PythonとScikit-learnで始めるランダムフォレスト回帰!RandomForestRegressorの基礎と実践

Python

「Pythonで機械学習を始めたけれど、どんなモデルを使えば良いんだろう?」 「もっと精度の高い予測がしたい!」

そんな風に考えているあなたにピッタリなのが、今回ご紹介するランダムフォレストです。 この記事では、機械学習ライブラリScikit-learnを使い、ランダムフォレストで数値を予測する(回帰)ためのモデルRandomForestRegressorの基礎から実践までを、分かりやすく解説します。

この記事を最後まで読めば、ランダムフォレストの仕組みを理解し、ご自身の手で高精度な回帰モデルを構築できるようになります。

はじめに:高精度な予測モデルへの第一歩

RandomForestRegressorは、数ある機械学習モデルの中でも特に人気が高く、コンペティションから実務まで幅広く利用されています。 なぜなら、比較的少ないパラメータ調整で、非常に高い予測精度を出すことができるからです。 まずはその強力なモデルの「基礎」を理解し、次に「実践」で使い方をマスターしていきましょう。

基礎編:ランダムフォレスト回帰とは?

ランダムフォレストとは、一体どのような仕組みで動いているのでしょうか。 その中心にあるのが「アンサンブル学習」という考え方です。

「森」の力で賢くなるアンサンブル学習

一人の専門家の意見よりも、多くの専門家の意見を集めた方が良い結果が得られることがありますよね。アンサンブル学習は、まさにこの考え方を機械学習に応用したものです。

ランダムフォレスト(Random Forest = ランダムな森)では、**決定木(Decision Tree)**というシンプルなモデルをたくさん(森のように)作ります。そして、それぞれの決定木に少しずつ違うデータを与えて学習させ、最終的にすべての木の予測結果を平均して結論を出します。

この「みんなで決めれば怖くない」アプローチにより、個々の決定木が持つ弱点(過学習しやすさ)を互いに補い合い、頑健で精度の高いモデルが生まれるのです。

なぜランダムフォレストは強力なのか?メリット・デメリット

ランダムフォレストの強みと、利用する上での注意点を整理しておきましょう。

メリット:

  • 高い予測精度: 多くの実務シーンで安定して高い性能を発揮します。
  • 過学習に強い: 複数のモデルの平均を取るため、訓練データだけに偏った予測をしにくいです。
  • パラメータ調整が比較的容易: デフォルトの設定でもある程度の精度が期待できます。
  • 特徴量の重要度がわかる: どの変数が予測に効いているかを知る手がかりになります。

デメリット:

  • モデルの解釈性: 内部が複雑なため「なぜこの予測になったのか」を完全に説明するのは困難です。
  • 計算コスト: 多数の木を生成するため、データ量が多いと学習に時間がかかることがあります。

準備編:開発環境とデータを用意しよう

それでは、実践に入るための準備を整えましょう。

必要なライブラリのインストール

Scikit-learnをはじめ、データ操作や可視化に必要なライブラリをインストールします。ターミナルやコマンドプロンプトで以下のコマンドを実行してください。

pip install scikit-learn pandas matplotlib seaborn

今回使用するサンプルデータ

今回は、Scikit-learnに付属している「カリフォルニア住宅価格データセット」を使用します。このデータセットには、地域の平均所得や築年数などから、その地域の住宅価格を予測するためのデータが含まれています。

実践編:Scikit-learnでRandomForestRegressorを使ってみよう

お待たせしました。ここからは、実際にコードを書きながらRandomForestRegressorを動かしていきます。

Step 1. ライブラリのインポート

まず、必要なPythonライブラリをインポートします。

import pandas as pd
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score

Step 2. データの読み込みと分割

次に、データを読み込み、モデルの学習に使う「訓練データ」と、性能評価に使う「テストデータ」に分けます。

# データセットの読み込み
housing = fetch_california_housing()
X = pd.DataFrame(housing.data, columns=housing.feature_names)
y = pd.Series(housing.target)

# 訓練データとテストデータに8:2の割合で分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

print(f"訓練データ数: {len(X_train)}")
print(f"テストデータ数: {len(X_test)}")

Step 3. モデルの学習と予測

いよいよモデルの構築です。RandomForestRegressorのインスタンスを作成し、fit()メソッドで学習させます。

# RandomForestRegressorモデルを初期化
# random_state=42とすることで、誰が実行しても同じ結果になるように固定します
model = RandomForestRegressor(n_estimators=100, random_state=42)

# 訓練データを使ってモデルを学習
model.fit(X_train, y_train)

# 学習済みモデルでテストデータの価格を予測
y_pred = model.predict(X_test)

たったこれだけで、学習と予測が完了しました。n_estimators=100は、森の中に100本の決定木を作ることを意味します。

Step 4. モデルの精度を評価する

モデルがどれくらい良い予測ができたのか、性能を評価しましょう。 ここでは、予測値と実際の値(正解)がどれだけ近いかを示す「決定係数 R2スコア」を見てみます。この値は1に近いほど良いモデルとされます。

# 決定係数R2スコアでモデルの精度を評価
r2 = r2_score(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred) #参考:平均二乗誤差

print(f"決定係数 (R2 Score): {r2:.3f}")
print(f"平均二乗誤差 (MSE): {mse:.3f}")

決定係数が約0.807となり、このモデルがデータの変動の約81%を説明できていることが分かりました。非常に良好な結果です。

応用編:予測の根拠を探る「特徴量の重要度」

ランダムフォレストの便利な機能として、どの特徴量(所得、築年数など)が予測にどれだけ影響を与えたかを示す「特徴量の重要度」を計算できます。

import matplotlib.pyplot as plt
import seaborn as sns

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

# 可視化のためのデータフレームを作成
feature_importance_df = pd.DataFrame({
    'Feature': X.columns,
    'Importance': importances
}).sort_values('Importance', ascending=False)

# 棒グラフで可視化
plt.figure(figsize=(10, 6))
sns.barplot(x='Importance', y='Feature', data=feature_importance_df)
plt.title('Feature Importance')
plt.show()

この結果から、「MedInc(所得の中央値)」が住宅価格を予測する上で最も重要な要素であったことが視覚的に理解できます。

まとめ:基礎を固めて次のステップへ

本記事では、ランダムフォレスト回帰モデルRandomForestRegressorの基礎理論から、Scikit-learnを使った実践的な実装方法までを解説しました。

  • 基礎: ランダムフォレストは、多数の決定木を組み合わせた強力なアンサンブル学習モデル。
  • 実践: Scikit-learnを使えば、fitpredictだけで簡単に学習と予測が可能。
  • 応用: feature_importances_で、どの特徴量が予測に重要だったかを分析できる。

RandomForestRegressorは、データ分析の現場で頼りになる強力なツールです。 今回学んだ基礎を元に、次はパラメータを調整してさらに精度を追求したり、ご自身の興味のあるデータセットに応用したりと、ぜひ次のステップに進んでみてください。

コメント

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