分类(Classification)
与回归问题不同,分类问题不需要输出具体的预测的值,只需要输出所输入的数据属于哪个类别。在医疗诊断、手写文字识别、金融贷款和人脸识别等领域有着广泛应用。
那么要如何进行分类呢?首先要收集数据,尽可能地收集每个类别上的数据。要注意,分类问题并不能使用回归的方法来做,回归对于分类器f好坏的定义与分类中不同,回归会受到大数值的数据影响,使分类器向大数值方向偏转而忽略了在分类器周围的数据。
对于二元分类问题,需要找到一个f,将数据x输入,根据输出来判断是属于类别1还是类别2。定义损失函数:统计分类器f在训练集上判断错误的次数,找到好的f的方法有:支持向量机(Support Vector Mechine)和感知机(Perceptron)。
李宏毅老师首先引入了生成(Generative)模型算法,假设出现的数据都服从某一概率分布,即训练集中的数据都是从某一个高斯分布中抽取出来的,要用训练集中的数据分布来估计出该高斯分布中的μ和Σ。要注意的是,所有的高斯分布都能从中抽取出训练集中的这些数据,有区别的是不同高斯分布抽取出这些数据的概率不同,而我们的目标就是找到一个高斯分布,从这个高斯分布中抽取出训练集中的这些数据的概率最大。输入x后,这个高斯分布会输出从中抽取出这个x的概率,越靠近中心点的概率越大。
极大似然估计(Maximum Likelihood)
高斯分布中的参数有μ和Σ,只需要有μ和Σ,就可以输出抽取出输入x的概率。假设数据集中一共有n个数据项,评判高斯分布的函数即为
挑选出的概率 * 挑选出的概率 * ..... *挑选出的概率
式中的L指的是Likelihood,可能性,而不是回归中的损失函数L。我们希望找到能使L值最大的μ*和Σ*。
在极大似然估计中,
,
分布计算类别c1和类别c2的μ*和Σ*,这样就可以利用高斯分布计算p(x|c1)和p(x|c2),运用贝叶斯公式,就可以计算出p(c1|x),即输入一个x,这个x的类别是c1的概率,如果这个概率>0.5,则属于类别c1,否则属于类别c2。
尝试后发现准确率很低,甚至不如随机分类器,将所有的特征都加入,准确率并没有得到较大提升。原因可能是由于每个类别都要计算一次Σ,而Σ会随着特征的增加而宽高增加,模型会很复杂,计算量很大,容易出现过拟合现象。尝试每个类别共用一个Σ,即每个类别的高斯分布只是μ不相同,共享同一个Σ。
方法是先计算出每个类别的Σ,在二元分类中就是
所以共享的Σ就是所有类别的Σ的平均值。共用Σ以后代入所有的特征进行训练,准确率得到较大提升。同时看到共用Σ后,类别间的分界线(p>0.5?)是线性的。
这个方法称为朴素贝叶斯模型(Naive Bayesian Model),要使用朴素贝叶斯,就要假设训练数据服从某一概率分布(如高斯分布,伯努利分布等),和每个维度相互独立。如果该假设不成立,使用朴素贝叶斯的话就会产生较大的偏差。
逻辑回归(Logistic Regression)
在上述的共用一个Σ方法中,得到的分界线是线性的,经过数学推导,贝叶斯公式可以转化为
其中,,x是输入的数据,w和b是参数,可以通过上述的算出。那么可不可以直接在训练集上训练出来w和b,而不是通过计算μ和Σ这样绕一圈呢?方法就是逻辑回归,同时也称为判别(Discriminative)模型。
首先要确定决定一组参数w和b好坏的函数,定义为
其中x1和x2是属于这组w和b所表示的类别,而x3属于另外一个类别。需要找到一组w*和b*,使得上式计算出来的概率最大。为了统一每一数据项的写法,将其中一个类别的设为1,另一个设为0,同时再取负自然对数:
相当于两个伯努利分布和计算交叉熵(Cross Entropy),两个分布越接近,输出就越接近0。不能使用回归中的平方差之和来计算损失,平方差之和在分类问题中不论是在目标点近还是远的地方,产生的梯度都非常小,训练需要很多次迭代,参数更新速度很慢。
所以参数的更新就为
判别模型与生成模型的对比
判别模型是直接从训练集中训练出w和b,而生成模型是先要计算出每一个类别的μ和共享的Σ,在计算出w和b,而且这两组w和b是不一样的。判别模型中没有做假设,而生成模型中做了诸多假设,如维度是否独立和是否是高斯分布。判别模型通常优于生成模型,生成模型中做了假设使得分类器获得了意料之外的特点。但是判别模型对数据量的需求很大,而生成模型正好相反,在数据量较小时,做了诸多假设的生成模型可能会更好,并且能忽视掉标签错误的数据。
多分类问题
首先利用逻辑回归计算每个类别的w和b,对于输入x,将x代入每个类别的y值,再将每个类别的y代入softmax中计算,softmax的输出都为正,而且和为1,每一个类别的输出可以看做是属于每个类的概率。评价w和b的好坏同样也是用交叉熵算法。
逻辑回归的限制
因为逻辑回归产生的是一个线性分类器,在数据集是线性不可分的情况下无法发挥作用,可以进行特征转化,将每个点变化位置变得线性可分,但是通常很难找到一个转化方式。最好是让机器自己来寻找一个正确的转化方式,即先用多组w和b将每个特征变成线性可分,在用一组或多组w和b进行分类。