朴素贝叶斯——最适合简单的文本分析算法

一、朴素贝叶斯核心思想

首先我将举个例子以便理解。假设我收到一封邮件,内容描述如下:您提交的3215号工单:来自李先生的留言。请点击链接查看工单处理进度:https://tingyun.kf5.com/hc/request……

已知在垃圾邮件中经常出现“链接”,“点击”这种单词,我收到的该邮件中包含了这些单词,这个邮件很可能是垃圾邮件。垃圾邮件分类属于监督学习范畴,监督学习指给定一个数据和标签,前提是手中有大量邮件数据,即知道哪些是垃圾邮件哪些不是。

分别计算出邮件中的单词在正常邮件和垃圾邮件中的概率:

P(垃圾|邮件内容) =  一封邮件为垃圾的概率

P(正常|邮件内容) =  一封邮件为正常的概率

如果 P(垃圾|邮件内容) > P(正常|邮件内容),则推测此邮件为垃圾邮件;如果 P(垃圾|邮件内容) < P(正常|邮件内容),则推测此邮件为正常邮件。

二、贝叶斯定理

现有一封邮件内容为:“购买 物品, 不是 广告”,如何判断是正常邮件还是垃圾邮件呢?

推导过程如下,需要使用条件独立假设简化

:P(正常|邮件内容) = P(邮件内容|正常)*P(正常)/P(邮件内容)

=P("购买",“物品”,“不是”,“广告”|正常)*P(正常)/P(邮件内容)

=P(“购买”|正常)*P(“物品”|正常)*P(“不是”|正常)*P(“广告”|正常)*P(正常)/P(邮件内容)

=(1/80*1/60*1/60*1/48*2/3 )/P(邮件内容)

P(垃圾|邮件内容) = P(邮件内容|垃圾)*P(垃圾)/P(邮件内容)

=(7/120*1/30*1/40*1/30*1/3 )/P(邮件内容)

垃圾邮件和正常邮件概率的分母均为P(邮件内容),可忽略此项。

如何处理概率为零的情况,样本在测试数据中未出现的状况可能发生,处理方法是使用平滑(smoothy)的思想,例如Add-one smoothy,即在分子加一分母加上词库大小。

应用实例:

# 读取spam.csv文件
import pandas as pd
df = pd.read_csv("data_spam/spam.csv", encoding='latin')
df.head()


# 重命名数据中的v1和v2列,使得拥有更好的可读性
df.rename(columns={'v1':'Label', 'v2':'Text'}, inplace=True)
df.head()

 

# 把'ham'和'spam'标签重新命名为数字0和1
df['numLabel'] = df['Label'].map({'ham':0, 'spam':1})
df.head()

 

# 统计有多少个ham,有多少个spam
print ("# of ham : ", len(df[df.numLabel == 0]), " # of spam: ", len(df[df.numLabel == 1]))
print ("# of total samples: ", len(df))

# of ham : 4825 # of spam: 747 # of total samples: 5572

# 统计文本的长度信息
text_lengths = [len(df.loc[i,'Text']) for i in range(len(df))] 
print ("the minimum length is: ", min(text_lengths))

import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

plt.hist(text_lengths, 100, facecolor='blue', alpha=0.5)
plt.xlim([0,200])
plt.show()

# 导入英文呢的停用词库
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer
# what is stop wordS? he she the an a that this ...
stopset = set(stopwords.words("english"))

# 构建文本的向量 (基于词频的表示)
#vectorizer = CountVectorizer(stop_words=stopset,binary=True)
vectorizer = CountVectorizer()

# sparse matrix 
X = vectorizer.fit_transform(df.Text)
y = df.numLabel
# 把数据分成训练数据和测试数据
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=100)
print ("训练数据中的样本个数: ", X_train.shape[0], "测试数据中的样本个数: ", X_test.shape[0])
训练数据中的样本个数:  4457 测试数据中的样本个数:  1115

# 利用朴素贝叶斯做训练
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score


clf = MultinomialNB(alpha=1.0, fit_prior=True)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print("accuracy on test data: ", accuracy_score(y_test, y_pred))

# 打印混淆矩阵
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_pred, labels=[0, 1])
accuracy on test data:  0.97847533632287

 

array([[956, 14],

          [ 10, 135]])

     ——《贪心学院特训营》第四期学习笔记

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
朴素贝叶斯算法是一种常用的分类算法,它将待分类的样本看作是由多个特征组成的向量,然后根据这些特征的先验概率和条件概率,计算出每个类别的后验概率,最终将样本分到概率最大的那个类别中。 在天气预报中,我们可以使用朴素贝叶斯算法来预测明天是否会下雨。假设我们有以下三个特征:今天是否下雨、今天是否多云、今天的气温,它们的取值分别为是或否、是或否、高、中、低。我们可以根据这些特征来构建训练数据集,例如: | 是否下雨 | 是否多云 | 气温 | 是否下雨(标签) | | -------- | -------- | ---- | ---------------- | | 是 | 是 | 高 | 是 | | 否 | 是 | 中 | 否 | | 否 | 否 | 低 | 否 | | 否 | 是 | 低 | 否 | | 是 | 否 | 中 | 是 | | 是 | 是 | 中 | 是 | 现在我们要预测明天是否会下雨,假设明天的气温为“中”,天气情况为“多云”,我们可以使用朴素贝叶斯算法来计算下雨和不下雨的后验概率。 首先,我们需要计算每个类别(下雨和不下雨)出现的先验概率,即: $$P(下雨)=\frac{3}{6}=0.5$$ $$P(不下雨)=\frac{3}{6}=0.5$$ 然后,我们需要计算每个特征在每个类别下的条件概率。以“是否多云”为例,当天不下雨的样本中,“是否多云”为“是”的概率为: $$P(是否多云=是|不下雨)=\frac{1}{3}=0.33$$ 同理,当天不下雨的样本中,“是否多云”为“否”的概率为: $$P(是否多云=否|不下雨)=\frac{2}{3}=0.67$$ 当天下雨的样本中,“是否多云”为“是”的概率为: $$P(是否多云=是|下雨)=\frac{2}{3}=0.67$$ 同理,当天下雨的样本中,“是否多云”为“否”的概率为: $$P(是否多云=否|下雨)=\frac{1}{3}=0.33$$ 其他特征的条件概率也可以用同样的方法计算。最后,我们可以根据贝叶斯公式计算下雨和不下雨的后验概率: $$P(下雨|气温=中,是否多云=是)=\frac{P(气温=中|下雨)P(是否多云=是|下雨)P(下雨)}{P(气温=中)P(是否多云=是)}$$ $$P(不下雨|气温=中,是否多云=是)=\frac{P(气温=中|不下雨)P(是否多云=是|不下雨)P(不下雨)}{P(气温=中)P(是否多云=是)}$$ 其中,$P(气温=中)$和$P(是否多云=是)$可以通过所有样本中对应特征的出现次数计算得到。 最后,比较两个后验概率的大小,即可得出明天是否会下雨的预测结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值