第七章 分类

1 分类算法概要

分类

  • 根据预测类别的数目
    • 二分类:预测样本属于两个类别中的其中一个
    • 多分类:预测样本属于两个以上类别中的其中一个
    • 多标签分类:为每个样本预测一个或多个类别
  • 根据理论基础
    • 基于统计学原理:朴素贝叶斯、Logistic回归
    • 基于机器学习算法:K-近邻、决策树、支持向量机SVM
    • 基于深度学习:神经网络

评价指标

  • 混淆矩阵(误差矩阵)

    from sklearn.metrics import confusion_matrix

    预测正类 预测负类
    真实正类 真正TP 假负FN 召回率TPTP+FN\cfrac{TP}{TP+FN}TP+FNTP
    真实负类 假正FP 真负TN 特异度TNTN+FP\cfrac{TN}{TN+FP}TN+FPTN
    精确率TPTP+FP\cfrac{TP}{TP+FP}TP+FPTP 阴性预测率TNTN+FN\cfrac{TN}{TN+FN}TN+FNTN 准确率TP+TNTP+TN+FP+FN\cfrac{TP+TN}{TP+TN+FP+FN}TP+TN+FP+FNTP+TN
    • 准确率:不同类别的训练样本数差别很大时,准确率不能作为很好的指标来衡量预测性能

      from sklearn.metrics import accuracy_score

    • 精确率(查准率):适用于希望使模型的预测结果尽可能不出错的场景

      from sklearn.metrics import precision_score

    • 召回率(查全率、灵敏度):衡量了模型将所有正样本成功识别出的比例,适用于希望尽可能全地预测出正样本的场景

      from sklearn.metrics import recall_score

    • 特异性(真负率):模型在所有真实负样本中成功预测出的比例

    • F1得分:适用于数据集类别分布不平衡的分类任务

      from sklearn.metrics import f1_score

      F1=2Precision×RecallPrecision+Recall F_1=\cfrac{2 Precision \times Recall}{Precision + Recall} F1=Precision+Recall2Precision×Recall

    • ROC曲线:通过改变分类阈值来展示分类器效果的曲线(横轴:假正率,纵轴:真正率)

    • AUC:ROC曲线下与坐标轴围成的面积,取值范围在0到1之间。AUC=0.5时,预测准确率接近随机猜测;ROC曲线越靠近左上角,AUC越接近1,分类模型预测效果越好

    • 马修斯相关系数MCC:适用于不平衡数据集的模型评价
      MCC=TP×TN−FP×FN(TP+FP)(TP+FN)(TN+FP)(TN+FN) MCC=\cfrac{TP \times TN-FP \times FN}{\sqrt{(TP+FP)(TP+FN)(TN+FP)(TN+FN)}} MCC=(TP+FP)(TP+FN)(TN+FP)(TN+FN) TP×TNFP×FN


2 K-近邻

from sklearn.neighbors import KNeighborsClassifier

适用于对数据的分布只有很少甚至没有任何先验知识的情况

算法步骤

  1. 数据标准化处理

    from skleran.preprocessing import StandardScaler

  2. 基于距离公式计算待预测样本与每个训练样本之间的距离{d1,d2,⋯ ,dn}\{d_1,d_2,\cdots,d_n \}{d1,d2,,dn}

  3. 对距离{d1,d2,⋯ ,dn}\{d_1,d_2,\cdots,d_n \}{d1,d2,,dn}进行升序排序

  4. 筛选出与该测试样本距离最近的K个训练样本

    K值的确定:

    通常K的取值一般不超过20,或低于训练样本数N的平方根

  5. 将K个样本所属类别的频数与权重函数相乘,将乘积最高的类别输出为测试样本的类别

    权重函数:

    • K个最近邻样本对最终决策的影响是相同的
      f^(xq)=∑i=1Kf(xi) \hat{f}(x_q)=\sum_{i=1}^K{f(x_i)} f^(xq)=i=1Kf(xi)

    • 距离越近的最近邻样本对最终决策的影响越大,距离越远的样本影响越小
      f^(xq)=∑i=1Kwif(xi)∑i=1Kwiwi=1d(xq,xi) \hat{f}(x_q)=\cfrac{\sum_{i=1}^K{w_i f(x_i)}}{\sum_{i=1}^K{w_i}}\\ w_i=\cfrac{1}{d(x_q,x_i)} f^(xq)=i=1Kwii=1Kwif(xi)wi=d(xq,xi)1


