请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

交叉验证的疑惑

bobo老师,向您询问一个问题。如何使用交叉验证调节参数,并且得到最终的准确率呢?我看了bobo老师课程里面的回答:先使用train_test_split把原始数据集划分为训练集和测试集,然后在训练集上交叉验证,寻找最优的参数。最优参数一旦找到后,使用整个训练集去训练最优参数下的模型,然后在测试集上得到最终的准确率。这个办法我觉得没毛病,确实合理划分了训练集、验证集、测试集。因为在训练集下进行交叉验证,每次都会划分一小份数据作为验证的作用。

 

但是这个方法有一个漏洞:一开始划分的测试集有随机性。如果数据量非常小的话,那一开始划分训练集、测试集包含很大的偶然性。有可能划分到的测试集中包含了很多容易分对的样本,也有可能一开始划分的测试集包含了非常多很难分对的样本。在小样本的情况下,如果只让模型在一个测试集上得出答案的话,这样子的结果似乎没有可信度啊。如果只在一个测试集上测试的话,只能得到一个准确率,这样甚至都不能算置信区间。

 

那为什么不把原始数据直接交叉验证呢?直接将原始数据划分为训练集、验证集、测试集。十则交叉验证的话,就按6:2:2的比例将所有数据随机划分十次。这样既能通过验证集调节参数,我也相当于拥有了10个测试集,会得出10个准确率。这样我就能算出模型最终的平均准确率以及标准差。

 

不过我查了一些资料,似乎没有人这么干过。。。为什么不采取这种方式进行交叉验证呢:)


正在回答 回答被采纳积分+3

1回答

liuyubobobo 2020-04-28 03:10:54

这里的关键还是要理解,我们为什么引入验证数据集?关键就是因为:如果不用验证数据集,只是用训练数据集和测试数据集,训练的结果会对测试数据集过拟合。也就是你的模型其实是不断看测试数据集的数据得到的结果,最终,这个在测试数据集上的结果就不可信了。


你可以理解成,训练数据集就是平时的作业;验证数据集就是模拟考试;测试数据集就是高考。高考的卷子的内容是不能参与到训练的,否则结果就不准确了。


划分出一个测试数据集,本质是在模拟真实的,完全没有见过的数据。只有用这个模型完全没有见过的数据,才能客观说明模型的真实效果。


你说得对,这会导致一个问题,测试数据集的划分随机。可这恰恰达到了这个测试数据集的目的:当你的模型被应用到真实的场景的时候,扔进你的模型的数据,就是这么随机的啊!


如果害怕 outlier,应该使用异常检测,把 outlier 剔除;如果觉得数据量太小,没有代表性,则应该增大数据量。


当然,你要偏说这个方法有漏洞,那也没毛病。毕竟使用一次高考来衡量不够合理。不过,从另外一个角度,其实测试数据集中的每一个测试点都是一次“高考”,最后测试数据集的准确度已经是“多次高考”平均的结果了。想让这个结果更可信,那就加大测试数据集的数量。当然,也要保证训练数据集的数量。这本质其实就是:训练一个稳固的模型,是对数据量有要求的。这也就是为什么数据非常重要,且值钱的原因。


继续加油!:)

2 回复 有任何疑惑可以回复我~
  • 提问者 慕婉清4872412 #1
    那下面这种方法是对的吗....
    
    
    那为什么不把原始数据直接交叉验证呢?直接将原始数据划分为训练集、验证集、测试集。十则交叉验证的话,就按6:2:2的比例将所有数据随机划分十次。这样既能通过验证集调节参数,我也相当于拥有了10个测试集,会得出10个准确率。这样我就能算出模型最终的平均准确率以及标准差。
    回复 有任何疑惑可以回复我~ 2020-04-28 11:47:21
  • liuyubobobo 回复 提问者 慕婉清4872412 #2
    不对。训练过程中所有数据都碰了。我说那么多,重点就是一句话,测试数据集是模拟生产环境下的真实数据的,不应该参与训练过程。一点都不可以。
    回复 有任何疑惑可以回复我~ 2020-04-28 12:35:56
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信