什么是回归算法
- 回归算法是一种有监督算法
- 回归算法是一种比较常用的机器学习算法,用来建立“解释”变量(自变量X)和观测值 (因变量Y)之间的关系; 从机器学习的角度来讲,用于构建一个**算法模型(函数)**来做属性 ( X ) (X) (X) 与标签 ( Y ) (Y) (Y) 之间的映射关系,在算法的学习过程中,试图寻找一个函数 h : R d − > R h: R^d->R h:Rd−>R 使得参数之间的关系拟合性最好。
- 回归算法中算法(函数)的最终结果是一个连续的数据值,输入值(属性值)是一个d维度的属性/数值向量
线性回归
给定由
d
d
d 个属性描述的示例
x
=
(
x
1
;
x
2
;
…
;
x
d
)
\boldsymbol{x}=\left(x_1 ; x_2 ; \ldots ; x_d\right)
x=(x1;x2;…;xd), 其中
x
i
x_i
xi 是
x
\boldsymbol{x}
x 在第
i
i
i 个属性上的取值, 线性模型(linear model)试图学得一个通过属性的线性组合来进行预测的函数, 即
f
(
x
)
=
θ
1
x
1
+
θ
2
x
2
+
…
+
θ
d
x
d
+
b
f(\boldsymbol{x})=\theta_1 x_1+\theta_2 x_2+\ldots+\theta_d x_d+b
f(x)=θ1x1+θ2x2+…+θdxd+b
一般用向量形式写成(为提高可读性, 我们通常用
θ
0
\theta_0
θ0代替b)
f
(
x
)
=
θ
T
x
f(\boldsymbol{x})=\boldsymbol{\theta}^{\mathrm{T}} \boldsymbol{x}
f(x)=θTx
其中 θ T = ( θ 0 ; θ 1 ; θ 2 ; … ; θ d ; ) \boldsymbol{\theta^T}=\left(\theta_0;\theta_1 ; \theta_2 ; \ldots ; \theta_d;\right) θT=(θ0;θ1;θ2;…;θd;), 当我们把 θ 0 \theta_0 θ0加入到 θ T \theta^T θT之后,我们也需要在特征矩阵上新开一个全为1的列, 用于与 θ 0 ( 即截距项 b ) \theta_0(即截距项b) θ0(即截距项b)结合。于是 x = ( 1 ; x 1 ; x 2 ; … ; x d ) \boldsymbol{x}=\left(1;x_1 ; x_2 ; \ldots ; x_d\right) x=(1;x1;x2;…;xd)。当 θ \theta θ 学得之后, 模型就得以确定。
线性回归的目的是通过拟合一个线性模型来预测一个因变量(或称为目标变量)与一个或多个自变量(或称为特征)之间的关系。它的目标是找到最佳的超平面(也称为回归线),使得拟合的模型能够最好地捕捉因变量与自变量之间的线性关系。
具体来说,线性回归通过最小化实际观测值与回归线预测值之间的残差(误差)来确定最佳拟合线。这意味着它试图使训练集中的样本与回归线之间的残差最小化。
线性回归最终的要求是计算得出θ(包含截距项b)的值, 并选择最优的θ构成算法公式
线性模型形式简单、易于建模, 但却蕴含着机器学习中一些重要的基本思想。许多功能更为强大的非线性模型(nonlinear model)刻在线性模型的基础上通过引入层级结构或高维映射而得。此外, 由于 θ \theta θ直观表达了个属性在预测中的重要性, 因此线性模型有很好的可解释性(comprehensibility)。
线性回归:
- 优点:结果易于理解, 计算上不复杂。
- 缺点:对非线性的数据拟合不好。
- 适用数据类型:数值型和标称型数据。
一元回归
y
=
a
x
+
b
y=ax+b
y=ax+b
房屋面积
(
m
∧
2
)
租赁价格(1000
¥
)
10
0.8
15
1
20
1.8
30
2
50
3.2
60
3
60
3.1
70
3.5
\begin{array}{ll} \hline \text { 房屋面积 }\left(\mathbf{m}^{\wedge} 2\right) & \text { 租赁价格(1000 } ¥) \\ \hline 10 & 0.8 \\ 15 & 1 \\ 20 & 1.8 \\ 30 & 2 \\ 50 & 3.2 \\ 60 & 3 \\ 60 & 3.1 \\ 70 & 3.5 \end{array}
房屋面积 (m∧2)1015203050606070 租赁价格(1000 ¥)0.811.823.233.13.5
斜率 a 和截距 b 是由有监督学习的算法学到的参数,所以我们称之为学习参数。
多元回归
h
(
x
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
h(x)=\theta_0+\theta_1x_1+\theta_2x_2
h(x)=θ0+θ1x1+θ2x2
房屋面积
房间数量
租赁价格
10
1
0.8
15
1
1.0
20
1
1.8
30
1
2.0
50
2
3.2
60
1
3.0
60
2
3.1
70
2
3.5
…
…
…
…
…
…
.
\begin{array}{lll} \text { 房屋面积 } & \text { 房间数量 } & \text { 租赁价格 } \\ \hline 10 & 1 & 0.8 \\ 15 & 1 & 1.0 \\ 20 & 1 & 1.8 \\ 30 & 1 & 2.0 \\ 50 & 2 & 3.2 \\ 60 & 1 & 3.0 \\ 60 & 2 & 3.1 \\ 70 & 2 & 3.5 \\ \ldots \ldots & \ldots \ldots & \ldots \ldots . \end{array}
房屋面积 1015203050606070…… 房间数量 11112122…… 租赁价格 0.81.01.82.03.23.03.13.5…….
h θ ( x ) = θ 0 + θ 1 x 1 + ⋯ + θ n x n = θ 0 1 + θ 1 x 1 + ⋯ + θ n x n = θ 0 x 0 + θ 1 x 1 + ⋯ + θ n x n = ∑ i = 0 n θ i x i = θ T x \begin{aligned} h_\theta(x)& \begin{aligned}=\theta_0+\theta_1x_1+\cdots+\theta_nx_n\end{aligned} \\ &=\theta_01+\theta_1x_1+\cdots+\theta_nx_n \\ &=\theta_0x_0+\theta_1x_1+\cdots+\theta_nx_n \\ &=\sum_{i=0}^n\theta_ix_i=\theta^Tx \\ \end{aligned} hθ(x)=θ0+θ1x1+⋯+θnxn=θ01+θ1x1+⋯+θnxn=θ0x0+θ1x1+⋯+θnxn=i=0∑nθixi=θTx
最终要求是计算出 θ \theta θ的值,并选择最优的 θ \theta θ值构成算法公式
- 基本假设:我们认为数据中存在线性关系,也就是特征属性X和目标属性Y之间的关系是满足线性关系。
- 在线性回归算法中,找出的模型对象是期望所有训练数据比较均匀的分布在直线或者平面的两侧。
- 在线性回归中,最优模型也就是所有样本(训练数据)离模型的直线或者平面距离之和最小。
线性回归算法一般使用一个及以上的特征变量创建模型, 其中独立的特征变量只有一个时的线性回归就叫作一元回归。
独立特征变量为两个及以上时的线性回归叫做多元回归。另外, 尽管独立特征变量只有一个, 但如果包含 x 2 、 x 3 x^2、x^3 x2、x3这种特征变量的次方项的线性回归就叫做多项式回归 。表1-1列出了一元回归、多元回归、多项式回归的例子, 图1-2展示了与这些例子相应的图形。多项式回归对于特征变量 x i x_i xi来说不是线性的, 所以把它称之为“线性”回归可能让人觉得不太合适。
但是, 是否是线性回归并不是从特征变量上来看的。而是从学习参数(在这个例子中是 x 1 2 x_1^2 x12和 x 1 x_1 x1的系数)的角度来看是线性的回归(我们可以把目标属性值与学习参数、特征变量的关系的看作 y = θ T X y=\theta^TX y=θTX向量化的形式;其中 θ \theta θ是参数向量, X是特征矩阵), 所以我们才统一称之为线性回归, 所以多项式回归也属于线性回归。
表1-1:各种线性回归的例子
线性回归的种类 示 例 一元回归 y = w 0 + w 1 x 1 多元回归 y = w 0 + w 1 x 1 + w 2 x 2 多项式回归 y = w 0 + w 1 x 1 + w 2 x 1 2 \begin{array}{c|c} \hline \text { 线性回归的种类 } & \text { 示 } \text { 例 } \\ \hline \text { 一元回归 } & y=w_0+w_1 x_1 \\ \hline \text { 多元回归 } & y=w_0+w_1 x_1+w_2 x_2 \\ \hline \text { 多项式回归 } & y=w_0+w_1 x_1+w_2 x_1^2 \end{array} 线性回归的种类 一元回归 多元回归 多项式回归 示 例 y=w0+w1x1y=w0+w1x1+w2x2y=w0+w1x1+w2x12
图1-2:各种线性回归的例子
下面再看一下非线性回归的例子。图 1-3 是 y = e w 1 x 1 y=\mathrm{e}^{w_1 x_1} y=ew1x1 和 y = 1 / ( w 1 x 1 + 1 ) y=1 /\left(w_1 x_1+1\right) y=1/(w1x1+1) 的图形。这些函数中的学习参数 w 1 w_1 w1 和目标变量 y y y 之间的关系不是线性关系(它们无法用 y = θ T X y=\theta^TX y=θTX这种向量化的形式表示),所以被分类为非线性回归。
图1-3:非线性回归的例子
算法中根据训练数据计算使损失最小的参数的做法是有监督学习算法的共同之处
最小二乘
也就是说我们线性回归模型最优的时候是所有样本的预测值和实际值之间的差值最小化,由于预测值和实际值之间的差值存在正负性,所以要求平方后的值最小化。也就是可以得到如下的一个目标函数:
J
(
θ
)
=
1
2
∑
i
=
1
m
(
ε
(
i
)
)
2
=
1
2
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J(\theta)=\frac{1}{2} \sum_{i=1}^m\left(\varepsilon^{(i)}\right)^2=\frac{1}{2} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2
J(θ)=21i=1∑m(ε(i))2=21i=1∑m(hθ(x(i))−y(i))2
回归算法理性认识
- 房价的预测
房屋面积 ( m ∧ 2 ) 租赁价格(1000 ¥ ) 10 0.8 15 1 20 1.8 30 2 50 3.2 60 3 60 3.1 70 3.5 \begin{array}{ll} \text { 房屋面积 }\left(\mathbf{m}^{\wedge} \mathbf{2}\right) & \text { 租赁价格(1000 } ¥) \\ 10 & 0.8 \\ 15 & 1 \\ 20 & 1.8 \\ 30 & 2 \\ 50 & 3.2 \\ 60 & 3 \\ 60 & 3.1 \\ 70 & 3.5 \end{array} 房屋面积 (m∧2)1015203050606070 租赁价格(1000 ¥)0.811.823.233.13.5
线性回归、最大似然估计及二乘法
y ( i ) = θ T x ( i ) + ε ( i ) y^{(i)}=\theta^T x^{(i)}+\varepsilon^{(i)} y(i)=θTx(i)+ε(i)
- 误差
ε
(
i
)
(
1
≤
i
≤
n
)
\varepsilon^{(\mathrm{i})}(1 \leq i \leq n)
ε(i)(1≤i≤n) 是独立同分布的,服从均值为 0 ,方差为某定值
σ
2
\sigma^2
σ2 的高斯分布。
- 原因:中心极限定理
- 实际问题中,很多随机现象可以看做众多因素的独立影响的综合反应,并且这些随机现象往往都服从正态分布
似然函数
y ( i ) = θ T x ( i ) + ε ( i ) p ( ε ( i ) ) = 1 σ 2 π e ( − ( ε ( i ) ) 2 2 σ 2 ) p ( y ( i ) ∣ x ( i ) ; θ ) = 1 σ 2 π exp ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) L ( θ ) = ∏ i = 1 m p ( y ( i ) ∣ x ( i ) ; θ ) = ∏ i = 1 m 1 σ 2 π exp ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) \begin{gathered} y^{(i)}=\theta^T x^{(i)}+\varepsilon^{(i)}\\ p\left(\varepsilon^{(i)}\right)=\frac{1}{\sigma \sqrt{2 \pi}} e^{\left(-\frac{\left(\varepsilon^{(i)}\right)^2}{2 \sigma^2}\right)} \\ p\left(y^{(i)} \mid x^{(i)} ; \theta\right)=\frac{1}{\sigma \sqrt{2 \pi}} \exp \left(-\frac{\left(y^{(i)}-\theta^T x^{(i)}\right)^2}{2 \sigma^2}\right) \\ L(\theta)=\prod_{i=1}^m p\left(y^{(i)} \mid x^{(i)} ; \theta\right) \\ \quad\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\prod_{i=1}^m \frac{1}{\sigma \sqrt{2 \pi}} \exp \left(-\frac{\left(y^{(i)}-\theta^T x^{(i)}\right)^2}{2 \sigma^2}\right) \end{gathered} y(i)=θTx(i)+ε(i)p(ε(i))=σ2π1e(−2σ2(ε(i))2)p(y(i)∣x(i);θ)=σ2π1exp(−2σ2(y(i)−θTx(i))2)L(θ)=i=1∏mp(y(i)∣x(i);θ) =i=1∏mσ2π1exp(−2σ2(y(i)−θTx(i))2)
对数似然、目标函数及最小二乘
ℓ ( θ ) = ln L ( θ ) = ln ∏ i = 1 m 1 σ 2 π exp ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) = ∑ i = 1 m ln 1 σ 2 π exp ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) = m ln 1 σ 2 π − 1 σ 2 ∙ 1 2 ∑ i = 1 m ( y ( i ) − θ T x ( i ) ) 2 l o s s ( y j , y ^ j ) = J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 \begin{aligned} &\ell\left(\theta\right)=\ln L\left(\theta\right) \\ &=\ln\prod_{i=1}^m\frac1{\sigma\sqrt{2\pi}}\exp\left(-\frac{\left(y^{(i)}-\theta^Tx^{(i)}\right)^2}{2\sigma^2}\right) \\ &=\sum_{i=1}^m\ln\frac1{\sigma\sqrt{2\pi}}\exp\left(-\frac{\left(y^{(i)}-\theta^Tx^{(i)}\right)^2}{2\sigma^2}\right) \\ &=m\ln\frac1{\sigma\sqrt{2\pi}}-\frac1{\sigma^2}\bullet\frac12\sum_{i=1}^m\left(y^{(i)}-\theta^Tx^{(i)}\right)^2 \\ \\ &loss(y_j,\widehat{y}_j)=J\big(\theta\big){=}\frac{1}{2}\sum_{i=1}^{m}\big(h_{\theta}\big(x^{(i)}\big){-}y^{(i)}\big)^2 \end{aligned} ℓ(θ)=lnL(θ)=lni=1∏mσ2π1exp(−2σ2(y(i)−θTx(i))2)=i=1∑mlnσ2π1exp(−2σ2(y(i)−θTx(i))2)=mlnσ2π1−σ21∙21i=1∑m(y(i)−θTx(i))2loss(yj,y j)=J(θ)=21i=1∑m(hθ(x(i))−y(i))2
θ \theta θ的求解过程——最小二乘法
J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 = 1 2 ( X θ − Y ) T ( X θ − Y ) → min θ J ( θ ) ∇ θ J ( θ ) = ∇ θ ( 1 2 ( X θ − Y ) T ( X θ − Y ) ) = ∇ θ ( 1 2 ( θ T X T − Y T ) ( X θ − Y ) ) = ∇ θ ( 1 2 ( θ T X T X θ − θ T X T Y − Y T X θ + Y T Y ) ) = 1 2 ( 2 X T X θ − X T Y − ( Y T X ) T ) = X T X θ − X T Y θ = ( X T X ) − 1 X T Y \begin{aligned} & J(\theta)=\frac{1}{2} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2=\frac{1}{2}(X \theta-Y)^T(X \theta-Y) \rightarrow \min _\theta J(\theta) \\ & \begin{aligned} \nabla_\theta J(\theta) & =\nabla_\theta\left(\frac{1}{2}(X \theta-Y)^T(X \theta-Y)\right)=\nabla_\theta\left(\frac{1}{2}\left(\theta^T X^T-Y^T\right)(X \theta-Y)\right) \\ & =\nabla_\theta\left(\frac{1}{2}\left(\theta^T X^T X \theta-\theta^T X^T Y-Y^T X \theta+Y^T Y\right)\right) \\ & =\frac{1}{2}\left(2 X^T X \theta-X^T Y-\left(Y^T X\right)^T\right) \\ & =X^T X \theta-X^T Y \\ \theta= & \left(X^T X\right)^{-1} X^T Y \end{aligned} \end{aligned} J(θ)=21i=1∑m(hθ(x(i))−y(i))2=21(Xθ−Y)T(Xθ−Y)→θminJ(θ)∇θJ(θ)θ==∇θ(21(Xθ−Y)T(Xθ−Y))=∇θ(21(θTXT−YT)(Xθ−Y))=∇θ(21(θTXTXθ−θTXTY−YTXθ+YTY))=21(2XTXθ−XTY−(YTX)T)=XTXθ−XTY(XTX)−1XTY
最小二乘法的参数最优解
- 参数解析式
θ = ( X T X ) − 1 X T Y \theta=\left(X^T X\right)^{-1} X^T Y θ=(XTX)−1XTY - 最小二乘法的使用要求矩阵
X
T
X
X^T X
XTX 是可逆的;为了防止不可逆或者过拟合的问题存在,可以增加额外数据影响,导致最终的矩阵是可逆的:
θ = ( X T X + λ I ) − 1 X T y \theta=\left(X^T X+\lambda I\right)^{-1} X^T y θ=(XTX+λI)−1XTy - 最小二乘法直接求解的难点:矩阵逆的求解是一个难处
目标函数(loss / cost function)
表示误差和学习参数之间关系的函数叫作误差函数(或损失函数)
- 0-1损失函数 J ( θ ) = { 1 , Y ≠ f ( X ) 0 , Y = f ( X ) J(\theta)=\left\{\begin{array}{l}1, Y \neq f(X) \\ 0, Y=f(X)\end{array}\right. J(θ)={1,Y=f(X)0,Y=f(X)
- 感知器损失函数 J ( θ ) = { 1 , ∣ Y − f ( X ) ∣ > t 0 , ∣ Y − f ( X ) ∣ ≤ t J(\theta)=\left\{\begin{array}{l}1,|Y-f(X)|>t \\ 0,|Y-f(X)| \leq t\end{array}\right. J(θ)={1,∣Y−f(X)∣>t0,∣Y−f(X)∣≤t
- 平方和损失函数 J ( θ ) = ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta)=\sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2 J(θ)=∑i=1m(hθ(x(i))−y(i))2
- 绝对值损失函数 J ( θ ) = ∑ i = 1 m ∣ h θ ( x ( i ) ) − y ( i ) ∣ J(\theta)=\sum_{i=1}^m\left|h_\theta\left(x^{(i)}\right)-y^{(i)}\right| J(θ)=∑i=1m hθ(x(i))−y(i)
- 对数损失函数 J ( θ ) = − ∑ i = 1 m ( y ( i ) log h θ ( x ( i ) ) ) J(\theta)=-\sum_{i=1}^m\left(y^{(i)} \log h_\theta\left(x^{(i)}\right)\right) J(θ)=−∑i=1m(y(i)loghθ(x(i)))
在线性回归中, 我们一般使用平方和损失函数, 即均方误差MSE
模型函数(将一个向量x映射为一个目标值y_hat)
y ^ = θ T ⋅ x \hat{y}=\theta^T\cdot x y^=θT⋅x
线性回归中我们目前的目标函数是最小二乘法所对应的误差函数, 在目标函数中我们的未知数是θ, 而在模型函数中, 它其实已经构建了一个模型、已经训练出了模型, 同理我们就已经得出了模型的参数, 所以模型函数所要做的事情就是将我们的样本x映射为它所对应的目标值, 而模型函数中的x对应的就是待预测的新样本, 所以对于模型函数来说, 它所对应的未知数就是x。
多项式拓展–对特征进行升维
多项式拓展(Polynomial Expansion) 的根本目的是通过创建原始特征的高阶组合,来扩展特征空间,从而增强机器学习模型的表达能力。它可以用于线性模型和非线性模型,目的是引入更多的特征信息,以更好地捕获输入特征之间的非线性关系。
多项式拓展通过将原始特征进行组合,生成新的特征。例如,对于一个二维特征 ( x 1 , x 2 ) (x_1, x_2) (x1,x2),多项式拓展可以生成包括原始特征和其组合的新特征,如 ( 1 , x 1 , x 2 , x 1 2 , x 1 x 2 , x 2 2 ) (1, x_1, x_2, x_1^2, x_1x_2, x_2^2) (1,x1,x2,x12,x1x2,x22)。通过引入这些高阶特征,我们可以更好地拟合非线性问题,并提高模型的预测能力。
多项式拓展有几个重要的作用:
-
引入非线性关系:原始特征往往无法直接表示复杂的非线性关系。通过多项式拓展,我们可以引入原始特征之间的交叉项和高阶项,从而使模型能够更好地拟合非线性关系。
-
增强模型表达能力:多项式拓展增加了特征空间的维度,在高维空间中,模型更有可能找到更好的决策边界,提高模型的拟合能力。
-
解决欠拟合问题:当原始特征无法提供足够的信息来拟合数据时,多项式拓展可以通过引入更多的特征信息来解决欠拟合问题。
值得注意的是,多项式拓展会增加特征的数量,可能导致维度灾难(curse of dimensionality)和计算复杂度增加。因此,在使用多项式拓展时,要谨慎选择合适的特征组合和拓展的阶数,以避免过度拟合问题。
总的来说,多项式拓展的根本目的是通过引入原始特征的高阶组合,增强模型的表达能力,以更好地拟合数据中的非线性关系。
对原本不遵循线性分布的数据强行进行线性回归也得不到好的结果。我们在拿到数据之后, 应首先对数据进行可视化, 如果发现特征空间中的样本不是线性分布的, 那么我们就使用多项式拓展来解决非线性问题。
正则化
正则化是防止过拟合的一种方法, 与线性回归等算法配合使用。通过向损失函数增加惩罚项的方式对模型施加制约, 有望提高模型的泛化能力。
概述
正则化是防止过拟合的方法, 用于机器学习模型的训练阶段。过拟合是模型在验证数据上产生的误差比在训练数据上产生的误差(训练误差)大得多的现象。过拟合的一个原因是因为机器学习模型过于复杂。正则化可以降低模型的复杂度, 有助于提高模型的泛化能力。
复杂模型过拟合的一个原因是学习参数 θ \theta θ的值太大(或太小)。当学习参数过大, 模型可能会在训练数据上表现得非常好,但在新数据上的泛化能力却很差。这是因为模型过度适应了训练数据的噪声和细节,而忽略了数据中的真实模式。类似地,如果参数值过小,模型也可能无法捕获数据的真实模式,导致欠拟合。而使用正则化就能够抑制学习参数过大。
L1、L2正则
L2正则
我们原来的目标函数是
J
(
θ
)
=
MSE
(
θ
)
J(\boldsymbol{\theta})=\operatorname{MSE}(\boldsymbol{\theta})
J(θ)=MSE(θ)
为了防止模型的权重(参数)过于得大, 我们需要为参数注明它的约束条件, 比如两个参数的情况下, 我们可以为我们的目标函数MSE注明约束条件
θ
1
+
θ
2
<
=
C
\theta_1+\theta_2 <= C
θ1+θ2<=C
我们可以将带约束条件的目标函数通过拉格朗日乘子法转化为目标函数与约束条件整合到一起的新的函数, 且这个新的函数没有约束条件, 只是这个整合后的目标函数的极值点发生了改变
J
(
θ
)
=
MSE
(
θ
)
+
α
(
1
2
∑
i
=
1
n
θ
i
2
−
C
)
J(\boldsymbol{\theta})=\operatorname{MSE}(\boldsymbol{\theta})+\alpha (\frac{1}{2} \sum_{i=1}^{n} \theta_{i}^{2} - C)
J(θ)=MSE(θ)+α(21i=1∑nθi2−C)
因为这里的αC是个常数, 所以我们可以把它给去掉, 并且1/2也不影响极值点的求解, 所以我们也可以给去掉
J
(
θ
)
=
MSE
(
θ
)
+
α
∑
i
=
1
n
θ
i
2
J(\boldsymbol{\theta})=\operatorname{MSE}(\boldsymbol{\theta})+\alpha \sum_{i=1}^{n} \theta_{i}^{2}
J(θ)=MSE(θ)+αi=1∑nθi2
这样就代表同时使MSE和特征权值都尽可能的小, 这里的
α
∑
i
=
1
n
θ
i
2
\alpha \sum_{i=1}^{n} \theta_{i}^{2}
α∑i=1nθi2就是正则化项/惩罚项, 是学习参数(也称为特征权值)的平方和的形式, 并且惩罚项中不包含截距。
另外, α ( α ⩾ 0 ) \alpha(\alpha \geqslant 0) α(α⩾0) 是控制正则化强度的参数, α \alpha α 越大, 对学习参数的抑制越强, 惩罚力度也就越大, 特征权重(学习参数)就越小; α \alpha α 越小, 对学习参数的抑制就越弱, 训练数据过拟合的可能性就越大。
训练过程中使用了L2正则项的线性回归算法被称为岭回归(Ridge Regression)
L1正则
前面介绍了作为正则化方法的岭回归。岭回归的误差函数的惩罚项是学习参数的平方和的形 式,通过将该惩罚项改为其他形式,可以实现不同特点的正则化。除了岭回归以外,还有一种具有代表性的正则化方法——Lasso 回归, 即使用了L1正则项的线性回归算法。Lasso 回归的误差函数如下:
J
(
θ
)
=
MSE
(
θ
)
+
α
∑
i
=
1
n
∣
θ
i
∣
J(\boldsymbol{\theta})=\operatorname{MSE}(\boldsymbol{\theta})+\alpha \sum_{i=1}^{n} |\theta_{i}|
J(θ)=MSE(θ)+αi=1∑n∣θi∣
Lasso回归的惩罚项是各学习参数的绝对值之和, 这一点与岭回归不同
L1正则的极值点更容易落在坐标轴上, 也就是说它会使某些参数的值变为零, 这种情况下的解我们就称之为稀疏解, 它会含有很多无效的解, 这种无效解会去掉样本的一些特征, L1正则的产生稀疏解的特性可以用于特征选择(系数为零的特征就代表它的重要性低于其它特征)
经过多项式拓展后产生的新特征所代表的视角我们是不知道的, Lasso会没有用的特征的系数化为零, 如果我们把没有用的特征也学习的话, 那么就很容易发生过拟合。L1正则倾向于把某些特征的系数化为零, L2正则倾向于将某些特征的系数尽可能的小, 很少有特征的系数为零, 换句话说, L1正则项擅长将实际没有用处的特征的系数变为0来进行特征过滤, L2正则项擅长将不没有用处的特征的系数变得很小, 使其变得不重要。
L1、L2正则化与原始的线性回归模型的区别在于在后面加上了惩罚项
岭回归和 Lasso 回归计算学习参数时的情况分别如图 a 和图 b 所示
绿线是线性回归的误差函数,蓝线是惩罚项的约束函数。岭回归的惩罚项是学习参数的平方和, 所以其图形是 图a 所示的圆形;Lasso 回归的惩罚项是绝对值的和,所以其图形是图 b 所示的四边形。原来的函数(线性回归的误差函数)与约束函数的交点就是带有正则化项的误差函数的最优解。可以看出,在加入惩罚项后,图 a 的岭回归的学习参数得到了抑制。图 b 的 Lasso 回归的情况与岭回归相似,学习参数同样被抑制,但学习参数 w 2 w_2 w2变为了 0。
Lasso 回归计算的是函数与这种四边形的约束函数的交点,因此具有学习参数容易变为 0 的特点。利用这个特点,我们可以使用学习参数不为 0 的特征来构建模型,从而达到利用 Lasso 回归特征选择的效果。这样不仅能提高模型的泛化能力,还能使模型的解释变容易。
无论是多项式特征扩展, 还是L1正则化特征缩放, 本质上都是因为样本的特征处理的不够好
模型的欠拟合与过拟合
模型的复杂程度其实与样本特征数成正相关的, 特征越多, 模型就越复杂, 就越容易发生过拟合; 特征越少,模型可参考的信息就少, 模型就越简单, 就越容易发生欠拟合(也就是没有学到有效的特征)。
当因为的样本特征数少导致欠拟合时, 我们就可以使用多项式拓展来增多特征, 也就是特征升维, 这样我们就可能解决欠拟合的问题。
比如, 现在假设有一个特征x1, 它代表房屋的长度, 也有房间的宽度这一特征, 结合我们基于业务的理解, 我们可以组合一个新的特征房屋面积x1*x2, 这样我们的机器学习算法可参考的面就多了。
当然这只是一个例子, 实际上多项式拓展过程中, 是不考虑特征属性的, 直接根据现有的特征组合出新的一个或多个特征,这样我们就有可能解决欠拟合的问题, 这就是升维的过程
下面我们看一个例子:
如上图所示, 纵轴描绘的是用户随着时间的变化对某话题的感兴趣的程度的变化, 如果我们使用step function来建模的话, 我们可以看到右上角的模型基本上拟合每一个数据点, 这说明模型太复杂, 因太过于关注训练数据是否分正确, 这种情况下模型很容易发生过拟合。而对于左下角的模型, 它虽然简单, 但很多数据都没有拟合到, 可见其在训练数据上的性能也不会太好, 这种情况下我们的模型极易发生欠拟合。
最后我们再来看右下角的模型, 它虽然简单, 但它能很好地拟合训练数据, 因此我们说右下角的模型是最好的。对于一个机器学习模型的通用原则是:简单且准确。模型往往需要在简单和准确之间做个折中, 这种这种也称为偏差和方差的折中(bias-variance tradeoff)
线性回归的过拟合
目标函数: J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta)=\frac{1}{2} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2 J(θ)=21∑i=1m(hθ(x(i))−y(i))2
- 为了防止数据过拟合,也就是
θ
\theta
θ 值在样本空间中不能过大,可以在目标函数之上增加一个平方和损失:
J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ i = 1 n θ j 2 J(\theta)=\frac{1}{2} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2+\lambda \sum_{i=1}^n \theta_j^2 J(θ)=21i=1∑m(hθ(x(i))−y(i))2+λi=1∑nθj2 - 正则项(norm)/惩罚项: λ ∑ j = 1 n θ j 2 \lambda \sum_{j=1}^n \theta_j^2 \quad λ∑j=1nθj2; 这里这个正则项叫做L2-norm
过拟合与正则项
- L2-norm:
J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ i = 1 n θ j 2 λ > 0 J(\theta)=\frac{1}{2} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2+\lambda \sum_{i=1}^n \theta_j^2 \quad \lambda>0 J(θ)=21i=1∑m(hθ(x(i))−y(i))2+λi=1∑nθj2λ>0 - L1-norm:
J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n ∣ θ j ∣ λ > 0 J(\theta)=\frac{1}{2} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2+\lambda \sum_{j=1}^n\left|\theta_j\right| \quad \lambda>0 J(θ)=21i=1∑m(hθ(x(i))−y(i))2+λj=1∑n∣θj∣λ>0
Ridge回归
- 使用 L 2 \mathrm{L} 2 L2 正则的线性回归模型就称为Ridge回归(岭回归)
J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ i = 1 n θ j 2 λ > 0 J(\theta)=\frac{1}{2} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2+\lambda \sum_{i=1}^n \theta_j^2 \quad \lambda>0 J(θ)=21i=1∑m(hθ(x(i))−y(i))2+λi=1∑nθj2λ>0
LASSO回归
- 使用L1正则的线性回归模型就称为LASSO回归(Least Absolute Shrinkage and Selection Operator)
J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n ∣ θ j ∣ λ > 0 J(\theta)=\frac{1}{2} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2+\lambda \sum_{j=1}^n\left|\theta_j\right| \quad \lambda>0 J(θ)=21i=1∑m(hθ(x(i))−y(i))2+λj=1∑n∣θj∣λ>0
Ridge(L2-norm)和 LASSO(L1-norm)比较
-
在 L2-norm 中,由于对于各个维度的参数缩放是在一个圆内缩放的,不可能导致有维度参数变为0的情况,那么也就不会产生稀疏解;实际应用中,数据的维度中是存在噪音和冗余的,稀疏的解可以找到有用的维度并且减少冗余,提高后续算法预测的准确性和鲁棒性(减少了 overfitting)(L1-norm 可以达到最终解的稀疏性的要求)。
-
Ridge 模型具有较高的准确性、鲁棒性以及稳定性(冗余特征已经被删除了);LASSO 模型具有较高的求解速度。
-
如果既要考虑稳定性也考虑求解的速度,就使用 Elastic Net。
Elasitc Net
- 同时使用
L
1
L 1
L1 正则和
L
2
L 2
L2 正则的线性回归模型就称为Elasitc Net算法(弹性网络算法)
J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ( p ∑ j = 1 n ∣ θ j ∣ + ( 1 − p ) ∑ j = 1 n θ j 2 ) J(\theta)=\frac{1}{2} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2+\lambda\left(p \sum_{j=1}^n\left|\theta_j\right|+(1-p) \sum_{j=1}^n \theta_j^2\right) J(θ)=21i=1∑m(hθ(x(i))−y(i))2+λ(pj=1∑n∣θj∣+(1−p)j=1∑nθj2)
{ λ > 0 p ∈ [ 0 , 1 ] \left\{\begin{array}{l} \lambda>0 \\ p \in[0,1] \end{array}\right. {λ>0p∈[0,1]
模型效果判断
- MSE:误差平方和,越趋近于 0 表示模型越拟合训练数据。
- RMSE:MSE的平方根,作用同MSE
- R 2 R^2 R2 :取值范围(负无穷, 1 ],值越大表示模型越拟合训练数据;最优解是 1 ; 当模型预测为随机值的时候,有可能为负;若预测值恒为样本期望, R 2 R^2 R2 为 0
- TSS:总平方和TSS(Total Sum of Squares),表示样本之间的差异情况,是伪方差的 m m m 倍
- RSS:残差平方和RSS(Residual Sum of Squares),表示预测值和样本值之间的差异情况,是MSE的m倍
机器学习调参
- 在实际工作中,对于各种算法模型(线性回归)来讲,我们需要获取 θ 、 λ 、 p \theta 、 \lambda 、 p θ、λ、p的值; θ \theta θ 的求解其实就是算法模型通过学习训练所得到的参数,一般不需要开发人员参与(算法已经实现),主要需要求解的是超参数 λ \lambda λ 和 p p p 的值,这个过程就叫做调参(超参)
- 交叉验证:将训练数据分为多份,其中一份进行数据验证并获取最优的超参数: λ \lambda λ 和p;比如:十折交叉验证、五折交叉验证(scikit-learn中默认)等
- 我们将模型训练过程中经学习得到的参数称为模型参数, 比如线性回归模型中的θ, 而在训练之前我们人为设定的参数就称为超参数, 比如模型正则化时的λ和p(出现在Elastic Net中), 我们经常提到的调参, 其实调整的就是超参数, 因为训练前设置的超参数不同, 那么训练过程得到的模型参数也就不同, 不同的模型参数就对应不同的模型
线性回归总结
-
算法模型:线性回归(Linear)、岭回归(Ridge)、LASSO回归、Elastic Net
-
正则化:L1-norm、L2-norm
-
损失函数/目标函数: J ( θ ) = ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 → min θ J ( θ ) J(\theta)=\sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2 \rightarrow \min _\theta J(\theta) J(θ)=∑i=1m(hθ(x(i))−y(i))2→minθJ(θ)
-
θ \theta θ 求解方式:最小二乘法(直接计算,目标函数是平方和损失函数)、梯度下降(BGD\SGD\MBGD)
梯度下降寻找最优解的方式后续会单独来说
拓展
- 【链接】拉格朗日乘子法–将带约束优化问题转化为无约束优化问题
接下来我们编程实现一个简单的线性回归算法:
import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
class LinearRegression:
def __init__(self):
self.coef_ = None
self._theta = None
self.intercept_ = None
def fit(self, X_train, y_train):
assert len(X_train) == len(y), \
'the size of X_train must be equal to the size of y_train'
X_b = np.column_stack((np.ones((X_train.shape[0], 1)), X_train))
self._theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T.dot(y_train))
self.coef_ = self._theta[1:]
self.intercept_ = self._theta[0]
return self
def predict(self, X_predict):
y_predict = np.array(X_predict).dot(self.coef_) + np.array(self.intercept_)
return y_predict
def score(self, X_test, y_test):
# mse
MSE = np.sum((self.predict(X_test) - y_test) ** 2) / len(X_test)
# r^2
r2_square = 1 - MSE / np.var(y)
# mae
MAE = np.sum(np.absolute(self.predict(X_test) - y_test)) / len(X_test)
return MSE, r2_square, MAE
def save(self):
"""
:return:
"""
# self.theta0
# self.theta
if __name__ == '__main__':
X = np.array([10, 15, 20, 30, 50, 60, 60, 70]).reshape((-1, 1))
y = np.array([0.8, 1.0, 1.8, 2.0, 3.2, 3.0, 3.1, 3.5])
linear = LinearRegression()
linear.fit(X, y)
x_test = [[55]]
y_test_hat = linear.predict(x_test)
mse, r2_s, mae = linear.score(X_test=X, y_test=y)
print(mse, r2_s, mae)
y_predict = linear.predict(X)
print(mean_squared_error(y, y_predict), r2_score(y, y_predict), mean_absolute_error(y, y_predict))
# print(y_test_hat)
# print(linear.coef_) # 查看回归系数
# print(linear.intercept_) # 查看截距
接下来, 我们可以尝试使用sklearn为我们封装好的线性回归算法来预测波士顿的房价
# -*- coding:utf-8 -*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
import warnings
warnings.filterwarnings('ignore')
# 加载数据
data = pd.read_csv('../datas/boston_housing.data', sep='\s+', header=None)
# 获取特征属性X和目标属性y
X = data.iloc[:, :-1]
y = data.iloc[:, -1]
# 训练测试数据集分离
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
### 特征工程
# 多项式扩展
"""
PolynomialFeatures ### 多项式扩展
degree=2 ### 扩展的阶数
interaction_only: bool ### 是否只保留交互项
include_bias: ### 是否需要偏置项(截距)
"""
poly = PolynomialFeatures(degree=3, interaction_only=False)
poly.fit(X_train)
X_train_poly = poly.transform(X_train)
X_test_poly = poly.transform(X_test)
# 训练模型
# lasso = Lasso(alpha=10**5, max_iter=10000) # alpha代表惩罚力度λ
# lasso.fit(X_train_poly, y_train)
ridge = Ridge(alpha=10**11, max_iter=10000) # alpha代表惩罚力度λ
ridge.fit(X_train_poly, y_train)
print(ridge.coef_)
# 评估模型
# print('训练数据集的误差指标:', lasso.score(X_train_poly, y_train))
# print('测试数据集的误差指标:', lasso.score(X_test_poly, y_test))
print('训练数据集的误差指标:', ridge.score(X_train_poly, y_train))
print('测试数据集的误差指标:', ridge.score(X_test_poly, y_test))
# 可视化
plt.plot(range(len(X_train_poly)), y_train, c='r', label='y_true')
# plt.plot(range(len(X_train_poly)), lasso.predict(X_train_poly), c='g', label='y_predict')
plt.plot(range(len(X_train_poly)), ridge.predict(X_train_poly), c='g', label='y_predict')
plt.legend()
plt.show()
plt.plot(range(len(X_test)), y_test, c='r', label='y_true')
plt.plot(range(len(X_test)), ridge.predict(X_test_poly), c='g', label='y_predict')
# plt.plot(range(len(X_test)), lasso.predict(X_test_poly), c='g', label='y_predict')
plt.legend()
plt.show()
可视化结果如下:
参考文献:
【1】:机器学习实战,【美】Peter Harrington
【2】:图解机器学习算法, 秋藤申野
【3】:机器学习, 周志华
【4】:百面机器学习, 葫芦娃