朴素贝叶斯分类的python的实现

news2024/10/3 2:25:30

文章目录

  • 介绍
  • GaussianNB()参数介绍
    • 实例
  • BernoulliNB()参数介绍
    • 实例
  • MultinomialNB()参数介绍
    • 实例

作者:王乐

介绍

sklearn 是 scikit–learn 的简称,是一个基于 Python 的第三方模块。
sklearn 库集成了一些常用的机器学习方法,在进行机器学习任务时,并不需要实现算法,只需要简单的调用 sklearn 库中提供的模块就能完成大多数的机器学习任务。

在sklearn中,一共有3个朴素贝叶斯的分类算法类:
GaussianNB(先验是高斯分布的朴素贝叶斯);
BernoulliNB(先验为伯努利分布的朴素贝叶斯);
MultinomialNB(先验是多项式分布的朴素贝叶斯)。
高斯NB用于连续值;多项式NB用于离散的多值;伯努利NB用于离散的二值。

高斯朴素贝叶斯则常用于连续特征的情况下。高斯朴素贝叶斯假设特征满足高斯分布(正态分布)。 如特征为“某地高中生的身高”时,就使用高斯朴素贝叶斯。

实例化模型对象的时候,不需要对高斯朴素贝叶斯类输入任何的参数,可以说是一个非常轻量级的类,操作非常容易。
但过于简单也意味着贝叶斯没有太多的参数可以调整,因此贝叶斯算法的成长空间并不是太大,如果贝叶斯算法的效果不是太理想,我们一般都会考虑换模型。

GaussianNB()参数介绍

  GaussianNB(*, priors=None, var_smoothing=1e-09)

参数:

  • priors : array-like of shape (n_classes,),Prior probabilities of the classes. If specified the priors are not adjusted according to the data.
    先验:数组-(n_classes,)每一类的先验概率。如果指定先验概率,则不会根据数据调整先验概率。

  • var_smoothing : float, default=1e-9
    方差平滑:浮点数,默认=1e-9,为了计算稳定性而添加到方差中的所有特征的最大方差部分。

属性:

  • 类别数 class_count_:ndarray of shape (n_classes,),在每个类中观察到的训练样本数。

  • 类别先验概率 class_prior_:ndarray of shape (n_classes,),每个类别的先验概率。

  • 类标签 classes_:ndarray of shape (n_classes,),分类器已知的类标签。

  • epsilon_:浮点数,方差的绝对附加值。

  • sigma_ : ndarray of shape (n_classes, n_features),每类每个特征的方差

  • theta_ : ndarray of shape (n_classes, n_features),每类每个特征的平均值

实例

#导入鸢尾花数据集
from sklearn.datasets import load_iris #sklearn内置数据集sklearn
from sklearn import model_selection #拆分数据集【训练集测试集】
from sklearn.naive_bayes import GaussianNB #导入先验是高斯分布的朴素贝叶斯模型

iris=load_iris()
x=iris.data
y=iris.target
x_train,x_test,y_train,y_test=model_selection.train_test_split(x,y,test_size=0.3,random_state=123456) #random_state控制随机状态。


model=GaussianNB()  #模型为先验是高斯分布的朴素贝叶斯
model.fit(x_train,y_train) #拟合训练
predict=model.predict(x_test) #预测

from sklearn import metrics
from sklearn.metrics import classification_report 
print(classification_report(y_test,predict)) 
print(metrics.confusion_matrix(y_test, predict))#混淆矩阵
model.score(x_test,y_test)

# 混淆矩阵要表达的含义:

# 1、混淆矩阵的每一列代表了预测类别,每一列的总数表示预测为该类别的数据的数目;
# 2、每一行代表了数据的真实归属类别,每一行的数据总数表示该类别的数据实例的数目;每一列中的数值表示真实数据被预测为该类的数目。
# True Positive(TP):真正类。样本的真实类别是正类,并且模型识别的结果也是正类。
# False Negative(FN):假负类。样本的真实类别是正类,但是模型将其识别为负类。
# False Positive(FP):假正类。样本的真实类别是负类,但是模型将其识别为正类。
# True Negative(TN):真负类。样本的真实类别是负类,并且模型将其识别为负类。

