判别模型vs生成模型
条件概率分布p(y|x)
从概率的角度来看监督学习的话,其实就是从数据集中学习条件概率分布p(y|x)。其中, x∈Rn 表示n维数据特征, y∈R 表示数据对应的类别标签。给定一个x,模型计算出x属于各个类别标签y的概率p(y|x),然后判定x的预测标签为p(y|x)最大的y标签。
比如,现在的一个问题为判定一个动物是汪星人还是喵星人。这个问题可以表示为x=[叫声,食物,毛的颜色],y=[汪星人,喵星人]。监督学习就是去比较p(y=汪星人|x) 和p(y=喵星人|x)的概率谁大,预测给定的动物为概率较大的动物。
判别模型(discriminative model) vs 生成模型(generative model)
监督学习中估计p(y|x)的方法分为两种:判别方法和生成方法,其对应的就是判别模型和生成模型。
判别模型:基于给定的数据集,直接计算p(y|x),形象的说就是直接学习找到一条决策边界,判别数据的类别标签,在决策边界一侧的是类别0,在另外一侧的是类别1。形象的描述可以使用下图表示:给定一堆的蓝色和红色的点,监督学习通过不断的学习找到了一条直线,这条直线尽可能的将不同颜色的点划分开来。当给定了一个新的点,如果这个条落在直线的上方,则判定为红色,否则为蓝色。
考虑上述所说的判定动物为猫还是狗的问题,用判别模型解决就是,通过观察这个动物的叫声、食物和毛的颜色特征,来直接判定这个动物是属于汪星人还是汪星人。常见的判别模型有KNN,决策树,PLA等。
生成模型 :基于给定的数据集,首先要学习得到其联合概率分布p(x,y)和p(x),再通过等式 p(y|x)=p(x,y)p(x)=p(x|y)p(y)p(x) 来计算p(y|x)。考虑上述所说的判定动物为喵星人还是汪星人的问题,用判生成解决就是,给定一堆的喵星人和汪星人,我们可以很容易得到 p(y=喵星人)=喵星人的个数总个数 和 p(y=汪星人)=汪星人的个数总个数 ,然后我们还需要观察喵星人有什么特征 p(x|y=喵星人) 和汪星人有什么特征 p(x|y=汪星人) 。比如喵星人吃鱼,“喵喵喵”的叫;汪星人吃骨头,“汪汪汪”的叫。当判定一个新动物的时候,去观察这个新动物的特征更像汪星人 p(y=汪星人|x) 还是猫星人 p(y=喵星人|x) 。
在生成模型中,我们还需要对 p(x) 建模,如果有大量数据的话,可以较准确的衡量 P(x) ,但是如果数据量较少就会导致偏差。不过,如果数据集固定,那么对于任意的类别标签 p(x) 都是一个定值 p(x)=p(x|y=1)p(y)+p(x|y=0)p(y=0) ,因此我们可以直接通过 p(y|x)∝p(x|y)p(y) 来衡量。
生成模型中常见的有:NB,HMM等。
判别模型和生成模型的优缺点
判别模型:
- 缺点:判别模型直接学习
P(y|x)
,即找到一条判别边界,使得不同类别之间的划分距离尽可能大,并不关心数据本身的特征
p(x)
,因此无法反应数据的特性。
- 但是正是由于判别模型不关心
p(x)
,直接有数据集学习判定预测数据的类别,因此减少了计算,模型简单。
生成模型:
- 缺点:与判别模型相反,生成模型因为考虑了
p(x,y)和P(x)
,导致了模型复杂度增加,而且由于
P(x)
会引来偏差,降低预测准确率。
- 优点: 生成模型可以学习到数据本身的特征,并且可以将学习到的特征,应用到其他判别问题上。如果估计的问题并不是数据所属的类别y,而是某个隐藏的特性z,生成模型就可以估计出隐藏变量z的分布,判别模型就无法做到:
p(y|x)p(x)=p(x)p(z|x)p(y|z)