机器学习的模型评估就是对数据集D进行适当的处理,得到训练集S和测试集T,并在T中对模型进行验证,得到模型的好坏,下面是几种常用的方法:
留出法(hold-out)
- “留出法”就是将数据集分为两个互斥的集合,一个作为训练集S,另一个作为测试集T,有D = S T,S T =
- 其中,训练集S用来训练模型,测试集T用于评估模型的误差或精度,即模型的好坏
- 一般而言,训练集S的比例占数据集D的 ~
- 对数据集D划分时,S与T中数据的分布必须与原数据一致,举例来说,如猫狗二分类的任务,若数据集D中猫狗的比例是7 : 3,则在S和T中,猫狗的比例也应该是7 : 3
- “留出法”较为简单,但存在一些缺陷,主要有两个,一是留出法的验证结果与数据集的划分有关,不同的划分可能会导致不同的误差,导致结果不稳定;另一方面,留出法必须留出一部分数据用于验证,使得训练模型用的数据少于原数据集D,因而可能训练不够充分
- 对于第一个缺陷,可以用下面的“交叉验证法”解决;对于第二个缺陷,可以用下面的“自助法”解决
交叉验证法(cross validation)
- “交叉验证法”是将原数据集D划分成k个不相交且大小相同的集合,且每个集合与原数据集同分布,即 , ,
- 因此,交叉验证法也称“k折交叉验证”(k-fold cross validation),k常见的取值是10、5、20
- 交叉验证的具体过程是:在划分好k个集合后,进行k次训练,每一次训练取其中的k-1个集合的并集作为训练集,剩下的集合作为测试集,这样进行k次后,可以得到k个正确率,对它们取平均值,即得到该模型的正确率
- 交叉验证的优点之一是通过取平均值能够获得较为稳定的结果,但还是会面临训练数据集小于原数据集的问题
- 交叉验证的一种特殊情况是“留一法”(Leave-One-Out),假设数据集D的大小是n,则将数据集分为n个子集合,每个集合中只有一个元素,每一次的测试集也只有一个元素,训练集有n-1个元素,这样可以缓解训练集数据量减小的问题,但是会导致训练的开销太大(要进行n次训练)
自助法(bootstrapping)
- 假设数据集为D,大小为m,“自助法”可以获得与数据集大小一样的训练集S,方法是:每次从D中随机抽取一个样本,将其加入S,再将该样本放回数据集D中,这样重复m次,即可得到一个大小为m的集合S,测试集T = D - S
- 采用“自助法”得到的训练集于原数据集的分布不一致,很可能会包括重复元素
- 可以简单估计一下S中不同的样本数:对于D中任意的一个元素,其不被抽样到S中的概率是 所以S中大概包括D中1-0.368=0.632,即63.2%的元素
- “自助法”解决了训练集减小的问题,但是数据的分布发生了变化
- “自助法”一般在数据量较少、难以有效划分训练集和测试集时使用;当数据量足够时,一般采用“留出法”或“交叉验证法”
最终模型
- 最终的模型会选取在测试集中表现最好的模型,并用整个数据集D重新训练,这才是最终提交给用户的模型
- 需要注意的是,更多时候会将实际使用中遇到的数据称为测试数据,因此上述的集合T也常称为验证集(validation set)