【机器学习】朴素贝叶斯解决实际问题

devtools/2024/10/18 18:25:15/

之前写过这样一道题:

现在换成使用朴素贝叶斯解决这个问题

首先先了解一下朴素贝叶斯

这是之前课本里的笔记记录:

机器学习笔记】朴素贝叶斯(从先验分布到后验分布)-CSDN博客

简单的讲解一下这道题需要的知识点


        朴素贝叶斯是一个基于贝叶斯定理的简单概率分类器,它假设给定目标值时特征之间的条件独立性。"朴素"这个词意味着这个模型在概率模型中忽略了特征之间的相互作用。

        它工作的方式如下:

        贝叶斯定理: 这是朴素贝叶斯分类器的核心,它提供了给定某个类别下观测到某些特征的概率。公式如下:

  在这里 P(A|B) 是在给定 B 的情况下 A 的概率, P(B|A)是在给定 A 的情况下观察到 B 的概率,P(A)和P(B)分别是 A 和 B 的边缘概率。

        条件独立性假设: 在给定目标类别的情况下,假设所有特征都是相互独立的。尽管这个假设在实际情况中很少成立,但朴素贝叶斯分类器在实践中表现得出奇地好,即使特征之间存在一定的依赖。

        训练: 在训练过程中,分类器会通过数据集计算特征与类别之间的关系,即每个类别下特征的条件概率。

        预测: 在预测时,它会使用这些概率和贝叶斯定理来预测未见实例的类别。对于每个类别,它会计算一个概率,并将实例分类到具有最高概率的类别。

        朴素贝叶斯分类器适用于多种分类任务,特别是文本分类。因为其计算效率很高,并且易于实现,所以在处理大型数据集时尤其受欢迎。此外,由于其对缺失数据不敏感,它也适用于不完整数据集。


        朴素贝叶斯算法是一种基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对于给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。

        我们要预测的新实例是:

        对于这个示例,我们要使用朴素贝叶斯算法来预测它是否属于类别N或P。

步骤如下:

1. 数据准备:
         数据集由不同天气情况的属性(Outlook, Temperature, Humidity, Windy)和一个类别标签(Class)组成。
         LabelEncoder被用来将文本数据转换为模型可以理解的数值数据。

2. 数据转换:
数据集中的每一行都被转换成数值格式,这一过程使用了之前拟合好的编码(`LabelEncoder`)。

3. 模型训练:
创建了GaussianNB分类器实例,并使用特征和对应的标签来训练它。

4. 新数据点的预测:
定义了一个新的数据点,表示今天的天气情况。
使用相同的编码器将新数据点转换为数值。
使用训练好的朴素贝叶斯模型对新数据点的类别进行预测。

5. 解码和输出结果:
使用class_encoder.inverse_transform方法将预测结果从数值转换回原始的类别标签。


根据解码后的标签输出预测结果,即今天是否会遇见所询问的人。

每一步都关键地支持了整个预测流程,确保数据以正确的格式输入模型,并且预测结果以人类可读的形式呈现。你的代码组织得很好,并且包含了从数据准备到结果输出的完整流程。

完整代码如下:

from sklearn.naive_bayes import GaussianNB
from sklearn.preprocessing import LabelEncoder# 数据准备
data = [["sunny", "hot", "high", False, "N"],["sunny", "hot", "high", True, "N"],["overcast", "hot", "high", False, "P"],["rain", "mild", "high", False, "P"],["rain", "cool", "normal", False, "P"],["rain", "cool", "normal", True, "N"],["overcast", "cool", "normal", True, "P"],["sunny", "mild", "high", False, "N"],["sunny", "cool", "normal", False, "P"],["rain", "mild", "normal", False, "P"],["sunny", "mild", "normal", True, "P"],["overcast", "mild", "high", True, "P"],["overcast", "hot", "normal", False, "P"],["rain", "mild", "high", True, "N"]
]# 转换数据集
outlook_encoder = LabelEncoder().fit(["sunny", "overcast", "rain"])
temperature_encoder = LabelEncoder().fit(["hot", "mild", "cool"])
humidity_encoder = LabelEncoder().fit(["high", "normal"])
windy_encoder = LabelEncoder().fit([False, True])
class_encoder = LabelEncoder().fit(["N", "P"])numerical_data = []
for row in data:numerical_row = [outlook_encoder.transform([row[0]])[0],temperature_encoder.transform([row[1]])[0],humidity_encoder.transform([row[2]])[0],windy_encoder.transform([row[3]])[0],class_encoder.transform([row[4]])[0]]numerical_data.append(numerical_row)# 分离特征和类别标签
features = [row[:-1] for row in numerical_data]
labels = [row[-1] for row in numerical_data]# 创建和训练朴素贝叶斯模型
nb = GaussianNB()
nb.fit(features, labels)# 预测新的数据点
new_point = ["rain", "hot", "high", False]
numerical_new_point = [outlook_encoder.transform([new_point[0]])[0],temperature_encoder.transform([new_point[1]])[0],humidity_encoder.transform([new_point[2]])[0],windy_encoder.transform([new_point[3]])[0]
]# 使用朴素贝叶斯进行预测
predicted_class = nb.predict([numerical_new_point])[0]# 解码预测结果
predicted_label = class_encoder.inverse_transform([predicted_class])[0]# 根据预测的标签输出结果
if predicted_label == 'P':print("今天会遇见ta吗: 能")
elif predicted_label == 'N':print("今天会遇见ta吗: 不能")

