【机器学习】梯度下降、岭回归、Lasso回归等
0 简要复习线性回归(Linear Regression)
- 线性回归模型函数:
y
(
x
)
=
β
0
+
β
1
?
x
1
+
β
2
?
x
2
y(x) = \beta_0+ \beta_1*x_1+ \beta_2*x_2
y(x)=β0?+β1??x1?+β2??x2? 或
y
(
x
)
=
∑
i
=
0
n
b
e
t
a
i
?
x
i
=
B
T
X
y(x) = \sum_{i=0}^{n} beta_i*x_i = B^TX
y(x)=∑i=0n?betai??xi?=BTX
- 参数估计的评价机制: 损失函数(loss function) 或 错误函数(error function) 或 评价函数 —— 真实值和预测值之间的误差,最小二乘思维
- 均方误差损失函数(mean squared error loss):
M
S
E
=
1
n
∑
i
=
1
n
(
y
i
^
?
y
i
)
2
MSE=\frac{1}{n}\sum_{i=1}^{n}(\hat{y_i} -y_i)^2
MSE=n1?∑i=1n?(yi?^??yi?)2
- 平方损失函数(Square Loss):
J
(
θ
)
=
1
2
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
?
y
(
i
)
)
2
=
(
y
?
X
θ
)
T
(
y
?
X
θ
)
J(\theta)=\frac{1}{2}\sum_{i=1}^{m}(h_{\theta}(x^{(i)}) -y^{(i)})^2 = (y-X\theta)^T(y-X\theta)
J(θ)=21?∑i=1m?(hθ?(x(i))?y(i))2=(y?Xθ)T(y?Xθ),对x(i)的估计值与真实值y(i)差的平方和作为错误估计函数,通过乘以0.5消除系数
- 为什么损失函数要用平方和?
- x,y的条件概率(正态分布):
p
(
y
(
i
)
∣
x
(
i
)
;
θ
)
=
1
2
π
σ
e
x
p
(
?
(
y
(
i
)
?
θ
T
x
(
i
)
)
2
2
σ
2
)
p(y^{(i)}|x^{(i)};\theta)=\frac{1}{\sqrt{2\pi}\sigma}exp(-\frac{(y^{(i)}-\theta^Tx^{(i)})^2}{2\sigma^2})
p(y(i)∣x(i);θ)=2π
?σ1?exp(?2σ2(y(i)?θTx(i))2?);
- 最大似然求解:
1
2
∑
i
=
1
m
(
y
(
i
)
?
θ
T
x
(
i
)
)
2
\frac{1}{2}\sum_{i=1}^{m}(y^{(i)} - \theta^Tx^{(i)})^2
21?∑i=1m?(y(i)?θTx(i))2
- 目标:如何调整θ以使得J(θ)取得最小值
a
r
g
m
i
n
θ
J
(
θ
)
argmin_\theta J(\theta)
argminθ?J(θ)问题
1 梯度下降法
- 梯度下降法问题:结果与初始点的选取有关,可能只能得到全局极小值
- 注意点:此处不是随机梯度下降法(均方误差损失函数是凸函数);注意特征归一化
- 步骤:
- 第一步:首先对θ赋初值,初值选择:1)随机;2)全零向量
- 第二步:迭代更新改变θ的值,使得J(θ)按梯度下降的方向进行减少,其中梯度方向由J(θ)对θ的偏导数的反方向确定,即:
θ
j
:
=
θ
j
+
α
(
y
(
i
)
?
h
θ
(
x
(
i
)
)
)
x
j
(
i
)
\theta_j:=\theta_j+\alpha(y^{(i)}-h_\theta(x^{(i)}))x_j^{(i)}
θj?:=θj?+α(y(i)?hθ?(x(i)))xj(i)?,以下为两种迭代更新方法:
- 批梯度下降:对全部的训练数据求得误差后,再对θ进行更新,能够不断收敛
- 增量梯度下降:每扫描一步都要对θ进行更新,不断在收敛处徘徊
2 最小二乘法 OLS
- 方法:求偏导,即
θ
=
(
X
T
X
)
?
1
X
T
y
\theta = (X^TX)^{-1}X^Ty
θ=(XTX)?1XTy
- 缺点:要求X是列满秩;求矩阵的逆比较慢
- 改进:对于不能直接求矩阵的逆的解决方案 ——
θ
=
(
X
T
X
+
δ
2
I
d
)
?
1
X
T
y
\theta = (X^TX + \delta^2I_d)^{-1}X^Ty
θ=(XTX+δ2Id?)?1XTy (这一步是工程实践结果,意外发现和 岭回归损失函数求偏导一样)
3 岭回归(Ridge Regression)与Lasso回归(Lasso Regression)
- 描述/核心思想:
- 通过损失最小二乘法的无偏性(有偏估计),以损失部分信息、降低精度为代价,提升数值稳定性泛化能力,获得回归系数更为符合实际、更可靠的回归方法
- 特征选择
- 特殊针对:
- 训练样本数量少(甚至少于样本维数),即矩阵无法求逆;
- 样本特征大量相似,即很多参数意义重复(共线性)
- 损失函数:
- 线性回归(
J
0
=
(
y
?
X
θ
)
T
(
y
?
X
θ
)
?
o
r
?
∑
i
=
1
m
(
h
θ
(
x
i
)
?
y
i
)
2
J_0 = (y-X\theta)^T(y-X\theta) \ or\ \sum_{i=1}^{m}{(h_\theta (x^i ) - y^i )^2 }
J0?=(y?Xθ)T(y?Xθ)?or?∑i=1m?(hθ?(xi)?yi)2),正则因子(模型参数向量的范数) * 其中m为观察数,n为变量数
- 岭回归:
J
(
θ
)
=
J
0
+
δ
2
∑
j
=
1
n
θ
j
2
J(\theta) = J_0 + \delta^2\sum_{j=1}^{n}\theta_j^2
J(θ)=J0?+δ2∑j=1n?θj2? (
θ
T
θ
\theta^T\theta
θTθ,L2范数,即高斯分布) —— 消除共线性;模的平方处理
- Lasso回归:
J
(
θ
)
=
J
0
+
δ
2
∑
j
=
1
n
∣
θ
j
∣
J(\theta) = J_0 + \delta^2\sum_{j=1}^{n}|\theta_j|
J(θ)=J0?+δ2∑j=1n?∣θj?∣(使用模型参数向量的L1范数,即拉普拉斯分布)—— 压缩变量(降维);模的平方处理
- 理解:
- 差异:
- Lasso能够实现提取有用特征、删除无效变量(即将系数设置零,直接消除影响)
- Lasso回归计算更复杂,因为第一范数不是连续可导的
4 权衡:弹性网络回归(ElasticNet Regression)
- ElasticNet 回归,即岭回归和Lasso技术的混合,使用 L1, L2 范数作为先验正则项训练的线性回归模型。
- 为什么有 ElasticNet?
- Lasso回归太过(太多特征被稀疏为0) —— 允许少量参数被稀疏(比如共线变量Lasso只选择一个,Elastic可能选择两个)
- 岭回归也正则化的不够(回归系数衰减太慢) —— 保持正则化强度与Ridge的稳定性
- 公式:
-
M
i
n
(
1
2
m
[
J
0
+
λ
∑
j
=
1
n
θ
j
2
]
+
λ
∑
j
=
1
n
∣
θ
∣
)
Min( \frac{1}{2m} [ J_0 + \lambda \sum_{j=1}^{n} \theta_j^2 ] + \lambda \sum_{j=1}^{n} |\theta| )
Min(2m1?[J0?+λ∑j=1n?θj2?]+λ∑j=1n?∣θ∣)
-
M
i
n
(
1
2
m
J
0
+
α
(
1
?
ρ
)
2
∣
θ
∣
∣
2
2
+
α
ρ
∣
∣
θ
∣
∣
1
)
Min( \frac{1}{2m}J_0 + \frac{\alpha(1-\rho)}{2}|\theta||_2^2 + \alpha\rho ||\theta||_1 )
Min(2m1?J0?+2α(1?ρ)?∣θ∣∣22?+αρ∣∣θ∣∣1?),α接近0时ElasticNet接近Lasso;当α从1到0,目标函数的稀疏解从0逐渐增加
- 代码
from sklearn import linear_model
ENSTest = linear_model.ElasticNetCV(alphas=[0.0001, 0.0005, 0.001, 0.01, 0.1, 1, 10], l1_ratio=[.01, .1, .5, .9, .99], max_iter=5000).fit(x_train, y_train)
y_prediction = ENSTest.predict(x_test)
致谢: 高永峰_GYF(https://www.jianshu.com/p/aadad14db00e) mantch(cnblogs.com/mantch/p/10242077.html)
|