符号约定
假设训练集 ( X , y ) (\textbf{X}, \textbf{y}) (X,y)有 n n n 个特征, N N N个样本
X = [ x 1 T x 2 T ⋮ x N T ] y = [ y 1 y 2 ⋮ y N ] \textbf{X}=\begin{bmatrix} \textbf{x}^T_1 \\ \textbf{x}^T_2 \\ \vdots\\ \textbf{x}^T_N \end{bmatrix} \ \ \ \ \ \ \ \ \ \ \textbf{y}=\begin{bmatrix}y_1\\ y_2\\ \vdots\\ y_N\end{bmatrix} X=⎣⎢⎢⎢⎡x1Tx2T⋮xNT⎦⎥⎥⎥⎤ y=⎣⎢⎢⎢⎡y1y2⋮yN⎦⎥⎥⎥⎤
其中 x i T = ( x i 1 , x i 2 , . . . , x i n ) \textbf{x}^T_i=(x_{i1}, x_{i2},...,x_{in}) xiT=(xi1,xi2,...,xin) 表示一个样本, y i y_i yi表示 x i \textbf{x}_i xi对应的标签值(连续的或离散的,假如是离散的那么假设有 K K K 种取值)
y ^ \hat{y} y^表示模型对 x \textbf{x} x的预测值
算法对比
算法名称 | 适用的问题 | 损失函数 / 优化目标 | 参数求解 / 调参方法 | 最终模型 |
---|---|---|---|---|
线性回归 | 回归问题 | min ( y − X ′ ω ′ ) T ( y − X ′ ω ′ ) X ′ = [ x 1 T 1 x 2 T 1 ⋮ ⋮ x N T 1 ] ω ′ = [ ω 1 ω 2 ⋮ ω n b ] \min(\textbf{y}-\textbf{X}^\prime\boldsymbol{\omega}^\prime)^T(\textbf{y}-\textbf{X}^\prime\boldsymbol{\omega}^\prime)\\ \textbf{X}^\prime=\begin{bmatrix}\textbf{x}^T_1 & 1 \\ \textbf{x}^T_2 & 1\\ \vdots & \vdots \\ \textbf{x}^T_N & 1\end{bmatrix}\boldsymbol{\omega}^\prime=\begin{bmatrix}\omega_1\\ \omega_2\\ \vdots\\ \omega_n\\b\end{bmatrix} min(y−X′ω′)T(y−X′ω′)X′=⎣⎢⎢⎢⎡x1Tx2T⋮xNT11⋮1⎦⎥⎥⎥⎤ω′=⎣⎢⎢⎢⎢⎢⎡ω1ω2⋮ωnb⎦⎥⎥⎥⎥⎥⎤ |
ω
′
=
(
X
′
T
X
′
)
−
1
X
′
T
y
\boldsymbol{\omega}^\prime=(\textbf{X}^{\prime T}\textbf{X}^\prime)^{-1}\textbf{X}^{\prime T}\textbf{y}
ω′=(X′TX′)−1X′Ty (注1) | y ^ = ( x T , 1 ) ⋅ ω ′ \hat{y}=(\textbf{x}^T, 1)\cdot\boldsymbol{\omega}^\prime y^=(xT,1)⋅ω′ |
感知机 | 二分类问题 | min ( − ∑ y ^ i ≠ y i y i ( x i T ω + b ) ) \min\left(-\sum_{\hat{y}_i\neq y_i}y_i(\textbf{x}_i^T\boldsymbol{\omega}+b)\right) min(−∑y^i=yiyi(xiTω+b)) | 随机梯度下降(SGD) (注2) | y ^ = s i g n ( x T ω + b ) \hat{y}=sign(\textbf{x}^T\boldsymbol{\omega}+b) y^=sign(xTω+b) |
逻辑回归 | 二分类问题 (注3) | min ( − ∑ i ( y i ln s i g m o i d ( x i ′ T ω ′ ) + ( 1 − y i ) ln ( 1 − s i g m o i d ( x i ′ T ω ′ ) ) ) ) x ′ = [ x 1 x 2 ⋮ x n 1 ] ω ′ = [ ω 1 ω 2 ⋮ ω n b ] \min\left(-\sum_{i}(y_i\ln sigmoid(\textbf{x}^{\prime T}_i\boldsymbol{\omega}^\prime)+(1-y_i)\ln(1-sigmoid(\textbf{x}^{\prime T}_i\boldsymbol{\omega}^\prime)))\right)\\ \textbf{x}^\prime=\begin{bmatrix}x_1\\ x_2\\ \vdots\\ x_n\\1\end{bmatrix}\boldsymbol{\omega}^\prime=\begin{bmatrix}\omega_1\\ \omega_2\\ \vdots\\ \omega_n\\b\end{bmatrix} min(−∑i(yilnsigmoid(xi′Tω′)+(1−yi)ln(1−sigmoid(xi′Tω′))))x′=⎣⎢⎢⎢⎢⎢⎡x1x2⋮xn1⎦⎥⎥⎥⎥⎥⎤ω′=⎣⎢⎢⎢⎢⎢⎡ω1ω2⋮ωnb⎦⎥⎥⎥⎥⎥⎤ | 梯度下降 | P ( y ^ = 1 ) = s i g m o i d ( ( x T , 1 ) ⋅ ω ′ ) P(\hat{y}=1)=sigmoid((\textbf{x}^T, 1)\cdot\boldsymbol{\omega}^\prime) P(y^=1)=sigmoid((xT,1)⋅ω′) |
线性判别分析(LDA) | 多分类问题 |
max
W
t
r
(
W
T
S
b
W
)
t
r
(
W
T
S
ω
W
)
\max_{\textbf{W}}\frac{tr(\textbf{W}^T\textbf{S}_b\textbf{W})}{tr(\textbf{W}^T\textbf{S}_{\omega}\textbf{W})}
maxWtr(WTSωW)tr(WTSbW) (注4) | 求解特征方程
S
ω
−
1
S
b
W
=
λ
W
\textbf{S}_{\omega}^{-1}\textbf{S}_b\textbf{W}=\lambda\textbf{W}
Sω−1SbW=λW 得到
W
\textbf{W}
W (注4) | 将距离 W T x \textbf{W}^T\textbf{x} WTx 最近的那个类作为预测结果 |
决策树(ID3) | 多分类问题 |
max
(
S
(
D
)
−
S
(
D
/
A
)
)
\max(S(D)-S(D/A))
max(S(D)−S(D/A)) (注5) | —— | 分类树 |
决策树(C4.5) | 多分类问题 |
max
(
S
(
D
)
−
S
(
D
/
A
)
)
S
A
(
D
)
\max\frac{(S(D)-S(D/A))}{S_A(D)}
maxSA(D)(S(D)−S(D/A)) (注6) | —— | 分类树 |
决策树(CART) | 多分类及回归问题 | 分类树:
min
(
1
−
∑
i
K
p
i
2
)
\min\left(1-\sum_i^K p_i^2\right)
min(1−∑iKpi2) 回归树: m i n A , s ( ∑ x i ∈ D 1 ( y i − c 1 ) 2 + ∑ x i ∈ D 2 ( y i − c 2 ) 2 ) min_{A,s}\left(\sum_{x_i\in D_1}(y_i-c_1)^2+\sum_{x_i\in D_2}(y_i-c_2)^2\right) minA,s(∑xi∈D1(yi−c1)2+∑xi∈D2(yi−c2)2) (注7) | —— | 分类 / 回归树 |
支持向量机 (注8) | 二分类及回归问题 | SVM:
min
(
1
2
∥
ω
∥
2
+
C
∑
i
ξ
i
)
\min\left(\frac{1}{2}\left\|\boldsymbol{\omega}\right\|^2+C\sum_i\xi_i\right)
min(21∥ω∥2+C∑iξi) SVR: min ( 1 2 ∥ ω ∥ 2 + C ∑ i l ϵ ( f ( x i ) − y i ) ) \min\left(\frac{1}{2}\left\|\boldsymbol{\omega}\right\|^2+C\sum_i\mathcal{l}_{\epsilon}(f(\textbf{x}_i)-y_i)\right) min(21∥ω∥2+C∑ilϵ(f(xi)−yi)) | SMO算法 | SVM:
y
^
=
s
i
g
n
(
ω
T
x
+
b
)
\hat{y}=sign(\boldsymbol{\omega}^T\textbf{x}+b)
y^=sign(ωTx+b) SVR: y ^ = ω T x + b \hat{y}=\boldsymbol{\omega}^T\textbf{x}+b y^=ωTx+b |
朴素贝叶斯 | 多分类问题 |
max
∑
x
∈
D
c
log
P
(
x
/
θ
c
)
\max\sum_{\textbf{x}\in D_c}\log P(\textbf{x}/\theta_c)
max∑x∈DclogP(x/θc) (注9) | 极大似然估计 (注9) | y ^ = arg max c P ( c ) ∏ i P ( x i / c ) \hat{y}=\argmax_cP(c)\prod_iP(x_i/c) y^=cargmaxP(c)∏iP(xi/c) |
Kmeans | 无监督学习 | —— | “手肘点”(注10) | —— |
K近邻 | 多分类及回归问题 | 分类:0-1损失 回归:平方损失 (注11) | 交叉验证调参 (注11) | 分类问题:
y
^
=
a
r
g
m
a
x
c
j
∑
(
x
i
,
y
i
)
∈
N
k
(
x
i
)
I
(
y
i
=
c
j
)
\hat{y}=argmax_{c_j}\sum_{(\textbf{x}_i,y_i)\in N_k(\textbf{x}_i)}\mathbb{I}(y_i=c_j)
y^=argmaxcj∑(xi,yi)∈Nk(xi)I(yi=cj) 回归问题: y ^ = 1 k ∑ ( x i , y i ) ∈ N k ( x i ) y i \hat{y}=\frac{1}{k}\sum_{(\textbf{x}_i,y_i)\in N_k(\textbf{x}_i)}y_i y^=k1∑(xi,yi)∈Nk(xi)yi (注11) |
Adaboost (注12) | 二分类及回归问题 | 分类:
min
∑
i
exp
(
−
y
i
f
(
x
i
)
)
\min\sum_i\exp(-y_if(\textbf{x}_i))
min∑iexp(−yif(xi)) 回归: min ∑ i ω i e i \min\sum_i\omega_ie_i min∑iωiei | α k = 1 2 ln 1 − e r r k e r r k \alpha_k=\frac{1}{2}\ln\frac{1-err_{k}}{err_k} αk=21lnerrk1−errk | 分类:
y
^
=
s
i
g
n
(
∑
i
m
α
i
g
i
(
x
)
)
\hat{y}=sign\left(\sum_i^m\alpha_ig_i(\textbf{x})\right)
y^=sign(∑imαigi(x)) 回归: y ^ = g k ∗ ( x ) \hat{y}=g_{k^*}(\textbf{x}) y^=gk∗(x) |
神经网络 | 多分类及回归问题 | 分类:交叉熵损失等 回归:平方损失等 | 误差逆传播算法(BP算法) | 神经网络 |
- 注1
可能有人会将该式做如下化简: ω ′ = ( X ′ T X ′ ) − 1 X ′ T y = ( X ′ ) − 1 ( X ′ T ) − 1 X ′ T y = ( X ′ ) − 1 y \begin{aligned}\boldsymbol{\omega}^\prime&=(\textbf{X}^{\prime T}\textbf{X}^\prime)^{-1}\textbf{X}^{\prime T}\textbf{y}\\ &=(\textbf{X}^\prime)^{-1}(\textbf{X}^{\prime T})^{-1}\textbf{X}^{\prime T}\textbf{y}\\ &=(\textbf{X}^\prime)^{-1}\textbf{y}\end{aligned} ω′=(X′TX′)−1X′Ty=(X′)−1(X′T)−1X′Ty=(X′)−1y
这是错误的,因为逆矩阵是对方阵定义的,而训练数据组成的矩阵 X ′ \textbf{X}^\prime X′ 大概率不是方阵,自然没有逆矩阵 - 注2
相较于批量梯度下降(BGD)用所有样本计算梯度,随机梯度下降(SGD)每次只用一个样本计算梯度: B G D : ω t + 1 = ω t + 1 N ∑ i N η y i x i BGD:\ \ \ \boldsymbol{\omega}^{t+1}=\boldsymbol{\omega}^t+\frac{1}{N}\sum_i^N\eta y_i\textbf{x}_i BGD: ωt+1=ωt+N1i∑Nηyixi
S G D : ω t + 1 = ω t + η y i x i SGD:\ \ \ \boldsymbol{\omega}^{t+1}=\boldsymbol{\omega}^t+\eta y_i\textbf{x}_i SGD: ωt+1=ωt+ηyixi注意感知机算法中每次用于计算梯度的样本一定是分类错误的样本 - 注3
其实逻辑回归算法可以直接推广到多分类的情形,假设分类问题有 K K K 个类,那么此时的逻辑回归损失函数具有以下形式:
L = − ∑ i ( I ( y i = 1 ) ln P ( y ^ i = 1 ∣ x i ) + I ( y i = 2 ) ln P ( y ^ i = 2 ∣ x i ) + … + I ( y i = K ) ln P ( y ^ i = K ∣ x i ) ) L=-\sum_i(\mathbb{I}(y_i=1)\ln P(\hat{y}_i=1|\textbf{x}_i)+\mathbb{I}(y_i=2)\ln P(\hat{y}_i=2|\textbf{x}_i)+\ldots+\mathbb{I}(y_i=K)\ln P(\hat{y}_i=K|\textbf{x}_i)) L=−i∑(I(yi=1)lnP(y^i=1∣xi)+I(yi=2)lnP(y^i=2∣xi)+…+I(yi=K)lnP(y^i=K∣xi))
其中 I ( y i = k ) = { 1 y i = k 0 y i ≠ k \mathbb{I}(y_i=k)=\begin{cases}1 & y_i=k\\ 0 & y_i\neq k\end{cases} I(yi=k)={10yi=kyi=k
P ( y ^ i = k ∣ x i ) = exp ( x i ′ T ω k ′ ) 1 + ∑ j = 1 K − 1 exp ( x i ′ T ω j ′ ) k = 1 , 2 , … , K − 1 P ( y ^ i = K ∣ x i ) = 1 1 + ∑ j = 1 K − 1 exp ( x i ′ T ω j ′ ) P(\hat{y}_i=k|\textbf{x}_i)=\frac{\exp(\textbf{x}^{\prime T}_i\boldsymbol{\omega}_k^\prime)}{1+\sum^{K-1}_{j=1}\exp(\textbf{x}^{\prime T}_i\boldsymbol{\omega}_j^\prime)}\ \ \ \ k=1, 2, \ldots, K-1\\P(\hat{y}_i=K|\textbf{x}_i)=\frac{1}{1+\sum^{K-1}_{j=1}\exp(\textbf{x}^{\prime T}_i\boldsymbol{\omega}_j^\prime)} P(y^i=k∣xi)=1+∑j=1K−1exp(xi′Tωj′)exp(xi′Tωk′) k=1,2,…,K−1P(y^i=K∣xi)=1+∑j=1K−1exp(xi′Tωj′)1
其中 x ′ , ω ′ \textbf{x}^\prime,\boldsymbol{\omega}^\prime x′,ω′ 依然是增广后的 x , ω \textbf{x}, \boldsymbol{\omega} x,ω:
x ′ = [ x 1 ] ω ′ = [ ω b ] \textbf{x}^\prime=\begin{bmatrix}\textbf{x}\\1\end{bmatrix}\ \ \ \ \boldsymbol{\omega}^\prime=\begin{bmatrix}\boldsymbol{\omega}\\b\end{bmatrix} x′=[x1] ω′=[ωb]
但是示性函数 I ( y i = k ) \mathbb{I}(y_i=k) I(yi=k) 使梯度的计算不太方便,因而更常用的是OvO(One vs. One)和OvR(One vs. Rest)策略,前者利用任意两个不同类别的样本构造一个二分类模型,因此对于一个 K K K 类分类问题一共会训练 C K 2 C^2_K CK2 个二分类模型,预测时将样本分别输入这些二分类模型,每个模型都会输出一个类别,最终将出现次数最多的那个类别作为预测结果;后者则只训练 K K K 个二分类模型,这些二分类模型依次将 K K K 个类中每个类标为正类,同时把其余类别均标为负类去训练,预测时将样本分别输入这些二分类模型,此时可能有多个模型将其预测为正类,最终选置信度最大的那个模型对应的类别作为预测结果。 - 注4
假设有 K K K 个类,属于第 i i i 类的样本记为 { x i } \{\textbf{x}_i\} {xi},有 n i n_i ni 个,且第 i i i 类的均值向量为 μ i \boldsymbol{\mu}_i μi ,所有样本的均值向量为 μ \boldsymbol{\mu} μ,定义全局散度矩阵 S t \textbf{S}_t St:
S t = ∑ i = 1 N ( x i − μ ) ( x i − μ ) T \textbf{S}_t=\sum_{i=1}^N(\textbf{x}_i-\boldsymbol{\mu})(\textbf{x}_i-\boldsymbol{\mu})^T St=i=1∑N(xi−μ)(xi−μ)T
类内散度矩阵 S ω \textbf{S}_{\omega} Sω:
S ω = ∑ i = 1 K ∑ x ∈ { x i } ( x − μ i ) ( x − μ i ) T \textbf{S}_{\omega}=\sum_{i=1}^K\sum_{\textbf{x}\in\{\textbf{x}_i\}}(\textbf{x}-\boldsymbol{\mu}_i)(\textbf{x}-\boldsymbol{\mu}_i)^T Sω=i=1∑Kx∈{xi}∑(x−μi)(x−μi)T
则类间散度矩阵 S b \textbf{S}_b Sb: S b = S t − S ω = ∑ i = 1 K n i ( μ i − μ ) ( μ i − μ ) T \textbf{S}_b=\textbf{S}_{t}-\textbf{S}_{\omega}=\sum_{i=1}^Kn_i(\boldsymbol{\mu}_i-\boldsymbol{\mu})(\boldsymbol{\mu}_i-\boldsymbol{\mu})^T Sb=St−Sω=i=1∑Kni(μi−μ)(μi−μ)T
线性判别分析的思路是将所有样本投影到一个低维空间,使得在这个空间里不同类之间有较好的区分度,即不同类的样本中心距离( t r ( W T S b W ) tr(\textbf{W}^T\textbf{S}_b\textbf{W}) tr(WTSbW))尽可能大;属于同一个类的样本尽可能靠近,即类内样本距离( t r ( W T S ω W ) tr(\textbf{W}^T\textbf{S}_{\omega}\textbf{W}) tr(WTSωW))尽可能小,于是得到LDA的优化目标:
max W t r ( W T S b W ) t r ( W T S ω W ) \max_{\textbf{W}}\frac{tr(\textbf{W}^T\textbf{S}_b\textbf{W})}{tr(\textbf{W}^T\textbf{S}_{\omega}\textbf{W})} Wmaxtr(WTSωW)tr(WTSbW)
注意到分子分母都是 W \textbf{W} W 的二次项,因此求解的结果只与 W \textbf{W} W 的方向有关,因此不妨令 t r ( W T S ω W ) = 1 tr(\textbf{W}^T\textbf{S}_{\omega}\textbf{W})=1 tr(WTSωW)=1,则原问题转化为:
max W t r ( W T S b W ) s . t . t r ( W T S ω W ) = 1 \max_{\textbf{W}}tr(\textbf{W}^T\textbf{S}_b\textbf{W})\\ s.t. \ \ \ tr(\textbf{W}^T\textbf{S}_{\omega}\textbf{W})=1 Wmaxtr(WTSbW)s.t. tr(WTSωW)=1
根据拉格朗日乘子法,原问题取极值时有:
d d W ( − t r ( W T S b W ) + λ ( t r ( W T S ω W ) − 1 ) ) = 0 \frac{d}{d\textbf{W}}(-tr(\textbf{W}^T\textbf{S}_b\textbf{W})+\lambda(tr(\textbf{W}^T\textbf{S}_{\omega}\textbf{W})-1))=0 dWd(−tr(WTSbW)+λ(tr(WTSωW)−1))=0
化简即得:
S b W = λ S ω W \textbf{S}_b\textbf{W}=\lambda\textbf{S}_{\omega}\textbf{W} SbW=λSωW - 注5,6,7
决策树的生成是递归式的,对于ID3算法,每次分叉时需要考察当前可以利用的所有特征,分别计算按其中一个特征的不同取值进行分叉时的信息增益,最终选择信息增益最大的那个特征分叉:假设当前节点样本集为 D D D,其包含的样本数为 N N N,标签有 K K K 类,属于第 k k k 类的样本有 N k N^k Nk 个( k k k 仅仅是上标,不代表指数运算),可以利用的特征为 { A 1 , A 2 , … , A i , … } \{A_1,A_2, \ldots, A_i, \ldots\} {A1,A2,…,Ai,…},其中特征 A i A_i Ai 的取值有 a a a 个(Quinlan在提出ID3算法时没有考虑连续型特征,因此这里的特征 A A A 默认为离散型特征),那么以 A i A_i Ai 分叉可以将当前样本集分成 a a a 组,每一组的样本数量记为 N j N_j Nj,其中属于第 k k k 类的样本数为 N j k N^k_{j} Njk,则以 A i A_i Ai 分叉获得的信息增益为:
g a i n ( D , A i ) = S ( D ) − S ( D ∣ A i ) = − ∑ k = 1 K N k N ln ( N k N ) + ∑ j = 1 a N j N ∑ k = 1 K N j k N j ln ( N j k N j ) \begin{aligned}gain(D, A_i)&=S(D)-S(D|A_i)\\&=-\sum_{k=1}^K\frac{N^k}{N}\ln\left(\frac{N^k}{N}\right)+\sum_{j=1}^a\frac{N_j}{N}\sum_{k=1}^K\frac{N_j^k}{N_j}\ln\left(\frac{N_j^k}{N_j}\right)\end{aligned} gain(D,Ai)=S(D)−S(D∣Ai)=−k=1∑KNNkln(NNk)+j=1∑aNNjk=1∑KNjNjkln(NjNjk)
同理计算出以其他可用特征分叉获得的信息增益,最终选择信息增益最大的特征分叉
ID3算法的性质使得它会偏好取值多的特征,因此C4.5算法在特征选择上做了改进,以信息增益率作为衡量特征的标准:
g a i n _ r a t e ( D , A i ) = g a i n ( D , A i ) S A i ( D ) S A i ( D ) = − ∑ j = 1 a N j N ln N j N gain\_rate(D, A_i)=\frac{gain(D, A_i)}{S_{A_i}(D)}\\S_{A_i}(D)=-\sum_{j=1}^a\frac{N_j}{N}\ln\frac{N_j}{N} gain_rate(D,Ai)=SAi(D)gain(D,Ai)SAi(D)=−j=1∑aNNjlnNNj
此外C4.5可以处理连续型特征,处理方法与CART相同,见下文
分类回归树(CART)即可以用于分类问题也可以用于回归问题,它在构建分类树和回归树时采用了不同的指标;在构建回归树时通过最小化平方误差来选择特征,举个例子,假设在当前节点考察以特征 A A A 分叉的效果,如果特征 A A A 是离散型特征,且取值有序关系(比如年龄取值为青年,中年,老年),那么可以将该特征做离散化编码,然后按连续型特征的处理方法处理;如果没有序关系(比如职业取值为工人,教师,企业家),那么遍历所有可能的划分方法({工人}{教师,企业家}、{教师}{工人,企业家}、{企业家}{教师,工人}),选出平方误差最小的那个,每个节点的预测值即该节点所有样本的标签值的平均值;如果特征 A A A 是连续型特征,那么先将特征 A A A 的取值按从小到大的顺序排序 [ a 1 , a 2 , . . . , a n ] [a_1, a_2, ..., a_n] [a1,a2,...,an],然后依次以 a 1 + a 2 2 , a 2 + a 3 2 , . . . , a n − 1 + a n 2 \frac{a_1+a_2}{2}, \frac{a_2+a_3}{2},...,\frac{a_{n-1}+a_n}{2} 2a1+a2,2a2+a3,...,2an−1+an 作为阈值将当前节点的样本划分为两类: D 1 = { x ∣ x 在 特 征 A 上 的 取 值 小 于 等 于 阈 值 } D_1=\{x|x在特征A上的取值小于等于阈值\} D1={x∣x在特征A上的取值小于等于阈值} D 2 = { x ∣ x 在 特 征 A 上 的 取 值 大 于 阈 值 } D_2=\{x|x在特征A上的取值大于阈值\} D2={x∣x在特征A上的取值大于阈值},记集合 D 1 D_1 D1 样本数为 N 1 N_1 N1 ,集合 D 2 D_2 D2 样本数为 N 2 N_2 N2,它们的预测值分别是两个集合中所有样本的标签值的平均值,分别记为 c 1 c_1 c1 c 2 c_2 c2,计算此时的平方误差: ∑ ( x i , y i ) ∈ D 1 ( y i − c 1 ) 2 + ∑ ( x i , y i ) ∈ D 2 ( y i − c 2 ) 2 \sum_{(x_i,y_i)\in D_1}(y_i-c_1)^2+\sum_{(x_i,y_i)\in D_2}(y_i-c_2)^2 (xi,yi)∈D1∑(yi−c1)2+(xi,yi)∈D2∑(yi−c2)2 遍历所有可选的特征 A A A 和可能的切分点 s s s,最终选择平方误差最小的那个特征及其切分方法: ( A , s ) = m i n A , s ( ∑ ( x i , y i ) ∈ D 1 ( y i − c 1 ) 2 + ∑ ( x i , y i ) ∈ D 2 ( y i − c 2 ) 2 ) (A, s)=min_{A,s}\left(\sum_{(x_i,y_i)\in D_1}(y_i-c_1)^2+\sum_{(x_i,y_i)\in D_2}(y_i-c_2)^2\right) (A,s)=minA,s⎝⎛(xi,yi)∈D1∑(yi−c1)2+(xi,yi)∈D2∑(yi−c2)2⎠⎞在构建分类树时CART对特征的处理方式和上述相同,但是采用基尼指数作为选择特征的标准;假设当前节点样本集为 D D D,样本数为 N N N,使用特征 A A A 将当前节点划分为两类 D 1 D_1 D1 D 2 D_2 D2,样本数分别为 N 1 N_1 N1 N 2 N_2 N2, N 1 k N_1^k N1k 表示 D 1 D_1 D1 中属于第 k k k 类的样本数,同理 N 2 k N_2^k N2k 表示 D 2 D_2 D2 中属于第 k k k 类的样本数,那么该划分结果的基尼指数为: g i n i ( D , A ) = N 1 N g i n i ( D 1 ) + N 2 N g i n i ( D 2 ) = N 1 N ( 1 − ∑ k K ( N 1 k N 1 ) 2 ) + N 2 N ( 1 − ∑ k K ( N 2 k N 2 ) 2 ) \begin{aligned}gini(D,A)&=\frac{N_1}{N}gini(D_1)+\frac{N_2}{N}gini(D_2)\\&=\frac{N_1}{N}\left(1-\sum_k^K \left(\frac{N_1^k}{N_1}\right)^2\right)+\frac{N_2}{N}\left(1-\sum_k^K \left(\frac{N_2^k}{N_2}\right)^2\right)\end{aligned} gini(D,A)=NN1gini(D1)+NN2gini(D2)=NN1(1−k∑K(N1N1k)2)+NN2(1−k∑K(N2N2k)2)
最后选择基尼指数最小的那个特征及其切分方法进行分叉 - 注8
SVM是老生常谈的算法了,这里不做介绍,只讲解SVR算法
和普通的线性回归要求样本点到超平面的距离越小越好不同,SVR允许超平面有 ϵ \epsilon ϵ 的误差,即只要样本点落在 [ ω T x + b − ϵ , ω T x + b + ϵ ] [\boldsymbol{\omega}^T\textbf{x}+b-\epsilon, \boldsymbol{\omega}^T\textbf{x}+b+\epsilon] [ωTx+b−ϵ,ωTx+b+ϵ] 这个薄层内都算成功拟合,同时类似SVM,SVR也要求最大化超平面与样本之间的间隔,因此SVR要求解的问题为: min ( 1 2 ∥ ω ∥ 2 + C ∑ i N l ϵ ( f ( x i ) − y i ) ) l ϵ ( x ) = { 0 , i f ∣ x ∣ ≤ ϵ ∣ x ∣ − ϵ , o t h e r w i s e \min\left(\frac{1}{2}\left\|\boldsymbol{\omega}\right\|^2+C\sum_i^N\mathcal{l}_{\epsilon}(f(\textbf{x}_i)-y_i)\right)\\ \mathcal{l}_{\epsilon}(x)=\begin{cases}0, & if|x| \leq\epsilon\\|x|-\epsilon, &otherwise\end{cases} min(21∥ω∥2+Ci∑Nlϵ(f(xi)−yi))lϵ(x)={0,∣x∣−ϵ,if∣x∣≤ϵotherwise引入松弛变量 ξ \xi ξ ζ \zeta ζ:
ω T x i + b − y i ≤ ϵ + ξ i y i − ω T x i − b ≤ ϵ + ζ i \boldsymbol{\omega}^T\textbf{x}_i+b-y_i\leq\epsilon+\xi_i\\ y_i-\boldsymbol{\omega}^T\textbf{x}_i-b\leq\epsilon+\zeta_i ωTxi+b−yi≤ϵ+ξiyi−ωTxi−b≤ϵ+ζi
则原问题可转化为: min ( 1 2 ∥ ω ∥ 2 + C ∑ i N ( ξ i + ζ i ) ) s . t . ω T x i + b − y i ≤ ϵ + ξ i y i − ω T x i − b ≤ ϵ + ζ i ξ i ≥ 0 ζ i ≥ 0 \min\left(\frac{1}{2}\left\|\boldsymbol{\omega}\right\|^2+C\sum_i^N\left(\xi_i+\zeta_i\right)\right)\\s.t. \ \ \ \boldsymbol{\omega}^T\textbf{x}_i+b-y_i\leq\epsilon+\xi_i\\ y_i-\boldsymbol{\omega}^T\textbf{x}_i-b\leq\epsilon+\zeta_i\\ \xi_i\ge0\\ \zeta_i\ge0 min(21∥ω∥2+Ci∑N(ξi+ζi))s.t. ωTxi+b−yi≤ϵ+ξiyi−ωTxi−b≤ϵ+ζiξi≥0ζi≥0构造朗格朗日函数 L \mathcal{L} L:
L = 1 2 ∥ ω ∥ 2 + C ∑ i N ( ξ i + ζ i ) + ∑ i N α i ( ω T x i + b − y i − ϵ − ξ i ) + ∑ i N β i ( y i − ω T x i − b − ϵ − ζ i ) − ∑ i N μ i ξ i − ∑ i N ν i ζ i \mathcal{L}=\frac{1}{2}\left\|\boldsymbol{\omega}\right\|^2+C\sum_i^N\left(\xi_i+\zeta_i\right)+\sum_i^N\alpha_i\left(\boldsymbol{\omega}^T\textbf{x}_i+b-y_i-\epsilon-\xi_i\right)+\sum_i^N\beta_i\left(y_i-\boldsymbol{\omega}^T\textbf{x}_i-b-\epsilon-\zeta_i\right)-\sum_i^N\mu_i\xi_i-\sum_i^N\nu_i\zeta_i L=21∥ω∥2+Ci∑N(ξi+ζi)+i∑Nαi(ωTxi+b−yi−ϵ−ξi)+i∑Nβi(yi−ωTxi−b−ϵ−ζi)−i∑Nμiξi−i∑Nνiζi
其中 α ≥ 0 , β ≥ 0 , μ ≥ 0 , ν ≥ 0 \alpha\ge0,\ \beta\ge0,\ \mu\ge0,\ \nu\ge0 α≥0, β≥0, μ≥0, ν≥0 为朗格朗日乘子,分别令 L \mathcal{L} L 对 ω \boldsymbol{\omega} ω、 b b b、 ξ i \xi_i ξi、 ζ i \zeta_i ζi 的偏导等于0可得:
ω = ∑ i N ( β i − α i ) x i ∑ i N α i = ∑ i N β i C = α i + μ i C = β i + ν i \boldsymbol{\omega}=\sum_i^N\left(\beta_i-\alpha_i\right)\textbf{x}_i\\\sum_i^N\alpha_i=\sum_i^N\beta_i\\C=\alpha_i+\mu_i\\C=\beta_i+\nu_i ω=i∑N(βi−αi)xii∑Nαi=i∑NβiC=αi+μiC=βi+νi代入 L \mathcal{L} L 得原问题的对偶问题:
max ∑ i N ( y i ( β i − α i ) + ϵ ( β i + α i ) ) − 1 2 ∑ i N ∑ j N ( β i − α i ) ( β j − α j ) x i T x j s . t . ∑ i N α i = ∑ i N β i 0 ≤ α i , β i ≤ C \max\sum_i^N\left(y_i(\beta_i-\alpha_i)+\epsilon(\beta_i+\alpha_i)\right)-\frac{1}{2}\sum_i^N\sum_j^N(\beta_i-\alpha_i)(\beta_j-\alpha_j)\textbf{x}_i^T\textbf{x}_j\\ s.t.\ \ \ \sum_i^N\alpha_i=\sum_i^N\beta_i\\0\leq\alpha_i,\beta_i\leq C maxi∑N(yi(βi−αi)+ϵ(βi+αi))−21i∑Nj∑N(βi−αi)(βj−αj)xiTxjs.t. i∑Nαi=i∑Nβi0≤αi,βi≤C该问题对应的KKT条件为:
α i ( ω T x i + b − y i − ϵ − ξ i ) = 0 β i ( y i − ω T x i − b − ϵ − ζ i ) = 0 μ i ξ i = ( C − α i ) ξ i = 0 ν i ζ i = ( C − β i ) ζ i = 0 α i β i = 0 ξ i ζ i = 0 \alpha_i\left(\boldsymbol{\omega}^T\textbf{x}_i+b-y_i-\epsilon-\xi_i\right)=0\\\beta_i\left(y_i-\boldsymbol{\omega}^T\textbf{x}_i-b-\epsilon-\zeta_i\right)=0\\\mu_i\xi_i=(C-\alpha_i)\xi_i=0\\\nu_i\zeta_i=(C-\beta_i)\zeta_i=0\\\alpha_i\beta_i=0\\\xi_i\zeta_i=0 αi(ωTxi+b−yi−ϵ−ξi)=0βi(yi−ωTxi−b−ϵ−ζi)=0μiξi=(C−αi)ξi=0νiζi=(C−βi)ζi=0αiβi=0ξiζi=0
最后两式是因为任一样本的 y i y_i yi 或者在薄层上方或者在薄层下方,因此 f ( x i ) − y i − ϵ = ξ i f(\textbf{x}_i)-y_i-\epsilon=\xi_i f(xi)−yi−ϵ=ξi 和 y i − f ( x i ) − ϵ = ζ i y_i-f(\textbf{x}_i)-\epsilon=\zeta_i yi−f(xi)−ϵ=ζi 只能有一个成立, α i \alpha_i αi 和 β i \beta_i βi 其中必有一个为0,即 α i β i = 0 \alpha_i\beta_i=0 αiβi=0 ;再结合KKT条件中间两式又可推出 ξ i ζ i = 0 \xi_i\zeta_i=0 ξiζi=0
和SVM一样,该问题可由序列最小最优化(SMO)算法求解,最终的模型有以下形式: y ^ = ∑ i ∈ s v ( β i − α i ) x i x + b \hat{y}=\sum_{i\in sv}\left(\beta_i-\alpha_i\right)\textbf{x}_i\textbf{x}+b y^=i∈sv∑(βi−αi)xix+b其中 s v sv sv 表示支持向量对应的下标集
另外注意SMO算法求解得到的是 α i \alpha_i αi 和 β i \beta_i βi, ω \boldsymbol{\omega} ω 是由 α i \alpha_i αi β i \beta_i βi 和 x i \textbf{x}_i xi 计算得出的;在计算 b b b 时选出多个或所有满足 0 < α i < C 0<\alpha_i<C 0<αi<C 的样本,此时由KKT条件知: ξ i = 0 ω T x i + b − y i − ϵ − ξ i = ω T x i + b − y i − ϵ = 0 \xi_i=0\\ \boldsymbol{\omega}^T\textbf{x}_i+b-y_i-\epsilon-\xi_i=\boldsymbol{\omega}^T\textbf{x}_i+b-y_i-\epsilon=0 ξi=0ωTxi+b−yi−ϵ−ξi=ωTxi+b−yi−ϵ=0因此 b = y i + ϵ − ω T x i b=y_i+\epsilon-\boldsymbol{\omega}^T\textbf{x}_i b=yi+ϵ−ωTxi,用每个选出的样本计算得到一个 b b b,最后求这些解的平均值就得到了最终模型的 b b b - 注9
对于多分类问题,若记 l i j l_{ij} lij 为将属于第 i i i 类的样本点误分为第 j j j 类的损失, P ( c j ∣ x ) P(c_j|\textbf{x}) P(cj∣x) 表示模型将 x \textbf{x} x 预测为第 j j j 类的概率,则该问题的期望损失为 L = E x ( ∑ j l i j P ( c j ∣ x ) ) L=\mathbb{E}_\textbf{x}\left(\sum_jl_{ij}P(c_j|\textbf{x})\right) L=Ex(j∑lijP(cj∣x)) 为了最小化损失函数,注意到样本之间是独立的,可以通过最小化每个样本的期望损失来最小化总的损失,即: min ( ∑ j l i j P ( c j ∣ x ) ) \min\left(\sum_jl_{ij}P(c_j|\textbf{x})\right) min(j∑lijP(cj∣x)) 若将 l i j l_{ij} lij 取为0-1损失则有: min ( ∑ j l i j P ( c j ∣ x ) ) = min ( ∑ j ≠ i P ( c j ∣ x ) ) = min ( 1 − P ( c i ∣ x ) ) = max P ( c i ∣ x ) \begin{aligned}\min\left(\sum_jl_{ij}P(c_j|\textbf{x})\right)&=\min\left(\sum_{j\neq i}P(c_j|\textbf{x})\right)\\ &=\min\left(1-P(c_i|\textbf{x})\right)\\ &=\max P(c_i|\textbf{x})\end{aligned} min(j∑lijP(cj∣x))=min⎝⎛j=i∑P(cj∣x)⎠⎞=min(1−P(ci∣x))=maxP(ci∣x) 于是得到了后验概率最大化准则;根据贝叶斯公式, P ( c i ∣ x ) = P ( x ∣ c i ) P ( c i ) P ( x ) P(c_i|\textbf{x})=\frac{P(\textbf{x}|c_i)P(c_i)}{P(\textbf{x})} P(ci∣x)=P(x)P(x∣ci)P(ci),对给定的样本,分母显然不会影响预测结果,于是模型的参数就是 P ( c i ) P(c_i) P(ci) 和 P ( x ∣ c i ) P(\textbf{x}|c_i) P(x∣ci);前者可以通过类标签出现的频率估计: P ( c i ) = N i N P(c_i)=\frac{N_i}{N} P(ci)=NNi 其中 N i N_i Ni 表示属于第 i i i 类的样本数量, N N N 表示样本总数;为了计算后者,朴素贝叶斯算法进一步假设各个特征独立地影响样本的分类,因此 P ( x ∣ c i ) = ∏ f n P ( x f ∣ c i ) P(\textbf{x}|c_i)=\prod_f^nP(x^f|c_i) P(x∣ci)=f∏nP(xf∣ci) 其中 n n n 表示特征数量,于是得到数据集的对数似然函数:
log P = log ∏ k K ∏ x i ∈ D k P ( c k ∣ x i ) = log ∏ k K ∏ x i ∈ D k P ( c k ) P ( x i ∣ c k ) = log ∏ k K ∏ x i ∈ D k P ( c k ) ∏ f n P ( x i f ∣ c k ) \begin{aligned}\log P&=\log\prod_k^K\prod_{\textbf{x}_i\in D_k}P(c_k|\textbf{x}_i)\\&=\log\prod_k^K\prod_{\textbf{x}_i\in D_k}P(c_k)P(\textbf{x}_i|c_k)\\&=\log\prod_k^K\prod_{\textbf{x}_i\in D_k}P(c_k)\prod_f^n P(x_{i}^f|c_k)\end{aligned} logP=logk∏Kxi∈Dk∏P(ck∣xi)=logk∏Kxi∈Dk∏P(ck)P(xi∣ck)=logk∏Kxi∈Dk∏P(ck)f∏nP(xif∣ck) 极大化对数似然函数可得参数估计(由于计算比较繁琐,我没有亲自推导,如果有误欢迎指出):
1)若特征取值是离散的,则 P ( x f = a f m ∣ c k ) = ∑ i N I ( x i f = a f m , y i = c k ) N k P(x^{f}=a_{fm}|c_k)=\frac{\sum_i^N\mathbb{I}(x_{i}^f=a_{fm}, y_i=c_k)}{N_k} P(xf=afm∣ck)=Nk∑iNI(xif=afm,yi=ck) 其中 x f x^{f} xf 表示 x \textbf{x} x 的第 f f f 个特征的取值, a f m a_{fm} afm 表示 x \textbf{x} x 的第 f f f 个特征的第 m m m 种取值, N k N_k Nk 表示第 k k k 类样本的样本数, I ( ⋅ ) \mathbb{I}(\cdot) I(⋅) 是示性函数;实际应用中为了避免某特征的取值和某类别的组合未在训练集中出现从而导致概率为0,常采用贝叶斯估计:
P ( c i ) = N i + λ N + K λ P ( x f = a f m ∣ c k ) = ∑ i N I ( x i f = a f m , y i = c k ) + λ N k + M λ P(c_i)=\frac{N_i+\lambda}{N+K\lambda}\\ P(x^{f}=a_{fm}|c_k)=\frac{\sum_i^N\mathbb{I}(x_{i}^f=a_{fm}, y_i=c_k)+\lambda}{N_k+M\lambda} P(ci)=N+KλNi+λP(xf=afm∣ck)=Nk+Mλ∑iNI(xif=afm,yi=ck)+λ 其中 K K K 代表训练集总类别数, M M M 代表 x \textbf{x} x 的第 f f f 个特征的不同取值的数量; λ = 1 \lambda=1 λ=1 时的贝叶斯估计也叫拉普拉斯平滑
2)若特征取值是连续的,则概率的估计值取决于先验概率 P ( x i f ∣ c k ) P(x_{i}^f|c_k) P(xif∣ck) 的形式,一般取正态分布,此时 P ( x f ∣ c k ) = 1 2 π σ k f exp ( − ( x f − μ k f ) 2 2 ( σ k f ) 2 ) P(x^{f}|c_k)=\frac{1}{\sqrt{2\pi}\sigma_k^f}\exp\left(-\frac{(x^{f}-\mu_k^f)^2}{2(\sigma_k^f)^2}\right) P(xf∣ck)=2πσkf1exp(−2(σkf)2(xf−μkf)2) 其中 μ k f \mu_k^f μkf 表示第 k k k 类样本在第 f f f 个属性上的均值, σ k f \sigma_k^f σkf 表示第 k k k 类样本在第 f f f 个属性上的标准差 - 注10
Kmeans 算法的k值的确定一般是通过在不同k值下运行算法,分别计算所有样本点到它们各自的类中心的距离之和(inertia),然后以距离之和对k作图,该图的“手肘点”对应的k值即为最优的k值
以sklearn的鸢尾花数据集为例:
输出:from sklearn.decomposition import PCA from sklearn.datasets import load_iris import matplotlib.pyplot as plt from sklearn.cluster import KMeans X = load_iris().data # 为了便于可视化,先将数据集降维到2维 pca = PCA(n_components=2) data = pca.fit_transform(X) distances = [] for k in range(1, 10): clf = KMeans(n_clusters=k) clf.fit(data) distances.append(clf.inertia_) plt.plot(list(range(1, 10)), distances) plt.xlabel('number of classes') plt.ylabel('inertia') plt.show()
可以看到在k=2处曲线有明显拐点(因该位置形似手肘亦称“手肘点”),因此将数据集分成2类最合适(值得注意的是数据集实际有3类),通过绘制数据集的散点图可以更清楚地看到为什么k=2最优:
可以看到降维后的数据集确实形成了两个团簇
该调参方法的思想很简单,假设最优分类数为 k ∗ k^* k∗,当 k < k ∗ k<k^* k<k∗ 时,必然有两个及以上的类被合并成一个类,注意到属于不同类的样本点之间的距离应大于属于同一类的样本点之间的距离,因此该混合类中样本点到类中心的距离之和应大于 k = k ∗ k=k^* k=k∗ 时样本点到各自的类中心点的距离之和,此时增加 k k k 则 inertia 会有显著下降;当 k > k ∗ k>k^* k>k∗ 时,必然有一个及以上的类被拆分成两个或多个子类,此时增加 k k k 则 inertia 虽然会下降但下降不会很明显;当 k k k 达到最大值 N N N 时每个样本点自成一类,此时 inertia 为0 - 注11
k近邻(kNN)算法由3个基本要素决定:k值、距离度量和决策规则,其中k值是超参数,距离度量有多种选择,最常见的就是欧氏距离,决策规则也有多种,对分类问题来说一般采取多数表决,即找出距离待预测样本点最近的k个样本点,将这k个样本点中出现次数最多的那个类别作为预测结果: y ^ = arg max c j ∑ ( x i , y i ) ∈ N k ( x i ) I ( y i = c j ) \hat{y}=\argmax_{c_j}\sum_{(\textbf{x}_i,y_i)\in N_k(\textbf{x}_i)}\mathbb{I}(y_i=c_j) y^=cjargmax(xi,yi)∈Nk(xi)∑I(yi=cj)其中 N k ( x i ) N_k(\textbf{x}_i) Nk(xi) 表示距离 x i \textbf{x}_i xi 最近的k个样本点的集合, I ( y i = c j ) \mathbb{I}(y_i=c_j) I(yi=cj) 是示性函数,当且仅当 y i = c j y_i=c_j yi=cj 时取1
对回归问题则决策规则一般采用平均值法,即找出距离待预测样本点最近的k个样本点,将这k个样本点的标签值的平均值作为预测结果: y ^ = 1 k ∑ ( x i , y i ) ∈ N k ( x i ) y i \hat{y}=\frac{1}{k}\sum_{(\textbf{x}_i,y_i)\in N_k(\textbf{x}_i)}y_i y^=k1(xi,yi)∈Nk(xi)∑yi不过当数据特征多于3个时还是线性回归的表现更好(见文末参考3)
kNN的调参主要借助验证集进行调参,对于分类问题,对每个可能的 k k k 值运行算法,分别计算模型的错误率,最终选择错误率最低的那个模型对应的 k k k 值;对于回归问题,也是对每个可能的 k k k 值运行算法,分别计算平方误差,最终选择错误率最低的那个模型对应的 k k k 值 - 注12
Adaboost原始算法是不可以直接推广到多分类问题的,不过有学者对其做了改进,得到了可以用于多分类问题的Adaboost算法变体,详情见Adaboost多分类
关于Adaboost用于回归问题见参考2
参考
- 刘建平,梯度下降(Gradient Descent)小结
- 刘建平,集成学习之Adaboost算法原理小结
- 梁斌炜,kNN回归
- Jim Liang, Getting Started With Machine Learning
- 李航,统计学习方法
- 周志华,机器学习