当前位置: 首页 > news >正文

scikit-learn/sklearn学习|岭回归linear_model.Ridge()函数解读

【1】引言

前序学习进程中,已经对岭回归和岭回归的官方示例进行了解读,但之前侧重于展示岭回归算法对线性系数的影响,因此还有必要进一步追溯这种影响发生的根本原因,这就是本次学习的目的。

【2】linear_model.Ridge()函数

点击下方链接,直达官方linear_model.Ridge()函数的说明页面。
此处我们汇总一下主要内容:

lass sklearn.linear_model.Ridge(
alpha=1.0, 正则化强度
*,强制后续的参数必须通过关键字写入
fit_intercept=True,是否计算模型截距
normalize=False,是否进行归一化
copy_X=True,是否复制X
max_iter=None,共轭梯度求解器的最大迭代次数
tol=0.001, 优化算法的精度
solver=‘auto’,自动选择求解器
random_state=None 随机打乱数据)

在此基础上,我们回头看先前代码:

# X is the 10x10 Hilbert matrix
# 这里包括两个步骤
# 第一步,生成[1,2,...,10]的一维数组,一共10个数,组成一个行向量
# 第二步,生成[0,1,...,9]的一维数组,一共十个数,然后增加一个轴,转化为10行1列的二维矩阵,实际上是一个列向量
# 第三步,加号"+"串联起两个数组,并且数组自动广播,都变成10行10列的二维矩阵
# 二维矩阵相加的结果是,位置为(i,j)的元素实际上是第(i+1,j+1)的元素,比如第一行第一列的元素位置被记录为(0,0)而非(1,1)
# 执行加法计算后,元素位置为(i,j)处的计算结果为(i+1+j)
# 最后获得的X则是对加法计算的矩阵在每个位置再计算倒数后的值
X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
# y是一个纯1矩阵,一共10个数
y = np.ones(10)# #############################################################################
# Compute paths# 定义常数n_alphas = 200
n_alphas = 200
# 定义以10为底数的对数,真数从-10到-2均匀变化,一共输出n_alphas个/200个数
alphas = np.logspace(-10, -2, n_alphas)# 定义一个空列表
coefs = []
for a in alphas:# ridge定义了一个岭回归对象ridge = linear_model.Ridge(alpha=a, fit_intercept=False)# 执行岭回归计算ridge.fit(X, y)# ridge.coef_是岭回归计算出来的系数# 本例中,由于每一行的样本是10个特征,所以有10个系数# 每一行样本都会使用这10个系数coefs.append(ridge.coef_)

这里只用了两个参数:

ridge = linear_model.Ridge(alpha=a, fit_intercept=False)

首先用动态变化的a来改变alpha,然后计算不考虑截距,因为截距对计算结果没有影响。这种设置的目的是让代码聚焦于改变正则化强度因子。
这个时候让我们再看一次代码运行获得的效果图:
在这里插入图片描述
这里故意做了坐标轴的逆向,突出了一个内容:当alpha越小,也就是正则化强度越低,得到的线性系数就可能越大。
为了进一步对比,我们不妨在代码中该换一下强度因子定义方式:

# 定义常数n_alphas = 200
n_alphas = 200
# 定义以10为底数的对数,真数从-10到-2均匀变化,一共输出n_alphas个/200个数
alphas0 = np.logspace(-10, -2, n_alphas)
# 用指数函数计算正则化强度
alphas1 = np.exp(-1*np.linspace(0,10,n_alphas))
# 用三角函数来计算正则化强度
alphas2 = 0.5 * (1 + np.sin(np.linspace(-0.5 * np.pi, 0.5 * np.pi, n_alphas)))
# 将正弦序列的值映射到合理的alpha范围(0.001到1之间)
alphas2 = 0.001 + alphas2 * 0.999

之后绘图部分也分成三个小子图:

