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

歡迎訪問 生活随笔!

生活随笔

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

python

LightGBM——提升机器算法(图解+理论+安装方法+python代码)

發(fā)布時間:2024/7/5 python 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LightGBM——提升机器算法(图解+理论+安装方法+python代码) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文地址:https://blog.csdn.net/huacha__/article/details/81057150

前言

LightGBM是個快速的,分布式的,高性能的基于決策樹算法的梯度提升框架。可用于排序,分類,回歸以及很多其他的機器學(xué)習(xí)任務(wù)中。

在競賽題中,我們知道XGBoost算法非常熱門,它是一種優(yōu)秀的拉動框架,但是在使用過程中,其訓(xùn)練耗時很長,內(nèi)存占用比較大。在2017年年1月微軟在GitHub的上開源了一個新的升壓工具--LightGBM。在不降低準(zhǔn)確率的前提下,速度提升了10倍左右,占用內(nèi)存下降了3倍左右。因為他是基于決策樹算法的,它采用最優(yōu)的葉明智策略分裂葉子節(jié)點,然而其它的提升算法分裂樹一般采用的是深度方向或者水平明智而不是葉,明智的。因此,在LightGBM算法中,當(dāng)增長到相同的葉子節(jié)點,葉明智算法比水平-wise算法減少更多的損失。因此導(dǎo)致更高的精度,而其他的任何已存在的提升算法都不能夠達(dá)。與此同時,它的速度也讓人感到震驚,這就是該算法名字? ?的原因。

  • 2014年3月,XGBOOST最早作為研究項目,由陳天奇提出

