作者:
Joel Grus
读者:
锅巴GG
Joel Grus 是 Google 的一位软件工程师,曾于数家创业公司担任数据科学家。目前住在西雅图,专注于数据科学工作并乐此不疲。偶尔在 joelgrus.com 发表博客,长期活跃于Twitter @joelgrus。Github
数据的威力
生活中,数据无处不在。用户的每次点击,网站都会记录下来。你每时每刻的位置和速度,智能手机也会记录下来。“量化自我”生活方式的倡导者使用智能计步器记录心率、行动习惯、饮食习惯、睡眠方式。智能汽车记录驾驶习惯,智能家居设施记录生活习惯,智能购物设备记录购物习惯,等等。互联网是一个广袤的知识谱系,包括有无数交叉引用的百科全书,电影、音乐、赛讯、弹球机、模因、鸡尾酒等各种专业数据库,以及许多政府发布的多得让人理不清头绪的统计数据(某些还是比较真实的)。
在这些数据之中隐藏着无数问题的答案,这些问题从没有人提出过。让我们在这本书中一起学习如何找出这些问题。
- 什么是数据科学家?
数据科学家有什么特点呢?他们是计算机科学家中的统计专家,是统计专家中的计算机科学家。数据科学家是能够从混乱数据中剥离出洞见的人。
线性代数
线性代数是数学的一个分支,研究向量空间
向量
抽象地说,向量是指可以加总(以生成新的向量),可以乘以标量(即数字),也可以生成新的向量的对象。
具体来说(对我们而言),向量是有限维空间的点。即使你本无意视你的数据为向量,将数值数据表示为向量也是非常好的处理方式。
- 向量的运算
最简单的入门方法是将向量表示为数字的列表。一个包含三个数字的列表对应一个三维空间的向量,反之亦然:
170, # 磅
40 ] # 岁
grades = [95, # 考试1
80, # 考试2
75, # 考试3
62 ] # 考试4
>
> 我们常常需要对两个向量做加法。向量以分量方式(componentwise)做运算。
* 点乘(dot product)
>两个向量的点乘表示对应元素的分量乘积之和
> 点乘衡量了向量 v 在向量 w 方向延伸的程度。
>
![向量投影](http://upload-images.jianshu.io/upload_images/1772-0e548302b8d8f647.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
### 矩阵
>**矩阵**是一个二维的数据集合。我们将矩阵表示为列表的列表,每个内部列表的大小都一样,表示矩阵的一行。如果 A 是一个矩阵,那么 A[i][j] 就表示第 i 行第 j 列的元素。按照数学表达的惯例,我们通常用大写字母表示矩阵。
* 矩阵的重要性不言而喻,原因有以下几个:
1. 可以通过将每个向量看成是矩阵的一行,来用矩阵表示一个包含多维向量的数据集。例如,如果有 1000 个人的身高、体重和年龄,就可以创建一个 1000×3 的矩阵。
2. 可以用一个 n×k 矩阵表示一个线性函数,这个函数将一个 k 维的向量映射到一个 n 维的向量上。我们使用的很多技术与概念都隐含着这样的函数。
3. 可以用矩阵表示二维关系。
#### 延伸学习
线性代数在数据科学家中应用很广(通常是隐式使用,且不谙此道的人也经常使用)。阅读这方面的教材是个好主意。网上也有很多免费资源,如:
* UC Davis 提供的有关线性代数的资源(https://www.math.ucdavis.edu/~linear/);
* 圣迈克尔大学提供的有关线性代数的资源(http://joshua.smcvt.edu/linearalgebra/);
* 对 喜 欢 挑 战 的 读 者 来 说,Linear Algebra Done Wrong(http://www.math.brown.edu/~treil/papers/LADW/LADW.html)是一本进阶读物。
### 统计学
>统计学是我们赖以理解数据的数学与技术。这是一个庞大繁荣的领域,要用图书馆的一整个书架(甚至一整间屋子)的书来阐述。
* 描述单个数据集
>对任何数据集,最简单的描述方法就是数据本身:
num_friends = [100, 49, 41, 40, 25,
……等等许多
]
对足够小的数据集来说,这甚至可以说是最好的描述方法。但随着数据规模变大,这就显得笨拙又含混了。(想象一个包含一亿个数字的列表。)为此,我们使用统计来提炼和表达数据的相关特征。
* 中心倾向
> 我们常常希望了解数据中心位置的一些概念。一个常用的方法是使用均值(mean 或average),即用数据和除以数据个数。
> 如果你有两个数据点,均值就意味着两点的中间点。随着数据集中点数的增加,均值点会移动,但它始终取决于每个点的取值。
> 我们常常也会用到中位数(median),它是指数据中间点的值(如果数据点的个数是奇数),或者中间两个点的平均值(如果数据点的个数是偶数)。
> **均值对数据中的异常值非常敏感。**
* 离散度
> * 离散度是数据的离散程度的一种度量。通常,如果它所统计的值接近零,则表示数据聚集在一起,离散程度很小,如果值很大(无论那意味着什么),则表示数据的离散度很大。例如,一个简单的度量是极差(range),指最大元素与最小元素的差。
> * 离散度的另一个更复杂的度量是方差(variance)
> * 方差的单位是原数据单位的平方(即“平方朋友”)。然而,用方差很难给出直观的比较,所以我们更常使用标准差(standard deviation)
> **一种更加稳健的方案是计算 75% 的分位数和 25% 的分位数之差**
* 相关
>用户在某个网站上花费的时间与其在这个网站上拥有的朋友数相关(他并不是一个无所事事的领导)。现在,他要求你来验证这个想法。
* 协方差(covariance),这个概念是方差的一个对应词。方差衡量了单个变量对均值的偏离程度,而协方差衡量了两个变量对均值的串联偏离程度。
>回想一下点乘(dot)的概念,它意味着对应的元素对相乘后再求和。如果向量 x 和向量 y的对应元素同时大于它们自身序列的均值,或者同时小于它们自身序列的均值,那将为求和贡献一个正值。如果其中一个元素大于自身的均值,而另一个小于自身的均值,那将为求和贡献一个负值。因此,如果协方差是一个大的正数,就意味着如果 y 很大,那么 x 也很大,或者如果 y 很小,那么 x 也很小。如果协方差为负而且绝对值很大,就意味着 x 和 y 一个很大,而另一个很小。接近零的协方差意味着以上关系都不存在。
>
>**这个数字很难解释,原因如下:**
> * 它的单位是输入单位的乘积(即朋友 - 分钟 - 每天),难于理解。(“朋友 - 分钟 - 每天”是什么鬼?)
> * 如果每个用户的朋友数增加到两倍(但分钟数不变),方差会增加至两倍。但从某种意义上讲,变量的相关度是一样的。换句话讲,很难说“大”的协方差意味着什么。
> **因此,相关是更常受到重视的概念,它是由协方差除以两个变量的标准差**
>* 相关系数没有单位,它的取值在 -1(完全反相关)和 1(完全相关)之间。相关值 0.25 代表一个相对较弱的正相关。
>
> **相关系数的计算对异常值非常敏感。如果我们计算时希望忽略这个人,该怎么做呢?**
* 辛普森悖论
> 辛普森悖论是指分析数据时可能会发生的意外。具体而言,如果忽略了混杂变量,相关系数会有误导性。
>
>关键点在于,相关系数假设在其他条件都相同的前提之下衡量两个变量的关系。而当数据类型变成随机分配,就像置身于精心设计的实验之中时,“其他条件都相同”也许还不是一个糟糕的前提假设。但如果存在另一种类型分配的更深的机制,“其他条件都相同”可能会成为一个糟糕的前提假设。
>
>避免这种窘境的唯一务实的做法是充分了解你的数据,并且尽可能核查所有可能的混杂因
素。显然,这不可能万无一失。
* 相关系数其他注意事项
>相关系数为零表示两个变量之间不存在线性关系。但它们之间还可能会存在其他形式的关
系。相关系数无法告诉你关系有多强。即便两个变量完全相关,但(这取决于你想度量什么)很有可能这种关系并没有实际意义。
* 相关和因果
> 你很可能听说过这样一句话:**“相关不是因果。”**
> 这样的说辞大致出自一位遇到了一堆威胁着他不可动摇的世界观的数据的人之口。然而,这是个重要的论断——如果 x 和 y 强相关,那么意味着可能 x 引起了 y,或 y 引起了 x,或者两者相互引起了对方,或者存在第三方因素同时引起了 x 和 y,或者什么都不是。
>
>进行随机试验是证实因果关系的可靠性的一个好方法。你可以先将一组具有类似的统计数
据的用户随机分为两组,再对其中一组施加稍微不同的影响因素,然后你会发现,不同的
因素会导致不同的结果。
## 概率
>为了达到我们的目的,你得把概率论视为对从事件空间中抽取的事件的不确定性进行量化
的一种方式。我们暂且不探究术语的技术内涵,而是用掷骰子的例子来理解它们。空间是
指所有可能的结果的集合。这些结果的任何一部分就是一个事件,比如,“骰子掷出的点
数为 1”“骰子掷出的点数是偶数”等都是事件。
>
>我们用 P(E) 来标记“事件 E 的概率”。
* 不独立和独立
> 泛泛地讲,如果 E 发生意味着 F 发生(或者 F 发生意味着 E 发生),我们就称事件 E 与事件 F 为不相互独立(dependent)。反之,E 与 F 就相互独立(independent)。
>
> 举个例子,如果两次掷起一枚均匀的硬币,那么我们无法根据第一次掷硬币的结果是否是
正面朝上来判断第二次的结果是否正面朝上。第一次掷硬币的结果和第二次掷硬币的结
果,这两个事件就是独立的。相反,如果第一次掷硬币的结果是正面朝上,那么我们能很
明显能判断出两次掷硬币是否都是反面朝上。(如果第一次掷硬币的结果是正面朝上,那
么很明显两次掷硬币的结果不可能都是反面朝上。)因此,第一次结果正面朝上和两次结
果不可能都是反面朝上,这两个事件就是不独立的。
>
>从数学角度讲,事件 E 和事件 F 独立意味着两个事件同时发生的概率等于它们分别发生的
概率的乘积:
>```
P(E, F)=P(E)P(F)
在上例中,“第一次掷硬币正面朝上”的概率为 1/2,“两次掷硬币都是背面朝上”的概率
为 1/4,但“第一次掷硬币正面朝上并且两次掷硬币都是背面朝上”的概率为 0。
- 条件概率
如果事件 E 与事件 F 独立,那么定义式如下:
P(E, F)=P(E)P(F)
如果两者不一定独立(并且 F 的概率不为零),那么 E 关于 F 的条件概率式如下:
P(E|F)=P(E, F)/P(F)
条件概率可以理解为,已知 F 发生,E 会发生的概率。
更常用的公式是上式的变形:
P(E, F)=P(E|F)P(F)
如果 E 和 F 独立,则上式应该表示为:
P(E|F)=P(E)
这个数学公式意味着,F 是否发生并不会影响 E 是否发生的概率。
举一个常见的关于一个有两个孩子(性别未知)的家庭的有趣例子。
如果我们假设:
- 每个孩子是男孩和是女孩的概率相同
- 第二个孩子的性别概率与第一个孩子的性别概率独立
那么,事件“没有女孩”的概率是 1/4,事件“一个男孩,一个女孩”的概率为 1/2,事件
“两个女孩”的概率为 1/4。现在,问题是事件 B“两个孩子都是女孩”关于事件 G“大孩子是女孩”的条件概率是多少?
用条件概率的定义式进行计算如下:
P(B|G)=P(B, G)/P(G)=P(B)/P(G)=1/2
事件 B 与 G 的交集(“两个孩子都是女孩并且大孩子是女孩”)刚好是事件 B 本身。(一旦你知道两个孩子都是女孩,那大孩子必然是女孩。)接着再问,事件“两个孩子都是女孩”关于事件“至少一个孩子是女孩”(L)的条件
概率是多少?出乎意料的是,结果异于前问。
与前问相同的是,事件 B 和事件 L 的交集(“两个孩子都是女孩,并且至少一个孩子是女
孩”)刚好是事件 B。这意味着:
P(B|L)=P(B, L)/P(L)=P(B)/P(L)=1/3
为什么会有这样的结果?如果你已知至少一个孩子是女孩,那么这个家庭有一个男孩和一
个女孩的概率是有两个女孩的两倍。
- 贝叶斯定理
贝叶斯定理是数据科学家的最佳朋友之一,它是条件概率的某种逆运算。
假设我们需要计算事件 E 基于已发生的事件 F 的条件概率,但我们已知的条件仅仅是事件 F 基于已发生的事件 E 的条件概率。两次利用条件概率的定义,可以得到下式:
P(E|F) = P(E, F)/P(F) = P(F|E)P(E)/P(F)
事件 F 可以分割为两个互不重合的事件“F 和 E 同时发生”与“F 发生 E 不发生”。我们用符号
E 指代“非 E”(即“E 没有发生”),有下式:
因此:
上式为贝叶斯定理常用的表达方式。
移除异常值之后的相关系数我们实际上假设了人们接受测试的概率或多或少
都是随机的。如果只有表现出特定症状的人才会去接受测试,我们应该将表
达式重新表达为基于事件“测试结果正常,并且表现出症状”的条件概率,
这样计算出的结果会增高很多。
* 随机变量
> 随机变量指这样一种变量,其可能的取值有一种联合概率分布。
> 1. 定义一个简单的随机变量:掷起一枚硬币,如果正面朝上,随机变量等于 1,如果背面朝上,随机变量等于 0。
> 2. 可以再定义更复杂些的随机变量,如掷起一枚硬币 10 次,查看正面朝上的次数,或者从
range(10) 取出的一个值,每个数值被取到的可能性都相等。
>
>**联合分布**对变量实现每种可能值都赋予了概率。通过掷硬币得到的随机变量等于 0 的概率
为 0.5,等于 1 的概率也为 0.5。从 range(10) 中生成随机变量的分布为从 0 到 9 之间的每个数值赋予 0.1 的概率。
>有时会讨论一个随机变量的期望值,表示这个随机变量可能值的概率加权值。掷硬币
随机变量的期望值为 1/2(=0 * 1/2 + 1 * 1/2),而 range(10) 随机变量的期望值为 4.5。
>随机变量也可以基于某些条件事件产生,就像其他事件一样。
>大部分情况下,我们会隐式使用随机变量的概念,即在使用时,并没有对此加以特别关
注。如果仔细思考,可以看出其中的端倪。
* 连续分布
>掷硬币对应的是**离散分布**(discrete distribution)——对离散的结果赋予正概率。我们常常希望对**连续结果的分布**进行建模。(对于我们的研究目的来说,这些结果最好都是实数,但实际中并不总是这样的)例如,均匀分布(uniform distribution)函数对 0 到 1 之间的所有值都赋予相同的权重(weight)。
>
>因为 0 和 1 之间有无数个数字,因而对每个点而言,赋予的权重几乎是零。因此,我们用
带概率密度函数(probability density function,pdf)的连续分布来表示概率,一个变量位于某个区间的概率等于概率密度函数在这个区间上的积分。
>
>我们还常常对累积分布函数(cumulative distribution function,cdf)感兴趣,这个函数给出了一个随机变量小于等于某一特定值的概率。
* 正态分布
>正态分布是分布之王!它是典型的钟型曲线形态分布函数,可以完全由两个参数决定:
均值 μ(mu)和标准差 σ(sigma)。均值描述钟型曲线的中心,标准差描述曲线有多
“宽”。
>正态分布的分布函数如下:
>
![](http://upload-images.jianshu.io/upload_images/1772-18215b87bbdeef02.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
* 中心极限定理
>正态分布的运用如此广泛,很大程度上归功于中心极限定理(central limit theorem)。这个定理说,一个定义为大量独立同分布的随机变量的均值的随机变量本身就是接近于正态分布的。
![](http://upload-images.jianshu.io/upload_images/1772-9217f9d33713b672.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
>近似表达的意义在于,如果你想知道掷起一枚均匀的硬币 100 次中正面朝上超过 60 次的概率,那么可以用一个正态分布 Normal(50, 5) 的随机变量大于 60 的概率来估计。这比计算二项式分布 Binonimal(100, 0.5) 的累积分布函数更容易(尽管在大多数应用中,你可以借助统计软件方便地计算出任何你想要的概率)。
## 假设与推断
>具备以上统计学和概率理论知识以后,我们接着该做什么呢?数据科学的科学部分,乃是不断针对我们的数据和生成数据的机制建立假设和检验假设。
* 统计假设检验
>在各种各样的假设之下,这些统计数据可以理解为从某种已知分布中抽取的随机变量观测值,这可以让我们对这些假设是否成立做出论断。
* 置信区间
>我们一直在对正面朝上的概率 p 进行假设检验,这是未知的“正面朝上”分布的参数。对假设检验,我们还有第三种方法:在参数的观测值附近建立置信区间(confidence interval)。
>
>例如,我们可以通过计算每次抛掷对应的伯努利随机变量的均值来估计不均匀硬币的概率——正面朝上记为 1,背面朝上记为 0,取这一系列伯努利随机变量的平均值。如果我们观测的 1000 次抛掷中有 525 次正面朝上,那么我们可以估计出 p 等于 0.525。
但是这个估计的可信度有多大呢?如果我们已知 p 的精确值,那么根据**中心极限定理**,伯努利随机变量的均值近似服从**正态分布**,其中均值为 p,标准为:
>`math.sqrt(p * (1 - p) / 1000)`
>这里,p 是未知的,所以我们使用估值:
>```
p_hat = 525 / 1000
mu = p_hat
sigma = math.sqrt(p_hat * (1 - p_hat) / 1000) # 0.0158
这种计算是不严格的,但运用广泛。
借助正态近似我们得出结论:以下区间包含真实参数p 的可能性为 95%:
normal_two_sided_bounds(0.95, mu, sigma) # [0.4940, 0.5560]
这是关于区间的解释,不是关于 p 值的解释。你需要这样理解:如果你重复实验很多次,其中 95% 的“真”参数(每次都相同)会落在观测到的置信区间(每次可能会都不同)中。
- P-hacking
如果一个程序仅有 5% 的时间错误地拒绝了原假设,那么根据定义,5% 的时间会错误地拒绝原假设。
- 运行A/B测试
这某种程度上有些欺骗性。只有在标准差已知的条件下数学推理才正确。我们从数据中估计参数,这意味着我们实际中应该用 t 分布。但如果数据集足够大,正态分布和 t 分布之间的差别可以忽略不计。
- 贝叶斯推断
我们所看到的处理方式都包含对检验所做的与概率有关的陈述:“如果原假设正确,那么你观测到极端统计量的概率仅有 3%。”
推断的一个替代方法是将未知参数视为随机变量。分析师(也就是你)从参数的先验分布(prior distribution)出发,再利用观测数据和贝叶斯定理计算出更新后的后验分布(posterior distribution)。不再对检验本身给出概率判断,而是对参数本身给出概率判断。
比如,如果未知参数是概率(就像掷硬币的例子),我们使用 Beta 分布(Beta distribution)作为先验分布,Beta 分布仅对 0 和 1 赋值。后验分布也是 Beta 分布,这并非偶然。二项分布给出了正面朝上的数字,Beta 是二项分布的共轭先验分布(conjugate prior,http://www.johndcook.com/blog/conjugate_prior_diagram/)
这意味着,无论你何时使用从相关的二项分布中得到的观测值更新 Beta 先验分布,你还是会得到一个 Beta 后验分布。
用贝叶斯推断进行假设检验是饱受争议的——部分源于它的数学原理非常复杂,部分源于选择先验分布的主观性。
梯度下降
从事数据科学工作时,常常会面临这样的需要:为某种特定的情形寻找最佳模型。“最佳”常常会被解读为某种类似于“最小化模型残差”或者“最大化数据的可能性”。换句话说,它代表了优化某种问题的解决方案。
这意味着我们需要解决一连串的最优化问题。尤其是,我们需要从零开始解决问题。我们采用的方法是一种叫作梯度下降(gradient descent)的技术,适合从零开始逐步解决问题。
- 梯度下降的思想
对函数来说,梯度(在微积分里,这表示偏导数向量)给出了输入值的方向,在这个方向上,函数增长得最快。
- 随机梯度下降法
我们常常用梯度下降的方法,通过最小化某种形式的残差来选择模型参数。如果使用之前的批处理方法,每个梯度计算步都需要我们预测并计算整个数据集的梯度,这使每一步都会耗费很长时间。
现在,这些残差函数常常具有可加性(additive),意味着整个数据集上的预测残差恰好是每个数据点的预测残差之和。
在这种情形下,我们转而使用一种称为随机梯度下降(stochastic gradient descent)的技术,它每次仅计算一个点的梯度(并向前跨一步)。这个计算会反复循环,直到达到一个停止点。
获取数据
略过了,个人建议和本书作者一致,使用Python
数据工作
- 探索你的数据
当确定了需要研究的问题,并已获取了一些数据时,你摩拳擦掌地恨不得马上建模求解。但是,你需要克制一下。首先,你应该探索数据。
- 探索一维数据
最简单的情形是,你得到的一个数据集合仅仅是一维数据集。
这两种分布有非常不同的最大值和最小值。但是,仅仅知道这一点并不足以理解它们有何差异。
- 二维数据
散点图
- 多维数据
对于多维数据,你可能想了解各个维度之间是如何相关的。一个简单的方法是考察相关矩阵(correlation matrix),矩阵中第 i 行第 j 列的元素表示第 i 维与第 j 维数据的相关性。
散点图矩阵
通过这些散点图
你会看出,序列 1 与序列 0 的负相关程度很高,序列 2 和序列 1 的正相关程度很高,序列 3 的值仅有 0 和 6,并且 0 对应序列 2 中较小的值,6 对应较大的值。
- 数据清洗、处理
清洗和预处理等
- 数据调整
许多技术对数据单位(scale)敏感。比如,假设你有一个包括数百名数据科学家的身高和体重的数据集,并且需要创建体型大小的聚类(cluster)。
直观上讲,我们用聚类表示相近的点,这意味着我们需要某种点距离的概念。我们知道有欧几里得距离函数 distance,所以自然地,一种方法是将数据对 (height, weight) 视为二维空间中的点。
- 降维
有时候,数据的“真实”(或有用的)维度与我们掌握的数据维度并不相符。
数据的大部分变差看起来像是沿着单个维度分布的,既不与 x 轴对应,也不与 y 轴对应。
当这种情形发生时,我们可以使用一种叫作主成分分析(principal component analysis,PCA)的技术从数据中提取出一个或多个维度,以捕获数据中尽可能多的变差。
实际上,这样的技术不适用于低维数据集。
降维多用于数据集的维数很高的情形。
你可以通过一个小子集来抓住数据集本身的大部分变差。
不过,这种情况很复杂,绝非一两章能讲得清。
现在,已有一个去均值的矩阵 X,我们想问,最能抓住数据最大变差的方向是什么?
具体来说,给定一个方向 d(一个绝对值为 1 的向量),矩阵的每行 x 在方向 d 的扩展是点积 dot(x, d)。并且如果将每个非零向量 w 的绝对值大小调整为 1,则它们每个都决定了一个方向。
我们可以找出使方差最大的那个方向。只要得到梯度函数,我们就可以通过梯度下降法计算出来。
第一主成分仅是使函数最大化的方向。
一旦我们找到了第一主成分的方向,就可以将数据在这个方向上投影得到这个成分的值,
如果还想得到其他的成分,就要先从数据中移除投影,
在更高维的数据集中,我们可以通过迭代找到我们所需的任意数目的主成分,然后再将原数据转换为由主成分生成的低维空间中的点。
这种技术很有价值,原因有以下几点。首先,它可以通过清除噪声维度和整合高度相关的维度来帮助我们清理数据。
在提取出数据的低维代表后,我们就可以运用一系列并不太适用于高维数据的技术。我们可以在本书的很多地方看到运用这种技术的例子。
同时,它既可以帮助你建立更棒的模型,又会使你的模型更难理解。
很容易理解诸如“工作年限每增加一年,平均工资会增加 1 万美元”这样的结论。
但诸如“第三主成分每增加0.1,平均工资就会增加 1 万美元”这样的结论就很难理解了。
机器学习
在很多人眼里,数据科学几乎就是机器学习,而数据科学家每天做的事就是建立、训练和调整机器学习模型(而且,这些人当中有很大一部分并不真正知道机器学习是什么)。
事实上,数据科学的主要内容是把商业问题转换为数据问题,然后收集数据、理解数据、清理数据、整理数据格式,而后才轮到机器学习这一后续工作。
尽管如此,机器学习也是一种有趣且必要的后续工作,为了做好数据科学工作,你很有必要学习它。
- 建模
什么是模型?它实际上是针对存在于不同变量之间的数学(或概率)联系的一种规范。
比如,如果你想为你的社交网站融资,可以建立一个商业模型(大多数情况下建立在一个工作表里),模型的输入是诸如“用户数”“每位用户的广告收入”“雇员数”之类的变量,输出是接下来几年的年度利润。
- 什么是机器学习?
是创建并使用那些由学习数据而得出的模型。
在其他语境中,这也可以叫作预测建模或者数据挖掘。
一般来说,我们的目标是用已存在的数据来开发可用来对新数据预测多种可能结果的模型,比如:
- 预测一封邮件是否是垃圾邮件
- 预测一笔信用卡交易是否是欺诈行为
- 预测哪种广告最有可能被购物者点击
- 预测哪支橄榄球队会赢得超级杯大赛
下面我们会看到有监督的模型(其中的数据标注有正确答案,可供学习)和无监督的模型(没有标注)。半监督的模型(其中有一部分数据带有标注)和在线的模型(模型需要根据新加入的数据做持续调整)。
- 过拟合和欠拟合
在机器学习中,一种常见的困境是过拟合(overfitting)——指一个在训练数据上表现良好,但对任何新数据的泛化能力却很差的模型。这可能牵扯到对数据中噪声的学习,也可能涉及学习识别特别的输入,而不是对可以得到期望的输出进行准确预测的任何因素。
另一种有害的情况是欠拟合(underfitting),它产生的模型甚至在训练数据上都没有好的表现,尽管通常这暗示你模型不够好而要继续寻找改进的模型。
水平线显示了最佳拟合阶数为 0(也就是常数)的多项式,它对训练数据来说存在严重的欠拟合。最佳拟合的阶数为 9(也就是有 10 个参数)的多项式精确地穿过训练数据的每个点,但这是严重过拟合的。
如果模型对训练数据是过拟合的,那么它在(完全划分开的)测试数据集上会有可能真的表现得很不好,换句话说,如果它在测试数据上表现良好,那么你可以肯定地说它拟合良好而非过拟合。
- 正确性
模型的选择通常是查准率和查全率之间的权衡。一个模型如果在信心不足的情况下预测“是”,那么它的查全率可能会较高,但查准率却较低;而如果一个模型在信心十足的情况下预测“是”,那么它的查全率可能会较低,但查准率却较高。
另一方面,也可以把这当作假阳性和假阴性之间的权衡。预测的“是”太多通常会给出很多的假阳性。预测的“否”太多通常会给出很多的假阴性。
- 偏倚-方差权衡
思考过拟合问题的另一种角度是把它作为偏倚和方差之间的权衡。 偏倚和方差这两个名词是用来度量在(来自同一个大型总体的)不同的训练数据集上多次重复训练模型的情况。
“过拟合和欠拟合”中提到的 0 阶模型对(取自同一总体的)任何可能的训练集都会造成大量的错误。这表明该模型偏倚较高。然而任何两个随机选择的训练集会给出很相似的模型(因为任何两个随机选择的训练集都应该有大致相似的平均值)。所以我们称这个模型有
低方差
。高偏倚和低方差典型地对应着欠拟合
。
9 阶模型完美地拟合训练集,它具有很低的偏倚和很高的方差(因为任何两个训练集都可能给出非常不同的模型形式)。这种情况对应过拟合。
如果你的模型有高偏倚(这意味着即使在训练数据上也表现不好),可以尝试加入更多的特征。从 0 阶模型到 1 阶模型就是一个很大的改进。
如果你的模型有高方差,那可以类似地移除特征;另一种解决方法是(如果可能的话)获得更多的数据。
- 特征提取和选择
我们之前提到,如果数据没有足够的特征,模型很可能就会欠拟合。但如果数据有太多的特征,模型又容易过拟合。那什么是特征呢,它们又从何而来?
特征(feature)是指提供给模型的任何输入。在最简单的情况下,特征是直接提供给你的。
如果你想基于某人的工作年限来预测其薪水,那工作年限就是你所拥有的唯一的特征。
K近邻法
假设你打算预测我会在下次大选给谁投票。如果你对我一无所知(但是你有数据),一个明智的方法是看看我的邻居们打算怎么投票。我住在西雅图市中心,我的邻居们总是会打算投票给民主党的候选人,这说明“民主党候选人”有可能是我的投票对象。
现在假设你对我的了解不仅限于家庭住址——可能你还知道我的年龄、收入,以及有几个孩子,等等。参照我的行为被这些维度影响(或刻画)的程度,观察那些在这些维度上最接近我的邻居似乎比观察我所有的邻居会得到更好的预测结果。这就是最近邻分类(nearset neighbors classification)方法背后的思想。
神经网络
人工神经网络(artificial neural network,或简称神经网络)是受大脑启发而开发出来的一种预测模型。我们可以把大脑看作一团相互连接的神经元。每个神经元都以其他神经元的输出为输入,进行相应计算,如果结果超过某个阈值,则这个神经元将会进入激活状态,否则它会继续保持非激活状态。
相应地,人工神经网络则是由人工神经元组成,同样也对输入进行类似的计算。神经网络可以解决各式各样的问题,比如手写体识别与面部识别等,同时,深度学习作为数据科学最为火爆的一个分支也大量用到神经网络。然而,大部分神经网络都是些“黑盒子”,也就是说,即使考察了其工作细节,也很难获悉它们到底是如何解决问题的。此外,大型的神经网络的训练工作难度也非常大。作为一名处于“发育期”的数据科学家,你所遇到的大多数问题都不适合用神经网络来处理。有朝一日,当你试图打造一个催生奇点的人工智能的时候,或许神经网络会是个不错的选择。
聚类分析
聚类分析是一种无监督学习方法,也就是说,它可以利用完全未经标注的数据(也可以使用标注过的数据,但我们忽略这些标签)进行工作。
自然语言处理
自然语言处理(natural language processing,NLP)是指与语言有关的各种计算技术。
网络分析
当我们面对许多有趣的数据问题时,如果把它们看作由各种类型的节点(node)和连接它们的边(edge)所构成的网络,那就再合适不过了。
推荐系统
现实中,利用数据提供某种建议也是很常见的。例如,Netflix 能够向用户推荐他们可能想看的电影,亚马逊会向你推荐你可能会买的商品,Twitter 会为你推荐你可能想关注的用户。本章将介绍几种利用数据来提供建议的方法。
MapReduce
MapReduce 是一个用来在在大型数据集上执行并行处理的算法模型。尽管这是一个非常强大的技术,但它的基本原理却很简单。
假设我们有一组待处理的项目,这些项目可能是网页日志、许多本书的文本、图像文件或者是其他东西。一个基本的 MapReduce 算法包括下面几个步骤。
- 使用mapper函数把每个项目转化成零个或多个键值对。(通常这被称为map函数,但是已经有了一个叫 map 的 Python 函数,所以我们不能把它们混淆。)
- 用相同的键把所有的键值对收集起来。
- 在每一个分好组的值集合上使用reducer函数,对每个对应的键生成输出值。
- 为什么是MapReduce?
MapReduce 的主要优点就是通过将处理过程移动到数据来进行分布式的计算。
假设我们想对数以十亿计的文档进行单词计数。我们最初的(非 MapReduce 的)方法要求机器在每一个文档上进行处理。这意味着所有的文档要么存在机器上要么在处理期间转移到机器上。更重要的是,这意味着机器一次只能处理一个文档。
如果机器是多核的,且如果代码是为了利用多核的优势而重写过的,那
它是有可能一次处理几个文档的。但即使这样,所有的文档也
都要放到机器中来。
数据科学前瞻
- IPython
- 数学
- 不从零开始——多学习已经存在的库
- NumPy
- pandas
- scikit-learn
- 可视化
- R语言
- 寻找数据
总结:获益良多,但是数据科学是学习和实践并重的科学。看完就动手做才是重点。
想加入更多乐读创业社的活动,请访问网站→ http://ledu.club
或关注微信公众号选取: