转载:线性回归梳理
线性回归算法梳理
学习内容 :
1. 机器学习的一些概念 有监督、无监督、泛化能力、过拟合欠拟合(方差和偏差以及各自解决办法)、交叉验证
2. 线性回归的原理
3. 线性回归损失函数、代价函数、目标函数
4. 优化方法(梯度下降法、牛顿法、拟牛顿法等)
5、线性回归的评估指标
6、sklearn参数详解
转自:https://github.com/trembous/homework_summary/blob/master/29-%E9%87%8E%E6%AF%94%E5%A4%A7%E9%9B%84-20190227-20190301_01.ipynb
机器学习的概念
有监督和无监督
有监督:数据有标签,过程通常是:在已知的训练数据(输入和对应的输出下),训练得到模型;核心是分类,选择不同的分类器,分类后会被直接打上标签,适合独立同分布数据。
无监督:不存在老师即数据没有标签,直接拿数据进行建模;存在一个度量描述,学习结果的质量,基于这个度量优化模型参数。核心是聚类,计算密度相似度,先聚类后定性,对训练样本偏移的鲁棒性强,适合非独立同分布数据,可解释性优于有监督模型,扩展性更好。
泛化能力
泛化能力:机器学习算法对未知数据的识别能力,举一反三的能力。 在训练开始时,训练集误差和验证集误差都很大,处于欠拟合状态,高偏差低方差。训练不断进行,训练集误差不断减小,验证集先减小后增大。验证集误差变大即进入过拟合状态,此时低偏差高方差。
过拟合和欠拟合及解决
过拟合:模型的复杂度要高于实际的问题,训练过头。机器只是记住了训练数据:在训练数据上表现好,在未知数据上表现差。
解决方法:
- 重新清洗数据,过拟合可能是数据不纯导致的。
- 增加训练数据量,两者是相对的。
- 减少参数 。
损失函数引入正则项。参数过多,惩罚越重,对应损失函数就会变大,而我们的目标是最小化loss 。
对于一些特定的模型采取剪枝或dropout,BN。
- 重采样方法和验证集方法 常用K折交叉检验:在训练数据的子集上训练和测试模型k次,基于指标优化。
- 换个模型,模型不适合这个任务。
欠拟合:模型的复杂度较低,训练不够。没有学习到数据背后的规律。在训练数据和未知数据上表现都很差。 解决方法:不断训练至过拟合,增加模型复杂度(增加特征,减少正则项)。
交叉验证
交叉验证: 对样本数据进行切分为k个大小相似的互斥子集,每个子集尽可能保持数据分布的一致性,然后每次用k-1个子集的并集做为训练集,余下的子集做为测试集样本.打乱可以得到多组不同的训练集和测试集;某次训练集中的样本在下次可能成为测试集中的样本,即所谓“交叉”。常用方法:留出法,k折交叉检验,bootstrapping 。对应的python库有sklearn。
线性回归的原理
定义
定义线性方程组 ,写成向量的形式 ;
其中X为样本数据,W为线性回归模型参数,Y是期望数据,m表示样本数量,其中X,Y已知;
问题:寻找合适的W,合适的尺度。
尺度即损失函数,用于衡量训练过程中模型产生和期望产出的差距,并根据该目标找到合适的优化方法接近该目标。
损失函数
损失函数的别称,代价函数,目标函数
,即
y是期望输出,是模型输出,是误差;在数据量足够大的情况下,误差满足的高斯分布。方程有截距,此时。
单个样本的误差即 ,用代换,得到对应条件概率:。
由于样本是独立同分布,此时计算对数似然估计
引入log累乘成累加
进一步化简
,
令,,得到
可以得出以下结论:,是正常数,训练目标是最大化对数似然估计,即,换句话说就是最小化,
得到损失函数=
小节:根据中心极限定理估计误差分布,用代换,计算对数似然估计
优化方法
两类:最小二乘法和梯度下降法
最小二乘法
损失函数写成向量形式
,
求最小值,即可,此时
即, 右边是已知的,可以直接计算的前提是可逆,引入参数,可以保证一直存在,这种方法叫岭回归
梯度下降法
梯度方向是函数增长最快的方向,可知梯度反方向下降最快
,通过更新值,损失函数沿梯度反向降低。,是学习率,控制步长。
怎么求梯度?求导 这里损失函数记为L,回归方程记为f,样本数量为m,参数数量为n
随机梯度下降法
一个样本更新一次参数,,由于W是向量,计算偏导,即
同样为了减少过拟合,引入不同的正则项
L1正则(Lasso回归):
L2正则(Ridge回归):
结合以上(Elastic Net 回归):
批量梯度下降
遍历所有样本后再更新参数
损失函数(见2)
梯度下降法,牛顿法和拟牛顿法
梯度下降法
问题:求解最优化问题,其中x是优化变量,f是目标函数
梯度下降法原理:从初始点开始,利用规则移动点,最终梯度值为0。
根据泰勒展开公式,忽略二次项,
移项,保证每次迭代值都在减小,保证右边项小于0,即,
有,又有,当度时,变化最大,,
训练过程:
目标函数,梯度函数,计算精度,极小点
1.初始化,k=0
2.计算
3.计算梯度,判断当时停止迭代,令;否则令,求
,
4.,计算
当或,停止迭代,令
5.否则,令,跳回3
牛顿法
梯度下降法:,要经过一维搜索
牛顿法:,这里直接用Hessian矩阵的逆替代
梯度下降法原理:根据泰勒展开公式,忽略三次项,,其中
令,,++++++++++++++++++++++++(0)
训练过程: 目标函数,梯度函数,Hessian矩阵,计算精度,极小点
1.初始化,k=0
2.计算梯度,判断当时停止迭代,令;
3.计算,计算
+++++++++++++++++++++++++++(1)
4.
当或,停止迭代,令
5.否则,令,跳回3
拟牛顿法
核心:不好求,用新的n阶矩阵去近似
牛顿法中H矩阵的限制条件,用于近似的G矩阵也应满足。
4.2节+++++(0)区域变换得到,方便表示令,
,如果是正定,随迭代进行值总在下降,此时
带入泰勒公式
H矩阵的限制条件:
1.正定
2.或
复习下牛顿法:计算梯度,,计算,,
近似,满足以上条件;当然也可以用拟合
DFP算法
近似,
假设,
构造,
令,
,
此时,令,
,
,
训练过程:
目标函数,梯度函数,Hessian矩阵,计算精度,极小点
1.初始化,k=0,取为正定对称矩阵
2.计算梯度,判断当时停止迭代,令;否则3
3.计算,,求,
,
4.
5.计算梯度,判断当时停止迭代,令;
否则,,
,
6.令,跳回3
BFGS算法
用拟合 证明方法同上结果是和互换位置,不证明直接给出解果 ,
,
训练过程:
目标函数,梯度函数,Hessian矩阵,计算精度,极小点
1.初始化,k=0,取为正定对称矩阵
2.计算梯度,判断当时停止迭代,令;否则3
3.计算,,求,
,
4.
5.计算梯度,判断当时停止迭代,令;
否则,,
,
6.令,跳回3
其他算法
Broyden算法:,各取上面算法一部分
B.31 不会推2333
L-BFGS 就是存储过程如果碰到内存不过根据小稚数据量,丢弃最早生成的
线性回归的评估指标
统一使用预测值f,期望值y
MAE(平均绝对误差)
误差越小,模型越好
MSE(均方误差)
就是之前定义的损失函数
RMSE(均方根误差)
均方误差加个根号
R平方
分子表示模型预测误差,分母表示原始数据的离散程度,相除是为了消除原始离散的影响
越接近1,模型越好,当时全部预测正确,;当时模型胡乱预测,结果为0;当时,表示x,y没有线性关系。但是随样本量增加,也会增加
Adjusted R平方
n,p分别表示样本量,特征量;放在分母就是为了消除两者的影响
MAPE
考虑了误差与期望值的距离
RMSPE
kaggle使用的一套指标
SKLEARN参数详解
1.model = LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=1) -----fit_intercept:是否计算截距。 -----normalize: 当fit_intercept=True时,回归前的回归系数X减去平均值并除以l2-范数进行归一化。 -----copy_X:是否对X数组进行复制,默认为True -----n_jobs:指定线程数
2.fit(X,y,sample_weight=None)#用于训练模型,返回值:实例 -----X:形如[样本数,特征数]的训练数据 -----y:形如[样本数,标签数]的训练标签 -----样本权重:每个样本有独立的权重形如[样本数]
3.get_param(deep=True):获取当前模型及子项目的参数 -----deep布尔值:True,返回参数 -----返回值:参数名到对应值的映射字符串
4.predict(X) -----X:形如[样本数,特征数]的数据 -----返回预测值
5.score(X, y, sample_weight=None) -----X:形如[样本数,特征数]的测试数据 -----y:形如[样本数,标签数]的数据的真实值 -----样本权重:每个样本有独立的权重形如[样本数] -----返回评价指标R^2
R^2=1-U/V,其中u=((y_true - y_pred) 2).sum(),v=((y_true - y_true.mean()) 2).sum()
R^2的最优值是1;如果模型表现力很差,R^2可以是负值。常量模型在预测过程中,忽视输入特征,此时R^2=0
6.set_params(** params) -----设置参数 -----返回实例
其他写的不错的博客
本次入选评优共五位人员,以下为其他四位的链接,可对照学习完善:1.https://github.com/JRXGUGI/PrimaryAlgorithm_DataWhale_201903/blob/master/day1%EF%BC%9A%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E7%AE%97%E6%B3%95%E6%A2%B3%E7%90%86.md
2.https://blog.csdn.net/baidu_22225919/article/details/88019207
3.https://github.com/yaojunguo123/ml/blob/master/firstday/first.py
4.https://blog.csdn.net/Smile_Smilling/article/details/88044978