纽约石溪大学-CSE519-数据科学笔记-全-

纽约石溪大学 CSE519 数据科学笔记(全)

001:课程介绍与概述 (2024秋季)

在本节课中,我们将学习课程的基本信息、数据科学的定义及其重要性,并了解本课程的核心内容与方向。

课程介绍

我叫史蒂夫·斯基纳,这是CSE519数据科学课程。

很抱歉今天无法亲自到场。由于我在西班牙巴塞罗那参加一个会议并领取奖项,因此本次课程将通过远程方式进行。我将在周五返回学校处理相关问题。如有紧急事务,可以通过邮件联系我。

什么是数据科学?

上一节我们介绍了课程的基本情况,本节中我们来看看数据科学的定义。

数据科学是一个交叉领域,它处于计算机科学、统计学、机器学习等学科的交叉点。

数据科学涉及探索性数据分析应用机器学习以及大规模计算

数据科学成为一个重要领域的原因有以下几点:

  • 数据量激增:新的记录技术(如互联网)产生了海量数据。
  • 计算能力进步:例如亚马逊云服务等技术使得大规模数据分析成为可能。
  • 商业价值显现:通过现代数据分析处理大量数据能创造巨大价值。例如,文艺复兴科技公司通过对股票数据进行分析取得了巨大成功;在体育领域,数据分析也被用于选拔优秀运动员和制定最佳策略。

数据科学的历史背景

在了解了数据科学的定义后,我们来看看它的历史演变。

我使用Google Ngrams(一个分析海量书籍文本中词汇使用频率的工具)的数据来说明。分析显示,“计算机科学”一词在20世纪60年代中期之前并不存在,大约在80年代开始流行。而在“计算机科学”之前,这个领域常被称为“数据处理”。这表明,早期计算的核心驱动力被认为是数据,随后重点转向了算法等其他方面。如今,“数据科学”的兴起可能意味着我们正回归到一个重新认识到数据重要性的时代。

本课程的核心内容

明确了数据科学的历史脉络后,本节将具体介绍本课程的重点。

数据科学不等同于机器学习。本课程将包含一些机器学习内容,但这并非课程最核心或最基础的部分。

我们将学习如何处理数据和模型,包括:

  • 某些模型的工作原理。
  • 数据清洗:数据的来源以及如何为机器学习模型准备数据。
  • 数据可视化
  • 许多与数据解释相关的内容。

本课程不会重点讲授深度学习和生成式人工智能。虽然课程中包含应用机器学习,但如果你希望深入学习生成式AI或深度学习,可能需要选择其他课程。

讲师背景

在介绍了课程内容后,以下是关于我本人教学背景的说明,这影响了本课程的设计。

我教授的内容基于多年的项目经验,这些项目都涉及基于数据的建模。我曾撰写过相关书籍,并开发过一个涉及数学建模和统计分析的运动博彩系统。多年来,我与生物学家和社会科学家有许多合作,他们看待数据的方式与计算机科学家历史上“将数据视为程序运行材料”的视角截然不同,更倾向于将数据视为理解世界如何运作的材料。我还在大规模文本分析和自然语言处理领域有多年研究项目经验,并曾创办一家旨在分析所有社交媒体数据的初创公司。

总结

本节课中我们一起学习了课程的基本安排,探讨了数据科学的定义、其成为重要领域的原因以及历史背景。我们明确了本课程将侧重于数据处理、清洗、可视化和解释等基础技能,而非深度学习和生成式AI的前沿内容。最后,了解了讲师的相关背景。

002:线性回归 📈

在本节课中,我们将学习线性模型在分类和回归中的应用。我们将从线性回归的基本概念开始,探讨其重要性、工作原理以及一个有趣的几何视角。

概述

线性回归是数据科学中最基础且重要的模型之一。尽管有人认为它有些传统,但它对于构建可解释的模型、理解更复杂模型的训练过程以及认识纯线性模型的局限性及其解决方法都至关重要。本节课我们将深入探讨线性回归的核心思想。

线性回归简介

线性回归的目标是,给定一组变量(特征 X)和对应的目标值 Y,找到一条最能拟合这些数据点的直线(或超平面)。

用公式表示,我们试图找到参数 w(权重)和 b(偏置),使得线性函数 Y ≈ w * X + b 能最好地预测数据。

上一节我们介绍了线性回归的基本目标,本节中我们来看看为什么线性函数如此受欢迎。

为何选择线性模型?

线性函数易于理解。在许多情况下,事物随变量的增长呈线性关系,因此线性模型是一个合理的假设。

然而,现实世界中几乎没有事物是绝对线性的。严格来说,如果你希望某关系是线性的,你只应在两个点上进行测量。

尽管如此,线性模型因其简单性和可解释性,在实践中仍然非常有用。

一个有趣的几何视角:对偶性

在思考线性回归的难易时,有一个有趣的视角。考虑以下两个问题:

  1. 给定 N 条直线,找到一个同时位于所有这些直线上的点。
  2. 给定 N 个点,找到一条穿过所有这些点的直线。

这两个问题本质上是相同的。这可以通过“对偶变换”来理解。

在对偶变换中(以二维空间为例),点和线可以相互转换:

  • 一个点 (s, t) 可以解释为一条直线:y = s * x - t
  • 一条直线 y = s * x - t 可以解释为一个点 (s, t)

这个变换的神奇之处在于它保持了“隶属”关系。例如,如果一个点位于某条线上,那么在对偶空间中,对应的线将穿过对应的点。

因此,求解线性方程组(找多条线的交点)的问题,在对偶空间中就变成了找穿过多个点的直线的问题。这揭示了两个问题在数学上的等价性。

理解了寻找精确穿过点的直线问题后,我们来看看线性回归的核心挑战是什么。

线性回归的核心挑战

线性回归的挑战性在于引号中的“最佳”二字。

我们寻找的并非精确穿过所有数据点的直线(这通常不可能),而是最能拟合所有数据点的直线。这意味着我们需要一个标准来衡量“最佳”拟合,并有一个方法来找到它。

总结

本节课我们一起学习了线性回归的基本概念。我们了解到线性模型因其可解释性和作为理解更复杂模型的基础而具有重要意义。我们探讨了一个通过“对偶变换”理解线性回归问题的有趣几何视角,并明确了线性回归的核心是寻找对数据点的“最佳”拟合,而非精确穿过。在接下来的课程中,我们将深入探讨如何定义和计算这个“最佳”拟合。

003:聚类分析 🧩

在本节课中,我们将学习聚类分析。聚类是一种无监督学习方法,旨在从数据点集中发现自然的分组或“簇”。我们将探讨其基本概念、应用场景以及一个著名的科学发现案例。


课程概述与作业答疑

现在,我们开始上课。首先,关于作业3,大家有任何问题吗?

有多少同学觉得作业在掌控之中?

我看到不少同学觉得没问题。那么,有没有遇到什么技术障碍?

没有技术障碍吗?

好的。有没有什么有趣的观察,或者让同学们感到惊讶的发现?

好的。

关于降维。我们会在接下来的几节课中,可能是下一节,详细讨论降维。

降维的目标是在降低数据维度的同时,尽可能保留其内在结构。

当维度降低过多时,结构可能会消失。问题是,多少算“过多”?这可能取决于具体的应用场景。

现在,回到你刚才提到的问题,具体是什么?

关于降维到特定维度时的情况。

当我将高维嵌入向量降维时。

好的,我明白了。你的意思是,首先,这里有两个不同的任务:语言任务和视觉任务。

语言和视觉任务上的表现可能不同。

我们快速做个调查。对于视觉任务,当我们将维度降至中等水平时,聚类的准确性是大幅下降还是基本保持不变?

我听到有同学说下降了。

现在看看语言任务。当你将语言数据的维度适度降低时,准确性是下降还是基本保持不变?

我听到教室这边说基本不变。教室这边呢,是保持不变还是下降了?

什么?好的,所以教室里出现了两个“簇”。这边是认为准确性基本不变的同学,那边是认为准确性下降的同学。

下降幅度大吗?还是小幅下降?😡

小幅下降。好的。当我们做实验时,我记得在语言任务上做过。我不太确定在视觉任务上是否做过。

我不太确定我们是否在视觉任务上做过。

在视觉任务上,我观察到的是,当你将维度降低相当多时,质量基本保持不变。

有时甚至在降低维度后,质量还略有提升。有谁看到了这种情况?

他看到了。他看到了。有些同学没看到。

第一个问题是,为什么降低维度有可能使结果变好?

一个可能的原因是,许多维度包含了噪声。

假设我拿到你的数据集,你说:“哦,我的数据只有100个维度。”

我说:“我可以再给你100个维度,只需在每个列生成随机数。”现在你有了200个维度。这会让你的聚类效果更好还是更差?

可能更差。现在,如果你进行降维处理,很可能会试图剔除噪声。

这样你可能会得到更好的结果。这就是为什么降维可能提升性能的奥秘。😡

也许你数据中的许多特征包含噪声,它们并不重要,或者它们与其他特征高度相关,本质上是重复的。

这就是为什么降维可能带来改善。

好的。对于那些性能下降的情况,我记得在NLB1任务中,你们从多少维度降到了10维?

多少?

什么?我没听清。768?好的,所以是从768维降到了10维。

嗯。

有多少同学发现性能至少保持了合理的相似性?

如果性能基本相似,请举手。

他说是的。他说是的。他们说“是”,你们这边不说“是”吗?

降维前后的准确率大概是多少?

准确率的大概数值。

好的。

我预期的是,首先你们自己做实验,但我认为你们会发现,对于语言任务,压缩维度后,应该能大致保持相同的准确率。

哦。

我们下节课会详细讨论降维。至于为什么降维有用,如果它能剔除噪声,就可能会提高准确性。

即使不能提高准确性,也肯定能让数据处理更方便。

当然,如果降维完全破坏了所有数据结构,那就不好了。

关于这一点还有问题吗?关于作业还有其他问题吗?最后,关于课程项目有任何问题吗?如果有问题,可以下课后找我讨论,或者在我办公时间来谈。😊

有问题吗?好的,接下来我想讨论的是聚类分析。


聚类分析简介 🎯

聚类分析是我在上节课末尾简单介绍过的问题。基本上,它是指给定一组通常位于某个数据空间中、具有某种结构的数据点,目标是找出它们自然的群组。

这是我见过的最好的聚类应用案例之一。我想解释一下这个图表,因为它代表了一项惊人的科学发现。

这些是数据。有多种技术可以……你们身体里都有细胞。

这些细胞会分裂,对吧?

你们都看过这些图片吧?一个细胞,突然它……这样,然后“噗”一下变成两个细胞。

当你的细胞分裂异常时会发生什么?有谁知道细胞分裂出问题时,你会怎么样?

异常分裂。癌症,是的,坏事。癌症本质上是一种细胞分裂疾病。因此,理解细胞如何分裂非常重要。

细胞分裂是细胞功能的一个非常基本的部分。细胞必须学会、必须进化出分裂的能力。

这是在数十亿年前,不是最近。

所以,所有细胞的分裂方式大致相同。

这是一项试图弄清楚酵母细胞分裂如何运作的研究。你们在多大程度上像酵母?嗯,在很多方面你们比酵母聪明,但你们的细胞分裂方式大致相同。

那么,这项研究试图做什么?

问题是,哪些基因参与了细胞分裂过程?

酵母的基因数量相对较少。


课程总结

本节课中,我们一起学习了聚类分析的基本概念。我们首先回顾了作业中关于降维的讨论,探讨了降维可能通过剔除噪声来提升聚类性能的原因。接着,我们正式引入了聚类分析,将其定义为在数据点集中发现自然分组的方法。最后,我们通过一个关于酵母细胞分裂的基因研究案例,初步展示了聚类在真实科学发现中的强大应用。下节课我们将深入探讨具体的聚类算法。

004:最近邻方法(第二部分)

在本节课中,我们将继续探讨最近邻方法,特别是处理高维数据时面临的挑战及其解决方案。上一节我们介绍了距离函数的基本概念,本节中我们将看看维度缩减技术及其对最近邻分类性能的影响。

概述

最近邻方法的核心思想是:你有一些已标记的数据点,以及一些未标记的数据点。你将未标记点标记为与其距离最近的已标记点的类别。然而,当数据点位于高维空间时,距离的概念会变得复杂,性能可能下降。因此,我们需要一些技术来应对高维数据。

高维数据的挑战

在上一节中我们提到,高维空间中的“距离”概念与低维空间不同。一个常见的应对策略是使用不同的距离函数。

以下是几种距离函数的公式:

  • Lk距离distance = (Σ|xi - yi|^k)^(1/k)
  • k=2 时,即为欧几里得距离
  • k=1 时,即为曼哈顿距离

通常,较小的 k 值(如 k=1)在处理高维数据时表现更好。你可以在作业中尝试调整这个参数。

维度缩减

使高维数据“降低维度”的一种方法是使用维度缩减技术。在我的线性代数讲座中(稍后会回顾),我们将学习一种称为奇异值分解(SVD) 的流行方法。在作业中,你们需要将数据点的维度压缩到更小的数量。

为什么这是一个好主意?因为距离函数在低维空间中更有意义,因此处理起来更简单。

维度缩减的潜在缺点是:理论上,如果原始维度是精心构建且重要的,压缩过程会丢失信息。然而,实际情况往往令人惊讶,你通常可以大幅压缩数据而性能保持不变,甚至更好。

有时,维度缩减能帮助去除误差而非重要信息。例如,如果嵌入向量中的每个元素都添加了随机噪声或测量误差,那么进行维度缩减时,最有可能被去除的正是这些噪声,从而可能得到更纯净、更好的数据表示。

