特征选择迷你项目

项目简介

Katie 在视频中解释了她在为“作者识别”项目准备 Chris 和 Sara 的邮件时遇到的一个问题, 即一个特征过于强大(就像签名一样,可以说给了算法一个有失公平的优势)。你将在此亲自探究这一发现。

过拟合决策树

此漏洞是在 Katie 试图为决策树迷你项目创建过拟合决策树的示例时发现的。 决策树作为传统算法非常容易过拟合,获得过拟合决策树最简单的一种方式就是使用小型训练集和大量特征。

如果决策树被过拟合,你期望测试集的准确率是非常高还是相当低?
答:低

如果决策树被过拟合,你期望训练集的准确率是高还是低?
答:高

特征数量和过拟合

过拟合算法的一种传统方式是使用大量特征和少量训练数据。你可以在 feature_selection/find_signature.py 中找到初始代码。 准备好决策树,开始在训练数据上进行训练,打印出准确率。

根据初始代码,有多少训练点?
答:18849

特别说明:根据你何时下载 find_signature.py 代码,你可能需要将第 9 至 10 行的代码更改为

1
2
words_file = "../text_learning/your_word_data.pkl" 
authors_file = "../text_learning/your_email_authors.pkl"

这样一来,通过运行 vectorize_text.py 创建而来的文件就可以得到适当的体现了。

另外,如果你由于内存问题而无法运行代码,而且如果你的 scikit-learn 版本是 0.16.x, 你可以从 features_train 被创建出来的行中删除 .toarray() 函数, 以节省内存——该版本中的决策树分类器可以将稀疏数组而非仅仅是密集数组作为输入。

你刚才创建的决策树的准确率是多少?
答:
(记住,我们设置决策树用于过拟合——理想情况下,我们希望看到的是相对较低的测试准确率。)

识别最强的特征

选择(过拟合)决策树并使用 featureimportances 属性来获得一个列表, 其中列出了所有用到的特征的相对重要性(由于是文本数据,因此列表会很长)。 我们建议迭代此列表并且仅在超过阈值(比如 0.2——记住,所有单词都同等重要,每个单词的重要性都低于 0.01)的情况下将特征重要性打印出来。

最重要特征的重要性是什么?该特征的数字是多少?
答:

使用 TfIdf 获得最重要的单词

为了确定是什么单词导致了问题的发生,你需要返回至 TfIdf,使用你从迷你项目的上一部分中获得的特征数量来获取关联词。 你可以在 TfIdf 中调用 get_feature_names() 来返回包含所有单词的列表;抽出造成大多数决策树歧视的单词。

这个单词是什么?类似于签名这种与 Chris Germany 或 Sara Shackleton 唯一关联的单词是否讲得通?
答:

删除重复

从某种意义上说,这一单词看起来像是一个异常值,所以让我们在删除它之后重新拟合。 返回至 text_learning/vectorize_text.py,使用我们删除“sara”、“chris”等的方法,从邮件中删除此单词。 重新运行 vectorize_text.py,完成以后立即重新运行 find_signature.py。

有跳出其他任何的异常值吗?是什么单词?像是一个签名类型的单词?(跟之前一样,将异常值定义为重要性大于 0.2 的特征)。
答:

再次检查重要特征

再次更新 vectorize_test.py 后重新运行。然后,再次运行 find_signature.py。

是否出现其他任何的重要特征(重要性大于 0.2)?有多少?它们看起来像“签名文字”,还是更像来自邮件正文的“邮件内容文字”?
答:

过拟合树的准确率

现在决策树的准确率是多少?
答:0.816268486917

我们已经移除了两个“签名词语”,所以要让我们的算法拟合训练集,同时不出现过拟合更为困难。记住,我们这里是想要知道我们是否会让算法过拟合,准确率如何并不是关键!

源码分享

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

书签

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

0%