在数据分析和机器学习领域,回归模型的选择对于预测结果的准确性至关重要。本文通过一个生成的回归数据集,探讨了Huber回归和岭回归在面对数据集中的异常值时的不同表现。特别地,关注了Huber回归中参数epsilon的变化对模型预测的影响。
首先,生成了一个包含20个样本和1个特征的回归数据集,并人为添加了四个异常值。这些异常值的添加是为了模拟现实世界中数据的不完美性,以及测试不同回归模型对异常值的鲁棒性。
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_regression
from sklearn.linear_model import HuberRegressor, Ridge
# 生成示例数据
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))
plt.plot(X, y, "b.")
接下来,使用Huber回归模型对数据集进行拟合,并观察了不同epsilon值下模型的表现。Huber回归是一种鲁棒的线性回归方法,它在异常值存在时比传统的岭回归更加稳定。随着epsilon值的增加,Huber回归的决策函数逐渐接近岭回归。
# 为Huber回归设置一系列epsilon值
colors = ["r-", "b-", "y-", "m-"]
x = np.linspace(X.min(), X.max(), 7)
epsilon_values = [1, 1.5, 1.75, 1.9]
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)
# 拟合岭回归模型以进行比较
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.title("HuberRegressor与Ridge回归的比较")
plt.xlabel("X")
plt.ylabel("y")
plt.legend(loc=0)
plt.show()
通过上述代码,可以看到,在存在异常值的情况下,Huber回归模型的预测结果受到的影响较小,而岭回归模型则对异常值更加敏感。随着Huber回归中epsilon参数的增加,其预测结果逐渐接近岭回归,这表明epsilon参数在调节模型对异常值的敏感度方面起到了关键作用。
总的来说,Huber回归和岭回归都是处理线性回归问题的有效工具,但在面对数据中的异常值时,Huber回归因其鲁棒性而表现出更好的性能。选择合适的回归模型需要根据数据的特点和分析目标来决定。