6.1.SVM建立垃圾邮件分类器

1)题目:

如今,许多电子邮件服务提供垃圾邮件过滤器,能够将电子邮件精确地分类为垃圾邮件和非垃圾邮件。在本部分练习中,您将使用SVM构建自己的垃圾邮件过滤器。
您将训练一个分类器来分类给定的电子邮件x是垃圾邮件(y = 1)还是非垃圾邮件(y = 0)。特别地,你需要将每封电子邮件转换成一个特征向量x∈Rnx\in R^nx∈Rn。
本练习中包含的数据集是基于SpamAssassin Public Corpus(http://spamassassin.apache.org/old/publiccorpus/ )的一个子集,对于本练习,您将只使用电子邮件正文(不包括邮件抬头)。
数据集链接: https://pan.baidu.com/s/1cEgQIvehUcLxZ0WVhxcPuQ 提取码: xejn

2)大致步骤:

  • 邮件预处理。首先读取样例邮件查看下。然后进行预处理:
    1.把整封邮件转化为小写
    2.移除所有HTML标签(超文本标记语言)
    3.将所有的URL替换为’httpaddr’
    4.将所有的地址替换为’emailaddr’
    5.将所有数字替换为’number’
    6.将所有美元符号($)替换为’dollar’
    7.将所有单词还原为词根。例如,“discount”, “discounts”, “discounted” and “discounting”都替换为“discount”
    8.移除所有非文字类型,所有的空格(tabs, newlines, spaces)调整为一个空格
    然后再对照单词表得到样例对应的序号列。
  • 提取特征。利用序号列得到邮件的一个特征向量,x∈Rnx\in R^nx∈Rn,这里是一个1899维的特征向量。
  • 训练SVM。取C=0.1,核函数为线性核,用训练集训练出模型,训练精度为99.8%,再在测试集上测试,精度为98.9%。
  • 打印权重最高的前15个词,邮件中出现这些词更容易是垃圾邮件
  • 用训练好的模型预测已给的四封邮件

3)关于Python:

  • .lower( )可以转化为小写。

  • 邮件预处理时需要用到re模块,正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为”元字符”)组成的文字模式。re模块中的函数让你检查一个特定的字符串是否匹配给定的正则表达式(或给定的正则表达式是否匹配特定的字符串,这可归结为同一件事)。
    使用re.sub(pattern, repl, string, count=0, flags=0)
    pattern是需要被替换的部分,repl为替换之后的内容,string为查找的范围,count表示模式匹配后替换的最大次数,默认0表示替换所有的匹配。

  • re.split( ) 用来分割字符串。注意在分割时候不能直接用吴恩达给出的MATLAB的代码,因为有一些需要转义。

  • nltk的全称是natural language tool kit,是一套基于python的自然语言处理工具集。这里主要使用了词干提取的Porter提取算法。nltk.stem.PorterStemmer( )

  • try和except语句块可以用来运行可能会有问题的代码。

  • 在循环中不想要某些条件执行后面的代码可以用continue跳过本次循环直接进行下一次循环。

  • sorted函数直接对数组进行排序,np.argsort是返回排序后的坐标。

  • 关于正则表达式:
    字符”r“的意思是表示忽略后面的转义字符,这样简化了后面正则表达式里每遇到一个转义字符还得挨个转义的麻烦;[ ]里面可以用来填要匹配的字符集;\是转义字符,让它后面的字符还原它原有的含义;*匹配前面的子表达式零次或多次;+匹配前面的子表达式一次或多次;$表示只在字符末尾进行匹配。。。这里引用第一个链接里的一些表格以备后用~
    更多可参考 http://www.runoob.com/regexp/regexp-syntax.html 或 https://blog.csdn.net/u010254900/article/details/22038741

字符 描述
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$。
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用\( 和 \)。
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用\ +。
. 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用\ ?。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
| 指明两项之间的一个选择。要匹配 |,请使用 \|。