这是我的作业啊。。查重率我不怕 仅供学习和记录


http://www.ppmy.cn/devtools/14842.html

相关文章

【深度学习】Dropout、DropPath

一、Dropout 1. 概念 Dropout 在训练阶段会让当前层每个神经元以drop_prob( 0 ≤ drop_prob ≤ 1 0\leq\text{drop\_prob}\leq1 0≤drop_prob≤1)的概率失活并停止工作,效果如下图。 在测试阶段不会进行Dropout。由于不同批次、不同样本的神…

JavaScript 预解析

一、预解析 JavaScript解析器在运行JavaScript 代码的时候分为两步:预解析和代码执行。 (1)预解析 JS引擎会把JS里面所有的var 还有function 提升到当前作用域的最前面 (2)代码执行 按照书写顺序从上往下执行 二、变量预解析和函数预解析 预解析分为…

「React Native」为什么要选择 React Native 作为的跨端方案

文章目录 前言一、常见因素二、举个栗子2.1 项目背景2.2 为什么选择 React Native2.3 项目实施2.4 成果总结 前言 没有完美的跨端技术,只有适合的场景。脱离适用场景去谈跨端技术没有什么意义。 一、常见因素 共享代码库: React Native 允许开发者编写…

【中级软件设计师】上午题12-软件工程(2):单元测试、黑盒测试、白盒测试、软件运行与维护

【中级软件设计师】上午题12-软件工程(2) 1 系统测试1.1 单元测试1.2 集成测试1.2.1 自顶向下1.2.2 自顶向上1.2.3 回归测试 2 测试方法2.1 黑盒测试2.1.1 McCabe度量法 2.2 白盒测试2.2.1 语句覆盖-“每个流程”执行一次2.2.2 判定覆盖2.2.3 条件覆盖-A…

C++ Qt QMainWindow实现无边框窗口自定义标题栏可拖拽移动拉伸改变窗口大小

本篇博客介绍C Qt QMainWindow实现无边框窗口,适用于win10/win11系统。 QMainWindow相对于QWidget多了dockedwidget功能,跟多人可能更喜欢用QMainWindow做主窗口,如果不需要dockedwidget功能,QMainWindow与QWidget做主窗口基本无…

地形系统-unity3D地形的生成原理和地形表面贴图的混刷原理

Unity3D地形的生成原理是通过使用高度图来创建地形。高度图是一个灰度图像,其中每个像素的灰度值表示该位置的高度。在Unity中,可以使用工具或编程方式创建高度图,然后将其应用于地形对象。 地形表面贴图的混刷原理是通过将多个纹理图层叠加…

WordPress SQLite Docker 镜像封装细节

为了让大家用的放心,同时解答 GitHub 社区中的疑问。这篇文章聊聊上一篇文章的 Docker 容器封装细节。 写在前面 在前一篇文章《WordPress 告别 MySQL:Docker SQLite WordPress》中,如果你跟着文章实践,大概三分钟就能够启动一个…

C++必修:从C到C++的过渡(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C学习 贝蒂的主页:Betty’s blog 1. 缺省参数 1.1. 缺省参数的使用 缺省参数是声明或定义函数时为函数的参数指定…