sklearn、XGBoost、LightGBM的文檔閱讀小記
文章導(dǎo)航
目錄
1.1.4.sklearn-forests of randomized trees
3.1.3.1.leaf-wise(best-first)樹生長策略
4.1.GBDT vs. XGBoost vs. LightGBM(論文層面)
4.2.sklearn GBDT vs. XGBoost vs. LightGBM(實現(xiàn)層面)
4.2.1.sklearn GBDT vs. XGBoost
本文主要是針對sklearn,XGBoost,LightGBM的官方文檔閱讀的一些整理,主要針對sklearn的集成方法、以及gbdt族模型的具體實現(xiàn)差異以及各個模型的重要參數(shù)、特點做了一個整理
集成方法的目的是結(jié)合一些基于某些算法訓(xùn)練得到的基學(xué)習(xí)器來改進其泛化能力和魯棒性(相對單個的基學(xué)習(xí)器而言)
主流的兩種做法分別是:
獨立的訓(xùn)練一些基學(xué)習(xí)器(一般傾向于強大而復(fù)雜的模型比如完全生長的決策樹),然后綜合他們的預(yù)測結(jié)果,通常集成模型的效果會優(yōu)于基學(xué)習(xí)器,因為模型的方差有所降低。
Pasting:直接從樣本集里隨機抽取的到訓(xùn)練樣本子集
Bagging:自助采樣(有放回的抽樣)得到訓(xùn)練子集
Random Subspaces:列采樣,按照特征進行樣本子集的切分
Random Patches:同時進行行采樣、列采樣得到樣本子集
BaggingClassifier
BaggingRegressor
可自定義基學(xué)習(xí)器
max_samples,max_features控制樣本子集的大小
bootstrap,bootstrap_features控制是否使用自主采樣法
當(dāng)使用自助采樣法時,可以設(shè)置參數(shù)oob_score=True來通過包外估計來估計模型的泛化誤差(也就不需要進行交叉驗證了)
Note:方差的產(chǎn)生主要是不同的樣本訓(xùn)練得到的學(xué)習(xí)器對于同一組測試集做出分類、預(yù)測結(jié)果的波動性,究其原因是基學(xué)習(xí)器可能學(xué)到了所供學(xué)習(xí)的訓(xùn)練樣本中的局部特征或者說是擬合了部分噪聲數(shù)據(jù),這樣綜合不同的學(xué)習(xí)器的結(jié)果,采取多數(shù)表決(分類)或者平均(回歸)的方法可以有效改善這一狀況
sklearn-forests of randomized trees
RandomForest: 采取自主采樣法構(gòu)造多個基學(xué)習(xí)器,并且在學(xué)習(xí)基學(xué)習(xí)器時,不是使用全部的特征來選擇最優(yōu)切分點,而是先隨機選取一個特征子集隨后在特征子集里挑選最優(yōu)特征進行切分;這種做法會使得各個基學(xué)習(xí)器的偏差略微提升,但在整體上降低了集成模型的方差,所以會得到整體上不錯的模型
RandomForestClassifier
RandomForestRegressor
Notes:
不同于原始的模型實現(xiàn)(讓各個基學(xué)習(xí)器對樣本的分類進行投票),sklearn里隨機森林的實現(xiàn)是通過將各個基學(xué)習(xí)器的預(yù)測概率值取平均來得到最終分類
隨機森林的行采樣(bagging)和列采樣(feature bagging)都是為了減小模型之間的相關(guān)性使基學(xué)習(xí)器變得不同從而減小集成模型的方差
Extra-Trees(extremely randomized
trees):相較于rf進一步增強了隨機性,rf是對各個基學(xué)習(xí)器隨機挑選了部分特征來做維特征子集從中挑選最佳的特征切分,而Extra-Trees更進一步,在特征子集里挑選最佳特征時不是選擇最有區(qū)分度的特征值,而是隨機選擇這一劃分的閾值(該閾值在子特征集里的特征對應(yīng)的采樣后的樣本取值范圍里隨機選取),而不同的隨機閾值下的特征中表現(xiàn)最佳的作為劃分特征,這樣其實增強了隨機性,更進一步整大了基學(xué)習(xí)器的偏差但降低了整體的方差
ExtraTreesClassifier
ExtraTreesRegressor
最重要的兩個參數(shù)
n_estimators:森林中樹的數(shù)量,初始越多越好,但是會增加訓(xùn)練時間,到達一定數(shù)量后模型的表現(xiàn)不會再有顯著的提升
max_features:各個基學(xué)習(xí)器進行切分時隨機挑選的特征子集中的特征數(shù)目,數(shù)目越小模型整體的方差會越小,但是單模型的偏差也會上升,經(jīng)驗性的設(shè)置回歸問題的max_features為整體特征數(shù)目,而分類問題則設(shè)為整體特征數(shù)目開方的結(jié)果
其他參數(shù)
max_depth:樹的最大深度,經(jīng)驗性的設(shè)置為None(即不設(shè)限,完全生長)
min_samples_split,節(jié)點最小分割的樣本數(shù),表示當(dāng)前樹節(jié)點還可以被進一步切割的含有的最少樣本數(shù);經(jīng)驗性的設(shè)置為1,原因同上
bootstrap,rf里默認是True也就是采取自助采樣,而Extra-Trees則是默認關(guān)閉的,是用整個數(shù)據(jù)集的樣本,當(dāng)bootstrap開啟時,同樣可以設(shè)置oob_score為True進行包外估計測試模型的泛化能力
n_jobs,并行化,可以在機器的多個核上并行的構(gòu)造樹以及計算預(yù)測值,不過受限于通信成本,可能效率并不會說分為k個線程就得到k倍的提升,不過整體而言相對需要構(gòu)造大量的樹或者構(gòu)建一棵復(fù)雜的樹而言還是高效的
criterion:切分策略:gini或者entropy,默認是gini,與樹相關(guān)
min_impurity_split–>min_impurity_decrease:用來進行早停止的參數(shù),判斷樹是否進一步分支,原先是比較不純度是否仍高于某一閾值,0.19后是判斷不純度的降低是否超過某一閾值
warm_start:若設(shè)為True則可以再次使用訓(xùn)練好的模型并向其中添加更多的基學(xué)習(xí)器
class_weight:設(shè)置數(shù)據(jù)集中不同類別樣本的權(quán)重,默認為None,也就是所有類別的樣本權(quán)重均為1,數(shù)據(jù)類型為字典或者字典列表(多類別)
balanced:根據(jù)數(shù)據(jù)集中的類別的占比來按照比例進行權(quán)重設(shè)置n_samples/(n_classes*np.bincount(y))
balanced_subsamples:類似balanced,不過權(quán)重是根據(jù)自助采樣后的樣本來計算
predict(X):返回輸入樣本的預(yù)測類別,返回類別為各個樹預(yù)測概率均值的最大值
predict_log_proba(X):
predict_proba(X):返回輸入樣本X屬于某一類別的概率,通過計算隨機森林中各樹對于輸入樣本的平均預(yù)測概率得到,每棵樹輸出的概率由葉節(jié)點中類別的占比得到
score(X,y):返回預(yù)測的平均準(zhǔn)確率
特征重要性評估:一棵樹中的特征的排序(比如深度)可以用來作為特征相對重要性的一個評估,居于樹頂端的特征相對而言對于最終樣本的劃分貢獻最大(經(jīng)過該特征劃分所涉及的樣本比重最大),這樣可以通過對比各個特征所劃分的樣本比重的一個期望值來評估特征的相對重要性,而在隨機森林中,通過對于不同樹的特征的期望取一個平均可以減小評估結(jié)果的方差,以供特征選擇;在sklearn中這些評估最后被保存在訓(xùn)練好的模型的參數(shù)featureimportances里,是各個特征的重要性值經(jīng)過歸一化的結(jié)果,越高代表特征越匹配預(yù)測函數(shù)
Notes:
此外sklearn還有一種RandomTreesEmbedding的實現(xiàn),不是很清楚有何特殊用途
相似之處:均屬于所謂的權(quán)重近鄰策略(weighted neighborhoods schemes):指的是,模型通過訓(xùn)練集來通過輸入樣本的近鄰樣本點對輸入樣本作出預(yù)測,通過一個帶權(quán)重的函數(shù)關(guān)系
一個接一個的(串行)訓(xùn)練基學(xué)習(xí)器,每一個基學(xué)習(xí)器主要用來修正前面學(xué)習(xí)器的偏差。
AdaBoost可用于分類和回歸
AdaBoostClassifier
AdaBoostRegressor
參數(shù)
n_estimators:基學(xué)習(xí)器數(shù)目
learning_rate:學(xué)習(xí)率,對應(yīng)在最終的繼承模型中各個基學(xué)習(xí)器的權(quán)重
base_estimator:基學(xué)習(xí)器默認是使用決策樹樁
_Notes:調(diào)參的關(guān)鍵參數(shù)是基學(xué)習(xí)器的數(shù)量n_estimators以及基學(xué)習(xí)器本身的復(fù)雜性比如深度max_depth或者葉節(jié)點所需的最少樣本數(shù)min_samples_leaf_
Gradient Tree Boosting或者說GBRT是boosting的一種推廣,是的可以應(yīng)用一般的損失函數(shù),可以處理分類問題和回歸問題,應(yīng)用廣泛,常見應(yīng)用場景比如網(wǎng)頁搜索排序和社會生態(tài)學(xué)
優(yōu)點:
能夠直接處理混合類型的特征
對輸出空間的異常值的魯棒性(通過魯棒的損失函數(shù))
缺點:
難以并行,因為本身boosting的思想是一個接一個的訓(xùn)練基學(xué)習(xí)器
GradientBoostingClassifier
支持二分類和多分類
參數(shù)控制:
基學(xué)習(xí)器的數(shù)量n_estimators
每棵樹的大小可以通過樹深max_depth或者葉節(jié)點數(shù)目max_leaf_nodes來控制(注意兩種樹的生長方式不同,max_leaf_nodes是針對葉節(jié)點優(yōu)先挑選不純度下降最多的葉節(jié)點,這里有點LightGBM的’leaf-wise’的意味,而按樹深分裂則更類似于原始的以及XGBoost的分裂方式)
學(xué)習(xí)率learning_rate對應(yīng)取值范圍在(0,1]之間的超參數(shù)對應(yīng)GBRT里的shrinkage來避免過擬合(是sklearn里的GBDT用來進行正則化的一種策略);
對于需要多分類的問題需要設(shè)置參數(shù)n_classes對應(yīng)每輪迭代的回歸樹,這樣總體樹的數(shù)目是n_classes*n_estimators
criterion用來設(shè)置回歸樹的切分策略
friedman_mse,對應(yīng)的最小平方誤差的近似,加入了Friedman的一些改進
mse對應(yīng)最小平方誤差
mae對應(yīng)平均絕對值誤差
subsample:行采樣,對樣本采樣,即訓(xùn)練每個基學(xué)習(xí)器時不再使用原始的全部數(shù)據(jù)集,而是使用一部分,并且使用隨機梯度上升法來做集成模型的訓(xùn)練
列采樣:max_features在訓(xùn)練基學(xué)習(xí)器時使用一個特征子集來訓(xùn)練,類似隨機森林的做法
early stopping:通過參數(shù)min_impurity_split(原始)以及min_impurity_decrease來實現(xiàn),前者的是根據(jù)節(jié)點的不純度是否高于閾值,若不是則停止增長樹,作為葉節(jié)點;后者則根據(jù)分裂不純度下降值是否超過某一閾值來決定是否分裂(此外這里的early stopping似乎與XGBoost里顯示設(shè)置的early stopping不同,這里是控制樹的切分生長,而XGBoost則是控制基學(xué)習(xí)器的數(shù)目)
另外一點,有說這里的early_stopping起到了一種正則化的效果,因為控制了葉節(jié)點的切分閾值從而控制了模型的復(fù)雜度(可參考李航《統(tǒng)計學(xué)習(xí)方法》P213底部提升方法沒有顯式的正則化項,通常通過早停止的方法達到正則化的效果)
基學(xué)習(xí)器的初始化:init,用來計算初始基學(xué)習(xí)器的預(yù)測,需要具備fit和predict方法,若未設(shè)置則默認為loss.init_estimator
模型的重復(fù)使用(熱啟動):warm_start,若設(shè)置為True則可以使用已經(jīng)訓(xùn)練好的學(xué)習(xí)器,并且在其上添加更多的基學(xué)習(xí)器
預(yù)排序:presort,默認設(shè)置為自動,對樣本按特征值進行預(yù)排序從而提高尋找最優(yōu)切分點的效率,自動模式下對稠密數(shù)據(jù)會使用預(yù)排序,而對稀疏數(shù)據(jù)則不會
損失函數(shù)(loss)
二分類的對數(shù)損失函數(shù)(Binomial deviance,’deviance’),提供概率估計,模型初值設(shè)為對數(shù)幾率
多分類的對數(shù)損失(Multinomial deviance,’deviance’),針對n_classes互斥的多分類,提供概率估計,初始模型值設(shè)為各類別的先驗概率,每一輪迭代需要構(gòu)建n類回歸樹可能會使得模型對于多類別的大數(shù)據(jù)集不太高效
指數(shù)損失函數(shù)(Exponential loss),與AdaBoostClassifier的損失函數(shù)一致,相對對數(shù)損失來說對錯誤標(biāo)簽的樣本不夠魯棒,只能夠被用來作二分類
常用方法
特征重要性(feature_importances_):進行特征重要性的評估
包外估計(oob_improvement_),使用包外樣本來計算每一輪訓(xùn)練后模型的表現(xiàn)提升
訓(xùn)練誤差(train_score_)
訓(xùn)練好的基學(xué)習(xí)器集合(estimators_)
fit方法里可以設(shè)置樣本權(quán)重sample_weight,monitor可以用來回調(diào)一些方法比如包外估計、早停止等
GradientBoostingRegressor
支持不同的損失函數(shù),通過參數(shù)loss設(shè)置,默認的損失函數(shù)是最小均方誤差ls
通過屬性train_score_可獲得每輪訓(xùn)練的訓(xùn)練誤差,通過方法staged_predict可以獲得每一階段的測試誤差,通過屬性feature_importances_可以輸出模型判斷的特征相對重要性
損失函數(shù):
最小均方誤差(Least squares,’ls’),計算方便,一般初始模型為目標(biāo)均值
最小絕對值誤差(Least absolute deviation,’lad’),初始模型為目標(biāo)中位值
Huber,一種結(jié)合了最小均方誤差和最小絕對值誤差的方法,使用參數(shù)alpha來控制對異常點的敏感情況
Shrinkage,對應(yīng)參數(shù)learning rate一種簡單的正則化的策略,通過控制每一個基學(xué)習(xí)器的貢獻,會影響到基學(xué)習(xí)器的數(shù)目即n_estimators,經(jīng)驗性的設(shè)置為一個較小的值,比如不超過0.1的常數(shù)值,然后使用early stopping來控制基學(xué)習(xí)器的數(shù)目
行采樣,使用隨機梯度上升,將gradient boosting與bagging相結(jié)合,每一次迭代通過采樣的樣本子集來訓(xùn)練基學(xué)習(xí)器(對應(yīng)參數(shù)subsample),一般設(shè)置shrinkage比不設(shè)置要好,而加上行采樣會進一步提升效果,而僅使用行采樣可能效果反而不佳;而且進行行采樣后可使用包外估計來計算模型每一輪訓(xùn)練的效果提升,保存在屬性oob_improvement_里,可以用來做模型選擇,但是包外預(yù)估的結(jié)果通常比較悲觀,所以除非交叉驗證太過耗時,否則建議結(jié)合交叉驗證一起進行模型選擇
列采樣,類似隨機森林的做法,通過設(shè)置參數(shù)max_features來實現(xiàn)
單一的決策樹可以通過將樹結(jié)構(gòu)可視化來分析和解釋,而梯度上升模型因為由上百課回歸樹組成因此他們很難像單獨的決策樹一樣被可視化,不過也有一些技術(shù)來輔助解釋模型
特征重要性(featureimportances屬性),決策樹在選擇最佳分割點時間接地進行了特征的選擇,而這一信息可以用來評估每一個特征的重要性,基本思想是一個特征越經(jīng)常地被用來作為樹的切分特征(更加說明使用的是CART樹或其變體,因為ID3,C4.5都是特征用過一次后就不再用了),那么這個特征就越重要,而對于基于樹的集成模型而言可以通過對各個樹判斷的特征重要性做一個平均來表示特征的重要性
PDP(Partial dependence
plots),可以用來繪制目標(biāo)響應(yīng)與目標(biāo)特征集的依賴關(guān)系(控制其他的特征的值),受限于人類的感知,目標(biāo)特征集合一般設(shè)置為1或2才能繪制對應(yīng)的圖形(plot_partial_dependence),也可以通過函數(shù)partial_dependence來輸出原始的值
Notes:
GradientBoostingClassifier和GradientBoostingRegressor均支持對訓(xùn)練好的學(xué)習(xí)器的復(fù)用,通過設(shè)置warm_start=True可以在已經(jīng)訓(xùn)練好的模型上添加更多的基學(xué)習(xí)器
Voting的基本思想是將不同學(xué)習(xí)器的結(jié)果進行硬投票(多數(shù)表決)或者軟投票(對預(yù)測概率加權(quán)平均)來對樣本類別做出預(yù)估,其目的是用來平衡一些表現(xiàn)相當(dāng)且都還不錯的學(xué)習(xí)器的表現(xiàn),以消除它們各自的缺陷
硬投票(voting=’hard’):按照多數(shù)表決原則,根據(jù)分類結(jié)果中多數(shù)預(yù)測結(jié)果作為輸入樣本的預(yù)測類別,如果出現(xiàn)類別數(shù)目相同的情況,會按照預(yù)測類別的升序排序取前一個預(yù)測類別(比如模型一預(yù)測為類別‘2’,模型二預(yù)測為類別‘1’則樣本會被判為類別1)
軟投票:對不同基學(xué)習(xí)器的預(yù)測概率進行加權(quán)平均(因此使用軟投票的基學(xué)習(xí)器需要能夠預(yù)測概率),需設(shè)置參數(shù)wights為一個列表表示各個基學(xué)習(xí)器的權(quán)重值
XGBoost里可以使用兩種方式防止過擬合
直接控制模型復(fù)雜度
max_depth,基學(xué)習(xí)器的深度,增加該值會使基學(xué)習(xí)器變得更加復(fù)雜,榮易過擬合,設(shè)為0表示不設(shè)限制,對于depth-wise的基學(xué)習(xí)器學(xué)習(xí)方法需要控制深度
min_child_weight,子節(jié)點所需的樣本權(quán)重和(hessian)的最小閾值,若是基學(xué)習(xí)器切分后得到的葉節(jié)點中樣本權(quán)重和低于該閾值則不會進一步切分,在線性模型中該值就對應(yīng)每個節(jié)點的最小樣本數(shù),該值越大模型的學(xué)習(xí)約保守,同樣用于防止模型過擬合
gamma,葉節(jié)點進一步切分的最小損失下降的閾值(超過該值才進一步切分),越大則模型學(xué)習(xí)越保守,用來控制基學(xué)習(xí)器的復(fù)雜度(有點LightGBM里的leaf-wise切分的意味)
給模型訓(xùn)練增加隨機性使其對噪聲數(shù)據(jù)更加魯棒
行采樣:subsample
列采樣:colsample_bytree
步長:eta即shrinkage
對于XGBoost來說同樣是兩種方式
若只關(guān)注預(yù)測的排序表現(xiàn)(auc)
調(diào)整正負樣本的權(quán)重,使用scale_pos_weight
使用auc作為評價指標(biāo)
若關(guān)注預(yù)測出正確的概率值,這種情況下不能調(diào)整數(shù)據(jù)集的權(quán)重,可以通過設(shè)置參數(shù)max_delta_step為一個有限值比如1來加速模型訓(xùn)練的收斂
主要用于設(shè)置基學(xué)習(xí)器的類型
設(shè)置基學(xué)習(xí)器booster
基于樹的模型
gbtree
dart
線性模型
gblinear
線程數(shù)nthread,設(shè)置并行的線程數(shù),默認是最大線程數(shù)
在基學(xué)習(xí)器確定后,根據(jù)基學(xué)習(xí)器來設(shè)置的一些個性化的參數(shù)
eta,步長、學(xué)習(xí)率,每一輪boosting訓(xùn)練后可以得到新特征的權(quán)重,可以通過eta來適量縮小權(quán)重,使模型的學(xué)習(xí)過程更加保守一點,以防止過擬合
gamma,葉節(jié)點進一步切分的最小損失下降的閾值(超過該值才進一步切分),越大則模型學(xué)習(xí)越保守,用來控制基學(xué)習(xí)器的復(fù)雜度(有點LightGBM里的leaf-wise切分的意味)
max_depth,基學(xué)習(xí)器的深度,增加該值會使基學(xué)習(xí)器變得更加復(fù)雜,榮易過擬合,設(shè)為0表示不設(shè)限制,對于depth-wise的基學(xué)習(xí)器學(xué)習(xí)方法需要控制深度
min_child_weight,子節(jié)點所需的樣本權(quán)重和(hessian)的最小閾值,若是基學(xué)習(xí)器切分后得到的葉節(jié)點中樣本權(quán)重和低于該閾值則不會進一步切分,在線性模型中該值就對應(yīng)每個節(jié)點的最小樣本數(shù),該值越大模型的學(xué)習(xí)約保守,同樣用于防止模型過擬合
max_delta_step,樹的權(quán)重的最大估計值,設(shè)為0則表示不設(shè)限,設(shè)為整數(shù)會是模型學(xué)習(xí)相對保守,一般該參數(shù)不必設(shè)置,但是對于基學(xué)習(xí)器是LR時,在針對樣本分布極為不均的情況控制其值在1~10之間可以控制模型的更新
行采樣:subsample,基學(xué)習(xí)器使用樣本的比重
列采樣:
colsample_bytree,用于每棵樹劃分的特征比重
colsample_bylevel,用于每層劃分的特征比重
顯式正則化,增加該值是模型學(xué)習(xí)更為保守
L1:alpha
L2:lambda
tree_method,樹的構(gòu)建方法,準(zhǔn)確的說應(yīng)該是切分點的選擇算法,包括原始的貪心、近似貪心、直方圖算法(可見LightGBM這里并不是一個區(qū)別)
auto,啟發(fā)式地選擇分割方法,近似貪心或者貪心
exact,原始的貪心算法,既針對每一個特征值切分一次
approx,近似的貪心算法選取某些分位點進行切分,使用sketching和histogram
hist,直方圖優(yōu)化的貪心算法,對應(yīng)的參數(shù)有g(shù)row_policy,max_bin
gpu_exact
gpu_hist
scale_pos_weight,針對數(shù)據(jù)集類別分布不均,典型的值可設(shè)置為$$\frac{sum(negative cases)}{sum(positive cases)}$$
grow_policy,控制樹的生長方式,目前只有當(dāng)樹的構(gòu)建方法tree_method設(shè)置為hist時才可以使用所謂的leaf-wise生長方式
depthwise,按照離根節(jié)點最近的節(jié)點進行分裂
lossguide,優(yōu)先分裂損失變化大的節(jié)點,對應(yīng)的一個參數(shù)還有max_leaves,表示可增加的最大的節(jié)點數(shù)
max_bin,同樣針對直方圖算法tree_method設(shè)置為hist時用來控制將連續(xù)特征離散化為多個直方圖的直方圖數(shù)目
predictor,選擇使用GPU或者CPU
cpu_predictor
gpu_predictor
根據(jù)任務(wù)、目的設(shè)置的參數(shù),比如回歸任務(wù)與排序任務(wù)的目的是不同的
objective,訓(xùn)練目標(biāo),分類還是回歸
reg:linear,線性回歸
reg:logistic,邏輯回歸
binary:logistic,使用LR二分類,輸出概率
binary:logitraw,使用LR二分類,但在進行l(wèi)ogistic轉(zhuǎn)換之前直接輸出分類得分
count:poisson,泊松回歸
multi:softmax,使用softmax進行多分類,需要設(shè)置類別數(shù)num_class
multi:softprob
rank:pairwise,進行排序任務(wù),最小化pairwise損失
reg:gamma,gamma回歸
reg:tweedie,tweedie回歸
評價指標(biāo)eval_metric,默認根據(jù)目標(biāo)函數(shù)設(shè)置,針對驗證集,默認情況下,最小均方誤差用于回歸,錯分用于分類,平均精確率用于排序等,可以同時使用多個評估指標(biāo),在python里使用列表來放置
均方誤差rmse
平均絕對值誤差mae
對數(shù)損失logloss,負的對數(shù)似然
錯誤率error,根據(jù)0.5作為閾值判斷的錯分率
自定義閾值錯分率error@t
多分類錯分率merror
多分類對數(shù)損失mlogloss
auc主要用來排序
ndcg,normalized discounted cumulative gain及其他的一些針對泊松回歸等問題的評價指標(biāo)
num_round迭代次數(shù),也對應(yīng)基學(xué)習(xí)器數(shù)目
task當(dāng)前對模型的任務(wù),包括
訓(xùn)練train
預(yù)測pred
評估/驗證eval
導(dǎo)出模型dump
導(dǎo)入導(dǎo)出模型的路徑model_in和model_out
fmap,feature map用來導(dǎo)出模型
直方圖算法,LightGBM提供一種數(shù)據(jù)類型的封裝相對Numpy,Pandas,Array等數(shù)據(jù)對象而言節(jié)省了內(nèi)存的使用,原因在于他只需要保存離散的直方圖,LightGBM里默認的訓(xùn)練決策樹時使用直方圖算法,XGBoost里現(xiàn)在也提供了這一選項,不過默認的方法是對特征預(yù)排序,直方圖算法是一種犧牲了一定的切分準(zhǔn)確性而換取訓(xùn)練速度以及節(jié)省內(nèi)存空間消耗的算法
在訓(xùn)練決策樹計算切分點的增益時,預(yù)排序需要對每個樣本的切分位置計算,所以時間復(fù)雜度是O(#data)而LightGBM則是計算將樣本離散化為直方圖后的直方圖切割位置的增益即可,時間復(fù)雜度為O(#bins),時間效率上大大提高了(初始構(gòu)造直方圖是需要一次O(#data)的時間復(fù)雜度,不過這里只涉及到加和操作)
直方圖做差進一步提高效率,計算某一節(jié)點的葉節(jié)點的直方圖可以通過將該節(jié)點的直方圖與另一子節(jié)點的直方圖做差得到,所以每次分裂只需計算分裂后樣本數(shù)較少的子節(jié)點的直方圖然后通過做差的方式獲得另一個子節(jié)點的直方圖,進一步提高效率
節(jié)省內(nèi)存
將連續(xù)數(shù)據(jù)離散化為直方圖的形式,對于數(shù)據(jù)量較小的情形可以使用小型的數(shù)據(jù)類型來保存訓(xùn)練數(shù)據(jù)
不必像預(yù)排序一樣保留額外的對特征值進行預(yù)排序的信息
減少了并行訓(xùn)練的通信代價
對稀疏特征構(gòu)建直方圖時的時間復(fù)雜度為O(2*#非零數(shù)據(jù))
相對于level-wise的生長策略而言,這種策略每次都是選取當(dāng)前損失下降最多的葉節(jié)點進行分割使得整體模型的損失下降得更多,但是容易過擬合(特別當(dāng)數(shù)據(jù)量較小的時候),可以通過設(shè)置參數(shù)max_depth來控制樹身防止出現(xiàn)過擬合
Notes:XGBoost現(xiàn)在兩種方式都是支持的
對于類別類型特征我們原始的做法是進行獨熱編碼,但是這種做法對于基于樹的模型而言不是很好,對于基數(shù)較大的類別特征,可能會生成非常不平衡的樹并且需要一顆很深的樹才能達到較好的準(zhǔn)確率;比較好的做法是將類別特征劃分為兩個子集,直接劃分方法眾多(2^(k-1)-1),對于回歸樹而言有一種較高效的方法只需要O(klogk)的時間復(fù)雜度,基本思想是對類別按照與目標(biāo)標(biāo)簽的相關(guān)性進行重排序,具體一點是對于保存了類別特征的直方圖根據(jù)其累計值(sum_gradient/sum_hessian)重排序,在排序好的直方圖上選取最佳切分位置
使用collective communication算法替代了point-to-point communication算法提升了效率
特征并行是為了將尋找決策樹的最佳切分點這一過程并行化
傳統(tǒng)做法
對數(shù)據(jù)列采樣,即不同的機器上保留不同的特征子集
各個機器上的worker根據(jù)所分配的特征子集尋找到局部的最優(yōu)切分點(特征、閾值)
互相通信來從局部最佳切分點里得到最佳切分點
擁有最佳切分點的worker執(zhí)行切分操作,然后將切分結(jié)果傳送給其他的worker
其他的worker根據(jù)接收到的數(shù)據(jù)來切分?jǐn)?shù)據(jù)
傳統(tǒng)做法的缺點
計算量太大,并沒有提升切分的效率,時間復(fù)雜度為O(#data)(因為每個worker持有所有行,需要處理全部的記錄),當(dāng)數(shù)據(jù)量較大時特征并行并不能提升速度
切分結(jié)果的通信代價,大約為O(#data/8)(若一個數(shù)據(jù)樣本為1bit)
LightGBM的做法
讓每個機器保留整個完整的數(shù)據(jù)集(并不是經(jīng)過列采樣的數(shù)據(jù)),這樣就不必在切分后傳輸切分結(jié)果數(shù)據(jù),因為每個機器已經(jīng)持有完整的數(shù)據(jù)集
各個機器上的worker根據(jù)所分配的特征子集尋找到局部的最優(yōu)切分點(特征、閾值)
互相通信來從局部最佳切分點里得到最佳切分點
執(zhí)行最優(yōu)切分操作
Notes:典型的空間換時間,差別就是減少了傳輸切分結(jié)果的步驟,節(jié)省了這里的通信消耗
上述特征并行的方法并沒有根本解決尋找切分點的計算效率問題,當(dāng)記錄數(shù)過大時需要考慮數(shù)據(jù)并行的方法
傳統(tǒng)做法
行采樣,對數(shù)據(jù)進行橫向切分
worker使用分配到的局部數(shù)據(jù)構(gòu)建局部的直方圖
合并局部直方圖得到全局的直方圖
對全局直方圖尋找最優(yōu)切分點,然后進行切分
缺點:通信代價過高,若使用point-to-point的通信算法,每個機器的通信代價時間復(fù)雜度為O(#machine*#feature*#bin),若使用collective通信算法則通信代價為O(2*#feature*#bin)
LightGBM的做法(依然是降低通信代價)
不同于合并所有的局部直方圖獲得全局的直方圖,LightGBM通過Reduce Scatter方法來合并不同worker的無交叉的不同特征的直方圖,這樣找到該直方圖的局部最優(yōu)切分點,最后同步到全局最優(yōu)切分點
基于直方圖做差的方法,在通信的過程中可以只傳輸某一葉節(jié)點的直方圖,而對于其鄰居可通過做差的方式得到
通信的時間復(fù)雜度為O(0.5*#feature*#bin)
進一步減小了數(shù)據(jù)并行中的通信代價,通過兩輪的投票來減小特征直方圖中的通信消耗
LightGBM可以直接用類別特征進行訓(xùn)練,不必預(yù)先進行獨熱編碼,速度會提升不少,參數(shù)設(shè)置categorical_feature來指定數(shù)據(jù)中的類別特征列
sklearn-GBDT,XGBoost,LightGBM都支持早停止,不過在細節(jié)上略有不同
sklearn-GBDT中的early stopping是用來控制基學(xué)習(xí)器的生長的:通過參數(shù)min_impurity_split(原始)以及min_impurity_decrease來實現(xiàn),前者的是根據(jù)節(jié)點的不純度是否高于閾值,若不是則停止增長樹,作為葉節(jié)點;后者則根據(jù)分裂不純度下降值是否超過某一閾值來決定是否分裂(此外這里的early stopping似乎與XGBoost里顯示設(shè)置的early stopping不同,這里是控制樹的切分生長,而XGBoost則是控制基學(xué)習(xí)器的數(shù)目)
XGBoost和LightGBM里的early_stopping則都是用來控制基學(xué)習(xí)器的數(shù)目的
兩者都可以使用多組評價指標(biāo),但是不同之處在于XGBoost會根據(jù)指標(biāo)列表中的最后一項指標(biāo)控制模型的早停止,而LightGBM則會受到所有的評估指標(biāo)的影響
在使用early stopping控制迭代次數(shù)后,模型直接返回的是最后一輪迭代的學(xué)習(xí)器不一定是最佳學(xué)習(xí)器,而在做出預(yù)測時可以設(shè)置參數(shù)選擇某一輪的學(xué)習(xí)器作出預(yù)測
XGBoost里保存了三種狀態(tài)的學(xué)習(xí)器,分別是bst.best_score, bst.best_iteration, bst.best_ntree_limit,官方的建議是在做預(yù)測時設(shè)置為bst.best_ntree_limit,實際使用時感覺bst.best_iteration和bst.best_ntree_limit的表現(xiàn)上區(qū)別不大
LightGBM則僅提供了bst.best_iteration這一種方式
內(nèi)置cv
支持帶權(quán)重的數(shù)據(jù)輸入
可以保留模型
DART
L1/L2回歸
保存模型進行進一步訓(xùn)練
多組驗證集
回歸任務(wù)
分類(二分類、多分類)
排序
絕對值誤差l1
平方誤差l2
均方誤差l2_root
對數(shù)損失binary_logloss,multi_logloss
分類誤差率binary_error,multi_error
auc
ndcg
多分類對數(shù)損失
多分類分類誤差率
葉節(jié)點數(shù)num_leaves,與模型復(fù)雜度直接相關(guān)(leaf-wise)
任務(wù)目標(biāo)
回歸regression,對應(yīng)的損失函數(shù)如下
regression_l1,加了l1正則的回歸,等同于絕對值誤差
regression_l2,等同于均方誤差
huber,Huber Loss
fair,Fair Loss
poisson,泊松回歸
分類
binary,二分類
multiclass,多分類
排序
lambdarank
模型
boosting
gbdt,傳統(tǒng)的梯度提升決策樹
rf,隨機森林
dart,Dropouts meet Multiple Additive Regression Trees
goss,Gradient-based One-Side Sampling
迭代次數(shù)num_iterations,對于多分類問題,LightGBM會構(gòu)建num_class*num_iterations的樹
學(xué)習(xí)率/步長learning_rate,即shrinkage
樹的訓(xùn)練方式tree_learner,主要用來控制樹是否并行化訓(xùn)練
serial,單機的樹學(xué)習(xí)器
feature,特征并行的樹學(xué)習(xí)器
data,數(shù)據(jù)并行的樹學(xué)習(xí)器
線程數(shù)num_threads
設(shè)備device,使用cpu還是gpu
cpu
gpu
樹的最大深度max_depth,主要用來避免模型的過擬合,設(shè)為負數(shù)值則表明不限制
葉節(jié)點的最少樣本數(shù)min_data_in_leaf
葉節(jié)點的最小海森值之和min_sum_hessian_in_leaf
列采樣feature_fraction,每棵樹的特征子集占比,設(shè)置在0~1之間,可以加快訓(xùn)練速度,避免過擬合
行采樣bagging_fraction,不進行重采樣的隨機選取部分樣本數(shù)據(jù),此外需要設(shè)置參數(shù)bagging_freq來作為采樣的頻率,即多少輪迭代做一次bagging;
早停止early_stopping_roung,在某一驗證數(shù)據(jù)的某一驗證指標(biāo)當(dāng)前最后一輪迭代沒有提升時停止迭代
正則化
lambda_l1
lambda_l2
切分的最小收益min_gain_to_split
最大直方圖數(shù)max_bin,特征值裝載的最大直方圖數(shù)目,一般較小的直方圖數(shù)目會降低訓(xùn)練的準(zhǔn)確性但會提升整體的表現(xiàn),處理過擬合
直方圖中最少樣本數(shù)min_data_in_bin,設(shè)置每個直方圖中樣本數(shù)的最小值,同樣防止過擬合
是否預(yù)排序is_pre_partition
是否稀疏is_sparse
類別特征列categorical_feature,聲明類別特征對應(yīng)的列(通過索引標(biāo)記),僅支持int類型
聲明權(quán)重列weight,指定一列作為權(quán)重列
分階段加載數(shù)據(jù)two_round,一般LightGBM將數(shù)據(jù)載入內(nèi)存進行處理,這樣會提升數(shù)據(jù)的加載速度,但是對于數(shù)據(jù)量較大時會造成內(nèi)存溢出,所以此時需要分階段載入
保存數(shù)據(jù)為二進制save_binary,將數(shù)據(jù)文件導(dǎo)出為二進制文件,下次加載數(shù)據(jù)時就會更快一些
是否處理缺失值use_missing
是否將0值作為缺失值zeros_as_missing
sigmoid,sigmoid函數(shù)中的參數(shù),用于二分類和排序任務(wù)
scale_pos_weight,設(shè)置正例在二分類任務(wù)中的樣本占比
初始化為均值boost_from_average,調(diào)整初始的分?jǐn)?shù)為標(biāo)簽的均值,加速模型訓(xùn)練的收斂速度,僅用于回歸任務(wù)
樣本類別是否不平衡is_unbalance
num_class,用于多分類
num_leaves,對于leaf-wise的模型而言該參數(shù)是用來控制模型復(fù)雜度的主要參數(shù),理論上可以通過設(shè)置num_leaves=2^(max_depth)來設(shè)置該參數(shù)值,實際是不可取的,因為在節(jié)點數(shù)目相同的前提下,對于leaf-wise的模型會傾向于生成深度更深的模型,如果生硬的設(shè)置為2^(max_depth)可能會造成模型的過擬合,一般設(shè)置的值小于2^(max_depth),
min_data_in_leaf,在設(shè)置了葉節(jié)點數(shù)后,該值會對模型復(fù)雜度造成影響,若設(shè)的較大則樹不會生長的很深,但可能造成模型的欠擬合
max_depth
bagging_fraction和bagging_freq,使用bagging進行行采樣提升訓(xùn)練速度(減小了數(shù)據(jù)集)
feature_fraction,列采樣
設(shè)置較少的直方圖數(shù)目,max_bin
保存數(shù)據(jù)為二進制文件以便于未來訓(xùn)練時能快速加載,save_binary
通過并行訓(xùn)練來提速
設(shè)置較大的直方圖數(shù)目max_bin,當(dāng)然這樣會犧牲訓(xùn)練速度
使用較小的學(xué)習(xí)率learning_rate,這樣會增加迭代次數(shù)
設(shè)置較大的葉節(jié)點數(shù)num_leaves,可能造成模型過擬合
使用較大的訓(xùn)練數(shù)據(jù)
嘗試dart模型
設(shè)置較少的直方圖數(shù)目,max_bin
設(shè)置較小的葉節(jié)點數(shù)num_leaves
設(shè)置參數(shù)min_data_in_leaf和min_sum__hessian_in_leaf
使用bagging進行行采樣bagging_fraction和bagging_freq
feature_fraction,列采樣
使用較大的訓(xùn)練數(shù)據(jù)
正則化
lambda_l1
lambda_l2
切分的最小收益min_gain_to_split
控制樹深max_depth
GBDT vs. XGBoost vs. LightGBM(論文層面)
GBDT無顯式正則化
GBDT僅使用了目標(biāo)函數(shù)一階泰勒展開,而XGBoost使用了二階的泰勒展開值
為什么二階展開?
一說加快收斂速度
另外有說本身模型訓(xùn)練的學(xué)習(xí)率shrinkage可以通過二階導(dǎo)數(shù)做一個逼近,而原始的GBDT沒有計算這個,所以一般是通過預(yù)設(shè)的超參數(shù)eta人為指定
XGBoost加入了列采樣
XGBoost對缺失值的處理
XGBoost通過預(yù)排序的方法來實現(xiàn)特征并行,提高模型訓(xùn)練效率
XGBoost支持分布式計算
樹的切分策略不同
XGBoost是level-wise而LightGBM是leaf-wise
實現(xiàn)并行的方式不同
XGBoost是通過預(yù)排序的方式
LightGBM則是通過直方圖算法
LightGBM直接支持類別特征,對類別特征不必進行獨熱編碼處理
sklearn GBDT vs. XGBoost vs. LightGBM(實現(xiàn)層面)
實際在庫的實現(xiàn)層面原始論文里的很多區(qū)別是不存在的,差異更多在一些工程上的性能優(yōu)化
正則化方式不同
sklearn GBDT中僅僅通過學(xué)習(xí)率來做一個正則化(影響到基學(xué)習(xí)器的數(shù)目),此外gbdt里的early stopping也達到了一個正則化的效果,對應(yīng)的主要參數(shù)是min_impurity_split即控制了判斷葉節(jié)點是否進一步切分的不純度的閾值,若超過該閾值則可以進一步切分,否則不行,故而控制了樹的深度即控制了基學(xué)習(xí)器的復(fù)雜度
XGBoost除了學(xué)習(xí)率以外還有顯示的設(shè)置正則化項l1,l2以及對應(yīng)論文里的葉節(jié)點數(shù)(對應(yīng)參數(shù)gamma)以及節(jié)點權(quán)重和(參數(shù)min_child_weight)來控制模型復(fù)雜度
GBDT僅使用了目標(biāo)函數(shù)一階泰勒展開,而XGBoost使用了二階的泰勒展開值
XGBoost自有一套對缺失值的處理方法
early-stopping意義不同
sklearn GBDT中控制基學(xué)習(xí)器進一步切分、生長
XGBoost控制基學(xué)習(xí)器的數(shù)目
特征重要性的判斷標(biāo)準(zhǔn)
sklearn GBDT是根據(jù)樹的節(jié)點特征對應(yīng)的深度來判斷
XGBoost則有三種方法(get_score)
weight:特征用來作為切分特征的次數(shù)
gain:使用特征進行切分的平均增益
cover:各個樹中該特征平均覆蓋情況(根據(jù)樣本?)
樹的切分算法
XGBoost存在三種切分方法,
原始的貪心算法(每個特征值切分)
近似貪心(分位點切分)(使得對于大量的特征取值尤其是連續(xù)變量時XGBoost會比sklearn-gbdt快很多)
直方圖算法
XGBoost支持level-wise和leaf-wise兩種樹的生長方式
XGBoost支持GPU
XGBoost支持多種評價標(biāo)準(zhǔn)、支持多種任務(wù)(回歸、分類、排序)
XGBoost目前已經(jīng)實現(xiàn)了LightGBM之前不同的一些方法比如直方圖算法,兩者的區(qū)別更多的在與LightGBM優(yōu)化通信的的一些處理上
LightGBM直接支持類別特征,可以不必預(yù)先進行獨熱編碼,提高效率(categorical_feature)
優(yōu)化通信代價
特征并行
數(shù)據(jù)并行
point to point communication–>collective communication
使用多項評價指標(biāo)同時評價時兩者的早停止策略不同,XGBoost是根據(jù)評價指標(biāo)列表中的最后一項來作為停止標(biāo)準(zhǔn),而LightGBM則受到所有評價指標(biāo)的影響
參考資料
? ? ?
? ? ? ? ?