机器学习分类的本质

引入

机器学习中,基本的任务可以分为三类:分类、回归和聚类。

分类和回归的区别在于,分类的输出是离散的,而回归的输出是连续的。聚类的任务是将数据集中的样本分成若干个类别,每个类别称为一个簇,簇内的样本相似度较高,而簇间的样本相似度较低。其中,分类和回归的任务是有监督学习,而聚类的任务是无监督学习。

分类问题

本次主要介绍分类问题,它属于监督学习的范畴。

分类的本质是学习一个分类函数,将输入空间映射到输出空间,即:f:XYf: \mathcal{X} \rightarrow \mathcal{Y},其中,X\mathcal{X}是输入空间,Y\mathcal{Y}是输出空间。

一般来说,输入空间是由特征向量构成的,即:X=Rn\mathcal{X} = \mathbb{R}^n,输出空间是离散的,即:Y={c1,c2,,ck}\mathcal{Y} = \{c_1, c_2, \cdots, c_k\},其中,cic_i是类别标签。

特征向量是由特征构成的,就是对样本的描述,是样本的某个属性。

这里面就可以构建给出两个特征向量:

(5.1,3.5,1.4,0.2)、(4.9,3,1.4,0.2)


特征的选择对分类的性能有很大的影响,特征的选择应该具有以下几个特点:

  1. 特征应该能够很好地区分不同类别的样本。

  2. 特征应该具有可解释性,即:特征应该能够很好地解释样本的类别。

  3. 特征应该具有鲁棒性。(泛化能力)

  4. 特征应该具有可扩展性,能够很好地扩展到新的样本。

  5. 特征应该具有可计算性。

  6. 特征应该具有低维性。


输出空间是离散的,即:Y={c1,c2,,ck}\mathcal{Y} = \{c_1, c_2, \cdots, c_k\},其中,cic_i是类别标签。

在我接触的的深度学习分类中,一般将输出空间定义为独热编码(One-Hot Encoding)的形式,即:Y={[1,0,,0],[0,1,,0],,[0,0,,1]}\mathcal{Y} = \{[1, 0, \cdots, 0], [0, 1, \cdots, 0], \cdots, [0, 0, \cdots, 1]\},其中,[1,0,,0][1, 0, \cdots, 0]表示类别c1c_1[0,1,,0][0, 1, \cdots, 0]表示类别c2c_2,以此类推。


独热编码是一种常用的编码方式,它将离散的类别标签转换为离散的向量,其中,向量的维度等于类别的个数,向量的值等于类别的索引。独热编码的好处是,它能够很好地表示类别之间的关系,而且它的值是离散的,不会产生类别之间的大小关系。


通常机器学习中输出的结果一般不是只有0和1,而是在0~1之间的小数,这个小数表示样本属于某个类别的概率,即:P(Y=ciX)P(Y=c_i|X),其中,cic_i是类别标签,XX是特征向量。

分类的方法

分类的方法主要分为两类:生成方法和判别方法。

生成方法

生成方法是通过学习联合概率分布P(X,Y)P(X, Y)来进行分类的,即:P(YX)=P(X,Y)P(X)P(Y|X) = \frac{P(X, Y)}{P(X)},其中,P(YX)P(Y|X)是后验概率,P(X)P(X)是先验概率,P(X,Y)P(X, Y)是联合概率分布。

朴素贝叶斯

朴素贝叶斯是一种生成方法,它假设特征之间相互独立,即:P(XY)=i=1nP(xiY)P(X|Y) = \prod_{i=1}^n P(x_i|Y),其中,xix_i是特征向量的第ii个特征。

例子:假设有一个数据集,其中,每个样本有两个特征,分别是x1x_1x2x_2,它们的取值都是离散的,分别是{a,b,c}\{a, b, c\}{1,2,3}\{1, 2, 3\},类别标签是{0,1}\{0, 1\},那么,朴素贝叶斯的联合概率分布可以表示为:P(X,Y)=P(x1,x2,Y)=P(x1Y)P(x2Y)P(Y)P(X, Y) = P(x_1, x_2, Y) = P(x_1|Y)P(x_2|Y)P(Y),其中,P(x1Y)P(x_1|Y)P(x2Y)P(x_2|Y)可以通过统计样本的频率来计算,P(Y)P(Y)可以通过统计样本的频率来计算。

朴素贝叶斯的优点是:它的学习和预测的效率都很高,而且它的结果具有很好的解释性。
朴素贝叶斯的缺点是:它的假设过于简单,导致它的泛化能力不够强。

高斯贝叶斯

高斯贝叶斯是一种生成方法,它假设特征的条件概率服从高斯分布,即:P(XY)N(μ,σ2)P(X|Y) \sim \mathcal{N}(\mu, \sigma^2),其中,μ\mu是均值,σ2\sigma^2是方差。然后,利用贝叶斯公式,计算后验概率,从而进行分类。

例子:假设有一个数据集,其中,每个样本有两个特征,分别是x1x_1x2x_2,它们的取值都是连续的,那么,高斯判别分析的条件概率可以表示为:P(XY)=P(x1,x2Y)=P(x1Y)P(x2Y)P(X|Y) = P(x_1, x_2|Y) = P(x_1|Y)P(x_2|Y),其中,P(x1Y)P(x_1|Y)P(x2Y)P(x_2|Y)可以通过统计样本的均值和方差来计算。

高斯判别分析的优点是:它的假设比较合理,而且它的泛化能力比较强。
高斯判别分析的缺点是:它的计算量比较大,而且它的结果具有一定的误差。

伯努利贝叶斯

