XGBoost、LightGBM的詳細對比介紹

sklearn集成方法

集成方法的目的是結合一些基於某些算法訓練獲得的基學習器來改進其泛化能力和魯棒性(相對單個的基學習器而言)
主流的兩種作法分別是:node

bagging

基本思想

獨立的訓練一些基學習器(通常傾向於強大而複雜的模型好比徹底生長的決策樹),而後綜合他們的預測結果,一般集成模型的效果會優於基學習器,由於模型的方差有所下降。python

常見變體(按照樣本採樣方式的不一樣劃分)

  • Pasting:直接從樣本集裏隨機抽取的到訓練樣本子集
  • Bagging:自助採樣(有放回的抽樣)獲得訓練子集
  • Random Subspaces:列採樣,按照特徵進行樣本子集的切分
  • Random Patches:同時進行行採樣、列採樣獲得樣本子集

sklearn-bagging

學習器

  • BaggingClassifier
  • BaggingRegressor

參數

  • 可自定義基學習器
  • max_samples,max_features控制樣本子集的大小
  • bootstrap,bootstrap_features控制是否使用自主採樣法
    • 當使用自助採樣法時,能夠設置參數oob_score=True來經過包外估計來估計模型的泛化偏差(也就不須要進行交叉驗證了)

Note:方差的產生主要是不一樣的樣本訓練獲得的學習器對於同一組測試集作出分類、預測結果的波動性,究其緣由是基學習器可能學到了所供學習的訓練樣本中的局部特徵或者說是擬合了部分噪聲數據,這樣綜合不一樣的學習器的結果,採起多數表決(分類)或者平均(迴歸)的方法能夠有效改善這一情況git

sklearn-forests of randomized trees

學習器

  • RandomForest: 採起自主採樣法構造多個基學習器,而且在學習基學習器時,不是使用所有的特徵來選擇最優切分點,而是先隨機選取一個特徵子集隨後在特徵子集裏挑選最優特徵進行切分;這種作法會使得各個基學習器的誤差略微提高,但在總體上下降了集成模型的方差,因此會獲得總體上不錯的模型
    • RandomForestClassifier
    • RandomForestRegressor

Notes:算法

  • 不一樣於原始的模型實現(讓各個基學習器對樣本的分類進行投票),sklearn裏隨機森林的實現是經過將各個基學習器的預測機率值取平均來獲得最終分類
  • 隨機森林的行採樣(bagging)和列採樣(feature bagging)都是爲了減少模型之間的相關性使基學習器變得不一樣從而減少集成模型的方差bootstrap

  • Extra-Trees(extremely randomized trees):相較於rf進一步加強了隨機性,rf是對各個基學習器隨機挑選了部分特徵來作維特徵子集從中挑選最佳的特徵切分,而Extra-Trees更進一步,在特徵子集裏挑選最佳特徵時不是選擇最有區分度的特徵值,而是隨機選擇這一劃分的閾值(該閾值在子特徵集裏的特徵對應的採樣後的樣本取值範圍裏隨機選取),而不一樣的隨機閾值下的特徵中表現最佳的做爲劃分特徵,這樣其實加強了隨機性,更進一步整大了基學習器的誤差但下降了總體的方差性能優化

    • ExtraTreesClassifier
    • ExtraTreesRegressor