在这里插入图片描述

BernoulliNB()参数介绍

BernoulliNB(*, alpha=1.0, binarize=1, fit_prior=True, class_prior=None)

参数:

  • alpha : float, default=1.0
    浮点数,平滑参数(0表示无平滑)。

  • binarize : float or None, default=0.0
    二进制化:浮点或无,默认值=0.0,样本特征二值化(映射到布尔值)的阈值。如果为“无”,则假定输入已由二进制矢量组成。

  • binarize:将数据特征二值化的阈值,大于此阈值为1,小于此阈值为0,(就多了一个参数,其他参数与多项式朴素贝叶斯相同)
    BernoulliNB实现了用于多元Bernoulli分布数据的朴素Bayes训练和分类算法;即,可能有多个特征,但每个特征都假定为二值(Bernoulli,boolean)变量。因此,此类算法要求样本以二值特征向量表示;如果传递任何其他类型的数据,BernoulliNB实例可以对其输入进行二值化(取决于binarize 参数)。

  • fit_prior : bool, default=True
    是否学习类先验概率。如果为假,将使用统一的先验。

  • class_prior : array-like of shape (n_classes,), default=None
    类的先验概率。如果指定,则不根据数据调整先验。

属性:

  • class_count_ : ndarray of shape (n_classes)
    拟合时每个类的样本数。该值由样本权重(当提供时)加权。
    训练样本中各类别对应的样本数,按类的顺序排序输出

  • class_log_prior_ : ndarray of shape (n_classes)
    每个类的对数概率(平滑) 各类标记的平滑先验概率对数值,其取值会受fit_prior和class_prior参数的影响

  • classes_ : ndarray of shape (n_classes,)
    分类器已知的类标签

  • feature_count_ : ndarray of shape (n_classes, n_features)
    拟合时每个(类、特征)的样本数。该值由样本权重(当提供时)加权。
    各类别各个特征出现的次数,返回形状为(n_classes, n_features)数组

  • feature_log_prob_ : ndarray of shape (n_classes, n_features)
    给定类的特征的经验对数概率
    给出一个类的特征条件概率P(xi | y)的对数值,返回形状为(n_classes, n_features)数组

  • coef_ : ndarray of shape (n_classes, n_features) 系数
    intercept_ : ndarray of shape (n_classes,) 截距

  • n_features_ : int
    整数 每个样本的特征数量。

实例

#例子

import numpy as np
from sklearn.datasets import make_blobs
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import BernoulliNB  # 伯努利贝叶斯: 专门用于处理(多元)二项分布
from sklearn.metrics import brier_score_loss  # 布里尔分数


class_1_samples = 500
class_2_samples = 500
centers = [[0.0, 0.0], [2.0, 2.0]]  # (1000,2)  ==>  centers = [[0.0, 0.0, 0.0], [2.0, 2.0, 2.0]] (1000, 3)
cluster_std = [0.5, 0.5]
X, y = make_blobs(n_samples=[class_1_samples, class_2_samples], centers=centers, cluster_std=cluster_std, random_state=42, shuffle=False)
print(X.shape)  # [1000, 2]
print(np.unique)  # array([0, 1])

Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, test_size=0.3, random_state=42)
print(Xtrain)#非二值化 变量特征们

mms = MinMaxScaler().fit(Xtrain)
Xtrain = mms.transform(Xtrain)
Xtest = mms.transform(Xtest)

bnl_ = BernoulliNB()
bnl_.fit(Xtrain, ytrain)  # 不设置二值化

print("不进行二值化的模型得分:")
print(bnl_.score(Xtest, ytest))

bnl = BernoulliNB(binarize=0.5) # 设置二值化阈值为0.5,将特征二值化【特征大于0.5,则为1;特征小于0.5,则为0  二值化处理结束】
bnl.fit(Xtrain, ytrain) 
print("二值化后的模型得分:")
print(bnl.score(Xtest, ytest))

