量化百科

机器学习入门-------简单线性回归

由ypyu创建,最终由ypyu 被浏览 38 用户

Pyhon机器学习中必用到的是scikit-learn包,这个包的基本功能主要分为六大部分:分类、回归、聚类、数据降维、模型选择、数据预处理。因此,在机器学习前,需要在环境中使用以下命令,安装scikit-learn包。

conda install scikit-learn

另外,贯穿机器学习的几个概念也是要熟知的。主要为:特征、标签、训练数据、测试数据。在以后的各种模型学习中都会提及。

特征(features):数据的属性,或者可以认为是事物的固有属性

标签(labels):根据数据的属性,我们对数据的预测结果。或者是我们根据事物固有属性产生的认知、结论。

一般我们需要构建特征到标签的映射,从而区别我们需要识别的类。

训练数据:用来学习模型的数据。训练数据应尽可能与模型需要用到的特征相关。

测试数据:被用来对生成模型的准确度进行评估的数据。

(一)线性回归算法理论基础

实际生活中,我们需要对两个或多个变量之间的关系进行分析,那么可以利用统计方法建立表示变量之间相互关系的方程,我们将这一统计方法成为回归分析。

我们把被预测的变量称为因变量,把用来预测因变量值的一个或多个变量称为自变量。如果只包括一个自变量和一个因变量,二者之间的关系可以用一条直线近似表示,这种回归分析被称为简单线性回归。

简单线性回归方程:y=a+bx,a是回归直线的y轴截距,b是斜率,回归系数。

回归线有三种可能:正线性关系,负线性关系,不是线性相关。

衡量相关性程度的指标是相关系数r:

![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg' width='305' height='89'></svg>)

相关系数分类:0.6<r<1,强相关;0.3<r<0.6,中等程度相关;0<r<0.3,弱相关。

通常情况下,估计的回归方程是否很好的拟合样本数据,需要用到判断系数来度量拟合优度。

判定系数

![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg' width='276' height='72'></svg>)

回归平方和SSR

![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg' width='164' height='42'></svg>)

理解为,yi的估计值与y的平均值差的平方和

总的平方和SST

![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg' width='153' height='28'></svg>)

理解为,每个自变量Xi对应的因变量yi的值与yi的平均值差的平方和

其实,对于Xi,它的残差是

![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg' width='72' height='35'></svg>)

这些残差或误差的平方和称为误差平方和,即SSE。

![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg' width='159' height='35'></svg>)

三者之间关系为:SST=SSR+SSE

R平方 越大,理解为总平方和中能被估计的回归方程解释的百分比越大。对应的回归方程,拟合效果越好。

(二)简单线性回归---python实现

本案例数据以学习时间和分数为数据集进行研究。具体数据集如下:

from collections import OrderedDict
import pandas as pd
#数据集
examDict={'学习时间':[0.50,0.75,1.00,1.25,1.50,1.75,1.75,2.00,2.25,2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],
          '分数':[10,22,13,43,20,22,33,50,62,48,55,75,62,73,81,76,64,82,90,93]}
examOrderDict=OrderedDict(examDict)
examDf=pd.DataFrame(examOrderDict)

首先对以上数据集,提取特征和标签。

#提取特征和标签
#特征features
exam_X=examDf.loc[:,'学习时间']
#标签labels
exam_y=examDf.loc[:,'分数']

然后,绘制两个变量之间的散点图,大致判断两者之间是否存在相关关系。绘图代码如下:

import matplotlib.pyplot as plt
#散点图
plt.scatter(exam_X,exam_y,color="b",label="eaxm data")
#添加图标标签
plt.xlabel("Hours")
plt.ylabel("Score")
#显示图像
plt.show()

![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg' width='653' height='404'></svg>)

散点图

从散点图可以看出,学习时间和分数是存在相关关系的。但我们还是需要通过模型来验证的。

接下来,就是建立训练数据和测试数据。

这里常用的函数是train_test__split,主要功能是从样本中随机按比例选取训练数据和测试数据。train__size,b代表训练数据占样本数据的占比。代码如下:

from sklearn.cross_validation import train_test_split
#建立训练数据和测试数据
X_train , X_test , y_train , y_test = train_test_split(exam_X ,
                                                       exam_y ,
                                                       train_size = .8)

下一步就是创建和训练模型。需要注意的是,sklearn要求输入的特征必须是二维数组的类型。所以,代码如下:

#将训练数据特征转换成二维数据XX行*1列
X_train=X_train.values.reshape(-1,1)
#将测试数据特征转换成二维数组行数*1列
X_test=X_test.values.reshape(-1,1)
#第1步:导入线性回归
from sklearn.linear_model import LinearRegression
#第二步:创建模型:线性回归
model=LinearRegression()
#第3步:训练模型
model.fit(X_train ,y_train)

求出截距和回归系数。

#截距
a=model.intercept_
#回归系数
b=model.coef_
print('最佳拟合线:截距a=',a,',回归系数b=',b)

![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg' width='720' height='36'></svg>)

最后,要评估模型的精确度。记住,一定是用测试数据来评估的哦。

#线性回归的score 方法得到的是决定系数R平方
#评估模型:决定系数R平方
model.score(X_test,y_test)

![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg' width='253' height='35'></svg>)

R平方的值

我们也可以看一下相关系数是多少。

![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg' width='792' height='353'></svg>)

最后,通过绘制图形,可以看到最佳拟合线

import matplotlib.pyplot as plt
plt.scatter(X_train,y_train,color="blue",label="train data")
y_train_pred = model.predict(X_train)
plt.plot(X_train,y_train_pred,color="black",linewidth=3,label="best line")
plt.scatter(X_test,y_test,color="red",label="test data")
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Score")
plt.show()

![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg' width='660' height='385'></svg>)

最佳拟合线

标签

机器学习数据预处理线性回归Python