之前的文章中,我们介绍了最小二乘法求解多元线性回归问题,最后一步中我们需要左乘一个矩阵的逆矩阵,而逆矩阵存在充分必要条件,是特征矩阵不存在多重共线性,也就是特征矩阵必须是满秩矩阵。
反之,如果存在精确相关关系,则线性回归无法求出结果。另外,如果不是完全相关,但存在高度相关关系,得到的逆很大,也会影响参数向量的求解。为了修复这一漏洞,就派生出了岭回归和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
- 上一篇:
- 数据结构之二叉搜索树
- 下一篇:
- 贪心算法与找零问题