LightGBM 做爲近兩年微軟開源的模型,相比XGBoost有以下優勢:html
更快的訓練速度和更高的效率:LightGBM使用基於直方圖的算法。例如,它將連續的特徵值分桶(buckets)裝進離散的箱子(bins),這是的訓練過程當中變得更快。還有一點是LightGBM的分裂節點的方式與XGBoost不同。LGB避免了對整層節點分裂法,而採用了對增益最大的節點進行深刻分解的方法。這樣節省了大量分裂節點的資源。下圖一是XGBoost的分裂方式,圖二是LightGBM的分裂方式。 算法
更低的內存佔用:使用離散的箱子(bins)保存並替換連續值致使更少的內存佔用。apache
更高的準確率(相比於其餘任何提高算法):它經過leaf-wise分裂方法產生比level-wise分裂方法更復雜的樹,這就是實現更高準確率的主要因素。然而,它有時候或致使過擬合,可是咱們能夠經過設置 max-depth 參數來防止過擬合的發生。bash
大數據處理能力:相比於XGBoost,因爲它在訓練時間上的縮減,它一樣可以具備處理大數據的能力。網絡
支持並行學習app
咱們都知道,XGBoost 一共有三類參數通用參數,學習目標參數,Booster參數,那麼對於LightGBM,咱們有核心參數,學習控制參數,IO參數,目標參數,度量參數,網絡參數,GPU參數,模型參數,這裏我常修改的即是核心參數,學習控制參數,度量參數等。更詳細的請看LightGBM中文文檔dom
boosting
:也稱boost
,boosting_type
.默認是gbdt
。函數
LGB裏面的boosting參數要比xgb多很多,咱們有傳統的gbdt
,也有rf
,dart
,doss
,最後兩種不太深刻理解,可是試過,仍是gbdt的效果比較經典穩定post
num_thread
:也稱做num_thread
,nthread
.指定線程的個數。學習
這裏官方文檔提到,數字設置成cpu內核數比線程數訓練效更快(考慮到如今cpu大多超線程)。並行學習不該該設置成所有線程,這反而使得訓練速度不佳。
application
:默認爲regression
。,也稱objective
, app
這裏指的是任務目標
regression_l2
, L2 loss, alias=regression, mean_squared_error, mseregression_l1
, L1 loss, alias=mean_absolute_error, maehuber
, Huber lossfair
, Fair losspoisson
, Poisson regressionquantile
, Quantile regressionquantile_l2
, 相似於 quantile, 可是使用了 L2 lossmulticlass
, softmax 目標函數, 應該設置好 num_class
multiclassova
, One-vs-All 二分類目標函數, 應該設置好 num_class
xentropy
, 目標函數爲 cross-entropy (同時有可選擇的線性權重), alias=cross_entropyxentlambda
, 替代參數化的 cross-entropy, alias=cross_entropy_lambdalabel_gain
能夠被用來設置 int 標籤的增益 (權重)valid
:驗證集選用,也稱test
,valid_data
, test_data
.支持多驗證集,以,
分割
learning_rate
:也稱shrinkage_rate
,梯度降低的步長。默認設置成0.1,咱們通常設置成0.05-0.2
之間
num_leaves
:也稱num_leaf
,新版lgb將這個默認值改爲31,這表明的是一棵樹上的葉子數
device
:default=cpu, options=cpu, gpu
feature_fraction
:default=1.0, type=double, 0.0 < feature_fraction < 1.0, 也稱sub_feature
, colsample_bytree
bagging_fraction
:default=1.0, type=double, 0.0 < bagging_fraction < 1.0, 也稱sub_row
, subsample
bagging_freq
: default=0, type=int, 也稱subsample_freq
lambda_l1
:默認爲0,也稱reg_alpha,表示的是L1正則化,double類型lambda_l2
:默認爲0,也稱reg_lambda,表示的是L2正則化,double類型cat_smooth
: default=10, type=double
metric
: default={l2 for regression}, {binary_logloss for binary classification}, {ndcg for lambdarank}, type=multi-enum, options=l1, l2, ndcg, auc, binary_logloss, binary_error …
l1
, absolute loss, alias=mean_absolute_error, mael2
, square loss, alias=mean_squared_error, msel2_root
, root square loss, alias=root_mean_squared_error, rmsequantile
, Quantile regressionhuber
, Huber lossfair
, Fair losspoisson
, Poisson regressionndcg
, NDCGmap
, MAPauc
, AUCbinary_logloss
, log lossbinary_error
, 樣本: 0 的正確分類, 1 錯誤分類multi_logloss
, mulit-class 損失日誌分類multi_error
, error rate for mulit-class 出錯率分類xentropy
, cross-entropy (與可選的線性權重), alias=cross_entropyxentlambda
, 「intensity-weighted」 交叉熵, alias=cross_entropy_lambdakldiv
, Kullback-Leibler divergence, alias=kullback_leibler總的來講,我仍是以爲LightGBM比XGBoost用法上差距不大。參數也有不少重疊的地方。不少XGBoost的核心原理放在LightGBM上一樣適用。 一樣的,Lgb也是有train()函數和LGBClassifier()與LGBRegressor()函數。後兩個主要是爲了更加貼合sklearn的用法,這一點和XGBoost同樣。
GridSearch 我在這裏有介紹,能夠戳進去看看。我主要講講LGBClassifier的調參用法。
數據我上傳在這裏:直接上代碼!
import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import GridSearchCV # Perforing grid search
from sklearn.model_selection import train_test_split
train_data = pd.read_csv('train.csv') # 讀取數據
y = train_data.pop('30').values # 用pop方式將訓練數據中的標籤值y取出來,做爲訓練目標,這裏的‘30’是標籤的列名
col = train_data.columns
x = train_data[col].values # 剩下的列做爲訓練數據
train_x, valid_x, train_y, valid_y = train_test_split(x, y, test_size=0.333, random_state=0) # 分訓練集和驗證集
train = lgb.Dataset(train_x, train_y)
valid = lgb.Dataset(valid_x, valid_y, reference=train)
parameters = {
'max_depth': [15, 20, 25, 30, 35],
'learning_rate': [0.01, 0.02, 0.05, 0.1, 0.15],
'feature_fraction': [0.6, 0.7, 0.8, 0.9, 0.95],
'bagging_fraction': [0.6, 0.7, 0.8, 0.9, 0.95],
'bagging_freq': [2, 4, 5, 6, 8],
'lambda_l1': [0, 0.1, 0.4, 0.5, 0.6],
'lambda_l2': [0, 10, 15, 35, 40],
'cat_smooth': [1, 10, 15, 20, 35]
}
gbm = lgb.LGBMClassifier(boosting_type='gbdt',
objective = 'binary',
metric = 'auc',
verbose = 0,
learning_rate = 0.01,
num_leaves = 35,
feature_fraction=0.8,
bagging_fraction= 0.9,
bagging_freq= 8,
lambda_l1= 0.6,
lambda_l2= 0)
# 有了gridsearch咱們便不須要fit函數
gsearch = GridSearchCV(gbm, param_grid=parameters, scoring='accuracy', cv=3)
gsearch.fit(train_x, train_y)
print("Best score: %0.3f" % gsearch.best_score_)
print("Best parameters set:")
best_parameters = gsearch.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):
print("\t%s: %r" % (param_name, best_parameters[param_name]))
複製代碼