机器学习(五)常用分类模型(K最近邻、朴素贝叶斯、决策树)和分类评价指标

文章目录

  • 机器学习(五)常用分类模型(K最近邻、朴素贝叶斯、决策树)和分类评价指标
    • 综述
    • 常用分类模型
      • K最近邻模型
      • 朴素贝叶斯模型
      • 决策树
    • 常用分类指标
      • 准确率、精确率和召回率
      • ROC曲线和AUC
    • 小结

综述

在上一篇博文中,我介绍了一个非常经典的分类模型——逻辑回归,在这篇博文中,我将着重讨论以下两个问题:

  • 除了逻辑回归之外,还有哪些分类模型呢?
  • 我如何评价我的建立的分类预测模型好不好呢?

接下来,就让我介绍三个分类模型,分别是:

  • K最近邻模型
  • 朴素贝叶斯模型
  • 决策树模型

常用分类模型

K最近邻模型

K最近邻模型(K Nearest Neighbour,KNN)是一种十分简单的分类模型。它是懒惰学习的代表模型。它的主要思路如下:

假设我们收集到了一系列样本,它们各自有自己已知的类别,为了方便可视化,我们假设它是一个二维数据,颜色代表它的类别,把它们用散点图的方式表示出来:

这时,假如我们有另外一组未知分类的样本,我们如何去预测它的类别呢?KNN模型的思路非常简单:寻找在空间上离它最近的几个点,看这几个点中哪一个类别的数据多,我们就认为它更接近于这个类别,就判断它属于这个类别。这里我们以寻找最近的三个点为例:

我们看出图中绿点周围有2个红点1个蓝点,因此我们认为它和红色点属于同一类别。总结来说,KNN模型就是寻找待测点周围的已知点,然后根据已知点的类别,以一种类似投票的方式选出合适的类别。这也是“K最近邻”这个名称的由来。同时,我们也可以理解为什么说KNN模型是“懒惰学习”的代表了,因为它跟前面几个模型不一样,它实际上并没有对某个模型进行训练,只是单纯地把数据存储了起来。

但是随之而来的问题就是,我们如何确定要找几个点?这就是KNN模型中的超参数,一般情况下,我们需要依靠经验和网格搜索法,确定这个超参数。

另外,当数据量较大时,其实寻找最近的几个点的过程其实还是比较缓慢的,这时我们就需要采用一些特殊的数据结构来进行快速地搜索。对于KNN我们一般会采用一种叫做KD树的数据结构来查找最近邻点。

KNN模型的优缺点:
优点:

  • 模型简单易解释
  • 训练速度快

缺点:

  • 对于复杂数据,简单模型容易产生欠拟合的问题
  • 占用存储空间大, 空间复杂度高

朴素贝叶斯模型

朴素贝叶斯(Naive Bayes)模型也是一个非常简单常用的分类模型,它主要是应用了数理统计中非常重要的贝叶斯公式
P ( B i ∣ A ) = P ( B i ) P ( A ∣ B i ) ∑ P ( B j ) P ( A ∣ B j ) P(B_i|A)=\frac{P(B_i)P(A|B_i)}{\sum P(B _j)P(A|B_j)} P(Bi​∣A)=∑P(Bj​)P(A∣Bj​)P(Bi​)P(A∣Bi​)​ 举一个简单的例子说明朴素贝叶斯的流程,假设我们收集了一些邮件,其中有一部分是垃圾邮件,一部分是正常邮件。我们采集了一些特征,简单起见,我们只取两个特征:是否是虚拟账号发出,是否有图片。我们用如下的变量来进行表示:

  • C = 1 C=1 C=1表示垃圾邮件, C = 0 C=0 C=0表示正常邮件。
  • F 1 = 1 F_1=1 F1​=1表示是虚拟账号发出, F 1 = 0 F_1=0 F1​=0表示不是虚拟账号发出。
  • F 2 = 1 F_2=1 F2​=1表示有图片, F 2 = 0 F_2=0 F2​=0表示没有图片。

