【python 機器學習】機器學習算法之LightGBM

算法介紹:
LightGBM 由微軟2017年提出,主要用於解決 GDBT 在海量數據中遇到的問題,以便其可以更好更快地用於工業實踐中。從 LightGBM 名字我們可以看出其是輕量級(Light)的梯度提升機(GBM),其相對 XGBoost 具有訓練速度快、內存佔用低的特點。
實際上,XGBoost和lightGBM都屬於GBDT的一種實現,旨在優化算法的性能,提升算法的訓練速度,與XGBoost相比,lightGBM更適應於數據量更大的場景。從GBDT->XGBoost->lightGBM,在模型訓練階段,是不能百分百地斷定lightGBM就比GBDT和XGBoost好,因爲數據量的大小也決定了模型的可行性。所以實際場景中,還是建議一一嘗試之後再做抉擇。

在這裏插入圖片描述

高效梯度提升(LightGBM)
(1)、LightGBM也能提供比XGBoost更高的準確性和更短的訓練時間;
(2)、支持並行的樹增強操作,即使在大型數據集上(相比於 XGBoost)也能提供更快的訓練速度;
(3)、使用直方圖histogram-esquealgorithm,將連續的特徵轉化爲離散的特徵,從而實現了極快的訓練速度和較低的內存使用率;
(4)、通過使用垂直拆分(leaf-wise split)而不是水平拆分(level-wise split)來獲得極高的準確性,這會導致非常快速的聚合現象,並在非常複雜的樹結構中能捕獲訓練數據的底層模式。可以通過使用 num_leaves 和 max_depth 這兩個超參數來控制過度擬合;

LightGBM在很多方面會比XGBoost表現的更爲優秀。它有以下優勢:

1、更快的訓練效率

2、低內存使用

3、更高的準確率

4、支持並行化學習

5、可處理大規模數據

6、支持直接使用category特徵

LightGBM調參指導:

針對 leaf-wise 樹的參數優化:

num_leaves:控制了葉節點的數目。它是控制樹模型複雜度的主要參數。

如果是level-wise,則該參數爲  ,其中depth爲樹的深度。但是當葉子數量相同時,leaf-wise的樹要遠遠深過level-wise樹,非常容易導致過擬合。因此應該讓num_leaves小於  。在leaf-wise樹中,並不存在depth的概念。因爲不存在一個從leaves到depth的合理映射。

min_data_in_leaf:每個葉節點的最少樣本數量。它是處理leaf-wise樹的過擬合的重要參數。將它設爲較大的值,可以避免生成一個過深的樹。但是也可能導致欠擬合。

max_depth: 控制了樹的最大深度。該參數可以顯式的限制樹的深度。



針對更快的訓練速度:

通過設置 bagging_fraction 和 bagging_freq 參數來使用 bagging 方法

通過設置 feature_fraction 參數來使用特徵的子抽樣

使用較小的 max_bin

使用 save_binary 在未來的學習過程對數據加載進行加速



獲取更好的準確率:

使用較大的 max_bin (學習速度可能變慢)

使用較小的 learning_rate 和較大的 num_iterations

使用較大的 num_leaves (可能導致過擬合)



使用更大的訓練數據

嘗試 dart

緩解過擬合:

使用較小的 max_bin

使用較小的 num_leaves

使用 min_data_in_leaf 和 min_sum_hessian_in_leaf

通過設置 bagging_fraction 和 bagging_freq 來使用 bagging

通過設置 feature_fraction 來使用特徵子抽樣



使用更大的訓練數據

使用 lambda_l1, lambda_l2 和 min_gain_to_split 來使用正則

嘗試 max_depth 來避免生成過深的樹



核心參數:

config 或者config_file:一個字符串,給出了配置文件的路徑。默認爲空字符串。

task: 一個字符串,給出了要執行的任務。可以爲:

‘train’ 或者 ‘training’:表示是訓練任務。默認爲’train’。