3 朴素贝叶斯

from sklearn import naive_bayes

首先需要确定每个类别的先验概率,再计算给定样本属于每个类别的后验概率

分类

类别 特点 Python库
高斯朴素贝叶斯分类器 适用于连续型数据 from sklearn.naive_bayes import GaussianNB
多项式朴素贝叶斯分类器 适用于文本问题 from sklearn.naive_bayes import MultinomialNB
伯努利朴素贝叶斯分类器 适用于二值型问题 from sklearn.naive_bayes import BernoulliNB
补充朴素贝叶斯分类器 适用于不平衡数据集的分类任务 from sklearn.naive_bayes import ComplementNB
类别朴素贝叶斯分类器 适用于离散型数据 from sklearn.naive_bayes import CategoricalNB

独立性假设

朴素贝叶斯分类对特征条件概率分布P(x∣c)P(x|c)P(xc)做了条件独立性假设
P(x∣c)=∏i=1mP(xi∣c) P(x|c)=\prod_{i=1}^m{P(x_i|c)} P(xc)=i=1mP(xic)

算法步骤

  1. 对所有类别c∈Cc \in CcC,计算类别的先验概率P(c)=∣Dc∣∣D∣P(c)=\cfrac{|D_c|}{|D|}P(c)=DDc∣D∣|D|D∣Dc∣|D_c|Dc分别表示数据集D,DcD,D_cDDc的样本数量
  2. 估计每个特征xi∈Xx_i \in XxiX的对应的条件概率P(xi∣c)=∣Dc,xi∣∣Dc∣P(x_i|c)=\cfrac{|D_{c,x_i}|}{|D_c|}P(xic)=DcDc,xiDc,xiD_{c,x_i}Dc,xi表示DcD_cDc中第iii个特征取值为xix_ixi的样本集合
  3. 计算待分类样本属于各类别的后验概率,将最大后验概率对应的类别arg⁡max⁡P(c)∏i=1mP(xi∣c)\arg\max {P(c)\prod_{i=1}^m{P(x_i|c)}}argmaxP(c)i=1mP(xic),作为预测结果

零频现象的拉普拉斯修正

在朴素贝叶斯分类中,当某个特征值在训练集中没有与某个类同时出现过时,分类器会出现“零频现象”,导致条件概率为零

先验概率和条件概率分别修正为
P^(c)=∣Dc∣+1∣D∣+NP^(xi∣c)=∣Dc,xi∣+1∣Dc∣+N \hat{P}(c)=\cfrac{|D_c|+1}{|D|+N}\\ \hat{P}(x_i|c)=\cfrac{|D_{c,x_i}|+1}{|D_c|+N} P^(c)=D+NDc+1P^(xic)=Dc+NDc,xi+1

算法评价

实现相对简单,适合处理大规模数据集

对缺失数据不太敏感

在实际应用时需要检查数据是否符合独立性假设


4 决策树

from sklearn.tree import DecisionTreeClassifier

绘制决策树:from sklearn.tree import plot_tree

网格搜索寻找最佳参数组合:from sklearn.model_selection import GridSearchCV