假设我们有一个 F 1 = 1 , F 2 = 0 F_1=1,F_2=0 F1​=1,F2​=0的邮件,我们如何预测它是否为垃圾邮件呢?首先我们要根据我们已经搜集到的数据,在垃圾邮件和正常邮件中计算出各个变量各个取值的概率,假设垃圾邮件在我们搜集到的邮件中占50%,举例如下:

C = 0 C=0 C=0 C = 1 C=1 C=1
F 1 = 0 F_1=0 F1​=0 0.8 0.3
F 1 = 1 F_1=1 F1​=1 0.2 0.7
F 2 = 0 F_2=0 F2​=0 0.6 0.2
F 2 = 1 F_2=1 F2​=1 0.4 0.8

实际上,我们就得到一系列的条件概率,我们可以把上面的预测问题转化为计算
P ( C ∣ F 1 = 1 , F 2 = 0 ) P(C|F_1=1,F_2=0) P(C∣F1​=1,F2​=0) 根据上面的贝叶斯公式,可以得到:
P ( C = 0 ∣ F 1 = 1 , F 2 = 0 ) = P ( C = 0 ) P ( F 1 = 1 , F 2 = 0 ∣ C = 0 ) P ( C = 0 ) P ( F 1 = 1 , F 2 = 0 ∣ C = 0 ) + P ( C = 1 ) P ( F 1 = 1 , F 2 = 0 ∣ C = 1 ) P(C=0|F_1=1,F_2=0) =\frac{P(C=0)P(F_1=1,F_2=0|C=0)}{P(C=0)P(F_1=1,F_2=0|C=0)+P(C=1)P(F_1=1,F_2=0|C=1)} P(C=0∣F1​=1,F2​=0)=P(C=0)P(F1​=1,F2​=0∣C=0)+P(C=1)P(F1​=1,F2​=0∣C=1)P(C=0)P(F1​=1,F2​=0∣C=0)​这时,我们假设 F 1 , F 2 F_1,F_2 F1​,F2​之间的取值是相互独立的,于是就有:
P ( F 1 = 1 , F 2 = 0 ∣ C = 0 ) = P ( F 1 = 1 ∣ C = 0 ) P ( F 2 = 0 ∣ C = 0 ) P(F_1=1,F_2=0|C=0)=P(F_1=1|C=0)P(F_2=0|C=0) P(F1​=1,F2​=0∣C=0)=P(F1​=1∣C=0)P(F2​=0∣C=0) 这就变成了我们能用上面的数据计算的形式。通过算出它属于每一种类别的概率,我们就可以取概率最高的作为它的分类。

假设各特征的取值是独立的是朴素贝叶斯的最根本的假设,也是朴素这个名称的由来。值得注意的是,上面这种朴素贝叶斯方法应当被称作伯努利朴素贝叶斯模型,它的要求是所有的特征都必须是离散的。真正的朴素贝叶斯包括了伯努利朴素贝叶斯、多项式朴素贝叶斯模型高斯朴素贝叶斯模型,在这里不再深入讨论。

朴素贝叶斯模型常常用于文本分类,比如上面的例子里提到的将电子邮件分类为垃圾邮件和正常邮件,将报纸上的文章分为不同的主题等等。笔者曾在编写简单人脸识别器时使用了高斯朴素贝叶斯模型,效果也不错(虽然最后换用了支持向量机)。

朴素贝叶斯模型的优缺点总结如下:
优点:

  • 模型简单,训练速度快。
  • 有数学理论的支持,易解释。

缺点:

  • 容易出现欠拟合。
  • 在变量之间取值较为独立时,模型效果才较好。

决策树

决策树(Decision Tree)是树模型的基础,与现在真正广泛应用的集成模型非常相关。此外,它也是一种白盒模型,决策树模型非常容易进行可视化,即使完全不懂模型的人看到了决策树的可视化图也可以完全地理解这个决策过程。

