机器学习系列6-分类问题(概率⽣成模型)Classification: Probabilistic Generative Model
如果本⽂对你有帮助,请给我的打个star叭,上⾯附有全系列⽬录和内容!
更多优质内容欢迎关注我的“Sakura的知识库”:
Classification
概念描述
分类问题是⼀个function,它的input是⼀个object,它的输出是这个object属于哪⼀个class
还是以宝可梦为例,已知宝可梦有18种属性,现在要解决的分类问题就是做⼀个宝可梦种类的分类器,我们要⼀个function,这个function的input是某⼀只宝可梦,它的output就是这只宝可梦属于这18类别中的哪⼀个type
输⼊数值化
对于宝可梦的分类问题来说,我们需要解决的第⼀个问题就是,怎么把某⼀只宝可梦当做function的input?
要想把⼀个东西当做function的input,就需要把它数值化
特性数值化:⽤⼀组数字来描述⼀只宝可梦的特性
⽐如⽤⼀组数字表⽰它有多强(total strong)、它的⽣命值(HP)、它的攻击⼒(Attack)、它的防御⼒(Defense)、它的特殊攻击⼒(Special Attack)、它的特殊攻击的防御⼒(Special defend)、它的速度(Speed)
以⽪卡丘为例,我们可以⽤以上七种特性的数值所组成的vector来描述它
How to classification
Training data for Classification
假设我们把编号400以下的宝可梦当做training data,编号400以上的当做testing data,因为宝可梦随着版本更新是不断增加的,编号⽐较前⾯的宝可梦是⽐较早发现的,所以我们去模拟已经发现这些宝可梦的情况下,如果看到新的宝可梦,能不能够预测它是哪种属性Classification as Regression ?
可以把分类问题当做回归问题来解吗?
以binary classification为例,我们在Training时让输⼊为class 1的输出为1,输⼊为class 2的输出为-1;那么在testing的时
候,regression的output是⼀个数值,它接近1则说明它是class 1,它接近-1则说明它是class 2
如果这样做,会遇到什么样的问题?
假设现在我们的model是,input是两个feature,和有两个class,蓝⾊的是class 1,红⾊的是class 2,如果⽤Regression的做法,那么就希望蓝⾊的这些属于class 1的宝可梦,input到Regression的model,output越接近1越好;红⾊的属于class 2的宝可梦,input到Regression的model,output越接
近-1越好假设我们真的到了这个function,就像下图左边所⽰,绿⾊的线表⽰,也就是class 1和class 2的分界线,这种情况下,值接近-1的宝可梦都集中在绿线的左上⽅,值接近1的宝可梦都集中在绿线的右下⽅,这样的表现是蛮好的
但是上述现象只会出现在样本点⽐较集中地分布在output为-1和1的情况,如果像下图右侧所⽰,我们已经知道绿线为最好的那个model的分界线,它的左上⾓的值⼩于0,右下⾓的值⼤于0,越往右下⽅值越⼤,所以如果要考虑右下⾓这些点的话,⽤绿线对应的model,它们做Regression的时候output会是远⼤于1的,但是你做Regression的时候,实际上已经给所有的点打上了-1或1的标签(把-1或1当做“真值”),你会希望这些紫⾊点在model中的output都越接近1(接近所谓的“真值”)越好,所以这些output远⼤于1的点,它对于绿线对应的model来说是error,是不好的,所以这组样本点通过Regression训练出来的model,会是紫⾊这条分界线对应的model,因为相对于绿线,它“减⼩”了由右下⾓这些点所带来的error
Regression的output是连续性质的数值,⽽classification要求的output是离散性质的点,我们很难到⼀个Regression的function使⼤部分样本点的output都集中在某⼏个离散的点附近
因此,Regression定义model好坏的定义⽅式对classification来说是不适⽤的
注:该图为三维图像在⼆维图像上的投影,颜⾊表⽰y的⼤⼩
y =b +w ⋅1x +1w ⋅2x 2x 1x 2
b +w x +11w x =220
⽽且值得注意的是,如果是多元分类问题,把class 1的target当做是1,class 2的target当做是2,class 3的target当做是3的做法是错误的,因为当你这样做的时候,就会被Regression认为class 1和class 2的关系是⽐较接近的,class 2和class 3的关系是⽐较接近的,⽽class 1和class 3的关系是⽐较疏远的;但是当这些class之间并没有什么特殊的关系的时候,这样的标签⽤Regression是没有办法得到好的结果的(one-hot编码也许是⼀种解决⽅案?)
Ideal Alternatives
注意到Regression的output是⼀个real number,但是在classification的时候,它的output是discrete(⽤来表⽰某⼀个class)
理想的⽅法是这样的:
Function(Model)
我们要的function f(x)⾥⾯会有另外⼀个function g(x),当我们的input x输⼊后,如果g(x)>0,那f(x)的输出就是class 1,如果g(x)
<0,那f(x)的输出就是class 2,这个⽅法保证了function的output都是离散的表⽰class的数值
那之前不是说输出是1,2,3…是不⾏的吗,注意,那是针对Regression的loss function⽽⾔的,因为Regression的loss function是⽤output与“真值”的平⽅和作为评判标准的,这样输出值(3,2)与(3,1)之间显然是(3,2)关系更密切⼀些,为了解决这个问题,我们只需要重新定义⼀个loss function即可
function怎么记忆Loss function
我们可以把loss function定义成,即这个model在所有的training data上predict预测错误的次数,也就是说分类错误的次数越少,这个function表现得就越好
但是这个loss function没有办法微分,是⽆法⽤gradient descent的⽅法去解的,当然有Perceptron、SVM这些⽅法可以⽤,但这⾥先⽤另外⼀个solution来解决这个问题Solution :Generative model
概率理论解释
假设我们考虑⼀个⼆元分类的问题,我们拿到⼀个input x,想要知道这个x属于class 1或class 2的概率
实际上就是⼀个贝叶斯公式,x属于class 1的概率就等于class 1⾃⾝发⽣的概率乘上在class 1⾥取出x这种颜⾊的球的概率除以在class 1和 class 2⾥取出x这种颜⾊的球的概率(后者是全概率公式)
贝叶斯公式=单条路径概率/所有路径概率和
因此我们想要知道x属于class 1或是class 2的概率,只需要知道4个值:,我们希望从Training data 中估测出这四个值
流程图简化如下:
于是我们得到:(分母为全概率公式)
x属于Class 1的概率为第⼀条路径除以两条路径和:x属于Class 2的概率为第⼆条路径除以两条路径和:L (f )=δ(f (x )=n ∑
n  )y
^n P (C ),P (x ∣C ),P (C ),P (x ∣C )1122P (C ∣x )=1P (C )P (x ∣C )+P (C )P (x ∣C )
1122P (C )P (x ∣C )
11P (C ∣x )=
2P (C )P (x ∣C )+P (C )P (x ∣C )1122P (C )P (x ∣C )
22
这⼀整套想法叫做Generative model(⽣成模型),为什么叫它Generative model呢?因为有这个model的话,就可以拿它来generate⽣成x(如果你可以计算出每⼀个x出现的概率,就可以⽤这个distribution分布来⽣成x、sample x出来)
Prior
和这两个概率,被称为Prior,计算这两个值还是⽐较简单的
假设我们还是考虑⼆元分类问题,编号⼩于400的data⽤来Training,编号⼤于400的data⽤来testing,如果想要严谨⼀点,可以在Training data⾥⾯分⼀部分validation出来模拟testing的情况
在Training data⾥⾯,有79只⽔系宝可梦,61只⼀般系宝可梦,那么,现在的问题是,怎么得到和的值
Probability from Class
怎么得到和的值呢?假设我们的x是⼀只新来的海龟,它显然是⽔系的,但是在我们79只⽔系的宝可梦training data⾥
⾯根本就没有海龟,所以挑⼀只海龟出来的可能性根本就是0啊!所以该怎么办呢?P (C )1P (C )2P (C )=179/(79+61)=0.56P (C )=261/(79+61)=0.44
P (x ∣C )1P (x ∣C )2P (x ∣C )1P (x ∣C )2