机器学习-朴素贝叶斯过滤垃圾邮件

这篇具有很好参考价值的文章主要介绍了机器学习-朴素贝叶斯过滤垃圾邮件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、朴素贝叶斯实现垃圾邮件分类的原理

什么是朴素贝叶斯算法:用贝叶斯定理来预测一个未知类别的样本属于各个类别的可能性,选择可能性最大的一个类别作为该样本的最终类别。

用这个算法处理垃圾邮件就可以理解为:用贝叶斯定理来预测一封由若干个单词组成的不知道是否为垃圾邮件的邮件,它是垃圾邮件或是正常邮件的可能性,如果算法预测出垃圾邮件的可能性更高,那这封邮件就是垃圾邮件,反之为正常邮件。

二、贝叶斯定理

贝叶斯定理告诉我们如何交换条件概率中的条件与结果,即如果已知 P(X|Y),要求 P(Y|X):

P(Y∣X)=P(X∣Y)P(Y)​/P(X)

P(Y):先验概率。P(Y∣X):后验概率。P(X∣Y) :条件概率,又叫似然概率,一般是通过历史数据统计得到。

三、 朴素贝叶斯分类

机器学习-朴素贝叶斯过滤垃圾邮件

朴素贝叶斯分类通过训练集学习联合概率分布,其实就是学习先验概率分布和条件概率分布。

其中先验概率分布为:

 机器学习-朴素贝叶斯过滤垃圾邮件

 条件概率分布为:

机器学习-朴素贝叶斯过滤垃圾邮件

于是可以通过条件概率公式得出联合概率分布 ,

朴素贝叶斯算法对条件概率做了条件独立性的假设。由于这是一个较强的假设,朴素贝叶斯算法也由此得名。具体地,条件独立性假设是:

机器学习-朴素贝叶斯过滤垃圾邮件

 后验概率根据贝叶斯定理进行计算:

机器学习-朴素贝叶斯过滤垃圾邮件

 再将条件独立性假设代入上面的式子,得到了朴素贝叶斯分类的基本公式:

机器学习-朴素贝叶斯过滤垃圾邮件

拉普拉斯修正

在用朴素贝叶斯分类判断文本类别的时候,要计算多个概率的乘积。如果样本中的某些单词不在词汇表中出现,则连乘后概率为0,无法进行判断。因此我们在计算概率的时要用拉普拉斯修正,公式如下:

机器学习-朴素贝叶斯过滤垃圾邮件

 

四、实现垃圾邮件过滤

实现垃圾邮件过滤的步骤

收集数据:提供文本文件。

预处理数据:将文本文件解析成词条向量。

分析数据:检查词条确保解析的正确性。

训练:计算不同的独立特征的条件概率。

测试,计算错误率:计算错误率。

邮件数据集

机器学习-朴素贝叶斯过滤垃圾邮件

ham_email文件夹下包含二十条正常邮件信息,spam_email文件夹下面包含二十条垃圾文件信息 。

加载数据集

def createVocabList(dataSet):
    vocabSet = set([])  # set集合元素不重复
    for document in dataSet:
        vocabSet = vocabSet | set(document)  # 取并集
    return list(vocabSet)

 数据预处理

def setOfWords2Vec(vocabList, inputSet):
    returnVec = [0] * len(vocabList)  # 创建一个其中所含元素都为0的向量
    for word in inputSet:  
        if word in vocabList:  # 如果词条存在于词汇表中,则置1
            returnVec[vocabList.index(word)] = 1
        else:
            print("the word: %s is not in my Vocabulary!" % word)
    return returnVec  # 返回文档向量

朴素贝叶斯函数训练

