赵走x博客
网站访问量:151884
首页
书籍
软件
工具
古诗词
搜索
登录
深入浅出Python机器学习:31、自动特征选择
深入浅出Python机器学习:30、数据“升维”
深入浅出Python机器学习:29、数据表达
深入浅出Python机器学习:28、聚类算法
深入浅出Python机器学习:27、特征提取
深入浅出Python机器学习:26、数据降维
深入浅出Python机器学习:25、数据预处理
深入浅出Python机器学习:24、神经网络实例一一手写识别
深入浅出Python机器学习:23、神经网络的原理及使用
深入浅出Python机器学习:22、神经网络的前世今生
深入浅出Python机器学习:21、SVM 实例一一波士顿房价回归分析
深入浅出Python机器学习:20、SVM 的核函数与参数选择
深入浅出Python机器学习:19、支持向量机SVM 基本概念
深入浅出Python机器学习:18、随机森林实例一一要不要和中目亲对象进一步发展
深入浅出Python机器学习:17、随机森林
深入浅出Python机器学习:16、决策树
深入浅出Python机器学习:15、朴素贝叶斯实战一一判断肿瘤是良性还是恶性
深入浅出Python机器学习:14、朴素贝叶斯算法的不同方法
深入浅出Python机器学习:13、朴素贝叶斯基本概念
深入浅出Python机器学习:12、使用L1 正则化的线性模型一一套索回归
深入浅出Python机器学习:11、使用L2 正则化的线性模型一一岭回归
深入浅出Python机器学习:10、最基本的线性模型一一线性回归
深入浅出Python机器学习:9、线性模型的墓本概念
深入浅出Python机器学习:8、K 最近邻算法项目实战一一酒的分类
深入浅出Python机器学习:7、K最近邻算法用于回归分析
深入浅出Python机器学习:6、K最近邻算法处理多元分类任务
深入浅出Python机器学习:5、k最近邻算法在分类任务中的应用
深入浅出Python机器学习:4、K 最近邻算法的原理
深入浅出Python机器学习:3、一些必需库的安装及功能简介
深入浅出Python机器学习:2、基于python i吾言的环境配置
深入浅出Python机器学习:1、概述
人脸数据集加载faces = fetch_lfw_people()报错
31、直方图
74、插件开发:Android端API实现
Python3之socket编程--3:基于UDP的套接字
15、使用 jQuery 处理 Ajax 请求
深入浅出Python机器学习:13、朴素贝叶斯基本概念
资源编号:75896
人工智能
深入浅出Python机器学习
热度:199
朴素贝叶斯( Naive Bayes )算法是一种基于贝叶斯理论的有监督学习算法。之所以说“朴素”,是因为这个算法是基于样本特征之间互相独立的“朴素”假设。正因为如此,由于不用考虑样本特征之间的关系,朴素贝叶斯分类器的效率是非常高的。这一章将向大家介绍朴素贝叶斯算法的基本概念和用法。
>朴素贝叶斯算法:打雷了,收衣服啊 朴素贝叶斯( Naive Bayes )算法是一种基于贝叶斯理论的有监督学习算法。之所以说“朴素”,是因为这个算法是基于样本特征之间互相独立的“朴素”假设。正因为如此,由于不用考虑样本特征之间的关系,朴素贝叶斯分类器的效率是非常高的。这一章将向大家介绍朴素贝叶斯算法的基本概念和用法。 主要涉及的知识点有: 1、贝叶斯定理简介 2、朴素贝叶斯的简单应用 3、贝努利朴素贝叶斯、高斯朴素贝叶斯和多项式朴素贝叶斯 4、朴素贝叶斯实例一一判断肿瘤是良性还是恶性 贝叶斯( Thomas Bayes )是一位英国数学家, 1701 年生于伦敦, 曾是一位神父。后于1742 年成为英国皇家学会会员。贝叶斯在数学方面主要研究概率论, 他创立了贝叶斯统计理论,该理论对现代概率论和数理统计又有很重要的作用,在数学和工程领域都得到了广泛的应用,本节将介绍贝叶斯定理和朴素贝叶斯分类器的基本概念。 # 1、 贝叶斯定理 那是一个7 月的傍晚,临近下班,小C 收拾东西准备去接女朋友。问题来了,小C要不要带伞呢? >已知: 天气预报说今日降水概率为50%--P (A) 晚高峰堵车的概率是80%--P(B) 如果下雨,晚高峰堵车的概率是95%--p(A|B) 小C 向窗外望去,看到堵车了,则根据贝叶斯定理: P(AIB)= $$\\dfrac{P(B|A)*P(A)}{P(B)}$$ 求得下雨的概率为0.5 × 0.95÷ 0.8=0.59375 。 小C 果断地拿起雨伞冲了出去…… # 2、朴素贝叶斯的简单应用 过去的7 天当中,有3 天下雨, 4 天没有下雨。用0 代表没有下雨,而1代表下雨, 我们可以用一个数组来表示: y= [0, 1, 1, 0, 1, 0, 0] 而在这7 天当中,还有另外一些信息,包括刮北风、闷热、多云, 以及天气预报给出的信息,如表于1 所列。 过去7 天中和气象有关的信息: | | 刮北风 | 闷热 | 多云 | 天气预报有雨 | | ------------ | ------------ | ------------ | ------------ | ------------ | | 第1天 | 否 | 是 | 否 | 是 | | 第2天 | 是 | 是 | 是 | 否 | | 第3天 | 否| 是 | 是 | 否 | | 第4天 | 否 | 否 | 否 | 是 | | 第5天 | 否 | 是 | 是 | 否 | | 第6天 | 否 | 是 | 否 | 是 | | 第7天 | 是 | 否 | 否 | 是 | 同样地,我们用0 代表否, 1 代表是,可以得到另外一个数组: X= [0, 1, 0,1], [ 1, 1, 1, 0], [0, 1, 1, 0] , [0, 0, 0, 1], [0, 1, 1 ,0],[0, 1, 0, 1], [1 , 0, 0, 1] 现在我们用Jupyter Notebook 来看一下数据的关系, 在Jupyter Notebook 中输入代码如下: ``` # 导人nurnpy import numpy as np # 将x , y赋值为n p数组 X = np.array([[0, 1, 0, 1], [1, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 1], [0, 1, 1, 0], [0, 1, 0, 1], [1, 0, 0, 1]]) y = np.array([0, 1, 1, 0, 1, 0, 0]) # 对不同分类计算每个特征为1 的数量 counts = {} for label in np.unique(y): counts[label] = X[y == label].sum(axis=0) # 打印计数结果 print("feature counts:\n{}".format(counts)) ``` 代码运行结果: ``` feature counts: {0: array([1, 2, 0, 4]), 1: array([1, 3, 3, 0])} ``` [结果分析]下面我们来解释一下这个结果的意思, 当y 为0 时, 也就在没有下雨的4 天当中, 有1 天刮了北风, 有2 天比较闷热,而没有出现多云的情况,但这4 天天气预报全部播报有雨。同时, 在y 为1 时,也就是在下雨的3 天当中, 有1天刮了北风,3 天全都比较闷热,且3 天全部出现了多云的现象, 有意思的是,这3 天的天气预报都没有播报有雨。 那么对于朴素贝叶斯来说,它会根据上述的计算来进行推理。它会认为, 如果某一天天气预报没有播报有雨,但出现了多云的情况,它会倾向于把这一天放到“下雨”这一个分类中。 下面我们来验证一下,在Jupyte r Notebook 里输入代码如下: ``` # 导人nurnpy import numpy as np # 导人贝努利贝叶斯 from sklearn.naive_bayes import BernoulliNB # 将x , y赋值为n p数组 X = np.array([[0, 1, 0, 1], [1, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 1], [0, 1, 1, 0], [0, 1, 0, 1], [1, 0, 0, 1]]) y = np.array([0, 1, 1, 0, 1, 0, 0]) # 使用贝努利贝叶斯拟合数据 elf = BernoulliNB() elf.fit(X, y) # 要进行预测的这一天,没有刮北风,也不闷热 # 但是多云,天气预报没有说有雨 Next_Day = [[0, 0, 1, 0]] pre = elf.predict(Next_Day) if pre == [1]: print("要下雨啦,快收衣服啊!") else: print("放心,又是一个艳阳天") ``` 代码运行结果: ``` 要下雨啦,快收衣服啊! ``` [结果分析] 可以看出,朴素贝叶斯分类器把这一天放到了会下雨的分类当中。 那么如果有另外一天,刮了北风,而且很闷热,但云量不多,同时天气预报说有雨,会怎样呢?我们输入代码如下: ``` # 导人nurnpy import numpy as np # 导人贝努利贝叶斯 from sklearn.naive_bayes import BernoulliNB # 将x , y赋值为n p数组 X = np.array([[0, 1, 0, 1], [1, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 1], [0, 1, 1, 0], [0, 1, 0, 1], [1, 0, 0, 1]]) y = np.array([0, 1, 1, 0, 1, 0, 0]) # 使用贝努利贝叶斯拟合数据 elf = BernoulliNB() elf.fit(X, y) # 假设另外一天的数据如下 Another_day = [[1,1,0,1]] # 使用训练好的模型进行预测 pre = elf.predict(Another_day) if pre == [1]: print("要下雨啦,快收衣服啊!") else: print("放心,又是一个艳阳天") ``` 运行结果: ``` 放心,又是一个艳阳天 ``` [结果分析] 可以看到,这次分类器把这一天归为不会下雨的分类中了。 现在大家可能很想知道朴素贝叶斯给出的预测准确率怎么样,我们可以用predict_proba 方法来测试一下,输入代码如下: ``` # 导人nurnpy import numpy as np # 导人贝努利贝叶斯 from sklearn.naive_bayes import BernoulliNB # 将x , y赋值为n p数组 X = np.array([[0, 1, 0, 1], [1, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 1], [0, 1, 1, 0], [0, 1, 0, 1], [1, 0, 0, 1]]) y = np.array([0, 1, 1, 0, 1, 0, 0]) # 使用贝努利贝叶斯拟合数据 elf = BernoulliNB() elf.fit(X, y) # 要进行预测的这一天,没有刮北风,也不闷热 # 但是多云,天气预报没有说有雨 Next_Day = [[0, 0, 1, 0]] # 模型预测分类的概率 print(elf.predict_proba(Next_Day)) ``` 代码运行结果: ``` [[0.13848881 0.86151119]] ``` [结果分析] 这个意思是说,我们所预测的第一天,不下雨的概率大约是13 . 8%,而下雨的概率是86.2% ,看起来还是很不错的。 再看一下第二天的预测情况。输入代码如下: ``` # 导人nurnpy import numpy as np # 导人贝努利贝叶斯 from sklearn.naive_bayes import BernoulliNB # 将x , y赋值为n p数组 X = np.array([[0, 1, 0, 1], [1, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 1], [0, 1, 1, 0], [0, 1, 0, 1], [1, 0, 0, 1]]) y = np.array([0, 1, 1, 0, 1, 0, 0]) # 使用贝努利贝叶斯拟合数据 elf = BernoulliNB() elf.fit(X, y) # 假设另外一天的数据如下 Another_day = [[1,1,0,1]] # 模型预测分类的概率 print(elf.predict_proba(Another_day)) ``` 代码运行结果 ``` [[0.92340878 0.07659122]] ``` [结果分析]也就是说,第二天不下雨的概率是92.3% ,下雨的概率只有7.7% ,这样看起来,朴素贝叶斯做出的预测还不错。 > ⚠️:不要太乐观!如果大家在scikit-learn 官网上查看文档,会发现一段很搞笑的描述一一虽然朴素贝叶斯是相当好的分类器,但对于预测具体的数值并不是很擅长,因此predict_proba 给出的预测概率,大家也不要太当真。