本文将要为您介绍的是朴素贝叶斯python代码实现(西瓜书),具体完成步骤:朴素贝叶斯python代码实现(西瓜书)

摘要:

朴素贝叶斯也是机器学习中一种非常常见的分类方法,对于二分类问题,并且数据集特征为离散型属性的时候,

使用起来非常的方便。原理简单,训练效率高,拟合效果好。

朴素贝叶斯

贝叶斯公式:

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

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

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

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

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

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

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

对应的西瓜书数据集为

色泽 根蒂 敲声 纹理 脐部 触感 好瓜

青绿 蜷缩 浊响 清晰 凹陷 硬滑 是

乌黑 蜷缩 沉闷 清晰 凹陷 硬滑 是

乌黑 蜷缩 浊响 清晰 凹陷 硬滑 是

青绿 蜷缩 沉闷 清晰 凹陷 硬滑 是

浅白 蜷缩 浊响 清晰 凹陷 硬滑 是

青绿 稍蜷 浊响 清晰 稍凹 软粘 是

乌黑 稍蜷 浊响 稍糊 稍凹 软粘 是

乌黑 稍蜷 浊响 清晰 稍凹 硬滑 是

乌黑 稍蜷 沉闷 稍糊 稍凹 硬滑 否

青绿 硬挺 清脆 清晰 平坦 软粘 否

浅白 硬挺 清脆 模糊 平坦 硬滑 否

浅白 蜷缩 浊响 模糊 平坦 软粘 否

青绿 稍蜷 浊响 稍糊 凹陷 硬滑 否

浅白 稍蜷 沉闷 稍糊 凹陷 硬滑 否

乌黑 稍蜷 浊响 清晰 稍凹 软粘 否

浅白 蜷缩 浊响 模糊 平坦 硬滑 否

青绿 蜷缩 沉闷 稍糊 稍凹 硬滑 否

python实现

#encoding:utf-8

import pandas as pd

import numpy as np

class NaiveBayes:

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 json

print(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代码实现(西瓜书)就为您介绍到这里,感谢您关注懒咪学编程c.lanmit.com.

本文地址:https://c.lanmit.com/redianjishu/xunihua/11070.html

python程序员买西瓜代码_朴素贝叶斯python代码实现(西瓜书)相关推荐

  1. 朴素贝叶斯python代码_朴素贝叶斯模型及python实现

    1 朴素贝叶斯模型 朴素贝叶斯法是基于贝叶斯定理.特征条件独立假设的分类方法.在预测时,对输入x,找出对应后验概率最大的 y 作为预测. NB模型: 输入: 先验概率分布:P(Y=ck),k=1,2, ...

  2. python实现排列组合公式算法_朴素贝叶斯算法的Python实现

    朴素贝叶斯分类算法被广泛应用于文本分类场景中.包含垃圾邮件.互联网新闻等分类任务,属于有监督学习算法.它独立考量每一维度特征被分类的条件概率,然后综合这些概率对其所在的特征向量做出分类预测,即&quo ...

  3. 基于朴素贝叶斯+Python实现垃圾邮件分类和结果分析

    基于朴素贝叶斯+Python实现垃圾邮件分类 朴素贝叶斯原理 请参考: 贝叶斯推断及其互联网应用(二):过滤垃圾邮件 Python实现 源代码主干来自: python实现贝叶斯推断--垃圾邮件分类 我 ...

  4. 学习笔记——Kaggle_Digit Recognizer (朴素贝叶斯 Python实现)

    本文是个人学习笔记,该篇主要学习朴素贝叶斯算法概念,并应用sklearn.naive_bayes算法包解决Kaggle入门级Digit Recognizer. 贝叶斯定理 朴素贝叶斯 Python 代 ...

  5. 机器学习100天(三十七):037 朴素贝叶斯-挑个好西瓜!

    <机器学习100天>完整目录:目录 机器学习100天,今天讲的是:朴素贝叶斯-挑个好西瓜! 红色石头已经了解了贝叶斯定理和朴素贝叶斯法,接下来已经可以很自信地去买瓜了.买瓜之前,还有一件事 ...

  6. 朴素贝叶斯 python 实现

    百度文库 文库2 机器学习实战的朴素贝叶斯的代码太复杂 """ Created on Thu Aug 10 15:08:59 2017@author: luogan &q ...

  7. java naive方法_朴素贝叶斯方法(Naive Bayes Method)

    朴素贝叶斯是一种很简单的分类方法,之所以称之为朴素,是因为它有着非常强的前提条件-其所有特征都是相互独立的,是一种典型的生成学习算法.所谓生成学习算法,是指由训练数据学习联合概率分布P(X,Y),然后 ...

  8. python程序员脱单攻略_520 情人节 :属于 Python 程序员的脱单攻略大合集(视频版)...

    以下文章来源于 Python 编程时光 ,作者写代码的明哥 来源 | Python 编程时光(ID:Cool-Python) 情人节年年有,但今年的 5.20 要比以往的更有意义. 2020.05.2 ...

  9. 用python实现朴素贝叶斯算法_朴素贝叶斯算法 python 实现

    应用贝叶斯准则: 使用上面这些定义,可以定义贝叶斯分类准则为: 如果 P(c1|x, y) > P(c2|x, y), 那么属于类别 c1; 如果 P(c2|x, y) > P(c1|x, ...

最新文章

  1. java concurrenthashmap与阻塞队列
  2. 修改C:\WINDOWS\system32\drivers\etc\hosts 文件有什么作用
  3. Redis宕机了怎么办?
  4. pytorch自定义数据集DataLoder
  5. ASP.NET Core 添加统一模型验证处理机制
  6. 并查集:P1196 [NOI2002] 银河英雄传说
  7. Unity3D-声音系统
  8. NLTK学习笔记(八):文法--词关系研究的工具
  9. 漫画:一位文科生的编程之路。
  10. 算法--帕斯卡三角(杨辉三角)JS写法
  11. 【数据库原理实验(openGauss)】创建数据库、表和索引
  12. 《一本书读懂中国税》- 笔记
  13. 计算机应用基础讨论,计算机应用基础讨论
  14. 程序算法面试 题目汇总 算法题 推理题 规律题
  15. 经度和纬度在SQL中的数据类型
  16. linux 检查zip是否损坏,用-v参数 unzip -v test.zip 检查zip文件是否损坏代常亮
  17. Miles per gallon to kilometers per liter
  18. 如何设置HTML背景特效,HTML5之按钮背景不同动画特效设计
  19. 部分opencv中的GPU加速函数(中文翻译)
  20. 基于逻辑回归模型对鸢尾花数据集进行分类

热门文章

  1. Privacy-Preserving Deep Learning via Additively Homomorphic Encryption
  2. (raspberry、bananapi)Archlinux 无法安装yaourt解决办法-----手工编译(不难)(适用于package-query找不到)
  3. Flex Builder 3 如何弹出“打开文件对话框”,限制选择文件类型
  4. 【转】 计算机视觉、图像处理学习资料汇总
  5. 又一重磅利好,海南撒10亿基金发展区块链技术
  6. vue二级路由不显示页面bug
  7. 某个section不想被gc-sections remove
  8. java 计算九宫格_Java计算手机九宫格锁屏图案连接9个点的方案总数
  9. 【WPS】WPS之如何给文件加密?
  10. 请试试看每天吃一碗;白头发不见了,给爸妈留