調參

  • 最重要的兩個參數
    • n_estimators:森林中樹的數量,初始越多越好,可是會增長訓練時間,到達必定數量後模型的表現不會再有顯著的提高
    • max_features:各個基學習器進行切分時隨機挑選的特徵子集中的特徵數目,數目越小模型總體的方差會越小,可是單模型的誤差也會上升,經驗性的設置迴歸問題的max_features爲總體特徵數目,而分類問題則設爲總體特徵數目開方的結果
  • 其餘參數
    • max_depth:樹的最大深度,經驗性的設置爲None(即不設限,徹底生長)
    • min_samples_split,節點最小分割的樣本數,表示當前樹節點還能夠被進一步切割的含有的最少樣本數;經驗性的設置爲1,緣由同上
    • bootstrap,rf裏默認是True也就是採起自助採樣,而Extra-Trees則是默認關閉的,是用整個數據集的樣本,當bootstrap開啓時,一樣能夠設置oob_score爲True進行包外估計測試模型的泛化能力
    • n_jobs,並行化,能夠在機器的多個核上並行的構造樹以及計算預測值,不過受限於通訊成本,可能效率並不會說分爲k個線程就獲得k倍的提高,不過總體而言相對須要構造大量的樹或者構建一棵複雜的樹而言仍是高效的
    • criterion:切分策略:gini或者entropy,默認是gini,與樹相關
    • min_impurity_split–>min_impurity_decrease:用來進行早中止的參數,判斷樹是否進一步分支,原先是比較不純度是否仍高於某一閾值,0.19後是判斷不純度的下降是否超過某一閾值
    • warm_start:若設爲True則能夠再次使用訓練好的模型並向其中添加更多的基學習器
    • class_weight:設置數據集中不一樣類別樣本的權重,默認爲None,也就是全部類別的樣本權重均爲1,數據類型爲字典或者字典列表(多類別)
      • balanced:根據數據集中的類別的佔比來按照比例進行權重設置n_samples/(n_classes*np.bincount(y))
      • balanced_subsamples:相似balanced,不過權重是根據自助採樣後的樣原本計算

方法

  • predict(X):返回輸入樣本的預測類別,返回類別爲各個樹預測機率均值的最大值
  • predict_log_proba(X):
  • predict_proba(X):返回輸入樣本X屬於某一類別的機率,經過計算隨機森林中各樹對於輸入樣本的平均預測機率獲得,每棵樹輸出的機率由葉節點中類別的佔比獲得
  • score(X,y):返回預測的平均準確率

特徵選擇

特徵重要性評估:一棵樹中的特徵的排序(好比深度)能夠用來做爲特徵相對重要性的一個評估,居於樹頂端的特徵相對而言對於最終樣本的劃分貢獻最大(通過該特徵劃分所涉及的樣本比重最大),這樣能夠經過對比各個特徵所劃分的樣本比重的一個指望值來評估特徵的相對重要性,而在隨機森林中,經過對於不一樣樹的特徵的指望取一個平都可以減少評估結果的方差,以供特徵選擇;在sklearn中這些評估最後被保存在訓練好的模型的參數featureimportances裏,是各個特徵的重要性值通過歸一化的結果,越高表明特徵越匹配預測函數網絡

Notes:app

  • 此外sklearn還有一種RandomTreesEmbedding的實現,不是很清楚有何特殊用途

隨機森林與KNN

  • 類似之處:均屬於所謂的權重近鄰策略(weighted neighborhoods schemes):指的是,模型經過訓練集來經過輸入樣本的近鄰樣本點對輸入樣本做出預測,經過一個帶權重的函數關係

boosting

基本思想

一個接一個的(串行)訓練基學習器,每個基學習器主要用來修正前面學習器的誤差。dom

sklearn-AdaBoost

  • AdaBoost可用於分類和迴歸
    • AdaBoostClassifier
    • AdaBoostRegressor
  • 參數
    • n_estimators:基學習器數目
    • learning_rate:學習率,對應在最終的繼承模型中各個基學習器的權重
    • base_estimator:基學習器默認是使用決策樹樁

_Notes:調參的關鍵參數是基學習器的數量n_estimators以及基學習器自己的複雜性好比深度max_depth或者葉節點所需的最少樣本數min_samples_leaf_分佈式

sklearn-GBRT

概述

Gradient Tree Boosting或者說GBRT是boosting的一種推廣,是的能夠應用通常的損失函數,能夠處理分類問題和迴歸問題,應用普遍,常見應用場景好比網頁搜索排序和社會生態學

