在Python中使用lightgbm
前言-lightgbm是什么?
LightGBM 是一個(gè)梯度 boosting 框架, 使用基于學(xué)習(xí)算法的決策樹. 它是分布式的, 高效的, 裝逼的, 它具有以下優(yōu)勢:
- 速度和內(nèi)存使用的優(yōu)化
- 減少分割增益的計(jì)算量
- 通過直方圖的相減來進(jìn)行進(jìn)一步的加速
- 減少內(nèi)存的使用 減少并行學(xué)習(xí)的通信代價(jià)
- 稀疏優(yōu)化
- 準(zhǔn)確率的優(yōu)化
- Leaf-wise (Best-first) 的決策樹生長策略
- 類別特征值的最優(yōu)分割
- 網(wǎng)絡(luò)通信的優(yōu)化
- 并行學(xué)習(xí)的優(yōu)化
- 特征并行
- 數(shù)據(jù)并行
- 投票并行
- GPU 支持可處理大規(guī)模數(shù)據(jù)
前言-這是什么?
這是強(qiáng)化版本的lightgbm的Python用戶指南,由FontTian個(gè)人在Lightgbm官方文檔的基礎(chǔ)上改寫,旨在能夠更快的讓lightgbm的學(xué)習(xí)者學(xué)會在python中使用lightgbm,類似文章可以參考在Python中使用XGBoost
相關(guān)參考請看最后
引用
import lightgbm as lgb數(shù)據(jù)格式
LightGBM Python 版本的模型能夠從以下格式中加載數(shù)據(jù):
- libsvm/tsv/csv/txt format file
- NumPy 2D array(s), pandas DataFrame, SciPy sparse matrix
- LightGBM binary file
各種格式我們這里不在太多敘述,詳細(xì)請參考原文檔
以下示例代碼是本次所使用的,具體的數(shù)據(jù)請前往github下載。
import numpy as np import pandas as pddef GetNewDataByPandas():wine = pd.read_csv("../Data/UCI/wine/wine.csv")wine['alcohol**2'] = pow(wine["alcohol"], 2)wine['volatileAcidity*alcohol'] = wine["alcohol"] * wine['volatile acidity']y = np.array(wine.quality)X = np.array(wine.drop("quality", axis=1))columns = np.array(wine.columns)return X, y, columns之后我們對數(shù)據(jù)進(jìn)行分割和轉(zhuǎn)換,同時(shí)這里也給出一個(gè)使用lightgbm進(jìn)行數(shù)據(jù)保存的例子
from sklearn.model_selection import train_test_split # Read wine quality data from file X, y, wineNames = GetNewDataByPandas()# split data to [[0.8,0.2],01] x_train_all, x_predict, y_train_all, y_predict = train_test_split(X, y, test_size=0.10, random_state=100)x_train, x_test, y_train, y_test = train_test_split(x_train_all, y_train_all, test_size=0.2, random_state=100)train_data = lgb.Dataset(data=x_train,label=y_train) test_data = lgb.Dataset(data=x_test,label=y_test)train_data.save_binary("../Data/UCI/wine/wine_lightgbm_train.bin")同時(shí)我們還可以在lightgbm加載數(shù)據(jù)的時(shí)候同時(shí)指明類別特征,這對模型精度提升有一定的好處。
train_data = lgb.Dataset(data, label=label, feature_name=['c1', 'c2', 'c3'], categorical_feature=['c3'])同樣的權(quán)重也可以通過參數(shù)weight添加,特征名稱則可以通過參數(shù)feature_name指明
參數(shù)設(shè)置
模型參數(shù)設(shè)置如下,具體參數(shù)可以參考官方文檔列表,如果有需要,也可以參考ApacheCN開源社區(qū)提供的中文版本,因?yàn)槟壳吧鐓^(qū)頁面正在大改,所以這里只給出github的地址,這個(gè)是不會變的
要注意的一點(diǎn)是如果直接使用lgb訓(xùn)練模型,而不是lightgbm提供的sklearn接口,那么我們就需要參數(shù)列表中的objective這一項(xiàng)來控制模型所處理的問題,默認(rèn)為回歸regression,除此之外還有加入l1或者l2懲罰項(xiàng)的回歸-regression_l1和regression_l2。二分類問題請使用binary,多分類問題請multiclass。其他更多內(nèi)容請直接參考前面給出的鏈接。
- Booster parameters:
當(dāng)然你也可以同時(shí)設(shè)置兩個(gè)目標(biāo)損失函數(shù),不過我們這里就暫時(shí)不需要了。
param['metric'] = ['auc', 'binary_logloss']訓(xùn)練與模型持久化
我們可以通過train方法來進(jìn)行訓(xùn)練,然后通過save_model方法來存儲模型。加載模型則需要使lgb.Booster()方法。
# Training a model requires a parameter list and data set: num_round = 10 bst = lgb.train(param, train_data, num_round, valid_sets=[test_data]) # After training, the model can be saved: bst.save_model('model.txt') # A saved model can be loaded: bst = lgb.Booster(model_file='model.txt') #init model [1] valid_0's rmse: 0.776822 [2] valid_0's rmse: 0.745311 ... [100] valid_0's rmse: 0.568459交叉驗(yàn)證
# Training with 5-fold CV: num_round = 10 lgb.cv(param, train_data, num_round, nfold=5) {'rmse-mean': [0.7752979247352452,0.7504569754070066,...0.623599205645095],'rmse-stdv': [0.012997665079702762,0.010725846259504226,...0.031637346872895655,0.03154536582175296]}早停
當(dāng)我們擁有評價(jià)數(shù)據(jù)集的時(shí)候也就可以使用早停來獲取更好的模型效果。評價(jià)數(shù)據(jù)集需要通過valid_sets來設(shè)置,早停閾值則通過early_stopping_rounds,這一參數(shù)在cv方法與train方法中都是通用的。
這個(gè)方法在最小化的評價(jià)函數(shù)(或者說度量函數(shù))如(L2,log loss,等)和最大化的評價(jià)函數(shù)如(NDCG,AUC,等)上都是有效的。不過要注意的是,如果你使用不止一個(gè)評價(jià)函數(shù),他們中的每一個(gè)都將被用于早停。
bst = lgb.train(param, train_data, num_round, valid_sets=[test_data], early_stopping_rounds=10) bst.save_model('model.txt', num_iteration=bst.best_iteration) [1] valid_0's rmse: 0.776822 Training until validation scores don't improve for 10 rounds. [2] valid_0's rmse: 0.745311 ... [77] valid_0's rmse: 0.569041 Early stopping, best iteration is: [67] valid_0's rmse: 0.568264<lightgbm.basic.Booster at 0x7f4db097a208>在cv中使用方法相同,同時(shí)也要保證最起碼需要一個(gè)評價(jià)函數(shù),多個(gè)評價(jià)函數(shù)時(shí),也會同時(shí)使用其中的每一個(gè)用于早停。而交叉驗(yàn)證中的結(jié)果則會使用評級函數(shù)歷史上最后一個(gè),也就是只要添加了early_stopping_rounds參數(shù),那么交叉驗(yàn)證也就會默認(rèn)會使用早停后的結(jié)果。
# Use earlystoppping and training with 5-fold CV: num_round = 10 lgb.cv(param, train_data, num_round, nfold=5,early_stopping_rounds=10) {'rmse-mean': [0.7752979247352452,0.7504569754070065,...0.6162297019817496,0.6158322957365135],'rmse-stdv': [0.012997665079702762,0.010725846259504221,...0.02396647921855839]}預(yù)測
如果需要在預(yù)測中使用早停,請使用num_iteration=bst.best_iteration。效果如下
ypred = bst.predict(x_predict, num_iteration=bst.best_iteration)from sklearn.metrics import mean_squared_error RMSE = np.sqrt(mean_squared_error(y_predict, ypred))print("RMSE of predict :",RMSE) RMSE of predict : 0.5956830546692128參考與學(xué)習(xí)推薦
- lightgbm官方文檔
- ApacheCN維護(hù)的的中文文檔的github地址
總結(jié)
以上是生活随笔為你收集整理的在Python中使用lightgbm的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Python中使用XGBoost
- 下一篇: Lightgbm with Hypero