本系列是《玩转机器学习教程》一个整理的视频笔记。通过之前的小节了解了多项式回归的基本思路,有了多项式就可以很轻松的对非线性数据进行拟合,进而求解非线性回归的问题,但是如果不合理的使用多项式,会引发机器学习领域非常重要的问题过拟合以及欠拟合。
01
均方误差衡量多项式回归
测试用的数据集和前几个小节所创建的数据集是一样的:
- 创建的数据集具有一个特征;
- 生成的y和x之间是二次方的关系;
首先还是使用线性回归来拟合上面的非线性数据集:
最终在非线性的数据集上,线性回归得到的R方值为0.49,由于没有像分类精度那种统一的衡量标准,因此在回归中引入了R方,R方的范围为[0, 1],因此0.49相对来说还是比较低的,通过R方值也可以看出来,样本数据x和样本标记的输出y之间他们的线性关系是很弱的,所以直接使用这种线性回归的方式可能并不合适。这种情况下,我们就需要尝试使用一些拟合非线性数据的方法,而多项式回归就能拟合非线性数据集。
通过之前小节的学习,知道了多项式回归的本质只是增加样本数据的多项式特征,之后依然使用线性回归进行拟合,那此时可不可以继续使用R方来衡量回归拟合的好坏呢?
其实依然是可以通过R方来进行衡量的。有些人可能会有疑问,因为直接使用线性回归模型进行回归分析和添加多项式特征之后再使用线性回归,他们之间的方程是不一样的,相对应的线性回归系数的个数是不同的,他们处在不同的维度,所以如果此时使用R方来衡量两个不同方程的线性回归好坏,是不具有说服力的,但是实际上是可以通过R方这个指标来衡量线性回归和多项式回归的。为了避免这种歧义,老师使用了均方误差指标来衡量数据拟合的结果,这是因为不论是线性回归还是多项式回归此时都是对同样一组数据进行拟合,所以即使使用不同的方法进行拟合得到的均方误差指标是具有可比性的,同时使用均方误差作为衡量指标也方便在下一小节绘制学习曲线。
接下来计算线性回归以及多项式回归的均方误差:
在使用多项式的时候创建了一个函数,返回的是Pipeline对象,其实质就是使用Pipeline对多项式进行包装,在这个Pipeline中多项式回归分成三个步骤:
- 添加多项式的特征;
- 由于新添加特征是多项式,特征和特征之间的差距比较大,可能导致梯度下降优化算法迭代效率低下,因此对添加特征后的数据进行归一化操作;
- 最终就是将数据输入到线性回归模型中进行训练;
这里将添加多项式特征的PolynomialFeatures对象的参数通过传入函数中的参数进行指定。
对于上面的非线性数据集使用线性回归得到的均方误差值为3.07,而使用多项式回归得到的均方误差值为1.09,很显然使用多项式回归要比使用线性回归要好很多。绘制一下原始的数据和拟合的结果:
通过上图的拟合效果可以看出,degree阶数为2的拟合效果非常好,那如果degree传入其他的值会怎么样呢?
2
过拟合和欠拟合
上面介绍当degree值传入2的时候拟合的效果非常好,接下来给degree传入不同的值,首先将degree参数设置为10,看看degree为10时候模型的均方误差是多少?
得到的均方误差值为1.05,得到的这个值比前面degree设置为2的时候还要好,这就说明将degree传入10之后,训练出来的模型对于原始的数据来说,预测结果比degree值为2的效果要好。
接下来,尝试一下更极端的,将degree设置为100:
计算出来的均方误差更小了,只有0.68,绘制图像弯曲程度更厉害了。事实上,在degree设置为100的时候,绘制的图像并不是我们计算出来真正的拟合曲线,这是因为绘制出来的曲线,他们只是原有数据点之间对应y的预测值连接出来的结果,有很多地方可能没有那个数据点,所以连接的结果和原来的曲线不一样,接下来真正还原一下degree为100的拟合曲线。
这个绘制结果比之前更准确,因为此时的X是在-3到3这个轴之间均匀取值的,所以不会出现两个点之间相隔太大这样的情况。通过y轴可以看出来,负的方向到达了-25000这么多,这个图像其实是看不出来整个拟合曲线是什么样子的,所以此时对轴的取值范围进行一下限定,也就是添加一行限定轴范围的代码。
这就是真正的将degree传入100之后多项式回归拟合的结果。
现在就可以简答的分析一下,很显然多项式回归degree传入的值越高,我们最终的拟合结果会越好,其实道理非常的容易,有这么多的样本点,总能找到一根曲线,这根曲线可以将我们所有样本点都进行拟合,也就是说让我们的所有样本点都完全的落在这根曲线上,使得整体均方误差拟合的误差值为0,当然如果让这个拟合的结果为0的话,相应的多项式的次数degree取值一定是非常高的。
前面实验degree的值设置为2到10再到100,很明显均方误差一直在降低。拟合的结果虽然从均方误差的角度来看更加的好,均方误差越来越小,但是他真的是一个能够更好的反映样本数值走势相应的曲线吗?换句话说,我们用了一个非常高维的数据,虽然使得我们拟合所有的点获得了更小的误差,但是这根拟合曲线完全不是我们想要的样子,他为了能够拟合给定的所有样本点,变的太过复杂了,这种情况就称之为过拟合,也就是Overfitting,fit是模型拟合数据的函数,over过渡的拟合了,因此称之为overfitting。如下图所示。
最开始使用一根直线来拟合非线性数据,很显然也没有反映原始数据的样本特征,但是他的问题并不是因为太多复杂,而是太过简单,这种情况就称之为欠拟合,相应的应为叫做Underfitting。
我们使用多项式回归的方式可以非常直观的解释过拟合和欠拟合,如果使用二次方程生成原始数据的话,那么使用一次方程得到拟合的结果显然就是欠拟合,而我们使用高于二次方拟合的结果,尤其是使用degree为10、100甚至更高的阶数进行拟合的话,结果一定是过拟合的。
点赞噢
下一小节会介绍如何识别出过拟合以及欠拟合,还有之前一直使用的train_test_split方法将原始数据集划分为训练数据集和测试数据集背后更重要的意义。