为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中使用 XGboost_Regressor 会产生非常好的训练性能但预测效果不佳

在 Python 中使用 XGboost_Regressor 会产生非常好的训练性能但预测效果不佳

墨色风雨 2021-09-14 16:33:43
我一直在尝试在 python 中使用 XGBregressor。这是迄今为止我使用过的最好的 ML 技术之一。 然而,在某些数据集中,我的训练 R 平方非常高,但它在预测或测试方面的表现非常差。我尝试使用伽马、深度和二次采样来降低模型的复杂性或确保它不会过度拟合,但训练和测试之间仍然存在巨大差异。我想知道是否有人可以帮助我解决这个问题:下面是我正在使用的代码:from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30,random_state=100)from sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler()scaler.fit(X_train)xgb = xgboost.XGBRegressor(colsample_bytree=0.7,                 gamma=0,                                  learning_rate=0.01,                 max_depth=1,                 min_child_weight=1.5,                 n_estimators=100000,                                                                                     reg_alpha=0.75,                 reg_lambda=0.45,                 subsample=0.8,                 seed=1000) 以下是训练与测试的表现:训练:MAE:0.10 R^2:0.99测试:MAE:1.47 R^2:-0.89
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

XGBoost 倾向于过度拟合数据,因此减少 n_estimators 和 n_depth 并使用特定的迭代,其中 train loss 和 val loss 之间没有太大区别。


查看完整回答
反对 回复 2021-09-14
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

这里的问题是过度拟合。您需要调整一些参数(Source)。

  • 如果数据大小较高(十万级),则将 n_estimators 设置为 80-200,如果数据大小为中低,则将 n_estimators 设置为 800-1200

  • learning_rate:介于 0.1 和 0.01 之间

  • 子样本:介于 0.8 和 1 之间

  • colsample_bytree:每棵树使用的列数。如果您有很多特征向量或列,则值为 0.3 到 0.8,如果您只有很少的特征向量或列,则值为 0.8 到 1。

  • 伽玛:0、1 或 5

由于 max_depth 您已经取得很低,因此您可以尝试调整上述参数。此外,如果您的数据集非常小,那么训练和测试的差异是可以预料的。您需要检查在训练和测试数据中是否存在良好的数据分割。例如,在测试数据中,输出列的 Yes 和 No 的百分比是否几乎相等。

您需要尝试各种选项。当然 xgboost 和随机森林会为较少的数据提供过拟合模型。你可以试试:-

1.朴素贝叶斯。它适用于较少的数据集,但它认为所有特征向量的权重相同。

逻辑回归 - 尝试调整正则化参数并查看您的召回分数最高的位置。这其中的其他事情是 calsss 重量 = 平衡。

具有交叉验证的逻辑回归 - 这也适用于小数据。我之前说过的最后一件事,检查你的数据,看看它不偏向于一种结果。就像如果在 70 个案例中的 50 个案例中的结果是肯定的,它是高度有偏见的,您可能无法获得高准确度。


查看完整回答
反对 回复 2021-09-14
  • 2 回答
  • 0 关注
  • 821 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信