【问题标题】:xgboost regression predict same valuexgboost回归预测相同的值
【发布时间】:2018-12-23 01:40:12
【问题描述】:

我是机器学习新手,xgboost我正在解决回归问题。 我的目标值非常小(例如-1.23e-12)。

我正在使用线性回归和xgboost 回归器, 但xgboost 总是预测相同的值,例如:

[1.32620335e-05 1.32620335e-05 ... 1.32620335e-05].

我尝试调整 xgboost.regressor 中的一些参数,但它也预测了相同的值。

我见过Scaling of target causes Scikit-learn SVM regression to break down ,所以我尝试将我的目标值缩放为喜欢(data.target = data.target*(10**12)) ,它解决了这个问题。但是我不确定这样缩放我的目标值是否合理,我不知道xgboost中的这个问题是否与SVR相同? .

这是我的数据的目标值:

计数 2.800010e+05 均值 -1.722068e-12 标准 6.219815e-13 最小 -4.970697e-12 25% -1.965893e-12 50% -1.490800e-12 75% -1.269998e-12 最大值 -1.111604e-12

还有我的部分代码:

X = df[feature].values y = df[target].values *(10**(12)) X_train, X_test, y_train, y_test = train_test_split(X, y) xgb = xgboost.XGBRegressor() LR = linear_model.LinearRegression() xgb.fit(X_train,y_train) LR.fit(X_train,y_train) xgb_predicted = xgb.predict(X_test) LR_predicted = LR.predict(X_test) print('xgb predicted:',xgb_predicted[0:5]) print('LR predicted:',LR_predicted[0:5]) print('ground truth:',y_test[0:5])

输出:

xgb 预测:[-1.5407631 -1.49756 -1.9647646 -2.7702322 -2.5296502] LR预测:[-1.60908805 -1.51145989 -1.71565321 -2.25043287 -1.65725868] 基本事实:[-1.6572993 -1.59879922 -2.39709641 -2.26119817 -2.01300088]

而y = df[target].values 的输出(即没有缩放目标值)

xgb 预测:[1.32620335e-05 1.32620335e-05 1.32620335e-05 1.32620335e-05 1.32620335e-05] LR预测:[-1.60908805e-12 -1.51145989e-12 -1.71565321e-12 -2.25043287e-12 -1.65725868e-12] 基本事实:[-1.65729930e-12 -1.59879922e-12 -2.39709641e-12 -2.26119817e-12 -2.01300088e-12]

【问题讨论】:

  • 您可能遇到了精度问题(因为值太小了)。缩放对于线性回归是可以的。您只是在求解 1e12*(ax+b) 而不是 ax+b。这是你的问题吗?
  • 嗨,笨蛋,是的,但是即使我没有使用 1e12*(ax+b) 缩放目标,线性回归也可以预测出比 xgboost 更合理的值。
  • 你能分享一些你的数据和代码的细节吗?
  • 好的,我刚更新

标签: python regression xgboost


【解决方案1】:

让我们尝试一些更简单的方法。我怀疑如果您尝试将 DecisionTreeRegressor (sklearn) 拟合到您的问题(不进行缩放),您可能会看到类似的行为。

此外,您的 (xgboost) 树中的节点很可能根本没有被拆分,请参阅xgb.get_booster().get_dump()

现在,试试这个:运行多个实验,缩放你的 y,使每个 y 的顺序为 1e-1,然后下一个实验缩放,使 y 的顺序为 1e-2,依此类推。您将看到决策树停止围绕某个顺序分裂。我相信它与最小杂质值有关,例如,sklearn 决策树值在这里https://github.com/scikit-learn/scikit-learn/blob/ed5e127b/sklearn/tree/tree.py#L285(大约 1e-7)

这是我目前最好的猜测。如果有人可以添加或验证这一点,那么我很乐意学习:)

【讨论】:

  • 感谢您的回答,我已经尝试了您建议的实验,并且按照您所说的执行了输出。以后我会尝试更多关于这个问题的实验
  • 当然,如果您发现不同的内容,请发布。谢谢。
猜你喜欢
  • 2020-12-02
  • 2018-09-24
  • 2021-11-27
  • 2016-02-01
  • 2021-09-01
  • 2015-07-05
  • 2016-10-29
  • 1970-01-01
相关资源
最近更新 更多