如何開發(fā) LightGBM集成樹算法模型
Light Gradient Boosted Machine,簡稱LightGBM,是一個(gè)開源庫,提供了梯度提升算法的高效實(shí)現(xiàn)。
LightGBM 通過添加一種自動(dòng)特征選擇以及專注于具有更大梯度的提升示例來擴(kuò)展梯度提升算法。這可以顯著加快訓(xùn)練速度并提高預(yù)測性能。
因此,當(dāng)使用表格數(shù)據(jù)進(jìn)行回歸和分類預(yù)測建模任務(wù)時(shí),LightGBM 已成為機(jī)器學(xué)習(xí)競賽的事實(shí)上的算法。因此,它應(yīng)為梯度提升方法以及極限梯度提升 (XGBoost) 的普及和廣泛采用負(fù)有一部分責(zé)任。
在本教程中,您將了解如何開發(fā)用于分類和回歸的 Light Gradient Boosted Machine 集成。
完成本教程后,您將了解:
Light Gradient Boosted Machine (LightGBM) 是隨機(jī)梯度提升集成算法的高效開源實(shí)現(xiàn)。
如何使用 scikit-learn API 開發(fā)用于分類和回歸的 LightGBM 集成。
如何探索 LightGBM 模型超參數(shù)對(duì)模型性能的影響。
使用我的新書Ensemble Learning Algorithms With Python開始您的項(xiàng)目,包括分步教程和所有示例的Python 源代碼文件。
讓我們開始吧。
教程概述
本教程分為三個(gè)部分;他們是:
Light梯度提升機(jī)算法
LightGBM Scikit-Learn API
用于分類的 LightGBM 集成
用于回歸的 LightGBM 集成
LightGBM 超參數(shù)
探索樹的數(shù)量
探索樹深度
探索學(xué)習(xí)率
探索提升類型
Light梯度提升機(jī)算法
梯度提升是指一類可用于分類或回歸預(yù)測建模問題的集成機(jī)器學(xué)習(xí)算法。
集成是從決策樹模型構(gòu)建的。一次將一棵樹添加到集成中并進(jìn)行擬合以糾正先前模型產(chǎn)生的預(yù)測錯(cuò)誤。這是一種稱為 boosting 的集成機(jī)器學(xué)習(xí)模型。
使用任何任意可微損失函數(shù)和梯度下降優(yōu)化算法來擬合模型。這使該技術(shù)得名“梯度提升”,因?yàn)殡S著模型的擬合,損失梯度被最小化,很像神經(jīng)網(wǎng)絡(luò)。
有關(guān)梯度提升的更多信息,請(qǐng)參閱教程:
機(jī)器學(xué)習(xí)梯度提升算法的簡單介紹
Light Gradient Boosted Machine,簡稱 LightGBM,是梯度提升的開源實(shí)現(xiàn),旨在提高效率,并且可能比其他實(shí)現(xiàn)更有效。
因此,LightGBM指的是開源項(xiàng)目、軟件庫和機(jī)器學(xué)習(xí)算法。這樣,它與Extreme Gradient Boosting 或 XGBoost 技術(shù)非常相似。
LightGBM 由郭林柯等人描述。在 2017 年題為“ LightGBM:一種高效的梯度提升決策樹”的論文中。該實(shí)現(xiàn)引入了兩個(gè)關(guān)鍵思想:GOSS 和 EFB。
基于梯度的單邊采樣,簡稱 GOSS,是對(duì)梯度提升方法的一種修改,將注意力集中在那些導(dǎo)致更大梯度的訓(xùn)練示例上,從而加快學(xué)習(xí)速度并降低方法的計(jì)算復(fù)雜度。
使用 GOSS,我們排除了很大一部分具有小梯度的數(shù)據(jù)實(shí)例,僅使用其余部分來估計(jì)信息增益。我們證明,由于具有較大梯度的數(shù)據(jù)實(shí)例在信息增益的計(jì)算中起著更重要的作用,因此 GOSS 可以以更小的數(shù)據(jù)量獲得相當(dāng)準(zhǔn)確的信息增益估計(jì)。
— LightGBM:一種高效的梯度提升決策樹,2017 年。
Exclusive Feature Bundling,簡稱 EFB,是一種捆綁稀疏(大部分為零)互斥特征的方法,例如已進(jìn)行單熱編碼的分類變量輸入。因此,它是一種自動(dòng)特征選擇。
……我們捆綁了互斥的特征(即,它們很少同時(shí)取非零值),以減少特征的數(shù)量。
— LightGBM:一種高效的梯度提升決策樹,2017 年。
這兩個(gè)變化一起可以將算法的訓(xùn)練時(shí)間加快多達(dá) 20 倍。因此,LightGBM 可以被視為添加 GOSS 和 EFB 的梯度提升決策樹 (GBDT)。
我們將新的 GBDT 實(shí)現(xiàn)稱為 GOSS 和 EFB LightGBM。我們在多個(gè)公共數(shù)據(jù)集上的實(shí)驗(yàn)表明,LightGBM 將傳統(tǒng) GBDT 的訓(xùn)練過程加快了 20 多倍,同時(shí)達(dá)到了幾乎相同的精度
— LightGBM:一種高效的梯度提升決策樹,2017 年。
LightGBM Scikit-Learn API
LightGBM 可以作為獨(dú)立庫安裝,并且可以使用 scikit-learn API 開發(fā) LightGBM 模型。
第一步是安裝 LightGBM 庫(如果尚未安裝)。這可以在大多數(shù)平臺(tái)上使用 pip python 包管理器來實(shí)現(xiàn);例如:
sudo pip install lightgbm
然后,您可以確認(rèn) LightGBM 庫已正確安裝并且可以通過運(yùn)行以下腳本來使用。
# check lightgbm version
import lightgbm
print(lightgbm.__version__)
運(yùn)行該腳本將打印您已安裝的 LightGBM 庫的版本。
您的版本應(yīng)該相同或更高。如果沒有,您必須升級(jí) LightGBM 庫的版本。
如果您需要針對(duì)您的開發(fā)環(huán)境的特定說明,請(qǐng)參閱教程:
LightGBM 安裝指南
LightGBM 庫有自己的自定義 API,盡管我們將通過 scikit-learn 包裝類使用該方法:LGBMRegressor和LGBMClassifier。這將使我們能夠使用 scikit-learn 機(jī)器學(xué)習(xí)庫中的全套工具來準(zhǔn)備數(shù)據(jù)和評(píng)估模型。
兩個(gè)模型以相同的方式運(yùn)行,并采用相同的參數(shù)來影響決策樹的創(chuàng)建和添加到集成的方式。
隨機(jī)性用于構(gòu)建模型。這意味著每次在相同的數(shù)據(jù)上運(yùn)行算法時(shí),都會(huì)產(chǎn)生一個(gè)略有不同的模型。
當(dāng)使用具有隨機(jī)學(xué)習(xí)算法的機(jī)器學(xué)習(xí)算法時(shí),通過在多次運(yùn)行或重復(fù)交叉驗(yàn)證中平均它們的性能來評(píng)估它們是一種很好的做法。在擬合最終模型時(shí),可能需要增加樹的數(shù)量直到模型的方差在重復(fù)評(píng)估中減少,或者擬合多個(gè)最終模型并平均它們的預(yù)測。
讓我們來看看如何為分類和回歸開發(fā) LightGBM 集成。
用于分類的 LightGBM 集成
在本節(jié)中,我們將研究使用 LightGBM 解決分類問題。
首先,我們可以使用make_classification() 函數(shù)創(chuàng)建一個(gè)包含 1,000 個(gè)示例和 20 個(gè)輸入特征的合成二元分類問題。
下面列出了完整的示例。
運(yùn)行示例會(huì)創(chuàng)建數(shù)據(jù)集并總結(jié)輸入和輸出組件的形狀。
接下來,我們可以在這個(gè)數(shù)據(jù)集上評(píng)估 LightGBM 算法。
我們將使用重復(fù)分層 k 折交叉驗(yàn)證來評(píng)估模型,其中包含 3 次重復(fù)和 10 次重復(fù)。我們將報(bào)告模型在所有重復(fù)和折疊中的準(zhǔn)確性的平均值和標(biāo)準(zhǔn)偏差。
運(yùn)行示例報(bào)告模型的均值和標(biāo)準(zhǔn)偏差準(zhǔn)確度。
注意:您的結(jié)果可能會(huì)因算法或評(píng)估程序的隨機(jī)性或數(shù)值精度的差異而有所不同。考慮多次運(yùn)行該示例并比較平均結(jié)果。
在這種情況下,我們可以看到具有默認(rèn)超參數(shù)的 LightGBM 集成在此測試數(shù)據(jù)集上實(shí)現(xiàn)了約 92.5% 的分類準(zhǔn)確率。
我們還可以使用 LightGBM 模型作為最終模型并進(jìn)行分類預(yù)測。
首先,LightGBM 集成適合所有可用數(shù)據(jù),然后可以調(diào)用predict()函數(shù)對(duì)新數(shù)據(jù)進(jìn)行預(yù)測。
下面的示例在我們的二進(jìn)制分類數(shù)據(jù)集上演示了這一點(diǎn)。
運(yùn)行示例在整個(gè)數(shù)據(jù)集上擬合 LightGBM 集成模型,然后用于對(duì)新數(shù)據(jù)行進(jìn)行預(yù)測,就像我們在應(yīng)用程序中使用模型時(shí)一樣。
現(xiàn)在我們熟悉了使用 LightGBM 進(jìn)行分類,讓我們看一下用于回歸的 API。
用于回歸的 LightGBM 集成
在本節(jié)中,我們將研究使用 LightGBM 解決回歸問題。
首先,我們可以使用make_regression() 函數(shù)創(chuàng)建一個(gè)包含 1,000 個(gè)示例和 20 個(gè)輸入特征的綜合回歸問題。
下面列出了完整的示例。
運(yùn)行示例會(huì)創(chuàng)建數(shù)據(jù)集并總結(jié)輸入和輸出組件的形狀。
接下來,我們可以在這個(gè)數(shù)據(jù)集上評(píng)估 LightGBM 算法。
正如我們在上一節(jié)所做的那樣,我們將使用重復(fù)的 k 折交叉驗(yàn)證來評(píng)估模型,重復(fù) 3 次和 10 次。我們將報(bào)告模型在所有重復(fù)和折疊中的平均絕對(duì)誤差 (MAE)。scikit-learn 庫使 MAE 為負(fù)值,使其最大化而不是最小化。這意味著負(fù) MAE 越大越好,完美模型的 MAE 為 0。
下面列出了完整的示例。
運(yùn)行示例報(bào)告模型的均值和標(biāo)準(zhǔn)偏差準(zhǔn)確度。
注意:您的結(jié)果可能會(huì)因算法或評(píng)估程序的隨機(jī)性或數(shù)值精度的差異而有所不同??紤]多次運(yùn)行該示例并比較平均結(jié)果。
在這種情況下,我們可以看到具有默認(rèn)超參數(shù)的 LightGBM 集成實(shí)現(xiàn)了大約 60 的 MAE。
我們還可以使用 LightGBM 模型作為最終模型并對(duì)回歸進(jìn)行預(yù)測。
首先,LightGBM 集成適合所有可用數(shù)據(jù),然后可以調(diào)用predict()函數(shù)對(duì)新數(shù)據(jù)進(jìn)行預(yù)測。
下面的示例在我們的回歸數(shù)據(jù)集上演示了這一點(diǎn)。
運(yùn)行示例在整個(gè)數(shù)據(jù)集上擬合 LightGBM 集成模型,然后用于對(duì)新數(shù)據(jù)行進(jìn)行預(yù)測,就像我們在應(yīng)用程序中使用模型時(shí)一樣。
現(xiàn)在我們已經(jīng)熟悉使用 scikit-learn API 來評(píng)估和使用 LightGBM 集成,讓我們看一下配置模型。
LightGBM 超參數(shù)
在本節(jié)中,我們將仔細(xì)研究一些您應(yīng)該考慮調(diào)整 LightGBM 集成的超參數(shù)及其對(duì)模型性能的影響。
我們可以查看 LightGBM 的許多超參數(shù),盡管在這種情況下,我們將查看樹的數(shù)量和樹的深度、學(xué)習(xí)率和增強(qiáng)類型。
有關(guān)調(diào)整 LightGBM 超參數(shù)的一般建議,請(qǐng)參閱文檔:
LightGBM 參數(shù)調(diào)整。
探索樹的數(shù)量
LightGBM 集成算法的一個(gè)重要超參數(shù)是集成中使用的決策樹的數(shù)量。
回想一下,決策樹按順序添加到模型中,以糾正和改進(jìn)先前樹所做的預(yù)測。因此,更多的樹通常更好。
樹的數(shù)量可以通過“ n_estimators ”參數(shù)設(shè)置,默認(rèn)為 100。
下面的示例探討了值在 10 到 5,000 之間的樹數(shù)量的影響。
運(yùn)行示例首先報(bào)告每個(gè)配置數(shù)量的決策樹的平均準(zhǔn)確度。
注意:您的結(jié)果可能會(huì)因算法或評(píng)估程序的隨機(jī)性或數(shù)值精度的差異而有所不同??紤]多次運(yùn)行該示例并比較平均結(jié)果。
在這種情況下,我們可以看到該數(shù)據(jù)集的性能有所提高,直到大約 500 棵樹,之后性能似乎趨于平穩(wěn)。
>10 0.857 (0.033)
>50 0.916 (0.032)
>100 0.925 (0.031)
>500 0.938 (0.026)
>1000 0.938 (0.028)
>5000 0.937 (0.028)
為每個(gè)配置數(shù)量的樹的準(zhǔn)確度分?jǐn)?shù)分布創(chuàng)建了一個(gè)箱線圖。
我們可以看到增加模型性能和集成大小的總體趨勢。

