日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

在Python中使用lightgbm

發(fā)布時(shí)間:2025/3/21 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在Python中使用lightgbm 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言-lightgbm是什么?

LightGBM 是一個(gè)梯度 boosting 框架, 使用基于學(xué)習(xí)算法的決策樹. 它是分布式的, 高效的, 裝逼的, 它具有以下優(yōu)勢(shì):

  • 速度和內(nèi)存使用的優(yōu)化
    • 減少分割增益的計(jì)算量
    • 通過直方圖的相減來(lái)進(jìn)行進(jìn)一步的加速
    • 減少內(nèi)存的使用 減少并行學(xué)習(xí)的通信代價(jià)
  • 稀疏優(yōu)化
  • 準(zhǔn)確率的優(yōu)化
    • Leaf-wise (Best-first) 的決策樹生長(zhǎng)策略
    • 類別特征值的最優(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é)會(huì)在python中使用lightgbm,類似文章可以參考在Python中使用XGBoost

相關(guān)參考請(qǐng)看最后

引用

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ì)請(qǐng)參考原文檔

以下示例代碼是本次所使用的,具體的數(shù)據(jù)請(qǐng)前往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

之后我們對(duì)數(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í)指明類別特征,這對(duì)模型精度提升有一定的好處。

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ū)頁(yè)面正在大改,所以這里只給出github的地址,這個(gè)是不會(huì)變的

要注意的一點(diǎn)是如果直接使用lgb訓(xùn)練模型,而不是lightgbm提供的sklearn接口,那么我們就需要參數(shù)列表中的objective這一項(xiàng)來(lái)控制模型所處理的問題,默認(rèn)為回歸regression,除此之外還有加入l1或者l2懲罰項(xiàng)的回歸-regression_l1和regression_l2。二分類問題請(qǐng)使用binary,多分類問題請(qǐng)multiclass。其他更多內(nèi)容請(qǐng)直接參考前面給出的鏈接。

  • Booster parameters:
param = {'num_leaves':31, 'num_trees':100, 'objective':'regression'} param['metric'] = 'rmse'

當(dāng)然你也可以同時(shí)設(shè)置兩個(gè)目標(biāo)損失函數(shù),不過我們這里就暫時(shí)不需要了。

param['metric'] = ['auc', 'binary_logloss']

訓(xùn)練與模型持久化

我們可以通過train方法來(lái)進(jìn)行訓(xùn)練,然后通過save_model方法來(lái)存儲(chǔ)模型。加載模型則需要使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)我們擁有評(píng)價(jià)數(shù)據(jù)集的時(shí)候也就可以使用早停來(lái)獲取更好的模型效果。評(píng)價(jià)數(shù)據(jù)集需要通過valid_sets來(lái)設(shè)置,早停閾值則通過early_stopping_rounds,這一參數(shù)在cv方法與train方法中都是通用的。

這個(gè)方法在最小化的評(píng)價(jià)函數(shù)(或者說(shuō)度量函數(shù))如(L2,log loss,等)和最大化的評(píng)價(jià)函數(shù)如(NDCG,AUC,等)上都是有效的。不過要注意的是,如果你使用不止一個(gè)評(píng)價(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è)評(píng)價(jià)函數(shù),多個(gè)評(píng)價(jià)函數(shù)時(shí),也會(huì)同時(shí)使用其中的每一個(gè)用于早停。而交叉驗(yàn)證中的結(jié)果則會(huì)使用評(píng)級(jí)函數(shù)歷史上最后一個(gè),也就是只要添加了early_stopping_rounds參數(shù),那么交叉驗(yàn)證也就會(huì)默認(rèn)會(huì)使用早停后的結(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ù)測(cè)

如果需要在預(yù)測(cè)中使用早停,請(qǐng)使用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的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。