def trainNB0(trainMatrix, trainCategory):
    numTrainDocs = len(trainMatrix)  
    numWords = len(trainMatrix[0])  
    pAbusive = sum(trainCategory) / float(numTrainDocs)  # 文档属于垃圾邮件类的概率
    p0Num = np.ones(numWords)
    p1Num = np.ones(numWords)  # 词条出现数初始为1,拉普拉斯平滑
    p0Denom = 2.0
    p1Denom = 2.0  # 分母初始为2 ,拉普拉斯平滑
    for i in range(numTrainDocs):
        if trainCategory[i] == 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  # 返回属于正常邮件类的条件概率数组,属于侮辱垃圾邮件类的条件概率数组,文档属于垃圾邮件类的概率

分类函数

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, 21):  # 遍历20个txt文件
        wordList = textParse(open('email/spam_email/%d.txt' % i, 'r').read())  
        docList.append(wordList)
        fullText.append(wordList)
        classList.append(1)  # 标记垃圾邮件,1表示垃圾文件
        wordList = textParse(open('email/ham_email/%d.txt' % i, 'r').read())  
        docList.append(wordList)
        fullText.append(wordList)
        classList.append(0)  # 标记正常邮件,0表示正常文件
    vocabList = createVocabList(docList)  
    trainingSet = list(range(40))
    testSet = []  
    for i in range(6):  # 从40个邮件中,随机挑选出34个作为训练集,6个做测试集
        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))

运行结果

机器学习-朴素贝叶斯过滤垃圾邮件

 全部代码文章来源地址https://www.toymoban.com/news/detail-486964.html

# -*- coding: UTF-8 -*-
import numpy as np
import re
import random


def createVocabList(dataSet):
    vocabSet = set([])  
    for document in dataSet:
        vocabSet = vocabSet | set(document)  # 取并集
    return list(vocabSet)



def setOfWords2Vec(vocabList, inputSet):
    returnVec = [0] * len(vocabList)  
    for word in inputSet:  
        if word in vocabList: 
            returnVec[vocabList.index(word)] = 1
        else:
            print("the word: %s is not in my Vocabulary!" % word)
    return returnVec  # 返回文档向量



def bagOfWords2VecMN(vocabList, inputSet):
    returnVec = [0] * len(vocabList)  
    for word in inputSet:  
        if word in vocabList:  
            returnVec[vocabList.index(word)] += 1
    return returnVec  # 返回词袋模型



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: 
            p1Num += trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:  
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vect = np.log(p1Num / p1Denom)
    p0Vect = np.log(p0Num / p0Denom)  
    return p0Vect, p1Vect, pAbusive  



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 textParse(bigString):  # 将字符串转换为字符列表
    listOfTokens = re.split(r'\W*', bigString)  # 将特殊符号作为切分标志进行字符串切分,即非字母、非数字
    return [tok.lower() for tok in listOfTokens if len(tok) > 2]  # 除了单个字母,例如大写的I,其它单词变成小写



def spamTest():
    docList = []
    classList = []
    fullText = []
    for i in range(1, 21):  
        wordList = textParse(open('email/spam_email/%d.txt' % i, 'r').read())  
        docList.append(wordList)
        fullText.append(wordList)
        classList.append(1)  # 标记垃圾邮件,1表示垃圾文件
        wordList = textParse(open('email/ham_email/%d.txt' % i, 'r').read()) 
        docList.append(wordList)
        fullText.append(wordList)
        classList.append(0)  # 标记正常邮件,0表示正常文件
    vocabList = createVocabList(docList) 
    trainingSet = list(range(40))
    testSet = []  
    for i in range(6):  # 从40个邮件中,随机挑选出34个作为训练集,6个做测试集
        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('错误率:%.2f%%' % (float(errorCount) / len(testSet) * 100))


if __name__ == '__main__':
    spamTest()

