使用自定义折叠嵌套交叉验证

时间:2016-04-24 16:23:01

标签: python machine-learning scikit-learn cross-validation

我的数据有一个名为pid的列,并且在列车测试拆分之间不应泄漏具有相同pid的记录。我有一个2层堆叠模型 -

  • 内部层通过对列车数据进行交叉预测来构建内部预测向量
  • 然后,我在原始列车 - 数据+内部预测向量
  • 上构建外部模型
  • 然后我评估测试数据的性能

这个过程应该重复X5。

我能想到的最佳方式是在外部图层中pid % 25和内部图层中的pid % 5分开。

代码变得繁琐而且不是非常pythonic。有没有更好的方法呢?我错过了一些整洁干净的sklearn / python用法,或者我的设计中存在一些根本缺陷?

N = 5

for external_fold in range(N):

    ex_test = [x for x in range(N**2) if external_fold*N <= x % (N**2) < (external_fold+1)*N]
    ex_train = [x for x in range(N**2) if x not in ex_test]
    ex_train_index = X[(X.pid % N**2).isin(ex_train)].index
    ex_test_index = X[(X.pid % N**2).isin(ex_test)].index
    ...
    for internal_fold in range(N):
        in_train_index = X[(X.pid % N)!=internal_fold].index
        in_test_index = X[(X.pid % N)==internal_fold].index
        # build a vector of internal model predictions

    # build external model and assess performance

1 个答案:

答案 0 :(得分:2)

您有两个需求,这些需求最近才在Scikit-Learn中得到解决,并且应该包含在下一个发布的版本中:

将相关样本保持在一起的交叉验证策略

新的CV splitter classes现在包括LabelKFoldLabelShuffleSplit,两者都旨在处理您考虑的情况,即具有相同pid的元素应位于同一测试部分中。< / p>

嵌套交叉验证

交叉验证迭代器API已经过重新设计,可以更好地支持嵌套交叉验证。您不再需要将数据相关参数传递给交叉验证策略构造函数。因此,将GridSearchCV嵌套在GridSearchCV中,每个cv都有自己的GROSSEARNINGS参数,可以满足您的需求。

请注意,此API仍然非常新鲜,可以随时更改。