LightGBM(Light Gradient Boosting Machine)是基于梯度提升決策樹(GBDT)的一種改進實現。其核心思想是通過加法模型(additive model)和前向分布算法(forward distribution algorithm)來逐步構建一個強大的預測模型。下面詳細介紹LightGBM的推導公式及其推導過程,以及它相對于其他模型的優勢。
1. 梯度提升決策樹(GBDT)概述
GBDT是一個集成學習方法,它通過逐步添加決策樹來構建模型,每一步都試圖修正前一步模型的錯誤。其核心思想如下:
1.1 加法模型
加法模型的基本形式是將多個弱學習器(如決策樹)組合起來,以形成一個強學習器。對于一個樣本 ( x i , y i ) (x_i, y_i) (xi?,yi?),模型的預測值 y ^ i \hat{y}_i y^?i?可以表示為:
y ^ i = ∑ m = 1 M f m ( x i ) \hat{y}_i = \sum_{m=1}^{M} f_m(x_i) y^?i?=m=1∑M?fm?(xi?)
其中, f m ( x ) f_m(x) fm?(x)表示第 m m m個弱學習器。
1.2 損失函數
為了使模型的預測值 y ^ i \hat{y}_i y^?i?接近真實值 y i y_i yi?,我們定義一個損失函數 L ( y , y ^ ) L(y, \hat{y}) L(y,y^?),并希望通過不斷優化該損失函數來改進模型。常見的損失函數包括均方誤差(MSE)和對數損失(Log Loss)。
1.3 梯度提升
梯度提升的思想是在每一步添加一個新的決策樹,使得損失函數在當前模型的基礎上取得最大程度的下降。具體地,假設當前模型的預測值為 y ^ i ( m ? 1 ) \hat{y}_i^{(m-1)} y^?i(m?1)?,則第 m m m步的模型為:
y ^ i ( m ) = y ^ i ( m ? 1 ) + f m ( x i ) \hat{y}_i^{(m)} = \hat{y}_i^{(m-1)} + f_m(x_i) y^?i(m)?=y^?i(m?1)?+fm?(xi?)
其中, f m ( x ) f_m(x) fm?(x)是根據負梯度方向構建的新的決策樹。
2. LightGBM 推導公式
LightGBM在GBDT的基礎上進行了多項改進,其核心推導公式和過程如下:
2.1 基本公式
在每一步迭代中,LightGBM嘗試找到一個新的函數 f m ( x ) f_m(x) fm?(x)來最小化損失函數。假設當前模型的預測值為 y ^ i ( m ? 1 ) \hat{y}_i^{(m-1)} y^?i(m?1)?,則新的預測值為:
y ^ i ( m ) = y ^ i ( m ? 1 ) + η f m ( x i ) \hat{y}_i^{(m)} = \hat{y}_i^{(m-1)} + \eta f_m(x_i) y^?i(m)?=y^?i(m?1)?+ηfm?(xi?)
其中, η \eta η是學習率,控制每次更新的步長。
2.2 目標函數
目標函數包括損失函數和正則化項:
L = ∑ i = 1 n L ( y i , y ^ i ( m ? 1 ) + η f m ( x i ) ) + Ω ( f m ) \mathcal{L} = \sum_{i=1}^{n} L(y_i, \hat{y}_i^{(m-1)} + \eta f_m(x_i)) + \Omega(f_m) L=i=1∑n?L(yi?,y^?i(m?1)?+ηfm?(xi?))+Ω(fm?)
其中, Ω ( f m ) \Omega(f_m) Ω(fm?)是正則化項,用于控制模型的復雜度,防止過擬合。
2.3 近似優化
為了簡化優化過程,LightGBM采用二階泰勒展開對損失函數進行近似:
L ( y , y ^ + δ ) ≈ L ( y , y ^ ) + g i δ + 1 2 h i δ 2 L(y, \hat{y} + \delta) \approx L(y, \hat{y}) + g_i \delta + \frac{1}{2} h_i \delta^2 L(y,y^?+δ)≈L(y,y^?)+gi?δ+21?hi?δ2
其中, g i = ? L ( y , y ^ ) ? y ^ g_i = \frac{\partial L(y, \hat{y})}{\partial \hat{y}} gi?=?y^??L(y,y^?)?是損失函數的一階導數(梯度), h i = ? 2 L ( y , y ^ ) ? y ^ 2 h_i = \frac{\partial^2 L(y, \hat{y})}{\partial \hat{y}^2} hi?=?y^?2?2L(y,y^?)?是損失函數的二階導數(Hessian矩陣)。
于是,目標函數可以近似為:
L ≈ ∑ i = 1 n [ L ( y i , y ^ i ( m ? 1 ) ) + g i f m ( x i ) + 1 2 h i f m ( x i ) 2 ] + Ω ( f m ) \mathcal{L} \approx \sum_{i=1}^{n} \left[ L(y_i, \hat{y}_i^{(m-1)}) + g_i f_m(x_i) + \frac{1}{2} h_i f_m(x_i)^2 \right] + \Omega(f_m) L≈i=1∑n?[L(yi?,y^?i(m?1)?)+gi?fm?(xi?)+21?hi?fm?(xi?)2]+Ω(fm?)
2.4 樹結構的優化
LightGBM通過構建樹結構來擬合 η f m ( x i ) \eta f_m(x_i) ηfm?(xi?)。樹結構的優化包括選擇最佳分裂點、計算葉子節點的權重等。具體來說,在每個節點處,LightGBM選擇使目標函數下降最多的分裂點,并計算分裂后的葉子節點的最佳權重。
3. LightGBM 相對于其他模型的優勢
3.1 高效性
- 基于直方圖的算法:LightGBM使用基于直方圖的算法,將連續特征離散化為直方圖,以減少內存使用和計算量。
- Leaf-wise生長策略:與傳統的層次生長策略不同,LightGBM采用葉子優先生長策略,能更快地降低損失函數,從而提高訓練效率和模型精度。
3.2 可擴展性
- 支持并行學習:LightGBM支持特征并行和數據并行,能在多核CPU或分布式環境下高效運行。
- 處理大規模數據:由于其高效的內存管理和計算策略,LightGBM能處理數百萬行甚至數億行的數據集。
3.3 模型性能
- 處理類別不平衡:LightGBM通過設置正負樣本的權重或使用平衡正負樣本的損失函數,能有效處理類別不平衡問題。
- 自動捕捉特征交互:由于樹模型的天然優勢,LightGBM能自動捕捉特征之間的復雜交互關系,而無需手動特征工程。
LightGBM(Light Gradient Boosting Machine)是一種高效的梯度提升框架,廣泛應用于大規模數據集的機器學習任務。由于其高性能和可擴展性,它在金融行業中非常受歡迎,特別是在信用評分和風險管理任務中。
4.在銀行風控中的應用
4.1 問題背景
銀行需要評估借款人違約的風險(即借款人未能按時還款)。主要目標是預測違約的可能性,這需要通過分析歷史數據來構建預測模型,從而評估申請人的信用狀況。
4.2 數據集
一個典型的銀行風控數據集可能包括:
- 客戶人口統計信息:年齡、收入、就業狀況等。
- 信用歷史:過去貸款的數量、還款歷史、違約記錄等。
- 貸款詳情:貸款金額、期限、用途等。
- 財務比率:債務收入比、信用利用率等。
4.3 特征工程和預處理
需要仔細設計和預處理關鍵特征:
- 處理缺失值:用均值/中值替換缺失值或使用插補技術。
- 編碼類別變量:使用獨熱編碼或標簽編碼。
- 歸一化:將數值特征縮放到標準范圍。
- 特征工程:根據領域知識創建新特征,如交互項或聚合特征。
4.4 實施步驟
步驟 1: 安裝 LightGBM
!pip install lightgbm
步驟 2: 加載和準備數據
import lightgbm as lgb
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score# 加載數據集
data = pd.read_csv('credit_data.csv')# 數據預處理
# 假設 'target' 是我們要預測的列
X = data.drop('target', axis=1)
y = data['target']# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
若沒有現成的數據集,可以用下面的代碼構造一個
import pandas as pd
import numpy as np# 生成隨機數據
np.random.seed(42)
n_samples = 1000# 客戶人口統計信息
age = np.random.randint(18, 70, size=n_samples)
income = np.random.randint(20000, 150000, size=n_samples)
employment_status = np.random.choice(['employed', 'self-employed', 'unemployed'], size=n_samples, p=[0.7, 0.2, 0.1])# 信用歷史
num_past_loans = np.random.randint(0, 10, size=n_samples)
repayment_history = np.random.choice(['good', 'average', 'poor'], size=n_samples, p=[0.7, 0.2, 0.1])
default_history = np.random.randint(0, 5, size=n_samples)# 貸款詳情
loan_amount = np.random.randint(1000, 50000, size=n_samples)
loan_term = np.random.choice([12, 24, 36, 48, 60], size=n_samples, p=[0.2, 0.2, 0.2, 0.2, 0.2])
loan_purpose = np.random.choice(['home improvement', 'debt consolidation', 'business', 'personal', 'education'], size=n_samples)# 財務比率
debt_to_income_ratio = np.round(np.random.uniform(0.1, 0.6, size=n_samples), 2)
credit_utilization = np.round(np.random.uniform(0.1, 0.9, size=n_samples), 2)# 目標變量:違約(1)或未違約(0)
target = np.random.choice([0, 1], size=n_samples, p=[0.85, 0.15])# 創建數據框
data = pd.DataFrame({'age': age,'income': income,'employment_status': employment_status,'num_past_loans': num_past_loans,'repayment_history': repayment_history,'default_history': default_history,'loan_amount': loan_amount,'loan_term': loan_term,'loan_purpose': loan_purpose,'debt_to_income_ratio': debt_to_income_ratio,'credit_utilization': credit_utilization,'target': default # 目標變量
})# 顯示前幾行數據
print(data.head())# 保存數據集到CSV文件
data.to_csv('credit_data.csv', index=False)
步驟 3: 創建 LightGBM 數據集
train_data = lgb.Dataset(X_train, label=y_train)
test_data = lgb.Dataset(X_test, label=y_test, reference=train_data)
步驟 4: 定義參數
params = {'boosting_type': 'gbdt','objective': 'binary','metric': 'auc','num_leaves': 31,'learning_rate': 0.05,'feature_fraction': 0.9
}
步驟 5: 訓練模型
bst = lgb.train(params, train_data, num_boost_round=100, valid_sets=[test_data], early_stopping_rounds=10)
步驟 6: 進行預測和評估
y_pred = bst.predict(X_test, num_iteration=bst.best_iteration)
auc_score = roc_auc_score(y_test, y_pred)
print(f'AUC Score: {auc_score}')
6. 結果解釋
AUC(曲線下面積)得分是二分類問題中常用的評估指標。它衡量模型區分不同類別的能力。得分越接近1,模型表現越好。
7. 特征重要性
理解哪些特征最重要可以提供關于影響風險的因素的見解。
import matplotlib.pyplot as pltlgb.plot_importance(bst, max_num_features=20)
plt.show()
常見挑戰和解決方案
-
數據不平衡:在風險建模中,違約的數量通常遠低于非違約數量。可以使用SMOTE(合成少數過采樣技術)、調整類別權重或使用分層抽樣來解決這種不平衡問題。
-
過擬合:LightGBM 強大但容易過擬合。使用交叉驗證、設置適當的
num_leaves
和使用early_stopping_rounds
等技巧可以防止過擬合。 -
特征交互:LightGBM 能夠自動捕捉特征交互,但如果已知領域特定的交互,應手動添加這些特征以提高模型性能。
結論
LightGBM 是一個構建銀行風險評估模型的強大工具。其速度和效率,加上處理大型復雜數據集的能力,使其非常適合實時風險評分和決策。通過仔細準備數據、調整模型和解釋結果,銀行可以顯著提升其風險管理能力。