はじめに
この実験では、決定木を使ったマルチ出力回帰の例を通して説明します。単一の潜在的な特徴量が与えられた場合、決定木がどのように円のノイジーな x と y の観測値を同時に予測するかを見ることができます。その結果、円を近似する局所的な線形回帰を学習します。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終了するまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
ライブラリのインポート
このステップでは、必要なライブラリをインポートします。それは numpy、matplotlib.pyplot、および sklearn.tree からの DecisionTreeRegressor です。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
ランダムなデータセットの作成
このステップでは、ランダムなデータセットを作成します。0 から 200 までのランダムな値を持つ 100 要素のソート済み配列を作成するためにnumpyライブラリを使用し、その後、各要素から 100 を引きます。次に、numpyを使って各要素のサインとコサインを計算し、これらの配列を形状 (100, 2) の 2 次元配列に結合してy配列を作成します。また、5 番目の要素にランダムノイズを追加します。
## Create a random dataset
rng = np.random.RandomState(1)
X = np.sort(200 * rng.rand(100, 1) - 100, axis=0)
y = np.array([np.pi * np.sin(X).ravel(), np.pi * np.cos(X).ravel()]).T
y[::5, :] += 0.5 - rng.rand(20, 2)
回帰モデルの適合
このステップでは、回帰モデルを適合させます。異なる最大深さで 3 つの異なるモデルを適合させるために、sklearn.tree からのDecisionTreeRegressorを使用します。
## Fit regression model
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_3 = DecisionTreeRegressor(max_depth=8)
regr_1.fit(X, y)
regr_2.fit(X, y)
regr_3.fit(X, y)
予測
このステップでは、前のステップで作成したモデルを使って予測を行います。-100 から 100 までの間隔 0.01 の新しい値の配列をnp.arangeを使って作成し、その後、モデルのpredictメソッドを使って出力を予測します。
## Predict
X_test = np.arange(-100.0, 100.0, 0.01)[:, np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)
y_3 = regr_3.predict(X_test)
結果をプロットする
このステップでは、結果をプロットします。元のデータと 3 つのモデル予測それぞれの散布図を作成するためにmatplotlib.pyplotを使用します。また、プロットにラベルとタイトルも追加します。
## Plot the results
plt.figure()
s = 25
plt.scatter(y[:, 0], y[:, 1], c="navy", s=s, edgecolor="black", label="data")
plt.scatter(
y_1[:, 0],
y_1[:, 1],
c="cornflowerblue",
s=s,
edgecolor="black",
label="max_depth=2",
)
plt.scatter(y_2[:, 0], y_2[:, 1], c="red", s=s, edgecolor="black", label="max_depth=5")
plt.scatter(
y_3[:, 0], y_3[:, 1], c="orange", s=s, edgecolor="black", label="max_depth=8"
)
plt.xlim([-6, 6])
plt.ylim([-6, 6])
plt.xlabel("target 1")
plt.ylabel("target 2")
plt.title("Multi-output Decision Tree Regression")
plt.legend(loc="best")
plt.show()
まとめ
この実験では、多出力回帰における決定木の使い方を学びました。ランダムなデータセットを作成し、回帰モデルを適合させ、予測を行い、結果をプロットしました。決定木は、円を近似する局所的な線形回帰を学習しました。また、木の最大深さを設定が高すぎる場合、決定木は訓練データの細かすぎる詳細を学習し、ノイズから学習してしまい、すなわち過学習してしまうこともわかりました。