资讯 人工智能开发者
此为临时链接,仅用于文章预览,将在时失效

剑指LightGBM和XGboost!斯坦福发表NGBoost算法

作者:skura
2019/11/18 18:29

剑指LightGBM和XGboost!斯坦福发表NGBoost算法

James Pond 在 Unsplash 杂志上的照片

Stanford ML Group 最近在他们的论文中发表了一个新算法,其实现被称为 NGBoost。该算法利用自然梯度将不确定性估计引入到梯度增强中。本文试图了解这个新算法,并与其他流行的 boosting 算法 LightGBM 和 XGboost 进行比较,以了解它在实践中是如何工作的。

注:Stanford ML Group 发表的论文网址为:https://arxiv.org/abs/1910.03225,有兴趣的同学可以下载学习~

本文的主要内容包括以下三个部分:

  1. 什么是自然梯度增强?

  2. 经验验证——与 LightGBM 和 XGBoost 的比较

  3. 结论

1.什么是自然梯度增强?

正如我在简介中所写那样,NGBoost 是一种新的 boosting 算法,它使用自然梯度 boosting,是一种用于概率预测的模块化 boosting 算法。该算法由 Base learners 、参数概率分布和评分规则组成。我将简要地解释一下这些术语是什么。

剑指LightGBM和XGboost!斯坦福发表NGBoost算法

该算法使用 Base learners。它接受输入 x,输出用来形成条件概率。这些 Base learners 使用 scikit-learn 的决策树作为树型学习者,使用岭回归作为线性学习者。

参数概率分布是一种条件分布。这是由 Base learners 输出的加法组合形成的。

评分规则采用预测的概率分布和对目标特征的观察来对预测结果进行评分,真实的结果分布期望值得到最好的分数。该算法使用最大似然估计(MLE)或 CRPS(连续排序概率得分)。

我们刚刚介绍了 NGBoost 的基本概念。我建议你阅读原稿以便进一步理解(用数学符号更容易理解算法)。

2.经验验证:与 LightGBM 和 XGBoost 的比较

剑指LightGBM和XGboost!斯坦福发表NGBoost算法

billy lee 在 Unsplash 杂志上的照片

让我们实现 NGBoost,看看它的性能如何。论文还对各种数据集进行了实验。他们比较了 MC-dropout、Deep-Ensembles 和 NGBoost 在回归问题中的表现,NGBoost 表现出了很强的竞争力。在这篇博文中,我想展示一下这个模型在 Kaggle 上著名的房价预测数据集上的性能。这个数据集包含 81 个特征,1460 行,目标是预测销售价格。让我们看看 NGBoost 如何处理这些情况。

剑指LightGBM和XGboost!斯坦福发表NGBoost算法

目标特征的分布

由于测试算法的性能是本文的目的,我们将跳过整个特征工程部分,并将使用 Nanashi 的解决方案。

导入包:

# import packages

import pandas as pd


from ngboost.ngboost import NGBoost

from ngboost.learners import default_tree_learner

from ngboost.distns import Normal

from ngboost.scores


import MLE import lightgbm as lgb


import xgboost as xgb


from sklearn.model_selection import train_test_split

from sklearn.metrics import mean_squared_error

from math import sqrt

在这里,我将使用上面的默认学习者、分布和评分规则,看看结果如何变化。

# read the dataset

df = pd.read_csv('~/train.csv')


# feature engineering

tr, te = Nanashi_solution(df)




现在使用 NGBoost 算法进行预测。

# NGBoost

ngb = NGBoost(Base=default_tree_learner, Dist=Normal, Score=MLE(),

natural_gradient=True,verbose=False)


ngboost = ngb.fit(np.asarray(tr.drop(['SalePrice'],1)),

np.asarray(tr.SalePrice))


y_pred_ngb = pd.DataFrame(ngb.predict(te.drop(['SalePrice'],1)))




对 LightGBM 和 XGBoost 也做一样的事情:

# LightGBM

ltr = lgb.Dataset(tr.drop(['SalePrice'],1),label=tr['SalePrice'])


