鲁棒性拟合方法比较

在数据分析和机器学习中,鲁棒性拟合是一种重要的技术,它可以帮助处理数据中的异常值,提高模型的准确性和稳定性。本文将介绍几种常用的鲁棒性拟合方法,并在不同情况下进行比较。

无测量误差,仅模型误差

在这种情况下,尝试使用多项式来拟合正弦函数。由于没有测量误差,期望模型能够很好地捕捉数据的真实趋势。

X方向的测量误差

当X方向存在测量误差时,模型需要能够抵抗这些误差的影响。可以通过引入一些随机噪声来模拟这种情况,并观察不同拟合方法的表现。

Y方向的测量误差

与X方向的测量误差类似,Y方向的测量误差也会对模型的拟合效果产生影响。在这种情况下,需要评估模型对于Y方向异常值的鲁棒性。

预测质量评估

为了评估不同拟合方法的预测质量,使用中位数绝对偏差(MAD)作为衡量标准。MAD能够较好地反映模型对于非污染数据的预测准确性。

方法比较

通过比较RANSAC、Theil-Sen估计器Huber回归等方法,发现:

  • RANSAC算法对于Y方向的强异常值有很好的鲁棒性。
  • Theil-Sen估计器对于X和Y方向的小异常值都有很好的鲁棒性,但在某个阈值以上,其性能会劣于普通最小二乘法(OLS)。
  • Huber回归的评分不能直接与Theil-Sen和RANSAC进行比较,因为它并不试图完全过滤异常值,而是减轻它们的影响。

代码实现

以下是使用Python和scikit-learn库实现上述鲁棒性拟合方法的示例代码。

import numpy as np from matplotlib import pyplot as plt from sklearn.linear_model import HuberRegressor, LinearRegression, RANSACRegressor, TheilSenRegressor from sklearn.metrics import mean_squared_error from sklearn.pipeline import make_pipeline from sklearn.preprocessing import PolynomialFeatures np.random.seed(42) X = np.random.normal(size=400) y = np.sin(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 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 x_plot = np.linspace(X.min(), X.max()) for title, this_X, this_y in [ ("Modeling Errors Only", X, y), ("Corrupt X, Small Deviants", X_errors, y), ("Corrupt y, Small Deviants", X, y_errors), ("Corrupt X, Large Deviants", X_errors_large, y), ("Corrupt y, Large Deviants", 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: error = %.3f" % (name, mse)) legend_title = "Error of Mean\nAbsolute Deviation\nto Non-corrupt Data" 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()

运行时间

  • Theil-Sen回归
  • 使用RANSAC的鲁棒线性模型估计
  • 比较线性贝叶斯回归器
  • 逻辑函数
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485