Python从0到100(五十九):机器学习-朴素贝叶斯分类及鸢尾花分类
前言:
零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学习学习和学业的先行者!
欢迎大家订阅专栏:零基础学Python: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.优缺点
优点:
- 简单⾼效:朴素⻉叶斯算法简单易懂,计算效率⾼。
- 对⼩规模数据表现良好:在⼩规模数据集上,朴素⻉叶斯通常表现很好,且不容易过拟合。
- 适⽤于多分类问题:朴素⻉叶斯可以处理多分类问题,并且对类别不平衡的数据集也⽐较有效。
缺点:
- 对特征之间的依赖关系做了过强的假设:朴素⻉叶斯假设特征之间是相互独⽴的,这在某些情况下可能不成
⽴,导致分类性能下降。 - 对输⼊数据的分布假设较强:朴素⻉叶斯通常假设输⼊特征的分布是正态分布,这在实际应⽤中可能不成
⽴。 - ⽆法处理连续型特征:由于朴素⻉叶斯算法基于概率模型,因此不能直接处理连续型特征,需要进⾏离散化
处理
4.适用场景
朴素⻉叶斯适⽤于以下场景:
- ⽂本分类:朴素⻉叶斯在⽂本分类任务中表现优异,尤其是处理⼤规模的⽂本数据。
- 垃圾邮件过滤:朴素⻉叶斯可以有效地过滤垃圾邮件,减少⽤户收到的垃圾邮件数量。
- 多分类问题:朴素⻉叶斯适⽤于多分类问题,对类别不平衡的数据集也有⼀定的鲁棒性。
朴素⻉叶斯是⼀种简单⽽有效的分类算法,尤其适⽤于⽂本分类和多分类问题。然⽽,在处理特征之间存在依赖关系的情况下,朴素⻉叶斯的性能可能会受到影响。
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(萼片长度):第一个子图显示了训练集和测试集中萼片长度的概率密度分布。
- 特征2(萼片宽度):第二个子图显示了训练集和测试集中萼片宽度的概率密度分布。
- 特征3(花瓣长度):第三个子图显示了训练集和测试集中花瓣长度的概率密度分布。
- 特征4(花瓣宽度):第四个子图显示了训练集和测试集中花瓣宽度的概率密度分布。
使用了seaborn.histplot
函数绘制每个特征的概率密度图,并通过kde=True
参数添加了核密度估计(KDE),这样可以更平滑地展示数据的分布情况。
- 点赞
- 收藏
- 关注作者
评论(0)