param = {

'bagging_freq': 5,

'bagging_fraction': 0.6,

'bagging_seed': 123,

'boost_from_average':'false',

'boost': 'gbdt',

'feature_fraction': 0.3,

'learning_rate': .01,

'max_depth': 3,

'metric':'rmse',

'min_data_in_leaf': 128,

'min_sum_hessian_in_leaf': 8,

'num_leaves': 128, 'num_threads': 8,

'tree_learner': 'serial',

'objective': 'regression',

'verbosity': -1,

'random_state':123,

'max_bin': 8,

'early_stopping_round':100

}


lgbm = lgb.train(param,ltr,num_boost_round=10000,valid_sets= [(ltr)],verbose_eval=1000)


y_pred_lgb = lgbm.predict(te.drop(['SalePrice'],1))

y_pred_lgb = np.where(y_pred>=.25,1,0)


# XGBoost

params = {

'max_depth': 4, 'eta': 0.01,

'objective':'reg:squarederror',

'eval_metric': ['rmse'],

'booster':'gbtree',

'verbosity':0,

'sample_type':'weighted',

'max_delta_step':4,

'subsample':.5,

'min_child_weight':100,

'early_stopping_round':50

}


dtr, dte = xgb.DMatrix(tr.drop(['SalePrice'],1),label=tr.SalePrice),

xgb.DMatrix(te.drop(['SalePrice'],1),label=te.SalePrice)


num_round = 5000

xgbst = xgb.train(params,dtr,num_round,verbose_eval=500)


y_pred_xgb = xgbst.predict(dte)

现在我们用所有算法进行了预测。让我们检查一下它们的准确性。我们将使用与这次 kaggle 竞赛相同的标准,RMSE。

# Check the results

print('RMSE: NGBoost',

round(sqrt(mean_squared_error(X_val.SalePrice,y_pred_ngb)),4))

print('RMSE: LGBM',

round(sqrt(mean_squared_error(X_val.SalePrice,y_pred_lgbm)),4))

print('RMSE: XGBoost',

round(sqrt(mean_squared_error(X_val.SalePrice,y_pred_xgb)),4))

以下是预测结果的总结。

剑指LightGBM和XGboost!斯坦福发表NGBoost算法

预测结果总结

看来 NGBoost 的性能优于其他著名的 boosting 算法。公平地说,我觉得如果我调整 BGBoost 的参数,它会更好。

NGBoost 与其他 boosting 算法最大的区别之一是可以返回每个预测的概率分布。这可以通过使用 pred_dist 函数可视化。此函数能够显示概率预测的结果。

# see the probability distributions by visualising

Y_dists = ngb.pred_dist(X_val.drop(['SalePrice'],1))

y_range = np.linspace(min(X_val.SalePrice), max(X_val.SalePrice), 200)

dist_values = Y_dists.pdf(y_range).transpose()


# plot index 0 and 114

idx = 114

plt.plot(y_range,dist_values[idx])

plt.title(f"idx: {idx}")

plt.tight_layout()

plt.show()

剑指LightGBM和XGboost!斯坦福发表NGBoost算法

概率分布示例

上面的图表是每个预测的概率分布。X 轴显示销售价格的日志值(目标特征)。我们可以观察到,指数 0 的概率分布比指数 114 的更宽。

结论与思考

从实验结果可以看出,NGBoost 算法与其他著名的 boosting 算法具有相同的性能。然而,计算时间比其他两种算法要长得多。这可以通过使用子采样方法来改进。此外,在我的印象中,NGBost 包仍在开发中,例如,没有提前停止选项,没有显示中间结果的选项,选择 Base leaners 的灵活性(到目前为止,我们只能在决策树和岭回归之间选择),设置一个随机状态种子,等等。我相信这些要点将很快得到落实。

你也可以在我的 GitHub 页面上找到我在这篇文章中使用的代码:https://github.com/kyosek/NGBoost-experiments 

总结

参考文献:

[1] T. Duan, et al., NGBoost: Natural Gradient Boosting for Probabilistic Prediction (2019), ArXiv 1910.03225

via:https://towardsdatascience.com/ngboost-explained-comparison-to-lightgbm-and-xgboost-fda510903e53

雷锋网雷锋网雷锋网

长按图片保存图片,分享给好友或朋友圈

剑指LightGBM和XGboost!斯坦福发表NGBoost算法

扫码查看文章

正在生成分享图...

取消
相关文章