Python与机器学习之实战(二)

Python与机器学习之生成学习算法(实战)

回顾

  • Python与机器学习之模型结构(生成学习算法二)
  • Python与机器学习之模型结构(生成学习算法)
  • 好文章

上章讨论了多项式事件模型(multinomial event model),该模型专为文本分类而生。
本章则根据该模型进行实战训练

项目介绍

In this problem, we will use the naive Bayes algorithm to build a spam classier.

In recent years, spam on electronic newsgroups has been an increasing problem. Here, we'll build a classier to distinguish between "real" newsgroup messages, and spam messages.

For this experiment, we obtained a set of spam emails, and a set of genuine newsgroup messages. Using only the subject line and body of each message, we'll learn to distinguish between the spam and non-spam.
1. 项目   ——   垃圾邮件分类
2. 数据   ——   联系我
3. 模型   ——   多项式事件模型
4. 算法   ——   朴素贝叶斯

==========================项目开始==========================

邮件预处理

由于初步介绍,邮件简单且是英语构成。
预处理方式:处理后
1. 第一行只有标题(label)
2. 接下来只有消息部分(part of message)
3. 邮件地址、网页地址、货币、数字等会被替代成特殊标记(EMAILADDR、DOLLAR等)

如图:原邮件
Python与机器学习之实战(二)_第1张图片

如图:预处理后邮件
Python与机器学习之实战(二)_第2张图片

邮件向量

本项目采用多项式事件模型,所以邮件被转换成一个长度为n的向量={x1,x2,…,xn},其中xi表示邮件第i个单词在特征词典V的位置。

特征词典

词典构建需要查阅大量资料,且根据项目背景、项目实际情况来设定。具体细节不多言。
部分如图:
Python与机器学习之实战(二)_第3张图片

训练

  • 根据多项式事件模型,对训练样本集进行极大似然估计,得到特征词典每个单词对垃圾邮件判别的影响值(注意加入拉普拉斯平滑)
  • 注意由于后验分布及数据量本身较多,单词概率往往趋近于0,所以进一步求Log,帮助量化分析

Show me the part Code

###################
#获得垃圾邮件和非垃圾邮件的矩阵信息
tmp1_matrix=matrix[category==1]
tmp0_matrix=matrix[category==0]
de1=tmp1_matrix.sum()+N
de2=tmp0_matrix.sum()+N
#运用多项事件模型的极大似然估计公式
for k in range(N):
    Fai_k1=np.log10((tmp1_matrix[:,k].sum()+1)*1./de1)
    Fai_k0=np.log10((tmp0_matrix[:,k].sum()+1)*1./de2)
    state.append([Fai_k1,Fai_k0])       
###################

预测

得到特征词典的极大似然估计集后,对新样本进行测试(实战~~~~).
如何预测呢?(后验估计)
对新样本分别对垃圾和非垃圾进行似然估计,算出两者概率后服从大者

Show me the part Code

#输出1为垃圾邮件,0则非垃圾邮件
for i in range(N):
        if Fai_k1.dot(matrix[i].T)>Fai_k0.dot(matrix[i].T):output[i]=1
        else:output[i]=0

结果

#预测结果和实际值比较,算出误差值
def evaluate(output, label):
    #Easily understand.
    error = (output != label).sum() * 1. / len(output)
    print('Error: %1.4f' % error)

很惊人的结果!
这里写图片描述

总结

一个粗糙的朴素贝叶斯模型就能对实际问题进行高度准确预测!
读者有兴趣的话,试用SVM模型分析,会发现几乎100%准确。
当然,之后我会继续讨论SVM(支持向量机)。

如果您看到这篇文章有收获或者有不同的意见,欢迎点赞或者评论。
python:190341254
丁。

你可能感兴趣的:(Python与数据分析)