はじめに
このページでは、機械学習の高度な手法の一つであるランダムフォレスト回帰を用いて、カリフォルニア州の住宅価格を予測する方法を学びます。ランダムフォレストは、複数の決定木を組み合わせることで、より安定した予測を可能にする手法です。
ランダムフォレスト回帰は、以下の特徴を持っています:
- 高い予測精度
- 過学習(オーバーフィッティング)に強い
- 特徴量の重要度を評価できる
使用するデータセットは、カリフォルニア州の住宅に関する情報です。この中から、世帯の平均収入(MedInc)を用いて住宅価格を予測するモデルを構築します。
それでは、実際にPythonコードを見ながら、ランダムフォレスト回帰分析の流れを詳しく見ていきましょう。
ライブラリのインポート
まず、必要なライブラリをインポートします。
import pandas as pd
from sklearn import datasets
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
各ライブラリの役割を説明します:
pandas
: データの操作や分析に使用します。sklearn
(scikit-learn): 機械学習のアルゴリズムや関連する機能を提供するライブラリです。datasets
: サンプルデータセットを提供します。ensemble
: アンサンブル学習のモデル(ここではランダムフォレスト)を提供します。metrics
: モデルの性能評価に使用する指標を計算します。model_selection
: データの分割やモデル選択に関する機能を提供します。
これらのライブラリをインポートすることで、データの読み込みから分析、モデリング、評価まで一連の作業を行うことができます。
データセットのインポート
次に、scikit-learnに用意されているカリフォルニア住宅データセットをインポートします。
dataset = datasets.fetch_california_housing()
fetch_california_housing()
関数を使用して、カリフォルニア住宅データセットをダウンロードし、dataset
変数に格納します。このデータセットには、カリフォルニア州の各地域の住宅に関する様々な特徴量と、それに対応する住宅価格の中央値が含まれています。
データセットの確認
データセットの内容を確認します。
print('特徴量:', dataset.feature_names)
print('目的変数:', dataset.target_names)
pd.set_option('display.max_columns', None)
df = pd.DataFrame(dataset.data, columns=dataset.feature_names)
df['target'] = dataset.target
df.head()
出力
特徴量: ['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude']
目的変数: ['MedHouseVal']

ここでは以下の操作を行っています:
- データセットの特徴量(説明変数)と目的変数の名前を表示します。
- pandasの表示オプションを設定し、全ての列を表示できるようにします。
- データセットの特徴量をpandas DataFrameに変換します。
- 目的変数(住宅価格の中央値)をDataFrameに追加します。
- データの最初の5行を表示して、内容を確認します。
これらの操作により、データセットの構造や内容を把握することができます。
説明変数と目的変数に分割
次に、分析に使用する説明変数と目的変数を選択し、データを分割します。
select_features = ['MedInc']
X = df.loc[:1000, select_features].values
y = df.loc[:1000, 'target'].values
ここでは以下の操作を行っています:
select_features
に、使用する説明変数(ここではMedIncのみ)を指定します。X
に説明変数のデータを格納します。ここでは最初の1000行のみを使用しています。y
に目的変数(住宅価格の中央値)のデータを格納します。同じく最初の1000行のみです。
説明のために1000行に制限していますが、実際の分析では全データを使用することが一般的です。
訓練データとテストデータに分割
データを訓練用とテスト用に分割します。
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=0)
train_test_split
関数を使用して、データを訓練用とテスト用に分割します。
test_size=0.3
: テストデータの割合を30%に設定します。random_state=0
: 乱数のシードを固定し、毎回同じ結果が得られるようにします。
データを分割する理由は、モデルの汎化性能を適切に評価するためです。訓練データでモデルを学習し、テストデータで性能を評価することで、未知のデータに対する予測性能を推定できます。
訓練データによるモデルの学習
ランダムフォレスト回帰モデルを作成し、訓練データを使って学習させます。
regressor = RandomForestRegressor(n_estimators=50,
criterion='squared_error',
random_state=0)
regressor.fit(X_train, y_train)
ここでは以下の操作を行っています:
RandomForestRegressor()
でランダムフォレスト回帰モデルのインスタンスを作成します。
n_estimators=50
: ランダムフォレストに含める決定木の数を50に設定します。criterion='squared_error'
: 分割の品質を評価する基準として平均二乗誤差を使用します。random_state=0
: 乱数のシードを固定し、再現性を確保します。
fit()
メソッドを使用して、訓練データ(X_train, y_train)でモデルを学習させます。
ランダムフォレストは、複数の決定木を作成し、それらの予測を平均化することで最終的な予測を行います。各決定木は、データのランダムなサブセットと特徴量のランダムなサブセットを使用して作成されます。これにより、個々の木の多様性が確保され、モデル全体の汎化性能が向上します。
新しいデータポイントでの予測
学習したモデルを使って、新しいデータポイントでの予測を行います。
new_data = [[8.0]]
pred_label = regressor.predict(new_data)[0]
print(f'予測した{dataset.target_names}の値: {pred_label:.3f}')
出力
予測した['MedHouseVal']の値: 3.717
ここでは、世帯の平均収入(MedInc)が8.0の場合の住宅価格を予測しています。predict()
メソッドを使用して予測を行い、結果を小数点以下3桁まで表示しています。
テストデータで予測
次に、テストデータ全体に対して予測を行います。
y_pred = regressor.predict(X_test)
predict()
メソッドを使用して、テストデータ(X_test)に対する予測を行い、結果をy_pred
に格納します。
モデルの性能評価
モデルの性能を評価するために、平均二乗誤差(MSE)とR二乗(R^2)スコアを計算します。
print(f'MSE: {mean_squared_error(y_test, y_pred):.3f}')
print(f'R^2: {r2_score(y_test, y_pred):.3f}')
出力
MSE: 0.453
R^2: 0.473
- 平均二乗誤差(MSE):予測値と実際の値の差(誤差)の二乗の平均です。0に近いほど良いモデルとされています。
- R二乗(R^2)スコア:モデルの当てはまりの良さを示す指標です。1に近いほど良いモデルで、0に近いほど悪いモデルとされています。
これらの指標を用いることで、モデルがどの程度正確に予測できているかを数値的に評価できます。
まとめ
このチュートリアルでは、カリフォルニア住宅データセットを使用して、ランダムフォレスト回帰分析の基本的な流れを学びました。
ランダムフォレスト回帰は、複数の決定木を組み合わせることで、単一の決定木よりも高い予測精度と汎化性能を実現します。この手法の利点は以下の通りです:
- 高い予測精度:複数のモデルの予測を平均化することで、ノイズの影響を減らし、より安定した予測が可能です。
- 過学習に強い:各決定木がデータの異なるサブセットを使用するため、全体として過学習を抑制できます。
- 特徴量の重要度評価:モデル学習後に、各特徴量の重要度を評価できます。これは、どの変数が予測に大きく寄与しているかを理解するのに役立ちます。
一方で、ランダムフォレストは単一の決定木に比べて解釈が難しくなる傾向があります。また、大規模なデータセットや高次元のデータに対しては計算コストが高くなる可能性があります。
このコードを基に、様々なデータセットで実験を行い、ハイパーパラメータ(木の数、最大深さなど)を調整するなどして、ランダムフォレスト回帰分析の理解を深めてください。また、他の回帰手法(線形回帰、決定木回帰など)と比較することで、ランダムフォレストの特性をより深く理解することができるでしょう。
本コンテンツへの意見や質問