劍指LightGBM和XGboost!斯坦福發(fā)表NGBoost算法
Stanford ML Group 最近在他們的論文中發(fā)表了一個(gè)新算法,其實(shí)現(xiàn)被稱(chēng)為 NGBoost。該算法利用自然梯度將不確定性估計(jì)引入到梯度增強(qiáng)中。本文試圖了解這個(gè)新算法,并與其他流行的 boosting 算法 LightGBM 和 XGboost 進(jìn)行比較,以了解它在實(shí)踐中是如何工作的。
本文引用地址:http://butianyuan.cn/article/201911/407222.htm注:Stanford ML Group 發(fā)表的論文網(wǎng)址為:https://arxiv.org/abs/1910.03225,有興趣的同學(xué)可以下載學(xué)習(xí)~
James Pond 在 Unsplash 雜志上的照片
本文的主要內(nèi)容包括以下三個(gè)部分:
什么是自然梯度增強(qiáng)?
經(jīng)驗(yàn)驗(yàn)證——與 LightGBM 和 XGBoost 的比較
結(jié)論
1.什么是自然梯度增強(qiáng)?
正如我在簡(jiǎn)介中所寫(xiě)那樣,NGBoost 是一種新的 boosting 算法,它使用自然梯度 boosting,是一種用于概率預(yù)測(cè)的模塊化 boosting 算法。該算法由 Base learners 、參數(shù)概率分布和評(píng)分規(guī)則組成。我將簡(jiǎn)要地解釋一下這些術(shù)語(yǔ)是什么。
Base learners
該算法使用 Base learners。它接受輸入 x,輸出用來(lái)形成條件概率。這些 Base learners 使用 scikit-learn 的決策樹(shù)作為樹(shù)型學(xué)習(xí)者,使用嶺回歸作為線(xiàn)性學(xué)習(xí)者。
參數(shù)概率分布
參數(shù)概率分布是一種條件分布。這是由 Base learners 輸出的加法組合形成的。
評(píng)分規(guī)則
評(píng)分規(guī)則采用預(yù)測(cè)的概率分布和對(duì)目標(biāo)特征的觀察來(lái)對(duì)預(yù)測(cè)結(jié)果進(jìn)行評(píng)分,真實(shí)的結(jié)果分布期望值得到最好的分?jǐn)?shù)。該算法使用最大似然估計(jì)(MLE)或 CRPS(連續(xù)排序概率得分)。
我們剛剛介紹了 NGBoost 的基本概念。我建議你閱讀原稿以便進(jìn)一步理解(用數(shù)學(xué)符號(hào)更容易理解算法)。
2.經(jīng)驗(yàn)驗(yàn)證:與 LightGBM 和 XGBoost 的比較
billy lee 在 Unsplash 雜志上的照片
讓我們實(shí)現(xiàn) NGBoost,看看它的性能如何。論文還對(duì)各種數(shù)據(jù)集進(jìn)行了實(shí)驗(yàn)。他們比較了 MC-dropout、Deep-Ensembles 和 NGBoost 在回歸問(wèn)題中的表現(xiàn),NGBoost 表現(xiàn)出了很強(qiáng)的競(jìng)爭(zhēng)力。在這篇博文中,我想展示一下這個(gè)模型在 Kaggle 上著名的房?jī)r(jià)預(yù)測(cè)數(shù)據(jù)集上的性能。這個(gè)數(shù)據(jù)集包含 81 個(gè)特征,1460 行,目標(biāo)是預(yù)測(cè)銷(xiāo)售價(jià)格。讓我們看看 NGBoost 如何處理這些情況。
目標(biāo)特征的分布
由于測(cè)試算法的性能是本文的目的,我們將跳過(guò)整個(gè)特征工程部分,并將使用 Nanashi 的解決方案。
導(dǎo)入包:
# 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
在這里,我將使用上面的默認(rèn)學(xué)習(xí)者、分布和評(píng)分規(guī)則,看看結(jié)果如何變化。
# read the dataset
df = pd.read_csv('~/train.csv')
# feature engineering
tr, te = Nanashi_solution(df)
現(xiàn)在使用 NGBoost 算法進(jìn)行預(yù)測(cè)。
# 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)))
對(duì) 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)
現(xiàn)在我們用所有算法進(jìn)行了預(yù)測(cè)。讓我們檢查一下它們的準(zhǔn)確性。我們將使用與這次 kaggle 競(jìng)賽相同的標(biāo)準(zhǔn),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))
以下是預(yù)測(cè)結(jié)果的總結(jié)。
預(yù)測(cè)結(jié)果總結(jié)
看來(lái) NGBoost 的性能優(yōu)于其他著名的 boosting 算法。公平地說(shuō),我覺(jué)得如果我調(diào)整 BGBoost 的參數(shù),它會(huì)更好。
NGBoost 與其他 boosting 算法最大的區(qū)別之一是可以返回每個(gè)預(yù)測(cè)的概率分布。這可以通過(guò)使用 pred_dist 函數(shù)可視化。此函數(shù)能夠顯示概率預(yù)測(cè)的結(jié)果。
# 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()
概率分布示例
上面的圖表是每個(gè)預(yù)測(cè)的概率分布。X 軸顯示銷(xiāo)售價(jià)格的日志值(目標(biāo)特征)。我們可以觀察到,指數(shù) 0 的概率分布比指數(shù) 114 的更寬。
結(jié)論與思考
從實(shí)驗(yàn)結(jié)果可以看出,NGBoost 算法與其他著名的 boosting 算法具有相同的性能。然而,計(jì)算時(shí)間比其他兩種算法要長(zhǎng)得多。這可以通過(guò)使用子采樣方法來(lái)改進(jìn)。此外,在我的印象中,NGBost 包仍在開(kāi)發(fā)中,例如,沒(méi)有提前停止選項(xiàng),沒(méi)有顯示中間結(jié)果的選項(xiàng),選擇 Base leaners 的靈活性(到目前為止,我們只能在決策樹(shù)和嶺回歸之間選擇),設(shè)置一個(gè)隨機(jī)狀態(tài)種子,等等。我相信這些要點(diǎn)將很快得到落實(shí)。
你也可以在我的 GitHub 頁(yè)面上找到我在這篇文章中使用的代碼:https://github.com/kyosek/NGBoost-experiments
總結(jié)
NGBoost 是一種返回概率分布的 boosting 算法。
自然梯度增強(qiáng),一種用于概率預(yù)測(cè)的模塊化增強(qiáng)算法。這包括 Base leaners、參數(shù)概率分布和評(píng)分規(guī)則。
NGBoost 預(yù)測(cè)與其他流行的 boosting 算法相比具有很大的競(jìng)爭(zhēng)力。
*參考文獻(xiàn):
[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@Peter_Dong
本文轉(zhuǎn)自雷鋒網(wǎng),如需轉(zhuǎn)載請(qǐng)至雷鋒網(wǎng)官網(wǎng)申請(qǐng)授權(quán)。
評(píng)論