微信号:QunarTL

介绍:Qunar技术沙龙是去哪儿网工程师小伙伴以及业界小伙伴们的学习交流平台.我们会分享Qunar和业界最前沿的热门技术趋势和话题;为中高端技术同学提供一个自由的技术交流和学习分享平台.

机器学习之scikit-learn开发入门(7)

2019-01-16 09:30 曹华

曹华,2018 年加入去哪儿网技术团队。目前在火车票事业部/技术部小组。个人对图像处理、数据挖掘、图论、VR 等有浓厚兴趣。


机器学习之 scikit-learn 开发入门 - 

监督学习 - 朴素贝叶斯分类器


一 概要

本文主要讲解朴素贝叶斯分类算法,主要内容包括: 1、朴素贝叶斯分类算法的介绍; 2、朴素贝叶斯分类算法库的介绍; 3、朴素贝叶斯分类算法应用示例; 4、朴素贝叶斯分类算法原理; 5、总结。 通过文本的介绍,希望大家可以掌握朴素贝叶斯分类算法的使用与了解它的原理。

二 参考资料

贝叶斯分类器_维基百科

三 朴素贝叶斯分类算法的介绍

贝叶斯分类是以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素贝叶斯分类是贝叶斯分类中最简单的,也是常见的一种分类方法。 朴素贝叶斯很直观,计算量也不大,在很多领域有广泛的应用,这里我们就对朴素贝叶斯算法的使用和原理做一个小结。

四 朴素贝叶斯分类算法库的介绍

GaussianNB 类是朴素贝叶斯分类器的一种,它的主要参数仅有一个,即先验概率 priors:对应各个类别的先验概率 P。这个值默认不给出,如果不给出此时 P=mk/m。其中 m 为训练集样本总数量,mk 为输出为第 k 类别的训练集样本数。如果给出的话就以 priors 为准。

五 朴素贝叶斯分类算法应用示例

1、导入头文件

 
           
  1. #coding=utf-8

  2. import numpy as np

  3. from sklearn import datasets

  4. from sklearn.naive_bayes import GaussianNB

2、样本数据

 
           
  1. # 仍然使用自带的iris数据

  2. iris = datasets.load_iris()

  3. X = iris.data[:, [0, 2]]

  4. Y = iris.target

3、划分训练数据和测试数据

 
           
  1. # 分解数据为训练集和测试集

  2. shuffled_indices=np.random.permutation(len(X))

  3. test_set_size=int(len(X)*0.25)

  4. test_indices =shuffled_indices[:test_set_size]

  5. train_indices=shuffled_indices[test_set_size:]

  6. train_sample = X[train_indices]

  7. train_result = Y[train_indices]

  8. test_sample = X[test_indices]

  9. test_result = Y[test_indices]

4、训练模型

 
           
  1. # 初始化贝叶斯分类器

  2. clf = GaussianNB()

  3. # 拟合数据

  4. clf.fit(train_sample, train_result)

5、预测验证

 
           
  1. # 预测数据

  2. predict_data = clf.predict(test_sample)

6、获得结果

 
           
  1. print(predict_data)

  2. print (test_result)

[1 2 0 2 1 0 0 1 1 1 0 1 0 1 1 1 1 1 0 1 0 2 0 1 2 2 0 1 2 1 1 0 2 1 0 0 1] 

[1 2 0 2 1 0 0 1 2 1 0 2 0 1 1 1 1 1 0 1 0 2 0 1 2 2 0 1 2 1 1 0 2 1 0 0 1]

7、计算准确率

 
           
  1. # 显示预测准确率

  2. diff = 0.0;

  3. for num in range(0,len(predict_data)):

  4.    if(predict_data[num] != test_result[num]):

  5.        diff = diff + 1


  6. rate = (diff / len(predict_data));

  7. print 1 - rate

0.945945945946 

六 朴素贝叶斯分类算法原理

对于分类问题,其实谁都不会陌生,日常生活中我们每天都进行着分类过程。例如,当你看到一个人,你的脑子下意识判断他是学生还是社会上的人;你可能经常会走在路上对身旁的朋友说“这个人一看就很有钱”之类的话,其实这就是一种分类操作。 那么朴素贝叶斯分类算法的核心是什么呢?

换个表达形式就会清晰很多,如下:

最终求的 P(类别|特征)即可。

七 原理例题分析

给定数据如下:

