机器学习任务的一般步骤:
那么,在机器学习任务中,将如何对数据进行分析呢?这里,我们总结下一般的机器学习任务的步骤,它适用于在上一篇的机器学习简介中,我们介绍了几种机器学习的类型。
文章目录
#1、确定特征#
在机器学习中,我们拿到的数据集,一般都是结构化的数据,那么在对这些数据的处理时,我们就需要判断这些数据是否有用,那就是需要确定这些数据的特征,这些特征对我们最终预测的结果有多大的影响。如在波士顿房价预测中,我们选择的特征有房子的房间数、房子的面积等都影响房价的预测。机器学习的特征选择是非常重要的,它决定了我们的最终数据的预测判断。这里,我主要简单介绍一下关于特征选择的一些基本知识。下图是特征工程的一些方法:
后面另起章节对特征工程进行讲解
#2、确定模型 #
模型选择,就是在选择何种数学公式对数据进行预测。当我们确定特征后,我们就需要将数据带入到相应的模型进行训练,在监督学习的任务中,在给定的带标签的训练样本
D
=
{
x
i
,
y
i
}
i
=
1
N
\textit{D}=\left \{ \mathbf{x}_{i} ,y_{i}\right \}_{i=1}^{N}
D={xi,yi}i=1N 学习到了一个
x
→
y
^
\mathbf{x}\rightarrow\hat{y}
x→y^的映射关系,从而得到对新的输入
x
\mathbf{x}
x进行预测。模型就是指对给定的
x
\mathbf{x}
x,如何预测其标签
y
^
\hat{y}
y^。
线性模型(最简单的模型):
f
(
x
)
=
Σ
j
w
i
x
i
=
W
T
X
f(\mathbf{x})=\Sigma _{j}w_{i}x_{i}=\mathbf{W^{T}}\boldsymbol{X}
f(x)=Σjwixi=WTX
非线性模型(在线性模型的非线性化的条件下):
基函数:
x
2
x^{2}
x2、log、exp、样条函数、决策树……
核化:将原问题转化为对偶问题,将对偶问题中的向量点积
<
x
i
,
x
j
>
<\mathbf{x}_{i},\mathbf{x}_{j}>
<xi,xj>换成核函数
k
(
x
i
,
x
j
)
k(\mathbf{x}_{i},\mathbf{x}_{j})
k(xi,xj)
但是我们的预测目标是使得真值和预测值之间的误差是极小值,所以我的训练函数应该是得到一个目标函数。
目标函数:损失函数和正则项
损失函数:
度量模型预测值和真值之间的差异
对于回归的问题,主要的损失函数有如下:令残差
r
=
f
(
x
)
−
y
r = f(x)-y
r=f(x)−y
--L2损失:
L
2
(
r
)
=
1
2
r
2
L_{2}(r) = \frac{1}{2}r^{2}
L2(r)=21r2
--L1损失:
L
1
(
r
)
=
∣
r
∣
L_{1}(r)=|r|
L1(r)=∣r∣
--Huber损失:
L
δ
(
r
)
=
{
1
2
r
2
if
∣
r
∣
≤
δ
δ
∣
r
∣
−
1
2
δ
2
if
∣
r
∣
>
δ
L_{\delta }(r)=\begin{cases}\frac{1}{2}r^{2} & \text{ if } |r|\leq \delta \\ \delta |r|-\frac{1}{2}\delta^{2} & \text{ if } |r|> \delta \end{cases}
Lδ(r)={21r2δ∣r∣−21δ2 if ∣r∣≤δ if ∣r∣>δ
对于分类问题,主要的损失函数有如下:
– 0-1损失:
l
0
/
1
(
y
,
f
(
x
)
)
=
{
1
if
y
f
(
x
)
<
0
0
if
o
t
h
e
r
e
i
s
e
l_{0/1}(y,f(x))=\begin{cases}1 & \text{ if } yf(x)<0 \\ 0 & \text{ if } othereise \end{cases}
l0/1(y,f(x))={10 if yf(x)<0 if othereise
– Logistic 损失:也称为负log似然损失/logloss :
l
l
o
g
(
y
,
f
(
x
)
)
=
l
o
g
(
1
+
e
x
p
(
−
y
f
(
x
)
)
)
l_{log}(y,f(x))=log(1+exp(-yf(x)))
llog(y,f(x))=log(1+exp(−yf(x)))
– 指数损失:
l
e
x
p
(
y
,
f
(
x
)
)
=
e
x
p
(
−
y
f
(
x
)
)
l_{exp}(y,f(x))=exp(-yf(x))
lexp(y,f(x))=exp(−yf(x))
– 合页损失:
l
h
i
n
g
e
(
y
,
f
(
x
)
)
=
m
a
x
(
0
,
1
−
y
f
(
x
)
)
l_{hinge}(y,f(x))=max(0,1-yf(x))
lhinge(y,f(x))=max(0,1−yf(x))
正则项:
但是就算我们在训练集中能够把训练数据训练得到的损失最小,甚至为零,但是我们真正关心的是在预测上的性能,对于机器学习的模型来说,越是复杂的模型,越是拟合的很好,损失也越小,但是当在训练集上,它的方差就越大。所以要我们对模型进行惩罚,就得加入正则项。常用的正则项有如下:
- L2正则:
R
(
θ
)
=
λ
∣
∣
θ
∣
∣
2
2
=
∑
j
=
1
D
θ
j
2
R(\mathbf{\theta})=\lambda||\mathbf{\theta}||^{2}_{2}=\sum_{j=1}^{D}\theta ^{2}_{j}
R(θ)=λ∣∣θ∣∣22=∑j=1Dθj2
- L1正则:
R
(
θ
)
=
λ
∣
θ
∣
=
∑
j
=
1
D
∣
θ
∣
R(\mathbf{\theta})=\lambda|\mathbf{\theta}|=\sum_{j=1}^{D}|\theta|
R(θ)=λ∣θ∣=∑j=1D∣θ∣
- L0正则:
R
(
θ
)
=
λ
∣
∣
θ
∣
∣
0
R(\mathbf{\theta})=\lambda||\mathbf{\theta}||_{0}
R(θ)=λ∣∣θ∣∣0
下面谈论下正则的必要性:
通过sin曲线进行拟合:
$Y=sin(2\pi X)+\varepsilon $
X
X
X服从高斯分布:
X
∼
U
n
i
f
o
r
m
[
0
,
1
]
,
ε
∼
N
(
0
,
0.
3
2
)
X\sim Uniform[0,1],\varepsilon \sim N(0,0.3^{2})
X∼Uniform[0,1],ε∼N(0,0.32)
预测模型(M阶多项式):
y
^
=
∑
j
=
0
M
w
j
x
j
\hat{y}=\sum_{j=0}^{M}w_{j}x^{j}
y^=∑j=0Mwjxj(样本是N=10)
这里我们使用L2损失函数
1
N
∑
i
=
1
N
(
y
−
y
^
)
2
\frac{1}{N}\sum_{i=1}^{N}(y-\hat{y})^2
N1∑i=1N(y−y^)2
现在我们需拟合这个函数:
(1)、0阶多项式拟合:
y
^
=
w
0
\hat{y}=w_{0}
y^=w0 ,如下图红线就是该函数,拟合情况不是很好,样本点基本都不在红线附近
(2)、1阶多项式拟合:
y
^
=
w
0
+
w
1
x
\hat{y}=w_{0}+w_{1}x
y^=w0+w1x,拟合情况比0阶好了一点
(3)、3阶多项式拟合:
y
^
=
w
0
+
w
1
x
+
w
2
x
2
\hat{y}=w_{0}+w_{1}x+w_{2}x^{2}
y^=w0+w1x+w2x2,拟合情况比刚刚又好了很多,基本所有的点都落在红线上了
(4)、9阶多项式拟合:
y
^
=
w
0
+
w
1
x
+
w
2
x
2
+
w
3
x
3
.
.
.
.
w
9
x
9
\hat{y}=w_{0}+w_{1}x+w_{2}x^{2}+w_{3}x^{3}....w_{9}x^{9}
y^=w0+w1x+w2x2+w3x3....w9x9。可以看到所有的点都落在红线
但是,如果新增数据集的话,如下图,A点和B点就不落在红线上。而我们说当预测值和真值之间差异(方差)最小时,该模型才是最佳模型,但是目前看来,该模型在训练集上拟合的很好,误差为0,但是校验集上误差就很大。
上述的现象看出,当模型复杂度增加时,训练误差继续下降,甚至趋向于0,但是测试误差却反而增大了,这种现象我们称之为过拟合(overfitting)。一般的模型都遵从这种规律,当模型复杂度到达某个值后,随着模型越来越复杂,预测值和真值之间的误差就越大:
考虑到这种情况,我们就需要增加一个正则项,对模型复杂度进行惩罚,避免出现过拟合的情况,如下图:
这里我们是增加了L2正则(当然还可以是其他正则),目标函数(使用L2损失和L2正则,称之为岭回归)如下:
有过拟合就有欠拟合,欠拟合是指模型太简单或者对复杂性惩罚太多
常见的线性模型的损失函数和正则项的组合:
#3、模型训练#
模型训练也就是我们的目标函数的优化,也就是对目标函数进行求解。简单的函数直接通过导数求解,对于比较复杂的函数,有凸优化等方式,如随机梯度下降法和牛顿法等
梯度下降法的简单介绍:快速找到局部极小值。将函数比作一座小山,我们站在某个山坡上,望四周看,从哪个 方向往下走,能最快走到底部,就是梯度的方向
a.给定初始值
θ
0
\theta^{0}
θ0
b.更新
θ
\theta
θ,使得
J
(
θ
)
J(\theta)
J(θ)越来越小:
θ
t
=
θ
t
1
−
η
▽
θ
J
(
θ
)
\mathbf{\theta }^{t} = \mathbf{\theta }^{t1}-\eta \triangledown _{\theta}J(\theta)
θt=θt1−η▽θJ(θ)
直到收敛到或者达到预先设定的最大迭代数
不过,梯度下降有如下几点需要注意:
(1)、在使用梯度下降的时候,我们需要注意到,如果下降的步伐太小(
η
\eta
η学习率)的话,收敛就会很慢,如果太大的话,容易出现overshoot the mininum的现象,如下图:
一直来回震荡,得不到收敛。所以在训练时候,如果发现函数值增加的话,需要适当减小学习率
e
t
a
eta
eta的值。
(2)、在我们的梯度下降的时候,我们得到的只是局部最小值,不是整个模型的最小值。如果二阶导数恒大于0,那么目标函数就是凸函数,所以局部最小值就是全局的最小值。如果不是的话,那么我们只能通过随机选择不同的初始值,得到多个局部极小值点。多个局部极小值的最小值就是函数的全局最小值。
#4、模型选择和评估#
同一个问题,可以使用不同的模型去预测,但是最终选择哪个模型,就需要看该模型在新的数据集上的预测误差是否是最小的,那么新的数据集就是校验集。如下所示:
通常来讲,我们也无法确定多少数据是足够的,没有一个标准去确定;同时也没有足够的样本给我们训练和校验。所以我们得通过其他技术来对数据集进行划分规划。如可以通过重采样技术来模拟校验集数据,如重采样的两个方式:
(1)、交叉验证
(2)、bootstrap
这里简单介绍交叉验证:
K-折交叉验证:
交叉验证(Cross Validation ,CV),将训练数据分为容量相等的K份,对于每个k = 1,2,3…K 。留出第k份,其他K-1份作为训练数据,第k份为校验数据,作为预测误差的数据集。交叉验证估计的误差为:
C
V
(
M
)
=
1
K
∑
k
=
1
K
E
k
(
M
)
CV(M)=\frac{1}{K}\sum_{k=1}^{K}E_{k}(M)
CV(M)=K1∑k=1KEk(M)
对于不同的模型,计算其对于的误差CV(M),最佳模型为CV(M)最小的模型。模型复杂度和泛化误差的关系通常是U型曲线,如下图,当模型复杂度一定是,得到预测值与真值之间的误差最小,那么这个复杂度就是我们需要的模型复杂度:
那么通过校验集得到预测结果后,还需要使用如下一些评估标准进行度量预测的拟合效果:
(1)、开平均方误差(rooted mean squared error , RMSE):RMSE=
1
N
∑
i
=
1
N
(
y
i
^
−
y
i
)
2
\sqrt{\frac{1}{N}\sum_{i=1}^{N}(\hat{y_{i}}-y_{i})^{2}}
N1∑i=1N(yi^−yi)2
(2)、平均绝对误差(mean absolute error, MAE):MAE=
1
N
∑
i
=
1
N
∣
y
i
^
−
y
i
∣
\frac{1}{N}\sum_{i=1}^{N}|\hat{y_{i}}-y_{i}|
N1∑i=1N∣yi^−yi∣
(3)、R2 score:即考虑预测值和真值之间的差异,也考虑了问题本身真值之间的差异(scikit learn线性回归的缺省评价准则)
S
S
r
e
s
=
∑
i
=
1
N
(
y
i
^
−
y
i
)
2
SS_{res}=\sum_{i=1}^{N}(\hat{y_{i}}-y_{i})^{2}
SSres=∑i=1N(yi^−yi)2
S
S
t
o
t
=
∑
i
=
1
N
(
y
i
−
y
ˉ
)
2
SS_{tot}=\sum_{i=1}^{N}(y_{i}-\bar{y})^{2}
SStot=∑i=1N(yi−yˉ)2
R
2
=
1
−
S
S
r
e
s
S
S
t
o
t
R^{2}=1-\frac{SS_{res}}{SS_{tot}}
R2=1−SStotSSres
所以,
R
2
R^{2}
R2越大,模型越好。
#5、模型预测和应用#
当选好模型后,就可以使用该模型在现实中进行应用了。也就是可以上线使用