優缺點

  • 優勢:
    • 可以直接處理混合類型的特徵
    • 對輸出空間的異常值的魯棒性(經過魯棒的損失函數)
  • 缺點:
    • 難以並行,由於自己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在訓練基學習器時使用一個特徵子集來訓練,相似隨機森林的作法
      • early stopping:經過參數min_impurity_split(原始)以及min_impurity_decrease來實現,前者的是根據節點的不純度是否高於閾值,若不是則中止增加樹,做爲葉節點;後者則根據分裂不純度降低值是否超過某一閾值來決定是否分裂(此外這裏的early stopping彷佛與XGBoost裏顯示設置的early stopping不一樣,這裏是控制樹的切分生長,而XGBoost則是控制基學習器的數目)
        另一點,有說這裏的early_stopping起到了一種正則化的效果,由於控制了葉節點的切分閾值從而控制了模型的複雜度(可參考李航《統計學習方法》P213底部提高方法沒有顯式的正則化項,一般經過早中止的方法達到正則化的效果)
      • 基學習器的初始化:init,用來計算初始基學習器的預測,須要具有fitpredict方法,若未設置則默認爲loss.init_estimator
      • 模型的重複使用(熱啓動):warm_start,若設置爲True則可使用已經訓練好的學習器,而且在其上添加更多的基學習器
      • 預排序:presort,默認設置爲自動,對樣本按特徵值進行預排序從而提升尋找最優切分點的效率,自動模式下對稠密數據會使用預排序,而對稀疏數據則不會
      • 損失函數(loss)
        • 二分類的對數損失函數(Binomial deviance,’deviance’),提供機率估計,模型初值設爲對數概率
        • 多分類的對數損失(Multinomial deviance,’deviance’),針對n_classes互斥的多分類,提供機率估計,初始模型值設爲各種別的先驗機率,每一輪迭代須要構建n類迴歸樹可能會使得模型對於多類別的大數據集不過高效
        • 指數損失函數(Exponential loss),與AdaBoostClassifier的損失函數一致,相對對數損失來講對錯誤標籤的樣本不夠魯棒,只可以被用來做二分類
    • 經常使用方法
      • 特徵重要性(feature_importances_):進行特徵重要性的評估
      • 包外估計(oob_improvement_),使用包外樣原本計算每一輪訓練後模型的表現提高
      • 訓練偏差(train_score_)
      • 訓練好的基學習器集合(estimators_)
      • fit方法裏能夠設置樣本權重sample_weight,monitor能夠用來回調一些方法好比包外估計、早中止等
  • GradientBoostingRegressor

    • 支持不一樣的損失函數,經過參數loss設置,默認的損失函數是最小均方偏差ls
    • 經過屬性train_score_可得到每輪訓練的訓練偏差,經過方法staged_predict能夠得到每一階段的測試偏差,經過屬性feature_importances_能夠輸出模型判斷的特徵相對重要性
    • 損失函數:
      • 最小均方偏差(Least squares,’ls’),計算方便,通常初始模型爲目標均值
      • 最小絕對值偏差(Least absolute deviation,’lad’),初始模型爲目標中位值
      • Huber,一種結合了最小均方偏差和最小絕對值偏差的方法,使用參數alpha來控制對異常點的敏感狀況

正則化

  • Shrinkage,對應參數learning rate一種簡單的正則化的策略,經過控制每個基學習器的貢獻,會影響到基學習器的數目即n_estimators,經驗性的設置爲一個較小的值,好比不超過0.1的常數值,而後使用early stopping來控制基學習器的數目
  • 行採樣,使用隨機梯度上升,將gradient boosting與bagging相結合,每一次迭代經過採樣的樣本子集來訓練基學習器(對應參數subsample),通常設置shrinkage比不設置要好,而加上行採樣會進一步提高效果,而僅使用行採樣可能效果反而不佳;並且進行行採樣後可以使用包外估計來計算模型每一輪訓練的效果提高,保存在屬性oob_improvement_裏,能夠用來作模型選擇,可是包外預估的結果一般比較悲觀,因此除非交叉驗證太過耗時,不然建議結合交叉驗證一塊兒進行模型選擇
  • 列採樣,相似隨機森林的作法,經過設置參數max_features來實現

可解釋性

