学习的第二个机器学习模型叫做线性回归。重点是对线性回归做详细的剖析,以及理解其背后的思想。

    在回归模型里,线性回归绝对是最简单的,但这并不妨碍它成为回归问题上的佼佼者。对于绝大部分的数据分析场景,线性回归是我们的首选。归其原因,有几点:

    第一、模型简单且适用于大数据。训练起来也非常快,资源消耗也少。

    第二、模型本身有非常好的可解释性。通过模型的训练,我们完全可以了解到哪些特征是有效的、哪些特征是无效的。而且,假如模型在线上环境出现了问题,我们也可以快速定位问题的根源是什么。由此可见,模型的可解释性有多么得重要。

    线性回归是由两个关键词来构成,分别是“线性“和”回归“。这里的线性指的是它具有线性的决策边界,在二维空间里其实就是一条线。另外,”回归”关键词说明它是用来解决回归类的问题。 这里的一个特例是逻辑回归,它其实是个分类模型。

    image.png

    一组关于身高和体重相关的样本数据:

    image.png

    我们希望通过身高来预测20岁男性的标准体重。数据中的特征是身高,预测值是体重。

    使用线性回归的前提是数据本身具有一定的线性特点,不然很难拟合数据的。那上述数据到底有没有线性的特点呢? 简单的方法就是通过可视化来观察数据。

    image.png
    通过数据的观察,确实可以找到一条线来近似地拟合这些数据

    image.png

    问题是:如何寻找拟合上述数据的最佳线条? 在以下给定的三条直线里哪一个最好?
    其实,这个问题的本质是:我们如何从数学的角度来描述为什么这条蓝色要比其他颜色好?

    答案就是要设计一个评估标准,并通过量化结果来得出这个结论,因为只有量化之后的结果才能被计算机所理解。
    那什么样的评估标准适合这个问题呢? 一种最简单的方法就是测量真实值和预测值之间的差异,也叫做误差。
    假设一条线很好地拟合数据,误差就会变小,反之这个误差就会变大。所以我们需要找的那条线是使得这个误差最小的直线。

    image.png

    求平方和,后面再做一个优化的过程当中计算会变得非常简单,通过这种方式求解的线性回归模型或者线条,把它叫做最小二乘的方法

    我们把这个误差也叫作损失函数(loss function)。有了损失函数之后我们的目标就变成了寻找模型的参数使得这个损失函数值最小。

    那又如何让这个损失函数变得最小呢? 这个问题归结为优化问题

    image.png

    对于只有一个特征的数据来说,这条线无非有两个参数,一个是直线的斜率ww, 另一个是直线的偏移量 bb,因为这两个参数唯一地决定一条直线。

    寻找最优参数其实就是最优化问题, 也称作模型的训练。那如何求解线性回归的最优解呢?

    高中时学过一种最优解的求解方法:把导数设置为零

    L是误差之和,也就是损失函数(目标函数)

    线性回归的优化.mp4 (231.93MB)

    image.png

    上述目标函数的求解过程也叫作最小二乘法(least square method)。 “二乘”这个关键词源自于因为使用了平方误差。
    实现一元线性回归模型的参数求解,参数分别是斜率和偏移量。不要调用sklearn的任何模块。sklearn里已经包含了线性回归模型,实际上我们并不需要自己去实现,以下代码只作为教学的目的。

    实现一元线性回归模型的参数求解,参数分别是斜率和偏移量。不要调用sklearn的任何模块。sklearn里已经包含了线性回归模型,实际上我们并不需要自己去实现,以下代码只作为教学的目的。

    1. import matplotlib.pyplot as plt # 引用matplotlib库,主要用来画图
    2. data = np.array([[152,51],[156,53],[160,54],[164,55],
    3. [168,57],[172,60],[176,62],[180,65],
    4. [184,69],[188,72]])
    5. # 打印大小
    6. x, y = data[:,0], data[:,1]
    7. print (x.shape, y.shape)
    8. # 1. 手动实现一个线性回归算法,具体推导细节参考4.1课程视频
    9. w = (np.mean(x*y)-np.mean(x)*np.mean(y))/(np.mean(x*x)-np.mean(x)*np.mean(x))
    10. b = np.mean(y)-w*np.mean(x)
    11. print ("通过手动实现的线性回归模型参数: %.5f %.5f"%(w,b))
    12. # 2. 使用sklearn来实现线性回归模型, 可以用来比较一下跟手动实现的结果
    13. from sklearn.linear_model import LinearRegression
    14. model = LinearRegression().fit(x.reshape(-1,1),y)
    15. print ("基于sklearn的线性回归模型参数:%.5f %.5f"%(model.coef_, model.intercept_))

    输出结果
    (10,) (10,)
    通过手动实现的线性回归模型参数: 0.57576 -38.07879
    基于sklearn的线性回归模型参数:0.57576 -38.07879