如何解决"IndexError: too many indices for array"错误

8
我的代码出现了如下错误:"IndexError: too many indices for array"。我刚接触机器学习,不知道该如何解决。感激任何帮助。
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())

2
你确定 train 看起来和你想象中的一样吗? - DavidG
1
@DavidG train.shape 给我的结果是 15120 x 55 。我期望有 55 列。 - Sujoy De
1
你是在yTrain还是xTrain这部分遇到了错误? - DavidG
@DavidG 谢谢。我通过将yTrain = train.target而不是yTrain = train.iloc[:,54:]解决了它。 - Sujoy De
4个回答

7

使用Pandas Dataframe逐步解释ML(机器学习)代码:

  1. 将预测器和目标列分别分离为X和y。

  2. 将训练数据(X_train,y_train)和测试数据(X_test,y_test)进行拆分。

  3. 计算交叉验证AUC(曲线下面积)。由于“y_train”预期为1-D数组,但获取了2-D数组,导致出现错误“IndexError: too many indices for array”。在用“y_train['y']”替换代码“'y_train'”后,代码“像魔法一样”正常运行。


   # 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.cross_validation中弃用,应从sklearn.model_selection导入。


1
嗨@MatthewStrawbridge,感谢提及我已编辑我的答案。希望对那些在使用Pandas Dataframe构建ML模型并交叉验证训练集时遇到相同错误的人有所帮助和清晰明了 :-) - Vetrivel PS

4
你得到的错误代码基本上是在告诉你,你已经声明了与你的数组不匹配的内容。 我看不到你的数组声明,但我假设它是一维的,程序反对你将其当作二维的处理。请确保你的声明是正确的,并且在设置值之后打印这些值来核实它们是否符合你的意图。
关于这个问题已经有一些现有的问题,这里提供一个链接,可能会有所帮助: IndexError: too many indices. Numpy Array with 1 row and 2 columns

1
我明白问题出在哪里了。某个地方列数不匹配,但 train.shape 给出的是 15120 x 55。我期望有 55 列。 - Sujoy De

3

您之所以会收到此错误,是因为您正在使目标数组“y”变成2-D,而实际上需要将其变成1-D才能通过交叉验证函数。

这两种情况是不同的:

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

如果您像第一种情况那样声明y,那么y就会变成二维数组。但是您需要一个一维数组,因此,请使用第二种情况。

0
当我使用Matplotlib导入数据集并打印时,可以使用images [5540,:] 预览图像,其中5540是图像的ID,但是当尝试使用labels[5540,:] 打印该图像的标签时,会抛出类似于太多索引值的错误。
我发现标签只是一个1D数组,而我正在尝试打印的是2D数组,因此对于这个语句返回的索引较少,所以它会抛出错误。
解决方案是labels[5540,]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接