Scikit-learnによる勾配ブースティング決定木!GradientBoostingClassifierの基本と実践

Python

機械学習で高精度な予測モデルを構築したいとき、「勾配ブースティング決定木(Gradient Boosting Decision Tree)」は非常に強力な手法です。

このアルゴリズムをPythonのScikit-learnライブラリで実装したものがGradientBoostingClassifierです。

この記事では、「勾配ブースティングって何?」「GradientBoostingClassifierの使い方が知りたい」という方のために、以下の内容を基本から実践まで分かりやすく解説していきます。

  • 勾配ブースティング決定木の基本的な仕組み
  • Scikit-learnを使った具体的な実装コード
  • モデルの性能を左右する重要なハイパーパラメータ
  • 実践で役立つ特徴量の重要度の確認方法

この記事を読めば、GradientBoostingClassifierの理論的な背景と実践的な使い方を両方理解し、自信を持って分類タスクに取り組めるようになります。

勾配ブースティング決定木(Gradient Boosting Decision Tree)とは?

まず、GradientBoostingClassifierのベースとなっている「勾配ブースティング決定木」がどのようなアルゴリズムなのか、その核心に迫ります。

複数の決定木を組み合わせる「アンサンブル学習」

勾配ブースティング決定木は、アンサンブル学習というアプローチの一つです。これは、単独では性能が限られる複数の「弱い学習器」をうまく組み合わせることで、全体として一つの「強い学習器」を作り出す考え方です。

GradientBoostingClassifierでは、この弱い学習器として決定木が用いられます。

間違いから学ぶ「ブースティング」の仕組み

アンサンブル学習の中でも、勾配ブースティングは「ブースティング」というカテゴリに分類されます。ブースティングは、モデルを一つずつ順番に(逐次的に)構築していくのが特徴です。

その仕組みは、以下のステップで進められます。

  1. まず、最初のシンプルな決定木を作成し、データを予測します。
  2. その予測がどれだけ正解から外れているか、**間違い(残差)**を計算します。
  3. 次に、この間違いを予測することに特化した新しい決定木を追加します。
  4. 「1番目の木 + 2番目の木」で再度予測を行い、まだ残っている間違いを、さらに3番目の木で修正しようと試みます。

このように、前のモデルが犯した間違いを、次のモデルが補う形で学習を繰り返していくことで、徐々に全体の予測精度を向上させていきます。この「間違いから学ぶ」姿勢が、勾配ブースティングの強さの源泉です。

【実践】Scikit-learnでGradientBoostingClassifierを使ってみる

理論がわかったところで、早速Scikit-learnを使ってGradientBoostingClassifierを動かしてみましょう。データの準備からモデルの評価まで、一連の流れをコードで示します。

ライブラリのインポートと環境

はじめに、Scikit-learnをはじめとする必要なライブラリをインポートします。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.datasets import make_classification
from sklearn.metrics import accuracy_score

# 実行環境の目安
# scikit-learn==1.5.0
# pandas==2.2.2

サンプルデータの準備(学習用・テスト用)

今回は、make_classification関数を用いて、分類問題用の仮想データセットを手軽に作成します。

# サンプルデータセットを生成
X, y = make_classification(
    n_samples=1000,        # データのサンプル数
    n_features=20,         # 特徴量の数
    n_informative=10,      # 目的変数に関連する特徴量の数
    random_state=42        # 結果を再現するための乱数シード
)

# データを学習用とテスト用に7:3で分割
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42
)

print(f"学習データの形状: {X_train.shape}")
print(f"テストデータの形状: {X_test.shape}")

モデルの構築と学習 (.fit)

GradientBoostingClassifierをインスタンス化し、fitメソッドに学習用データを渡してモデルを学習させます。

# モデルをインスタンス化(乱数シードを固定して再現性を確保)
gbc = GradientBoostingClassifier(random_state=42)

# 学習用データを使ってモデルを学習させる
gbc.fit(X_train, y_train)

print("モデルの学習が完了しました。")

予測と性能評価 (.predict, .score)

学習済みのモデルを使って、未知のデータであるテストデータの予測を行います。その後、予測結果と実際の答えを比較して、モデルの性能を評価します。

