一、朴素贝叶斯算法概述

朴素贝叶斯(Naive Bayes)是一种基于贝叶斯定理的简单概率分类算法,它假设特征之间相互独立("朴素"的含义)。尽管这个假设在现实中很少成立,但该算法在许多实际应用中表现优异,特别是在文本分类领域。

1.1 贝叶斯定理回顾

贝叶斯定理的数学表达式为:

 

其中:

  • P(A|B) 是后验概率

  • P(B|A) 是似然

  • P(A) 是先验概率

  • P(B) 是边际概率

1.2 朴素贝叶斯分类器

对于分类问题,我们可以将贝叶斯定理改写为:

 

其中X是特征向量(x₁, x₂, ..., xₙ)。由于朴素贝叶斯假设特征间相互独立,因此: 

 

二、scikit-learn中的朴素贝叶斯实现

scikit-learn提供了三种主要的朴素贝叶斯分类器变体:

  1. GaussianNB:用于连续数据,假设特征服从正态分布

  2. MultinomialNB:用于离散计数数据,如文本分类中的词频

  3. BernoulliNB:适用于二元/布尔特征数据

2.1 GaussianNB API详解

参数说明
class sklearn.naive_bayes.GaussianNB(*, priors=None, var_smoothing=1e-09)
  • priors:类的先验概率。如果指定,则不根据数据调整先验

  • var_smoothing:所有特征的最大方差部分,添加到方差计算中以提高数值稳定性

属性说明
  • class_prior_:每个类的概率

  • class_count_:每个类的训练样本数量

  • theta_:每个类每个特征的均值

  • sigma_:每个类每个特征的方差

  • epsilon_:方差的绝对加值

示例代码
from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载数据集
iris = load_iris()
X = iris.data  # 特征矩阵
y = iris.target  # 目标向量# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 创建高斯朴素贝叶斯分类器
gnb = GaussianNB(priors=None,  # 不指定先验概率,让模型从数据中学习var_smoothing=1e-9  # 默认值
)# 训练模型
gnb.fit(X_train, y_train)# 预测测试集
y_pred = gnb.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率: {accuracy:.2f}")# 查看模型参数
print("\n类先验概率:", gnb.class_prior_)
print("\n每个类的样本数量:", gnb.class_count_)
print("\n每个特征的均值:\n", gnb.theta_)
print("\n每个特征的方差:\n", gnb.sigma_)

2.2 MultinomialNB API详解

参数说明
class sklearn.naive_bayes.MultinomialNB(*, alpha=1.0, fit_prior=True, class_prior=None)
  • alpha:平滑参数(拉普拉斯/Lidstone平滑),默认为1.0

  • fit_prior:是否学习类的先验概率。若为False,则使用统一先验

  • class_prior:类的先验概率。如果指定,则不根据数据调整先验

属性说明
  • class_log_prior_:每个类的对数概率

  • feature_log_prob_:给定类别的特征(对数)概率

  • class_count_:每个类的训练样本数量

  • feature_count_:每个类每个特征的数量

示例代码
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.datasets import fetch_20newsgroups
from sklearn.metrics import classification_report# 加载20个新闻组数据集
categories = ['alt.atheism', 'soc.religion.christian', 'comp.graphics', 'sci.med']
newsgroups_train = fetch_20newsgroups(subset='train', categories=categories)
newsgroups_test = fetch_20newsgroups(subset='test', categories=categories)# 将文本转换为词频向量
vectorizer = CountVectorizer()
X_train = vectorizer.fit_transform(newsgroups_train.data)
X_test = vectorizer.transform(newsgroups_test.data)
y_train = newsgroups_train.target
y_test = newsgroups_test.target# 创建多项式朴素贝叶斯分类器
mnb = MultinomialNB(alpha=1.0,  # 拉普拉斯平滑fit_prior=True,  # 学习类先验概率class_prior=None  # 不指定先验
)# 训练模型
mnb.fit(X_train, y_train)# 预测测试集
y_pred = mnb.predict(X_test)# 打印分类报告
print(classification_report(y_test, y_pred, target_names=newsgroups_train.target_names))# 查看模型参数
print("\n类对数概率:", mnb.class_log_prior_)
print("\n特征对数概率形状:", mnb.feature_log_prob_.shape)

