【问题标题】:How to customize sklearn cross validation iterator by indices?如何通过索引自定义 sklearn 交叉验证迭代器?
【发布时间】: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 中。我会尝试你在答案中给出的方法

标签: python validation scikit-learn cross-validation


【解决方案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

【讨论】:

    猜你喜欢
    • 2014-07-27
    • 2012-12-31
    • 2019-06-01
    • 2019-06-11
    • 2018-08-16
    • 1970-01-01
    • 2019-10-22
    • 2013-12-18
    相关资源
    最近更新 更多