Как решить IndexError: слишком много индексов для массива

Мой код ниже дает мне следующую ошибку «IndexError: слишком много индексов для массива». Я совершенно новичок в машинном обучении, поэтому я понятия не имею, как это решить. Любая помощь будет оценена по достоинству.

train = pandas.read_csv("D:/...input/train.csv")


xTrain = train.iloc[:,0:54]
yTrain = train.iloc[:,54:]


from sklearn.cross_validation import cross_val_score
clf = LogisticRegression(multi_class='multinomial')
scores = cross_val_score(clf, xTrain, yTrain, cv=10, scoring='accuracy')
print('****Results****')
print(scores.mean())

person Sujoy De    schedule 31.10.2016    source источник
comment
Вы уверены, что train выглядит так, как вы думаете?   -  person DavidG    schedule 31.10.2016
comment
@DavidG train.shape дает мне 15120 x 55. 55 столбцов - это то, что я ожидаю   -  person Sujoy De    schedule 31.10.2016
comment
Вы получаете ошибку с частью yTrain или xTrain?   -  person DavidG    schedule 01.11.2016
comment
@DavidG спасибо. Я смог решить эту проблему, указав yTrain = train.target вместо yTrain = train.iloc[:,54:]   -  person Sujoy De    schedule 02.11.2016


Ответы (4)


Код ошибки, который вы получаете, в основном говорит о том, что вы объявили содержимое своего массива, которое ему не соответствует. Я не вижу объявление вашего массива, но я предполагаю, что он одномерный, и программа возражает против того, чтобы вы относились к нему как к двумерному.

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

На эту тему уже есть несколько существующих вопросов, поэтому я просто свяжу один, который может быть здесь полезен: IndexError: слишком много индексов. Массив Numpy с 1 строкой и 2 столбцами

person LJ Codes    schedule 31.10.2016
comment
Я понял в чем проблема. Количество столбцов где-то не совпадает, но train.shape дает мне 15120 x 55. 55 столбцов - это то, что я ожидаю. - person Sujoy De; 31.10.2016

Пошаговое объяснение кода ML (машинного обучения) с Pandas Dataframe:

  1. Разделение столбцов Predictor и Target на X и y соответственно.

  2. Разделение данных обучения (X_train, y_train) и данных тестирования (X_test, y_test).

  3. Расчет перекрестной проверки AUC (площадь под кривой). Получил ошибку «IndexError: слишком много индексов для массива» из-за y_train, так как ожидался одномерный массив, но получен двухмерный массив, который является несоответствием. После замены кода 'y_train' на код y_train['y'] заработал как Charm.


   # Importing Packages :

   import pandas as pd

   from sklearn.model_selection import cross_val_score

   from sklearn.model_selection import StratifiedShuffleSplit

   # Seperating Predictor and Target Columns into X and y Respectively :
   # df -> Dataframe extracted from CSV File

   data_X = df.drop(['y'], axis=1) 
   data_y = pd.DataFrame(df['y'])

   # Making a Stratified Shuffle Split of Train and Test Data (test_size=0.3 Denotes 30 % Test Data and Remaining 70% Train Data) :

   rs = StratifiedShuffleSplit(n_splits=2, test_size=0.3,random_state=2)       
   rs.get_n_splits(data_X,data_y)

   for train_index, test_index in rs.split(data_X,data_y):

       # Splitting Training and Testing Data based on Index Values :

       X_train,X_test = data_X.iloc[train_index], data_X.iloc[test_index]
       y_train,y_test = data_y.iloc[train_index], data_y.iloc[test_index]

       # Calculating 5-Fold Cross-Validated AUC (cv=5) - Error occurs due to Dimension of **y_train** in this Line :

       classify_cross_val_score = cross_val_score(classify, X_train, y_train, cv=5, scoring='roc_auc').mean()

       print("Classify_Cross_Val_Score ",classify_cross_val_score) # Error at Previous Line.

       # Worked after Replacing 'y_train' with y_train['y'] in above Line 
       # where y is the ONLY Column (or) Series Present in the Pandas Data frame 
       # (i.e) Target variable for Prediction :

       classify_cross_val_score = cross_val_score(classify, X_train, y_train['y'], cv=5, scoring='roc_auc').mean()

       print("Classify_Cross_Val_Score ",classify_cross_val_score)

       print(y_train.shape)

       print(y_train['y'].shape)

Выход :

    Classify_Cross_Val_Score  0.7021433588790991
    (31647, 1) # 2-D
    (31647,)   # 1-D

Примечание. из sklearn.model_selection импортируйте cross_val_score. cross_val_score был импортирован из sklearn.model_selection, а НЕ из sklearn.cross_validation, который устарел.

person Vetrivel PS    schedule 21.12.2018
comment
Привет @MatthewStrawbridge, спасибо, что упомянули, что я отредактировал свой ответ. Надеюсь, это понятно и полезно для тех, кто сталкивается с той же ошибкой при построении моделей ML в Python с использованием Pandas Dataframe и перекрестной проверки набора данных :-) - person Vetrivel PS; 22.12.2018

Вы получаете эту ошибку, потому что вы делаете целевой массив 'y' двумерным, который на самом деле должен быть одномерным для прохождения функции перекрестной проверки.

Эти два случая отличаются:

1. y=numpy.zeros(shape=(len(list),1))
2. y=numpy.zeros(shape=(len(list))) 

Если вы объявите y как случай 1, тогда y станет двумерным. Но вам нужен одномерный массив, следовательно, вариант использования 2.

person TechBomb    schedule 13.10.2017

При импорте набора данных и распечатке с помощью Matplotlib я мог предварительно просмотреть изображение с images[5540,:], где 5540 — это идентификатор изображения, но при печати метки для этого изображения с labels[5540,:] выдавало ошибку, например, слишком много значений индекса.

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

Решение, которое сработало для меня, было labels[5540,].

person lordvador    schedule 13.10.2019