稳健线性模型估计

Beginner

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

简介

在本实验中,我们将演示如何使用 scikit-learn 中的 RANSAC 算法将线性模型稳健地拟合到有缺陷的数据上。普通线性回归器对异常值很敏感,拟合线很容易偏离数据的真实潜在关系。RANSAC 回归器会自动将数据分为内点和外点,并且拟合线仅由识别出的内点确定。我们将使用 scikit-learn 中的 make_regression 数据集生成带有异常值的随机数据,然后将线性模型和 RANSAC 回归器都拟合到该数据上。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。

导入库并生成数据

我们将导入必要的库,使用 make_regression 数据集生成随机数据,并向数据中添加异常值。

import numpy as np
from matplotlib import pyplot as plt
from sklearn import linear_model, datasets

## 生成数据
n_samples = 1000
n_outliers = 50

X, y, coef = datasets.make_regression(
    n_samples=n_samples,
    n_features=1,
    n_informative=1,
    noise=10,
    coef=True,
    random_state=0,
)

## 添加异常值数据
np.random.seed(0)
X[:n_outliers] = 3 + 0.5 * np.random.normal(size=(n_outliers, 1))
y[:n_outliers] = -3 + 10 * np.random.normal(size=n_outliers)

拟合线性模型

我们将使用 scikit-learn 的 LinearRegression 类对数据拟合一个线性模型。

## 使用所有数据拟合直线
lr = linear_model.LinearRegression()
lr.fit(X, y)

拟合 RANSAC 回归器

我们将使用 scikit-learn 的 RANSACRegressor 类对数据拟合一个 RANSAC 回归器。

## 使用 RANSAC 算法稳健地拟合线性模型
ransac = linear_model.RANSACRegressor()
ransac.fit(X, y)
内点掩码 = ransac.inlier_mask_
外点掩码 = np.logical_not(内点掩码)

预测估计模型的数据

我们将预测线性模型和 RANSAC 回归器的数据,并比较它们的结果。

## 预测估计模型的数据
line_X = np.arange(X.min(), X.max())[:, np.newaxis]
line_y = lr.predict(line_X)
line_y_ransac = ransac.predict(line_X)

比较估计系数

我们将比较真实模型、线性模型和 RANSAC 回归器的估计系数。

## 比较估计系数
print("估计系数 (真实、线性回归、RANSAC):")
print(coef, lr.coef_, ransac.estimator_.coef_)

可视化结果

我们将绘制数据以及线性模型和 RANSAC 回归器的拟合线。

## 可视化结果
lw = 2
plt.scatter(
    X[内点掩码], y[内点掩码], color="yellowgreen", marker=".", label="内点"
)
plt.scatter(
    X[外点掩码], y[外点掩码], color="gold", marker=".", label="外点"
)
plt.plot(line_X, line_y, color="navy", linewidth=lw, label="线性回归器")
plt.plot(
    line_X,
    line_y_ransac,
    color="cornflowerblue",
    linewidth=lw,
    label="RANSAC 回归器"
)
plt.legend(loc="lower right")
plt.xlabel("输入")
plt.ylabel("响应")
plt.show()

总结

在本实验中,我们展示了如何使用 scikit-learn 中的 RANSAC 算法将线性模型稳健地拟合到有缺陷的数据上。我们使用 make_regression 数据集生成随机数据,向数据中添加异常值,将线性模型和 RANSAC 回归器都拟合到数据上,预测两个模型的数据,比较它们的估计系数,并可视化结果。RANSAC 回归器会自动将数据分为内点和外点,并且拟合线仅由识别出的内点确定,这使得它成为一种将模型拟合到含有异常值的数据的更稳健方法。