机器学习——朴素贝叶斯算法

贝叶斯概率公式

联合概率:包含多个条件,且多个条件同时成立的概率,例如 P ( A , B ) P(A,B) P(A,B),即A,B同时成立的概率
条件概率:事件A在事件B发生的条件下分发生概率,记作 P ( A ∣ B ) P(A|B) P(AB)
相互独立:如果 P ( A , B ) = P ( A ) P ( B ) P(A,B)=P(A)P(B) P(A,B)=P(A)P(B),则称事件A和事件B相互独立
贝叶斯公式: P ( C ∣ W ) = P ( W ∣ C ) P ( C ) P ( W ) P(C|W)=\frac{P(W|C)P(C)} {P(W)} P(CW)=P(W)P(WC)P(C)

朴素贝叶斯的‘朴素’

朴素贝叶斯(Naive Bayes)算法中的“朴素”主要指的是它在假设上的简化。具体来说,这种“朴素”假设是指在进行分类时,各个特征之间是相互独立的。也就是说,给定类别的情况下,一个特征的存在或不存在与其他特征是独立的。

虽然说这种假设往往并不成立,因为特征之间通常存在一定的相关性。然而这种朴素的假设大大简化了计算,使得贝叶斯分类器在计算效率上具有很大的优势,同时在很多实际应用中依然能够提供较好的分类效果。尽管它的假设较为简化,但朴素贝叶斯算法在文本分类、垃圾邮件过滤等领域表现出色。

垃圾短信分类实例

现在有6条短信,如下所示
短信
标签spam表示是垃圾信息,ham表示是正常信息
贝叶斯公式 P ( C ∣ W ) = P ( W ∣ C ) P ( C ) P ( W ) P(C|W)=\frac{P(W|C)P(C)} {P(W)} P(CW)=P(W)P(WC)P(C)
1、计算先验概率 P ( C ) P(C) P(C)(C表示类别)
P ( s p a m ) = 3 6 = 0.5 P(spam)=\frac{3}{6}=0.5 P(spam)=63=0.5
P ( h a m ) = 3 6 = 0.5 P(ham)=\frac{3}{6}=0.5 P(ham)=63=0.5
2、计算似然
因为假设这些特征之间相互独立,似然 P ( x i ∣ C ) P(x_i|C) P(xiC)可以通过训练数据中每个单词在不同类别中的频率来估计。例如,对于单词“free”,我们可以计算它在垃圾短信和正常短信中出现的频率。
如果出现似然为0的情况如何处理?
防止出现似然为0的情况导致乘积直接为0,故引入拉普拉斯平滑系数
拉普拉斯平滑系数: P ( F 1 ∣ C ) = N i + α N + α m P(F1|C)=\frac{Ni+α}{N+αm} P(F1∣C)=N+αmNi+α α α α为指定的系数,一般为1,m为训练文档中特征词种类个数
若加入拉普拉斯平滑系数,则所有的概率均需要加上对应的值。
1、对上面数据集进行文本特征抽取,使用sklearn提供的CountVectorizer即可,将文本转小写,去除标点符号,进行分词,去除停用词,词形还原等。
分割后的特征词如下:
在这里插入图片描述
对应词频矩阵如下:
在这里插入图片描述
接下来进行词频统计:
在这里插入图片描述
加上拉普拉斯平滑系数(每个词频加1)
在这里插入图片描述
计算每个类别中的总单词数(包括平滑)
在这里插入图片描述
以free为例,似然计算为:
在这里插入图片描述
设待测试短信为:Free call now!
则计算
P ( s p a m ∣ f r e e c a l l n o w ) = P ( s p a m ) × P ( f r e e ∣ s p a m ) × P ( c a l l ∣ s p a m ) × P ( n o w ∣ s p a m ) P(spam|free call now)=P(spam)×P(free|spam)×P(call|spam)×P(now|spam) P(spamfreecallnow)=P(spam)×P(freespam)×P(callspam)×P(nowspam)
= 0.5 × 3 22 2 22 2 22 =0.5×\frac{3}{22}\frac{2}{22}\frac{2}{22} =0.5×223222222
≈ 0.00055 ≈0.00055 0.00055
再计算:
P ( h a m ∣ f r e e c a l l n o w ) = P ( h a m ) × P ( f r e e ∣ h a m ) × P ( c a l l ∣ h a m ) × P ( n o w ∣ h a m ) P(ham|free call now)=P(ham)×P(free|ham)×P(call|ham)×P(now|ham) P(hamfreecallnow)=P(ham)×P(freeham)×P(callham)×P(nowham)
= 0.5 × 1 22 2 22 1 22 =0.5×\frac{1}{22}\frac{2}{22}\frac{1}{22} =0.5×221222221
≈ 0.00001 ≈0.00001 0.00001
比较大小: P ( s p a m ∣ f r e e c a l l n o w ) 比 P ( h a m ∣ f r e e c a l l n o w ) P(spam|free call now)比P(ham|free call now) P(spamfreecallnow)P(hamfreecallnow)大,所以此类短信分类为“ s p a m spam spam