‘predict’ 或者 ‘prediction’或者’test’:表示是預測任務。

‘convert_model’: 表示是模型轉換任務。將模型文件轉換成if-else 格式。

application或者objective或者app:一個字符串,表示問題類型。可以爲:

‘regression’或’regression_l2’或’mean_squared_error’或’mse’或’l2_root’或’root_mean_squred_error’或’rmse’:表示迴歸任務,但是使用L2損失函數。默認爲’regression’

‘regression_l1’或者mae或者mean_absolute_error:表示迴歸任務,但是使用L1損失函數。

‘huber’: 表示迴歸任務,但是使用huber 損失函數。

‘fair’: 表示迴歸任務,但是使用fair 損失函數。

‘poisson’: 表示Poisson 迴歸任務。

‘quantile’: 表示quantile迴歸任務。

‘quantile_l2’:表示quantile迴歸任務,但是使用了L2 損失函數。

‘mape’ 或者’mean_absolute_precentage_error’: 表示迴歸任務,但是使用MAPE 損失函數

‘gamma’: 表示gamma 迴歸任務。

‘tweedie’: 表示tweedie 迴歸任務。

‘binary’: 表示二分類任務,使用對數損失函數作爲目標函數。

‘multiclass’: 表示多分類任務,使用softmax 函數作爲目標函數。必須設置num_class 參數

‘multiclassova’ 或者’multiclass_ova’ 或者’ova’ 或者’ovr’: 表示多分類任務,使用one-vs-all 的二分類目標函數。必須設置num_class 參數

‘xentropy’ 或者’cross_entropy’: 目標函數爲交叉熵(同時具有可選擇的線性權重)。要求標籤是[0,1] 之間的數值。

‘xentlambda’ 或者’cross_entropy_lambda’: 替代了參數化的cross_entropy 。要求標籤是[0,1]之間的數值。

‘lambdarank’:表示排序任務。在lambdarank 任務中,標籤應該爲整數類型,數值越大表示相關性越高。label_gain 參數可以用於設置整數標籤的增益(權重)

boosting 或者’boost’ 或者 ‘boosting_type’: 一個字符串,給出了基學習器模型算法。可以爲:

‘gbdt’: 表示傳統的梯度提升決策樹。默認值爲’gbdt’

‘rf’: 表示隨機森林。

‘dart’: 表示帶dropout 的gbdt

goss:表示Gradient-based One-Side Sampling 的gbdt

data或者train或者train_data:一個字符串,給出了訓練數據所在的文件的文件名。默認爲空字符串。lightgbm將使用它來訓練模型。

valid或者test或者valid_data或者test_data:一個字符串,表示驗證集所在的文件的文件名。默認爲空字符串。lightgbm將輸出該數據集的度量。如果有多個驗證集,則用逗號分隔。

num_iterations或者num_iteration或者num_tree或者num_trees或者num_round或者num_rounds或者num_boost_round 一個整數,給出了boosting的迭代次數。默認爲 100。

對於python/R包,該參數是被忽略的。對於python,使用train()/cv()的輸入參數num_boost_round來代替。

在內部,lightgbm對於multiclass 問題設置了num_class*num_iterations 棵樹。

learning_rate或者shrinkage_rate: 個浮點數,給出了學習率。默認爲1。在dart 中,它還會影響dropped trees 的歸一化權重。

num_leaves或者num_leaf:一個整數,給出了一棵樹上的葉子數。默認爲 31

tree_learner或者tree:一個字符串,給出了tree learner,主要用於並行學習。 默認爲’serial’。 可以爲:

‘serial’: 單臺機器的tree learner

‘feature’: 特徵並行的tree learner

‘data’: 數據並行的tree learner

‘voting’: 投票並行的tree learner

num_threads 或者num_thread 或者nthread:一個整數, 給出了lightgbm 的線程數。默認爲OpenMP_default。

爲了更快的速度,應該將它設置爲真正的CPU 內核數,而不是線程的數量(大多數CPU 使用超線程來使每個CPU內核生成2個線程)。

