我需要从sklearn.ensemble
中适应RandomForestRegressor
。
forest = ensemble.RandomForestRegressor(**RF_tuned_parameters)
model = forest.fit(train_fold, train_y)
yhat = model.predict(test_fold)
这段代码一直有效,直到我对数据进行一些预处理(train_y
(。错误消息显示:
数据转换警告:当需要一维数组时,传递了列向量 y。请将 y 的形状更改为 (n_samples,(,例如使用 ravel((。
model = forest.fit(train_fold, train_y(
以前train_y
是一个系列,现在是numpy数组(它是一个列向量(。如果我应用 train_y.ravel()
,那么它就会变成一个行向量,并且没有出现错误消息,通过预测步骤需要很长时间(实际上它永远不会完成......
在RandomForestRegressor
的文档中,我发现train_y
应该定义为y : array-like, shape = [n_samples] or [n_samples, n_outputs]
知道如何解决这个问题吗?
更改此行:
model = forest.fit(train_fold, train_y)
自:
model = forest.fit(train_fold, train_y.values.ravel())
解释:
.values
将给出numpy
数组中的值(形状:(n,1((
.ravel
会将该数组形状转换为 (n, ((即展平它(
当我尝试训练 KNN 分类器时,我也遇到了这种情况。 但似乎在我更改后警告消失了:knn.fit(X_train,y_train)
自
knn.fit(X_train, np.ravel(y_train,order='C'))
在这一行前面,我使用了import numpy as np
.
我遇到了同样的问题。问题在于标签是列格式,而它期望它排成一行。使用np.ravel()
knn.score(training_set, np.ravel(training_labels))
希望这能解决它。
使用以下代码:
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)
Y = y.values[:,0]
Y - formated_train_y
y - train_y
另一种方法是使用ravel
model = forest.fit(train_fold, train_y.values.reshape(-1,))
使用神经轴,您可以轻松解决此问题:
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!
format_train_y=[]
for n in train_y:
format_train_y.append(n[0])
TL;DR
用
y = np.squeeze(y)
而不是
y = y.ravel()
由于 Python 的ravel()
可能是在这种特殊情况下实现预期结果的有效方法,因此我建议使用 numpy.squeeze()
.
这里的问题是,如果你的y
(numpy 数组(的形状是例如 (100, 2)
,则y.ravel()
将沿第一个轴连接第二个轴上的两个变量,得到类似 (200,)
的形状。在处理必须单独考虑的自变量时,这可能不是您想要的.
另一方面,numpy.squeeze()
只会修剪任何多余的尺寸(即尺寸为 1 的尺寸(。因此,如果您的 numpy 数组的形状是 (100, 1)
,这将导致形状(100,)
数组,而形状 (100, 2)
的 numpy 数组的结果不会改变,因为没有一个维度的大小为 1。