【问题标题】:muti output regression in xgboostxgboost 中的多输出回归
【发布时间】:2017-01-25 04:37:15
【问题描述】:

是否可以在 Xgboost 中训练具有多个连续输出(多元回归)的模型? 训练这样一个模型的目标是什么?

提前感谢您的任何建议

【问题讨论】:

  • 如果输出多于一个值,那么就需要RNN(GRU、LSTM等)这样的序列模型。 Keras 可以帮助您快速制作此类​​模型的原型。
  • 我知道 RNN。我想知道在 Xgboost 中是否也可以这样做,因为我已经知道提升树在我的问题空间中表现良好。我还应该注意,我的输出向量大小可以固定。
  • 如果输出之间的关系是已知的,您应该能够利用它实现一个目标函数。它已经为random forest with linear relation 完成。而XGBoost作者认为it is doable
  • @uyaseen 这不是真的,只有当输出数量可变时(甚至不一定是真的)。您可以有多个输出并计算它们的总损失

标签: machine-learning random-forest xgboost


【解决方案1】:

我的建议是使用sklearn.multioutput.MultiOutputRegressor 作为xgb.XGBRegressor 的包装器。 MultiOutputRegressor 为每个目标训练一个回归器,并且只需要回归器实现 fitpredict,xgboost 恰好支持。

# get some noised linear data
X = np.random.random((1000, 10))
a = np.random.random((10, 3))
y = np.dot(X, a) + np.random.normal(0, 1e-3, (1000, 3))

# fitting
multioutputregressor = MultiOutputRegressor(xgb.XGBRegressor(objective='reg:linear')).fit(X, y)

# predicting
print np.mean((multioutputregressor.predict(X) - y)**2, axis=0)  # 0.004, 0.003, 0.005

这可能是使用 xgboost 回归多维目标的最简单方法,因为您不需要更改代码的任何其他部分(如果您最初使用的是 sklearn API)。

但是,此方法不利用目标之间的任何可能关系。但是您可以尝试设计一个customized objective 函数来实现这一点。

【讨论】:

  • 如果一些 x 有 1 个目标和一些 50 怎么办?
  • @Eran '大约 50' 是什么意思?
  • 我的意思是每个样本的输出数量不固定。
  • 你能举个例子吗?回归问题应该具有固定的输入和输出形状。否则这不是一个单一的问题,应该分开处理。
  • 这不是一个有两个输出的模型;它是两个模型的包装器。
【解决方案2】:

您可以在 Scikit-learn 中使用线性回归、随机森林回归和其他一些相关算法来生成多输出回归。不确定 XGboost。 Scikit 中的增强回归器不允许多个输出。对于提出问题的人来说,一个例子是预测一个头部的时间序列的多步。

【讨论】:

    【解决方案3】:

    它会生成警告:reg:linear is now deprecated in favor of reg:squarederror,所以我根据@ComeOnGetMe 更新了一个答案

    import numpy as np 
    import pandas as pd 
    import xgboost as xgb
    from sklearn.multioutput import MultiOutputRegressor
    
    # get some noised linear data
    X = np.random.random((1000, 10))
    a = np.random.random((10, 3))
    y = np.dot(X, a) + np.random.normal(0, 1e-3, (1000, 3))
    
    # fitting
    multioutputregressor = MultiOutputRegressor(xgb.XGBRegressor(objective='reg:squarederror')).fit(X, y)
    
    # predicting
    print(np.mean((multioutputregressor.predict(X) - y)**2, axis=0))
    

    输出:

    [2.00592697e-05 1.50084441e-05 2.01412247e-05]
    

    【讨论】:

      猜你喜欢
      • 2018-08-29
      • 2019-05-26
      • 2020-02-14
      • 1970-01-01
      • 2018-01-16
      • 2021-11-24
      • 1970-01-01
      • 2013-08-30
      • 2016-05-10
      相关资源
      最近更新 更多