安然迷你项目

文章目录
  1. 1. 项目简介
  2. 2. 数据集大小
  3. 3. 数据集特征
  4. 4. 查找POI
  5. 5. 查询数据集
  6. 6. 研究安然欺诈案
  7. 7. 字典到数组转换
  8. 8. 缺少POI
  9. 9. 混合数据源
  10. 10. 源码分享
  11. 11. 书签

项目简介

安然欺诈案是一个混乱而又引人入胜的大事件,从中可以发现几乎所有想像得到的企业违法行为。安然的电子邮件和财务数据集还是巨大、混乱的信息宝藏,而且,在你稍微熟悉这些宝藏后,它们会变得更加有用。我们已将这些电子邮件和财务数据合并为一个数据集,而你将在此迷你项目中研究它。

开始:
克隆这个 GitHub 库:https://github.com/udacity/ud120-projects
运行开始代码:datasets_questions/explore_enron_data.py

数据集大小

聚合的安然电子邮件和财务数据集被存储到字典中,字典中的每个键是一个人名,而且值是包含此人所有特征的一个字典。

电子邮件和财务 (E+F) 数据字典被存储在 pickle 文件中,该文件可直接存储和加载 python 对象,非常方便。 使用 datasets_questions/explore_enron_data.py 加载数据集。

数据集中有多少数据点(人)?
答:146

数据集特征

对于每个人,有多少个特征可用?
答:21

查找POI

根据我们的定义,“POI”(Person of interest,嫌疑人)特征记录着一个人是否为相关人士的信息。

数据集中有多少 POI?也就是说,计算 data[person_name][“poi”]==1 时,字典中条目的数量。
答:18

更换数据源后存在多少 POI?
我们编辑了一个包含所有 POI 姓名的列表(在 ../final_project/poi_names.txt 中)并附上了相应的邮箱地址(在 ../final_project/poi_email_addresses.py 中)。

总共有多少 POI?(使用姓名列表,不要用邮箱地址,因为许多雇员不止一个邮箱,而且其中少数人员不是安然的雇员,我们没有他们的邮箱地址。)
答:35

不完整数据
你可以看到,我们在数据集中有许多POI,但不是所有。这为何会是一个潜在的问题?

我们将在稍后解释POI为何有可能不在安然数据集中,这样你就可以在往下继续之前完全理解这个问题。

查询数据集

和任何字典一样,个人特征可以这样被访问:

enron_data[“LASTNAME FIRSTNAME”][“feature_name”]
或者
enron_data[“LASTNAME FIRSTNAME MIDDLEINITIAL”][“feature_name”]

1、James Prentice 名下的股票总值是多少?
答:1095040

2、有多少来自 Wesley Colwell 的发给嫌疑人的电子邮件?
答:11

3、Jeffrey K Skilling 行使的股票期权价值是多少?
答:19250000

研究安然欺诈案

在下面的课程中,我们将介绍为什么大部分情况下,最好的特征都来自我们的直觉。这意味着我们将对安然欺诈案稍作了解。

如果你能腾出一个半小时的时间,可以观看《安然:房间中最聪明的伙计(Enron: The Smartest Guys in the Room)》这部纪录片,它精彩概述了整个事件。另外,还有许多报纸和故事记录着安然的兴衰成败。

下面这些阴谋中,哪一个没有安然的参与?

  • 每月底向空壳公司出售资产,并在次月初购回,以隐瞒会计损失
  • 造成加州电网断电
  • 非法获取政府报告,垄断浓缩橙汁行业
  • 图谋为一名沙特王子加急办理美国公民身份
  • 计划与卖座电影合作在网上传输电影

1、欺诈案发生的多数时间内,安然的 CEO 是谁?
答:Jeffrey Skilling

2、安然的董事会主席是谁?
答:Kenneth Lay

3、欺诈案发生的多数时间内,安然的 CFO(首席财务官)是谁?
答:Andrew Fastow