單一的決策樹能夠經過將樹結構可視化來分析和解釋,而梯度上升模型由於由上百課迴歸樹組成所以他們很難像單獨的決策樹同樣被可視化,不過也有一些技術來輔助解釋模型

  • 特徵重要性(featureimportances屬性),決策樹在選擇最佳分割點時間接地進行了特徵的選擇,而這一信息能夠用來評估每個特徵的重要性,基本思想是一個特徵越常常地被用來做爲樹的切分特徵(更加說明使用的是CART樹或其變體,由於ID3,C4.5都是特徵用過一次後就再也不用了),那麼這個特徵就越重要,而對於基於樹的集成模型而言能夠經過對各個樹判斷的特徵重要性作一個平均來表示特徵的重要性
  • PDP(Partial dependence plots),能夠用來繪製目標響應與目標特徵集的依賴關係(控制其餘的特徵的值),受限於人類的感知,目標特徵集合通常設置爲1或2才能繪製對應的圖形(plot_partial_dependence),也能夠經過函數partial_dependence來輸出原始的值

Notes:

  • GradientBoostingClassifier和GradientBoostingRegressor均支持對訓練好的學習器的複用,經過設置warm_start=True能夠在已經訓練好的模型上添加更多的基學習器

VotingClassifier

Voting的基本思想是將不一樣學習器的結果進行硬投票(多數表決)或者軟投票(對預測機率加權平均)來對樣本類別作出預估,其目的是用來平衡一些表現至關且都還不錯的學習器的表現,以消除它們各自的缺陷

  • 硬投票(voting=’hard’):按照多數表決原則,根據分類結果中多數預測結果做爲輸入樣本的預測類別,若是出現類別數目相同的狀況,會按照預測類別的升序排序取前一個預測類別(好比模型一預測爲類別‘2’,模型二預測爲類別‘1’則樣本會被判爲類別1)
  • 軟投票:對不一樣基學習器的預測機率進行加權平均(所以使用軟投票的基學習器須要可以預測機率),需設置參數wights爲一個列表表示各個基學習器的權重值

XGBoost

過擬合

XGBoost裏可使用兩種方式防止過擬合

  • 直接控制模型複雜度
    • max_depth,基學習器的深度,增長該值會使基學習器變得更加複雜,榮易過擬合,設爲0表示不設限制,對於depth-wise的基學習器學習方法須要控制深度
    • min_child_weight,子節點所需的樣本權重和(hessian)的最小閾值,如果基學習器切分後獲得的葉節點中樣本權重和低於該閾值則不會進一步切分,在線性模型中該值就對應每一個節點的最小樣本數,該值越大模型的學習約保守,一樣用於防止模型過擬合
    • gamma,葉節點進一步切分的最小損失降低的閾值(超過該值才進一步切分),越大則模型學習越保守,用來控制基學習器的複雜度(有點LightGBM裏的leaf-wise切分的意味)
  • 給模型訓練增長隨機性使其對噪聲數據更加魯棒
    • 行採樣:subsample
    • 列採樣:colsample_bytree
    • 步長:eta即shrinkage

數據類別分佈不均

對於XGBoost來講一樣是兩種方式

  • 若只關注預測的排序表現(auc)
    • 調整正負樣本的權重,使用scale_pos_weight
    • 使用auc做爲評價指標
  • 若關注預測出正確的機率值,這種狀況下不能調整數據集的權重,能夠經過設置參數max_delta_step爲一個有限值好比1來加速模型訓練的收斂

調參

通常參數

主要用於設置基學習器的類型

  • 設置基學習器booster
    • 基於樹的模型
      • gbtree
      • dart
    • 線性模型
      • gblinear
  • 線程數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,用於每層劃分的特徵比重
  • 顯式正則化,增長該值是模型學習更爲保守
    • L1:alpha
    • L2:lambda
  • tree_method,樹的構建方法,準確的說應該是切分點的選擇算法,包括原始的貪心、近似貪心、直方圖算法(可見LightGBM這裏並非一個區別)
    • auto,啓發式地選擇分割方法,近似貪心或者貪心
    • exact,原始的貪心算法,既針對每個特徵值切分一次
    • approx,近似的貪心算法選取某些分位點進行切分,使用sketching和histogram
    • hist,直方圖優化的貪心算法,對應的參數有grow_policy,max_bin
    • gpu_exact
    • gpu_hist
  • scale_pos_weight,針對數據集類別分佈不均,典型的值可設置爲
    sum(negativecases)sum(positivecases)sum(negativecases)sum(positivecases)
  • grow_policy,控制樹的生長方式,目前只有當樹的構建方法tree_method設置爲hist時纔可使用所謂的leaf-wise生長方式
    • depthwise,按照離根節點最近的節點進行分裂
    • lossguide,優先分裂損失變化大的節點,對應的一個參數還有max_leaves,表示可增長的最大的節點數
  • max_bin,一樣針對直方圖算法tree_method設置爲hist時用來控制將連續特徵離散化爲多個直方圖的直方圖數目
  • predictor,選擇使用GPU或者CPU
    • cpu_predictor
    • gpu_predictor