4) 代码与结果:


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy.io as scio
from sklearn import svm
import re #处理正则表达式的模块
import nltk #自然语言处理工具包'''============================part1 邮件预处理========================='''
#查看样例邮件
f = open('emailSample1.txt', 'r').read()
print(f)def processEmail(email):email = email.lower() #转化为小写email = re.sub('<[^<>]+>', ' ', email) #移除所有HTML标签email = re.sub('(http|https)://[^\s]*', 'httpaddr', email) #将所有的URL替换为'httpaddr'email = re.sub('[^\s]+@[^\s]+', 'emailaddr', email) #将所有的地址替换为'emailaddr'email = re.sub('\d+', 'number', email) #将所有数字替换为'number'email = re.sub('[$]+', 'dollar', email) #将所有美元符号($)替换为'dollar'#将所有单词还原为词根//移除所有非文字类型,空格调整stemmer = nltk.stem.PorterStemmer() #使用Porter算法tokens = re.split('[ @$/#.-:&*+=\[\]?!()\{\},\'\">_<;%]', email) #把邮件分割成单个的字符串,[]里面为各种分隔符tokenlist = []for token in tokens:token = re.sub('[^a-zA-Z0-9]', '', token) #去掉任何非字母数字字符try: #porterStemmer有时会出现问题,因此用trytoken = stemmer.stem(token) #词根except:token = ''if len(token) < 1: continue #字符串长度小于1的不添加到tokenlist里tokenlist.append(token)return tokenlist#查看处理后的样例
processed_f = processEmail(f)
for i in processed_f:print(i, end=' ')#得到单词表,序号为索引号+1
vocab_list = np.loadtxt('vocab.txt', dtype='str', usecols=1)
#得到词汇表中的序号
def word_indices(processed_f, vocab_list):indices = []for i in range(len(processed_f)):for j in range(len(vocab_list)):if processed_f[i]!=vocab_list[j]:continueindices.append(j+1)return indices#查看样例序号
f_indices = word_indices(processed_f, vocab_list)
for i in f_indices:print(i, end=' ')'''============================part2 提取特征========================='''
def emailFeatures(indices):features = np.zeros((1899))for each in indices:features[each-1] = 1 #若indices在对应单词表的位置上词语存在则记为1return featuressum(emailFeatures(f_indices)) #45'''============================part3 训练SVM========================='''
#训练模型
train = scio.loadmat('spamTrain.mat')
train_x = train['X']
train_y = train['y']clf = svm.SVC(C=0.1, kernel='linear')
clf.fit(train_x, train_y)#精度
def accuracy(clf, x, y):predict_y = clf.predict(x)m = y.sizecount = 0for i in range(m):count = count + np.abs(int(predict_y[i])-int(y[i])) #避免溢出错误得到225return 1-float(count/m) accuracy(clf, train_x, train_y) #0.99825#测试模型
test = scio.loadmat('spamTest.mat')
accuracy(clf, test['Xtest'], test['ytest']) #0.989'''============================part4 高权重词========================='''
#打印权重最高的前15个词,邮件中出现这些词更容易是垃圾邮件
i = (clf.coef_).size-1
while i >1883:#返回从小到大排序的索引,然后再打印print(vocab_list[np.argsort(clf.coef_).flatten()[i]], end=' ')i = i-1'''============================part5 预测邮件========================='''t = open('spamSample2.txt', 'r').read()
#预处理
processed_f = processEmail(t)
f_indices = word_indices(processed_f, vocab_list)
#特征提取
x = np.reshape(emailFeatures(f_indices), (1,1899))
#预测
clf.predict(x)

查看样例邮件

预处理后的样例(吴恩达给出的作业中的样例不对,visitor you re 他给分为visitor your了,这是由于在分割的时候是否把’ 作为分割,这样会导致后面特征提取后少一个非零项,即只有44项)

样例对应的词汇序号

训练精度和测试精度

15个权重最高的词,和作业中有些微差别

测试了给出的四封邮件,都正确分类,下面是spamSample2的结果,分类器把它分为垃圾邮件

本次作业没有给出知识点概括,因为上次作业6.0已经大概描述清楚了SVM的原理和模型选择的一些内容,这次作业其实主要是对练习怎么从文本中提取特征得到一个n维的特征向量,再进行模型训练。
文本提取和处理也是很难啊~ 继续学吧!

