岭回归详解 从零开始 从理论到实践

  • 一、岭回归的理解
    • 1.1、LinearRegression的回顾
    • 1.2、岭回归 - Ridge Regression
  • 二、sklearn的使用
    • 2.1、方法、参数与属性
      • 2.1.1、特征标准化 - StandardScaler
      • 2.1.2、岭回归 - Ridge
      • 2.1.3、内置交叉验证岭回归 - RidgeCV
    • 2.2、实例应用
      • 2.2、简单案例
      • 2.3、多个超参数的设定 -RidgeCV
      • 2.4、多项式回归+岭回归案例

一、岭回归的理解

1.1、LinearRegression的回顾

在标准线性回归中,通过最小化真实值(yiy_iyi​)和预测值(y^i\hat y_iy^​i​)的平方误差来训练模型,这个平方误差值也被称为残差平方和(RSS, Residual Sum Of Squares):
RSS=∑i=1n(yi−y^i)2RSS=\sum^n_{i=1}(y_i-\hat y_i)^2RSS=i=1∑n​(yi​−y^​i​)2
最小二乘法即最小化残差平方和,为:
Jβ(β)=arg min⁡β∑i=1p(yi−xiβi−β0)2J_{\beta}(\beta)=\argmin_\beta \sum^p_{i=1}(y_i-x_i\beta_i-\beta_0)^2Jβ​(β)=βargmin​i=1∑p​(yi​−xi​βi​−β0​)2

将其化为矩阵形式:
Jβ(β)=arg min⁡β(y−Xβ)T(y−Xβ)\begin{aligned} J_{\beta}(\beta)=\argmin_\beta (y-X\beta)^T(y-X\beta) \end{aligned}Jβ​(β)=βargmin​(y−Xβ)T(y−Xβ)​
求解为:
β=(XTX)XTy\beta=(X^TX)X^Tyβ=(XTX)XTy
由于求解 β\betaβ,需要假设 XTXX^TXXTX 为满秩矩阵。

然而现实任务中 XTXX^TXXTX 往往不是满秩矩阵或者某些列之间的线性相关性比较大,例如存在许多任务中,会出现变量数(属性数)远超过样例数,导致 XXX 的列数多于行数,XTXX^TXXTX 显然不满秩,即 XTXX^TXXTX 的行列式接近于0,即接近于奇异,此时计算是误差会很大,可解出多个 β\betaβ(有用的方程组数少于未知数的个数时,没有唯一解,即有无穷多个解),它们都能使均方误差最小化。即在多元回归中,特征之间会出现多重共线问题,使用最小二乘法估计系数会出现系数不稳定问题,缺乏稳定性和可靠性。

参考1 n阶行列式
参考2 岭回归

1.2、岭回归 - Ridge Regression

为了解决上述问题,我们需要将不适定问题转化为适定问题,在矩阵 XTXX^TXXTX 的对角线元素上加入一个小的常数值 λ\lambdaλ,然后取其逆求得系数:
β^ridge=(XTX+λIn)−1XTY\hat\beta_{ridge}=(X^TX+\lambda I_n)^{-1}X^TYβ^​ridge​=(XTX+λIn​)−1XTY

  • InI_nIn​ 是单位矩阵,对角线全是1,类似与“山岭
  • λ\lambdaλ 是岭系数,改变其数值可以改变单位矩阵对角线的值