# 第一个子图 - 对数空间正则化
axes[0].plot(alphas0, coefs0)
axes[0].set_xscale('log')
axes[0].set_xlim(axes[0].get_xlim()[::-1])  # 反转x轴,使正则化强度从大到小
axes[0].set_ylabel('weights')
axes[0].set_title('Log-space regularization')
axes[0].grid(True, alpha=0.3)# 第二个子图 - 指数衰减正则化
axes[1].plot(alphas1, coefs1)
axes[1].set_xscale('log')
axes[1].set_xlim(axes[1].get_xlim()[::-1])  # 反转x轴
axes[1].set_ylabel('weights')
axes[1].set_title('Exponential decay regularization')
axes[1].grid(True, alpha=0.3)# 第三个子图 - 正弦序列正则化
axes[2].plot(alphas2, coefs2)
axes[2].set_xscale('log')
axes[2].set_xlim(axes[2].get_xlim()[::-1])  # 反转x轴
axes[2].set_xlabel('alpha')
axes[2].set_ylabel('weights')
axes[2].set_title('Sinusoidal sequence regularization')
axes[2].grid(True, alpha=0.3)

最后获得的图像为:
在这里插入图片描述
可见虽然正则化强度因子不一样,但最后获得的线性系数在高强度因子的作用下取值均趋向于0,符合稳健性的特征。
此时的完整代码为:

# 引入必要模块
import numpy as np
import matplotlib.pyplot as plt
# 引入线性模型
from sklearn import linear_model# X is the 10x10 Hilbert matrix
# 这里包括两个步骤
# 第一步,生成[1,2,...,10]的一维数组,一共10个数,组成一个行向量
# 第二步,生成[0,1,...,9]的一维数组,一共十个数,然后增加一个轴,转化为10行1列的二维矩阵,实际上是一个列向量
# 第三步,加号"+"串联起两个数组,并且数组自动广播,都变成10行10列的二维矩阵
# 二维矩阵相加的结果是,位置为(i,j)的元素实际上是第(i+1,j+1)的元素,比如第一行第一列的元素位置被记录为(0,0)而非(1,1)
# 执行加法计算后,元素位置为(i,j)处的计算结果为(i+1+j)
# 最后获得的X则是对加法计算的矩阵在每个位置再计算倒数后的值
X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
# y是一个纯1矩阵,一共10个数
y = np.ones(10)# #############################################################################
# Compute paths# 定义常数n_alphas = 200
n_alphas = 200
# 定义以10为底数的对数,真数从-10到-2均匀变化,一共输出n_alphas个/200个数
alphas0 = np.logspace(-10, -2, n_alphas)
# 用指数函数计算正则化强度
alphas1 = np.exp(-1*np.linspace(0,10,n_alphas))
# 用三角函数来计算正则化强度
alphas2 = 0.5 * (1 + np.sin(np.linspace(-0.5 * np.pi, 0.5 * np.pi, n_alphas)))
# 将正弦序列的值映射到合理的alpha范围(0.001到1之间)
alphas2 = 0.001 + alphas2 * 0.999
# 定义一个空列表
coefs0 = []
for a in alphas0:# ridge定义了一个岭回归对象ridge = linear_model.Ridge(alpha=a, fit_intercept=False)# 执行岭回归计算ridge.fit(X, y)# ridge.coef_是岭回归计算出来的系数# 本例中,由于每一行的样本是10个特征,所以有10个系数# 每一行样本都会使用这10个系数coefs0.append(ridge.coef_)coefs1 = []
for a in alphas1:# ridge定义了一个岭回归对象ridge = linear_model.Ridge(alpha=a, fit_intercept=False)# 执行岭回归计算ridge.fit(X, y)# ridge.coef_是岭回归计算出来的系数# 本例中,由于每一行的样本是10个特征,所以有10个系数# 每一行样本都会使用这10个系数coefs1.append(ridge.coef_)
# #############################################################################
# Display resultscoefs2 = []
for a in alphas2:# ridge定义了一个岭回归对象ridge = linear_model.Ridge(alpha=a, fit_intercept=False)# 执行岭回归计算ridge.fit(X, y)# ridge.coef_是岭回归计算出来的系数# 本例中,由于每一行的样本是10个特征,所以有10个系数# 每一行样本都会使用这10个系数coefs2.append(ridge.coef_)# 创建3行1列的图像布局
fig, axes = plt.subplots(3, 1, sharex=False)# 第一个子图 - 对数空间正则化
axes[0].plot(alphas0, coefs0)
axes[0].set_xscale('log')
axes[0].set_xlim(axes[0].get_xlim()[::-1])  # 反转x轴,使正则化强度从大到小
axes[0].set_ylabel('weights')
axes[0].set_title('Log-space regularization')
axes[0].grid(True, alpha=0.3)# 第二个子图 - 指数衰减正则化
axes[1].plot(alphas1, coefs1)
axes[1].set_xscale('log')
axes[1].set_xlim(axes[1].get_xlim()[::-1])  # 反转x轴
axes[1].set_ylabel('weights')
axes[1].set_title('Exponential decay regularization')
axes[1].grid(True, alpha=0.3)# 第三个子图 - 正弦序列正则化
axes[2].plot(alphas2, coefs2)
axes[2].set_xscale('log')
axes[2].set_xlim(axes[2].get_xlim()[::-1])  # 反转x轴
axes[2].set_xlabel('alpha')
axes[2].set_ylabel('weights')
axes[2].set_title('Sinusoidal sequence regularization')
axes[2].grid(True, alpha=0.3)# 整体标题
plt.suptitle('Ridge coefficients as a function of different regularization sequences',fontsize=16, y=0.95)plt.tight_layout()
plt.show()

