在统计学中,回归分析是一种预测或估计因变量与一个或多个自变量之间关系的方法。在实际应用中,数据往往包含异常值,这些异常值会对传统的最小二乘法(OLS)估计器造成较大影响。为了解决这一问题,研究者们提出了多种稳健的回归估计方法,其中Theil-Sen估计器因其对异常值的鲁棒性而受到关注。
Theil-Sen估计器的核心思想是通过计算所有可能的样本点组合的斜率和截距,然后取这些斜率和截距的空间中位数作为最终的估计值。这种方法在简单线性回归中对异常值的容忍度可以达到29.3%,意味着在二维情况下,即使有高达29.3%的数据被任意破坏(即异常值),Theil-Sen估计器仍然能够保持较好的估计性能。
与OLS估计器相比,Theil-Sen估计器在处理异常值方面具有明显优势。例如,在某些情况下,当异常值主要影响x轴时,RANSAC估计器的性能会受到干扰。虽然通过调整RANSAC的残差阈值参数可以缓解这一问题,但通常需要对数据和异常值的性质有一定的了解。
由于Theil-Sen估计器的计算复杂度较高,建议仅在样本数量和特征数量较少的情况下使用。对于较大的问题,可以通过设置max_subpopulation参数来限制所有可能的样本点组合的数量,从而减少运行时间。但这样做的代价是可能会损失一些数学性质,因为此时Theil-Sen估计器实际上是在随机子集上工作的。
以下是一个使用Python实现的示例,比较了OLS、Theil-Sen和RANSAC三种估计器在处理包含异常值的数据时的性能。
import time
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression, RANSACRegressor, TheilSenRegressor
# 定义估计器
estimators = [
("OLS", LinearRegression()),
("Theil-Sen", TheilSenRegressor(random_state=42)),
("RANSAC", RANSACRegressor(random_state=42)),
]
colors = {
"OLS": "turquoise",
"Theil-Sen": "gold",
"RANSAC": "lightgreen"
}
lw = 2
# 生成数据
np.random.seed(0)
n_samples = 200
x = np.random.randn(n_samples)
w = 3.0
c = 2.0
noise = 0.1 * np.random.randn(n_samples)
y = w * x + c + noise
# 添加异常值
y[-20:] += -20 * x[-20:]
X = x[:, np.newaxis]
# 绘制散点图和回归线
plt.scatter(x, y, color="indigo", marker="x", s=40)
line_x = np.array([-3, 3])
for name, estimator in estimators:
t0 = time.time()
estimator.fit(X, y)
elapsed_time = time.time() - t0
y_pred = estimator.predict(line_x.reshape(2, 1))
plt.plot(line_x, y_pred, color=colors[name], linewidth=lw, label="%s (fit time: %.2f s)" % (name, elapsed_time))
plt.axis("tight")
plt.legend(loc="upper left")
plt.title("Corrupt y")
plt.show()
在上述代码中,首先生成了一组包含异常值的数据,并使用三种不同的估计器进行拟合。然后,绘制了数据的散点图以及每种估计器拟合的回归线。通过比较这些回归线,可以直观地看到不同估计器在处理异常值时的性能差异。