當數據集較小的時候,不要將它設置的過大

對於並行學習,不應該使用全部的CPU核心,因爲這會使得網絡性能不佳

device: 一個字符串,指定計算設備。默認爲’cpu’。 可以爲’gpu’,’cpu’。

建議使用較小的max_bin 來獲得更快的計算速度

爲了加快學習速度,GPU 默認使用32位浮點數來求和。你可以設置gpu_use_dp=True 來啓動64位浮點數,但是它會使得訓練速度降低。



學習控制參數:

max_depth: 一個整數,限制了樹模型的最大深度,默認值爲-1。如果小於0,則表示沒有限制。

min_data_in_leaf 或者 min_data_per_leaf 或者 min_data或者min_child_samples: 一個整數,表示一個葉子節點上包含的最少樣本數量。默認值爲 20

min_sum_hessian_in_leaf 或者 min_sum_hessian_per_leaf或者 min_sum_hessian 或者 min_hessian或者min_child_weight: 一個浮點數,表示一個葉子節點上的最小hessian 之和。(也就是葉節點樣本權重之和的最小值) 默認爲1e-3 。

feature_fraction或者sub_feature或者colsample_bytree:一個浮點數,取值範圍爲[0.0,1.0], 默認值爲0。如果小於1.0,則lightgbm 會在每次迭代中隨機選擇部分特徵。如0.8 表示:在每棵樹訓練之前選擇80% 的特徵來訓練。

feature_fraction_seed: 一個整數,表示feature_fraction 的隨機數種子,默認爲2。

bagging_fraction 或者sub_row 或者 subsample:一個浮點數,取值範圍爲[0.0,1.0], 默認值爲0。如果小於1.0,則lightgbm 會在每次迭代中隨機選擇部分樣本來訓練(非重複採樣)。如0.8 表示:在每棵樹訓練之前選擇80% 的樣本(非重複採樣)來訓練。

bagging_freq 或者subsample_freq:一個整數,表示每bagging_freq 次執行bagging。如果該參數爲0,表示禁用bagging。

bagging_seed 或者 bagging_fraction_seed:一個整數,表示bagging 的隨機數種子,默認爲 3 。

early_stopping_round 或者 early_stopping_rounds或者early_stopping:一個整數,默認爲0。如果一個驗證集的度量在early_stopping_round 循環中沒有提升,則停止訓練。如果爲0則表示不開啓早停。

lambda_l1 或者reg_alpha: 一個浮點數,表示L1正則化係數。默認爲0

lambda_l2 或者reg_lambda: 一個浮點數,表示L2正則化係數。默認爲0

min_split_gain 或者min_gain_to_split: 一個浮點數,表示執行切分的最小增益,默認爲0

drop_rate: 一個浮點數,取值範圍爲[0.0,1.0],表示dropout 的比例,默認爲1。 該參數僅在dart 中使用

skip_drop: 一個浮點數,取值範圍爲[0.0,1.0],表示跳過dropout 的概率,默認爲5。 該參數僅在dart 中使用

max_drop: 一個整數,表示一次迭代中刪除樹的最大數量,默認爲50。 如果小於等於0,則表示沒有限制。 該參數僅在dart 中使用

uniform_drop:一個布爾值,表示是否想要均勻的刪除樹,默認值爲False。 該參數僅在dart 中使用

xgboost_dart_mode: 一個布爾值,表示是否使用xgboost dart 模式,默認值爲False。該參數僅在dart 中使用

drop_seed: 一個整數,表示dropout 的隨機數種子,默認值爲 4。 該參數僅在dart 中使用

top_rate: 一個浮點數,取值範圍爲[0.0,1.0],表示在goss 中,大梯度數據的保留比例,默認值爲2。該參數僅在goss 中使用

other_rate: 一個浮點數,取值範圍爲[0.0,1.0],表示在goss 中,小梯度數據的保留比例,默認值爲1。該參數僅在goss 中使用

