机器学习实战(三)——NaiveBayes朴素贝叶斯算法邮件分类

10 篇文章 0 订阅
8 篇文章 0 订阅

朴素贝叶斯分类的原理是条件概率的计算:
在已知先验概率的条件下,计算后验概率,后验概率即是在当前数据条件下属于分类1或者分类2 的概率,取概率较大的一个为输出。
贝叶斯准则很熟悉了,不解释了,但在这个算法中引入了一个很重要的思想:将文本等数据对象转化为向量格式进行计算。
其中包含了:1、正则表达式的运用,python中re库的运用
2、留存交叉验证:将样本一部分用作训练,一部分用作测试,当将训练组和测试组随机进行划分时,多次进行测试取平均值可以对算法的性能进行很好的评估。

# -*- coding: utf-8 -*-
############
#classifyNB
#classify the posts into two classes

from numpy import *
import os
import math
import operator
#最重要的思想;将词汇转变为向量;首先将所有出现的词汇纳入一个集合中,创建与集合相对应的一个向量
#系数相等的元素分别表示该词汇和该词汇出现的次数
def createVocabList(docList):
    vocabList= set([])
    for doc in docList:
        vocabList=vocabList|set(doc)
    return vocabList

#词袋模型:首先将训练样本中所有出现的词生成一个集合(词汇表),对输入的文本中包含在词汇表中
#的元素统计其出现的次数,生成一个长度为词汇表长度的向量,该向量方便计算各个词汇出现的概率
#与词袋模型对应的是词集模型,生成的词向量只有0和1,表征该词汇在文本中是否出现过
def bagsOfWords2Vec(vocabList,inputSet):
    vecVocab=zeros(len(vocabList))
    for word in inputSet:
        if word in vocabList:
            vecVocab[list(vocabList).index(word)]+=1
        else:
            print 'the word %s is not in the vocablist' %word

    return vecVocab

#####trainNB()计算导入的训练矩阵中,各个先验概率的大小;注意为了防止下溢出,用log,
#此时将所有词汇出现的次数初始化为1,将p1,p0情况下的词汇总个数初始化为2,防止log中出现
#0或者分母为0 的情况
def trainNB(trainMat,classList):
    numWordP0=ones(len(trainMat[0]))
    numWordP1=ones(len(trainMat[0]))
    wordP0=0.0;wordP1=0.0
    numWord=sum(trainMat,0)
    numP1=2.0
    numP0=2.0
    P1=sum(classList)/float(len(trainMat))
    #P0=1-P1
    for i in xrange(len(trainMat)):
        if classList[i]==1:
            #numWordP1+=trainMat[i]
            numWordP1=numWordP1+trainMat[i]
            numP1=numP1+sum(trainMat[i])
        else:
            #numWordP0+=trainMat[i]
            numWordP0=numWordP0+trainMat[i]
            numP0=numP0+sum(trainMat[i])
    wordP0=log(numWordP0/numP0)    
    wordP1=log(numWordP1/numP1)              
    return wordP0,wordP1,P1

def classifyNB(wordVector,p0,p1,pSpam):
    p0=sum(wordVector*p0)+log(1.0-pSpam)
    p1=sum(wordVector*p1)+log(pSpam)

    if p0>p1:
        return 0
    else:return 1
#################
#文本处理:1.正则表达式,在文末给出正则表达式学习的链接;2.大小写转换str.lower
def textParse(bigString):
    import re
    listOfToken=re.split(r'\W*',bigString)
    return [tok.lower() for tok in listOfToken if len(tok)>2]

###交叉验证,用样本自身的一部分进行训练。另一部分进行测试
def spamTest():
    docList=[];classList=[];fullText=[]
    for i in xrange(1,26):
        wordList=textParse(open('/home/lvsolo/python/naiveBayes/spam/%d.txt'%i).read())
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(1)
        wordList=textParse(open('/home/lvsolo/python/naiveBayes/ham/%d.txt'%i).read())
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(0)
###建立总的词汇表
    vocabList=createVocabList(docList)

###将samples重新随机分为training组和test组进行交叉验证
    trainingSet=range(50);testSet=[]

    for i in xrange(10):
        testInx=int(random.uniform(0,len(trainingSet)))
        testSet.append(trainingSet[testInx])
        del(trainingSet[testInx])

    trainMat=[];trainClasses=[]
    for docInx in trainingSet:
        trainMat.append(bagsOfWords2Vec(vocabList,docList[docInx]))
        trainClasses.append(classList[docInx])
    p0,p1,pAbusive=trainNB(array(trainMat),array(trainClasses))
    pError=0.0
    for docInx in testSet:
        wordVector= bagsOfWords2Vec(vocabList,docList[docInx])
        if classifyNB(wordVector,p0,p1,pAbusive)!=classList[docInx]:
            pError+=1
    #print 'the error rate is %s'%(float(pError)/len(testSet))
    return float(pError)/len(testSet)

python正则表达式:
http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

DEEPLEARNING资源软件:
http://www.sigvc.org/bbs/thread-557-1-1.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍一下朴素贝叶斯算法在新闻分类中的应用及其Sklearn实现。 首先,朴素贝叶斯算法是一种基于贝叶斯定理和特征条件独立假设的分类算法,其主要思想是利用先验概率和条件概率来计算后验概率,从而实现分类。在新闻分类中,我们可以将每篇新闻看作一个样本,将其所属的类别作为标签进行分类。 Sklearn是Python中一个强大的机器学习库,其中包含了朴素贝叶斯分类器的实现。下面是一个使用Sklearn实现新闻分类的示例代码: ```python # 导入所需的库和数据集 from sklearn.datasets import fetch_20newsgroups from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import classification_report # 加载数据集 newsgroups_train = fetch_20newsgroups(subset='train') newsgroups_test = fetch_20newsgroups(subset='test') # 特征提取(使用TF-IDF方法) vectorizer = TfidfVectorizer() X_train = vectorizer.fit_transform(newsgroups_train.data) X_test = vectorizer.transform(newsgroups_test.data) y_train = newsgroups_train.target y_test = newsgroups_test.target # 训练模型 clf = MultinomialNB() clf.fit(X_train, y_train) # 预测并评估模型 y_pred = clf.predict(X_test) print(classification_report(y_test, y_pred, target_names=newsgroups_test.target_names)) ``` 以上代码中,我们首先使用Sklearn提供的`fetch_20newsgroups`函数加载新闻数据集。然后,我们使用`TfidfVectorizer`方法对文本进行特征提取,将其转换为TF-IDF特征向量。接着,我们使用`MultinomialNB`方法训练模型,并使用测试集进行预测和评估。 最后,我们使用`classification_report`方法输出分类结果的准确率、召回率和F1值等指标。在这个示例中,我们使用的是多项式朴素贝叶斯分类器(Multinomial Naive Bayes),它适用于文本分类等离散型数据的分类应用。 希望这个示例代码可以对您有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值