干货 | 朴素贝叶斯python代码实现

Posted Ai尚研修

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了干货 | 朴素贝叶斯python代码实现相关的知识,希望对你有一定的参考价值。

文章来源:以上内容来自博客园,作者知然

摘要:

朴素贝叶斯也是机器学习中一种非常常见的分类方法,对于二分类问题,并且数据集特征为离散型属性的时候,使用起来非常的方便。原理简单,训练效率高,拟合效果好。


朴素贝叶斯


贝叶斯公式:

朴素贝叶斯之所以称这为朴素,是因为假设了各个特征是相互独立的,因此假定下公式成立:

干货 | 朴素贝叶斯python代码实现

则朴素贝叶斯算法的计算公式如下:


干货 | 朴素贝叶斯python代码实现

在实际计算中,上面的公式会做如下略微改动:

  1. 由于某些特征属性的值P(Xi|Ci)可能很小,多个特征的p值连乘后可能被约等于0。可以公式两边取log然后变乘法为加法,避免类乘问题。

  2. P(Ci) 和P(Xi|Ci) 一般不直接使用样本的频率计算出来,一般会使用拉普拉斯平滑。


    干货 | 朴素贝叶斯python代码实现

上面公式中,Dc为该类别的频数,N表示所有类别的可能数。


干货 | 朴素贝叶斯python代码实现

上面公式中,Dc,xi为该特征对应属性的频数,Dc为该类别的频数,Ni表示该特征的可能的属性数。

对应的西瓜书数据集为

色泽 根蒂 敲声 纹理 脐部 触感 好瓜 青绿 蜷缩 浊响 清晰 凹陷 硬滑 是 乌黑 蜷缩 沉闷 清晰 凹陷 硬滑 是 乌黑 蜷缩 浊响 清晰 凹陷 硬滑 是 青绿 蜷缩 沉闷 清晰 凹陷 硬滑 是 浅白 蜷缩 浊响 清晰 凹陷 硬滑 是 青绿 稍蜷 浊响 清晰 稍凹 软粘 是 乌黑 稍蜷 浊响 稍糊 稍凹 软粘 是 乌黑 稍蜷 浊响 清晰 稍凹 硬滑 是 乌黑 稍蜷 沉闷 稍糊 稍凹 硬滑 否 青绿 硬挺 清脆 清晰 平坦 软粘 否 浅白 硬挺 清脆 模糊 平坦 硬滑 否 浅白 蜷缩 浊响 模糊 平坦 软粘 否 青绿 稍蜷 浊响 稍糊 凹陷 硬滑 否 浅白 稍蜷 沉闷 稍糊 凹陷 硬滑 否 乌黑 稍蜷 浊响 清晰 稍凹 软粘 否 浅白 蜷缩 浊响 模糊 平坦 硬滑 否 青绿 蜷缩 沉闷 稍糊 稍凹 硬滑 否


代码实现

#encoding:utf-8
import pandas as pdimport numpy as np


计算熵

 def __init__(self): self.model = {}#key 为类别名 val 为字典PClass表示该类的该类,PFeature:{}对应对于各个特征的概率 def calEntropy(self, y): # 计算熵 valRate = y.value_counts().apply(lambda x : x / y.size) # 频次汇总 得到各个特征对应的概率 valEntropy = np.inner(valRate, np.log2(valRate)) * -1 return valEntropy


 def fit(self, xTrain, yTrain = pd.Series()): if not yTrain.empty:#如果不传,自动选择最后一列作为分类标签 xTrain = pd.concat([xTrain, yTrain], axis=1) self.model = self.buildNaiveBayes(xTrain)  return self.model


朴素贝叶斯建立:

def buildNaiveBayes(self, xTrain): yTrain = xTrain.iloc[:,-1]
yTrainCounts = yTrain.value_counts()# 频次汇总 得到各个特征对应的概率
yTrainCounts = yTrainCounts.apply(lambda x : (x + 1) / (yTrain.size + yTrainCounts.size)) #使用了拉普拉斯平滑 retModel = {} for nameClass, val in yTrainCounts.items(): retModel[nameClass] = {'PClass': val, 'PFeature':{}}
propNamesAll = xTrain.columns[:-1] allPropByFeature = {} for nameFeature in propNamesAll: allPropByFeature[nameFeature] = list(xTrain[nameFeature].value_counts().index) #print(allPropByFeature) for nameClass, group in xTrain.groupby(xTrain.columns[-1]): for nameFeature in propNamesAll: eachClassPFeature = {} propDatas = group[nameFeature] propClassSummary = propDatas.value_counts()# 频次汇总 得到各个特征对应的概率 for propName in allPropByFeature[nameFeature]: if not propClassSummary.get(propName): propClassSummary[propName] = 0#如果有属性灭有,那么自动补0 Ni = len(allPropByFeature[nameFeature]) propClassSummary = propClassSummary.apply(lambda x : (x + 1) / (propDatas.size + Ni))#使用了拉普拉斯平滑 for nameFeatureProp, valP in propClassSummary.items(): eachClassPFeature[nameFeatureProp] = valP retModel[nameClass]['PFeature'][nameFeature] = eachClassPFeature
return retModel


