【机器学习】模型训练:scikitLearn线性模型的公式法与三种梯度下降法求解

36 篇文章 5 订阅
27 篇文章 3 订阅

模型训练导航:
【机器学习】欠拟合及过拟合与学习曲线、误差来源
【机器学习】scikitLearn正则化l1,l2,提前停止
【机器学习】逻辑回归logit与softmax

线性模型的两种解法

第一,公式解法
在这里插入图片描述

A: 是一个n行k列的矩阵,每行可以看作是一个观测数据(或者一个训练样本)的输入(features);

b: 是一个n维的列向量,每项表示一个观测数据的目标值(ground truth target value);

x: 是一个k维的列向量,是需要构建的线性模型的参数。

我们希望通过已知的A和b,求解出一个x,使得Ax = b。 但是,一般情况下,不存在满足这个等式的x。 怎么办?

Ax = b这个等式的左边,可以看作是一个矩阵A的列空间(Column space of A)。 这个等式没有解,可以理解为向量b不在矩阵A的列空间上。
A的列空间可以抽象成一个超平面,b可以抽象成一个向量。b不在超平面上。

解决办法是:在超平面上,找一个最接近b的向量。假设这个最接近b的向量是Ax*(其中x* 就是最优的参数解),那么,向量b和向量Ax*之间的距离应该是最小的。最小的定义为:

求一个近似的x*,使b和Ax*各项的差的平方的和最小。

故得出了一种公式解法求解线性模型:y就是b,x即为A
在这里插入图片描述
如果上述方程中XT乘X是不可逆的,则使用奇异值分解求为伪逆进行计算。
线性模型是在预测时,所有操作均为线性,速度非常快。

第二、梯度下降法
梯度下降的中心思想就是迭代地调整参数从而使成本函数最小化。
梯度下降中,模型参数被随机初始化并反复调整使成本函数最小化。学习步长与成本函数的斜率成正比,因此,当参数接近最小值时,步长逐渐变小。
线性回归模型的MSE成本函数恰好是个凸函数,这意味着连接曲线上任意两点的线段永远不会跟曲线相交。也就是说,不存在局部最小值,只有一个全局最小值。
应用梯度下降时,需要保证所有特征值的大小比例都差不多(比如使用Scikit-Learn的StandardScaler类),否则收敛的时间会长很多。
请注意,全梯度下降,在计算梯度下降的每一步时,都是基于完整的训练集X的。
梯度下降法在参数很多的时候,求解速度会比公式法更好。
n为学习率,乘以梯度,决定最终的下坡距离:
在这里插入图片描述
要找到合适的学习率,可以使用网格搜索。但是可能需要限制迭代次数,这样网格搜索可以淘汰掉那些收敛耗时太长的模型。

随机梯度下降每次只随机选择一个实例进行梯度计算,故可适用于海量的数据集,不用担心内存爆炸。此法只能得到最够好的参数,但是不会是最优的参数。随机性的好处在于可以逃离局部最优,但缺点是永远定位不出最小值。也就是一开始要有一个大的学习率,后面逐步减少,模拟退火过程。
使用随机梯度下降,要求最好为独立同分布:
独立同分布(Independent Identically Distribution)在概率统计理论中,指随机过程中,任何时刻的取值都为随机变量,如果这些随机变量服从同一分布,并且互相独立,那么这些随机变量是独立同分布。
可以使用SGDRegressor类,该类默认优化平方误差成本函数。以下代码最多可运行1000个轮次,或者直到一个轮次期间损失下降小于0.001为止(max_iter=1000,tol=1e-3)。它使用默认的学习调度(与前一个学习调度不同)以0.1(eta0=0.1)的学习率开始:

from sklearn.linear_model import SGDRegressor

sgd_reg = SGDRegressor(max_iter=1000, tol=1e-3, penalty=None, eta0=0.1, random_state=42)
sgd_reg.fit(X, y.ravel())

其它参数:

sklearn.linear_model.SGDRegressor(loss='squared_loss', *, penalty='l2', alpha=0.0001, l1_ratio=0.15, fit_intercept=True, max_iter=1000, tol=0.001, shuffle=True, verbose=0, epsilon=0.1, random_state=None, learning_rate='invscaling', eta0=0.01, power_t=0.25, early_stopping=False, validation_fraction=0.1, n_iter_no_change=5, warm_start=False, average=False)
loss:str, default=’squared_loss’,要使用的损失函数。可能的值是'squared_loss''huber''epsilon_unsensitive''squared_epsilon_unsensitive'普通平方表示拟合的最小平方。“huber”修改了“squared_loss”,通过从平方损失切换到超过epsilon距离的线性损失,减少了对异常值的校正。“epsilon_unsensitive”忽略小于epsilon的错误,并且是线性的;这是SVR中使用的损失函数。“squared_epsilon_unsensitive”是相同的,但在ε的公差后变为平方损失。

