之前的文章中,我们介绍了最小二乘法求解多元线性回归问题,最后一步中我们需要左乘一个矩阵的逆矩阵,而逆矩阵存在充分必要条件,是特征矩阵不存在多重共线性,也就是特征矩阵必须是满秩矩阵

反之,如果存在精确相关关系,则线性回归无法求出结果。另外,如果不是完全相关,但存在高度相关关系,得到的逆很大,也会影响参数向量的求解。为了修复这一漏洞,就派生出了岭回归和Lasso。本文先介绍第一种,岭回归。

岭回归,就是在线性回归的损失函数上加上了L2范式的正则项,可以通过对正则化系数alpha进行调节,保证最小二乘法有解,Sklearn中也有专门的类,来建立岭回归模型。

代码示例

1、导入数据集

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split

ds = load_boston()
x = ds.data
y = ds.target

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)

2、岭回归建模

from sklearn.linear_model import Ridge

reg = Ridge(random_state=0)
reg.fit(x_train, y_train)
print(reg.score(x_test, y_test)) #0.666

相比之前直接用线性回归求解r2值,岭回归反而降低了,这说明这个波斯顿房价数据集并没有共线性问题,岭回归并不能提升模型表现。

3、学习曲线调参

当然岭回归中alpha参数时可以调整的,所以我们还是用学习曲线来尝试调整参数,看模型表现是否能提升。

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

score_r = []
score_l = []
for i in range(1, 300):
    ridge = Ridge(alpha=i, random_state=1)
    score = cross_val_score(ridge, x, y, cv=10).mean() 
    score_r.append(score)
    # 线性模型对比(不会有变化,放到循环外亦可)
    linear = LinearRegression()
    score = cross_val_score(linear, x, y, cv=10).mean()
    score_l.append(score)

plt.plot(range(1,300), score_r, label='ridge model')
plt.plot(range(1,300), score_l, label='linear model')
plt.legend()
plt.show()

本文为 陈华 原创,欢迎转载,但请注明出处:http://ichenhua.cn/read/293