从0开始理解sklearn中的贝叶斯分类器,包含原理与代码案例,从今天开始不在困惑(python,sklearn,numpy)

        大家好,我又来了。今天带大家了解一下sklearn中的贝叶斯分类器。这里由于听说贝叶斯分类器比较重要,我就仔细了解了一下其原理,并给大家带来一些具体的案例 :)

        总结不易,欢迎大家点赞评论支持~

贝叶斯理论

        在了解贝叶斯分类器之前,我们需要对贝叶斯定理(Bayes' theorem)有一个简单的了解。这里我对维基百科中的相关内容进行了一些总结,感兴趣的可以点击蓝色链接去观察原文。

        贝叶斯定理是概率论中的一个定理,主要用于描述已知一些条件下,某事件的发生概率。其原理也很简单,可以理解为随机事件A和B的条件概率的一则定理:

        这里的原理也很简单。学过概率论的朋友应该也很容易理解。那么我们如何将贝叶斯定理应用在分类器中呢?其实也很简单,我们假设A是类别,B是特征,那么在分类器中,我们需要找到的也仅仅是让P(A|B)最大的类别A。

朴素贝叶斯分类器

        为什么在分类器中,要加上“朴素”这个词呢?(在英文中翻译为naive),其实是因为在其分类过程中,其设定了2个主要假设:

  1. 特征独立性:特征之间相互独立
  2. 特征等权重性:特征对结果的影响同等重要。

        因此,贝叶斯理论可以进一步简化为:

        这个类似于α的符号是正比的意思哈。其实也很好理解,只需要除以一个P(B)就好了,但是在真正的算的时候,没有必要浪费计算资源了

        而在sklearn中,提供了很多朴素贝叶斯分类器。如图所示:

        其实这几个的主要区别不同就是在计算P(bi|A)时的计算方法不同。核心的思路都是一样的,不同的计算方法可能适合不同形式的特征。下面我主要给大家说说常用的多项式贝叶斯(MultinomialNB)、高斯贝叶斯(GaussianNB)、伯努利贝叶斯(BernoulliNB)以及其应用场景。

多项式朴素贝叶斯(Multinomial Naive Bayes)

        其主要适用于特征是离散的计数值。通常用于文本的分类、垃圾信息分类。其实本质上也就是特征Xi服从于多项式分布

        这里我们以垃圾邮件分类为例子,用多项式贝叶斯区分垃圾右键和正常邮件。

        首先导入必要的库。

import numpy as np
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

         准备数据,

# 文本数据
emails = [
    '免费优惠,立即点击领取',
    '尊敬的客户,您的账单已出',
    '快来参与我们的抽奖活动',
    '您的账户存在异常登录',
    '赢取大奖,只需填写信息',
    '请查看您最近的交易记录'
]

# 标签(1表示垃圾邮件,0表示正常邮件)
labels = [1, 0, 1, 0, 1, 0]

        特征提取并处理数据集,

vectorizer = CountVectorizer()
X = vectorizer.fit_transform(emails)

X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.3, random_state=42)

model = MultinomialNB()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("模型准确率:", accuracy)

        这里主要是CountVectorizer大家可能没见过,其主要内容就是将文本转换为词频矩阵,每行表示一封邮件,每列表示一个词,值为该词在邮件中出现的次数。当然你通过自己提供token自己处理并表达成一个矩阵也是可以的,这个函数终究只是一个工具,不一定是最好的。函数的结果是这样的。

伯努利贝叶斯分类器(Bernoulli Beyes)

        其也很简单,就是伯努利分布,适合于特征不是0就是1的情况

# 导入必要的库
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import BernoulliNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 准备数据
emails = [
    '优惠券免费领取',
    '尊敬的客户,您的账单已生成',
    '中奖通知,请点击链接',
    '请查看您最新的交易记录',
    '免费豪礼,立即领取',
    '您的账户存在安全风险'
]

labels = [1, 0, 1, 0, 1, 0]  # 1表示垃圾邮件,0表示正常邮件

# 特征提取:将文本转换为词频矩阵
vectorizer = CountVectorizer(binary=True)  # binary=True 将词频转换为0或1
X = vectorizer.fit_transform(emails)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.3, random_state=42)

# 初始化伯努利朴素贝叶斯模型
model = BernoulliNB()

# 训练模型
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print("伯努利朴素贝叶斯模型准确率:", accuracy)

高斯朴素贝叶斯(Gaussian Naive Bayes)

        这种情况就是适合连续性特征。我们计算特征的高斯分布,并用y值代表概率。但是在代码编写过程中不用计算这么复杂,直接训练模型就好了。当然,特征最好还是是要符合正态分布,可以预处理一下。

# 导入必要的库
import numpy as np
from sklearn import datasets
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data  # 特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度
y = iris.target  # 标签:0、1、2 对应三种鸢尾花品种

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 初始化高斯朴素贝叶斯模型
model = GaussianNB()

# 训练模型
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print("高斯朴素贝叶斯模型准确率:", accuracy)

总结:朴素贝叶斯中的假设条件虽然现实生活中缺少很多,但是实际上其效果还是挺不错的。所以人们很多都说其是高偏差,低方差的模型。

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

香蕉也是布拉拉

随缘打赏不强求~ 谢谢大家

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

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

打赏作者

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

抵扣说明:

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

余额充值