penalty:{‘l2’, ‘l1’, ‘elasticnet’}, default=’l2’。 要使用的惩罚(又名正则化术语)。默认为“l2”,这是线性支持向量机模型的标准正则化器。“l1”和“elasticnet”可能会给模型(特征选择)带来“l2”无法实现的稀疏性。

alpha:float, default=0.0001。乘以正则项的常数。值越大,正则化越强。当学习率设为“最优”时,也用于计算学习率。

l1_ratio:float, default=0.15。弹性网络混合参数,0<=l1<=1。l1_ratio=0对应于L2惩罚,l1_ratio=1到l1。仅当惩罚为“elasticnet”时使用。

fit_intercept:bool, default=True。是否应该估计截距。如果为False,则假定数据已经居中。

max_iter:int, default=1000。训练数据的最大传递次数(也称为epochs)。它只影响拟合方法中的行为,而不影响部分拟合方法中的行为。

tol:float, default=1e-3。停止标准。如果不是“无”,则当(损失>最佳损失-公差)更改连续的时间段时,培训将停止。

shuffle:bool, default=True。是否在每个epoch之后对训练数据进行shuffle。

verbose:int, default=0。详细程度。

epsilon:float, default=0.1。Epsilon不敏感损失函数中的Epsilon;仅当损失为“huber”、“epsilon_insensitive”或“squared_Epsilon_unsensitive”时。对于“huber”,它决定了一个阈值,在这个阈值下,准确的预测就变得不那么重要了。对于epsilon-insensitive,如果当前预测与正确标签之间的任何差异小于此阈值,则将忽略这些差异。

random_state:int, RandomState instance, default=None。当shuffle设置为True时,用于洗牌数据。为跨多个函数调用的可复制输出传递一个int。

learning_rate:string, default=’invscaling’。 学习率方法:

“constant”:eta=eta0

“optimal”:eta=1.0/(alpha*(t+t0)),其中t0由Leon Bottou提出的启发式方法选择。

“invscaling”:eta=eta0/pow(t,功率)

“adaptive”:eta=eta0,只要训练持续减少。每次n_iter_no_change连续时间未能减少tol的训练损失或未能增加tol的验证分数(如果提前停止为真),则当前学习率除以5。

eta0:double, default=0.01。“constant”、“invscaling”或“adaptive”规则的初始学习率。默认值为0.01。

power_t:double, default=0.25。逆标度学习率的指数。

early_stopping:bool, default=False。验证分数没有提高时,是否使用提前停止终止培训。如果设置为True,则当分数方法返回的验证分数没有至少提高tol时,它将自动保留一部分训练数据作为验证,并终止训练。

validation_fraction:float, default=0.1。作为早期停机验证设置的培训数据的比例。必须介于01之间。仅在“早停”为真时使用。

n_iter_no_change:int, default=5。在提前停止之前没有改进的迭代次数。

warm_start:bool, default=False。当设置为True时,将上一个调用的解决方案重用为fit作为初始化,否则,只需删除以前的解决方案。当warm_start为True时,反复调用fit或partial_fit会导致与一次性调用fit时不同的解决方案,这是因为数据的无序处理方式。如果使用动态学习率,学习率将根据已经看到的样本数进行调整。调用fit重置此计数器,而partial_fit将导致增加现有计数器。

average:bool or int, default=False。当设置为True时,计算所有更新的平均SGD权重,并将结果存储在coef_u属性中。如果设置为大于1的整数,则在看到的样本总数达到平均值后开始平均。所以average=10将在看到10个样本后开始平均。

小批量梯度下降介于随机梯度下降与全梯度下降之间,是每次使用一个批次的集合,进行梯度下降。
小批量梯度下降优于随机梯度下降的主要优点是,你可以通过矩阵操作的硬件优化来提高性能,特别是在使用GPU时。同时,其收敛的方向更稳定,但有陷入局部最小值的可能。

下图中是各类解法之间的对比
m是训练实例的数量,n是特征的数量,特征是方程的参数。在这里插入图片描述
小批量GD,随机GD基本上是各方面都较优的选择。在特征特别多,维度较高时,SVD就会较慢,它是平方次的时间常数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颢师傅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值