xgboost回归预测相同的值

时间:2018-07-15 07:00:04

标签: python regression xgboost

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

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

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

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

我见过Unable to build GStreamer for Android Tutorials ,因此我尝试将目标值缩放为点赞(data.target = data.target *(10 ** 12)) ,它解决了这个问题。但是我不确定缩放目标值是否合理,并且我不知道xgboost中的这个问题与SVR是否相同?

这是我的数据的目标值:


    count    2.800010e+05
    mean    -1.722068e-12
    std      6.219815e-13
    min     -4.970697e-12
    25%     -1.965893e-12
    50%     -1.490800e-12
    75%     -1.269998e-12
    max     -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 predicted: [-1.5407631 -1.49756   -1.9647646 -2.7702322 -2.5296502]
    LR predicted: [-1.60908805 -1.51145989 -1.71565321 -2.25043287 -1.65725868]
    ground truth: [-1.6572993  -1.59879922 -2.39709641 -2.26119817 -2.01300088]

输出为y = df[target].values(即不缩放目标值)


    xgb predicted: [1.32620335e-05 1.32620335e-05 1.32620335e-05 1.32620335e-05
     1.32620335e-05]
    LR predicted: [-1.60908805e-12 -1.51145989e-12 -1.71565321e-12 -2.25043287e-12
     -1.65725868e-12]
    ground truth: [-1.65729930e-12 -1.59879922e-12 -2.39709641e-12 -2.26119817e-12
     -2.01300088e-12]

1 个答案:

答案 0 :(得分: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)

这是我目前最好的猜测。如果有人可以添加或验证此内容,那么我将很乐于学习:)