2.3 BernoulliNB API详解

参数说明
class sklearn.naive_bayes.BernoulliNB(*, alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)
  • alpha:平滑参数,默认为1.0

  • binarize:将特征二值化的阈值。None表示假设输入已经由二进制向量组成

  • fit_prior:是否学习类的先验概率

  • class_prior:类的先验概率

属性说明
  • class_log_prior_:每个类的对数概率

  • feature_log_prob_:给定类别的特征(对数)概率

  • class_count_:每个类的训练样本数量

  • feature_count_:每个类每个特征的数量

示例代码
from sklearn.naive_bayes import BernoulliNB
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.datasets import fetch_20newsgroups
from sklearn.metrics import accuracy_score# 加载数据
categories = ['alt.atheism', 'soc.religion.christian']
newsgroups_train = fetch_20newsgroups(subset='train', categories=categories)
newsgroups_test = fetch_20newsgroups(subset='test', categories=categories)# 将文本转换为二进制特征向量(出现/不出现)
vectorizer = CountVectorizer(binary=True)
X_train = vectorizer.fit_transform(newsgroups_train.data)
X_test = vectorizer.transform(newsgroups_test.data)
y_train = newsgroups_train.target
y_test = newsgroups_test.target# 创建伯努利朴素贝叶斯分类器
bnb = BernoulliNB(alpha=1.0,  # 平滑参数binarize=None,  # 数据已经是二进制的fit_prior=True  # 学习类先验
)# 训练模型
bnb.fit(X_train, y_train)# 预测测试集
y_pred = bnb.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率: {accuracy:.2f}")# 查看模型参数
print("\n类对数概率:", bnb.class_log_prior_)
print("\n特征对数概率形状:", bnb.feature_log_prob_.shape)

三、朴素贝叶斯实战案例:垃圾邮件分类

3.1 数据准备

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer# 加载数据集
# 假设我们有一个CSV文件,包含"text"列和"label"列(0=正常邮件,1=垃圾邮件)
data = pd.read_csv('spam_dataset.csv')# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data['text'], data['label'], test_size=0.2, random_state=42
)# 使用TF-IDF向量化文本
vectorizer = TfidfVectorizer(max_features=5000,  # 只使用前5000个最常见的词stop_words='english',  # 移除英文停用词ngram_range=(1, 2)  # 使用单个词和双词组合
)X_train_vec = vectorizer.fit_transform(X_train)
X_test_vec = vectorizer.transform(X_test)

3.2 模型训练与评估 

from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score# 创建并训练模型
model = MultinomialNB(alpha=0.1)  # 使用较小的平滑参数
model.fit(X_train_vec, y_train)# 预测测试集
y_pred = model.predict(X_test_vec)
y_pred_proba = model.predict_proba(X_test_vec)[:, 1]  # 预测为垃圾邮件的概率# 评估模型
print("分类报告:")
print(classification_report(y_test, y_pred))print("\n混淆矩阵:")
print(confusion_matrix(y_test, y_pred))print(f"\nAUC分数: {roc_auc_score(y_test, y_pred_proba):.4f}")

3.3 模型解释 

import numpy as np# 获取特征名称
feature_names = np.array(vectorizer.get_feature_names_out())# 找出对"垃圾邮件"分类最重要的特征
spam_log_prob = model.feature_log_prob_[1, :]  # 垃圾邮件类的特征对数概率
ham_log_prob = model.feature_log_prob_[0, :]  # 正常邮件类的特征对数概率# 计算对数概率比
log_prob_ratio = spam_log_prob - ham_log_prob# 获取最重要的20个特征
top_20_spam_indices = log_prob_ratio.argsort()[-20:][::-1]
top_20_spam_features = feature_names[top_20_spam_indices]
top_20_spam_scores = log_prob_ratio[top_20_spam_indices]print("最重要的20个垃圾邮件特征:")
for feature, score in zip(top_20_spam_features, top_20_spam_scores):print(f"{feature}: {score:.2f}")

四、朴素贝叶斯的优缺点

4.1 优点

  1. 简单高效:训练和预测速度都非常快

  2. 对小规模数据表现良好:即使数据量较少也能工作得不错

  3. 适合高维数据:特别是文本分类等场景

  4. 可解释性强:可以轻松查看哪些特征对分类贡献最大