? ? ?(XGBOOST的部分在我的另一篇博客里:https://blog.csdn.net/huacha__/article/details/81029680

  • 2017年1月,微軟發(fā)布首個穩(wěn)定版LightGBM

在微軟亞洲研究院AI頭條分享中的「LightGBM簡介」中,機器學(xué)習(xí)組的主管研究員王太峰提到:微軟DMTK團隊在github上開源了性能超越其它推動決策樹工具LightGBM后,三天之內(nèi)星了1000+次,叉了超過200次。知乎上有近千人關(guān)注“如何看待微軟開源的LightGBM?”問題,被評價為“速度驚人”,“非常有啟發(fā)”,“支持分布式” “代碼清晰易懂”,“占用內(nèi)存小”等。以下是微軟官方提到的LightGBM的各種優(yōu)點,以及該項目的開源地址。

科普鏈接:如何玩轉(zhuǎn)LightGBM https://v.qq.com/x/page/k0362z6lqix.html

目錄

前言

一、"What We Do in?LightGBM?"

二、在不同數(shù)據(jù)集上的對比

三、LightGBM的細(xì)節(jié)技術(shù)

1、直方圖優(yōu)化

2、存儲記憶優(yōu)化

3、深度限制的節(jié)點展開方法

4、直方圖做差優(yōu)化

5、順序訪問梯度

6、支持類別特征

7、支持并行學(xué)習(xí)

四、MacOS安裝LightGBM

五、用python實現(xiàn)LightGBM算法


一、"What We Do in?LightGBM?"

下面這個表格給出了XGBoost和LightGBM之間更加細(xì)致的性能對比,包括了樹的生長方式,LightGBM是直接去選擇獲得最大收益的結(jié)點來展開,而XGBoost是通過按層增長的方式來做,這樣呢LightGBM能夠在更小的計算代價上建立我們需要的決策樹。當(dāng)然在這樣的算法中我們也需要控制樹的深度和每個葉子結(jié)點的最小數(shù)據(jù)量,從而減少過擬合。

小小翻譯一下,有問題還望指出

?XGBoostLightGBM
樹木生長算法

按層生長的方式

<p>有利于工程優(yōu)化,但對學(xué)習(xí)模型效率不高</p></td><td style="width:306px;"><p>直接<strong>選擇最大收益的節(jié)點</strong>來展開,在更小的計算代價上去選擇我們需要的決策樹</p><p>控制樹的深度和每個葉子節(jié)點的數(shù)據(jù)量,能減少過擬合</p></td></tr><tr><td style="width:115px;">劃分點搜索算 法</td><td style="width:207px;">對特征預(yù)排序的方法</td><td style="width:306px;">直方圖算法:將特征值分成許多小筒,進(jìn)而在筒上搜索分裂點,減少了計算代價和存儲代價,得到更好的性能。另外數(shù)據(jù)結(jié)構(gòu)的變化使得在細(xì)節(jié)處的變化理上效率會不同</td></tr><tr><td style="width:115px;">內(nèi)存開銷</td><td style="width:207px;">8個字節(jié)</td><td style="width:306px;">1個字節(jié)</td></tr><tr><td style="width:115px;">劃分的計算增益</td><td style="width:207px;">數(shù)據(jù)特征</td><td style="width:306px;">容器特征</td></tr><tr><td style="width:115px;">高速緩存優(yōu)化</td><td style="width:207px;">無</td><td style="width:306px;">在Higgs數(shù)據(jù)集上加速40%</td></tr><tr><td style="width:115px;">類別特征處理</td><td style="width:207px;">無</td><td style="width:306px;">在Expo數(shù)據(jù)集上速度快了8倍</td></tr></tbody></table></div><h1 id="%E5%9C%A8%E4%B8%8D%E5%90%8C%E6%95%B0%E6%8D%AE%E9%9B%86%E4%B8%8A%E7%9A%84%E5%AF%B9%E6%AF%94"><a name="t2"></a>二、在不同數(shù)據(jù)集上的對比</h1>

higgs和expo都是分類數(shù)據(jù),yahoo ltr和msltr都是排序數(shù)據(jù),在這些數(shù)據(jù)中,LightGBM都有更好的準(zhǔn)確率和更強的內(nèi)存使用量。

準(zhǔn)確率  ?

內(nèi)存使用情況

計算速度的對比,完成相同的訓(xùn)練量XGBoost通常耗費的時間是LightGBM的數(shù)倍之上,在higgs數(shù)據(jù)集上,它們的差距更是達(dá)到了15倍以上。

三、LightGBM的細(xì)節(jié)技術(shù)

1、直方圖優(yōu)化

XGBoost中采用預(yù)排序的方法,計算過程當(dāng)中是按照value的排序,逐個數(shù)據(jù)樣本來計算劃分收益,這樣的算法能夠精確的找到最佳劃分值,但是代價比較大同時也沒有較好的推廣性。

在LightGBM中沒有使用傳統(tǒng)的預(yù)排序的思路,而是將這些精確的連續(xù)的每一個value劃分到一系列離散的域中,也就是筒子里。以浮點型數(shù)據(jù)來舉例,一個區(qū)間的值會被作為一個筒,然后以這些筒為精度單位的直方圖來做。這樣一來,數(shù)據(jù)的表達(dá)變得更加簡化,減少了內(nèi)存的使用,而且直方圖帶來了一定的正則化的效果,能夠使我們做出來的模型避免過擬合且具有更好的推廣性。

看下直方圖優(yōu)化的細(xì)節(jié)處理

可以看到,這是按照bin來索引“直方圖”,所以不用按照每個“特征”來排序,也不用一一去對比不同“特征”的值,大大的減少了運算量。

2、存儲記憶優(yōu)化

當(dāng)我們用數(shù)據(jù)的bin描述數(shù)據(jù)特征的時候帶來的變化:首先是不需要像預(yù)排序算法那樣去存儲每一個排序后數(shù)據(jù)的序列,也就是下圖灰色的表,在LightGBM中,這部分的計算代價是0;第二個,一般bin會控制在一個比較小的范圍,所以我們可以用更小的內(nèi)存來存儲

3、深度限制的節(jié)點展開方法

LightGBM使用了帶有深度限制的節(jié)點展開方法(Leaf-wise)來提高模型精度,這是比XGBoost中Level-wise更高效的方法。它可以降低訓(xùn)練誤差得到更好的精度。但是單純的使用Leaf-wise可能會生長出比較深的樹,在小數(shù)據(jù)集上可能會造成過擬合,因此在Leaf-wise之上多加一個深度限制

4、直方圖做差優(yōu)化

直方圖做差優(yōu)化可以達(dá)到兩倍的加速,可以觀察到一個葉子節(jié)點上的直方圖,可以由它的父親節(jié)點直方圖減去它兄弟節(jié)點的直方圖來得到。根據(jù)這一點我們可以構(gòu)造出來數(shù)據(jù)量比較小的葉子節(jié)點上的直方圖,然后用直方圖做差來得到數(shù)據(jù)量比較大的葉子節(jié)點上的直方圖,從而達(dá)到加速的效果。

5、順序訪問梯度

預(yù)排序算法中有兩個頻繁的操作會導(dǎo)致cache-miss,也就是緩存消失(對速度的影響很大,特別是數(shù)據(jù)量很大的時候,順序訪問比隨機訪問的速度快4倍以上 ?)。

  • 對梯度的訪問:在計算增益的時候需要利用梯度,對于不同的特征,訪問梯度的順序是不一樣的,并且是隨機的
  • 對于索引表的訪問:預(yù)排序算法使用了行號和葉子節(jié)點號的索引表,防止數(shù)據(jù)切分的時候?qū)λ械奶卣鬟M(jìn)行切分。同訪問梯度一樣,所有的特征都要通過訪問這個索引表來索引。

