集成方法的目的是結合一些基於某些算法訓練獲得的基學習器來改進其泛化能力和魯棒性(相對單個的基學習器而言)
主流的兩種作法分別是:node
獨立的訓練一些基學習器(通常傾向於強大而複雜的模型好比徹底生長的決策樹),而後綜合他們的預測結果,一般集成模型的效果會優於基學習器,由於模型的方差有所下降。python
oob_score=True
來經過包外估計來估計模型的泛化偏差(也就不須要進行交叉驗證了)Note:方差的產生主要是不一樣的樣本訓練獲得的學習器對於同一組測試集作出分類、預測結果的波動性,究其緣由是基學習器可能學到了所供學習的訓練樣本中的局部特徵或者說是擬合了部分噪聲數據,這樣綜合不一樣的學習器的結果,採起多數表決(分類)或者平均(迴歸)的方法能夠有效改善這一情況git
Notes:算法
隨機森林的行採樣(bagging)和列採樣(feature bagging)都是爲了減少模型之間的相關性使基學習器變得不一樣從而減少集成模型的方差bootstrap
Extra-Trees(extremely randomized trees):相較於rf進一步加強了隨機性,rf是對各個基學習器隨機挑選了部分特徵來作維特徵子集從中挑選最佳的特徵切分,而Extra-Trees更進一步,在特徵子集裏挑選最佳特徵時不是選擇最有區分度的特徵值,而是隨機選擇這一劃分的閾值(該閾值在子特徵集裏的特徵對應的採樣後的樣本取值範圍裏隨機選取),而不一樣的隨機閾值下的特徵中表現最佳的做爲劃分特徵,這樣其實加強了隨機性,更進一步整大了基學習器的誤差但下降了總體的方差性能優化
特徵重要性評估:一棵樹中的特徵的排序(好比深度)能夠用來做爲特徵相對重要性的一個評估,居於樹頂端的特徵相對而言對於最終樣本的劃分貢獻最大(通過該特徵劃分所涉及的樣本比重最大),這樣能夠經過對比各個特徵所劃分的樣本比重的一個指望值來評估特徵的相對重要性,而在隨機森林中,經過對於不一樣樹的特徵的指望取一個平都可以減少評估結果的方差,以供特徵選擇;在sklearn中這些評估最後被保存在訓練好的模型的參數featureimportances裏,是各個特徵的重要性值通過歸一化的結果,越高表明特徵越匹配預測函數網絡
Notes:app
一個接一個的(串行)訓練基學習器,每個基學習器主要用來修正前面學習器的誤差。dom
_Notes:調參的關鍵參數是基學習器的數量n_estimators
以及基學習器自己的複雜性好比深度max_depth
或者葉節點所需的最少樣本數min_samples_leaf
_分佈式
Gradient Tree Boosting或者說GBRT是boosting的一種推廣,是的能夠應用通常的損失函數,能夠處理分類問題和迴歸問題,應用普遍,常見應用場景好比網頁搜索排序和社會生態學
GradientBoostingClassifier
n_estimators
max_depth
或者葉節點數目max_leaf_nodes
來控制(注意兩種樹的生長方式不一樣,max_leaf_nodes
是針對葉節點優先挑選不純度降低最多的葉節點,這裏有點LightGBM的’leaf-wise’的意味,而按樹深分裂則更相似於原始的以及XGBoost的分裂方式)learning_rate
對應取值範圍在(0,1]之間的超參數對應GBRT裏的shrinkage來避免過擬合(是sklearn裏的GBDT用來進行正則化的一種策略);n_classes
對應每輪迭代的迴歸樹,這樣整體樹的數目是n_classes*n_estimators
criterion
用來設置迴歸樹的切分策略
friedman_mse
,對應的最小平方偏差的近似,加入了Friedman的一些改進mse
對應最小平方偏差mae
對應平均絕對值偏差subsample
:行採樣,對樣本採樣,即訓練每一個基學習器時再也不使用原始的所有數據集,而是使用一部分,而且使用隨機梯度上升法來作集成模型的訓練max_features
在訓練基學習器時使用一個特徵子集來訓練,相似隨機森林的作法min_impurity_split
(原始)以及min_impurity_decrease
來實現,前者的是根據節點的不純度是否高於閾值,若不是則中止增加樹,做爲葉節點;後者則根據分裂不純度降低值是否超過某一閾值來決定是否分裂(此外這裏的early stopping彷佛與XGBoost裏顯示設置的early stopping不一樣,這裏是控制樹的切分生長,而XGBoost則是控制基學習器的數目)init
,用來計算初始基學習器的預測,須要具有fit
和predict
方法,若未設置則默認爲loss.init_estimator
warm_start
,若設置爲True則可使用已經訓練好的學習器,而且在其上添加更多的基學習器presort
,默認設置爲自動,對樣本按特徵值進行預排序從而提升尋找最優切分點的效率,自動模式下對稠密數據會使用預排序,而對稀疏數據則不會loss
)
n_classes
互斥的多分類,提供機率估計,初始模型值設爲各種別的先驗機率,每一輪迭代須要構建n類迴歸樹可能會使得模型對於多類別的大數據集不過高效feature_importances_
):進行特徵重要性的評估oob_improvement_
),使用包外樣原本計算每一輪訓練後模型的表現提高train_score_
)estimators_
)fit
方法裏能夠設置樣本權重sample_weight
,monitor
能夠用來回調一些方法好比包外估計、早中止等GradientBoostingRegressor
ls
train_score_
可得到每輪訓練的訓練偏差,經過方法staged_predict
能夠得到每一階段的測試偏差,經過屬性feature_importances_
能夠輸出模型判斷的特徵相對重要性learning rate
一種簡單的正則化的策略,經過控制每個基學習器的貢獻,會影響到基學習器的數目即n_estimators
,經驗性的設置爲一個較小的值,好比不超過0.1的常數值,而後使用early stopping來控制基學習器的數目subsample
),通常設置shrinkage比不設置要好,而加上行採樣會進一步提高效果,而僅使用行採樣可能效果反而不佳;並且進行行採樣後可以使用包外估計來計算模型每一輪訓練的效果提高,保存在屬性oob_improvement_
裏,能夠用來作模型選擇,可是包外預估的結果一般比較悲觀,因此除非交叉驗證太過耗時,不然建議結合交叉驗證一塊兒進行模型選擇max_features
來實現單一的決策樹能夠經過將樹結構可視化來分析和解釋,而梯度上升模型由於由上百課迴歸樹組成所以他們很難像單獨的決策樹同樣被可視化,不過也有一些技術來輔助解釋模型
Notes:
Voting的基本思想是將不一樣學習器的結果進行硬投票(多數表決)或者軟投票(對預測機率加權平均)來對樣本類別作出預估,其目的是用來平衡一些表現至關且都還不錯的學習器的表現,以消除它們各自的缺陷
voting
=’hard’):按照多數表決原則,根據分類結果中多數預測結果做爲輸入樣本的預測類別,若是出現類別數目相同的狀況,會按照預測類別的升序排序取前一個預測類別(好比模型一預測爲類別‘2’,模型二預測爲類別‘1’則樣本會被判爲類別1)wights
爲一個列表表示各個基學習器的權重值XGBoost裏可使用兩種方式防止過擬合
max_depth
,基學習器的深度,增長該值會使基學習器變得更加複雜,榮易過擬合,設爲0表示不設限制,對於depth-wise的基學習器學習方法須要控制深度min_child_weight
,子節點所需的樣本權重和(hessian)的最小閾值,如果基學習器切分後獲得的葉節點中樣本權重和低於該閾值則不會進一步切分,在線性模型中該值就對應每一個節點的最小樣本數,該值越大模型的學習約保守,一樣用於防止模型過擬合gamma
,葉節點進一步切分的最小損失降低的閾值(超過該值才進一步切分),越大則模型學習越保守,用來控制基學習器的複雜度(有點LightGBM裏的leaf-wise切分的意味)subsample
colsample_bytree
eta
即shrinkage對於XGBoost來講一樣是兩種方式
scale_pos_weight
max_delta_step
爲一個有限值好比1來加速模型訓練的收斂主要用於設置基學習器的類型
booster
nthread
,設置並行的線程數,默認是最大線程數在基學習器肯定後,根據基學習器來設置的一些個性化的參數
eta
,步長、學習率,每一輪boosting訓練後能夠獲得新特徵的權重,能夠經過eta來適量縮小權重,使模型的學習過程更加保守一點,以防止過擬合gamma
,葉節點進一步切分的最小損失降低的閾值(超過該值才進一步切分),越大則模型學習越保守,用來控制基學習器的複雜度(有點LightGBM裏的leaf-wise切分的意味)max_depth
,基學習器的深度,增長該值會使基學習器變得更加複雜,榮易過擬合,設爲0表示不設限制,對於depth-wise的基學習器學習方法須要控制深度min_child_weight
,子節點所需的樣本權重和(hessian)的最小閾值,如果基學習器切分後獲得的葉節點中樣本權重和低於該閾值則不會進一步切分,在線性模型中該值就對應每一個節點的最小樣本數,該值越大模型的學習約保守,一樣用於防止模型過擬合max_delta_step
,樹的權重的最大估計值,設爲0則表示不設限,設爲整數會是模型學習相對保守,通常該參數沒必要設置,可是對於基學習器是LR時,在針對樣本分佈極爲不均的狀況控制其值在1~10之間能夠控制模型的更新subsample
,基學習器使用樣本的比重colsample_bytree
,用於每棵樹劃分的特徵比重colsample_bylevel
,用於每層劃分的特徵比重alpha
lambda
tree_method
,樹的構建方法,準確的說應該是切分點的選擇算法,包括原始的貪心、近似貪心、直方圖算法(可見LightGBM這裏並非一個區別)
auto
,啓發式地選擇分割方法,近似貪心或者貪心exact
,原始的貪心算法,既針對每個特徵值切分一次approx
,近似的貪心算法選取某些分位點進行切分,使用sketching和histogramhist
,直方圖優化的貪心算法,對應的參數有grow_policy
,max_bin
gpu_exact
gpu_hist
scale_pos_weight
,針對數據集類別分佈不均,典型的值可設置爲
grow_policy
,控制樹的生長方式,目前只有當樹的構建方法tree_method
設置爲hist
時纔可使用所謂的leaf-wise
生長方式
depthwise
,按照離根節點最近的節點進行分裂lossguide
,優先分裂損失變化大的節點,對應的一個參數還有max_leaves
,表示可增長的最大的節點數max_bin
,一樣針對直方圖算法tree_method
設置爲hist
時用來控制將連續特徵離散化爲多個直方圖的直方圖數目predictor
,選擇使用GPU或者CPU
cpu_predictor
gpu_predictor
根據任務、目的設置的參數,好比迴歸任務與排序任務的目的是不一樣的
reg:linear
,線性迴歸reg:logistic
,邏輯迴歸binary:logistic
,使用LR二分類,輸出機率binary:logitraw
,使用LR二分類,但在進行logistic轉換以前直接輸出分類得分count:poisson
,泊松迴歸multi:softmax
,使用softmax進行多分類,須要設置類別數num_class
multi:softprob
rank:pairwise
,進行排序任務,最小化pairwise損失reg:gamma
,gamma迴歸reg:tweedie
,tweedie迴歸eval_metric
,默認根據目標函數設置,針對驗證集,默認狀況下,最小均方偏差用於迴歸,錯分用於分類,平均精確率用於排序等,能夠同時使用多個評估指標,在python裏使用列表來放置
rmse
mae
logloss
,負的對數似然error
,根據0.5做爲閾值判斷的錯分率error@t
merror
mlogloss
auc
主要用來排序ndcg
,normalized discounted cumulative gain及其餘的一些針對泊松迴歸等問題的評價指標num_round
迭代次數,也對應基學習器數目task
當前對模型的任務,包括
train
pred
eval
dump
model_in
和model_out
fmap
,feature map用來導出模型直方圖算法,LightGBM提供一種數據類型的封裝相對Numpy,Pandas,Array等數據對象而言節省了內存的使用,緣由在於他只須要保存離散的直方圖,LightGBM裏默認的訓練決策樹時使用直方圖算法,XGBoost裏如今也提供了這一選項,不過默認的方法是對特徵預排序,直方圖算法是一種犧牲了必定的切分準確性而換取訓練速度以及節省內存空間消耗的算法
對稀疏特徵構建直方圖時的時間複雜度爲O(2*#非零數據)
相對於level-wise的生長策略而言,這種策略每次都是選取當前損失降低最多的葉節點進行分割使得總體模型的損失降低得更多,可是容易過擬合(特別當數據量較小的時候),能夠經過設置參數max_depth
來控制樹身防止出現過擬合
Notes:XGBoost如今兩種方式都是支持的
對於類別類型特徵咱們原始的作法是進行獨熱編碼,可是這種作法對於基於樹的模型而言不是很好,對於基數較大的類別特徵,可能會生成很是不平衡的樹而且須要一顆很深的樹才能達到較好的準確率;比較好的作法是將類別特徵劃分爲兩個子集,直接劃分方法衆多(2^(k-1)-1),對於迴歸樹而言有一種較高效的方法只須要O(klogk)的時間複雜度,基本思想是對類別按照與目標標籤的相關性進行重排序,具體一點是對於保存了類別特徵的直方圖根據其累計值(sum_gradient/sum_hessian)重排序,在排序好的直方圖上選取最佳切分位置
使用collective communication算法替代了point-to-point communication算法提高了效率
特徵並行是爲了將尋找決策樹的最佳切分點這一過程並行化
Notes:典型的空間換時間,差異就是減小了傳輸切分結果的步驟,節省了這裏的通訊消耗
上述特徵並行的方法並無根本解決尋找切分點的計算效率問題,當記錄數過大時須要考慮數據並行的方法
進一步減少了數據並行中的通訊代價,經過兩輪的投票來減少特徵直方圖中的通訊消耗
LightGBM能夠直接用類別特徵進行訓練,沒必要預先進行獨熱編碼,速度會提高很多,參數設置categorical_feature
來指定數據中的類別特徵列
sklearn-GBDT,XGBoost,LightGBM都支持早中止,不過在細節上略有不一樣
min_impurity_split
(原始)以及min_impurity_decrease
來實現,前者的是根據節點的不純度是否高於閾值,若不是則中止增加樹,做爲葉節點;後者則根據分裂不純度降低值是否超過某一閾值來決定是否分裂(此外這裏的early stopping彷佛與XGBoost裏顯示設置的early stopping不一樣,這裏是控制樹的切分生長,而XGBoost則是控制基學習器的數目)bst.best_score, bst.best_iteration, bst.best_ntree_limit
,官方的建議是在作預測時設置爲bst.best_ntree_limit
,實際使用時感受bst.best_iteration
和 bst.best_ntree_limit
的表現上區別不大bst.best_iteration
這一種方式METRIC
l1
l2
l2_root
binary_logloss
,multi_logloss
binary_error
,multi_error
num_leaves
,與模型複雜度直接相關(leaf-wise)regression
,對應的損失函數以下
regression_l1
,加了l1正則的迴歸,等同於絕對值偏差regression_l2
,等同於均方偏差huber
,Huber Lossfair
,Fair Losspoisson
,泊松迴歸binary
,二分類multiclass
,多分類lambdarank
boosting
gbdt
,傳統的梯度提高決策樹rf
,隨機森林dart
,Dropouts meet Multiple Additive Regression Treesgoss
,Gradient-based One-Side Samplingnum_iterations
,對於多分類問題,LightGBM會構建num_class*num_iterations的樹learning_rate
,即shrinkagetree_learner
,主要用來控制樹是否並行化訓練
serial
,單機的樹學習器feature
,特徵並行的樹學習器data
,數據並行的樹學習器num_threads
device
,使用cpu仍是gpu
cpu
gpu
max_depth
,主要用來避免模型的過擬合,設爲負數值則代表不限制min_data_in_leaf
min_sum_hessian_in_leaf
feature_fraction
,每棵樹的特徵子集佔比,設置在0~1之間,能夠加快訓練速度,避免過擬合bagging_fraction
,不進行重採樣的隨機選取部分樣本數據,此外須要設置參數bagging_freq
來做爲採樣的頻率,即多少輪迭代作一次bagging;early_stopping_roung
,在某一驗證數據的某一驗證指標當前最後一輪迭代沒有提高時中止迭代lambda_l1
lambda_l2
min_gain_to_split
max_bin
,特徵值裝載的最大直方圖數目,通常較小的直方圖數目會下降訓練的準確性但會提高總體的表現,處理過擬合min_data_in_bin
,設置每一個直方圖中樣本數的最小值,一樣防止過擬合is_pre_partition
is_sparse
categorical_feature
,聲明類別特徵對應的列(經過索引標記),僅支持int類型weight
,指定一列做爲權重列two_round
,通常LightGBM將數據載入內存進行處理,這樣會提高數據的加載速度,可是對於數據量較大時會形成內存溢出,因此此時須要分階段載入save_binary
,將數據文件導出爲二進制文件,下次加載數據時就會更快一些use_missing
zeros_as_missing
sigmoid
,sigmoid函數中的參數,用於二分類和排序任務scale_pos_weight
,設置正例在二分類任務中的樣本佔比boost_from_average
,調整初始的分數爲標籤的均值,加速模型訓練的收斂速度,僅用於迴歸任務is_unbalance
num_class
,用於多分類num_leaves
,對於leaf-wise的模型而言該參數是用來控制模型複雜度的主要參數,理論上能夠經過設置num_leaves
=2^(max_depth)來設置該參數值,實際是不可取的,由於在節點數目相同的前提下,對於leaf-wise的模型會傾向於生成深度更深的模型,若是生硬的設置爲2^(max_depth)可能會形成模型的過擬合,通常設置的值小於2^(max_depth),min_data_in_leaf
,在設置了葉節點數後,該值會對模型複雜度形成影響,若設的較大則樹不會生長的很深,但可能形成模型的欠擬合max_depth
bagging_fraction
和bagging_freq
,使用bagging進行行採樣提高訓練速度(減少了數據集)feature_fraction
,列採樣max_bin
save_binary
max_bin
,固然這樣會犧牲訓練速度learning_rate
,這樣會增長迭代次數num_leaves
,可能形成模型過擬合dart
模型max_bin
num_leaves
min_data_in_leaf
和min_sum__hessian_in_leaf
bagging_fraction
和bagging_freq
feature_fraction
,列採樣lambda_l1
lambda_l2
min_gain_to_split
max_depth
實際在庫的實現層面原始論文裏的不少區別是不存在的,差別更多在一些工程上的性能優化
min_impurity_split
即控制了判斷葉節點是否進一步切分的不純度的閾值,若超過該閾值則能夠進一步切分,不然不行,故而控制了樹的深度即控制了基學習器的複雜度XGBoost目前已經實現了LightGBM以前不一樣的一些方法好比直方圖算法,二者的區別更多的在與LightGBM優化通訊的的一些處理上