如何解决" IndexError:数组"

时间:2016-10-31 11:44:30

标签: python arrays machine-learning indices data-science

下面的代码给出了以下错误" 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())

4 个答案:

答案 0 :(得分:5)

使用熊猫数据框的ML代码的逐步说明:

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

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

  3. 计算交叉验证的AUC(曲线下的面积)。由于 y_train 而导致错误“ IndexError:数组的索引过多”,因为它期望的是一维数组,但获取的二维数组不匹配。在替换后,将代码'y_train'替换为 y_train ['y'] ,代码就像吊饰一样


   # 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。

答案 1 :(得分:2)

您获得的错误代码基本上是说您已宣布适合您阵列的内容。 我无法看到你的数组的声明,但我假设它是一维的,程序反对你像二维一样对待它。

只需检查您的声明是否正确,并且在您设置它们以仔细检查它们是您想要的值之后打印值来测试代码。

关于这个问题已经存在一些问题,所以我只想链接一个可能对此有帮助的问题: IndexError: too many indices. Numpy Array with 1 row and 2 columns

答案 2 :(得分:2)

您收到此错误是因为您正在制作目标数组'y'2-D,实际上需要1-D传递交叉验证功能。

这两种情况不同:

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

如果你宣布y喜欢案例1那么y就变成了2-D。但是你需要一个一维数组,因此,用例2。

答案 3 :(得分:0)

在导入数据集并使用Matplotlib打印时,我可以使用images[5540,:]预览图像,其中5540是图像的ID,但是当使用labels[5540,:]打印该图像的标签时,则会引发错误,例如索引值过多。

我发现标签只是1D数组,而我尝试打印的是2D数组,因此该语句返回的索引较少,因此会引发错误。

对我有用的解决方案是labels[5540,]