Scikit-learnによるランダムフォレスト分類モデル構築ガイド (RandomForestClassifier)

Python

PythonのScikit-learnライブラリを使って、高精度な機械学習モデルを構築したいけれど、どのアルゴリズムから手をつければ良いか分からない、ということはありませんか?

この記事は、RandomForestClassifier を用いて、強力な分類モデルを構築するための実践的なステップ・バイ・ステップガイドです。

ランダムフォレストは、その安定した性能と使いやすさから、Kaggleなどのデータ分析コンペティションから実務まで幅広く利用されています。

このガイドを最後まで読めば、以下のスキルが身につきます。

  • ランダムフォレストの基本原理の理解
  • RandomForestClassifierを使ったモデル構築の一連の流れ
  • モデルの精度を最大化するためのハイパーパラメータチューニング
  • 構築したモデルを解釈する手法

サンプルコードと共に、モデル構築の各ステップを丁寧に解説していきます。

ランダムフォレストとRandomForestClassifierの概要

まず、ランダムフォレストがどのようなアルゴリズムなのかを理解しましょう。

RandomForestClassifierは、アンサンブル学習と呼ばれる手法の一つです。アンサンブル学習は、複数の単純なモデル(弱学習器)を組み合わせることで、単体よりもはるかに強力な一つのモデルを作り出すアプローチです。

ランダムフォレストの場合、この弱学習器が決定木にあたります。 たくさんの決定木を「ランダム」に生成し、それぞれの予測結果を多数決でまとめることで、最終的な予測を行います。この仕組みにより、個々の決定木が持つ「過学習(学習データに特化しすぎて未知のデータに対応できない状態)」のリスクを大幅に低減できるのが最大の強みです。

ステップ・バイ・ステップ:RandomForestClassifierの実装手順

ここからは、具体的なコードを用いてモデル構築の手順を追っていきます。 今回は、機械学習の入門で頻繁に使われるiris(アヤメ)データセットを使用します。

Step 1: 必要なライブラリのインポート

最初に、モデル構築、データ分割、性能評価に必要なモジュールをScikit-learnからインポートします。

# Scikit-learn関連
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# データハンドリングと可視化
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

Step 2: データセットの準備と分割

次に、irisデータセットを読み込み、モデルの学習に使用する「学習データ」と、モデルの性能を評価するための「テストデータ」に分割します。

# irisデータセットをロード
iris = load_iris()
X = iris.data  # 特徴量 (がくの長さ・幅、花びらの長さ・幅)
y = iris.target # 目的変数 (アヤメの種類)

# 学習データとテストデータに8:2で分割
# random_stateを設定することで、毎回同じ分割結果を再現できます
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

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

Step 3: モデルの学習 (fit)

RandomForestClassifierのインスタンスを生成し、fitメソッドを使って学習データを学習させます。このステップで、モデルはデータ内のパターンを学びます。

# RandomForestClassifierのインスタンスを生成
# ここではデフォルトのパラメータを使用します
model = RandomForestClassifier(random_state=42)

# 学習データをモデルに適合させる (学習)
model.fit(X_train, y_train)

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

Step 4: 予測 (predict) と性能評価

学習済みのモデルを使い、未知のデータであるテストデータ(X_test)の結果を予測します。 その後、予測結果と実際の正解(y_test)を比較し、モデルの正解率(Accuracy)を算出します。

# テストデータで予測を実行
y_pred = model.predict(X_test)

# 予測精度を評価
accuracy = accuracy_score(y_test, y_pred)
print(f"モデルの正解率 (Accuracy): {accuracy:.4f}")
# 出力例: モデルの正解率 (Accuracy): 1.0000

モデルを改善する主要ハイパーパラメータ

