zoukankan      html  css  js  c++  java
  • 11.分类与监督学习,朴素贝叶斯分类算法

    1.理解分类与监督学习、聚类与无监督学习。

    简述分类与聚类的联系与区别。

      分类是一种有监督学习,寻找与已知类别距离最近的点,并将其归为同一类,这个过程一般常用算法为KNN算法。

      聚类是一种无监督学习,没有已知的类别,需要在所有点中寻找出若干类别,将所有点归为若干类,这个过程一般常用算法为KMeans算法。

      联系:(1)分类与聚类都需要通过距离找到最近的点,即二者均用到了NN(Nears Neighbor)算法。

         (2)最终都是归为若干类

      区别:分类为有监督学习(类别已知)

           聚类为无监督学习(类别未知)

      (KMeans算法传送门:https://www.cnblogs.com/xiaolan-Lin/p/12694904.html

                https://www.cnblogs.com/xiaolan-Lin/p/12715411.html

    简述什么是监督学习与无监督学习。

       监督学习相当于数据集中有标签,根据数据集中标记好的数据进行推断功能,通过对已标记数据的学习,利用模型推断出为未标记数据的分类结果(如心悸、先天性心脏病、后天性心脏病等),反之则为无监督学习。无监督学习缺乏足够的先验知识,通过规律以及数据之间的相似性进行学习并归类。

    2.朴素贝叶斯分类算法实例

    利用关于心脏病患者的临床历史数据集,建立朴素贝叶斯心脏病分类模型。

    有六个分类变量(分类因子):性别,年龄、KILLP评分、饮酒、吸烟、住院天数

    目标分类变量疾病:

    –心梗

    –不稳定性心绞痛

    新的实例:–(性别=‘男’,年龄<70, KILLP=1,饮酒=‘是’,吸烟≈‘是”,住院天数<7)

    最可能是哪个疾病?

    上传手工演算过程。

    性别

    年龄

    KILLP

    饮酒

    吸烟

    住院天数

    疾病

    1

    >80

    1

    7-14

    心梗

    2

    70-80

    2

    <7

    心梗

    3

    70-81

    1

    <7

    不稳定性心绞痛

    4

    <70

    1

    >14

    心梗

    5

    70-80

    2

    7-14

    心梗

    6

    >80

    2

    7-14

    心梗

    7

    70-80

    1

    7-14

    心梗

    8

    70-80

    2

    7-14

    心梗

    9

    70-80

    1

    <7

    心梗

    10

    <70

    1

    7-14

    心梗

    11

    >80

    3

    <7

    心梗

    12

    70-80

    1

    7-14

    心梗

    13

    >80

    3

    7-14

    不稳定性心绞痛

    14

    70-80

    3

    >14

    不稳定性心绞痛

    15

    <70

    3

    <7

    心梗

    16

    70-80

    1

    >14

    心梗

    17

    <70

    1

    7-14

    心梗

    18

    70-80

    1

    >14

    心梗

    19

    70-80

    2

    7-14

    心梗

    20

    <70

    3

    <7

    不稳定性心绞痛

    利用朴素贝叶斯公式,得出:

      P(心梗 | 患者) = [ P(患者 | 心梗) P(心梗) ] / P(患者)

      P(不稳定性心绞痛 | 患者) = [ P(患者 | 不稳定性心绞痛) P(不稳定性心绞痛) ] / P(患者)

    详细计算:

      P(心梗 | 患者) = [ P(患者 | 心梗) P(心梗) ]  / P(患者)

             = [ P(性别 | 心梗) P(年龄 | 心梗) P(KILLP| 心梗) P(饮酒| 心梗) P(吸烟| 心梗) P(住院天数| 心梗) P(心梗) ] / P(患者)

             = [ P(‘男’ | 心梗) P(<70 | 心梗) P(1 | 心梗) P(‘是’ | 心梗) P(‘是’ | 心梗) P(<7 | 心梗) P(心梗) ] / P(患者)

             =  [( 7/16 x 4/16 x  9/16 x 3/16 x 7/16 x 4/16)x 16/20 ] / P(患者)

             = 0.00100 / P(患者)

      P(不稳定性心绞痛 | 患者) = P(患者 | 不稳定性心绞痛) P(不稳定性心绞痛)  / P(患者)

             = [ P(性别 | 不稳定性心绞痛) P(年龄 | 不稳定性心绞痛) P(KILLP| 不稳定性心绞痛) P(饮酒| 不稳定性心绞痛) P(吸烟| 不稳定性心绞痛) P(住院天数| 不稳定性心绞痛) P(不稳定性心绞痛) ] / P(患者)

             = [ P(‘男’ | 不稳定性心绞痛) P(<70 | 不稳定性心绞痛) P(1 | 不稳定性心绞痛) P(‘是’ | 不稳定性心绞痛) P(‘是’ | 不稳定性心绞痛) P(<7 | 不稳定性心绞痛) P(不稳定性心绞痛) ] / P(患者)

             =  [( 1/4 x 1/4 x  1/4 x 1/4 x 2/4 x 2/4)x 4/20 ] / P(患者)

             = 0.00019 / P(患者)

      P(患者) = P(‘男’ | 性别) P(<70 | 年龄) P(1 | KILLP) P(‘是’ | 饮酒) P(‘是’ | 吸烟) P(<7 | 住院天数) 

           = 8/20 x 5/20 x 10/20 x 4/20 x 9/20 x 6/20

    根据以上计算结果可以判断,由于0.00100 >  0.00019,实例患者患心梗疾病的概率较大。

    3.使用朴素贝叶斯模型对iris数据集进行花分类。

    尝试使用3种不同类型的朴素贝叶斯:

    • 高斯分布型
    • 多项式型
    • 伯努利型

    并使用sklearn.model_selection.cross_val_score(),对各模型进行交叉验证。

     1 from sklearn.datasets import load_iris
     2 from sklearn.naive_bayes import GaussianNB, MultinomialNB, BernoulliNB
     3 from sklearn.model_selection import cross_val_score
     4 
     5 
     6 def create_dataset():
     7     """
     8     加载鸢尾花数据集
     9     """
    10     iris_data = load_iris()
    11     feature = iris_data.data
    12     labels = iris_data.target
    13     return feature, labels
    14 
    15 
    16 def gnb_model(feature, labels):
    17     """
    18     朴素贝叶斯--高斯分布型
    19     """
    20     gnb_model = GaussianNB()  # 构建高斯模型
    21 
    22     gnb_model.fit(feature, labels)
    23     pred = gnb_model.predict(feature)
    24     print("==============================")
    25     print("高斯分布型模型预测准确有", sum(pred == labels), "组特征")
    26     return gnb_model
    27 
    28 
    29 def mnb_model(feature, labels):
    30     """
    31     朴素贝叶斯--多项式型
    32     """
    33     mnb_model = MultinomialNB()  # 构建高斯模型
    34 
    35     mnb_model.fit(feature, labels)
    36     pred = mnb_model.predict(feature)
    37     print("==============================")
    38     print("多项式型模型预测准确有", sum(pred == labels), "组特征")
    39     return mnb_model
    40 
    41 
    42 def bnb_model(feature, labels):
    43     """
    44     朴素贝叶斯--伯努利型
    45     """
    46     bnb_model = BernoulliNB()  # 构建高斯模型
    47 
    48     bnb_model.fit(feature, labels)
    49     pred = bnb_model.predict(feature)
    50     print("==============================")
    51     print("伯努利型模型预测准确有", sum(pred == labels), "组特征")
    52     return bnb_model
    53 
    54 
    55 def cross_val(model, feature, labels):
    56     score = cross_val_score(model, feature, labels, cv=10)
    57     print("交叉验证模型准确率为:%.3f" % score.mean())
    58 
    59 
    60 if __name__ == "__main__":
    61     feature, labels = create_dataset()
    62     print("========================朴素贝叶斯=========================")
    63     print("原始数据集中有", len(feature), "组特征")
    64     gnb = gnb_model(feature, labels)
    65     cross_val(gnb, feature, labels)
    66     mnb = mnb_model(feature, labels)
    67     cross_val(mnb, feature, labels)
    68     bnb = bnb_model(feature, labels)
    69     cross_val(bnb, feature, labels)

    运行结果:

     

    学习链接:https://blog.csdn.net/fisherming/article/details/79509025

  • 相关阅读:
    简化SpringBoot框架打包体积
    深究1.8版本HashMap源码
    一次面试题,将 字符串 保存在 Byte 数组中
    记一次linux磁盘清理
    Alibaba Cloud Toolkit 使用心得(IDEA版)
    Mybatis 一对多分页踩坑 对collection的分析
    MySQL中update修改数据与原数据相同会再次执行吗?
    与 MySQL 因“CST” 时区协商误解导致时间差了13 小时
    Druid数据源
    mybatis自动生成代码 mybatis-generator
  • 原文地址:https://www.cnblogs.com/xiaolan-Lin/p/12851981.html
Copyright © 2011-2022 走看看