我的数据有一个名为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包括LabelKFold
和LabelShuffleSplit
都旨在处理您考虑具有相同pid
的元素应位于同一测试部分的情况。
嵌套交叉验证
对交叉验证迭代器API进行了重新设计,以更好地支持嵌套的交叉验证。您不再需要将依赖于数据的参数传递给交叉验证策略构造函数。因此,将GridSearchCV
嵌套在GridSearchCV
内,每个都有自己的cv
参数,应该可以满足您的需求。
请注意,此API仍然非常新鲜,可以更改。
关于python - 嵌套交叉验证与自定义折叠,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36825800/