Ошибка в scikit.learn cross_val_score
Пожалуйста, обратитесь к ноутбуку по следующему адресу
эта часть кода,
scores = cross_val_score(LogisticRegression(), X, y, scoring='accuracy', cv=10)
print scores
print scores.mean()
генерирует следующую ошибку в Windows 7 64-битной машине
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-37-4a10affe67c7> in <module>()
1 # evaluate the model using 10-fold cross-validation
----> 2 scores = cross_val_score(LogisticRegression(), X, y, scoring='accuracy', cv=10)
3 print scores
4 print scores.mean()
C:\Python27\lib\site-packages\sklearn\cross_validation.pyc in cross_val_score(estimator, X, y, scoring, cv, n_jobs, verbose, fit_params, score_func, pre_dispatch)
1140 allow_nans=True, allow_nd=True)
1141
-> 1142 cv = _check_cv(cv, X, y, classifier=is_classifier(estimator))
1143 scorer = check_scoring(estimator, score_func=score_func, scoring=scoring)
1144 # We clone the estimator to make sure that all the folds are
C:\Python27\lib\site-packages\sklearn\cross_validation.pyc in _check_cv(cv, X, y, classifier, warn_mask)
1366 if classifier:
1367 if type_of_target(y) in ['binary', 'multiclass']:
-> 1368 cv = StratifiedKFold(y, cv, indices=needs_indices)
1369 else:
1370 cv = KFold(_num_samples(y), cv, indices=needs_indices)
C:\Python27\lib\site-packages\sklearn\cross_validation.pyc in __init__(self, y, n_folds, indices, shuffle, random_state)
428 for test_fold_idx, per_label_splits in enumerate(zip(*per_label_cvs)):
429 for label, (_, test_split) in zip(unique_labels, per_label_splits):
--> 430 label_test_folds = test_folds[y == label]
431 # the test split can be too big because we used
432 # KFold(max(c, self.n_folds), self.n_folds) instead of
IndexError: too many indices for array
Я использую scikit.learn 0.15.2, здесь предлагается, что может быть специфическая проблема для Windows 7, 64-битной машины.
============== обновление ==============
Я нашел следующий код на самом деле работает
from sklearn.cross_validation import KFold
cv = KFold(X.shape[0], 10, shuffle=True, random_state=33)
scores = cross_val_score(LogisticRegression(), X, y, scoring='accuracy', cv=cv)
print scores
============== обновление 2=============
кажется, из-за какого-то обновления пакета, я больше не могу воспроизвести такую ошибку на моей машине. Если вы столкнулись с той же проблемой на Windows 7 64-битной машине, пожалуйста, дайте мне знать.
1 ответ
У меня была та же ошибка, что и у вас, и я искал ответы, когда нашел этот вопрос.
Я использовал тот же sklearn.cross_validation.cross_val_score (кроме другого алгоритма) и ту же машину Windows 7, 64 бит.
Я попробовал ваше решение сверху, и оно "сработало", но дало мне следующее предупреждение:
C: \ Users \ E245713 \ AppData \ Local \ Continuum \ Anaconda3 \ lib \ site-packages \ sklearn \ cross_validation.py: 1531: DataConversionWarning: вектор-столбец y был передан, когда ожидался массив 1d. Пожалуйста, измените форму y на (n_samples,), например, используя ravel(). estimator.fit(X_train, y_train, **fit_params)
Прочитав предупреждение, я понял, что проблема связана с формой 'y' (столбец моей метки). Ключевое слово, которое нужно попробовать из предупреждения - "ravel()". Итак, я попробовал следующее:
y_arr = pd.DataFrame.as_matrix(label)
print(y_arr)
print(y_arr.shape())
который дал мне
[[1]
[0]
[1]
..,
[0]
[0]
[1]]
(87939, 1)
Когда я добавил 'ravel()':
y_arr = pd.DataFrame.as_matrix(label).ravel()
print(y_arr)
print(y_arr.shape())
это дало мне:
[1 0 1 ..., 0 0 1]
(87939,)
Размерность y_arr должна быть в форме (87939,), а не (87939,1). После этого мой оригинальный cross_val_score работал без добавления кода Kfold.
Надеюсь это поможет.
Я знаю, что ответ поздно.
Но этот ответ может помочь другим людям, борющимся с той же ошибкой. У меня та же проблема с питоном 3.6. При переходе с 3.6 на 3.5 я могу использовать эту функцию.
Ниже приведен пример, который я запустил:
accuracies = cross_val_score(estimator = classifier, X = X_train, y = y_train, cv = 10, n_jobs = -1)
Сначала создайте conda env с 3.5 версией.
conda create -n py35 python=3.5
source activate py35
Надеюсь, что это должно помочь двигаться вперед
Импортируйте этот модуль, и он должен работать:
from sklearn.model_selection import cross_val_score