任務參數

根據任務、目的設置的參數,好比迴歸任務與排序任務的目的是不一樣的

  • objective,訓練目標,分類仍是迴歸
    • 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_inmodel_out
  • fmap,feature map用來導出模型

LightGBM

特色

效率和內存上的提高

直方圖算法,LightGBM提供一種數據類型的封裝相對Numpy,Pandas,Array等數據對象而言節省了內存的使用,緣由在於他只須要保存離散的直方圖,LightGBM裏默認的訓練決策樹時使用直方圖算法,XGBoost裏如今也提供了這一選項,不過默認的方法是對特徵預排序,直方圖算法是一種犧牲了必定的切分準確性而換取訓練速度以及節省內存空間消耗的算法

  • 在訓練決策樹計算切分點的增益時,預排序須要對每一個樣本的切分位置計算,因此時間複雜度是O(#data)而LightGBM則是計算將樣本離散化爲直方圖後的直方圖切割位置的增益便可,時間複雜度爲O(#bins),時間效率上大大提升了(初始構造直方圖是須要一次O(#data)的時間複雜度,不過這裏只涉及到加和操做)
  • 直方圖作差進一步提升效率,計算某一節點的葉節點的直方圖能夠經過將該節點的直方圖與另外一子節點的直方圖作差獲得,因此每次分裂只需計算分裂後樣本數較少的子節點的直方圖而後經過作差的方式得到另外一個子節點的直方圖,進一步提升效率
  • 節省內存
    • 將連續數據離散化爲直方圖的形式,對於數據量較小的情形可使用小型的數據類型來保存訓練數據
    • 沒必要像預排序同樣保留額外的對特徵值進行預排序的信息
  • 減小了並行訓練的通訊代價

稀疏特徵優化

對稀疏特徵構建直方圖時的時間複雜度爲O(2*#非零數據)

準確率上的優化

LEAF-WISE(BEST-FIRST)樹生長策略

相對於level-wise的生長策略而言,這種策略每次都是選取當前損失降低最多的葉節點進行分割使得總體模型的損失降低得更多,可是容易過擬合(特別當數據量較小的時候),能夠經過設置參數max_depth來控制樹身防止出現過擬合

Notes:XGBoost如今兩種方式都是支持的

直接支持類別特徵

對於類別類型特徵咱們原始的作法是進行獨熱編碼,可是這種作法對於基於樹的模型而言不是很好,對於基數較大的類別特徵,可能會生成很是不平衡的樹而且須要一顆很深的樹才能達到較好的準確率;比較好的作法是將類別特徵劃分爲兩個子集,直接劃分方法衆多(2^(k-1)-1),對於迴歸樹而言有一種較高效的方法只須要O(klogk)的時間複雜度,基本思想是對類別按照與目標標籤的相關性進行重排序,具體一點是對於保存了類別特徵的直方圖根據其累計值(sum_gradient/sum_hessian)重排序,在排序好的直方圖上選取最佳切分位置

網絡通訊優化

使用collective communication算法替代了point-to-point communication算法提高了效率

並行學習優化

特徵並行

特徵並行是爲了將尋找決策樹的最佳切分點這一過程並行化

  • 傳統作法
    • 對數據列採樣,即不一樣的機器上保留不一樣的特徵子集
    • 各個機器上的worker根據所分配的特徵子集尋找到局部的最優切分點(特徵、閾值)
    • 互相通訊來從局部最佳切分點裏獲得最佳切分點
    • 擁有最佳切分點的worker執行切分操做,而後將切分結果傳送給其餘的worker
    • 其餘的worker根據接收到的數據來切分數據
    • 傳統作法的缺點
      • 計算量太大,並無提高切分的效率,時間複雜度爲O(#data)(由於每一個worker持有全部行,須要處理所有的記錄),當數據量較大時特徵並行並不能提高速度
      • 切分結果的通訊代價,大約爲O(#data/8)(若一個數據樣本爲1bit)
  • LightGBM的作法
    讓每一個機器保留整個完整的數據集(並非通過列採樣的數據),這樣就沒必要在切分後傳輸切分結果數據,由於每一個機器已經持有完整的數據集
    • 各個機器上的worker根據所分配的特徵子集尋找到局部的最優切分點(特徵、閾值)
    • 互相通訊來從局部最佳切分點裏獲得最佳切分點
    • 執行最優切分操做

Notes:典型的空間換時間,差異就是減小了傳輸切分結果的步驟,節省了這裏的通訊消耗

數據並行

上述特徵並行的方法並無根本解決尋找切分點的計算效率問題,當記錄數過大時須要考慮數據並行的方法

  • 傳統作法
    • 行採樣,對數據進行橫向切分
    • worker使用分配到的局部數據構建局部的直方圖
    • 合併局部直方圖獲得全局的直方圖
    • 對全局直方圖尋找最優切分點,而後進行切分
    • 缺點:通訊代價太高,若使用point-to-point的通訊算法,每一個機器的通訊代價時間複雜度爲O(#machine*#feature*#bin),若使用collective通訊算法則通訊代價爲O(2*#feature*#bin)
  • LightGBM的作法(依然是下降通訊代價)
    • 不一樣於合併全部的局部直方圖得到全局的直方圖,LightGBM經過Reduce Scatter方法來合併不一樣worker的無交叉的不一樣特徵的直方圖,這樣找到該直方圖的局部最優切分點,最後同步到全局最優切分點
    • 基於直方圖作差的方法,在通訊的過程當中能夠只傳輸某一葉節點的直方圖,而對於其鄰居可經過作差的方式獲得
    • 通訊的時間複雜度爲O(0.5*#feature*#bin)

並行投票

進一步減少了數據並行中的通訊代價,經過兩輪的投票來減少特徵直方圖中的通訊消耗

其餘特色

直接支持類別(標稱)特徵

LightGBM能夠直接用類別特徵進行訓練,沒必要預先進行獨熱編碼,速度會提高很多,參數設置categorical_feature來指定數據中的類別特徵列

早中止

sklearn-GBDT,XGBoost,LightGBM都支持早中止,不過在細節上略有不一樣

  • sklearn-GBDT中的early stopping是用來控制基學習器的生長的:經過參數min_impurity_split(原始)以及min_impurity_decrease來實現,前者的是根據節點的不純度是否高於閾值,若不是則中止增加樹,做爲葉節點;後者則根據分裂不純度降低值是否超過某一閾值來決定是否分裂(此外這裏的early stopping彷佛與XGBoost裏顯示設置的early stopping不一樣,這裏是控制樹的切分生長,而XGBoost則是控制基學習器的數目)
  • XGBoost和LightGBM裏的early_stopping則都是用來控制基學習器的數目的
    • 二者均可以使用多組評價指標,可是不一樣之處在於XGBoost會根據指標列表中的最後一項指標控制模型的早中止,而LightGBM則會受到全部的評估指標的影響
    • 在使用early stopping控制迭代次數後,模型直接返回的是最後一輪迭代的學習器不必定是最佳學習器,而在作出預測時能夠設置參數選擇某一輪的學習器做出預測
      • XGBoost裏保存了三種狀態的學習器,分別是bst.best_score, bst.best_iteration, bst.best_ntree_limit,官方的建議是在作預測時設置爲bst.best_ntree_limit,實際使用時感受bst.best_iteration和 bst.best_ntree_limit的表現上區別不大
      • LightGBM則僅提供了bst.best_iteration這一種方式

實踐上

  • 內置cv
  • 支持帶權重的數據輸入
  • 能夠保留模型
  • DART
  • L1/L2迴歸
  • 保存模型進行進一步訓練
  • 多組驗證集

支持的任務

  • 迴歸任務
  • 分類(二分類、多分類)
  • 排序

支持的評價指標METRIC

  • 絕對值偏差l1
  • 平方偏差l2
  • 均方偏差l2_root
  • 對數損失binary_logloss,multi_logloss
  • 分類偏差率binary_error,multi_error
  • auc
  • ndcg
  • 多分類對數損失
  • 多分類分類偏差率

調參

核心參數

  • 葉節點數num_leaves,與模型複雜度直接相關(leaf-wise)
  • 任務目標
    • 迴歸regression,對應的損失函數以下
      • regression_l1,加了l1正則的迴歸,等同於絕對值偏差
      • regression_l2,等同於均方偏差
      • huber,Huber Loss
      • fair,Fair Loss
      • poisson,泊松迴歸
    • 分類
      • binary,二分類
      • multiclass,多分類
    • 排序
      • lambdarank
  • 模型
    • boosting
      • gbdt,傳統的梯度提高決策樹
      • rf,隨機森林
      • dart,Dropouts meet Multiple Additive Regression Trees
      • goss,Gradient-based One-Side Sampling
  • 迭代次數num_iterations,對於多分類問題,LightGBM會構建num_class*num_iterations的樹
  • 學習率/步長learning_rate,即shrinkage
  • 樹的訓練方式tree_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

IO參數

直方圖相關

  • 最大直方圖數max_bin,特徵值裝載的最大直方圖數目,通常較小的直方圖數目會下降訓練的準確性但會提高總體的表現,處理過擬合
  • 直方圖中最少樣本數min_data_in_bin,設置每一個直方圖中樣本數的最小值,一樣防止過擬合

特徵相關

  • 是否預排序is_pre_partition
  • 是否稀疏is_sparse
  • 類別特徵列categorical_feature,聲明類別特徵對應的列(經過索引標記),僅支持int類型
  • 聲明權重列weight,指定一列做爲權重列

內存相關

  • 分階段加載數據two_round,通常LightGBM將數據載入內存進行處理,這樣會提高數據的加載速度,可是對於數據量較大時會形成內存溢出,因此此時須要分階段載入
  • 保存數據爲二進制save_binary,將數據文件導出爲二進制文件,下次加載數據時就會更快一些

缺失值

  • 是否處理缺失值use_missing
  • 是否將0值做爲缺失值zeros_as_missing

目標參數

  • sigmoid,sigmoid函數中的參數,用於二分類和排序任務
  • scale_pos_weight,設置正例在二分類任務中的樣本佔比
  • 初始化爲均值boost_from_average,調整初始的分數爲標籤的均值,加速模型訓練的收斂速度,僅用於迴歸任務
  • 樣本類別是否不平衡is_unbalance
  • num_class,用於多分類

調參小結

LEAF-WISE

  • num_leaves,對於leaf-wise的模型而言該參數是用來控制模型複雜度的主要參數,理論上能夠經過設置num_leaves=2^(max_depth)來設置該參數值,實際是不可取的,由於在節點數目相同的前提下,對於leaf-wise的模型會傾向於生成深度更深的模型,若是生硬的設置爲2^(max_depth)可能會形成模型的過擬合,通常設置的值小於2^(max_depth),
  • min_data_in_leaf,在設置了葉節點數後,該值會對模型複雜度形成影響,若設的較大則樹不會生長的很深,但可能形成模型的欠擬合
  • max_depth

效率

  • bagging_fractionbagging_freq,使用bagging進行行採樣提高訓練速度(減少了數據集)
  • feature_fraction,列採樣
  • 設置較少的直方圖數目,max_bin
  • 保存數據爲二進制文件以便於將來訓練時能快速加載,save_binary
  • 經過並行訓練來提速

準確率

  • 設置較大的直方圖數目max_bin,固然這樣會犧牲訓練速度
  • 使用較小的學習率learning_rate,這樣會增長迭代次數
  • 設置較大的葉節點數num_leaves,可能形成模型過擬合
  • 使用較大的訓練數據
  • 嘗試dart模型

過擬合

  • 設置較少的直方圖數目,max_bin
  • 設置較小的葉節點數num_leaves
  • 設置參數min_data_in_leafmin_sum__hessian_in_leaf
  • 使用bagging進行行採樣bagging_fractionbagging_freq
  • feature_fraction,列採樣
  • 使用較大的訓練數據
  • 正則化
    • lambda_l1
    • lambda_l2
    • 切分的最小收益min_gain_to_split
  • 控制樹深max_depth

總結

GBDT vs. XGBoost vs. LightGBM(論文層面)

GBDT vs. XGBoost

  • GBDT無顯式正則化
  • GBDT僅使用了目標函數一階泰勒展開,而XGBoost使用了二階的泰勒展開值
    • 爲何二階展開?
      • 一說加快收斂速度
      • 另外有說自己模型訓練的學習率shrinkage能夠經過二階導數作一個逼近,而原始的GBDT沒有計算這個,因此通常是經過預設的超參數eta人爲指定
  • XGBoost加入了列採樣
  • XGBoost對缺失值的處理
  • XGBoost經過預排序的方法來實現特徵並行,提升模型訓練效率
  • XGBoost支持分佈式計算

XGBoost vs. LightGBM

  • 樹的切分策略不一樣
    • XGBoost是level-wise而LightGBM是leaf-wise
  • 實現並行的方式不一樣
    • XGBoost是經過預排序的方式
    • LightGBM則是經過直方圖算法
  • LightGBM直接支持類別特徵,對類別特徵沒必要進行獨熱編碼處理

sklearn GBDT vs. XGBoost vs. LightGBM(實現層面)

實際在庫的實現層面原始論文裏的不少區別是不存在的,差別更多在一些工程上的性能優化

sklearn GBDT vs. XGBoost

  • 正則化方式不一樣
    • sklearn GBDT中僅僅經過學習率來作一個正則化(影響到基學習器的數目),此外gbdt裏的early stopping也達到了一個正則化的效果,對應的主要參數是min_impurity_split即控制了判斷葉節點是否進一步切分的不純度的閾值,若超過該閾值則能夠進一步切分,不然不行,故而控制了樹的深度即控制了基學習器的複雜度
    • XGBoost除了學習率之外還有顯示的設置正則化項l1,l2以及對應論文裏的葉節點數(對應參數gamma)以及節點權重和(參數min_child_weight)來控制模型複雜度
  • GBDT僅使用了目標函數一階泰勒展開,而XGBoost使用了二階的泰勒展開值
  • XGBoost自有一套對缺失值的處理方法
  • early-stopping意義不一樣
    • sklearn GBDT中控制基學習器進一步切分、生長
    • XGBoost控制基學習器的數目
  • 特徵重要性的判斷標準
    • sklearn GBDT是根據樹的節點特徵對應的深度來判斷
    • XGBoost則有三種方法(get_score)
      • weight:特徵用來做爲切分特徵的次數
      • gain:使用特徵進行切分的平均增益
      • cover:各個樹中該特徵平均覆蓋狀況(根據樣本?)
  • 樹的切分算法
    • XGBoost存在三種切分方法,
      • 原始的貪心算法(每一個特徵值切分)
      • 近似貪心(分位點切分)(使得對於大量的特徵取值尤爲是連續變量時XGBoost會比sklearn-gbdt快不少)
      • 直方圖算法
  • XGBoost支持level-wise和leaf-wise兩種樹的生長方式
  • XGBoost支持GPU
  • XGBoost支持多種評價標準、支持多種任務(迴歸、分類、排序)

XGBoost vs. LightGBM

XGBoost目前已經實現了LightGBM以前不一樣的一些方法好比直方圖算法,二者的區別更多的在與LightGBM優化通訊的的一些處理上

    • LightGBM直接支持類別特徵,能夠沒必要預先進行獨熱編碼,提升效率(categorical_feature)
    • 優化通訊代價
      • 特徵並行
      • 數據並行
      • point to point communication–>collective communication
    • 使用多項評價指標同時評價時二者的早中止策略不一樣,XGBoost是根據評價指標列表中的最後一項來做爲中止標準,而LightGBM則受到全部評價指標的影響

轉載自:懶死駱駝: http://izhaoyi.top/2017/09/23/sklearn-xgboost/

相關文章
相關標籤/搜索