DC学院学习笔记(十六):线性回归实战

  1. 云栖社区>
  2. 博客>
  3. 正文

DC学院学习笔记(十六):线性回归实战

kissjz 2018-02-18 14:03:41 浏览1540
展开阅读全文

预测型数据分析:线性回归

回归:预测数值型变量
分类:预测样本所属类别
聚类:在未知样本类别的情况下,根据样本之间的相似性把样本分成不同的类别

适用:用于股价、房价、空气质量等数值型变量的预测
数学模型:分析两组变量之间的关系
x:自变量(Independent variable)
y:应变量(Dependent variable)
如图是一个线性回归的示意图
image

通过x来预测y,函数:f(x) = y,例如在房价问题中,用房子大小等特征作为自变量,房子价格为应变量
房价回归预测案例:
$x_1$:房子大小
$x_2$:房子楼层
$x_3$:绿化规模
$x_4$:距离最近的地铁站距离
$x_5$:距离最近的公交站距离
$x_6$:是否配备停车位
……
y:房子价格
根据常识来讲,房价和很多因素相关,房子的大小、楼层等等都是比较明显的影响因素,还有一些需要花功夫去寻找的特征。
要寻找一个函数f,将x映射到y上,这就是回归的关键。

回归的经典方法:线性回归
线性回归认为y是x的一个线性的叠加

  • 方程式
    image

向量形式:
image

  • 参数含义
    image

图中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)

image

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])

预测性能的评估

为了评估获得模型的性能,需要对数据集进行划分,划分为训练集和测试集,在训练集上学习获得模型,在测试集上评估误差

交叉检验

将数据集中的样本等分成多份,每次取其中的一份作为测试集,剩余的数据作为训练集,使用测试集数据评估和检验从训练集学习得到的模型,即进行交叉检验。相对于随机划分,一部分的训练集永远划分在测试集中,交叉检验是将数据划分成若干份,每次用不同的部分作为测试集,则每份都被当做测试集和训练集使用过。

如下图是将数据集划分为五份的交叉检验
image

将数据集分为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

网友评论

登录后评论
0/500
评论