LightGBM 集成大小與分類精度的箱線圖
探索樹深度
改變添加到集成中的每棵樹的深度是梯度提升的另一個(gè)重要超參數(shù)。
樹深度控制每棵樹對(duì)訓(xùn)練數(shù)據(jù)集的專業(yè)化程度:它可能是通用的還是過度擬合的。樹最好不要太淺和一般(如AdaBoost),也不要太深和專業(yè)(如引導(dǎo)程序聚合)。
梯度提升通常在深度適中的樹上表現(xiàn)良好,在技巧和通用性之間找到平衡。
樹深度是通過“ max_depth ”參數(shù)控制的,默認(rèn)為一個(gè)未指定的值,因?yàn)榭刂茦涞膹?fù)雜程度的默認(rèn)機(jī)制是使用葉節(jié)點(diǎn)的數(shù)量。
控制樹的復(fù)雜度主要有兩種方法:樹的最大深度和樹中終端節(jié)點(diǎn)(葉子)的最大數(shù)量。在這種情況下,我們正在探索葉子的數(shù)量,因此我們需要通過設(shè)置“ num_leaves ”參數(shù)來增加葉子的數(shù)量以支持更深的樹。
下面的示例探討了 1 到 10 之間的樹深度以及對(duì)模型性能的影響。
運(yùn)行示例首先報(bào)告每個(gè)配置的樹深度的平均準(zhǔn)確度。
注意:您的結(jié)果可能會(huì)因算法或評(píng)估程序的隨機(jī)性或數(shù)值精度的差異而有所不同??紤]多次運(yùn)行該示例并比較平均結(jié)果。
在這種情況下,我們可以看到性能隨著樹的深度而提高,可能一直到 10 個(gè)級(jí)別。探索更深的樹可能會(huì)很有趣。
>1 0.833 (0.028)
>2 0.870 (0.033)
>3 0.899 (0.032)
>4 0.912 (0.026)
>5 0.925 (0.031)
>6 0.924 (0.029)
>7 0.922 (0.027)
>8 0.926 (0.027)
>9 0.925 (0.028)
>10 0.928 (0.029)
為每個(gè)配置的樹深度的準(zhǔn)確度分?jǐn)?shù)分布創(chuàng)建了一個(gè)盒須圖。
我們可以看到模型性能隨著樹深度增加到五個(gè)級(jí)別的深度而增加的總體趨勢,之后性能開始變得相當(dāng)平坦。

