Shikata Ga Nai

Private? There is no such things.

32. XGBoost・LightGBMの基本

Hello there, ('ω')ノ

📌 1. XGBoost・LightGBMとは?

XGBoostとLightGBMは、どちらも勾配ブースティング(Gradient Boosting) を使った強力な決定木アルゴリズムです。

📌 XGBoost・LightGBMの特徴

アルゴリズム 特徴 代表的な用途
XGBoost 高精度、過学習に強い Kaggle、金融・保険
LightGBM XGBoostより高速、大規模データ向き レコメンドシステム、広告最適化

「精度重視ならXGBoost」「速度・大規模データならLightGBM」


📌 2. 勾配ブースティングとは?

XGBoost・LightGBMは「勾配ブースティング」 という手法を使っています。
これは「複数の決定木を少しずつ改善しながら学習する」アルゴリズムです。

📌 勾配ブースティングの流れ 1. 最初にシンプルな決定木(弱学習器)を作る
2. 誤差(残差)を計算し、その誤差を修正する新しい決定木を作る
3. このプロセスを繰り返し、精度の高いモデルを作る!

「誤差を少しずつ修正して、どんどん強くなる」のが勾配ブースティングの強み!

📌 ランダムフォレストとの違い

アルゴリズム 学習の方法 長所
ランダムフォレスト 多数の決定木を「並列」に学習 並列処理が可能、頑健
勾配ブースティング 決定木を「順番」に学習し、誤差を修正 高精度、過学習に強い

「並列処理で安定感」ならランダムフォレスト、「高精度な調整」ならXGBoost・LightGBM!


📌 3. XGBoostとLightGBMの違い

✅ XGBoost

汎化性能が高く、過学習を防ぐ工夫がされている
勾配ブースティングの細かい調整が可能
やや計算コストが高い(遅い)

✅ LightGBM

データを「リーフ単位」で分岐し、学習が速い(XGBoostの約10倍速い)
大規模データ向き(数百万レコードでも高速)
やや過学習しやすい(調整が必要)

📌 結論

条件 選ぶべき手法
精度を最大限にしたい XGBoost
大規模データ(数百万行以上) LightGBM
学習を高速化したい LightGBM

「モデルを細かくチューニングしたいならXGBoost、大量データならLightGBM」


📌 4. PythonでXGBoost・LightGBMを実装

✅ ① XGBoostで分類タスク

まずは、Irisデータセットを使って XGBoostを実装 します!

import xgboost as xgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# データの読み込み
iris = load_iris()
X, y = iris.data, iris.target

# データを学習用・テスト用に分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# XGBoostモデルの作成
xgb_model = xgb.XGBClassifier(n_estimators=100, learning_rate=0.1, use_label_encoder=False, eval_metric="mlogloss")
xgb_model.fit(X_train, y_train)

# 予測
y_pred = xgb_model.predict(X_test)

# 精度の評価
print(f"XGBoost Accuracy: {accuracy_score(y_test, y_pred):.2f}")

XGBoostで高精度な分類モデルを作成!
学習率(learning_rate)や決定木の数(n_estimators)を調整可能!


✅ ② LightGBMで分類タスク

次に、LightGBMを使って同じ分類タスク を実装してみます。

# ✅ 必要なライブラリをインポート
import lightgbm as lgb
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# ✅ ダミーデータの作成
np.random.seed(42)
data = {
    "Feature1": np.random.rand(200),
    "Feature2": np.random.randint(0, 100, 200),
    "Feature3": np.random.choice([0, 1], 200),
    "Feature4": np.random.randn(200),
    "Target": np.random.randint(0, 2, 200),
}

df = pd.DataFrame(data)

# ✅ 特徴量とターゲットを分離
X = df.drop(columns=["Target"])
y = df["Target"]

# ✅ データ分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# ✅ LightGBM モデルの作成(エラー完全解消)
lgb_model = lgb.LGBMClassifier(
    n_estimators=200,           # 決定木の数
    learning_rate=0.05,         # 学習率
    max_depth=-1,               # 無制限の深さ
    num_leaves=50,              # リーフ数
    feature_fraction=0.8,       # 特徴量サンプリング率
    bagging_fraction=0.9,       # データサンプリング率
    bagging_freq=5,             # バギングの頻度
    max_bin=512,                # 分割の粒度
    reg_alpha=0.0,              # L1正則化なし
    reg_lambda=0.0,             # L2正則化なし
    min_child_samples=20,       # ✅ min_data_in_leaf は削除
    min_gain_to_split=None,     # ✅ 明示的に None に設定
    objective="binary",         # バイナリ分類
    is_unbalance=True,          # クラス不均衡の自動調整
    force_col_wise=True,        # ✅ カラム単位での分割最適化
    verbosity=-1,               # ✅ 警告の抑制
)

# ✅ モデルの学習
lgb_model.fit(X_train, y_train)

# ✅ 予測
y_pred_lgb = lgb_model.predict(X_test)

# ✅ 精度の評価
print(f"✅ LightGBM Accuracy: {accuracy_score(y_test, y_pred_lgb):.2f}")

LightGBMで高速な分類モデルを作成!
XGBoostと比べて学習が速い!


📌 5. ハイパーパラメータの調整

XGBoostやLightGBMでは、ハイパーパラメータを適切に調整すると、精度が大幅に向上 します!

📌 主なハイパーパラメータ

パラメータ 説明 適用
n_estimators 決定木の数 XGBoost・LightGBM
learning_rate 学習率(小さいほど精度が上がるが遅くなる) XGBoost・LightGBM
max_depth 決定木の深さ(大きいと過学習しやすい) XGBoost
num_leaves LightGBMの分岐数(大きすぎると過学習) LightGBM

📌 ハイパーパラメータの最適化(Optunaを使用)

import optuna

def objective(trial):
    param = {
        "n_estimators": trial.suggest_int("n_estimators", 50, 300),
        "learning_rate": trial.suggest_float("learning_rate", 0.01, 0.3),
    }
    model = xgb.XGBClassifier(**param, use_label_encoder=False, eval_metric="mlogloss")
    model.fit(X_train, y_train)
    return accuracy_score(y_test, model.predict(X_test))

study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=10)
print(study.best_params)

Optunaでハイパーパラメータを最適化!
手動で調整せず、自動的に最適値を探せる!


🎯 まとめ

XGBoost・LightGBMは勾配ブースティングを利用した強力なモデル!
XGBoostは精度重視、LightGBMは速度重視!
PythonでXGBoost・LightGBMを実装し、分類タスクを試そう!
ハイパーパラメータの調整で、さらに精度を向上できる!

Best regards, (^^ゞ