【问题标题】:Improving boosting model ,reducing Root mean square error改进boosting模型,降低均方根误差
【发布时间】:2018-11-14 15:40:04
【问题描述】:

您好,我正在解决一个回归问题。我的数据集包含 13 个特征和 550068 行。我尝试了不同的模型,发现提升算法(即 xgboost、catboost、lightgbm)在该大数据集上表现良好。这里是代码

import lightgbm as lgb
gbm = lgb.LGBMRegressor(objective='regression',num_leaves=100,learning_rate=0.2,n_estimators=1500)
gbm.fit(x_train, y_train,
    eval_set=[(x_test, y_test)],
    eval_metric='l2_root',
    early_stopping_rounds=10)
y_pred = gbm.predict(x_test, num_iteration=gbm.best_iteration_)
accuracy = round(gbm.score(x_train, y_train)*100,2)
mse = mean_squared_error(y_test,y_pred)
rmse = np.sqrt(mse)

import xgboost as xgb
boost_params = {'eval_metric': 'rmse'}
xgb0 = xgb.XGBRegressor(
max_depth=8,
learning_rate=0.1,
n_estimators=1500,
objective='reg:linear',
gamma=0,
min_child_weight=1,
subsample=1,
colsample_bytree=1,
scale_pos_weight=1,
seed=27,
**boost_params)
xgb0.fit(x_train,y_train)
accuracyxgboost = round(xgb0.score(x_train, y_train)*100,2)
predict_xgboost = xgb0.predict(x_test)
msexgboost = mean_squared_error(y_test,predict_xgboost)
rmsexgboost= np.sqrt(msexgboost)

from catboost import Pool, CatBoostRegressor
train_pool = Pool(x_train, y_train) 
cbm0 = CatBoostRegressor(rsm=0.8, depth=7, learning_rate=0.1, 
eval_metric='RMSE')
cbm0.fit(train_pool)
test_pool = Pool(x_test)
predict_cat = cbm0.predict(test_pool)
acc_cat = round(cbm0.score(x_train, y_train)*100,2)
msecat = mean_squared_error(y_test,predict_cat)
rmsecat = np.sqrt(msecat)

通过使用上述模型,我得到的 rmse 值约为 2850。现在我想通过减少均方根误差来提高模型性能。如何提高模型性能?由于我是增强算法的新手,哪些参数会影响模型?以及如何为这些算法(xgboost、catboost、lightgbm)进行超参数调整。我使用的是 Windows10 操作系统和英特尔 i5 第 7 代。

【问题讨论】:

  • 了解您的数据并进行特征工程。与尝试不同的增强技术相比,它将获得更多的回报。阅读 kaggle 获胜者的采访,他们所要说的就是做特征工程。

标签: machine-learning boost data-science xgboost hyperparameters


【解决方案1】:

在您尝试过的这 3 个工具中,CatBoost 在分类特征处理方面提供了优势(它也可能更快,但我没有看到基准测试证明它,而且它似乎在 kaggle 上并不占主导地位,所以很可能它不如 LightGBM 快,但我的假设可能是错误的)。所以如果我的样本中有很多,我会使用它。另外两个(LightGBM 和 XGBoost)提供了非常相似的功能,我建议选择其中一个并坚持使用。目前看来,LightGBM 在 CPU 上的训练时间优于 XGBoost,提供了非常可比的预测精度。参见例如GBM-perf beachmark on githubthis in-depth analysis。如果你有可用的 GPU,那么从上面的基准来看,实际上 XGBoost 似乎更可取。

一般而言,您可以通过多种方式提高模型性能:

  • 训练时间更长(如果未触发提前停止,则意味着仍有泛化空间;如果是,则无法通过使用所选超参数训练所选模型的时间来进一步提高)
  • 优化超参数(见下文)
  • 选择不同的型号。没有一个灵丹妙药可以解决所有问题。通常,GBM 在结构化数据的大样本上工作得很好,但对于某些类别的问题(例如线性依赖),GBM 很难学习如何进行泛化,因为它可能需要非常多的拆分。因此,对于您的问题,线性模型、SVM 或其他开箱即用的模型可能会做得更好。

由于我们缩小到 2 个选项,我无法就 catboost 超参数优化提出建议,因为我还没有实际操作经验。但是对于 lightgbm 调整,您可以阅读其中一个问题中的 this 官方 lightgbm 文档和 these 说明。 LightGBM 有很多很好的超参数调优示例。我可以在 kaggle 上快速挖掘出我的内核:see here。我并不声称它是完美的,但这对我来说很容易找到:)

【讨论】:

    【解决方案2】:

    您可以使用套索或山脊,这些方法可以提高性能。

    对于超参数调整,您可以使用循环。迭代这些值并检查您获得最低 RMSE 值的位置。

    您还可以尝试堆叠集成技术。

    如果你使用 R,请使用 h20.ai 包,它给出了很好的结果。

    【讨论】:

    • 是的!我会尝试这些方法。顺便说一下,我正在使用python。
    猜你喜欢
    • 2020-03-29
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 2020-08-17
    • 2018-07-06
    • 1970-01-01
    • 2018-02-22
    相关资源
    最近更新 更多