在机器学习中,回归分析是一种预测连续数值的方法。在实际应用中,经常会遇到含有异常值的数据集。异常值对回归模型的影响很大,尤其是对基于最小二乘法的模型,如岭回归。Huber回归是一种鲁棒性回归方法,它对异常值的敏感度较低。本文将通过一个包含异常值的数据集,展示Huber回归和岭回归在预测时的不同表现。
首先,使用make_regression
函数生成一个简单的回归数据集。然后,人为地向数据集中添加了几个异常值。这些异常值的添加是为了模拟在实际应用中可能遇到的情况,从而比较两种回归方法在异常值存在时的表现。
Huber回归是一种鲁棒的回归方法,它在处理异常值时表现出较好的稳定性。Huber回归通过调整损失函数,减少了异常值对模型的影响。随着参数epsilon
的增加,Huber回归的决策函数逐渐接近岭回归。
岭回归是一种常用的回归方法,通过引入正则化项来防止模型过拟合。然而,岭回归对异常值非常敏感,因为异常值会显著影响最小二乘法的优化过程。
在本例中,比较了Huber回归和岭回归在相同数据集上的表现。通过调整Huber回归的epsilon
参数,可以观察到随着epsilon
的增加,Huber回归的预测结果逐渐接近岭回归。这表明Huber回归在处理异常值时具有较好的鲁棒性,而岭回归则容易受到异常值的影响。
以下是使用Python和scikit-learn库实现Huber回归和岭回归比较的代码。代码中首先生成了包含异常值的数据集,然后分别使用Huber回归和岭回归对数据集进行拟合,并绘制了预测结果的对比图。
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回归
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_
plt.plot(x, coef_ridge * x + ridge.intercept_, "g-", label="ridge regression")
plt.title("Comparison of HuberRegressor vs Ridge")
plt.xlabel("X")
plt.ylabel("y")
plt.legend(loc=0)
plt.show()