這兩個操作都是隨機的訪問,會給系統(tǒng)性能帶來非常大的下降。

LightGBM使用的直方圖算法能很好的解決這類問題。首先。對梯度的訪問,因為不用對特征進(jìn)行排序,同時,所有的特征都用同樣的方式來訪問,所以只需要對梯度訪問的順序進(jìn)行重新排序,所有的特征都能連續(xù)的訪問梯度。并且直方圖算法不需要把數(shù)據(jù)id到葉子節(jié)點號上(不需要這個索引表,沒有這個緩存消失問題)

6、支持類別特征

傳統(tǒng)的機器學(xué)習(xí)一般不能支持直接輸入類別特征,需要先轉(zhuǎn)化成多維的0-1特征,這樣無論在空間上還是時間上效率都不高。LightGBM通過更改決策樹算法的決策規(guī)則,直接原生支持類別特征,不需要轉(zhuǎn)化,提高了近8倍的速度

7、支持并行學(xué)習(xí)

LightGBM原生支持并行學(xué)習(xí),目前支持特征并行(Featrue Parallelization)數(shù)據(jù)并行(Data Parallelization)兩種,還有一種是基于投票的數(shù)據(jù)并行(Voting Parallelization)

  • 特征并行的主要思想是在不同機器、在不同的特征集合上分別尋找最優(yōu)的分割點,然后在機器間同步最優(yōu)的分割點。
  • 數(shù)據(jù)并行則是讓不同的機器先在本地構(gòu)造直方圖,然后進(jìn)行全局的合并,最后在合并的直方圖上面尋找最優(yōu)分割點。

LightGBM針對這兩種并行方法都做了優(yōu)化。

  • 特征并行算法中,通過在本地保存全部數(shù)據(jù)避免對數(shù)據(jù)切分結(jié)果的通信。
  • 數(shù)據(jù)并行中使用分散規(guī)約 (Reduce scatter) 把直方圖合并的任務(wù)分?jǐn)偟讲煌臋C器,降低通信和計算,并利用直方圖做差,進(jìn)一步減少了一半的通信量。
  • 基于投票的數(shù)據(jù)并行(Voting Parallelization)則進(jìn)一步優(yōu)化數(shù)據(jù)并行中的通信代價,使通信代價變成常數(shù)級別。在數(shù)據(jù)量很大的時候,使用投票并行可以得到非常好的加速效果。

