Sklearn Kfold получает однократное сложение вместо цикла

После использования 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:

Я хотел бы получить доступ к первой раз в kf, как это (вместо цикла):

train_index, test_index in kf[0]

Это должно возвращать только первую сгиб, но вместо этого я получаю ошибку: "TypeError: объект" KFold "не поддерживает индексирование"

Что я хочу в качестве вывода:

>>> train_index, test_index in kf[0]
>>> print("TRAIN:", train_index, "TEST:", test_index)
TRAIN: [2 3] TEST: [0 1]

Ссылка: http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.KFold.html

Вопрос

Как получить индексы для тренировки и теста только для одной складки, не пройдя весь цикл цикла?

Ответ 1

Ты на правильном пути. Все, что вам нужно сделать сейчас, это:

kf = cross_validation.KFold(4, n_folds=2)
mylist = list(kf)
train, test = mylist[0]

kf самом деле kf - это генератор, который не вычисляет разбивку тест-поезд, пока он не понадобится. Это улучшает использование памяти, так как вы не храните ненужные предметы. Создание списка объекта KFold заставляет его сделать доступными все значения.

Вот два великих вопроса SO, которые объясняют, что такое генераторы: один и два


Редактировать ноябрь 2018

API изменился с тех пор, как sklearn 0.20. Обновленный пример (для 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])

Ответ 2

# We saved all the K Fold samples in different list  then we access to this throught [i]
from sklearn.model_selection import KFold
import numpy as np
import pandas as pd

kf = KFold(n_splits=4)

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

Y = np.array([0,0,0,1])
Y=Y.reshape(4,1)

X=pd.DataFrame(X)
Y=pd.DataFrame(Y)


X_train_base=[]
X_test_base=[]
Y_train_base=[]
Y_test_base=[]

for train_index, test_index in kf.split(X):

    X_train, X_test = X.iloc[train_index,:], X.iloc[test_index,:]
    Y_train, Y_test = Y.iloc[train_index,:], Y.iloc[test_index,:]
    X_train_base.append(X_train)
    X_test_base.append(X_test)
    Y_train_base.append(Y_train)
    Y_test_base.append(Y_test)

print(X_train_base[0])
print(Y_train_base[0])
print(X_train_base[1])
print(Y_train_base[1])