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

Posted

技术标签:

【中文标题】如何通过索引自定义 sklearn 交叉验证迭代器?【英文标题】:How to customize sklearn cross validation iterator by indices? 【发布时间】:2015-01-21 17:19:51 【问题描述】:

类似于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一样工作?

【问题讨论】:

您能补充一个问题吗?另外我不知道sklearn.cross_validation 中存在customcv,所以你可能不应该放它。您确定 LeaveOneLabelOut 在您的情况下不起作用吗? 我以 customcv 为例说明我想要实现的功能......它不在 sklearn 中。我会尝试你在答案中给出的方法 【参考方案1】:

实际上,交叉验证迭代器就是:迭代器。他们在每次迭代中返回一个训练/测试折叠元组。这应该对你有用:

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]))]

【讨论】:

修正:这是 scikit-learn 0.18 之前的版本。 cross_validation 模块功能现在在 model_selection 中,交叉验证拆分器现在是需要明确要求使用方法 split 拆分数据的类。这是为了让嵌套交叉验证更容易。【参考方案2】:

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

    [(train_indices, test_indices)] # for one fold

    [(train_indices, test_indices), # 1stfold
    (train_indices, test_indices)] # 2nd fold etc

【讨论】:

以上是关于如何通过索引自定义 sklearn 交叉验证迭代器?的主要内容,如果未能解决你的问题,请参考以下文章

sklearn:用户定义的时间序列数据交叉验证

sklearn 交叉验证中的自定义评分功能

在 sklearn 中运行 10 倍交叉验证后如何运行 SVC 分类器?

python基于sklearn编程实现交叉验证的ROC曲线绘制自定义AUC的有效小数位数(sklearn中RocCurveDisplay函数的默认有效位数为2位且不可以修改)

如何使用 Sklearn 管道进行参数调整/交叉验证?

如何在 python 的 sklearn 中使用交叉验证执行 SMOTE