brier_score_loss(ytest, bnl.predict_proba(Xtest)[:, 1], pos_label=1)


在这里插入图片描述

MultinomialNB()参数介绍

MultinomialNB(*, alpha=1.0, fit_prior=True, class_prior=None)  

多项式朴素贝叶斯分类器适用于具有离散特征的分类(例如,文本分类中的字数)。
多项式分布通常需要整数特征计数。然而,在实践中,分数计数(如tf-idf)也可以。

参数

  • alpha : float, default=1.0
    浮点数,平滑参数(0表示无平滑)

  • 平滑先验𝛼≥0,让学习样本中不存在的特征占一定的比例,并防止在进一步的计算中出现零概率。𝛼=1 时为拉普拉斯(Laplace)平滑,𝛼<1时为李德斯通(Lidstone)平滑。

  • fit_prior : bool, default=True
    是否学习类先验概率。如果为假,将使用统一的先验。

  • class_prior : array-like of shape (n_classes,), default=None
    类的先验概率。如果指定,则不根据数据调整先验。

属性(和伯努利一样的)

  • class_count_ : ndarray of shape (n_classes)
    拟合时每个类的样本数。该值由样本权重(当提供时)加权。

  • class_log_prior_ : ndarray of shape (n_classes)
    每个类的对数概率(平滑)

  • classes_ : ndarray of shape (n_classes,)
    分类器已知的类标签

  • coef_ : ndarray of shape (n_classes, n_features) 系数

  • feature_count_ : ndarray of shape (n_classes, n_features)
    拟合时每个(类、特征)的样本数。该值由样本权重(当提供时)加权。

  • feature_log_prob_ : ndarray of shape (n_classes, n_features)
    给定类的特征的经验对数概率

  • intercept_ : ndarray of shape (n_classes,) 截距

  • n_features_ : int
    整数 每个样本的特征数量

实例

#离散情况 多项式贝叶斯
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.preprocessing import KBinsDiscretizer  # 离散化
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import brier_score_loss  # 布里尔分数 : for bin_class


class_1_samples = 400
class_2_samples = 400
centers = [[0.0, 0.0], [2.0, 2.0]]  # (800,2) 
cluster_std = [0.5, 0.5]
X, y = make_blobs(n_samples=[class_1_samples, class_2_samples], centers=centers, cluster_std=cluster_std, random_state=42, shuffle=False)
print(X.shape)  # [800, 2]
print(np.unique)  # array([0, 1])

Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, test_size=0.3, random_state=42)


###使用KBinsDiscretizer离散化连续特征
kbs = KBinsDiscretizer(n_bins=10, encode="onehot")
kbs.fit(Xtrain)
Xtrain_ = kbs.transform(Xtrain)
Xtest_ = kbs.transform(Xtest)
print(Xtrain_.shape)  


mnb = MultinomialNB()
mnb.fit(Xtrain_, ytrain)
print("Accuracy score:", mnb.score(Xtest_, ytest))
print("Brier score:", brier_score_loss(ytest, mnb.predict_proba(Xtest_)[:, 1], pos_label=1))# 越接近 0 越好;
print(mnb.feature_log_prob_, mnb.feature_log_prob_.shape, np.exp(mnb.feature_log_prob_).sum(1))  # 一个固定标签类别下的每个特征的对数概率


在这里插入图片描述

#导入鸢尾花数据集
from sklearn.datasets import load_iris #sklearn内置数据集sklearn
iris=load_iris()
x=iris.data
y=iris.target
from sklearn import model_selection #拆分数据集【训练集测试集】
x_train,x_test,y_train,y_test=model_selection.train_test_split(x,y,test_size=0.3,random_state=123456) 
model=MultinomialNB()  #模型为先验是多项式分布的朴素贝叶斯
model.fit(x_train,y_train) #拟合训练
predict=model.predict(x_test) #预测

