我的数据科学之路-线性回归
机器学习已经学了很多次了,拿起又放下,每次都是从“房价预测”开始,希望此次有所改变,就从记录开始。
线性回归是典型的监督学习过程,通过已有(带标记)的数据训练一个模型,然后用这个模型来根据新的输入预测结果。还是从房价预测开始。
部分sklearn中的波士顿房价数据图中是从sklearn库中的波士顿房价数据取了一部分房间数量与房价的数据,最简单的线性回归便是找到一条直线尽可能的拟合数据分布。设定y为房价,x为房间数,那么在这拟合曲线便是y=wx+b。w,b就是我们最后需要的模型,那么找到合适的w,b的过程就是训练了。下面是训练的过程。
一开始w和b都是一个随机的值,对一个输入,y1=wx+b是预测的值,那么w,b是否合适的判断标准就是y1和实际的值y之间的差异大小了,这个差异大小可以有不同的表现,最简单的比如|y1-y|或者。
设定这个差异为E,暂定E=,那么训练的过程就是找到合适的w,b使E足够的小。具体方法就是经典的梯度下降法了。代表E对w的偏导,w在这个方向前进就是最快减少E的方向,但是此方法只能找到局部最优解,所以如果前进过多就可能越过的局部最优解,所以需要增加一个步长系数α,那么最终一次训练的过程就是w=w-α,b=b-。那么经过一些数学推导可得
因为最后都会乘一个系数,所以前面的2并不重要,所以把E定义为更方便,前面说E可以有多重不同的表达式,选择这个表达式的原因也可以揭晓了,就是求出的偏导式便于计算。
实际情况中x和y都是把样本一起纳入计算的,E也就是所有点的损失函数之和,因此需要把上述的运算过程换成矩阵的计算,但过程是一致的。下面是简单的python代码完成一步梯度下降过程。
y_pred = np.matmul(X, W) + b
error = y - y_pred
# compute steps
W_new = W + learn_rate * np.matmul(error, X)
b_new = b + learn_rate * error.sum()
也可以使用sklearn库的线性回归模型,下面是简单的示例代码:
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x, y)
model.predict(new_x)
这样就完成了最简单的训练和预测过程。
训练结果