【问题标题】:当需要一维数组时,传递了列向量 y
【发布时间】:2016-03-13 22:53:56
【问题描述】:

我需要从sklearn.ensemble 适应RandomForestRegressor

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

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

DataConversionWarning:当需要一维数组时,传递了列向量 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] 知道如何解决这个问题吗?

【问题讨论】:

  • train_fold.shapetrain_y.shape 是什么?
  • @Alexander: train_fold: tuple (749904,24)... train:y.ravel(): tuple (749904,)
  • 看起来不错。您是否尝试过训练 100 行数据以确保其正常工作(因为您说它从未完成)?此外,您是否检查了 train_y 数据的内容以确保预处理没有损坏它?
  • 请为我们打印RF_tuned_parameters
  • @imaluengo: {'n_estimators': 40, 'max_features': 0.8, 'n_jobs': 2, 'verbose': True, 'min_samples_split': 6, 'random_state': 123}跨度>

标签: python pandas numpy scikit-learn


【解决方案1】:

改变这一行:

model = forest.fit(train_fold, train_y)

到:

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

解释:

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

.ravel 会将该数组形状转换为 (n, )(即展平它)

【讨论】:

  • 有人可能会解释它的实际变化。
  • AttributeError: 'numpy.ndarray' 对象没有属性 'values'
  • 如果你有一个 numpy.ndarray,然后使用 train_y.ravel() 代替。
  • @RahulParasha ravel() 所做的是:当您拥有y.shape == (10, 1) 时,使用y.ravel().shape == (10, )。换句话说...它使数组变平。
  • 这是一个有用的警告吗?
【解决方案2】:
Y = y.values[:,0]

Y - formated_train_y

y - train_y

【讨论】:

  • 请添加几行来解释您的答案,仅发布代码对任何读者都没有任何好处。谢谢。
【解决方案3】:
format_train_y=[]
for n in train_y:
    format_train_y.append(n[0])

【讨论】:

  • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
  • 成功了。谢谢
【解决方案4】:

有了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!

【讨论】:

    【解决方案5】:

    我遇到了同样的问题。问题是标签是列格式,而它期望它是连续的。 使用np.ravel()

    knn.score(training_set, np.ravel(training_labels))
    

    希望这能解决它。

    【讨论】:

    • 你的意思是np.ravel()
    【解决方案6】:

    另一种方法是使用ravel

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

    【讨论】:

    • 我想补充一点,这适用于 Pandas 系列,但不适用于 Pandas DataFrames。
    【解决方案7】:

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

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

    在这条线之前我使用了import numpy as np

    【讨论】:

    • 当使用 .ravel() 方法时,我的列向量被转换为行向量而不是数组,但这个修复对我有用。
    【解决方案8】:

    使用下面的代码:

    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)
    

    【讨论】:

    • 这对我有用,不知道后台工作。不过,我觉得我可以探索它是什么。
    猜你喜欢
    • 2017-07-31
    • 2020-02-07
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多