杜克大学大规模数据科学笔记-全-

杜克大学大规模数据科学笔记(全)

001:预测分析入门

在本节课中,我们将从信息学转向分析学,重点学习统计估计与预测的核心概念。我们将探讨如何利用之前学到的工具来实现这些概念,并理解为什么数据分析的核心常常归结为求和与平均等基本运算。

课程背景与目标

上一节我们介绍了信息学,即数据的管理、操作与集成。本节中,我们来看看分析学,特别是统计估计与预测。这部分内容建立在信息学基础之上,您将能运用已学的工具来实现新的分析技术。

一个重要的观点是,人们通常认为的“分析”中,有80%本质上可归结为进行求和求平均的能力。理解问题和解决方案的难度可能因人而异,但就实现而言,并不算太复杂。

从“坏科学”现象谈起:效应衰退

为了开启这个话题,我们来看一篇2010年《纽约客》的文章。需要说明,这并非严谨的研究论文,其许多观点也未必可取。但文章提出了一个值得探讨的现象:科学领域的统计结果似乎随着时间推移而变弱,这被称为“效应衰退”。

以下是文章中提到的几个例子:

  • 抗抑郁药效减弱:伊利诺伊大学的研究员约翰·戴维斯指出,近几十年来,证明抗抑郁药有效性的临床分析结果效力下降了多达三倍。
  • 燕子择偶研究:安德斯·穆勒研究发现,雌燕更倾向于与羽毛长且对称的雄燕交配。但在随后的五六年里,该效应的效应量(effect size)缩小了80%。
  • 言语遮蔽效应:乔纳森·斯库勒在1990年发现,被要求用语言描述一张面孔的人,其记忆效果反而不如仅观看面孔的人。这个反直觉的效应后来也变得越来越难以测量和复现。
  • 超感官知觉(ESP)实验:20世纪30年代,约瑟夫·班克斯·莱因通过猜牌实验试图测量ESP。他发现一些受试者初期能连续猜中多张牌,但随后表现下降,即出现了“衰退效应”。

文章触及了对这一现象的正确解释,但也提出了一些可能带有神秘色彩的错误解释。

本节的探索路径

在接下来的几个小节中,我们将以“效应衰退”现象作为案例,深入探讨统计学和统计估计。我们将以此为契机,介绍统计学的基本概念,以及一些与大数据相关的、更为进阶的统计概念。


本节课中,我们一起学习了课程从信息学到分析学的过渡,并引入了“效应衰退”这一有趣现象作为后续探讨统计学的起点。下一节,我们将开始深入统计估计的核心原理。

002:假设检验 📊

在本节课中,我们将要学习假设检验的基本概念。这是统计推断的核心方法之一,用于通过样本数据对总体做出结论。我们将从背景知识开始,逐步深入到具体概念和术语。


背景介绍

首先,我们来谈谈背景知识。之后,我们会回到一篇具体文章,探讨“真相为何逐渐消失”的原因。

请注意,本节内容并非大学入门统计课程的替代品,而是一个快速概述,旨在帮助你熟悉相关术语和概念。

统计推断与假设检验

我们讨论的是统计推断。这是从样本数据中得出关于总体结论的方法。这里有两种关键方法:假设检验置信区间。我们稍后会再次提及置信区间,但现在不直接讨论。

那么,什么是假设检验?你将比较一个实验组和一个对照组。总会存在一个零假设,其含义是这两组之间没有差异。例如,接受某种治疗的人群与未接受治疗的人群没有不同;新网站产生的流量与旧网站或默认网站没有差异。这就是零假设。

备择假设则是指存在效应,即两组之间存在统计学上的显著差异。这里的“差异”通常通过某个检验统计量来定义。在入门课程或大多数课程中,例子通常是关于比较均值的,即对照组的平均效应与实验组的平均效应是否不同。

实验设计的重要性

统计学在很大程度上是关于设计实验以收集数据。然而,在数据科学或大数据领域,我们通常较少有机会亲自设计实验。很多时候,我们处理的数据并非由我们主动收集。这是经典统计学与数据科学方法的一个可能区别。

尽管如此,理解仔细的实验设计是所有这些工作中最重要的一环。分析技术是次要的,正确的数据收集才是首要的。这包括诸如随机化试验单盲双盲等方法。

  • 盲法意味着参与者不知道自己属于哪一组,这几乎是不可协商的。你不能告诉人们他们服用的是安慰剂还是真正的药物,否则他们会以不同方式报告症状。
  • 随机化也应该是不可协商的,尽管在实践中有时难以实现。随机化意味着我们通过某种方法抽取样本,然后完全随机地将他们分配到对照组和实验组,没有任何其他过程。

这个框架,即使只是以几个要点的高度概括,也具有难以置信的强大力量。它完全适用于数据分析。因此,理解并内化这些要点非常重要。我们将在后续讨论中更详细地探讨本幻灯片未包含的其他方面。

以下是一些你可以设想的例子:

  • 测量网站上新广告位与现有广告位(对照组)相比的效果。
  • 测量某种新疗法与安慰剂或现有最佳疗法相比的效果。
  • 以及其他任何你能想到的场景。

假设检验总结

你可以将假设检验的术语整理成如下表格:

真实情况 \ 检验结果 不拒绝零假设 拒绝零假设
零假设为真 (无差异) 正确决策 (概率 = 1 - α) 第一类错误 (概率 = α)
零假设为假 (有差异) 第二类错误 (概率 = β) 正确决策 (概率 = 1 - β,即检验功效)

表格中有两种关于世界真实状态的可能性:

  1. 零假设为真:对照组与实验组之间没有差异。
  2. 零假设为假:存在你正在测量的效应。

同时,你的统计检验结果也有两种可能性:

  1. 你不拒绝零假设:未发现两组之间存在差异的证据。
  2. 你拒绝零假设:发现了两组之间存在差异的证据。
  • 如果零假设为真(无差异),但你检测到了差异,这就是第一类错误。其发生概率称为 α
  • 在这种情况下做出正确决策(不拒绝零假设)的概率是 1 - α
  • 如果零假设为假(有差异),但你未能拒绝它(即未能检测到效应),这就是第二类错误。其发生概率称为 β
  • 当零假设为假时,你正确地拒绝了它(检测到了存在的效应),这个概率是 1 - β,被称为检验的功效

(图示:统计功效)


本节课中,我们一起学习了假设检验的基本框架,包括零假设与备择假设的定义、实验设计的重要性,以及第一类错误 (α)、第二类错误 (β) 和检验功效 (1 - β) 等核心概念。理解这些是进行任何数据分析的基础。

003:显著性检验与P值

在本节课中,我们将学习如何判断实验组与对照组之间的差异是否具有统计显著性。核心在于理解P值的概念及其计算方法。

假设检验与差异比较

上一节我们介绍了比较实验组与对照组的基本思路。我们通过计算某个检验统计量来衡量两组之间的差异。但一个关键问题是:差异需要多大才能被认为是显著的?

换言之,我们如何知道实验中观察到的差异并非仅仅由随机因素导致?答案是:我们无法完全确定,但可以计算这种差异由随机因素导致的概率。这个概率就是P值

理解P值

P值的定义如下:假设零假设(即两组之间没有真实差异)为真,在相同的样本量下重复进行无数次实验,那么观察到至少与当前实验结果一样极端的结果所占的百分比,就是P值。

让我们再明确一下:假设实验组与对照组来自同一总体,处理没有任何效果。在这种情况下,如果重复进行相同的实验,仅凭随机性,我们有多大比例会观察到处理组出现差异?这个比例就是P值。

单侧检验与双侧检验

以下是关于检验方向的重要概念:

  • 双侧检验:当我们关注差异的绝对值时使用。其P值计算公式为:P = 2 * P(X ≥ |观测值|)
  • 单侧检验:当我们只关心差异是否大于或小于某个特定方向时使用。

公式中,μ 代表样本均值,μ₀ 代表零假设下的总体均值。

P值计算示例

下面的截图来自一个可以在线使用的交互式程序。它直观地展示了P值的计算。

  • 零假设为均值等于325。
  • 我们进行双侧检验(μ ≠ 325)。
  • 样本量为10。
  • 观测到的样本均值为328。

点击“显示P值”按钮后,程序会计算出P值,并用彩色区域标示出来。这些彩色区域在曲线下的面积,就是P值,它代表了观测到至少如此极端结果的概率。

在第二张图中,我将样本均值改为329。由于这个值更偏离零假设的325,因此仅由随机因素导致的概率更小。相应地,曲线下的彩色区域面积(即P值)从0.0574减小到了0.0114。

显著性水平与决策

为了做出决策(例如,判断处理是否有效、是否应投资或进入下一阶段试验),我们需要为P值设定一个阈值或临界值。

这个临界值通常是 0.05。选择0.05并没有特别深刻的科学原因,它在很大程度上是出于数学和历史的便利性,形成了一个惯例。它意味着,如果结果出现的随机概率低于5%(即二十分之一),那么该结果就被认为是统计显著的。

关于0.05这个阈值,在学术界存在不少争议,我们将在后续章节中进一步讨论。目前,我们只需知道,0.05是实践中广泛使用的显著性水平。

总结

本节课中,我们一起学习了:

  1. P值的核心概念:在零假设为真的前提下,出现当前或更极端结果的概率。
  2. 检验的两种类型:双侧检验单侧检验,及其对应的概率计算思路。
  3. 如何通过可视化工具理解P值。
  4. 做出统计决策的常用阈值:显著性水平α=0.05。当P值小于0.05时,我们通常拒绝零假设,认为结果具有统计显著性。

004:均值差异示例 📊

在本节课中,我们将学习如何评估两组数据均值差异的统计显著性。我们将通过一个具体的医学实验案例,介绍经典的统计推断方法,并理解其背后的核心概念。

概述

假设我们有一组晚期肺癌患者。我们希望测试一种新化疗方案的有效性。为此,我们设计了一个实验:将患者队列平分为两组。一半患者接受标准化疗方案治疗,另一半患者接受新方案治疗。我们测量他们的生存时间(以天为单位)。

我们将收集类似下图所示的数据。这是一个在其他情境中也使用过的数据集,可以在网上找到。

数据与初步观察

以下是数据的基本情况:

  • 蓝色数据点代表接受新测试方案患者的生存天数。
  • 绿色数据点代表接受标准方案患者的生存天数。

我们可以计算每组数据的均值:

  • 测试方案(蓝色)的均值是 128.3 天。
  • 标准方案(绿色)的均值是 115.9 天。

将蓝色均值减去绿色均值,我们得到差异为 12.4 天。我们可能会认为新方案似乎更有效,因为患者生存时间更长。但怀疑者可能会说,这个结果可能只是偶然发生的。我们如何确定这确实是治疗方案不同导致的差异呢?

因此,我们需要问:这个数字显著吗?我们纯粹凭偶然获得这个结果的可能性有多大?接下来,我将展示进行这类统计推断和声明显著性的经典方法,然后介绍一种我认为对数据科学家日常更有用的不同方法。

经典方法:构建T统计量

经典方法是推导所谓的抽样分布。为了做到这一点,我们需要对总体做出一些假设:

  1. 生存天数服从正态分布(即高斯分布,我们熟悉的钟形曲线)。
  2. 两组患者的方差相同。也就是说,新疗法不会导致生存天数的分布比标准疗法更分散或更集中。或者,至少两组的样本量相同(本例中确实如此)。如果样本量相同,可以证明我们将使用的统计量对于不同的方差具有相当的稳健性。

基于这些假设,我们构建一个 T统计量,其形式如下:

T = (统计量观测值 - 统计量假设值) / 统计量的估计标准误

在我们的案例中:

  • 我们感兴趣的统计量是两组均值的差异。
  • 零假设下的假设值(即怀疑者的观点,认为差异纯属偶然)是 0。也就是说,两个均值之间的差异为零。

因此,我们的T统计量公式具体为:

T = (观测到的均值差 - 0) / 均值差的估计标准误

这个公式中分母的直观意义是:询问这个结果距离假设值有多少个标准误。用标准误为单位来表达的好处是,它允许你以一种通用的方式比较非常不同的总体和实验,相当于对数值进行了“标准化”。

理解标准误与抽样分布

好的,我们有一个零假设:t_bar - s_bar = 0。我们知道 t_bar - s_bar 是从样本中推导出的一个随机变量,因此它有一个抽样分布。实际上,任何从样本中推导出的统计量,你都可以推理其抽样分布。

我们将计算具有上述形式的T统计量,因此需要弄清楚分母是什么,即 t_bar - s_bar估计标准误是多少。

标准误这个术语,只是 t_bar - s_bar 的抽样分布的标准差的另一个名称。我认为统计学中的一个问题是,语言并不总是能很好地映射到概念,导致许多感觉上同义的术语被用来描述微妙不同的事物,这至少让我觉得比必要的更困惑。这或许就是其中一个例子:标准误就是抽样分布标准差的另一个名称,而“抽样分布”这个词在你谈论从某个样本推导出的统计量时使用。

这意味着我们需要弄清楚 t_bar - s_bar 的抽样分布是什么。

总结

本节课中,我们一起学习了如何分析两组数据均值差异的显著性。我们从具体的医学实验案例出发,提出了问题:观察到的生存时间差异是真实的还是偶然的?接着,我们介绍了经典统计推断方法的核心——构建T统计量,这需要假设数据服从正态分布且方差齐性。我们明确了T统计量的公式,并解释了其中“估计标准误”的含义,它实质上是统计量抽样分布的标准差。理解抽样分布和标准误的概念,是进行后续假设检验的关键基础。在下一节中,我们将继续探讨如何具体计算这个标准误,并完成最终的显著性判断。

005:推导抽样分布 📊

在本节课中,我们将学习如何推导两个样本均值之差的抽样分布。这是进行假设检验(如t检验)的核心步骤。我们将从理解抽样分布的基本概念开始,逐步推导出计算标准误差和t统计量的公式。

抽样分布的性质

上一节我们介绍了抽样分布的概念。本节中我们来看看如何描述两个样本均值之差的抽样分布。

该分布可以通过其均值方差来描述。这至少基于两个原因成立:

  1. 我们假设了基础总体服从正态分布,因此可以推断出 T_bar - S_bar 的分布也是正态的。
  2. 根据中心极限定理,无论总体分布如何,只要样本量足够大,样本均值的分布也会趋近于正态分布,而正态分布正是由均值和方差这两个参数描述的。

那么,我们感兴趣的统计量 T_bar - S_bar 的均值是多少?它就是T样本的均值减去S样本的均值,即 μ_T_bar - μ_S_bar

方差的计算

接下来,我们探讨 T_bar - S_bar 的方差。这里需要明确,我们讨论的是均值的方差,而不是样本本身的方差。具体来说,是如果我们重复实验成千上万次,每次计算得到的T组样本均值的波动情况。

T_bar - S_bar 的方差等于 T_bar 的方差加上 S_bar 的方差,公式表示为:
Var(T_bar - S_bar) = Var(T_bar) + Var(S_bar)

这从方差定义可以推导,但直观上也容易理解:两个样本各自的均值波动越大,它们之间差值的可能范围也就越广。需要注意的是,这个公式成立的前提是我们假设了两个样本是独立的。

从理论到估计

目前,我们已经知道 T_bar - S_bar 的抽样分布可以用均值和方差描述,并且将方差表达为两个均值方差之和。但我们无法直接计算 Var(T_bar),因为我们不可能重复无数次实验。

以下是解决这个问题的步骤:

  1. 根据中心极限定理,我们可以用总体方差除以样本量来近似均值的方差:Var(T_bar) ≈ σ_T² / n_T
  2. 由于我们不知道总体方差 σ²,我们用样本方差 来估计它。
  3. 将上述估计代入,我们得到方差的实用计算公式:
    Var(T_bar - S_bar) ≈ s_T² / n_T + s_S² / n_S

这样,我们就用实际可以计算的样本统计量(样本方差和样本量)重新表达了抽样分布的方差。

计算标准误差与t统计量

回到最初的问题:如何计算估计的标准误差?标准误差就是抽样分布的标准差估计值。因此,我们对方差估计值取平方根即可:
SE ≈ sqrt( s_T² / n_T + s_S² / n_S )

现在,我们可以构建最终的t统计量。t检验的统计量计算公式为:
t = (T_bar - S_bar - 0) / SE
其中,0 是我们的零假设值(即假设两组均值无差异)。将我们计算出的均值差和标准误差代入,就能得到一个具体的t值。

做出统计决策

得到t值后,我们不能立即判断其显著性,还需要自由度t分布。t分布的形状类似于正态分布,但尾部更厚,它对样本量更敏感:样本量越大,t分布越接近正态分布。

自由度的计算有一个特定公式(韦尔奇-萨特斯韦特近似):
df ≈ (s_T²/n_T + s_S²/n_S)² / [ (s_T²/n_T)²/(n_T-1) + (s_S²/n_S)²/(n_S-1) ]

获得自由度和选定显著性水平(如0.05)后,我们可以查阅t分布临界值表。如果计算出的t统计量的绝对值小于对应自由度和显著性水平下的临界值,我们就没有足够证据拒绝零假设,认为观察到的差异可能由偶然因素导致。

总结

本节课中我们一起学习了推导两独立样本均值差抽样分布的全过程:

  1. 我们明确了 T_bar - S_bar 的抽样分布可由其均值和方差描述。
  2. 我们推导出该方差等于两组样本均值方差之和:Var(T_bar) + Var(S_bar)
  3. 我们利用中心极限定理和样本方差,将理论方差转化为可计算的估计形式:s_T²/n_T + s_S²/n_S
  4. 通过取平方根,我们得到了估计标准误差 SE
  5. 最后,我们构建了t统计量 (T_bar - S_bar)/SE,并了解到需要通过比较t值与特定自由度下t分布的临界值来进行统计推断。

这个过程虽然逻辑严密,但步骤较为繁琐。在接下来的内容中,我们将看到一种利用计算模拟(如重抽样方法)来实现同样严谨推断的替代方案,该方法通常只需少量代码即可完成。

006:显著性的置换检验 🧪

在本节课中,我们将学习一种称为“置换检验”的统计方法,用于评估实验结果的显著性。我们将通过一个模拟实验的例子,直观地理解如何在不依赖复杂理论假设的情况下,判断观察到的差异是否可能由随机因素导致。

概述

在传统统计推断中,我们通常通过理论推导来估计统计量的抽样分布,这需要假设数据服从某种分布。然而,置换检验提供了一种替代方案:通过直接模拟大量随机实验,来构建统计量的经验分布,从而评估观察结果的显著性。

上一节我们介绍了传统统计推断的局限性,本节中我们来看看如何通过模拟实验来绕过这些限制。

置换检验的核心思想

我们真正在做的是提出这样的问题:如果我们把这个实验重复运行1000次、10000次,结果会怎样?实际上我们无法反复进行真实实验,尤其是涉及患者或其他成本高昂的数据收集过程。

因此,传统方法是通过理论来推理结果:我们对总体分布做出一些假设,用此推导出我们感兴趣的统计量的抽样分布,然后基于教科书和表格中的典型值进行推理。在这个案例中,统计量是均值差,但它可以是任何衍生统计量。

那么,如果不能重新做实验(这通常不可能),或者不想通过假设底层分布来进行理论分析,我们该怎么办?我们可以转而运行一个模拟实验。

如果我们无法从原始总体中抽取新数据,这或许没关系。我们已经拥有该总体的一个代表性样本,即我们已经收集到的数据。我们可以直接从这个样本中重新抽取数据,以模拟这些额外的实验。

一个具体例子

让我们来看一个例子。我们最初有两组患者:接受新疗法的患者和接受标准疗法的患者。

如果这两组之间的差异是显著的,那么当我们打乱标签(即混合数据,使我们不知道哪些数据点属于哪一组)并不断重复这个过程,直到数据完全混合后,我们应该会得到一个与真实数据显著不同的结果。

我们的真实数据结果应该是罕见的,而数据的重复打乱应该会描绘出一种不同的分布。我们可以通过编写一些代码来直接进行这个实验。

以下是模拟实验的步骤:

  1. 将两组数据合并。
  2. 随机打乱所有数据的“组别”标签。
  3. 根据新的随机标签,将数据重新分成两组。
  4. 计算新分组的均值差。
  5. 重复此过程成千上万次,记录每次的均值差。

通过手动打乱标签并重新计算均值差,我们可能得到一个数值,例如10.3天。

我们可以持续进行这个操作。在10次试验后,我们得到一些落在不同范围内的值。在100次试验后,分布的形状开始显现。在1000次试验后,我们可以看到类似钟形曲线的分布。在10000次试验后,我们得到一个清晰、漂亮的钟形曲线,并且它似乎以零为中心。

这个结果与我们使用经典方法得到的结果一致。我们观察到的12.4天的差异值就落在这个分布之中。如果我们计算均值差超过我们观察值(12.4天)的次数,发现大约有33%的模拟结果产生了相似或更大的差异。

这意味着,有33%的随机打乱产生了与我们观察结果一样极端或更极端的结果。这远不足以让我们得出结论,认为这12.4天的差异不可能是偶然发生的——它正好落在这个分布的宽度之内。

方法总结与P值

我们进行了这个“打乱检验”:我们打乱了数据标签,重新计算了两组患者的均值,取它们的差值,并将结果绘制在直方图上,重复这个实验10000次。

这个直方图描绘出的分布,近似于我们之前试图用经典方法推导的实际抽样分布。区别在于,经典方法需要对底层分布做出假设,并且需要仔细、严谨地解释所有术语。而在这里,我们几乎不需要做太多工作。这很合理,因为我们实际上是在模拟那些经典理论试图弥补无法实际进行的实验。

通过直接进行模拟实验,我们直接得到了最终结果,而经典方法正是试图达到这个结果。因此,我们可以非常清晰地陈述显著性。

这个P值,即1减去那个30%(更准确地说,是观察到极端结果的概率),正是你可能听说过的P值。它量化了在零假设(即两组无真实差异)成立的情况下,观察到当前结果或更极端结果的概率。

本节课总结

本节课中,我们一起学习了置换检验的基本原理和应用。我们了解到,通过随机打乱数据标签并重复计算统计量(如均值差),可以构建该统计量的经验分布。通过将实际观察值与此经验分布进行比较,我们可以计算P值,从而评估观察到的效应是否具有统计显著性。这种方法直观、计算驱动,且对数据分布的假设要求较少,为评估显著性提供了一个强大而灵活的工具。

007:比较经典方法与重抽样方法 🧪

在本节课中,我们将学习如何通过重抽样方法(如置换检验)来评估统计显著性,并将其与依赖理论假设的经典方法进行比较。我们将探讨P值的概念、重抽样方法的优势,以及如何通过模拟实验来直观地理解统计推断。


置换检验的工作原理

上一节我们介绍了重抽样的基本思想,本节中我们来看看置换检验的具体工作机制。P值,我们之前没有直接讨论,它表示在重复实验中,观测到的结果偶然发生的概率。我们通过直接模拟这些实验来计算P值。

与经典方法相比,重抽样方法更稳健,并且可以说更容易解释,因为你直接看到了自己生成的分布。


通过运行这些模拟实验,其结果完全符合你在推理P值和置信区间(我们稍后会讨论)时应该使用的解释逻辑。


重抽样方法的优势

重抽样方法的一个关键优势在于,它不对底层数据分布做任何假设。这一点至关重要。你无需关心或想象底层总体的特征,也无需定义其分布的参数。你只需对现有样本进行重抽样,就能看到抽样分布被清晰地描绘出来。

以下是重抽样方法处理偏态分布的一个例子:

考虑年薪数据,假设平均年薪为 $50,000,方差为 $15,000。如果将其建模为正态分布,你将得到一个非零的负薪水的概率,而这在现实中不可能发生。

# 经典方法可能产生不现实的负值
import numpy as np
mean_salary = 50000
std_salary = 15000
# 从正态分布中抽样,可能产生负值
possible_salary = np.random.normal(mean_salary, std_salary, 1000)
negative_count = np.sum(possible_salary < 0)
print(f"从正态分布抽样中,负薪水的数量: {negative_count}")

然而,当你仅从已收集的样本中进行重抽样时,你肯定不会得到任何负的薪水数据。因此,你无需费尽心思去约束或改变底层总体的分布(例如,将正态分布的下界设为0),你只需处理手头的数据,就能自然地适应现实世界的约束。


经典理论与重抽样模拟

换一种说法,经典统计理论基于一个核心思想:平均化倾向于产生正态分布,这就是中心极限定理。大多数统计量本质上都是某种形式的平均值。因此,渐近地看,它们服从正态分布或高斯分布。

基于此,我们可以从高斯分布出发,推理出各种统计量的抽样分布。几乎所有情况下的抽样分布都已被推导出来,并可以在教科书中查到。

但作为一种替代方案,你可以进行蒙特卡洛模拟。在这种模拟中,我们假设已知总体,并从中反复模拟抽取样本,从而直接为你感兴趣的估计量构建出抽样分布。

我可能有些赘述,但我真的想强调:这种方法不仅清晰易懂,而且更接近目标,更接近你试图从理论上推理的实际实验过程。

总而言之,推导抽样分布是困难的,但模拟抽样分布是容易的


从显著性检验到效应大小

到目前为止,我们展示了置换检验可用于显著性检验,即判断一个值是否显著。但它并不能给出效应大小,即无法告诉你这个值有多重要,或者估计量可能取值的范围。

为了评估效应大小和估计量的不确定性范围,你需要置信区间。这需要使用另一种形式的重抽样方法,我们将在接下来的课程中讨论。


总结

本节课中,我们一起学习了如何利用重抽样方法(特别是置换检验)进行统计推断。我们了解到,与依赖严格理论假设的经典方法相比,重抽样方法通过直接模拟实验来构建抽样分布,具有无需假设分布、结果直观、对偏态数据更稳健等优势。虽然置换检验擅长检验显著性,但要评估效应大小,我们还需要借助能构建置信区间的其他重抽样技术。

008:自助法 📊

在本节课中,我们将学习一种强大的统计方法——自助法。我们将了解其核心思想、操作步骤,以及如何用它来计算置信区间和评估统计量的变异性。


概述

我们已经讨论了如何判断一个结果是否具有统计显著性。然而,仅仅知道是否显著还不够,我们还需要了解效应的大小以及统计量在重复实验中可能取值的范围。经典方法通过查表和使用标准误差来计算置信区间,但自助法提供了一种更直接、更灵活的计算方式。

上一节我们介绍了显著性检验,本节中我们来看看如何使用自助法来估计统计量的置信区间。

自助法的核心思想

自助法的核心思想非常简单:通过从原始数据集中有放回地重复抽样,来模拟重复实验的过程。这样,我们就能生成大量“新”的数据集,并在每个数据集上计算我们关心的统计量(例如均值、均值差、回归系数等),从而得到该统计量的一个经验分布。

自助法的操作步骤

以下是执行自助法的具体步骤:

  1. 准备原始数据集:假设我们有一个包含 n 个观测值的原始数据集。
  2. 生成自助样本:从原始数据集中有放回地随机抽取 n 个观测值,构成一个新的数据集。这个新数据集称为一个“自助样本”。由于是有放回抽样,同一个原始观测值可能在新样本中出现多次或一次也不出现。
  3. 计算统计量:在这个自助样本上,计算我们感兴趣的统计量(例如,样本均值)。
  4. 重复过程:将步骤2和步骤3重复很多次(例如1000或10000次)。
  5. 分析结果:现在我们得到了该统计量的一个经验分布。我们可以通过这个分布来计算置信区间(例如,取第2.5百分位数和第97.5百分位数作为95%置信区间的上下限)。

为何要“有放回”抽样?

这是一个关键点。自助法要求有放回抽样,原因如下:

  • 模拟独立同分布:经典统计理论通常假设我们的数据是独立同分布地从某个总体中抽取的。有放回抽样能确保每个自助样本内的观测值是独立的(因为每次抽取都是独立的),从而更好地模拟从原始数据所代表的“经验分布”中独立抽样的过程。
  • 避免样本退化:如果进行无放回抽样,当自助样本大小等于原始样本大小时,每次抽到的样本都将是原始数据集本身的一个排列,缺乏变异性。即使允许样本大小不同,无放回抽样也会导致后续抽到的观测值依赖于之前抽到的结果,破坏了独立性假设。

一个简单的例子

假设我们有一个原始数据集:[1, 2, 3, 4, 5, 6],其均值为 3.5

  • 我们进行第一次自助抽样,可能得到样本:[4, 3, 4, 1, 6, 2],其均值为 (4+3+4+1+6+2)/6 = 3.33
  • 我们重复这个过程成千上万次,每次计算一个均值。
  • 最终,我们得到成千上万个均值,构成了均值的一个经验分布。我们可以基于这个分布来计算均值的置信区间。

应用于我们的实验数据

在我们的药物实验中,我们需要分别对测试组和标准组的数据进行自助抽样。

具体操作是:

  1. 从测试组原始数据中有放回地抽取一个自助样本。
  2. 从标准组原始数据中有放回地抽取一个自助样本。
  3. 计算这两个自助样本的均值差。
  4. 将步骤1-3重复大量次数(如10000次)。
  5. 分析这10000个均值差的结果。

通过这个过程,我们可以绘制出均值差的直方图。例如,图中可能会显示,均值差为0的点(即无效应)完全落在由第2.5百分位数和第97.5百分位数(图中红色竖线)定义的95%置信区间之内。这直观地证实了我们之前的结论:没有足够的证据拒绝零假设(即药物无效),因为观察到的效应(例如均值差为12.4)很可能只是偶然发生的。

自助法的广泛应用

自助法不仅限于计算均值或均值差的置信区间,它可以应用于各种统计量和模型参数。

例如,在线性回归中:

  1. 我们有一个包含许多数据点的原始数据集。
  2. 我们从中进行有放回抽样,生成大量自助样本。
  3. 在每个自助样本上重新拟合线性回归模型,得到一条回归线。
  4. 我们会得到许多条斜率相近但又不完全相同的回归线。
  5. 通过分析这些斜率的分布,我们就可以为“真实的”回归线斜率构建一个置信区间。

注意事项与总结

本节课中我们一起学习了自助法。它是一种强大且直观的重抽样技术,让我们无需依赖严格的分布假设(如正态分布),就能估计统计量的变异性和置信区间。其核心在于通过有放回抽样从现有数据中模拟出大量“新”数据集,从而逼近统计量的抽样分布。

关键要点总结

  • 目的:估计统计量(如均值、回归系数)的置信区间和变异性。
  • 核心操作bootstrap_sample = random.choice(original_data, size=len(original_data), replace=True)
  • 关键要求有放回抽样,以保证样本间的独立性,模拟从经验分布中独立抽样的过程。
  • 优势:灵活,适用于多种统计量,对总体分布假设要求低。
  • 结果解释:通过大量重复计算得到的统计量经验分布,我们可以直接计算百分位数来获得置信区间。

需要注意的是,虽然自助法非常稳健,但在某些极端情况下(如数据量非常小、或统计量本身不光滑时)可能需要谨慎使用。不过,对于大多数实际数据分析问题,它都是一种极其有价值的工具。

009:重抽样注意事项 📊

在本节课中,我们将探讨重抽样方法(特别是置换检验和自助法)的注意事项。我们将理解为何需要区分显著性检验和置信区间估计,并了解自助法在特定情况下的局限性。


上一节我们介绍了置换检验和自助法。本节中,我们来看看使用这些方法时需要注意的关键事项。

首先,一个核心问题是:为什么不能直接用置信区间来判断显著性?毕竟,如果置信区间不包含零值,似乎就表明差异显著。

原因是,计算置信区间时,我们已经假设所观察到的差异(例如均值差)是真实存在的。而显著性检验(如置换检验)的起点是零假设,即假设两组数据没有差异。两者逻辑起点不同。

以下是一个直观的例子来说明其重要性:
假设我们只有两个数据值:一个来自治疗组(生存36天),一个来自安慰剂组(生存27天)。两组均值差为 9

  • 使用自助法计算95%置信区间:由于样本极小,自助重抽样产生的差异值几乎总是 9-9。因此,置信区间会非常窄,例如 [9, 9],这似乎强烈表明差异显著。
  • 使用置换检验计算P值:当我们随机打乱标签多次,大约一半的情况差异为 9,另一半为 -9。得到的P值约为 0.5,远高于通常的显著性阈值(如0.05),表明观察到的差异并不显著

这个例子清晰地表明:

正确的流程是:首先基于零假设使用置换检验判断显著性;如果结果显著,再使用自助法估计置信区间。


接下来,我们讨论自助法的一些注意事项和局限性。

自助法非常稳健,比许多经典方法假设更少。但在某些情况下需要谨慎使用。

以下是自助法的主要注意事项:

  1. 小样本可能低估变异性:对于非常小的样本,自助法可能无法充分捕捉总体变异性,从而导致置信区间过窄。不过,在大数据场景下,这通常不是主要问题。
  2. 不适用于估计极值:自助法不能可靠地估计总体最小值或最大值等统计量。原因是极值对异常点极其敏感。自助抽样是有放回的,可能漏掉那个决定最大值的单一异常点,从而导致对极值分布的估计有偏。
  3. 需保持原始数据结构:进行重抽样时,必须模拟原始实验的数据生成过程。例如,在比较两组数据时,应分别对每一组进行自助抽样,而不是混合所有数据后再抽样。如果数据结构更复杂(如分层抽样),抽样设计也需要在重抽样中复现。
  4. 数据需满足独立性假设:标准自助法要求数据点是独立同分布的。如果数据存在自相关(如时间序列数据),直接应用自助法无效。

对于非独立数据(如时间序列),有时可以采用一些创造性技巧。例如,可以将一个长序列分割成多个不重叠的区块,将每个区块视为一个独立的“观测”,在区块级别计算统计量,然后对这些区块进行重抽样。这种方法被称为“区块自助法”。


最后,我们必须认识到,任何统计方法,包括重抽样,都无法替代对数据本身的理解。

正如统计学家Nate Silver所言:“数字无法为自己说话。” 重抽样是一种强大的计算工具,但它不能消除数据中固有的偏差,也无法弥补拙劣的实验设计。

无论使用重抽样方法还是经典方法,理解数据的来源、采集过程以及背后的实验设计都至关重要。统计学的“帽子”要求我们始终对数据的背景保持敏感。


本节课总结

本节课我们一起学习了重抽样方法的注意事项:

  1. 明确了显著性检验(置换检验)置信区间估计(自助法) 需分步进行,逻辑起点不同。
  2. 探讨了自助法的局限性,包括对小样本、极值估计的谨慎态度,以及必须保持数据结构数据独立性的要求。
  3. 强调了无论方法多么强大,对数据背景和生成过程的理解始终是做出正确统计推断的基石。

010:异常值与秩变换 📊

在本节课中,我们将学习如何处理数据中的异常值。异常值对重采样方法和经典统计方法都可能造成问题。我们将重点介绍一种简单而强大的技术——秩变换,它能有效缓解异常值的影响,并适用于许多数据科学场景。

异常值的问题

上一节我们讨论了重采样方法,本节我们来看看数据中一个常见的挑战:异常值。异常值是指那些与数据集中其他观测值显著不同的极端值。它们会扭曲统计分析结果,例如使均值产生严重偏差,并影响许多统计模型的性能。

秩变换:核心概念

为了解决异常值问题,我们可以使用秩变换。其核心思想非常简单:将每个数据点的原始值替换为其在排序后数据集中的序数位置

具体步骤如下:

  1. 将数据集中的所有值从小到大排序。
  2. 将最小的值赋值为1,次小的值赋值为2,依此类推。
  3. 将转换后的秩值(1, 2, 3...)映射回原始数据点的顺序。

用公式表示,对于一个包含 n 个观测值的数据集 X = [x1, x2, ..., xn],其秩变换 R(X) = [r1, r2, ..., rn],其中 rixi 在排序后序列中的位置。

秩变换的效果

通过一个例子可以直观理解秩变换的效果。假设原始数据中存在一些极高的异常值,而大量数据聚集在较低值附近。

原始数据图显示,低值区域存在明显的结构,但少数极高的异常值主导了整个数据范围,掩盖了下方的结构。

执行秩变换后,数据被均匀地映射到一个从1到n(数据点总数)的区间。原本极高的异常值,其数值可能比其他值大几个数量级,但转换后,它只是变成了一个较大的秩(例如100),而不再具有压倒性的数值优势。这使得数据的内部结构变得清晰可见。

秩变换的适用场景与注意事项

秩变换非常实用,但必须注意,它改变了我们所回答的问题的性质

以下是秩变换适用的一些场景:

  • 比较组间趋势:例如,在医疗实验中,我们不再问“接受新疗法的患者平均存活天数是否更高?”,而是问“接受新疗法的患者是否倾向于在存活时间较长的患者群体中?”。
  • 处理高度偏态数据:例如分析收入或净资产数据时,如果样本中包含像比尔·盖茨这样的极端值,他会严重拉高平均值。秩变换后,他仍然是最高秩,但其极端数值不再扭曲整体分布,我们可以转而研究“从事特定职业的人是否更可能属于净资产最高的群体?”。
  • 消除尺度差异:秩变换能自然地处理不同尺度间的比较。例如,比较不同城市的生活成本或薪资时,绝对值差异很大,但通过秩变换可以研究“某个职业在A城市是否属于高收入阶层,在B城市是否也属于高收入阶层?”,而无需担心具体货币数值和购买力差异。

关键点:使用秩变换后,你进行的统计推断是关于数据的序数关系(排名先后),而非原始的基数关系(具体数值大小)。这对于研究相对位置、百分位数或分组趋势的问题非常有效。

总结

本节课我们一起学习了处理异常值的一种有效技术——秩变换。我们了解到异常值如何干扰统计分析,掌握了秩变换将数据值转换为排序秩的基本原理,并通过实例看到了它如何消除极端值的影响,使数据分布更均匀。最后,我们明确了秩变换改变了分析问题的角度,它适用于关注相对排名、组间趋势或需要消除尺度差异的场景,但在需要基于原始数值进行解释时则需谨慎使用。

011:卡方检验示例 📊

在本节课中,我们将学习如何将重抽样方法应用于另一种统计推断场景:卡方检验。卡方检验主要用于分析分类数据之间的关系,例如探讨健康与财富之间是否存在关联。

概述

上一节我们介绍了重抽样的基本思想。本节中,我们来看看如何将其应用于卡方检验。卡方检验用于衡量两个分类变量之间的关系,或者观察数据与期望分布之间的差异。

卡方检验的应用场景

卡方检验适用于分类数据。例如,我们想研究健康与财富之间的关系。这里,我们将“健康”定义为三个类别:贫穷、中产、富有;将“财富”定义为两个类别:生病或健康。我们通过调查获取每个组合类别的计数,并试图理解它们之间的关系。

计算期望值与卡方统计量

首先,我们需要将调查结果制成列联表。假设我们测量到“生病且贫穷”的人数为20,其他组合也有相应的计数。

如何计算我们用于衡量差异的期望值呢?

如果健康和财富这两个变量是独立的,那么我们会期望“生病与健康”的比例在贫穷、中产和富有人群中是相同的。也就是说,财富对健康比例没有影响。

具体计算步骤如下:

  1. 统计所有受试者的总数(例如110人)。
  2. 计算“生病”人数占总人数的比例:46 / 110
  3. 将此比例乘以“贫穷”的总人数,即可得到“生病且贫穷”的期望人数:(46 / 110) * 贫穷总人数 = 18.48
  4. 对每个变量组合重复此计算。

得到期望值后,我们按以下步骤计算卡方统计量:

  1. 用观测值减去期望值,得到残差。
  2. 将残差平方。
  3. 再除以期望值。
  4. 最后,将所有组合的上述计算结果相加,得到总的卡方统计量。

这个卡方统计量就是我们进行显著性检验的基础。

使用重抽样方法进行检验

我们之前讨论过打乱标签和自助重抽样法。在这里,需要注意的是,卡方统计量的计算依赖于边际值(即每行的总数和每列的总数)。

因此,我们需要设计一个重标记或打乱过程,在保持边际值不变的前提下,改变列联表内部的值。这样我们才能进行检验。

思路如下:
将每个观测值视为一个单一的复合标签(例如“生病_贫穷”、“生病_中产”、“健康_富有”),而不是两个独立的标签。然后,我们可以像往常一样进行打乱检验。由于我们打乱的是这些复合标签,边际值(如贫穷总人数、健康总人数)必然会保持不变。

卡方检验的注意事项

关于卡方检验,需要提及的一点是,它仅在每个类别的观测数至少为10时才有效。如果某个类别的观测数少于10,则使用卡方检验是无效的,因为样本将不服从卡方分布。

总结

本节课中,我们一起学习了如何将重抽样方法应用于卡方检验。我们了解了卡方检验用于分析分类变量关系的基本原理,掌握了计算期望值和卡方统计量的步骤,并探讨了通过打乱复合标签来进行重抽样检验的具体方法。最后,我们记住了卡方检验有效性的一个重要前提条件。

012:发表偏差 📉

在本节课中,我们将探讨一个在科学研究中常见的问题——发表偏差。我们将了解它的定义、成因,以及它如何导致“真相衰退效应”。通过简单的图表和概念,我们将揭示为什么某些研究结果会随着时间推移而显得不再那么有效。

现在你已经掌握了一些基本术语,让我们回到最初来自《纽约客》文章的那张幻灯片。我们提出的问题是:什么原因导致了这种“真相衰退效应”?我们如何解释正在发生的情况?

一个重要的原因是发表偏差。以下是文章中关于发表偏差的引述:过去几年,几项元分析(我们稍后会讨论元分析是什么)重新评估了抗抑郁药的疗效和安全性,并得出结论,这些药物的治疗价值可能被显著高估了。这篇文章中还有其他例子,回顾文献会发现,许多结论都被夸大了。

尽管发表偏差在文献中已被记录了几十年,其起源和后果也备受争议,但有证据表明这种偏差正在加剧。我还没有告诉你发表偏差具体是什么,但你可能已经熟悉这个概念,并且看到了它的一些影响。

一个典型的例子是生物医学研究和自闭症谱系障碍领域,在某些领域,负面结果的研究完全缺失。这意味着什么?这意味着只有显示显著积极效果的研究论文才会被发表。如果我们尝试了多种治疗方法,只有一种有效,我们尝试了20种,只有一种有效,我们会发表多少篇论文?一篇,而不是二十篇。

那么,这如何成为一个问题?我们能用发表偏差来解释这种衰退效应吗?它是如何实际运作的?

让我们绘制一个图表,其中X轴是研究规模(请注意这是对数刻度,所以这里是10,这里是100,这里是1000,依此类推)。研究规模指的是研究中涉及的患者数量。研究规模越大,你拥有的统计功效就越高(我们稍后会准确定义统计功效的含义),你也就越能确定实际效果。这里的假设可能是,随着时间的推移,当你看到一些结果后,你或其他研究人员能够获得更多资金,进行越来越大规模的研究。这就像某种新药的I期、II期、III期临床试验,随着研究的推进,患者群体越来越大。

以下数据是模拟的,但想象你看到了这种衰退效应。Y轴是效应量(我们稍后会准确定义效应量)。这指的是积极结果的程度。假设负值代表不好,正值代表好。例如,通过某种干预或咨询方法成功说服戒烟的人数,或者某种治疗后白细胞增加的数量。正值代表好。

这种衰退效应可能呈现出这样一种模式:早期只有10名参与者的研究显示很高的效应量,随着研究规模增大,效应量似乎变得越来越差。我们如何解释这种现象?

这种现象可以直接用发表偏差来解释。想象现在图表上的每个点,都代表了某个研究团队针对该现象所做的一次测试。你期望看到的是漏斗形状:随着研究规模越来越大,研究结果也越来越精确。这是无法回避的——随着样本量增加,统计功效更高,你越能更好地区分真实效应和虚假效应。

但你会注意到,这些点最终回归到的实际效应值是0.0,即没有效应。然而,由于变异性,在外围(小样本研究)你当然会得到一些(偶然的)正值结果。如果你只报告那些积极的结果,最终就会得到这种神秘的衰退效应图。

以下是发表偏差如何导致衰退效应的关键点:

  • 小样本研究的变异性:小规模研究由于样本量小,结果更容易受偶然因素影响,可能偶然得出一个较大的效应量(正值)。
  • 选择性发表:只有显示出显著积极结果的研究(通常是那些偶然得出大效应量的小样本研究)更容易被发表。
  • 大样本研究的精确性:大规模研究结果更稳定、更精确,更可能接近真实的效应值(在这个例子中是0)。
  • 观察到的模式:随着时间的推移,当后续进行更大规模的研究时,发表出来的效应量就会逐渐“衰退”,趋向于真实的零效应,从而形成了从左上到右下的衰退趋势。

本节课中,我们一起学习了发表偏差的概念。我们看到,由于研究者、期刊倾向于发表具有统计显著性的积极结果,而忽略阴性或不显著的结果,会导致对某现象真实效应的估计产生系统性偏差。这种偏差可以完美地解释为何某些早期轰动性的研究发现,会在后续更大规模的研究中效应量逐渐减小甚至消失,即“真相衰退效应”。理解这一点对于批判性地评估科学文献和新闻报道至关重要。

013:效应量 📊

在本节课中,我们将要学习效应量(Effect Size)的概念。效应量是衡量研究结果实际重要性的指标,而不仅仅是统计显著性。我们将探讨其定义、计算方法、常见标准,以及与置信区间的关系。

概述

上一节我们讨论了发表偏倚(Publication Bias),其图表纵轴使用了效应量。那么,什么是效应量?P值仅表示在重复实验中观察到至少同等或更极端效应的概率,它只回答“是否显著”的问题,而不说明“有多显著”或“有多重要”。效应量正是试图捕捉这种重要性程度的指标。

效应量的定义与计算

在比较实验组和对照组均值的情境下,效应量的定义如下:

效应量 = (实验组均值 - 对照组均值) / 标准差

这个公式不仅告诉你结果是否显著,还告诉你显著的程度。效应量在元分析(Meta-analysis)中被广泛用于合并多项研究的结果,它有助于标准化不同参数(尤其是不同样本量)的研究。

使用效应量时需要谨慎,因为如果违背了实验进行时的假设,对不同实验的平均结果进行合并可能会产生无意义的结果。此外,效应量还有其他定义,如比值比(Odds Ratio)和相关系数(Correlation Coefficient),但本节我们只讨论上述定义。

有一种观点认为,效应量应始终与P值一同报告,尽管这种做法目前非常少见。这一观点由Robert Coh在2002年英国教育研究协会年会上发表的论文中提出,该论文已在本幻灯片底部引用。

更精确地说,我们讨论的是标准化均值差的效应量。其计算公式为:

效应量 = (组1均值 - 组2均值) / 合并标准差

这里的“合并标准差”有多种计算方式。一种简单的方法是直接使用对照组的标准差。其依据是,由于两组样本来自同一总体,其变异度理应相同。另一种方法是计算实际的合并标准差,其表达式如下:

合并标准差 = √[((n₁-1)s₁² + (n₂-1)s₂²) / (n₁ + n₂ - 2)]

我们不会深入更多细节,但需要指出,总体概念相当简单,使用直接的标准差定义是合理的。

效应量的标准

由于效应量是标准化的,我们可以推理什么是大效应量,什么是小效应量。以下是Jacob Cohen提出的一个经验法则:

以下是效应量大小的经验分类:

  • 小效应量:0.2
  • 中等效应量:0.5
  • 大效应量:0.8

请记住,效应量是均值差除以标准差。因此,它衡量的是,相对于数据的波动(方差),均值差异有多大。

效应量的置信区间

最后,我们简要提及效应量的置信区间,以帮助建立直观理解。置信区间的一个优势是,它可能更容易根据实际决策进行解释。

效应量的95%置信区间意味着:如果将实验重复100次,我们预计该区间会在95次中包含本次实验测量到的这个特定效应量。

由此可以得出一个推论:如果该95%置信区间包含0,则等价于该结果在统计上不显著。这意味着,在95%的情况下,该区间会包含“无效应”的情况。

反之,如果该区间不包含0,则结果在统计上是显著的

总结

本节课中,我们一起学习了效应量的核心概念。我们了解到,效应量是衡量实验结果实际规模或重要性的标准化指标,计算公式为均值差除以标准差。我们介绍了Jacob Cohen提出的判断效应量大小的经验标准(小:0.2,中:0.5,大:0.8),并探讨了效应量置信区间的含义及其与统计显著性的关系。理解效应量有助于我们超越简单的“是否显著”,更全面地评估研究发现的实际意义。

014:元分析 📊

在本节课中,我们将要学习元分析(Meta-analysis)的概念。这是一种通过整合先前多项独立研究的结果,以获得更全面、更可靠结论的统计方法。它在评估存在发表偏倚的研究领域时尤为重要,并且在大数据科学中,当我们整合来自不同来源的数据时,理解元分析的原理也至关重要。

元分析的起源与概念

上一节我们讨论了发表偏倚,与之相关的一个重要概念就是元分析。

元分析的核心是回顾并整合先前多项研究的结果。在1978年,统计学家格拉斯(Glass)通过统计方法汇总了325项心理治疗研究的结果,以证明“心理治疗无效”这一主张。这项工作标志着“元分析”这一术语的正式诞生。

这种方法建立在早期统计学家(包括费希尔)的思想之上。费希尔曾指出:当进行了一系列独立的显著性检验时,有时虽然单独看每一项结果都不显著,但综合起来却能给人留下深刻印象,即整体上由偶然性导致的概率会更低。这意味着,个体研究可能显得微弱,但我们可以通过聚合它们来得到一个更有力的结果

元分析在大数据科学中的重要性

我想特别强调元分析思想在大数据科学背景下的重要性,原因有二:

  1. 你经常需要处理并非由你自己收集的数据,因此将其视为一项元分析实验可能非常有用。
  2. 大数据之所以“大”,通常是因为它由多个不同来源的数据组合而成。理解何时可以以及如何进行这种组合至关重要。

如何进行元分析?

那么,我们如何进行元分析呢?方法其实相当简单。

其基本思想是计算各项独立研究结果的加权平均值

以下是定义权重的两种常见方法:

  • 按样本量加权:这是一种非常简单的方法,即给予样本量更大的研究更高的权重。其权重公式为:
    w_i = n_i / Σn_j
    其中,w_i 是第 i 项研究的权重,n_i 是该项研究的样本量,Σn_j 是所有研究的总样本量。
  • 按逆方差加权:这是一种更复杂的方法,权重为方差的倒数(即 1 / 方差)。方差高的研究(可能因为样本量小或其他原因)精度较低,因此被赋予较低的权重。标准误的平方(1 / SE^2)是计算这种权重的一种常见方式。

这里重要的是理解其背后的直觉:给予更精确(方差更小、样本量更大)的研究更高的权重,而不是仅仅记忆公式。

注意事项与异方差性

当然,和往常一样,这里有一个重要的注意事项。上述讨论基于固定效应模型,它假设每项独立研究都在测量同一个真实的效应量。

此外,在讨论发表偏倚的漏斗图时,我们看到了另一种现象:图形一侧方差高,另一侧方差低。描述这种现象的通用术语是异方差性。它指的是方差本身并非常数

例如,在某个图表中,方差在两端高,在中间低。异方差性本身不一定是问题,估计值仍然是无偏的。但它会增加整体的误差估计,导致统计功效降低。因为你最终会得到一个非常高的误差数值,即使你在预测方面做得相当不错。

为了说明这一点,我生成了一个模拟数据图。我故意让方差沿着X轴变化,然后根据某种分布对Y值进行抽样。这里的关键点是,尽管重复绘制回归线多次,其变化并不大。问题在于,你可能会因为忽略了真实效应而增加误差并失去统计功效。

总结

本节课中,我们一起学习了元分析。我们了解了它的起源——通过整合多项研究(如325项心理治疗研究)来获得更强大的结论。我们探讨了其核心方法:对独立研究结果进行加权平均,并介绍了按样本量加权和按逆方差加权两种权重定义方式。我们还指出了固定效应模型的假设前提,并引入了异方差性的概念,即方差不恒定可能对统计功效产生影响。理解元分析对于批判性评估现有文献以及在大数据项目中审慎地整合多源数据都具有重要意义。

015:欺诈检测与本福特定律 📊

在本节课中,我们将探讨科学发现“衰退效应”的另一个原因——欺诈,并学习一个用于检测数据欺诈的统计工具:本福特定律。

上一节我们介绍了科学发现“衰退效应”的多种原因,本节中我们来看看另一个重要因素:人为错误与欺诈。

欺诈现象的上升趋势 📈

有证据表明,学术不端行为正在增加。衡量这种现象的一种方式是观察论文撤稿的数量。根据诺登在2011年《自然》杂志上发表的文章,从2001年到2011年,论文撤稿数量增加了十倍,而同期发表的论文总数仅增加了1.44倍。

以下是来自PubMed和Web of Science两个数据库的撤稿数量趋势图。需要说明的是,这两个数据库均不包含计算机科学领域的论文。

可以看到,撤稿数量显著上升。

欺诈检测工具:本福特定律 🔍

我们不深入探讨欺诈现象的所有细节,但希望介绍一个有时用于检测欺诈的统计工具:本福特定律。

如果你不熟悉本福特定律,这是一个非常有趣且值得了解的定律。它预测了数据中首位数字的分布

如果不深入思考,你可能会凭直觉认为,在随机数据中,首位数字的分布应该是均匀的,即数字1到9出现的概率大致相等。但事实证明,在许多情况下,其分布并非如此。

本福特定律预测的分布是:数字1作为首位数字出现的频率最高,约为30%,数字2次之,依此类推,数字9出现的频率最低。这种分布模式可能会让你感到惊讶。

本福特定律的实际案例 📊

在解释其原理之前,我们先看一些实际案例。这些案例取自一个名为testingbenfordslaw.com的网站,该网站收集真实数据并绘制图表。

以下是Twitter用户粉丝数量的首位数字分布:

列表中的数字是粉丝数量。可以看到,粉丝数首位数字为1的Twitter用户占32.62%(图中蓝条),红点则是本福特定律的预测值。首位数字为2的占16.66%,同样与预测值(红点)接近。整体拟合度相当不错。

以下是其他遵循本福特定律的数据集示例:

  • 恒星与地球的距离(以光年计):其分布与本福特定律的预测惊人地接近。
  • 2010年5月至9月英国政府支出:同样,实际数据与本福特定律的预测高度吻合。
  • Google图书中独特一元语法(1-gram)的数量:我们几周前讨论过一元语法,它本质上就是单个词语。其分布也与预测相当吻合。

你可能会认为这个网站存在选择偏差,只挑选了符合该定律的数据集。虽然我不能完全保证没有这种可能,但通过一些阅读和(希望我已建立的)一点信任,我希望能够说服你,这并非完全由网站选择性展示数据所致。

总结 ✨

本节课中我们一起学习了:

  1. 欺诈是导致科学发现“衰退效应”的原因之一,论文撤稿数量的显著上升是这一现象的体现。
  2. 本福特定律是一个有用的统计工具,它描述了自然产生的、跨度多个数量级的数据集中,首位数字的非均匀分布规律(数字1出现频率最高,约为30%)。
  3. 我们通过Twitter粉丝数、恒星距离、政府支出、Google图书词频等多个真实数据集,验证了本福特定律的预测能力。

理解本福特定律有助于我们以批判性的眼光审视数据,并在某些情况下,识别出可能的人为篡改或欺诈痕迹。

016:本福特定律的直觉 🧮

在本节课中,我们将探讨本福特定律背后的直觉,并了解它如何被应用于检测数据中的异常或欺诈行为。

上一节我们介绍了本福特定律的基本概念和公式,本节中我们来看看其背后的逻辑以及实际应用。

应用:欺诈检测

本福特定律可用于检测欺诈行为。迪肯在2007年进行了一项实验,旨在探索该定律是否可用于检测科学数据中的欺诈。

以下是该实验的主要发现:

  • 在真实的研究中,已发表的统计估计值的第一位和第二位数字大致符合本福特定律分布。
  • 至少,这些数字的分布呈现出单调递减的趋势(即数字1的出现频率高于2,2高于3,依此类推),即使不完全符合本福特定律的精确比例。
  • 当要求实验对象手动“制造”回归系数(即手动拟合一条线)时,他们数据的第一位数字很难被检测为异常。
  • 然而,他们数据的第二位和第三位数字的分布,则显著偏离了预期的分布。

我们之前讨论的分布和给出的公式,仅适用于数字的第一位。这种分布的偏斜性在第二位和第三位数字中实际上会被削弱。但本福特定律也可以用来描述第二位和第三位数字的不同但仍可测量的分布。在上述实验中,第二位和第三位数字的分布出现了显著偏差。

因此,结论是:本福特定律有潜力作为科学数据中的欺诈检测工具。事实上,在法庭上,本福特定律已被采纳为欺诈案件的证据。记者和分析师也用它来论证选举投票、会计数据等全球性场景中可能存在的欺诈证据。

定律的直觉解释

那么,这背后的原理是什么?一种理解其直觉的方式是进行一个思想实验。

想象有一系列标有数字的卡片,数字从1开始,一直到999,999。我们按顺序将这些卡片一张一张地放入一顶帽子中。

每放入一张卡片,就测量一次概率:此时从帽子中随机抽取一张卡片,抽到的卡片上数字的第一位是1的概率是多少?

随着我们放入的卡片越来越多,这个概率会如何变化?最初,当我们只放入数字1到9的卡片时,抽到首位为1的卡片的概率是100%。当我们放入数字10到19时,概率开始下降,因为出现了首位为1的新卡片(10-19),但也出现了首位为2的卡片(20-29)。这个概率会不断波动,但本福特定律描述的是,当数字范围覆盖多个数量级(例如从1到一百万)时,这个概率会稳定在约30.1%。

本节课中我们一起学习了本福特定律在欺诈检测中的实际应用,并通过一个思想实验直观地理解了为何自然产生的数据中,数字1作为首位的出现概率会远高于其他数字。掌握这一原理,有助于我们利用数据本身的分布特征来识别潜在的人工篡改痕迹。

017:本福特定律的可视化解释

在本节课中,我们将学习本福特定律,并通过一个模拟实验来直观地理解其背后的概率原理。我们将探讨该定律的适用条件,并了解它在实际中(如欺诈检测)的应用。

概率分布的可视化

上一节我们介绍了本福特定律的基本概念,本节中我们来看看其概率分布的具体形态。

下图展示了一个模拟实验的结果。需要说明的是,图中的X轴是对数刻度,这可能会造成一些视觉上的误导。但我们可以通过观察条形的高度来理解其含义。

  • Y轴代表抽到特定首位数字的概率。
  • 蓝色条形对应数字1。
  • 绿色条形对应数字2,依此类推。

这个图表是通过以下模拟生成的:从一个分布中随机选取数字,然后按照上一节描述的方式(即按顺序放入“帽子”并抽取)进行处理。我们放入一个数字,然后测量抽到首位数字为1的值的概率。

概率变化的逻辑

以下是模拟过程中概率变化的逻辑:

  • 当放入数字1时,抽到首位为1的卡片的概率是100%。
  • 当放入数字2时,概率降至50%。
  • 当放入数字3时,概率降至33%,以此类推。
  • 当达到数字10时,概率再次上升到一个较高的百分比,并在10、11、12、13、14等数字期间保持较高水平。
  • 当达到数字20时,概率又有所下降。

这就是图表中概率先攀升(经过十位数区间),然后又急剧下降的原因。

核心机制与公式

此模型的核心在于:当你处理到首位为2的数字时,首位为1的数字总是已经在“帽子”里了;处理到3时,首位为1和2的数字也总已在其中,依此类推。

最终,这些概率峰值由数字1引领。虽然这是一个对数坐标图,面积表示并不完全准确,但曲线下的面积确实代表了抽到该数字的概率,并且数字1的概率实际上是最高的。

关于本福特定律的概率,还有其他模型和思考方式。该定律本身也存在一个闭合形式的表达式

P(d) = log₁₀(1 + 1/d)

其中,d 代表首位数字(1到9)。

定律的适用条件与局限性

本福特定律并非总是成立。其关键适用条件是:数据集必须跨越多个数量级

  • 如果数据范围很窄,例如仅在50到90之间随机选取,那么你根本不会得到首位是1的数字。
  • 如果数据范围是1到100,虽然会有一点这种效应,但并不普遍。
  • 理想情况下,数据需要跨越很多个数量级。

下图说明了这一点:红色区域代表抽到首位数字为1的概率,蓝色区域代表抽到首位数字为8的概率。

只要跨越足够多的数量级,首位为1的区域面积就会大得多。但如果范围很窄,概率就更多地由数据分布本身决定,而没有足够的机会让数字1对应的曲线下面积变大。

总结与应用

本节课中我们一起学习了本福特定律的可视化解释。我们通过模拟实验观察了首位数字的概率分布,理解了其“先到先得”的核心机制,并掌握了其数学表达式 P(d) = log₁₀(1 + 1/d)

最后,我们了解到该定律可用于检测欺诈(例如财务数据造假),并将这一点联系回我们最初的背景:试图理解某些统计结果中感知到的、日益增加的弱点或异常。

018:Bonferroni和Šidák校正 📊

在本节课中,我们将要学习多重假设检验的概念,以及如何通过Bonferroni和Šidák校正来控制因多次检验而导致的错误发现风险。理解这些方法对于确保数据分析结果的可靠性至关重要。

多重假设检验的问题

上一节我们讨论了可能导致“衰退效应”的几种解释。本节中我们来看看一个极其简单但极其常见的原因:多重假设检验。

这里的问题是,如果你反复进行实验,你几乎必然会发现一些“显著”的结果。这就像反复掷骰子,掷的次数足够多,总有一次会得到你想要的组合。在实验设计中也是如此,你不能无限制地测试直到得到一个阳性结果。

这个问题与发表偏倚相关,因为你可能只展示阳性结果。但它又有所不同,因为这里讨论的是在同一份数据上测试不同的假设。

在这些情况下,要么你根本不应该这样做,要么如果出于各种原因必须这样做,你就需要降低显著性水平。这意味着你不能满足于0.05作为阈值,而需要设定一个低得多的标准。

为什么需要校正?

为了理解原因,让我们考虑一个基于完全随机数据的基本场景。

我们设定显著性水平α为0.05。这意味着,当效应不存在时,错误地检测到效应的概率是0.05。相应地,当效应存在时,正确检测到效应的概率是1 - α。

现在,假设我们进行k次独立的实验。在所有k次实验中都正确检测到效应(假设效应存在)的概率是(1 - α)自乘k次。这个计算成立的前提是各次实验的概率是独立的,可以相乘。

那么,在至少一次实验中,当效应不存在时却错误地检测到效应的概率,就是1减去上面那个“完美”的概率。换句话说,就是至少犯一次错误的概率。

以下是这个概率随检验次数增加的变化趋势:

  • 随着检验次数(X轴)增加,至少出现一次虚假发现(Y轴)的概率迅速上升。
  • 当进行大约50次假设检验时,出现至少一次虚假发现的概率高达约90%。

因此,控制这个“至少犯一次错误”的概率,被称为控制族错误率。这是一个相当严格的要求。

如何校正?

那么,我们如何控制族错误率呢?以下是两种常用的校正方法。

Bonferroni校正

一种解决方案是Bonferroni校正。其方法非常简单:将原始的显著性水平α除以假设检验的总次数。

公式校正后的α = α / k,其中k是假设检验的次数。

例如,如果你的原始显著性水平α是0.05,而你进行了20次假设检验,那么校正后的显著性水平就是0.05 / 20 = 0.0025。只有p值小于0.0025的结果才能被认为是统计显著的。

Bonferroni校正的优点在于它不要求各次检验之间相互独立,适用范围更广。

Šidák校正

另一种校正是Šidák校正。它的公式略有不同,并且有一个额外的条件:要求各次假设检验是相互独立的。

公式校正后的α = 1 - (1 - α)^(1/k),其中k是假设检验的次数。

这个公式的推导基于概率的独立性假设。当我们计算“所有k次检验都不犯错误”的概率时,需要将(1 - α)连乘k次。为了控制整体错误率,我们反过来求解单次检验应满足的、更严格的α值。

因此,如果各检验之间存在相关性,Šidák校正可能不是最合适的选择,而Bonferroni校正则更为稳健。


本节课中我们一起学习了多重假设检验带来的风险,即随着检验次数增加,出现虚假发现的概率会急剧上升。为了控制整体的族错误率,我们介绍了两种校正方法:通用的Bonferroni校正和基于独立性假设的Šidák校正。在实际数据分析中,尤其是进行大量探索性检验时,应用这些校正对于维护结论的严谨性至关重要。

019:多重假设检验与错误发现率

在本节课中,我们将学习如何在进行多重假设检验时控制错误。我们将重点介绍两种经典方法:邦费罗尼校正和Šidák校正,并探讨一种更灵活的控制指标——错误发现率。

多重假设检验问题

上一节我们介绍了进行多次统计检验时,犯至少一次第一类错误的概率会显著增加。本节中,我们来看看如何通过校正显著性水平来控制这个“族错误率”。

推导校正后的显著性水平

我们将从整体的显著性水平α出发,推导出每个独立检验应使用的校正后显著性水平α_c。

我们设定整体显著性水平α等于“至少有一个检验显著”的概率。这个概率可以表示为1减去“所有检验都不显著”的概率。

假设各检验相互独立,那么“所有检验都不显著”的概率就是每个检验“不显著”概率的乘积。如果进行k次检验,这个概率就是 (1 - α_c)^k

因此,我们得到以下公式:

α = 1 - (1 - α_c)^k

现在,我们求解α_c:

1 - α = (1 - α_c)^k
(1 - α)^(1/k) = 1 - α_c
α_c = 1 - (1 - α)^(1/k)

这个公式就是Šidák校正。

两种校正方法的比较

以下是邦费罗尼校正与Šidák校正的直观比较。

上图放大了0.05显著性水平附近的区域,可以清楚看到两种校正的差异。

  • 邦费罗尼校正:它将整体显著性水平α平均分配给k次检验,即 α_c = α / k。这使得无论进行多少次检验,犯错的概率都被恒定地控制住了。
  • Šidák校正:其公式为 α_c = 1 - (1 - α)^(1/k)。如图所示,Šidák校正比邦费罗尼校正更为保守,即对显著性水平的要求更严格。

需要记住的是,这两种基于族错误率的校正方法都被认为过于保守。使用它们会牺牲过多的统计功效,可能导致一些真正有意义的效应无法被检测出来。

引入错误发现率

由于族错误率控制方法过于保守,我们引入一种更灵活、统计功效更高的控制指标——错误发现率

为了更好地理解FDR,我们回顾一下假设检验的结果分类,并使用一套新的标记符号:

  • T/F 代表原假设实际为 真/假
  • D/ND 代表我们的检验结果是 拒绝/不拒绝 原假设(即做出/未做出“发现”)。

根据这个表格:

  • 错误发现 是实际为真却被我们拒绝的情况。
  • 发现总数 是所有我们拒绝原假设的次数。

错误发现率 的定义是:

FDR = 错误发现的次数 / 发现的总次数

直观地说,如果你做了10次检验并拒绝了10次原假设,其中有4次是错的,这非常糟糕。但如果你做了100次检验,拒绝了50次,其中有20次是错的,虽然错误绝对数更多,但错误比例(40% vs 20%)和探索出的真实效应数量(30个 vs 6个)却不同。

FDR控制的理念在于,发现真实效应是有价值的。只要能将错误发现的比例控制在一定范围内,我们愿意接受一定数量的错误,以换取更高的统计功效和发现更多真实效应的能力。

总结

本节课中我们一起学习了多重假设检验的校正方法。我们首先推导了Šidák校正公式,并比较了它与邦费罗尼校正的保守程度。接着,我们指出了基于族错误率的校正方法因过于保守而导致统计功效过低的问题。最后,我们引入了错误发现率这一更灵活的控制指标,它允许在控制错误比例的同时,保留更高的统计功效来发现真实存在的效应。

020:多重假设检验与Benjamini-Hochberg程序

在本节课中,我们将学习如何控制多重假设检验中的错误发现率。具体来说,我们将介绍Benjamini-Hochberg程序,这是一种用于管理大量假设检验时假阳性比例的统计方法。

概述

当同时检验多个假设时,传统的显著性水平(如α=0.05)会导致假阳性结果的数量急剧增加。Benjamini-Hochberg程序提供了一种方法,可以在控制错误发现率的同时,进行多重比较。

Benjamini-Hochberg程序的工作原理

上一节我们介绍了多重假设检验带来的问题,本节中我们来看看Benjamini-Hochberg程序的具体步骤。

该程序通过调整每个假设的P值比较阈值来控制错误发现率。其核心思想是对P值进行排序,并应用一个随排名递增的、更严格的显著性阈值。

以下是该程序的具体操作步骤:

  1. 计算并排序P值:首先,计算所有M个假设的P值。然后,将这些P值按从小到大的顺序进行排序。排序后,P值最小的假设(即证据支持最强的假设)排在第一位。
  2. 应用调整后的阈值条件:对于排序后的第i个假设(i为其排名,从1到M),将其P值与一个调整后的阈值进行比较。这个阈值比原始的显著性水平α更为严格。
    • 调整后的阈值公式为: (i / M) * α
    • 其中,i 是假设的排名顺序,M 是假设的总数,α 是预设的显著性水平(通常为0.05)。
  3. 确定拒绝域:从排名最高的假设开始向下检查,找到最大的排名i,使得该假设的P值满足:P(i) ≤ (i / M) * α
  4. 做出决策:拒绝所有排名小于或等于上一步中找到的i的假设的原假设。换句话说,接受所有排名高于i的假设。

程序示例与图解

为了更直观地理解,我们来看一个包含50个假设(M=50)、α=0.05的例子。

根据调整公式,每个假设需要满足的条件如下:

  • 第1个假设:P(1) ≤ (1/50)*0.05 = 0.001
  • 第2个假设:P(2) ≤ (2/50)*0.05 = 0.002
  • ...
  • 第50个假设:P(50) ≤ (50/50)*0.05 = 0.05

可以看到,对排名靠前的假设,条件非常严格;随着排名增加,条件逐渐放宽,直到最后一个假设恢复到原始的α水平。

下图展示了这个过程:

图中,X轴代表假设的排名顺序(i),Y轴代表P值。每个点代表一个排序后的假设。斜线代表调整后的阈值线 y = (i / M) * α

我们的目标是找到位于这条线下方(或线上)的、排名最大的点(图中用“X”标出)。然后,拒绝所有排名小于或等于该点的假设(即该点左侧的所有点)。在这个例子中,我们大约拒绝了30个假设,接受了20个。

程序的理论保证

Benjamini和Hochberg证明,遵循此程序,可以将错误发现率控制在预期水平以下。

具体而言,他们证明错误发现率满足:FDR ≤ (T / M) * α

其中:

  • FDR 是错误发现率。
  • T 是所有假设中,原假设为真的总数。
  • M 是假设的总数。
  • α 是预设的显著性水平。


总结

本节课中我们一起学习了Benjamini-Hochberg程序。它是一种强大的统计工具,用于在同时进行大量假设检验时控制错误发现率。其核心步骤包括:对P值排序、应用一个随排名递增的调整阈值 (i / M) * α,并据此做出拒绝或接受原假设的决策。这种方法在基因组学、金融、互联网A/B测试等涉及海量比较的数据科学领域尤为重要。

021:大数据与虚假相关

在本节课中,我们将探讨大数据时代下统计推断面临的新挑战,特别是虚假相关性问题。我们将回顾之前讨论的统计推断基础,并分析大数据如何改变了传统统计学的应用场景。

课程概述

上一节我们介绍了统计推断、效应量、异方差性、本福德定律以及多重假设检验等核心概念。本节中,我们将重点讨论大数据环境如何加剧了虚假相关性的风险,以及为什么理解数据背后的真实场景至关重要。

大数据时代的变革

著名统计学家布拉德利·埃夫隆对此有如下描述:

经典统计学是为小规模问题设计的,最多处理几百个数据点和少数几个参数。如今,我们已进入大规模科学数据收集的时代,对解决超出经典统计学范围的大规模推断问题提出了需求。这表明,在大数据时代,某些情况正在发生变化。

虚假相关的风险

在大数据中可能出现什么问题?正如我们之前讨论的,你可能会发现虚假关系

以下是一个近期在同事间流传的图表,它可能是一个玩笑,但清晰地说明了问题:

该图表展示了美国的谋杀率(蓝色线)与Internet Explorer浏览器市场份额(绿色线)之间的关系。附带的讨论甚至幽默地提出了各种理论来解释为何谋杀率会随着IE市场份额的上升而上升,或随着其下降而下降。

这里的核心观点是:如果缺乏常识或对问题场景的理解,你可能会做出此类“发现”。

其他虚假相关的例子

文献中还讨论过其他被引为反面教材的例子:

以下是几个著名的虚假相关案例:

  • 警察数量与犯罪数量:这两者为何相关?难道警察导致犯罪?很可能不是。真正的原因是在人口密集区域,警察数量和犯罪数量都更多。
  • 冰淇淋销量与溺水死亡人数:这两者为何相关?存在季节性因素。夏季,冰淇淋销量更高,同时游泳的人也更多,导致溺水风险增加。
  • 鹳鸟目击次数与人口增长:有人以此作为“鹳鸟确实给家庭送来新生儿”的证据。同样,在人口更密集的地区,有更多人可能目击到鹳鸟,因此目击次数增加。

需要指出的是,引用这些例子的作者并非声称这些因果关系成立,他们恰恰是在指出其中的谬误。

统计学与机器学习的教学差异

用于消除偏差、理解抽样总体以及识别虚假相关可能性的这些方法,通常在统计学课程中教授,但在典型的机器学习课程中却很少涉及

课程总结

本节课中,我们一起学习了大数据如何放大了虚假相关性带来的挑战。我们认识到,仅仅依靠算法从海量数据中发现模式是远远不够的,必须结合领域知识、常识和对数据生成过程的理解,才能避免得出荒谬或误导性的结论。这对于每一位数据科学家都至关重要。

022:虚假相关与大数据陷阱 📈

在本节课中,我们将要学习大数据分析中一个常见的陷阱:虚假相关。我们将通过一个股票价格的模拟实验,来理解为什么在庞大的数据集中,我们很容易发现一些看似显著但实际上毫无预测能力的巧合模式。

大数据与虚假相关

上一节我们介绍了大数据的基本概念,本节中我们来看看大数据分析可能带来的一个特定问题。这与大数据有何关系?有一种观点认为,大数据存在一种“诅咒”,正如文森特·格兰维尔所指出的:当你在一个包含数十亿甚至数万亿数据点、数千个指标的庞大数据集中寻找模式时,你注定会发现一些没有预测能力的巧合。

他给出的例子是,考虑大量公司在一个月内的股票价格,然后检查所有股票对之间的相关性。实际上,分析不止于此,因为这可能是在完全相同的一个月期间内进行的。你可能还需要考虑时间滞后,例如,谷歌的股价可能在几天后影响到依赖谷歌的小公司的股价。

因此,你现在不仅仅是在比较每一对股票(例如500只股票的平方组合),你不仅仅是在检查这些时间序列的成对相关性,而且还在检查那些存在轻微时间偏移的序列之间的成对相关性。这些就是交叉相关分析程序。

相关性分析基础

以下是进行相关性分析的基本方法。非常基础的时间序列分析就是测量相关性,这里列出其公式。

两个数据集的协方差按以下方式计算:取数据点X_i,减去X的均值,再乘以Y_i减去Y的均值,然后将所有这些乘积相加,这就是协方差。

然后,你将协方差除以每个数据集的标准差的乘积,这样就得到了相关系数。

公式表示如下:

  • 协方差:Cov(X, Y) = Σ[(X_i - μ_X) * (Y_i - μ_Y)] / (n-1)
  • 相关系数:ρ = Cov(X, Y) / (σ_X * σ_Y)

股票价格模拟实验

那么这个实验具体是怎样的呢?我通过运行股票价格的随机漫步生成了这个图表。所有股票价格都从10美元的同一起点开始。

在模拟时间的每一个小时(即每一步),从正态分布中抽取一个样本,该分布的均值是当前股价,标准差是当前股价的1%。这个方法虽然不一定完全合理,但你可以直观地看到,它确实生成了类似股价走势的图形,并且这里确实产生了一些方差。

显然,这个过程是随机的。

实验结果分析

这张图显示了相关系数达到0.9水平(这是一个相当强的相关性)的数量,作为所追踪股票价格数量的函数。当我将股票数量从10只增加到100只时(虽然没有增加到文森特·格兰维尔在思想实验中所描述的500只),这就是你发现的虚假相关的数量。

需要指出的是,这个实验还没有考虑滞后的交叉相关,它只是直接计算了这两条时间序列在这一个月内的完全相关性,而且这个时间段也相当长。

核心结论

那么重点是什么?大数据意味着更多的机会,但也意味着更多发现虚假结果的机会

本节课中我们一起学习了大数据分析中的虚假相关现象。我们通过一个模拟股票价格的实验,理解了在庞大的数据集中进行大量比较时,即使数据本身是随机生成的,也极有可能发现统计学上显著但实际无意义的强相关性。这提醒我们,在面对大数据分析结果时,必须保持谨慎,并深入理解其背后的因果关系,而不仅仅是统计关联。

023:大数据有何不同 🧠

在本节课中,我们将探讨“大数据”与传统数据分析有何本质区别。我们将理解“大P”与“大n”的概念,并分析大数据带来的机遇与挑战,特别是关于统计偏差和多重假设检验的问题。


大P与大n:数据维度的区别

上一节我们介绍了数据分析的基本概念,本节中我们来看看大数据场景下的两个关键维度。

大数据的不同之处在于“大P”与“大n”的概念。其中:

  • 大P 指的是列数,即特征或变量的数量。
  • 大n 指的是行数,即观测记录的数量。

在我们之前进行的时间序列实验中,就是一个典型的“大P”场景。我们观察了越来越多的公司,并计算了它们之间所有可能的相关系数,因此数据量大致呈二次方增长


大数据的机遇:近乎零的边际成本

关于大数据,一个关键特点是增加记录数量的边际成本几乎为零。收集数据的成本变得越来越低。

这非常强大。我们希望通过增加记录数量来增强统计功效,帮助我们获得越来越低的P值,从而更可靠地发现规律。


大数据的挑战:放大偏差

然而,大数据也会放大偏差。如果你收集的是错误的数据,或者观察的是错误的人群,你可能会得出完全错误的所谓“发现”。

以下是几个具体的例子:

  • 网站点击日志:如果你记录网站的所有点击,你会得到一个非常庞大的数据集,可以非常精确地建模用户行为。但这只会建模你现有用户的行为。而建模用户行为的目的,可能恰恰是为了吸引新客户。例如,如果你的现有用户群是早期采用者,那么你建模的只是他们的行为,并未真正对更广泛的人群进行抽样。

  • 移动数据与民意调查:这在总统选举等民意调查中会出现。如果你只通过手机进行抽样,那么你只采样了拥有手机的人群。这可能与你想要采样的总体不同,例如,它可能忽略了低收入群体或不同年龄段的群体。


多重假设检验的陷阱

正如我们指出的,在多重假设检验中需要格外小心。有一幅精彩的XKCD漫画非常清晰地阐明了这一点。

漫画中演示了“绿色软糖会导致痤疮”的谬误。故事是这样的:有20种不同颜色的软糖。在P值为0.05的显著性水平下,我们进行了20次实验,果然发现其中一种颜色的软糖确实会导致痤疮——但这纯粹是偶然预期的结果。我鼓励你去查找那幅漫画。


黑天鹅事件:不可预测的极端情况

另一个需要提及,并且我们后续可能会再次讨论的概念,是纳西姆·塔勒布提出的黑天鹅事件

这是指本质上不可预测的事件,或者其分布不遵循正态分布(钟形曲线分布)的情况。在正态分布中,钟形曲线的尾部意味着极端值出现的概率呈指数级下降。但在某些情况下,极端值并非指数级罕见,它们确实会发生。

塔勒布使用的例子是:如果一只火鸡要建模你的行为,它会越来越确信你对它没有恶意,并且心怀善意。因为你每天都来喂它,照顾它,关心它的福祉。但在感恩节前一天,它却被宰杀了。这就是塔勒布对黑天鹅事件的论证。

“黑天鹅”本身指的是人们曾经不相信黑天鹅存在,后来却发现它们确实存在,因此它是一个意料之外的事件


本节课中我们一起学习了大数据区别于传统数据的核心维度(大P与大n),认识了大批量数据带来的统计功效提升,也重点剖析了其可能放大数据偏差、导致多重检验谬误以及难以预测“黑天鹅”极端事件的挑战。理解这些区别与风险,是进行负责任的大数据科学分析的第一步。

024:贝叶斯与频率派统计推断

在本节课中,我们将要学习统计推断的两种主要思想流派:频率派方法和贝叶斯方法。我们将探讨它们的基本原理、核心差异以及各自的优缺点。

到目前为止,我们讨论的统计推断都基于一个特定的视角,即频率派视角。频率派关注的是在给定零假设的前提下,观察到特定数据样本的概率。这就是P值所提供的信息。

然而,统计学还存在另一个视角,称为贝叶斯方法。贝叶斯方法关注的是在已经看到数据的前提下,出现某种结果的概率。接下来,我们将简要介绍贝叶斯方法,并举例说明其效力。

核心差异:什么被视作固定?

两者的差异可以从“什么是固定的”这个角度来理解。

频率派的观点认为,数据是可重复的随机样本。你总是可以按照相同的方式再次进行实验。事实上,你至少需要在概念上如此思考,才能理解这些方法产生的概率。因此,你可以推理出获得某种结果的频率。

在此可重复的过程中,总体的基本参数保持不变。总体是固定的,你只是不断进行实验。

而在贝叶斯方法中,数据是从一个已实现的样本中观察到的,总体的参数是未知的,但可以用概率来描述。因此,它们并非固定的值。然而,数据本身是固定的。你不会考虑回去采集更多数据,你只拥有已经获得的观测值。

贝叶斯方法的核心:贝叶斯定理

贝叶斯方法完全基于贝叶斯定理的应用。托马斯·贝叶斯所做的工作,就是将条件概率与先验信念联系起来。这允许你根据对某些事件发生概率的既有信念,在收集到更多数据时更新这些信念。

以下是贝叶斯定理的表述:事件A在事件B已经发生的条件下发生的概率,等于事件B在事件A已经发生的条件下发生的概率,乘以事件A无条件发生的概率,再除以事件B无条件发生的概率。

用公式表示如下:
P(A|B) = [P(B|A) * P(A)] / P(B)

如果这个公式目前还不清晰,没关系,我们稍后会详细解释。现在,你需要认识到其关键优势在于能够纳入先验知识,而这在频率派方法中是无法做到的。

贝叶斯方法的优势与挑战

然而,一个关键的弱点也恰恰在于你需要纳入先验知识。这带来了几个问题。

首先,如果你对所建模的总体一无所知,那么你在先验分布上能做的事情就很有限,很难很好地建模其分布。虽然有一些技术可以推导所谓的“无信息先验”,试图不过度影响结果,同时让你能够应用该定理,但这仍然是一个问题。

其次,或许更隐蔽的是,这也是贝叶斯方法在20世纪早期一度流行后又失宠的原因:你可以利用这个定理,通过代入你自己的先验信念,来证实或否定任何证据的效应。这意味着,对于同一组固定数据,两个拥有不同先验信念、对先验分布建模不同的人,可能会得出不同的结论。这被视为一个重大缺陷,并催生了频率派方法的兴起,后者或多或少更客观地看待数据本身。

总结

本节课中,我们一起学习了统计推断的两种范式。频率派方法将参数视为固定值,通过重复抽样来评估数据的概率。贝叶斯方法则将参数视为随机变量,利用贝叶斯定理结合先验知识和观测数据来更新对参数的信念。贝叶斯方法的优势在于能灵活纳入先验信息,但其结论对先验分布的选择敏感,这既是其力量所在,也是其备受争议之处。理解这两种视角的差异,对于全面掌握数据科学中的统计推断至关重要。

025:贝叶斯方法的动机

在本节课中,我们将探讨统计学中贝叶斯方法的起源、其核心争议,以及它为何在历史上被频率主义方法所取代,如今又重新受到重视。

贝叶斯定理的争议

上一节我们介绍了贝叶斯定理的基本形式。本节中我们来看看它在历史上引发的一个核心争议。

贝叶斯定理允许不同的人基于相同的实验证据得出完全相反的结论。Matthews在1998年的一篇论文中清晰地阐述了这一点。

以下是该争议的具体表现:

  • 支持者:对于超感官知觉(ESP)这样的现象,真正的信徒可以使用贝叶斯定理来证明新的实验结果支持其存在。
  • 怀疑者:怀疑者同样可以使用贝叶斯定理来证明ESP并不存在。

这两种观点之所以都可能成立,是因为贝叶斯定理只展示了如何根据新证据更新个人先前的信念水平。而不同的人在一开始就可以持有不同的先验观点。这就是问题的关键。

频率主义方法的兴起

面对贝叶斯方法依赖于主观先验信念的问题,以Fisher为代表的统计学家发展出了频率主义方法。

频率主义方法被认为实现了一个突破:它找到了一种独立于任何先验信念来判断实验数据显著性的方法。任何人都可以使用这种方法来证明一个结果在统计上过于显著,不能被轻易视为偶然。

以下是频率主义方法的核心操作:

  1. 将原始数据转换为一个称为 P值 的指标。
  2. 设定一个阈值来衡量这个P值的显著性。Fisher在其原始论文中,将这个阈值设定为 0.05

关于这个0.05阈值的来源,Fisher承认并没有特别的洞察。他选择0.05仅仅是因为它在数学上比较方便。

频率主义方法的问题

然而,从20世纪60年代起,大量研究开始揭示频率主义方法及其特定阈值(如0.05)所存在的问题。

普渡大学的James Berger撰写了一系列论文,警告了所谓的“Fisher的P值惊人地倾向于夸大显著性”的趋势。那些满足“20分之1”标准(即p<0.05)的发现,实际上可能在数据几乎不提供或完全不支持效应存在的情况下出现。

贝叶斯方法的复兴

可以说,在某些意义上,钟摆正再次摆回贝叶斯方法。除了主观性问题,贝叶斯方法还存在另一个挑战,我们将在后续部分详细讨论。

这个挑战是:为了用数学模型描述一个情境,你需要处理这些条件概率和先验概率。对于一个复杂的情境,建立数学模型可能非常困难。其结果是,你最终会得到一系列复杂的、需要积分才能应用贝叶斯规则的条件概率链。

这在计算上是难以处理的。历史上,人们使用了大量的技巧、简化和思路来使其变得可行。

但是,得益于能够通过计算对复杂分布进行采样的方法(如马尔可夫链蒙特卡洛方法)的发展,贝叶斯方法正变得越来越流行。该领域的许多思想家相信,对于21世纪而言,频率主义与贝叶斯方法的结合将成为主流。

总结

本节课中我们一起学习了贝叶斯方法的历史动机。我们了解到,由于其结论依赖于主观的先验信念,贝叶斯方法曾引发争议并被强调客观性的频率主义方法所取代。然而,频率主义方法(尤其是基于固定P值阈值)也被发现可能导致错误的结论。如今,随着计算能力的提升和新算法的发展,能够结合先验知识与数据的贝叶斯方法正重新获得重视。正是基于这些原因,我们将在入门层面探讨贝叶斯方法,并最终引向一个重要的机器学习算法——朴素贝叶斯。

026:贝叶斯定理 🧠

在本节课中,我们将学习贝叶斯定理。我们将探讨贝叶斯方法与频率主义方法的核心区别,并详细拆解贝叶斯定理的组成部分及其推导过程。

贝叶斯与频率主义方法对比

上一节我们介绍了统计学中的两种主要思想流派。本节中,我们来看看它们之间的核心区别。

下图是对这两种方法的快速总结。

频率主义方法关注于仅使用数据来做出决策。而贝叶斯方法则结合了先验信念和数据

这既是贝叶斯方法的优势,也是其弱点。优势在于,如果你拥有良好的先验信息,可以将其纳入分析。弱点在于,你必须实际引入这些信息,并且这个过程具有一定的主观性,不同的人可能会有不同的先验信念。

贝叶斯定理详解

理解了基本区别后,现在我们来深入探讨贝叶斯定理本身。

贝叶斯定理涉及几个核心术语,以下是它们的定义:

  • 先验概率:在收集新数据之前,假设为真的概率。例如,在全球人口中,身高超过某个特定值的人所占的比例。
  • 边际概率:在所有可能的假设下,观察到当前这组特定数据的概率。
  • 似然:在假设为真的条件下,观察到当前这组数据的概率。
  • 后验概率:这是我们通常试图计算的核心,即在收集到数据后,假设为真的概率。

贝叶斯定理的推导

了解了各个组成部分后,我们可以通过一个简单的网格来直观地推导贝叶斯定理。

一种很好的解释方法是构建一个如下的 2x2 网格,其中包含事件 A 和事件 B,以及它们的补集(非 A 和非 B)。

图中蓝色方框代表事件 A 和 B 同时发生的概率,记作 P(A ∩ B)

这个概率可以通过两种方式表达:

  1. 事件 B 发生的概率,乘以在 B 发生的条件下 A 发生的概率:P(A ∩ B) = P(A|B) * P(B)
  2. 事件 A 发生的概率,乘以在 A 发生的条件下 B 发生的概率:P(A ∩ B) = P(B|A) * P(A)

由于这两种方式描述的是同一个概率,因此我们可以令它们相等:

P(A|B) * P(B) = P(B|A) * P(A)

然后,将等式两边同时除以 P(B),就得到了贝叶斯定理的标准形式:

P(A|B) = [P(B|A) * P(A)] / P(B)

其中:

  • P(A|B) 是后验概率。
  • P(B|A) 是似然。
  • P(A) 是先验概率。
  • P(B) 是边际概率。

总结

本节课中,我们一起学习了贝叶斯定理。我们首先对比了贝叶斯方法与频率主义方法的核心思想,然后详细解释了贝叶斯定理中的先验、似然、边际概率和后验概率等关键概念。最后,我们通过一个简单的概率网格,一步步推导出了贝叶斯定理的公式。理解这个推导过程有助于我们更深刻地掌握贝叶斯推理的本质,即如何利用新的数据来更新我们对某个假设的信念。

027:应用贝叶斯定理 🧮

在本节课中,我们将学习如何应用贝叶斯定理来解决一个经典的医学诊断问题。我们将通过一个具体的例子,理解如何计算在已知检测结果为阳性的情况下,某人实际患病的概率。这个例子将帮助我们掌握贝叶斯定理的核心思想及其在实际问题中的应用。

问题背景

假设我们已知以下信息:

  • 40岁参与常规筛查的女性中,有1%患有乳腺癌。
  • 真正患有乳腺癌的女性,其检测结果呈阳性的概率为80%(真阳性率)。
  • 未患乳腺癌的女性,其检测结果也呈阳性的概率为9.6%(假阳性率)。

现在的问题是:如果一位该年龄段的女性在常规筛查中检测结果呈阳性,那么她实际患有乳腺癌的概率是多少?

构建概率表格

为了清晰地分析问题,我们可以使用一个2x2的表格来整理所有已知概率。

以下是基于给定信息计算出的各项联合概率:

  • 真阳性:患病且检测为阳性。概率为 1% * 80% = 0.8%
  • 假阴性:患病但检测为阴性。概率为 1% * (1 - 80%) = 1% * 20% = 0.2%
  • 假阳性:未患病但检测为阳性。概率为 99% * 9.6% = 9.504%
  • 真阴性:未患病且检测为阴性。概率为 99% * (1 - 9.6%) = 99% * 90.4% = 89.496%

应用贝叶斯定理

上一节我们整理了所有基础概率,本节中我们来看看如何应用贝叶斯定理来解答核心问题。

我们要求的是 P(患病 | 检测阳性)。根据贝叶斯定理,其计算公式为:

P(患病 | 检测阳性) = [P(检测阳性 | 患病) * P(患病)] / P(检测阳性)

现在,我们已知:

  • P(检测阳性 | 患病) = 80% = 0.8
  • P(患病) = 1% = 0.01

我们还需要计算分母 P(检测阳性),即检测结果为阳性的总概率。这可以通过全概率公式计算:

P(检测阳性) = P(检测阳性 | 患病) * P(患病) + P(检测阳性 | 未患病) * P(未患病)

代入已知数值:

  • P(检测阳性 | 未患病) = 9.6% = 0.096
  • P(未患病) = 99% = 0.99

因此:
P(检测阳性) = (0.8 * 0.01) + (0.096 * 0.99) = 0.008 + 0.09504 = 0.10304

所以,检测呈阳性的总体概率约为 10.3%

计算最终答案

现在,我们将所有数值代入贝叶斯公式:

P(患病 | 检测阳性) = (0.8 * 0.01) / 0.10304 ≈ 0.0776

计算结果表明,在检测结果为阳性的条件下,该女性实际患有乳腺癌的概率约为 7.8%

这个结果可能低于许多人的直觉判断。人们可能会因为“80%的真阳性率”而高估患病概率。然而,由于患病的先验概率(1%)非常低,即使检测呈阳性,后验概率仍然相对较低。这正体现了贝叶斯推理的核心:将新证据(检测结果)与先验知识(基础患病率)相结合。

总结与思考

本节课中我们一起学习了如何应用贝叶斯定理解决一个具体的概率推理问题。我们通过构建概率表格理清了信息,然后严格遵循贝叶斯公式的步骤,计算出了在阳性检测结果下患病的后验概率。

这个例子虽然只涉及两个状态(患病/未患病)和二元结果(阳性/阴性),但它清晰地展示了贝叶斯定理如何修正我们的信念。在实际的大规模数据科学问题中,变量和状态可能复杂得多,但核心逻辑是相通的:利用数据(证据)来更新我们对未知事物的认知(概率)。理解这个简单案例是处理更复杂贝叶斯模型的重要基础。

028:朴素贝叶斯垃圾邮件过滤 📧

在本节课中,我们将学习如何应用贝叶斯规则来解决一个经典的大数据问题:垃圾邮件过滤。我们将了解如何利用邮件中的词语来计算一封邮件是垃圾邮件的概率,并介绍“朴素贝叶斯”这一核心假设如何简化计算过程。


上一节我们介绍了贝叶斯规则的基本概念,本节中我们来看看如何将其应用于垃圾邮件过滤。

我们的任务是:判断一封电子邮件是否为垃圾邮件。更具体地说,我们关心的是在已知邮件内容(词语)的条件下,该邮件是垃圾邮件的概率。

根据贝叶斯规则,这个概率可以表示为:

P(垃圾邮件 | 词语) = [ P(垃圾邮件) * P(词语 | 垃圾邮件) ] / P(词语)

其中,分子部分 P(垃圾邮件) * P(词语 | 垃圾邮件) 是关键。分母 P(词语) 是一个与邮件是否为垃圾邮件无关的常数,它不会影响我们最终的分类决策(是垃圾邮件还是非垃圾邮件)。因此,在实际决策时,我们可以忽略分母,只比较分子的大小。


当我们说“词语”时,指的是邮件中出现的所有词语。因此,上述概率可以更具体地重写为:

P(垃圾邮件 | 出现“Viagra”, 出现“rich”, 出现“friend”...)

现在,让我们关注分子部分 P(垃圾邮件) * P(词语 | 垃圾邮件)。根据条件概率的链式法则,它可以被展开成一个非常复杂的连乘形式:

P(垃圾邮件) * P(“Viagra” | 垃圾邮件) * P(“rich” | 垃圾邮件 且 出现“Viagra”) * P(“friend” | 垃圾邮件 且 出现“Viagra” 且 出现“rich”) * ...

这个公式计算起来极其复杂,因为每个词语出现的概率都依赖于前面所有词语是否出现。


这就是“朴素贝叶斯”假设发挥作用的地方。该假设认为:邮件中各个词语的出现是相互独立的。也就是说,看到“rich”这个词的概率,不会因为已经看到了“wealth”这个词而改变。

显然,这个假设在现实中并不完全成立(词语之间有关联性),但它极大地简化了计算。在朴素贝叶斯假设下,复杂的条件概率连乘被简化为:

P(垃圾邮件) * P(“Viagra” | 垃圾邮件) * P(“rich” | 垃圾邮件) * P(“friend” | 垃圾邮件) * ...

现在,每个 P(词语 | 垃圾邮件) 都可以从数据中轻松估计。


那么,如何获得这些概率呢?方法是通过已标注的数据进行统计。

以下是具体步骤:

  1. 准备一个已标注为“垃圾邮件”和“非垃圾邮件”(或“正常邮件”)的邮件数据集。
  2. 对于垃圾邮件数据集,统计每个词语出现的频率。
  3. 计算 P(词语 | 垃圾邮件),其公式为:
    (包含该词语的垃圾邮件数量) / (垃圾邮件总数)
  4. 同样地,计算 P(垃圾邮件),即所有邮件中垃圾邮件的先验概率。

有了这些概率后,我们就可以对一封新邮件进行分类了。一个简单而有效的决策规则是 MAP(最大后验概率)决策规则:比较邮件属于“垃圾邮件”和“非垃圾邮件”这两个类别的后验概率,并将邮件分配给概率更高的那个类别。

具体来说,我们分别计算:

  • 垃圾邮件得分 = P(垃圾邮件) * Π P(词语 | 垃圾邮件)
  • 非垃圾邮件得分 = P(非垃圾邮件) * Π P(词语 | 非垃圾邮件)

然后比较这两个得分,得分高的类别就是我们的预测结果。


本节课中我们一起学习了朴素贝叶斯分类器在垃圾邮件过滤中的应用。我们了解了如何用贝叶斯公式形式化这个问题,认识了“条件独立性”这一核心的朴素假设如何将复杂计算变得可行,并掌握了通过已标注数据估计概率以及使用MAP规则进行分类决策的完整流程。尽管其“朴素”的独立性假设在现实中可能不严格成立,但朴素贝叶斯因其简单、高效且通常效果良好的特点,仍然是文本分类任务中的一个经典且强大的基线方法。

029:统计与机器学习 📊🤖

概述

在本节课中,我们将探讨统计方法与机器学习之间的核心区别。我们将从实验设计、假设检验和统计估计等话题出发,过渡到更侧重于算法的机器学习视角,并理解两者在目标和方法论上的不同。


在之前的几个小节中,我们介绍了实验设计、假设检验和统计估计中的精选主题。我们通过所谓的“衰退效应”来引出这些话题,即科学结果随时间推移可重复性降低,或其效应量在重复实验中逐渐减小。

我们发现,诸如发表偏倚和统计方法误用等因素可以解释这种效应的很大一部分。此外,我们还讨论了贝叶斯视角,它允许你在此处融入先验知识,但也为分析中引入主观性打开了大门。这是它在20世纪初被广泛排斥的原因之一,但得益于允许大规模对复杂分布进行采样的计算技术,它正在复兴。我们当时没有深入细节,但我希望在课程结束前能再次讨论。

因此,在接下来的几个小节中,我想讨论一个更偏向算法的视角,这个视角与术语“机器学习”和“数据挖掘”联系更紧密。


什么是机器学习?

华盛顿大学的Pedro Domingo在2012年写了一篇出色的《ACM通讯》文章,概述了机器学习。他说,机器学习是从数据中自动学习程序的系统

这意味着,当你手动编写程序时,你明确地说明了如何将一组输入映射到某个期望的输出,你给出了一个执行此操作的“配方”。但关键在于,给定足够多的输入和期望输出的示例,你可以推断出映射它的程序,而不是必须明确地编写它。

所以有个玩笑是:既然可以学习程序,何必费心编写程序呢?另一种观点是“教计算机认识世界”,但我可能更喜欢这里的第一个要点。


统计与机器学习的区别

值得花几分钟时间讨论一下统计学和机器学习之间的区别。可能不值得投入大量时间或思考,因为术语最初并不精确。它们是在特定的历史背景下发展起来的,反映了不同的文化,而不是你可以推理的某种明确定义的概念。

不过,有一篇发表于2001年的论文(虽然现在有点久了)讨论了一种特定的差异,尽管它并非特指机器学习,但它捕捉到了我认为真正显著的差异。

下图左侧的模型是,该领域的所有参与者都试图做以下事情:观察到自然界能够将输入映射到输出,而我们希望能够通过计算来预测它。

以下是两种不同的攻击方式:

  • 统计学家通过尝试通过某种随机过程来建模世界来解决这个问题。在论文中,他们谈论的是数据建模,即对产生你所见数据的过程进行建模。其理念是,一旦你有了一个世界模型,你就可以用它来假设性地抽取更多样本,并对整个总体进行推理。
  • 另一种更偏向算法的观点是:我们认为自然界很难建模,而且我们并不真正关心是否拥有它的精确模型。我们试图做的只是衡量我们从给定输入预测所见输出的性能。因此,我们生成的模型(程序)是否真实反映了自然界中正在发生的实际过程并不重要,我们并不声称它做到了。但我们声称的是,它在进行预测方面做得相当不错。

无论如何,我认为这种观念与机器学习方法联系更紧密。


总结

本节课中,我们一起学习了从统计推断到机器学习算法的视角转变。我们明确了机器学习的核心是从数据中自动学习程序,并探讨了统计学(侧重于对数据生成过程进行建模)与机器学习(侧重于构建能做出准确预测的模型,而不必解释底层过程)之间的根本区别。理解这种区别有助于我们在解决实际问题时选择合适的方法论。

030:核心概念与示例 🎯

在本节课中,我们将学习机器学习的基本概念,包括分类与回归、监督学习与无监督学习的区别。我们将通过一个经典的“是否打高尔夫球”的预测示例和一个文档主题分类的示例来具体说明这些概念。


机器学习基础:1.1:一个简单的预测示例 ⛳

上一节我们介绍了机器学习的基本目标。本节中我们来看一个具体的预测示例。

假设我们想预测某人是否会去打高尔夫球(或其他户外活动),并且我们认为这取决于天气状况。我们考虑的输入特征包括:

  • 天气展望:晴朗、多云或下雨。
  • 温度:炎热、凉爽或温和。
  • 湿度
  • 风力

我们的目标是学习一个函数,它接收这些输入,并输出“是”或“否”,即是否去打高尔夫球。

最直观的预测方法是尝试使用一条简单的规则。例如,我们可能认为“只在晴天打球”。但这条规则并不成立,因为我们能找到反例,比如在阴天我们也可能打球。

我们可能会说,“如果下雨且刮风,我们就不打球”。这条规则虽然成立,但还有其他情况我们也不打球。因此,能够准确预测输出的函数,可能无法用一条简单的规则来表达。这超出了我们仅凭直觉就能处理的范围。我们需要一种有原则的方法来构建更复杂的模型。


机器学习基础:1.2:分类与回归 📊

上一节我们通过一个具体问题引出了对复杂模型的需求。本节中我们来明确一下这类问题的术语。

“高尔夫球”问题是一个分类问题的示例。在这个问题中,我们要预测的属性(标签)是类别型的。在本例中,它有两个值:(1)或(0)。

如果要预测的属性是数值型的,例如根据天气预测高尔夫球的得分,那么这就更接近于一个回归问题。特别是当所有输入特征也都是数值型时,它就成为一个经典的回归案例(当然也有方法处理类别型特征)。

我们之前讨论过回归,即用曲线拟合数据。当你使用拟合出的曲线进行预测时,可以看到它与处理类别型数据的分类问题在思路上是类似的。


机器学习基础:1.3:监督学习与无监督学习 🧠

上一节我们区分了预测任务的类型。本节中我们来看看机器学习模型是如何被“教导”的。

我们刚刚给出的高尔夫球示例是监督学习的一个例子。在监督学习中,你会获得输入数据和对应的期望输出(标签),目标是学习它们之间的关系。我们通过训练一个模型来实现这一点。

此外还有无监督学习的概念。在无监督学习中,你没有任何标签,只获得数据本身,目标是理解数据中潜在的结构。例如聚类算法或降维算法就属于无监督学习。


机器学习基础:1.4:无监督学习示例:文档主题发现 📄

上一节我们介绍了无监督学习的概念。本节中我们来看一个可以同时用两种学习方式处理,但目前作为无监督学习示例的问题。

假设你获得了一个庞大的文档集合,你想判断某个文档属于什么主题。例如,如果你看到短语“猎鹰队在周日大胜圣徒队”,你可能会猜测这篇文档是关于体育的。而如果你看到“火星车在周日发现了有机分子”,你可能会猜测这篇文档是关于科学的。

那么,如何将这个问题构建为一个机器学习问题呢?之前的例子中,我们有行(记录)和列(特征),目标是给定输入预测输出。在这里,行和列分别是什么?这对于已经完成过几次作业的你们来说应该不难。


在本节课中,我们一起学习了机器学习的基础概念。我们通过“是否打高尔夫球”的示例,理解了分类问题与寻找简单规则的局限,从而引出了对更复杂模型的需求。我们明确了分类(预测类别标签)与回归(预测数值)的区别。最后,我们介绍了监督学习(有标签数据)与无监督学习(无标签数据,探索结构)的根本不同,并通过文档主题发现的例子进行了说明。这些概念是理解后续更复杂算法的基础。

031:机器学习问题的结构

在本节课中,我们将学习如何构建一个机器学习问题。我们将通过一个文档分类的例子,了解从原始数据到模型构建的完整流程,并深入探讨构成机器学习问题的三个核心组件。

文档表示:从文本到矩阵

上一节我们介绍了机器学习的基本概念,本节中我们来看看如何将实际问题转化为机器学习可以处理的形式。我们以文档分类为例。

假设我们有五个文档,每个文档由简单的短语表示。例如:

  • 文档1:Romeo and Juliet
  • 文档2:Juliet O happy dagger
  • 文档3:Romeo died by the dagger

经过一些文本处理(如分词和归一化),我们可以将每个独特的词(术语)视为数据的一列,每个文档视为矩阵中的一行。在每个单元格中,我们填入该术语在对应文档中出现的次数。这种表示方法被称为词袋模型文档-术语矩阵

用代码可以表示为:

# 一个简化的文档-术语矩阵示例
doc_term_matrix = [
    [1, 1, 1, 0, 0, 0], # 文档1:Romeo, and, Juliet
    [0, 0, 1, 1, 1, 1], # 文档2:Juliet, O, happy, dagger
    [1, 0, 0, 0, 0, 1]  # 文档3:Romeo, died, by, the, dagger
]
# 列对应术语:[‘Romeo‘, ‘and‘, ‘Juliet‘, ‘O‘, ‘happy‘, ‘dagger‘]

监督学习与无监督学习

基于这个基本设置,我们可以考虑两种不同的学习范式。

监督学习版本:我们有一个文档语料库,并且人类已经为语料库中的每个文档分配了一个标签(例如,“悲剧”、“喜剧”)。目标是构建一个模型,能够根据文档中的文本来预测这个标签。

无监督学习版本:没有给出任何标签。我们的目标是发现相似的文档组,即进行聚类。例如,我们可能不知道某些文档都是关于“体育”的,但算法可以发现它们具有某些共同特征。

机器学习的三要素

在所有这些情况下,思考问题都需要三个核心组件,这源自Pedro Domingos的经典文章。它们是:表示评估优化。每个你遇到的机器学习问题都需要对这三个方面做出决策。

1. 表示

表示指的是你的分类器或模型的具体形式。它定义了所有可能假设的集合。

以下是几种常见的表示形式:

  • 规则:例如在高尔夫例子中,“如果是晴天,我们就打高尔夫”。所有此类可能规则的集合就是一种表示。
  • 神经网络:所有可能将输入映射到输出的神经网络结构的集合。
  • 决策树:所有可能的分支判断树结构的集合。
  • 线性分类器:对于数值数据,例如在二维散点图中,所有可能将正负样本分开的直线的集合。

简而言之,表示就是模型的“螺母和螺栓”,是你用来构建解决方案的基本单元。

2. 评估

一旦确定了表示形式,就需要判断这个表示形式下的某个具体实例(即一个具体的模型)是好是坏。我们需要选择一个评估方法来衡量模型的有效性。

根据问题类型,可以选择不同的评估指标:

  • 分类问题:在给定测试集上的错误数量、精确率、召回率等。
  • 回归问题:绝对误差、平方误差、方差等。

评估方法为我们提供了一把尺子,用来度量模型性能。

3. 优化

优化是指如何在这个可能非常庞大甚至是无限的可能假设空间中进行搜索,以找到评估指标下最好的那个模型。在绝大多数情况下,枚举所有可能的模型实例并应用评估技术来找到最佳者是不可行的。

因此,我们需要一种高效搜索这个空间的方法。优化算法(如梯度下降、遗传算法、贪心算法等)就是用来解决这个问题的工具。

理解机器学习方法

这种三分法有助于理解你在机器学习文献中遇到的各种术语和方法。很多时候,你看到的内容可能只是:

  • 一种优化技术,它可以应用于多种不同的表示和评估方法。
  • 一种表示形式,它适用于多种不同的优化策略。
  • 或者是一个完整的方案,它同时规定了表示、评估和优化的特定选择。

在我们讨论具体方法时,会尝试回溯到这三个组件,并描述在每种情况下发生了什么。


本节课中我们一起学习了如何构建一个机器学习问题。我们从文档表示的例子出发,区分了监督学习和无监督学习的不同场景。最重要的是,我们深入剖析了构成任何机器学习方法的三个核心要素:表示(模型的形式)、评估(衡量模型好坏的标准)和优化(寻找最佳模型的方法)。理解这三个组件,将帮助你更有条理地理解和设计机器学习解决方案。

032:使用简单规则进行分类 🧠

在本节课中,我们将学习如何使用简单规则进行分类。我们将以泰坦尼克号乘客数据集为例,探讨如何通过数据探索和构建基础分类器来预测乘客是否幸存。


首先,我们考虑一些具体的算法技术。为了说明这些技术,我们将使用泰坦尼克号乘客数据集。该数据集可在网络上获取,并已用于多种目的,同时它也是Kaggle平台上的一个竞赛项目,常被用作入门训练。

该数据集为每位乘客(或训练集中的子集)提供了一条记录,包含描述乘客的各种属性以及他们是否在沉船事件中幸存。数据列包括:

  • Survived:幸存状态,0表示未幸存,1表示幸存。
  • Pclass:船舱等级(如头等舱、二等舱、三等舱)。
  • Sex:性别。
  • Age:年龄。
  • SibSp:在船上的兄弟姐妹数量。
  • Parch:在船上的父母与子女数量。
  • Fare:支付的票价(美元)。
  • Cabin:客舱号(存在大量缺失值)。
  • Embarked:登船港口代码。

处理此类问题时,第一步通常是检查数据。如果数据能传达信息,我们不应忽视它。更重要的是,如果数据没有传达明显信息,这可能意味着自动学习模式会比较困难。

一种方法是开始绘制这些不同列的散点图。例如,你可能会想到“妇女和儿童优先”的原则,猜测儿童更可能幸存。因此,可以绘制年龄与票价的散点图。在下图中,蓝色点代表幸存,红色点代表未幸存。可以看到,在非常年幼的儿童周围似乎有一些蓝色点聚集,但除此之外,并没有非常明显的模式。

另一种方法是绘制年龄与性别的散点图。这里使用了一个技巧:将分类数据(如性别)作为数值属性绘制,这是一个相当有用的方法。为了避免所有值完全重叠(例如所有男性都在同一X坐标上),我们添加了一点“抖动”,这样就能看出每个位置上有多少红点和蓝点。从这个图中可以观察到,“妇女和儿童优先”的原则似乎确实成立,女性区域(右侧)的蓝点明显多于红点,但年龄本身提供的信息并不十分明确。


接下来,我们看看如何构建分类器。一个非常朴素的分类器,作为起点示例,是所谓的“死记硬背分类器”。其逻辑是:当看到一条新记录时,在训练集中寻找一个在所有属性上都完全匹配的现有示例。如果找到完全相同的记录,就将其归为已知的类别。如果没找到,则只能猜测。这个分类器并不特别实用。

对此的一个微小改进是遵循以下规则:给定一个我们从未见过的新乘客记录,检查它是否在某个特定属性上与现有示例匹配。如果匹配,则在具有相同属性值的所有乘客中进行投票,根据多数人的结果来决定新乘客的类别。

例如,看到一位新乘客是女性,就回顾所有其他女性乘客的记录。如果幸存女性多于未幸存女性,就判定这位新乘客也幸存了。然而,像这样的规则有很多,每个属性的每个值都可以形成一条规则。特别是,一个属性可能不止两个值(如男/女)。因此,我们需要某种方法在这些规则中进行选择。


本节课中,我们一起学习了如何通过探索泰坦尼克号数据集来理解数据模式,并介绍了两种基础的简单规则分类器:完全匹配的“死记硬背分类器”和基于单一属性多数投票的改进分类器。这些方法虽然简单,但为理解更复杂的分类算法奠定了基础。

033:学习规则

在本节课中,我们将学习如何从数据中构建和评估简单的预测规则。我们将介绍假设的表示方法、使用混淆矩阵和准确率进行评估,并探讨一种名为“单一规则”的搜索算法来寻找最佳规则。

假设的表示

上一节我们介绍了数据科学的基本概念,本节中我们来看看如何将预测模型表示为规则。

假设的表示基于规则。每条规则本身就是一个假设。例如,一条规则可以是:“如果性别为女性,则预测为幸存;否则预测为未幸存。”

规则的评估

了解了如何表示规则后,我们需要知道如何判断哪些规则是好的。这涉及到对规则的评估。

一种评估方法是构建一个混淆矩阵。混淆矩阵是一个行数和列数相等的方阵,每一行和每一列对应一个唯一的类别标签。矩阵的对角线元素表示预测正确的样本数量。

以下是使用规则“如果性别为女性,则预测为幸存;否则预测为未幸存”时得到的混淆矩阵示例:

  • 预测为“未幸存”且实际为“未幸存”的样本有 468 个。
  • 预测为“幸存”且实际为“幸存”的样本有 233 个。
  • 预测为“幸存”但实际为“未幸存”的样本有 109 个。
  • 预测为“未幸存”但实际为“幸存”的样本有 81 个。

混淆矩阵有助于直观检查,但为了自动构建程序,我们通常需要一个单一数值指标。这个指标就是准确率

准确率的计算公式为:
准确率 = (正确预测的样本数) / (规则覆盖的总样本数)

对于上述规则:
准确率 = (468 + 233) / (468 + 233 + 109 + 81) ≈ 0.79 或 79%

这意味着该规则在约79%的情况下是正确的,错误率为21%。对于一个如此简单的模型来说,这个结果并不差。

探索更复杂的规则

为了尝试改进模型,我们可以观察其他属性。例如,观察乘客的舱位等级(一等舱、二等舱、三等舱)。

从数据模式中,我们可以发现:

  • 一等舱乘客的幸存率似乎更高。
  • 二等舱中,儿童的幸存率似乎高于成人。

这提示我们可以构建更复杂的规则。但作为对比,这里有一个仅基于舱位的简单规则示例:“如果是一等舱或二等舱,则预测为幸存;如果是三等舱,则预测为未幸存。”

使用这条规则计算出的准确率约为67%,比基于性别的规则要差一些。

规则的搜索策略

我们已经掌握了规则的表示和评估方法,但如何从所有可能的规则中找到最好的那一个呢?这就需要搜索策略。

对于“单一规则”模型,一种可行的搜索策略是穷举枚举。其核心思想是:针对数据集中的每一个属性,以及该属性的每一个可能取值,生成一条对应的规则,然后评估所有规则,选择整体错误率最低的那一组。

以下是“单一规则”算法的步骤:

  1. 遍历每个属性:对于数据集中的每一个属性 A
  2. 遍历每个属性值:对于属性 A 的每一个可能取值 V
  3. 生成规则:创建规则 “如果 A 等于 V,则预测类别为 C”。其中,类别 C 是在满足 A=V 条件的样本中出现最频繁的类别。
  4. 计算错误率:评估这条规则在训练数据上的错误率。
  5. 选择最佳属性:比较所有属性对应的规则集的整体错误率,选择错误率最低的那个属性。由该属性所有取值构成的规则集合,就是最终的“单一规则”模型。

请注意,“单一规则”指的是一组基于同一个属性不同取值的规则集合(例如,针对“性别”属性的“男”和“女”两个值生成的规则),而不是多条独立的规则。

总结

本节课中我们一起学习了如何构建和评估用于预测的简单规则。我们首先将假设表示为“如果-则”形式的规则,然后使用混淆矩阵和准确率来量化规则的性能。最后,我们介绍了一种名为“单一规则”的穷举搜索算法,该方法通过系统地评估每个属性来寻找最佳的单一规则集。这种方法虽然简单,但为理解更复杂的机器学习模型奠定了基础。

034:规则学习与顺序覆盖算法

在本节课中,我们将学习如何构建一个基于规则的分类器。具体来说,我们将探讨一种名为“顺序覆盖”的算法,它能够从数据中逐步学习出一组规则,用于预测目标类别。

从单条规则到规则集

上一节我们介绍了如何使用简单的“如果-那么”规则进行分类。然而,单条规则通常不足以捕捉数据中的所有模式。

那么,我们能走多远呢?你可以想象拥有包含更多条件的更复杂规则。你也可以想象拥有一整套规则。此时,你的分类任务就变成了检查这一整套规则,以确定最终的类别。

构建规则集:顺序覆盖算法

那么,我们如何构建一个合适的规则集来创建一个分类器呢?一种方法是使用顺序覆盖算法,其流程如下。

以下是顺序覆盖算法的主要步骤:

  1. 从数据集 D 开始。
  2. 将规则集 R 初始化为空集。
  3. 对于每个目标类别(例如“幸存”或“未幸存”),重复以下过程:
    • 构建一条能正确分类 D 中部分实例的规则(例如,捕捉到一些幸存者),并且不会错误分类任何其他类别的实例。
    • 将这条规则添加到规则集 R 中。
    • 从数据集 D 中移除所有被这条规则正确分类的实例。
  4. 继续以这种方式添加规则,直到处理完所有类别或满足停止条件。

这个方法很好,但它没有告诉你如何实际找到下一条规则。这正是接下来要解释的核心。

如何寻找单条规则:规则生长

顺序覆盖算法的关键在于“规则生长”过程,用于生成每一条具体的规则。

以下是规则生长的具体步骤:

  1. 初始化一条规则 r,其前件(条件部分)为空,直接为所有记录分配目标类别值 c(例如,默认预测为“幸存”)。
    • 初始规则:IF ( ) THEN class = c
  2. 当规则 r 仍然错误分类 D 中的一些非 c 类实例时,执行以下循环:
    • 对于每个尚未在规则中的属性-值对 (a = v),计算仅添加此条件后新规则的准确率。
      • 例如,考虑条件“性别 = 女”,计算规则 IF (性别=女) THEN 幸存 在数据集 D 上的准确率。
    • 选择能带来最高准确率的属性-值对 (a = v*)*。如果出现平局,则选择覆盖更多实例的那个。
    • 用这个新条件更新规则 rr = r ∧ (a* = v*)(即在现有条件上增加一个“且”关系)。
    • 将属性 a* 从后续考虑的属性集合 A 中移除,避免重复使用同一属性。
  3. 当规则不再错误分类任何非 c 类实例,或无法再添加有益条件时,规则生长停止。

这个过程的核心是,你从一个空条件开始,然后贪婪地、一次一个地添加能最大程度提升规则准确率的条件,直到规则变得“纯净”或足够好。

算法流程图示

上图展示了顺序覆盖算法的整体流程:从数据集中学习一条规则,覆盖并移除相关实例,然后在剩余数据上重复此过程。

上图展示了单条规则的生长过程:通过逐步添加最佳属性-值对来构建规则的前件(条件部分)。

总结

本节课中,我们一起学习了基于规则的分类方法。我们首先了解了从单条规则扩展到规则集的概念。然后,重点介绍了顺序覆盖算法,它通过迭代地“学习规则-移除已覆盖数据”来构建整个规则集。最后,我们深入探讨了算法的核心——规则生长过程,该过程以贪心策略逐步添加条件,以构建出准确且纯净的单条规则。这种方法提供了一种直观、可解释的方式来从数据中学习分类模式。

035:规则回顾 📚

在本节课中,我们将回顾基于规则的学习方法。我们将探讨如何构建规则、两种主要的规则生成策略(从一般到具体和从具体到一般),以及当多个规则被触发时如何解决冲突。最后,我们将总结基于规则方法的核心概念、评估策略和优化过程。


规则构建策略 🔍

上一节我们介绍了规则的基本概念,本节中我们来看看构建规则的两种主要策略。

第一种策略是从一般到具体。我们从一个空规则开始,逐步添加约束条件,直到规则开始错误地分类一些负例为止。这个过程旨在通过添加约束来消除负例,最终只留下正例。

第二种策略是从具体到一般。我们从一个特定的数据实例开始,构建一个能精确描述该实例的规则,即该规则包含该实例的每一个属性约束。然后,我们逐一移除条件,以尝试覆盖更多的正例,并在规则开始覆盖某些负例时停止。

以下是两种策略的简要对比:

  • 从一般到具体:起点是空规则,通过添加约束来“收紧”规则。
  • 从具体到一般:起点是描述单个实例的完整规则,通过移除约束来“放宽”规则。

规则冲突解决 ⚖️

一旦我们拥有了这组规则,就需要使用它们进行预测。一个可能出现的情况是,对于某个特定的数据点,可能有多个规则被触发。

因此,我们需要某种方式来解决冲突。例如,可以选择最具体的规则,或者选择最一般的规则。也可以应用一些领域知识来为每条规则分配优先级,并以此来解决平局情况。


方法总结与回顾 📝

本节我们一起学习了基于规则方法的简要介绍。

  • 表示方法:核心表示是一组 if-then 规则,这些规则包含数量不等的条件。
  • 评估策略:评估一个规则的好坏,需要计算其覆盖率,并通过正确预测数 / 覆盖率来衡量其准确率。
  • 优化与搜索策略:搜索策略是通过逐步寻找能最大化准确率的条件来构建规则。你可以选择从一般到具体,也可以选择从具体到一般。我们尚未深入讨论这些选择之间的各种权衡。

基于规则方法的一个关键启示(除了为下一部分内容做铺垫外)是:单个或少数几条规则非常直观且易于解释;而一大组规则的总体特性可能并不那么显而易见。


本节课中,我们一起回顾了基于规则的学习方法,涵盖了其构建策略、冲突解决机制以及核心的方法论框架。

036:从规则到决策树 🌳

在本节课中,我们将学习如何将复杂的规则集转化为更易于理解和管理的决策树结构。我们将探讨规则与树之间的转换关系,并通过实例理解决策树的基本工作原理。

规则集的局限性

上一节我们介绍了使用规则集进行预测的方法。然而,一个庞大而扁平的规则列表会变得非常复杂,可能难以解释。

引入决策树结构

为了解决上述问题,我们可以考虑对冗余的条件进行分组。这开始类似于用任何编程语言编写的程序:使用 if...then... 语句进行嵌套判断。

例如:

if (passenger_class == first) {
    if (sex == female) {
        survive = yes;
    } else if (sex == male && age < 5) {
        survive = yes;
    }
} else if (passenger_class == second) {
    // 另一组嵌套条件
}

这种嵌套的条件结构开始呈现出的形状,也就是我们接下来要讨论的决策树

决策树的工作原理

从图示上看,决策树的工作流程如下:每个样本(如乘客)从树根开始,根据其属性在树的每个节点做出判断,决定下一步的路径,最终到达一个特定的“叶子”节点,即分类结果。

可以想象,选择哪个属性作为树的顶层节点(根节点),将生成许多不同种类的树,并且它们会具有不同的性质。

规则与决策树的关系

决策树与规则集之间的关系在于:从根节点到任意叶子节点的每一条路径都代表一条规则

因此,将一棵决策树转化为一组规则是相当简单的,因为只需枚举从根到每个叶子的所有路径即可。每条路径对应一条规则。

然而,反向操作——将一组规则转化为一棵决策树——则不一定简单直接。因为规则中可能存在冗余的条件,需要决定如何处理这些冗余以构建出高效的树结构。

另一个示例:文档分类

让我们切换到一个文档分类的示例,以加深理解。在这个案例中,同样可以构建决策树。

例如,可以设定这样的判断:

  • 如果文档包含词语 “Sunday”,则进入一个分支;否则进入另一个分支。
  • 在包含 “Sunday” 的分支下,如果还包含词语 “Saints”,则可能将其归类为体育主题。
  • 在另一个分支下,如果包含词语 “Sun” 和 “Mars”,则可能将其归类为科学主题。

不过,将“是否包含Sunday”这个条件放在树的顶层可能并不是最有帮助的选择。我们将在后续课程中使这个选择标准更加精确。

本节总结

本节课中,我们一起学习了如何从复杂的规则集过渡到决策树结构。我们了解到决策树通过树形结构组织判断条件,使模型更直观。每条从根到叶的路径对应一条规则,但将规则集反向构建为树需要考虑冗余问题。最后,我们通过文档分类的例子初步感受了决策树的应用。在接下来的课程中,我们将深入探讨如何构建一个“好”的决策树。

037:熵与信息增益

在本节课中,我们将学习决策树算法中的一个核心概念——熵。熵用于衡量一个数据集合的“不纯度”或“不确定性”。我们将了解熵的数学定义,以及它如何帮助我们判断决策树中某个节点是否有助于进行分类。

上一节我们介绍了决策树的基本概念,本节中我们来看看如何量化一个节点划分数据的好坏。

熵的定义与直觉

为了判断决策树中的一个节点是否有用,我们需要熵这个概念。考虑两个不同的抛硬币序列。我们想知道每次抛硬币后获得了多少信息。

讨论两个不同序列的原因,是我们希望建立这两个独立事件信息量之间的关系。我们希望信息函数满足以下性质:如果两个事件是独立的(例如公平硬币的两次抛掷),那么这两个事件同时发生所获得的总信息量,应等于各自事件信息量之和。

用数学公式表示,如果事件A和B独立,其概率分别为 P(A)P(B),那么:

信息(P(A) * P(B)) = 信息(P(A)) + 信息(P(B))

满足此性质的函数是对数函数,具体是以2为底的对数。因此,单个事件的信息量定义为:

信息(p) = -log₂(p)

(注:概率p小于1,其对数log₂(p)为负值。为了使信息量为正数,我们加上负号。)

从信息到熵

信息衡量的是单个事件发生带来的“惊喜度”。而衡量的是一系列事件整体的平均不确定性或不可预测性

熵是信息的期望值。在概率论中,期望值总是将每个事件的概率乘以其对应的值(这里是信息量),然后求和。

因此,对于一个具有n种可能结果(例如分类标签)的数据集,其熵H的计算公式为:

H = - Σ (pᵢ * log₂(pᵢ))

其中,pᵢ 是第i类在数据集中出现的概率,求和遍及所有类别。

以下是理解该公式的关键点:

  • 概率 pᵢ:数据集中属于第i类的样本比例。
  • 信息量 -log₂(pᵢ):一个样本被分类为第i类所带来的信息量。
  • 期望值:熵 H 是所有类别信息量的加权平均(以概率为权重)。

熵的特性

熵的值具有明确的含义:

  • 熵为0:表示数据集是“纯”的,所有样本都属于同一类别。此时不确定性最低。
  • 熵最大(对于二分类问题,最大值为1):表示数据集中两类样本均匀分布(各占50%),此时不确定性最高。

在决策树构建中,我们的目标就是通过选择特征进行划分,使得子节点的熵尽可能降低,即让数据变得更“纯”。

本节课中我们一起学习了熵的概念。熵是信息论的基础,它量化了数据集的不确定性。其计算公式 H = - Σ (pᵢ * log₂(pᵢ)) 是决策树算法(以及许多其他机器学习算法)中衡量信息增益的核心工具。理解熵如何反映数据的纯度,是理解决策树如何做出划分决策的关键。下一节,我们将学习如何利用熵来计算“信息增益”,从而选择最佳的划分特征。

038:测量熵 📊

在本节课中,我们将要学习信息论中的一个核心概念——熵。熵用于量化一个随机变量的不确定性或信息量。我们将通过几个简单的例子来理解熵的计算方法,并探讨如何将熵的概念应用于数据集,特别是决策树构建中的属性选择。


熵的定义与公式

上一节我们介绍了信息量的概念,本节中我们来看看如何用熵来度量一个随机变量的整体不确定性。熵的公式如下:

公式:
[
H(X) = -\sum_{i=1}^{n} P(x_i) \log_2 P(x_i)
]

在这个公式中:

  • ( H(X) ) 表示随机变量 ( X ) 的熵。
  • ( P(x_i) ) 表示结果 ( x_i ) 发生的概率。
  • ( \log_2 ) 是以2为底的对数,这使得熵的单位是“比特”。

这个公式计算了所有可能结果的信息量的期望值(加权平均)。


熵的计算示例

以下是几个通过具体例子计算熵的过程,帮助我们直观理解其含义。

抛掷一枚公平硬币

假设我们抛掷一枚公平的硬币。它有两种等可能的结果:正面或反面。

计算过程:
[
H(X) = -[0.5 \times \log_2(0.5) + 0.5 \times \log_2(0.5)] = 1
]

计算结果为1比特。这很合理,因为抛一次公平的硬币恰好能提供1比特的信息,它告诉我们一个“是”或“否”的答案。

投掷一个公平的骰子

现在考虑投掷一个公平的六面骰子。每个面出现的概率都是 ( \frac{1}{6} )。

计算过程:
[
H(X) = -6 \times [\frac{1}{6} \times \log_2(\frac{1}{6})] \approx 2.58
]

计算结果约为2.58比特。这个值比抛硬币的熵值高,说明投骰子的结果更难以预测,这与我们的直觉一致。

投掷一个有偏的骰子

最后,考虑一个有偏的骰子:点数1到5出现的概率各为10%,而点数6出现的概率为50%。

计算过程:
[
H(X) = -[5 \times (0.1 \times \log_2(0.1)) + (0.5 \times \log_2(0.5))] \approx 2.16
]

计算结果约为2.16比特。这个值低于公平骰子的熵值,说明这个有偏骰子的结果更容易预测(因为我们可以倾向于猜测结果是6),这同样符合我们的直觉。


将熵应用于数据集

我们如何将熵的概念应用于一个具体的数据集,而不是抽象的随机变量呢?一个常见的方法是针对数据集中的类别标签计算熵。

以泰坦尼克号数据集为例,该数据集有891名乘客。

情况一:生存者比例接近一半

  • 假设有342名乘客幸存。
  • 幸存概率 ( P(幸存) = 342/891 \approx 0.384 )
  • 未幸存概率 ( P(未幸存) = 549/891 \approx 0.616 )
  • 计算熵:( H \approx 0.96 ) 比特

这个值接近1比特,意味着通过了解一个人的生存状态,我们能获得接近1比特的信息。这很合理,因为幸存与未幸存的比例并非极度不平衡。

情况二:生存者比例很低

  • 假设只有50名乘客幸存。
  • 幸存概率 ( P(幸存) = 50/891 \approx 0.056 )
  • 未幸存概率 ( P(未幸存) = 841/891 \approx 0.944 )
  • 计算熵:( H \approx 0.31 ) 比特

这个熵值低得多,说明数据集本身更具可预测性(大多数人没有幸存),因此知道结果所提供的信息量也更少。


熵在决策树中的应用

回到决策树的构建问题。在每一层,我们需要选择一个属性来分割数据。

我们应该选择哪个属性呢?答案是选择能带来最大信息增益的属性。信息增益可以用熵来计算。另一种理解方式是:选择那个能最大程度减少不确定性的属性。

下一节中,我们将具体学习如何计算信息增益,并利用它来构建更有效的决策树。


总结

本节课中我们一起学习了熵的概念与计算。我们了解到:

  1. 熵是度量随机变量不确定性的数学工具。
  2. 通过抛硬币、掷骰子等例子,我们看到结果越等可能,熵值越高,不确定性越大。
  3. 我们可以针对数据集的类别标签计算熵,以衡量其内在的可预测性。
  4. 在决策树算法中,熵是计算信息增益的基础,而信息增益则指导我们选择最佳的分割属性。

039:使用信息增益构建决策树

在本节课中,我们将学习决策树构建的核心步骤:如何计算信息增益,并利用它来选择最佳的属性作为树的分支节点。我们将通过一个预测是否打高尔夫球的简单例子,来一步步演示这个过程。

概述

决策树是一种通过一系列规则对数据进行分类的模型。构建树的关键在于,每一步都选择能带来最大“信息增益”的属性进行划分。信息增益衡量的是,根据某个属性划分数据后,数据“不确定性”的减少程度。不确定性通常用“熵”来量化。

上一节我们介绍了熵的概念,本节中我们来看看如何具体计算信息增益并用于决策树构建。

计算初始熵

在开始构建决策树之前,我们有一个包含14条记录的数据集。其中9条记录标记为“是”(打高尔夫),5条标记为“否”(不打高尔夫)。

我们可以计算这个数据集的初始熵,它代表了当前数据的不确定性。熵的计算公式为:

Entropy(S) = -p_yes * log₂(p_yes) - p_no * log₂(p_no)

其中,p_yes 是“是”类别的比例,p_no 是“否”类别的比例。

代入我们的数据:

  • p_yes = 9/14 ≈ 0.643
  • p_no = 5/14 ≈ 0.357

计算得到初始熵约为 0.94

计算各属性的信息增益

接下来,我们需要评估每个属性(如天气、温度、湿度、风力)作为划分标准能带来多少信息增益。信息增益的计算公式为:

Gain(S, A) = Entropy(S) - Σ (|S_v| / |S|) * Entropy(S_v)

其中,A 是待评估的属性,S_v 是属性 A 取值为 v 的子集。

以下是针对每个属性的计算过程:

1. 天气 (Outlook)

如果选择“天气”属性,数据会根据其取值(晴朗、多云、下雨)被分成三个子集。

  • 多云 (Overcast):4条记录,全部为“是”。该子集的熵为 0(完全确定)。
  • 下雨 (Rainy):5条记录(3个“是”,2个“否”)。计算熵约为 0.97
  • 晴朗 (Sunny):5条记录(2个“是”,3个“否”)。计算熵同样约为 0.97

现在计算选择“天气”属性后的期望新熵:
期望新熵 = (4/14)0 + (5/14)0.97 + (5/14)*0.97 ≈ 0.69

因此,选择“天气”带来的信息增益为:
信息增益(天气) = 初始熵(0.94) - 期望新熵(0.69) = 0.25

2. 温度 (Temperature)

如果选择“温度”属性,数据会根据其取值(凉爽、适中、炎热)被分成三个子集。

以下是各子集的计算结果:

  • 凉爽 (Cool):4条记录(3个“是”,1个“否”),熵约为 0.81
  • 炎热 (Hot):4条记录(2个“是”,2个“否”),熵为 1(完全不确定)。
  • 适中 (Mild):6条记录(4个“是”,2个“否”),熵约为 0.92

计算期望新熵:
期望新熵 = (4/14)0.81 + (4/14)1 + (6/14)*0.92 ≈ 0.91

因此,选择“温度”带来的信息增益为:
信息增益(温度) = 0.94 - 0.91 = 0.03

3. 湿度 (Humidity)

如果选择“湿度”属性,数据会根据其取值(正常、高)被分成两个子集。

以下是各子集的计算结果:

  • 正常 (Normal):7条记录(6个“是”,1个“否”),熵约为 0.59
  • 高 (High):7条记录(2个“是”,5个“否”),熵约为 0.86

计算期望新熵:
期望新熵 = (7/14)0.59 + (7/14)0.86 = 0.725

因此,选择“湿度”带来的信息增益为:
信息增益(湿度) = 0.94 - 0.725 = 0.215

4. 风力 (Windy)

如果选择“风力”属性,数据会根据其取值(有风、无风)被分成两个子集。

以下是各子集的计算结果:

  • 有风 (True):8条记录(6个“是”,2个“否”),熵约为 0.81
  • 无风 (False):6条记录(3个“是”,3个“否”),熵为 1

计算期望新熵:
期望新熵 = (8/14)0.81 + (6/14)1 ≈ 0.87

因此,选择“风力”带来的信息增益为:
信息增益(风力) = 0.94 - 0.87 = 0.07

选择最佳属性

比较所有属性的信息增益:

  • 信息增益(天气) = 0.25
  • 信息增益(湿度) = 0.215
  • 信息增益(风力) = 0.07
  • 信息增益(温度) = 0.03

“天气”属性具有最高的信息增益。因此,在构建决策树时,我们应该首先选择“天气”作为根节点进行划分。这很直观:一个能直接告诉你确切结果的属性(如“多云”时总是打高尔夫)包含的信息量最大,应该放在树的顶部。

核心思想与类比

这个原理可以推广到其他分类问题。例如,在区分“体育”和“科学”文章时:

  • 如果根据“是否包含‘猎鹰’(Falcons)”划分,可能两边都混有体育和科学文章,信息增益较低。
  • 如果根据“是否包含‘火星’(Mars)”划分,包含“火星”的文章极大概率属于科学类,这个属性能带来很高的信息增益,因此应该优先被选择。

信息增益指导我们选择最具区分度的属性,将其放在决策树的高层,从而用最少的步骤最有效地对数据进行分类。

总结

本节课中我们一起学习了决策树构建的核心机制。我们首先计算了数据集的初始熵以衡量其不确定性。然后,我们逐步计算了每个候选属性划分数据后带来的信息增益。通过比较这些增益值,我们选择了增益最大的“天气”属性作为决策树的根节点。这个过程确保了决策树能够以最高效的方式,即用最少的判断步骤,来学习数据中的分类规则。

040:ID3算法详解

在本节课中,我们将学习一种经典的决策树构建算法——ID3算法。我们将了解其工作原理、步骤、优缺点,以及如何将其应用于数据集。

算法概述

ID3算法是一种用于构建决策树的经典算法。它适用于所有属性都是离散值的数据集。对于连续属性,可以通过将其划分到特定区间(分箱)来进行离散化处理。我们将在后续幻灯片中介绍具体方法。

算法步骤

以下是ID3算法的核心步骤:

  1. 选择最佳属性:计算所有属性的信息增益,并选择信息增益最高的属性作为当前节点的分裂属性。
  2. 创建分支:为所选属性的每一个可能取值创建一个分支。
  3. 划分数据:根据所选属性的值,将当前节点的数据集划分到对应的子分支中。
  4. 递归构建:对于每个子分支,在剩余属性集合和划分后的子数据集上,重复上述步骤,递归地构建子树。

停止条件

递归过程在满足以下任一条件时停止:

  • 某个分支下没有剩余的样本数据。
  • 某个分支下的所有样本都具有相同的类别标签,此时无需再做进一步决策。

通过这种方式,您可以将此算法应用于您的数据集,逐步构建出一棵决策树。

算法实现与复杂度

正如您所见,实现这个算法并不太困难。如果您不熟悉信息增益的概念,这可能是最具技巧性的部分,但我们已经详细讲解过。除此之外,编写一个执行此算法的程序是可以想象的。虽然构建这个数据结构需要一些簿记工作,但整体并不复杂。

算法的局限性

然而,ID3算法也存在一些问题:

  • 训练成本高:在做出每个决策时,都需要反复检查数据集的很大一部分,导致训练过程计算开销较大。
  • 容易过拟合:我们尚未深入探讨过拟合,但一般而言,过拟合意味着模型在训练数据上表现非常好,但在测试数据上表现很差,即模型泛化能力弱。您可以想象,决策树可能变得非常擅长对训练集做出精确决策,但当遇到一个从未见过的新样本时,可能会将其放入一个不一定正确的分类桶中。

应对策略

针对过拟合问题,有一些解决方法:

  • 剪枝:可以尝试剪掉那些对特定条件过度专门化的树分支,即移除或合并那些不能提供太多判别能力的子树。

在下一节中,我们将讨论另一种非常强大的方法来解决这些问题。

041:C4.5算法

在本节课中,我们将学习如何处理决策树中的连续属性。具体来说,我们将探讨如何将像湿度百分比这样的连续数值,有效地分割成离散的区间,以便在决策树中进行分支决策,同时避免过度拟合。

上一节我们介绍了信息增益和熵的基本概念,本节中我们来看看当属性是连续值时,如何应用这些概念。

处理连续属性

决策树算法(如ID3)最初是为分类属性设计的。然而,现实数据中经常包含连续属性(如温度、湿度)。直接按每个唯一值分割会产生过多分支,导致模型过度拟合且无法泛化。

因此,我们需要一种方法,将连续值“分桶”成有限的、有意义的离散区间。我们不希望依赖领域知识手动设定阈值,而是寻求一种自动化的、基于数据的算法方法。

C4.5算法的分割策略

C4.5算法采用了一种系统的方法。其核心思想是:将连续属性排序后,每一个可能的分割点都代表一个将数据划分为“高”和“低”两个部分的候选方案。算法会评估所有这些候选分割点,并选择能带来最高信息增益的那个点。

以下是该过程的具体步骤:

  1. 排序:首先,根据该连续属性的值,将数据集中的所有实例从小到大排序。
  2. 生成候选分割点:每两个相邻的不同值之间,都可以作为一个潜在的分割点。例如,在湿度值序列中,每个值都代表一个“低于或等于此值”与“高于此值”的分界点。
  3. 评估信息增益:对于每一个候选分割点,计算将数据按此点分为两部分后的信息增益。
  4. 选择最佳分割:选择能带来最大信息增益的那个分割点。这个点就将连续属性转换成了一个二元离散属性(例如,“湿度 ≤ 75%” 和 “湿度 > 75%”)。

实例分析:湿度数据分割

假设我们的天气数据集中的“湿度”不再是“正常/高”的标签,而是具体的百分比数值。我们已将其排序。

通过观察,我们可能会发现一些有潜力的分割点。例如,在某个点之前,所有实例的“是否玩耍”结果都是“是”,这意味着该分支的熵为0,具有完美的可预测性。

为了量化比较,我们需要计算每个候选点的信息增益。信息增益的计算公式基于熵:

Entropy(S) = - Σ (p_i * log₂(p_i))

其中 p_i 是集合 S 中第 i 类所占的比例。

然后,对于按分割点 t 划分后的数据,其期望熵为:

Gain(S, A_t) = Entropy(S) - [ (|S_left|/|S|) * Entropy(S_left) + (|S_right|/|S|) * Entropy(S_right) ]

其中 A_t 表示在点 t 分割的属性,S_leftS_right 是分割后的两个子集。

通过计算比较,我们可以确定信息增益最高的分割点。在实际操作中,由于属性值排序后,信息增益只会在类别标签发生变化的地方产生显著变化,这本身也提供了一种优化计算的方法。

扩展到多路分割

上述方法将连续属性转换为一个二元(是/否)决策。理论上,可以递归地应用此过程来创建多个桶,从而实现更高阶的分支(例如,低、中、高)。然而,在C4.5中,通常在一次分割中只产生两个分支,后续如果需要,可以在子节点上继续对同一属性进行分割。

本节课中我们一起学习了C4.5算法处理连续属性的核心方法。关键点在于:通过排序数据、评估所有可能二元分割的信息增益,并选择最佳者,我们可以将任何连续变量转化为可用于决策树分裂的离散形式。这种方法减少了建模时的人为参数设定,让数据本身驱动最佳分割点的选择。

042:规则和树回顾 🌳

在本节课中,我们将回顾监督学习中的分类问题,重点讨论从简单规则到决策树的演变过程。我们将探讨如何自动寻找规则、决策树的构建与解释,以及它们各自的优缺点。


上一节我们介绍了如何手动猜测简单规则来解释数据。然而,数据属性与类别标签之间的关系通常很复杂,直觉可能出错。因此,我们需要自动化地搜索这些规则。

我们首先讨论了单规则算法,它能够程序化地选择一个好规则。这种方法有效,但显然非常有限,因为它只能发现非常简单的关联关系。

为了处理更复杂的关系,我们接着介绍了顺序覆盖算法。该算法能够构建包含多个条件的规则集。

以下是顺序覆盖算法的核心思想:

  • 它从寻找一个能覆盖部分数据的规则开始。
  • 然后,它移除已被该规则覆盖的数据点。
  • 接着,它在剩余数据上重复此过程,寻找下一个规则。
  • 最终,它生成一组规则,共同描述整个数据集。

一组复杂的规则能更好地描述数据,因此作为分类器具有更强的能力。但它们也更难解释。本课程强调的一点是,模型和结果的可交流性非常重要。

单个规则易于理解。一组复杂规则则可能不那么直观。基于这个原因以及其他考虑,我们引入了决策树。


上一节我们提到了规则集,本节中我们来看看决策树。我们曾指出,决策树可以从一组规则构建而来。严格来说,从规则集构建决策树并非易事。但反过来则相对直接:正如我们所描述的,从根节点到叶节点的每一条路径就是一条规则。两者之间存在关联。

更重要的是,给定一个决策树,它非常易于解释。你只需取一个数据项,查看根节点并回答问题,例如“性别是男还是女?”,然后根据答案沿着相应分支前进。因此,很容易理解模型的工作原理。

决策树也易于理解哪些决策最重要,因为它们会“浮”到树的顶部。如果有人问你模型如何运作,或者为什么做出某个特定决策,你可以根据树的结构来回答这些问题。


我们讨论了如何在决策树的每一层选择属性来做出决策。我们引入了作为衡量“纯度”的指标。游戏的目标是试图让整个分支在类别标签上变得“纯净”,例如,该分支下的所有人都幸存了。

熵的公式为:
H(S) = - Σ pᵢ log₂(pᵢ)
其中 pᵢ 是集合 S 中第 i 类出现的概率。

信息增益帮助我们选择能最大程度减少不确定性的属性进行分割。


接着,我们讨论了对数值属性的几种扩展。对于像湿度或票价这样的数值,你不能为每个唯一值创建一个分支。相反,你需要以某种方式将它们分桶。

一个想法是找到一个分割点,将数据分成两部分:低于该值的走一个分支,高于该值的走另一个分支。我们讨论了如何找到这个最佳阈值。


目前我们认识到,决策树可能容易过拟合。这意味着树可能变得过于复杂,完美地拟合了训练数据中的噪声,从而导致在新数据上表现不佳。

在接下来的课程中,我们将探讨如何应对决策树的过拟合问题,以及提升模型泛化能力的方法。


本节课中我们一起学习了从简单规则到决策树的演进,理解了单规则算法和顺序覆盖算法的原理,掌握了决策树的构建、解释方法以及用于选择分割属性的熵与信息增益概念。我们还探讨了如何处理数值属性,并指出了决策树可能面临的过拟合挑战。

043:过拟合 👾

在本节课中,我们将要学习机器学习中的一个核心问题——过拟合。我们将了解它的定义、识别方法以及相关的概念,如偏差与方差。


这段摘录来自我们之前提到过的 Pedro Domingo 在 2012 年发表的 CacM 论文。

如果我们的知识和数据不足以完全确定正确的分类器,那么情况会如何?我们可能设计出一个分类器,它只是在响应数据中所谓的“随机噪声”,而不是揭示某种基本事实。这样的分类器在现实世界中没有任何预测能力,它仅仅描述了当前这个特定的数据集。这里的问题就是过拟合。他指出,过拟合是机器学习中许多问题的症结所在。


许多机器学习问题最终都归结为:我们如何避免过拟合?

因为你总是可以在一个特定的数据集上训练出一个模型。但如何避免模型过度“特化”于这个数据集,并确保它在现实世界中具有预测能力呢?这里需要警惕的情况是:你的学习器输出了一个分类器,它在训练数据上准确率达到 100%,但在测试数据上只有 50% 的准确率。而实际上,它本可以输出一个在两者上都能达到 75% 准确率的分类器。这就是过拟合。


我想强调,这是思考过拟合时最核心的定义:训练数据上的低误差,以及测试数据上的高误差

在讨论过拟合时,有时会联想到下面这个图像。我为少量数据点拟合了两个多项式,一个次数很高(我认为是10次),另一个次数较低(在这个例子中,实际上5次也算相当高了)。你可以看到几个现象:首先,红色曲线完全匹配了数据点。但其次,数据中呈现的趋势可能更适合用绿线来描述。实际上,这些数据是由一个模型生成的,该模型在一条曲线上添加了一些随机噪声。因此,绿线可能更真实地反映了生成数据的底层过程或模型。这里需要注意的另一点是:模型对数据扰动的敏感性。如果我稍微移动其中一个数据点,红色曲线可能会发生很大变化,而绿色曲线则变化不大。

但我认为这个曲线拟合的例子并不是思考过拟合的最佳图像,因为它在我脑海中有点特定于多项式曲线和自由度数量。至少对我来说,如何将这个图像映射到一般的机器学习问题上并不总是那么清晰。

我认为一个更有用的图像是下面这个,它实际上来自维基百科上关于过拟合的文章,采用知识共享许可发布。这个图像展示了随着时间(或训练过程)推移,你的误差变化情况:对于训练集和测试集,误差最初都会下降。但在某个点之后,训练集误差继续下降,而测试集误差却开始上升。图中用一个小符号标出了过拟合开始发生的点。我认为,当你思考过拟合问题时,应该调用这个图像:训练集误差和测试集误差之间的差异

在某些情况下,这很棘手,因为测试集可能并非你实际可以测量误差的数据,而更像是“在现实世界中的预测能力”。但无论如何,任何基于你未训练过的数据所估计出的误差,都是需要关注的指标。当这两个误差开始分道扬镳时,就意味着你过拟合了。

围绕这个概念,还有一些其他需要熟悉的术语。例如,模型是否能够泛化?如果模型能够泛化,那么你就没有过拟合。模型能否处理未见过的数据?或者它是否过度拟合了用于测试的数据?

为了解决这个问题,你需要使用保留数据进行测试。一种方法是,将用于建模的数据固定地划分为训练集和测试集。在训练集上训练模型,先在训练集上评估模型,然后在测试集上评估模型。这两者之间的差异再次衡量了模型的泛化能力,或者说衡量了其过拟合的程度。

然而,仅仅进行一次数据划分并不是最强大的机制。在接下来的几张幻灯片中,我会介绍一个更好的方法。

另一个在思考过拟合时可以联想到的图像同样来自 Peter Domingo 的论文,它区分了偏差方差。在欠拟合的情况下,你偏离了目标,没有很好地描述数据,但你可能具有低方差。在高偏差高方差的情况下,你完全偏离了目标,你的学习器没有产生任何有用的东西。而在过拟合的情况下,你可能具有非常低的偏差,但却有高方差。这里“高方差”的意思是:当你添加更多数据、扰动数据或在不同的数据集上评估时,你的模型性能(质量)表现如何?如果你在测试集上具有低偏差,但对数据很敏感(这就是高方差的来源),那么你就处于过拟合的场景。反之,如果你对数据不敏感(低方差),但偏差很高(总是得到错误的答案),那就是欠拟合。例如,在泰坦尼克号数据集上,如果一个模型总是预测“所有人都会死亡”,那么它对数据非常不敏感(低方差),但偏差很高(错误率很高)。而过拟合则是另一种情况:也许我在训练集上得到了完全正确的答案(极低的偏差),但只要我增加一个数据点,结果就会发生剧烈变化。这是思考过拟合时的另一组术语和概念。



总结

本节课中,我们一起学习了机器学习中的核心挑战——过拟合。我们明确了其定义:模型在训练数据上表现优异(低误差),但在未见过的测试数据上表现显著变差(高误差)。我们探讨了如何通过观察训练误差与测试误差的曲线来识别过拟合的发生点,并引入了偏差-方差权衡的概念来深入理解模型复杂度与泛化能力之间的关系。最后,我们提到了使用保留测试集是评估模型是否过拟合的基本方法。理解并避免过拟合,是构建具有实际预测能力的稳健模型的关键。

044:模型评估与留一法交叉验证

在本节课中,我们将要学习如何评估机器学习模型,并重点介绍一种重要的评估方法——留一法交叉验证。理解如何正确评估模型是避免过拟合、确保模型泛化能力的关键。

模型评估的重要性

上一节我们讨论了过拟合问题。但在此之前,我们需要先探讨如何评估一个模型并判断其好坏。我们在讨论规则和决策树时已经有所涉及,但本节将系统性地介绍你需要熟悉的主要术语。

或许从整个课程中需要掌握的最重要的一点是:必须将数据划分为训练集和测试集。在Kaggle等平台上,你通常会获得给定的训练集和测试集,但你应该将训练集再次进行划分。

训练集与测试集

以下是一个核心原则:在用于训练的数据上评估模型是毫无意义的。因为模型已经见过这些数据,评估结果自然会很好。这一点在如今看来似乎显而易见,但在80年代机器学习方法探索初期,人们并非立刻意识到这一点。当时需要一些时间,才能将统计学家的认知与机器学习群体探索的算法方法统一起来。

那么,如何正确评估呢?一种方法是直接预留一定比例的数据作为测试集,其余数据用于训练。

交叉验证方法

一种更积极的方法是进行交叉验证。其基本思想是:预留一部分数据用于测试,但重复此过程多次,每次预留不同的随机样本。

例如,十倍交叉验证是指:预留10%的数据作为测试集,在剩余90%的数据上训练模型,然后在预留的测试集上评估。重复此过程。K折交叉验证通常意味着预先将数据分成K个块,而不是每次随机抽样。两种方法都有效,且具有不同的特性,我们在此不深入细节。10%是一个合理的参考比例。

留一法交叉验证

这种方法的一个特例是留一法交叉验证。具体操作如下:从数据集中取出一个样本点,将其放在一边。在剩余的所有数据上训练模型,然后评估该被预留的单个数据点,看分类是否正确。对数据集中的每一个数据项都重复此过程,你就能对模型的整体表现有一个很好的了解。

这种方法有其优缺点,我们同样不深入讨论。最后,一个相关的、我们稍后会详细一点介绍的概念是自助法。它通过对数据集进行有放回的重采样来生成新样本集,因此可能产生重复数据。这种方法在统计分析中具有很好的性质,从中推导出的任何统计量,都是对实际总体统计量的一个非常好的估计。

留一法交叉验证详解

现在,我想用一页幻灯片专门讨论留一法交叉验证,因为它在本课程之前的内容中出现过。

对于每一个训练样本 (X, Y),其中 Y 是类别标签,X 是所有其他属性(为简化表示,我们将它们归在一起),具体步骤是:

  1. 使用除这个特定样本 X 之外的所有训练数据来训练一个分类器。
  2. 在样本 X 上测试该分类器的准确性:分类正确还是错误?

然后,留一法交叉验证的准确率 就是你在所有被预留数据上表现的平均值。

课程中的实例

我们在之前的Twitter作业中见过这种方法。当时有一个建议,用于调试和评估你的词汇情感模型(不是推文情感模型)。建议是:从AFINN词表文件中取出一个词汇,看看你的模型为该词汇预测的情感是什么。你可以大致确认,当AFINN词表标注为积极时,你的模型预测是否也为积极;标注为消极时,预测是否也为消极。当然,这与你使用的具体推文数据集有关,但这是一个很好的合理性检查方法,以确保你产生了正确的值。

当时的一个挑战是:AFINN词表本身已经包含了大量明显的积极词和消极词,因此没有留下太多词汇用于测试。但根据留一法交叉验证的思想,这没关系。AFINN词表是输入的一部分,但从“训练集”中留出一些东西(尽管我们当时并不严格认为是在训练一个模型),在某种意义上,我们就是在进行“留一”操作,然后查看对你留出的那个“一”预测了什么值。

你也可以进行K折交叉验证,即留出一大批数据。但在课程讨论区中提出的建议,可能就是进行这种“留一”检查。

总结

本节课中,我们一起学习了模型评估的核心概念。我们明确了必须在独立于训练数据的测试集上评估模型。我们介绍了简单的训练-测试集划分,以及更稳健的交叉验证方法,特别是留一法交叉验证。我们还通过课程中的Twitter作业实例,看到了这种方法在实际中的应用。正确评估模型是构建可靠、泛化能力强的预测模型的基础。

045:准确率与ROC曲线

在本节课中,我们将学习如何评估分类模型的性能。我们将从简单的准确率指标开始,探讨其局限性,并引入更复杂的评估工具,如混淆矩阵和ROC曲线,以帮助我们更全面地理解模型表现。

混淆矩阵详解

上一节我们介绍了准确率的概念,本节中我们来看看一个更详细的评估工具:混淆矩阵。混淆矩阵是评估二分类模型性能的基础工具。

它通过一个表格来展示预测结果与真实标签的对比情况。表格的列代表模型的预测类别(例如“预测为正类”和“预测为负类”),行代表数据的真实类别(例如“真实为正类”和“真实为负类”)。

以下是混淆矩阵的结构:

预测为正类 预测为负类
真实为正类 a (真正例,TP) b (假负例,FN)
真实为负类 c (假正例,FP) d (真负例,TN)

在矩阵中,ad(蓝色标记)是模型预测正确的数量,而 bc(红色标记)是模型预测错误的数量。

基于此,准确率的计算公式为:
准确率 = (a + d) / (a + b + c + d)

准确率的局限性与基准

既然准确率计算如此直接,为什么不能一直使用它呢?在许多情况下,仅凭准确率一个数字可能不足以提供有意义的见解。

例如,如何解读90%的准确率?这算好还是坏?99%的准确率就一定非常优秀吗?答案取决于具体问题。因此,我们需要一个基准来进行比较,或者使用不同的评估指标。

以下是几种可能的基准:

  • 基准率:简单地预测数据集中最频繁出现的类别。例如,在泰坦尼克号数据集中,如果大多数乘客幸存,那么基准模型就预测所有人都幸存。
  • 随机率:对于二分类问题,通常可以假设随机猜测的准确率是50%。但也可以根据先验知识进行调整,例如,如果你知道60%的乘客没有幸存,就可以以此作为随机基准的概率分布。
  • 朴素基准:一个比基准率稍“聪明”一点的模型,它使用一些简单的领域知识。例如,一个众所周知的规则是“所有女性都幸存”。在Kaggle等竞赛中,组织方常会提供一个初始解决方案,你的模型性能应该相对于这个基准进行衡量。

其他性能指标

除了准确率,我们还可以从混淆矩阵中计算出其他重要的性能指标。以下是几个关键概念:

  • 提升度:常见于营销文献,用于衡量模型相对于随机选择的效果提升。
  • 精确率与召回率:这两个概念源自信息检索领域。
    • 精确率 关注的是模型预测为正类的样本中,有多少是真正的正类。精确率 = a / (a + c)
    • 召回率(也称灵敏度)关注的是所有真实的正类样本中,有多少被模型正确地找了出来。召回率 = a / (a + b)
  • ROC曲线与AUC:这是本节的重点。ROC(受试者工作特征)曲线是一种综合性的评估工具。

ROC曲线深入解析

ROC曲线试图捕捉两个核心概念:灵敏度特异度

  • 灵敏度就是召回率,即模型正确识别正类样本的比例。
  • 特异度是模型正确识别负类样本的比例。特异度 = d / (c + d)

对于一个固定的分类阈值,模型会产生一对(灵敏度, 1-特异度)值,在ROC图上形成一个点。然而,许多模型(如逻辑回归、SVM)会输出一个连续的概率值或分数。通过改变判断样本为正类的概率阈值,我们可以得到一系列的点,从而绘制出一条曲线。

例如,一个通过血液肌酐水平诊断疾病的模型。问题在于:肌酐水平多高才算“过高”?改变这个诊断阈值,就会得到ROC曲线上的不同点。

  • 完美分类器的ROC曲线是一个经过左上角点(0,1)的折线,表示它能100%正确分类所有样本。
  • 随机猜测分类器的ROC曲线是图中从(0,0)到(1,1)的对角线(红色虚线)。
  • 实际模型的ROC曲线通常位于这两者之间。

为了用一个数值来概括模型的整体性能,我们计算ROC曲线下的面积,即AUC。AUC值越接近1,表示模型性能越好;AUC为0.5时,模型等同于随机猜测。

总结

本节课中我们一起学习了分类模型的核心评估方法。我们首先回顾了准确率及其局限性,然后深入介绍了混淆矩阵,它是计算多种指标的基础。接着,我们探讨了为准确率建立比较基准的重要性。最后,我们重点讲解了ROC曲线和AUC,它们通过综合考虑灵敏度和特异度,并利用可变阈值,为我们提供了评估模型性能更强大、更全面的视角。理解这些工具将帮助你在实际项目中更好地选择和优化模型。

046:自助法回顾 🎯

在本节课中,我们将学习一种名为“自助法”的强大统计技术。自助法通过从原始数据集中有放回地重复抽样,来模拟多次实验,从而帮助我们评估模型的稳定性并计算统计量的置信区间。

概述

上一节我们介绍了交叉验证,它将数据集划分为多个部分以验证模型,并强调了将数据分为训练集和测试集的重要性。本节中,我们来看看一个相关的概念:对数据集进行重采样。一个更通用的概念是数据集的“重采样”,而自助法就是其一种非常重要的应用。自助法是一种于1979年源自统计学界的、非常通用且强大的技术。

自助法的工作原理

以下是自助法的运作方式。给定一个大小为 n 的数据集,你从该数据中有放回地抽取 n 个样本,以创建一个新的数据集。然后,将此过程重复多次。现在,你便拥有了从同一总体中抽取的多个不同的样本数据集。

你可以在这些样本中的每一个上计算你感兴趣的任意统计量。或者,在我们讨论的上下文中,你可以训练一个模型。你可以将其中每一个都视为一次独立的实验。这正是频率主义视角所要求的。

如果你还记得置信区间的定义,它指出:在重复实验中,有95%的时间,这个置信区间会包含真实的均值或你感兴趣的任何真实统计量。因此,自助法为你提供了对该过程的直接模拟和统计量的解释。

这是一种对计算资源的绝妙利用。这意味着你无需对世界或正在发生的事情拥有精确的分析模型,你只需重新运行实验即可。在1979年,这看起来计算量会非常大,似乎不太可行。但现在,对于大多数数据集来说,这绝对是轻而易举的。因此,这是一种非常强大的技术。

一个简单的例子

你可能已经看懂了,但我还是想确保你明白它是如何运作的。想象一下,你得到的原始数据集只是 [1, 2, 3, 4, 5, 6]。然后,你需要从这个简单的数据集中有放回地抽取多个样本。

例如,你可能得到 [4, 3, 4, 2, 1, 6],请注意 4 出现了两次。或者得到 [2, 3, 6, 1, 3, 5],其中 3 出现了两次,依此类推。

现在,对于这些样本中的每一个,你都可以计算感兴趣的统计量,比如均值。你将得到对真实均值的无偏估计。

应用于更复杂的数据集

这是一个相当简单的例子。如果你有一个更复杂的数据集,比如下图所示,并且你想做一个稍微复杂一点的统计,例如拟合一条回归线,方法也是一样的。

这些是你的所有数据点。你可以从中抽取自助法样本。假设这里有100个点。从这些数据中有放回地抽取100个样本,然后重新拟合一条回归线。

我在这里重复了大约10次。你会看到这条线确实会摆动,因为有些点在部分样本中缺失了。例如,上方的这个离群点可能在部分自助法样本中缺失了,因此没有影响那条线的拟合,导致线会来回移动。但它仍然大致被限制在数据范围内,因为你仍然是从同一个样本数据集中抽取的。

因此,通过分析这种摆动程度,你可以计算这些统计量的置信区间等。如果你想得到这条回归线斜率的90%置信区间,只需多次执行此过程,取第5百分位数和第95百分位数,你就得到了它。

总结

本节课中,我们一起学习了自助法。这是一种非常通用且强大的技术,与统计学界(而非算法建模类的机器学习界)紧密相关。我们看到了它如何通过有放回地重采样来模拟重复实验,从而估计统计量的变异性并计算置信区间。接下来,我们将探讨如何将其应用于决策树。

047:装袋与提升 🧠

在本节课中,我们将学习集成学习的基本概念,特别是两种核心方法:装袋和提升。我们将探讨如何通过组合多个较弱的模型来构建一个更强大、更稳健的预测模型。


上一节我们讨论了重采样、自助法和交叉验证,这些方法通过分割训练集来验证模型性能。本节中我们来看看一个自然的延伸想法:既然我们拥有训练集的不同子集,为何不在每个子集上训练不同的分类器,然后组合它们的结果呢?

与其用这些子集来验证单个分类器,不如直接创建一系列不同的分类器。这里的关键问题是:将一堆表现不佳的分类器组合起来,真的能获得更好的性能吗?这个问题的答案并非显而易见,但已被证实是肯定的。

通过平均不同模型的结果,你可以获得几个好处。一是分类性能会提升,并且可以通过设计来进一步提高。但或许更重要的是,它能增强对噪声的抵抗力。通过让多个分类器协同工作,可以降低过拟合的风险。

那么,为什么不总是这样做呢?主要有两个原因。第一,这非常耗时,训练多个分类器显然比训练一个更昂贵。第二,当有一大堆模型共同“投票”决定答案时,模型的行为会变得难以解释。我们之前提到,一条规则比一大套规则更容易理解;一棵决策树也易于理解,但一大片决策森林可能就不是了。不过,这并不会阻止我们使用这种方法。

这里的核心理念是“群体的智慧”,这个概念同样适用于这些生成的数字模型。


那么,我们具体如何实现呢?以下是两种主要技术。

装袋法

装袋是“自助聚合”的合成词。其核心思想是:从数据中抽取自助样本,在每个样本上独立地重新训练模型,然后聚合结果。

具体步骤如下:

  1. 从原始训练集中抽取多个自助样本。
  2. 在每个自助样本上独立训练一个基学习器。
  3. 对于回归问题,直接对各个模型的预测结果取平均值。
  4. 对于分类问题,则采用多数投票的方式决定最终类别。

装袋法对于高方差、易过拟合的模型效果非常好。它通过降低方差而不改变偏差来抵抗过拟合,这意味着它不会改变预测的中心趋势,只是让预测结果更稳定地收敛于该中心。回忆我们之前展示的图表,高方差通常意味着过拟合,即模型对训练数据过于敏感。然而,装袋法对于本身偏差就很高的模型帮助不大。高偏差、低方差的模型对训练数据本身就不太敏感,因此,仅仅对训练数据进行不同排列组合的装袋,如果无法从数据中获得有效信号,就不会有太大改善。


上一节我们介绍了通过随机抽样组合模型的装袋法。本节中我们来看看另一种思路:提升法。

提升法

提升法以AdaBoost算法为代表。与装袋法随机选择数据点不同,提升法在每一步都更关注被错误分类的样本点

其基本流程如下:

  1. 首先,从训练集训练一个基学习器。
  2. 然后,检查该分类器犯的错误
  3. 接着,重新计算样本权重,增加被错误分类数据点的权重。
  4. 基于新的权重分布,进行下一轮抽样(或直接训练),训练下一个分类器。
  5. 重复此过程,并将所有弱分类器组合成一个强分类器,通常根据每个分类器的准确性进行加权投票。

这种方法让后续的模型能够专注于纠正前序模型所犯的错误,从而逐步提升整体模型的性能。


在本节课中,我们一起学习了集成学习的两种强大技术:装袋与提升。装袋法通过自助采样构建多个独立模型并聚合结果,有效降低方差、防止过拟合。提升法则通过关注错误样本、迭代调整,让一系列弱分类器协同工作,逐步提升模型性能。理解这两种方法的原理与适用场景,将帮助你构建更稳健、更准确的数据科学模型。

048:提升算法详解

在本节课中,我们将深入探讨提升算法的具体步骤和工作原理。提升是一种强大的集成学习方法,它通过顺序训练多个弱分类器并调整数据权重,最终组合成一个强分类器。

算法步骤详解

上一节我们介绍了提升算法的基本思想,本节中我们来看看其精确的数学描述和具体执行步骤。

对于每一个步骤 T,我们都有一个权重向量,它代表了在采样时选择第 I 个样本的概率。这个权重向量记作 D。因此,D_T(I) 表示在第 T 步采样时选择样本 I 的概率。这些权重在初始化时被设置为均匀概率。

X_Iy_I 分别代表你的数据记录和对应的标签。这里,“数据点”、“样本”和“记录”这几个词可以互换使用。

H_T 是在第 T 步时,使用根据权重 D_T 抽取的样本训练得到的分类器。

接下来,计算分类器的误差。误差 ε_T 是通过将所有被错误分类的样本的权重相加得到的。下面的公式描述了这一计算过程:对于模型 H_T,将其应用于 X_I,当分类器的预测结果与实际标签 y_I 不符时,将这些样本的权重 D_T(I) 累加起来。

然后,计算所谓的“几率”。给定一个概率 p,其几率为 p / (1 - p)。这里,我们计算错误分类的几率。

接着,根据这个几率来调整权重。具体来说,只对正确分类的样本应用权重更新函数,降低它们的权重。未被正确分类的样本权重保持不变。我为了表述清晰,没有在图中列出完整的表达式,这可能不是一个好主意。需要强调的是,权重更新仅应用于被正确分类的样本。

此外,还有一个步骤我在图中为了清晰也省略了,那就是权重归一化。因为调整部分权重后,所有权重之和不再等于1。虽然相对权重是已知的,但为了进行下一轮采样,需要将所有权重重新归一化,使其总和为1。这是一个简单的步骤,但加入一个除以归一化因子 Z 的表达式可能会让人困惑,所以我选择这样解释。归一化后,你就得到了用于下一轮迭代的新权重 D_{T+1},然后重复这个过程。

提升与装袋的对比

了解了提升算法的步骤后,我们结合对大数据和可扩展性的理解,来比较一下提升和另一种集成方法——装袋的区别。

提升算法有许多优良特性,是一个非常成功的算法。它尤其酷的一点在于它是一个元算法。这意味着它可以应用于任何基础分类器,不限定分类器的具体类型。它可以是决策树,也可以是你想出的任何其他方法。提升算法所做的只是影响每一步训练分类器时使用的数据。

由于这种权重调整机制,算法会逐渐“聚焦”于之前犯错的样本,给错误分类的样本分配越来越多的权重。你可以直观地想象,分类器的整体强度会随着时间的推移变得非常强大。这很好,而且它确实有效。

但是,相对于更简单的装袋方法,提升在处理真正的大数据时有一个劣势。

这个劣势就是:提升本质上是顺序执行的。我们有“对于每个时间步T”的循环,第 T+1 步的权重依赖于第 T 步的权重。而在装袋中,我们可以完全并行地进行所有操作,同时训练所有基分类器。

这一点在讨论各种方法时并不常见,因为它们往往侧重于相关的数学性能。但在数据科学的背景下,我们需要记住,我们有时需要在非常大的数据集上工作。因此,一个性能稍差但易于并行化的方法可能会胜出。


本节课中我们一起学习了提升算法的具体工作流程,包括权重初始化、误差计算、权重更新与归一化等核心步骤。我们还分析了提升算法作为一种强大的顺序集成方法的优势,以及其在大数据场景下,由于顺序依赖性而相对于并行化方法(如装袋)存在的潜在可扩展性挑战。理解这些权衡对于在实际大规模数据科学项目中选择合适的算法至关重要。

049:随机森林 🌲

在本节课中,我们将学习一种非常流行且强大的集成学习方法——随机森林。我们将了解其构建过程、核心思想以及如何评估其性能。

上一节我们介绍了提升法、装袋法等集成学习概念。本节中,我们将把这些思想结合起来,应用于决策树,从而创建一种基于决策树的集成方法。

算法构建过程 🛠️

随机森林由布雷曼于2001年提出。其核心思想是构建多棵决策树,并通过投票机制进行最终预测。以下是构建随机森林的具体步骤。

以下是构建随机森林的详细步骤:

  1. 重复K次:K是一个需要指定的参数,代表森林中树的数量。
  2. 抽取自助样本:从原始数据集中抽取一个自助样本。
  3. 训练决策树:在该自助样本上训练一棵决策树,训练规则如下:
    • 持续分裂节点,直到树达到预设的最大尺寸(通常设置得较为保守)。
    • 对于每个待分裂的叶节点,执行以下操作:
      • 从全部P个可用特征中,随机选择M个特征。
      • 仅在这M个特征中,像往常一样(例如使用信息熵等方法)寻找最佳的特征或分裂点。
  4. 计算袋外误差:由于自助抽样可能产生重复样本,这意味着有些原始数据未被抽中。这些未被抽中的数据构成了一个天然的测试集。用当前树在这个测试集上评估误差,即“袋外误差”。
  5. 形成森林:重复以上步骤K次,最终得到K棵决策树。

袋外误差的用途 📊

在算法运行过程中计算的袋外误差有多种用途,它不仅仅是评估指标。

以下是袋外误差的几个主要用途:

  • 估计强度:强度是错误率的倒数,袋外误差可用于估计单棵树的预测强度。
  • 衡量相关性:每棵树使用不同的数据子集和特征子集生成。通过袋外误差可以衡量这些随机树之间的相关性。我们不希望所有树都做出相同的决策(高相关性),这会降低集成分类器的整体效能。
  • 评估变量重要性:袋外误差还可用于评估不同特征(变量)对模型预测的重要性,我们将在下一张幻灯片详细讨论。

最终预测与总结 🎯

最终,我们得到了K棵希望是近似独立的决策树。当新的数据点需要分类时,随机森林通过一个简单的多数投票机制来做出最终预测。

本节课中,我们一起学习了随机森林算法。我们了解到,它通过结合自助抽样特征随机选择来构建多棵差异化的决策树,并利用袋外误差进行即时评估,最后通过多数投票进行集成预测,从而成为一个强大且鲁棒的机器学习模型。

050:变量重要性

在本节课中,我们将要学习随机森林模型中的一个重要概念——变量重要性。我们将探讨如何衡量不同特征对模型预测准确性的贡献,并介绍两种用于决策树节点分裂的“不纯度”度量方法:熵和基尼系数。

变量重要性概述

上一节我们介绍了集成方法(如随机森林)在可解释性方面的弱点。一个单一的决策树很容易理解,但多个决策树协同工作时,其内部机制就不那么清晰了。如果你希望使用模型来获得对问题领域的洞察,仅凭随机森林输出的高精度结果可能是不够的,因为你不知道它为何有效。

变量重要性正是应对这一挑战的方法。其核心思想是,在运行随机森林算法后,你将获得一个衡量各个属性对模型准确性重要程度的指标。

如何衡量变量重要性

那么,如何衡量变量重要性呢?其基本方法是在训练每棵树时进行一种“置换实验”。

以下是具体步骤:

  1. 对于数据集中的某个特定属性,随机打乱其所有值。
  2. 使用打乱后的数据重新评估决策树的预测准确性(或错误率)。
  3. 观察错误率的变化程度。

其背后的逻辑是:如果一个属性非常重要,打乱它的值会显著破坏模型原有的信息结构,从而导致错误率大幅上升。反之,如果一个属性不重要,打乱它的值对错误率的影响就很小。通过在所有树上聚合这种变化,就可以得到每个属性在整个随机森林中的重要性评分。

这有助于提升随机森林的整体可解释性,让你了解哪些特征在驱动所有决策。在一些应用中,例如医学领域,找到根本原因而非仅仅进行“发射后不管”式的治疗至关重要。

决策树中的不纯度度量

另一个相关概念是决策树算法中用于选择分裂属性的“不纯度”度量。我们之前讨论过使用熵来衡量不纯度。在选择每个节点上用于分裂的属性时,目标是找到能最大程度减少不确定性的属性,即分裂后能产生尽可能“纯净”的子节点。

除了熵,另一种常用的不纯度度量是基尼系数。其公式如下:

Gini = 1 - Σ (p_i)²

其中,p_i 是节点中第 i 个类别的比例。

我们可以思考一下这个公式的行为。假设一个二分类问题(例如生存/未生存):

  • 如果类别均匀分布(各占50%),则 Gini = 1 - (0.5² + 0.5²) = 1 - 0.5 = 0.5。
  • 如果类别分布不均衡(例如10%和90%),则 Gini = 1 - (0.1² + 0.9²) = 1 - 0.82 = 0.18。

分布越不均衡(越纯净),基尼系数的值就越小。因此,基尼系数也是一个范围在0到1之间的函数,用于捕捉节点的纯度,其性质与熵类似。现在你知道了这两种测量不纯度的方法,在实际的决策树库中,你可能会看到它们都被使用。

总结

本节课中我们一起学习了随机森林中的变量重要性概念。我们了解到,通过“置换实验”可以量化每个特征对模型预测准确性的贡献,从而弥补集成模型可解释性不足的缺点。此外,我们还回顾并比较了决策树中用于选择分裂属性的两种不纯度度量方法:熵和基尼系数。理解这些概念有助于我们不仅使用模型进行预测,还能从中获得关于数据本身的洞察。

051:树和森林 🌲🌳

在本节课中,我们将总结关于决策树和随机森林的核心概念。我们将回顾它们的表示方法、评估指标、优化过程,并重点讨论随机森林的并行化优势、处理高维数据的能力以及其内置的评估特性。


关于随机森林的几点说明

上一节我们介绍了决策树的构建与评估,本节中我们来看看其集成方法——随机森林的几个关键特性。

随机森林易于并行化。其核心要求是能够并行地获取随机自助采样样本。对于大多数数据集,这通常很容易实现。如果数据集非常庞大,进行随机采样可能会耗费较多资源,但这仍然比顺序训练模型的成本低得多。

除了采样,所有决策树的训练过程也可以并行进行,这使得随机森林能够非常好地进行横向扩展。

随机森林的另一个优点是,它在每个节点分裂时,会从全部 P 个特征中随机选择 M 个特征(通常 M 远小于 P)。这意味着每棵树只考虑一部分特征。这很有意义,因为既然要让大量树进行投票,就需要确保整个数据集中的每个特征都能得到充分体现,而不必在每一棵单独的树中都出现。这个特性使得随机森林能够很好地扩展到具有大量特征的数据集。

此外,随机森林还有一些有益的“副作用”,例如可以即时生成对自身准确率和变量重要性的估计。


回顾:表示、评估与优化框架

现在,让我们回到表示、评估与优化的框架来总结决策树和随机森林。

  • 表示:这里的模型是决策树或决策树的集合,其中最终的分类由多数投票决定。
  • 评估:评估主要与错误率和准确率有关。我们也讨论过其他可能使用的评估指标。对于随机森林,我们拥有袋外误差,它与准确率定义相同,但区别在于测试集的来源。袋外误差自然地从自助采样过程中产生,因此无需单独决定如何进行交叉验证。
  • 优化:在优化方面,我们并非通过改进某个朴素算法来实现,而是采用了基于信息增益或基尼指数的方法,来逐步构建具有良好预测能力的树。我们称之为“随机森林”,但并非指构建完全随机的树(那样性能会很差)。我们通过智能地决定如何分裂节点、选择哪个属性进行分裂,从而构建出优于随机猜测的树。

总结

本节课中我们一起学习了决策树与随机森林的核心内容。我们了解到随机森林因其并行化能力而具备出色的扩展性,通过特征随机选择能有效处理高维数据,并且其自助采样过程自然地提供了袋外误差这一内置评估工具。最后,我们再次通过表示、评估与优化的框架,系统性地回顾了这些模型的构建原理与评估方法。

052:最近邻分类法 🧭

在本节课中,我们将要学习一种名为“最近邻分类”的监督学习方法。这是一种直观且简单的分类技术,尤其适用于处理数值型数据。我们将探讨其基本原理、应用场景以及潜在的优缺点。


上一节我们介绍了集成方法,如随机森林,它们通过组合多个模型来提升性能并避免过拟合。本节中,我们来看看一种基于完全不同原理的分类方法——最近邻分类法。

最近邻分类法是一种非常简单的算法。其核心思想是:将数据点绘制在一个多维空间中,每个点根据其属性值占据一个位置,并带有类别标签。当需要为一个新数据点分类时,只需将其放入同一空间,并找到距离它最近的已知数据点(即“最近邻”),然后将该最近邻的类别赋予新点。

以下是其工作原理的直观展示:

在上图中,红色方块和蓝色圆圈代表两个不同的类别。当出现一个新的待分类点(绿色三角形)时:

  • 第一个绿色三角形距离最近的已知点是蓝色圆圈,因此它被分类为蓝色。
  • 第二个绿色三角形距离最近的已知点是红色方块,因此它被分类为红色。

核心概念与公式

最近邻分类法的核心是计算数据点之间的距离。最常用的距离度量是欧几里得距离

对于两个具有 n 个数值属性的点 pq,其欧几里得距离公式为:

distance(p, q) = sqrt( (p₁ - q₁)² + (p₂ - q₂)² + ... + (pₙ - qₙ)² )

在代码中,这可以表示为:

import numpy as np

def euclidean_distance(point1, point2):
    return np.sqrt(np.sum((np.array(point1) - np.array(point2)) ** 2))

算法步骤可以总结为:

  1. 存储:存储所有训练数据(特征和标签)。
  2. 计算:对于一个新的查询点,计算它与存储数据中每个点的距离。
  3. 查找:找出距离最小的那个点(最近邻)。
  4. 分类:将该最近邻的标签作为查询点的预测标签。

方法的优势与局限

了解了基本原理后,我们来看看这种方法的特性。

以下是最近邻分类法的主要特点:

  • 简单直观:概念易于理解,实现相对简单。
  • 无需训练:没有显式的模型训练阶段(“惰性学习”),所有计算发生在分类时。
  • 自然处理非线性边界:可以适应非常复杂的类别边界。

然而,该方法也存在一些明显的局限性:

  • 对噪声敏感:如上图第二个绿色三角形所示,如果最近邻恰好是一个标注错误或异常点(噪声),就会导致误分类。
  • 计算成本高:分类时需要计算新点到所有训练点的距离,当数据集很大时,这会非常慢。
  • 需要数值型数据:距离计算通常要求属性是数值型的。处理分类数据需要额外的转换(如独热编码),有时并不直观。
  • 维度灾难:在高维空间中,所有点之间的距离可能变得相似,导致算法性能下降。
  • 需要特征缩放:如果特征的量纲(单位)差异很大,距离计算会被数值大的特征主导,因此通常需要对数据进行标准化或归一化。

从单邻居到多邻居

为了克服对单个噪声点的敏感性,一个常见的改进是使用 k-最近邻 算法。

k-最近邻 算法不只看最近的一个点,而是考察距离最近的 k 个点(例如,k=3k=5),然后通过投票决定新点的类别。这通常能产生更稳定、更鲁棒的结果。选择适当的 k 值(通常通过交叉验证确定)是使用该方法的关键。


本节课中我们一起学习了最近邻分类法。这是一种基于实例或记忆的学习方法,其核心是通过在特征空间中寻找最近邻来进行预测。我们讨论了其直观的工作原理、基于欧几里得距离的计算方式、以及其简单性背后对噪声敏感、计算效率低等缺点。最后,我们简要介绍了通过使用 k 个邻居进行投票来提升鲁棒性的 k-最近邻 改进算法。这种方法为处理数值型数据的分类问题提供了一个基础而有效的工具。

053:最近邻算法与相似度函数 📊

在本节课中,我们将学习最近邻算法的核心思想及其扩展——K最近邻算法,并探讨如何选择合适的相似度函数来度量数据点之间的距离。


最近邻算法的基本思想

上一节我们介绍了分类问题的基本概念,本节中我们来看看一种直观的分类方法:最近邻算法。

其基本思想是:对于一个待分类的新数据点,找到训练数据中与它最相似(即距离最近)的那个点,然后将新点归类为该最近邻点的类别。例如,在文档分类中,如果新文档与之前一篇关于体育的文档在词汇上高度相似,我们就将其也归类为体育文档。

这种方法虽然直观,但对数据中的噪声较为敏感。一个简单的扩展是使用K最近邻算法。


K最近邻算法

为了提升对噪声的鲁棒性,我们可以不只看最近的一个邻居,而是考察K个最近的邻居。

以下是K最近邻算法的基本步骤:

  1. 对于一个新数据点,计算它与训练集中所有点的距离。
  2. 找出距离最近的K个点(邻居)。
  3. 让这K个邻居进行投票,根据多数票决定新点的类别。

如何选择K值?

选择K值是一个权衡过程,以下是不同K值的特点:

  • 小K值(如K=1)的优点

    • 计算速度快。
    • 对数据中的类别不平衡问题不那么敏感。在类别不平衡的数据中(例如“存活”样本远多于“未存活”样本),大K值容易因多数类邻居过多而导致误分类。
  • 大K值的优点

    • 能更好地忽略异常值或噪声点的影响,使分类结果更稳定。

选择K值通常需要针对具体问题进行调整,已有许多研究工作致力于更精确地确定K值。


相似度函数的选择

除了K值,另一个关键决策是选择何种函数来衡量数据点之间的“相似度”或“距离”。

欧几里得距离

最常用的距离度量是欧几里得距离。对于两个点 pq,其欧几里得距离公式为:
distance(p, q) = sqrt( (q1 - p1)² + (q2 - p2)² + ... + (qn - pn)² )

余弦相似度

另一种常用的度量是余弦相似度,它衡量的是两个向量在方向上的差异,即它们之间夹角θ的余弦值。
cosine_similarity(p, q) = (p·q) / (||p|| * ||q||)
其中 p·q 是点积,||p|| 是向量p的模长。余弦相似度的值域为[-1, 1],值越接近1,表示两个向量的方向越一致。

两种度量的权衡

现在我们来思考一下这两种度量方式的权衡。

  • 欧几里得距离的缺点:它对维度数量敏感。随着数据维度(特征数量)的增加,点与点之间的距离会变得难以解释,并且普遍会增大,这被称为“维数灾难”。在许多机器学习应用(如文档分类,特征是所有英文单词)中,维度数量非常庞大,这是欧氏距离面临的主要挑战。

  • 余弦相似度的缺点:它更倾向于受主导成分的影响。这意味着,如果两个向量在绝大多数维度上都相同,仅在一个维度上某个向量的值远高于另一个,余弦相似度受此差异的影响要小于欧几里得距离。这在某些情况下可能忽略掉重要的局部差异。


总结

本节课中我们一起学习了最近邻算法的核心思想及其扩展K最近邻算法。我们了解到,K最近邻通过让多个最近邻投票来提升分类的稳定性。同时,我们探讨了两种关键的相似度度量函数:欧几里得距离和余弦相似度,并分析了它们各自的优缺点及适用场景。理解这些基本概念是应用最近邻方法解决实际分类问题的基础。

054:维度灾难与距离度量 📊

在本节课中,我们将探讨高维空间中的距离度量问题,特别是欧几里得距离和余弦相似度在不同维度下的行为差异,以及它们对最近邻搜索的影响。


高维空间中的距离度量

上一节我们介绍了最近邻算法的基本概念,本节中我们来看看当数据维度增加时,距离度量会发生什么变化。

假设空间中有一个点,这里有一个蓝点,远处有一个红点。从原点到蓝点的角度是θ_blue,到红点的角度是θ_red。此时,余弦相似度对此距离变化的敏感度相对较低。

相比之下,欧几里得距离则不同。这个点和那个点在线性距离上相隔很远。

公式:对于两个向量 ab,欧几里得距离为 dist = sqrt(∑(a_i - b_i)^2),而余弦相似度为 cos_sim = (a·b) / (||a|| ||b||)

这意味着,你往往会与那些在某个维度上具有非常大值的邻居更为相似。这既可能是好事,也可能是坏事。

应用场景分析

以下是余弦相似度在特定应用中的优势分析。

在一篇论文中,作者认为这对于图像检索是件好事。例如,你有一个查询图像,试图寻找其他相似图像。你从图像中提取一系列特征,并尝试找到相似的特征。

假设你的图像具有非常强烈的红棕色或红蓝色调。那么,你将找到那些同样具有红蓝色调,但强度可能较低(即幅度较小)的图像作为返回结果。

相比之下,那些幅度相近但色调不同(例如绿色和黄色)的图像,在该应用场景下可能被认为相似度较低。

但这完全取决于具体的应用场景。

维度灾难现象

关于欧几里得距离对维度数量的敏感性,我想最后强调一点。

假设数据服从正态分布,方差约为4或5。在D维空间中随机选取两个点,其中D从0变化到1000。

代码示例(概念性):

import numpy as np
def random_distance(dim):
    point1 = np.random.randn(dim)
    point2 = np.random.randn(dim)
    return np.linalg.norm(point1 - point2) # 欧几里得距离

你可以看到,即使这些点是从相同的随机分布中抽取的,欧几里得距离也随着维度的增加而上升

随着空间呈指数级扩展,事物之间的距离变得越来越远。当你在高维空间中尝试度量相似性时,这可能并不总是你想要的效果。


本节课中我们一起学习了高维空间对距离度量的影响,比较了欧几里得距离与余弦相似度的不同特性,并理解了“维度灾难”如何使数据点在高维空间中彼此远离,从而影响最近邻搜索等任务的性能。选择何种距离度量需要紧密结合具体的应用需求。

055:梯度下降优化 🎯

在本节课中,我们将学习一种重要的机器学习优化方法——梯度下降。我们将从回顾已学知识开始,然后深入探讨梯度下降的基本原理、应用场景及其优缺点。

上一节我们介绍了随机森林和K近邻等算法,本节中我们来看看梯度下降如何为机器学习模型提供另一种强大的优化思路。


概述 📋

梯度下降是一种广泛应用于机器学习的优化方法。其核心思想是将学习问题表达为一个需要最小化的代价函数,然后通过迭代“下山”的方式找到函数的最小值点。我们将首先理解其基本组件,然后探讨它在回归问题中的应用。


机器学习解决方案的三个组件 ⚙️

任何机器学习解决方案都包含三个核心部分:

  1. 模型表示:如何用数学形式描述模型。
  2. 模型评估:如何衡量模型的表现好坏。
  3. 优化过程:如何调整模型以使其表现更好。

梯度下降主要属于优化过程的范畴,但它与代价函数(评估)紧密相关。


梯度下降的核心思想 🧠

梯度下降的本质是最小化一个代价函数。你可以将其想象成将一个球放在山坡上,让它滚到最低的山谷。

具体过程是:

  1. 从一个初始点开始。
  2. 计算当前点的“坡度”(梯度)。
  3. 沿着坡度最陡的下坡方向迈出一步。
  4. 重复步骤2和3,直到到达一个低点(收敛)。

这个过程并非真的“滚动”,而是逐步向下行走。这个“步进”的特性也带来了梯度下降的一些挑战。

以下是梯度下降的简单公式描述。假设代价函数为 J(θ),参数为 θ,学习率为 α,则更新规则为:
θ = θ - α * ∇J(θ)
其中 ∇J(θ) 是代价函数 Jθ 处的梯度。


梯度下降的潜在问题与优势 ⚖️

使用梯度下降时,需要注意以下潜在弱点:

  • 局部最小值陷阱:对于复杂问题,梯度下降可能收敛到局部最小值,而非全局最小值。有些情况下可以设计保证找到全局最优解,但并非总是可行。
  • 步长选择:如何确定每一步的大小(学习率)是一个关键问题,步长太大会错过最小值,步长太小则收敛过慢。

尽管如此,它仍是一种强大且应用广泛的优化方法。


从分类到回归的转变 🔄

之前我们讨论的主要是分类问题(如决策树、随机森林预测类别)。现在,我们将重点转向回归问题。

回归同样用于预测,但其目标是预测一个连续的响应变量(例如价格、温度),而不是离散的类别标签。其核心思想是为数据拟合一条线(或超平面),并用这条线来根据输入变量预测输出值。

因此,回归线本身就是一个预测器


回归问题的设定 📈

为了使讲解清晰,我们先从最简单的单输入变量情况开始思考。但请记住,在整个讨论中,我们实际考虑的是整个输入变量向量。这个向量可以看作是数据库中的一行数据,包含多个特征。

即使我们以二维(一个X,一个Y)为例进行可视化,其原理可以直接推广到多维空间,即用超平面来拟合数据。


总结 🎓

本节课我们一起学习了梯度下降优化方法。我们回顾了机器学习的三个组件,并指出梯度下降属于优化过程。我们解释了梯度下降通过最小化代价函数来“下山”的核心思想,并讨论了其可能陷入局部最小值的弱点。最后,我们将上下文从分类问题切换到回归问题,明确了回归的目标是预测连续值,并通过拟合线(或超平面)来实现预测。

梯度下降为后续学习更复杂的模型(如线性回归、逻辑回归乃至神经网络)奠定了重要的优化基础。下一节我们将深入探讨如何将梯度下降具体应用于回归模型。

056:梯度下降可视化 🎯

在本节课中,我们将学习梯度下降算法如何通过迭代优化线性回归模型的参数。我们将通过一个可视化的例子,理解算法如何从随机的初始参数出发,逐步找到使预测误差最小的最佳拟合直线。


概述 📋

梯度下降是一种用于寻找函数最小值的优化算法。在机器学习中,它常被用来最小化模型的误差(或成本)。本节课我们将通过一个线性回归的例子,可视化梯度下降的工作过程。

数据准备与分割

首先,我们有一组散点数据。这些数据被精心生成,以便存在一条能很好描述数据的回归线。

以下是数据处理的第一步:

  • 将数据分割为训练集和测试集。这是建模前的标准步骤。本例中,我们简单地将数据对半分割。
  • 对数据进行缩放。原始数据的范围(例如从-10到60或0到600)被缩放到以0为中心的范围。注意:本例中的缩放操作是在分割数据之前对整个数据集进行的,这通常是不正确的做法。正确做法应分别对训练集和测试集进行缩放,以避免测试集信息“泄露”影响训练过程。

梯度下降过程解析

上一节我们介绍了数据准备,本节中我们来看看梯度下降如何优化线性回归模型。

我们试图优化的模型是一个简单的线性方程:y = θ₀ + θ₁ * x。其中,θ₀是截距,θ₁是斜率。梯度下降的目标是找到使成本函数最小的 θ₀θ₁

成本函数(误差)定义为所有数据点的预测值与实际值之差的平方和:
J(θ₀, θ₁) = Σ (y⁽ⁱ⁾ - (θ₀ + θ₁ * x⁽ⁱ⁾))²

可视化过程如下:

  1. 随机初始化:算法从一个随机选择的参数点开始(例如,一个随机的 θ₀θ₁ 组合)。选择初始点是梯度下降的一个弱点。
  2. 计算梯度与迈出第一步:在初始点,我们计算成本函数的梯度(即最陡下降的方向),并沿该方向迈出一步。这一步使误差显著降低,参数从初始点移动到空间中的新位置。这对应着回归线从第一条变为第二条。
  3. 迭代优化:接着,我们继续计算新位置的梯度,并再次迈步。误差进一步减小,回归线随之旋转,越来越接近能直观描述数据的方向。
  4. 收敛:我们持续这个过程,每一步都生成一条新的回归线并评估其误差。当连续两次迭代的误差差值小于某个阈值时,算法判定已收敛。在本例中,算法成功找到了一个(局部)最小值,对应的回归线能很好地拟合数据。

关键问题与总结

我们描述了梯度下降的步骤,但尚未说明两个核心机制:如何精确计算下降方向,以及每一步应该迈多大。

本节课中我们一起学习了梯度下降算法的可视化过程。我们看到了算法如何从随机起点开始,通过迭代计算梯度和更新参数,使线性回归模型的拟合线逐步逼近数据的最佳描述线。理解这个过程有助于掌握梯度下降作为优化工具的核心思想。

057:梯度下降详解 🧠

在本节课中,我们将学习梯度下降算法的核心工作原理。这是一种用于优化模型参数(例如线性回归中的权重)的关键方法,通过迭代调整参数来最小化模型的预测误差(成本函数)。

梯度下降更新规则

上一节我们介绍了梯度下降的目标是找到成本函数的最低点。本节中我们来看看参数是如何具体更新的。

每个参数都将根据其旧值更新为一个新值,更新方式是沿着梯度的方向移动一步。

在参数空间(例如由 θ₀ 和 θ₁ 构成的平面)中,迭代过程如下:在迭代1,参数点位于某个位置;迭代2时,点移动到新位置;迭代3再次移动,依此类推。

为了得到第 i+1 次迭代的参数值,我们将采用第 i 次迭代的参数值,并加上一个偏移项。

公式:
θⱼ⁽ⁱ⁺¹⁾ = θⱼ⁽ⁱ⁾ - α * (∂J(θ) / ∂θⱼ)

理解偏移项

现在,让我们深入理解这个偏移项的组成部分。

  • 学习率 (α):这是步长,决定了我们沿着梯度方向移动的距离。它通常是一个较小的值,例如 0.001。具体值取决于应用场景,但在此例中,数据经过缩放后,0.001 可以作为一个合理的默认值。
  • 偏导数 (∂J(θ)/∂θⱼ):这是成本函数 J 对特定参数 θⱼ 的偏导数。所有参数的偏导数之和构成了梯度向量。我们在这里是针对单个变量进行计算。
  • 成本函数 (J):这是我们尚未展示的函数,它衡量模型预测值与真实值之间的误差。J 是模型参数和整个数据集的函数。我们将使用当前参数和数据集来计算一个新的成本值。

成本函数 J 详解

为了更新参数,我们需要计算成本函数 J 及其梯度。以下是成本函数 J 的展开。

这是我们第 i 次迭代的模型。我们试图计算参数在第 i+1 次迭代的新值。

公式:
J(θ) = (1/(2m)) * Σ (h_θ(x⁽ᵏ⁾) - y⁽ᵏ⁾)²
其中求和符号 Σk=1m 的所有数据点进行。

我们将模型应用于每个数据实例 x,减去其真实值 y,得到误差。将此误差平方,然后对数据集中所有可能的 K 个值(即所有数据点)进行求和。实际上,我们通常除以 2,这主要是为了使后续的数学推导更简洁,除以常数因子并不会改变优化的方向。

计算梯度

最后,我们只需要将这个成本函数 J 对当前正在更新的参数(例如 θ₀)进行求导。这个导数值将告诉我们,为了减少总误差,θ₀ 应该向哪个方向调整以及调整多少。


总结: 本节课中我们一起学习了梯度下降算法的详细步骤。我们了解了参数更新规则,认识了学习率和偏导数的角色,并剖析了衡量模型误差的成本函数 J 的构成。通过迭代计算梯度并更新参数,模型得以逐步优化。

058:需考虑的问题 🎯

在本节课中,我们将学习梯度下降算法的具体实现细节,特别是更新规则是如何推导出来的,以及在实际应用时需要考虑的几个关键参数和问题。


上一节我们介绍了梯度下降的基本思想,即通过迭代调整参数来最小化损失函数。本节中,我们来看看如何具体计算参数的更新量,并讨论实现过程中需要注意的几个实际问题。

以下是推导线性回归模型中参数更新规则的关键步骤。首先,我们需要计算损失函数关于每个参数的偏导数。

  1. 对于参数 θ₁(斜率),其偏导数计算过程如下:

    • 将偏导数算子移入求和符号内。
    • 应用链式法则,得到 (h(xₖ) - yₖ) * ∂/∂θ₁ (h(xₖ))
    • 由于我们的模型 h(x) 是线性模型 θ₀ + θ₁ * xₖ,其中只有 θ₁ * xₖ 项包含 θ₁。
    • 因此,关于 θ₁ 的偏导数简化为 (h(xₖ) - yₖ) * xₖ
  2. 对于参数 θ₀(截距),其更新规则略有不同。因为截距项没有与之相乘的 x 值,可以将其视为一个恒为 1.0 的虚拟特征 x₀。这样,θ₀ 的更新量就是 (h(xₖ) - yₖ) * 1,即 (h(xₖ) - yₖ)

将以上推导整合,我们得到完整的参数更新规则。以下是梯度下降算法的核心迭代步骤:

  • 参数更新θ_i (新) = θ_i (旧) + α * Σ ( (h(xₖ) - yₖ) * xₖᵢ )
    • 其中 α 是学习率,xₖᵢ 对于 θ₀ 是 1,对于 θ₁ 是 xₖ
  • 算法流程
    1. 初始化参数 θ。
    2. 当未收敛时:循环执行以下操作。
    3. 应用上述更新规则同时更新 θ₀ 和 θ₁。
    4. 检查是否满足收敛条件。

这就是手动实现梯度下降算法可以遵循的程序。


了解了算法流程后,我们还需要关注几个影响算法性能的关键参数。以下是实现梯度下降时必须考虑和设定的几个因素:

  • 参数初始化:我们需要决定梯度下降的起始点。通常可以选择小的随机值。随机初始化能提供一定的鲁棒性,避免陷入某些特殊的局部情况。
  • 学习率选择:学习率 α(即步长)的选择至关重要。步长太大可能导致越过最低点,甚至使损失函数值上升;步长太小则收敛速度会非常慢。这是一个需要谨慎调整的参数。
  • 自适应学习率:一种改进方法是使用自适应学习率。例如,在误差下降平缓时采用较大步长,在误差下降陡峭时采用较小步长,以保持每次迭代获得的“收益”大致稳定。这有助于缓解手动选择固定学习率的困难。
  • 收敛判断:我们需要设定收敛的判定标准,例如当参数更新量或损失函数值的变化小于某个阈值时,停止迭代。

本节课中我们一起学习了梯度下降法在线性回归中的应用。我们详细推导了参数的更新公式,明确了算法迭代的步骤。同时,我们也探讨了实现梯度下降时几个必须处理的现实问题:参数的初始化、学习率的选择与自适应策略,以及收敛条件的判断。理解这些细节对于正确有效地应用梯度下降算法至关重要。

059:逻辑回归直观理解 🧠

在本节课中,我们将学习逻辑回归的基本概念及其在分类问题中的应用。我们将探讨逻辑回归如何将线性回归的输出转换为概率,并理解其背后的数学原理。


上一节我们介绍了梯度下降法及其在优化问题中的应用。本节中我们来看看逻辑回归,这是一种在机器学习中广泛使用的分类方法。

逻辑回归的核心思想是,当我们面对分类问题时,直接使用线性回归可能并不合适。例如,在泰坦尼克号数据集中,我们试图根据乘客年龄预测其是否幸存。线性回归会拟合出一条直线,但这条直线对于只有0(未幸存)和1(幸存)的输出来说,解释性不强。

逻辑回归通过引入一个特殊的函数——逻辑函数(或称Sigmoid函数)来解决这个问题。该函数能将任何实数映射到(0, 1)区间内,从而可以解释为概率。

以下是逻辑函数的标准形式:

公式: σ(z) = 1 / (1 + e^(-z))

其中,z 通常是输入特征的线性组合,例如 z = w·x + b(权重向量 w 与特征向量 x 的点积,加上偏置项 b)。

逻辑回归的目标是找到一组权重参数,使得模型预测的概率尽可能接近真实的类别标签。为此,我们需要定义一个成本函数(或称损失函数)。逻辑回归通常使用对数损失(Log Loss)作为成本函数,其形式如下:

公式: J(w) = -1/m * Σ [y_i * log(ŷ_i) + (1 - y_i) * log(1 - ŷ_i)]

其中:

  • m 是样本数量。
  • y_i 是第 i 个样本的真实标签(0或1)。
  • ŷ_i 是模型预测的第 i 个样本属于正类(1)的概率,即 ŷ_i = σ(w·x_i + b)

这个成本函数的设计是为了最大化正确分类的概率。当预测概率 ŷ_i 接近真实标签 y_i 时,损失值会很小;反之,损失值会很大。

以下是逻辑回归的关键步骤概述:

  1. 模型定义:计算线性组合 z = w·x + b,然后应用逻辑函数得到概率 ŷ = σ(z)
  2. 成本函数:使用对数损失函数来衡量预测概率与真实标签之间的差异。
  3. 参数优化:使用梯度下降法等优化算法,最小化成本函数,从而找到最优的权重 w 和偏置 b

逻辑回归的优势在于,它不仅给出分类结果(例如,是否幸存),还提供了属于某个类别的概率,这在实际应用中通常比单纯的“是/否”判断更有价值。


本节课中我们一起学习了逻辑回归的直观理解。我们了解到,逻辑回归通过逻辑函数将线性回归的输出转化为概率,适用于处理分类问题,特别是当输出变量是二分类时。其核心是构建一个基于概率的成本函数,并通过优化算法(如梯度下降)来训练模型。

060:支持向量机直观理解 🧠

在本节课中,我们将学习支持向量机(SVM)的核心思想。这是一种强大的机器学习算法,用于分类任务。我们将从最简单的线性可分情况开始,逐步探讨如何处理更复杂的非线性问题。

概述:什么是支持向量机?

支持向量机的核心目标是在数据中找到一条“最佳”的直线(或超平面),将不同类别的数据点分开。我们将从直观理解入手,逐步构建其概念。

线性可分情况

上一节我们介绍了SVM的基本目标。本节中我们来看看最简单的情况:数据是线性可分的。

假设我们有一些数据点,例如红色点和蓝色点,分别代表“幸存”与“未幸存”的乘客。我们的目标是找到一条直线,能将这两类点完全分开。

当然,这样的直线并非总是存在,我们稍后会处理这种情况。但首先,假设它是存在的。

在众多可能的分隔线中,哪一条是最好的呢?直观上,最好的那条线应该位于两类数据的“正中间”。我们如何定义“正中间”?答案是最大化间隔

间隔是指分隔线与离它最近的各类数据点之间的距离。支持向量机就是要找到那个间隔最大的分隔线。这个“最大化间隔”的思想,可以精确地写成一个数学优化问题,也就是我们之前提到的SVM成本函数。

处理噪声与异常值

上一节我们讨论了理想情况。但在现实中,数据可能并非完美线性可分,或者存在一些噪声点。本节中我们来看看SVM如何处理这种情况。

有时,为了用一条直线完美分类所有点,我们得到的间隔会非常窄(如下图虚线所示)。这可能是因为某个点是个异常值

我们可能更愿意接受一个能正确分类绝大多数点、同时拥有更宽间隔的直线(如下图实线所示),即使它错误分类了少数几个点。这引入了正则化的概念。

以下是SVM权衡时的核心考量:

  • 最大化间隔:寻求一个稳健、泛化能力强的分类边界。
  • 最小化分类错误:尽可能正确分类所有训练数据点。

SVM通过引入松弛变量来软化间隔的定义,允许一些点被错误分类或落在间隔内,从而在两者之间取得平衡。这个平衡由正则化参数(通常记为 C)控制。C 值越大,模型越倾向于正确分类所有点(可能间隔变窄);C 值越小,模型越倾向于保持宽间隔(可能容忍更多错误)。

非线性问题与核技巧

上一节我们解决了有噪声的线性问题。但如果数据本身就不是线性可分的呢?例如,在二维空间中,两类点呈环形分布,没有任何直线能分开它们。本节中我们将探索SVM最强大的功能之一:处理非线性问题。

SVM通过核技巧巧妙地解决这个问题。其核心思想是:将数据从原始空间映射到一个更高维的特征空间。在这个高维空间中,原本非线性可分的数据可能变得线性可分。

考虑一个一维的例子:蓝色点集中在两端,红色点集中在中间。没有任何一个点能分开它们。

但如果我们应用一个变换,例如将每个点 x 映射到二维空间 (x, x²),即抛物线上的点,那么在二维空间中,我们就能画一条直线(实际上是原空间中的一个区间)来分开它们。

常用的核函数包括:

  • 线性核K(x, y) = x · y (就是处理线性情况)
  • 多项式核K(x, y) = (x · y + c)^d
  • 径向基函数(RBF)核K(x, y) = exp(-γ ||x - y||²)

通过核函数,我们无需显式计算复杂的高维映射,只需在原空间计算核函数值即可,这大大提高了计算效率。这使得SVM能够处理非常复杂的非线性决策边界。

总结

本节课中我们一起学习了支持向量机的核心直观理解:

  1. 基本思想:寻找最大化分类间隔的最优分隔超平面。
  2. 处理噪声:通过引入松弛变量和正则化参数 C,在“最大化间隔”和“最小化分类错误”之间进行权衡,使模型对异常值更稳健。
  3. 处理非线性:通过核技巧将数据映射到高维空间,从而在高维空间中用线性方法解决原始空间的非线性分类问题。

正是这些特性,使得支持向量机成为机器学习中一个强大且通用的工具。

061:支持向量机示例 🚢

在本节课中,我们将通过泰坦尼克号数据集的实际例子,来学习支持向量机(SVM)的应用。我们将看到SVM如何学习决策边界,并讨论模型复杂度和过拟合之间的平衡。


回到我们的泰坦尼克号示例,我们可以看到支持向量机的一些应用。

下图展示了在此泰坦尼克号数据上学习到的线性支持向量机。我选择的属性是Pclass(乘客等级,即船上的头等舱、二等舱、三等舱)和Gender(性别)。图中红色代表未幸存,蓝色代表幸存。请注意,为了让红蓝点群更清晰可见,我对数据添加了一些噪声;否则,数据点会完全集中在几个特定位置。

这里,模型找到了一条直接区分男性和女性的直线,并判定这是最佳的线性分类器。这个结果符合直觉。

然而,当我们使用更复杂的核函数时,模型可以学习到更复杂的决策面。例如,模型可能将头等舱和二等舱的女性归为一组,判定她们幸存,同时将三等舱的女性区分开来。

上一节我们看到了线性SVM在简单分类上的应用,本节中我们来看看当选择不同属性时,SVM的表现。

如果我们选择泰坦尼克号数据集中的另外两个属性,例如Age(年龄)和Pclass(乘客等级),并使用径向基函数(RBF)作为核函数,支持向量机将学习到一个相当复杂的决策面。

同样,图中黄色区域代表预测为幸存,深蓝色区域代表预测为未幸存。模型似乎根据图中少数几个蓝色数据点,在特定区域(如某些年长的二等舱、三等舱乘客)划出了很小的“幸存”区域,甚至为一个非常年长的头等舱乘客也划出了一个孤立的区域。

当你看到如此复杂的决策面,尤其是在数据本身没有明显强烈模式的情况下,这应该让你联想到过拟合。模型可能过度捕捉了训练数据中的噪声,而非真正的规律。

因此,和往常一样,我们可以调整这些学习方法的其他参数来避免过拟合。

以下是调整模型复杂度与分类错误之间平衡的关键方法:

  • 正则化参数(如C参数):在SVM中,参数C控制着对误分类点的惩罚程度与决策边界复杂度之间的权衡。较小的C值倾向于选择更平滑、更简单的边界(即使这意味着在训练集上犯更多错误),这有助于防止过拟合。
  • 核函数参数(如RBF的γ):对于像RBF这样的核函数,参数γ定义了单个训练样本的影响范围。较大的γ值会导致决策边界更曲折,可能围绕每个数据点,容易导致过拟合;较小的γ值则会产生更平滑的边界。

在这个特定的库(Python的Scikit-learn)中,我们可以通过调整这些参数来获得一个更简单、可能具有更好泛化能力的决策边界。这意味着它在预测未知的测试数据时可能会表现更好。


本节课中我们一起学习了支持向量机在泰坦尼克号数据上的应用。我们看到了线性SVM与使用核函数的非线性SVM如何生成决策边界,并认识到复杂模型可能带来的过拟合风险。最后,我们了解到可以通过正则化等技术来平衡模型的简单性与分类错误,从而获得泛化能力更强的模型。

062:正则化直观理解 🧠

在本节课中,我们将学习机器学习中一个至关重要的概念——正则化。我们将探讨为什么在模型训练中,尤其是在处理高维数据时,需要引入正则化项,以及它如何帮助我们获得更简单、泛化能力更强的模型。


高维数据带来的挑战

上一节我们讨论了成本函数,现在我们来谈谈其中的正则化项及其必要性。理解正则化,首先要理解高维数据带来的问题。

想象一下图像分类任务。图像中的每个像素都可能是一个独立的属性,这意味着模型可能有数百万个属性需要处理。同样,在文本分析中,文档通常被表示为词项的向量,可能存在多达50万个不同的词项,每个词项是否出现在文档中都会对应一个权重。

在拥有如此多属性和权重的情况下,一个常见的问题是它们之间可能存在高度相关性。例如:

  • 在文档中,某些词项倾向于同时出现或同时不出现。
  • 在图像中,一个像素的颜色通常与其邻近像素的颜色高度相似。例如,绿色草地上的一个像素点,其周围的像素点也很可能是绿色的。

这种相关性会带来一个问题:在模型训练过程中,模型可能会通过给一个像素分配极高的权重,同时给其邻近的、高度相关的像素分配极低的权重来“作弊”。这样,它们的效果会相互抵消,虽然成本函数(误差)没有显著改善,但模型的权重却发生了剧烈且不稳定的变化。

本质上,模型变得过于复杂,并过度“记忆”了训练数据中的特定噪声,而没有学到真正通用的规律。这样的模型在训练集上可能表现良好,但在未见过的数据上(即泛化时)表现会很差。


正则化的作用:偏好简单模型

为了解决上述问题,我们需要一种机制来引导模型。其核心思想是:在其他条件相同的情况下,我们更倾向于选择更简单的模型。有时,即使这意味着模型会在某些数据点上犯错,我们也愿意接受,因为简单的模型通常比那些过度拟合特定数据集的复杂模型具有更好的泛化能力。

正则化项正是提供了这种平衡。它被添加到成本函数中,用于惩罚过大的权重值,从而鼓励模型保持权重较小、结构更简单。


理解范数:衡量“大小”的工具

在深入正则化公式之前,我们先快速了解一下“范数”的概念。范数是一个函数,它为输入(通常是一个向量)分配一个正数,并且只有当输入本身为零向量时,输出才为零。

最常见的两种范数是L1范数和L2范数:

  • L2范数(欧几里得范数):计算向量各元素平方和的平方根。公式为:
    ||w||₂ = √(w₁² + w₂² + ... + wₙ²)
  • L1范数(曼哈顿范数):计算向量各元素绝对值的和。公式为:
    ||w||₁ = |w₁| + |w₂| + ... + |wₙ|

更一般地,我们可以定义LP范数。其公式如下:
||w||ₚ = (∑ᵢ |wᵢ|ᵖ)^(1/p)
其中,p是一个大于等于1的实数。当p=1时,就是L1范数;当p=2时,就是L2范数。

在正则化中,我们通常使用权重向量w的范数(如L1或L2)作为惩罚项,乘以一个称为正则化参数(λ) 的系数,然后将其加到原始的成本函数上。这样,模型在试图最小化预测误差的同时,也必须尽量保持权重向量“小”(根据所选范数的定义)。


总结

本节课中,我们一起学习了正则化的核心思想。我们了解到:

  1. 高维数据中属性间的相关性可能导致模型权重不稳定和过拟合。
  2. 正则化通过在成本函数中增加一个惩罚项,来引导模型偏好更简单、权重更小的解决方案。
  3. 范数(尤其是L1和L2范数)是衡量向量“大小”或“复杂度”的数学工具,被用作正则化惩罚项的基础。

通过引入正则化,我们能够在模型的复杂度和对训练数据的拟合度之间取得平衡,从而构建出泛化能力更强、更稳健的机器学习模型。

063:正则化与成本函数直观理解

在本节课中,我们将要学习机器学习中的两个核心概念:成本函数和正则化。我们将探讨如何量化模型的预测误差,以及如何通过正则化技术来防止模型过于复杂,从而避免过拟合。


成本函数:衡量预测误差

上一节我们介绍了模型预测的基本概念,本节中我们来看看如何量化预测的准确性。我们通过一个称为“成本函数”的单一数值来总结模型所犯的错误。

以下是几种常见的成本函数:

  1. 简单误差和总误差 = Σ(预测值 - 真实值)。这种方法通常不理想,因为正负误差可能会相互抵消,使模型看起来表现很好,但实际上并非如此。

  2. 平均绝对误差(L1范数)MAE = (1/n) * Σ|预测值 - 真实值|。这种方法认为,一个数据点上7个单位的误差,与七个数据点上各1个单位的误差是同等严重的。

  3. 均方误差(L2范数)MSE = (1/n) * Σ(预测值 - 真实值)^2。这种方法通过平方来放大较大的误差。例如,一个7单位的误差相当于49个1单位的误差(在不考虑开方的情况下)。我们有时会除以数据点数量n,甚至除以2,来计算每个数据点的平均平方误差,这有助于比较不同数据处理方法的效果。

简单误差和不是一个好的成本函数,因为它可能产生负数,也不符合“范数”的定义。而L1和L2范数能将误差映射为正数,因此在各种场景中都有广泛应用。


正则化:控制模型复杂度

了解了如何衡量误差后,我们回到正则化的主题。正则化的核心思想是在成本函数中增加一个“惩罚项”,以控制模型的复杂度,防止过拟合。

在机器学习文献中,使用不同的范数作为惩罚项对应着不同的技术:

  • L1正则化(如Lasso回归):在成本函数中增加模型参数绝对值的和作为惩罚项,即 惩罚项 = λ * Σ|θ_i|。这意味着参数值(无论正负)过高都会增加总成本,从而激励优化过程保持参数值较小。
  • L2正则化(如岭回归):在成本函数中增加模型参数平方和作为惩罚项,即 惩罚项 = λ * Σ(θ_i)^2。它同样会对过大的参数值施加惩罚。

有时你也会看到使用L2范数的平方(即直接求和,不开方)作为惩罚项。关于这些选择对不同类型问题的影响,已有大量研究。我们在此不深入细节,但希望你能够理解正则化的核心直觉:通过惩罚复杂模型来避免过拟合,就像我们在支持向量机中看到的复杂决策面一样。


本节课中我们一起学习了成本函数的作用,它用于量化模型误差;以及正则化的原理,它通过L1或L2范数惩罚项来限制模型复杂度,是防止模型过拟合的关键技术。

064:随机与批量梯度下降

在本节课中,我们将学习梯度下降算法的两种重要变体:随机梯度下降和批量梯度下降。我们将探讨它们如何工作、各自的优缺点,以及它们如何帮助处理大规模数据集。


梯度下降回顾

上一节我们介绍了梯度下降的基本概念。它是一种通过迭代调整参数来最小化损失函数的优化算法。其核心更新公式如下:

参数更新公式:
θ_new = θ_old - α * ∇J(θ)

其中:

  • θ 代表模型参数。
  • α 是学习率。
  • ∇J(θ) 是损失函数 J 关于参数 θ 的梯度。

在标准(批量)梯度下降中,每次迭代都需要计算整个训练数据集的梯度。这对于大规模数据集来说计算成本非常高。


随机梯度下降

为了应对大规模数据,我们引入随机梯度下降。其核心思想是:不再使用整个数据集来估计梯度,而是每次迭代随机选取一个数据点来计算梯度。

以下是随机梯度下降的基本步骤:

  1. 随机打乱训练数据集。
  2. 对于数据集中的每个样本(或每次迭代):
    • 使用当前参数计算该单个样本的损失梯度。
    • 根据这个梯度更新参数。

单样本更新公式:
θ_new = θ_old - α * ∇J_i(θ)
其中 ∇J_i(θ) 是仅基于第 i 个数据点的梯度。

这种方法计算速度极快,但梯度估计基于单个数据点,因此噪声很大。参数更新的路径不会直接指向最小值,而是会“曲折”前进,收敛过程可能不稳定。


小批量梯度下降

随机梯度下降和批量梯度下降是两个极端。一个折中的方案是小批量梯度下降。

在小批量梯度下降中,每次迭代我们随机选取一个小的数据子集(即一个小批量),并用这个子集来计算梯度。

小批量更新公式:
θ_new = θ_old - α * ∇J_B(θ)
其中 ∇J_B(θ) 是基于当前小批量 B 的梯度。

这种方法结合了两种方法的优点:

  • 计算效率:比使用整个数据集快。
  • 稳定性:比单样本的梯度估计更稳定、噪声更小。

选择合适的小批量大小是一个重要的超参数,需要在速度和稳定性之间取得平衡。


算法比较与可视化

让我们通过一个简单的例子来直观感受这三种方法的差异。

假设我们的目标是找到二维空间中的一个最低点(最优参数)。

  • 批量梯度下降:路径通常平滑、直接地朝向最低点。
  • 随机梯度下降:路径曲折,像“醉汉走路”一样在最低点附近徘徊,最终收敛。
  • 小批量梯度下降:路径的噪声和曲折程度介于两者之间,具体取决于批量大小。

需要注意的是,学习率 α 的选择对所有方法都至关重要。过大的学习率可能导致算法在最低点附近震荡甚至发散。


并行化的挑战

我们之前讨论过,现代的可扩展性关键在于并行化。然而,标准的梯度下降及其变体本质上是顺序的

问题在于每次迭代的参数更新都依赖于前一次迭代的结果:
θ_(t+1) = f(θ_t, data)

这种迭代间的依赖关系使得并行化变得困难。你不能简单地同时计算多个迭代,因为后面的计算需要前面的结果。如何有效地并行化梯度下降是当前研究的一个重要领域,通常涉及参数服务器、模型平均等更复杂的架构。


总结

本节课中我们一起学习了梯度下降算法的两种关键变体:

  1. 随机梯度下降:每次使用单个数据点更新参数,计算快但噪声大。
  2. 小批量梯度下降:每次使用一小批数据,在计算效率和稳定性之间取得了较好的平衡。

我们了解到,这些变体主要是为了性能优化,以应对无法一次性处理整个大数据集的情况。它们从编程角度看是简单的变体,但在数学和统计特性上有所不同。最后,我们指出了这些顺序算法在面向大规模并行计算环境时所面临的挑战。

065:并行化梯度下降 🚀

在本节课中,我们将学习一种名为“Hog Wild”的并行化随机梯度下降方法。我们将探讨其基本思想、工作原理,并理解为何这种看似无序的并行更新方式在实践中依然有效。


概述

随机梯度下降是机器学习中优化模型参数的核心算法。然而,在大规模数据集上,其计算可能非常耗时。为了加速这一过程,我们可以尝试并行化计算。本节将介绍一种大胆的并行化策略——Hog Wild,它通过移除传统的并发控制(如锁),允许多个线程同时、无序地更新参数,并证明这种方法在许多情况下依然能够收敛到有效解。

上一节我们介绍了随机梯度下降的基本原理,本节中我们来看看如何将其并行化以提升计算效率。


Hog Wild 并行策略

如果我们在并行计算时,不刻意确保更新的顺序性,结果会怎样?结果可能变得毫无意义。但事实证明,结果并非无意义,算法实际上可以收敛。

一些研究团队几乎独立地发现了这一点。这里引用的论文中,作者将他们的方法命名为“Hog Wild”。这种方法旨在并行化随机梯度下降。

其核心思想是:让每个线程或独立进程,都尝试使用一个随机数据点来更新参数。这种方法也可以应用于小批量数据。

现在,这些更新的顺序是不可预测的,因此用于计算新参数值的参数本身也是不可预测的。一个线程的更新可能尚未被另一个线程看到,依此类推。

但研究者们能够证明,这种方法仍然能使优化过程取得进展。

关于这个方法的一个有趣之处在于,它最初源于Chris Re学生的实践经验。他们试图提升性能,并尝试了各种想法。他们提出:如果我们在这个并行程序中移除并发控制会怎样?我们直接移除锁。不再担心事情发生的顺序,只是让所有更新“肆意妄为”地进行。正因如此,他们称之为“Hog Wild”。结果发现它居然有效,他们得到了不错的答案。将其应用到其他数据集后,答案依然不错。

于是他们回过头来,从分析角度研究这种方法在大多数情况下是否真的会收敛,并能够证明它确实会收敛。

我认为,这个方法的好处首先在于它提供了一种随机梯度下降的并行方法,这很棒。其次,它也表明,基于经验和直觉的试错探索方法在这些情况下是完全合理的。它不一定能提供关于你所做事情的形式化保证,但可以为你提供一个起点。


工作原理示例

那么,这实际上是如何运作的呢?假设我们有两个不同的线程,它们都将应用这种并行随机梯度下降算法。

如果我们假设时间在向下推进(如下滑所示)。在第一步,我们使用参数θ0和θ1的旧值,并随机选择第三个实例(x3),将其与y3进行比较。请注意,对于参数θ0(即截距项),我们不需要乘以x3,因为这里相当于乘以1.0。

在时间点2,另一个线程看到了在时间点0创建的新值,并使用它们来计算此处新的θ0。

在时间点3,我们仍然使用θ1的初始值(第0次的值),但使用的是θ0的第二个值(更新后的值)。以此类推。

即使只有两个线程,其顺序也是不可预测的。虽然我展示了一种交错模式,但无法保证它们一定会以这种方式交错。关键在于,只要总体上在取得进展,也许确切的顺序和细微的延迟并不重要。所有参数都在被更新,所有更新都是对梯度的某种估计,并且都在向最小值靠近。

以下是该过程的简化描述:

# 伪代码示意:每个线程独立执行类似以下操作
while not converged:
    i = random_select_data_index()  # 随机选择一个数据点索引
    theta = read_current_parameters()  # 读取当前参数(可能已过时)
    gradient = compute_gradient(theta, data[i])  # 计算梯度
    theta_new = theta - learning_rate * gradient  # 更新参数
    write_parameters(theta_new)  # 写回参数(可能覆盖其他线程的更新)

总结

本节课中我们一起学习了“Hog Wild”并行随机梯度下降法。我们了解到,通过移除严格的顺序控制,允许多个线程异步、甚至基于略微过时的参数值进行更新,这种看似混乱的方法在大规模优化问题中依然能够有效工作并收敛。这体现了在实践探索中,有时打破常规的直觉尝试能带来高效的解决方案。

066:无监督学习简介 🧠

在本节课中,我们将要学习无监督学习的基本概念,特别是聚类分析。我们将了解它与之前讨论的监督学习有何不同,并通过一个海洋微生物监测的实际案例来理解其应用。


概述

到目前为止,我们已经涵盖了机器学习这一广阔领域中一些精选的主题。具体来说,我们讨论了监督学习。我们学习了作为某些假设表示的规则和树,探讨了通过集成和提升将一组弱学习器组合成强学习器的方法,并介绍了梯度下降这一优化技术及其应用,以及如何通过随机梯度下降来加速,并实现并行化。

现在,我们将转向无监督学习中的几个精选主题。这同样是一个非常广阔的领域,我们只介绍数据科学家应该熟悉的几个主题,这远非对整个领域的全面覆盖。


什么是无监督学习?

如果我们根据反馈来源将机器学习分为四类,那么无监督学习可能是其中最突出的一类。我们之前只讨论过监督学习,但你可以思考所有这四类。

  • 监督学习中,学习的反馈明确地来自数据。
  • 强化学习中,反馈由环境提供(例如控制理论中保持飞机飞行)。
  • 博弈论中,反馈来自系统中的其他参与者(游戏中的其他玩家)。

但在无监督学习中,没有反馈。因此,你只是在数据本身中寻找模式,并尝试加以利用。


无监督学习的核心

几乎所有的无监督学习工作都可以被视为学习数据的概率模型

无监督学习的应用包括:

  • 异常检测:例如,判断工厂运行是否正常。
  • 聚类:这与我们讨论过的分类不同,因为没有类别标签。你可能会发现相似的物品组,然后当新物品出现时,你可以判断它与之前发现的哪个组最相似,从而将其归类到该组中。
  • 压缩与通信:例如,与其发送序列“A, B, A, B, A, B, A, B”,不如发送“A B”并重复七次,这是该字符串更短的表示形式。

在所有情况下,我们都是在识别描述数据的模式,然后将其用于各种服务。


聚焦:聚类分析

接下来,我们将重点讨论聚类分析。这绝不是无监督学习的唯一形式,但你会经常遇到它。另一个常见形式是降维,但我们不会花太多时间讨论。

在聚类分析中,或许没有关于“簇”的精确定义,这也是为什么针对不同场景有各种不同算法的原因之一。但输出通常是相同的:一组数据项集合

这些数据项可能是某个多维空间中的点,你的目标是根据相似性对它们进行分组。或者,数据项可能是图中的顶点,你的目标是找到比其它社区联系更紧密、协作更密切或交流更频繁的社区。在这里,你通过观察图的边结构来识别簇,但输出仍然是相同的:一组项的集合


实际案例:海洋微生物监测

让我举一个与华盛顿大学海洋学家合作的例子。他们使用了一种名为“海流”的设备,借鉴了流式细胞术的技术,并将其用于环境监测。

在医学应用中,流式细胞术是一种诊断工具,其原理是获取患者的血液或血浆等颗粒物质样本,让颗粒单列通过毛细管,用光照射,通过颗粒的吸收和折射模式来判断它是哪种病原体。在这些应用中,你通常寻找的是少数几种已知的生物,并且环境是受控的实验室环境。

而这些研究人员从头开始开发了自己的设备,将其加固并倒置安装在远洋船只的底部,以实时获取连续的、标记的颗粒流,这些颗粒代表了公海的微生物种群。这是一个完全未知的领域。除了非常稀疏的直接采样数据,几乎没有真实的地面测量数据。

这项工作的一个挑战是:在实验室中,颗粒是单列通过的,但在这里,他们稍微扩大了管道,允许多个颗粒同时通过,因为在水下、船只运动的情况下,实现单列通行的工程难度太大。因此,必须在数据分析中弥补工程上的不足,因为现在的数据噪音更大。

当光线穿过颗粒流时,会被两侧的各种检测器收集。最初有两个检测器用于帮助识别哪些颗粒在流中心,哪些在边缘,以便过滤掉边缘的颗粒。然后还有其他检测器用于不同波长的光。

首先,你可以过滤数据,只关注位于流中心的颗粒。然后,你可以开始检查不同波长,以识别代表不同微生物种群的簇。例如,我们观察纳米浮游生物、微型浮游生物和微微型浮游生物的大小,这些不同种群的一些吸收和折射模式是已知的。但在数据流中,你仍然需要找出这些簇是什么。

因此,他们应用了一种聚类算法,这是一种非常流行的聚类算法——K均值的变体,来分析这些数据。接下来,我们将讨论K均值算法。


总结

本节课中,我们一起学习了无监督学习的基本概念,特别是聚类分析。我们了解了它与监督学习的区别,看到了它在没有明确反馈时如何从数据中发现模式,并通过一个海洋微生物监测的实际案例,理解了聚类在真实世界数据分析中的应用。下一节,我们将深入探讨K均值聚类算法的原理。

067:K-均值聚类算法 🧮

在本节课中,我们将学习K-均值聚类算法。这是一种非常流行且易于理解的聚类方法,尤其适合处理大规模数据集。我们将详细介绍其工作原理、步骤、优缺点,并探讨其在大数据环境下的并行实现。


算法概述

K-均值算法是一种迭代聚类方法。其核心思想是:预先指定聚类数量K,通过迭代计算,将数据点分配到K个簇中,使得每个数据点到其所属簇中心的距离平方和最小。

算法步骤详解

上一节我们介绍了算法的基本思想,本节中我们来看看其具体的迭代步骤。

K-均值算法的执行过程可以概括为以下几个步骤:

以下是算法的主要迭代循环:

  1. 初始化:随机选择K个数据点作为初始的簇中心(质心)。
  2. 分配点:对于数据集中的每一个点,计算其到所有K个质心的距离,并将其分配给距离最近的质心所在的簇。
  3. 更新质心:对于每一个新形成的簇,计算该簇内所有数据点的平均值(即坐标的均值),将这个平均值作为该簇新的质心。
  4. 迭代:重复步骤2和步骤3,直到质心的位置不再发生显著变化(即移动距离低于某个阈值),或者达到预设的迭代次数。

图解算法过程

为了更直观地理解,我们通过一个寻找两个簇(K=2)的例子来演示算法的迭代过程。

  1. 初始猜测:在二维空间中随机放置两个质心(如图中两个“X”所示)。
  2. 第一次分配:每个数据点根据距离被分配到最近的质心,形成两个初始簇。
  3. 第一次更新:计算每个簇中所有点的平均位置,将质心移动到该平均位置。
  4. 后续迭代:重复“分配-更新”过程。质心会逐渐向各自簇的“中心”移动。
  5. 收敛:当质心的移动非常微小,数据点的分配不再改变时,算法停止。最终,所有点被清晰地划分为两个簇。

并行化实现

K-均值算法天然适合并行计算,可以借助MapReduce等框架处理海量数据。

其并行化的关键在于:质心的数量K通常较小,可以轻松地广播到所有计算节点。以下是基于MapReduce的实现思路:

  • Map阶段:每个Map任务读取一部分数据点。由于所有质心已广播到每个任务,Map任务可以为每个数据点计算其最近的质心,并输出键值对:(cluster_id, point)
  • Shuffle阶段:系统将所有相同cluster_id的键值对发送到同一个Reduce任务。
  • Reduce阶段:每个Reduce任务负责一个簇。它接收分配给该簇的所有数据点,计算这些点的平均值,从而得到该簇新的质心。

这个过程在一次迭代中完成。整个K-均值算法需要驱动程序来循环启动多次MapReduce作业,直到收敛。

算法的优缺点

K-均值算法简单高效,但也有一些明显的局限性。

以下是K-均值算法的主要弱点:

  • 需预先指定K值:用户必须事先知道或猜测数据中簇的数量,这在实际应用中往往很困难。
  • 对初始值敏感:由于初始质心是随机选择的,不同的初始值可能导致完全不同的最终聚类结果。
  • 对异常值敏感:均值计算容易受到极端值(异常点)的影响。
  • 假设簇为凸形:算法倾向于发现大小相近、呈球状(凸形)的簇,对于其他形状(如环形、流形)的簇效果不佳。
  • 迭代式MapReduce开销:在Hadoop MapReduce等框架中实现多轮迭代需要外部驱动,作业启动和中间数据读写会带来额外开销。

尽管存在这些弱点,并且已有大量研究致力于改进它们,但当人们不加修饰地提到“K-均值”时,通常指的就是我们刚刚描述的这个基础算法。


总结

本节课中我们一起学习了K-均值聚类算法。我们了解了它通过“分配-更新”的迭代过程寻找簇中心的核心机制,学习了其基于距离的公式化目标(最小化簇内平方误差),并探讨了其利用(cluster_id, point)键值对在MapReduce框架下的并行实现思路。同时,我们也认识到该算法需要预先设定簇数量、对初始值敏感等主要局限性。掌握K-均值是理解更复杂聚类方法的重要基础。

068:DBSCAN 聚类算法详解 🧩

在本节课中,我们将学习一种名为 DBSCAN 的聚类算法。与 K-Means 相比,它知名度稍低,但具备一些更优的特性。DBSCAN 能够发现任意形状的簇,并且对噪声数据有较好的处理能力。

算法原理

上一节我们介绍了 K-Means 算法,本节中我们来看看 DBSCAN 是如何工作的。DBSCAN 的基本思想是:给定一组点(例如在二维空间中),算法会寻找那些彼此间距离不超过某个阈值 ε 的点。

如果可以通过一系列不超过 ε 的“跳跃”从一个点到达另一个点,那么所有这些点都被视为属于同一个簇。每当需要跳跃的距离超过 ε 时,就意味着进入了一个新的簇。

在下面的示例中,ε 是图中所示的距离。点 A 和点 B 之间的距离在 ε 之内,点 B 和点 C 之间也在 ε 之内,因此 A、B、C 属于同一个簇。然而,点 D 无法通过 ε 内的跳跃从 B 到达,因此 D 属于另一个簇。所有实心点构成一个簇,所有空心点构成另一个簇。

算法优势

以下是 DBSCAN 算法的一些主要优势:

  • 发现非线性可分的簇:如图所示,这两个簇无法用一条直线分开,但显然存在两个密集区域。DBSCAN 可以自然地发现这种弯曲边界划分的簇,而 K-Means 则可能根据初始中心点的不同,划分出不同的直线边界。
  • 不依赖预设的簇数量:与 K-Means 需要预先指定 K 值不同,DBSCAN 不需要。
  • 对初始条件不敏感:算法从数据图中的任何顶点开始进行“跳跃”探索,结果稳定。
  • 参数较少:主要参数只有两个:距离阈值 ε 和最小邻居数 min_neighbors
  • 能处理噪声min_neighbors 参数可以控制将孤立点视为噪声。例如,如果一个点周围在 ε 范围内没有足够多的邻居(少于 min_neighbors),它就不会被归入任何簇,而是被标记为噪声。如果将 min_neighbors 设为 0,每个孤立点都会形成自己的小簇。
  • 时间复杂度可优化:算法的核心操作是反复查找 ε 范围内的所有邻居。这个操作适合使用空间索引技术(如 k-d 树)进行优化,使得每次查找仅需对数级步骤。因此,整体运行时间可以达到 O(n log n)

算法局限

当然,DBSCAN 也存在一些局限性:

  • 对欧氏距离敏感:和 K-Means 一样,DBSCAN 通常默认使用欧氏距离。在高维空间中,数据会变得非常稀疏,欧氏距离可能失去意义,这就是所谓的“维度灾难”。不过,DBSCAN 和 K-Means 都可以适配使用其他距离度量。
  • 假设簇密度均匀:DBSCAN 隐含地假设数据集中定义簇的密度是恒定的。这涉及到我们之前讨论过的“异方差性”概念。如果数据集中不同区域的簇密度差异很大,DBSCAN 可能难以同时正确识别所有簇。

总结

本节课中我们一起学习了 DBSCAN 聚类算法。我们了解了其基于密度和连通性的核心原理,探讨了它能够发现任意形状簇、无需预设簇数量、能有效处理噪声等优点。同时,我们也认识到它对距离度量的选择敏感,并且假设簇密度相对均匀。DBSCAN 是数据科学工具箱中一个非常有价值的补充,特别适用于簇形状复杂或存在噪声的数据集。

069:可变密度与并行算法

在本节课中,我们将探讨DBSCAN算法在处理可变密度数据时面临的挑战,以及如何通过并行化来提升其处理大规模数据的效率。我们还将通过可视化对比,总结DBSCAN与其他聚类算法的优势。

可变密度挑战

上一节我们介绍了DBSCAN的基本原理,本节中我们来看看它在处理密度不均匀的数据集时可能遇到的问题。

例如,下图与我们之前在统计学部分为说明异方差性而生成的图实际上是相同的,但我在此处和彼处删除了部分数据。现在,在我们看来,这里似乎应该有三个簇,对吗?一个在这里,一个在这里,还有一个在这里。

然而,考虑到DBSCAN对参数 epsilon 的敏感性,我们应如何定义 epsilon 呢?是定义一个较小的 epsilon(大约相当于此处的距离)以便轻松检测这个簇,还是定义一个稍大的 epsilon 以便捕获这些类型的簇?如果不加注意,这里我实际上调整了数据,使用较大的 epsilon 可能没问题。但如果不小心,此处的密度区域可能与这两个簇之间的距离相当,在这种情况下,epsilon 的微小变化可能导致整个数据集被归入一个簇。

因此,根据所在区域考虑使用自适应的 epsilon 值,可能是值得思考的方向。

并行化DBSCAN

与K-Means类似,我们也可以思考如何并行化DBSCAN。这里需要指出的一个关键技巧是,必须处理每个簇(或更准确地说,每个数据分区)周围的边界区域

以下是并行化的基本思路:

  1. 将数据空间划分为多个区域,例如分配给四个不同的处理器。
  2. 在每个处理器负责的内部区域,可以照常运行DBSCAN。
  3. 当处理接近该处理器负责区域的边界时,需要进行仔细的记录。

所有位于此边界区域内的点都需要发送给相邻的处理器进行比较,以判断是否需要将簇C4和C6重新标记为同一个簇,即判断这两个簇是否通过 epsilon 距离内的点相连。

各个处理器会独立地发现其区域内的簇,但在合并结果时,一些簇会被融合。这个过程实际上可以通过一系列MapReduce作业来表达。虽然不深入细节,但几年前这里的一位学生已经完成了一些工作来描述和分析此算法。

算法对比与总结

最后,我们通过scikit-learn Python库网站上一张精彩的图片来总结,它展示了各种聚类算法之间的差异。我们只讨论了其中的两种:K-Means和DBSCAN(MiniBatch K-Means是K-Means的在线版本,一次使用一个批次来更新中心点)。

你可以在此看到一些算法的优缺点。在这些公认具有挑战性的问题中,K-Means的表现实际上并不出色:

  • 在第一个例子中,你可能认为内圆是一个簇,外圆是第二个簇,但K-Means根据初始条件的不同,并不总能得到正确结果。
  • 在第二个例子中,两个簇在空间上有所重叠,如果初始条件不好(例如选在这两个簇之间),可能会将它们全部归入同一个簇。
  • 在第三个例子中,只要初始点分别位于上方和下方,最终可能会收敛到这两个簇。

与此同时,DBSCAN的表现如下:

  • 在第一个例子中,从此簇到彼簇的跳跃距离大于 epsilon,因此它会做出看似正确的判断:将内圆归为一个簇,外圆归为另一个簇。
  • 在第二个和第三个例子中,簇间的距离足够大,DBSCAN能够正确识别。
  • 在第四个有噪声的例子中,DBSCAN将所有点归入同一个簇,这在我们看来可能是正确的做法。

因此,这里最重要的启示是,至少在这四个挑战性问题中,DBSCAN在每种情况下都做出了正确的判断。所以,它是一个值得熟悉的好算法。

本节课中我们一起学习了DBSCAN在处理可变密度数据时的局限性、其并行化的核心思想,并通过与K-Means的对比,总结了DBSCAN在应对非球形、密度不均和含噪声数据时的鲁棒性优势。

070:信息可视化基础原理 🎨

在本节课中,我们将学习信息可视化的基本概念、重要性及其在数据科学流程中的核心作用。我们将探讨如何将分析后的数据,以清晰、有效且引人入胜的方式呈现给人类大脑。

大家好,我是塞西莉亚·阿拉贡,本周将由我担任客座讲师。我们将讨论信息可视化的基本原理。在我看来,这是数据科学流程中最重要、最有趣也最令人愉快的组成部分之一。我们将探讨如何将你收集和分析的数据,以一种对人类大脑有意义的形式实际呈现出来。

我是华盛顿大学人本设计与工程系的教授,很高兴能向大家介绍这个激动人心的主题。我的研究兴趣在于大型科学和社会数据集的视觉呈现。

定义与范畴 📖

上一节我们介绍了课程主题,本节中我们来看看信息可视化的具体定义和学术范畴。

“可视化”这个词的含义非常广泛,该术语有许多可能的解释。当我们说研究信息可视化时,我们指的是什么?我们考虑的是信息的视觉表示。

信息可视化的目标包括:

  • 有效的信息或数据沟通
  • 清晰性:信息应以易于人类理解的方式呈现。
  • 完整性:呈现所有数据,且仅呈现数据。
  • 激发观众与数据的互动

本课程的重点将放在有效性上。我们讨论的是向人脑清晰有效地呈现数据。

数据可视化通常分为三个学术类别:

  1. 信息可视化:通常涉及抽象的、在空间中可能没有位置的信息。例如,幻灯片上可以看到一张2000年前后的股价图,我们在Y轴上绘制价格(美元金额),在X轴上绘制时间。
  2. 科学可视化:通常涉及显示在空间中具有物理位置的数据。例如,这里看到的甲烷燃烧数据,其中每个数据点都有一个三维位置。
  3. 视觉分析:是高度交互的视觉界面与复杂的统计学习算法的结合。

在本课程中,我们将讨论信息可视化的基本原理。我们不会专门讨论科学可视化,也不会讨论视觉分析或视觉设计的艺术领域。然而,我们讨论的信息可视化原理适用于所有这三个领域。

可视化的重要性 🤔

上一节我们明确了信息可视化的范畴,本节中我们来探讨为什么可视化如此重要。

假设你有一百万个数字。向人脑传达这些信息的最佳方式是什么?

想象一张包含一百万个数字的表格。它看起来几乎庞大到无法理解,更不用说从中发现有意义的趋势或信息了。但另一方面,如果你考虑一下电脑屏幕上的像素数量,通常也在一百万左右,而你却能毫不费力地快速理解它,并能够根据获取的信息采取行动。

因此,人类视觉系统是通往人脑的最高带宽通道,也是呈现大量信息使其变得有意义的最有效方式。

总结 📝

本节课中我们一起学习了信息可视化的基本定义、它在数据科学中的核心作用,以及其重要性。我们了解到,信息可视化旨在通过视觉属性(如坐标轴、颜色、形状)来映射数据变量,从而高效地向人脑传递复杂信息。其核心优势在于利用人类视觉系统的高带宽处理能力,将海量数据转化为易于理解和交互的视觉形式。

071:激励示例 📊

在本节课中,我们将通过几个具体的例子,探讨数据可视化在揭示数据深层含义、发现统计模型可能忽略的模式方面的重要作用。我们将从简单的表格数据开始,逐步展示可视化如何更高效地传递信息。

从表格到图形:效率的飞跃

历史上,可视化的首要用途可能是从数据中提取知识。假设我们有一个包含50行数据的表格,每一行代表美国的一个州。每行有三列数据:州名、该州大学毕业生百分比以及人均收入。

以下是关于此数据可能提出的问题:

  • 哪个州的收入最高?
  • 收入与教育水平之间是否存在关联?
  • 数据中是否存在异常值或趋势?

显然,所有数据都已呈现在表格中。通过仔细查看,可以找出最高和最低的数字,并回答所有问题。但这是理解这些数据最高效的方式吗?

散点图的威力

以下是另一种呈现数据的方式——散点图。X轴代表人均收入,Y轴代表大学学位百分比。

通过观察散点图,哪个州收入最高的问题瞬间得到解答:康涅狄格州拥有最高的人均收入。同样明显的是,人均收入与大学学位百分比之间存在正相关趋势。此外,图中还显示了一些有趣的异常值,例如内华达州,它的人均收入相对较高,但大学毕业生比例却很低。

两种形式都呈现了所有信息,但视觉呈现方式在向人脑传递含义方面效率要高得多。

人脑:卓越的模式识别工具

此时可能产生一个疑问:所有这些信息不是可以通过统计程序分析数据更容易地获得吗?可以找到最大值、最小值,也可以计算回归线。

然而,事实证明,人脑是我们拥有的最佳模式匹配工具之一。迄今为止,在检测数据模式方面,人脑仍然优于我们最复杂的机器学习算法。

那么,一个直接的问题是:为什么不直接使用统计程序找出最小值、最大值和趋势线,而要费心进行可视化呢?

图表揭示统计可能忽略的信息

答案很简单:图表能揭示统计可能无法揭示的数据。

这里有一个著名的例子——安斯库姆四重奏。这里有四个小型数据集,通过观察可以看出它们彼此差异很大。但它们却拥有完全相同的线性模型,即相同的均值和相同的趋势线。

同样,这些数据也可以以表格形式呈现。但通过观察图表,我们能了解到关于这些数据集的更多信息。尽管它们拥有相同的均值和回归线,但这些数据集本身却截然不同。因此,统计可能无法告诉我们关于特定数据集的一切。

我希望这些例子能激发你对接下来一系列幻灯片内容的兴趣。本节课就到这里,我们将在下一讲中继续探讨更多示例。

总结

本节课我们一起学习了数据可视化的核心价值。我们通过对比表格与散点图,看到了可视化在快速揭示数据趋势、关联和异常值方面的高效性。同时,通过安斯库姆四重奏的例子,我们认识到可视化能够揭示单纯统计摘要(如均值、回归线)所无法体现的数据深层结构和模式,这凸显了人脑在模式识别中的独特优势,以及将可视化作为数据分析关键环节的重要性。

072:数据类型定义 📊

在本节课中,我们将学习信息可视化的核心:数据类型与视觉映射。我们将探讨如何将数据集映射到视觉属性,并理解不同数据类型的特性及其在可视化中的表现方式。


概述

信息可视化的核心问题很简单:我们需要将数据集映射到视觉属性,这个过程也称为数据编码。该过程可以概括为两个步骤:首先,对数据类型进行分类;其次,确定哪些视觉属性能最有效地表示这些数据类型。当然,细节决定成败。


数据类型分类

上一节我们介绍了数据可视化的基本流程,本节中我们来看看数据的具体分类。数据有三种基本类型:名义数据有序数据定量数据。其中,定量数据可进一步细分为区间数据比率数据

以下是每种数据类型的详细说明:

  • 名义数据:可视为标签或名称。例如,水果的种类(苹果、橙子、桃子、梨)就属于名义数据。
  • 有序数据:具有内在顺序的数据。例如,肉类的等级(A级、AA级、AAA级)就存在隐含的顺序,我们可以明确地说AAA级优于AA级。
  • 定量数据:可测量的数值数据。
    • 区间数据:零点的位置是任意的。例如,日期(2012年1月5日)或地理位置(纬度47,经度122)。这类数据类似于几何点,不能直接比较,但可以比较其差值(即区间)。
    • 比率数据:零点固定且有意义。例如,任何物理测量(长度、质量、数量、金额),其原点具有实际意义。

数据类型的操作差异

有时仅凭例子可能无法立即判断其数据类型。区分名义、有序和定量数据的最佳方法之一是观察允许对该数据执行哪些操作。

以下是基于允许的操作对数据类型进行的区分:

  • 名义数据:只允许两种操作:等于不等于。例如,对于水果,可以说橙子不等于苹果,苹果等于苹果。无法进行其他比较,例如不能说橙子比苹果好。
  • 有序数据:除了等于和不等于,还可以进行大于小于的比较。例如,对于之前提到的肉类等级,可以说AAA级优于AA级。
  • 定量数据
    • 区间数据:可以进行减法运算,以测量距离或跨度。例如,不仅可以判断2012年1月6日在2012年1月5日之后,还可以说这两个日期相差一天。
    • 比率数据:可以进行除法或计算比率。例如,如果一个物体重32克,可以说它的重量是另一个重16克物体的两倍。

总结

本节课中,我们一起学习了信息可视化的基础——数据类型。我们明确了三种基本数据类型(名义、有序、定量)及其子类(区间、比率),并通过分析每种类型所允许的操作(如等于、比较大小、计算差值或比率)来加深理解。正确识别数据类型是选择有效视觉映射方案的关键第一步。

大规模数据科学(预测分析,交流数据科学结果):第2课:将数据类型映射到视觉属性

在本节课中,我们将学习信息可视化流程的第二步:如何将不同的数据类型映射到合适的视觉属性上。我们将介绍视觉属性的分类,并探讨如何根据数据特性选择最有效的视觉编码方式。

上一节我们完成了信息可视化的第一步——理解数据类型。本节中我们来看看如何将这些数据类型映射到具体的视觉属性上。

在1967年,法国制图师Jacques Bertin首次形式化了视觉语言,并为信息可视化奠定了理论基础。他识别出了七个关键的视觉属性,这些属性在页面的右侧以0维、1维和2维的形式进行了图示。

以下是这七个关键视觉属性:

  • 位置
  • 大小
  • 明度
  • 纹理
  • 颜色
  • 方向
  • 形状

这是一个重要的知识点,建议你记下这七个属性或保存此幻灯片。


现在我们已经了解了数据类型的分类和视觉属性的分类,接下来讨论如何将两者对应起来。Bertin提供了以下建议,他认为可以根据组织层级来考虑映射关系。

以下是Bertin提出的映射建议:

  • 位置可用于表示定类定序定量数据。
  • 大小同样可用于表示定类定序定量数据。
  • 明度可用于表示定类定序数据,或许也能用于定量数据,尽管效果不那么明确。
  • 纹理可用于表示定类数据,或许也能用于定序数据(例如,更密集的纹理可能被视为比稀疏的纹理具有更高的顺序)。
  • 颜色方向形状基本上只能用于表示定类数据。我们很难说一种颜色比另一种颜色“更大”,或者一个方向比另一个方向“更小”,也无法判断一个星形比圆形“更多”或“更少”。

后续数十年在心理学和心理物理学领域的研究,进一步确立了人类感知属性的层级关系。

人类对以下属性的差异检测准确性从高到低排列如下:

  1. 位置
  2. 长度
  3. 角度与斜率
  4. 面积
  5. 体积
  6. 颜色与密度(最不精确)

因此,当你为数据分配视觉属性时,请确保将位置用于最重要的定量数据,而将颜色密度留给定类数据使用。


关于颜色最后需要注意一点。明度可以被感知为有序的,因此可以用来编码定序变量。换句话说,你看到从黑到白的色带,其明度在增加,你能看出这些颜色之间存在顺序。

你甚至可以用灰度映射来编码连续值,尽管效果不是最佳。其映射关系可以表示为:
灰度值 = f(数据值)

但是,色相通常被感知为无序的,因此你应始终只用颜色(色相)来编码定类变量。幻灯片底部的颜色之间没有顺序关系。


本节课中我们一起学习了信息可视化的核心问题——如何将数据类型映射到视觉属性。我们回顾了Bertin提出的七种关键视觉属性,探讨了它们与不同数据类型的适用关系,并了解了人类感知的精确度层级。记住,为最重要的定量数据优先选择位置编码,而为定类数据保留颜色编码。

在下一讲中,我们将通过练习来实际应用这些理论。

074:数据类型练习 📊

在本节课中,我们将通过一个具体的电子表格示例,学习如何识别和区分名义数据有序数据定量数据这三种核心数据类型。理解这些概念是进行有效数据分析的基础。

数据表格介绍

我们来看一个关于鸢尾花的数据集。表格包含以下列:ID编号、案例编号、物种编号、物种名称、器官类型(萼片或花瓣),以及该器官的宽度和长度(单位:毫米)。

数据类型分析

上一节我们介绍了数据表格的结构,本节中我们来看看如何对每一列的数据类型进行分类。这并不像初看起来那么简单,因为有些数字可能属于不同的类别。

以下是各列数据类型的分析:

  • 定量数据:这是最容易判断的。器官的宽度长度是定量数据。你可以对它们进行数学运算,例如计算比例:长度 / 宽度
  • 有序数据ID编号案例编号属于有序数据。它们有明确的顺序(如ID 1, 2, 3...),但编号之间的差值没有实际意义。你不能说ID 3和ID 2之间的“距离”代表了某种度量。
  • 名义数据物种名称器官类型显然是名义数据,因为它们只是名称或标签,只能判断是否相等。物种编号也属于名义数据,因为它仅仅是一个用于区分不同物种的标签,本身并没有内在的顺序。

核心概念总结

本节课中我们一起学习了如何在实际数据中应用数据类型的概念:

  1. 定量数据:可以进行数学运算(如加减、求比例)的数值数据。
  2. 有序数据:有顺序但差值无意义的数值或类别数据。
  3. 名义数据:仅用于标识或分类,无顺序关系的标签数据。

理解这些区别至关重要,因为它决定了后续可以应用何种统计方法和可视化方式。希望这个例子能帮助你更清晰地辨别不同的数据类型。

075:数据类型与视觉映射实践 🎯

在本节课中,我们将学习如何将数据类型映射到视觉属性,并通过三个具体示例来实践这一理论。我们将分析每个图表中使用的数据类型、视觉映射方式,并评估其有效性。


上一节我们介绍了信息可视化的核心问题与理论基础,即如何将数据类型映射到视觉属性。本节中,我们将通过三个实际案例来应用这些理论。

以下是第一个练习,请仔细观察图表并思考相关问题。

这是一张大约2000年互联网泡沫时期的股票走势图。请分析以下问题:

  • 图表中呈现了多少种数据类型?
  • 它们分别是什么类型(定类、定序还是定量)?
  • 这些数据被映射到了哪些视觉属性上?
  • 这种映射方式是否合理?为什么?

请花些时间研究图表并得出你的答案。

以下是参考答案。这个案例实际上相当简单:

  • 图表中呈现了两个维度的数据。
  • 它们都是定量数据。
  • 两者都映射到了位置属性上。
  • 时间(定量/区间数据)映射到X轴的位置。
  • 价格(美元)映射到Y轴的位置。

接下来我们尝试第二个案例。这个图表由苏格兰工程师威廉·普莱费尔于1786年创建,他是当今几种常用图表类型的发明者。

请分析这张图表:

  • 图表中呈现了多少种数据类型?
  • 它们分别是什么类型?
  • 这些数据被映射到了哪些视觉属性上?
  • 这种映射方式是否合理?为什么?

以下是分析结果。这张图表呈现了四个维度的数据:

  1. 年份(定量数据)映射到X轴的位置
  2. 进口额(英镑,定量数据)映射到Y轴的位置
  3. 出口额(定量数据)同样映射到Y轴的位置(通过另一条线表示)。
  4. 贸易差额(可视为定类或定序数据)映射到颜色面积(通过填充区域表示)。

最后,我们来看第三个案例。这是马丁·瓦滕伯格于1998年创建的一个可视化作品,它使用了本·施奈德曼树状图的一个变体,通过空间填充矩形来展示数据。

请分析这个可视化作品:

  • 其中呈现了多少种数据类型?
  • 它们分别是什么类型?
  • 这些数据被映射到了哪些视觉属性上?
  • 这种映射方式是否合理?为什么?

在这个可视化中,我们识别出四个变量:

  1. 市值(定量数据)映射到矩形的面积
  2. 市场板块(如科技、能源、资本货物、运输等,属于定类数据)映射到矩形的位置(分组)。
  3. 盈亏状态(盈利或亏损,属于定类或定序数据)映射到色彩(色相):盈利为绿色,亏损为红色。
  4. 盈亏幅度(定量数据)映射到色彩明度:绿色越亮表示盈利越多,红色越亮表示亏损越大。

本节课中我们一起学习了如何通过三个具体案例来分析和评估数据可视化中的数据类型映射。我们实践了识别数据类型(定类、定序、定量)、判断其映射的视觉属性(如位置、颜色、面积),并思考了这些映射的有效性。

下次课我们将讨论数据的组合与维度。

076:数据维度

在本节课中,我们将学习数据维度如何影响可视化设计。我们将探讨从单变量到多变量数据的可视化方法选择,并理解在二维平面上展示多维信息时面临的挑战。

在上一讲中,我们提供了三个关于将数据类型映射到视觉属性的练习。

本节中,我们将给出更多数据组合及其视觉属性映射的示例,并讨论数据维度对视觉展示效果的影响。

单变量与双变量数据可视化

如果你需要展示单个变量,即单变量数据,你有多种可视化选择。以下是部分示例:

  • 点图
  • 折线图
  • 条形图
  • 箱线图

对于双变量定量数据,散点图是最常见的选择。这里我们有两个定量变量,散点图可以清晰地描述它们之间的关系。

三维数据的可视化挑战

当数据维度增加到三维时,可视化变得更具挑战性。我们可以尝试使用三维散点图,但它存在一些问题。让我们看看右侧用蓝色立方体表示的三维散点图。点E和点F之间的相对位置关系究竟如何?在二维平面上表现三维信息存在一定困难。

一个更好的选择可能是使用二维散点图,并用其他视觉属性来表示第三个维度。例如,我们可以用红色圆点的面积来代表第三个定量维度。然而,人们对面积的感知不如对位置(坐标)的感知准确。因此,通常应将最重要的维度放在X轴和Y轴上,而将最不重要或最容易区分的维度留给第三个视觉属性。

既然我们已经讨论了将三个变量映射到三维空间时存在的问题,接下来让我们看看处理三个变量可视化的其他方法。

映射第三个变量的方法

我们知道,X轴和Y轴上的两个变量可以映射为点,因此我们有散点图、地图等可视化形式。现在,第三个变量必须使用颜色、大小或形状等其他属性来表示。

可以想象,我们拥有一个非常庞大的设计空间。随着数据维度的增加,找到最优的映射方案变得更加具有挑战性。

你总是可以使用形状或不同类型的标记来表示名义数据或分类数据。

多维数据的限制

现在,让我们上升到多维数据。一幅图像中可以描绘多少个变量?我们已经讨论了1维、2维和3维的情况。但如果维度更多呢?是否存在某种感知上的限制?

从1967年开始,贝尔坦等人就提出了这个问题。贝尔坦指出,对于最多包含三行的数据表,可以直接构建为单一图像。然而,一幅图像只有三个维度,这个障碍是无法逾越的。

我们将在下一讲中深入探讨如何回答这个问题。

总结

本节课中,我们一起学习了数据维度对可视化设计的影响。我们回顾了单变量和双变量数据的可视化方法,探讨了在二维平面上展示三维数据时遇到的挑战,并介绍了通过颜色、大小和形状等属性来映射额外变量的策略。最后,我们触及了多维数据可视化的感知限制,为后续内容奠定了基础。

077:有效的视觉编码 📊

在本节课中,我们将学习如何为给定数据集选择最有效的视觉编码方式。我们将介绍三个基本原则:重要性排序、表达性和一致性,并通过具体示例说明如何应用这些原则来创建准确、清晰的数据可视化。


上一节我们讨论了数据类型、维度以及如何根据数据维度将数据映射到视觉属性。显然,视觉编码的设计空间非常广阔。信息可视化的核心,就是为特定数据集选择最有效的视觉编码方式。本节我们将详细描述如何做到这一点。

我们之前了解到存在不同的数据类型,这些类型可以映射到一组视觉属性上,且某些映射方式优于其他方式。因此,我们面临一个挑战:如何在所有可能性中选择最佳的映射方式?

为了解决这个问题,我们将遵循三个基本原则:重要性排序表达性一致性。这些原则最早由 Jack McKinley 于 1986 年提出。


重要性排序 🥇

重要性排序是指,以人类感知最准确的方式编码最重要的信息。

我们之前见过这张图表。正如我们之前讨论的,数十年的研究告诉我们,某些视觉属性能更准确地向人脑传达定量数据。例如,位置长度在表示定量数据时最为准确,而颜色饱和度形状的准确性则较低。因此,在设计中,应将最重要的数据维度映射到最准确的视觉通道上。


表达性 🎯

接下来,我们看看表达性原则。McKinley 对表达性的定义如下:如果一种视觉语言中的“句子”(即可视化图表)能够表达数据集中所有的事实,并且表达数据中的事实,那么这组事实在该视觉语言中就是可表达的。

这意味着什么?例如,使用色调(Color Hue)无法表达一个项目大于另一个项目的事实。因此,色调根本不能表示有序数据或定量数据。它最适合用于表示名义数据(Nominal Data)

另一方面,你也不希望表达数据中不存在的事实。例如,长度通常被解读为定量值。在下图这个条形图的错误用法中,条形的长度传达了关于数据的不真实信息。

在 X 轴上,我们有这些汽车的原产国,Y 轴上是车型。条形的长度暗示了轴上存在一种排序关系,这错误地暗示了德国在某种意义上是“大于”美国的。因此,对名义数据使用条形图是一个错误的选择。


一致性 🔄

最后,我们讨论一致性原则。一致性的含义是:图像的属性(即视觉属性)应与数据的属性相匹配。

这意味着,你不应该做诸如将一维数据映射到二维或三维视觉表示这样的事情。下图说明了为什么这不是一个好主意。

这里,每桶石油的价格用一个三维桶的高度来表示。你可以看到明显的问题。看 1974 年,价格是 10.95。而 1979 年的价格是 13.34。这实际上是一个不到 30% 的增长。然而,1979 年的桶看起来明显比 1974 年的桶大得多。显然,这是一种不一致的表示。三维表示暗示了关于底层数据的错误信息。


总结 📝

本节课我们一起学习了有效视觉编码的三个核心原则:

  1. 重要性排序:将最重要的数据维度映射到人类感知最准确的视觉通道上。
  2. 表达性:可视化应表达数据中所有且仅有的信息,避免使用不合适的视觉属性(如用色调表示顺序)。
  3. 一致性:视觉属性的特性(如维度)应与数据本身的特性相匹配,避免产生误导(如用三维体积表示一维数据)。

遵循这些原则,可以帮助我们创建出更准确、更清晰、更具洞察力的数据可视化图表。

078:有效视觉编码练习 🚗

在本节课程中,我们将通过一个具体的数据集练习,学习如何为多维数据选择合适的视觉编码方式。我们将使用汽车数据集,尝试在一个可视化图表中编码全部七个维度的信息。


上一节我们介绍了视觉编码的基本概念和伯坦的视觉属性理论。本节中,我们来看看如何将这些理论应用于一个实际的数据集。

我们有一个汽车数据集,包含以下七列信息:

  • Model:车型
  • Country of Origin:原产国
  • Year:年份
  • Number of Cylinders:气缸数
  • Horsepower:马力
  • Miles per Gallon:每加仑英里数(油耗)
  • Weight in Pounds:重量(磅)

我们的目标是创建一个可视化图表,尽可能多地编码这七个维度的数据。

以下是完成此练习的三个步骤:

第一步:识别数据类型
首先,需要确定每一列数据是定类数据定序数据还是定量数据。这是选择合适视觉编码的基础。

第二步:回顾视觉属性
回顾伯坦提出的七种视觉属性,它们分别是:

  1. 位置
  2. 大小
  3. 明度
  4. 纹理
  5. 色相
  6. 方向
  7. 形状

第三步:创建可视化
根据前两步的分析,为数据集中的每个维度分配最符合感知特性的视觉属性,并尝试创建一个能编码尽可能多维度(目标是全部七个)的可视化图表。


现在,让我们来看一位学生的尝试。

这位学生选择将两个定量变量——马力每加仑英里数——分别放在X轴和Y轴上。第三个定量变量重量,则用标记点的面积来编码。这是一个不错的选择,因为坐标轴通常只能容纳两个定量变量。

此外,他将气缸数(定量区间数据)用标记点的形状来编码。对于原产国(定类数据),他使用了色相(如欧洲、日本、美国用不同颜色表示)。对于年份(定量数据),他使用了颜色的明度(或亮度)来编码。

在他的可视化中,你还可以将鼠标悬停在每个标记点上,车型名称会弹出显示。


那么,你如何评价这个可视化图表?哪些地方做得好?哪些地方有待改进?你能否设计出更好的方案?

我将这个批判性思考留作你的练习。通过分析这个案例,你可以更深入地理解如何平衡信息密度与视觉清晰度,从而创建出更有效的图表。


本节课中,我们一起学习了如何为一个包含七个维度的数据集设计视觉编码方案。我们实践了从识别数据类型、匹配视觉属性到最终构建图表的完整流程。记住,优秀的可视化是在准确传达信息和保持视觉可读性之间找到最佳平衡。

079:视觉编码的设计标准 🎨

在本节课中,我们将学习如何通过有效的视觉编码来呈现数据。首先,我们会通过两个快速练习来理解数据呈现的重要性,然后深入探讨五种关键技术,以增加通过空间位置所表示的信息量。


上一节我们介绍了有效视觉编码的重要性。现在,我们来看一个具体的例子。

请观察这两种定量数据的呈现方式。上方图表使用颜色来表示数据,而下方则是一个折线图。

为什么折线图比颜色图更好?你应该已经知道,折线图的解读速度更快。仔细观察后,你会发现折线图能展示更多的细节区别,定量信息也呈现得更清晰,并且解读时出错的概率更低。这很简单。

那么,这是否是一个有效的视觉呈现呢?答案是否定的。问题在于,这种视觉呈现方式不具有表现力,因为它暗示了国家之间一种错误的顺序关系。


我们已从人类感知的研究数据中得知,空间位置是表示定量数据最准确的方式。那么,我们如何利用这一事实呢?

在1999年,Car McKinley 和 Schneiderman 提出了五种技术,以增加通过空间位置编码的信息量。以下是这五种技术:

  1. 组合
  2. 对齐
  3. 折叠
  4. 递归
  5. 重载

接下来,我们将逐一详细讲解这些技术。


组合 指的是坐标轴的正交放置。通过创建一个二维度量空间,你可以用多种不同的方式沿X轴和Y轴排列数据。

对齐 指的是在同一空间的不同位置重复使用同一个坐标轴。例如,你可以看到相同的时间轴在两个位置重复出现,但Y轴上呈现的是两组不同的信息图表。

折叠 是指在一个正交维度上延续某个坐标轴。

递归 是指对空间进行重复细分。

最后,重载 是指为不同的数据重复使用相同的空间。


本节课中,我们一起学习了视觉编码的核心概念。我们通过练习认识到清晰表达的重要性,并详细探讨了五种利用空间位置增强信息呈现的技术:组合、对齐、折叠、递归和重载。

下一组课程,我们将转向视觉感知的探讨。

080:视觉感知基础

在本节课中,我们将要学习视觉感知的基本原理,理解人眼处理视觉信息的方式与相机有何不同,以及这对设计有效的数据可视化有何重要意义。


在之前的课程中,我们讨论了数据和视觉映射。现在,我们将探讨信息处理流程的另一端:人脑如何处理这些信息。这是关于视觉感知的三讲课程中的第一讲。

我们身体中70%的感觉接收器位于眼睛。我们的语言也反映了眼睛的重要性,描述理解的隐喻常常与视觉相关,例如“我明白了”、“洞察力”或“启发”。

Columware在2004年指出,眼睛和大脑的视觉皮层构成了一个大规模并行处理器,提供了进入人类认知中心的最高带宽通道。

在这三讲课程中,我们将描述理解视觉感知的工作原理对于有效设计可视化的重要性。需要牢记的第一个关键原则是:眼睛不是相机

Christopher Healley在1995年给出了一个更好的视觉隐喻:它是一个动态且持续进行的构建项目。在学习接下来的三讲课程时,牢记这一点非常重要。因为当你设计可视化时,如果将眼睛视为相机,可能会导致一些错误的结论。

注意力是具有选择性的,我们都知道它经过了高度过滤。真正将视觉信息转化为我们可以理解的内容的是认知过程。

心理物理学领域关注的是建立物理刺激与感知事件之间的定量关系。在接下来的三讲课程中,我们将讨论该领域的一些重要发现。


让我们思考一下如何利用感知特性。信息可视化应该让有意义的内容凸显出来。

那么,你在这张图片中看到了什么?你能看到两个与周围环境不同的点吗?为什么你能看到它们?我们将在接下来的几张幻灯片和课程中回答这个问题。

以下是眼睛和相机之间的一些重要区别:

  • 相机:拥有非常好的光学系统。具有单一焦点,能保持白平衡和单一曝光。并且进行所谓的全图像捕捉。换句话说,所有进入相机的光子都被同等重要地、同时地捕捉。
  • 眼睛:光学系统相对较差。它们不断扫描,这被称为扫视,即眼睛向不同位置的移动。它们不断调整焦点,不断适应白平衡和曝光。真正发生的是图像在心理上的重建。正如我们将发现的,它甚至不是一个完整图像的重建。

视觉感知确实不仅仅是相机的工作。请看这个棋盘,很明显,方格A比方格B颜色更深,对吗?事实证明,如果你将图像灰度化,就会看到真相。方格A和方格B具有相同的像素值。

事实上,当我第一次看到这张图像时,我并不相信。我实际上将图像放入Photoshop,并使用吸管工具来找出这两个方格的RGB值,结果它们确实是相同的。你也可以这样做,截取屏幕截图并亲自测试一下。

但这非常有趣。人类的视觉系统如此依赖于上下文和图像的重建,以至于我们看到这两个完全相同的方格时,感觉却截然不同。

颜色是相对的,我们的许多其他感知也是如此。如果你看这张幻灯片,左边的X看起来是不是灰色的,而右边的X看起来是黄色的?但如果你去看它们在幻灯片底部中心连接的地方,你会发现它们是相同的。这再次证明,眼睛感知的是差异,而不是实际的像素值。


在本节课中,我们一起学习了眼睛不是相机这一核心观点。在接下来的两讲课程中,我们将进一步讨论理解视觉感知如何帮助我们开发更有效的可视化。

081:预注意处理 👁️

在本节课中,我们将要学习视觉系统的一个非常有趣且重要的特性——预注意处理。理解这一特性对于设计高效、直观的数据可视化至关重要。

概述

上一节我们介绍了视觉感知的基础。本节中,我们来看看视觉系统如何能在我们集中注意力之前,就快速、自动地处理某些视觉信息。这种能力被称为“预注意处理”。

什么是预注意处理?

请看下图,并告诉我这组数字中有多少个“5”。

你找到答案了吗?请回想一下你花了多长时间找到它们,以及你使用了什么技巧来识别这些“5”。

现在,我将向你展示一个只做了一处微小改动的相同数组。现在,有多少个“5”?

(顺便说一下,所有的“5”都是红色的。)你是否注意到,得出答案变得多么容易?颜色让“5”立刻从背景中“跳”了出来。

心理学家给这种特性起了一个名字。你立即检测到红色“5”的过程,就叫做预注意处理

事实证明,某些基本的视觉属性可以被低层视觉系统立即检测到。这意味着它们会自动“凸显”出来,而不需要你逐一搜索所有元素。

预注意处理的定义

一般来说,如果检测一个目标所需的时间少于大约 200到250毫秒,它就符合预注意处理的标准。原因在于,眼球的运动至少需要200毫秒。然而,我们发现某些处理可以非常快速地完成。这意味着,在眼睛甚至有机会移动之前,低层次的并行处理就已经发生了。

更正式的定义是:如果一个决策所花费的时间是固定的,不随干扰项数量的增加而增加,那么它就被认为是预注意的。

预注意处理的重要性

只有一组有限的属性可以被预注意地感知,这意味着它们不需要集中注意力就能被识别。

你可以想象这对于设计可视化图表有多么重要。了解哪些信息可以被立即感知、哪些属性是良好的区分器、哪些可能误导观众,以及如何利用预注意处理信息的能力,都可以极大地增强你的可视化效果。

实例分析

以下是几个例子,帮助我们理解预注意处理及其边界。

示例一:颜色差异

观察下面两个方块,哪一个里面有红色的圆形?左边还是右边?

这非常明显,对吧?你可以立刻看到红色圆形在一群蓝色圆形中显现出来,它直接“跳”入你的眼帘。思考这个问题本身似乎都显得有些多余。

结论:在蓝色圆形的海洋中检测红色圆形是预注意的

示例二:形状差异

现在,哪一个方块包含红色的圆形?左边还是右边?

形状(曲率)也是预注意的,弯曲的圆形会凸显出来。然而,你可能已经注意到,它似乎不像颜色差异那样立即明显。预注意处理是一个连续谱,就像许多其他视觉特征一样,其“凸显”程度有所不同。

示例三:特征结合

现在,哪一个方块包含红色的圆形?左边还是右边?

这一个需要你进行序列搜索。这很有趣:尽管形状是预注意的,颜色也是预注意的,但两者的结合(特定颜色+特定形状)却不是。因此,在红色方块和蓝色圆形的干扰项海洋中,那个红色的圆形无法被预注意地感知。

实际应用

这种特性在实践中可以拯救生命。例如,在一系列垂直线中检测一条倾斜的线是预注意的

在实际应用中,飞机驾驶舱的多个仪表盘上使用倾斜的线条来指示系统故障,飞行员可以瞬间察觉到异常。

预注意视觉属性列表

我将以一份预注意视觉属性的列表作为结尾,供你参考。更多细节,请参阅Christopher Healy在网上的文章(链接在右下角)。

以下是主要的预注意视觉属性类别:

  • 颜色:色调、强度(亮度/明度)。
  • 形状:方向、线条弯曲度、大小、空间分组。
  • 运动:闪烁。
  • 空间位置:三维深度线索。

总结

本节课中,我们一起学习了预注意处理这一核心概念。我们了解到,人类的视觉系统能够在不集中注意力的情况下,并行且快速地处理某些基本视觉特征(如特定颜色、形状、方向等)。在数据可视化设计中,巧妙利用这些预注意属性(例如,用颜色突出关键数据点,用方向表示趋势变化),可以让我们设计的图表信息传递更高效、更直观,帮助观众瞬间抓住重点,避免不必要的认知负荷。希望你能在未来的可视化设计中运用这些知识。

082:视觉感知与量级估计 🧠

在本节课中,我们将学习人类如何估计视觉量级,并探讨如何利用这些知识来设计更准确、更有效的数据可视化。这是关于视觉感知的第三讲,也是最后一讲。

概述

在前两讲中,我们讨论了如何将定量数据映射到视觉属性。理解视觉系统中常见的误判或不准确性,对于设计有效的可视化至关重要。幸运的是,我们可以借鉴大量心理物理学的研究成果。

量级估计的挑战

让我们从一个简单的练习开始。请看下图中的两个圆,并告诉我你对两者面积差异的第一印象是什么?

首先,请写下你的第一印象。然后,再经过更仔细的思考后,写下你认为的数值。请记录下这两个数字。

正确答案是 25。然而,大多数人倾向于回答 16 左右。这个差异揭示了人类在估计面积时存在系统性低估的倾向。

视觉感知的幂定律

视觉感知的幂定律思想在19世纪首次被提出。到了20世纪50年代中期,斯坦利·史蒂文斯通过一系列工作证实并形式化了这一定律。

他的实验结果表明,人类对不同属性的感知估计遵循幂定律,其指数因属性而异:

  • 对于长度的感知,指数接近 1.0,这意味着估计相当准确。
  • 对于面积的感知,指数在 0.6 到 0.9 之间,表明存在一定程度的低估。
  • 对于体积的感知,指数在 0.5 到 0.8 之间,低估现象更为明显。

因此,在上一个练习中,尽管面积的实际差异是25倍,但大多数人感知到的差异更接近16倍(因为 25^0.8 ≈ 16)。

不同视觉属性的估计准确性

基于数十年的心理物理学研究,我们可以对不同视觉属性在量级估计上的准确性进行排序。以下是人类估计量级准确性的列表,从最准确到最不准确:

  • 位置(在同一条基线上):当元素共享一个共同尺度时,人类对位置差异的估计最为准确。
  • 长度:对长度的估计也相当准确。
  • 斜率和角度:准确性略低于长度。
  • 面积:对面积的估计准确性显著下降。
  • 体积:对体积的估计比面积更不准确。
  • 颜色(色相、饱和度、明度):使用颜色来判断量级是最不准确的。

这个排序再次证明,色相、饱和度和明度并不是表示定量数据的好选择。

设计启示:表观量级缩放

那么,如何利用这些知识来设计更准确的可视化呢?制图师们早已掌握了这个问题的答案。

早在20世纪70年代,制图师杰伊·弗兰纳里就通过实验,总结出一套使用面积表示定量信息的经验法则。他们所采用的方法被称为 “表观量级缩放”

这种方法的核心是,在设计时(例如,用圆的大小表示数据值),不是简单地让圆的面积与数据值成线性比例,而是根据幂定律的指数进行调整,使得人眼感知到的大小差异与实际数据差异相匹配。

总结

在本节课中,我们一起学习了人类估计视觉量级的原理和挑战。我们了解到:

  1. 人类对面积和体积的感知存在系统性低估,这由幂定律描述。
  2. 不同视觉属性在量级估计上的准确性存在显著差异,位置长度优于面积体积,而颜色最差。
  3. 通过应用 “表观量级缩放” 等设计原则,我们可以补偿人类的感知偏差,从而创建出更准确、更有效的可视化图表。

理解视觉处理系统的底层机制,并运用这些知识,可以显著提升数据展示的效果。这就是视觉感知研究为数据科学可视化设计带来的核心价值。

083:评估可视化 📊

在本节课中,我们将学习如何系统性地评估一个可视化作品。我们将通过一个分步流程,帮助你判断一个可视化图表是否有效、清晰,并能为观众提供真正的洞察。


概述:评估可视化的步骤

评估一个可视化作品并非简单地判断“好看”或“难看”。它是一个结构化的过程,需要考虑其目的、受众和实际传达信息的效果。接下来,我们将详细介绍这个评估流程的每一步。


第一步:明确目的与受众 👥

在开始评估之前,首先要考虑可视化的目的目标受众

  • 目的:这个可视化是为了教育告知,还是为了探索数据?
  • 受众:观众是普通大众,还是某个领域的专家(例如科学家)?

理解这两点对于判断这个特定可视化的整体价值至关重要。切勿在不了解目标受众的情况下就贸然评价一个可视化作品。


第二步:记录初步反应与详细审视 🔍

首先,记录下你的第一反应。这个图表给你的整体感觉是积极还是消极?对可视化产生情绪反应是正常的,但之后需要退一步,尝试更客观地分析它。

接下来,仔细审视可视化的细节。找出它做得好的地方和不足之处。


第三步:回答关键评估问题 ❓

以下是评估时需要回答的一系列核心问题。每个问题都旨在检验可视化的不同方面。

1. 设计与可理解性

  • 设计是否美观?
  • 是否一目了然? 如果不是,经过短暂研究后能否理解?

2. 价值与洞察

  • 它是否提供了原始数据(文本、表格等)无法提供的洞察或理解? 这一点非常重要。如果可视化仅仅是为设计添加了颜色或将数据做成了饼图,这并不一定使其有价值。一个优秀的可视化应该比纯文本表述增加价值,否则就不是一个好的可视化。

3. 效率与替代方案

  • 与其它可能的可视化方案相比,它是否更好地提供了洞察?或者它是否需要过多的认知努力? 什么样的可视化可能更好?例如,如果有人给了一组多个饼图,需要你比较不同饼图之间的扇形区域,这真的是最好的比较方式吗?用条形图是否同样有效,甚至更好?

4. 数据揭示能力

  • 可视化是否揭示了趋势、模式、数据缺口或异常值?
  • 观众能否进行有效的比较?

5. 重点与上下文

  • 可视化是否在提供上下文的同时,成功地突出了重要信息? 是否从可视化中获得了其他方法无法得到的新信息?重要信息是否被突出显示,而上下文没有被隐藏?

6. 准确性与完整性

  • 它是否扭曲了信息? 如果它以某种方式转换了数据,这种转换是具有误导性,还是起到了有益的简化作用?
  • 它是否遗漏了重要信息?

7. 记忆点与组件使用

  • 它是否令人印象深刻?
  • 它是否正确使用了视觉组件? 即,它是否如我们在之前课程中讨论的那样,恰当地使用了线条颜色位置等元素来表征数据?
  • 它是否正确转换了名义、区间和定量信息?

8. 标注与图例

  • 它是否恰当地使用了标签和图例?

总结

本节课我们一起学习了评估可视化作品的系统化方法。我们从明确可视化的目的和受众开始,然后记录初步反应并进行详细审视,最后通过回答一系列关键问题来全面评判其设计、有效性、准确性和实用性。记住,一个优秀的可视化不仅仅是美观,更重要的是它能清晰、准确、高效地为目标观众传达洞察,其价值应超越原始的数据表现形式。

084:巴罗酒精研究 🧭

在本模块中,我们将探讨伦理与隐私问题。与专项课程中的许多主题一样,这个主题本身足以构成一门完整的课程。但正如我们处理其他主题的方式一样,我们将尝试概述该领域的重要概念。我们将通过现实世界的例子来引出讨论,并对一些特别重要的概念进行技术性深入探讨,以确保您对其使用和应用有直观的理解。我们希望这能激发您的兴趣,鼓励您去选修关于大数据和数据科学伦理与隐私的完整课程,这类课程正开始大量涌现。我们已经对数据库、大规模数据管理系统、机器学习、统计学和可视化进行了类似的处理,现在我们将尝试处理这个主题,挑选我们认为与课程主题相关且我个人感兴趣的内容。

我想从一个相当久远的研究开始,那是1979年在阿拉斯加巴罗进行的一项研究。

巴罗是美国最北端的城市。这是一个乡村社区,从放大的镜头中您可以看到该地区的湖泊。这是一个美洲原住民社区,几千年来一直以捕鲸为生。自第一次世界大战以来,该地在短时间内经历了重大的经济变化。当地原住民领袖和市政官员对社区内的酒精使用及其相关的暴力问题感到担忧,于是邀请了一组社会学研究人员来评估问题并共同制定解决方案。

以下是使用的方法:一个研究团队进入社区,收集了15岁以上人群的代表性样本。不过,我们稍后会提到,他们特别针对了原住民社区。他们采访了受访者对酒精使用的态度和价值观,包括心理历史,并让他们完成了一个先前设计的标准化酒精中毒筛查测试,还要求他们画一幅人物画,旨在确定文化身份。如果您以某种风格绘画,则表明您来自特定社区的视角;如果以另一种风格绘画,则来自另一个特定社区。这是当时被接受的一种方法。

研究结果的具体数字并不特别重要,您可以查阅相关资料,但总体影响是那里的酗酒问题相当严重,酒精的广泛使用和滥用带来了相关问题。

然而,我之所以要提及这项研究,更多是因为其发布方式以及研究进行的整体背景,以此来引出一些伦理考量。具体来说,这项研究的结果以两种形式同时单方面地公开宣布:一份报告被发布,同时举行了一场新闻发布会,面向巴罗社区。关键的是,研究中所反映的部落社区在新闻发布会上也没有代表出席。

这份报告被媒体转载,成为了《纽约时报》的头版新闻,标题为“酒精困扰爱斯基摩人”或“酒精中毒困扰爱斯基摩村庄”。您可以想象其影响。文章中的引述如“实际上正在通过大规模酗酒进行集体自杀,宾夕法尼亚大学的研究人员昨天表示,该村2000名因纽特男女的酗酒率为72%,暴力正成为伤害和死亡的主要原因”。

这项研究对民众的影响是立竿见影的。如果您是巴罗社区或伊努皮亚特部落的成员,您就会与这篇文章中呈现的品牌形象联系在一起,以一种非常公开的方式。

此外,巴罗酒精研究的结果是在远离原住民村庄的地方举行的新闻发布会上公布的,没有任何社区成员在场,更不用说他们的知情或同意,而这些成员本可以提供有关村庄社会经济状况的任何背景信息。

研究结果表明,社区中几乎所有成年人都是酗酒者。除了蒙受耻辱之外,该镇的信用评级也因此受损,进而削弱了部落为急需项目获取资金的能力。这对社区造成了直接的经济损害,即无法获得贷款来进行公共工程项目。

此后出现了一些文章,反映了他们对此事的愤怒以及所遭受的伤害。此外,还有一个微妙的副作用,这也是该研究在医学和社会学伦理界如此知名、常被引为例证的原因之一:研究本身在原住民中声誉不佳,不仅在这个地区,而且在很大程度上是因为这项研究及其他类似研究。因此,研究被描述为“可能是土著世界词汇中最肮脏的词语之一”。

理解这里出了什么问题非常重要。关于这项具体研究,我想提出几个要点。

085:巴罗研究案例与伦理考量

在本节课中,我们将通过一个具体的研究案例——巴罗研究,来探讨数据科学实践中的伦理问题。我们将分析该研究在方法论和伦理上的缺陷,并讨论如何避免类似的错误,以及为什么伦理考量是数据科学家工具箱中不可或缺的一部分。


研究中的方法论问题

上一节我们提到了数据科学中伦理的重要性,本节中我们来看看一个具体的反面案例。巴罗研究在方法论上存在明显问题。

一个技术咨询小组(这类研究项目中通常要求设立)曾多次表示担忧,即研究只调查了本地居民,而没有将镇上的外来人员纳入研究范围。

此外,研究试图在“醉酒频率”与“基于关联的被拘留概率”之间建立联系。例如,如果某人通常会被送进监狱,研究者就可以推断其醉酒程度。这种关联至少对一些人来说是没有意义的,并因此受到了严厉的批评。

回到第一点,即只研究了本地居民。这种方法论表明,研究者在设计研究时可能已有一个预设的结论,并围绕证实该假设来设计研究。因此,这里可能存在确认偏误的渗入。

超越方法论的伦理伤害

以上是方法论问题。但这里我想讨论的更微妙的一点是,参与者自始至终都无法控制自己的数据,也无法控制数据被呈现的上下文

正如我提到的,你可以证明具体且重大的伤害,包括社会污名化,甚至是明确且现实的财务困难。

如何避免此类问题?

那么,如何避免这种情况呢?如今,当我们思考大数据和隐私时,常听到的是确保不泄露任何个人可识别信息,我们稍后会讨论实现这一点的技术。

但在巴罗研究的案例中,并没有泄露个人可识别信息,对吗?然而,那些根本没有参与研究的人也受到了伤害,仅仅因为他们与被研究的群体有关联——无论是作为该群体的成员、来自那个小镇,还是来自那个部落。

因此,试图将这些隐私问题简化为一个待解决的技术问题,并证明某件事是安全或不安全、私密或不私密、泄露或未泄露,我想说服你,这种思路是不充分的。

这正是为什么伦理研究是任何数据科学家工具箱中的重要组成部分。因为必须考虑哪些研究应该做,哪些不应该做。在某个时间点,你需要决定参与哪些项目,你需要具备那种伦理上的“第六感”,在决定项目时能“嗅到”伦理问题。在项目进行过程中,你也必须思考你的行动可能引发何种危险信号,以及谁可能因此受到伤害——即使独立于那些形式上的保证。

仅仅因为你能做某事,并不意味着你应该做。这目前还不是数据科学讨论中的常见部分,但正变得越来越重要,这也是我们在本课程中至少包含一些最低限度讨论的原因。

核心要点与过渡

以下是本案例的核心要点:

  • 群体性伤害:即使没有人真正违反规则,整个群体的人也受到了伤害。
  • 伦理指南的重要性:这正是为什么伦理指南变得越来越重要。

在下一节中,我们将探讨两个相关主题:一是我们正在讨论的伦理考量中的社会成分,体现为各种组织制定的行为准则;二是技术成分,我们将讨论关于隐私可以做出哪些形式上的保证。


本节课中,我们一起学习了巴罗研究案例,它揭示了数据科学项目中可能存在的确认偏误和对参与者上下文控制的缺失,导致了广泛的群体性伤害。这强调了技术解决方案(如匿名化)的局限性,以及培养伦理意识和遵循行为准则的至关重要性。

086:行为准则 📜

在本节课中,我们将探讨数据科学伦理中的一个核心议题:是应该依赖宽泛的原则,还是制定具体的规则。我们将通过分析几个专业组织的行为准则,来理解如何在实际工作中应用伦理考量。


概述

伦理讨论通常围绕“原则”与“规则”展开。原则是宏观的指导方针,而规则是具体的行为禁令。本节将论证,在数据科学领域,基于原则的行为准则比僵化的规则更为有效和实用。我们将审视三个代表性行为准则,并分析它们如何帮助我们识别和避免伦理陷阱。


原则与规则之辩

在一般伦理讨论中,一个核心议题是应更侧重于原则,还是更侧重于规则。

原则是宏观的指导方针,但通常不具体规定特定行为。
另一些人则认为,正确做法是制定一套不应违反的明确规则,遵守这些规则即构成伦理行为。

我个人强烈倾向于原则。因为一旦陷入规则,我们就需要讨论形式化保证和数学证明。我们稍后会探讨这种方法的局限性。如果放弃形式化保证,那么立法式的规则在我看来并无额外效力。

因此,声明并认同我们应遵守的原则,并以行为准则的形式将其记录下来,我认为是正确的方法。这样做是在诉诸人们对此类主题的信念,而非试图控制其行为。

以B案例为例,它很好地说明了这一点。当时被违反的实际上是伦理原则,而他们基本遵循了当时的规则。后来制定的关于如何处理私人数据的许多规则,在当时并未被违反。但在整个过程的多个环节中,确实存在伦理原则的违反,例如将自身需求和利益置于研究对象、客户和社会利益之上。我们即将简要查看的行为准则中,确实包含反对此类做法的建议。


审视行为准则

接下来,我们将考虑三个行为准则。有趣的是,这并非刻意挑选的结果,而是试图找到所有由代表数据科学社区的组织发布的行为准则列表。我不敢声称这个列表是详尽的,新的准则随时可能出现,我也可能遗漏了许多。但总体而言,这类准则并不多,也没有一个被所有人一致认同的单一准则,这也是其数量不多的原因——这个领域仍处于早期阶段。

需要指出的是,列表中的第一个——美国统计协会的准则——并非来自纯粹的数据科学组织。这份伦理准则存在时间更长,从其内容可以看出其成熟度更高。因此,一个可以提出的问题是:我们是否需要一份独立于统计学家的、专门针对数据科学的行为准则?无论你认为是否需要,了解至少这三份准则,思考它们强调的重点和赋予不同方面的权重,都是有益的。对我而言,准备这些要点很有启发性,相信对你们通过本讲座了解它们也会有所帮助。


1. 美国统计协会行为准则

我们要看的第一份准则是美国统计协会的行为准则。其顶层结构如下:首先是关于专业素养,其余部分则按对不同方的责任进行划分。

以下是其主要章节:

  • 对资助者、客户和雇主的责任
  • 对出版物和证词的责任
  • 对研究对象的责任
  • 对研究团队同事的责任
  • 对其他统计学家或统计从业者的责任
  • 对所在领域及整个社区的责任
  • 关于不当行为指控的处理
  • 对统计师雇主的责任(此处指雇主自身的责任,而非你对雇主的责任)

我非常喜欢这种划分方式。我们将看到其他几种划分空间的方式,但我觉得那些更模糊。具体思考参与项目各利益相关方,并在每一步都考虑他们的需求和权益,是思考伦理问题的正确方式。

以下,我将展示部分内容,有些是转述,有些是原文引用。我们不会逐条阅读每一页,因为你可以自行上网查看。我的目的是确保你在观看视频时能接触到它们,并提供一个审视和阅读它们的契机。同时,我会重点强调那些我认为相关、或者在B案例中可能被违反的条款。

第一节:专业素养
这与许多专业工程学会的行为准则非常相似,即关于如何正确开展工作。例如,确保统计分析的相关性、保持实践技能的更新、具备一定水平的专业知识、仅使用适合数据的方法论等。

我用蓝色高亮的一条是:“警惕调查者或数据提供者的先入之见可能预先决定分析结果的可能性。”我认为这一点在统计学或数据科学中比在工程学中更为独特,并且在B案例中可能具有相关性。在该案例中,抽样程序、结果呈现方式以及部分方法的选择,似乎都带有特定的预期结果,即研究对象的民族和文化身份将与某些行为(如饮酒)的使用相关联。带着这种先入之见进行研究是相当危险的。我并非声称我们有确凿证据证明这一点,但我认为可以就此提出一个强有力的论证。

其他条款还包括:尊重贡献和知识产权、披露利益冲突等。最后一条也很有趣:“专家证词应给予与经过严格同行评审的研究同等水平的严谨性。”这意味着,当你为科学文献添砖加瓦时,你需要跨越重重障碍;但如果你只是在向雇主汇报结果,比如通过PPT演示,你或许可以稍微放松严谨性。而此处的要点是:你不应该这样做

这些事情,就像所有伦理话题一样,有些是显而易见的。但围绕它们构建语言,将其作为一份可供人们阅读和内化的文件,以至于人们也开始使用这种语言,这很重要,即使基本理念本身可能有些显而易见。


2. 数据科学协会行为准则

上一节我们介绍了美国统计协会以利益相关方为核心划分的详细准则。现在,我们来看看数据科学协会的准则,它采用了不同的组织框架。

数据科学协会的准则结构如下:

  • 持续教育并提升数据科学能力
  • 以专业和尊重的方式代表数据科学领域
  • 尊重隐私、保密和匿名
  • 了解并遵守所有相关法律
  • 以合乎道德且对社会负责的方式开展数据科学工作
  • 诚实、清晰和彻底地沟通
  • 在数据科学工作中保持客观
  • 尊重并适当承认他人的工作和贡献
  • 保护并维护他人的数据
  • 鼓励和支持其他数据科学家

这份准则更侧重于个人行为和专业实践。它强调持续学习、尊重他人、遵守法律以及对社会负责。其中,“以合乎道德且对社会负责的方式开展数据科学工作”是一条核心原则,它要求从业者超越技术层面,思考其工作的广泛影响。


3. 数据与社会科学行为准则

最后,我们来看一份由学术界发起的准则——数据与社会科学行为准则。它试图弥合数据科学与社会科学的伦理传统。

这份准则围绕几个核心承诺展开:

  • 尊重个人与社区:认识到数据背后是人,研究应致力于改善人类状况。
  • 促进正义与公平:警惕算法偏见,努力确保数据分析不会加剧社会不平等。
  • 确保透明与可重复性:方法论和过程应尽可能透明,以支持同行评审和知识积累。
  • 承担社会责任:考虑研究对社会的潜在影响,并对其负责。

这份准则的独特之处在于其强烈的社会导向。它明确将数据工作与社会价值(如正义、公平)联系起来,要求从业者积极思考其工作的社会后果,而不仅仅是技术正确性。


总结

在本节课中,我们一起学习了数据科学伦理中“原则”与“规则”的辩证关系。我们论证了基于原则的行为准则因其灵活性和对内在信念的诉诸而更具实用性。通过具体分析美国统计协会、数据科学协会以及数据与社会科学三份行为准则,我们看到了伦理考量的不同组织框架和侧重点:从利益相关方责任,到个人专业操守,再到广泛的社会影响。这些准则共同为我们提供了识别伦理风险、指导负责任实践的重要语言和思维工具。记住,伦理不是一份简单的检查清单,而是一个需要在整个数据科学项目生命周期中持续进行批判性反思的过程。

087:对利益相关者的责任 📋

在本节课中,我们将学习美国统计协会(ASA)伦理准则中关于数据科学家对资助者、客户、雇主以及研究对象的责任。这些原则是确保数据科学工作诚信、可靠且对社会负责的基础。


上一节我们介绍了伦理准则的总体框架,本节中我们来看看数据科学家对两类关键利益相关者的具体责任。

对资助者、客户和雇主的责任 💼

数据科学家在与资助方、客户或雇主合作时,需遵循以下核心原则。

以下是关键的责任条款:

  • 提供选择:在适当情况下,向客户或雇主提供在范围、成本或精度上可能不同的替代性统计方法选择。这在“巴罗研究”案例中具有参考意义,因为研究者最初只采用了一种特定方法,而邀请他们进行研究的相关方对该方法表达了担忧。如果当时提供了多种方案供利益相关者选择,或许可以避免一些问题。
  • 明确资质:清晰陈述自身在不同角色上的资质。
  • 科学应用:科学地应用统计抽样和分析程序,不预先决定结果。有证据表明,“巴罗研究”可能事先设想了某种结果,这影响了其方法设置。
  • 保护机密信息:保护雇主、客户或资助者的特权信息。虽然研究数据本身得到了适当保护,但研究结果也可被视为特权信息。保护这些信息意味着需要审慎决定何时、何地以及如何向公众公布,而“巴罗研究”在这方面采取了相当激进的方式。

理解了对外部合作方的责任后,我们接下来关注研究中最直接的参与者——研究对象。

对研究对象的责任 👥

保护研究对象的权益和福祉是数据科学伦理的重中之重。

以下是必须遵守的关键责任:

  • 遵守审查规定:充分理解并应用保护人类受试者的规则。在大学环境中,这通常指机构审查委员会(IRB)。商业领域也有类似的审查委员会,尽管约束力可能稍弱。遵守这些规则至关重要。
  • 考虑所有伦理问题:考虑所涉及的所有其他伦理问题。这是一项宽泛但重要的要求,它提醒我们在研究中必须停下来深入思考。
  • 避免使用过多或过少的受试者:使用足以确保结果统计有效性的受试者数量,但不要超过。当涉及人类受试者时,收集数据本身就会带来成本,不仅是他们的时间,还可能涉及隐私和压力。
  • 避免过度风险与负担:避免让研究对象承受过度的风险,并避免过度占用他们的时间和侵犯其隐私。在“巴罗研究”中,可能存在未被充分考虑到的过度风险。
  • 预见数据的二次使用:预见数据(或更确切地说是研究结果)的二次和间接用途。例如,利用研究结果来销售文章或报纸,这是一种二次使用,可能有助于科学家职业生涯的发展,但其中涉及的潜在危害也应被考虑。
  • 确保独立的伦理审查与持续监督:确保研究方案经过独立的伦理审查,并对研究进行持续监督。在大型研究中,通常设有专门的伦理官员。在小型数据科学团队中,即使没有明确设立该职位,团队内部也应讨论由谁来代表伦理考量,并可能指定专人承担此角色。


本节课中我们一起学习了ASA伦理准则中关于对资助者、客户、雇主以及研究对象的核心责任。关键点在于:提供透明的选择、科学客观地开展工作、严格保护机密信息,并始终将研究对象的权益、隐私和安全置于首位。将这些原则付诸实践,是每一位负责任的数据科学家的基本素养。

088:其他行为准则

在本节课中,我们将学习数据科学领域内,除了数据隐私和算法公平性之外的其他重要行为准则。我们将重点探讨美国统计协会、数据科学协会以及认证分析专业人士等组织提出的伦理规范,并理解它们如何从不同利益相关者的角度来构建伦理框架。

上一节我们讨论了数据隐私和算法公平性的核心伦理问题。本节中,我们来看看数据科学家在更广泛的工作场景中应遵循的其他行为准则。

📜 美国统计协会行为准则

美国统计协会的行为准则非常成熟和全面。它没有停留在宽泛的伦理原则上,而是针对统计分析的具体场景提出了具有实际指导意义的条款。该准则的一个显著特点是,它按照可能受到影响的不同利益相关方来组织条款,这有助于我们更清晰地思考自身行为的影响。

以下是该准则中针对不同群体的责任概述:

  • 对研究团队同事的责任:需要确保跨学科的同事了解统计伦理的相关方面。如果你没有将某些伦理考量传达给使用你方法的人,那么这种沟通缺失本身就可能违反伦理。
  • 对统计同行的责任:在评审他人论文、工作或进行绩效评估时,应确保公平、恰当。评估的重点应是方法本身,而非个人。同时,应乐于为他人提供培训机会。
  • 对雇主及组织的责任:准则特别强调了雇主需要认识到,有效的统计研究结果无法保证符合资助方的预期。这一点至关重要,因为它触及了多年来因发表偏倚而产生的利益冲突问题。例如,一个公司可能资助20项研究,但只公布结果对其有利的那一项。

该准则将雇主责任与其他利益相关方责任并列,体现了对这一问题的高度重视。

🔄 数据科学协会行为准则

接下来,我们快速浏览数据科学协会的行为准则。与ASA的准则相比,它尚不成熟,但其强调的重点有所不同,值得关注。

以下是该准则的主要类别及其特点:

  • 术语与定义:对核心概念进行界定。
  • 专业能力:与ASA准则一样,强烈强调专业能力的重要性。
  • 法律、客户要求与伦理的冲突:明确指出了法律要求、客户指令与伦理考量之间可能存在的张力。例如,收集某些数据可能在未来被依法传唤,这将使数据科学家陷入法律、客户利益和伦理的三难困境。
  • 与客户的沟通:明确将“与客户保持持续沟通”作为一个独立类别,反对“接受问题后闭门造车,最后直接抛出结果”的工作模式。
  • 保密信息与利益冲突:涵盖了数据保密和避免利益冲突的常见原则。
  • 科学诚信:提出了关于保持科学诚信的通用原则。

总体而言,该准则试图按主题分类,但相比ASA按利益相关方分类的方式,其结构略显模糊。

🎯 认证分析专业人士行为准则

最后,我们提及认证分析专业人士的行为准则。与数据科学协会的准则类似,它不一定代表整个数据科学界,但作为一份公开的伦理声明,值得我们了解。

该准则与ASA准则有一个重要的共同点:它们都强调关注所涉及的各方以及他们可能如何受到损害。ASA准则在这方面做得更详尽、更清晰。这给我们一个关键启示:在思考行为准则时,应系统性地思考你的工作涉及哪些利益方,他们的利益是什么,以及你的工作可能以何种方式损害他们,并思考如何尽力满足各方的合理利益。


本节课中我们一起学习了数据科学领域内多个组织提出的行为准则。我们重点分析了美国统计协会按利益相关方构建的、具有实际操作性的伦理框架,并对比了数据科学协会和认证分析专业人士准则的不同侧重点。核心收获是,一个有效的伦理准则应帮助从业者系统地识别工作影响的各方,并以此指导负责任的实践。

089:HIPAA 🏛️

在本节课中,我们将探讨如何将伦理原则具体化为成文规则,并以著名的HIPAA(健康保险携带和责任法案)为例,分析其核心规则、实际应用中的挑战,以及它与更广泛的伦理准则之间的关系。

上一节我们介绍了作为伦理原则具体化的行为准则。本节中,我们来看看另一种将伦理考虑制度化的方式:具体的成文规则。

成文规则概述

行为准则主要通过概括性的行为原则来体现伦理考量。尽管其中也包含一些具体规则,但总体而言,它们处于较高的抽象层面。与此同时,也存在一些更为具体的成文规则。

以下是两个知名的成文规则示例:

  • HIPAA:该法案立法规定了应如何处理敏感的患者医疗数据。
  • FERPA:这是一套关于学生数据(如成绩、个人信息等)的规则。例如,根据FERPA,我不被允许将你的成绩通过电子邮件发送给外部各方,或以其他方式公开它们。

HIPAA 规则详解 🩺

HIPAA因其与众多领域工作者相关,值得在此层面进行了解。它主要包含两条核心规则。

安全规则旨在防止未经授权的各方访问数据。其核心目标是防范外部入侵。

隐私规则旨在防止我在此所称的“不当授权”。这意味着,虽然你授予了某人访问权限,但本不应如此。这与安全规则防范无人授权访问的情况不同。

在本课程中,我们不会过多讨论安全,但将重点探讨隐私问题。

HIPAA 的局限性与挑战 ⚖️

我之所以在此提及HIPAA,并对其持保留态度,是因为它存在一些局限性。HIPAA并未规定任何形式的形式化保证,因此在某些方面留下了模糊性,在其他方面则可能难以实现。

这导致可能出现以下问题:

  • 易于满足法律条文但违背规则精神:可能存在表面上遵守法律,但实际上违反了规则初衷的情况。
  • 实施困难:试图构建一个符合HIPAA的系统非常困难,因为很难精确定义“合规”究竟意味着什么。
  • 存在规则漏洞:我认为,这些漏洞通过行为准则可以得到更好的覆盖。

规则、准则与形式化保证的平衡 ⚖️➡️🔬

因此,我的观点是,两个极端层面尤为重要:

  1. 我们能够做出的形式化保证(这将是下一节的重点)。
  2. 指导我们行为的通用行为准则

试图在中间地带通过法律来运作,往往效果不佳,并可能产生以下不良后果:

  • 扭曲的激励
  • 规则存在漏洞
  • 规则被不必要地应用

例如,在HIPAA框架下,存在患者难以获取自身数据以提供给研究人员的情况。即使患者的明确目标是希望自己的数据能帮助尽可能多的研究者,从而可能改善其(例如绝症的)治疗结果,但HIPAA的相关规则反而使这一过程变得更加困难。这显然不是HIPAA规则的初衷,但却是可能发生的现实。

课程总结与过渡 🔄

本节课中,我们一起学习了成文规则(以HIPAA为例)如何尝试将伦理原则具体化,并分析了其在实践中的挑战与局限性。我们看到,仅靠具体的法律条文可能不足以全面保障数据隐私与伦理。

因此,接下来我们将探讨如何形式化地定义隐私问题,并尝试理解其内在的局限性。这将帮助我们建立更坚实、可验证的隐私保护基础。

090:初步尝试 🔒

在本节课中,我们将探讨数据科学中的隐私保护技术。我们将从社会伦理规范转向技术层面的隐私保证,并重点介绍几种主要的技术方法及其局限性。

上一节我们讨论了以行为准则形式体现的社会伦理与隐私问题。现在,我们来看看技术层面能为隐私保护提供何种保证。

技术性隐私保护方法概览

以下是几种主要的隐私保护技术分类:

  • 访问控制:仅允许特定人员或在特定情况下访问数据。
  • 查询限制:不直接提供数据,而是通过API提供访问,并谨慎控制用户可以提出的问题类型。
  • 数据扰动:向数据中添加噪声,以混淆真实信号,防止某些特定问题被准确回答。
  • 安全多方计算:这是密码学的一个子领域。例如,同态加密允许你在加密数据上执行计算并获得结果,而无需解密数据本身。
  • 匿名化:尝试擦除数据中的特定信息,以防止某些问题被回答。

我们将重点讨论访问控制匿名化这两个方面,并解释为何它们最值得关注。

实践中的隐私保护尝试

为了使概念更具体,请思考在实践中如何保护隐私。我们可以控制信息本身的访问、通过API控制信息流,或者在发布数据时尝试控制信息的使用目的。

以下是几种常见的实践方法:

  • 移除标识符:直接删除如姓名、身份证号等直接标识信息。
  • 实现k-匿名性:确保数据集中,任何查询都无法将一条记录与至少 k-1 条其他记录区分开来。这为个体在至少包含 k 个成员的集群中提供了匿名性。公式表示为:对于任意记录,其所在的等价类大小 ≥ k
  • 发布代表性样本:仅发布整体数据的一个子集,供人们研究。

这些方法试图在个体隐私数据集整体效用之间取得平衡。然而,我的观点是:这些方法都无法绝对保证隐私。接下来我们将探讨原因。

深入理解k-匿名性

首先,为确保你理解k-匿名性,我们简要介绍其核心思想。虽然它引发了大量研究,但最终被证明是一个相当脆弱的概念。

k-匿名性旨在确保无法定位到特定记录,而是将记录保持在至少包含 k 个相似或不可区分记录的集群中。主要有两种实现工具:

  • 抑制:用特定符号(如星号 *)替换标识信息,即将其从数据集中删除。
  • 泛化:将具体值替换为一个范围或类别。

假设我们有一个包含以下字段的数据集:姓名年龄性别宗教医疗状况所在州

为了保护隐私,我们可能会:

  1. 抑制 姓名宗教 字段(用 * 代替)。
  2. 年龄 泛化为范围(例如 >30≤30),使其不再能作为唯一标识符。

通过应用这些技术,我们可能得到一个看似匿名的数据集。但请注意,即使经过处理,所在州疾病 的组合仍可能唯一识别出个人。这引出了k-匿名性的根本弱点:它通常无法抵御背景知识攻击多数据集关联攻击

本节课中,我们一起学习了技术性隐私保护的几种主要思路,特别是访问控制和匿名化方法,并重点剖析了k-匿名性的基本概念及其内在局限性。我们了解到,简单的标识符移除或数据泛化并不足以构成强大的隐私保证。在后续课程中,我们将探讨更强大的隐私定义和技术。

091:隐私泄露示例 🔍

在本节课中,我们将通过两个著名的案例,学习高维稀疏数据如何导致隐私泄露。我们将探讨其背后的核心原理,并理解为何简单的匿名化处理(如移除姓名)往往不足以保护用户隐私。

概述

我们将分析两个经典案例:Netflix电影评分数据集和AOL搜索记录数据集的隐私泄露事件。这两个案例揭示了数据科学中一个关键问题:当数据维度极高且稀疏时,即使移除了直接的个人标识信息,通过与其他公开数据集进行关联分析,个体的身份仍然可能被重新识别。

高维稀疏数据的特性

上一节我们介绍了隐私泄露的概念,本节中我们来看看导致泄露的核心技术背景:高维稀疏数据。

在数据集中,每一列代表一个特征(例如一部电影或一个搜索词)。当特征数量(即维度)非常庞大时,数据集会呈现出“稀疏”的特性。这意味着对于任何一个数据点(例如一个用户),其大部分特征值都为零或为空。例如,在电影评分数据中,一个用户只可能对少数电影进行过评分。

这种现象源于“维度灾难”:随着维度增加,数据点在高维空间中的分布会变得极其分散,彼此之间的相似度会急剧下降。用公式来描述,两个用户uvd维空间中的相似度会随着d的增大而趋近于零:

相似度(u, v) ≈ 0 当 d → ∞

因此,在高维空间中,几乎不可能找到两个完全相似的用户记录。这种独特性使得每条记录都像一个“指纹”,为重新识别个体身份创造了条件。

Netflix数据集去匿名化案例

理解了高维数据的特性后,我们来看第一个具体案例:Netflix电影评分数据集的去匿名化。

Netflix曾发布一个匿名化的用户电影评分数据集,旨在举办推荐算法竞赛。数据集移除了用户的姓名等直接标识信息,只包含用户ID和他们对电影的评分。

然而,一篇研究论文指出,这个数据集可以被去匿名化。其原理正是利用了数据的高维度和稀疏性。

  • 数据维度高:数据集包含成千上万部电影(列),每个用户(行)只对其中一小部分电影进行了评分。
  • 数据极度稀疏:由于电影数量巨大,任意两个用户拥有完全相同评分记录的概率极低。研究表明,在该数据集中,没有两条用户记录的相似度超过50%。

攻击者如何利用这一点呢?以下是关键步骤:

  1. 攻击者拥有另一个公开的数据源(如IMDb互联网电影数据库),其中包含了一些用户的真实身份及其公开的电影评分信息。
  2. 攻击者将Netflix中的匿名用户记录与公开数据源中的记录进行匹配。
  3. 由于高维稀疏性,一旦在公开数据源中找到某条记录与匿名记录的相似度达到一定阈值(例如接近50%),就有极大概率确定这两条记录属于同一个人。
  4. 通过这种关联,匿名用户的身份便被成功识别。

AOL搜索记录泄露案例

看完了基于评分的案例,我们再来看一个基于文本搜索的更直观的例子:AOL搜索记录泄露事件。

AOL曾出于研究目的发布了一批经过“匿名化”处理的用户搜索查询记录,其中移除了用户名等直接信息。然而,研究人员在极短时间内就成功识别出了其中一些用户的真实身份。

以用户4417749为例,其搜索历史包含以下内容:

  • “利尔本市(佐治亚州)的园林设计师”
  • 多个姓氏为“阿诺德”的人名
  • “佐治亚州格威内特县影湖小区房屋出售”

即使没有复杂算法,人类也能根据这些搜索词进行推断:这位用户很可能住在佐治亚州利尔本或格威内特县附近,并且姓氏可能是“阿诺德”。攻击者正是结合了公开的电话簿等数据,通过地理位置和姓氏筛选,迅速锁定了特定个体。

这个案例同样包含了导致隐私泄露的两个核心要素:

  1. 高维稀疏数据集:搜索查询词构成了一个极高维度的特征空间,每个用户的搜索组合几乎是独一无二的。
  2. 辅助的公开数据集:通过结合电话簿等公开信息,可以将匿名记录中的模式与真实世界中的个体进行关联匹配。

总结

本节课中我们一起学习了隐私泄露的机制。通过Netflix和AOL两个案例,我们认识到:

  • 高维稀疏数据本身具有极强的可区分性,每条记录都像独特的指纹。
  • 简单的匿名化(如移除姓名、ID) 对于保护这类数据的隐私是远远不够的。
  • 隐私泄露通常发生在结合多个公开数据集进行关联分析时。
  • 数据科学家在处理用户数据时,必须超越简单的匿名化,考虑使用差分隐私数据脱敏合成数据等更高级的隐私保护技术。

理解这些原理是负责任地进行大规模数据科学实践的第一步。

092:形式化隐私问题 🔒

概述

在本节课中,我们将探讨数据科学中的隐私问题。我们将通过一个真实案例,理解为何简单的数据匿名化方法容易失效,并尝试形式化地定义隐私保护的目标与挑战。


一个案例:马萨诸塞州州长的医疗记录被识别

上一节我们讨论了数据隐私的一般性问题。本节中,我们来看一个具体案例,它揭示了传统匿名化方法的脆弱性。

拉塔尼亚·斯威尼(Latania Sweeney)进行了一项研究。她首先提出了k-匿名性条件,并对此进行了初步尝试。她试图证明,当时马萨诸塞州团体保险委员会发布的一份关于州雇员的匿名医疗数据(记录了每个人的每次医院就诊信息)是无效的。她想表明,这种匿名化完全无效,要破解它并不困难。

为了证明这一点,她利用了关于马萨诸塞州州长的公开信息。这位州长居住在麻省剑桥市,一个居民不多、只有七个邮政编码的城市。斯威尼花费20美元,从剑桥市购买了完整的选民登记册。这个数据库包含了每位选民的姓名、地址、邮政编码、出生日期和性别等信息。

在剑桥市,只有六个人与州长共享出生日期(这也是公开信息)。在这六人中,只有三人是男性。而在这三名男性中,只有他一人居住在他的邮政编码区域内。

在这个案例中,数据维度实际上相对较低,并不需要查看太多不同的字段。但通过利用公开数据源并结合这些不同的数据集,斯威尼很快就能确定这个人的身份。她将包含其完整医疗历史和就诊记录的信息发送给了他,以证明这一点。

在后续的一些工作中,她进一步表明,邮政编码、出生日期和性别这三项信息,就足以唯一识别大约87%的美国人。因此,识别个人身份并不总是需要高维数据。


隐私泄露的常见特征与现有方法的局限

正如我们所说,与隐私泄露相关的两个反复出现的特征是:高维数据独特个体,以及结合多个数据集来重新识别这些个体

以下是现有隐私保护方法面临的主要挑战:

  • 大多数我们提到的方法,甚至只是简要提及的,都没有解决这两个问题。它们不能很好地处理高维数据(尽管可以找到一些处理这个问题的论文)。
  • 更重要的是,这些方法对于如何应对结合多个公开数据集的情况,没有太多有效的建议。

原因在于这很难控制。如果你试图设计一个系统或形式化方法来证明隐私保证,你通常需要考虑你的数据、数据的接收者,以及试图进行不当行为的攻击者。但这更像一个封闭系统。如果你必须考虑所有可能的数据、所有你未设计或未控制的其他系统,这个问题就变得有些难以处理。

然而,现实情况是,攻击者确实可以访问这些公开信息。因此,任何不考虑这些因素的方法都不是特别有用。这一点在一段时间后逐渐被理解。


精确地思考隐私问题

接下来,让我们更精确地思考这个问题。这张幻灯片改编自普渡大学克里斯汀·塔斯克(Christine Task)的讲义,我认为它很好地设定了讨论框架。

我们有一个感兴趣的人群,位于左侧。然后有各种数据源。这些数据源可能是发放的调查问卷,也可能不是。它们可能是为各种目的收集的数据,例如你登录过的不同网站(你向每个网站提供了不同的信息),或者一个是你的医生,另一个是谷歌。这些是不同的数据源,它们拥有你身份的不同方面。

然后,存在一个聚合数据集,它可能有权访问所有这些不同的数据源。我们希望对这个聚合数据进行一些私有化分析,产生一些结果,并与公众分享这些结果。

我们希望保证,或者说我们希望推断,公众随后能从这些结果中推导出关于原始数据源的什么信息,以及他们能推导出关于你的什么信息,他们能学到什么样的信息。这就是我们所处的背景。

我们将使用以下符号:

  • P 表示整个感兴趣的人群。
  • IP 的一个子集,代表参与这些数据源的人。有些人从未登录过网站,从未参与过调查,从未做过任何事情,他们属于 P 但不一定属于 I
  • Dᵢ 是一个特定的数据集或数据源,其中 i 属于 I
  • 集合 Dᴵ 是所有 i 属于 IDᵢ 的集合。这仅仅是所有数据集的汇总。
  • 然后我们说,查询函数 Q 作用于 Dᴵ,写作 Q(Dᴵ) = R,产生某个结果 R

如何定义隐私问题?

有了上述符号,我们如何定义隐私问题呢?

第一次尝试:可以这样想,如果某个可疑公司拥有我的数据,但他们能向我保证,对于任何其他人可能提出的查询,我提供给该公司的数据都不会影响那些查询的结果。换句话说,如果提供我的数据永远不能改变结果,那么对我没有伤害,我也不介意分享数据。

你可以这样形式化这个条件:对于查询 Q,在没有我的数据时得到的结果,与包含我的数据时得到的结果完全相等。
Q(Dᴵ \ {i}) = Q(Dᴵ)

那么,这个条件可能实现吗?答案是否定的。因为如果我的数据没有影响,那么通过归纳法,任何人的数据都不会有影响,结果将是毫无用处的。如果这个条件成立,那就意味着你可以不断地将人们从数据中移除,并应用相同的等价表达式,直到数据集中没有任何人、没有任何数据为止。显然,你感兴趣的查询必须在空数据集上返回与在任何任意数据集上相同的结果。你无法定义任何能实现这一点的有趣查询。你只能进行常量值查询。实际上,你无法计数、无法聚合、无法做任何有用的事情。因此,这是无法实现的。

另一种表述:如果统计结果 S 的发布,使得确定私有信息的值比在没有访问 S 的情况下更准确,那么就发生了信息披露。这是1977年提出的一个用于保护私有数据的定义。但在我们描述的背景下,不难证明这也是不可能实现的。


总结

本节课中,我们一起学习了数据隐私的核心挑战。我们通过马萨诸塞州州长的案例,看到了结合低维公开数据即可破解匿名化的现实。我们形式化地描述了数据源、聚合与分析的过程,并探讨了两种早期定义隐私保护目标的尝试(“数据不影响结果”和“不增加推断准确性”),发现它们在提供有用分析结果的前提下都是无法实现的。这为后续寻找更实用的隐私保护模型(如下节课可能介绍的差分隐私)奠定了基础。

093:差分隐私定义

在本节课中,我们将学习差分隐私的核心定义。我们将探讨为何早期对隐私的严格保证难以实现,并最终理解差分隐私如何通过数学公式提供一个实用且强大的隐私保护框架。

上一节我们讨论了强隐私保证的局限性,本节中我们来看看差分隐私如何提供一个更可行的解决方案。

第二次尝试的失败

我们首先回顾第二次隐私保证尝试的逻辑。其目标是:即使研究结果R被公开发布,攻击者也无法从中发现关于我的任何新隐私信息。用概率表示,即:

P(发现我的秘密 | 发布结果R) ≈ P(发现我的秘密)

这意味着,知道研究结果R,并不会显著提高攻击者猜中我个人秘密的概率。然而,这个目标也难以实现。

以下是原因:

  • 如果研究结果R揭示了整个群体的某种强趋势(例如,“所有男性患心脏病的概率高于女性”),那么即使我没有提供个人数据,只要攻击者知道我是男性,他就能以高概率推断出关于我的信息。
  • 以阿拉斯加巴罗镇的研究为例。攻击者只需知道某人来自巴罗镇,再结合研究结果,就可能推断出关于此人的信息,即使此人从未参与研究。
  • 更精确地说,问题在于:P(我的秘密 | 群体秘密) 总是大于 P(我的秘密)。而研究结果R可能就包含了关于群体的秘密。

因此,第二次尝试也失败了。其他例子还包括:如果研究显示红肉致癌,而你的保险公司知道你的饮食习惯,那么即使你未参与该研究,保险公司也可能推断你患癌风险增加,从而侵犯你的隐私。

转向差分隐私的思路

既然我们无法保证攻击者完全无法从结果中学习新信息,也无法保证个人数据完全不影响结果(否则结果将毫无用处),那么我们应该承诺什么?

关键在于:承诺个人参与研究不会对最终发布的结果产生“太大”影响。如果无论是否包含你的数据,某个结果R出现的概率都大致相同,那么你提供数据就没有额外的害处。

这一点至关重要。任何研究,即使有各种技术保证,仍可能对人们造成伤害(如巴罗镇的污名化和经济影响)。但是,如果我们能保证你的参与本身不会带来“额外的”伤害(即相比研究结果本身必然造成的伤害,你的参与并未增加新的风险),那么从个人角度看,参与就是安全的。

这引出了差分隐私的核心思想:它是一种数据收集者对数据集中个体的保证

差分隐私的正式定义

差分隐私保证:经过噪声处理的公开发布结果,其成为某个特定结果R的概率,在包含你的数据和不包含你的数据两种情况下,大致相同。

我们可以更精确地表述。设:

  • D 为包含所有个人数据的完整数据集。
  • D' 为移除某个特定个人(例如“你”)数据后的数据集。
  • M 是一个随机化的算法(查询机制),它对数据集进行处理并输出一个结果。
  • R 是算法输出的任意一个可能结果。

对于所有可能的数据集 DD',以及所有可能的输出结果 R,差分隐私要求满足以下条件:

P[M(D) = R] ≤ e^ε * P[M(D') = R]

其中 ε (epsilon) 是一个大于0的很小参数,称为隐私预算

公式解读

  • P[M(D) = R]:当包含“你”的数据时,算法输出结果为R的概率。
  • P[M(D') = R]:当不包含“你”的数据时,算法输出结果为R的概率。
  • e^ε:这两个概率的比值上限。当 ε 接近0时,e^ε 接近1,这意味着两种情况下输出R的概率几乎完全相同,隐私保护强度最高,但添加的噪声也可能最大,可能影响数据效用。ε 值越大,允许的概率差异越大,隐私保护越弱,但数据效用可能更好。

这个定义意味着,存在两个可能的世界:一个包含你数据的世界,和一个不包含你数据的世界。观察者看到算法输出的结果R后,很难判断这个结果究竟来自哪个世界,因为两个世界产生这个结果的概率非常接近。

定义的重要性与总结

本节课中我们一起学习了差分隐私的定义及其背后的逻辑。

  1. 核心概念:我们认识到,追求“攻击者完全无法学习新信息”或“个人数据完全不影响结果”的强保证是不切实际的。
  2. 思路转变:差分隐私将目标转变为保证个人参与不会显著改变输出结果的概率分布,从而消除因参与而带来的额外隐私风险。
  3. 正式定义:差分隐私通过一个简洁的数学公式 P[M(D)=R] ≤ e^ε * P[M(D')=R] 来量化这一保证。参数 ε 控制了隐私保护与数据效用之间的权衡。
  4. 强大之处:这个定义是普适的,它考虑了所有可能的数据集和所有可能的输出,提供了一个可被验证的、强大的隐私保护框架。

这个定义本身并未说明如何实现差分隐私(例如如何添加噪声),但它为构建隐私保护算法树立了明确的目标。下一节,我们将探讨实现差分隐私的具体机制。

094:全局敏感度 📊

在本节课中,我们将要学习一个核心概念——全局敏感度。这个概念对于在保护个体隐私的同时,如何安全地发布数据以支持统计分析至关重要。我们将通过简单的例子来理解其定义、计算方式及其重要性。


概念引入:从单一计数问题开始

假设我们想通过一项调查了解“有多少学生在周末饮酒”。这项调查收集了学生的各种信息,我们希望保护每位学生的隐私,但同时允许研究人员回答这个问题。我们需要找到一种既能发布数据支持此类查询,又能保护隐私的方法。

对于考虑是否参与调查的单个学生而言,存在两种可能的情况:我参与调查,或我不参与调查。

  • 如果我参与调查,并且我是一名在周末饮酒的学生,那么总计数将是 41
  • 如果我不参与调查,总计数将是 40

因此,在这两种可能情况(即两个数据集)下,这个查询结果的最大差异是 1。这里所说的“最大”,是指考虑任何两个相邻数据集时的情况。


定义相邻数据集与敏感度

上一节我们通过一个例子引入了差异的概念,本节中我们来看看其正式定义。

相邻数据集指的是两个仅在一条记录上存在差异的数据集。这条记录可以是我(或任何其他人)是否被包含在数据集中。

给定一个返回单个数字的查询函数 f,其全局敏感度定义为:在所有可能的相邻数据集对 (D1, D2) 上,查询结果绝对差值的最大值。

我们用公式表示如下:

Δf = max_{D1, D2} | f(D1) - f(D2) |

其中,D1 和 D2 是相邻数据集。

对于“周末饮酒学生人数”这个计数查询,无论我们考虑哪一对相邻数据集,结果的最大差异始终是 1。因此,该查询的全局敏感度 Δf = 1


扩展:处理多个查询(向量输出)

单一的计数查询并不总是够用。我们通常希望回答一系列问题。此时,查询函数 F 返回的不再是一个数字,而是一个结果向量(例如,同时查询饮酒人数和获得助学金人数)。

在这种情况下,我们需要衡量两个向量之间的差异。我们使用 L1 范数(即曼哈顿距离)来计算:先计算两个结果向量中每个对应元素的绝对差值,然后将所有这些差值相加。

因此,对于返回向量的函数 F,其全局敏感度的定义扩展为:

ΔF = max_{D1, D2} || F(D1) - F(D2) ||₁

这里,|| · ||₁ 表示向量的 L1 范数。它衡量的是在所有可能的相邻数据集对上,输出向量总变化量的最大值。


实例分析:计算组合查询的敏感度

让我们通过一个具体例子来理解向量输出的敏感度计算。假设我们的查询 F 同时返回两个结果:

  1. 周末饮酒的学生人数。
  2. 获得助学金的学生人数。

现在,考虑一个学生(一条记录)是否包含在数据集中所造成的影响。这个学生可能属于以下四类情况之一:

以下是学生可能归属的类别及其对计数结果的影响:

  1. 不饮酒,且未获助学金:该学生的存在与否对两个计数结果均无影响。差异为 0
  2. 饮酒,但未获助学金:该学生的存在会影响“饮酒人数”计数,差异为 1
  3. 不饮酒,但获得助学金:该学生的存在会影响“助学金人数”计数,差异为 1
  4. 饮酒,且获得助学金:该学生的存在会同时影响两个计数,差异为 1 + 1 = 2

为了找到全局敏感度 ΔF,我们需要考虑所有可能的相邻数据集对。由于可能存在属于第4类的学生,因此两个计数结果的最大可能总变化是 2

所以,对于这个返回两个计数的查询函数 F,其全局敏感度 ΔF = 2


总结

本节课中我们一起学习了全局敏感度这一核心概念。

  • 我们首先从保护隐私的数据发布场景出发,引入了“相邻数据集”的概念,即仅相差一条记录的两个数据集。
  • 接着,我们定义了返回单个数值的查询函数的全局敏感度公式:Δf = max | f(D1) - f(D2) |
  • 然后,我们将概念扩展到返回向量结果的查询,其全局敏感度定义为输出向量L1范数差值的最大值:ΔF = max || F(D1) - F(D2) ||₁
  • 最后,我们通过一个计算“饮酒人数”和“助学金人数”的实例,演示了如何分析并计算一个组合查询的全局敏感度。

理解全局敏感度是应用差分隐私等隐私保护技术的基础,它量化了单个个体数据对查询结果所能产生的最大影响,为后续添加恰当的噪声以保护隐私提供了关键参数。

095:拉普拉斯噪声

在本节课中,我们将学习如何通过添加拉普拉斯噪声来实现差分隐私。我们将从全局敏感度的概念出发,解释为何许多分析可以归结为计数查询,并最终介绍拉普拉斯噪声的数学形式及其参数设置。

全局敏感度与计数查询

上一节我们介绍了全局敏感度的概念,并以计数为例进行了说明。本节中,我们将这个概念推广到计数向量。

我们这样做的原因是,实际上许多查询、许多不同类型的分析都可以归结为相对少量的计数查询。正如幻灯片上引用的论文所示,直方图、矩阵的奇异值分解、我们在机器学习部分学过的决策树、聚类算法以及我们尚未讨论的关联规则挖掘等,所有这些基本上都可以归结为计数问题。

因此,如果我们能弄清楚如何在计数的框架下推理隐私问题,我们就能直接支持其他类型的分析。其中,直方图是最容易理解的例子,这也是为什么我们要将其推广到计数向量。一旦我们开始考虑收集直方图(例如,统计男性和女性的数量,或大一、大二、大三和大四学生的数量),我们就需要能够生成计数向量的函数,而这正是我们在上一节中推理的内容。

添加噪声的必要性与思路

那么,我们实际上如何添加噪声呢?我们现在有了敏感度的概念,但尚未解释为何要关注它,以及它如何与差分隐私的概念联系起来。

我们讨论过差分隐私的含义,也讨论过一些未能完全解决隐私问题的替代方案,以及差分隐私为何以当前的形式被提出。其基本思想是,我们将向答案中添加噪声,使得你无法分辨自己处于哪个可能的世界中——即无法针对任何特定用户,判断数据是来自包含他们的世界,还是不包含他们的世界。这正是差分隐私的形式化定义。

我们讨论了全局敏感度,但还没有说明如何实际添加噪声。我们需要添加哪种噪声呢?

我们知道,噪声量需要是敏感度的函数。这一点应该没有争议:如果函数更敏感,你需要添加的噪声就越多。例如,如果你试图保护一个大型计数向量,那么你需要添加的噪声就会比只回答单个问题时更多。敏感度越高,我们就需要越大幅度地改变结果,以防止攻击者区分两个可能的世界。

拉普拉斯噪声

那么,添加何种噪声呢?最简单的方法是添加拉普拉斯噪声。

拉普拉斯分布的形状如下:它是一个尖峰分布。高斯分布是钟形曲线,顶部平滑;而拉普拉斯分布是两个背对背的指数函数,一个正,一个负。因此它有两个参数:

  • μ:位置参数,决定分布在x轴上的中心位置。
  • b(有时也用 λ 表示):尺度参数,决定分布的分散程度。

由于它只是两个背对背的指数分布,b 就是指数分布的尺度参数。其实际方程如下:

f(x|μ, b) = 1 / (2b) * e^(-|x - μ| / b)

以下是该分布的一些示例:b 越小,分布越尖锐;通过调整 μ 参数可以偏移其位置,例如图中绿色的分布就是 μ 参数偏移了5的结果。

噪声尺度参数的确定

我们知道,这个分布的尺度(即其分散程度)需要取决于两件事:

  1. ε:我们在差分隐私定义中讨论过的参数,可以理解为社会对隐私的容忍度或隐私预算。
  2. 全局敏感度 Δf:正如我们刚刚讨论的,这是你需要为你试图支持的每一类查询计算的值。

位置参数 μ 则应基于该函数在特定数据集上的实际值。

总结

本节课中,我们一起学习了如何将差分隐私应用于实际查询。我们从计数查询的全局敏感度出发,理解了为何许多数据分析可归结为此类问题。接着,我们探讨了通过添加噪声实现隐私保护的核心思想,并重点介绍了拉普拉斯噪声的分布特性及其关键参数(位置参数 μ 和尺度参数 b)。最后,我们明确了决定噪声尺度的两个关键因素:隐私预算 ε 和查询函数的全局敏感度 Δf。这为后续具体实现差分隐私机制奠定了基础。

096:添加拉普拉斯噪声与证明

概述

在本节课中,我们将学习如何通过向查询结果添加拉普拉斯噪声来实现差分隐私。我们将详细解释拉普拉斯分布的参数设置、噪声添加的具体步骤,并最终证明该方法满足差分隐私的数学定义。


拉普拉斯分布的应用

上一节我们介绍了拉普拉斯分布的基本形态,本节中我们来看看如何具体应用它。

向查询结果添加噪声时,给定真实世界数据集 D,查询结果等于特定值 x 的概率由以下公式描述:

P(result = x | D) = (1 / (2b)) * exp(-|x - μ| / b)

我们已经将拉普拉斯分布的参数替换为差分隐私相关的值。其中,尺度参数 b 等于全局敏感度 Δf 除以隐私预算 ε

b = Δf / ε

位置参数 μ 等于函数在真实世界数据集上的实际值:

μ = f(D)

这里的直观理解是:当全局敏感度 Δf 增大时,噪声分布应更加分散。这确实成立,因为 bΔf 成正比。同时,当隐私预算 ε 增大(即我们对隐私的容忍度更高)时,尺度参数 b 会变小,分布变得更“尖峰”,意味着我们不需要添加那么多噪声。这是最直接的一种参数设置方式。


生成隐私化结果

以下是构建隐私化结果 R‘ 的具体步骤:

  1. 计算函数在真实数据集 D 上的值 f(D)
  2. 从参数为 (μ = f(D), b = Δf/ε) 的拉普拉斯分布中随机抽取一个噪声样本。
  3. 将函数值与噪声相加,得到最终发布的隐私化结果:R‘ = f(D) + Laplace(μ, b)

当我们构建一个API或数据库来响应此类计数查询(例如请求不同的直方图或统计值)时,每次回答查询都会执行此过程:计算答案,从拉普拉斯分布中抽取一个样本,将它们相加,然后返回该和作为答案。


验证差分隐私条件

现在,让我们检查这种方法是否合理并满足差分隐私的条件。

回忆一下,差分隐私的条件是:对于任意两个仅相差一个个体的相邻数据集 D1D2,以及任意可能的输出结果 R,以下概率比值的界限必须成立:

P(M(D1) = R) / P(M(D2) = R) ≤ exp(ε)

其中 ε 是给定的隐私容忍度参数。这个条件满足了差分隐私的定义。

具体到我们的拉普拉斯机制,这个概率比值就是:

[P(f(D1) + Laplace = R)] / [P(f(D2) + Laplace = R)]

如果将拉普拉斯分布的定义代入并进行代数运算,可以得到以下表达式。经过重新整理,可以验证该比值始终以 exp(ε) 为界:

比值 ≤ exp( |f(D1) - f(D2)| / b )

由于 |f(D1) - f(D2)| ≤ Δf,且 b = Δf/ε,因此:

比值 ≤ exp( Δf / (Δf/ε) ) = exp(ε)


核心思想与扩展

这个证明的直观理解是:存在许多仅相差一个个体的可能世界(数据集)。通过添加拉普拉斯噪声,每个世界产生的结果都被“模糊”到其相邻的结果区域中。因此,当攻击者观察到一个特定的结果 R 时,他无法以超过某个特定阈值的置信度来断定这个结果究竟来自哪一个相邻的可能世界。

如果函数的全局敏感度 Δf 更高,或者隐私预算 ε 设置得非常低(即隐私要求极其严格),那么添加的噪声分布会更加分散,想要区分来自哪个可能世界就会变得越发困难。

需要重申的是,拉普拉斯机制并非实现差分隐私的唯一方法。任何满足上述差分隐私定义的方法都是有效的。拉普拉斯机制只是我们用来回答查询的一种具体机制,其数学性质使得证明过程相对简洁。自2006年概念提出以来,尤其是到2010年左右,已有大量论文研究了实现差分隐私的其他多种机制。


总结

本节课中,我们一起学习了实现差分隐私的核心机制之一——拉普拉斯机制。我们掌握了如何根据全局敏感度 Δf 和隐私预算 ε 设置拉普拉斯噪声的参数 b,了解了向查询结果添加噪声以生成隐私化输出的完整步骤,并通过数学推导证明了该机制严格满足差分隐私的定义。最后,我们探讨了该机制的直观含义,并了解到拉普拉斯机制是众多可行方案中的一种。

097:差分隐私的弱点

概述

在本节课中,我们将探讨差分隐私这一技术。我们之前介绍了差分隐私的动机和基本概念,它旨在提供形式化的技术保证,以应对隐私问题。然而,任何技术方案都有其局限性。本节我们将重点分析差分隐私的两个主要弱点:对查询类型的限制,以及在面对自适应查询时遇到的挑战。

差分隐私的回顾与动机

我们引入差分隐私有几个原因。我们希望探索在这个领域能做出何种形式化的技术保证,这与基于专业组织行为准则等更具行为指导性的方法形成对比。形式化技术保证是解决隐私问题光谱的另一端。此外,我们指出,许多尝试形式化并解决隐私问题的方法往往忽略了一个几乎所有攻击都具备的关键特征:攻击通常结合了来自多个不同来源的数据集,以获取更多信息。例如,攻击者不会仅使用Netflix数据来侵犯用户隐私,而是会结合外部信息;同样,AOL搜索查询数据也常与电话簿等外部数据结合使用。因此,任何形式化方法都需要考虑这一点,而差分隐私做到了。它的定义中没有试图建模攻击者拥有何种数据集的参数,也不依赖于此。这是它的优点。

差分隐私的弱点

尽管差分隐私有上述优点,但它也存在一些问题。这里我们重点讨论两个主要弱点。

弱点一:对查询类型的限制

差分隐私主要设计用于处理低敏感度查询。我们讨论过的计数查询就属于低敏感度查询。无论参与调查的特定个体情况如何,他们对查询结果的最大影响只能是增加或减少一个单位。然而,对于涉及数值求和的查询,情况则不同。

考虑关于收入的查询,例如计算特定性别群体在某细分市场中的总收入。包含或排除单一个体可能会极大地改变结果,因为收入的分布并非高斯分布,而更接近指数分布。这里存在“二八法则”,高收入者的收入远高于低收入者。对于求最大值这类查询,问题更明显,因为最大值不依赖于数据集的大小。即使有数百万用户,最大值仍可能因单一个体的收入而发生显著变化。

因此,对于某些查询族,要推导出能回答这些查询的差分隐私机制需要大量工作,而且如何有效实现并不明确。在某些情况下,研究表明,为了满足差分隐私,需要添加大量噪声,以至于难以保证结果的可用性。

弱点二:自适应查询的挑战

上一节我们讨论了回答单个查询并假设其满足差分隐私的情况。但如果我们允许用户连续提问呢?用户可能先问一个问题,根据答案再问另一个,如此反复。这可能会让你联想到我们讨论统计推断方法时的情景:你有一个未知分布,通过在特定数据集上重复实验(或重采样模拟重复实验),可以推断出底层分布的形式并回答问题。

统计推断本质上正是在尝试破解差分隐私的防御。差分隐私通过添加噪声来混淆信息,而统计推断则试图通过重复实验来推断信息。因此,可以想象,如果允许我提出多个查询,而系统对每个结果都添加噪声,我或许能够通过这些查询区分出信号和噪声。

这个问题在差分隐私提出之初就被充分认识到了。唯一的解决方案是向结果中添加更多的噪声。可以证明,一系列 K 个独立的、采用我们描述的拉普拉斯机制进行隐私化的差分隐私查询,其整体隐私保证会减弱,隐私泄露量最多可达到原始隐私参数的 K 倍。

这意味着隐私泄露随查询次数线性增长。如果你通过一次查询实现了某个隐私级别,那么进行 K 次查询后,你允许的隐私泄露量就增加了 K 倍。虽然人们已经推导出了更严格的界限,但至少是这个数量级。从某种意义上说,这提供了一个简单的应对技巧:如果我们事先知道没有人会提出超过10个查询,我们可以直接将隐私参数 σ 除以10,然后按常规方式添加噪声。

基于这种推理,更合理的做法是将其视为一个隐私预算。当一系列查询耗尽了该预算后,该用户就不再被允许提出更多查询。然而,如果开始考虑用户之间的共谋,或者用户通过创建虚假账户等方式隐藏身份,使得我们无法有效追踪用户,那么按用户管理隐私预算就会变得非常困难,甚至可能需要对整个世界设置一个总预算,这在实际中几乎无法操作。

对于这里的例子,如果你想在 K 次查询中保持原始的隐私保证,你必须在每次查询的结果中注入 K 倍的噪声。当 K 很大时,例如需要支持成千上万次查询,你实际上已经破坏了输出的可用性,因为每个查询都添加了如此多的噪声,以至于无法从中得出任何有意义的结论。

为了解决这个问题,针对特定查询族(如布尔谓词)的研究区分了交互式非交互式场景。非交互式场景下,给定一组固定的查询(例如100个),我们可以一次性处理;而交互式场景下,攻击者可以基于先前查询的结果和已有知识,自适应地提出下一个查询。但在所有这些情况下,隐私预算的概念都是差分隐私中非常基础和核心的,这也严重限制了它在实践中的可用性。

总结

本节课我们一起学习了差分隐私的两个主要弱点。首先,它主要适用于低敏感度查询,对于求和、求最大值等高敏感度查询,实现有效且可用的差分隐私机制具有挑战性。其次,在面对自适应查询时,需要通过隐私预算来管理,这可能导致需要添加大量噪声,从而损害数据实用性,或者对系统的用户管理和查询策略提出很高要求。尽管如此,我仍然讲解这个概念,是为了揭示在隐私领域,即使是形式化的技术保证也存在其局限性。目前,差分隐私仍然是追求严格形式化隐私保证的研究中最有前景的方向之一。

098:可重复性与数据科学 🧪

在本节课中,我们将探讨数据科学中的一个核心但常被忽视的议题:可重复性。我们将了解为什么可重复性是科学研究的基石,以及它在商业和数据科学实践中的重要性。


上一节我们提到了数据科学的本质是科学研究。本节中,我们来看看可重复性在科学中的核心地位。

科学的认识论基础是怀疑主义。怀疑主义要求任何科学主张都必须能够被独立验证。如果没有这一点,科学就无从谈起。因此,你不能仅仅在“密室”中运行你的R脚本,然后向他人展示结果,并期望他们相信你或据此做出决策。你必须能够展示并沟通得出结果所需的完整步骤。研究过程必须具备这种透明性。

这一理念始于17世纪60年代罗伯特·波义耳在皇家学会的工作。然而,随着技术进步,特别是研究变得更加计算化和数据密集型,可重复性的含义发生了变化,实现它的难度反而增加了。作为一个计算机科学家,这实际上令人尴尬:从现实世界中提取知识本应比从编码为0和1的数字形式中提取更困难,但事实似乎并非如此。我们的可重复性状况似乎在变差,而非变好。


上一节我们讨论了可重复性的普遍挑战。本节中,我们来看看这个问题在科学界有多严重。

可重复性正受到严肃关注。大量研究表明,科学文献中的信息确实存在不可重复的问题,许多结果似乎站不住脚。这个问题遍及科学的各个方面和所有领域,对整个科学事业构成了非常严重的威胁。


那么,对于数据科学,尤其是商业环境下的数据科学,这意味着什么呢?本节我们将探讨其重要性。

可重复性在商业环境中同样至关重要,即使这一点尚未被完全认识到。内部利益相关者(如你的老板、同事或合规官)最终都会要求某种程度的可重复性,无论他们现在是否明确提出。以下是几个关键原因:

以下是可重复性在商业环境中的核心价值:

  • 为决策提供辩护依据:如果决策要基于定量分析或科学结果,你必须能够回溯到事实本身,理解它们是什么。尤其是当决策出错时,人们需要确认过程是否正确。
  • 促进内部沟通与传承:当你离职或将项目移交给他人时,必须以某种可重复的方式记录步骤,以便他人能够在此基础上继续工作。这对于团队培训和知识传承也至关重要。
  • 确保实验有效性:商业决策将越来越多地基于一系列实验的结果,而这些实验的有效性标准与基础研究中的实验完全相同。
  • 应对外部压力:外部利益相关者,如合规官和审计人员,会施加其他压力。遵守关于数据保留期限和记录保存的法律规定是其一,但确保定量分析本身可重复、可审计,也是一种普遍要求。

总而言之,数据科学,即使在工业界,其本质依然是科学。可重复性不是可选项,而是确保分析可信、决策可靠、知识可传承的基石。在本节课中,我们一起学习了可重复性的哲学基础、它在当前科学中面临的挑战,以及在商业数据科学实践中不可或缺的具体原因。

099:可重复性黄金标准 🏆

在本节课中,我们将探讨数据科学中的一个核心挑战:研究的可重复性。我们将了解当前可重复性危机的现状,并深入讨论实现可重复性的“黄金标准”是什么,以及为什么它难以实现。


可重复性危机

近年来,多个领域的研究都面临着严峻的可重复性问题。以下是一些高知名度的案例:

  • 2011年,拜耳公司的研究人员报告称,在67项重要的药物研究中,他们只能重复出17项的结果。
  • 2012年,安进公司进行了一项类似的可重复性实验,发现53项癌症研究中,仅有6项的结果能够被重复。
  • 2015年8月,弗吉尼亚州的“可重复性项目”报告称,他们只能重复出100项心理学研究中的39项。这一事件引起了媒体的广泛关注。
  • 2015年9月,美国联邦储备委员会发现,在67项经济学研究中,只能重复出29项的结果。

计算金融领域出现的“回测过拟合”概念,已成为一个主要问题。这本质上就是我们上一门课程中讨论过的“过拟合”问题。“回测”指的是查看历史数据。在计算金融中,如果你有一个特定的信号模式,找到一个能完美捕捉该模式的模型是轻而易举的。更糟糕的是,一些本质上不道德的金融顾问的做法是:尝试上千个模型,报告表现最好的那一个,并以此进行宣传,然后当它无法很好地预测未来结果时,又假装惊讶。这个领域从根本上缺乏科学规范和诚信,这可能令人惊讶,也可能不,但这确实是一个与可重复性相关的问题。一种科学的、实证的思维方式被视为解决方案的一部分。

2014年3月,西弗吉尼亚大学的研究报告称,他们无法复现大众汽车公司声称的排放数据。正如我们现在所看到的,这已经演变成一场国际丑闻。事实证明,大众汽车在作弊。


可重复性的黄金标准

上一节我们看到了可重复性问题的普遍性,本节中我们来看看理想的解决方案是什么。

我认为,可重复性的黄金标准是:其他人能够使用你在实验时的精确环境。这包括相同的软件、相同的软件环境、相同的硬件,甚至可以说,房间里相同的灯光——一切都完全相同。

此外,与之相辅相成的是,你的实验流程本身就是为了确保可重复性而设计的,这样你事后就无需担心,结果会自然而然地重现。理想情况下,你可以在事后按下一个开关,保存你的整个工作空间——你的办公室、里面的一切——打包并发送给其他人,使其能够复现所有结果。

有一种观点认为,这是一个糟糕的“黄金标准”定义,我们稍后会再讨论这一点。你可以思考一下这可能是什么原因。有些人会争辩说,这是一个糟糕的理想目标,或者这个想法中缺少了某些部分。


当前的工具与局限

即使你满足于上述黄金标准,我们也无法完全实现它,但我们可以通过虚拟机等技术接近它。在本模块的课程中,我将逐步阐述这个论点。

接下来,我将跳过通常关于可重复性的长篇动机论述(尽管我已经做了一些),并跳过对专门工具的广泛讨论。这些工具包括声称能更好支持可重复性的科学工作流系统、用于R环境和Python环境的插件和扩展(它们可以监视你的操作并保存状态)、允许为事物附加元数据的系统,以及各种旨在让未来在R/Python中的日常工作更具可重复性的系统。还有强调可重复性的数据管理服务,当你保存数据集版本时。

但同样,我对其中任何一个特定工具都不够兴奋,不足以将其作为推荐或进行深入探讨。此外,对这些工具的深入讨论往往更吸引那些对构建这些工具感兴趣的人,而不仅仅是使用它们的人。

我也将跳过关于最佳实践的讨论,这包括版本控制(如今通常使用Git,因为它很好地统一了人们的注意力,并通过GitHub真正解决了问题)、文学化编程(确保你的可视化和图表都是脚本化的,以便重新运行和修改)、软件工程原则、测试驱动开发等。


云计算的解决方案

我想聚焦于一个最终很简单的论点:云计算(无论是公共云还是某种形式的私有云)才是实现可重复数据科学的合适平台。通过这个论点,我们将引出可重复性的一些特征,同时也会带出云计算本身的特性,因为这是一个讨论它的合理背景。

所以,我们来谈谈它。


总结

本节课中,我们一起学习了数据科学中可重复性问题的严重性,从制药到经济学等多个领域都面临挑战。我们探讨了可重复性的“黄金标准”——即完全复现原始实验环境,并认识到其理想化的难度。最后,我们指出了跳过复杂工具和最佳实践的细节讨论,将重点引向一个核心观点:云计算平台为实现可重复的数据科学提供了最可行和本质的解决方案。在接下来的内容中,我们将围绕这个论点展开。

100:虚拟化轶事——海洋设备

在本节课中,我们将通过一个关于“海洋设备”的实际项目轶事,来探讨虚拟化思想在解决现实世界复杂问题中的应用。这个例子虽然不直接涉及虚拟化技术本身,但其核心思想——通过封装和标准化来简化部署、管理和维护——与虚拟化的理念一脉相承。

上一节我们介绍了虚拟化的基本概念,本节中我们来看看一个具体的应用实例。

项目背景与挑战

在2007年,我参与了一个名为“海洋设备”的项目。这个项目的初衷,是为了解决向野外工作站,特别是远洋船舶,分发软件时所面临的诸多难题。

将软件直接提供给船舶工程师,让他们在船上的计算机上进行安装,这种做法存在许多问题。原因包括安全考虑、船上人员的技术专长有限、远程调试访问困难,以及其他各种潜在问题。

我们涉及的软件本身并不特别复杂。它包含一个数据库系统、一个从传感器读取数据的遥测系统(用于将数据传回岸上),以及一些Web界面。这些界面供船上的研究人员和操作人员使用,以便查看数据、调试问题,甚至进行一些实时的现场科学研究。

解决方案:海洋设备

这个“海洋设备”承担了多项职责。它本质上接管了船载计算的任务,包括进行数据分析、数据采集、安全备份数据、将数据发送回岸上、生成可视化图表,并作为一个应用服务器,供其他需要连接它的笔记本电脑使用。

通过使用这个专用设备,我们可以保证软件运行在一个特定的、可控的环境中。这样就能确保,软件在一艘船上运行良好,在另一艘计算平台较弱的船上也不会突然出现用户体验崩溃或其他问题。我们消除了所有不可控的因素。

这个设备的成本在当时非常低廉,大约500美元。虽然现在的价格已经完全不同,但在当时,这确实是一个不算昂贵的“盒子”。

以下是这种设备需要部署的典型环境描述:

  • 这是一个紧凑的实验室工作台,位于一艘相当小的研究船(R/V Barnes)内部。
  • 我们将设备安置在甲板下方,接入船舶的网络和电源,基本就完成了部署。
  • 网络配置通常也会提前安排好。

设备的功能与价值

这个设备能够完成一些非常有意义的工作。

它实现了船与船之间、以及船与岸之间的遥测。下图展示了美国西海岸三艘不同船只的航行轨迹。

当时(现在也仍然是)的一个想法是,实现多艘船只之间的协调自适应采样。这意味着,不是让三艘船独立地去往三个不同的地方,有时你可以让它们共同观测同一种现象。然而,同时租用三艘船并协调时间通常很困难,资金也难以筹集。因此,实际做法往往是多个项目共享一艘船的时间。如果要共享船时,就需要更高级别的协调,而“海洋设备”这套基础设施正好有助于实现这种协调。

船与船之间的遥测也有助于将数据中继回岸上。虽然随着卫星通信日益普及,这个问题正在逐渐消失,但在某些情况下,仍需要使用远程无线电。由于地球曲率的影响,无线电信号无法直接传回岸上。虽然可以尝试通过电离层反射信号来稍微“作弊”,但通信范围仍然有限。然而,在自适应采样场景下,如果能实现从一艘船到另一艘船再到另一艘船的连接,就能为实时遥测数据构建一个更长的中继链路,使得岸上的科学家能够观察现场情况并给予关注。


核心思想总结

本节课中我们一起学习了“海洋设备”这个案例。虽然它没有使用虚拟化技术,但其设计哲学与虚拟化高度一致:将复杂的软件栈及其依赖环境封装(encapsulate)到一个标准化、可移植的硬件单元中。这样做的好处是:

  1. 简化部署:只需连接电源和网络,无需在目标机器上进行复杂的安装和配置。
  2. 环境一致性:确保软件在任何部署地点都能在预期的环境中运行,避免因系统差异导致的问题。
  3. 降低维护成本:集中管理设备比远程调试分散安装的软件要容易得多。
  4. 提升可靠性:通过专用设备保障核心服务的稳定运行。

这个轶事生动地说明了,虚拟化的核心价值在于通过抽象和隔离来管理复杂性,而实现这一目标的具体形式可以是软件层面的(如虚拟机、容器),也可以是硬件层面的(如本例中的专用设备)。

101:代码、数据与环境 🚢

在本节课中,我们将探讨一个关于数据科学项目部署的实际案例,并分析如何通过控制环境来解决可重复性与跨平台协作的难题。我们将重点理解虚拟环境(如虚拟机和容器)在简化部署、确保结果一致性和促进协作方面的核心价值。


上一节我们讨论了数据科学项目在真实世界部署的复杂性。本节中,我们来看看一个具体的海洋监测项目案例,它清晰地展示了环境控制的重要性。

在哥伦比亚河口,我们部署了一个监测网络。具体设置如下:

  • 河口内有一艘船。
  • 公海上有两艘船。
  • 这些船只超出了20公里的无线电通信范围,但我们仍能实时获取数据。

这个系统的搭建并不十分困难,因为我们在船上配备了计算平台来实时处理工作。我们实时进行事件检测,例如在哥伦比亚河口观测到的“红水”现象。

图中显示了一片红色的水域。我们过去称之为“赤潮”,但需要注意,这里的生物(Myrionecta rubra)相对无害,不会致人死亡,但它依然是一种有趣的小生物,会将水染红。在数据中,我们可以观察到浊度(即水的浑浊程度)的峰值,这可能是检测到“红水”的信号。

这里有两桶水样本,一桶取自红色斑块区域,另一桶取自清澈水域。尽管光线条件可能掩盖了部分效果,但这些实时事件意味着:当你发现某些情况正在发生时,你会希望立即收集数据并采取行动。将设备部署在船上,有助于自动触发这一过程。


那么,我为什么要提及这个案例呢?因为它揭示了一个关键点:在实验室里构建好设备盒子并免费分发出去,比在野外与船只管理员协作、尝试让我们的软件运行、修复问题以及处理各种异构性要更容易、更便宜、更安全

这与可重复性问题有共通之处。你让一切在自己的环境中运行,然后将整个环境分享给世界,这比试图与那些想复现你结果的人合作、带领他们完成所有必要步骤、并帮助他们解决因平台异构性而产生的新问题要高效得多。

平台异构性导致的新问题,其责任归属并不明确。对于接收方而言,如果你想复现他人的结果,却不得不解决各种未在论文中描述、与科学本身无关的疑难问题,这会令人沮丧。东西就是无法直接运行。

然而,对于研究成果的生产者来说,要求他们投入额外工作来保证其成果能在任何可能的平台、任何操作系统版本、任何技能水平的人的任何环境中运行,也不太现实

因此,这里存在一种张力。但虚拟机提供了大部分相同的好处。实际上,我们当时构建了一个物理盒子,是因为存在互联网连接等限制。这些问题在大多数情况下并不十分相关,但基本理念是相通的:一个受控的虚拟机为你提供了一个受控的环境。

我接下来要讲的大部分内容也适用于容器,它在几乎所有方面都是一种更优的实现这些好处的方式。容器去除了冗余(例如,多个虚拟机之间通常有很多共同点),同时仍能提供定制化环境的可移植性,并且还具有可组合性等其他优秀特性。

因此,我关于虚拟机的论述大多也适用于容器。事实上,如今我通常会建议人们首先探索容器技术。


本节课中,我们一起学习了通过一个海洋监测案例,理解了环境控制在数据科学项目中的重要性。我们认识到,与其在异构平台上艰难地调试和部署,不如直接分享一个受控的、可复现的环境(如虚拟机或容器)。这不仅能简化协作、降低成本,还能从根本上保障研究结果的可重复性。容器作为更现代和高效的解决方案,尤其值得初学者优先探索。

大规模数据科学:第2课:云计算简介

在本节课中,我们将学习云计算的基本概念,了解其与虚拟化的关系,并探讨其如何改变我们处理计算资源的方式。

上一节我们介绍了虚拟化及其在可重复性中的作用,本节中我们来看看云计算。


我们花了几分钟讨论虚拟化及其在可重复性中的作用。现在,我想花几分钟谈谈云计算。我认为,虚拟化和云计算正日益紧密地结合在一起,尽管它们并非必然相互依存。如今,点对点地传递虚拟机并在没有共享执行环境的情况下运行它们,这种做法越来越不合时宜。对于容器而言,情况也类似,尽管由于体积和规模等原因,传递容器不像传递虚拟机那样麻烦。

我们来稍微谈谈云计算。这是一台位于旧工厂地下室的发电机。仔细观察,你会发现它很可能不再被用作发电机。周围有穿着西装打着领带的人在唱歌,墙上挂着艺术品等等。它更像是一个话题装饰品。这里的观点是:在某个时期,自己发电更便宜、更安全或更方便。但在过去的某个时刻,这变成了一个古怪的想法,这台发电机也成了过去时代的遗迹。这个论点认为,服务器机房也将走向同样的方向。那种出于成本、便利性、安全或业务连续性考虑而需要物理维护机器的想法,正在逐渐过时。这个过程正在加速。对于那些在IT领域有深厚投资的大公司来说,仍有很长的路要走,但这是我们前进的方向。

这个想法并不新鲜。有一句引语是:“计算有朝一日可能会像电话系统作为公共事业一样,被组织成一种公共事业。计算机公用事业将成为一个新的重要产业的基础。”你或许想猜猜这话是什么时候说的。说这话的人是斯坦福大学的荣誉退休教授,也是Lisp语言的发明者。所以,这是约翰·麦卡锡在1961年说的。可见,我们思考这个问题已经很久了。如今,随着云计算的发展,它正在成为现实。


本节课中我们一起学习了云计算的概念,理解了它如何从一种长期设想演变为当今数据处理的主流模式,并看到了它与虚拟化技术共同推动着计算资源使用方式的根本性变革。

103:云计算历史 📜

在本节课中,我们将回顾云计算发展的关键历史节点,了解它如何从早期的概念演变为今天支撑现代应用的基础设施。我们将看到服务模式的演变,以及几家科技巨头是如何塑造这一领域的。


上一节我们介绍了数据科学的基本概念,本节中我们来看看支撑其发展的关键技术——云计算的起源。

早期概念:应用服务提供商

在2000年左右,出现了“应用服务提供商”的概念。当时,这成为了杂志封面上的热门术语,也是大型咨询公司的重要业务。其核心思想是,企业通过互联网向其他企业提供软件应用服务,而非要求客户在本地安装和管理软件。

Salesforce是这一模式的先驱。他们不向客户销售软件安装包,而是通过浏览器提供客户关系管理服务,并自行管理所有后端基础设施。

这种模式带来了巨大优势:

  • 对开发者而言:他们无需处理客户端的安装或配置问题,可以集中精力开发和维护服务,并统一推送更新。
  • 对客户而言:他们减少了本地IT支持和维护的成本与复杂性。

观念的转变:浏览器也能运行“真正的”应用

当时,人们普遍怀疑浏览器能否运行功能完整的“真正”应用,认为它只适合简单的网页应用。而Gmail的出现改变了这一观念。

Gmail是一个功能齐全的电子邮件客户端,完全在浏览器中运行。它证明了复杂的桌面级应用完全可以托管并在云端通过浏览器交付。自此之后,“应用运行在云端”不再具有争议性。

如今,计算越来越多地发生在云端,本地设备(如手机、平板电脑)上只保留非常轻量化的客户端。

服务模式的演进:从SaaS到PaaS

随着YouTube、Myspace等应用的流行,以及Zoho、Google Docs等在线办公套件的出现,软件即服务模式被广泛接受。

随后,一个关键发展是Force.com的出现(由Salesforce.com推出)。他们意识到,可以不只是提供具体的CRM应用,而是将构建此类应用的基础设施和能力开放出来。

Force.com允许开发者在他们的平台上构建和发布自己的Web应用。这被认为是平台即服务 模式的早期开端。其核心公式可以概括为:
平台即服务 = 基础设施 + 开发工具/框架 + 运行时环境

基础设施的民主化:IaaS的兴起

不久之后,亚马逊推出了亚马逊网络服务。他们将服务层级进一步下沉,提供了更底层的基础设施即服务

AWS提供对原始计算资源(如虚拟机、存储、网络)的直接访问。用户可以在这些基础资源上安装任何软件,构建任何架构。一个有趣的问题是:为何是亚马逊(一家电商公司)而非微软、IBM等传统IT巨头率先开创了这一模式?

当时的解释是:

  1. 亚马逊本质上是一家技术公司,拥有处理海量交易的技术架构。
  2. 亚马逊擅长薄利多销的商业模式。他们最初卖书,后来利用同一套基础设施卖各种商品。既然能支撑自己的商城,何不将这套基础设施出租给其他人?
  3. 在AWS广为人知之前,亚马逊曾允许第三方商家在亚马逊的机器上搭建自己的在线商店,这可视作AWS的前身。
  4. 传统IT巨头倾向于追逐高利润的大客户,而亚马逊习惯于在微小利润上通过巨大规模取胜。

格局的形成与竞争

谷歌也随后推出了Google App Engine(此段历史截至2009年)。自此,云计算市场的主要格局开始形成。

如今,亚马逊、谷歌和微软在这个领域全面竞争。它们提供的服务已经高度重叠和覆盖,几乎任何你需要的云服务都能在这三家主流提供商中找到对应的产品。市场竞争推动了技术的快速发展和成本的持续下降。


本节课中我们一起学习了云计算从应用服务提供商概念,到SaaS、PaaS,最终到IaaS的演进历史。我们看到了Gmail如何证明浏览器应用的可行性,Salesforce如何向PaaS拓展,以及亚马逊凭借其技术架构和商业模式开创了IaaS的先河。理解这段历史有助于我们把握当前云服务生态的由来与核心逻辑。

104:代码、数据、环境与平台

在本节课中,我们将探讨可重复性研究的核心要素:代码、数据、环境以及支撑它们的平台。我们将了解云计算和虚拟化技术如何将这些要素整合在一起,从而为数据科学实验提供可靠、可复现的基础。

核心要素:代码、数据与环境

上一节我们讨论了数据科学的基本流程,本节中我们来看看构成可重复性研究的三个关键支柱。

虚拟化技术所封装的核心是代码、数据和环境。人们经常讨论分享代码的工具与最佳实践,也讨论分享数据的方法,有时还会强调需要平台来同时支持两者。然而,很少人深入探讨分享环境的必要性。

这一点正变得越来越重要,因为仅凭你编写的新代码和你亲手处理的数据,通常不足以完整复现你所做的任何实验。你的代码依赖于数量庞大的库,这些库构成了环境的主要部分。

虚拟化的作用

虚拟化技术使得这种跨平台的、通用的、可靠的环境捕获成为可能。这里特别要指出的是事后捕获的重要性。

在进行实验时,你通常无法预知哪个实验最终需要被打包和分享。如果要求你对每一项活动都投入同等的关注、规范和警惕,以确保其能被任何人无限次地复现,这会浪费巨大的精力。我认为要求每个人都这样做并不现实。

因此,你需要一种能够回溯的能力,能够指出“啊,这一系列步骤才是我真正想要捕获并分享的”。正如之前提到的,虚拟化和容器技术提供了这种能力。你可以拍摄一个快照,然后从容地说:“这就是我想要打包的环境。”

云计算的延伸:资源与服务

然而,虚拟化或容器论证只是第一步。云计算更进一步,它不仅关乎虚拟化、代码、数据和环境,还关乎资源服务

这也是可重复性的重要组成部分。假设你完成了一个出色的实验,但它需要特定的GPU服务器、一个机器集群、中间的数据库服务器以及一个你使用的Web应用程序。要求他人在自己的世界里重建这样一个环境是不现实的,同样,要求他们想出另一种使用不同架构的方法来复现你的实验也不合理。

云计算的优势

以下是云计算为可重复性研究提供的关键支持:

  • 无限的规模:任何代码和数据都得到云的支持,你无需担心存储和计算的规模限制。
  • 丰富的服务:构建在可扩展存储和计算之上的服务日益有用、复杂,并针对特定任务进行了专门优化。例如,对于结构化关系数据或非结构化数据,你都有多种选择。
  • 高效的管理:用于管理大量虚拟机(VM)和容器(如今容器本质上正是为应对管理大量不同VM的挑战而发明的解决方案之一)的服务。
  • 可靠的保障:安全性、可靠性和持续可用性。这些是你自己的计算基础设施或他人的基础设施难以保证的属性。

因此,云计算真正地将可重复性情境中你可能需要担心的所有变量都打包解决了。

总结

本节课中,我们一起学习了可重复性数据科学研究的完整图景。我们认识到,完整的复现不仅需要代码数据,还必须包括其运行的环境虚拟化与容器技术使我们能够方便地捕获和分享这个环境。而云计算平台则进一步提供了可扩展的资源、多样化的服务以及可靠的基础设施保障,将代码、数据、环境和运行资源整合为一个完整的、可复现的解决方案包。

105:云计算用于可重复研究

在本节课中,我们将要学习云计算的核心概念,特别是它如何支持可重复的研究工作。我们将了解云服务的不同类型、它们的优势,以及为什么云计算对数据科学和科学研究至关重要。

云计算的三种服务模式

上一节我们介绍了云计算的基本概念,本节中我们来看看其核心的三种服务模式。

以下是三种主要的云服务模式:

  • 基础设施即服务:提供虚拟化的计算资源,如服务器、存储和网络。经典的例子是亚马逊的EC2(计算引擎)和S3(存储服务)。
  • 平台即服务:提供一个平台,让开发者可以构建、运行和管理应用程序,而无需处理底层基础设施。例如,微软的Azure最初就是以此模式起步的。
  • 软件即服务:通过互联网提供完整的应用程序。例如,微软的Office 365。

随着服务模式从基础设施向软件演进,服务变得更加具体、面向特定领域和任务,同时也能引入更多的自动化功能。过去十年间,行业的发展正是不断充实这一设计空间的过程。

云计算的巨大成功

了解了服务模式后,我们来看看云计算在实际应用中的巨大成功。

云计算的增长是爆炸性的。例如,亚马逊全球网站的带宽消耗呈现稳定增长,而亚马逊网络服务的带宽消耗则呈爆炸式增长。同样,S3中存储的对象数量也经历了指数级增长。这些数据都清晰地展示了云计算的普及和成功。

云计算对研究的优势

云计算的成功不仅体现在商业领域,对于科学研究,尤其是数据科学,它带来了独特的优势。

以下是云计算为研究工作带来的几个关键优势:

  • 突发性计算能力:历史上首次,使用1000个处理器运行一天的成本,与使用1个处理器运行1000天的成本相同甚至更低。这使得研究人员可以在实验结束后关闭所有资源,极大地提高了资源利用的灵活性。
  • 支持可重复性:研究者可以访问完全相同的工具、数据和计算环境,从而让他人能够精确复现实验过程。
  • 便于共享与协作:将工作环境开放给外部访问,通常只需在软件中进行简单设置,无需物理移动数据或代码。
  • 消除跨部门冗余基础设施:无论是在不同大学之间,还是在公司内部的不同部门(如市场部和分析部),集中化的云平台都可以避免重复建设计算集群,将资源共享提升到软件操作的层面。

对于稳态的数据处理任务,云计算的成本优势可能不明显。但对于实验性工作、数据科学和科学研究而言,这种突发性计算能力的模式非常适用。

公共云与私有云

最后,我们来谈谈云计算的部署模式。

实现上述优势,可以通过我们讨论的公共云,或者通过某种形式的私有云。在这些情况下,集中化程度越高越好,因为它能将资源共享从物理硬件层面提升到软件操作层面。

本节课中我们一起学习了云计算的三种服务模式(IaaS, PaaS, SaaS),见证了其巨大的商业成功,并重点探讨了它为科学研究带来的核心优势,特别是突发计算能力、可重复性以及便捷的协作共享,这些特性使其成为现代数据科学不可或缺的工具。

106:虚拟化对可重复性的优势

在本节课中,我们将探讨虚拟化技术(如虚拟机和容器)如何为数据科学工作流中的可重复性问题提供强大的解决方案。我们将分析数据科学实验的“混乱”现实,并理解为什么捕获整个计算环境至关重要。

上一节我们讨论了数据科学中可重复性面临的挑战,本节中我们来看看虚拟化技术如何提供一种优雅的解决方案。

数据科学实验的现实

数据科学实验常常发生在受控、受监控的环境之外。总会有一些实验和数据存在于某种便于实现可重复性的、受管理的受保护环境之外。

以下是数据科学工作流的典型特点:

  • 自由实验:能够随时打开文本编辑器,从头开始编写代码并尝试新想法,这是软件和数据科学的一个重要特性,不应轻易破坏。
  • 流程模糊:调试、测试和实验之间的界限非常模糊。同一段代码,当它成功时是“实验”,当它失败时是“调试”。
  • 环境异构:实验依赖于复杂的、相互关联的网络,包括数据库、外部系统、可视化库及其各自的依赖项。

因此,我们需要一种能够事后捕获实验环境的方法,并且这种方法必须能够容忍数据科学实验混乱、异构的现实。

虚拟化的核心优势

虚拟化技术(虚拟机和容器)的核心优势在于,它们允许我们捕获并复制整个计算环境

我的卡通版理解是:你开发了一个回答特定统计问题的工作流管道,并想把它交给你的老板。你不仅可以移交代码,还能连同其所有依赖一起打包。代码依赖于某个数据库、某个外部系统、某个可视化库,而它们各自又有一系列复杂的库和依赖网络。除了获取整个环境,没有更好的切割点。这正是虚拟化和容器所提供的。

核心概念:通过虚拟化,可复现的环境可以打包为一个文件(如 Dockerfile 或虚拟机镜像),并通过简单的命令(如 docker builddocker run)来重建。

# 示例 Dockerfile
FROM python:3.9-slim
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY my_analysis_script.py .
CMD ["python", "./my_analysis_script.py"]

责任划分问题

在传统湿实验室(如化学、生物学)中,可重复性依赖于研究者对实验步骤的描述,由他人在自己的环境中复现。这里存在一个责任划分的问题:在多大程度上,复现者需要自己填补环境配置的空白?

随着计算科学的普及,这个问题变得更加尖锐。想复现你计算生物学实验的生物学家,可能不具备操作你提供的软件、以同样方式设置环境的技能。

以下是复现者可能面临的挑战列表:

  • 能否在系统级、R 或 Python 环境中安装软件包?
  • 能否编译代码以使用你所依赖的快速 C 库?
  • 能否解决出现的依赖问题?
  • 如果涉及数据库,能否编写 DDL 语句来建立与你相同的模式?
  • 能否配置运行这些 DDL 语句所需的数据库服务器?
  • 能否解决文件权限等问题?

如果对这些问题的答案是“否”,那么即使你提供了“潜在可行”的方法,也可能并未真正实现“易于复现”。虚拟化方法有助于解决这种责任划分问题,它明确表示:“这就是我所做的一切,你只需运行这些命令,就能获得完全相同的环境。”

本节课中我们一起学习了虚拟化技术如何应对数据科学中的可重复性挑战。我们认识到数据科学自由、模糊的工作特性需要一种能够事后捕获完整环境的方法。虚拟机和容器通过打包整个计算环境,提供了一种清晰、可靠且能明确责任划分的解决方案,使得复现实验变得像执行几条命令一样简单。

107:复杂虚拟化场景 🖥️

在本节课中,我们将探讨在数据密集型科学实验中,如何超越单一虚拟机的限制,实现复杂、多组件环境的可复现性。我们将理解为何简单的“代码+数据”打包方式已不足以应对现代大规模数据分析的需求。

从单一虚拟机到复杂环境

上一节我们介绍了将代码、数据、环境和运行平台打包在一起的基本理念。本节中我们来看看,当实验架构变得复杂时,这种单一虚拟机的方案为何会失效。

随着数据集变得越来越大,建议他人仅仅为了复现你的实验就去下载数百TB的数据(例如300TB的MRI图像)变得越来越不切实际。因此,你需要提供的远不止代码本身。你需要提供一个可以运行的环境,以及对其所依赖数据的访问权限。

在商业环境中,你可能可以假设大家共享访问一个通用的基础设施资源。例如,你可以说“这是我的Python脚本,它调用了共享环境中的各种东西,但不用担心,因为你也能访问同一个共享环境”。在这种情况下,实现可复现性的门槛对你来说就降低了。

然而,如果你需要跨越机构边界进行共享,公共云在我看来就成为了唯一可行的选择。当然,在公司内部,情况可能有所不同。

多组件协调架构

正如我们之前提到的,有些架构,尤其是围绕数据密集型实验的架构,需要多种不同类型的资源协调一致地共同工作。

以下是这类架构中常见的组件:

  • 应用服务器:负责运行业务逻辑。
  • 数据库服务器:存储和管理结构化数据。
  • 安装有Hadoop等工具的集群:用于处理大规模数据。

因此,一个虚拟机通常是不够的。

一个科学案例:环境观测与预报系统

为了具体说明这一点,我们来看一个来自科学领域的例子,这个例子与我之前提到的“海洋设备”案例大约处于同一时期。

这是一个环境观测与预报系统,它被设置为运行每日预报。其工作流程非常复杂,涉及多个步骤和外部依赖。

以下是该系统的工作流程与组件:

  1. 数据输入:系统整合来自多方的数据,包括本机构管理的传感器、他人管理的传感器、卫星图像,以及其他机构运行的大尺度、低分辨率模型(例如覆盖地球西半球的模型)的输出。
  2. 数据处理与存储:这些预报输入数据被存入一个大型文件系统,同时用一个关系型数据库来管理元数据。
  3. 模型执行:一系列由Perl脚本、配置脚本和其他遗留管理基础设施组成的系统会启动Fortran模型。这些模型是海洋学现场模型,用于模拟水体的运动并观察其变化。
  4. 结果后处理:模型运行结果输出后,会触发另一系列脚本,从结果中提取统计数据生成可视化图表,并将这些可视化结果发布到网络上

整个基础设施提供了一个在许多情况下都可复现的实验。但要想象将这一切都塞进一个虚拟机里,是行不通的。

数字产物的多样性

在这样的复杂实验中,会产生多种数字产物,远不止最终结果。

以下是一些关键的数字产物类型:

  • 模拟结果本身:模型运行产生的核心数据。
  • 配置与日志文件:记录运行环境和过程的文件。
  • 注释数据产品:对原始数据进行标注和解释后生成的数据。

本节课中我们一起学习了复杂虚拟化场景的挑战。我们认识到,对于依赖多种资源(如专用服务器、数据库、集群和外部数据源)的现代数据科学工作流,单一虚拟机的封装方式已不再适用。通过一个环境预报系统的具体案例,我们看到了一个可复现实验如何由多个协调工作的组件构成,并产生了多样化的数字产物。这为理解更高级的虚拟化和容器化技术(如Docker Compose、Kubernetes)的必要性奠定了基础。

108:共享实验室

概述

在本节课中,我们将探讨数据科学协作中的一个核心挑战:如何快速建立共享、可复现的开发环境。我们将了解传统协作方式的痛点,并学习如何利用现代云基础设施和“基础设施即代码”的理念来解决这些问题。


共享开发环境的挑战与解决方案

问题的普遍性

这个问题已被广泛观察到。在数据科学项目中,跨团队或跨机构协作时,经常需要共享代码、数据和计算环境。

解决方案:基础设施即代码

上一节我们提到了协作的挑战,本节中我们来看看一种核心解决方案:基础设施即代码。其核心思想是使用脚本或配置文件来定义和启动整个计算基础设施。

亚马逊的 CloudFormation 是此类解决方案之一。它允许你通过脚本启动和配置一组协调工作的虚拟机集群,这些虚拟机作为一个单元被部署,并扮演不同的角色。

公式/代码示例:基础设施即代码

# 一个简化的 CloudFormation 模板示例,用于定义资源
Resources:
  MyEC2Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      InstanceType: t2.micro
      ImageId: ami-0abcdef1234567890

同类工具

在 DevOps 环境中,也有像 Chef 这样的工具可以实现类似功能。它们都致力于将基础设施作为代码来管理。

以下是此类工具的核心价值:

  • 你可以编写脚本来启动、设置和操作基础设施。
  • 共享这些脚本(如 Chef 脚本)能为他人提供相同的能力,使其能够启动一个大型、复杂、异构的架构来运行实验。

这些问题正在被解决,而涌现出的解决方案(如 Chef)通常与公有云、商业云服务紧密耦合。


云环境:开发者的“Google Docs”

协作的本质需求

数据科学本质上是一项协作性工作,而可复现性是协作的一部分。同时,协作也意味着当我们需要尝试一个大胆的想法,或者需要与另一个部门具有类似专业知识的同事合作时,能有一个高效的共同工作空间。

传统协作方式的瓶颈

当两个人需要一起工作时,启动一个双方都能访问的“Google 文档”非常有意义,但这仅限于文档工作。如果你们需要一起进行一些共享开发,就需要一个共享的开发环境。

我们在大学环境中观察到,现在几乎每个项目本质上都是协作的,经常需要跨越机构边界一起工作。一个临时的、不受任何特定系统管理员管辖的共享开发环境变得非常重要。

一个具体案例

例如,在跨机构协作时,我们曾经需要等待两周,让对方的系统管理员在我们的机器上提供账户,或者让我们的系统管理员在他们的机器上提供账户。我们当时觉得这很荒谬。

于是,我们转而启动了一个共享虚拟机,为所有人提供访问权限,让大家可以并肩工作,完成后便将其关闭、拆除。这是一个极佳的解决方案。

共享环境的优势

这不仅降低了协作的摩擦,更重要的是解决了沟通效率问题。你不再需要通过电子邮件互相发送错误信息,并试图描述问题以便对方在自己的环境中复现。你可以直接说:“运行这个命令,你就会看到错误信息。”因为你们访问的是完全相同的环境。

我们不可能轻易地互相访问对方私有的内部环境,至少在没有让系统管理员相当不满的情况下是不可能的。正如这里总结的:没有“无法复现”的漏洞。因为如果我看到了问题,那么你也能看到同样的问题。

我们放弃了等待两周建立凭证,转而启动了一个 EC2 实例,在一小时内就开始了工作。我认为,这在部门环境或商业环境中也同样适用。即使由于某些原因你使用的云不一定是公有云,一个能够支持启动新虚拟机、允许不同人员访问、并在完成后可拆除的共享环境,仍然是支持协作性、可复现数据科学的一个非常有用的方面。


总结

本节课中,我们一起学习了数据科学协作中关于环境共享的核心挑战。我们探讨了“基础设施即代码”的理念及其工具(如 AWS CloudFormation 和 Chef),它们通过脚本化方式管理复杂环境。更重要的是,我们认识到云平台能够提供类似“Google Docs”的共享开发环境,这种环境极大地提升了协作效率,消除了“环境不一致”导致的沟通障碍,使得跨团队、跨机构的协同数据科学工作变得更加流畅和可复现。

109:协作与可复现性中的成本与规模经济

在本节课中,我们将探讨在协作、可复现的数据科学工作中,成本如何产生以及如何分担。我们还将分析为何大型公共云服务商能够提供更经济的解决方案。


成本分担:谁为可复现性付费?

在协作和可复现的数据科学背景下,一个核心问题是:谁为可复现性付费? 当处理数百TB数据或运行复杂计算模型时,成本会显著增加。这些成本并非免费,主要包括代码托管、数据托管和代码执行三个方面。

以下是各项成本的分担方式:

  • 代码托管成本:这部分成本通常由代码提供者(你) 承担。你需要将代码托管在某个地方(如GitHub、GitLab或内部服务器),并确保组织内外的协作者能够访问。这部分费用相对较低。
  • 数据托管成本:这部分成本传统上由数据所有者(他们) 承担。在科研或商业环境中,公开托管大规模数据以供他人复现研究,曾因高昂的存储和带宽费用而难以实现。
  • 代码执行成本:在云环境中,这部分成本总是由代码执行者(他们) 承担。他们使用自己的云账户启动计算实例来运行你的代码,你无需为此付费。

上一节我们讨论了成本的基本分担原则,本节中我们来看看云服务商如何改变了数据托管的经济模型。

云服务如何改变数据托管经济

云服务,特别是亚马逊AWS等提供商,正在通过创新的商业模式解决数据托管的成本难题。

以下是关键机制:

  • 转移带宽成本:数据提供者可以配置数据集,使得数据流出(egress)产生的网络带宽费用由数据消费者支付,而非提供者。
  • 公共数据集计划:对于使用率高且愿意公开的数据集,云服务商(如AWS)可能会提供免费托管。其商业逻辑在于,用户为了使用这些数据,会在该云平台上启动EC2实例并购买其他付费服务,从而为云商带来收入。
  • 内部成本核算:即使在公司内部,使用私有云或公有云环境也能清晰地将计算资源成本分配给实际使用的部门(如市场部),避免了因预算归属问题阻碍协作。

然而,如果托管了海量数据却无人使用,存储账单仍需有人支付,这仍然是一个待解决的挑战。但值得注意的是,即使不公开数据,长期存储海量数据本身也是一个成本难题。


规模经济:为何云服务更便宜?

你可能会问,为什么公共商业云这类高度集中的服务能够节省成本?它们为何更便宜?

答案是规模经济

下图展示了一份2009年的早期报告,揭示了超大规模数据中心在几个关键方面的规模经济效益。虽然具体数字在今天(2015年录制时)已发生巨大变化,但其揭示的原理依然成立。

报告主要对比了网络、存储和管理三个类别:

  • 网络:小型数据中心的网络成本约为 $95 / (Mbps·月),而超大规模数据中心的成本可低至 $13 / (Mbps·月),成本比约为 7.1
  • 存储:存储成本的比例约为 5.7,大规模集中采购和管理能显著降低单价。
  • 管理:在传统数据中心,约每 140 台服务器需要一名管理员。在超大规模数据中心,一名管理员可以管理 1000 台甚至更多的服务器。随着自动化程度的提高,这一比例还在持续上升。

这些因规模效应产生的成本节约可以传递给用户。从长远来看,试图通过维护众多小型服务器机房或集群来追赶这种效率是非常困难的。


本节课中我们一起学习了在可复现数据科学工作中的成本分担模式,以及云服务商如何通过商业模式创新(如转移带宽成本、公共数据集计划)来降低数据托管门槛。更重要的是,我们探讨了其背后的根本驱动力——规模经济,它使得超大规模数据中心在网络、存储和管理效率上远超小型部署,从而能够为用户提供更具成本效益的服务。

110:为峰值负载配置资源

概述

在本节课中,我们将探讨在数据科学和IT基础设施管理中,如何为系统负载配置计算资源。我们将分析传统的“按峰值负载配置”方法的局限性,并理解资源不足配置带来的隐性成本,最终了解集中化云资源如何为解决此问题提供方案。

传统配置逻辑:瞄准峰值

上一节我们讨论了资源管理的基本挑战,本节中我们来看看一个常见的资源配置策略。在传统模式下,为系统负载配置资源的唯一合理选择,就是尝试为峰值负载做准备。

以下是按峰值负载配置的典型场景:

  • 薪资处理:例如,在月末薪资处理时,你必须购买足够多的机器来支持该级别的活动量。
  • 数据分析:在数据科学部门,分析任务可能偶尔会变得非常集中和繁忙。为了应对这种情况,并避免大家因集群过于繁忙而感到沮丧,常见的做法是购买一个更大的集群。

理想情况下,你购买的资源量恰好能满足峰值容量。但现实往往更为复杂。

现实困境:资源不足配置

然而,我认为他们提出的一个更现实的观点是,你很可能无法精确匹配峰值。实际情况是,你会购买一定的资源容量,但需求有时会超过这个容量。

这里一个隐蔽的问题是,你可能不会意识到自己处于这种资源不足的状态。因为需求会自然地调整以适应有限的容量。

以下是需求如何“适应”有限容量的例子:

  • 内部用户调整行为:在数据分析部门,数据科学家们会逐渐形成一种认知。例如,在月末报告周期截止日期前,大家知道集群会很忙。因此,他们会选择不去提交某些任务,因为他们知道这些任务无法及时完成。
  • 外部客户流失:如果你在网络上销售产品,情况会更糟。客户如果无法从你的服务中获得良好体验,他们就会直接去别处购买。

因此,这种资源不足配置的观点可能更贴近现实。

解决方案:集中化与云资源的优势

那么,如何应对这个问题呢?论点指出,只有极端的集中化才能帮助对抗这种现象。你必须提供一种近乎无限资源的假象,而商业云服务正好能够提供这种能力。

总结

本节课我们一起学习了资源配置的核心挑战。我们了解到,传统的按峰值负载配置方法可能导致资源在大部分时间闲置,而现实中更常见的资源不足配置则会隐性抑制需求,导致内部效率降低或外部客户流失。最后,我们认识到,通过集中化的商业云平台提供弹性可扩展的资源,是解决这一困境的有效途径。

111:弹性和价格降低 💰

在本节课中,我们将探讨云计算的两个核心优势:弹性持续降低的价格。我们将通过具体案例来理解弹性如何帮助企业应对突发的、不可预测的需求,并分析云服务价格持续下降背后的经济原理。


弹性:按需伸缩的能力

上一节我们讨论了资源供应不足的问题,即需求更可能去适应容量,而非容量去适应需求。这促使我们思考为何需要更集中的资源提供方式。

亚马逊经常使用的一个经典案例是Anmoto公司。该公司通过一系列图片合成短视频片段。他们原本在亚马逊云上稳定运行着40个实例。然而,当他们发布了一个修改版的Facebook应用后,该应用在极短时间内变得非常流行。结果,在短短几天内,他们的实例使用量激增至约5000个的峰值。关键在于,当这个需求高峰过去后,他们又能迅速将实例数量缩减下来。

这种弹性正是使用集中化云服务的优势,也是商业云平台已经为我们构建好的核心能力。在数据科学领域,这种应对突发需求的能力尤为重要,因为正如我们所论证的,需求通常是不可预测的。


弹性的另一种模式:可预测的周期性峰值

弹性不仅体现在应对突发流行事件上,也体现在处理可预测的周期性需求波动上。

以下是一个来自金融行业的例子。图中Y轴同样是使用的EC2实例数量,波动范围相当大,从300到近3000,相差近10倍。我们可以清晰地看到模式:在工作日的交易时段,实例使用量达到高峰;在夜间和非交易时段,使用量下降;而在周末,则持续保持在很低的水平(约30个CPU)。

能够在这种需求低谷期节省成本,并让容量精确追踪需求曲线,这种能力非常强大。除了云服务提供商已经构建好的方案,几乎没有其他方法可以实现这一点。


成本优势的另一面:持续下降的价格

弹性是成本优势的一个方面。另一个方面则是价格本身。如果价格过高,弹性带来的好处可能就无关紧要了。

关于云服务价格过高的论点,在过去两年里实际上已经被大大削弱了,这主要归功于亚马逊、微软和谷歌三大巨头之间的激烈竞争。每当一家公司降价,其他公司通常会在几周甚至几天内将价格调整到相同水平。

即使在亚马逊几乎是唯一玩家的早期,其价格也在急剧下降。下图展示了单个EC2计算单元在约三年内,其计算和内存资源的价格变化曲线。曲线上的每一个下降点都对应着一次价格调整公告,可能是特定类型实例降价,也可能是全面的价格削减。

价格差异非常显著。在服务刚推出时,一个计算单元的价格约为500美元,一个内存单元的价格约为1500美元。而到了后期,计算单元价格降至原来的三分之一或五分之一,内存单元价格降至原来的三分之一。这仅仅是在几年内,在几乎没有竞争的情况下,仅凭规模经济效应实现的。


存储成本的下降趋势

存储成本也呈现出类似的大幅下降趋势。无论是按每太字节还是每拍字节计算,价格都显著降低。

我们过去常常比较云存储和在校内自建存储的成本。有一段时间,在原始数据存储的纯经济成本上,我们自建方案可能更具优势。但云服务商最近已经跨越了这个门槛。即使我们采取各种捷径,比如购买大量廉价硬盘、降低冗余度和安全性(这通常是大学环境下的做法),我们也无法再在成本上与之竞争。云存储价格正像石头一样快速下落。


总结

本节课我们一起学习了云计算的弹性价格降低两大核心优势。

  • 弹性 允许资源容量精确追踪实际需求,既能应对Anmoto那样的突发流量高峰,也能适应金融行业那样的周期性波动,从而在需求低谷期显著节省成本。
  • 持续的价格下降 则得益于云服务商的规模经济和激烈的市场竞争,使得计算、内存和存储资源的单位成本不断降低,让大规模数据处理变得更加经济可行。

这两点共同构成了在云平台上进行大规模数据科学分析的重要经济和技术基础。

112:服务器成本与电力成本 💻⚡

在本节课中,我们将探讨数据中心运营成本的核心构成,并分析为何在云计算时代,单纯为了省电而关闭闲置服务器的传统策略可能并不经济。


上一节我们讨论了数据中心的总体成本结构。本节中,我们来看看一个由亚马逊数据中心专家詹姆斯·汉密尔顿提出的重要观点。

詹姆斯·汉密尔顿曾就职于微软,最初以数据库专家闻名。他针对“绿色计算”领域的一项常见研究提出了不同看法。这项研究旨在通过关闭集群或数据中心中的闲置服务器,将工作负载集中到更少的机器上,以达到节省电力成本的目的。

詹姆斯认为,这项研究的目标本身意义不大。原因在于,拥有一台闲置机器的成本极其高昂。

以下是支撑这一观点的几个关键因素:

  • 服务器硬件成本是主体:图表显示,服务器本身的购置成本占据了数据中心运营成本的绝大部分(图中最大份额部分)。购买来的机器如果闲置不做任何有用功,本身就是巨大的资本浪费。
  • 配套基础设施成本已发生:为了支持这些服务器运行,企业已经支付了电力供应、冷却系统以及所有相关基础设施的建设成本(图中紫色、红色等部分)。这些都属于沉没的资本支出。

既然已经为机器和基础设施支付了高昂费用,现在却要将其关闭,这并不划算。亚马逊不需要这样做,因为他们有办法避免计算机闲置。

一种竭尽全力避免计算机闲置的方法就是降低价格,为那台计算机寻找更多的工作。这正是亚马逊能够做到的,也是他们推出“竞价型实例”的原因。他们可以通过拍卖机制,将计算资源提供给出价最高的用户(这可能低于其标定价格)。

这种策略是你在自己的数据中心内无法实现的。在你的私有数据中心里,为了节省一点电力成本(图中绿色部分),唯一的选择就是关闭设备,而此时你已经承担了所有其他成本。

因此,只有亚马逊这类云服务商能够提供这种规模经济效应。


关于云服务成本优势的另一个论据是价格的持续快速下降。其他研究者的数据显示,不仅是在亚马逊,跨云服务提供商来看,成本都在显著降低。

以下是2013年一些关键资源成本的下降幅度:

  • 计算成本:下降 42%
  • 带宽成本:下降 15%
  • 数据库成本:下降 8%
  • 存储成本:下降 23%

这些成本正在迅速下降。


本节课中,我们一起学习了数据中心成本分析的一个重要视角:由于服务器硬件和基础设施的资本成本占主导地位,单纯为省电而关闭闲置服务器的策略在经济上可能低效。相比之下,大型云服务商(如亚马逊)凭借其规模效应和灵活的资源分配机制(如竞价实例),能够通过最大化利用率来摊薄固定成本,从而实现更优的经济性,并推动市场价格持续快速下降。

113:大数据的可重复性 🧪

在本节课中,我们将探讨在大数据背景下进行可重复性研究时面临的挑战与解决方案。核心在于理解为何传统的数据共享和代码执行方式在数据规模巨大时不再适用,以及如何通过改变数据处理范式来应对这些挑战。


随着数据集变得越来越大,移动数据的时代已经结束。通过互联网传输1TB数据可能需要数天,并且很可能失败。复制1PB数据在操作上几乎不可能,也不应该发生。因此,唯一的解决方案是将计算推向数据所在之处,而不是将数据移动到计算所在之处。这对于完成工作至关重要,尤其是在可重复性研究的背景下,要求他人通过将数据集复制到其“本地环境”来复现你的结果是毫无意义的。

上一节我们讨论了移动大数据的不可行性,本节中我们来看看这如何促使我们寻找新的数据存储和共享方案。

这直接促使我们将大型数据集的存储位置,设置为可以与全球所有人共享的地方。这些地方就是云服务提供商。虽然我们讨论过供应商锁定等问题,但即使你想从一个提供商迁移到另一个,他们数据中心之间拥有高速连接的可能性,也远高于你的数据中心与他们数据中心之间拥有高速连接的可能性。因此,尽管迁移困难,但在商业环境下,这更有可能实现。


当前,可重复性研究社区倾向于强调计算层面的可重复性,例如是否在提交论文时附上了脚本,是否将所有内容都放在了GitHub上等。他们要么不担心数据问题,要么假设数据足够小或不重要。这是一个问题。

仅仅重新执行预设的实验是不够的。这一点与我之前关于虚拟机是好主意的论点有些相悖,我们稍后会再次提及。虚拟机环境确实有助于精确复现他人运行过的内容,但它不一定能为你在此工作基础上进行构建提供太多帮助。你有一堆脚本、依赖项和已安装的库,可以运行程序,但这并不一定意味着你能理解其中的任何部分。


随着数据集变大和代码变得更复杂,数据库和查询开始扮演更重要的角色。你需要支持对数据进行即席的探索性问答,而不仅仅是重新运行代码。

要求他人“吃你的狗粮”,即仔细研读你的Python脚本,是很困难的。相比之下,要求他人“重新运行这个查询,然后修改查询以运行你自己的查询”,这个要求通常更低。因此,你需要的是查询而非程序,是数据库而非文件,以此来减少重新运行实验所需的代码量和认知负担。Python文件中大量与管理文件、解析文件等相关的代码,在使用数据库时都会消失。


因此,为研究提供数据库即服务,恰好是我们为那些不一定有丰富编程经验的“长尾”科学家们搭建的一个平台。在那里,你可以上传数据、编写查询、与朋友分享查询等,真正地将你的计算流程构建为一系列嵌套查询,并看看这能带你走多远。

我们发现,这实际上可以走得很远。大部分逻辑都可以用SQL表达,而不需要大量代码。机器学习模型、统计模型可能不适用,但很多工作都与表格操作有关。


我们这里有一个例子:找出所有在至少一个样本中缺失的Tigerfam ID(本质上是蛋白质标识符)。这三个样本分别来自水域的某个地点、河流或河口的某个点,以及海洋的某个点。比较这三个样本中的微生物种群,试图理解它们有何不同。问题是:找出在至少一个样本中缺失的东西。如果某个东西在三个样本中都很常见,那就不太有趣,我不关心它。如果有东西不同,我想知道。这可以简洁地表达为一个SQL查询,但却需要大量的Python代码来构建字典、读取文件、处理数据,而查询的实际逻辑很难从这个庞大的程序中剥离出来。

我们收集的这类例子表明,对于某些任务,SQL实际上看起来更好,而不是更差。


在本节课中,我们一起学习了大数据环境下可重复性研究的核心挑战。我们认识到移动海量数据的不切实际,从而转向将计算推向数据的云解决方案。我们探讨了仅靠共享代码和虚拟机的局限性,并强调了数据库和声明式查询(如SQL)在降低认知负担、支持探索性分析以及清晰表达数据逻辑方面的重要优势。最终,通过将数据处理流程构建为可共享和可修改的查询序列,我们可以更有效地实现和传播可重复的大数据科学研究。

114:反论与总结

📖 概述

在本节课中,我们将探讨关于使用虚拟机(VM)和容器技术来确保研究可重复性的不同观点。我们将介绍一位专家提出的反论,分析其核心论点,并最终总结云计算平台如何为可重复研究提供一个全面的解决方案。


🔍 关于虚拟机使用的反论

上一节我们介绍了使用虚拟机来封装研究环境以促进可重复性的优点。本节中,我们来看看对此方法的一个主要反对观点。

提出这一反论的是Titus Brown,他是一位深入思考研究可重复性问题的专家。

他的核心论点是,仅仅将虚拟机公之于众,实际上是在鼓励一种不良行为。他努力说服人们避免这种行为,即研究者只是说:“这是我的所有代码,你自己去弄明白吧。” 这就像提供了一个完整的“犯罪现场”,虽然包含了所有信息,但缺乏指引。

Titus Brown的观点是,可重复性更多地关乎在他人的成果基础上进行构建,而不仅仅是原封不动地重新运行完全相同的实验。因此,研究者需要提供关于如何设置理解那个环境的说明。透明度不仅仅是访问权限,更是关于文档记录

他进一步阐述,研究者需要的不是一个杂乱的环境本身,而是如何构建那个环境的完整描述。这样,其他人才能根据需要修改环境,在其他地方建立自己的环境,并真正控制不同变量以实现复现。

仅仅因为实验在你的虚拟机中能再次运行,并不必然意味着当其他人尝试实际操作时也能成功。因此,研究者实际上希望改变一些变量,希望有独立的实验室来验证结果,就像希望两个不同地点的湿实验室实验能运行并得到相同结果一样。如果只是在同一个实验室里重复操作,并不能完全确定是否真正实现了复现。


🤔 对反论的回应

针对上述观点,我的回应如下。

当前研究可重复性的现状相当糟糕,存在巨大问题。在数据科学领域,情况类似:论文发表了,但数据和代码往往被隐藏起来。这是一个亟待解决的问题。

我同意Titus的观点,即仅分享虚拟机是不够的。然而,如果我们能让人们广泛地分享他们的虚拟机或容器(在当今时代主要指容器),这将是一个巨大的进步。特别是对于数据科学和科学研究中的“长尾”部分(指大量的小型、非主流研究),要求他们完全掌握使用GitHub管理所有代码、使用亚马逊等平台共享所有数据等技能,并成为完美的“科研公民”,是尤其困难的。

有时被提及的另一个问题是,虚拟机本身可能是一个“庞然大物”。如果我为每个不同实验都保存了50个虚拟机,当我想结合来自不同实验的想法时,可能无法以特定方式将它们合并,最终不得不将它们拆解。但这个问题正在逐渐消失,因为容器技术正是为解决这类问题而设计的。


✅ 总结与核心方案

本节课中我们一起学习了关于可重复性方法的辩论。现在,我们来总结云计算提供的解决方案。

云计算为可重复研究提供了一个相当全面的平台。云计算所代表的集中化模式,也许可以通过其他方式复制,而不一定非要使用亚马逊等具体服务,因为在某些行业或背景下这可能不可行。但我认为它满足了所有关键要求。

以下是实现可重复研究需要满足的核心条件,云计算平台能够全面支持:

  • 数据 + 代码 + 环境:研究的所有组成部分。
  • 运行平台:用于运行上述数据、代码和环境的完整平台,由云服务提供。

无论规模大小(从MB到PB),无论计算类型(从长时间运行的计算到简单脚本),无论架构复杂度如何(大型异构架构),云计算都能提供支持。这些都是常见问题,并且正在被解决。

本质上,我的整个实验室资源,我的“实验台”,就是你的“实验台”。我能在云中访问所有这些强大的工具,而根据定义,因为是第三方服务,你也能访问完全相同的工具。

虚拟机容器(或许结合Chef等配置脚本)可以被共享和保存。这些数字制品代表了你的研究。它们成为了你实验的可执行证明,而不仅仅是环境设置的描述。它们实际上是可执行的单元,可以直接运行以重现整个实验环境。

最后,对于数据密集型的实验,除了使用某种大型共享数据平台之外,几乎没有其他选择,因为在某些数据规模下,移动数据是不现实的。


本节课中,我们一起探讨了关于使用虚拟机确保可重复性的反论,理解了透明度与文档的重要性,并最终总结了云计算及其容器技术如何为不同规模与复杂度的研究提供了一个强大、共享且可执行的可重复性解决方案。

posted @ 2026-03-26 12:26  布客飞龙III  阅读(13)  评论(0)    收藏  举报