线性回归的主要问题是对异常值敏感。在真实世界的数据收集过程中,经常会遇到错误的度量结果。而线性回归使用的普通最小二乘法,其目标的使平方误差最小化。这时,由于异常值误差的绝对值很大,因此会引起问题,从而破坏整个模型。
先看下面的图。
从上图可以看到,有两个数据点是异常值,但是这个模型需要拟合所有的数据点,因此导致整个模型都错了。如果去除两个异常值,可以得到下图实线的拟合曲线。
普通最小二乘法在建模时会考虑每个数据点的影响,因此,最终模型会像上图实线那样。很显然,这个模型不是最优的。为了避免这个问题,我们引入正则化的系数作为阈值来消除异常值的影响。这个方法被称为岭回归。
接下来,我们使用python建立岭回归器。
我们先准备好一份数据文件data_singlevar.txt,相关数据文件可到https://github.com/windform/Python-Machine-Learning-Cookbook/blob/master/Chapter01/data_multivar.txt这个地址下载。
(1)加载导入数据。
#加载、导入数据
import sys
import numpy as np
filename = 'data_multivar.txt'
x = []
y = []
with open(filename, 'r') as f:
for line in f.readlines():
data = [float(i) for i in line.split(',')]
xt, yt = data[:-1], data[-1]
x.append(xt)
y.append(yt)
(2)把数据分成训练数据集与测试数据集。
num_training = int(0.8 * len(x))
num_test = len(x) - num_training
# 训练数据
x_train = np.array(x[:num_training])
y_train = np.array(y[:num_training])
# 测试数据
x_test = np.array(x[num_training:])
y_test = np.array(y[num_training:])
(3)创建一个岭回归分类器.
from sklearn import linear_model
ridge_regressor = linear_model.Ridge(alpha=0.01,fit_intercept = True, max_iter=1000)
其中,alpha参数控制回归器的复杂程度。当alpha趋于0时,岭回归器就是用普通最小二乘法的线性回归器。
(4)训练岭回归器。
ridge_regressor.fit(x_train,y_train)
(5)预测并检验回归的正确性。
y_test_pred_ridge = ridge_regressor.predict(x_test)
#计算回归准确性
import sklearn.metrics as sm
#计算平均绝对误差
print ("Mean absolute error=", round(sm.mean_absolute_error(y_test,y_test_pred_ridge),2))
#计算均方误差
print ("Mean squared error=", round(sm.mean_squared_error(y_test,y_test_pred_ridge),2))
#计算中位数绝对误差
print ("Median absolute error=", round(sm.median_absolute_error(y_test,y_test_pred_ridge),2))
#计算解释方差分
print ("Explained variance error=", round(sm.explained_variance_score(y_test,y_test_pred_ridge),2))
#计算R方得分
print ("R2 score error=", round(sm.r2_score(y_test,y_test_pred_ridge),2))
输出结果如下:
('Mean absolute error=', 3.95)
('Mean squared error=', 23.15)
('Median absolute error=', 3.69)
('Explained variance error=', 0.84)
('R2 score error=', 0.83)