关键步骤

  1. 特征选择:通常选择使数据集纯度最高的特征为最优特征,并据其把数据分割成不同子集

    纯度:

    表示数据集中样本的一致程度。纯度越高,说明数据集中的样本属于同一类别的可能性更大

    度量数据集纯度的方法:

    • **信息增益:**ID3算法
      Gain(D∣A)=H(D)−H(D∣A) Gain(D|A)=H(D)-H(D|A) Gain(DA)=H(D)H(DA)
      其中,信息熵:H(D)=∑k=1K∣Ck∣∣D∣log⁡2∣Ck∣∣D∣H(D)=\sum_{k=1}^K{\cfrac{|C_k|}{|D|}\log_2{\cfrac{|C_k|}{|D|}}}H(D)=k=1KDCklog2DCk,条件熵:H(D∣A)=∑i=1d∣Di∣∣D∣H(Di)H(D|A)=\sum_{i=1}^d{\cfrac{|D_i|}{|D|}H(D_i)}H(DA)=i=1dDDiH(Di)

      存在一个内生性的偏置,它更倾向于选择具有较多取值的特征作为划分依据

    • **信息增益率:**C4.5算法
      GainRatio(D∣A)=Gain(D∣A)HA(D) GainRatio(D|A)=\cfrac{Gain(D|A)}{H_A(D)} GainRatio(DA)=HA(D)Gain(DA)
      其中,HA(D)=−∑i=1d∣Dj∣∣D∣log⁡2∣Dj∣∣D∣H_A(D)=-\sum_{i=1}^d{\cfrac{|D_j|}{|D|}\log_2{\cfrac{|D_j|}{|D|}}}HA(D)=i=1dDDjlog2DDjddd为特征AAA取值的个数

      对特征不同取值过多的情况起到惩罚作用

    • **基尼系数:**CART算法

      假设数据集DDDKKK个不同类别,pkp_kpk是样本数据第kkk类的概率,则其基尼系数为
      Gini(D)=∑k=1Kpk×(1−pk)=1−∑k=1Kpk2 Gini(D)=\sum_{k=1}^K{p_k \times (1-p_k)}=1-\sum_{k=1}^K{p_k^2} Gini(D)=k=1Kpk×(1pk)=1k=1Kpk2
      如果DDD根据特征AAA是否取某一可能值aaa被分割成D1D_1D1D2D_2D2两部分,则在AAA条件下,数据集DDD的基尼系数为
      Gini(D,A)=∣D1∣∣D∣Gini(D1)+∣D2∣∣D∣Gini(D2) Gini(D,A)=\cfrac{|D_1|}{|D|}{Gini(D_1)}+\cfrac{|D_2|}{|D|}{Gini(D_2)} Gini(D,A)=DD1Gini(D1)+DD2Gini(D2)
      选择基尼系数最小的结点来进行数据划分

  2. 决策树生成:递归选择最优特征对训练数据进行分割

    递归终止条件:

    • 所有训练数据子集基本被正确分类
    • 决策树的高度到达制定阈值
    • 没有适合的特征继续划分
  3. 剪枝:预剪枝和后剪枝

    悲观错误剪枝:后剪枝(C4.5)

    代价复杂度剪枝:后剪枝(CART)

算法对比

算法 树结构 划分标准 剪枝
ID3 多叉树 信息增益 不剪枝
C4.5 多叉树 信息增益率 悲观误差剪枝
CART 二叉树 基尼系数 代价复杂度剪枝

5 Logistic回归

from sklearn.linear_model import LogisticRegression

事件优势比

事件的优势比Odds ratio为事件发生的概率与事件不发生的概率的比值
odds=p1−p odds=\cfrac{p}{1-p} odds=1pp
每个特征的事件优势比表示在其他特征保持不变的情况下,该特征变化对事件发生几率的影响

优势比为1,表示该特征对事件发生无影响;大于1,表示正向影响;小于1,表示负向影响

例如:特征的事件优势比为2,则在其他特征不变的情况下,该特征每增加一个单位,事件几率将增加两倍

OvR和OvO

