回归算法-线性回归分析-正规方程和梯度下降

1.分类和回归最本质的区别

    定量输出称为回归,或者说是连续变量预测;
    定性输出称为分类,或者说是离散变量预测。

    举个特别好理解的例子:

            预测明天的气温是多少度,这是一个回归任务;

            预测明天是阴、晴还是雨,就是一个分类任务。

2.线性回归的定义是:

    目标值预期是输入变量的线性组合。线性模型形式简单、易于建模,但却蕴含着机器学习中一些重要的基本思想。线性回归,是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。

    单变量线性回归:涉及到的变量只有一个。例如:预测房价例子中房子的大小预测房子的价格。f(x) = w1*x+w0,这样通过主要参数w1就可以得出预测的值。通用公式为:

                                                            

    多变量线性回归:涉及到的变量两个或者两个以上。例如:瓜的好坏程度 f(x) = w0+0.2色泽+0.5根蒂+0.3*敲声

,得出的值来判断一个瓜的好与不好的程度。通用公式为:

                                                                 

线性回归的通用公式如下:

                                                           

    线性模型中的向量W值,客观的表达了各属性在预测中的重要性,因此线性模型有很好的解释性。对于这种“多特征预测”也就是(多元线性回归),那么线性回归就是在这个基础上得到这些W的值,然后以这些值来建立模型,预测测试数据。简单的来说就是学得一个线性模型以尽可能准确的预测实值输出标记。

    那么如果对于多变量线性回归来说我们可以通过向量的方式来表示W值与特征X值之间的关系:

                                                                       

    两向量相乘,结果为一个整数是估计值,其中所有特征集合的第一个特征值x_0x0=1,那么我们可以通过通用的向量公式来表示线性模型:

                                                                                     

    一个列向量的转置与特征的乘积,得出我们预测的结果,但是显然我们这个模型得到的结果可定会有误差,如下图所示:

    单变量:

                                                        

    多变量:

                                            

3.损失函数

损失函数是一个贯穿整个机器学习重要的一个概念,大部分机器学习算法都会有误差,我们得通过显性的公式来描述这个误差,并且将这个误差优化到最小值。

对于线性回归模型,将模型与数据点之间的距离差之和做为衡量匹配好坏的标准,误差越小,匹配程度越大。我们要找的模型就是需要将f(x)和我们的真实值之间最相似的状态。于是我们就有了误差公式,模型与数据差的平方和最小(最小二乘法):

                                                                      

上面公式定义了所有的误差和,那么现在需要使这个值最小?那么有两种方法,一种使用梯度下降算法另一种是正规方程解法(只适用于简单的线性回归)。

单变量损失函数直观图:(最低点即损失函数最小)

                                

4.正规方程#

缺点:当特征过于复杂时,求解速度太慢。

对于复杂的算法,不能使用正规方程求解。

5.梯度下降#

我们以单变量中的w0,w1为例子:

                                                 

                       

理解:沿着这个函数下降的方向找,最后就能找到山谷的最低点,然后更新W值             

                               

6.sklearn线性回归正规方程、梯度下降API#

sklearn.linear_model.LinearRegression()

普通最小二乘线性回归
coef_:回归系数
sklearn.linear_model.SGDRegressor( )

通过使用SGD最小化线性模型
coef_:回归系数

波士顿房价预测:

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor

lb = load_boston()

# 分隔数据集
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)

# 特征工程-标准化
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)
# 目标值
std_y = StandardScaler()
y_train = std_y.fit_transform(y_train.reshape(-1, 1))
y_test = std_y.transform(y_test.reshape(-1, 1))

# 正则方程求解预测结果
lr = LinearRegression()
lr.fit(x_train, y_train)
print(lr.coef_)
# 预测的价格
y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
print("使用正规方程每个房子的预测价格:", y_lr_predict)

# 使用梯度下降进行预测
sgd = SGDRegressor()
sgd.fit(x_train, y_train)
print(lr.coef_)
y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
print("使用梯度下降预测的房子价格:", y_sgd_predict)

 结果:

第一行数据:回归系数

[[-0.07110004  0.08615889  0.0202595   0.04529581 -0.22254461  0.33409388
   0.01187951 -0.30872724  0.26608433 -0.21076225 -0.22538056  0.1155019
  -0.38227127]]
