机器学习之线性回归

回归是统计学中最有力的工具之一。机器学习监督学习算法分为分类算法和回归算法两种,其实就是根据类别标签分布类型为离散型、连续性而定义的。回归算法用于连续型分布预测,针对的是数值型的样本,使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签。

回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。

如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。

因此线性回归可以被定义为:通过一个或者多个自变量与因变量之间进行建模的回归分析。

 

 

 比如预测房子价格,可以通过房子的面积一个变量来预测,也可以根据面积和位置来预测。

 

 

 

从上面两张图种可以看出,无论怎么构建这个回归模型,总会存在误差,也就是说总会有一些点没有落在建立的线或者面上面。真实值与预测值之间的差距就叫做误差大小,也叫做损失函数

而我们建立回归模型的目的之一,就是尽可能的将这个损失函数的值降到最低,也就是要找到最佳的权重w。

 

 

 寻找最佳的权重w,有两种方法:

第一:正规方程

 

 

 第二:梯度下降

 

 

 

 

 

 

 

 -------------------------------------------------------------------------------------------------------------------

正规方程API:sklearn.linear_model.LinearRegression

  • coef_:是最优的回归系数

梯度下降API:sklearn.linear_model.SGDRegressor

  •  coef_:是最优的回归系数

 

以波士顿房价数据预测为例:

 

 因为变量都涉及到一个权重,所以需要对每一个变量都要进行数据标准化处理,否则会出现 “大数吃小数” 现象。

了解一下数据集:

 

 

上代码(正规方程):

 1 from sklearn.datasets import load_boston
 2 from sklearn.linear_model import LinearRegression,SGDRegressor
 3 from sklearn.model_selection import train_test_split
 4 from sklearn.preprocessing import StandardScaler
 5 
 6 def myliner():
 7     '''
 8     线性回归直接预测房子价格
 9     :return: None
10     '''
11     #获取数据
12     lb = load_boston()
13     print(lb.get('feature_names'))
14 
15     #分割数据集到训练集和测试集
16     x_train, x_test, y_train, y_test = train_test_split(lb.data,lb.target,test_size=0.25)
17 
18     #进行标准化处理
19     #特征值和目标值都必须进行标准化处理,实例化两个标准化API
20 
21     # 特征值
22     std_x = StandardScaler()
23     x_train = std_x.fit_transform(x_train)
24     x_test = std_x.transform(x_test)
25 
26     #目标值
27     std_y = StandardScaler()
28     y_train = std_y.fit_transform(y_train.reshape(-1,1)) #sklearn0.19版本要求目标值必须为二维向量,因此这里需要转换为二维的
29     y_test = std_y.transform(y_test.reshape(-1,1))
30 
31     #estimator预测
32     lr = LinearRegression()
33     lr.fit(x_train,y_train)
34 
35     print('权重矩阵为:',lr.coef_)
36 
37     #预测测试集的房子价格
38     y_predict = lr.predict(x_test)
39     print('测试机里面每个房子的预测价格:',y_predict)
40 
41     return None
42 
43 
44 if __name__ == '__main__':
45     myliner()

结果(正规方程):

 

 

上代码(梯度下降):

 1 from sklearn.datasets import load_boston
 2 from sklearn.linear_model import LinearRegression,SGDRegressor
 3 from sklearn.model_selection import train_test_split
 4 from sklearn.preprocessing import StandardScaler
 5 
 6 def myliner():
 7     '''
 8     线性回归直接预测房子价格
 9     :return: None
10     '''
11     #获取数据
12     lb = load_boston()
13     print(lb.get('feature_names'))
14 
15     #分割数据集到训练集和测试集
16     x_train, x_test, y_train, y_test = train_test_split(lb.data,lb.target,test_size=0.25)
17 
18     #进行标准化处理
19     #特征值和目标值都必须进行标准化处理,实例化两个标准化API
20 
21     # 特征值
22     std_x = StandardScaler()
23     x_train = std_x.fit_transform(x_train)
24     x_test = std_x.transform(x_test)
25 
26     #目标值
27     std_y = StandardScaler()
28     y_train = std_y.fit_transform(y_train.reshape(-1,1)) #sklearn0.19版本要求目标值必须为二维向量,因此这里需要转换为二维的
29     y_test = std_y.transform(y_test.reshape(-1,1))
30 
31     #梯度下降进行房价预测
32     sgd = SGDRegressor()
33 
34     sgd.fit(x_train,y_train)
35     print("梯度下降的权重矩阵为:", sgd.coef_)
36     #预测测试集的房子价格
37     y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
38     print('测试集里面每个房子的预测价格:',y_sgd_predict)
39 
40     return None
41 
42 
43 if __name__ == '__main__':
44     myliner()

结果:

 

 

回归性能的评估:

对于不同的类别预测,我们不能苛刻的要求回归预测的数值结果要严格的与真实值相同。一般情况下,我们希望衡量预测值与真实值之间的差距。因此,可以测评函数进行评价。其中最为直观的评价指标均方误差(Mean Squared Error)MSE,因为这也是线性回归模型所要优化的目标。MSE的计算方法如下:

 

 

 API:sklearn.metrics.mean_squared_error

 

 上代码:

1 from sklearn.metrics import mean_squared_error
2 
3 print('正规方程的均方误差:',mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))
4 
5 print('梯度下降的均方误差:', mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))

结果:

 

 

从结果可以看出,虽然正规方程法的适用性比较小,但是在一些数据集的预测种其准确也有可能优于梯度下降。

一般来说,梯度下降法更适用于大数据集的预测。二者的组要区别如下:

 

 

posted @ 2019-12-26 19:19  牛公的跑奔  阅读(1591)  评论(0编辑  收藏  举报
总访问量:AmazingCounters.com