朴素贝叶斯分类器实现垃圾邮件检测

概念

        贝叶斯公式 :

        P(A∣B)具体含义是:在事件B发生的条件下事件A发生的概率

       朴素贝叶斯分类器采用了“属性条件独立性假设”,即每个属性独立地对分类结果发生影响。 为方便公式标记,不妨记P(C=c|X=x)为P(c|x),基于属性条件独立性假设,贝叶斯公式可重写为

        其中d为属性数目,x_i 为 x 在第i个属性上的取值。 

        在使用朴素贝叶斯分类器进行垃圾邮件检测时,一般会将每封邮件表示为一个特征向量,并且使用这些特征向量来训练分类器。常见的朴素贝叶斯分类器包括多项式朴素贝叶斯(Multinomial Naive Bayes)和高斯朴素贝叶斯(Gaussian Naive Bayes)等。


过程

朴素贝叶斯分类器的训练过程主要包括以下步骤:

  1. 计算先验概率:根据训练数据集中各个类别的样本数量,计算各个类别的先验概率。

  2. 计算条件概率:对于每个特征(比如词语),计算在给定类别下该特征出现的条件概率。

  3. 根据训练集计算的先验概率和条件概率,构建朴素贝叶斯分类器模型。

        对于垃圾邮件分类预测,简单来说就是判断一封邮件是垃圾邮件的概率和是正常邮件的概率,哪一个概率大就判定为是哪一种类型的邮件。以h + 为垃圾邮件,h − 为正常邮件,D代表需要验证的邮件,d代表邮件里面的的单词如下:

则一封测试邮件为垃圾邮件和正常邮件的概率公式如下:

        因为独立事件间的概率计算更加简单,为了简便计算,朴素贝叶斯假定所有输入事件之间是相互独立的。也就是邮件里的每个单词相互独立与出现的先后顺序无关。由朴素贝叶斯定理公式可以分解为如下: 

        多项式朴素贝叶斯适用于特征是离散型的情况,比如文本分类中常用的词频统计;而高斯朴素贝叶斯适用于特征是连续型的情况,比如一些传感器数据的处理。


具体实现

import os
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report

# 加载数据集
def load_data(root_dir, label):
    texts = []
    labels = []
    for file in os.listdir(os.path.join(root_dir, label)):
        with open(os.path.join(root_dir, label, file), 'r', encoding='latin1') as f:
            texts.append(f.read())  #将打开的文件内容读取并添加到列表 texts
            labels.append(label)
    return texts, labels

ham_texts, ham_labels = load_data('D:/yy-study/python/machine-learning/5.朴素贝勒斯/Ch04/email', 'ham')
spam_texts, spam_labels = load_data('D:/yy-study/python/machine-learning/5.朴素贝勒斯/Ch04/email', 'spam')

all_texts = ham_texts + spam_texts
all_labels = ham_labels + spam_labels

# 特征提取
vectorizer = TfidfVectorizer()
#使用 TfidfVectorizer 对所有文本数据集 all_texts 进行拟合(fit)和转换(transform),得到特征矩阵 X
X = vectorizer.fit_transform(all_texts)
#将标签数据存储在变量 y
y = all_labels

# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 训练朴素贝叶斯分类器
clf = MultinomialNB()
clf.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = clf.predict(X_test)

# 模型评估
print("准确率:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))


小结

        这个实验使用了朴素贝叶斯分类器对垃圾邮件进行了有效的识别,并使用准确率和分类报告对模型进行了评估。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值