是否可以通过 xgboost 训练具有多个连续输出(多重回归)的模型? 训练这样一个模型的目标是什么?
提前感谢您的任何建议
我的建议是使用 sklearn.multioutput.MultiOutputRegressor 作为
xgb.XGBRegressor
的包装器。 MultiOutputRegressor
为每个目标训练一个回归器,只需要回归器实现 fit
和 predict
,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)。
但是,此方法没有利用目标之间的任何可能关系。但是你可以尝试设计一个自定义目标函数来实现它。
多输出回归现在在 XGBoost 的夜间构建中可用,并将包含在 XGBoost 1.6.0.
有关示例,请参见https://github.com/dmlc/xgboost/blob/master/demo/guide-python/multioutput_regression.py。
它生成警告:
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]
我会发表评论,但我缺乏声誉。除了@Jesse Anderson,要安装最新版本,请从此处选择顶部链接: https://s3-us-west-2.amazonaws.com/xgboost-nightly-builds/list.html?prefix=master/
确保为您的操作系统选择一个。
使用 pip install 安装轮子。 IE。对于 macOS:
pip install https://s3-us-west-2.amazonaws.com/xgboost-nightly-builds/master/xgboost-1.6.0.dev0%2B4d81c741e91c7660648f02d77b61ede33cef8c8d-py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.macosx_12_0_x86_64.whl
您可以使用 Scikit-learn 中的线性回归、随机森林回归和其他一些相关算法来产生多输出回归。不确定 XGboost。 Scikit 中的增强回归器不允许多个输出。对于提出问题的人,当可能有必要时,一个例子是预测时间序列的多步。
基于上述讨论,我将单变量 XGBoostLSS 扩展到称为 多目标 XGBoostLSS 回归 的多变量框架,该框架在概率回归设置中对多个目标及其依赖项进行建模。代码很快就会出现。