4.2 缺点

  1. 特征独立性假设:现实中特征往往相关,这可能导致性能下降

  2. 对输入数据分布敏感:如果数据分布与假设不符(如非高斯分布使用GaussianNB),性能会受影响

  3. 零概率问题:测试集中出现训练集中未出现的类别时,概率为0

五、常见问题与解决方案

5.1 如何处理连续特征?

  • 使用GaussianNB,它假设连续特征服从正态分布

  • 对特征进行离散化(分箱),然后使用MultinomialNB或BernoulliNB

  • 进行数据变换使其更接近正态分布

5.2 如何解决零概率问题?

  • 使用平滑技术(如拉普拉斯平滑)

  • 添加伪计数

  • 使用back-off模型

5.3 如何选择朴素贝叶斯变体?

  • 文本数据:通常使用MultinomialNB

  • 二进制/布尔特征:使用BernoulliNB

  • 连续特征:使用GaussianNB

六、总结

朴素贝叶斯是一种简单但强大的分类算法,特别适合文本分类和高维数据。通过scikit-learn提供的API,我们可以轻松实现不同变体的朴素贝叶斯分类器。虽然它有特征独立性假设的局限性,但在许多实际应用中仍然表现优异。

在实践中,建议:

  1. 根据数据类型选择合适的朴素贝叶斯变体

  2. 调整平滑参数以获得更好的性能

  3. 结合TF-IDF等文本特征提取方法处理文本数据

  4. 使用交叉验证评估模型性能

希望本篇博客能帮助你理解和应用朴素贝叶斯分类器!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python协程:yield实现协程执行、生成器取值的三种方式

yield关键字执行流程 注意:yield关键字的调用次数如果超过了任务执行次数会报错,提示stopiteration异常,例如 正常范围内的任务执行 # 定义一个任务(函数1) def task1():for i in range(3):print(f----task1 i {i}-…

pdf删除一页 python实现(已验证)

首先安装库 使用PyPDF2 首先,确保你已经安装了PyPDF2。如果没有安装,可以通过pip安装: pip install PyPDF2 然后运行 import PyPDF2def remove_page(input_pdf_path, output_pdf_path, page_number_to_remove):# 打开PDF文件with open(i…

2025.1版本PyCharam找不到已存在的conda虚拟环境

前言 创建Python项目指定conda虚拟环境是最常用的操作,我下载的2025.1版本PyCharam编译器找不到我已经创建好的conda虚拟环境,解决方法如下 目录 问题描述 问题解决 总结 问题描述 我使用2025.1版本PyCharam编译器创建项目指定已经存在的虚拟环境出现如下情景 说是我没有…

开机启动项在哪里设置 实用步骤分享

电脑开机时,系统会自动运行一系列程序,其中包括必要的系统进程和用户自行添加的启动项。然而,过多的启动项可能会导致开机速度变慢,影响系统性能。因此,合理管理开机启动项,可以优化电脑的运行效率。电脑开…

LeetCode--39.组合总和

前引:明天就考最后一趟考试,最近考试周,我时时断更,从明天开始,就会一直更新了,可以期待一下 解题思路: 1.获取信息: 给定一个无重复的整数数组和一个目标值 从数组中选取任意数量的…

Visual Studio2022和C++opencv的配置保姆级教程

1.c桌面开发和windows平台开发(Visual Studio2022安装时) 2.下载OPenCV 3.系统属性→添加环境变量→Path 4.VS2022配置opencv 5.项目→属性→VC目录中的包含目录和库目录 5.项目→属性→VC目录中的包含目录和库目录 包含 目录添加: D:\…

使用Ansible的playbook安装HTTP

实验环境 安装好ansible 一、准备测试服务(192.168.10.41) 1、安装HTTP服务 dnf -y install httpd 2、启动HTTP服务 systemctl start httpd 3、使用浏览器访问 192.168.10.41 因为开启了防火墙,所有无法访问 4、开放防火墙的80端口 …

V少JS基础班之第六弹

