我的数据有一个名为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
答案 0 :(得分:2)
您有两个需求,这些需求最近才在Scikit-Learn中得到解决,并且应该包含在下一个发布的版本中:
将相关样本保持在一起的交叉验证策略
新的CV splitter classes现在包括LabelKFold
和LabelShuffleSplit
,两者都旨在处理您考虑的情况,即具有相同pid
的元素应位于同一测试部分中。< / p>
嵌套交叉验证
交叉验证迭代器API已经过重新设计,可以更好地支持嵌套交叉验证。您不再需要将数据相关参数传递给交叉验证策略构造函数。因此,将GridSearchCV
嵌套在GridSearchCV
中,每个cv
都有自己的GROSSEARNINGS
参数,可以满足您的需求。
请注意,此API仍然非常新鲜,可以随时更改。