朴素贝叶斯优缺点:
1)优点:对缺失数据不敏感,算法简单,易于文本分类
分类准确度高,速度快
2)缺点:由于使用了样本属性独立性假设,如果特征属性之间实际有关联,则效果不好。

API:sklearn.naive_bayes.MultinomialNB(alpha=1.0) alpha:拉普拉斯平滑系数
上述短信分类的代码如下:(数据集在文末)

import pandas as pd
data = pd.read_excel('messages.xlsx')    # 该表格内有10000条信息
data.head()

在这里插入图片描述

# 文本特征抽取
from sklearn.feature_extraction.text import TfidfVectorizer
transfer = TfidfVectorizer()
x = transfer.fit_transform(data.text)
print(transfer.get_feature_names_out())

特征词表

# 数据集划分
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,data.label,train_size=0.8,random_state=2000000)
# 使用朴素贝叶斯分类
from sklearn.naive_bayes import MultinomialNB
estimator = MultinomialNB(alpha=1)   # alpha为拉普拉斯平滑系数
estimator.fit(x_train,y_train)
y_predict = estimator.predict(x_test)
print(f"预测值和真实值是否相等:{y_predict==y_test}")
print(f"正确率为:{estimator.score(x_test,y_test)}")

在这里插入图片描述
短信数据集点击即可跳转(免费下载)

  • 21
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍一下朴素贝叶斯算法在新闻分类中的应用及其Sklearn实现。 首先,朴素贝叶斯算法是一种基于贝叶斯定理和特征条件独立假设的分类算法,其主要思想是利用先验概率和条件概率来计算后验概率,从而实现分类。在新闻分类中,我们可以将每篇新闻看作一个样本,将其所属的类别作为标签进行分类。 Sklearn是Python中一个强大的机器学习库,其中包含了朴素贝叶斯分类器的实现。下面是一个使用Sklearn实现新闻分类的示例代码: ```python # 导入所需的库和数据集 from sklearn.datasets import fetch_20newsgroups from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import classification_report # 加载数据集 newsgroups_train = fetch_20newsgroups(subset='train') newsgroups_test = fetch_20newsgroups(subset='test') # 特征提取(使用TF-IDF方法) vectorizer = TfidfVectorizer() X_train = vectorizer.fit_transform(newsgroups_train.data) X_test = vectorizer.transform(newsgroups_test.data) y_train = newsgroups_train.target y_test = newsgroups_test.target # 训练模型 clf = MultinomialNB() clf.fit(X_train, y_train) # 预测并评估模型 y_pred = clf.predict(X_test) print(classification_report(y_test, y_pred, target_names=newsgroups_test.target_names)) ``` 以上代码中,我们首先使用Sklearn提供的`fetch_20newsgroups`函数加载新闻数据集。然后,我们使用`TfidfVectorizer`方法对文本进行特征提取,将其转换为TF-IDF特征向量。接着,我们使用`MultinomialNB`方法训练模型,并使用测试集进行预测和评估。 最后,我们使用`classification_report`方法输出分类结果的准确率、召回率和F1值等指标。在这个示例中,我们使用的是多项式朴素贝叶斯分类器(Multinomial Naive Bayes),它适用于文本分类等离散型数据的分类应用。 希望这个示例代码可以对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值