预测型数据分析:线性回归
回归:预测数值型变量
分类:预测样本所属类别
聚类:在未知样本类别的情况下,根据样本之间的相似性把样本分成不同的类别
适用:用于股价、房价、空气质量等数值型变量的预测
数学模型:分析两组变量之间的关系
x:自变量(Independent variable)
y:应变量(Dependent variable)
如图是一个线性回归的示意图
通过x来预测y,函数:f(x) = y,例如在房价问题中,用房子大小等特征作为自变量,房子价格为应变量
房价回归预测案例:
$x_1$:房子大小
$x_2$:房子楼层
$x_3$:绿化规模
$x_4$:距离最近的地铁站距离
$x_5$:距离最近的公交站距离
$x_6$:是否配备停车位
……
y:房子价格
根据常识来讲,房价和很多因素相关,房子的大小、楼层等等都是比较明显的影响因素,还有一些需要花功夫去寻找的特征。
要寻找一个函数f,将x映射到y上,这就是回归的关键。
回归的经典方法:线性回归
线性回归认为y是x的一个线性的叠加
- 方程式:
向量形式:
- 参数含义
图中y轴上的截距为,回归曲线的斜率代表横坐标变量的系数,即
-
参数优化方法:监督学习、OLS
- 监督学习:已有一些训练样本(训练集),同时知道X和y,通过这些已知的样本学习得到回归模型
- OLS(Ordinary Least Squares):使得预测的y和真实的y在训练集上误差的平方最小
用sklearn实现
1.依旧使用到iris的数据集
import pandas
iris = pandas.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data',header=None)
iris.columns=['SepalLengthCm','SepalWidthCm','PetalLengthCm','PetalWidthCm','Species']
iris.sample(10)
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | Species | |
---|---|---|---|---|---|
25 | 5.0 | 3.0 | 1.6 | 0.2 | Iris-setosa |
28 | 5.2 | 3.4 | 1.4 | 0.2 | Iris-setosa |
137 | 6.4 | 3.1 | 5.5 | 1.8 | Iris-virginica |
87 | 6.3 | 2.3 | 4.4 | 1.3 | Iris-versicolor |
126 | 6.2 | 2.8 | 4.8 | 1.8 | Iris-virginica |
30 | 4.8 | 3.1 | 1.6 | 0.2 | Iris-setosa |
86 | 6.7 | 3.1 | 4.7 | 1.5 | Iris-versicolor |
96 | 5.7 | 2.9 | 4.2 | 1.3 | Iris-versicolor |
84 | 5.4 | 3.0 | 4.5 | 1.5 | Iris-versicolor |
94 | 5.6 | 2.7 | 4.2 | 1.3 | Iris-versicolor |
2. 绘图
import seaborn
%matplotlib inline
#通过画图可以直观地对数据的线性关系做一个观察
seaborn.regplot(x='PetalLengthCm',y='PetalWidthCm',data=iris)
3.训练模型
from sklearn import linear_model
lm=linear_model.LinearRegression()
features=['PetalLengthCm']
X=iris[features]
y=iris['PetalWidthCm']
print(X.shape,y.shape)
(150, 1) (150,)
#放入两个特征,X就会多一个维度
features=['PetalLengthCm','SepalLengthCm']
#使用X,y来训练model
model=lm.fit(X,y)
print(model.intercept_,model.coef_)
#从print的结果可以得到回归模型的截距和系数
-0.366514045217 [ 0.41641913]
截距和系数正对应上图中的直线
4.预测数据
#使用model来对数据进行预测,输入X自变量的值,输出y的预测值
#注意多个自变量时的情况,比如:model.predict([1,2])
model.predict(4)
array([ 1.29916248])
预测性能的评估
为了评估获得模型的性能,需要对数据集进行划分,划分为训练集和测试集,在训练集上学习获得模型,在测试集上评估误差
交叉检验
将数据集中的样本等分成多份,每次取其中的一份作为测试集,剩余的数据作为训练集,使用测试集数据评估和检验从训练集学习得到的模型,即进行交叉检验。相对于随机划分,一部分的训练集永远划分在测试集中,交叉检验是将数据划分成若干份,每次用不同的部分作为测试集,则每份都被当做测试集和训练集使用过。
如下图是将数据集划分为五份的交叉检验
将数据集分为5份,分别进行5次回归
回归常用的打分函数
- $MAE=\sum \left | {y}'-y \right |/N$对应的scoring参数为’neg_mean_absolute_error’
- $MSE=\sum ({y}'-y)^{2}$对应的scoring参数为’neg_mean_squared_error’
得分越高,则代表模型的性能越好
scikit learn中进行交叉检验
from sklearn.model_selection import cross_val_score
#得到5次交叉检验的误差,注意这里cross_val_score()前面用了负号,得到的是每个回归模型的平均绝对值误差
#用MAE举例
scores=-cross_val_score(lm,X,y,cv=5,scoring='neg_mean_absolute_error')
print(scores)
#求平均值,作为误差结果
import numpy as np
print(np.mean(scores))
[ 0.08581817 0.09533821 0.13792154 0.2074044 0.29904645]
0.165105751004