关于作业中的实验结果,有同学反馈在视觉任务上进行维度缩减后,准确率下降很多;而在自然语言处理任务上则没有。这可能是因为不同数据集的特性不同。对于NLP任务,我们的经验是能够显著降低维度同时保持准确率大致不变。请你们通过实验亲自验证。

距离范数的注意事项

再次强调,当你使用任何距离范数时,默认情况下所有维度都被平等对待。这意味着每个特征对最终距离的贡献权重相同。在某些情况下,你可能需要对不同特征进行加权,但这超出了当前讨论的范围。

总结

本节课我们一起学习了应对高维数据最近邻分类的挑战。我们探讨了使用不同距离函数(如Lk距离)的策略,并重点介绍了通过奇异值分解等方法进行维度缩减的技术。维度缩减可以帮助我们在低维、更易处理的空间中工作,有时还能通过去除噪声来提升模型性能。请通过实践作业来深入理解这些概念。

005:决策树与提升(2024秋季)

在本节课中,我们将学习决策树与提升算法的核心概念。首先,我们会回顾项目提案的评分流程,并提供一些通用反馈。接着,我们将深入探讨决策树的工作原理、如何构建以及如何通过提升技术来增强其性能。

项目提案评分流程回顾

上一节我们介绍了课程背景,本节中我们来看看项目提案的具体评分流程。

提案由两位不同的评分者(助教或教授)进行评审。每位评分者会依据三个标准进行打分,每个标准的平均分目标设定为4分(满分为7分)。评分完成后,会对所有分数进行标准化处理,使最高分约为100分。最终成绩基于标准化后的总分进行计算。

以下是评分时关注的三个核心标准:

  • 创新性:项目想法的原创性与新颖程度。
  • 工作量:项目预计的复杂度和所需投入的工作量。
  • 推进计划:对项目后续步骤的清晰规划和愿景。

提案的平均分中位数约为72分。得分较高的提案通常具有明确的方向、已开始初步实验并对问题难度有所了解。得分较低的提案则可能内容空泛、方向模糊,或仅完成了基础的数据概览。

提案的评分已经确定。当前的重点是根据反馈,明确后续三周内的具体工作方向。如果对方向感到不确定,建议与教授或助教讨论。

各项目提案通用反馈

在了解了整体评分机制后,我们来看看针对不同项目数据集的一些通用观察与建议。

最受欢迎的项目是关于“乔笑话语料库”的分析,共有32份提案。由于选择同一数据集的人数众多,若想脱颖而出,需要一个清晰且独特的切入点。

助教们注意到,许多提案计划对笑话进行分类或聚类,并微调模型。对此有几点需要考虑:

  • 微调目标:需明确模型预测的目标,例如是预测“有趣程度”还是“话题流行度”。
  • 可行性:微调模型可能成本较高,且不一定是获得有趣结果的最佳路径。
  • 替代方案:可以考虑手动标注少量笑话作为训练集,而非完全依赖现有评分数据。

核心建议是:在众多同类项目中,找到一个巧妙且独特的分析角度更可能获得成功。

决策树基础原理

现在,让我们从项目讨论转向核心教学内容。本节我们将介绍决策树的基本原理。

决策树是一种模仿人类决策过程的机器学习模型。它通过一系列简单的“是/否”问题对数据进行分割,最终达到分类或回归的目的。

构建决策树的关键在于如何选择每个节点上进行分割的特征。其目标是使分割后的子集尽可能“纯净”。我们使用信息增益基尼不纯度等指标来量化这种纯净度。

信息增益基于熵的概念。熵衡量了集合的混乱程度,公式为:
Entropy(S) = - Σ p_i * log₂(p_i)
其中 p_i 是集合 S 中第 i 类样本的比例。信息增益则是分割前后熵的减少量。

基尼不纯度衡量从数据集中随机抽取两个样本,其类别标签不一致的概率,公式为:
Gini(S) = 1 - Σ (p_i)²
基尼不纯度越小,数据集越纯净。

决策树会递归地选择能带来最大信息增益(或最小基尼不纯度)的特征进行分割,直到满足停止条件(如达到最大深度或节点样本数过少)。

提升算法:从弱到强

单一的决策树可能容易过拟合或表现不佳。本节中我们来看看如何通过提升算法组合多个弱模型来创建一个强模型。

提升算法的核心思想是顺序地训练一系列弱学习器(通常是浅层决策树,即“树桩”),每个后续模型都专注于纠正前一个模型所犯的错误。

最著名的提升算法之一是AdaBoost。其工作流程如下:

  1. 初始化所有训练样本的权重,使其相等。
  2. 对于每一轮迭代:
    • 使用当前的样本权重训练一个弱学习器。
    • 计算该弱学习器的加权错误率。
    • 根据错误率计算该弱学习器的“话语权”(权重),错误率越低,权重越高。
    • 更新样本权重:增加被当前弱学习器错误分类样本的权重,减少正确分类样本的权重。这使得后续的弱学习器更关注难分的样本。
  3. 将所有弱学习器的预测结果按其权重进行加权求和,得到最终的强模型预测。

通过这种关注错误样本、加权组合的方式,提升算法能够显著提高模型的整体性能。

总结

本节课中我们一起学习了两个主要内容。首先,我们回顾了项目提案的评分细节,并强调了为最终项目确定清晰、独特方向的重要性。其次,我们深入探讨了决策树与提升算法:决策树通过递归分割数据做出决策,而提升算法(如AdaBoost)则通过顺序组合多个弱学习器来构建强大的集成模型,后续模型专注于修正前序模型的错误。理解这些基础概念对于构建有效的预测模型至关重要。

006:逻辑回归与分类

在本节课中,我们将学习如何将线性模型应用于分类问题。我们将从探讨使用线性回归进行分类的局限性开始,然后引入逻辑回归这一专门为分类任务设计的核心方法。

项目提案提醒

项目提案今晚截止。关于项目提案有任何问题需要澄清吗?

提案要求三页正文加参考文献,不要提交四页。目标是说服我们你清楚自己要做什么。这意味着你需要一个清晰的计划,说明从现在到项目完成期间打算做什么。清晰的计划不意味着要列出每天或每周的具体任务,但需要明确下一步的行动方向,以及如果某个方案行不通,你的备选方案是什么。

理想情况下,提案中应包含你目前已开展工作的证据。如果你已获得部分结果、图表或进行了背景阅读,将这些内容放入提案中是很好的做法。请在三页的篇幅内,展示你认为最有价值的内容。

关于提案还有问题吗?如果只是罗列一堆想法,例如“我们有10个想法,看看哪个可行”,这不如明确说明“这是我最感兴趣的方案,这些是可能遇到的障碍,如果无法克服,我将转向另一个方案”来得有效。如果你能提供一些初步实验或结果来佐证你的计划,那会更好。

今天下课后我需要立刻赶回办公室参加一个11点的电话会议。如果你想课后和我讨论项目,可以和我一起跑过去,或者必要时等我的电话结束。

从线性回归到分类问题

上一节我们介绍了线性回归,讨论了如何使用线性代数或梯度下降法求解,以及如何构建线性回归问题。本节中,我们来看看如何将这类线性模型用于分类问题。

分类问题是指:给定一些样本,你需要尝试识别它们属于哪个类别。例如:

  • 判断一个人是男性还是女性(二分类)。
  • 预测一个选民会投票给民主党还是共和党(二分类)。
  • 判断一个活检样本是恶性还是良性(二分类)。
  • 在你们上次的作业中,处理的是多分类问题,例如给定一张图片,判断它是猫、汽车还是飞机;或者给定一段文本,判断它是新闻文章还是体育文章。

分类问题的输入是一条记录,输出是为其分配一个标签。这是数据科学中一项基础且常见的任务。

为何线性回归不适合分类?

首先,我们看看如何尝试用线性回归做分类,并分析其优劣。

回想一下,线性回归的目标是接收一条记录并预测一个连续的目标值。那么,如果目标变量是二元的(例如,正类标记为0,负类标记为1)呢?你可以想象训练一个线性回归模型,其中X值是项目的所有特征,而你要预测的Y值就是这个二元目标变量。这种形式对于二分类是可行的。

现在,假设我们有一个一维数据集,有正例和负例。我们试图区分女性和男性,女性在左边,男性在右边。我们找到了最佳拟合线。

我们如何将这个回归线用作分类器?对于给定的X值,我们预测其Y值。你可能会说,如果预测值大于0.5,就判定为男性;小于0.5,则判定为女性。这看起来似乎可行,但这种做法有什么问题或缺点呢?

这种做法有几个奇怪的地方:

  1. 对异常值敏感:如果我们在训练集中加入“超人”(一个特征值极大、确定性极高的男性样本)会怎样?回归线会严重偏向这个异常点,试图拟合它。这是我们想要的吗?不是。添加“超人”反而会使我们的分类器对普通样本的表现变差。
  2. 优化目标不匹配:分类器真正需要的是一个决策边界,一条能将两类数据分开的线。回归线隐含了一个边界(如0.5处),但它的优化目标是最小化所有点到线的距离平方和(拟合数据),而不是最大化分类的准确性(分隔数据)。

因此,使用线性回归进行分类效果不会很好。构建分类器时,我们真正需要学习的不是一条拟合数据的线,而是一条划分数据的线,即分离正类和负类的决策边界。

逻辑回归:专为分类设计的模型

为了解决上述问题,我们引入逻辑回归。逻辑回归虽然名字中有“回归”,但它是一种用于分类的线性模型。其核心思想不是直接预测类别标签(0或1),而是预测一个样本属于正类的概率

逻辑回归通过一个特殊的函数——Sigmoid函数(或逻辑函数)——将线性组合 w·x + b 的结果映射到 (0, 1) 区间,这个值就被解释为概率。Sigmoid函数的公式如下:

σ(z) = 1 / (1 + e^{-z})

其中,z = w·x + b(即特征的线性组合)。

这个函数具有完美的S形曲线:

  • z 趋近于正无穷时,σ(z) 趋近于1。
  • z 趋近于负无穷时,σ(z) 趋近于0。
  • z = 0 时,σ(z) = 0.5

这样,逻辑回归模型的输出 P(y=1|x) = σ(w·x + b) 就是一个介于0和1之间的概率值。我们可以设定一个阈值(通常为0.5),当概率大于等于阈值时,预测为正类;否则预测为负类。这里的 w·x + b = 0 就定义了决策边界(一个超平面)。

总结

本节课中,我们一起学习了分类问题的基本概念,并分析了直接使用线性回归进行分类的局限性(对异常值敏感、优化目标不匹配)。接着,我们引入了逻辑回归模型,它通过Sigmoid函数将线性组合转换为概率,从而专门用于解决二分类问题。逻辑回归的核心在于学习一个决策边界,而非简单地拟合数据点,这使其成为更强大、更鲁棒的分类工具。

007:线性代数复习

在本节课中,我们将回顾线性代数的核心概念。线性代数是数据科学的数学基础,它提供了处理和分析数据矩阵的强大工具。我们将从矩阵的基本概念开始,探讨其在不同数据科学场景中的应用,并理解一些关键公式背后的直观含义。

矩阵是什么?🤔

上一节我们介绍了线性代数在数据科学中的重要性,本节中我们来看看矩阵的具体定义和常见形式。

矩阵是一个由数字排列成的矩形阵列。在数据科学中,矩阵是表示数据的核心结构。一个 N × M 矩阵可以代表多种事物:

以下是矩阵在数据科学中的几种常见表示形式:

  • 特征矩阵:行代表数据对象(例如,用户、产品),列代表特征(例如,年龄、价格)。公式表示为:数据点 = 矩阵的行
  • 几何点集:用于聚类等任务。每一行是一个点的坐标,每一列是一个维度。
  • 方程组:在求解线性方程组时,矩阵的每一行代表一个方程,每一列代表一个变量的系数。
  • 图/网络:表示具有 N 个顶点的网络。通常使用 N × N 的邻接矩阵,其中元素 M[i][j] 表示从顶点 i 到顶点 j 的边数。
  • 向量:矩阵的任意一行或一列都可以被视为一个向量。

强大的矩阵公式 💪

了解了矩阵的基本形态后,我们来看看线性代数如何通过简洁的公式表达复杂的思想。线性代数的一个优势在于,它能用非常紧凑的矩阵公式来描述具有强大功能的操作。

例如,考虑以下公式:
w = (A^T A)^{-1} A^T b

这个公式实际上是线性回归的解。我们来解读一下:

  • A 是数据矩阵,每一行是一个数据点(样本),每一列是一个特征。
  • b 是目标值向量,对应每个数据点的实际输出。
  • w 是我们要求解的权重向量,它定义了各个特征对预测结果的贡献。

这个公式通过矩阵运算,直接给出了使得预测误差最小的最优权重 w。它浓缩了最小二乘优化的整个过程,展示了矩阵表示法的威力。

代数证明与直觉 🔍

虽然像线性回归解这样的矩阵公式非常强大,但单纯通过代数推导来理解它们有时会缺乏直观性。代数证明是一系列严密的数学陈述,但可能不总是能提供深刻的洞察。

一个经典的例子是“证明 2=1”的伪证:

  1. 假设 a = b
  2. 两边乘以 aa^2 = ab
  3. 两边减去 b^2a^2 - b^2 = ab - b^2
  4. 因式分解:(a - b)(a + b) = b(a - b)
  5. 两边除以 (a - b)a + b = b
  6. 由于 a = b,代入得:b + b = b,即 2b = b
  7. 两边除以 b2 = 1

