大家好,我又来了。今天带大家了解一下sklearn中的贝叶斯分类器。这里由于听说贝叶斯分类器比较重要,我就仔细了解了一下其原理,并给大家带来一些具体的案例 :)
总结不易,欢迎大家点赞评论支持~
贝叶斯理论
在了解贝叶斯分类器之前,我们需要对贝叶斯定理(Bayes' theorem)有一个简单的了解。这里我对维基百科中的相关内容进行了一些总结,感兴趣的可以点击蓝色链接去观察原文。
贝叶斯定理是概率论中的一个定理,主要用于描述已知一些条件下,某事件的发生概率。其原理也很简单,可以理解为随机事件A和B的条件概率的一则定理:
这里的原理也很简单。学过概率论的朋友应该也很容易理解。那么我们如何将贝叶斯定理应用在分类器中呢?其实也很简单,我们假设A是类别,B是特征,那么在分类器中,我们需要找到的也仅仅是让P(A|B)最大的类别A。
朴素贝叶斯分类器
为什么在分类器中,要加上“朴素”这个词呢?(在英文中翻译为naive),其实是因为在其分类过程中,其设定了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)
总结:朴素贝叶斯中的假设条件虽然现实生活中缺少很多,但是实际上其效果还是挺不错的。所以人们很多都说其是高偏差,低方差的模型。