如果一对男女朋友,男生想女生求婚,男生的四个特点分别是不帅,性格不好,身高矮,不上进,用贝叶斯分类算法判断一下女生是嫁还是不嫁? 这是一个典型的分类问题,转为数学问题就是比较p(嫁|(不帅、性格不好、身高矮、不上进))与p(不嫁|(不帅、性格不好、身高矮、不上进))的概率,谁的概率大,结果就是谁。 因为特征之间是相互独立的,所以根据贝叶斯可以得到以下等式:

下面将一个一个的进行统计计算(在数据量很大的时候,根据中心极限定理,频率是等于概率的,这里只是一个例子,所以我就进行统计即可)。 首先我们来梳理下数据的条数: 1、嫁有6条数据,即嫁的数量是6; 2、不嫁有6条数据,即不嫁的数量是6; 3、总样本12条数据,即总数量是12; 4、不帅、嫁有3条数据,即不帅、嫁的数量是3; 5、性格不好、嫁有1条数据,即性格不好、嫁的数量是1; 6、矮、嫁有1条数据,即矮、嫁的数量时1; 7、不上进、嫁有1条数据,即不上进、嫁的数量是1; 8、不帅、不嫁有2条数据,即不帅、不嫁的数量是2; 9、性格不好、不嫁有3条数据,即性格不好、不嫁的数量是3; 10、矮、不嫁有6条数据,即矮、不嫁的数量是6; 11、不上进、不嫁有4条数据,即不上进、不嫁的数量是4; 12、不帅有5条数据,即不帅的数量是5; 13、性格不好有4条数据,即性格不好的数量是4; 14、身高矮有7条数据,即矮的数量是7; 15、不上进有5条数据,不上进的数量是5;

①P(嫁)=嫁的数量/总数量=6/12 =1/2 ②P(不帅|嫁)=不帅、嫁的数量/嫁的数量=3/6 =1/2 ③P(性格不好|嫁)=性格不好、嫁的数量/嫁的数量=1/6 ④P(矮|嫁)=矮、嫁的数量/嫁的数量=1/ 6 ⑤P(不上进|嫁)=不上进、嫁的数量/嫁的数量=1/6 下面开始求解分母: ①P(不帅)=不帅的数量/总数量=5/12 ②P(性格不好)=性格不好的数量/总数量=4/12=1/3 ③P(矮)=矮的数量/总数量=7/12 ④P(不上进)=不上进的数量/总数量=5/12 下面带入等式为:P(嫁|(不帅、性格不好、身高矮、不上进))=(1/2 * 1/6 * 1/6 * 1/6 * 1/2)/(5/12 * 1/3 * 7/12 * 5/12)=0.03428571428。

下面以同样的方法求出 P(不嫁|不帅、性格不好、身高矮、不上进),首先公式如下:

①P(不嫁)=不嫁的数量/总数量=6/12=1/2 ②P(不帅|嫁)=不帅、不嫁的数量/不嫁的数量=2/6=1/3 ③P(性格不好|嫁)=性格不好、不嫁的数量/不嫁的数量=3/6=1/2 ④P(矮|嫁)=矮、不嫁的数量/嫁的数量=6/6=1 ⑤P(不上进|嫁)=不上进、不嫁的数量/不嫁的数量=4/6=2/3 分母与上式相同不再计算。计算过程如下:P(不嫁|(不帅、性格不好、身高矮、不上进))=(1/3 * 1/2 * 1 * 2/3 * 1/2)/(5/12 * 1/3 * 7/12 * 5/12)=1.645714285714286。 于是有 P(不嫁|不帅、性格不好、身高矮、不上进)>P(嫁|不帅、性格不好、身高矮、不上进)。 所以我们根据朴素贝叶斯算法可以给出的答案是不嫁。这就是贝叶斯大概的推倒过程。

八 总结

朴素贝叶斯的主要优点有: 1、朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率; 2、对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练; 3、对缺失数据不太敏感,算法也比较简单,常用于文本分类。 朴素贝叶斯的主要缺点有: 1、理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进; 2、需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳; 3、由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率; 4、对输入数据的表达形式很敏感。(朴素贝叶斯是一个简单的基于特征进行统计的模型,因此数据的表现形式是连续特征还是离散特征都会对模型的概率计算结果产生很大的影响,进而对基于特征的预测结果产生影响。)

 
Qunar技术沙龙 更多文章 AIOps 助力航信运维百万级交易系统 0 宕机 机器学习之scikit-learn开发入门(6) Flutter动画的架构设计 你不知道的Sass RxJava学习以及在机票国内主系统重构经验分享
猜您喜欢 纳米机器人纠正DNA 2045年人类将可能永生 干货 | 沪江学习Android端重构实践 随着人工智能的发展,测试宝宝们要失业? MySQL数据库复制概论 看了这篇文章,你还敢自称“码农”吗?