算法流程

優缺點

優點:

缺點:

適用場景

LightGBM

原理

LightGBM 是一種高效的梯度提升框架,專注于快速訓練和低內存使用。它采用了基于直方圖的決策樹學習算法,顯著提高了效率。

核心公式和解釋

LightGBM 的核心與 GBDT 相同,但在優化方面進行了改進。它引入了基于直方圖的算法,將連續值離散化,從而加快了訓練速度并降低了內存消耗。

算法流程

  1. 構建特征直方圖。
  2. 計算每個特征的增益,選擇增益最大的特征進行分裂。
  3. 基于直方圖的累積直方圖法快速計算最佳分割點。
  4. 構建決策樹,更新模型。

優缺點

優點:

缺點:

適用場景

XGBoost

原理

XGBoost 是一種高效的梯度提升框架,優化了傳統的 GBDT,并引入了正則化項以防止過擬合。

核心公式和解釋

算法流程

  1. 初始化模型。
  2. 對每一輪迭代:
  3. 1. 計算當前模型的殘差。
  4. 根據殘差擬合新的樹。
  5. 計算正則化項并更新模型。
  6. 輸出最終模型。

優缺點

優點:

缺點:

適用場景

AdaBoost

原理

AdaBoost(Adaptive Boosting)通過結合多個弱分類器來提高分類性能。每個分類器的權重由其錯誤率決定,后續分類器更關注前面分類器錯誤分類的樣本。

核心公式和解釋

算法流程

  1. 初始化樣本權重。
  2. 對每個弱分類器:
  3. 1. 訓練分類器,計算分類誤差。
  4. 根據誤差計算分類器權重。
  5. 更新樣本權重。
  6. 最終分類器為所有弱分類器的加權和。

優缺點

優點:

缺點:

適用場景

綜合案例

這里,咱們是一個使用 GBDT、LightGBM、XGBoost 和 AdaBoost 的完整示例。

整個這個示例將涵蓋以下內容:

  1. 數據準備:生成一個簡單的合成數據集。
  2. 模型訓練和預測:訓練四種不同的模型。
  3. 性能比較:比較每個模型的性能。
  4. 可視化:展示每個模型的預測結果和性能。

我們將使用以下包:

數據準備

我們將生成一個合成的回歸數據集,以便比較不同模型的性能。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
import lightgbm as lgb
import xgboost as xgb
from sklearn.ensemble import GradientBoostingRegressor, AdaBoostRegressor
from sklearn.tree import DecisionTreeRegressor