这个“证明”的每一步在代数形式上似乎都正确,但结论显然是荒谬的。问题出在第5步:因为最初假设了 a = b,所以 (a - b) = 0除以零是一个未定义的操作,导致了错误的结论。

这个例子说明,仅仅遵循代数步骤而不理解其背后的逻辑和限制(例如,除以零的无效性),可能会得到误导性的结果。因此,在数据科学中,我们不仅需要掌握公式,还应努力理解其背后的统计或几何直觉。

总结 📚

本节课中我们一起学习了线性代数在数据科学中的核心角色。我们回顾了矩阵作为数据表示的基本单元,探讨了其在特征矩阵、几何空间、方程组和图论中的多种应用。我们重点分析了一个关键的矩阵公式——线性回归的解,领略了线性代数表达式的简洁与强大。最后,我们通过一个“2=1”的伪证例子,强调了在运用代数工具时保持逻辑严谨和寻求直观理解的重要性。掌握这些基础,将帮助我们更好地理解和构建后续更复杂的数据科学模型与算法。

008:数据可视化原则 📊

在本节课中,我们将学习数据可视化的核心原则。课程开始前,我们先处理一些关于作业和期中考试的行政事务。

课程行政事务

首先,关于期中考试试卷。今天领取试卷遇到了一些问题。之后如果想领取试卷,可以来我的办公室,或者我会尝试在下节课再把试卷带来。

关于作业3,大家有任何问题吗?或者关于课程安排还有其他问题吗?

作业3的截止日期是周二,对吗?等等,我处理一下。作业2的截止日期是周二,对吗?好的,作业3在我脑海中是因为我正在准备它。但你们应该关注的是作业2。

大家作业完成得怎么样了?有多少人已经大致完成了整个作业?我看到有几个人在犹豫。有多少人还没开始?好的,犹豫的人少了一些。这很好。

关于作业3,还有什么问题吗?我很乐意讨论一下。

作业4部分的目的与讨论

首先,我们来思考一下作业第4部分的目的是什么,然后我们可以讨论你们应该做什么。

首先,在现实世界中,有时为了更深入地了解一个问题,你需要整合来自不同来源的数据,这并非不合理。这部分作业就是给你们一个机会去思考这个问题。

现在的问题是,你们能找到哪些有趣的数据集?当然,没有哪个数据集能直接关联到每栋房子的具体ID,除非……我的意思是,也许某处有这样的数据。或许你侵入Zillow的电脑系统,进入他们的后台,就能获得更多数据,但这并不是我鼓励的做法。

但问题是,是否有更多数据可以帮助你预测房价?这确实是这部分作业的核心。

那么,哪些其他数据源可能有助于预测房屋价格呢?大家有什么想法吗?除了在税务记录中查找特定房屋的信息外,还能获得关于房屋的更多信息吗?

有人能给出一些可能的信息思路吗?

一个想法是,如果你想了解特定房屋,可以上Zillow查看。但问题是,对于你们已有的房屋数据,你们无法通过Zillow查找并获得更多信息吗?等等,你们可以吗?所以你是说,你们有足够的信息,比如房屋地址?你们有房屋的经度和纬度,对吗?你们还有ID号。

所以,这里有一个想法,虽然不一定是我想的那个,但如果你们想这么做,我也不反对。一种可能性是,你们有足够的信息去访问Zillow网站,或许能获得更多信息。这是一个可能性。我认为Zillow有足够优秀的数据科学家,最终可能会阻止这种行为,但也许我错了。有人出于好奇试过吗?

假设这是一种途径。我认为这很聪明。但我感觉这不是标准答案。我不认为让所有人都去冲击Zillow网站是正确答案。

那么,在不一定要找到具体细节的情况下,还能获得哪些可能与房屋相关的信息呢?我们来试试这个思路:你们大致知道房屋的位置。关于那个区域,你们可以找到一些信息。

犯罪率无疑是其中之一。犯罪率高的地区,房价是会上涨更多还是下跌更多?你说下跌更多,也许吧。实际上,也可能……我只是临时思考。我知道存在住房短缺,我知道人们迫切需要低价住房。那么,低价住房区域的犯罪率是高还是低?你可能会预期犯罪率更高。也许如果你知道这里犯罪率高,这可能是一个目前房屋价值被低估的地方。因此在市场紧张时,房价可能会上涨。我不保证这会发生。但你们能理解这可能作为一种假设情况发生吗?

无论如何,了解该地区的犯罪率似乎是有帮助的,对吗?了解美国的犯罪率有帮助吗?没有帮助。犯罪率数据的分辨率越精细,可能帮助越大,但你们无法获得精确到每栋房子的无限分辨率数据。

那么,关于房屋的外部数据,还有什么可能有趣的呢?例如,天气。从一个房子到另一个房子,天气可能是一样的。但我对布法罗的了解是……我不知道这里有没有人来自布法罗之类的地方。我的理解是,布法罗有些地方冷得可怕,雪也大得可怕。由于湖泊效应等原因,城镇某些部分比其他部分降雪量要大得多。一个社区的天气差异是否足以改变房价?通常可能不会,但在某些极端情况下,如果是真的,我也不会感到惊讶。

所以,天气可能是一个因素,但我不确定它是最有希望的。犯罪率、学校评级等似乎是可以获取并可能有所帮助的信息。

数据整合方法

那么,如何整合这些数据呢?这是一个有趣的思考练习。在我看来,你们最终需要为每栋房子生成一条记录,对吗?你们可能想添加一个犯罪率列,为每栋房子填入你们估计的犯罪率。你们明白这就是整合的层次吗?这不一定是在犯罪率和房屋之间存在一一对应的键值关系。但情况是,每个经纬度位置都有一个犯罪率。你们可以将其作为每栋房子的一个列。你们明白这如何运作吗?需要一些特定的列来进行匹配,比如经纬度。

那么,如何整合犯罪率数据呢?犯罪率数据包含什么?我怀疑犯罪率数据(虽然我没见过)可能会按社区或区域告诉你犯罪率是多少,对吗?

总结

本节课中,我们一起讨论了作业中关于整合外部数据以辅助房价预测的部分。我们探讨了可能的外部数据源,如犯罪率、学校评级和天气,并思考了如何将这些数据与现有房屋记录进行整合,例如通过地理位置(经纬度)匹配,为每栋房屋添加新的数据列。理解数据整合的目的和方法,是数据科学实践中从多角度分析问题的重要一步。

009:最近邻方法(第一部分)📚

在本节课中,我们将学习最近邻方法,这是一种基础且直观的机器学习技术。课程开始前,我们先处理一些关于作业和课程项目的行政事务。

关于作业3的讨论

首先,关于作业3,有多少同学已经开始着手了?实际上,开始的人数比我预想的要多。对此我感到很满意。关于作业有什么问题吗?

有多少同学已经进行到获取自然语言处理和视觉嵌入向量的步骤了?好的,有不少同学。这些嵌入向量的表现是否符合你们的预期?它们能较好地完成分类任务,并且结果看起来不错吗?还是说结果完全是一团糟?已经完成的同学中,有谁看到结果呈现出聚类现象或其他有意义的模式吗?

目前没有人表示看到的结果是完全混乱的。这有点出乎意料,因为我们之前测试时并未发现这种情况。稍后我会在课堂上做个小测试,看看大家是否真的遇到了问题。除了这个,关于作业还有其他问题吗?没有的话很好,希望大家能尽早开始并理清思路。我们稍后会尝试澄清这个问题。

课程项目安排

接下来,我想谈谈本学期的课程项目。这是本学期结束前必须完成的任务。

我们有一项作业3,大约在一到两周后截止。之后的一周,你们需要提交一份三页的项目提案。你可能会觉得三页纸不算什么,但重要的是要认真思考你的提案内容。我今天会详细讲解。虽然它会评分,并且只有三页(你可能会说ChatGPT就能写),但仔细完成以确保你有一个可行的项目、并提前扫清可能阻碍项目顺利进行的障碍,这至关重要。

这些提案会很快被评分。然后,在课程的最后一天,你们需要提交最终的完整报告,我记得是八页纸。对此有什么问题吗?

项目要求以小组形式完成。我倾向于2到3人的小组,不鼓励单人小组,因为我认为在项目中与他人互动是有益的。我也非常不鼓励4人或以上的小组,因为我认为这些项目的规模是有限的,更大的小组未必有帮助。

我会分析项目得分与小组规模的关系。理论上,三人小组的项目应该比两人小组更好。如果我发现评分存在因小组规模而产生的偏差,我将在最终评分时进行相应的调整。例如,如果所有三人小组的项目得分都远高于两人小组,那么在理想情况下,我们会相应调低三人小组的权重。不过说实话,通常差异不会那么大。对此有什么疑问吗?

项目经验与建议

根据我的经验,我鼓励大家阅读项目手册。我很快会讲到项目主题,但我想先告诉你们一个我常觉得有趣的现象:你们通常会自发组队,然后去看我列出的项目清单。我会告诉你们哪些项目我认为最令人兴奋、最有做出有趣成果的潜力。但根据以往课程的经验,你们往往会一窝蜂地选择那个看似最无聊、最没有发挥空间的项目。我们看看今年是否还会如此。

有些项目更具开放性,有更大的发挥空间,我个人认为这些更有趣。有些则限制得非常严格,似乎很难做出出彩的成果。当然,你可以选择后者,我猜很多人会这么选。但我想提醒的是,当你真正开始做项目时,可能会发现自己并不那么兴奋,最终的成果也可能不尽如人意。对此有什么问题吗?我会根据我的判断给你们一些提示,但我也要说,大多数班级的学生通常不会采纳我的建议。

项目提案的重要性

我给你们这么长时间(以小组形式)写三页提案的原因是,我希望你们在这段时间里能考虑多个项目选项。我希望你们能展示一些初步成果。因为一旦有了初步结果,你们就会对完成项目更有信心。很可能发生的情况是,你选择了一个项目,但在学期结束前一周尝试时,才发现无法获取所需的数据集,导致项目无法进行。我们需要通过提前规划和验证来避免这种情况。

小组与评分规则

我希望各项目的小组人数能大致平衡。如果我看到所有人都涌向同一个项目,我可能会让提案最弱的小组在第二阶段更换项目。这种情况有时会发生,但我并不期望达到完美的平衡。

为了在助教评分时保持匿名性,请确保不要在提交的论文中包含姓名或学号。我们将通过Google Classroom发送一份表格,每个小组都需要填写一份小组注册表,这样我们就能知道哪个项目对应哪些学生了。

有任何问题吗?

我需要提醒你们,在项目结束时,小组成员需要描述如何分配组内贡献。例如,在两人小组中,你们可能同意五五开,或者承认某位成员贡献更大。当我看到你们分配的成绩时,如果存在不一致,我会追查并要求你们达成一致。我们稍后会详细讨论。本学期我计划不采用同伴互评,我认为我们有足够的助教,并且通常大家对同伴互评有抵触情绪,所以将由我和助教们来完成评分。

关于这些规则,还有什么问题吗?

项目清单与负责人

接下来,我想谈谈我列出的一些项目想法。当你查看每个项目条目时,会看到一个“负责人”。负责人是一位助教的名字,你应该首先向他/她咨询与该项目相关的问题。这位负责人很可能(但不一定)是负责给该项目评分的人。对于每个项目,我都会给出建议,说明它适合哪类学生(例如硕士生或博士生)。但这并非硬性规定,如果我说某个项目适合硕士生,但博士生非常想做,也是可以的。

010:统计分布 📊

在本节课中,我们将学习统计学中的核心概念——统计分布。我们将探讨几种常见的概率分布,理解它们为何重要、在何种情况下出现,以及如何应用它们。课程开始前,我们先回顾一下期中考试的相关安排。

期中考试安排 📝

上一节我们介绍了课程进度,本节中我们来看看期中考试的具体细节。

考试将于周四上午9:30进行,时间为常规上课时间。

以下是考试地点安排:

  • 如果你的学号低于116,请前往Fryha 309考场。
  • 如果你的学号是116或以上,请在本教室参加考试。

关于考试内容,最佳复习方式是查看教材后面的作业题。我已发布了一份往期考试样卷,你可以从中了解考试题型。

考试规则如下:

  • 不允许携带书籍。
  • 不允许使用计算器。
  • 不允许携带笔记。
  • 建议携带铅笔和钢笔。

我希望答案能包含定量或至少是定性的推理,并给出清晰的解答。考试内容将涵盖所有讲授过的幻灯片内容,除了特别说明的与作业相关的背景材料(例如NLP部分)。幻灯片和指定阅读材料中的内容均在考试范围内。

最后请注意,考试期间助教将不会回答任何关于试题内容的问题。这是为了确保所有考生获得一致的信息。如果你对某道题目不确定,请在答卷上写下你的假设。

统计学的视角 🔍

在深入探讨具体分布之前,我们先了解一下数据科学中统计学的视角。传统上,数据科学家被定义为比计算机科学家更懂统计,比统计学家更懂计算机科学的人。统计学家研究数据的历史更长,他们通常从一个假设的真实总体出发进行研究。

由于无法研究整个总体,统计学家会进行随机抽样以获得样本。接下来通常有两步:

  1. 描述性统计:计算样本的属性,如可视化、均值、标准差等。
  2. 统计推断:利用样本统计量来推断总体的真实属性。

一个经典的例子是民意调查。调查者通过询问一小部分样本的投票意向,来分析并推断整个选民群体的行为。

为何关注经典概率分布? 🤔

在推断过程中,一个重要的假设是,随机变量的分布往往遵循某些反复出现且具有完善理论的重要分布。了解这些分布、它们的形态、出现的原因及用途至关重要。