随后,代价函数 Jβ(β)J_{\beta}(\beta)Jβ​(β) 在 RSSRSSRSS 的基础上加入了对系数值的惩罚,变为:
Jβ(β)=RSS+λ∑j=0nβj2=RSS+λ∣∣β∣∣2\begin{aligned} J_{\beta}(\beta)&=RSS+\lambda\sum^n_{j=0}\beta^2_j \\ &=RSS+\lambda||\beta||^2 \end{aligned}Jβ​(β)​=RSS+λj=0∑n​βj2​=RSS+λ∣∣β∣∣2​
矩阵形式为:
Jβ(β)=∑i=1p(yi−Xiβ)2+λ∑j=0nβj2=∑i=1p(yi−Xiβ)+λ∣∣β∣∣2\begin{aligned} J_{\beta}(\beta)&=\sum^p_{i=1}(y_i-X_i\beta)^2+\lambda\sum^n_{j=0}\beta^2_j \\ &=\sum^p_{i=1}(y_i-X_i\beta)+\lambda||\beta||^2 \end{aligned}Jβ​(β)​=i=1∑p​(yi​−Xi​β)2+λj=0∑n​βj2​=i=1∑p​(yi​−Xi​β)+λ∣∣β∣∣2​

  • βj\beta_jβj​是总计ppp个特征中第jjj个特征的系数
  • λ\lambdaλ是超参数,用来控制对 βj\beta_jβj​的惩罚强度,λ\lambdaλ值越大,生成的模型就越简单。λ\lambdaλ的理想值应该是像其他超参数一样通过调试获得的。在sklearn中,使用alpha参数来设置 λ\lambdaλ。
  • ∣∣β∣∣2||\beta||^2∣∣β∣∣2 为L2L2L2范数
  • λ∣∣β∣∣2\lambda||\beta||^2λ∣∣β∣∣2 为收缩惩罚项(shrinkage penalty),因为它试图“缩小”模型,减小线性回归模型的方差。它也称为正则化的 L2L2L2范数。

岭回归在估计系数 β\betaβ 时,设置了一个特定形式的约束,使得最终得到的系数的 L2L2L2 范数较小。

假设得到两个回归模型:
h1=x1+x2+x3+x4h_1=x_1+x_2+x_3+x_4h1​=x1​+x2​+x3​+x4​
h2=0.4x1+4x2+x3+x4h_2=0.4x_1+4x_2+x_3+x_4h2​=0.4x1​+4x2​+x3​+x4​
两个模型得到的残差平方和相同,但是
h1h_1h1​的惩罚项为4λ4\lambda4λ,h2h_2h2​的惩罚项为18.16λ18.16\lambda18.16λ
相比得出,岭回归更倾向于 h1h1h1

岭回归的特点:
岭回归是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数,它是更为符合实际、更可靠的回归方法,对存在离群点的数据的拟合要强于最小二乘法。

不同与线性回归的无偏估计,岭回归的优势在于它的无偏估计,更趋向于将部分系数向0收缩。因此,它可以缓解多重共线问题,以及过拟合问题。但是由于岭回归中并没有将系数收缩到0,而是使得系数整体变小,因此,某些时候模型的解释性会大大降低,也无法从根本上解决多重共线问题。

二、sklearn的使用

2.1、方法、参数与属性

2.1.1、特征标准化 - StandardScaler

学习算法的目标函数中使用的许多元素(例如支持向量机的RBF内核或线性模型的L1和L2正则化器)都假定所有特征都围绕0居中并且具有相同顺序的方差。

如果某个特征的方差比其他特征大几个数量级,则它可能会支配目标函数,并使估计器无法按预期从其他特征中正确学习。

class sklearn.preprocessing.StandardScaler(*, copy=True, with_mean=True, with_std=True)

模型类方法:

函数 说明 输入 返回
StandardScaler.fit_transform(X) 拟合数据,并转换它。转化成均值为0,方差为1分布的数组 数组X 数组

参考3 标准化官网
参考4

2.1.2、岭回归 - Ridge

带有 L2L2L2 正则化的最小二乘法

class sklearn.linear_model.Ridge(alpha=1.0, *, fit_intercept=True, normalize=False, copy_X=True, max_iter=None, tol=0.001, solver='auto', random_state=None)

模型对象的参数:

参数 取值 说明
alpha float, default=1.0 正则强度,必须是一个正浮点数。正则化改善了问题的条件,并减少了估计的方差。较大的值表示更强的正则化
fit_intercept bool, default=True 是否拟合该模型的截距。如果设置为false,则在计算中将不使用截距
normalize bool, default=False 归一化。fit_intercept设置为False时,将忽略此参数。如果为True,则将在回归之前通过减去均值并除以l2-范数来对回归变量X进行归一化。
copy_X bool, default=True 如果为True,将复制X;否则为X自身。
max_iter int, default=None 共轭梯度求解器的最大迭代次数。
tol float, default=1e-3 结果的精度
solver {‘auto’, ‘svd’, ‘cholesky’, ‘lsqr’, ‘sparse_cg’, ‘sag’, ‘saga’}, default=‘auto’ 用于计算例程的求解器
random_state int, default=None 随机种子

