如何通过索引自定义sklearn交叉验证迭代器?

时间:2014-11-24 03:17:05

标签: python validation scikit-learn cross-validation

Custom cross validation split sklearn类似,我想为GridSearchCV定义自己的分割,我需要自定义内置的交叉验证迭代器。

我想将自己的一组列车测试索引传递给GridSearch,而不是允许迭代器为我确定它们。我浏览了sklearn文档页面上的可用cv迭代器,但找不到它。

例如,我想实现类似的东西 数据有9个样本 对于2折cv,我创建了自己的一套训练测试指数

>>> train_indices = [[1,3,5,7,9],[2,4,6,8]]
>>> test_indices = [[2,4,6,8],[1,3,5,7,9]]
                 1st fold^    2nd fold^
>>> custom_cv = sklearn.cross_validation.customcv(train_indices,test_indices)
>>> clf = GridSearchCV(X,y,params,cv=custom_cv)

什么可以像customcv一样工作?

2 个答案:

答案 0 :(得分:10)

实际上,交叉验证迭代器只是:迭代器。他们在每次迭代时都会返回一列火车/测试折叠。这应该适合你:

custom_cv = zip(train_indices, test_indices)

另外,对于您提到的具体情况,您可以

import numpy as np
labels = np.arange(0, 10) % 2
from sklearn.cross_validation import LeaveOneLabelOut
cv = LeaveOneLabelOut(labels)

观察list(cv)收益

[(array([1, 3, 5, 7, 9]), array([0, 2, 4, 6, 8])),
 (array([0, 2, 4, 6, 8]), array([1, 3, 5, 7, 9]))]

答案 1 :(得分:0)

实际上,上述解决方案将每一行返回为真正需要的折叠:

let arr = [1, 1, 3, 1, 2, 2, 4]
let result = Dictionary(grouping: arr, by: { $0 }).filter({ $0.1.count > 1 }).flatMap({ $0.value })

print(result) //[2, 2, 1, 1, 1]