OK,这一章我们的内容也是和题目一样,虽然大部分在说定义,但是却十分重要。
经验误差
学习器在训练集上的误差称为“训练误差”或“经验误差”
在新样本上的误差称为“泛化误差”。
过拟合是无法避免的,我们能做的的只是“缓解”,或者说减小其风险。
评估方法
我们首先要知道的是,我们所得到的模型最后是给未知样本使用的。但是,在现实中我们只有训练数据,而没有未来数据。
所以,我们会将测试数据进行分割,变成训练数据和测试数据。
关于如何挑选测试数据,有以下的原则:
测试集和训练集要互斥
测试集,训练集要尽可能保持数据分布的一致性。
比如:有一个数据集 T,它有 500 个正例,300个反例,所以应该给训练集分 400个正例,250 个反例,给测试集 100 个正例 50 个反例
即尽可能保证训练集和测试集的类别比例差不多
但是如何挑选测试集和训练集呢?以下给出三种方法
挑选训练集和测试集方法
留出法(hold out)
留出法是直接将数据集 D 划分成两个互斥的集合,训练集 S,测试集 T。
一般训练集 S 占据 2/5 ~ 4/5
但是,有一个关键问题在于,我们想训练的数据模型应该尽可能囊括所有的数据集,即,数据量越多,你训练的模型就会越好。
但是,留出法却将一部分数据不参与训练,导致训练出的模型具有局部性质。
交叉验证法
这个是将数据集 D 划分成 K 个大小相似的子集。
然后每一次选用 K-1 的子集作为训练集,剩下的那个子集作为测试集,循环 K 次。
最终评估的结果是 K 折交叉验证结果的均值。
当然,特殊一点的是留一法(leave one out,LOO),即测试集只有 1 个样本。
因为留一法几乎囊括了所有的训练数据,所以,它训练出的模型具有代表性,但是遇到数据量大的,就很吃力。
自助法
这是一个很有意思的方法。
具体如下:
给定 m 个样本的数据集 D,我们对其采样产生数据集 D’.
每次随机从 D 中选取一个样本放在 D’ 中,然后将样本放回 D 中,以保证下一次还有可能选到,这个过程重复 m 次,所得的 D’ 就是训练数据集。
经过数学计算,初始数据集 D 约有 36.8% 的样本不会出现在 D’ 中。
然后用 D - D’ 作为测试集。
一般来说,自助法在数据集较小,难以有效划分数据集和测试集时比较有效。如果初始数据集量足够,则推荐使用留出法或者交叉验证法。
调参
机器学习的大部分工作都在无聊的调参上,实在是让人想吐。
但是我们如何要验证参数的好坏呢?测试集是为了验证模型的好坏,这个是不能动的。
所以,我们只能从训练集上再划分一块,即定义为验证集。
我们会基于验证集上的性能来进行模型的选择和调参。
查准率和查全率
我们可以用准确率,错误率来评价一个模型的好坏。
但是,这样分类并不能满足生活中所有的要求。
比如,我想知道预测的例子中正确的占比是多少?预测的例子中挑选的正确例子占所有正确例子的比例是多少?
再回答这个问题前,我想先介绍几个概念。
真正例 true positive TP
假正例 false positive FP
真反例 true negative TN
价反例 false negative FN
预测结果
真实情况 T F
T TP FN
F FP TN
其中 TP + TN + FN + FP = 样例总数
查准率(准确率)
查准率(precision),比如对于搜索引擎来说是检索出来的有多少时用户感兴趣的。
P = TP / (TP + FP)
用户真正感兴趣的数量 / 预测出用户感兴趣的数量
查全率(召回率)
查全率(recall),比如对于搜索引擎来说,用户感兴趣的有多少被查出。
R = TP / (TP + FN)
用户真正感兴趣的量 / 真实情况下的正例
通常查准率和查全率是一对冤家,即查准率高那么查全率就低,这个用逻辑也能思考出来,就不过多陈述了。。。
P-R 曲线
我们有个 P 和 R 的定义,那么我们就可以做出它们的关系曲线。
我们根据模型来预测样例,并对他们的结果进行排序,最前面的是最可能的,最后面的是最不可能的。
然后按照这个顺序,把每个样本作为正例进行预测,算出 P R 然后做曲线。
如下图所示:
如果某一个模型的 S(P-R) 大,那么就说明这个模型性能好。S 是指面积。
但是我们知道用积分求面积的话,通常不会很容易,所以我们引入一个变量 F1。
F1
F1 = (2 * P * R) / (P + R)
= (2 * TP) / (样例总数 + TP - TN)
对于更一般的式子如下:
F(β) = [(1 + β^2) * P * R] / [(β^2 * P) + R]
β > 1 查全率有更大的影响
β < 1 查准率有更大的影响
β = 1 则为标准的 F1
对于衡量一个模型的好坏,我们通常取多次测试,然后取平均值。