下圖更好的說明了以上這三種并行學(xué)習(xí)的整體流程:

在直方圖合并的時候,通信代價比較大,基于投票的數(shù)據(jù)并行能夠很好的解決這一點。

?

四、MacOS安裝LightGBM

  • #先安裝cmake和gcc,安裝過的直接跳過前兩步
  • brew install cmake
  • brew install gcc
  • git clone --recursive https://github.com/Microsoft/LightGBM
  • cd LightGBM
  • #在cmake之前有一步添加環(huán)境變量
  • export CXX=g++-7 CC=gcc-7
  • mkdir build ; cd build
  • cmake ..
  • make -j4
  • cd ../python-package
  • sudo python setup.py install
  • 來測試一下:

    大功告成!

    值得注意的是:pip list里面沒有l(wèi)ightgbm,以后使用lightgbm需要到特定的文件夾中運行。我的地址是:

    /Users/ fengxianhe / LightGBM /python-package

    ?

    五,用python實現(xiàn)LightGBM算法

    為了演示LightGBM在蟒蛇中的用法,本代碼以sklearn包中自帶的鳶尾花數(shù)據(jù)集為例,用lightgbm算法實現(xiàn)鳶尾花種類的分類任務(wù)。

  • # coding: utf-8
  • # pylint: disable = invalid-name, C0111
  • # 函數(shù)的更多使用方法參見LightGBM官方文檔:http://lightgbm.readthedocs.io/en/latest/Python-Intro.html
  • import json
  • import lightgbm as lgb
  • import pandas as pd
  • from sklearn.metrics import mean_squared_error
  • from sklearn.datasets import load_iris
  • from sklearn.model_selection import train_test_split
  • from sklearn.datasets import make_classification
  • iris = load_iris() # 載入鳶尾花數(shù)據(jù)集
  • data=iris.data
  • target = iris.target
  • X_train,X_test,y_train,y_test =train_test_split(data,target,test_size=0.2)
  • # 加載你的數(shù)據(jù)
  • # print('Load data...')
  • # df_train = pd.read_csv('../regression/regression.train', header=None, sep='\t')
  • # df_test = pd.read_csv('../regression/regression.test', header=None, sep='\t')
  • #
  • # y_train = df_train[0].values
  • # y_test = df_test[0].values
  • # X_train = df_train.drop(0, axis=1).values
  • # X_test = df_test.drop(0, axis=1).values
  • # 創(chuàng)建成lgb特征的數(shù)據(jù)集格式
  • lgb_train = lgb.Dataset(X_train, y_train) # 將數(shù)據(jù)保存到LightGBM二進(jìn)制文件將使加載更快
  • lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train) # 創(chuàng)建驗證數(shù)據(jù)
  • # 將參數(shù)寫成字典下形式
  • params = {
  • 'task': 'train',
  • 'boosting_type': 'gbdt', # 設(shè)置提升類型
  • 'objective': 'regression', # 目標(biāo)函數(shù)
  • 'metric': {'l2', 'auc'}, # 評估函數(shù)
  • 'num_leaves': 31, # 葉子節(jié)點數(shù)
  • 'learning_rate': 0.05, # 學(xué)習(xí)速率
  • 'feature_fraction': 0.9, # 建樹的特征選擇比例
  • 'bagging_fraction': 0.8, # 建樹的樣本采樣比例
  • 'bagging_freq': 5, # k 意味著每 k 次迭代執(zhí)行bagging
  • 'verbose': 1 # <0 顯示致命的, =0 顯示錯誤 (警告), >0 顯示信息
  • }
  • print('Start training...')
  • # 訓(xùn)練 cv and train
  • gbm = lgb.train(params,lgb_train,num_boost_round=20,valid_sets=lgb_eval,early_stopping_rounds=5) # 訓(xùn)練數(shù)據(jù)需要參數(shù)列表和數(shù)據(jù)集
  • print('Save model...')
  • gbm.save_model('model.txt') # 訓(xùn)練后保存模型到文件
  • print('Start predicting...')
  • # 預(yù)測數(shù)據(jù)集
  • y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration) #如果在訓(xùn)練期間啟用了早期停止,可以通過best_iteration方式從最佳迭代中獲得預(yù)測
  • # 評估模型
  • print('The rmse of prediction is:', mean_squared_error(y_test, y_pred) ** 0.5) # 計算真實值和預(yù)測值之間的均方根誤差
  • 輸出結(jié)果:

    可以看到預(yù)測值和真實值之間的均方根誤差為0.722972。

    總結(jié)

    以上是生活随笔為你收集整理的LightGBM——提升机器算法(图解+理论+安装方法+python代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 久久久久久久久久久影院 | 久久综合一区 | 日本免费黄色大片 | 奇米狠狠去啦 | 六月激情网 | 色妇av| 精品久久久99 | 免费观看视频在线观看 | 一级片免费看视频 | 99久久婷婷国产综合精品青牛牛 | 亚洲精品网站在线 | 男人和女人日批视频 | 国产无遮无挡120秒 欧美综合图片 | 日韩av免费在线播放 | 久久大陆 | 精品国模一区二区三区欧美 | 一级福利视频 | 又大又粗又爽18禁免费看 | 欧美毛片视频 | 中国av一区二区 | 中文字幕亚洲第一 | 天天天av | 中文字幕亚洲欧美日韩 | 日韩三级中文字幕 | 国产黄色一区 | 亚洲av无码国产精品永久一区 | 国产成人精品免高潮在线观看 | 日韩欧美三级在线 | 欧美日韩在线观看一区二区三区 | 国产精品成人无码专区 | 伊人青青久久 | 91人人视频 | 国产黄色片在线免费观看 | 老司机黄色片 | 九色在线| 夜夜综合网 | 五月婷婷激情五月 | 婷婷色图| 伊人论坛 | 亚洲视频综合 | 91涩涩涩| 午夜肉伦伦影院 | 亚洲欧美日本一区二区三区 | 日本三级欧美三级 | www在线观看国产 | 一区二区免费视频 | 西西44rtwww国产精品 | 狠狠澡| 国产精品大全 | 青草草在线观看 | 亚洲成人中文字幕在线 | 黄色大片网站在线观看 | 99热超碰在线 | 国产激情文学 | 欧美视频一区在线观看 | 亚洲在线观看免费视频 | 中文字幕日日 | 国产精品天美传媒沈樵 | 日韩在线免费观看视频 | av影院在线播放 | 已婚少妇美妙人妻系列 | 成人亚洲黄色 | 美女国产毛片a区内射 | 成人激情视频网站 | 久久一区二区三区四区 | 一级黄色片欧美 | 五月天综合激情 | 成人区一区二区 | 中文字幕 亚洲一区 | 精品久久久在线观看 | 狠狠躁18三区二区一区 | 中国av免费 | 中文字幕韩日 | 亚洲无线看 | 打开每日更新在线观看 | av久草 | 国产在线看片 | 中文字幕第一页在线 | 91美女网站| 男男做性免费视频网 | 特级西西人体 | 绯色av蜜臀vs少妇 | 色欲av永久无码精品无码蜜桃 | 在线视频亚洲欧美 | 日韩欧美精品中文字幕 | 国产免费一区二区视频 | 久久中文字幕精品 | 亚洲欧美在线视频免费 | 一区=区三区乱码 | 日本h漫在线观看 | 在线播放av网址 | 亚洲首页| 天堂а在线中文在线新版 | 四虎新网站 | 插插操操 | 日韩精品中文字幕一区二区三区 | 精品美女一区二区三区 | 成年人免费毛片 | 成人精品一区二区 |