朴素贝叶斯算法

本文介绍了贝叶斯算法的基础概念,包括贝叶斯公式、先验后验概率和朴素贝叶斯原理。重点展示了如何使用朴素贝叶斯实现垃圾邮件过滤,包括数据预处理、模型训练和评估。实验结果显示了朴素贝叶斯在垃圾邮件分类中的应用效果。
摘要由CSDN通过智能技术生成

目录

一、贝叶斯算法概述

二、贝叶斯公式

(一)贝叶斯定理

(二)先验概率

(三)后验概率

(四)朴素贝叶斯算法原理

(五)朴素贝叶斯常用的三个模型

三、朴素贝叶斯实现垃圾邮件过滤的步骤

四、垃圾邮件过滤实验

(一)准备收集好的数据集,并下载到本地文件夹

(二)朴素贝叶斯分类器训练函数

(三)朴素贝叶斯分类器训分类函数

(四)测试朴素贝叶斯分类器,使用朴素贝叶斯进行交叉验证

(五)测试结果截图

五、实验小结


一、贝叶斯算法概述

贝叶斯算法(Bayesian algorithm)是一种基于贝叶斯统计理论的分类算法。它通过考虑先验概率和观测数据,利用贝叶斯公式进行推断和预测。

概括来说,贝叶斯算法的基本思想是将待分类的对象看作是具有一定属性的实例,然后根据这些属性来判断它属于不同类别的概率。

贝叶斯算法的步骤如下:

  1. 构建训练集:收集具有已知类别标签的训练数据。

  2. 学习先验概率:根据训练数据计算每个类别的先验概率,即在没有任何属性信息的情况下,一个对象属于某个类别的概率。

  3. 学习条件概率:计算每个属性在各个类别下的条件概率,即在已知类别的情况下,某个属性出现的概率。

  4. 进行分类预测:对于待分类对象,根据已学习得到的先验概率和条件概率,利用贝叶斯公式计算其属于各个类别的后验概率,然后选择具有最高后验概率的类别作为预测结果。

贝叶斯算法的优点之一是能够很好地处理小样本数据,并且能够不断进行学习和更新。然而,它也有一些限制,包括对先验概率的依赖以及对属性之间条件独立性的假设。

贝叶斯算法在文本分类、垃圾邮件过滤、推荐系统等领域广泛应用,并且与其他机器学习算法相结合,形成了更强大的分类模型。


二、贝叶斯公式

(一)贝叶斯定理