LightGBM 集成樹深度與分類精度的箱線圖
探索學(xué)習(xí)率
學(xué)習(xí)率控制每個(gè)模型對(duì)集成預(yù)測的貢獻(xiàn)量。
較小的速率可能需要集成中更多的決策樹。
學(xué)習(xí)率可以通過“ learning_rate ”參數(shù)控制,默認(rèn)為0.1。
下面的示例探討了學(xué)習(xí)率并比較了 0.0001 和 1.0 之間的值的影響。
運(yùn)行示例首先報(bào)告每個(gè)配置的學(xué)習(xí)率的平均準(zhǔn)確度。
注意:您的結(jié)果可能會(huì)因算法或評(píng)估程序的隨機(jī)性或數(shù)值精度的差異而有所不同。考慮多次運(yùn)行該示例并比較平均結(jié)果。
在這種情況下,我們可以看到更大的學(xué)習(xí)率會(huì)在這個(gè)數(shù)據(jù)集上產(chǎn)生更好的性能。我們希望為較小的學(xué)習(xí)率在集成中添加更多的樹將進(jìn)一步提高性能。
>0.0001 0.800 (0.038)
>0.0010 0.811 (0.035)
>0.0100 0.859 (0.035)
>0.1000 0.925 (0.031)
>1.0000 0.928 (0.025)
為每個(gè)配置的學(xué)習(xí)率的準(zhǔn)確度分?jǐn)?shù)分布創(chuàng)建了一個(gè)盒須圖。
我們可以看到模型性能隨著學(xué)習(xí)率的增加一直增加到 1.0 的大值的總體趨勢。

