1. XGBoost算法
XGBoost是陳天奇等人開發(fā)的一個(gè)開源機(jī)器學(xué)習(xí)項(xiàng)目,高效地實(shí)現(xiàn)了GBDT算法并進(jìn)行了算法和工程上的許多改進(jìn),被廣泛應(yīng)用在Kaggle競賽及其他許多機(jī)器學(xué)習(xí)競賽中并取得了不錯的成績。XGBoost是一個(gè)優(yōu)化的分布式梯度增強(qiáng)庫,旨在實(shí)現(xiàn)高效,靈活和便攜。 它在Gradient Boosting框架下實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法。 XGBoost提供了并行樹提升(也稱為GBDT,GBM),可以快速準(zhǔn)確地解決許多數(shù)據(jù)科學(xué)問題。 Xgboost以CART決策樹為子模型,通過Gradient Tree Boosting實(shí)現(xiàn)多棵CART樹的集成學(xué)習(xí),得到最終模型。
模型構(gòu)建如下:
(1) 構(gòu)造目標(biāo)函數(shù):
假設(shè)有K棵樹,則第i個(gè)樣本的輸出為
(2) 疊加式的訓(xùn)練(Additive Training):
給定樣本,
(初始預(yù)測),
,
.......以此類推,可以得到:
,其中,
為前K-1棵樹的預(yù)測結(jié)果,
為第K棵樹的預(yù)測結(jié)果。
因此,目標(biāo)函數(shù)可以分解為:
由于正則化項(xiàng)也可以分解為前K-1棵樹的復(fù)雜度加第K棵樹的復(fù)雜度,因此:,由于
在模型構(gòu)建到第K棵樹的時(shí)候已經(jīng)固定,無法改變.
(3) 如何定義一棵樹:
為了說明如何定義一棵樹的問題,我們需要定義幾個(gè)概念:第一個(gè)概念是樣本所在的節(jié)點(diǎn)位置,第二個(gè)概念是有哪些樣本落在節(jié)點(diǎn)j上,第三個(gè)概念是每個(gè)結(jié)點(diǎn)的預(yù)測值
,第四個(gè)概念是模型復(fù)雜度
,它可以由葉子節(jié)點(diǎn)的個(gè)數(shù)以及節(jié)點(diǎn)函數(shù)值來構(gòu)建,則:
。
2. XGBoost的
XGBoost的參數(shù)分為三種:
- 通用參數(shù):(兩種類型的booster,因?yàn)閠ree的性能比線性回歸好得多,因此我們很少用線性回歸。)
- booster:使用哪個(gè)弱學(xué)習(xí)器訓(xùn)練,默認(rèn)gbtree,可選gbtree,gblinear 或dart
- nthread:用于運(yùn)行XGBoost的并行線程數(shù),默認(rèn)為最大可用線程數(shù)
- verbosity:打印消息的詳細(xì)程度。有效值為0(靜默),1(警告),2(信息),3(調(diào)試)。
-
Tree Booster的參數(shù):
- eta(learning_rate):learning_rate,在更新中使用步長收縮以防止過度擬合,默認(rèn)= 0.3,范圍:[0,1];典型值一般設(shè)置為:0.01-0.2
- gamma(min_split_loss):默認(rèn)= 0,分裂節(jié)點(diǎn)時(shí),損失函數(shù)減小值只有大于等于gamma節(jié)點(diǎn)才分裂,gamma值越大,算法越保守,越不容易過擬合,但性能就不一定能保證,需要平衡。范圍:[0,∞]
- max_depth:默認(rèn)= 6,一棵樹的最大深度。增加此值將使模型更復(fù)雜,并且更可能過度擬合。范圍:[0,∞]
- min_child_weight:默認(rèn)值= 1,如果新分裂的節(jié)點(diǎn)的樣本權(quán)重和小于min_child_weight則停止分裂 。這個(gè)可以用來減少過擬合,但是也不能太高,會導(dǎo)致欠擬合。范圍:[0,∞]
- max_delta_step:默認(rèn)= 0,允許每個(gè)葉子輸出的最大增量步長。如果將該值設(shè)置為0,則表示沒有約束。如果將其設(shè)置為正值,則可以幫助使更新步驟更加保守。通常不需要此參數(shù),但是當(dāng)類極度不平衡時(shí),它可能有助于邏輯回歸。將其設(shè)置為1-10的值可能有助于控制更新。范圍:[0,∞]
- subsample:默認(rèn)值= 1,構(gòu)建每棵樹對樣本的采樣率,如果設(shè)置成0.5,XGBoost會隨機(jī)選擇一半的樣本作為訓(xùn)練集。范圍:(0,1]
- sampling_method:默認(rèn)= uniform,用于對訓(xùn)練實(shí)例進(jìn)行采樣的方法。
- uniform:每個(gè)訓(xùn)練實(shí)例的選擇概率均等。通常將subsample> = 0.5 設(shè)置 為良好的效果。
- gradient_based:每個(gè)訓(xùn)練實(shí)例的選擇概率與規(guī)則化的梯度絕對值成正比,具體來說就是
,subsample可以設(shè)置為低至0.1,而不會損失模型精度。
- colsample_bytree:默認(rèn)= 1,列采樣率,也就是特征采樣率。范圍為(0,1]
- lambda(reg_lambda):默認(rèn)=1,L2正則化權(quán)重項(xiàng)。增加此值將使模型更加保守。
- alpha(reg_alpha):默認(rèn)= 0,權(quán)重的L1正則化項(xiàng)。增加此值將使模型更加保守。
- tree_method:默認(rèn)=auto,XGBoost中使用的樹構(gòu)建算法。
- auto:使用啟發(fā)式選擇最快的方法。
- 對于小型數(shù)據(jù)集,exact將使用精確貪婪。
- 對于較大的數(shù)據(jù)集,approx將選擇近似算法。它建議嘗試hist,gpu_hist,用大量的數(shù)據(jù)可能更高的性能。(gpu_hist)支持。external memory外部存儲器。
- exact:精確的貪婪算法。枚舉所有拆分的候選點(diǎn)。
- approx:使用分位數(shù)和梯度直方圖的近似貪婪算法。
- hist:更快的直方圖優(yōu)化的近似貪婪算法。(LightGBM也是使用直方圖算法)
- gpu_hist:GPU hist算法的實(shí)現(xiàn)。
- auto:使用啟發(fā)式選擇最快的方法。
- scale_pos_weight:控制正負(fù)權(quán)重的平衡,這對于不平衡的類別很有用。Kaggle競賽一般設(shè)置sum(negative instances) / sum(positive instances),在類別高度不平衡的情況下,將參數(shù)設(shè)置大于0,可以加快收斂。
- num_parallel_tree:默認(rèn)=1,每次迭代期間構(gòu)造的并行樹的數(shù)量。此選項(xiàng)用于支持增強(qiáng)型隨機(jī)森林。
- monotone_constraints:可變單調(diào)性的約束,在某些情況下,如果有非常強(qiáng)烈的先驗(yàn)信念認(rèn)為真實(shí)的關(guān)系具有一定的質(zhì)量,則可以使用約束條件來提高模型的預(yù)測性能。(例如params_constrained['monotone_constraints'] = "(1,-1)",(1,-1)我們告訴XGBoost對第一個(gè)預(yù)測變量施加增加的約束,對第二個(gè)預(yù)測變量施加減小的約束。)
-
Linear Booster的參數(shù):
- lambda(reg_lambda):默認(rèn)= 0,L2正則化權(quán)重項(xiàng)。增加此值將使模型更加保守。歸一化為訓(xùn)練示例數(shù)。
- alpha(reg_alpha):默認(rèn)= 0,權(quán)重的L1正則化項(xiàng)。增加此值將使模型更加保守。歸一化為訓(xùn)練示例數(shù)。
- updater:默認(rèn)= shotgun。
- shotgun:基于shotgun算法的平行坐標(biāo)下降算法。使用“ hogwild”并行性,因此每次運(yùn)行都產(chǎn)生不確定的解決方案。
- coord_descent:普通坐標(biāo)下降算法。同樣是多線程的,但仍會產(chǎn)生確定性的解決方案。
- feature_selector:默認(rèn)= cyclic。特征選擇和排序方法
- cyclic:通過每次循環(huán)一個(gè)特征來實(shí)現(xiàn)的。
- shuffle:類似于cyclic,但是在每次更新之前都有隨機(jī)的特征變換。
- random:一個(gè)隨機(jī)(有放回)特征選擇器。
- greedy:選擇梯度最大的特征。(貪婪選擇)
- thrifty:近似貪婪特征選擇(近似于greedy)
- top_k:要選擇的最重要特征數(shù)(在greedy和thrifty內(nèi))
- 任務(wù)參數(shù)(這個(gè)參數(shù)用來控制理想的優(yōu)化目標(biāo)和每一步結(jié)果的度量方法。)
- objective:默認(rèn)=reg:squarederror,表示最小平方誤差。
- reg:squarederror,最小平方誤差。
- reg:squaredlogerror,對數(shù)平方損失。
- reg:logistic,邏輯回歸
- reg:pseudohubererror,使用偽Huber損失進(jìn)行回歸,這是絕對損失的兩倍可微選擇。
- binary:logistic,二元分類的邏輯回歸,輸出概率。
- binary:logitraw:用于二進(jìn)制分類的邏輯回歸,邏輯轉(zhuǎn)換之前的輸出得分。
- binary:hinge:二進(jìn)制分類的鉸鏈損失。這使預(yù)測為0或1,而不是產(chǎn)生概率。(SVM就是鉸鏈損失函數(shù))
- count:poisson –計(jì)數(shù)數(shù)據(jù)的泊松回歸,泊松分布的輸出平均值。
- survival:cox:針對正確的生存時(shí)間數(shù)據(jù)進(jìn)行Cox回歸(負(fù)值被視為正確的生存時(shí)間)。
- survival:aft:用于檢查生存時(shí)間數(shù)據(jù)的加速故障時(shí)間模型。
- aft_loss_distribution:survival:aft和aft-nloglik度量標(biāo)準(zhǔn)使用的概率密度函數(shù)。
- multi:softmax:設(shè)置XGBoost以使用softmax目標(biāo)進(jìn)行多類分類,還需要設(shè)置num_class(類數(shù))
- multi:softprob:與softmax相同,但輸出向量,可以進(jìn)一步重整為矩陣。結(jié)果包含屬于每個(gè)類別的每個(gè)數(shù)據(jù)點(diǎn)的預(yù)測概率。
- rank:pairwise:使用LambdaMART進(jìn)行成對排名,從而使成對損失最小化。
- rank:ndcg:使用LambdaMART進(jìn)行列表式排名,使標(biāo)準(zhǔn)化折讓累積收益(NDCG)最大化。
- rank:map:使用LambdaMART進(jìn)行列表平均排名,使平均平均精度(MAP)最大化。
- reg:gamma:使用對數(shù)鏈接進(jìn)行伽馬回歸。輸出是伽馬分布的平均值。
- reg:tweedie:使用對數(shù)鏈接進(jìn)行Tweedie回歸。
- 自定義損失函數(shù)和評價(jià)指標(biāo):https://xgboost.readthedocs.io/en/latest/tutorials/custom_metric_obj.html
- eval_metric:驗(yàn)證數(shù)據(jù)的評估指標(biāo),將根據(jù)目標(biāo)分配默認(rèn)指標(biāo)(回歸均方根,分類誤差,排名的平均平均精度),用戶可以添加多個(gè)評估指標(biāo)
- rmse,均方根誤差; rmsle:均方根對數(shù)誤差; mae:平均絕對誤差;mphe:平均偽Huber錯誤;logloss:負(fù)對數(shù)似然; error:二進(jìn)制分類錯誤率;
- merror:多類分類錯誤率; mlogloss:多類logloss; auc:曲線下面積; aucpr:PR曲線下的面積;ndcg:歸一化累計(jì)折扣;map:平均精度;
- seed :隨機(jī)數(shù)種子,[默認(rèn)= 0]。
- objective:默認(rèn)=reg:squarederror,表示最小平方誤差。