#python #arrays #pandas #scikit-learn #cross-validation
#python #массивы #pandas #scikit-learn #перекрестная проверка
Вопрос:
Я пытаюсь использовать Kfold
перекрестную проверку для своей модели, но при этом получаю эту ошибку. Я знаю, что KFold
принимает только одномерные массивы, но даже после преобразования входных данных длины в массив это создает мне эту проблему.
from sklearn.ensemble import ExtraTreesClassifier, RandomForestClassifier
from sklearn.cross_validation import train_test_split
from sklearn.cross_validation import KFold
if __name__ == "__main__":
np.random.seed(1335)
verbose = True
shuffle = False
n_folds = 5
y = np.array(y)
if shuffle:
idx = np.random.permutation(y.size)
X_train = X_train[idx]
y = y[idx]
skf = KFold(y, n_folds)
models = [RandomForestClassifier(n_estimators=100, n_jobs=-1, criterion='gini'),ExtraTreesClassifier(n_estimators=100, n_jobs=-1, criterion='entropy')]
print("Stacking in progress")
A = []
for j, clf in enumerate(models):
print(j, clf)
for i, (itrain, itest) in enumerate(skf):
print("Fold :", i)
x_train = X_train[itrain]
x_test = X_train[itest]
y_train = y[itrain]
y_test = y[itest]
print(x_train.shape, x_test.shape)
print(len(x_train), len(x_test))
clf.fit(x_train, y_train)
pred = clf.predict_proba(x_test)
A.append(pred)
Я получаю ошибку для строки « skf = KFold(y, n_folds)
«. Любая помощь в этом будет оценена.
Комментарии:
1. Как это
y
определяется? Кроме того, ваш пример должен быть минимальным: действительно ли полезно включать 4 классификатора?2. y определяется как целевая переменная обучающего набора. Нет, я не буду его редактировать.
3. Так что больше нет необходимости в моделях, а также в цикле j 🙂 простой пример нам легче понять и позволяет быстрее обнаружить ошибку. Смотрите мой ответ об использовании KFold .
Ответ №1:
Из своего документа KFold()
не ожидает y
в качестве входных данных, а только количество разделений (n_folds).
После того, как у вас есть экземпляр KFold
, вы делаете myKfold.split(x)
( x
все ваши входные данные), чтобы получить итератор, выдающий обучающие и тестовые индексы. Пример копии вставлен из sklearn doc:
>>> from sklearn.model_selection import KFold
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
>>> y = np.array([1, 2, 3, 4])
>>> kf = KFold(n_splits=2)
>>> kf.get_n_splits(X)
2
>>> print(kf)
KFold(n_splits=2, random_state=None, shuffle=False)
>>> for train_index, test_index in kf.split(X):
... print("TRAIN:", train_index, "TEST:", test_index)
... X_train, X_test = X[train_index], X[test_index]
... y_train, y_test = y[train_index], y[test_index]
TRAIN: [2 3] TEST: [0 1]
TRAIN: [0 1] TEST: [2 3]