Scikit-learn cross val得分:数组的索引太多了

问题描述 投票:23回答:5

我有以下代码

 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]])
python pandas scikit-learn
5个回答
36
投票

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

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

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


14
投票

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

labels = train['Y']

2
投票

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


0
投票

尝试目标:

y=df['Survived'] 

相反,我用过

y=df[['Survived']] 

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


0
投票

您可能需要稍微使用尺寸,例如

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是维度。

© www.soinside.com 2019 - 2024. All rights reserved.