贝叶斯公式(Bayes' theorem)是贝叶斯统计理论的核心,它描述了如何根据先验概率和新的观测数据来更新后验概率。贝叶斯公式如下所示:

P(A|B) = P(B|A) * P(A) / P(B)

其中,P(A|B)表示在已知B发生的情况下,A发生的概率,称为后验概率;P(B|A)表示在已知A发生的情况下,B发生的概率,称为条件概率;P(A)表示A发生的先验概率;P(B)表示B发生的联合概率。

贝叶斯公式的含义是:在得到新的观测数据B之后,我们可以通过先验概率P(A)和条件概率P(B|A)来计算后验概率P(A|B),即在已知B发生的情况下,A发生的概率。

先验概率是指在考虑观测数据之前,对未知量的主观或客观的先验信念。它可以通过历史数据、专家经验、假设等方式获得。后验概率是在考虑观测数据之后,对未知量的概率推断。

贝叶斯公式在概率论和统计学中具有广泛应用,例如在文本分类、垃圾邮件过滤、医学诊断、金融风险评估等领域。通过使用贝叶斯公式,我们可以将已知的信息和新的观测数据结合起来,做出更准确的概率推断和决策。

(二)先验概率

P(cj)代表还没有训练模型之前,根据历史数据/经验估算cj拥有的初始概率。P(cj)常被称为cj的先验概率(prior probability) ,它反映了cj的概率分布,该分布独立于样本。

通常可以用样例中属于cj的样例数|cj|比上总样例数|D|来近似,即:

P(c_{j})=\frac{|c_{j}|}{|D|}

(三)后验概率

给定数据样本x时cj成立的概率P(cj  | x )被称为后验概率(posterior probability),因为它反映了在看到数据样本 x后 cj 成立的置信度。

(四)朴素贝叶斯算法原理

朴素贝叶斯(Naive Bayes)算法是基于贝叶斯定理和特征条件独立性假设的分类算法。其原理可以简单概括如下:

  1. 贝叶斯定理: 朴素贝叶斯算法基于贝叶斯定理,即根据已知的特征来推断相应的类别。贝叶斯定理表达式为:

    P(C|X) = P(X|C) * P(C) / P(X)

    其中,P(C|X) 表示在给定特征 X 的情况下,类别 C 的后验概率;P(X|C) 表示在类别 C 下,特征 X 出现的条件概率;P(C) 表示类别 C 的先验概率;P(X) 表示特征 X 的边缘概率。

  2. 特征条件独立性假设: 朴素贝叶斯算法假设特征之间相互独立,即对于给定的类别,特征之间的出现是相互独立的。这一假设简化了条件概率的计算,使得朴素贝叶斯算法具有较高的计算效率。

  3. 分类过程: 在分类过程中,对于一个新的输入样本,朴素贝叶斯算法计算该样本属于每个类别的后验概率,然后选择具有最高后验概率的类别作为分类结果。计算过程涉及先验概率的估计和条件概率的计算。

  4. 参数估计: 朴素贝叶斯算法通常使用最大似然估计等方法来估计先验概率和条件概率的参数值。

总的来说,朴素贝叶斯算法是一种简单而有效的分类算法,尤其适用于文本分类和垃圾邮件过滤等领域。然而,需要注意的是,朴素贝叶斯算法对特征条件独立性假设的合理性有一定要求,因此在实际应用中需要根据具体问题进行调整和优化。

(五)朴素贝叶斯常用的三个模型

1.高斯模型:处理特征是连续型变量的情况
2.多项式模型:主要用于离散特征分类,例如文本分类单词统计以出现的次数作为特征值
3.伯努利模型:要求特征是离散的,且为布尔类型,即true和false,或者1和0


三、朴素贝叶斯实现垃圾邮件过滤的步骤

进行垃圾邮件过滤实验时,你可以按照以下步骤进行:

  1. 数据收集:首先需要一个包含已标记为垃圾邮件和非垃圾邮件的数据集。你可以从开放数据集中获取,或者自己收集一些样本数据。

  2. 数据预处理:对数据进行预处理,包括文本分词、去除停用词、转换为词袋模型(Bag of Words)或 TF-IDF 等表示形式。

  3. 数据划分:将数据集划分为训练集和测试集,通常采用 70% 的数据作为训练集,30% 的数据作为测试集。

  4. 模型训练:使用训练集数据训练朴素贝叶斯分类器模型。可以选择使用多项式朴素贝叶斯(Multinomial Naive Bayes)适用于文本分类任务。

  5. 模型评估:使用测试集对训练好的模型进行评估,计算准确率、召回率、F1 值等指标,评估模型的性能。

  6. 参数调优:根据评估结果,可以尝试调整模型的参数、特征提取方法等,以提高模型的性能。

  7. 模型应用:当模型经过评估并达到满意的效果后,可以将其应用于实际的垃圾邮件过滤任务中。

在实验过程中,你可以使用 Python 等编程语言中的相关库(如 scikit-learn)来实现朴素贝叶斯算法,并进行数据处理、建模和评估。同时,也可以尝试不同的特征提取方法、模型参数以及模型融合等策略,以获得更好的分类效果


四、垃圾邮件过滤实验

(一)准备收集好的数据集,并下载到本地文件夹

ham文件夹下的文件为正常邮件,里面共有25封txt格式按数字命名顺序排列的正常邮件
正常邮件内容如下图所示:

pam文件下的txt文件为垃圾邮件,里面有25封txt格式按数字命名顺序排列的垃圾邮件
垃圾邮件内容如下图所示:

(二)朴素贝叶斯分类器训练函数

参数:
trainMatrix - 训练文档矩阵,即setOfWords2Vec返回的returnVec构成的矩阵
trainCategory - 训练类别标签向量,即loadDataSet返回的classVec
返回值:
p0Vect- 正常邮件类的条件概率数组
p1Vect - 垃圾邮件类的条件概率数组
pAbusive- 文档属于垃圾邮件类的概率
 

​
def trainNB0(trainMatrix, trainCategory):
    numTrainDocs = len(trainMatrix)  # 计算训练的文档数目
    numWords = len(trainMatrix[0])  # 计算每篇文档的词条数
    pAbusive = sum(trainCategory) / float(numTrainDocs) # 文档属于垃圾邮件类的概率
    p0Num = np.ones(numWords)
    p1Num = np.ones(numWords) #创建numpy.ones数组,词条出现数初始化为1,拉普拉斯平滑
    p0Denom = 2.0
    p1Denom = 2.0  # 分母初始化为2 ,拉普拉斯平滑
    for i in range(numTrainDocs):
        if trainCategory[i] == 1:  # 统计属于侮辱类的条件概率所需的数据,即P(w0|1),P(w1|1),P(w2|1)···
            p1Num += trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else: # 统计属于非侮辱类的条件概率所需的数据,即P(w0|0),P(w1|0),P(w2|0)···
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vect = np.log(p1Num / p1Denom)
    p0Vect = np.log(p0Num / p0Denom)  # 取对数,防止下溢出
    return p0Vect, p1Vect, pAbusive 

​

(三)朴素贝叶斯分类器训分类函数

参数:
vec2Classify - 待分类的词条数组
p0Vec - 正常邮件类的条件概率数组
p1Vec- 垃圾邮件类的条件概率数组
pClass1 - 文档属于垃圾邮件的概率
返回值:
0 - 属于正常邮件类
1 - 属于垃圾邮件类

def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    p1 = sum(vec2Classify * p1Vec) + np.log(pClass1)
    p0 = sum(vec2Classify * p0Vec) + np.log(1.0 - pClass1)
    if p1 > p0:
        return 1
    else:
        return 0

(四)测试朴素贝叶斯分类器,使用朴素贝叶斯进行交叉验证

def spamTest():
    docList = []
    classList = []
    fullText = []
    for i in range(1, 26):  # 遍历25个txt文件
        wordList = textParse(open('spam/%d.txt' % i, 'r').read())  # 读取每个垃圾邮件,并字符串转换成字符串列表
        docList.append(wordList)
        fullText.append(wordList)
        classList.append(1)  # 标记垃圾邮件,1表示垃圾文件
        wordList = textParse(open('ham/%d.txt' % i, 'r').read())  # 读取每个非垃圾邮件,并字符串转换成字符串列表
        docList.append(wordList)
        fullText.append(wordList)
        classList.append(0)  # 标记正常邮件,0表示正常文件
    vocabList = createVocabList(docList)  # 创建词汇表,不重复
    trainingSet = list(range(50))
    testSet = []  # 创建存储训练集的索引值的列表和测试集的索引值的列表
    for i in range(10):  # 从50个邮件中,随机挑选出40个作为训练集,10个做测试集
        randIndex = int(random.uniform(0, len(trainingSet)))  # 随机选取索索引值
        testSet.append(trainingSet[randIndex])  # 添加测试集的索引值
        del (trainingSet[randIndex])  # 在训练集列表中删除添加到测试集的索引值
    trainMat = []
    trainClasses = []  # 创建训练集矩阵和训练集类别标签系向量
    for docIndex in trainingSet:  # 遍历训练集
        trainMat.append(setOfWords2Vec(vocabList, docList[docIndex]))  # 将生成的词集模型添加到训练矩阵中
        trainClasses.append(classList[docIndex])  # 将类别添加到训练集类别标签系向量中
    p0V, p1V, pSpam = trainNB0(np.array(trainMat), np.array(trainClasses))  # 训练朴素贝叶斯模型
    errorCount = 0  # 错误分类计数
    for docIndex in testSet:  # 遍历测试集
        wordVector = setOfWords2Vec(vocabList, docList[docIndex])  # 测试集的词集模型
        if classifyNB(np.array(wordVector), p0V, p1V, pSpam) != classList[docIndex]:  # 如果分类错误
            errorCount += 1  # 错误计数加1
            print("分类错误的测试集:",docList[docIndex])
    print('错误率:%.2f%%' % (float(errorCount) / len(testSet) * 100))

(五)测试结果截图

可以看到,实验结果平均错误率为10%左右


五、实验小结

在进行垃圾邮件过滤实验后,以下是一些实验小结:

  1. 数据集收集:成功获取了包含标记为垃圾邮件和非垃圾邮件的数据集,这是进行垃圾邮件过滤实验的重要基础。

  2. 数据预处理:对数据进行了预处理,包括文本分词、去除停用词,并将文本转换为适合朴素贝叶斯算法处理的表示形式(如词袋模型或 TF-IDF)。

  3. 模型训练:使用训练集数据成功训练了朴素贝叶斯分类器模型,多项式朴素贝叶斯是一个常用的选择。

  4. 模型评估:通过使用测试集对训练好的模型进行评估,得到了模型的准确率、召回率、F1 值等指标,评估了模型的性能。

  5. 参数调优:根据评估结果,尝试了不同的参数设置、特征提取方法等,以期提高模型的性能。

  6. 实验成果:最终获得了经过评估并达到满意效果的垃圾邮件过滤模型,可以将其应用于实际的垃圾邮件过滤任务中。

通过这次实验,我对垃圾邮件过滤的流程和实现有了更深入的了解,并且获得了一个可用的垃圾邮件过滤模型,为日后的相关工作打下了良好的基础。值得注意的是,模型的性能评估和参数调优是持续优化模型效果的关键步骤,可以进一步完善模型的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值