決定木回帰の基礎と実装
決定木回帰(Decision Tree Regression)は、データを基に一連の条件を作成し、最も適切な結果を得るためにデータを分割するアルゴリズムです。決定木は回帰タスクにおいても有効で、データを複数の領域に分割し、その領域ごとに予測値を計算します。本記事では、決定木回帰の基本概念とPythonでの実装を紹介します。
決定木回帰の基本概念
決定木回帰は、データを複数の領域に分割し、それぞれの領域での平均値などを用いて予測を行います。回帰問題において、決定木回帰は次のように動作します。
- データを分割し、予測精度を最大化するように条件を設定。
- 各分割点(ノード)でデータをさらに細かく分ける。
- 各終端ノードで予測値を計算する。
決定木回帰は、データの非線形な関係をモデル化するのに適していますが、過学習しやすいというデメリットもあります。これを防ぐために、木の深さを制限するなどの正則化が行われます。
Pythonでの決定木回帰の実装
次に、Pythonのscikit-learn
ライブラリを使って、決定木回帰の実装を行います。まずは、必要なライブラリをインポートし、サンプルデータを用意します。
サンプルデータの作成
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)
このコードでは、X
にsin(x)
を基にしたデータを生成し、さらに一部のデータにノイズを加えています。これを訓練データとテストデータに分割します。
決定木回帰モデルの構築
次に、DecisionTreeRegressor
クラスを使用して決定木回帰モデルを構築します。
# 決定木回帰モデルの構築
tree_model = DecisionTreeRegressor(max_depth=3)
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=3
で決定木の深さを制限しています。深さを制限することで、過学習を防ぎ、モデルの汎化性能を高めます。訓練が完了したモデルに対して、テストデータを使って予測を行い、Mean Squared Error(MSE)
でモデルの性能を評価します。
結果のプロット
予測結果と実際のデータをグラフにプロットして、モデルがどのようにデータをキャプチャしているかを視覚化します。
# 結果の可視化
plt.figure(figsize=(10, 6))
plt.scatter(X_test, y_test, color='blue', label='True values')
plt.scatter(X_test, y_pred, color='red', label='Predicted values')
plt.xlabel('X')
plt.ylabel('y')
plt.title('Decision Tree Regression')
plt.legend()
plt.show()
このコードでは、実際の値(青)とモデルの予測値(赤)をプロットしています。決定木回帰はデータを区間に分割して予測を行うため、グラフ上で一定の区間ごとに予測値が変わることが確認できます。
決定木回帰の利点と欠点
決定木回帰の利点と欠点を以下にまとめます。
利点 | 欠点 |
---|---|
非線形なデータに適しており、複雑な関係をモデル化できる。 | 深さが大きい場合、過学習のリスクが高まる。 |
データの前処理がほとんど不要で、スケーリングなどが必要ない。 | データの小さな変化に対してモデルが大きく変動しやすい。 |
視覚的に理解しやすく、可視化が可能。 | 訓練時間が増加しやすく、大規模データには向かない場合がある。 |
決定木回帰を使う上での注意点
- 過学習の防止: 決定木回帰は、深さが深くなるほど過学習しやすくなります。
max_depth
やmin_samples_split
などのパラメータを調整して、木のサイズを制限することが重要です。 - データのバランス: データが不均衡な場合、決定木が一部のデータに偏った分割を行うことがあるため、事前にデータのバランスを確認しておくと良いでしょう。
- 他のアンサンブル手法との併用: ランダムフォレストや勾配ブースティングといったアンサンブル手法と組み合わせることで、決定木回帰の弱点を補完することができます。
まとめ
決定木回帰は、非線形なデータにも対応可能な強力なアルゴリズムですが、深さの制限をしないと過学習しやすくなるため注意が必要です。scikit-learn
を使って簡単に実装でき、視覚的にも理解しやすいので、データ分析の入門に適しています。