使用正规方程每个房子的预测价格: [[20.09395849]
 [ 7.75780455] [31.32890865][28.7085605 ][18.49587736] [19.96238427][23.72283389]
 [23.24285098][18.1368784 ] [36.93921927][16.5198657 ][32.76367153][20.29527606]
 [33.92074648][19.713028  ][27.51034563][20.25491888][20.21605936][13.56587488]
 [28.74732844][19.24479251][17.04491197][22.64405873][ 8.62358537][ 5.62011295]
 [18.05814953][21.14780415][20.31204554][19.65113966][21.14712068][18.43113236]
 [11.0980478 ][43.16397586] [20.9124311 ] [21.15620973] [23.92540998] [18.77503749]
 [22.59984256] [13.59489673] [27.98415227] [36.29917245] [18.81531739] [41.83649405]
 [25.6151952 ][20.76087712] [11.45436917] [12.40058648] [22.26546069] [20.27419562]
 [26.39823994] [24.43034311] [21.10312063] [27.54437518] [29.48756635] [17.53898987]
 [19.47640462] [19.6548141 ] [17.37354367][31.89824482] [18.2063851 ] [16.47210667] 
 [20.48277998] [16.8990683 ] [22.79968676] [-5.46872239] [23.77735018]
 [19.81306667] [18.35743493] [22.39898672] [25.17329992] [22.01602245] [ 4.24147802]
 [31.69162161] [28.73213519] [12.65185419] [40.0616262 ][27.80247031] [16.59949423]
 [ 5.59091431] [15.16137179] [19.14544968] [24.47098474][33.43290072] [27.29195521]
 [21.79981509] [40.65276762] [13.0583617 ] [16.88067478] [22.21407728] [22.13970158] [19.31962385] [14.11739507] [13.43513183] [17.79521648] [24.99292649] [31.1194976 ] [19.46384384] [15.70534771] [12.22164557] [15.39920638] [13.1226957 ] [31.5585473 ][ 3.69700778] [ 7.16909131][21.73385423] [ 9.43926617] [18.16459167] [19.66612955] [21.56944985] [34.96154248] [17.8787807 ] [31.20116587] [31.62536828] [21.63368564] [35.11383774] [31.20850887] [25.31469268] [41.91712757] [13.90480205] [16.98830066][28.48438938] [12.04700768] [33.72136355] [15.97341785] [25.83616065]
 [16.47333155] [33.26404024]]
E:\Python3.7.1\lib\site-packages\sklearn\utils\validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
  y = column_or_1d(y, warn=True)
[[-0.07110004  0.08615889  0.0202595   0.04529581 -0.22254461  0.33409388
   0.01187951 -0.30872724  0.26608433 -0.21076225 -0.22538056  0.1155019
  -0.38227127]]
使用梯度下降预测的房子价格: [20.42570443  8.23313351 31.59248135 29.12108101 17.94262076 20.56575254
 23.11016219 22.98334928 18.41874767 37.27913865 17.2293773  31.34485921
 20.58124388 32.60576852 19.52397959 27.48723517 20.85221256 20.5767902
 14.98945013 27.42679315 19.1111466  17.31486075 24.14478815  7.5914125
  7.98308519 18.56284837 22.2908332  20.68488199 20.24815352 21.5879416
 18.28855151 10.99702522 41.51613254 20.99774426 21.97210991 23.5641189
 19.1508575  22.98519911 14.21597604 28.20545266 35.97883679 19.27070876
 41.62111099 25.47199732 21.01636063 12.21563099 12.75602544 22.19230022
 20.87170875 26.63997148 24.80844094 21.01538657 26.79155218 29.31735969
 17.60923055 19.99605401 19.49341462 17.41423209 31.78808718 18.80285861
 16.80189406 20.7288167  17.94327651 22.76529794 -4.10743251 24.05160214
 19.77214922 18.48844551 22.05091379 25.08626507 21.96007063  5.19905393
 31.31703446 28.10599283 13.63894181 39.4880974  27.53222297 17.16460477
  5.57969705 16.14625822 18.93368569 24.57247371 33.20838269 27.02835676
 23.12510729 40.76209519 13.48343876 16.94595687 22.33629466 22.0043415
 19.50803639 14.74630014 13.51828831 17.97033323 24.96401484 30.65150901
 19.75771178 16.25640754 11.2600302  18.57399563 13.9886661  31.39099806
  4.27354647  8.58681726 22.08055389 10.66432915 18.56129223 19.84976083
 21.31095001 34.74986742 17.50495043 31.32361712 31.23532952 21.43098227
 34.58027063 30.64404323 25.2521442  40.22778487 14.39440457 18.3003031
 28.87639243 12.94033115 33.10748415 15.67984941 25.88724062 16.36828153
 32.34043352]

7.回归性能评估#

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

MSE的计算方法如下:

8.sklearn回归性能评估#

mean_squared_error(y_true, y_pred)

  • 均方误差回归损失
  • y_true:真实值
  • y_pred:预测值
  • return:浮点数结果

对于前面预测波士顿房价的例子,对其回归性能进行评估

from sklearn.metrics import mean_squared_error
.
.
.
print("正规方程的均方误差:",mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))
print("正规方程的均方误差:",mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))

正规方程的均方误差: 19.978543165306537 梯度下降的均方误差: 18.844715397188626

9.正规方程和梯度下降总结

特点:

线性回归器是最为简单,易用的回归模型,从某种程度上限制了使用,尽管如此,在不知道特征关系的前提下,我们仍然使用线性回归器作为大多数系统的首要选择。

小规模数据:正规方程LinearRegress(不能解决拟合问题)

大规模数据:梯度下降SGDRegress

 

参考:

    某机构视频

发布了128 篇原创文章 · 获赞 95 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/qq_36853469/article/details/103555557