Logistic回归可以完成二分类问题,但在实际应用中,有许多问题需要对多个类别进行分类

  • OvR:对于具有N个类别的问题,将其转化为N个二元分类问题。在预测阶段,使用N个分类器分别进行预测,将置信度(在Logistic回归中,p值可作为置信度)最高的类别作为最终的预测结果
  • OvO:对于具有N个类别的问题,将其转化为CN2C_N^2CN2个二元分类问题,换言之,需要针对“每对”类别训练一个分类器。在预测阶段,通过对所有分类器的结果进行投票或应用其他决策规则来确定最终的预测结果

算法评价

对非线性关系的建模能力相对较弱、对多重共线性敏感


6 支持向量机SVM

from sklearn.svm import SVC

通过在特征空间中找到一个最大间隔超平面来划分不同类别的数据进而实现分类

SVM可以通过核函数将数据映射到高维空间以解决非线性分类问题

分类

  • 线性可分SVM:找到一个平面,完全分开正负样本

  • 线性SVM:不需要完全分开正负样本,引入松弛变量,容忍一些分类错误

  • 非线性SVM:对于分线性可分数据集,引入核函数将数据映射到高维空间,使其在高维空间中线性可分

    核函数:

    用于测量两个样本在高维特征空间中的相似性的函数

    常用核函数:

    • 线性核:不能解决非线性问题,在使用时无须指定参数
      K(xi,xj)=xiTxj K(x_i,x_j)=x_i^Tx_j K(xi,xj)=xiTxj

    • 多项式核:计算复杂度较高,需要设置的参数较多
      K(xi,xj)=(γxiTxj+c)d,γ>0,d≥1 K(x_i,x_j)=(\gamma x_i^Tx_j+c)^d,\gamma>0,d\ge1 K(xi,xj)=(γxiTxj+c)d,γ>0,d1

    • 高斯核(径向基函数)RBF:计算复杂度高,需要设置参数γ\gammaγγ>0\gamma>0γ>0
      K(xi,xj)=exp⁡(−γ∥xi−xj∥2),γ>0 K(x_i,x_j)=\exp{(-\gamma \parallel x_i-x_j \parallel^2)},\gamma>0 K(xi,xj)=exp(γxixj2),γ>0

    • Sigmoid核:不能处理多分类问题
      K(xi,xj)=σ(γxi⋅xj+θ)d K(x_i,x_j)=\sigma(\gamma x_i \cdot x_j+\theta)^d K(xi,xj)=σ(γxixj+θ)d

算法评价

在高维空间下有出色的性能表现,尤其适用于小样本和高维问题

计算复杂度较高,尤其在数据集上训练时,模型参数调优相对困难,且对噪声较为敏感


7 人工神经网络ANN

from keras.models import Sequential

from keras.models import Dense,Activation

  1. 调用Sequential构建模型
  2. 使用Dense层添加隐藏层
  • units参数代表隐藏层中神经元的数量
  • activation参数代表激活函数
  • input_dim参数代表输入数据的维数
  1. 使用compile方法编译模型
  • loss参数代表损失函数
  • optimizer参数代表优化器
  • metrics参数代表评估指标
  1. 使用fit方法训练模型

感知机Perceptron

一种线性二元分类器,它对输入特征进行线性组合并通过一个阈值函数来对输入样本进行分类