# 生成合成數據
X, y = make_regression(n_samples=1000, n_features=10, noise=0.1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 轉換為 DataFrame 以便繪圖
df_train = pd.DataFrame(X_train, columns=[f"feature_{i}" for i in range(X_train.shape[1])])
df_train['target'] = y_train
df_test = pd.DataFrame(X_test, columns=[f"feature_{i}" for i in range(X_test.shape[1])])
df_test['target'] = y_test

訓練模型并進行預測

# 1. Gradient Boosting Decision Tree (GBDT)
gbdt_model = GradientBoostingRegressor(n_estimators=100, random_state=42)
gbdt_model.fit(X_train, y_train)
y_pred_gbdt = gbdt_model.predict(X_test)

# 2. LightGBM
lgb_model = lgb.LGBMRegressor(n_estimators=100, random_state=42)
lgb_model.fit(X_train, y_train)
y_pred_lgb = lgb_model.predict(X_test)

# 3. XGBoost
xgb_model = xgb.XGBRegressor(n_estimators=100, random_state=42)
xgb_model.fit(X_train, y_train)
y_pred_xgb = xgb_model.predict(X_test)

# 4. AdaBoost
ada_model = AdaBoostRegressor(base_estimator=DecisionTreeRegressor(max_depth=3), n_estimators=100, random_state=42)
ada_model.fit(X_train, y_train)
y_pred_ada = ada_model.predict(X_test)

性能評估

def evaluate_model(y_true, y_pred, model_name):
mse = mean_squared_error(y_true, y_pred)
r2 = r2_score(y_true, y_pred)
print(f"{model_name} - MSE: {mse:.4f}, R2: {r2:.4f}")

print("Performance Comparison:")
evaluate_model(y_test, y_pred_gbdt, "GBDT")
evaluate_model(y_test, y_pred_lgb, "LightGBM")
evaluate_model(y_test, y_pred_xgb, "XGBoost")
evaluate_model(y_test, y_pred_ada, "AdaBoost")

可視化

我們將繪制模型的預測結果與實際值的對比圖,并繪制預測值的分布圖。

plt.style.use('ggplot')  # 使用有效的樣式
fig, axes = plt.subplots(2, 2, figsize=(16, 12))
axes = axes.flatten()

def plot_predictions(ax, y_true, y_pred, model_name):
sns.scatterplot(x=y_true, y=y_pred, ax=ax)
ax.plot([min(y_true), max(y_true)], [min(y_true), max(y_true)], 'k--', label='Perfect Prediction')
ax.set_title(f'{model_name} Predictions vs Actual')
ax.set_xlabel('Actual Values')
ax.set_ylabel('Predicted Values')
ax.legend()

# 預測與實際值對比
plot_predictions(axes[0], y_test, y_pred_gbdt, 'GBDT')
plot_predictions(axes[1], y_test, y_pred_lgb, 'LightGBM')
plot_predictions(axes[2], y_test, y_pred_xgb, 'XGBoost')
plot_predictions(axes[3], y_test, y_pred_ada, 'AdaBoost')

plt.tight_layout()
plt.show()

# 預測值分布圖
fig, axes = plt.subplots(2, 2, figsize=(16, 12))
axes = axes.flatten()

def plot_prediction_distribution(ax, y_pred, model_name):
sns.histplot(y_pred, ax=ax, kde=True, bins=30)
ax.set_title(f'{model_name} Predicted Values Distribution')
ax.set_xlabel('Predicted Values')
ax.set_ylabel('Frequency')

# 繪制預測值的分布
plot_prediction_distribution(axes[0], y_pred_gbdt, 'GBDT')
plot_prediction_distribution(axes[1], y_pred_lgb, 'LightGBM')
plot_prediction_distribution(axes[2], y_pred_xgb, 'XGBoost')
plot_prediction_distribution(axes[3], y_pred_ada, 'AdaBoost')

plt.tight_layout()
plt.show()

可視化部分:

預測與實際值對比:

預測值分布圖:

適用性和性能比較

  1. GBDT
  2. 適用性:通用的梯度提升算法,適用于各種回歸和分類任務。
  1. LightGBM
  2. 適用性:高效的梯度提升算法,專為大規模數據和高維特征設計。
  1. XGBoost
  2. 適用性:優化的梯度提升算法,具有強大的性能和靈活性。
  1. AdaBoost
  2. 適用性:提升算法的簡單實現,適合于少量樣本或簡單問題。

調參細節

針對 GBDT、LightGBM、XGBoost 和 AdaBoost 的調參細節以及每種方法的建議參數范圍和優化技巧。

1. Gradient Boosting Decision Tree (GBDT)

GBDT 通常使用 sklearnGradientBoostingRegressor 來實現。主要調參項包括:

調參技巧

2.LightGBM

LightGBM 是一個高效的梯度提升框架,適用于大規模數據。主要調參項包括:

調參技巧

3. XGBoost

XGBoost 是另一種流行的梯度提升框架。主要調參項包括:

調參技巧

4. AdaBoost

AdaBoost 是一種提升方法,通過調整每個樣本的權重來提高模型性能。主要調參項包括:

調參技巧

代碼中的調參示例

假設我們使用網格搜索來調整 GBDT 的超參數:

from sklearn.model_selection import GridSearchCV

# 定義參數網格
param_grid = {
'n_estimators': [100, 200, 300],
'learning_rate': [0.01, 0.1, 0.2],
'max_depth': [3, 5, 7],
'min_samples_split': [2, 5, 10],
'min_samples_leaf': [1, 2, 5]
}

# 創建模型
gbdt = GradientBoostingRegressor()

# 使用網格搜索進行調參
grid_search = GridSearchCV(estimator=gbdt, param_grid=param_grid, cv=5, scoring='neg_mean_squared_error')
grid_search.fit(X_train, y_train)

# 輸出最佳參數
print("Best parameters found: ", grid_search.best_params_)

大家可以對 LightGBM 和 XGBoost 進行類似的調參,只需使用相應的模型和參數網格。

調參是一個迭代的過程,通常需要多次實驗才能找到最佳參數組合。希望這些細節和技巧能幫助大家在自己實際的實驗中,可以得到一些啟發!~

文章轉自微信公眾號@深夜努力寫Python

上一篇:

通透!十大時間序列模型 最強總結 !!

下一篇:

講透一個強大算法案例,LSTM ??!
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費