实用机器学习笔记十九:模型验证
前言:
本文是个人在 B 站自学李沐老师的实用机器学习课程【斯坦福 2021 秋季中文同步】的学习笔记,感觉沐神讲解的非常棒 yyds。
近似泛化误差:
对于机器学习模型来说,我们最关心的就是关心模型在所有未知数据上的预测误差,也就是模型的泛化误差。但是这需要很多很多的采样,因此,可以使用近似泛化误差来代表。方法如下:
使用测试集上的泛化误差来代替真正的泛化误差。注意的是测试集只能被使用一次。
就像期中考试你只能做一次,不能出了成绩之后,再做一次来代替原来的成绩。
使用验证数据集(常用),验证数据集可以使用多次。
从训练数据集中拿出一部分来作为验证数据集。
日常我们所说的“测试”,“测试准确率”指的就是验证数据集上面的测试,并不是真正严格意义上的测试。
生成验证数据集:
随机分割:
把数据随机分成两部分:一部分是训练集,另一部分是验证集(常常叫“测试集”)
训练集用来训练模型,验证集上的误差来近似泛化误差。
在模型选择时,通常使用验证集上的误差或者精度等指标来选择模型。
常常随机选择样本容量的来作为验证集,n = 50,40,30,20,10
独立同分布(iid):
上面我们说要随机分割数据,但是有时候对于一些数据集,随机分割是不行的。随机分割的前提:数据集中的每一个样本之间是独立同分布(样本之间没有关联吗,可以看做是由一个函数独立随机生成的)。
实际生活中,很多数据是不符合独立同分布假设的。
数据中含有时序信息:比如:房价,股票
直接随机分割:数据集中房价是一天一天的,每一天都有很多数据,如果直接随机分割的话,验证集中当天的数据会有一部分,第二天的数据也有一部分等等,训练集中当天的数据会有一部分,第二天的数据也有一部分,也就是说训练集中出现了未来需要在验证集上需要预测的数据。而房价预测问题要做的是预测未来的房价,这就会导致各种指标不合理。解决方案:比如整个数据集中有 100 天的房价信息,把前 70 天作为训练集,后 30 天作为验证集。
样本属于不同的组别:比如人脸识别中,每一个人的人脸图片有很多张,如果随机分割的话,会出现同一个人的人脸即出现在训练集中,也会出现在验证集中。训练出来的模型都看到过这个人脸了,再去验证,精度偏高。
解决方案:按照人脸组别来分,如果 100 个人的数据,随机 70 人做训练,剩下的做验证。
数据不平衡:数据集中有些类数据量比较大,有些类数据量比较小。数据量不平衡。如果直接随机采样,类数据量大的会被采样的多,反之。
解决方案:类数据量少的,在分割的时候,要多采样。
K 折(K-fold)交叉验证:
适用场景:数据集比较小,没有充足的数据,无法拿出一个单独的集合来做验证集。
具体步骤:
把数据平均分成个部分。如下图所示(下图是分了 3 部分,即):
For i =1,...,K:
使用第 i 个部分来作为验证集,剩余部分用来训练,得到验证误差
把 K 个验证误差的平均作为泛化误差
K 通常取:5 或者 10。根据数据量的多少来选择
容易犯的错误:
李沐大神的观点:在机器学习中超好的模型往往都是有 bug 的。
原因:验证集被污染了
验证集和训练集有数据交叉:
比如:数据集中有些样本是重复的,比如同一个人的图片组,超过两组。因此在验证集分割时,这个人的图片组就有可能出现在训练集和验证集中
常常发生在数据融合时:比如:评估在 ImageNet 上训练的模型,就根据数据集上的标号通过搜索引擎来收集一些数据作为验证集,可是你忘了,ImageNet 数据集也是从搜索引擎上爬下来的。
信息泄露:
非 iid 的数据集,直接随机分割训练集和验证集。就如前面所讲的,会出现未来将要在验证集上的样本出现在了训练集上,导致泛化误差很小。
版权声明: 本文为 InfoQ 作者【打工人!】的原创文章。
原文链接:【http://xie.infoq.cn/article/6a123e77f8a961f133cebceb2】。文章转载请联系作者。
评论