min_data_per_group:一個整數,表示每個分類組的最小數據量,默認值爲100。用於排序任務

max_cat_threshold: 一個整數,表示category 特徵的取值集合的最大大小。默認爲 32 。

cat_smooth: 一個浮點數,用於category 特徵的概率平滑。默認值爲 10。它可以降低噪聲在category 特徵中的影響,尤其是對於數據很少的類。

cat_l2: 一個浮點數,用於category 切分中的L2 正則化係數。默認爲 10 。

top_k 或者 topk: 一個整數,用於投票並行中。默認爲20 。將它設置爲更大的值可以獲得更精確的結果,但是會降低訓練速度。

IO 參數:

max_bin: 一個整數,表示最大的桶的數量。默認值爲 255。lightgbm 會根據它來自動壓縮內存。如max_bin=255 時,則lightgbm 將使用uint8 來表示特徵的每一個值。

min_data_in_bin: 一個整數,表示每個桶的最小樣本數。默認爲3。該方法可以避免出現一個桶只有一個樣本的情況。

data_random_seed: 一個整數,表示並行學習數據分隔中的隨機數種子。默認爲1它不包括特徵並行。

output_model或者model_output或者model_out: 一個字符串,表示訓練中輸出的模型被保存的文件的文件名。默認txt 。

input_model或者model_input或者model_in: 一個字符串,表示輸入模型的文件的文件名。默認空字符串。對於prediction任務,該模型將用於預測數據,對於train任務,訓練將從該模型繼續

output_result或者 predict_result或者prediction_result:一個字符串,給出了prediction 結果存放的文件名。默認爲txt。

pre_partition 或者 is_pre_partition: 一個布爾值,指示數據是否已經被劃分。默認值爲False。 如果爲true,則不同的機器使用不同的partition 來訓練。它用於並行學習(不包括特徵並行)

is_sparse或者 is_enable_sparse或者enable_sparse: 一個布爾值,表示是否開啓稀疏優化,默認爲True。如果爲True則啓用稀疏優化。

two_round 或者two_round_loading或者 use_two_round_loading: 一個布爾值,指示是否啓動兩次加載。默認值爲False,表示只需要進行一次加載。默認情況下,lightgbm 會將數據文件映射到內存,然後從內存加載特徵,這將提供更快的數據加載速度。但是當數據文件很大時,內存可能會被耗盡。如果數據文件太大,則將它設置爲True

save_binary或者is_save_binary或者 is_save_binary_file: 一個布爾值,表示是否將數據集(包括驗證集)保存到二進制文件中。默認值爲False。如果爲True,則可以加快數據的加載速度。

verbosity 或者verbose:一個整數,表示是否輸出中間信息。默認值爲1。如果小於0,則僅僅輸出critical 信息;如果等於0,則還會輸出error,warning 信息; 如果大於0,則還會輸出info 信息。

header或者has_header:一個布爾值,表示輸入數據是否有頭部。默認爲False。

label 或者label_column:一個字符串,表示標籤列。默認爲空字符串。你也可以指定一個整數,如label=0 表示第0列是標籤列。你也可以爲列名添加前綴,如label=prefix:label_name

weight 或者weight_column: 一個字符串,表示樣本權重列。默認爲空字符串。你也可以指定一個整數,如weight=0 表示第0列是權重列。注意:它是剔除了標籤列之後的索引。假如標籤列爲0,權重列爲1,則這裏weight=0。你也可以爲列名添加前綴,如weight=prefix:weight_name

query 或者query_column或者gourp 或者group_column: 一個字符串,query/group ID 列。默認爲空字符串。你也可以指定一個整數,如query=0 表示第0列是query列。注意:它是剔除了標籤列之後的索引。假如標籤列爲0,query列爲1,則這裏query=0。你也可以爲列名添加前綴,如query=prefix:query_name

ignore_column 或者 ignore_
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章