朴素贝叶斯迷你项目

项目背景

几年前,J.K. 罗琳(凭借《哈利波特》出名)试着做了件有趣的事。她以 Robert Galbraith 的化名写了本名叫《The Cuckoo’s Calling》的书。尽管该书得到一些不错的评论,但是大家都不太重视它,直到 Twitter 上一个匿名的知情人士说那是 J.K. Rowling 写的。《伦敦周日泰晤士报》找来两名专家对《杜鹃在呼唤》和 Rowling 的《偶发空缺》以及其他几名作者的书进行了比较。分析结果强有力地指出罗琳就是作者,《泰晤士报》直接询问出版商情况是否属实,而出版商也证实了这一说法,该书在此后一夜成名。

我们也将在此项目中做类似的事。我们有一组邮件,分别由同一家公司的两个人撰写其中半数的邮件。我们的目标是仅根据邮件正文区分每个人写的邮件。在这个迷你项目一开始,我们将使用朴素贝叶斯,并在之后的项目中扩展至其他算法。

我们会先给你一个字符串列表。每个字符串代表一封经过预处理的邮件的正文;然后,我们会提供代码,用来将数据集分解为训练集和测试集(在下节课中,你将学习如何进行预处理和分解,但是现在请使用我们提供的代码)。

朴素贝叶斯特殊的一点在于,这种算法非常适合文本分类。在处理文本时,常见的做法是将每个单词看作一个特征,这样就会有大量的特征。此算法的相对简单性和朴素贝叶斯独立特征的这一假设,使其能够出色完成文本的分类。在这个迷你项目中,你将在计算机中下载并安装 sklearn,然后使用朴素贝叶斯根据作者对邮件进行分类。

环境准备

1、检查你是否装有可用的 python,版本最好是 2.6 或 2.7(这是我们使用的版本 - 其他版本应该也可以,但我们不敢保证)。
2、我们会使用 pip 来安装一些包。首先,从此处获取并安装 pip。
3、使用 pip 安装一系列 Python 包:

  • 转到终端行界面(请勿打开 Python,只打开命令提示符)
  • 安装 sklearn: pip install scikit-learn
  • 此处包含 sklearn 安装说明,可供参考

4、安装自然语言工具包:pip install nltk
5、获取机器学习简介源代码。你将需要 git 来复制资源库:git clone https://github.com/udacity/ud120-projects.git

你只需操作一次,基础代码包含所有迷你项目的初始代码。进入 tools/ 目录,运行 startup.py。该程序首先检查 python 模块,然后下载并解压缩我们在后期将大量使用的大型数据集。下载和解压缩需要一些时间,但是你无需等到全部完成再开始第一部分。

运行代码

naive_bayes/nb_author_id.py 中创建和训练朴素贝叶斯分类器,用其为测试集进行预测。准确率是多少?

1
2
training time: 1.517 s
0.973265073948

在训练期间,你可能会看到以下错误:“用户警告:分数重复。结果可能取决于特征排序,或者你对回归任务使用了分类分数。” 警告(“分数重复。结果可能取决于特征排序。”)

邮件中两个以上的单词恰巧具有相同的使用模式时,会出现这一警告—对算法而言,这表示两个特征是相同的。当重复特征出现时,一些算法实际上会中断(数学上无法运行),或给出多个不同的答案(取决于特征排序),然后 sklearn 发出警告。这种信息能起到帮助作用,所以我们无需担心。

练习: 作者身份准确率
在此问题中,一些学员在执行代码时会遇到内存问题。为了降低运行代码时看到内存错误的提示,我们建议你使用 RAM 至少为 2GB 的计算机。如果你发现代码造成内存错误,你也可以尝试在 email_preprocess.py 文件中设置 test_size = 0.5。

对分类器计时

我们之前未明确提及的一个重要主题是何时训练和测试算法。在你分类器所在行的上方和下方插入两行代码,就像这样:

1
2
3
t0 = time()
< 你的 clf.fit() 代码行 >
print 'training time:', round(time()-t0, 3), 's'

在你的 clf.predict() 代码行前后也加上这段代码,这样你可以比较训练分类器的所需时间,并作出预测。训练和预测哪一个更快?

我们会把朴素贝叶斯的用时与其他几种算法比较,所以请记下你得到的时间和准确率,在下一个迷你项目中,我们还会用到。

源码分享

https://github.com/voidking/ud120-projects

书签

机器学习入门
https://cn.udacity.com/course/intro-to-machine-learning--ud120

0%