決定木回帰の基礎と実装 | 回帰アルゴリズム | Pythonによる機械学習を学ぶ

スポンサーリンク
スポンサーリンク
amazon
スマイルSALE
--:--:--
ad. 価格範囲を指定して商品を探せます

決定木回帰の基礎と実装

決定木回帰(Decision Tree Regression)は、データを条件によって分割し、それぞれの領域ごとに予測値を決める回帰アルゴリズムです。分類で使われる決定木と同じように、条件分岐を繰り返しながらデータを分けていきますが、最終的な出力はクラスではなく数値になります。

非線形な関係を表現しやすく、結果を視覚的に理解しやすい一方で、木を深くしすぎると過学習しやすいという特徴があります。

決定木回帰の仕組みを図で理解する

決定木回帰の仕組みを図で理解する

決定木回帰とは?

決定木回帰は、データを複数の領域に分割し、それぞれの領域の代表値を使って予測を行う手法です。

例えば、住宅価格を予測する場合、「面積が広いか」「築年数が浅いか」などの条件でデータを分割し、各領域ごとの平均価格を予測値として使います。

決定木回帰の基本的な流れ

  1. 特徴量を使ってデータを分割する条件を探す
  2. 分割後の誤差が小さくなるように条件を選ぶ
  3. さらに細かく分割できる場合は分割を繰り返す
  4. 最終的な葉ノードごとに予測値を決める
  5. 新しいデータは条件に従って葉ノードまで進み、その葉の値を予測値とする

葉ノードでの予測値

決定木回帰では、最終的に到達した葉ノードに含まれるデータの平均値などを予測値として使います。

領域 含まれる値の例 予測値の例
領域A 100、110、120 110
領域B 200、210、230 約213
領域C 300、320、340 320

このように、決定木回帰はデータ全体をいくつかの区間に分け、区間ごとに代表的な値を返すモデルです。

Pythonでの決定木回帰の実装

Pythonでは、scikit-learnのDecisionTreeRegressorを使って決定木回帰を実装できます。

サンプルデータの作成

import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

np.random.seed(0)

X = np.sort(5 * np.random.rand(80, 1), axis=0)
y = np.sin(X).ravel()

# ノイズを追加
y[::5] += 1 * (0.5 - np.random.rand(16))

X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=42
)

この例では、sin(x)をもとにした非線形なデータを作成し、一部にノイズを加えています。

決定木回帰モデルの作成

tree_model = DecisionTreeRegressor(
    max_depth=3,
    random_state=42
)

tree_model.fit(X_train, y_train)

y_pred = tree_model.predict(X_test)

mse = mean_squared_error(y_test, y_pred)

print(f'決定木回帰のMSE: {mse:.3f}')

max_depthは木の深さを制限するパラメータです。木を深くしすぎると訓練データに過度に適合しやすくなるため、適切な深さに調整することが重要です。

結果の可視化

plt.figure(figsize=(10, 6))

plt.scatter(X_test, y_test, label='True values')
plt.scatter(X_test, y_pred, label='Predicted values')

plt.xlabel('X')
plt.ylabel('y')
plt.title('Decision Tree Regression')
plt.legend()
plt.show()

決定木回帰では、データを区間に分けて予測するため、予測結果は滑らかな曲線ではなく、段階的に変化する形になりやすいです。

決定木回帰の特徴

特徴 内容
非線形データに対応しやすい 条件分岐によって複雑な関係を表現できる
前処理が少なくて済む 特徴量のスケーリングが必須ではない
結果を解釈しやすい どの条件で分割されたかを確認しやすい
過学習しやすい 木を深くしすぎると訓練データに適合しすぎる

決定木回帰のメリット

  • 非線形な関係を表現しやすい
  • データのスケーリングが基本的に不要
  • 条件分岐として結果を理解しやすい
  • 外れ値の影響を比較的受けにくい場合がある

決定木回帰の注意点

  • 木が深すぎると過学習しやすい
  • データの小さな変化で木の構造が変わることがある
  • 滑らかな予測曲線にはなりにくい
  • 単独の決定木では予測が不安定になる場合がある

過学習を防ぐための主なパラメータ

パラメータ 役割
max_depth 木の最大の深さを制限する
min_samples_split ノードを分割するために必要な最小サンプル数を指定する
min_samples_leaf 葉ノードに必要な最小サンプル数を指定する
max_leaf_nodes 葉ノードの最大数を制限する

これらのパラメータを調整することで、木の複雑さを抑え、過学習を防ぎやすくなります。

ランダムフォレスト回帰との関係

決定木回帰は単独でも使えますが、予測が不安定になることがあります。

その弱点を補う方法として、複数の決定木を組み合わせるランダムフォレスト回帰があります。ランダムフォレストでは、複数の決定木の予測を平均することで、より安定した予測を行います。

まとめ

決定木回帰は、条件分岐によってデータを複数の領域に分け、それぞれの領域ごとに数値を予測する回帰手法です。

非線形な関係を表現しやすく、解釈しやすい一方で、木を深くしすぎると過学習しやすくなります。そのため、max_depthなどのパラメータを調整し、適切な複雑さに制御することが重要です。