Python从0到100(五十九):机器学习-朴素贝叶斯分类及鸢尾花分类

朴素⻉叶斯(Naive Bayes)是⼀种基于⻉叶斯定理的概率统计分类算法,常⽤于⽂本分类和多类别分类问题。它的基本原理是基于特征之间的条件独⽴性假设,因此称为"朴素"⻉叶斯。该算法通过计算给定类别的特征条件概率来进⾏分类。下⾯是朴素⻉叶斯的基本原理:

1.基本原理

给定⼀个分类任务,我们希望找到⼀个类别标签(或类别的概率分布),使得给定特征数据集X的条件下,该类别标签的概率最⼤。根据⻉叶斯定理:
在这里插入图片描述
其中:

  • P(Y|X)是在给定X的条件下Y的概率。
  • P(X|Y)是在给定Y的条件下X的概率。
  • P(Y)是Y的先验概率。
  • P(X)是X的概率。

朴素⻉叶斯算法的关键假设是,特征之间是条件独⽴的,这意味着给定类别Y的情况下,每个特征Xi之间是独⽴的。这个假设⼤⼤简化了计算,但在实际应⽤中可能并不总是成⽴。然⽽,朴素⻉叶斯在许多情况下表现良好。

2.朴素贝叶斯分类

基于Python的朴素⻉叶斯分类的简单示例,使⽤Scikit-learn库。演示⽂本分类任务,将⽂本评论分为积极和消极两类。

# -*- coding: utf-8 -*-

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 扩充后的示例?本数据集
corpus = [
"这部电影⾮常精彩,我喜欢它。",
"这个电影很糟糕,我讨厌它。",
"这是⼀个很好的书。",
"这个故事令⼈沮丧。",
"我不推荐这部电影。",
"这家餐厅的⻝物很美味。",
"这部电视剧拖沓⽆味,不值得⼀看。",
"这⾸歌让我⼼情愉快。",
"这款⼿机操作复杂,⽤户体验很差。",
"她的表演真是令⼈印象深刻。",
"这个游戏太刺激了,⾮常好玩。",
"这本新出的⼩说⾮常难以⼊⼿。",
"我喜欢这个乐队的每⼀⾸歌。",
"这次旅⾏很糟,酒店条件⾮常差。",
"这款笔记本电脑的性能超出了我的期望。",
"电影院的座位⾮常不舒服。",
"这个演讲⾮常有启发性和教育意义。",
"这部科幻⼩说的剧情紧凑,引⼈⼊胜。",
"这款洗发⽔根本不起泡沫,浪费钱。",
"这部历史书籍写得⽣动,让⼈仿佛穿越了时空。"
]
labels = [1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1] # 1表示积极,0表示消极
# ?本向量化
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(X)
# 拆分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.2, random_state=42)
# print(X_train.shape, X_test.shape)
print(y_train)
print(X_test)
print(y_train)
print(y_test)
# 创建朴素叶斯分类器
nb_classifier = MultinomialNB()
# 训练模型
nb_classifier.fit(X_train, y_train)
# 进?预测
y_pred = nb_classifier.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率: {accuracy}")
# 预测新评论
new_reviews = ["这本书很有趣。", "不值得⼀看。"]
new_reviews_vec = vectorizer.transform(new_reviews)
new_predictions = nb_classifier.predict(new_reviews_vec)
for review, prediction in zip(new_reviews, new_predictions):
    print(f"评论: {review},预测结果: {'积极' if prediction == 1 else '消极'}")

3.优缺点

优点:

  1. 简单⾼效:朴素⻉叶斯算法简单易懂,计算效率⾼。
  2. 对⼩规模数据表现良好:在⼩规模数据集上,朴素⻉叶斯通常表现很好,且不容易过拟合。
  3. 适⽤于多分类问题:朴素⻉叶斯可以处理多分类问题,并且对类别不平衡的数据集也⽐较有效。

