Kaggle 比赛中如何划分数据集?

划分数据集,是为了得到在实际数据上表现最优的模型,也就是要进行 validation。

Kaggle 比赛中如何划分数据集?

https://scikit-learn.org/stable/modules/cross_vali

什么是 validation ?

当我们训练好一个模型后,并不能直接应用于实际的生产,因为在训练模型时,用的是历史数据,而真正应用模型时,是要用来预测未来的数据,所以需要做一些检查,看模型是否能够应用在未来,检查这个模型在未来不可见的数据上是否是表现最好的,这些 checks 就是 validation。

具体做法,就是要把数据集分成三部分,训练集,验证集,测试集:


Kaggle 比赛中如何划分数据集?


  • 在训练集上训练模型,
  • 在验证集上检查模型的质量,
  • 在测试集上应用模型。

此外,在 kaggle 的比赛中,组织者会将测试集进一步划分为 public 和 private 两部分,在比赛过程中提交拿到的分数,是在 public 测试集上的结果,当比赛结束时,会显示 private 测试集上的结果。

如果一个模型在 public 的分数比较高,但是在 private 的分数很低,那么说明模型过拟合了。


什么是过拟合?

我们训练模型时,本质是希望模型可以识别数据中的模式。

如果模型太简单了,就没办法捕捉到数据中的模式,这个叫做欠拟合。

欠拟合的话,我们就增加模型的复杂度,提高训练集的质量。

可以如果模型太复杂了,它虽然可以将训练集的数据描述的非常好,但是却无法很好地捕捉到测试集的模式,这个叫做过拟合。


Kaggle 比赛中如何划分数据集?


比赛中的过拟合和一般的过拟合还不太一样:

一般的过拟合指的是,模型捕捉到了模式但却不适用于测试集,

比赛中的过拟合指的是,模型在 private 测试集上的质量很差,而这却并没有通过 validation score 检查出来,也就是 public 测试集上表现还挺好。


所以,比赛要拿高分,有个问题需要明确,就是组织者是如何划分训练集和测试集的,public 和 private 是如何划分的。

那么训练集和验证集要如何划分呢?

主要有下面几种划分方法:

  • Holdout:

就是将数据集简单地分成训练集和验证集两部分,当数据足够多的时候适合用这个方法,或者在不同的划分下,模型的参数和分数差不多时。


Kaggle 比赛中如何划分数据集?


  • K-fold:

相当于是做多次 Holdout,取训练集中不同的部分作为验证集,最后再取平均。它和简单地重复多次 Holdout 的区别是,简单重复的话,有些样本可能一直都无法被选中作为验证集,但是在 K-fold 中每个样本都可以作为验证集。这个方法适用于数据量中等的情况,或者对于不同的划分,模型的分数和参数会很不相同时。在 shuffle 数据上,常用 Holdout 和 K-fold。


Kaggle 比赛中如何划分数据集?


  • Leave-one-out:

是 K-fold 的特殊情况,就是当 K 等于样本数量时。这意味着要迭代数据集中的每个样本,每一次都是有一个样本作为验证集,另外 K-1 个样本作为训练集。这个方法适用于数据量非常少的情况,或者模型非常快的时候。

它们主要的区别就是划分的次数是多少。

注意在划分时,一个样本只能被分到一个集合中,不能同时在训练集和验证集中,否则模型在验证集上的表现可能会和测试集上面一样好,那就无法检查出模型真正的质量了。

  • stratification:

它是一种让 validation 更加稳定的方法。

例如有一个二分类问题,数据集只有 8 个样本,4 个类别是 0,4 个类别是 1,

然后将数据集分成 4 folds,

这里有个问题是,例如用第二份作为验证集,那么目标值的平均会是 2/3,而不是 1/2,这就会影响我们模型的预测,

所以要用到 stratification 分层来应对这个问题。

这个方法是为了保证在不同的 folds 上,目标的分布是相似的,

在应用 stratification 后,每个 folds 上的平均值差不多都是 1/2.

stratification 常用于小数据集,不平衡的数据集,或者多分类问题上。


不同的划分方法对模型有什么影响?

不同的划分策略,会对下面三点有很大的影响:

  • 生成的特征
  • 模型依赖特征的方式
  • target leak


Kaggle 比赛中如何划分数据集?


例如,我们要处理一个时间序列问题,时间序列数据要如何划分训练集和验证集呢?

一种是随机选择一些样本作为验证集,

一种是保持时间的顺序,以某个日期为节点,之前的作为训练集,之后的作为验证集。

如果我们的目标是要要预测未来连续几天的若干个值,那么用第二种方法好一些。

此时如果我们用了第一种划分方法,那么在这种方法下训练出来的模型,在预测未来连续几天的问题上,表现不会很好。

而且,模型的预测值会比较靠近目标的平均值,

左图是用随机的方法选择验证集的,如果验证集的数据比较靠近这个平均值,验证集的分数就会比测试集的分数好一些。

而在第二种情况,验证集的点和测试集的点都离平均值比较远,验证集的分数就会和测试集的分数差不多。

总之,为了更好地生成模型,并且不断地改进模型,我们最好可以识别组织者是如何划分训练集和测试集的。


划分方法有哪些角度?

一般可以分为三类:

  • 按照行随机划分

当数据是互相独立的时候使用。

  • 按照时间划分

如果要预测未来连续几周的数据,那么划分时候也是以某个日期为节点去划分。

  • 按照 ID 划分

当数据涉及到用户等个体时,需要根据 ID 划分,使得训练集和验证集中没有重合的部分。

  • 混合方法

如果一个比赛包括以上多个特征,那么划分时候可以考虑混合应用各个策略。

比如 Home Depot Product Search Relevance 这个比赛中,参赛者需要估计出搜索的关联性。

训练集数据包括搜索的项目和搜索的结果,但测试集只有搜索的项目,所以不能直接用随机划分,因为这个需要比较复杂的模型,容易过拟合;也不能用基于搜索条目的划分,这种方法容易欠拟合,比较好的做法是在划分时,要模拟出新出现的搜索条目所占的比例。

总之,不同的比赛,不同的数据特点,需要用不同的划分策略,有一个很重要的规则是,在划分训练集和验证集的时候,要尽量模仿出比赛组织者所划分的训练集和测试集的状态,这样验证后的模型才更可信,才能在测试集上表现优秀。


学习资料:

https://youtu.be/L2BlnCF4fJM

https://youtu.be/pA6uXzrDSUs

https://youtu.be/mc1pZrubdno

https://www.quora.com/What-is-validation-in-data-science


分享到:


相關文章: