Ошибка в scikit.learn cross_val_score

пожалуйста, обратитесь к блокноту по следующему адресу

Логистическая регрессия

эта часть кода,

scores = cross_val_score(LogisticRegression(), X, y, scoring='accuracy', cv=10)
print scores
print scores.mean()

генерирует следующую ошибку на 64-битной машине Windows 7

---------------------------------------------------------------------------
 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==============

кажется, из-за какого-то обновления пакета я больше не могу воспроизводить такую ​​​​ошибку на своей машине. Если вы столкнулись с той же проблемой на 64-битной машине с Windows 7, сообщите мне об этом.


person tesla1060    schedule 22.10.2014    source источник
comment
Какова форма y?   -  person Fred Foo    schedule 22.10.2014
comment
Единственная разница между тем, что работает, и тем, что не работает, это cv ? X.shape[0] == 6366 тоже?   -  person eickenberg    schedule 22.10.2014
comment
@eickenberg cv=10 попытается составить стратифицированное 10-кратное резюме, KFold нет.   -  person Fred Foo    schedule 22.10.2014
comment
Явное указание cv=StratifiedKFold(y, 10) было бы моим следующим шагом диагностики, если бы все остальное было равным.   -  person eickenberg    schedule 22.10.2014
comment
@larsmans, да, X.shape[0] == 6366. И cv=StratifiedKFold(y, 10) на самом деле работает нормально.   -  person tesla1060    schedule 23.10.2014
comment
это единственное изменение, которое вы сделали? потому что, если это сработает, то и cv=number тоже должно (см. комментарий @larsmans)   -  person eickenberg    schedule 23.10.2014
comment
@eickenberg, да, это единственное изменение   -  person tesla1060    schedule 23.10.2014
comment
как вы видите в строке 1368 предпоследнего блока трассировки, он фактически пытается создать для вас StratifiedKFold по умолчанию. Единственный параметр, который может отличаться, это, возможно, indices=False. Что произойдет, если вы установите cv=StratifiedKFold(y, 10, indices=False)? (Хотя я не уверен, почему это было бы установлено именно так)   -  person eickenberg    schedule 23.10.2014
comment
@eickenberg Я не уверен, что я сделал со своей машиной, я установил или обновил определенный пакет Python. но теперь исходный код в блокноте действительно работает. Благодарю.   -  person tesla1060    schedule 24.10.2014


Ответы (3)


У меня была та же ошибка, что и у вас, и я искал ответы, когда нашел этот вопрос.

Я использовал тот же 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.

Надеюсь это поможет.

person wi3o    schedule 20.07.2016

Я знаю, что ответ запоздал.
Но этот ответ может помочь другим людям, которые борются с той же ошибкой. У меня такая же проблема с python 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  

Надеюсь, это должно помочь двигаться вперед

person Aman    schedule 22.01.2019

Импортируйте этот модуль, и он должен работать:

from sklearn.model_selection import cross_val_score
person DINESH SHARMA    schedule 03.09.2020
comment
Сообщение об ошибке показывает, что это не ошибка, так как он может обрабатывать метод, но не предоставленный в нем массив. - person Kim Tang; 03.09.2020