模型类的方法:
将模型类通过样本数据转化成模型实例,即拟合模型。

参数 取值 说明 输出
Ridge.fit(X, y) X表示自变量X,即属性值,类似数组或稀疏矩阵;y表示因变量,即结果标签,类似数组 通过X和y,拟合Ridge模型 模型实例 model

模型实例的方法:

参数 取值 说明 输出
model.get_params() bool,default=True 获取此估计器的参数 各参数以字典形式
model.set_params(param=XXX) 括号内指定param=XXX 设置此估计器的参数
model.predict(X) 类似数组或稀疏矩阵 使用线性模型进行预测 预测值 predictions,类似数组

模型实例的属性:

参数 说明
model.coef_ 回归系数,权重向量
model.n_iter 每个目标的实际迭代次数。仅适用于sag和lsqr求解器。其他求解器将返回None。
model.intercept_ 线性模型的截距,fit_intercept = False时,值为0.0

预测结果的评估方法:

参数 取值 说明 输出
predictions.score(X, y) X为新的数据集,y为新数据集的预测结果 模型的评估 R^2决定系数预测

参考5 岭回归官网

2.1.3、内置交叉验证岭回归 - RidgeCV

在岭回归的基础上,内置了交叉验证。默认情况下,它执行有效的“留一法”交叉验证。

RidgeCV不同于Ridge可以输入多个超参数Alpha,以方便得出最佳Alpha。

class sklearn.linear_model.RidgeCV(alphas=0.1, 1.0, 10.0, *, fit_intercept=True, normalize=False, scoring=None, cv=None, gcv_mode=None, store_cv_values=False, alpha_per_target=False)

模型对象的参数:

参数 取值 说明
alphas float, default=(0.1, 1.0, 10.0) 要尝试的Alpha值数组。同样表示正则强度,值必须是一个正浮点数。正则化改善了问题的条件,并减少了估计的方差。较大的值表示更强的正则化
fit_intercept bool, default=True 是否拟合该模型的截距。如果设置为false,则在计算中将不使用截距
normalize bool, default=False 归一化。fit_intercept设置为False时,将忽略此参数。如果为True,则将在回归之前通过减去均值并除以l2-范数来对回归变量X进行归一化。
scoring string, callable, default=None 带有scorer(estimator, X, y)签名的字符串或计分器可调用对象/函数 。如果为None,则当cv为’auto’或为None时(即,使用留一法交叉验证时)为负均方误差,否则为r2得分。
cv int,default,交叉验证生成器或迭代器 确定交叉验证拆分策略。
gcv_mode {‘auto’, ‘svd’, ‘eigen’}, default=‘auto’ 指示执行“留一法”交叉验证时要使用的策略的标志。
store_cv_values bool, default=False 指示是否应将与每个alpha对应的交叉验证值存储在cv_values_属性中的标志。该标志仅与cv=None(即使用“留一法”交叉验证)兼容。
alpha_per_target bool, default=False 指示是否alphas分别针对每个目标(对于多输出设置:多个预测目标)分别优化α值(从参数列表中选取)的标志 。设置True为时,拟合后,该alpha_属性将包含每个目标的值。设置False为时,所有目标均使用单个alpha。

模型类的方法:
将模型类通过样本数据转化成模型实例,即拟合模型。

参数 取值 说明 输出
RidgeCV.fit(X, y) X表示自变量X,即属性值,类似数组或稀疏矩阵;y表示因变量,即结果标签,类似数组 通过X和y,拟合Ridge模型 模型实例 model

模型实例的方法:

参数 取值 说明 输出
model.get_params() bool,default=True 获取此估计器的参数 各参数以字典形式
model.set_params(param=XXX) 括号内指定param=XXX 设置此估计器的参数
model.predict(X) 类似数组或稀疏矩阵 使用线性模型进行预测 预测值 predictions,类似数组

模型实例的属性:

参数 说明
model.coef_ 回归系数,权重向量
model.intercept_ 线性模型的截距,fit_intercept = False时,值为0.0
model.cv_values 每个Alpha的交叉验证值(仅当store_cv_values=True和时可用 cv=None)。之后fit()被调用,此属性将包含均方误差(默认)或值{loss,score}_func函数(如果在构造函数中提供)。
alpha_ 估计器的正则参数,或者,如果alpha_per_target=True,每个目标的估计器正则参数
best_score_ alpha最优时估计器的得分,或者,如果alpha_per_target=True,每个目标的得分