你可能会问,在当今生成式AI通过数据自我学习的时代,为什么还要关心这些有封闭形式的经典分布?原因如下:

  • 封闭公式有时很有用:它们为计算和理论分析提供了便利。
  • 存在特定的统计检验:许多假设检验是针对特定分布设计的。
  • 普遍性:这些分布之所以经典,是因为它们在实践中频繁出现。为常见事物命名是理解和交流的基础。

但请注意一个原则:数据呈钟形曲线并不意味着它一定是正态分布;事物在数值较大时变得罕见也不意味着它一定是幂律分布。我们需要根据具体情况判断。

总结 📚

本节课我们一起学习了期中考试的安排、统计学的基本研究范式,以及理解经典概率分布的重要性。我们了解到,统计学家通过样本来描述和推断总体,而一些特定的概率分布在各种现象中反复出现,掌握它们有助于我们更好地理解和分析数据。在接下来的课程中,我们将具体探讨四种重要的概率分布。

011:构建与验证模型 (2024秋季)

在本节课中,我们将学习如何构建和验证机器学习模型。我们将从讨论即将到来的作业开始,该作业旨在让大家亲身体验使用现代预训练模型进行计算机视觉和自然语言处理任务。

作业3概述

上一节我们讨论了模型构建的一般概念,本节中我们来看看本次作业的具体内容。作业3的目标是让大家在不深入底层细节的情况下,应用现有的强大预训练模型来解决实际问题。

以下是作业3的核心任务:

  1. 计算机视觉部分:你将使用一个包含60,000张图像的数据集,这些图像分为10个类别。你的任务是构建一个系统来识别图像所属的类别。
  2. 自然语言处理部分:你将使用一个包含不同类别新闻文章的数据集。你的任务是构建一个系统来对文章进行分类。

这两个部分的核心思路是一致的:利用预训练模型将原始数据(图像或文本)转换为嵌入向量,然后基于这些向量进行分类。

核心概念:嵌入向量

嵌入向量是一个数值向量,它是复杂数据(如图像、文本)经过模型处理后得到的一种紧凑、有意义的表示。你可以把它想象成数据在数学空间中的一个“坐标”。

  • 对于图像,我们可以使用如 ResNet 这样的预训练卷积神经网络。网络的最后一层(或倒数第二层)的输出就是一个代表该图像内容的嵌入向量。
  • 对于文本,我们可以使用如 BERT 或类似的大型语言模型。模型的顶层输出就是一个代表该文本语义的嵌入向量。

一旦我们获得了每个数据点的嵌入向量,后续的分类任务就可以在这个向量空间中进行,变得相对简单。

计算机视觉任务详解

现在,让我们详细拆解计算机视觉部分的具体步骤。

以下是需要完成的步骤列表:

  1. 获取图像嵌入:使用预训练的ResNet模型,为数据集中每一张图像计算其对应的嵌入向量。公式上,这可以表示为:embedding = ResNet(image)
  2. 可视化嵌入:使用t-SNE技术将高维的嵌入向量降维到2D或3D空间并进行可视化。用不同颜色标记不同类别的点,观察同类别的点是否自然地聚集在一起。
  3. 基于质心的分类:为每个类别计算其所有样本嵌入向量的质心(即平均值向量)。对于一个新图像,通过计算其嵌入向量与各个类别质心之间的距离,将其分类到距离最近的类别。这本质上是一种最近质心分类器。
  4. 评估与找出异常值:评估上述质心分类法的准确率。并找出每个类别中距离其质心最远的样本,这些可以被视为该类别的“异常”或“不典型”样本。
  5. 构建传统分类器:使用嵌入向量作为特征,构建一个传统的分类模型,例如逻辑回归或随机森林。评估其性能,并分析哪些样本容易被混淆(例如,通过混淆矩阵)。
  6. 探索降维影响:使用主成分分析等方法,将原始的嵌入向量(例如1000维)降维到更低的维度(如10维或50维)。然后重复步骤3-5,观察并分析降维对分类性能的影响。

自然语言处理任务详解

完成了计算机视觉部分后,自然语言处理部分的流程将与之高度相似。

以下是需要完成的步骤列表:

  1. 获取文本嵌入:使用指定的预训练语言模型,为每篇新闻文章计算其嵌入向量。
  2. 后续分析:重复计算机视觉部分中的步骤2至步骤6。即进行t-SNE可视化、质心分类、构建传统分类器以及探索降维影响。

关键在于,一旦你获得了数据的嵌入表示,无论是图像还是文本,后续的分析流程和代码都可以在很大程度上复用。这体现了嵌入向量作为通用数据表示方式的力量。

总结

本节课中,我们一起学习了如何利用现代预训练模型来简化机器学习任务。我们介绍了嵌入向量的概念,它作为连接原始数据与机器学习算法的桥梁。通过作业3,你将实践如何:

  • 使用 ResNet 获取图像嵌入。
  • 使用预训练语言模型获取文本嵌入。
  • 利用 t-SNE 进行可视化。
  • 实现基于质心的分类
  • 应用逻辑回归等传统模型在嵌入空间进行分类。
  • 探索PCA降维对模型性能的影响。

这个作业的核心思想是:在数据科学中,我们常常不需要从零开始构建复杂模型,而是可以巧妙地利用现有的、强大的工具(预训练模型)来提取高级特征,从而更高效地解决问题。

012:统计显著性检验(续)📊

在本节课中,我们将继续学习统计显著性检验,特别是关于期中考试的答疑、作业安排,并回顾T检验和置换检验的核心概念。


期中考试答疑 📝

上一节我们介绍了统计显著性检验的基本思想。在深入探讨之前,我们先来解答关于期中考试的一些疑问。

以下是关于期中考试成绩的几个常见问题:

  • 关于评分曲线:本次考试采用即时曲线评分。中位数分数是A-和B+的分界线。
  • 关于标准差:我没有直接公布标准差,但你们在K作业中看到的成绩直方图可以用来估算标准差。一个很好的期末考题可能就是根据直方图估算标准差的范围。
  • 关于是否挂科:得分在中位数附近并不意味着挂科。评分是基于曲线相对位置的。


课程与作业安排 📅

解决了期中考试的疑问后,我们来看看接下来的课程和作业安排。

以下是重要的日程调整:

  • 下次课程:下周二(11月22日)因秋假停课一次。
  • 作业三截止日期:为了给大家更多时间,作业三的截止日期已从原定的下周二(11月22日)顺延至下下周二(11月29日)。但这不意味着你们应该在假期才开始做。


作业三常见问题解答 💡

现在,让我们聚焦于当前正在进行的作业三,并解答一些常见问题。

以下是同学们提出的几个关键问题及其解答:

  • 关于寻找额外数据集:作业要求你们寻找一个相关的额外数据集。这可以用于生成有趣的可视化图表,或作为模型特征来预测残差。如果找不到合适的,不强制使用。
  • 关于“合意性分数”为负值合意性分数 可以是负值。关键在于分数要有可解释性,零值最好能代表某种基准(例如,中位数房屋或适合研究生的房屋)。但主要目的是排序,所以绝对值大小并非关键。
  • 关于计算资源限制:如果某些计算(如聚类或成对比较)在你的计算机上运行过慢,请运用你的判断力。例如,为了获得满分而让电脑运行24小时是不明智的。可以尝试对数据进行采样或使用更高效的算法。
  • 关于数据集中包含非住宅房产:数据集中包含一些非住宅房产(如办公楼)。请运用你的判断力决定是否过滤它们。例如,办公楼没有“卧室”这个属性,这可能会影响你的模型。


回顾统计显著性检验 🔬

处理完所有事务性问题后,我们回到课程核心内容。本节课我们将总结并深化对统计显著性检验的理解。

我们主要讨论了两种显著性检验方法:

  1. T检验:用于比较两个正态分布样本的均值是否存在显著差异。其核心是计算 t统计量
    t = (样本均值差) / (标准误)
    然后根据t分布来判断该差异是否由偶然因素导致。

  1. 置换检验:一种非参数检验方法,不依赖于总体分布的具体形式。其基本思想是:如果两个样本没有差异,那么将它们的数据混合后随机重新分配,计算出的统计量(如均值差)与原统计量同样极端或更极端的概率就是p值。


总结 ✨

本节课我们一起学习了以下内容:

  • 解答了关于期中考试评分和标准的疑问。
  • 明确了秋假停课及作业三截止日期延后的安排。
  • 详细讨论了作业三中关于数据集、合意性分数、计算资源和数据筛选的常见问题。
  • 回顾了统计显著性检验的两种主要方法:T检验置换检验,理解了它们各自的适用场景和基本原理。

理解这些检验方法有助于我们在数据分析中做出更可靠、更科学的推断。

013:统计显著性(2024秋季)

在本节课中,我们将回顾期中考试的整体情况,并讲解部分考题的解题思路。我们将重点关注如何理解考试成绩分布、处理考试中的异常情况,以及分析几个典型的概率与统计问题。


考试情况概述 📊

上一节我们介绍了课程背景,本节中我们来看看期中考试的整体情况。

考试成绩分布大致在30分到90分之间。平均分和中位数约为60至62分。最高分为91分。这表明在此次考试中取得好成绩是可能的。

如果你的分数是62分,即处于中位数水平,这大致对应于A-到B+的等级。因此,不必过分担忧分数本身。

以下是关于成绩分布的要点:

  • 平均分和中位数约为60-62分。
  • 最高分为91分。
  • 分数为62分大致对应A-到B+的等级。

关于考试,助教报告有5名学生的行为存在可疑之处,例如在版本1的试卷上出现了版本2的答案。考试设计有两个版本,外观相似。

如果你对考试中的行为有所顾虑,建议通过邮件与我沟通。关于此事的最终处理决定将在期末考试后做出。在期末考试中,请务必保持诚信。


试题讲解与回顾 📝

现在,让我们快速回顾几道考题。如果你对答案有疑问,现在是讨论的好时机。

问题一:均值与标准差比较

第一道题旨在考察对数据分布的基本直觉。题目给出了四组数据点,要求判断哪组数据的均值更高、标准差更大。

精确计算均值和标准差可能比较困难,但通过观察数据点的分布是否均匀,可以大致判断标准差的大小。分布越分散,标准差通常越大。

问题二:随机折断木棍的期望长度 🎲

这是一个概率问题。假设有一根长度为1的木棍,在其上随机选择一个点(均匀分布)将其折断。我们关心的是较短那一段的长度。

设折断点为 X,且 X 服从 [0, 1] 上的均匀分布。那么较短一段的长度 L 为:
L = min(X, 1-X)

其概率密度函数(PDF)在 [0, 0.5] 区间内是均匀的。累积分布函数(CDF)是一条从0到0.5的斜线。

因此,较短一段长度的期望值 E[L]0.25。一些同学错误地使用了正态分布进行分析,但在此问题中并不适用。

问题三:时间序列数据缺失值处理 ⏳

这是一个开放性的数据分析问题。给定一个温度时间序列数据集,其中1%的值随机缺失。

对于随机散落的单个缺失值,最佳估算方法通常是利用其时间上的自相关性。例如,可以用缺失日前后两天的温度平均值来估算,这比使用所有年份同日的平均温度更合理,因为天气具有连续性。

对于连续缺失一整月数据的情况,由于缺乏前后时间点的信息,此时参考其他年份同月份的温度数据(如取中位数或平均值)可能是最可行的估算方法。

问题四:最大值的累积分布函数

问题要求推导从同一分布中抽取的两个独立随机变量的最大值的累积分布函数(CDF)。

设原始随机变量为 X,其CDF为 F(x)。定义 Y = max(X1, X2),其中 X1X2 独立同分布。

事件 {Y ≤ y}(即最大值小于等于 y)等价于事件 {X1 ≤ y 且 X2 ≤ y}。由于 X1X2 独立,因此:
P(Y ≤ y) = P(X1 ≤ y) * P(X2 ≤ y) = [F(y)]^2

所以,最大值 Y 的CDF是原始CDF的平方:F_Y(y) = [F(y)]^2

举例说明:考虑一个均匀的六面骰子,其原始CDF F(x) 是阶梯上升的。那么,投掷两个骰子后,得到的点数最大值 ≤ 3 的概率,就等于一个骰子点数 ≤ 3 的概率的平方,即 (3/6)^2 = 1/4


总结

本节课中我们一起学习了期中考试的总体情况,包括分数分布的意义和对考试纪律的提醒。随后,我们详细讲解并分析了四道考题,涵盖了数据分布比较、概率期望值计算、时间序列数据插补策略以及统计量(最大值)的分布函数推导等核心概念。理解这些基础问题有助于巩固数据科学所需的概率统计知识。

014:期中复习(2024秋季)📊

在本节课中,我们将回顾期中考试前的一些关键概念,并讨论一份即将截止的作业。我们将重点关注数据处理、相关性分析以及可视化技巧,这些是数据科学实践中的核心技能。

作业提交与问题讨论 💻

首先,我们讨论今天截止的作业。我建议不要等到最后一刻才提交,因为可能会遇到各种技术问题。如果遇到问题,可以通过 Piazza 论坛寻求帮助。

