《机器学习》——李宏毅 学习笔记(二)
Regression
regression 即 回归。早在高中阶段我们就学过如何画散点图的回归线。在图中给出一堆散点,我们要画出能拟合大多数数据点的直线,这条直线我们就称为线性回归函数。
事实上,线性回归来自于统计学的一个概念,关于线性回归的完整定义如下:
“在统计学中,线性回归是一种对因变量和一个或多个自变量之间关系建模的线性方法。一个自变量的情况称为简单线性回归;对于多个自变量的情况,这个过程称为多元线性回归。“
而对于机器学习领域而言,我们通常把需要找一个函数,通过给该函数输入特征 x,使函数输出一个数值的一类任务称之为“回归”。
回归的应用面十分广泛:天气预报、股票预测、房价预测等等,都离不开线性回归的应用。
1.回归模型的构造
- 模型选取
对于不同的问题,我们选择构造不同的线性回归模型,如上文所示:线性回归可分为简单线性回归和多元线性回归两类,主要区别是自变量的数量不同。
简单线性回归模型 :
多元线性回归模型 :
(我们也称之为一元线性模型和多元线性模型)
公式内的 x 就是特征(feature),w 代表各个特征的权重, w0 代表偏移量(有的公式用b代表w0)
图中的例子就是一个多元线性模型,每一个Pokemon的进化前的CP值、物种(Bulbasaur)、血量(HP)、重量(Weight)、高度(Height)等都属于要输入的特征,由于是多个特征,所以我们选取多元线性模型。在考虑的过程中我们会把输入输出数据转化成相应的矩阵形式,以便于模型的训练。
- 模型评估
模型评估的过程首先要求我们收集真实状况的数据,这些真实数据展示在坐标系里是一个个点,这些点构成了散点图。我们会以这些散点为参照构造回归函数。当然,计算机是不会看一眼就画出来图的,计算机需要根据数据,一次一次迭代,从而找到拟合效果最好的函数,这个迭代的过程就是优化的过程,而优化所必需的东西,叫做 损失函数 。
损失函数的机制我们以后再讲,这里我们直接指出我们使用的损失函数以及该函数的工作原理。简单来说,损失函数所表示的就是当前模型与实际模型之间的差距,损失函数的值越大,意味着当前模型的拟合效果越差,所以我们的目的通过调整当前函数的参数来降低损失函数的值。
损失函数:
这个函数就是均方误差函数。我们降低这个损失函数的值的方法叫做梯度下降法。通常梯度下降的过程中我们会先选择一个 η 作为学习率,然后对于某一组参数,求该组参数相对于损失函数的微分,如果结果为负,则将参数向正向移动 η 大小,若为正,则参数向反向移动改大小。η 被称为学习率(Learning Rate)

<注:这里不打算花费过多笔墨在损失函数的选取和梯度下降法上,因为下一节的课程笔记中会有更详细的解释,详情请看《机器学习》——李宏毅 学习笔记(三)>
2.模型好坏的验证
当我们使用梯度下降的方式找到那个看似最好的函数之后,我们还需要验证这个函数在同类型的别的数据集内运行的效果如何。例如上文的模型中,训练完毕后我们会再使用10组Pokemons的数据测试模型,以反映该模型真实的拟合水平。
有人可能会觉得,我已经把Loss Function的值降的很低了,这不就意味着这个函数和数据集拟合的效果很好了吗,为什么还要去做这样的验证呢?那是因为只在训练集中迭代的函数,可能会出现 过拟合 的现象。
- 过拟合(Overfitting)
这张图很形象的展示了过拟合的本质,就是函数在训练的时候过度理解了数据集,把一些数据集本没有的特征给加上了。
(碎碎念:我觉得跟高考语文阅读理解的答案一样。。。2017年浙江高考语文卷阅读理解的一道题,问了考生“鱼眼睛里闪着诡异的光”表达了作者什么想法,后来作者本人说:在答案出来之前,自己也不知道想表达什么。。出题老师对文章的理解显然过拟合了)
下面给出Tom M. Mitchell在 《maching learning》 一书中给出的过拟合的严格定义。
给定一个假设空间 H,另一个假设 h 属于 H,如果存在其他的假设 h’ 属于 H ,使得在训练数据集上 h 的错误率比 h’ 小,但在整个实例分布上 h’ 比 h 的错误率小,那么就说假设 h 过度拟合训练数据
当然我们没必要如此在意这个定义,我们只要知道如果模型在验证集上和训练集上表现很好,而在测试集上表现很差时,那么大概率是出现过拟合现象了。
接下来我们来看一个过拟合的例子,即课程中Pokenmon进化后cp值预测的问题。
如图,第一次找到的函数拟合效果似乎并不是很优秀,于是我们计划提升要找的函数的最高次幂,函数由一次函数变为二次函数。
第二次的拟合效果很明显好于第一次,之后升级到三次函数,我们发现效果同样会变得更好。但是到了第四次就出现了变化。
第四次的函数在训练集中的表现很好,但是在测试集中的Loss比第二次的要高,事实上第五次的Loss甚至达到了两百以上,这里就是出现了过拟合现象。
- 步骤优化
当我们拿到更多的数据之后,我们发现一个现象,不同种类的Pokemon进化后cp值变化的规律明显不同,如图:
很明显,Pokemon的种类是一个hidden factor,对我们的目标函数有影响。
课程中对这个隐藏因子做了处理,重新设置了模型,设计的思路就是对于不同的Pokemon,函数的参数会有所不同,如图:
看似效果不错~在测试集中也得到了不错的结果,但是还不够好
接着,又把Pokemon的weight、height、HP的影响都考虑了进去,得到了一个参数很多的函数。加上去之后,由于参数量增多,又导致了过拟合,效果又不太好了。
- 正则化(regularization)
正则化是解决过拟合问题的一个十分有效的方法。上文中我们发现特征过多或者特征维度过高都会一定程度上导致过拟合,所以自然而然能想到通过降维或者减少参数量来解决过拟合问题。现在我们提出另一种解决过拟合问题的方法,即我们的正则化:保留所有的特征,但是减少参数的大小。
为什么减少参数的大小可以避免过拟合?
我们知道,过拟合现象反映在图中就是会有一部分点偏离了我们得到的函数,而我们的函数的值就是由参数乘特征加上偏移量所得到的,所以一旦我们的参数很大,那特征只需要很少的变化,就能导致结果出现很大变化。例如y = 10x这个函数,x只要增加1,y就会增加10。当然这是个很简单的例子,但是拓展到更多的特征结果也是一样的,即:很小的噪音,会带来很大的偏移。所以正则化是很有必要的,降低参数的大小,其实是降低噪音对预测值的影响。在很多情况下,w 的值越小,函数越平滑,越稳定。
这里在损失函数中加入了正则项,使模型在训练的时候可以降低 w 的值,b 的值接近于0 ,对曲线平滑是没有影响,所以这里没考虑。
(PS:似乎机器学习的方法很考验对数据本身的理解,当然机器学习本就很偏数据科学和统计学,所以我认为机器学习的过程中不应该拘泥于算法技巧的应用,有时候对数据的独特见解可能会给模型带来意想不到的好处)