決定木回帰の基礎と実装
決定木回帰(Decision Tree Regression)は、データを条件によって分割し、それぞれの領域ごとに予測値を決める回帰アルゴリズムです。分類で使われる決定木と同じように、条件分岐を繰り返しながらデータを分けていきますが、最終的な出力はクラスではなく数値になります。
非線形な関係を表現しやすく、結果を視覚的に理解しやすい一方で、木を深くしすぎると過学習しやすいという特徴があります。
決定木回帰の仕組みを図で理解する

決定木回帰とは?
決定木回帰は、データを複数の領域に分割し、それぞれの領域の代表値を使って予測を行う手法です。
例えば、住宅価格を予測する場合、「面積が広いか」「築年数が浅いか」などの条件でデータを分割し、各領域ごとの平均価格を予測値として使います。
決定木回帰の基本的な流れ
- 特徴量を使ってデータを分割する条件を探す
- 分割後の誤差が小さくなるように条件を選ぶ
- さらに細かく分割できる場合は分割を繰り返す
- 最終的な葉ノードごとに予測値を決める
- 新しいデータは条件に従って葉ノードまで進み、その葉の値を予測値とする
葉ノードでの予測値
決定木回帰では、最終的に到達した葉ノードに含まれるデータの平均値などを予測値として使います。
| 領域 | 含まれる値の例 | 予測値の例 |
|---|---|---|
| 領域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などのパラメータを調整し、適切な複雑さに制御することが重要です。