XGBoost
XGBoostは、正則化された決定木を一つずつ追加する勾配ブースティングライブラリで、表形式データに最適な選択肢の一つです。仕組みをコードとともに解説します。
XGBoost(「YAMLはマークアップ言語ではない」のような再帰的頭字語)は、勾配ブースティングを用いた決定木のオープンソースライブラリであり、表形式データで最も広く使われているツールの1つです。Tianqi Chenがワシントン大学の研究プロジェクトとして開始し、2014年に公開しました。Carlos Guestrinと共著した2016年のKDD論文XGBoost: スケーラブルな木ブースティングシステムでは、正則化された目的関数とシステム設計について説明しています。DMLCコミュニティが保守するこのライブラリは、Python、R、JVM、Cから分類、回帰、ランキングを処理し、CPUとGPUで動作するほか、DaskやSparkを使ってスケールアウトできます。論文によると、2015年にKaggleのブログで公開されたコンペティション優勝ソリューション29件のうち17件で、XGBoostが使われていました。
XGBoostの仕組み#
XGBoostはアンサンブルを逐次構築します。定数の予測値から始め、ブースティングラウンドごとに1本の木を追加します。各木は、それまでの木が残した損失を減らすように学習します。最終的な予測値は各木の出力の合計であり、どの木も支配的にならないよう、各出力に学習率(eta、デフォルトは0.3)を乗じて縮小します。論文では、各木の構築方法を決める2つの考え方が示されています。
- 2次目的関数: XGBoostは各行について、現在の予測値に対する損失の1次微分と2次微分、つまり勾配
gとヘッセ行列hを計算します。勾配の合計がG、ヘッセ行列の合計がHとなる行を持つ葉には、重み-G / (H + λ)が設定されます。これは2次最適化手法で使われるニュートンステップと同じです。 - 正則化された木: 目的関数には、葉ごとのペナルティ
γと葉の重みに対するL2ペナルティλが加わり、オプションでL1ペナルティαも加えられます。分割のゲイン½ [G_L²/(H_L + λ) + G_R²/(H_R + λ) − (G_L + G_R)²/(H_L + H_R + λ)] − γが正の場合にのみ分割が採用されるため、木の構築に正則化が組み込まれ、過学習が抑えられます。
木の深さには上限があり(max_depth、デフォルトは6)、grow_policy="lossguide"を設定して葉単位の成長に切り替えない限り、レベルごとに成長します。学習では通常、検証セットを使って早期停止を行います。
欠損値、速度、スケーラビリティ#
XGBoostのスパース性を考慮した分割探索では、欠損値補完のステップなしで、値が抜けている表形式データを学習できます。各分割で欠損値のある行を左、次に右へ送ることを試し、ゲインが高い方向をそのノードのデフォルト分岐として採用します。同じ仕組みにより、one-hotエンコーディングなどのスパース行列でも、保存されている要素だけを走査できます。この例では、scikit-learnの乳がんデータセットの全特徴量の30%を欠損させ、欠損をそのまま使って学習します。
import numpy as np
import xgboost as xgb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
# Hide 30% of all values; each split learns a default branch for missing ones
rng = np.random.default_rng(0)
X_train_nan = np.where(rng.random(X_train.shape) < 0.3, np.nan, X_train)
X_test_nan = np.where(rng.random(X_test.shape) < 0.3, np.nan, X_test)
for name, train, test in [("complete", X_train, X_test), ("30% missing", X_train_nan, X_test_nan)]:
model = xgb.XGBClassifier(n_estimators=200, max_depth=4, learning_rate=0.1)
model.fit(train, y_train)
print(f"{name}: accuracy {model.score(test, y_test):.3f}")完全なデータでのテスト精度は0.972、学習セットとテストセットの両方で値の30%が欠損している場合は0.951と出力されます。
速度面では、デフォルトのhistツリーメソッドが各特徴量を最大256個のビン(max_bin)に分割し、ビン境界で分割を探索します。これはLightGBMと同じ方式です。一方、exactはソート済みの値をすべて列挙します。device="cuda"を設定すると学習がNVIDIA GPU上で実行され、enable_categorical=Trueはカテゴリ列をネイティブに分割し、外部メモリーモードではRAMより大きなデータセットを学習できます。バージョン2.1以降、モデルはデフォルトでバイナリのUBJSON形式で保存されます。
XGBoostと関連手法の比較#
- LightGBM: Microsoftが2016年に公開したブースティングフレームワークです。デフォルトで葉単位に木を成長させ、勾配ベースの行サンプリングとスパース特徴量のバンドルを追加します。現在は両ライブラリともデフォルトでヒストグラムを使用し、ほとんどの技術を共有しています。
- CatBoost: 対称木を構築し、順序付きターゲット統計量でカテゴリ特徴量をエンコードする、Yandexのブースティングライブラリです。
- ランダムフォレスト: ブートストラップサンプルで深い木を個別に学習させて平均化するバギング手法です。分散を低減でき、チューニングもほとんど必要ありません。
- ディープラーニング: 画像、音声、テキストなどの非構造化入力で標準的に使われており、ネットワークが生データから特徴量を学習します。特徴量を設計した表形式データでは、ブースティング木が今も標準的な比較対象です。また、TabPFNなどの表形式データ向け基盤モデルも、小規模データセットで競合するようになっています。
実際のアプリケーション#
- 不正検出と信用リスク: 決済企業は金額、加盟店、場所、デバイス、アカウント履歴の特徴量から各取引をスコアリングします。これは中核的な予測モデリングのタスクであり、XGBoostの高速な推論はリアルタイムの判断に適しています。
- 外観検査:製造品質システムでは、カメラデータとセンサーデータを組み合わせます。カメラ側の情報はUltralytics YOLO26の予測が提供します。
result.summary()は、検出した各欠陥のクラス、信頼度、ボックス座標を返します。工場ではこれらを部品ごとに集計し、温度や圧力の読み取り値と結合して、故障を予測するXGBoostモデルの特徴量にできます。 - ランキングとクリック予測:
XGBRankerは、デフォルトでrank:ndcg目的関数を使って検索結果を並べ替えます。また、二値分類器で広告のクリック率を予測します。 - コンペティションで優勝した課題: KDD論文では、2015年の優勝ソリューションの対象となった課題として、店舗の売上予測、高エネルギー物理学イベントの分類、マルウェアの分類、大規模オンライン講座の退学予測などを挙げています。










