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

現在作成中です。今後加筆修正してまいります。
スポンサーリンク
スポンサーリンク

決定木回帰の基礎と実装

決定木回帰(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)

このコードでは、Xsin(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_depthmin_samples_splitなどのパラメータを調整して、木のサイズを制限することが重要です。
  • データのバランス: データが不均衡な場合、決定木が一部のデータに偏った分割を行うことがあるため、事前にデータのバランスを確認しておくと良いでしょう。
  • 他のアンサンブル手法との併用: ランダムフォレストや勾配ブースティングといったアンサンブル手法と組み合わせることで、決定木回帰の弱点を補完することができます。

まとめ

決定木回帰は、非線形なデータにも対応可能な強力なアルゴリズムですが、深さの制限をしないと過学習しやすくなるため注意が必要です。scikit-learnを使って簡単に実装でき、視覚的にも理解しやすいので、データ分析の入門に適しています。