




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
中国地质大学(武汉)信息工程学院-大数据技术与应用课程实习报告2015年秋Lab_1 基于朴素贝叶斯的垃圾邮件检测一、实习目的与要求1、结合实际应用理解分类的分类过程;2、深入理解特征提取、数据处理、训练、测试、分类评估等过程;3、理论结合实践,采用朴素贝叶斯方法实现垃圾邮件的检测;4、通过进一步查阅文献,了解相关研究方向的最新研究进展。二、实习题目利用基于概率论的分类方法朴素贝叶斯方法,实现垃圾邮件的检测。【实验数据】50封包含纯文本内容的电子邮件,其中50% SPAM,50% HAM。【分类过程描述】(1)数据预处理a) 获取原始数据:数据集放在email文件夹中,该文件夹又包含两个子文件夹,分别是spam-bad与ham-good,程序与该email文件夹放在同一个目录里。for i in range(1,26): wordList = textParse(open(email/spam-bad/%d.txt % i).read() docList.append(wordList) fullText.extend(wordList) classList.append(1) wordList = textParse(open(email/ham-good/%d.txt % i).read() docList.append(wordList) fullText.extend(wordList) classList.append(0)b) 查看数据样本:数据已被读入wordList中,用classList标记邮件来源于spam-bad还是ham-good,以便于最后的随机选取训练样本与测试样本及正确率检测。c) 编写数据过滤程序:对于一个文本字符串,可以使用python的split()方法将其切分,但是标点符号也被当成了词的一部分,可以使用正则表示式来切分句子,其中分隔符是除单词、数字外的任意字符串。但是里面的空字符串需要去掉,可以计算每个字符串的长度,只返回长度大于0的字符串。最后将所有字符串转换为小写:def textParse(bigString): import re listOfTokens = re.split(rW*, bigString)return tok.lower() for tok in listOfTokens if len(tok) 2d) 将文本转换为标记向量,以便进行概率计算与处理:def bagOfWords2VecMN(vocabList, inputSet): returnVec = 0*len(vocabList) for word in inputSet: if word in vocabList: returnVecvocabList.index(word) += 1return returnVece) 分离训练样本与测试样本:构建一个测试集与一个训练集,两个集合中的邮件都是随机选出的。本例中共有50封电子邮件,并不是很多,其中的10封电子邮件被随机选择为测试集。分类器所需要的概率计算只利用训练集中的文档来完成。python变量trainingSet是一个整数列表,其中的值从0到49。接下来,随机选择其中10个文件, 选择出的数字所对应 的文档被添加到测试集,同时也将其从训练集中剔除:trainingSet = range(50); testSet= for i in range(10): randIndex = int(random.uniform(0,len(trainingSet) testSet.append(trainingSetrandIndex) del(trainingSetrandIndex)(2)模型训练a) 训练:使用算法对可用训练数据生产训练模型:trainMat=; trainClasses = for docIndex in trainingSet: trainMat.append(bagOfWords2VecMN(vocabList, docListdocIndex) trainClasses.append(classListdocIndex)p0V,p1V,pSpam = trainNB0(array(trainMat),array(trainClasses)b) 测试:如果邮件分类错误,则错误数加1,最后给出总的错误百分比:errorCount = 0 for docIndex in testSet: wordVector = bagOfWords2VecMN(vocabList, docListdocIndex) if classifyNB(array(wordVector),p0V,p1V,pSpam) != classListdocIndex: errorCount += 1 print classification error,docListdocIndex print the error rate is: ,float(errorCount)/len(testSet)(3)分类结果评价函数会输出在10封随机选择的电子邮件上的分类错误率。既然这些电子邮件是随机选择的,所以每次的输出结果可能有些差别。如果发现错误的话,函数会输出错分文档的词表,这样就可以了解到底是哪篇文档发生了错误。如果想要更好地估计错误率,那么就应该将上述过程重复多次,比如说10次,然后求平均值。【源代码】#-*-coding: utf-8-*-from numpy import *def createVocabList(dataSet): vocabSet = set() for document in dataSet: vocabSet = vocabSet | set(document) return list(vocabSet)def trainNB0(trainMatrix,trainCategory): numTrainDocs = len(trainMatrix) numWords = len(trainMatrix0) pAbusive = sum(trainCategory)/float(numTrainDocs) p0Num = ones(numWords); p1Num = ones(numWords) p0Denom = 2.0; p1Denom = 2.0 for i in range(numTrainDocs): if trainCategoryi = 1: p1Num += trainMatrixi p1Denom += sum(trainMatrixi) else: p0Num += trainMatrixi p0Denom += sum(trainMatrixi) p1Vect = log(p1Num/p1Denom) p0Vect = log(p0Num/p0Denom) return p0Vect,p1Vect,pAbusivedef classifyNB(vec2Classify, p0Vec, p1Vec, pClass1): p1 = sum(vec2Classify * p1Vec) + log(pClass1) p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1) if p1 p0: return 1 else: return 0 def bagOfWords2VecMN(vocabList, inputSet): returnVec = 0*len(vocabList) for word in inputSet: if word in vocabList: returnVecvocabList.index(word) += 1 return returnVecdef textParse(bigString): import re listOfTokens = re.split(rW*, bigString) return tok.lower() for tok in listOfTokens if len(tok) 2 def spamTest(): docList=; classList = ; fullText = for i in range(1,26): wordList = textParse(open(email/spam-bad/%d.txt % i).read() docList.append(wordList) fullText.extend(wordList) classList.append(1) wordList = textParse(open(email/ham-good/%d.txt % i).read() docList.append(wordList) fullText.extend(wordList) classList.append(0) vocabList = createVocabList(docList) trainingSet = range(50); testSet= for i in range(10): randIndex = int(random.uniform(0,len(trainingSet) testSet.append(trainingSetrandIndex) del(trainingSetrandIndex) trainMat=; trainClasses = for docIndex in trainingSet: trainMat.append(bagOfWords2VecMN(vocabList, docListdocIndex) trainClasses.append(classListdocIndex) p0V,p1V,pSpam = trainNB0(array(trainMat),array(trainClasses) errorCount = 0 for docIndex in testSet: wordVector = bagOfWords2VecMN(vocabList, docListdocIndex) if classifyNB(array(wordVector),p0V,p1V,pSpam) != classListdocIndex: errorCount += 1 print classification error,docListdocIndex print the error rate is: ,float(errorCount)/len(testSet)spamTest()【改进设想】想要提高算法的分类精度,就要
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全培训效果评估课件
- 2025河南驻马店市新蔡县公益性岗位招聘7人模拟试卷及一套答案详解
- 安全培训效果评价结论表课件
- 2025广东中山市粮食储备经营管理有限公司招聘5人考前自测高频考点模拟试题及完整答案详解
- 2025年度上半年河北唐山市消防救援支队政府专职消防队员招聘113人模拟试卷附答案详解(完整版)
- 2025贵州岑巩县医共体总医院招聘乡村医生模拟试卷及答案详解(各地真题)
- 2025辽宁铁岭市调兵山市招聘临床医师10人模拟试卷附答案详解(典型题)
- 2025包头市昆都仑区发展和改革委员会竞争性比选工作人员的考前自测高频考点模拟试题及答案详解一套
- 网络设备安装维修合同
- 履行合作协议升级版承诺函4篇范文
- 工程施工停工令模板
- 2023年蒸汽管路设计
- 耳部解剖及急慢性中耳炎课件
- 工程项目投资与融资讲义 课件
- 食品质量安全抽检数据分析模型优质资料
- 承插型盘扣式钢管进场验收记录表
- 军事训练教学法模板课件
- 物流设施与设备ppt课件(完整版)
- 交通运输安全管理整套教学课件
- 安检员X射线机培训-共86页课件
- (作业辅导)福建师范大学2022年8月课程考试《小学班队原理与班主任工作》作业考核试题
评论
0/150
提交评论