Huber と Ridge の比較プロット

Machine LearningMachine LearningBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、強いアウトライアーが含まれるデータセットに対して、2 つの回帰モデルである HuberRegressor と Ridge の性能を比較します。まず、toy データセットを生成し、そこに強いアウトライアーを追加した後、両モデルをこのデータセットに適合させます。結果を可視化し、モデルの性能を比較します。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。

Jupyter Notebook の読み込みには数秒かかる場合があります。Jupyter Notebook の制限により、操作の検証は自動化できません。

学習中に問題がある場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/linear_model("Linear Models") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/linear_model -.-> lab-49160{{"Huber と Ridge の比較プロット"}} sklearn/datasets -.-> lab-49160{{"Huber と Ridge の比較プロット"}} ml/sklearn -.-> lab-49160{{"Huber と Ridge の比較プロット"}} end

必要なライブラリをインポートする

まず、必要なライブラリをインポートします。データ操作と可視化に 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 回帰器のものに近づくことが観察されました。