回归与度量
什么是回归
回归用于预测输入变量和输出变量之间的关系,当输入变量发生变化的时候,输出变量也随之发生变化。回归模型是输入到输出的一种映射函数。回归问题等价于函数拟合:选择一条函数曲线使其尽可能拟合当前数据的变化趋势,并能够对未来趋势作出预测
函数拟合问题
问题描述
许多工程问题需根据若干实验数据找到两个变量间函数关系的近似表达式,该表达式称为经验公式。根据少量实现数据找到经验数据的过程称为函数拟合。
例: 为了测量刀具的磨损速度,我们做以下实验:持续对刀具做磨损测试,每隔一个小时记录刀具的厚度,得到一组实验数据:
时间(小时) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
刀具厚度(毫米) | 27.0 | 26.8 | 26.5 | 26.3 | 26.1 | 25.7 | 25.3 | 24.8 |
表1
数据绘制为散点图如下所示:
图1
从图中我们可以看到刀片磨损速度和时间呈线性关系,我们假设磨损量和时间t具有如下线性关系。
f
(
t
)
=
a
t
+
b
f(t) = at + b
f(t)=at+b
公式1:假设模型
将公式1称为我们对实验数据分布的假设(模型),参数a,b称为模型的参数,确定模型参数的过程称之为训练。训练的目标是找到使模型最优的参数a,b。对于该问题在数学上有解析的方法得到a,b的最优解,我们称之为最小二乘法(曲线拟合问题)。
问题解决
-
确定评估方法(优化方法)
对于公式1中a,b的选择有很多种方法,那么如何确定哪种方法最优呢?我们可以想像一下有无数条直线通过这些样本点,最优的一条必然是和所有样本点结果偏差的和最小的,按照这个思路我们得到如下的评估公式:
l o s s ( f ) = ∑ i = 0 7 [ f ( t i ) − y i ] 2 loss(f) = \sum_{i=0}^{7} [f(t_i) - y_i]^2 loss(f)=i=0∑7[f(ti)−yi]2
$$
f = f(t_i)-y_i\
g = f^2\2[f(t_i)-y_i]*(at_i + b - y_i)^{’}\
2[f(t_i)-y_i]*t_i\
2[f(t_i)-y_i]\
$$公式2:损失函数
其中$ y_i 表 示 真 实 得 到 的 实 验 数 据 , 表示真实得到的实验数据, 表示真实得到的实验数据,f(t_i)$表示使用假设公式预测的数据。找到使公式2最小的a,b值的方法我们称之为最小二乘法
-
最小二乘问题的解法
按照极值问题的解法,使公式2取得最小值的a,b必然使其在极值点对于a,b的偏导数为0。对于公式2分别对a,b求偏导得到如下公式:
{ ∂ l o s s ∂ a = − 2 ∑ i = 0 7 [ y i − ( a t i + b ) ] t i ∂ l o s s ∂ b = − 2 ∑ i = 0 7 [ y i − ( a t i + b ) ] \left \{ \begin{array}{c} \cfrac{\partial loss}{\partial a} = -2\sum_{i=0}^{7}[y_i\ -\ (at_i + b)]t_i \\ \cfrac{\partial loss}{\partial b} = -2\sum_{i=0}^{7}[y_i\ -\ (at_i + b)] \\ \end{array} \right. ⎩⎪⎨⎪⎧∂a∂loss=−2∑i=07[yi − (ati+b)]ti∂b∂loss=−2∑i=07[yi − (ati+b)]
公式3:求解方程
对于公式3,使两个方程等于0合并整理可得:
KaTeX parse error: No such environment: align at position 17: …\left \{ \begin{̲a̲l̲i̲g̲n̲}̲ & a\sum_{i=0}^…
其中参数t为时间,参数y为实验得到的已知数据,将表1数据代入整理得到如下二元一次方程:
KaTeX parse error: No such environment: align at position 17: …\left \{ \begin{̲a̲l̲i̲g̲n̲}̲ & 140a + 28b =…
a x = b a ∗ a − 1 x = b ∗ a − 1 x = b ∗ a − 1 ax=b\\ a*a^{-1}x=b*a^{-1}\\ x = b*a^{-1} ax=ba∗a−1x=b∗a−1x=b∗a−1
import numpy as np
a = np.array([[140, 28],[28, 8]])
b = np.array([717,208.5])
np.linalg.inv(a).dot(b)
解得a= -0.3036,b=27.125,最终得到的回归模型为:
y
=
f
(
t
)
=
−
0.3036
t
+
27.125
y = f(t)=-0.3036t + 27.125
y=f(t)=−0.3036t+27.125
使用矩阵的观点重新审视回归问题
使用向量的概念对公式变形
a = [ x 1 , x 2 , x 3 , . . . , x n ] a ∗ a T = x 1 2 + x 2 2 + . . . + x n 2 = ∑ i = 0 n x i 2 a = [x_1, x_2,x_3,...,x_n]\\ a * a^T = x_1^{2} + x_2^{2} +...+ x_n^{2}=\sum_{i=0}^n x_i^2 a=[x1,x2,x3,...,xn]a∗aT=x12+x22+...+xn2=i=0∑nxi2
对于公式1 如果使用向量的形式表示我们可以得到如下的形式:
f
(
t
)
=
a
t
+
b
=
[
t
1
]
[
a
b
]
=
X
θ
f(t) = at + b =\begin{bmatrix} t & 1 \\ \end{bmatrix} \begin{bmatrix} a \\ b \\ \end{bmatrix} = X\theta
f(t)=at+b=[t1][ab]=Xθ
其中X表示训练数据集合, θ \theta θ 表示需要确定参数的向量形式
将损失函数按照向量表达并求导
按照这个思想公式2可以变形为如下形式:
l
o
s
s
(
f
)
=
1
2
∑
i
=
0
7
[
f
(
t
i
)
−
y
i
]
2
=
1
2
(
X
θ
−
y
)
T
(
X
θ
−
y
)
+
λ
θ
T
θ
loss(f) = \frac{1}{2}\sum_{i=0}^{7} [f(t_i) - y_i]^2 = \frac{1}{2}(X\theta - y)^T(X\theta - y) + \lambda\theta^T\theta
loss(f)=21i=0∑7[f(ti)−yi]2=21(Xθ−y)T(Xθ−y)+λθTθ
λ
θ
T
θ
=
∑
i
=
0
N
θ
i
2
\lambda\theta^T\theta = \sum_{i=0}^N \theta_i^2
λθTθ=i=0∑Nθi2
按照向量的观点对损失函数求导:
KaTeX parse error: No such environment: split at position 8: \begin{̲s̲p̲l̲i̲t̲}̲ \nabla loss_{…
(
A
B
)
T
=
B
T
A
T
(AB)^T = B^TA^T
(AB)T=BTAT
X T X θ − X T y + λ ∣ θ ∣ = 0 X T X θ + λ ∣ θ ∣ = X T y ( X T X + λ I ) θ = X T y X^TX\theta - X^Ty + \lambda |\theta| = 0 \\ X^TX\theta + \lambda |\theta| = X^Ty \\ (X^TX + \lambda I)\theta = X^Ty XTXθ−XTy+λ∣θ∣=0XTXθ+λ∣θ∣=XTy(XTX+λI)θ=XTy
公式4
令
∇
l
o
s
s
θ
=
0
\nabla loss_{\theta} = 0
∇lossθ=0 ,则可得到:
θ
=
(
X
T
X
)
−
1
X
T
y
\theta = (X^TX)^{-1}X^Ty
θ=(XTX)−1XTy
公式4
可以使用numpy代入表1的数据计算公式4可以得出和公式3一样的结果
使用更一般的观点看待线性回归
一般性问题的描述
传统的多变量线性回归可以表示成下面的形式:
f
(
X
,
θ
)
=
X
θ
=
θ
0
+
x
1
θ
1
+
x
2
θ
2
+
.
.
.
+
x
n
θ
n
f(X,\theta) = X\theta = \theta_0 + x_1\theta_1 + x_2\theta_2+...+x_n\theta_n
f(X,θ)=Xθ=θ0+x1θ1+x2θ2+...+xnθn
公式5
其中
θ
\theta
θ的维度是我们选择回归的特征个数。这个模型的自变量都是一次的,能解决的问题有很大的局限性,如果数据具有非线性的趋势,便不能得到很好的表达。将自变量扩展到高次的情况便得到了多项式回归。
f
(
X
,
θ
)
=
θ
0
+
θ
1
x
+
θ
2
x
2
+
.
.
.
+
θ
n
x
n
=
ϕ
(
X
)
θ
+
λ
1
2
θ
2
1
2
(
a
2
+
b
2
)
<
C
f(X,\theta) = \theta_0 + \theta_1x +\theta_2x^2 + ...+\theta_nx^n = \phi(X)\theta + \lambda \frac{1}{2}\theta^2 \\ \frac{1}{2} (a^2 + b^2) < C
f(X,θ)=θ0+θ1x+θ2x2+...+θnxn=ϕ(X)θ+λ21θ221(a2+b2)<C
其中
ϕ
(
X
)
=
[
1
,
x
,
x
2
,
.
.
.
,
x
n
]
\phi(X)=[1,x,x^2,...,x^n]
ϕ(X)=[1,x,x2,...,xn] ,
θ
=
[
θ
0
,
θ
1
,
θ
2
,
.
.
.
,
θ
n
]
T
\theta = [\theta_0,\theta_1,\theta_2,...,\theta_n]^T
θ=[θ0,θ1,θ2,...,θn]T ,将
ϕ
(
X
)
\phi(X)
ϕ(X)称为基函数,这里我们选用了多项式基函数。选用不同的基函数能解决更为广泛的问题。
算法如何解决一般性的回归问题
对于实际的线性回归问题我们需要考虑的特征数量及数据规模往往很大,使用第一小节构建方程的方式往往不能解析的得到模型最优参数的解(公式3无解),或者方程规模非常大,造成计算量特别大。必须找到一种适合计算机来执行的方法,这里我们往往使用梯度下降算法
梯度下降算法
梯度下降是一种通用的优化算法,能够为大范围的问题找到最优解。梯度下降的中心思想就是迭代地调整参数从而使成本函数最小化。
假设你迷失在山上的浓雾之中,你能感觉到的只有你脚下路面的坡度。快速到达山脚的一个策略就是沿着最陡的方向下坡。这就是梯度下降的做法:通过测量参数向量 θ,θ 相关的误差函数的局部梯度,并不断沿着降低梯度的方向调整,直到梯度降为0,到达最小值!如下图:
图片2
想象上图是 c o s t = θ 2 cost=\theta^2 cost=θ2的图像,梯度下降是按照如下方法进行最小值的搜索,而不是解析的求解.
- 随机生成一个搜索起点,例如:search_point= -8(第一次对应上图random initial value),其中
θ
^
\hat\theta
θ^为0点。
- 求出search_point的梯度(单变量相当于斜率), c o s t ′ cost^{'} cost′=2x,得到斜率k=2 * search_point
- 以步长 α = 0.1 \alpha = 0.1 α=0.1向负梯度方向搜索,得到next_point = search_point - k * α \alpha α
- 如果cost(next_point) - cost(search_point) > 终止条件(一个很小的数,如0.0001),则search_point=next_point,跳转到2继续搜索,否则跳转到5
- 结束,输出search_point,即为最小值点
from sklearn.metrics import r2_score
# r2_score 公式
R 2 = 1 − ∑ i = 0 n ( y i − y i ^ ) 2 ∑ i = 0 n ( y i − y ˉ ) 2 R2 = 1 - \frac{\sum_{i=0}^{n}(y_i - \hat{y_i})^2}{\sum_{i=0}^{n}(y_i - \bar{y})^2} R2=1−∑i=0n(yi−yˉ)2∑i=0n(yi−yi^)2
应用梯度下降到一般线性问题
现实问题的损失函数往往不是单变量,且数据规模较大,使用迭代的方法才能达到较好的效果,如果想使损失函数最小,可以使损失函数的参数向负梯度的方向变化。如何求出梯度,如下:
∂
l
o
s
s
(
θ
)
∂
θ
j
=
2
m
∑
i
=
1
m
(
θ
T
X
(
i
)
−
y
(
i
)
)
x
j
(
i
)
\frac{\partial loss(\theta)}{\partial \theta_j} = \frac{2}{m}\sum_{i=1}^{m}(\theta^TX^{(i)} - y^{(i)} )x_j^{(i)}
∂θj∂loss(θ)=m2i=1∑m(θTX(i)−y(i))xj(i)
公式6
∇
l
o
s
s
(
θ
)
=
[
∂
l
o
s
s
(
θ
)
∂
θ
0
∂
l
o
s
s
(
θ
)
∂
θ
1
⋮
∂
l
o
s
s
(
θ
)
∂
θ
n
]
=
2
m
X
T
(
X
θ
−
Y
)
\nabla loss(\theta) = \begin{bmatrix} \frac{\partial loss(\theta)}{\partial \theta_0}\\ \frac{\partial loss(\theta)}{\partial \theta_1} \\\vdots\\ \frac{\partial loss(\theta)}{\partial \theta_n} \end{bmatrix} = \frac{2}{m}X^T(X\theta - Y)
∇loss(θ)=⎣⎢⎢⎢⎢⎡∂θ0∂loss(θ)∂θ1∂loss(θ)⋮∂θn∂loss(θ)⎦⎥⎥⎥⎥⎤=m2XT(Xθ−Y)
公式7
将公式6中对各个分量的求导的结果组合成向量的形式便是公式7。计算出了梯度我们就可以按照上一小节的步骤构建梯度下降算法。第3步的更新公式变为如下:
θ
n
e
x
t
_
s
t
e
p
=
θ
c
u
r
r
e
n
t
−
∇
l
o
s
s
(
θ
)
∗
α
\theta_{next\_step} = \theta_{current} - \nabla loss(\theta) * \alpha
θnext_step=θcurrent−∇loss(θ)∗α
随机梯度下降(SGD)
大家实现上述梯度下降算法的时候会发现一个问题,每次计算梯度需要使用全部数据,如果数据量特别大的时候,这会严重降低效率。为了加快计算效率,我们将公式6中的求和符号去掉,每次只使用一个数据计算梯度,公式如下:
∂
l
o
s
s
(
θ
)
∂
θ
j
=
(
θ
T
X
(
i
)
−
y
(
i
)
)
x
j
(
i
)
+
θ
\frac{\partial loss(\theta)}{\partial \theta_j} = (\theta^TX^{(i)} - y^{(i)} )x_j^{(i)} + \theta
∂θj∂loss(θ)=(θTX(i)−y(i))xj(i)+θ
公式8
其中的上标i表示我们使用第i个样本计算梯度,该样本使用随机抽样的方式产生,所以称为随机梯度下降。随机梯度下降和传统梯度下降相比具有如下优缺点:
优点:
(1)由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快。
缺点:
(1)准确度下降。由于即使在目标函数为强凸函数的情况下,SGD仍旧无法做到线性收敛。
(2)可能会收敛到局部最优,由于单个样本并不能代表全体样本的趋势。
(3)不易于并行实现。
批量梯度下降
批量梯度下降是传统梯度下降和随机梯度下降的折中方案,每次计算数据使用样本中随机选取的一部分数据,而不是使用全部的数据。公式如下:
∂
l
o
s
s
(
θ
)
∂
θ
j
=
2
10
∑
0
9
(
θ
T
X
(
i
)
−
y
(
i
)
)
x
j
(
i
)
\frac{\partial loss(\theta)}{\partial \theta_j} = \frac{2}{10}\sum_{0}^{9}(\theta^TX^{(i)} - y^{(i)} )x_j^{(i)}
∂θj∂loss(θ)=1020∑9(θTX(i)−y(i))xj(i)
公式9
考虑每次随机取出10个数据进行训练,使用的公式如公式9所示,其中10称为batch size,可以根据实际情况进行设定。
模型的选择与正则化
机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作 **ℓ 1 -norm 和 **ℓ 2 -norm,中文称作 L1正则化 和 L2正则化,或者 L1范数 和 L2范数。
L1正则化和L2正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些参数做一些限制。对于线性回归模型,使用L1正则化的模型建叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归)。下图是Python中Lasso回归的损失函数,式中加号后面一项α ∣ ∣ w ∣ ∣ 1 \alpha||w||_1α∣∣w∣∣1即为L1正则化项。
一般回归分析中w ww表示特征的系数,从上式可以看到正则化项是对系数做了处理(限制)。L1正则化和L2正则化的说明如下:
- L1正则化是指权值向量w ww中各个元素的绝对值之和
- L2正则化是指权值向量w ww中各个元素的平方和然后再求平方根
L1正则化和L2正则化的作用:
- L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择
- L2正则化可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合
拉格朗日优化(最优化理论)
m i n l o s s ( f ) = ∑ i m ( ( a t i + b ) − y i ) L 2 范 数 ( 把 搜 索 范 围 锁 定 在 一 个 圆 范 围 ) : s . t . 1 2 ( a 2 + b 2 ) < C L 1 范 数 ( 把 搜 索 范 围 锁 定 在 一 个 矩 形 范 围 ) : s . t . 1 2 ( ∣ a ∣ + ∣ b ∣ ) < C min \quad loss(f) = \sum_i^m((at_i + b) - y_i) \\ L2范数(把搜索范围锁定在一个圆范围):\\ s.t. \frac{1}{2} (a^2 + b^2) < C \\ L1范数(把搜索范围锁定在一个矩形范围):\\ s.t. \frac{1}{2} (|a|+|b|) < C minloss(f)=i∑m((ati+b)−yi)L2范数(把搜索范围锁定在一个圆范围):s.t.21(a2+b2)<CL1范数(把搜索范围锁定在一个矩形范围):s.t.21(∣a∣+∣b∣)<C
L ( a , b , λ ) = ∑ i m ( ( a t i + b ) − y i ) + λ 1 2 ( a 2 + b 2 ) L(a,b,\lambda) = \sum_i^m((at_i + b) - y_i) + \lambda \frac{1}{2} (a^2 + b^2) L(a,b,λ)=i∑m((ati+b)−yi)+λ21(a2+b2)
交叉验证
8 = 2 * 2 *2
9= 3 * 3
18 = 2 * 3 *3
N ( 0 , 1 ) N ( μ , σ 2 ) N(0,1) \\ N(\mu,\sigma^2) N(0,1)N(μ,σ2)
θ 0 + θ 1 x 1 + θ 2 x 2 2 + . . . . . . . . \theta_0 + \theta_1x_1 + \theta_2x_2^2 +........ θ0+θ1x1+θ2x22+........
X T X θ − X T y = 0 X T X θ + λ θ = X T y θ = ( X T X ) − 1 X T y X^TX\theta - X^Ty = 0 \\ X^TX\theta + \lambda \theta = X^Ty \\ \theta = (X^TX)^{-1}X^Ty XTXθ−XTy=0XTXθ+λθ=XTyθ=(XTX)−1XTy
θ = [ θ 1 , θ 2 , θ 3 , θ 4 , θ 5 . . . . . . ] \theta = [\theta_1,\theta_2,\theta_3,\theta_4,\theta_5......] θ=[θ1,θ2,θ3,θ4,θ5......]
[1,0,3,2] ---->
[
1
,
0
,
3
,
2
]
−
−
−
−
>
x
3
+
0
∗
x
2
+
3
x
+
2
[1,0,3,2] ----> x^3 + 0 * x^2 + 3x + 2
[1,0,3,2]−−−−>x3+0∗x2+3x+2
1 2 π σ e x p − ( x − μ ) 2 2 σ \frac{1}{\sqrt{2\pi}\sigma}exp^{-\frac{(x-\mu)^2}{2\sigma}} 2πσ1exp−2σ(x−μ)2
X + Y+Z = 0
X+Y + 3z = 5
z = 1
x + y = -2.5
Γ μ σ \Gamma \\ \mu \\ \sigma Γμσ
[80,90,60] [90,88,90] [88,89,90]
40
20 20
20 10
20 5
25
15 13 2
行 真实结果
列 预测结果
精确度对预测结果而言
预测结果
P N
真实结果 P TP FN
N FP TN
召回率(覆盖率) = TP/(TP+FN)
精确度 = TP/(TP+FP)
f1_score
a x 2 + b x + c ax^2 + bx +c ax2+bx+c
0.000001 x 2 + b x + c 0.000001x^2 + bx + c 0.000001x2+bx+c
信息: 对不确定性的表达,不确定性越大,信息量越大
等概率的情况下
bit
中国:性别 = {男,女}
美国: 性别 = {男,女,其他}
P(男) + P(女) = 1
P(男) + P(女) + P(其他) = 1
-
P(男) * logP(男) + P(女)*logP(女))
-
(P(男) * logP(男) + P(女)*logP(女) + P(其他)*logP(其他))
男 女 其他
01
10
11
摩尔斯码
ID3
样本类别 = {Yes,No}
H(X) - H(X|Y)
10 - 1 = 9
H(Play) - H(Play|Outlook)
温度 湿度 风力 play
hot h f n
hot h t n
mild h f n
cool n f yes
milt n t yes
P(play_n) = 3/5
P(play_y) = 2/5
温度 风力 play
hot f n
hot t n
mild f n
温度 风力 play
cool n yes
milt n yes