Huber回归与岭回归比较

在机器学习中,回归分析是一种预测连续数值的方法。在实际应用中,经常会遇到含有异常值的数据集。异常值对回归模型的影响很大,尤其是对基于最小二乘法的模型,如岭回归Huber回归是一种鲁棒性回归方法,它对异常值的敏感度较低。本文将通过一个包含异常值的数据集,展示Huber回归和岭回归在预测时的不同表现。

数据集的生成

首先,使用make_regression函数生成一个简单的回归数据集。然后,人为地向数据集中添加了几个异常值。这些异常值的添加是为了模拟在实际应用中可能遇到的情况,从而比较两种回归方法在异常值存在时的表现。

Huber回归

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()
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485