一、 前言 第六弹内容是闭包。 距离上次函数的发布已经过去了一个多月, 最近事情比较多,很少有时间去写文章, 低质量还得保证所以本章放草稿箱一个月了,终于补齐了,其实还有很多细节要展开说明,想着拖太久…

【面板数据】全国高频交易明细数据(2000-2024.7)

中国土地交易市场作为国家宏观调控的重要组成部分,其通过市场机制,使土地使用权在不同主体间流转,将土地资源配置给最具利用效率的部门或企业,提升土地利用率和经济产出。中国土地高频交易明细数据汇集了全国范围内2000-2024年7月…

MongoDB 常用增删改查方法及示例

MongoDB 的增删改查(CRUD)操作是其核心功能,主要通过 mongo shell 或驱动(如 Node.js、Python 等)实现。以下是最常用操作的详细说明及示例(基于 mongo shell 语法)。 ​一、插入操作&#xff…

moodle升级(4.5到5.0)

升级目标 由Moodle 4.5 (Build: 20241129) 升级到Moodle 5.0.1 (Build: 20250629) 参考教程:moodle升级(详细版)-CSDN博客 操作平台:宝塔 通过宝塔进行备份 备份文件 将/www/wwwroot/moodle 和/www/wwwroot/moodledata 复制…

基于Apache POI实现百度POI分类快速导入PostgreSQL数据库实战

## 引言:POI数据的价值与挑战 POI(Point of Interest)数据作为地理信息系统的核心要素,在智慧城市、位置服务、商业分析等领域具有重要价值。百度POI数据包含了丰富的地点信息(如名称、类别、坐标等),但如何高效处理这些数据并将其导入数据库进行分析是开发者面临的挑战…

linux LAMP 3

[rootcode apache2]# bin/apachectl AH00558: httpd: Could not reliably determine the server’s fully qualified domain name, using fe80::20c:29ff:fe2a:708a. Set the ‘ServerName’ directive globally to suppress this message root192.168.235.5s password:┌─…

UI自动化-Selenium WebDriver

前言 Selenium WebDriver 是 Selenium 项目中最核心、最强大的组件,它是一个用于自动化控制网页浏览器的开源 API(应用程序编程接口)。 简单来说,Selenium WebDriver 就是一个允许你用编程语言(如 Java、Python、C#、…

具身多模态大模型在感知与交互方面的综述

引言在本学期方老师的《机器人与大模型》课上,我首次接触到了关于具身智能的前沿知识,尤其作为课上交互组的成员,从表情识别到语音交互到机械狗的开发实践进行了一些有意思的探索,使我在其中感受到了具身智能的巨大魅力和无限潜力…

UI 设计|审美积累 | 拟物化风格(Skeuomorphism)

拟物化是指把现实世界的材质、光影和结构带到数字界面中。木纹、金属、皮革、纸张等真实物体的质感,被细致地还原到屏幕上,让用户一眼就明白元素的意义与操作方式。它曾是iOS6之前移动端设计的主流风格,也一度被极简风格取代,但在…

EventBridge精准之道:CloudTrail事件 vs. 服务原生事件,我该如何选?

当我们深入使用AWS EventBridge时,常常会发现一个有趣的现象:对于同一个操作(比如启动一个EC2实例),EventBridge中似乎会出现两种事件。一种来自CloudTrail,记录了API调用的行为;另一种则直接来…

【算法】动态规划 斐波那契类型: 740. 删除并获得点数

740. 删除并获得点数 中等 题目 给你一个整数数组 nums ,你可以对它进行一些操作。 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] 1 的元素。 开始你…

AWS MySQL 读写分离配置指南

# AWS JDBC Wrapper读写分离配置实战:Spring Boot MyBatis Plus完整解决方案 ## 前言 在微服务架构中,数据库读写分离是提升系统性能的重要手段。本文将详细介绍如何在Spring Boot项目中使用AWS JDBC Wrapper实现自动读写分离,重点解决MyBat…

opencv检测运动物体

检测到的所有移动物体中轮廓中找到面积最大的轮廓&#xff0c;并绘制这个轮廓的矩形框。 #include <opencv2/opencv.hpp> #include <iostream>int main() {// 打开视频文件或摄像头cv::VideoCapture capture;capture.open("move3.mp4"); // 打开视频文件…