Hi,大家好,我是半亩花海。学完分类算法原理的知识,我们进入评估相关知识的学习,继续更新《白话机器学习的数学》这本书的学习笔记,在此分享模型评估与交叉验证相关评估原理。本章的基于前几节已建立的模型进行评估知识的学习,欢迎大家交流学习!
目录
一、模型评估
模型评估是对训练好的模型性能的好坏程度进行评估, 模型评估是模型开发过程不可或缺的一部分。它有助于发现表达数据的最佳模型和所选模型将来工作的性能如何。
在进行回归和分类时,为了进行预测,我们定义了目标函数 ,然后根据训练数据求出了函数的参数 。也就是对目标函数进行微分,然后求出参数更新表达式的操作。
但其实我们真正想要的是通过预测函数得到预测值。以回归的那个例子来说,即基于广告费的点击量预测。我们希望 对未知数据 输出的预测值尽可能正确。那我们如何测量预测函数 的精度(准确性,Accuracy)呢?对于一个变量的问题,我可以用图直观的表示出来:
像多重回归这样的问题,变量增加后就不能在图上展示了,而且特意去画图也很麻烦。所以我们需要能够定量地表示机器学习模型的精度。 接下来我们就要考虑评估模型的方法有哪些?怎么用?
二、交叉验证
1. 回归问题的验证
把获取的全部训练数据分成两份:一份用于测试(用来评估模型),一份用于训练。
举个例子,假如有 10 个训练数据,那么实际上会按照 5 个测试数据、5 个训练数据来分配它们,但是比起 5 : 5,大多数情况会采用 3 : 7 或者 2 : 8 这种训练数据更多的比例。
接下来我们先尝试着 3 个样本用于测试、7 个样本用于训练。那么,在基于点击量预测的回归问题中,我们有 10 个数据,其中测试数据和训练数据的分配情况如下。
右侧的 3 个是测试数据、左侧的 7 个是训练数据。首先,我们来考虑使用左侧这 7 个数据来训练参数的情况。用一次函数 表示即可。先从一次函数开始考虑比较好。先不去管测试数据,只看那 7 个训练数据。拟合得较好的一次函数的图像大概如下。
接下来还是不管测试数据,考虑一下二次函数,如下图所示。
如果 是二次函数,那它基本上就是这个形状。但是这个函数“只有对训练数据才是正确的”,对于测试集的预测效果很差。也就是说如果只看训练数据,那么二次函数比一次函数拟合得更好。但如果将测试数据也考虑进来,那么二次函数就完全不行了。要把测试数据当作未知数据来考虑。即使模型相同,如果训练数据过少,这种现象也会发生。那么在训练结束之后,我们还得像这样检查一下测试数据是否也拟合,但是如果变量增加,就不能画图了。就算能画图,也会很麻烦。
对于回归的情况,只要在训练好的模型上计算测试数据的误差的平方,再取其平均值就可以了。假设测试数据有 个,那么可以这样计算。
对于预测点击量的回归问题来说, 就是点击量,而 是广告费或广告版面的大小,这个值被称为均方误差(Mean Square Error,MSE)。这个误差越小,精度就越高,模型也就越好。
其实,回归的目标函数也是误差函数,这与为了让误差函数的值变小而更新参数时所做的事情是一样的。
2. 分类问题的验证
与回归的时候一样,我们先考虑数据的分配,姑且先如下分配吧。
还是先不管测试数据。“数据的分配方法不要太极端其实会更好”这一点与回归的时候也是一样的。假设在逻辑回归的情况下, 是简单的一次函数,那么只根据训练数据进行训练后,决策边界如下所示。
但是假如 更加复杂,可能就会像下面这样紧贴着训练数据进行分类。
可以看到可以对训练数据完美地进行分类,却完全忽视了测试数据。对于分类有别的指标。由于回归是连续值,所以可以从误差入手,但是在分类中我们必须要考虑分类的类别是否正确。在回归中要考虑的是答案不完全一致时的误差,而分类中要考虑的是答案是否正确。
我们对图像是横向的还是纵向的进行了分类,我们是根据图像为横向的概率来分类的。关于分类是否成功就会有下面 4 种情况:
- 图像是横向的,被正确分类
- 图像被分类为横向,但实际上不是横向的
- 图像不是横向的,被正确分类
- 图像被分类为非横向,但实际上是横向的
将上述内容整理到下面这张表中。
设横向的情况为正、非横向的情况为负,那么一般来说,二分类的结果可以用这张表来表示:
分类结果为正的情况是 Positive、为负的情况是 Negative。分类成功为 True、分类失败为 False。我们可以使用表里的 4 个记号来计算分类的精度。精度的英文是 Accuracy,它的计算表达式如下。
它表示的是在整个数据集中,被正确分类的数据 TP 和 TN 所占的比例。假如 100 个数据中 80 个被正确地分类了,那么精度则是如下所示。
使用测试数据来计算精度 Accuracy 这个值,值越高则精度越高,也就意味着模型越好。
3. 交叉验证
把全部训练数据分为测试数据和训练数据的做法称为交叉验证。这是非常重要的方法,一定要记住哦。交叉验证的方法中,尤为有名的是 K 折交叉验证,掌握这种方法很有好处。
K 折交叉验证步骤如下:
- 把全部训练数据分为 K 份
- 将 K − 1 份数据用作训练数据,剩下的 1 份用作测试数据
- 每次更换训练数据和测试数据,重复进行 K 次交叉验证
- 最后计算 K 个精度的平均值,把它作为最终的精度
假如我们要进行 4 折交叉验证,那么就会如下图所示来测量精度:
如果全部训练数据的量较大,这种方法必须训练多次,会比较花时间,不切实际地增加 K 值会非常耗费时间,所以我们必须要确定一个合适的 K 值。