机器学习之线性回归原理及sklearn实现

1、线性回归问题

       以房价预测为例,占地面积为变量x1,房屋年龄为变量x2,房屋价格为预测变量y。

       为什么叫线性回归问题,因为目标函数是一个线性回归函数。什么是目标函数?   

    (1)、目标函数:目标函数是我们需要的最终结果,及最终拟合了数据的函数。

         假设目标函数为y = θ1*x1 + θ2*x2 + b。

         那么我们如何得到目标函数中的参数呢?如何使用数据来拟合得到最好的θ1、θ2以及b就是接下来要做的事情。

     (2)、损失函数:损失函数是我们得到的预测值y_pre与真实数据中的y的某种方式计算出来的差值。那么也就是说损失函数越小,就代表着我们目标函数的参数越好。

         一般线性回归问题我们用均方差来作为损失函数,即 J(θ1,θ2)=∑(y-y_pre)^2  ​#小弟能力有限,暂时博客没什么好的书写方式,公式里的符号能理解就好

         也就是说我们现在的问题就是在这个J(θ1,θ2)上面找事情了,找到它最小的情况,并且计算出这时的θ1和θ2以及b

    2、解决途径

         对于损失函数J(θ1,θ2)=∑(y-y_pre)^2,我们最常用的方式自然是传说中的梯度下降法了。当然不只是梯度下降法,也有其他的解法,如最小二乘法等。

      (1)、梯度下降

           梯度下降的原理如其名所述,取其梯度,按梯度下降,然后下降到最低点,就得到我们最想要的最小的J了。 

           梯度是什么?对于损失函数 J = ∑(y-y_pre)^2  来说,梯度就是J分别对θ1和θ2求偏导数,即{∂J/∂θ1,∂J/∂θ2}

           那梯度下降就是参数减去这个偏导数喽。

              θ1 = θ1 - ∂J/∂θ1

              θ2 = θ2 - ∂J/∂θ2 

           这样一次减法操作就是一次梯度下降,梯度下降法正是通过这样一次次的减法,直到最后使得θ1和θ2趋于稳定,也就是J达到或者接近最小值。

           那么为什么这样一次次的减法就能得到结果呢?我们画个图来看一下。

          机器学习之线性回归原理及sklearn实现

     因为三维图不太会画,就用二维图像,一个θ值来分析。一个参数两个参数都是一样的,只不过多一个减法公式。

    如图,假设初始的θ值位于A点,那么A点的偏导,如斜线所示,是一个正数,那么θ = θ - ∂J/∂θ(正数)这样的减法公式之后,横左边必然是变小了,A点自然是向左移动了,假设从A点移动到了B点,那么可以发现J的值确实是变小了。如果A点在函数最小值的的左边呢?

    机器学习之线性回归原理及sklearn实现

     如图,如果一开始在C点,这时的偏导是负数,那么θ = θ - ∂J/∂θ(负数) 之后,theta变大了,横坐标右移,自然J也就变小了,这也就是说不论哪种情况下进行梯度下降,J都是在减小的。

    损失函数J梯度下降公式是这样的,以一个θ举例: θ = θ - λ*(∂J/∂θ),多出一个λ,这个λ是超参数,是人为设定的,也就是可以我们可以控制梯度下降的步长,是下降的快一点还是慢一点。这里不是设置的越大越好,因为如果λ太大,会导致发生从A点直接下降到C点这种情况,也就是说步子太大了,直接跨过了最低点。

    

    以上就是线性回归Linear Regression以及梯度下降GD的原理,下面我们来看一下sklearn中如何使用。

# 本篇学习线性回归算法,使用自带的波士顿放假数据集    
#导入包
from sklearn import datasets
from sklearn import linear_model
import pandas as pd
import matplotlib.pyplot as plt
#导入数据,切分为数据集X以及目标集y
data = datasets.load_boston()
X = pd.DataFrame(data['data'],columns=data.feature_names)
y = pd.DataFrame(data['target'],columns=data.)
#生成模型对象,并fit数据,预测结果
reg = linear_model.LinearRegression()
reg.fit(X,y)
predictions = reg.predict(X)
print(predictions)

    sklearn的使用十分简单,以上就是使用sklearn做的一个线性回归预测房价,当然没有什么模型评价、模型优化等等,这些之后再聊。