集成学习(上)Task05:掌握基本的分类模型
1 度量分类模型性能的指标
度量分类模型的指标和度量回归模型的指标为什么会有差异?
- 分类问题本身的因变量是离散变量,因此像定义回归的指标那样,单单衡量预测值和因变量的相似度可能行不通;
- 在分类任务中,我们对于每个类别犯错的代价不尽相同。
度量分类模型性能的指标是什么?
(1)基本的概念:
- 真阳性 T P TP TP:实际值为正,预测值为正*
- 真阴性 T N TN TN:实际值为正,预测值为负
- 假阳性 F P FP FP:实际值为负,预测值为正
- 假阴性 F N FN FN:实际值为负,预测值为负*
(2)分类模型的指标:
- 准确率:【分类正确的样本数】占【总样本】的比例 A C C = T P + F N T P + T N + F P + F N ACC = \frac{TP+FN}{TP+TN+FP+FN} ACC=TP+TN+FP+FNTP+FN
- 精度:【预测为正且分类正确的样本】占【预测为正的样本】的比例 P R E = T P T P + F P PRE = \frac{TP}{TP+FP} PRE=TP+FPTP
- 召回率:【预测为正且分类正确的样本】占【真实为正的样本】的比例 R E C = T P T P + F N REC = \frac{TP}{TP+FN} REC=TP+FNTP
- F1值: F 1 = 2 × P R E × R E C P R E + R E C F_1 = 2\times\frac{PRE\times REC}{PRE+REC} F1=2×PRE+RECPRE×REC
- ROC曲线:以假阳率( F P R = F P F P + T N FPR = \frac{FP}{FP+TN} FPR=FP+TNFP)为横轴,真阳率( T P R = T P T P + F N TPR = \frac{TP}{TP+FN} TPR=TP+FNTP)为纵轴画出来的曲线,曲线下方面积越大越好。
2 具体的分类模型
2.1 Logistic模型
在分类问题中,我们往往是通过已知 X X X的信息预测 Y Y Y的类别(往往是一个离散集合中的某个元素)。那么,从线性回归的问题中可以探索出分类的模型吗?换言之,我们希望将线性回归的结果转化到区间 [ 0 : 1 ] [0:1] [0:1]上,让 Y Y Y转变成一个概率。
假设我们的线性回归模型为 Y = β 0 + β 1 X Y = \beta_0 + \beta_1X Y=β0+β1X
利用Logistic函数
将线性回归的结果转化为概率:
p
(
X
)
=
e
β
0
+
β
1
X
1
+
e
β
0
+
β
1
X
p(X) = \frac {e^{\beta_0 + \beta_1X}}{1+e^{\beta_0 + \beta_1X}}
p(X)=1+eβ0+β1Xeβ0+β1X
Logistic函数的图像为:
做一点简化。
假设数据为:
{
(
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}
因为
y
y
y只可能取0或者1,因此假设数据服从0-1分布(伯努利分布)。
假设我们的Logistic模型为: p ( y ∣ x ) = 1 1 + e − w T X p(y|x) = \frac {1}{1+e^{-w^TX}} p(y∣x)=1+e−wTX1
令 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
那么有 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
那么现在的目标是估计参数
w
T
w^T
wT。利用极大似然估计法得到:
w
^
=
arg max
w
log
P
(
Y
∣
X
)
=
arg max
w
log
∏
i
=
1
N
P
(
y
i
∣
x
i
)
=
arg max
w
∑
i
=
1
N
log
P
(
y
i
∣
x
i
)
=
arg max
w
∑
i
=
1
N
y
i
log
(
p
1
+
(
1
−
y
i
)
log
(
1
−
p
1
)
)
\begin{aligned} \hat w &= \argmax_w \log P(Y|X) \\ & = \argmax_w \log \prod_{i=1}^N P(y_i|x_i)\\ & = \argmax_w \sum_{i=1}^N \log P(y_i|x_i)\\ & = \argmax_w \sum_{i=1}^N y_i \log (p_1 + (1-y_i) \log (1-p_1)) \end{aligned}
w^=wargmaxlogP(Y∣X)=wargmaxlogi=1∏NP(yi∣xi)=wargmaxi=1∑NlogP(yi∣xi)=wargmaxi=1∑Nyilog(p1+(1−yi)log(1−p1))
记 L ( w ) = arg max w ∑ i = 1 N y i log ( p 1 + ( 1 − y i ) log ( 1 − p 1 ) ) L(w) = \argmax_w \sum_{i=1}^N y_i \log (p_1 + (1-y_i) \log (1-p_1)) L(w)=wargmax∑i=1Nyilog(p1+(1−yi)log(1−p1))
则有(省略步骤)
∂
L
∂
w
k
=
∑
i
=
1
N
(
y
i
−
σ
(
z
i
)
)
x
i
\frac{\partial L}{\partial w_k} = \sum_{i=1}^N (y_i-\sigma (z_i))x_i
∂wk∂L=i=1∑N(yi−σ(zi))xi
值得注意的是,逻辑回归在实际中不太用于多分类问题,因为实际效果不是很好,所以我们可以借助其他模型来解决这个问题。
2.2 基于概率的分类模型
(1)线性判别分析
-
基于贝叶斯公式
所用的公式是:
{ δ 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)大,就是哪一类(下图中,虚线是线性判别分析的决策边界,正态曲线哪边高样本就是哪一类)。
-
基于降维分类的思想
下图中,数据的维度是二维的,我们的想法是把数据降维至一维,然后用阈值就能分类。这个似乎是一个很好的想法,我们总是希望降维后的数据同一个类别自身内部方差小,不同类别之间的方差要尽可能大。这也是合理的,因为同一个类别的数据应该更加相似,因此方差小;不同类别的数据之间应该很不相似,这样才能更容易对数据进行分类。
我们简称为:类内方差小,类间方差大,计算机语言叫“松耦合,高内聚”。
基本的统计量如下:
特征 X = ( x 1 , x 2 , . . . , x N ) T X = (x_1,x_2,...,x_N)^T X=(x1,x2,...,xN)T
因变量 Y = ( y 1 , y 2 , . . . , y N ) T Y = (y_1,y_2,...,y_N)^T Y=(y1,y2,...,yN)T,其中 y i ∈ { + 1 , − 1 } y_i \in \{+1,-1 \} yi∈{+1,−1}
类别 c 1 c_1 c1的特征 X c 1 = { x i ∣ y i = + 1 } X_{c_1} = \{x_i|y_i=+1 \} Xc1={xi∣yi=+1}
类别 c 2 c_2 c2的特征 X c 2 = { x i ∣ y i = − 1 } X_{c_2} = \{x_i|y_i=-1 \} Xc2={xi∣yi=−1}
属于 c 1 c_1 c1类别的数据个数为 N 1 N_1 N1,属于类别 c 2 c_2 c2的数据个数为 N 2 N_2 N2,其中, N 1 + N 2 = N N_1+N_2 = N N1+N2=N。
特征 X X X投影在 w w w方向至一维: z i = w T x i , ∣ ∣ w ∣ ∣ = 1 z_i = w^Tx_i,\;\;||w|| = 1 zi=wTxi,∣∣w∣∣=1
全样本投影的均值 z ˉ = 1 N ∑ i = 1 N z i = 1 N ∑ i = 1 N w T x i \bar{z} = \frac{1}{N}\sum\limits_{i=1}^{N}z_i = \frac{1}{N}\sum\limits_{i=1}^{N}w^Tx_i zˉ=N1i=1∑Nzi=N1i=1∑NwTxi
全样本投影的协方差 S z = 1 N ∑ i = 1 N ( z i − z ˉ ) ( z i − z ˉ ) T = 1 N ∑ i = 1 N ( w T x i − z ˉ ) ( w T x i − z ˉ ) T S_z = \frac{1}{N}\sum\limits_{i=1}^{N}(z_i-\bar{z})(z_i-\bar{z})^T = \frac{1}{N}\sum\limits_{i=1}^{N}(w^Tx_i-\bar{z})(w^Tx_i-\bar{z})^T Sz=N1i=1∑N(zi−zˉ)(zi−zˉ)T=N1i=1∑N(wTxi−zˉ)(wTxi−zˉ)T
c 1 c_1 c1样本投影的均值 z 1 ˉ = 1 N 1 ∑ i = 1 N 1 z i = 1 N 1 ∑ i = 1 N 1 w T x i \bar{z_1} = \frac{1}{N_1}\sum\limits_{i=1}^{N_1}z_i = \frac{1}{N_1}\sum\limits_{i=1}^{N_1}w^Tx_i z1ˉ=N11i=1∑N1zi=N11i=1∑N1wTxi
c 1 c_1 c1样本投影的协方差 S z 1 = 1 N 1 ∑ i = 1 N 1 ( z i − z 1 ˉ ) ( z i − z 1 ˉ ) T = 1 N 1 ∑ i = 1 N 1 ( w T x i − z 1 ˉ ) ( w T x i − z 1 ˉ ) T S_{z_1} = \frac{1}{N_1}\sum\limits_{i=1}^{N_1}(z_i-\bar{z_1})(z_i-\bar{z_1})^T = \frac{1}{N_1}\sum\limits_{i=1}^{N_1}(w^Tx_i-\bar{z_1})(w^Tx_i-\bar{z_1})^T Sz1=N11i=1∑N1(zi−z1ˉ)(zi−z1ˉ)T=N11i=1∑N1(wTxi−z1ˉ)(wTxi−z1ˉ)T
c 2 c_2 c2样本投影的均值 z 2 ˉ = 1 N 2 ∑ i = 1 N 2 z i = 1 N 2 ∑ i = 1 N 2 w T x i \bar{z_2} = \frac{1}{N_2}\sum\limits_{i=1}^{N_2}z_i = \frac{1}{N_2}\sum\limits_{i=1}^{N_2}w^Tx_i z2ˉ=N21i=1∑N2zi=N21i=1∑N2wTxi
c 2 c_2 c2样本投影的协方差 S z 2 = 1 N 2 ∑ i = 1 N 2 ( z i − z 2 ˉ ) ( z i − z 2 ˉ ) T = 1 N 2 ∑ i = 1 N 2 ( w T x i − z 2 ˉ ) ( w T x i − z 2 ˉ ) T S_{z_2} = \frac{1}{N_2}\sum\limits_{i=1}^{N_2}(z_i-\bar{z_2})(z_i-\bar{z_2})^T = \frac{1}{N_2}\sum\limits_{i=1}^{N_2}(w^Tx_i-\bar{z_2})(w^Tx_i-\bar{z_2})^T Sz2=N21i=1∑N2(zi−z2ˉ)(zi−z2ˉ)T=N21i=1∑N2(wTxi−z2ˉ)(wTxi−z2ˉ)T
类间差距: ( z ˉ 1 − z ˉ 2 ) 2 (\bar{z}_1-\bar{z}_2)^2 (zˉ1−zˉ2)2
类内方差: S 1 + S 2 S_1 + S_2 S1+S2
由于线性判别分析的目标是同一类别内方差小,不同类别之间距离大,因此损失函数定义为: J ( w ) = ( z ˉ 1 − z ˉ 2 ) 2 s 1 + s 2 = w T ( x ˉ c 1 − x ˉ c 2 ) ( x ˉ c 1 − x ˉ c 2 ) T w w T ( s c 1 + s c 2 ) w J(w) = \frac{(\bar{z}_1-\bar{z}_2)^2}{s_1+s_2} = \frac{w^T(\bar{x}_{c_1}-\bar{x}_{c_2})(\bar{x}_{c_1}-\bar{x}_{c_2})^Tw}{w^T(s_{c_1}+s_{c_2})w} J(w)=s1+s2(zˉ1−zˉ2)2=wT(sc1+sc2)wwT(xˉc1−xˉc2)(xˉc1−xˉc2)Tw
有 w ^ = a r g m a x w J ( w ) \hat{w} = argmax_w\;J(w) w^=argmaxwJ(w)
记: S b = ( x ˉ c 1 − x ˉ c 2 ) ( x ˉ c 1 − x ˉ c 2 ) T , S w = ( s c 1 + s c 2 ) S_b = (\bar{x}_{c_1}-\bar{x}_{c_2})(\bar{x}_{c_1}-\bar{x}_{c_2})^T,\;S_w = (s_{c_1}+s_{c_2}) Sb=(xˉc1−xˉc2)(xˉc1−xˉc2)T,Sw=(sc1+sc2)
因此 J ( w ) = w T S b w w T S w w J(w) = \frac{w^TS_bw}{w^TS_ww} J(w)=wTSwwwTSbw
让 J ( w ) J(w) J(w)对 w w w求导等于0,求出: w = S w − 1 ( x ˉ c 1 − x ˉ c 2 ) w = S_w^{-1}(\bar{x}_{c_1}-\bar{x}_{c_2}) w=Sw−1(xˉc1−xˉc2)
(2)朴素贝叶斯
在线性判别分析中,我们假设每种分类类别下的特征遵循同一个协方差矩阵,每两个特征之间是存在协方差的,因此在线性判别分析中各种特征是不是独立的。但是,朴素贝叶斯算法对线性判别分析作进一步的模型简化,它将线性判别分析中的协方差矩阵中的协方差全部变成0,只保留各自特征的方差,也就是朴素贝叶斯假设各个特征之间是不相关的。在之前所看到的偏差-方差理论中,我们知道模型的简化可以带来方差的减少但是增加偏差,因此朴素贝叶斯也不例外,它比线性判别分析模型的方差小,偏差大。虽然简化了模型,实际中使用朴素贝叶斯的案例非常多,甚至多于线性判别分析,例如鼎鼎大名的新闻分类,垃圾邮件分类等。
2.3 决策树
参考我之前写的另一篇详细讲解分类树和回归树的文章:
Task02加篇1——小白理解决策树
2.4 支持向量机SVM
支持向量机SVM是20世纪90年代在计算机界发展起来的一种分类算法,在许多问题中都被证明有较好的效果,被认为是适应性最广的算法之一。但是推导过于复杂,之后会专门出一篇SVM应用型的文章。
3 利用sklearn
构建完整的分类项目
所使用的数据为IRIS鸢尾花数据集。
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
feature = iris.feature_names
data = pd.DataFrame(X,columns=feature)
data['target'] = y
数据集预览如下:
其中,
sepal length (cm):花萼长度(厘米)
sepal width (cm):花萼宽度(厘米)
petal length (cm):花瓣长度(厘米)
petal width (cm):花瓣宽度(厘米)
# (1)逻辑回归
'''
penalty {‘l1’, ‘l2’, ‘elasticnet’, ‘none’}, default=’l2’正则化方式
dual bool, default=False 是否使用对偶形式,当n_samples> n_features时,默认dual = False。
C float, default=1.0
solver {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’}, default=’lbfgs’
l1_ratio float, default=None
'''
from sklearn.linear_model import LogisticRegression
log_iris = LogisticRegression()
log_iris.fit(X,y)
log_iris.score(X,y)
结果: 0.9733333333333334
# (2)线性判别分析
'''
参数:
solver:{'svd','lsqr','eigen'},默认='svd'
solver的使用,可能的值:
'svd':奇异值分解(默认)。不计算协方差矩阵,因此建议将此求解器用于具有大量特征的数据。
'lsqr':最小二乘解,可以与收缩结合使用。
'eigen':特征值分解,可以与收缩结合使用。
'''
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda_iris = LinearDiscriminantAnalysis()
lda_iris.fit(X,y)
lda_iris.score(X,y)
结果:0.98
# (3)朴素贝叶斯
from sklearn.naive_bayes import GaussianNB
NB_iris = GaussianNB()
NB_iris.fit(X, y)
NB_iris.score(X,y)
结果:0.96
# (4)使用决策树算法对iris分类:
'''
criterion:{“gini”, “entropy”}, default=”gini”
max_depth:树的最大深度。
min_samples_split:拆分内部节点所需的最少样本数
min_samples_leaf :在叶节点处需要的最小样本数。
'''
from sklearn.tree import DecisionTreeClassifier
tree_iris = DecisionTreeClassifier(min_samples_leaf=5)
tree_iris.fit(X,y)
tree_iris.score(X,y)
结果:0.9733333333333334
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
'''
C:正则化参数。正则化的强度与C成反比。必须严格为正。惩罚是平方的l2惩罚。
kernel:{'linear','poly','rbf','sigmoid','precomputed'},默认='rbf'
degree:多项式和的阶数
gamma:“ rbf”,“ poly”和“ Sigmoid”的内核系数。
shrinking:是否软间隔分类,默认true
'''
svc_iris = make_pipeline(StandardScaler(), SVC(gamma='auto'))
svc_iris.fit(X, y)
svc_iris.score(X,y)
结果:0.9733333333333334
可以看出,对于IRIS鸢尾花数据集,使用线性判别分析的结果最好(尽管与其他几种方法结果的差异微乎其微)。