LightGBM 概述
- 一、LightGBM 簡介
- 二、LightGBM 原理詳解
- ?? 核心原理
- 🧠 LightGBM 的主要特點
- 三、LightGBM 實現步驟(Python)
- 🧪 可調參數推薦
- 完整案例代碼(回歸任務 + 可視化)
- 參考
LightGBM 是由微軟開源的 基于梯度提升框架(GBDT) 的機器學習算法,專為高性能、高效率設計,適用于大規模數據處理任務。它在準確率、訓練速度和資源使用上都優于傳統 GBDT 實現(如 XGBoost)。
一、LightGBM 簡介
二、LightGBM 原理詳解
?? 核心原理
LightGBM 本質上是 Gradient Boosting Decision Tree(GBDT) 的一種高效實現。但它有兩個關鍵創新:
1. 基于直方圖的決策樹算法(Histogram-based Algorithm)
將連續特征離散成固定數量的桶(bins),減少計算復雜度和內存占用。
計算增益時不再遍歷所有可能的切分點,而是只在桶邊界上尋找。
2. 葉子優先生長策略(Leaf-wise Tree Growth)
傳統 GBDT 使用 Level-wise(按層生長) 方法。
LightGBM 使用 Leaf-wise(按葉節點增益最大優先擴展) 策略:
- 每次選擇增益最大的葉子節點擴展,導致更深的樹。
- 收斂更快,但可能更容易過擬合(需用 max_depth 控制)。
🧠 LightGBM 的主要特點
特性 | 描述 |
---|---|
高效率 | 訓練速度遠快于 XGBoost 和傳統 GBDT |
內存占用低 | 使用直方圖壓縮數據 |
支持類別特征 | 無需獨熱編碼,直接處理類別型特征 |
可擴展性強 | 支持大數據、分布式訓練 |
數據支持 | 支持稀疏數據、缺失值自動處理 |
三、LightGBM 實現步驟(Python)
🧪 可調參數推薦
參數名 | 含義 | 說明 |
---|---|---|
num_leaves | 樹的最大葉子數 | 值越大越容易過擬合 |
max_depth | 樹的最大深度 | 控制模型復雜度 |
learning_rate | 學習率 | 越小越穩,但需要更多迭代 |
feature_fraction | 特征抽樣率 | 防止過擬合 |
bagging_fraction | 數據抽樣率 | 類似隨機森林中的 bootstrap |
lambda_l1 / lambda_l2 | 正則項 | 控制模型復雜度 |
完整案例代碼(回歸任務 + 可視化)
繪制的效果圖如下:
左圖:擬合效果:擬合曲線很好地捕捉了數據的非線性趨勢。
- 藍點:訓練數據
- 紅點:測試數據
- 綠線:GBDT 擬合曲線
右圖:殘差圖:殘差應隨機分布在 y=0 附近,沒有明顯模式,表明模型擬合良好。
輸出結果為:
LightGBM Train MSE: 0.0581
LightGBM Test MSE: 0.0570
完整Python實現代碼如下:
import numpy as np
import matplotlib.pyplot as plt
import lightgbm as lgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error# 設置字體
plt.rcParams['font.family'] = 'Times New Roman'# 1. 生成數據
np.random.seed(42)
X = np.linspace(0, 10, 200).reshape(-1, 1)
y = np.sin(X).ravel() + np.random.normal(0, 0.2, X.shape[0])# 2. 劃分訓練/測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 3. 構造 LightGBM 數據集對象
train_dataset = lgb.Dataset(X_train, label=y_train)
test_dataset = lgb.Dataset(X_test, label=y_test, reference=train_dataset)# 4. 設置參數
params = {'objective': 'regression','metric': 'rmse','learning_rate': 0.1,'num_leaves': 15,'max_depth': 3,'verbose': -1,'seed': 42
}# 5. 訓練 LightGBM 模型
model = lgb.train(params,train_dataset,num_boost_round=100,valid_sets=[train_dataset, test_dataset],valid_names=['train', 'test'],
)# 6. 預測與評估
y_train_pred = model.predict(X_train)
y_test_pred = model.predict(X_test)train_mse = mean_squared_error(y_train, y_train_pred)
test_mse = mean_squared_error(y_test, y_test_pred)print(f"LightGBM Train MSE: {train_mse:.4f}")
print(f"LightGBM Test MSE: {test_mse:.4f}")# 7. 可視化
plt.figure(figsize=(12, 6))# 7.1 擬合曲線圖
plt.subplot(1, 2, 1)
plt.scatter(X_train, y_train, color='lightblue', label='Train Data', alpha=0.6)
plt.scatter(X_test, y_test, color='lightcoral', label='Test Data', alpha=0.6)X_all = np.linspace(0, 10, 1000).reshape(-1, 1)
y_all_pred = model.predict(X_all)
plt.plot(X_all, y_all_pred, color='green', label='LightGBM Prediction', linewidth=2)plt.title("LightGBM Model Fit", fontsize=15)
plt.xlabel("X", fontsize=14)
plt.ylabel("y", fontsize=14)
plt.legend()
plt.grid(True)# 7.2 殘差圖
plt.subplot(1, 2, 2)
train_residuals = y_train - y_train_pred
test_residuals = y_test - y_test_predplt.scatter(y_train_pred, train_residuals, color='blue', alpha=0.6, label='Train Residuals')
plt.scatter(y_test_pred, test_residuals, color='red', alpha=0.6, label='Test Residuals')
plt.axhline(y=0, color='black', linestyle='--')
plt.xlabel("Predicted y", fontsize=14)
plt.ylabel("Residuals", fontsize=14)
plt.title("Residual Plot", fontsize=15)
plt.legend()
plt.grid(True)plt.tight_layout()
plt.show()