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

原文地址:https://www.cnblogs.com/xiaolan-Lin/p/12851981.html