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


内部层通过对火车数据进行交叉估值来建立内部预测向量
然后,我在原始火车数据+内部预测矢量的基础上建立外部模型
然后,我根据测试数据评估性能


X5应重复此过程。

我能想到的最好的方法是在外部层中用pid % 25分开,在内部层中用pid % 5分开。

代码繁琐,不是很Python。有更好的方法吗?我是否错过了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

最佳答案

Scikit-Learn最近满足了两个需求,这些需求应该包含在下一个发行版本中:

相关样本相互交叉验证的策略

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

嵌套交叉验证

对交叉验证迭代器API进行了重新设计,以更好地支持嵌套的交叉验证。您不再需要将依赖于数据的参数传递给交叉验证策略构造函数。因此,将GridSearchCV嵌套在GridSearchCV内,每个都有自己的cv参数,应该可以满足您的需求。

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

关于python - 嵌套交叉验证与自定义折叠,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36825800/

10-12 19:55