目录
写在前面的话
刚巧不巧,参加了DataWhale的四月学习计划,然后就有了这个系列
两天一个算法,是小组规定的时间计划,不幸的是,只有5个算法计划,而且还有两个算法已经出现在我的大话系列中,大话系列目前已经怼完了这些算法:决策树、贝叶斯、SVM、Adaboost。所以这个系列可能很快就结束了,回过头我们在继续大话系列,这个暂且当做一个学习笔记。
今天开始第一篇:线性回归
1.线性回归
1.1. 从方程说起
说起线性回归,你可能不太理解是什么东西,但我要是说一元一次方程你瞬间就知道是啥。
一元一次方程 y=ax+b中,元
指的是未知数的个数(即x),次
指的是未知数的最大幂数(即x的几次方)
那么回归也就是针对输入变量x和输出变量y之间的一个映射,线性回归的映射呈线性分布,相对的还有一个逻辑回归,下节再说它。
在线性回归中,如果只有一个自变量,我们称之为一元线性回归,如果有两个及以上的自变量,我们称之为多元线性回归,就好比区分一元方程和多元方程 一样。
1.2. 线性回归
根据方程我们可以直接写出线性回归的一般公式:
H
(
θ
0
,
θ
1
.
.
.
θ
n
)
=
θ
0
+
θ
1
x
1
+
.
.
.
+
θ
n
x
n
H(\theta_0,\theta_1...\theta_n)=\theta_0+\theta_1x_1+...+\theta_nx_n
H(θ0,θ1...θn)=θ0+θ1x1+...+θnxn
这个公式可以直接写成向量的形式:
H
(
θ
)
=
θ
T
X
H(\theta)=\theta^T\mathbf{X}
H(θ)=θTX
其中加粗的X表示向量,θ的转置用θ^T表示,先记住上面这个公式,我们这会还用不到
1.3. 一元线性回归
通过上面的公式,我们可以直接写出一元线性回归的一般公式:
H
(
θ
0
,
θ
1
)
=
θ
0
+
θ
1
x
1
H(\theta_0,\theta_1)=\theta_0+\theta_1x_1
H(θ0,θ1)=θ0+θ1x1
也就相当于一元一次方程y=ax+b。在一元一次方程中,求解关键是计算出a和b的值,同理在一元线性回归中我们也需要求解出θ的值(这里包括θ0和θ1)
ok,相关的概念你都明白了,来看张图:
现在有许多蓝色的数据点(每个点对应x,y),这个时候的线性回归方程如何求解?
我们知道,一元线性回归其实就是找到一条直线,但是这个图中我们可以找到的不止一条直线,那么对应的问题来了,如何找到最优的一条直线?
先假设我们已经找到了这条直线,那么在上面图中,针对横坐标x,纵坐标y的每个点(xi,yi)最终形成了这样一条直线 :
每个点都会与最终的直线存在些许距离(误差),同时这个距离是最小的距离,所以这个直线就是最优的直线
如何计算距离呢?
每个点和直线的距离应该这样计算:
d
=
∣
y
i
−
(
a
x
i
+
b
)
∣
d = |y_i-(ax_i+b)|
d=∣yi−(axi+b)∣
为了简单方便我们可以直接将绝对值转化为平方,这个时候整体数据的误差:
L
o
s
s
=
1
N
∑
i
=
1
N
(
y
i
−
(
a
x
i
+
b
)
)
2
Loss = \frac{1}{N}\sum_{i=1}^N(y_i-(ax_i+b))^2
Loss=N1i=1∑N(yi−(axi+b))2
ok,这就是一元线性回归的误差方程,我们的目的就是求得a和b,使得Loss最小。
怎么求解这个a和b,我们等会再说,先来看看多元线性回归
1.4. 多元线性回归
前面我们已经写出了线性回归的表达式:
H
(
θ
)
=
θ
T
X
H(\theta)=\theta^T\mathbf{X}
H(θ)=θTX
假如现在是一个三元线性回归,相应的:
X
=
[
x
11
x
12
x
13
x
21
x
22
x
23
x
31
x
32
x
33
]
,
y
=
[
y
1
y
2
x
3
]
X = \begin {bmatrix}x_{11} & x_{12} & x_{13} \\ x_{21} & x_{22} & x_{23}\\ x_{31} & x_{32} & x_{33}\\ \end{bmatrix}, \,\, y=\begin {bmatrix}y_1\\y_2\\x_3\\ \end{bmatrix}
X=⎣⎡x11x21x31x12x22x32x13x23x33⎦⎤,y=⎣⎡y1y2x3⎦⎤
同时,回归系数θ:
θ
=
[
θ
1
θ
2
θ
3
]
\theta=\begin {bmatrix}\theta_1\\\theta_2\\\theta_3\\ \end{bmatrix}
θ=⎣⎡θ1θ2θ3⎦⎤
对于给定的数据x1,也就是就成真的第一列数据,预测结果u1:
u
1
=
[
x
11
x
21
x
31
]
T
∗
[
θ
1
θ
2
θ
3
]
u_1 = \begin {bmatrix}x_{11} \\ x_{21}\\ x_{31}\\ \end{bmatrix}^T * \begin {bmatrix}\theta_1\\\theta_2\\\theta_3\\ \end{bmatrix}
u1=⎣⎡x11x21x31⎦⎤T∗⎣⎡θ1θ2θ3⎦⎤
所以,我们多元线性回归的误差也可以写成:
L
o
s
s
=
1
N
∑
i
=
1
N
(
y
i
−
x
i
T
θ
)
2
Loss = \frac{1}{N}\sum_{i=1}^N(y_i-x_i^T\theta)^2
Loss=N1i=1∑N(yi−xiTθ)2
2. 线性回归学习策略
在线性回归的模型建立过程中,有一些学习策略需要学习,但是这个学习策略不光是线性回归独有的,在其他回归模型上同样适用。
提前说两个名词,大家了解一下
经验风险:
通过历史数据(训练集)得知模型对单个样本点的预测,并计算关于训练集的平均损失称作经验风险
结构风险:
当经验风险越小的时候,也就是模型对训练数据完美拟合的时候(过拟合),我们需要增加一些惩罚机制避免过拟合现象,即经验风险+正则惩罚,这个时候称为结构风险
ok,可能你看的云里雾里,来一张图醒醒神
上面三个图的函数依次为 f 1 ( x ) , f 2 ( x ) , f 3 ( x ) f_1(x),f_2(x),f_3(x) f1(x),f2(x),f3(x),真实Price记为 Y Y Y
给定一个
x
x
x,三个函数都会输出一个
f
(
x
)
f(x)
f(x),但是输出的结果不一定就与真实值相等,于是我们就需要一个函数去度量拟合的好坏,比如:
L
(
Y
,
f
(
x
)
)
=
(
Y
−
f
(
x
)
)
2
L(Y,f(x)) = (Y-f(x))^2
L(Y,f(x))=(Y−f(x))2
这个函数称为损失函数,当损失函数越小,代表模型拟合的越好。
同时,根据上面的经验风险的概念,此时的经验风险为:
1
N
∑
i
=
1
N
(
L
(
y
i
,
f
(
x
i
)
)
)
\frac{1}{N}\sum_{i=1}^N(L(y_i,f(x_i)))
N1i=1∑N(L(yi,f(xi)))
经验风险是针对整个模型数据集的,所以此时我们的目标就变成了如果使得经验风险最小化。
问题来了,上面图三经验风险最小,但是我们却不会用它
因为它的模型结构太复杂,产生了过拟合,我们需要增加一个函数来度量模型的复杂度——正则化
根据上面的概念,此时结构风险=经验风险+正则惩罚,即:
1
N
∑
i
=
1
N
(
L
(
y
i
,
f
(
x
i
)
)
)
+
λ
J
(
θ
)
\frac{1}{N}\sum_{i=1}^N(L(y_i,f(x_i))) + \lambda J(\theta)
N1i=1∑N(L(yi,f(xi)))+λJ(θ)
经验风险和结构风险都是针对整个数据集的,此时我们的目标变成了结构风险最小化+结构风险最小化,对应目标函数:
m
i
n
1
N
∑
i
=
1
N
(
L
(
y
i
,
f
(
x
i
)
)
)
+
λ
J
(
θ
)
min\frac{1}{N}\sum_{i=1}^N(L(y_i,f(x_i))) + \lambda J(\theta)
minN1i=1∑N(L(yi,f(xi)))+λJ(θ)
完事,总结一下
2.1 损失函数
损失函数:度量单样本预测的错误程度。损失函数越小,模型越好
常用的损失函数包括:绝对损失函数、平方损失函数、对数损失函数等
2.2. 代价函数
代价函数:度量全部样本集的平局误差。
常见的代价函数包括:均方误差、平均绝对误差、均方根误差等
2.3. 目标函数
目标函数:代价函数+正则化函数,有时候只有前半部分
模型最终的目标一定是:不仅要经验风险最小化,还要结构风险最小化
3. 算法求解
我们已经知道最终的优化目标:目标函数最小化。
通过求解目标函数计算出相应的参数值,从而最终得到我们的最优模型。
现在我们的目标函数是:
m
i
n
1
N
∑
i
=
1
N
(
L
(
y
i
,
f
(
x
i
)
)
)
+
λ
J
(
θ
)
min\frac{1}{N}\sum_{i=1}^N(L(y_i,f(x_i))) + \lambda J(\theta)
minN1i=1∑N(L(yi,f(xi)))+λJ(θ)
抛开后面的正则化先不说,我们需要计算前半部分,先将前半部分写成我们能看懂的形式:
L
o
s
s
=
1
N
∑
i
=
1
N
(
y
i
−
x
i
T
θ
)
2
Loss = \frac{1}{N}\sum_{i=1}^N(y_i-x_i^T\theta)^2
Loss=N1i=1∑N(yi−xiTθ)2
这不就是求解一个方程的极小值问题嘛,ok,来搞
3.1 最小二乘法
最小二乘法又叫最小平方法,主要思想就是选择未知参数,使得理论值与观测值之差的平方和达到最小
就像在上面定义的损失函数一样,就是通过最小二乘思想使得误差最小。
问题来了,如何求解最小误差对应的未知参数?
从单变量和多变量分别来说一下吧:
先来看单变量的最小二乘法求解
单变量下,我们的假设函数是y=ax+b,此时对应的损失函数为:
L
o
s
s
=
1
N
∑
i
=
1
N
(
y
i
−
(
a
x
i
+
b
)
)
2
)
Loss = \frac{1}{N}\sum_{i=1}^N(y_i-(ax_i+b))^2)
Loss=N1i=1∑N(yi−(axi+b))2)
我们的目标是通过找出合适的a、b使得Loss 最小(常数N可以先不考虑),这个时候可以直接用求极值的方法。
将Loss函数对a、b分别求偏导,并使得偏导结果为0,解出此时a、b的值,即为我们的参数目标值:
{
∂
L
∂
a
=
2
∑
i
=
1
N
(
y
i
−
(
a
x
i
+
b
)
)
(
−
x
i
)
∂
L
∂
b
=
2
∑
i
=
1
N
(
y
i
−
(
a
x
i
+
b
)
)
(
−
1
)
∂
L
∂
a
=
∂
L
∂
b
=
0
\begin{cases}\frac{\partial L}{\partial a}= 2 \sum_{i=1}^N(y_i-(ax_i+b))(-x_i) \\\frac{\partial L}{\partial b}= 2 \sum_{i=1}^N(y_i-(ax_i+b))(-1) \\\frac{\partial L}{\partial a} = \frac{\partial L}{\partial b} = 0\end{cases}
⎩⎪⎨⎪⎧∂a∂L=2∑i=1N(yi−(axi+b))(−xi)∂b∂L=2∑i=1N(yi−(axi+b))(−1)∂a∂L=∂b∂L=0
通过上面的方程组我们可以解得a、b的值,带入到原方程中即可求解
再来看多变量的最小二乘法求解
此时我们的损失函数变成了:
L
o
s
s
=
1
N
∑
i
=
1
N
(
y
i
−
x
i
T
θ
)
2
Loss = \frac{1}{N}\sum_{i=1}^N(y_i-x_i^T\theta)^2
Loss=N1i=1∑N(yi−xiTθ)2
这个可以写成矩阵的形式:
L
o
s
s
=
1
N
(
Y
−
X
θ
)
T
(
Y
−
X
θ
)
Loss = \frac{1}{N}(Y-X\theta)^T(Y-X\theta)
Loss=N1(Y−Xθ)T(Y−Xθ)
同样的我们求参数θ(此时的θ是个向量,常数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取偏导的结果 ∂ L ∂ a , ∂ L ∂ b \frac{\partial L}{\partial a} , \ \frac{\partial L}{\partial b} ∂a∂L, ∂b∂L
在梯度下降法中,我们需要计算在某一点对a、b的偏导,也就是
∂
L
∂
a
i
,
∂
L
∂
b
i
\frac{\partial L}{\partial a_i} , \ \frac{\partial L}{\partial b_i}
∂ai∂L, ∂bi∂L,同样的在该点会存在一个参数 α,它表示在梯度方向前进的步长,综合一下,在某一点参数a、b的更新为
{
a
i
=
a
i
−
α
∂
L
∂
a
i
b
i
=
b
i
−
α
∂
L
∂
b
i
\begin{cases}a_i = a_i-\alpha \frac{\partial L}{\partial a_i}\\b_i = b_i-\alpha \frac{\partial L}{\partial b_i}\\\end{cases}
{ai=ai−α∂ai∂Lbi=bi−α∂bi∂L
所以梯度下降的更新可以表示成这样一个表达式:
θ
i
=
θ
i
−
α
∂
L
(
θ
)
∂
θ
i
\theta_i = \theta_i-\alpha \frac{\partial L(\theta)}{\partial \theta_i}
θi=θi−α∂θi∂L(θ)
至于每一个点对a、b求偏导,在最小二乘法里面已经计算过了,不妨回过头去看一眼。
另外:往深的想一下,梯度下降法认为每一步的最优解合并起来就是最终的最优解,这样会导致最终结果可能并不是全局最优解
再来看多变量的梯度下降法求解
由于在多变量中我们的目标函数发生了变化,相应的对于梯度下降的更新也会发生变化
KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲\begin{split}&L…
忽略掉常数,我们可以得到:
θ
=
θ
−
α
⋅
(
y
i
−
x
i
T
θ
)
⋅
x
i
\theta = \theta-\alpha ·(y_i-x_i^T\theta)· x_i
θ=θ−α⋅(yi−xiTθ)⋅xi
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
1 m ∑ i = 1 m ( y i − y ^ i ) 2 \frac{1}{m}\sum_{i=1}^m(y^{i}-\hat y^{i})^2 m1i=1∑m(yi−y^i)2
MSE的值越小,说明预测模型的精确度越高
4.2. 均方根误差RMSE
1 m ∑ i = 1 m ( y i − y ^ i ) 2 \sqrt{\frac{1}{m}\sum_{i=1}^m(y^{i}-\hat y^{i})^2} m1i=1∑m(yi−y^i)2
相当于对MSE开根号,同越小越好
4.3. 平均绝对值误差MAE
1 m ∑ i = 1 m ∣ y i − y ^ i ∣ \frac{1}{m}\sum_{i=1}^m|y^{i}-\hat y^{i}| m1i=1∑m∣yi−y^i∣
效果同上
4.4. R Squared误差
R 2 = 1 − ∑ i = 1 m ( y i − y ^ i ) 2 ∑ i = 1 m ( y ‾ − y ^ i ) 2 R^2 = 1- \frac{\sum_{i=1}^m(y^{i}-\hat y^{i})^2}{\sum_{i=1}^m(\overline y-\hat y^{i})^2} R2=1−∑i=1m(y−y^i)2∑i=1m(yi−y^i)2
不同的是,这个的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. 实战项目
下节更新
写在后面的话
稍稍总结一下,回归模型的目的是预测数值型的目标值,像诸如房价预测,年龄预测等等都可以通过回归模型去解决。
当然了你要说分类模型可以解决吗?也可以的。不过各有所长,各有所短,医生诊断病情都得对症下药,我们解决问题也是要同样的道理的
本想着把线性回归涉及到的内容都统统列出来,毕竟是回归模型的开篇,后面学习其他高级的模型也会简单很多。
无奈坑实在太多(文中好多内容一笔带过),而且恰好是周内工作日,时间有点仓促,就只能放在下一篇了。
后面还有逻辑回归,也想着趁机理一理,写一写,等做完线性回归的项目就开搞
我是小一,第一步的一,下节见!