【问题标题】:Scikit-learn cross val score: too many indices for arrayScikit-learn 交叉验证分数:数组索引过多
【发布时间】:2015-11-06 19:56:40
【问题描述】:

我有以下代码

 from sklearn.ensemble import ExtraTreesClassifier
 from sklearn.cross_validation import cross_val_score
 #split the dataset for train and test
 combnum['is_train'] = np.random.uniform(0, 1, len(combnum)) <= .75
 train, test = combnum[combnum['is_train']==True], combnum[combnum['is_train']==False]

 et = ExtraTreesClassifier(n_estimators=200, max_depth=None, min_samples_split=10, random_state=0)
 min_samples_split=10, random_state=0  )

 labels = train[list(label_columns)].values
 tlabels = test[list(label_columns)].values

 features = train[list(columns)].values
 tfeatures = test[list(columns)].values

 et_score = cross_val_score(et, features, labels, n_jobs=-1)
 print("{0} -> ET: {1})".format(label_columns, et_score))

检查数组的形状:

 features.shape
 Out[19]:(43069, 34)

labels.shape
Out[20]:(43069, 1)

我得到了:

IndexError: too many indices for array

以及追溯的相关部分:

---> 22 et_score = cross_val_score(et, features, labels, n_jobs=-1)

我正在从 Pandas 数据框创建数据,我在这里搜索并看到一些通过这种方法可能出现的错误的参考,但不知道如何纠正? 数据数组的样子: 特点

Out[21]:
array([[ 0.,  1.,  1., ...,  0.,  0.,  1.],
   [ 0.,  1.,  1., ...,  0.,  0.,  1.],
   [ 1.,  1.,  1., ...,  0.,  0.,  1.],
   ..., 
   [ 0.,  0.,  1., ...,  0.,  0.,  1.],
   [ 0.,  0.,  1., ...,  0.,  0.,  1.],
   [ 0.,  0.,  1., ...,  0.,  0.,  1.]])

标签

Out[22]:
array([[1],
   [1],
   [1],
   ..., 
   [1],
   [1],
   [1]])

【问题讨论】:

  • 请发布完整的回溯。你在哪个版本的 scikit-learn 上?你可以尝试通过labels.ravel() 来代替吗?
  • labels.ravel() 做到了!只是在阅读另一个错误,这表明使用不同的代码,我在 Scikit learn 17 dev0
  • @AndreasMueller 非常感谢您的快速回复!如果你能做出回答,可能会帮助其他一些人..
  • 我不认为这是一个好的错误。你能在问题跟踪器中打开一个问题吗?
  • MMM 我应该将错误发布到哪里? Pandas 还是 scikit-learn?

标签: python pandas scikit-learn


【解决方案1】:

您可能需要稍微调整一下尺寸,例如

et_score = cross_val_score(et, features, labels, n_jobs=-1)[:,n]

 et_score = cross_val_score(et, features, labels, n_jobs=-1)[n,:]

n 是维度。

【讨论】:

    【解决方案2】:

    尝试目标:

    y=df['Survived'] 
    

    相反,我使用了

    y=df[['Survived']] 
    

    这使目标 y 成为日期框架,看起来系列就可以了

    【讨论】:

      【解决方案3】:

      .ravel() 添加到传递给公式的 Y/Labels 变量也有助于在 KNN 中解决此问题。

      【讨论】:

        【解决方案4】:

        当我们在 scikit-learn 中进行交叉验证时,该过程需要 (R,) 形状标签而不是 (R,1)。尽管它们在某种程度上是相同的东西,但它们的索引机制是不同的。所以在你的情况下,只需添加:

        c, r = labels.shape
        labels = labels.reshape(c,)
        

        在将其传递给交叉验证函数之前。

        【讨论】:

          【解决方案5】:

          如果您将目标标签指定为 Pandas 的单个数据列,这似乎是可以修复的。如果目标有多个列,我会收到类似的错误。例如尝试:

          labels = train['Y']
          

          【讨论】:

          • 这个答案更简单直接。谢谢。
          猜你喜欢
          • 1970-01-01
          • 2018-04-02
          • 2016-02-11
          • 2017-06-23
          • 2016-04-25
          • 2017-06-12
          • 2017-09-02
          • 2015-12-11
          • 2018-10-15
          相关资源
          最近更新 更多