文章目录
使用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
data.head()
sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) | target | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | 0 |
1 | 4.9 | 3.0 | 1.4 | 0.2 | 0 |
2 | 4.7 | 3.2 | 1.3 | 0.2 | 0 |
3 | 4.6 | 3.1 | 1.5 | 0.2 | 0 |
4 | 5.0 | 3.6 | 1.4 | 0.2 | 0 |
各个特征的相关解释:
- sepal length (cm):花萼长度(厘米)
- sepal width (cm):花萼宽度(厘米)
- petal length (cm):花瓣长度(厘米)
- petal width (cm):花瓣宽度(厘米)
二、选择度量模型性能的指标
度量分类模型的指标和回归的指标有很大的差异,首先是因为分类问题本身的因变量是离散变量,因此像定义回归的指标那样,单单衡量预测值和因变量的相似度可能行不通。其次,在分类任务中,我们对于每个类别犯错的代价不尽相同,例如:我们将癌症患者错误预测为无癌症和无癌症患者错误预测为癌症患者,在医院和个人的代价都是不同的,前者会使得患者无法得到及时的救治而耽搁了最佳治疗时间甚至付出生命的代价,而后者只需要在后续的治疗过程中继续取证就好了,因此我们很不希望出现前者,当我们发生了前者这样的错误的时候会认为建立的模型是很差的。为了解决这些问题,我们必须将各种情况分开讨论,然后给出评价指标。
- 真阳性TP:预测值和真实值都为正例;
- 真阴性TN:预测值与真实值都为负例;
- 假阳性FP:预测值为正,实际值为负;
- 假阴性FN:预测值为负,实际值为正;
- 准确率:分类正确的样本数占总样本的比例,即: A C C = T P + T N F P + F N + T P + T N ACC = \frac{TP+TN}{FP+FN+TP+TN} ACC=FP+FN+TP+TNTP+TN.
- 精度:预测为正且分类正确的样本占预测值为正的比例,即: 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 F1 = 2\frac{PRE\times REC}{PRE + REC} F1=2PRE+RECPRE×REC.
- ROC曲线:以假阳率为横轴,真阳率为纵轴画出来的曲线,曲线下方面积越大越好。
https://scikit-learn.org/stable/modules/model_evaluation.html#classification-metrics
三、选择具体的模型并进行训练
说到分类问题与回归问题的区别,在于回归问题与分类问题需要预测的因变量不一样。
在回归问题中,因变量是连续性变量,我们需要预测 E ( Y ∣ X ) E(Y|X) E(Y∣X)是一个连续的实数。但是在分类问题中,我们往往是通过已知X的信息预测Y的类别,往往是一个离散集合中的某个元素。如:是否患癌症,图片是猫还是狗等。
一个很自然的想法是能否用线性回归去处理分类问题,答案是可以但不好!先来看看线性回归处理分类问题会出现什么弊端,我们仔细来看这个线性回归的例子:
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就是违约反之不违约,感觉很完美的样子,但事实真的是这样吗?
假设我们需要用某个人的债务(Balance)和收入(Income)去预测是否会信用卡违约(default):
- 我们假设有一个穷人Lisa,他的Balance和Income都很小,那么有可能会导致default的值为负数,那么这个负数代表什么意义呢?显然是没有任何意义的。
- 当我们的分类变量是多类的时候,以0.5为界限划分分类就不可用了,那么我们应该怎么找到一个界限衡量多分类呢?
基于以上问题,现在大家是否还觉得线性回归模型作为一个分类模型是否足够优秀呢?其实,为了解决以上的问题(1)我们来想想能不能将线性回归的结果default转化为区间[0:1]上,让default转变成一个违约的概率呢?下面我们来解决这个问题吧。
1. 逻辑回归Logistic regression
逻辑回归分析仅在线性回归分析的基础上套用了一个逻辑函数,用于预测二值型因变量,其在机器学习领域有着特殊的地位,而且是计算广告学的核心。
Logistic回归进行分类的主要是想是:根据现有数据对分类边界线建立回归公式,以此进行分类。训练分类器时的做法就是寻找最佳拟合参数,使用的是最优化算法。
根据因变量的取值不同,逻辑回归分析可分为二元逻辑回归分析和多元逻辑回归分析。二元逻辑回归中的因变量只能取0和1两个值(虚拟因变量),而多元逻辑回归中的因变量可以取多个值(多分类问题)。
1.1 推导
线性回归模型可简写为 y = w T x + b y=w^Tx+b y=wTx+b。考虑单调可微分函数 g ( ⋅ ) g(·) g(⋅),令 y = g − 1 ( w T x + b ) y=g^{-1}(w^Tx+b) y=g−1(wTx+b),这样得到模型称为广义线性模型。其中,函数 g ( ⋅ ) g(·) g(⋅)称为联系函数。
逻辑回归是一种分类方法,主要用于二分类问题。考虑二分类任务,其输出标记为 y ∈ 0 , 1 y\in{0,1} y∈0,1,而线性回归模型产生的预测值 z = w T x + b z=w^Tx+b z=wTx+b是实值,我们希望实值能够转换为0或1。
这里有一个理想的函数叫做“单位阶跃函数”,也就是Sigmoid函数。它判定预测值z大于0是正例,小于0是反例,为临界值0则可以任意判定。
y
=
{
0
,
z
<
0
0.5
,
z
=
0
1
,
z
>
1
y=\begin{cases} 0,& z<0\\ 0.5,& z=0\\ 1, &z>1 \end{cases}
y=⎩⎪⎨⎪⎧0,0.5,1,z<0z=0z>1
这个一定程度上近似单位阶跃函数的“替代函数”,且希望它单调可微。而Logistic(或Sigmoid函数)正是这样的一个常用的替换函数,它的具体计算公式:
y
=
1
1
+
e
−
z
y=\frac{1}{1+e^{-z}}
y=1+e−z1
它将z值转化为一个接近0或1的y值,且其输出值在z=0附近变化很陡。将Logistic函数作为
g
−
1
(
⋅
)
g^{-1}(·)
g−1(⋅)代入上式,得
y
=
1
1
+
e
−
(
w
T
x
+
b
)
y=\frac{1}{1+e^{-(w^Tx+b)}}
y=1+e−(wTx+b)1
式子两边取对数,整理得,
ln
y
1
−
y
=
w
T
x
+
b
\ln\frac{y}{1-y}=w^Tx+b
ln1−yy=wTx+b
将y视为样本x作为正例的可能性,则1-y是其作为反例的可能性,两者的比值
y
1
−
y
\frac{y}{1-y}
1−yy称为概率,反映了x作为正例的可能性。对概率取对数则得到“对数概率”:
ln
y
1
−
y
\ln\frac{y}{1-y}
ln1−yy。
由此可看出,逻辑回归分析实际上是利用线性回归模型的预测结果逼近真实标记的对数概率。
那么如何确定式子中的
w
w
w和
b
b
b?若将式子中的y视为后验概率来估计
p
(
y
=
1
∣
x
)
p(y=1|x)
p(y=1∣x),则式子可重写:
l
n
p
(
y
=
1
∣
x
)
p
(
y
=
0
∣
x
)
=
w
T
x
+
b
ln\frac{p(y=1|x)}{p(y=0|x)}=w^Tx+b
lnp(y=0∣x)p(y=1∣x)=wTx+b
p ( y = 1 ∣ x ) = e w T x + b 1 + e w T x + b p(y=1|x)=\frac{e^{w^Tx+b}}{1+e^{w^Tx+b}} p(y=1∣x)=1+ewTx+bewTx+b
p ( y = 0 ∣ x ) = 1 1 + e w T x + b p(y=0|x)=\frac{1}{1+e^{w^Tx+b}} p(y=0∣x)=1+ewTx+b1
于是,可以通过极大似然估计来估计
w
w
w和
b
b
b。给定数据集
{
(
x
i
,
y
i
}
i
=
1
m
\{(x_i,y_i\}^m_{i=1}
{(xi,yi}i=1m,逻辑回归分析的最大化“对数似然”:
l
(
w
,
b
)
=
∑
i
=
1
m
ln
p
(
y
i
∣
x
i
;
w
,
b
)
\mathcal{l}(w,b)=\sum_{i=1}^{m}\ln p(y_i|x_i;w,b)
l(w,b)=i=1∑mlnp(yi∣xi;w,b)
即令每个样本属于其真实标记的概率越大越好。令
β
=
(
w
;
b
)
,
x
^
=
(
x
;
1
)
\beta=(w;b),\hat x=(x;1)
β=(w;b),x^=(x;1),则
w
T
x
+
b
w^Tx+b
wTx+b可简写成
β
T
x
^
\beta^T\hat x
βTx^。再令
p
1
(
x
^
;
β
)
=
p
(
y
=
1
∣
x
^
;
β
)
p
0
(
x
^
;
β
)
=
p
(
y
=
0
∣
x
^
;
β
)
=
1
−
p
1
(
x
^
;
β
)
p_1(\hat x;\beta)=p(y=1|\hat x ;\beta)\\ p_0(\hat x;\beta)=p(y=0|\hat x;\beta)=1-p_1(\hat x ;\beta)
p1(x^;β)=p(y=1∣x^;β)p0(x^;β)=p(y=0∣x^;β)=1−p1(x^;β)
因此,似然项可重写为:
p
(
y
i
∣
x
i
;
w
,
b
)
=
y
i
p
1
(
x
^
;
β
)
+
(
1
−
y
i
)
p
0
(
x
^
;
β
)
p(y_i|x_i;w,b)=y_ip_1(\hat x;\beta)+(1-y_i)p_0(\hat x;\beta)
p(yi∣xi;w,b)=yip1(x^;β)+(1−yi)p0(x^;β)
当
y
i
=
1
y_i=1
yi=1,结果就是
p
1
(
x
^
;
β
)
p_1(\hat x;\beta)
p1(x^;β),当
y
i
=
0
y_i=0
yi=0,结果是
p
0
(
x
^
;
β
)
=
1
−
p
1
(
x
^
;
β
)
p_0(\hat x;\beta)=1-p_1(\hat x;\beta)
p0(x^;β)=1−p1(x^;β)。
将重写后的似然项到回原式子,整理后得:
l
(
β
)
=
∑
i
=
1
m
(
−
y
i
β
T
x
^
i
+
ln
(
1
+
e
β
T
x
^
i
)
)
l(\beta)=\sum^{m}_{i=1}(-y_i\beta^T\hat x_i+\ln(1+e^{\beta^T\hat x_i}))
l(β)=i=1∑m(−yiβTx^i+ln(1+eβTx^i))
上式是关于
β
\beta
β的高阶可导连续凸函数。根据凸优化理论,利用经典的数值优化算法(如梯度下降法、牛顿法等)可得到其最优解,于是就得到:
∂
l
(
β
)
∂
β
=
−
∑
i
=
1
m
x
^
i
(
y
i
−
p
1
(
x
^
i
;
β
)
)
\frac{\partial l(\beta)}{\partial \beta}=-\sum^{m}_{i=1}\hat x_i(y_i-p_1(\hat x_i;\beta))
∂β∂l(β)=−i=1∑mx^i(yi−p1(x^i;β))
以牛顿法为例,其第
t
+
1
t+1
t+1轮迭代的更新公式:
β
t
+
1
=
β
t
−
(
∂
2
l
(
β
)
∂
β
∂
β
T
)
−
1
∂
l
(
β
)
∂
β
\beta^{t+1}=\beta^t-(\frac{\partial^2l(\beta)}{\partial\beta\partial\beta^T})^{-1}\frac{\partial l(\beta)}{\partial\beta}
βt+1=βt−(∂β∂βT∂2l(β))−1∂β∂l(β)
1.2 小结又改变一下
先理一下思路,线性回归表达式是:
f
(
x
)
=
w
T
x
+
b
f(x)=w^Tx+b
f(x)=wTx+b。在这里,我们做一个消除后面的常数项
b
b
b(上面就是求
w
w
w和
b
b
b)。将
x
′
=
[
1
x
]
T
x'=\begin{bmatrix}1&x\end{bmatrix}^T
x′=[1x]T,同时
w
′
=
[
b
x
]
T
w'=\begin{bmatrix}b&x\end{bmatrix}^T
w′=[bx]T,也就是给x多加一项且值恒为1,这样
b
b
b就到了
w
w
w里面去了。直线方程就简化为:
f
(
x
′
)
=
w
′
T
x
′
f(x')=w'^Tx'
f(x′)=w′Tx′
而下面所用
w
w
w和
x
x
x,指代的是
w
′
w'
w′和
x
′
x'
x′。
如果我们要预测标签为A的概率,然后知道概率是一个[0,1]区间的连续数值,而输出的数值是标签A的概率。如果A的概率大于0.5,就可以认为它是A类,否则就是B类。
但线性模型
f
(
x
)
=
w
T
x
f(x)=w^Tx
f(x)=wTx的值域是
(
−
∞
,
∞
)
(-\infty,\infty)
(−∞,∞),因此就不能直接基于线性模型建模,就需要找一个模型值域刚好在[0,1]区间且足够好用。于是,我们就引入的sigmoid
函数:
y
=
1
1
+
e
−
x
y=\frac{1}{1+e^{-x}}
y=1+e−x1
结合sigmoid函数,线性回归函数,将线性回归模型的输入作为Sigmoid函数的输入。于是,逻辑回归模型是 y = 1 1 + e − w T x y=\frac{1}{1+e^{-w^Tx}} y=1+e−wTx1,其中 w w w是不知道的。
假设我们已经训练好了一个 w ∗ w^* w∗,就直接将 x i x_i xi代入 y y y中,求出来的值就是 x i x_i xi的标签是1的概率。若概率大于0.5,那么就可以认为它是1类,否则就是0类。
那么
w
∗
w^*
w∗如何获得呢?若采用随机梯度下降的话,我们首先随机生成一个
w
w
w的初始值
w
0
w_0
w0,然后通过公式不断迭代,从而求得
w
∗
w^*
w∗的值:
w
t
+
1
=
w
t
+
η
(
y
n
−
1
1
+
e
−
w
T
x
n
)
x
n
w_{t+1}=w_t+\eta(y_n-\frac{1}{1+e^{-w^Tx_n}})x_n
wt+1=wt+η(yn−1+e−wTxn1)xn
每次迭代都从所有样本中随机抽取一个
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi)来代入上述方程。
参考链接:逻辑回归logistic regression公式推导
1.3 其他:梯度上升法与梯度下降法
1.3.1 梯度上升法
梯度上升法基于的思想是:要找到某函数的最大值,最好的方法就是沿着该函数的梯度方向探寻。若梯度记为
∇
\nabla
∇,则函数f(x,y)的梯度:
f
(
x
,
y
)
=
(
∂
f
(
x
,
y
)
∂
x
∂
f
(
x
,
y
)
∂
y
)
f(x,y)= \begin{pmatrix} \frac{\partial f(x,y)}{\partial x} \\ \\ \frac{\partial f(x,y)}{\partial y} \end{pmatrix}
f(x,y)=⎝⎜⎛∂x∂f(x,y)∂y∂f(x,y)⎠⎟⎞
这个梯度意味着要沿着
x
x
x的方向移动
∂
f
(
x
,
y
)
∂
x
\frac{\partial f(x,y)}{\partial x}
∂x∂f(x,y),沿着
y
y
y的方向移动
∂
f
(
x
,
y
)
∂
y
\frac{\partial f(x,y)}{\partial y}
∂y∂f(x,y)。其中,函数
f
(
x
,
y
)
f(x,y)
f(x,y)必须要在待计算的点上有定义且可微。
可以看出,梯度算子总是指向函数值增长最快的方向。这里所说的移动方向,而未提到移动量的大小。该测量值称为步长,记作
α
\alpha
α。用向量来表示的话,梯度上升算法的迭代公式:
w
:
=
w
+
α
∇
w
f
(
w
)
w:=w+\alpha \nabla_wf(w)
w:=w+α∇wf(w)
该公式将一直被迭代执行,直至达到某个条件为止,比如迭代次数达到某个指定值或算法达到可以允许的误差范围。
1.3.2 梯度下降法
梯度下降法与上面的梯度上升算法是一样的,只是公式中的加法需要变成减法。因此,对应公式可写成:
w
:
=
w
−
α
∇
w
f
(
w
)
w:=w-\alpha \nabla_wf(w)
w:=w−α∇wf(w)
梯度上升算法用来求函数的最大值,梯度下降法用来求函数的最小值。
如果想了解关于梯度下降法等无约束算法的具体细节,可参照下面两篇知乎博客:
2. 基于概率的分类模型
2.1 有关贝叶斯
朴素贝叶斯模型是一个非常简单,且实用性很强的分类模型。这个模型的基础是贝叶斯决策论,并假设各个维度上的特征被分类的条件概率是相互独立的。
假设我们现在用
p
1
(
x
,
y
)
p_1(x,y)
p1(x,y)表示数据点
(
x
,
y
)
(x,y)
(x,y)属于类别1
的概率,用
p
1
(
x
,
y
)
p_1(x,y)
p1(x,y)表示数据点
(
x
,
y
)
(x,y)
(x,y)属于类别2
的概率。现在对于一个新的数据点
(
x
,
y
)
(x,y)
(x,y),可以用下面的规则来判断它的类别:
- 若 p 1 ( x , y ) > p 2 ( x , y ) p_1(x,y)>p_2(x,y) p1(x,y)>p2(x,y),那么类别为1;
- 若 p 1 ( x , y ) < p 2 ( x , y ) p_1(x,y)<p_2(x,y) p1(x,y)<p2(x,y),那么类别为2。
也就是说,我们会选择高概率对应的类别。这就是贝叶斯决策论的核心思想,即选择具有最高概率的决策。在这里,使用 p 1 ( ) , p 2 ( ) p_1(),p_2() p1(),p2()只是为了方便描述。而真正需要计算和比较的是 p ( c 1 ∣ x , y ) , p ( c 2 ∣ x , y ) p(c_1|x,y),p(c_2|x,y) p(c1∣x,y),p(c2∣x,y),分别代表的是给定某个由x,y表示的数据点,那么数据点来自类别 c 1 c_1 c1的概率和来自类别 c 2 c_2 c2的概率。
假定我们已经知道 会发生事件B
的概率
P
(
B
)
P(B)
P(B) 和,事件A和事件B共同发生
的概率
P
(
A
B
)
P(AB)
P(AB)[也可以表示为
P
(
A
,
B
)
P(A,B)
P(A,B)],现在就需要求 在事件B已发生的条件下,会发生事件A
的概率
P
(
A
∣
B
)
P(A|B)
P(A∣B)。那么这就就是所谓的条件概率。它的计算公式如下:
P
(
A
∣
B
)
=
P
(
A
B
)
P
(
B
)
P(A|B)=\frac{P(AB)}{P(B)}
P(A∣B)=P(B)P(AB)
贝叶斯准则告诉我们如何交换条件概率的条件和结果,即若已知
p
(
x
∣
c
)
p(x|c)
p(x∣c),要求
p
(
c
∣
x
)
p(c|x)
p(c∣x),就可以:
p
(
c
∣
x
)
=
p
(
x
∣
c
)
p
(
c
)
p
(
x
)
p(c|x)=\frac{p(x|c)p(c)}{p(x)}
p(c∣x)=p(x)p(x∣c)p(c)
而上方的
p
(
c
∣
x
,
y
)
p(c|x,y)
p(c∣x,y)例子中,若已知的是
p
(
x
,
y
∣
c
i
)
p(x,y|c_i)
p(x,y∣ci),那么我们就可以应用贝叶斯准则,求得:
p
(
c
i
∣
x
,
y
)
=
p
(
x
,
y
∣
c
i
)
p
(
c
i
)
p
(
x
,
y
)
p(c_i|x,y)=\frac{p(x,y|c_i)p(c_i)}{p(x,y)}
p(ci∣x,y)=p(x,y)p(x,y∣ci)p(ci)
那么可以定义贝叶斯分类准则:
- 若 p ( c 1 ∣ x , y ) > p ( c 2 ∣ x , y ) p(c_1|x,y)>p(c_2|x,y) p(c1∣x,y)>p(c2∣x,y),那么属于类别 c 1 c_1 c1;
- 若 p ( c 1 ∣ x , y ) < p ( c 2 ∣ x , y ) p(c_1|x,y)<p(c_2|x,y) p(c1∣x,y)<p(c2∣x,y),那么属于类别 c 2 c_2 c2。
2.2 线性判别分析
线性判别分析是一个比较久远的算法,我将会从两个方向去描述这个算法,因为我觉得每位读者都有自己喜欢的那个理解的方向,分别是基于贝叶斯公式和降维分类的思想。
2.2.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)
我们先来看看符号具体代表什么意思。我们假设观测有
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)概率值,而我们现在的思路是通过贝叶斯定理计算贝叶斯定理的分子,比较分子最大的那个类别为最终类别。
2.2.2 推导
在我们推导复杂算法之前,我们先推导下简单的当自变量个数只有一个的模型,即 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
(下图虚线是线性判别分析的决策边界,正态曲线哪边高样本就是哪一类)
我们推到出了一个自变量的简单模型,就要泛化为多个自变量的线性判别分析了,即
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
2.2.3 降维分类的思想理解线性判别分析
基于数据进行分类时,一个很自然的想法是:将高维的数据降维至一维,然后使用某个阈值将各个类别分开。下面用图的形式展示:
图中,数据的维度是二维的,我们的想法是把数据降维至一维,然后用阈值就能分类。这个似乎是一个很好的想法,我们总是希望降维后的数据同一个类别自身内部方差小,不同类别之间的方差要尽可能大。这也是合理的,因为同一个类别的数据应该更加相似,因此方差小;不同类别的数据之间应该很不相似,这样才能更容易对数据进行分类,我们简称为:类内方差小,类间方差大,在计算机语言叫“松耦合,高内聚”。在做具体的推导之前,我们对数据的形式和一些基本统计量做一些描述:
特征 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 i ∈ { + 1 , − 1 } Y = (y_1,y_2,...,y_N)^T,\;\;其中,y_i \in \{+1,-1 \} Y=(y1,y2,...,yN)T,其中,yi∈{+1,−1},类别c1的特征 X c 1 = { x i ∣ y i = + 1 } X_{c_1} = \{x_i|y_i=+1 \} Xc1={xi∣yi=+1},同理,类别c2的特征 X c 2 = { x i ∣ y i = − 1 } X_{c_2} = \{x_i|y_i=-1 \} Xc2={xi∣yi=−1},属于c1类别的数据个数为 N 1 N_1 N1,属于类别c2的数据个数为 N 2 N_2 N2,其中, N 1 + N 2 = N N_1+N_2 = N N1+N2=N。
- 特征X投影在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
- 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
- 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
- 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
- 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
w
^
=
a
r
g
m
a
x
w
J
(
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}\\ \;\;\; \hat{w} = argmax_w\;J(w)
J(w)=s1+s2(zˉ1−zˉ2)2=wT(sc1+sc2)wwT(xˉc1−xˉc2)(xˉc1−xˉc2)Tww^=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)对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.3 朴素贝叶斯
在线性判别分析中,我们假设每种分类类别下的特征遵循同一个协方差矩阵,每两个特征之间是存在协方差的,因此在线性判别分析中各种特征是不是独立的。但是,朴素贝叶斯算法对线性判别分析作进一步的模型简化,它将线性判别分析中的协方差矩阵中的协方差全部变成0,只保留各自特征的方差,也就是朴素贝叶斯假设各个特征之间是不相关的。
若特征之间相互独立,那么样本数就可以从 N 1000 N^{1000} N1000减少到 1000 × N 1000 \times N 1000×N。所谓独立,指的是统计意义上的独立,即一个特征出现的可能性与它和其他特征相邻没有关系。
给定类别
c
c
c和特征数据
(
x
1
,
.
.
.
,
x
n
)
(x_1,...,x_n)
(x1,...,xn)。由特征条件独立的假设,即
p
(
x
i
∣
c
,
x
1
,
.
.
.
,
x
i
−
1
,
x
i
,
.
.
.
,
x
n
)
=
p
(
x
i
∣
c
)
p(x_i|c,x_1,...,x_{i-1},x_i,...,x_n)=p(x_i|c)
p(xi∣c,x1,...,xi−1,xi,...,xn)=p(xi∣c),可得:
p
(
c
∣
x
1
,
.
.
.
,
x
n
)
=
p
(
c
)
∏
i
=
1
n
p
(
x
i
∣
c
)
p
(
x
1
,
.
.
.
,
x
n
)
∝
p
(
c
)
∏
i
=
1
n
p
(
x
i
∣
c
)
p(c|x_1,...,x_n)=\frac{p(c)\prod^{n}_{i=1}p(x_i|c)}{p(x_1,...,x_n)}\propto p(c)\prod^{n}_{i=1}p(x_i|c)
p(c∣x1,...,xn)=p(x1,...,xn)p(c)∏i=1np(xi∣c)∝p(c)i=1∏np(xi∣c)
因此,类别由
c
^
=
arg
max
c
p
(
c
)
∏
i
=
1
n
p
(
x
i
∣
c
)
\hat c= \mathop{\arg\max }_{c}p(c)\prod^{n}_{i=1}p(x_i|c)
c^=argmaxcp(c)∏i=1np(xi∣c)估计得出。要学习的参数就是两种概率,通常采用最大似然估计方法。其中,
p
(
c
)
=
(
c
i
=
c
)
/
N
p(c)=(c_i=c)/N
p(c)=(ci=c)/N,对应训练集中类别
c
c
c出现的频率。
对于条件概率 p ( x i ∣ c ) p(x_i|c) p(xi∣c),根据不同的假设具有不同的形式:
- 高斯朴素贝叶斯: p ( x i ∣ c ) = 1 2 π σ c 2 exp ( − ( x i − μ c ) 2 2 σ c 2 ) p(x_i|c)=\frac{1}{\sqrt{2\pi\sigma_c^2}}\exp(-\frac{(x_i-\mu_c)^2}{2\sigma_c^2}) p(xi∣c)=2πσc21exp(−2σc2(xi−μc)2)(参数 μ c , σ c \mu_c,\sigma_c μc,σc可由最大似然估计方法估计);
- 多项式朴素贝叶斯: p ( x i ∣ c ) = N c i + λ N c + λ n p(x_i|c)=\frac{N_{ci}+\lambda}{N_c+\lambda n} p(xi∣c)=Nc+λnNci+λ(N属于类别 c c c的样本数量, N c i N_{ci} Nci表示属于类别 c c c且特征等于 x i x_i xi的样本的数量, λ \lambda λ是正则化参数);
- 伯努利朴素贝叶斯: p ( x i ∣ c ) = p ( i ∣ c ) x i + ( 1 − p ( i ∣ c ) ) ( 1 − x i ) p(x_i|c)=p(i|c)x_i+(1-p(i|c))(1-x_i) p(xi∣c)=p(i∣c)xi+(1−p(i∣c))(1−xi)。
在之前所看到的偏差-方差理论中,我们知道模型的简化可以带来方差的减少但是增加偏差,因此朴素贝叶斯也不例外,它比线性判别分析模型的方差小,偏差大。而在属性间相关性较小时,使用朴素贝叶斯模型的性能最好。虽然简化了模型,实际中使用朴素贝叶斯的案例非常多,甚至多于线性判别分析,例如鼎鼎大名的新闻分类,垃圾邮件分类等。
2.3.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
# 线性判别分析
'''
参数:
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
# 朴素贝叶斯
from sklearn.naive_bayes import GaussianNB
NB_iris = GaussianNB()
NB_iris.fit(X, y)
NB_iris.score(X,y)
0.96
2.4 决策树
与前面内容所讲的决策树回归大致是一样的,只是在回归问题中,选择分割点的标准是均方误差,但是在分类问题中,由于因变量是类别变量而不是连续变量,因此用均方误差显然不合适。那问题是用什么作为选择分割点的标准呢?我们先来分析具体的问题:
在回归树中,对一个给定的观测值,因变量的预测值取它所属的终端结点内训练集的平均因变量。与之相对应,对于分类树来说,给定一个观测值,因变量的预测值为它所属的终端结点内训练集的最常出现的类。
分类树的构造过程与回归树也很类似,与回归树一样,分类树也是采用递归二叉分裂。但是在分类树中,均方误差无法作为确定分裂节点的准则,一个很自然的替代指标是分类错误率。分类错误率就是:此区域内的训练集中非常见类所占的类别,即:
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类所占的比例。但是在大量的事实证明:分类错误率在构建决策树时不够敏感,一般在实际中用如下两个指标代替:
- 基尼系数
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。
-
交叉熵
可以替代基尼系数的指标是交叉熵,主要用于度量两个概率分布间的差异性信息。定义如下:
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个结点的纯度越高,则交叉熵越小。事实证明,基尼系数和交叉熵在数值上时很接近的。
- 信息增益
划分数据集的最大原则:将无序的数据变得更加有序。而在划分数据集之前之后信息发生的变化成为信息增益。
在可以评测哪种数据划分方式是最好的数据划分之前,需要先学习如何计算信息增益。集合信息的度量方式称为香农熵,或者简称熵。熵定义为信息的期望值。若待分类的事务可能划分在多个分类之中,则符号
x
i
x_i
xi定义为:
l
(
x
i
)
=
−
log
2
p
(
x
i
)
l(x_i)=-\log_2p(x_i)
l(xi)=−log2p(xi)
其中,
p
i
(
x
i
)
p_i(x_i)
pi(xi)代表选择该分类的概率。
为了计算熵,还需要计算所有类别可能值包含的信息期望值,通过下面公式得到:
H
=
−
∑
i
=
1
n
p
(
x
i
)
log
2
p
(
x
i
)
H=-\sum^{n}_{i=1}p(x_i)\log_2p(x_i)
H=−i=1∑np(xi)log2p(xi)
其中,n是分类的数目。
数据集的信息熵:
H
(
D
)
=
−
∑
k
=
1
K
∣
C
k
∣
∣
D
∣
log
2
∣
C
k
∣
∣
D
∣
H(D)=-\sum^{K}_{k=1}\frac{|C_k|}{|D|}\log_2\frac{|C_k|}{|D|}
H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣
其中,
C
k
C_k
Ck表示集合D中属于第k类样本子集。针对某个特征A,对于数据集D的条件熵
H
(
D
∣
A
)
H(D|A)
H(D∣A)为:
H
(
D
∣
A
)
=
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
H
(
D
i
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
(
∑
k
=
1
K
∣
C
i
k
∣
∣
D
i
∣
log
2
∣
C
i
k
∣
∣
D
i
∣
)
H(D|A)=\sum^{n}_{i=1}\frac{|D_i|}{|D|}H(D_i)\\ = -\sum^{n}_{i=1}\frac{|D_i|}{|D|}(\sum^{K}_{k=1}\frac{|C_{ik}|}{|D_i|}\log_2\frac{|C_{ik}|}{|D_i|})
H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣(k=1∑K∣Di∣∣Cik∣log2∣Di∣∣Cik∣)
其中,
D
i
D_i
Di表示D中特征A取第i个值的样本子集,
D
i
k
D_{ik}
Dik表示
D
i
D_i
Di中属于第k类的样本子集。
信息增益 = 信息熵 - 条件熵:
G
a
i
n
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
Gain(D,A)=H(D)-H(D|A)
Gain(D,A)=H(D)−H(D∣A)
信息增益越大,表示使用特征A来划分所获得的“纯度提升越大”。
-
信息增益率
利用信息增益率可以克服信息增益的缺点,公式:
G a i n r a t i o ( D , A ) = G a i n ( D , A ) H A ( D ) Gain_{ratio}(D,A)=\frac{Gain(D,A)}{H_A(D)} Gainratio(D,A)=HA(D)Gain(D,A)H A ( D ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ log 2 ∣ D i ∣ ∣ D ∣ H_A(D)=-\sum^{n}_{i=1}\frac{|D_i|}{|D|}\log_2\frac{|D_i|}{|D|} HA(D)=−i=1∑n∣D∣∣Di∣log2∣D∣∣Di∣
H A ( D ) H_A(D) HA(D)称为特征A的固有值。信息增益率对可取值较少的特征有所偏好(分母越小,整体越大)。
决策树的实现有以下三种算法,分别是:ID3,C4.5,CART。
2.4.1 决策树之ID3
ID3算法是建立在奥卡姆剃刀(用较少的的东西,同样可以做好事情)的基础上:越是小型的决策树,越优于大的决策树。
从信息论的知识中我们知道:信息熵越大,从而样本纯度越低。ID3 算法的核心思想就是以信息增益来度量特征选择,选择信息增益最大的特征进行分裂。算法采用自顶向下的贪婪搜索遍历可能的决策树空间(C4.5 也是贪婪搜索)。 其大致步骤为:
- 初始化特征集合和数据集合;
- 计算数据集合信息熵和所有特征的条件熵,选择信息增益最大的特征作为当前决策节点;
- 更新数据集合和特征集合(删除上一步使用的特征,并按照特征值来划分不同分支的数据集合);
- 重复 2,3 两步,若子集值包含单一特征,则为分支叶子节点。
缺点:
- ID3 没有剪枝策略,容易过拟合;
- 信息增益准则对可取值数目较多的特征有所偏好,类似“编号”的特征其信息增益接近于 1;
- 只能用于处理离散分布的特征;
- 没有考虑缺失值。
2.4.2 决策树之C4.5
C4.5 算法最大的特点是克服了 ID3 对特征数目的偏重这一缺点,引入信息增益率来作为分类标准。
C4.5 相对于 ID3 的缺点对应有以下改进方式:
- 引入悲观剪枝策略进行后剪枝;
- 引入信息增益率作为划分标准;
- 将连续特征离散化,假设 n 个样本的连续特征 A 有 m 个取值,C4.5 将其排序并取相邻两样本值的平均数共 m-1 个划分点,分别计算以该划分点作为二元分类点时的信息增益,并选择信息增益最大的点作为该连续特征的二元离散分类点。
2.4.2.1 预剪枝
在节点划分前来确定是否继续增长,及早停止增长的主要方法有:
- 节点内数据样本低于某一阈值;
- 所有节点特征都已分裂;
- 节点划分前准确率比划分后准确率高。
预剪枝不仅可以降低过拟合的风险而且还可以减少训练时间,但另一方面它是基于“贪心”策略,会带来欠拟合风险。
2.4.2.2 后剪枝
在已经生成的决策树上进行剪枝,从而得到简化版的剪枝决策树。
C4.5 采用的悲观剪枝方法,用递归的方式从低往上针对每一个非叶子节点,评估用一个最佳叶子节点去代替这课子树是否有益。如果剪枝后与剪枝前相比其错误率是保持或者下降,则这棵子树就可以被替换掉。C4.5 通过训练数据集上的错误分类数量来估算未知样本上的错误率。
后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但同时其训练时间会大的多。
2.4.2.3 缺点
- 剪枝策略可以再优化;
- C4.5 用的是多叉树,用二叉树效率更高;
- C4.5 只能用于分类;
- C4.5 使用的熵模型拥有大量耗时的对数运算,连续值还有排序运算;
- C4.5 在构造树的过程中,对数值属性值需要按照其大小进行排序,从中选择一个分割点,所以只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时,程序无法运行。
2.4.3 决策树之CART
ID3 和 C4.5 虽然在对训练样本集的学习中可以尽可能多地挖掘信息,但是其生成的决策树分支、规模都比较大,CART 算法的二分法可以简化决策树的规模,提高生成决策树的效率。
CART 包含的基本过程有分裂,剪枝和树选择。
- 分裂:分裂过程是一个二叉递归划分过程,其输入和预测特征既可以是连续型的也可以是离散型的,CART 没有停止准则,会一直生长下去;
- 剪枝:采用代价复杂度剪枝,从最大树开始,每次选择训练数据熵对整体性能贡献最小的那个分裂节点作为下一个剪枝对象,直到只剩下根节点。CART 会产生一系列嵌套的剪枝树,需要从中选出一颗最优的决策树;
- 树选择:用单独的测试集评估每棵剪枝树的预测性能(也可以用交叉验证)。
更详细的内容,请参考连接:【机器学习】决策树(上)——ID3、C4.5、CART(非常详细)
2.4.4 决策树分类算法的完整步骤
-
选择最优切分特征 j j j以及该特征上的最优点 s s s:
遍历特征 j j j以及固定 j j j后,遍历切分点 s s s,选择使得基尼系数或者交叉熵最小的 ( j , s ) (j,s) (j,s)
-
按照 ( j , s ) (j,s) (j,s)分裂特征空间,每个区域内的类别为该区域内样本比例最多的类别;
-
继续调用步骤1,2知道满足停止条件,就是每个区域的样本数小于等于5;
-
将特征空间划分为 J J J个不同的区域,生成分类树。
2.4.5 代码示例
# 使用决策树算法对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
2.5 支持向量机SVM
在介绍向量机之前,先了解一些基本概念。
假如现在有两组数据,它们之间已经分隔得足够开,那么很容易就可以在它们之间画一条直线,将两组数据点分开,那么这组数据就称为线性可分。
而将数据集分隔开来的直线称为分隔超平面。由于我们现在假设的数据点都在二维平面上,所以此时的分超平面只是一条直线。如果所给的数据集是三维,那么用来分隔数据的就是一个平面。当出现更高维的情况就可以以此类推。而这类无论是多少维的数据分隔对象都统称为超平面,也就是分类的决策边界。分布在超平面一侧的所有数据都属于某个类别,而分布在另一侧的所有数据则属于另一个类别。
我们希望能够采用这种方式来构建分类器,即如果数据点离决策边界越远,那么最后的预测结果就越可信。我们希望找到离分隔超平面最近的点,确保它们离分隔面的距离尽可能远。这里点到分隔面的距离就称为间隔。
而支持向量就是离分隔超平面最近的那些点。
给定一个分割平面稍微上移下移或旋转这个超平面,只要不接触这些观测点,仍然可以将数据分开。一个很自然的想法就是找到最大间隔超平面,即找到一个分割平面距离最近的观测点最远。下面我们来严格推导。
2.5.1 推导
分隔超平面的形式可以写成
w
T
x
+
b
w^Tx+b
wTx+b,而计算数据点
x
x
x到分隔超平面的距离就必须要给出点到分隔面的法线或垂线的长度,该值为
∣
w
T
x
+
b
∣
∣
∣
w
∣
∣
\frac{|w^Tx+b|}{||w||}
∣∣w∣∣∣wTx+b∣。这里的
b
b
b类似于Logistic回归
中的截距
w
0
w_0
w0。而这里的向量
w
w
w和常量
b
b
b一起描述了所给数据的分隔线或超平面。
我们根据距离超平米那最近的点,只要同时缩放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
\left\{ \begin{array}{l} w^{T} x_{1}+b=1 \\ w^{T} x_{2}+b=-1 \end{array} \right.\\ \left(w^{T} x_{1}+b\right)-\left(w^{T} x_{2}+b\right)=2 \\ w^{T}\left(x_{1}-x_{2}\right)=2
{wTx1+b=1wTx2+b=−1(wTx1+b)−(wTx2+b)=2wT(x1−x2)=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 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}} wT(x1−x2)=∥w∥2∥x1−x2∥2cosθ=2∥x1−x2∥2cosθ=∥w∥22
d 1 = d 2 = ∥ x 1 − x 2 ∥ 2 cos θ 2 = 2 ∥ w ∥ 2 2 = 1 ∥ w ∥ 2 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}} d1=d2=2∥x1−x2∥2cosθ=2∥w∥22=∥w∥21
d 1 + d 2 = 2 ∥ w ∥ 2 d_{1}+d_{2}=\frac{2}{\|w\|_{2}} d1+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
2.6 非线性支持向量机
在刚刚的讨论中,我们都是着重讨论了线性支持向量机是如何工作的,但是在现实生活中,我们很难碰到线性可分的数据集,如:
那我们应该如何处理非线性问题呢?答案就是将数据投影至更加高的维度!
上图中,在一维数据做不到线性可分,我们将数据投影至二维平面就可以成功线性可分。那么,我们来详细探讨下这其中的奥妙:
Φ
:
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)。我们要将其映射到超级高的维度来计算特征的内积。SVM优化中好的地方在于,所有运算都可以写成内积,也称其为点积的形式。向量的内积指的是两向量相乘,之后得到单个标量或数值。将内积替换成核函数的方式被称为核技巧或核“变电”。
但这时候映射成的高维维度是爆炸性增长的,这个计算量实在是太大了,而且如果遇到无穷维的情况,就根本无从计算了。下面引入核函数:
假设
ϕ
\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)的计算是在低维特征空间来计算的,它避免了在刚才我们提到了在高维维度空间计算内积的恐怖计算量。也就是说,我们可以好好享受在高维特征空间线性可分的利益,却避免了高维特征空间恐怖的内积计算量。下面介绍几种常用的核函数:
- 多项式核函数
多项式核函数(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代表无核函数。
- 高斯核函数
高斯核函数(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)
使用高斯核函数之前需要将特征标准化,因此这里衡量的是样本之间的相似度。
- 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相当于没有隐藏层的简单神经网络。
-
余弦相似度核
常用于衡量两段文字的余弦相似度,表达式为:
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
2.6.1 代码示例
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