计算先验概率:

def predictBySeries(self, data): curMaxRate = None curClassSelect = None for nameClass, infoModel in self.model.items(): rate = 0 rate += np.log(infoModel['PClass']) PFeature = infoModel['PFeature']
for nameFeature, val in data.items(): propsRate = PFeature.get(nameFeature) if not propsRate: continue rate += np.log(propsRate.get(val, 0))#使用log加法避免很小的小数连续乘,接近零 #print(nameFeature, val, propsRate.get(val, 0)) #print(nameClass, rate) if curMaxRate == None or rate > curMaxRate: curMaxRate = rate curClassSelect = nameClass
return curClassSelect


 def predict(self, data): if isinstance(data, pd.Series): return self.predictBySeries(data) return data.apply(lambda d: self.predictBySeries(d), axis=1)


dataTrain = pd.read_csv("xiguadata.csv", encoding = "gbk")
naiveBayes = NaiveBayes()treeData = naiveBayes.fit(dataTrain)
import jsonprint(json.dumps(treeData, ensure_ascii=False))
pd = pd.DataFrame({'预测值':naiveBayes.predict(dataTrain), '正取值':dataTrain.iloc[:,-1]})print(pd)print('正确率:%f%%'%(pd[pd['预测值'] == pd['正取值']].shape[0] * 100.0 / pd.shape[0]))


输出:

{"否": {"PClass": 0.5263157894736842, "PFeature": {"色泽": {"浅白": 0.4166666666666667, "青绿": 0.3333333333333333, "乌 黑": 0.25}, "根蒂": {"稍蜷": 0.4166666666666667, "蜷缩": 0.3333333333333333, "硬挺": 0.25}, "敲声": {"浊响": 0.4166666666666667, "沉闷": 0.3333333333333333, "清脆": 0.25}, "纹理": {"稍糊": 0.4166666666666667, "模糊": 0.3333333333333333, "清晰": 0.25}, "脐部": {"平坦": 0.4166666666666667, "稍凹": 0.3333333333333333, "凹陷": 0.25}, "触感": {"硬滑": 0.6363636363636364, "软粘": 0.36363636363636365}}}, "是": {"PClass": 0.47368421052631576, "PFeature": {"色泽": {"乌黑": 0.45454545454545453, "青绿": 0.36363636363636365, "浅白": 0.18181818181818182}, "根蒂": {"蜷缩": 0.5454545454545454, "稍蜷": 0.36363636363636365, "硬挺": 0.09090909090909091}, "敲声": {"浊响": 0.6363636363636364, "沉闷": 0.2727272727272727, "清脆": 0.09090909090909091}, "纹理": {"清晰": 0.7272727272727273, "稍糊": 0.18181818181818182, "模糊": 0.09090909090909091}, "脐 部": {"凹陷": 0.5454545454545454, "稍凹": 0.36363636363636365, "平坦": 0.09090909090909091}, "触感": {"硬滑": 0.7, "软粘": 0.3}}}} 预测值 正取值0 是 是1 是 是2 是 是3 是 是4 是 是5 是 是6 否 是7 是 是8 否 否9 否 否10 否 否11 否 否12 是 否13 否 否14 是 否15 否 否16 否 否正确率:82.352941%


总结:
贝叶斯分类器是一种生成式模型,不是直接拟合分类结果,而是拟合出后验概率公式计算对应分类的概率。
本文只介绍了二分类,也可以用来处理多分类问题。
对于小规模数据集,表现良好。
建立在特征相互独立的假设上。
这是我的github主页https://github.com/fanchy,有些有意思的分享。

干货 | 朴素贝叶斯python代码实现

7月最新课程推荐(点击标题了解课程详情)



+