伯努利贝叶斯是一种生成方法,它假设特征的条件概率服从伯努利分布,即:P(XY)B(p)P(X|Y) \sim \mathcal{B}(p),其中,pp是概率。然后,利用贝叶斯公式,计算后验概率,从而进行分类。


!大同小异!!

朴素贝叶斯、高斯贝叶斯和伯努利贝叶斯都是生成方法,它们的区别在于它们对条件概率的分布的假设不同,朴素贝叶斯假设条件概率服从多项式分布,高斯贝叶斯假设条件概率服从高斯分布,伯努利贝叶斯假设条件概率服从伯努利分布。


判别方法

判别方法是通过学习决策函数f(X)f(X)或者条件概率分布P(YX)P(Y|X)来进行分类的,即:Y=f(X)Y = f(X)或者P(YX)P(Y|X)

K近邻

K近邻是一种判别方法,它的思想是:如果一个样本的近邻中大多数样本属于某个类别,那么该样本也属于该类别。K近邻的K是一个超参数,它决定了近邻的个数。K近邻的算法如下:

  1. 计算测试样本与训练样本的距离: d = sqrt((x1-x2)^2 + (y1-y2)^2) (欧几里得距离,也可能使用其他距离:曼哈顿距离、切比雪夫距离等)

曼哈顿距离: d = |x1-x2| + |y1-y2|,切比雪夫距离: d = max(|x1-x2|, |y1-y2|)

  1. 选取距离最近的K个训练样本: d1, d2, ..., dk

  2. 统计K个训练样本中各个类别的数量: c1, c2, ..., ck

  3. 选取数量最多的类别作为测试样本的类别

决策树

决策树是一种判别方法,它的思想是:通过一系列的问题,将样本分到不同的类别中。决策树的算法如下:

  1. 选择一个特征,将样本分成不同的类别 : xi<tx_i < t,则为左子树,否则为右子树

  2. 对每个类别,重复步骤1,直到所有的样本都被正确地分类 : xi<tx_i < t,则为左子树,否则为右子树

  3. 反复寻找,简化决策树

例子:假设有一个数据集,其中,每个样本有两个特征,分别是x1x_1x2x_2,它们的取值都是连续的,那么,决策树可以表示为:x1<t1x_1 < t_1,则为左子树,否则为右子树,其中,t1t_1可以通过决策树的算法计算得到。同理,对于左子树,可以继续选择一个特征,将样本分成不同的类别,直到所有的样本都被正确地分类。

随机森林

随机森林是一种集成方法,它的思想是:通过多棵决策树,将样本分到不同的类别中。随机森林的算法如下:

  1. 从样本集中随机选择k个样本,作为训练样本

  2. 从特征集中随机选择m个特征,作为训练特征

  3. 通过决策树的算法,训练一棵决策树

  4. 重复1-3步骤,训练多棵决策树

  5. 对于新的样本,通过多棵决策树进行分类,选择票数最多的类别作为测试样本的类别

支持向量机

支持向量机是一种判别方法,它的思想是:找到一个超平面,使得它能够将不同类别的样本分开,而且它离两个类别的样本都有一定的距离。支持向量机的算法如下:

  1. 选择一个核函数,将样本映射到高维空间: xϕ(x)x \rightarrow \phi(x) 核函数:线性函数、多项式函数、高斯核函数等

  2. 在高维空间中找到一个超平面,使得它能够将不同类别的样本分开,而且它离两个类别的样本都有一定的距离: wTϕ(x)+b=0w^T\phi(x) + b = 0

  3. 将超平面映射回原始空间: wTϕ(x)+b=0wTx+b=0w^T\phi(x) + b = 0 \rightarrow w^Tx + b = 0

  4. 利用超平面对新的样本进行分类: wTx+b>0w^Tx + b > 0,则为正类,否则为负类

例子:假设有一个数据集,其中,每个样本有两个特征,分别是x1x_1x2x_2,它们的取值都是连续的,那么,支持向量机的超平面可以表示为:w1x1+w2x2+b=0w_1x_1 + w_2x_2 + b = 0,其中,w1w_1w2w_2可以通过支持向量机的算法计算得到,bb可以通过统计样本的均值和方差来计算。大于0的样本属于正类,小于0的样本属于负类。

神经网络

神经网络是一种判别方法,它的思想是:通过多层的神经元,将样本分到不同的类别中。神经网络的算法如下:

  1. 初始化神经网络的权重和偏置: wb

  2. 通过前向传播计算每个神经元的输出: z = w * x + ba = sigmoid(z),其中x是输入,a是输出

  3. 通过反向传播计算每个神经元的梯度: dwdb

  4. 通过梯度下降更新神经网络的权重和偏置: w = w - lr * dwb = b - lr * db

  5. 重复2-4步骤,直到收敛: loss = -y * log(a) - (1 - y) * log(1 - a)(二元交叉熵的损失函数,BCCE)

例子:假设有一个数据集,其中,每个样本有两个特征,分别是x1x_1x2x_2,它们的取值都是连续的,那么,神经网络的输出可以表示为:a=sigmoid(w1x1+w2x2+b)a = sigmoid(w_1x_1 + w_2x_2 + b),其中,w1w_1w2w_2可以通过神经网络的算法计算得到,bb可以通过统计样本的均值和方差来计算。大于0.5的样本属于正类,小于0.5的样本属于负类。

判别方法的共同点

判别方法的共同点是:它们都是通过一些参数,将样本分到不同的类别中。例如:k近邻通过选择k个最近的样本,将样本分到不同的类别中;决策树通过选择特征,将样本分到不同的类别中;随机森林通过选择特征和样本,将样本分到不同的类别中;支持向量机通过选择超平面,将样本分到不同的类别中;神经网络通过选择权重和偏置,将样本分到不同的类别中。