ここでは正解率(Accuracy)を評価指標として用います。

# テストデータを使って予測を実行
y_pred = gbc.predict(X_test)

# 正解率を計算して評価
# accuracy_scoreを使う方法
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy (accuracy_score): {accuracy:.4f}")

# scoreメソッドを使う方法
score = gbc.score(X_test, y_test)
print(f"Accuracy (score method): {score:.4f}")

# 出力例:
# Accuracy (accuracy_score): 0.8800
# Accuracy (score method): 0.8800

基本的な実装は非常にシンプルです。これだけで、強力な分類モデルを構築・評価することができました。

モデルを使いこなすための主要ハイパーパラメータ

GradientBoostingClassifierの真価を発揮させるには、ハイパーパラメータの調整が鍵となります。ここでは、特に重要な3つを見ていきましょう。

n_estimators: 木の数(アンサンブルの規模)

アンサンブルに含める決定木の合計本数です。デフォルトは100です。この値を大きくするとモデルはより複雑になり、学習データへの適合度を高めることができますが、過学習や計算時間の増大につながる可能性があります。

learning_rate: 学習の慎重さ

各決定木がモデル全体に与える影響の度合いを調整するパラメータです。デフォルトは0.1です。この値が小さいほど、一つ一つの木が慎重に更新を行うため、過学習を抑制する効果があります。ただし、学習の進みが遅くなるため、十分な性能を得るにはn_estimatorsを増やす必要があります。

max_depth: 木の深さ(モデルの複雑さ)

個々の決定木の最大の深さを制限します。デフォルトは3です。この値が大きいと、それぞれの木が複雑なパターンを学習できますが、データに過剰に適合しやすくなります。一般的には、3から5程度の比較的小さな値に設定することが推奨されます。

結果を解釈する:特徴量の重要度(Feature Importance)

学習済みモデルは、どの特徴量が予測にどれだけ貢献したかを示す「重要度」を保持しています。これを可視化することで、モデルの判断根拠を理解する手がかりになります。

import matplotlib.pyplot as plt
import numpy as np

# 特徴量の重要度を取得
importances = gbc.feature_importances_

# 重要度が高い順に特徴量を並び替える
indices = np.argsort(importances)[::-1]

# グラフで可視化
plt.figure(figsize=(12, 6))
plt.title("Feature Importance")
plt.bar(range(X.shape[1]), importances[indices], align='center')
plt.xticks(range(X.shape[1]), indices)
plt.xlabel("Feature Index")
plt.ylabel("Importance")
plt.show()

このグラフにより、どのインデックスの特徴量が予測において重要視されているかを一目で把握できます。

GradientBoostingClassifierの強みと注意点

最後に、このアルゴリズムを採用する上でのメリットと注意点をまとめます。

強み:高い予測精度

最大の強みは、何といってもその予測精度の高さです。さまざまなデータセットに対して安定して高い性能を発揮するため、多くのデータ分析コンペティションや実務で採用実績があります。

注意点:計算時間と過学習のリスク

一方で、注意すべき点もあります。一つは計算コストです。逐次的にモデルを構築する性質上、並列処理が難しく、学習に時間がかかることがあります。もう一つは過学習のリスクです。ハイパーパラメータを適切に設定しないと、学習データにフィットしすぎてしまい、未知のデータに対する性能が低下する可能性があります。

まとめ

本記事では、Scikit-learnのGradientBoostingClassifierをテーマに、勾配ブースティング決定木の基本理論から実践的な使い方までを解説しました。

  • 勾配ブースティングは、決定木の間違いを次の決定木が修正する形で学習を進める強力なアンサンブル手法。
  • Scikit-learnを使えば、.fit().predict()で簡単に実装できる。
  • n_estimators learning_rate max_depthといったパラメータ調整が精度向上の鍵。
  • 学習後はfeature_importances_で予測に重要な特徴量を特定できる。

高い精度が期待できるGradientBoostingClassifierは、あなたの機械学習プロジェクトにおける頼もしいツールとなるはずです。ぜひ本記事のコードを参考に、その性能を体感してみてください。

コメント

タイトルとURLをコピーしました