デフォルト設定でも高い性能を発揮しますが、ハイパーパラメータを調整することで、さらに性能を向上させることが可能です。 特に重要な3つのハイパーパラメータを紹介します。

  • n_estimators: フォレスト内に作成する決定木の総数です。一般的に、この値が大きいほど性能は向上しますが、計算コストも増加します。デフォルトは100です。
  • max_depth: 各決定木の最大の深さを制限します。この値を適切に設定することで、モデルの複雑さをコントロールし、過学習を防ぐことができます。None(デフォルト)の場合、ノードが純粋になるまで分割が続きます。
  • min_samples_split: ノードを分割するために必要な最小サンプル数を指定します。この値を大きくすると、より一般的なルールを学習し、過学習を抑制する効果があります。デフォルトは2です。

実践ガイド:GridSearchCVによるハイパーパラメータチューニング

最適なハイパーパラメータの組み合わせを手作業で見つけるのは大変です。そこで、GridSearchCVというツールを使います。 これは、指定したパラメータの組み合わせを総当たりで試し、最も性能の良い組み合わせを自動で探索してくれる強力な機能です。

from sklearn.model_selection import GridSearchCV

# 探索するパラメータの候補を辞書で定義
param_grid = {
    'n_estimators': [50, 100, 200],
    'max_depth': [5, 10, 20, None],
    'min_samples_split': [2, 5, 10]
}

# ベースとなるモデルとパラメータグリッドを指定してGridSearchCVを初期化
# cv=5 は5分割交差検証を意味する
grid_search = GridSearchCV(
    estimator=RandomForestClassifier(random_state=42),
    param_grid=param_grid,
    cv=5,
    scoring='accuracy',
    n_jobs=-1 # 利用可能なCPUコアをすべて使用
)

# ハイパーパラメータ探索を実行
grid_search.fit(X_train, y_train)

# 最適なパラメータとスコアを表示
print(f"最適なハイパーパラメータ: {grid_search.best_params_}")
print(f"交差検証での最高スコア: {grid_search.best_score_:.4f}")

# 最適なモデルでテストデータを再評価
best_model = grid_search.best_estimator_
y_pred_best = best_model.predict(X_test)
accuracy_best = accuracy_score(y_test, y_pred_best)
print(f"チューニング後のモデルの正解率: {accuracy_best:.4f}")

モデルの解釈:特徴量重要度の評価と可視化

ランダムフォレストは「ブラックボックス」モデルではなく、どの特徴量が予測にどれだけ貢献したかを評価する特徴量重要度feature_importances_)を提供します。 これにより、モデルの予測根拠をある程度解釈できます。

# チューニング後の最適なモデルから特徴量重要度を取得
importances = best_model.feature_importances_
feature_names = iris.feature_names

# 特徴量重要度をDataFrameに変換
df_importance = pd.DataFrame({'feature': feature_names, 'importance': importances})
df_importance = df_importance.sort_values('importance', ascending=False)

# 棒グラフで可視化
plt.figure(figsize=(12, 7))
sns.barplot(x='importance', y='feature', data=df_importance)
plt.title('Feature Importance of RandomForestClassifier')
plt.xlabel('Importance')
plt.ylabel('Feature')
plt.show()

この可視化により、どの特徴量がモデルの判断に強く影響を与えているかを直感的に理解することができます。

まとめ:ランダムフォレスト構築のポイント

本ガイドでは、Scikit-learnRandomForestClassifierを用いた分類モデル構築の一連のプロセスを解説しました。

  • 基本実装: fitpredictだけで簡単にモデルを構築できる。
  • 性能向上: n_estimatorsmax_depthなどのハイパーパラメータ調整が鍵となる。
  • 効率化: GridSearchCVを活用することで、最適なパラメータ探索を自動化できる。
  • モデル解釈: 特徴量重要度を評価することで、モデルの予測根拠を理解する手がかりになる。

RandomForestClassifierは、初心者にとっての入門アルゴリズムとして、また専門家にとっての信頼できるツールとして、非常に優れた選択肢です。このガイドを参考に、ぜひ自身のデータ分析プロジェクトで活用してみてください。

コメント

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