绘制 Huber 与 Ridge 对比图

Machine LearningMachine LearningBeginner
立即练习

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

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将在一个存在强异常值的数据集上比较两种回归模型HuberRegressor和Ridge的性能。我们将生成一个玩具数据集,向其中添加强异常值,然后将这两种模型都拟合到该数据集上。我们将可视化结果并比较模型的性能。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到笔记本标签页以访问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个样本、一个特征且随机种子为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
)

向数据集中添加强异常值

我们将向数据集中添加四个强异常值。我们将使用正态分布为这些异常值生成随机值。然后,我们会将这些异常值添加到数据集中。

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 regression)的决策函数。

## 定义epsilon值的范围
epsilon_values = [1, 1.5, 1.75, 1.9]

## 定义用于绘图的x值
x = np.linspace(X.min(), X.max(), 7)

## 定义用于绘图的颜色
colors = ["r-", "b-", "y-", "m-"]

## 在一系列epsilon值上拟合Huber回归器。
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)

## 给图添加图例
plt.legend(loc=0)

## 显示图形
plt.title("HuberRegressor with Different Epsilon Values")
plt.xlabel("X")
plt.ylabel("y")
plt.show()

拟合岭回归器

我们现在将把岭回归器(Ridge regressor)拟合到数据集上,并将其性能与HuberRegressor的性能进行比较。

## 拟合一个岭回归器以与Huber回归器进行比较。
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")

## 给图添加图例
plt.legend(loc=0)

## 显示图形
plt.title("Comparison of HuberRegressor vs Ridge")
plt.xlabel("X")
plt.ylabel("y")
plt.show()

总结

在本实验中,我们在一个包含强异常值的数据集上比较了两种回归模型——HuberRegressor和Ridge的性能。我们生成了一个简单的数据集,向其中添加了强异常值,然后将这两种模型都拟合到该数据集上。我们对结果进行了可视化,并比较了模型的性能。我们观察到,HuberRegressor比Ridge回归器受异常值的影响更小,并且随着epsilon值的增加,HuberRegressor的决策函数趋近于Ridge回归器的决策函数。