我有一个因变量,,由比率/百分比数据组成,因此每个值都介于和. 我被 xgboost 库所吸引,因为它允许专注于训练本身的特定数据子集,但我对如何对我拥有的数据执行回归感到困惑。
如果您不将可能性更改为Beta 分布或其他限制在同一范围内的东西,正常 OLS 回归将产生超出和低于 [0,1] 范围的输出,但 xgboost 会遭受同样的错误吗?
我将不胜感激有关尝试使其发挥作用的任何建议。
我有一个因变量,,由比率/百分比数据组成,因此每个值都介于和. 我被 xgboost 库所吸引,因为它允许专注于训练本身的特定数据子集,但我对如何对我拥有的数据执行回归感到困惑。
如果您不将可能性更改为Beta 分布或其他限制在同一范围内的东西,正常 OLS 回归将产生超出和低于 [0,1] 范围的输出,但 xgboost 会遭受同样的错误吗?
我将不胜感激有关尝试使其发挥作用的任何建议。
原则上:是的,您将遇到与 OLS 相同的问题。但是,由于xgboost
是基于树的(并且通过该非参数),您可能会得到相对准确的估计,这意味着低于零或高于 1 的值将很少见(至少问题应该不如 OLS 严重)。在这种情况下,您可以简单地将结果限制为. 另一种方法是做一个多类分类任务,你有 100 个类. Boosting 通常在分类任务上表现良好。
只是一个提示:xgboost
在数据处理中可能有点“沉重”。诸如此类的增强工具lightgbm
是一个不错的选择。我更lightgbm
喜欢xgboost
.
您可以使用reg:logistic
目标函数。 https://xgboost.readthedocs.io/en/latest/parameter.html#learning-task-parameters
编辑:您需要为此使用内部 API,或者将 sklearn APIXGBRegressor
与objective='reg:logistic'
(或binary:logistic
)一起使用。
不要使用XGBClassifier
,因为它会对目标进行标签编码!
我同意所有这些答案,这是一个回归案例。如果您能够将目标值拆分为多个类,则可以将其转换为分类案例。
但我也会尝试以这种方式转换目标值:
old_target = function(new_target)
new_target = inverse_function(old_target)
例如,softmax 看起来很有希望。它将为您提供另一个目标值范围:
(-inf, inf)
然后,您在这个转换后的目标上训练 XGBRegressor。
通常,function() 的类型取决于目标值分布。