到了这里,关于机器学习-朴素贝叶斯过滤垃圾邮件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习——使用朴素贝叶斯分类器实现垃圾邮件检测(python代码+数据集)

    机器学习——scikit-learn库学习、应用 机器学习——最小二乘法拟合曲线、正则化 机器学习——使用朴素贝叶斯分类器实现垃圾邮件检测(python代码+数据集) 贝叶斯公式: P ( A ∣ B ) = P ( A ) P ( B ∣ A ) P ( B ) P(A mid B)=frac{P(A) P(B mid A)}{P(B)} P ( A ∣ B ) = P ( B ) P ( A ) P ( B ∣ A )

    2024年02月10日
    浏览(44)
  • 基于机器学习算法:朴素贝叶斯和SVM 分类-垃圾邮件识别分类系统(含Python工程全源码)

    本项目采用朴素贝叶斯和支持向量机(SVM)分类模型作为基础,通过对垃圾邮件和正常邮件的数据进行训练,旨在实现垃圾邮件的自动识别功能。 通过训练这两个分类模型,我们的目标是建立一个高效准确的垃圾邮件识别系统。当接收到新的邮件时,系统将对邮件文本进行预

    2024年02月09日
    浏览(52)
  • 朴素贝叶斯(垃圾邮件分类)

      朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法。对于大多数的分类算法,在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特

    2024年02月07日
    浏览(49)
  • 基于朴素贝叶斯的垃圾邮件分类Python实现

    垃圾邮件的问题一直困扰着人们,传统的垃圾邮件分类的方法主要有\\\"法\\\"和\\\"校验码法\\\"等,然而这两种方法效果并不理想。其中,如果使用的是“”法,垃圾邮件中如果这个被拆开则可能识别不了,比如,“中奖”如果被拆成“中 ~~~ 奖”可能会识别不了。

    2024年02月02日
    浏览(43)
  • 机器学习朴素贝叶斯笔记

    朴素贝叶斯(Naive Bayes)是一种基于贝叶斯定理和特征独立性假设的简单但有效的分类算法。它常用于文本分类、垃圾邮件过滤和情感分析等任务。下面我将详细解释朴素贝叶斯的原理和步骤。 首先,我们需要了解几个重要的概念: 贝叶斯定理(Bayes\\\' theorem):贝叶斯定理是

    2024年02月15日
    浏览(40)
  • 机器学习--朴素贝叶斯分类器

    第1关:条件概率 什么是条件概率 概率指的是某一事件 A 发生的可能性,表示为 P(A) 。而条件概率指的是某一事件 A 已经发生了条件下,另一事件 B 发生的可能性,表示为 P(B|A) ,举个例子: 今天有 25% 的可能性下雨,即 P(下雨)=0.25 ; 今天 75% 的可能性是晴天,即 P(晴天)=0.7

    2024年02月08日
    浏览(64)
  • 机器学习_9、朴素贝叶斯

    2024年01月23日
    浏览(34)
  • 机器学习课后习题 --- 朴素贝叶斯

    1.假设会开车的本科生比例是15%,会开车的研究生比例是23%。若在某大学研究生占学生比例是20%,则会开车的学生是研究生的概率是多少? A:80% B:16.6% C:23% D:15%   2.下列关于朴素贝叶斯的特点说法错误的是() A:朴素贝叶斯模型发源于古典数学理论,数学基础坚实 B:朴素贝叶斯

    2024年02月10日
    浏览(43)
  • 【机器学习笔记】4 朴素贝叶斯

    贝叶斯分类 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。 朴素贝叶斯分类是这一类算法中最简单的较为常见的算法。 先验概率 根据以往经验和分析得到的概率。我们用𝑃(𝑌)来代表在没有训练数据前假设𝑌拥有的初始概率。

    2024年02月19日
    浏览(44)
  • 【AI】机器学习——朴素贝叶斯

    用于解决分类问题:将连续取值输入映射为离散取值的输出 解决分类问题的依据是数据的属性 利用后验概率选择最佳分类,后验概率通过贝叶斯定理求解 朴素贝叶斯假定所有属性相互独立,基于这一假设将类条件概率转化为属性条件概率的乘积 朴素贝叶斯方法可以使期望风

    2024年02月09日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包