对于分类任务考虑的问题
1.分类模型的指标
判定错和判定对的代价不同
例如:我们将癌症患者错误预测为无癌症和无癌症患者错误预测为癌症患者,在医院和个人的代价都是不同的,前者会使得患者无法得到及时的救治而耽搁了最佳治疗时间甚至付出生命的代价,而后者只需要在后续的治疗过程中继续取证就好了,因此我们很不希望出现前者,当我们发生了前者这样的错误的时候会认为建立的模型是很差的。为了解决这些问题,我们必须将各种情况分开讨论,然后给出评价指标。
真阳性TP:预测值和真实值都为正例;
真阴性TN:预测值与真实值都为正例;
假阳性FP:预测值为正,实际值为负;
假阴性FN:预测值为负,实际值为正;
分类模型的指标:链接
准确率:分类正确的样本数占总样本的比例,即: 𝐴𝐶𝐶=𝑇𝑃+𝑇𝑁𝐹𝑃+𝐹𝑁+𝑇𝑃+𝑇𝑁 .
精度:预测为正且分类正确的样本占预测值为正的比例,即: 𝑃𝑅𝐸=𝑇𝑃𝑇𝑃+𝐹𝑃 .
召回率:预测为正且分类正确的样本占类别为正的比例,即: 𝑅𝐸𝐶=𝑇𝑃𝑇𝑃+𝐹𝑁 .
F1值:综合衡量精度和召回率,即: 𝐹1=2𝑃𝑅𝐸×𝑅𝐸𝐶𝑃𝑅𝐸+𝑅𝐸𝐶 .
ROC曲线:以假阳率为横轴,真阳率为纵轴画出来的曲线,曲线下方面积越大越好。
2.模型
逻辑回归logistic regression:
说到分类问题与回归问题的区别,在于回归问题与分类问题需要预测的因变量不一样。
在回归问题中,因变量是连续性变量,我们需要预测 𝐸(𝑌|𝑋) 是一个连续的实数,但是在分类问题中,我们往往是通过已知X的信息预测Y的类别,往往是一个离散集合中的某个元素。
先来看看线性回归处理分类问题会出现什么弊端,我们仔细来看这个线性回归的例子,
假设我们需要用某个人的债务(Balance)和收入(Income)去预测是否会信用卡违约(default):
d
e
f
a
u
l
t
=
β
0
+
β
1
B
a
l
a
n
c
e
+
β
2
I
n
c
o
m
e
{default = \beta_0 + \beta_1 Balance + \beta_2 Income}
default=β0+β1Balance+β2Income,只要输入Balance 和 Income 以及default的数据就能用最小二乘法估计出
β
0
,
β
1
{\beta_0,\beta_1}
β0,β1,设定预测的default>0.5就是违约反之不违约,感觉很完美的样子,但事实真的是这样吗?
我们假设有一个穷人Lisa,他的Balance和Income都很小,那么有可能会导致default的值为负数,那么这个负数代表什么意义呢?显然是没有任何意义的。
当我们的分类变量是多类的时候,以0.5为界限划分分类就不可用了,那么我们应该怎么找到一个界限衡量多分类呢?
当线性模型不合适的时候,是否可以将线性回归的结果default转化为区间[0:1]上,让default转变成一个违约的概率呢?
首先,我们假设我们的线性回归模型为
Y
=
β
0
+
β
1
X
{Y=\beta_0+\beta_1 X}
Y=β0+β1X,那么这个函数是如何将线性回归的结果转化为概率呢?这个函数就是logistic 函数,具体的形式为
p
(
X
)
=
e
β
0
+
β
1
X
1
+
e
β
0
+
β
1
X
{p(X) = \dfrac{e^{\beta_0 + \beta_1X}}{1+e^{\beta_0 + \beta_1X}}}
p(X)=1+eβ0+β1Xeβ0+β1X,他的函数图像如下图:(左边是线性回归,右边是逻辑函数)
因此,我们假设逻辑回归模型为:
p
(
y
=
1
∣
x
)
=
1
1
+
e
−
w
T
x
p(y = 1|x) = \frac{1}{1+e^{-w^Tx}}
p(y=1∣x)=1+e−wTx1 .
下面我们来具体推导下逻辑回归模型:
假设数据Data
{
(
x
i
,
y
i
)
}
,
i
=
1
,
2
,
.
.
.
,
N
,
x
i
∈
R
p
,
y
i
∈
{
0
,
1
}
\{(x_i,y_i) \},\;\;i = 1,2,...,N,\;\;x_i \in R^p,y_i \in \{0,1 \}
{(xi,yi)},i=1,2,...,N,xi∈Rp,yi∈{0,1},设
p
1
=
p
(
y
=
1
∣
x
)
=
σ
(
w
T
)
=
1
1
+
e
−
w
T
x
p_1 = p(y=1|x) = \sigma(w^T) = \frac{1}{1+e^{-w^Tx}}
p1=p(y=1∣x)=σ(wT)=1+e−wTx1。因为y只可能取0或者1,因此假设数据服从0-1分布,也叫伯努力分布,即:当y=1时,
p
(
y
∣
x
)
=
p
1
p(y|x)=p_1
p(y∣x)=p1,当y=0时,
p
(
y
∣
x
)
=
1
−
p
1
p(y|x)=1-p_1
p(y∣x)=1−p1,可以写成
p
(
y
∣
x
)
=
p
1
y
(
1
−
p
1
)
1
−
y
p(y|x) = p_1^y(1-p_1)^{1-y}
p(y∣x)=p1y(1−p1)1−y,可以带入y=0和y=1进去验证,结果和前面的结论一模一样。
我们使用极大似然估计MLE,即:
w
^
=
a
r
g
m
a
x
w
l
o
g
P
(
Y
∣
X
)
=
a
r
g
m
a
x
x
l
o
g
∏
i
=
1
N
P
(
y
i
∣
x
i
)
=
a
r
g
m
a
x
w
∑
i
=
1
N
l
o
g
P
(
y
i
∣
x
i
)
=
a
r
g
m
a
x
w
∑
i
=
1
N
(
y
i
l
o
g
p
1
+
(
1
−
y
i
)
l
o
g
(
1
−
p
1
)
)
记
:
L
(
w
)
=
∑
i
=
1
N
(
y
i
l
o
g
p
1
+
(
1
−
y
i
)
l
o
g
(
1
−
p
1
)
)
∂
L
∂
w
k
=
∑
i
=
1
N
y
i
1
p
1
∂
p
1
∂
z
∂
z
∂
w
k
+
(
1
−
y
i
)
1
1
−
p
1
(
−
∂
p
1
∂
z
∂
z
∂
w
k
)
=
∑
i
=
1
N
y
i
1
σ
(
z
)
(
σ
(
z
i
)
−
σ
(
z
i
)
2
)
x
i
+
(
1
−
y
i
)
1
1
−
σ
(
z
i
)
[
−
(
σ
(
z
i
)
−
σ
(
z
i
)
2
)
x
i
]
=
∑
i
=
1
N
[
(
y
i
−
y
i
σ
(
z
i
)
)
x
i
+
(
1
−
y
i
)
(
−
σ
(
z
i
)
)
x
i
]
=
∑
i
=
1
N
y
i
x
i
−
σ
(
z
i
)
x
i
=
∑
i
=
1
N
(
y
i
−
σ
(
z
i
)
)
x
i
\hat{w} = argmax_w\;\;log\;P(Y|X) = argmax_x\;\;log\;\prod_{i=1}^N P(y_i|x_i) = argmax_w \sum\limits_{i=1}^{N} log\;P(y_i|x_i)\\ \;\;\; = argmax_w \sum\limits_{i=1}^{N}(y_ilog\;p_1 + (1-y_i)log(1-p_1)) \\ 记:L(w) = \sum\limits_{i=1}^{N}(y_ilog\;p_1 + (1-y_i)log(1-p_1))\\ \;\;\; \frac{\partial L}{\partial w_k} = \sum\limits_{i=1}^{N} y_i\frac{1}{p_1}\frac{\partial p_1}{\partial z}\frac{\partial z}{\partial w_k} + (1-y_i)\frac{1}{1-p_1}(-\frac{\partial p_1}{\partial z}\frac{\partial z}{\partial w_k})\\ \;\;\;=\sum\limits_{i=1}^{N}y_i\frac{1}{\sigma(z)}(\sigma(z_i)-\sigma(z_i)^2)x_i + (1-y_i)\frac{1}{1-\sigma(z_i)}[-(\sigma(z_i)-\sigma(z_i)^2)x_i]\\ \;\;\; =\sum\limits_{i=1}^{N}[(y_i-y_i\sigma(z_i))x_i + (1-y_i)(-\sigma(z_i))x_i]\\ \;\;\; = \sum\limits_{i=1}^{N}y_ix_i-\sigma(z_i)x_i = \sum\limits_{i=1}^{N}(y_i-\sigma(z_i))x_i
w^=argmaxwlogP(Y∣X)=argmaxxlogi=1∏NP(yi∣xi)=argmaxwi=1∑NlogP(yi∣xi)=argmaxwi=1∑N(yilogp1+(1−yi)log(1−p1))记:L(w)=i=1∑N(yilogp1+(1−yi)log(1−p1))∂wk∂L=i=1∑Nyip11∂z∂p1∂wk∂z+(1−yi)1−p11(−∂z∂p1∂wk∂z)=i=1∑Nyiσ(z)1(σ(zi)−σ(zi)2)xi+(1−yi)1−σ(zi)1[−(σ(zi)−σ(zi)2)xi]=i=1∑N[(yi−yiσ(zi))xi+(1−yi)(−σ(zi))xi]=i=1∑Nyixi−σ(zi)xi=i=1∑N(yi−σ(zi))xi
因此,
∂
L
∂
w
k
=
∑
i
=
1
N
(
y
i
−
σ
(
z
i
)
)
x
i
\frac{\partial L}{\partial w_k} = \sum\limits_{i=1}^{N}(y_i-\sigma(z_i))x_i
∂wk∂L=i=1∑N(yi−σ(zi))xi,由于这里涉及的函数不像线性回归一样能简单求出解析解,因此我们使用迭代的优化算法:梯度下降法,即:
w
k
(
t
+
1
)
←
w
k
(
t
)
−
η
∑
i
=
1
N
(
y
i
−
σ
(
z
i
)
)
x
i
(
k
)
,
其
中
,
x
i
(
k
)
为
第
i
个
样
本
第
k
个
特
征
w_k^{(t+1)}\leftarrow w_k^{(t)} - \eta \sum\limits_{i=1}^{N}(y_i-\sigma(z_i))x_i^{(k)},\;\;\;其中,x_i^{(k)}为第i个样本第k个特征
wk(t+1)←wk(t)−ηi=1∑N(yi−σ(zi))xi(k),其中,xi(k)为第i个样本第k个特征
对于问题(2),我们值得注意的是,逻辑回归在实际中不太用于多分类问题,因为实际效果不是很好
线性判别
- 基于贝叶斯公式对线性判别分析的理解:
在概率统计的领域里有一条神奇的公式叫贝叶斯定理,具体的形式是: P ( Y = k ∣ X = x ) = π k f k ( x ) ∑ l = 1 K π l f l ( x ) {P(Y=k|X=x) = \dfrac{{\pi}_kf_k(x)}{\sum\limits_{l=1}^K{\pi}_lf_l(x)}} P(Y=k∣X=x)=l=1∑Kπlfl(x)πkfk(x) 。我们假设观测有 K {K} K类, π k {\pi_k} πk为随机选择的观测来自第 k {k} k类的 先验概率,也就是样本里面第 k {k} k类的样本个数除以总样本的个数: π k = n k n {\pi_k = \dfrac{n_k}{n}} πk=nnk。再来 f k ( x ) = P ( X = x ∣ Y = k ) {f_k(x) =P(X=x|Y=k)} fk(x)=P(X=x∣Y=k),表示第 k {k} k类观测的X的密度函数,说的直白一点就是在 Y = k {Y=k} Y=k的样本里 X = x {X=x} X=x的样本个数,即 f k ( x ) = P ( X = x ∣ Y = k ) = n ( X = x , Y = k ) n ( Y = k ) {f_k(x) = P(X=x|Y=k) = \dfrac{n_{(X=x,Y=k)}}{n_{(Y=k)}}} fk(x)=P(X=x∣Y=k)=n(Y=k)n(X=x,Y=k),最后, ∑ l = 1 K π l f l ( x ) = P ( X = x ) = n ( X = x ) n {\sum\limits_{l=1}^K{\pi}_lf_l(x)}=P(X=x)=\dfrac{n_{(X=x)}}{n} l=1∑Kπlfl(x)=P(X=x)=nn(X=x),也就是样本中 X = x {X=x} X=x的概率。
在讨论贝叶斯定理后,我们回到分类问题,这个定理跟我们的分类问题有什么关联呢?没错,这个公式 P ( Y = k ∣ X = x ) = π k f k ( x ) ∑ l = 1 K π l f l ( x ) {P(Y=k|X=x) = \dfrac{{\pi}_kf_k(x)}{\sum\limits_{l=1}^K{\pi}_lf_l(x)}} P(Y=k∣X=x)=l=1∑Kπlfl(x)πkfk(x)给出了给定样本条件下, Y = k {Y=k} Y=k这个类别下的概率,这给分类问题提供了一条思路,那就是计算这个 P ( Y = k ∣ X = x ) {P(Y=k|X=x)} P(Y=k∣X=x),而且我们的逻辑回归就是这么干的,但是在 P ( Y = k ∣ X = x ) = π k f k ( x ) ∑ l = 1 K π l f l ( x ) {P(Y=k|X=x) = \dfrac{{\pi}_kf_k(x)}{\sum\limits_{l=1}^K{\pi}_lf_l(x)}} P(Y=k∣X=x)=l=1∑Kπlfl(x)πkfk(x)这个公式中,分母 ∑ l = 1 K π l f l ( x ) = P ( X = x ) {{\sum\limits_{l=1}^K{\pi}_lf_l(x)} = P(X=x)} l=1∑Kπlfl(x)=P(X=x)当样本给定的时候是一个与分类 k {k} k无关的常数,所以我们的问题可以简化为只需要计算分子 π k f k ( x ) {{\pi}_kf_k(x)} πkfk(x),进而比较哪个类别的概率最大就知道属于哪个类别了,因此我们的分类思路就出来啦,这个思路不同于逻辑回归,逻辑回归需要计算具体的 P ( Y = k ∣ X = x ) {P(Y=k|X=x)} P(Y=k∣X=x)概率值,而我们现在的思路是通过贝叶斯定理计算贝叶斯定理的分子,比较分子最大的那个类别为最终类别。
在我们推导复杂算法之前,我们先推导下简单的当自变量个数只有一个的模型,即 p = 1 {p=1} p=1的简单模型。我们记 P ( Y = k ∣ X = x ) = π k f k ( x ) ∑ l = 1 K π l f l ( x ) {P(Y=k|X=x) = \dfrac{{\pi}_kf_k(x)}{\sum\limits_{l=1}^K{\pi}_lf_l(x)}} P(Y=k∣X=x)=l=1∑Kπlfl(x)πkfk(x) 的分子为 g k ( x ) = π k f k ( x ) {g_k(x) = {\pi}_kf_k(x)} gk(x)=πkfk(x)。在这里,我们做个模型假设:假设 f k ( x ) {f_k(x) } fk(x)服从正态分布,即 f k ( x ) ∼ N ( μ , σ k 2 ) {f_k(x) \sim N(\mu,\sigma_k^2)} fk(x)∼N(μ,σk2),而且每个 σ k 2 = σ 2 {\sigma_k^2 = \sigma^2} σk2=σ2,同方差假设。因此 f k ( x ) = 1 2 π σ k e − 1 2 σ 2 ( x − μ k ) 2 {f_k(x) = \dfrac{1}{\sqrt{2\pi}\sigma_k}e^{-\dfrac{1}{2\sigma^2}(x-\mu_k)^2}} fk(x)=2πσk1e−2σ21(x−μk)2,最终我们的 g k ( x ) = π k 1 2 π σ k e − 1 2 σ 2 ( x − μ k ) 2 {g_k(x) = \pi_k\dfrac{1}{\sqrt{2\pi}\sigma_k}e^{-\dfrac{1}{2\sigma^2}(x-\mu_k)^2}} gk(x)=πk2πσk1e−2σ21(x−μk)2,终于算出来啦。这个式子不是很好计算,我们对 g k ( x ) {g_k(x)} gk(x)取个对数,令 δ k ( x ) = l n ( g k ( x ) ) = l n π k + μ σ 2 x − μ 2 2 σ 2 {\delta_k(x) = ln(g_k(x))=ln\pi_k+\dfrac{\mu}{\sigma^2}x-\dfrac{\mu^2}{2\sigma^2}} δk(x)=ln(gk(x))=lnπk+σ2μx−2σ2μ2,到这里我们的模型建立模型,我们只需要把位置的 μ k {\mu_k} μk与 σ 2 {\sigma^2} σ2估计出来就好了。 μ ^ k = 1 n k ∑ i : y i = k x i {\hat{\mu}_k =\dfrac{1}{n_k}\sum\limits_{i:y_i=k}x_i} μ^k=nk1i:yi=k∑xi,也就是当 y = k {y=k} y=k这一类中 x {x} x的平均值; σ ^ 2 = 1 n − K ∑ k = 1 K ∑ i : y i = k ( x i − μ ^ k ) 2 {\hat{\sigma}^2 =\dfrac{1}{n-K}\sum\limits_{k=1}^K\sum\limits_{i:y_i=k}(x_i-\hat{\mu}_k)^2 } σ^2=n−K1k=1∑Ki:yi=k∑(xi−μ^k)2,说白了就是计算每一类的方差,再求平均值。总结下上面的公式就是:
{ δ k ( x ) = l n ( g k ( x ) ) = l n π k + μ σ 2 x − μ 2 2 σ 2 μ ^ k = 1 n k ∑ i : y i = k x i σ ^ 2 = 1 n − K ∑ k = 1 K ∑ i : y i = k ( x i − μ ^ k ) 2 {\begin{cases}\delta_k(x) = ln(g_k(x))=ln\pi_k+\dfrac{\mu}{\sigma^2}x-\dfrac{\mu^2}{2\sigma^2}\\{\hat{\mu}_k =\dfrac{1}{n_k}\sum\limits_{i:y_i=k}x_i}\\{\hat{\sigma}^2 =\dfrac{1}{n-K}\sum\limits_{k=1}^K\sum\limits_{i:y_i=k}(x_i-\hat{\mu}_k)^2}\end{cases}} ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧δk(x)=ln(gk(x))=lnπk+σ2μx−2σ2μ2μ^k=nk1i:yi=k∑xiσ^2=n−K1k=1∑Ki:yi=k∑(xi−μ^k)2
至此,我们的模型就建立完成了,我们只需要代入数据求出 δ k ( x ) {\delta_k(x)} δk(x),哪个 k {k} k对应的 δ k ( x ) {\delta_k(x)} δk(x)大,就是哪一类。
(下图虚线是线性判别分析的决策边界,正态曲线哪边高样本就是哪一类)
我们推到出了一个自变量的简单模型,就要泛化为多个自变量的线性判别分析了,即 p > 1 {p>1} p>1。其实原理一样的,只是将一元正态分布扩展为多元正态分布: f k ( x ) = 1 ( 2 π ) p 2 ∣ Σ ∣ 1 2 e [ − 1 2 ( x − μ k ) T Σ − 1 ( x − μ k ) ] {f_k(x)=\dfrac{1}{(2\pi)^{\tfrac{p}{2}}|\Sigma|^\tfrac{1}{2}}e^{[-\tfrac{1}{2}(x-\mu_k)^T\Sigma^{-1}(x-\mu_k)]}} fk(x)=(2π)2p∣Σ∣211e[−21(x−μk)TΣ−1(x−μk)] μ k ^ = ( μ k 1 , μ k 2 , . . . . . . , μ k p ) , Σ ^ = 1 p − 1 ∑ j = 1 p ( x j − x ‾ ) ( x j − x ‾ ) T {\hat{\mu_k}=(\mu_{k1},\mu_{k2},......,\mu_{kp}) , \hat{\Sigma}=\dfrac{1}{p-1}\sum\limits_{j=1}^p(x_j-\overline{x})(x_j-\overline{x})^T} μk^=(μk1,μk2,......,μkp),Σ^=p−11j=1∑p(xj−x)(xj−x)T
δ k ( x ) = l n ( π k f k ( x ) ) = l n ( π k ) − ( p 2 l n ( 2 π ) + 1 2 l n ( ∣ Σ ∣ ) ) − 1 2 ( x − μ k ) T Σ − 1 ( x − μ k ) = x T Σ ^ μ ^ k − 1 2 μ ^ k T Σ ^ − 1 μ ^ k + l n π ^ k {\delta_k(x) = ln(\pi_kf_k(x))=ln(\pi_k)-(\dfrac{p}{2}ln(2\pi)+\dfrac{1}{2}ln(|\Sigma|))-\dfrac{1}{2}(x-\mu_k)^T\Sigma^-1(x-\mu_k)=x^T\hat{\Sigma}\hat{\mu}_k-\dfrac{1} {2}\hat{\mu}_k^T\hat{\Sigma}^{-1}\hat{\mu}_k+ln\hat{\pi}_k} δk(x)=ln(πkfk(x))=ln(πk)−(2pln(2π)+21ln(∣Σ∣))−21(x−μk)TΣ−1(x−μk)=xTΣ^μ^k−21μ^kTΣ^−1μ^k+lnπ^k - 降维分类的思想理解线性判别分析:
西瓜书上P60~63比较清楚,不再赘述
朴素贝叶斯
在线性判别分析中,我们假设每种分类类别下的特征遵循同一个协方差矩阵,每两个特征之间是存在协方差的,因此在线性判别分析中各种特征是不是独立的。但是,朴素贝叶斯算法对线性判别分析作进一步的模型简化,它将线性判别分析中的协方差矩阵中的协方差全部变成0,只保留各自特征的方差,也就是朴素贝叶斯假设各个特征之间是不相关的。在之前所看到的偏差-方差理论中,我们知道模型的简化可以带来方差的减少但是增加偏差,因此朴素贝叶斯也不例外,它比线性判别分析模型的方差小,偏差大。虽然简化了模型,实际中使用朴素贝叶斯的案例非常多,甚至多于线性判别分析,例如鼎鼎大名的新闻分类,垃圾邮件分类等。
决策树 :
与前面内容所讲的决策树回归大致是一样的,只是在回归问题中,选择分割点的标准是均方误差,但是在分类问题中,由于因变量是类别变量而不是连续变量,因此用均方误差显然不合适。那问题是用什么作为选择分割点的标准呢?我们先来分析具体的问题:
在回归树中,对一个给定的观测值,因变量的预测值取它所属的终端结点内训练集的平均因变量。与之相对应,对于分类树来说,给定一个观测值,因变量的预测值为它所属的终端结点内训练集的最常出现的类。分类树的构造过程与回归树也很类似,与回归树一样,分类树也是采用递归二叉分裂。但是在分类树中,均方误差无法作为确定分裂节点的准则,一个很自然的替代指标是分类错误率。分类错误率就是:此区域内的训练集中非常见类所占的类别,即:
E
=
1
−
m
a
x
k
(
p
^
m
k
)
E = 1-max_k(\hat{p}_{mk})
E=1−maxk(p^mk) 上式中的
p
^
m
k
\hat{p}_{mk}
p^mk代表第m个区域的训练集中第k类所占的比例。但是在大量的事实证明:分类错误率在构建决策树时不够敏感,一般在实际中用如下两个指标代替:
(1) 基尼系数:
G
=
∑
k
=
1
K
p
^
m
k
(
1
−
p
^
m
k
)
G = \sum\limits_{k=1}^{K} \hat{p}_{mk}(1-\hat{p}_{mk})
G=k=1∑Kp^mk(1−p^mk) 在基尼系数的定义中,我们发现这个指标衡量的是K个类别的总方差。不难发现,如果所有的
p
^
m
k
\hat{p}_{mk}
p^mk的取值都接近0或者1,基尼系数会很小。因此基尼系数被视为衡量结点纯度的指标----如果他的取值小,那就意味着某个节点包含的观测值几乎来自同一个类别。
由基尼系数作为指标得到的分类树叫做:CART。
(2) 交叉熵:
可以替代基尼系数的指标是交叉熵,定义如下:
D
=
−
∑
k
=
1
K
p
^
m
k
l
o
g
p
^
m
k
D = -\sum\limits_{k=1}^{K} \hat{p}_{mk}log\;\hat{p}_{mk}
D=−k=1∑Kp^mklogp^mk 显然,如果所有的
p
^
m
k
\hat{p}_{mk}
p^mk都接近于0或者1,那么交叉熵就会接近0。因此,和基尼系数一样,如果第m个结点的纯度越高,则交叉熵越小。事实证明,基尼系数和交叉熵在数值上时很接近的。
决策树分类算法的完整步骤:
- a. 选择最优切分特征j以及该特征上的最优点s:
遍历特征j,以及固定j后,遍历切分点(是否遍历切分点,取决于是否为离散变量,离散变量一般是根据取值划分,连续变量一般需要寻找切分点),选择使得基尼系数或者交叉熵最小的(j,s) - b. 按照(j,s)分裂特征空间,每个区域内的类别为该区域内样本比例最多的类别。
- c. 继续调用步骤1,2直到满足停止条件,就是每个区域的样本数小于等于5。
- d. 将特征空间划分为J个不同的区域,生成分类树。
支持向量机
支持向量机SVM是20世纪90年代在计算机界发展起来的一种分类算法,在许多问题中都被证明有较好的效果,被认为是适应性最广的算法之一。
支持向量机的基本原理非常简单,如图所视,白色和蓝色的点各为一类,我们的目标是找到一个分割平面将两个类别分开。通常来说,如果数据本身是线性可分的,那么事实上存在无数个这样的超平面。这是因为给定一个分割平面稍微上移下移或旋转这个超平面,只要不接触这些观测点,仍然可以将数据分开。一个很自然的想法就是找到最大间隔超平面,即找到一个分割平面距离最近的观测点最远。下面我们来严格推导:
我们根据距离超平米那最近的点,只要同时缩放w和b可以得到:
w
T
x
1
+
b
=
1
w^Tx_1 + b = 1
wTx1+b=1与
w
T
x
2
+
b
=
−
1
w^Tx_2+b = -1
wTx2+b=−1,因此:
w
T
x
1
+
b
=
1
w
T
x
2
+
b
=
−
1
(
w
T
x
1
+
b
)
−
(
w
T
x
2
+
b
)
=
2
w
T
(
x
1
−
x
2
)
=
2
w
T
(
x
1
−
x
2
)
=
∥
w
∥
2
∥
x
1
−
x
2
∥
2
cos
θ
=
2
∥
x
1
−
x
2
∥
2
cos
θ
=
2
∥
w
∥
2
d
1
=
d
2
=
∥
x
1
−
x
2
∥
2
cos
θ
2
=
2
∥
w
∥
2
2
=
1
∥
w
∥
2
d
1
+
d
2
=
2
∥
w
∥
2
\begin{array}{l} w^{T} x_{1}+b=1 \\ w^{T} x_{2}+b=-1 \\ \left(w^{T} x_{1}+b\right)-\left(w^{T} x_{2}+b\right)=2 \\ w^{T}\left(x_{1}-x_{2}\right)=2 \\ \qquad \begin{array}{l} w^{T}\left(x_{1}-x_{2}\right)=\|w\|_{2}\left\|x_{1}-x_{2}\right\|_{2} \cos \theta=2 \\ \left\|x_{1}-x_{2}\right\|_{2} \cos \theta=\frac{2}{\|w\|_{2}} \end{array} \\ \qquad \begin{array}{l} d_{1}=d_{2}=\frac{\left\|x_{1}-x_{2}\right\|_{2} \cos \theta}{2}=\frac{\frac{2}{\|w\|_{2}}}{2}=\frac{1}{\|w\|_{2}} \\ d_{1}+d_{2}=\frac{2}{\|w\|_{2}} \end{array} \end{array}
wTx1+b=1wTx2+b=−1(wTx1+b)−(wTx2+b)=2wT(x1−x2)=2wT(x1−x2)=∥w∥2∥x1−x2∥2cosθ=2∥x1−x2∥2cosθ=∥w∥22d1=d2=2∥x1−x2∥2cosθ=2∥w∥22=∥w∥21d1+d2=∥w∥22 由此可知道SVM模型的具体形式:
min
w
,
b
1
2
∥
w
∥
2
s.t.
y
(
i
)
(
w
T
x
(
i
)
+
b
)
≥
1
,
i
=
1
,
…
,
n
\begin{aligned} \min _{w, b} & \frac{1}{2}\|w\|^{2} \\ \text { s.t. } & y^{(i)}\left(w^{T} x^{(i)}+b\right) \geq 1, \quad i=1, \ldots, n \end{aligned}
w,bmin s.t. 21∥w∥2y(i)(wTx(i)+b)≥1,i=1,…,n 可以将约束条件写为:
g
i
(
w
)
=
−
y
(
i
)
(
w
T
x
(
i
)
+
b
)
+
1
≤
0
g_{i}(w)=-y^{(i)}\left(w^{T} x^{(i)}+b\right)+1 \leq 0
gi(w)=−y(i)(wTx(i)+b)+1≤0
可以将优化问题拉格朗日化
L
(
w
,
b
,
α
)
=
1
2
∥
w
∥
2
−
∑
i
=
1
n
α
i
[
y
(
i
)
(
w
T
x
(
i
)
+
b
)
−
1
]
\mathcal{L}(w, b, \alpha)=\frac{1}{2}\|w\|^{2}-\sum_{i=1}^{n} \alpha_{i}\left[y^{(i)}\left(w^{T} x^{(i)}+b\right)-1\right]
L(w,b,α)=21∥w∥2−i=1∑nαi[y(i)(wTx(i)+b)−1]
因此:
L
(
w
,
b
,
α
)
=
1
2
∥
w
∥
2
−
∑
i
=
1
n
α
i
[
y
(
i
)
(
w
T
x
(
i
)
+
b
)
−
1
]
\mathcal{L}(w, b, \alpha)=\frac{1}{2}\|w\|^{2}-\sum_{i=1}^{n} \alpha_{i}\left[y^{(i)}\left(w^{T} x^{(i)}+b\right)-1\right]
L(w,b,α)=21∥w∥2−i=1∑nαi[y(i)(wTx(i)+b)−1]
欲构造 dual 问题, 首先求拉格朗日化的问题中
w
\mathrm{w}
w 和
b
\mathrm{b}
b 的值, 对
w
\mathrm{w}
w 求梯度, 令梯度为 0, 可求得 w:
对 b 求梯度, 令梯度为 0, 可得:
∂
∂
b
L
(
w
,
b
,
α
)
=
∑
i
=
1
n
α
i
y
(
i
)
=
0
\frac{\partial}{\partial b} \mathcal{L}(w, b, \alpha)=\sum_{i=1}^{n} \alpha_{i} y^{(i)}=0
∂b∂L(w,b,α)=i=1∑nαiy(i)=0 将
w
\mathrm{w}
w 带入拉格朗日化的原问题可得
L
(
w
,
b
,
α
)
=
∑
i
=
1
n
α
i
−
1
2
∑
i
,
j
=
1
n
y
(
i
)
y
(
j
)
α
i
α
j
(
x
(
i
)
)
T
x
(
j
)
−
b
∑
i
=
1
n
α
i
y
(
i
)
L
(
w
,
b
,
α
)
=
∑
i
=
1
n
α
i
−
1
2
∑
i
,
j
=
1
n
y
(
i
)
y
(
j
)
α
i
α
j
(
x
(
i
)
)
T
x
(
j
)
\begin{array}{l} \mathcal{L}(w, b, \alpha)=\sum_{i=1}^{n} \alpha_{i}-\frac{1}{2} \sum_{i, j=1}^{n} y^{(i)} y^{(j)} \alpha_{i} \alpha_{j}\left(x^{(i)}\right)^{T} x^{(j)}-b \sum_{i=1}^{n} \alpha_{i} y^{(i)} \\ \mathcal{L}(w, b, \alpha)=\sum_{i=1}^{n} \alpha_{i}-\frac{1}{2} \sum_{i, j=1}^{n} y^{(i)} y^{(j)} \alpha_{i} \alpha_{j}\left(x^{(i)}\right)^{T} x^{(j)} \end{array}
L(w,b,α)=∑i=1nαi−21∑i,j=1ny(i)y(j)αiαj(x(i))Tx(j)−b∑i=1nαiy(i)L(w,b,α)=∑i=1nαi−21∑i,j=1ny(i)y(j)αiαj(x(i))Tx(j)
因此:
对拉格朗日化的原问题求最小值, 得到了
w
, 现在可以构造 dual 问題
max
α
W
(
α
)
=
∑
i
=
1
n
α
i
−
1
2
∑
i
,
j
=
1
n
y
(
i
)
y
(
j
)
α
i
α
j
⟨
x
(
i
)
,
x
(
j
)
⟩
s.t.
α
i
≥
0
,
i
=
1
,
…
,
n
∑
i
=
1
n
α
i
y
(
i
)
=
0
可以推导出 b的值为:
b
∗
=
−
max
i
:
y
(
i
)
=
−
1
w
∗
T
x
(
i
)
+
min
i
:
y
(
i
)
=
1
w
∗
T
x
(
i
)
2
SVM的决策子如下,值的符号为类别.
w
T
x
+
b
=
(
∑
i
=
1
n
α
i
y
(
i
)
x
(
i
)
)
T
x
+
b
=
∑
i
=
1
n
α
i
y
(
i
)
⟨
x
(
i
)
,
x
⟩
+
b
\begin{aligned} &\text { 对拉格朗日化的原问题求最小值, 得到了 } \mathrm{w} \text { , 现在可以构造 dual 问題 }\\ &\begin{aligned} \max _{\alpha} & W(\alpha)=\sum_{i=1}^{n} \alpha_{i}-\frac{1}{2} \sum_{i, j=1}^{n} y^{(i)} y^{(j)} \alpha_{i} \alpha_{j}\left\langle x^{(i)}, x^{(j)}\right\rangle \\ \text { s.t. } & \alpha_{i} \geq 0, \quad i=1, \ldots, n \\ & \sum_{i=1}^{n} \alpha_{i} y^{(i)}=0 \end{aligned}\\ &\text { 可以推导出 b的值为: } b^{*}=-\frac{\max _{i: y^{(i)}=-1} w^{* T} x^{(i)}+\min _{i: y^{(i)}=1} w^{* T} x^{(i)}}{2}\\ &\begin{array}{r} \text { SVM的决策子如下,值的符号为类别. } \\ \qquad w^{T} x+b=\left(\sum_{i=1}^{n} \alpha_{i} y^{(i)} x^{(i)}\right)^{T} x+b=\sum_{i=1}^{n} \alpha_{i} y^{(i)}\left\langle x^{(i)}, x\right\rangle+b \end{array} \end{aligned}
对拉格朗日化的原问题求最小值, 得到了 w , 现在可以构造 dual 问題 αmax s.t. W(α)=i=1∑nαi−21i,j=1∑ny(i)y(j)αiαj⟨x(i),x(j)⟩αi≥0,i=1,…,ni=1∑nαiy(i)=0 可以推导出 b的值为: b∗=−2maxi:y(i)=−1w∗Tx(i)+mini:y(i)=1w∗Tx(i) SVM的决策子如下,值的符号为类别. wTx+b=(∑i=1nαiy(i)x(i))Tx+b=∑i=1nαiy(i)⟨x(i),x⟩+b
非线性支持向量机
那我们应该如何处理非线性问题呢?答案就是将数据投影至更加高的维度!
Φ
:
X
↦
X
^
=
Φ
(
x
)
Φ
(
[
x
i
1
,
x
i
2
]
)
=
[
x
i
1
,
x
i
2
,
x
i
1
x
i
2
,
x
i
1
2
,
x
i
2
2
]
\begin{array}{l} \Phi: \mathcal{X} \mapsto \hat{\mathcal{X}}=\Phi(\mathbf{x}) \\ \Phi\left(\left[x_{i 1}, x_{i 2}\right]\right)=\left[x_{i 1}, x_{i 2}, x_{i 1} x_{i 2}, x_{i 1}^{2}, x_{i 2}^{2}\right] \end{array}
Φ:X↦X^=Φ(x)Φ([xi1,xi2])=[xi1,xi2,xi1xi2,xi12,xi22] 如果我们使用上面公式的形式将低维数据拓展至高维数据,则必须面临一个很大的问题,那就是:维度爆炸导致的计算量太大的问题。假如是一个2维特征的数据,我们可以将其映射到5维来做特征的内积,如果原始空间是三维,可以映射到到19维空间,似乎还可以处理。但是如果我们的低维特征是100个维度,1000个维度呢?那么我们要将其映射到超级高的维度来计算特征的内积。这时候映射成的高维维度是爆炸性增长的,这个计算量实在是太大了,而且如果遇到无穷维的情况,就根本无从计算了。能不能呢个避免这个问题呢?核函数隆重登场:
回顾线性可分SVM的优化目标函数:
m
i
n
⏟
α
1
2
∑
i
=
1
,
j
=
1
m
α
i
α
j
y
i
y
j
x
i
∙
x
j
−
∑
i
=
1
m
α
i
s
.
t
.
∑
i
=
1
m
α
i
y
i
=
0
0
≤
α
i
≤
C
\underbrace{ min }_{\alpha} \frac{1}{2}\sum\limits_{i=1,j=1}^{m}\alpha_i\alpha_jy_iy_jx_i \bullet x_j - \sum\limits_{i=1}^{m}\alpha_i\\ s.t. \; \sum\limits_{i=1}^{m}\alpha_iy_i = 0\\ 0 \leq \alpha_i \leq C
α
min21i=1,j=1∑mαiαjyiyjxi∙xj−i=1∑mαis.t.i=1∑mαiyi=00≤αi≤C 注意到上式低维特征仅仅以内积
x
i
∙
x
j
x_i \bullet x_j
xi∙xj 的形式出现,如果我们定义一个低维特征空间到高维特征空间的映射
ϕ
\phi
ϕ,将所有特征映射到一个更高的维度,让数据线性可分,我们就可以继续按前两篇的方法来优化目标函数,求出分离超平面和分类决策函数了。也就是说现在的SVM的优化目标函数变成:
min
⏟
α
1
2
∑
i
=
1
,
j
=
1
m
α
i
α
j
y
i
y
j
ϕ
(
x
i
)
∙
ϕ
(
x
j
)
−
∑
i
=
1
m
α
i
s.
t
.
∑
i
=
1
m
α
i
y
i
=
0
0
≤
α
i
≤
C
\begin{array}{c} \underbrace{\min }_{\alpha} \frac{1}{2} \sum_{i=1, j=1}^{m} \alpha_{i} \alpha_{j} y_{i} y_{j} \phi\left(x_{i}\right) \bullet \phi\left(x_{j}\right)-\sum_{i=1}^{m} \alpha_{i} \\ \text { s. } t . \sum_{i=1}^{m} \alpha_{i} y_{i}=0 \\ 0 \leq \alpha_{i} \leq C \end{array}
α
min21∑i=1,j=1mαiαjyiyjϕ(xi)∙ϕ(xj)−∑i=1mαi s. t.∑i=1mαiyi=00≤αi≤C
可以看到,和线性可分SVM的优化目标函数的区别仅仅是将内积
x
i
∙
x
j
x_i \bullet x_j
xi∙xj替换为
ϕ
(
x
i
)
∙
ϕ
(
x
j
)
\phi(x_i) \bullet \phi(x_j)
ϕ(xi)∙ϕ(xj)。我们要将其映射到超级高的维度来计算特征的内积。这时候映射成的高维维度是爆炸性增长的,这个计算量实在是太大了,而且如果遇到无穷维的情况,就根本无从计算了。下面引入核函数:
假设
ϕ
\phi
ϕ是一个从低维的输入空间
χ
\chi
χ(欧式空间的子集或者离散集合)到高维的希尔伯特空间的
H
\mathcal{H}
H映射。那么如果存在函数
K
(
x
,
z
)
K(x,z)
K(x,z),对于任意
x
,
z
∈
χ
x, z \in \chi
x,z∈χ,都有:
K
(
x
,
z
)
=
ϕ
(
x
)
∙
ϕ
(
z
)
K(x, z) = \phi(x) \bullet \phi(z)
K(x,z)=ϕ(x)∙ϕ(z)
那么我们就称
K
(
x
,
z
)
K(x, z)
K(x,z)为核函数。
仔细发现,
K
(
x
,
z
)
K(x, z)
K(x,z)的计算是在低维特征空间来计算的,它避免了在刚才我们提到了在高维维度空间计算内积的恐怖计算量。也就是说,我们可以好好享受在高维特征空间线性可分的利益,却避免了高维特征空间恐怖的内积计算量。下面介绍几种常用的核函数:
(1) 多项式核函数:
多项式核函数(Polynomial Kernel)是线性不可分SVM常用的核函数之一,表达式为:
K
(
x
i
,
x
j
)
=
(
⟨
x
i
,
x
j
⟩
+
c
)
d
K\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)=\left(\left\langle\mathbf{x}_{i}, \mathbf{x}_{j}\right\rangle+c\right)^{d}
K(xi,xj)=(⟨xi,xj⟩+c)d
C用来控制低阶项的强度,C=0,d=1代表无核函数。
(2) 高斯核函数:
高斯核函数(Gaussian Kernel),在SVM中也称为径向基核函数(Radial Basis Function,RBF),它是非线性分类SVM最主流的核函数。libsvm默认的核函数就是它。表达式为:
K
(
x
i
,
x
j
)
=
exp
(
−
∥
x
i
−
x
j
∥
2
2
2
σ
2
)
K\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)=\exp \left(-\frac{\left\|\mathbf{x}_{i}-\mathbf{x}_{j}\right\|_{2}^{2}}{2 \sigma^{2}}\right)
K(xi,xj)=exp(−2σ2∥xi−xj∥22)
使用高斯核函数之前需要将特征标准化,因此这里衡量的是样本之间的相似度。
(3) Sigmoid核函数:
Sigmoid核函数(Sigmoid Kernel)也是线性不可分SVM常用的核函数之一,表达式为:
K
(
x
i
,
x
j
)
=
tanh
(
α
x
i
⊤
x
j
+
c
)
K\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)=\tanh \left(\alpha \mathbf{x}_{i}^{\top} \mathbf{x}_{j}+c\right)
K(xi,xj)=tanh(αxi⊤xj+c) 此时的SVM相当于没有隐藏层的简单神经网络。
(4) 余弦相似度核:
常用于衡量两段文字的余弦相似度,表达式为:
K
(
x
i
,
x
j
)
=
x
i
⊤
x
j
∥
x
i
∥
∥
x
j
∥
K\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)=\frac{\mathbf{x}_{i}^{\top} \mathbf{x}_{j}}{\left\|\mathbf{x}_{i}\right\|\left\|\mathbf{x}_{j}\right\|}
K(xi,xj)=∥xi∥∥xj∥xi⊤xj
评估模型的性能并调参:
更详细的可以查看笔者的知乎
第二章例子里面还有绘制混淆矩阵和ROC曲线的实例不在此展示
混淆矩阵绘图
混淆矩阵实现
ROC曲线绘制
作业
- 回归问题和分类问题的联系和区别,如何利用回归问题理解分类问题?
- 为什么分类问题的损失函数可以是交叉熵,而不是均方误差?
- 线性判别分析和逻辑回归在估计参数方面有什么异同点?
- 尝试从0推导SVM
- 二次判别分析,线性判别分析,朴素贝叶斯之间的联系和区别?
- 使用python+numpy实现逻辑回归
参考文章
from sklearn import datasets
import pandas as pd
iris = datasets.load_iris()
X = iris.data
Y = iris.target
X = X[Y!=2]
Y=Y[Y!=2]
import numpy as np
import math
class myLogstic():
def fun_lamda(self,beta):
result=0
for i in range(self.Y.shape[0]):
# result+=self.Y[i]*np.dot(beta.T,self.Xb[i])-math.log(1+math.exp(np.dot(beta.T,self.Xb[i])))
p0=1/(1+np.exp(np.dot(beta.T,self.Xb[i])))
result+=self.Y[i]*math.log(1-p0)+(1-self.Y[i])*math.log(p0)
return -1/self.Y.shape[0]*result
def sigmod(self,beta):
result=0
for i in range(self.Y.shape[0]):
gamma=1/(1+np.exp(-np.dot(beta.T,self.Xb[i])))
result+=(self.Y[i]-gamma)*self.Xb[i]
return -result
def Logic_fit(self,learning,interation,X,Y,accuracy = 0.00001):
sample=X.shape[0]
feature=X.shape[1]
self.Xb=np.c_[X,np.ones(sample)]
beta=np.ones(feature+1)*0.5
self.Y=Y
inter=0
while True:
lamda1=self.fun_lamda(beta)
beta1=beta-learning*self.sigmod(beta)
lamda2=self.fun_lamda(beta1)
if lamda1==lamda2 or (math.fabs(lamda1-lamda2)<accuracy):
self.w=beta
break
if interation==inter:
print("不收敛")
beta=beta1
inter+=1
def predict(self,Xtest):
Xb_test=np.c_[Xtest,np.ones(Xtest.shape[0])]
y_pre=np.zeros(Xtest.shape[0])
y_pre_probe=np.zeros((Xtest.shape[0],2))
for i in range(Xtest.shape[0]):
rate=1/(1+np.exp(np.dot(self.w.T,Xb_test[i])))
y_pre_probe[i,0]=rate
y_pre_probe[i,1]=1-rate
if rate <=0.5:
y_pre[i] = 1
else:
y_pre[i] = 0
return y_pre,y_pre_probe
def score(self,X_test,y_test):
y_predict,y_p = self.predict(X_test)
re = (y_test==y_predict)
re1 = Counter(re)
a = re1[True] / (re1[True]+re1[False])
return a
l=myLogstic()
l.Logic_fit(0.01,1000,X,Y)
l.predict(X)
l.score(X,Y)