吴恩达|机器学习作业6.1.SVM建立垃圾邮件分类器相关推荐

  1. 吴恩达机器学习作业ex2-python实现

    系列文章目录 吴恩达机器学习作业ex1-python实现 吴恩达机器学习作业ex2-python实现 吴恩达机器学习作业ex3-python实现 作业说明及数据集 链接:https://pan.bai ...

  2. k均值算法python实现(吴恩达机器学习作业)

    k均值算法python实现(吴恩达机器学习作业) 题目要求 数据集 读取mat文件 K-means 实现 结果 问题 题目要求 采用K均值算法对样本进行聚类. 编写K均值算法源代码,对ex7data2 ...

  3. 第一章-机器学习简介 深度之眼_吴恩达机器学习作业训练营

    目录 专栏简介: 一,机器学习简介 1.1 机器学习定义 1.1 机器学习的重要性 1.2 应用领域 二.监督学习 三.无监督学习 四.总结 专栏简介: 本栏主要内容为吴恩达机器学习公开课的学习笔记, ...

  4. 吴恩达机器学习作业7 - K-means和PCA主成分分析(Python实现)

    吴恩达机器学习作业7 - K-means和PCA主成分分析(Python实现) Introduction 在本实验中,将实现K-means聚类算法,并将其应用于图像压缩.在第二部分实验中,将使用主成分 ...

  5. 吴恩达机器学习作业Python实现(六):SVM支持向量机

    吴恩达机器学习系列作业目录 1 Support Vector Machines 1.1 Example Dataset 1 %matplotlib inline import numpy as np ...

  6. 吴恩达机器学习作业Python实现(八):异常检测和推荐系统

    吴恩达机器学习系列作业目录 1 Anomaly detection 这部分,您将实现一个异常检测算法来检测服务器计算机中的异常行为.他的特征是测量每个服务器的响应速度(mb/s)和延迟(ms).当你的 ...

  7. 吴恩达机器学习作业Python实现(七):K-means和PCA主成分分析

    吴恩达机器学习系列作业目录 1 K-means Clustering 在这个练习中,您将实现K-means算法并将其用于图像压缩.通过减少图像中出现的颜色的数量,只剩下那些在图像中最常见的颜色. 1. ...

  8. 吴恩达机器学习作业Python实现(五):偏差和方差

    吴恩达机器学习系列作业目录 在本练习中,您将实现正则化的线性回归和多项式回归,并使用它来研究具有不同偏差-方差属性的模型 1 Regularized Linear Regression 正则线性回归 ...

  9. 吴恩达机器学习作业Python实现(四):神经网络(反向传播)

    吴恩达机器学习系列作业目录 1 Neural Networks 神经网络 在这个练习中,你将实现反向传播算法来学习神经网络的参数.依旧是上次预测手写数数字的例子. 1.1 Visualizing th ...

最新文章

  1. Python的list中的选取范围
  2. linux deepin是基于linux mint修改
  3. xgboost 正则项_深入理解Boosting算法(4)-XGBoost
  4. 牛客月赛42题解【完结】
  5. ping命令linux软件包,linux下安装 ping 命令
  6. js中call()方法和apply方法的使用
  7. 技术:叫我怎么爱上你
  8. CSS3 3D切割轮播图
  9. CCNA CCNP全套教材 CCNA CCNP视频 CCNA CCNP最新题库解析
  10. 安装visio2016出现无法安装
  11. Mac SecureCRT Toolbar 的图标很大很丑是不是?
  12. Launcher2 给桌面快捷方式图标加默认背景
  13. 10+ 张图来探究 Linux 内核,以及如何高效学习
  14. 植物大战僵尸 for Mac(策略游戏)m1
  15. SAP 如何打Note
  16. vue + elemen可远程搜索select选择器的封装(思路及源码分享)
  17. Java代码是怎么运行的?
  18. 鸿蒙之始 那个软件能播,智能电视安装这几款直播软件就够了,全是HD画质,还支持回看!...
  19. 美年旅游_自由行_新增自由行
  20. 软件工程课程团队项目——团队日志

热门文章

  1. 开发中为组件添加预览信息
  2. Error:java: Compilation failed: internal java compiler error
  3. Developer's Guide to Microsoft Enterprise Library, C# Edition
  4. word2vec原理知识铺垫
  5. 洛谷 P5089: CodeForces #500 (Div. 1) B / 1012B : Chemical table
  6. 674. Longest Continuous Increasing Subsequence最长连续递增子数组
  7. 上传单.多个文件的函数封装
  8. Jfinal集成Spring
  9. SpringMVC杂记(1) 使用阿里巴巴的fastjson
  10. 移动前端webApp开发点滴积累20140524