决策树实际上就是模仿人的决策过程。举个例子,假设同学甲正在考虑今天是否要去公园玩。他首先会看看今天是否会下雨,如果下雨就不去,如果不下雨,再考虑今天是否有未完成的工作,如果没有未完成的工作,就去,有未完成的工作,他再考虑是否有朋友约他去玩,有就去没有就不去。画出他的决策过程如下:

决策树就是模仿这种决策过程,具体的流程如下:

  1. 首先选定一个评判标准,来衡量数据种类的混乱度,样本中包含的不同数据种类的个体越多,混乱度越大。
  2. 然后选定一个分割标准,将数据分割成两部分,而且分割后,两堆数据的混乱度之和最小
  3. 重复第二步直到不能再分。

接下来我们来逐一讨论,首先,如何定义数据的混乱度呢?在物理学中,我们用“熵”来作为混乱度的描述,而在机器学习中,一般采用基尼系数交叉熵作为混乱度的描述,交叉熵我们前面已经介绍过了,这里给出基尼系数的定义:
G i n i = 1 − ∑ p i 2 ( p i 为 类 别 i 在 样 本 中 出 现 的 概 率 ) Gini=1-\sum p_i^2(p_i为类别i在样本中出现的概率) Gini=1−∑pi2​(pi​为类别i在样本中出现的概率) 有了混乱度的定义,我们就可以通过贪心算法寻找最优的分割点,确定分割指标。

其实在理论上可以看出,这个模型和前面讲的三个分类模型(包括逻辑回归)不同的是,只要不出现两个特征完全相同但分类不同的个体,这样不断地分下去,就一定能把这些数据的类别100%分对,换句话说就是在训练集上达到100%的准确率,这就存在了一个问题——过拟合,决策树很有可能变成一个在训练集上表现良好但预测效果很差的模型。

这时,我们就要对决策树进行剪枝,比如设定决策树的最大深度,或者设定决策树的结点在样本数小于某个值后就不再分了,这样可以有效地减轻决策树的过拟合。还有另一种防范过拟合的方法,就是将决策树“升级”成随机森林,这将在集成模型那一部分进行介绍。

决策树的优缺点:
优点:

  • 容易可视化,清晰明了。
  • 在训练集上表现良好。

缺点:

  • 比起前面两个模型,它的训练速度较慢。
  • 容易发生过拟合。

常用分类指标

准确率、精确率和召回率

接下来我们来讨论如何评价一个分类模型是否优秀。针对二元分类问题,我们可以把真实值、预测值的情况分为以下几种:

真实值:1 真实值:0
预测值:1 真阳性(TP) 伪阳性(FP)
预测值:0 伪阴性(FN) 真阴性(TN)

不难看出,我们实际上预测正确的是TP和TN两部分,于是给出第一个评价指标准确率
A c c u r a c y = T P + T N T P + T N + F N + F P Accuracy=\frac{TP+TN}{TP+TN+FN+FP} Accuracy=TP+TN+FN+FPTP+TN​再给出另外两种评价指标:
P r e c i s i o n = T P T P + F P Precision=\frac{TP}{TP+FP} Precision=TP+FPTP​ R e c a l l = T P T P + F N Recall=\frac{TP}{TP+FN} Recall=TP+FNTP​
分别称为精确率召回率。这两个指标有什么含义呢?在数理统计中,我们知道有第一类错误和第二类错误两类错误,而这里的 F P FP FP就表示了第一类错误, F N FN FN就表示了第二类错误,也就是说,实际上,精确率是衡量第一类错误的指标,召回率是衡量第二类错误的指标。但这之中又存在了一个问题,我们在数理统计中知道,犯第一类错误的概率和犯第二类错误的概率往往是成负相关的,那我们就需要一个综合的指标来衡量模型的效果,于是引入了F1 Score:
F 1 = 2 P r e c i s i o n ⋅ R e c a l l P r e c i s i o n + R e c a l l F_1=\frac{2Precision\cdot Recall}{Precision+Recall} F1​=Precision+Recall2Precision⋅Recall​ 也就是说F1 Score实际上是精确率和召回率的调和平均数。更一般地,有:
F β = ( 1 + β 2 ) P r e c i s i o n ⋅ R e c a l l β 2 P r e c i s i o n + R e c a l l F_{\beta}=(1+\beta^2)\frac{Precision\cdot Recall}{\beta^2Precision+Recall} Fβ​=(1+β2)β2Precision+RecallPrecision⋅Recall​ 我们一般就是采用上面这些指标衡量模型的优劣。