# 生态、遥感类课程概览 时间
1
( ↑ 点击会议标题了解课程详情 ↑ )
7月16日-18日
江苏*南京
2

( ↑ 点击会议标题了解课程详情 ↑ )
7月15日-19日
陕西*西安
(线上、线下同步进行
3

( ↑ 点击会议标题了解课程详情 ↑ )
7月1日-4日
湖南*长沙
4

无人机遥感在农业林信息提取中的实现方法与GIS融合制图线上直播课

( ↑ 点击会议标题了解课程详情 ↑ )
7月24日-25日
、31日
(三全天)
5

( ↑ 点击会议标题了解课程详情 ↑ )
7月29-8月2日
云南*昆明
线上、线下同步进行
# 水文类课程概览 时间
1 直播
( ↑ 点击会议标题了解课程详情 ↑ )
7月10日-11日
(两全天
2
( ↑ 点击会议标题了解课程详情 ↑ )
7月26日-30日
拉萨
3
( ↑ 点击会议标题了解课程详情 ↑ )
6月23日-26日
西安
4 第二十四期 SWAT模型在水文水资源、面源污染模拟中的实践技术应用及典型案例分析直播
( ↑ 点击会议标题了解课程详情 ↑ )
7月8日-12日
浙江*杭州
(线上、线下同步进行
5
( ↑ 点击会议标题了解课程详情 ↑ )
7月3日-4日
7月10日-11日
四全天
6

( ↑ 点击会议标题了解课程详情 ↑ )
7月10日-11日
、17日
三全天
# 语言类课程概览 时间
1
( ↑ 点击会议标题了解课程详情 ↑ )
7月10日-11日
(线上直播)
# 生信类课程概览 时间
1
( ↑ 点击会议标题了解课程详情 ↑ )
7月15日-18日    浙江*杭州
# 气象类课程概览 时间
1
( ↑ 点击会议标题了解课程详情 ↑ )
7月17日-18日
、24日
(三全天)
2

( ↑ 点击会议标题了解课程详情 ↑ )
7月22日-25日
山东*青岛
干货 | 朴素贝叶斯python代码实现


数据分享

地学领域数据
   部分数据展示,关注Ai尚研修公众号,更多数据资源轻松下载! 

大气数据

大气领域数据
   部分数据展示,关注Ai尚研修公众号,更多数据资源轻松下载! 

土利用数据

土地利用数据
   部分数据展示,关注Ai尚研修公众号,更多数据资源轻松下载! 


水文领域数据
   部分数据展示,关注Ai尚研修公众号,更多数据资源轻松下载! 


 年鉴类数据
11、【数据分享】285城空间权重矩阵&中国城乡建设统计年鉴EXCEL
   部分数据展示,关注Ai尚研修公众号,更多数据资源轻松下载! 


经济类数据






超级会员专享


如何成为超级会员:

1.凡参加Ai尚研修收费课程即为超级会员

2.充值3500元即为Ai尚研修超级会员;

超级会员特权:

1.参加直播与现场课程专享400元会员优惠,同时成为Ai尚研修推广大使,推荐参会分享收益。
2.购买Ai尚研修平台导师视频课程(含导师随行长期指导),享受8.5折优惠。
3.免费享受Ai尚研修会议平台中会员专享下视频课程。

4.长期免费参与每月4期针对地学领域简学实用公开课(优先、无门槛)
5.免费参与任何一门课程开设的导师面对面线上答疑交流。

6.Ai尚研修资源站分享中数据免费下载;

7.会员既成为Ai尚研修合作伙伴,可以进行技术文章、视频教程投稿,分享收益红利,同时所在单位可以通过Ai尚研修新媒体平台进行合作及招聘推广。


声明: 本号旨在传播、传递、交流,对相关文章内容观点保持中立态度。涉及内容如有侵权或其他问题,请与本号联系,第一时间做出撤回。


END


Ai尚研修丨专注科研领域

技术推广,人才招聘推荐,科研活动服务

科研技术云导师,Easy  Scientific  Research

以上是关于干货 | 朴素贝叶斯python代码实现的主要内容,如果未能解决你的问题,请参考以下文章

史诗级干货长文朴素贝叶斯

朴素贝叶斯代码实现python

朴素贝叶斯分类算法介绍及python代码实现案例

贝叶斯机器学习:经典模型与代码实现!

Python机器学习(十五)朴素贝叶斯算法原理与代码实现

机器学习实战3:基于朴素贝叶斯实现单词拼写修正器(附Python代码)