Classification 分类:概率生成模型
线性回归算法的output是一个数值,而分类算法的input依旧是features,但output是一个类别。
例如,
- 在信用评估中,input:个人的收入,职业,年龄等,output:接受 or 拒绝 (二分类)
- 在医疗诊断系统中,nput:现在的症状,年龄,性别等,output:哪种病(多分类)
- 人脸识别,输入人脸的图像,判断出哪个人(超多分类)
- 手写字识别,很好理解,输出一个汉字(超多分类)
今天依旧以“神奇宝贝”为例,需要找一个function: - 输入:一只神奇宝贝的feature(整体强度,生命值,攻击力,防御力,特殊攻击力,特殊防御力,速度等)
- 输出:这只神奇宝贝的属性(电,火,水等)
首先将神奇宝贝的特性数值化:以比卡丘为例 - Total:整体强度,大概的表述神奇宝贝有多强,比如皮卡丘是320
- HP:生命值,35
- Attack:攻击力,55
- Defense:防御力,40
- SP Atk:特殊攻击力,50
- SP Def:特殊防御力,50
- Speed:速度,90 ,数值大可以先攻击
- 上述7个数字组成一个向量。
因为游戏中存在属性相克的问题,所以我们这个做的意义就是预测属性,抢占游戏优势。
我们先拿前400号的神奇宝贝作为训练数据,例如皮卡丘
(
x
1
,
y
^
1
)
(x^1,\hat{y}^1)
(x1,y^1)电属性
我们还不知道分类算法是什么样,假如我们还是用回归来解决问题呢?
举一个二分类的例子,假设输入神奇宝贝的特征 x x x,判断属于类别1或者类别2,把这个当作回归问题。
- Training:类别1,相当于target是 1;类别2,相当于target是 2。
- Testing:回归问题输出是数值,靠近1为类别1,靠近-1为类别2。
假设我们的model是有两个feature:
y
=
b
+
w
1
x
1
+
w
2
x
2
y = b + w_1x_1 + w_2x_2
y=b+w1x1+w2x2
令其等于0得到左图中的绿色分界线,红叉为类别2,我们希望模型输出-1左右,小于0;蓝圈是类别1,希望输出在1左右,大于0。
但当我们看到右图时,在regression中我们希望蓝圈越接近1越好,所以绿线会故意顺时针旋转来压小error,得到紫线。此时我们可以看出用回归解决分类问题是不妥当的。
还有另外一个问题:比如多分类,类别1当作target1,类别2当作target2,类别3当作target3…如果这样做的话,就会认为类别2和类别3是比较接近的,认为它们是有某种关系的;认为类别1和类别2也是有某种关系的,比较接近的。但是实际上这种关系不存在,它们之间并不存在某种特殊的关系。这样是没有办法得到好的结果。
理想方案
以二分类为例,我们的function set中有一个内嵌函数
g
(
x
)
g(x)
g(x),,大于就是分类1,反之分类2。
计算Loss的方法也很有趣,是分类错误的次数。之前我们求Loss最小值用的都是梯度下降法,但是这个式子没办法微分,我们之后会用SVM计算。这里引入一个概率模型。
概率模型实现
盒子拿球
从盒子中拿小球是我们中学就学过的统计学知识。
随机从两个盒子中抽一个球,抽到的是盒子1中蓝色球的概率,通过贝叶斯公式得到
4
5
\frac { 4 } { 5 }
54。
由上边的例子可以知道,如果从训练数据中估计出如下红框的四个概率,就可以计算出给一个
x
x
x,它是属于哪个类别,
P
(
C
1
∣
x
)
P(C_1|x)
P(C1∣x) 和
P
(
C
2
∣
x
)
P(C_ 2 | x)
P(C2∣x),哪个类别的概率大就属于哪个。
这一套想法叫做生成模型(Generative Model)。
有了这个模型,就可以生成一个 x x x,可以通过全概率公式计算某个 x x x 出现的概率,知道了 x x x 的分布,就可以自己产生 x x x 。
先验概率
还是简单的二分类为例,蓝色为水系,绿色一般系,通过训练集的数据可以计算出
P
(
C
1
)
P(C_1)
P(C1) 和
P
(
C
2
)
P(C_2)
P(C2),如图所示:
- 水系占比: P ( C 1 ) = 0.56 P(C_1) = 0.56 P(C1)=0.56
- 普通系占比: P ( C 2 ) = 0.44 P(C_2) = 0.44 P(C2)=0.44
我们来计算一下原盖海龟是水系的概率。虽然我们知道他一定是水系的,但是每只神奇宝贝都用一个特征向量来表示
下面将训练集中79个水系的神奇宝贝,属性Defense和SP Defense进行可视化。在水系的神奇宝贝中随机选一只,是海龟的概率?
这里假设这79点是从高斯分布(Gaussian distribution)中采样的,现在需要从这79个点找出符合的那个高斯分布。
高斯分布
我们可以把高斯分布当作一个 function,输入就是一个向量 x x x,输出就是选中 x x x 的概率(实际上高斯分布不等于概率,只是和概率成正比,这里简单说成概率)。 function由期望 μ \mu μ 和协方差矩阵 ∑ \sum ∑ 决定。
- 同样的 ∑ \sum ∑,不同的 μ \mu μ ,概率分布的最高点的位置是不同的。
- 同样的
μ
\mu
μ,不同的
∑
\sum
∑,概率分布的最高点是一样的,但是离散度是不一样的。
假设我们从高斯分布中sample出这79个点,并计算出他们的 ∑ \sum ∑和 μ \mu μ,写出高斯分布的 f u n c t i o n f μ , Σ ( x ) function \ f_{μ,Σ}(x) function fμ,Σ(x)。将 x x x代入就可以求得被sample的几率。
最大似然
任意期望和协方差矩阵构成的高斯分布,都可以生成这79个点。但左边的高斯分布生成这些点的几率比右边高斯分布大。
那给一个
μ
\mu
μ 和
∑
\sum
∑,它生成这79个点的概率为图中的
L
(
μ
,
∑
)
L(\mu,\sum)
L(μ,∑)(样本的似然函数)。
使得
L
(
μ
,
∑
)
L(\mu,\sum)
L(μ,∑)最大的参数记做
(
μ
∗
,
∑
∗
)
(\mu^∗,\sum^∗)
(μ∗,∑∗),
(
μ
∗
,
∑
∗
)
(\mu^∗,\sum^∗)
(μ∗,∑∗)就是所有
L
(
μ
,
∑
)
L(\mu,\sum)
L(μ,∑)的 Maximum Likelihood(最大似然)。将Likelihood求两次偏微分即可吃到*的值。
应用最大似然计算期望和协方差
分别计算水系和一般系的期望和协方差。
如果
P
(
C
1
∣
x
)
>
0.5
P(C_1|x)>0.5
P(C1∣x)>0.5则为水系。我们已经得到了需要计算的值,可以进行分类了。
左上角的图中蓝点是水系神奇宝贝,红点是一般系的神奇宝贝,图中的颜色:越偏向红色代表是水系的可能性越高,越偏向蓝色代表是水系的可能性越低。
右上角是在训练集上进行分类的结果,红色就是 P ( C 1 ∣ x ) P(C_1|x) P(C1∣x) 大于0.5的部分,是属于类别1,相对蓝色属于类别2。右下角是放在测试集上进行分类的结果。结果在测试集上正确率只有 47% 。当然这里只处理了二维(两个属性)的情况,那在7维空间计算出最大释然估计值,此时 μ μ μ是7维向量, Σ Σ Σ是7维矩阵。得到结果也只有54% 的正确率,十分不理想。
优化模型
通常不会给每个高斯分布都计算出一套最大似然估计,协方差矩阵和输入的feature size的平方成正比,所以当feature很大的时候,协方差矩阵增长很快。协方差矩阵不同,model参数太多,造成Variance很大,容易Overfitting。为了有效减少参数,强迫这两个类别的高斯分布相同的协方差矩阵。
此时修改似然函数为
L
(
μ
1
,
μ
2
,
Σ
)
L(μ_1,μ_2,Σ)
L(μ1,μ2,Σ)。
μ
1
,
μ
2
μ_1,μ_2
μ1,μ2计算方法和上面相同(
μ
1
μ_1
μ1是
x
1
−
79
x^{1-79}
x1−79的平均数);而
Σ
Σ
Σ是加权平均的结果。
右图新的结果,分类的boundary是线性的,所以也将这种分类叫做 linear model。如果考虑所有的属性,发现正确率提高到了73%。
将上述问题简化为前几个系列说过的机器学习三步走:
实际做的就是要找一个概率分布模型,可以最大化产生data的likelihood。
为什么是高斯分布?
可能选择其他分布也会问同样的问题。。。
有一种常见的假设
假设几率分布是相互独立的,所以可以将
P
(
x
∣
C
1
)
P(x|C_1)
P(x∣C1)拆分成乘积。每个产生的概率都符合一维的高斯分布。此时
P
(
x
∣
C
1
)
P(x|C_1)
P(x∣C1) 的高斯分布的协方差是对角型的(不是对角线的地方值都是0),这样就可以减少参数的量。但是试一下这种做法会坏掉。
二元分类通常不会用高斯分布,可以假设是符合 Bernoulli distribution(伯努利分布)。
假设所有的feature都是相互独立产生的,这种分类叫做 Naive Bayes Classifier(朴素贝叶斯分类器)
后验概率
将 P ( C 1 ∣ x ) P(C_1|x) P(C1∣x)整理,得到一个 σ ( z ) σ(z) σ(z),我们熟悉的Sigmoid function。
当z趋近于负无穷
σ
(
z
)
σ(z)
σ(z)趋近于0;当z趋近于正无穷
σ
(
z
)
σ(z)
σ(z)趋近于1。
我们算一下
z
z
z长什么样子。
求得
z
z
z,然后:
通过这个化简过程我们知道为什么两个分布要取相同的协方差。
化简 z z z: x x x的系数记做向量 w T w^T wT,后面3项结果都是标量,所以三个数字加起来记做 b b b。最后 P ( C 1 ∣ x ) = σ ( w ⋅ x + b ) P(C_1|x)=σ(w⋅x+b) P(C1∣x)=σ(w⋅x+b)。从这个式子也可以看出当共用协方差矩阵的时候,为什么分界线是线性的。
在Generative model,我们找到这五个参数的值代入式子就可求得几率。
我们可不可以直接找出 w w w和 b b b呢?