当期望一维数组时,传递了列向量y


117

我需要适应RandomForestRegressorsklearn.ensemble

forest = ensemble.RandomForestRegressor(**RF_tuned_parameters)
model = forest.fit(train_fold, train_y)
yhat = model.predict(test_fold)

该代码始终有效,直到我对数据进行了一些预处理(train_y)。错误消息显示:

DataConversionWarning:当期望1d数组时,传递了列向量y。请将y的形状更改为(n_samples,),例如使用ravel()。

模型= forest.fit(train_fold,train_y)

以前train_y是一个Series,现在是numpy数组(它是列向量)。如果我应用train_y.ravel(),则它成为行向量,并且没有错误消息出现,通过预测步骤需要很长时间(实际上,它永远不会完成...)。

RandomForestRegressor我发现的文档中,train_y应将其定义为“ y : array-like, shape = [n_samples] or [n_samples, n_outputs] 如何解决此问题的想法?”。


什么是train_fold.shapetrain_y.shape
亚历山大

@Alexander:train_fold:元组(749904,24)... train:y.ravel():元组(749904,)
Klausos Klausos

看起来不错 您是否尝试过训练100行数据以确保其正常工作(因为您说过从未完成过)?另外,您是否检查过train_y数据的内容以确保预处理不会破坏数据?
亚历山大

RF_tuned_parameters请为我们打印。
Imanol Luengo 2015年

@imaluengo:{'n_estimators':40,'max_features':0.8,'n_jobs':2,'verbose':true,'min_samples_split':6,'random_state':123}
Klausos Klausos

Answers:


188

更改此行:

model = forest.fit(train_fold, train_y)

至:

model = forest.fit(train_fold, train_y.values.ravel())

编辑:

.values将给出数组中的值。(形状:[n,1)

.ravel 会将数组形状转换为(n,)


33
有人可能会解释它实际发生的变化。
拉胡尔(Bahul Bali)

2
AttributeError:“ numpy.ndarray”对象没有属性“ values”
john ktejik

12
如果您有numpy.ndarray,请改用train_y.ravel()。
Charles Leschinski '17

13
@RahulParashar的ravel()作用是:使用时y.shape == (10, 1),使用y.ravel().shape == (10, )。换句话说,它使数组变平。
PascalVKooten '18年

这甚至是个有用的警告吗?
亚历克斯

18

当我尝试训练KNN分类器时,我也遇到了这种情况。但似乎在警告不见了,我改变之后:
knn.fit(X_train,y_train)

knn.fit(X_train, np.ravel(y_train,order='C'))

在这行之前,我用过import numpy as np


使用此.ravel()方法时,我的列向量被转换为行向量而不是数组,但是此修复程序对我有用。
kabdulla


10

使用以下代码:

model = forest.fit(train_fold, train_y.ravel())

如果仍然像下面一样错误地打耳光?

Unknown label type: %r" % y

使用此代码:

y = train_y.ravel()
train_y = np.array(y).astype(int)
model = forest.fit(train_fold, train_y)

3

另一种方法是使用 ravel

model = forest.fit(train_fold, train_y.values.reshape(-1,))

我想补充一点,这将适用于Pandas系列,但不适用于Pandas DataFrames。
Sal Alturaigi,

2

使用neuraxle,您可以轻松解决此问题:

p = Pipeline([
   # expected outputs shape: (n, 1)
   OutputTransformerWrapper(NumpyRavel()), 
   # expected outputs shape: (n, )
   RandomForestRegressor(**RF_tuned_parameters)
])

p, outputs = p.fit_transform(data_inputs, expected_outputs)

Neuraxle是类似于sklearn的框架,用于深度学习项目中的超参数调整和AutoML!


1
format_train_y=[]
for n in train_y:
    format_train_y.append(n[0])

2
尽管这段代码可以解决问题,但包括解释如何以及为什么解决该问题的说明,确实可以帮助提高您的帖子质量,并可能导致更多的投票。请记住,您将来会为读者回答问题,而不仅仅是现在问的人。请编辑您的答案以添加说明,并指出适用的限制和假设。
Dharman

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.