前言
从贝叶斯谈到N-gram语言模型,此文中我们对贝叶斯定理、朴素贝叶斯、N-gram语言模型的相关理论,本篇主要针对上篇的理论进行案例实现。
- 使用工具:jupyter notobook
- 代码地址:Github
一、手写朴素贝叶斯分类器
此部分主要是根据理论部分的一些概率求解方式,用Python实现朴素贝叶斯分类函数,并通过手动创建的数据进行简单文本分类。
主要包括内容:
- 词向量构建;
- 相关概率计算;
- 平滑处理;
- 朴素贝叶斯分类函数;
- 测试
代码可见: ./01_垃圾邮件分类/01_手写朴素贝叶斯分类器(简单应用).ipynb
jupyter notebook便于写笔记,所以具体内容可查看原源代码中的笔记
二、使用朴素贝叶斯分类器进行垃圾邮件分类
此部分主要是使用上个文件中手写的朴素贝叶斯分类器进行垃圾邮件(具体数据)分类,详细内容可查看源代码。
数据说明:
- 数据在当前目录下的email目录下
- ham目录下:表示正常邮件
- spam目录下:表示垃圾邮件
- 邮件内容为英文
代码可见:./01_垃圾邮件分类/02_手写朴素贝叶斯分类器进行垃圾邮件分类.ipynb
三、使用sklearn中的库进行垃圾邮件分类
此部分使用Python自带的库进行垃圾邮件分类
数据说明:
- 解压
data.rar
- 数据在当前目录下的data目录下,一共包括215个文件夹,每个文件夹大概有300封邮件,所以一共有215*300 = 64500封邮件
- 每封邮件的标签在当前目录下的full目录下的index文件,其格式如下:
spam ../data/000/000
ham ../data/000/001
spam ../data/000/002
spam ../data/000/003
spam ../data/000/004
spam ../data/000/005
- 邮件内容为中文
- spam:表示垃圾邮件
- ham:表示正常邮件
使用不同模型效果如下表:
准确率 | 召回率 | F1值 | 耗时 |
---|---|---|---|
BernoulliNB(伯努利朴素贝叶斯) | 0.81592 | 0.98857 | 0.89398 |
随机森林 | 0.92649 | 0.99092 | 0.95762 |
KNN | 0.97480 | 0.94377 | 0.95903 |
SVM_rbf | 0.94858 | 0.94813 | 0.94836 |
决策树 | 0.89136 | 0.84722 | 0.86873 |
GBDT | 0.94053 | 0.98998 | 0.96462 |
每次运行结果可能不一样,但是大体趋势差不多;
- 通过上表,我们可以总结,朴素贝叶斯在垃圾邮件分类中的模型效果综合而言最好;虽然召回率不如随机森林、GBDT,但是后两者耗时比较长;
- 对于垃圾邮件分类,我们一般关注召回率,因为如果有1000封邮件,其中有10封垃圾邮件,如果模型将1000封都分类为正常邮件,那么准确率为 990 / 1000 = 99%,显然,虽然准确率高,但是并不是我们想要的。
代码可见:./01_垃圾邮件分类/03_使用Python库进行垃圾邮件分类.ipynb
此部分属于完整的项目实战,可多花点时间研究研究,工作中大体也如此。
四、新闻主题分类
此部分使用多项式朴素贝叶斯模型,进行新闻主题分类,主要设计:分词、文本处理(词频、去重、停用词)、特征提取、模型构建训练、模型评估
数据说明:
- 所有数据都在以上文件夹下
每个txt文件就是一篇新闻
-
文件夹对应标签信息如下:
C000008 财经 C000010 IT C000013 健康 C000014 体育 C000016 旅游 C000020 教育 C000022 招聘 C000023 文化 C000024 军事
代码可见: ./02_新闻主题分类/新闻主题分类.ipynb
详细内容可见源代码
五、简单语种分类
此部分主要介绍使用多项式朴素贝叶斯进行简单的语种检测的分类器
数据说明:
- 数据在当前目录下的data.csv中,包含English, French, German, Spanish, Italian 和 Dutch 6种语言,数据如下:
1 december wereld aids dag voorlichting in zuidafrika over bieten taboes en optimisme,nl
主要包括:
- 数据准备
- 数据分割
- 数据去噪
- 特征提取(CountVectorizer)
- 模型构建,训练
- 模型评估
代码可见:./03_简单语种检测/简单语种检测.ipynb
六、总结
几个案例看下来,基本的框架的都一样,在实际项目中,大体也是如此。但是在实际项目中,我们的数据可能没有这么的干净,需要我们做大量的数据清洗、预处理。其实工作中,我们大部分的时间都会花在这一部分,也就是机器学习中的特征工程。特征确定好了,其他的交给模型就好了,我们可以通过交叉验证使用不同的模型,最后选择最优的模型。
相信,通过理论+实践的过程,大家对朴素贝叶斯已经有了很好的理解。博主也是边学习边整理,希望大家多多指教,可加我主页的QQ,主要是用于机器学习、深度学习、NLP交流。