4、这三个人(Lay、Skilling 和 Fastow)当中,谁拿回家的钱最多(“total_payments”特征的最大值)?
答:LAY KENNETH L 103559793

5、对于数据集中的所有人,不是每一个特征都有值。当特征没有明确的值时,我们使用什么来表示它?
答:NaN

6、此数据集中有多少雇员有量化的工资?已知的邮箱地址是否可用?
答:95,111

字典到数组转换

不能将 python 字典直接读入到 sklearn 分类或回归算法中;它其实需要一个 numpy 数组,或者一个由列表组成的列表(此列表本身是一个列表,它的每个元素都是数据点,而较小列表的元素是该点的特征)。

我们编写了一些辅助函数(tools/feature_format.py 中的 featureFormat() 和 targetFeatureSplit()),它们可以获取特征名的列表和数据字典,然后返回 numpy 数组。

如果特征没有某个特定人员的值,此函数还会用 0(零)替换特征值。

缺少POI

如你刚才所见,不是每个 POI 在数据集中都有一个条目(比如:Michael Krautz)。那是因为数据集是通过你在 final_project/enron61702insiderpay.pdf 中找到的财务数据所创建的,这些数据中缺少了一些 POI(这些缺失的 POI 被传送至最终的数据集)。另一方面,对于这些“缺少的”POI,我们确实有他们的邮件。

尽管向数据集中添加这些 POI 和他们的信息,并且为财务信息设置“NaN”非常简单,但这会带来一个微妙的问题。你将在此处了解到这一问题。

1、(当前的)数据集中有多少人的薪酬总额被设置了“NaN”?数据集中这些人的比例占多少?
答:21,14.3835616438%

2、数据集中有多少 POI 的薪酬总额被设置了“NaN”?这些 POI 占多少比例?
答:0,0.0%

3、如果机器学习算法将 total_payments 用作特征,你希望它将“NaN”值关联到 POI 还是非 POI?
答:非POI

4、如果你再次添加了全是 POI 的 10 个数据点,并且对这些雇员的薪酬总额设置了“NaN”,你刚才计算的数字会发生变化。
数据集中这些人的数量变成了多少?薪酬总额被设置了“NaN”的雇员数变成了多少?
答:156,31

5、数据集中的 POI 数量变成了多少?薪酬总额被设置了“NaN”的 POI 数量变成了多少?
答:28,10

6、在添加了新的数据点后,你是否认为,监督式分类算法可将 total_payments 为“NaN”理解为某人是 POI 的线索?
答:是

混合数据源

此例中加入了新的 POI,而我们没有任何人的财务信息,这就带来了一个微妙的问题,即算法可能会注意到我们缺少他们的财务信息,并将这一点作为他们是POI的线索。换个角度来看,为我们的两个类生成数据的方式现在有所不同 - 非POI的人全都来自财务电子表格,之后手动加入了许多POI。这种不同可能会诱使我们以为我们的表现优于实际状况 - 假设你使用 POI 检测器来确定某个未见过的新人是否是 POI,而且该人不在电子表格上。然后,他们的所有财务数据都将包含“NaN”,但该人极有可能不是 POI(世界上非 POI 的人比 POI 多得多,即使在安然也是如此)- 然而你可能会无意中将他们标识为 POI!

这就是说,在生成或增大数据集时,如果数据来自不同类的不同来源,你应格外小心。它很容易会造成我们在此展示的偏差或错误类型。可通过多种方法处理此问题。举例而言,如果仅使用了电子邮件数据,则你无需担心此问题(在这种情况下,财务数据中的差异并不重要,因为并未使用财务特征)。还可以通过更复杂的方法来估计这些偏差可能会对你的最终答案造成多大影响,不过此话题超出了本课程的范围。

目前的结论就是,要非常小心地对待引入来自不同来源(具体取决于类)的特征这个问题!引入此类特征常常会意外地带来偏差和错误。

源码分享

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

书签

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