以下是关于作业的一些常见问题与解答:

  • 关于问题二中选择公司数量 N 的原因:主要原因是考虑到部分同学可能使用性能较旧的计算机。选择较小的 N 可以避免在计算大规模矩阵(例如 500x500 的相关性矩阵)时遇到性能瓶颈。不过,根据反馈,使用现代计算机计算 500 只股票间的相关系数仅需几秒钟。
  • 关于可视化大规模矩阵:直接显示 500x500 的数值矩阵难以阅读。更有效的方法是使用颜色映射来呈现数据。通过颜色深浅,可以直观地识别出数据中的模式和结构。
  • 关于增强可视化效果:除了使用颜色,对矩阵的列(或行)进行重新排序也能揭示更多信息。例如,可以按照公司所属行业、市值大小或通过聚类算法得到的相似性来排序,这样相关性高的公司会聚集在一起,在图中形成明显的色块。

数据洞察与领域知识 🔍

上一节我们讨论了技术层面的处理,本节中我们来看看如何结合领域知识获得更深层的洞察。

在分析股票数据时,结合金融领域的背景知识非常重要。例如,如果发现所有银行股的表现高度相关,这可能是合理的,因为它们可能共同受到利率变化或金融危机等宏观因素的影响。

在回归分析中,深入思考数据的本质和所属领域总能带来回报。理解业务背景有助于提出更合理的假设,并解释模型的结果。

核心概念总结 📝

本节课中我们一起学习了以下关键点:

  1. 提前提交作业:为避免意外,应提前提交作业并善用课程论坛解决问题。
  2. 处理大规模数据:计算大规模相关性矩阵时需考虑计算资源,但现代计算机通常能快速处理。
  3. 有效的数据可视化:对于高维数据,使用颜色映射和智能排序(如聚类排序)比直接显示数字矩阵更能有效揭示数据中的结构和模式。
  4. 结合领域知识:数据分析不应脱离实际背景。结合领域知识(如金融市场规律)可以帮助理解数据模式、构建更合理的模型,并对结果做出有意义的解释。

记住,在数据科学中,探索性数据分析批判性思维与掌握算法和工具同等重要。

015:分数与排名(2024秋季)

在本节课中,我们将探讨数据科学中的一个重要环节:如何评估模型性能,并讨论特征工程中的关键概念,特别是特征变换的重要性。我们将通过一个具体的作业问题来展开讨论。

作业进度与问题讨论

首先,我们来了解一下大家完成作业的进度。有多少同学已经完成了作业的初步审阅?

我看到一些同学热情地挥手,还有一些同学在犹豫,这很好。那么,有多少同学还没有完成呢?

我看到后排的同学似乎更热情一些,不过没关系。关于作业,大家有什么问题吗?

好的。

关于问题8:你是否希望我们将问题8像问题7那样,也拆分为第一部分和第二部分?

这似乎没有坏处。不过,有人完成了问题7的第一部分吗?

那些可能做得很好或很差的同学。

看起来情况不太理想。有其他人说做得好或不好吗?不好。那么在这种情况下,也许你可以两部分都做,或者思考一下为什么做得不好。

有人在Piazza上做得很好,我记得。大家看到那个帖子了吗,还是只有我看到了?

我认为那位同学将目标变量用作了一个特征。这很可能就是他们做得好的原因。

关于问题1:你说第一部分和第二部分都做得不好。

第二部分稍微好一点,这让我有点惊讶,因为第二部分是根据年份进行预测。

关于这一点,有什么评论、想法或思考吗?

有人查看过特征并试图找出为什么第一部分也做得不好的原因吗?

好的。只有一个特征计算每股收益,那是什么?

是“预估流通股数”,好的。

让我们思考一下这些变量的含义。我希望大家思考一下:首先,“预估流通股数”是什么,它衡量的是什么?

我假设这是衡量股票数量的指标。大家都同意吗?

好的。

其他特征与什么有关?在那个回归问题中,你使用的其他特征是什么?

净收入。净收入是以什么单位衡量的?美元。其他东西是以什么单位衡量的?

好的。有其他人看过任何特征名称吗?你用于回归问题的特征是以什么单位衡量的?

资本公积。那是以什么单位衡量的?是以英寸还是什么单位?

每股价格。每股价格的结果。

它的单位是什么?所有东西都是美元,对吗?

所以,如果我理解正确的话——我不知道你们做得对不对——你们有一堆特征试图预测每股收益。

好的,它们都是美元,而其中一个特征是股票数量,对吗?

唯一有用的那个是股票数量。

营收年份和收入之类的。

好的。其他人在这方面有什么其他经验吗?

你说那里有一些比率。好的,那里有一些比率起了作用。那些不是以美元衡量的,对吗?其他人还有什么经验吗?

好的。尽管如此,我实际上没有做过任何这些,但当我听到这个时,我在想。

有没有什么方法……你试图预测的是每股收益,对吗?

现在,如果这家公司在之前进行了股票分割,每股收益会发生什么变化?

假设进行了一次一拆二的股票分割。每股收益会发生什么变化?会减少多少?那么,这能在你的模型中体现出来吗?不能。

你们能想到任何方法,也许可以将这些美元数字转换成可能更好地预测每股收益的特征吗?

有什么想法吗?

如果你有这些收益数字,会发生什么?如果这些收益数字除以股票数量,是否会更有价值?

好的。这在我看来是……我什么都没做。我怎么知道呢?

但我知道,当你这样做时,你开始用与目标变量具有可比性的特征来构建模型。大家都能明白这一点吗?有人能看出为什么线性回归无法捕捉到这一点吗?

有人能给我一个想法,为什么线性回归无法捕捉到“除以股票数量可能有用”这个事实吗?

因为它是线性的。像“一个变量除以另一个变量”这样的变换,并不是直接从那些特征中产生的。

关于这一点有什么问题吗?大家可能看到这个想法了吗?

还是我说得太隐晦了?大家明白我在说什么吗?有人不明白我在说什么吗?

有几个人在犹豫,好的。再次强调,你有一些变量试图预测一个比率,即每股收益。

你有一些特征是收益,基本上是美元计价的收益。

你还有一些股票数量的特征,好的。

一种可能性是改变……看看如果你将美元计价的收益转换为每股收益会发生什么,这可能是一件有趣的事。

另一种实现同样效果的方法,也许更容易。我们想要认识到,你有未经处理的美元数据和股票数据,有没有办法改变……也许我们可以改变特征?

还有什么其他可以改变的吗?归一化是什么意思,你归一化什么?

所以Z分数可能是一种方法。但你在按股票数量归一化之前,考虑过Z分数吗?

只是归一化可能……我们今天会更多地讨论Z分数,但Z分数仍然会转换变量。

所以它们会在量级和范围上具有可比性,这就是Z分数的作用。

它们不会做非线性变换。从英尺到米的转换是线性变换,我乘以一个常数,对吗?

如果我乘以一个常数并减去平均值,这仍然是一个线性变换。

有时,变量可能需要非线性变换,对吗?

我认为这里发生的情况是,你的变量和目标之间可能存在明显的不兼容性。

因此,如果你试图预测每股收益,一个建议可能是处理变量,使它们变成“每股”的形式,对吗?

总结

本节课中,我们一起探讨了在数据科学项目中评估模型性能时可能遇到的问题。我们通过一个具体的作业案例,分析了特征与目标变量之间单位不匹配的问题,并讨论了特征工程的重要性,特别是线性与非线性变换的区别。我们了解到,当预测目标是一个比率(如每股收益)时,将原始特征(如总收益)转换为可比的形式(如每股收益)可能显著提升模型性能。这提醒我们,在构建模型前,深入理解数据含义并进行适当的预处理至关重要。

016:数据清洗

在本节课中,我们将要学习数据清洗的相关知识。数据清洗是数据科学流程中至关重要的一步,它确保我们分析的数据是准确、完整和可靠的。我们将探讨数据中可能存在的各种偏差,并理解它们如何影响我们的分析结果。

上一节我们介绍了数据收集,本节中我们来看看数据收集过程中可能引入的偏差。

数据偏差的类型

数据偏差是指数据不完整、不准确或缺失,从而无法完全代表总体的情况。了解偏差的类型有助于我们识别和纠正数据中的问题。

以下是几种常见的数据偏差类型:

  • 确认偏差:倾向于接受符合自己已有信念的信息,而拒绝与之相悖的信息。例如,当你编写的程序第一次通过测试时,你可能会立即认为它是完全正确的,而不再深入检查。
  • 幸存者偏差:只关注“幸存”下来的成功案例,而忽略了那些失败或中途消失的案例。这会导致对成功概率或整体情况的错误认知。
  • 选择偏差:由于数据收集方法(如抽样方式)导致样本不能代表总体。例如,标准普尔500指数只包含500家大型上市公司,这本身就忽略了许多中小型公司。

案例分析:标准普尔500数据集

让我们通过课程作业中使用的标准普尔500数据集来具体理解幸存者偏差。

这个数据集收集了2016年时标准普尔500指数成分股公司过去五年的数据。这意味着,数据集只包含了那些在2016年仍然“存活”在指数中的公司。

  • 在数据收集期间,有24家公司被添加到了指数中。
  • 然而,没有一家公司从数据集中消失

这是为什么呢?因为数据收集者是在2016年回溯历史数据。那些在2016年之前就已经被移出标准普尔500指数的公司,根本不会被纳入这个数据集中。因此,我们只看到了“幸存者”的故事,而错过了那些失败或退市的公司。这就是一个典型的幸存者偏差案例。

邓宁-克鲁格效应

邓宁-克鲁格效应是一种认知偏差,指能力不足的人会高估自己的技能水平,而能力高的人则会低估自己的相对能力。在数据科学中,这提醒我们要保持谦逊,持续验证自己的假设和结论。

本节课中我们一起学习了数据清洗的重要性,并重点探讨了数据偏差。我们了解了确认偏差、幸存者偏差和选择偏差等概念,并通过标准普尔500数据集的实例分析了幸存者偏差如何在实际数据中体现。认识到数据中可能存在的偏差,是进行可靠数据分析的第一步。

017:数据集的构建 🧩

在本节课中,我们将要学习数据科学中一个至关重要的环节:数据集的构建与整理。我们将从理解数据的重要性开始,逐步深入到数据整理的具体概念、常用工具以及核心步骤。


数据的重要性与数据整理

没有数据,就没有数据科学。数据是任何分析项目的基石。在开始建模之前,我们首先需要获取并准备好数据。这个过程通常被称为数据整理或数据清洗。

上一节我们介绍了数据的重要性,本节中我们来看看什么是数据整理。

数据整理是指获取数据并为其分析做准备的过程。我们很少能直接获得完全干净、可直接使用的数据。通常,数据会包含缺失值、异常值、噪音或不一致的格式,这些都需要在分析前进行处理。

数据科学家将大部分时间(约50%到80%)都花在数据的清洗和格式化上。这凸显了数据整理步骤在数据科学项目流程中的核心地位。


数据科学中的编程语言 🐍

在开始具体的数据整理工作之前,我们需要选择合适的工具。对于数据科学家而言,编程语言是必不可少的工具。

以下是数据科学领域最常用的一些编程语言:

  • Python:目前数据科学领域的首选语言。它语法简洁、学习曲线平缓,并且拥有极其丰富和强大的库生态系统。
  • R:在统计学家和学术界中非常流行,特别擅长统计分析和可视化。
  • SQL:用于管理和查询关系型数据库的标准语言,是获取数据的关键技能。
  • Julia:一种较新的高性能语言,特别适合科学计算和数值分析。
  • Scala:常与Apache Spark等大数据处理框架结合使用。
  • Java:在企业级应用和大规模系统中广泛使用。
  • SAS:在商业智能和传统统计分析领域有深厚基础。
  • MATLAB:在工程和数学建模领域应用广泛。

Python之所以成为主流,主要归功于其易用性、庞大的社区支持以及专门为数据科学设计的库,例如用于数据操作的pandas、用于数值计算的NumPy、用于机器学习的scikit-learn和用于可视化的Matplotlib


数据整理的核心步骤

了解了工具之后,我们现在可以深入探讨数据整理的具体步骤。这个过程通常涉及多个阶段,以确保数据的质量和可用性。

以下是数据整理过程中常见的核心任务:

  1. 数据获取:从各种来源(如数据库、API、文件、网络爬虫)收集原始数据。
  2. 数据清洗:处理数据中的问题,例如:
    • 处理缺失值(如填充或删除)。
    • 纠正错误或异常值。
    • 统一格式(如日期、字符串)。
  3. 数据转换:将数据转换为更适合分析的格式,例如:
    • 数据规范化或标准化。
    • 创建新的衍生特征(特征工程)。
    • 将数据从宽格式转换为长格式,或反之。
  4. 数据集成:将来自多个来源的数据合并成一个一致的数据集。
  5. 数据验证:检查整理后的数据是否符合预期,确保没有引入新的错误。

总结

本节课中我们一起学习了数据科学项目的基础——数据集的构建。我们首先明确了数据是数据科学的根本,并引入了“数据整理”这一核心概念,即花费大量时间对数据进行清洗和格式化以使其可用于分析。接着,我们探讨了数据科学领域的常用编程语言,特别是Python因其强大的库生态系统而占据主导地位。最后,我们梳理了数据整理的关键步骤,包括获取、清洗、转换、集成和验证。掌握这些内容是进行任何有效数据分析的前提。

018:作业前瞻与相关性深入

在本节课中,我们将深入探讨相关性分析,并提前了解作业中涉及的线性回归概念。我们将从回顾相关性的定义开始,讨论其与因果关系的区别,并通过实例理解相关性的多种可能性。最后,我们会简要介绍线性回归,为完成作业做好准备。

回顾相关性定义

上一节我们介绍了各种相关性统计量。当在两个变量之间发现相关性时,意味着它们之间存在某种统计上显著的关系。

相关性系数 r 的计算公式通常为皮尔逊相关系数:
r = Σ[(xi - x̄)(yi - ȳ)] / √[Σ(xi - x̄)² Σ(yi - ȳ)²]

