New Question:
如何在存在有损数据(异常值或错误)的情况下拟合回归模型?
Answer:
scikit-learn提供了3种稳健性回归估计方法:
1.随机抽样一致性算法(RANSAC)
2.泰森回归(Theil Sen)
3.Huber回归
RANSAC(Random Sample Consensus)算法:
步骤:
1)从原始数据中随机选择一些样本作为“内点”;
2)从1中选择的样本拟合模型;
3)利用模型计算其他样本的残差,若某个样本残差小于预先设置的阈值t。则将其加入内点,将内点中的样本量扩充;
4)用扩充后的内点拟合模型,计算均方误差;
5)重复1-4步,最终选取均方误差最小的模型。
下图给出了具体方法:
具体参数:
base_estimator:用于线性回归模型选择,默认None(LinearRegression())
min_samples:从原始数据随机选择的最小样本数
residual_threshold:被归为内点数据的最大残差
max_trails:随机样本选择的最大迭代次数
stop_n_inliers:停止迭代的内点数目阈值
stop_score:停止迭代的得分阈值
loss:每个样本的损失计算方法,默认为“absolute_loss”(绝对损失),还可选择“squared_loss”(平方和损失)
属性:
estimator:返回base_estimator中的最佳拟合模型
inlier_mask:标记数据是否为内点
构建模拟数据集利用稳健性回归预测:
import numpy as np from sklearn import datasets #模拟数据集 n_samples = 2000 n_outliers = 200 #创建用于一元回归的数据 X,Y,coef = datasets.make_regression(n_samples = n_samples, n_features = 1, n_informative = 1, noise = 20, random_state = 1, coef = True) #添加噪音数据 X[:n_outliers] = 3+0.5 * np.random.normal(size = (n_outliers , 1)) Y[:n_outliers] = 3+np.random.normal(size=n_outliers) #应用线性回归和RANSAC做回归 from sklearn.linear_model import LinearRegression , RANSACRegressor lr = LinearRegression() lr.fit(X,Y) RAN = RANSACRegressor() RAN.fit(X,Y) inlier = RAN.inlier_mask_ outlier = np.logical_not(inlier) #回归结果 line_X = np.arange(X.min(),X.max())[:,np.newaxis] lr_y = lr.predict(line_X) RAN_Y = RAN.predict(line_X) #做出线性回归和RANSAC回归的图像 import matplotlib.pyplot as plt plt.scatter(X[inlier],Y[inlier],color = 'yellowgreen', marker = '.', label = 'Inliers') plt.scatter(X[outlier],Y[outlier],color = 'gold', marker = '.', label = 'Outliers') plt.plot(line_X,lr_y, color = 'navy', marker = '.', label = 'Linear regressor') plt.plot(line_X,RAN_Y,color = 'cornflowerblue', linewidth = 2, label = 'RANSACregressor')
得到结果:
深蓝色线代表构建的线性回归模型,浅蓝色线构建的是稳健性回归(RANdom SAmple Consensus)模型;
可以看见,稳健性回归不受黄色数据点(离群点)影响,而线性回归受离群点影响较大。