感知机的输入输出关系:
y=f(∑i=1nwixi−b)f(u)={1,u≥0−1,u<0 y=f(\sum_{i=1}^n{\boldsymbol{w_ix_i}-b})\\ f(u)=\left\{\begin{matrix}1, & u\ge0 \\-1, & u<0 \end{matrix}\right. y=f(i=1nwixib)f(u)={1,1,u0u<0
感知机模型的训练步骤:

  1. 随机初始化权重向量w(0)\boldsymbol{w}^{(0)}w(0)和偏置项bbb
  2. 对于训练集DDD中的每一个样本xi\boldsymbol{x_i}xi,计算感知机对该样本的预测值yiy_iyi
  3. 将感知机的预测值与真实值tit_iti进行比较,计算误差ti−yit_i-y_itiyi
  4. 根据wi:=wi+λ(ti−yi)xi\boldsymbol{w_i}:=\boldsymbol{w_i}+\lambda(t_i-y_i)\boldsymbol{x_i}wi:=wi+λ(tiyi)xi更新权重和偏置,使误差逐渐减小,λ\lambdaλ表示学习率
  5. 重复步骤2到步骤4,直到达到预定的最大迭代次数TTT或误差小于阈值

感知机的不足:

无法实现“异或”逻辑关系

多层感知机MLP

由多个神经元层组成,包括输入层、至少一个或多个隐藏层和输出层

隐藏层的作用:

隐藏层的主要作用是将样本从输入空间非线性映射到隐空间,进而实现特征提取和表示学习,以便更好捕捉输入数据的复杂性和模式

多层感知机的激活函数

激活函数:一种非线性函数,其作用是对输入信息进行非线性转化,以增强网络的非线性能力

神经网络算法中常见的激活函数
类型 激活函数 说明
Sigmoid f(x)=11+e−xf(x)=\cfrac{1}{1+e^{-x}}f(x)=1+ex1 输入较大或者较小时梯度非常小,权重迭代变化极小,不适用于深层神经网络的训练
Swish f(x)=x⋅sigmoid(x)f(x)=x \cdot sigmoid(x)f(x)=xsigmoid(x) 避免了Sigmoid函数的梯度消失问题
Tanh f(x)=ex−e−xex+e−xf(x)=\cfrac{e^x-e^{-x}}{e^x+e^{-x}}f(x)=ex+exexex
ReLU f(x)=max⁡(0,x)f(x)=\max{(0,x)}f(x)=max(0,x) 计算速度快,但在负数输入时会输出零,可能导致“神经元死亡”问题
Leaky ReLU f(x)=max⁡(αx,x)f(x)=\max{(\alpha x,x)}f(x)=max(αx,x) α\alphaα是一个小的常数,避免ReLU函数负数输入时输出零的问题
ELU f(x)={x,x>0α(ex−1),x≤0f(x)=\left\{\begin{matrix} x, & x>0 \\ \alpha(e^x-1), & x \le 0 \end{matrix}\right.f(x)={x,α(ex1),x>0x0 α\alphaα是一个较大的常数,避免ReLU函数负数输入时输出零的问题
GELU f(x)=0.5x(1+tanh⁡(2/π(x+0.044715x3)))f(x)=0.5x(1+\tanh{(\sqrt{2/\pi}(x+0.044715x^3))})f(x)=0.5x(1+tanh(2/π (x+0.044715x3))) Transformer等模型通常使用该激活函数

误差反向传播算法BP

一种用于训练神经网络的常见优化算法,其主要目标是通过梯度下降法调整神经网络中的参数来最小化神经网络在训练数据上的预测误差

参数更新:

  • 输出层:
    wji:=wji+ηδjxjiδj=(ti−yi)yj(1−yj) w_{ji}:=w_{ji}+\eta \delta_jx_{ji}\\ \delta_j=(t_i-y_i)y_j(1-y_j) wji:=wji+ηδjxjiδj=(tiyi)yj(1yj)

  • 隐藏层:
    wji:=wji+ηδjxjiδj=aj(1−aj)∑p∈D(j)δpwpj w_{ji}:=w_{ji}+\eta \delta_jx_{ji}\\ \delta_j=a_j(1-a_j)\sum_{p \in D(j)}{\delta_p w_{pj}} wji:=wji+ηδjxjiδj=aj(1aj)pD(j)δpwpj

深度神经网络

  • 卷积神经网络CNN
  • 循环神经网络RNN
  • 递归神经网络RecNN
  • 生成对抗网络GAN
  • 自动编码器Autoencoders
  • 长短时记忆网络LSTM
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