预测结果的评估方法:

参数 取值 说明 输出
predictions.score(X, y) X为新的数据集,y为新数据集的预测结果 模型的评估 R^2决定系数预测

参考6 交叉验证岭回归官网
参考7
参考8

2.2、实例应用

2.2、简单案例

同样以波士顿房价数据为例:

from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_boston
# 加载数据
boston = load_boston()
features = boston.data
target = boston.target
# 特征标准化
scaler = StandardScaler()
features_standardized = scaler.fit_transform(features)
# 创建线性回归对象
ridge = Ridge(alpha=0.5)
# 拟合模型
model = ridge.fit(features_standardized, target)
# 回归系数
model.coef_
"""
array([-0.92396151,  1.07393055,  0.12895159,  0.68346136, -2.0427575 ,2.67854971,  0.01627328, -3.09063352,  2.62636926, -2.04312573,-2.05646414,  0.8490591 , -3.73711409])
"""

2.3、多个超参数的设定 -RidgeCV

from sklearn.linear_model import RidgeCV
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_boston
# 加载数据
boston = load_boston()
features = boston.data
target = boston.target
# 特征标准化
scaler = StandardScaler()
features_standardized = scaler.fit_transform(features)
# 创建线性回归对象
ridge_cv = RidgeCV(alphas=[0.1, 1.0, 10.0])
# 拟合模型
model = ridge_cv.fit(features_standardized, target)
model.score(features_standardized, target)
"""
0.7406304514762481
"""
model.best_score_
"""
-23.718112644972546
"""
# 查看最优模型的alpha值
model.alpha_
"""
1.0
"""

2.4、多项式回归+岭回归案例

改编多项式回归+线性回归案例,使用岭回归来测试不同degree的图像显示。

# 导入库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
# 生成训练集和测试集
def f(x):""" 使用多项式插值拟合的函数"""return x * np.sin(x)
# 为了画函数曲线生成的数据
x_plot = np.linspace(0, 10, 100)
# 生成训练集
x = np.linspace(0, 10, 100)
rng = np.random.RandomState(0)
rng.shuffle(x)
x = np.sort(x[:30])
y = f(x)
# 转换为矩阵形式
X = x[:, np.newaxis]
X_plot = x_plot[:, np.newaxis]
# 可视化
colors = ['teal', 'yellowgreen', 'gold']
linestyles=["-","--",":"]
# lw = 2
fig = plt.figure(figsize=(12,6))
plt.plot(x_plot, f(x_plot), color='cornflowerblue', linewidth=1,label="ground truth")
plt.scatter(x, y, color='navy', s=10, marker='o', label="training points")
for count, degree in enumerate([3, 4, 5]):model = make_pipeline(PolynomialFeatures(degree), Ridge())model.fit(X, y)y_plot = model.predict(X_plot)plt.plot(x_plot, y_plot, color=colors[count], linestyle=linestyles[count],linewidth=2,label="degree %d" % degree)plt.legend(loc='lower left')
plt.show()
# fig.savefig('./img/4.6.3-PolynomialRegression.png',dpi=600)

结果展示:

可见阶数越高,曲线的弯曲形状越大,越接近函数曲线。