from sklearn import metrics
from sklearn.metrics import classification_report 
print(classification_report(y_test,predict)) 
print(metrics.confusion_matrix(y_test, predict))

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/127665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 并发编程解析 | 如何正确理解Java领域中的并发锁,我们应该具体掌握到什么程度?

写在开头 对于Java领域中的锁&#xff0c;其实从接触Java至今&#xff0c;我相信每一位Java Developer都会有这样的一个感觉&#xff1f;不论是Java对锁的实现还是应用&#xff0c;真的是一种“群英荟萃”&#xff0c;而且每一种锁都有点各有各的驴&#xff0c;各有各的本&…

#P13787. [NOIP2021] 报数

目录 一&#xff0c;题目 二&#xff0c;题意分析 三&#xff0c;做法 1.直接模拟题意 2&#xff0c;用筛法来解 3&#xff0c;正解(加上记忆化) 一&#xff0c;题目 二&#xff0c;题意分析 题目意思是说:每次输入一个数,然后先判断这个数是否为某一个十进制中包含7的数…

Redis 为什么这么快?

1.基于内存实现 Redis 是基于内存的数据库&#xff0c;跟磁盘数据库相比&#xff0c;完全吊打磁盘的速度。 2.高效的数据结构 Redis 一共有 5 种数据类型&#xff0c;String、List、Hash、Set、SortedSet。 不同的数据类型底层使用了一种或者多种数据结构来支撑&#xff0c;目的…

如何选择适合自己的进销存系统软件?

选择一款合适的进销存软件&#xff0c;可以有效解决企业生产经营中业务管理、分销管理、存货管理、营销计划的执行和监控、统计信息的收集等方面的业务问题。 进销存软件一直是一个热门话题&#xff0c;别急&#xff0c;我这就来给你介绍。 一、进销存管理软件 这里我要推荐…

计算机系统概述

计算机系统概述一、操作系统的概念1、定义2、功能和目标二 、操作系统特征1、并发性2、共享性3、虚拟性4、异步性三、操作系统的发展1、手工操作阶段2、批处理阶段——单道批处理系统2、批处理阶段——多道批处理系统3、实时操作系统四、运行机制和体系结构1、运行机制①指令②…

Gitea 的邮件通知

有这样的一个需求&#xff0c;当仓库中被推送或者更新代码的时候&#xff0c;希望在邮件中收到邮件通知。 Gitea 是可以实现这个功能的&#xff0c;但是在默认情况下这个功能是关闭的。 修改配置文件 根据 Gitea 的安装不同&#xff0c;我们的配置文件在&#xff1a;vi /etc…

【正点原子FPGA连载】第六章Petalinux设计流程实战摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第六章Petalinux…

【CS硕士三年级BetterBench】2022年终总结(脚踏实地,仰望星空)

2022年终总结 回忆录 2022年焦虑和快乐是这一年中最大的两种情绪了。焦虑主要是因为心里的三块石头&#xff0c;从年初就开始悬着。第一块石头&#xff0c;科研论文录用&#xff0c;第二个石头&#xff0c;拿到国奖&#xff0c;第三个石头是拿到满意的offer。目前只剩下最后一…

【Linux】多文件编译

目录 多文件编译 为什么要分两步编译&#xff1a; makefile文件 makefile里面安装 更改可调式版本 对比Windows中的VS 多文件编译 有以下文件 分两步&#xff1a; 第一步编译&#xff1a;.c->.o 第二步链接&#xff08;可以不用写头文件&#xff09;&#xff1a;.o-…

《图解TCP/IP》阅读笔记(第九章)—— 网络安全相关

第九章 网络安全 本章旨在介绍互联网中网络安全的重要性及其相关的实现技术。 本章的内容在我看来&#xff0c;并没有前几章那么重要&#xff0c;大概有所了解就好。 9.1 TCP/IP与网络安全 起初&#xff0c;TCP/IP只用于一个相对封闭的环境&#xff0c;后来才发展为并无太多…

