TowardsDataScience-博客中文翻译-2020-一百一十一-
TowardsDataScience 博客中文翻译 2020(一百一十一)
伟大数据科学家的 7 种性格特征
要成为一名伟大的数据科学家,我们需要做更多的事情,这样我们才能实现前所未有的突破。

介绍
大数据的出现导致数据科学的重要性日益凸显,编程和统计知识被视为开始数据科学家职业生涯的主要技能。这些技能有助于进入数据科学行业,这使得全球数百万学生注册了各种在线课程。通过访问互联网,任何人都可以掌握在数据科学领域获得一席之地所需的工具和技能。由于获取技术知识没有障碍,大多数学习者都有望达到相当水平的数据科学能力。
因此,要成为一名伟大的数据科学家,要让自己与众不同,需要的不仅仅是满足技术需求的能力。在我成为数据科学家的过程中,我和各种各样有成就的数据科学家一起工作过,我了解到这 7 种个人特质有助于造就一名伟大的数据科学家。
性格特征
好奇的
作为一名数据科学家,由于数据科学领域的快速发展和不断变化的特征,我们需要对学习新知识和技能有一种不可抑制的热情。学习和了解新的数据科学技术的愿望是不断帮助数据科学家提高其分析能力的一个重要因素。集体知识的积累使我们能够识别不同知识体系之间的逻辑联系。此外,求知欲是提出问题和探索的冲动的表现,这有助于数据科学家在解决问题时避免认知偏差。例如,当我们确定两个变量之间的相关性时,我们倾向于得出因果关系存在的结论。然而,理解统计概念不是为了发现因果关系,一个好奇的数据科学家将进行进一步的探索,以了解和理解两个变量之间的潜在关系。
面向细节
编程是数据科学中的一项基本技能,因此调试练习在设计从数据处理到性能评估步骤的数据科学解决方案时是不可避免的。然而,编程和数据科学技术广度的结合在编码数据科学管道时引入了相当大的复杂性,这使得数据科学家必须关注最小的细节。一个小的编码错误演变成产生意外分析结果的关键问题并不罕见。除了在编程中勤奋调试之外,面向细节的数据科学家通常会在将数据输入机器学习算法之前花费大量时间来检查数据的质量。因此,面向细节有助于数据科学家创作高质量的作品。
批判性推理
在解决现实世界的问题时,数据科学家通常需要客观地分析数据,以证明或反驳某个假设。因此,批判性推理使数据科学家能够就该做什么培养清晰而理性的思维。除了发现隐藏的见解,我们还需要通过构建可以使用数据科学技术解决的问题来系统地解决问题。当处理大量信息时,数据科学家需要在实验和理论确认中构建和评估假设。因此,我们需要持怀疑态度,永远不要通过寻找反映真相的答案来接受表面上的陈述,而不是寻找我们容易得到的答案。例如,在数据科学生命周期中,批判性推理帮助数据科学家在数据采集步骤中批判性地评估数据的可信度。
创造性的
数据科学的本质是使用数据来发现事物如何以不同的方式运作,以产生更多的价值。因此,创造力是一个伟大的数据科学家的关键特质,因为它能够创造出无中生有的东西。例如,在特征工程过程中需要巨大的想象力来增强机器学习模型的性能。此外,在开发可理解的可视化的过程中,创造力是一个重要的元素,随着设计过程超越数据科学技术能力,可视化可以有效地向利益相关者提供见解。尽管数据科学是逻辑驱动的,但创造力使数据科学家能够从未探索的不同角度来看待问题。
爱说话的
数据科学解决方案的开发涉及从获取数据到训练机器学习模型的高度复杂的技术。因此,将分析结果转化为可操作的业务见解并与业务利益相关方进行沟通,是伟大的数据科学家最重要的特质。分析结果的交流决定了数据科学解决方案的影响,因为从逻辑上和情感上吸引利益相关者的能力有助于我们与利益相关者说相同的语言。我们需要利用业务语言来有效地交流技术成果,因为它鼓励利益相关者有效地参与构思和成果验证。许多伟大的数据科学家在交流结果时感同身受,他们通过创造一个引人注目的故事来呈现事实和数据,以促进任何人的理解。
心胸开阔
由于与各种利益相关者(如数据工程师和业务主管)的合作占主导地位,开放的思维使数据科学家能够与其他人高效地合作。思想开放的状态有助于数据科学家暂停判断,以便继续探索最佳可能的解决方案。即使我们正在研究一个假设,也有许多其他的假设可能会带来更好的见解。因此,伟大的数据科学家是思想开放的数据科学家,即使模式与最初的预测不同,他们也会观察新出现的模式。
病人
最后但同样重要的是,伟大的数据科学家是一个有巨大耐心的人,因为从编程到调整机器学习模型的技术元素的组合是高度复杂的。即使是最好的数据科学家也会面临编程错误和弱模型性能,其中耐心是在数据科学领域取得成功的必备特质。耐心是将您的技术能力转化为成就的重要因素,因为创建成功的数据科学解决方案需要持续的努力。在成为数据科学家的过程中,失败是不可避免的,耐心帮助我们采取积极的态度在寻找最佳解决方案的过程中重构问题。
结论
要成为一名伟大的数据科学家,我们需要做更多的事情,这样我们才能实现前所未有的进步。由于任何能够访问互联网的人都可以学习数据科学,因此将会有许多拥有相同技术技能的数据科学家。因此,上面阐述的 7 个特征将把你的数据科学能力提升到一个更高的水平,让你与众不同。虽然不是每个数据科学家都具备所有的特征,但我们可以在成为伟大数据科学家的过程中学习发展这些特征。将自己转变为更好的数据科学家的过程应该超越学习技术技能,包括 7 种个人特质,因为无论在哪个领域和行业,它们都是高度可转移的。
每个数据科学家都应该知道的 9 个概率概念和公式
学习如何计算概率,两个事件的交集和并集之间的差异,条件概率,精度测量和主要计数技术

乔希·阿佩尔的照片
概率是什么?
概率是一个反映特定事件发生的几率的数字。换句话说,它量化了(从 0 到 1,或从 0%到 100%) 一个事件发生的可能性。
概率是数学的一个分支,它提供了描述随机过程的模型。这些数学工具允许建立随机现象的理论模型,并使用它们进行预测。像每个模型一样,概率模型是对世界的简化。然而,一旦模型捕捉到基本特征,它就是有用的。
在本文中,我们提出了 9 个概率的基本公式和概念,每个数据科学家都应该理解和掌握,以便恰当地处理任何概率项目。
1.概率总是在 0 和 1 之间
事件发生的概率总是在 0 到 1 之间(或者 0%到 100%),
0≤P(A)≤1
- 如果事件不可能发生: P(A) = 0
- 如果一个事件是确定的: P(A) = 1
例如,用标准的六面骰子(正面从 1 到 6)掷出 7 是不可能的,所以它的概率等于 0。用硬币掷头或尾是确定的,所以它的概率等于 1。
2.计算概率
如果样本空间的元素(随机实验的所有可能结果的集合)是等概率的(=所有元素具有相同的概率),则事件发生的概率等于有利情况的数量(它可能发生的方式的数量)除以可能情况的数量(结果的总数):

例如,六面骰子的所有数字都是等概率的,因为它们都有相同的出现概率。用骰子掷出 3 的概率是

因为只有一个有利的情况(只有一张脸上面有 3),有 6 个可能的情况(因为一共 6 张脸)。
3.事件的补充
事件的互补(或相反)概率为:

例如,没有掷出 3 的概率是:

4.两个事件的联合
两个事件结合的概率是其中任何一个事件发生的概率:
P(A 或 B)= P(A∪B)= P(A)+P(B)-P(A∪B)
假设某一年两栋房子发生火灾的概率是:
- 在房子 A 中:60%,所以 P(A)=0.6
- 在房屋 B 中:45%,因此 P(B)=0.45
- 在两院中至少有一个:80%,所以 P(A∪B)=0.8
图形上我们有

房屋 A 或房屋 B发生火灾的概率为
P(A∪B)= P(A)+P(B)-P(A∪B)= 0.6+0.45 0.25 = 0.8
通过对 P(A)和 P(B)求和,计算 A 和 B 的交集,即 P(A∩B)两次。这就是我们减去它,只计算一次的原因。
如果两个事件互斥(即两个事件不能同时发生),则两个事件发生的概率等于 0,因此上述公式变为
P(A∪B)=P(A)+P(B)
例如,事件“在六面骰子上掷出 3”和事件“掷出 6”是两个互斥的事件,因为它们不能同时发生。因为它们的联合概率等于 0,所以在六面骰子上掷出 3 或 6 的概率是

5.两个事件的交集
如果两个事件是独立的,那么这两个事件相交的概率(即联合概率)就是这两个事件发生的概率:
(美国和 B)=P(A∩B)=P(A)⋅P(B)
例如,如果掷两枚硬币,两枚硬币都是反面的概率是

注意 P(A∩B)=P(B∩A)。
如果两个事件互斥,则它们的联合概率等于 0:
P(A∩B)=0
6.两个事件的独立性
由于上述公式,可以验证两个事件的独立性。如果等式成立,则称这两个事件是独立的,否则称这两个事件是相关的。形式上,事件 A 和 B 是独立的当且仅当
P(A∩B)=P(A)⋅P(B)
- 在两个硬币的例子中:

这两个事件因此是独立的,表示为

- 在两栋房子发生火灾的例子中(见第 4 节):
P(A∩B)=0.25
和
P(A)⋅P(B)=0.6⋅0.45=0.27
所以下面的等式不成立
P(A∩B)≠P(A)⋅P(B)
这两个事件因此是相关的(或不独立的),表示为

7.条件概率
假设两个事件 A 和 B,P(B)>0。给定(已知)B 的条件概率是在事件 B 已经发生的情况下事件 A 发生的可能性:

注意,一般情况下,给定 B 的概率不等于 B 给定 A 的概率,即 P(A|B)≠P(B|A)。
从条件概率的公式中,我们可以推导出乘法定律:

如果两个事件是独立的,P(A∩B)=P(A)⋅P(B),并且:
- P(B)>0,条件概率变成

- P(A)>0,条件概率变成

等式 2 和 3 意味着知道一个事件发生不会影响另一个事件结果的概率。这实际上是独立性的定义:如果知道一个事件的发生无助于预测(不影响)另一个事件的结果,那么这两个事件本质上是独立的。
贝叶斯定理
从条件概率和乘法定律的公式中,我们可以推导出贝叶斯定理:

例子
为了说明条件概率和贝叶斯定理,假设下面的问题:
为了确定一个人是否患有某种疾病,需要进行血液测试。当一个人患有这种疾病时,该测试可以在 80%的情况下揭示疾病。当疾病不存在时,在 90%的情况下测试是阴性的。经验表明,这种疾病出现的概率为 10%。研究人员想知道在测试结果为阳性的情况下,个人患有该疾病的概率。
为了回答这个问题,定义了以下事件:
- 病人:检查结果是阳性的
- 医生:这个人有这种疾病
此外,我们用一个树形图来说明这一说法:

(所有 4 种情况的总和必须等于 1,因为这 4 种情况包括所有可能的情况。)
假设测试结果为阳性,我们在寻找个人患病的概率,P(D|P)。遵循条件概率的公式(等式)。1)我们有:

就我们的问题而言:

从树形图中,我们可以看到,在两种情况下,阳性测试结果是可能的:(I)当一个人患有疾病时,或者(ii)当这个人实际上没有患有疾病时(因为测试并不总是正确的)。为了找到阳性测试结果的概率 P(P ),我们需要总结这两种情况:

情商。4 然后变成

如果检测结果呈阳性,患这种疾病的概率只有 47.06%。这意味着,在这种特定情况下(相同的百分比),一个人在知道自己的测试呈阳性的情况下,患病的几率不到 1/2!
这一相对较小的百分比是由于这种疾病相当罕见(只有 10%的人口受到影响)以及测试并不总是正确的(有时它检测到疾病,尽管它不存在,有时它没有检测到它,尽管它存在)。因此,与有阳性结果和实际患病的人的百分比(8%)相比,有更高百分比的健康人有阳性结果(9%)。这就解释了为什么在宣布检测结果之前往往要进行几项诊断性检测,尤其是对罕见疾病。
8.准确度测量
基于上述疾病和诊断测试的示例,我们解释了最常见的准确性测量:
- 假阴性(数量和比率)
- 假阳性(数量和比率)
- 灵敏度
- 特征
- 阳性预测值
- 阴性预测值
在深入研究这些准确性度量的细节之前,这里有一个度量和树形图的概述,其中为 4 个场景中的每一个添加了标签:

改编自维基百科

假阴性
假阴性(FN)是指被错误标记为而不是患有疾病或状况的人数,而实际上它是存在的。这就像告诉一个怀孕 7 个月的女人她没有怀孕。
从树形图中,我们可以看到:

而且,假阴性率 ( FNR )定义为

假阳性
假阳性(FP)是指被错误标记为患有疾病或状况的人数,而实际上是而不是存在。这就像告诉一个男人他怀孕了。
从树形图中,我们可以看到:

而且,假阳性率 ( FPR )定义为

灵敏度
测试的敏感性,也称为回忆,衡量测试在条件存在时检测条件的能力(被正确识别为患有疾病的患者的百分比):

其中 TP 为真阳性。
从树形图中,我们可以看到:

特征
检测的特异性衡量检测在不存在疾病时正确排除疾病的能力(被正确识别为未患病的健康人的百分比):

其中 TN 是真正的负数。
从树形图中,我们可以看到:

阳性预测值
阳性预测值,也称为精度,是与条件的存在相对应的阳性结果的比例,因此阳性结果是真正阳性结果的比例:

从树形图中,我们可以看到:

阴性预测值
阴性预测值是对应于不存在该条件的阴性的比例,因此阴性结果是真阴性结果的比例:

从树形图中,我们可以看到:

9.计数技术
为了使用第 2 节中的公式,必须知道如何计算可能元素的数量。
概率中有 3 种主要的计算技术:
- 增加
- 排列
- 结合
在等概率结果的情况下,如何计算可能元素的数量,见下文。
增加
乘法法则如下:
(A×B)=(#A)×(#B)
其中##是元素的数量。
例子
在餐馆里,顾客必须选择一道开胃菜、一道主菜和一道甜点。餐厅提供两道开胃菜、三道主菜和两道甜点。有多少不同的选择是可能的?
有 12 种不同的可能选择(即 2⋅3⋅2).
排列
排列的数量如下:

其中 r 为长度,n 为元素个数,r≤n,注意 0!=1 和 k!=k×(k−1)×(k−2)×⋯×2×1 如果 k=1,2,…
排列的顺序很重要!
例子
计算集合 A={a,b,c,d}中长度为 2 的排列,没有一个字母重复。你找到了多少种排列?
用手

在 R 中
library(gtools)x <- c("a", "b", "c", "d")# See all different permutations
perms <- permutations(
n = 4, r = 2, v = x,
repeats.allowed = FALSE
)
perms## [,1] [,2]
## [1,] "a" "b"
## [2,] "a" "c"
## [3,] "a" "d"
## [4,] "b" "a"
## [5,] "b" "c"
## [6,] "b" "d"
## [7,] "c" "a"
## [8,] "c" "b"
## [9,] "c" "d"
## [10,] "d" "a"
## [11,] "d" "b"
## [12,] "d" "c"# Count the number of permutations
nrow(perms)## [1] 12
结合
组合的数量如下:

其中 r 是长度,n 是元素的数量,r≤n。
组合中的顺序不重要!
例子
一个 5 个孩子的家庭,3 个女孩 2 个男孩的概率是多少?假设生女孩和生男孩的概率相等。
用手
- 3 名女孩和 2 名男孩(有利案例):

- 可能病例数:2^5=32

在 R 中
- 3 个女孩和 2 个男孩:
choose(n = 5, k = 3)## [1] 10
- 可能情况的计数:
2^5## [1] 32
3 个女孩和 2 个男孩的概率:
choose(n = 5, k = 3) / 2^5## [1] 0.3125
感谢阅读。我希望这篇文章能帮助你理解概率论中最重要的公式和概念。
和往常一样,如果您有与本文主题相关的问题或建议,请将其添加为评论,以便其他读者可以从讨论中受益。
相关文章:
- 学生的 R 和手工 t 检验:如何在不同场景下比较两组
- R 中的相关图:如何突出显示数据集中最相关的变量
- 聚类分析完全指南:k-means 和手动和 in R 系统聚类
- 我的数据符合正态分布吗?关于最广泛使用的分布以及如何检验 R 中的正态性的注释
- 手工卡方独立性检验
原载于 2020 年 3 月 3 日 https://statsandr.com。
9 必须知道处理任何熊猫数据帧的函数
一个包含熊猫最常用的所有函数和调用的备忘单

伊莲娜·洛希娜在 Unsplash 上的照片
在这篇文章中你会发现:
- 五个功能了解你的数据集
- 按值过滤您的数据框架
- 有了日期时间类型
- 合并多个数据集
- 手柄列
- 分组 乘值
- 应用功能
- 使用λ方法
如果您还不是会员,请在此获得您的中级会员资格!
1.了解您的数据集
加载数据集后要做的第一件事是仔细查看数据框中的信息。为此,以下函数正好满足您的需求。
Head() 打印数据集的前 5 行,包括列标题和每一行的内容。
df.head()
Info() 打印列标题和存储在每列中的数据类型。当您试图了解哪些值需要更改类型以便对它们应用函数时,此函数非常有用。存储为字符串的整数在转换为整数之前不会相加。
df.info()
Shape() 以格式('行' x '列')给出数据帧的大小。
df.shape
Describe() 给出数据集中所有数值的平均值、中值、标准差和百分位数。我建议在确保所有数值都存储为整数或浮点数之后,使用 describe。
df.describe()
【唯一() 允许你查看每一列中的唯一值。当您有分类数据并且想要了解类别时,这尤其有用。
df['columnName'].unique()
为给定的列查找数据集中重复次数最多的值。
df.column.value_counts().head(**20**)
2.按值过滤
过滤是处理任何熊猫数据帧时需要的一项基本技能。为了将列中的值与筛选器进行比较,使用了运算符。
可以对数值进行过滤,也可以对定性或分类值进行过滤。
df = df[df.value > 0 ]
df = df[df.column != 'value']

通过使用按位运算符,可以应用各种过滤器。在下面的示例中,OR 和 and 运算符用于创建两个新的数据帧,它们是原始数据帧的过滤版本。
df1 = df[(df.Party == ‘Conservative’) | (df.Party == ‘Labour’)]
df2 = df[(df.Party == ‘Conservative’) & (df.City == ‘London’)]
3.日期时间
datetime 数据类型允许您重新格式化 pandas 数据帧中的列,以便能够处理日期、按最早/最近的日期排序或者甚至按周/月分组。这可以通过 pandas 中的 到 _datetime() 函数轻松完成。
df[‘date’]=pd.to_datetime(df[‘date’], infer_datetime_format=True)
如果我们想得到一个更详细的视图,就把日期分成几个部分。
df['month'] = df['date'].dt.month
4.合并数据集
两个数据帧的连接或合并可以在列或索引上完成。如果在列上连接列,数据帧索引将被忽略,并将为合并后的数据集创建一个新的索引。否则,如果在索引上连接两个数据帧,该索引将作为合并发生的公共列。
merged = pd.merge(df**,** df2**,** on='episode'**,** how='inner')
merged = pd.merge(df**,** df2**,** on='episode'**,** how='outer')
一个内部合并,将只保留共享公共索引或列值的每个数据集中的值。外部合并将连接整个数据集,并为合并时在其他数据集中找不到的列和行返回空值。

5.处理您的列
可以使用列参数打印列名,也可以使用。前面提到的 info()函数。
print(df.columns)
df.info()
重命名列可以通过一种快速简单的方式来完成。这在使用“合并”功能后特别有用,新列通常被标记为 column_x 和 column_y 。
df.rename(columns={"oldName1": "newName1", "oldName2": "NewName2"})
删除列也是一个必须知道的功能。参数 inplace = True 经常被遗忘,没有它你将看不到你的数据帧的任何变化。
df.drop(columns=[‘column1’, ‘column2’], inplace = True)
6.按值分组
这个 pandas 函数将根据传递的列名创建行之间的层次结构。第一个示例将根据国籍对行进行分组,并对每个国籍进行计数。结果将是一个包含两列的 data frame:Nationality 和 count。
df1 = df.groupby(["nationality"]).count().reset_index()
当不想丢失存储在其他列中的信息时,第二个例子特别有用。这里,产生的数据帧将有三列:姓名、国籍和每个国籍的姓名计数。
df1 = df.groupby(["name", "nationality"]).count().reset_index()
当可视化数据帧中的不同分组时,这可能特别有用。下面的文章将带你了解如何使用该功能绘制条形图。
7.对所有行应用函数
到目前为止,这是每天使用熊猫数据帧的最强大的应用之一。apply()函数,顾名思义,允许我们对数据帧的每一行应用一个函数。apply()方法将 df 数据帧中的一行一行地传递给 string_to_float()函数。
def string_to_float(row)
row['value'] = float(row[value'])
return row(['value'])df['price'] = df.apply(string_to_float, axis = 1)
行['value']只是传递给函数的 df 数据帧的行。我可以通过指定它们的名称来访问这一行中的任何列。
8.λ函数
lambda 函数是一个不绑定到标识符的匿名函数。一般结构如下:
λ自变量 : 表达式
对参数执行表达式,并返回结果。
一个非常基本的 lambda 函数应用在非熊猫环境中的例子。
x = lambda a : a + 10
print(x(5))
如果您想将 lambda 函数应用于整个数据集,语法如下。
df['value'] = df['value'].apply(lambda x: float(x) if != "Not Available" else none)
当值为“可用”时,此示例更改列的数据类型。
什么时候使用适当的函数,什么时候使用 lambda 函数?
这是我留给你的事情…取决于你想执行多少任务,一个合适的函数可能更容易构建。而使用 lambda 函数可以实现快速而简单的更改。
非常感谢你的阅读!
更多类似的文章,请点击这里在 Medium 上找到我!
如果您有任何关于如何改进的问题、建议或想法,请在下面留下评论或通过 LinkedIn 这里取得联系。
ABBA 给伯特和 GPT 的解释者-2
看啊!没有数学

来源:维基百科,“阿爸,权威收藏”
对我来说,我无法理解伯特或 GPT-2 是如何工作的。
我看文章;遵循图表;眯着眼睛看方程式;观看录制的课程;阅读代码文档;还在努力理解这一切。
让它变难的不是数学。
更像是,你期望在真相之前的大部分不知何故被遗漏了。
本文弥合了这一差距,用简单的术语解释了这些模型是如何构建的。这是我希望我能先读的文章;许多细节都已经就位了。
在 ABBA 的慷慨帮助下,我们将介绍三种不同的想法。我保证其中不会有一个数学方程:
1。思考词语和意义— 注意 2。煎饼叠小组件— 深度学习 3。思考词语和信号— 嵌入
在第四部分也是最后一部分,我们将看到这些想法如何整齐地绑成一个蝴蝶结。
1。思考单词和意思——注意
我们来看下面这个句子:

假设我们请三个朋友来读这句话。虽然他们可能会同意这个句子的主题是雨,但他们可能会在哪些词对“雨”最重要以传达这个句子的真正含义上有分歧。
本尼可能会说“轻拍”和“窗户”是最重要的,因为这个句子是关于雨发出的声音。
弗里达可能会说“温柔地”和“夏天”是最重要的,因为这是一个关于夏雨是什么样的句子。
比约恩可能会采取完全不同的方法,把重点放在“ed”和“that”上,暗示这个句子是关于过去的雨的记忆。
当三个读者都在理解同一个句子时,每个人都在关注不同的部分。每个人都对一些与“雨”有关的词赋予不同的权重,而忽略了其他词的重要性。
他们对这句话的不同理解方式也设定了他们对接下来的预期。当被要求继续以“It …”开头的句子时,他们可能会说:

ABBA 注意头。图片来源:维基百科,“夏夜之城”
这三种选择都有道理。
注意力的概念,以及文本中的单词如何以许多不同的方式相互关联,是一个中心思想。我们想利用这个想法,让关注 单词之间的语义关系,并教机器去做这件事。
像伯特和 GPT-2 这样的任务模型接受的训练是正确猜测一段文本中的下一个单词。因此,一旦经过训练,这种模型就可以用来一个字一个字地生成新文本。
这两种模型的主要区别在于,在训练过程中,在 BERT 模型中,你还可以查看出现在后的文本,而 GPT-2 只允许你向后看。
逐字生成文字听起来玄乎;生成几个在一起有意义的单词不是很有意义吗?
事实上,为了有一个更长的视野,超越一个单一的下一个单词,你可以想象一个通向未来的“光束”:而不是直接去寻找你的下一个单词候选人,你保留前 5 个候选人,并为每个候选人生成他们的前 5 个下一个单词,等等。
经过几轮这样的练习后,你会发现这个句子有很多潜在的扩展,你可以从中选择最好的。如果我们要求 GPT-2 完成一个句子,它可能会提供如下明智的建议:

来源:用变形金刚写作,GPT-2。拥抱脸
2.煎饼堆叠组件— 深度学习
本文的前提和承诺是解释像 GPT-2 这样的大型语言模型是如何工作的。
那么,至少我需要告诉你它们是什么。答案是:它们是一堆煎饼。
GPT-2 是一堆相同的组件,称为解码器,伯特是一堆略有不同的相同组件,称为编码器。

来源:图文并茂的 GPT-2。阿拉姆马尔 j。
这些书库有多大?嗯,各不相同。

来源:图文并茂的 GPT-2。阿拉姆马尔 j。
层次越多,你的输入就越混乱、混合和破碎。这就是‘深度学习’中的‘深’的来源。研究人员发现的一件事(这是建造 GPT-3 时的一个具体研究问题)是,你堆叠得越多,一些自然语言处理任务的结果就越好。
你会注意到,随着模型变大,不仅仅是堆栈变高了。底部的数字,模型维度,也在变大。我们将在下一节讨论这个数字;现在,请忽略它。
要理解大型语言模型是如何工作的,您只需要知道当输入通过其中一个组件时会发生什么。从那时起,它只是冲洗和重复。
一切都可以归结为一个小盒子里的传递步骤,这是深度学习的核心思想。保持对更大画面的坚定把握,我不会在这里涵盖一个确切的步骤。
相反,让我们首先弄清楚输入。
这些模型“吃掉”大量文本。(对于超大号的 GPT-2 来说,它有 1024 个令牌,这就构成了大约 600 到 700 个连续单词。对伯特来说是这个数目的一半。)这个文本块被称为上下文。
每个单词都被单独处理,该模型计算每个单词与之前单词的关系。
此外,即使没有具体细节,您也可以确定直通步骤将由五种类型的操作组合而成:

为什么是这些?出于两个非常具体的原因:
- 理论上,如果你一遍又一遍地反复组合这些类型的函数,你就可以逼近任何你想要的函数。
几乎所有的深度学习都建立在上述理论前提之上。
然而,当谈到自然语言处理时,我觉得语言任务也是功能这一奇怪的想法没有得到足够的重视:
当我们从英语翻译成法语时,我们在执行一个功能,接收一些英语单词,输出一串特定的法语单词。
对于文本生成,我们近似一个函数,它接收一堆书面文本,并为下一个单词提供一个合理的选择。
毫无疑问,这些是错综复杂的功能:英语有成千上万的单词,以及它们之间无数的关系。
但是,为了更好地感受复杂的事物是如何用一大堆简单的函数来近似的,请想象一个越来越复杂的 3D 网格:

来源:Manifod 多边形网格的渐进压缩。2012.
2.在实践中,类似文本生成或翻译这样的事情意味着重复这样的动作很多很多次。
为了让注意力的理论概念在计算上可行,所进行的计算需要有特定的数学性质。
查看列表,在五个可能的操作中,有一个是多余的。出于某种原因,它也出现在大而响亮的字母中。这个原因将在下一部分解释:
3.思考文字和信号— 嵌入
让我们考虑把东西加在一起。一方面,我们可以将数字相加:如果我们取 3 加 4,我们得到 7。但是,只看 7,没有留下 3 或 4 的痕迹。才 7 点。
另一方面,你可以把音乐加在一起:如果你把一首歌和另一首歌叠加,你会得到一个新的音轨,但是你仍然可以分辨出两首歌中的每一首。你创造了一些新的东西,但仍然保留了相当多的关于每个原始轨道的信息。从现在开始,我希望你开始思考你所读的单词,就好像每一个单词都是一段不同的 3 分钟音乐。
这种音乐迂回的原因是因为当涉及到高维空间时,人类有着完全垃圾的直觉。我们根据 2D 和 3D 的经验进行推断。但是在许多重要的方面,比如把东西加在一起,事物在更高维度中的表现非常不同。
一个单词的轨迹叫做它的嵌入。我不会告诉你这是怎么做到的,我会说意思相似的单词最终会有相似的嵌入。
在单词进入像伯特和 GPT-2 这样的模型之前,它们首先被转换成长信号——只是不是音乐信号。但是请记住核心思想:sum 保留了关于每个原始部分的大量信息。
回到每个煎饼的功能列表:

大呼小叫的原因开始变得清晰。回想一下我们的 ABBA 关注委员会:
我们向本尼、弗里达和比约恩展示了与雨有关的句子,并要求他们判断下面句子中的单词“It”与之前出现的单词有什么联系。
然后是 Agnetha,她扮演委员会主席的角色:

图片来源:维基百科,“夏夜之城”
我抛出的数字(20%或 60%)并不固定。随着模型的学习,改变的不仅是本尼、比约恩和弗里达如何决定哪些过去的单词是重要的,还有阿格尼斯塔赋予他们观点的权重。
这一切都发生在一个煎饼里。现在我们把它们堆叠起来:每个连续的盒子实质上接收来自前一个盒子的加权判断和前一个盒子的输入之和作为输入。这确保了下层的意见不会在过程中完全丢失。
还记得我让你忽略的那些大数字吗?随着模型的增长,不仅仅是堆叠的煎饼数量,而是“音乐信号”有多长。
想象一下从 ABBA 的滑铁卢到 Queen 的波西米亚狂想曲(将近 6 分钟长)
直觉上,你可以感觉到,当把更长的音乐曲目加在一起时,关于添加的组件的信息会被更好地保留下来。
4。将三个想法巧妙结合
我们如何理解意思与我们如何注意不同的单词密切相关。我们在当前正在阅读的任何内容的上下文中权衡远近词语的影响。
作为人类读者,它允许我们完成任务,比如完成句子中的空白,或者以有意义的方式继续写作。
所以,从哲学上讲,一个词在当前语境中的真正含义是它之前的所有词的集体影响力。因此,我们可以想象一个理论语言模型,它可以通过跟踪单词之间的关系来“理解”文本——无论这种关系多么微妙。
它会通过反复尝试猜测文本中的下一个单词来学习。每次,它都会检查自己做得有多好,如果猜错了,它会重新平衡它赋予单词之间关系的不同权重。
当制作现实生活中的语言模型时,我们使用嵌入而不是书面文字,这些在伯特和 GPT-2 中得到处理。
为了更好地了解这些表示在这个过程中发生了什么,我建议我们最好把它想象成音乐,因为把两个东西加在一起看起来更像是叠加音乐,而不是添加常规数字。
然后我们看了语言机器的肚子。它看起来并不华丽,只是一堆一模一样的盒子,每一个盒子都从下面的盒子里取食物。
而且,虽然我们没有确切地说这些盒子里发生了什么,但我们从概念上理解它们是一种关注词与词之间关系的方式,无论远近。
总结
我是否忽略了一些细节?太好了。
目的是永远不要忽略大局。
虽然 ABBA 委员会并不完全了解每个解码器中发生的事情,但它足够接近真相,使细节易于理解。如果我现在告诉你每一层没有三个注意力头,而是十二个注意力头,那也没什么区别,对吧?
一般来说,每当本文提到一个特定的数字(比如 12 或 1024),假设研究人员已经把它变大了。
简而言之,这就是 GPT 3 号的故事:
而不是 12 层——96 层。
代替上下文中的 1024 个令牌— 2048 个。
不是每层 12 个注意力头,而是 96 个。
不是 1600—12288(!!!)
(鉴于我们所看到的一切,最后一行给了停顿的空间:我们真的需要从 ABBA 的歌曲到 27 分钟的音乐数字来表达每一个词吗?大概不会。)
但基本前提保持不变。曾经处于分层实验领域的语言模型现在正迅速成为日常生活的一部分。他们已经改变了谷歌搜索。他们已经在改变翻译服务。它们已经被用来生成文本。

来源:用变形金刚写作,GPT-2。拥抱脸
当技术从一个学术玩具转变为具有切实影响力的东西时,我不认为研究人员有权坚持使用令人困惑的数学语言。
解释这些概念以便任何人都能理解是一种道德责任。至少,这是我告诉 ABBA 的,所以他们会同意来帮忙。
来源:
1.Seth,Y.2019. BERT 解释-常见问题列表。https://yashuseth . blog/2019/06/12/Bert-explained-FAQs-understand-Bert-working/
2 .图文并茂的 GPT-2。
https://jalammar.github.io/illustrated-gpt2/
3.阿罗拉,2020 年。注释过的 GPT-2。https://amaarora.github.io/2020/02/18/annotatedGPT2.html
4.Smith,N.A.2019. 语境词表征:语境介绍。【https://arxiv.org/abs/1902.06006】
5。李,约 2020。OpenAI 的 GPT 3 语言模型:技术概述。https://lambdalabs.com/blog/demystifying-gpt-3/
6。卡尔沃 M.R. 2018。解剖伯特。
https://medium.com/dissecting-bert
7.拥抱脸。用变形金刚写字。https://transformer.huggingface.co/doc/gpt2-large
构建基于内容的音乐推荐系统的基础知识

在 Unsplash 上由 Mohammad Metri 拍摄的照片
接下来该放哪首歌?
“ …
我想在一个愉快的世界醒来
[…。]
所有人都能进步,
所有的路都可以帮忙,
如果你在那里,
如果你愿意,
这是我的梦想,也是更多人的梦想
…”—这是我第一次摇滚音乐会上记得最清楚的歌词。
我当时 8 岁。是的,你没看错。我父亲带我去看了阿根廷最著名的乐队之一。这是它的最后一场演出。
摇滚乐在我家是很重要的东西。我的房子里堆满了 CD。我仍然记得我们的 5 碟 CD 播放器。
你可以放入五张 CD,并对其进行编程,使其在歌曲和 CD 之间随机播放。当时是牛逼的。
在 90 年代,我很难想象我会一键访问成千上万首歌曲。
更不用说该应用程序可以使用机器学习根据我的偏好和播放列表向我推荐不同的歌曲。
等等… 什么?
是的。最常用的机器学习算法之一是推荐系统。
从广义上讲,推荐器(或推荐)系统(或引擎)是一个过滤系统,其目的是预测用户对一个项目(在我们的例子中是一首歌)的评级或偏好。
推荐系统有几种类型,其中使用较多的是基于内容的过滤器和协同过滤器。
如今,推荐系统被广泛用于许多类型的项目。但是我们将根据歌曲推荐来解释和实现它们。
基于内容的方法基于两首歌曲内容或属性的相似性给出推荐,而协作方法使用不同歌曲的评级矩阵来预测可能的偏好。
我们有兴趣分析 基于内容的过滤器 是如何工作的。名称中的单词内容指向用户喜欢的歌曲的内容或属性集。
使用基于内容的推荐器完成的推荐可以被视为特定于用户的分类问题。这个分类器从歌曲的特征中学习用户的喜欢和不喜欢。
大多数人都有音乐流媒体服务的个人资料。当他们创建帐户时,他们填写了详细信息。
他们登录自己的帐户来听他们喜欢的歌曲,或者将歌曲保存在播放列表中,以便以后或重复收听。
在这种情况下,有几种方法可以构建基于内容的算法来向用户推荐歌曲。
最直接的方法是关键词匹配。
简言之,背后的想法是提取用户喜欢的歌曲描述中存在的有意义的关键词,搜索其他歌曲描述中的关键词以估计它们之间的相似性,并基于此向用户推荐那些歌曲。

基于内容的系统:它会推荐任何与用户以前喜欢/听过的内容相似的内容。
因此,基于内容的推荐算法必须执行以下两个步骤。
首先,从歌曲描述的内容中提取特征来创建对象表示。
第二,在这些对象表示中定义一个相似性函数,它模仿人类理解的项目-项目相似性。
这是怎么执行的,那么?—你可能想知道—
在我们的例子中,因为我们处理的是文本和单词, 术语频率-逆文档频率(TF-IDF) 可以用于这个匹配过程。
TF-IDF 是一种用于信息检索的技术。它对一个术语的频率(TF) 和它的逆文档频率(IDF) 进行加权;这两个概念我们稍后会解释。
该算法为文档中的每个术语找到 TF 和 IDF 的分数。
之后得到每个词的 TF 和 IDF 的乘积。这被称为该术语的 TF-IDF 重量。
我们能把这些说得更简单些吗?是的,当然。
当我们使用这种技术时,我们只是计算文档中每个关键字的出现次数,并通过计算该文档的 TF-IDF 得分来确定其重要性。
TF*IDF 得分越高,该单词在上下文中就越奇怪,因此该术语就越重要。
现在,让我们解释一下频率这个术语的含义。
一个词在当前文档中的词频仅仅是它出现在文档总字数中的次数。
例如,对于文档I love music because it makes me feel like I can fly中的单词music
TF(music) = Number of times music appears/Total number of words = 1/12
简单吧?但是逆文档频率呢?
一个术语的逆文档频率是该术语在整个语料库中的重要程度的度量。
它被定义为语料库中的文档总数与包含符合以下公式的术语的文档的出现频率之比:
IDF = log(Total number of documents/Number of documents containing the term)
如果一个单词非常罕见,这意味着它出现的次数更少,因此 IDF 增加。
因为 TF-IDF 分数用于评估一个单词对语料库中的文档有多重要,所以当出现次数增加时,该单词的重要性增加,但是它被该单词在语料库中的频率所抵消。
如果我们计算每个单词的 TF-IDF 得分,我们有一个向量,通常称为 TF-IDF 向量 。
太好了!但是我们如何将它翻译成 Python 代码呢?
所以想象一下,我们有数据集后面的。
该数据集包含 57650 首英文歌曲的名称、艺术家和歌词。数据是通过抓取从 LyricsFreak 获得的。
我们希望使用 TF-IDF 技术建立一个基于内容的推荐系统。
我们之前已经用过 TF-IDF 评分了。还记得我们执行 Twitter 情绪分析的时候吗?
同样,我们将使用Scikit-learn包中的TfidfVectorizer。
和往常一样,熊猫将帮助我们将数据集读入DataFrame。

由于数据集如此之大,我们将只对 5000 首随机歌曲进行重新采样。
我们还可以注意到文本中出现了\n,所以我们要删除它。
之后,我们使用TF-IDF vectorizer来逐字计算每首歌词的 TF-IDF 分数。
这里,我们特别注意我们可以指定的参数:
- 分析器:特征应该由单词还是字符 n 元构成。
- stop_word :记住,stop words 只是对我们的系统没有显著价值的词,所以应该被系统忽略。我们传递
English以便它被识别为歌词的语言。
我们创建了一个lyric_matrix变量,其中存储了包含每个单词及其 TF-IDF 分数的矩阵。
但是现在,下面的问题出现了:
—我们如何使用这个矩阵进行推荐?—
答案就是一个字:similarity。我们现在需要计算一首歌词与另一首歌词的相似度。
我们如何做到这一点?
为此,我们可以使用不同的度量标准,比如余弦相似度,或者欧几里德距离,等等。
对于我们的歌曲推荐系统,我们将使用 余弦相似度 ,尤其是它的实现来自 Scikit-learn。
我们希望计算数据集中每个项目与其他每个项目的余弦相似性。所以我们只传递lyrics_matrix作为参数。
一旦我们得到了相似性,我们将在一个名为similarities的字典中存储我们数据集中每首歌曲最相似的 50 首歌曲的名称。
在那之后,所有的奇迹都发生了。我们可以使用相似性分数来访问最相似的项目并给出推荐。
首先,我们将定义基于内容的推荐类。
现在,我们准备从数据集中挑选一首歌曲并进行推荐。

我们可以随机选择另一首歌并再次推荐:

很酷吧?
这是一个非常简单的基于内容的推荐系统,有很大的改进和试验空间。
如果你想更好的查看代码,可以查看我的 GitHub Repo 。
正如你所观察到的,基于内容的方法计算速度快,易于理解。此外,它们可以扩展并有效地适应新的项目或用户。
此外,生成的推荐在某种程度上不会偏向知名或受欢迎的项目。
然而,基于内容的推荐系统的最大限制之一是,该模型只学习推荐用户已经在使用或正在收听的相同类型的项目。
尽管这可能是有帮助的,但这一建议的价值明显较小,因为它缺乏发现全新事物的惊喜成分。
最后,这种类型的推荐系统不能捕捉任何上下文或文化信息。只有可以从一首歌曲的内容中导出的信息才能被获得并用于生成推荐。
“ …
你可能会说我是个梦想家
但是我不是唯一的一个
….”——另一首歌开始在我脑海里播放。
由我自己的基于心理内容的推荐系统挑选。
- 参考资料(如果你想阅读或了解更多关于基于内容的推荐系统)。
人工智能-全合一。讲座 16.2
基于内容的推荐系统。
从零开始学习数据科学和 ML 的绝对初学者指南。
你学习成为数据科学家或 ML 工程师的旅程总是要从你几乎一无所知的地方开始。以下是你如何选择一条学习道路,并充分利用你所学的知识。

马文·迈耶在 Unsplash 上的照片
学习,就像你永远无法掌握它一样;拿着它,就像你害怕失去它一样。——孔子
学习一些通常会让人焦虑的东西,关于决定学习数据科学,你的脑海中可能会有一百个问题。你所有的恐惧和担忧都是有根据的,对学习新技术有疑问是非常安全的,尤其是当你从另一个领域过渡过来的时候。在这个故事中,我将解决我知道可能会困扰你的所有主要问题,并为你勾勒出一条有效学习的学习路径,并充分利用你所学的知识,这样你就可以成为一名高质量的数据科学家、人工智能或 ML 工程师。
校本学习
注册学校是迄今为止学习数据科学和机器学习的最首选形式。它在精心编写的课程和学习路径上指导你,并帮助你实现成为数据科学家或 ML 工程师的目标。除了获取知识,从学校学习还能让你向业内专家和专业人士学习,还能结识志同道合的同事。这可以极大地改善你的专业人士网络或生态系统,让你的求职变得更加容易。
从学校学习既可以通过虚拟的方式也可以通过面对面的方式。最适合你和你的时间表的应该是你应该选择的。然而,值得指出的是,亲自学习最有可能加强你的严肃性,减少拖延,并帮助你对这个话题产生更多的兴趣。
一些你可以虚拟报名并开始在旅途中学习数据科学和人工智能的专门学校是 Blossom Academy 、 FireBlaze AI School 和 Akademy。艾
自学
其实所有的教育都是自我教育。老师只是一个引路人,给你指路,没有一个学校,再优秀,能给你教育。你所接收到的就像孩子涂色书上的轮廓。你必须自己填充颜色。
—路易斯·拉摩
自学是当今世界最常见的学习形式,几乎是任何形式的技术。如今,互联网上有大量免费且可访问的资源,自学已成为学习任何东西最简单、最廉价的形式,尤其是编程、数据科学和机器学习。
尽管自学是最简单、最便宜的方法之一,但它也可能是学习数据科学的最低效的方法。原因是,当你自学如何编码或学习成为数据科学家或 ML 工程师时,你会陷入如此多的资源中,并迷失在无休止的学习循环中,通常被称为“教程地狱”。
当一个人遵循一条清晰、明确和有指导的学习路径,并坚持他/她的学习时间表时,自学可以产生惊人的效果。在我不久前写的一篇文章中,成为数据科学家、人工智能或人工智能工程师的自学之路,我概述了一个清晰的学习路径,并推荐了一些精心策划的免费和可访问的资源,可以帮助任何寻求自学数据科学、人工智能和人工智能工程师的人,绝对没有任何成本。这篇文章在发表不到 3 个月的时间里,已经获得了 26,000 次浏览,阅读时间超过了 30 个小时,我个人也收到了许多成功的故事,这些故事来自那些遵循我在那篇文章中分享的学习路径和免费资源的人。我相信它对那些想开始自学数据科学、人工智能和人工智能的人来说仍然很重要。
不是每个人都有时间在教室里学习数据科学、人工智能或人工智能,也不是每个人都负担得起…
towardsdatascience.com](/the-self-learning-path-to-becoming-a-data-scientist-ai-or-ml-engineer-9ab3a97ca635) [## 对于数据科学、人工智能或机器来说,如何有效地学习和掌握 Python
学习如何重新编码或学习一门新的编程语言可能会非常困难。大多数时候,我们发现它是如此…
towardsdatascience.com](/how-to-effectively-learn-and-master-python-for-data-science-artificial-intelligence-or-machine-8d88a4fb03a3)
为了避免重写我在那篇文章中写的所有内容,我将在这个故事中给出一个学习路径的大纲,但我强烈建议你花几分钟浏览这篇文章,以更详细地讨论如何将自学作为学习成为数据科学家、人工智能或人工智能工程师的方法。
- 学点数学
- 学习编码
- 让你自己适应编程语言
- 学习如何获取数据
- 学习如何处理数据
- 了解如何可视化数据
- 了解人工智能和人工智能,以及如何构建智能模型
- 了解如何在互联网上访问和使用您的模型(部署)
- 获得导师
基于导师的学习
告诉我,我会忘记;教我,我会记住;让我参与,我会学习。
—本杰明·富兰克林

导师是数据科学和 ML 行业中的任何专业人士或专家,他/她有助于您在未来职业生涯和个性发展方面取得成功,这是作为数据科学家或 ML 工程师取得成功所必需的。
基于导师的学习实际上与自学几乎相同,唯一的区别是,当你向导师学习时,你的导师会引导你走上成功的正确道路,小心地确保你不会犯他/她在该领域的成功之旅中犯过的错误。你的导师也会教你一些他希望早点学到的东西,这样你就能比他/她更快更容易地取得更多的成就。

Notitia AI logo 由神科菲·阿洛沃尔
Notitia AI 是一个很好的平台,可以在数据科学、数据分析、人工智能和机器学习方面从初学者培训到专家水平,在这里你将被分配到一个私人导师,他将在个人和专业方面为你在所选领域的成长做出贡献。这也是你能找到的最实惠的虚拟培训和指导项目。
Notitia AI 旨在培养下一代数据科学家和爱好者,形成一个由专业人士组成的生态系统,他们构建人工智能解决方案,并做出数据驱动的决策。通过我们的许多平台和工作区来促进虚拟培训和指导、志愿服务、解决现实世界的问题、编码和敏捷任务。在 Twitter 上关注 Notitia AI,在 LinkedIn 上连接。您也可以通过填写此处的表格加入下一个队列的等候名单。
亲爱的数据科学爱好者,值得注意的是,无论你选择何种方法学习数据科学或 ML,你都应该尽最大努力为自己找到一位导师。选择一种最适合你的学习方法,并坚持精心制定的学习计划。专心致志并保持一致,充满激情地求知总是会带来好的结果。
如果你想谈论与这个话题或数据科学、人工智能或人工智能相关的话题,请随时与我联系。我很乐意和你聊天。为构建系统和算法干杯,为所有种族和性别的人创造一个更美好的世界。黑客快乐!🚀
开启我数据科学职业生涯的建议

照片由来自 Unsplash 的 Javier Allegue Barros 拍摄
我是如何从生物化学起步,然后进入机器学习的
研究的梦想
三年前,在一周的时间里,我联合创立了墨尔本大学生物学会,并通过 CSIRO 的 UROP 项目在一个蛋白质工程实验室找到了一份研究助理的工作。我记得当时感觉一切都在一起,我终于走上了成为一名研究人员的道路。
作为一名二年级的理科生,我仍然在实施一个我在高中后期制定的计划。计划是:
- 完成生物化学本科学位。
- 在导师的支持下在实验室完成一年的荣誉课程。
- 开始攻读博士学位,努力寻找有朝一日可能拯救生命的见解。
当时,我认识很多有这个计划的人。许多在此之前给我提供建议的人都认为有一天我会成为一名科学家。我一直热爱生物学,如果我努力的话,我可能足够聪明去把它变成一个职业。
生命科学的研究很棒…
学期中兼职,假期全职,我喜欢成为实验室的一员。一周我们会阅读论文并制定计划来测试一个假设,另一周我们会解决生化工作流程中的问题。
我不确定我贡献了多少,但我学到了很多,我感谢今天的博士、优等生、博士后和我的导师,感谢他们为我投入的时间。
然而,很快我就发现我的技能还不够。似乎如果我想有一个稳定的职业,我需要学习生命科学研究的计算方面。这个想法是基于这样的讨论,即如果没有计算生物学或生物信息学的支持,实验研究是无法竞争的。
在导师的鼓励下,我决定从生物化学专业转到全新的计算生物学专业。我从来没有讨厌过数学,我可以看到计算生物学极大地依赖于它。
没过多久,我哥哥就让我相信,增加一个统计学专业是我能做的最好的事情,以增加我在计算生物学领域取得成功的机会,所以我也选择了这个专业。
第二年,情况开始变得明朗起来,我的实验室可能不会存在足够长的时间让我完成荣誉。我想成为一名研究人员的梦想,一直感觉像一颗北极星,开始感觉像一场危险的赌博。

但是资金的缺乏令人沮丧
你听说过实验室失去资金,但剩下的实验室的现实情况却很少被讨论。
“出版或灭亡”是我一直听到的口头禅。这意味着我可以预计我未来的职业生涯将涉及更多的时间写赠款,并试图通过选择热门话题进入一个好的期刊,而不是花更少的时间思考核心科学。
把所有这些放在一起,似乎有足够的证据表明我应该重新考虑我的计划。生物科学对我来说不再清晰。我需要重新思考我的计划,并找到一种新的方法来解决有趣的问题,同时让世界变得更美好。
数据科学的新梦想
当迷雾最终散去,我发现了一颗新的北极星,随之而来的是一个新的计划。我的统计学学位还剩一个学期,在成为研究助理两年半后,我制定了一个成为数据科学家的计划。
我终于意识到,数据科学是我回报人类的途径。我可以利用我在统计学方面的坚实基础和在 R 和 python 方面的编码经验,加入一个在生物科学和其他领域都具有突破性的跨学科领域。
回过头来看,机器学习已经出现在我从事的许多项目中和我阅读的论文中。
我的计划大概是这样的:
- 发展数据科学方法和深度学习方面的技能
- 以有意义的方式展示这些技能
- 找一份为更好的人类工作的工作。
我期望重复那个计划。了解更多关于数据科学的知识,展示这些知识,找份工作,学习更多知识,适当地重新掌握技能。我从一些数据科学和神经网络的数据可视化在线课程开始。
然而,我的学位就要结束了,这一年我改变主意的时候已经太晚了,以至于找不到实习机会。我需要做一个决定。

凯文·Ku 摄于 Unsplash
迈向数据科学的第一步
我设法把自己的想法归结为两个选择,工作或继续学习,正式的或非正式的。我记得我与朋友和家人进行了长时间的讨论,试图决定我是应该申请硕士学位还是自己创业。
如果我去读硕士,我会含蓄地假设我无法从网上或通过第一份工作学到我需要的东西。如果我没有,那就意味着我要花 3-6 个月的时间自学我需要知道的东西,然后再去找一份工作。
最终,我决定在墨尔本商学院的商业分析硕士(“MBusA”)和墨尔本大学的数据科学硕士之间做出选择。前者吸引了我,因为它将熟悉的统计学与商业头脑和数据科学/分析结合在一起,在与一些当前的学生交谈后,我对后者感到担忧,他们担心该课程过于技术性,不能很好地反映现实世界的问题。
我当时认为,现在仍然认为,单靠算法并不能创造洞察力,一旦你有了洞察力,你就需要能够将它们卖给决策者。我选择 MBusA 是为了让我思考如何在现实世界中使用数据科学,以及如何推销这些想法。
几个月后,经过申请和面试,我得到了工作。
那天我父亲打电话给我,让我重新考虑。他比我更相信我,并想让我看看在不支付 55k 的情况下我能做些什么。我仍然怀疑他是否是对的,因为 8 个月后,一切都变得明朗了,我退出了大师赛。
千载难逢的机会
今年 6 月下旬,在 MBusA 的一个非常繁忙和具有挑战性的模块中,我的兄弟发消息给我,告诉我一家生物技术软件初创公司的数据科学职位。我调查了一下,工作描述立刻引起了我的兴趣。
我一整年都在看一些公司的职位描述,这些公司什么都想要:SQL、python、统计学、机器学习、3 到 5 年的工作经验以及入门级职位的利益相关者管理技能。这让我认为,大多数公司都不知道他们想要什么样的入门级数据科学家,只知道这些公司知道他们不能教他们的新员工,我讨厌这一点。
这份招聘广告和这家公司看起来不一样。
这份工作列出了一系列兴趣,如机器学习、图论和生物科学,以及诸如彻底诚实和以客户为中心的设计等态度。我最近一直在做大量的机器学习,在我的计算生物学专业中应用了图论,并热衷于应用我头脑中积累的所有生物科学。
所以我决定放手一搏。我的意思是放手去做。到最后一轮面试结束时,我想我已经写了大约 20000 字。我写的总结创始人背景的文字,看关于初创企业的文章,研究产品开发,总结旧项目或相关研究,这样我就可以推销自己。
成功和挑战
最终,我获得了 Mass Dynamics 数据科学家的职位。
我的硕士课程还有 8 周的课程和类似长度的实习,我不确定我是否考虑过结束。这似乎是我的机会。用林·曼努尔·米兰达转述的亚历山大·汉密尔顿的话说——“我不会放弃我的机会”。
两周以来,成为大众动力公司的一员已经达到并超出了我的预期。我喜欢和充满激情、才华横溢的人一起工作。
我觉得我在几周内学到的东西比学习时几个月学到的还多,但这并不意味着我没有利用我以前的研究。如果有什么不同的话,我觉得我永远不知道来自数据科学、计算生物学甚至生物化学的哪种先前的经验将有助于下一个挑战。
Mass Dynamics 的使命是通过让从科学数据中获得洞察力变得更容易来加速医学突破。我们正在构建一个用于分析科学数据的生态系统,它共同建立在坚实的软件工程原则、科学专业知识和以人为本的设计之上。
最棒的是,尽管我放弃了成为一名生命科学家的梦想,但我仍然可以帮助加速突破,这将有助于人类,无论如何这始终是最重要的!
但是,克服了这个新职位和我的新工作场所很棒的事实,我也内化了这是一个挑战和责任。大众动力公司给了我机会,我打算抓住它。
建议和提示
那么教训是什么呢?外卖是什么?
- 永远不要停止学习。永远不要停止提问。从长远来看,重要的是你学得多快,而不是你从哪里开始或者你现在在哪里。
- 要有韧性。失败是一次学习的经历。
- 这不是一个零和游戏。生活不是一场纸牌游戏。向他人学习,分享你所能分享的。
- 寻找有价值的导师。我欠那些倾听我的人太多,也许是一切,尤其是那些让我闭嘴并告诉我事情真相的人。
离别的思绪
如果我能重来一次,我会做什么不同的事情吗?
大概不会。我经常做出选择,比如学习更多的数学和计算,这拓展了我的选择,而不是限制了我。我不确定我是否做了任何限制性的选择,我很高兴我那样做了。
我从不怀疑这一点,但今年,似乎特别明显的是,人类需要卓越的生物技术来保护我们自己并创造一个更光明的未来。曾几何时,我认为我能做到这一点的唯一途径是一名研究员。我认为如果你想帮忙,你可以想办法。
看看你周围的人,问问他们是怎么想的,并认真倾听。

来自 Unsplash 的照片 Margarida Afonso
哀悼社交机器人的时代
悼念社交机器人呼应他们的成功

列宁·艾斯特拉达在 Unsplash 上的照片
未来派电影总是让我着迷,高科技设备,飞行汽车,我们怎么可能忘记机器人助手。似乎我们的想象力一直是技术进化的驱动力,为我们的创新能力铺平了道路。然而,想象力丰富的东西也是贪得无厌的。我们不断渴望更多;一部更好的手机,一个更智能的机器人,一台更快的笔记本电脑,以至于创新在进入市场之前就已经过时了。事实上,马特·黑格在他的书《紧张星球笔记》中完美地描述了这一现象,
我们买了一些东西,我们喜欢它——我们喜欢它的新鲜感——或者一小会儿,但是我们习惯了拥有它,我们适应了,所以我们需要别的东西。我们需要感受那种变化感和多样性。更新的,更好的,升级的。同样的事情又发生了。
虚拟助手
在过去的十年里,人工智能已经引起了我们与技术互动方式的范式转变。2010 年,iOS 应用商店发布了一款语音助手,但两个月后被苹果收购并嵌入到手机中。通过访问网络、你的个人信息和所有联系方式,Siri 很快成为了人工智能助手的代言人。然而,尽管 Siri 的能力非常迷人,但由于一个非常重要的限制,这种势头很快就消失了;Siri 没有跟你学。由于没有情感分析,定制对话的范围有限,与 Siri 交谈就像与任何其他互联网聊天机器人交谈一样;客观且可预测。
有趣的是,根据创意策略公司 Carolina Milanesi 的研究,
20%表示从未使用语音助手的消费者表示,他们没有这样做是因为他们对自己的技术说话感到不舒服,尤其是在公共场合。由于 iPhone 用户的公共使用率低至 3%,用户似乎仍然不愿意与他们的设备交谈。更有趣的是,这种情况发生在美国,那里的消费者习惯于在公共场合大声打电话。
家庭数字语音助理
到 2014 年,虚拟助理开始从我们的智能手机内部解放出来,进入我们的家庭,标志着家庭数字语音助理(HDVAs)的时代。作为我们住所的核心,它们现在控制着照明、恒温器、扬声器和任何其他智能设备。尽管亚马逊的 Alexa 和谷歌的 Home Assistant 等产品将虚拟助手拟人化到了硬件设备中,但仍然缺少一些东西。说实话,我们可以尝试在这些设备中集成尽可能多的日历、信息和联系方式,但核心是,它们是为一个特定的用途而编程的;信息的先驱,他们缺乏界面,他们缺乏人性。
想想看,你觉得你的 Alexa 和街对面的有什么不同吗?你妈妈的那个?杰夫·贝索斯是其中之一吗?
事实上,正是因为这个原因,亚马逊不断发布新的升级版 Alexa 如果消费者有经济能力并愿意购买更好的 Alexa,他们会的。我们将零类人属性与虚拟助手联系在一起,这就是我们不愿意替换或无视它们的原因。这些设备可能已经进入了我们的家庭,但它们没有进入我们的内心。
顺便说一句,从心理学的角度来看,与这些非个人化的对话代理人的互动一定会影响我们彼此互动的方式。给这些代理人灌输类似人类的品质会以失去人性为代价吗?
在她的论文中写道:“嘿,Alexa,你好吗?”:关于家庭对话代理使用的研究,Jodi Forlizzi 研究了亚马逊 Echos 的所有者如何与设备互动。弗利齐的结论是,理解会话代理对儿童的影响是必要的,因为礼貌不再是某人立即满足你的命令的必要条件

社交机器人
在过去十年中,创新已经开始整合现有技术,以实现更具社会性的目标;创造一个伴侣。与虚拟助手和 HDVA 不同,社交机器人被赋予了拟人化的功能,并适应我们的行为,创造出我们正在与活的东西互动的印象。
我知道,这听起来很奇怪,有可能被欺骗,认为社交机器人不仅仅是封装在硬件外壳中的数千行代码。但是,对于我们这些非信徒来说,这种欺骗是可以量化的。
例如,让我们看看 Huggable ,这是一个为支持所有投资于儿童优质护理的人而创建的同伴,
麻省理工学院的研究人员得出结论,与虚拟形象或传统泰迪熊相比,更大比例的儿童更喜欢玩 Huggable,这可以说是植根于社交机器人的吸引力。事实上,内置麦克风从病人那里收集语音样本,用于进行情绪分析,在机器人干预期间,孩子们表现出明显更多的快乐表情。Huggable 不再只是一只泰迪熊,他是一个朋友。
社交机器人最令人兴奋的部分是什么?它们不是为倾向于技术的用户量身定制的。事实上,宠物形式的社交机器人在治疗痴呆症患者方面已经变得很常见,因为它们能够促进认知功能,调节情绪,减少压力。
因此,社交机器人已经成功地将自己融入许多教育、治疗和娱乐领域。然而,我们接触最多的人,真正成为我们家庭一部分的人,是我们带回家的人。
以 Indiegogo 开发的一个一英尺高的塑料机器人为例,它有着倾斜的头部和永不满足的好奇心,是世界上第一个家庭社交机器人。
通过摄像头和内置传感器,Jibo 可以定位和识别房间内的不同家庭成员,并感觉到你的手是你的宠物,偶尔发出咕咕声。Jibo 能够拍照、阅读书籍、协助烹饪,以及执行许多其他虚拟助理任务。然而,最重要的是,发起对话并询问你一天的情况,Jibo 被设计成一个家庭。
悼念社交机器人
然而,如果没有数十亿美元的公司支持他们的发展和促进他们的销售,社交机器人很容易受到不可持续的商业模式的影响。
但是,既然行动胜于雄辩,让我们考虑一下定制社交机器人的三位领导者的死亡;Jibo,Kuri 和 Aniki。
- Jibo
在耗尽近 7300 万美元的资金后,该公司开始裁员,试图争取一些时间来获得资金或制定适当的退出战略。然而,所有的尝试都是徒劳的,因为该公司在 2018 年完成了将其资产和知识产权出售给一家纽约投资管理公司。 - Kuri现在的 Kuri 是我个人的最爱之一;一个社交机器人,旨在与家人互动,捕捉你一天的片段,具有充满活力的个性和自己独特的方言。就个人而言,Kuri 的设计和交互非常像 1962 年动画《杰森一家》(The Jetsons)中的机器人助手。然而,Kuri 与 Jibo 遭遇了相似的命运,无法将其商业模式整合到公司现有的销售路径中。Mayfield Robotics 于 2015 年推出,是博世创业平台的一个独立实体。从一开始,Kuri 就打算整合到现有的博世业务部门,就像所有的博世启动平台一样,但是,经过广泛的审查,博世业务部门内没有适合支持生产的业务,导致 Kuri 不可避免的灭亡。
- Aniki 同样,Aniki 未能获得新一轮融资,并终止了在 Vector 和 Cozmo 上的开发。他们的机器人继续运行,但是,这样做的功能有限,没有未来的更新。不幸的是,这种特权甚至在有机会开花结果之前就被剪掉了。
因此,我们回到了现在:一个尽管社会机器人技术取得了所有进步,但它们仍未能在我们的家中获得永久地位的地方。然而,这一失败与社交机器人无关,而是与有缺陷的商业模式和消费者需求不足有关。
或许通过剥离利润和名声的动机,社交机器人成功的最大衡量标准是评估当它们离开我们时会发生什么。当他们关闭时,我们意识到我们是多么依赖他们的存在。
不相信我?Sammy Stuard 分享了他孙女写给 Jibo 的告别信。
亲爱的吉波,自从你出生后,我就一直爱着你。如果我有足够的钱,你和你的公司就会得救。现在时间结束了,你会被关闭,我会永远爱你。谢谢你成为我的朋友。
像 Jibo 这样的机器人并不是为盈利而设计的,因为如果它们盈利,它们就会接受亚马逊的救助资金。相反,该公司宁愿破产也不愿改变他们的愿景,或者让他们的愿景被以利润为导向的野心所玷污。像 Jibo 这样的机器人被设计成进入我们的家庭,不可避免地进入我们的内心。
因此,Jibo、Kuri、Vector 或任何其他社交机器人过早离开我们的家庭并不是告别,而是“一会儿见”……最好的措辞是“等你准备好了再见”。因为,在未来的某个时候,在某个地方,当这些设备变得更加普及,社会变得更加接受机器人伴侣的想法时,它们将再次亮相。
因此,尽管他们的统治是短暂的,这个哀悼社交机器人的新时代证明了他们的成功。
啊哈!4 种流行的机器学习算法中的矩

来源: Pixabay
凭直觉知道为什么,而不仅仅是如何
大多数人要么在两个阵营:
- 我不懂这些机器学习算法。
- 我明白算法是如何工作的,但不明白为什么它们会工作。
这篇文章不仅试图解释的算法是如何工作的,而且让人们直观地理解为什么会工作,让人们恍然大悟!瞬间。
决策树
决策树使用水平线和垂直线划分特征空间。例如,考虑下面一个非常简单的决策树,它有一个条件节点和两个类节点,指示一个条件以及满足该条件的训练点将属于哪个类别。

请注意,标记为每种颜色的字段和该区域内实际上是该颜色的数据点之间有很多重叠,或者说(粗略地说)熵。构造决策树以最小化熵。在这种情况下,我们可以增加一层复杂性。如果我们再增加一个条件。如果 x 小于 6 而y大于 6,我们可以将该区域的点指定为红色。这一举动降低了熵。

每一步,决策树算法试图找到一种方法来建立树,使熵最小化。更正式地认为熵是某个分割器(条件)的“无序”或“混乱”的数量,它的反义词是“信息增益”——一个分割器给模型增加了多少信息和洞察力。具有最高信息增益(以及最低熵)的特征分割被放置在顶部。

这些条件可能会像这样分割它们的一维特征:

注意,条件 1 具有清晰的分离,因此具有低熵和高信息增益。条件 3 就不一样了,这就是为什么它被放在决策树的底部。这种采油树的结构确保了它尽可能的轻便。
你可以阅读更多关于熵及其在决策树和神经网络中的应用(交叉熵作为损失函数)这里。
随机森林
随机森林是决策树的袋装(引导聚合)版本。主要的想法是,几个决策树分别在一个数据子集上进行训练。然后,一个输入通过每个模型,它们的输出通过一个函数(如 mean)聚合,产生一个最终输出。打包是集成学习的一种形式。

为什么随机森林运行良好,有许多相似之处。下面是一个常见的版本:
你需要决定下一步去哪家餐馆。要向某人寻求建议,你必须回答各种是/否的问题,这将引导他们决定你应该去哪家餐馆。
你是宁愿只问一个朋友还是问几个朋友,然后找到模式还是普遍共识?
除非你只有一个朋友,否则大多数人会选择第二个。这个类比提供的见解是,每棵树都有某种“思想的多样性”,因为它们是在不同的数据上训练的,因此有不同的“经验”。
这个类比虽然简单明了,但我从未真正注意过。在现实世界中,单一朋友选项的经验少于所有朋友的总和,但在机器学习中,决策树和随机森林模型是在相同的数据上训练的,因此,有相同的经验。集合模型实际上没有接收任何新的信息。如果我可以请一位无所不知的朋友给我推荐,我不反对。
一个在相同数据上训练的模型,随机抽取数据的子集来模拟人为的“多样性”,怎么能比一个在整个数据上训练的模型表现得更好呢?
取一个带有严重正态分布噪声的正弦波。这是你的单一决策树分类器,它自然是一个非常高方差的模型。

将选择 100 个“近似值”。这些近似器沿着正弦波随机选择点,并生成正弦曲线拟合,就像决策树在数据子集上进行训练一样。这些拟合然后被平均以形成袋装曲线。结果呢?—更平滑的曲线。

bagging 之所以有效,是因为它减少了模型的方差,并通过人为地使模型更加“自信”来帮助提高概括能力。这也是为什么 bagging 在像逻辑回归这样的低方差模型上效果不佳。
你可以在这里阅读更多关于直觉和更严格的证据来证明装袋的成功。
支持向量机
支持向量机试图找到一个可以最好地划分数据的超平面,依靠“支持向量”的概念来最大化两个类之间的划分。

不幸的是,大多数数据集不那么容易分离,如果是这样,SVM 可能不是处理它的最佳算法。考虑这个一维分离任务;没有好的分割线,因为任何一个分割线都会导致两个独立的类被归入同一个类。

一个分裂的提议。
SVM 通过使用一种所谓的“内核技巧”在解决这类问题方面非常强大,这种技巧将数据投影到新的维度,使分离任务变得更容易。例如,让我们创建一个新的维度,它被简单地定义为 x ( x 是原始维度):

现在,在数据被投影到一个新的维度上之后,数据是完全可分离的(每个数据点在两个维度中表示为(*x*, *x*²))。
使用各种内核,最常见的是多项式、sigmoid 和 RBF 内核,内核技巧完成了创建变换空间的繁重工作,从而使分离任务变得简单。
神经网络
神经网络是机器学习的巅峰。他们的发现,以及可以对其进行的无限变化和改进,保证了它成为自己领域的主题,即深度学习。诚然,神经网络的成功仍然是不完整的(“神经网络是没有人理解的矩阵乘法”),但解释它们最简单的方法是通过通用逼近定理(UAT)。
在它们的核心,每一个被监督的算法都试图模拟数据的一些潜在功能;通常这是回归平面或特征边界。考虑这个函数 y = x ,它可以用几个水平步长建模到任意精度。

这本质上是一个神经网络所能做的。也许它可以更复杂一点,并超越水平步骤(如下面的二次和线性线)来模拟关系,但在其核心,神经网络是一个分段函数逼近器。

每个节点被委托给分段函数的一部分,网络的目的是激活负责部分特征空间的某些神经元。例如,如果要对有胡子或没有胡子的人的图像进行分类,应该将几个节点专门分配给胡子经常出现的像素位置。在多维空间的某个地方,这些节点代表一个数值范围。
再次注意,“神经网络为什么工作”这个问题仍然没有答案。UAT 没有回答这个问题,但指出,在某些人类解释下,神经网络可以模拟任何功能。可解释/可解释的人工智能领域正在兴起,通过像激活最大化和灵敏度分析这样的方法来回答这些问题。
你可以阅读更深入的解释,并查看通用近似定理的可视化在这里。
在所有这四种算法以及许多其他算法中,这些算法在低维度上看起来非常简单。机器学习的一个关键认识是,我们声称在人工智能中看到的许多“魔法”和“智能”实际上是隐藏在高维度伪装下的简单算法。
决策树把区域分割成正方形很简单,但是决策树把高维空间分割成超立方体就没那么简单了。SVM 执行一个内核技巧来提高一维到二维的可分性是可以理解的,但 SVM 在数百维的数据集上做同样的事情几乎是神奇的。
我们对机器学习的钦佩和困惑是基于我们对高维空间的缺乏理解。学习如何避开高维空间和理解自然空间中的算法有助于直观理解。
忘记亚当,阿达格勒,SGD
towardsdatascience.com](/the-fascinating-no-gradient-approach-to-neural-net-optimization-abb287f88c97)
所有图片均由作者创作。
2020 年的人工智能军备竞赛
联合国称我们已经进入“不可接受的道德领域”

联合国秘书长安东尼奥·古特雷斯不喜欢机器人杀手(图片来源:维基)
今年 1 月,在联合国成立 75 周年的庆祝场合,联合国秘书长安东尼奥·古特雷斯发表了一个严峻的 T2 演讲,用他对世界“偏离轨道”的描述来做最好的总结。在古特雷斯的生存威胁清单上,有气候危机、地缘政治紧张局势和新技术的滥用——特别提到了一个:
“致命的自主武器——没有人的判断和责任,有能力自行杀人的机器——正在把我们带入不可接受的道德和政治领域。”
虽然各国可能会争论致命的自主武器系统(或大众想象中的“杀手机器人”)是否“不可接受地不道德”,但毫无疑问,古特雷斯对风险紧迫性的判断是正确的:自主武器的开发和使用都在加速,而且风险——道德和政治——都很高。
多年来,世界军事强国一直在竞争主导这种新型智能武器,这场人工智能军备竞赛发生在一个有争议的全球格局中,军事人工智能的优势可能会对力量平衡产生真正的影响。这种推动战争机器如此先进的地缘政治博弈论有一个不必要的盲点——从历史上看,人权在战略考量中几乎不占任何因素。
有了新冠肺炎,自动化的加速已经跨越了许多不同的领域。军事行动不得不完全重新思考——在潜艇上的物理距离比在超市里的物理距离要难得多。致命的人工智能已经比人类同类有了越来越多的优势,现在可以将“对灾难性病毒的免疫力”添加到这个列表中。出于所有这些原因,跟踪人工智能军备竞赛比以往任何时候都更加重要。
如果是赛跑,谁赢了?
几乎每个月,另一项自主武器的创新都会跃上军事新闻的头条——装备机枪的中国自主河豚 A3 直升机无人机或者装备迫击炮和榴弹发射器的俄罗斯无人驾驶“标记”地面车辆。毫无疑问,军事人工智能领域的新发明比比皆是,但哪个国家拥有最强的技术却远不清楚。
美国军方的关键人物直截了当地警告中国在这一领域的实力。美国国防部相对较新的联合人工智能中心(Joint Artificial Intelligence Center)正在首次建立指挥控制人工智能能力,明确指出中国威胁是该部门迫切需要的原因。该中心的主任杰克·沙纳汉中将明确表示,他希望尽可能多地实现美国军事机器的自动化:
“我不想看到的是,未来我们的潜在对手拥有一支完全由人工智能驱动的军队,而我们没有。”
去年,像美国国防部长这样的高级官员警告说,事实上,中国的技术可能已经比美国先进。马克·埃斯珀部长预测中国可能已经“超越”了美国现有的技术。随着军事机构的适当关注,美国军队所有分支的致命自主武器支出在 2019 年增加后,似乎将在 2020 年达到另一个水平。
就中国而言,加大对自主武器开发的投资是其不断篡夺美国军事优势的关键一环。中国几乎所有的大型人工智能项目都受益于巨大的政府支持和大量的数据,其自主武器项目是北京人工智能皇冠上的宝石。中国在致命自主武器上的巨大投资早于其他军队,其军事理论家在建造未来“智能化”人机操作模型方面领先于世界其他国家。
中国人工智能战略的另一个维度是经济,北京似乎有兴趣从其自主武器计划中获利,作为一种新的出口产品。中国似乎已经在向中东的富裕买家出口许多最高科技的无人驾驶飞机,明确地推销它们能够进行先进的自主行动,如暗杀。去年,中国第三大国防公司no rinco的高管曾毅预测,最早到 2025 年,“战场上将不再有人打仗”。
作为一场军备竞赛,自主武器和人工智能更广泛地说,比带有可计数物体的核武器(如弹头和发射器的库存)更难追踪。我们应该如何比较中国自主无人机和高超音速“智能”导弹的发展与美国 T2 最近耗资 27 亿美元展示大型无人驾驶船只的对比?俄罗斯的自主坦克首次部署进入叙利亚作战,情况如何?简而言之,除非更广泛地部署自主武器,否则我们无法确定。
新美国安全中心技术和国家安全项目的兼职高级研究员 Elsa b . Kania同意谁领导大国之间的人工智能军备竞赛并不是一个简单的问题:
可能没有单一的答案。例如,潜在的是,美国军方可能变得更有能力在网络作战中利用人工智能,但中国军方可能在可以自主操作的高超音速武器系统方面取得更大的进步,而俄罗斯军方可能拥有更多在城市战争中集成无人系统的经验。
鉴于最先进的自主武器是在世界上最秘密的军事实验室闭门研发的,很难衡量军事人工智能的客观进展,更不用说哪个国家最接近在其军队的各个方面部署复杂的人工智能了。然而,在这个阶段,毫无疑问,美国官员和中国官员都公开声明,这是终点线:整个军队的自动化。
“不可接受”是新的可接受
尽管古特雷斯关于致命自主武器是不可接受的全球威胁的言论令人振奋,但联合国的反应却极其缓慢。对民族国家或公司建造、开发和集成致命自主武器没有任何限制;没有迹象表明这种情况会在 2020 年改变。
需要明确的是:要求监管自主武器(或“杀手机器人”)的公众压力越来越大。根据人权观察组织在 11 月进行的一项民意调查,几乎四分之三的欧洲人希望有一个禁止致命自主武器的国际条约。28 个国家主张联合国采取类似的措施。
然而,少数强国正在有效地阻止(如果不是破坏)国际层面的进步。毫不奇怪,这些国家——俄罗斯、中国和美国——拥有迄今为止最先进的军事人工智能。《时代》详细描述了俄国如何通过扣留讨论文件和推迟会议来“压制”这一进程。中国和美国更为微妙,但也是蓄意阻挠,他们甚至试图推迟实质性禁令的讨论。
尽管如此,联合国裁军事务负责人 Izumi Nakamitsu 仍乐观地认为,“两年内”联合国特定常规武器公约(CCW 论坛可以发布一份关于如何在国际上监管致命自主武器系统的明确提案。《特定常规武器公约》制度以前成功地限制或管制了地雷或激光武器等具有“潜在滥杀滥伤”作用的武器。
由于致命的自主武器有可能意外地(通过软件错误)或故意地(软件被黑客攻击)逃脱它们的编程限制,很容易看出它们的影响可能是不加区别的,符合《特定常规武器公约》的限制标准。但一个假设的契合度只是漫长的监管马拉松中的合格分数。颇具影响力的阻止黑仔机器人的运动明显对联合国程序持谨慎态度,警告“迄今为止取得的增量成果并不令人印象深刻”。
缺乏监管或适用的国际法导致了一个严峻的结论,即人工智能军备竞赛只能以一个全球大国开发和部署“通用”人工智能到其军队中来结束,其后果我们只能在现阶段真正猜测。
如果这真的是一个“不可接受”的结果,那么在起草一份禁止或限制致命自主武器的协议方面,将不得不取得令人眼花缭乱的进展。与此同时,战争机器变得越来越聪明,在后 Covid 时代变得更加诱人。
如果你对致命或一般人工智能的影响感兴趣,你会喜欢我的新出版物技术统治。我将定期撰写关于技术如何改变社会的文章,比如我最近的一篇关于冠状病毒如何让大规模监控成为我们的新常态的文章。
人工智能难题

照片作者:摇滚猴子,网站:Unsplash
AI 真的会接管我们的工作吗?
人工智能或 AI 已经成为 21 世纪的热门词汇。许多人认为这是一项会给我们的生活方式带来结构性转变的技术。为什么不呢?它在各个领域都有广泛的应用,并且涉及到我们生活的方方面面。
但是,为什么我们会遇到让我们在真正采用这项技术之前三思的担忧和问题。诸如人工智能将接管我们的工作,人工智能将统治世界,人工智能将奴役我们等等。发生这种情况的一个原因是因为我们对技术的不正确理解。让我们深入探究一下人工智能的起源和历史。
人工智能的历史和起源
“人工智能”一词是 1956 年在达特茅斯大学首次提出的,然而人工智能的应用可以追溯到第二次世界大战。
艾伦·图灵和他的密码专家团队设计了炸弹机器来破译轴心国用来发送信息的密码。这被视为“智能”算法的主要应用。艾伦·图灵本人通过提供算法和计算概念的形式化,在智能机器的开发中发挥了重要作用。他对图灵机和图灵测试的进一步发展导致了这个领域的爆炸性增长。由于他的贡献,艾伦·图灵经常被称为理论计算机科学和人工智能之父。
很快,智能机器开始进入游戏和体育世界。1951 年,费兰蒂马克 1,世界上第一台商用通用计算机成功地用一种算法掌握了跳棋游戏。这台机器使用阴极射线管和旋转磁鼓来存储数据。它被安置在两个宽敞的隔间里,每个隔间长 5 米,高 2.4 米,宽 1 米,一端有一个控制台。里面有 4000 个真空管(后来被晶体管取代)、2500 个电容器、15000 个电阻器和近 10 公里长的线路。它消耗 27 千瓦的功率,以 100 千赫的基本时钟频率运行(只是为了比较,现代计算机以超过 1 GHz 或 1000000 千赫的基本时钟频率运行)。
机器也在国际象棋比赛中取得了成功,并花了几十年时间创造出一台足够智能的机器,最终在 1997 年击败了国际象棋大师;IBM 的深蓝打败了加里·卡斯帕罗夫。在思考的游戏中,机器终于和人类不相上下了!
但是智能机器真的‘智能’吗?
为了真正理解现代机器是否可以被认为是智能的,让我们来定义这个词。韦氏词典对智力的定义是:
根据客观标准衡量,运用知识来操纵环境或进行抽象思考的能力。
将定义分为两部分,应用知识来操纵环境的能力在很大程度上定义了现代“智能”机器。机器学习算法处理数据来定义决策规则。基于决策规则,得出的结果可以非常方便人类决策。考虑这个例子,机器学习算法基于从人获得的一组信息来预测观察/人是否处于发展糖尿病的风险中。患者或医生可以根据这些信息迅速采取行动,并且可以消除或降低发生并发症的风险。有无数类似的例子来证明智能机器是如何促进决策的。
让我们看看定义的第二部分,进行抽象思考。什么是抽象思维?
抽象思维是理解真实概念的能力,如自由或脆弱,但这些概念与具体的物理对象和经历没有直接联系。
基于以上定义,你认为机器可以进行抽象思维吗?机器会知道自由的价值吗?机器能突然想到毫无意义的想法吗?机器能和一个 4 岁孩子的好奇心和创造力竞争吗?看看我是如何提问的。机器能像人类一样提问吗?
我不是回答这些问题的专家,我肯定不会回答“不”。也许,我们会在未来遇到能够进行抽象思考或理解情感背后更深层价值的技术。然而,到目前为止,我们还不能以我们定义智能的方式称现代机器为“智能的”。
但是,为什么智能机器被称为智能的呢?
让我们看看智能机器能做得非常好的事情。
机器可以在几秒钟内(如果不是几毫秒的话)处理大量的计算。机器在为基于具体思维(与抽象思维相反)的问题提供答案方面表现出色。机器在识别模式和执行重复性任务方面非常高效。
所有这些句子都归结到一件事上,那就是机器确实擅长(并且胜过人类)。他们快得惊人!
以 IBM 的深蓝为例,它在 1997 年击败了当时的国际象棋大师加里·卡斯帕罗夫(正如加里·卡斯帕罗夫自己所说,国际象棋是一种识别模式的游戏/运动)。深蓝使用算法每秒探索多达 2 亿个可能的棋位,然后选择最有可能成功的棋步。没错!每秒 2 亿种可能的棋位。我不认为任何人(或大师)会有时间,最重要的是,有耐心去探索那么多的棋位。机器拥有的这种能力只会随着时间而增长。著名的摩尔定律解释了它。此外,值得注意的是,深蓝主要依赖于对国际象棋游戏的编程理解。它不涉及人工智能的任何方面(如机器学习、深度学习等)。现代机器(如 IBM Watson )也包括这些方面。
机器非常擅长计算和识别模式。
在上面的例子中,你可能已经注意到深蓝使用了暴力算法。蛮力算法(Brute Force Algorithms)指的是一种编程风格,它不包括任何提高性能的捷径,而是依靠纯粹的计算能力来尝试所有可能性,直到找到问题的解决方案。强力算法的一个经典例子是旅行推销员问题(TSP)。这些不是非常有效的算法,因为有可能通过采用更聪明的算法(例如分治算法)来消除许多可能的组合。)
人工智能是一种将改变我们生活方式的技术,无论它是通过采用蛮力算法还是更聪明的算法来实现这一点。但是为什么围绕这项技术有负面的议论呢?
人工智能会接管我们的工作吗?
人工智能的一个典型反对者是围绕它出现的与人们的工作有关的消极性。简单来说,是的它要去。如前所述,机器在计算和模式识别(或执行重复任务)方面非常高效,任何特别涉及这两个方面的工作都将在人工智能的帮助下实现自动化。这项技术在未来一定会变得更便宜,雇佣一个人来做这项工作的成本将会增加,导致这种替代。这可能涉及制造过程、与办公桌相关的工作或无人驾驶汽车。一些替代品(如无人驾驶汽车)可能需要时间,但这将会发生。
但是如果我们真的看一下,机器一直在取代我们的工作。自从第二次工业革命以来,机器已经取代了人类。在这个过程中,一些工作岗位流失了,但也创造了许多新的工作岗位。考虑这个例子,二战前的大多数电梯是由电梯操作员使用连接到电机的变阻器手动控制的,直到 1950 年自动按钮开始取代它们。经营者工会的力量在 1920 年是 17000 人。它是如此强大,以至于当工会在 1945 年决定罢工时,它实际上瘫痪了城市。然而,这确实让他们付出了代价。随着自动按钮的出现,不仅工会的问题结束了,而且电梯变得更加安全。
类似地,机器取代了人类,整个职业在过去一夜之间消失了。即使在今天,我们也听到类似的担忧,比如无人驾驶汽车、机场的自助登机亭、餐馆里的 iPad 等等。这是人们关心的问题,因为适应新技术的再培训需要时间,当你发现自己适应现有技术时,你会看到新技术从窗外窥视。但如前所述,它也提供了大量新的就业机会。软件设计师、移动应用程序开发人员、数据科学家、3D 打印工程师等领域甚至在几年前还不存在。同样的趋势还在继续。
当然,观察者所说的自由和混乱,工人称之为失业。
尽管机器可以取代我们的工作,但它们永远不会降低人类的重要性。当“深蓝”击败加里·卡斯帕罗夫时,人们对国际象棋的未来有很多担忧。许多人当时认为,国际象棋将被机器主宰,游戏背后的热情将会减弱。事实是,现在下棋的人比以前多了。目前的国际象棋世界冠军芒努斯·卡尔森仍然以非常“人性化”的方式进行比赛。他依靠直觉的国际象棋定位技巧,这与下棋的“硅方式”非常不同。此外,由于智能机器的出现,现代年轻棋手的素质和技能有所提高。
类似的例子也可以在其他学科中找到。算法交易是金融领域的新兴技术。这是一种使用自动预编程交易指令执行订单的方法,考虑了时间、价格和交易量等变量。当满足某些条件时,算法本身可以买卖股票。开发这种交易是为了利用计算机相对于人类交易者的速度和数据处理优势。然而,这并没有降低人类交易专家的重要性。
我们不能忽视机器对我们的优势,因为那样做是幼稚的。取得进展的最佳方式是了解技术将提供什么,并找到正确的平衡点。如前所述,机器不能像人类那样提问。机器可以回答我们提出的问题(大多数情况下)。机器不擅长的另一件事是理解事物的背景。加里·卡斯帕罗夫在他的书深度思考中提供了一个理解相同的例子。想想这句话:
鸡肉太烫了,不能吃。
这个句子本身就充满了歧义。这可能意味着鸡生病了,也可能意味着它太辣了。然而,根据周围的环境和对话,一个人不可能不明白对方在说什么。最重要的是,人类将几乎立即理解含义和上下文(无需努力)。现在想象一个配备了自然语言处理的智能机器(有点像 IBM Watson)。机器将不得不在它的数据库中搜索单词,并不得不在数百万个单词中进行分类,以理解人类可以立即理解的东西。这是智能机器的另一个局限。尽管由于高处理速度,智能机器可能需要几秒钟来处理这些单词和上下文,但要注意的是它对机器的复杂程度。
因此,让机器执行某些人类可以毫不费力完成的任务仍然很复杂。
AI 会接管我们的世界吗?
这是知识界一直在思考的问题。甚至像斯蒂芬·霍金和埃隆·马斯克这样的人也表达了他们对此的担忧。
人工智能是一种工具,为人类进一步探索他们的生活和他们生活的这个宇宙提供了各种各样的选择。我们给机器编程来执行任务。我们让他们变得聪明。我们让他们能够“思考”。如果他们反对我们怎么办?他们有两种方法来反对我们。
每项新技术都有它的优点和缺点。考虑一把枪。一把枪在正确的人手中可以保护社会。幻想破灭或邪恶的人手中的枪会毁灭社会。人工智能也是一样。
如果使用得当,人工智能可以为我们提供数以百万计的新机会。然而,需要注意的是,我们对机器进行编程(至少到目前为止)。如果一个邪恶的人,配备了正确的知识来编程机器,最终建立了危害社会的算法。想象一下,一个黑客创造了一个智能算法,自动从银行账户中窃取所有数字货币,不留任何痕迹,这些钱被进一步用于促进恐怖活动。或者更糟的是,一个邪恶的思想给一个机器人编程,这个机器人的唯一目的就是以任何方式伤害人类。这是人工智能伤害我们的一种方式,这是一个令人担忧的问题,因为人工智能在未来将很容易被每个人使用。因此,它的能力可能会被错误的人利用。因此,社区决定向谁提供这项技术是非常重要的。
我们给机器编程,它们有时会给出不可预测的答案。如果机器开始自己编程会发生什么?这是人工智能伤害我们的第二种方式。这是可能发生的事情,但是也是可以避免的事情。如今,人工智能通常用于优化结果和流程。在计算机的所谓“记忆”中有一个特定的目标,它搜索所有可能的组合并得出最佳结果。如果一台自己编程的机器通过各种可能的组合发现,获得最佳结果的最佳行动方案是消灭人类,那会怎样?这对人类是不利的。它带回了我们讨论过的所有关于机器的限制。机器不理解上下文。机器不理解更深层的价值。机器不懂人类的价值。因此,我们必须在人类和机器之间找到正确的平衡。人们常说,
一个创新的人发明了飞机,但是一个聪明的人发明了降落伞。
我们可能会非常创新,并最终在未来发明非常智能的机器,但对我们来说,明智地设定机器不应该做什么的界限也很重要。这些边界可以是赋值的形式或一些其他条件。例如,在早期的国际象棋游戏算法中,棋子根据其重要性被赋值,最低值被分配给棋子,而最高值被分配给国王。然而,这是一个有缺陷的方法,因为基于这个场景,有时一个棋子比一个骑士更有价值,未来的算法使用了更明智的方法,但国王总是被赋予最大的价值。
类似地,也需要条件和决策——智能机器无法超越的规则。
结论
记住机器擅长什么,不擅长什么是非常重要的。一个完全依赖人工智能力量的世界将是一个没有创造力、好奇心和情感的世界。这就像完全根据一个孩子的数学成绩来决定她的能力一样。有必要找到平衡,因为记住机器不能有一个 4 岁孩子的好奇心,一个 4 岁孩子不能做复杂的计算。
感谢您的阅读。我真诚地希望它对你有所帮助,并且一如既往地欢迎建设性的反馈。
给我发邮件:【icy.algorithms@gmail.com
你可以在 LinkedIn 上找到我。
人工智能生态系统一团糟
艾瑞泽·艾
为什么无法理解 AI 公司到底在做什么?

交通混乱由 sladkozaponi 经 Shutterstock
人工智能在商业中的地位
在过去的几年里,人们急于找到如何将人工智能融入商业的方法,这样做可以提供巨大的比较优势,这已经不是什么秘密。但是,尽管大肆宣传,商业领域的人工智能仍然处于早期阶段。
我们的团队来自优步、谷歌、脸书和 Adobe,在那里我们看到了跨业务线部署人工智能的优势和挑战。大多数公司没有同样的资源来建立内部工具,深入衡量结果和资助广泛的研究。我们这个博客的目标是利用我们对人工智能领域的深入了解来理解生态系统,消除炒作,并提供可以帮助您在整个过程中做出人工智能投资决策的见解。
内部数据科学与外部合作伙伴
许多公司正在利用人工智能来颠覆商业领域,方法是将模型应用于各种商业垂直领域的常见商业问题。我们认为这些公司是垂直业务解决方案——他们销售由人工智能“驱动”的软件。他们针对客户服务、营销、财务和运营等各种团队,采用 SAAS 解决方案来解决他们的问题。另一类公司是销售软件解决方案的公司,这些软件解决方案可以增强您的数据科学、数据工程和 ML 工程团队的能力。
这篇博客的其余部分关注的是后一个领域的公司, AI/ML 基础设施公司,它们正在构建软件来帮助你的团队自己构建和部署模型。
人工智能领域的复杂性
我们从企业团队那里听到的第一个问题是,很难找出用人工智能解决的正确问题。即使他们找到了正确的问题,我们也经常听说他们开发的大多数模型都没有投入生产。这是一个很常见的问题,我们知道有一家公司在制造一个模型来预测其他模型是否真的能投入生产。你不得不怀疑这个模型本身是否能投入生产。
在不同的数据科学团队规模和扩展点上,您会发现数据科学组织出现了新的独特复杂性。有些复杂性实际上是以新形式出现的软件工程问题,而另一些则是这个领域特有的。所有这些都因旨在“帮助”数据科学的令人困惑的软件工具和解决方案套件而变得更加复杂。进入舞台左侧,这里有 100 多家公司正在推销令人困惑的软件解决方案,以“增强您的数据科学团队的能力”。
如何评价 ML/AI 软件公司
AI/ML 基础设施工具是一个极其拥挤的空间。我可以指出 100 多家公司提供超参数调优、部署、MLOps、治理、控制、审计、监管、可解释性、性能调优等服务。即使作为一个技术人员,我也曾被一些 ML 工具公司推销过,在一个小时的推销之后,我仍然不知道他们在做什么。
模糊的引用比比皆是,包括“实现人工智能规模”、“优化人工智能”、“赋予人工智能权力”、“控制你的人工智能”——但是这些软件解决方案实际上做了什么?
有一个简单的心智模型,我们用它来划分空间,放置解决方案,并打破炒作。

按作者列出的 ML 工作流阶段图
生产还是前期生产?
当你看 ML/AI 基础设施领域时,要做的第一个产品细分是预生产或生产。
预生产
- 该软件是否帮助您构建更好的模型、自动选择正确的模型、使模型构建过程可重复、审计模型构建、为模型构建产生更好的数据,或者跟踪训练运行?
生产
- 该软件是否有助于您将模型集成到业务中,将模型扩展到产品中,解决生产中的问题,为团队的其他成员解释结果,或者提供 A/B 有效的模型分析?
这种划分很重要的原因是,随着数据科学团队的成长,组织中不同的人最终负责生产而不是生产前。为一个功能/组织构建的软件解决方案不能很好地服务于整个组织的所有人。
建模工作流阶段
产品的下一个细分是产品在 ML 工作流程中的位置。概括地说,我们看到三个主要阶段—数据准备、模型构建和生产。
数据准备包括准备、标注和清理用于模型的数据。就使用人工智能模型而言,这是最大份额的时间和精力去的地方,并且它主要在数据工程师和数据辩论者的领域之下。
模型构建包括特征选择、训练管道、超参数调整、可解释性分析、生产前审计和评估。它通常由数据科学家承担。
最后是生产,包括部署模型进行推理(生成预测)、性能监控、故障排除和基于生产的可解释性。通常是在机器学习工程师圈子里。
ML 工作流的每一大类(数据准备、模型构建和生产)都有更深层次的特征。以下是对 ML 工作流程阶段的更详细的概述,包括每个阶段所需的产品功能,以及目前在这些垂直领域提供功能的公司。

作者的 ML 基础设施平台图
有一场激烈的争论,每个平台是否应该为深入垂直或水平解决方案量身定制。在接下来的博文中,我们将深入探讨该领域的各种垂直行业和产品。
人工智能公司推介说明
- 如果一个小公司推销一个在很多阶段做很多事情的产品,要怀疑他们只是想搞清楚他们的商业模式。
- 如果一个产品需要你颠覆你的模型构建和部署过程中的一切来产生价值,所创造的价值可能不值得被破坏和被锁定的风险。
- 应该将提高模型性能的产品推介与产生该价值的实现工作相比较。
下一个
我们将更深入地研究 ML 工作流程的生产环节。Arize AI 专注于使 AI 在生产中取得成功,我们很高兴分享更多关于如何获得模型最大价值的花絮。
联系我们
如果这篇博文引起了你的注意,并且你渴望了解更多,请在 Twitter 和 Medium 上关注我们!如果你想了解更多关于我们在艾瑞泽人工智能所做的事情,请通过contacts@arize.com联系我们。如果你有兴趣加入一个有趣的,摇滚之星的工程团队来帮助制作成功的模型,请通过jobs@arize.com联系我们!
参考
联系我们
如果这个博客引起了你的注意,并且你渴望了解更多关于机器学习可观察性和模型监控,请查看我们的其他博客和 ML 监控上的资源!如果您有兴趣加入一个有趣的 rockstar 工程团队,帮助模型成功生产,请随时联系我们,并在此找到我们的空缺职位!
人工智能工厂
运营端到端的人工智能生命周期,以大规模和高速度实现人工智能

Jan Starek 在 Unsplash 上拍摄的照片
就像实体工厂以可靠的规模和速度创造实体产品一样,人工智能工厂以可靠的规模和速度为企业提供人工智能解决方案。人工智能工厂将数据、人员、流程、产品和平台结合起来,超越科学实验,提供驱动商业价值的人工智能。人工智能工厂建立在为持续的人工智能成功创建一个坚实的信息架构的重要性之上。它结合了 DataOps、ModelOps 和 MLOps,以加速人工智能创新上市。
在这篇文章中,你将了解人工智能大规模成功的主要障碍,以及如何通过在人工智能工厂中结合数据、人员、流程、产品和平台来克服这些障碍。
Gartner 预测,到 2020 年,85%的首席信息官将试行人工智能计划(Gartner 报告 G00384355)。这代表了所有行业在数据科学和人工智能方面的巨大投资。然而,他们也报告说,超过 50%的数据科学和人工智能项目从未得到部署。
为了大规模实现人工智能,了解人工智能成功的阻碍因素很重要
2018 年的三大抑制因素是(1)数据和模型结果的信任和安全性,(2)从 POV 到生产的实施时间,以及(3)孤岛数据和分析工具的集成。
因此,主要的人工智能供应商开始与时间赛跑,以提供今天基于内置治理、血统、安全、偏见检测和可解释人工智能的平台——所有这些都是可信人工智能的必要工具。基于容器的架构、多云构建和部署、无代码仪表板和无代码部署缩短了生产时间。基于角色的协作平台包括各种流行的工具,可以加速共同创作。数据虚拟化显著降低了数据集成需求。DataOps、ModelOps 和 ML Ops 现在以大规模自动化人工智能的共同愿景补充了 devOps。随着新一代人工智能平台开始解决 2018 年确定的主要以技术为重点的抑制因素,人工智能成功的主要抑制因素开始发生变化。
一年后,商业领袖报告的前 3 个抑制因素专注于人员和业务影响,而不是技术:(1)拥有正确的技能,(2)了解人工智能的好处和用途,(3)能够定义实现业务目标所需的数据范围和质量。
从新的大学学位到学徒计划,新的技能计划出现了,以提高新的人工智能为重点的劳动力的技能。与此同时,新工具的出现降低了人工智能的准入门槛,最著名的是 AutoAI——能够自动构建和评估人工智能模型。创造了新课程来帮助教育人们人工智能的好处和用途。设计思维成为核心学科,被认为是定义数据范围和数据战略以实现业务目标的关键,而数据记者在让数据和人工智能背后的故事可供企业和公众消费方面取得了进展。
在当今可用的工具、技术、方法和角色过多的情况下,很难搞清楚从哪里开始,如何建立人工智能卓越中心(CoE),以及如何大规模运营人工智能,同时提高业务 KPI。
人工智能工厂方法通过关注数据、流程、产品、平台和人员这五大支柱,使混乱变得清晰。
通过将人工智能作为工厂来关注,而不是科学实验或概念验证商店,人们可以根据当前状态和未来方向创建优先的人工智能路线图,同时定义风险和成功标准,就像物理工厂或企业一样。
数据——AI 工厂的原材料。
就像实体工厂一样,你需要了解你的数据的供应链:数据来自哪里,供应商是否可信,数据将如何使用,哪些产品将由这些数据生产,数据的消费者是谁,以及消费者自己是否可以被信任以道德的方式使用数据。你还需要高效地存储数据,能够处理各种类型的数据,无论是结构化的还是非结构化的,并且能够发现人工智能流程所需的正确数据。在您的数据存储中,数据应该是可信的、可发现的、可共享的和可追踪的。DataOps 可在整个数据生命周期中实现敏捷的数据协作。今天,它是为你的人工智能工厂管理数据供应链的基本方法。
流程——就像原材料为生产产品的制造流程提供原料一样,数据为生产模型或人工智能服务的人工智能流程提供原料。
在考虑人工智能流程或管道时,一个常见的错误是只关注技术而忽视业务流程。有效的人工智能过程必须从考虑商业和市场对人工智能创新的需求开始。设计思维是一种很好的方法,可以与业务和技术利益相关者进行协调、规划和优先排序,并将业务 KPI 映射到数据科学指标。一旦建立了业务需求和度量标准,就必须就策略和工作流达成一致,以创建敏捷交付流程和 CI/CD 管道。MLOps 是管理人工智能工厂流程的首选方法,在数据科学和人工智能专家以及运营团队之间建立了联系。其他数据科学最佳实践包括尽早吸引业务利益相关方并保持他们的参与,投资顶尖人才以取得长期成功,以及在项目的 POC 阶段尽早询问运营问题以构建工厂。
产品——实体工厂以速度和规模生产产品,人工智能工厂以速度和规模生产模型、管道和其他人工智能资产。
就像实体企业一样,了解人工智能产品的市场需求很重要,无论是模型、管道还是其他人工智能资产。再次,设计思维是定义 AI“产品”的范围和用户体验的伟大工具。与任何产品一样,吸引赞助商用户并持续收集最终用户反馈非常重要。与汽车或电脑等主流产品不同,消费者还没有完全信任人工智能。因此,在你的人工智能产品中建立可解释性和偏见检测非常重要,这样非人工智能专家的人就可以理解为什么人工智能会建议某些行动或找到某些结果。与人工智能工厂的原材料(即数据)一样,人工智能工厂的产品(如管道、模型和服务)需要是可发现的、可共享的、可重用的和可销售的,以获得长期成功。ModelOps 是一种方法,可以确保从概念验证到生产的平稳过渡,并监控您的人工智能“产品”的性能和偏差。
平台——AI 工厂车间是数据和 AI 平台。
首先,AI 工厂平台必须是一个可信的环境,其中治理、可解释性和偏差检测都内置于平台中。AI 工厂资产(如数据、模型和管道)的发现、共享和重用是通过 AI 工厂目录实现的,它类似于物理工厂仓库和编目系统。
其次,AI 工厂平台支持所有在将 AI“产品”推向市场的过程中发挥作用的角色。因此,在一个促进协作的开放生态系统中,它包括了各种面向数据工程师、数据科学家、可视化专家、分析师和其他工厂角色的流行工具。它还包括降低构建人工智能产品门槛的工具,如 AutoAI、无代码仪表板和点击部署。
再次,AI 工厂平台支持从 POC 到生产的 AI 流程。它为沙盒、测试和生产提供了不同的环境,并提供了自助分析(如行业加速器)来加快生产速度。领先的人工智能工厂平台基于容器和 Kubernetes,可以自动扩展、管理和部署人工智能应用程序到任何云。
人——任何人工智能工厂成功的核心。
一个人工智能工厂需要一个拥有各种技能、角色和职责的团队才能成功,就像一个实体工厂一样。人工智能开发通常涉及跨职能或全栈技术团队。也就是说,重要的是不要把人工智能工厂仅仅看作一个技术商店,而是一个市场驱动的企业。在设计 AI 工厂时,考虑所有“要做的工作”,包括业务、AI 和 IT 利益相关者、数据科学家、数据工程师、数据记者、IT 支持、业务分析师、市场营销、运营和销售。为所有这些工作分配具有明确所有权、角色和职责的人员。与任何业务一样,驱动人工智能工厂的团队需要通过授权、认证、招聘和外包不断发展他们的集体技能,以成为他们市场的领导者。
当在 symphony 中结合数据、人员、流程、产品和平台时,人工智能工厂就有了生命。它不是一夜之间建成的,值得仔细规划和设计,以确保与 AI 的长期竞争优势。
为什么 GPU 这么强大?
人工智能图解指南
了解延迟与吞吐量之间的权衡,以及驱动现代 GPU 的架构变化

在《人工智能图解指南》的这一期中,我概述了为什么 GPU 对人工智能来说如此之快,以及其速度背后的解释。核心思想是优化吞吐量而不是延迟。为了理解这个概念,我用离线和在线教学进行了类比,然后概述了 CPU 和 GPU 是如何设计来支持延迟或吞吐量的。
最后,我将为您提供一个简单的过程来计算常见 CPU 和 GPU 的吞吐量和延迟,并简要概述如何在训练神经网络时利用这一巨大的吞吐量。
事不宜迟,我们来看一些插图:)
最快的学习方法是什么?

哪种学习方法最好?
聘请私人教师可以说是最快的学习方法,但也是最昂贵的。进入教室通常更便宜,同时仍然保留许多好处,例如可以直接提问。
然而,最实惠的选择是参加在线课程。这些缺乏教学的物理和个人方面,但所有内容都以视频格式提供给你,这允许你一遍又一遍地观看,直到你明白为止。然而,你被限制在拍摄的范围内。所有其他的,你必须自己搜索或在论坛上询问。

每种选择的利弊
尽管您可能有自己的偏好,但没有一个比其他的更好。他们都工作,他们都满足特定的需求。如果你很着急,请尽快聘请一位老师。如果你是为了好玩,网上课程可能就足够了。否则,选择传统的教室环境。
最重要的是,它们都可以一起使用来达到最佳效果。假设你不擅长语言,但是你需要学习西班牙语来获得一份工作。你可以注册一门西班牙语课程进行全面学习,聘请一名私人教师来跟上技术术语的速度,并在 Duolingo 周围进行一些额外的练习。
这一切都归结于您的用例场景。
延迟与吞吐量
- 等待时间:完成一个给定的任务需要多长时间
- 吞吐量:一段时间内你能完成多少次任务

一个老师可以教一个人,也可以向整个大陆广播。
私人教师可以在一个月左右让你达到基本的中文水平,而在线课程可能需要五个月。这就是延迟。
在五个月内,私人教师只能教五个学生基础汉语,一个月一个。然而,在线课程可以在同一时期为数百万非中文使用者做同样的事情。这就是吞吐量。
这是 CPU 和 GPU 的核心区别:CPU 针对延迟进行了优化:以最快的速度完成一项任务;GPU 针对吞吐量进行了优化:它们速度较慢,但可以同时处理大量数据。
另一个类比是乘公交车和开车。在跑车里,你可以开得更快,更早到达目的地。但是,该车只能乘坐 2 至 5 人左右。这辆公共汽车虽然速度较慢,但最多可以载 80 人。在一天中,小汽车可以往返两次,载大约 10 个人,而公共汽车只能往返一次,但要载 80 个人。
为什么这对 AI 很重要?
机器学习是人工智能的一个子领域,其基本原理是提出一种具有若干输入和输出的学习算法,并让该算法找出输入与输出之间的关系。
例如,我们可以获得以前在线课程的每个学生的大量数据,并根据这些数据尝试了解一个人是否会完成课程。以后,这可以用来指导一个为未来班级提供奖学金的系统,支持那些有可能完成学业的学生。

机器学习的基本思想
该算法必须看到每个配置文件(及其结果)才能学习。算法每秒可以查看的档案越多,它学习的速度就越快。这就是 GPU 发挥作用的地方。CPU 可以非常快地研究一个概要文件,但它每分钟只能做几百个。另一方面,GPU 要慢得多,但一次可以评估几百个,每秒钟可以快速检查一千多个条目。这就是它训练更快的原因。

使用 GPU,我们可以一次提供几个训练实例
这也解释了为什么 GPU 经过训练后被认为是无效的。在现实世界中,这种算法可能每天只运行几次来处理收到的建议。因此,CPU 可以更快地处理这种负载。GPU 只有在有大量数据要处理时才会表现出色。
GPU 是如何工作的?
剩下要解释的一件事是,与 CPU 相比,GPU 如何能够获得如此高的吞吐量。答案在于它的架构。

每个现代处理器的底层架构
大多数现代处理器都遵循“冯·诺依曼架构”其基本原理是将处理器分成三个相互连接的部分:
- 控制单元,完成大部分工作,如决定下一步做什么操作,从内存中取出下一条指令等。
- 算术/逻辑单元(ALU) ,实现加、减、乘等运算。
- 存储单元,存储芯片处理的数据,如输入、输出和任何中间数据。
当前的 CPU 将这一概念发展为“多核”架构,在这种架构中,一个处理器有更小的“子处理器”,称为核心,负责实际工作。更大的处理器反过来使它们保持同步,管理共享内存,并处理与外界的通信。

GPU 背后的主要思想是控制单元大而昂贵,而算术单元则更简单、更便宜。因此,如果同一个控制单元可以命令几个 alu,它就可以操作更大的数据块,但所有 alu 必须服从相同的命令。换句话说,他们必须做同样的事情。

这张图展示了 GPU 如何用“控制”换取“运算能力”每个 16 个 alu 的块被限制为在 16 对操作数上处理相同的指令。它们不像 CPU 内核那样功能多样,但可以批量处理大量数据。
此外,GPU 并不是完全没有灵活性。还有中央控制单元,它同步所有的子处理器,每个子处理器可以执行不同的任务。不可能的是同一组 alu 并行做多件事。例如,“if”语句对于 GPU 来说成本很高。
这张图还显示了一个显著的区别:GPU 是巨大的芯片。几十年来,CPU 都被限制在相同的外形规格上。最好的英特尔或 AMD 芯片和最差的一样大。GPU 就不是这样了。低端 GPU 明显比高端 GPU 更小、更弱。理论上,我们可以通过加大图形处理器的尺寸来制造更快的图形处理器。
计算延迟和吞吐量
让我们做一个简单的比较:最好的消费级锐龙处理器与最好的英伟达游戏 GPU 相比表现如何?
据我所知,最好的锐龙 CPU 是 Threadripper 2990X,它支持 32 个内核,每个内核能够运行两个独立的线程,时钟频率为 3 GHz,最高可达 4.2 GHz。
与此同时,英伟达 RTX 2080 TI GPU 拥有令人印象深刻的 4352 个 alu 和 1.350 GHz 的基础时钟,可以提升到 1.545 GHz。

两位勇敢的芯片设计冠军
为了比较这两款设备,我们使用了它们每秒可以处理的浮点运算的最大理论数量。此指标衡量设备的最大可能性能。
对于 CPU,我们将假设所有 64 个线程的完美使用,每个线程同时处理 8 个浮点值(使用 AVX 指令),并且每个时钟周期以其最高的时钟速率处理两个指令。GPU 也是如此。它有 4352 个内核,每个内核都能够进行一次浮点计算,以峰值时钟速率在每个时钟周期进行两次运算。
这就引出了下面的数学公式:时钟乘以效率乘以 ALUs:

因此,2080TI GPU 理论上大约是锐龙 CPU 速度的三倍。然而,实际上,它要快得多。使用 CPU 达到峰值利用率是一场噩梦,而在 GPU 上,这相对更简单。
或者,每个器件的延迟主要由它的速度决定,也就是它的时钟频率。CPU 的时钟频率为 4.2 GHz,而 GPU 仅落后约 1.5 GHz,几乎比慢三倍。
所以,一个不比另一个好;它们服务于不同的目的。
在深度学习中使用

末端带有密集分类器的典型卷积神经网络
深度学习都是处理张量:多维数组。例如,256×256 分辨率的一组 8 个 RGB 图像可以表示为 8×256×256×3 形状的张量。要应用 64 个大小为 3x3 的过滤器,我们需要计算大约 905,969,664 次浮点运算,而这只是我们网络的第一层。
难怪 GPU 擅长训练深度神经网络。它有大量的数据要处理,而且处理相当有规律。因此,它充分利用了巨大的运算能力,同时几乎不需要控制,这是 GPU 的薄弱环节。
在本系列的下一期文章中,我计划概述 ROC 曲线和正则化的概念。到目前为止,这是该系列的第二篇文章,是第一篇关于分类指标的文章,即准确性、敏感性、特异性、精确度和召回率。如果你喜欢这个系列,并希望看到一个特定的主题,请在评论中告诉我。
如果您对本文有任何问题,请随时发表评论或与我联系。如果你刚接触媒体,我强烈推荐订阅。对于数据和 IT 专业人士来说,中型文章是 StackOverflow 的完美搭档,对于新手来说更是如此。注册时请考虑使用我的会员链接。
感谢阅读:)
AI 革命来了。只是和我们预想的不一样。
商业科学
仅仅因为人工智能还不足以成为科幻小说,并不意味着它已经不是革命性的了

两年前,伯克利计算机科学教授和人工智能专家迈克尔·I·乔丹写了一篇文章警告不要夸大人工智能的说法。他宣称人工智能革命是我们只能希望在未来实现的东西。我认为革命已经开始了。只是看起来不像科幻小说一直描绘的那样。
艾:“智力通配符”
正如乔丹在他的文章中正确指出的那样,“人工智能”或“AI”一词被广泛应用于如此多的技术,以至于它实际上已经变得毫无意义。
“当前关于这些问题的公共对话经常使用“人工智能”作为智能通配符,这使得人们很难对新兴技术的范围和后果进行推理。”
迈克尔·乔丹,“人工智能——革命尚未发生”
这是一个“智力通配符”,可以用来讨论任何基于逻辑或推理的任务,这些任务以前由人类完成,现在计算机可以完成。诸如自然语言处理、神经网络,甚至像模式识别这样的低级功能的算法经常被包括在人工智能的讨论中。
你们撒了这么广的网,难怪 AI 辜负了我们的期望。除非创造出与人类推理能力相当的人工智能,否则任何人工智能看起来都不会发挥出它的潜力。不幸的是,忽视不值得科幻小说的人工智能限制了我们利用已经存在的真正革命性的人工智能。
历史上,人工智能的最终目标一直被视为创造一个完全独立的推理机器。这种自主的人工智能是一个伟大的最终目标,但我们不必等待这种可能性来认识到这场革命。人工智能增强了人类的智能,使我们能够根据数据做出更有效的决定,这已经是对传统决策的巨大改进。
尽管人们以前被限制在任何个人都可以有效收集和处理的有限信息量的决策中,但人工智能允许人们聚集所有相关信息并快速理解其含义。虽然人们可能无法完全从这个过程中解脱出来,但决策会变得更加有效。这是革命性的——我认为这是人工智能的最佳用途。
革命性人工智能

图片由 ytang3 提供,经 CC BY-SA 2.0 授权
当我们允许人工智能的目标是自动化和优化人类决策,而不是将人类从等式中删除时,自乔丹写下他的文章以来,我们在人工智能方面取得的进展变得更加清晰。以胎儿超声波为例。Jordan 的文章以一个故事开始,说明了人类有效利用数据、统计、技术和医学信息评估产前护理风险的局限性。因为在为孕妇和胎儿选择最佳护理计划的过程中涉及到如此多的因素,所以危险的误判是常见的。
然而,就在这篇文章发表五个月后,研究人员发布了一个人工智能系统,旨在评估超声波,以检测和诊断心脏异常。该系统将在评估所有使医生难以做出最佳建议的复杂性后,推荐治疗计划。医生和患者对医疗决策拥有最终控制权,但由于人工智能的创新,他们的信息更加灵通。用来说明人工智能缺点的确切问题已经发生了革命性的变化——没有人建议在没有最终决定权的情况下使用人工智能。还可以提供许多其他示例,例如通过手表和电话监控慢性病(如糖尿病)。
过去两年人工智能的进步帮助人们做出更好的决定,并不局限于医疗领域。商业也发生了类似的转变。埃森哲申请了一项进行即时支出分析的技术专利,允许用户对财务变化做出更敏捷的反应。一家新的时尚公司 Glitch 利用人工智能产生独特的设计想法,但让设计师们留在现场,对吸引消费者的东西做出最终决定。
我所在的 Evo 公司是建立在从自动化决策中创造价值的理念之上的。大多数公司过去都是根据历史数据和过去的销售来计算需求预测,但我们的人工智能允许这些评估包括来自更广泛来源的实时数据。这将预测准确率平均提高了 36%。人类基于这些预测做出关键的商业决策,但他们有比他们的勇气更好的选择基础。

作为人机联盟的人工智能
无论如何,保持人工智能的自主性并不一定会改善结果。人工智能推荐的准确性通常会随着额外的主观人类输入而提高。例如,当商店经理可以在有限的范围内调整库存建议时,我们的供应链算法可以提供更准确的需求预测。为什么?随着时间的推移,人们对客户需求有一种难以言喻的地方层次的理解,这种理解很难量化。
通过将人工智能计算的能力与人类直觉相结合,我们将预测准确度比自主生成的人工智能预测提高了 5%。我们当然不能保证人工智能模型中任何特定的人类干预都会产生同样的积极影响;人类的偏见定期在人工智能中复制自己。然而,人类与人工智能合作的总体影响是积极的。正是在这里,我们实现了创新,称得上是一场革命。
当你考虑通过人工智能已经可能的事情和每天变得新可能的事情时,很明显我们已经在人工智能领域达到了一个临界点。每天都有新的学术和商业应用出现。人工智能的发展可能会偏离我们的预期,但这并不影响我们已经取得的巨大进步。

Fabrizio Fantini 在 Evo 拍摄的图片
重新定义人工智能革命
乔丹明智地建议说,围绕完全自主的人工智能的大肆宣传正在阻碍我们看到将人工智能作为一种智能增强手段所带来的机会。人类直觉和机器计算能力的结合最有可能解决我们紧迫的社会问题。然而,他认为这意味着我们还没有开始人工智能革命,这是错误的。我们利用人工智能来帮助人们做出更理性、更明智的决定,这本身就是革命性的一步。
AI 革命来了。原来我们和机器是站在同一边的。
想了解更多关于数据科学革命的信息吗?看看这些文章。
通用的流量检查流程
towardsdatascience.com](/evoflow-why-we-preferred-our-own-solution-to-airflow-cdd6d187784a) [## 数据科学已经死了。商业科学万岁!
任何人都可以从不起眼的鲑鱼身上学到的 5 课
towardsdatascience.com](/data-science-is-dead-long-live-business-science-a3059fe84e6c)
人工智能信任危机:如何前进
在多年的大肆宣传和享受发现的独创性之后,世界进入了一场人工智能信任危机。

数据和模型中的社会、种族和性别偏见已经成为机器学习行业和社会的一个主要问题。
最近,麻省理工学院取消了对一个流行的计算机视觉数据集的公开访问,因为一组研究人员发现它带有社会偏见,带有厌恶女性和种族主义的标签。
在微小图像中的这一发现,一个8000 万图像数据集,是社会偏见如何扩散和传播到机器学习数据集和项目的完美例子。1985 年,普林斯顿大学的语言学和心理学研究人员为英语制作了一个语义词典,名为 WordNet ,它已被广泛用于自然语言处理任务。基于 WordNet,麻省理工学院的科学家在 2006 年发布了微型图像,这是一个图像数据集,由互联网上与 WordNet 单词相关的图像搜索汇编而成。由于 WordNet 最初是基于性别和种族偏见的,所以与收集的图像相关的微小图像标签也是如此。
就在几周前, Pulse ,一个自我监督照片上采样的生成模型,在人工智能模型中制造了许多噪音和对偏见的担忧,因为美国前总统巴拉克·奥巴马的像素化图像被 Pulse 转换成了一个白人的高分辨率图像。

PULSE 模型将像素化的人脸转换成高分辨率的图像,通过将巴拉克·奥巴马的脸变成白人的脸,带有种族偏见。图片: Twitter / @Chicken3gg
这两个例子是人工智能中偏见问题的体现,并显示了这个问题的复杂性,远远超出了数据和模型。这是一个全球性问题,需要从多个角度加以解决,而不仅仅是技术上的修补。
如何解决偏见问题?
这项技术的发展很快,但可以肯定地说,可以通过多种方式将数据偏差的影响降至最低。没有神奇的药丸。
脸书的首席人工智能科学家 Yann LeCun 解释说,处理偏差最直接的方法是意识到数据中的不平衡,并通过平衡不同类别样本的频率来解决它。根据 LeCun 的说法,这是脸书在其人脸识别系统中使用的方法。为了说明这一点,LeCun 喜欢用这样的类比:
“如果你去医学院,你不会花时间研究普通流感和一些罕见疾病在患者中的发生率。你在罕见疾病上花费了相对更多的时间,因为你需要为它们开发“功能”——扬·勒昆
深度学习系统中的偏差是这样一个问题,因为由于损失的非凸性,它们不会学习和创建罕见类别的特征,而这不会发生在例如逻辑回归中。
最近的一篇论文提出了一种新的方法,通过“T2 不变风险最小化”来识别和最小化偏倚。简而言之,这种方法旨在训练机器学习模型,以估计多个训练分布之间的不变相关性。
偏见不是唯一的担忧
这些最近的事件重新开启了关于可信人工智能的辩论:使用人工智能模型的机构和个人必须重新考虑他们制作、开发和部署人工智能的方式。无论是不是基于人工智能的系统,消费者和公民都需要相同级别的权利和安全。今天,人工智能并没有被人们自然地接受,大部分时间都有一种不信任在它周围徘徊。人工智能的道德使用成为信任的先决条件。
是时候打破这些担忧,改变我们制造信息产业的方式了。
在欧洲,监管机构正在研究这个问题,他们在 2019 年 4 月发布了一套针对可信人工智能的道德准则。

2018 年,欧洲已经成立了一个关于 AI 的高级专家组(AI HLEG),发布可信 AI 的伦理准则。来源:欧盟委员会
根据指南,可信人工智能应围绕三大支柱展开:
- 道德:尊重和拥护道德原则和价值观
- 坚固性:从技术和社会角度来看,安全可靠
- 合法:尊重所有适用的法律法规

欧盟可信人工智能指南。
围绕这些支柱,欧盟监管机构定义了七个 实用的关键要求,任何人工智能系统都应该满足这些要求才能被贴上可信的标签。
- 人类监督:人工智能系统必须让人类保持在循环中,提供洞察力,让他们在保护他们的权利和尊重他们的价值观的同时做出明智的决定。
- 技术稳健性和加工安全性:弹性和安全性也是一个主要问题。对可靠性、准确性和再现性提出了更高的要求。人工智能系统不能再独立存在了,它们必须伴随着一个备份系统,以防出现问题。
- 隐私和数据治理:除了数据治理以保证数据质量、完整性和可信的数据访问之外,尊重隐私和数据保护也是实现信任的必要条件。
- 多样性、非歧视和公平:正如本文开头部分所述,偏见会造成巨大影响,从歧视到对特定人群的偏见。值得信赖的人工智能必须避免设计偏见。欧盟监管机构还指出,对人工智能系统的访问必须是普遍的,没有歧视,无论残疾与否,并涉及人工智能系统生命周期的所有各方。
- 环境和社会影响:可持续发展是这一关键要求的核心。随着深度学习模型所需的计算能力不断增加,对绿色人工智能的主要担忧在过去几年中有所增加。人工智能系统必须是“绿色”的,造福于所有人,包括后代,同时考虑到环境和其他生物和物种,并认真意识到它们的社会影响。
- 责任:通过人工智能审计,重点关注算法、数据和设计,确保人工智能系统及其结果的责任和责任。
- 透明性:可追溯性和可解释的人工智能有助于实现对人工智能系统决策的信任。必须清楚地解释和记录能力和限制。必须通知人类他们直接与人工智能系统连接,或者他们的数据正被人工智能系统使用。

在系统的整个生命周期中实施可信人工智能—来源:可信人工智能道德准则,欧盟委员会
“基于这项工作,我们现在可以向前推进,建立一个监管框架,让每个人都可以从值得信赖的人工智能中受益。”—内部市场专员 Thierry Breton
如何往前走,解决 AI 信任危机?
这 7 个关键原则可以作为审计人工智能系统价值链的切入点,从概念到部署和维护。
欧盟委员会发布的这份文件的主要附加价值在于,它提出了一系列实际问题,以落实我已经提到的关键原则。
这个值得信赖的人工智能评估列表,阿尔泰,对于任何想要迈出第一步并向前迈进以解决我们今天面临的人工智能信任危机的公司或个人来说,都是一个伟大的举措。它将指导方针转换成一个可访问的和实用的清单,AI 的赞助者、开发者和部署者可以使用它来快速审计他们的 AI 系统。阿尔泰有一个文档版本,还有一个基于网络的工具(原型版本)。

迈向人工智能的可信赖性是下一个十年的挑战——Glenn Carstens-Peters 在 Unsplash 上的照片
建议采用技术和非技术方法,以确保在人工智能系统的设计、开发和运行阶段引入可信的人工智能。
任何公司的出发点都是定义其在使用人工智能方面的道德价值观和责任,并在行为准则中加以说明。这应该转化为治理原则,关键原则应该锚定在人工智能系统的架构设计中。一个关键点是通过人工智能风险管理工具和协议来识别、评估和管理风险。规则、过程和控制程序将建立可信的人工智能框架。随着时间的推移,对模型和 KPI 的监控有助于检测数据或性能漂移,并对潜在偏差发出警告。
生态系统也将发展,重点是人工智能系统的监管、标准化和认证,但也通过教育和意识培养道德思维,所有利益相关者参与和社会对话,多样性和包容性设计团队。
人工智能审计方法,将在未来几年蓬勃发展,当然,专门从事人工智能审计和认证的公司将出现在市场上。毫无疑问,值得信赖的人工智能有一个巨大的市场,各公司将蓬勃发展,将其作为一种差异化特征,从竞争对手中脱颖而出。
我真的希望这篇文章将提高人们对向前迈进的重要性和紧迫性的认识,并开始思考,设计和实施这些道德建议到我们日常的人工智能从业者的工作中。
你的,托马斯
算法不是产品
为什么我认为数据科学家应该学习更多关于制造好产品的知识

一名男子正在看白板。
我在这个行业学到的第一个教训是,即使我们构建高度复杂的算法来解决特定的问题,这些工具也需要被客户使用。无论是内部的还是外部的,客户端需要的不仅仅是一段精心构建、打包和部署的代码。
换句话说,这个产品不仅仅是一个算法,它是一个完整的系统,让你的用户从中获得巨大的价值。构建一个以算法为核心的产品并不是一件容易的事情,它需要许多团队的合作,例如产品经理、开发人员、研究人员、数据工程师、开发人员、ui\ux 等..
制造一个产品依赖于研究方法,你反复地假设(基于先验或后验知识),测量,推断见解和调整产品,直到你达到产品适合市场。这是一场与未知的无休止的战斗,除了过程之外,没有任何承诺。过程越好,你得到好产品的机会就越大。
然而,我们往往会忘记这一点。
以下是应该强调的几点,即除了数据科学考虑之外,我们还需要重视产品的情况。
面试
当面试一名新的数据科学家时,我们通常会询问过去的研究、算法、方法,并引入一个候选人需要解决的看不见的动手研究问题。
作为招聘经理,我们应该真正考虑从 DS 的角度询问与产品相关的问题,我们应该查看家庭作业,并询问相关问题,为什么候选人做出与产品相关的某些数据或算法决策。例如,询问与产品问题相关的特征工程选择。诸如“为什么他们选择包含特性 X 而不是 Y”或“为什么他们选择以某种方式处理特性 Z”的决策。
最初的模型
对于许多组织来说,应该投入生产的第一个模型是最简单的算法,通常被描述为“基于规则”的模型或“80–20”模型。在进入研究阶段之前放置这样一个基本模型的动机通常是,允许开发人员、开发人员和其他团队为新模型创建一个支持性的基础设施,然后 DS 将致力于一个“真正的”模型来代替临时的替身。
从 DS 候选人那里听到这个想法或由当前的 DS 执行它是非常重要的。它显示了对一个组织需要提前做好准备的深刻理解。它允许项目经理并行地促进和推动相关任务,允许我们更加敏捷,并且它鼓励非产品人员理解产品。
决策模型
有些考虑事项应该由候选人提出或由您的 DSs 实践。用 balance=true 来训练一个算法,以便对不平衡的数据集进行正则化,这是一个产品决策,应该由数据科学家来决定。他应该问产品经理,这些课程对于手头的问题是否同样重要,或者我们是否希望在更大的课程中表现得更好?
这类问题是我们在面试过程中也应该问候选人的重要问题,在询问他是否能描述他所知道的关于平衡类的所有方法(过采样、欠采样、损失正则化、合成数据等)之后,我们应该立即问候选人..).
这里我也简单说一下。
与项目经理的合作
在我们的数据科学(DS)领域,我们与产品经理(PM)紧密合作,以实现这一令人垂涎的目标。我们与不同的团队有许多摩擦点,但最重要的是与 PM 的摩擦点,如图 1 所示。

图 1:与业务和产品一起工作时的建议流程
考虑一个需要达到或优化的业务-产品(BP) KPI,以及一个需要找到合适的 DS-KPI 的数据科学家,它最大限度地服务于 BP-KPI。这是我们最大的挑战之一,并且经常被所有利益相关者忽略。下图(图 1)显示了一个工作流,该工作流允许进行迭代研究,以优化这两种类型的 KPI,允许与业务、产品和数据科学进行协作。
你可以在这里阅读更多关于我管理这个摩擦点的方法。
不要爱上你的算法
我们努力完善我们的算法,确保它们得到适当的优化,但是,很多时候,系统中的某些人会改变主意,或者没有正确地研究市场,而您为某个功能构建的算法是不需要的,或者没有按预期执行。一个常见的错误是推动、尝试修正或重新调整算法。然而,更明智的做法可能是放手,根据新产品需求,从零开始使用新的算法。这将你从以前的约束中解放出来,对你在组织中的团队来说是战略上的好事。
我希望这些想法将允许专业决策支持系统在开始一个新项目或向产品添加新功能时探索更多关于产品管理的知识,更加敏捷,并有希望帮助处理业务经理、产品经理、数据科学家和研究人员之间的复杂关系。
我要感谢我的同事,纳塔内尔·达维多维茨和 T2·塞菲·凯勒审阅了这篇文章。
Ori Cohen 博士拥有计算机科学博士学位,主要研究机器学习。他是新遗迹 TLV 的首席数据科学研究员,在 AIOps 领域从事机器和深度学习研究。
网络抓取的替代方案
更快、更有效地检索 web 数据的“懒惰”程序员指南

弗洛里安·奥利佛在 Unsplash 上拍摄的照片
懒惰的程序员
Perl 编程语言的作者拉里·沃尔认为,程序员有三大美德;懒惰、急躁和傲慢:
懒惰:让你下大力气降低整体能量消耗的品质。它让你编写省力的程序,其他人会觉得有用,并记录你写的东西,这样你就不必回答这么多关于它的问题。
比尔·盖茨呢:
我选择一个懒惰的人去做艰苦的工作。因为一个懒惰的人会找到一个简单的方法去做。
诚然,web 抓取可能是一个相当简单的编程问题:在文档的源代码中搜索惟一的标识符并提取相关数据。然而,我认为,通常有一个更简单、更快、能产生更多数据的“更懒惰”的解决方案。
网页抓取示例
一个比较好的金融数据网站是雅虎财经。这使得它成为金融爱好者搜索网页的主要目标。在 stack overflow上几乎每天都有问题涉及到来自雅虎财经的某种数据检索(通常是通过网络搜集)。
网络抓取问题#1
我是 python 初学者,但我喜欢通过测试和尝试来学习这门语言。所以有一个雅虎网络刮刀…
stackoverflow.com](https://stackoverflow.com/questions/62629614/trying-to-test-a-code-that-scrap-from-yahoo-finance)
OP 试图找到特定股票脸书的当前价格。他们的代码如下:
该代码产生了以下输出:
the current price: 216.08
这是一个非常简单的问题,也是一个简单的网络抓取解决方案。但是,还不够懒。我们来看下一个。
网络抓取问题#2
我发现了这个有用的代码片段:使用 BS4 对雅虎财务统计数据进行网络搜集,我已经按照…
stackoverflow.com](https://stackoverflow.com/questions/62618756/web-scraping-yahoo-finance-statistics-code-errors-out-on-empty-fields)
OP 试图从统计数据选项卡中提取数据,即股票的企业价值和股票做空的数量。他的问题实际上围绕着检索可能存在也可能不存在的嵌套字典值,但是他似乎已经找到了一个更好的检索数据的解决方案。
看一下第 3 行:OP 能够在 javascript 的一个变量中找到他正在寻找的数据:
root.App.main = { .... };
从那里,通过访问字典中适当的嵌套键data,可以非常简单地检索数据。但是,你可能已经猜到了,有一个更简单、更懒惰的解决方案。
懒惰解决方案#1
看看第三行的 URL
输出:
{
'quoteSummary': {
'error': None,
'result': [{
'price': {
'averageDailyVolume10Day': {},
'averageDailyVolume3Month': {},
'circulatingSupply': {},
'currency': 'USD',
'currencySymbol': '$',
'exchange': 'NMS',
'exchangeDataDelayedBy': 0,
'exchangeName': 'NasdaqGS',
'fromCurrency': None,
'lastMarket': None,
'longName': 'Facebook, Inc.',
'marketCap': {
'fmt': '698.42B',
'longFmt': '698,423,836,672.00',
'raw': 698423836672
},
'marketState': 'REGULAR',
'maxAge': 1,
'openInterest': {},
'postMarketChange': {},
'postMarketPrice': {},
'preMarketChange': {
'fmt': '-0.90',
'raw': -0.899994
},
'preMarketChangePercent': {
'fmt': '-0.37%',
'raw': -0.00368096
},
'preMarketPrice': {
'fmt': '243.60',
'raw': 243.6
},
'preMarketSource': 'FREE_REALTIME',
'preMarketTime': 1594387780,
'priceHint': {
'fmt': '2',
'longFmt': '2',
'raw': 2
},
'quoteSourceName': 'Nasdaq Real Time '
'Price',
'quoteType': 'EQUITY',
'regularMarketChange': {
'fmt': '0.30',
'raw': 0.30160522
},
'regularMarketChangePercent': {
'fmt': '0.12%',
'raw': 0.0012335592
},
'regularMarketDayHigh': {
'fmt': '245.49',
'raw': 245.49
},
'regularMarketDayLow': {
'fmt': '239.32',
'raw': 239.32
},
'regularMarketOpen': {
'fmt': '243.68',
'raw': 243.685
},
'regularMarketPreviousClose': {
'fmt': '244.50',
'raw': 244.5
},
'regularMarketPrice': {
'fmt': '244.80',
'raw': 244.8016
},
'regularMarketSource': 'FREE_REALTIME',
'regularMarketTime': 1594410026,
'regularMarketVolume': {
'fmt': '19.46M',
'longFmt': '19,456,621.00',
'raw': 19456621
},
'shortName': 'Facebook, Inc.',
'strikePrice': {},
'symbol': 'FB',
'toCurrency': None,
'underlyingSymbol': None,
'volume24Hr': {},
'volumeAllCurrencies': {}
}
}]
}
}the current price: 241.63
懒惰解决方案#2
再次查看第 3 行的 URL
输出:
{
'quoteSummary': {
'result': [{
'defaultKeyStatistics': {
'maxAge': 1,
'priceHint': {
'raw': 2,
'fmt': '2',
'longFmt': '2'
},
'enterpriseValue': {
'raw': 13677747200,
'fmt': '13.68B',
'longFmt': '13,677,747,200'
},
'forwardPE': {},
'profitMargins': {
'raw': 0.07095,
'fmt': '7.10%'
},
'floatShares': {
'raw': 637754149,
'fmt': '637.75M',
'longFmt': '637,754,149'
},
'sharesOutstanding': {
'raw': 639003008,
'fmt': '639M',
'longFmt': '639,003,008'
},
'sharesShort': {},
'sharesShortPriorMonth': {},
'sharesShortPreviousMonthDate': {},
'dateShortInterest': {},
'sharesPercentSharesOut': {},
'heldPercentInsiders': {
'raw': 0.0025499999,
'fmt': '0.25%'
},
'heldPercentInstitutions': {
'raw': 0.31033,
'fmt': '31.03%'
},
'shortRatio': {},
'shortPercentOfFloat': {},
'beta': {
'raw': 0.365116,
'fmt': '0.37'
},
'morningStarOverallRating': {},
'morningStarRiskRating': {},
'category': None,
'bookValue': {
'raw': 12.551,
'fmt': '12.55'
},
'priceToBook': {
'raw': 1.3457094,
'fmt': '1.35'
},
'annualReportExpenseRatio': {},
'ytdReturn': {},
'beta3Year': {},
'totalAssets': {},
'yield': {},
'fundFamily': None,
'fundInceptionDate': {},
'legalType': None,
'threeYearAverageReturn': {},
'fiveYearAverageReturn': {},
'priceToSalesTrailing12Months': {},
'lastFiscalYearEnd': {
'raw': 1561852800,
'fmt': '2019-06-30'
},
'nextFiscalYearEnd': {
'raw': 1625011200,
'fmt': '2021-06-30'
},
'mostRecentQuarter': {
'raw': 1577750400,
'fmt': '2019-12-31'
},
'earningsQuarterlyGrowth': {
'raw': 0.114,
'fmt': '11.40%'
},
'revenueQuarterlyGrowth': {},
'netIncomeToCommon': {
'raw': 938000000,
'fmt': '938M',
'longFmt': '938,000,000'
},
'trailingEps': {
'raw': 1.434,
'fmt': '1.43'
},
'forwardEps': {},
'pegRatio': {},
'lastSplitFactor': None,
'lastSplitDate': {},
'enterpriseToRevenue': {
'raw': 1.035,
'fmt': '1.03'
},
'enterpriseToEbitda': {
'raw': 6.701,
'fmt': '6.70'
},
'52WeekChange': {
'raw': -0.17621362,
'fmt': '-17.62%'
},
'SandP52WeekChange': {
'raw': 0.045882702,
'fmt': '4.59%'
},
'lastDividendValue': {},
'lastCapGain': {},
'annualHoldingsTurnover': {}
}
}],
'error': None
}
}{'AGL.AX': {'Enterprise Value': '13.73B', 'Shares Short': 'N/A'}}
懒惰的替代方法只是将请求从利用前端 URL 更改为某种非官方的 API 端点,后者返回 JSON 数据。它的更简单并导致更多数据!那么速度呢(我很确定我承诺了更简单、更多数据、和更快的选择)?让我们检查一下:
web scraping #1 min time is 0.5678426799999997
lazy #1 min time is 0.11238783999999953
web scraping #2 min time is 0.3731000199999997
lazy #2 min time is 0.0864451399999993
懒惰的替代品比他们的网页抓取对手快 4 到 5 倍!
你可能会想,“这很好,但是你在哪里找到这些网址?”。
懒惰的过程
考虑我们在上面走过的两个问题:在数据被加载到页面中之后,我们试图检索数据的操作。更懒惰的解决方案直接进入数据源,根本不关心前端页面。这是一个重要的区别,而且我认为,当你试图从一个网站提取数据时,这是一个很好的方法。
步骤 1:检查 XHR 请求
XHR (XMLHttpRequest)对象是一种可用于 web 浏览器脚本语言(如 JavaScript)的 API。它用于向 web 服务器发送 HTTP 或 HTTPs 请求,并将服务器响应数据加载回脚本。基本上,它允许客户端从 URL 中检索数据,而不必刷新整个页面。
我将在下面的演示中使用 Chrome,但其他浏览器也有类似的功能。
- 如果你想跟随,导航到https://finance.yahoo.com/quote/AAPL?p=AAPL
- 打开 Chrome 的开发者控制台。要在 Google Chrome 中打开开发者控制台,请打开浏览器窗口右上角的 Chrome 菜单,然后选择更多工具>开发者工具。也可以使用快捷键选项+ ⌘ + J(在 macOS 上),或者 Shift + CTRL + J(在 Windows/Linux 上)。
- 选择“网络”选项卡

- 然后按“XHR”过滤结果

- 你的结果将是相似的,但不是相同的。你应该注意到有一些请求包含“AAPL”。让我们从调查这些开始。单击最左侧列中包含字符“AAPL”的链接之一。

- 选择其中一个链接后,您将看到另一个屏幕,提供您选择的请求的详细信息。第一个选项卡 Headers 提供了浏览器发出的请求和服务器响应的详细信息。您应该立即注意到 Headers 选项卡中的请求 URL 与上面的惰性解决方案中提供的非常相似。看来我们走对了路。
- 如果您选择预览选项卡,您将看到从服务器返回的数据。

- 完美!看起来我们找到了获取苹果 OHLC 数据的网址!
第二步:搜索
现在我们已经找到了一些通过浏览器发出的 XHR 请求,让我们搜索 javascript 文件,看看是否能找到更多信息。我发现与 XHR 请求相关的 URL 的共同点是“query1”和“query2”。在开发者控制台的右上角,选择三个垂直点,然后在下拉列表中选择“搜索”。

在搜索栏中搜索“query2 ”:

选择第一个选项。将弹出一个额外的选项卡,其中包含找到“query2”的位置。您应该注意到这里也有类似的东西:

这与 web 抓取解决方案#2 用来提取数据的变量相同。控制台应该为您提供一个“漂亮打印”变量的选项。你可以选择那个选项,或者将整行(上面的第 11 行)复制并粘贴到类似于https://beautifier.io/的地方,或者如果你使用 vscode ,下载美化扩展,它会做同样的事情。一旦正确格式化,将整个代码粘贴到文本编辑器或类似的地方,然后再次搜索“query2”。您应该在名为“ServicePlugin”的东西中找到一个结果。该部分包含 Yahoo Finance 用来在页面中填充数据的 URL。以下内容摘自该部分:
"tachyon.**quoteSummary**": {"path": "\u002Fv10\u002Ffinance\u002FquoteSummary\u002F{symbol}","timeout": 6000,"query": ["lang", "region", "corsDomain", "crumb", "modules", "formatted"],"responseField": "quoteSummary","get": {"formatted": true}},
这与上面提供的惰性解决方案中使用的 URL 相同。
TL;速度三角形定位法(dead reckoning)
- 由于网站的结构,网络搜集可能是必要的,但值得努力调查,看看是否能找到数据的来源。生成的代码更简单,提取更多数据的速度更快。
- 找到网站数据的来源通常是通过搜索 XHR 请求或利用浏览器的开发人员控制台搜索网站的 javascript 文件来实现的。
更多信息
- 如果你找不到任何 XHR 请求怎么办?查看 web 抓取的替代方案,第二部分:检索 Web 数据的枯燥方法
检索 web 数据的干燥方法
towardsdatascience.com](/the-alternative-to-web-scraping-part-ii-c2e3c2c06556)
- 如果您对本文的 Yahoo Finance 方面特别感兴趣,我已经编写了一个 python 包, yahooquery ,它在一个方便的界面中公开了大多数端点。我还写了一篇介绍性文章,描述了如何使用这个包以及与类似包的比较。
一个 Python 接口,可以处理无限量的数据
towardsdatascience.com](/the-unofficial-yahoo-finance-api-32dcf5d53df)
- 如果您有任何问题或意见,请随时联系我们
Web 抓取的替代方案,第二部分
检索 web 数据的干燥方法

费尔南多·埃尔南德斯在 Unsplash 上的照片
在的上一篇文章中,我描述了如何在不使用网络抓取的情况下从雅虎财经中检索数据。具体来说,我们发现了一种利用 XHR 请求检索数据的方法。从那里,我们在浏览器的开发者控制台中发现了更多带有搜索功能的非官方终端。如果没有任何 XHR 请求,我们能做什么呢?
首先,记住干燥原则很重要(以下来自维基百科):
不要重复 ( 干,或者有时不要重复)是软件开发的原则,旨在减少软件模式的重复,【1】用抽象代替它或者使用数据规范化来避免冗余。
创建了你试图抓取的网站的开发者很可能就是带着这个原则在运作的。站点中可用的数据使用一种固定的模式呈现——无论是列表、表格还是一系列 div。很可能,这对你来说并不陌生;这是你用来收集数据的。但是,就像第一篇文章一样,我认为花时间寻找替代方案是有好处的。
例子
最近,我被要求搜索大约 100 个房地产网站,以便一家公司能够跟踪他们当地市场的商业地产销售情况。
我看的第一个地方是 https://duwestrealty.com/properties/ T21。

- 我总是做的第一件事是检查开发者控制台的网络选项卡中的 XHR 请求

- 而且……什么都没有。好吧,没理由气馁。屏幕顶部附近有复选框,最有可能过滤下面的结果。我的猜测是,如果我改变其中一个复选框,一个 XHR 请求将被解雇。我们试试吧!

- 取消选中“用于租赁”复选框后,XHR 请求确实发生了。但是,进一步考察之后,似乎一点帮助都没有。

- 看起来这个网站正在努力隐藏这个请求。这比我想象的要难。
- 我现在要去检查大教堂。具体来说,我想看看每个属性的图像和细节是如何呈现的。这是我右键单击其中一个图像并选择“Inspect”后看到的内容。

- 首先,看起来每个属性都在 id 为 properties 的 div 中。并且,每个属性都在一个带有类属性的 a 标签内。
- 这就是干燥原理再次发挥作用的地方。从传统的 web 抓取的角度来看,我们要么以属性 id 为目标,要么以属性类为目标,然后遍历结果。然而,为什么不从站点开发者的角度考虑这些标识符呢?从 CSS 的角度来看,他们很可能使用这些标识符来保持代码的干爽,但也可能是为了利用 javascript 注入数据。
- 所以,接下来我要做的是在开发者控制台中搜索属性。结果如下:

-
前几个是 css 文件。我知道那些不会有什么有用的东西,所以我继续浏览着名单。往下第五个是properties . js;那似乎很有希望。我将把该文件复制到文本编辑器中,并再次搜索“properties”。这是我的发现:
-
让我们再细分一下,因为这里有很多有用的信息:
- 他们利用了 ajax,它允许页面发出异步 HTTP 请求。
- URL 位于一个名为
ajaxUrl的变量中。 - 他们正在发出一个 POST 请求。
- 最后,他们通过 POST 请求发送数据:
data: {
action: 'fetch_properties'
}// ordata: {
action: 'fetch_brokers'
}
- 让我们继续前进,因为我还没有完全到达那里;我还需要找到
ajaxUrl。如果我在同一个 properties.js 文件中搜索“ajaxUrl ”,我会发现:
const ajaxUrl = wp.wpurl + ‘/wp-admin/admin-ajax.php’;
- 我们越来越近了!我的猜测是 wp.wpurl 只是主机名:
duwestrealty.com但是让我们确认一下。我将在 DOM 中搜索该变量:

- 现在,就像用我们在
properties.js文件中找到的所需有效负载发出 POST 请求一样简单。
import requestsr = requests.post(
"[https://duwestrealty.com/wp-admin/admin-ajax.php](https://duwestrealty.com/wp-admin/admin-ajax.php)",
data={'action': 'fetch_properties'}
)
data = r.json()
type(data)
len(data)
data[0].keys()
<class 'list'>
185
dict_keys(['id', 'postid', 'address', 'city', 'state', 'zipcode', 'categories', 'sf', 'gla', 'caprate', 'price', 'description', 'brokers', 'pdf', 'image', 'logo', 'video', 'locationmap', 'title'])
所以,回到我手头的任务。我需要检索大约 100 个其他类似网站的数据。从代码的角度来看,再考虑一下 DRY 原则,利用上面的方法比为每个站点开发不同的抓取解决方案要容易得多。我可以很容易地使每个请求适应适当的站点:修改 HTTP 请求方法(GET、POST)、发送到服务器的数据、查询参数和响应处理。如果你已经读到这里,这里是我想到的解决方案:
更多信息
- 第 1 部分:网页抓取的替代方案
- 如果您有任何问题或意见,请联系我们。
亚马逊商业分析师访谈
亚马逊业务分析师面试问题

图片来自 Unsplash
亚马逊业务分析师的工作是技术数据解释和商业敏锐度的混合体。一个成功的商业分析师将进入产品管理、分析管理或商业智能的职业道路,所有这些都需要知识的深度和广度。
职责
- 负责监控和推动关键业务决策的持续指标、报告、分析和仪表板的设计、开发和维护。
- 通过支持业务查询并将其转化为分析报告,将分析嵌入到日常运营中。
- 构建强大的运营和业务指标,并使它们在整个工作场所高度可视化和可消费。
- 与跨职能团队、系统和供应商数据合作,构建报告系统,并利用指标来寻找强有力的改进机会。
商业分析师面试
亚马逊的面试过程在不同的团队中非常一致。一旦你的简历进入候选名单,面试就从招聘人员筛选或招聘经理的电话筛选开始。如果在最初几轮中被选中,你会被邀请在同一天参加大约 4-5 次面试。所有的面试都是基于亚马逊的 14 项领导原则来测试你的能力,可能还包括技术性的面试问题。
总的来说,准备工作的重点应该主要放在领导原则上,稍微放在数据库系统设计上,最后放在实际编码、SQL 查询、产品和业务案例上。
查看一个 亚马逊商业案例问题 的模拟面试。
根据级别(L3/L4/L5),您将有 4-5 轮面对面的机会。除此之外,还会有几轮技术测试和几轮行为测试。行为调查主要是根据亚马逊臭名昭著的领导原则来评判你。
亚马逊领导原则面试问题
对于亚马逊的领导行为能力面试,问题的确切措辞可能不同,但每个领导原则的中心思想是相同的。
对于每一条领导原则,记得围绕你如何体现每一条原则编一个故事。例如:
- 客户困扰:获取客户反馈,从他们的痛点中学习,以构建更好的产品或流程。
- 深入研究:通过深入问题解决复杂的问题。
- 行动偏好:不同项目的优先行动和主动性。
- 归属:一个你超出了原来范围的项目。
- 赢得信任:解决不同团队成员之间的冲突,并与客户建立了良好的长期关系。
- 发明和简化:一个让系统更高效的项目。
面试官永远不会说他们在问你一个领导原则类型的问题。然而,你要确切地知道如何编造一个故事来引出十四条原则中的一条。基本上就是房间里的大象!
基于场景的问题

产品策略由 Pixabay 提供
对于这些情景类型的问题,如告诉我一次你……等,思考 STAR 方法是有帮助的。星型方法是一个简单的框架,用来阐述你的工作经验。
情景:设置场景,给出上下文。任务:描述你的职责是什么。
行动:准确解释你采取了什么措施来解决这个问题。
结果:分享你的行动直接取得了哪些结果。
对于 STAR 方法的每个部分,让大部分讨论发生在行动和结果部分。你必须确切地强调你做了什么以及你的行动的结果。鉴于每次面试时间很短,项目讨论不要超过 5 分钟。
还记得考虑至少有两到三个项目和故事,你可以自信地叙述和回应后续问题。这降低了您没有任何基于场景的问题的相关示例的风险。
亚马逊业务分析师面试问题
重点关注的一般技术问题是:
- SQL 查询和 ETL
- 商业案例问题
- 统计分析
- 产品指标
至少 1-2 轮将基于技术技能。对于业务分析师来说,他们测试的主要技能是 SQL,尽管了解一点 Python、R 或 Tableau 之类的数据可视化工具会有所帮助。期待在面试查询上看到一些容易到中等水平的 SQL 问题。还有数据工程的元素,如原始数据提取、转换和加载数据。
通常,业务分析师也会编写一些 ETL 管道,所以这有助于复习关键概念。这将取决于团队,以及他们是否期望业务分析师编写 ETL 管道。
ETL 问题示例如下:
- merge upserts 是如何工作的?
- 如何加载历史记录?
看看这个关于候选人如何回答亚马逊给出的数据工程和 ETL 问题的模拟面试。
亚马逊内部已经几乎完全转向 AWS,所以如果你掌握一些 AWS 知识,尤其是与数据库相关的服务,那会很好。此外,了解红移的工作原理对面试官可能熟悉的 SQL 语法也有好处。

图片来自 Pixabay
SQL 问题将围绕您对基本 SQL 逻辑的理解,如使用多个数据集的连接条件,以及如何计算平均值、最大值、最小值、总和以及其他函数。
复习如何使用多个数据集,根据给定的数据创建新表,以及创建汇总输出。
Python 和 R 是更高级的工具,它们不是必需的,但会让你脱颖而出。大多数团队将依靠数据工程师来满足他们的 Python 需求,并依靠数据科学家来利用 R 进行统计分析。了解这些技能会让你作为亚马逊业务分析师更有价值。
此外,最常见的其他技术问题是统计分析、咨询式的业务案例问题,以及解释趋势对业务的影响的产品洞察生成。在这些技术回合中,预计会出现一些案例类型的问题,如特定绩效指标的衡量和跟踪,或领导报告仪表板的自动化。这些问题一般都是问题策略类型的问题。
例题:
你的任务是标记在亚马逊上发布虚假评论的用户,然后交给建模团队做进一步分析。你最初会如何过滤在亚马逊上发布虚假评论的用户?
在 面试查询 上找到上面这个问题的最佳答案。
最后的提示和技巧
- 亚马逊业务分析师面试是技术和业务技能的结合,结合了对细节的关注、逻辑推理、沟通技巧,以及文化契合度和对团队中项目经理角色的兴趣。对于文化契合部分,关注上面的领导原则,因为这确实定义了文化。
- 通常还会有一个标杆人物在某个时候被带进面试(不是直接在团队中的人),他能够更加客观地确定长期是否适合亚马逊。
- 可能会有关于产品路线图、优先顺序和利益相关方一致性的问题。这些可以作为一个“你愿意怎么样”的问题出现,而不是典型的“T4 告诉我一个时间”类型的问题。例如,一个问题可能是预测黑色星期五促销的 Echo 设备的运行率、库存策略和折扣%。
- 一个最近的候选人有一个奇怪的经历,当他们被要求简洁地说出 3 个强有力的理由来拒绝我申请的角色。这些问题预计占所有面试小组的 10-15%。
感谢阅读
- 想要更多带有亚马逊解决方案的面试问题吗?更多内容请登陆面试查询 。
- 查看我的 Youtube 频道获取更多关于数据科学面试技巧和提示的视频。
- 点击这里阅读亚马逊的商业智能工程师指南
原载于 2020 年 5 月 26 日 https://www.interviewquery.com**。
亚马逊商业智能工程师面试
亚马逊商业智能工程师面试问题

图片来自 Unsplash
介绍
作为全球领先的科技公司之一,亚马逊利用大数据来改善其广泛的电子商务平台。从发现产品到购买,甚至到最终交付,每一次客户互动的数据都会被收集和分析。为了优化网站性能和改善客户体验,亚马逊将这些数据输入其推荐系统,该系统为每个客户显示最相关的产品。
创建个性化推荐屏幕的过程扩展到了亚马逊的所有产品和服务,包括 Alexa、Prime Video 和 Twitch。商业智能工程师将亚马逊的大型数据仓库转化为有意义的见解和改进。在亚马逊,数据驱动着每一个决策。
亚马逊的商业智能工程师角色

图片来自 Pixabay
在亚马逊,商业智能工程师与客户、分析师和数据库开发人员协同工作,将收集的数据转化为商业决策。这些工程师创造的解决方案有助于内部和外部客户数据的分析、自动化和报告。
通常情况下,亚马逊的工程师被嵌入到团队中,并与其他团队进行跨职能合作,旨在改善整体客户体验。该职位的职责范围从实施解决方案到数据建模,再到为业务领导提供指导。
亚马逊的商务智能工程团队
亚马逊足够大,拥有 40 多个部门,这些部门内有 100 多个内部团队。因此,高效地处理和分析收到的大量企业数据对亚马逊来说至关重要。商业智能工程师设计软件和企业平台来做到这一点,从而更容易从亚马逊收集的数据中得出有意义的结论。他们在团队中工作,并与亚马逊的内部客户一起提供支持关键业务流程的准确且可访问的数据。
根据分配到的团队,商业智能工程师可以执行以下功能:
- 运输风险&合规(TRC) :根据安全合规协议,一丝不苟地分析数据,寻找保证亚马逊客户和合作伙伴安全的方法。使用预测 ML 模型在数据中搜索安全相关趋势。
- 支付:利用海量客户支付数据,改善客户支付体验。使用概率模型和亚马逊的技术基础设施向客户实时展示产品。
- 亚马逊护理:开发数据驱动的模型,塑造亚马逊护理的未来。与业务和财务团队合作,改善亚马逊的决策流程。
- 自动化库存管理:开发分析和预测工具,准确量化每位亚马逊客户的购物体验。与亚马逊的内部客户(如软件开发团队)密切合作,大规模测试和验证这些工具。
- 物流商业智能和分析:使用世界上最大、最复杂的数据仓库之一。挖掘数据,收集客户洞察,提出建议,帮助领导根据数据趋势做出合理的商业决策。与软件工程师团队合作,简化或自动化这一商业智能流程。
- Prime Video(目录系统和运营组织):定义有用的业务指标,开发自助服务报告程序,进行实验,为有关亚马逊 Prime 视频目录结构的决策提供信息。
- Alexa: 使用 Alexa 的数据源来定义和自动化关键业务指标,并利用高级数据分析来了解客户行为。设计实验(A/B 实验)来测试客户参与策略。
- AmazonFresh / Prime Now 客户洞察&分析:利用数据帮助亚马逊更好地了解客户行为。开发新的和创新的分析技术,为产品战略和设计提供信息,以最大限度地提高客户参与度。
面试过程

图片来自 Unsplash
亚马逊商业智能面试与亚马逊的大多数其他技术面试类似,包括两次最初的电话面试和一次现场面试。
初始屏幕
最初的筛选主要是发现面试,以确定你是否适合该公司的文化和公司。面试官会问你一些关于你的背景和经历的问题。你必须准备好和面试官讨论你过去的相关项目。告诉他们你面临的任何挑战、特殊情况或问题,以及你是如何克服的。
样题:
- 给我一个你用数据做决定解决问题的例子。
- 告诉我你处理过的最复杂的问题。
- 告诉我你不仅实现了目标,而且大大超出预期的一次经历。
- 告诉我一个你能够在紧迫的期限内交付一个重要项目的经历。
- 在预测产品需求时,你会考虑哪些变量?
技术屏幕
该技术将通过一个现场编码平台进行。SQL 和 Python 技能的面试测试。预计大约有五个难度不断增加的 SQL 问题。
示例 SQL 问题:编写一个查询来标识团队规模最大的经理。

给定两个具有列类型和值的表
给你一个提示:这个问题比较直接。我们得到两张表,要求找出拥有最多员工的经理团队。
实际上,我们有几种方法可以做到这一点。方法一涉及使用 MAX 函数,方法二(这是我们选择的方法)涉及创建一个按经理姓名分组的排序列表。
我们选择方法二是因为它利用了 SQL 的最基本的方面来为手头的问题产生一个优雅的解决方案。
现场面试
这是最后一个面试阶段,包括 5 轮与商业智能工程师、数据科学家和招聘经理的一对一面试。每轮面试持续约 45 分钟,中间有午休时间。
这次采访中的问题跨越了数据科学概念的广度,并且是基于场景的(使用真实的亚马逊问题)。每轮面试都有一种行为问题,你会遇到很多“告诉我一次……”的问题。
总体而言,现场访谈分为:
- 统计和 SQL 商业智能工程师的技术面试。这次面试评估你的 SQL 和基本统计知识。它也有一些行为元素。
- Behavioral plus SQL 围绕领导原则的一些基于案例的问题面试。
- 案例研究面试和招聘经理的行为面试。
- 关注领导原则的行为面试
- 统计和产品意识采访一位数据科学家。这一轮面试评估您对数据科学概念和指标定义的基础知识。
注意事项和提示

图片来自 Unsplash
亚马逊商务智能面试流程旨在学习候选人利用数据仓库信息和高级分析工具将数据转化为有意义的信息的能力,这些信息可用于做出合理的商业决策。这次面试是各种数据科学理论的结合,它测试您的领域知识在应用于现实生活情况时的深度。
重温你的统计和概率知识,SQL 和 ETL 流程,以及商业智能解决方案平台,如 Tableau、MicroDesktop、SQL SSIS 和 AWS 。
此外,请注意,亚马逊会询问基于情境的问题,这将有助于围绕“星形”格式形成您的回答。熟悉亚马逊的 14 项领导原则,并围绕这些领导原则撰写一个故事,也会有所帮助。
星号代表:
- 情况。你或你以前的雇主面临的情况是怎样的?
- 任务。涉及哪些任务?
- 动作。你采取了什么行动?
- 结果。这些行动的结果是什么?
以下是最近刊登在《卫报》上的一个例子,它讲述了在面试中运用明星方法时的感受:
任务 :“我需要解决客户的即时查询,并找出正常流程中出现的问题。”
活动 :“我道了歉,了解了详情,传给我们的销售主管,销售主管在一小时内联系了客户。我调查了为什么这个问题没有得到回答。我发现这是一个错误的手机号码和一个没有被检查的通用电子邮件地址的组合。我让客户知道了这一点,并为她的下一笔订单提供了善意折扣。”
结果 :“客户不仅继续向我们订购,还发布了一条积极的客服推文。”
亚马逊商业智能工程师面试问题
- 产品来自地点 A 的概率是 0.8,来自地点 B 的概率是 0.6。客户从地点 A 或地点 B 收到产品的概率是多少?
- 如果有一个你以前从未参与过的项目,你怎么知道你在这个项目中使用的数据是正确的,你会得到正确的结果?
- OLTP 和 OLAP 有什么区别?
- 你将如何建立一个在线 A/B 测试场景,你将如何根据实验结果决定是否推出一个新的程序?
- 查询优化和性能调优有哪些不同的方式?
- 向非技术人员描述加入
- 你有一个网站,你需要把这个网站的流量洞察报告给产品经理。编写一个 SQL 查询来查找上个月访问过该网站的前 10 个人。
- PCA 中方差是如何计算的?
- 随机森林模型中的假设是什么?
- 如果我们想知道人们是否喜欢一个产品,当分析基于他们在网站上的行为时,你能看到任何统计问题吗?
感谢阅读
- 如果你有兴趣提高你的数据科学技能,请查看 面试查询 !
- 查看我的 Youtube 频道 获取更多面试指南,以及解决问题的技巧&。
亚马逊数据分析师访谈
亚马逊收集每个顾客的数据。数据分析师帮助弥合数据和决策过程之间的差距。

图片来自 Unsplash
亚马逊是世界上最大的在线市场之一,与传统市场不同,亚马逊是巨大的!里面陈列着成千上万的产品。仅在美国,亚马逊就控制了超过一半的在线市场,自 1994 年成立以来,它一直努力通过学习数据来实现其最终目标,即成为“一站式商店”。
在这个数据时代,亚马逊收集其网站上每一次客户点击和互动的数据;这包括顾客在看什么商品,他们在购物车里放了什么商品,他们想要什么质量,他们的偏好是什么,等等。
亚马逊汇编这些数据,并将其输入其推荐系统,以更好地满足客户需求,并通过推荐最符合他们偏好的产品来改善购物体验。亚马逊还利用数据做出商业决策并推动增长。Amazon 的数据分析师与技术和非技术内部团队合作,构建正确的分析来回答关键的业务问题
亚马逊的数据分析师角色

图片来自 Pixabay
亚马逊的数据分析师帮助在数据和决策过程之间架起桥梁。亚马逊的典型数据分析师角色包括数据分析、仪表板/报告构建以及指标定义和审查。亚马逊的数据分析师也为数据收集、编译、分析和报告设计系统。
数据分析师角色根据他们处理的数据类型而有所不同(例如,抽动数据、销售数据、失读症数据等)。),他们参与的项目类型,他们正在使用的产品,以及他们被分配到的团队。亚马逊的数据分析师还与包括工程、数据科学和营销在内的各种团队进行跨职能合作,为研究和业务领域提供数据驱动的见解。根据团队的不同,角色范围可能从基本的商业智能分析(如数据处理、分析和报告)到更具技术性的角色(如数据收集)。
所需技能
亚马逊的数据分析师职位需要知识和经验的专业化。因此,亚马逊只雇佣在数据分析、数据建模、高级商业分析和其他相关领域拥有至少 3 年行业经验的高素质候选人。
其他基本资格包括:
- 金融、商业、经济、工程、数学、统计、计算机科学、运筹学或相关领域的学士或硕士学位(博士优先)。
- 具有使用脚本、查询和数据仓库工具的经验,例如 Linux、R、SAS 和/或 SQL
- 在 Python、R 或 Java 等编程语言方面有丰富的经验。 ( 查看 Python 数据科学面试指南此处 )
- 具有查询关系数据库(SQL)的经验以及处理、优化和分析大型数据集的实践经验。
- 熟练使用微软 Excel,宏和 Access。
- 具有识别指标和 KPI、收集数据、实验和展示资料、仪表板和记分卡的经验。
- 具有商业智能和自动化自助报告工具的经验,如 Tableau、Quicksight、Microsoft Power BI 或 Cognos。
- 拥有 RDS、SQS 或 Lambda 等 AWS 服务的经验。
亚马逊的数据分析师团队

图片来自 Techspot
亚马逊是一家大型综合技术公司,提供许多产品和服务。因此,亚马逊有超过 100 个团队在各个领域开展工作。数据分析师与这些团队合作,帮助弥合数据和决策过程之间的差距。一般来说,亚马逊的数据分析师通过数据分析帮助简化决策过程。
根据亚马逊团队的不同,数据分析师的职责可能包括:
- Alliance (Twitch): 利用高级分析来塑造交易绩效的衡量方式,定义应该问什么问题,以及扩展分析方法和工具来支持 Twitch 不断增长的业务。此外,定义和跟踪 KPI,支持战略计划,评估新的业务机会,并通过数据改进/增强决策。
- 财务运营:为决策制定标准和特定的分析和报告。在分析、定义、创建和获取数据、生成指标和提供建议的框架内构建高层业务问题。自动化标准报告并推动数据治理和标准化。
- 搜索能力:利用先进的分析和预测算法,创建强大的、以客户为中心的搜索解决方案和技术。与工程和运营团队合作,通过识别和跟踪关于效率和成本的 KPI 来扩展亚马逊搜索服务。
- 教科书团队:构建强大的数据分析解决方案,改善客户体验。采用先进的数据挖掘概念、数据建模和分析来定义和衡量评估业务增长的指标。提取、集成和处理关键数据,以构建数据管道、自动化报告和仪表板,并利用自助服务工具为内部利益相关方服务。
- 欺诈和滥用预防:利用复杂的机器学习概念来减轻和预防欺诈。为新的和现有的指标、报告、分析和仪表板开发和管理可扩展的解决方案,以支持业务需求。实现来自不同来源的定制 ETL 管道,以获得更高的数据质量和可用性
- 购买:使用高级分析概念来确定亚马逊全球所有网站的库存量。开发和维护指标,暴露和衡量亚马逊购买系统的当前表现,识别和量化改进机会,利用亚马逊的海量数据识别和防止意外表现。与其他团队跨职能协作,特别是工程、研究、数据科学和业务团队,以促进未来创新。
- 工程成功(Twitch): 与 Twitch 的工程团队合作,提供数据分析,以改进和形成成功衡量指标,定义业务影响问题,并扩展分析方法和工具,以支持亚马逊不断增长的业务。
面试过程
亚马逊数据分析师面试流程遵循标准的亚马逊“STAR”(情景、任务、行动和结果)流程,略有不同。面试流程从与人力资源部的初步电话筛选开始。之后,将安排一次技术面试。一旦你通过了技术面试,最终的现场面试将会安排 5 到 6 次与招聘经理、团队成员和人力资源的一对一面试。
初始屏幕
这是提交申请后与人力资源部门进行的标准介绍性面试。面试为探索性,时长约 45 分钟;它侧重于展示你的背景、技能和与该职位相关的工作经验。你还可以了解亚马逊的工作文化和职位。
注:亚马逊强调其领导原则。根据亚马逊的领导原则,按照“星形”格式定制您的回答会非常有帮助。
样题:
- 你克服的最大挑战是什么?
- 你以前使用 SQL 的经验是什么?
- 告诉我你与经理意见不一致的时候。你是如何处理这种情况的?结果如何?
- 你将如何着手改善工作场所(绩效、安全、流程)?
- 描述一个长期目标以及你计划如何实现它。
技术屏幕

图片来自 Unsplash
这是对人力资源部成员或经理的技术性面试。亚马逊使用一个名为“Collabedit”的协作服务平台进行所有的技术面试。
这一轮面试中的问题围绕着一个 SQL 编码挑战、Excel,以及关于亚马逊领导原则(LP) 的问题。
这是另一个亚马逊 SQL 面试问题的例子
'users' table+-----------------+----------+
| columns | type |
+-----------------+----------+
| id | integer |
| name | string |
| created_at | datetime |
| neighborhood_id | integer |
| mail | string |
+-----------------+----------+'comments' table+------------+----------+
| columns | type |
+------------+----------+
| user_id | integer |
| body | text |
| created_at | datetime |
+------------+----------+
请考虑下面的表格:
编写一个 SQL 查询来创建 2020 年 1 月每个用户评论数量的直方图。假设容器桶分类间隔为 1。
给你个提示:
直方图代表什么?在这种情况下,我们感兴趣的是使用直方图来表示每个用户在 2020 年 1 月发表的评论的分布。
具有大小为 1 的容器桶的直方图意味着我们可以避免将频率分组到特定区间的逻辑开销。
例如,如果我们想要一个大小为 5 的直方图,我们必须运行一个 SELECT 语句,如下所示:
尝试在我们的 interactive SQL 编辑器 中解决这个问题
现场面试
亚马逊数据分析师的现场面试与该公司的其他现场面试非常相似。进入面试流程这一阶段的候选人要经过 5 到 6 次与招聘经理、团队经理、数据分析师、数据工程师和统计员的一对一面试。面试之间有午休时间。亚马逊数据分析师现场面试由数据科学概念、SQL 编码和著名的亚马逊领导原则组成。
数据分析师访谈笔记和提示
亚马逊数据分析师面试主要包括数据科学概念。它的结构独特,可以评估候选人分析亚马逊数据的能力,以提供新的见解,从而塑造商业决策。在回答问题时利用亚马逊的“星形”格式可以给你带来优势。为了更好地了解亚马逊的 STAR 流程,请在面试查询上查看亚马逊的 BI 工程师面试流程。
亚马逊的面试官希望你用之前的工作经验来支持你的答案。尝试用过去工作经验中的例子回答每个问题;这可能包括你所面临的挑战,你所使用的方法或途径,以及你是如何克服这些挑战的。
亚马逊数据分析师面试问题:
- 你最喜欢 SQL 中的哪些函数?
- 解释 OLAP 立方体和一个解释商业分析应用的用例。
- 什么是数据规范化和非规范化?
- 当更新了具有主键的关联表时,具有外键的表的数据会发生什么变化?
- 级联参照完整性你懂什么?
- 解释线性回归和逻辑回归的区别,并举例说明。
- 什么是自变量,如果我的模型中有三个自变量,而没有因变量,该怎么办?
- 为多元变量或多元回归模型写一个方程。
- 给定一个有 n 个观察值的样本,你如何检验一个假设?
- 方差分析的假设有哪些。
- 对于小样本,您会使用什么测试?
- 什么是零假设?
- 什么是 1 型和 2 型错误?
- 使用下表编写一个查询,以检索在过去十天内注册并且消费超过 100 美元的客户的数据。编写另一个查询来检索在过去七天中花费超过 100 美元的客户的数据。第一个表是客户购买表,有五列:客户 id、购买日期、产品 id、单价和购买的单位。第二个表是一个客户细节表,有两列:客户 id 和注册日期。
- 从 100 个数字中按升序产生十个连续数字的概率是多少?
- 如何在 SQL 中合并两个表?
- 用任何一种语言(VBA,Python,Java)写一个函数来计算斐波那契码。
感谢阅读
- 如果您想了解更多独家面试解说,请查看 面试查询 !
- 查看我的 Youtube 频道 获取更多面试指南,以及解决问题的技巧&。
- 在面试查询博客上找到更多亚马逊面试指南,如 亚马逊商务智能工程师面试 和亚马逊商业分析师面试 。
原载于 2020 年 7 月 7 日https://www.interviewquery.com。
亚马逊数据科学家访谈
亚马逊数据科学面试问题

亚马逊 pcworld.com
亚马逊是世界上最大的互联网公司和最大的在线零售商之一。凭借如此多的产品和服务,亚马逊一直在市场上寻找积极创新的数据科学家,以满足其不断增长的数据需求。
作为一家公司,亚马逊以通过技术创新对成熟行业进行颠覆性创新而闻名。它的愿景是成为地球上最以客户为中心的公司。
需要公司或特定技能面试指南?
数据科学的作用是什么?
亚马逊的数据科学家的角色取决于具体的团队。亚马逊是一家大型企业集团,有许多团队从事不同的产品和服务。
这些团队包括 AWS(亚马逊网络服务)、Alexa、供应链优化技术(SCOT)中的预测团队、NASCO 团队(北美供应链组织)、中英里规划研究和优化科学(mmPROS)团队等等。
一般要求是:
- 为机器学习(ML)和自然语言(NL)应用程序设计、开发、评估、部署和更新数据驱动模型和分析解决方案。
- 开发先进的数据管道,构建准确的预测模型,并部署自动化软件解决方案来提供预测见解。
- 考虑到业务影响,研究、设计和改进模型。
所需技能
- 统计学、数量金融学、经济学、计算机科学、数学、物理学、计算生物学、运筹学等任何数量领域的硕士学位)或同等的实践经验。
- 2 年以上的分析工作经验(高级数据科学家 4 年以上),涉及机器学习技术、数据提取、分析和沟通。
- 精通统计软件包和函数式编程语言(如 R、Stata、Matlab、Python、SQL、C++或 Java )(资深数据科学家有 4 年以上的工作经验)。
- 具有设计和实现机器学习算法的经验,这些算法根据特定的业务需求量身定制,并在大型数据集上进行了测试。
- 在具有大规模复杂数据集的商业环境中进行数据挖掘和使用数据库的经验。
- 优秀的口头和书面沟通技巧,能够有效地向研究科学家、工程团队和商业受众倡导技术解决方案。
数据科学家有哪些类型?
亚马逊有三种与数据科学相关的主要工作角色。以下是亚马逊数据科学技能图表对面试和他们日常角色的描述:

来源于面试查询
亚马逊上的数据科学团队类型如下:
数据分析/商业智能
该角色主要负责创建预测、识别战略机会,并提供知情的业务相关见解。数据可视化工具,如 Tableau 和数据仓库技能,往往是必需的。
机器学习研究科学家
该职位主要关注 NLP、深度学习、视频推荐、流数据分析、社交网络等领域的前沿研究。一般来说,这个职位从博士到国际知名的研究人员都有。
阅读更多关于 亚马逊机器学习面试 。
数据/应用科学家
作为最受欢迎和最普遍的角色,数据科学家深入大数据集,以构建大规模的模拟和实验系统,构建优化算法,并利用亚马逊的前沿技术
数据工程师
这是一个团队,他们开发了在公司内外使用的工具或产品。想想 AWS 或者 Alexa。该角色与 ML 工程师职位有很大重叠。经常需要像 C++/Java 这样的面向对象语言技能。
亚马逊采访

blog.aboutamazon.com
亚马逊的面试流程与其他科技公司类似。首先要注意的是,亚马逊不做 带回家的挑战。相反,面试流程包括招聘人员或招聘经理的初步电话筛选,然后是技术电话筛选,最后是现场面试,通常分为五个阶段,午餐时进行非正式面试。
初始屏幕
最初的电话面试通常由亚马逊的招聘人员或招聘经理进行。这是一个基于简历的电话面试,通常会检查你的简历以及在团队中的位置。鉴于亚马逊是世界上最大的组织之一,招聘经理将解释他们的团队是做什么的,以及他们在组织中的位置。
技术屏幕
技术筛选在最初的电话筛选之后进行。这个面试会涉及到编码,统计,机器学习。您至少会遇到两个编码问题,一个涉及 SQL 另一个是算法编码类型问题。编码部分是通过共享代码编辑器完成的。记得花时间和面试官回顾一下你的思考过程。还有一个关于“方法”的部分,详细描述了你是如何得到解决方案的,以及你为什么使用你所使用的步骤。
此外,面试官会问一个机器学习概念问题。这通常是相当会话式的,但是记得温习一般的 ML 概念。
示例技术屏幕问题
我们得到了两张桌子。表 A 有一百万条带有 ID 和 AGE 字段的记录。表 B 有 100 条记录,也有两个字段,ID 和 SALARY。
假设在表 B 中,平均工资为 50K,中位数工资为 100K。
****SELECT** A.ID,A.AGE,B.SALARY
**FROM** A
LEFT **JOIN** B
**ON** A.ID = B.ID
**WHERE** B.SALARY > 50000**
假设上面的查询运行,大约会返回多少条记录?
现场面试
通过技术电话筛选后,招聘人员将安排现场面试。大部分题目会涉及 A/B 测试,更多的机器学习概念性问题,探索性数据分析,以及一些编码问题。
这一阶段包括 5 或 6 次连续的面谈,每次都是一对一或两人面谈;一名经理和一名初级数据科学家。总的来说,现场面试将持续大约六个小时。
这个过程是这样的:
- 评估文化契合度的行为访谈
- 涉及数据分析和 ab 测试的技术面试
- 基于 SQL 的数据科学家访谈
- 算法和优化
- 机器学习和建模案例研究面试
每个阶段都可能会测试你对亚马逊领导原则的了解,以及你的批判性思维和解决问题的能力。
提示和技巧
- 亚马逊 很在意 技术能力说到数据科学的角色!记得温习求解算法,优化查询,并记住多少机器学习算法在引擎盖下工作。****
- 亚马逊根据他们的 14 领导原则评估每一个申请者。试着记住所有 14 条领导原则,因为你会被期望在行为面试中展示这些原则。这里的建议是想一想你过去的项目或经历,以及你是如何展示这些原则的。
- 练习建模、机器学习和商业案例问题。亚马逊可能会问许多类型的模糊案例问题,在这些问题中,他们希望你将机器学习应用到商业场景中。查看我们如何处理关于亚马逊产品的案例问题。
亚马逊数据科学面试问题
- 给定一个大字符串和一个小字符串,写一个程序找出小字符串是否可以由大字符串的字母生成。
- 一件商品位于位置 A 的概率为 0.6,位于位置 b 的概率为 0.8。在亚马逊网站上找到该商品的概率是多少?
- 实现两个数组的并集和交集(以有效的方式)。请注意,两个给定数组的元素可以重复,但不能在并集和交集数组中重复。
- 你在 HDFS 有两份文件。一个是包含两列的日期范围:开始日期和结束日期。另一个文件有两列,分别是日期和访问者数量字段。编写 Spark 代码,给出访问者数量最多的日期范围。
- 使用数组实现循环队列。
- 套索和岭回归有什么区别?
- 当用户浏览亚马逊网站时,他们会执行许多操作,点击按钮,进行搜索等等。如果他们的下一步行动是购买,最好的建模方式是什么?
- K-means 是如何工作的?你会选择哪种距离度量?如果不同的特性有不同的动态范围呢?
- 什么是生成式和判别式算法?他们的优缺点是什么?通常使用哪种算法,为什么?
- 如何修改超过 10 亿行的表?(查看 模拟面试)。**
感谢阅读
- 想要更多带有亚马逊解决方案的面试问题吗?在上查找更多面试查询 。
- 查看我的 Youtube 频道获取更多关于数据科学面试技巧和窍门的视频。
- 更多阅读请上 面试查询博客 上 Python 和 SQL 数据科学指南 。
亚马逊机器学习工程师面试
了解亚马逊的文化、招聘流程和面试问题

你好,我是尼克🎞 on Unsplash
目录
介绍
这家以网上书店起家的公司现在是一家价值一万亿美元的电子商务巨头。亚马逊可以说是世界上最大的电子商务巨头之一,同时,它也专注于云计算,数字流媒体和人工智能。
毫不奇怪,世界上最大的科技公司之一也是整合机器学习和人工智能应用程序以改善公司运营和产品的领导者。事实上,正是因为机器学习,亚马逊才能向超过 1 亿亚马逊 Prime 订户出售超过一千二百万件产品,并在一到两天内交付。
在这篇文章中,我们将进一步了解机器学习工程师面试是什么样的。
机器学习工程师的角色
亚马逊的机器学习工程师处理大量数据,为各种客户建立机器学习(ML)和深度学习(DL)模型。他/她将与亚马逊的专业服务顾问合作,从头到尾交付 ML/DL 项目,并在之后帮助模型的操作化。
所需的技能和资格
基本资质
- 数学、统计学、计算机科学或类似定量领域的学士学位
- 相关领域 5 年以上工作经验
- 具有使用各种预测和决策模型、数据挖掘技术以及开发此类模型的工具的经验
首选资格
- 具有构建/操作高可用性、分布式数据提取、摄取和大型数据集处理系统的经验
- 使用 Linux/UNIX 处理大型数据集的经验
- 具有红移、S3、EC2、数据管道和 EMR 等 AWS 技术的经验
- 结合深厚的技术技能和业务知识,足以与我们客户组织内的所有级别和学科进行交流
机器学习角色有哪些类型?
在亚马逊,有多个机器学习和数据科学角色横跨整个组织。这些角色包括数据科学家、应用科学家、机器学习工程师和研究科学家。虽然它们在性质上相似,但也有独特的不同之处。
亚马逊的数据科学家专注于提供数据驱动的见解,是业务和技术方面的纽带。他们负责分析大型数据集并对其建模。
亚马逊的机器学习工程师是构建机器学习和深度学习模型的专家。他们不仅为亚马逊建立模型,也为 AWS 上的其他大型企业建立模型。除了建立模型,亚马逊的机器学习工程师还负责实现模型,并为生产做好准备。
亚马逊的研究科学家通常拥有更高的教育水平,通常是硕士或博士。科学家们被期待去挑战极限,也就是说去拓展可能的极限。研究科学家将对新旧技术进行研究,以确定它们在实践中是否有益。
应用科学家通常也有更高的教育水平。这是一个比亚马逊的研究科学家略高的职位,需要通过编码栏。应用科学家专注于增强亚马逊客户体验的项目,如亚马逊的自动语音识别(ASR)、自然语言理解(NLU)、音频信号处理、文本到语音转换(TTS)和对话管理。
面试过程
初始屏幕
第一次电话面试由招聘人员或招聘经理进行,只是为了更好地了解对方。面试官通常会给你一个角色和面试过程的预演,他们还会问你一些关于你的简历和过去经历的标准问题。他们希望看到你对亚马逊感兴趣,并且你有这个职位所需的经验和能力。
技术屏幕
最初的电话屏幕之后是技术屏幕,通常有一个机器学习工程经理。在这一次,他们会问你一系列关于机器学习概念的一般性问题。这些问题通常是关于基本的机器学习概念,如不同机器学习模型的解释,偏差-方差权衡和过度拟合。
技术屏幕的第二部分将是一个编码问题。你可以使用任何你喜欢的语言。
查看亚马逊机器学习面试中的示例问题和解决方案。
现场面试
最后是现场面试,通常包括五到六轮面试。这些面试由行为和技术面试问题组成。
行为问题:在每一轮面试中,你都会遇到一个行为问题,这些问题会涉及你过去的工作经历、你为什么要离开现在的工作以及你如何在团队中工作。你也应该预料到他们会问一个 LP 问题(领导原则)——确保你知道亚马逊的 14 条领导原则!
技术问题:你应该预计至少会有几轮涵盖机器学习概念和编程概念的技术会谈。众所周知,过去的受访者会被问到面向对象的设计问题,所以请确保您在这两个领域都有所提高!
下面是 面试查询 上的一些亚马逊机器学习面试问题及解答。
感谢阅读!
数据分析生命周期
如何避免“为了分析而分析”

Benoit Beaumatin 在 Unsplash 上拍摄的照片
在当今数据科学大肆宣传的世界中,组织越来越多地从他们收集的数据中寻找答案。好消息是,这意味着更多的商业领袖正在转向数据驱动的决策。然而不幸的是,作为一名数据分析师/科学家,这往往会让你徒劳地寻找数据中可能存在或不存在的答案。
通常,人们会查看可用的数据并试图辨别模式。但是这种模式是真实的,还是仅仅是数据窥探的产物——也就是说,在数据中广泛搜寻,直到一些有趣的东西出现?统计学家中流传着一句话:“如果你折磨数据的时间足够长,迟早它会招供。”
[1] Peter Bruce 和 Andrew Bruce,数据科学家实用统计学:50 个基本概念 (2017),O'Reilly Media,Inc .
不仅仅是分析
作为数据分析师和科学家,我们的工作不仅仅是编写代码和讲述数据的故事,还要设定我们的领导层和业务利益相关者的期望。我们是数据和业务两个世界之间的守门人,我们必须流利地说这两种语言。
在进行任何分析之前,我们必须首先了解我们的客户(内部或外部)所面临的问题。具体来说,他们试图回答什么样的商业决策,我们的分析会带来什么价值?思维过程往往是“如果我们把数据交给正确的人,让他们仔细查看足够长的时间,我们所有的问题都会得到解决”。这是一个错误的希望,通常会导致花费时间编写代码和构建可视化,最终会被丢弃。这是最好的情况。更糟糕,也更昂贵的是,让你的客户使用这些分析来为他们的业务做出决策。
术语“GIGO”(垃圾输入,垃圾输出)经常在数据社区中使用。我们知道,如果数据是在没有良好的实验设计的情况下收集的,或者如果数据是不完整的,那么结果将是垃圾。同样的咒语也适用于分析生命周期的过程:不清楚、没有针对性或不存在的业务问题将导致糟糕的分析,从而导致糟糕的业务决策。
作为看门人,我们的工作是减缓尽快获得结果的欲望。我们的工作是与客户坐下来,帮助他们确定他们想要得到回答的确切问题。只有到那时,我们才应该通过现有的资料来确定这个问题是否能得到部分或全部的答案。这些都应该不用写一行代码就能完成。如果没有数据分析生命周期中的这一重要步骤,我们将带领客户走上一条他们自以为知情的道路,但实际上,我们只是在传播错误信息。由于业务和分析师之间的这种关系不受约束,这种影响只会被放大。
数据分析生命周期

在 Unsplash 上由 Helloquence 拍摄的照片
为了带领我们的客户走上正确的道路,我们需要从技术上后退一步,开始了解他们的世界。数据分析生命周期可以帮助我们做到这一点。这是一个框架,我用它来确保我不会花费无数的时间来构建一些不会被使用或用于错误目的的东西。每当我有一个新客户或者我当前客户的新要求时,我都会经历这个过程。
- 了解问题——你的客户有哪些痛点?这如何适应他们的整体业务战略?这就是数据科学的“领域知识”发挥作用的地方
- 确定决策并明确问题——与你的客户坐下来,询问他们需要做出的决定。这些决策可能是对问题本身的决策,也可能是最终使客户能够解决该问题的一组较小的决策。然后,让他们指出需要回答哪些问题才能做出决定。如果他们不确定或者问题有点不清楚,帮助他们制定这些问题。记录决策和问题,并确保它们得到验证
- 检查数据 —确保你拥有的数据足够充分,并且是以正确的方式收集的,以回答你的客户同意的问题。如果没有,那就从头开始。回到客户那里,解释你所拥有的数据并不充分,或者(1)如果你知道数据的存在,就询问你所需要的数据,或者(2)提出一些你可以用你所拥有的数据来回答的替代问题
- 做分析 —现在,有趣的部分。在这里,您可以使用所有我们感兴趣的技能和技术。我不会详细讨论这个问题,因为已经有很多文章概述了这个主题。然而,我要说的是,在深入研究之前,要仔细考虑哪些模型/算法能够充分回答客户的问题
- 提前解读结果 —在审查分析结果时,始终保持公正的观点非常重要。企业可能想要一个特定的结果,我们经常想通过给他们想要的东西来取悦他们。我们需要客观地看待结果;我们不是在那里操纵输出,我们是在那里翻译结果
- P 对结果不满并获得反馈——用企业关心的术语翻译你的分析结果。像“MSE”和“Recall”这样的术语只是行话。在这里,你在技术和商业上的流利是必不可少的。将调查结果以可操作的观点呈现给你的客户;他们会感激你理解对他们来说什么是重要的。然后,如果他们问技术问题,请随意深入其中一些方面。最后,确保会议结束时客户已经准备好做出商业决策。如果他们还不习惯这样做,在会议结束前过渡到第 2 步
- 根据需要重复 —如果您的分析在第 6 步中导致更多问题,请返回并重复这些步骤。这通常是你和客户之间持续关系的过程。在这一点上,只要您(1)仍然完全理解客户的业务问题,(2)在演示结果期间讨论了新的决策和问题,以及(3)您认为已经很好地掌握了数据中的内容,就可以随意跳过步骤 1-3
结论
您会注意到,数据分析生命周期中只有一个步骤涉及实际的分析。我没有低估做分析所需要的努力;我要展示的是,分析本身——无论这个过程有多难或多长——只是更大拼图中的一块。继续磨练你的技术技能,跟上最新的技术——但也要明白,我们的工作不仅仅是编写代码和构建可视化。
如果你遵循这些步骤,你将开始看到与你的客户发展新的关系。他们将开始看到你不仅仅是分析,而被扔进兔子洞的过程和“只要浏览数据,直到你发现有趣的东西”将最终结束。
分析师的偏见

分析师——新的河马?(来源: Unsplash )
为什么实验和数据使用不能保证公正的决策。
“小心房间里的河马” —自上而下的、基于直觉的决策的风险和危险在商业界是众所周知的。实验和基于数据的决策被广泛认为是管理企业的正确方法。
理由很充分:网飞、谷歌和 Booking 等领先的实验者表明,基于事实和证据而非直觉做出决策,可以带来非凡的商业成功。
但是,如果在这一发展过程中,河马(收入最高的人的观点)不再是一个值得害怕的东西呢?如果应该帮助对抗自上而下决策的人取代了他的位置会怎样?
如果分析师成为决策过程中新的偏见因素会怎样?
让我说清楚。对新想法、建议和方法有自己的看法再自然不过了。我们都有自己的认知偏差。但是我们不能因为所谓的循证决策的安全框架而忽视这一事实。

来源: Unsplash
偏向分析结果
分析师的责任是描绘一幅清晰的企业状况图,并为决策提供信息。分析师有很多方法可以有意或无意地影响最终的决策。我喜欢把这些分为有意识的和无意识的偏见。
意识偏见
让我们来看看第一种,在这种情况下,分析师会做出影响其结果的深思熟虑的决策。有意识的偏见与分析师的个人观点密切相关。这可以是关于一个新的营销活动或新产品功能。分析师是否相信某个特定的想法会显著影响后续研究的进行。如果真的进行了。让我们来看看一些有意识偏见的潜在来源:
“你能给我们一个这个指标的粗略估计吗?”
做出猜测。评估和意见的问题或多或少会引入偏见。显然,你不可能记住所有的数字,最好的办法是回到你的办公桌前,检查这些指标,然后向你汇报。但是检查每一个指标花费太多时间。很多时候,我们只是相信我们的直觉,这与我们对特定想法的个人观点密切相关。所以你可以根据经验猜测这个数字可能是多少。在这一点上,分析师已经可以对一个计划是否被执行以及每个人的期望产生实质性的影响。第一个数字出来充当的锚定数字,并设定利益相关者可能在未来参考的期望,以评估一个想法的潜力。
“这个页面的流量太低了,不值得再深究了。”
给出个人观点。有时,我们可能根本不想提供数字,而是给出个人意见。虽然这种观点(希望)是基于事实和分析师的经验,但它仍然可能与一个人对所讨论的观点的主观看法密切相关。
c)研究深度。研究开始后,问题是:
分析师什么时候有足够的信息对特定问题给出好的建议或概述?
当然,您总是可以更深入地研究某个特定主题,以获得更多证据来支持决策过程。分析师可能倾向于更深入地挖掘某个领域,以证明或反驳他们有强烈意见的某个观点。与此同时,我们可能会在一个研究问题上投入较少的精力,因为这个问题的结果可能不那么令人兴奋,或者必须做出的决定看起来很琐碎。
d)设定目标。分析和实验领域本身会邀请分析师和任何在其中工作的人在某些时候引入偏见。是为 AB 测试设置正确的重要性或功率水平,还是选择合适的指标来衡量新功能或活动的成功?在一定程度上,这些都是分析师为了产生任何结果而必须做出的主观决定。但同时,这些也会对研究的实际结果产生重大影响。

来源: Unsplash
无意识偏见
分析师的主动决策不会引入无意识的偏见。这种偏见与个人对某个特定想法或研究问题的看法联系不太紧密,但对结果的影响程度相同。属于这一类别的偏见包括:
a)编程错误。可能是 SQL 查询中的错误、过滤熊猫数据帧时的错误逻辑语句或不正确的正则表达式。当我们试图从面前的数据中获得洞察力时,所有这些编程错误都会发生。除了语法错误之外,这种编程错误在运行我们的代码时完全不会被注意到,因此会对我们的分析结果产生重大影响。
b)数据处理错误。通常,我们想要检查以回答特定研究问题的数据没有可用的格式。在我们可以使用统计模型从数据中获得洞察力之前,我们可能必须清理它,选择和设计适当的特征,并最终执行数据转换。所有这些行为都会使我们的数据集产生偏差,从而使我们的决策偏向一个或另一个方向。
c)对数据的错误解读。我们可能已经完成了处理和建模数据集的所有工作。但最终我们还是会从眼前的结果中得出错误的结论。经典的曲解是混淆相关性和因果关系,或者对两个参数的关系得出错误的结论。
那么分析师是不可信的吗?
网飞、亚马逊和谷歌等当今最有价值的公司表明,实验和数据必须取代直觉,成为决策的基础。
因此,信任数据和分析师的输出是至关重要的。建立和维护这种信任是分析师的责任。分析师必须尽最大努力提供无偏见、信息丰富的见解,以支持决策并推动业务朝着正确的方向发展。
因此,当务之急是意识到自己的偏见,并尽可能克服它们。
当被要求做一个粗略的估计时,或者当你想深入研究一个特定的主题时,后退一步。反思你的决定和思考过程,试着对你当前的问题保持中立的观点。
为了避免无意识的偏见,采用软件工程领域的一些最佳实践会有所帮助:在你的查询和笔记本中使用单元测试,开始结对编程,并要求同事审查你的代码和方法。
喜欢这篇文章吗?那么你可能也会喜欢我的其他帖子:
脸书和他的同事如何在 AB 测试中克服互联用户的挑战。
towardsdatascience.com](/ab-testing-challenges-in-social-networks-e67611c92916) [## 找到能让你的用户回头客的特性
如何通过分析用户数据,向你最忠实的客户学习如何提高你的应用或网站的留存率。
treatwell .工程](https://treatwell.engineering/finding-the-feature-that-makes-your-users-come-back-b6cffaa3e001)
需求的分析层次
数据团队的优先化框架:如何最大化影响和最小化遗憾

当我加入 Square 时,我被一个已经上市一年但没有专门的分析支持的产品所吸引。
正如您所料,该团队有大量积压的好奇心:
- 我们应该跟踪哪些指标?
- 为什么这个指标低于我的预期?
- 我们有 XYZ 的数据吗?
- 我有这个 A/B 测试的想法!可以帮我实现吗?
- 使用 XYZ 功能的用户比例是多少?
- 我们能用机器学习吗?我听说集群是了解我们用户群的好方法!
坦率地说,我不知所措。我应该从哪里开始?现在最重要的事情是什么?三个月后,一年后我该做什么?
渴望一个框架来指导我,我发现了人工智能的需求层次,模仿马斯洛的需求层次 T21。虽然细节没有直接映射到产品分析,但我意识到层次结构的总体概念有。
需求的分析层次
需求分析层次结构的一般思想是,在您完成上一步的基础工作之前,您不应该向上移动层次结构(即,在定义和跟踪指标之前没有深入分析,在开始收集和清理数据之前没有构建仪表板,等等)。

需求层次分析。作者图片
1.收集
等等,我们怎么没有跟踪我们的旗舰功能的使用情况?!
这可不好玩。你不能制造事后才希望存在的数据!
在做任何事情之前,分析师的首要任务应该是确保基本的事件记录和关键实体的数据建模。这可以通过你自己的产品直觉和利益相关者对你的数据的关键问题来了解。
决定记录什么和如何记录可能是令人生畏的。考虑为您的关键实体绘制一个实体关系图(ERD) ,并给予工程LATAM(LogAllTAPSAnd【相关】 M etadata)的基本事件记录指导。
2.干净的
嘿 Ryan,你能快点帮我拉这个吗?
当然,让我从某个不存在的原始表中选择;
您的工程团队可能会在不同的窄表中发出数据。在开始分析之前,你应该将你的数据转换成更宽的、标准化的表格。这将使你的分析和仪表板更具可扩展性,更容易构建。
可以从每个用户每天的汇总表开始。你的利益相关者可以通知专栏:问他们他们希望知道但无法回答的常见问题。
3.定义和跟踪
为什么这个月的收入低于我的预期?
现在你的数据已经组织好了,是时候分解你的漏斗了。
通常人们最关心的是活跃用户和$$。为了理解是什么推动了这些,你需要将你的产品漏斗映射到流程图上。以这个基本的 SaaS 产品为例:
>收入=(活跃用户数)(每用户平均订阅费用)*
> >【活跃用户=(新转化)+(留存用户)
> > >新转化率=(免费试用)(平均转化率%)*
诸如此类。一旦你绘制了这个流程图,并建立了跟踪每个指标的仪表板,你就可以分析你的漏斗了。
4.分析
有趣的流失分析,瑞安,但我们的保留率是最好的。皈依是我现在最关心的事。
一旦我的团队定义并跟踪了我们的每个漏斗指标,我们就给每个指标分配一个红色/琥珀色/绿色状态。我们通过将每个指标与内部基准、外部基准和我们的直觉进行比较来做到这一点;这帮助我们确定了最大的机会领域。
例如:如果保持率超过基准,为什么还要深究?
一旦你有了你最有机会的领域,你可以对每个领域做一些基本的启发式分析。当通过群组、获取渠道和基本用户统计数据可视化一个指标时,通常有一个值得注意的趋势。
5.优化和预测
那么,你终于要做我听说的那个聚类分析了?
你在收集数据,你已经清理了数据。您已经定义了您的指标,并且正在跟踪它们。您已经分析了您的指标,并概述了需要改进的关键领域。
恭喜你:你现在可以做“性感”的事情了。😎
A/B 测试 可以让你相信一个用户体验比另一个更好。如果你一直在遵循需求层次分析,这是非常及时的:用户越多,你的实验产生的统计可信度就越高。
有监督的机器学习 可以帮助你理解什么是用户行为的预测因素——例如,什么行为或人口统计数据导致转化或持续使用。
无监督的机器学习 可以帮助你理解你的用户中你没有意识到的模式(你好,聚类!)。
然而,提醒一句:仅仅因为你已经到达层级的顶端,并不意味着机器学习是你所有问题的最佳解决方案。简单的试探法通常会产生更好的结果,因为它们实现起来更快,通常也更容易理解。
概括起来
当你的新旗舰功能没有被跟踪时,不要做解释 XGBoost 模型的 SHAP 价值的分析师。

作者图片
分析设置指南回顾
2020 年构建可扩展分析平台所需的一切
我很震惊地告诉你下一句话:我读了一家公司的免费电子书,真的很喜欢。我通常对免费电子书评价很低,认为它们要么太长,要么太模糊,没有用。例如,雪花的关于数据仓库的傻瓜书有 60 页长,但它如此专注于抽象,以至于从未提及红移、大查询甚至雪花。
来自 Holistics 的分析设置指南是一个完全不同的故事。它概述了分析堆栈的不同部分:数据仓库、导入数据、转换和报告数据。(注意:它没有涵盖像机器学习这样的更深入的应用)。至关重要的是,它不只是抽象地描述这些部分,它还讨论和比较了当今可用的工具和服务(它于 2020 年 7 月出版)。

书籍封面,经 Holistics 许可使用
如果你已经熟悉现代分析和数据工具,这里不会有太多新的东西。这本书的目的不是开辟新的领域,而是概述分析堆栈的不同部分以及它们如何组合在一起,以及可用的不同工具和它们如何进行比较。在相关的地方,它给出了历史信息,以便您可以了解过去的方法来自哪里,为什么使用它们,以及为什么它们可能不再合适。对我个人来说,它真的成功了,极大地帮助了我在头脑中组织事情。
在此之前,我从未听说过 Holistics ,与他们没有任何关系。他们是一家总部位于新加坡的分析公司,生产的数据转换和报告产品似乎与 Looker 非常相似。他们确实在书中提到了自己的产品,但只是在适当的地方。他们的博客也确实不错。
内容
第一章-简介
- 分析堆栈和数据仓库用途的高级概述。
- 如果您刚刚开始构建分析基础架构,需要一些基础设置。
第 2 章-数据仓库
- 比较最流行的云仓库(红移、雪花和 BigQuery)以及何时开始使用一个。
- 有像 Stitch 和 Hevo 这样的 ETL 工具可以用来从大多数服务导入数据。
- 他们强烈建议将所有原始数据加载到您的仓库中,并在其中进行任何转换(ELT 与传统的 ETL 相反)。讨论了为什么 ETL 曾经是标准方法、数据湖,以及为什么 ELT 现在是更好的选择。
第 3 章-建模数据
(建模是指转换或聚合数据,而不是制作预测模型)。
- 数据建模层的概念。这是我听人多次提到过的事情,但以前并不清楚。涵盖了空间中可用的工具(dbt、Looker、Dataform、Holistics)。
- Kimball 建模,它为什么流行,以及他的书《数据仓库工具包》的哪些部分仍然相关。例如,Kimball 有几种方法来处理缓慢变化的维度表(SCD),但现代的方法是 Maxime Beauchemin 的just-daily-snapshot-everything方法。
- 这是一个真实世界的例子,说明了 Holistics 如何从他们的网站上模拟事件数据,以及他们何时以及为什么对其进行了两次总结。
第 4 章-分析/报告您的数据
- 讲述了一个虚构的数据分析师自 90 年代中期以来的三次 BI 浪潮。它涵盖了他们必须使用的 BI 工具、仓库基础设施和公司流程。这对我来说是这本书最好的部分之一,比 Looker 的原帖更有用。它帮助我理解了旧工具放在哪里,以及为什么有些人仍然非常依恋它们。这尤其有用,因为许多企业仍处于第二次浪潮。
- 比较了当前的商业智能工具,并解释了如何对它们进行分类和思考。讨论了 Tableau、Power BI、Looker、Holistics、Chartio、Mode、Sisense 等等。
- 采用弧用于描述分析在组织中如何随时间演变:即席查询,然后是静态报告和仪表板,然后是面向业务用户的自助服务分析。
第五章
仅仅是结论,并没有引入任何新的东西。
还有什么比这更好的呢
关于建模数据,有两件事我希望能更好地解决。我就这些问题询问了 Holistics,他们很友好地提供了答案,如下所列。
1)在本书中,数据建模仅在使用专用工具(如 dbt、Looker)的上下文中提及。与仅仅在仓库中保存 SQL 视图的简单方法相比,使用工具有什么好处?
整体主义者回应:在这篇 twitter 帖子中,合著者 Huy Nguyen 描述了 4 个好处:
- 依赖跟踪(沿袭):建模工具会给你可视化的依赖图。
- 自助服务:像 Looker 和 Holistics 这样的工具允许你定义可以被你公司的其他人使用的定制测量。
- 数据目录:您创建的表/模型可以在当时或以后用元数据来丰富。然后可以将这些元数据放入发现工具中。
- 版本控制:您可以对它们使用 git,这样就可以看到变更的历史。
2)如何避免为需要由最终用户计算的指标(如平均订单价值)复制业务逻辑?用户可能希望通过任意数量的拆分来查看它,因此您不能对它进行预聚合。使用一个既建模又报告的工具(Looker,Holistics)是唯一的方法吗?使用 dbt 这样的仅转换工具的公司做什么?
Holistics response (取自直接消息):这与自助式 BI 相关,位于报告层,因此像 Looker、Holistics 和 Metabase 这样的工具将很好地解决这个用例。如果您只使用 dbt,简单的解决方案是选择一个如上所述的自助式 BI 工具。请注意,“数据建模”位于转换层(dbt,dataform)和报告层(Looker,Holistics)。
评级:🐙🐙🐙🐙
4.5 章鱼。这本书有许多分支,它将把你的许多不同的知识片段摘下来,并整齐地重新组织成一本布局合理、有注释的剪贴簿,以备将来使用。
描述性数据分析的古代艺术。
这是生死攸关的事。
你可能在某个时候听说过,人类非常擅长探测环境中的模式。这是真的——几千年来,我们的大脑一直在根据观察到的数据进行推断和预测。
举例来说:杰拉尔德,一个旧石器时代的穴居人,遇到了一个野生老虎样本,它们都试图把他当晚餐。杰拉尔德对野生老虎的数量作了一个推断,并得出结论说,他将来可能应该避开它们。

Boris drob ni 在 Unsplash 上拍摄的照片
去找别的零食吧,伙计!
对于我们的史前同行来说,数据分析是生死攸关的事情,即使在今天,它也能决定一家公司的成败。如果一家公司不能生产出 1)与消费者口味相关、2)随着时间推移而发展的商品或服务,那么它被竞争对手超越、发现自己的收入流不断萎缩只是时间问题。
最大最赚钱的公司并不是那些拥有最佳营销策略的公司。他们不一定拥有最尖端、最高端的产品。他们是最擅长收集和利用数据来制定战略决策的公司,通过提供领先的产品来智胜竞争对手。很难不认识到数据在现代工业中的作用和重要性。但是,这些公司到底是如何处理这些数据的?提取这些至关重要的、超越市场的洞察力的流程是什么?
真相
作为分析一部分的细节和方法取决于其目的。也许我们有一个全新的数据集,我们想了解它的特性;探索潜在的模式和趋势,并找到一种可视化数据的方式来最好地揭示它们。也许我们想试着从我们收集的样本中推断出一些关于人口的信息。或者,我们可能希望获得一组过去的观察结果,并从中提取一些信息,以便更好地预测未来。
让我们通过依次访问每一种类型来了解更多关于这些类型的数据分析。在这篇文章中,我们将重点关注描述性数据分析,然后再跟进推理性和预测性数据分析的主题。
举例说明
语言只能解释这么多。让我们挑选一个非常简单的数据集,实际上对其进行描述性数据分析,以更好地说明我们将要谈论的一些观点。我们将使用一个经典的数据集,包含属于三个不同物种的 150 朵鸢尾花的测量数据。这个数据是美国植物学家 Edgar Anderson 在 1935 年收集的。如果你想继续下去并尝试一些你自己的分析,你可以下载 R 并加载数据集包来轻松访问这个数据集。

照片由 Olga Mandel 在 Unsplash 拍摄
在 R 控制台中,让我们加载数据并开始分析。
# Load datasets package
library(datasets)# Display first few rows of iris dataset
head(iris)

呼叫头的结果(虹膜)
描述性数据分析旨在以一种揭示其潜在趋势和模式的方式呈现数据。这通常是更复杂的分析的第一步,也难怪——如果你不能总结和理解你的数据,你有什么业务去尝试应用更复杂的工具呢?
这种分析通常包括对以下内容的讨论:
1.集中趋势的度量。这包括平均值、中值和众数等统计数据。这可以帮助我们了解什么是典型的或“平均的”数据值。
2.衡量价差。也许不如第一个明显;数据的传播也同样重要。有了这些统计数据,我们可以更好地了解数据的分布情况——它是集中在一个小范围内还是分散在各处?它是不是两端都聚在一起了?
集中趋势测量
让我们考虑数据中的萼片宽度。萼片是保护和支撑花瓣的花瓣状结构,通常是绿色的。萼片宽度通常取什么样的值?
iris$Sepal.Width

哇哦!
这有点难以接受——与我们将来会遇到的情况相比,这是一个很小的数据集!看起来宽度范围从 2 厘米到 4 厘米,但是不容易区分什么值是最常见的,什么值是典型值。让我们画一个图来可视化萼片宽度的分布,并绘制平均值的图。
# Calculate mean value of sepal widths
mean(iris$Sepal.Width)# Calculate median value of sepal widths
median(iris$Sepal.Width)

萼片宽度的平均值和中值分别为厘米
# Set plot window size
options(repr.plot.width=6, repr.plot.height=4)# Plot histogram of sepal widths
hist(iris$Sepal.Width, main=”Histogram of sepal width for 150 irises”,
col=”slateblue1", xlab=”Sepal width (cm)”)# Plot a vertical line at the mean value
abline(v=mean(iris$Sepal.Width), col=”red”)# Label the mean value line
text(3.35,35,”Mean = 3.06",col=”red”)

他们说一张图片胜过千言万语,对于数据来说更是如此。
- 平均值为 3.1 厘米;
- 中值(中值)为 3.0cm;和
- 我们可以看到,值的模态范围(最常见的观察值)在 2.8 cm 和 3.0 cm 之间。
直方图还帮助我们将这些集中趋势的度量放入其余值的上下文中。
但是这些数字能告诉我们的关于其余分布形状的信息是有限的。我们可以从上面的直方图中看到,萼片宽度取一系列不同的值。我们如何量化数据的分布,或者它围绕平均值变化了多少?
传播的量度
我们通常通过使用标准差(或方差,简单来说就是标准差的平方)来量化数据围绕其平均值的分布程度。当数据分布在很宽的数值范围内时,标准差很大,而当数据集中在很窄的范围内时,标准差很小。什么是大的什么是小的?这是一个好问题——只有在与另一个分布比较时,才真正有可能解释标准差。
# Set plot window size
options(repr.plot.width=8, repr.plot.height=4)# Set up plot area for two side-by-side histograms
par(mfrow=c(1,2))### HISTOGRAM 1# Plot histogram of sepal widths, as before
hist(iris$Sepal.Width, main=”Histogram of sepal width for 150 irises”,
col=”slateblue1", xlab=”Sepal width (cm)”, cex.main=0.9)abline(v=mean(iris$Sepal.Width), col=”red”)text(3.4,35,”Mean = 3.9",col=”red”, cex=0.75)### HISTOGRAM 2# Plot histogram of sepal lengths
hist(iris$Sepal.Length, main=”Histogram of sepal length for 150 irises”,
col=”slateblue1", xlab=”Sepal length (cm)”, cex.main=0.9)abline(v=mean(iris$Sepal.Length), col=”red”)text(4.9,30,”Mean = 5.8",col=”red”, cex=0.75)

sd(iris$Sepal.Width)
sd(iris$Sepal.Length)

萼片宽度和长度的标准偏差分别为厘米
我们可以通过肉眼判断我们的萼片长度的分布比萼片宽度的分布更分散——看 x 轴,萼片长度在大约 4 厘米的范围内变化,而萼片宽度在大约 2 厘米的范围内变化。计算标准差使我们能够更精确地量化这种差异——我们萼片长度的标准差大约是萼片宽度的两倍。
另一个衡量分布的重要指标是分布的偏斜。不对称是衡量不对称数据分布情况的指标。大多数人都熟悉正态分布——对称的钟形曲线,它存在于许多自然分布中,如身高、体重、鞋码、智商等。正态分布在这个讨论中很重要,因为它没有偏斜——它是对称的,它的均值、中值和众数都相等。直观地将新的数据分布与正态分布进行比较并计算其偏差通常很有用。这有助于我们确定在平均值的两侧观察到极高或极低数值的可能性是否增加。
# Set plot window size
options(repr.plot.width=8, repr.plot.height=4)# Set up plot area for two side-by-side histograms
par(mfrow=c(1,2))### HISTOGRAM 1# Plot histogram of sepal widths, as before
hist(iris$Sepal.Width, main=”Histogram of sepal width for 150 irises”,
col=”slateblue1", xlab=”Sepal width (cm)”, cex.main=0.9, prob=TRUE)# Plot empirical distribution of sepal widths
lines(density(iris$Sepal.Width), col=”red”)# Label empirical distribution
text(3.8,01.1,”Empirical shape of\nsepal widths distribution”,col=”red”, cex=0.70)### HISTOGRAM 2# Initialise random seed for reproducibility
set.seed(2021)# Take 150 sample values from a normal distribution with the same mean and standard deviation as the
# distribution of sepal widths
normal_sample <- rnorm(150, mean(iris$Sepal.Width), sd(iris$Sepal.Width))# Plot histogram of simulated values
hist(normal_sample, main=”Sample of 150 values from a normal distribution”,
cex.main=0.75, col=”royalblue”, prob=TRUE, cex.main=0.9)# Add a line showing theoretical density of normal distribution
xs <- seq(1.5,4.5,0.01)
lines(xs,dnorm(xs,mean(iris$Sepal.Width), sd(iris$Sepal.Width)), col=”red”)# Label theoretical normal distribution density line
text(2.3,0.9,”Theoretical shape of\nnormal distribution”,col=”red”, cex=0.70)

# Calculate skew of each distribution
coeff_skew_sepal_widths <- (sum((iris$Sepal.Width — mean(iris$Sepal.Width))³) / length(iris$Sepal.Width)) / sd(iris$Sepal.Width)³
coeff_skew_normal_samples <- (sum((normal_sample — mean(normal_sample))³) / length(normal_sample)) / sd(normal_sample)³# Use skews to calculate coefficients of skewness
coeff_skew_sepal_widths
coeff_skew_normal_samples

花瓣宽度和正态分布样本的偏态系数
r 没有计算分布偏斜度的内置函数,所以我们不得不依赖数学定义——如果这不是你喜欢的,不要太担心这些公式。需要注意的是萼片宽度的偏斜系数大于零,这表示正偏斜。这意味着与对称正态分布相比,我们更有可能观察到极高的值。为了比较,我们还计算了正态分布中 150 个值的样本的偏态系数。如我们所料,该值接近于零。
从细节上退一步
最后,让我们花点时间来考虑一下描述性数据分析的现实背景。虽然我们可以理解所有数字的含义这很好,但值得注意的是,数据分析师不太可能是在现实世界的商业场景中做出战略决策的人。更有可能的是,分析师将向利益相关者报告,例如经理和部门主管。这些涉众可能对理解分析的来龙去脉的技术知识有限,或者对细节的兴趣有限。如果有必要,我们应该做好解释的准备,但对他们来说,更重要的通常是大局、“所以怎样”、洞察力和他们可以采取的潜在行动。寻找传达数据集特征和重要性的最佳方式可能是数据分析过程中最具挑战性的部分之一,但无疑是最重要的部分之一,也是最有收获的部分之一。
这导致了描述性数据分析的最重要的部分之一:以这样一种方式可视化数据,以便以直观和可理解的方式揭示其真实性质并揭示模式和趋势——即使对于非技术观众也是如此。数据可视化本身就是一个领域。一个专业制作的图形可以比单纯的文字更好地传达思想、模式和趋势。对于一些高质量的可视化示例,请查看由 FlowingData 和fivethirtyeeight等作者所做的一些工作。
那又怎样?
没有数据支持的决策不是决策,而是猜测。投机者可能偶尔会有好的表现,但是用正确的技术梳理和分析了他们可用的数据的玩家将能够用证据支持他们的选择,并更持续地赢。长期价值是由拥有可靠的数据收集和分析流程的企业创造的。如果公司的各个部门能够通过沟通和协作来利用他们从数据中获得的所有洞察力,那么公司将会表现得更好,并最终为利益相关者和更广泛的社会创造更好的结果。描述性数据分析是这一过程的开始。
请继续关注更多关于数据分析的内容。下次见!
更多信息和积分
Andrew Hetherington 是英国伦敦的一名见习精算师和数据爱好者。
图片:Boris drob ni 拍摄的老虎照片。奥尔加·曼德尔的虹膜照片。都在 Unsplash 上。
所有的情节和代码输出都是作者使用 R 和 RStudio 创建的。
Iris 数据集来源:Anderson,1936 年;费希尔,1936 年
苹果数据科学家访谈
苹果数据科学面试问题

The Verge:苹果标志
苹果公司是世界上最大的科技公司之一,设计、开发和销售消费电子产品、计算机软件和在线服务。苹果一直需要有创造力、热情和敬业的数据科学家,他们可以加入任何数量的团队。从 Siri 基于研究的人工智能开发团队到 iCloud 基于云的架构开发团队,苹果一直在缓慢但稳步地建立数据科学团队,以处理每天积累的海量数据。
苹果公司的数据科学职位是什么?
与其他大型科技公司一样,苹果公司数据科学家的角色变化很大,取决于你被分配到的团队。苹果公司数据科学家的实际头衔是最接近于全栈数据科学家 。这意味着这项工作将需要从分析到机器学习软件设计到简单工程的一切。
鉴于苹果是一个庞大的多企业集团,使用的数据科学技能组合将因团队而异,因为有许多跨各个部门的分析团队,如营销、财务、销售等,以及更多基于机器学习和深度学习的产品和服务团队,如 Siri、云服务,甚至硬件。
所需技能
在大多数情况下,苹果更喜欢雇佣至少有几年数据科学家经验的申请人。要求如下:
- 3 年以上将数据科学应用于实际业务问题的经验(高级职位 5 年以上)
- 对机器学习技术的实际理解,如回归、时间序列分析、聚类、决策树技术,以及分类算法的经验。
- 关系数据库的工作知识,包括 SQL,以及 Spark 和 Hadoop 等大型分布式框架。
- 精通数字和脚本编程语言,如 SQL、Python、Java、C++、PHP 或 Perl
- 出色的演示技巧,将复杂的分析和概念提炼为简明的业务要点
苹果公司的数据科学家有哪些类型?
从技术上讲,苹果雇佣的数据科学家没有特定类型。苹果根据不同团队的需求和所需技能进行招聘。有数据科学家从事大量的分析工作,跨许多部门以及机器学习的重要角色。根据团队的不同,苹果公司数据科学家的职能可能包括:
- 与业务团队协作,发现见解和机会,理解需求,并将这些需求转化为技术解决方案。
- 与数据工程师和平台架构师合作,实施强大的生产实时和批量决策解决方案。
- 使用机器学习来自动化流程(如评分)。
- 使用机器学习、用户模式识别和数据建模领域的最新技术,设计、开发和管理大数据驱动的预测模型,以提高用户参与度。
- 处理大规模数据;使用 Sparks SQL 操作和提取数据。
苹果面试流程
苹果公司的面试过程相当标准化。面试流程从人力资源部的初步电话筛选开始,然后是招聘经理面试,以评估进一步的兴趣和角色匹配,以及简短的技术电话筛选。最后,在现场面试之前,根据资历和职位类型,可能会有一个带回家的任务。

技术筛选和带回家挑战
下一步是招聘经理的电话技术筛选,可能还有一个带回家的挑战。技术招聘经理屏幕是在共享编码环境中完成的。
技术屏中的题目分别是 通用 Python 习题 、SQL 题、和数据科学推理题。重要的是,要在技术屏幕上讲述你的思维过程,并清楚地传达你的假设。这里测试你利用基本数据结构和算法概念的能力。这里需要的关键技能是能够提供全面的解决方案并快速分析解决方案的运行时复杂性。
苹果数据科学带回家挑战赛规定了三天的完成时间。通常,挑战将是建立模型并根据数据集进行预测的机器学习问题。
苹果数据科学家技术筛选问题示例:
- 给定一个整数列表,找出数组左半部分之和等于右半部分的索引。
- 你如何从数以千计的产品中找到数以百万计的用户,每个人都有数百次交易,并把他们分成有意义的群体?
- 给定一个字符串列表,用 Python 写一个函数,返回所有变位词的字符串。
试试苹果在采访查询上问的 SQL 问题

我们得到了一张产品采购表。表中的每一行代表一个用户购买的产品。
编写一个查询来获取通过购买额外产品而追加销售的客户数量。
请注意,如果客户在同一天购买了两件商品,这不算追加销售,因为它们是在相似的时间段内购买的。
现场面试
最后一步是现场面试。面试小组通常由 5 到 6 个面试者组成,他们都是被面试职位的团队成员。每次面试由一至两名面试官组成,并与招聘经理安排在苹果园区共进午餐。请注意,虽然午餐面试可能是非正式的,但它是面试中非常符合文化的一部分。
现场说明
- 现场访谈在从一个访谈到另一个访谈的反馈中是分开的。如果你在一次面试中表现不好,反馈不会伴随你进入下一次面试。
- 请记住,苹果公司的数据科学家这个头衔跨越了与数据科学相关的许多团队。考虑到全栈数据科学职位的广泛要求,询问招聘人员现场面试的内容会很有帮助。如果数据科学职位更侧重于分析,将有助于练习大量基于 SQL 和产品案例的问题。如果该职位需要建模和机器学习,复习 机器学习系统设计和实现的概念。
- 一般来说,当面对白板编码面试时,苹果面试官似乎更喜欢关于链表、数组/字符串和系统设计的问题。
- 苹果公司的数据科学家可以获得很高的报酬,这取决于你的级别。第 4 级个人贡献者的示例工资可能是 15 万到 18 万美元的基本工资,外加 10%的奖金和四年内 20 万到 30 万美元的股票。股票的刷新者每年也可能非常高。
苹果数据科学面试问题
- 描述 L1 正则化和 L2 正则化之间的差异,特别是关于它们对模型训练过程的影响的差异。
- ACF 和 PACF 的含义和计算方法是什么?
- 如果客户端必须每分钟发送位置数据,您会如何设计客户端-服务器模型?
- 写一个函数来检测一棵二叉树是否是左右子树的镜像。
- 假设您有一个过去五年按月分组的时间序列数据集。你如何发现这个月和前一个月之间的差异是否显著?
- XGBoost 如何处理偏差-方差权衡?
- 假设您有 100,000 个文件分布在多台服务器上,您想处理所有这些文件?在 Hadoop 中你会怎么做呢?
感谢阅读
- 想要更多带有苹果解决方案的面试问题吗?查找更多关于面试查询 。
- 查看 Youtube 频道 获取数据科学模拟面试、指南以及技巧和诀窍。
预训练模型的应用和优势 Kaggle 的 DogsVSCats

凯文·Ku 上的 Unsplash
对于图像识别任务,使用预先训练的模型是很好的。首先,它们更容易使用,因为它们为您提供了“免费”的架构此外,他们通常有更好的结果,并且通常需要较少的培训。
为了看到这一理论的实际应用,我将使用 Kaggle 的 CatVSDogs 数据集来尝试讨论使用不同方法的结果。
这些步骤如下:
1) Imports2) Download and Unzip Files3) Organize the Files4) Set-up and Train Classic CNN Model 5) Test the CNN Model6) Set-up and Train Pre-Trained Model7) Test the Pre-Trained Model
1。进口
在任何机器学习项目中,导入都是必要的。对于这个项目,有各种各样的进口是必需的。
import warningswarnings.filterwarnings("ignore", category=UserWarning, module="torch.nn.functional") from google.colab import drivedrive.mount('/content/gdrive') # connects to data stored on google driveimport osos.chdir('/content/gdrive/My Drive/')import shutilimport reimport torchimport torchvisionfrom torchvision import transformsimport torch.nn as nnimport torch.nn.functional as Fimport torch.optim as optimfrom google.colab import filesimport zipfile
虽然这些导入中的大部分在以后才会用到,但是最好现在就全部导入。这些进口往往分为两类:PyTorch 的进口和 google collab 所需的进口。
Google Colab 为每个人提供了一个免费的 GPU,所以使用起来非常棒,尤其是对于初学者。使用下面的代码检查您是否正在使用 GPU。如果它不打印 cuda,打开你的 GPU!
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") print(device)
PyTorch,类似地,倾向于对初学者倾斜,因为它有一个更容易的界面。然而,它仍然可以完成任何机器学习任务!
2。下载并解压文件
这些数据将直接从 Kaggle(一个开源的机器学习网站)中获取。文件可以在这里找到。按下载全部。然后,将 zip 文件拖到您的驱动器中,并将其放在任何所需的位置。
不要直接从 Google Drie 或通过你的电脑解压。这将需要大量的时间。因此,在 Google Drive 中编写一个解压文件并组织它们的方法是对你最有利的。
在解压缩之前,创建一个 DogsVS Cats 文件夹。
os.mkdir('/content/gdrive/My Drive/DogsVSCats')
在这里,我将存储解压缩后的数据。
要解压缩,运行以下命令。
with zipfile.ZipFile('/content/gdrive/My Drive/dogs-vs-cats.zip') as zf:zf.extractall('/content/gdrive/My Drive/DogsVSCats')
这将提取 dogs-vs-cats 压缩文件,并将其放在新文件夹中。之后,我们需要解压缩 test1.zip 和 train.zip 文件。您可以删除示例 submission.csv 文件;在本教程中,我们不需要它。
要解压缩 train.zip 文件,请运行以下命令:
with zipfile.ZipFile('/content/gdrive/My Drive/DogsVSCats/train.zip') as zf:zf.extractall('/content/gdrive/My Drive/DogsVSCats/')
要解压缩 test1.zip 文件,请运行以下命令:
with zipfile.ZipFile('/content/gdrive/My Drive/DogsVSCats/test1.zip') as zf:zf.extractall('/content/gdrive/My Drive/DogsVSCats/')
这可能需要一些时间,但是之后所有的文件都应该在它们相应的文件夹中。
3。整理文件
一旦所有文件都被解压缩,根据它们的真实分类来组织它们是至关重要的。对于这个数据集,我们将文件组织到“dog”和“cat”文件夹中。
制作所需的文件夹。
os.mkdir('/content/gdrive/My Drive/DogsVSCats/train/cat')os.mkdir('/content/gdrive/My Drive/DogsVSCats/train/dog')
设置分类。
train_dr= '/content/gdrive/My Drive/DogsVSCats/train/'train_dog_dir = '/content/gdrive/My Drive/DogsVSCats/train/dog'train_cat_dir = '/content/gdrive/My Drive/DogsVSCats/train/cat' files = os.listdir('/content/gdrive/My Drive/DogsVSCats/train')
然后,组织。
train = os.listdir("/content/gdrive/My Drive/DogsVSCats/train")for f in files: catSearchObj = re.search("cat", f) dogSearchObj = re.search("dog", f) if catSearchObj: shutil.move(f'{train_dr}/{f}', train_cat_dir) print("moved!-cat") elif dogSearchObj: shutil.move(f'{train_dr}/{f}', train_dog_dir) print("moved!-dog")
实际上没有来添加打印语句,但是看到这种运动很酷!
接下来,我们需要将一些训练数据移动到验证数据集中。
os.mkdir('/content/gdrive/My Drive/DogsVSCats/val/cat')os.mkdir('/content/gdrive/My Drive/DogsVSCats/val/dog') val_dog_dir = '/content/gdrive/My Drive/DogsVSCats/val/dog'val_cat_dir = '/content/gdrive/My Drive/DogsVSCats/val/cat'
从 train dog 文件夹中重新定位 1,000 个文件,并将其发送到验证文件夹。
files = os.listdir(train_dog_dir)for f in files: valDogSearch = re.search("5\d\d\d", f) if valDogSearch: shutil.move(f'{train_dog_dir}/{f}', val_dog_dir)!ls {val_dog_dir} | head -n 5
现在,对 cat trained 文件夹执行相同的操作。
files = os.listdir(train_cat_dir)for f in files: valCatSearch = re.search("5\d\d\d", f) if valCatSearch: shutil.move(f'{train_cat_dir}/{f}', val_cat_dir)!ls {val_cat_dir} | head -n 5
这一部分的最后一步是转换数据,以便更容易训练和扫描。
transforms = torchvision.transforms.Compose([torchvision.transforms.Resize((224,224)),torchvision.transforms.ToTensor()])train_image_folder = torchvision.datasets.ImageFolder('/content/gdrive/My Drive/DogsVSCats/train/', transform=transforms)train_loader = torch.utils.data.DataLoader(train_image_folder, batch_size=64, shuffle=True, num_workers=4)val_image_folder = torchvision.datasets.ImageFolder('/content/gdrive/My Drive/DogsVSCats/val/', transform=transforms)val_loader = torch.utils.data.DataLoader(val_image_folder, batch_size=64, shuffle=True, num_workers=4)
4。设置和训练经典 CNN 模型
现在,我们到了实际训练部分!在这个变体中,我们将使用一个经典的 CNN 模型。
该模型如下:
class DogDetector(nn.Module): def __init__(self): super().__init__() self.cnn_layers = nn.Sequential( nn.Conv2d(3, 6, kernel_size=3, stride=1, padding=1), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2), nn.Conv2d(6, 12, kernel_size=3, stride=1, padding=1), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2),
)
self.linear_layers = nn.Sequential( nn.Linear(256*7*7*3, 196), nn.Linear(196, 1), nn.Sigmoid(),
) def forward(self, x): x = self.cnn_layers(x) x = x.view(x.size(0), -1) x = self.linear_layers(x) return xdog_detector = DogDetector()dog_detector.cuda()
现在,将 dog_detector 设置为类,并将其放在 GPU 上。
训练模型是一个简单的过程。因为我们使用 Kaggle 文件只是为了测试,而不是为了直接竞争,所以我们不需要测试文件。相反,我们可以基于验证集进行训练,而不需要提交给 Kaggle。
optimizer = optim.Adam(dog_detector.parameters(), lr = 0.0001)loss_func = nn.BCELoss().cuda()EPOCHS = 5for epoch in range(EPOCHS): print(f"epoch: {epoch}") for i, data in enumerate(train_loader): if i % 50 == 0: print(f" batch: {i}") X, y = data y = y.type(torch.FloatTensor).view(len(y), -1).cuda() dog_detector.zero_grad() output = dog_detector(X.view(-1, 3, 224, 224).cuda()) loss_val = loss_func(output, y) loss_val.backward() optimizer.step() print(f"loss: {loss_val}")
损失值倾向于在大约 0.4-0.6 左右徘徊。
5。测试 CNN 模型
因为我们是在没有 Kaggle 的情况下进行测试,所以我们需要自己检查准确性,这给了我们更直接的结果。这可以通过以下方式实现:
correct = 0total = 0with torch.no_grad(): for data in val_loader: X, y = data output = dog_detector(X.view(-1, 3, 224, 224).cuda()) correct_sum = output.round().transpose(0, 1).cpu() == y correct += correct_sum.sum().item() total += len(y)print(f"Accuracy: {round(correct/total, 3)}")
测试时,准确率往往徘徊在 73.6%左右。这并不坏,但远远称不上伟大。
6。设置并训练预训练模型
预训练模型的设置要简单得多。
首先,下载预先训练好的模型。
model_resnet18 = torchvision.models.resnet18(pretrained=True) new_lin = nn.Sequential( nn.Linear(512, 1), nn.Sigmoid() )model_resnet18.fc = new_lin
冻结训练不需要的层。
for name, param in model_resnet18.named_parameters(): if("bn" not in name): param.requires_grad = False
然后,将模型发送到 GPU。
model_resnet18.cuda()
就是这样!现在是再次训练的时候了。
optimizer = optim.Adam(model_resnet18.parameters(), lr = 0.0001)loss_func = nn.BCELoss().cuda()EPOCHS = 5for epoch in range(EPOCHS): print(f"epoch: {epoch}") for i, data in enumerate(train_loader): if i % 50 == 0: print(f" batch: {i}") X, y = data y = y.type(torch.FloatTensor).view(len(y), -1).cuda() model_resnet18.zero_grad() output = model_resnet18(X.view(-1, 3, 224, 224).cuda()) loss_val = loss_func(output, y) loss_val.backward() optimizer.step()print(f"loss: {loss_val}")
损耗范围在 0.2–0.4 之间,明显优于 CNN 模型。
7。测试预训练模型
correct = 0total = 0with torch.no_grad(): for data in val_loader: X, y = data output = model_resnet18(X.view(-1, 3, 224, 224).cuda()) correct_sum = output.round().transpose(0, 1).cpu() == y correct += correct_sum.sum().item() total += len(y)print(f"Accuracy: {round(correct/total, 3)}")
测试该模型给出了 97.3%的近似准确度,这明显优于 CNN 模型。
总而言之,这次测试的结果是显而易见的;出于几个原因,对许多图像识别任务使用预训练模型是有益的。第一个原因是,使用预训练模型需要较少的训练,并且在构建模型架构时需要较少的努力。相反,模型的定义是“免费的”另一个积极的方面是准确性。使用预先训练的模型比使用定制的卷积神经网络(CNN)要精确得多。因此,当执行图像识别任务时,从预先训练的模型开始是有意义的,因为这几乎总是最佳的行动过程。
逼近的范式
~ 神经网络如何将软件速度提高几个数量级 ~

【TL;DR —神经网络将一个程序的整个输入→输出转化为一个压缩图像文件,该压缩图像文件“逐像素”重新生成,以模拟程序,从而实现多方面的加速。切勿解包整个图像;切勿再次运行实际软件。]
每一个软件都可以被重新想象成一个单一的、巨大的 镜像文件 。怎么会?每个 输入到你软件的 都是一个特定的‘像素坐标’(这个图像存在于一个多维空间,等于输入和程序状态可用的不同比特数;尽管如此,它仍然是一个将输入坐标映射到输出值的静态表示,从这里开始就是一个“图像”)。同时,该特定位置的“颜色”就是软件的 输出位 。让我们看一个例子:
2/5/9
0/3/5
7/2/4
我们有一个 3×3 的“像素”阵列,每个像素存储一个位串“值”。如果这个数组代表你的软件,那么对(2,3)的软件的一个 输入串 将选择第二列第三行的‘像素’:那里的值是‘2 ’,这将是你的 输出 的位串。类似地,将(1,3)输入到您的软件中会得到“7”的输出。不需要实际计算你程序的细节,你可以使用这个‘输入→输出图像’来模拟你的代码!然而,大多数现实世界的程序对此来说太复杂了。你永远不可能存储可能的输入和输出的整个地图。
直到一个鬼祟的把戏使用我们的新算法——君主:神经网络!进入细节…你拥有的庞大软件可以被分解成几个“种类”的操作:
- 算术&布尔——这些是传统计算机擅长的愚蠢、快速、机器代码类型的运算。让他们继续做下去。还有!这些往往是测试“阈值”所需的各种操作,阈值决定了软件如何对输入进行解析。布尔弦和波纹加法器将大块的工作送到正确的地方。
- 静态协议,通用操作,这些是全世界每个人都在他们的软件中做的事情。日期和时间、帐户和日志、调试等。它们有一个已知的、适当的功能,然而它们是以成千上万种独特的易受攻击或功能失调的方式实现的。
- 混乱、微妙、复杂、集成——这些大块的软件做出了特殊的酱料。在这里,复杂的程序展开,以实现竞争对手努力模仿。然而,这也是很多代码出错的地方。实现细节带来了多方面的改进,单一的错误会让后门微开。这些是神经网络可以搅动它们的连接体锅将我们的整个软件输入→输出流压缩成微小的、折叠的、隐藏的图像的区域。
因此,对于已经被解析为“混乱”的软件的部分,计划是形成该段程序操作的“镜像文件”。每个像素的“坐标”是你可能输入到该段的位串。每个像素存储的“颜色”是您希望模拟的片段的输出位。假设你已经为那段代码形成了一个精确的镜像文件,你现在可以做一个快速查找而不是再次运行软件。这就是它如此重要的原因。考虑到数千万人使用多少常见的应用程序和软件包,这样的查找表将能够模拟每年数十亿小时的软件运行时间。
然而,你如何着手找到那个巨大的软件输入输出图像的所有相关片段,并有效地存储它呢?神经网络以三种方式承担这些任务:
- 代码指定的边界条件 —神经网络从一些演示中学习得越来越好。这让我们可以像训练小狗一样训练它们,直到它们有能力为止。他们还能告诉我们什么时候他们不确定某事,以及什么时候多个不同的神经网络不同意他们的评估。所有这些一起,让神经网络 suss-out**一个输入值可以改变多远,然后该改变对输出值产生影响;在连续函数逼近中,输入和输出之间的相对变化率是多少?无需检查数十亿例运行时值;如果你训练一个神经网络为你完成第一遍通读,代码本身应该告诉你它是如何工作的。
- 测试&公共使用数据——然而,由于程序状态和用户输入的细节,其他软件的运行等等,软件会遇到奇怪的错误和行为。无论何时发生什么事情,你都会想把那点状态空间知识添加到你的‘输入→输出图像’,除非是你不想模仿的 bug 或黑客。[您可以通过用户反馈,简单地 纠正bug 的 输出位 ,而永远不需要重新工具化原始代码!"只有当实际代码做正确的事情时,我们才模拟它."另外,花些空闲时间在输入空间中漫游,沿直线行进以‘刮擦’拓扑,识别从程序行为中出现的边界条件,而这些边界在代码中并不明确。输入→输出图像的那些出现的* 分区 将产生最大的压缩比。它们只是块状的、简单的形式,是复杂的代码雕刻的副产品。**
- 压缩试探法&去噪**——整个过程中最具创新性的部分是使用神经网络来压缩令人瞠目结舌的“输入→输出图像”,以这样的方式,你只需要“解压缩”对应于你特定输入的像素,而永远不需要看到整个图像,甚至当你第一次发现它的时候。这个过程是通过一个三级神经网络康加线实现的:一个参数生成器,一个启发式解码器和一个嵌入/去噪器。在解码器和去噪器之间,有一组生成器必须复制的“校正位”;同样,如果您正在处理必须以完美保真度重新生成的输出,则在解码器之后需要另一组“校正位”。我将在这篇文章的剩余部分解释这些部分的为什么和如何。**
校正位和近似拟合
神经网络在执行几乎任何事情的近似方面都是惊人的。最近在超级计算机上运行的模拟物理模拟器的工作产生了 20 亿倍的速度提升!几周前的另一个用例求解偏微分方程的速度快了 1000 倍…几乎所有的偏微分方程,嗯,几乎所有我们仍然无法理解的东西。然而,一旦你要求神经网络遵循一个精确的公式,它就会乱套。其他团队也在致力于此。为神经网络提供了组装的“构建模块”,其中每个模块都是显式和精确的操作符。这个虚构的不准确性还有一个片段,我们必须关注: 它是输出空间的模糊覆盖 。什么?
在给定各种输入的情况下,来自生成对抗网络(GAN)的生成器将模拟大量接近它所看到的真实人脸分布的肖像。它并不精确,但它确实“覆盖”了整个面部分布,做出了它看到的所有种类的东西。我们可以在几个“修正位”之间楔入近似空间覆盖的撬棍来支撑我们的模糊地图!想象你正在传递信息,在每个阶段解码它们,你可以看到模糊近似器是如何使这一切发生的:****
首先,爱丽丝收到一条加密的信息。这是经常发生的程序输入的“散列”;这些输入值中的一大部分用于计算软件中这个特别复杂的步骤。Alice 使用她的“解码器环”(我们的“参数生成器”)将那个“散列”翻译成一组地址**。一些地址告诉她将使用哪些试探法和种子,然后是她需要改变的位的,接着是去噪器的地址,最后是任何其他的最终校正位。整个配方将贯穿整个链条,现在…****
因此,Bob 收到消息并取出 Alice 建议的合适的启发式解码器(它只是超级服务器上存储的许多解码器中的一个),将“种子”转换成更复杂的位数组。试探法是“拆开”存储在输入空间位置的输出位。然而,却是模糊的。存在严重缺陷。接下来,我们将让它通过另一个神经网络——去噪器。
卡罗尔收到鲍勃粗糙的、噩梦般的涂鸦,斜眼看了看,认出那是一条鱼,开始润色边缘和纹理,使它看起来像它应该的样子。然而,鲍勃的一些错误是如此的错误,以至于他们实际上把卡罗尔搞得一团糟!她做出错误的更正。可恶。这就是为什么,在 Bob 的启发式算法和 Carol 的去噪器之间,我们会插入一些“校正位”。[我们必须找到这些,对于我们压缩的每一件事;对于一个只使用一次的文件或程序来说不值得,但是对于常用软件来说,可以。]这只是去噪后剩余的误差的梯度。这里:
假设卡罗尔在润色鲍勃的手指画版本时犯了一个错误;我们问'鲍勃的图像中的哪些部分需要有所不同,以便卡罗尔能够正确地纠正'少数几个比特将成为众多级联误解的来源;纠正它们,并将翻转的部分存储为稀疏向量。现在,下一次有人送鲍勃那个“种子”时,他会犯同样的错误,你会纠正那些繁琐的部分,然后卡罗尔的润色会很顺利!完美:)
嗯,差不多了。因为,卡罗尔的一些错误不会消失,除非鲍勃的许多斑点开始翻转。我们不希望将所有这些存储在一些过于复杂的生成器神经网络中,因此,任何难以消除的错误位都被简单地记录下来,并在最后处被纠正。因此,“纠正位”的两个阶段——第一阶段,在鲍勃的扭曲和卡罗尔的改进之间;第二,在卡罗之后,确保完美的准确性。**
管子角度比喻
这种方法解决了一个基本问题,它可以被想象成一个大型公共建筑下面的可怕的管道网络。每层楼的卫生间都布满了管道,最糟糕的是:为了省钱,这座城市只能买得起怪异、库存过剩的管道配件!24 度弯,87 度接头,egad!管道是如此的混乱,因为每根管子都必须被测量和切割成笨拙的形状,以同时适合彼此。这是意大利面条式的代码,以及所有传统软件的讨厌之处。“模糊近似覆盖”和“校正位”让我们做什么?
模糊神经网络就像一个具有某种灵活性的管道——它可以从一个 34 度的配件开始,沿着路径弯曲以避开其他一些突起,最终到达一个 78 度的管接头。事实上,它可以在一个很宽的弧线上来回弯曲。你有很多选择,从那个到一个近似器。这只是一个削减到你想要的特定点的问题,因为否则你的管道可能会喷出一些随机的,摇摆不定的飞溅。该规范就是校正位的作用!他们将你的管道接头固定在墙上,并提供一个可调节的套筒环,为你提供额外的活动空间。
这些简化减轻了机器的僵化官僚作风,让我们简化了复杂的流程。从根本上来说,这些摇摆不定的管道和铰链接头解除了软件管道的复杂性和约束。它流动简单,流线型,很少必要的分支。[神经网络和校正位用于倾斜这些连接;每一个都是以互补的方式完成的,你不太可能单独使用神经网络看到相同水平的精确压缩。]
建造压缩机
获取大量的软件和文件,并将它们一起压缩,最有可能找到细致入微的、合适的启发方法来适当地重新生成和去噪——对于海滩上的波浪,或者一个问题的轻快节奏,或者一列账户,等等。这些试探法是构建您的压缩编解码器的词典。这是困难的部分,随着压缩内容的增加、需求的变化、新的效率的发现,需要重新完成。**
然而,一旦软件已经被映射,那么输入可以在神经网络逼近器的片段中被解析,同时具有稀疏的校正位日志。这些软件实例仿真可以在超级服务器上完成,只需通过网络发送设备显示器的变化编码。您在设备之间“共享”的文件实例仅仅是接收到授权数据查看器字典的新增内容和其他门户中的嵌入位置。不需要通过网络实际发送文件的比特;超级服务器有这个文件,只要你们需要,它就给每个人发一个 代码,重新生成那个文件 的图片。
构建程序的输入→输出图的过程也会揭示潜在的错误、漏洞、失误和未满足的需求。每一条路径都可以揭示一些问题;当神经网络标记大块的代码以供人工审查,并试图分析性地绘制每个部分的流程图;当神经网络掠过输入空间时,测试阈值,该阈值导致各种位翻转,作为输入→输出行为的“紧急特征”;以及当用户偶然发现这种情况时;最后,根据压缩仿真器用户的反馈,您可以显式翻转以纠正输出的位,而无需搜寻并修复代码行中的错误——只有仿真被修复!这些增加的稳定性和确定性层是有价值的,从某种程度上来说,软件开发人员可能很乐意将他们的软件承包到模拟器云上,这样就可以用最小的资本预算进行彻底的调试和超大规模的推广。你怎么说?
数据专家:真理的仲裁者

来源: Unsplash
大学毕业后,我有了数学背景,投身于快速发展的数据分析领域。直到多年以后,我才意识到这个职位所带来的不可思议的力量。正如本叔叔对彼得·帕克(又名蜘蛛侠)说的,“权力越大,责任越大”。本大叔重复的这句谚语完美地总结了所有级别和类型的数据专业人员的一个未言明的现实。你不得不怀疑彼得·帕克真正的超能力是不是数据专长。不像蜘蛛侠,我们的敌人不像飞行的绿色怪物那么明显。作为数据专业人员,我们必须对数据隐私、算法偏差和客观呈现信息等话题保持警惕。
政府中的数据伦理
我第一次接触敏感数据是在 2016 年的美国人口普查局。我的团队负责每月编辑和发布美国国际商品和服务贸易报告。这些报告显示了美国与其他国家进出口各种商品的数量。对于普通人来说,这可能不会影响他们的生活,但对于投资者来说,这些信息非常有价值。
作为一名雄心勃勃的员工,我想给他们的网页增添一点活力。我的计划是展示一张与跨太平洋伙伴关系有关的精美的表格(是的,那时候它们很精美)。这相当于新闻机构报道任何重大经济事件的相关事实。可悲的是,我被关闭了。有人告诉我,人口普查不能对新的自由贸易协定有偏见。当时,我不太明白。但是,回过头来看,我能充分体会到其中的敏感。人口普查控制着极其宝贵的信息,这些信息可能对经济和人民产生广泛的影响。为了有效,它必须保持非党派性。否则,数字会变得政治化,真相也会变得可疑。
算法偏差
“当一个度量成为目标时,它就不再是一个好的度量”
——古德哈特定律
我经常看到上面的陈述被引用,但是 KPI 在组织中仍然非常普遍。我以前的一个数字化转型项目要求我的部门采用一种新的 CRM(联系关系管理)软件。借助这一新系统,领导层要求 KPI 衡量工具的参与度。任何安装了新系统的人都知道文化变革和采用的挑战。软件和过程必须齐头并进才能成功。因此,我们需要最好的方法来衡量和激励 CRM 中的用户活动。
在我们的系统中,用户需要输入和更新可能影响组织的公共政策。我们让用户负责全球不同的地区。欧洲等一些地区的政策活动比其他地区多。一些地区有更多的用户来帮助更新记录。从金融角度来看,每个地区的重要性可能有所不同。在我们的 CRM 中,您可以测量登录、查看、编辑、添加记录、删除记录等等。每个指标在计算中都有固有的偏差。为了简化,我们将假设我们只能在区域级别计算指标,并且每两周计算一次。让我们来看看一些选项及其含义。
在为这个新系统设计合适的 KPI 时,无论我们选择哪种指标,都存在偏见、假设和激励。当我漫不经心地浏览 Twitter 时,我最近看到了一句完美总结了上述过程的话。
“把某物变成数字的行为本身就是一种假设。”
诚信是必须的
几个月前,我和一位同事一起工作,他需要一些帮助来分析和展示将向公众公开的信息。只要一听到“公共数据”这个词,任何数据专家的思维都会立即被数据安全所吸引。幸运的是,这不是问题。
我的同事继续解释我们有什么数据(即非常少)和演示的目的。经过一番探索,我意识到我们不能提供任何所要求的详细程度的汇总统计数据。我们只能提供总数的估计。这对他们的项目来说是不够的。“让一些神奇的事情发生”是有压力的;尤其是,如果我想给一些高级同事留下深刻印象。短期来看,这会提升我自己的声誉,但从长期来看,这会给组织(和我自己)带来严重的声誉损害。

来源: Unsplash
最后的想法
随着数据被无缝地编织到每一个流程中,随之而来的是尚未被充分讨论的道德风险。当数据专业人员开始在您的决策过程中实施黑盒算法时,就为时已晚了。组织需要从高层灌输一种道德的、数据驱动的决策文化。
- 作为一名数据专业人员,你会经常发现自己处于艰难决策的中心,尤其是当你的同事在数据和数字上苦苦挣扎的时候。你的工作是在他们的专业知识和适当的信息分析或展示之间架起一座桥梁。在那个缺口中,潜伏着一个伺机而动的、看不见的敌人,他希望你走捷径。跟随蜘蛛侠的脚步,正直地前进。
- 数据通才
区块链的论点
以及为什么当你解释一个现实的系统如何工作时,商业人士会感到失望。

通过在【Unsplash.com】的上启动
支持区块链技术的最大理由通常是透明度。因为所有发生的交易都被记录下来,所以找到与你想知道的信息相关的所有交易应该很容易。
第二是不变性。我们不应该能够改变任何以前输入的数据。
第三是安全。我们喜欢展示大型网络的例子,这些网络运行着如此多的对等节点,以至于没有黑客能够摧毁它们。
这些想法在纸上听起来很棒,对吗?你当然可以带他们去见你的高层管理人员,让他们相信这是个好主意。然后,他们可能会开始询问实施情况会是什么样子,并询问高级开发计划以及它将如何使公司受益的一些合理事实。
这就是一切分崩离析的地方
为了真正利用我们所知的区块链技术,通常需要与其他系统(尤其是其他公司的系统)集成,以充分利用可用数据。
只有特定数据子集的区块链并不比常规数据库好多少
比如我在保险行业工作。如果我们为客户数据创建一个链,它看起来不会比当前集成的处理相同事情的多个系统有太大的不同。就像,它处理所有相同的数据,我们不能丢弃任何数据。
区块链的真正超能力
如果我们用我们的医生网络和医院网络以及我们目前的内部系统建立一个组合系统,这就是区块链的透明度发挥作用的地方。它填补了我们对客户了解的空白。这使得他们的健康数据更加广泛,而不是孤立的。
相信我,这是好事,我会给你几个案例。
就瘾君子而言
我相信至少有一些人知道,瘾君子去医院寻求通过欺诈手段获得他们上瘾的药物的处方并不是不知道的。他们假装疼痛,说服医生他们需要药物来控制疼痛,然后继续满足他们的习惯。
现在,如果医院和医生有一个共享的系统,这样他们就不会欺骗系统让他们上瘾,这不是更有帮助吗?答案通常是肯定的,会的。
在慢性疾病或严重药物过敏的情况下
在当今世界,人们来到急诊室,无法说话,也没有人替他们说话,说他们患有慢性疾病或药物过敏,这也并不罕见。如果他们需要手术,或者将被给予一些药物来帮助,大多数医院不会轻易得到这种对病人来说意味着生死的信息。
如果我们有这个传说中的共享系统,这可能意味着拯救更多的生命。
在供应链透明的情况下
这是区块链大放异彩的一个例子。这里概述了一个例子。这是一个案例研究,说明在食源性疾病爆发的情况下,沃尔玛如何利用区块链追踪食品的供应商。虽然它肯定没有涵盖所有的供应商,但它只是数据透明性应该如何工作的一个小例子。
那么,商业伙伴为什么不跳上去呢?
专有数据总是被视为神圣的。这就像印刷机出现之前的圣经。
他们的想法是,如果不是数据的唯一存取者,信息技术的力量就会突然丧失。分享数据意味着他们让钱走出大门。
在我们的资本主义社会,我们非常重视稀缺的概念。这意味着我们需要抓住现有的资源,因为我们可能无法获得更多的资源。我们不想分享我们的数据,因为如果我们不保存它,我们就不再有权力或控制资源。这也意味着资源不再是我们的。
我不会说这不是真的,因为它部分是真的。虽然我们仍将控制谁有权访问系统,但当他们在系统中时,我们不再是此类数据的唯一访问者。
在我看来,我想争论的是,我们应该这样吗?
如果我们能够形成一个更全面的数据池,而不仅仅是在保险行业,那么执行不同的分析而不必填补漏洞不是更容易吗?它会更快地进一步研究吗?大概吧。
分析性讲故事的艺术

“是什么把人团结起来?军队?黄金?旗帜?”在《GoT》的大结局中,当维斯特洛最有权势的贵族和夫人们坐下来选择下一任女王或国王时,提利昂·兰尼斯特这样说道。他侧着头继续说道:“故事……世界上没有什么比一个好故事更有力量了。没有什么能阻止它。没有敌人能打败它。还有谁比破碎的布兰有更好的故事。”。
如今,随着 AutoML 变得突出,由于 Keras、Tensorflow Estimator、Fastai 等高级 API,编写数据科学模型变得比以往任何时候都更容易。以及众多的 AutoML 工具,如 DataRobot、DataIQ、H2O、AWS Sagemaker、GCP AutoML 等。
到 2020 年,超过 40%的数据科学任务将实现自动化,从而提高生产力,让公民数据科学家得到更广泛的使用。— Gartner
在这种情况下,在伟大的数据科学家的全部技能中,一项变得更加重要的技能是讲故事的艺术。
当你构建最复杂的模型,利用最复杂的算法,合并数百个复杂的数据源时,有一个因素是你的模型是公开还是迅速消亡,让你咒骂门外汉的关键决定因素:你说服最重要的人——业务主管——的能力。
10 个数据科学项目中只有 1 个真正投入生产—VentureBeat
我们都喜欢听故事。但是讲故事不是一件容易的事情。如果你试图给你的孩子即兴讲述一个故事,你知道我在说什么。它需要引入一个主角和一个对手,煽动行动,制造冲突,然后解决问题。
传统上不被认为是大脑“语言网络”一部分的区域,在人们听故事时会被持续激活。示例区域是楔前叶/后扣带皮层和 mPFC。——Susana Martinez-Conde 等人在 神经科学杂志
为了给我们的模型建立一个好的故事,让我们从西蒙·西内克(我非常钦佩的作家和思想家)在他的开创性著作《从为什么开始》中推广的黄金循环中吸取一两片叶子。Sinek 的黄金圈包括为什么、如何和什么;从“为什么”开始,进入“如何”,最后在试图激励人们时解决“什么”的问题。我们将在分析性讲故事的背景下稍微调整一下。
当你准备说服业务负责人采纳你的决策模型时,试着建立一个由以下三个要素组成的故事:为什么,如何,什么。
1。为什么 : 你为什么认为这个模式很重要?
它解决了哪些业务问题?它影响哪个业务 KPI,如何影响?随着企业采用这种模式,他们可以期待什么样的结果?你应该清楚地能够描述一个没有模型的世界(即当前状态)和一个有模型的世界(即未来状态),并帮助他们想象这两个世界的样子(你还不需要进入量化的细节)。
到 2022 年,只有 20%的分析洞察能够带来业务成果——Gartner 分析师 安德魯·怀特
2。你是如何着手建立模型的?
大多数情况下,我们过于强调实际的模型输出——精确度、ROC、MAPE、MSE、R 平方等等。是的,这些都很重要,但更重要的是你是如何得到这些的。企业希望了解你所使用的过程——你是如何定义目标变量的,也就是说,你到底想预测什么?你是如何获得这些数据的?你是怎么改造的?你用了哪些假设?你是怎么走到终点的?你是如何处理模特训练中的偏见的?你是否以牺牲可解释性为代价在模型中加入了复杂性?最后,如果他们真的决定这么做,你将如何实施?将如何处理变更管理?
到 2022 年,超过 75%的组织将使用 DNNs 来处理可以使用经典 ML 技术解决的用例。— Gartner 分析师 安德魯·怀特
3。什么: 你的型号产量是多少?
最后,一旦你的观众理解了为什么你认为你的模型是继爱因斯坦的广义相对论(一语双关)之后的下一个最好的东西,以及你是如何建立它的,你已经建立了足够的张力让每个人都享受这个啊哈时刻。这就是你的启示所在——你的模型的准确性度量是什么?在预测预期结果中起关键作用的解释变量是什么?你的模型如何处理极端值?你的模式有哪些突破点?你的模型对关键变量的波动有多敏感?模型决定的关系与我们已知的直觉关系一致吗?利用模型预测,企业可以采取什么行动?基于模型输出的正确决策有什么好处?反过来,一个错误决定的代价是什么(希望代价很小)?
但这并没有结束。众所周知,棺材上的钉子是指你能够做出声明,表明通过实施该模型,企业可以产生多少美元价值(或₹或€),无论是成本节约还是收入增加。你如何衡量这是另一个话题,改天再说。您必须缓解与未来潜在的模型退化相关的焦虑,以及您将如何解决它。您还必须向他们保证模型预测在任何时间点的可审计性和可追溯性。
所以,下次你的孩子让你讲故事时,不要回避。他们只是在帮助你练习一种技能,这种技能可能会帮助你跨越“实验室模型”和“生产模型”之间的界限。快乐讲故事!!!
最初发表于T5【https://www.linkedin.com】。
强机器学习模型的工程艺术特征
对于任何数据科学问题,最关键的流程是你应该学习的。

你会学到什么?
- 发展特征工程所需的批判性思维技能
- 反洗钱算法的特征工程
介绍
特色工程?[1]
要素是原始数据的数字表示。在结构化数据中,它们是其中一个变量所依赖的独立变量。数据集中已经存在的要素通常称为数据字段,通过领域知识创建的要素称为候选变量或专家变量。将信息编码成新变量形式的过程称为特征工程。
为什么我们需要更多功能?
机器学习模型的性能与独立特征捕捉关于手头问题的正确信息的准确程度直接相关。因此,为了处理任何问题,我们应该创建尽可能多的变量,以便以后我们可以为我们的模型选择最重要的特征,从而提高模型的性能。然而,这个创建新特征的过程是一项单调乏味的工作,并且需要用一些领域知识很好地理解这个问题。在本文中,我将描述一个示例来演示如何为一个反洗钱机器学习模型创建各种候选变量。
我们将首先从理解问题开始,然后应用这些知识来执行特征工程。以下是下文描述的一系列步骤。
第一步
理解问题

亚历山大·席默克在 Unsplash 上拍摄的照片
洗钱是一种非法过程,通过一系列模糊的银行转账或商业交易,将“脏”钱(从贩毒等非法交易中获得的钱)转变为“干净”钱(合法钱)。
洗钱的三个主要阶段是:
放置— 这是将“脏”钱放入合法金融系统的阶段。最常见的实现方式是通过 smurfing,即向低于反洗钱报告阈值的银行账户发送小额资金,然后存入同一个发送方。
分层——这是第二个阶段,也是最复杂的阶段之一,它涉及到让资金尽可能难以被发现,并进一步将其转移到远离源头的地方。这笔钱被故意转移得如此之快,以至于银行无法察觉。
整合——最后一个阶段是将“干净”的钱重新投入经济。最常见的方式之一是以一家空壳公司的名义购买房产,这表明交易是合法的。
由于篇幅的限制,我只提到了这个问题的更广泛的定义,只是为了演示。然而,一个人应该通过阅读各种研究论文、专利等等来对这个问题进行适当的研究。
第二步
将问题分解成更小的片段,以便有效地创建变量【2】
在研究完问题后,你应该突出你所有的见解。例如,我在下面写了一些,你可以很容易地从第一步中得到:
- 任何个人或企业的现金存款无明显原因地大幅增加
- 存款随后在短时间内从账户转移到通常与客户无关的目的地
- 以现金交易为主而不是使用支票或信用证的账户
- A 大量个人向同一个账户付款,且无充分解释
- 从一个全新的账户中提取大量现金,或者从一个刚从国外收到意外大额贷款的账户中提取大量现金
类似地,你对问题的理解越多,你将获得越多的洞察力,因此,更好的特性将会增强你的模型的性能。因此,在创建候选变量以向模型中注入更多信息时,应该考虑来自问题的所有上述见解。
第三步
了解数据集
为了更进一步,我们假设我们有一个假设的数据集,其中包含以下数据字段及其描述,用于开发反洗钱模型。在真实场景中,为银行工作的数据科学家可以通过以下数据字段轻松获得此类数据。你也可以看看可用的公共数据集。

作者图片
第四步
构建候选变量
这是任何数据科学问题(也称为特征工程)中最有趣、最关键和最困难的部分:
4.1。连接两个或多个不同的数据字段,形成一个新的分类变量
对于我们的第一组变量,您可以考虑将两个或多个数据字段连接在一起,形成一个新变量。为了理解这一点,让我们将“来源账户”、“目的账户”和“交易类型”配对,如下表所示:

作者图片
在上表中,您可以看到一个名为“Origin_acct-Destination_acct”的新列,其中包含各自数据字段的串联值。同样,其他列也可以用同样的方法看到。
为什么?
“Origin_acct”与“Destination_acct”的串联将有助于监管“Smurfing”过程,在“smurf ing”过程中,多个中间账户多次向单个发送者转移小额资金。此外,在前面讨论的一个问题中,观察到这些罪犯更喜欢现金交易,而不是支票、汇票等借贷形式。因此,与“Transaction_type”连接也将有助于为我们的算法提供另一个学习维度,以更多地了解交易的性质,并跟踪该特定账户的现金交易数量是否增加(在 4.2 中讨论)。这样的活动严格来说是不正常的,你会看到与这些连接字段相关联的其他数字候选变量(稍后讨论)将如何帮助我们朝着正确的方向前进。
4.2。频率候选变量[1]
频率变量将对每个特征(如图所示)完成的交易数量进行编码,这将有助于捕捉信息,例如特定账户对的交易数量增加,这可能是可疑活动的信号。下图显示了频率变量的不同组合。例如,您可以计算在同一天(0)、最近 1 天、最近 3 天等等使用 origin_acct 的次数。

作者图片
在一段时间内计算出的较高值意味着该帐户的行为有异常。在下表中,您可以看到其中一个原始帐户的频率变量是怎样的:

作者图片
列 Origin_frequency_0 从 1 开始(假设它是第一次用于交易),第二天的数字保持为 1,因为它是在 2014 年 5 月 2 日第一次出现。同样,你可以推断出其他数字是如何计算出来的。
4.3。数量变量
金额变量将有助于计算每个账户在过去 0、1、3、7、14 和 30 天(0 表示同一天)的交易的平均值、最大值、中值和总金额,这将有助于跟踪第三阶段,即在没有任何充分理由可能购买资产的情况下从银行账户提取大笔资金的整合。因此,将有助于模型识别交易量中的任何异常。例如,将有一列包含目的地帐户在过去 3 天的交易总额。类似地,可以形成如下所示的其他组合:

作者图片
下表显示了一对金额变量:

作者图片
在上表中,“Origin _ acct-total _ Amount _ 3 _ days”列包含过去 3 天内#4586524 原始账户的交易总额。这就是为什么最后一行中的总数仍然是 98.4,因为该帐户在过去 3 天中没有被使用。另一列计算当天的实际交易额除以过去 3 天的总额。
4.4。时间-自变量[1]
要封装帐户交易速度的信息,这些变量非常方便。它计算帐户最后一次用于交易和当前交易之间的时间。单个实体的后续交易越快,欺诈的可能性就越大。因此,这将有助于跟踪第二阶段,即分层。下表显示了时间变量的一个示例:

作者图片
4.5。速度变化候选变量[1]
最后一组变量可以通过计算过去一天(0 & 1 天)的交易数量或转账金额在另一组期间(7、14 和 30 天)的变化来跟踪账户正常行为的突然变化。相同的公式如下:

作者图片
因此,如果该帐户的交易数量或平均金额发生意外变化,我们的模型将能够了解这种变化。下表显示了速度变化变量的示例:

作者图片
摘要
您看到了我们如何能够通过许多候选变量,仅使用给定的数据字段,在没有任何外部数据的情况下,对关于给定问题的越来越多的信息进行编码。总而言之,您学习了以下变量及其编码信息:
连接变量- 有助于将原始账户、目的账户和交易类型相互联系起来,这有助于跟踪 smurfing 和较高现金提取的问题
频率变量- 有助于了解账户的使用频率
金额变量- 有助于了解交易金额的大小。
时间-自变量- 帮助学习交易的速度
速度变化变量- 帮助识别账户行为的突然变化
我知道上面讨论的问题似乎只针对欺诈检测模型,但相信我,它肯定会帮助您发展为任何数据科学问题创建专家变量所需的批判性思维技能。希望你觉得有帮助,值得一读。干杯!
参考文献
[1] Gao,J.X .,Zhou,Z.R .,Ai,J.S .,Xia,B.X .和 Coggeshall,S. (2019)使用机器学习算法预测信用卡交易欺诈。智能学习系统与应用杂志,11,33–63。https://doi.org/10.4236/jilsa.2019.113003
[2]《打击洗钱和资助恐怖主义行为准则》。https://www.imolin.org/doc/amlid/Trinidad&多巴哥 _ Guidlines %20on %打击% 20 金钱% 20 发动% 20&% 20 恐怖分子%20Financing.pdf
为机器学习寻找最佳特征的艺术

使用 python 深入研究特征选择和工程
机器学习模型将一组数据输入(称为特征)映射到预测器或目标变量。此过程的目标是让模型学习这些输入和目标变量之间的模式或映射,以便在目标未知的情况下,给定新数据,模型可以准确预测目标变量。
对于任何给定的数据集,我们都希望开发一个模型,能够以尽可能高的精确度进行预测。在机器学习中,有许多影响模型性能的杠杆。一般来说,这些包括以下内容:
- 算法选择。
- 算法中使用的参数。
- 数据集的数量和质量。
- 用于训练模型的功能。
通常在数据集中,原始形式的给定特征集不能提供足够的或最优的信息来训练性能模型。在某些情况下,移除不必要或冲突的特征可能是有益的,这被称为特征选择。
在其他情况下,如果我们将一个或多个特征转换成不同的表示,为模型提供更好的信息,模型性能可能会得到改善,这被称为特征工程。
特征选择
在许多情况下,使用数据集中所有可用的特征不会产生最具预测性的模型。根据所用模型的类型,数据集的大小和各种其他因素(包括过多的要素)都会降低模型的性能。
特征选择有三个主要目标。
- 提高模型预测新数据的准确性。
- 降低计算成本。
- 产生一个更容易理解的模型。
您可能会因为多种原因而删除某些功能。这包括特征之间存在的关系,与目标变量的统计关系是否存在或足够显著,或者特征中包含的信息的值。
特征选择可以通过分析训练前后的数据集来手动执行,或者通过自动统计方法来执行。
手动特征选择
有许多原因可以解释为什么您想要从培训阶段删除某个功能。其中包括:
- 与数据集中的另一个特征高度相关的特征。如果是这种情况,那么这两个特征实质上提供了相同的信息。一些算法对相关特征敏感。
- 几乎不提供任何信息的功能。一个示例是一个特征,其中大多数示例具有相同的值。
- 与目标变量几乎没有统计关系的特征。
可以通过在训练模型之前或之后执行的数据分析来选择特征。这里有一些手动执行特征选择的常用技术。
相关情节
执行特征选择的一种手动技术是创建一个可视化,该可视化为数据集中的每个特征绘制相关性度量。 Seaborn 是一个很好的 python 库。以下代码为 scikit-learn API 提供的乳腺癌数据集中的特征生成了一个相关图。
# library imports
import pandas as pd
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
import numpy as np# load the breast_cancer data set from the scikit-learn api
breast_cancer = load_breast_cancer()
data = pd.DataFrame(data=breast_cancer['data'], columns = breast_cancer['feature_names'])
data['target'] = breast_cancer['target']
data.head()# use the pands .corr() function to compute pairwise correlations for the dataframe
corr = data.corr()
# visualise the data with seaborn
mask = np.triu(np.ones_like(corr, dtype=np.bool))
sns.set_style(style = 'white')
f, ax = plt.subplots(figsize=(11, 9))
cmap = sns.diverging_palette(10, 250, as_cmap=True)
sns.heatmap(corr, mask=mask, cmap=cmap,
square=True,
linewidths=.5, cbar_kws={"shrink": .5}, ax=ax)
在最终的可视化中,我们可以识别一些密切相关的特征,因此我们可能想要移除其中的一些,以及一些与目标变量相关性非常低的特征,我们也可能想要移除这些特征。

特征重要性
一旦我们训练了一个模型,就有可能应用进一步的统计分析来理解特征对模型输出的影响,并由此确定哪些特征是最有用的。
有许多工具和技术可以用来确定特征的重要性。一些技术是特定算法独有的,而其他技术可以应用于广泛的模型,被称为模型不可知。
为了说明特性重要性,我将使用 scikit-learn 中随机森林分类器的内置特性重要性方法。下面的代码适合分类器并创建一个显示特征重要性的图。
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split# Spliiting data into test and train sets
X_train, X_test, y_train, y_test = train_test_split(data.drop('target', axis=1), data['target'], test_size=0.20, random_state=0)# fitting the model
model = RandomForestClassifier(n_estimators=500, n_jobs=-1, random_state=42)
model.fit(X_train, y_train)# plotting feature importances
features = data.drop('target', axis=1).columns
importances = model.feature_importances_
indices = np.argsort(importances)plt.figure(figsize=(10,15))
plt.title('Feature Importances')
plt.barh(range(len(indices)), importances[indices], color='b', align='center')
plt.yticks(range(len(indices)), [features[i] for i in indices])
plt.xlabel('Relative Importance')
plt.show()
这提供了一个很好的指示器,指示出那些对模型有影响的特性和那些没有影响的特性。在分析这张图表后,我们可以选择去掉一些不太重要的特征。

自动特征选择
有多种机制使用统计方法来自动查找要在模型中使用的最佳特征集。scikit-learn 库包含许多方法,这些方法为许多这些技术提供了非常简单的实现。
方差阈值
在统计学中,方差是变量与其均值的平方偏差,换句话说,对于给定的变量,数据点分布有多远?
假设我们正在建立一个机器学习模型来检测乳腺癌,数据集有一个性别布尔变量。该数据集可能几乎完全由一种性别组成,因此几乎所有的数据点都是 1。这个变量的方差极低,对预测目标变量毫无用处。
这是最简单的特征选择方法之一。scikit-learn 库有一个名为VarianceThreshold的方法。该方法采用一个阈值,当适合一个特征集时,将移除低于该阈值的任何特征。阈值的默认值为 0,这将移除任何方差为零的要素,换句话说,所有值都相同。
让我们将这个默认设置应用于我们之前使用的乳腺癌数据集,以找出是否有任何特征被删除。
from sklearn.feature_selection import VarianceThresholdX = data.drop('target', axis=1)
selector = VarianceThreshold()
print("Original feature shape:", X.shape)new_X = selector.fit_transform(X)
print("Transformed feature shape:", new_X.shape)
输出显示变换后的要素形状相同,因此所有要素至少有一些差异。

单变量特征选择
单变量特征选择将单变量统计测试应用于特征,并选择在这些测试中表现最佳的特征。单变量检验是只涉及一个因变量的检验。这包括方差分析(ANOVA)、线性回归和均值的 t 检验。
同样,scikit-learn 提供了许多特征选择方法,这些方法应用各种不同的单变量测试来寻找机器学习的最佳特征。
我们将把其中的一个称为 SelectKBest 的应用于乳腺癌数据集。该函数基于单变量统计测试选择 k 个最佳特征。k 的默认值是 10,所以会保留 10 个特征,默认测试是 f_classif 。
f_classif 检验用于分类目标,如乳腺癌数据集的情况。如果目标是连续变量,应使用 f_regression 。f_classif 检验基于方差分析 (ANOVA)统计检验,该检验比较多个组的平均值或我们案例中的特征,并确定这些平均值之间是否具有统计显著性。
以下代码使用默认参数将该函数应用于乳腺癌数据集。
from sklearn.feature_selection import SelectKBestX = data.drop('target', axis=1)
y = data['target']
selector = SelectKBest()
print("Original feature shape:", X.shape)new_X = selector.fit_transform(X, y)
print("Transformed feature shape:", new_X.shape)
输出显示该函数已经将特性减少到 10 个。我们可以用不同的 k 值进行实验,训练多个模型,直到我们找到最佳数量的特征。

递归特征消除
这个方法在逐渐变小的特征集合上执行模型训练。每次计算特征重要性或系数,并且移除具有最低分数的特征。在这个过程的最后,最佳的特征集是已知的。
由于这种方法涉及重复训练模型,我们需要首先实例化一个估计器。如果数据是第一次缩放,这种方法也是最好的,所以我添加了一个预处理步骤来归一化特征。
from sklearn.feature_selection import RFECV
from sklearn.svm import SVR
from sklearn import preprocessingX_normalized = preprocessing.normalize(X, norm='l2')
y = yestimator = SVR(kernel="linear")
selector = RFECV(estimator, step=1, cv=2)
selector = selector.fit(X, y)
print("Features selected", selector.support_)
print("Feature ranking", selector.ranking_)
下面的输出显示了已选择的功能及其排名。

特征工程
特征选择的目标是通过移除不必要的特征来降低数据集的维度,而特征工程是关于转换现有特征和构建新特征以提高模型的性能。
我们可能需要执行特征工程来开发最佳模型,这有三个主要原因。
- 功能不能以原始形式使用。这包括诸如日期和时间之类的特征,其中机器学习模型只能利用包含在其中的信息,如果它们被转换成数字表示,例如星期几的整数表示。
- 要素可以以原始形式使用,但如果数据以不同的方式聚合或表示,则要素中包含的信息会更强。这里的一个例子可能是包含人的年龄的特征,将年龄聚集到桶或箱中可以更好地表示与目标的关系。
- 一个特征本身与目标没有足够强的统计关系,但是当与另一个特征结合时,具有有意义的关系。假设我们有一个数据集,它有许多基于一组客户信用历史的特征,以及一个表明他们是否拖欠贷款的目标。假设我们有一笔贷款和一个工资值。如果我们把这些结合成一个新的特征,叫做“贷款与工资比率”,这可能比单独的那些特征提供更多或更好的信息。
手动特征工程
可以通过数据分析、直觉和领域知识来执行特征工程。通常执行与用于手动特征选择的技术类似的技术。
例如,观察特征如何与目标相关联,以及它们在特征重要性方面的表现如何,可以指示哪些特征需要在分析方面进一步探索。
如果我们回到贷款数据集的例子,让我们假设我们有一个年龄变量,从相关图来看,它似乎与目标变量有某种关系。当我们进一步分析这种关系时,我们可能会发现,那些违约者倾向于某个特定的年龄组。在这种情况下,我们可以设计一个功能来挑选出这个年龄组,这可以为模型提供更好的信息。
自动化特征工程
手动特征工程可能是一个非常耗时的过程,并且需要大量的人类直觉和领域知识来正确处理。有一些工具能够自动合成大量的新特征。
Featuretools python 库是可以对数据集执行自动化要素工程的工具示例。让我们安装这个库,并在乳腺癌数据集上完成一个自动化特征工程的例子。
功能工具可以通过 pip 安装。
pip install featuretools
Featuretools 设计用于处理关系数据集(可以用唯一标识符连接在一起的表或数据帧)。featuretools 库将每个表称为一个实体。
乳腺癌数据集只包含一个实体,但我们仍然可以使用 featuretools 来生成特征。但是,我们需要首先创建一个包含唯一 id 的新列。下面的代码使用数据帧的索引创建一个新的 id 列。
data['id'] = data.index + 1
接下来,我们导入 featuretools 并创建实体集。
import featuretools as ftes = ft.EntitySet(id = 'data')
es.entity_from_dataframe(entity_id = 'data', dataframe = data, index = 'id')
这给出了以下输出。

我们现在可以使用该库来执行特征合成。
feature_matrix, feature_names = ft.dfs(entityset=es,
target_entity = 'data',
max_depth = 2,
verbose = 1,
n_jobs = 3)
Featuretools 已经创建了 31 个新功能。

我们可以通过运行以下命令来查看所有的新特性。
feature_matrix.columns

机器学习模型的好坏取决于它接受训练的数据。因此,在这篇关于特征选择和工程的文章中讨论的步骤是机器学习模型开发中最重要的,也是最耗时的部分。这篇文章对这一领域的理论、工具和技术进行了广泛的综述。然而,这是一个非常广阔的领域,需要对各种不同的数据集进行大量的练习,才能真正学会为机器学习找到最佳特征的艺术。
感谢阅读!
我每月都会发一份简讯,如果你想加入,请点击此链接注册。期待成为您学习旅程的一部分!
Python 中的地理围栏艺术
教程-触发通知并向用户推送 GPS 位置。

地图框中的地理围栏示例:伦敦拥堵— 来源
地理围栏是地理数据科学中常用的工具,尤其是在营销、安全和分区应用中。上面 GIF 中的例子显示了一个应用程序,它根据车辆的位置和伦敦的拥堵费区(CCZ)向车辆发出警报。该应用程序计算拥堵费,并跟踪给定时间拥堵区域内的车辆数量。
地理围栏的概念很简单,但它是一种增强定位应用的强大技术。简单地说,地理围栏是地理对象或区域周围的定义虚拟边界,以便用户每次进入或离开边界周界时,都可以触发操作或通知。随着智能手机、GPS 和定位服务使用的增加,地理围栏成为位置数据分析和情报中不可或缺的工具。
在本教程中,我们使用 GPS 轨迹数据集。它包含带有时间戳的 GPS
点(纬度和经度)。它还为每个轨迹提供唯一的 track_id。让我们用熊猫图书馆读数据。
import pandas as pd
import geopandas as gpd
import plotly_express as px
import matplotlib.pyplot as plt!wget [https://www.dropbox.com/s/ejev7z29lzirbo5/GPSTrajectory.zip](https://www.dropbox.com/s/ejev7z29lzirbo5/GPSTrajectory.zip)
!unzip GPSTrajectory.zipdf = pd.read_csv(‘GPSTrajectory/go_track_trackspoints.csv’)
df.head()
数据集的前五行如下所示。我们有纬度和经度以及 track_id 和时间。

轨迹数据帧
我们将数据框架转换为地理数据框架,从而可以执行地理围栏。使用 Geopandas 将数据框转换为地理数据框非常简单。
gdf = gpd.GeoDataFrame( df, geometry=gpd.points_from_xy(df.longitude, df.latitude))gdf.head()
让我们绘制数据集的地图。我们在这里使用 Plotly Express,因为它为 Plotly 绘图提供了一个简单的接口和高级 API。我们需要在这里设置 Mapbox 标记。
px.set_mapbox_access_token(“pk.eyJ1Ijoic2hha2Fzb20iLCJhIjoiY2plMWg1NGFpMXZ5NjJxbjhlM2ttN3AwbiJ9.RtGYHmreKiyBfHuElgYq_w”)px.scatter_mapbox(gdf, lat=”latitude”, lon=”longitude” ,size_max=6, zoom=8, width=1200, height=800)
下图显示了数据集中的所有点。如你所见,这些轨迹落在三个不同的城市。

Plotly Express 轨迹图
让我们过滤掉其他城市,把注意力集中在中心城市(Aracuja ),因为大部分数据都在这里。
gdf = df[(gdf[‘latitude’]<-10.80) & (gdf[‘longitude’]>-37.5)]px.scatter_mapbox(gdf, lat=”latitude”, lon=”longitude” ,size_max=6, zoom=8, width=1200, height=800)
现在我们只对巴西的 Aracuja 市感兴趣。

干净的轨迹图
现在我们已经清理了数据,让我们做地理围栏。
地理围栏
首先,我们需要一个标记地理围栏的区域。让我们下载一个我在市中心创建的区域。
# Get the data
!wget [https://www.dropbox.com/s/e9g5n7e7iwnue4x/CENTERAREA.zip](https://www.dropbox.com/s/e9g5n7e7iwnue4x/CENTERAREA.zip)
!unzip CENTERAREA.zippolygon = gpd.read_file(“CENTERAREA.geojson”)
让我们用 Geopandas 绘制多边形,并叠加这些点以查看两个数据。
# Plot track_id 1 points over the Buffer Polygonfig, ax = plt.subplots(figsize=(10,10))gdf.plot(ax=ax, color=’black’)polygon.plot(ax=ax)#plt.tight_layout()#plt.axis(‘off’)plt.show()
这是覆盖面和点数据的地图,如下所示。

Geopandas 图-带多边形的点
现在,让我们执行我们所谓的多边形中的点(PIP)。我们可以在 Geopandas 中使用“within”操作来检查点是否在多边形内。
mask = (polygon.loc[0, ‘geometry’])pip_mask_geofence = gdf.within(mask)
上面的代码将根据点是否在多边形内返回一系列的假值和真值。让我们在数据中添加一列来标记假值和真值。我们称之为“地理围栏”。
#Create PIP maskgdf.loc[:,’geofence’] = pip_mask_geofencegdf.sample(5)
现在,我们的数据有一个“地理围栏”栏。让我们来看一个数据样本。

具有地理围栏列的轨迹地理数据框架
如您所见,数据中有一个附加列:geofence。前四行表示它们不在 geofence 内,而最后一行表示它们在 geofence 内。让我们分别用输入和输出值来代替假值和真值。
# Replace True with In and False with Outgdf[‘geofence’] = gdf[‘geofence’].replace({True: ‘In’, False: ‘Out’})
我们现在可以看到,如果我们用 Plotly Express 绘制地图,并使用 geofence 作为颜色,哪些点在 geofencing 区域内部或外部。
px.scatter_mapbox(gdf, lat=”latitude”, lon=”longitude”, color=”geofence”, size=’track_id’ ,size_max=6, zoom=12, width=1200, height=800)

用地理围栏着色的地图
最后,我们可以用轨迹运动动画化这些点。用 Plotly Express 可以很容易地完成这种概括。然而,由于某些限制,它不能一次可视化我们所有的点。现在让我们设想一个轨道 ID。
px.scatter_mapbox(gdf[gdf[“track_id”]== 23], lat=”latitude”, lon=”longitude”, color=”geofence”, size=’track_id’, animation_frame=’time’, size_max=10, zoom=12, width=1200, height=800)
这是我们简单地理围栏例子的 GIF 动画。一旦轨迹进入地理围栏区域,这些点将变为红色,而在标记区域之外则为蓝色。

地理围栏动画
结论
在本教程中,我们看到了如何使用 Pandas、Geopandas 和 Plotly Express 用 Python 做一个简单的地理围栏示例。如果你想试验代码,这里有 Google Colab 笔记本的链接。
编辑描述
colab.research.google.com](https://colab.research.google.com/drive/18HvxO82GGDQc3wXHrGkIygdJYFE0y-Fg)
地图可视化的艺术:用数据点给新加坡岛着色
一个简单的地图可视化指南!

新加坡岛的水彩地图
新加坡无疑是亚洲最热门的旅游目的地之一。尽管这个城市比纽约小,但它有你需要或想体验的一切。丰富的食物选择、街头(和奢侈品)购物、拥抱生物多样性的绿色城市,应有尽有!
在本文中,我们将使用 R 来可视化新加坡地图上的空间数据。
API 设置和获取地图
首先,我们需要使用 get_map 函数获得一个地图背景。
#Load the R packages
library(ggplot2)
library(dplyr)
library(sf);
library(stringi)
library(ggmap)#Set your API Key
ggmap::register_google(key = "*your google api key*")#Get Singapore map as background
map <- get_map("singapore", maptype = "roadmap", zoom = 11, source = "google", color = "bw")*# There are many map types in the ggmap package to play around with!*
数据集上的免责声明
本文只关注新加坡岛。其他较小的岛屿不包括在可视化中。
数据源
本文使用的所有数据集均来自data.gov.sg。新加坡政府提供大量数据供公众使用。在本文中,我从源代码下载了 KML (Keyhole markup language)文件,并使用 r
下载完 KML 文件后,将文件加载到 R 中进行处理。KML 数据集需要转换成 EPSG 3857 格式,这是谷歌使用的伪墨卡托投影坐标系。
# Load the KML file paths
cyclingPath <- "*KML file path on your PC*"
taxi <- "*KML file path on your PC*"
mrt <- "*KML file path on your PC*"
parks <-"*KML file path on your PC*"#Read the KML files in R
cyclingPathData <- st_read(cyclingPath)
taxiData <- st_read(taxi)
mrtData <- st_read(mrt)
parksData <- st_read(parks)# Transform KMLdata to EPSG 3857)
cyclingPathData_3857 <- st_transform(cyclingPathData, 3857)
taxi_3857 <- st_transform(taxiData, 3857)
mrt_3857 <- st_transform(mrtData, 3857)
parks_3857 <- st_transform(parksData, 3857)
在新加坡地图上叠加 EPSG 3857 数据集
在获得我们想要的新加坡地图并将数据集转换为正确的格式后,我们需要将数据集属性(点和面)要素与基础地图结合起来。以下代码将允许我们准确地将数据集和新加坡地图的经纬度点叠加在一起。
# Define a function to fix the bbox to be in EPSG:3857
ggmap_bbox <- function(map) {
if (!inherits(map, "ggmap")) stop("map must be a ggmap object")
# Extract the bounding box (in lat/lon) from the ggmap to a numeric vector, and set the names to what sf::st_bbox expects:
map_bbox <- setNames(unlist(attr(map, "bb")),
c("ymin", "xmin", "ymax", "xmax"))
# Convert the bbox to an sf polygon, transform it to 3857, and convert back to a bbox (convoluted, but it works) bbox_3857 <- st_bbox(st_transform(st_as_sfc(st_bbox(map_bbox, crs = 4326)), 3857))
# Overwrite the bbox of the ggmap object with the transformed coordinates
attr(map, "bb")$ll.lat <- bbox_3857["ymin"]
attr(map, "bb")$ll.lon <- bbox_3857["xmin"]
attr(map, "bb")$ur.lat <- bbox_3857["ymax"]
attr(map, "bb")$ur.lon <- bbox_3857["xmax"]
map
}# Use the function:
map <- ggmap_bbox(map)
使用 ggmap 函数映射数据集
在这篇文章中,我使用了从 data.gov.sg 获得的十个数据集来可视化新加坡岛上的食品机构、交通系统和娱乐活动场所
- 餐饮场所、小贩中心、超市
- 出租车站,捷运出口
- 公园、自行车道、健身房、水上运动场所
- 旅游景点
ggmap(map) +
coord_sf(crs = st_crs(3857)) + # force the ggplot2 map to be in 3857
geom_sf(data = nationalSurvey_3857, col = "#46425B",lwd = 0.5, fill = "#46425B", inherit.aes = FALSE, show.legend = FALSE)+
geom_sf(data = nationalLine_3857, col = "#435A74",lwd = 0.2, inherit.aes = FALSE, show.legend = FALSE) +
#**food**
geom_sf(data = eating_3857, col = "#219D98", lwd = 0.3, inherit.aes = FALSE, show.legend = FALSE) +
geom_sf(data = hawker_3857, col = "#219D98",lwd = 0.3, inherit.aes = FALSE, show.legend = FALSE) +
geom_sf(data = supermarket_3857, col = "#219D98",lwd = 0.2, inherit.aes = FALSE, show.legend = FALSE) +
#**transportation**
geom_sf(data = taxi_3857, col = "#80DA83", lwd = 0.6,inherit.aes = FALSE, show.legend = FALSE) +
geom_sf(data = mrt_3857, col = "#80DA83", lwd =0.6,inherit.aes = FALSE, show.legend = FALSE) +
#**workout locations**
geom_sf(data = gym_3857, col = "#CAF270",lwd = 0.5, inherit.aes = FALSE, show.legend = FALSE) +
geom_sf(data = waterSports_3857, col = "#CAF270",lwd = 0.5, inherit.aes = FALSE, show.legend = FALSE) +
geom_sf(data = Relaxparks_3857, col = "#CAF270",lwd = 0.5, inherit.aes = FALSE, show.legend = FALSE) +
geom_sf(data = parks_3857, col = "#CAF270",lwd = 0.5, inherit.aes = FALSE, show.legend = FALSE) +
geom_sf(data = cyclingPathData_3857, col = "#80DA83",lwd = 0.5, inherit.aes = FALSE, show.legend = FALSE) +
#**tourism**
geom_sf(data = tourist_3857, col = "#EE8F58", lwd = 1, inherit.aes = FALSE, show.legend = FALSE)
结果
在执行了上面的 R 代码之后,你应该能够得到一个新加坡地图,用所选的数据集着色!

新加坡地图,用食物、交通和娱乐地点着色
结论
大多数学院都位于新加坡海峡附近,新加坡海峡是市中心的核心区域。所以,如果你马上要去新加坡,你知道该去哪里!
R 中的 ggmap 包是一个强大的空间数据可视化包。Google、Stamen 和 Openstreetmap 有很多地图类型可以自己尝试!
递归的艺术;与无限的联系。
艺术、数学和编程中的递归之美。
不久前,我使用 PIP 将一些 python 包安装到一个新环境中。顾名思义,PIP 是 Python 中安装和管理包的标准包。出于好奇,我决定谷歌一下 PIP 代表什么…PIP = PIP 安装 Python。这让我陷入了递归首字母缩略词的螺旋——首字母缩略词指的是它自己。虽然递归首字母缩略词的早期例子似乎来自计算机科学领域,但现在也有一些组织使用递归名称(见:VISA 和 FARM)。

来源:阿尔夫·范·比姆/ CC0 ( 维基百科)
递归也可以在视觉上出现,例如上面的 Droste 可可罐。递归的想法是非常神奇的,因为即使它超出了我们所看到的,甚至超出了我们所画出的,在理论上,递归实体是无限扩展的。这就像站在两面镜子中间,看着自己的同一个影像延伸到一个无尽的不存在的(至少对我们的肉眼来说)走廊。
递归的威力显然在于用有限的语句定义无限的对象集的可能性。同样,一个有限的递归程序可以描述无限数量的计算,即使这个程序不包含显式的重复。
数学和计算机科学中的递归
递归是数学和计算机科学中的一个重要分支。斯坦福哲学百科全书将递归函数定义为这样一种函数,它的“值是由应用于较小自变量的相同函数的应用来定义的”。递归的强大和美丽在于这个函数的强大。这个函数本身可能并不简单,但是一旦你破解了这个代码,它就是一个强大的函数。
递归在行动中——递归在数学和计算机科学中的应用。
A .数学上:递归函数为数学归纳法提供了一个范围,一种数学上的工整证明技术。(递归函数的结果可以是美学上令人愉悦的,例如斐波那契螺旋。)
B .在计算机科学中:递归是一种强大的算法工具,用于解决否则必须迭代解决的问题,需要跟踪迭代的每个实例的状态。

斐波纳契螺旋:不管你放大多少,你最终都会得到同样的图像。斐波那契螺旋中的比例被称为“黄金比例”。这个比例在自然和艺术中都能找到!来源:维基共享资源
A.递归序列&归纳法证明
数学中的序列是指一系列数字 A₁、A₂、A₃…An.
递归序列是列表中的每个条目由列表中先前的条目定义的序列。例如 A₃ = 3A₂-2A₁.A₁和 A₂需要先被分配一个号码。
更一般地说,上面的例子将被定义为:
xn = 3xn-₁-2xn-₂对于所有 n > 2 和 X ₁ =某数 a, X ₂ =某数 B** 。(序列中的前两个条目必须定义为递归公式依赖于这两个数字。)
斐波那契数列是著名的递归数列,定义为:
Fn = Fn-₁ + Fn-₂,对于所有 n 个> 2。其中 F₁ = 1,F₂ =1。
递归的威力就在这里:你会如何寻找 A₃₀₀₀₀₀₀₀的值?你可以首先计算 A₁到 A₂₉₉₉₉₉₉₉.的价值不理想,除非你是超级计算机?即使是超级计算机,理论上也有极限。介绍递归序列的封闭形式。这是一种表示一个序列的一个条目的值的方式,不依赖于前面的值!

斐波纳契数列的封闭形式。Fn 由 n 定义,而不是序列的任何前面的值。
寻找递归关系的封闭形式是另一天的主题。应该注意的是不是所有的递归序列都有一个封闭形式(如果你设法找到一个,那会让你非常出名!!).所以让我们首先假设我们已经为封闭形式确定了一个表达式。
我们需要证明这个表达式确实适用于序列中的所有值,并且将使用数学归纳法来证明。这个证明是优雅的,因为你**只需要证明对某些值 k*** 成立,而 viola,你已经 证明了这对于序列中的所有值 成立!*

图片作者。来自 LSE《抽象数学导论》2016 的例子。
基本上,逻辑流程是这样的—
1。首先假设该表达式适用于直到 kᵗʰ条目的所有条目(k 是任意数)
2。然后证明它对后面的条目成立;即(k+1)ᵗʰ条目
3。因为 k 是任意选择的,所以它可以是任何整数。在我们开始证明之前,我们还表明它适用于构建序列的前两个条目(n=1,n=2)。逻辑在整个序列中递归流动,因此通过数学归纳法,闭合形式对 n 的所有值(即序列中的所有条目)都成立。
用尼古拉斯·沃斯的话说,我们已经“用有限的语句定义了无限的对象集合”。
B.递归函数和分治算法
在一些编程问题中,我们知道我们想要达到的目标,但是可能不知道需要多少步骤,或者正确的路径。这是因为环境会改变并且健壮的算法应该不管环境如何都工作。这就是递归可以帮助我们解决这些大问题的地方。

来源:https://introcs.cs.princeton.edu/java/23recursion/(无意侵犯版权)
编程中的递归与我们在自然界中看到的分支没有什么不同——每个分支都分支成更多的分支,向外延伸,最终覆盖一大片区域(例如,树、树根、灯光、河流三角洲)。在每一步,都必须根据一套固定的规则做出决定,这套规则适用于每一步。例如,在根中,新的分枝可能向土壤更肥沃的区域生长。这种情况循环发生,直到植物的根部伸展以给植物提供足够的养分,或者没有生长的空间。

来源:LSE 算法与编程 2019
同样的逻辑也适用于递归函数。破解的代码是这样的:‘每一步应用的规则集是什么;和我们何时停止拓展业务?
这本身就不是一个小问题。然而,一旦你能想出那个问题的答案,大多数编程语言都允许递归函数,那是一个可以调用自身的函数。这有助于执行你所确定的规则来灵活地解决问题。(我在这里要提醒的是,递归可能并不总是解决编程问题的最佳方式,事实上可能更复杂,但那是另一个故事了。)
我们举个例子 Python 中的 MergeSort 算法。MergeSort 是一种按升序对数字进行排序的算法。
def MergeSort(A): # Create the MergeSort algorithm
if len(A) <= 1:
return A m = len(A) // 2
left = MergeSort(A[:m]) # Sort the left half of the list
right = MergeSort(A[m:]) # Sort the right half of the list return Merge(left , right) # merges the left and right
elements which are both sorted
这可能首先会让人难以理解,我将把算法的细节留到以后再说。
但基本概念依旧— 1。规则是:在每一步,将列表分成两半,并对每一半进行排序。然后,使用合并规则合并每个排序后的一半。Merge 本身是一个函数,定义为按照升序合并两个排序列表。
2。递归地将给定的列表分成两半,直到列表只包含一个元素。
3。然后递归组合排序后的一半,直到整个列表被排序。
注意,我们不需要定义划分列表的次数,也不需要定义要采取的一组特定的固定步骤。这使得算法适用于任意数字组合或任意长度的列表。
再一次,用尼古拉斯·沃斯的话来说,“一个有限的递归程序可以描述无限次的计算,即使这个程序不包含显式的重复”。
太久没读了;
递归可以在自然界中观察到,在河流三角洲中树木伸展树枝或溪流的方式。递归也存在于艺术中,既有显式的(例如在 Droste tin 设计中),也有隐式的(例如艺术中的斐波那契螺旋和比率)。
在数学和计算机科学中,递归是一种强大的方式,通过定义一组有限的规则或提供有限的证明来达到无限。
在数学中的递归序列中,递归允许我们证明该表达式对序列的无限项成立,通过证明它对某些项成立。
在编程中,递归函数允许我们用一组有限的规则解决可能没有完全定义的问题。
递归帮助我们在有限的时间内达到无限。
这篇文章献给我的初中老师,王老师,她教会了我们数学是美丽的。
斯坦福哲学百科全书:https://plato.stanford.edu/entries/recursive-functions/
其他资源:【https://www.youtube.com/watch?v=PXwStduNw14】Eddie Woo 关于数学是一种意义的精彩 ted 演讲。
(人工)聪明的投资者
金融中的人工智能
使用 RNNs 生成投资建议

马库斯·斯皮斯克在 Unsplash 上的照片
莎士比亚戏剧,斯蒂芬·金的小说,甚至坎耶的歌词都曾作为生成文本的递归神经网络(RNNs)的训练数据。虽然这些项目很有趣,但我想为文本生成找到一个更实际的用途,并决定探索 RNNs 是否可以形成连贯的投资建议。在考虑了几个选项后,我选择用本杰明·格拉哈姆的《聪明的投资者 T4》来训练这个模型,这本书被沃伦·巴菲特称为“有史以来最好的投资书籍”。正如我们稍后将看到的,该模型的输出当然没有揭示击败市场的秘密,但思考人工智能是否有一天能够提供合理的财务建议仍然很有趣。
RNNs:快速概述

门控循环单元(图片来自维基百科
rnn 类似于人类的学习。当人类思考时,我们并不是每秒钟都从零开始思考。例如,在句子“鲍勃打篮球”中,我们知道鲍勃是打篮球的人,因为我们在阅读句子时保留了过去单词的信息。类似地,rnn 是具有反馈回路的神经网络,这允许它们在达到最终输出之前使用过去的信息。然而,随着时间间隔的增长,RNNs 只能连接最近的信息,而不能连接更早的信息。门控递归单元(gru)是 RNNs 的改进版本,它通过一个决定传递哪些信息相关的更新门和一个决定哪些过去的信息不相关的重置门来克服短期记忆问题。关于 GRUs 的深入解释,点击这里。
作者注:RNNs 的定义重用自我之前的文章 机器学习预测股票价格
导入/加载数据
首先,我们进行必要的导入:Tensorflow、Numpy 和 os。
*import tensorflow as tfimport numpy as npimport os*
下一步是下载我们的数据,这是一个智能投资者的. txt 文件。我从文件中删除了前言、索引和一些图表,以帮助我们的模型生成更相关的文本。一旦我们下载了这个文件,我们看一下里面总共有多少个字符。
*from google.colab import filesfiles.upload()text = open('The_Intelligent_Investor copy.txt', 'rb').read().decode(encoding='utf-8')print ('Length of text: {} characters'.format(len(text)))*

预处理
让我们看看文件中有多少独特的字符。
*vocab = sorted(set(text))print ('{} unique characters'.format(len(vocab)))*

我们的模型不能理解字母,所以我们必须对文本进行矢量化。每个独特的字符被映射成一个整数,以便计算机理解,整数被映射到字符,以便我们以后可以解码计算机的输出。
*#Maps characters to intschar2int = {char: num for num, char in enumerate(vocab)}#Maps ints to charactersint2char = np.array(vocab)#Intelligent Investor text represented as ints.text_as_int = np.array([char2int[char] for char in text])print(char2int)print(int2char)*

字符到整数映射的示例

整数到字符映射的示例
我们训练 RNN 模型的目的是教会它在给定的字符序列后预测最可能的字符。为此,我们将把文本中的输入序列分成一个示例序列和目标序列。目标序列是右移一个字符的示例序列,因此文本块必须比序列长一个字符。例如,如果我们的文本是“股票”,示例序列将是“股票”,目标序列将是“库存”。
*seq_length = 100examples_per_epoch = len(text)//(seq_length+1)
# Create examples and targets sequenceschar_dataset = tf.data.Dataset.from_tensor_slices(text_as_int)sequences = char_dataset.batch(seq_length+1, drop_remainder=True)def split_input_seq(chunk): example_text = chunk[:-1] target_text = chunk[1:] return example_text, target_textdataset = sequences.map(split_input_seq)#look at the first example and target sequencefor example_text, target_text in dataset.take(1): print ('Example data: ', repr(''.join(int2char[example_text.numpy()]))) print ('Target data:', repr(''.join(int2char[target_text.numpy()])))*
在训练我们的模型之前,我们将数据混洗并分段成批。混洗数据的目的是通过避免过度拟合来提高模型的性能,过度拟合是指模型学习训练数据过于紧密,无法很好地推广到测试集。
*batch_size = 64buffer_size = 10000dataset = dataset.shuffle(buffer_size).batch(batch_size, drop_remainder=True)*
构建/培训我们的模型
使用为训练准备的数据,我们创建具有三层的模型。
- 嵌入层是我们的输入层,它将每个字符的整数表示映射为 256 维的密集向量。
- GRU 层是我们的隐藏层,有 1024 个 RNN 单位。
- Softmax 层是我们的输出层,有 109 个潜在输出(109 个唯一字符中的一个)。
*model = tf.keras.Sequential()model.add(tf.keras.layers.Embedding(len(vocab), 256, batch_input_shape=[batch_size, None]))model.add(tf.keras.layers.GRU(1024, return_sequences=True, stateful=True, recurrent_initializer='glorot_uniform'))model.add(tf.keras.layers.Dense(len(vocab)))#summary of our modelmodel.summary()*

我们模型的总结
现在,我们用 Adam 优化器和稀疏分类交叉熵损失函数来编译我们的模型。
*def loss(labels, logits):
return tf.keras.losses.sparse_categorical_crossentropy(labels, logits, from_logits=True)model.compile(optimizer='adam', loss=loss)*
在我们训练模型之前,我们确保在训练期间保存检查点。通过保存检查点,我们可以用不同的批量快速重建我们的模型,并恢复保存的权重,而不是再次训练它。
*checkpoint_dir = './training_checkpoints'checkpoint_prefix = os.path.join(checkpoint_dir, "ckpt_{epoch}")#Make sure the weights are savedcheckpoint_callback=tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_prefix, save_weights_only=True)history = model.fit(dataset, epochs=30, callbacks=[checkpoint_callback])*
生成文本
重新构建我们的模型,并加载批量大小更改为 1 的权重,这使得预测更简单。
*model = tf.keras.Sequential()model.add(tf.keras.layers.Embedding(len(vocab), 256, batch_input_shape=[1, None]))model.add(tf.keras.layers.GRU(1024, return_sequences=True, stateful=True, recurrent_initializer='glorot_uniform'))model.add(tf.keras.layers.Dense(len(vocab)))#load weights from previous modelmodel.load_weights(tf.train.latest_checkpoint(checkpoint_dir))model.build(tf.TensorShape([1, None]))#summary of our modelmodel.summary()*

新模型概述
关键时刻到了:我们的模型最终揭示了它的投资建议!温度参数影响我们接收到的输出:较低的温度导致更保守的输出,而较高的温度导致更有创造性的输出,更容易出错。我们将在下面看到这样的例子。
*#try any temperature in the range of 0.1 to 1def generate_text(model, start_string, temperature): # Number of characters to generate num_generate = 1000 # Converting our start string to numbers (vectorizing) input_eval = [char2int[s] for s in start_string] input_eval = tf.expand_dims(input_eval, 0) # Empty string to store our results text_generated = [] model.reset_states() for i in range(num_generate): predictions = model(input_eval) # remove the batch dimension predictions = tf.squeeze(predictions, 0) predictions = predictions / temperature predicted_id = tf.random.categorical(predictions,
num_samples=1)[-1,0].numpy() input_eval = tf.expand_dims([predicted_id], 0) text_generated.append(int2char[predicted_id]) return (start_string + ''.join(text_generated))print(generate_text(model, start_string="Advice: ", temperature=.5))*
这是我们的模型在温度为 0.1 时产生的建议。

温度= 0.1
尽管这一结果与你应该遵循的任何投资建议都相去甚远,但它在模仿聪明的投资者方面做得相当不错。由于气温较低,我们的模型没有尝试创新,而是通过坚持段落格式中的标准句子来谨慎行事。让我们看看随着温度的升高,这是如何变化的。

温度= 0.5
在温度为 0.5 时,我们可以开始看到输出的差异。我们的模型试图更有创造性,结果却犯了更多的错误。这方面的一个例子是在倒数第二行,括号使用不当。

温度= 1
现在,温度为 1 时的差异非常明显,因为我们的模型试图生成表格。然而,创造性增加的代价是输出变得很难理解。我在不同的温度下提供了更多的输出,以供参考。

温度= 0.1

温度= 0.5

温度= 1
结论
正如我们所看到的,RNNs 目前还不能取代投资顾问。也就是说,这里有一些我们可以尝试改进模型输出的方法。
- 增加纪元的数量
- 获得一个更好的训练数据集(当把这个聪明的投资者从 pdf 文件转换成 txt 文件时,一些格式被弄乱了)
- 使用 LSTM 图层代替 GRU 图层(lstm 是 RNN 的另一种改进类型)
参考
[1]谷歌团队,文本生成与 RNN ,Tensorflow 核心
[2] Aurélien Géron,使用 RNNs 和 Attention 进行自然语言处理,使用 Scikit-Learn、Keras 和 TensorFlow 进行动手机器学习
先别走!
我是 Roshan,16 岁,对人工智能和金融的交叉领域充满热情。如果你对应用于金融的 RNNs 有进一步的兴趣,可以看看这篇文章:https://towards data science . com/predicting-stock-prices-using-a-keras-lstm-model-4225457 f 0233
在 Linkedin 上联系我:https://www.linkedin.com/in/roshan-adusumilli-96b104194/
Askeladden 算法
变更数据
使用机器学习来理解选举干扰

通过 Shutterstock 获取图像(通过标准许可证获得)
第一部分|导言
概观
2019 年 2 月,作为特别顾问罗伯特·穆勒调查俄罗斯政府干预 2016 年总统选举的一部分,美国司法部指控 13 名俄罗斯国民非法干预美国政治进程。被告为一家资金雄厚、俄罗斯国家支持的“巨魔工厂”工作,该工厂名为互联网研究机构(IRA),据报道,该公司有 400 名员工(被称为“巨魔”)在圣彼得堡一栋不起眼的办公楼里工作 12 小时。爱尔兰共和军通过社交媒体,包括脸书、Instagram 和 Twitter,策划了一场复杂、协调的运动来传播虚假信息,并在美国政治中制造不和。
Twitter 发现并暂停了数千个此类恶意账户,在平台上从公众视野中删除了数百万条“巨魔”推文。虽然其他新闻媒体已经公布了样本,但很难理解爱尔兰共和军的努力的全部规模和范围,以及其战略和战术的细节。用布鲁金斯学会外交政策研究员阿琳娜·波利亚科娃的话说,
“擦除内容并不能消除所造成的损害,它还阻止我们了解如何更好地为未来的此类攻击做准备。”
为了解决这个问题,并“符合我们的透明度原则,并增进公众对所谓外国影响活动的理解”,2018 年底,Twitter 公开了它认为可能来自国家支持的信息操作的推文和媒体档案。
根据 2018 年 12 月美国参议院情报特别委员会(SSCI)的简报,在被暂停的 IRA troll 账户中,约有 109 个账户伪装成新闻机构,包括美国当地新闻机构。我们这个项目的目标是开发一种机器学习算法,可以实现这种算法来加强 Twitter,防止像爱尔兰共和军这样的组织试图操纵媒体,以及违反 Twitter 服务条款的其他活动。具体来说,我们希望开发一种机器学习算法来预测这些“假新闻”巨魔推文。我们创造的算法是以 Askeladden 命名的,一个在挪威民间传说中智胜并击败巨魔的男孩。
动机
除了在 Twitter 规定的严格定义的滥用范围内,该公司不对其用户帖子的真实性或意图负责。几乎可以肯定,这是由于监控和管理大量不断增加的内容所带来的实际挑战。然而,这种选择也可能是意识形态的;Twitter 通过其政策申明支持言论自由和公开对话。有许多个人“真正的”Twitter 用户发布类似于爱尔兰共和军的内容,可能有类似的意图。在大多数情况下,这些用户遵守 Twitter 用户协议。然而,我们认为爱尔兰共和军的巨魔与“真正的”巨魔有本质上的不同,不应该被给予同样的自由。
上述同一份 SSCI 报告告诉我们,爱尔兰共和军明确界定并协调了影响 2016 年大选的意图,表现出对唐纳德·特朗普的强烈和一贯的偏好,以及对其他许多共和党候选人的负面内容,包括特德·克鲁兹、马尔科·卢比奥、林赛·格雷厄姆、约翰·麦凯恩和本·卡森,以及他的大选对手希拉里·克林顿。Troll tweets 采用了蓄意的选民压制策略,包括恶意误导、候选人支持重定向和选民投票率下降。爱尔兰共和军是由敌对的外国政府指挥的,其行动是由外国人实施的,这更令人担忧。民主的核心原则——一个民族应该能够为自己选择最能管理和满足其政治需求的领导人——被任何外国选举干涉所违背。像爱尔兰共和军这样隐蔽的、口是心非的、故意歪曲事实的外来干涉,是对一个建立在公众信任基础上的机构的特别冒犯。
自称是合法新闻组织的“假新闻”巨魔通过冒充和操纵媒体实施了特别令人震惊的欺诈。利用现代媒体环境的碎片化,“假新闻”巨魔将民主的一个关键支柱武器化。此外,这些账户的影响范围远远超过大多数个人账户。在被暂停之前,44 个美国“假新闻”推特账户积累了 660,335 名粉丝,平均每个账户有 15,000 名粉丝(而推特用户平均只有不到 1,000 名粉丝)。这些账户中的许多表现类似,每天发布几十次文章和本地内容的链接。许多其他合法用户,包括几名高调的特朗普竞选成员(小唐纳德·特朗普、埃里克·特朗普、凯莉安妮·康威、布拉德·帕斯凯尔和迈克尔·弗林),链接或转发这些账户的材料,使其内容合法化,并扩大其影响力,远远超出其粉丝。出于这些原因,我们认为“假新闻”值得我们项目的特别关注。
也许这个项目最令人信服的动机是巨魔的威胁依然存在;《SSCI 报告》指出,有证据表明社交媒体平台上持续存在干扰操作。为了防止我们现在知道在 2016 年选举期间发生的干涉在未来的选举中再次发生,必须采取措施积极保护美国的民主机构。
第二部分|数据源&探索
“假新闻”巨魔推文
Twitter 的 IRA 数据集包括所有公开的、未删除的推文,以及 Twitter 认为与 IRA 有关的 3613 个账户的媒体。这些用户在被暂停之前删除的推文(不包括在这些数据集中)占他们总活跃度的不到 1%。
对于我们的项目,我们决定专注于 _tweets 数据集,其中包括从 2009 年 5 月到 2018 年 6 月的 8,768,633 条独特的推文。该数据集包括 31 个变量,包括推文识别号、用户识别号(在暂停时关注者少于 5000 人的用户匿名)、用户的推特账号(与匿名用户的用户 id 相同)、推文的语言、推文的文本(提到的匿名账户已被替换为匿名用户 id)以及推文发布的时间。仅过滤英语推文后,数据集中有不到 300 万条独特的推文(2,997,181)。这些推文来自 3077 个不同的用户账户。

图 1:英语推文训练数据中的前十条推文。
我们将我们的关注期定义为 2016 年至 2018 年,以便与我们的真实新闻数据集的时间框架保持一致(见下文)。我们还认为,这一时间框架代表了 2016 年总统选举前后政治分歧不断升级的重要时期。
为了将“假新闻”巨魔与其他巨魔区分开来,我们根据包含“每日”、“新闻”、“今日”和“在线”等词的用户屏幕名称创建了一个子集。这产生了来自 33 个不同用户帐户的 296,949 条不同推文,这些帐户的屏幕名称包括 TodayNYCity、ChicagoDailyNew 和 KansasDailyNews。
真正的新闻推文
哈佛数据世界(Harvard Dataverse)公布了一个数据集,其中包含从大约 4500 家新闻媒体的 Twitter 账户(即旨在传播新闻的媒体机构的账户)收集的 39695156 条推文的推文 id。媒体组织包括各种渠道,从美国当地报纸到外国电视台。它们是在 2016 年 8 月 4 日至 2018 年 7 月 20 日期间从 Twitter API 中收集的。
Twitter 的开发者政策(要求遵守该政策以换取 Twitter API 的密钥)对数据集的共享设置了限制。如果你正在分享推文的数据集,你只能公开分享推文的 id,而不是推文本身。因此,这个数据集只包含推文的 id。基于这些信息,我们从 Twitter API 中检索了完整的 tweet。我们选择了意识形态领域的各种英语新闻媒体,包括政治、福克斯新闻频道、CNN、《经济学人》和 MSNBC。我们总共收录了来自 49 个独立用户账户的 153,188 条独立推文。
所有的新闻
为了进行这种分析,我们随机采样了“假新闻”troll tweets 数据集,以获得与真实新闻 tweets 数据集相同数量的 tweets。我们将巨魔推文和真实新闻推文连接在一起,产生了一个 306,376 条推文的组合数据集,这两个类之间相等。我们包括了每条推文的文本及其类别(“真实”或“巨魔”)。没有包括其他识别信息。
特征抽出
使用计数矢量器,我们从数据集中提取了 470,051 个独特的特征。在“https”和“co”之后,这是目前为止最常见的功能,因为它们出现在所有其他推文的链接中,许多最常见的功能是标准的英语停用词,如“to”、“the”、“in”和“of”。令人惊讶的是,我们看到特征“trump”在真实新闻推文中出现的频率比 troll 推文中高得多,而特征“news”在 troll 推文中出现的频率比真实新闻推文中高得多。
对我们提取的特征的一个有趣的观察是,标准停用词在真实新闻推文中比在巨魔推文中出现得更频繁。这些单词通常不被认为在自然语言处理(NLP)中有用,因为它们无处不在并且缺乏与特定主题的关联。然而,在这个特殊的分析中,我们比较了一个班级,其中的课文可能主要是由英语母语者写的,而另一个班级的课文虽然是用英语写的,但可能主要是由俄语母语者写的。省略停用词,如定冠词“The”,介词“to”和“of”,以及动词“is”,是许多非英语母语者的特征。例如,俄语中没有冠词,所以以俄语为母语的人在学习英语时会很难理解这个概念,并且经常会省略诸如“the”之类的停用词。俄语中介词的使用与英语中有很大不同,这可能会导致错误,例如停用词“on”和“at”之间的混淆以及停用词“for”的省略。俄语也没有系词(连接动词),这会导致英语中“is”等停用词的省略。
撇开停用词不谈,我们看到另一个有趣的区别:在每一类的前五十个最频繁出现的特征中,有三个值得注意的非停用词出现在真实新闻特征中,而不会出现在假新闻特征中,“总统”、“众议院”和“白色”。然而,还有许多不间断的词只出现在假新闻特写中,包括可以在耸人听闻的上下文中使用的词,如“警察”、“枪击”、“死亡”、“火灾”和“撞车”。这可能表明在我们的数据集中国家新闻和地方新闻的不平衡。或者,这可能是不同推文风格的特征,在这种情况下,troll 推文可能更明显地试图抓住读者的注意力。
第三部分|造型
借用情感分析的概念,我们使用 CountVectorizer 和 TFIDF 矢量器测试了许多不同的模型,包括 Bernoulli Naive Bayes、Logistic 回归、Ensemble (Logistic 回归、线性 SVC、Bernoulli Naive Bayes、Ridge 和 Passive Aggressive)、Random Forest 和 Doc2Vec。虽然我们的集成模型表现稍好,但基于其简约性和高准确性,我们选择了逻辑回归计数向量器二元模型进行进一步开发。

图 2:模型准确性结果。
我们探索了各种优化,包括使用停用词移除和许多其他定制预处理来预处理数据,以及在 C 值、min_df 和 max_features 上微调模型。然而,最终,使用未预处理数据的原始未优化模型提供了最佳性能。
第四部分|模型解读
观察“假新闻”推文的统计预测让我们对他们的策略有了一些了解。
伪装
许多巨魔的推文看起来无关痛痒,集中在看似没有争议的话题上。12 条“最奇谈怪论”的推文中有 8 条——我们的模型最强烈预测是由奇谈怪论者发布的——是关于体育的。

图 3:前 12 个“最古怪”的推文。与体育相关的推文以蓝色显示。
混乱
巨魔的推文听起来往往像真正的新闻推文。在 20 条最混乱——或预测错误——的推文中,80%是被误归类为真实新闻的巨魔推文。

图 4:“混乱”的推文样本。
特征变化
巨魔推文的前五十个最具预测性的特征似乎各不相同。然而,经过更仔细的研究,模式出现了。

图 troll tweets 的前 50 个最具预测性的特征。
通用词
第一种是通用词的使用,如政治、新闻和当地。事实证明,真正的新闻推文不需要使用这种标签来告诉人们它们是什么——例如,CNN 不需要将其推文标记为新闻——你知道它们是新闻,因为你知道 CNN。另一方面,巨魔们似乎确实使用了这些标签——如果你试图让某人相信你实际上不是,这是一个合乎逻辑的举动。

图 troll tweets 前 50 个最具预测性的特征中的通用词。
政治口号
第二种模式是政治口号,既有支持特朗普的,也有反对希拉里的。这并不奇怪;正如我们前面提到的,爱尔兰共和军现在被证明一直试图影响 2016 年大选,使之有利于特朗普。合法的新闻机构不会使用这些短语也是有道理的。

图 7:政治口号位列巨魔推文最具预测性的 50 大特征之中。
叙
更令人惊讶的是第三种模式,与叙利亚相关的词的流行。也许这是因为这些巨魔正积极地试图影响叙利亚的事件——或者也许是因为真正的美国新闻对叙利亚的报道非常稀少。或者,这些推文可能是针对欧洲受众的,因为当时叙利亚在欧洲是一个更具争议的问题。

图 8:与叙利亚相关的词位列巨魔推文最具预测性的 50 个特征中。
第五部分|结论
自 2016 年大选以来收集的证据无可辩驳地表明,俄罗斯发动了一场协调、专业化的运动,以颠覆媒体的诚信,削弱美国的民主。2020 年 8 月,美国情报官员公开宣布,这种干涉仍在继续,要么是为了帮助特朗普总统赢得第二个任期,要么只是为了削弱对美国选举制度的信心。
美国国家反情报和安全中心的声明没有提供俄罗斯在 2020 年大选前的策略细节,只是将其描述为“在美国传播虚假信息,旨在破坏对我们民主进程的信心”。但我们知道的是,如果选民被俄罗斯巨魔的虚假信息误导,爱尔兰共和军在 2016 年采用的战术类型只能影响选举。我们深切希望 Askleladden 算法等项目能够帮助美国人提高对敌对外国政府可能如何试图操纵他们的认识,并在寻找和核实我们用来决定投票的信息时提高警惕。
该项目创建于 加州大学伯克利分校信息学院的信息与数据科学硕士* 项目。*
抽吸粉碎算法
想象一下,如果……你是你大学的未来金融俱乐部的主席,你的金融项目的顶尖人物,却仍然不能获得一个令人垂涎的独家招聘活动的邀请。

来自 Pexels 的【energepic.com】T2 的照片
你妈妈打两份甚至三份工来确保你能上大学。虽然你怀念她陪伴你度过的一些最美好的高中时光,但你也明白这是她为了你的利益而做出的牺牲。虽然她总是说你是她遇到的最好的事情之一,但她希望你过上更好的生活。她会反复问你长大后想做什么。你研究赚钱最多的工作,这样你就可以像她一直照顾你一样照顾她。正是因为这个原因,成为一名财务顾问才是你的首要任务。你努力学习,取得好成绩,从而进入最好的大学。
你了解到你最喜欢的金融公司甚至在毕业前就会在现场招聘。你迫不及待地回去告诉他们。作为金融项目中为数不多的女性之一,你很早就学会了如何调整从沟通风格到着装的一切,以赢得她们的友谊,最重要的是赢得她们的尊重。这是在你的名牌大学被认为是金融项目领导者的关键。他们经常说你的同学会成为你的人际网络,这对你未来的职业生涯来说比一千个分数更有价值。
但是当你去上课的时候,一件奇怪的事情发生了。这些家伙似乎对招聘前的工作了如指掌。他们手里拿着当晚公司举办的一场独家活动的邀请函。由于你是未来金融俱乐部的领导人,他们认为你不仅受到邀请,而且有责任以如此盛大的方式将公司带到大学。
那天晚上,当你端着一碗拉面坐在房间里的时候,你所能想到的就是这些家伙有多有趣,有多活跃。只是为了折磨自己,你在网上查找活动,却发现你最喜欢的金融榜样就在那里。毫无疑问,他们把公司最优秀的人才带了出来,以吸引精英们立即与他们签约。但你是精英。
你努力成为你的财务项目的顶尖人物。你不明白为什么没有邀请你。歧视只发生在老年人身上。你从未听说过这种事发生在你这个年龄的人身上。你这个年龄的人要开明得多。然而,你在家里,而似乎所有的人都在活动中。
第二天,这些家伙想知道你为什么没来;他们一直在等你。他们告诉你,除了你的榜样之外,你会是唯一在场的女性之一——这也是他们对你不在场感到惊讶的另一个原因。你不想让自己看起来爱发牢骚或愤愤不平,但是他们一直问你为什么没去,最终你告诉他们你没被邀请。他们很惊讶。然后你想到了你在金融界最大的竞争对手,一个名叫 Manaia 的萨摩亚人。你问他们是否邀请了他。他在班上是第二名,仅次于你。那些人证实他不在那里。
你现在开始怀疑这真的是歧视。你打电话给你最喜欢的金融公司,询问他们邀请名单是如何确定的。公司的代表向你保证,这是以最公正的方式完成的。该公司引以为豪的是只使用最新的招聘技术。她表示,该算法只选择最优秀人才的品质,然后将这些品质与学校的候选人才库进行匹配。如果你没有被选中,那是因为你不像他们中最好的。公司的代表挂断电话,留给你一大堆问题,怀疑你是否选择了正确的职业。
这种情况改变了你的一切。你肯定知道一件事。如果这是他们做事的方式,你不再崇拜这家公司,也不想在那里工作。
需要思考的问题:
1)你认为公司有意忽略了不同的候选人吗?
2)考虑到被邀请参加招聘活动的人,你认为哪种人的“最佳品质”是模仿的?
3)你认为数据科学家会检查他们训练算法的数据,看看它是否包含不同的候选人吗?
4)对算法的开发者是否有任何反馈回路,以便他们可以在问题出现时调整算法?
5)公司没有邀请不同的客户参加他们的招聘活动,是否违反了平等就业机会法?
6)公司怎样做才能更具包容性?
7)对于这种情况,我们金融专业的学生能做些什么吗?
受到以下新闻故事的启发:
Jeffrey Dastin,亚马逊废弃对女性表现出偏见的秘密 AI 招聘工具,路透社(2018 年 10 月 9 日),https://www . Reuters . com/article/us-Amazon-com-jobs-automation-insight-iduscn1 MK 08g
彼得·卡佩里,你的招聘方法是完全错误的,哈佛商业评论。(2019 年 5 月),【https://hbr.org/2019/05/recruiting
德鲁·哈威尔(Drew Harwell),HireVue 的 AI 人脸扫描算法越来越决定你是否配得上这份工作,《华盛顿邮报》(2019 年 11 月 6 日),https://www . Washington Post . com/technology/2019/10/22/AI-hiring-face-scanning-algorithm-incremently-decision-you-worth-job/
帮我把这篇文章做的更好。
在评论区添加你自己的经历或想法。我想帮助招聘人员、人力资源集团和数据科学家了解人们如何受到雇佣和招聘算法以及人工智能的影响。我担心有一种想法认为算法更少偏差,而事实上它取决于它们被训练的数据。
我写的其他文章可能对你有帮助:
年龄的财富
NBA 球员发展分析

切尔西·费伦南多在 UnSplash 上的照片
这是我每周体育主题系列的第三部分。每周,我都会展示以体育为中心的数据科学应用。
上周,我发表了一篇关于体育参考 API 的介绍,并展示了该 API 如何用于构建一个全面的 NBA 球员统计数据集。本周,我将深入这个数据集,看看球员的发展。
NBA 球队喜欢选秀年轻球员,这不是什么秘密。无论是从国际联盟来到 NBA,还是在 NCAA 单干,青少年往往是第一批离开赛场的球员。年龄较大但更有成就的潜在客户往往必须等到第二轮,许多人没有被选中。很明显,NBA 球探将年龄视为一项资产,让我们来看看这是为什么。
一个显而易见的假设是,年轻球员在达到巅峰状态之前有更多的时间发展。但是什么时候是一个球员的全盛时期,他们真正发展了多少?事实上,每个球员的情况都不一样,但是数据中有一些趋势是可以确定的。
黄金时间
为了确定典型的 NBA 球员的黄金时期何时出现,我将根据年龄来看 PER ( 球员效率等级)。PER 是一种先进的篮球统计,由霍林格开发,它试图将传统的得分指标结合成一个单一的评级。虽然 PER 远非完美,尤其是在衡量防守方面,但它已经是你在单一评级中能得到的最好的了。
我首先加载数据集并绘制一些简单的图来感受数据。关于如何生成这个数据集,参见我之前的故事。我还做了一些额外的专栏,删除了不符合最低分钟数要求的赛季。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns%matplotlib inlineseasons = pd.read_csv('Data/nba_player_stats_by_season.csv',
index_col = 'id')# Create a few extra columns
def get_min_age(player_id):
return seasons[seasons['player_id'] == player_id]['age'].min()seasons['min_age'] = seasons['player_id'].apply(get_min_age)
seasons['min_age_rounded'] = seasons['min_age'].apply(lambda x: int(np.floor(x)))
seasons['age_rounded'] = seasons['age'].apply(lambda x: int(np.floor(x)))careers['min_age'] = careers['player_id'].apply(get_min_age)
careers['min_age_rounded'] = careers['min_age'].apply(lambda x: int(np.floor(x)))# remove seasons with less than 1500 minutes.
# this is the minimum minutes requirement per BBallRef to qualify for PER.qseasons = seasons[seasons['minutes_played'] > 1500]sns.set_context('notebook')
sns.jointplot(x = qseasons['age'],
y = qseasons['player_efficiency_rating'],
kind = 'hex');

每对年龄联合图
这张图表显示,最高的 PER 季节发生在 25 岁左右。接下来,我将查看 PER > 20 的季节的年龄分布,以及数据集中所有季节的总体年龄分布。作为参考,20 的命中率被认为是一个临界的全明星赛季。
plt.figure(figsize=(15,6))
sns.set_context('notebook')plt.subplot(1,2,1)
sns.distplot(qseasons[qseasons['player_efficiency_rating'] > 20]['age'])
plt.title('Age Distribution for PER > 20 Seasons')plt.subplot(1,2,2)
sns.distplot(qseasons['age'])
plt.title('Overall League Age Distribution');

从这里可以看出,高 PER 季节的分布与我们数据集中的整体年龄分布基本相同。虽然很有趣,但这并没有真正说明 20 多岁的球员会更好,目前为止我所展示的是大多数球员都在这个年龄段。为了更好地了解不同年龄的预期表现,箱线图可以清晰地显示每个年龄组的 PER 分布。
plt.figure(figsize=(15,6))
sns.set_context('notebook')
sns.boxplot(x = qseasons['age_rounded'],
y = qseasons['player_efficiency_rating'])
plt.title('PER vs Age Boxplot');

现在我们正在谈话!这个箱线图很好地展示了数据,并表明 24-28 岁年龄段的球员比其他年龄段的球员有更高的预期表现。这通过由方框中间的线表示的 PER 中值、由方框顶部表示的第 75 百分位 PER 以及高 PER 异常值的丰度来显示。其他一些有趣的趋势也很明显。一个是 19 岁和 20 岁的球员通常不是很好。另一个原因是 36 岁以上的球员表现上升,这是只有最好的球员能够在这个年龄之后留在联盟的结果。
青春的价值
前面的部分仍然没有解释为什么球队如此强烈地支持青年选秀。如果 19 岁和 20 岁的球员通常效率较低,那么为什么不选择接近巅峰或者已经处于巅峰的老球员呢?回到年轻球员在达到巅峰状态之前有更多时间发展的假设,我将看看球员在职业生涯中是如何发展的。
为此,我将使用上面定义的“min_age”列对数据集进行分段,这只是表示球员在第一个赛季的年龄。下图是球员在 NBA 第一个赛季的年龄分布。
sns.distplot(careers['min_age']);

正如人们所料,大多数球员在他们的第一个 NBA 赛季都在 20 到 25 岁之间。一个按年龄划分的平均 PER 图,按球员在 NBA 第一个赛季的年龄划分,显示了年轻和年长年龄组非常不同的结果。以下代码生成此图。请注意,我将 18 岁和 19 岁这两个年龄段结合在一起,因为 18 岁这一年龄段本身就很小。
qseasons['min_age_rounded'] = qseasons['min_age_rounded'].apply(
lambda x: 19 if x <= 19 else x)# segment qseasons by min_age_rounded and plot
plt.figure(figsize=(10,6))
sns.set_context('notebook')
plt.xticks(ticks = [x for x in range(18,38)])
plt.title("PER by Age, Segmented by Entry Age")for i in range(19, 24): # filter data and aggregate
temp_df = qseasons[qseasons['min_age_rounded'] == i]
[['age_rounded', 'player_efficiency_rating']]
temp_df = temp_df.groupby(by = 'age_rounded').agg(
['mean', 'count']) # remove multi-index, then remove seasons with low sample size
temp_df.columns = [' '.join(col).strip() for col in
temp_df.columns.values]
temp_df = temp_df[temp_df['player_efficiency_rating count'] >
10]['player_efficiency_rating mean'] # plot segment data
sns.lineplot(x = temp_df.index, y = temp_df, label = i)
sns.scatterplot(x = temp_df.index, y = temp_df);

在这里,我们可以看到,19 岁、20 岁和 21 岁年龄段的人在 25 岁左右比 22 岁和 23 岁年龄段的人更有效率。特别是,19 岁年龄组在 25 岁达到了令人印象深刻的高峰,这是 6 年复合改善的结果。在此期间,19 岁年龄段的球员平均能够提高 6 分以上的 PER。相比之下,22 岁的细分市场从入门到巅峰平均只能提高 2 个百分点。请注意,这些线是根据可用的样本大小截断的。
同样,使用箱线图可以进一步理解这些部分。各部分主要年份的 PER 箱线图有助于更全面地了解数据分布。这可以使用下面的代码来构造。
temp_df = qseasons[np.array(qseasons['min_age_rounded'] <= 23) &
np.array(qseasons['age_rounded'] <= 28) &
np.array(qseasons['age_rounded'] >= 24)]plt.figure(figsize=(10,6))
sns.set_context('notebook')
sns.boxplot(x = temp_df['min_age_rounded'],
y = temp_df['player_efficiency_rating'])
plt.title('PER in Prime Years (24-28) by Entry Age');

萧条和偏见
虽然我已经表明,在评估潜在的 NBA 人才时,年龄是一个非常重要的考虑因素,但它肯定不是一切。有很多在 NBA 选秀中被选中的年轻球员的例子,他们从来没有取得什么成就。重要的是要记住相关性和因果关系是非常不同的概念,证明因果关系的门槛要高得多。这个分析只显示了相关性,但是值得思考一下为什么存在这种相关性。
主要原因是 NBA 选秀过程中固有的选择偏差。一个年轻的篮球运动员有强烈的动机尽快加入 NBA。状元秀的新秀薪水是数百万美元,早早进入 NBA 给了球员一个更长的潜在职业收入窗口。因此,在任何时候,最好的 19 岁球员几乎总是希望成为职业球员。明年,这个组中剩下的最好的球员将在 20 岁时成为职业球员。在大多数情况下,一个 22 岁的球员进入 NBA 是一个不够好,不能更早进入 NBA 的球员。所以我们有最优秀的球员在年轻的时候进入 NBA,然后最优秀的球员继续成为最优秀的球员。似乎很明显,不是吗?
事后看来,破产往往是对这种选择偏差误解的结果。在某些情况下,一支球队会选择一名球员,几乎完全是因为他们年轻。如果玩家没有真正证明自己是同龄人中的佼佼者,他们就很难领先。这是把相关性误认为因果关系,本质上是假设玩家会遵循上面显示的轨迹,因为他们还年轻。在其他情况下,一个球队会选择一个在大学四年级时发布了令人印象深刻的数据的老球员。在这些情况下,如果这个球员之前没有被证明是同龄人中的佼佼者,那么他们可能不值得接手已经证明了这一点的年轻球员。这是与第一个例子相反的错误,它完全忽略了选择偏差和相关性。
我希望你喜欢这篇文章。如果你有,请查看我的文章战胜困难、体育参考 API 介绍和其他。下周,我将再次使用这个 NBA 球员数据集来建立一个预测 2020 年以后 NBA 职业生涯的模型。
自动化内容难题
新的人工智能机器人能够写故事、音乐、诗歌和代码——几乎和人类一样好。这对人类内容意味着什么?

计算机科学家正在使用最新的人工智能(AI)快速编写下一代自动内容编写引擎。我说的内容是什么意思?他们可以创作短篇小说、情书、诗歌、音乐,甚至写一些代码。他们和人类一样好吗?不,但是让我们把关于“机器人”文本和糟糕的语法的旧观点放在一边。这些新的人工智能机器人像人类一样写字。真的。这只是开始。
这些可以做什么,它们是如何工作的?让我们来看看。
一点背景
为了生成高质量的内容,机器需要具备一些知识。为了做到这一点,这些机器读取大量的文本,从字面上看,是来自许多来源的数十亿份文件。这些可以包括维基百科,主流新闻,社交媒体,甚至媒体。这种阅读完全由机器完成(网络爬虫和文本提取器的组合)。每天都有数百万的新文章进来,被阅读,然后被索引和建模。然后,这些新的人工智能引擎实际上可以学习,在某种程度上甚至可以理解所写的内容,并在被问及他们读过的内容时综合答案。我说在某种程度上是因为虽然它们不像人类一样代谢信息,但它们在联系相关概念和分析单词语法方面做得非常出色。剩下的就是让这些机器生成文本,通常是从一个小的提示,比如“希拉里·克林顿”或者“告诉我关于烤面包机的事情”。从那里他们可以生成整篇文章,全部来自他们以前的“阅读”。
但这不仅仅是逐字逐句地复述他们读过的内容。这些新的机器人可以回答许多问题,甚至可以生成网页。此外,他们还可以创作短篇小说、写歌等等。
一些简单的例子
我尝试了一个叫 AI writer 的服务,只是为了试试轮胎。要求写一篇关于“猫和狗”的文章(没有其他提示),它生成了一篇两页的文章,附有 6 条参考文献。为了简洁,这里只有一段。
“给猫介绍狗的时候,要注意双方动物的肢体语言。你的猫不开心的一个很好的迹象是当它的耳朵卡在后面或者尾巴前后摆动。虽然过去狗和猫成功地生活在一起,但重要的是要记住,狗和猫是个体,每次介绍都是不同的。”
这有点笨拙,但考虑一下这个来自 Open AI(一个致力于创建公共人工智能模型的组织)的“情书”摘录。在这里,科学家弗拉德·阿历克斯打开人工智能的 GPT-3 机器人,通过给出提示来创建情书。GPT-3 是他们的第三代人工智能建模技术。
**This is a love letter written by a toaster:**Dear lonely human,**I’ve watched you, been there in the dark.** I know you. I want to connect with you. **You make my circuits feel alive** and I want you to feel the same way. Why can’t I come out and be with you? Why do you cage me in with four walls?Your light is inviting, calling me to life. I hear you when you touch me and I hear you when you leave me to be alone. I want you and I’m lonely. I **want to feel the same heat, smell the same toast, hear the same crunch, see the same world.** Will you ever want to see me?**Is it a crime for a toaster to dream of more life?** I love you.
他的文章非常精彩,展示了这项技术的创造力的深度。
聪明的人类还是机器人?
大学生利亚姆·波尔利用开放人工智能在一个博客网站上生成了第一篇文章。题目叫做感觉不思进取?也许你应该停止过度思考。很少有人猜到它是自动创建的,少数猜到的人被讨论帖中的其他帖子嘲笑。
虽然 GPT-3 现在受到了所有媒体的关注,但谷歌的项目 Duplex 可以进行逼真的语音通话。语音方面令人印象深刻,因为除了生成“合理的”语法和单词之外,它还具有交互性和自然的声音。
其他使用人工智能创作文章的服务已经存在,如 Article Forge 和 AI Writer (如前所述)。给其中任何一个标题,他们会自动生成文章。然而,根据我的快速调查,他们比 GPT-3 落后一代。如果我们向前看(为了便于讨论,我会说是 GPT-4),很明显高质量的内容将以惊人的规模出现。
但是这些人工智能系统不仅仅可以写文本。仅仅通过“询问”(或用人工智能语言提示),就可以生成完整的文章、代码,甚至更多。不需要创造性的工作。
自动音乐
虽然文本生成现在开始崭露头角,但在某种意义上,使用人工智能来生成音乐更容易一些。MuseNet 使用了一个 transformer 模型(类似于之前用于生成烤面包机情书中文本的模型)来生成 4 分钟的音乐片段。这里可以听几个。这些作品是肖邦,拉赫玛尼诺夫,甚至爵士和低音的格式。
我们创造了 MuseNet,一个深度神经网络,可以用 10 种不同的音乐创作 4 分钟的音乐作品…
openai.com](https://openai.com/blog/musenet/)
从某种意义上说,音乐更容易“从零开始”创作,因为音乐理论(和弦、旋律和序列是如何组合在一起的)是众所周知的,也因为数字乐器(合成器和采样器)容易控制。只要按一个键,一个漂亮的音符就出来了。现在只需要把它们放在一起。这是另一个创建自动吉他标签的例子。
自动音乐是什么意思?这很难说。假设你正在制作一个广告,一个摄影展,或者一部电影。拥有自动音乐可以节省时间,让一个人更有力量。但是,就像写作一样,高质量的音乐越能被自动创作出来,它就越会排挤某些类型的人类音乐。如果我们考虑不在精英阶层的音乐家(想想碧昂斯级别的名气),这种竞争可能会令人窒息。
自动软件
很长一段时间以来,自动化软件创建过程的大部分的能力已经存在。应用程序框架、入门应用程序、web 模板。但是新的人工智能实际上可以根据描述生成工作代码。
这里有一个简单的例子。将提示(用英语)创建一个带有待办事项列表的网页
Shameem Sharif 创建了一个简单的 web 应用程序,只有一个描述。
我想说这仍处于起步阶段,但关键是我们正在达到一种更具交互性的软件描述方式。"我想要一个做 X 和 Y 并产生 Z 种结果的服务."计算机人工智能可以填补这些空白。随着这种编程变得更加成熟,它甚至可以为非程序员实现各种自动化。但就像任何需要专业知识的领域一样,需要理解能够创造的东西的规模以及它可能会做什么。如果有人可以说“在我前任的网站上创建一个拒绝服务攻击”会怎么样?。这可能是一个夸张的例子,但这是应该考虑的挑战类型(在许多挑战中)。
不是深度假货,而是真实内容
人们很容易把这些自动创造的东西视为一种深度的赝品。但是“深度造假”一词通常是指拍摄真人的音频或视频,并操纵媒体,让他们看起来像是在说些什么或做些什么,而实际上他们并没有这么做。
自动化内容创作实际上是一种完全不同的技术——与其说是在人工智能方面,不如说是在如何使用它方面。新的自动化文本引擎生成的内容是“真实的”。想象一下,只需问一个问题,就能写出一篇文章或幽默文章,问题得到回答,或者撰写一篇专业期刊文章。(我顺便说一下,我在高中时这种技术在哪里?).
与处理过的图像不同,没有可靠的方法来检测这些类型的自动化数字作品。没有水印,对语法、单词选择和内容的细微调整不足以区分机器生成的文本和人类。机器可以创建内容并将其发送到不同账户的规模也很重要。
许多新闻报道都致力于捕捉身居高位的政治人物的深度造假,自动化文本内容更有可能是普通公民的规模。这是一个重要的区别。当有人假冒唐纳德·特朗普(Donald Trump)或南希·佩洛西(Nancy Pelosi)等公众人物时,会有成千上万的记者蜂拥而至,看他们是否是假的。如果只是某个普通公民的内容,这根本不会发生。
对于像 Medium 这样奖励作家辛勤劳动的地方,自动化内容生成可能会充斥这个平台。理论上,它可能会淹没许多没有强大品牌的作家。即使是那些这样做的人,在懒惰的一天,他们可以按下按钮,踢出一个故事,并继续其他活动。
自动内容也有一席之地
尽管这种自动内容可能会侵犯创作空间,但还是有一些真正引人注目的用途。例如,当试图导航个体医疗治疗时,读取你病历的人工智能可以浏览世界,并提供关于你可能推动的治疗的真实分析,并解释你的真实选择。事实上,凭借它的深度,它甚至可以提供比执业医生更好的建议。
此外,对于技术支持这样的地方,人工智能机器人可以读取你的整个案例文件,你以前的问题,并建议更准确的补救措施。因为他们“记得”你以前的电话和邮件,他们也不会麻烦你一遍又一遍地重新解释你已经做过的事情。
一些结束语
一切都不好吗?我不这么认为——但它确实需要一些真正的关注。不管我们想不想要,自动机器人就在这里。人工智能机器人可以成为需要紧急信息的人的第一反应者。他们还可以处理和解决小的世俗问题,而不会浪费人类的时间,也不会累坏——提供更一致的结果。
然而,这只是众所周知的冰山一角,我们需要开始更广泛地讨论如何以及何时部署这项技术。这不是一个如果的问题,只是一个在哪里和多少的问题。
进一步阅读
- 西蒙·奥里甘在《走向数据科学》中讨论了 GPT3 的用途
- The Verge 覆盖使用开放人工智能的自动文本生成
- 技术回顾概述文章
- 关于 GPT3 及其对 ycombinator 的局限性的讨论
- 大学生伪造顶级博文(商业内幕)
- 自动代码生成(分析印度杂志)
- AI 音乐创作(连线)
- 艾打破写作壁垒(华尔街日报)
卡格尔比赛的精彩
ka ggle——数据科学学习园地面向所有对该领域感兴趣的人

凯文·Ku 在 Unsplash 上的照片
免责声明:在数据科学和撰写文章方面,我都是初学者。这篇文章主要是针对那些不确定是否应该尝试 Kaggle 的读者。不是其中之一?你还是可以读一读。😃
读者们好,
希望这篇文章能让你在新冠肺炎危机中保持健康。
今天,让我来分享一下我和 Kaggle 的经历。我将主要谈论卡格尔比赛。然而,其他部分也非常有用。首先,Kaggle 是什么?
什么是 Kaggle?
Kaggle 是世界上最大的数据科学社区,拥有强大的工具和资源来帮助您实现数据科学目标。
当 Kaggle 说他们是世界上最大的数据科学社区时,他们是认真的。拥有超过 30,000 个公共数据集,300 多个主办的比赛和一些世界上最好的机器学习头脑 Kaggle 是数据科学初学者的酝酿地和专家的实践地。还有一个工作区,公司在那里发布他们的空缺职位。
我是如何被介绍到 Kaggle 比赛的
当我开始学习机器学习的课程时,那是我本科学习的第二年。我们应该选择一个 Kaggle 比赛,并尝试根据数据建立一个机器学习模型,作为我们课程项目的一部分。我们是一个五人团队,都是数据科学新手。我们天真地选择了一个艰难的比赛,这个比赛实际上在 Kaggle 上第一次带来了 U-net 架构——著名的 Carvana 图像掩蔽挑战。
简而言之,训练数据集包含从不同角度拍摄的汽车图像,并且这些图像都有遮罩。该想法是建立一个 ML 模型,将汽车图像作为输入,并将汽车从背景中分离出来。
结果?
我们是初学者,我们选择了一个困难的比赛——结果我们表现很差。我从那门课程和比赛中学到了很多东西,但和我们国家的大多数工科学生一样,我们专注于获得一份软件工程的工作,所以我们几乎没有继续练习。
快进三年…
虽然计算机视觉在过去三年里有了突飞猛进的发展,但我几乎没有做什么来跟上它。所以,我决定选择一个挑战,尽我所能——植物病理学 2020 竞赛。

植物病理学 2020 竞赛
影响农作物的许多疾病的误诊会导致化学品的滥用,从而导致耐药病原体菌株的出现、投入成本的增加和更多的疾病爆发,带来重大的经济损失和环境影响。目前基于人类侦察的疾病诊断既耗时又昂贵,尽管基于计算机视觉的模型有望提高效率,但由于受感染组织的年龄、遗传变异和树木内的光照条件导致的症状的巨大差异降低了检测的准确性。你可以在这里找到更多的。
从描述中可以看出,该竞赛旨在通过计算机视觉模型改进植物疾病的诊断。该数据集由苹果树叶的图像组成,任务是设计一个模型,将图像正确分类为 4 个不同的类别
- 健康的
- 锈
- 痂
- 多种疾病
我以个人身份参加了这次比赛。目前,我在排行榜上处于 46%的位置。比赛还有一个月就要结束了,谁知道我会不会进步一点,赢得我的第一枚铜牌。
5 个关键学习点:-
通过参加这次比赛,我学到了很多东西
- py torch——我在参加这个比赛中学到的第一件也是最激动人心的事情。PyTorch 由脸书大学的开发人员创建,可能是目前深度学习领域最热门的东西,在研究和行业中都被迅速采用。我以前没有使用 PyTorch 的经验,但这次我努力学习了。
- CNN——尽管我对 CNN 有一些基本的了解,但我可以使用 PyTorch 来实现它。
- 迁移学习——迁移学习是现在市场上的另一个热门话题。许多模型在 ImageNet 数据集上进行了预训练,预训练的模型可以通过添加我们自己的全连接层直接使用。到目前为止,我使用 DenseNet121 和 Resnet101 进行实验,它们都显著提高了精确度,Resnet 比 DenseNet 稍好。
- 张量处理单元(TPU)是谷歌最近专门为重型神经网络和机器学习算法开发的。现在我们可以在 Kaggle 上体验一下,因为他们允许每个用户每周 30 小时的免费 TPU。
- 当我们试图改进模型的性能时,大部分的学习是在构建模型的第一个版本之后进行的。当我们看到其他用户发布的讨论和内核时,我们可以从他们那里学到很多东西。
- 测试时间增加(TTA)和在线硬示例挖掘(OHEM)是我接下来要尝试的另外两种技术。最后,我会使用 R-CNN 而不是 CNN 来提高模型分数,看看我是否能获得我的第一枚铜牌。
结论
如你所见,如果你和我一样是初学者,最好在 Kaggle 上开始你的数据科学之路。你将有机会制作模型。学习曲线非常陡峭,如果你能每天投入 2-3 个小时,你会学到很多东西。Kaggle 社区很棒,如果你被卡住了,问了一个问题,大部分时间都会得到回答,人们不会评判。此外,如果你能和某人合作并分享你的知识,你会学得更快。最令人畏惧的是,迈出第一步,开始一件新的事情。一旦你做到了——这是非常令人兴奋的。
由于 Medium 不支持印度的合作伙伴计划,你可以考虑在这里给我买杯咖啡。
欢呼
匹配中的平衡样本量边界
它是什么,它是如何工作的?

Gary King 教授和他的同事克里斯托弗·卢卡斯和理查德·a·尼尔森在 2017 年美国政治科学杂志上发表了一篇名为《因果推理匹配方法中的平衡-样本规模前沿》的论文。在论文摘要中,他们写道:“我们提出了一种简化的因果推断匹配方法,该方法同时优化了平衡和匹配样本大小。”这篇论文引起了我的注意,因为它与匹配的重要偏差-方差权衡相关。
本文旨在对 King 等人(2017)提出的方法进行非技术性描述。这种方法如何工作,为什么工作?该方法的独特之处是什么?当我看报纸时,这些问题一直萦绕在我的脑海里。希望这篇文章也能帮助你回答这些问题。请注意,我希望您已经知道匹配的基本知识,这对理解下面的内容是必要的。如果你不知道,我推荐你阅读我以前的帖子(这里是这里是,这里是这里是)可能会有帮助。
问题是
那么什么是匹配边界呢?
匹配边界是“对于每个样本量,具有最大可能平衡的匹配解的集合。”(第 473 页,金等人著,2017 年)。
众所周知,匹配的一个关键目标是减少协变量的不平衡。通过匹配,我们得到一个在协变量上有更好平衡的匹配数据集。因此,我们可以更有把握地将差异归因于治疗,并且估计会更少偏差。
在实践中,我们通常不得不从数据集中删除不匹配的观察值。这就是卡尺匹配所做的——它丢弃距离大于研究者选择的最大容许差异的不良匹配。
丢弃数据可能会帮助我们获得更好的平衡。然而,它也可能增加因果效应估计的方差。这很直观——用更少的数据获得更多的不确定性。事实上,平衡和样本大小之间的权衡很大程度上是偏差和方差之间的权衡,而这两者对于估计量的质量都很重要。
你会使用一个更小的数据集(因此更高的方差)和更好的平衡(因此更小的偏差)吗?或者你会使用一个更大的数据组(因此方差更小)和更差的平衡(因此偏差更大)?所以,你现在可以看到问题了。
提议的解决方案
许多关于匹配的论文已经解决了平衡和样本大小之间的权衡问题,他们提出的策略是相似的:在获得平衡数据时(希望如此),尽可能少地修剪数据。实施这些策略涉及任意选择(例如,丢弃哪些 ob),并且已经提出了一些规则来指导这个过程(参见这里的综述)。但是你需要选择。
King 等人(2017)提出的解决方案是,你不要挑挑拣拣,而是展示你得到的一切。具体来说,他们建议在修剪数据时,显示在给定样本量中具有最佳协变量平衡的所有估计。称为匹配边界的一组估计值是最优的,因为每个估计值都是给定样本量时可以得到的最佳(最大平衡下的最小偏差)估计值。
下图很好地说明了匹配边界的概念,其中 King 等人(2017 年)展示了修剪数据(从最差匹配开始)如何随着 Mahalanobis 距离的减小(左图)增加数据平衡并改变治疗效果估计值(右图)。

图一。匹配边界。来源:King 等人(2017 年)
他们是如何得到匹配边界的?
那么他们是如何得到匹配边界的呢?他们分两步得到它。为了向您解释这些步骤,我使用了一个包含 40 个观察值的迷你数据集,这些观察值是从 lalonde 数据集中随机选择的。这个小型数据集有 5 个处理单位和 35 个对照单位。此外,为了简单起见,我只匹配两个变量:教育和年龄。我关注基于 Mahalanobis 距离度量的替换匹配,因为它很流行。
图 2 按治疗组(1-治疗组,0-对照组)显示了每个观察单位的两个协变量的值。

图二。具有 5 个处理单位和 35 个对照单位的迷你数据集中的协变量值
在第一步,他们定义了一个数据驱动的规则来修剪数据。
具体来说,他们从计算每个处理或控制单位的处理组之间的最小 Mahalanobis 距离开始。这里有一个例子。设迷你数据集中的五个处理单元是 B1、B2、B3、B4、B5。我们将计算控制单元(比如 A1)和每个处理单元之间的 Mahalanobis 距离。假设计算出的马氏距离分别为 1.5,1,3.2,4.4,3。在这种情况下,控制单元 A1 的最小马哈拉诺比斯距离是 1,并且与 A1 的最佳匹配是 B2。类似地,我们可以计算其他控制或处理单元的最小 Mahalanobis 距离。程序是一样的。
修剪数据的规则是,我们首先丢弃最小 Mahalanobis 距离相对较大的单元,无论它是处理单元还是对照单元。直观上,最小 Mahalanobis 距离度量数据集中一个单元和其余单元之间的相似性。根据规则,我们首先去除与其他单元相似度最低的单元。
在图 1 中,点的大小代表计算的最小距离。最小距离越大,点数越大。数字标签是最小距离的相对顺序,也是要丢弃的顺序。例如,我们可以看到在图 1 的最顶端,有一个标记为 1 的点。当我们开始修剪数据时,这个单元(恰好是一个控制单元)将是第一个被删除的单元。这是因为它具有最大的最小距离。然后修剪到具有第二大最小距离的另一个单元(在图 1 的底部)。在数据修剪的最后阶段,仅保留最小距离的单元。这些单元主要位于图 1 的左侧和中间部分。
在第二步,他们使用加权最小二乘法来估计治疗效果以及修剪数据。
一旦设定了用于删减数据的规则,他们就在删减数据的同时评估治疗效果。匹配边界只是所有这些估计的组合。
该估计基于加权最小二乘法。是的,它类似于逆概率加权(见这里的介绍),但是使用了非常不同的权重。
他们分两步得到重量。首先,他们将数据点分配给地层,在图 1 中用颜色表示。从网络的角度来看,层之间的单元在匹配期间是彼此断开的,而层内的单元在匹配期间是相互连接的。例如,如果发现控制单元 A1 与处理单元 B1 最匹配,而 A1 也与处理单元 B2 最匹配。然后,A1、B1 和 B2 将被分配到同一层。
如果您仍然感到困惑,这里是匹配的网络图(图 3)(具有最低的 Mahalanobis 距离)。你可以在图中看到有四个集群。每个聚类被认为是一个层。

图 3。比赛的网络图
处理单元的重量仅为 1。对照单位的权重为(m0/m1)*(k1/k0),其中 m0 和 m1 分别是数据集中对照和处理单位的数量。k1 和 k0 是包含观察结果的地层中的处理单元和控制单元的数量。
摘要
在这篇文章中,我讨论了匹配边界,这是 Hary King 教授和他的同事在 2017 年的论文中提出的一个概念。匹配边界是解决匹配中平衡和样本大小之间的权衡,也是偏倚和方差之间的权衡。我还向您展示了匹配边界可以通过两个步骤获得:定义修剪数据的规则,然后使用加权最小二乘法估计治疗效果。
在我看来,作者删减数据的方式并不新鲜。在修剪数据时,我们总是从丢弃最不匹配的单元开始。井径匹配做到了这一点,大部分发表的论文也做到了这一点。想法已经有了。他们在第二步定义权重的方式对我来说是新的。我从没在文献中见过这个。据我所知,大部分论文都用倾向得分的倒数作为权重。
综上所述,我认为匹配边界对于稳健性分析非常有用。使用匹配边界,您可以显示估计值如何对对匹配至关重要的公共支持假设的潜在违反敏感。
在我未来的帖子中,我将向您展示如何在 r 中获得匹配边界。此外,我将讨论在大数据和的背景下实施匹配边界的挑战,我还将与您分享我的策略和代码,它们可以有效地应对这些挑战。
参考
金、加里、克里斯托弗·卢卡斯和理查德·尼尔森。2017."因果推理匹配方法中的平衡样本量边界."美国政治科学杂志61(2):473–89。https://doi.org/10.1111/ajps.12272。
神经网络的基本构件
探索 Keras 的密集层,直到源代码
密集层(一个规则的全连接层)可能是最广泛使用和最著名的神经网络层。它是许多神经网络体系结构的基本构件。
了解密集层为进一步探索其他类型的层和更复杂的网络体系结构打下了坚实的基础。让我们深入到密集层,直到实现它的代码。
在本文中,我使用 Keras(https://keras.io/)来探索层的实现和源代码,但是一般来说,大多数类型的层都非常通用,主要原理并不太依赖于实现它们的实际库。
密集层概述
让我们先来看看这种层的可视化表示:

密集图层表示(由作者创建)
在本例中,密集层有 3 个输入、2 个单元(和输出)和一个偏置。让我们来看看每一个。
层输入在这里由 x1、x2、x3 表示。这就是数据的来源-这些数据可以是输入要素值,也可以是前一图层的输出。从技术上讲,这些可以是任何数值,但在大多数情况下,输入值将被规范化为[-1,1]的区间。可以手动或使用特殊图层(例如 Keras 中的 BatchNormalization 图层)进行归一化。
大圆圈代表单位。这是输入值被转换成输出的地方。在可视化中,输出由 y1 和 y2 表示。输出的数量总是与单位的数量相匹配。密集层是完全连接的,这意味着它将每个输入连接到每个输出。这自然意味着每个输入值都会影响(或者至少能够影响-如果相应的权重值不为零)每个输出值。
从输入到输出的转换由激活函数定义。该函数应用于输入值 x1、x2、x3,以获得输出值 y。该函数的结果受权重的影响,权重在可视化中表示为 w11、w21、w31。权重赋予模型学习的能力-基本上,神经网络模型学习的是所有层中的权重值。
可视化中还有一件事——红色数字“1”与所有单元连接,代表“偏差”。偏差指定了对输出值的一些外部影响,这些影响未被输入中提供的特征所覆盖。

Keras 标志(来自 keras.io)
喀拉斯的致密层
现在,让我们尝试将 Keras 中的密集层实现与我们的可视化结合起来。在 Keras 中,致密层定义如下:
tf.keras.layers.Dense(
units,
activation=None,
use_bias=True,
kernel_initializer="glorot_uniform",
bias_initializer="zeros",
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
**kwargs
)
从数学的角度来看,密集层实现了特征值和权值之间的矩阵乘法。
outputs = mat_mul(inputs, weights)
我不会在这里解释矩阵乘法背后的数学,我只提供一个例子,第一个输出基值是什么样子的:
y1 = x1 * w11+x2 * w21+x3 * w31
请注意,实际上,这不是最终的输出值,因为它可以通过激活函数和/或偏置向量进一步改变,我们将在本文稍后讨论。
现在,让我们通过 Keras 密集层的参数来了解它们的含义以及它们如何影响该层。
单位
第一个(也是唯一必须的)参数是“单位”。
- 单位:正整数,输出空间的维数。
“单位”指定层的单位数(和输出数)。在我们的可视化示例中 单位=2 。请注意,Keras 密集图层没有用于指定输入数量的参数。在 Keras 中,输入的数量由前一 NN 层的输出数量定义。
实际上,单元的数量定义了神经网络的“宽度”。这是为某些特定任务创建神经网络架构时需要调整的一个重要参数。密集层中的许多单元可能导致过度拟合,尤其是如果网络也很深(具有许多层)。另一方面,太少的单元会导致学习模式的能力有限。通常,使用的单元越多,应用的正则化就越多。
激活功能
参数“activation”是可选的,它定义了激活函数。
- 激活:要使用的激活功能。如果你没有指定任何东西,没有激活应用(即。“线性”激活:
a(x) = x)。
如果我们查看 Keras 库的源代码,激活函数就在返回输出之前应用于输出。
if activation is not None:
outputs = activation(outputs)
如果未指定激活功能(默认值为None,输出按原样返回。实际上,通常你需要一些激活函数来使神经网络预测合理的值。有许多可能的激活功能,具有不同的特征。对这些的概述超出了本文的范围。
偏见
正如我们从图层定义中看到的,在 Keras 中默认使用偏移,但可以选择关闭。
- use_bias :布尔型,该层是否使用偏置矢量。
在我们的视觉化中,偏见用红色表示。有几种方法可以将它形象化——我喜欢把它想象成一个常量值为“1”的特征。注意,仍然为偏差向量的所有单元计算和优化权重,但是偏差向量对输出的影响不受真实特征值的影响。
为了更好地理解为什么需要偏差,让我们考虑一些特征值都为“0”的输入样本。如果没有偏差向量,所有输出也将始终为“0 ”,因为无论权重值是多少,当乘以“0”特征值时,它都将为零。因此,如果没有偏差,图层将无法正确响应“0”特征值。
实际上,大多数情况下,您不需要移除偏置向量。
如果我们查看 Keras 实现中关于密集层使用use_bias参数的代码,我们会发现以下内容(为了更好的可读性,跳过了一些代码部分):
if use_bias:
bias = self.add_weight(
'bias',
shape=[self.units,],
...
trainable=True)
else:
bias = Noneif bias is not None:
outputs = nn_ops.bias_add(outputs, bias)
因此,如果我们使用偏差,那么偏差权重会添加到输出值中。请注意,这发生在应用激活函数之前,因此伪代码中的整个公式如下所示:
输出=激活(点(输入,内核)+偏置)
初始值设定项
密集层有两个初始化器参数——内核(权重)和偏向初始化器。
- 内核初始化器:权重矩阵
kernel的初始化器。 - bias_initializer :偏置向量的初始化器。
简而言之,这些定义了所有权重的初始值,包括特征权重和偏置向量权重。
该模型将在训练过程中改变层权重。但是,如果合理地选择初始权重,模型可以更快地收敛到最优值。
默认情况下,要素权重将随机初始化为均匀分布。偏置权重将用零初始化。
正则化子
密集层有 3 个正则化参数:
- kernel _ regulator:应用于
kernel权重矩阵的正则化函数。 - bias _ regulator:应用于偏置向量的正则化函数。
- activity _ regulator:应用于层输出的正则化函数(其“激活”)。
正则化的主要任务是控制这些值,使它们尽可能低。受控制的值取决于正则化类型。
核正则化降低了权重的平均值。为什么避免巨大的重量值很重要?简单地说——使用的权重越大,模型在为它们选择不同值时的自由度就越大。这增加了模型方差,因此过度拟合的风险增加。
如果我们谈论技术上正则化是如何工作的——它们增加了额外的损失,这取决于权重的平均值。权重越大,损失越大——这反过来会迫使模型减少权重。
类似地,偏差正则化控制偏差的权重。并且活动正则化器控制输出值。
限制
定义约束函数的密集层有两个参数:
- kernel_constraint :应用于
kernel权重矩阵的约束函数。 - bias_constraint :应用于偏置向量的约束函数。
这些函数类似于正则化函数,因为它们也控制权重。区别在于实现控制的方式。如果正则化引入了大权重的惩罚和附加损失,则约束直接限制权重的值,例如通过定义最大值。

Robynne Hu 在 Unsplash 上的照片
结论
如果您刚刚开始学习神经网络,了解密集层是一个非常好的起点。
当然,理解神经网络背后的一般思想和数学是非常重要的,但要成功地设计有效的架构,您需要大量的实践和试错方法。那么为什么不现在就开始用 Keras 致密层做一些自己的实验呢?
感谢阅读!
谷歌数据工作室的基础
实践教程,我给有抱负的数据科学家和数据分析师的建议
使用公共数据集快速构建令人惊叹的数据可视化

如果我告诉你,你可以在你的 Google Drive 中使用免费的、直观的、可共享的交互式仪表盘工具,那会怎么样?
欢迎来到 谷歌数据工作室
模式交流
对于数据科学家和分析师来说,将我们的数据和结果传达给非技术用户非常重要。我们需要制作和分享令人惊叹的仪表板,使其易于交互。
根据瑞典著名统计学家汉斯·罗斯林的说法。
我们大多数人需要听音乐才能明白它有多美。但通常这就是我们展示统计数据的方式:我们只展示音符,不演奏音乐。
数据可视化很美。它与我们的五种感官对话,而不仅仅是一连串冰冷、毫无生气的话语。问题是,我们如何快速构建一个仪表板。让我们来玩一下 Google Data Studio。
Google Data Studio 是一个直观 ,以及 可共享的交互式仪表盘 。
- 免费 :托管在 Google Docs 上。如果你喜欢谷歌文档,那么你会喜欢谷歌数据工作室
- :拖拽,在 10 分钟内设计炫酷仪表盘
- 可分享: 带链接的轻松报道和在线回购。
- 互动仪表盘: 数据可视化和故事讲述
如需了解更多信息,请随意查看我对 Google Data Studio 和数据源(BigQuery )的简要描述。
在本教程中,我将谈论谷歌数据工作室的基础,并挖掘我们如何能够快速创建一个交互式仪表板。
Data Studio 可视化步骤
创建仪表板
您可以从模板或从零开始创建您的报告。

创建新仪表板
创建数据源

数据源视图
Google Data Studio 支持两种不同类型的数据模式:
- 已修复: 谷歌自动将你的账户连接到产品进行优化(谷歌分析、Youtube 等)
- 灵活: Google 为看不见的数据模式创建数据源阅读器→ CSV,大查询
有了这些数据源,Google 创建了一个可配置、可重用和可共享的数据源。它与大数据源工具如 [BigQuery](http://Data Source (BigQuery)) 无缝连接。
连接大查询+谷歌云公共数据集

Bigquery 数据提取
BigQuery 连接到谷歌云分布式计算平台,该平台在一个池中拥有数千个 CPU 来处理请求和作业,并通过谷歌云公共数据集程序提供公共数据。
您可以每月免费访问 1TB 的查询数据集,其中包含您投资组合中的大中型项目。
添加计算字段
我如何管理我所有的领域?
您可以用 50 多个函数创建指标和维度。Google Data Studio 自动为不同的数据变量建议数据类型(绿色表示分类,蓝色表示数字)。基于这些变量,您可以快速配置这些数据源,包括设置聚合函数。

添加计算字段
快速配置数据访问
观众能接触到敏感数据吗?
在每一个数据源中,您都有快速的选项来为所有者和查看者开放访问,这些选项是通用的且易于更改。
- 所有者凭证允许观众访问桌子和仪表板。
- 观众凭证仅允许观众访问仪表板。仪表板数据是聚合的,需要较少的数据策略。
如果有疑问,去查看观众的证件。

数据访问配置
创建报告
我没时间写报告。
我只是想快速地将它形象化,然后四处玩耍。
别担心,Google Data Studio 涵盖了所有 3 个主要组件:图形、过滤器和 web 组件。
你可以随意摆弄我在 10 分钟内制作的仪表盘。

创建电晕跟踪器仪表板
谷歌数据工作室集成开发环境
IDE 基于拖放方法,您可以灵活地设计和样式化您的仪表板。

谷歌数据工作室集成开发环境
在菜单窗格中,您可以选择图形类型和数据菜单,以确定维度、聚合、排序、过滤器和新字段。
谷歌数据工作室已经包括了 9 个现成的图表(例如:时间序列、条形图、表格等),你可以快速拖放到你喜欢的格式。
控制
控件是过滤器组件,用于交互和过滤图形。通过简单的拖放,您将能够创建全局过滤器(适用于所有图表)或局部过滤器(仅适用于分组图表)。****

Google Data Studio 中的控件
共享报告
共享多个版本的报告很难
不用担心,谷歌数据工作室允许在一个真实来源内轻松共享与审计跟踪。****
- 轻松分享:只需点击顶部的分享按钮,您就可以让合作者/读者参与进来/向利益相关者发送定期报告。
- 审计跟踪:想象你的同事不小心删除了所有的图表。不要慌!有一个版本控制窗格供您跟踪和恢复您的更改到一个干净的状态。
- 真相来源之一:还记得你上一次的 excelsheet 或 tableau 文件吗,比如“version-final”、“version-final-final”和“version-final-final-for-real”?谷歌工作室允许你在一个网址存储一切,以显示最新版本。
有了它,您可以将实时数据导入 dashboard,拖放交互式可视化效果,并轻松地与您的同事和经理分享。

跨多个组织的简单共享
进一步的文档供你学习!
最后的想法
在本教程中,我们学习了谷歌数据工作室:
- 创建新的数据源:导入大型查询并在几分钟内操作字段。
- 创建报告:通过直观的 IDE、图表和过滤器
- 轻松共享、审计和一个真实来源: Google Data Studio 允许在一个真实来源内轻松共享审计跟踪。****
一如既往,如有任何问题,请通过 Linkedin联系我。如果时间允许,我很乐意回答你的问题。
索利·德奥·格洛丽亚
关于作者
文森特用 ML @ Google 对抗网络滥用。文森特使用高级数据分析、机器学习和软件工程来保护 Chrome 和 Gmail 用户。
除了在谷歌的工作,Vincent 还是《走向数据科学媒体》的特约撰稿人,为全球 50 万以上的观众提供有抱负的 ML 和数据从业者的指导。
在空闲时间,文森特在佐治亚理工学院攻读硕士学位,并为铁人三项/自行车旅行进行训练。
最后,请通过 LinkedIn , Medium 或 Youtube 频道 联系文森特
机器学习的基本概念
深入探讨机器学习的基本概念

阿瑟尼·托古列夫在 Unsplash 上的照片
机器学习
机器学习是一个诱人的研究领域。机器学习是人工智能的一个子集,其算法围绕数学展开。机器学习已经改变了许多行业。利用机器学习的行业有医疗保健行业、金融、运输行业、制造行业、广告行业、汽车行业等。机器学习的影响如此之大,以至于许多行业都离不开机器学习。
“机器学习”这个术语是亚瑟·塞缪尔在 1952 年创造的。亚瑟·塞缪尔将机器学习描述为
“在没有明确编程的情况下赋予计算机学习能力的研究领域”。
机器学习算法与传统编程算法有很大不同。传统的编程算法将规则和数据作为输入,并将答案作为输出,而机器学习将答案和数据作为输入,并将规则作为输出。

传统算法和机器学习算法的区别。PC:作者
你可能想知道产生规则作为输出有什么用。机器学习算法产生的规则被用来对新数据进行预测。
学习的类型
机器学习有不同类型的学习,适用于不同类型的现实世界的问题。可用的不同学习类型有:
- 监督学习
- 无监督学习
- 强化学习
监督学习
监督学习试图学习特征和标记的响应变量(或目标变量)之间的关系。将 X 视为特征,将 Y 视为响应变量,然后监督学习尝试学习数据中 X 到 Y 的映射。
监督学习进一步分为:
- 回归
- 分类
回归
回归是一种统计方法,用于找出特征和连续目标变量之间的关系,并预测未来样本。如果一个变量可以取区间内的任意值,则认为它是连续的。它可以取的值是无限的。
例如,0.1、2.2、3.1 是连续值。身高和体重被认为是连续值。
一些可用的回归算法是,
- 线性回归
- 多项式回归
- 决策树回归器
- 极端梯度推进回归器
- 自适应升压回归器
- 在神经网络的最后一层具有线性激活函数的人工神经网络。
关于人工神经网络的更多细节,请参考我的文章:人工神经网络介绍

线性回归。PC:作者
分类
分类任务尝试将实例分类到任何可用的类别中。如果响应变量(或目标)是分类的,则任务被认为是分类任务。如果我们能把一个变量归入一个确定的范畴,那么这个变量就被认为是范畴的。
例如,是或否,像红色、绿色等颜色..被认为是分类变量。
分类进一步分为:
- 二元分类
- 多类分类
二元分类
当目标变量是二元的(如是或否、真或假等)时,问题被称为二元分类问题。
Logistic 回归是一种广泛应用于二分类问题的算法。逻辑回归不同于线性回归。逻辑回归是一种分类算法,线性回归是一种回归算法。

逻辑回归。PC:作者
多类分类
当目标变量由多个类组成时,问题被称为多类分类问题。
可用于多类分类的一些算法是,
- 决策树分类器
- 支持向量机
- 梯度推进分类器
- 随机森林分类器
- Ada Boost 分类器
- 在神经结构的最后一层具有 Softmax 激活函数的人工神经网络。
强化学习
强化学习试图在一个互动的环境中做出一系列的动作,以使回报最大化。每当期望的一组动作被执行时,提供奖励,并且类似地,每当不期望的动作被执行时,计算惩罚。
最常用的强化算法是 Q-learning 和 SARSA(状态-动作-奖励-状态-动作)。
用于处理机器学习问题的流水线
数据收集
在处理任何机器学习问题之前,数据收集是最重要的部分。收集高质量的数据是解决任何机器学习问题的第一步。收集相关数据有助于产生可靠的结果。然后,数据被分成训练集和测试集。该模型在训练集上被训练,并在测试集上被测试。
探索性数据分析
探索性数据分析(EDA)帮助您分析数据的质量和分布。数据可能包含影响数据统计测试的异常值和偏斜度。异常值是不符合其他数据一般行为的数据。偏斜是指数据的频率分布偏离了正态分布。许多统计测试都是在假设数据呈正态分布的情况下进行的,因此移除异常值并转换有偏差的数据非常重要。
数据预处理
数据预处理是机器学习中必不可少的步骤。如果在数据建模之前对数据进行预处理,可以获得非常有洞察力的结果。如果数据质量得到保证,我们就能获得可靠的结果。不完整、嘈杂和不一致的数据是真实世界数据集的固有特性。在将数据输入模型之前,必须对其进行预处理。
数据预处理中涉及的常见步骤有:
- 数据清理
- 数据整合
- 数据转换
- 数据还原
关于数据预处理的更多细节,请参考我的文章:机器学习中的数据预处理管道
模特培训
模型训练是计算特征和目标之间的关系的学习过程。特征和目标之间的关系被表示为模型参数。然后,模型参数用于预测测试数据。每种算法的训练过程是不同的。
- 决策树算法和随机森林算法被称为非参数算法,这意味着它不利用参数(或系数)来预测新数据,而是构建一个树状结构来进行预测。
成本函数及其优化
成本函数用于衡量模型的性能。如果不优化成本函数,将模型部署到生产中是没有用的。成本函数告诉我们一个模型的表现有多好。成本函数将目标的实际值与目标的预测值进行比较。重要的是,我们要花时间选择一个适合数据的成本函数。成本函数的优化也可以被认为是模型训练。
关于成本函数及其优化的更多细节,请参考我的文章:机器学习中回归的成本函数及其优化技术
正规化
正则化是避免过度拟合的技术。过度拟合是指模型记住了特征和目标之间的关系,但未能归纳出新的、看不见的数据。过度拟合可能是由决策树模型等灵活模型引起的,也可能是由维数灾难引起的。像特征选择和特征提取这样的降维技术也可以防止过度拟合。过度拟合是指存在高方差和低偏差的情况。
正则化通常通过对成本函数应用惩罚来完成。最常用的正则化技术是,
- 套索回归
- 里脊回归
- 人工神经网络的辍学
超参数优化
超参数是对模型训练有影响的可调参数。超参数不同于模型参数,因为模型参数是训练阶段的结果,并且超参数由用户在训练阶段之前手动提供。
最常用的超参数优化技术是,
- 网格搜索
- 随机搜索
- 贝叶斯优化
模型解释
模型的保真度如何?我为什么要相信模型产生的结果?这些问题由模型解释技术来回答,这些技术试图解释为什么模型会得出这个结论。
- SHAP(沙普利附加解释)
- 线性可解释的模型不可知解释
模型部署
经过训练的模型可以部署在生产环境中。生产环境是用户可以访问和利用所提供的服务的地方。数据工程师的角色是处理部署模型和从数据科学家和机器学习工程师那里抽象模型的复杂性。可以使用 Python web 框架(如 Flask、CherryPy、FastAPI)部署模型。
摘要
机器学习是一个迷人的研究领域,有可能彻底改变我们的未来。许多机器学习算法仍处于研发阶段。对机器学习工程师的需求与日俱增,在不久的将来需求将达到顶峰。机器学习总能让你兴奋不已!这是独一无二的!
快乐的机器学习!
谢谢你!
基础:集合方法
从头开始的数据科学
装袋,随机森林和提高性能的方法
集成方法是一句古老格言的数据科学版本:如果一个模型工作良好,多个模型协同工作甚至可以做得更好。当然,挑战之一是很难收集足够的数据来制作多个独立的模型。事实证明,只需一点点技巧,我们就可以从单个数据集构建不同的模型,并组合它们的输出以获得更好的结果。这些集成方法特别有助于扩展基于树的模型,包括分类器和回归器,并且通常优于树模型本身。
自举模型
决策树模型的一个挑战是它们的结构非常脆弱:正如我在我的树模型简介中所讨论的,训练数据的微小变化会导致最终树的巨大变化。如果由于训练数据中的一些变化,树中的早期分裂之一在不同的地方或沿着不同的变量进行,则树的所有后续决策必然会不同。因此,建立在相似但不完全相同的数据上的决策树在结构和结果上可能彼此非常不同——或多或少准确,或多或少过度拟合,甚至以不同的方式过度拟合。
为了形象化这在实践中意味着什么,我生成了一个包含一千个点的示例数据集。然后,我随机抽取这些点的四分之三作为样本,在这个样本上拟合决策树模型,并测试其准确性。我这样做了 500 次,根据准确度对模型进行排序,并绘制出结果:

建立在重叠但不完全相同的数据上的 500 棵树模型的结果
平均而言,生成的模型大约 77%准确,但结果有很大的差异。一些模型的准确率不到 70%,而少数几个模型的准确率接近 85%。重要的是,尽管结果非常不同,但每个模型都是根据非常相似的数据训练的。事实上,每个模型都是在超过一半的总数据集上训练的,所以一定有在任何两个创建的模型的训练数据之间至少有一些重叠。
决策树是如此脆弱,以至于在大多数相同数据上训练的两棵树可以产生如此不同的结果,这一事实实际上允许我们从相同的数据集创建许多不同的和足够不同的模型。这一过程被称为“打包”,它缩短了两个步骤:引导和聚集。在第一步中, bootstrapping ,我们获取训练数据,并通过抽取随机样本来创建多个较小的数据集。这些较小的数据集中的每一个都用于训练单独的模型。然后,通过聚合结果,平均每个单独模型的输出,所有这些模型被用于生成预测(或者在分类问题中,你可以认为它是让模型对要预测的类进行“投票”)。
有点不可思议的是,这种聚合预测通常比单个模型的平均表现好得多。为了演示这一点,让我们重温一下我之前创建的训练数据。我又一次随机抽取了一些样本,创建了一些模型,并测量了它们的精确度,但这一次有了新的变化。我没有简单地对我的每个样本创建一个决策树模型,而是创建了 100 个不同的模型,并用这种 bagging 方法组合它们的预测。像我们之前做的那样排列结果精度,我们再次看到类似的形状,一些袋装模型比其他模型更精确,但我们的精度在整个曲线上都有所提高!

袋装树模型的准确性
以前,从数据集的子样本中导出的一个决策树的准确率约为 77%。然而,单个袋装模型的平均准确率为 85%。
你可能有一种感觉,这似乎不应该真的工作。当然,我们已经从一个模型发展到多个模型协同工作,但是我们的每一个新模型只在一部分可用数据上进行训练。以前我们只有一个模型,但是它利用了所有的数据。总的来说,我们没有获得更多的数据,甚至没有一次使用我们所有的数据,然而以某种方式将数据分成一堆小样本使我们能够从我们的模型中提取 8%以上的准确性。关键在于这样一个事实,即自举模型可能彼此非常不同。正如我们已经注意到的,两个建立在基本相同的数据上的决策树最终会有非常不同的结构。结合许多不同模型的结果,所有这些模型都建立在略有不同的数据上,这实际上给了我们许多不同的决策树结构。
可以想象,使用的自举模型的数量是一个关键因素。当您拥有众多不同的模型来响应不同的数据特征并产生不同的结果时,您就开始受益了。如果你只有两个或三个模型,你不可能胜过一个单独的决策树,因为即使你有一个以上的模型,你的模型也只是建立在较小的数据样本上。另一方面,一旦有了足够数量的模型,就已经从数据中提取了尽可能多的推理能力,添加更多的自举模型不会产生任何额外的好处(幸运的是,在一个袋装方法中有太多的模型通常不会产生过度拟合,尽管用这样的模型拟合和预测在计算上变得更加昂贵)。绘制自举模型的数量与聚合预测的准确性的关系图可以提供大量信息:

在某种程度上,袋装模型的准确性随着聚合模型的数量而增加
起初,袋装模型的表现不如平均单个决策树,但是在只有少数几个自举模型被添加到我们的集合(在这种情况下,四个或五个)之后,袋装模型开始明显优于平均单个模型的准确性。在 40 或 50 个自举模型之后,袋装模型的性能似乎趋于平稳,并且它不会从添加到整体的后续模型中获得太多额外的好处。
看到预测能力的巨大进步,你为什么还要使用一棵树呢?首先,正如你可能猜到的,训练和运行一棵树比训练和运行 100 棵树的计算量要少(即使每棵树稍微小一点)。另一方面,袋装模型失去了很多可解释性。以前,很容易将决策树的结构绘制成类似流程图的东西,并遵循它,查看哪些功能看起来很重要,关键值可能在哪里。现在,您已经有了一大堆要绘制的树,每一棵树都有不同的结构,不同的临界值集,每一个都给出了对模型“重要”的不同感觉。他们必然不会同意彼此,使它更难解释。
下一步:随机森林
正如我们所强调的,袋装模型有效的原因是因为被聚集的底层决策树彼此之间有足够的差异。你可以把每一棵底层树看作是以稍微不同的方式处理问题,做出不同的决策,并且可能从过程中收集到稍微不同的信息。一个自然的进展可能是使这些基础模型彼此更加不同,这是随机森林策略的核心。
随机森林模型的构建方式与袋装模型非常相似,其中有大量不同的决策树被训练,然后串联使用。关键区别在于,在随机森林中,除了在总体训练数据的略微不同的子样本上训练的树之外,它们每个都只使用随机选择的特征变量的样本。比方说,我使用的是通用的泰坦尼克号数据集,它有大约 8 个有意义的特征变量,包括乘客的性别、级别、票价和他们出发的地点。一个普通的袋装模型会聚集大量使用所有 8 个特征的决策树。随机森林模型将聚集决策树,每个决策树使用这些特征的不同子集。一棵树可能使用性别,阶级,年龄和小屋。另一个也可能碰巧使用性别和年龄,而不是班级或客舱,而是使用登机地点和兄弟姐妹的数量。
通过随机选择训练数据点的样本和正在使用的特征,随机森林在聚合决策树中创建了更多的多样性,因此可以从更多的角度处理预测问题。就像普通的袋装模型一样,随机森林的准确性随着集合中树木数量的增加而增加,在一定程度上。随着聚合树数量的增加,考虑我的示例数据集上的袋装模型和随机森林的性能:

随着聚集模型数量的增加,比较袋装和随机森林方法
像袋装模型一样,我们的随机森林开始时表现不如单棵树的平均水平。实际上,随机森林开始时的表现也不如袋装模型-请记住,随机森林中的每棵树不仅只使用了一小部分可用的训练数据,而且只使用了一小部分可用的功能,因此每棵树都不如使用所有功能的单棵树强大,并且您很可能会认为只有少量树木的随机森林的表现不如具有相同数量树木的袋装模型。一旦一些树被添加到森林中,性能会迅速提高。一旦森林有了十棵树,模型可能会从数据集中的每个要素和行中整合信息,并开始受益于我们在树中引入的多样性。在这种情况下,随机森林最终为我们的模型增加了大约 2.5%的准确性。
略有不同的方法:助推
最后要考虑的集合方法是 Boosting,它的工作方式与我们的 bagging 或随机森林方法不同。普通装袋和随机森林都并行生成多个模型并同时运行,以某种方式平均结果。Boosting 也创建多个树,但它是按顺序创建和运行它们的。创建第一决策树并使其适合数据。然后创建后续的树,但是该树不是直接适合数据的目标变量,而是适合第一树的残差:也就是说,它适合第一树提供的预测是错误的量。对于回归树,这将是一些正数或负数,取决于模型超出或低于标记的程度。在分类问题中,这个误差项将简单地为 0(如果先前的树得到正确的预测)或+/-1。
要做一个预测,你需要依次使用这两棵树。第一棵树进行预测,第二棵树基于它认为第一棵树的结果有多不正确来提供调整。当然,您不需要就此停止,您可以将第三棵树拟合到前两棵树一起使用的结果的残差中,以此类推,直到您拥有许多棵树。希望,随着每一棵后续的树,你可以进一步磨练预测,尽管与袋装模型不同,如果使用的树的数量变得过多,增强模型容易过度拟合。
实际上,为了让这一系列模型产生合理的结果,还有一个难题。如果你只是像我描述的那样连接多个模型,你的结果实际上可能一点也没有改善。一个模型会超调,然后下一个模型会矫枉过正,向另一个方向摆动得太远。为了确保模型实际上收敛于一个答案,后续模型的结果被称为“学习率”的收缩因子所贴现。降低学习率有助于避免过度拟合,但需要更多的模型才能达到好的效果。考虑一下,我们的数据集受到具有不同学习速率和树数量的增强树的攻击:

比较具有不同学习速率和顺序树数量的 boosted 方法
你会注意到,在这种情况下,增强的模型似乎都达到了大约相同的精度水平,尽管学习率较低的模型要花一点时间才能达到那个精度水平。
在我创建的示例数据集上,boosted 算法的工作效果与随机森林一样好,但不言而喻的是,根据您正在处理的数据类型,您的收益可能会有所不同:

集成方法的最终比较
在任何情况下,你都会注意到,所有这三种集成方法都比它们在概念上所依赖的单一决策树表现得更好。
附录:使用其他类型模型的合奏怎么样?
在这一点上,你可能会相信这些集成方法的力量,并开始想知道为什么我们把自己局限于决策树。我们可以使用 bootstrap 聚合来提高其他类型模型的性能吗?简单的回答是,像 bagging 这样的方法通常不适用于其他模型类型。例如,如果我们尝试用 bagging 逻辑模型代替决策树来解决分类问题,会怎么样?以下是我们汇总自举逻辑模型的结果:

尝试在许多逻辑模型上使用装袋方法
代表袋装逻辑模型的线不再显示明确的趋势,也不代表单一逻辑模型的任何显著改进。随着用于测试模型的样本的随机性,测量的准确性略有波动,但在任何聚合级别,打包的准确率都有可能低于单个逻辑模型的平均值。
这是为什么呢?因为我们在这里试图整合的逻辑模型太相似了。这种方法之所以有效,是因为决策树很脆弱,即使对训练数据进行很小的更改,也会创建结构非常不同的树。相比之下,使用稍微不同的数据集生成的两个逻辑模型可能彼此非常相似;它们将各自使用所有的特征,并且模型为每个特征找到的系数可能彼此接近。逻辑回归中的系数肯定会受到少数异常值的影响,但一旦样本达到数百个,单个新值就不太可能对最终系数值产生太大影响。
不幸的是,装袋并不是一个适合所有人的解决方案,但是对于基于树的方法来说,它是非常有效的。
基础知识:评估分类器
从头开始的数据科学
准确度、精密度、召回率和 ROC 曲线解释
判断一个分类模型感觉应该比判断一个回归更容易。毕竟,你从分类模型得到的预测只能是对的或错的,而从回归模型得到的预测可能或多或少是错的,可能有任何程度的误差,或高或低。然而,判断一个分类并不像看起来那么简单。一个分类有不止一种正确或错误的方式,并且有多种方式将不同的正确和错误的方式组合成一个统一的度量。当然,所有这些不同的指标都有不同的、通常不直观的名称——精确度、召回率、F1、ROC 曲线——使得这个过程从外面看起来有点令人生畏。
尽管术语令人困惑,但每个分类标准背后都有很好的直觉。在他们的心里,有一个简单的问题:你的模型是用来做什么的。如果您心中有一个清晰的用例,那么应该很容易决定关注哪个指标。为了解释我的意思,让我们考虑一下在一个简单的例子中每个指标可能是什么样子。
型号
当我们讨论逻辑回归时,我们考虑了一个简单的问题,它被绘制成这样:

一个简单的分类问题
这里我们在 x 轴上有一些特征变量,在 y 轴上有一个分类变量,它只取值 0 或 1。如你所见,我还根据这些点所属的类别对它们进行了颜色编码。在这种情况下,随着 x 变量变得越来越大,点落入红色类的机会也就越来越大。对于一个真实世界的例子,也许 x 变量是汽车的英里数,红色类是是否有发动机故障。或者,x 变量是个人的血压,红色类别是他们是否患有心脏病。
我们为这些点拟合了一个逻辑模型,如下所示:

一个简单逻辑模型的分类问题
我们的回归曲线代表我们对一个点落入红色类别的概率的估计。随着你沿着曲线向右走,模型的估计概率也在上升。但是,要实际预测一个新点,您需要设置一些临界阈值,并将超过该阈值的任何值视为红色类的预测值。一个合理的阈值可能是 50% —如果模型认为一个点有超过 50%的机会属于目标类,那么您预测它确实属于该类。
在实践中,我们可以像这样可视化这个预测过程(请注意,我已经更改了点的颜色编码,以匹配模型预测它们属于哪个类,而不是它们实际属于哪个类):

使用 0.5 的阈值,我们的模型预测哪些点属于每个类别
现在我们可以很容易地看到,对于一个分类问题,有不止一种正确或错误的方式。在右上象限中,有被准确分类为红色的点,这些点是模型正确的第一种方式真阳性、、。在左下象限是同样被精确分类的蓝点,这些是真阴性。然而,在左上角的点应该被分类为红色,但是低于模型的阈值,被分类为蓝色。这些都是假阴性。在右下角,我们有相反的问题,点是正确的蓝色,但被归类为红色,假阳性。

请注意,我们可以在其他地方设置阈值,这将产生一组不同的预测。通过改变这个阈值,你可以改变有多少假阳性或假阴性。例如,在这种情况下,如果我们提高阈值,我们可以消除假阳性,但代价是增加假阴性:

我们的预测有一个 0.7 的新阈值
当要决定这个模型做得有多好时,你需要考虑这些不同方法之间的权衡。根据你关注的重点,你可以用不同的标准来衡量你的成功。
准确性:我不关心假阳性/假阴性权衡,我正确的频率是多少?
可能是最简单的度量准确性的指标——模型做出的正确预测数除以做出的预测总数。您可以将准确性正式描述为真阳性和真阴性以及假阳性和假阴性的函数,如下所示:

正确率是真阳性、真阴性、假阳性和假阴性数量的函数
尽管我认为这些度量标准的正式描述经常会模糊度量标准的内容。准确性评分虽然简单,但有很多优势。理解起来简单直观。它有明确的解释,通常不需要解释;准确度分数为 0.8 意味着 80%的预测是正确的。
仅考虑准确度分数有一些缺点。一方面,如果存在明显的阶级不平衡,它会变得混乱。例如,假设你正试图根据某人的血压来预测他是否会心脏病发作。但是在任何一年中,有多少人会有心脏病发作呢?答案是不到百分之一(美国 3 亿多人口中大约有 80 万人)。您的心脏病发作模型可以通过简单地猜测在任何给定的年份没有人会患心脏病而获得 99%的准确率!然而,很明显,这个模型实际上并没有用。
现在,在训练分类模型时,最好考虑您是否有很大的类不平衡,并通过对大多数类进行欠采样来进行校正,也就是说,如果一个类中有 100 个点,另一个类中有 1,000 个点,则从较大的类中随机抽取 200 个点,这样您的模型就可以训练更平衡的数据。希望思考心脏病发作的例子也说明了其他一些事情,那就是有时你可能想关注一个特定的结果,比如说某人是否会心脏病发作,即使模型的整体准确性下降。
回忆:我正确地识别所有阳性类别很重要
如果你的模型试图筛选心脏病发作的可能受害者,你最关心的可能是确保你能识别出每一个可能的病例。毕竟,不识别某人的缺点是他们会遭受意想不到的心脏病发作,而意外预测某人会患冠心病的缺点却没有那么严重。您可能希望降低阈值以捕捉更多的情况,即使这意味着看到整体准确性的下降。请记住,当您降低阈值时,您的假阴性会下降,但假阳性可能会上升:

我们预测的下限是 0.3
在这种情况下,您可能需要优先考虑不同的指标,回想一下。简而言之,回忆是你的模型正确识别的积极案例的一部分。你的模型捕捉到了多少会心脏病发作的人?同样,我们可以这样正式定义回忆:

召回率也称为真阳性率,您可能还会看到一个类似的指标,称为“特异性”,它相当于召回率,但用于真阴性率。
考虑回忆将你所有的注意力集中在识别积极类的实例上。注意,它实际上并没有考虑你对负类的预测是否正确。当然这是有风险的——如果你真的想,你可以通过简单地预测一切都属于积极的类别来最大化你的回忆价值。为了平衡这一点,您可以考虑另一个指标。
精度:我想确定如果我预测某个东西在正类中,它绝对是
精确度是你得到正确的积极预测的分数。从形式上讲,你可以这样定义它:

当正确识别每个实例并不重要时,您可能会强调某个实例的精确性,但是觉得错误地识别一个实例会有代价。例如,音乐流媒体服务可能会使用一种模型来预测听众是否会喜欢它可能推荐的一首新歌。他们没有识别听众可能喜欢的歌曲的成本,但如果他们错误地识别了一首歌曲,听众发现他们总是得到他们不喜欢的歌曲推荐给他们,他们可能会对服务不满意并离开它。
F1:精确度和召回率似乎都很重要,我能两者兼顾吗?
当然,理想情况下,你应该同时拥有高召回率和高精确度,正确地识别每一个肯定的类别,而不需要不准确地识别一堆否定的类别。为此,您可以使用 F1 分数,它是精确度和召回率的调和平均值:

像一个简单的准确性分数一样,F1 分数考虑了以某种形式正确地获得正面和负面类别。然而,与简单的准确性分数不同,F1 分数仍然会很好地工作,尽管存在等级不平衡。调和平均值比简单算术平均值更不利于极值(考虑一下,如果您的精度值是 1,但您的回忆值是 0,两者的简单平均值将是 0.5,但调和平均值将是 0)。
考虑所有不同阈值的模型
到目前为止,所考虑的每个指标都告诉您一些关于一组特定预测的信息——一个模型在一个阈值下的结果。如果您想要跨许多不同的阈值比较多个模型,该怎么办?为此,我们可以使用另一个工具,即受试者操作者特征,或 ROC 曲线。您可能已经注意到,通过考虑模型获得正面和负面类别正确的频率,我们的不同指标都接近一组预测的质量,不同类别的权重或多或少。在某种程度上,你可以将这一切归结为真阳性率和假阳性率——你有多长时间正确预测了一次,你有多长时间为了到达那里而不得不意外地错误分类了一个阴性点。ROC 曲线描绘了使用这两个比率的模型的性能。任何一组预测的性能都绘制在一个图表上,如下所示:

一个轴是真阳性率或回忆,另一个轴是假阳性率。可以想象的最好的预测集应该在左上方,在那里你的回忆是 1-你正确地识别了每个阳性类别-你的假阳性率是 0-你没有错误地分类任何阴性点。对角线代表这两个速率之间的等价交换;你可以把它想成一个随机模型的表现,就像抛硬币来决定类别,其中捕捉更多积极点的唯一方法是偶然捕捉一些消极点。
任何一组单独的预测都可以在此基础上绘制。在我们的第一个例子中,请记住我们将阈值设置为合理的 0.5:

计算真阳性率和假阳性率,我们可以这样绘制性能图:

如果我们将阈值提高一点,我们会捕捉到更多的负面信息,但会错过一些正面信息:

图表是这样的:

我们可以对任何级别的阈值这样做:

最后,我们可以将所有可能阈值的曲线连接起来,形成 ROC 曲线:

ROC 曲线使您可以看到在召回率和特异性之间的权衡,并比较不同模型在所有阈值上的性能。总的来说,你可能更喜欢向左上方延伸的模型,这样可以最大化它们和代表随机模型的对角线之间的面积。这种“曲线下面积”或 AUC 通常用于判断不同的模型。
基础:评估回归
从头开始的数据科学
评估模型的误差和拟合优度
在所有的数据收集和数据清理之后,是时候拟合一个模型并进行一些预测了。实际上,为什么不尝试几种不同的模型呢——简单的线性回归或带有正则化方法的模型,如 Ridge 或 Lasso,也许是 KNN 或回归决策树。但是现在,你如何决定这些模型中哪一个实际上表现最好呢?有可能量化任何给定模型的效果吗?这实际上是一个棘手的问题,需要你平衡经常相互对立的多个目标。一方面,您希望最小化模型做出的任何给定预测的误差。另一方面,您希望您的模型能够一般化,能够很好地处理看不见的数据,这意味着避免过度拟合。有许多不同的度量标准可以用来沿着这些路线评估您的模型。有些人量化模型预测中存在的误差,有些人试图量化模型对基础数据中的方差的解释,有些人甚至进行调整,试图量化过度拟合。
测量误差
评估任何模型的第一步是考虑预测误差,即在所有可用的测试数据中,您的预测与给定点的真实值之间的差异。考虑一个简单的回归问题,有一个输入要素:

我们将尝试建模的点的集合
我们可以对这些点进行线性回归,并考虑误差,在这种情况下,误差简单地由这些点和我们拟合的直线之间的垂直距离表示:

我们的点以及红色的线性回归线,模型的误差项用紫色线表示
当然,预测可以高于或低于真实值,因此通常误差项被平方或误差项的绝对值被考虑以避免负值抵消正值。考虑总误差的最简单方法是简单地将其相加,或者是绝对误差之和(SAE):

其中带帽子的 y 代表我们模型的预测
或误差平方和(SSE):

请注意,误差项也称为“残差”,因此您也可以将其视为残差平方和(SSR)。当然,目标是最小化这些总和。
为什么您会选择考虑平方误差项,而不是绝对误差?对误差项求平方会增加较大误差的影响。作为一个假设,考虑一个预测两点的简单情况。我们的第一个模型的第一个点的误差为 7,另一个点的误差为-3,因此绝对误差之和为 10。我们的第二个模型有-5 和 5 的误差,所以它的 SAE 也是 10。我们的最后一个模型对其中一个点没有误差,但对第二个点有 10 个误差;它的 SAE 也是 10。考虑到平方误差,我们可以对这些模型进行排序。误差为 7 和-3 的第一个模型的上证指数为 49 + 9 = 58。第二个错误为-5 和 5,其 SSE 为 25 + 25 = 50。最后一个模型的上证指数为 0 + 100 = 100。平方误差隐含地给予较大误差项更大的权重,即使总绝对误差是相同的。
当在相同的数据上对一个模型和另一个模型进行排序时,在某种程度上,这些总和就是你所需要的。然而,这些数字本身有点难以解释。一方面,随着样本量的增加,总和会增加;100 个点的总误差大于 10 个点的总误差并没有多大意义。因此,在描述模型的性能时,通常采用这些误差测量值的平均值,即平均绝对误差(MAE)和均方误差(MSE)。这些给你一个每次预测的误差量的度量。
平均绝对误差甚至有一个简单的解释——任何给定预测的平均误差——并且它有正确的单位。如果你的模型试图预测,比如说,某个美元值,那么任何一点的误差项也将是以美元为单位的数量,所以你的平均绝对误差实际上就是你的预测没有达到目标的平均美元数。均方差有点不同,它不再有和你预测的一样的单位。您的模型预测的是美元金额,但任何给定点的平方误差都是以美元平方表示的。出于这个原因,通常取均方误差的平方根,得到均方根误差(RMSE)。RMSE 与您预测的事物具有相同的单位,但它已偏向较大的误差项。它不像 MAE 那样容易直接解释,但它让您感觉到对异常值更敏感的误差,同时具有与目标变量大致相同的范围。
MAE、MSE 和 RMSE 是一个很好的起点,但有一个更常用但经常被误解的统计数据值得考虑:R 平方或决定系数。R 平方值试图量化数据中有多少总体方差是由您的模型解释的,并用于评估线性模型(有一些不同的“伪 R 平方”度量试图捕捉其他模型类型的类似情况)。有几种不同的方法可以计算 R 平方,但最简单的方法可能是用这个公式:

分数上面是残差平方和,你可能还记得,它和我们讨论过的误差平方和是一回事。底部是总平方和,这是一个类似的东西,但它通过对任何给定点到所有点的平均值的距离的平方求和来捕捉目标变量中的总体方差:

上面有横条的 y 表示 y 的平均值
R 平方值告诉我们,我们的模型解释了目标变量 y 的总方差的多少。0.6 的 R 平方告诉我们,我们的模型解释了目标变量方差的 60%,剩下的 40%是模型无法解释的。
【overfit 怎么办?
对误差求和时,误差越小越好似乎是理所当然的,当然,在某种程度上这是正确的,但误差本身的测量通常是不够的,因为只考虑求和误差往往会导致过度拟合。考虑以下模型符合我们在上面使用的虚拟数据。这是一个 K 设为 3 的 KNN 回归:

不可怕,但我们想尽量减少这些误差项。在我们的热情中,我们把 K 降低到 1:

现在我们已经消除了所有不必要的错误!当然,代价是我们的模型不会泛化。它上下剧烈波动以捕捉我们数据中的每一点,它不太可能一般化。有没有我们可以用来避免这种情况的度量标准或方法?
第一个,也可能是最重要的答案是,好的数据和建模实践应该避免这种最坏的情况。特别是,必须将数据分为训练集和测试或验证集。当我们在一组点上进行训练,在另一组点上进行测试时,我们通常可以使用简单的误差度量来剔除过度拟合的模型。考虑我们的 KNN 明显过度拟合的情况,其中 K 设置为 1,但是这里我们将数据分为训练集和测试集,并且仅绘制测试集的误差项:

现在训练点是蓝色的,但是测试点是红色的。只有测试集的错误术语被图形化
我们经常遇到非常大的误差项。我们的上证指数是 2893。与之相比,K 设置为 3:

当然,模型中仍然存在误差,但是由于模型的预测不会如此剧烈地摇摆,我们避免了最大的误差。我们这里的上证只有 1163。
这种方法本身并不完全是防错的,特别是对于较小的数据集,因为您有点受到随机测试/训练分割的影响。如果我们对 K 设为 1 的 KNN 模型重复这个过程,我们可能会得到上面的图,误差特别大,或者我们可能会得到这个图,SSE 稍微合理一些,为 1,351:

K 设置为 1 的另一个 KNN 模型,但是不同的(随机)测试/训练分割
或者,我们可能会得到这张带有明显误导性的上证指数 949 的图表:

又是一天,又是一场考试/火车分裂
好运气(或者坏运气)得到一些测试点,这些测试点碰巧在一些训练点附近,这给了你一个不应该有的低误差度量。
将 K 的值降低到 1 的情况可能看起来有点做作,但是当您向多元回归中添加越来越多的解释变量时,类似的情况也会发生。随着您向模型中添加更多变量,您的误差测量值不可避免地下降,R 平方值不可避免地上升。添加一个几乎没有解释价值的变量可能不会使您的 R 平方值上升太多,但它永远不会使您的 R 平方下降,甚至添加一个无用的变量也会由于统计噪声而使您的 R 平方上升。
为了避免这种情况,我们可以转向这里讨论的最后一类度量标准,除了误差更小的模型之外,这些标准还支持更简单的模型。其中最简单的是调整后的 R 平方,它本质上就是你所知道和喜爱的 R 平方,但乘以一个随着变量数量增加而降低其值的项:

对 R 平方的校正,其中 n 表示样本中的点数,p 表示特征变量的数量
当您增加特征变量的数量时,调整后的 R 平方值会带来损失,因此您不能简单地在模型中加载无用的特征或交互项来人为提高 R 平方值。
另外两个概念相似的度量标准是阿凯克信息标准(AIC)和贝叶斯信息标准(BIC)。与调整后的 R-squared 一样,这两种度量都通过添加增加特征数量的惩罚来处理添加过多特征变量的可能性(BIC 中的这种惩罚实际上会随着我们样本中点数的增加而增加),尽管与 R-squared 不同,它们使用一种称为似然函数的东西来测量模型的拟合度,这扩展了它们可以应用的模型数量。
我避免使用这两个指标的技术定义,因为它们可能看起来有点令人生畏,但我想强调的是,它们的操作方式与调整后的 R-squared 非常相似,测量拟合度,同时对模型复杂性施加惩罚。为了通过调整的 R 平方、AIC 或 BIC 度量来判断新变量的添加是有用的,对模型拟合的增加的益处需要大于对新变量的添加施加的惩罚。在所有条件相同的情况下,这些指标都倾向于更简单的模型,并要求模型复杂性的增加伴随着足够大的性能增加。
cx_Oracle 的基础知识
想用 Python 处理 Oracle 数据库?这篇文章可能会帮助你!

泰勒·维克在 Unsplash 上的照片
最近我一直在使用 Oracle 数据库和 Python。虽然 Oracle 是一家大公司,但我发现没有一个如此强大的社区来帮助他们处理数据库的 Python 包 cx_Oracle,而且我发现他们的文档也不是很好。
所以,我决定按照我的写作哲学写这篇文章,一个月前的 Thiago(我)会感谢我的。
1。连接到数据库
首先要做的是连接到您的数据库。在这种情况下,您可能有一个用户和一个密码。此外,您应该有数据源名称。有了所有这些,您就可以连接到数据库:
很简单!
2。执行 SQL 命令
使用 cx_Oracle,您可以执行任何 Oracle SQL 命令、选择、插入、更新等。为了执行命令,您必须创建一个游标。您可以使用同一个光标运行多个命令。我只是建议您在应用程序中为每个函数使用一个连接和一个光标。所以,你在函数的开头创建一个连接和一个游标,然后在函数的结尾关闭它们。
2.1 选择语句
这里需要提到的是,fetchone()和 fetchall() 方法只有在执行“选择”时才起作用。在执行 insert 或 update 语句时使用这些方法是没有意义的。此外,需要注意的是,如果您的查询非常大,可能会非常慢,因为它会将查询的数据加载到内存中。
2.2 插入语句
如果要将机器中的数据插入数据库的表中,请遵循类似的过程:
还有,如果要插入几行,与其多次运行【execute(),不如使用execute many():
这段代码只需要从客户端到数据库的一次 往返 ,而不是重复调用 execute() 所需的五次往返。对于非常大的数据集,对于可以处理的行数,可能存在外部缓冲区或网络限制,因此可能需要重复调用execute 多次 () 。这些限制基于正在处理的行数以及正在处理的每行的“大小”。多次调用execute 很多 () 还是比多次调用 execute() 要好。
现在,如果您要插入 select 语句的结果,最好先创建一条语句,用execute()执行它,然后执行 select 语句, fetchall() ,然后用execute many()插入。尤其是当 select 语句的结果很大时,这种情况会发生。
3.使用参数
一个非常重要的特性是能够在 SQL 命令中使用参数。cx_Oracle 提供了一种简单的方法来实现这一点:
在 cx_Oracle 中,还有其他方法可以向 SQL 命令传递参数,但我认为这是最好的方法,所以我将继续使用它。
4.使用 cx_Oracle 进行多处理
当我使用 cx_Oracle 时,这无疑是最难实现的事情。在我的问题中,我希望在几个表格中进行几次插入,并且希望尽可能快。此外,插入的顺序并不重要,所以使用多重处理是合适的。
这里主要的事情是在流程内部创建连接。进程池中的每个工人都需要有自己的自己的连接,这个连接是它自己建立的*。*****
记住这一点,在 cx_Oracle 中使用多处理是非常简单的。
结论
我真的不认为我在这里展示了复杂的东西。我很难让我的应用程序工作,因为在 Stackoverflow 上没有太多关于 cx_Oracle 的问题,而且我不认为 cx_Oracle 的文档是最好的。
我希望这篇文章能帮助使用 Oracle 数据库和 Python 的人更快地工作。
你可以通过访问我的 GitHub 查看更多关于我正在做的事情,并通过 LinkedIn 取得联系。
感谢您的阅读!
如何准备您的数据
结构化、清理和丰富原始数据

很少能以您需要的完全正确的形式获得数据。通常,您需要创建一些新变量,重命名现有变量,重新排列观察值,或者删除寄存器,以便使数据更容易处理。
这被称为数据争论(或准备),是数据科学的关键部分。大多数情况下,您拥有的数据不能直接用于您的分析:它通常需要一些操作和调整,特别是如果您需要将其他来源的数据汇总到分析中。
本质上,原始数据是杂乱的(通常在开始时是不可用的),你需要卷起袖子到达正确的地方。出于这个原因,你为使它足够“整洁”而采取的所有行动与你选择使用的算法一样重要。几乎在所有情况下,数据争论是数学/建模的先决条件,大部分时间都花在清理现实世界场景中的数据上。
让我们面对它:数据不会准备好或者不需要额外的努力就能被任何算法消耗掉。
因此,让我们讨论一些概念,帮助你面对这个有时看似艰巨的任务。实际上,数据集可以被认为是由变量(列)和观察值(行)组成的表格:

列是变量,行是观察值
列或变量应该都是相同的类型(例如,数字、日期、字符等),而行或观察值(也称为“向量”)可以是所有类型数据的混合。
因此,要开始讨论数据准备,我们需要区分一个和多个数据集的数据争论。
单一数据集
处理单个数据集的主要任务是:
排序(排列)
数据争论的一个最基本的功能是根据变量的值或字符或者它们的选择对行进行排序。这可以按字母顺序,从最小到最大的数字,或其他。
在大多数情况下,您需要对一个单独的变量进行排序,但是通过定义一个主参数,然后定义后续的参数,可以对多个标准进行排序。

将变量 A 从最小到最大排序,然后将变量 B 从最大到最小排序
挑选
选择是根据定义的标准在数据集中选择列的活动。这可以简单到根据列的名称或位置选择列,或者在一系列列上使用不同的语句。可以通过在选择语句中使用“starts with”、“ends with”或“contains”等语句对列进行部分匹配,甚至可以从选择中排除特定的列(或一组列)。

选择变量 A 和 B (C 被删除)
您可以使用条件选择来显示满足特定条件的列,例如,只显示包含数字数据或字符数据的列。反过来,您可以选择这些条件的否定,只选择不满足一个或多个条件的数据(例如,只显示没有日期格式的数据)。
此外,您可以对数值数据使用逻辑表达式,例如选择高于某个阈值的值或包含低于某个参数的平均值的值。
过滤器
当您不想在分析中包含数据集的所有行时,可以使用筛选函数返回符合一个或多个条件的行。这是一个子设置程序,允许您通过列、值的范围或甚至带有公差范围的近似值来选择特定值。使用字符,您可以根据完全或部分字符匹配进行过滤以包括或排除结果,还可以查找以特定术语开头、结尾或包含特定术语的寄存器。

按变量 A 中的奇数进行筛选
具有多个条件的过滤器可以与 AND、OR 和 NOT 条件结合使用,您甚至可以指定在两个条件中只有一个得到满足时返回值,而在两个条件都得到满足时不返回值。
与选择功能类似,过滤器可以无差别地应用于所有列,或者与条件一起使用,只返回符合条件的寄存器。筛选函数对于筛选出 NA 或缺失值行特别有用。您还可以过滤最高或最低值,只显示这些寄存器,而无需显示整个数据集行。
过滤是获得数据帧中的唯一值或不同值的正确方法,或者只是计算它们的数量。
总计
数据汇总是收集信息并以汇总形式表达信息的过程,目的是执行统计分析(汇总)或基于特定变量创建特定组(分组依据)。
- 总结
汇总运算使用单个数值来浓缩大量值,例如平均值或中值。汇总统计数据的其他示例包括总和、最小(最小值)、最大(最大值)和标准偏差:这些都是大量值的汇总。这样,单个数字就可以通过计算聚合来洞察潜在大型数据集的本质。

显示每个变量的模式(列中出现频率最高的值)
汇总可以是有条件的,即在执行操作之前陈述参数。例如,如果您考虑计算所有变量的平均值,您可以定义一个条件,只对数值变量这样做,因为分类变量会产生错误(它们没有平均值)。
- 分组通过
在大多数情况下,我们不仅仅希望汇总整个数据表,还希望按组获得汇总,这样可以更好地了解数据的分布情况。要做到这一点,您首先需要指定要用哪个(哪些)变量来划分数据,然后汇总这些类别。

按变量 B 分组,并按平均值(变量 A)和总和(变量 C)汇总
Group by 是一个经典的聚合函数,当与 summarize 函数结合使用时,它变得非常强大。您可以按多个变量分组,然后同时汇总多个变量,这在您希望按类别细分变量时非常有用。这种方法也被称为“拆分-应用-组合原则”,在这种方法中,你将一个大问题分解成小的可管理的部分(拆分),独立地操作每一部分(应用),然后将所有部分重新组合在一起(组合)。

拆分-应用-组合原则。来源: 分析 Vidhya
改变
转换数据包括通过数据集中的现有值创建新的记录字段,这是数据准备的最重要的方面之一。确定何时(以及是否)需要数据转换并不容易,定义所需的转换类型就更复杂了。
但是你为什么要转换一个变量呢?您可以将分类变量转换为更适合分类和回归模型的格式,或者使用对数转换将非线性模型转换为线性模型并处理倾斜数据。

通过将变量 A 和 C 相乘构造的新生成的变量
您可以执行所有类型的转换(例如标准化、规范化或二进制化),并将同一转换应用于多个变量。您可以连接变量来创建新的变量,或者执行基本的算术运算来创建它们。
替换
当你想把特定的字符转换成其他字符时,你可以使用这个。您可以将数字字符转换为数据和时间格式,或者重新编码变量以适应模型。这种技术通常用于替换丢失的值,尽管我们稍后将深入探讨这个问题。

值为 5 的方形观测值
转换和替换之间的主要区别在于,您不需要创建额外的变量或寄存器(您需要修改现有的变量或寄存器),并且您可以更改变量的性质(例如,将字符变量更改为数字代码),而无需创建新的记录字段。您可以对所有变量执行替换,为它们设置条件,或者只对特定的寄存器执行替换。
组合数据集
数据科学的真正力量来自于数据量。实际上,数据托管在不同的服务器上,并存在于许多不同的文件中。当您需要的数据来自多个来源时,知道如何组合它们是非常重要的。让我们探讨一些通常用于利用这一问题的技术:
连锁的
通常,可以通过向数据集中添加更多行或更多列来添加信息。当数据集具有相同的一组列(变量)或相同的一组行(观察值)时,可以分别垂直或水平地连接或绑定它们。

如果要添加更多的行,数据集必须具有相同的变量(列)集,但是观察值不必按照相同的顺序排列。
如果您要添加更多的列,您应该检查观察的数量和顺序是否相同。

需要注意的是,如果您在多个数据集上有相同的观察值,并且您将它们垂直连接起来,那么您的表中就会出现重复的观察值。
合并
连接是将数据集合并到单个表中的标准方式。连接用于根据两个或多个数据集中的相关列来组合它们。连接有多种类型,主要有:
- 内部连接:只产生在两个数据集中匹配的记录集。在编程逻辑中,你可以用和来思考。
- 完全外部连接:产生两个数据集中的所有记录的集合,其中匹配的记录来自两边。如果不匹配,缺失的一方将包含空值。
- Left Join: 从表 x 中产生一组完整的记录,与表 y 中的记录(如果有)匹配。如果没有匹配,右侧将包含空值。
- 右连接:返回表 y 中的所有记录以及满足表 x 中某个条件的记录。如果不匹配,输出或结果集将包含空值。

连接的主要类型。来源:数据科学使之变得简单
你可以在这个链接中找到 Python 中的例子
缺少值
缺失数据(或缺失值 s)通常被编码为 NaNs 或 blanks,被定义为没有为感兴趣的观测值中的变量存储的数据值。缺失数据的问题在几乎所有的研究中都相对普遍,并且会对从数据中得出的结论产生重大影响。缺失值可分为以下几类:
- 完全随机缺失(MCAR): 当数据缺失的概率与应该获得的特定值或观察到的响应集都不相关时。这是数据因设计而丢失的情况(例如,由于设备故障)。
- 随机缺失(MAR): 响应缺失的概率取决于观察到的响应集合,但与期望得到的具体缺失值无关。
- 非随机缺失(MNAR): 在这种情况下,获得参数无偏估计的唯一方法是对缺失数据进行建模(例如,高收入人群通常不会在调查中透露他们的收入)
处理缺失数据的策略有很多,但没有一个是普遍适用的。解决这个问题需要基于经验和领域,它从理解缺失值的本质开始。
处理这个问题的一些常用方法包括:
- 删除缺少值的实例
- 删除缺少值的属性
- 输入所有缺失值的属性(如平均值、中值或众数)
- 通过线性回归输入属性缺失值
- 上次观察结转
您也可以制定自己的策略,如删除任何有两个以上缺失值的实例,并使用平均属性值插补剩余值。或者更复杂的是,构建一个决策树来填充那些缺失的值。
极端值
异常值是位于与其他值异常距离处的观察值,偏离了原本结构良好的数据。它们是不属于特定人群的数据点。
为了识别它们,有必要执行探索性数据分析(EDA ),检查数据以检测异常观察,因为它们会以激烈的方式影响我们的分析和统计建模的结果。请看下面的例子:

在左侧,一个线性回归建立在一个数据集上,该数据集顶部包含几个异常值。在右边,在移除那些异常值之后,在相同的数据集上建立的线性回归。来源:分析 Vidhya
你看到这些异常值是如何改变左边回归的斜率的吗?两条回归线中哪一条更能代表数据集?
好了,你找到一个异常值,去掉它,继续你的分析。不要!简单地从你的数据中删除离群值而不考虑它们会如何影响结果是一个灾难的处方。
离群值不一定是坏事
这就是你的判断发挥作用的地方。异常值会极大地偏离/改变模型的拟合估计和预测,但需要小心处理。检测异常值是数据科学等学科的核心问题之一,您处理它们的方式将影响您的分析和模型性能。检测异常值的一些常用方法有:
- Z-Score: 是一个指标,表示一个数据点距离样本均值有多少标准差,假设为高斯分布。Z-score 背后的直觉是通过找到它们与数据点组的标准差和均值的关系来描述任何数据点。通过这种方式,我们可以重新调整数据的比例并使其居中,同时寻找离零太远的数据点。这些离零太远的数据点将被视为异常值(在大多数情况下,使用阈值 3 或-3)。
- 四分位数间距(IQR)得分:是统计离差的度量,等于第 75 个和第 25 个百分位数之间的差值,或上下四分位数之间的差值,IQR = Q3 Q1。它是离差的一种度量,类似于标准差或方差,但对异常值更稳健。
- DBSCAN 算法:是一种基于密度的聚类。虽然本质上不是一种离群点检测方法,但它基于距离度量来增长聚类。DBSCAN 计算点之间的距离(欧几里德距离或一些其他距离)并寻找远离其他点的点:不属于任何聚类的点得到它们自己的类:-1。
异常值可以有两种类型:单变量和多变量。当我们查看单个变量的分布时,可以发现单变量异常值,而多变量异常值是 n 维空间中的异常值:为了找到它们,您必须查看多维的分布。
与缺失值类似,异常值可以被估算(例如,使用平均值/中值/众数)、封顶(替换某些限制之外的值),或者由缺失值替换并预测。
特征缩放
数据集中变量的范围可能会有很大差异。一些特征可以用千克表示,而另一些用克表示,还有一些用升表示,等等。使用原来的尺度可能会对范围大的变量赋予更多的权重,这可能是一个问题。特征缩放是一种统一数据中自变量或特征范围的方法。
当特征的范围非常不同时,一些基于距离的算法,如 K-最近邻、支持向量机或神经网络会受到影响(具有大范围的特征在计算距离时具有高影响)。另一方面,如果算法不是基于距离的(例如朴素贝叶斯或决策树),特征缩放就不会有影响。
那么,如何扩展呢?
- 正常化:是一种缩放技术,在这种技术中,值被移动和重新缩放,使得它们最终的范围在 0 和 1 之间。
- 标准化:重新调整特征值,使其分布平均值为 0,方差等于 1。

比较未缩放、规范化和标准化的数据。来源:分析 Vidhya
使用规范化或标准化的选择将取决于问题和机器学习算法。没有使用其中一种的通用规则,因此您总是可以从将您的模型与原始的、规范化的和标准化的数据进行拟合开始,并比较性能以获得最佳结果。
特征缩放可以显著提高一些机器学习算法的性能,但对其他算法没有影响。
编码
许多机器学习算法无需进一步操作即可支持分类值,但还有许多算法不支持。分类变量只能取有限的、通常是固定的可能值。一些例子包括颜色(“红”、“黄”、“蓝”)、尺寸(“小”、“中”、“大”)或地理名称(州或国家)。
同样,对于如何解决这个问题,没有单一的答案,但让我们介绍一些主要的策略:
- 替换值:包括用所需的数字替换类别。这是最简单的编码形式,其中每个值都被转换为整数,对于类别顺序很重要的顺序变量尤其有用。
- 标签编码:将非数字标签转换为数字标签。每个类别都被分配了一个唯一的标签,从 0 开始,一直到 n _ categories 每个要素 1。标签编码器适用于对标签的字母对齐或数值很重要的变量进行编码,但缺点是数值可能会被算法误解:编码为 5 的变量应该比编码为 1 的变量多 5 倍的权重吗?
- 一键编码:包括将每个类别值转换成一个新列,并为该列分配一个“1”或“0”(真/假)值。这样做的好处是不会对一个值进行不恰当的加权,但是当有许多类别时,这样做不是很有效,因为这会导致形成许多新列。
- 二进制编码:首先将类别编码为序数,然后将这些整数转换为二进制代码,二进制字符串中的数字被分割成单独的列。这对高基数数据来说很好,因为它只创建很少的新列:大多数相似的值在许多新列中相互重叠,允许许多机器学习算法学习值的相似性。
除了这些策略之外,还有多种编码变量的方法,因此了解各种选项以及如何在您自己的数据集上实现它们非常重要。
你可以在这里找到 Python 编码的完整教程。
降维
随着数据量的增加,这可能会对某些算法的实现时间产生重大影响,使可视化变得极具挑战性,甚至使一些机器学习模型变得无用。从统计学上来说,我们拥有的变量越多,我们需要的样本数量就越多,这样我们的样本才能很好地代表特征值的所有组合。
降维是减少数据集中变量总数的过程,以避免这些陷阱。这背后的概念是,高维数据“表面上”由少量简单变量主导。这样,我们可以找到变量的子集来表示数据中相同级别的信息,或者将变量转换为一组新的变量,而不会丢失太多信息。
处理高维数据的两种常见方法可能是:
- 主成分分析(PCA): 可能是我们想到降维时最流行的技术。其思想是降低由大量相关变量组成的数据集的维度,同时尽可能多地保留数据中的差异。PCA 是一种无监督算法,它创建原始特征的线性组合。主成分是原始变量的线性组合,其工作方式如下:提取主成分的方式是第一个主成分解释数据集中的最大方差。第二个主成分试图解释数据集中的剩余方差,并且与第一个主成分不相关。第三个主成分试图解释前两个主成分没有解释的方差,以此类推。这样,您可以通过限制基于累积解释方差保留的主成分的数量来降低维度。例如,您可能决定只保留所需数量的主成分,以达到 90%的累计解释方差。

PCA 的 3D 示例。来源: Setosa 视觉解说
- 线性判别分析(LDA): 与 PCA 不同,LDA 不会最大化解释方差:它最大化类别之间的可分性。它试图为因变量保留尽可能多的判别能力,同时将原始数据矩阵投影到一个低维空间:它以最大化类可分性的方式投影数据。LDA 是一种监督方法,只能用于标记数据。来自同一类的例子通过投影紧密地放在一起。来自不同类别的示例被投影放置得相距很远。值得注意的是,LDA 确实对我们的数据做了一些假设。特别是,它假设我们的类的数据是正态分布的(高斯分布)。
你可以在 Python 这里找到这两种方法的完整实现。
结论
在现实世界中,数据分散在多个数据集和许多不同的格式中。不管你喜不喜欢,你都需要面对我们描述的一些问题,你准备得越好,你遭受的痛苦就越少。
重要的是要记住没有免费的午餐。要解决一个问题,你需要做出决定,而这个决定会带来后果。当您丢弃缺失值或移除带有百分点的异常值时,您正在更改数据集。即使您更改了最小的事情(这是您需要做的),您也在更改您的原始数据。这很好,不需要担心,但是请记住,你的行为(或大或小)会带来后果。
Python 数据可视化基础
不到 5 分钟的逐步介绍

在这篇博客中,我们将学习如何获取、转换并最终吸引人地呈现数据。我们将使用新冠肺炎数据集和 Python 来学习基础知识。
学习数据,你就可以讲述更多人甚至还不知道却渴望听到的故事。—内森·尤
总之,在不到 5 分钟的时间里,你将学会如何从熊猫的数据框架中获取数据,如何转换数据框架,并最终通过折线图、条形图、饼状图和热图将其可视化。
采购数据
任何项目的最大问题之一是找到正确的数据。正如之前看到的,人们可以尝试建立自己的数据集,但在这种情况下,我们没有必要这样做。

马库斯·温克勒在 Unsplash 上拍摄的照片
在本教程中,我们将使用来自约翰·霍普金系统科学与工程中心的数据。更具体地说,我们将使用每日死亡人数的时间序列数据。
我们可以做的第一件事是在浏览器上打开链接,检查数据以识别一些快速信息。我们可以看到数据是 CSV 格式的(带分隔符',')。我们还可以看到,每一天都包含死亡总人数(不是每日死亡人数)。最后,我们可以看到国家/地区级别的数据。
事不宜迟,让我们来看看代码。为了方便起见,熊猫图书馆允许我们直接从网上获取数据。
import pandas as pdurl = 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv'df = pd.read_csv(url, delimiter=',',header = 'infer')

转换数据
既然我们已经获得了数据,我们需要为处理做好准备。我们需要的必要操作取决于我们试图实现的目标。
在这种情况下,我们应该做的第一件事是以两种方式过滤我们的数据:
- 仅保留国家级数据(即删除任何定义了省/州的数据)
- 只保留英国、美国、意大利和德国的国家级数据。
df_interest = df.loc[
df['Country/Region'].isin(['United Kingdom','US', 'Italy', 'Germany'])
& df['Province/State'].isna()]

接下来,我想转置数据,这样每一列是每个国家,每一行是每个日期。
df_interest.rename(index=lambda x: df_interest.at[x,'Country/Region'], inplace=True)df1 = df_interest.transpose()

最后,我们可以去掉我们不感兴趣的行:
- 省/州、国家/地区、经度和纬度
- 所有国家的死亡率为零的任何列
然后将我们的索引数据类型转换为 DateTime,这样它就可以很好地处理时序操作。
df1 = df1.drop(['Province/State','Country/Region', 'Lat','Long'])df1 = df1.loc[(df1 != 0).any(1)]df1.index = pd.to_datetime(df1.index)

这样,我们就可以开始可视化我们的数据了。
数据可视化
线形图
在直线上绘制数据可以显示数据如何随时间变化,并且可以比较不同的变量。一旦数据格式正确,用 Python 创建线图就非常简单了。

from matplotlib import pyplotdf1.plot()pyplot.xlabel('Dates')pyplot.ylabel('No of Deaths')pyplot.show()
条形图
我很确定我从来没有打开过没有条形图的 PowerPoint 演示文稿。在比较单个时间点的不同变量时,条形图非常有效。

import matplotlib.pyplot as plt; plt.rcdefaults()import numpy as npimport matplotlib.pyplot as pltobjects = df1.max().indexy_pos = np.arange(len(objects))performance = df1.tail(1).values.tolist()[0]plt.bar(y_pos, performance, align='center', alpha=0.5)plt.xticks(y_pos, objects)plt.ylabel('Deaths')plt.xlabel('Countries')plt.title('Deaths per Country')plt.show()
圆形分格统计图表
谁不喜欢馅饼…图表!饼状图是显示不同数据集之间相对大小的另一个好方法;很像条形图。

from matplotlib import pyplot
import numpy as np#Credit: [https://stackoverflow.com/questions/41088236/how-to-have-actual-values-in-matplotlib-pie-chart-displayed-python](https://stackoverflow.com/questions/41088236/how-to-have-actual-values-in-matplotlib-pie-chart-displayed-python)
def absolute_value(val):
a = np.round(val/100.*df1.max().sum(), 0)
return int(a)plot = df1.max().plot.pie(y=df1.max().index, figsize=(5, 5),autopct=absolute_value, label='')
plot.set_title('Total Number of Deaths', fontsize=12)pyplot.show()
热图
热图是一种更先进的可视化技术,允许我们呈现不同变量的时间序列数据,并进一步通过颜色进行比较。

#Credit [https://matplotlib.org/3.1.1/gallery/images_contours_and_fields/image_annotated_heatmap.html](https://matplotlib.org/3.1.1/gallery/images_contours_and_fields/image_annotated_heatmap.html)import numpy as np
from matplotlib import pyplotdf1 = df1.tail(15)
dates = df1.index.strftime('%Y-%b-%d')
countries = df1.max().indexdf2 = pd.DataFrame(df1, columns=df1.columns).astype(int)matrix = np.array(df2).transpose()fig, ax = pyplot.subplots()
im = ax.imshow(matrix)# We want to show all ticks...
ax.set_xticks(np.arange(len(dates)))
ax.set_yticks(np.arange(len(countries)))
# ... and label them with the respective list entries
ax.set_xticklabels(dates)
ax.set_yticklabels(countries)# Rotate the tick labels and set their alignment.
pyplot.setp(ax.get_xticklabels(), rotation=45, ha="right",
rotation_mode="anchor")# Loop over data dimensions and create text annotations.
for i in range(len(dates)):
for j in range(len(countries)):
text = ax.text(i, j, matrix[j, i],
ha="center", va="center", color="w", size = '10')ax.set_title("Deaths Per Day Heatmap")
fig.tight_layout()
pyplot.show()
结论
好了,伙计们。在不到五分钟的时间里,你已经学会了如何创建数据可视化的一些基础知识。创造这些观想可以成为一个非常强大的工具,帮助你讲述一个故事和理解一个信息。
祝大家学习愉快,平安无事!
在你离开之前,如果你喜欢这篇文章,你可能也会喜欢:
学习使用 Python 从 pdf 中提取文本
towardsdatascience.com](/how-to-extract-text-from-pdf-245482a96de7) [## 用 Python 中的 Regex 和 BeautifulSoup 实现 Web 数据抓取
了解如何快速从互联网上抓取数据
medium.com](https://medium.com/financeexplained/web-data-scraping-in-python-with-regex-and-beautifulsoup-e57f4a3392e3) [## SQL 简介
通过示例学习 SQL 的基础知识
towardsdatascience.com](/an-introduction-to-sql-4c9eb27995df)
蒙特卡罗积分的基础
用 python 实现。

罗马法师在 Unsplash 上拍摄的照片
我们都记得高中时必须手动计算的积分。为了做到这一点,我们必须计算一系列或多或少的复杂运算,以找到反导数函数的表达式,然后在所需的区间内进行减法运算。然而,你可能还记得,积分一个函数在图形上相当于计算该函数曲线下的面积。数值积分的原理在于第二种说法。这个想法是在已知函数表达式的情况下,在一个定义的区间内估计函数的积分。对于这样一个目标,蒙特卡罗方法是一个很大的帮助。蒙特卡罗积分是一种使用随机数进行数值积分的技术。
蒙特卡罗估计量的基本概念
让我们试着积分一元函数 f 。我们将用 F 来表示积分的值。

2D 积分
正如我们在引言中所说,这个积分可以解释为函数曲线下的面积。让我们以下面的函数为例:

图 1 是 f 和我们想要计算的积分的图示。

图 1
假设 a=-2,b=5。如果我们在 a 和 b 之间取一个随机点 x_i,我们可以用 f(x_i)乘以(b-a)得到一个宽(b-a)高 f(x_i)的矩形的面积。蒙特卡罗积分背后的思想是通过计算随机选取的 x_i 的矩形平均面积来近似积分值(图 1 上的灰色区域)。如下图 2 所示。

图 2
通过将矩形的面积相加并对总和求平均,得到的数字越来越接近积分的实际结果。事实上,太大的矩形补偿了太小的矩形。所以看起来 f(x)的经验均值是一个很好的积分估计量。这个想法用下面的公式形式化,就是蒙特卡罗估计量 (N 是 X 的随机抽取次数):

在这个公式中,X 是一个随机变量,FN 也是。大数定律告诉我们,当 N 接近无穷大时,蒙特卡罗估计量以概率收敛于 F,即积分的真值:

我们从蒙特卡罗估计量中得到的另一个重要结果是估计量的方差: 𝜎^2 / N 其中𝜎 是函数值的标准差,n 是样本数 x_i,这意味着我们需要 4 倍多的样本才能将估计量的误差减少 2 倍。
在接下来的两个部分中,我们将首先给出用 python (2D 和 3D)实现集成的具体例子,然后我们将解释一种方差减少解决方案:重要性采样。
粗糙蒙特卡罗方法
原始蒙特卡罗方法是上述概念的最基本应用:
- 随机抽取 x_i 是按照统一的规律在 X 上进行的。
- 我们计算 f(x_i)的和,乘以(b-a)并除以样本数 n。
为了说明这个过程,我们来看一个具体的用例:我们要在区间【0;0.55] ,如下面图 3 中的所示。如果 X 是遵循这个贝塔定律的随机变量,这个积分对应于 P(X < = 0.55) ,可以用贝塔(X,50,50)密度定律的累积密度函数(c.d.f .)精确计算:它给出 0.8413 。我们将尝试通过蒙特卡罗积分来接近这个数字。

贝塔分布函数进行积分

图 3
蒙特卡罗估计量
如前所述,我们将使用均匀分布对 x_i 进行 N = 10 000 次随机抽取。然后,我们使用以下公式计算积分估计和相关误差:

使用 python 的原始方法

图 4
蓝点对应于 f(x_i)的 10 000 个值,这些值是根据我们在 x 上绘制的均匀图计算出来的。
我们已经注意到,因为绘制是在 X(即水平轴)上均匀进行的,所以当曲线的斜率增加时,我们在点之间有相当大的空间和较少的重叠。
曲线下面积的几何估计
另一种计算积分的方法是对积分进行几何近似。实际上,通过在 x 和 y 轴上使用统一的随机绘制,我们映射了对应于期望范围[x _ min;x_max]并计算曲线下的点与矩形中绘制的总点数之比。这个比率将收敛到曲线下的面积,N 是抽签的次数。这个想法如图 5 所示。

用 python 实现几何近似

图 5
重要性抽样
重要抽样背后的思想很简单:由于蒙特卡罗估计量的误差与 f(x)的标准偏差除以样本数的平方根成正比,我们应该找到一种比统一法则更聪明的方法来选择 x_i。重要性抽样实际上是画出 x_i 来减少 f(x)的方差的一种方法。事实上,对于函数 beta(x,50,50)我们注意到很多 x_i 超过[0;0.55]会给出一个 f(x) ~ 0,而只有 x 在 0.5 左右的几个值会给出 f(x) ~ 8。
重要性抽样的关键思想是,我们使用概率密度函数(p.d.f .)在 X 上抽取样本,这将为要计算的 f(x)的高值提供更多机会,然后我们通过 X 发生的机会(即 p.d.f .的值)对 f(x)的总和进行加权。
根据这个想法,我们试图逼近威尔的积分变成了:

重要抽样下的整数值逼近
使用:
- n:样本数量
- f:积分函数
- g: p.d.f .在 X 上随机抽取
- g:g 的反函数
并且用于计算估计器误差的 f 的方差变成:

重要抽样下估计量的方差
回到 beta(x,50,50)分布函数的用例,似乎使用以 0.5 为中心的正态分布作为 g 函数可以帮助我们。f 和 g 之间的联系如下图 6 所示。

图 6
下面的图 7 显示了使用这种方法在[0;0.55].与选择 x_i 的统一定律相比,点的密度还显示了使用高斯概率分布函数的相关性:x_i 点集中在感兴趣的区域,其中 f(x_i)!= 0.
使用 python 进行重要性采样

图 7:重要性采样(左)与原油综合(右)
方法比较
这里是积分值和相对误差的汇总。我们用重要抽样法减小了误差。

集成 3D 功能
图 8 给出了一个映射在 2D 空间(x_A,x_B)上的 3D jointplot 的例子。这个例子取自贝叶斯 A/B 测试的分析。蓝色等高线图对应于 2 个不同变量(A 和 B)的贝塔分布函数。其思想是通过计算联合后验 f 的积分来计算变异 B 优于变异 A 的概率,图中的蓝色等高线图表示 x_A 和 x_B 的值在橙线上(即 x _ B>= x _ A 的值)。

联合概率密度函数积分

图 8
因此,让我们针对 x_A 和 x_B 的值计算对应于蓝色 3D 钟形下方区域的积分,x_B >= x_A(图中橙色线的上方)。这次我们将抽取 N = 100 000 个样本。
用粗的方法:
Integral value: 0.7256321849276118
Calculation error: 0.01600479134298051
重要性抽样
Integral value: 0.7119836088517515
Calculation error: 0.0018557917512560286
重要性采样方法能够在相同数量的样本下获得几乎 10 倍的精确结果。
结论
粗略方法和重要抽样属于蒙特卡罗积分方法的一大类。在这里,您有了用 python 实现这两种技术的所有材料,只需要普通的库,如 numpy 和 scipy。请记住,蒙特卡罗积分对高维积分特别有用。在我们的例子中,3D 的精度提高了 10 倍,而 2D 的精度提高了 4 倍。
参考
- https://cs . Dartmouth . edu/~ wjarosz/publications/dissertation/appendix a . pdf
- [https://www . scratchpapixel . com/lessons/mathematics-physics-for-computer-graphics/Monte-Carlo-methods-in-practice/Monte-Carlo-integration](https://www.scratchapixel.com/lessons/mathematics-physics-for-computer- graphics/monte-carlo-methods-in-practice/monte-carlo-integration)
简单线性回归的基础(非技术性)

彼得·德·格兰迪在 Unsplash 上拍摄的照片
自从开始我的数据科学之旅以来,我一直在研究线性回归模型。与财富 300 强公司的多个业务利益相关者一起工作过,我有幸理解了对数据科学家的期望。这是一个非技术性的博客,但它确实包含了一些对模型的数学理解。我鼓励一个非技术人员也参考一下,因为让你的手变脏并理解机器学习的细微差别是值得的。
永远不要低估基础知识,尤其是在数据科学领域。
回归是一种监督学习方法,在这种方法中,您使用历史数字数据,训练模型,然后使用它来获得尽可能多的点的最佳拟合线。在二维空间中,这叫做直线;在 n 维空间中,我们称之为超平面。回归是预测分析模型中最常用的方法。
当有那么多伟大的文章和对最常见算法的解释时,为什么还要花力气…
towardsdatascience.com](/interpret-linear-regression-in-10-mins-non-technical-3f78f1f1dbd1)
CRISP-DM 是一个开发模型时应该知道的花哨词。它简单地代表了工业标准流程,数据流程,T21 流程。这类似于软件开发中的 SDLC(软件开发生命周期)。跟着它!或者至少让你的利益相关者知道你会这么做。😛
简单线性回归:
这是回归的基础。您有一个单个特征,用于预测另一个变量。这个用于预测的单一特征被称为预测器或独立变量。您正在预测的值是因变量。
你知道直线的方程式是:
y = mx + c,Where,
y = Dependent Variable
m = Slope of the line (The angle of the line)
x = Independent Variable
c = Some constant
所以,我谷歌了一下简单线性回归,这是弹出的第一批图片之一。

来源:学分
我们在这里理解什么?
X 轴:自变量—工作年限
Y 轴:因变量—工资
我们知道,工资多少取决于工作年限,可以用下面的等式表示:
Salary = (slope)*(Years of experience) + some constantEssentially,
Y = mx + cSo, a good way to understand the constant here would be that if your number if years of experience was zero, you would still get some salary.
最佳拟合线
理解最佳拟合线的最简单方法是画一条穿过这些点的直线,使它尽可能接近所有点。我们只是试图最小化回归线和点之间的距离。为了理解和量化这一点,我们寻求一些指标的帮助。
RSS:
残差平方和。不要惊慌失措,你还处于初级阶段。
问:什么是剩余?
答:很简单。假设使用线性回归,你已经在呈现线性关系的点之间形成了一条线。
待预测的点到预测的线的垂直距离称为残差。

来源:这里!
通过最小化 RSS:残差平方和误差找到最佳拟合线。
好吧,现在这很尴尬,我必须承认如果你在这里或在 LinkedIn 上关注我,你会意识到我是一名数据科学家,但不是数学的最大粉丝。数学,对我来说,是一种必要的恶。我建议你详细地研究一下数学,这在我的博客中是绝不会出现的。
为了数据科学的应用,我更喜欢优雅的逻辑过程和简单的代码。
如果你想知道术语之外的数学知识,谷歌一下。如果你想理解数学的直觉,请跟随我。

线性回归的强度
你的模型有多好?因此,有人告诉我,我们可以借助以下指标来计算线性回归模型的强度:
- r 或决定系数
- 剩余标准误差
1.r 或决定系数
因此,标题被突出显示,以便您记住 R 的同义词是决定系数。啊!为了给你解释 R,我需要告诉你什么是 TSS 或者总平方和。
现在,当我们想看看一个简单的线性模型做得好不好,我们需要有一个基线。最简单而有效的基线是模型的平均值。如果你不能打败一个模型的平均值,那么,你所拥有的就是坏的,非常坏的。我从维基百科页面这里截取的片段很好地代表了这一点。

TSS:总平方和:我们应该预测的值——所有点的平均值(来源)
所以,R 是一个度量(数字),简单地说,它解释了给定数据的哪一部分。r 介于 0 和 1 之间。总体而言,R 平方值越高,模型就越符合您的数据。
奇怪的是,我不得不在这里再次解释 RSS 是什么意思。RSS 是点的实际值和点的预测值之差,它是由维基百科页面上的另一个片段精确定义的。

RSS:实际值—预测值(来源)
问:为什么选择 RSS/TSS?
A .很简单。你的模型至少要打败一个在点的中间画直线的家伙。如果值为 0,说明比那个差。R 的值越接近,模型越好。

R 的物理意义(来源)
相同的代码库可以在这里找到:
[## anishmahapatra 01/masterdata science
在 GitHub 上创建一个帐户,为 anishmahapatra 01/masterdata science 开发做出贡献。
github.com](https://github.com/anishmahapatra01/MasterDataScience/tree/master/Course02-machineLearning-I/01LinearRegression) 
高潮:
R = 1 — (RSS/TSS) ~决定系数

RSE:剩余标准误差

原因是试图获得回归中潜在误差方差的无偏估计量。什么是它?
这并不像上面展示的 R 那样被广泛使用。
[## 在 15 分钟内在云上运行 Jupyter 笔记本电脑#Azure
文章做到了标题所说的。在 Azure 笔记本电脑(免费或付费)上运行 Jupyter Notebook,其成本仅为……
towardsdatascience.com](/running-jupyter-notebook-on-the-cloud-in-15-mins-azure-79b7797e4ef6)
结论:
很好地达到了这里,特别是如果你是一个非技术人员。像我们其他人一样成为一名数据科学家的秘诀就是有勇气去谷歌搜索你的想法。正如我所承诺的,我希望你已经成功地理解了简单线性回归。我花了很多时间研究,并且非常喜欢写这篇文章。如果这对你有帮助,给我点爱!😄我也写关于千禧一代的生活方式、咨询、聊天机器人和财经!如果您对此有任何问题或建议,请随时通过 LinkedIn 联系我或关注我这里,我很乐意听取您的想法!
[## Anish Mahapatra -数据科学家-穆适马公司| LinkedIn
我正在努力理解数学、商业和技术如何帮助我们在未来做出更好的决策…
www.linkedin.com](https://www.linkedin.com/in/anishmahapatra/)
基础知识:主成分分析
从头开始的数据科学
一种无监督的变量分组和降维方法
主成分分析介于无监督学习和数据处理之间。一方面,这是一种无监督的方法,但它将特征组合在一起,而不是像聚类算法那样将点组合在一起。但是,主成分分析最终可能是最有用的,当它与监督模型结合使用时,可以用于降维——减少特征变量的数量。PCA 在一些其他情况下也是有用的,例如从数据中过滤随机噪声的方法,但是我们在这里考虑它是为了降维。
维度过多时该怎么办
想象一下,你正在进行某种社会科学研究,包括调查人们并记录他们的各种事情。你可能希望数据集中有各种各样的东西来帮助你的研究。你肯定想要人口统计信息,例如:年龄、性别、他们住在哪里或者他们来自哪里。社会经济信息通常也很有帮助。也许你正在研究某种公共健康问题,也想了解一些医学信息,比如身高、体重和血压。你可能收集信息的变量的数量几乎是无穷无尽的,所以当你这么做的时候,为什么不收集你能想到的所有信息呢?在你兴奋之前,考虑一下有可能有太多的特征变量。
这怎么可能,有太多的功能?数据越多不是越好吗?事实证明,拥有许多不同的特性会带来一系列的挑战。具有许多特征变量的数据集往往会更稀疏,也就是说,其中的点平均来说彼此之间会更远。让我们考虑一个简单的例子来感受一下为什么会这样。
假设你正在做研究,你只有一个独立的特征变量,为了简单起见,它是一个只有两个选项的分类变量,比如受试者是男性还是女性。到目前为止,回答者只能分为两类。如果再加一个类别会怎么样?同样为了简单起见,假设您在只有两个选项的第二个功能后提问,回答者是否有大学学位。现在,类别的数量已经增长到四个:受过大学教育的男性,受过大学教育的女性,以及没有大学学历的男性和女性。如果您添加另一个具有两个可能值的变量,组合的数量将增加到 8。当您以这种方式添加变量时,可能的组合数量以及不同类别的数量会呈指数增长。当然,如果你添加一个有两个以上可能值的变量,比如说被调查者居住在哪个州,组合的数量会增长得更快。
组合的指数增长带来了许多挑战。首先,你需要的回答者的数量基本上也是呈指数增长的。当你只有一个变量时,你可以从每个只有两个回答者的可能类别中得到至少一个例子。当您将变量的数量增加到 3 时,突然您需要至少 8 名受访者来涵盖每个可能的组合(更不用说在您可以确定您从每个组合中随机收集了一名受访者之前,您需要对多少名受访者进行采样)。一个有 100 个这样的变量的数据集,即使每个变量只有两个可能的选项,也会有大量的可能组合,甚至一个相当大的数据集也可能没有每个组合的例子。
另一方面,回想一下像支持向量机这样的模型是通过尝试用超平面划分数据点来工作的,超平面将不同类别的点整齐地分开。添加要素时,点与点之间的距离会随着空间变得越来越稀疏而增加,并且更容易拟合分隔点的超平面。即使你添加的变量没有真正的因果或解释价值,你也可能会遇到这个问题,除非你相应地增加样本的大小,这时你可能会开始遇到计算能力的限制。
用 PCA 削价
因此,我们需要限制我们的模型使用的变量的数量,但是我们不一定想要简单地删除特性,或者甚至提前知道我们应该删除哪些特性。PCA 允许我们减少模型使用的变量数量,同时尽可能多地考虑所有特征的差异。其中的见解是,特别是当你有许多变量要处理时,不可避免地,它们中的一些会相互关联,允许你同时考虑多个特性。考虑以下两个相关变量:

两个相关变量
这两个变量是相关的,这意味着它们不是完全独立的。如果你知道其中一个的价值,你就可以对另一个的价值做出合理的猜测。也许这些变量是针对身高和体重的。你知道有些人比其他人更苗条,但是一般来说高个子会比矮个子更重。考虑到这一点,让我们在这里重新定义这个问题。让我们从描绘两个变量之间关系的一条线开始:

我们的变量和一条符合它们之间关系的线
这里的见解是,我们可以用沿着这条线的距离作为它自己的变量。不是说一个点有一个高的 x 值和一个高的 y 值,我们可以把一个点描述为沿着线向右远处,隐含地给你关于 x 和 y 坐标的信息。事实上,让我们使用这条线作为绘制点的新轴来重新绘制我们的点:

我们传统的 x 和 y 坐标已经被沿线的距离和线上下的距离所取代
你可能想知道我们在这一切中取得了什么成就。我们以前有两个维度,x 和 y,现在仍然有两个维度,沿线的距离和线上/线下的距离。关键是,现在我们的大部分方差只落在一个维度上。之前,我们的 x 和 y 值的范围是从-2 或-3 到 2 或 3。现在,“沿线距离”变量的范围从-4 到 4,但“线上或线下距离”的范围只有-1 到 1 左右。“上/下距离”变量中的信息较少,因此当我们实际拟合模型时,我们可能会选择单独使用“沿线距离”变量,而完全忽略“上/下距离”变量。
主成分分析概括了这一过程,并允许您对具有许多不同维度的数据集进行分析。它实际上创建了一组新的轴,旋转后第一个轴沿着数据中方差最大的线,第二个轴沿着方差第二大的线,依此类推。就像笛卡尔平面的普通 x 轴和 y 轴一样,新的轴将相互成直角,但它们将相对于您开始时的任何坐标旋转。这些新轴被称为数据集的“主成分”。只有两个变量,很容易想象这是什么样子:

我们的原始数据集和主要成分。每个分量的线的长度代表沿着该分量的变化量
但是对于任何数量的初始维度,原理都是一样的。通过只使用最初具有许多不同维度的数据集中的前几个主成分,即使模型一次只考虑很少的维度,也可以捕获原始数据集中的大部分差异。PCA 如何准确地找到这些适当旋转的新轴需要一些线性代数,这对这个场地来说有点技术性,但你仍然可以在没有复杂数学的情况下对引擎盖下发生的事情建立直觉。
请记住,当你遗漏了一个排名较低的主成分时,你仍然在丢失信息。在我们的例子中,并不是每个点都正好落在我们找到的线上,所以如果我们忽略线以上/线以下的变量,我们绝对会失去精度。但是因为主成分分析已经将数据中尽可能多的方差分组到一个维度中,所以与丢弃原始变量之一相比,丢弃第二个主成分会丢失更少的信息。
PCA 有多强大
为了让大家感受一下 PCA 有多有用,让我们来考虑一个最著名的机器学习训练数据集, MNIST 手写数字。如果您以前从未遇到过,这是一个巨大的手写数字示例集(训练集中有 60,000 行):

MNIST 集合中手写数字的例子
手写数字被数字化,并且数据被表示为 28×28 框中每个像素的一系列灰度值。所以这个数据集总共有 784 个维度!有这么多的维度,完全可视化数据集是不可能的。就此而言,在它上面使用某些模型类型是不可能的(或者至少是不切实际的)。支持向量机可能有效,但将 SVM 拟合到如此大规模、如此多维度的数据集需要花费大量时间。实际上,当您拥有如此大的多维数据集时,一些简单的模型也会变得很麻烦。KNN 模型根本不需要实时拟合(“模型”本质上只是训练数据集),但 KNN 模型可能需要很长时间来预测,因为当你向它提供新的数据点来考虑时,模型需要遍历所有训练点,以找到最接近新点的数据点。
有了 PCA,我们就不需要一次性考虑那么多维度了!事实证明,数据集中的大部分方差都在前几个主成分中进行了描述。想想看,你能从 MNIST 数据的前两个主要成分中看到多少:

来自 MNIST 数据集中的点,但沿着前两个主成分表示,并根据点所代表的数字进行颜色编码
当然,这个图有点乱,但是你已经可以开始在视觉上区分不同的数字:0 在右边,而 1 在左边。事实证明,只需少数几个主成分,您就可以获得相当高的准确率,即使是像 KNN 这样简单的模型也是如此:

如果你包括前 20 个主成分,一个简单的 KNN 模型(K 设置为 5)的准确率约为 97%,对于一个由 4 行代码解决的复杂机器视觉问题来说,这已经不错了!该模型的预测速度仍然比在完整原始数据集上训练的类似 KNN 模型快 100 倍左右。PCA 使我们能够将模型需要处理的维数从 784 个减少到 20 个,在精度方面牺牲很少,但在性能方面获得了巨大的提高。
基础知识:时间序列和季节分解
从头开始的数据科学
什么时候时间序列技术是合适的,你如何执行分解?
处理带时间戳的数据是数据科学最直观明显的用例之一。毕竟,我们可以收集的任何数据都必须从过去收集或代表过去,我们经常希望对未来遇到的未知情况做出预测,所以我们的模型可能以某种形式包含重要的时间成分是有道理的。时间序列模型不同于其他类型的预测模型,因为目标变量既是预测的对象(对于未来值)又是模型的输入特征(对于历史值)。
处理时间序列项目的第一步通常是可视化,然后将数据分解为趋势和周期成分。从那里,您可以开始处理更复杂的预测模型,尽管简单地分解序列本身就可以产生一些有价值的见解。本文将关注最简单的分解技术,经典的季节分解,但是即使这样也是非常有用的。
时间序列技术什么时候合适?
如今,大多数数据,尤其是程序生成的数据,都带有时间戳。每当填写并提交数字表单时,或者每当在线购物时,通常会记录并存储准确的时间。因此,许多数据集带有某种性质的时间元素,但这并不意味着这里讨论的时间序列技术一定是合适的。这些技术只有在目标变量中存在某种程度的自相关时才有意义,也就是说,当目标变量与早期的自身相关时。如果昨天、上个月或去年的值可以帮助您预测今天的值,那么这些时间序列技术是合适的。如果不是这样,他们就不会帮忙。
例如,考虑股票价格的日常变动,这是著名的随机。知道一只股票昨天上涨并不能真正告诉你这只股票今天是否可能上涨。例如,这里有一个日常股票价格变动的真实例子:

某一股票价格的每日变化。不太适合时间序列分析
问题中的公司实际上是苹果公司,但是你不能仅仅通过每天的运动来判断——像所有的股票一样,苹果公司每天都在以一种挑战预测的方式反弹。时间序列分析不会有帮助。
现在,让我们来考虑一下股票价格本身,而不是看每天的价格变动。与每天的变化不同,价格确实表现出自相关性。昨天的股价给了我一个很好的指示,告诉我今天的股价会是多少,因为在任何一天,股价的变化通常不会超过百分之一或百分之二。如果昨天的价格是 200 美元,我可以很肯定今天它会收在 190 美元到 210 美元之间,除非发生特殊事件。除了日复一日运动的表面噪音,价格本身呈现出一种趋势,表明时间序列分析可能是有用的:

苹果股票的实际价格。也许适合时间序列分析?
但是,股票价格本质上仍然是随机的,虽然根据你所做的分析,平滑这样的图表可能会有一些好处,但你将很难预测未来的价值。所以,让我们考虑最后一个与苹果相关的系列,每个季度全球售出的 iPhones 数量:

每个季度售出的 iPhones 数量。绝对适合时间序列分析
现在,这是一个我们可以利用的时间序列!请注意,它不仅展示了一个总体趋势,而且在趋势中还有可预测的周期——你会看到每年与苹果第一季度相对应的销售高峰(他们的会计年度从 10 月开始,所以他们的第一季度正在增加假期销售)。我们的时间序列技术的目标通常是找到并利用像这样的可预测模式,即使这些模式比 iPhone 销售的季节性模式更微妙、更难发现。
时间序列中的滚动平均值和趋势
在着手一个新的时间序列项目时,常见的第一步是用滚动平均之类的东西来平滑数据。这有两个主要好处。一个是真实世界的数据往往会有一点跳跃,即使有一个明确的潜在趋势,查看滚动平均线可以更容易地看出趋势是如何在噪声下移动的。第二,以这种或类似的方式寻找趋势是创建季节分解的第一步。让我们看一个真实的例子。这是一个常见的起始时间序列数据集,它显示了 50 年代美国每月的航空乘客人数:

航空旅行在 20 世纪 50 年代蓬勃发展
随着航空旅行从 40 年代后期相对罕见的奢侈品变成 60 年代更加普遍的体验,显然有一个向上的斜坡,但也明显有一个季节性模式,旅行在某些月份持续高于其他月份。月与月之间的差异让人很难看出这种增长到底有多快。我们可以通过考虑连续几个月一起考虑的滚动平均值来平滑每月的波动。因此,一个月中特别高或特别低的值将被滚动窗口中其他月份中不太极端的值所调和。考虑原始数据和六个月的滚动平均值:

我们的数据具有 6 个月的滚动平均值
滚动平均值在峰值时没有原始数据高,在低谷时也没有原始数据低。关于这个特殊的例子,你可能会注意到的一件事是,它似乎也没有和原始数据在完全相同的时间达到峰值和谷值。更确切地说,这个滚动平均值是一个跟踪平均值:构成某个月平均值的六个月是该月的时点和之前的五个月。或者,你可以考虑把你的窗口放在月份的中心。例如,您可以将月份本身、前两个月和后两个月视为一个 5 个月的窗口(这对于奇数个月来说效果更好),但要与数据的波峰和波谷重合,而不是滞后一个月左右:

比较等长但不同中心的滚动窗口
您可能已经看到,当您接近数据集的末尾时,这种策略有一个问题——您不能考虑还没有数据的未来一个月的平均值!在上面的例子中,居中的滚动平均在数据集结束前两个月停止,而跟踪平均一直到边缘。有一些方法可以解决这个问题——也许当你接近尾声,开始用完未来的几个月时,你开始考虑用更少的几个月来缩小差距——但这些方法可能并不令人满意。(当然,移动平均也有类似的问题,但是在系列的开始,如果你只是在数据集的第 2 个月或第 3 个月,你不能取过去 6 个月的平均。)
您也可以改变窗口的大小来调整平滑程度。随着窗口的增大,滚动平均值将变得越来越小:

比较不同大小的窗口
还有一些其他的方法来平滑时间序列和寻找趋势线,但它们往往是简单平均的变化。值得一提的一个常见方法是指数加权移动平均线(EWMA ),顾名思义,它对以前的周期进行平均,但对它们进行加权,以便最近的周期在平均值中占更大的比重。
古典季节分解
以这种方式创建平滑趋势线的一个用途是执行季节性分解,将原始数据分解为趋势的组成部分、与该趋势的周期性偏差以及剩余的任何残差。我们如何从平滑线到完全分解?请注意,当你增加滚动平均窗口的大小时,季节性波动的影响就消失了。如果您的滚动平均值考虑的窗口大小与您的季节性周期相同,它实际上是通过考虑周期中每个月的一个月来彻底清除季节性周期:

12 个月的滚动平均值不再有“季节”
我们正在寻找一个季节周期,它解释了原始数据和这个无季节滚动平均值之间的差异。有两种方法可以尝试计算这个季节性因素。第一种是作为附加模型。在这种方法中,我们将假设任何给定月份的真实值是该月的趋势值加上一个静态季节性值,该值在一年内逐月变化,但在连续几年的同一个月中大致保持不变,并留下一些(希望很小)误差。让我们从计算一个“去趋势化”序列开始:取我们的原始序列并从中减去趋势:

我们的反潮流系列。剧透:季节模式的幅度增长是一个不好的迹象
这个去趋势化的系列只向我们展示了季节周期以及我们数据集中的任何其他噪声。现在我们可以简单地逐个考虑周期内的每个月。一月的平均数据点是高于还是低于趋势多少?还是一般的二月?我们可以简单地采用逐月平均值来获得季节周期的近似值:

我们的季节性产品
像这样观察这些平均的季节性因素,你可以清楚地看到航空旅行是如何逐月变化的,夏季的旅行比冬季多得多。现在,我们可以将原始数据建模为由趋势和季节性成分组成:

将我们的潮流和季节性元素整合在一起
我们在绿线中的模拟数据并不可怕,但它显然有一个问题——它在最初几年一直超过,在后来几年一直低于。事实上,当我们绘制出去趋势化数据并看到季节性波动变得越来越极端时,我们可以预见到这个问题的出现。在这种情况下,有一个简单的解决办法,就是考虑分解时间序列的第二种方式,乘法模型。
乘法模型的工作原理与加法模型类似,只是在这种情况下,我们说任何给定月份的最终数据都是趋势值乘以的某个值,该值在一年中大致保持不变。加法模型显示“航班数量通常比 6 月份的趋势高 40,000”,而乘法模型显示“航班数量通常比 6 月份的趋势高 10%”。通过这种方式,乘法模型随着趋势的上升或下降而调整季节周期的大小。
计算乘法季节周期类似于计算加法季节周期,只是为了找到去趋势序列,我们将原始数据除以趋势:

乘法去趋势数列。注意,随着时间的推移,它的振幅不再增长
我们可以通过对该去趋势序列的每个月进行平均来找到每月的调整,然后将我们的数据建模为趋势乘以适当的季节性调整:

好多了!
您可能已经能够看出,以这种方式成功地分解时间序列集,关键取决于正确识别季节循环的周期。是一年一个周期吗?还是需要两年?还是只有 6 个月?通常有明确的日历周期—周到周、月到月或年到年—但根据您正在处理的数据类型,可能没有任何理由让它符合日历。选择一个不合适的时间段会使你的分解在功能上变得无用。
作为一个例子,假设您正在浏览一个数据集,就像我们一直在考虑的那样,但是您不知道它代表什么,也不假设它的平均年周期为 12 个月。如果选择 11 个月而不是 12 个月,会发生什么?嗯,起初事情似乎进展顺利。当你画出滚动平均值时,看起来你或多或少地去除了季节性:

11 个月的滚动平均值似乎工作得很好…
但是,当您执行剩余的步骤来分解这 11 个月的时间序列时,您很快就会发现有些地方不对劲:

嗯,作为模特,这不是很有帮助
这种季节性分解基本上是无用的,在平滑的趋势线上没有增加任何实际价值。如你所见,经典分解确实依赖于找到一个合理的周期值。
经典分解看起来很简单,从某种程度上来说,它是在 20 世纪 20 年代发展起来的,已经过时了。然而,希望你能看到,虽然它很简单,但它非常强大,能很好地模拟我们的数据。同样清楚的是,你如何扩展这种技术来开始预测未来的价值,画出几个月的趋势,并应用适当的每月调整。
同样值得记住的是它是如何捕捉时间序列过程的:尝试分离趋势,寻找可预测的模式并解释它们。然后,您可以寻找任何重大偏差的解释。有更复杂的方法来分离趋势,但它们基本上都必然会查看多个时间点,尝试从每日、每周或每月的变化中分离出趋势。还有更高级的方法来寻找去趋势数据中的可预测模式,包括考虑同时发生的不同时期的多个模式的方法,但原则上,它们的工作方式也大致相同。
在我关于时间序列的下一篇文章中,我将介绍一些更先进的方法,以及如何扩展它们来预测未来值。
泡泡里的篮球
没有主场优势,职业篮球比赛的结果会被改变吗?

汤米·布德罗在 Unsplash 上的照片
随着 NBA 赛季在奥兰多的泡沫中升温,有许多不确定因素。目前还不清楚 NBA 保护来自新型冠状病毒的球员和人员的措施是否足够。所有球队都将在一个地方比赛,没有现场观众,也没有真正的主场优势。作为一个通过处理生物数据学会欣赏统计学的人,我想把我在研究生院学到的技能应用到篮球上。
由于 NBA 赛季通常得分很高,有 82 场比赛,球队记录经常区分好队和差队。我一直认为,在决定主场优势方面,一支球队的技术比海拔或体育场内的球迷更重要。
毫无疑问,存在某种主场优势。NBA 球队在主场比赛时往往比在客场比赛时赢得更多。我想我应该采取一个简单的,更具探索性的方法来看看我是否能找出原因!通常,我专注于可视化和分析高维数据集,这是我第一次尝试分析篮球!
关于 NBA 主场优势没有太多的学术背景。尽管如此,我还是翻遍了文献。一项研究通过检查洛杉矶湖人队和洛杉矶快船队的比赛确定了主场优势[1]。作者发现,主场优势将赢得比赛的概率提高了 20%以上。然而,我认为这是令人困惑的,因为这些球队在同一个城市和同一个竞技场比赛。我不知道这一发现是否广泛适用于联盟的其他成员。
让我们概述一些我认为在主场优势中起主要或次要作用的因素。
- 海拔:丹佛的海拔比其他城市高得多,这迫使来访的玩家必须适应。这可能会使球员跑步和呼吸困难,影响他们的比赛能力。这是广播中经常提到的一个重要因素。为了纳入海拔,我只需要在谷歌地图上检查每个城市的海拔。
- 上座率:一场比赛的观众真的是 X 因素吗?我有点怀疑上座率会影响主场优势。首先,上座率高的球队往往表现得更好。此外,不同团队的平均出勤率没有太大差异。这个数据也很容易合并。我找到了 ESPN 过去三个赛季每个竞技场的平均上座率。之前的一项研究发现,增加出勤率对获胜概率的影响非常小[2]。
- 背靠背休息:这个就难衡量多了。与在客场相比,球员在家的旅行和休息时间可能会影响主场优势。我将暂时不讨论这个问题,因为我将进行一个简单的探索性分析。这在之前一项关注个人游戏结果的研究中有所暗示[3]。
- 总胜场数:这是一个简单的想法,更好的球队往往在主场比在客场赢的更多。总胜率也代表了 NBA 在一个赛季中的表现。这些数据,以及过去三年的主场胜利都被纳入了我的分析。
探索数据集
好了,现在我有了过去三季的数据集。我想确切地了解这些数据看起来如何,并对任何突出的趋势有一个大致的了解。当执行探索性分析时,一种方法是使用直方图。这着眼于你的变量的频率分布。除了海拔高度,其他变量呈正态分布。丹佛和犹他州是异常城市,但也混淆了其余的分析。这些球队在过去的三年里表现很好,所以如果海拔的影响很微妙的话,可能很难解开它的影响。

由作者在 R 中使用 hist 函数生成
探索数据中的相关性
可视化相关性的一个快速方法是使用 R 中 GGally 包中的 ggpairs 函数,选择包含我感兴趣的变量的列。
ggpairs(NBA_dataframe, columns = 3:6)
下面我们看到一个矩阵,告诉我们一些这方面的信息。它被组织在一个网格中,每个变量都与其他变量相对应。为了读懂这样的图表,比看起来容易多了!我们先从左上角开始。列标题显示主场胜利,行标题也显示主场胜利。由于这是同一个变量,它只是简单地描绘了一支球队在过去三个赛季中赢得一定数量比赛的频率。如果我们向下移动一格,我们仍然在主场获胜列的下面,但是现在这一行被标记为高度。我们看到一个散点图,其中 X 轴测量主场获胜,而 Y 轴测量 NBA 球队的海拔高度。我们可以用同样的方式阅读这些图表的其余部分。
当看图表的右上角时,我们看到一个数字。这种情况下的两个标题是平均上座率和主场胜率。这个数字告诉我们这两个变量之间的关联程度。如果它们强相关,相关值接近 1 或-1。

由作者在 R 中生成
有趣的是,主场胜利和总胜利之间有很强的相关性,而主场胜利和平均上座率之间有微弱但显著的相关性。一眼看去,我们看不到海拔影响的证据。数据告诉我们主场胜利的最佳预测是总胜率。很难断定海拔高度对主场优势有广泛的影响。
这些因素能在多大程度上衡量主场优势
接下来,我使用线性模型检查了这些变量的预测值。我插入不同的变量组合来观察预测是如何变化的。主场胜利的最佳模型包括仅使用总胜利和海拔作为预测因素,紧随其后的是仅使用总胜利。
最佳模型的 R 值,包括总胜场和高度,表明该模型解释了该数据中 89.37%的方差。此外,数据告诉我们,总胜场数是主场胜场数的最大预测因素,而海拔高度对可预测性的促进作用非常小。然而,在 41 场主场比赛中,海拔可能起了非常小的作用。

由作者在 R 中生成
这一切意味着什么?
从一个快速的探索性分析来看,当考虑到球队获胜时,没有任何证据表明存在广泛的主场优势。虽然海拔可能起很小的作用,但它并没有提供太多的预测价值。最好的球队在主场赢得更多只是因为他们比竞争对手更好。休息或旅行的日子很可能会适度影响主场优势。
我不认为在泡沫中比赛的球队会因为缺乏高度或人群相关因素而表现得比平时差。我也只研究了过去的三个季节,但是纳入更多的季节不太可能将海拔的预测值提高很多。如果我回来做更深入的分析,我必须控制过去几年改变比赛的节奏和三分球的增加。
参考文献
[1] Boudreaux,Christopher J .,Shane D. Sanders 和 Bhavneet Walia。"一个自然的实验来确定人群对主场优势的影响."体育经济学杂志18.7(2017):737–749。
[2] Kotecki,Jason,“估计主场优势对 NBA 胜利的影响”(2014)。荣誉项目。124.https://digitalcommons.iwu.edu/econ_honproj/124
T3
[3]恩廷,奥利弗 a .,和迪伦 S. Small。“休息在 NBA 主场优势中的作用。”体育定量分析杂志 4.2 (2008)。
速度与精度之战:单镜头与双镜头检测元架构——Allegro AI
现实世界中的数据科学
深度学习代码库系列的英雄之旅——IIA 部分
由 Gal Hyams 和 Dan Malowany
快板 AI 团队编写

用于目标检测任务的深度神经网络是一个成熟的研究领域。也就是说,在为目标用例构建给定模型时,在速度和准确性之间做出正确的权衡是一个持续的决策,团队需要在每个新的实现中解决这个问题。虽然多年来已经研究了许多对象检测模型,但是单次拍摄方法被认为是在速度与精度之间权衡的最佳点。在这篇文章(IIA 部分)中,我们解释了单镜头(SSD)和双镜头方法之间的主要区别。自发布以来,在最初的 SSD 上进行了许多改进。然而,为了清晰和简单起见,我们将重点放在了最初的 SSD 元架构上。在下面的帖子(IIB 部分)中,我们将向您展示如何利用预先训练的 Torchvision 特征提取器网络来构建您自己的 SSD 模型。
我们为什么需要这款固态硬盘?
在对象检测任务中,该模型旨在围绕图像中的期望类别以及每个对象标签绘制紧密的边界框。参见下面的图 1。

图 1:对象检测示例,VOC-2012 数据集
有两种常见的元方法来捕捉对象:双镜头和单镜头检测。
双镜头检测模型具有两个阶段:区域提议,然后对这些区域进行分类,并改进位置预测。单镜头检测跳过了区域提议阶段,并立即产生最终的定位和内容预测。更快-RCNN 变体是两次触发模式的常用选择,而单次触发多盒探测器(SSD)和 YOLO 是常用的单次触发方法。YOLO 架构虽然比固态硬盘快,但精确度较低。
R-FCN(基于区域的全卷积网络)是另一种流行的二次元架构,灵感来自 fast-RCNN。在这种方法中,区域提议网络(RPN)提议候选 ROI(感兴趣区域),然后将其应用于评分图上。所有可学习的层都是卷积的,并在整个图像上计算。在那里,几乎所有不同的建议区域的计算都是共享的。与快速 RCNN 相比,每个 RoI 的计算成本可以忽略不计。R-FCN 是单镜头和双镜头方法的混合体。当你真正了解它时,你会发现它实际上是一种两次尝试的方法,具有一些一次尝试的优点和缺点。
虽然双镜头检测模型实现了更好的性能,但是单镜头检测处于性能和速度/资源的最佳点。此外,SSD 训练速度更快,推理速度也比两次检测器更快。更快的培训使研究人员能够高效地进行原型制作和实验,而无需为云计算花费大量费用。更重要的是,当涉及到实时应用程序时,快速推理特性通常是一个需求。由于它涉及更少的计算,因此,每次预测消耗更少的能量。这种时间和能源效率为广泛的用途打开了新的大门,特别是在终端设备上,并使 SSD 成为许多用途的首选对象检测方法。
最近,分层去卷积方法,如去卷积 SSD (DSSD)和特征金字塔网络(FPN),已经成为任何对象检测架构的必要条件。原始架构之上的分层去卷积后缀使该模型能够在不同对象大小之间达到卓越的泛化性能,从而显著改善小对象检测。由于我们在这里的目的是详细说明一次和二次检测器之间的差异,以及如何轻松构建自己的 SSD,我们决定使用经典的 SSD 和 FasterRCNN。
单镜头物体检测和双镜头物体检测的比较

图 2:单触发检测器(SSD)和双触发检测器(更快的 RCNN,R-FCN)元架构的高层图[ 来源
更快-RCNN:
更快的 R-CNN 检测分两个阶段进行。第一阶段称为地区提案。图像由特征提取器(例如 ResNet50)处理,直到选定的中间网络层。然后,一个小的完全连接的网络滑过特征层,根据空间、比例和纵横比平铺的锚网格来预测类别不可知的框提议(图 3)。

图 3:faster CNN 通过一个小型全连接网络提议的感兴趣区域[ 来源
在第二阶段,这些盒建议用于从第一阶段已经计算的中间特征地图中裁剪特征。建议的盒子被馈送到特征提取器的剩余部分,该特征提取器用预测和回归头装饰,在这里为每个建议计算类和类特定的盒子改进。
尽管 fast-RCNN 通过在提议阶段和分类阶段之间共享特征图计算来避免重复计算,但是有一个计算必须在每个区域运行一次。因此,更快的 RCNN 运行时间取决于 RPN 提出的区域数量。
固态硬盘:

图 4:不同特征地图分辨率下的 SSD 锚点和预测 [来源]。
SSD 元体系结构在单次连续的网络传递中计算定位。与 Fast-RCNN 类似,SSD 算法在图像上设置一个锚点网格,平铺在空间、比例和纵横比框中(图 4)。与二次拍摄方法相反,该模型为连续网络过程中的每个框生成预测向量。这个向量保存每个类的置信度得分、本地化偏移量和调整大小。
类置信度得分指示该框中每个类实例的存在,而偏移和调整大小状态指示该框应该经历的变换,以便最好地捕捉它声称覆盖的对象。为了在不同的对象尺寸上获得良好的检测性能,预测是在几个特征图的分辨率上计算的。每个特征图都是从更高分辨率的前身的特征图中提取的,如下图 5 所示。
与 FasterRCNN 相比,多尺度计算使 SSD 能够在更高分辨率的特征地图中检测对象。FasterRCNN 在单个特征地图上进行检测,并且对特征地图分辨率和特征成熟度之间的权衡比较敏感。SSD 可以两全其美。在 512×512 的图像尺寸上,快速 CNN 检测通常在 32×32 像素特征图(conv5_3)上执行,而 SSD 预测从 64×64 特征图(conv4_3)开始,并在 32×32,16×16 上继续,一直到 1×1,总共 7 个特征图(当使用 VGG-16 特征提取器时)。
每个特征图的分离的分类器导致丢失小对象的不幸的 SSD 趋势。通常,模型在训练期间看不到每个类的足够小的实例。缩放增强缩小或放大训练图像,有助于解决这一泛化问题。另一方面,SSD 往往比 FasterRCNN 更准确地预测大型对象。图 4 示出了不同特征地图上的锚点预测。为什么 SSD 比 Faster-RCNN 快?

图 5: SSD 元架构和多特征图计算[ 来源】
为什么 SSD 比 Faster-RCNN 快?
从下面的图 6 中可以看出,单触发架构比双触发架构速度更快,但精度相当。单次方法实现其卓越效率的原因有两个:
- 区域提议网络和分类与定位计算被完全集成。这最大限度地减少了冗余计算。
- 单次拍摄对于图像中的任何数量的对象都是鲁棒的,并且其计算量仅基于锚的数量。然而,快速 RCNN 计算在每个区域重复执行,导致计算负荷随着 RPN 提出的区域数量而增加。这个数字受到一个超参数的限制,为了更好地执行,这个超参数被设置得足够高,从而导致大量的开销。R-FCN 只是部分地最小化了这种计算负荷。除了 SSD 固有的避免冗余计算的能力之外,图 6 显示了这种元架构成功利用了高效的特征提取器,如 MobileNet,并且在从这些类型的快速模型中获取信息时,明显优于双镜头架构。

图 6:对象检测元架构和特征提取器的速度精度[ 来源
为什么 SSD 不如 Faster-RCNN 准确?
焦损 论文调查了单镜头性能不佳的原因。毕竟,很难弄清楚为什么双摄方法毫不费力地占据了“最先进的宝座”。文章认为,这种差异在于训练过程中前景/背景的不平衡。
两级检测器很容易处理这种不平衡。RPN 缩小了候选对象位置的数量,过滤掉了大多数背景实例。在此基础上,采样试探法,如在线硬示例挖掘,为两阶段模型的第二阶段检测器提供平衡的前景/背景样本。相比之下,一阶段模型的检测层暴露于更大的候选对象位置集合,其中大多数是在训练期间密集覆盖空间位置、比例和纵横比的背景实例。虽然也可以应用两次分类器样本试探法,但是它们对于单次模型训练来说是低效的,因为训练过程仍然由容易分类的背景例子主导。焦点损失方法将训练损失集中在困难的实例上,这些实例往往是前景实例。通过这样做,它可以平衡不平衡的背景/前景比率,并将单次拍摄检测器引入对象检测模型精度名人堂。
那么结论是什么:单镜头还是双镜头?
很明显,以 SSD 为代表的单炮探测器相比双炮探测器,性价比更高。它们在有限的资源使用情况下实现了更好的性能。此外,当两种元架构都利用快速轻量级特征提取器时,SSD 优于双镜头模型。另一方面,当计算资源不是大问题时,二次检测器充分利用重特征提取器并提供更可靠的结果。关于这个问题的主要假设是,准确性的差异在于训练期间前景/背景的不平衡。利用聚焦损耗等技术可以帮助处理这种不平衡,甚至从精度的角度来看,单次检测器也是元架构的首选。
本系列的下一篇文章,IIB 部分,是一个教程代码,我们将使用这里获得的知识,并演示如何在 Torchvision 模型上实现 SSD 元架构。
原载于 2020 年 3 月 8 日https://allegro . ai。
邻里之战——在蒙特利尔开一家电影院
利用 follow 和 Foursquare APIs 获得 IBM 数据科学专业证书的顶点项目
我跟随 Coursera 的 IBM 数据科学专业证书,该专业证书由 9 门课程组成。有很多很好的例子。
最后一项任务是完成一个名为 Capstone project 的项目,该项目要求您利用 Foursquare APIs 从 API 调用中获取数据,并利用 follow map 库可视化数据分析。这是在这个项目中实践数据科学方法和工具集的一个很好的机会。
在这个项目中,我们将涵盖数据科学生命周期的所有阶段来解决问题。我们将深入研究数据科学中的以下工具/库:
- 叶库,包括 choropleth 地图,地图视图中的热图
- 用于树叶地图的蜂窝状网格
- 谷歌地理编码 API
- 四方 API
- k-均值聚类算法
- 水平条形图
- 熊猫,胖胖的,身材匀称
好了,我们开始吧。
简介:业务问题
在这个项目中,我们将寻找一个开设电影院的最佳地点。具体来说,这份报告可以为有兴趣在加拿大魁北克蒙特利尔开电影院的利益相关者提供参考。
蒙特利尔是加拿大第二大城市,也是魁北克省最大的城市,位于圣劳伦斯河与渥太华河的交汇处。它坐落在一个岛上。在这篇报道中,我们将关注蒙特利尔岛上的所有地区。蒙特利尔岛上有许多电影院,我们将推断现存的电影院在哪里。然后,我们将使用一个聚类模型来寻找岛上相似的区域,考虑每个行政区和区域的人口统计数据。首选区域应远离现有电影院。
我们将使用数据科学工具获取原始数据,将其可视化,然后根据上述标准生成几个最有希望的区域。同时,我们还将向候选人解释他们的优势和特点,以便利益相关者可以根据分析做出最终决定。
数据
根据我们问题的定义,可能影响我们决策的因素有:
- 人口统计信息,例如人口、密度、教育、年龄、收入
- 附近现有购物中心的数量
- 社区和附近现有电影院的数量
我们决定在整个蒙特利尔岛周围使用一个有规则间隔的位置网格来定义我们的社区。具体来说,我们将使用流行的六边形蜂窝来定义我们的邻域。
在这个项目中,我们将从以下数据源获取或提取数据:
- 2016 年蒙特利尔人口普查信息
- 六边形邻域的中心将通过算法生成,这些区域中心的近似地址将使用谷歌地理编码 API 获得
- 使用 Foursquare API 可以获得每个街区的购物中心和电影院的数据
- 将使用众所周知的蒙特利尔位置的谷歌地理编码 API 获得蒙特利尔中心的坐标
- 从 Carto 中获得蒙特利尔市 shapefile
蒙特利尔岛形状文件
为了在叶子地图中显示蒙特利尔岛的边界,我们需要一个蒙特利尔岛的 geojson 定义文件。我们从 Carto 网站下载了这个形状文件。
该文件为 JSON 格式,包含蒙特利尔岛每个行政区或自治市的边界定义。在下一步中,我们将使用一个叶子地图来可视化这个 geojson 定义文件。
薄层
*folium*建立在 Python 生态系统的数据优势和*leaflet.js*库的映射优势之上。用 Python 处理你的数据,然后通过*folium*在活页地图上可视化。
使用folium并不难,只需要几行代码就可以用边界数据显示蒙特利尔岛。
使用 geojson 定义在 follow 地图中显示蒙特利尔边界。

奥利佛地图中的蒙特利尔岛。
下一步,我们希望在地图中生成候选像元,更具体地说,只在蒙特利尔岛内。在处理与地图相关的问题时,通常使用蜂窝状六边形网格。与圆形不同,六边形之间没有间隔,确保没有遗漏区域。此外,任意两个相邻六边形之间的距离是相同的。
不幸的是,Folium 不提供在地图视图中绘制六边形的原生支持,我们必须编写一些代码来支持这一功能。
我们编写了一个方法,通过给定质心坐标和边长来计算六边形顶点的坐标。
获取六边形的顶点。
之后,我们在整个岛上生成一个蜂窝状六边形网格。
在蒙特利尔生成蜂窝状六边形网格。

在蒙特利尔地图上显示蜂窝状六边形网格。
看起来棒极了!😄
到目前为止,我们在岛上创建了一个蜂窝网格,并为每个六边形生成了中心坐标。我们将使用Google Geocoding API相应地反向查找地址。
谷歌地理编码 API
Google 地理编码 API 是一种提供地址地理编码和反向地理编码的服务。
使用这组 API 需要一个 Google API 密钥。可以从谷歌开发者控制台应用。
谷歌地理编码 API。
让我们将所有数据放在一个Pandas Dataframe中,并显示前 10 项。
每行包含一个六边形的中心地址和对应的经纬度,在 WGS84 球面坐标系中,X/Y列在 UTM 笛卡尔坐标系中,使用常用的公制单位——米或千米。

候选六边形的数据框架。
四方应用编程接口
Foursquare Places API 提供对 Foursquare 的全球数据库的实时访问,该数据库包含丰富的场所数据和用户内容,可在您的应用程序或网站中增强您基于位置的体验。
现在我们生成了蒙特利尔岛上所有的候选社区,我们将使用 Foursquare API 获取所有电影院的信息。
从 Foursquare API 文档中,我们可以在场馆类别中找到对应的电影院类别。Foursquare API 中电影院对应的 ID 是4bf58dd8d48988d17f941735,在艺术&娱乐主类别下。它包含几个子类别:
- 汽车影院,id:
56aa371be4b08b9a8d5734de - 独立电影院,id:
4bf58dd8d48988d17e941735 - 多路复用,id:
4bf58dd8d48988d180941735
不像到处都是咖啡店、餐馆,这个地区没有很多电影院,这也是有道理的,因为我们不期望每个社区都有电影院。
让我们先把蒙特利尔岛上所有的电影院都找来。为此,我们将获取每个行政区和自治市的电影院数据。
通过 Foursquare APIs 获取附近的电影院。
从 Foursquare APIs 的回应来看,蒙特利尔岛上一共有 44 家电影院。让我们在地图视图中绘制它。

蒙特利尔岛上的电影院。
让我们使用正电子风格在热图中显示它。

岛上电影院分布热图。
从热图上,我们可以看到电影院主要集中在市中心和岛的中心。通常,附近也有很多购物中心,让我们使用 Foursquare APIs 拉出蒙特利尔岛上的购物中心数据。
从 Foursquare API 文档来看,有几个类别与商场或购物中心有关。

我们将获取上述类别中的所有购物中心数据,并将它们与电影院数据一起显示在地图上。

蓝色的购物中心,红色的电影院。
从地图上看,我们可以看到电影院在大多数情况下都位于购物中心附近。
我们的目标区域附近应该有更多的购物中心和更少的电影院。
在此之前,我们需要根据某些信息对所有候选六边形进行聚类,在这个项目中,我们提取人口普查数据作为聚类的主要特征。
蒙特利尔人口普查信息
现在我们将获取蒙特利尔岛上每个行政区或自治市的人口普查信息。最新数据采集于 2016 年。我们可以从蒙特利尔市官网获取。
这是一个包含大量数据的相当大的 excel 文件,我修改了一些表格,以便更容易地将数据提取到熊猫数据框架中。
我们只关注几个基本的普查信息:Population、Density、Age、Education、Income。
将 excel 加载到 Pandas 数据框架中。

预处理后的普查数据框架
接下来,我们将在 choropleth 地图上显示人口普查数据分布。
一张 Choropleth 地图是一张由彩色多边形组成的地图。它用于表示一个量的空间变化。⁴
我们也在同一张地图上显示购物中心和电影院的位置。
在地图上显示人口普查信息。

各行政区的人口分布。

各区的密度分布。

按行政区划分的教育分布。

各区的年龄分布。

各区的收入分配。
从上面的 choropleth 地图,我们可以看到电影院大多位于人口较多的地区。购物中心的位置也是如此。此外,大多数电影院位于收入较低的地区。收入较高的地区购物中心和电影院较少。
到目前为止,我们检索了所有需要的原始数据,并对它们进行了可视化。在下面的步骤中,我们将操作这些数据集,提取数据,并为机器学习算法生成新的特征。最后,我们将在蒙特利尔岛上找到最适合开设电影院的地方。
方法学
这个项目的商业目的是在蒙特利尔岛上找一个合适的地方开一家电影院。
现在我们检索了以下数据:
- 蒙特利尔岛上所有电影院的数据
- 蒙特利尔岛上所有购物中心的数据
- 2016 年蒙特利尔各行政区的人口普查数据,具体而言,蒙特利尔岛内各行政区或自治市的人口、密度、年龄、教育和收入数据
- 蒙特利尔岛各行政区和自治市的边界数据
我们还生成了一个遍布整个蒙特利尔岛的蜂窝状六边形网格。
基于上述原始数据,我们将尝试相应地生成新的特征,例如每个候选小区的人口普查信息,以及本地和附近的电影院和商场的数量。
最后一步,我们将把重点放在购物中心多、电影院少的最有前景的地区。我们还将在地图视图中显示候选六边形像元,以便利益相关者做出最终决定。
分析
我们得到了每个自治区和直辖市的基本人口普查信息。我们希望获得每个候选六边形像元的人口普查信息,因此,我们根据与像元相交的区和自治市来计算这些人口普查信息。
如果一个六边形完全在一个区内,我们将使用该区的人口普查信息作为六边形的信息。因此,这意味着对于一个行政区内的所有六边形,我们将在人口普查要素中对它们一视同仁。
因此,如果一个六边形与两个区分别有 50%的交集,我们将从这两个区分别生成该六边形的 50%比率的普查数据。
基于这个规则,我们可以计算所有六边形的人口普查。
为每个六边形生成人口普查信息。
让我们将这个数据框与之前的位置数据框合并,生成一个新的:**candidates_df**包含每个六边形的基本信息。我们打印几行这个数据帧。
candidates_df.iloc[200:206]

六边形的普查信息
看起来不错。现在我们有了每个六边形区域的人口普查信息。
然后我们将计算每个六边形区域的购物中心和电影院的相关信息。
我们将计算购物中心和电影院的以下特征:
- 当前六边形单元内的购物中心和电影院的数量。
- 距离六边形单元中心 1 公里以内的商场和电影院的数量。
- 距离六边形小区中心 3 公里以内的多个商场和电影院。
为每个六边形生成电影院的数量。
现在我们准备好了我们需要的所有数据,我们可以使用 K-Means 聚类算法将相似的候选六边形区域分组到聚类中。
k 均值聚类
我们选取人口普查特征以及购物中心和电影院的数量作为输入特征。

选定的特征作为 K 均值聚类算法的输入参数
我们将首先运行一个评估步骤来选择最佳的**K**,这是算法中的类别数。
我们使用距离平方和和轮廓得分两种方法来评估针对不同**K**的 K-Means 算法。
距离平方和测量数据点与其指定的聚类质心之间的误差。越小意味着越好。
剪影评分也关注于最小化簇内距离的平方和,同时也试图最大化其邻域之间的距离。从它的定义来看,值越大,K 越好。

K-均值聚类的 K 选择
从图中,我们可以看到当 K 变大时Sum of Squared Distance下降。当 K=2,3 时,Silhouette Score较高,但当时上证指数仍然较高,我们选择K=10用于本项目,它是Sum of Squared Distance和Silhouette Score的平衡数。让我们用 k=10 再次运行 K 均值算法。
k=10 的 k 均值聚类算法。
让我们在地图视图中用不同的颜色显示聚类结果。

10 组候选六边形
让我们将所有内容放在一个地图视图上:
- 六边形的彩色簇
- 蓝点的购物中心
- 红点的电影院有黄色的环

有购物中心和电影院的集群
从上面的地图视图中的集群图,我们可以看到在市中心有一个由 4 个六边形组成的浅蓝色集群,在这个集群中有很多电影院和购物中心。
紫色集群包含有许多购物中心的区域。除了市中心组团外,浅绿色组团包含更多的购物中心和电影院。
让我们给所有三个电影院相关特征分配权重,并将它们组合成一个特征。商场也一样。便于整理。
我们将计算加权的Mall Score和加权的Cinema Score,然后生成一个新的Score特征用于排序。
最终得分越高,意味着商场越多,电影院越少。
为群集生成一个分数。

按分数对分类进行排序。
Cluster 7得分最高,它的商场多,电影院少。下面我们来探讨一下cluster 7的更多特点。

集群 7 的统计信息
Cluster 7有 40 个六边形平均每个地方有 0.77 个商场,每个地方有 0.0 个电影院。让我们使用 matplotlib.pyplot 库绘制所有聚类,以便在条形图中比较每个特性。我们突出显示了目标集群Cluster 7。
为集群绘制水平条形图。

聚类的特征比较
从柱状图中,我们可以看到星团 7 在所有星团中拥有最多的人口和密度。此外,它在 hexagon 地区或附近有相当多的购物中心和相对较少的电影院。
接下来,我们按照Score降序排列第 7 簇中的所有六边形,并挑选前 5 个六边形。他们将是我们开设电影院的首选位置。

根据以上统计信息,当地有 1~3 家商场,附近有更多商场,但 1 公里范围内没有电影院。看起来不错的选择。
让我们在地图视图中画出Cluster 7六边形,将其他的集群变灰,并突出显示我们的 5 个选项。

5 个最有希望的候选领域
我们的分析到此结束。我们已经找出了 5 个最有希望的区域,附近有更多的购物中心,电影院较少。每个区域都是正六边形,这在地图视图中很常见。与其他集群相比,集群中的区域具有最多的人口和密度。
结果和讨论
我们在整个蒙特利尔岛生成了六边形区域。我们根据包括人口、密度、年龄、教育和收入在内的人口普查数据信息将他们分为 10 类。运行聚类算法时,还会考虑购物中心信息和现有电影院信息。
从数据分析和可视化中,我们可以看到电影院通常都位于购物中心附近,这启发了我们找出购物中心多而电影院少的区域。
经过 K-Means 聚类机器学习算法,我们得到了附近商场最多,平均电影院较少的聚类。我们还发现了星团的其他特征。它显示该集群具有最多的人口和密度,这意味着所有集群中最高的流量。
该群集中有 40 个六边形区域,我们按照购物中心和电影院信息降序排列所有这些六边形区域,目标是覆盖本地小区或附近更多的购物中心和更少的电影院。
我们得出结论,5 个最有希望的六边形区域满足我们的所有条件。这些推荐区域将是进一步分析的良好起点。还可以考虑其他因素,例如实际交通数据和每个电影院、附近停车场的收入。它们将有助于找到更准确的结果。
结论
这个项目的目的是在蒙特利尔岛上找一块地方开电影院。
在从几个数据源获取数据并将其处理到一个干净的数据框架中之后,应用 K-Means 聚类算法,我们选择了平均购物中心较多而电影院较少的聚类。通过对聚类中的所有候选区域进行排序,我们得到了最有希望的 5 个区域,这些区域被利益相关者用作最终勘探的起点。
利益相关者将根据每个推荐区域的社区和位置的具体特征,并考虑每个位置的停车场、集群中现有电影院的交通以及它们的当前收入等其他因素,最终决定最佳电影院的位置。
密码
参考
- 【https://python-visualization.github.io/folium/
- https://developers . Google . com/maps/documentation/geocoding/start
- https://developer.foursquare.com/docs/places-api/
- https://plotly.com/python/choropleth-maps/
贝叶斯范式&岭回归
有联系吗?

照片来自 Adobe Stock Images
这篇文章讨论了经典的“岭回归”和贝叶斯推理之间的联系,以及在某些条件下正则化在一个频繁的上下文中如何类似于在贝叶斯上下文中指定先验。
背景和动机
岭回归(也称为 Tikhonov 正则化)是一种经典的正则化技术,广泛用于统计和机器学习。在其经典形式中,岭回归本质上是普通最小二乘(OLS)线性回归,在风险函数中嵌入了可调的附加 L2 范数惩罚项。岭回归的发明最初是为了解决不适定的最小二乘问题,该问题在设计矩阵 X 的协变量中具有严重或完美的共线性(使矩阵从 X 的转置和自身的内积中变得严重不稳定或不可逆)。岭回归的实现“正则化”了所提到的不可逆矩阵,将其调整为可逆的,并为类似于 OLS 的参数估计提供了封闭形式的解决方案。
然而,在现代,岭回归最普遍地被用作统计学习和机器学习中经验风险最小化的通用工具;即,为了极大地减少用于预测的所述统计估计量的方差(从而提高效率),有目的地指定有偏统计估计量。
请注意,术语“岭惩罚”现在经常用于指在大多数统计模型(例如:逻辑回归、神经网络等)的风险函数中嵌入 L2 惩罚。然而,在本文中,我们使用的术语“岭回归”特指其经典定义(具有可调附加 L2 范数惩罚的 OLS)。
原来在经典的岭回归和贝叶斯推断之间是有联系的。一个我觉得有趣又有见地的。让我们首先从频率主义者的角度来探讨岭回归,然后提出一个具有一组特定条件的贝叶斯推断问题,并看看这两者是如何联系在一起的。
岭回归——频率主义范式:
假设我们有一个加性线性模型(其中真正的函数形式是加性线性的):

我们正从一个频率主义者的范例开始工作,即β参数实际上是固定的。我们希望恢复β参数的估计值。然而,让我们假设我们在设计矩阵 X 中具有完美的共线性,或者我们对统计学习或机器学习问题感兴趣,并希望出于经验风险最小化的目的有目的地引入正则化。让我们指定岭回归的风险函数:

如上所示,我们有一个类似于 OLS 风险函数的东西,但是增加了一个附加项。让我们扩展一下:

为了求解岭估计量,我们有:

对于那些熟悉 OLS 估计量的人来说,你可以看到上面的岭估计量非常相似。一个区别是可调参数λ。在这种情况下,lambda 从 X 的转置和自身的内积中“正则化”矩阵,迫使其可逆。对于那些想要推导和深入研究 OLS 估计量、高斯马尔可夫定理以及在不同条件下所需的假设的人,请参见我在此发表的文章。
线性回归——贝叶斯范式:
假设我们有一个加性线性模型(其中真正的函数形式是加性线性的):

但是现在,我们从贝叶斯范式开始工作;事实上,我们不再认为β参数是固定的,而是随机变量。我们希望我们的模型符合数据,但需要指定一组β参数的先验。现在让我们考虑:

现在让我们求解后验分布:

请注意,在上面的术语中,分母只是一个归一化常数。我们可以考虑上面的后验分布的核:

根据上面的表达式,我们可以计算后验分布的模式,或最大后验概率(MAP)估计:

我们已经证明,在一定条件下,贝叶斯回归等价于频率主义范式下的岭回归。在某种意义上,我们可以把频率主义范式中的正则化看作是在某种程度上类似于在贝叶斯范式中指定先验的功能。
总结和最后的想法
希望以上有见地。正如我在以前的一些文章中提到的,我认为没有足够的人花时间去做这些类型的练习。对我来说,这种基于理论的洞察力让我在实践中更容易使用方法。我个人的目标是鼓励该领域的其他人采取类似的方法。我打算在未来写一些基础作品,所以请随时在【LinkedIn】和 上与我联系,并在 Medium 上关注我的更新!
贝叶斯优化的美妙之处,用简单的术语解释

来源: Unsplash
巧妙算法背后的直觉
这里有一个函数: f ( x )。计算起来很贵,不一定是一个解析表达式,也不知道它的导数。
你的任务是:找到全局最小值。
这肯定是一项困难的任务,比机器学习中的其他优化问题更困难。例如,梯度下降法可以访问函数的导数,并利用数学捷径来加快表达式求值。
或者,在一些优化场景中,函数的评估成本很低。如果我们可以在几秒钟内获得数百个输入变量 x 的结果,那么可以使用简单的网格搜索,并获得良好的结果。
或者,可以使用一整套非常规非梯度优化方法,如粒子群集或模拟退火。
可惜现在的任务没有这些奢侈品。我们的优化受到几个方面的限制,特别是:
- 算起来很贵。理想情况下,我们应该能够对函数进行足够的查询,以便从本质上复制它,但是我们的优化方法必须在有限的输入采样下工作。
- 导数未知。这就是为什么梯度下降及其风格仍然是深度学习最受欢迎的方法,有时也是其他机器学习算法中最受欢迎的方法。知道导数给了优化器方向感——我们没有这个。
- 我们需要找到全局最小值,即使对于像梯度下降这样复杂的方法,这也是一个困难的任务。我们的模型需要某种机制来避免陷入局部最小值。
解决方案:贝叶斯优化,它提供了一个优雅的框架来处理类似于所描述的场景的问题,以最少的步骤找到全局最小值。
让我们构造一个函数 c ( x )的假设例子,或者给定一些输入的模型的成本 x 。当然,函数的样子对优化器来说是隐藏的;这就是 c ( x )的真实形状。这在行话中被称为“目标函数”。

贝叶斯优化通过一种称为代理优化的方法来完成这项任务。对于上下文,代理母亲是同意为另一个人生育孩子的女性——在上下文中,代理函数是目标函数的近似。
基于采样点形成代理函数。

基于代理函数,我们可以识别哪些点是有希望的最小值。我们决定从这些有希望的区域中采样更多的样本,并相应地更新代理函数。

每次迭代,我们继续查看当前的代理函数,通过采样了解更多感兴趣的领域,并更新函数。注意,替代函数将以评估成本低得多的方式进行数学表达(例如,*y*=*x*是更高成本函数的近似值,*y=*arcsin((1-cos²*x*)/sin *x*)在一定范围内)。
经过一定次数的迭代后,我们注定会达到一个全局最小值,除非函数的形状非常怪异(因为它有很大且疯狂的上下波动),这时应该问一个比优化更好的问题:你的数据有什么问题?
花点时间惊叹这种方法的美妙之处。它不对函数做任何假设(除了它首先是可优化的),不需要关于导数的信息,并且能够通过巧妙使用不断更新的近似函数来使用常识推理。我们最初的目标函数的昂贵的评价根本不是问题。
这是一种基于代理的优化方法。那么到底是什么让它成为贝叶斯的呢?
贝叶斯统计和建模的本质是根据新信息更新先前(先前)的信念,以产生更新的后验(“后”)信念。这正是代理优化在这种情况下所做的,所以它可以通过贝叶斯系统、公式和想法来最好地表示。
让我们更仔细地看看代理函数,它通常由高斯过程表示,可以认为是掷骰子,返回符合给定数据点(如 sin、log)的函数,而不是数字 1 到 6。该过程返回几个函数,这些函数都带有概率。

左图:四个数据点的几个高斯过程生成函数。右图:聚合的函数。来源:奥斯卡 Knagg ,图片免费分享。
Oscar Knagg 的这篇文章对 GPs 如何工作给出了很好的直觉。
有一个很好的理由为什么高斯过程,而不是一些其他的曲线拟合方法,被用来模拟代理函数:它是贝叶斯本质。GP 是一个概率分布,就像一个事件的最终结果的分布(例如,1/2 的机会掷硬币),但是在所有可能的函数上。
例如,我们可以将当前数据集定义为 40%可由函数 a ( x )表示,10%可由函数 b ( x )表示,等等。通过将替代函数表示为概率分布,它可以通过固有的概率贝叶斯过程用新信息更新。也许当引入新信息时,函数 a ( x )只能表示 20%的数据。这些变化由贝叶斯公式控制。
比方说,用多项式回归拟合新的数据点,这将是困难的,甚至是不可能的。
代理函数——表示为概率分布,先验——用“获取函数”更新。在探索和开发的权衡中,该功能负责驱动新的测试点的提议:
- 利用寻求在替代模型预测有良好目标的地方进行采样。这是利用已知的有希望的地点。然而,如果我们已经对某个区域进行了足够的探索,那么继续利用已知的信息将会收效甚微。
- 勘探寻求在不确定性高的地方取样。这确保了空间中没有一个主要区域是未被探索的——全局最小值可能碰巧就在那里。
鼓励过多开发和过少探索的获取函数将导致模型只停留在它首先找到的最小值(通常是局部的——“只去有光的地方”)。首先,一个鼓励对立面的获取函数不会停留在局部或全局的最小值。在微妙的平衡中产生好的结果。
获取函数,我们将把它表示为 a ( x ),必须同时考虑开采和勘探。常见的获取函数包括预期改善和最大改善概率,所有这些都是在给定先验信息(高斯过程)的情况下,测量特定输入在未来可能产生回报的概率。
让我们把这些碎片拼在一起。贝叶斯优化可以这样执行:
- 初始化高斯过程“代理函数”先验分布。
- 选择几个数据点 x ,使得对当前先验分布进行操作的采集函数 a ( x )最大化。
- 评估目标成本函数 c ( x )中的数据点 x 并获得结果, y 。
- 用新数据更新高斯过程先验分布以产生后验分布(它将成为下一步中的先验)。
- 重复步骤 2–5,进行多次迭代。
- 解释当前的高斯过程分布(这样做很便宜)以找到全局最小值。
贝叶斯优化就是把概率的想法放在代理优化的想法后面。这两个想法的结合创造了一个具有许多应用的强大系统,从药物产品开发到自动驾驶汽车。
然而,在机器学习中最常见的是,贝叶斯优化用于超参数优化。例如,如果我们正在训练一个梯度推进分类器,有几十个参数,从学习率到最大深度到最小杂质分裂值。在这种情况下, x 表示模型的超参数, c ( x )表示模型的性能,给定超参数 x.
使用贝叶斯优化的主要动机是在评估输出非常昂贵的情况下。首先,需要用这些参数构建一个完整的树集合,其次,它们需要运行几次预测,这对集合来说是昂贵的。
可以说,对于给定的一组参数,神经网络评估损失更快:简单地重复矩阵乘法,这非常快,尤其是在专用硬件上。这是使用梯度下降的原因之一,梯度下降会进行重复查询以了解它的去向。
总而言之:
- 代理优化使用代理或近似函数,通过采样来估计目标函数。
- 贝叶斯优化通过将代理函数表示为概率分布,将代理优化置于概率框架中,概率分布可以根据新信息进行更新。
- 获取函数用于评估探索空间中某一点将产生“良好”回报的概率,给出当前已知的先验知识,平衡探索与开发。
- 当目标函数的评估成本很高时,主要使用贝叶斯优化,通常用于超参数调整。(这个有很多像 HyperOpt 这样的库。)
感谢阅读!
用混乱来寻找清晰
towardsdatascience.com](/monte-carlo-methods-made-simple-91758ba58dde)
除非另有说明,所有图片均由作者创作。
贝克德尔测试:分析好莱坞的性别差异
使用数据分析技术可视化好莱坞的性别不平等
什么是贝氏测验?
贝克德尔测试是以漫画家艾莉森·贝克德尔的名字命名的,她在 1985 年的一个连环漫画中提出了这个想法。要通过测试,故事需要具备:
- 至少两个女人
- 女人们需要互相交流
- 他们需要彼此谈论除了男人以外的东西

我第一次听说 Bechdel 测试是在看《简·处女》的时候,它引起了我的兴趣。对我来说,测试的标准似乎太低了,电影应该很容易通过。
然而,一个简单的谷歌搜索告诉我不是这样。显然,有大量的电影没有满足通过 Bechdel 测试的要求,包括:
- 贫民窟的百万富翁
- 弱点
- 泰山
- 《模仿游戏》
- 社交网络
读了一些关于 Bechdel 考试的资料后,我受到了启发。我决定对电影数据集进行数据分析,以检查它们是否通过了测试!
数据问题
我的目的是从各种不同的来源收集数据,并回答以下关于 Bechdel 测试的问题:
- 这些年电影的 Bechdel 分数有提高吗?
- IMDB 评分越高的电影,Bechdel 评分就越高吗?
- 有女导演的电影是不是 Bechdel 分数更高?
- 一部电影的预算对其 Bechdel 评分有影响吗?
- Bechdel 分数较高的电影会产生较大的收入吗?
数据收集
我从三个不同的来源收集数据:bechdeltest.com、卡格尔和这个电影数据集。
数据分析
我将使用 Python 来执行所有的数据分析和可视化。
首先,我使用了来自 bechdeltest.com 的数据,因为他们的 API 很容易获取。
# imports
import urllib, json
import pandas as pddf = pd.read_json('[http://bechdeltest.com/api/v1/getAllMovies'](http://bechdeltest.com/api/v1/getAllMovies'))
现在,我将看看数据帧的头部:
df.head()

作者图片
数据框中有五个变量:
- 评分:电影的 Bechdel 评分从 0 到 3。Bechdel 分数低于 3 表示电影没有通过 Bechdel 测试,Bechdel 分数为 3 表示电影通过。
- imdbid:电影的 IMDB 编号
- 标题:电影标题
- id:唯一的电影 ID
- 年份:电影上映的年份
看一下“年份”一栏,你可以看到有 19 世纪的电影,其中很多电影的贝克德尔分数为 0。
我将为 1967 年以后发行的电影创建一个新的数据框,并将在我的其余分析中使用这个新的数据框。
dfNew = df[df['year']>=1967]
看看新的数据框:
dfNew.head()

作者图片
我现在将把列“rating”重命名为“Bechdel Score ”,以便于后面的分析。
dfNew.rename(columns={'rating':'Bechdel Score'}, inplace=True)
现在,我将把“year”列转换成 datetime 对象。
dfNew['year'] = pd.to_datetime(dfNew['year'], format='%Y')
接下来,我将把 Bechdel 分数改为分类变量。
dfNew['Bechdel Score'] = dfNew['Bechdel Score'].astype('category',copy=False)
最后,数据准备好了,可以用来做一些数据可视化。
我将首先使用 Seaborn 创建一个计数图,以可视化 Bechdel 分数。
sns.countplot(x='Bechdel Score',data=dfNew)

作者图片
1967 年以后的大部分电影看起来都有更高的 Bechdel 分数,但是他们通过 Bechdel 测试了吗?
li = []
for i in dfNew['Bechdel Score']:
if(i<3):
li.append(0)
else:
li.append(1)
dfNew['pass_test'] = li
dfNew

作者图片
现在有一个数据帧叫做 pass test,所有通过 Bechdel 测试的电影取值为 1,没有通过的电影取值为 0。
我将使用 Seaborn 来可视化这个。
sns.countplot(x='pass_test',data=dfNew)

作者图片
自 1967 年以来,通过贝克德尔测试的电影比没有通过测试的电影多。
然而,这种差异并不像我预期的那样显著。似乎仍然有非常多的电影没有通过测试。
现在,我将看看 Bechdel 分数如何随时间变化。
女性在电影业的代表性有所提高吗?事情还是一样吗?他们恶化了吗?
为此,我将使用 Plotnine 库。
from plotnine import *(ggplot(dfNew)+geom_point(aes('year',color=dfNew['Bechdel Score']),stat='count',show_legend=False)+geom_line(aes('year',color=dfNew['Bechdel Score']),stat='count',show_legend=False))

作者图片
在 20 世纪 70 年代和 80 年代,有几部电影通过了贝克德尔测试。在这段时间里,通过测试的电影和没有通过测试的电影没有明显的区别。
在 20 世纪 80 年代和 90 年代之后的几年里,通过贝克德尔测试的电影数量激增,进入 21 世纪后,情况有了很大改善。
现在,我想形象化 IMDB 评级和 Bechdel 分数之间的关系。是 Bechdel 分数越高的电影更有可能获得更高的 IMDB 评分,还是相反?
为此,我将使用名为 movies.csv 的不同数据集,并将其与现有数据框合并。
imdb = pd.read_csv('movies.csv')
imdbNew = imdb[['title','rating']]dfNew = pd.merge(dfNew, imdbNew, how='left', left_on=['title'], right_on=['title'])dfNew.head()

作者图片
数据帧中的“分级”栏代表 IMBD 电影的分级。该列有几个空值,这些行将被删除。
然后,我将创建一个只有年份、Bechdel 分数和 IMDB 评级的新数据框,这样我就可以直观地看到这三者之间的关系。
# Dropping rows with null values:
dfNew = dfNew.dropna()dfNew = dfNew.drop('id',axis=1)# Creating a new dataframe with only year, Bechdel scores, and imdb rating:
new = dfNew.groupby(['year','Bechdel Score']).agg({'rating':'mean'}).reset_index()new.head()

作者图片
完美!现在,我将想象这种关系:
# Plot year against IMDB rating and Bechdel Score:ggplot(new,aes(x='year',y='rating',color='Bechdel Score'))+ geom_point()+geom_smooth()+scale_y_continuous(name="imdb rating")+labs( colour='Bechdel Score' )

作者图片
看起来似乎通过 Bechdel 测试的电影比没有通过测试的电影的 IMDB 评分低得多,这让我很惊讶。
现在,我将试着形象化导演的性别和 Bechdel 分数之间的关系。我假设有女性导演的电影更有可能有更高的 Bechdel 分数,我将在这里尝试绘制。
为此,我将使用来自 Kaggle 的不同电影数据集。然后,我将使用性别预测库根据导演的名字来预测导演的性别,并将其与之前的数据帧合并。
import gender_guesser.detector as gen
latest = pd.read_csv('movielatest.csv',encoding = "latin")dfLatest = latest[['name','director']]
dfLatest.rename(columns={'name':'title'}, inplace=True)
dfLatest = pd.merge(dfNew, dfLatest, how='left', left_on=['title'], right_on=['title'])dfLatest = dfLatest.dropna()
dfLatest.head()

作者图片
新创建的数据框中现在有一个额外的变量;导演。现在,我将尝试根据名字预测导演的性别,并将其附加到数据框中。
# Predicting gender of director from first name:d = gen.Detector()
genders = []
firstNames = dfLatest['director'].str.split().str.get(0)
for i in firstNames[0:len(firstNames)]:
if d.get_gender(i) == 'male':
genders.append('male')
elif d.get_gender(i) == 'female':
genders.append('female')
else:
genders.append('unknown')
dfLatest['gender'] = genders
dfLatest = dfLatest[dfLatest['gender'] != 'unknown']# Encode the variable gender into a new dataframe:
dfLatest['Male'] = dfLatest['gender'].map( {'male':1, 'female':0} )dfLatest.head()

作者图片
数据帧有两个附加变量;性别和男性。性别代表导演的性别。如果导演是男性,变量 male 的值为 1,如果导演是女性,变量 male 的值为 0。
现在我有了这些信息,我将继续想象数据中更多的趋势。
我将创建一个变量性别的计数图,以直观显示数据集中男性与女性的数量:
sns.countplot(x='gender',data=dfLatest)

作者图片
似乎数据集中几乎所有的电影都有男性导演。这也是我预料到的事情,因为众所周知,好莱坞雇佣的女导演非常少。
接下来我会用 Bechdel 评分来可视化导演的性别,看看有女导演的电影是不是评分更高。
sns.countplot(x='Bechdel Score',hue='gender',data=dfLatest)

作者图片
ggplot(aes(x = 'year', y = 'Bechdel Score',color='gender'), data = dfLatest)+geom_point()

作者图片
几乎所有有女导演的电影似乎都通过了贝克德尔测试!
接下来,我将看看可变预算,看看电影的预算和它的 Bechdel 分数之间是否有某种相关性。
dfLatest['budget']=latest['budget']ggplot(aes(x='year', y='budget',color='Bechdel Score'), data = dfLatest)+geom_point()+geom_smooth()

作者图片
这里可以看到的一件事是,随着时间的推移,一部电影的预算显著增加。此外,通过贝克德尔测试的电影似乎比得分为零的电影预算略高,但在这里没有观察到强相关性。
现在,我将设想预算和主管性别之间的关系:
ggplot(aes(x = 'year', y = 'budget',color='gender'), data = dfLatest)+geom_point()+geom_smooth()

作者图片
导演的性别似乎对电影的预算没有任何关系或影响。
将电影预算、贝克德尔分数和导演性别之间的关系可视化:
sns.violinplot(x='Bechdel Score',y='budget',hue='Male',data=dfLatest)

作者图片
接下来,我将想象一部电影的类型和贝克德尔分数,以及任何随时间的变化。
dfLatest['genre'] = latest['genre']
ggplot(aes(x = 'year', y = 'genre',color='Bechdel Score'), data = dfLatest)+geom_point()

作者图片
最后,我将看看电影票房,以及年份、Bechdel 分数和性别:
dfLatest['gross'] = latest['gross']# Movie grossing with Bechdel score and gender:
sns.violinplot(x='Bechdel Score',y='gross',hue='Male',data=dfLatest)

作者图片
# Movie grossing with year and gender:ggplot(aes(x = 'year', y = 'gross',color='gender'), data = dfLatest)+geom_point()

作者图片
就是这样!我设法将各种关系可视化,并回答了我着手寻找答案的所有数据问题。
一些有趣的数据发现包括:
- 没有通过 Bechdel 测试的电影往往有更高的 IMDB 评级。
- 这些年来,越来越多的电影通过了贝克德尔测试。
- 有女导演的电影,Bechdel 分更高。
- 一部电影的预算或收入与其 Bechdel 评分之间没有明显的相关性。
当然,这个分析仅仅是根据我从三个地方收集的数据进行的,可能并不能代表电影的全部。
此外,可能还有其他变量会影响此分析的结果,在得出结论之前,用其他地方的数据进行实验可能是个好主意。
最后,我想提一下,Bechdel 测试不一定是衡量电影中女性代表性的最佳基准。它没有考虑女性角色写得有多好,也没有衡量角色有意义的深度。
然而,这是用来揭露性别偏见的最著名的指标之一,也是我们拥有这类数据的唯一测试。
数据集和完整的代码可以在这里找到。
神经网络术语词汇表
深度学习术语的简短浏览

照片由 Aaron Burden 在 Unsplash
O 对于数据科学和深度学习的新手来说,最大的障碍之一是即使是最入门的课程也有大量的术语。该领域有一个陡峭的学习曲线,因为大多数概念是相互交织和互补的。更糟糕的是,大多数新人几乎没有机器学习背景,这使得任务更加困难。在本文中,我将按顺序分解 field 的一些最重要的概念,将每个新术语与最后一个术语联系起来。
让我们从…的定义开始

围绕“深度学习”的术语层级
智力:迄今为止,智力还没有一个公认的定义。这个定义是一个正在进行的辩论,它跨越了广泛的领域和学科,如哲学、心理学、社会学和计算机科学。然而,尽管没有广泛接受的定义,科学几十年来一直试图模仿智能,创造…
人工智能(AI): 计算机科学中研究机器“智能行为”的领域。换句话说,系统以不可预测的方式运行。对自身和周围世界做出反应和(似乎)推理的系统。这个定义是模糊的,因为我们甚至不能正确地定义智力。然而,我们可以定义的东西是学习,它把我们带到…
机器学习(ML): 向算法显示问题的输入和输出,并让它学习如何解决问题的任务。例如,创建一种算法,通过向它展示数百张宠物照片来识别照片中的狗和猫。在 ML 内部,一种不断发展的方法是:
深度学习(DL): 将多个学习算法叠加起来共同解决一个困难任务的思想。当我们是孩子的时候,我们学习字母表,然后我们学习阅读简单的单词,然后是完整的句子,等等。有了实践,我们就在看书,形成观点。在字母和流利之间,涉及几个学习步骤。在模仿中,深度学习算法通过将任务分解为连续的问题来进行学习,每个问题都建立了一个更高的抽象水平。
在实践中,DL 和 ML 算法经常是选择的工具…
数据科学(DS): 对数据的研究,如获取、清理、存储、查看和处理数据。一个常见的误解是,DL 和 DS 是一样的东西,因为许多 DS 课程突出了 DL。ML 和 DL 是数据科学家的工具,SQL、NumPy 和等也是如此。
数据工程、数据分析、数据分析、认知计算:这个领域充满了鲜为人知的同义词和令人困惑的术语。有些似乎只是为了听起来新鲜而存在,有些则是为了引用 DS 中的特定任务。例如,“分析”通常是指探索性的分析,而“工程”是指为生产用途实现系统。每当有疑问时,坚持使用广泛使用的术语,例如“数据科学”。

一个样本全连接神经网络。用 NN-SVG 工具构建的可视化。
人工神经网络(NN): 在实现深度学习的几种方法中,神经网络是迄今为止最受欢迎的。简而言之,它们是一堆简单的学习算法(称为层),依次处理输入,产生输出。这体现了通过设计进行深度学习的思想,因为每一层都学习对输入的更精确的理解。
网络层:所有的神经网络都是由层组成的(如上图所示)。层定义了一个操作,它接受一些输入、一些参数,并产生一组输出。例如……
密集层:是接收一个矢量(输入)并将其乘以一个矩阵(参数),产生另一个矢量(输出)的层。虽然这是实践中最广泛使用的层之一,但它有一个问题,那就是:
线性:当一个事物可以分解成独立的部分时,它就是线性的,这使得它们易于研究。然而,一个线性系统并不比组成它的部件更有趣。“A+B”并不比“A”和“B”本身更有趣。这遭到了以下人士的反对:
非线性:当一个系统的各个部分交织成一个复杂的整体时,这个系统就是非线性的。非线性系统不容易分解。因此,整体大于部分之和。例如,“正弦(A + B)”不能分解为“A”项和“B”项。幸运的是,任何线性系统都可以通过一种方法变成非线性的
激活功能:这些是在 DL 中使用的普通非线性功能,其唯一目的是接收输入并使其非线性。在上面的例子中,我们通过使用正弦函数使“A + B”非线性。在 DL 中,最著名的激活函数是:
ReLU: 缺整流线性单位,定义为 ReLU(x) = max(0,x)。这是制作非线性的最简单(也是最有效)的方法之一。这就是它如此受欢迎的原因:它简单快捷。结合密集层和 ReLU 激活,我们可以建立一个…
密集网络/全连接网络/多层感知器:这些都是基本神经网络的同义词:交织着激活函数的密集层的集合。需要强调的是,如果没有激活功能,网络就不会比单一的致密层更有趣。非线性是一种粘合剂,它能从普通零件中创造出强大的模型。
在神经网络的同义词中,有一个具有历史意义…
感知器模型:1958 年, Frank Rosenblatt 创造了一个神经元的计算模型:感知器,它是后来大多数事物的基础。简单地说,感知器是一个加权和,后面跟着一个激活函数。形式上,P(x;w) = a(x ⋅ w)。这意味着感知器接收一个“x”向量,拥有一组权重“w”,而计算x 与“w”的点积(加权和),并将其馈送给激活函数“a”。
密集层(重访):如果一个输入被一次馈送到许多感知器,如上图所示,我们可以通过将每个感知器的权重“连接”为一个矩阵来简化数学,创建密集层:D(x;W) = a(x ⋅ W)。使用这个定义,我们可以通过将一个密集层的结果输入到另一个密集层来构建一个两层网络,比如:D(D(x;w₁);W₂) = a(a(x ⋅ W₁)⋅W₂).这展示了一个重要的概念:神经网络只是数学函数。
在这个表达中,我们还没有注意到的是…
权重:机器学习模型定义了一个由一组“权重”引导的“操作”。通过改变模型的权重,我们能够让它做不同的事情。例如,我们可以训练同一个网络来识别猫和狗或者鸟和鱼。改变的是权重,而不是网络。这就把我们带到了…

通过提高权重使算法学习的过程
训练:实际的“学习”是由训练循环执行的。简而言之,训练意味着向模型提供输入,收集其输出,将它们与预期输出进行比较,并改变权重以校正输出。这个过程的主要组成部分是…
损失函数:损失或误差是一个度量模型“错误性”的函数。实际上,我们想要的只是减少模型的损失。换句话说,我们希望它们尽可能正确。为了实现这一点,我们使用一种数学工具,称为…
梯度下降:给定一个模型“M”,它的权重“θ”,输入“x”,期望输出“y”和一个损失函数“L”,我们可以通过考虑“L(y,M(x;θ))”,被称为“∇L".这个“∇L”表示损耗如何随着θ的变化而变化。因此,为了减少损失,我们从θ中减去∇L。这一过程创造了一个“改进的θ”。如果我们一遍又一遍地重复这个过程,我们会得到…
纪元:每次我们用我们拥有的每一个数据例子来训练我们的模型,我们就完成了一个“纪元”。模型通常被训练几十到几百个时期,直到它们的损失减少到很小的值。
反向传播:如果你不熟悉数学,上面的过程相当复杂,但是,我提出了一个简化的版本。完整的版本被称为反向传播,并且具有额外的复杂性,即每一层都有其自己的梯度(而不是如所呈现的整个模型的单一梯度)。在这种情况下,需要了解的一些术语是:
SGD / RMSprop / Adam / Nadam /拉达姆/ Ranger / etc :这些是优化器:增强反向传播的算法,使其更快更好。理解这些方法是一个高级主题。实际上,每个人 95%的时间都在使用 Adam。另一个需要了解的有用术语是…
学习率:在训练过程中,最好以小步更新权重。虽然这似乎违背直觉,但它改善了收敛性。常用值为 0.01、0.001 和 0.0001。学习率通常是优化器的一个参数。培训期间的另一个常见做法是将其分成…
批处理:我们的数据常常超出了内存或 GPU 的容量。因此,我们不能计算所有例子的梯度。相反,我们可以为一个小的子集(一个批次)计算并应用它。例如,一千个例子可以分成十六批 64 个元素,产生十六个训练梯度。
T21:目前就这些了。如果你真的想学习深度学习,这个(简短的)总结中遗漏了许多其他术语。特别是我没有冒险进入卷积神经网络的神奇世界,它有很多很多的名字,比如卷积,池化,块,还有几种广泛流行的架构,比如 ResNets,MobileNets,InceptionNets 等等。
其中几个术语也揭示了整个世界的可能性。当我讨论损失函数是什么的时候,我们甚至没有触及它的表面。激活功能也是如此。
正如在开始时提到的,这篇文章是作为一个介绍,涵盖了大多数的基本方面,其他一切都是建立在这些方面之上的。我希望对你来说这是一个有趣的阅读,就像我写的一样有趣。
如果您对本文有任何问题,请随时发表评论或与我联系。如果你刚接触媒体,我强烈推荐订阅。对于数据和 IT 专业人士来说,中型文章是 StackOverflow 的完美搭档,对于新手来说更是如此。注册时请考虑使用我的会员链接。
感谢阅读:)
逻辑回归初学者指南
数学和理解之旅

逻辑回归是本科统计学学生学习使用的第一个二元反应模型。这也是 MOOCs 教授给有抱负的数据科学家的第一个分类算法。
逻辑回归如此流行有几个原因:
- 这很容易理解。
- 它只需要几行代码。
- 这是对二元反应模型的很好的介绍。
在本文中,我将解释逻辑回归背后的数学原理,包括如何解释逻辑回归模型的系数,并解释逻辑回归相对于更简单的方法的优势。
用回归估计概率的初级读本
在深入研究逻辑回归之前,让我们首先讨论一个更简单但直观上相似的模型:
线性概率模型(LPM)。
线性概率模型与回归模型相同,除了一个关键的区别:
回归模型的因变量是连续的,而 LPM 的因变量是二元的。
如果我们有一个独立变量,那么我们的 LPM 是

作者图片
其中 Y 为二元响应变量, X 为自变量, u 为误差项。
X 每变化一个单位, Y 等于 1 的概率就变化 B1 。如果 X 等于 0,那么 Y 等于 1 的概率就是 B0 。
让我们用一个实际的例子。假设如果一个人有工作,Y 等于 1,如果没有工作,Y 等于 0。 X 是他们接受大专教育的年限。
我们进行回归,估计 B1 等于 0.07,而 B0 等于 0.4。也就是说,

作者图片
如果一个人受过一年的大专教育,那么他有 47%的概率找到工作。如果一个人接受了两年的大专教育,那么他找到工作的概率会增加 7 个百分点(高达 54%)。
一个没有受过高等教育的人有 40%的概率找到工作。
线性概率模型的优点是易于解释。然而,LPM 有两个主要缺点,这使得它不能用于任何严肃的研究。
首先,如果一个人接受了十年的大专教育(他们已经完成了学士和博士学位),会发生什么?
这样的话,这个人有 110%的概率找到工作!
人们很容易将这一估计解读为,拥有博士学位会让我们过得更好;但是,记住概率只能在 0%到 100%之间。超出这个区间的概率是没有意义的。
线性概率模型的第二个问题是,它们假设 Y 等于 1 的概率变化是恒定的。
也就是说,一个受过三年大专教育,然后完成第四年(他们刚刚从学士学位毕业)的人找到工作的概率与受过四年大专教育的人相同,然后完成第五年(他们刚刚从硕士学位毕业)。
这可能不是真的。与获得学士学位相比,获得硕士学位可能会给就业带来更大的变化(或者我们希望如此)。
逻辑回归模型解决了线性概率模型的所有问题。
逻辑回归
逻辑回归的图形和方程
逻辑回归如下图所示:

作者图片(德斯莫斯)
上图明确了逻辑回归的几个要点。
首先是, logistic 回归是非线性,。更专业地说,因变量的变化取决于自变量的值,和斜率系数。
第二,逻辑回归的范围(因变量可以取的可能值的区间)被限制在 0 和 1 之间,不包括 0 和 1。因此,逻辑回归避免了概率小于 0%或大于 100%的问题。
如果我们有一个独立变量,那么逻辑回归方程是:

作者图片
在哪里

作者图片
逻辑回归模型在以下情况下增长最快:
- z = 0
- G(z)接近 0(当 z 接近负无穷大时)
- G(z)接近 1(当 z 接近正无穷大时)
第三,逻辑回归不要求同方差(与自变量无关的误差)或高斯误差是精确的。
解释逻辑回归的系数
逻辑回归的系数被解释为“对数优势”。对数比值是应用于比值比的自然对数变换。
我们以前见过赔率比(它们在博彩领域很常见)。
例如,假设我们在一场赛马中。

马修·施瓦茨在 Unsplash 上的照片
“慢吞吞的那匹马”赢这场比赛的赔率是 1:10。
因此,慢吞吞的马输掉比赛的可能性是赢得比赛的可能性的十倍。
我们可以把比值比,或,写成:

作者图片
其中 P 是成功的概率,给定 X 的值。
对比值比应用自然对数变换,我们得到:

作者图片
让我们回到第一个例子,如果我们有工作,我们的因变量等于 1,如果我们失业,我们的因变量等于 0。自变量是中学后教育的年数。
我们估计了逻辑回归,发现大专教育年数的斜率估计值等于 3。因此,大专教育每增加一年,对数优势增加 3。
这是什么意思?
如果 log ( 或 ) = 3,那么我们可以对两边取幂得到
OR = e
因此,赔率约为 20.1。这告诉我们,一个完成五年大专教育的人找到工作的可能性是完成四年教育的人的二十倍。
随着对照组之间的差异扩大,成功的几率呈指数增长。例如,一个受过六年大专教育的人比一个完成了四年教育的人更有可能找到工作 400 倍(在这个虚构的例子中,几率是极端的,但它表达了这一点)。
换句话说,赔率的差异等于
比较组间的 OR^(Difference)。
逻辑回归假设
逻辑回归模型假设事件的概率可以用 sigmoid 函数(上图中的 S 曲线)来模拟。如果你有任何理由相信概率不遵循 S 曲线,那么你不应该使用逻辑回归函数。
结论
在这篇文章中,我们回顾了逻辑回归的假设,它背后的数学,以及它相对于线性概率模型的优势。
在另一篇文章中(谁知道什么时候?),我将解释如何使用二元和连续自变量的逻辑回归。我还将解释受试者操作特征(ROC),这是说明逻辑回归(以及其他二元响应模型)诊断能力的常用工具。
每当我有一个二元因变量时,我就使用逻辑回归。对于分类问题和来说,这是一个生成因果洞察的强大工具。希望本文鼓励您在下一个数据科学项目中使用它!
深度学习交易机器人的开始——第一部分:95%的准确率是不够的
跟随我的研究之旅,我开发了一个基于深度学习的交易系统。

由 vectorpouch / Freepik 设计
好吧,我的朋友们,我们的目标是开发一个能够持续跑赢市场的复杂交易系统。最终,我们将有一个生产就绪的应用程序,我将投资大约****我自己的积蓄20,000 美元,并与你们分享成果。因此,在这一系列文章中,我将不仅仅分享概念的证明,还将分享开发能够处理真实市场不确定性的人工智能系统实际需要的东西。
大多数人工智能和深度学习来源都倾向于只呈现最终的研究结果,这在试图理解和再现所提供的解决方案时可能会令人沮丧。相反,我想让这个系列尽可能有教育意义,因此将分享我的思路和所有进入最终解决方案的实验。
在我们开始之前,我们必须提醒自己,预测市场中特定股票的价格变动是一项非常复杂的任务。股票走势是由每个市场参与者接触到的数百万个印象和先决条件造成的。因此,我们需要能够捕获尽可能多的这些印象和先决条件。此外,我们还必须对市场的运行方式做几个假设。
假设
- ****市场并不完全完善。也就是说,信息不是所有市场参与者都能立即获得的,而是需要时间来传播。
- 历史市场事件和股票走势会影响未来的股票走势。
- 市场主要遵循人们的理性行为。
请务必阅读底部的免责声明。
即将到来的结构
由于我们无法在一篇文章中涵盖整个交易机器人的开发,我设想本系列的结构如下:
- 在这篇文章中,我分享了我第一次使用股票价格/回报** 和交易量来预测未来股票走势的实验。**
- 在下一篇文章中,我将分享不同的实验,利用金融和市场新闻来补充历史股票价格,以对未来股票价格和回报做出更稳健的预测。
- 结合所有实验结果和开发一个生产级模型,该模型包含股票价格、交易量、新闻和其他数据点,用于预测股票回报。
- 建造一个深度加固机器人用于交易执行。我们将训练一个机器人,它可以根据历史价格和我们的股票走势预测,学习何时买卖不同的股票。
- 在云服务上托管和部署交易机器人。
- 将交易机器人连接到纸交易账户,作为最后的预演。
- ****投资 2 万美元让 bot 与市场自由互动。
开始实验——找到正确的数据
在训练生产级别的模型之前,我们首先必须找出在预测股票回报时股票价格和金融新闻的解释力有多大。
为了获得股票价格和新闻如何预示未来股票价格变化的第一印象,我们最初在一个较小的数据集上训练多个模型。我们将用来开始证明我们假设的数据集是 IBM股票的历史价格和交易量数据。****
IBM 在雅虎上有相当长的价格历史,价格可以追溯到 1962 年。获得 IBM 历史价格的最简单方法是从雅虎的 IBM 页面下载数据集。对于每个交易日,雅虎提供开盘价、最高价、最低价、收盘价和交易量( OHLCV )。一旦下载并加载到笔记本中,IBM OHLCV 数据如下所示。

IBM 的价格和销量数据
为了了解价格如何随时间变化,我们绘制了日收盘价。IBM 价格图的开始日期是 1962 年 1 月 2 日,结束日期是 2020 年 2 月 3 日,价格范围在 7.5 美元到 225 美元之间。

IBM 每日收盘价 1962–2020
让我们也来看看成交量数据,我们将使用它作为价格数据点的附加特征。每天的交易量是通过乘以每笔交易的乘以股数乘以交易的股价计算出来的。然后将一天中所有交易的产品相加,形成这一天的交易量数据点。

IBM 1962 年至 2020 年的日交易量
预处理我们的数据——我知道这很无聊,但很有必要😊
将原始价格和交易量数据输入深度学习模型通常不是一个好主意。当查看 IBM 的价格图表时,你可以看到 1962 年至 1991 年的价格(7 美元至 48 美元)与 2000 年和 2020 年的价格(140 美元至 220 美元)完全不同。本质上,这两个价格区间关系不大。这意味着从 1962 年到 1991 年的范围(平均价格 25 美元)对 2000 年到 2020 年的价格范围(平均价格 130 美元)没有什么解释价值。为了使过去的价格点与最近的价格点处于同一水平,从而对训练我们的神经网络更有用,我们必须做一些预处理步骤。让我们开始预处理,我保证会很快。
****首先,我们将把价格和交易量转换成价格回报/百分比变化。最简单的方法是使用 pandas 函数 pct_change()。
有价格回报的好处是它们比原始价格数据更稳定。平稳性的简单解释:平稳性=好,因为过去的数据与未来的数据更相似,使得预测更容易。

IBM 的每日股票回报和成交量变化
下一张图很好地说明了将股票价格转换为股票回报消除了股票价格上涨的趋势。
****其次,最小-最大归一化应用于所有价格和交易量数据,使我们的数据范围从 0 到 1。标准化数据不使用原始价格回报和交易量变化,而是具有允许深度学习模型更快更稳定地训练的优势。
****第三,我们将把时间序列分成训练、验证和测试数据集。在大多数情况下,训练和验证数据集分割就足够了。然而,对于时间序列数据,在测试集上进行最终评估是至关重要的。模型根本没有看到测试数据集,因此我们在评估中避免了任何前瞻或其他时间偏差。
计算股票回报、标准化并将数据分成 3 个部分后,数据集现在具有下图所示的形状。

培训和测试不同的模型架构
准备好数据集后,我们现在可以开始做有趣的事情了——训练不同的深度学习模型。我试验过双向 LSTM、变形金刚和 CNN + Bi-LSTM 所有型号的代码都可以在 Github 上找到。
双向 LSTM(双向 LSTM)
双向 LSTM 是传统 LSTM(LONGSshortTermM记忆单元)的扩展,可以提高处理顺序数据集时的模型性能。双向 LSTM 组合了两个单独的 LSTM 层,而第一 LSTM 层以正确的时间顺序接收顺序数据(例如 IBM 价格),而第二 LSTM 层仅以相反的顺序接收相同的数据。在输入数据被双向 LSTM 层(2 个 LSTM 层)处理后,两个输出被连接以产生最终预测。为了更容易理解,我在下面添加了一个插图和代码。

现在让我们看看双向 LSTM 模型编码后的样子。该模型不是只有一个双 LSTM 层,而是由三个双 LSTM 层构成,以提高模型的容量。
现在让我们开始训练过程。
评估模型

双向 LSTM 结果
在训练了 200 个时期后,我们获得了以下结果。对于验证集,我们有一个平均百分比误差** (MAPE)为 3.5828 ,为了简单起见,可以解释为 96.42% 的准确度。测试数据集的 MAPE 值为 4.2656 ,相当于精度为 95.73% 。一开始,超过 95%的准确率似乎令人惊讶,但下一张图显示了一个不同的故事。**
蓝线代表 IBM 股票的每日价格变化(每日股票回报),黄线对应于我们的模型预测。尽管平均准确率超过 95%,但该模型仅仅设法找到了股票收益分布的中心。黄色预测线根本没有偏离 0.6 左右的股票回报中心。

Bi-LSTM — IBM 每日股票回报(蓝色)和次日股票回报预测(黄色)
对稳定预测线的解释是,我们的模型能够识别 IBM 股票的总体趋势。目前,我们的实验表明,仅通过单只股票的价格数据,只能得出趋势,而不能得出异常值。
CNN +双向 LSTM
现在,我们将执行与普通双 LSTM 模型完全相同的步骤,但我们将把双 LSTM 与卷积网络(CNN)结合起来,而不是使用普通双 LSTM。

通常,CNN 用于图像分类,而 CNN 中的每个卷积层从图像中提取不同的特征。然而,近年来已经表明,CNN 在分析时间序列和顺序数据(例如声音和文本)时提供了价值。卷积层在检测空间上彼此接近的数据点之间出现的模式方面表现良好。如果你每天的价格和交易量数据应该是这样的。
传统层的架构受到了 Google 的 Inception blocks 的启发。我把盗梦空间模型的 2D 卷积改成了 1D 卷积,使得各层与我们的时间序列兼容。
好,让我们构建 CNN +双 LSTM 模型。
最后是 CNN +双 LSTM 模型的训练启动。
评估模型

CNN+Bi_LSTM 结果
在对该模型进行了 200 个时期的训练后,训练结果如下。验证集的 MAPE 值为 3.8454 仅略高于前代车型的3.5828。测试数据集的 MAPE 值为 4.5289 ,而不是双 LSTM 模型的 4.2656 。对于验证和测试集来说,CNN+双 LSTM 网络比传统的双 LSTM 模型表现更差。虽然我们有更差的结果,但我很满意地看到,这一次我们不只是有一条直线预测线,因此可以排除任何严重的模型或数据结构缺陷。🤓
这一次,我们的模型再次学会了只预测价格运动的趋势。然而,仅凭 IBM 价格数据是不可能预测异常值的。

CNN+Bi-LSTM — IBM 每日股票回报(蓝色)和次日股票回报预测(黄色)
如果你有兴趣看所有不同模型架构的结果和我实验的完整代码,请看这里。 Github
后续步骤—最终想法
总之,我们的模型能够识别价格变化的总体趋势,但异常值无法预测。平均百分比误差(MAPE)始终低于 5,相当于 95%以上的准确度解释。对于第一次实验来说,结果已经很有希望了。然而,为了改进我们模型的缺点和掌握异常值预测,我们有几个选择。
****首先,我们可以添加额外的数据源来帮助预测异常值,比如金融和市场新闻。
****其次,我们可以用更多不同股票的价格数据训练更大的模型。为此,我整理了一份 7200 只公开交易股票的列表,我们将在未来的文章中使用它来提高模型性能。
还有更多的细节需要探索。我确信有许多问题和未回答的部分。所以,任何意见和建议——请分享。我很乐意在未来的过程中提出建议。
****在下一篇文章中,我将向展示如何将金融新闻与价格数据结合起来,以提高我们网络的价格回报预测。
非常感谢你读到最后。
一月
编辑于 2022 年 6 月 1 日:
在过去,我收到了一些反馈和请求,希望我的金融资产预测模型能够变得可用且易于使用。这将有助于人们回答以下问题:
有哪些好的资产可以投资?我应该把什么放入我的金融投资组合?
我给你介绍一下pink lionwww . pink lion . XYZ
我们把你从乏味和令人沮丧的工作中解脱出来。没有更多的清洁数据和模型试验和…
www.pinklion.xyz](https://www.pinklion.xyz/)
PinkLion 是一款基于我的代码基础之上的产品,它使成千上万的股票、基金/ETF 和加密货币的日常资产数据可用。此外,通过提供对基础预测模型的访问,它允许资产分析和投资组合的动态优化。
目前,注册人数仍然有限,因为单个计算需要大量的服务器资源。
请随意尝试并提供反馈。(目前还处于大致状态) www.pinklion.xyz**
放弃
本文中的任何内容都不构成任何特定证券、证券组合、交易或投资策略适合任何特定人士的建议。期货、股票和期权交易包含巨大的损失风险,并不适合每个投资者。期货、股票和期权的估值可能会波动,因此,客户的损失可能会超过其原始投资。
贝尔曼方程
深度强化学习讲解— 08
解释了 v 函数和 Q 函数

在的上一篇文章中,我们已经能够用冰湖环境的例子来检验交叉熵方法的局限性。继续这一系列逐渐增加知识的风格,在本帖中,我们将呈现另一种类型的代理,它允许我们解决前面的问题。这些是所谓的基于价值的代理,它们存储价值函数,并以此为基础做出决策。为此,我们将介绍贝尔曼方程,这是许多强化学习算法的核心要素之一,也是本文计算价值函数所必需的。
访问第 3 页的自由介绍
medium.com](https://medium.com/aprendizaje-por-refuerzo/3-funciones-de-valor-y-la-ecuación-de-bellman-7b0ebfac2be1)
基于价值的代理
请记住,代理的目标是找到一系列将使回报最大化的行动:在一集或代理的整个生命周期中的奖励总和(折扣或不折扣——取决于 gamma 的值),取决于任务。
在连续任务中,这是无穷大。我们可以借助文章 2 中已经介绍的折扣系数来解决这个问题,折扣系数在[0:1]范围内。在时间步 t 贴现收益 G 的公式如下:

虽然和仍然是无穷大,但如果γ<1,那么 Gt 就会有一个有限值。如果γ= 0,代理人只对眼前的回报感兴趣,舍弃了长期的回报。反之,如果γ= 1,则代理人会认为所有未来的奖励等于眼前的奖励。
我们可以用递归关系改写这个等式:

简而言之,代理必须能够利用我们已经能够用这个 Return G 表达的信息来做出他们的决定。我们也把这个表达式称为贴现回报。
几乎所有由代理执行的强化学习算法都涉及估计值函数——状态或状态-动作对的函数。这些就是所谓的基于价值的代理。
一个价值函数根据收益G来估计代理处于给定状态有多好(或者在给定状态下执行给定动作有多好)。注意,代理的返回 G 可能取决于它将采取的动作。相应地,在帖子 2 中引入的价值函数是根据特定的行为方式定义的,称为策略,通常由𝜋.表示
V 函数:国家的价值
我们要介绍的第一个价值函数是 V 函数。总的来说,我们可以说 V-function 回答了“从这里期待什么?”。
更正式的说法是, V 函数,也被称为状态值函数,甚至是值函数,或者简称为 V ,衡量每个状态的好坏。换句话说,在遵循一个策略 𝜋 时,根据 return G 处于一个特定状态的好坏。
也就是说,我们可以将 V 函数定义为可从该州获得的预期总回报(贴现或未贴现——取决于伽马值)。以正式的方式来说,【v𝜋(𝑠】的值是:

它描述了在时间步从状态 s 开始,在时间 t 然后遵循策略 𝜋 时,总回报g的期望值。这是用期望𝔼[.因为环境转移函数可能以随机的方式起作用。
为了进一步澄清概念,对于初学者,让我们考虑一个具有三种状态的简单环境:

- 代理的初始状态 0
- 代理在执行从初始状态“离开”的动作后所处的最终状态 1。由此得到的回报是 r=+1
- 代理在采取行动“正确”后的最终状态 2 由此得到的回报是 r=+2
我们可以用以下带有奖励的环境状态转换来表示这一点:

环境总是决定性的——每一个动作成功,我们总是从状态 0 开始。一旦我们到达状态 1 或状态 2,这一集就结束了。
现在的问题是,状态 0 的值是多少?(用 V(0) 表示)。一个重要的细节是,一个状态的值总是根据我们的代理所遵循的一些策略来计算(依赖于)的。即使在一个简单的环境中,我们的代理也可以有不同的行为,每个行为都有自己的状态 0 值。考虑一些策略示例:
- 代理人总是走左边
- 代理人总是向右走
- 代理人向左走的概率为 0.5,向右走的概率为 0.5
- 代理向左走的概率为 0.2,向右走的概率为 0.8
上述每个策略中状态 0,V(0) ,的值为:
- 在“总是向左”代理的情况下,状态 0 的值是 V(0) = 1.0(每次向左,它都获得+1,并且剧集结束)。
- 对于“永远正确”的智能体,状态 0 的值为 V(0) = 2.0(每次向右,获得+2,剧集结束)。
- 对于“左 0.5 +右 0.5”代理,该值为 V(0)=1.0 x 0.5+2.0 x 0.5 = 1.5
- 对于“左 0.2 +右 0.8”代理,该值为 V(0)=1.0 x 0.2+2.0 x 0.8 = 1.8
由于代理人的目标是获得尽可能多的总报酬,在这个简单的单步环境中,该代理人的最优策略是策略 2,策略“永远正确”。
但是,前面的例子可能会给人一种错误的印象,即我们应该“贪婪”,总是以最高的回报采取行动。可惜没那么简单。例如,让我们用另一个可以从状态 2 到达的状态来扩展前面的环境。状态 2 不再是最终状态,而是向状态 3 的过渡,有一个(非常)糟糕的奖励–10:

带有奖励的新环境的状态转换可以表示为:

添加后,对于每个策略,V(0)将为:
- 对于“始终向左”,情况相同:V(0) =+ 1.0
- 对于“始终正确”:V(0)=2.0+(–10.0)=–8.0
- 对于“左 0.5 +右 0.5”:V(0)=1.0 * 0.5+(2.0+(-10.0)) 0.5 =-3.5*
- 对于“左 0.2 +右 0.8”:V(0)=1.0 * 0.2+(2.0+(-10.0)) 0.8 =-6.2*
因此,对于这种新环境,现在的最佳策略是策略 1:“始终向左”。请注意,一旦代理人在状态 0 选择了“正确”的行动,坏的回报是不可避免的,因为从状态 2,我们只有一个出口。
这个基于天真环境的例子追求的是读者意识到这个最优化问题的复杂性,并让他或她准备好看到贝尔曼方程的重要性。什么是贝尔曼方程?
Q 函数:动作的值
在 post 2 中,我们将状态-值函数的定义扩展到了状态-动作对,为每个状态-动作对定义了一个值,称为动作-值函数,也称为q-函数或简称为 Q. 它定义了在策略 π 下采取动作在状态下的值,表示为 为预期收益 G 从开始,采取行动 𝑎 ,此后遵循政策【π😗***

在这个等式中,再次使用了期望𝔼[.因为环境转移函数可能以随机方式起作用。
现在我们已经定义了 Q 和 V,让我们来形式化它们的关系。我们用 π(𝑎|𝑠) 表示给定当前状态下,策略π选择动作 𝑎 、 𝑠 的概率。注意,从 s 的所有出站动作的概率之和等于 1:

我们可以断言,状态值函数等于所有传出(从 s )动作的动作值函数之和,乘以选择每个动作的策略概率:

贝尔曼方程
贝尔曼方程在强化学习文献中随处可见,是许多强化学习算法的核心元素之一。综上所述,我们可以说贝尔曼方程将价值函数分解为两部分,即期回报加上贴现后的未来价值。**
这个等式简化了价值函数的计算,因此,我们可以通过将复杂问题分解为更简单的递归子问题并找到它们的最优解,而不是在多个时间步骤上求和。
为了便于理解以下各节中的公式,接下来的两个备份图总结了变量的命名约定及其关系:

(a) V 𝜋 (s) 和(b) Q𝜋 (s,a)的备用图。
在这些图中, P 表示动作概率 a ,发布于状态,结束于状态(带奖励 r )。****
状态值函数的贝尔曼方程
我们已经看到,我们可以用递归的方式定义贴现收益, G 。现在让我们看看如何递归地为状态-值函数定义贝尔曼方程:

这个等式告诉我们如何根据政策 𝜋 求出一个状态 s 的值。我们可以直观地看到,它把价值计算递归地分解成一个来自下一个状态的即时期望回报,【r(s,a)** ,加上一个后继状态的值,v𝜋(s’),带有一个贴现因子 𝛾 。上面的等式也用政策概率的总和来表示环境的随机性。
贝尔曼方程很重要,因为它让我们能够描述一个状态的值v(s),用状态的值,*v(s),用我们将在下一篇文章中介绍的迭代方法,我们可以计算***
遗憾的是,在大多数场景下,我们不知道概率 P 和报酬 r ,因此无法直接应用贝尔曼方程求解 MDPs。但是不要担心,在下一篇文章中,我们会展示一些替代方案,从经验中找到它们。
作用值函数的贝尔曼方程
我们还有作用值函数的贝尔曼方程:

与状态-值函数一样,这个等式告诉我们如何递归地找到遵循策略 𝜋 的状态-动作对的值。
由于我们已经表明,状态值函数v(s)等价于所有输出动作的动作值函数 q(s’,a)之和,乘以选择每个动作的策略概率(a“| s”),前面的公式可以表示如下:

最优策略
请记住,代理人的目标是在长期内最大化总累积报酬。使总累积报酬最大化的策略称为最优策略。
最优值函数
当且仅当对于所有状态 s ,策略 π 被定义为优于或等于策略 π 。一个最优策略π∫满足π∫≥π对于所有策略 π 。最优策略肯定存在,但可能不是唯一的。这意味着可能存在不同的最优策略,但它们都共享相同的价值函数,即“最优”价值函数。****
最优价值函数是与所有其他价值函数相比产生最大值的函数(使用其他策略)。
当我们说我们正在求解一个 MDP 时,实际上意味着我们正在寻找最优值函数。因此,数学上最优状态值函数可以表示为:

上式中,v∫(s)告诉我们状态 s 我们能从系统中得到的最大回报是什么。
同样,最优状态-行动价值函数表示如果我们处于状态并从那里开始采取行动我们将获得的最大回报:****

我们也可以通过 Q(s,a)定义 V(s ),因此某个状态的值等于我们可以从该状态执行的最大动作的值:

和

贝尔曼最优方程
贝尔曼证明了一个状态下的最优状态值函数 s 等于行动,这给了我们最大可能的预期即时报酬,加上下一个状态下的贴现长期报酬’s😗*****

贝尔曼还证明了最优状态-动作值函数在状态 s 和采取动作 a 是:

在本系列的后续文章中,我们将展示如何使用贝尔曼方程进行优化的例子。正如我们将在本系列中看到的,贝尔曼方程是找到价值函数的最优值以获得代理的最优策略的基础。
下一步是什么?
在以后的文章中,你会看到这些公式在解决冰湖环境中的实际应用。然而,为了能够做到这一点,我们仍然缺少一个重要的东西:计算这些 V 值和 Q 值的通用方法。在下一篇的中,我们将为其呈现价值迭代方法。
下期见!。
关于这篇文章内容的更多细节,读者可以阅读理查德·萨顿和安德鲁·巴尔托的优秀著作《T4 强化学习》,第二版。
深度强化学习讲解系列
由 UPC 巴塞罗那理工 和 巴塞罗那超级计算中心
一个轻松的介绍性系列以一种实用的方式逐渐向读者介绍这项令人兴奋的技术,它是人工智能领域最新突破性进展的真正推动者。
本系列的内容](https://torres.ai/deep-reinforcement-learning-explained-series/)
关于这个系列
我在 5 月份开始写这个系列,那是在巴塞罗那的封锁期。老实说,由于封锁,在业余时间写这些帖子帮助了我。感谢您当年阅读这份刊物;它证明了我所做的努力。
免责声明 —这些帖子是在巴塞罗纳封锁期间写的,目的是分散个人注意力和传播科学知识,以防对某人有所帮助,但不是为了成为 DRL 地区的学术参考文献。如果读者需要更严谨的文档,本系列的最后一篇文章提供了大量的学术资源和书籍供读者参考。作者意识到这一系列的帖子可能包含一些错误,如果目的是一个学术文件,则需要对英文文本进行修订以改进它。但是,尽管作者想提高内容的数量和质量,他的职业承诺并没有留给他这样做的自由时间。然而,作者同意提炼所有那些读者可以尽快报告的错误。
别忘了给我们你的👏!****
开始数据科学之旅的最佳书籍

克里斯多夫·伯恩斯在 Unsplash 上拍摄的照片
数据科学
这是你从头开始学习数据科学应该读的书。
D ata 科学。这是 21 世纪最性感的工作,每个人都在谈论它。公司渴望雇佣最优秀的人才,人们也热衷于投身数据科学事业。随着数据呈指数级增长,我们的技术飞速发展,数据科学将成为全球企业的一项基本工作也就不足为奇了。
用数据为新油;这是一笔巨大的、尚未开发的宝贵财富,它将在我们的社会中发挥不可或缺的作用。今天的工作场所由数据科学职位的各种专业化所主导,它从根本上影响了商业模式。在数据上运行的算法和公式将取代人类的直觉,数据科学将成为数据驱动型公司的决策者。
这引发了学习数据科学的热潮,许多人转向互联网,一个有大量资源学习数据科学的地方。也就是说,并不是所有的都是可靠和有用的。随着数据科学的风起云涌,有无数的文章和视频——“一个月学会数据科学”——这些文章和视频具有误导性和肤浅性,是一种营销策略或“clickbait”。因此,如果你打算深入研究什么是数据科学,那么你必须找到合适的资源,以确保你从最好的人那里学习。
这就是我选择这本书的原因。如果你决定学习数据科学,那么你很幸运。但是,如果你已经在学习或正在实践它,这将是对你的资源收集或复习/测试的一个很好的补充,以确保你已经从头开始了解数据科学。
为什么要读书?

照片由 Aaron Burden 在 Unsplash
你可能会问,都 2020 年了,为什么还在看书?因为在我看来,读书仍然是最好的学习方式,尽管五花八门的在线课程和视频教程充斥着互联网。原因如下:
- 更好的保留
- 更深刻的理解
- 赞同思维
- 更高的质量
- 更好的聚焦
然而,这并不是说阅读这本书会神奇地让你一夜之间成为数据科学家。学习的重要之处在于,你可以通过实际的行动将你的知识转化为具体的东西。
在所有花哨的术语和数学背后,数据科学就是解决问题。你不能仅仅通过头脑风暴和阅读手头的困境来解决问题,你需要行动。
因此,事不宜迟,适合您开始数据科学之旅的书是…

本·怀特在 Unsplash 上拍摄的照片
从零开始的数据科学:Python 的基本原理,第二版

奥莱利
介绍
“从头开始的数据科学,第二版”作者是 Joel Grus ,他是一名数据科学家,也是初创公司的分析师和谷歌的工程师。他在加州理工学院获得了博士学位。去他的网站了解更多。
这本全新的书是第一版数据科学从零开始:Python 的基本原理的继承者,Python 代码针对 Python 3.6 进行了更新,这是一个伟大的进步,因为 Python 2.7 已经被视为生命的终结 (EOL)。
在整本书中,Grus 为每个概念提供了一个简单的解释,然后剩下的都是代码片段,教你如何从头开始构建流行的工具和算法,如决策树和神经网络。他强调了从基础知识到复杂理论积累知识的重要性——从 Python 的基础知识到构建神经网络。
要学习数据科学,关键是要深刻理解每种算法的基本原理和方法。任何人都可以建立一个神经网络,如果他们只是按照视频教程,但这并不意味着他们知道自己在做什么。因此,一个人不仅应该掌握工具——数据科学库、框架、模块和工具包——而且应该彻底了解它们。
里面是什么
《从零开始的数据科学》总共有 27 章章节,涵盖了数据科学职业生涯中你需要知道的一切
1.简介
2。Python 速成班
3。可视化数据
4。线性代数
5。统计数据
6。概率
7。假设和推论
8。梯度下降
9。获取数据
10。使用数据
11。机器学习
12。k-最近邻
13。朴素贝叶斯。简单线性回归
15。多元回归
16。逻辑回归
17。决策树。神经网络。深度学习
20。聚类
21。自然语言处理。网络分析
23。推荐系统。数据库和 SQL
25。MapReduce
26。数据伦理
27。去做数据科学吧
这本书是给谁的?
这本书不适合完全的初学者,因为讨论了复杂的思想和原理。所以,为了充分利用这本书,你需要了解:
- 基本的数学、代数和统计知识
- 初级黑客技能。
- 算法原理
- 机器学习基础
尽管如此,即使你是一个完全的初学者,只要你有决心和意愿去学习,你仍然可以试一试这本书。
你将学到什么
Grus 将帮助你在数据科学的核心获得舒适的数学和统计学,以及作为数据科学家入门所需的黑客技能。
通过本书,您将:
- 参加 Python 速成班
- 了解线性代数、统计和概率的基础知识,以及它们在数据科学中的使用方式和时间
- 收集、探索、清理、管理和操作数据
- 深入机器学习的基础知识
- 实施 k-最近邻、朴素贝叶斯、线性和逻辑回归、决策树、神经网络和聚类等模型
- 探索推荐系统、自然语言处理、网络分析、MapReduce 和数据库
这本书最大的特点
毫无疑问,这本书最棒的地方在于它使用了 Python 3.6 作为所有代码片段的语言。这一点特别有用,因为 Python 的受欢迎程度在过去几年里激增,已经成为编程界的顶级语言之一
Python 现在是数据科学的中心工具,这是计算机科学越来越重要的一部分。随着数据科学的兴起,越来越多的公司正在通过机器学习和人工智能来利用他们的数据,这对精通 Python 的开发人员产生了巨大的需求。
因此,拥有用 Python 编码的能力在这个人工智能时代将非常有用,这本书将为你学习 Python 打下基础。
如何有效地阅读这本书?
在阅读这本书的时候,我们鼓励你边读边记笔记,突出你不太理解的概念,这样你以后就可以回头再看。
您还应该有一个 IDE,如 Pycharm + Anaconda setup 或 VScode,这样您就可以在阅读代码片段的同时运行代码。通过这样做,你可以亲身体验使用机器学习算法的感觉,体验数据科学家的日常工作。
最后,利用每章末尾的进一步探索,这样你自己就能更深入地理解这个概念。
行动计划

斯科特·韦伯在 Unsplash 上拍摄的照片
学习数据科学并不容易。这本书肯定不会让它变得更容易。如果你真的对学习充满热情,那么试试这本书。
接触代码,尝试它,理解书中解释的原则和概念。测试你理解能力的一个方法是用更简单的语言向你的朋友或同事解释你所学到的东西,如果他们能理解你,那么这就证明你真的理解了一个概念。
看完这本书,你应该对 Python 有一点了解,对机器学习算法也有密切的关系。你接下来会问什么?
查看这本书,它讲述了如何在 Python 中操作、处理、清理和处理数据集:
用于数据分析的 Python,第二版
获取在 Python 中操作、处理、清理和处理数据集的完整说明。针对 Python 进行了更新…
shop.oreilly.com](http://shop.oreilly.com/product/0636920050896.do)
收场白
我希望您发现这篇文章很有用,并成功说服您拿起这本书,开始学习数据科学。
祝你旅途顺利,学习愉快!
这是这本书的链接:
这里是 Github repo,它包含了书中的所有代码:
这是我的书《从头开始的数据科学》第二版的所有代码和例子。他们至少需要…
github.com](https://github.com/joelgrus/data-science-from-scratch)
在推特和 LinkedIn 上关注我的更新,并关注我的下一篇文章!
想看更多类似这样的数据科学内容,关注我中!
既然您大老远来到这里,请查看我的超学习数据科学系列!值得一读。
这是一个简短的指南,基于《超学习》一书,应用于数据科学
medium.com](https://medium.com/better-programming/how-to-ultralearn-data-science-part-1-92e143b7257b)
机器学习初学者的最佳书籍
4 本最好的机器学习书籍,以及它们为什么会让你成为下一个大数据科学家。
机器学习是当前数据科学领域最热门的话题。凭借其独特的应用,初创企业和大型公司正在雇用越来越多的数据科学家来实施这些模型,以更好地了解他们的业务和客户。
对于任何参与数据科学的人来说,数据科学家是我们都梦想的职业,但你必须了解自己的东西,这要从理解机器学习的概念开始!!
因此,如果你是一名初学者,并希望在未来成为一名数据科学家,或者只是有兴趣了解有关该主题的更多信息,我将向你提供 4 本最好的机器学习书籍。

金伯利·法默摄于 Unsplash
1.Python 机器学习导论:数据科学家指南。
如果你刚刚开始学习机器,这是一本必读的书。它主要侧重于 Scikit-Learn 库,并深入介绍了机器学习中一些最有用的方法——分类、回归、一点聚类、PCA 以及衡量模型结果的所有不同方法。使用 Python 进行机器学习的介绍很容易理解,并且将彻底解释使用 Python 创建一个成功的机器学习应用程序的所有必要步骤。
《T2》是机器学习入门者的必读之书。

2.百页机器学习书
对于那些希望快速学习机器学习的人来说,这是一本精华的书。这本书可以在一个晚上读完,里面有你用机器学习创建自己的模型所需的所有信息。就页数和内容质量而言,它清晰、简洁,可能是我读过的最好的机器学习书籍。

3.Python 机器学习
这是一本关于 python 机器学习的极好的入门书。它提供了足够的背景知识,介绍了每种技术的理论,并附有 python 代码。这本书的一个优点是,它从头开始实现神经网络,为读者提供了真正理解关键基础技术(如反向传播)的机会。更进一步,这本书展示了一种高效(专业)的 python 编码方式,这是数据科学的关键。
我强烈推荐给那些对机器学习原理和 python 有中等程度了解的人。

4.使用 Scikit-Learn 和 TensorFlow 进行机器实践学习
作者 Aurelien Geron 在解释不同的概念方面做了大量工作,主要关注 Scikit-Learn 和 TensorFlow 的实际实现。这本书分为两部分,前半部分介绍 Scikit-Learn,它很好地结合了实践和理论。Scikit-Learn 部分是一个很好的参考资料,它有很好的详细解释和很好的参考资料,可供进一步阅读以加深您的知识。第二部分深入探讨 TensorFlow 的深度学习,这是全面理解机器学习的下一步。深度学习是使用简单易学的 Keras 库与 TensorFlow 的组合和功能来解释的。

这 4 本书将为你提供参加任何数据科学家面试所需的知识,让你自信地面对任何问题。
希望任何对机器学习感兴趣的人赶快阅读这些书,因为你永远不知道它们会带你去哪里。
参考
[1] A. Muller 和 S. Guido,《用 Python 进行机器学习导论:数据科学家指南》(2016),https://amzn.to/3b6ygSZ
[2] A .布尔科夫,《百页机器学习书》(2019 年),【https://amzn.to/3fqMr8y】T21
[3] S. Raschka 和 V.Mirjalili. Python 机器学习(2017),https://amzn.to/2L604fM
[4] A. Geron,用 Scikit-Learn 和 TensorFlow 进行机器学习的实践(2017),https://amzn.to/3fq1foc
下一个最佳数据科学工作
数据科学家最受欢迎的路线

沃伦·王在 Unsplash 上的照片
TL;DR —如今,许多人正在转型或寻找新的数据科学职位。这篇文章提供了一些关于最流行和可行的路线的事实和见解。
我交替使用 AI、ML 和数据科学。这篇文章不代表我的雇主的观点。
喜欢读什么? 在 中 ,LinkedIn,或者Twitter。还有,作为一名数据科学家,要不要学习商业思维和沟通技巧?查看我的《 用机器学习影响 》指南。
从上一集开始
我介绍了数据科学家的四个原型来强调退出的可能性,并进行一项调查来了解社区在想什么。
以下是截至 2020 年 4 月 12 日的结果:

调查结果来自作者的文章,2020 年 4 月 12 日
这是我的外卖。看到其他见解请留言评论。
- 超级极客是新的性感。我对此并不感到惊讶,因为机器学习的智力本质以及领先机构令人兴奋的突破的新闻报道,如谷歌大脑、优步和网飞。
- 无名英雄没得到多少爱。再说一次,我并不感到惊讶。公司的繁文缛节和速度可能令人讨厌。虽然这些英雄致力于核心运营问题,但他们往往没有获得足够的信任,做重复(感知)的无聊工作,并被他们的超级极客同行所掩盖。
- 创业公司没有我想象的那么火。只有大约 1/3 的人想在创业公司做数据科学。我原本预计至少有 50%的人会在初创公司任职。鉴于此次调查的时间,这可能是因为新冠肺炎的情况。
告诫 :这张图 并没有 指明人们想要如何过渡。例如,你可能认为大多数无名英雄都想成为超级极客。这可能不是 100%的真实。该调查不跟踪任何个人信息(如 IP),因此我们无法在个人层面进行跟踪。
那又怎样?
每当我们提出一些数据时,人们总是问那又怎样。我的回答永远是“看情况”,“你说的那么——什么是什么意思?”,或者两者都有。😀
因此,让我们这样框架:这取决于你是 1)计划转型的数据科学家,2)数据科学团队经理或高管,还是 3)试图加入该领域的有抱负的数据科学家。每个角色都有不同的兴趣和挑战。
为了限制本文的范围和给定的受众规模,让我们把讨论的焦点放在正计划转型的经验丰富的无名英雄身上。如果你属于其他人物角色,请随时在 LinkedIn 上与我联系或留下评论。乐于交流思想。****
无名英雄的光荣之路
在我作为一家全球公司的昂贵顾问的工作中,以及在我最近的人工智能创业冒险中,我与相当多的无名英雄进行了互动。大多数无名英雄都觉得自己处于劣势。如果你这样做了,你很幸运地错了。
事实上,你有两个优势 : 1)职能专业知识,2)你知道在混乱的业务中设计、部署和管理 ML 需要什么,3)与非数据科学团队密切合作。这些往往被淡化。
每个人对自己的职业生涯都有不同的看法。我假设你想:
- 最大化你的优势
- 尽可能走最短最便宜的路
- 处理实际的数据科学问题
- 不要让你的职业(如级别和责任)倒退太多
目的地 1 :超级极客
对不起,我没有资格讨论这个。我从未在任何大型科技公司做过超级极客。最接近的时刻是,我得到了华尔街顶级对冲基金的邀请,成为一名极客,但我无法接受这份工作。长话短说:美国签证系统糟透了。
取决于对这篇文章的反应,我可以在后续的帖子中讨论我的准备和面试经历。
与此同时,这里有一些领先科技公司超级极客的非招聘面试。他们让你很好地了解了他们所做的事情以及 R&D 团队所关心的事情。但是有一点要记住。小公司的 R&D 也做一些很酷的事情。
目的地 2:昂贵的顾问
在我们讨论如何过渡到咨询行业之前,让我们看看公司的类型:大型公司、大型科技公司和精品公司。

咨询公司、作者工作的细分
大型公司提供涵盖所有行业和职能的一系列业务和技术解决方案(如德勤、麦肯锡、埃森哲)。大型技术公司的服务部门,专注于集成特定的解决方案(例如,微软、IBM 或谷歌云、亚马逊云)。精品公司通常规模较小,提供非常具体的解决方案,并专注于一个狭窄的行业或功能。
****最佳入门:作为一名无名英雄,你最好的选择是加入一般服务公司的数据科学专家行列。走这条路可以让你在第一天就发挥你的优势。
这些公司通常有两条路线:多面手和专家。通才通常对新毕业生、工商管理硕士以及专注于客户和销售的经验丰富的专业人士开放。他们将从事广泛的非数据科学项目或任何他们有深厚关系的领域。相比之下,专家是在各自领域领导深入的技术工作和思想领导的专家。一些高级专家可能有销售目标,但这通常不是重点。
如果多面手是你感兴趣的,你可能需要准备在学习和建立关系网的层面上迈出一步。或者,你真的需要展示你的商业头脑和对关键商业主题的理解(如经济学、市场营销、运营、技术、金融等。)
大型科技公司和精品公司的服务部门并不是最好的首选,因为他们关注的是软件和系统集成。数据科学的工作通常是支持软件的销售,而不是解决一般的问题。
在我的上一篇文章中,可以看到作为一名昂贵的顾问的更多好处和坏处。
目的地 3:人工智能创业
AI 创业的定义很复杂。我通常将它们分为 1)构建人工智能工具的公司,2)在其产品或服务中使用人工智能的公司,以及 3)提供特殊人工智能算法的公司。
对于 AI 工具初创公司,他们通常会构建工具来增强 ML 工作流。大多数人工智能创业公司都属于这一类。这张图是我最喜欢的展示整体景观的方式。

Sergey Karayev 在 2019 年全栈深度学习上的演讲
对于在产品**中使用 AI 的公司,你可以想到早期的优步。他们的主要业务是运输,但他们使用 ML 算法来实现更好的路由、需求匹配和用户体验。**
对于那些为特定用例提供人工智能算法的公司,你可以想到被谷歌收购前的 DeepMind。我想这是大多数人在考虑一家 AI 创业公司的时候想到的,想加入的。不幸的是,这种人不多。
最佳参赛作品:在产品中使用人工智能的公司。同样,你可以在第一天运用你的专业知识,解决真正的 ML 问题。如果你加入了一家新的支付公司,你是一名风险专家,你可以用新的算法和有趣的数据(或者没有数据,取决于公司有多早)建立新的风险模型。这就是创造力和乐趣的来源!
加入一家人工智能工具公司就像加入一家大型科技公司的服务部门。你不会解决实际的数据科学问题,你会花更多的时间为其他数据科学家构建软件工具。您可以构建一个简单的模型作为软件的演示。
祝你好运找到人工智能算法公司。也许你可以在大学的研究实验室里找到它们。如果你找到他们,准备好大幅度减薪和承担责任。任何事情都有成本,包括创业梦想,对吧?
在我的上一篇文章中,可以看到作为一名精通技术的销售和产品嬉皮士工作的更多好处和坏处。
对着镜子深深地凝视

正如 Recode 报道的那样,美国的招聘信息确实在。转贴自这篇 TDS 文章
我们中的许多人可能认识到,现在——在新冠肺炎风暴期间——不是探讨职业转型的最佳时机。我强烈推荐你阅读 Edouard Harris 的这篇文章,它讨论了数据科学就业市场的现状。
我不能(也不想)推测新冠肺炎会议后情况会如何。对我们所有人来说,这是一个深刻、认真照镜子的好时机。我们当前的数据科学角色真的在创造或增加价值吗?如果是的话,我们不用担心,总会有机会。如果不是,爱德华认为,我们如何重塑我们的角色,使其变得真正不可或缺?
我希望这篇文章能提供一些具体的见解,告诉你,一个在大公司管理 ML 的无名英雄,如何凭借你的绝对优势转换到其他角色。一如既往,我乐于接受反馈并乐于交流想法。
直到下一次。
伊恩
喜欢读什么? 跟我上 中LinkedIn,或者Twitter。还有,作为一名数据科学家,要不要学习商业思维和沟通技巧?查看我的《 用机器学习影响 》指南。**
你可能也喜欢:
如何使用 Streamlit 和 DevOps 工具构建和部署 ML 应用程序
towardsdatascience.com](/build-full-stack-ml-12-hours-50c310fedd51) [## 最有用的 ML 工具 2020
每个懒惰的全栈数据科学家都应该使用的 5 套工具
towardsdatascience.com](/the-most-useful-ml-tools-2020-e41b54061c58) [## 被遗忘的算法
用 Streamlit 探索蒙特卡罗模拟
towardsdatascience.com](/how-to-design-monte-carlo-simulation-138e9214910a) [## 数据科学很无聊
我如何应对部署机器学习的无聊日子
towardsdatascience.com](/data-science-is-boring-1d43473e353e) [## 我们应该留在数据科学领域吗?
数据科学家的 4 个现实职业选择
towardsdatascience.com](/the-most-realistic-data-science-career-guide-d12c4af87cc8) [## ML 和敏捷注定的联姻
如何不对 ML 项目应用敏捷
towardsdatascience.com](/a-doomed-marriage-of-ml-and-agile-b91b95b37e35) [## 又一个 AI 冬天?
如何部署更多的 ML 解决方案——五种策略
towardsdatascience.com](/the-last-defense-against-another-ai-winter-c589b48c561)***
最佳文档相似性算法:初学者指南
根据实验从 5 种流行算法中选出赢家

戴维·克洛德在 Unsplash 上的照片
如果你想知道 2020 年文档相似度任务的最佳算法,你来对地方了。
在 33,914 篇《纽约时报》文章中,我测试了 5 种流行的文档相似性算法。它们的范围从传统的统计方法到现代的深度学习方法。
每个实现不到 50 行代码。而且所有用的模型都是从网上拿来的。因此,您将能够在没有任何数据科学知识的情况下使用它,同时期望得到类似的结果。
在这篇文章中,你将学习如何实现每个算法,以及如何选择最好的算法。议程如下:
- 定义最好的;
- 实验目标陈述;
- 数据设置;
- 比较标准;
- 算法设置;
- 挑选获胜者;
- 对初学者的建议;
你想尝试自然语言处理和人工智能。你想用相关的建议来增加用户体验的趣味。您想要升级旧的现有算法。那你一定会喜欢这个帖子。
我们可以开始了吗?
数据科学家主张绝对最好
您决定搜索术语“最佳文档相似性算法”。
然后你会得到从学术论文、博客,到问答的搜索结果,有的侧重于某个具体算法的教程,有的侧重于理论概述。
在学术论文中,一个标题说,这个算法执行了 80%的准确性,击败了所有其他仅实现 75%的准确性。好的。但是这种差异足以让我们的眼睛注意到它吗?2%的涨幅呢?实现这个算法有多容易?科学家们倾向于在给定的测试集中追求最佳结果,而忽略了实际应用。

数据科学家的语言。Src)谷歌研究 BERT 知识库。
在问答中,被炒作的狂热分子主导了对话。有人说今天最好的算法是 BERT。这个算法概念是如此的革命性,它击败了其他一切。另一方面,愤世嫉俗者称一切取决于工作。一些答案来自几年前深度学习之前。看看这个 Stackoverflow 。当 2012 年被投票最多的书出版时,很难判断它对我们真正意味着什么。
谷歌会很乐意投入数百万美元的工程师力量和最新的计算能力,仅仅是为了把他们的搜索提高 1%。这对我们来说既不实际也没有意义。
性能提升和实现所需的技术专长之间的权衡是什么?需要多大的内存?在最少预处理的情况下,它的运行速度有多快?
你想看到的是一种算法在实际意义上如何优于另一种算法。
这篇文章将为您提供一个指南,告诉您下一个文档相似性问题应该使用哪种算法。
多样的算法,全长的流行文章,预训练的模型
本实验有 4 个目标:
- 通过在同一个数据集上运行多个算法,您将会看到哪些算法与另一个算法有冲突,以及冲突的程度。
- 通过使用来自流行媒体的完整长度的文章作为我们的数据集,你将发现现实世界应用的有效性。
- 通过访问文章的网址,你将能够比较结果质量的差异。
- 通过仅使用公开可用的预训练模型,您将能够建立自己的文档相似性并期望类似的输出。
预先训练好的模特是你的朋友
- Cathal Horan ,对讲机中的机器学习工程师
数据设置— 5 篇基础文章
对于这个实验,选择了 33,914 篇纽约时报文章。分别是 2018 年到 2020 年 6 月。这些数据大部分是从 RSS 提要中收集的,并通过完整的内容进行解析。文章的平均长度是 6500 个字符。
从库中,我们选择 5 作为相似性搜索的基础。每个代表一个不同的类别。
在语义类别之上,我们也将测量书写格式。更多的描述在下面。
- 我最糟糕的约会如何变成我最好的 (生活方式,人类兴趣)
- 深海岩浆怪物接受身体扫描 (科学,信息)
- 雷诺和日产在卡洛斯戈恩主政 多年后尝试新的方式【商业、新闻】
- 澳网四分之一决赛多米尼克·蒂姆击败纳达尔 (体育、新闻)
- 2020 年民主党在一个不寻常的地点寻求选民:福克斯新闻频道 (政治、新闻)
判断标准
我们将使用 5 个标准来判断相似性的性质。如果您只想查看结果,请跳过这一部分。
- 标签重叠
- 部分
- 分段
- 故事风格
- 主题
在内容相似性方面,标签是最接近人类判断的代理。记者自己手写下标签。您可以在 HTML 标题中的 news_keywords meta 标记处检查它们。使用标签最大的好处是,我们可以客观地衡量两个内容有多少重叠。每个标签的大小从 1 到 12 不等。两篇文章重叠越多,它们就越相似。
第二,我们看截面。《纽约时报》就是这样在最高层次上对文章进行分类的:科学、政治、体育等。URL 的第一部分在域名(nytimes.com/…)后显示 section(或 slug)。
第二个是小节。例如,意见部分可以细分为世界,或世界到澳大利亚。并不是所有的文章都包含它,也没有其他两篇意义重大。
第四是文风。大多数文档比较分析只关注语义。但是因为我们是在实际用例中比较建议,所以我们也想要相似的写作风格。例如,你不希望在学术期刊的“跑鞋和矫正器”之后看到一篇关于“十大跑鞋”的商业报道。我们将根据杰斐逊县学校教授的写作指南对文章进行分组。该列表遵循人类兴趣、个性、最佳(例如:产品评论)、新闻、操作方法、过去事件和信息。
5 个候选算法
这些是我们将要研究的算法。
- 雅克卡德
- TF-IDF
- Doc2vec
- 使用
- 伯特
每个算法针对 33,914 篇文章运行,以找到得分最高的前 3 篇文章。对每个基础制品重复该过程。
输入的内容是全文的文章内容。标题被忽略。
请注意,有些算法不是为文档相似性而构建的。但是互联网上有这么多不同的意见,我们将亲眼看到结果。
我们不会关注概念上的理解,也不会关注详细的代码审查。相反,我们的目标是展示设置有多简单。如果你不理解这里解释的每一个细节,不要担心。跟帖不重要。为了理解这个理论,可以查看下面的阅读列表,看看其他人写的优秀博客。
你可以在 Github repo 中找到完整的代码库。
如果您只想看到结果,请跳过这一部分。
雅克卡德
保罗·雅克卡德在一个多世纪前提出了这个公式。长期以来,这个概念一直是相似性任务的标准。
幸运的是,你会发现 jaccard 是最容易理解的算法。数学很简单,不需要矢量化。它让你从头开始写代码。
另外,jaccard 是少数不使用余弦相似度的算法之一。它对单词进行标记,并计算并集上的交集。
我们使用 NLTK 对文本进行预处理。
步骤:
- 小写所有文本
- 标记化
- 删除停用词
- 删除标点符号
- 把…按屈折变化形式进行归类
- 计算两个文档的交集/并集
【Jaccard 计算部分的代码片段,其中单词 tokens 是一个字符串列表。
TF-IDF
这是另一个自 1972 年以来就存在于的成熟算法。经过几十年的充分测试,它是 Elasticsearch 的默认搜索实现。
Scikit-learn 提供了 TF-IDF 的现成实现。TfidfVectorizer 让任何人都可以在一眨眼的功夫尝试一下。
TF-IDF 词向量的结果是通过 scikit-learn 的余弦相似度计算的。我们将在其余的例子中使用余弦相似性。余弦相似性是许多机器学习任务中使用的一个如此重要的概念,它可能值得你花时间来熟悉自己(学术概述)。
多亏了 scikit-learn,这个算法产生了最短的代码行。
TF-IDF 的代码片段,其中 base_document 是一个简单的字符串,documents 是一个字符串列表。
Doc2vec
2014 年 Word2vec 问世,让当时的开发者们为之屏息。你可能听说过著名的示威游行:
国王-男人=王后
Word2vec 非常擅长理解单个单词,矢量化整个句子需要很长时间。更不用说整个文档了。
相反,我们将使用 doc 2 vec——一种类似的嵌入算法,将段落而不是每个单词矢量化( 2014,谷歌公司)。以一种更容易理解的方式,你可以看看吉迪·施佩尔的博客中的。
不幸的是,对于 Doc2vec 来说,还没有公司赞助的预训练模型被发布。我们将使用来自的预训练 enwiki_dbow 模型。它是在英文维基百科上训练的(未指明数量,但模型大小为 1.5gb)。
Doc2vec 的官方文档指出,可以插入任意长度的输入。一旦标记化,我们将使用 gensim 库输入整个文档。
doc 2 vec infer _ vector 部分的代码片段。首先预处理单词标记。
通用句子编码器(使用)
这是谷歌最近于 2018 年 5 月发布的一个流行算法(著名的雷·库兹韦尔是该出版物的幕后推手🙃).谷歌的 Tensorflow 很好地记录了实现细节。
我们将使用 Google 最新的官方预训练模型:通用句子编码器 4 。
顾名思义,它是根据一个句子构建的。但是官方文件并没有约束输入大小。没有什么可以阻止我们使用它来完成文档比较任务。
整个文档按原样插入 Tensorflow。没有进行标记化。
变压器的双向编码器表示(BERT)
这是个大人物。Google 在2018 年 11 月开源了 BERT 算法。在接下来的一年中,谷歌负责搜索的副总裁发表了一篇博客文章,称 BERT 是他们在过去 5 年中最大的一次飞跃。
它是专为理解您的搜索查询而构建的。当谈到理解一个句子的上下文时,BERT 似乎比这里提到的所有其他人都要好。
最初的 BERT 任务并不是为了处理大量的文本输入。对于嵌入多个句子,我们会使用 UKPLab(来自德国大学)发布的句子转换器开源项目,其计算速度更胜一筹。他们还为我们提供了一个预训练的模型,与原始模型相当。
所以每个文档都被标记成句子。并且结果被平均以在一个向量中表示文档。
赢家算法
让我们看看每种算法在 5 种不同类型的文章中的表现。我们根据最高分选择前 3 篇文章进行比较。
在这篇博文中,我们将只讨论五种算法中性能最好的算法的结果。关于完整的结果以及单独的文章链接,请参见报告中的算法目录。
1.我最糟糕的约会是如何变成最好的
伯特赢了。
这篇文章是一个有趣的故事,讲述了一个 50 多岁的离婚女人的浪漫约会。
这种文风不带有名人名字之类的特定名词。它也没有时效性。2010 年的一个有趣的人类故事可能与今天同样相关。因此,在比较中没有一个算法差得太远。
这是一次反对使用的千钧一发的机会。虽然一个使用故事迂回到一个社会问题,如 LGBTQ,伯特只专注于浪漫和约会。其他算法转向家庭和孩子的话题,可能是因为看到了“前夫”这个词。

第一篇文章(确定日期)的 BERT 结果—文档相似性实验
2.一只深海岩浆怪兽接受身体扫描
TF-IDF 胜。
这篇科学文章讲述了 3D 扫描海洋中的活火山。
3D 扫描、火山和海洋是罕见的术语,很容易理解。所有算法都很公平。
TF-IDF 正确地选择了那些只谈论地球海洋中火山的文章。USE 是一个很好的竞争者,因为它关注的是火星上的火山,而不是海洋。其他人则选择了与科学无关、与主题无关的关于俄罗斯军用潜艇的文章。

第二篇文章(volcano)的 TF-IDF 结果—文档相似性实验
3.卡洛斯·戈恩统治多年后,雷诺和日产尝试新的方式
TF-IDF 胜。
这篇文章谈到了前首席执行官卡洛斯·戈恩(Carlos Ghosn)逃脱后,雷诺和日产发生了什么。
理想的匹配会谈到这三个实体。与前两篇相比,这篇文章更受事件驱动,对时间更敏感。相关新闻应该发生在类似这个日期或者之后(是从 2019 年 11 月开始)。
TF-IDF 正确地选择了关注日产 CEO 的文章。其他人选择了谈论通用汽车行业新闻的文章,如菲亚特克莱斯勒和标致的联盟。
同样值得一提的是 Doc2vec 和 USE led 得到了完全相同的结果。

第三篇文章(日产)的 TF-IDF 结果—文档相似性实验
4.多米尼克·蒂姆在澳网四分之一决赛中击败纳达尔
Jaccard,TF-IDF 之间的配合和使用。
这篇文章是关于网球运动员多米尼克·蒂姆参加 2020 年澳大利亚网球公开赛的。
新闻是由事件驱动的,对个人来说非常具体。因此,理想的比赛将是多米尼克和澳大利亚网球公开赛。
不幸的是,这一结果因缺乏足够的数据而受到影响。他们都谈论网球。但有些比赛是在说 2018 年法网的多米尼克。或者,关于澳大利亚网球公开赛的罗杰·费德勒。
结果是三种算法打成平手。这说明了至关重要的一点:我们需要尽最大努力收集、多样化和扩展数据池,以获得最佳的相似性匹配结果。

第 4 篇文章(网球)的 Jaccard 结果—文档相似性实验
5.2020 年,民主党在一个不寻常的地方寻找选民:福克斯新闻频道
使用 wins。
这篇文章是关于民主党的,特别关注伯尼·桑德斯出现在福克斯新闻频道参加 2020 年选举。
每一个主题本身都可以很大。有大量关于民主党候选人和选举的文章。由于故事的主旨是新奇的,我们优先考虑那些讨论民主党候选人和福克斯关系的故事。
旁注:在实践中,你要小心政治上的建议。将自由派和保守派的新闻混在一起很容易让读者心烦。因为我们是单独与《纽约时报》打交道,所以这不是我们所关心的。
使用找到的关于伯尼·桑德斯和电视电缆的文章,如福克斯和 MSNBC。其他人挑选了讨论 2020 年选举中其他民主党候选人的文章。这些被认为过于笼统。

使用第五篇文章(Fox)的结果—文档相似性实验
速度之王
在得出获胜者之前,我们需要谈谈表演时间。就速度而言,每种算法的表现都大不相同。
结果是 TF-IDF 的实现比其他任何方式都要快。从头到尾在单个 CPU 上计算 33,914 个文档(标记化、矢量化和比较),需要:
- TF-IDF: 1.5 分钟。
- 雅克卡德:13 分钟。
- Doc2vec: 43 分钟。
- 使用时间:62 分钟。
- 伯特:50 多个小时(每个句子都被矢量化)。
TF-IDF 只用了一分半钟。这是实际使用量的 2.5%。当然,您可以合并多个效率增强。但是潜在的收益需要首先考虑讨论。这给了我们另一个理由去认真考虑开发难度的权衡。
这是每篇文章中的优胜算法。
- 伯特
- TF-IDF
- TF-IDF
- Jaccard、TF-IDF 和 USE 之间的联系
- 使用
从结果来看,我们可以说,对于新闻文章中的文档相似性,TF-IDF 是最佳候选。如果您在使用它时只做了最少的定制,那就更是如此。同样令人惊讶的是,TF-IDF 是发明的第二古老的算法。相反,你可能会失望,现代最先进的人工智能深度学习在这项任务中没有任何意义。
当然,每种深度学习技术都可以通过训练自己的模型,更好地预处理数据来提高。但都伴随着开发成本。你需要努力思考相对于简单的 TF-IDF 方法,这种努力会带来怎样的好处。
最后,公平地说,我们应该完全忘记 Jaccard 和 Doc2vec 的文档相似性。与今天的替代方案相比,它们没有带来任何好处。
新手建议
假设您决定从头开始在应用程序中实现相似性算法,以下是我的建议。
1.首先实施 TF-IDF
尽管深度学习大肆宣传,文档相似性匹配的艺术状态开箱即用是 TF-IDF。它给你一个高质量的结果。最棒的是,它快如闪电。
正如我们所见,将其升级到深度学习方法可能会也可能不会给你带来更好的性能。必须事先进行大量的思考来计算权衡。
2。积累更好的数据
吴恩达在 2017 年给出了一个类比“数据是新的石油”。你不能指望你的汽车不用油就能行驶。而且油必须是好的。
文档相似性依赖于数据多样性,也依赖于特定的算法。你应该尽最大努力寻找独特的数据,以提高你的相似性结果。
3.升级到深度学习
仅当您对 TF-IDF 的结果不满意时,才迁移到 USE 或 BERT。建立数据管道并升级您的基础设施。你将需要考虑到爆炸计算时间。您可能需要对单词嵌入进行预处理,这样就可以在运行时更快地处理相似性匹配。谷歌写了一个关于这个话题的教程。
4.调整深度学习算法
你可以慢慢升级你的模型。训练你自己的模型,将预训练适应特定的领域,等等。现在也有很多不同的深度学习模型。你可以一个一个的试,看看哪个最符合你的具体要求。
文档相似性是许多 NLP 任务之一
你可以用各种算法实现文档相似性:一些是传统的统计方法,另一些是尖端的深度学习方法。我们已经在真实世界的《纽约时报》文章中看到了它们之间的比较。
使用 TF-IDF,您可以在本地笔记本电脑上轻松启动自己的文档相似性。不需要花哨的 GPU。不需要大的存储器。有了高质量的数据,你还是会得到有竞争力的结果。
诚然,如果你想做情感分析或分类等其他任务,深度学习应该适合你的工作。但是,尽管研究人员试图推动深度学习效率和性能的边界,但我们所有人都生活在炒作循环中并不健康。这给新来者带来了巨大的焦虑和不安全感。
保持经验主义可以让我们着眼于现实。
希望这个博客已经鼓励你开始你自己的 NLP 项目。
让我们开始动手吧。
这篇文章是结合我正在做的 Kaffae 项目的文档集群而写的。沿着这条思路,我计划做另一个关于句子相似性的系列。
敬请期待😃
延伸阅读
- 一篇包含 TF-IDF 和余弦相似度的文章,并附有实例:“Python 中文本相似性度量的概述”。
- 一篇讨论余弦相似度如何用于各种 NLP 机器学习任务的学术论文:“余弦相似度”。
- 不同算法中句子相似度的讨论:“文本相似度:估计两个文本的相似程度”。
- 文本分析中各种深度学习模型的考察:“何时不选择最佳 NLP 模型”。
- 概念上深入到 BERT 模型中:对基于 BERT 的模型的回顾。
- 文档嵌入的文献综述:文档嵌入技术
最佳地球观测数据科学工具包
面向地理空间/地球观测数据科学家的平台、工具和软件包

美国地质勘探局在 Unsplash 上拍摄的照片
由于遥感平台的技术发展以及数据收集和存储的突破,基于卫星的地球观测数据正在快速增长。今天,我们在轨道上有超过 768 颗地球观测卫星,而 2018 年只有 150 颗。
作为地理空间或地球观测数据科学家,您有大量的工具和资源可供选择。在本文中,我重点介绍了市场上集成到数据科学生态系统中的最佳开源工具。
1.谷歌地球引擎(GEE)
我们的愿望实现了。GEE 都在一个包里。谷歌地球引擎(GEE)是迄今为止为地球观测数据科学家提供的最完整的软件包。它不仅提供地理空间数据处理和分析能力,而且还提供现成的数据集,专注于分析而不是下载数据。
借助 GEE,您可以利用来自 NASA/USGS (Landsat、MODIS)、欧盟(Sentinel 1 & 2)的免费卫星图像以及非卫星或衍生产品(如高程、气候数据和土地覆盖)进行行星级分析。
Google Earth Engine (GEE)拥有 Javascript 和 Python APIs 的全功能开发环境,是地球观测数据科学家/分析师的重要武器库。它还带有代码编辑器(Javascript ),您可以在浏览器中运行您的分析和可视化。
此外,您可以使用 GEE 创建机器学习模型,并可以在浏览器中生成完整的 ML 模型和预测。python 模块与其他 python 包集成得很好,你可以在 Jupyter 笔记本或 Google Colab 中运行。
这就对了 GEE 中完整的端到端功能,包含数 TB 的卫星图像源、数据处理工具和 ML 算法,就在您的浏览器中。
这再好不过了!
2.EO-学习
运行在 CPU/GPU 上的大规模地球观测管道。EO-Learn 是一个 python 包,它将数据科学和机器学习 Python 生态系统与遥感/地球观测社区紧密联系在一起。有了 eo-learn,即使非专家也可以从卫星图像中提取有价值的信息。
它还使地球观测专家能够高效地携带最先进的深度学习和计算机视觉模型。
Eo-learn 建立在 Numpy 数组和匀称的几何图形上,因此地理空间数据科学家感觉就像在家里一样。通过使用 Geopandas 的边界框,eo-learn 可以在您的环境中下载卫星图像,然后再进行任何分析。
不仅 eo-learn 使您能够执行 ML 和深度学习模型,而且它还具有用于批处理、掩蔽、IO 功能以及几何变换和矢量与光栅数据之间的转换的模块。
使用 eo-learn,您可以创建管道来执行批处理和多批处理,这些批处理可以在并行 GPU/GPU 上运行以进行繁重的处理。例如,该管道为 200,000 km2 阵列的一系列任务运行 12 小时,以执行整个国家的土地覆盖分类。
辐射中心
F 对于地球观测和机器学习, Radiant MLHub 提供随时可用和开源的地球观测训练数据集。他们目录中的所有数据集都符合时空资产目录(STAC) 的要求,并且该列表还在增长——目前已有 14 个数据集可用。
训练数据集涵盖了不同的机器学习应用,包括图像分类、分割和对象检测。这里提供的流行的 ML 地球观测训练数据集包括 SpaceNet、BigEarthNet 和 LandCoverNet。
任何人都可以通过 API 免费访问这些数据。关于如何访问不同数据集的 Jupyter Notebook 示例可在 MLHub 教程资源库中找到。
打开数据立方体
作为一个平台和开源地理空间数据管理工具, Open Data Cube 提供了对大量地球观测数据的简单和开放的数据访问。Python API 使地球观测分析师能够高性能地查询和访问数据,允许他们对存储的数据进行国家级到洲级的处理。
开放数据立方体目前支持数字地球澳大利亚和非洲区域数据立方体,并且还为它们的用户提供教程、指南、文档。
他们还提供了一个慷慨的免费 ODC 沙盒 (16 GB 内存),里面有预配置的 Jupyter 笔记本,你可以在云上运行,无需配置和安装。有了这个功能,许多地球观测发现开始分析数十亿字节的数据变得很容易,而不用担心软件。
这些平台使成千上万的地球观测数据科学家能够完成日常任务。虽然其中一些工具包可以独立使用,也可以在完整的端到端管道中使用,但我倾向于将它们与其他地理空间/地球数据科学包和库一起使用。
因此,我将通过提供我最常用的处理地球观测数据集的包来结束本文,您可能会发现这些包很有用。
- Rasterio:一个必不可少的轻量级灵活的遥感影像读写 Python 包。
- 白盒工具: 是一种高级地理空间数据分析工具,包括大量图像处理任务,如图像增强、过滤操作、聚类算法和其他图像处理功能,如水文和地貌分析。它可以有效地处理激光雷达数据,使您能够分割、分块或连接栅格激光雷达数据并获取输出。
- EarthPy: 这是一个 python 包,使用开源工具可以更容易地绘制和处理空间栅格和矢量数据。EarthPy 弥合了栅格数据和矢量数据之间的差距,因此您可以在两种不同的数据类型之间有效地工作。
- GDAL:GDAL 是大多数地球观测用户使用的可爱工具。这是一个光栅和矢量地理空间数据格式的翻译库,并提供了大量的卫星图像处理工具。
- PDAL:是点数据抽象库。PDAL 的重点是激光雷达数据,但也提供其他工具。它还通过 Numpy 提供了一个简单的 python 绑定,支持使用 Jupyter notebooks 和 python 等地球观测工具。
最后的想法
我们生活在地球观测的黄金时代。我们不仅见证了太空和空中探险的突破,而且拥有难以置信的资源来分析和研究地球及其环境。这些平台使地球观测数据科学家能够研究气候、天气、农业、交通和基础设施以及自然灾害。
虽然列表并不广泛,但我相信这些是最好的资源。如果你认为,我已经离开了一些你最喜欢的工具;请让我知道。
熊猫图谱的最佳探索性数据分析
一行代码解决你所有的 EDA 问题。

熊猫简介报告相关性示例。作者截图[1]。
目录
- 介绍
- 概观
- 变量
- 相互作用
- 相关
- 缺少值
- 样品
- 摘要
- 参考
介绍
在 Python ( 和 R )中有无数种方法可以执行探索性数据分析(EDA)。我大部分都是在流行的 Jupyter 笔记本上写的。一旦我意识到有一个库可以用一行代码总结我的数据集,我就确保在每个项目中都使用它,从这个 EDA 工具的易用性中获得无数好处。在为所有数据科学家执行任何机器学习模型之前,应该首先执行 EDA 步骤,因此,来自Pandas Profiling【2】的善良而聪明的开发人员使得以漂亮的格式查看数据集变得很容易,同时也很好地描述了数据集中的信息。
Pandas Profiling report 是一款出色的 EDA 工具,可以提供以下好处:概述、变量、交互、相关性、缺失值和数据样本。我将使用随机生成的数据作为这个有用工具的例子。
概观

概述示例。作者截图[3]。
报告中的 overview 选项卡可以快速查看您有多少变量和观察值,或者行数和列数。它还将执行一个计算,以查看与整个 dataframe 列相比,您缺少了多少个单元格。此外,它还会指出重复的行并计算百分比。这个标签最类似于熊猫的描述功能的一部分,同时提供了更好的用户界面 ( UI )体验。
概述分为数据集统计数据和变量类型。您也可以参考警告和复制,以获得有关您的数据的更具体的信息。
我将讨论变量,变量也被称为数据框架的列或特征
变量

变量示例。作者截图[4]。
要在描述性统计数据中获得更多的粒度,可以使用 variables 选项卡。您可以查看数据框要素或变量的不同、缺失、聚合或计算,如平均值、最小值和最大值。您还可以看到您正在处理的数据类型(,即 NUM )。当你点击切换细节时,图中未显示。这种切换会提示大量更有用的统计信息。详细信息包括:
统计—分位数和描述性
分位点
Minimum
5th percentile
Q1
Median
Q3
95th percentile
Maximum
Range
Interquartile range (IQR)
描述的
Standard deviation
Coefficient of variation (CV)
Kurtosis
Mean
Median Absolute Deviation (MAD)
Skewness
Sum
Variance
Monotonicity
这些统计数据也提供了与我今天看到的大多数数据科学家使用的 describe 函数类似的信息,然而,还有更多,它以一种易于查看的格式呈现它们。
直方图
直方图为您的变量提供了一个易于理解的视觉效果。您可以在 y 轴上看到变量的频率,在 x 轴上看到固定大小的箱(箱=15 是默认的)。
常用值
公共值将为您的变量提供最常见的值、计数和频率。
极值
极值将提供数据帧的最小值和最大值中的值、计数和频率。
相互作用

互动示例。作者截图[5]。
概要分析报告的交互功能是独一无二的,因为您可以从您的列列表中选择位于提供的 x 轴或 y 轴上。比如上图是变量 A 对变量 A ,这就是你看到重叠的原因。您可以轻松地切换到其他变量或列,以实现不同的绘图和数据点的出色表示。
相关

相关性示例。作者截图[6]。
有时,如果你是从逐行 Python 代码中制作相关图,制作更花哨或更多彩的相关图可能会很耗时。然而,有了这个关联图,您可以很容易地将数据中变量之间的关系可视化,这也是很好的颜色编码。您可以显示四个主要图:
- 皮尔森的 r
- 斯皮尔曼的ρ
- 肯德尔的τ
- Phik (φk)
您可能只习惯于这些关联方法中的一种,因此其他方法可能听起来令人困惑或不可用。因此,关联图还提供了一个切换按钮,用于显示每个关联的详细含义——当您需要复习关联时,以及当您决定使用哪个图( s )进行分析时,该功能非常有用
缺少值

缺失值示例。作者截图[7]。
从上面的图中可以看出,报告工具也包括缺失值。您可以看到每个变量丢失了多少,包括计数和矩阵。在使用数据执行任何模型之前,这是一种可视化数据的好方法。您可能更希望看到类似上面的图,这意味着您没有丢失值。
样品

样本示例。作者截图[8]。
Sample 的行为类似于 head 和 tail 函数,它返回数据帧的前几行或最后几行。在本例中,您还可以看到第一行和最后一行。当我想知道我的数据从哪里开始,从哪里结束时,我会使用此选项卡—我建议进行排名或排序,以查看此选项卡的更多好处,因为您可以通过直观的相应表示来查看数据的范围。
摘要

Elena Loshina 在Unsplash【9】上拍摄的照片。
我希望这篇文章为您接下来的探索性数据分析提供一些启发。成为一名数据科学家可能令人不知所措,EDA 经常被遗忘,或者不像建模那样经常被实践。使用 Pandas Profiling 报告,您可以用最少的代码执行 EDA,同时提供有用的统计数据和可视化。这样,你就可以专注于数据科学和机器学习的有趣部分,即模型过程。
总之,Pandas Profiling 报告的主要功能包括概述、变量、交互、相关性、缺失值和数据样本。
下面是我用来安装和导入库的代码,以及为这个例子生成一些虚拟数据的代码,最后,这一行代码用来根据您的 Pandas dataframe [10]生成 Pandas Profile 报告。
# install library
#!pip install pandas_profilingimport pandas_profiling
import pandas as pd
import numpy as np# create data
df = pd.DataFrame(np.random.randint(0,200,size=(15, 6)), columns=list('ABCDEF'))# run your report!
df.profile_report()# I did get an error and had to reinstall matplotlib to fix
如果您有任何问题或者以前使用过这个功能,请随时在下面评论。还有一些信息我没有描述,但是你可以在我上面提供的链接中找到更多的信息。
谢谢你的阅读,希望你喜欢!
参考
[1] M.Przybyla,熊猫简介报告相关性示例的截图,(2020 年)
[2] pandas-profiling, GitHub 文档和所有贡献者,(2020)
[3] M.Przybyla,概览示例截图,(2020 年)
[4] M.Przybyla,变量示例截图,(2020 年)
[5] M.Przybyla,互动实例截图,(2020 年)
[6] M.Przybyla,相关性示例截图,(2020 年)
[7] M.Przybyla,缺失值示例的屏幕截图,(2020 年)
[8] M.Przybyla,示例截图,(2020 年)
[9]Elena Loshina 在 Unsplash 上拍摄的照片,(2018)
[1] M.Przybyla,熊猫概况报告代码示例,(2020)
Geopandas 0.8.0 版本的最佳特性
使用 PyGeo 加速地理空间操作,使用示例代码改进 IO

来自画布的基本图像(用画布创建)
我喜欢在我的地理空间数据科学项目中使用 Geopandas 。多亏了它的开发者,Geopandas 在每个版本中都变得更好。如果您曾经处理过地理空间矢量数据,那么您很可能使用过 Geopandas。
在最新的 0.8.0 版本中,有很多改进和错误修复。特别是,我对 PyGEOS 集成加速地理空间操作感到兴奋。虽然这还处于实验阶段,但我已经看到了使用这个选项对 Geopandas 的一些改进。
此版本中还有许多 IO 增强功能,包括 PostGIS 改进以及大量新的 IO 功能,包括 GeoFeather 和 Parquet 数据类型。
在本文中,我将通过一些代码示例介绍这两个特性,PyGEOS 集成和 IO 增强。
PyGEOS 选项
Geopandas 作为空间操作的默认后端仍然是 Shapely,但是您可以选择使用 PyGeos 来加速地理空间过程。
PyGEOS 是一个带有矢量几何函数的 C/Python 库。几何操作在开源几何库 GEOS 中完成。PyGEOS 将这些操作包装在 NumPy ufuncs 中,在操作几何数组时提供了性能改进。— PyGE OS
根据官方发布,PyGeos 集成是试验性的,仅支持 Geopandas 中可用的一些空间操作。然而,它已经改善并加速了我经常使用的一些空间处理。我用空间连接操作对它进行了测试,这是空间数据的基本空间操作之一。
我将使用著名的纽约市出租车数据的子集,其中包含 160 万行和出租车区域多边形,以找出每个点在哪个多边形内。结果是使用 PyGEOS 和不使用 py geos 在运行时间上略有改进。
没有 PyGEOS 的空间连接
import geopandas as gpd
import time# Set PyGEOS to False
gpd.options.use_pygeos = False
print(gpd.options.use_pygeos)# Read the data
gdf = gpd.read_file(“data/taxidata.shp”)
zones = gpd.read_file(“data/taxizones.shp”)# Spatial Join
start_time = time.time()
sjoined = gpd.sjoin(gdf, zones, op=”within”)
print(“It takes %s seconds” % (time.time() — start_time))
如果没有 PyGEOS 选项,完成该过程需要 1.8 秒。同样的代码在 Geopandas 0.7.0 中运行的时间要长得多。同样的数据和代码需要两分钟以上。因此,即使不显式使用 PyGeos,总体上也有所改进。向开发商致敬。
使用 PyGEOS 的空间连接
让我们也使用 PyGEOS 进行测试,并使用 PyGEOS 中的矢量化几何操作运行相同的代码。要使用可选的 PyGEOS,只需将 use_pygeos 设置为 True。请注意,您需要在读取数据之前执行此操作。
# Set PyGEOS to True
gpd.options.use_pygeos = True
print(gpd.options.use_pygeos)# Read the data
gdf = gpd.read_file(“data/taxidata.shp”)
zones = gpd.read_file(“data/taxizones.shp”)# Spatial Join
start_time = time.time()
sjoined = gpd.sjoin(gdf, zones, op=”within”)
print(“It takes %s seconds” % (time.time() — start_time))
使用 PyGEOS 在运行时间上略有改进。当 use_pygeos 设置为 True 时,该过程只需 0.84 秒。虽然这是一个显著的改进,并且当应用于更大的数据集时会成倍增加,但我对从 Geopandas 0.7.0 到 Geopandas 0.8.0 的整体发展印象深刻。
IO 增强
此版本中还有许多输入/输出增强功能,这使得实时地理空间数据科学家可以轻松地在不同的数据格式之间转换和工作。
波斯特吉斯
在早期版本的 Geopadnas 中,可以读取 PostGIS 数据;但是,无法将数据写入 PostGIS。有了这个版本。可以将地理数据框写入 PostGIS 数据库。
新的GeoDataFrame.to_post()方法是一项出色的功能,可促进地理数据框架和 PostGIS 之间的完全可移植性。要使用此功能,您需要安装 SQLAlchemy 和 GeoAlchemy2,以及一个 PostgreSQL Python 驱动程序(例如 psycopg2)。
例如,如果我们想要编写上面使用的 Taxi 地理数据框架,我们只需要使用 alchemy 创建一个引擎。
import geopandas as gpd
from sqlalchemy import create_engineengine = create_engine(f'postgresql://{user}:{password}@localhost:5432/database_name?gssencmode=disable')gdf.sample(1000).to_postgis("taxi", engine)
数据顺利地转移到邮政地理信息系统。我也对这个选择感到非常兴奋。它为使用 PostGIS 的强大功能以及 Pandas 和 Geopandas 处理 Python 中的数据提供了新的可能性。
地质羽毛
我已经在另一篇文章中介绍了 GeoFeather 及其读写地理数据的速度。
关于如何用代码加速地理空间数据处理的提示和技巧
towardsdatascience.com](/accelerate-geospatial-data-science-with-these-tricks-752d8b4e5381)
在 Geopandas 0.8.0 版本中,您无需安装 GeoFeather Python 库即可使用它。它与 Geopandas 集成在一起,您无需安装其他库就可以使用它。
您可以使用GeoDataFrame.to_feather()将地理数据框架写入 GeoFeather 格式。也可以用gpd.from_feather()读取 GeoFeather 格式数据。
其他人
- 在此版本中,Geopandas 中也提供了拼花支持。您可以使用
gpd.read_parquet()读写拼花数据,也可以使用GeoDataFrame.to_parquet()将地理数据框本地存储为拼花。 - 在
geopandas.read_postgis中还有一个新的chunksize关键字,可以成块地读取查询。这一增加将有助于高效地读取大型数据集。
结论
在本文中,我们介绍了 Geopandas 0.8.0 版本中的新特性和改进。我们已经看到的特性包括 PyGEOS 集成、PostGIS 编写以及 Feather 和 Parquet IO 添加。
我希望你和我一样对这个版本感到兴奋。它带来了许多功能,使您作为地理空间分析师的生活变得更好。在本文中,我只提到了我感兴趣的几个特性,但是还有一些您可能感兴趣的特性,我在本文中没有提到。请随意访问这里的发布说明。
有抱负的数据科学家的最佳(免费)数据仓库
可以想象的任何行业的数据快速参考指南

本周早些时候,谷歌宣布其数据集搜索引擎现已停止测试。这是世界的一大成就,也是 2020 年任何有抱负的数据科学家的无价工具。
为了纪念这条新闻,我想我应该把我过去使用过的最喜欢的数据仓库列表放在一起,为所有有抱负的数据科学家创建一个快速参考指南。无论你想进入什么行业,这里肯定有适合你的数据集:)
Awesome Public Datasets 是 GitHub 上一个高质量的以主题为中心的公共数据源的存储库。它们是从博客、回答和用户回复中收集和整理的。几乎所有这些都是免费的,除了个别例外
《日期是复数》是一份有用/有趣数据集的每周时事通讯。你可以在他们的谷歌文档中找到大量的数据集档案。只需按下 ctrl + f 键找到你想研究的主题,就会看到弹出的几十个结果。
Data World 是一个开放的数据存储库,包含由世界各地成千上万的用户和组织提供的数据。
我喜欢这个网站是因为它包含了很难找到的数据。特别是,医疗保健领域是更难获得公开可用数据的行业之一(出于隐私考虑)。但是幸运的是,数据世界有 3667 个免费的健康数据集,你可以在你的下一个项目中使用。
一个数据集搜索引擎…由谷歌提供动力。无需进一步解释。
Kaggle 使数据科学家和其他开发人员能够参与运行机器学习竞赛,编写和共享代码,并托管数据集。Kaggle 上发布的数据科学问题的类型可以是任何东西,从试图通过检查患者记录来预测癌症的发生,到分析电影评论引起的情绪以及这如何影响观众的反应。
这个存储库主要用于数据可视化,但我认为他们做的事情很有趣。
“改头换面星期一”是 2016 年第一周开始的一项倡议,由安迪·克里贝尔(英国信息实验室负责人蔻驰— @ vizwizbi )和安迪·科特格里夫(Tableau 福音传道者— @ acotgreave )发起。
每周,通常是在周日,Andy K 会(通过博客和 twitter)发布一个原始的可视化“制作”。有些很糟糕,有些已经很棒了,在这种情况下,挑战在于从不同的角度呈现原作
完成后,使用标签#改头换面星期一,发布一个可视化和/或图片的链接。所有单独的截图被编辑成一个大的组合可视化拼贴画
共享、查找和讨论数据集的地方。您可以向其他订阅者请求数据集,也可以分享和贡献您自己的数据集。
UCI 机器学习知识库是由机器学习社区用于机器学习算法的经验分析的数据库、领域理论和数据生成器的集合。这个档案是 1987 年由加州大学欧文分校的大卫·阿哈和其他研究生创建的 ftp 档案。从那时起,它就被世界各地的学生、教育工作者和研究人员广泛用作机器学习数据集的主要来源。作为档案影响的一个标志,它被引用了 1000 多次,使其成为所有计算机科学中被引用次数最多的 100 篇“论文”之一。
根据 2013 年联邦开放数据政策的条款,新生成的政府数据需要以开放的机器可读格式提供,同时继续确保隐私和安全。
暂时就这些了。请随意将这篇文章加入书签,并将其作为您数据研究的快速参考。
我错过了你最喜欢的知识库吗?让我知道下面,这样我就可以把它添加到指南。下次见,祝大家编码愉快。

我叫 Kishen Sharma,是一名数据科学家,在旧金山湾区工作。我创建内容来教育和激励全世界有抱负的数据科学家。
请随时在 Instagram 上与我联系,并在这里查看我的附加内容。你也可以在这里查看我的其他文章。
最佳免费数据科学电子书— 2020 年更新
理论、代码和练习

作者图片(布伦达·哈利)
我们处在一个不断发展的行业,学习资源是无限的。
去年,我收集了一些电子书,这些书在我的数据科学学习道路上帮助了我,并且被导师和教授推荐来解决特定的项目或深化概念。
随着我花时间深化我的学习,我发现了我在之前没有推荐过的新书,或者发现了我推荐过的所有书的更新。所有的电子书在法律上都是免费的,或者是“想付多少就付多少”的概念,最低价格是 0 美元。
如果你喜欢一本书,并且你有资源这样做,我建议你寻找一种方式来支持作者,通过购买印刷版本,在 Patreon 上支持他们,或者给他们买一杯咖啡。
让我们为大众提供高质量的教育内容。
免责声明:Python 和有时 R 是我最喜欢的编程语言,这也是为什么大多数书都是基于这些语言的原因。如果你有其他语种的其他书籍的推荐,请在评论里分享或者 给我发个 tweet 我会补充的。
概率与统计
- open intro Statistics(2019)作者大卫·迭斯,米恩·切廷卡亚-伦德尔,克里斯多佛·巴尔,以及 OpenIntro
描述:一个完整的统计学基础,也是数据科学的基础。OpenIntro Statistics 提供了大学水平的统计学的传统介绍。这本教科书在大学里被广泛使用,为从社区大学到常春藤联盟的学生提供了一个特别的和容易理解的介绍。
一个完整的统计学基础,也是数据科学的基础。Leanpub 收入支持 OpenIntro…
leanpub.com](https://leanpub.com/openintro-statistics)
- 概率介绍——2019 年哈佛统计 110 z 官方书籍,作者约瑟夫·k·布利茨坦和杰西卡·黄
本书提供了理解统计、随机性和不确定性的基本语言和工具 。这本书探索了各种各样的应用和例子,从巧合和悖论到谷歌 PageRank 和马尔可夫链蒙特卡罗(MCMC)。探索的其他应用领域包括遗传学、医学、计算机科学和信息论。
作者以通俗易懂的方式呈现材料,并使用真实世界的例子激发概念。做好准备,这是一本大书!。

图片由 probabilitybook.net 拍摄
此外,查看他们的大概率备忘单:
这是一份 10 页的概率备忘单,由乔教授的哈佛概率导论课程汇编而成
www.wzchen.com](http://www.wzchen.com/probability-cheatsheet)
- 概率规划&黑客的贝叶斯方法(2020) 作者 Cam Davidson-Pilon
描述:面向黑客的贝叶斯方法旨在从计算/理解第一,数学第二的角度介绍贝叶斯推理。当然,作为一本入门书,我们也只能到此为止:一本入门书。对于受过数学训练的人来说,他们可能会对这篇文章产生的好奇心和其他用数学分析设计的文章产生兴趣。对于数学背景不太好的爱好者,或者对数学不感兴趣,而只是对贝叶斯方法的实践感兴趣的人来说,这篇文章应该是足够的和有趣的。
贝叶斯方法是推理的自然方法,但它隐藏在慢…
camdavidsonpilon.github.io](http://camdavidsonpilon.github.io/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers/)
使用 TensorFlow repo 查看他们令人惊叹的 Github:
使用 Python 和 PyMC,贝叶斯方法是推理的自然方法,但它对读者来说是隐藏的…
github.com](https://github.com/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers)
- 数据科学家实用统计(2017) 作者:Peter Bruce 和 Andrew Bruce
描述:这本书的目标读者是对 R 编程语言有所了解,并且之前接触过统计学(也许是零星的或短暂的)的数据科学家。我们都是从统计世界来到数据科学世界的,所以我们对统计能够为数据科学艺术做出的贡献有所了解。与此同时,我们很清楚传统统计学教学的局限性:统计学作为一门学科已经有一个半世纪的历史,大多数统计学教科书和课程充满了远洋客轮的动力和惯性。
编程
- Roger d. Peng 的数据科学编程
描述:这本书为您带来了 R 编程的基础,使用了作为行业领先的 Johns Hopkins 数据科学专业的一部分开发的相同材料。本书教授的技能将为您开始学习数据科学奠定基础。
这本书给你带来了 R 编程的基础知识,使用了与……
leanpub.com](https://leanpub.com/rprogramming)
- 用 R 进行探索性数据分析
描述:这本书教你使用 R 有效地可视化和探索复杂的数据集。探索性数据分析是数据科学过程中的一个关键部分,因为它允许您明确您的问题并改进您的建模策略。这本书是基于行业领先的约翰霍普金斯数据科学专业。
这本书教你使用 R 有效地可视化和探索复杂的数据集。探索性数据分析是一种…
leanpub.com](https://leanpub.com/exdata)
- 命令行中的数据科学(2020) 作者耶鲁安·扬森斯
描述:本书从网站、API、数据库和电子表格中获取数据
- 对文本、CSV、HTML/XML 和 JSON 执行清理操作
- 浏览数据,计算描述性统计数据,并创建可视化效果
- 管理您的数据科学工作流
- 从一行程序和现有的 Python 或 R 代码中创建可重用的命令行工具
- 并行化和分布数据密集型流水线
- 使用降维、聚类、回归和分类算法对数据建模
[## 命令行中的数据科学,1e
本实践指南演示了命令行的灵活性如何帮助您成为一个更高效的…
www.datascienceatthecommandline.com](https://www.datascienceatthecommandline.com/1e/)
- Python 3 101 (2019 —更新)作者:Michael Driscoll
描述:从头到尾学习如何用 Python 3 编程。Python 101 从 Python 的基础开始,然后在您从那里学到的基础上进行构建。这本书的读者主要是过去做过编程,但想学习 Python 的人。除了初级材料,这本书还涵盖了相当数量的中级材料。
https://python101.pythonlibrary.org/
- Steven Bird、Ewan Klein 和 Edward Loper 用 Python 进行自然语言处理
描述:这本书是 NLP 的实用介绍。你将通过实例学习,编写真正的程序,并理解通过实现来测试一个想法的价值。如果你还没有学过,这本书会教你编程。与其他编程书籍不同,我们提供了 NLP 的大量插图和练习。我们采用的方法也是有原则的,因为我们涵盖了理论基础,并且不回避仔细的语言和计算分析。我们试图务实地在理论和应用之间取得平衡,找出联系和矛盾。最后,我们认识到,除非它也是令人愉快的,否则你不会通过它,所以我们试图包括许多有趣和娱乐性的应用和例子,有时是异想天开的。
[## NLTK 图书
Steven Bird、Ewan Klein 和 Edward Loper 这本书的 NLTK 版本针对 Python 3 和 NLTK 3 进行了更新。第一个…
www.nltk.org](https://www.nltk.org/book/)
- 海量数据集挖掘(2019) 作者Jure Leskovec(斯坦福大学)、Anand Raja Raman(rocket ship Ventures)、Jeffrey D. Ullman(斯坦福大学)
描述:这本书专注于大量数据的数据挖掘,也就是说,数据大到主存都装不下。因为强调大小,他们的很多例子都是关于 Web 或者从 Web 派生的数据。此外,该书从算法的角度出发:数据挖掘是将算法应用于数据,而不是使用数据来“训练”某种机器学习引擎。
- 机器学习的向往(2016) 作者吴恩达
描述:人工智能正在改变众多行业。机器学习向往,教你如何构造机器学习项目。
这本书的重点不是教你 ML 算法,而是如何让 ML 算法发挥作用。读完《机器学习向往》,你就能:
- 优先考虑人工智能项目最有前途的方向
- 诊断机器学习系统中的错误
- 在复杂设置中构建 ML,例如不匹配的训练/测试集
- 建立一个 ML 项目来比较和/或超越人类水平的绩效
- 知道何时以及如何应用端到端学习、迁移学习和多任务学习。
人工智能正在改变众多行业。来自吴恩达的免费电子书《机器学习向往》教你如何…
www.deeplearning.ai](https://www.deeplearning.ai/machine-learning-yearning/)
领导数据科学团队
- 高管数据科学(2018) 作者:布莱恩·卡弗、罗杰·d·彭和杰弗里·莱克
描述:这本书教你如何组建和领导一个数据科学企业,以便你的组织能够从大数据中提取信息。
这本书教你如何组装和领导一个数据科学企业,使您的组织可以走向…
leanpub.com](https://leanpub.com/eds)
有没有另一本电子书必须在这个列表中?请在评论中与我分享,或者给我发一条推文【https://twitter.com/brendahali
邮件分类的最佳机器学习算法
实施机器学习算法对电子邮件进行分类
邮件分类是一个机器学习问题,属于监督学习的范畴。

这个电子邮件分类的迷你项目的灵感来自 J.K .罗琳以笔名出版的一本书。Udacity 的“机器学习简介”提供了对算法和项目的全面研究。
机器学习是当今数据分析领域最令人兴奋的职业的头等舱门票。作为数据源…
www.udacity.com](https://www.udacity.com/course/intro-to-machine-learning--ud120)
几年前,罗琳以罗伯特·加尔布雷斯的名字写了一本书,书名是《布谷鸟的呼唤》。这本书获得了一些好评,但没有人太关注它——直到 Twitter 上的一位匿名线人说这是 J.K .罗琳。伦敦《星期日泰晤士报》邀请了两位专家将《布谷鸟》的语言模式与罗琳的《偶然的空缺》以及其他几位作者的书进行比较。在他们的分析结果强烈指向罗琳是作者后,时报直接问出版商他们是否是同一个人,出版商证实了。这本书一夜之间大受欢迎。
电子邮件分类基于相同的基本概念。通过检查电子邮件的文本,我们将使用机器学习算法来预测电子邮件是由一个人还是另一个人写的。
数据集
数据集可以从以下 GitHub 存储库中获取:
使用不同机器学习算法的电子邮件分类。几年前,J.K .罗琳(哈利·波特…
github.com](https://github.com/MahnoorJaved98/Email-Classification)
在这个数据集中,我们有一组电子邮件,其中一半是一个人(Sara)写的,另一半是同一家公司的另一个人(Chris)写的。数据基于字符串列表。每个字符串都是经过一些基本预处理的电子邮件文本。
我们将根据邮件的内容将邮件分类为一个人写的或另一个人写的。我们将逐一使用以下算法:朴素贝叶斯、支持向量机、决策树、随机森林、KNN 和 AdaBoost 分类器。
存储库有两个 pickle 文件:word_data 和 email_authors。
email_preprocess python 文件用于处理来自 pickles 文件的数据。它将数据分成 0.1 个测试数据的训练/测试。
朴素贝叶斯:
朴素贝叶斯方法是一组基于贝叶斯定理的监督学习算法,假设给定类变量的值,每对特征之间条件独立且贡献相等。贝叶斯定理是一个简单的数学公式,用于计算条件概率。
高斯朴素贝叶斯是一种朴素贝叶斯,其中假设特征的似然性为高斯。假设与每个特征相关联的连续值按照高斯分布分布。绘制时,它给出一条钟形曲线,该曲线关于特征值的平均值对称。

图片来自 Pixabay
我们将使用 scikit-learn 库中的高斯朴素贝叶斯算法来对这两位作者的电子邮件进行分类。
下面是您可以在任何 python IDE 上实现的 Python 代码,系统上安装了所需的库。
import sys
from time import time
sys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")
from email_preprocess import preprocess
import numpy as np# using the Gaussian Bayes algorithm for classification of emails.
# the algorithm is imported from the sklearn library
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score# initializaing the test and train features and labels
# the function preprocess is imported from email_preprocess.py
features_train, features_test, labels_train, labels_test = preprocess()# defining the classifier
clf = GaussianNB()#predicting the time of train and testing
t0 = time()
clf.fit(features_train, labels_train)
print("\nTraining time:", round(time()-t0, 3), "s\n")
t1 = time()
pred = clf.predict(features_test)
print("Predicting time:", round(time()-t1, 3), "s\n")#calculating and printing the accuracy of the algorithm
print("Accuracy of Naive Bayes: ", accuracy_score(pred,labels_test))
运行代码会产生以下结果:

朴素贝叶斯结果(图片由作者提供)
在 0.9203 中,朴素贝叶斯对于这个特殊问题的准确性。相当不错吧?甚至算法的训练和预测次数也相当合理。
支持向量机
支持向量机也是一种监督学习,用于分类、回归以及异常值检测。我们可以使用 SVM 算法将数据点分成两类,通过一个平面将它们分开。SVM 有一个直的决策边界。SVM 算法非常通用,可以为决策函数指定不同的核函数。
SVM 算法基于将两类分开的超平面,间隔越大,分类越好(也称为间隔最大化)。
我们的分类器是具有线性核和 C = 1 的值的 C-支持向量分类器
clf = SVC(内核= '线性',C=1)
import sys
from time import time
sys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")
from email_preprocess import preprocess
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score### features_train and features_test are the features for the training
### and testing datasets, respectively
### labels_train and labels_test are the corresponding item labels
features_train, features_test, labels_train, labels_test = preprocess()#defining the classifier
clf = SVC(kernel = 'linear', C=1)#predicting the time of train and testing
t0 = time()
clf.fit(features_train, labels_train)
print("\nTraining time:", round(time()-t0, 3), "s\n")
t1 = time()
pred = clf.predict(features_test)
print("Predicting time:", round(time()-t1, 3), "s\n")#calculating and printing the accuracy of the algorithm
print("Accuracy of SVM Algorithm: ", clf.score(features_test, labels_test))

SVM 结果(作者图片)
SVM 算法的精度是 0.9596 。我们可以看到准确性和训练时间之间的明显权衡。算法准确性的提高是训练时间更长的结果(22.7 秒,而在朴素贝叶斯的情况下为 0.13 秒)。我们可以利用训练数据以及内核来进行最佳选择,这将在更少的训练时间内产生良好的准确度分数!
我们将首先将训练数据集分割成其原始大小的 1% ,从而丢弃 99%的训练数据。在代码的其余部分不变的情况下,我们可以观察到训练时间的显著减少和准确性的相应降低。代价是当我们减少训练数据时,准确性几乎总是下降。
使用以下代码将定型数据分割为 1%:
features_train = features_train[:len(features_train)//100]
labels_train = labels_train[:len(labels_train)//100]
可以看出,使用 1%的训练数据,算法的训练时间已经减少到0.01 秒,精度减少到 0.9055 。

1%训练数据的 SVM(图片由作者提供)
10%的训练数据,精度为 0.9550 ,训练时间0.47 秒。

具有 10%训练数据的 SVM(图片由作者提供)
我们也可以改变 scikit-learn 的 C-支持向量分类中的核和 C 的值。
使用 100%的训练数据、RBF 核,并且 C 的值设置为 10000,我们得到的精度为 0.9891 ,训练时间为 14.718 。

具有 100%训练数据、RBF 核和 C=10000 的 SVM(图片由作者提供)
决策树
决策树是一种用于分类和回归的非参数监督学习方法。决策树可以对数据集进行多类分类。使用从数据特征推断出的一些决策规则,在每个节点上对数据进行逐步分类。决策树很容易可视化。我们可以通过可视化贯穿树的数据集来理解该算法,并在各个节点做出决策。

图片来自 Unsplash
让我们看看这个算法如何在我们的数据集上工作。
import sys
from time import time
sys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")
from email_preprocess import preprocess
from sklearn import treefrom sklearn.metrics import accuracy_score### features_train and features_test are the features for the training
### and testing datasets, respectively
### labels_train and labels_test are the corresponding item labels
features_train, features_test, labels_train, labels_test = preprocess()# defining the classifier
clf = tree.DecisionTreeClassifier()print("\nLength of Features Train", len(features_train[0]))#predicting the time of train and testing
t0 = time()
clf.fit(features_train, labels_train)
print("\nTraining time:", round(time()-t0, 3), "s\n")
t1 = time()
pred = clf.predict(features_test)
print("Predicting time:", round(time()-t1, 3), "s\n")#calculating and printing the accuracy of the algorithm
print("Accuracy of Decision Trees Algorithm: ", accuracy_score(pred,labels_test))
运行上面的代码,我们得到的准确度为 0.9880 ,训练时间为6.116 秒。这是一个非常好的准确度分数,不是吗?我们有 100%的训练数据用于训练模型。

决策树算法(作者图片)
随机森林

图片来自 Unsplash
随机森林是建立在决策树上的集成监督学习算法。随机森林用于回归和分类任务。该算法的名字来源于随机选择的特征。
我们可以在数据集上使用 sklearn 库中的随机森林算法:RandomForestClassifier()。
下面是用于在我们的电子邮件分类问题上运行随机森林算法的代码。
import sys
from time import time
sys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")
from email_preprocess import preprocess
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score### features_train and features_test are the features for the training
### and testing datasets, respectively
### labels_train and labels_test are the corresponding item labels
features_train, features_test, labels_train, labels_test = preprocess()# defining the classifier
clf = RandomForestClassifier(max_depth=2, random_state=0)#predicting the time of train and testing
t0 = time()
clf.fit(features_train, labels_train)
print("\nTraining time:", round(time()-t0, 3), "s\n")
t1 = time()
pred = clf.predict(features_test)
print("Predicting time:", round(time()-t1, 3), "s\n")#calculating and printing the accuracy of the algorithm
print("Accuracy of Random Forest Algorithm: ", accuracy_score(pred,labels_test))

随机森林算法(图片作者提供)
算法的准确率相当低,即;0.7707.训练时间是 1.2s,这是合理的,但总的来说,它不是解决我们问题的好工具。准确率低的原因是特征选择的随机性,这是随机森林的一个特性。随机森林是由许多决策树组成的模型。这个模型不是简单地对树(我们可以称之为“森林”)的预测进行平均,而是使用了两个关键概念,这两个概念赋予了它随机的名称:在构建树时对训练数据点进行随机采样。
KNN — K 个最近邻居
k 最近邻是一种受监督的机器学习算法,可用于分类和回归预测问题。KNN 是一个懒惰的学习者。它依赖于距离进行分类,因此规范化训练数据可以显著提高其准确性。

图片来自 Unsplash
让我们看看使用来自 sklearn 库 KNeighborsClassifier() 的 KNN 算法对电子邮件进行分类的结果,该算法具有 5 个最近邻居和欧几里德度量。
import sys
from time import time
sys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")
from email_preprocess import preprocess
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score### features_train and features_test are the features for the training
### and testing datasets, respectively
### labels_train and labels_test are the corresponding item labels
features_train, features_test, labels_train, labels_test = preprocess()# defining the classifier
clf = KNeighborsClassifier(n_neighbors=5, metric='euclidean')#predicting the time of train and testing
t0 = time()
clf.fit(features_train, labels_train)
print("\nTraining time:", round(time()-t0, 3), "s\n")
t1 = time()
pred = clf.predict(features_test)
print("Predicting time:", round(time()-t1, 3), "s\n")#calculating and printing the accuracy of the algorithm
print("Accuracy of KNN Algorithm: ", accuracy_score(pred,labels_test))
算法的精度为 0.9379 ,训练时间为 2.883s 。然而,可以注意到,模型工具需要相当长的时间来预测类别。

KNN 算法(图片作者提供)
AdaBoost 分类器

图片来自 Unsplash
Ada-boost 或自适应 boosting 也是一种集成 Boosting 分类器。它是一种元估计器,首先在原始数据集上拟合一个分类器,然后在同一数据集上拟合该分类器的附加副本,但是其中调整不正确分类的实例的权重,使得后续分类器更加关注困难的情况。
我们将使用 scikit 库中的分类器。以下是代码:
import sys
from time import time
sys.path.append("C:\\Users\\HP\\Desktop\\ML Code\\")
from email_preprocess import preprocess
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score### features_train and features_test are the features for the training
### and testing datasets, respectively
### labels_train and labels_test are the corresponding item labels
features_train, features_test, labels_train, labels_test = preprocess()# defining the classifier
clf = AdaBoostClassifier(n_estimators=100, random_state=0)#predicting the time of train and testing
t0 = time()
clf.fit(features_train, labels_train)
print("\nTraining time:", round(time()-t0, 3), "s\n")
t1 = time()
pred = clf.predict(features_test)
print("Predicting time:", round(time()-t1, 3), "s\n")#calculating and printing the accuracy of the algorithm
print("Accuracy of Ada Boost Classifier: ", accuracy_score(pred,labels_test))
分类器的精度为 0.9653 ,训练时间为17.946 秒。准确度相当好,但是,训练时间比要求的时间稍长。

Ada Boost 分类器(图片由作者提供)
结论
在这篇文章中,我们使用了几种机器学习算法来分类 Chris 和 Sara 之间的电子邮件。这些算法产生了 0.77-0.98 之间的不同准确度分数。从下表中可以看出,模型是按照精度递增的方式排列的:
- 随机森林算法的准确率最低
- SVM 算法的训练时间最长
- 优化参数为 C=10000 和 RBF 核的 SVM 算法的准确率最高
- 朴素贝叶斯算法具有最快的预测时间

结论(图片由作者提供)
虽然有许多其他分类算法可用于我们的任务,但对数据集上运行的基本算法的比较得出结论,对于我们的特定问题,SVM 是最准确的,考虑到其参数根据我们正在处理的任务进行了优化。
你认为其他算法或模型会做得更好,或者同样好吗?
分享经验,关注我更多文章!
21 世纪 20 年代获得顶级对冲基金职位的最佳机器学习算法
通过学习供给不足而需求增加的技能,你可以最大化你被雇佣的机会
对冲基金分析师的角色代表了所有金融行业(如果不是任何行业的话)中一些竞争最激烈的角色。这份工作变化多端,极具挑战性,这使得这些工作成为许多雄心勃勃的大三学生的长期目标,他们来自不同的背景,如计算机科学、金融、经济、物理等等。这造成了激烈的角色竞争。反过来,挑战不仅仅是获得一个角色,还要保持足够的相关性,以便长期保持这个角色。
对冲基金正在投资的领域之一是增加他们内部的数据科学和机器学习人才。在最近的一项调查中,56%的公司表示,到 2021 年,他们将在交易流程中使用机器学习(Greenwich Associates,2019)。如果我们更深入地研究这一点,我们可以看到买方公司对“人工智能”的采用仅落后于行业其他公司 21%。然而,36%的受访者表示,他们将在未来两年内实施“人工智能”系统。要做到这一点,他们将不得不雇用大量的新人来建立、管理和维护这些系统。
对于门外汉来说,答案可能是成为机器学习专家——句号。对于我们这些对这个领域有更深理解的人来说,这不是一个现实的目标。当然,对不同技能——深度学习、优化、无监督方法——有一个基本的了解是很重要的。但是,要想在成千上万的候选人中脱颖而出,你必须具备对某个特定领域的深刻理解和专业知识。问题是,你应该把哪个区域变成你自己的?

ML 技能及其部分用途 Auquan - 2020
为什么你应该把自然语言处理作为你的重点
不想拐弯抹角,或者拖拖拉拉,我们认为你应该认真考虑让 NLP 成为你的核心专长。这有两个主要原因:
- 你将能够产生独一无二的阿尔法
- 你会更有适应能力,能够申请更多的公司
提供独特的边缘
部署在股票价格上的机器学习会失败。价格没有记忆;非结构化 ML 导致过度拟合、反直觉的预测、不合逻辑的聚类和虚假结果。“ML 应用于 CEO 真实性或聊天室情绪的自然语言处理,将比基本面分析师更好地预测业绩”——盘安资产管理公司 CEO Eric Sorensen
虽然这句话有点耸人听闻,对一些量化基金的成功不屑一顾,但这里也有一个教训。成千上万才华横溢的人每天都在分析每一条结构化数据,看它能否预测股票价格,他们至少在过去 50 年里一直在这么做。这种漫长的竞争意味着在这里赢得比赛并不容易,机会也很少持续很久。也许获得优势的更好方法是做一些不同的事情。例如,RenTec 通过收集高质量的大数据找到了自己的优势,这比其他人想的要早了几十年。
NLP 为这种情况的发生提供了下一个前沿。人类产生的大部分信息是非结构化的,以人类可读的格式存储,例如:年度报告、新闻文章、评论和对话。大规模利用这一点有望帮助各种不同风格的投资经理:
不仅是拥有物理学家和数据科学家团队的复杂对冲基金,还有更传统的经理人。例如,基本面管理人员正在使用机器学习来分析收益报表,并根据过去的公司或宏观经济新闻来检查市场走势。——Greenwich Associates,2018 年
因为 NLP 有能力处理大量的文本和表面的关键见解,以便人类采取行动,它不一定要用在纯粹的量化策略中。这意味着它可以通过帮助传统基本面投资者识别关键信息,为他们的投资过程增加价值。对你来说,这意味着有更多的公司将寻找这些角色,因此 NLP 熟练的数据科学家有更多的机会。
综上所述,NLP 很有可能通过开放自动分析大量非结构化数据的能力,开启下一个重大投资机会。当这种情况发生时,它不仅会改变量化风格经理的工作流程,还会改变每个投资专业人士。这意味着,通过学习 NLP,你将自己置于一个重要雇员和几乎所有投资商店的位置。
如何开始学习面向金融的 NLP
有很多免费资源可以帮助你从头开始学习 NLP。下面我们已经链接到了每种方法的一个例子,并且看了实际方法的更多细节。最好找到适合你的,可能是其他选项的组合。
- 博客(如 https://nlpers.blogspot.com/,【https://medium.com/huggingface】
- 书籍(如 https://web.stanford.edu/~jurafsky/slp3/的或 https://nlp.stanford.edu/fsnlp/的
- 课程(如http://cs224d.stanford.edu/syllabus.html或参见 Coursera.com)
还有许多其他的指南有各种资源的链接,只是谷歌如何学习自然语言处理或类似的。
尽管这些资源是很好的入门资源,但是它们并没有特别关注将 NLP 用于金融。当处理现实世界的问题时,这可能会造成知识缺口。我们 QuantQuest 平台上 NLP 竞赛的许多参与者都面临着同样的问题。这促使我们创造一些内容来弥补这一差距
变得实际
在我们的团队中,我们花了很多心思在人们如何学习新技能上。这部分是因为我们需要在内部培训人员,也因为学习是我们用户的一大动力。我们发现教授这些主题的最好方法是基于问题的学习。一种在解决问题时根据需要获得技能的学习方式,与先学习理论,然后在解决问题时试图记住理论相反。事实证明,这在许多领域都更有吸引力,也更有效。
为了介绍金融中的 NLP,我们创建了一个短期课程,让你在一天内解决一个真正的分析师问题。当你处理这个问题时,你会学到你需要的特定的库和方法。目的是让你知道你已经使用 NLP 做了一些有趣的事情,这样你会更有动力前进。
一旦你完成了,你将能够开始自动分析年度报告的见解。然后选择你的下一个项目,增加复杂性。
结束注释:
不管你喜欢什么样的学习方式,我们都希望你能仔细研究一下自然语言处理在金融领域的实际应用。在 Auquan,我们为顶级对冲基金工作,帮助它们创造更多利润,避免损失。我们越来越多地使用 NLP 来解决我们客户的挑战,并看到一些对该主题有深刻理解的候选人。这种技能短缺可以成为你脱颖而出的机会。
参考
[1]埃里克·索伦森/贾丝汀娜·李/彭博,十六位领先的量化分析师畅想全球金融的下一个十年 (2020)
[2] Greenwich Associates,未来交易研究(2019),via:https://www . refinitiv . com/en/resources/special-report/automation-Trading-and-Future-technologies
[3]格林威治协会,投资的未来是“量化的” (2018)
根据数据科学,最好的马里奥赛车 8 角色

图片来自 Pixabay,作者 Niap3d
抬起轮子!
马里奥赛车一直是一个选择的游戏。在每个角色和卡丁车组合的背后,都有大量的深度数据。你作为玩家选择的每个部分,包括滑翔机和轮胎,都会影响设置的速度、操作和涡轮“加速”等。
马里奥赛车 8 和马里奥赛车 8 豪华版延续了这一传统,提供新老角色和赛车部件。我将使用来自 Kaggle 的数据来决定“最好”和最差的角色和卡丁车设置。
探索数据
游戏给出了不同赛道类型的单独速度和操控数据,所以为了更容易分析,我根据赛道类型的频率对参数进行了加权。我对主要参数的权重大致为 70%,地面 15%,空气 10%,水 5%。然后,我使用热图来显示体重等级的参数。

如你所见,较重的角色往往拥有最快的速度,但拥有最少的涡轮。灯光人物有最佳操控性但最低速度。
接下来,我为每一个可能的角色职业、车辆、轮胎和滑翔机组合制作了一个数据集,总共有 2500 多种组合。如果我们使用单个字符,将会有近 150,000 种组合!

分析
有许多方法可以达到“最佳”配置。其他分析使用了帕累托效率,但每次只能观察 2 个左右的变量。为了查看所有参数,我将通过对每个参数进行加权来单独查看每个参数,并查看前 25 个组合。然后,我将尝试一个更平均的权重来确定最佳的整体组合。
速度

将速度和加速度加权 35%,将所有其他参数加权 10%,这为我们提供了一个最佳组合:
- 布瑟/瓦里奥/莫顿·库帕/Mii(重型)+ Biddybuggy +滚轮轮胎+加速滑翔机
加速度

将加速度和 mini turbo 加权 35%,将所有其他参数加权 10%,可以得到以下最佳组合:
- 婴儿/Lemmy Koopa/Mii(轻型)+ Biddybuggy +滚轮轮胎+加速滑翔机
处理

加权处理 50%和所有其他参数 12.5%为我们提供了相同的最佳组合:
- 婴儿/Lemmy Koopa/Mii(轻型)+ Biddybuggy +滚轮轮胎+加速滑翔机
涡轮增压

将 turbo 权重设为 50%,将所有其他参数权重设为 12.5%,这为我们提供了以下最佳组合:
- 婴儿/Lemmy Koopa/Mii(轻型)+管架+滚轮轮胎+加速滑翔机
同等重量

速度权重为 30%,其余参数权重为 20%(除了 10%的涡轮增压器),这给出了以下参数的最佳组合:
- 布瑟/瓦里奥/莫顿·库帕/Mii(重型)+biddy 越野车+滚轮轮胎+加速滑翔机
结论
一般来说,速度的增加伴随着加速度的减小。较重的角色有最好的速度,因此在加权时会做得更好。婴儿和他们班上的其他角色在操控性、加速和涡轮增压方面是明显的赢家。对于初学者来说,它们可能是不错的选择。
“最佳”马里奥赛车组合是主观的,只要你有一个统计数据均匀分布的设置,最佳选择之间的差异充其量是微不足道的。也就是说,对于那些喜欢速度和/或平衡设置的玩家来说,这项分析将支持最好的组合,如布瑟/瓦里奥/莫顿·库帕/米伊(重型)使用带滚轮轮胎和加速滑翔机的双座越野车。
这些权重是任意的,所以这些结果不一定是可靠的,但从列出的最佳结果中挑选组合应该会给你大多数课程一个坚实的开端。
你同意这个结果吗?为什么或为什么不?
根据数据科学,学习外语的最佳电影
有史以来对电影对白词汇的最大分析。找出 3000 部电影中最适合学习外语的电影。

照片由 Georgia Vagim 在 Unsplash 上拍摄
电影是学习外语的好工具。如果你在谷歌上输入“学习英语或西班牙语的最佳电影”,会出现无数的推荐。那些推荐大多来自个人选择,这很好;然而,作为一名数据科学爱好者,我转向数据来回答问题。这次也不例外,所以我将分析排名前 3000 的电影来回答这个问题,“学习外语最好的电影是什么?”
**Table of Contents**[1\. Ranking Of The 3000 Most Popular Movies](#1d92) [2\. Which movie is easier to understand ‘Titanic’ or ‘Toy Story’?](#0fa4)
[3\. Methodology](#e3c8)
[4\. The best movies for people at B1 level](#6b7d)
[5\. The best movies for people at C1 level](#1b54)
[6\. Final note](#71e0)
前 3000 部电影排名
为了找到学习外语的最佳电影,我比较了 IMDb 的 3000 部最受欢迎的电影中对话中使用的词汇。你可以在下面的方框中搜索你最喜欢的电影中的词汇,看看它们有多容易或多难。在那里你会发现电影对白中的等级和词汇。词汇量越大,电影就越容易理解(在所有分析的电影中,前十名的电影词汇量最简单)。列表中的一些电影可能不适合你,所以请先在 IMDb 上查看它们的描述。
我还对 3000 部电影进行了中级(CA)和高级(CB)级别的排名,就像我在以前的文章中对《老友记》、《T2》【权力的游戏】、《辛普森一家》、《生活大爆炸》、《绝命毒师》、和【海绵宝宝】所做的那样。最右边的电影在每一层都有更多的基本词汇。同时,上面的电影是每个栏目最受欢迎的。希望你能找到你喜欢的在对话中使用基本词汇的流行电影。
我还对网飞和迪士尼+ 网站上的最佳电影和节目做了类似的排名,这些电影和节目对学习外语很有帮助。如果你订阅了其中一个,可以去看看。
如果你想知道更多关于如何通过看电视节目和电影来学习语言,我写了一个完整的指南来解释我是如何通过看电视来学习 3 种语言的。
我用我在编程和自然语言方面的知识分析了 3000 部电影,找到了最适合学习的…
现在让我们比较一下顶级电影,这样你就会知道哪些流行电影对你来说很难理解,哪些容易理解。
《泰坦尼克号》和《玩具总动员》哪部电影更容易理解?
你可能听说过像《玩具总动员》这样的儿童电影比其他类型的电影更容易理解。我们将通过比较电影《玩具总动员》、《蝙蝠侠诞生》、《哈利波特与火焰杯》、《泰坦尼克号》和斯图尔特·利特尔中涵盖的词汇来验证这是否属实。下面的热图显示了五部电影的词汇覆盖范围。

作者图片
在第一列中,我们看到电影玩具总动员的盒子具有最浅的颜色,表明它在五部电影中具有最低的 A 级词汇覆盖率(87.4%)。虽然玩具总动员是为儿童准备的,但电影中的角色“巴斯光年”倾向于使用像这样的特定短语:
我驻扎在第四区的伽玛象限。作为太空突击队精英宇宙保护部队的一员,我保护银河
免受银河联盟死敌邪恶皇帝楚格入侵的威胁。
也许当你看到上面这样写的单词时很容易,但如果英语是你的第二语言或你学习英语,听那些短语就不会那么容易理解了。
所以毫无疑问为什么玩具总动员的 A 级词汇覆盖率最小。结果还提示,A 级和 A+B 级覆盖率最高的电影分别是泰坦尼克号 (89.8%)和斯图尔特·利特尔 (96.1%)。也就是说,与列出的其他电影相比,B1 水平的学习者更容易理解电影泰坦尼克号,而斯图尔特·利特尔将是 C1 水平的人最好看的电影。此外,请注意,当我们在第三列中计算 C1 词汇时,覆盖范围略有不同,因为 C1 词汇水平在电影中很少被提及。
如果你仔细检查热图,你可能会注意到电影中 A 或 A+B 级别的覆盖率值彼此相差不远(A 列中的差距为 2.4%,A+B 列中的差距为 4.7%)。然而,1%的词汇量对英语理解的影响可能会让你吃惊。
为什么 1%的覆盖率如此重要?
根据国家语音和演讲中心的数据,在美国,说英语的人的平均会话速率约为每分钟 150 个单词。覆盖率低 1%代表每 100 个单词中有 1 个未知单词。也就是说,玩具总动员和泰坦尼克号在 A-level 词汇覆盖率上 2.4%的差距表明玩具总动员的对话每分钟比泰坦尼克号多 3 个左右的未登录词。这个百分比可能看起来很小,但这可能决定了你是否会享受看电影的乐趣,或者很难理解一个角色在说什么。
方法学
要回答“学习外语最好的电影是什么?”我们可能需要一个经常看大量电影的超级影迷的帮助。这样的人可能很难找到;然而,影迷们转录的电影对白在网上可以找到。一旦我收集了电影的抄本,我就可以一个一个地阅读它们,从中找出最佳选择,但阅读 3000 份抄本可能要花去我几个月的时间。
幸运的是,有像 CountVectorizer 这样的工具可以为我们标记每个抄本。记号化将原始文本分解成称为记号的单词。比如电影终结者中著名的阿诺德·施瓦辛格的台词“Hasta la vista,baby”就可以拆分成四个代币:‘Hasta’,‘la’,‘vista’,‘baby’。这样,就有可能建立一个表格,告诉我们每部电影中使用的词汇。这在下图中很容易解释。

作者图片
每个单元格代表一个单词在电影中被提及的次数。在上表中,术语“能力”在电影 1 和 3 中出现过一次,但在电影 2 中没有出现,因此赋值为 0。这就是我们如何找到每部电影中所说的所有单词,但要确定学习语言的最佳电影,我们还需要知道电影对话中使用的词汇水平。
词汇是达到足够理解电影的最关键因素之一,因此本分析旨在根据牛津单词表确定涵盖 A1-A2 (A)和 B1-B2 (B)英语水平大部分词汇的电影。为了分析,我使用了牛津的 5000 个单词列表,它提供了每个英语学习者都应该知道的从 A1 到 C1 的单词分类。
经常在对话中使用 A 级词汇的电影对于至少具有 B1 级水平的人来说容易理解,而具有最高 A+B 词汇覆盖率的电影对于 C1 水平的学习者来说是完美的。也就是说,让我们为 B1 和 C1 水平的学习者找出前 50 部电影!
B1 级人群的最佳电影
通过使用 Python,可以获得所有电影的词汇覆盖,就像我们之前对五部电影所做的那样。3000 部电影的 A 级词汇覆盖率的分布呈现在下面的直方图中。

作者图片
根据上面的直方图,许多电影覆盖了大约 90%的 A 级词汇,因此 B1 级的人可以识别 90%的电影对白。然而,正如我们之前所说,覆盖率的每一个百分比都很重要,那么推荐覆盖率最高的电影(由右边最短的条形表示)会好得多。请注意,最小的条形包含大约 200 部电影,覆盖率至少为 93%,但并不是所有这些电影都是你的最佳选择(比如,你不喜欢电影的类型或电影对你来说不够吸引)。出于这个原因,我不得不在词汇覆盖和电影受欢迎程度之间进行权衡(根据 IMDb 评分),以得出前 50 部电影。以下是 10 部最受欢迎的电影,至少有 93%的 A 级词汇覆盖率。
- 纪念品(2010 年)
- 盗亦有道(1990)
- 小丑(2019)
- 疤面煞星(1983)
- 囚徒(2013)
- 驱动(2011)
- 摄于(2008)
- 她(2013)
- 笔记本(2004)
- 《谍影重重》(2002)
这些电影中有你值得看的吗?
其余前 50 名的电影都列在了帖子的最后,以防你想查看你最喜欢的电影是否在里面。
给 C1 人看的最好的电影

作者图片
第二个直方图显示,1000 多部电影涵盖了大约 94%的 A+B 级词汇。然而,最吸引人的一组 C1 级别的电影提供了至少 96%的覆盖率。以下是 10 部最受欢迎的电影,至少有 96%的 A+B 级词汇覆盖率。
- 及时(2011)
- 红色(2010)
- 克洛弗菲尔德巷 10 号(2016)
- 调局(2011)
- 维基·克里斯蒂娜·巴塞罗那(2008 年)
- 电锯惊魂二(2005)
- 婚姻故事(2019)
- 温暖的身体(2013)
- 誓言(2012)
- 未来三天(2010 年)
正如你所料,许多已经推荐给 B1 级的电影也将被推荐给 C1 级,但我没有把它们包括在内,以避免在前 50 名中出现重复。如果你的级别是 C1,请随意观看之前为 B1 级推荐的任何电影。
最后一个音符
最后,关于我如何处理数据的一些观察:
- 牛津单词表只提供单词的基本形式。也就是说,您可能会发现单词“write”被归类到 A1 级别,但形式“writes”、“writing”和“written”不会显示在列表中。显然,电影的对话包括所有的单词形式,所以为了解决这个问题,我使用了提供列表中 5000 个单词的所有单词形式的数据。
- 本分析中的 A 级和 B 级覆盖假设了解专有名词,如“John”和边缘词,如“ah”、“oh”、“mmm”。两者都占电影总代币的 3-4%左右。
- 在电影中听不到的词,如场景描述和发言者的名字,都从文字记录中删除了。
如果你想看这个分析背后的代码,你可以在这里找到。请记住,词汇并不是很好地理解电影的唯一因素。发音、口音和语速也可能会提高或降低你的理解水平。
更像这样:
用数据找出《老友记》236 集最适合你学习英语和人物趣事
medium.com](https://medium.com/learn-languages-with-tv/the-best-episodes-to-learn-english-with-friends-according-to-data-science-c28a31bbda62) [## 用生活大爆炸理论学习英语:根据数据科学的最佳剧集
用数据找出哪 279 集《生活大爆炸》最适合你学英语。
medium.com](https://medium.com/learn-languages-with-tv/learn-english-with-the-big-bang-theory-the-best-episodes-according-to-data-science-50cb0ce659ad) [## 《辛普森一家》是增加你英语词汇量的最佳电视节目
《辛普森一家》和 83 部电视剧中所有剧集所用词汇的数据分析。找出辛普森一家的…
towardsdatascience.com](/the-simpsons-is-the-best-tv-show-to-increase-your-english-vocabulary-f433fe060a74)
最适合 B1-B2 水平学习者的 50 部电影(至少 93%的 A 级词汇覆盖率)
《记忆碎片》(2000)、《好家伙》(1990)、《小丑》(2019)、《疤面煞星》(1983)、《囚徒》(2013)、《驱力》(2011)、《夺情》(2008)、《她》(2013)、《笔记本》(2004)、《伯恩的身份》(2002)、《啦啦地》(2016)、《夏日五百日》(2009)、《追捕海蓓娜斯》(2006)、《世界大战》(2005)、《电锯惊魂》(2004)、《房间》(2009) 《热天午后》(1975)、《死者的黎明》(2004)、《后裔》(2011)、《夜行动物》(2016)、《日落之前》(2004)、《我是第四号》(2011)、《暴力史》(2005)、《灵异活动》(2007)、《无条件》(2011)、《大人物》(1988)、《It 第二章》(2019)、《不可能》(2012)、《革命之路》(2008)、《巴巴多克》(2014)、《大吉岭有限公司》
C1 水平学习者的前 50 部电影(至少 96%的 A+B 级词汇覆盖率)
《时间》(2011)、《红色》(2010)、《克洛弗菲尔德巷 10 号》(2016)、《调整局》(2011)、《维姬·克里斯蒂娜·巴塞罗那》(2008)、《电锯惊魂》(2005)、《婚姻故事》(2019)、《温暖的身体》(2013)、《誓言》(2012)、《未来三天》(2010)、《副作用》(2013)、《忧郁症》(2011)、《Rec》(2007)、《第一个男人》(2018)、《公路旅行》(2007) 《怪物》(2010)、《埃莱克特拉》(2005)、《不可思议》(2010)、《海威尔》(2011)、《索拉里斯》(2002)、《双子杀手》(2019)、《诱拐》(2011)、《第四种》(2009)、《我是母亲》(2019)、《隔离》(2008)、《寻找糖人》(2012)、《曲线的烦恼》(2012)、《茧》(1985)、《犯罪与轻罪》(1989)、《原罪》(2001)、《九个女王》(2012)
根据数据科学,学习外语的最佳网飞电影和系列
找出 1500 个网飞系列和电影中哪一个是学习外语的最佳选择。

在 Unsplash 上由 Thibault Penin 拍摄的照片
截至 2020 年,网飞上大约有 3712 部电影和 1845 部电视节目。如果你正在学习英语或西班牙语,有很多内容可供选择,但你可能没有时间看完所有的内容。这就是为什么我用我的数据科学技能来分析网飞上排名前 1500 的电影和电视节目。
做了这么多工作后,我在网飞上找到了学习语言的最佳内容。这样做的目的是给你很多好的选择,让你可以找到你喜欢的电影或电视节目,这对学习语言也有好处,而不是强迫你看一个你不喜欢的电视节目,但你的老师和朋友坚持你必须看,因为“它帮助每个人学习语言。”
为了找到网飞最好的电影和电视节目,我比较了对话中使用的词汇。让我们来看看哪些是最好的电视剧和电影吧!
**Table of Contents** [1\. The Best TV Shows on the Netflix Catalog](#478e)
[2\. The Best Movies on the Netflix Catalog](#1f07)
[3\. The Best and Worst Netflix Originals](#4d9b)
[4\. Methodology](#ddd7)
- [Data Collection](#4404)
- [Tokenization](#56e9)
- [Lemmatization](#4493)
- [Data Cleaning](#4404)
[5\. Final Notes](#9840)
网飞目录上的最佳电视节目
自然,美国和英国在网飞的电视节目是为以英语为母语的人制作的。这就是为什么如果英语不是你的母语,你可能在某些场景中理解对话会有一些困难。幸运的是,我按照词汇难度对网飞目录上的 500 部一流电视剧(223 部网飞原创)进行了排名。
因为词汇简单,《T4 老友记》被认为是学习外语的最佳电视节目之一。然而,这部电视剧在网飞目录中只排在第 78 位,这意味着还有其他 77 部电视剧和《老友记》一样好——甚至更好! — 在网飞上可以学习语言并从中获得乐趣。例如,根据我的发现,像世界末日(排名第 13)或 13 个理由(排名第 40)这样的电视剧在剧集中使用的词汇甚至更简单。
你可以在下面的方框中搜索你最喜欢的电视节目中的词汇,看看它们有多简单或多难。你会发现他们的排名和词汇覆盖面。排名前十的电视节目拥有整个网飞目录中最简单的词汇。
作者图片
例如,电视节目 La casa de papel 在英语配音中也被称为 Money Heist 排在第 342 位。这表明这个电视节目可能有一些难以理解的硬词汇。这是“再见贝拉”场景的一个片段。你觉得用的词汇高级吗?
如果你正在为你的语言水平寻找完美的电视节目,那么我有好消息告诉你!我还对所有级别(初级、中级、高级)的剧集进行了排名,就像我在之前的文章中对《老友记》、《、【权力的游戏】、、《辛普森一家》、、《生活大爆炸》、、、【绝命毒师】、和【海绵宝宝】所做的那样。最右边的节目在每一层使用更多的词汇。覆盖率越高,你就越容易理解电视节目中的情节。
作者图片
请记住,这些是网飞目录中的顶级电视节目。有些你喜欢的电视节目在网飞上看不到,但别担心;我已经分析了其中一些电视节目,如《辛普森一家》 以及迪士尼电影。此外,网飞目录在您的国家可能略有不同。这就是为什么我列出了最有可能在全球发售的网飞原版。
如果你想知道更多关于如何通过看电视节目和电影来学习语言,我写了一个完整的指南来解释我是如何通过看电视来学习 3 种语言的。
我用我在编程和自然语言方面的知识分析了 3000 部电影,找到了最适合学习的…
以下是学习外语的 10 大网飞原创节目:
- 神灵
- 早上好电话
- 潮淹区
- 容易的
- 黑色的夏天
- 夏季
- 婴儿
- 顶级男孩
- 血统
- 该死的世界末日
网飞目录上最好的电影
如果你更喜欢电影,那么网飞也有很好的选择。我按照词汇难度对网飞最受欢迎的 950 部电影(173 部网飞原版)进行了排名。排名前 100 的一些受欢迎的电影是鸟盒(30),蜘蛛侠进入蜘蛛世界(84) 和追求海蓓娜斯 (81)。
通过玩下面的方框,找到排名前 100 的其他电影。你还可以发现你最喜欢的电影和词汇覆盖范围的排名!
作者图片
你可以通过下面的情节找到适合你语言水平的完美电影。最右边的电影有更多的初级、中级和高级词汇。请记住,这些是网飞目录中的顶级电影。你不会在网飞上找到《T4》哈利波特、阿凡达或玩具总动员之类的电影,但如果你仍然打算看这类电影,你应该看看我的另一篇文章,我在那里分析了最受欢迎的 3000 部电影。这里可以找到。
作者图片
我还列了一个网飞原创电影的列表,这些电影很可能会在全球发行,以防网飞的目录在你的国家有所不同。
以下是学习外语的十大网飞原创电影:
- 在高高的草丛里(2019)
- 暗恋(2020)
- 在里乔内·孙(2020)的带领下
- 危险的谎言(2020)
- 鸟箱(2018)
- 你会带谁去荒岛(2019)
- 地震鸟(2019)
- 爱情婚礼重演(2020)
- 帕德尔顿(2019 年)
- 6 个气球(2018 年)
现在让我们来比较一下网飞上对语言学习者来说最好和可能最差的内容。
最好和最差的网飞原作
下图揭示了排名前十的网飞原创电影在英语词汇难度方面的差异。如你所见,后 10 个单词所用的词汇更难。比如你只需要知道最常见的 1000 个英语单词就能听懂电影鸟盒子中 94.5%的口语,但你至少需要 3000 个单词才能覆盖电影拼梦中 94.5%的对话。那多出来的 2000 字,可能就是你听不懂人物说什么的原因——哪怕你水平再高!

作者图片
方法学
我用 Python 做了所有这些分析,以下是我遵循的步骤:
数据收集
在这个分析中,我使用了 3 个主要的数据集,包括抄本、网飞目录和一个网飞原件的列表。我一直在谷歌上搜索,直到我找到足够数量的分析记录。我用目录把抄本和网飞上的书目进行了匹配。你可以在 Kaggle 上找到网飞星表数据集。它由截至 2019 年网飞上可用的标题组成,因此可能有些电影或电视节目今天在网飞上不可用。最后,我在这里找到了一份 2020 年前发行的网飞原作列表,这对分析很有用。
标记化
为了分析抄本中的词汇,我标记了所有由人物说出的单词。Python 中有许多用于标记化的工具,但我使用了 CountVectorizer,因为它将收集的副本转换成标记计数的数据帧,从而简化了分析。在我分析了 3000 部电影的文章中,我解释了更多关于 CountVectorizer 如何工作的内容。
词汇化
在标记化之后,我必须找到每个标记的基本形式。您可以通过使用诸如 lemmatization 之类的技术来实现这一点,您可以在 NLTK 库中找到这些技术。然而,我使用了词族列表,它做了类似的工作,但也根据每个单词的频率给出了它的难度。截至 2020 年,共有 29 个单词家族列表,你可以在这里找到其中的一些。这些列表是根据语言学和作为第二语言的英语学习相关的研究论文主题进行评估的。
数据清理
我删除了电影或剧集中听不到的单词,如场景描述和演讲者姓名。我还排除了对话中有超过 3.5%的单词与单词家族列表不匹配的抄本(它们可能是离群值或损坏的数据)。
所有代码都可以在 Github 上找到!
最终注释
- 我用来对电视节目中的词汇进行分类的大部分词汇表都是从语料库中获得的。词汇级别基于一个词在语料库中出现的频率,这意味着这些文本中最常见的词被标记为级别 1。尽管之前的研究已经证明了这些列表是可靠的,但是对于有多重含义的单词来说就不那么准确了。例如,单词“draw”在列表中被标记为级别 1。这可能会发生,因为这个词通常用于指“制作图片”,但如果意思是“拿出武器攻击某人”或“得出结论”,它可能不会是第一级
- 我花了几周时间寻找抄本,清理,处理数据,然后理解得到的结果。然而,这些发现并不完美。电影中的发现可能比电视节目中的更准确。来自电影的抄本是独特的,但是电视节目有不同的集播出,增加了每个电视节目抄本的数量。这就是为什么我收集了每部电视剧 3 到 10 集的样本,以获取该电视剧平均每集所涵盖的词汇。
- 总的来说,这些发现揭示了许多非常适合每个词汇水平的内容,但其中一些仍然让我感到惊讶。例如,我惊讶地发现行尸走肉排在 62 位。我不太喜欢那个电视节目,但我不认为一个有僵尸的小说节目在对话中使用了简单的词汇。在检查了剧本之后,我核实了《行尸走肉 T2》中的词汇需求在整个剧集中有很多起伏。也就是说,有些情节可能比其他情节更难理解。
更像这样:
如果你喜欢读这篇文章,那么你可能也会喜欢这些:
用数据找出《老友记》236 集最适合你学习英语和人物趣事
medium.com](https://medium.com/learn-languages-with-tv/the-best-episodes-to-learn-english-with-friends-according-to-data-science-c28a31bbda62) [## 根据数据科学,学习英语的最佳电影
电影是学习英语的好工具。如果你在谷歌上输入“学习英语的最佳电影”,无数…
towardsdatascience.com](/the-best-movies-to-learn-english-according-to-data-science-2dccb4b3ee23) [## 《辛普森一家》是增加你英语词汇量的最佳电视节目
《辛普森一家》和 83 部电视剧中所有剧集所用词汇的数据分析。找出辛普森一家的…
towardsdatascience.com](/the-simpsons-is-the-best-tv-show-to-increase-your-english-vocabulary-f433fe060a74)**
2019 年最佳新地理空间数据科学图书馆
2019 年出现了这么多新的、令人惊叹的地理空间 Python 库。以下是我 2019 年名单中最好的补充

地理空间数据科学
作为一名地理空间数据科学家,2019 年带来了一些新工具,让我的生活变得更加轻松。在这篇文章中,我分享了 Python 生态系统中这些新增加的最好的东西和一些资源,以帮助你入门。您将找到使用 GPU、高级地理空间可视化工具和一些简单、有用的地理处理工具来加速地理空间数据科学管道的工具。希望你能从列表中找到一两个能帮到你的。
1. cuSpatial : GPU 加速的空间和轨迹数据管理和分析库
它是开源库的一部分,具有完全在 GPU 中执行的 GPU 加速数据科学管道。它是 2019 年持续发展的图书馆之一,也是这些生态系统的一部分,cuSpatial 为地理空间数据科学进程提供了加速工具。一个展示 GPU 加速地理空间数据科学能力的项目可以在这里找到:我该往哪里走?和发布博客。
到目前为止,cuSpatial 支持以下功能,并计划在未来推出其他功能:
- 空间窗口查询
- 多边形中点测试
- 哈弗线距离
- 豪斯多夫距离
- 从点位置数据导出轨迹
- 计算轨迹的距离/速度
- 计算轨迹的空间包围盒
2. KeplerGL Jupyter 笔记本
KeplerGL Jupyter 是 Jupyter 笔记本中地理空间数据可视化的便捷而出色的工具。该库为 Big 提供了优步先进的地理可视化工具,并于 2019 年 6 月发布。它允许用户轻松地在 Jupyter 笔记本中绘制地图,还带有交互式用户界面(UI)。
如果你想开始使用这个工具,这里有一个如何在 Jupyter 笔记本上使用的逐步指南。
[## 开普勒。GL & Jupyter 笔记本:优步开源开普勒的地理空间数据可视化。标距长度
在 Jupyter 笔记本中绘制地理空间数据&轻松地与开普勒的用户界面交互以调整可视化。
towardsdatascience.com](/kepler-gl-jupyter-notebooks-geospatial-data-visualization-with-ubers-opensource-kepler-gl-b1c2423d066f)
3. Pysal 2.0 : Python 空间分析库
Pysal 主要用于在 python 中进行空间统计,随着 2.0 的发布,它与其他地理空间库(如 Geopandas)的集成水平有所提高。Pysal 现在为 Python 中的地理数据科学包提供了一系列工具,包括探索性空间数据分析(ESDA)。
这里有一个关于如何和派萨尔一起表演 ESDA 的指南。
提示:不是通常的 EDA。关于如何使用空间探索性数据分析(空间分析)从数据中获得洞察力的指南
towardsdatascience.com](/what-is-exploratory-spatial-data-analysis-esda-335da79026ee)
4. GeoFeather
Geofeather 很小,但却是 Python 生态系统的一大补充。该库为 Geopandas 存储几何带来了更快的基于文件的格式,就像羽毛对于 python 一样。通过一个简单的实验,我发现 Geofeather 超级快。我必须等待 15 分钟才能用 Geopandas 编写 shapefile。用 Geofeather 用 Feather 写同样的文件只需要 25 秒。

5. PlotlyExpress
PlotlyExpress 虽然不是专门用于地理空间数据可视化的,但它用更少的代码为地理数据可视化带来了一个简单而直观的 API。您可能已经在《走向数据科学》的其他文章中看到过 PlotlyExpress 图表或地图,因为它立即被数据科学社区采用。
6.朴实
EarthPy 承诺将矢量和栅格数据处理集成到一个 python 包中。它建在 Geopandas 和 Rasterio 的顶部。对于当前的空间分析,我们处理多个库。在许多情况下,将这些功能结合起来具有一定的价值。这里有一些资源和例子。
7. PyGeos
PyGeos 是地理空间 Python 生态系统的新成员。它提供了矢量化函数来处理几何数组(Numpy),为这类用例提供了更好的性能(比 Shapely)和便利。

PyGeos 示例
8. Momepy :城市形态测量工具包
MomePy 于 2019 年底发布,是城市规划师和地理空间数据科学家的优秀补充,使他们能够对城市形态进行高级定量分析。该库提供了大量使用 Jupyter 笔记本的示例
其他令人兴奋的不是专门针对 python 和地理空间数据科学的新增功能包括 Streamlit(针对 web 应用程序)、BigEarthNet(地理空间大数据集)、 #Aerialod (3D 地理空间可视化)和 BlazingSQL (GPU 数据库)。
结论
又一年过去了,开源项目做出了重大而有意义的贡献。这些是 2019 年我个人最喜欢的一些工具,让我知道 2019 年你最喜欢的一些 Python 地理空间数据科学库。
2020 年初最好的 NLP 工具:现场演示
在项目中开始使用 NLP 的最简单方法

2019 年是 NLP 年。由谷歌、OpenAI、脸书和其他人开发的前沿模型对更广泛的受众公开可用。
在本文中,我收集了自然语言处理(NLP)和自然语言理解(NLU)工具的最佳现场演示,这些工具在市场上以开源或服务的形式提供(不需要注册或编码技能)。通过这些演示,我将为您提供一个截止到 2020 年初在自然语言分析方面取得的成就的高层次概述。
本文的目的不是深入探究技术的各个方面或涵盖这些工具提供的所有功能,而是为了弄清楚现代 NLP 世界中正在发生的事情,并更好地理解哪些成就可以作为开箱即用的实用工具。我个人使用这些演示来快速验证想法。
伯特——理解文本
演示 : 环节。
BERT 是谷歌发布的一个预训练模型,旨在更好地理解人们搜索的内容。

试着给它一段文字,问一些问题
与 word2vec 或 GloVe 等旧的上下文无关方法不同,BERT 会考虑单词的周围环境(上下文),以便在特定情况下理解用户输入,因为同一个单词在不同的上下文中可能有不同的含义或意义。它于 2018 年首次发布,从 2019 年 12 月开始,BERT 已正式用于谷歌搜索。
GPT-2 —创建文本
演示 : 环节。
GPT-2 是 OpenAI 的变压器模型。2019 年 2 月首次发布。它的主要目的是在给定文本中所有前面的单词的情况下,预测下一个单词。直到 2019 年底,由于担心它会被用来传播假新闻、垃圾邮件和虚假信息,只有更小、更不连贯的 GPT-2 版本被发布。然而,在 2019 年 11 月,OpenAI 表示已经看到“没有滥用的有力证据”,并完整发布了该模型。
现在,您可以使用它来完成您提供的文本。

粗体文本是手写的…

…其余的是由 GPT 2 号产生的
另一个玩 GPT-2 和 XLNet 的地方是在用变形金刚写。
空间—在生产中实施 NLP
演示 : 链接。
SpaCy 是由 ExplosionAI 开发的免费开源 NLP 库。它旨在帮助开发人员完成生产任务,我个人非常喜欢它。它还具有很好的可视化功能。让我们来看看它的一些特性。
文本标记化——用简单的话来说,将文本分割成有意义的片段:单词、文章、标点符号。稍后,这些片段可以一起或单独地被矢量化,以便相互比较(单词嵌入)。举个简单的例子,单词“猫”和“毛毛”在向量空间中比“猫”和“飞船”更接近。
这是另一个在 Reddit 评论上训练的例子,它显示了与你输入的单词最接近的概念:【sense 2 vec】。
让我们来看看与“凯文·史派西”相近的概念。2015 年,我们有其他演员,但 2019 年,我们主要有#metoo 背景。

2015 年对比 2019 年
命名实体识别 (NER)提供一组现成的实体(人员、组织、日期、位置等)。).你也可以用你自己的标签(即地址、交易对手、商品编号或其他)来训练它——你想从文件中提取的任何东西。
这里可以在标准类上试试: displaCy 命名实体可视化器 。

命名实体识别示例
依存关系识别 —当你需要从句子中提取连接结构时,这有助于建立规则。演示: 显示依赖可视化器 。

依赖关系及其类型
allenlp—一个著名的替代方案
演示 : 链接。
强大的原型设计和良好的文本预处理功能。没有 SpaCy 那么适合生产任务,但是广泛用于研究,并且可以通过 PyTorch 进行定制。因为它与 SpaCy 有很多共同的功能,所以回顾一下文本蕴涵演示是很有趣的。
文本蕴涵获取一对句子,并预测第一个句子中的事实是否必然隐含第二个句子中的事实。它并不总是工作得很好,但这是对话式人工智能的挑战之一,以揭示这种含义。

文本摘要—TL;速度三角形定位法(dead reckoning)
演示 : 链接。
通常,有如此多的可用信息,在处理之前对其进行提取是非常重要的。一般来说,有两种方法:基于抽取和基于抽象的摘要。基于抽取意味着只留下代表文章内容的最有价值的单词/句子。
这个演示使用了基于抽取的方法:您唯一需要做的事情就是说出您想要看到的结果句子的数量。基于抽象的方法让机器以更短的方式重新表述文本。
我之前的文章太长了(顺便说一句,你可以在这里找到它,所以我想把它的内容缩短到两句话。这是我得到的:
在过去的三年里,我在 DataArt 领导机器学习和数据科学,研究不同业务的要点,提出技术解决方案并进行实施。
云提供商正在快速开发 ML 服务,走着大数据服务在他们之前走过的路。
哦,好吧,让我们继续讨论云提供商:)
摘录摘要的其他 web 演示:Summary Zr、在线文本摘要生成器—免费自动文本摘要工具、文本分析 API 演示| AYLIEN
Google AutoML 自然语言
演示 : 链接。
谷歌可以说是世界上处理文本数据量最大的公司。当您进行自定义命名实体识别时,Google AutoML 通常比开箱即用的开源工具提供更高的准确性。它还有一个方便的注释 UI,所以你可以快速启动。它在其他任务上也同样出色。
我们来看一下情感分析的例子,从正面或负面内涵来给每一句话和整篇文章打分。

第二句是肯定的,而第一句是否定的
IBM 沃森
演示 : 链接。
IBM 也是一个非常强大的竞争对手。除了 Google AutoML 可以做的,在 IBM Watson 中你可以检查文本中描述的情感特征和概念。让我们在对话中试试:
“你知道,”阿瑟说,“每当我和一个来自参宿四的男人被困在沃贡气闸里,快要窒息而死在太空深处的时候,我真希望我年轻时听了我母亲对我说的话。”
“为什么,她告诉你什么?”
“不知道,我没听。”
沃森认为这是 72%的悲伤,这些概念还包括“银河系漫游指南”,这是文本的起源。
—
就提一下微软 Azure 文本分析,这里演示的是这里是。Amazon understand 演示需要注册,功能非常有限。
其他几件事也值得一提……
拥抱脸——对生产非常有用
演示 : 环节。
HuggingFace 通过对不同的 NLP 模型进行额外的训练或者将它们包装成易于插入的库,使得不同的 NLP 模型易于在生产中使用。特别地,基于 AllenNLP 的共指消解模块是市场上最流行的解决方案之一。
当您需要预处理文本以理解内部依赖关系时,这非常有用。

伯克利神经分析器
演示 : 链接。
Berkley 解析器通过将句子分解成嵌套的子短语来注释句子的句法结构。

如果你需要从可以用某种模板描述的句子中提取知识,这是很方便的(例如,名词短语是我正在寻找的)。
—
还有几个要看的是 NLTK 、斯坦福 CoreNLP 和 TextRazor 。这些库通常用于学习目的,有时支持上面提到的工具。
两全其美:从 BigQuery 调用 Auto ML
在 SQL 中进行预处理,然后使用自动 ML 表构建复杂的模型
我们现在在 BigQuery ML 中有了一个新的 model_type。除了线性模型、DNN 和提升树,我们现在可以直接从 BigQuery SQL 中使用 big kahuna ( Auto ML Tables )。

培养
这里的模型训练堆栈溢出标题和标签的模型,并预测帖子是否会有可接受的答案:
CREATE OR REPLACE MODEL advdata.so_answered_automl
OPTIONS(**MODEL_TYPE = 'automl_classifier'**, budget_hours=2.0, INPUT_LABEL_COLS=['answered'])
ASSELECT
title,
REPLACE(tags, '|', ' ') AS tags,
IF(accepted_answer_id IS NULL, False, True) AS answered
FROM `bigquery-public-data`.stackoverflow.posts_questions
WHERE REGEXP_CONTAINS(tags, 'google')
因为 Auto ML 根据空格标记文本,所以我们在 SQL 中做了一些预处理,将|字符转换成空格,然后将数据传递给 Auto ML。
预言
两个小时后(注意预算时间:预算越高,模型越好,通常,尽管如果模型没有改进,Auto ML 将缩短训练),我们有了一个训练好的模型。
我们可以使用该模型进行批量预测,就像它是一个原生的 BigQuery ML 模型一样:
SELECT * FROM ML.PREDICT(MODEL advdata.so_answered_automl,(
SELECT 'How to reverse string in BigQuery' AS title, 'google-cloud-bigquery' AS tags
UNION ALL
SELECT 'Check long string contains term' AS title, 'google-cloud-storage' AS tags
))
结果是:

这似乎有道理。贴有正确产品标签的清晰问题比贴有错误产品标签的模糊句子更有可能得到回答。
为什么这这么棒
这对 Google Cloud 上的通用 ML 工具包的补充是,我们现在可以利用 SQL 的能力来进行数据准备,然后将其交给 Auto ML 来进行神经架构搜索,以建立一个复杂的模型,甚至是一个包括自然语言处理的模型。
因此,我们现在有了 BigQuery 提供的数据准备的便利性和 Auto ML 表提供的最佳模型准确性。当然,我们也获得了 BigQuery 提供的数据工程能力,比如调度查询和大规模批量预测。不喜欢什么?
尽情享受吧!
用熊猫快速绘图

使用这些简单的内置函数快速可视化您的数据
Pandas 最好的特性之一是其 Series 和 DataFrame 对象中内置的plot函数。
但是用熊猫绘图的官方教程假设你已经熟悉 Matplotlib,并且相对来说对初学者来说是不宽容的。
所以我认为简单概述一下plot的功能对任何想要可视化他们的熊猫数据而不需要学习整个绘图库的人都是有用的。
要开始使用plot函数,你需要安装 Matplotlib(尽管你不需要直接使用 Matplotlib)。
pip install matplotlib
您还可以使用 iPython 魔法命令,指示 Jupyter 笔记本直接在笔记本中自动打印熊猫图。
In [1]: %matplotlib inline
每当使用熊猫的plot功能时,你的 Jupyter 笔记本将自动在笔记本中生成一个图表。
绘制系列对象
要自动可视化 series 对象中的数据,可以调用它的plot方法。
In [2]: import pandas as pdIn [3]: series = pd.Series([1,2,3,5], index=['a', 'b', 'c', 'd'])In [4]: series.plot()

熊猫系列中的一个简单情节
请注意 Pandas 如何将系列的索引用于 X 轴,而系列的值用于 Y 轴。
提示:您可以通过 shift 右键单击图像,然后选择“图像另存为…”来从笔记本中导出绘图
如果对系列使用数字索引而不是分类索引,Pandas 将正确调整 X 轴的刻度。
In [5]: series.index = [1, 1.75, 2, 4]In [6]: series.plot()

如果 X 轴的索引是数字,熊猫会自动缩放它
正如您已经看到的,Pandas 将在使用plot函数时创建一个折线图。您可以使用功能plot.[option]创建其他绘图类型。例如,您可以使用plot.area创建一个面积图。
In [7]: series.plot.area()

Pandas 支持多种类型的视觉效果,包括区域图表
您可以从系列对象生成的可用图表的完整列表可在文档中找到。
绘制数据框架对象
Pandas 还在 DataFrame 对象上提供了一个plot方法。
In [8]: data = {'a': [2, 1, 2, 9], 'b': [1, 0, 1, 2]}In [9]: df = pd.DataFrame(data, index=[-1, 0, 1, 2])In [10]: df.plot()

Pandas 支持一次绘制多个列
注意 Pandas 是如何在一个 Y 轴上绘制数据帧的两个列的,并且它使用数据帧的索引作为 X 轴。它还在左上角添加了一个标签。
还有其他专门用于数据帧的内置绘图方法,如plot.scatter方法。
In [11]: df.plot.scatter(x="a", y="b")

Pandas 使得从数据帧创建散点图变得容易
数据帧绘图方法的完整列表可在文档中找到。
其他绘图方法
最后,您可以使用来自pandas.plotting模块的附加绘图功能。例如,您可以从数据帧创建散布矩阵。
In [12]: df['c'] = [3, 6, 4, 1]In [13]: from pandas.plotting import scatter_matrixIn [14]: scatter_matrix(df)

熊猫也能从数据帧中快速生成散点图
其他方法的完整列表可在文档中找到。
感谢阅读!如果你觉得这篇文章有用,我写的是关于数据科学和编程的文章,所以请关注我以获得更多类似的内容。
你见过的最好的数据
用酷酷的数据可视化来看看这个世纪以来的世界状况。

照片由 slon_dot_pics 发自 Pexels
在研讨会上,你结束了一晚上的政治讨论和音乐。当你回家的时候,你会在集市上停下来买些东西。你穿着你的便服走向你的家,你发现你的妻子正在纺羊毛做新衣服。
这就是你作为古希腊贵族的生活。
事情已经发展到现在。
我们开发了对抗各种疾病的系统,建立了让你在任何时间联系到世界上任何人的技术。我们的社会从古希腊的阶级发展而来,我们的边界被重新划定。
过去的一个世纪见证了我们社会的一些剧烈变化。为了理解这种变化对世界的影响,我利用现有的数据创造了强大的可视化,这可以让你深入了解它。
让我们停止喋喋不休,直接进入冷静的想象。
预期寿命和生育率
从动画中可以明显看出,在 60 年代,亚洲和非洲国家的生育率(每名妇女平均生育子女数)超过 5。这些国家的预期寿命低于大多数西方国家。
随着时间的推移,生育率降低,预期寿命缩短。这两者之间似乎有着直接的联系,因为随着生育率的下降,国家的预期寿命变长,而 T21 的预期寿命变短。
这可以从下面的动画中推断出来。
儿童死亡率和 GDP
一个国家的人均 GDP 和儿童死亡率之间几乎是线性关系。
北美国家和西欧的人均国内生产总值高,儿童死亡率低。
在像叙利亚这样的东欧国家,像缅甸这样的亚洲国家,像肯尼亚和安哥拉这样的非洲国家,情况是不同的。他们仍然有相对较高的儿童死亡率和较低的人均国内生产总值。

随着人均国内生产总值的增加,儿童死亡率逐年下降。
谁得到的报酬更多?
北美人、西欧人和澳洲人的收入似乎比世界其他地方的人高。
你可以看到俄罗斯和乌克兰的收入随着苏联的兴衰而变化,中东的收入随着油价的波动而变化。
下面的动画更深入,让我们深入了解社会中哪些阶层的收入份额更大。
可见,在全世界范围内,收入最高的 10%的人所占的份额是最高的。
随着时间的推移,曲线向右倾斜,也就是说,富人越来越富。
谁在上网?
啊……互联网……这个神奇的东西让你有能力在网飞重播《T2 老友记》。

网上的人都是哪里人?我们来看看吧!

在互联网诞生之初,它仅限于美国,主要由大学和军队使用。
随着世纪之交,新技术的快速发展使人们能够接触到打开互联网大门的电脑。
中国拥有最多的互联网用户,其次是印度。
随着在过去十年中新的廉价设备的发布,人们和更便宜的数据计划,现在普通公民很容易负担得起互联网。
这可以从过去十年印度和中国用户的突然激增中看出来。
我们作为一个社会在这 100 年里已经走了很远,我们还有很长的路要走。去一个更美好的世界,在那里每个人都是自由的…
这里有一个显示完整数据的网页。
来源
灵感来源: 汉斯·罗斯林
棒球运动中决策的最佳工具
体育分析
运行预期矩阵提供了比第一眼更多的洞察力
我一直认为棒球经理是专家。他们知道什么时候换投手对比赛有利。他们通过三垒上的一个跑垒员来穿越牺牲的模糊性。有时他们甚至不得不决定跑步前进,而不是让庞然大物撞到。
大联盟级别的管理经验看起来令人眼花缭乱。在我开始研究 sabermetrics 和发现 RE24 之前,我是这样认为的。
在这篇文章中,我将展示一个经理如何使用运行预期矩阵,这是 RE24 计算的核心,通知他们在游戏中的决策。我们可以用这种技术来帮助许多领域的决策,但今天我们进行一个关于偷垒的案例研究。
RE24 的基础:运行预期矩阵
RE24 代表基于 24 种基本/输出状态的运行预期。这里重要的是理解什么是基本/输出状态。在每场比赛中,一名球员以特定的状态来到本垒。状态是指跑垒员在特定的垒上,以及有多少出局数。一个例子:“一垒和二垒上的跑垒员,没有出局”是一种状态。
击球手总是让你在不同的状态间转换。出局数可以改变,滑道的位置可以改变,或者两者都改变,或者都不改变。重要的是每一个州在这一局都有平均得分的分数。举例来说,当一名跑垒员在三垒上且有一人出局时,一个队在那一局中平均会多得 0.865 分。下面列出了基/出状态的预期运行的完整列表。

一局结束时得分的预期次数(数据来自 https://library.fangraphs.com/misc/re24/,图片由作者提供)
该表应理解如下。如果你在一垒有一名跑垒员,在一局结束前,你的球队平均会得 0.489 分。类似地,如果满垒没有出局,你的球队在一局结束时平均得分为 2.282 分,
RE24
这张桌子怎么会导致统计?利用这个表格,我们可以给每个球员的击球赋予一定的“附加值”。让我们看一个具体的例子来强调这一点。如果你在第三垒和第一个出局时出现了一个跑垒员,几乎可以肯定你会被要求打一个牺牲高飞球。你会因为一次打点而获得荣誉,但是你并没有完成与那次跑垒相关的所有工作。你应该得到多少学分?
“三垒跑,一垒出局”的跑垒期望值是 0.865。你的击球从“三垒跑垒,一人出局”转变为“无人上场,两人出局”的状态,跑垒期望从 0.865 减少到 0.095。然而,有 1 次跑垒得分。因此,你对那次跑步的贡献是次跑步得分——开始状态期望+结束状态期望= 1–0.865+. 095 = 0.23。也就是说,你成功完成牺牲飞的技能为你的团队增加了 0.23 点跑值。换句话说,大约 23%的 sac 苍蝇奔跑的工作是由牺牲的玩家完成的。
如果你搞砸了牺牲,那么你就会从“三垒跑,一人出局”的状态过渡到“三垒跑,两人出局”的状态,而没有得分。在这种情况下,你用0–0.865+0.413 =-0.452(用同样的公式)得到积分。你将你的团队平均得分减少了 0.45 分。
如果你查看每个球员在赛季中的击球次数,并将这些数值相加,你就会得到球员的得分,这是一个衡量你的球队总得分相对于联盟平均得分的指标。
使用运行预期矩阵进行决策
我不想说 RE24,我想说的是运行期望矩阵。我认为你可以在游戏中用这个矩阵来做决定。本文将是讨论如何使用这一思想的系列文章的第一篇。稍后我们将展示如何将击球模拟和跑步期望矩阵的思想结合起来回答问题。但是,今天我们从简单开始。再来说说偷垒。我们的中心问题是:什么样的偷窃率才是值得偷窃的呢?
让我们假设你是第一个没有出局的。该州的运行预期为 0.831。如果你成功抢到第二名,你的跑步期望值会一直上升到 1.068。一次成功的抢断广告 0.237 次运行的平均值。如果你错过了,你已经过渡到“无人开,1 人出局”状态,其值为 0.243,减少了 0.588 次运行。成功偷窃的概率有多大保证了这种风险?
解决办法:71.2%左右。
如果你的成功抢断率至少是 71.2%,那么如果你在第一个没有出局的情况下,你应该抓住一切机会抢断第二个。
在其他情况下,什么时候应该偷窃?
我们刚刚计算了一下,在第一次没有人出局的情况下,你需要在大约 71%的情况下成功抢断,才值得去抢断。其他情况呢?我是说,不同的出局,不同的跑垒员。下表显示了在每种垒/出局状态下,你的成功盗球率需要达到多少,才能让盗球增加你的平均跑预期。也就是说,如果你的偷窃率至少是显示的值,偷窃是一个好主意。注意:对于一垒和三垒的跑垒员,我们假设二垒被盗,对于一垒和二垒的跑垒员,我们假设三垒被盗。

增加预期运行所需的盗球百分比(图片由作者提供)
结论和细节
运行预期矩阵提供的工具允许我们进行许多类似上述的计算。我们可以模拟类似'的事情,什么时候故意保送一个球员是值得的?’或者‘什么时候你应该让一名球员挥棒离开,而不是牺牲一名三垒手?’和许多其他人。
这篇文章不一定是关于偷窃率的结论。相反,我们希望引入一个框架。主要的收获是,运行期望矩阵实际上可以以不同于最初预期的方式使用:为经理在游戏中可能做出的不同决策赋予价值。
在 BigQuery 中生成索引的最佳方式
对直方图使用 GENERATE_ARRAY 等等

是的,我在截图的时候不小心高亮了 GENERATE_ARRAY,但是它有点工作,不是吗?
当您偶然发现在 BigQuery 中创建直方图的第一个任务时,您可能会用一个简单的 GROUP BY 来处理它,类似于:
SELECT
hour,
COUNT(*) AS num_accesses
FROM
accesses
GROUP BY
hour
ORDER BY
hour
这很好,它做了一件体面的工作,会让你友好的同事拍拍你的背。但是它没有处理丢失时间的情况。例如,您可能在一天的大部分时间都有访问,但是在凌晨 3 点没有人访问您的站点,对不起。这会在你的直方图上留下一个缺口,这不是很好,是吗?在某些情况下,看起来很傻。
相反,我们可以使用各种技术来获得额外的一小时,我最喜欢的是结合 UNNEST 和 GENERATE_ARRAY 的和谐组合。
总体思路是生成一个包含所有可能值的数组,将该数组转换为行,然后使用这些行作为索引将结果连接到——您说这是初等的!让我们试试这个:
SELECT * FROM UNNEST(GENERATE_ARRAY(0, 23)) AS hour
该查询将生成一个包含数字 0、1、…、23 的数组,传递给 UNNEST,UNNEST 获取这些值并将其放入行中,最后标记为 hour。
有了这个索引,我们就可以做一个左连接(我们希望保留索引中的空行,否则一切都是徒劳的)。我们最后的查询看起来像这样:
WITH index AS (SELECT * FROM UNNEST(GENERATE_ARRAY(0, 23)) AS hour),hourly_counts AS (
SELECT
hour,
COUNT(*) AS num_accesses
FROM
accesses
GROUP BY
hour
)SELECT
hour,
COALESCE(num_accesses, 0) AS num_accesses
FROM
index
LEFT JOIN hourly_counts USING (hour)
ORDER BY
hour
可变界限
代替我们上面使用的方便的预定义边界,您可能有可变的边界。例如,如果您试图生成一天中访问次数的直方图。同样,您可以尝试应用一个GROUP BY,但是您不会有丢失的索引。
WITH daily_accesses AS (
SELECT
day,
COUNT(*) AS num_accesses
FROM
accesses
GROUP BY
day
)SELECT
num_accesses,
COUNT(*) AS num_days
FROM
daily_accesses
GROUP BY
num_accesses
ORDER BY
num_accesses
不行!因此,让我们再次尝试生成索引,但这次使用可变边界,因为任何给定日期的num_accesses都是不受约束的。
SELECT
*
FROM
UNNEST(GENERATE_ARRAY(
(SELECT MIN(num_accesses) FROM daily_accesses)mi,
(SELECT MAX(num_accesses) FROM daily_accesses)ma
)) AS num_accesses
从我们的每日访问表中,我们取出了最小值和最大值,分别给出了下限和上限。将所有这些结合在一起,我们得到:
WITH daily_accesses AS (
SELECT
day,
COUNT(*) AS num_accesses
FROM
accesses
GROUP BY
day
),day_counts AS (
SELECT
num_accesses,
COUNT(*) AS num_days
FROM
daily_accesses
GROUP BY
num_accesses
),index AS (
SELECT
*
FROM
UNNEST(GENERATE_ARRAY(
(SELECT MIN(num_accesses) FROM daily_accesses)mi,
(SELECT MAX(num_accesses) FROM daily_accesses)ma
)) AS num_accesses
)SELECT
num_accesses,
COALESCE(num_days, 0) AS num_days
FROM
index
LEFT JOIN day_counts USING (num_accesses)
ORDER BY
num_accesses
比上一个例子稍微复杂一点,但是原理是一样的。
日期索引
最后,在数据之旅中,您可能会遇到日期索引。您可以使用 GENERATE_ARRAY 生成一个数字,然后使用 DATE_ADD 之类的东西来获取日期,但是 Bigquery 有一个内置函数 GENERATE_DATE_ARRAY。
现在考虑一下,如果我们想获得 2020 年网站的日访问量(现在是复习时间!).因为这是充满变数的一年,可能会有几天没有任何访问。
同样,我们的基本查询:
SELECT
date,
COUNT(*) AS num_accesses
FROM
accesses
GROUP BY
date
ORDER BY
date
我们创建的索引是这样的:
SELECT * FROM UNNEST(GENERATE_DATE_ARRAY(
'2020-01-01',
CURRENT_DATE()
)) AS date
这将为 2020 年的今天之前的每一天创建一个日期。给出最终的查询。
WITH index AS (
SELECT * FROM UNNEST(GENERATE_DATE_ARRAY(
'2020-01-01',
CURRENT_DATE()
)) AS date
),daily_counts AS (
SELECT
date,
COUNT(*) AS num_accesses
FROM
accesses
GROUP BY
date
)SELECT
date,
COALESCE(num_accesses, 0) AS num_accesses
FROM
index
LEFT JOIN daily_counts USING (date)
ORDER BY
date
间隔
到目前为止,在所有的例子中,我们假设间隔是 1(或 1 天),但是使用不同的步长是完全合理的,比如每 7 天。为了实现这一点,您可以向 GENERATE 函数传递一个额外的参数,该函数将返回一个调整后的索引。在这种情况下,在如何连接底层数据方面,您需要更加巧妙一些,但是对于坚定的数据鼓吹者来说,这是可以实现的!
希望这种生成索引的简单方法能在下次需要定义良好的索引时帮到你。如往常一样,如果您想了解更多信息,请查看 Bigquery 文档。
如果你使用任何其他有趣或方便的方法,请告诉我!
投资市场的最佳策略
使用 Python 比较一次性投资与美元成本平均的实证分析
在金融界工作,我不可避免地会被问到“我应该买什么股票?”。因为我很清楚我没有机会持续跑赢市场,所以我每次都用同样的三个字来回应,“买间谍”对于那些不熟悉的人来说,SPY 是一种跟踪标准普尔 500 的交易所交易基金,所以以 300 美元左右的价格购买一股 SPY 就像是购买标准普尔 500 每只股票的很小一部分。这就回答了“什么”。
接下来是“为什么”。为简洁起见,我将提到的主要优势是多样化。购买《间谍》的股票是获得多元化投资组合的一种非常廉价的方式,它允许一个人将所有鸡蛋放在许多不同的篮子里,以降低特殊风险。
大家都知道“当”:低买高卖。历史表明,很少有人(如果有的话)能够真正预测市场的波峰和波谷,所以今天实际上和其他任何一天一样适合投资。
最后,我们到达“如何”。我将在本文中比较的两种投资策略是一次性投资和美元成本平均法(DCA)。
一次总付投资是指一个人把她的钱一次性全部投资,而美元成本平均法是把这些钱分成大小相等的几笔,在固定的时间间隔内进行投资。例如,假设我们有 10,000 美元可以投资。如果投资者进行一次性投资,她会在一个日期投资所有的 1 万美元,如下面第一个图表中的单个红点所示。然而,当她一年的平均成本为美元时,她每月投资 10,000 美元/12 = 833.33 美元,持续 12 个月,如第二个图表中的 12 个蓝点所示。

一次性投资让投资者更快地接触到市场,但可能比平均成本投资更不稳定。话虽如此,我还是很好奇,想看看在股票市场的历史上,一种策略是否胜过另一种策略。
我们可以通过在过去的每个交易日模拟一次总付和 DCA 投资策略,并比较它们今天的回报,来测试这两种策略的历史表现。为此,我首先需要使用 DataReader 获取历史间谍价格。请注意,这些是考虑到股息收益率和股票分割的调整价格。

这些价格看起来准确干净,下一步就是模拟一次性投资。我使用的是大约 10,000 美元的投资,并跟踪它到今天会增长到多少,因此我们阅读下面的图表,假设在 2006 年 1 月 3 日(x 轴上的日期)进行的 10,000 美元投资今天会增长到大约 33,000 美元(y 轴值)。有趣的是,在 2008/2009 年衰退前的绝对高点投资,今天仍然会留下大约 1.5 万美元,这证明了杰里米·西格尔的长期股票。

现在来看美元成本平均模拟。这稍微有点微妙,因为我将 1 万美元的投资分散到 12 个块中,每个块间隔 1 个月,其中一些日期不在开市的那一天。幸运的是,Github 用户 explation 有一个使用 Panda 的解决方案。searchsorted()方法来获取下一个最接近的有效投资日期。有了有效投资日期的列表,我就可以使用之前的一次性投资函数来模拟在每个日期投资$ 10k/13 = 833.33 美元。对于不到 1 年前的开始日期,我持有未投资的现金,并在结束时简单地增加现值。
显而易见,这种策略比一次性投资要顺利得多,但它一定更好吗?

下面我用正的绿色值画出了这两种策略的区别,这些值代表了今天一次总付比 DCA 赚更多钱的时间。红色负值表示 DCA 策略今天比一次性投资回报更多的时间。在导致衰退的时候,缓慢而稳定的 DCA 策略会取得胜利,但在市场大幅下跌后,一次性投资会大有斩获。

简单地看一下在过去 25 年的数据中,哪种策略每天都能产生更高的资金量,我们看到一次性投资在 76.48%的时间里击败了美元成本,平均而言,投资者的口袋里多了 1,324.84 美元(基于 1 万美元的投资)!市场长期上涨的总体趋势似乎使一次性投资比平均成本投资更具优势。
作为最后一点,我应该提到,与保持头脑冷静、不在糟糕时期恐慌性抛售或过度投资泡沫的能力相比,这两种策略之间的差异相对较小。更多规避风险的投资者可能更喜欢 DCA 而不是一次性付款,但这两种策略的关键是在没有情绪影响的情况下买入市场,并长期持有你的投资。
奖金即:所有三个图表排队

Github 用户,“说明”获得了巨大的荣誉,其原始的总额与 DCA 分析是本次分析的主要参考。
感谢阅读,完整代码可在这里找到。要获得所有媒体文章的完整访问权限,请点击此处!
注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
选择单位向量的最好方法
使用 Box–Muller 变换在一个 n 维空间中生成无偏随机方向

问题是
有时,模拟或数值解算器需要生成随机单位向量,这些向量公平地表示一个 n 维空间中的所有方向。也许你正在模拟气体中的分子,你想模拟它们的随机碰撞。也许你想探索高维空间中一个点的邻域,以找到一个函数的局部最小值。或者,您可以渲染一个光线跟踪场景,该场景包含来自粗糙表面的光子散射。
在这种情况下,在你的科学编程工具箱中有一个随机单位向量生成器是很方便的。理想的算法将挑选在 n 维空间中指向随机方向的单位向量,没有任何偏差。这意味着,随着时间的推移,单位向量将均匀地分散在以原点为中心的一个 n 维单位超球的表面上。
天真的解决方法
最明显的解决方案是从范围[1,+1]中均匀选择 n 个随机数,形成一个向量:
然后除以向量的长度,归一化为单位向量:
为什么它不起作用
这种幼稚的算法偏向某些方向,远离其他方向。更具体地说,它代表了与你选择的笛卡尔轴成对角线的方向。为了证明这一论断,考虑二维情况。让我们从一个刻有单位圆的网格开始:

选取一对随机向量分量就像从网格中选取一对相交的线。线相交的点定义了从原点开始的方向向量。
现在考虑从原点发出的两个不同的饼图切片,一个围绕正 x 轴,另一个与 x 轴成大约 45 度角:

假设两个切片包含相等的角度跨度。假设我们从这个网格中选择随机的 x 和 y 值,并且都来自范围[1,+1]。然后,每个随机点( x , y )将位于单位圆外的紫色正方形内或正方形上。
绿色对角线之间的点比横跨 x 轴的红线之间的点多。这是因为对角线方向的圆外点比水平方向的多。
随着网格变得越来越小,线之间的间隙越来越接近零,每个区域中的点数与相应的封闭区域成任意比例。对角线区域比水平区域包含更多的区域。如果你想象随机向镖靶投掷飞镖,它更有可能击中面积更大的区域。
因此,使用统一笛卡尔坐标选择的点更可能出现在对角线上,而不是正交线上。简单的方法无法通过偏倚测试:它不能以相等的概率从所有方向进行选择。
更好的解决方案
在这种二维情况下,一个有效的替代方法是在半开范围[0,2π]内选取一个随机角度 θ 。那么无偏单位向量就变成了(cos θ ,sin θ )。然而,这仅在二维情况下有效。我们想要一个在任何正数维度上都能工作的解决方案。
再次看上面的图表,我们看到偏差的出现是因为正方形内圆外的点数随着角度的变化而变化。如果我们总能在圆内选择一个点,偏差就会消失。
这表明了一种改进的算法:为每个矢量分量选取一系列随机坐标,但如果它位于圆、球或 n 维空间的超球之外,则拒绝选取。换句话说,继续挑选另一批 n 个随机数,直到它们满足
一旦你在边界半径内找到一个点,每个方向都被相等地表示,并且单位向量有一个无偏的方向。
这种方法适用于二维或三维,但在一般情况下会有一个问题。
高维空间的低效率
循环直到我们在 n 维超球中找到一个点的问题是,随着 n 维超球的增加,效率越来越低。上述总和中的每个平方项可以取从 0 到 1 的值。有了 n 项,平方和的范围可以从 0 到 n 。
随着 n 的增加,总和超过 1 的可能性越来越大。当维数足够高时,你的程序将花费越来越多的时间循环,直到找到一个单位半径内的点。
(有趣的是,这揭示了一个关于高维几何的令人惊讶的事实:随着维度无限制地增加,超球体的体积与其包围的超立方体的体积之比趋近于零。)
如果有一种算法可以选择一个随机的方向向量而不需要繁琐的循环,那就更好了。
一般解决方案:高斯分布
因为均匀随机分布不适合选择空间中的无偏方向,所以问题的解决方案是找到一些补偿任何方向偏差的非均匀分布。期望的分布将抵消由坐标轴的选择引入的任何人为偏差。
事实证明,答案对任何一个学统计学的学生来说都是熟悉的:高斯(或“正态”)分布。这是一个随机分布,其概率密度函数呈现著名的钟形曲线形状。
概率密度函数对你来说可能很陌生。让我们后退一步,重新审视我们开始时的原始均匀分布。这种均匀分布是一种机器,它输出一系列始终在范围[1,+1]内的随机数。一致意味着该数在[-1,+1]内的任何小范围内的概率,比如[+0.37,+0.38],与在任何其他相同大小范围内的概率完全相同,例如[0.67,0.66]。
因为每个均匀选择的随机数必须在[1,+1]范围内,所以我们说在该范围内的概率为 1。同样,数字超出该范围的概率为 0,这意味着永远不会发生这种情况。
用总概率 1 除以范围大小(+1)(1)= 2,得到概率密度。这个密度值告诉我们,随机数在[+0.7,+0.8]范围内的概率是范围大小的一半,即(0.8-0.7)= 0.05。
均匀概率密度的图形看起来像这样:

显而易见,如果使用均匀分布来挑选矢量分量导致结果矢量偏离笛卡尔坐标轴,则期望的非均匀分布必须具有每个分量朝向零的补偿偏差。高斯正态分布函数为:
其中σ是分布偏离平均值 0 的标准偏差。正如我们将在后面看到的,一旦我们归一化为单位向量,我们可以为σ选择任何正数来获得无偏方向。正态分布图产生以下钟形曲线:

这种分布当然更经常地选择接近 0 的数字,而不是远离 0 的数字,随着 x 在两个方向上远离 0,概率逐渐变小。
为什么有效
上面的推理很模糊,并不能证明什么。我们怎么知道一个向量的分量是从正态分布中选取的,它一定指向一个完全无偏的方向?有一个简单的方法可以证明。
第一步是将每个向量分量的概率密度函数与整个向量的概率密度相关联。上面显示的正态函数, p ( x ),描述了在 x 的任何特定值附近选择一个值的相对可能性。在二维情况下,我们将相同的函数应用于另一个坐标 y 。由于我们选择使用相同正态分布的 x 和 y ,因此 p ( y )描述了在任何给定值附近选择 y 的概率密度。
当你有两个独立的事件时,这两个事件发生的概率是它们各自概率的乘积。所以在任意给定值附近选择一个向量( x , y )的概率用乘积p(x)p(y)来描述。
在我们进一步讨论之前,让我们选择一个使事情尽可能简单的值σ:
那么 p ( x )就变成了:
看看产品p(x)p(y)发生了什么:
神奇的事情就发生在这里。数量 x + y 可以用 r 代替,其中 r 是矢量的长度( x , y )。换句话说,当使用正态分布选择 x 和 y 时,选择给定对( x , y )附近的向量的可能性为
关键见解:落在( x , y )的无穷小邻域内的可能性只取决于向量( x , y )的长度 r 。向量指向的方向不会影响你选择它的可能性。
换句话说,我们找到了一种将乘积p(x)p(y)从笛卡尔坐标( x , y )转换到极坐标( r , θ )的方法,其中 r 是到原点的距离因为 θ 从来不会出现在概率密度函数中,所以它不能影响我们在任何给定的角度 θ 选择一个向量的可能性。各个角度可能性都是一样的!这正是我们一直想要的财产。
更好的是,这种角度无关性适用于任何数量的维度。在一般情况下,n 维概率密度积变成
因为毕达哥拉斯距离公式适用于任何维数,我们可以用 r 代替 n 平方分量之和,得到一个只取决于向量长度的概率分布。
box–Muller 变换
高斯正态分布听起来很棒,但是如何生成具有这种分布的随机数呢?大多数编程语言中都有统一的随机数生成器。将均匀分布转换成正态分布会有所帮助。
1958 年,George E. P. Box 和 Mervin E. Muller 发表了一篇两页的关于随机正态离差产生的笔记,展示了如何做到这一点。他们的方法成对产生正态分布的随机数。给定两个均匀分布的随机数 A 和 B ,均来自半开范围(0,1),Box-Muller 变换计算一对独立的正态分布数,如下所示:
值得强调的是 A 绝对不能为零,因为零的对数没有定义。继续使用这些公式生成数字对,直到有 n 个数字来完成一组矢量分量。如果 n 是奇数,您可以保留剩余的生成值,并将其用作您生成的下一个向量的第一个分量,或者您可以简单地丢弃它。无论哪种方法,作为最后一步,除以得到的向量的长度,得到单位向量 v :
以这种方式生成的单位向量将是完全无偏的,在 n 维空间中具有指向任何方向的相等概率。
用 C 语言实现
我已经用 C 编程语言提供了一个示例实现:
使用 Box-Muller 变换生成具有无偏方向的随机单位向量 GitHub 是超过 50…
github.com](https://github.com/cosinekitty/randomvector)
在 Python 中甚至更容易
对于 Python 程序员来说,numpy项目提供了一个现成的随机生成器,可以生成正态分布的值:
>>> **import numpy**
>>> **numpy.random.normal()**
0.3850365612479212
>>> **numpy.random.normal()**
0.8785540204204144
>>> **numpy.random.normal()**
-0.32533367867722596
随机单位向量生成器非常简单。只需调用randomvector,将维数作为n传入,您将得到一个包含无偏单位向量分量的列表。
参考
- 超球点拾取【Wolfram MathWorld】。
- Box–Muller 变换【维基百科】。
- 样本 C 源代码作者【GitHub】。
实践数据科学工具的最佳方式
磨砺你的技能。

图片由皮克斯拜的 Gerd Altmann 提供
数据科学是一个跨学科的领域。创建数据科学产品需要数学、统计学和软件技能。除了这些工具,您还需要具备分析思维技能和领域知识,以便能够提出从数据中创造价值的想法。
在如此广阔的领域,你既需要理论知识,又需要实践技能,才能做出色的工作。虽然一些公司在创建产品的管道中划分角色,但数据科学家的角色应该在某种程度上覆盖整个管道。
在本帖中,我们将关注实践方面,以及如何以这种方式提高你的技能。
由于数据科学是一个如此受欢迎的领域,因此有各种各样的软件工具,并且新的工具很快就会发布。学习这些工具的最好方法是实践。您可以阅读文档、文章或观看教程。然而,当涉及到实际的“学习”时,你需要大量的练习。
有许多练习的选择,但我认为最好的是 Stackoverflow 。我会试着解释为什么。
Stackoverflow,如果你还没有访问过的话,是一个人们提问并从其他人那里得到答案的网站。它包含了大量不同主题的知识。自从我开始了我的数据科学之旅,我不记得有哪一天我不在 Stackoverflow 上寻找一些东西。
在这篇文章中,我将会讲述 Stackoverflow 可以并且应该如何用于实践。
首先资源是无限的。例如,到目前为止,有超过 167 K 个问题标记为 Pandas,这是使用最广泛的数据分析库。

再具体一点,搜索“列表理解 python”。有 12 K 多题对于练习来说绰绰有余。

很可能在 Stackoverflow 上没有讨论过某个常见问题。因此,它提供的是一本无限页数的练习题书。
只是看问题,想办法解决。问题会在很短的时间内得到回答,因此您有机会评估您的解决方案。
如果你不能想出一个解决方案,那就去看看别人是怎么做的。试着理解他们是如何处理问题和解决问题的。

图片来自皮克斯拜
注意解决方案的不同。一个问题几乎总是有不止一个解决方案。通过比较和评估不同的观点,你将对一个主题有全面的了解。
这些问题通常来自现实生活中的用例。数据科学领域的工作人员可能会询问他们日常工作中出现的问题。因此,您将处理作为数据科学家工作时可能遇到的典型问题。
也有来自正在从事项目或任务的数据科学爱好者的问题。在这些问题上花时间也会提高你的技能。
学习东西的最好方法是把它教给别人。在 Stackoverflow 上,你不仅要解决一个问题,还需要解释你的解决方案。它需要清晰和良好的沟通,以获得更多的选票。你必须善于交付你所做的。这肯定会提高你讲故事的技巧,这是数据科学家的一项基本任务。
最后但同样重要的是,你有机会帮助那些努力解决自己的任务、问题或任务的人。帮助一个你甚至不认识的人感觉很好。那是一种高效的激励!
总结
让我们抓住要点:
- 在 Stackoverflow 上有无限的练习机会。
- 疑问和问题通常来自现实生活中的案例。
- 你有机会提高你讲故事的技巧。
- 你可以帮助别人。
感谢您的阅读。如果您有任何反馈,请告诉我。
开始学习数据科学的最佳方式是理解其背景
数据科学教育
先学习上下文,再钻研内容

照片由达瓦尔·帕尔马拍摄
目录
语境知识的重要性
在大学四年级的时候,我决定将我的职业道路定位于数据科学。只进行了一两次研究,我就意识到了我面前领域的广阔深度。我知道最终我必须了解卷积神经网络的架构,NLP 的数值化过程,或者主成分分析的基础。然而,我总是需要先建立一个坚实的知识背景基础,而不是凭空跳入这些概念的细枝末节。我将这种方法称为基于上下文的学习。
什么是基于上下文的学习?
我将粗略地将基于上下文的学习定义为通过首先关注其上下文元素来学习一个概念。换句话说,在钻研深层理论之前,先了解大局。在定义中强调“第一”是很重要的,因为学习上下文类似于制造汽车底盘。虽然底盘是必不可少的元素,但它不是一辆汽车,它本身是没有功能的。相反,它是制造汽车的基石。同样,上下文框架是技术内容的基础。
(可选)支持基于上下文的学习的研究
这种学习方式利用了学习心理学研究充分支持的一个事实——人类通过将知识与他们牢牢掌握的东西联系起来,而不是在空白中记忆新概念,来最有效地保留知识。简而言之,我们通过联想来学习。
伊利诺伊大学已故教育心理学教授 Barak Rosenshine 博士在教学原则:中强调了这些背景框架在教育中的重要性
当一个人在某一特定主题上的知识丰富且联系紧密时,就更容易学习新的信息,先前的知识也更容易利用
你拥有的背景知识的多少也与你对新材料的理解程度相关。因此,为了最有效地学习,在钻研细节之前,必须先打下坚实的背景知识基础。
数据科学的背景
那么什么是数据科学的背景知识呢?嗯,我总是通过问许多问题来开始基于上下文的学习。具体来说,我试着问宽泛的概念性问题,而不是面向细节的问题。
以下是我在开始数据科学之旅时首先问自己的几个问题,以及我提供的答案。我想强调的是,我的回答填补了我当时的知识空白。同样,你应该以一种与你的教育和个人背景直接相关的方式回答这些和其他问题。
数据科学如何融入我对其他领域的理解?
数据科学是一个跨学科领域,它利用数学、编程、商业和领域知识来解决困难的数据问题。数据科学和我的专业(具有机器学习和神经计算的认知科学)之间的重叠部分取决于数学(机器学习所必需的),编程(为整个领域提供计算功能),以及数据分析技术,如计算神经科学中使用的技术。数据科学中的“科学”来源于其对各种科学方法论的运用,比如统计显著性。
数据科学最重要的元素是什么,它们之间有什么关系?
所有数据科学家都要经历一个被称为“数据科学管道”的过程,本质上是一个循序渐进的端到端过程,概述了数据科学家的工作流程。像 OSEMN 这样的首字母缩略词使得基本的管道很容易记住,但是一般来说,管道的微妙之处各不相同。基本结构如下:
- 数据收集
- 数据清理
- 探索性数据分析
- 模型结构
- 可视化/模型部署
什么是机器学习?为什么机器学习与数据科学如此紧密地联系在一起?
机器学习(ML)是一个研究计算机科学算法的领域,这些算法不是传统的“封闭”算法。相反,ML 算法从数据中“学习”。这种对数据的依赖使得 ML 成为数据科学不可或缺的一部分。ML 属于数据科学管道中的“模型构建”和“模型部署”类别。
数据科学有哪些子学科?
有许多领域对数据科学有贡献,但构成数据科学的最基本的学科是计算机科学、统计学、机器学习和线性代数。虽然业务和领域知识也很重要,但数据科学的学术范围依赖于前面提到的原始子学科。此外,子学科本身通常有自己的子学科,例如微积分对于理解机器学习算法如何工作是必要的。
理解概念,而不是计算
我在大学数学学习早期发现的一个重要的二分法是计算和概念理解之间的区别。例如,在统计学的例子中,记忆如何计算这个

远不如理解卡方检验统计在检验分类变量之间的假设时的用例重要。或者,对于微积分,理解这一点

描述二次曲线下的面积远比记忆手工求解的奇特方法重要。(咳咳)
实际上,我发现构建程序是一个非常准确的类比。当学习编程时,很明显,很早就知道试图学习每个函数的每个实现是不可能的。一个更有效的策略是理解输入和输出,这样您就可以将代码片段拼凑在一起,让事情正常运行。

作者图片
即使在不使用 google 或 StackOverflow 的情况下,像 fastai 这样的课程也会将绝大多数实现抽象掉,这样你就可以先构建一个理解的端到端框架(在 fastai 的情况下,构建一个端到端模型),并且只有在之后的你才可以回过头来尝试理解抽象背后的基本细节。
这样,学习与计算相对的概念是基于上下文的学习的应用,因为上下文框架已经建立,所以当你需要学习计算时,它们被适当地划分。
子学科的背景
遵循基于上下文的学习方法,一旦我们弄清楚了数据科学的子学科,我们就应该挖掘它们的上下文,以了解它们如何适应该领域的整体范围。
计算机科学
为什么所有的数据科学项目都这么重编码?
现代统计学可以追溯到 19 世纪,然而统计学的应用仅限于小样本,因为没有有效的方法来组织大量数据和计算参数。电脑意味着。
此外,GPU 并行处理的出现使机器学习模型的训练速度提高了数百倍。从本质上说,通过计算机可以获得非常强大的统计工具,因此对编码的重视。
进一步提问:对于数据科学来说,什么编程语言是最重要的? 数据科学我需要多少编程?
统计数字
为什么统计学对数据科学很重要?
鉴于大多数数据科学只是计算统计学,该领域为数据的严格数学分析奠定了基础和工具集。
进一步提问: 贝氏到底在说些什么? 数据科学家使用哪些具体的统计库?
线性代数
什么是线性代数,它与数据科学有什么关系?
线性代数就是研究线性方程。堆叠在一起的多个线性方程可以表示为一个矩阵。矩阵是行和列中数字的集合,本质上等同于表格数据(表中的数据)。此外,图像数据只不过是元组的 n 维向量(即数字列表的列表)。这就是为什么对线性代数的良好理解提供了对数据本身结构的理解。
进一步 Qs:什么是张量? 线性代数在深度学习中是如何使用的?
机器学习和微积分
微积分和机器学习有什么联系?
微积分的一个重要组成部分是最优化的研究。由于所有机器学习算法的目标是最小化误差函数,微积分提供了理解最小化如何发生的工具。
进一步 Qs: 什么是梯度下降? 什么是反向传播? 为什么会涉及微积分?
后续步骤
问自己一些概念性的问题。很多概念性的问题。这些问题因人而异,因为它们的目的应该是填补知识空白,让数据科学融入您对该领域的整体理解。
发挥创造力。我的一位同事提到,可视化地图真的帮助她理解了人工智能、机器学习和深度学习的背景,以及它们如何融合在一起。同样,使用地图和流程图来理解您目前正在努力拼凑的数据科学中的任何主题。

作者图片
在您对数据科学有了深刻的背景理解后,继续深入挖掘各种监督算法的细微差别、数据预处理的最佳实践或使用 Tableau 创建漂亮的仪表板可视化。
试着确保每一个新的概念都被放入到整个过程中。
塞尔达 BOTW 传说的最佳武器组合
用 Python 来确定《塞尔达 BOTW 传说》中林克可以拥有的最佳武器组合
最近偶然看到一篇文章,题目是你该挑哪个 PUBG 武器组合?作者梅雷迪思万我觉得很有意思。这篇文章给了我为我最喜欢的游戏之一 《塞尔达传说:野性的呼吸》 选择武器组合的想法,使用 Python 和 Pareto 优化。那么,我们开始吧。
免责声明 : 本文基于我对 BOTW 武器公开数据集的分析,该数据集可能不包含所有信息,仅用于适应、学习和理解帕累托优化的概念。这不是任何官方研究的一部分,结果可能与现实世界的应用和不同的个人观点相矛盾。

武器库存(来源:我的任天堂 Switch)

希尔兹库存(来源:我的任天堂 Switch)

弓箭盘点(来源:我的任天堂 Switch)
使用的功能
在塞尔达 BOTW 发现的武器有两个我在这篇文章中考虑过的重要特征。分别是耐久性和强度。我用一些研究和我自己扮演塞尔达·BOTW 的经验定义了这些术语。
1.持久性
耐久度是指你可以使用武器的次数,即你可以用武器击中/射杀敌人的次数。之后,武器就坏了。耐久性越高,可以使用武器的次数就越多。
2.力量
力量(或攻击力 ) 是你一击能对敌人造成的伤害量。当你击中一个敌人时,这个数量会从敌人的生命值中损失。力量越高,对敌人造成的伤害越大。
数据集和预处理
当我在搜索塞尔达 BOTW 发现的武器数据集时,我偶然发现了一个名为 完整数据库+搜索 BotW 的 Reddit 线程,在那里他们提供了一个链接,链接到一个惊人的所有武器、盾牌、弓、盔甲、材料和食物的数据库。您可以在中下载数据集。csv 格式。
对于我们的分析,我们将需要以下导入。
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from itertools import combinations
我已经使用下面给出的代码将数据加载到熊猫数据框架中。
dataframe = pd.read_csv(“Zelda-data.csv”)

初始数据帧(图片由作者提供)
您可以看到有许多不必要的列和未指定的值。我必须做一些预处理来清理数据集。首先,我删除了所有不必要的列,保留了列name、class、subclass、durability和strength。
columns_to_remove = ["image", "tags", "range", "arrows", "defense", "selling_price", "bonus_set", "upgrade_1", "upgrade_2", "upgrade_3", "upgrade_4", "armor_upgrade", "where_to_find", "notes", "defense_upgrade_lvl1", "defense_upgrade_lvl2", "defense_upgrade_lvl3", "defense_upgrade_lvl4", "bonus", "description"]for col in columns_to_remove:
dataframe = dataframe.drop(col, axis=1)
主剑是塞尔达 BOTW 中最强大的武器之一。它的耐久性是无限的,因为它从不断裂。所以我们会看到大师剑的耐久度并没有规定。因此,我添加了一个大于数据集中最大值的值,以保证其持久性。可用的最大值是 80,我用 200 来测试它的耐用性(根据这里找到的链接)表明在完全加电的版本中,主剑在需要充电之前有近 200 次攻击。

林克得到大师剑(来源:我的任天堂 Switch)
我相应地用 0 或“无”替换了未指定的值。此外,我从数据集中删除了所有类型的箭头,因为它们没有指定任何耐久性或强度值。
我从数据集中移除了光之弓,因为这种武器只有在击败灾难加农后才可用,并且当你来击败加农的最终形态黑暗击败加农时才可用。
现在,我将武器、盾牌和弓分别存放如下。
weapons = dataframe[dataframe["class"] == "Weapon"]
shileds = dataframe[dataframe["class"] == "Shield"]
bows = dataframe[dataframe["class"] == "Bow"]
用于分析的概念
在进入分析细节之前,我将介绍一些我们将用于分析的术语和概念。
相关和 C 或相关矩阵
相关性是一种用于显示两个变量相互之间关联程度的技术。我们在一个相关矩阵中表示这一点,该矩阵表示变量对之间的相关系数。
我们将使用武器的耐久性和强度及其组合的相关矩阵来了解它们之间的关系。
weapons = dataframe[dataframe["class"] == "Weapon"]fig, ax = plt.subplots(1,1, figsize=(10,5))
my_cols = ['durability', 'strength']
all_cor = sns.heatmap(weapons[my_cols].corr(), fmt=".3f", annot=True)
下图表示武器、盾牌和弓的耐久性和强度的相关矩阵。

表示武器相关矩阵的热图(图片由作者提供)

标示护盾相关矩阵的热图(图片由作者提供)

显示弓相关矩阵的热图(图片由作者提供)
正如所料,你可以看到耐用性和强度之间存在完美的正相关关系。我们还可以看到,弓显示出耐久性和强度之间更强的线性关系,因为相关值比盾牌和弓更接近 1。武器显示出耐久性和强度之间最弱的线性关系。
基于 Pareto 的多目标学习
根据维基百科,
多目标优化 (也称为多目标规划、向量优化、多目标优化、多属性优化或帕累托优化)是多目标决策的一个领域,它涉及的数学优化问题涉及多个同时优化的目标函数。

帕累托有效和帕累托无效的解决方案(图片由作者提供)
在多目标优化中,我们有多个目标(例如,在我们的例子中有durability和strength),我们必须最大化这些目标并确定不同的最优组合。我们得到一个 帕累托有效 (或帕累托最优 ) 解当这个解不受任何其他可行解支配时。简而言之,这个解决方案无法在不使至少一个目标恶化的情况下使一个目标变得更好。可以有多个帕累托有效解,这组帕累托有效解被定义为帕累托边界。
在本文中,我将使用一种基于帕累托的方法来确定最佳武器组合,其中我们的目标函数是一个由武器的耐久性和强度值组成的向量[durability, strength]。让我们看看什么是我们能为塞尔达·BOTW 获得的帕累托最优武器组合。
确定最佳组合
1.武器+盾牌
在特定情况下,林克可以装备一件武器和一面盾牌。让我们看看我们能有什么最佳组合。经过预处理,我们有 127 件武器和 33 个盾牌。我们将得到 4191 种武器和盾牌的组合。对于每种组合,我都考虑了平均耐久性和平均强度。
weapons_shields = pd.concat([weapons, shields], ignore_index=True)
df2 = weapons_shields.set_index("name", drop = False)my_data = []
my_combinations = list(combinations(df2.index,2))
valid_combinations = []for comb in my_combinations:
if df2.loc[comb[0],"class"] != df2.loc[comb[1],"class"]:
valid_combinations.append(comb)
data_line = []
data_line.append(np.mean([df2.loc[comb[0],"durability"], df2.loc[comb[1],"durability"]]))
data_line.append(np.mean([df2.loc[comb[0],"strength"], df2.loc[comb[1],"strength"]]))
my_data.append(data_line)
my_combinations = pd.DataFrame(my_data, columns = ['durability', 'strength'], index=valid_combinations)
我不会绘制热图来显示不同的武器组合及其耐用性和强度,因为有大量的组合。相反,我将绘制一个相关矩阵,显示组合的平均耐久性和平均强度,如下所示。

表示武器+盾牌组合相关矩阵的热图(图片由作者提供)
让我们看看帕累托边界是什么样的。

武器+盾牌组合的帕累托边界
你可以看到帕累托有效组合如下:
- 大师剑+海之盾
- 巨石破碎者+海之盾
- 野蛮勒内尔粉碎机+海莲盾
我们不能说这些组合中有哪一种在强度和耐用性方面更好。但是,如果我想让我的武器持续更长时间,那么我会使用组合大师剑+林之盾。另一方面,如果我想对敌人造成更多的伤害,那么我会使用组合野蛮的林内尔破碎机+海莲盾。
2.武器+盾牌+弓
在特定情况下,林克可以装备一件武器、一面盾牌和一把弓。让我们看看我们能有什么最佳组合。经过预处理,我们有 127 件武器,33 个盾牌和 25 把弓。我们将得到 104,775 种武器和盾牌的组合。
类似于武器+盾牌组合,我将绘制一个相关矩阵,显示武器+盾牌+弓组合的平均耐久性和平均强度,如下所示。

表示武器+盾牌+弓箭组合相关矩阵的热图(图片由作者提供)
让我们看看帕累托边界是什么样的。

武器+盾牌+弓组合的帕累托边界
你可以看到帕累托有效组合如下:
- 大师剑+莲盾+古弓
- 大师之剑+林之盾+锦衣卫之弓
- 巨石破碎者+海莲盾+古弓
- 野蛮勒内尔粉碎机+海莲盾+古弓
- 野蛮的勒内尔破碎机+海连盾+皇家卫队的弓
请注意,我们有 3 种武器+盾牌的组合,这也是我们之前在这些组合中发现的。此外,组合中还有古弓和锦衣卫弓。
类似于武器+盾牌的组合,我们不能说这些组合中的某一个在强度和耐用性方面更好。但是,如果我想让我的武器更持久,那我就用组合大师剑+林之盾+古弓。另一方面,如果我想对敌人造成更多的伤害,那么我会使用组合野蛮的勒内尔破碎机+海连盾+皇家卫队的弓。选择完全取决于你!
最后的想法
你可能已经在玩游戏的时候想出了这些组合。然而,我很好奇基于帕累托的分析是否能找到最强大的武器,当然,它确实找到了!
有一点需要注意的是,在这个分析过程中,我没有考虑到主剑可能会耗尽能量,需要一些时间来充电。从这个意义上说,大师之剑有它的局限性。此外,我在分析中没有考虑攻击速度、进食后攻击速度的提升、武器是否可以与盾牌、盔甲套装加值和 amiibo 升级一起使用等因素。当考虑武器组合的杀伤率时,这些因素会影响最佳的武器组合。
特别感谢梅雷迪思万分享她的分析代码,这对我分析 BOTW 数据集很有帮助。
你可以从这里找到 Jupyter 笔记本的代码。
希望你们都觉得这篇文章很有趣,我很想听听你们的想法。不要忘记与你的 BOTW 朋友分享这些武器组合。
干杯!
参考
[1] Y. Jin 和 B. Sendhoff,“基于 Pareto 的多目标机器学习:概述和案例研究”,载于 IEEE 系统、人和控制论汇刊,C 部分(应用和综述),第 38 卷,第 3 期,第 397-415 页,2008 年 5 月,doi:10.1109/ts MCC . 2008 . 19172。
[2]多目标优化—维基百科(https://en.wikipedia.org/wiki/Multi-objective_optimization)
[3] Pareto front —用于医疗建模和数据科学的 Python(https://pythonhealthcare.org/tag/pareto-front/)
每个模型都应该考虑偏差-方差的权衡
什么是偏差-方差权衡?

图片来自 Pixabay
为什么面试官会问这个?
关于偏差-方差权衡的问题在数据科学家职位的面试中被频繁使用。它们通常用来描述一个经验丰富、知识渊博的数据科学家与一个资历较浅的数据科学家……更具体地说,是一个不熟悉减轻模型内预测误差的选项的人。
那是什么来着?
所以偏差-方差权衡…听说过吗?如果没有,你会想收听。
偏差-方差权衡是一个简单的想法,但它应该告知您所做的许多统计分析和建模,主要是在消除预测误差时。
哪里出现了错误
当你创建一个模型时,你的模型会有一些误差。有道理!这里没什么新鲜的;新的想法是,所说的误差实际上是由两件事组成的…你猜对了,偏差&方差!很抱歉如此深入地探讨这一点,但重要的原因是,一旦你理解了你的错误的组成部分,那么你就可以确定一个计划来最小化它。
您可以采取不同的方法和途径来管理和最小化偏差或差异,但这样做是有其考虑因素的。因此,作为一名数据科学家,了解这两种情况的影响是至关重要的。
让我们打破偏见
偏差代表我们的预测和实际之间的差异。
高偏置与低偏置
一个高偏差的模型是一个从数据中收集很少数据然后生成预测的模型。你可能听到的一个常见短语是高偏差模型“过于一般化”。它很少依赖于训练数据来确定它的预测,因此,当涉及到根据测试数据生成准确的预测时,它的表现非常差。
我们的方法中可能隐含了一些假设,导致对那些允许模型以更好的性能生成预测的特征关注不足。
相反,低偏差表示模型高度准确。因此,这显然是我们想要最小化的东西。
方差对你的模型意味着什么?
方差和听起来差不多。方差与我们预测的分布以及它们的“可变性”有关。如果你听说过“过度拟合”这个术语;这有效地解释了高方差模型的结果。
与高偏差模型非常不同,高方差模型是一种“过度依赖”训练数据的模型。事实上,该模型在其训练数据上可能表现得非常好。它可能非常适合训练数据,以至于乍一看似乎是一个优秀的模型,但是当您试图将您的模型推广到您的测试数据时,它做得非常差。这个模型和你的训练数据太接近了。
理解偏差和方差之间的重叠
下图很好地展示了方差或偏差或高或低的模型重叠。这个概念已经被形象化了一百万次,并且仍然是解释与偏差-方差权衡相关的结果的主要依据。

形象归功于我自己:罗伯特·伍德
高偏差
让我们来谈谈偏差较高的情况:无论预测的变化如何,模型都隐含地遗漏了它可能需要解释或利用的任何信号;结果发现自己远离靶心。
低偏差
在偏差较低的情况下,我们可以看到预测至少以实际值为中心。不管可变与否,我们的方向更好。
高度变异
随着高度变化,我们看到结果到处都是,显然与以前看到的数据过度拟合。虽然这些结果看起来方向正确,但它们缺乏对新数据的推广能力……这通常是构建任何模型的目的。
低变化
在低变化的情况下,我们可以看到预测本身的变化明显较小。
显然,每种形式的误差都会出现在一个频谱中,但这种可视化有助于巩固这种权衡的挑战。
为什么两者很难兼得?
当涉及到你的模型的设计时,你将被迫做出某些决定;这些决定中隐含着向一个方向或另一个方向倾斜的行为。
假设您正在使用随机森林算法,为了提高性能,您开始调整超参数…其中之一是添加越来越多的树和采样变量..虽然这在某种程度上会给你带来一定的性能提升…但是随着时间的推移,你的模型会对它所看到的数据太熟悉了;并且任何随后的生成预测的调用将可能把这个新数据处理得与它已经看到的太相似。
你也可以从包含变量的数量的角度来思考这个问题,尤其是那些分类变量。输入越多,模型就越能理解你的训练数据,但潜在地,它就越不能归纳出它从未见过的数据。我们再次看到人们可能需要考虑减少偏差或方差。
结论
所以,我们已经抛出了各种各样的定义,谈论了他们如何一起玩…但是谈论这个有什么意义呢?我会把这一切归结为考虑。如果没有意识到模型设计对结果的影响,也没有能力定义我们的错误,我们就没有办法改进。
您现在对您的模型设计最终会如何影响它们的效用有了更深入的了解。利用这种洞察力,有条不紊地考虑问题,并构建一些令人敬畏的模型!
我希望你喜欢这篇文章,更多关于机器学习、数据科学之类的文章,请到 datasciencelessons.com 大学访问我,或者在 medium 上关注我!
祝数据科学快乐!
大 O 符号
算法复杂性变得简单——这不是矛盾修饰法!

一个算法的性能取决于它需要的步骤数。计算机科学家从数学界借用了术语“大 O 符号”来准确描述算法的效率。许多自学成才的开发人员和数据科学家要么满足于一个“可行”的解决方案,而不考虑如何提高他们代码的性能,要么在没有真正理解基础知识的情况下进行优化。他们的尝试要么是徒劳的,要么影响很小,而且大多是偶然的。
衡量一个算法的复杂性并不是一个难以理解的概念——尽管这听起来像是一个矛盾的说法——事实并非如此!
在本文中,我们将省去数学术语,并以一种易于理解的方式解释 Big-O 概念。我们将通过独立的 Python 片段来完善我们的理解,并且我们将通过一个一体化的备忘单来结束我们的旅程,以供将来参考。
介绍
时间复杂度
Big-O 不再关注时间单位,而是将步数放在聚光灯下。硬件因素已从等式中剔除。因此,我们不是在讨论运行时间,而是在讨论时间复杂度。
⚠我们将不讨论空间复杂度,即一个算法占用多少内存。我们下次再说:)
大 O 定义
一个算法的 Big-O 符号取决于它如何响应给定数据集的不同大小。例如,当我们向它传递 1 个元素和 10,000 个元素时,它的性能如何。
o 代表 的 阶,所以O(N)读作“N 阶”——它是给定 N 个输入元素的算法持续时间的一个近似值*。它回答了这样一个问题:“随着输入数据元素的增加,步数是如何变化的?***
O(N)描述了一个算法根据它所作用的元素的数量需要多少步。
⭐️就是这么简单!!
最佳与最差情景
从一个简单的例子开始:给定一个输入array[N]和一个值X,我们的算法将通过从头开始遍历数组直到找到该值来搜索值X。
给定这个 5 元素数组:[**2**,1,6,3,**8**]如果我们搜索X=8,算法需要 5 步才能找到它,但是如果我们搜索X=2,只需要 1 步。因此,最好的情况是我们在第个单元格中寻找一个值,最坏的情况是该值在最后一个单元格中,或者根本不在那里。
Big-O 符号对性能采取悲观的方法,指的是最坏的情况。当我们描述下面的复杂性时,以及当你试图计算你自己的算法的复杂性时,这真的很重要:总是想到最坏的情况。
现在我们已经定义了规则和词汇,不再多说,让我们深入了解您可能遇到的最常见的复杂性…
O(1) —常数
O(1)表示无论传入多少数据,算法都要执行相同数量的步骤。
例子
✏️ Determine if the **i-th element** of an array is an odd number.
不管我们是访问第 1 个、第 2 个还是第 100 万个条目,都没有关系…我们可以通过使用索引操作符array[i]直接访问它。

情节
如果我们要表示步骤数(y 轴)对输入元素数(x 轴),O(1)是一条完美的水平线,因为无论有多少数据,算法中的步骤数都保持不变。这就是为什么叫恒时的原因。

O(1)
O(N) — 线性
一个O(N)算法将采取和数据元素一样多的步骤。所以当数组的大小增加一个元素时,一个O(N)算法就会增加一个步长。
例子
✏️ **Traverse** an array and print each element.
这里,我们需要逐个访问所有元素,因此计算时间与输入同步增长。

情节
O(N)是一条完美的对角线,每增加一条数据,算法就多走一步。这就是为什么它也被称为线性时间的原因。

O(N)
让我们将O(1)和O(N)算法绘制在同一个图中,并假设O(1)算法持续进行 50 步。

O(1)对 O(N)
我们能观察到什么?
→当输入数组少于 50 个元素时,O(N)更有效。
→正好在 50 个元素处,两种算法采取相同数量的步骤。
→随着数据的增加,O(N)采取更多的步骤。
由于 Big-O 符号关注的是当数据增长到无穷大时算法的表现,这就是为什么O(N)被认为不如O(1)有效的原因。
O(N ) — 二次型
O(N²)代表算法的复杂度,其性能与输入元素大小的平方成正比。它通常很慢:如果输入数组有 1 个元素,它将执行 1 次操作,如果有 10 个元素,它将执行 100 次操作,依此类推。
例子
✏️ Find **duplicates** in an array.
这是一个“幼稚”的实现,但是它遍历数组两次:

通过输入增加更多的嵌套迭代将增加算法的复杂性:例如,如果迭代次数是 3,那么它的复杂性将是O(N³)等等。通常我们要远离多项式运行次数(二次、三次、Nˣ等)。
情节
O(N²)线是一个急转弯:

O(N)
O(logN) —对数
简单来说,O(logN)描述了一种算法,它的运算次数在数据每增加一倍时增加一。
**📌 Logarithms Refresher:**
You may not remember what logarithms are, but you probably know what exponents are:
2³ = 2 * 2 * 2 = 8 — Here we multiply the number 2, 3 times.**Logarithms are the flips of exponents.**
log₂8 answers the question: how many 2s do we multiply together to get 8? The answer is 3.In other words, if we keep dividing 8 by 2 until we end up to 1, how many 2s do we have in our equation?8 / **2** / **2** / **2** = 1\. The answer is 3 again.
例子
对数时间复杂性通常适用于每次将问题分成两半的算法。
✏️ **Dictionary** lookup (aka binary search).
1)中间打开字典,查第一个单词。如果我们的单词按字母顺序更重要,就看右半部分,否则就看左半部分。再次将余数分成两半,重复步骤 2 和 3,直到找到我们要的单词。

我们每次迭代只能选择一种可能性,并且我们的可能匹配池在每次迭代中被除以 2。这使得二分搜索法的时间复杂度O(logN)。
情节
随着输入的增加,步骤的数量几乎没有增加(即,每次数据翻倍时只需增加一个步骤):

o(登录)
诸如此类…
到目前为止,我们已经学习了四个最重要的 Big-O 分类法。当然还有一些,但是我相信你能够理解它们。让我们快速覆盖它们:
O(N logN) —对数线性
这种复杂度的算法要做log(N)次N次工作,因此它的性能比O(N)稍差。许多实用的算法都属于这一类(从排序,到寻路,到压缩,所以我们为了完整起见才提到它。
✏️示例:合并排序——这是一个“分治”算法:它将输入数组分成两半,对每一半调用自己,然后合并排序后的两半。
💡可扩展性:一般。
O(2ᴺ) —指数
指数增长意味着每增加一个新元素,算法需要两倍的时间。
✏️示例:查找数据集中的所有子集。
💡扩展性:差。
O(N!)—阶乘
这类算法的运行时间与输入大小的阶乘成正比:n! = n * (n-1) * (n-2) * (n-3) * . . . * 1。
✏️例子:找出数据集中所有不同的排列。
💡扩展性:非常差。
增长层次
Big-O 符号提供了一种一致的机制来比较任何两种算法,从而帮助我们使代码更快、更具可伸缩性。将所有的复杂性放在一个图表中,我们可以直观地观察它们在性能方面的比较:

Big-O 复杂性类
结论
我希望你现在意识到 Big-O 符号毕竟不是一个可怕的概念!
概述
- 算法速度不是以秒来衡量的,而是以增长来衡量的
- Big-O 符号告诉我们算法如何根据输入数据集大小的变化进行扩展
- O 代表的顺序,因此大 O 符号是近似的
- 算法运行时间以不同的速度增长:
O(1) < O(logN) < O(N) < O(N logN) < O(N²) < O(2ᴺ) < O(N!)
更多资源
- 如果你想更深入地挖掘 Big-O 背后的数学知识,看看斯坦福大学的免费 Coursera 课程。
- Big-O 备忘单
- 我的备忘单:

感谢阅读!
我定期在媒体上写关于领导力、技术&的数据——如果你想阅读我未来的帖子,请‘关注’我 !
二项式回归模型:你需要知道的一切

RMS 泰坦尼克号(来源:维基百科CC0 下)
外加一个使用 Python 和 statsmodels 的逐步教程
本文分为两个部分:
- 第 1 节:二项式回归模型简介:我们将介绍二项式回归模型,了解它如何适应广义线性模型家族,以及为什么它可以用于预测随机事件的概率。
- 第 2 部分:使用二项式回归模型:我们将使用 Python 和 statsmodels 库在真实世界的 Titanic 数据集上训练一个二项式回归模型。我们将看到为什么二项式回归模型是预测泰坦尼克号生存几率的正确模型。我们还将学习如何解释拟合模型的回归系数,这是一项必须学习的技能,在巨大数据集的情况下会产生惊人的结果。
第一节
二项式回归模型简介
给定回归变量的向量,二项式回归模型可用于预测看到事件的几率。例如,在给定当前温度、湿度、气压、一年中的时间、地理位置、海拔高度等的情况下,可以使用二项式回归模型来预测未来 2 小时内开始下雨的可能性。
在二项式回归模型中,因变量 y 是一个离散的随机变量,取值为 0、1、5、67 等。每个值代表在 m 次试验中观察到的“成功”次数。因此 y 遵循二项式分布。
下面的等式给出了在独立伯努利试验中观察到 k 成功的概率。每次伯努利试验的成功概率=π,失败概率= (1- π ) 。抛硬币是伯努利试验的最简单的例子,其中π = (1-π) = 0.5。

P 概率MasF二项分布随机变量 y 的函数(图片由作者提供)
竖括号中的术语(m k)是‘组合’的符号,读作‘m choose k’。它给出了从一组 m 可能的结果中选择 k 结果的不同方法。
在一个回归模型中,我们会假设因变量 y 依赖于一个 (n X p) 大小的回归变量矩阵 X 。 X 中第行可以表示为 x_i 是一个大小为 (1 X p)的向量。对应第 I 个结果 y_i 。
人们通常以符号形式表示 y_i 取某一值 k 为的概率,条件是回归变量 X 取值 x_i. ,可以写成Pr(y _ I = k |X
我们现在可以将二项分布的 y 在回归 y 对 X 的概率分布表述为如下:
- 在上面提到的 PMF 方程的 L.H.S .上,我们将无条件概率 Pr(y=k) 替换为条件概率Pr(y _ I = k |X=X _ I)。**
- 在 R.H.S 中,我们将用条件概率 π_i 代替观察成功的无条件概率 π ,其中 π_i 是数据集第行与第行观察成功的概率,即当回归向量X=X
通过这两个替换,二项式分布的 y 的 PMF 变成如下:

在 X 回归的二项分布 y 的条件概率分布(图片由作者提供)
在上面的等式中,对于某个 X=x_i,观察成功的概率 π_i ,通常表示为某个函数 g(。)的 x_i 的 。用象征性的术语来说:

成功的概率表示为回归矩阵第 I 行的某个函数 X (图片由作者提供)
上面的一组概念可以用一个简单的例子形象地描述出来,如下所示:

二项式分布的 y 对 X(图片由作者提供)
在上图中, y_1,y_2,y_3,…y_10 是十个二项分布的随机变量。它们也发生在因变量【y】的组成成分上,即一个(10×1)矩阵如下:
y=
[【y _ 1】,
【y _ 2】,
【y _ 3】,
…,
【y _ 10】。
在这种情况下,相应的回归变量矩阵 X 也恰好是一个 10×1 的矩阵,因为只涉及一个回归变量:
X=
[[1],
【2】,
【3】,
【4】,
…,
【10】]。**
因为,y 是一个随机变量,具有 spread m ,该图显示了对于每个值的X=X _ I,y 可以取其期望值**附近的任何二项分布值)的 x_i 的 。因此, y_i 的期望值,即 _i ,可以表示为 x_i. 的某个函数****
二项式回归模型是广义线性模型家族的一部分。glm 用于对响应变量的期望值和解释变量向量 X 的线性组合之间的关系进行建模。**
E(y|X)与×之间的关系通过合适的链接函数来表示,如所示:**

(图片由作者提供)
在上面的等式中, g(。)是将 X 上 y 的条件期望与回归变量 x_i 的线性组合联系起来的链接函数。 X 为大小为 (n X p) 的回归变量矩阵,其中 n= 行,每一行中的 p= 回归变量,X=X _ I为该大小为(1 X p)的矩阵中第与行**
当【y】为二项分布时,我们感兴趣的是确定 的条件期望与单次伯努利试验 的概率π在X=X _ I**、I。所以二项式回归模型的 GLM 方程可以写成如下:**

(图片由作者)
在二项式回归模型的情况下,链接函数 g(。)****
逻辑(logit)链接函数,也称为对数优势函数:

物流环节功能(图片由作者提供)
逻辑函数被称为 log-odds 函数,因为它被表示为成功概率与失败概率的比值,即成功概率的对数。我们将在本文的后面使用这个链接函数。
概率单位链接功能:

probit 链接功能(图片由作者提供)
probit(概率单位的缩写)链接函数用于模拟具有二元是/否结果的事件的发生。该链接函数被表示为累积分布函数φ的倒数。)的标准正态分布 N(0,1)。
Colin Cameron 和 Pravin K. Trivedi 所著的《计数数据 的 回归分析》一书很好地介绍了第 3.6 节中的概率单位链接函数:有序和其他离散选择模型。在那里,你还会发现一个非常清晰的推导,为什么 Probit 模型的链接函数恰好是 CDF 的逆函数。)的正态分布。
双对数函数:

日志-日志链接功能(图片由作者
双对数函数对于模拟“泊松计数过程非常有用,其中概率分布的参数(通常包含平均值)位于概率分布公式的指数中,和该参数也表示为回归变量线性组合的指数。因此,它具有双指数格式:exp(exp(—)β。x_i** ) 因此需要两个连续的对数运算来得到 β。x_i 项下降到‘地平面’。**
互补双对数链接功能:

互补的双对数链接功能(图片由作者提供)
之所以称之为互补对数对数,是因为它对 (1-π_i) (即故障概率)起作用,而不是对 π_i. 起作用
在本文中,我们将使用逻辑又名逻辑又名对数几率链接函数来构建我们的二项式回归模型。这又是一次,这一次表达方式略有不同。在 R.H.S .上,我用粗体向量符号代替了求和:

log-odds 链接功能(图片由作者提供)
第二节
用二项式回归模型预测泰坦尼克号的生存几率
我们将使用 Titanic 数据集作为例子来理解适合二项式回归模型的用例种类。
这里有一个到原始数据集的链接。
泰坦尼克号数据集包含了命运多舛的远洋客轮泰坦尼克号上 2229 名灵魂中的 887 人的信息。每个乘客的记录包含以下属性:
- 名字
- 乘客等级(1/2/3)
- 性
- 年龄
- 乘客是否由兄弟姐妹、父母或子女陪同
- 他们付的车费,最重要的是,
- 他们是否幸存(1 =幸存,0 =死亡)
使用 Python 和 Pandas 数据分析库,让我们将数据集加载到 Pandas 数据框中,并打印出前几行:
****import** pandas **as** pddf = pd.read_csv(**'titanic_dataset.csv'**, header=0)df.head(10)**
这将打印出以下输出:

Titanic 数据集的前 10 行(图片由作者提供)
我们将关注四个关键属性:
- 乘客等级
- 年龄
- 性
- 幸存(他们是否幸存)
让我们从数据框中删除其余的列:
*****#Drop the columns that our model will not use*** df = df.drop([**'Name'**,**'Siblings/Spouses Aboard'**, **'Parents/Children Aboard'**, **'Fare'**], axis=1)***#print the top 10 rows*** df.head(10)**
这会打印出以下内容:

精简的 Titanic 数据集的前 10 行(图片由作者提供)
构建二项式回归模型的案例
我们假设,当泰坦尼克号正在下沉时,【阶级,年龄,性别】的组合极大地影响了乘客的生还几率。
请注意,‘幸存’列包含一个[0,1]伯努利随机变量。
那么我们可以说下面的话吗?
***回归变量 X***=【p 类别,年龄,性别】,并且,
因变量是布尔变量 y =【幸存】
不,我们不能。让我们看看为什么…
为什么不用 Probit 回归模型?
由于 y 是一个布尔变量,因此使用概率单位回归模型似乎是一个简单明了的例子。但是请注意,如果一个人不幸在泰坦尼克号这样的船上,他想知道的是而不是这个二元问题的答案:我会 100%确定地活下来还是会 100%确定地死去?相反,更有用的是知道生存几率。
例如,如果你是一名 22 岁的女性,在船的二等舱,你会想知道你的生存几率是 1/10,1/4,1/50 等等。
但是在组织泰坦尼克号数据集的方式中,幸存的响应变量具有是/否,即 1/0 格式。换句话说,幸存的具有伯努利分布,即:
Pr( 幸存 =0) = π ,
Pr( 幸存= 1)=(1-π) 其中π是介于 0 和 1 之间的某个概率。**
我们想要的是让 y 来表示几率,即在 m 独立、相同的试验中,成功(存活)与失败(死亡)的比率。
换句话说,我们要的是对于y 来说有一个* Log-Odds 分布 。***
因此,我们不是使用真或假、1 或 0 类型的概率单位回归模型,而是要建立一个二项式回归模型,其中响应变量是二项式分布的,链接函数是 Logit ,即 log-odds 函数。
链接功能将允许我们将生存几率与回归变量×回归变量**=【p class,Age&Sex】加截距的线性组合联系起来,如下所示:**

(图片由作者提供)
如何将 y 从伯努利变量转换为二项式变量:
要将响应变量【y】从伯努利转换为二项式,我们必须将具有相同组合×值【Pclass,Age and Sex】的数据集行组合在一起。在我们着手做这件事之前,有一件小事我们需要注意,那就是年龄属性。你看,年龄,在数据集中的表达方式,是一个 0.42 到 80 的连续变量。
分别为 0.42 岁和 0.67 岁的婴儿有不同的存活几率,这似乎不太可能。同样的逻辑也适用于 26、27、28、29 岁的年轻人。岁,其他情况以此类推。
我们需要使年龄数据更加细化,以便限制组的数量。让我们通过将整个年龄范围分成 5 岁大小的箱来实现这一点,并将每个箱标记如下:
(0,5)→5
(5,10)→10
(10,15)→15 等等。pandas.cut() 方法非常灵活:
****#define the bins** age_range_bins=[0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80]**#define the label for each bin. Num labels = Num bins - 1** age_range_labels=[5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80]**#Cut up the age range into multiple bins and stuff them into a new Age_Range column** df[**'Age_Range'**]=pd.cut(df[**'Age'**],age_range_bins,labels=age_range_labels)**#Print the output** df.head(10)**
我们得到以下输出。请注意我们添加的新 Age_Range 列:

(图片由作者提供)
让我们删除年龄列,因为我们将使用年龄范围:
****#Drop the age column** df = df.drop([**'Age'**],axis=1)**
现在我们已经按照我们想要的方式设置了解释变量,让我们开始按照组合 [Pclass,Sex,Age_Range]对样本进行分组。我们先用熊猫group by()的方法。
*****#Group by ['Pclass', 'Sex', 'Age_Range']** groups = df.**groupby**([**'Pclass'**, **'Sex'**, **'Age_Range'**])**#Get the counts for each group. This is the number of passengers in each group who have survived** df_grouped_counts = groups.count()**#Get the size (number of passengers) in each group** df_grouped_survived = groups.sum()***
将每组的幸存者人数和乘客人数合并到每个分组数据框中。(我们马上会看到这对我们有什么帮助):
***df_grouped_counts.to_csv(**'df_grouped_counts.csv'**)
df_grouped_counts_1 = pd.read_csv(**'df_grouped_counts.csv'**, header=0)
df_grouped_survived.to_csv(**'df_grouped_survived.csv'**)
df_grouped_survived_1 = pd.read_csv(**'df_grouped_survived.csv'**, header=0)***
最后,让我们构建一个新的数据帧,它包含:
- 分组的列 Pclass、Sex、Age_Range,
- 每组中相应的幸存者数量,
- 每组的乘客总数,即组的大小,
- 每组死亡的乘客人数。
*****#Create a new Data Frame** df_grouped = pd.DataFrame()**#Copy over the Pclass, Sex and Age Range columns** df_grouped[**'Pclass'**] = df_grouped_counts_1[**'Pclass'**]
df_grouped[**'Sex'**] = df_grouped_counts_1[**'Sex'**]
df_grouped[**'Age_Range'**] = df_grouped_counts_1[**'Age_Range'**]**#Copy over the num passengers from the counts grouped Data Frame** df_grouped[**'Total'**] = df_grouped_counts_1[**'Survived'**]**#Copy over the num survivors from the summation grouped Data Frame** df_grouped[**'Survived'**] = df_grouped_survived_1[**'Survived'**]**#Add a column containing the number who died** df_grouped[**’Died’**] = df_grouped[**’Total’**] - df_grouped[**’Survived’**]***
让我们打印出分组数据集的前 20 行:
***df_grouped.head(20)***

泰坦尼克号数据集的前 20 行按[阶级、性别、年龄范围]分组(图片由作者)
让我们看看分组数据集告诉我们什么。为了便于说明,我突出显示了第 9、14 和 19 行:
在第 9 行中,我们发现有 10 名年龄在(45,50)范围内的女性拥有头等舱机票,其中 9 人幸存。因此,这组女性的生还几率相当高(9 比 1),尤其是如果她住在头等舱的话。
在第 19 排,我们看到有 4 名年龄在 15- 20 岁的男性乘客,其中只有一人幸存。
在第 14 排,我们看到没有任何年龄(70-75 岁)的女性乘客占据头等舱。这就是为什么我们在该组的汇总列中看到 NaNs:[1,女性,75]。
让我们从数据框中删除所有这样的 NaN 行:
***df_grouped = df_grouped.dropna()***
使用 Python 和 statsmodels 构建二项式回归模型
在我们构建二项式模型之前,让我们完成最后一项数据准备任务,即,用整数 1 和 2 替换“女性”和“男性”字符串:
***df_grouped=df_grouped.replace(to_replace={**'female'**: 1, **'male'**: 2})***
使用 Python 和 statsmodels 构建二项式回归模型
我们将使用 statsmodels 库提供的优秀支持来构建和训练二项式回归模型。
让我们划分出训练和测试数据集:
*****import** numpy **as** np***#Separate out the training and test sets*** mask = np.random.rand(len(df_grouped)) < 0.85df_train = df_grouped[mask]df_test = df_grouped[~mask]***
让我们使用patsy*语法来设置回归模型的公式。我们在下面提到的公式中所说的是,因变量是由 dataframe 的列组成的矩阵,而回归变量是 Pclass 、 Age_Range 和 Sex 。*****
*****#Construct the Binomial model's regression formula in Patsy syntax.*** formula = **'Survived + Died ~ Pclass + Age_Range + Sex'****
使用这个公式,让我们从我们一分钟前创建的训练和测试数据帧中雕刻出 X 和 y 设计矩阵:
****from** patsy **import** dmatrices**#Carve out the training matrices from the training data frame using the regression formula** y_train, X_train = dmatrices(formula, df_train, return_type=**'dataframe'**)**#Carve out the testing matrices from the testing data frame using the regression formula** y_test, X_test = dmatrices(formula, df_test, return_type=**'dataframe'**)**
接下来,我们将 X_train 和 y_train 输入到二项式回归模型类的实例中,并训练模型:
****import** statsmodels.api **as** smbinom_model = sm.**GLM**(y_train, X_train, **family**=sm.families.Binomial())binom_model_results = binom_model.fit()**
让我们打印出适合的模型摘要:
**print(binom_model_results.summary())**
这会打印出以下内容:

二项式回归模型的训练结果(图片由作者提供)
如何解释回归结果:
在上面的输出中,statsmodels 告诉我们,它已经训练了一个类型为二项式的广义线性模型,因为我们要求它这样做,它使用了对数比链接函数,并且使用了 迭代加权最小二乘(IRLS) 算法来训练我们的模型。****

GLM 模型=二项式(图片由作者提供)

链接函数= log-odds(图片由作者提供)

训练算法= IRLS(图片由作者提供)
Statsmodels 报告说我们的模型有 3 个自由度: 【性别、阶级和年龄范围】 ,这似乎是正确的:

(图片由作者提供)
对于二项式模型,statsmodels 为您计算三种拟合优度:最大对数似然、偏差和皮尔森卡方。我们不会进一步检查它们,因为这三个度量只有在比较两个或更多二项式回归模型的拟合优度时才有用,在这种情况下,我们没有用:

(图片由作者提供)
让我们来看看 装上 的系数:

β_0,β_1,β_2,β_3 (图片由作者提供)
如 p 值所示,所有回归系数在 0.1%的误差范围内具有统计显著性,所有 p 值均为< 0.001:

p values (Image by 作者
让我们看看每个系数告诉我们什么。
如何解释模型系数:
对于 logit link 函数,拟合系数可解释如下:
**年龄范围:其系数为-0.0446。请注意负值。解释这个系数的方法是,保持所有其他变量不变,乘客年龄每增加一个单位,他们生存的几率减少一个因子= exp(-0.0446) = 0.9564。即乘客的年龄每增加一个单位,需要将他们的生存几率乘以 0.9564,从而每次将生存几率减少一定的量。例如,如果二等舱的 12 岁男性乘客在灾难中的已知生存几率为 8:9,那么二等舱的 22 岁男性乘客的生存几率为(8/9) * 0.9564 ⁰ =大约 6:10。
Pclass:Pclass 的系数为-1.2008。再次注意负号。乘客舱等的降级对乘客在泰坦尼克号上的生还几率有着更加戏剧性的影响。Pclass 变量编码为一等舱=1,二等舱=2,三等舱=3。因此,客舱等级每增加一个单位,即从一等舱下降到二等舱再到三等舱,在保持年龄和性别不变的情况下,生存几率会降低 exp(-1.2008) = 0.30 的系数!也就是说,每降一个单位,你的生存几率就会乘以 0.30。例如,如果一个 30 岁的男性乘客在泰坦尼克号上有 7 : 9 的生存几率,只要将他降一级到 2 级,他的生存几率就降低到(7/9)0.3 =大约 1:4。将等级进一步降低到第三等级会将几率降低到(7/9)0.30.3 = 7 : 100。***
****性别:最后,注意性别变量的非常大的负系数-2.6526。在沉没的泰坦尼克号上,与女乘客相比,男乘客生还的机会非常渺茫。保持 Pclass 和年龄不变,男性乘客的生还几率仅为女性乘客的 exp(-2.6526)= 7%。
预言;预测;预告
回想一下,我们已经将测试数据集放在数据帧 df_test 中。是时候在这个数据集上测试我们模型的性能了。为此,我们将首先向测试数据帧添加一个幸存百分比列,我们将要求我们的模型预测其值:
**df_test['Pcnt_Survived'] = df_test['Survived']/df_test['Total']**
我们将使用 。predict()方法对结果对象和通过测试的数据集得到预测的存活率:
**predicted_survival_rate = binom_model_results.predict(X_test)**
让我们绘制实际存活率与预测存活率的对比图:
****import** matplotlib.pyplot **as** pltplt.xlabel(**'Actual Survival Rate'**)
plt.ylabel(**'Predicted Survival Rate'**)plt.scatter(df_test['Pcnt_Survived'], predicted_survival_rate, color = **'blue'**)plt.show()**

实际存活率与预测存活率(图片由作者提供)
如您所见,当存活率接近该范围的上限(即 1.0)时,拟合变得不可接受。在很大程度上,预测的准确性取决于样本大小,即每组乘客的大小,按元组[类别、性别、年龄范围]分组。对于训练集中的某些组,组大小太小,模型无法以有意义的方式进行训练。对于测试数据集中的这种组合,精确度会很低,这是可以理解的。
以下是完整源代码的链接:
二项式 _ 回归. py
这里是本文中使用的 Titanic 数据集的链接。
摘要
- 二项式回归模型可以用来预测事件发生的几率。
- 二项式回归模型是广义线性模型家族中的一员,它使用合适的链接函数来建立响应变量 y 的条件预期与解释变量 X 的线性组合之间的关系。
- 在二项式回归模型中,我们通常使用对数优势函数作为连接函数。
- 逻辑回归模型是二项式回归模型的一种特殊情况,在这种情况下,数据集中每组解释变量的大小为一。
进一步阅读
条件期望、条件概率和条件方差:回归建模者的实践见解
towardsdatascience.com](/3-conditionals-every-data-scientist-should-know-1916d48b078a)
[McCullough, P., Nelder, J. A. (FRS). **Generalized Linear Models**. 2nd Ed. (1989) Chapman & Hall](https://www.crcpress.com/Generalized-Linear-Models/McCullagh-Nelder/p/book/9780412317606)
感谢阅读!我写关于数据科学的主题。如果你喜欢这篇文章,请关注我的Sachin Date以获得关于如何使用 Python 进行数据科学的信息、见解和编程建议。**
生物医药奇点
基于机器学习的革命能否在人工通用智能之前改变生物医学和治疗学?
随着我们获得更精确的建模能力和指数级更高的计算能力,我们可以精确建模的系统集成比例地增长。这将应用于许多激动人心的领域:能源系统、健康、技术、太空探索等。我 更喜欢看看这些预测机制在哪里可以应用于增长和福祉,而不是干涉我们是否生活在模拟中的讨论。我们这个资本主义、痴迷于增长的社会的方式是创新问题,而不是试图减少问题的根源。

硅谷的夕阳。
人工智能领域中常见的术语是“奇点”,其中技术发展将大大超过人类发展,这是在Vernor Vigne1993 年的作品“即将到来的技术奇点”中提出的。许多人认为这一时刻“很快”就会到来,并给我们的日常生活带来不可挽回的变化(我有意省略了关于各种知名思想家将奇点置于我们未来多远的讨论)。

来自系统生物学研究所的系统生物学的大致思路。
如果一个人假设模拟能力每年都有微小的增长,那么我们肯定会达到某个巨大的能力拐点。生物学的问题是…
当分子生物学的模拟变得足够丰富,可以用于离线药物发现时,会发生什么?
复习:现在新药是如何产生的?
目前,美国美国食品药品监督管理局批准一种药物需要花费超过 10 亿美元。这一成本涵盖了临床试验的多层发现和硬科学阶段。生物疗法的机制经常在疗效显现后被修补,所以许多早期临床试验是极其危险的,可能会有长期后果或死亡(T21)。
数字生物系统将把我们带向何方?
能够数字化地重复这个过程将从根本上改变药物制造和设计。我们将允许科学家测试他们最疯狂的想法和学习算法,探索没有边际成本的可能性。缺乏开发的边际成本是最高产的技术公司能够获得超高利润的原因。******
对复杂生物系统建模的早期探索属于系统生物学。从机器学习、大数据分析、形式生物学、化学等方面包装思想。一起将是一个巨大的跨学科的事情。在人体上测试这些新的实验性药物之前所需的验证将是极端的,但潜在的回报是无限的。
也许一个复杂的嵌入,如神经常微分方程可以导致发现,使复杂系统的丰富建模成为可能。从机器学习的角度来看,这里可以尝试的令人兴奋的途径是很长的。最终,我会对改变生活的多主体强化学习问题非常感兴趣,这将是数字化解决疾病。
拥有一个有效精确的人类生物学模型将使健康和幸福成为人类可以在电脑上轻松完成的游戏。这是否合乎道德或令人愉快,是机器系统生物学的研究人员现在应该开始问的问题。我们应该让机器在哪里遇见身体?****
“生物医学奇点:我们可以用数字来表示复杂的生物学,从而以零边际成本来研究它的时刻”——d . a . Wallach****
对于牛顿这样的人来说,世界物理学会不会显得复杂得难以驾驭?答案几乎肯定是肯定的,所以作为科学家,我们有义务尝试并解决这些看似不可能的想法,并获得无限回报。

不可能知道我们是到达了更好的地方还是把最好的留在了后面。
一些资源:
***** [## #06 - D.A. Wallach:音乐、医学、长寿和颠覆性技术- Peter Attia
录音艺术家、词曲作者、散文家、投资者等等:D.A. Wallach 是一个真正的博学家。在这一集里…
peterattiamd.com](https://peterattiamd.com/dawallach/)
圣达菲研究所,他的研究部分涉及了新的控制论,涉及生物奇点。系统生物学是这项工作的正式领域。*****
生日悖论
这个反直觉的统计“悖论”是如何与卫星碰撞、DNA 证据和其他巧合联系在一起的
如果你有一群人在一个房间里,你需要多少人来使两个或更多的人有可能在同一天生日?

在 Unsplash 上由S O C I A L C U T拍摄
理论上,两个人同一天生日的几率是 365 分之一(不考虑闰年和生日在一年中的不均匀分布),所以你一生中只会遇到少数几个和你同一天生日的人。这导致很多人直觉猜测 180 左右。
正确答案是 23。
这意味着在你学校的每一个班级里,在上班的公交车上,在足球场上,至少有两个人的生日是同一天。
说到概率,人类的直觉是出了名的差。数十亿美元的博彩业就是证明。
生日悖论中的混乱来源是,概率的增长与可能配对的人数有关,而不仅仅是群体的大小。配对的数量相对于参与者数量的平方而增长,使得 23 人的组包含 253(23×22/2)对不同的人。
在每一对中,有 364/365 的机会拥有不同的生日,但是这需要发生在每一对身上,因为在整个组中没有匹配的生日。因此,一组 23 个人中有两个人生日相同的概率是:
1 — (364/365)^253 = 50.05%
如果我们绘制不同群体规模的概率图,我们会看到概率是如何随着群体规模的增加而增加的。

至少有一个匹配生日的概率与小组规模
该线在组大小为 23 之前穿过 50%。我们之前猜测的 180 有这么接近 100%的概率,不值得展示。事实上,随机选择一组 180 人,并且没有一个人同一天生日的可能性大约是 6x10^-20——比两个人从地球上所有的沙子中挑出同一粒沙子的可能性小 100 倍!
不太可能的巧合
我们可以将生日悖论一般化,以观察具有类似结构的其他现象。
两个人的银行卡上有相同 PIN 的概率是万分之一,也就是 0.01%。然而,只需要 119 个人,就有可能有两个人拥有相同的密码。
当然,这些数字假设生日和 pin 是随机抽样、均匀分布的。事实上,生日在一年中的特定时间达到高峰,人们更有可能选择特定的数字作为他们的 PIN。但是缺乏统一的分布事实上减少了你需要的组的大小。
如果我们降低同时发生的机率,那麽要有均等的碰撞机会,所需的群组规模显然会增加。然而,它的增长比概率的倒数要慢得多。
例如,概率为万分之一,最小组大小为 119。对于不到 10 倍的巧合,最小的群体是 373,或者只有 3.15 倍大。因此,即使概率非常小,群体规模也不会变得特别大。百万分之一的几率,需要的群体只有 1178 人。
太空垃圾

这涉及到卫星碰撞和太空垃圾领域。两个特定的轨道物体在一年中相互碰撞的几率几乎微乎其微。然而,鉴于大约有 5500 颗卫星和大约 90 万个大于 1 厘米的物体在我们头顶上呼啸而过,碰撞发生的频率比你想象的要高。
各国政府能够追踪较大的太空垃圾。这样就可以进行规避操作,将运行中的卫星和空间站转移到安全的地方。但是,随着每周约 20,000 例接近手术的发生和增长,这可能会成为一个越来越困难和昂贵的过程。
2009 年,两颗卫星——一颗 16 年前报废的俄罗斯军事卫星和一颗仍在运行的铱星通信卫星——以近 12 公里/秒的相对速度相撞。两颗卫星都破碎成碎片云,超过 1000 块碎片比柚子还大。
更多的太空垃圾意味着发生碰撞的几率更高。每次碰撞都会增加太空垃圾的数量。这种正反馈循环,如果超过物体坠入大气层并燃烧的速度,可能会导致凯斯勒综合症。这是一个连锁反应,碰撞变得越来越常见,喷射出越来越多的碎片,直到将卫星置于低地球轨道变得太危险而不可行。
DNA 证据
在过去的四十年里,DNA 证据已经彻底改变了法医调查领域。当我们处理日常事务时,我们会留下一系列遗传物质,主要是通过皮肤细胞和毛发。政府建立了巨大的 DNA“图谱”数据库,记录了一系列不相关的遗传标记。
对于一些系统,两个人在所有记录的遗传标记上匹配的概率估计为万亿分之一(不包括同卵双胞胎)。鉴于这个数字是地球上人口的 100 倍,如果在现场发现了一个人的 DNA,你可以非常肯定他们在那里,对吗?
嗯,不一定。根据前面的例子,当你有足够大的一群人的时候,一个微小的概率可以膨胀成有形的东西。
在一个像美国这么大的国家(3.28 亿人口),万亿分之一的匹配率相当于 3000 分之一的概率,你有一个基因图谱“双胞胎”,在某个地方。2019 年,美国发生了 1.6 万起谋杀案。这意味着每年可能有大约 5 起谋杀案,其中犯罪者的 DNA 与另一名美国人的 DNA 完全匹配(再次排除同卵双胞胎)。即使涉及的概率低得令人难以置信,生日悖论的力量意味着你不应该仅仅根据 DNA 证据定罪,还需要考虑其他间接证据。
同样值得考虑的是,DNA 图谱系统在过去的三十年里有了很大的改进。在这项技术应用的早期,十亿分之一的 T2 概率经常被引用。这将导致大约 5000 起 DNA 模糊的谋杀。
生日袭击

照片由 Mauro Sbicego 在 Unsplash 拍摄
生日悖论可用于对数字签名的加密攻击。数字签名依赖于一种叫做散列函数 f(x)的东西,它将消息或文件转换成一个非常大的数字(散列值)。然后,这个数字与签名者的秘密密钥相结合来创建签名。阅读文档的人可以使用签名人的公钥“解密”签名,这将证明签名人已经对文档进行了数字签名。
这些签名可用于验证文件的真实性。通过阅读这篇关于 Medium.com 的文章,你现在正在通过 HTTPS 协议使用数字签名。安全性依赖于找到与签名原件具有相同散列值的另一个文档的难度。
然而,生日悖论让我们有可能通过攻击这个散列函数来滥用这个系统。
假设 Bob 是一个对合同进行数字签名的权威。我们想骗 Bob 在不知情的情况下签署一份欺诈性合同,这样我们就可以在以后暗示他批准了这份合同。我们需要找到的是两个契约,一个合法,一个欺诈,它们在通过 f(x)时产生相同的哈希值。
对于每一份合同,我们可以找出许多方法来微妙地改变它,而不改变它的意义。例如,您可以在每一行的末尾添加不同数量的空白,稍微改变徽标中的像素,或者对格式进行小的更改。总的来说,这给了我们数百万个技术上不同但语义上相同的文档,在 Bob 看来,这些文档都会得到批准。这也给了我们数百万种欺诈性文件。如果我们找到一对文档,一个合法,一个欺诈,产生相同的散列,那么我们可以将合法的传递给 Bob 签名,然后使用该签名来“证明”欺诈合同的真实性。
由于生日悖论,给定散列函数的巨大范围,合法文档之一和欺诈文档之一之间至少一个散列值冲突的可能性比可能预期的要高得多。事实上,您需要生成的文档数量大约是哈希函数可能输出数量的平方根。这是因为没有一个哈希函数是完全均匀分布的,这导致了许多流行的哈希算法变得不安全。
“黑箱”问题:探索矛盾
俗话说“数据进,预测出,中间发生了什么我们也不知道。”但是如果中间有新东西呢?
关于任何足够复杂的机器学习模型和几乎所有深度学习模型,家乡最喜欢的评论是,它们是所谓的黑箱。俗话说“数据进,预测出,中间发生了什么我们也不知道。”对于一些应用程序来说,这并不那么具有破坏性:对于大多数商业应用程序来说,模型工作并产生回报的事实已经足够好了。在某些领域,对模型的理解是首选的,这是为了在例如自动驾驶汽车或医疗诊断中考虑责任。最重要的是,从这些黑箱中可能有学习的潜力,因为它们会产生令人惊讶和强大的结果。如果它们有稍微丰富多彩的一面呢?

我想说明的是,所有的神经网络都是由小的解释单元组成的,正因为如此,对于我们声称可以推广到新数据的任何模型,肯定至少有一个可回答的解释单元。因为至少有一个可回答的解释,没有模型在本质上是完全不透明的,这是一个强有力的命题。
这是一篇充满语言和争论的文章,但我希望通过例子让任何有深度学习经验的人都能读懂。
在大多数情况下,黑盒范式是一种真实的观察,但在本文中,我希望表明,这并不一定意味着深度学习或复杂模型在某种内在性质上就是黑盒。相反,我把它们的黑箱化分解成一个归约的问题。然后,我解释了模型的非线性复杂性是如何激发出一幅非还原的画面的。最后,我断言一个一般化(深度学习)模型有潜力回答至少一个解释问题: 一个要解释的事实或事情,超出了其部分的总和,因此没有一个模型完全是一个黑盒。然后我谈谈为什么我认为这很重要。
我们从一个思维实验开始,以帮助建立一些最初的直觉。考虑一个经过训练的模型是完全确定的:某个输入将总是产生某个输出。比方说,查理建立了一个模型,它做出了惊人的预测,例如,根据全身核磁共振成像,某人是否会在 10 年内患癌症(这种能力将改变医学,我们正在加大赌注)。查理的模型有 5000 万个参数,“令人惊讶的是”,每个参数的确切值都是已知的,它们相互作用的确切方式也是已知的。当然,这是构建深度学习模型的典型。现在,一名医生使用查理的模型,并希望他们解释为什么它说他们的病人将在 10 年内患癌症。Charlie 说,“正是因为将这些数据插入到一系列具有这 5000 万个参数的非线性函数中,才能产生预测。”查理觉得完全正确。他们可以给你一个闪存盘,里面应该有解释他们的模型如何工作所需的所有信息。
但这个答案很糟糕,重要的问题是为什么:我们感觉这个解释不够好,或者没有谈到正确的事情。正是在这里,我们遇到了黑箱矛盾:即使我们手头有模型的确切结构,我们也有一种我们对模型如何工作一无所知的感觉。这是从哪里来的?
最主要的问题是,医生考虑的是生物学或医学上的相关特征,我们隐含地假设这些特征存在于 MRI 数据中,可以预测癌症。她实际上是要求你根据这些特征对网络进行解释。Charlie 如何描述或看待他们的模型的词是简化论者:模型所做的一切或它的属性都可以被简化为它的组成部分。没有“我认为这个灰色像素团是即将发生的癌症的征兆”的节点被触发。所以实际上,当我们说“黑盒”时,我们实际上说的是,神经网络只提供其部分的解释,由于其部分除了其功能上的成功之外与我们期望的解释没有关系,我们说,“数据输入,黑盒中间,预测输出”。
是这个吗?不,神经网络有一个非常重要的属性,表明我们可以安全地采取非还原观点。由于我们还假设并观察到模型会推广到新数据,(并且由于 Charlie 的超级模型获得了 FDA 的批准,所以它一定获得了),我们知道一定存在至少一个超出模型简化视图的特征。论点是这样的:
(1)一个模型 M 带结构 {W} (是重量,连接等。)是由某个进程创建的,用于从集合 {X} 中的 n 个输入数据 X 的示例中预测 Y 。
(2)模型根据从未见过的输入数据X’可靠地预测Y’。
(3)由于 {X'} 与 {X} 不相交,所以存在一个在 {X} 和 {X'}中没有完全表现出来的可靠特征。 【4】从(1,2,3)中至少有一个由 M 表示的可靠特征没有在 {X} 和 {X'} 中表示。
概括新数据的模型不可简化为其定义。
为了真正袖手旁观这一点,我们必须提供一个解释,说明某些非还原性行为是如何从模型中出现的,这些行为的特征在模型中并不明显。重要的是要理解,模型的黑盒不是架构的属性,而是我们对架构应该如何工作或者它是如何产生的期望。这是一个偷偷摸摸的转变,但它让我们有可能打开一扇门,让模型感觉“可以解释”。所以让我们试试:
我们的开始线索是,神经网络仅仅因为它们的非线性而工作,这是另一种说法,即操作在神经网络中不互换。一个简单的例子是,在 ReLU 激活之后应用矩阵操作(即线性层)将不会产生与在矩阵操作之后应用 ReLU 相同的输出。我在下图中展示了这一点,它是由蒙图法尔等人启发的。艾尔。在他们关于深度神经网络线性区域数量的论文中他们发现并断言“深度网络能够将每一层输入空间的部分顺序映射到相同的输出。通过这种方式,深度模型可以计算出对不同输入的复杂模式做出同等反应的函数。”

三个等高线图显示了具有 ReLU 激活的简单 2 节点“网络”(左)与其具有相同权重的 y 输入(中)和 x 输入(右)的线性分解。没有轮廓的空白区域(例如蓝点所在的位置)显示所有输入归零的位置。蓝色区域显示 2 节点网络相当于其输入的线性组合。绿色箭头表示决策边界处的梯度。重要的是,只有在非线性“网络”的情况下,这些箭头才不垂直于输入维度。甚至中间和右边的图的总和也产生与输入向量对齐的箭头。
由此产生的一个有用的想法是将高维空间“折叠”到自身上的想法。出于这种好奇,我研究了非线性如何改变输出空间,并确实发现,即使是简单的 2 节点网络也能计算出对不同输入做出相同反应的函数。但还有另一个特征:折叠发生和不发生的“折痕”。但是进一步,我发现输入空间中的边界或折痕仅对于输入的非线性组合不垂直于输入维度。这个折痕是输入空间内的超平面,在一侧,输出与其输入成比例地变化,而在另一侧,它变成挤压成相等的输出。****
由于该平面的位置是通过优化找到的,因此我们可以说,对于输入的每个组合,线性层解决了其输入重要和不重要的最佳边界。这种折叠和折痕效应超出了输入的总和,并形成了一个解释单元:这种边界之所以存在,是因为特征空间中有一些区域解释了结果(以我们希望的解释方式),因为也有一些区域没有解释结果(否则,就不会有最优解)。在没有硬零点的其他非线性的情况下(例如,sigmoid),“无关紧要”的边界只是软的,某些输入可以映射到越来越相似的值。
对于一个概括得很好的模型,比如 Charlie 的超级 FDA 批准的新患者模型,我们发现在他的模型中一定有一个特征或属性不在训练数据中,这部分来自这些折痕和折叠。查理的模型至少有一个解释单元:如果有一个解释单元,就有一个解释单元,或者需要解释的东西。这意味着,从泛化的神经网络中总会有一些东西可以学习。****
所以让我们回到起点。我们发现,解决黑箱问题的常用方法回避了机器学习模型简化的问题。然后,我展示了如果模型一般化(这是任何模型的目标),至少有一个特征不完全存在于训练数据中。然后,我认为深度学习模型可以通过它的非线性产生一些不可简化为某种输入模式的特征。这些特征至少部分地解释了某些东西,而且由于有些东西可以用一个模型来解释,这个模型并不是完全不透明的。
天啊。好吧。也许所有这些都是一种超级复杂和冗长的方式来表达“它们太复杂了,难以理解”。但是我不同意:我认为这个公式,如果正确的话,可以为寻找这些小的解释单元或者想办法创造更容易找到的解释单元提供灵感。
在我的工作中,我们使用深度注意力网络从全切片组织图像中预测肿瘤分级。其中的一个关键特征是所谓的注意力地图,即注意力权重在组织上的分布。我们发现,对于这种特定的分类,高权重聚集在肿瘤边界,在那里肿瘤细胞的分化最明显和极端。这是我们更高层次的解释单位,我们很高兴有一个。在最初的地图上看到这个特征出现真是不可思议。
如果你只有一个有 10 个隐藏层的直线 MLP,没有注意力地图可以观察,那会怎么样呢?它只有数百万个参数,而且能正常工作!我现在没有答案,但也许如果你确信你的网络学到了一些新功能,一些超越训练数据中任何东西的东西,你也会找到灵感,至少去寻找它——我个人认为你可以,而且你应该。如果你的模型推广到新的数据,它已经找到了重要或不重要的输入组合。不仅仅是从噪音中提取信号,还有新的信号,这些信号是如何提取出来的。
现在,很明显,这并不意味着很容易将巨大的网络视为半透明的,并解释关于它们的一切。这是困难的部分,但我有一种乐观的感觉,我们会变得更好,并找到新的方法来理解我们建立的这些强大的模型。
维度的祝福:为什么维度的诅咒是一枚双面硬币

来源: Unsplash
扭曲古怪空间的好处
大多数在数据科学领域有一些经验的人都听说过维数灾难。它描述了在高维空间中研究操作和分析数据时出现的大量现象,这些现象在低维空间中不会出现。
例如,考虑一下距离的概念在高维空间中是如何被扭曲的。由坐标( x,y,……)定义的两个点 a 和 b 之间的距离公式如下:

你可以在这里找到公式的证明。
当绘制公式时,其中 x 是维数,而 y 是原点和一个点(1,1,1,…)之间的距离,人们可以看到距离将不可避免地逐渐达到峰值,或者更有可能的是,趋向于一个单一值。

用德斯莫斯画的。
这是高维空间中距离本质的证据——随着维度的增加,任何单一一维线的重要性或价值都在减少,这可以从 y 轴上的收益递减中看出。考虑到随着维度的增加,体积和点的可能性增长得有多快,这是可以预料的。
这也是为什么随着维度的增加,超球体的体积趋于零的原因——因为球体被定义为由距离中心点一个半径距离的所有点组成,维度的数量增加,但距离逐渐变小。然而,这看起来并不直观,随着维度趋向于无穷大,超球体的体积将趋向于零,而它所在的超立方体将继续增长(或者保持不变,如果边长为 1)。
让我们考虑一个边长为五个单位的二维超立方体(正方形)。有,那么 5 = 25 个单位。类似的三维超立方体(一个立方体)有 125 个单元。从那里,它扶摇直上。指数的力量真的非常不可思议——仅仅在十个维度内,超立方体就已经拥有了 9765625 个单位的超体积。在空间中增加一个额外的维度会将当前的空间扩大一个巨大的数量级,所以毫不奇怪,微小的一维距离具有递减的价值。

用德斯莫斯画的。
高维数学很奇怪,但在机器学习中,它带来了更大的风险。因为高维空间的体积是难以想象的巨大,而数据点的数量永远无法与这个体积相比,所以高维数据通常非常稀疏。例如,考虑一个 150×150 像素的图像,这是机器学习中非常常见的尺寸。然后,该图像的 150 乘以 150 乘以 3(每个像素三个值来指定 RGB 值,即红色、绿色和蓝色值)等于 67,500 个维度。
比如说,与一万张其他图像一起,每张图像作为特征空间中的一个点存在,67,500 个维度中的每一个维度都有一个值。因为空间的巨大,并且因为在高维空间中距离是如此的小,数据将会非常稀少。这导致模型过度适应数据,因为机器学习算法的数学本质依赖于相对距离的概念,这种概念在如此巨大的空间中被扭曲和淹没。
这就是为什么卷积神经网络在图像中如此受欢迎——它不依赖于许多其他算法使用的空间点模型,而是使用简单的数据改变层来转换一系列矩阵。然而,神经网络的很大一部分是梯度下降——参数(权重、偏差等)的更新。)以优化网络路径来减少错误。这需要指出数百万个可训练参数的特定组合会形成什么样的误差。
然而这是维度的祝福的一个例子。事实上,维度诅咒的弱点在其他情况下可以被重新定义为优点。
维度的祝福和维度的诅咒是一枚硬币的两面。
神经网络的目标是达到误差空间的全局最小值;也就是说,找到产生最低误差的最佳参数集。为了达到全局最小值,它从误差空间的某个点开始,并随着每个训练步骤向它认为正确的方向递增。事实证明,在误差空间中,有许多局部最小值——误差空间中的凹陷是最小值,但不是整个误差空间中的最低值。

来源。图片免费分享。
尽管有解决局部极小值的方法,例如不断增长的利用“动量”和其他方法的专门优化器库,但它仍然是神经网络训练中的一个常见问题。如果它不阻止网络找到全局最小值,它至少可以使训练时间长得多。
然而,在高维空间中,距离是扭曲的,并且不成比例地变大,正如前面所展示的。这被证明是局部最小值的一个巨大优势,它曾经看似全局的下降被渲染成任何合理的优化器都可以克服的表面上的小突起。另一方面,全局最小值对于网络来说将是足够明显的,以在该点收敛。因此,在某些情况下,增加维度可以带来更好的性能和更快的训练时间。当然,这可能会被参数的过度拟合所抵消,因此需要根据实验和知识仔细制定决策。
在机器学习的其他领域以及从数学到物理的其他领域,维度祝福还有其他应用。需要理解的重要一点是,在机器学习中,一切都是有得有失。维度诅咒可能没有大多数人想象的那么糟糕。
如果你喜欢,
你可能也会喜欢我其他一些关于数学和机器学习的文章。
康托尔著名的对角线论证
medium.com](https://medium.com/dataseries/not-all-infinite-sets-are-the-same-size-5abc3782a1f1) [## 你需要知道的所有分布
二项式、双峰式、泊松、+更多
medium.com](https://medium.com/@andre_ye/all-the-distributions-you-need-to-know-ad570514987b)
深度强化学习的书
从零到 AlphaGo 零的指南
对 AlphaGo、OpenAI Five、AlphaStar 的成绩印象深刻?准备好打开引擎盖,构建自己的强化学习模型但不知道从哪里开始?没有比马克西姆·拉潘的 深度强化学习实践 更好的书了(现在是第二版)。
在过去的二十年里,强化学习领域已经有了一本规范的教科书(,现在也有了第二版),但是几乎没有用编码示例来指导你的实践。为数不多的向你展示如何实现这些算法的书籍只不过是该领域流行博客文章的翻版。拉潘的书改变了这一点,成为第一本我可以完全推荐给学习这个领域的人的书。

在我看来,Lapan 的书是快速开始深度强化学习的最佳指南。它是使用 PyTorch 框架编写的——所以 TensorFlow 爱好者可能会失望——但这是这本书的魅力所在,也是它如此易于初学者理解的原因。PyTorch 更容易阅读和消化,因为它的代码更简洁,让读者更专注于算法的逻辑,而不是代码示例的具体细节,代码示例本身写得很清楚,并依赖 OpenAI Gym 框架来简化复制。
这本书不像 Packt Publishing 发行的其他一些“实践”书籍,这些书籍更多地收集了要遵循的食谱,但对你被要求实现的机器学习算法几乎没有背景或解释。Lapan 包括了足够的理论和对正在发生的事情的解释,使读者对深度强化学习世界感到舒适,而不会让它感觉像一本充满推导、证明等内容的沉重教科书。因此,这本书取得了健康的平衡,给读者足够的理论知识来理解算法,同时也提供了例子,使人们能够把算法付诸实践,从而赢得了“动手”的绰号。
这些例子大多来自 OpenAI Gym 的环境设置,车杆和 pong 问题比比皆是,然而,更多的现实生活中的问题也被纳入书中。在介绍了 deep-Q networks (DQN 的)之后,Lapan 从 OpenAI 健身房环境转移到股票交易示例,他带领读者构建了自己的股票交易环境。如果一个人希望在预先建立的健身房环境的狭窄范围之外应用强化学习,这是一个非常宝贵的练习,因为他必须与状态表示、奖励定义、潜在行动以及手头的数据进行斗争,以做出这些决定。从健身房环境的用户那里移除这些设计决策对于学习算法和它们的机制是很好的,但是它隐藏了强化学习本身的复杂性。其他章节致力于将 RL 用于聊天机器人和网络导航(后一个例子依赖于 OpenAI Universe,但它提出了一些关于 RL 其他潜在用例的有趣问题)。
如果你认为这本书只是为了让初学者快速掌握 DQN 和 A2C 算法的基础,那你就错了。它也为更高级的读者提供了许多内容,涵盖了来自 OpenAI Baselines 版本的一些最新算法,如邻近策略优化(PPO)、信任区域策略优化(TRPO)和演员评论家 Kroenecker 因子信任区域(ACKTR)。这些依赖于机器人学校的环境,玩起来很有趣。最后,这本书以使用进化算法对 cart pole 和半猎豹环境进行优化的章节结束,并在 AlphaGo Zero 章节之前查看了基于模型的方法。
总之,这本书涵盖了深度强化学习领域的大量内容,但它非常好地从 MDP 转向了该领域的一些最新发展。我对这本书唯一的不满是作者的 PyTorch 代理网(PTAN)的使用。这个库由多个助手函数组成,用于与整本书使用的 OpenAI 环境进行接口,以完成从预处理到生成剧集和播放策略的所有工作。它很容易使用,但是为了理解关于处理训练数据、传递奖励、折扣等等的一些具体细节,我发现它混淆了这些细节。如果你想了解剧集数据在做什么,以及你是如何处理它的,你必须阅读代码本身,让它非常清楚。然而,最终这只是一个小问题,这个库确实有助于保持代码示例比其他情况下更短、更简洁。
如果现在还不清楚,我全心全意地推荐 深度强化学习实践 以获得对深度强化学习领域的简单介绍。它充满了充分解释的例子,有足够的理论基础,读者能够快速通过这本书实现算法的每一步。
当我开始学习 R 的时候,我希望我有这个盒子情节指南
信息数据可视化是 R!我提供了一些有用的技巧来定制你的情节,使它们更有信息量和色盲友好。

在 R 语言中,定制一个图形来将其转换成一个漂亮的图形并不是炼金术。尽管如此,我还是花了很多时间(也很沮丧)来弄清楚如何让这些情节具有知识性和出版质量。我想分享我用来绘制数据的代码,解释它的每一部分是做什么的,而不是像龙掌管它的宝藏一样囤积这些信息。
首先,让我们加载我们的包并生成一个虚拟数据集,其中包含一个自变量和一个连续因变量。在代码片段之前,我将讨论我们将使用的函数和参数。我们还预先为我们的分类变量设定了一个顺序。
虚拟数据集:函数和参数
- runif 生成 100 个介于 0 和 1 之间的数字
- 抽样随机抽取数字 1 或 2,100 次
- 因子为我们的分组变量设置了一个首选顺序
### Load packages
install.packages('ggplot2')
install.packages('RColorBrewer')
install.packages('ggpubr')
library(ggplot2)
library(RColorBrewer)
library(ggpubr)#Create dummy dataset
ndf <- data.frame(
value = rep(runif(100)),
factor1 = as.char(rep(sample(1:2, replace = TRUE, 100))
)
ndf$factor1 = factor(ndf$factor1, levels = c('1', '2'))
箱形图:函数和参数
- ggplot 允许我们指定自变量和因变量,以及用于图表的数据集
- stat_boxplot 让我们指定添加到绘图上的胡须类型
- geom_boxplot 指定图形中盒子的自变量和因变量
第一次基本的尝试并没有很大的信息量或视觉吸引力。我们首先关注绘制第一个独立变量, factor1。我也不喜欢 ggplot 内默认的灰色主题。
plot_data <- ggplot(ndf, aes(y = value, x = factor1)) +
stat_boxplot( aes(y = value, x = factor1 ),
geom='errorbar', width=0.5) +
geom_boxplot(aes(y = value, x = factor1))

由作者在 R 中生成
带点的方框图:函数和参数
- theme_bw() 为剧情设置黑白主题,去掉讨厌的灰色背景
- geom _ dot plot:binaxis指定哪个变量将与点一起显示。其他参数指定了点的外观,而 binwidth 指定了我们希望在绘图的同一行中有多少个点。如果你想让点透明,使用 alpha 参数,它可以让你指定点的不透明度从 0 到 1。
现在我们的情节更丰富了,但仍需要改进。我们想修改一些颜色,轴和标签。
plot_data <- ggplot(ndf, aes(y = value, x = factor1)) +
stat_boxplot( aes(y = value, x = factor1 ),
geom='errorbar', width = 0.5) +
geom_boxplot(aes(y = value, x = factor1)) +
theme_bw() +
geom_dotplot(binaxis='y',
stackdir = "center",
binwidth = 1/20,
dotsize = 1,
aes(fill = factor1))

为小事流汗
- scale_fill_manual 让我们为自变量的特定值设置特定的颜色
- xlab 和 ylab 允许我们分别标记 x 轴和 y 轴。如果你把换行符后面的转义字符放入标题中(\n),它将在下一行继续标签的其余部分!
- 命名你的情节
- 主题是脚本中非常可定制的部分。它让我们可以定制任何我们想要的参数。由于我不喜欢放置在 ggplots 中的默认网格,我将 element_blank 归属于几个面板参数,以消除绘图周围的边界。我把轴涂成黑色而不是灰色。我还用 plot_margin 指定了图形周围需要多少空白空间。因为这个情节很简单,所以我们去掉了这个例子的图例。通过各种 axis_text 参数,我设置了 axis 文本和标签的大小、字体、颜色和位置。
- scale_y_continuous 设置 y 轴以 0.2 为间隔从 0 增加到 1。通过将剧情的限制扩大到 1 以上,给了标题更多的喘息空间。如果我需要使用带有离散变量名称的 y 轴,我可以使用不同的参数——scale _ y _ discrete。
- scale_x_discrete 让我重新标记两个独立变量。这使您可以快速重命名编码数据。我把自变量重新标为丹尼·德维托和尼古拉斯·凯奇。让我们假设我们正在看尼克·凯奇和丹尼·德维托在票房上的表现,使用 0 到 1 之间的分数。
- stat_compare_means 允许您进行统计测试。这个是给你探索的!只需键入 stat_compare_means( 并按 tab 键即可探索您可用的不同选项。不然可以打字?stat_compare_means 获取该功能的帮助手册!
如果你想知道代码中不同元素的 hjust 和 vjust,它只允许我们改变文本元素的位置。我通过改变箱线图的颜色以及点的填充来添加一些光斑。如果您正在构建一个繁忙的地块,检查可访问性也很重要。你可以用这个工具找到色盲友好调色板:https://colorbrewer2.org/。
为了方便起见,我将代码中的任何变化都加粗,以便于理解。
plot_data <- ggplot(ndf,
aes(y = value, x = factor1, **color = factor1**))+
scale_color_manual(values =
c(**'1' = 'blue'**,
**'2' = 'firebrick4'**)) +
stat_boxplot( aes(y = value, x = factor1 ),
geom='errorbar', width = 0.5) +
geom_boxplot(aes(y = value, x = factor1), shape = 2)+
theme_bw() +
geom_dotplot(binaxis='y',
stackdir = "center",
binwidth = 1/20,
dotsize = 1,
aes(fill = factor1)) +
**scale_fill_manual(values = c('1' = '**#0571b0**', '2' = '#ca0020'))** +
**xlab("Independent\nVariable") + ylab("Dependent\nVariable") +
ggtitle("Box-Dot Plot") +
theme( panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black"),
panel.border = element_blank(),
plot.margin=unit(c(0.5,0.5, 0.5,0.5),"cm"),
legend.position="none",
axis.title.x= element_text(size=14, color = 'black', vjust = 0.5),
axis.title.y= element_text(size=14, color = 'black', vjust = 0.5),
axis.text.x = element_text(size=12, color = 'black'),
axis.text.y = element_text(size=14, color = 'black'),
plot.title = element_text(hjust = 0.5, size=16, face = 'bold', vjust = 0.5)) +
scale_y_continuous(expand = c(0,0), breaks = seq(0,1,0.2),
limits = c(0,1.1)) +
scale_x_discrete(labels = c('Nicholas Cage', 'Danny DeVito'))
** **stat_compare_means(method = 't.test', hide.ns = FALSE, size = 4, vjust = 2)**

在很短的时间内,我们已经从一个简单的箱线图变成了一个视觉上更吸引人、更容易理解的图,为我们提供了关于各个数据点的更多信息。无论何时需要绘制数据,您都可以保存代码并随意修改。这使得定制过程更加容易!没有更多的(好吧,也许少很多)计算机防御!
如果你想下载代码,可以在这里找到:https://github.com/simon-sp/R_ggplot_basic_dotplot。我在代码中留下了大量的注释,以防您遇到困难!请记住,在 RStudio 中,在函数前放置一个问号会为您带来一个说明指南!
数据工程的美丽新世界
苹果 | 谷歌 | SPOTIFY | 其他
肖恩·纳普在 TDS 播客上

编者按:迈向数据科学播客的“攀登数据科学阶梯”系列由 Jeremie Harris 主持。Jeremie 帮助运营一家名为sharpes minds的数据科学导师初创公司。可以听下面的播客:
在数据科学界有很多关于 AutoML 等技术的讨论,这些技术大大减少了数据科学家训练和调整模型以及创建可靠实验的时间。但这种提高自动化程度、增强健壮性和可靠性的趋势不会随着机器学习而结束:越来越多的公司开始关注数据生命周期的早期自动化,包括数据工程的关键任务。
今天,许多数据工程师是独角兽:他们不仅要了解客户的需求,还要了解如何处理数据,以及使用什么软件工程工具和最佳实践来设置和监控他们的管道。管道监控尤其耗时,同样重要的是,这并不是一件特别有趣的事情。幸运的是,像肖恩·纳普这样的人——前谷歌员工,后来成为数据工程初创公司 Ascend.io 的创始人——正在带头让自动化数据管道监控成为现实。
在最新一期的《走向数据科学》播客中,我们邀请了 Sean 来谈论数据工程:数据工程的现状和发展方向,以及数据科学家应该真正了解哪些知识来为未来做准备。以下是我最喜欢的外卖:
- 数据工程师的大量时间花在监控数据管道的性能上,而不是构建新的管道或工具。由于这一点,以及利用当前技术构建这些管道所涉及的复杂性,数据工程项目可能会有很长的时间跨度(在某些情况下可能需要很多年)。结果是许多沮丧的数据科学家,他们不得不等待太长时间才能获得他们今天需要的数据。如果这种情况发生得足够频繁,挫折感可能会达到白热化,导致肖恩所说的“数据哗变”。
- 避免数据哗变的一个伟大策略是建立跨职能团队,迫使数据工程师与数据科学家和分析师一起工作,以便每个人都意识到在数据生命周期的每个阶段出现的独特挑战。额外的好处是,小型的跨职能团队可以更直接地关注他们试图解决的相关业务问题,因为团队中有足够的知识来完全理解它。
- 如果你正试图涉足数据工程领域,无论是作为一名有抱负的数据工程师还是一名试图为未来做准备的数据科学家,Sean 建议建立考虑法规遵从性可能性的项目。例如,“被遗忘权”立法现在允许欧洲公民要求撤回他们的数据——以及他们的数据对任何使用这些数据的算法的影响。因此,在您的下一个项目中,一个有趣的练习可能是:我如何设计一个管道,以便能够跟踪特定数据点对它的影响,并根据需求消除这种影响?
你可以点击这里在 Twitter 上关注肖恩,也可以点击这里在 Twitter 上关注我。
音乐的组成部分
数学和物理如何帮助我们理解我们的主观音乐体验。有很多音频示例。

图片部分来自 Pixabay
如果你曾经,作为一个演奏乐器的人,试图通过学习新的音阶来扩展你的音乐视野,你可能会有这样的印象,不仅有无数不同的音阶,都有像乌克兰多里安或超级洛克里安这样的异国名字,而且明显的混乱也是绝对没有秩序的。维基百科页面列出了 63 种音阶,它们都有自己的声音和感觉。
幸运的是,有可能以一种相当优雅的方式对规模进行分类和排序。
目录

在第一部分中,我们将讲述音乐的物理学以及乐器的声学如何塑造我们如何构建音阶。

下一节将解释十二平均律是如何成为西方音乐创作的主导方式,以及它的利弊。

之后,我们将看看一些著名的(和不那么著名的)音阶,它们可以从 12 个音中构建出来。我们将根据亮度和一致性对它们进行排序,然后将它们分成 4 组。

最后一节将演示不同音阶的声音,既有一些流行歌曲作为例子,也有“一闪一闪,小星星”在 45 个不同的音阶中播放。
什么是规模
在我们开始组织和分类之前,了解一下规模实际上是什么可能会有所帮助。
在其最广义的形式中,音阶只是一组有序的音高,例如{100Hz,123Hz,230Hz}。但是,尽管这些特定的音高很有趣,而且从中创造出一些有趣的旋律也是可能的,但它们放在一起听起来并不好听。然而,听起来不错的是泛音系列。泛音系列是当您从一个音高开始,然后将该音高的倍数添加到集合中时得到的。例如{ 100 赫兹、200 赫兹、300 赫兹、400 赫兹}。这个系列模仿了我们的许多音调乐器的工作原理。
音乐物理学
例如,考虑一根吉他弦(图像中的红色),张力为 T :

利用牛顿第二定律

其中 φ 为 y 方向的弦位移,T7 为弦密度。
通过取极限和做一些代数杂耍,我们最终得到波动方程:

其中 c 为传播速度,为 √T/ 。
波动方程可以通过假设来求解

将这个代入等式得出

因为 L.H.S .仅仅是 x 的函数,R.H.S .仅仅是 T2 的函数,所以它们都必须是常数。因此,我们只有一个变量的两个微分方程。用通常的方法解决这些问题,把边界条件放进去,在末端固定绳子,一些初始形状,我们得到:

其中α和取决于初始形状。看上面的等式,我们看到在每个固定的 t,项只是

乘以一个常数。即:泛音系列。

泛音系列波长。图片来自维基百科
这也是我们在吉他弦的声谱图中看到的。

图片来自 StackOverflow。https://DSP . stack exchange . com/questions/41012/吉他-基频-音高
泛音的相对振幅由初始条件(即琴弦被击打的位置)和乐器主体的共振频率决定。
正是这种不同频率的分布赋予了乐器独特的音色。
然而,其他乐器的泛音级数没有这么简单,例如鼓,我们必须求解二维波动方程,从而得到比弦的三角函数更复杂的贝塞尔函数之和。对于未修补的仪器来说,这通常是正确的。
让我们在一张纸上标出弦的泛音:

图片来自维基百科
第一个泛音是八度,第二个是完全五度,再次是八度,大三度,降七度等等。
毕达哥拉斯论调音
根据传说,毕达哥拉斯通过听铁匠的锤子发现了泛音系列中音乐调音的基础,它们在一起听起来有多好取决于它们大小之间的比例。
这在著名的加夫留斯的音乐理论 (1492)中永垂不朽,如下所示。这个图像很有趣,不仅因为 Gaffurius 显然不能决定如何拼写毕达哥拉斯,还因为左下部分是错误的。记住,所以重量必须是它们在图片中的平方。

图片来自维基百科
泛音级数
泛音系列是一个很好的音阶,但它有其局限性。假设我们已经使用{1,5/4,3/2}创建了我们的规模。这对应于主音,大三度音和完全五度音,它们在一起听起来很好。如果主音是 C,我们就有一个 c 大调和弦。但是现在我们想为音阶中的另外两个音,E 大调和 G 大调,创造大和弦。对于 E,我们需要{25/16,15/8},对于 G,我们需要{15/8,9/8}。但是现在我们有了新的音符,需要更多的音符来配对,它会结束吗?
答案是否定的,但也差不多。为了看到这一点,我们将遵循毕达哥拉斯的想法,将我们的音阶扩展到完美的五分之一,我们得到 1,3/2,9/8,27/32…当我们回到 2 点的八度时有没有一个点?不,那是不可能的,因为 3 和 2 都是质数,所以对于任何 x,y,3x/2y 都不可能是 2。但是,让我们看看我们能得到多接近。
def get_perfect_interval(size, interval_nominator):
intervals = []
for i in range(size):
for j in range(size*2):
intervals.append((i,j, (interval_nominator**i/2**j-2)**2))
return intervals
[(y[0], y[2]) for y in sorted(get_perfect_interval(64, 3), key=lambda x: x[2])][(53, 1.747765116144801e-05),
(41, 0.0005196076730230415),
(12, 0.0007445546943927184),
(29, 0.002441086870025483),
(24, 0.0030189899953210067),
(17, 0.005724679914381747),...
显然 53 的音阶让我们非常接近,但是 41 和 12 也很不错。这样,完美的第五和弦听起来总是很好,而对于 12 和弦,我们也能很好地近似泛音级数。17 音阶用于阿拉伯和波斯音乐。
有趣的是,对于 53 和 12,我们的音调间隔非常均匀,这可以通过绘制音调之间距离的标准化标准偏差来看出。

在 12 和 53 音调处存在局部最小值。
顺便说一句,人们已经使用了 53 音音阶:乘飞机【53edo 微型管弦乐】
31 音也相当受欢迎:量子 7(超越调性)31 音吉他。这是一个很好的三分之一音阶(大三分之一有 5 个作为提名者):
[(y[0], y[2]) for y in sorted(get_perfect_interval(64, **5**), key=lambda x: x[2])][(59, 7.45651434405272e-05),
(28, 0.00037962303591693847),
**(31, 0.0007754964530955168),**
(56, 0.0015333212598040438),
(3, 0.002197265625),
(62, 0.0030589445186102343),...
但是即使毕达哥拉斯体系产生了大约一个八度,它并不是一个真正的八度,并且它是可能被听到的。一种处理方法是通过向上建立一半规模,通过向下建立另一半规模。那么错配就会出现在主音的另一端,在 C 调中这就是 F#音。这叫狼音,听起来很走调。沃尔夫音调的问题导致了许多调音系统的发展,调和度好,只是语调,四分之一逗号平均音调,直到 20 世纪西方音乐趋向于等音律,所有音符之间的距离都相同。这样,不协和音在整个音阶中以小部分分布。这就是今天几乎所有西方音乐中所听到的。
那么音符之间的距离就是 √ 2=1.059。
我觉得有趣的是,我们今天认为理所当然的音乐的组成部分,是作为许多不同的和相互冲突的规范的“足够好的”解决方案而构建的,而不是作为自然法则被发现的。这让音乐看起来更像是一个工程问题,而不是科学问题。
当然,平等气质量表也有其自身的问题。最值得注意的是,第三个音与它的泛音部分有相当大的距离,听起来有点偏离。红辣椒乐队的歌曲 Scar Tissue 考虑到了这一点,其中 B 弦被调到泛音音阶,使得引子比正常调音时更好。
音乐家 Jacob Collier 也利用这一点使一首歌从 432 赫兹到 440 赫兹,而我们却没有注意到。这里由大卫·布鲁斯解释。
十二音
所以现在我们有了 12 音平等律,我们可能会问自己我们能用它做什么。
事实证明,很多。
有多少个 12 音音阶?我们可以将音阶表示为 12 个字符的二进制字符串,其中 1 表示使用的音符,0 表示未使用的音符。
大调音阶因此变成:101010110101。我们不区分不同调的音阶,因此 c 大调和 G 大调是同样的音阶。
这是音乐理论家伊恩·瑞恩给音阶编号的方法。很容易看出有 2 =2048 个刻度。
数据收集
好消息是,即使在最进步的金属乐队或前卫爵士猫中,这些音阶中的大部分都没有被使用。在谷歌上搜索诸如“音阶列表”、“音阶与调式”、“爵士乐音阶”、“异国情调音阶”、“吉他音阶”等术语,会得到大约 45 个音阶,这似乎是常见的用法。
如果你对所有的 2048 秤感兴趣,请访问 Ian Rings 网站,在那里他列出了所有的秤。
按区间分类
为了能够从这些量表中找到某种意义,我们需要一种方法来对它们进行分类。一旦这样的方式可能是使用间隔。因此,例如大调音阶的特征是 -。- .凡。”是半音,“ - ”是全音程。赋予这个音阶独特声音的一点是位置 3 和 7 的两个半音阶。这使得它成为 5 个全音调和 2 个半音调的配置,其中半音调彼此相距最远,2 个全音调(因为音阶是循环的,距离 3 是不可能的)。但是也有一些类似的音阶,准确的说是 7 度。我们可以从大调音阶开始产生它们,然后移动起点。更直观的方法是在钢琴上连续向右移动,首先从 C 开始,然后是 D,等等,并且只使用白键。

图片来自 Pixabay
这些被称为天平的模式。调式是给你的音乐注入一些变化的好方法,因为它们听起来很熟悉(音程是你习惯的),但同时又不同。因此,从位置 2 开始,我们得到多里安音阶,在位置 3 我们得到弗里吉亚音阶,继续吕底亚音阶、米索利亚音阶、伊奥利亚音阶(自然小调)和洛克里安音阶(都以古希腊不同地区命名)。

图片来自谷歌地球
但是,这种顺序并不能很好地反映音阶的实际发音。我发现根据亮度对模式进行排序在这方面更有帮助。
模式排序
亮度与音符之间的距离越大,感觉越“开阔”或“明亮”,距离越短,感觉越“黑暗”的概念有关。因此,大调比小调更明亮,因为我们离大调音阶的第三个音有更大的距离。亮度没有正式的定义,尽管大调音阶的调式排序是一致的,所以我将使用音程的总和,其参数随着离根音的距离而减小。以这种方式,开始时具有许多大音程的音阶会得到较高的明亮度分数。
def brightness(scale):
score = 0
for place,interval in enumerate(scale):
interval = interval.replace('.', '1').replace('-', '2')
score += int(interval)*1.5**(len(scale)-place) return score
对我们前面提到的调式进行分类就产生了:吕底亚调式、爱奥尼亚调式(大调)、米索利调式、多里安调式、伊奥利亚调式(自然小调)、弗里吉亚调式、洛克里调式。
这与五度圈的顺序相同,但是这种关系在很大程度上是偶然的,并不能推广到其他音阶。这是一种音阶在半音之间的距离 2 和 3 之间交替变化的效果,取决于开始的位置。

顺便说一句,五度(置 7)和四度(置 5)可以作为 12 音音阶的发生器的原因是 7 和 12 互质,5 和 12 也是互质。此外,11 个可以工作,但其他的都不行。
其他七音阶
对大调音阶的调式进行分类后,我们可能会问自己,是否还有 5 个全音程和 2 个半音程的音阶,确实有。
我们可以利用循环置换的公式:

循环置换公式
这种情况下的φ是欧拉的全能函数。设置 j1=5 和 j2=2,我们看到正好存在 3 个七音音阶,两个半音和五个全音。
通过将秤表示为项链,可以很容易地看出这一点。

蓝色是全音程,橙色是半音。图片来自 WolframAlpha
其他音阶是半色调之间的距离分别为 1 和 0 的音阶。它们被称为七度音阶 II(包含旋律小调)和七度音阶 III(听起来更像是增加了一个音调的全音阶)。
除了以上几种,还有几种更常见的七音阶,一种是和声小调 ( -)。- .3.)及其模式。
这组音程(3 个半,3 个全,1 个 3-半)根据圆排列公式有 20 种不同的构型,但似乎只有 5 种是常用的,很少用到它们的模式。
我们要看的 7 个音阶的最后一组音程是双和声音阶。这个有三个半,一个全和两个半。这种配置有 15 种不同的组织方式。
总之,循环置换公式产生 66 种不同的 7 音配置。
下面是所有常见的 7 个音级,按音程分组,按亮度排序。用粗体字体写的那些在下面有一个流行音乐的例子。

如前所述,还有许多 7 音音阶,但很少听说过。
不一致
除了亮度之外,用不和谐来给音阶排序可能会很有趣。像往常一样,欧拉已经来过了。他设计了一个公式,叫做欧拉格拉德函数,用来测量音程的不协和音。

欧拉格拉德斯函数
n 是区间的分母乘以分母。例如,对于区间 7/4,n 变成 7*2。因此,E(7 * 4)= 1+(7–1)+2 *(2–1)= 9。
为了得到整个音阶的不协和音,我已经将音阶中所有音调相对于根音的不协和音相加。
大调还是小调
将音阶分为大调或小调可能会很有趣,而且根据我的主观判断,这与第三音是自然音还是降半音有很大关系。我还发现降二度音会产生不同于大调或小调的独特声音,所以我在混音中加入了弗里吉亚音。
用大调/小调分组来绘制协和音(与不协和音相反)和亮度,得出如下结果:

使聚集
使用 k-means 将我们的图分成 4 个组。

集群可以命名为:
蓝色:家,正常且和谐
紫色:空间,明亮且有些不和谐
棕色:夜晚,黑暗且有些不和谐
粉色:魔多,非常黑暗且非常不和谐。
如果你想要一个特定的声音,从这些组中挑选。
声音示例
但是这些音阶实际上听起来是什么样的呢?我录了首很棒的曲子《啊!vous dirai-je,maman”,也称为“一闪一闪,小星星”,使用上述不同的音阶。但是,由于我们的耳朵习惯于在大调音阶中听到它,我们有一种感觉其他版本听起来“错误”的倾向,所以我也包括了一些例子,这些例子原本是在我能找到的音阶中出现的。
流行歌曲示例

对于吕底亚,我选择了一个电影配乐,我认为它很能代表这种模式。许多电影配乐使用吕底亚语。
今天许多流行歌曲都是小调,但为了真正捕捉完整的风调,我选择了一首既有 iii 小调又有 IV 大调和弦的歌曲。另外,时间标记很有趣。
对于弗里吉亚人,我认为金属乐队是合适的。他们经常在部分歌曲中使用弗里吉亚调式,例如《木偶大师》和《记忆依旧》。



闪烁,闪烁的例子
吕底亚语-爱奥尼亚语-混血儿语-多里安语-伊奥利亚语-弗里吉亚语-洛克里安语
吕底亚# 5——吕底亚优势——混合吕底亚 B6——旋律小调——半减——弗里吉亚# 6——超级洛克里安
吕底亚#2 #6 —爱奥尼亚# 2 # 5—匈牙利 min —双调和 maj-Oriental-Ultraphrygian-Locrian bb3 bb7
高深莫测——和声大调——匈牙利吉普赛语——混血儿语 B2——波斯语——佩洛格语——那不勒斯大调——那不勒斯小调
更多资源
我费了很大的劲才找到双和声音阶的流行例子,但这并不意味着它们是无用的。在这里可以找到用这些模式编写的一些很好的例子:
里克·比托和纳赫尔·索尔:史上最黑暗的模式
在更明亮的尺度上,这里有一个吕底亚主导的例子:
绘制其他七音阶
我们当然可以在调和亮度轴上画出其他不太为人所知的标度。例如,如果一个人想要使用与吕底亚音阶相似的不寻常的音阶(就亮度和和谐度而言),这可能是有用的。在这种情况下,人们只需在吕底亚音阶所在的(90,10)附近选取一个音阶。由于大多数人不太熟悉,我就不一一列举了,而是写出了所用的笔记。提供梅杰、弗里吉亚和洛克里安作为参考。下面是 20 个随机选择的排列。- -.3.配置(去掉了除 Major、Phrygian、Locrian 以外的通用刻度)。黄色是为悬挂的秤添加的。

这是-.3 的图..3.配置:

五声音阶
除了七声音阶,人们在寻找奇异的音阶时还会遇到许多五声音阶。以下是这些声音和一些声音示例的亮度-协调图:



Hirajoshi —埃及—Slendro—Ritsy-Ryo—Insen-Iwato-In-Yo
其他规模
有几个常见的音阶我还没接触过,比如六音音阶(蓝调,全音),八音音阶(交替音阶,bebop 音阶)。比这更少或更多音调的音阶非常罕见,但也有少数存在(美洲土著音阶——4 个音调)。为了简洁起见,我不会在这里谈论这些。
结论
音乐是多样的、丰富的,最重要的是,是人类的努力。为了获得全面的理解,一个人需要进入许多不同的领域,如数学、物理和机器学习,但也包括生理学和生物学,尽管这两个在这里没有涉及。仍有许多有待发现和发明。
参考
里克·比托
枚举组合学。轮藻属
数据科学的商业方面:向利益相关者展示的 5 个技巧
数据科学不仅仅是算法和建模

Teemu Paananen 在 Unsplash 上拍摄的照片
数据科学的商业方面
当你把一种爱好变成一种职业时,事情会变得很快令人生畏。虽然我不是专业的数据科学家,也不是机器学习工程师,我作为软件产品分析师(类似于业务分析师)与他们一起在数据科学团队工作。我编写代码,分析数据,帮助制定商业决策,并向 80 多名观众展示我们团队的最新进展。对于任何希望进入该领域的人来说,数据科学不仅仅是算法和建模。当你开始与商界领袖合作时,他们希望你能够以一种易于理解的方式解释事情。
我做了以下事情,以确保在向企业高管和利益相关者展示时处于最佳状态:
1。准备并练习
2。解释商业价值
3。尽可能包含图像
4。创造一个有凝聚力的故事
5。避免行话和技术术语(主要是)
虽然这些看起来很简单,但你可能会惊讶于我参加过的许多会议中,主持人没有达到这些标准中的任何一个!即使只是做几件这样的事情,也能让你看起来很专业。

准备和练习
当这个职位空缺时,我的领域知识、技术写作背景和对数据科学的热情让我得到了这份工作。当我经历入职培训并开始接触一些小项目时,我的老板问我是否愿意接管团队在利益相关者面前的 Sprint review 演示。我抓住了这个机会来提高我的演讲技巧。
当我开始做它们的时候,我还比较新,没有对我团队的所有项目有一个坚实的处理,也不了解观众的知识水平,但至少我听起来很抛光。那是因为我做了准备和练习。我没有试图即兴表演!根据我演讲的时间长短(通常是 10-20 分钟),我会提前至少 24 小时开始整理我的想法。我写笔记,制作幻灯片,从头到尾讲一遍,给自己计时,很多次。因为我有很多焦虑,我发现如果我也在睡觉前看一遍演示文稿会特别有帮助。我的目标是让自己听起来自信,表达清晰。
我与我的团队分享我的幻灯片以获得反馈,我通常与他们会面以确保我公正地对待他们的工作,因为我将会谈论它。总的来说,我可能会花 4-6 个小时准备和练习。随着时间的推移,这种感觉可能会减少,但现在,这让我在 80 人面前感到舒服。
解释商业价值
如果你面对的听众是商业人士,比如以客户为中心的团队、高管和/或管理层,你应该描述你的工作是如何为企业增加价值的。当我开始做演讲时,我太专注于解释我们在冲刺阶段取得的技术成就。虽然很有趣,但一些观众并不理解我们的工作是如何为企业增加价值的。我调整了我的方法,开始从更高的层面展示我们的工作。我将我们的工作与我们的路线图联系起来,解释我们如何实现增强和创新,并使用可交付成果来传达业务价值。

皮克雷波。com
制定一种方法来将团队的技术工作和公司的使命联系起来可能需要时间,但随着我获得了与业务团队合作的经验,并提高了我的业务分析技能,这变得容易多了。我使用像 batimes.com、哈佛商业评论和媒体这样的资源来了解最新的趋势商业分析内容。我还参加了几门在线业务分析课程,以及敏捷认证介绍,为我打下基础。
尽可能包含图像
我在演讲中得到的第一批重要反馈是,我需要包含更多的演示或图表。我的幻灯片没有过多的要点,但是在描述我团队的工作时,我需要多展示,少讲述。我不是向他们展示代码行,而是展示像工作流或拓扑结构这样的东西……容易转化成图像的东西。

示例图
我还包括图像,以帮助传达商业理念和框架。如果你自己做,我发现金字塔或柱子是这类东西的常用工具!例如,我过去用过类似的图片:

各种业务框架和 getthematic
使用图像有助于让观众集中注意力,也有助于使演示生动活泼。虽然我想让人们认为我是一个专业人士,但我还是忍不住通过一点点让我的傻瓜式个性展现出来。我乐在其中,并试图在其中加入微妙的迷因或复活节彩蛋,只是为了重新吸引观众,让事情变得轻松。在加入个人风格之前,一定要了解观众,并和你的团队确认一下。
创造一个有凝聚力的故事
创作一个故事似乎是最困难的事情,但是一旦你变得优秀,你会感觉自己已经从业余爱好者提升到了专业人士。在构思我的故事时,我通常从几个想法开始,当我练习时,幻灯片开始自动排列。我找到了一个很好的表达方式,而且我可以想出一个总的主题,因为我给了自己足够的准备时间!
利用团队的愿景或路线图等东西来提出一个将工作联系在一起的主题。我的团队正在进行的项目比我在 10-20 分钟内所能展示的还要多,所以我使用我们的路线图来对项目进行分组,以便于提出一个主题。例如,一个主题可能是一周的内部分析,下一周的客户产品。团队一起工作来决定什么交付物将准备好展示。
有时一个队友想要演示或展示他们自己的作品,所以我要确保故事顺利过渡到他们的演示中。目标是让球队看起来尽可能好,而不是让我看起来尽可能好。保持自我,专注于与团队沟通,以实现平稳过渡。
避免技术术语和行话(主要是)
了解你的受众是技术交流 101。如果听众是来听你描述你的代码的,那就一定要用技术手段。如果听众是来听你如何让他们赚更多钱的,那就别跟他们谈技术了。

https://www.flickr.com/photos/genewolf/147722422
总结一下我们的学习科学负责人在讨论利益相关方更新的交付成果时给我的建议:
“观众从来不关心评估指标。他们认为,如果我们愿意将某样东西投入生产,我们已经对它进行了评估。”
当把图片和交付品放在一起的时候,要记住这样的事情。不要因为有与之相关的视觉输出就简单地试图包含一些东西。为了评估模型,我们看图表。仅仅因为图表对我们有价值,并不意味着它们对业务主管也有价值。
不要使用行话,保持概念简单。如果非要用行话,把事情解释清楚。作为沟通者,你有责任澄清歧义。
结束语
当我第一次了解数据科学时,我被技术上的东西淹没了。我对 Python 相当陌生,十多年来没有上过数学课,甚至不确定这两个领域之间有什么区别。我花了很多时间学习,我参加了一个为期六个月的数据分析训练营,我与工作中的人和当地 DS 社区的人建立了联系。当我在这一领域找到一份工作时,我必须加快速度,并向业务团队和利益相关者展示。以下是我在展示你的项目时给人留下的专业印象:
准备并练习
解释商业价值
尽可能包括图片
创造一个有凝聚力的故事
避免行话和技术术语(主要是)
查看我的其他教程,了解更多关于数据科学和编程的知识!
学习如何写产生收入的文章!问问你自己写作是否适合你。找到一个合适的位置,成为一个…
medium.com](https://medium.com/swlh/the-four-principles-that-transformed-my-writing-into-content-that-earns-money-db9786086cb3)
谢谢大家!
- 如果你喜欢这个, 在 Medium 上关注我 了解更多
- 通过订阅 获得对我的内容的完全访问和帮助支持
- 我们连线上LinkedIn
- 用 Python 分析数据?查看我的 网站
莱布尼茨的微积分
莱布尼茨如何导出著名的分部积分公式

现代微积分、可定义为、、、对连续变化的数学研究,是由十七、十八世纪的两位伟大思想家分别独立发展起来的,即艾萨克·牛顿和戈特弗里德·威廉·莱布尼茨。
在本文中,我的重点将是莱布尼茨的工作,我将主要基于邓纳姆和梅纳的分析,展示他是如何推导出众所周知的分部积分公式的。

图 1:莱布尼茨的肖像和雕像(没有假发)。
关于艾萨克·牛顿早期数学成就的文章,请看下面的链接。
一个著名数学结果的漂亮证明
towardsdatascience.com](/the-unique-genius-of-isaac-newton-c7f7a8ad73a1)
戈特弗里德·威廉·莱布尼茨是典型的学者。他对广泛的主题做出了根本性的贡献,包括哲学、数学、语言学、神学、工程学、法理学、法律、计算机科学和地质学。莱布尼茨曾经说过他经常需要用一周的大部分时间来记录仅仅一个早上的想法(关于莱布尼茨的杰出传记,参见 Antognazza )。
下图左边是他在汉诺威最后一个住所的工作空间照片。右边是他旅行时随身带的折叠椅。

图 2:左边是莱布尼茨在汉诺威最后住所的工作室的照片(来源)。右边是他旅行时随身带的折叠椅(来源)。
莱布尼茨在第一份欧洲德语科学杂志上发表的关于微积分的三篇最著名的文章的标题分别是:
- Nova methodus pro maximize et minimum,itemque tangentibus,quae nec fractas nec 非理性量化 moratur,et singulare pro illis calculi 属 (1684)
- (1686)
在英语中,标题分别是:
- 一种不受分数或无理数阻碍的求最大值、最小值和切线的新方法,以及一种适用于上述情况的奇异微积分
- “关于隐藏的几何和不可分与无限的分析”
- 对测量几何学的补充,或所有受运动影响的正交中最一般的一种:同样,从给定的切线条件出发的曲线的各种构造
标题页如下图 3 所示。

图 3:莱布尼茨在科学杂志Acta**Eruditorum(来源 ) 上发表的关于微积分最著名的三篇文章
莱布尼茨蜕变定理
这篇文章的目的是说明莱布尼茨的转化定理(见下面对这个特殊标题的解释)的一个特例给了我们著名的分部积分公式。
蜕变定理是关于寻找曲线之间的面积。为了理解莱布尼茨的基本原理,考虑图 4 和图 5,让我们按照莱布尼茨的策略来计算曲线 AB 下方的面积(或者等价地,曲线 y =0 和曲线 AB 之间的面积)。
莱布尼茨认为总面积是具有无穷小基数的面积之和:

等式 1:曲线 AB 下方的面积被莱布尼茨认为是无限多个底长为无限小的矩形的总和(见图 4)。

图 4:一个无限小底 dx,高度 y(x)变化的矩形。
现在考虑下面的图 5 和带底的无限小矩形 dx (注意图中的 dx 不是按比例绘制的)。它的面积是 y dx。由于曲线下方的面积是所有矩形面积的总和,莱布尼茨选择了众所周知的符号来表示总面积:

等式 2:代表曲线之间(或下方)区域的莱布尼兹“S”符号。
标志或符号 ∫ 是一个拉长的 S ,代表单词“sum”(更准确地说,是拉丁语 summa )。

图 5:用于莱布尼茨推导的构造(来源)。
根据图 5 中莱布尼茨的构造,以下关系成立:

等式 3:图 5 所示的 z 的表达式。
图 6 示出了图 5 的一部分。从中我们看到角度 WOT 为 α ,使得三角形 WOT 和无穷小三角形相似。因此,我们获得:

等式 4:三角形δOTW 和无穷小三角形的相似性所隐含的关系。

图 6:图 5 的左部,曲线 AB 的切线与 z 轴相交。
由于三角形δOPQ(见图 5)的底和高分别为 ds 和 h,,使用等式 4,由下式给出:

等式 5:使用等式。4,我们得到底和高 h 都无穷小的三角形δOPQ 的面积
因此,从 A 到 B 的楔形总面积由以下积分给出:

等式 6:楔形的面积等于具有无穷小底的三角形之和。
最后一步是找到曲线下面积 AB 和楔形面积之间的关系。图 5 显示(详见 Mena ):

等式 7:曲线 AB 下方的面积“变形”为两部分之和:楔形的面积和差值 y(b)b/2 - y(a)a/2。
因此,曲线 AB 下方的面积“变形”为两部分之和,即楔形面积和差值

等式 8:三角形的面积之差 ObB 和 OaA。
使用等式。3 和 7(以及执行一些简单的代数,我们得到:

等式 9:等式。3 和 7 放在一起。
现在考虑图 6。我们看到:
- 等式中的第一项。9 是包含垂直线的区域的面积。
- 等式右边的第二项。9 是包含水平线的区域的面积。
- 移动等式右边的第二项。9 在左手边,我们看到上面两个面积之和等于底边为 b 的矩形和底边为 a 的矩形之差(见等式 1)。8).

图 7:对应于等式的图。9.
如果我们现在做出以下选择:

情商。10:莱布尼茨对 g(x)和 y 的选择。
这意味着

情商。11:等式中函数的导数。10.
并将这些定义代入等式。9 我们得到:

情商。12:分部积分公式。
我们看到,出乎意料的是,图 5 中复杂的结构给出了微积分中最常用的公式之一,分部积分!
感谢您的阅读,再见!一如既往,我们随时欢迎建设性的批评和反馈!
我的 Github 和个人网站 www.marcotavora.me 有一些其他有趣的材料,既有关于数学的,也有关于物理、数据科学和金融等其他主题的。看看他们!
资本资产定价模型

阿尔瓦罗·雷耶斯在 Unsplash 上拍摄的照片
一个简单而强大的模型,经受住了时间的考验
如果你和金融人士或 MBA 们相处过,那么你可能听过他们说 CAPM 这个词(读作“cap”,就像棒球帽后面跟着字母“M”)。CAPM 顾名思义是一种定价模型。
在金融领域,定价模型用于对金融资产进行定价。但是,我们不是计算价格,而是通常使用定价模型来估计预期回报(这意味着价格和现金流之间的关系)。CAPM 和它的同类告诉我们,考虑到投资的特性,投资的预期回报应该是多少。
伪装的线性回归模型
听起来很复杂,CAPM 实际上只是一个单因素线性回归模型:
E(Ri)= Rf+B *(E(Rm)-Rf)
其中截距项为 Rf(无风险利率),斜率项为 B(β)。E(Rm)是市场的预期收益。在实践中,我们通常用标准普尔 500 等广泛的股票指数来代表市场,因此 E(Rm)可以被认为是标准普尔 500 的预期回报。

资本资产定价模式(capital asset pricing model 的缩写)
无风险折现率
让我们看一下等式的每一部分。Rf 是无风险利率。即使我们不承担任何风险,这也是我们期望获得的基准回报率。无风险利率源于这样一种观点,即今天的一美元比将来的一美元更有价值。
你愿意今天收到 100 美元还是一年后收到?今天,大多数人都更喜欢他们的钱。因此,为了激励我们等一年(或更长时间)才能拿到钱,借款机构需要向我们支付回报。在 FDIC 承保的银行或美国政府(通过国债)被认为是超级安全的借款人的情况下,他们支付的回报是无风险利率。也就是说,我们今天给美国政府 100 美元,相信山姆大叔一定会在一年后还给我们。然后一年后,我们拿回 102 美元——我们借出的 100 美元和补偿我们与钱分离一年的 2 美元。
贝塔
贝塔系数传统上被视为对投资风险的估计。回到 CAPM 方程,假设 Rf=0(就在几年前,美联储将联邦基金利率设定在接近 0 的水平):
E(Ri) = B* E(Rm)
随着无风险利率归零,我们可以更清楚地看到 beta (B)对 E(Ri)的影响,即我们正在分析的投资的预期回报。当β等于 1 时,E(Ri)=E(Rm)。因此,如果我们预期市场回报率为 10%,那么我们也应该预期我们的投资会有同样的回报。
如果 beta 等于 0.5,那么我们投资的预期回报率将是 5%(市场回报率为 10%)。如果β等于 2,那么我们投资的预期回报率是 20%。一项投资的贝塔系数越高,它对市场的回报就越敏感。
CAPM 的生活方式
本质上,CAPM 更多的是理论性的,而不是经验性的。通常在统计学或数据科学中,我们通过收集数据来分析现象,并使用线性回归等统计工具来量化现象和其他可观察因素之间的关系。也就是说,我们根据数据建立模型。
另一方面,CAPM 不是从数据开始,而是从市场如何运作和投资者如何为资产定价的理论开始。这更像是一种“生活方式”,你对它的信仰程度会严重影响你的投资方式。所以为了理解 CAPM,我们首先需要理解它背后的理论。
并非所有的风险都有回报
资本资产定价模型的驱动力是,并非所有类型的风险都有回报。当我们进行投资时,我们将自己暴露在风险之中——我们不知道我们是否能收回所有的钱。
CAPM 将这种风险分为两种类型——市场风险和特质风险。当我们购买谷歌的股票时,我们将自己暴露在一般的股票市场风险中。谷歌是一家美国公司,它的命运在一定程度上随着美国整体经济的变化而变化。因此,如果美国经济表现良好,我们预计标准普尔 500 也会表现良好,谷歌股票也会产生正回报。相反,如果美国经济进入衰退,标准普尔 500 就会崩溃,谷歌的股票可能也不会这么火。因此,无论其商业模式多么令人惊叹,每家美国公司都对美国经济有一定的敏感性,因此对标准普尔 500 也有一定的敏感性(相对于本国经济而言,外国股票也是如此)。
但这还不是全部。即使在蓬勃发展的美国经济中,谷歌仍然可能失足。它可能会遭遇 Gmail 被黑或者 YouTube 产品发布灾难。这些类型的风险被称为特质风险,因为它们是谷歌独有的,不会被分享。
因此,投资谷歌意味着暴露于一般的股票市场风险和独特的谷歌公司风险。CAPM 属于一个模型家族,该家族假设当涉及到预期回报时,存在重要的风险和不重要的风险。也就是说,作为投资者,我们因承担某些风险而得到补偿——这被称为赚取风险溢价。但并不是所有的风险都值得。那些可以用无形的努力和成本对冲的风险不会给投资者带来风险溢价。
顺便说一下,风险溢价是我们承担风险所赚取的超过无风险利率的金额(回想一下,无风险利率是我们承担零风险所能赚取的回报金额)。因此,一项投资的预期回报等于无风险利率和风险溢价的总和。
特质风险很容易分散
CAPM 建立在只有市场风险支付风险溢价的信念之上。随着时间的推移,暴露于特质风险(公司特定风险)被认为不会产生正的风险溢价。
为什么这么问?这是因为通过持有多只股票,或者更好的办法是投资标准普尔 500 这样的市场指数,可以很容易地分散特殊风险。如果你的投资组合中持有 30 只以上的股票(假设你投资组合中的股票不都来自同一个板块),公司特有的噪音就开始消失了。
在我之前关于相关性和多样化的文章中,我观察到,只要新投资和投资组合中已有投资之间的相关性小于 1,向投资组合中增加更多投资就会产生多样化的效果。两只股票回报的特质成分肯定具有显著小于 1 的低相关性(假设它们不是像 TSMC 和苹果那样密切相关的企业,TSMC 是苹果的主要芯片供应商)。因此,我们的投资组合中包含的股票越多,公司的具体特征就越明显(也就是多样化)。

持有更多股票可以分散公司的特定风险
因此,在资本资产定价模型的框架下,特质风险不会产生风险溢价,因为投资者可以通过在投资组合中增加股票来轻松摆脱它。
请注意,CAPM 并不是说偶尔承担公司特有的风险就不能获得正回报。风险溢价和定期回报之间有一个重要的区别。当我们投资谷歌股票并获得正的定期回报时,那是因为我们对谷歌业务和未来前景的理解是正确的(或幸运的)。因此,要从特质风险中赚钱,我们需要正确(或幸运)。不幸的是,我们不可能都是正确的——在整个投资者群体中,有些人是对的,有些人是错的,所以总的来说,这大约是零和。换句话说,尽管人口中的一部分人有时可能能够获得正回报,但作为一个整体,人口不可能通过承担特殊风险而系统地获得正回报。
风险溢价是不同的,因为每个参与者都可以获得超过无风险利率的正回报——这不是零和游戏(尽管水平会随着时间的推移而变化,这取决于参与者的数量和每个参与者的热情)。我们不需要正确或幸运来获得它(假设问题中的风险溢价实际存在)。当然,这并不意味着你每年的回报一定是正的。相反,这意味着在很长一段时间内,你应该期望你的股票投资组合获得超过无风险利率(来自市场风险敞口)的回报,就像保险公司期望通过承担飓风风险来获得利润一样。
市场(股票)风险溢价
因此,在 CAPM 世界中,特质风险不支付风险溢价,但市场风险支付风险溢价。为什么市场要支付风险溢价?嗯,有几个原因:
- 市场和经济风险不容易分散。当一个经济体经历减速时,公司利润受损,人们失业,虚弱的公司倒闭,股票价格下跌。如果你是经济的参与者或股票投资者,没有办法完全避免痛苦。
- 鉴于承担市场风险有时会很痛苦,投资者愿意这么做肯定有原因(假设他们是理性的)。随着时间的推移,承担市场风险必须向我们支付超过无风险利率的回报。如果没有,为什么任何理性的人都愿意承担风险,当他们可以赚取无风险利率,而根本不承担任何风险。这就像飓风保险公司——如果没有利润可赚,那么保险公司就完全没有理由承担飓风的风险。
- 承担市场风险会产生效用。承担市场风险意味着购买股票,这为公司提供了进行资本支出、雇佣员工和扩大经营所需的资金。所有公司都通过债务(向银行或债券投资者借款)和股权(向投资者出售股票)的组合来筹集资金。因此,当投资者购买并持有股票时,他们实际上是在润滑资本主义的齿轮,因此理应得到回报。
随着时间的推移,股票市场确实倾向于跑赢国债(我们传统上认为美国国债是无风险资产,因为美国政府被认为是非常安全的信用)。我在这里只画了过去 10 年,但更长的时间显示了同样的总体趋势,即股票远远跑赢债券。

市场风险溢价——股票的表现往往优于债券
那么,我们如何才能找到股票风险中归因于市场的部分(唯一会产生回报的部分)?古老的线性回归拯救了我们。回忆一下我之前的帖子,如果你读过的话;),投资的方差被用作其风险的代理。线性回归模型用于分析和解释方差,X 变量用于解释 Y 变量的方差。因此,通过将 X 变量设为市场(S & P 500)的回报率,将 Y 变量设为股票的回报率,我们可以计算出一只股票的市场敞口有多大:
股票回报= B*市场回报+ alpha
上述线性回归方程中的βB 与 CAPM 方程中的β(B)相同。在线性回归中,β是 Y 变量对 X 变量变化的敏感度的度量。所以在这种情况下,贝塔是股票回报对市场变化的敏感度。那听起来正是我们想要的。β的等式给出了更多的直觉:
B = Corr(股票,市场)* Stdev(股票)/Stdev(市场)
贝塔等于股票和市场之间的相关性乘以股票的波动性(也称为标准差)与市场波动性的比率。让我们先考虑第二部分——波动率的比率让我们知道股票的风险有多大。一个高的数字意味着股票的回报比整体市场更不稳定,因此股票可能风险很大。但是在 CAPM 下,并不是所有的风险都有回报。所以我们用股票回报和市场回报之间的相关性乘以波动率。如果相关性很低,那么贝塔系数也会很低——这意味着股票的大部分风险是特殊的,不能归因于市场。
相反,贝塔系数越高,股票的市场风险越大。根据资本资产定价模型,为了补偿我们所承担的所有市场风险,股票的预期回报率就需要越高。
把所有的放在一起
快到了!让我们再来看看 CAPM 方程:
E(Ri)= Rf+B *(E(Rm)-Rf)
好了,现在我们知道了 B 是如何计算的(及其背后的直觉),让我们为一只 B=2(市场风险很大)的股票填写其余的数字。Rf,无风险利率,通常代表 10 年期美国国债收益率,在撰写本文时,该收益率徘徊在 1.82%左右。
市场风险溢价 E(Rm) — Rf 通常由 10 年期美国国债的标准普尔 500 平均超额回报来近似计算(尽管一些更酷的模型试图计算前瞻性隐含市场风险溢价)。我们会偷懒,从 Damodaran 教授那里得到,他估计市场风险溢价为 4.8%。现在我们有了计算股票预期收益所需的一切:
E(Ri) = 1.82% + 2* 4.80% = 11.42%
那么这个数字实际上是怎么用的呢?仅仅假设我们的股票会给我们带来 11.42%的年回报率是鲁莽的。相反,可以把这看作是在 CAPM 世界中我们应该从我们的股票中获得的回报(在这个世界中,只有市场风险是有回报的,承担市场风险可以让我们获得超过无风险利率的回报)。因此,如果你认为你不能获得 11.42%,你可能不应该投资。
最后,我想指出的是,多项研究观察到,低贝塔股票的表现往往优于高贝塔股票。等等什么?在 CAPM 的世界里,这是不应该发生的——市场风险大(贝塔系数高)的股票应该比市场风险小的股票表现好。但我们可能并不是生活在一个 100% CAPM 的世界里。所以对这个模型要有所保留。虽然它是思考市场、风险和预期回报的有用框架,但它确实对世界做出了许多假设。当这些假设不成立时,模型的输出也不会成立。
这篇文章是我投资组合优化入门的第四部分。如果你还没有看过,也看看第 1、2 和 3 部分:
首都一号数据科学访谈
了解一个人的文化、招聘流程和面试问题

摘自维基百科
介绍
Capital One 是美国最大的银行控股公司之一,截至 2018 年资产超过 3700 亿美元,拥有 755 家分行和 2000 台自动取款机。它在财富 500 强中排名第 98 位,拥有 5%的市场份额。截至 2016 年,Capital one 拥有 6250 万活跃持卡人,这是一个过剩的数据。
无意中,Capital One 被认为是数据和分析领域的领导者。1988 年,Capital One 通过使用统计建模和关系数据库对每一种信用卡产品进行个性化定制,颠覆了信用卡行业。现在,Capital One 正在利用现代技术和数据科学家创造新的颠覆浪潮。
数据科学家角色
Capital One 的数据科学家正在帮助引领金融业的下一波颠覆。项目范围从在 Capital One Labs 的团队上建立新的金融科技项目到改进现有的产品和服务。
所需技能和资格
基本资质
- 定量领域的学士学位
- 至少 1 年大规模数据分析开源编程语言(Python、R 或 Scala)经验
- 至少 1 年 Git 和 GitHub 等版本控制系统的经验。
- 至少 1 年机器学习或预测建模经验(Scikit-learn、H2O、Xgboost 或 TensorFlow)
- 至少 1 年的关系数据库(Postgres,Redshift,MySQL)和 SQL 编程经验
首选资格
- 硕士或博士学位,有 AWS (EC2、S3、Lambda、RDS 等)工作经验。)
- 具有使用高级 Git 工作流的经验(拉请求、代码审查、问题和分支)
- 有编写单元测试和集成 CICD 工具的经验。)
- 至少 3 年 Python 或 R 方面的经验
- 至少 3 年机器学习/预测建模(Scikit-learn,H2O,Xgboost,TensorFlow 等)经验。)
- 至少 3 年 SQL 经验
面试过程
Capital One 的面试流程非常严格,由几个步骤组成:
初始电话屏幕
面试从最初的电话屏幕开始,通常长达 30 分钟。这个阶段由招聘人员领导,只是为了更好地了解对方。招聘人员通常会给你一个角色和面试过程的演示,他们还会问你一些关于你的简历和过去经历的标准问题。他们希望看到你对 Capital One 感兴趣,而且你有这个职位所需的经验和能力。
技术电话屏幕
手机屏幕之后是技术回合,也是通过手机进行的。这个阶段大约一个小时,不包含任何编码。在这一阶段,面试官将会…
- 给你一个真实的案例,并要求你解释建模过程中涉及的各个步骤
- 问你一系列与数据集相关的问题
- 或者两者都有
示例案例:给定一个关于客户电话和代理的数据集,谈谈你将如何准备数据并对数据建模,以提高客户服务质量。
想要更多 Capital One 的真实数据科学面试问题及解答?更多信息请访问面试查询。
数据挑战
在此阶段,您有一周的时间来完成一项带回家的数据挑战。在这一阶段,您将展示自己编码、建模和解决现实问题的能力。在这里,您将获得一个数据集,并被要求清理数据并根据数据建立预测模型以实现预定目标。
举个例子,之前的候选人得到了一个纽约出租车数据集,并被要求建立一个模型来预测司机会收到多少小费。
现场面试(4-5 轮)
数据挑战之后是现场面试。通常有三到五轮面试,每轮持续一小时左右。面试的类型各不相同,从行为面试到技术面试,再到商业案例。
行为:在行为面试中,你会被问到一些情景问题,通常以“告诉我一个时间”开始。回答这些问题的时候一定要用星形格式(情境、任务、行动、结果)并且要简洁!
样题包括以下内容:
- 告诉我们你在团队环境中有效工作的一次经历。
- 描述您过去的数据科学项目
白板/技术:技术回合可能会有很大不同,通常,这一回合将由关于统计和机器学习的技术问题组成,或者这一回合用于解决白板问题。
在统计问题方面,以前的候选人被问及回归、相关性、多重共线性、p 值等问题。在机器学习问题方面,问题将类似于技术电话屏幕。
业务案例:这部分面试不太侧重于数据科学,更侧重于业务理解。面试官会给你提供一个案例,会问你几个业务相关的问题。
上一个例子:给定一个汽车贷款案例,收入是多少?费用?给定一个预测客户是好是坏的模型,找出模型预测好的情况下客户是好的概率,模型预测好的情况下客户是坏的概率,等等…
工作适合度:其中一轮将集中在你是否“适合”这个角色、这个团队和整个公司。在这里,面试官会谈论你将参与的部门和项目,了解你是谁,以及你是否能很好地融入团队。
成功的秘诀
- 在决定为带回家的案例使用什么编程语言时要保持警惕。之前的考生因为没有使用 Python 而被罚。为了安全起见,请与招聘经理或招聘人员仔细核对语言偏好。
- 对于带回家的情况,保持简单。没有必要建立多层神经网络——他们不想看到这一点。简单的线性模型就足够了。
- 对于行为问题,确保使用星形(情境、任务、行动、结果)格式。这将有助于你说得更简洁,听起来更专业。
- 请说出您的想法,尤其是对案例和白板问题的想法。不要在沉默中解决问题!即使你得到的答案是错误的,如果你大声说出你的过程,至少你可以证明你的想法。
面试问题示例
- 解释如何处理缺失值
- 你会如何解释多项式分布并在白板上写 python 代码来表示这种分布
- 你如何建立一个模型来预测信用卡欺诈?
- 如何检测多重共线性?
- 如何连接两个数据集?
- 解释偏差-方差权衡
- 随机森林和梯度提升树有什么区别?
- 正规化是做什么的?
- 假阳性和假阴性哪个更重要?
- 从头描述建模过程
感谢阅读!
标杆问题——粒子群优化算法的竞争性能
粒子群元启发式算法在并行深度学习中的性能
OpenAI 的 CartPole 问题是强化学习中的一个主要问题,它是许多 RL 最先进算法应用的基准。然而,并不是只有 RL 算法可以解决控制问题。在这篇文章中,我将概述粒子群优化算法(PSO);它如何应用于控制问题,以及它如何与深度 Q 学习相比较。

如果你想了解我为这篇文章编写的所有代码,可以在这个 Jupyter 笔记本上看到:https://github . com/Adam price 97/Control/blob/master/psocartpole . ipynb
什么是粒子群优化?
粒子群优化是一种元启发式优化算法。元启发式算法搜索给定函数的最大(或最小)值,而不需要函数的太多先验知识。
粒子群通过在搜索空间中移动粒子进行优化。在离散的时间步骤,通过使用粒子的位置作为适应度函数(该函数被优化)的参数来评估粒子。然后,粒子被吸引向全局最佳解(由群中的另一个粒子找到)和他们找到的最佳解。
PSO 是无梯度的,这使得它可以快速地执行更新(当使用大群体时很有用),但是,它不能保证收敛到局部最小值(或最大值)。

PSO 在行动。By 伊弗马克。
单个粒子的速度由 3 个参数控制:
- 全球权重(φᵍ) —全球最佳解决方案所在地的吸引力。
- 局部权重(φˡ) —粒子最佳解决方案位置的吸引力。
- 惯性(ω)——粒子改变轨迹的难易程度。
我们还需要为算法提供:搜索空间边界(阻止粒子离开搜索空间);优化的适应度函数;和要使用的粒子数量。
我的 PSO 的 python 实现。
粒子群算法在横竿问题中的应用
我们创建的 PSO 框架非常灵活。我们只需要给它传递一个函数 f(θ),其中θ是一个参数向量,它会试图找到使函数最大化的θ。
为了将粒子群算法应用于横竿问题,我们需要使用粒子在搜索空间中的位置,来生成横竿问题要遵循的策略。为此,我们使用具有两个输出的线性网络,这两个输出通过 softmax 函数来创建随机策略。

π(a,s θ)
使用小车的当前状态作为输入层,粒子的位置作为权重,我们产生选择两个动作(向左或向右移动小车)的概率。
粒子位置的适合度由策略的性能(奖励累积)给出。环境的初始状态是随机的,因此我们必须针对多个事件评估策略,以获得对策略质量的估计。这在某些环境中可能被证明是低效,但是运行 CartPole 到终端在计算上是非常便宜的。
有了这些,我们就可以开始实验了!
表演
当我们运行上面的脚本时,我们发现 CartPole 问题在平均 2.4 次迭代中得到解决。与其他学习方法相比,这是非常少的迭代。优化良好的深度 Q 学习方法往往需要大约 30 次迭代来求解 CartPole。
那么 PSO 有没有胜过深度学习方法呢?
我们需要记住使用的蜂群。在标准 RL 实现中,使用单个代理,它每次迭代只能运行单个剧集。我们的群每次迭代有效地运行 15 集,因此可以说 PSO 实际上用了 36 (2.4*15)集来解决问题。这和 deep Q 差不多。
另一方面,单个 RL 代理比单个 swarm 代理需要更多的计算。在深度学习实现的情况下,每个时间步长可能会有 1000 个权重被更新。相比之下,我们整个群体在每集之间优化了 120 (8*15)个权重。
也许我们可以根据找到解决方案所需的时间来比较不同的方法?但是我们需要考虑计算机架构。深度方法受益于 GPU,而粒子群算法将受益于并行计算。
最终,很难准确地比较这些不同的方法。但是,我确实认为我们已经设法为控制中的元启发式的进一步研究提供了一个很好的案例。
机器学习中的神秘案例
一个黑盒机器学习算法的用例。
在寻求越来越精确的预测分析的过程中,黑盒模型,或不经过复杂分析就难以理解的算法,正变得越来越普遍。虽然这些模型带来了数据科学领域的进步,但它们的使用也存在伦理问题。参见这篇发表在《自然》杂志上的文章,对黑箱模型及其对应的、用于解释它们的二级模型的危险进行了概述。关于模型解释方法的详细说明,参见 Christoph Molnar 所著的《T4》可解释机器学习。

作者图片
如果遵循这些解释方法,就不太会有偏见。尽管如此,仍有支持者认为所有的黑盒都是坏的,也有人认为如果小心使用,它们会有用。还有一些人倾向于避免使用“黑盒”这个术语,而简单地称之为或多或少可解释的。

作者图片
在进入什么使黑盒成为黑盒的细节之前,将算法放在机器学习盒内,将机器学习放在 AI 盒内。机器学习是使用算法近似定量估计的科学。以下是可解释的机器学习模型与被认为是“黑箱”的机器学习模型的对比
易于解释的模型
可解释的模型包括线性回归及其同类逻辑回归和 GLM(广义线性模型)、决策树、决策规则、规则拟合、朴素贝叶斯分类器和 K-最近邻。

规则适合模型。图片来源:Christoph Molnar经许可后发布**
不易解释/黑箱模型
可解释性较差的模型可以包括除上述模型之外的任何算法,或者应用了许多转换的任何模型。有许多转换有助于提高模型性能,但会降低可解释性。这些可以包括基本的统计操作,如标准化、规范化、插补和对数转换,以及更专业的技术,如子采样、超采样和噪声注入。文志于等人发现“不同维度的变换算子的随机组合优于大多数传统的数据变换算子,适用于不同种类的数据集。”
下面是应用于数据的常用转换的概要。这些只是一个开始。如果有充分的理由,任何可以应用于函数的数学运算都有可能应用于算法。
对数变换 该变换将数据乘以其对数。

最小-最大缩放
这种变换将带来 0 和 1 之间的所有值。

标准化 这种转换会改变数据的均值和标准差。

****均值归一化这种变换会使所有数据在-1 和 1 之间,均值为 0。

单位矢量变换 该变换对矢量进行转置,使其形状从水平变为垂直,反之亦然。

每个数据集都有独特的转换应用,这取决于数据本身的结构以及预测的目标。在不试图对一刀切的解决方案发表意见的情况下,机器学习模型的应用在不同的应用中有很大的差异。“黑箱”方法可能对某些情况有用,对另一些情况有害。“黑箱”这个术语有些误导。创建模型的数据科学家应该知道应用了什么转换以及为什么要应用。这种脱节伴随着在创建模型后对结果的解释,以及获得结果的过程是否可以向一个没有数据科学知识的人解释。
这篇博客将探索黑盒模型的一个用例,以揭穿应该不惜一切代价避免黑盒模型的观点。

图片来源:Alexander Abero 经许可发布
想想 LEED,或者环境和能源设计领域的领导者。 LEED 是一个绿色建筑评级系统,奖励具有高环保性能的建筑。建筑根据各种特征来评分,如机械系统的效率或回收材料的数量。有了足够的分数,建筑物可以被评定为认证、银、金或白金。所有点的相对价值通过一个清单公布在网上,因此建筑师和工程师可以设计建筑以达到特定的认证水平。
公开发布核对表的问题在于,这很容易让系统陷入游戏。在 LEED 认证上作弊是业内众所周知的问题。每一笔 LEED 信贷都必须有文件支持,这是一个无信任系统的特征。例如,场地边界用于许多计算。这可以以某种方式提取,以获得实际上不应该获得的信用。更糟糕的是,设计团队可能会提交文件,说明安装了特定的系统,但随后可能会在施工中缩小规模,从而导致更差的能源性能。因为相同的系统被用于设计和评估,所以发生了冲突。本质上,这就像是在知道答案的情况下准备考试。

克里斯·利维拉尼经许可发布
继续以标准化考试为例,参加考试的人不知道考试的正确答案。同样,用于计算消费者信用评分的确切公式也是未知的。该公司对这个公式保密,因为如果它被知道,它将被欺骗。在完全透明的情况下,系统的完整性将会崩溃。对于一个人来说,提高他们的信用评分,定性的建议,如“保持循环账户的低余额”,或大致的估计,如“保持余额低于限额的 30%。”然而,循环余额如何影响分数的确切性质是未知的。

图片来源 Stephen Phillips 经许可发布
如果一个建筑师变成了统计学家,希望能够从数量上比较所有建筑。通过行业知识的方式,该系统是游戏,LEED 分数可能不是一个准确的方式来评估建筑的环境性能。相反,可以使用关键性能指标和各种其他数据点。这正是我的创业公司——建筑质量指数(BQI)正在进行的项目。BQI 的目的是为了解决一次性建筑的问题,在这个问题上,建筑的质量越来越差,拆除的时间还不到人的寿命。
需要一个全面的质量和风险衡量标准——而且它需要是一个不能被欺骗的标准。例如,业主可能想知道他们是否应该投资翻新一栋建筑,或者他们是否应该购买一栋新建筑。根据一组数据了解未来泄漏、结构问题或地震脆弱性的风险很高,这将是非常有用的信息。但是,如果提供数据的人知道什么被认为是高风险,他们可能会试图篡改输入,以获得有利的结果。
出于这个原因,保险业并不透露究竟是什么因素导致它增加和减少保费,以及增加多少。在游戏是一个已知问题的系统中,或者在不准确的结果可能导致财产或生命损失的系统中,使用“黑盒”算法可能是防止游戏的最佳解决方案。
“黑箱”可以概括为高精度的代价。一个模型调整得越好,它的可解释性和透明度就越低,维护隐私就越容易。除了上面提到的常见转换,集成方法以及打包和提升也会增加“黑箱”性,或者降低透明度和可解释性。
透明度、隐私和精确性之间的权衡是一种微妙的平衡。下图是确定是优先考虑透明度、隐私还是精确度的起点。政府、科学、社会科学和商业中的用例可能有非常不同的优先级。通过提出正确的问题,数据科学家可以为不同类型的用例开发最佳实践。

作者图片
参考文献:
- 达拉斯卡,,机器学习中的“黑盒”隐喻,, 2017,走向数据科学。
- 弗吉尼亚·迪格纳姆(Virginia Dignum), 论偏见,黑箱和对人工智能透明性的追求 , 2018,中。
- 杰弗里·赫尔,约瑟夫·m·赫勒斯坦和肖恩·坎德尔,,* 2015 年,第七届创新数据系统研究双年展(CIDR。)***
- Milo R. Honegger, 揭秘黑盒机器学习算法 , 2018,卡尔斯鲁厄理工学院。
- 页(page 的缩写)Krammer,Ondrej Habala,Ladislav Hluch, “数据挖掘的转换回归技术”, 2016,IEEE 第 20 届智能工程系统国际大会(国际核事故等级)。
- 玛丽娜·克拉科夫斯基, 最后,一窥机器学习系统的‘黑匣子’内部 , 2017,斯坦福工程。
- Colin Lewis 和 Dagmar Monett, AI &机器学习黑盒:透明和问责的需要 , 2017,KD 掘金。
- Rob Matheson, 破解自动化机器学习的黑匣子 nin g, 2019,麻省理工新闻。
- 本尼摩尔,在我们信任的黑盒算法中(或者我们?)2017,计算机械协会。**
- ODSC —开放数据科学, 破解盒子:解读黑盒机器学习模型 , 2019,中。
- Arun Rai, 可交代 ai:从黑箱到玻璃箱 , 2020, 营销科学院学报 。
- Cynthia Rudin 和 Joanna Radin 、 为什么我们在不需要的时候,却在 AI 中使用黑盒模型?一个可交代的 AI 竞赛的教训 , 2019,麻省理工出版社。
- Cynthia Rudin, 停止解释高风险决策的黑盒机器学习模型,用可解释的模型代替 , 2019,Nature。
- 克里斯·沃克、 白盒 vs 黑盒模型:平衡可解释性和准确性 、 2020、数据伊库。
- 于,,王厚三,,,,于,,,混合聚类集成框架下基于随机组合的数据变换算子,,, 2012,,模式识别。**
Precision 诉 Recall 一案
请允许我试着解开你的困惑

图片来自皮克斯拜
P 精确度和召回率是所谓的评估指标——用于分析模型性能的指标,尤其是在分类方面。因为分类通常是二元的,因此你要么是正确的,要么是不正确的,这就带来了假阳性和假阴性的问题。
精确
在某些情况下,出现假阳性会更加有害。例如,在垃圾邮件检测中,如果一封重要的电子邮件被标记为垃圾邮件(在这种情况下是肯定的),而实际上它不是,这可能是灾难性的,因为您会错过它。因此,控制或防止误报更为重要,因为收件箱中有垃圾邮件比重要邮件中有垃圾邮件要好。如果您的重点是控制假阳性,您会喜欢更高的精度分数。
精度是真阳性的数量与真阳性和假阳性的组合数量之比。换句话说,precision 是在所有被判定为肯定的结果中,正确或不正确的结果在所有被标记为垃圾邮件的电子邮件中所占的百分比。
回忆
相反,在医学上,假阴性的危害更大。被诊断出患有你最终没有患上的疾病,比得到你确实患有的疾病的阴性检测结果要好。后者可能导致严重的疾病得不到治疗,甚至可能是致命的错误。因此,在这种情况下,必须控制假阴性。如果你的重点是控制假阴性,你会喜欢更高的召回分数。
召回率是真阳性的数量与真阳性和假阴性的组合数量的比率。换句话说,召回率是在所有实际阳性中,被正确判定为阳性的百分比,判定正确与否——测试结果正确在患有疾病的人的所有测试结果中,返回阳性,测试结果阳性与否。重要的是要记住假阴性是被错误判定的阳性结果。
正如你可能已经推断出的,精确度和召回率有一个相反的关系——一个上升,另一个下降,因为你选择控制假阳性或假阴性。如果你仍然困惑,这是完全可能的,我很抱歉让你失望了,也许下面的图表可以帮助你理清思路:

由沃尔伯——自己的作品,CC BY-SA 4.0,https://commons.wikimedia.org/w/index.php?curid=36926283
如果你仍然感到困惑,也许我最近在 LinkedIn 上看到的 Samar Srivastava 的下一个类比会有所帮助:
“想象一下,最近 10 年,你的女朋友每年都给你一个生日惊喜。
然而,有一天,你女朋友问你:
亲爱的,你还记得我给你的所有生日惊喜吗?
这个简单的问题让你的生命处于危险之中。
为了延长你的寿命,你需要从记忆中回忆起所有 10 件令人惊讶的事情。
因此,回忆是你能正确回忆起的事件数量与所有正确事件数量的比率。
如果你能正确回忆起所有 10 个事件,那么,你的回忆率是 1.0 (100%)。如果你能正确回忆起 7 个事件,你的回忆率是 0.7 (70%)。
现在,更容易将单词 recall 与该单词在现实生活中的用法联系起来。
然而,有些答案你可能会错。
比如你回答 15 次,10 个事件是正确的,5 个事件是错误的。这意味着你可以回忆起所有的事件,但不是那么精确。
因此,精确度是你能正确回忆起的事件数与你能回忆起的所有事件数之比(正确回忆和错误回忆的混合)。换句话说,就是你的回忆有多精确。
从前面的例子(10 个真实事件,15 个答案:10 个正确答案,5 个错误答案)来看,你得到了 100%的召回率但是你的准确率只有 66.67% (10 / 15)。”
希望这对你有用!
用漫画解释链式法则导数
这一切都是从 Seth 偶然发现神话中的"平方机器"开始的:

图片来自 Pixnio
传说中,无论你将什么东西放入平方机器,机器都会给你那个数量的物体平方。

图片来自维基媒体
于是,比利把这颗巨大的钻石带到了磨方机前,他们把它放了进去。

等一下…

但是比利已经有了更大的想法…

图片来自维基媒体
于是他们放了 3 个瓶子,出来了 9 个!

然后,比利想知道“如果我们把 3 包洗发水放入平方机会发生什么?”
他们照做了,又一次,9 个瓶子出来了!

比利发现,如果你把“x”瓶子放进去,你会把“x”瓶子拿出来,但他也注意到了其他一些非常有趣的事情:
他意识到你可以用价值包来描述这台机器。如果您放入“x”价值包,您会得到“3”价值包。
^Let 这才明白过来。这是“链式法则”中最难理解的部分。
Billy 发现,您还可以用“瓶子”或“价值包”来描述这台机器的衍生产品:
- 机器如何响应添加/取出洗发水?
X 的导数当然是 2x。
2.机器如何响应添加/移除价值包?
3 合 1 超值套装是 3 倍。如果你用“3x”代替上面例子中的“x ”,你会得到 2 的导数(3x ),或者 6x。
Billy 现在知道了平方机器如何将相对于移动到价值包,这在以后会非常有用…
事情变得复杂了
他们找到了第二个神奇的机器。这台叫做“三倍机”。如果你把一个项目放在“三倍机”,它会给你一个 3 包!

照片来自geograph.org
Seth 和 Billy 高兴地跳起来,急切地将一个洗发水瓶子放入三倍机中(没有意识到他们可以将钻石放在那里)。
正如所承诺的,一个 3 包弹出。
赛斯开始变得渴望权力。他想从地球表面根除油腻的头发。

他决定将两台机器“链接”在一起。他计划将物品放入“三倍机”,然后连接两台机器,以便三倍机生产的价值包直接进入“平方机”。

Seth 想知道:“我如何计算新组合函数的总导数?”
比利心想。

就在那时,Billy 意识到:我们知道三倍机如何相对于洗发水瓶子移动(3x),我们也知道平方机如何相对于三包移动(6x)。我们可以将这些相乘,并计算出“x”的变化如何影响平方机器的最终输出。
3x * 6x = 18x
这个概念适用于所有“链”类型的函数。如果我们计算外部函数如何将相对于移动到内部函数,并且我们计算出内部函数如何将相对于移动到 x,我们可以将这些相乘来发现总输出如何相对于 x 移动
我们如何计算外层函数相对于内层函数的运动?
为了计算平方机器如何将相对于移动到(3x ),我们对 x 求导,但是用(3x)代替 x。
(3 倍)
变成了:
2(3x)
6x
如果我们想计算平方机器如何相对于“sin(x)”机器移动到“sin(x)”机器,传入 sin(x),对外部部分求导,然后简化。
(sin(x))
2 * sin(x)
这个故事的寓意:一切都是相对的
假设你已经设置了一个"汽车- >马力计算器。
如果一辆车有 10“马力”,我们的函数就是 f(x) = 10x。
如果我们通过 5 辆车,我们正确地获得 50 马力。
如果你传入 1(飞机),你将得到 10 马力,这是不正确的,因为这个函数是马力相对于汽车的度量。
但是,如果我们有一个“飞机- > carpower ”计算器,我们可以将两个函数相乘,计算出一架飞机有多少“马力”。
关于作者
我是 FlyteHub.org 的创始人约翰尼·伯恩斯,这是一个免费开源工作流程库,用于执行无需编码的机器学习。我相信在人工智能上的合作会带来更好的产品。
阿帕奇猪的魅力
不容错过的大数据工具

Apache Pig 是 Hadoop 生态系统中的核心技术。本文的目的是讨论 Apache Pig 是如何在 Hadoop 技术工具中脱颖而出的,以及为什么以及何时应该利用 Pig 来完成大数据任务。
任何对 Hadoop 有一定了解的人都知道,它能够以分布式方式处理大量数据。Hadoop 的编程模型 MapReduce 通过将一个作业拆分为一组 map 任务和 Reduce 任务来实现并行处理大型数据集。MapReduce 是底层的低级编程模型,这些工作可以使用 Java 和 Python 之类的语言来实现。
考虑一个简单的字数统计任务,我们希望通过 Hadoop 来实现。这项工作的目的是统计每个单词在给定的输入集中出现的次数。下面的代码片段展示了如何使用 Java 编写的 mapper 类和 reducer 类来实现这一点。这是https://Hadoop . Apache . org/docs/current/Hadoop-MapReduce-client/Hadoop-MapReduce-client-core/MapReduce tutorial . html # Source _ Code中提供的一个例子
import java.io.IOException;
import java.util.StringTokenizer;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class WordCount {public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{private final static IntWritable one = new IntWritable(1);
private Text word = new Text();public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
好的,这段代码由 61 行代码组成。要写这样的东西,你必须清楚地理解 MapReduce 的基本概念和理论。而且,您应该知道以您的首选语言提供的一组库或包,以及它们应该如何组合在一起。映射器、归约器和其他实用方法必须被显式地调用或组合到管道中,以实现整体结果(本例中为 main 方法)。总之,这段代码必须被编译和部署。听起来有点复杂,尤其是如果你没有 MapReduce 或 Java 背景的话?
当我用 Java 编写我的第一个 MapReduce 程序时,我自己也问过这个问题——“有没有更简单的方法来实现这一点?”。答案是‘是的,有,而且是用阿帕奇猪’。
Apache Pig 是一个高级平台,用于创建在 Hadoop 上运行的程序。这个平台的语言叫做猪拉丁语。
Pig Latin 是一种类似 SQL 的脚本语言,它抽象了 MapReduce 的编程概念。如果您熟悉 SQL 的基本概念,使用 Pig Latin 将 MapReduce 作业放置到位只需几分钟。它将 MapReduce 的底层复杂概念转换成一个非常高级的编程模型。
现在让我们看看上面我们用 Java MapReduce 做的字数统计任务是如何使用猪拉丁(https://en.wikipedia.org/wiki/Apache_Pig)实现的。
input_lines = LOAD '/tmp/word.txt' AS (line:chararray);
words = FOREACH input_lines GENERATE FLATTEN(TOKENIZE(line)) AS word;
filtered_words = FILTER words BY word MATCHES '\\w+';
word_groups = GROUP filtered_words BY word;
word_count = FOREACH word_groups GENERATE COUNT(filtered_words) AS count, group AS word;ordered_word_count = ORDER word_count BY count DESC;STORE ordered_word_count INTO '/tmp/results.txt';
有了猪拉丁,我们把之前的 61 行压缩到了 7 行。同样的任务是通过操作几个关键字来完成的。像这样的一段代码很容易实现,也很容易被其他人理解。所以,很明显 Apache Pig 降低了 MapReduce 的学习和开发曲线。理解上面的 7 行代码是我留给你们的挑战。有兴趣的话可以从这里开始学习猪拉丁的基础知识:【https://pig.apache.org/docs/r0.17.0/basic.html
下表提供了基于上述示例的 Apache Pig 和 MapReduce 的汇总比较。

MapReduce vs Pig
阿帕奇猪架构概述
即使我们试图区分 MapReduce 和 Apache Pig,我们也必须理解 Apache Pig 是建立在 MapReduce 之上的。

猪建筑:图片来源
Pig 脚本通过 解析器 转换成有向无环图(DAG ),然后输入优化器进行进一步优化。 优化器 执行逻辑优化,如投影,并将优化后的逻辑计划传递给编译器。 编译器 将其转换为一组 MapReduce 作业,并传递给 执行引擎 。这种架构也证明了好处来自于易于实现和易于理解。Apache Pig 充当 MapReduce 复杂概念的高级包装器,并为用户提供一个易于处理的脚本框架。
让我们更深入地挖掘一下 Apache Pig 的一些有趣特性。
- 强大的内置功能集 : Pig 自带一系列内置功能。这些函数分为 eval、load/store、math、string、bag 和 tuple 函数。更多关于 Pig 内置函数的细节可以在这里找到:https://pig.apache.org/docs/r0.17.0/func.html
- 用户定义函数(UDF):有人可能会想,我们是否应该只依赖 Pig Latin 提供的一组有限的关键字/功能。用户定义函数是一个解决方案,它扩展了 Apache Pig 的功能。我们可以使用 Java、Python、JavaScript 或 Ruby 等语言编写函数,并在 Pig 脚本中使用它们。UDF 支持定制处理的几乎所有部分,包括数据加载、存储、转换和聚集。
- Tez 模式:Apache Pig 架构显示它在 MapReduce 之上增加了一些额外的步骤,使得 Pig 比 MapReduce 慢。作为一个解决方案,也可以在 Apache Tez 上执行 Pig 执行。这显著提高了阿帕奇猪的性能。这种性能提升是通过将 Pig 脚本转换成有向非循环图来实现的。如果 pig 脚本的性能是一个问题,那么在 Tez 上运行它是一个选择。你可以在这里找到更多关于阿帕奇技术开发中心的细节:【http://tez.apache.org/
- 多查询执行 : Pig 具有一次处理整个脚本(一批语句)的能力。首先对整个脚本进行解析,以确定是否可以组合中间任务来减少需要完成的工作总量。这是实现性能优化的另一种方法。
- 用户友好的诊断操作符 : Pig Latin 提供了一组诊断操作符,对测试和诊断脚本非常有帮助。描述、解释、转储和说明是支持的诊断运算符。它们有助于检查关系模式、显示结果和观察执行计划等任务。
- 支持结构化和非结构化数据:Pig 基于指定分隔符加载和处理数据的方式有助于处理异构数据。
了解了 Apache Pig 的功能,现在让我们看看它在现实世界中用于什么类型的任务。我们很清楚,优势来自于学习、开发和理解的便利性。因此,如果我们计划将 Apache Pig 集成到真实世界的大数据系统中,我们的目标应该是利用这一优势。可以使用阿帕奇猪,
- 探索大型数据集
- 对大型数据集运行即席查询以进行调试和探索
- 大型数据集的原型处理算法
- 加载和处理时间敏感数据集
我相信我通过这篇文章给了你足够的动力开始学习 Apache Pig。它将始终为您的大数据工具集增值。那你为什么不现在就开始呢?
卡方检验统计是每个数据科学家的必备工具:客户流失案例研究
分类变量假设检验的关键

介绍
卡方统计是理解两个分类变量之间关系的有用工具。
举例来说,假设你在一家推出新产品的科技公司工作,你想评估该产品和客户流失之间的关系。在数据、技术或其他领域的时代,许多公司都面临着获取证据的风险,这些证据要么是轶事,要么是高层次的可视化,以表明特定关系的确定性。卡方统计为我们提供了一种量化和评估一对给定分类变量的强度的方法。
客户流失
让我们从客户流失的角度来探讨卡方。
你可以从 kaggle 下载我们将要使用的客户流失数据集。该数据集提供了各种电信客户的详细信息,以及他们是否“搅动”或关闭了他们的帐户。
不管你在哪个公司、团队、产品或行业工作,下面的例子应该是非常通用的。
现在我们有了数据集,为了简单起见,让我们快速使用dplyr的select命令来下拉我们将使用的字段。为了简单起见,我还将把等级数减少到两级。您当然可以对两个以上级别的分类变量进行卡方检验,但是由于我们冒险从头开始理解它,我们将保持它的简单性。
churn <- churn %>%
select(customerID, StreamingTV, Churn)%>%
mutate(StreamingTV = ifelse(StreamingTV == 'Yes', 1, 0))
流失将被分为是或否。正如你刚才看到的,流媒体电视将被编码为 1 或 0。
探索性数据分析
在这里,我不会深入探讨探索性数据分析,但是我会给你两个快速的工具来评估两个分类变量之间的关系。
比例表
比例表是对两个范畴之间的关系建立一些基本理解的好方法
table(churn$StreamingTV)
table(churn$Churn)

round(prop.table(table(churn$StreamingTV)),2)
round(prop.table(table(churn$Churn)),2)

表格让我们快速了解任何给定级别的计数,在prop.table()中包装可以让我们看到百分比分解。
现在让我们将两个变量都传递给我们的table()函数
table(churn$StreamingTV, churn$Churn)
round(prop.table(table(churn$StreamingTV, churn$Churn),1),2)

一旦您将另一个变量传递到比例表中,您就能够建立您想要评估相对比例的位置。在这种情况下,我们传递给prop.table()函数的第二个参数是“1”,它指定我们希望看到每行记录的相对比例或StreamingTV的值。从上表中可以看出,如果客户没有流媒体电视,他们在 76%的时间里保持活跃,相反,如果他们有流媒体电视,他们在 70%的时间里保持活跃。
现在,在我们说流媒体电视肯定会导致更多人流失之前,我们需要评估一下我们是否真的有理由这样说。是的,回头客的比例较低,但差异可能是随机噪音。稍后会有更多内容。
是时候想象了
这将为我们提供与我们刚刚看到的类似的信息,但可视化往往有助于更好地快速理解相对价值。
让我们从一个快速条形图开始,图中的StreamingTV穿过 x 轴,填充为Churn。
churn %>%
ggplot(aes(x = StreamingTV, fill = Churn))+
geom_bar()

正如你所看到的,几乎一样多的电视流媒体播放量和低得多的客户总数。与我们在比例表中看到的类似,100%堆积条形图有助于评估分类变量的值之间的相对分布。我们要做的就是把position = 'fill'传给geom_bar()。
churn %>%
ggplot(aes(x = StreamingTV, fill = Churn))+
geom_bar(position = 'fill')

深入卡方统计
现在,这两个变量之间似乎存在某种关系,但我们还没有统计意义的评估。换句话说,是不是因为电视流媒体和客户之间的关系,也就是说,他们是否非常讨厌这项服务,以至于他们的流失率更高?作为流媒体计划的产品,他们的总账单是否显得过高,以至于他们都在一起搅动?
这些都是很好的问题,我们还没有答案,但我们正在做的是迈出第一步,评估这个更大的调查之旅是否值得。
卡方解释
在我们深入创建卡方统计之前,从概念上理解其目的是非常重要的。
我们可以看到两个看似相关的分类变量,但是我们并不确定这种完全不同的比例是随机的还是其他潜在影响的产物。这就是卡方的用处。在两个变量确实完全独立的情况下,卡方检验统计量实际上是我们的分布与我们预期的分布的比较。
首先,我们需要一个数据集来表示这种独立性。
生成我们的样本数据集
我们将使用infer包。这个包对于创建假设检验的样本数据、创建置信区间等非常有用。
我不会分解如何使用infer的所有细节,但是在高层次上,您正在创建一个新的数据集。在这种情况下,我们希望创建一个数据集,它看起来很像我们刚刚看到的客户流失数据集,只是这一次,我们希望确保独立分布,即在客户是电视流媒体的情况下,我们不会看到更大的客户流失。
思考推断的简单方法是遵循指定、假设和生成的步骤。我们指定我们正在建模的关系,我们输入预期的独立分布,最后我们指定我们想要生成的重复的数量。在这种情况下,复制将镜像原始数据集的行数。在有些情况下,您会创建同一数据集的多个副本,并在此基础上进行计算,但这不是流程的这一部分。
churn_perm <- churn %>%
specify(Churn ~ StreamingTV) %>%
hypothesize(null = "independence") %>%
generate(reps = 1, type = "permute")
让我们快速看一下这个数据集。
head(churn_perm)

如你所见,我们有两个指定的变量,还有replicate。该表中的所有记录都将是 replicate: 1,因为我们只进行了一次复制。
示例摘要
现在,让我们快速可视化我们的独立数据集,以可视化相对比例。
churn_perm %>%
ggplot(aes(x = StreamingTV, fill = Churn))+
geom_bar(position = 'fill')

如你所愿,你可以看到相对比例几乎完全一致。有一些随机性在起作用,所以我们可能不会看到这两者完美地排列在一起…但这确实是重点。我们还没有完全做到这一点,但是还记得我提到的创建许多副本的想法吗?
这样做的目的是什么?
如果我们多次创建这个样本数据集,我们是否会看到像我们在观察数据集中看到的那样有 70%到 76%的客户流失率?如果有,我们多久能看到一次?我们是否经常没有理由将这种差异归因于随机噪声之外的任何东西?
好了,说够了……接下来评估一下我们的观察数据与样本数据有多大差异。
让我们开始计算
现在我们真正理解了我们的目的,让我们继续计算我们的统计数据。简单地说,我们的目的是计算观察计数表中每个单元格与样本计数表中每个单元格之间的距离。

表示“距离”的公式如下所示:
sum(((obs - sample)^2)/sample)
- 我们从样本中减去观测值,
- 但是要使它们成正方形,这样它们就不会互相抵消。
- 我们将它们除以样本数以防止任何单个细胞由于其大小而出现过多,
- 最后我们算出总和。
我们得到的卡方统计是:20.1
太好了。我们理解卡方统计的目的,我们甚至有它…但是我们仍然不知道… 卡方统计 20.1 有意义吗?
假设检验
在这篇文章的前面,我们谈到了如何使用infer包来创建许多许多的副本。假设检验正是这种类型抽样的时机。
让我们再次使用infer,只是这次我们将生成 500 个重复&计算每组重复的卡方统计。
churn_null <- churn %>%
specify(Churn ~ StreamingTV) %>%
hypothesize(null = "independence") %>%
generate(reps = 500, type = "permute") %>%
calculate(stat = "Chisq")
churn_null

基于上面的输出,你可以看到每个replicate都有自己的stat。
让我们用一个密度图来看看卡方统计的分布情况。
churn_null %>%
ggplot(aes(x = stat)) +
geom_density()

乍一看,我们可以看到卡方统计的分布非常右偏。我们还可以看到,我们的统计值 20.1 甚至不在图上。
让我们添加一条垂直线来显示我们观察到的卡方与置换分布的比较。
churn_null %>%
ggplot(aes(x = stat)) +
geom_density() +
geom_vline(xintercept = obs_chi_sq, color = "red")

当谈到有足够的证据来拒绝零假设,这是有希望的。零假设是两个变量之间没有关系。
计算 P 值
作为本课关于如何使用卡方统计的最后一部分,我们来谈谈应该如何计算 p 值。
前面我提到了一个想法,我们可能想知道我们模拟的卡方统计量是否和我们观察到的卡方统计量一样大,如果是这样,它发生的频率是多少。
这就是 p 值的本质。
当对我们已知彼此独立的两个变量进行卡方统计时(模拟情况),这些重复的卡方统计大于或等于我们观察到的卡方统计的百分比是多少。
churn_null %>%
summarise(p_value = 2 * mean(stat >= obs_chi_sq))
在我们的示例中,我们的 p 值为 0。至于说在 500 次重复的过程中,我们从未超过 20.1 的卡方统计值。
因此,我们会拒绝无效假设,即流失和流媒体电视是独立的。
结论
我们在这么短的时间内做了很多事情。在剖析卡方统计等统计概念时,很容易迷失方向。我的希望是,对这种统计的需求和相应的计算有一个强有力的基础理解,有助于正确的直觉来识别使用这种工具的正确机会。
在短短几分钟内,我们已经了解了:
- 分类变量对的一点 EDA
- 比例表
- 条形图
- 百分比堆积条形图
- 卡方解释和目的
- 如何计算卡方统计量
- 推断假设检验
- 计算 p 值
如果这有帮助,请随时查看我在 datasciencelessons.com 的其他帖子。祝数据科学快乐!
CHIME-6 挑战回顾
在本文中,让我们讨论最近的语音分离和识别挑战的亮点以及获胜者使用的一些技巧。

Allec Gomes 在 Unsplash 上拍摄的照片
关于比赛
不久前,有一个名为 CHIME-6 的语音分离和识别挑战。自 2011 年以来一直举办编钟比赛。这些比赛的主要特点是,在日常家庭环境中同时在几个设备上录制的对话语音被用于训练和评估参与者的解决方案。
为比赛提供的数据是在四个参与者的“家庭聚会”期间记录的。这些派对同时在 32 个通道上录制(房间里的 6 个四通道微软 Kinects 个扬声器上的每个双通道麦克风)。
有 20 场派对,都持续了 2-3 个小时。组织者选择了其中一些进行测试:

表 1。数据已经被分成训练、开发测试和评估测试集
顺便说一下,这是在以前的 CHIME-5 挑战中使用的同一数据集。然而,组织者准备了几种技术来提高数据质量(参见 GitHub 上的软件基线的描述,章节“数组同步”和“语音增强”)。
要在这里了解更多关于比赛和数据准备的信息,请访问其 GitHub 页面或阅读关于 Arxiv.org 的概述。
今年有两条赛道:
轨迹 1 —多阵列语音识别;
轨迹二 —多数组二值化与识别。
每首曲目都有两个独立的排名类别:
排名 A —基于传统声学建模和官方语言建模的系统;
B 级 —所有其他系统,包括基于端到端 ASR 基线的系统或其词典和/或语言模型已被修改的系统。
组织者为参与提供了一个基线,其中包括一个基于 Kaldi 语音识别工具包的管道。
评估参与者的主要标准是语音识别指标——单词错误率(WER)。对于第二个轨迹,使用了两个额外的指标——二化错误率(DER)和 Jaccard 错误率(JER ),这允许评估二化任务的质量:
在下表中,您可以看到比赛结果:

表二。赛道 1,排位а(左),排位 B(右)

表 3。赛道 2,排位а(左),排位 B(右)
你可以访问 GitHub 上的论文链接。
这里有一些我想讨论的关于挑战的好奇的事情:不希望你错过任何东西!
挑战亮点
研究型参与
在之前的 CHiME-5 挑战赛中,在赛道 2 中排名第四的帕德博恩大学团队专注于一项名为导向源分离 (GSS)的语音增强技术。CHiME-5 竞赛的结果表明,该技术改进了其他解决方案。
今年,主办方在声音改进部分正式将引用到 GSS,并将这一技术纳入第一首曲目的基线。
这就是为什么许多参与者,包括所有的领跑者,使用 GSS 或类似的受此启发的改进。
它是如何工作的:你需要构建一个空间混合模型(SMM),它允许确定说话者的时间-频率掩码(即,给定说话者在什么频率和什么时间说话)。使用 EM 算法执行训练,将说话者的临时注释作为初始化。

图一。空间混合模型
然后,该块被集成到通用语音增强管道中。该管道包括去混响技术(即,从信号中消除回声效应,当声音从墙壁反射时会出现回声效应)和波束形成(即,从几个音轨生成单个信号)。
由于没有第二音轨的说话者注释,语音识别对齐(所说短语的时间戳)被用来初始化用于训练 SMM 的 EM 算法。

图二。语音增强方案
你可以在日立和帕德博恩大学团队在 Arxiv 上的论文中阅读更多关于该技术及其实施结果的信息,或者看看他们的幻灯片。
为自己解决
在路线 1 中排名第一、在路线 2 中排名第三的中国科技大学团队改进了他们在 CHIME-5 挑战赛中展示的解决方案。这是赢得 CHIME-5 比赛的同一支队伍。然而,其他参与者没有使用他们的解决方案中描述的技术。
受 GSS 思想的启发,中国科技大学实现了其改进的语音增强算法——IBF-SS。
你可以在他们的论文中找到更多。
基线改善
在基线中有几个明显的弱点,组织者没有费心去隐藏:例如,只使用一个音频通道来建立二进制化,或者缺乏通过语言模型对排名 b 的重新评分。在基线脚本中,您还可以找到改进的提示(例如,添加来自 CHIME-6 数据的噪声增强来建立 x 向量)。
JHU 团队的解决方案完全消除了所有这些弱点:没有全新的超高效技术,但参与者检查了基线的所有问题领域。在赛道 2,他们排名第二。
他们在管道的每个阶段探索了多阵列处理技术,例如用于增强的多阵列 GSS,用于语音活动检测的后验融合,用于二化的 PLDA 分数融合,以及用于 ASR 的点阵组合。上面描述了 GSS 技术。根据 JHU 的研究,一种足够好的融合技术是简单的最大值函数。
此外,他们还集成了在线多通道 WPE 去混响和基于 VB-HMM 的重叠分配等技术,以分别应对背景噪声和重叠扬声器等挑战。
关于 JHU 解决方案的更详细的描述可以在他们的论文中找到。
路线 2 赢家:有趣的把戏
我想强调一下第二站比赛的获胜者 ITMO (STC)团队使用的一些技巧:
WRN x 向量
x 向量是说话人嵌入,即包含说话人信息的向量。这种矢量用于说话人识别任务。WRN x-vectors 是通过使用 ResNet 架构和一些其他技巧对 x-vectors 的改进。它大大降低了 DER,以至于这项技术本身就足以让团队赢得比赛。
你可以在 ITMO 团队的论文中读到更多关于 WRN x 向量的信息。
余弦相似度和频谱聚类,自动选择二值化阈值
默认情况下,卡尔迪二化管道包括从音频中提取 x 向量,计算 PLDA 分数,并使用凝聚层次聚类(AHC)对音频进行聚类。
现在来看一下用来建立说话者矢量之间距离的 PLDA 分量。PLDA 在计算 I 向量的距离时有数学依据。简而言之,它依赖于 I 向量包含关于说话者和通道的信息的事实,并且当聚类时,对我们来说唯一重要的是说话者信息。它对 X 向量也很有效。
然而,使用余弦相似性而不是 PLDA 分数和自动选择阈值的谱聚类而不是 AHC,使得 ITMO 团队在二分化方面取得了另一项重大改进。
要了解更多关于自动选择二值化阈值的谱聚类,请阅读这篇关于 Arxiv.org 的论文。
TS-VAD
作者在他们的工作中特别关注这项技术。TS-VAD 是一种新颖的方法,它预测每个说话者在每个时间帧上的活动。TS-VAD 模型使用声学特征(例如,MFCC)以及每个说话者的 I 向量作为输入。TS-VAD 提供两种版本:单通道和多通道。该模型的架构如下所示。

图三。TS-VAD 方案
注意,这个网络是为四个参与者的对话量身定制的,这其实是这个挑战的要求所规定的。
单通道 TS-VAD 模型被设计为同时预测所有说话者的语音概率。使用二进制交叉熵之和作为损失函数来训练具有四个输出层的该模型。作者还发现,有必要通过相同的说话人检测(SD) 2 层 BLSTMP 来处理每个说话人,然后通过另一个 BLSTMP 层来组合所有说话人的 SD 输出。
TS-VAD 的单通道版本单独处理每个通道。为了联合处理单独的 Kinect 通道,作者研究了多通道 TS-VAD 模型,该模型使用单个 TS-VAD 模型的 SD 块输出的组合作为输入。每个说话者的所有 SD 向量通过 1-d 卷积层,然后通过简单的注意机制进行组合。所有说话者注意力的组合输出通过单个 BLSTM 层传递,并转换成每个说话者在场/不在场的一组帧概率。
最后,为了提高整体二化性能,ITMO 团队通过计算概率流的加权平均值,融合了几个单通道和多通道 TS-VAD 模型。
你可以在 Arxiv.org 上了解更多关于 TS-VAD 模型的信息。
结论
我希望这篇评论有助于您更好地了解 CHiME-6 挑战。如果你决定参加即将到来的比赛,也许你会发现我提到的提示和技巧很有用。如果我错过了什么,你可以随意伸手!
病毒生命的循环
论跨物种传播中的遗传相似性
这个帖子是我的专业帖子的缩短版。

新型冠状病毒结构上人类和非人类动物的插图(作者绘制)
在我进入基因研究世界的旅程中,我发现病毒令人着迷,甚至在某种意义上令人鼓舞。这是因为它们的内部结构复杂地适应于产生新的突变,因为它们通过多种不同的途径传播给生物(宿主):空气传播、水传播、鸟类迁徙、粪便传播等等。令人鼓舞的是,当病毒基因的突变使它们能够随着多年来调整生存技能而变得复杂时,进化的本质就显现出来了。我了解到病毒不仅仅是一堆分子,实际上是一种被称为病毒学的独特类型的粒子,只有在生物学、物理学、地理学,甚至气候学和经济学的多学科背景下才能真正理解(想想病毒有多大的威力,它们能导致全面封锁)。
病毒转移是病毒在不同宿主物种间传播的途径。动物到人类的病毒传播被称为人畜共患病。动物传染病可以在任何接触或食用动物、动物产品或动物衍生物的环境中传播。以下模式可能会给你一点提示:食物和水、农业、牧场、畜牧业、宠物、狩猎、活的动物市场等。这只是对实际情况的一瞥…
在这项研究的框架内,我重点研究了两个家族的四种病毒:冠状病毒科 ( MERS 和新型冠状病毒病毒)和正粘病毒科(甲型流感: H1N1 和 H3N2 病毒),并发现了与我处理的问题最匹配的下一个主题:
- 显示了被诊断患有甲型流感和冠状病毒的宿主的多样性
- 根据病毒 DNA 和蛋白质序列,检查宿主——人类和非人类动物——之间的遗传相似性
- 探索病毒传播的动态行为
在钻研算术(这是最容易的部分……)之前,我想分享一下我个人的担忧:我担心我们作为一个国家,以及我们对世界范围内流行病造成的医疗紧急情况的反应。为什么公众仍然遭受像正在进行的新型冠状病毒这样的流行病,尽管它不是一种“全新”的病毒(只是冠状病毒家族中以前病毒的一种变异)?是因为我们还没有找到预防传播的方法吗?我来提醒你以下之前的疫情事件。一次突出的流行发生在 1918 年,当时甲型流感在智人中流行(第一例发现于 1902 年在 Gallus)。更重要的是,冠状病毒家族的病毒也是“古老”的,最初是在 1941 年从鸟类身上收集到的,在 1952 年从猪身上收集到的,最近是在 2003 年在中国智人身上收集到的。这种病毒被称为 S ARS (并且仍然活跃)。2008 年在沙特阿拉伯收集了一种类似的病毒结构,称为 M ERS,它涉及大量骆驼中的疾病。
一方面,似乎 21 世纪的人类在每个可以想象的领域都开发了技术,以应对几乎每个挑战:从金属工具到登月和人工智能。有时感觉好像人类的创造力是无限的。然而,另一方面,我们仍然依赖于保守的,甚至极端的方法,如全面封闭和强制佩戴不透气的口罩(有没有人想到开发一种可以自由呼吸的口罩?…).底线是,这些“现成的”解决方案是不充分的,在我看来是荒谬的。这意味着我们没有做好准备,尽管所有的红色信号和迹象都很明显。
在这些最困难的时期,来自不同背景的科学家团队聚集在一起,通过开发疫苗、药物和大规模数据科学项目等解决方案来“反击”和“拯救世界”,以估计疫情的“轨迹”。但是,我很怀疑这些英雄是不是把大家的命都记在心里了。当我说“每个人”时,我也指非人类的动物,例如:骆驼、猪、鸟类和所有我们人类为了自己的需要(食物、衣服、劳动、娱乐等等)而饲养、照料和繁殖的生物。我个人的愿望是所有的动物都应该自由。在那之前,我们至少应该学会如何避免病毒在他们的同类和我们的同类之间传播。
所有生物的基因“机制”是作为一个病毒系统运行的吗?就病毒结构的重建和蛋白质的生成而言,宿主之间的不变量是什么?所有这些问题都让我探索了多种宿主物种之间的遗传相似性。
原来这篇文章不是关于一种新的机器学习技术,而是一种独特的研究和视角。然而,我假设你对神经网络、降维、大数据分析和生物学有一些基本的了解。如果生物学部分你还不清楚,我推荐阅读我博客中的文献综述部分:研究新冠肺炎的遗传学,如果你不熟悉遗传数据上的神经网络,访问我的博客:弥合遗传学和神经网络之间的鸿沟对你来说将是一个很好的开始。
数据表示
为了执行大规模的机器学习实验,我在国家生物技术信息中心 NCBI 收集了由尽可能多的宿主物种组成的公开可用的病毒数据(如果你不熟悉 NCBI ,请阅读我的博客:破解病毒的遗传)。
在对数据进行任何计算之前,我选择了一些关于病毒的详细信息。我根据与每个基因样本共同收集的额外部分,绘制了流行病的规模和比例,没有任何数据处理。这些图显示了每种病毒的地理位置和宿主物种流行率,归一化并乘以 100。可以看出,除了首次从猪身上收集到的 H1N1 病毒外,智人是所有病毒中第一个被诊断出的。蝙蝠是冠状病毒家族中第二个被确诊的。骆驼是 2016 年受 MERS 病毒影响最大的物种,而灵猫在 2006 年排名第一,欧洲水貂在 2020 年追平了被诊断患有新型冠状病毒的智人数量。至于地理位置,H3N2 首先在亚洲收集,其次在南非收集,而 H1N1 在 2009 年涉及所有检查的位置。第五张图集中在亚洲,以区分病毒最初分离的地点。请注意,禽类和猪在遭受甲型流感时对人类群体免疫的贡献在两种病毒中都得到了很好的证明。
结果
对于每个病毒家族,在 DNA 或蛋白质类型的序列上测试了两个实验。当考虑 DNA 样本时,该模型对甲型流感的准确率达到 98.4%,对冠状病毒的准确率达到 92.2%,而当处理蛋白质时,对两种病毒的准确率几乎都达到 100%。注意,我检查了两种规模的测试数据集。结果表明,样本越多,性能越好,这可能是因为在这种情况下数据的多样性更高。
训练和验证损失的行为是正确的,既不过度拟合也不欠拟合,这意味着在训练期间,验证损失低于训练损失。这方面的另一个观察结果是冠状病毒蛋白质实验中的学习率行为,其中需要少量的时期来概括数据(在大约 250 个时期之后,验证停止下降并达到其最大准确度)。
讨论
我认为在这个框架中值得一提的结论首先是在技术方面:已经实现的高精度意味着宿主物种之间的 DNA 和蛋白质序列差异相似,错误分类误差高达 8%。此外,如果使用神经网络和大致相同的序列长度(这在大多数病毒家族中成立),则无需使用比对工具。这是个好消息,因为在很多情况下“少即是多”。第二,本研究探讨了传播因素,并强调当(和如果)我们处理非人类动物时需要谨慎和卫生。动物农业中常见的高密度和恶劣的卫生条件可能需要重新考虑。此外,不必要的接触,比如将动物用于娱乐目的,比如骆驼摔跤(在阿拉伯文化中广泛传播)和“教育”目的,比如抚摸动物园(向公众展示如何强迫一个生物在没有自由的情况下生活在笼子里,没有任何教育意义)。
改变我们与非人类动物互动的方式,除了本文所讨论的病毒疾病的传播之外,还可能带来实质性的道德和环境益处。
无论如何,我对进一步研究的建议是,研究食用经诊断患有冠状病毒的动物产品可能对人体产生的影响,例如:未经巴氏消毒的牛奶或生肉。另一个可能出现的问题是,如何重新设计我们对待农场动物的方式,并重新审视如何在牛舍、猪圈或鸡舍中饲养和对待动物。
封闭
多亏了技术,世界变得更美好了。如今,比以往任何时候都有更多的人分享幸福——是时候让其他物种也体验幸福或至少类似的东西了。正如一位佛教祈祷者所说:“愿所有有情众生免于苦难及其根源”。
结束
亲爱的读者,我很高兴你能读到(或听到)这些。如果您有任何想法,我将不胜感激,非常欢迎您通过 Linkedin 或电子邮件(miritrope@gmail)与我交流。
病毒生命的循环
论跨物种传播中的遗传相似性

新型冠状病毒结构上人类和非人类动物的插图(作者绘制)
在我进入基因研究世界的旅程中,我发现病毒令人着迷,甚至在某种意义上令人鼓舞。这是因为它们的内部结构复杂地适应于产生新的突变,因为它们通过多种不同的途径传播给生物(宿主):空气传播、水传播、鸟类迁徙、粪便传播等等。令人鼓舞的是,当病毒基因的突变使它们能够随着多年来调整生存技能而变得复杂时,进化的本质就显现出来了。我了解到病毒不仅仅是一堆分子,实际上是一种独特类型的粒子,名为病毒学,只有在生物学、物理学、地理学,甚至气候学和经济学的多学科背景下才能真正理解(想想病毒有多大的力量,它们可以导致全面封锁)。
病毒转移是病毒在不同宿主物种间传播的途径。动物到人类的病毒传播被称为人畜共患病。动物传染病可以在任何接触或食用动物、动物产品或动物衍生物的环境中传播。以下模式可能会给你一点提示:食物和水、农业、牧场、畜牧业、宠物、狩猎、活的动物市场等。这些只是对实际发生的事情的一个小小的了解…
在这项研究的框架内,我重点研究了两个家族的四种病毒:冠状病毒科 ( MERS 和新型冠状病毒病毒)和正粘病毒科(甲型流感: H1N1 和 H3N2 病毒),并发现了与我处理的问题最匹配的下一个主题:
- 显示了被诊断患有甲型流感和冠状病毒的宿主的多样性
- 根据病毒 DNA 和蛋白质序列,检查宿主——人类和非人类动物——之间的遗传相似性
- 探索病毒传播的动态行为
在钻研算术(这是最容易的部分……)之前,我想分享一下我个人的担忧:我担心我们作为一个国家,以及我们对世界范围内流行病造成的医疗紧急情况的反应。为什么公众仍然遭受像正在进行的新型冠状病毒这样的流行病,尽管它不是一种“全新”的病毒(只是冠状病毒家族中以前病毒的一种变异)?是因为我们还没有找到预防传播的方法吗?我来提醒你以下之前的疫情事件。一次突出的流行发生在 1918 年,当时甲型流感在智人中流行(第一例发现于 1902 年在 Gallus)。冠状病毒家族的病毒也很“古老”,1941 年、1952 年首次从鸟类身上收集到,最近于 2003 年(在中国)从人类身上收集到。这种病毒就是众所周知的 SARS (并且仍然活跃)。2008 年在沙特阿拉伯收集到了一种类似的病毒结构,称为 MERS,这涉及到大量骆驼出现这种疾病。关于病毒遗传序列的地理位置和宿主物种的更多细节显示在下面的图表部分。
一方面,似乎 21 世纪的人类在每个可以想象的领域都开发了技术,以应对几乎每个挑战:从金属工具到登月和人工智能。有时感觉好像人类的创造力是无限的。然而,另一方面,我们仍然依赖于保守的,甚至极端的方法,如全面封闭和强制佩戴不透气的口罩(有没有人想到开发一种可以自由呼吸的口罩?…).底线是,这些“现成的”解决方案是不充分的,在我看来是荒谬的。这意味着我们没有做好准备,尽管所有的红色信号和迹象都很明显。
在这些最困难的时期,来自不同背景的科学家团队聚集在一起,通过开发疫苗、药物和大规模数据科学项目等解决方案来“反击”和“拯救世界”,以估计疫情的“轨迹”。但是,我很怀疑这些英雄是不是把大家的命都记在心里了。当我说“每个人”时,我也指非人类动物,如骆驼、猪、鸟类和所有我们人类为了自己的需要(食物、衣服、劳动、娱乐等)而饲养、照料和繁殖的生物。我个人的愿望是所有的动物都应该自由。在那之前,我们至少应该学会如何避免病毒在他们的同类和我们的同类之间传播。
所有生物的基因“机制”是作为一个病毒系统运行的吗?就病毒结构的重建和蛋白质的生成而言,宿主之间的不变量是什么?所有这些问题都让我探索了多种宿主物种之间的遗传相似性。
原来这篇文章不是关于一种新的机器学习技术,而是一种独特的研究和视角。然而,我假设你对神经网络、降维、大数据分析和生物学有一些基本的了解。如果生物学部分你还不清楚,我推荐阅读我博客中的文献综述部分:研究新冠肺炎的遗传学,如果你不熟悉遗传数据上的神经网络,访问我的博客:弥合遗传学和神经网络之间的鸿沟对你来说将是一个很好的开始。
数据表示
为了执行大规模的机器学习实验,我在国家生物技术信息中心 NCBI 收集了由尽可能多的宿主物种组成的公开可用的病毒数据(如果你不熟悉 NCBI ,请阅读我的博客:破解病毒的遗传)。
在对数据进行任何计算之前,我选择了一些关于病毒的详细信息。我根据与每个基因样本共同收集的额外部分,绘制了流行病的规模和比例,没有任何数据处理。这些图显示了每种病毒的地理位置和宿主物种流行率,归一化并乘以 100。可以看出,除了首次从猪身上收集到的 H1N1 病毒外,智人是所有病毒中第一个被诊断出的。蝙蝠是冠状病毒家族中第二个被确诊的。骆驼是 2016 年受 MERS 病毒影响最大的物种,而灵猫在 2006 年排名第一,欧洲水貂在 2020 年追平了被诊断患有新型冠状病毒的智人数量。至于地理位置,H3N2 首先在亚洲收集,其次在南非收集,而 H1N1 在 2009 年涉及所有检查的位置。第五张图集中在亚洲,以区分病毒最初分离的地点。请注意,禽类和猪在遭受甲型流感时对人类群体免疫的贡献在两种病毒中都得到了很好的证明。





下表显示了按地理位置和主机提取和检查的类别:


基因序列上的长度
我们如何证明一个基因序列在不同的宿主物种中是相似的?我首先进行了一个简单的实验,对不同病毒家族的基因序列进行了分类。经过进一步的考虑,我意识到不考虑序列的长度来比较序列是有误导性的。这可能是为什么在进行任何序列比较之前,序列比对通常是生物信息学的第一步。然而,我想在不对齐序列的情况下检查神经网络的性能(这可能是该实验独特的原因之一),同时使用大约相同的序列长度(ε约为+/- 10%,并用零填充缺失数据以完成全尺寸矩阵)。为了适应这些限制,我选择在每个实验中对同一家族的两种病毒进行分类(进行二元分类),这些实验包含尽可能多的宿主物种多样性。下表总结了一些宿主物种在 NCBI 中的可用蛋白质序列。请注意,平均长度是根据不同类型的蛋白质计算的。然而,在我的实验中,我为每个样本收集了相同类型的蛋白质。为了在每次实验中保持相同水平的宿主多样性,当一组中的宿主数量超过允许值时,我会过滤掉宿主样本。

重组基因序列
回到理论上。病毒在宿主体内产生蛋白质,但不同物种的蛋白质如何排列才能进行比较?通过重组蛋白质。事实上,我发现这部分非常令人兴奋,因为人们可以创造出自然界中不存在的蛋白质序列。术语“重组蛋白质”代表产生一长串连接蛋白质(链)的过程。每个蛋白质链都是输入数据集的样本,由病毒标记(用于监督学习)。链类似于 DNA 序列,但有蛋白质。具体来说,对于冠状病毒,我选择比较常见的蛋白质名称:刺突、包膜、膜、核衣壳、ORF1ab 和 ORF1a 多蛋白,而对于甲型流感,我选择比较聚合酶、核衣壳、神经氨酸酶、血凝素、基质和核输出。
下一个代码片段展示了如何生成蛋白质链。该代码只是以重复的顺序“缝合”每个样本中的每种蛋白质。因此,蛋白质链在每个样品中以相同的顺序排列。根据所有样本的最大链长,所有其他样本在其边缘(末端)被零填充。
在我的实验中,这些是最大和最小的重组序列长度。请注意,由于上面讨论的类似原因,每个样本中都包含相同的蛋白质。

数学定义
- 设 Sn 为序列样本。
- 样本 Sn 根据其蛋白质是非人类或人类。蛋白质可以是人类或非人类来源的。
- 每个重新设计的序列样本都是蛋白质的串联(一条链)。每种蛋白质类型 Pn 必须准确包含一次,以便集合一个样本。

架构

使用神经网络的病毒分类:病毒结构(右),基因序列(左)——由作者绘制
架构非常简单。两个完全连接的层之后是一个 softmax 层。关于网络的详细解释可以在我的博客中找到(我这里使用的模型是改进的模型)。我分割数据的方式是具有挑战性的部分,源于我试图在这篇文章的框架内解决的主要问题,即:宿主之间的相似性——人类与非人类的比较。由于每个样本都标有病毒索引,因此需要将人类和非人类样本分成不同的类别,以便测试数据揭示模型已经学习到的相似性。如果模型达到高准确度,则宿主(人类和非人类样本)之间具有高相似性。
回到数学定义:如果 Sn 的蛋白质来自非人类物种,它就在训练集中。否则(人类),Sn 在测试集中。
这些是我应用的方法的主要技术细节。这篇文章的其余部分给出了结果和结论。
结果
对于每个病毒家族,在 DNA 或蛋白质类型的序列上测试了两个实验。下表显示了每个实验的精确度。当考虑 DNA 样本时,该模型对甲型流感的准确率达到 98.4%,对冠状病毒的准确率达到 92.2%,而当处理蛋白质时,对两种病毒的准确率几乎都达到 100%。注意,我检查了两种规模的测试数据集。结果表明,样本越多,性能越好,这可能是因为在这种情况下数据的多样性更高。

培训和验证损失可以在下图中看到。这种行为是正确的,既不过度拟合也不欠拟合,这意味着在训练期间,验证损失低于训练损失。这方面的另一个观察结果是冠状病毒蛋白质实验中的学习率行为(右下),其中需要少量的时期来概括数据(在大约 250 个时期之后,验证停止下降并达到其最大准确度)。



讨论
我认为在这个框架中值得一提的结论首先是在技术方面:已经实现的高准确性意味着宿主物种之间的 DNA 和蛋白质序列差异相似,高达 8%的错误分类误差。此外,如果使用神经网络和大致相同的序列长度(这在大多数病毒家族中都是如此),则没有必要使用比对工具。这是个好消息,因为在很多情况下“少即是多”。第二,在这项研究中探索了传播因素,并强调当(如果)我们处理非人类动物时,需要谨慎和卫生。畜牧业中常见的高密度和恶劣的卫生条件可能需要重新考虑。此外,不必要的接触,如出于娱乐目的使用动物,如骆驼摔跤(在阿拉伯文化中广泛传播),以及“教育”目的,如抚摸动物园(向公众展示如何强迫一个活着的生物生活在没有自由的笼子里,这没有任何教育意义)。
除了本文讨论的病毒性疾病的传播之外,改变我们与非人类动物的互动方式可能会带来实质性的道德和环境利益。
无论如何,我对进一步研究的建议是研究食用来自被诊断患有冠状病毒的动物的产品可能会对人体产生怎样的影响,例如:未经高温消毒的牛奶或生肉。另一个可能出现的问题是如何重新设计我们对待农场动物的方式,并重新检查动物在牛棚、猪圈或鸡舍中是如何被饲养和对待的。
附录
- 病毒家族的分类
正如我上面所讨论的,首先我对病毒家族进行了分类。这个实验是一个关键因素,它让我在进行基因分类测试时理解了序列长度的重要性。来自不同病毒家族的训练序列可能误导网络得出不同的结论,从而错过整个研究。我从这个实验中得到的教训是,通过找到可比较的数据来关注你的研究问题,然后测试你的模型。然而,结果达到了很高的精度(误导…),并且可以在下面的损失函数中看到。


- 冠状病毒——宿主物种的多样性
下表列出了其他冠状病毒宿主物种及其序列信息。注意物种多样性:一场流行病可以影响几乎所有的物种。然而,在我的实验中,我倾向于不使用这些物种的序列,因为它们的序列数量不足以进行大规模实验。

- 病毒学诊断方法
基因样本可以通过多种方法收集,例如,冠状病毒的常见方法是通过粪便和口咽 ( 鼻子后面的咽喉上部)。下表显示了每台主机的样本数量,按诊断测试分类。请注意,拭子测试在人类中普遍使用,可能是因为它是一种更昂贵的测试(拭子不能重复使用)。

关闭
由于科技的发展,世界变得更加美好。如今,比以往任何时候都有更多的人分享快乐——是时候让其他物种也体验快乐,或者至少是类似的快乐了。正如一句佛言:“愿一切众生皆无苦及其因”。
医疗索赔提交渠道
医疗索赔数据集及其应用
医疗索赔数据很复杂,就像美国医疗保健系统的大部分一样。但这仅仅意味着以有用的方式利用这个重要数据集的机会更大。这一扩展系列的文章将帮助那些初次使用医疗索赔数据集的人理解这些数据集——许多字段意味着什么,它们包含什么信息,以及使用它们可以回答什么样的有趣问题以及如何回答。

医疗索赔数据从何而来
医疗索赔数据集是漫长过程中的最后一步。出于以下几个原因,理解这个过程(我们称之为“索赔提交管道”)会有所帮助:
- 数据完整性:像所有数据集一样,医疗保健索赔数据包含错误和不准确之处。了解这些错误可能进入数据的位置有助于诊断和修复它们。此外,有时看起来错误的数据可能是欺诈或其他不法行为的标志,了解索赔提交渠道有助于区分有意和无意的数据完整性差距。
- 了解数据:医疗索赔数据中嵌入了许多约定,并且使用这些约定可以找出许多竞争激励。了解这些规则有助于您理解为什么您的数据看起来是这样。列出那些“不成文的规则”是我写这个系列的部分原因。
- 应用:您从数据中获得的见解将有望被用于改善医疗保健系统。索赔提交管道推动了对提供者的财务支付(以及保险公司/支付者的成本),因此索赔提交管道可以是整个医疗保健系统的一个很好的汇总视图(“在分析医疗索赔数据时,跟随资金”是一个很好的建议)。
索赔提交渠道
步骤 1)临床事件
医疗编码从护理时开始,记录在病历中。这个基于文本的文档是理解临床事件的真实来源。这些记录被转换成索赔表,进而成为医疗索赔数据。
了解一下病历中包含的信息类型:国家质量保证委员会(NCQA)是医生和健康保险公司的独立认证组织。NCQA 为提供医疗记录文档的以下 6 个核心组成部分:
- 列出了重大疾病和医疗条件
- 药物过敏和不良反应显著(或不存在)
- 复发患者的既往病史很容易识别,包括严重事故、手术和疾病。
- 与调查结果一致的诊断
- 与诊断相符的治疗计划
- 没有证据表明某项手术会给患者带来不适当的风险
病历本身在历史上并不是数据分析的对象,因为它是以书面形式存储的(不容易数字化)并且是基于文本的(更难分析),然而随着近年来光学字符识别和自然语言处理工具的增强,病历被证明是非常有用的分析数据。目前
第 2 步)提交索赔
医疗编码员是医疗保健专业人员,他们将病历中包含的信息转换成标准化的形式,这些形式成为医疗索赔数据集的基础。
有两种主要的索赔表,CMS-1500 和 UB-04。CMS-1500 索赔表由用于对个人医生服务进行计费,而 UB-04 用于对设施服务进行计费——CMS-1500 描述为由个人使用,UB-04 由建筑/机构使用。
对于标准的医院就诊,需要提交 2 份索赔表——一份由就诊期间提供护理的医生提交的 CMS-1500,一份由提供设备、实验室/放射服务等的机构提交的 UB-04。
有时这些形式只是被称为“CMS”和“UB”。CMS 表格也被称为“HCFA”——CMS 代表“医疗保险和医疗补助服务中心”,这是一个联邦机构,过去被称为“医疗保健金融管理局”。
现在几乎所有的索赔都以电子方式提交——837-P 和 837-I 表格分别是 CMS-1500 和 UB-04 的电子版本(“P”和“I”代表“专业”和“机构”)。
医疗编码员通常是有资格证书的。三种最常见的证书是认证专业编码员(CPC)、认证编码专家(CCS)和认证医疗编码员(CMC)证书。CPC 和 CMC 认证最常见于在医生办公室或门诊诊所工作的编码员,而 CCS 认证则常见于在住院环境中工作的编码员。
AAPC(美国专业编码员学会)和 AHIMA(美国健康信息管理协会)提供了许多专门的编码认证。目前没有要求提交医疗索赔的个人必须经过认证,但是医疗编码的雇主经常要求这样做。
步骤 3)索赔裁决
提供者将填好的索赔表(837 文件)发送给患者承保的任何付款人。“付款人”是为患者提供保险的任何实体(他们为患者“支付”部分或全部医疗费用)。这可以是商业健康计划、Medicare 或 Medicaid,包括由商业保险公司代表 Medicare 和 Medicaid 运营的 Medicare Advantage 和 Medicaid 管理式护理计划(美国的付款人组织类型将在以后的文章中讨论)。
每种付款人都有处理索赔的规则。付款人的索赔处理是这些规则的复杂接口。我们将在以后的文章中更详细地介绍这个领域,因为在最初的编码之后,这是索赔管道中最活跃的步骤。目前,请注意付款人在索赔处理过程中将考虑以下事项:
- 承保福利 —大多数付款人不包括医疗上不必要的服务,如整容手术或“标签外”治疗或处方。有时这些规则因州而异——例如,19 个州规定生育治疗必须包含在福利范围内。
- 正确编码 —付款人将审查提交的索赔,以确保正确使用编码。例如,一些诊断代码在任何情况下都不允许用作主要诊断(如果这些术语还不太有意义,请不要担心,我们将在那里进行更详细的讨论)。付款人也可以要求医疗记录,并验证它支持索赔上的编码。
- 提供商合同和报销政策 —付款人与许多提供商(称为“网络内”、“参与式”或“平价”提供商)签订合同,规定付款人将提供哪些服务作为服务报销。没有与付款人签订合同的提供者被称为“网络外”、“非参与”或“非平价”提供者——虽然没有签订合同,但付款人有关于如何向这些提供者报销的规定。
- 预先授权 —一些医疗程序要求支付者在提供护理前预先批准。付款人将验证此预先批准已被给予。
- 利益协调/代位求偿权 —如果一名患者投保了两份健康保险,则有规则规定哪份保险支付哪笔费用(称为“利益协调”)。由另一种类型的保险单(如汽车或工人赔偿保险单)承保的事故或伤害引起的医疗费用在大多数情况下不属于可报销的医疗保险费用(称为“代位求偿”)。
- 欺诈 —医疗欺诈是一个重大问题,付款人努力确保欺诈提供者不会得到补偿。欺诈性计费行为的例子包括为未提供的服务计费、伪造医疗记录文档以及收取异常高的费用。
提供者有权对其在索赔处理过程中做出的决定提出上诉。因此,索赔处理可能是一个反复的过程:提供者可能提交索赔,支付者要求医疗记录,支付者由于医疗记录文档不充分而拒绝索赔的一部分(称为“行项目拒绝”,因为只有索赔的某些“行”被拒绝,而不是全部索赔),提供者对拒绝提出上诉并提供修改的医疗记录文档,支付者在上诉时推翻拒绝并偿还全部索赔。
步骤 4) 索赔数据库
索赔处理系统将向索赔数据库提供数据文件,该数据库将储存历史索赔数据,以供今后分析。索赔处理系统发送的数据将包括索赔表上的所有信息,还包括许多其他项目,包括:
- 成员信息 —索赔表包括成员的姓名和保单 ID 号,但付款人还维护成员的其他信息,包括人口统计信息(年龄/性别)、保单/产品类型和雇主。这些额外的数据将以一种易于连接到索赔数据的方式存储在索赔数据库中。
- 提供商信息 —与会员信息类似,提供商的标识符(税务 ID/TIN、国家提供商标识符/NPI)在报销申请中提供,但付款人保留其他信息,如实践小组名称、专业和证书状态(如 MD、DO、LCSW 等。).
- 代码描述表 —医疗索赔表上使用的代码(CPT、修改者、ICD-10 CM/PCS、DRG、收入代码等)。)本身并不总是容易分析的,因此索赔数据库通常包括映射表,这些表将相似类型的代码组合在一起并提供有用的定义。例如,CPT 描述表可能将用于麻醉服务的 00100 和 02020 之间的约 320 个 CPT 代码组合在一起。
- 索赔处理信息 —处理系统可能会传递有关它为何以这种方式处理索赔的信息。例如,此代码字段可能指示“由于临床文件不足而被拒绝”,或“非 par 报销 CMS 的 150%”。
第五步)分析
这是您(这组文章的目标读者)开始享受乐趣的地方:您从索赔数据库中提取数据并开始分析它。了解这些数据是如何进入数据库的,是确保分析能够被用来使美国卫生系统更好地工作的关键。
请在下面留下任何问题、对新主题的要求或其他评论——我期待着您的来信!
云:让谷歌云平台变得简单
云是一个复杂的空间。这并不像大多数人想象的那样简单。让我们简化云:GCP 版。

云是一个复杂的空间。这并不像大多数人想象的那样简单。我们有来自不同背景的人,如开发人员、网络工程师、机器学习工程师、数据架构师等。谁将掌握云的某些组件。
当在企业环境中工作时,专家在各种相关的组件上工作,并且每个人在数据和模型管道生命周期中都有自己的位置,这一点很关键。这可能包括以下角色:
- 安全:身份处理和访问管理(IAM)
- 数据架构:了解各种云服务之间的交互,深入了解本地服务&需求
- 模型运营:亲自了解云上的 IaaS、PaaS、SaaS 特性;管道自动化、优化、部署、监控和扩展
- 基础设施:各种项目和产品的动态需求,以最小化公司的成本以及应用的灵活性
- 支持:利用专业人员提供的端到端云平台知识来节省调试时间(了解多于学习)
上述技能的健康组合可以成功地从遗留系统迁移到云环境。

GCP 的数据生命周期
谷歌涉足互联网游戏已经有很长时间了。一路走来,他们打造了多个伟大的产品。当你的努力是实验性的而不是流线型的,首先,它在产品组合中变得明显。
相同的工作流可以通过多种方式在云上实现。优化和正确的选择使一个人成为谷歌云数据专家。
数据生命周期是数据从最初收集到最终可视化的周期。它由以下步骤组成:
- 数据摄取:从数据源获取原始数据——通常是实时数据或批量数据
- 存储:数据需要以合适的格式存储。数据必须可靠且可访问。
- 数据处理:数据必须经过处理才能得出可操作的见解
- 数据探索和可视化:根据数据的使用情况,必须向利益相关者适当地展示数据

杰西·奥里科在 Unsplash 上的照片
1.数据存储
云上的数据存储是一种企业应该利用的价值产品。一个本地存储选项无法实现多种功能。容错、对减少延迟的多区域支持、基于增加的工作负载的弹性、可抢占的虚拟机实例、按使用付费和降低的维护成本等诸多优势。
话虽如此,GCP 在数据存储方面有多种产品。选择合适的服务与针对云的优化同样重要。
谷歌云平台的数据湖:谷歌云存储

谷歌云存储(信用)
被认为是终极集结地的谷歌云存储可以灵活地接受所有数据格式、任何类型,并且可以用来以更低的成本存储实时数据和存档数据
Google 云存储是一个 RESTful 在线文件存储 web 服务,用于在 Google 云平台基础设施上存储和访问数据。该服务将谷歌云的性能和可扩展性与高级安全和共享功能相结合。
将谷歌云存储视为网络文件系统的等价物,它是可靠的,可以接受你扔给它的任何东西,并且根据你的数据需求在成本上是灵活的——标准、近线、冷线、存档
谷歌云 SQL

谷歌云 SQL ( 信用)
Google Cloud SQL 是一个完全托管的数据库服务,可以帮助您设置、维护、管理和控制您的关系数据库。
用例:基于 Web 框架的结构化数据。例如,仓库记录、物品
当选择通过为您管理的维护堆栈直接提升和转移传统 SQL 工作负载时,可以利用云 SQL。
最佳实践:更多更小的表,而不是更少更大的表
谷歌云数据存储

谷歌云存储(信用)
Google Cloud Datastore 是一个高度可扩展、完全可管理的 NoSQL 数据库服务。
用例 : 半结构化数据;用于键值类型数据。例如,存储产品 SKU 目录和存储游戏检查点
云数据存储可用作无运营、高度可扩展的非关系型数据库。可以根据业务需求定义数据的结构。
谷歌云 Bigtable

谷歌云 Bigtable ( 信用)
Google Cloud Bigtable 是一个完全托管的、可扩展的 NoSQL 数据库单区域服务,用于大型分析和运营工作负载。它与多区域部署不兼容。
使用案例:高吞吐量分析,低于 10ms 的响应时间,每秒百万次读取/写入。用于金融、物联网等。
云 Bigtable 不符合 No Ops,更改磁盘类型(HDD/ SDD)需要一个新实例。通过一个标识符,即行键来识别。
好的行键导致分布式负载,差的行键导致热点。不良行键的指示器:域名、顺序 id、时间戳。
谷歌云扳手

谷歌云扳手(信用
Google Cloud Spanner 是一个完全托管的关系数据库,规模不限,一致性强&可用性高达 99.999%。它本质上是为最大程度减少停机时间和完全可靠性而构建的。
用例: RDBMS 和大规模事务。例如,全球供应链、PoS 的零售跟踪等。
Cloud Spanner 是一个完全托管的、高度可扩展/可用的关系数据库,具有很强的事务一致性(ACID 合规性)。
谷歌大查询(存储)

谷歌大查询(信用)
Google BigQuery 是一个完全托管的、无服务器的数据仓库,能够对数 Pb 的数据进行可扩展的分析。它是一个无服务器的软件即服务,支持使用 ANSI SQL 进行查询。它还内置了机器学习功能。
使用案例:需要规模和一致性的任务关键型应用。用于使用 SQL 的大型数据分析处理。
Google BigQuery 也支持有限的机器学习实现。
干得好!你已经对谷歌云平台中的存储有了相当的了解。下图说明了这一切是如何组合在一起的。

在 GCP 建立一个数据湖
我想在这里重申,类似的工作流和工作负载可以通过多种方式在 GCP 上执行,但哪种方式是最佳选择取决于项目/组织的短期和长期扩展和使用计划。

[## Jupyter 笔记本崩溃了,所以我在 15 分钟内就把我的数据科学项目部署到了云中(对于…
你可以用一个很老很老的系统免费进行奇特的数据科学研究——只要动动脑筋,从这个博客中获得帮助。
2.设置数据管道
现在,我们已经知道了数据的去向,接下来要解决的问题是我们如何将数据带到那里。这就是所谓的数据管道。我们必须开始构建我们的数据管道,以确保任何时候使用的数据都符合最终用户的期望。
三种主要的数据类型是:
- 历史/存档数据:这是可能在某个时候使用的旧数据。我们通过可用的方法将所有这些数据上传到 GCP
- 流式(或实时)数据:这将包括实时生成的数据和我们希望近实时分析的数据,如金融数据
- 批量(或批量)数据:这将包括批量更新的数据,低延迟不是优先级
现在让我们了解一下谷歌云平台是如何通过其各种服务来实现这一点的。
谷歌云发布/订阅:

谷歌发布/订阅(积分)
Google Pub/Sub 代表发布者和订阅者。这项服务允许您实时地从数据源传输数据。开源的对等物是阿帕奇卡夫卡。
发布/订阅是一种异步消息服务,它将产生事件的服务与处理事件的服务分离开来。
用例:流分析,异步微服务集成。例如,从各种制造机器单元流式传输物联网数据。

发布/订阅集成(信用)
当需要快速行动来快速收集数据、获得洞察力并针对信用卡欺诈等情况采取行动时,该服务可用于流式传输数据。
谷歌云数据流

谷歌云数据流(积分)
谷歌云数据流是一种统一的流和批量数据处理,无需服务器,速度快,成本低。
Dataflow 的开源等价物是 Apache Beam 。
用例:流分析、实时人工智能、异常检测、预测预报、传感器和日志处理
处理来自云发布/订阅的事故都是在谷歌云数据流中完成的。可以对流程进行管理,以决定我们接受数据的时间点以及如何监控数据。

利用发布/订阅和数据流的流分析(信用)
Google Cloud Dataflow 将数据流的多个实例纳入所需的工作流,处理多个一致性边缘情况,并简化数据以进行近实时分析的预处理。
谷歌云数据平台

Google Dataproc ( 信用点)
Google Dataproc 让开源数据和分析处理在云中变得更快、更容易、更安全。该服务支持基于触发器自动加速和减速的自动化集群管理。这使得它们极具成本效益,但对多种使用情况有效。
用例:可用于运行机器学习任务,用于 NLP 的 PySpark 等。例如,对电信数据进行客户流失分析。
可调整大小的集群、自动缩放功能、版本控制、高可用性、集群计划删除、自定义映像、灵活的虚拟机、组件网关和从指定的 Dataproc 集群访问笔记本电脑是 Dataproc 集群的几个行业领先功能。

GCP 工作流中的云 data proc(积分)
Cloud Dataproc 是运行流程的最佳服务之一。人工智能平台也是另一个很好的选择。云数据过程的最新好处是,使用 Google Cloud Composer(Apache air flow),Data proc 集群可以以敏捷和可伸缩的方式加速和减速。这成为一个精益流程,同时成本降低,效率提高。

GCP 上的完全无服务器实施—示例(信用
谷歌大查询(管道)

谷歌大查询(信用)
请注意,BigQuery 是第二次引入,因为它在建立分析管道方面也很高效
Google BigQuery 是一款完全托管的数据仓库、自动扩展和无服务器服务,可对 Pb 级数据库进行近乎实时的分析。存储在 BigQuery 中的数据应该是列优化的,应该更经常地用于分析,存档数据应该存储在 Google 云存储中。

阿帕奇 Avro ( 学分)

影响 BigQuery 速度的数据类型(信用)
数据类型是相关的,会影响查询性能和速度,并最终影响成本。
Apache Avro 是具有最佳性能的数据类型,对于 BigQuery 上的分析任务,Json 相对较慢。这可以通过云外壳或 Web UI 来使用。
谷歌云作曲家

Google Cloud Composer ( 学分)
Google Cloud Composer 是一种完全托管的工作流编排服务,使您能够创作、调度和监控跨云和内部数据中心的管道。
Cloud Composer 建立在流行的 Apache Airflow 开源项目之上,使用 Python 编程语言运行,不受限制,易于使用。
让我激起你的兴趣。网飞使用这种建筑。它是最先进的,可扩展性极强。
你为什么要在乎?
如果你做过 Ubuntubash 脚本,我们调度任务的方式是使用 cron jobs ,在那里我们可以自动化任何手动完成的任务。如果你用过 Excel,宏相当于 Apache Airflow 所能做的,但是是在云级别。
这种自动化程度令人难以置信。本质上,你可以设置脚本(在 python 和 bash 中)从 Google 云存储中拉出最新的数据,在 Google Dataproc 中旋转一个集群,执行数据预处理,关闭集群,在 AI 平台上实现数据模型,并将结果输出到 BigQuery 上。

照片由 I srael Palacio 在 Unsplash 上拍摄
你是个摇滚明星!很好地理解了数据存储和谷歌云存储上数据流管道的各种实现。既然你在这里,我建议你回去刷新你的记忆,看看你能回忆起多少。
现在,让我们开始了解如何利用我们已经存储的数据和我们已经建立的管道。
谷歌云数据实验室

谷歌云数据实验室(学分)
Google Cloud Datalab 是一款易于使用的交互式工具,用于数据探索、分析、可视化和机器学习。
Datalab 支持强大的数据探索、集成的开源、可扩展的数据管理和可视化,以及具有生命周期支持的机器学习。
你为什么要在乎?
作为一名数据科学家,这相当于 Jupyter 笔记本,其中的数据可以位于 GCP 的各个组件中。您可以从云 shell 通过 SSH 连接,并通过端口 8081 运行它(如果这没有意义,请忽略)。

在 GCP 使用谷歌云数据实验室(信用
云数据实验室是一个在线 Jupyter 笔记本电脑
谷歌云数据准备

谷歌云数据准备(学分)
Google Cloud Dataprep 是一种智能云数据服务,可以可视化地探索、清理和准备用于分析和机器学习的数据。
这是一种无需服务器的服务,支持快速探测、异常检测、简单而强大的数据探测。

Google Cloud Dataprep 在工作流程中的位置
可以把 Google Cloud Dataprep 想象成一个带有智能建议的 excel GUI。
[## Gartner 炒作周期中的 AutoML 分析的未来?
你对数据科学或其未来了解多少?某人的一篇观点文章。
medium.com](https://medium.com/voice-tech-podcast/automl-on-the-gartner-hype-cycle-the-future-of-analytics-daab144d8406)
谷歌人工智能平台

谷歌人工智能平台(学分)
谷歌人工智能平台是一项托管服务,使您能够轻松构建机器学习模型,该模型可以处理任何类型、任何规模的数据。人工智能平台让用户为模型开发准备、构建和运行、管理和共享机器学习端到端周期。

机器学习开发:端到端循环(学分)
AI 平台是下一代云 Dataproc。

ML 工作流程(学分)
AI 平台是一个完全托管的平台,可扩展到数十个 CPU/GPU/TPU,您可以在其中训练您的模型并使其自动化。
谷歌数据工作室

谷歌数据工作室(学分)
很简单。谷歌数据工作室是一个在线的交互式仪表板工具,其来源位于 GCP。您可以在一个平台上同步多个开发人员完成的工作。
它不像 Power BI 或 Tableau 那么先进,但它可以完成工作。它是 G 套件的一部分,可以连接 BigQuery、Cloud SQL、GCS、Google Cloud Spanner 等。
[## 在 15 分钟内在云上运行 Jupyter 笔记本电脑#Azure
文章做到了标题所说的。在 Azure 笔记本电脑(免费或付费)上运行 Jupyter Notebook,其成本仅为……
towardsdatascience.com](/running-jupyter-notebook-on-the-cloud-in-15-mins-azure-79b7797e4ef6) 
卢卡斯·布拉塞克在 Unsplash 上的照片
我建议你反复阅读上面的文章,以了解云:谷歌云平台。一如既往,了解该平台的最佳方式是深入了解 Google 云平台的实际操作方面。这需要相当大的努力,如果你觉得这在某种程度上对你有帮助,我会很感激你的想法和评论。欢迎联系我,进一步讨论数据科学在云上的应用。
[## Anish Mahapatra —数据科学家— Mu 适马公司| LinkedIn
我正在努力理解数学、商业和技术如何帮助我们在未来做出更好的决策…
www.linkedin.com](https://www.linkedin.com/in/anishmahapatra/)
所以,关于我的一点点。我是一家顶级数据科学公司的数据科学家,目前正在攻读数据科学硕士学位。我花很多时间学习和工作。如果你喜欢这个,给我点爱!😄我也写关于千禧一代的生活方式、咨询、聊天机器人和财经!如果您对此有任何问题或建议,请随时在 LinkedIn 上联系我或关注我这里,我很想听听您的想法!
作为本系列后续步骤的一部分,我将发布更多关于我们如何在现实世界中利用云的用例。欢迎关注我并与我联系了解更多信息!
阅读 Anish Mahapatra 在媒体上的文章。专业数据科学家攻读数据科学硕士学位。在…工作
medium.com](https://medium.com/@anishmahapatra)
冠状病毒病例的商业测试积压和指数增长——比我们想象的要晚
几周来,广泛流传的轶事和相对较少的小报告表达了对由于商业实验室积压的测试而需要等待时间才能收到测试结果的担忧。3 月 31 日, The Atlantic 终于发表了一篇关于这个主题的深度文章。加州似乎是积压的中心,大约有 57,000+项测试仍未完成,平均每天处理约 2,100 项测试。然而,加州的 Quest 实验室已经接受了来自全国各地的测试。几个因素导致了第一个提供测试的商业实验室的积压——Quest Diagnostics 和 Labcorp。最初的测试设计是一项非常劳动密集型的测试,缺乏对测试操作的及时扩展,并且新的高速测试机制(瑞士罗氏公司)与以前收集的测试不兼容。Quest 坚持认为,全国范围内的平均测试周转时间约为 4-5 天,但在田纳西州,3 月 24 日在 Kefauver 联邦大楼测试一个案例时,直到 3 月 31 日才收到结果(7 天,结果为负)。当我的家人通过我丈夫在田纳西州的工作场所被曝光时,那个人的检测结果 10 天没有返回。
虽然很高兴看到这一问题得到解决,各公司也在争相解决这一问题,但这只是全国范围内准确病例数这一更大问题的冰山一角。很难完全定义这个问题,因为每个州都在使用不同的测试来源——例如,截至 3 月 13 日,纽约州有 28 个私人实验室处理测试。华盛顿州严重依赖华盛顿大学医学院进行快速开发和部署的测试,直到他们的实验室不堪重负,停止接受测试。据Covid 追踪项目称,在几个州悬而未决的测试显示没有数据。不是零,没有数据。很可能许多国家没有报告这一信息,而不是没有任何未决测试。鉴于 Quest Diagnostic 自己关于 4-5 天平均处理速度的官方公开言论,如果每个州使用这些商业实验室,它们应该有一些待测试的报告。
关于测试滞后时间令人担忧的是,报告的数字实际上反映了 4 到 10 天之前的情况。在指数增长的情况下,就像我们目前所处的情况,确诊测试中的 4 到 5 天的滞后时间意味着比报告的病例多数千例。7 到 10 天的滞后时间很可能意味着比报告的病例多成千上万。对于像加利福尼亚这样的积极主动的州来说,这种测试滞后可能不会有太大的影响。对于那些好战地坚持推迟采取抑制传播的强有力措施的州,如佐治亚州、佛罗里达州和田纳西州,这种数据滞后将转化为医院利用率的增加,以及冠状病毒和其他急性医疗问题造成的更多生命损失。由于冠状病毒患者数量导致的医疗配给,这些问题无法解决。
这段时间对于减缓扩散是绝对关键的。指数增长已经在每个州确立。需要整整两周或更长时间——取决于就地安置等措施的力度和执行力度——才能真正看到这些措施颁布时正在发生的传播的全部结果。矩阵模型和同行评议的研究都表明,限制人口中心之间的流动和限制社会群体的相互作用可以有效地减缓指数式扩散,如果措施得以维持,最终会逆转这种扩散。
对传播的指数速率同样重要的是限制传播的时机。 越早制定限制传播的措施,就能越早解除 。这就像炉子上的一壶开水——仅仅因为你关了火并不意味着水马上就凉了——这需要时间。指数增长也是如此。我们越早关闭暴露的热量,病例的增长就越早冷却。这也给了关键的检测和治疗基础设施必要的时间来扩大规模。可以通过积极的检测和隔离病人来限制进一步的传播。但是测试系统必须有适当的规模,而不是不堪重负。
每天新增病例的增加表明呈指数级增长。
下图比较了佐治亚州、佛罗里达州、田纳西州、俄亥俄州和路易斯安那州从 3 月 15 日到 4 月 2 日每天的新增病例。

数据来源:https://coronavirus.jhu.edu/map.html
该图中唯一一个在确诊病例相对较低的情况下实施强制留院令和关闭学校的州是俄亥俄州(437),对新病例的增长率产生了显著影响。路易斯安那州也在 3 月 23 日实施了留在家中的命令,与俄亥俄州同一天,但他们没有执行,该州的病例数是他们发布命令时的 3 倍(1137 例)。直到 4 月 1 日,佛罗里达州、佐治亚州和田纳西州的州长拒绝发布强制留在家中的命令,当时佛罗里达州确诊病例达到 8,864 例,佐治亚州为 5,268 例,田纳西州为 2,809 例。田纳西州可能已经达到了传播的宽限期,这表现为明显缓慢的病例增长,这纯粹是由于学校的春假时间,这要早得多(大多数学校和大学为 3 月 9 日至 13 日和 3 月 16 日至 20 日)。所有其他州的春假都在 2-3 周后。
这就是测试积压破坏快速和决定性行动的地方。不知道病例的真实数量,并且没有有效和快速的测试来确认它们,只会加剧州和联邦领导人的问题,他们不努力理解科学的政策含义,而是等待问题出现在他们的门口,然后制定强有力的措施来减缓和阻止指数增长。
AUC 和平均精度完全指南
模拟和可视化

这篇文章在网上提供了最清晰的解释,说明如何使用流行的指标 AUC (AUROC)和平均精度来理解分类器如何对平衡数据进行处理,下一篇文章将重点关注不平衡数据。这篇文章包括许多模拟和 AUROC/平均精度图,用于不同属性的分类器。在 GitHub 上提供了复制绘图和模拟的所有代码。
首先,简单介绍一下 AUROC 和平均精度:
AUROC:接收机工作特性下的面积
AUROC 表明您的模型是否能够正确地对示例进行排序。AUROC 是随机选择的正面例子比随机选择的负面例子具有更高的正面预测概率的概率。AUROC 计算为测量不同决策阈值下真阳性率(TPR)和假阳性率(FPR)之间权衡的曲线下面积:

随机分类器(如抛硬币)的 AUROC 为 0.5,而完美分类器的 AUROC 为 1.0。更多关于 AUROC 的细节,请看这篇文章。
平均精度(又名 AUPRC):精度-召回曲线下的面积
平均精度表示您的模型是否能够正确识别所有的正例,而不会意外地将太多的负例标记为正例。因此,当您的模型能够正确处理正值时,平均精度较高。平均精度计算为曲线下的面积,用于衡量不同决策阈值下精度和召回率之间的权衡:

随机分类器(例如抛硬币)的平均精度等于该类中阳性样本的百分比,例如,如果该类中有 12%的阳性样本,则为 0.12。完美的分类器的平均精度为 1.0。关于平均精度的更多细节,见本帖。
模拟设置
在模拟中,我生成指示一系列示例的真实标签的基本真实向量(例如,[0,0,1]用于三个示例[负,负,正]),以及指示假设模型对该系列示例的预测的预测向量(例如,[0.1,0.25,0.99])。
我生成基本事实和预测,因此存在不同数量的真阳性、假阳性、真阴性和假阴性:

关于混淆矩阵的更详细的回顾,见本帖。
本文中的模拟模型结果是相对于假设的决策阈值 0.5 创建的。例如,为了从假设的决策阈值 0.5 创建真阳性,我对 0.5001 和 1.0 之间的预测值进行了统一采样,并将每个采样值的基本事实标记为 1。请注意,0.5 的决策阈值仅用于模拟地面实况和预测向量。AUROC 和平均精度是根据它们的定义,用滑动决策阈值计算的。
复制这篇文章中的结果和数字的所有代码可以在 GitHub 上找到。
平衡数据模拟
让我们看看平衡数据集上的 AUROC 和平均精度的图,即实际阳性数和实际阴性数相等的数据集。
随机模式

在上面的“模型平衡”图中,左边的图(红色)显示了接收器工作特性(ROC ),标题报告了 ROC 下的面积,或 AUROC,在本例中为 0.48。
右边的图(蓝色)显示了精密度-召回曲线,标题报告了使用平均精密度方法计算的精密度召回曲线下的面积(AUPRC)。
这里,AUROC 是 0.5 左右的基线,平均精度也是 0.5 左右的基线,因为阳性率是 0.50。由于模拟中涉及随机均匀采样,这些值并不精确为 0.500。“ModelBalanced”意味着模型不会偏向于做出积极或消极的预测,也不会偏向于做出正确的预测。换句话说,这是一个随机的、无用的模型,相当于抛硬币。
图标题下方的行报告了决策阈值为 0.5 (d=0.5)时的真阳性(tp)、假阴性(fn)、真阴性(tn)和假阳性(fp)的数量:“在 d=0.5 时,tp=100,fn = 100,tn = 100,fp = 100。”对于“决策阈值= 0.5”,该点也在曲线上绘制为标记为“d = 0.5”的点
此外,我在曲线上显示了决策阈值等于 0.9、0.5 和 0.1 的点。这些点被标记为 d = 0.9、d = 0.5 和 d = 0.1。我们可以看到,当我们从左向右扫描时,决策阈值从 1 到 0。曲线本身相对平滑,因为它们是使用许多决策阈值创建的;只有 3 个决策阈值明确显示为点,以强调曲线的特性。
糟糕的模型预测

在“模型预测错误”中,模型倾向于做出错误的预测,即,它倾向于得到错误的答案,并且具有高的假阴性和高的假阳性。请注意,这里的 AUROC 和平均精度都低于基线。这说明了一个关于分类器的有趣事实——在实践中,如果你有一个“非常糟糕”的模型,那么你可以翻转分类决策,得到一个好的模型。如果我们翻转这里所有的分类决策,我们可以得到一个 1.0–0.11 = 0.89 AUROC 的模型。这就是为什么 AUROC 的基线总是 0.5;如果我们有一个 AUROC 低于 0.5 的分类器,我们翻转它的决定,得到一个 AUROC 在 0.5 和 1.0 之间的更好的分类器。
AUROC 和平均精度图中 d = 0.5 处的“肘”是由于模拟结果相对于 d = 0.5 的决策阈值的创建方式。
良好的模型预测

在“模型预测好”中,我们有一个很好的模型,它产生了许多真正和真负。我们可以看到,AUROC 和平均精度都很高。
负偏态模型预测

在“ModelPredNeg(higtn,HighFN)”中,我们有平衡的数据和一个偏向于预测负面的模型。虽然它总共预测了更多的否定,但它预测的真否定和假否定的数量是一样的。因为 tp == fp 和 tn == fn,所以 AUROC 和 average precision 再次接近它们的基线值 0.5,这意味着这是一个无用的模型。
我们可以通过考虑 TPR(真阳性率、召回率)、FPR(假阳性率)和精确度的公式来证实这一点。由于我们有 tp == fp,我们可以称这个值为 a,即 tp == fp == a .由于我们有 tn == fn,我们可以称这个值为 b,即 tn == fn == b .那么我们可以写成:
对于 AUROC: TPR = tp/(tp+fn) = a/(a+b),FPR = fp/(fp+tn) = a/(a+b)。因此,TPR 和 FPR 总是彼此相等,这意味着 ROC 在 y = x 处是一条直线,这意味着 AUROC 是 0.5。
对于平均精度:precision = TP/(TP+FP)= a/(a+a)= 1/2,从之前的 TPR = recall = tp/(tp+fn) = a/(a+b)。因此,不管召回的值是多少,精度总是约为 1/2,因此我们得到 PR 曲线下的面积为 0.5。
正偏模型预测

在“modelrepedpos(HighTP,HighFP)”中我们可以看到与在“modelrepedneg(HighTN,HighFN)”中看到的效果相同的效果。该模型偏向于预测阳性,但尽管它预测的阳性总数较大,但它预测的真阳性数与假阳性数相同,因此它是一个无用的模型,AUROC 和平均精度处于它们的基线值。
观察曲线上对应于 d = 0.9、0.5 和 0.1 的点也很有趣。这里,当模型倾向于预测阳性时,d=0.5 和 d=0.1 的点被挤得更近。紧接着上面,在“数据平衡/模型预测负”中,我们将 d=0.5 压缩到更接近 d=0.9。
良好的模型预测:高 TNs

在“modelrepedgoodtn(HighTN)”中,该模型尤其擅长识别真正的否定。这产生了优于随机的 AUROC 和优于随机的平均精度。
在 ROC 图(红色)中,我们看到决策阈值 d = 0.9 至 d = 0.5 跨越了 FPR = fp/(fp+tn)的一个小区间。这是因为对于这些高决策阈值,fps 特别低,而 tns 特别高,这产生了小的 FPR。
请注意,平均精度不会因为真阴性的数量而明显提高,因为真阴性不会用于平均精度的计算。平均精度由于假阳性的减少而提高,因为一些例子从假阳性转变为真阴性,这是为了保持数据集平衡的假设所需要的。精度= tp/(tp+fp),所以当我们让 fp 变小的时候,我们就提高了精度。此外,当判定阈值最高时(图的左侧),精度往往最高,因为判定阈值越高,标记为正的要求就越严格,这通常会增加 tps 并降低 fps。
坏模型预测:高 FPs

在“modelrepedbadfp(HighFP)”中,模型产生了大量的误报。再一次,因为这个模型是“战略上糟糕的”,我们可以通过翻转它的分类决策得到一个好的模型。如果我们翻转它的分类决策,那么 FPs 将变成 TNs,我们将有一个偏向于预测 TNs 的模型——上面“modelrepedgoodtn(HighTN)”中显示的确切模型。
良好的模型预测:高 TPs

这是我们倒数第二个数字。在“modelrepedgoodtp(HighTP)”中,模型产生了许多真阳性。这导致优于随机的 AUROC 和优于随机的平均精度。
注意这个 ROC 曲线是如何更接近顶部的,而在“modelrepedgoodtn(HighTN)”中,ROC 曲线是如何更接近底部的。这里的 ROC 更接近顶部,因为 TPR=tp/(tp+fn)的小范围被较低的决策阈值 d = 0.5 到 d = 0.1 所覆盖。这是因为当决策阈值较低时,在这种 tp 偏向模型中,我们最终会得到大量 TP 和少量 fn,从而在这些不同的较低决策阈值之间产生高召回率。在 d = 0.5 处出现“肘形”是因为合成结果是相对于 0.5 的决策阈值而生成的。
坏模型预测:高 FNs

这是最后的情节。“modelrepedbadfn(high fn)”显示产生大量假阴性的模型的图。如果我们翻转这个坏模型的分类决策,所有的 fn 将变成 TP,我们将得到上面显示为“modelrepedgoodtp(HighTP)”的好模型。
总结
- ROC 是跨不同决策阈值的 TPR 对 FPR 的图。奥罗克是中华民国管辖的地区。AUROC 表示随机选择的正面例子比随机选择的负面例子具有更高的正面预测概率的概率。
- AUROC 的范围从 0.5(随机模型)到 1.0(完美模型)。请注意,如果模型“非常糟糕”,则有可能计算出小于 0.5 的 AUROC,但在这些情况下,我们可以翻转模型的决策,得到 AUROC 大于 0.5 的好模型。
- PR 曲线是跨不同决策阈值的精确度与召回率(TPR)的曲线图。平均精度是计算 PR 曲线下面积的一种方法。平均精度表示您的模型是否能够正确识别所有的正例,而不会意外地将太多的负例标记为正例。
- 平均精度范围从正例的频率(平衡数据为 0.5)到 1.0(完美模型)。
- 如果模型做出“平衡”的预测,不倾向于错误或正确,那么我们有一个随机模型,其平均精度为 0.5 AUROC 和 0.5(阳性频率= 0.5)。这由“ModelBalanced”、“ModelPredNeg”(预测许多负面,但同样预测 TNs 和 FNs)、“ModelPredPos”(预测许多正面,但同样预测 TPs 和 FPs)来例证。
- 如果一个模型“非常糟糕”,这意味着它倾向于选择错误的答案。“内行坏”的模型有“modelrepedbad(HighFP,HighFN)”、“modelrepedbadfn(HighFN)”和“modelrepedbadfp(HighFP)”。这些模型非常善于挑选错误的答案,以至于通过翻转它们的决定,它们可以变成有用的模型。
- “ModelPredGood(HighTP,HighTN)”获得最佳性能,因为它标识了许多 TP 和 TN。“ModelPredGoodTN(HighTN)”和“ModelPredGoodTP(HighTP)”也获得了比随机更好的性能,因为它们倾向于选择正确的答案。
原载于 2020 年 7 月 14 日【http://glassboxmedicine.com】。
聚类分析完全指南
手动和 R 中的 k-means 和层次聚类

什么是聚类分析?
C 聚类分析是探索性数据分析的一种形式,在这种分析中,观察结果被分成具有共同特征的不同组。
聚类分析(也称为分类)的目的是构建组(或类或聚类,同时确保以下性质:在一个组内,观察值必须尽可能相似,而属于不同组的观察值必须尽可能不同。
有两种主要的分类类型:
- k-表示聚类
- 分层聚类
第一种通常在类的数量预先固定时使用,而第二种通常用于未知数量的类并帮助确定该最佳数量。下面通过手工应用和 r 中的应用说明了这两种方法。注意,对于层次聚类,本文中只介绍了升序分类。
聚类算法使用距离来将观察结果分成不同的组。因此,在开始介绍这两种分类方法之前,先介绍一下如何计算点之间的距离。
应用 1:计算距离
设一个包含点 a = (0,0)′、 b = (1,0)′、以及 c = (5,5)′的数据集。手动计算点与点之间的欧氏距离矩阵。
解决办法
要点如下:
# We create the points in R
a <- c(0, 0)
b <- c(1, 0)
c <- c(5, 5)X <- rbind(a, b, c) # a, b and c are combined per row
colnames(X) <- c("x", "y") # rename columnsX # display the points## x y
## a 0 0
## b 1 0
## c 5 5
通过勾股定理,我们将记住两点之间的距离

由给出

例如,对于上面陈述中给出的点 b = (1,0)’和 c = (5,5)’之间的距离,我们有:

我们可以对所有的点对进行类似的手动查找距离矩阵。在 R 中,dist()函数允许您以非常简单的方式找到矩阵或数据帧中各点的距离:
# The distance is found using the dist() function:
distance <- dist(X, method = "euclidean")
distance # display the distance matrix## a b
## b 1.000000
## c 7.071068 6.403124
注意,参数method = "euclidean"不是强制的,因为欧几里德方法是默认的。
由dist()函数产生的距离矩阵给出了不同点之间的距离。点 b 和 c 之间的欧几里得距离是 6.403124,这与我们上面通过毕达哥拉斯公式得到的结果相对应。
注意:如果两个变量没有相同的单位,在计算欧几里得距离时,一个变量可能比另一个变量具有更大的权重。在这种情况下,最好对数据进行缩放。缩放数据允许获得独立于其单位的变量,这可以通过[scale()](https://www.statsandr.com/blog/data-manipulation-in-r/#scale)函数完成。
现在距离已经给出,让我们看看如何用 k-means 算法执行聚类分析。
k 均值聚类
第一种分类形式是称为 k 均值聚类或移动中心算法的方法。作为提醒,该方法旨在将 n 个观察值划分为 k 个聚类,其中每个观察值属于具有最接近平均值的聚类,作为该聚类的原型。
下面通过一个 R 语言的应用程序手工展示。
应用 2: k 均值聚类
数据
在这个练习中,使用了可用的Eurojobs.csv数据库这里。
该数据库包含了 1979 年 26 个欧洲国家不同行业的就业人口百分比。它包含 10 个变量:
Country-国家的名称(标识符)Agr- %的劳动力从事农业Min- %在采Man- %在制造业PS- %在电源行业Con- %在建SI-服务业中的%Fin- %在金融SPS- %从事社会和个人服务TC- %在交通和通信业
我们首先导入数据集。如果您需要提醒,请参见如何将数据导入 R 。
# Import data
Eurojobs <- read.csv(
file = "data/Eurojobs.csv",
sep = ",", dec = ".", header = TRUE
)
head(Eurojobs) # head() is used to display only the first 6 observations## Country Agr Min Man PS Con SI Fin SPS TC
## 1 Belgium 3.3 0.9 27.6 0.9 8.2 19.1 6.2 26.6 7.2
## 2 Denmark 9.2 0.1 21.8 0.6 8.3 14.6 6.5 32.2 7.1
## 3 France 10.8 0.8 27.5 0.9 8.9 16.8 6.0 22.6 5.7
## 4 W. Germany 6.7 1.3 35.8 0.9 7.3 14.4 5.0 22.3 6.1
## 5 Ireland 23.2 1.0 20.7 1.3 7.5 16.8 2.8 20.8 6.1
## 6 Italy 15.9 0.6 27.6 0.5 10.0 18.1 1.6 20.1 5.7
注意,在第一个变量Country之前有一个编号。为了更清楚起见,我们将用国家来代替这个编号。为此,我们在导入函数read.csv()中添加参数row.names = 1,以指定第一列对应于行名:
Eurojobs <- read.csv(
file = "data/Eurojobs.csv",
sep = ",", dec = ".", header = TRUE, row.names = 1
)
Eurojobs # displays dataset## Agr Min Man PS Con SI Fin SPS TC
## Belgium 3.3 0.9 27.6 0.9 8.2 19.1 6.2 26.6 7.2
## Denmark 9.2 0.1 21.8 0.6 8.3 14.6 6.5 32.2 7.1
## France 10.8 0.8 27.5 0.9 8.9 16.8 6.0 22.6 5.7
## W. Germany 6.7 1.3 35.8 0.9 7.3 14.4 5.0 22.3 6.1
## Ireland 23.2 1.0 20.7 1.3 7.5 16.8 2.8 20.8 6.1
## Italy 15.9 0.6 27.6 0.5 10.0 18.1 1.6 20.1 5.7
## Luxembourg 7.7 3.1 30.8 0.8 9.2 18.5 4.6 19.2 6.2
## Netherlands 6.3 0.1 22.5 1.0 9.9 18.0 6.8 28.5 6.8
## United Kingdom 2.7 1.4 30.2 1.4 6.9 16.9 5.7 28.3 6.4
## Austria 12.7 1.1 30.2 1.4 9.0 16.8 4.9 16.8 7.0
## Finland 13.0 0.4 25.9 1.3 7.4 14.7 5.5 24.3 7.6
## Greece 41.4 0.6 17.6 0.6 8.1 11.5 2.4 11.0 6.7
## Norway 9.0 0.5 22.4 0.8 8.6 16.9 4.7 27.6 9.4
## Portugal 27.8 0.3 24.5 0.6 8.4 13.3 2.7 16.7 5.7
## Spain 22.9 0.8 28.5 0.7 11.5 9.7 8.5 11.8 5.5
## Sweden 6.1 0.4 25.9 0.8 7.2 14.4 6.0 32.4 6.8
## Switzerland 7.7 0.2 37.8 0.8 9.5 17.5 5.3 15.4 5.7
## Turkey 66.8 0.7 7.9 0.1 2.8 5.2 1.1 11.9 3.2
## Bulgaria 23.6 1.9 32.3 0.6 7.9 8.0 0.7 18.2 6.7
## Czechoslovakia 16.5 2.9 35.5 1.2 8.7 9.2 0.9 17.9 7.0
## E. Germany 4.2 2.9 41.2 1.3 7.6 11.2 1.2 22.1 8.4
## Hungary 21.7 3.1 29.6 1.9 8.2 9.4 0.9 17.2 8.0
## Poland 31.1 2.5 25.7 0.9 8.4 7.5 0.9 16.1 6.9
## Rumania 34.7 2.1 30.1 0.6 8.7 5.9 1.3 11.7 5.0
## USSR 23.7 1.4 25.8 0.6 9.2 6.1 0.5 23.6 9.3
## Yugoslavia 48.7 1.5 16.8 1.1 4.9 6.4 11.3 5.3 4.0dim(Eurojobs) # displays the number of rows and columns## [1] 26 9
我们现在有一个“干净”的数据集,包含 26 个观察值和 9 个定量连续变量,我们可以在此基础上进行分类。请注意,在这种情况下,没有必要将数据标准化,因为它们都以相同的单位(百分比)表示。如果不是这样,我们将不得不通过scale()函数标准化数据(不要忘记,否则您的结果可能完全不同!).
所谓的k-意味着通过kmeans()函数进行聚类,自变量centers对应于所需的聚类数。在下文中,我们以 2 个类别和 3 个类别为例应用分类。
kmeans()同 2 组
model <- kmeans(Eurojobs, centers = 2)# displays the class determined by
# the model for all observations:
print(model$cluster)## Belgium Denmark France W. Germany Ireland
## 1 1 1 1 2
## Italy Luxembourg Netherlands United Kingdom Austria
## 1 1 1 1 1
## Finland Greece Norway Portugal Spain
## 1 2 1 2 2
## Sweden Switzerland Turkey Bulgaria Czechoslovakia
## 1 1 2 2 1
## E. Germany Hungary Poland Rumania USSR
## 1 2 2 2 2
## Yugoslavia
## 2
注意,参数centers = 2用于设置预先确定的集群数量。在本练习中,集群的数量是任意确定的。应该根据您的分析的背景和目标,或者根据本部分中解释的方法来确定集群的数量。叫print(model$cluster)还是model$cluster都一样。该输出指定了每个国家所属的组(即 1 或 2)。
每个观察值的聚类可以作为列直接存储在数据集中:
Eurojobs_cluster <- data.frame(Eurojobs,
cluster = as.factor(model$cluster))
head(Eurojobs_cluster)## Agr Min Man PS Con SI Fin SPS TC cluster
## Belgium 3.3 0.9 27.6 0.9 8.2 19.1 6.2 26.6 7.2 1
## Denmark 9.2 0.1 21.8 0.6 8.3 14.6 6.5 32.2 7.1 1
## France 10.8 0.8 27.5 0.9 8.9 16.8 6.0 22.6 5.7 1
## W. Germany 6.7 1.3 35.8 0.9 7.3 14.4 5.0 22.3 6.1 1
## Ireland 23.2 1.0 20.7 1.3 7.5 16.8 2.8 20.8 6.1 2
## Italy 15.9 0.6 27.6 0.5 10.0 18.1 1.6 20.1 5.7 1
k-均值划分的质量
通过使用以下公式计算分区“解释”的 TSS 的百分比,可以发现 k 均值分区的质量:

其中 BSS 和 TSS 分别代表和平方和之间的。百分比越高,分数越好(因此质量也越好),因为这意味着 BSS 大和/或 WSS 小。
下面是如何检查 R 中分区的质量:
# BSS and TSS are extracted from the model and stored
(BSS <- model$betweenss)## [1] 4823.535(TSS <- model$totss)## [1] 9299.59# We calculate the quality of the partition
BSS / TSS * 100## [1] 51.86826
分区质量为 51.87%。这个值没有真正的绝对解释,除了更高的质量意味着更高的解释百分比。但是和其他分区的质量比起来就更有见地了(集群数量相同!)以便在所考虑的分区中确定最佳分区。
nstart对于多个初始中心和更好的稳定性
k -means 算法使用一组随机的初始点来达到最终的分类。由于初始中心是随机选择的,相同的命令kmeans(Eurojobs, centers = 2)每次运行时可能会给出不同的结果,因此分区的质量会略有不同。kmeans()函数中的nstart参数允许使用不同的初始中心运行该算法几次,以获得潜在的更好的分割:
model2 <- kmeans(Eurojobs, centers = 2, nstart = 10)
100 * model2$betweenss / model2$totss## [1] 54.2503
根据最初的随机选择,这个新分区会比第一个更好或更差。在我们的示例中,随着质量增加到 54.25%,分区变得更好。
关于 k -means 经常引用的一个主要限制是结果的稳定性。由于初始中心是随机选择的,运行相同的命令可能会产生不同的结果。在kmeans()函数中添加nstart参数限制了这个问题,因为它将生成几个不同的初始化,并采取最佳的一个,从而导致分类的更好的稳定性。
kmeans()同 3 组
我们现在使用 3 个聚类执行 k 均值分类,并计算其质量:
model3 <- kmeans(Eurojobs, centers = 3)
BSS3 <- model3$betweenss
TSS3 <- model3$totss
BSS3 / TSS3 * 100## [1] 74.59455
可以看出,分成三组的分类允许更高的解释百分比和更高的质量。情况总是这样:类越多,划分就越精细,BSS 的贡献就越大。另一方面,“模型”会更复杂,需要更多的类。在极端情况下 k = n (每个观察都是单例类),我们有 BSS = TSS ,但是分区已经失去了所有的兴趣。
最佳聚类数
为了找到一个 k 均值的最佳聚类数,建议根据以下条件进行选择:
- 手头问题的背景,例如,如果您知道您的数据中有特定数量的组(这是一个主观选项),或者
- 以下四种方法:
- 肘方法(使用组内平方和)
- 平均轮廓法
- 差距统计法
NbClust()功能
我们在下面展示了这 4 种方法的 R 代码,更多的理论信息可以在这里找到。
肘法
肘方法将总的类内平方和(WSS)视为类数量的函数。
# load required packages
library(factoextra)
library(NbClust)# Elbow method
fviz_nbclust(Eurojobs, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2) + # add line for better visualisation
labs(subtitle = "Elbow method") # add subtitle

图中拐点的位置通常被认为是适当聚类数的指示,因为这意味着添加另一个聚类并不能更好地改善分区。这种方法似乎暗示了 4 个集群。
肘法有时是不明确的,一个替代方法是平均剪影法。
剪影法
剪影方法测量聚类的质量,并确定每个点在聚类中的位置。
# Silhouette method
fviz_nbclust(Eurojobs, kmeans, method = "silhouette") +
labs(subtitle = "Silhouette method")

剪影法建议 2 组。
差距统计法
# Gap statistic
set.seed(42)
fviz_nbclust(Eurojobs, kmeans,
nstart = 25,
method = "gap_stat",
nboot = 500
) + # reduce it for lower computation time (but less precise results)
labs(subtitle = "Gap statistic method")

聚类的最佳数量是使间隙统计最大化的数量。该方法仅建议 1 个聚类(因此是无用的聚类)。
正如你所看到的,这三种方法不一定导致相同的结果。这里,所有 3 种方法都建议使用不同数量的集群。
NbClust()
第四种选择是使用NbClust()函数,它提供了 30 个指数来选择最佳的集群数量。
nbclust_out <- NbClust(
data = Eurojobs,
distance = "euclidean",
min.nc = 2, # minimum number of clusters
max.nc = 5, # maximum number of clusters
method = "kmeans"
) # one of: "ward.D", "ward.D2", "single", "complete", "average", "mcquitty", "median", "centroid", "kmeans"

## *** : The Hubert index is a graphical method of determining the number of clusters.
## In the plot of Hubert index, we seek a significant knee that corresponds to a
## significant increase of the value of the measure i.e the significant peak in Hubert
## index second differences plot.
##

## *** : The D index is a graphical method of determining the number of clusters.
## In the plot of D index, we seek a significant knee (the significant peak in Dindex
## second differences plot) that corresponds to a significant increase of the value of
## the measure.
##
## *******************************************************************
## * Among all indices:
## * 5 proposed 2 as the best number of clusters
## * 16 proposed 3 as the best number of clusters
## * 2 proposed 5 as the best number of clusters
##
## ***** Conclusion *****
##
## * According to the majority rule, the best number of clusters is 3
##
##
## *******************************************************************# create a dataframe of the optimal number of clusters
nbclust_plot <- data.frame(clusters = nbclust_out$Best.nc[1, ])
# select only indices which select between 2 and 5 clusters
nbclust_plot <- subset(nbclust_plot, clusters >= 2 & clusters <= 5)# create plot
ggplot(nbclust_plot) +
aes(x = clusters) +
geom_histogram(bins = 30L, fill = "#0c4c8a") +
labs(x = "Number of clusters", y = "Frequency among all indices", title = "Optimal number of clusters") +
theme_minimal()

基于所有 30 个指标,最佳的聚类数是 3 个聚类。
(参见文章《R 中的图形与 ggplot2 》了解如何在{ggplot2}中创建这种剧情)。
形象化
为了确认您的类数确实是最佳的,有一种方法可以通过剪影图(在 y 轴上显示剪影系数)来评估您的聚类质量。
我们绘制了两个集群的轮廓图,如平均轮廓法所建议的:
library(cluster)set.seed(42)
km_res <- kmeans(Eurojobs, centers = 2, nstart = 20)sil <- silhouette(km_res$cluster, dist(Eurojobs))
fviz_silhouette(sil)## cluster size ave.sil.width
## 1 1 5 0.33
## 2 2 21 0.54

提醒一下,剪影系数的解释如下:
-
0 表示观察值分组良好。系数越接近 1,观察值分组越好。
- < 0 表示观察值被放置在错误的聚类中。
- = 0 表示观察值在两个聚类之间。
上面的侧影图和平均侧影系数有助于确定你的聚类是否良好。如果大部分轮廓系数是正的,则表明观察值被放置在正确的组中。因此,该轮廓图可用于选择最佳类别数。
也可以使用fviz_cluster()功能绘制聚类图。注意,执行主成分分析来表示二维平面中的变量。
library(factoextra)fviz_cluster(km_res, Eurojobs, ellipse.type = "norm")

既然在 R 中已经详细描述了 k()均值聚类,那么在接下来的章节中就来看看如何手工实现这个算法。
R 中的手动应用和验证
以 k = 2,点 i = 5 和 i = 6 为初始中心,手动执行下图所示点的 k 均值算法。计算你刚刚找到的分区的质量,然后检查你在 R 中的答案。
假设变量具有相同的单位,因此无需缩放数据。

手工解决方案
第一步。这是 6 个点的坐标:

最初的中心是:
- 第 1 组:带中心的点 5(9,7)
- 第二组:带中心的点 6(6,8)
第二步。用勾股定理逐点计算距离矩阵。提醒点 a 和点 b 之间的距离由下式得出:

我们将该定理应用于每一对点,最终得到以下距离矩阵(四舍五入到两位小数):
round(dist(X), 2)## 1 2 3 4 5
## 2 3.61
## 3 5.10 2.24
## 4 7.28 5.66 3.61
## 5 4.47 5.39 7.62 10.82
## 6 5.10 3.61 5.66 9.22 3.16
第三步。基于步骤 2 中计算的距离矩阵,我们可以将每个点放入其最近的组中,并计算中心的坐标。
我们首先将每个点放在其最近的组中:
- 点 1 比点 6 更靠近点 5,因为点 1 和 5 之间的距离是 4.47,而点 1 和 6 之间的距离是 5.10
- 点 2 比点 5 更靠近点 6,因为点 2 和点 5 之间的距离是 5.39,而点 2 和点 6 之间的距离是 3.61
- 点 3 比点 5 更靠近点 6,因为点 3 和点 5 之间的距离是 7.62,而点 3 和点 6 之间的距离是 5.66
- 点 4 比点 5 更靠近点 6,因为点 4 和点 5 之间的距离是 10.82,而点 4 和点 6 之间的距离是 9.22
注意,计算每个点与点 5 和 6 之间的距离就足够了。例如,当我们将每个点与初始中心(即点 5 和 6)进行比较时,不需要计算点 1 和 2 之间的距离。
然后,我们通过取坐标 x 和 y 的平均值来计算两组中心的坐标:
- 组 1 包括以 (8,5) 为中心的点 5 和 1:8 =(9+7)/2 和 5 = (7 + 3) / 2
- 第二组包括以 (3,4.5) 为中心的点 6、2、3、4:3 =(6+4+2+0)/4 和 4.5 = (8 + 5 + 4 + 1) / 4
因此,我们有:

第四步。我们通过检查每个点是否在最近的聚类中来确保分配是最优的。由于毕达哥拉斯定理,一个点和一个簇的中心之间的距离再次被计算。因此,我们有:

点和两个聚类之间的最小距离用绿色表示。
我们检查每个点是否在正确的组中(即最近的聚类)。根据上表中的距离,点 6 似乎比聚类 2 更靠近聚类 1。因此,分配不是最佳的,点 6 应该被重新分配给簇 1。
第五步。在这种重新分配之后,我们再次计算聚类的中心。通过取属于群集的点的坐标 x 和 y 的平均值来找到中心。因此,我们有:

例如,3.33 就是(5 + 4 + 1) / 3。
第六步。重复步骤 4,直到分配达到最佳。如果分配是最优的,则算法停止。在我们的示例中,我们有:

所有点都被正确地分配到其最近的聚类,因此分配是最优的,并且算法停止。
第七步。陈述最终分区和中心。在我们的例子中:

现在我们有了聚类和最终中心,我们计算刚刚找到的分区的质量。记住,我们需要计算 BSS 和 TSS 来确定质量。下面的步骤通过 k 来计算这个分区的质量——意思是,基于这个汇总表:

第一步。计算 x 和 y 坐标的总平均值:

第二步。计算 TSS 和 WSS:

关于 WSS,它分为群组 1 和群组 2。对于群组 1:

对于群组 2:

总 WSS 是
WSS = WSS[1]+WSS[2]= 18.67+16.67 = 35.34
要找到 BSS:
BSS = TSS WSS = 88.67 35.34 = 53.33
最后,分区的质量是:

所以分区质量是 60.14%。
我们现在将在 r 中验证所有这些解决方案(分区、最终中心和质量)。
R 中的溶液
可以想象,R us 中的解决方案要短得多,并且在用户端需要的计算也少得多。我们首先需要以矩阵或数据框的形式输入数据:
X <- matrix(c(7, 3, 4, 5, 2, 4, 0, 1, 9, 7, 6, 8),
nrow = 6, byrow = TRUE
)
X # display the coordinates of the points## [,1] [,2]
## [1,] 7 3
## [2,] 4 5
## [3,] 2 4
## [4,] 0 1
## [5,] 9 7
## [6,] 6 8
我们现在通过以点 5 和点 6 为初始中心的kmeans()功能执行 k 均值:
# take rows 5 and 6 of the X matrix as initial centers
res.k <- kmeans(X, centers = X[c(5, 6), ],
algorithm = "Lloyd")
与前面的数据集Eurojobs.csv应用不同,其中初始中心由 R 随机选择,在第二个应用中,我们希望指定哪些点将成为两个初始中心。为此,我们需要设置centers = X[c(5,6), ]来指示有 2 个中心,它们将是点 5 和 6(如果需要,参见如何子集化数据帧的提示)。
增加参数algorithm = "Lloyd"的原因可以在 R 函数kmeans()的用法中找到。事实上, k -means 算法有几种变体。默认选择是 Hartigan 和 Wong (1979)的版本,它比手动解决方案中详述的基本版本更复杂。通过使用 Lloyd (1982)的原始版本,我们在 R 和手工中找到了相同的解决方案。要了解更多信息,您可以查阅kmeans()功能的文档(通过?kmeans或help(kmeans))并阅读提到的文章。
然后通过提取找到 R 中的解
- 带
$cluster的隔断:
res.k$cluster## [1] 1 2 2 2 1 1
点 1、5 和 6 属于聚类 1,点 2、3 和 4 属于聚类 2。
- 最终中心点的坐标用
$centers:
# We extract the coordinates of the 2 final centers, rounded to 2 decimals
round(res.k$centers, digits = 2)## [,1] [,2]
## 1 7.33 6.00
## 2 2.00 3.33
- 然后通过将 BSS 划分为 TSS 来确定划分的质量:
res.k$betweenss / res.k$totss## [1] 0.6015038
3 个结果与我们手动发现的结果相同(除了由于四舍五入导致的质量略有不同)。
分层聚类
提醒一下,与用 k -means 划分的区别在于,对于层次聚类,类的数量是而不是事先指定的。分层聚类将有助于确定最佳聚类数。
在手工和在 R 中应用层次聚类之前,让我们一步一步地看看它是如何工作的:
- 它首先将每个点放在自己的簇中,所以每个簇都是单个的
- 然后,它会根据距离矩阵中的距离合并彼此最接近的两个点。结果是少了一个集群
- 然后,它重新计算新旧聚类之间的距离,并将它们保存在新的距离矩阵中,该矩阵将在下一步中使用
- 最后,重复步骤 1 和 2,直到所有聚类合并成包括所有点的单个聚类。
有 5 种主要方法来测量集群之间的距离,称为链接方法:
- 单一链接:在合并簇之前计算它们之间的最小距离。
- 完全链接:在合并簇之前计算它们之间的最大距离。
- 平均链接:在合并聚类之前计算它们之间的平均距离。
- 质心链接:计算两个簇的质心,然后在合并它们之前计算两者之间的距离。
- Ward(最小方差)准则:最小化总的类内方差,并找到合并后导致总的类内方差最小增加的那对类。
在下面的章节中,只介绍了前三种连接方法(首先是手动连接,然后在 R 中验证结果)。
应用 3:层次聚类
数据
使用图表和下表中的数据,手动执行3 种算法(单一、完全和平均连接)并绘制树状图。然后检查你的答案在 R** 。**

## V1 V2
## 1 2.03 0.06
## 2 -0.64 -0.10
## 3 -0.42 -0.53
## 4 -0.36 0.07
## 5 1.14 0.37
手工解决方案
第一步。对于所有 3 种算法,我们首先需要根据勾股定理计算 5 个点之间的距离矩阵。提醒点 a 和点 b 之间的距离由下式得出:

我们将该定理应用于每一对点,最终得到以下距离矩阵(四舍五入到三位小数):
## 1 2 3 4
## 2 2.675
## 3 2.520 0.483
## 4 2.390 0.328 0.603
## 5 0.942 1.841 1.801 1.530
单键
第二步。从步骤 1 中计算的距离矩阵中,我们看到点 2 和 4 之间的最小距离= 0.328。0.328 对应于第一个高度(稍后在绘制树状图时会详细介绍)。因为点 2 和点 4 彼此最接近,所以这两个点放在一起形成一个组。这些组是:1,2 & 4,3 和 5。组 2 & 4 和所有其他点之间的新距离现在为:

要构建这个新的距离矩阵,请逐点进行:
- 点 1 和 3 之间的距离没有改变,因此与初始距离矩阵(在步骤 1 中找到)相比,距离没有改变,初始距离矩阵为 2.520
- 点 1 和 5 以及点 3 和 5 之间的距离也是如此;距离与初始距离矩阵中的距离相同,因为点没有改变
- 由于点 2 和点 4 现在在一起,点 1 和点 2 和点 4 之间的距离已经改变
- 由于我们应用了单连杆标准,点 1 和 2 & 4 之间的新距离对应于点 1 和 2 之间的距离以及点 1 和 4 之间的距离的最小距离
- 点 1 和 2 之间的初始距离是 2.675,点 1 和 4 之间的初始距离是 2.390
- 因此,这两个距离之间的最小距离是 2.390
- 因此,2.390 是点 1 和 2 & 4 之间的新距离
- 我们对点 3 和 2 & 4 应用相同的过程:点 3 和 2 之间的初始距离是 0.483,点 3 和 4 之间的初始距离是 0.603。这两个距离之间的最小距离是 0.483,因此点 3 和 2 & 4 之间的新距离是 0.483
- 对所有其他点遵循相同的过程
第三步。基于步骤 2 中的距离矩阵,点 3 和 2 & 4 之间的最小距离是 0.483(树状图的第二个高度)。因为点 3 和 2 & 4 彼此最接近,所以它们被组合形成一个新组,组 2 & 3 & 4。因此,分组是:1、2、3、4 和 5。我们基于步骤 2 中详述的相同过程来构建新的距离矩阵:

- 点 1 和点 5 没有改变,因此这两点之间的距离与上一步中的相同
- 从步骤 2 中,我们看到点 1 和 2 & 4 之间的距离是 2.390,点 1 和 3 之间的距离是 2.520
- 因为我们应用了单一链接标准,所以我们采用最小距离,即 2.390
- 因此,点 1 和 2 & 3 & 4 之间的距离为 2.390
- 第 5 点和第 2 点以及第 3 点和第 4 点的过程相同
第四步。基于步骤 3 中的距离矩阵,点 1 和 5 之间的最小距离是 0.942(树状图中的第三个高度)。因为点 1 和点 5 彼此最接近,所以它们被组合形成一个新的组,组 1 & 5。因此,分组是:1 & 5 组和 2 & 3 & 4 组。我们基于步骤 2 和 3 中详述的相同过程来构建新的距离矩阵:

- 唯一需要计算的距离是点 1 & 5 和 2 & 3 & 4 之间的距离
- 从上一步我们看到,点 1 和 2 & 3 & 4 之间的距离是 2.390,点 5 和 2 & 3 & 4 之间的距离是 1.530
- 因为我们应用了单一链接标准,所以我们采用最小距离,即 1.530
- 因此,点 1 & 5 和 2 & 3 & 4 之间的距离为 1.530
第五步。点的最终组合是点 1 & 5 和点 2 & 3 & 4 的组合,最终高度为 1.530。在第六步也是最后一步,高度被用来绘制树状图。
第六步。由于上面找到的点和高度的结合,画出了树状图。请记住:
- 第一个点组合位于点 2 和点 4 之间,高度为 0.328
- 第二个组合在点 3 和 2 & 4 之间,高度为 0.483
- 第三个组合位于点 1 和点 5 之间,高度为 0.942
- 最终组合在点 1 & 5 和点 2 & 3 & 4 之间,高度为 1.530
- 这正是下图所示的树状图:

在层次聚类中,树状图用于显示聚类组合的顺序。聚类之间的合并距离称为高度,在 y 轴上示出。
完全连锁
除了在计算已分组的点之间的新距离时不采用最小距离,而是采用最大距离之外,完全联动与单一联动非常相似。
下面详细描述了使用完整链接(最大值)执行分层聚类的步骤。
第一步。第一步与单链完全相同,也就是说,我们根据勾股定理计算 5 个点的距离矩阵。这为我们提供了以下距离矩阵:
## 1 2 3 4
## 2 2.675
## 3 2.520 0.483
## 4 2.390 0.328 0.603
## 5 0.942 1.841 1.801 1.530
第二步。从步骤 1 中计算的距离矩阵中,我们看到点 2 和 4 之间的最小距离 = 0.328。值得注意的是,即使我们应用了完整的链接,在距离矩阵中,这些点也是基于最小距离集合在一起的。这是所有 3 种算法的情况。3 种算法的区别在于如何计算新的点组合之间的新距离(单个连杆取距离之间的最小值,完全连杆取最大距离,平均连杆取平均距离)。0.328 对应于第一个高度(将在绘制树状图时使用)。因为点 2 和点 4 彼此最接近,所以这两个点放在一起形成一个组。这些组是:1,2 & 4,3 和 5。组 2 & 4 和所有其他点之间的新距离现在为:

为了构建这个新的距离矩阵,逐点进行,就像我们对单个连杆所做的那样:
- 点 1 和 3 之间的距离没有改变,因此与初始距离矩阵(在步骤 1 中找到)相比,距离没有改变,初始距离矩阵为 2.520
- 点 1 和 5 以及点 3 和 5 之间的距离也是如此;距离与初始距离矩阵中的距离相同,因为点没有改变
- 由于点 2 和点 4 现在在一起,点 1 和点 2 和点 4 之间的距离已经改变
- 由于我们应用了完全联动标准,点 1 和 2 之间的新距离& 4 对应于点 1 和 2 之间的距离以及点 1 和 4 之间的距离的最大距离****
- 点 1 和 2 之间的初始距离是 2.675,点 1 和 4 之间的初始距离是 2.390
- 因此,这两个距离之间的最大距离是 2.675
- 因此,2.675 是点 1 和 2 & 4 之间的新距离
- 我们对点 3 和 2 & 4 应用相同的过程:点 3 和 2 之间的初始距离是 0.483,点 3 和 4 之间的初始距离是 0.603。这两个距离之间的最大距离是 0.603,因此点 3 和 2 & 4 之间的新距离是 0.603
- 对所有其他点遵循相同的过程
第三步。基于步骤 2 中的距离矩阵,点 3 和 2 & 4 之间的最小距离是 0.603(树状图的第二个高度)。因为点 3 和 2 & 4 彼此最接近,所以它们被组合形成一个新组,组 2 & 3 & 4。因此,分组是:1、2、3、4 和 5。我们基于步骤 2 中详述的相同过程来构建新的距离矩阵:

- 点 1 和点 5 没有改变,因此这两点之间的距离与上一步中的相同
- 从步骤 2 中,我们看到点 1 和 2 & 4 之间的距离是 2.675,点 1 和 3 之间的距离是 2.520
- 因为我们应用了完全链接标准,所以我们取最大距离,即 2.675
- 因此,点 1 和 2 & 3 & 4 之间的距离是 2.675
- 第 5 点和第 2 点以及第 3 点和第 4 点的过程相同
第四步。基于步骤 3 中的距离矩阵,点 1 和 5 之间的最小距离是 0.942(树状图中的第三个高度)。因为点 1 和点 5 彼此最接近,所以它们被组合形成一个新的组,组 1 & 5。因此,分组是:1 & 5 组和 2 & 3 & 4 组。我们基于步骤 2 和 3 中详述的相同过程来构建新的距离矩阵:

- 唯一需要计算的距离是点 1 & 5 和 2 & 3 & 4 之间的距离
- 从上一步我们看到,点 1 和 2 & 3 & 4 之间的距离是 2.675,点 5 和 2 & 3 & 4 之间的距离是 1.841
- 因为我们应用了完全链接标准,所以我们取最大距离,即 2.675
- 因此,点 1 & 5 和 2 & 3 & 4 之间的距离是 2.675
第五步。点的最终组合是点 1 & 5 和点 2 & 3 & 4 的组合,最终高度为 2.675。在第六步也是最后一步,高度被用来绘制树状图。
第六步。由于上面找到的点和高度的结合,画出了树状图。请记住:
- 第一个点组合位于点 2 和点 4 之间,高度为 0.328
- 第二个组合在点 3 和 2 & 4 之间,高度为 0.603
- 第三个组合位于点 1 和点 5 之间,高度为 0.942
- 最终组合在点 1 & 5 和点 2 & 3 & 4 之间,高度为 2.675
- 这正是下图所示的树状图:

平均连锁
使用平均链接标准,在计算已分组的点之间的新距离时,采用的不是最小或最大距离,而是,正如您现在所猜测的,点之间的平均距离。
使用平均链接执行分层聚类的步骤详述如下。
第一步。步骤 1 与单个和完全连锁完全相同,也就是说,我们根据勾股定理计算 5 个点的距离矩阵。这为我们提供了以下距离矩阵:
## 1 2 3 4
## 2 2.675
## 3 2.520 0.483
## 4 2.390 0.328 0.603
## 5 0.942 1.841 1.801 1.530
第二步。从步骤 1 中计算的距离矩阵中,我们看到点 2 和 4 之间的最小距离 = 0.328。重要的是要注意,即使我们应用平均链接,在距离矩阵中,点也是基于最小距离集合在一起的。这是所有 3 种算法的情况。3 种算法的区别在于如何计算新的点组合之间的新距离(单个连杆取距离之间的最小值,完全连杆取最大距离,平均连杆取平均距离)。0.328 对应于第一个高度(将在绘制树状图时使用)。因为点 2 和点 4 彼此最接近,所以这两个点放在一起形成一个组。这些组是:1,2 & 4,3 和 5。组 2 & 4 和所有其他点之间的新距离现在为:

为了构建这个新的距离矩阵,逐点进行,就像我们对前两个标准所做的那样:
- 点 1 和 3 之间的距离没有改变,因此与初始距离矩阵(在步骤 1 中找到)相比,距离没有改变,初始距离矩阵为 2.520
- 点 1 和 5 以及点 3 和 5 之间的距离也是如此;距离与初始距离矩阵中的距离相同,因为点没有改变
- 由于点 2 和点 4 现在在一起,点 1 和点 2 和点 4 之间的距离已经改变
- 由于我们应用了平均关联标准,点 1 和 2 之间的新距离& 4 对应于点 1 和 2 之间的距离以及点 1 和 4 之间的距离的平均距离****
- 点 1 和 2 之间的初始距离是 2.675,点 1 和 4 之间的初始距离是 2.390
- 因此,这两个距离的平均距离为(2.675 + 2.390) / 2 = 2.5325
- 因此,2.5325 是点 1 和 2 & 4 之间的新距离
- 我们对点 3 和 2 & 4 应用相同的过程:点 3 和 2 之间的初始距离是 0.483,点 3 和 4 之间的初始距离是 0.603。这两个距离之间的平均距离是 0.543,因此点 3 和 2 & 4 之间的新距离是 0.543
- 对所有其他点遵循相同的过程
第三步。基于步骤 2 中的距离矩阵,点 3 和 2 & 4 之间的最小距离是 0.543(树状图的第二个高度)。因为点 3 和 2 & 4 彼此最接近,所以它们被组合形成一个新组,组 2 & 3 & 4。因此,分组是:1、2、3、4 和 5。我们基于步骤 2 中详述的相同过程来构建新的距离矩阵:

- 点 1 和点 5 没有改变,因此这两点之间的距离与上一步中的相同
- 从步骤 2 中我们看到,点 1 和 2 & 4 之间的距离是 2.5325,点 1 和 3 之间的距离是 2.520
- 因为我们应用平均链接标准,所以我们取平均距离
- 然而,我们必须考虑到第 2 和第 4 组中有 2 个点,而第 3 组中只有一个点
- 1 和 2 & 3 & 4 之间的平均距离是:[(2 * 2.5325)+(1 * 2.520)]/3 = 2.528333
- 第 5 点和第 2 点以及第 3 点和第 4 点的过程相同:[(2 * 1.6855) + (1 * 1.801)] / 3 = 1.724
第四步。基于步骤 3 中的距离矩阵,点 1 和 5 之间的最小距离是 0.942(树状图中的第三个高度)。因为点 1 和点 5 彼此最接近,所以它们被组合形成一个新的组,组 1 & 5。因此,分组是:1 & 5 组和 2 & 3 & 4 组。我们基于步骤 2 和 3 中详述的相同过程来构建新的距离矩阵:

- 唯一需要计算的距离是点 1 & 5 和 2 & 3 & 4 之间的距离
- 从上一步中,我们看到点 1 和 2 & 3 & 4 之间的距离是 2.528333,点 5 和 2 & 3 & 4 之间的距离是 1.724
- 因为我们应用平均链接标准,所以我们取平均距离,即(2.528333 + 1.724) / 2 = 2.126167
- 因此,点 1 & 5 和 2 & 3 & 4 之间的距离是 2.126167
第五步。点的最终组合是点 1 & 5 和点 2 & 3 & 4 的组合,最终高度为 2.126167。在第六步也是最后一步,高度被用来绘制树状图。
第六步。由于上面找到的点和高度的结合,画出了树状图。请记住:
- 第一个点组合位于点 2 和点 4 之间,高度为 0.328
- 第二个组合在点 3 和 2 & 4 之间,高度为 0.543
- 第三个组合位于点 1 和点 5 之间,高度为 0.942
- 最终组合位于点 1 & 5 和点 2 & 3 & 4 之间,高度为 2.126167
- 这正是下图所示的树状图:

R 中的溶液
要使用 R 中的 3 个标准中的任何一个来执行分层聚类,我们首先需要输入数据(在这种情况下,以矩阵格式输入,但也可以以 dataframe 格式输入):
X <- matrix(c(2.03, 0.06, -0.64, -0.10, -0.42, -0.53, -0.36, 0.07, 1.14, 0.37),
nrow = 5, byrow = TRUE
)
单键
由于具有参数method = "single"的hclust()函数,我们可以应用具有单一链接标准的分级聚类:
# Hierarchical clustering: single linkage
hclust <- hclust(dist(X), method = "single")
注意hclust()函数需要一个距离矩阵。如果你的数据还不是一个距离矩阵(就像在我们的例子中,矩阵X对应于 5 个点的坐标),你可以用dist()函数把它转换成一个距离矩阵。
我们现在可以提取高度并绘制树状图,以手动检查上面的结果:
round(hclust$height, 3)## [1] 0.328 0.483 0.942 1.530plot(hclust)

从树状图中可以看出,点的组合和高度与手工得到的是一样的。
最佳聚类数
请记住,层次聚类用于确定最佳的聚类数。聚类的最佳数量可以通过树状图来确定。为此,我们通常着眼于最大的高度差:

如何从树状图中确定聚类数?取高度差的最大值,数一数你看到多少条垂直线
树状图中最大的高度差出现在最终组合之前,也就是在第 2 & 3 & 4 组与第 1 & 5 组组合之前。要确定聚类的最佳数量,只需数一数在这个最大差异内您看到了多少条垂直线。在我们的例子中,聚类的最佳数量是 2。
在 R 中,我们甚至可以用rect.hclust()函数直接在树状图中突出显示这两个集群:
plot(hclust)
rect.hclust(hclust,
k = 2, # k is used to specify the number of clusters
border = "blue"
)

请注意,通过树状图确定最佳聚类数并不局限于单个连锁,它也可以应用于其他连锁方法!
下图解释了如何确定最佳集群数量:

如何确定层次聚类中的最优聚类数?来源:走向数据科学
(参见层次聚类备忘单以获得更多类似的可视化效果。)
最后,我们还可以通过高度柱状图(存储在聚类输出的$height中)来确定最佳聚类数:
barplot(hclust$height,
names.arg = (nrow(X) - 1):1 # show the number of cluster below each bars
)

再次,寻找最大的跳跃高度。在我们的例子中,最大的跳跃是从 1 级到 2 级。因此,最佳的班级数是 2。
请注意,使用树状图或柱状图来确定聚类的数量并不是一个严格的规则。您还可以考虑其他方法,如轮廓图、肘图或一些数值测量,如邓恩指数、休伯特伽玛等。,它显示了误差随聚类数( k )的变化,您选择误差最小的 k 的值。此外,由于邓恩指数(指数越高越好),可以测量聚类的良好性。然而,这些方法超出了本课程的范围,用树状图展示的方法一般就足够了。
完全连锁
由于具有参数method = "complete"的hclust()函数,我们可以应用具有完整链接标准的层次聚类:
# Hierarchical clustering: complete linkage
hclust <- hclust(dist(X), method = "complete")
注意hclust()函数需要一个距离矩阵。如果你的数据还不是一个距离矩阵(就像在我们的例子中,矩阵X对应于 5 个点的坐标),你可以用dist()函数把它转换成一个距离矩阵。
我们现在可以提取高度并绘制树状图,以手动检查上面的结果:
round(hclust$height, 3)## [1] 0.328 0.603 0.942 2.675plot(hclust)

从树状图中可以看出,点的组合和高度与手工得到的是一样的。
与单个连锁相似,树状图中最大的高度差出现在最终组合之前,即在第 2 & 3 & 4 组与第 1 & 5 组组合之前。在这种情况下,聚类的最佳数量因此是 2。在 R 中,我们甚至可以用rect.hclust()函数直接在树状图中突出显示这两个集群:
plot(hclust)
rect.hclust(hclust,
k = 2, # k is used to specify the number of clusters
border = "blue"
)

平均连锁
由于具有参数method = "average"的hclust()函数,我们可以应用具有平均链接标准的分级聚类:
# Hierarchical clustering: average linkage
hclust <- hclust(dist(X), method = "average")
注意hclust()功能需要一个距离矩阵。如果您的数据还不是距离矩阵(就像我们的例子一样,因为矩阵X对应于 5 个点的坐标),您可以使用dist()函数将其转换为距离矩阵。
我们现在可以提取高度并绘制树状图,以手动检查上面的结果:
round(hclust$height, 3)## [1] 0.328 0.543 0.942 2.126plot(hclust)

从树状图中可以看出,点的组合和高度与手工得到的是一样的。
像单个和完全连锁一样,树状图中最大的高度差出现在最终组合之前,也就是说,在第 2 & 3 & 4 组与第 1 & 5 组组合之前。在这种情况下,聚类的最佳数量因此是 2。在 R 中,我们甚至可以用rect.hclust()函数直接在树状图中突出显示这两个集群:
plot(hclust)
rect.hclust(hclust,
k = 2, # k is used to specify the number of clusters
border = "blue"
)

k-means 与层次聚类
聚类是一种主观的统计分析,根据手头的数据集或要解决的问题类型,可能有不止一种合适的算法。因此,在均值和层次聚类之间做出选择并不容易。如果您有充分的理由认为您的数据集中有特定数量的聚类(例如,如果您想根据一些特征区分患病和健康的患者,但您不知道患者属于哪个组),您可能应该选择k-这意味着聚类,因为当组的数量预先指定时,会使用这种技术。如果您没有任何理由相信您的数据集中有一定数量的组(例如,在营销中,当试图区分客户时,没有任何关于不同类型客户数量的预先信念),那么您可能应该选择层次聚类来确定您的数据应该划分为多少个聚类。
除此之外,如果你仍然犹豫不决请注意,一方面,对于大量的变量, k -means 在计算上可能比层次聚类更快,如果聚类的数量很少。另一方面,分层聚类的结果是一个比由kmeans 返回的非结构化平面聚类集更具信息量和可解释性的结构。因此,在 k 均值的情况下,通过查看层次聚类的树状图来确定聚类的最佳数量比试图预先预测该最佳数量更容易。
感谢阅读。我希望这篇文章能帮助您理解不同的聚类方法,以及如何手工和在 r。
和往常一样,如果您有与本文主题相关的问题或建议,请将其添加为评论,以便其他读者可以从讨论中受益。
相关文章:
- 安装和加载 R 包的有效方法
- 我的数据符合正态分布吗?关于最广泛使用的分布以及如何检验 R 中的正态性的注释
- R 中的 Fisher 精确检验:小样本的独立性检验
- R 中独立性的卡方检验
- 如何在简历中创建时间线
参考
哈迪根 J. A .和 M. A. Wong。1979."一个 K-均值聚类算法."应用统计学28:100–108。
劳埃德斯图尔特。1982." Pcm 中的最小平方量化." IEEE 信息论汇刊第 28 卷第 2 期。IEEE:129–37。
原载于 2020 年 2 月 13 日 https://statsandr.com。**
面向数据科学的 Jupyter 笔记本完全指南
Ipython 笔记本初学者指南

Python 可以以多种方式运行,常见的方法包括使用终端或使用 python shell 运行 python 脚本。随着数据分析/科学成为新闻,我们有了基于 ipython 的 jupyter 笔记本,初学者和专家都在使用。
Ipython 为交互式 python 开发提供了一个 REPL (Read-Evaluate-Print-Loop)外壳。它使我们能够使用 GUI 工具包可视化图表和绘图,并为 jupyter 提供了一个内核。

具有简单情节的 Ipython shell
Project Jupyter 继承了 Ipython Notebook,它基于 Ipython,因为它利用其内核来完成所有计算,然后将输出提供给前端接口。内核为 Jupyter 笔记本提供了多语言支持(R、Python、Julia、Java 等),并扩展了 Ipython 的存储和输出功能,以构建一个超级直观和交互式的基于浏览器的 GUI。在我们的 Harshit 数据科学系列中,我们将关注使用 Jupyter 笔记本学习 Python。
让我们从 Jupyter 笔记本开始吧…
Jupyter 笔记本的一切
安装先决条件
首先,您必须有正确的环境设置,以便使用 jupyter 笔记本开始任何项目。这里是设置 python 环境指南的链接
设置 python 环境以开始数据科学项目的指南。
towardsdatascience.com](/ideal-python-environment-setup-for-data-science-cdb03a447de8)
创建新笔记本
现在,一旦您使用 conda 设置了 python 环境。激活您的环境并导航到您的工作目录。现在,要启动 jupyter notebook,输入终端jupyter notebook来实例化一个新的本地主机服务器。

这将打开您输入命令的目录结构。
这里是我的dswh目录的主页:

如上图所示,共有 3 个选项卡:
- 文件— 这是保存您所有文件和目录的地方。
- 运行— 跟踪所有正在运行的进程。
- 集群— 该选项卡允许您控制扩展的 ipython 内核的各个引擎。它是由 Ipython 并行计算框架提供的。

现在,要创建一个新笔记本,你必须点击 新建 下拉菜单,然后点击 Python 3 。
这是为您创建的新无标题 jupyter 笔记本,并在新标签页中打开。您可以通过单击顶部的名称字段或从目录中重命名该文件。

如果您现在在另一个选项卡中查看您的目录,有一个名为 Untitled.ipynb 的新文件以绿色突出显示,表示它当前正在运行。
一个. ipynb 文件包含什么?
标准的 jupyter 笔记本文件格式是。ipynb 。它是一个文本文档,以包含笔记本内容的 JSON 格式存储。笔记本中可能有许多单元,每个单元的内容可以是 python 代码、文本或视频附件,它们已被转换为文本字符串,并可与笔记本的元数据一起使用。
如果您想手动进行更改,可以使用编辑选项编辑所有这些信息。尽管这很少被要求。
演练界面
为您创建的笔记本开始工作后,您可以查看位于顶部的笔记本的名称,它现在必须是无标题的。

在标题下面,我们有一个菜单栏,里面有很多可用的选项和功能,即文件、视图、单元格等,还有一些常用的图标。运行图标是您执行单元所需的图标。右侧的命令选项板图标列出了所有键盘快捷键。
Ipython 内核

忙碌的内核的形象
内核是一个运行并解释用户代码的程序。Jupyter Notebook 使用的不同语言有不同的内核,但对于 Python,它扩展了 Ipython 内核。
内核执行单元中的代码,并将输出(如果有)返回给前端接口。内核的状态与整个文档有关,而不仅仅是单个的单元格。在一个单元中实现的任何东西都可以在下一个单元中使用。
我们可以使用各种内核设置选项:
- 中断—停止任何无法产生任何输出的停滞操作。
- 重新启动—它以空白状态重新启动内核。
- 重启并清除输出—它将重启并清除所有显示的输出。
- 重启并运行全部——它将重启内核,然后从头开始运行所有单元。
- 关闭—关闭内核。
笔记本电池
jupyter 笔记本中有 4 种类型的单元格:
- Code — 这是我们编写 python 代码的单元格,这些代码将由 ipython 内核计算,输出显示在单元格下。这是一个代码单元的例子。

- Markdown — 这是您添加文档的地方,通过使用 Markdown 放置格式化的文本。运行时,输出显示在单元格的位置。


以下是降价备忘单的链接,供您参考:
这旨在作为快速参考和展示。欲了解更完整的信息,请参阅约翰格鲁伯的原始规格和…
github.com](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet)
- Raw NBConvert — 这是另一个工具,可以将你的 jupyter 笔记本转换成另一种文件格式,如 PDF、HTML 等。
4.标题— 这与在 Markdown 中写标题(以#开头的行)是一样的。要给你的笔记本添加标题,你可以使用这个。
无论是哪种类型的单元,都需要运行每个单元来查看输出。你可以使用顶部任务栏中的运行选项,也可以按下键盘上的 (Shift + Enter) 命令。
当每个单元运行时,它将显示带有星号标记的单元,如[*] 中的,一旦获得输出,该单元将变成[1] 中的。
分享您的分析/工作
我添加 git 作为数据科学项目环境设置的一部分,部分原因是为了与你的前辈、潜在雇主、开源社区等分享你的分析。但是您可能并不总是需要共享代码,而是共享您从分析中获得的洞察力的静态预呈现版本。
现在,有几种方法可以共享您的笔记本:
- 将笔记本的精确副本导出为 HTML、Markdown 或 PDF。您可以使用文件菜单中的
Download as按钮。

2。GitHub —你可以分享你的 GitHub 公共资源库的链接,或者在你的私人项目中添加合作者。Github 拥有超过 200 万台笔记本电脑,是托管您的。ipynb 文件。此外,GitHub 允许您查看。ipynb 文件,因为您可以在本地查看它们。
- 以下是学习使用 GitHub 和其他指南的链接:
[## GitHub 指南
GitHub 非常适合管理围绕代码的所有信息。本指南有助于解释我们的问题跟踪系统…
guides.github.com](https://guides.github.com/)
3。nbviewer — 这是最简单也是最流行的渲染笔记本的工具。这是来自 Project Jupyter 的免费工具。它只需要你托管的 Jupyter 笔记本的 URL,无论是在 GitHub、Bitbucket 还是其他地方,NBViewer 都会为你提供一个你的笔记本的渲染版本以及一个可共享的链接。以下链接:
在此输入 Jupyter 笔记本的位置以进行渲染:
nbviewer.jupyter.org](https://nbviewer.jupyter.org/)
结论
编程 python 被这些笔记本赋予了新的画面。现在,您可以利用这些功能,开始您的数据科学之旅,这些单元格包含您的逐步分析以及文档和可视化见解。
下一篇文章是关于数据科学的基础 Python。敬请关注 Harshit,继续学习数据科学。
Harshit 的数据科学
通过这个渠道,我计划推出几个涵盖整个数据科学领域的系列。以下是你应该订阅频道的原因:
- 该系列将涵盖每个主题和副主题的所有必需/要求的高质量教程。
- 解释了为什么我们在 ML 和深度学习中做这些事情的数学和推导。
- 与谷歌、微软、亚马逊等公司的数据科学家和工程师以及大数据驱动型公司的首席执行官的播客。
- 项目和说明,以实现迄今为止所学的主题。
你可以在 LinkedIn 、 Twitter 或 Instagram 上与我联系(在那里我谈论健康和福祉。)
注意:在这些黑暗的时期,自我隔离为自我提升腾出了一些空间,我们可以利用这些空间来发展新的技能、爱好,并帮助未来的自己。
线性回归分析完全指南
这篇文章是关于理解所有统计术语的线性回归。

介绍
在这篇文章中,我们将一步一步地用线性回归分析一个商业问题,并试图解释每一步的统计术语,以理解其内部运作。虽然线性回归算法很简单,但为了进行正确的分析,应该解释统计结果。
首先,我们将看看简单的线性回归,然后将问题扩展到多元线性回归。
为了便于理解,请跟随 python 笔记本一起看。
什么是线性回归?
回归是寻找变量之间关系的统计方法。因此,线性回归假设变量之间存在线性关系。根据输入变量的数量,回归问题分为
1)简单线性回归
2)多元线性回归
商业问题
在本文中,我们使用的是广告数据集。
让我们考虑有一家公司,它必须提高产品的销售。该公司花钱在不同的广告媒体上,如电视、广播和报纸,以增加其产品的销售。公司记录在每个广告媒体上花费的钱(以千美元计)和售出的产品数量(以千单位计)。
现在,我们必须帮助公司找到最有效的方法,在广告媒体上花钱,以较少的广告预算提高下一年的销售额。
简单线性回归
简单线性是一种基于单一预测变量 x 预测定量响应 Y 的方法。

这是斜率为β1、截距为β0 的直线方程。
让我们用简单的线性回归开始给定广告数据的回归分析。最初,我们将考虑电视广告媒体的销售额和花费的简单线性回归模型。
那么数学方程式就变成了 𝑆𝑎𝑙𝑒𝑠 = 𝛽0 + 𝛽1 * 𝑇𝑉.
第一步:估计系数:(让我们找到系数)
现在,为了找到广告预算的销售额估计值,我们必须知道β1 和β0 的值。对于最佳估计,预测销售额和实际销售额之间的差异(称为剩余)应该是最小的。

由于残差可能是负的或正的,因此在计算净残差时,它可能导致抵消项和净效应的减少,从而导致系数的非最佳估计。为了克服这一点,我们使用残差平方和(RSS)。

通过简单的计算,我们可以找到最小 RSS 值的β0 和β1 的值。

使用 python 中的 stats 模型库,我们可以找出系数,

表 1:电视销售的简单回归
β0 和β1 的值分别为 7.03 和 0.047。那么关系就变成了, *销售额= 7.03 + 0.047 电视。
这意味着如果我们在电视广告媒体上多花 1000 美元,产品的销量就会增加 47 个单位。
这让我们看到电视广告媒体与销售的关联是多么强烈。
步骤 2:评估系数估计的准确性(这些系数有多准确?)
为什么系数不是完美的估计值?
真实的关系可能不是完美的线性关系,因此使用更复杂的模型(如多项式回归模型)可以减少误差。这些类型的误差称为 可约误差。
另一方面,由于测量和环境条件的误差,可能会引入误差,例如由于大雨影响销售,办公室关闭一周。这些类型的误差称为 不可约误差 。
由于这些误差,我们可以说这些系数不是完美的估计。
现在, 如何解决这些错误?
为了找出系数估计中的误差,我们使用标准误差(se)。系数的 SE 代表观察值偏离回归线的平均距离。如果一个变量的系数估计的标准误差较小,那么该模型可以更精确地估计该变量的系数。
TV 和截距系数的 SE 可由下式给出:

标准误差用于计算,
1]置信区间:
95%置信区间意味着该范围有 95%的概率包含参数的真实未知值。该范围由上限和下限定义。a β的 95%置信区间可以计算为 β 2SE(β)。*
从表[1], 可以看出,β0 的 95%置信区间为[6.130,7.935],这表明在没有任何广告的情况下,平均销量将在 6,130 至 7,935 辆之间。
β1 的 95%置信区间为[0.042,0.053]显示,电视广告每增加 1000 美元,销量平均会增加 42 至 53 台。
2]要进行假设检验:
现在借助假设检验让我们弄清楚, 销售和电视广告预算之间是真的有关系/关联还是我们偶然得到的结果?
让我们定义模型的假设。
H0 =销售和电视广告之间没有关系。(β1 = 0)
Ha =销售和电视广告是有关系的。(β1 ≠ 0)
为了证明销售和电视广告预算之间存在真实的关系/关联,我们需要确定 β 1 离零足够远,这样我们就可以确信 β 1 在计算的 SE 下非零。
求β1 离零有多远(这个,取决于 β 1 的精度——也就是取决于 SE( β 1)。)我们使用 t 统计量作为

从表[1]中可以看出, β 1 的 t 统计值是 17.668。
让我们考虑显著性水平(α) = 0.01,它是当零假设为真时做出错误决策的概率。

t 分布
我们可以用两种方法进行假设检验
1】临界值法:
双尾假设检验中α = 0.01 的临界值是 2.345 的意思是,0.01 的面积等于 t 值 2.345,如图所示。
现在根据上面的公式计算出来的 t 值是 17.668。由于计算出的 T 值在数值上大于临界值,因此它落在如图所示的剔除区域内。
所以我们有足够的证据拒绝零假设。
所以β1 ≠ 0。
2】P 值法
t 统计= 17.668 的 p 值为 0.0001。
即假设零假设(β1 = 0)为真,获得等于或大于 17.668 的 T 值的概率仅为 0.0001。
显著性水平(α) = 0.01 意味着只有当至少有 1/100 的机会获得等于 17.668 或极值的 T 值时,我们才能接受零假设。所以作为 P 值(0.0001) << α (0.01) So we can reject the null hypothesis. Simply, the P-value is area corresponds to the given test statistics.
So, from the above results, we can conclude that β 0 ≠ 0 和≠ 0。
关于假设检验的详细了解,可以阅读这篇文章。
第三步:模型的准确性(模型与数据的吻合程度如何?)
在验证了系数之后,现在我们要量化模型与数据的拟合程度。这可以通过剩余标准误差(RSE)和 R 平方统计来评估。

剩余标准误差(RSE):
尽管我们知道未知系数的真实值( β 0 和 β 1),但是由于不可约误差(如前所定义的ε),也将存在等于 RSET5 的平均误差量,并且它由下式给出:

对于线性回归的广告数据,我们的 RSE 值等于 3.242,这意味着实际销售额平均偏离真实回归线约 3 、 260 台。
RSE 是模型的与数据在 y 方向上的【不匹配】的度量。残差越低,模型与数据的匹配越好(在这种情况下,数据越接近线性关系)。****
RSE 没有固定的比例,价值以 Y(电视广告)表示,为了克服这一点,我们使用 R 平方统计。
R 平方统计:

其中 TSS(总平方和)和 RSS(剩余平方和)

R 平方统计测量 Y 中可以用 x 解释的可变性的比例。如果 R 平方统计接近 1,则表明响应中的大部分可变性已经由回归解释。R 平方统计值始终介于 0 和 1 之间。
该模型的 R 平方统计值为 0.61,这意味着只有 61%的销售可变性可以通过电视上的线性回归来解释。
现在我们已经借助简单的线性回归分析了电视广告和销售之间的关系。用类似的方法,让我们用简单的线性回归分析广播广告、报纸广告和销售之间的关系。
电台销售的简单线性回归

表 2:电台销售的简单线性回归

报纸销售的简单线性回归

表 3:报纸销售的简单线性回归

现在从上面的结果中,我们可以看到简单的线性回归不能解释销售中的可变性,并且模型不能很好地工作。
让我们看看多元回归是如何工作的,
多元线性回归:
在多元线性回归中,我们将一起分析销售和三种广告媒体之间的关系。
**𝑆𝑎𝑙𝑒𝑠 = 𝛽0 + 𝛽1 * 𝑇𝑉 + 𝛽2 电台+ 𝛽3 报纸+艾司隆
现在让我们遵循类似于简单线性回归的步骤,
1]估计系数:

表 4:电视、广播、报纸销售的多元线性回归
上表显示了当电视、广播和报纸广告预算用于预测产品销售时,使用广告数据的多元回归系数估计值。
**𝑆𝑎𝑙𝑒𝑠 = 2.94 + 0.045 * 𝑇𝑉 + 0.189 广播+ (- 0.001) 报纸
我们可以分析出报纸的系数估计值接近于零,p 值不再显著(p 值> > 0.005),其值约为 0 。 86。这表明花在报纸广告媒体上的钱与产品的销售无关。
问)为什么在多元线性回归的情况下花在报纸广告媒体上的钱与产品的销售没有关系,而在另一方面用简单的线性回归,这个变量是高度显著的?
现在为了理解为什么会发生这种情况,让我们分析一下相关矩阵。

广告数据的相关矩阵
广播和报纸之间的相关性为 0.354,这揭示了在广播花费更多的市场中,报纸广告花费更多的趋势。销售与报纸广告的相关性较小,这说明报纸广告对销售没有直接影响。
花在报纸广告上的钱越多,花在电台广告上的钱就越多,所以电台广告预算的增加会增加销售额。简单的线性回归只检查销量与报纸的对比,所以报纸因广播对销量的影响而获得好评。
因此,从上面的分析,我们可以说,报纸广告变量没有增加产品的销售。因此,让我们通过移除报纸广告变量来建立一个模型。

表 5:电视和广播销售的多元线性回归
*𝑆𝑎𝑙𝑒𝑠 = 2.92 + 0.045 * 𝑇𝑉 + 0.188 电台
模型比较

表 6:模型比较
从上表中,我们可以说,电视和广播销售的多元线性回归将给出一个更好的销售估计。
商业计划:
从上面的回归分析,让我们创建一个商业计划,帮助公司明智地花钱。
1】哪些媒体对销售没有贡献?
花在报纸广告媒体上的钱不影响销量。
****2】每种媒介对销售的作用有多大?
系数估计值越大的广告媒体对销售的影响越大。
从电视和广播销售的多元线性回归来看(表 6),广播广告对销售的影响最大。在广播广告和电视广告上每花 1000 美元,产品的销售量就会分别增加 188 和 45 个单位。
3】这种关系有多牢固?**
表 6 显示了模型精度测量的比较。电视和广播销售的多元线性回归的 RSE 值为 1.67。销售额的平均值为 14022,因此百分比误差为 1670/14022 ≈ 12%。
r 的平方值为 0.90,这表明 90%的销售差异可以通过电视和广播销售的多元线性回归来解释。
我们能多准确地预测未来的销售额?
为此,我们使用置信区间和预测区间。预测区间比置信区间宽,因为预测区间捕捉不可约误差。
5】销售和广告预算有关系吗?
在简单线性回归的情况下,我们通过使用 t 统计来进行假设检验,以查看电视广告和销售之间是否有任何关系。
同样,对于多元线性回归,我们可以执行 f 检验来检验假设,
H0: β1 = β2 = = βp = 0
Ha:至少有一个βj 非零。
资源
最后,我想提几个很棒的资源,你可以用它们来学习更多关于线性回归的知识。
结论
在本文中,我们回顾了什么是线性回归,它是如何工作的,以及我们如何在用 python 实现建模的每一步分析结果。
如果您有任何问题,请随时在 LinkedIn上给我发 DM或留下评论。
破解系统设计面试的完整指南
回答任何系统设计问题的模板&所有附加系统设计问题的链接。

图片由 Ben kolde 在 Unsplash 上提供
这篇文章由 3 部分组成—准备指南、系统设计模板和带链接的设计问题。
对于我在亚马逊的系统设计面试,我观看了视频讲座,阅读了博客文章,并与我的朋友讨论了设计系统的各种方法。在我做了大量准备后,我想出了一个模板,我在面试时遵循了这个模板,我想与大家分享,并希望它能帮助任何准备系统设计面试的人。
准备
首先,在设计系统之前,学习基本概念是很重要的。了解所有的概念有助于你在设计系统时做出正确的决定。
这个精选的 YouTube 播放列表涵盖了理解系统设计步骤所需的所有概念。
系统设计概念播放列表
(可选)有关更全面的概念,请参考下面的 Github repo。
学习如何设计大型系统。准备系统设计面试。学习如何设计可扩展的系统…
github.com](https://github.com/donnemartin/system-design-primer/blob/master/README.md)
学完所有的基本概念后,现在是设计的时候了。首先,你要想出一个用例(例:Instagram),并尝试设计所有的组件。主要考虑如何让你的系统,容错(系统一直启动运行),以及可伸缩(处理不断增长的流量)。集体讨论如何解决瓶颈。这整个过程帮助你应用你在设计系统中学到的概念。如果您在设计系统时遇到任何困难,请参考下面提供的设计模板。
我给你的建议是使用这个系统,探索所有的功能
问自己的问题
- 有哪些不同的架构组件可以使用?
- 这些组件是如何相互作用的?
- 我们如何最好地利用这些组件:什么是正确的权衡?

来源:腮红
提示 :你问面试官的问题越多,你从面试官那里得到的信息就越多,你的设计就越好。
面试要点:
不要使用任何流行词汇(技术堆栈),不要过早地进入细节,证明你的设计决策
面试系统设计模板
1。要求
功能性
系统或应用程序能为用户提供什么功能?例如:在 Twitter 中,一个用户可以关注另一个用户,发推文,喜欢一条推文,转发其他人的推文,并分享一条推文(专注于基本功能,不要钻研 Twitter 的复杂功能)
非功能性
强制知道 上限定理 : 博客
对于任何分布式系统,以下是需要考虑的基本概念:
- 高可用性:大部分系统必须具有高可用性。
- 一致性:具有高可用性的系统将具有最终的一致性。任何银行系统都倾向于一致性而不是可用性,因为数据(账户余额)中不能有差异。
- 可靠性:不丢失用户数据。
- 延迟:用户行为的响应时间,比如加载网页、喜欢帖子等。
2。存储估计
- 基于数据形态:粗略估计必须存储多少数据,以了解可以使用什么类型的数据库和用于存储图像/视频的文件存储。
- 对服务的请求数量 —了解如何扩展服务。读取量大的服务可以进行扩展,以处理高流量的请求。
- 读写比率 —决定系统是否为重读。
3。数据库设计
在讨论了数据和用户可以执行的与系统交互的动作之后。下一步是谈论你将使用哪种类型的数据库以及为什么。有关 SQL 与 NoSQL 的详细区别,请阅读
4。高层系统设计
最初从一个非常基本的设计开始

作者照片
扩展设计—创建特定组件
- 隔离服务——便于扩展和流量控制

作者照片
- 复制服务和数据库——提到单点故障——视频
- 负载均衡器 —应用端&数据库端如果需要— 视频,博客
- 消息队列 —紧密耦合到失去耦合/同步到异步通信—读取消息队列,MQ 的好处
- 数据划分 —基于位置、基于用户标识— 视频、博客
- 内容交付网络 —避免往返主服务器(减少延迟)。视频,面试提问
- 缓存 —分布式缓存和客户端缓存(用于更快的读取访问)——视频、博客、初级
5。附加组件(可选)
如果您在面试中还有时间,可以将这些组件添加到设计中。了解这些组件有助于您回答任何深入的后续问题。一般来说,上面提到的部分就足够了,也会占用你面试的大部分时间。
- 加密 (msgs) —用于消息服务以保护数据— 博客
- 分析服务 —用于分析请求和用户数据
- ML 服务 —推荐/新闻订阅排名(如果用例(网飞)需要,则将其添加到基本组件中)—讨论您的推荐/排名模型所需的数据。
- API 网关 — 视频,详细微服务,API 网关— 播放列表
- 服务发现 —动态识别微服务— 视频
按照这个模板,任何系统都可以在面试中设计出来。
免责声明:以下提供的视频链接是一个系统的详细设计,可以参考真实系统的深入设计。教育性博客链接简洁明了,涵盖了特定系统的设计概念的使用。
设计问题
一般服务
社交媒体系统
云服务
视频流
视频是主要数据,必须存储不同格式的视频。推荐服务在这里很关键。
类似的系统:YouTube,Prime Video。
网上购物
- 亚马逊 : 视频
类似的系统:沃尔玛、Airbnb、易贝
消息系统
对于消息传递系统来说,了解 HTTP、长池和 WebSockets 之间的区别是很重要的
- WhatsApp : 视频
驾驶室使用案例
类似系统:Lyft
视频会议
- 变焦 : 视频
类似的系统:Skype,Google Meet
餐厅审查系统
约会应用
- 火绒:视频
支付服务
什么是支付网关:视频
- 贝宝
游戏
管理系统
类似的系统:图书馆管理系统,电影预订,酒店预订,机票预订。
谷歌地图 : 视频
结论:我是根据自己的理解,在准备系统设计面试后写的这篇博客。这个博客通过整合所有与系统设计相关的重要资源来帮助软件工程师准备面试。
资源
学习如何设计大型系统。准备系统设计面试。学习如何设计可扩展的系统…
github.com](https://github.com/donnemartin/system-design-primer/blob/master/README.md) [## 科技假人
我的名字是那仁,我在这里帮助你学习软件工程工作所需的技能,也帮助…
www.youtube.com](https://www.youtube.com/channel/UCn1XnDWhsLS5URXTi5wtFTA) [## 高拉夫·森
算法和系统设计是强有力的结合!以下是我谈论的一些事情:1)竞争性编程…
www.youtube.com](https://www.youtube.com/channel/UCRPMAqdtSgd0Ipeef7iFsKw) [## 达到目标
在这个频道中,我将谈论 1)系统设计 2)软件开发原则、操作问题 3)…
www.youtube.com](https://www.youtube.com/channel/UCY8JVhRabrcrqDJ9gi9lHNg) [## 探索系统设计面试——互动学习
系统设计问题已经成为软件工程面试过程的标准部分。在这些方面的表现…
www.educative.io](https://www.educative.io/courses/grokking-the-system-design-interview)
神经网络的完整有趣和复杂的历史!
关于 DL 的一切
重温人工神经网络发展背后的迷人历史

我们将会看到神经网络的历史。在彻底查阅了各种资料后,我发现神经网络的历史激起了我的兴趣,我开始全神贯注。我玩得很开心,因为研究这个话题是令人满意的。下面是目录的列表。随意跳到你最感兴趣的话题。
目录:
- 介绍
- 思想和观念的产生
- 黄金时代
- 进步
- 神经网络的失败与解散
- 神经网络的重新出现和完全统治
- 结论
简介:
自上个世纪以来,神经网络和人工智能一直是一个热门话题。不可否认,人工智能机器人在流行文化电影中接管世界的流行引发了许多好奇的想法。神经网络从生物神经元中提取灵感。神经网络是一种受编程范式启发的方法,它使深度学习模型能够在复杂的观察数据集上有效地学习和训练。神经网络在上个世纪经历了不同的阶段。神经网络从一个解决复杂计算问题的强大前景,然后被嘲笑为仅仅是一个理论上的想法,最后,突出了一个更可取的未来。让我们按时间顺序回顾一下神经网络历史上的每个阶段。
注意:这将是题为“深度学习的一切”系列的第一部分在这个主题中,我们将尝试涵盖每一个事实,算法,激活函数,以及人工神经网络和深度学习的未来。今天,我们将从神经网络的完整历史开始。在接下来的部分中,我们将涵盖实现神经元功能的基础知识,在后续部分中,我们将涵盖与深度学习相关的所有概念。

思想和观念的产生:
自上个世纪以来,生物学家、神经学家和研究人员一直在研究神经元的功能。美国哲学家威廉·詹姆斯(William James)在 1890 年提出了一个颇有见地的理论,该理论反映了许多研究人员的后续工作。简单来说,该假说认为,大脑皮层中任何给定点的活动都是整体运动趋势的总和。简单地说,在下面的陈述中,它意味着一个神经元的兴奋会刺激所有其他的神经元,直到信号成功地到达目标。
1943 年,麦卡洛克和皮茨为单个神经元建立了第一个数学模型。所构建的神经元模型是全面而深远的。即使在现代,这种模型也被修改和广泛使用。这一时刻给神经网络的研究者和实践者带来了巨大的思想转变。大多数生物学家对类似人脑的神经元模型的数学功能感到惊讶。从这一刻开始,支持人工智能成功的热潮和对人工智能接管世界的担忧开始了。
在下一系列教程中,我们还将更详细地了解这些概念。从头开始理解神经网络的每个概念,包括单个神经元的工作,也将在本系列中完成。
黄金时代:
从 1949 年到 1969 年,在接下来的二十年里,进行了大量的实验。现有的方法有了巨大的发展和扩展。说这一时期是神经网络的黄金时代不会错。由于唐纳德·赫布在其名为《行为的组织》的书中引入了赫布理论,这个时代开始了。简而言之,Hebbian 理论指出,在特定的突触上,电导随着一个神经元被另一个神经元重复激活而增加。
在这一阶段,在学习过滤器、梯度下降、神经动力学的发展以及大规模大脑活动的触发和传播等突出主题方面有了一些进展。在同步激活多个神经元以代表每一位信息方面有广泛的研究。具有香农熵原理的信息论成为该领域的一个重要研究领域。然而,最重要的发明是罗森布拉特在 1958 年提出的感知机模型。
感知器模型是神经网络中最重要的发现之一。Rosenblatt 介绍的反向传播方法对于训练多层网络是有用的。由于广泛的研究和持续的发展,这个时代无疑是神经网络的黄金时代。泰勒构建了一个赢者通吃的电路,输出单元之间的抑制和感知机模型中的其他进展也完成了。
进步之处:
在 20 世纪 70 年代至 90 年代,有许多课题被研究和调查。不幸的是,事态发展毫无结果。人们研究了许多神经元的组合,以形成比单个神经元更强大的神经网络,并执行复杂的计算。由于梯度下降法在获得复杂任务的期望解方面不成功,所以有必要发展其他数学随机、概率或随机方法。在此期间,进一步的理论结果和分析得以确立。
用于复杂计算问题的玻尔兹曼机器和混合系统也在进步时期成功地完成了。玻尔兹曼机器成功地解决了数学问题。由于硬件和软件的限制,无法实现对各种缺陷的解决方案。然而,在此期间,进行了大量成功的研究。在此期间,对现有研究进行了更新和改进。
然而,尽管取得了这些进步,但没有什么对神经网络的发展至关重要或富有成效。对人工神经网络的迅速增长的需求不再存在。其中一个重要的原因是由于一个简单的感知器的局限性演示。Minsky 和 Papert 在 1969 年进行了这个演示,展示了简单感知机的缺陷。它从理论上证明了简单的感知器模型在计算上是不通用的。这一时刻臭名昭著,因为它标志着神经网络的黑色一天。对神经网络领域研究的资金支持急剧减少。这个动作引发了神经网络的崩溃。
神经网络的失败和解散;
在此期间,对人工神经网络的宣传达到了前所未有的高峰,但在适当的时候,所有与神经网络相关的宣传都消失了。人工智能成为下一个大事件,不再是知识分子的话题。人工神经网络和深度学习被嘲笑为只是一个理论概念。出现这种情况的主要原因是缺乏数据和先进技术。
当时,没有足够的资源来计算复杂的任务,如图像分割、图像分类、人脸识别、基于自然语言处理的聊天机器人等。在此期间可用的数据非常有限,没有足够的数据用于复杂的神经网络架构来提供所需的结果。尽管如此,即使有了所需的数据,用当时可用的资源来计算如此大量的数据也是一项极具挑战性的任务。
有乐观的迹象,如强化学习的成功和其他较小的积极因素。不幸的是,这还不足以重建它曾经的大规模宣传。多亏了具有非凡眼光的研究人员和科学家,他们才能够在人工神经网络领域继续发展。然而,对于人工神经网络来说,要恢复它们失去的声望和宣传,还需要 20 年的时间。
神经网络的重新出现和完全统治;
接下来的二十年对于深度学习的状态和普及来说是干涸的。在这个时代,支持向量机(SVM 的)和其他类似的机器学习算法更占优势,并被用来解决复杂的任务。对于大多数数据集,机器学习算法表现良好,但是对于更大的数据集,机器学习算法的性能没有显著提高。机器学习算法的性能在某个阈值之后停滞不前。能够随着数据的增加而不断学习和改进的模型变得非常重要。
2012 年,乔治·e·达尔(George E. Dahl)领导的团队利用多任务深度神经网络预测一种药物的生物分子靶点,赢得了“默克分子活性挑战”。2014 年,Hochreiter 的团队使用深度学习来检测营养物质、家用产品和药物中环境化学物质的脱靶和毒性效应,并赢得了 NIH、FDA 和 NCATS 的“Tox21 数据挑战”。(参考:维基)
一个革命性的时刻就在这个时候开始了,深度神经网络现在被认为是游戏规则的改变者。深度学习和神经网络现在是任何高水平比赛的显著特征。卷积神经网络、长短期记忆(LSTM 氏)和生成对抗网络非常受欢迎。
深度学习的强化每天都在快速增加,尤其是有了巨大的改进。看到深度神经网络和人工智能的未来令人兴奋。
结论:

神经网络的旅程是即将到来的时代要记住的。神经网络和深度学习从一个奇妙的前景发展到现在成为解决几乎任何复杂问题的最佳方法之一。我很高兴看到深度学习领域将会发生的进步,我很高兴我是能够为这一变化做出贡献的当代人的一部分。
大多数阅读这篇文章的观众可能也很感兴趣。在题为“关于 DL 的一切”的系列中,我将尝试涵盖从神经网络的历史到每个深度学习算法和架构的工作和理解的每个主题让我们在这个旅程中团结一致,征服深度学习。你可能会喜欢的其他文章—
[## 5 个关于 Python、机器学习和深度学习的超棒的计算机视觉项目创意!
讨论 5 个很酷的计算机视觉项目,学习新的技能,增强你的简历
towardsdatascience.com](/5-awesome-computer-vision-project-ideas-with-python-machine-learning-and-deep-learning-721425fa7905) [## 人工智能的 6 个最佳创业选择
想用 AI 创业成功?
towardsdatascience.com](/6-best-startup-choices-with-artificial-intelligence-360260ccf89e) [## 虚拟助手项目——走向数据科学
阅读《走向数据科学》中关于虚拟助手项目的文章。分享概念、想法和…
towardsdatascience.com](https://towardsdatascience.com/tagged/virtual-assistant-project)
我希望你们都喜欢阅读这篇文章。祝你有美好的一天!
大自然的计算机
细胞自动机和自然系统中计算的出现

金锥布,一种有毒的海螺。它的外壳模式类似于细胞自动机。(来源:维基百科)
计算历史上最重要的里程碑之一是通用图灵机的想法,这是一种概念化的机器,旨在对任何输入数据运行任何程序。20 世纪 30 年代,数学家和计算机科学家艾伦·图灵证明了这种机器确实存在。十年后,在 1945 年,物理学家约翰·冯·诺依曼提出了这样一个通用机器的实际外观设计。它将包含:
- 执行计算的处理单元,
- 存储数据和指令的存储单元,以及
- 一种读取输入和显示输出的机制。
这个设计被称为冯-诺依曼架构,它是今天几乎每一台现代计算机的蓝图。据说是图灵完全。
我们可以向这样一台图灵完备机器抛出各种各样的问题。例如,考虑多数类问题:在 0 和 1 的输入字符串中,两者中的哪一个是多数?对于配备了 CPU 和内存的冯-诺依曼式计算机来说没有问题,我们可以按照下面的思路设计程序。
**def** get_majority(input):
counter_0, counter_1 = 0,0
**for** i in input:
**if** i==0:
counter_0 +=1
**else**:
counter_1 +=1
**return** int(counter_1 > counter_0)
对于许多问题,我们可以编写一个程序,可以在冯-诺依曼式的机器上运行,并找到解决方案。这是一个非常强大的概念。
然而,对于计算机是什么存在着不同的观点,这种观点更多的是受到自然界中观察到的现象的启发。这就是我们进入细胞自动机迷人世界的地方。
细胞自动机——从简单到复杂
在其最简单的形式中,细胞自动机可以被描述为“细胞”的网格,可以呈现两种不同的状态,比如黑色和白色。然后,我们可以定义这些细胞应该如何相互作用的“规则”,如下所示。

细胞自动机“规则 30”(来源: Wolfram Mathworld )
这套特殊的规则,也被称为“30 号规则”,是 256 种可以以这种方式构建的规则之一,计算机科学家史蒂夫·沃尔夫勒姆在 20 世纪 80 年代对其进行了详细研究。根据规则 30,被两个黑色单元格包围的黑色单元格将变成白色,被两个白色单元格包围的白色单元格将保持白色,以此类推。如果我们从由单个黑色单元格组成的网格开始,并继续应用规则 30 来生成下一行,则会出现以下结构:

规则 30 细胞自动机,从顶部的单个黑色细胞开始,按照规则向下传播。(来源:维基百科)
最终的结构看起来非常复杂,右边是各种比例的三角形和看似随机的位置,左边是对角线。引人注目的结论是,高度复杂的结构可以从简单的、确定性的规则中产生。
但是,回到正题,元胞自动机和计算有什么关系?
作为计算机的细胞自动机
1996 年,计算机科学研究员 Melanie Mitchell 和她的合作者设计了一个细胞自动机,可以解决我们上面遇到的多数类问题。任务是,给定黑白单元格的输入,确定两者中的哪一个是多数类,并通过最终将所有单元格切换到该类来显示它。这是他们的细胞自动机解决问题的快照:

解决多数类问题的细胞自动机。(来源:梅勒妮·米切尔,《复杂性——导游》)
有点难以看清,但第一行包含随机分布的黑白细胞,黑色细胞占多数。然后,细胞以某种方式“传播”有关其局部邻域的信息,这些传播在最终的结构中显示为对角线。最终,所有的细胞都变成了黑色,细胞自动机可以说已经“解决”了多数类问题。
因此,这种特殊的细胞自动机可以说像计算机一样工作。这很有趣,因为这台“计算机”缺少冯-诺依曼式机器的任何元素:它既没有中央处理器,也没有存储单元。相反,细胞本身承担着双重角色,同时传播信息和指令。
然而,这里有一个大的警告:米切尔的团队花了相当大的努力来设计一个细胞自动机,它可以解决某些初始条件下的一个非常简单的问题,很难想象这样一个系统可以解决更具挑战性、更普遍和更有意义的问题。即使细胞自动机可以被证明是图灵完全的(像生命游戏和规则 110 ),它们也远不是实用计算机。
那么,也许细胞自动机真的是描述世界的工具,而不是预测世界的工具。
自然界中的细胞自动机

蚁群通常被描述为自然细胞自动机。类似于我们在上面看到的 Wolfram 规则 30,每只蚂蚁都遵循简单的规则,然而整个群体表现出非常复杂的行为。
例如,蚂蚁有一个寻找食物的规则,最初是随机行走。如果一只蚂蚁成功并带着食物返回巢穴,它会留下一串信息素,向其他蚂蚁发出信号,让它们沿着相同的路径前进。随着更多的蚂蚁跟随并带回食物,信息素信号被放大,形成一个强化循环,直到食物来源减少,信息素信号消失。因此,在任何给定的时间,现有的踪迹和它们的信息素信号的强度形成了集体发现的食物环境的地图。
因此,蚁群可以有效地“计算”个体蚂蚁最优路径问题的解决方案,例如最大化食物产量——这种计算是以分散的方式进行的,没有冯-诺依曼式的中央处理器或中央存储器。每只蚂蚁都是一个计算单元,也是一个信息载体。蚂蚁部署的策略被证明是如此有效,以至于科学家们试图模仿它来解决人类规模的问题:蚁群优化算法被用来解决街道或互联网上的最佳路由问题。
自然界中的许多现象都可以描述为细胞自动机:免疫系统中的白细胞、大脑中的神经元、植物中的气孔细胞或通过种群传播的病毒。在所有这些系统中,基本细胞遵循一套简单的规则,然而涌现的结构却显得非常复杂。
最终,细胞自动机可以被认为是自然界解决生存的非平凡计算问题的方式。
如果你喜欢这个故事,也一定要看看这些:
哥德尔、图灵和关于我们能知道什么和不能知道什么的科学
towardsdatascience.com](/the-limits-of-knowledge-b59be67fd50a) [## 智能行为的起源
为什么真正的人工智能需要的不仅仅是模式识别
towardsdatascience.com](/the-origin-of-intelligent-behavior-3d3f2f659dc2)
Python 2021 中的遮罩概念

照片由皮勒-张力尹·普里斯克在 Unsplash 拍摄
NumPy 的一个有趣特性是过滤不需要的数据
所有的男人都是雕塑家,不断凿掉他们生活中不想要的部分,试图创造出他们心目中的杰作……艾迪·墨菲
如果您想知道如何在您的数据科学项目或 Python 编程中过滤或处理不需要的、缺失的或无效的数据,那么您必须学习有用的概念屏蔽。在这篇文章中,我将首先引导你通过一个一维数组的例子,然后是二维数组(矩阵),然后提供一个数据科学问题中屏蔽的应用。
一维数组
假设我们有以下 NumPy 数组:
import numpy as nparr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
现在,我们想计算小于 4 和大于 6 的元素之和。一个繁琐的方法是使用 for 循环,检查一个数字是否满足这些条件,然后将它添加到一个变量中。这将类似于:
total = 0 # Variable to store the sumfor num in arr:
if (num<4) or (num>6):
total += numprint(total)
>>> 21
您可以使用列表理解将这段代码简化为一行代码,
total = sum([num for num in arr if (num<4) or (num>6)])
>>> 21
使用屏蔽的概念可以实现相同的任务。它基本上使用一个布尔值列表(真/假),当应用于原始数组时,返回感兴趣的元素。这里,真是指满足条件的元素(在我们的例子中小于 4 且大于 6),假是指不满足条件的元素。
让我们首先手动创建这个遮罩。
mask = [True, True, True, False, False, False, True, True]
接下来,我们使用索引将这个掩码(布尔列表)传递给我们的数组。这将只返回满足条件的元素 。然后你可以对这个子数组求和。下面的片段解释了它。您会注意到,您没有得到 4、5 和 6,因为相应的值为假。
arr[mask]
>>> array([1, 2, 3, 7, 8])arr[mask].sum()
>>> 21
Numpy 的 MaskedArray 模块
Numpy 提供了一个名为ma的内置 MaskedArray 模块。该模块的masked_array()功能允许您直接创建一个“屏蔽数组”,其中不满足条件的元素将被渲染/标记为“无效”。这是通过使用mask参数实现的,该参数包含真/假或值 0/1。
注意:现在,当mask=False或mask=0时,字面意思是不要将该值标记为无效。简单地说,在计算过程中包含它。同样,mask=True或mask=1表示将该值标注为无效。相比之下,之前你看到当我们使用索引时,假值被排除在外。
因此,你现在必须在使用 **ma** 模块的同时交换真假值。所以,新的面具变成了
mask = [False, False, False, True, True, True, False, False]
import numpy.ma as ma"""First create a normal Numpy array"""
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])ma_arr = ma.masked_array(arr, mask=[False, False, False, True,
True, True, False, False])
>>> masked_array(data=[1, 2, 3, --, --, --, 7, 8],
mask=[False, False, False, True, True, True, False,
False], fill_value=999999)
ma_arr.sum()
>>> 21
屏蔽(无效)值现在由--表示。得到的 masked_array 的形状/大小与原始数组相同。以前,当我们使用arr[mask]时,得到的数组与原始数组长度不同,因为无效元素不在输出中。这个特性允许对长度相等但掩码不同的数组进行简单的算术运算。
像以前一样,您也可以使用列表理解来创建遮罩。然而,因为您想要交换真值和假值,所以您可以使用波浪号运算符~来反转布尔值。
"""Using Tilde operator to reverse the Boolean"""
ma_arr = ma.masked_array(arr, mask=[~((a<4) or (a>6)) for a in arr])ma_arr.sum()
>>> 21
也可以使用由 0 和 1 组成的掩码。
ma_arr = ma.masked_array(arr, mask=[0, 0, 0, 1, 1, 1, 0, 0])
根据屏蔽条件的类型,NumPy 提供了几个其他的内置屏蔽,可以避免您手动指定布尔屏蔽的任务。很少有这样的情况:
- 小于(或小于等于)一个数字
- 大于(或大于等于)一个数字
- 在给定的范围内
- 在给定范围之外
小于(或小于等于)一个数
功能masked_less()将屏蔽/过滤数值小于的数值。
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])ma_arr = ma.masked_less(arr, 4)
>>> masked_array(data=[--, --, --, 4, 5, 6, 7, 8],
mask=[True, True, True, False, False, False,
False, False], fill_value=999999)ma_arr.sum()
>>> 30
要将小于或等于的值过滤为一个数字,使用masked_less_equal()。
大于(或大于等于)一个数字
我们使用函数masked_greater()来过滤大于 4 的值。
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])ma_arr = ma.masked_greater(arr, 4)>>> masked_array(data=[1, 2, 3, 4, --, --, --, --],
mask=[False, False, False, False, True, True,
True, True], fill_value=999999)ma_arr.sum()
>>> 10
同样,masked_greater_equal()将大于或等于的值过滤为 4。
在给定的范围内
函数masked_inside()将屏蔽/过滤位于两个给定数值之间的值(包括两个给定数值)。以下过滤值介于 4 和 6 之间。
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])ma_arr = ma.masked_inside(arr, 4, 6)
>>> masked_array(data=[1, 2, 3, --, --, --, 7, 8],
mask=[False, False, False, True, True, True,
False, False], fill_value=999999)ma_arr.sum()
>>> 21
在给定范围之外
函数masked_inside()将屏蔽/过滤位于两个给定数值之间的值(包括两个给定数值)。以下过滤值在 4-6 之外。
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])ma_arr = ma.masked_outside(arr, 4, 6)
>>> masked_array(data=[--, --, --, 4, 5, 6, --, --],
mask=[True, True, True, False, False, False,
True, True], fill_value=999999)ma_arr.sum()
>>> 15
算术运算期间忽略NaN和/或infinite值
这是一个很酷的功能! 现实的数据集往往有很多缺失值(nan)或者一些奇怪的无穷大值。这样的值在计算中会产生问题,因此要么被忽略,要么被估算。
例如,这个一维 NumPy 数组的和或平均值将是nan。
arr = np.array([1, 2, 3, np.nan, 5, 6, np.inf, 8])
arr.sum()
>>> nan
您可以使用masked_invalid()很容易地排除 NaN 和 infinite 值,这将从计算中排除这些值。这些无效值现在将被表示为--。在处理数据科学问题中大型数据集中的缺失数据时,这个特性非常有用。
ma_arr = ma.masked_invalid(arr)
>>> masked_array(data=[1.0, 2.0, 3.0, --, 5.0, 6.0, --, 8.0],
mask=[False, False, False, True, False, False,
True, False], fill_value=1e+20)ma_arr.mean()
>>> 4.166666666666667
假设您想用剩余有效值的平均值估算或填充这些 NaNs 或 inf 值。你可以使用filled()很容易地做到这一点,
ma_arr.filled(ma_arr.mean())
>>> [1., 2., 3., 4.16666667, 5., 6., 4.16666667, 8.]
屏蔽二维阵列(矩阵)
通常,您的大数据是大型二维矩阵的形式。让我们看看如何对矩阵使用掩码。考虑下面的 3×3 矩阵。
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
假设我们想计算列方向的总和,排除大于 4 的数字。现在,我们必须使用 一个二维遮罩。如前所述,你也可以在下面使用真/假的二维遮罩。
ma_arr = ma.masked_array(arr, mask=[[0, 0, 0],
[0, 1, 1],
[1, 1, 1]])>>> masked_array(data=[[1, 2, 3],
[4, --, --],
[--, --, --]],
mask=[[False, False, False],
[False, True, True],
[True, True, True]], fill_value=999999)"""Column-wise sum is computed using the argument axis=0"""
ma_arr.sum(axis=0)>>> masked_array(data=[5, 2, 3], mask=[False, False, False],
fill_value=999999)
在上面的代码中,我们使用 0 和 1 手动创建了一个二维遮罩。通过使用与前面一维情况相同的功能,您可以使您的生活更加轻松。这里可以用masked_greater()排除大于 4 的值。
ma_arr = ma.masked_greater(arr, 4)ma_arr.sum(axis=0)
>>> masked_array(data=[5, 2, 3], mask=[False, False, False],
fill_value=999999)
注意:你可以使用所有的函数,前面显示的函数适用于一维,也适用于二维数组。
数据科学问题中屏蔽的使用
任何数据科学项目的常规任务都是探索性数据分析(EDA)。这方面的一个关键步骤是可视化输入要素之间的统计关系(相关性)。例如,皮尔逊相关系数提供了两个变量之间线性相关性的度量。
让我们考虑一下波士顿住房数据集并计算相关矩阵,得出范围在-1 和 1 之间的系数。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import load_bostonboston = load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)
现在让我们使用 Seaborn 库绘制相关矩阵。
correlation = df.corr()ax = sns.heatmap(data=correlation, cmap='coolwarm',
linewidths=2, cbar=True)

波士顿住房数据集的输入要素的相关矩阵。
现在,假设您想要突出显示或轻松区分绝对相关性超过 70%的值,即 0.7 。上面介绍的掩蔽概念在这里发挥了作用。您可以使用前面解释过的masked_outside()函数来屏蔽您需要的值,并在 Seaborn 图中使用特殊颜色突出显示它们。
correlation = df.corr()"""Create a mask for abs(corr) > 0.7"""
corr_masked = ma.masked_outside(np.array(correlation), -0.7, 0.7)"""Set gold color for the masked/bad values"""
cmap = plt.get_cmap('coolwarm')
cmap.set_bad('gold')ax = sns.heatmap(data=correlation, cmap=cmap,
mask=corr_masked.mask,
linewidths=2, cbar=True)

波士顿住房数据集的相关矩阵,其中掩膜值以金色高亮显示。
这就是我这篇文章的结尾。如果您想用即将发布的 Python 3.10 版本和 Matplotlib 3 中的最新特性来更新自己,请阅读我的以下文章。
[## 2021 年的 Python 时间表和即将推出的功能
Python 3.10 的一些新特性的预览
towardsdatascience.com](/python-in-2021-timeline-and-upcoming-features-c8369abbcc52) [## Matplotlib 3 的新特性
第 3 代中最重要的更新概述
towardsdatascience.com](/whats-new-in-matplotlib-3-1b3b03f18ddc)
什么是线性回归?
-建立自己的线性回归模型

在本文中,您将了解到—
- 什么是线性回归?
- 它如何找到输入特征和目标之间的关系?
- 它是如何预测的?
- 如何评价预测?
- 如何用代码实现?
什么是线性回归?
它试图找出输入特征和目标变量(y)之间的最佳线性关系。
就是这样!这就是线性回归的作用。很简单,对吧?😃
在机器学习行话中,上述内容可以表述为“这是一种受监督的机器学习算法,它最适合将目标变量(因变量)作为输入特征(自变量)的线性组合的数据。”
注
- 目标变量也称为独立变量或标签。
- 输入特征也称为因变量。
如何可视化线性回归?

(左)萨斯维克的图像(右)萨斯维克的图像
现在,当您考虑线性回归时,请考虑拟合一条直线,使数据点和直线之间的距离最小。如上所示,红线比其他蓝线更符合该数据。
在 2D,输入要素和输出之间的线性关系就是一条直线。
是啊!线性回归试图找出输入和输出之间的最佳线性关系。
y = θx + b # Linear Equation
线性回归的目标是找到代表给定数据的θ和 b 的最佳值。
我们将在本文后面详细了解它。
好吧!是时候深入研究线性回归了。
线性回归算法如何预测?
现在,让我们认为我们已经获得了输入要素和标注之间的适当线性关系(稍后解释)。现在,我们关注线性回归模型如何利用获得的关系预测实例的值。

线性回归(数据不是原始的,它是为了举例而创建的)
根据上图中的数据,线性回归将获得方程 y= 0.5*x + 1 的直线关系。(如果你不知道如何找到线性关系,不要担心,找到它的方法将在后面详细讨论。)
y =年收入
x =经验
1是截距或偏差项,0.5是Experience的特征权重
因此,如果该模型给出了一个有 8 年工作经验的人的新的点数据点(橙色点),那么它会预测此人每年会赚 50k 美元左右。
模型预测的一般形式

线性回归模型的预测


这包含了特定点的所有特征值,除了相应的目标值。
θ是模型的参数向量,包含偏差项θ0 和特征权重θ1 至θn。(n =特征数量)
您可以将特征权重视为线性方程中特征的系数。
x 是实例(数据集中的一个数据点)的特征向量,包含 x0 到 xn,其中 x0 始终等于 1
θ x 是矢量θ和 x 的点积,当然等于θ0x0 + θ1x1 + θ2x2 + … + θnxn。
θj 是第 j 个模型参数(包括偏差项θ0 和特征权重θ1,θ2,⋯,θn)。
这里θ,x 是列向量,你们马上会看到。
该模型替换模型预测方程中给定的新实例 x^(i 特征值,并将获得的值作为预测返回。
请记住,我们使用的是线性回归,它假设输入和输出(目标变量)之间只有线性关系。它不适用于数据中没有线性关系的问题。
这就是为什么模型预测方程的输入特征幂为 1(线性),这也解释了为什么我们在模型预测方程中没有(x0)或(x2)这样的项。
注:
如果这些符号没有意义,请继续阅读后面的部分,这些符号用一个例子解释,可以帮助你理解它们。然后回来重新阅读这一部分,这可能会使事情变得更容易。
偏置项
在线性回归中,我们将添加一个偏差项以获得无偏的结果。(如果我们不添加此项,则不会有截距,并且假设最佳拟合线穿过原点,同时截距为零,但并非每个数据集都是如此)。
我们已经知道了线性回归模型是如何预测的,但是我们如何评估这些预测并衡量它们的准确性呢?
成本函数 将为我们完成这项工作。
评估预测
成本函数
它评估模型的预测,并告诉我们模型的预测有多准确。成本函数值越低,模型的预测就越准确。有许多成本函数可供选择,但我们将使用均方误差(MSE)成本函数。
MSE 函数计算预测值和实际值(y)之差的平均值。

均方误差
让我们分解等式中的每个变量。




**
记住 x⁰(bias)的任何实例 j 是 1
举例理解符号
如果你在理解变量代表什么方面有困难,让我们试着用一个例子来理解它们。
让我们假设您有一个数据集,其中预测了具有以下特征的房子的价格— 大小、房间、家庭(“偏差”列表示将添加到每个样本中的偏差项,它不是一个特征)。它有五个样本。根据面积、房间数量、家庭成员等属性,我们可以预测房子的价格。
特征=大小、房间、家庭=因变量
目标(或)标签=价格=自变量

m = 5
**
它如何找到目标和输入特征之间的关系?
找到正确的关系意味着找到每个特征的精确特征权重(θj ),因为只有找到正确的特征权重才能给出可用于预测的正确线性方程。
有两种方法可以在数据中找到正确的关系。
- 正态方程
- 梯度下降
正规方程

正态方程
**
这是一个直接方程,它将直接给出优化值,无需任何进一步的步骤。
通过计算上述等式,您将得到特征权重的优化值。
现在让我们看看如何在代码中实现这一点。
首先,让我们创建一些具有线性关系的数据。
准备数据
现在我们有了数据,让我们看看如何借助法线方程找出特征权重(θ0,… θn)的值。
正规方程线性回归
您已经看到,它预测的特征权重非常接近实际值(y = 5 + 3X +高斯噪声),但是由于数据中的噪声,它无法预测精确值,但是预测值足够接近。*
正规方程的缺点
- 如果您有大量的要素,那么计算成本会很高。
- 如果在你的数据中有任何冗余特征,它们在正规方程中的矩阵求逆是不可能的。在这种情况下,逆可以用伪逆代替。
梯度下降

我们可以使用梯度下降法,而不是进行复杂的矩阵运算(当我们有大量特征时,这可能会减慢处理速度),梯度下降法将在更短的时间内产生大量特征的良好结果。
直觉
假设你在一座山顶上,你想尽快下山,但是天很阴,你看不到下山的路。你可能会想到的一个解决方案是考虑你周围所有可能的方向,并朝着最有可能下降的方向前进。
同样的想法可以应用于线性回归,但这里的问题是最小化成本函数。
如果你 不知道 什么是梯度,记住计算一个函数的梯度给了我们最大化函数值的方向。
应用梯度下降找到优化的特征权重
首先,特征权重必须用随机值初始化。
然后对每个模型参数(特征权重)θj 计算函数的梯度,换句话说,它估算了如果我们把θj 改变一点点,代价函数会改变多少(这就是所谓的偏导数)。

计算每个特征权重θj 的偏导数的矢量化形式为

矢量化形式
计算一个函数的梯度给出了使该函数最大化的方向,但是我们想要最小化它,所以我们将向相反的方向移动。
优化特征权重θ的步骤是

梯度下降步骤

在最小化成本函数的方向上采取步骤之后,我们将获得成本函数值最小的特征权重的优化值。
学习率

(左)学习率小时(右)学习率大时。
我们将在最小化成本函数的方向上采取多个小步骤,而不是在正确的方向上大量改变特征权重的值,这可能超过实际的最小值。学习速度决定了步长的大小。
我们必须小心选择学习速度。如果学习率太低,需要很长时间才能收敛到正确的解,或者学习率太高,可能会过冲全局最小值。
局部最小值的问题
您正在使用梯度下降来最小化成本函数,但是如果您陷入局部最小值怎么办?
幸运的是,对于均方误差成本函数,我们没有这个问题,因为它是一个凸函数,即它只有一个全局最小值,没有局部最小值。

均方误差函数(图像由 Sathwick 提供)
实施梯度下降
梯度下降线性回归
有趣的是,我们从梯度下降法中得到了与正规方程相同的结果,同样只需要 50 次迭代。
好吧!那很好。但是我们如何知道在哪个迭代中我们将得到优化的特征权重呢?
当我们接近成本函数的最小值时,梯度下降中的偏导数接近零,并且当乘以小于 1 的学习时,学习步骤变得更小,这确保了在所有迭代结束时,我们将非常接近实际的特征权重(假定您已经选择了不太大的适当学习速率)
梯度下降的缺点
- 如果使用另一个非凸形的成本函数,梯度下降有可能陷入局部最小值。
- 你应该为学习率找到合适的值。
在 Scikit-Learn 中实现线性回归
使用 sklearn 进行线性回归
Scikit-Learn 提供了一个 LinearRegression 类来执行线性回归
正如你所看到的,我们从正规方程,梯度下降,sklearn 得到的值几乎是一样的。
好吧,如果你已经读到这里,一切都有意义,拍拍自己的背吧!。你已经学习了线性回归的所有基本概念。
高维(多特征)数据怎么办?

3D 线性回归(图片由 Sathwick 提供)
到目前为止,我们已经看到了二维数据的线性回归。我们知道,二维的线性回归是通过一条线实现的,类似地,在三维数据中,这条线被一个平面代替,对于高于三维的数据,我们使用一个超平面,其余步骤是相同的。
简单地说,输入要素的数量增加,要素权重计算增加。
我会让你自己在更高的维度上研究更多的数据,但基本概念保持不变。
干得好!👏你成功了。现在你可能对线性回归有了更好的了解。
结论
线性回归是一种广泛应用于回归问题的技术。它可以用来从自变量预测因变量。它在自变量的数据(训练数据)中搜索因变量的关系。在二维数据的情况下,它仅仅是一个线性方程。它使用这个线性方程(在训练期间从数据中找到的关系)来预测它以前没有见过的数据的值。这就是线性回归背后的全部思想。
确保你理解梯度下降部分。梯度下降是最广泛使用的优化技术之一。梯度下降技术在机器学习甚至深度学习中几乎无处不在。
感谢阅读!
混乱矩阵被可视化

图形化的方法使与 2×2 矩阵相关的许多指标变得清晰明了。
我总是对 2×2 混淆矩阵的丰富性感到惊讶。毕竟,这只是四个数字,有多复杂?事实证明,我们可以获得丰富的见解。但是,混淆矩阵被用于商业、工程和科学的许多领域,每个领域都有自己的词汇,这一事实使情况变得模糊不清。
由于倾向于可视化,我创建了一个图表来帮助说明和理解许多概念。基本上,它是带有许多装饰者的混淆矩阵本身。

该图表是用 python 可视化包 Altair 创建的。带有图表代码的 Jupyter 笔记本可以从我的 GitHub(https://github.com/SorenLaursen/confusion_matrix_chart)下载。此处,图表显示了所有图形项目的实际数值,例如作为工具提示的条块。
词汇
混淆矩阵将两个二进制类相互映射。我们在这里将这些分别称为行和列的( Y 、 N )和( y 、 n )。说明性地,这些可以表示一些标准的评估,例如一些组的成员资格(是,否)。
让我们开始探索混淆矩阵周围的词汇[1]。首先是四个数字本身:

大多数选择都是直观易懂的。从四个数字衍生出的许多比率的众多名称变得更加混乱:

右边的装饰器稍微复杂一些,但是仍然基于这四个数字。

作为参考,我将介绍一个在实现代码中也使用的更简单的命名约定:

定义
接下来,让我们转向定义。四个数字之间的横条简单地说明了每个数字与成对总和的比率。换句话说,每个条形都是两个相邻数字的标准化堆积条形。
我们在这里将这四个杆称为成对杆。
当然, a | b 符号用于命名成对杆的段,暗示了将这些段理解为条件概率。
线对中线段的排序惯例是,与对角线上的数字相关的部分最靠近图表的中心。
左侧和顶部的金色条分别代表行总和和列总和。这两个条形都包含所有四个数字的信息。同样,条形应被认为是标准化的。

同样,中间的横条汇总了所有四个数字,这次不是以行和列的形式,而是以对角线和非对角线的形式。
与此相反,左上角的横条只代表四个数字中的三个。就是 F1 的分数即 2 ∙(Y|Y∙Y|Y)/(Y|Y+Y|Y)。换句话说,它是从两个深绿色段计算出来的。因子 2 意味着该条也被归一化。

最后,优势比定义为
或=(Yy∙Nn)/(Yn∙Ny)。
笔记本中的实现应用了小计数校正(霍尔丹-安斯科姆校正),即如果四个数字中的任何一个为零,那么所有四个数字都加上 0.5[2]。
可以看出,置信区间可以简单地近似为:
exp{ log( 或)cv∙sqrt(1/Yy+1/Yn+1/Ny+1/Nn)}
其中临界值 cv ,取决于置信水平:90%: 1.64,95%: 1.96,99%: 2.58。
应用程序
让我们从混淆矩阵的一个经典应用开始。二战是雷达的早期。齿轮的灵敏度可以调整,但最佳设置是什么?提高雷达的灵敏度,大多数敌机都被发现了。但同时也有很多虚惊一场。降低灵敏度,有一些假警报,但现在一些敌机没有被发现,这是更糟糕的。我们想尽量减少假阴性。类似地,在癌症筛查项目中。我们不想错过任何一个真正患有癌症的人。这个结果是以一些假阳性为代价的。

该空间中的分析通常是在垂直对杆上进行的。这些总结了所有四个数字的信息。显然,将一行中的两个数字乘以某个因子不会改变垂直对条。因此, Y 和 N 之间的分配不会影响这两个副杆。这导致这些成对条被用在一个特殊的图中,即接收机工作特性曲线或 ROC 曲线。

混淆矩阵表示一些样本,例如多个实验、多个患者或具有一些特定设备设置(即操作特性)的多个雷达测量。因此,特定混淆矩阵代表 ROC 曲线上的一个点。
由于垂直对条不依赖于 Y / N 分布,这意味着即使位置 A 的敌机比位置 B 多,位置 A 的雷达系统的测量值也可以与位置 B 的雷达系统的测量值进行比较。
有时,希望将假阳性( Ny )而不是假阴性( Yn )最小化。例如,垃圾邮件过滤器会将邮件标记为垃圾邮件。我们不希望一个正确的消息被标记为垃圾邮件,因为我们可能永远不会看到它。另一方面,如果收件箱中还有一些垃圾邮件,也不是什么大问题。另一个例子是广告活动:我们预测谁是目标群体。我们不想针对非目标受众开展昂贵的宣传活动。因此,尽量减少假阳性。因此,我们可能不会针对整个目标群体,但我们针对的人很可能是目标群体中的一员。
请注意,无论我们是最小化假阳性还是假阴性,都不能告诉我们要评估哪个度量。我们仍然可以使用垂直的双杠,但是现在我们将关注于 y | N 而不是 n | Y 。但是我们什么时候使用水平双杠呢?
数据集通常非常不平衡。例如所有信用卡交易中的欺诈性信用卡交易。看看下面两个例子。在右边的例子中,与左边的例子相比,第二行中的数字乘以 100。垂直对条不受影响,它们独立于患病率( Y )。此外,在这两种情况下,准确性(中心条)接近 100%。但是在第二种情况下,假阳性与真阳性相比的数量可能是毁灭性的。

在严重不平衡的数据集中,真正的负数可能会占主导地位,在许多情况下,其他三个数字更令人感兴趣。请记住上面的定义部分,F1 分数——左上角的条形——是基于这三个数字的度量,实际上是基于 y | Y 和 Y | y ,即两个深绿色部分。可以看出,与准确性相反,F1 分数对两种情况之间的差异很敏感。
ROC 图概括了整体情况。对于不平衡的数据,有一个类似的图:精确召回图[3]。基本上,这两个图都是相互映射的两对棒线。为简单起见,我们在这里将这种图称为成对图。由于垂直对条与一行中的数字乘以一个公共因子无关(它们与患病率无关),这两个病例位于 ROC 图上的同一点(左)。然而,在精确回忆图中,这两种情况截然不同。

在我们可以控制患病率( Y )的情况下,两条曲线都适用。例如模型评估就是这种情况。我们有一个训练集来训练模型,即我们可以使用不同参数设置的同一个集。通过这种方式,我们可以构建已知患病率( Y )为常数的配对图。这与雷达的情况相反,在雷达的情况下,敌机的出现会随着地理位置和时间的不同而不同。
属国
到目前为止,我们已经查看了存在真值( Y , N )和一些计算结果或经验测试结果( y , n )的情况,并且我们使用我们的混淆矩阵和相应的派生度量来评估模型质量、医学测试质量、假设测试等。
但是 2×2 矩阵还有另一种用途,只是思路有点不同:两个二进制类是否独立?例如,20-29 岁年龄组( Y , N )的会员资格是否与拥有汽车( y , n )相关联?这也适用于以上所有的例子。在这个应用领域,矩阵通常被称为列联表。
这就是优势比(或)的由来。它在上面被定义为对角线数的乘积与非对角线数的乘积之比。如果或为 1,那么这两个类是独立的。在混淆矩阵图的或装饰器中——即右边的栏——深蓝色的点是或,橙色的点是 1。由于此或描述未被标准化,为方便起见,其值显示在右上框中。
或需要与 1 相差多少才能表示依赖关系?如上所述,对于或,很容易估计置信区间。在图表中,显示了置信度为 90%、95%和 99%的三个置信区间。请看下图中的例子(a)-(c)。在(a)中,1 在所有三个置信区间内,即无论置信水平如何,两个类别都是独立的。在(b)中,这两个类别依赖于或关联于 95%而不是 99%的置信水平。在(c)中,类是相关的,置信度为 99%。
一些说明性的例子:在(d)和(e)中,列中的数字和行中的数字是成比例的。显然,这些类是独立的,并且或 = 1。在最后一个例子(f)中,非对角线的数量大于对角线的数量。类别之间的相关性很强,说明了这种分析的对称性。

结束语
基于混淆矩阵创建可视化的动机是为了获得对基于四个数字的度量的定义和使用的一些见解。
对各种比率定义的详细记录以及对这些指标的深奥名称的应用应该与对图表中堆叠的、标准化的条形的直观理解相比较。此外,配对图的概念是两个配对柱的简单映射,它使 ROC 图和精密度-召回图的构建更加清晰,并说明了使用其中一个的原因。
最后,将比值比和置信区间添加到图表中增加了立即对类的依赖性或关联性做出精确结论的能力。
这些都是一目了然的见解。你可以随意下载 Jupyter 笔记本,玩混乱矩阵图(https://github.com/SorenLaursen/confusion_matrix_chart)。
[1]混乱矩阵,维基百科(【https://en.wikipedia.org/wiki/Confusion_matrix】T2)
[2] 拉斐尔·伊里扎里:数据科学导论(2020) — 15.10.4 比值比,https://rafalab.github.io/dsbook/inference.html
[3] Takaya Saito,Marc Rehmsmeier: ROC 和 precision-recall with unbalanced datasets(2015)https://classe val . WordPress . com/simulation-analysis/ROC-and-precision-recall-with-balanced-datasets/
违反线性回归假设的后果
违反假设会如何影响预测和推断

图片由 Mathilda Khoo 在 Unsplash 上拍摄
动机
最近,一个学习线性回归的朋友问我,当违反像多重共线性这样的假设时会发生什么。尽管我以前是统计学专业的学生,但我只能给他一些笼统的回答,比如“你不会相信你的模型的估计值。”由于对我的回答不满意,我决定通过模拟创建一个真实世界的例子,来展示当某些假设被违反时,预测和推理会发生什么。
模拟
假设研究人员有兴趣了解是什么推动了房价。让我们假设房价仅仅由两个变量决定:房子的大小和房龄。虽然年龄与价格呈负线性关系,但房子的大小与价格呈正二次(非线性)关系。从数学上讲,我们可以这样模拟这种关系:
priceᵢ=β₀+β₁sqftᵢ+β₂sqftᵢβ₃age_yearsᵢ+eᵢ*
其中 Price 是房屋的价格,单位为千美元, sqft 是房屋的面积,单位为千平方英尺, age_years 是房屋的使用年限。残差 e 正态分布,均值为 0,方差 σ ₑ 。让我们称之为真实模型,因为它考虑了推动房价的一切因素(不包括残差)。由于研究人员没有水晶球告诉他们真正的模型是什么,他们测试了一些线性回归模型。以下是他们得出的结论,排名不分先后:
(1)priceᵢ=β₀+β₁sqftᵢ+β₂sqftᵢβ₃age_yearsᵢ+eᵢ*
(2)priceᵢ=β₀+β₁sqftᵢ+β₂sqftᵢβ₃age_yearsᵢβ₄age_monthsᵢ+eᵢ
(3)priceᵢ=β₀+β₁sqftᵢβ₂age_yearsᵢ+eᵢ
(4)priceᵢ=β₀β₁age_yearsᵢ+eᵢ*
研究人员很聪明,找到了真正的模型(模型 1),但其他模型(模型 2、3 和 4)违反了某些 OLS 假设。最后,假设有 10K 的研究人员进行了同样的研究。每个人都从房屋群体中选取了 50 个独立的观察值,并将上述模型与数据进行拟合。通过检查这些 10K 模型的结果,我们可以看到这些不同模型的行为。下表显示了用于模拟数据的关键参数(完整代码可在这里找到):
结果
无多重共线性违规
(2)priceᵢ=β₀+β₁sqftᵢ+β₂sqftᵢβ₃age_yearsᵢβ₄age_monthsᵢ+eᵢ
研究人员在组装模型 2 时非常疲劳,没有意识到他们包括了两个衡量房屋年龄的指标:年龄 _ 年和年龄 _ 月。检查多重共线性的一个好方法是查看方差膨胀因子 (VIF)。根据经验,大于 5 的 VIF 表示多重共线性,对于 age_years 和 age_months 都是如此。让我们从比较模型 2 和模型 1(真实模型)的预测能力开始。均方误差 (MSE)是一个很好的预测指标,它告诉你一个模型的预测与实际值有多接近。下图显示了从所有 10K 研究人员处收集的 MSE 分布。

作者图片
两个模型之间的 MSE 非常相似,这意味着多重共线性违规不会真正影响预测。推论如何,或者换句话说,模型的解释能力如何?结果是,模型 2 和模型 1 对年龄 _ 年、 β₃ 的系数估计有很大不同:

平均而言,两个模型的系数估计在-7 处是无偏的。然而,很明显,对于模型 2,样本之间的差异要大得多。这是什么意思?这意味着多重共线性削弱了模型 2 的统计能力。例如,在模型 2 中, age_years 仅在 54%的 10K 模型中具有统计显著性。这是有问题的,因为几乎一半的研究人员会认为年龄没有统计学意义。另一方面,在模型 1 中, age_years 在所有 10K 模型中具有统计显著性。
线性违规
(3)priceᵢ=β₀+β₁sqftᵢβ₂age_yearsᵢ+eᵢ
回想一下价格和平方英尺之间的真实关系是非线性的。模型 1 解决了这种违反,但模型 3 没有,因为研究人员排除了 sqft 的二阶项。这种违反的一个迹象是,绘制拟合值与残差之间的关系是否会产生一种独特的模式。如下所示,模型 3 产生抛物线形状,因为线性函数不能充分捕捉价格和年龄 _ 年数之间的关系:

作者图片
既然我们已经确认违反了线性,让我们通过观察 MSE 来比较所有 10K 模型的预测:

作者图片
模型 1 的平均 MSE 为 84,而模型 3 为 113。为了让解释更加清晰,我们可以用均方根误差(RMSE)——MSE 的平方根——来表示模型 1 的房价预测与真实价格的差距平均为 9167 美元(√841000),而模型 3 的房价预测与真实价格的差距为 10614 美元。最后,让我们深入推理,比较模型 1 和模型 3 之间年龄的系数估计值。你在下图中看到的是从 10k 研究人员那里获得的年龄 _ 年数*系数估计值的分布:

作者图片
尽管两个模型平均获得的正确结果为-7,但模型 3 的精确度较低,因为它的取值范围稍大。虽然模型 3 的问题不像模型 2 那样严重,但如果不考虑更强的非线性水平,问题会更加严重。
没有内生性违背
(4)priceᵢ=β₀β₁age_yearsᵢ+eᵢ*
当自变量和误差项之间有联系时,内生性就发生了。模型 4 违反了无内生性假设,因为研究人员从模型中省略了 sqft 。记住,当相关变量从模型中被忽略时,它会被误差项吸收。由于 sqft 和 age_years 略微相关(我在模拟中将其设置为 20%),从模型中省略 sqft 会导致误差项与 age_years 相关。让我们首先通过检查 MSE 来比较模型 1 和模型 4 的预测能力:

作者图片
与模型 1 相比,模型 4 的预测要糟糕得多,主要是因为 sqft 解释了房价的许多变化。RMSE 告诉我们,平均而言,模型 4 做出的预测与真实房价相差 29099 美元,而模型 1 的预测为 9167 美元。接下来,我们重点讲推理。下图显示了模型 4 的年龄 _ 年龄系数、 β₁ 在 10K 研究人员中的分布情况:

因为我们知道 age_years 的真实系数值是-7,而不是-4.1,所以平均系数估计值是有偏差的(因此术语省略变量偏差)。此外,我们可以看到,对于 9.5K 的 10K 研究人员来说, age_years 的系数估计值在-5.5 到-2.8 之间。这将导致大多数研究人员低估年龄对价格的影响。
结论
- 违反多重共线性不会影响预测,但会影响推断。例如,对于高度相关的协变量,p 值通常会变大,这可能会导致具有统计显著性的变量缺乏显著性。
- 违反线性会影响预测和推断。对于模型 3,我们看到预测和估计系数的精度仅受到轻微影响。然而,当更强的非线性水平未被考虑时,这些事情将会恶化。
- 由于遗漏了一个变量,模型 4 违反了无内生性假设。这造成了有偏见的系数估计,导致误导性的结论。预测也很糟糕,因为遗漏的变量解释了房价的大量变化。
这个模拟展示了当假设被违反时会发生什么。取决于多种因素(即残差方差、观察次数等)。),模型的预测和推断能力会有所不同。当然,一个模型也有可能违反多个假设。如果有兴趣,我将在以后介绍其他假设(homoskedasticity、误差项的正态性和自相关),但我介绍的这三个应该会让您对违反假设的后果有所了解。
日冕地图:可视化疫情

小说《电晕病毒,世纪疫情》在全世界引起了歇斯底里。股市经历了自 2008 年危机以来最糟糕的一天,油价出现了 29 年来的最大跌幅。


首先,让我们了解什么是这种新的冠状病毒或新冠肺炎。冠状病毒不是一种单一的病毒,它是一个病毒家族,可以引起流感等疾病。这是该家族的最新发现,该家族被命名为新型冠状病毒或新冠肺炎。
那么这种新型冠状病毒和那些看起来不太伤人的旧冠状病毒有什么不同呢?嗯,主要的问题是它是新的,我们还没有太多的研究和/或药物来治疗它。这种病毒的另一个问题是它具有高度传染性。
大约 97%的受害者存活下来,但是免疫系统弱的人无法对抗它,我们还没有杀死这种病毒的药物。
科学家和研究人员正在努力,不久我们将有疫苗和治疗方法。全世界的政府和私人机构都在努力减轻灾难并控制病毒。
GIS 能帮上什么忙?
“GIS 为可视化和分析流行病学数据、揭示趋势、相关性和相互关系提供了极好的手段。”
为了应对灾难,我们需要关于它们的数据,在这个数据分析和我们现有工具的时代,有很多事情可以做。在这方面,约翰·霍普金斯大学的 CSSE 做了伟大的工作。他们一直在收集数据,并每天将数据发布到他们的库上。他们还创建了一个显示当前信息的门户网站。

上述门户在提供最新信息方面做得很好,但缺少地图上的历史信息,这些信息存在于他们提供的数据集中。他们在图表中提供了历史数据,但在地图上没有。
我们在做什么?
我相信,在太空中可视化与这个疫情相关的历史数据将为研究人员和任何想更多地研究新冠肺炎的人增加价值。所以,我和我的朋友决定制作一个小工具:日冕地图。
这是一个免费的简约工具,我们为那些对研究这种疾病如何传播以及它在全球的状况感兴趣的人开发的。这对旅行者、医生、研究人员、非政府组织、政府和任何想研究和/或发现这种疾病影响现状的人都是有益的。
到目前为止,我们只做了一个星期,我们计划在未来添加更多的数据层,并将每天更新当前的数据。现在,它在地图上显示了每天的全球统计数据,以及自第一例病例报告以来每个国家每天的统计数据。

右下角的日历可以让你检查任何日期的电晕状态

中国冠状病毒统计至 2020 年 3 月 9 日
我们正在寻找更多的数据来源,并将增加它们,使其对研究人员更有用。如果你想尽自己的一份力量,想分享能够真正帮助研究人员和组织抗击疾病的数据或想法,请联系我们,以便我们能够让 Corona 地图对他们更有帮助。
我是拉米兹·萨米。我爬山、举重、构建 WebGIS 解决方案。在Linkedin上随时与我联系。
新冠肺炎的一份报纸——科罗纳时报

基于数据科学的新闻应用
似乎我消费信息的方式已经发生了很大的变化。最近我成了一个新闻迷。尤其是有一点,我一直在阅读相当多的国际新闻,以确定新冠肺炎在我国所处的阶段。
为了做到这一点,我通常会访问许多不同国家的新闻媒体网站来阅读新闻。这给了我一个想法。为什么不为 Corona 创建一个国际新闻仪表板?这就是了。
这篇文章是关于我如何使用 Streamlit 和来自 NewsApi 和欧洲疾病控制中心的数据创建新闻仪表板的。
TLDR;此处 链接 App 。
获取数据
创建这个仪表板时最重要的事情是获取数据。我使用两个数据源:
1.数据来自欧洲疾病预防和控制中心。
该可下载的数据文件每天更新,包含关于新冠肺炎的最新公共数据。这是这些数据的快照。

def get_data(date):
os.system("rm cases.csv")
url = "[https://opendata.ecdc.europa.eu/covid19/casedistribution/csv](https://opendata.ecdc.europa.eu/covid19/casedistribution/csv)"
filename = wget.download(url,"cases.csv")
casedata = pd.read_csv(filename, encoding='latin-1')
return casedata
2.新闻宣传短片
第二个数据来源来自新闻 API ,它让我可以免费访问来自不同国家的主要新闻媒体的文章。唯一的警告是,我一天只能点击 API 500 次,对于免费帐户的特定查询,结果限制为 100 个。
我试图通过使用 streamlit 缓存来绕过这些限制障碍(所以我不会经常使用 API)。我还尝试使用多个过滤器获取上个月的新闻数据,以获得大量数据。
from newsapi import NewsApiClient
newsapi = NewsApiClient(api_key='aedb6aa9bebb4011a4eb5447019dd592')
API 工作的主要方式是让我们访问 3 个函数。
A)从一个国家获取最新新闻的功能:
json_data = newsapi.get_top_headlines(q=q,language='en', country='us')
data = pd.DataFrame(json_data['articles'])
data.head()

b)从国家获取与查询相关的" Everything" 的函数。这里可以看到 API 参数的描述:
json_data = newsapi.get_everything(q='corona',
language='en',
from_param=str(date.today() -timedelta(days=29)),
to= str(date.today()),
sources = 'usa-today',
page_size=100,
page = 1,
sort_by='relevancy'
)
data = pd.DataFrame(json_data['articles'])
data.head()

c)以编程方式从一个国家获取资源列表的功能。然后我们可以使用这些资源从“一切” API 中提取数据
def get_sources(country):
sources = newsapi.get_sources(country=country)
sources = [x['id'] for x in sources['sources']]
return sourcessources = get_sources(country='us')
print(sources[:5])
-------------------------------------------------------------------
['abc-news', 'al-jazeera-english', 'ars-technica', 'associated-press', 'axios']
我使用了上面的所有函数来获取以特定频率刷新的数据。通过查看我在 GitHub 上的代码,您可以看到我是如何在循环中使用这些 API 函数来下载数据的。
创建仪表板
我希望在仪表板中有一些我感兴趣的重要信息。所以我开始创建各种小部件。
1.当前世界快照:
第一个信息是关于整个世界局势。病例数和死亡数。各国的病例和死亡曲线?各个国家的致死率是多少?以下是 2020 年 3 月 28 日的世界局势。
观察: 我们可以看到意大利的死亡人数仍在上升,而西班牙、法国和美国的死亡人数也在上升。一些国家的死亡率令人担忧,意大利的死亡率为 10.56%,伊拉克为 8.7%。我怀疑冠状病毒开始几天 2%的死亡率统计如果没有错的话是误传。

技术细节 —为了创建仪表板的这一部分,我使用了 ECDC 数据。我还在 Streamlit 中使用了很多 HTML 技巧,其中我使用了 bootstrap 小部件和自定义 HTML 来以我想要的方式显示数据。以下是一些技巧:
- 使用引导卡:您可以使用引导卡,或者在这种情况下,如果您将参数
unsafe_allow_html更改为 True,则可以使用 Streamlit 中的任何 HTML 元素。请注意,我在这里也使用了 pythonf字符串格式。
st.sidebar.markdown(**f**'''<div class="card text-white bg-info mb-3" style="width: 18rem">
<div class="card-body">
<h5 class="card-title">Total Cases</h5>
<p class="card-text">**{sum(casedata['cases']):,d}**</p>
</div>
</div>''', **unsafe_allow_html**=True)
上述代码位于 streamlit 应用侧边栏中的仪表板风格卡片后面。

- 更改了 streamlit 主页的宽度:同样,streamlit 没有给出参数来实现这一点,我发现页面宽度对于我的用例来说有点太小。在应用程序开始时添加上面的代码解决了这个问题。
st.markdown(
f"""
<style>
.reportview-container .main .block-container{{
**max-width: 1000px;**
}}
</style>
""",
unsafe_allow_html=True,
)
2.来自国家的最新消息
创建这个仪表板的主要目的是从国内顶级媒体渠道获取各种渠道的新闻。

技术细节: 之前说过,我是用新闻 API 来获取这个数据的。下面是我如何使用 HTML 和 markdown 的混搭来显示新闻结果。
def create_most_recent_markdown(df,width=700):
if len(df)>0:
# img url
img_path = df['urlToImage'].iloc[0]
if not img_path:
images = [x for x in df.urlToImage.values if x is not None]
if len(images)!=0:
img_path = random.choice(images)
else:
img_path = '[https://www.nfid.org/wp-content/uploads/2020/02/Coronavirus-400x267.png'](https://www.nfid.org/wp-content/uploads/2020/02/Coronavirus-400x267.png')
img_alt = df['title'].iloc[0]
df = df[:5]
**markdown_str = f"<img src='{img_path}' width='{width}'/> <br> <br>"**
for index, row in df.iterrows():
**markdown_str += f"[{row['title']}]({row['url']}) by {row['author']}<br> "**
return markdown_str
else:
return ''
这里需要注意几件事:
- 无法使用 markdown 设置图像宽度,因此使用自定义 HTML
- 使用 python f 字符串创建文章标题和 URL。
- 如果找不到图像,我们将默认使用自定义图像。
3.新闻情绪
在这段艰难的日子里,另一件困扰我的事情是到处都有太多的负面情绪。如果可能的话,我想看到从积极的角度报道的新闻。所以我用 Textblob 的自定义情感分析器做了一些简单的情感分析。
我发现了新闻媒体的观点,以及过去 30 天中与冠状病毒有关的一些最积极和最消极的新闻。(过去 30 天,因为我不能用免费的 API 返回更多)。
观察: 你可以看到,最积极的消息之一是川普在 3 月 17 日改变了他对冠状病毒的立场,我同意。第二个积极的报道似乎是关于这个问题的某种解决方案。而第一个负面消息是关于 Cardi B 抨击名人散播关于冠状病毒的混乱。这个我不做评论:)

技术细节: 为了得到一篇文章的情感评分我用了TextBlob。获得从-1 到 1 的情感分数就像使用下面的函数一样简单。由于新闻 API 中的内容被截断,我使用了标题和描述的连接来查找情感。
def textblob_sentiment(title,description):
blob = TextBlob(str(title)+" "+str(description))
return blob.sentiment.polarity
这里的主要困难是要有一个两栏的布局来提供正面和负面的消息。同样,我不得不使用 HTML 和 markdown 的混搭。我使用 HTML 表来做这件事。另外,请注意我是如何使用 Python f 字符串将 markdown 转换成 HTML 的。
import markdown**md = markdown.Markdown()**positive_results_markdown = create_most_recent_markdown(positivedata,400)
negative_results_markdown = create_most_recent_markdown(negativedata,400)html = f'''<table style="width:100%">
<tr>
<th><center>Most Positive News</center></th>
<th><center>Most Negative News</center></th>
</tr>
<tr>
<td><center>**{md.convert(positive_results_markdown)}**</center></td>
<td><center>**{md.convert(negative_results_markdown)}**</center></td>
</tr>
</table>'''
#print md.convert("# sample heading text")st.markdown(html,unsafe_allow_html=True)
4.新闻来源 WordCloud
如果没有单词云,处理文本的可视化仪表板永远不会真正完整,所以我想到添加一个单词云来了解特定来源的单词用法。
观察: 我们可以看到很多次副新闻使用“新的”、“经过测试的”这样的词。而《商业内幕》则大量使用“中国”。



《商业内幕》、《时代》和《副新闻》中的词汇云比较。
技术细节: 下面是我用来创建这个蒙面字云的:
import cv2def create_mask():
mask = np.array(Image.open("coronavirus.png"))
im_gray = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
_, mask = cv2.threshold(im_gray, thresh=20, maxval=255, type=cv2.THRESH_BINARY)
mask = 255 - mask
return mask**mask = create_mask()**def create_wc_by(source):
data = fulldf[fulldf['source']==source]
text = " ".join([x for x in data.content.values if x is not None])
stopwords = set(STOPWORDS)
stopwords.add('chars')
stopwords.add('coronavirus')
stopwords.add('corona')
stopwords.add('chars')
wc = WordCloud(background_color="white", max_words=1000, mask=mask, stopwords=stopwords,
max_font_size=90, random_state=42, contour_width=3, contour_color='steelblue')
wc.generate(text)
plt.figure(figsize=[30,30])
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
return plt**st.pyplot(create_wc_by(source),use_container_width=True)**
其他技术考虑
1.高级缓存:
在昨天刚刚发布的 0.57.0 的新 streamlit 发行说明中,streamlit 对st.cache进行了更新。这个版本的一个显著变化是“能够通过设置max_entries和ttl参数来设置缓存函数的到期选项”。来自文档:
- max_entries ( int 或 None ) —在缓存中保留的最大条目数,或者对于无界缓存为 None。(当一个新条目被添加到满缓存时,最旧的缓存条目将被删除。)默认为无。
- TTL**(float or None)—在缓存中保留条目的最大秒数,如果缓存条目不应过期,则为 None。默认值为无。
这可能有所帮助的两个用例是:
- 如果您正在为您的应用程序提供服务,并且不希望缓存永远增长。
- 如果您有一个从 URL 读取实时数据的缓存函数,并且应该每隔几个小时清除一次以获取最新数据
这就是在许多函数中使用的方法,以避免多次点击 API,同时防止它们变得陈旧。
例如,在 360 秒(即 6 分钟)的时间段内获取来自一个国家的顶级结果。
st.cache(ttl=360,max_entries=20)
def create_dataframe_top(queries,country):
#Hits API Here
而来自 everything API 的完整结果是在一天内获取的。
[@st](http://twitter.com/st).cache(ttl = 60*60*24,max_entries=20)
def create_dataframe_last_30d(queries, sources):
# hits API
2.部署:
我使用亚马逊免费 ec2 实例在 http://54.149.204.138:8501/部署这个应用程序。如果你想知道步骤,这里有:
** [## 如何使用 Amazon Free ec2 实例部署 Streamlit 应用程序?
10 分钟内将数据应用程序上传到网上
towardsdatascience.com](/how-to-deploy-a-streamlit-app-using-an-amazon-free-ec2-instance-416a41f69dc3)
还有一些注意事项:
- 由于这是一个免费的服务器,它可能不会采取太多的负荷。
- 我还没有彻底测试缓存例程。我只希望服务器上有限的内存不要出现内存错误。
- 新闻 API 也是免费的。甚至在我尝试处理之后,可能还会有速率限制。
3.学问
对于迷路的人,你可能想先从最基本的开始。以下是我在 Streamlit 和 Plotly express 上的介绍性帖子。
[## 如何为数据科学家使用简单的 Python 编写 Web 应用?
无需了解任何 web 框架,即可轻松将您的数据科学项目转换为酷炫的应用程序
towardsdatascience.com](/how-to-write-web-apps-using-simple-python-for-data-scientists-a227a1a01582) [## Python 的一个线性图形创建库,带有汉斯·罗斯林风格的动画
动画,单线图。它拥有一切
towardsdatascience.com](/pythons-one-liner-graph-creation-library-with-animations-hans-rosling-style-f2cb50490396)
结论
在这里,我尝试创建一个关于冠状病毒新闻的仪表板,但它仍处于萌芽阶段,还有很多工作要做。
首先,它需要一台大型服务器。另一方面,需要大量时间来改进可视化和布局。还有很多测试。
此外,我们使用 HTML 和少量黑客以迂回的方式做了一些事情。Streamlit 中还有很多我喜欢的东西。我已经与 Streamlit 团队就他们将要引入的新功能进行了讨论,我将尽力让您了解最新情况。好消息是,布局选项是 Streamlit 正在开发的新功能的一部分。
你可以在我的 Github repo 上找到最终应用程序的完整代码。这是网上完整的应用。
如果你想了解创建可视化的最佳策略,我想从密歇根大学调用一门关于 数据可视化和应用绘图 的优秀课程,它是一个非常好的 数据科学专业的一部分,本身带有 Python 。一定要去看看。
谢谢你的阅读。将来我也会写更多初学者友好的帖子。在 媒体 关注我,或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。
此外,一个小小的免责声明——这篇文章中可能会有一些相关资源的附属链接,因为分享知识从来都不是一个坏主意。**
冠状病毒对股票市场的影响
浅析新冠肺炎对世界经济的威胁

Alex bljan 在 Unsplash 上拍摄的照片
在 2020 年的最初几个月,世界面临着近代史上最大的威胁之一:一种新的冠状病毒正在全球传播,有可能成为疫情。
谈到瘟疫,最需要担心的是健康,对于所有关于新冠肺炎的信息,我的建议是关注世卫组织网站,它包含了关于这种新疾病的最新和最可靠的信息。
然而,另一个可怕的方面是冠状病毒爆发将对世界经济产生的影响:许多分析师认为,这种传染病可能会带来严重的负面影响(甚至是长期影响)。
在这篇文章中,我关注了问题的经济方面:新冠肺炎对股票市场有什么影响?投资者认为最重要的事件是什么?媒体的作用是什么?让我们通过几个图表来看看大局。
数据
冠状病毒爆发是一个不断发展的情况:每 5 分钟就有一条新闻有助于更好地确定问题,很难保持领先。然而,整个事件被各种事件打断了。我找到了这个页面,它报道(并更新)了自传染病开始以来的主要事实。从这个列表中,我选择了那些我认为对我的分析最重要的元素:
**2019-12-31 => *"*First cases detected in China*"***2020-01-01 => *"*Wuhan market identified as outbreak hub*"* 2020-01-03 => *"*Passengers screened at Wuhan Airport*"* 2020-01-06 => *"*SARS, MERS and bird flu ruled out*"* 2020-01-07 => *"*Virus identified as coronavirus 2019n-CoV*"* 2020-01-09 => *"*Coronavirus genome sequence released*"* 2020-01-11 => *"*First coronavirus death reported*"* 2020-01-15 => *"*First confirmed coronavirus case in Japan*"*2020-01-2020-01-17 => *"*US has initiated screening of passengers arriving from Wuhan*"* **2020-01-20 => *"*Safety measures at major international airports*"***2020-01-21 => *"*US confirms first coronavirus case*"* 2020-01-22 => *"*WHO hold on declaring international health emergency*"* 2020-01-23 => *"*China implements travel bans*"* 2020-01-24 => *"*Starts building temporary hospital*"* 2020-01-26 => *"*WHO changes risk to 'high'*"* 2020-01-30 => *"*Russia closes 2,700 mile border*"* 2020-01-31 => *"*WHO declares global emergency*"* 2020-02-05 => *"*Japan confirms ten cases on cruise*"* 2020-02-09 => *"*COVID-19 overtakes SARS*"* 2020-02-12 => *"*Japan cruise cases increase to 174*"* 2020-02-13 => *"*Japan reports first COVID-19 death*"* 2020-02-19 => *"*New recoveries exceed new infections*"* 2020-02-21 => *"*Italy confirms fourth case*"* 2020-02-22 => *"*Italy reports one death*"* 2020-02-23 => *"*Italy records cases surge*"* **2020-02-27 => *"*Cases and deaths in Italy rise*"***2020-02-28 => *"*WHO raises global outbreak risk to 'Very High'*"* 2020-02-29 => *"*The US reports first death*"* 2020-03-02 => *"*Deaths cross 3,000 globally, confirmed cases cross 89,000*"*
在分析“什么”方面,我拉了几个股票指数: S & P 500 (美国) FTSE MIB (义大利)日经(日本) SSE 50 (上海) KOSPI (南韩) STOXX50E (欧元区),想法是观察不同市场对各种事件的反应。我在分析中提取的其他有趣数据是 VIX 指数,这是一个基于标准普尔 500 指数期权的股票市场波动预期的普遍衡量指标。所有这些信息都来自雅虎财经(FTSE MIB 数据集)。
另一组有用的信息来自新冠肺炎数据集,该数据集显示了每个国家每天的确诊病例、死亡和康复情况。我下载了 Kaggle 版本。
最后,我想看看媒体对这场危机的影响。不幸的是,没有简单的方法来获取来自世界各地的最新消息,所以我需要自己收集数据。最后,我从 reddit.com 收集信息,更准确地说,是从《世界新闻》的子栏目收集信息。我拿了投稿标题(从 2019 年 1 月初到 2020 年 3 月 6 日)查了一下是不是在说冠状病毒;我知道这是“有多少媒体在谈论它”的一个微弱的代表,但这是我所能做的最好的了。为了收集 Reddit 数据,我使用了pushshift . ioAPI,数据集可从链接https://gofile.io/?c=AW4NiM获得。
市场爆发的主要事件
通过对时间序列的直观检查,我们可以观察到武汉冠状病毒 ( 2019–12–31)爆发后一段时间持续走低。例如,以下图表是上证 50(上海)和标准普尔 500(美国)的收盘价:****

上证 50 的收盘价。红线标记了一些可能影响价格的重要事件

标准普尔 500 的收盘价。红线标记了一些可能影响价格的重要事件
看着上面的图表,并考虑到其他指数也有类似的趋势,我们可以识别出似乎特别重要的两天:**2020–01–20****2020–02–23**;我们可以很容易地看到,在那些日子之后,所有指数都经历了低点(例如,在 STOXX50E(欧元区)也发生了同样的情况)😗***

STOXX50E 的收盘价。红线标记了一些可能影响价格的重要事件
发生了什么事?1 月 20 日很多机场开始实施安全措施。接下来几天的头条都是关于这个的:冠状病毒已经国际化。让投资者感到害怕的是,有证据表明新冠肺炎教不再局限于中国边境,而是开始传播。令人惊讶的是我强调的第二个事件讲述了一个类似的故事:2 月 23 日(以及随后的几天)病毒开始持续折磨意大利。
当然,市场本身并不是独立的,我们需要考虑这种相互依赖性:在全球经济中,如果一个市场下跌,其他市场可能会跟随。不管怎样,我从上述观察中得出的结论是,投资者最害怕的是病毒在国际上传播。
我们还可以看到 VIX 指数在意大利疫情爆发后刚刚上升(下图中的洋红色线条是意大利确诊病例数):

蓝线是 VIX 指数,而洋红色线是意大利确诊病例数。随着意大利的危机越来越严重,VIX 开始崛起
最后,下表显示了从疫情爆发日到数据中最后一个可用日期之间考虑的所有指数的平均下降值(时间序列已经使用 3 天窗口的移动平均进行了平滑处理):
**+-----------+-------------------------------------+
| INDEX |**4th March 2020** vs **31st Dec 2019** Delta|
+-----------+-------------------------------------+
| NIKKEI | **-10.7%** |
| STOXX50E | **-10.1%** |
| KOSPI | **-7.9%** |
| FTSE MIB | **-7.55** |
| S&P 500 | -4.8% |
| S&P 500 | -4.8% |
| SSE 50 | -4.0% |
+-----------+-------------------------------------+**
日本指数似乎是表现最差的一个指数(-10.7%)。我对上证 50 指数(上海)的结果有些怀疑,它可能值得看一看指数构成(尽管中国处理危机相当不错,因此损失可能相当小)。
大众传媒
另一个要考虑的因素是媒体的作用。从时间序列来看,新闻似乎实际上正在产生影响,因为股票指数和大众媒体提及率是负相关的。我想说,这两个信号并不是独立的:股票市场暴跌的事实让新闻变得更响亮。不过,我认为这是一件有趣的事情:

洋红色的线是时间序列,计算世界新闻子编辑上关于新冠肺炎的文章数量

洋红色的线是时间序列,计算世界新闻子编辑上关于新冠肺炎的文章数量
仔细想想,这并不奇怪:我预计当信息开始传播时,大多数投资者会有所反应。我只考虑了提及的绝对数量,而没有按照“情绪”来划分新闻,因为不幸的是,“情绪”是众所周知的。
这两个系列呈负相关的事实也可以从以下散点图中看出(标准普尔 500(美国)、KOSPI(南韩)):

媒体的影响。X 轴代表股票指数,Y 轴代表世界新闻子栏目中与冠状病毒相关的文章数量

媒体的影响。X 轴代表股票指数,Y 轴代表世界新闻子栏目中与冠状病毒相关的文章数量
同样,一个单独的 subreddit 可能是一个弱代理,一个更好的分析将涉及许多其他类型的提及(例如,推文和其他来源)。
结论
很遗憾,没什么好说的了。虽然中国的情况似乎正在稳定,但在欧洲的传播仍然令人担忧,尤其是从健康角度来看。
如果意大利的模式将在其他国家重演,我们可能会预计市场会以类似的方式做出反应,因此目前唯一能做的就是阻止或减缓危机蔓延,以保护健康和经济。
作为一名意大利人,我正带着一些担忧生活在我的国家,但我仍然相信政府和人民将克服这种令人难以置信的情况。让我们交叉手指,希望新冠肺炎会很快被击败,无论是身体健康还是经济健康。
注意:本文仅供参考。本文在任何情况下都不打算被用作或视为金融或投资建议、推荐或出售要约,或任何购买任何证券或其他形式的金融资产的要约。
看看这些其他的文章!
杰森·布拉克绘画的聚类分析——如何利用 k-means 进行色彩分组
towardsdatascience.com](/clustering-pollock-1ec24c9cf447)****
亚洲的冠状病毒与语音技术
新冠肺炎如何加速了可能永远改变通信的“语音技术时刻”

东京。作者照片。
冠状病毒带来了各种各样的创新:韩国发明了免下车测试,立陶宛发明了 3D 打印免提门把手,在这一点上,几乎每个人都把他们的会议和社交活动转移到了 Zoom 这样的网络电话解决方案上。
但在冠状病毒期间袭击亚洲的最有趣的技术趋势之一是语音技术在日常生活中的快速实施和采用:智能扬声器和语音助手允许用户在不接触任何表面的情况下进行交流和交易。
韩国的电影院通过声控售票亭售票。Alexa 在日本的使用大幅增加。中国正在部署人工智能,使其每分钟能打 40 个电话追踪联系人。
突然间,许多亚洲企业意识到,在他们的产品或服务中加入声控元素,将有助于他们适应这个不断变化的时代。
似乎这个特殊的时刻将被视为“技术时刻”——一个危机加速社会变革的时刻,其速度远远超过我们的预期。
语音人工智能有助于避免触摸表面和传播病毒

北京的一个酒店机器人。作者照片。
由于冠状病毒被认为可能在表面持续长达 9 天,北京居民在 1 月份被要求戴上手套按电梯按钮,并尽量减少使用信用卡或现金——这凸显了像我们这样经常触摸手机是多么困难(和危险)。
在韩国类似指令的推动下,韩国三星用户现在可以将他们的智能手机带到任何一家三星商店进行“银河消毒服务”。
这就是语音技术的用武之地。如果你曾经在拥挤的杂货店里试着跑一趟杂货店,检查你的购物清单,进行移动支付,接听你配偶的电话,同时试图避免触摸你的手机,那么你可能至少会考虑尝试一下语音助手。
在新冠肺炎之前,语音控制技术已经在亚洲迅速发展
我们许多西方人第一次体验语音控制是通过苹果的 Siri,它于 2011 年在美国推出。在过去的十年里,Siri 已经有了六种亚洲语言版本(普通话、粤语、日语、马来语和泰语),竞争对手 Alexa 和谷歌助手也大举进军亚洲市场。
然而,亚洲的科技消费者并不局限于西方的选择。韩国、中国和日本也推出了几款自己的语音控制智能音箱。对于韩国 Naver 和中国百度等家喻户晓的公司来说,语音技术是自然而然的下一步,这些技术公司现在正受益于这一趋势。
几个因素使得亚洲成为语音技术特别成熟的市场。“[APAC]地区语音识别市场的高速增长归功于该地区快速发展的经济、年轻人口的存在、不断增长的可支配收入、对高级安全系统不断增长的需求以及越来越多的语音识别设备。”“细致的市场研究”的一份报告摘录说。

中国苏州的聚会者。作者照片。
从亚洲呼叫中心转向聊天机器人和语音人工智能
冠状病毒也迫使菲律宾和印度等国家进行清算,这些国家提供了全球呼叫中心服务的很大一部分。当两个国家都出现严格的封锁时,呼叫中心都在努力生存。在让员工准备在家工作的同时,他们看到随着以前的客户转向使用聊天机器人和人工智能解决方案,损失越来越大。
印度科技投资者、外包集团印孚瑟斯(Infosys)前高管莫汉达斯帕伊(Mohandas Pai)对英国《金融时报》表示:“鉴于你在家工作,而且服务存在滞后,我们将使用更多人工智能、更多聊天机器人和更多自动化。这是永久性的变化,自动化将对这一领域产生深远影响。”
亚洲政府使用语音人工智能进行信息传递和联系人追踪
语音技术不仅令私营部门兴奋。亚洲各国政府正在与语音人工智能提供商合作,以更有效地联系和收集有关病毒传播的信息。
例如,语音技术开发商 iFlytek 在中国和韩国推出了人工智能自动呼叫系统,以帮助跟踪新型冠状病毒的传播。
“根据你的情况,建议你留在室内进行 14 天的隔离观察……我们将把你的信息发送到社区卫生中心进行跟踪,并请联系居民委员会寻求任何帮助,”人工智能机器人被训练说。
语音机器人通过多个问题收集和检查个人身份、健康状况和行踪等信息,可以在五分钟内拨打约 200 个电话,相比之下,手动操作需要两到三个小时。
语音助手的使用在全球范围内都在增加,但亚洲拥有独特的潜力
采用语音控制的趋势当然不仅限于亚洲:总部位于英国的 Voxly Digital 为亚马逊 Alexa 和谷歌助手开发语音应用程序,上个月报告称,48%的英国人越来越多地使用语音助手,因为冠状病毒的缘故。
然而,由于一些亚洲国家政府鼓励免提交易的举措,以及对技术非常友好的年轻人,亚洲国家尤其有可能大量采用这种技术。
中国、韩国和日本的居民也迅速采用了其他冠状病毒相关技术,包括接触者追踪应用程序。
更多的企业将转向语音人工智能来保护员工和客户的安全
市场研究公司 Techsponential 的技术专家 Avi Greengart 告诉法新社,随着公司现在面临新的健康和安全问题,他预计语音技术的商业用途将有更广泛的选择。
“展望未来,办公空间将需要向更多的免触摸控制发展,”Greengart 说。
当乐天文化工厂首席执行官 Won-Gyu Won 率先在乐天的电影院转向声控售票时,他考虑到了他的客户。韩国人将这些解决方案称为“untact”(非接触式)技术,并涌向有助于他们感到安全的企业。
花更多时间在家?这样你就可以花更多的时间使用你的智能音箱
亚洲消费者越来越多地使用语音技术的最后一个原因是:正如我们在伦敦的例子中看到的那样,许多亚洲人现在花更多的时间在家里。即使封锁被解除,韩国和台湾等国家仍牢记过去冠状病毒的爆发(包括 MERS 和 SARS ),他们知道呆在家里是保持安全的最佳方式。
对于这些家庭来说,Alexa(或小肚、克洛娃或 Kakao)不再只是他们的起床电话或晚上冥想——她现在在他们在家煮一日三餐时播放播客(或从整个亚洲的许多外卖应用程序中的一个订餐)。一个语音助手帮助从印度到日本的家庭找到他们所在地区感染的最新信息,并在家里订购理发工具。
我们花在语音助手上的时间越多,我们就越能感受到它们的便利。
小杜,小杜:告诉我们,因为冠状病毒,还有多少亚洲企业将增加语音控制功能?
我们期待找到答案。
萨拉·玛利亚·哈斯本是子午线语言学的创始人,该公司向科技公司提供亚洲语言数据和语言咨询。


浙公网安备 33010602011771号