岭回归详解 从零开始 从理论到实践相关推荐

  1. 套索回归详解 从零开始 从理论到实践

    套索回归详解 从零开始 从理论到实践 一.套索回归的理解 二.sklearn的使用 2.1.方法.参数与属性 2.2.简单案例 一.套索回归的理解 套索回归与岭回归相似,只不过收缩惩罚项变成了可调超参 ...

  2. 贝叶斯分类器详解 从零开始 从理论到实践

    贝叶斯分类器详解 从零开始 从理论到实践 大纲总览 一.贝叶斯相关概念 1.1.频率学派和贝叶斯学派 1.1.1.频率学派 1.1.2.贝叶斯学派 1.2.概率论基础知识 1.3.贝叶斯定理 二.概率 ...

  3. 【直播回放】150分钟详解模型压缩理论和实践

    大家好,欢迎来到我们的付费视频直播回放栏目,在这个专栏中我们会每一次针对某一个主题,做1-2个小时左右的直播,包含PPT讲解与答疑交流. 作者&编辑 | 言有三 本文主题与资源 主讲人:言有三 ...

  4. LMDI 理论推导详解【从理论到Python-MATLAB实现(理论)】

    LMDI 理论推导详解[从理论到Python-MATLAB实现(理论)] 影响因素分解分析方法能够有效地反映任意时段上各个影响因素对目标变量变化的影响程度 大多数模型虽然可以定量反映各影响因素对目标变 ...

  5. 详解Docker的基本原理与实践操作

    详解Docker的基本原理与实践操作,Web时代,应用变得越来越强大,与此同时也越来越复杂.集群部署.隔离环境.灰度发布以及动态扩容缺一不可,而容器化则成为中间的必要桥梁. 本文我们就来探索Docke ...

  6. 【机器学习】岭回归和LASSO回归详解以及相关计算实例-加利福尼亚的房价数据集、红酒数据集

    文章目录 一,岭回归和LASSO回归 1.1 多重共线性 1.2 岭回归接手 1.3 线性回归的漏洞(线性系数的矛盾解释) 1.4 Ridge Regression 1.5 岭回归实例(加利福尼亚的房 ...

  7. Nginx详解一(理论)

    一.前言 二.Web服务器提供服务的方式 三.多进程.多线程.异步模式的对比 四.Web服务请求过程 五.Linux I/O模型 六.Linux I/O模型具体说明 七.Linux I/O模型的具体实 ...

  8. python回归算法_机器学习算法之回归详解

    导语 回归:从一组数据出发,确定某些变量之间的定量关系式:即建立数学模型并估计未知参数. 回归的目的是预测数值型的目标值,它的目标是接受连续数据,寻找最适合数据的方程,并能够对特定值进行预测.这个方程 ...

  9. HAproxy指南之haproxy配置详解2(理论篇)

    上一小节的从haproxy的配置文件我们知道haproxy相关参数基本介绍,但是在实际生产环境中,往往需要根据相关规则做请求匹配跳转,这时就需要用到Frontend:Backend这两个配置段,再结合 ...

最新文章

  1. java 原子量_Java原子量 - Rickxue的个人空间 - OSCHINA - 中文开源技术交流社区
  2. 看完这些能控制大脑的寄生虫,你会怀疑人类!
  3. css 用direction来改变元素水平方向,价值研究。
  4. Matlab学习------------带有右键菜单的GUI学习实例
  5. java parse_Java命令行界面(第9部分):parse-cmd
  6. 前端学习(3191):react中案例
  7. etcd 启动分析_Etcd 架构与实现解析
  8. element 手机适配_关于手机适配的方案(transform)
  9. es match 查询时间段_elasticsearch 笔记二 之基础查询
  10. 02 | 纵览全局:把握 Netty 整体架构脉络
  11. Cora数据集介绍+python读取
  12. 暴风激活后浏览器被锁定首页
  13. LiveNVR安防监控直播中无插件web直播方案中实现快照抓取的功能
  14. 7个月吐血整理!Android面试相关文章及Github学习资料(标星3.2K)
  15. 星起航:亚马逊卖家利用一件代发模式实现跨境电商飞速发展
  16. 在家怎么自制雪糕 自制雪糕怎么做
  17. 小米手机用鸿蒙OS,华为手机终于用上了 “鸿蒙OS 2.0” ,甚至小米也能用!
  18. 指针 习题11-1 输出月份英文名
  19. arduino和NB-IOT模块M5310-A使用教程,app实时控制
  20. VS2005下MFC开发的ActiveX控件的部分总结 inf 篇

热门文章

  1. 网易游戏笔试题(3) 20171209
  2. mysql导入dcom配置_Excel部署配置DCOM
  3. HTML5标签使用的常见误区
  4. 最新版某音X-Gorgon算法和设备注册算法研究思路
  5. 在Linux下使用“360随身WiFi 2”
  6. [发布会]三星Galaxy S4发布会图文直播_科技时代_新浪网
  7. sweetalert2中ajax用法,Sweetalert2 Ajax - 发布输入数据(Sweetalert2 Ajax - post input data)
  8. mysql使用localhost可以连接,使用ip连接不上
  9. 手把手教你如何使用telnet方式管理交换机(ensp)
  10. 如何精确统计用户在页面的停留时长?