相关性不等于因果关系

然而,著名的原则是:相关性并不意味着因果关系

一个明显的原因是相关性是对称的。变量A与B的相关性,等同于变量B与A的相关性。因此,它不能同时表示A导致B且B导致A。但人们常常在看到高相关性时,急于断定一方导致了另一方。

人们经常错误判断因果关系的方向。例如,观察城市中各辖区的犯罪率与警力数量。你可能会发现,犯罪率高的地方警力也更多。

那么,是警察导致了犯罪,还是犯罪导致了需要更多警察?很可能,犯罪是导致部署更多警察的原因。但这仍然是一个需要验证的假设。

社会科学家非常关注因果关系,并擅长论证。他们会指出多种可能性:可能是警察导致了犯罪,可能是犯罪导致了警察,或者两者可能相互独立。确定是否存在真正的因果关系,与仅仅观察统计相关性是不同的。相关性是一种统计观察,而因果关系是关于世界如何运作的一种主张。

相关性的多种可能性

那么,当两个变量之间存在相关性时,有哪些可能性?

以下是几种主要情况:

  • A导致B:变量A是变量B变化的原因。
  • B导致A:变量B是变量A变化的原因。
  • C导致A和B:存在第三个变量C,同时导致了A和B的变化。例如,冰淇淋销量与晒伤率呈正相关。是冰淇淋导致晒伤,还是晒伤导致人们购买冰淇淋?更可能的情况是,阳光(变量C)同时导致了冰淇淋销量增加和晒伤率上升。
  • 虚假相关:相关性纯属巧合,没有实际的因果联系。一个著名的例子是,有人发现孟加拉国的黄油产量与美国股市涨跌高度相关。是黄油产量导致股市波动吗?这很可能只是一个虚假相关。请记住,统计显著性(例如p<0.05)意味着有5%的可能性这种相关性是偶然出现的。当你用足够多的时间序列数据进行测试时,总有一个会表现得“最好”。一旦这个“规律”被发现,它通常就会失效,因为它从未真正存在过。

因此,避免过度解读相关性非常重要。优秀的社会科学家不会轻易地从相关性推断出因果关系。

实例分析:纬度与皮肤癌

这是一个关于防晒霜的图表,它展示了皮肤癌死亡人数与纬度的关系。图中每个点代表美国的一个州。

我们预期会看到什么?我们预期离赤道更近的州(纬度更低),因为接受更多日照,皮肤癌死亡率会更高。图表显示的趋势大致符合这个预期。

线性回归简介

接下来,我们将简要介绍线性回归,这是作业中会用到的一个重要概念。

线性回归旨在找到一条最佳拟合直线,来描述一个自变量(X)与一个因变量(Y)之间的关系。其基本模型公式为:
Y = β₀ + β₁X + ε
其中:

  • Y 是因变量。
  • X 是自变量。
  • β₀ 是截距。
  • β₁ 是斜率,表示X变化一个单位时Y的平均变化量。
  • ε 是误差项。

在后续课程中,我们会更深入地讲解线性回归。本节的目的只是确保大家对作业中涉及的基本概念有所了解。


本节课中,我们一起学习了相关性与因果关系的核心区别,探讨了相关性的多种可能解释(包括直接因果、共同原因和虚假相关),并通过实例加深了理解。最后,我们简要介绍了线性回归的基本模型,为完成课程作业打下了基础。记住,在数据科学中,谨慎解读统计结果至关重要。

019:相关性分析 📊

在本节课中,我们将要学习相关性分析的核心概念,并探讨其在数据分析中的应用。课程将从解答作业中的实际问题开始,逐步引入相关性分析的理论与方法。

作业问题解答与数据清洗讨论

现在时间是9点30分,我们开始上课。首先,是否有关于作业的任何问题?

一位同学提出了关于数据处理的问题。在分析S&P 500公司数据时,遇到了两个公司的数据格式与其他公司不一致的情况。具体来说,大多数公司的数据只包含日期,但这两个公司的数据列中包含了日期和时间戳。

以下是该同学遇到的核心问题:

  • 数据集中大多数公司的“日期”列格式为纯日期。
  • 但有两个公司(例如WFTV)的“日期”列包含了日期和时间信息。
  • 当尝试使用日期过滤器处理数据时,这两个公司由于格式不一致而无法被正确筛选。
  • 尝试使用 pd.to_datetime 函数进行转换时,时间部分被自动保留,导致与其他数据不匹配。

针对这个问题,我们需要考虑如何处理这种数据不一致的情况。S&P 500指数包含大约500家公司,其中有些是知名公司,有些则可能不为人知。在作业中要求对公司进行排序,目的是让大家关注那些规模较大或自己感兴趣的公司,这样分析起来会更有意义,而不是面对一堆陌生的、看起来像随机数字的股票代码。

现在回到数据格式问题。数据集的构建者可能在某些公司的数据抓取过程中,意外地留下了时间戳,而其他公司则没有。这引出了一个典型的数据清洗问题。

面对这种情况,我们有几个选择:

  1. 直接删除这两个公司:这是最简单快速的方法,特别是当时间戳不包含关键信息时。
  2. 进行数据清洗:例如,删除时间戳部分,只保留日期,使数据格式统一。
  3. 强制转换为日期时间对象:使用Pandas的功能,尝试将整个列统一为日期时间格式,并忽略时间部分。

如何选择取决于对数据本身的理解。需要判断这个时间戳是否包含重要信息。如果它只是一个数据收集过程中产生的无关紧要的“ artifact”(人工痕迹),那么删除它是合理的。但如果这个时间戳有特殊含义(尽管在这个股票价格数据的上下文中可能性不大),就需要慎重处理。

这实际上是一个需要根据具体情境做出的判断。本课程希望作业具有一定的开放性,并鼓励大家在学期中逐步培养这种数据判断力。这里也引出了一个重要的数据分析原则:KISS原则(Keep It Simple, Stupid)

当你在进行分析时,尤其是当你的Python或数据探索技能还比较有限时,一个有效的方法是先快速完成一遍初步分析。例如,对于上述问题,最简单的做法可能就是先剔除那两个格式不一致的公司,继续完成其他部分的分析。之后如果有时间,再回头研究如何修复或纳入这两个公司的数据。建立一个初步的流水线,比纠结于一开始就完美处理所有细节要高效得多。

另一个关于作业的问题是“价格”和“调整后价格”数据集的区别。这涉及到股票市场中的一个概念:拆股

当一家公司的每股股价变得过高时,为了吸引更多投资者并让股价看起来更“合理”,公司可能会进行拆股。例如,将原来的1股拆分为2股、3股或更多新股。股东持有的总价值不变,就像用一张10美元钞票兑换十张1美元钞票一样,你的财富并没有增加。

因此:

  • 价格数据集记录的是历史实际交易价格。
  • 调整后价格数据集则对拆股、分红等公司行为进行了调整,使得价格历史序列具有连续可比性,更能反映真实的投资回报变化。

在分析股票长期走势时,使用调整后价格通常更为合适。

相关性分析核心概念

上一节我们讨论了数据清洗中的实际问题,本节中我们来看看数据分析中的一个核心工具:相关性分析。相关性用于衡量两个变量之间线性关系的强度和方向。

皮尔逊相关系数

最常用的相关性度量是皮尔逊相关系数。它衡量的是两个变量之间的线性相关程度。

其公式定义为:
r = Σ[(xi - x̄)(yi - ȳ)] / √[Σ(xi - x̄)² Σ(yi - ȳ)²]

其中:

  • xiyi 是数据点的值。
  • ȳ 分别是变量x和y的均值。
  • Σ 表示求和。

相关系数 r 的取值范围在 -1 到 1 之间:

  • r = 1:表示完全正相关,数据点呈一条斜向上的直线。
  • r = -1:表示完全负相关,数据点呈一条斜向下的直线。
  • r = 0:表示没有线性相关性。
  • 0 < |r| < 1:表示不同程度的线性相关,绝对值越接近1,相关性越强。

计算相关性

在实际操作中,我们通常使用Python的Pandas或NumPy库来计算相关性。

例如,计算两个数据序列 s1s2 的相关性:

import pandas as pd
# 假设 df 是一个DataFrame,包含 ‘stock_A’ 和 ‘stock_B’ 两列价格数据
correlation = df[‘stock_A’].corr(df[‘stock_B’])
print(f”股票A与股票B的相关系数为:{correlation:.4f}”)

相关性与因果关系

这是一个至关重要的概念:相关性不等于因果关系

两个变量之间存在相关关系,仅意味着它们以一种可预测的方式共同变化。但这并不能证明是其中一个变量的变化导致了另一个变量的变化。可能存在:

  1. 偶然性:相关性可能是巧合。
  2. 混淆变量:可能存在第三个变量同时影响这两个变量,造成了它们相关的假象。
  3. 反向因果关系:因果方向可能与假设相反。

在解释相关性结果时,必须非常谨慎,避免做出因果推断。

在金融数据中的应用示例

了解了相关性的基本概念后,让我们将其应用到具体的金融数据分析场景中。

在S&P 500股票数据分析的作业中,你可以计算不同公司股票收益率之间的相关性。以下是你可以进行的分析步骤:

  1. 计算收益率:首先,通常需要从价格数据计算每日或每周的收益率(百分比变化)。
    # 计算每日收益率
    returns = df.pct_change()
    
  2. 计算相关性矩阵:使用Pandas可以方便地计算所有股票收益率两两之间的相关系数,形成一个相关性矩阵。
    correlation_matrix = returns.corr()
    
  3. 分析与可视化
    • 找出与某支特定股票(如苹果AAPL)最相关和最不相关的股票。
    • 使用热力图来可视化整个相关性矩阵,观察哪些行业或公司的股票走势较为同步。
    import seaborn as sns
    import matplotlib.pyplot as plt
    plt.figure(figsize=(12, 10))
    sns.heatmap(correlation_matrix, annot=False, cmap=‘coolwarm’, center=0)
    plt.title(‘S&P 500股票收益率相关性热力图’)
    plt.show()
    
  4. 解释结果:高正相关的股票可能属于同一行业,受相同的宏观经济因素影响。高负相关则可能很少见,但可能存在于某些特定的对冲资产之间。

通过这样的分析,你可以开始理解市场中不同资产是如何联动或分化的,这是构建投资组合、管理风险的基础。

总结

本节课中我们一起学习了数据分析中至关重要的相关性分析。

我们首先从实际的作业问题出发,探讨了数据清洗中遇到格式不一致时的处理思路,强调了KISS原则在初步分析中的重要性。接着,我们深入介绍了皮尔逊相关系数的核心概念、计算公式及其取值范围,并明确了相关性不等于因果关系这一关键原则。最后,我们探讨了如何将这些理论应用于金融数据分析,例如计算S&P 500股票间的相关性并加以可视化解读。

掌握相关性分析,能够帮助你量化变量间的关系,为更复杂的数据建模和决策提供基础。在接下来的课程中,我们将继续深入更多数据分析方法。

020:数学预备知识

在本节课中,我们将要学习概率论中的两个核心概念:条件概率与贝叶斯定理,以及随机变量及其分布。这些是理解数据科学中不确定性建模和推断的基础。

条件概率

上一节我们介绍了概率的基本概念,本节中我们来看看条件概率。条件概率描述了在已知某个事件(B)发生的情况下,另一个事件(A)发生的概率。

条件概率的公式定义如下:

P(A|B) = P(A ∩ B) / P(B)

这个公式的含义是:事件A在事件B发生的条件下的概率,等于事件A和事件B同时发生的概率,除以事件B发生的概率。

以下是关于条件概率的两个关键点:

  • 独立性:当事件A和事件B相互独立时,条件概率 P(A|B) 就等于 P(A)。因为如果A和B独立,则 P(A ∩ B) = P(A) * P(B),代入公式后 P(B) 会被约去。
  • 非独立性:条件概率在事件不独立时才更有意义,它量化了一个事件的发生如何影响另一个事件发生的可能性。

贝叶斯定理

理解了条件概率后,我们来看一个极其重要的定理——贝叶斯定理。它提供了一种“逆转”条件概率的方法。

贝叶斯定理的公式如下:

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

这个定理的有趣之处在于,它将我们可能难以直接计算的 P(A|B),与可能更容易获得的 P(B|A)P(A)P(B) 联系了起来。这在基于新证据(B)更新我们对某个假设(A)的信念时非常有用。

贝叶斯定理的证明非常简单,它源于条件概率的定义和概率的对称性。

  1. 根据定义,P(A|B) = P(A ∩ B) / P(B)
  2. 同样,P(B|A) = P(A ∩ B) / P(A)
  3. 由第二个等式可得 P(A ∩ B) = P(B|A) * P(A)
  4. 将第三步的结果代入第一个等式,即得到贝叶斯定理:P(A|B) = [P(B|A) * P(A)] / P(B)

随机变量与分布

现在,让我们从具体事件的概率转向更一般的概念——随机变量。随机变量是将随机实验的结果映射为数值的函数。例如,一次考试的成绩、掷两颗骰子的点数之和,都可以看作是随机变量。

描述随机变量最常见的方式是使用概率分布。主要有两种表示方法:

  • 概率密度函数/概率质量函数:对于连续型随机变量,我们使用概率密度函数;对于离散型随机变量,我们使用概率质量函数。它们描述了随机变量取某个特定值的(相对)可能性。在图表上,通常横轴(x轴)代表可能的数值,纵轴(y轴)代表概率密度或概率。
  • 累积分布函数:累积分布函数描述的是随机变量取值小于或等于某个特定数值的概率。它是概率密度函数从负无穷到当前点的积分(或求和)。例如,在身高分布中,累积分布函数在180厘米处的值为0.8,意味着有80%的人身高低于180厘米。

