数据分析-机器学习(一)

简单来说机器学习就是讲一段已经存有的数据,与数据对应的结果通过机器学习的算法,得到估计函数.然后再将需要预测的函数用估计函数得到预测结果

image.png

机器学习分类

  • 有监督学习

简单来说就是已经给了你数据并且给了数据所产生的结果

  • 无监督学习

在只有数据却没有结果的情况下,寻找影藏的模式或内在结构

  • 半监督学习

在半监督学习方式下,训练数据有部分被标识,部分没有被标识,这种模型首先需要学习数据的内在结构,以便合理的组织数据来进行预测。算法上,包括一些对常用监督式学习算法的延伸,这些算法首先试图对未标识数据进行建模,在此基础上再对标识的数据进行预测。

有监督学习

有监督学习机器算法有分类和回归两类

分类主要用于数据分散,且预测结果只分为几类,常用的分类机器算法有以下几种:

  • k-邻近算法

K近邻(k-Nearest Neighbor,KNN)分类算法的核心思想是如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别

#导入KNN算法
from sklearn.neighbors import KNeighborsClassfier
knn = KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto', leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=1, **kwargs)
# n_neighbors每个类别取多少个点来算距离一般不大于10,weights预测的权函数有uniform与distance两种,p是使用距离度量参数 metric 附属参数,只用于闵可夫斯基距
#离和带权重闵可夫斯基距离中p值的选择,p=1为曼哈顿距离, p=2为欧式距离。默认为2
knn.fit(x_train,y_train)#训练数据,x_train为用来训练的数据,y_train为数据所对应的结果
knn.score(x_train,y_train)#得出训练数据的得分
y_ = knn.predict(x_test) #用测试数据去算出预测结果
knn.score(x_test,y_test)#测试数据的得分
#y_test,是x_test对应的正确结果,而y_是根据knn.fit()训练完后去预测的结果
  • Logistics逻辑斯蒂回归分类

根据现有数据对分类边界线建立回归公式,以此进行分类。这里的“回归” 一词源于最佳拟合,表示要找到最佳拟合参数集。
Logistic Regression和Linear Regression的原理是相似的,可以简单的描述为这样的过程:
(1)找一个合适的预测函数,一般表示为h函数,该函数就是我们需要找的分类函数,它用来预测输入数据的判断结果。这个过程是非常关键的,需要对数据有一定的了解或分析,知道或者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数。
(2)构造一个Cost函数(损失函数),该函数表示预测的输出(h)与训练数据类别(y)之间的偏差,可以是二者之间的差(h-y)或者是其他的形式。综合考虑所有训练数据的“损失”,将Cost求和或者求平均,记为J(θ)函数,表示所有训练数据预测值与实际类别的偏差。
(3)显然,J(θ)函数的值越小表示预测函数越准确(即h函数越准确),所以这一步需要做的是找到J(θ)函数的最小值。找函数的最小值有不同的方法,Logistic Regression实现时有梯度下降法(Gradient Descent)。
损失值简单来说就是(y_-y_test)^2求平均

from sklearn.linear_model import LogisticRegression
logistic = LogisticRegression(penalty='l2', dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='liblinear', max_iter=100, multi_class='ovr', verbose=0, warm_start=False, n_jobs=1)
#solver参数的选择:
    #“liblinear”:小数量级的数据集
    #“lbfgs”, “sag” or “newton-cg”:大数量级的数据集以及多分类问题
    #“sag”:极大的数据集
#C惩罚项,用来去除权重交小的参数
logistic.fit(x_train,y_train)
logistic.score(x_train,y_train)
y_ = logistic.predict(x_test)
  • 决策树
    下图为一个女孩的相亲决定绿色表示为条件也就是特征,黄色则为结果


    image.png

    构造决策树的关键步骤是分裂属性。所谓分裂属性就是在某个节点处按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集尽可能地“纯”。尽可能“纯”就是尽量让一个分裂子集中待分类项属于同一类别。分裂属性分为三种不同的情况:

    1、属性是离散值且不要求生成二叉决策树。此时用属性的每一个划分作为一个分支。

    2、属性是离散值且要求生成二叉决策树。此时使用属性划分的一个子集进行测试,按照“属于此子集”和“不属于此子集”分成两个分支。

    3、属性是连续值。此时确定一个值作为分裂点split_point,按照>split_point和<=split_point生成两个分支。

from sklearn.tree import DecisionTreeClassfier
tree = DecisionTreeClassfier(max_depth)
tree.fit(x_train,y_train)#训练数据,x_train为用来训练的数据,y_train为数据所对应的结果
tree.score(x_train,y_train)#得出训练数据的得分
y_ = tree.predict(x_test) #用测试数据去算出预测结果
tree.score(x_test,y_test)#测试数据的得分
#max_depth为决策深度,需要调节,过高容易过拟合,而过低容易欠拟合
  • 贝叶斯(用法与其他算法)
    • 高斯分布朴素贝叶斯

      用于一般的分类问题,from sklearn.naive_bayes import GaussianNB

    • 伯努利朴素贝叶斯

      常用于二分类的分类问题,from sklearn.naive_bayes import BernoulliNB

    • 多项式朴素贝叶斯

      用于文本数据,如垃圾短信分类等,from sklearn.naive_bayes import MultinomialNB

    • 补充,当对文本分析的时候需要将文本内容转换
        from sklearn.feature_extraction.text import TfidfVectorizer
        tf = TfidfVectorizer()
        tf.fit(data)#data为文本数据
        X_train = tf.transform(data).toarray()#转换成能使用的训练数据
      
  • 支持向量机SVM