LightGBM 學(xué)習(xí)率與分類準(zhǔn)確率的箱線圖
探索提升類型
LightGBM 的一個(gè)特性是它支持許多不同的提升算法,稱為提升類型。
boosting 類型可以通過“ boosting_type ”參數(shù)指定,并使用字符串來指定類型。選項(xiàng)包括:
'?gbdt?':梯度提升決策樹(GDBT)。
'?dart?':Dropouts 滿足多重加法回歸樹 (DART)。
'?goss?':基于梯度的單邊采樣 (GOSS)。
默認(rèn)是GDBT,這是經(jīng)典的梯度提升算法。
DART 在 2015 年題為“ DART:Dropouts meet Multiple Additive Regression Trees ”的論文中有所描述,顧名思義,將深度學(xué)習(xí)的dropout概念添加到了多重加法回歸樹 (MART) 算法中,這是梯度提升決策的前身樹木。
這個(gè)算法有很多名字,包括梯度樹增強(qiáng)、提升樹和多重加性回歸樹 (MART)。我們用后者來指代這個(gè)算法。
— DART:Dropouts meet Multiple Additive Regression Trees,2015。
GOSS 是隨 LightGBM 論文和圖書館一起引入的。該方法試圖僅使用導(dǎo)致大誤差梯度的實(shí)例來更新模型并丟棄其余實(shí)例。
……我們排除了很大一部分具有小梯度的數(shù)據(jù)實(shí)例,僅使用其余部分來估計(jì)信息增益。
— LightGBM:一種高效的梯度提升決策樹,2017 年。
下面的示例將合成分類數(shù)據(jù)集上的 LightGBM 與三個(gè)關(guān)鍵的提升技術(shù)進(jìn)行了比較。
運(yùn)行示例首先報(bào)告每個(gè)配置的提升類型的平均準(zhǔn)確度。
注意:您的結(jié)果可能會(huì)因算法或評(píng)估程序的隨機(jī)性或數(shù)值精度的差異而有所不同。考慮多次運(yùn)行該示例并比較平均結(jié)果。
在這種情況下,我們可以看到默認(rèn)的 boosting 方法比其他兩種被評(píng)估的技術(shù)表現(xiàn)得更好。
>gbdt 0.925 (0.031)
>dart 0.912 (0.028)
>goss 0.918 (0.027)
為每個(gè)配置的提升方法的準(zhǔn)確度分?jǐn)?shù)分布創(chuàng)建了一個(gè)箱線圖,允許直接比較這些技術(shù)。

LightGBM Boosting 類型與分類精度的箱線圖
概括
在本教程中,您了解了如何開發(fā)用于分類和回歸的 Light Gradient Boosted Machine 集成。
具體來說,你學(xué)到了:
Light Gradient Boosted Machine (LightGBM) 是隨機(jī)梯度提升集成算法的高效開源實(shí)現(xiàn)。
如何使用 scikit-learn API 開發(fā)用于分類和回歸的 LightGBM 集成。
如何探索 LightGBM 模型超參數(shù)對(duì)模型性能的影響。

版權(quán)聲明:文章來自公眾號(hào)(python風(fēng)控模型),未經(jīng)許可,不得抄襲。遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。