ROC曲线和AUC

对于像逻辑回归这样的分类模型,我们实际上是求出它是类别1的概率,然后选定一个阈值 α \alpha α,根据概率和 α \alpha α的大小关系,来确定它属于哪一种分类。由此我们来定义一个坐标系:

  • y y y轴是真阳性率 T P R = T P / ( T P + F N ) TPR=TP/(TP+FN) TPR=TP/(TP+FN)
  • x x x轴是伪阳性率 F P R = F P / ( F P + T N ) FPR=FP/(FP+TN) FPR=FP/(FP+TN)

让阈值从0取到1,计算每一个阈值下的伪阳性率和真阳性率,把这些点标在坐标系中,我们近似可以得到一个图像:

这条曲线就被称为ROC曲线,我们对这条曲线在(0,1)内作积分,得到ROC曲线下的面积,定义为AUC(Area Under Curve)。

AUC是一个综合反映不同阈值下模型评估结果的指标,它还是一个在数据集非均衡时不会失真的指标,被广泛应用于评价模型的好坏。

利用以上介绍的几种指标都能够在一定程度上反映分类模型的好坏,具体采用哪种分类指标要根据实际情况来进行确定。

小结

在这篇博文中,主要介绍了三种简单的分类模型:KNN,朴素贝叶斯和决策树,其中KNN是一种非常简单的模型,朴素贝叶斯常用于NLP领域,决策树是树模型的基础。然后介绍了一些评价指标,其中我认为最实用的应属F1 Score和AUC。在下一篇博文中,将会介绍一种非常神奇、被称为“万能分类器”的分类模型——支持向量机