原理:支持向量机,其含义是通过支持向量运算的分类器。其中“机”的意思是机器,可以理解为分类器。 那么什么是支持向量呢?在求解的过程中,会发现只根据部分数据就可以确定分类器,这些数据称为支持向量。且SVM的优点就在于可支持线性与非线性分类,而其中线性分类可以理解为这些有n个属性和一个二分类标志,而这个n个属性是存在于n维的空间中,而线性分类就是要寻找一个能使这个超平面能将n个属性分成两类,且离两类的距离最大的超平面.而非线性的话,简单来说会更灵活.


image.png

如图中,只根据几个点就能得出最适合的分类线

# 比较几种核函数
#导入鸢尾花数据
from sklearn.datasets import load_iris
#svm中的svc是做分类,而svm是做回归
from sklearn.svm import SVC,LinearSVC
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
data = load_iris()['data'][:,0:2]
target = load_iris()['target']
# 取data中的两个特征画点
x_min,x_max = data[:,0].min(),data[:,0].max()
y_min,y_max = data[:,1].min(),data[:,1].max()
# 设置面的范围
x,y = np.linspace(x_min,x_max,1000),np.linspace(y_min,y_max,1000)
# 创建网格
X,Y = np.meshgrid(x,y)
# 创建预测数据
x_test = np.c_[X.ravel(),Y.ravel()]
#将svc核设置为线性
plt.figure(figsize=(5*4,4))
index = 1
for i in ['linear', 'poly', 'rbf']:
    svc = SVC(kernel=i)
    svc.fit(data,target)
    y_ = svc.predict(x_test)
    #设置每个图的位置
    axes = plt.subplot(1,4,index)
    #画出面
    axes.pcolormesh(X,Y,y_.reshape(1000,1000))
    #画出点做对比
    axes.scatter(data[:,0],data[:,1],c=target,cmap='rainbow')
    #设置标题
    axes.set_title(i)
    index += 1
#在加入Linearsvc比较
Linearsvc = LinearSVC()
Linearsvc.fit(data,target)
y_ = svc.predict(x_test)
axes = plt.subplot(1,4,4)
axes.pcolormesh(X,Y,y_.reshape(1000,1000))
axes.scatter(data[:,0],data[:,1],c=target,cmap='rainbow')
axes.set_title('linearsvc')
image.png

而回归则是用在数据是连续的,并且预测结果明显是不同的.例如温度变化或时间变化.包括一元回归和多元回归,线性回归和非线性回归,回归的机器算法有以下几种:

  • LinearRegression普通线性回归

原理:假定输人数据存放在矩阵X中,而回归系数存放在向量W中。那么对于给定的数据X1, 预测结果将会通过
Y=XW
Y=X1
W1+X2W2+X3W3+.......(几个特征就会有几个回归系数,通过算法可以找出这些回归系数)
给出。现在的问题是,手里有一些X和对应的Y,怎样才能找到W呢?
一个常用的方法就是找出使误差最小的W。这里的误差是指预测Y值和真实Y值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以我 们采用平方误差。
最小二乘法:

image.png
from sklearn.linear_model import LinearRegression
linear = LinearRegression()
linear.fit(x_train,y_train)
y_  = linear(x_test)
linear.coef_ #回归系数
linear.intercept_ #截距
image.png
  • Ridge岭回归

当数据的特征比样本点还多的时候,输入的矩阵X就不是满秩矩阵将不可逆所以就引入Ridege岭回归,简单来说就引入一个惩罚项λ使矩阵X成为满秩矩阵可逆,并且去掉一些不重要的参数,适用于一些过拟合或各边存在多重共线性的时候

from sklearn.linear_model import Ridge
ridge= Ridge(alpha)
ridge.fit(x_train,y_train)
y_  = ridge(x_test)
ridge.coef_ #回归系数
ridge.intercept_ #截距
#alpha就是λ惩罚项
  • Lasso回归
#与岭回归相似
from sklearn.linear_model import Lasso
lasso= Lasso(alpha)
lasso.fit(x_train,y_train)
y_  = lasso(x_test)
lasso.coef_ #回归系数
lasso.intercept_ #截距
#alpha就是λ惩罚项
#Lasso效果会比岭回归好
  • K-邻近算法也可用于回归
from sklearn.neighbors import KNeighborsRegressor
  • 决策树也可以用于回归问题
from sklearn.tree import DecisionTreeRegressor
  • svm中SVR也可以解决回归问题
from sklearn.svm import SVR
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,961评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,444评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,009评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,082评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,101评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,271评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,738评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,395评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,539评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,434评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,481评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,160评论 3 317
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,749评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,816评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,038评论 1 256
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,548评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,140评论 2 341

推荐阅读更多精彩内容

  • 以西瓜书为主线,以其他书籍作为参考进行补充,例如《统计学习方法》,《PRML》等 第一章 绪论 1.2 基本术语 ...
    danielAck阅读 4,476评论 0 6
  • 总结一下昨天,为什么我的60S要分开两段时间才能完成的问题,其实已经有三天这样的情况,所以必须反思一下。 早上因为...
    孙小明YY阅读 241评论 0 0
  • 双节,你在干嘛?外出旅行?回家团聚?还是一人在外加班加点?无论选择怎样的方式,都是自己与自己的对话:内心安静...
    个雪阅读 226评论 0 0
  • 一些小事让心中郁闷如有块垒。本来打算周末去一个私人的书店,但周末用来玩乐和出行了,足见我是玩货的本性。好些时间没有...
    空空过去阅读 279评论 0 0
  • 一、主流操作系统 windowswindows98、windows2000、windows2003、windows...
    EndEvent阅读 1,961评论 0 15