目录
- 写在前面的话
- 1.线性回归
- 1.1. 从方程说起
- 1.2. 线性回归
- 1.3. 一元线性回归
- 1.4. 多元线性回归
- 2. 线性回归学习策略
- 2.1 损失函数
- 2.2. 代价函数
- 2.3. 目标函数
- 3. 算法求解
- 3.1 最小二乘法
- 3.2. 梯度下降法
- 3.3. 正则项
- 4. 线性回归的评估指标
- 4.1. 均方误差MSE
- 4.2. 均方根误差RMSE
- 4.3. 平均绝对值误差MAE
- 4.4. R Squared误差
- 4.5. 代码实现
- 5. 实战项目
- 写在后面的话
写在前面的话
刚巧不巧,参加了DataWhale的四月学习计划,然后就有了这个系列
两天一个算法,是小组规定的时间计划,不幸的是,只有5个算法计划,而且还有两个算法已经出现在我的大话系列中,大话系列目前已经怼完了这些算法:决策树、贝叶斯、SVM、Adaboost。所以这个系列可能很快就结束了,回过头我们在继续大话系列,这个暂且当做一个学习笔记。
今天开始第一篇:线性回归
1.线性回归
1.1. 从方程说起
说起线性回归,你可能不太理解是什么东西,但我要是说一元一次方程你瞬间就知道是啥。
一元一次方程 y=ax+b中,元
指的是未知数的个数(即x),次
指的是未知数的最大幂数(即x的几次方)
那么回归也就是针对输入变量x和输出变量y之间的一个映射,线性回归的映射呈线性分布,相对的还有一个逻辑回归,下节再说它。
在线性回归中,如果只有一个自变量,我们称之为一元线性回归,如果有两个及以上的自变量,我们称之为多元线性回归,就好比区分一元方程和多元方程 一样。
1.2. 线性回归
根据方程我们可以直接写出线性回归的一般公式:
这个公式可以直接写成向量的形式:
其中加粗的X表示向量,θ的转置用θ^T表示,先记住上面这个公式,我们这会还用不到
1.3. 一元线性回归
通过上面的公式,我们可以直接写出一元线性回归的一般公式:
也就相当于一元一次方程y=ax+b。在一元一次方程中,求解关键是计算出a和b的值,同理在一元线性回归中我们也需要求解出θ的值(这里包括θ0和θ1)
ok,相关的概念你都明白了,来看张图:
现在有许多蓝色的数据点(每个点对应x,y),这个时候的线性回归方程如何求解?
我们知道,一元线性回归其实就是找到一条直线,但是这个图中我们可以找到的不止一条直线,那么对应的问题来了,如何找到最优的一条直线?
先假设我们已经找到了这条直线,那么在上面图中,针对横坐标x,纵坐标y的每个点(xi,yi)最终形成了这样一条直线 :
每个点都会与最终的直线存在些许距离(误差),同时这个距离是最小的距离,所以这个直线就是最优的直线
如何计算距离呢?
每个点和直线的距离应该这样计算:
为了简单方便我们可以直接将绝对值转化为平方,这个时候整体数据的误差:
ok,这就是一元线性回归的误差方程,我们的目的就是求得a和b,使得Loss最小。
怎么求解这个a和b,我们等会再说,先来看看多元线性回归
1.4. 多元线性回归
前面我们已经写出了线性回归的表达式:
假如现在是一个三元线性回归,相应的:
同时,回归系数θ:
对于给定的数据x1,也就是就成真的第一列数据,预测结果u1:
所以,我们多元线性回归的误差也可以写成:
2. 线性回归学习策略
在线性回归的模型建立过程中,有一些学习策略需要学习,但是这个学习策略不光是线性回归独有的,在其他回归模型上同样适用。
提前说两个名词,大家了解一下
经验风险:
通过历史数据(训练集)得知模型对单个样本点的预测,并计算关于训练集的平均损失称作经验风险
结构风险:
当经验风险越小的时候,也就是模型对训练数据完美拟合的时候(过拟合),我们需要增加一些惩罚机制避免过拟合现象,即经验风险+正则惩罚,这个时候称为结构风险
ok,可能你看的云里雾里,来一张图醒醒神
上面三个图的函数依次为,真实Price记为
给定一个,三个函数都会输出一个,但是输出的结果不一定就与真实值相等,于是我们就需要一个函数去度量拟合的好坏,比如:这个函数称为损失函数,当损失函数越小,代表模型拟合的越好。
同时,根据上面的经验风险的概念,此时的经验风险为:经验风险是针对整个模型数据集的,所以此时我们的目标就变成了如果使得经验风险最小化。
问题来了,上面图三经验风险最小,但是我们却不会用它
因为它的模型结构太复杂,产生了过拟合,我们需要增加一个函数来度量模型的复杂度——正则化
根据上面的概念,此时结构风险=经验风险+正则惩罚,即:经验风险和结构风险都是针对整个数据集的,此时我们的目标变成了结构风险最小化+结构风险最小化,对应目标函数:
完事,总结一下
2.1 损失函数
损失函数:度量单样本预测的错误程度。损失函数越小,模型越好
常用的损失函数包括:绝对损失函数、平方损失函数、对数损失函数等
2.2. 代价函数
代价函数:度量全部样本集的平局误差。
常见的代价函数包括:均方误差、平均绝对误差、均方根误差等
2.3. 目标函数
目标函数:代价函数+正则化函数,有时候只有前半部分
模型最终的目标一定是:不仅要经验风险最小化,还要结构风险最小化
3. 算法求解
我们已经知道最终的优化目标:目标函数最小化。
通过求解目标函数计算出相应的参数值,从而最终得到我们的最优模型。
现在我们的目标函数是:
抛开后面的正则化先不说,我们需要计算前半部分,先将前半部分写成我们能看懂的形式:
这不就是求解一个方程的极小值问题嘛,ok,来搞
3.1 最小二乘法
最小二乘法又叫最小平方法,主要思想就是选择未知参数,使得理论值与观测值之差的平方和达到最小
就像在上面定义的损失函数一样,就是通过最小二乘思想使得误差最小。
问题来了,如何求解最小误差对应的未知参数?
从单变量和多变量分别来说一下吧:
先来看单变量的最小二乘法求解
单变量下,我们的假设函数是y=ax+b,此时对应的损失函数为:
我们的目标是通过找出合适的a、b使得Loss 最小(常数N可以先不考虑),这个时候可以直接用求极值的方法。
将Loss函数对a、b分别求偏导,并使得偏导结果为0,解出此时a、b的值,即为我们的参数目标值:
通过上面的方程组我们可以解得a、b的值,带入到原方程中即可求解
再来看多变量的最小二乘法求解
此时我们的损失函数变成了:
这个可以写成矩阵的形式:
同样的我们求参数θ(此时的θ是个向量,常数N暂不考虑)求偏导,并使得偏导结果为0
KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲\begin{split} \…
这样我们也通过矩阵运算求解出θ的值,对应的损失函数也就确定了。
3.2. 梯度下降法
梯度的本意是一个向量,表示某一函数在该点处的方向导数沿着该方向取得最大值。也就是函数在该点处沿着该方向变化最快。
从数学上的角度来看,梯度的方向是函数增长速度最快的方向,那么梯度的反方向就是函数减少最快的方向。那么,如果想计算一个函数的最小值,就可以使用梯度下降法的思想来做。
应用在我们的目标函数中,我们需要算出每个点下降最快的方向,然后使其在该方向上下降到下一个点,然后更新下降最快的方向,重复步骤直到下降到底
考虑一个问题,某一点的梯度怎么算?
对该点进行求偏导,算出该点的梯度的值。
同样的,我们从单变量和多变量分别来说一下吧:
先来看单变量的梯度下降法求解
在最下二乘法中,我们通过求偏导计算出a、b取偏导的结果
在梯度下降法中,我们需要计算在某一点对a、b的偏导,也就是,同样的在该点会存在一个参数 α,它表示在梯度方向前进的步长,综合一下,在某一点参数a、b的更新为
所以梯度下降的更新可以表示成这样一个表达式:
至于每一个点对a、b求偏导,在最小二乘法里面已经计算过了,不妨回过头去看一眼。
另外:往深的想一下,梯度下降法认为每一步的最优解合并起来就是最终的最优解,这样会导致最终结果可能并不是全局最优解
再来看多变量的梯度下降法求解
由于在多变量中我们的目标函数发生了变化,相应的对于梯度下降的更新也会发生变化
KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲\begin{split}&L…
忽略掉常数,我们可以得到:
ok,求解出未知参数的值,我们的目标函数也就确定了
3.3. 正则项
上面我们留了一个问题:正则项
正则项的目的是通过对最小二乘估计加入惩罚约束,使某些系数的估计非常小或为0,可以有效的解决函数的过拟合问题
在线性回归中,一般有这两种正则化:
- L1正则化(Lasso回归):稀疏化模型参数
- L2正则化(Rideg/岭回归):缩小模型参数
(好像又挖了个坑,后面再填吧,这个了解一下就行了)
4. 线性回归的评估指标
通过前面的内容,我们成功的对数据进行了预测,那到底预测的准不准?有多准?就需要用到这些评估指标了
在线性回归中常用的的评估指标有四种,分别是:
- 均方误差MSE(Mean Squared Error)
- 均方根误差RMSE(Root Mean Squared Error)
- 平均绝对值误差MAE(Mean Absolute Error)
- R Squared
四种评估指标中最常用的第四种,每种的计算方式分别如下:
4.1. 均方误差MSE
MSE的值越小,说明预测模型的精确度越高
4.2. 均方根误差RMSE
相当于对MSE开根号,同越小越好
4.3. 平均绝对值误差MAE
效果同上
4.4. R Squared误差
不同的是,这个的R^2越大越好,最大值为1,表示模型准确率最高;当<0是,说明数据可能不存在线性关系,需要注意
在sklearnz中最常用的方法是R Squared方法。
4.5. 代码实现
def mean_squared_error(y_true, y_predict):
"""计算y_true和y_predict之间的MSE"""
assert len(y_true) == len(y_predict), "the size of y_true must be equal to the size of y_predict"
return np.sum((y_true - y_predict)**2) / len(y_true)
def root_mean_squared_error(y_true, y_predict):
"""计算y_true和y_predict之间的RMSE"""
return sqrt(mean_squared_error(y_true, y_predict))
def mean_absolute_error(y_true, y_predict):
"""计算y_true和y_predict之间的RMSE"""
assert len(y_true) == len(y_predict), "the size of y_true must be equal to the size of y_predict"
return np.sum(np.absolute(y_true - y_predict)) / len(y_true)
def r2_score(y_true, y_predict):
"""计算y_true和y_predict之间的R Square"""
return 1 - mean_squared_error(y_true, y_predict)/np.var(y_true)
5. 实战项目
下节更新
写在后面的话
稍稍总结一下,回归模型的目的是预测数值型的目标值,像诸如房价预测,年龄预测等等都可以通过回归模型去解决。
当然了你要说分类模型可以解决吗?也可以的。不过各有所长,各有所短,医生诊断病情都得对症下药,我们解决问题也是要同样的道理的
本想着把线性回归涉及到的内容都统统列出来,毕竟是回归模型的开篇,后面学习其他高级的模型也会简单很多。
无奈坑实在太多(文中好多内容一笔带过),而且恰好是周内工作日,时间有点仓促,就只能放在下一篇了。
后面还有逻辑回归,也想着趁机理一理,写一写,等做完线性回归的项目就开搞
我是小一,第一步的一,下节见!