改进增强模型,减少均方根误差

时间:2018-06-05 08:09:44

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

我正在解决一个回归问题。我的数据集由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)

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

2 个答案:

答案 0 :(得分:1)

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

通常,您可以通过多种方式改善模型性能:

  • 训练更长时间(如果没有触发早期停止,这意味着仍然存在推广的空间;如果是,那么通过选择超参数训练选择的模型,你无法进一步提高)
  • 优化超参数(见下文)
  • 选择其他型号。所有问题都没有单一的银弹。通常,GBM在大型结构化数据样本上运行良好,但对于某些类型的问题(例如线性依赖),GBM很难学习如何进行泛化,因为它可能需要很多分割。因此,对于您的问题,线性模型,SVM或其他东西可能会更好地开箱即用。

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

答案 1 :(得分:0)

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

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

您还可以尝试堆叠合奏技巧。

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