決定木回帰のPython実装

目次

はじめに

このページでは、機械学習の手法の一つである決定木回帰分析を用いて、カリフォルニア州の住宅価格を予測する方法を学びます。決定木回帰は、データを繰り返し分割することで予測モデルを構築する手法です。この手法は直感的で解釈しやすく、非線形の関係性も捉えることができます。

決定木回帰では、「情報利得」という概念が重要です。情報利得とは、データを分割することで得られる情報の増加量を表します。決定木アルゴリズムは、この情報利得を最大化するように木構造を成長させていきます。

使用するデータセットは、カリフォルニア州の住宅に関する情報です。この中から、世帯の平均収入(MedInc)を用いて住宅価格を予測するモデルを構築します。

それでは、実際にPythonコードを見ながら、決定木回帰分析の流れを詳しく見ていきましょう。

ライブラリのインポート

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

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.tree import DecisionTreeRegressor

各ライブラリの役割を説明します:

  • matplotlib.pyplot: データの可視化に使用します。
  • numpy: 数値計算や多次元配列の操作に使用します。
  • pandas: データの操作や分析に使用します。
  • sklearn (scikit-learn): 機械学習のアルゴリズムや関連する機能を提供するライブラリです。
  • datasets: サンプルデータセットを提供します。
  • metrics: モデルの性能評価に使用する指標を計算します。
  • tree: 決定木モデルを提供します。

これらのライブラリをインポートすることで、データの読み込みから分析、モデリング、評価、可視化まで一連の作業を行うことができます。

データセットのインポート

次に、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']

ここでは以下の操作を行っています:

  1. データセットの特徴量(説明変数)と目的変数の名前を表示します。
  2. pandasの表示オプションを設定し、全ての列を表示できるようにします。
  3. データセットの特徴量をpandas DataFrameに変換します。
  4. 目的変数(住宅価格の中央値)をDataFrameに追加します。
  5. データの最初の5行を表示して、内容を確認します。

これらの操作により、データセットの構造や内容を把握することができます。

説明変数と目的変数に分割

次に、分析に使用する説明変数と目的変数を選択し、データを分割します。

select_features = ['MedInc']
X = df.loc[:1000, select_features].values
y = df.loc[:1000, 'target'].values

ここでは以下の操作を行っています:

  1. select_featuresに、使用する説明変数(ここではMedIncのみ)を指定します。
  2. Xに説明変数のデータを格納します。ここでは最初の1000行のみを使用しています。
  3. yに目的変数(住宅価格の中央値)のデータを格納します。同じく最初の1000行のみです。

説明のために1000行に制限していますが、実際の分析では全データを使用することが一般的です。

訓練データによるモデルの学習

決定木回帰モデルを作成し、データを使って学習させます。

regressor = DecisionTreeRegressor(random_state=0, max_depth=3)
regressor.fit(X, y)

ここでは以下の操作を行っています:

  1. DecisionTreeRegressor()で決定木回帰モデルのインスタンスを作成します。
  • random_state=0: 乱数のシードを固定し、再現性を確保します。
  • max_depth=3: 木の最大の深さを3に設定します。これは過学習を防ぐためのパラメータです。
  1. fit()メソッドを使用して、説明変数(X)と目的変数(y)でモデルを学習させます。

決定木アルゴリズムは、各ノードで情報利得が最大になるように特徴量と分割点を選択します。これにより、予測精度の高いモデルを構築します。

新しいデータポイントでの予測

学習したモデルを使って、新しいデータポイントでの予測を行います。

new_data = [[8.0]]
pred_label = regressor.predict(new_data)[0]
print(f'予測した{dataset.target_names}の値: {pred_label:.3f}')

出力

予測した['MedHouseVal']の値: 3.966

ここでは、世帯の平均収入(MedInc)が8.0の場合の住宅価格を予測しています。predict()メソッドを使用して予測を行い、結果を小数点以下3桁まで表示しています。

テストデータで予測

次に、元のデータセット全体に対して予測を行います。

y_pred = regressor.predict(X)

predict()メソッドを使用して、説明変数(X)に対する予測を行い、結果をy_predに格納します。

モデルの性能評価

モデルの性能を評価するために、平均二乗誤差(MSE)とR二乗(R^2)スコアを計算します。

print(f'MSE: {mean_squared_error(y, y_pred):.3f}')
print(f'R^2: {r2_score(y, y_pred):.3f}')

出力

MSE: 0.304
R^2: 0.616
  1. 平均二乗誤差(MSE):予測値と実際の値の差(誤差)の二乗の平均です。0に近いほど良いモデルとされています。
  2. R二乗(R^2)スコア:モデルの当てはまりの良さを示す指標です。1に近いほど良いモデルで、0に近いほど悪いモデルとされています。

これらの指標を用いることで、モデルがどの程度正確に予測できているかを数値的に評価できます。

性能評価の可視化

最後に、モデルの性能を視覚的に評価するためのグラフを描画します。

x_grid = np.arange(min(X), max(X), 0.1)
x_grid = x_grid.reshape((len(x_grid), 1))

plt.scatter(X, y, color='red', label='Data points')
plt.plot(x_grid, regressor.predict(x_grid), color='blue', label=f'{type(regressor).__name__}')
plt.title(f'{type(regressor).__name__}')
plt.xlabel(f'{select_features[0]}')
plt.ylabel(f'{dataset.target_names[0]}(Target Value)')

X1_min, X1_max = X.min() - 1, X.max() + 1
X2_min, X2_max = y.min() - 1, y.max() + 1
X1, X2 = np.meshgrid(np.arange(X1_min, X1_max, 0.1), np.arange(X2_min, X2_max, 0.1))

plt.legend()
plt.show()

出力

この部分では、以下の操作を行っています:

  1. 予測線を描画するためのグリッドポイントを生成します。
  2. 実際のデータ点を赤色の散布図でプロットします。
  3. 決定木回帰の予測線を青色でプロットします。
  4. グラフのタイトル、x軸ラベル、y軸ラベルを設定します。
  5. 凡例を追加し、グラフを表示します。

この可視化により、決定木回帰モデルがデータにどのようにフィットしているかを視覚的に確認できます。決定木回帰の特徴として、予測線が階段状になることがあります。これは、決定木が特定の閾値でデータを分割し、各領域で一定の予測値を出力するためです。

まとめ

このチュートリアルでは、カリフォルニア住宅データセットを使用して、決定木回帰分析の基本的な流れを学びました。

決定木回帰は、データを繰り返し分割することで予測モデルを構築します。各分割点では、情報利得を最大化するように特徴量と閾値が選択されます。この手法の利点は、モデルの解釈が容易であり、非線形の関係性も捉えられることです。

一方で、決定木は過学習しやすいという欠点があります。これを防ぐために、木の深さを制限したり、枝刈り(プルーニング)を行ったりします。また、より安定した予測を得るために、ランダムフォレストやグラディエントブースティングなどのアンサンブル手法も広く使用されています。

このコードを基に、様々なデータセットで実験を行い、木の深さや他のハイパーパラメータを変更するなどして、決定木回帰分析の理解を深めてください。また、特徴量の重要度を分析することで、どの変数が予測に大きく寄与しているかを把握することもできます。

この記事が気に入ったら
フォローしてね!

この記事が参考になった方はシェアしてね!
  • URLをコピーしました!

本コンテンツへの意見や質問

コメントする

目次