机器学习(五)常用分类模型(K最近邻、朴素贝叶斯、决策树)和分类评价指标相关推荐

  1. Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说

    Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报  分类: 机器学习(19)  听说朴 ...

  2. python贝叶斯模型_【机器学习速成宝典】模型篇05朴素贝叶斯【Naive Bayes】(Python版)...

    目录 先验概率与后验概率 条件概率公式.全概率公式.贝叶斯公式 什么是朴素贝叶斯(Naive Bayes) 拉普拉斯平滑(Laplace Smoothing) 应用:遇到连续变量怎么办?(多项式分布, ...

  3. 机器学习实战之分类算法(K-近邻/朴素贝叶斯/决策树/随机森林)

    机器学习分类算法 1. 机器学习算法简介 1.1 按照学习方式分类 1.2 区别 1.3 关于监督学习中的分类与回归区别 1.4 机器学习开发流程 2. 数据集介绍与划分 2.1 sklearn数据集 ...

  4. python文本分类算法_python编写朴素贝叶斯用于文本分类

    朴素贝叶斯估计 朴素贝叶斯是基于贝叶斯定理与特征条件独立分布假设的分类方法.首先根据特征条件独立的假设学习输入/输出的联合概率分布,然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出 ...

  5. 机器学习——分类算法之K近邻+朴素贝叶斯,模型选择与调优

    目录 K-近邻算法 定义 如何求距离? 数据预处理--标准化 sklearn k-近邻算法API 案例--预测入住位置 分类问题 数据处理 k近邻算法相关问题 k值取多大?有什么影响? 优缺点 应用场 ...

  6. k近邻算法,朴素贝叶斯算法,分类模型评估,模型调优

    k近邻算法,朴素贝叶斯算法,分类模型评估,模型调优 k近邻算法 k近邻算法概述 k近邻算法代码实现 k近邻算法的评价 朴素贝叶斯算法 朴素贝叶斯算法概述 朴素贝叶斯代码实现 朴素贝叶斯的评价 分类模型 ...

  7. 新闻分类任务(LDA模型,多项分布朴素贝叶斯)

    新闻分类任务 1.利用gensim建立LDA模型将文本进行主题分类 2.利用多项分布朴素贝叶斯将文本进行分类 数据来源:http://www.sogou.com/labs/resource/list_ ...

  8. 机器学习(六)--------python实现朴素贝叶斯对email分类

    贝叶斯分类 4.1 贝叶斯定理 计算条件概率 4.2 朴素贝叶斯分类 朴素:特征条件独立 贝叶斯:基于贝叶斯定理 该方法受限于当特征属性有条件独立或基本独立. 4.3 贝叶斯网络 贝叶斯网络也成为信念 ...

  9. 机器学习实验二:朴素贝叶斯和SVM——肿瘤分类与预测(朴素贝叶斯)

    实操项目 1--肿瘤分类与预测(朴素贝叶斯) 实验要求 采用朴素贝叶斯方法,对美国威斯康星州的乳腺癌诊断数据集进行分类,实现针对乳腺癌检测的分类器,以判断一个患者的肿瘤是良性还是恶性. [实验要求] ...

  10. 机器学习实验之肿瘤分类与预测(朴素贝叶斯)

    文章目录 肿瘤分类与预测(朴素贝叶斯) [实验内容] [实验要求] **[数据集]:威斯康星乳腺肿瘤数据集** 导入sklearn自带的数据集:威斯康星乳腺肿瘤数据集(load_breast_canc ...

最新文章

  1. kali怎么新建文本_甘特图怎么画?零基础快速绘制甘特图的软件
  2. Python 编程快速上手 第十七章 操作图像
  3. SpringBoot中@EventListener注解的使用
  4. cvRemap 对图像进行普通几何变换
  5. android studio 启动画面,Android Studio 利用Splash制作APP启动界面的方法
  6. c 语言for 循环大到小,C语言中for循环问题(一个小坑需注意)
  7. LDA主题模型简介及Python实现
  8. Win10中小娜无法搜索本地应用
  9. 穴位--程序健康之道
  10. 图片透明底如何在线生成?试试小编推荐的这款工具吧
  11. 应用程序无响应的原因
  12. Windows或Linux中32位与64位操作系统的区别
  13. 微信小程序通过”链接/文字/数字等等“生成二维码
  14. vue 全局背景音乐
  15. 计算机网络连接叹号,【电脑网络连接感叹号】电脑网络连接感叹号怎么回事_电脑网络连接感叹号怎么办_亲亲宝贝网...
  16. [教程]配置青鸟云Web服务器
  17. 应用启动图标未读消息数显示 工具类
  18. BIOS,U-BOOT,BootLoader三者的对比
  19. Linux3.x——USB Gadget HID keyboard + Mass storage
  20. Qt图例类QLegend详解

热门文章

  1. 字节跳动EE部门前端面试经历及总结
  2. 松林变色立木的天-空-地协同遥感监测,各部分在监测技术体系中起到的作用分别是什么?...
  3. 2019年注册会计师考试全套高清视频课件百度云网盘免费下载方法
  4. vscode报错 [Code安装似乎损坏。请重新安装]
  5. NetApp 数据保护解决方案
  6. Autoit3 编程学习笔记
  7. php p12,使用PHP和OpenSSL将P12转换为PEM
  8. java p12证书验证_p12格式的安全证书在Java项目中使用
  9. 云计算机教室中标,金昌市理工中等专业学校云计算机教室设备项目中标公告
  10. 在Mac下防范“P2P终结者”限速