【3】总结

详细解读了岭回归linear_model.Ridge()函数,并且尝试更改了正则化强度因子alpha的定义方式,获得了高强度正则化条件下线性化系数趋向于相同取值的效果。

http://www.dtcms.com/a/329279.html

相关文章:

  • 蓝桥杯备赛 按键、LCD、定时器
  • 变分自编码器VAE的Pytorch实现
  • 兰洋科技获第四届宁波市专利创新大赛殊荣,以液冷技术定义行业新标杆
  • 磁悬浮轴承转子动平衡:零接触旋转下的“隐形杀手”深度解析与精准猎杀指南
  • Java项目中地图功能如何创建
  • 使用 libpq 的 COPY 协议维护自定义 PG 到 PG 连接
  • 飞算JavaAI的中间件风暴:Redis + Kafka 全链路实战
  • WMware的安装以及Ubuntu22的安装
  • 自动驾驶中安全相关机器学习功能的可靠性定义方法
  • VirtualBox中的Ubuntu共享Windows的文件夹
  • 【Excel】被保护的文档如何显示隐藏的行或列
  • 厚铜PCB在百安级电流与高温环境中的关键作用
  • 普通电脑与云电脑的区别有哪些?全面科普
  • C++ 错误记录模块实现与解析
  • Redis:是什么、能做什么?
  • uniapp跨端性能优化方案
  • 各种排序算法(一)
  • Highcharts 图表示例|面积图与堆叠图(Area Stacked Chart)——让数据趋势更有层次感
  • SODA自然美颜相机(甜盐相机国际版) v9.3.0
  • LangChain是如何实现RAG多轮问答的
  • 【算法岗面试】手撕Self-Attention、Multi-head Attention
  • 比特币持有者结构性转变 XBIT分析BTC最新价格行情市场重构
  • 微店商品数据API接口的应用||电商API接口的应用
  • 数据结构与算法-选择题
  • 公司项目用户密码加密方案推荐(兼顾安全、可靠与通用性)
  • Chaos Vantage 2.8.1 发布:实时探索与材质工作流的全新突破
  • CacheBlend:结合缓存知识融合的快速RAG大语言模型推理服务
  • 大模型推理框架vLLM 中的Prompt缓存实现原理
  • 性能优化之通俗易懂学习requestAnimationFrame和使用场景举例
  • 来伊份×养馋记:社区零售4.0模式加速渗透上海市场