本节课中我们一起学习了条件概率的定义及其在独立与非独立事件下的意义,掌握了能够逆转条件关系的强大工具——贝叶斯定理及其证明,并了解了随机变量的概念以及描述它的两种主要方式:概率密度函数和累积分布函数。这些数学工具是后续进行统计推断和机器学习建模的基石。

021:数据科学导论 (2024秋季) 🎯

在本节课中,我们将学习课程的基本运行规则,并探讨数据科学的初步定义与范畴。


我是史蒂夫·斯基尼纳,这门课程的授课教师。很抱歉我错过了第一周的课程。我希望萨巴和我的学生们把课堂事务处理得很好。

在进一步深入之前,关于课程管理有任何问题吗?例如课程将如何运行,或类似的事情?我已经在课程大纲中说明了规则。如果有人还没领取大纲,我这里还有副本。有任何问题吗?

首先,请马汉下来一下。我们现在又有了助教。萨巴是我们得到的第一位助教。这学期我们现在有四名助教。这是马汉。请大家给马汉一些掌声。

不。当涉及到成绩复议时,你们被允许“欺负”他吗?答案是不。他将认真批改你们的作业。他会尽一切努力做到正确。如果他弄错了,我们耸耸肩,然后继续前进。清楚了吗?好的,公平合理。现在,去做你的其他事情吧,包括帮助准备从下周开始的测验。

从今天开始,我们将为测验做准备。所以,每节课都会有一个测验。测验将于周三的某个时间开始,并在今天下课前截止。更准确地说,是在下一节课开始之前。所以,如果你来上课时还没做测验,那么测验就结束了。清楚了吗?

如果你错过了一次测验,你会抱怨吗?你不会抱怨。测验必须在课程开始前完成。有问题吗?是的。

理想情况下,测验将基于上一讲的内容。测验在总成绩中占很小一部分。如果你在测验中表现很好,这意味着你一直在关注课堂内容。测验的设计初衷并不是巨大的智力挑战,而是为了让大家在整个学期中保持对教学内容的关注,而不是等到期中考试时才想起来问“这学期我们学了什么?”。我想这就是目标。

有任何问题吗?当然,如果你想问的话,是的,请说。

测验将主要基于上一节课的内容。实际上,通常就是上一节课。这次我希望其中会有一两个问题来自更早的内容,但我们会看看情况。再次强调,测验只是为了让你保持警觉,并非巨大的智力挑战。好的,关于这个有任何问题吗?好的。

关于测验,有一个我认为正在发生的变化。我想让马汉告诉我,如果我说的是真的。我们可能正在将测验转移到Brightspace平台。这是真的吗?好的。我之前对Google Classroom做了很多说明。我仍然很可能要求你们通过Google Classroom提交项目和作业。助教们已经说服我,他们可以在Brightspace上处理测验。所以你们需要注意。

今天的测验什么时候可用?我是说明天。它将在明天……我们不知道。那么你怎么知道呢?哦,这是个好问题。一种可能性是查看Brightspace,也许。另一种是查看Piazza,那里会有课程更新。所以,理论上在Piazza上某个时候会有一个公告,说“嘿,第一个测验准备好了”。并且我们假设从那以后,测验每天都会在这个时间准备好。

如果你去找测验却找不到,你应该怎么办?有人有想法吗?发邮件是一种可能性,但有更好的可能性。有人能想到更好的可能性吗?Piazza。如果你发邮件,你得到了答案,但其他人得不到答案。如果每个人都发邮件,我或助教们就得回复183封邮件。正确的做法是在Piazza上提问。所以,如果到了周三晚上6点以后,你们开始发送礼貌但坚定的消息说“我找不到测验”,这是完全可以的。大家都明白这个想法了吗?这就是我们沟通的方式。

再次强调,如果你有个人问题,我很乐意和你交流。但我认为那些可能对其他同学也有用的问题,Piazza是合适的平台。是的。你们可以期待在周一晚上、周三晚上有测验,并且必须在下一节课前完成。好的,我想让大家养成一个习惯,是的。

我不这么认为,但这些测验并不是设计成长时间的练习。如果你觉得你想在笔记中查找答案,那也没关系。但我希望是一次性完成。因为风险并不高,如果你答错了一个测验问题,从大局来看真的不重要。测验占你总成绩的5%,总共会有25次,每次测验大概有四道题。如果你在一次测验中错了几道题,或者甚至每次测验都错一道,也没太大关系。但如果你完全不做测验,那就有关系了。是的。

会花多长时间?我相信会花四到五分钟。现在你知道了。如果你随机回答,当然可以更快。你能做得更慢吗?我相信如果你用心,可以花更多时间,但这本意不是一次认知练习,而是一次快速的检查。关于这个有任何问题吗?关于测验还有其他问题吗?

好的,这里谁还没加入Piazza?谁还没注册Piazza?好的,你们所有人都最好注册Piazza。它现在叫“Fall 2024”,所以你们要确保加入的是正确的Piazza页面,一开始有些小故障。我应该把旧的Piazza页面关掉。但请加入那里,并证明你已经加入了。有任何问题吗?好的。

关于课程后勤还有其他问题吗?下一节课,我们将发布第一个作业,那将开始成为真正的事情,我们到时候再处理。好的,还有其他事吗?


好的,所以今天我想开始谈谈我所理解的数据科学。

也许这堂课会比其他的课更偏向哲学性一些。所以,如果你开始听到我喋喋不休地谈论我的观点,在这里会比在其他时候更常见,所以别太害怕。我希望大家在这里提问或互动,这很重要。我们今年所在的这个教室,我想知道是否有人喜欢这个教室?谁不喜欢这个教室?我习惯在一个又大又漂亮的教室Fry Hall 104教学,那里很漂亮,很大,有白墙之类的,但我讨厌那个房间,因为学生离得很远,就像在对一个体育场讲课。在这里,你们就在我面前,这我喜欢。所以我希望这里有提问,希望这里有互动。好的,关于这个有任何问题吗?


那么,什么是数据科学?当我思考数据科学时,我认为它有点像……让我看看能不能把这个点移到某个地方。这个位置对点来说更好吗?好的。它有点像是一个出现在……交叉领域的学科。

数据科学大致出现在计算机科学统计学/数学领域专业知识的交叉点上。

022:Python 数据科学应用(2024秋季)

在本节课中,我们将学习Python中几个核心且实用的编程概念,包括匿名函数(lambda)、关键字参数、字典与集合的操作,以及不同数据结构的时间复杂度分析。理解这些概念对于编写高效、可读性强的数据科学代码至关重要。


匿名函数(Lambda)的强大之处

上一节我们介绍了函数的基础知识,本节中我们来看看匿名函数(lambda)的威力。匿名函数真正的力量在于它们可以作为参数被嵌入到另一个函数内部使用。

在后续的教程中,特别是在Pandas的apply函数和列表排序中,你会频繁地看到这种用法。请记住这一点。


关键字参数的便利性

接下来,我们探讨函数调用的另一个便捷特性:关键字参数。

例如,我们来看同一个excite_string函数,但现在它包含多个参数。假设我们有两个额外参数:excitement_levelexcitement_character,然后在函数内部对它们进行处理。

def excite_string(s, excitement_level, excitement_char):
    # 使用参数进行某些操作
    return s + excitement_char * excitement_level

现在,如果我们直接调用这个函数,可能会因为参数顺序错误而得到报错。这种情况在使用C++或Python时都相当常见,如果不回头查看函数定义,很容易记不清哪个参数在前。

有一种有用的方法可以避免这类错误:你可以传递关键字参数,并明确指出每个参数的值。例如,即使excitement_char是第二个参数,我也可以在任何位置指定它,因为我明确地告诉了函数excitement_char的值是‘#’

result = excite_string("Hello", excitement_char='#', excitement_level=3)

由于我们使用了参数名,参数的顺序就不再重要,代码可以完美运行。这在处理机器学习等包含大量参数的场景时尤其方便,是一种更佳的编码实践。


字典与集合

在Python基础中,接下来是字典和集合。这是我最喜欢的数据结构,在其他语言中通常被称为哈希表。它的核心是建立键到值的映射。

以下是一个函数示例,它将一个列表转换为字典并统计其中字母的出现次数:

def list_to_count_dict(input_list):
    count_dict = {}
    for item in input_list:
        count_dict[item] = count_dict.get(item, 0) + 1
    return count_dict

test_list = ['O', 'n', 'e', ' ', 'm', 'u', 's', 't', ' ', 'i', 'm', 'a', 'g', 'i', 'n', 'e', ' ', 'S', 'i', 's', 'y', 'p', 'h', 'u', 's', ' ', 'h', 'a', 'p', 'p', 'y']
test_dict = list_to_count_dict(test_list)
print(test_dict)

输出结果会用花括号{}包裹,显示每个字母(包括大写字母‘O’)及其出现次数。

以下是字典的一些常用操作:

  • 获取键dict.keys() 返回所有键。
  • 获取值dict.values() 返回所有值(顺序与键对应)。
  • 获取键值对dict.items() 以元组形式返回所有键值对。

我们可以将items()的结果转换为列表,然后进行排序。这里我们将看到lambda函数的首次实际应用。

首先,将键值对放入列表并直接排序:

pairs_list = list(test_dict.items())
pairs_list.sort()
print(pairs_list)

默认排序会按字母顺序排列。但我们可以通过向sort函数传递一个参数来按不同规则排序,这正是lambda函数的用武之地。

我们传入一个键值对(二元元组)x,并指定按x的第二个元素(即统计次数)进行排序:

pairs_list.sort(key=lambda x: x[1], reverse=True)
print(pairs_list)

现在,所有出现次数为3的字母排在了顶部,出现次数为1的排在底部。在处理字典时,你经常需要关心键,但又需要按值排序,使用lambda函数可以高效地完成这个任务。


Python数据结构的时间复杂度

接下来是一个相当重要的主题,尤其对于Python初学者。我们需要了解Python中不同数据结构操作的时间复杂度。

在数据科学基础课程中,学生最常见的问题之一是:“为什么这行简单的代码运行起来需要几个小时甚至几天?” 你确实需要理解这“一行代码”背后发生了什么。虽然不必深究所有细节,但应该对操作的预期时间或内存复杂度有基本概念。

让我们通过一些代码来理解:

1. 创建列表(O(n)操作)

import time
start = time.time()
large_list = [0 for _ in range(10**8)]  # 创建包含1亿个0的列表
end = time.time()
print(f"创建列表耗时:{end - start:.2f} 秒")

创建这个列表是O(n)操作,耗时约几秒。

2. 列表末尾追加(O(1)操作)

start = time.time()
large_list.append(1)
end = time.time()
print(f"列表追加耗时:{(end - start) * 1000:.2f} 毫秒")

在列表末尾追加元素是O(1)操作,速度极快,仅需零点几毫秒。

3. 列表中间插入(O(n)操作)

start = time.time()
large_list.insert(500000, 999)  # 在中间位置插入
end = time.time()
print(f"列表插入耗时:{(end - start) * 1000:.2f} 毫秒")

在列表中间插入元素是O(n)操作,因为它可能需要移动大量元素。这个操作比追加慢近千倍。

4. 列表转集合(O(n)操作)

start = time.time()
large_set = set(large_list)
end = time.time()
print(f"列表转集合耗时:{end - start:.2f} 秒")

将列表转换为集合也是O(n)操作,需要遍历整个列表。

5. 集合中添加元素(O(1)操作)

start = time.time()
large_set.add(-1)
end = time.time()
print(f"集合添加耗时:{(end - start) * 1000:.2f} 毫秒")

向集合中添加元素是O(1)操作,速度非常快。

我想强调的重点是:你应该对代码中指令的最坏情况复杂度有一个基本了解。选择正确的数据结构(如需要频繁插入时使用集合而非列表)能极大提升程序效率。


总结

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

  1. 匿名函数(lambda):作为参数内嵌在其他函数中时非常强大,常用于排序和Pandas操作。
  2. 关键字参数:通过指定参数名调用函数,可以避免参数顺序错误,提高代码可读性和健壮性。
  3. 字典与集合:字典用于键值映射,集合用于存储唯一元素。我们学习了如何对字典按键或值排序,并首次应用了lambda函数。
  4. 时间复杂度分析:理解了列表和集合常见操作(如创建、追加、插入、转换)的时间复杂度差异。认识到选择合适的数据结构对程序性能至关重要。

掌握这些概念将帮助你写出更高效、更专业的Python代码,为后续的数据科学工作打下坚实基础。

023:以人为本的数据科学

在本节课中,我们将探讨数据科学和人工智能领域中与人相关的议题,包括伦理问题、社会影响以及如何利用人类智慧(众包)来解决复杂问题。课程最后,我们会讨论期末考试的相关安排。

期末考试安排

上一节我们介绍了课程的整体方向,本节中我们来看看期末考试的具体信息。

期末考试将于一周后的周一举行,时间为上午11:15开始,持续两个半小时。考场与期中考试相同。

关于考场容量,我需要确认是否舒适。如果309教室过于拥挤,我可能会考虑调整安排,确保没有学生需要在走廊考试。

以下是关于期末考试的一些要点:

  • 考试将包含约12至15道简答题。
  • 题目类型与期中考试类似,侧重于需要思考的定性问题。
  • 考试内容涵盖整个课程,是累积性的。
  • 复习的最佳方式是练习教材中的习题,并参考以往的期中、期末考试题目。

