sklearn Kfold访问单折而不是循环

Num*_*uis 13 python scikit-learn cross-validation

在使用cross_validation.KFold(n,n_folds = folds)之后,我想访问索引以进行单折的训练和测试,而不是遍历所有折叠.

那么我们来看一下示例代码:

from sklearn import cross_validation
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([1, 2, 3, 4])
kf = cross_validation.KFold(4, n_folds=2)

>>> print(kf)  
sklearn.cross_validation.KFold(n=4, n_folds=2, shuffle=False,
                           random_state=None)
>>> for train_index, test_index in kf:
Run Code Online (Sandbox Code Playgroud)

我想像这样访问kf中的第一个折叠(而不是for循环):

train_index, test_index in kf[0]
Run Code Online (Sandbox Code Playgroud)

这应该只返回第一个折叠,但我得到错误:"TypeError:'KFold'对象不支持索引"

我想要的输出:

>>> train_index, test_index in kf[0]
>>> print("TRAIN:", train_index, "TEST:", test_index)
TRAIN: [2 3] TEST: [0 1]
Run Code Online (Sandbox Code Playgroud)

链接:http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.KFold.html

如何检索列车和测试的索引只有一个折叠,而不通过整个for循环?

mba*_*rov 21

你走在正确的轨道上.你现在需要做的就是:

kf = cross_validation.KFold(4, n_folds=2)
mylist = list(kf)
train, test = mylist[0]
Run Code Online (Sandbox Code Playgroud)

kf实际上是一个生成器,它在需要之前不计算列车测试分裂.这样可以提高内存使用率,因为您不存储不需要的项目.制作KFold对象列表会强制它使所有值可用.

这里有两个很好的问题,解释了生成器是什么:一个两个


编辑2018年11月

自sklearn 0.20以来,API已发生变化.更新的示例(对于py3.6):

from sklearn.model_selection import KFold
import numpy as np

kf = KFold(n_splits=4)

X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])


X_train, X_test = next(kf.split(X))

In [12]: X_train
Out[12]: array([2, 3])

In [13]: X_test
Out[13]: array([0, 1])
Run Code Online (Sandbox Code Playgroud)

  • 使用```next(kf)```返回"KFold对象不是迭代器" (3认同)