本系列是《玩转机器学习教程》一个整理的视频笔记。本小节主要介绍衡量线性回归算法的一些指标。
回归问题如何评价?
前面在kNN算法中,为了评估训练的kNN算法的好坏,我们将数据集划分为训练集合测试集两个部分:
- 训练集,训练拟合模型;
- 测试集,评估训练好的模型。
在kNN分类中,我们将在训练集上训练好的模型,在测试集上进行预测,得到的测试结果与测试集中已知的样本标签(监督学习)进行对比,统计样本分类正确的占比作为评估kNN分类算法好坏的指标。
上面提到的是在分类问题上的评价标准:分类精度,在回归问题上,由于样本标签是连续的,因此不能使用分类精度作为模型的评价标准。
下面使用简单线性回归算法为例,当然无论是分类问题还是回归问题,我们都需要将数据集划分为训练集和测试集,因此对于简单线性回归来说,也分成两个部分:
- 目标是找到a和b,使得优化目标函数在训练集上尽可能小,得到使得优化函数最小的参数a和b;
- 在训练集训练得到的参数a和b,将测试集的样本丢到训练好的模型当中(对于简单线性回归问题上就是代入y = ax b)的方程中,求得出对应的预测的结果;
很显然,可以将优化的目标函数作为衡量标准,但是此时需要注意的是,衡量标准时候所用的是测试集上的样本。
MSE均方误差
但是上面得到的衡量标准有一个问题,当我们像别人汇报这个衡量标准的时候,这个衡量标准是和m相关的。
比如说,两个人A, B都在做一个房产预测的算法,A说自己做的房产预测的方法在上面的衡量标准下得到误差累计的平方和是1000,B则在此衡量标准下得到的是800,很显然并不能说明B的算法更好,因为我们不知道AB两个人在具体的衡量的时候,测试集的样本数量是多少,总而言之,上面的衡量标准和测试集的数量m有关的。
针对上面这个缺点,我们只需要进行简单的改进即可,也就是让我们衡量标准测试样本的数量无关,只需要除以测试集样本数量即可:
但是MSE这个衡量标准还有一个小问题,就是量纲上的问题,如果进行方差预测的时候,样本的标签单位为"万元",那么如果使用MSE衡量标准的话,由于有平方,得到的误差是"万元"的平方,此时的量纲变成了"万元"的平方。很明显有时候这个量纲问题可能给我们带来麻烦。因此针对此问题一个简单的改进方式就是使用RMSE均方根误差。
RMSE均方根误差
其实改进方法很简单,只需要将MSE均方误差开根号即可,这样得到的误差结果就和样本中y的量纲是一致的了。
其实MSE和RMSE本质上是一样的,只是对于量纲敏感的任务上,使用RMSE得到的误差背后的意义更加的明显。
MAE平均绝对值误差
他的意思就是在测试集上针对每一个样本都预测出一个结果,那么直接将预测结果与真实结果相减取绝对值,然后将全部样本的误差进行累加,之后取一个平均。
这里要注意:
前面介绍线性回归算法的时候,在训练过程中的损失函数或者目标函数没有定义成MAE平均绝对值误差,是因为绝对值不是一个处处可导的函数,所以他不方便用来求极值,但是这个方法完全可以评价线性回归算法。换句话说,评价使用的衡量标准和训练时要优化的损失函数或者目标函数,是可以完全不一致的。
编程实现三个衡量标准
在前面小节中将衡量分类的衡量指标分类精度放在了playML包下的metrics模块下,因此将回归算法的三个衡量指标也放在这个模块下:
在jupyter中调用封装好的回归问题的衡量指标:
在sklearn中调用同样非常简单,但是在sklearn中没有RMSE的衡量标准,当然了只需要对MSE开根号就能得到RMSE。
RMSE vs MAE
首先这两个衡量标准的量纲是一致的,前面我们看到在实验中,RMSE的结果要比MAE的结果大一些,这是因为RMSE是将错误值进行了平方,将这些平方累加后在进行开根号的运算。此时如果错误值非常大的话,比如两个样本之间的差距是100的话,经过平方操作以后,差距就被扩大到了10000,也就是说RMSE有放大预测结果和真实结果之间较大那个差距的趋势。而MAE是没有这样趋势的,他直接反映的是样本预测结果和真实结果之间的这一个差距,没有平方的操作,也正是因为这个原因,从某种程度上来讲,我们尽量的让RMSE值尽量小,相对来讲意义更大一些,因为这意味着整个样本错误中,哪个最大的错误值相应的比较小,我们在训练模型时候使用的目标函数就是使用RMSE中根号里面没有除以m的那一部分,这一部分其实和优化RMSE本质是一样的,当然在训练的时候使用的是训练集而不是测试集。
换句话说,在我们的简单线性回归的训练过程中,使用这个目标函数本质就是在想办法减少最终预测结果最大的那个误差之间相应的差距,这就是为什么在训练模型时候的优化函数选择RMSE而不是MAE的另外一个优势,第一个优势是因为MAE有绝对值,不可导。