はじめに
この実験では、強いアウトライアーが含まれるデータセットに対して、2 つの回帰モデルである HuberRegressor と Ridge の性能を比較します。まず、toy データセットを生成し、そこに強いアウトライアーを追加した後、両モデルをこのデータセットに適合させます。結果を可視化し、モデルの性能を比較します。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
Jupyter Notebook の読み込みには数秒かかる場合があります。Jupyter Notebook の制限により、操作の検証は自動化できません。
学習中に問題がある場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
必要なライブラリをインポートする
まず、必要なライブラリをインポートします。データ操作と可視化に numpy と matplotlib を、回帰モデリングに scikit-learn からの HuberRegressor と Ridge を使用します。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
from sklearn.linear_model import HuberRegressor, Ridge
疑似データを生成する
ここでは、scikit-learn の make_regression 関数を使って疑似データセットを生成します。20 個のサンプル、1 つの特徴量、乱数シード 0 を持つデータセットを生成します。また、データセットにいくらかのノイズを加えます。
rng = np.random.RandomState(0)
X, y = make_regression(
n_samples=20, n_features=1, random_state=0, noise=4.0, bias=100.0
)
データセットに強いアウトライアーを追加する
データセットに 4 つの強いアウトライアーを追加します。これらのアウトライアーについては、正規分布を使って乱数値を生成します。その後、これらのアウトライアーをデータセットに追加します。
X_outliers = rng.normal(0, 0.5, size=(4, 1))
y_outliers = rng.normal(0, 2.0, size=4)
X_outliers[:2, :] += X.max() + X.mean() / 4.0
X_outliers[2:, :] += X.min() - X.mean() / 4.0
y_outliers[:2] += y.min() - y.mean() / 4.0
y_outliers[2:] += y.max() + y.mean() / 4.0
X = np.vstack((X, X_outliers))
y = np.concatenate((y, y_outliers))
データセットを可視化する
ここでは、matplotlib を使ってデータセットを可視化します。X の値に対して y の値をプロットします。
plt.plot(X, y, "b.")
plt.title("Dataset with Strong Outliers")
plt.xlabel("X")
plt.ylabel("y")
plt.show()
Huber 回帰器をフィットさせる
ここでは、HuberRegressor をデータセットにフィットさせます。epsilon の値の範囲でモデルをフィットさせて、epsilon の値が増加するにつれて決定関数が Ridge 回帰のものにどのように近づくかを示します。
## Define the range of values for epsilon
epsilon_values = [1, 1.5, 1.75, 1.9]
## Define the x values for plotting
x = np.linspace(X.min(), X.max(), 7)
## Define the colors for plotting
colors = ["r-", "b-", "y-", "m-"]
## Fit the huber regressor over a series of epsilon values.
for k, epsilon in enumerate(epsilon_values):
huber = HuberRegressor(alpha=0.0, epsilon=epsilon)
huber.fit(X, y)
coef_ = huber.coef_ * x + huber.intercept_
plt.plot(x, coef_, colors[k], label="huber loss, %s" % epsilon)
## Add a legend to the plot
plt.legend(loc=0)
## Show the plot
plt.title("HuberRegressor with Different Epsilon Values")
plt.xlabel("X")
plt.ylabel("y")
plt.show()
Ridge 回帰器をフィットさせる
ここでは、Ridge 回帰器をデータセットにフィットさせ、その性能を HuberRegressor の性能と比較します。
## Fit a ridge regressor to compare it to huber regressor.
ridge = Ridge(alpha=0.0, random_state=0)
ridge.fit(X, y)
coef_ridge = ridge.coef_
coef_ = ridge.coef_ * x + ridge.intercept_
plt.plot(x, coef_, "g-", label="ridge regression")
## Add a legend to the plot
plt.legend(loc=0)
## Show the plot
plt.title("Comparison of HuberRegressor vs Ridge")
plt.xlabel("X")
plt.ylabel("y")
plt.show()
まとめ
この実験では、強いアウトライアーが含まれるデータセットに対して、2 つの回帰モデルである HuberRegressor と Ridge の性能を比較しました。単純なデータセットを生成し、そこに強いアウトライアーを追加し、その後両方のモデルをデータセットにフィットさせました。結果を可視化し、モデルの性能を比較しました。その結果、HuberRegressor は Ridge 回帰器よりもアウトライアーの影響を受けにくく、epsilon の値が増加するにつれて、HuberRegressor の決定関数が Ridge 回帰器のものに近づくことが観察されました。