缺点:

  1. 对特征之间的依赖关系做了过强的假设:朴素⻉叶斯假设特征之间是相互独⽴的,这在某些情况下可能不成
    ⽴,导致分类性能下降。
  2. 对输⼊数据的分布假设较强:朴素⻉叶斯通常假设输⼊特征的分布是正态分布,这在实际应⽤中可能不成
    ⽴。
  3. ⽆法处理连续型特征:由于朴素⻉叶斯算法基于概率模型,因此不能直接处理连续型特征,需要进⾏离散化
    处理

4.适用场景

朴素⻉叶斯适⽤于以下场景:

  1. ⽂本分类:朴素⻉叶斯在⽂本分类任务中表现优异,尤其是处理⼤规模的⽂本数据。
  2. 垃圾邮件过滤:朴素⻉叶斯可以有效地过滤垃圾邮件,减少⽤户收到的垃圾邮件数量。
  3. 多分类问题:朴素⻉叶斯适⽤于多分类问题,对类别不平衡的数据集也有⼀定的鲁棒性。

朴素⻉叶斯是⼀种简单⽽有效的分类算法,尤其适⽤于⽂本分类和多分类问题。然⽽,在处理特征之间存在依赖关系的情况下,朴素⻉叶斯的性能可能会受到影响。

5.朴素贝叶斯算法来对鸢尾花进行分类

基于开源数据集的朴素⻉叶斯实例代码,使⽤的数据集是鸢尾花数据集(Iris dataset),使⽤朴素⻉叶斯算法来对鸢尾花进⾏分类:

# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, confusion_matrix
import seaborn as sns
# 加载鸢尾花数据集
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.2, random_state=42)
# 构建朴素⻉叶斯模型
nb = GaussianNB()
nb.fit(X_train, y_train)
# 在测试集上进⾏预测
y_pred = nb.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
# 绘制混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, cmap='Blues', fmt='d')
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.title('Confusion Matrix')
plt.show()
# 绘制特征的概率密度估计图
plt.figure(figsize=(16, 8))
for i in range(4):
    plt.subplot(2, 2, i+1)
    sns.histplot(X_train[:, i], kde=True, color='skyblue', label='Train', alpha=0.6)
    sns.histplot(X_test[:, i], kde=True, color='salmon', label='Test', alpha=0.6)
    plt.title(f'Feature {i+1} Distribution')
    plt.xlabel('Feature Value')
    plt.ylabel('Density')
    plt.legend()
plt.tight_layout()
plt.show()

在这个例⼦中,⾸先加载了鸢尾花数据集,并划分了训练集和测试集。然后构建⼀个朴素⻉叶斯分类器,并在测试集上进⾏了预测。接着,计算了模型的准确率,并绘制了混淆矩阵来评估模型的性能:
在这里插入图片描述

最后,绘制了特征的概率密度估计图,展示了训练集和测试集中特征的分布情况:
概率密度图是一种统计图表,用于显示数据的概率分布。在概率密度图中,数据的取值范围被划分成多个小区间,每个区间内的数据点数被用来估计该区间的概率密度。
该数据集包含四个特征(如萼片长度、萼片宽度、花瓣长度和花瓣宽度)。因此,绘制了四个特征的概率密度图:

  1. 特征1(萼片长度):第一个子图显示了训练集和测试集中萼片长度的概率密度分布。
  2. 特征2(萼片宽度):第二个子图显示了训练集和测试集中萼片宽度的概率密度分布。
  3. 特征3(花瓣长度):第三个子图显示了训练集和测试集中花瓣长度的概率密度分布。
  4. 特征4(花瓣宽度):第四个子图显示了训练集和测试集中花瓣宽度的概率密度分布。

使用了seaborn.histplot函数绘制每个特征的概率密度图,并通过kde=True参数添加了核密度估计(KDE),这样可以更平滑地展示数据的分布情况。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是Dream呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值