机器学习实战——练习(朴素贝叶斯——垃圾邮件过滤)

朴素贝叶斯——垃圾邮件过滤

描述:
有50封邮件,其中垃圾邮件25封,有用邮件25封,垃圾邮件类别记为1,有用邮件类别记为0,现在需要过滤邮件。
实验思路:

  • 首先,处理下邮件的形式,文本处理成向量
  • 然后,随机将邮件分成训练集和测试集,比例4:1
  • 训练集拿出来训练,得到两个类别的概率分布
  • 测试集拿出来测试,概率带进来计算类别,并计算错误率
# 输入字符串,输出单词列表
def textParse(bigString):  # input is big string, output is word list
    import re
    listOfTokens = re.split(r'\W*', bigString)
    return [tok.lower() for tok in listOfTokens if len(tok) > 2]


# 每次随机选40篇训练,10篇测试
def spamTest():
    docList = []
    classList = []
    fullText = []
    for i in range(1, 26):
        wordList = textParse(open('email/spam/%d.txt' % i).read())
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(1)
        wordList = textParse(open('email/ham/%d.txt' % i).read())
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(0)
    vocabList = createVocabList(docList)  # create vocabulary
    trainingSet = list(range(50))
    # print(trainingSet)
    testSet = []  # create test set
    # 随机选10个测试样本,40个训练样本
    for i in range(10):
        randIndex = int(random.uniform(0, len(trainingSet)))
        testSet.append(trainingSet[randIndex])
        del (trainingSet[randIndex])
    # print(testSet)
    # print(trainingSet)
    # 训练40个邮件,得到概率分布
    trainMat = []
    trainClasses = []
    for docIndex in trainingSet:       # train the classifier (get probs) trainNB0
        trainMat.append(bagOfWords2VecMN(vocabList, docList[docIndex]))
        trainClasses.append(classList[docIndex])
    # print(trainMat)
    # print(trainClasses)
    p0V, p1V, pSpam = trainNB0(array(trainMat), array(trainClasses))
    errorCount = 0
    # 将训练得到的概率代入测试中,计算错误率
    for docIndex in testSet:            # classify the remaining items
        wordVector = bagOfWords2VecMN(vocabList, docList[docIndex])
        if classifyNB(array(wordVector), p0V, p1V, pSpam) != classList[docIndex]:
            errorCount += 1
            print("classification error", docList[docIndex])
    print('the error rate is: ', float(errorCount) / len(testSet))
    # return vocabList,fullText
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龚大龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值