简介
在本实验中,我们将学习如何使用 Python 的 scikit-learn 库来执行稳健的线性估计器拟合。我们将用 3 阶多项式拟合接近零值的正弦函数,并在不同情况下演示稳健拟合。我们将使用中位数绝对偏差对未受干扰的新数据进行判断预测质量。
虚拟机提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。
导入所需库并生成数据
我们首先需要导入必要的库,并生成用于拟合的数据。我们将生成一个带有一些噪声的正弦函数,并通过在 X 和 y 中引入误差来破坏数据。
from matplotlib import pyplot as plt
import numpy as np
from sklearn.linear_model import (
LinearRegression,
TheilSenRegressor,
RANSACRegressor,
HuberRegressor,
)
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
np.random.seed(42)
X = np.random.normal(size=400)
y = np.sin(X)
## 确保 X 是二维的
X = X[:, np.newaxis]
X_test = np.random.normal(size=200)
y_test = np.sin(X_test)
X_test = X_test[:, np.newaxis]
y_errors = y.copy()
y_errors[::3] = 3
X_errors = X.copy()
X_errors[::3] = 3
y_errors_large = y.copy()
y_errors_large[::3] = 10
X_errors_large = X.copy()
X_errors_large[::3] = 10
用 3 阶多项式拟合正弦函数
我们将用 3 阶多项式对接近零的值拟合一个正弦函数。
x_plot = np.linspace(X.min(), X.max())
在不同情况下演示稳健拟合
我们现在将使用四种不同的估计器:普通最小二乘法(OLS)、泰尔 - 森估计器(Theil - Sen)、随机抽样一致性算法(RANSAC)和稳健回归估计器(HuberRegressor),在不同情况下演示稳健拟合。
estimators = [
("OLS", LinearRegression()),
("Theil-Sen", TheilSenRegressor(random_state=42)),
("RANSAC", RANSACRegressor(random_state=42)),
("HuberRegressor", HuberRegressor()),
]
colors = {
"OLS": "turquoise",
"Theil-Sen": "gold",
"RANSAC": "lightgreen",
"HuberRegressor": "black",
}
linestyle = {"OLS": "-", "Theil-Sen": "-.", "RANSAC": "--", "HuberRegressor": "--"}
lw = 3
绘制结果
我们现在将绘制每种不同情况的结果。
for title, this_X, this_y in [
("仅建模误差", X, y),
("X 数据损坏,小偏差", X_errors, y),
("y 数据损坏,小偏差", X, y_errors),
("X 数据损坏,大偏差", X_errors_large, y),
("y 数据损坏,大偏差", X, y_errors_large),
]:
plt.figure(figsize=(5, 4))
plt.plot(this_X[:, 0], this_y, "b+")
for name, estimator in estimators:
model = make_pipeline(PolynomialFeatures(3), estimator)
model.fit(this_X, this_y)
mse = mean_squared_error(model.predict(X_test), y_test)
y_plot = model.predict(x_plot[:, np.newaxis])
plt.plot(
x_plot,
y_plot,
color=colors[name],
linestyle=linestyle[name],
linewidth=lw,
label="%s: 误差 = %.3f" % (name, mse),
)
legend_title = "与未损坏数据的\n中位数绝对偏差误差"
legend = plt.legend(
loc="upper right", frameon=False, title=legend_title, prop=dict(size="x-small")
)
plt.xlim(-4, 10.2)
plt.ylim(-2, 10.2)
plt.title(title)
plt.show()
总结
在本实验中,我们学习了如何使用 Python 的 scikit-learn 库来执行稳健线性估计器拟合。我们对接近零的值用 3 阶多项式拟合了一个正弦函数,并在不同情况下演示了稳健拟合。我们使用与未损坏新数据的中位数绝对偏差来判断预测质量。