Python编程 匿名函数,高阶函数

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.匿名函数 1.匿名函数介绍 匿名函数应用 匿名函数作返回值 匿名函数作…

【数据结构】超详细!从HashMap到ConcurrentMap,我是如何一步步实现线程安全的!

什么是HashMap&#xff1f; 在了解 HashMap 之前先了解一下什么是 Map&#xff1b; 什么是Map&#xff1f; 定义 Map 是一个用于存储 Key-Value 键值对的集合类&#xff0c;也就是一组键值对的映射&#xff0c;在 Java 中 Map 是一个接口&#xff0c;是和 Collection 接口同…

注解@Resource,注解@Qualifier

1.在进⾏类注⼊时&#xff0c;除了可以使⽤ Autowired 关键字之外&#xff0c;我们还可以使⽤ Resource 进⾏注⼊&#xff0c;如下代码所示&#xff1a; 运行结果&#xff1a; Autowired 和 Resource 的区别 出身不同&#xff1a;Autowired 来⾃于 Spring&#xff0c;⽽ Reso…

拾遗增补(二)——线程组

目录1.线程关联线程组&#xff1a;1级关联2.线程对象关联线程组&#xff1a;多级关联3.线程组自动归属特性4.获取根线程组5.线程组里加线程组6.组内的线程的批量停止7.递归与非递归取得组内对象可以把线程归属到某一个线程组中&#xff0c;线程组中可以有线程对象&#xff0c;也…

58.Python的递归函数

58.Python的递归函数 文章目录58.Python的递归函数1.递归的形象解释2.定义3.步骤4.终止条件5.优点6.缺点7.调用深度8.课堂实例9.计算n的阶乘9.1什么是阶乘9.2计算5&#xff01;1.递归的形象解释 我们首先看一段视频&#xff0c;来形象理解什么是递归。 视频作者&#xff1a;p…

完整的OpenDDS的发布订阅编写及源码(Windows)

一个完整的OpenDDS的发布订阅编写及源码,包括SimuMsg.idl、SimuMsg.mwc和SimuMsg.mpc,SimuMsgCommon_Export.h、publisher.cpp、subscriber.cpp、SimuMsgDataReaderListenerImpl.h和SimuMsgDataReaderListenerImpl.cpp、SimuMsgDataWriterListenerImpl.h和SimuMsgDataWriterL…

还有企业没有在用它嘛! 适配于多行业的管理系统,各企业之首选

在信息技术高速发展的现代社会&#xff0c;世界经济一体化和企业经营全球化已成为大势所趋。在此背景下&#xff0c;企业为增强自身的竞争力&#xff0c;就要强化管理&#xff0c;规范业务流程&#xff0c;提高透明度&#xff0c;加快商品资金周转&#xff0c;以及为流通领域信…

使用MariaDB线程池提高MySQL的扩展性

摘要&#xff1a;MySQL的线程池能够有效地解决大量短连接的性能问题&#xff0c;大幅提高MySQL数据库的扩展性。但官方MySQL的线程池在收费的企业版中才有&#xff0c;免费的社区版中没有这个功能&#xff0c;这里介绍MairaDB的线程池。 关于作者&#xff0c;姚远&#xff1a;…

不用梯子,GitHub也能访问并提速

引言 我们都知道国内访问github会非常慢&#xff0c;甚至打不开&#xff0c;具体原因这里就不聊了~我们这里聊怎么不用梯子&#xff0c;GitHub也能访问并提速&#xff01; Github打开慢的原因 Github打开慢的原因其中一个原因&#xff1a;GitHub的CDN域名遭到DNS污染&#xf…

好用的开源个人博客推荐

原文网址&#xff1a;好用的开源个人博客推荐_IT利刃出鞘的博客-CSDN博客 简介 本文推荐个人从几十款开源个人博客中精选的几款开源博客。 halo Github 地址 &#xff1a;https://github.com/halo-dev/halo Star : 24.3k 简介 &#xff1a;一个优秀的开源博客应用。 技术 …