如果你有好的期末考试题目想法,欢迎通过邮件发给我。如果你发送了题目,建议你同时知道答案。

人工智能的社会关切

在了解了期末安排后,我们将进入本节课的核心主题:数据科学中的人文视角。当前,数据科学常与机器学习和人工智能联系在一起,并引发了许多社会担忧。

首先,我想了解大家的看法。作为技术领域的学习者,你们对人工智能与社会的关系有何担忧?通过快速调查,我发现大家的意见各不相同。

我认为人们的担忧主要可以归纳为以下四个类别:

1. 经济错位 😡
核心担忧是机器是否会取代人类的工作。例如,自动驾驶技术可能威胁卡车司机和出租车司机的职业。

2. 隐私问题
人们担心个人数据和隐私信息被机器收集和分析,导致“它们对我了解过多”,这可能带来负面影响。

3. 偏见问题 😡
这是指模型可能从数据中学到关于人的错误观念或刻板印象。当模型开始基于这些有偏见的认知为人做决策时,就会产生问题。

4. 代理权问题
即人工智能是否会获得感知能力并失控,甚至“接管世界”,导致人类在其做出错误行为时无法控制。

接下来,我们将逐一探讨这些类别。我鼓励大家就此展开讨论。

深入探讨:对技术岗位的冲击

在概述了四大关切领域后,我们首先深入探讨经济影响,特别是对我们自身领域的冲击。

作为一个具体问题:在座的各位计算机科学领域的学生,有多少人担心人工智能会取代程序员的工作?根据现场反应,对此表示担忧的人似乎不多。

这引出了一个有趣的现象。虽然许多蓝领工作(如司机、保安)已明显受到新技术威胁,但白领工作,包括技术岗位,也开始面临变化和挑战。

总结

本节课中,我们一起学习了期末考试的具体安排,并重点探讨了以人为本的数据科学视角。我们分析了围绕人工智能的四大社会关切领域:经济影响、隐私、偏见和代理权问题,并特别讨论了其对技术岗位的潜在冲击。理解这些伦理和社会影响,对于成为一名负责任的数据科学家至关重要。

024:机器学习专题(续)🎯

在本节课中,我们将继续探讨机器学习方法。我们将学习朴素贝叶斯和支持向量机,并希望初步了解神经网络。不同的机器学习方法各有其优缺点。

上一节我们介绍了决策树和提升方法,其核心思想是利用大量弱特征来解决分类问题。本节中,我们来看看如何利用词汇特征进行文本分类。

文本分类与词汇特征

在文本分类问题中,例如区分垃圾邮件与正常邮件,最基础的特征通常是文档中每个词汇的出现频率。

以下是构建特征的基本步骤:

  1. 准备两个文档集(例如垃圾邮件集和非垃圾邮件集)。
  2. 统计每个词汇在每个文档集中出现的总次数。
  3. 将次数分别除以对应文档集的总词数,得到每个词汇在每个类别中的相对频率。

例如,在垃圾邮件中,“sale”一词的出现频率可能为1%,而在非垃圾邮件中可能只有0.5%。这种频率差异是分类的关键。

优势比:量化词汇重要性

为了量化一个词汇对区分两个类别的贡献度,我们使用优势比

其计算公式为:
优势比 = (词汇在类别A中的频率) / (词汇在类别B中的频率)

为了使其对称且易于解释,我们通常取其对数:
对数优势比 = log(优势比)

对数优势比的值可以清晰地表明一个词汇在某个类别中是过度出现(正值)还是出现不足(负值)。

研究实例:Twitter用户迁移分析

优势比在实际研究中非常有用。例如,在一项关于Twitter用户个人简介的研究中,我们分析了用户迁移模式。

研究过程如下:

  • 收集了数亿条用户的自我描述(个人简介)。
  • 通过用户资料中的位置信息,识别出哪些用户迁入了某个州,哪些用户迁出了该州。
  • 计算每个词汇在“迁入”和“迁出”两组用户简介中的对数优势比。

通过分析,我们可以发现:

  • 哪些词汇(如“student”)在迁移人群中普遍过出现。
  • 特定词汇(如“Stony Brook”)的优势比可以揭示该大学对人口流动的影响。
  • 这种方法有助于从宏观层面理解社会群体的变化与差异。

文档的向量化表示

基于上述方法,我们可以将任何文本文档转化为一个数学向量,这个过程称为向量化。

向量化表示如下:
文档向量 = [词1的频率, 词2的频率, ..., 词n的频率]

这样,每个文档都被表示为一个n维空间中的点,其中n是我们的词汇表大小,每一维对应一个词汇在该文档中的相对重要性(通常由TF-IDF等加权频率表示)。这为后续使用各种机器学习算法进行分类奠定了基础。

本节课中我们一起学习了如何利用词汇频率进行文本分类,重点介绍了优势比的概念及其在量化词汇区分度中的应用,并通过一个实际研究案例展示了其用途。最后,我们了解了如何将文档转化为数值向量,这是许多文本机器学习模型的输入基础。

025:自然语言处理与大语言模型 (2024秋季) 🧠

在本节课中,我们将学习自然语言处理(NLP)的基础知识及其发展历程,探讨从传统的词频统计方法到现代大语言模型(LLMs)的演变,并思考这些变革对数据科学领域的影响。


上一节我们提到了课程安排,本节中我们来看看自然语言处理的核心内容。首先,我想谈谈一些经典的NLP方法,以及人们如何将文本作为数据使用。这个领域在我职业生涯的20年里发生了翻天覆地的变化。20年前,NLP很大程度上基于古典语言学,而今天的模型已经摒弃了许多那时的概念。我的目标是快速回顾一些我认为在经典NLP中至今仍有用的东西。

然后,我将讨论当今的模型,特别是Transformer的工作原理。最后,我想探讨一下,在这个大语言模型的世界里,数据科学意味着什么。我认为我们正处在一个一切都在变化的时代,我想稍微思考一下哪些东西变了,哪些没变,或许这能引发一些讨论。


经典NLP:词频统计 📊

首先,当我们回想20年前我刚起步时的NLP,很多工作都围绕着统计词频展开。统计词频至今在许多方面依然是一个好方法。

例如,我早期参与的一个情感分析系统,后来变得相当知名,甚至成立了一家公司。它的核心就是统计词频:统计事物被提及的频率,以及它们是否与正面或负面词汇一同出现。

人们现在仍在使用词频统计完成许多任务。我们上次讨论的朴素贝叶斯分类就是一个词频统计的应用,它统计每个词在不同语料库中出现的频率。

以下是词频统计的一些常见应用:

  • 词云:人们喜欢词云。它的原理是分析文档,根据词语的使用频率,按比例展示每个词的大小。这是一种快速理解两个不同语料库之间差异的有效方式。

词频统计的效果好坏取决于两个主要因素:

  1. 你用于训练的语料库是否有意义。
  2. 你选择统计哪些词。

当你构建一个统计词频的系统时,需要做出一些决策。以下是需要考虑的设计决策:

  • 你需要决定“大写的Apple”和“小写的apple”是否相同。
  • 你需要决定是否关心停用词。停用词是指那些在所有文本语料库中出现频率通常都很高且意义不大的词(如“the”、“a”、“is”)。
  • 你需要考虑是否关心单词的变形。例如,“apples”和“apple”是否算作同一个东西。如今我们可能会说大写的“Apple”和小写的“apple”不同,但“little apple”和“little apples”可能指的是类似的东西。
  • 有一种称为词干提取的技术,它试图将所有单词的不同形态变化还原到同一个词干。通常,统计相同的词干比统计所有变体更好,因为这能减少特征数量,尽管会损失一些语义信息。
  • 一个关键问题是,如何将文本分割成单词。通常人们根据空格来分割单词,但单词之间可能存在标点符号(例如“blank-dash”被视为两个词)。如何处理标点符号会产生影响。如果完全忽略标点,“#S”和“@S”可能被视为相同。

上一节我们介绍了基础的词频统计,本节中我们来看看更复杂的语言分析。NLP的另一个经典部分是尝试确定单词在句子中的词义和角色

当你学习英语语法时,你了解了名词、形容词、动名词等。词性标注的目标就是给定一个句子,试图找出每个单词在句中扮演的角色。这是你能进行的最基础的句法分析形式,但它仍然被证明是有用的。

有些单词天生就容易混淆是名词还是动词。我常用的一个例子是“run”。“run”可以是动词,比如“去把某人叫来”;有时它也可以是名词,比如“去跑个步”,或者旧时人们穿的丝袜“抽丝了”。因此,过去NLP的一项重要工作就是尝试确定句子中单词的角色。


命名实体识别 🏷️

NLP在过去乃至现在仍然重要的另一个部分是命名实体识别

给定一个句子,你希望尝试找出句子中的人物、地点和事物。例如,在这个句子中:“Y国的总统X1 X2在Z地向O发表了讲话。”,我们可以推断:

  • “Y”很可能是一个地点(国家)或组织。
  • “X1 X2”将是那个人的名字。

有趣的是,你仅仅通过上下文和句子结构就能判断出这些信息。


现代模型:Transformer架构 ⚙️

现在,让我们转向现代模型。当今NLP的核心是Transformer架构,它是大语言模型(如GPT系列)的基础。Transformer的关键创新在于自注意力机制,它允许模型在处理一个词时,权衡句子中所有其他词的重要性。

自注意力机制的核心计算可以用以下公式表示:
Attention(Q, K, V) = softmax(QK^T / sqrt(d_k)) V
其中:

  • Q (Query):代表当前需要关注的词。
  • K (Key):代表句子中所有可供关注的词。
  • V (Value):代表句子中所有词的实际信息。
  • softmax函数将注意力权重归一化。
  • sqrt(d_k)是一个缩放因子,用于稳定梯度。

通过这种方式,模型可以动态地捕捉长距离的依赖关系,理解上下文,这是它强大能力的重要来源。


大语言模型时代的数据科学 🤔

最后,我想探讨一下,在这个大语言模型(LLMs)的时代,数据科学意味着什么。我们生活在一个一切都在变化的世界。

LLMs能够生成文本、翻译语言、编写代码,甚至进行一定程度的推理。这改变了我们处理文本数据的方式。传统的数据科学任务,如分类、情感分析,现在可以通过提示(prompting)或微调(fine-tuning)预训练的LLM来完成,有时不再需要从头开始构建复杂的特征工程模型。

然而,这并不意味着经典方法完全过时。理解词频、句法结构和语义角色,仍然有助于我们设计更好的提示、解释模型的输出,以及在资源受限或需要高度可解释性的场景下构建高效的专用系统。数据科学家的角色可能正在从“模型构建者”转向“模型引导者”和“结果解释者”。


本节课中我们一起学习了自然语言处理的发展脉络。我们从经典的词频统计、词性标注和命名实体识别开始,了解了文本作为数据的基础处理方法。接着,我们探讨了现代NLP的引擎——Transformer架构及其核心的自注意力机制。最后,我们思考了大语言模型崛起对数据科学领域带来的挑战与机遇。理解这些演变,将帮助我们在快速变化的技术 landscape 中更好地定位和应用这些强大的工具。

026:实现规模化处理

在本节课中,我们将探讨处理大规模数据集时面临的挑战与核心概念。我们将了解“大数据”的特性、其来源带来的问题,以及为何处理海量数据本身就是一个重要的计算瓶颈。


上一节我们介绍了课程背景,本节中我们来看看“大数据”通常如何被定义。人们常用三个维度来描述大数据。

以下是描述大数据的三个关键维度:

  • 速度:指处理数据的频率。一端是要求毫秒级响应的实时应用,另一端是每天或每小时运行一次的批处理作业。
  • 多样性:指数据的类型和结构。从结构规整的数据库(列、数字、文本),到包含视频、文本等多种非结构化数据的社交媒体内容,多样性越高,处理方式越复杂。
  • 体量:指数据集的规模。范围可以从兆字节(MB)到拍字节(PB)乃至泽字节(ZB)。例如,Facebook每天接收约4PB的新数据。

现在,我们了解了大数据的特点,接下来要思考这些海量数据从何而来。一位算法专家曾提出一个有趣的观点:大数据即坏数据

大数据集通常来源于机会性收集,而非精心设计。公司收集海量数据,往往是因为其拥有大量用户和用户行为,而非一开始就计划收集如此规模的数据。这导致数据分析是在分析既有的数据,而非理想中为特定问题定制的数据。

分析这类数据集会带来几个特定问题:

以下是分析机会性收集的大数据时面临的主要挑战:

  • 样本偏差:数据仅代表特定平台用户,而非全体人口。例如,分析Twitter数据只能了解Twitter用户的想法,这部分人群本身存在偏差(如需要一定的文化水平)。
  • 垃圾与机器生成内容:数据中混杂大量垃圾信息和机器生成内容(如机器人账号)。如今,AI生成的内容更难与人类发布的内容区分。
  • 幂律分布与冗余:在许多现象中(如发帖量),遵循幂律分布:少数用户产生大量内容,多数用户产生很少内容。这导致数据高度冗余。例如,分析人们对苹果产品的讨论可能数据丰富,但分析对飞机发动机的讨论则可能数据稀少。

本节课中我们一起学习了处理大规模数据的核心议题。我们了解了定义大数据的三个维度(速度、多样性、体量),并探讨了机会性收集的大数据所带来的独特挑战,包括样本偏差、垃圾信息干扰以及数据冗余问题。理解这些是设计有效大规模数据处理方案的基础。

posted @ 2026-03-26 13:11  布客飞龙IV  阅读(3)  评论(0)    收藏  举报