《有志统计学家的随机变量入门》
原文:
towardsdatascience.com/the-aspiring-statisticans-introduction-to-random-variables-7b26a057a89a
当宇宙大喊“惊喜!”时,它从不厌倦。
·发表于 Towards Data Science ·31 分钟阅读·2023 年 5 月 12 日
–
在这篇文章中,我们将踏上一次沉思的旅程,穿越机遇之地。我们将学习关于随机游走、离散和连续随机变量以及它们的概率分布。我们将理解为何给连续随机变量的值分配概率是没有意义的。在这个过程中,我们将揭示概率密度的含义。我们将学习随机过程的形成及其与时间序列模型的关系。最后,我们将通过简短的讨论结束我们的旅程,探讨随机变量如何构成所有回归模型的基础。
关于实验、结果和样本空间
我们经历变化——不可预测的、随机的变化,没有任何可观察的模式或理由。它让我们感到惊讶,令人沮丧,打乱我们最精心策划的计划。
我们在早晨的闹钟声中睡过头,我们被困在交通拥堵中,我们迟到了会议。结果发现会议被推迟,因为召集会议的人也被困在了交通中。
但随机性并不总是恶魔。还记得当分心的咖啡师多倒了几毫米咖啡的时候吗?你抗议了吗?我们已经学会了安静地享受大自然的小小意外。
我们追求可预测性、确定性和稳定性。但这些都是无法找到的。我们的感官和大脑并没有进化到能随时知道一切。我们经历随机变异,因为我们并非全知全能。另一方面,上帝可能用不到骰子。但即便如此,这也是有争议的。
我们学会了利用随机性。游戏中有赢有输是通过掷硬币决定的。一枚硬币的翻转决定了一匹珍贵马匹的归属。而正是一次硬币翻转给了俄勒冈州的波特兰市这个名字。
从更宏大的尺度来看,随机数驱动着加密大部分互联网数据的TLS 协议。
从更宏大的尺度来看,我们的太阳每大约 11 年左右就会翻转一次磁场。这里的“左右”意味着太阳不想准确告诉我们下一次翻转的时间。
你起床的时间、早晨杯中的咖啡量、你喝下它的次数、你一生中掷出的所有硬币的结果以及我们太阳翻转磁场所需的年数——这些都是随机数。随机值是通过某些活动(如掷硬币)产生的。在统计学中,这种活动被称为实验。
当你进行实验时,你期望一个结果,通常是几种可能结果中的一种。当你掷一枚硬币时,你期望它落在正面或反面。但是,如果它卡在泥土边缘或者滚进了排水沟呢?如果你在珠穆朗玛峰上掷硬币,风可能会把硬币吹走。如果你在国际空间站内掷硬币……嗯,你明白了。你是否应该忽略这些结果?这取决于你为什么要掷硬币。如果你的行动方案取决于硬币落在正面还是反面,你不关心其他任何结果,你会希望设计实验以确保得到正面或反面。需要记住的一点是,实验的设计决定了结果。作为实验者,你必须设计实验以只产生对你有意义的结果。
我们只对正面和反面感兴趣。因此,让我们在一个空房间的平整地面上掷硬币。地板上没有黏稠的泥土,也没有排水沟或格栅。这个受控实验的可能结果是{正面,反面}。这是实验的样本空间。它是所有对你有意义的可能结果的集合,用字母S表示。如果你观察到除了正面或反面以外的任何结果,你必须将其视为未发生过,并重新进行实验。你也可以重新设计实验,将意外结果纳入样本空间。或者,你可以简单地宣布失败然后去钓鱼。
如果实验产生了 N 种可能结果中的一种,那么样本空间S是{s_1, s_2, s_3,…,s_N}。S的大小,用|S|表示,是 N。
当你进行实验时,S中的每个结果都是可能的。当S={正面,反面}时,两种结果的发生概率分别记为 P(正面)和 P(反面)。在一般情况下,第 k 个结果的发生概率记为 P(s_k)。
在我们的受控实验中,硬币必须落地为正面或反面。没有第三种结果。这两种结果也是互斥的。如果硬币已经是正面,它不可能同时是反面。
所以硬币落地为“正面或反面”的概率是:
P(正面 ∪ 反面) = P(正面) + P(反面) — P(正面 ∩ 反面) = P(正面) + P(反面) = 1.0
这就像是在说,当你抛掷一枚硬币时,它落地的结果要么是正面,要么是反面,概率是 100%。在精心安排的实验的受控环境中,这种说法从不为假。逻辑学家称之为重言式。这可能听起来是个琐碎的声明,但对实验者来说非常实用。在你设计了只产生互斥结果的实验之后,你应该验证样本空间中所有结果的概率总和是否为 1.0。如果不是,那么你的实验设计存在问题。简单来说,你需要重新设计实验。
样本空间中所有结果的概率总和是完美的 1.0(即 100%)(图像来源:作者)
采取行动:在岛上随机漫步
之前我们谈到过根据实验结果采取一些行动。让我们进一步探讨。如果你是曼哈顿的游客,想要进行自助游,一般来说,可以通过拿一本旅游指南书或下载一个应用程序并按照其指示行事来实现。
但是如果你让硬币引导你在曼哈顿游览呢?下面是一个假设的“硬币操作”探索的运作方式:
假设我们从 W 34th St. & 8th Ave 的角落开始,正好在 Penn Station 外面。然后我们抛一枚硬币——也许不是一枚真正的硬币,而是一个由掷币应用程序生成的伪硬币。如果结果是正面,我们向右转,否则向左转。不管怎样,我们一直沿街走,直到遇到下一个 3 叉路口或 4 叉路口,然后再次抛硬币并重复这个过程。如果我们遇到死胡同,我们只需回到之前的交叉口。我们所经过的路径被称为随机漫步。
在曼哈顿的随机漫步。左转标记为蓝色。右转标记为红色。(图像来源:作者)(地图底图版权 OpenStreetMap 依据 OpenStreetMap 许可证)
在随机游走过程中,你会根据硬币是否显示正面或反面来选择右转或左转。我们将右转或左转的动作称为一个 事件。让我们创建一个新集合 E,其中包含这些 事件。E = {右转,左转}。
注意,右转或左转的动作完全是随机的。我们将用一个 随机变量 来表示这个动作,我们用加粗的大写字母 X 来表示。
换句话说,我们定义随机变量 X 来包含我们在硬币翻转后所采取的动作。因此,X 将根据 S={正面,反面} 中的结果假设 E={右转,左转} 中的两个值之一。注意 X 是如何将 S 中的值映射到 E 中的。结果到事件。
正面 → 右转
反面 → 左转
这样的映射让我们想起了什么?它们让我们想起了一个函数。X 是一个函数!所以让我们将其写成函数形式如下:
X(正面)= 右转
X(反面)= 左转
你也可以用以下集合符号写 X,它有额外的好处,让你看起来非常聪明:
X:S → E
无论如何,所有这些都表示 X 是一个函数,它将集合 S 中的值映射到集合 E 中的值。
随机变量 X 将结果映射到事件(作者提供的图像)
让我们回顾一下:随机变量是一个函数,它将随机结果集合 S 中的值映射到你感兴趣的事件集合 E 中。由于 X 是一个函数,它有一个定义域和一个值域。X 的定义域是样本空间 S 中的结果。X 的值域是 E 中的事件。
随机变量有三种类型:离散,连续,和 混合。X 恰好是第一种。因此,让我们仔细看看离散类别。
离散随机变量及其属性
随机变量 X 是驱动我们在曼哈顿随机游走的引擎。我们应当注意到 X 的以下属性:
-
X 假设为离散值“右转”和“左转”(与温度这样的连续值相对)。因此,X 是一个 离散随机变量。
-
你不能说右转比左转更大或更小。你不能对 X 取的两个值施加任何顺序。相反,你必须将它们视为相等。我们称这类随机变量,其范围包含无法排序的值为 名义随机变量。
-
由于每个结果 s_k 在 S 中都有一个关联的概率 P(s_k),每个事件 x_i 在 E 中也都有一个关联的概率 P(X=x_i)。
-
P(**X=**x_i) 被称为 概率质量函数 (PMF) 。PMF 为随机变量的每个可能值分配一个概率,即事件集合 E 中的每个值。
-
所有E中的 x_i 的概率总和为 1.0。这里没有惊喜。根据随机游走实验的设计,一旦你的硬币落在正面或反面,你将要么左转要么右转。E中没有其他可以随意选择的动作或事件。硬币完全和绝对地指引你的行动。你对这个问题没有个人意见,没有自由意志。但如果你想要自由意志怎么办?我们很快会讨论这个有趣的情况。现在,没有自由意志意味着 P(X=左转) + P(X=右转) = 1.0。
随机变量作为‘满射’函数
在随机游走实验中,X恰好将S中的每个值映射到E中的唯一值。正面映射到右转,反面映射到左转。集合论家称这样的函数为一一对应和满射。一一对应函数允许你将E中的某个值完全不映射到S中的任何东西。但你必须将它映射到S中的恰好一个值。这就是一一对应函数的工作原理。
一个满射函数要求你将E中的每一个值映射到S中的至少一个值。即使E中的多个值映射到S中的同一个值也无所谓。满射性要求的是E中的所有值都必须被映射。
结合一一对应和满射的属性意味着S中的每一个值都被映射到E中的恰好一个值,反之亦然。S和E最终具有相同数量的值。这是X的一个特征,但它不必是所有随机变量的特征。
随机变量不需要是一一对应的函数。但随机变量需要是满射函数。如果一个随机变量不是满射函数,会怎样呢?在这种情况下,它的范围E将包含一些与其定义域S中的任何结果都没有关联的事件。假设你在处理一个X,它的定义域S是{正面, 反面},范围E是{右转, 左转, 走进迎面而来的交通}。如果你的行动总是由一个硬币抛掷的结果来指导,告诉你在交叉路口左转或右转,那么你什么时候会故意走进迎面而来的交通呢?显然,永远不会。
现在,如果你在想,“为什么我的游走总是要听从一个愚蠢的硬币呢?难道我没有权利行使我的自由意志吗?”是的,你有。你刚刚要求的是另一个随机变量。为了帮助你行使自由意志,我们将定义一个新的变量Y,其定义域S是{正面, 反面, 练习自由意志},范围E是{右转, 左转, 做些事情(不是愚蠢的)}。
Y(正面)= 右转
Y(反面)= 左转
Y(练习自由意志)= 做些事情(不是愚蠢的)
再次强调,E中的所有内容都被映射到S中的某些东西,使得Y成为一个满射函数。当你设计随机变量时,你实际上不能避免将它们设计成满射函数。
一个更复杂的例子:右转次数计数
如前所述,随机变量不一定是一对一的函数。实际上,许多随机变量是多对一的函数。让我们看一个例子。
在你在曼哈顿的硬币控制的漫步中,如果你想跟踪你在任何 4 次转弯序列中右转的次数,你可以定义一个随机变量W来保存这个值。在你进行的任何 4 次转弯序列中,W将包含你右转的次数。W的值域是E={0, 1, 2, 3, 4},而W的定义域是一个包含所有可能的长度为 4 的正面和反面的序列的样本空间S。
S = {“HHHH”,“HHHT”,“HHTH”,“HHTT”,“HTHH”,“HTHT”,“HTTH”,“HTTT”,“THHH”,“THHT”,“THTH”,“THTT”,“TTHH”,“TTHT”,“TTTH”,“TTTT”}
在S中,我们也可以用右转替换 H,用左转替换 T。如果这样做,S的性质不会改变,但我们将保留 H 和 T,以便记住是硬币投掷驱动了W。
如前所述,W将S中的值映射到E中的值,但这次映射是多对一的:
随机变量W是一个多对一的映射函数(图片来源:作者)
随机变量W与X共享所有特性,除了一个。让我们回顾一下这些特性:
-
W是一个离散随机变量。
-
每个E={0, 1, 2, 3, 4}中的 w_k 都有一个概率 P(w_k)。
-
在W的概率质量函数中的所有概率 P(W=w_k)必须总和为 1.0。如果不是这样,那么W的定义可能存在问题。你应该重新检查一下它的定义。
-
现在,这里是X和W之间的区别:与X不同,W的值E={0, 1, 2, 3, 4} 可以被排序。你右转 0 次小于你右转 1 次,小于右转 2 次,依此类推。这使得W成为一个序数随机变量。回忆一下,X是一个名义随机变量。
概率质量函数
让我们讨论一下随机变量每个值的概率。我们将构建随机变量的概率质量函数。我们从X开始。回忆一下,X的定义域是样本空间S={正面,反面}。X的值域是事件空间E={右转,左转}。右转映射到{正面}在{正面,反面}中的子集。左转映射到子集{反面}。因此,{右转}发生的概率是{正面}子集的大小与样本空间S的大小之比。{正面}的大小表示为|{正面}|,显然为 1,而{正面,反面}的大小表示为|{正面,反面}| = |S|,为 2。因此,我们有:
P(X=右转) = |{正面}| / |S| = 1 / 2 = 0.5
类似地,P(X=左转) = |{反面}| / |S| = 1 / 2 = 0.5
X的 PMF 中所有概率的总和等于 1.0。
X的 PMF(图像由作者提供)
W的 PMF 稍微有趣一些。回忆一下,W是在 4 次掷硬币的任何序列中右转的次数。W的范围是集合E={0,1,2,3,4}。我们将通过构建一个表来计算概率 P(W=w_k)。我们的表将有 4 列。第一列将包含E中的四个值,即{0,1,2,3,4}。第二列将包含映射到这些四个值的S中的结果。例如,如果W=1,你在 4 次掷硬币的任何序列中做出了一次右转。结果为I1 的S中产生了正好一次右转的结果是{HTTT, THTT, TTHT, TTTH}。第三列将包含I的大小,第四列将包含概率 P(W=w_k)。
这是表格:
与W值相关的概率表(图像由作者提供)
让我们验证一下,概率 P(W=w_k)对于 k=0,1,2,3,4 的总和是否为 1.0:
1/16 + 4/16 + 6/16 + 4/16 + 1/16 = 16/16 = 1.0
这是W的 PMF 图的样子:
W的 PMF(图像由作者提供)
X和W的构建很简单。它们的样本空间很小,范围也小。为了计算它们的 PMFs,我们将映射到随机变量每个值的S中的结果计数相加。然后,我们将每个和除以样本空间的大小,如下所示:
P(W=w_k) = |I_w_k|/|S|
让我们来看其中一个概率。在 4 次转弯中做出 2 次右转的概率是 6/16 = 0.375 或 37.5%。这个概率究竟是什么意思?它的实际生活解释是什么?这里有一种解释方法:
每年有数百万游客访问曼哈顿。到达曼哈顿后,假设他们都迫不及待地想要进行一次岛上的步行游览。每个人从城市的 3 路或 4 路交叉口的角落开始他们的游览。在那里,他们从口袋里拿出一个公平的硬币并抛掷。根据它是正面还是反面,他们在交叉口处向右或向左转弯,然后前往下一个交叉口,再次抛掷硬币。他们将这个过程重复四次。当他们都满足了自己的步行欲望后,一个全知的存在统计了所有包含恰好 2 次右转的游览次数,并将这个数字除以总游览次数(或人数)。得到的结果将是大约0.375。
累积分布函数
一旦你知道了W的 PMF,你还可以回答诸如在 4 次转弯的序列中,大多数转弯是否为右转?或者如果你不喜欢右转,最多只有 1 次右转?为了回答这些可能在某些情况下无关紧要但在一般情况下有用的问题,我们需要构建一个叫做累积分布函数(CDF)的新函数。W的 CDF 将返回W的值至多为 k的概率,其中 k=0,1,2,3 或 4。
如果你知道 PMF,构建 CDF 有一个简单的方法:
W=k 的 CDF 是 k=0,1,2,…,k 的概率之和。搞定!
CDF 用大写字母 F 表示。
W的累积分布函数(图像由作者提供)
让我们使用W的 PMF 来计算 CDF:
F(W=0) = P(W <= 0) = P(W=0) = 1/16
F(W=1) = P(W <= 1) = P(W=0) + P(W=1) = 1/16 + 4/16 = 5/16
F(W=2) = P(W <= 2) = P(W=0) + P(W=1) + P(W=2) = 1/16 + 4/16 + 6/16 = 11/16
F(W=3) = P(W <= 3) = P(W=0) + P(W=1) + P(W=2) + P(W=3) = 1/16 + 4/16 + 6/16 + 4/16 = 15/16
F(W=4) = P(W <= 4) = P(W=0) + P(W=1) + P(W=2) + P(W=3) + P(W=4) = 1/16 + 4/16 + 6/16 + 4/16 + 1/16 = 16/16 = 1.0
F(W=5) = P(W <= 5) = P(W=0) + P(W=1) + P(W=2) + P(W=3) + P(W=4) + P(W=5) = 1/16 + 4/16 + 6/16 + 4/16 + 1/16 + 0/16 = 16/16 = 1.0
这里是W的 CDF 的六个值:
F(W=0) = 1/16
F(W=1) = 5/16
F(W=2) = 11/16
F(W=3) = 15/16
F(W=4) = 16/16
F(W=5) 和 P(任何其他大于 4 的值) = 16/16
你可能还想知道 F(.)是否在W介于 0 和 1、1 和 2 等之间定义,即W的分数值。从某种意义上说,计算此类值的 CDF 是毫无意义的。1.5、2.6、3.1415926 等值不属于W的范围。但我们仍然可以计算F对于这些虚构的中间值。因此,根据定义,F(.)的定义域可以具有分数(实数)值,对应的概率也是有意义的。让我们计算 F(W=1.5):
F(W=1.5) = P(W <= 1.5) = P(W=0) + P(W=1) + P(1 < W <= 1.5) = 1/16 + 4/16 + 0 = 5/16
我们可以类似地计算 1, 2)区间内每一个无限个实数的 F(.)。对于每一个数值,CDF 将返回概率 5/16。因此,F(.)的图形将是一条从 k=1 到 k=2 的直线,之后它将跃升到 F(W=2)=11/16。
如果你为每个 k 绘制 F(W=k),你会发现如下的阶梯图:
从 N 个结果中选择 k 个相似结果的方式数(作者提供的图片)
Z 取值 k 的概率是 I 的大小与 S 的大小之比:
在 N 次硬币导向的转动序列中取 k 次右转的概率(作者提供的图片)
对于每个 k=0,1,2,…N 的值,如果你绘制相应的概率 P(Z=k),你会得到一个钟形曲线,如果 N 是偶数,则峰值在 k=N/2 处;如果 N 是奇数,则峰值在 k=(N-1)/2 和 k=[(N-1)/2 + 1] 处。要理解为什么它在这些值处达到峰值,我们可以依据硬币的公平性来解释:
当你的硬币是公平的时,在 N 次翻转的序列中,正面朝上的预期次数是 N/2。因此,期望你向右转的次数也是 N/2。所以,你可以预期在所有其他右转次数的概率中, N/2 次右转的概率是最高的。这解释了 PMF 在接近 N/2 处的单峰。下面的图显示了当 N=60 时 Z 的 PMF。
Z 的 PMF(作者提供的图片)
如果你沿 Y 轴往上看,你会发现大多数Z值的概率是极其微小的。这主要是因为 P(Z=k)公式中的分母有阶乘。当 k 很小的时候,k!很小,但(N-k)!很大,加上 2^N,它们一起使得分母极其庞大。这使得 k 小值时的概率非常微小。当 k 很大时,k!极其庞大,这次它主导了分母,再次把大值 k 的概率压得很低。在 60 次试验中,如果你希望右转次数少于 20 次或多于 40 次,那是不可能的。
Z的 CDF 是 F(Z = k) = P(Z <= k) = P(Z=0) + P(Z=1) + … + P(Z=k)。
我们按如下方式计算这个总和:
Z的 CDF(图片由作者提供)
连续随机变量
现在我们来看看随机领域中的另一种生物:连续随机变量。为了理解它,我们将查看 205 辆汽车的轴距长度:
205 辆汽车的轴距(数据来源:UCI 机器学习数据集库,使用(CC BY 4.0)许可证)(图片由作者提供)
这看似是一个无聊的例子,但它完美地说明了连续随机变量的普遍性。
我们的样本空间是 205 辆汽车的集合。我们将给每辆车一个唯一的 ID,从 1 到 205。因此,S={1,2,3,…,205}。不要把这些标识符看作数字。每个 ID 仅仅是数据集中某辆特定车辆的代理。我们将在这个样本空间中定义一个随机变量Y,将每个车辆标识符S映射到其轴距(以英寸为单位)。问题是,Y的范围是什么?
要回答这个问题,我们必须看一下“距离”的本质。轴距是指车辆前后轴之间的距离。你测量它的准确度受限于你的测量工具的精度以及你可能应用的任何刻意舍入。对于一辆两厢本田车,你可能将轴距测量为 86.57754 英寸,然后舍入到 86.6 英寸。如果你将其舍入到三位小数,那将是 86.578 英寸,四位小数——86.5775 英寸,依此类推。如果有两辆车的轴距分别为 86.57754 和 86.57755 英寸,你可以设想有第三辆、第四辆,甚至任意数量的车,其轴距介于这两个数值之间。不论这两个数字多么接近,总会有一个数字在它们之间。关键是轴距是一个具有无限理论精度的实数。因此,Y的范围是正实数的集合。
这引出了描述连续随机变量的以下方法:
范围是实数集(记作ℝ)的随机变量,或ℝ内的任何连续区间被称为连续随机变量。
因此,Y是一个将S映射到ℝ的子集的函数。它是ℝ的哪个子集呢?由于我们在讨论距离,这个子集是所有正实数的集合,记作ℝ>0。我们将戴上“看起来聪明”的帽子,并用集合符号表示Y如下:
Y : S → ℝ>0
如果Y是离散随机变量,它的范围将是有限的。在这个范围上定义的概率质量函数会为范围内的每个值分配一个概率。你只需确保所有概率加起来等于 1.0。然而,Y是连续的,其范围是ℝ>0,这是一个不可数的无限集,它比“仅仅”无限集还要大。任何尝试在这个集合上构造概率质量函数的努力注定会失败。概率将永远加起来是无穷大!
但肯定的是,每个轴距都有一个概率测度。即使在我们 205 辆车的样本中,我们也看到一些轴距比其他轴距出现得更频繁。轴距的频率分布很容易说明这一点:
车轮轴距的频率分布(图像由作者提供)
假设你需要根据这个数据集猜测随机选择的车辆的轴距。在甚至不查看车辆的情况下,你会希望将其轴距猜测在包含最多轴距测量值的范围内。这个范围是 93.8 到 97.4 英寸,它包含 81 个测量值,所以你会对 81 / 205,即大约 40%的时间猜对。如果你想做出更精确的猜测,你可以将区间大小从 3.6 减少到 1.8 英寸,并根据修正后的频率分布进行猜测,如下所示:
车轮轴距的频率分布(图像由作者提供)
通过将区间大小缩小 50%,我们将区间(93.8, 97.4]分成两个区间(93.8, 95.6]和(95.6, 97.4]。你现在可以将你的猜测“上调”到(95.6, 97.4],并在 54/205,即大约 26%的时间内猜对。这些计算使我们相信,对于连续随机变量,概率至少在值的区间上是有意义的。让我们进一步探讨这个问题。
累积分布函数,重温
请记住,我们的 205 辆车的数据集只是从理论上(不可数)无限的汽车及其相应的实际车轮基数中抽取的小样本。在这个数据集中,如(93.8, 97.4]这样的区间中,理论上(不可数)存在无限多个车轮基数测量值。连续随机变量Y可以取这些值中的任何一个,而无法知道Y取某个特定值的概率。但我们可能找到了一种巧妙的解决办法。
只要我们避免单独的Y值,而是计算Y在某个值范围内的概率,我们就能得到一个相当不错的概率估计。这就是关于连续随机变量需要记住的关键——概率的估计仅在值的范围内才有意义。
一个有用的范围是(-∞, y]。随之而来的概率 P(Y <= y)再次引导我们到累积分布函数(CDF)中。回忆一下,离散随机变量的 CDF 是一个阶梯函数。这个阶梯函数在每个随机变量的值处是不连续的。但由于Y是一个连续随机变量,它的 CDF 不是阶梯函数。相反,它的 CDF 是Y的一个连续函数。那么这个 CDF 的形状可能是什么样的呢?猜测其形状的一种方法是将Y视为一个离散变量。也就是说,我们计算数据集中每个 y 值的 P(Y <= y)的概率。为了方便计算Y的 P(Y <= y)概率,我们将数据排序,使其看起来像这样:86.6, 86.6, 88.4, 88.6, 88.6, 89.5, …, 115.6, 115.6, 120.9。接下来,我们按照以下方式计算概率:
P(Y <= 86.6) = 2/205 = 0.0097561
P(Y <= 88.4) = 3/205 = 0.01463415
P(Y <= 86.6) = 5/205 = 0.02439024
…
…
…
P(Y <= 120.9) = 205/205 = 1.0
事实上,我们可以做得更好。我们将在Y的相邻值之间进行插值。例如,我们假设在 88.4 和 88.6 之间存在一个神秘的数据点 x,并将概率 P(Y <= x) = 4/205 = 0.0195122 分配给两个 86.6 值中的第一个。这种(有些笨拙的平滑技术)确实通过在曲线中添加额外的步骤来平滑 CDF。不管怎样,这就是我们劳动成果的样子:
Y的经验 CDF(图像来源于作者)
再次强调,Y是一个连续随机变量。Y的真实累积分布函数(CDF)是Y的一个连续函数,其形状可能看起来有点像我们构建的阶梯近似函数。不过,真实的 CDF 也可能与阶梯函数完全不同。这完全依赖于我们默默做出的一个关键假设。我们假设我们的 205 辆车的样本能很好地代表总体的特征。如果我们的样本未能做到这一点,那么关于 CDF 的真实形状的一切假设都不成立。
话虽如此,Y 的经验累积分布函数确实有点像正态分布变量的累积分布函数。那么我们来直观地测试一下这个猜测。在我们的数据样本中,平均车轴长度为 98.75659 英寸,标准差为 6.02176 英寸。在经验累积分布函数上,如果我们叠加一个均值为 98.75659、标准差为 6.02176 的正态分布连续随机变量的累积分布函数,看起来是这样的:
正态分布随机变量的累积分布函数叠加在Y的经验累积分布函数上(作者提供的图像)
视觉上,Y 的经验累积分布函数(CDF)似乎以某种程度上拟合了正态变量的累积分布函数。但在车轴长度谱的低区域和中间区域,这种拟合显然不是很好。如果我们使用拟合的正态累积分布函数来估计任何量,这种累积分布函数与数据的不良拟合将导致系统性偏差进入概率估计中。
那么我们要进行什么样的估计呢?一个有用的估计是车轴长度落在某个区间 (a, b] 内的概率。这只是 CDF 在区间两端返回的值之间的差异。
P(a < Y <= b) = P(Y <= b) — P(Y <= a) = F(Y=b) — F(Y=a)
让我们计算区间 (93.8, 97.4] 的概率。记得我们是如何通过频率分布图计算出这个概率为 40%的吗?让我们看看使用经验累积分布函数及其对正态累积分布函数曲线的近似,这个概率是多少。
我们将从设置 a 和 b 开始:
a = 93.8, b = 97.4
在下图中,我们用红色的括号标记了 CDF 曲线 X 轴上的区间 (93.8, 97.4]。我们还将在两个图上标出以下点,从 Y 轴读取累积分布函数值 F(Y=y):
在蓝色图上:
(a, F(Y=a)) = (93.8, F(Y=93.8)) = (93.8, 0.18315)
(b, F(Y=b)) = (97.4, F(Y=97.4)) = (97.4, 0.57982)
在橙色图上:
(a, F(Y=a)) = (93.8, F(Y=93.8)) = (93.8, 0.20522)
(b, F(Y=b)) = (97.4, F(Y=97.4)) = (97.4, 0.41088)
(作者提供的图像)
在任一图上,车轴长度落在区间 (93.8, 97.4] 的概率是:
P(93.8 < Y <= 97.4) = F(Y=97.4) — F(Y=93.8)
如果我们从蓝色经验 CDF 中提取 F(.) 的值,我们得到车轮基距在区间 (93.8, 97.4] 内的概率为 (0.57982–0.18315) = 0.39667(或约 40%)。这与我们使用频率直方图得到的 40%估计值相符。对于这些估计值一致不会感到惊讶。这两个估计值都是从相同的数据样本使用两种不同的方法计算得出的。但如果我们使用理想化的正态 CDF 计算 P(93.8 < Y <= 97.4),我们得到的值是 (0.41088–0.20522) = .20566(或约 21%)。这个值几乎是经验值的一半。如果你查看理想化 CDF 在曲线中间部分与经验版本的偏差,这种向下偏差是可以预期的。
概率密度函数
我们使用的区间大小是 3.6 英寸。你可以将它压缩到一个仍然大于零的任意小长度。CDF 仍然会给你一个有效的车轮基距位于这个超小区间内的概率估计。
例如,如果你想找到车轮基距在以 93.8 英寸为起点,长度为.000001 英寸的区间内的概率。所以你设置 y=93.8 和 δy = .000001,然后计算 F(Y=y+δy) — F(Y=y)。使用标准正态分布 CDF,你可以这样计算这个概率:
P(93.8 < Y <= 93.800001) = 0.20522269383945058–0.20522264662597367 = 4.721347690583855e-08
这是一个非常小的数字。但仍然是有限的正概率。如果你进一步压缩这个区间,与之相关的概率将会进一步减少。如果你想探索在 93.8 处的概率性质呢?为此,你必须切换到不同的度量。这个度量就是概率密度,它由函数 f(.)表示。计算时,你将区间内的发生概率除以区间的长度:
概率在有限区间内的密度(图片由作者提供)
但是如果概率在 (y, y + δy] 区间内不均匀分布怎么办?这难道不会降低Y=y 处密度估计的准确性吗?当我们将直方图图的箱体大小从 3.6 英寸缩小到 1.8 英寸时,正遇到了这种情况。当我们缩小箱体大小时,直方图的 X 轴上的每个区间都缩小了一半。区间 (93.8, 97.4] 被拆分成两个区间 (93.8, 95.6] 和 (95.6, 97.4]。在父区间 (93.8, 97.4] 内有 81 个车轮基距测量值。但这 81 个测量值并没有按大约 1:1 的比例均匀拆分到两个子区间中。相反,27 个测量值进入了 (93.8, 95.6],而剩余的 54 个进入了 (95.6, 97.4]。这揭示了父区间 (93.8, 97.4] 内的概率并不均匀。
如果我们假设在区间(93.8, 95.6]内概率是均匀分布的,我们可以使用经验 CDF 来计算概率密度在 93.8 英寸处的估计值。我们将δy 设置为 3.6 英寸,并按如下方式计算密度:
f(Y=93.8) = [ F(Y=93.8+3.6) — F(Y=93.8) ] / 3.6 = (0.57982–0.18315) / 3.6 = 0.11019
但我们知道在这个区间内概率并不是均匀的。因此,如果我们将δy 缩小到 1.8 英寸,我们预计 93.8 处的密度估计会发生变化。结果确实如此:
f(Y=93.8) = [ F(Y=93.8+1.8) — F(Y=93.8) ] / 1.8 = (0.31587–0.18315) / 1.8 = 0.07373
如果我们进一步将δy 缩小到 0.9 英寸,我们发现估计值再次发生变化:
f(Y=93.8) = [ F(Y=93.8+0.9) — F(Y=93.8) ] / 0.9 = (0.28948–0.18315) / 0.9 = 0.11814
如果我们继续缩小δy,Y=93.8 的概率密度估计值将不断变化。它可能会趋向于一个稳定值,或者可能会在没有明显模式的情况下波动。哪种行为取决于我们的样本数据集的“表现良好”程度——它是否能代表总体。无论密度估计是否波动或趋于收敛,它都不会是Y=93.8 的真实值。那么Y=93.8 处的真实概率密度值是什么呢?真实值,或者统计学家喜欢称之为渐近值,是当间隔δy 缩小到一个无限小的大小时。如果这让你所有的微积分爱好者眼睛发光,你不会失望的。Y=93.8 处的真实概率密度值由以下极限给出:
Y=93.8 英寸处的概率密度(图像作者提供)
从微积分中,我们知道上述极限是Y在 y = 93.8 处的 CDF 的导数。
一般而言,连续随机变量Y的概率密度是其 CDF 的导数:
Y=y 处的概率密度(图像作者提供)
要使用上述 PDF 公式,你需要知道连续随机变量的 CDF。对于Y,我们展示了如何用均值为 98.75659 和标准差为 6.02176 的正态分布随机变量来近似其经验 CDF。如果你对这个正态 CDF 进行微分,你会得到其 PDF,这就是我们熟悉的经典钟形曲线:
N(μ=98.75659, σ²=36.26159)分布的连续随机变量的 PDF(图像作者提供)
反之,如果你知道 PDF f(Y),你可以通过积分 f(Y)得到 CDF:
通过积分 Y 的 PDF 得到 Y 的 CDF(图像作者提供)
如果到现在你感到有些轻微的不安,你并不孤单。那么我们稍微停下来一下。我们一直在轻松地讨论导数和积分,同时随意地在Y(假设Y是离散变量)的经验累积分布函数(CDF)和它的一些连续近似(假设Y是连续变量)之间切换。因此,在这些隐含的假设未被打破之前,让我们先擦清楚眼镜。我们使用的经验 CDF 只是一个工作道具——一个帮助我们说明如何计算 CDF 以及如何从“差分”中获得 PDF 的辅助工具。经验 CDF 在每一步都是不连续的。因此,它实际上是不可导的。但在某些时候,我们必须勇敢地将尽可能好的曲线拟合到经验数据上,这条曲线是连续且可导的,其中的导数和积分是有意义的。我们第一次尝试拟合这样的曲线是使用正态分布变量的 CDF。我们发现它拟合得并不是很好。充其量,它是一个不错的一阶近似,我们可能能够找到其他更合适的曲线。
接下来怎么办?
除了我们所看到的基本概念外,还有很多关于随机变量的知识。例如,通过使用函数,你可以将不同的随机变量组合起来以创建新的随机变量。新变量的属性——其均值、方差、概率质量函数或概率密度函数、累积分布函数可能与单个变量的属性大相径庭。形成线性回归模型基础的一个组合是随机变量的线性组合,如W = aX + bY + cZ。线性组合具有一些特殊的性质。例如,W的均值只是‘a’乘以X的均值,加上‘b’乘以Y的均值,再加上‘c’乘以Z的均值。另一个有趣的组合是通过结合离散随机变量和连续随机变量得到的。这种新产生的变量称为混合随机变量。混合随机变量用于形成混合分布和混合模型。
实际上,回归模型的研究本质上是随机变量的研究。回归模型中的因变量——y变量——是由某种概率分布支配的随机变量。回归变量——X变量——也是随机变量,每个变量的波动由各自的分布决定。一个常见的X示例是虚拟回归变量——一个可以是 0 或 1 的变量。虚拟变量是伯努利随机变量,其概率质量函数如下:
伯努利分布随机变量的概率质量函数(图片由作者提供)
或者一般来说,概率质量函数如下:
伯努利分布随机变量的概率质量函数(图片来源:作者)
当你抛掷一个(有偏或无偏的)硬币时,硬币正面或反面的出现是伯努利随机变量的完美例子。
随机过程
在结束之前,让我们向随机过程打个快招呼。如果你排列几个随机变量,你得到的就是一个随机过程。这将我们带回到曼哈顿的硬币驱动的漫游。
曼哈顿的随机游走(图片来源:作者)(地图背景由OpenStreetMap提供)
随机游走是由一系列硬币抛掷产生的。我们可以将其视为一系列 N 个伯努利随机变量的结果。这使得随机游走成为一个伯努利过程。实际的步行因此是这一过程的具体实现。
所有时间序列数据都是随机过程。如果数据集中包含 N 个时间索引观测值 y_1 到 y_N,每个观测值 y_i 都是一个随机变量。例如,在随机游走中,每个 y_t 都是一个伯努利随机变量。作为时间序列的一部分,y_t 显然排成一个序列,使整个时间序列数据集成为一个伯努利过程的单一观测实例。
在介绍随机变量的部分我们先到此为止。将这篇文章视为你的基点,一个你可以从中开始探索其他随机变量、其属性和应用的地方。
我将留给你一张图片和一个随机变量的想法。图片是美丽的 M2 球状星团。这个想法是定义一个随机变量,其值为图片中任意 10 mm x 10 mm 区域内的星星数量。这个变量的概率密度函数可能是什么样的呢?
球状星团 M2(图片来源:ESA/Hubble,授权方式为CC BY 4.0)
引用和版权
数据集
汽车数据集下载自UC Irvine 机器学习库,使用创意共享署名 4.0 国际(CC BY 4.0)许可证。
图片
本文中的所有图片版权归Sachin Date所有,授权方式为CC-BY-NC-SA,除非图片下方提及了不同的来源和版权。
如果你喜欢这篇文章,请关注Sachin Date,获取有关回归、时间序列分析和预测的技巧、教程和编程建议。
AutoML 的困境
基础设施工程师的观点
·
关注 发表在Towards Data Science · 8 分钟阅读·2023 年 9 月 16 日
–
图片由Fabrizio Conti拍摄,发布在Unsplash
近年来,AutoML 一直是一个热门话题。尽管其炒作声势浩大,甚至有取代人类机器学习专家的雄心,但由于长期未见广泛应用,对 AutoML 的期望正在迅速下降,这严格遵循 Gartner 曲线。
AutoML 在 Gartner 曲线上的表现(作者提供的图像)
在此时,我们需要了解 AutoML 的现状,并找出未来的发展方向。我是一名开发了两个 AutoML 库的 软件工程师,AutoKeras 和 KerasTuner。在这篇文章中,我将帮助你回顾 AutoML 的概念以及阻碍 AutoML 广泛应用的缺失部分。
什么是 AutoML?
想象一下,一个机器学习知识有限的人面临一个实际的图像分类问题。他们可以清楚地定义问题并有训练数据可用。在这种情况下,AutoML 可以帮助构建一个训练好的机器学习模型。
从输入和输出的角度来看,AutoML 做了以下工作。
从输入和输出的角度来看 AutoML(作者图片)
它接受问题定义和训练数据,并输出一个准备部署的训练好的机器学习模型。例如,如果给定一个图像分类任务,它接受训练图像数据集作为输入,并输出一个训练好的图像分类模型。
AutoML 尝试自动化的步骤可能包括数据预处理、特征工程、模型选择、超参数调整、神经架构搜索、模型训练、在测试数据上的推断和数据后处理。
总而言之,自动化机器学习(AutoML)试图弥合各种新颖机器学习模型和训练技术与它们可以解决的实际问题之间的差距,提供端到端解决方案以自动化方式进行。
AutoML 是如何工作的?
对于给定的任务和数据集,AutoML 系统会高效地尝试一系列相关方法或模型,并为你挑选出最佳的模型。
你可以把它看作是一个包含以下步骤的 for 循环:
-
生成模型配置。
-
创建并训练具有配置的模型。
-
对验证数据评估模型。
-
从评估结果中学习以改进配置。
AutoML 系统中的智能代理生成配置,并通过学习评估结果逐步改进。
许多算法可以作为智能代理使用,例如贝叶斯优化或强化学习。然而,在智能代理的核心,它所做的主要是函数近似和函数最大化。让我们逐一了解它们。
-
函数近似。智能代理试图学习模型配置与模型性能之间的关系。用数学语言来说,它试图学习一个函数 y=f(x),其中x 是模型配置,y 是模型的性能。
-
函数最大化。智能代理的最终目标是找到具有最佳模型性能的模型配置。换句话说,我们想找到x,使f(x) 的值最大化,即argmax f(x)。
AutoML 的影响
正如你所想象的那样,如果 AutoML 被广泛采用,其影响将是巨大的。它可以显著提高机器学习从业者的生产力。他们不再需要花费大量时间来微调模型配置的细节。他们可能只需要仔细定义任务并手动约束搜索空间,以更快地获得结果。
AutoML 今天能做什么?
当前 AutoML 的应用相当有限,主要集中在以下两个方面。
-
快速尝试。一些机器学习工程师可能希望快速尝试他们的任务和数据集上的机器学习。他们可以将 AutoML 作为起点。如果他们取得了相对良好的结果,可以进一步手动开发机器学习解决方案。
-
机器学习教育。刚开始学习机器学习的学生可能会使用 AutoML 来了解机器学习能做什么。他们不需要触及机器学习解决方案的所有细节,而是获得对整个过程的快速概览。
AutoML 未来能做什么?
对于 AutoML 未来的期望远高于目前的能力。我们将其总结为三个主要目标如下。
-
对于机器学习专家: 提高数据科学家和机器学习工程师的生产力。
-
对于领域专家: 领域专家,如医疗医生或机械工程师,可以轻松地将 AutoML 应用于他们的问题。
-
对于生产工程师: 发现的解决方案可以轻松部署到生产环境中。
AutoML 的问题
我们已经了解了我们现在的位置以及 AutoML 的未来发展方向。问题是我们如何达到那里。我们将今天面临的问题总结为三类。当这些问题得到解决时,AutoML 将实现广泛应用。
问题 1:缺乏商业激励
建模是微不足道的,相比于开发一个可用的机器学习解决方案,这可能包括但不限于数据收集、清洗、验证、模型部署和监控。对于任何能够负担得起雇佣人员完成所有这些步骤的公司而言,雇佣机器学习专家进行建模的成本开销是微不足道的。当他们能够在不增加太多成本开销的情况下建立一支专家团队时,他们不会费心去尝试新的技术,如 AutoML。
所以,人们只会在其他所有步骤的成本降到最低时才开始使用 AutoML。也就是当雇佣人员进行建模的成本变得显著时。现在,让我们看看我们的路线图。
许多步骤可以自动化。 我们应该对随着云服务的发展,开发机器学习解决方案中的许多步骤能够被自动化持乐观态度,比如数据验证、监控和服务。然而,有一个关键步骤是永远无法自动化的,那就是数据标注。除非机器能够自我学习,否则人类将始终需要为机器准备数据。
数据标注可能会成为开发机器学习解决方案的主要成本。如果我们能减少数据标注的成本,那么他们将有商业动机使用 AutoML 来消除建模成本,这将是开发机器学习解决方案的唯一成本。
长期解决方案:不幸的是,减少数据标注成本的终极解决方案今天并不存在。我们将依赖未来在“小数据学习”方面的研究突破。一种可能的途径是投资于迁移学习。
然而,人们对迁移学习不感兴趣,因为在这个主题上很难发表论文。有关更多详细信息,你可以观看这个视频,为什么大多数机器学习研究是无用的。
短期解决方案:在短期内,我们可以使用小数据对预训练的大模型进行微调,这是一种简单的迁移学习和小数据学习的方法。
总而言之,由于大多数机器学习解决方案的开发步骤已经通过云服务自动化,而 AutoML 可以使用预训练模型从较小的数据集中学习,以减少数据标注成本,企业将有商业动机应用 AutoML 来降低其机器学习建模成本。
问题 2:缺乏可维护性
所有深度学习模型都不可靠。模型的行为有时是不可预测的。很难理解模型为何给出特定的输出。
工程师维护模型。如今,我们需要工程师在模型出现问题时进行诊断和修复。公司与工程师沟通,处理他们想要更改的深度学习模型的任何事宜。
AutoML 系统比工程师更难以交互。如今,你只能将其作为一种一次性的方法来创建深度学习模型,通过提前给 AutoML 系统提供一系列明确定义的数学目标。如果在实践中遇到问题,它将无法帮助你解决。
长期解决方案:我们需要在 HCI(人机交互)领域进行更多研究。我们需要一种更直观的方式来定义目标,以使 AutoML 创建的模型更可靠。我们还需要更好的方法来与 AutoML 系统互动,以便在不花费过多资源重新搜索所有不同模型的情况下,更新模型以满足新需求或修复任何问题。
短期解决方案:支持更多的目标类型,例如 FLOPS 和参数数量,以限制模型大小和推理时间,以及加权混淆矩阵以处理不平衡数据。当模型出现问题时,人们可以向 AutoML 系统添加相关目标,以生成新模型。
问题 3:缺乏基础设施支持
在开发 AutoML 系统时,我们发现一些深度学习框架中需要的功能现在还不存在。没有这些功能,AutoML 系统的能力是有限的。它们总结如下。
第一,具有灵活统一 API 的最先进模型。 为了构建一个有效的 AutoML 系统,我们需要一个大规模的最先进模型池来组装最终解决方案。模型池需要定期更新和良好维护。此外,调用模型的 API 需要高度灵活和统一,以便我们可以从 AutoML 系统中以编程方式调用它们。它们作为构建端到端 ML 解决方案的构件。
为了解决这个问题,我们开发了 KerasCV 和 KerasNLP,这两个基于 Keras 的领域特定库,分别用于计算机视觉和自然语言处理任务。它们将最先进的模型封装成简单、清晰且灵活的 API,满足 AutoML 系统的要求。
第二,模型的自动硬件分配。 AutoML 系统可能需要在多台机器上的多个 GPU 之间构建和训练大型模型。AutoML 系统应能够在任何给定的计算资源上运行,这要求它动态决定如何为给定硬件分配模型(模型并行性)或训练数据(数据并行性)。
令人惊讶且不幸的是,目前没有任何深度学习框架能够自动将模型分布到多个 GPU 上。你需要明确指定每个张量的 GPU 分配。当硬件环境发生变化时,例如 GPU 数量减少,你的模型代码可能会失效。
我尚未看到对此问题的明确解决方案。我们必须给深度学习框架一些时间来发展。总有一天,模型定义代码将与张量硬件位置代码相互独立。
第三,模型的部署简易性。 任何由 AutoML 系统生成的模型可能需要在部署前在云服务、终端设备等下游环境中进行部署。假设你仍然需要雇佣工程师在部署之前针对特定硬件重新实现模型,而这在今天的情况下最为常见。为什么不直接让同一位工程师一开始就实现模型,而不是使用 AutoML 系统呢?
目前有人正在研究这个部署问题。例如,Modular 创建了一个统一的格式来支持所有模型,并将所有主要硬件供应商和深度学习框架集成到这种表示中。当模型使用深度学习框架实现时,可以将其导出到该格式,并在支持该格式的硬件上进行部署。
结论
针对我们讨论的所有问题,我对长期来看AutoML仍然充满信心。我相信这些问题最终会得到解决,因为自动化和效率是深度学习发展的未来。尽管AutoML今天尚未被广泛采用,但只要ML革命继续下去,它就会被广泛应用。
破坏分析的坏循环
意见
对技术工作的过度重视如何对分析造成灾难性影响
·
关注 发表在 数据科学进展 · 6 分钟阅读 · 2023 年 1 月 16 日
–
图片由作者提供。
反馈循环是强大的东西。正反馈可以产生 高度杠杆效应,而负反馈则可以 抑制变化。此外,这些模式对干扰可能 极其 抵抗。如果你不解决根本的驱动机制,反馈循环将继续存在。毕竟,你不能 向太阳泼水。
为什么总是谈论反馈循环?嗯,我怀疑有一个负反馈循环负责分析中的所有问题。就像其他反馈循环一样,这个循环很难打破。
我想你们都感受到了这种影响——我们的影响力从未像它应该的那样高。我们很少被视为思想伙伴。我们做了出色的技术工作,但几乎没有引起重要人士的关注。当然,我们在制定战略决策时有一席之地,但仅仅是作为 SQL 技术员。而且这不是因为没有尝试。我们构建了自助服务系统,我们举行了办公时间,我们创建了复杂的课程以提升我们的同行,但这些举措从未带来持久的变化。
那么这个循环是什么?其实很简单:我们所做的一切都过度强调技术工作,设定了我们只做技术工作的期望。我们对扩大影响力的最佳努力因此被削弱。接下来,我将讨论这个循环,证明它的普遍性,并最终分享我为什么认为工具在解决这个问题上至关重要。
像往常一样,如果你在寻找偏见,我是 Hyperquery的首席产品官,我们正在押注于更好的工具如何解决这种问题,但我会保持客观——我保证。
核心的坏反馈循环
初看起来,似乎有不少不同的反馈循环把我们困在这片无人区。我将介绍其中的一些,以便与你们产生一些共鸣,但我稍后会辩称它们都源于相同的根本反馈循环。但首先,让我们来看看这些常见的破碎模式:
-
“分析就是关于速度”。过去几年里,这一直是关于分析的一个常见的叙述。但是,如果你主要通过工作速度来衡量价值,你就得变得更快,这意味着减少解释时间,考虑业务影响。你的工作范围缩小,迫使你进入一个反应性支持角色。
-
仪表盘过度使用。每当我们制作新的仪表盘时,一方面,我们为业务其他部分提供了更大的自助服务能力。但如果我们过于依赖仪表盘作为主要的沟通媒介,我们就在延续一种数据显而易见的神话——即我们不需要解释。显然,我们需要制作仪表盘,但我们过于频繁地默认使用它们。我们本能地将利益相关者指向仪表盘,而不是理解他们的问题。他们在错误的方式上变得更有权力,他们对我们价值的逐渐狭隘理解将我们固定在数据策展的角色中。
-
我们跳跃到查询的速度太快。我们都做过这种事:你在与高管开会时,为了提供快速的价值,你开始进行少数派报告,进行现场编码。这种做法有其时机和场合,但我们过于急于采取这种方法,而应该思考——从我们已经进行的大量实验和深入研究中总结和提炼。我们未能提供杠杆价值,而是寻求对我们炫目的(确实无与伦比!)技术能力的认可。这静静地成为了别人对我们期望的价值。
-
我们的工具过于技术化。我们的工具是钉在棺材上的最后一根钉子。它们是为技术工作而设计的,以牺牲简单、清晰的传递为代价,提供这些功能。技术能力被置于所有事物之上。我们当然喜欢这样。这迎合了我们每个人心中渴望成为黑客的心理。但你的 SQL 查询和笔记本传达了你应该避免的那种简化表现——它们是以代码为先的,所以你被视作以代码为先。我们尝试通过在更易分享的工具中撰写工作来打破这种局面,但我们对自己规则的遵守往往较低。毕竟,为什么要使用大量工具,当少量工具就能搞定?
常见的线索开始浮现。行业叙事、数十年的商业智能文化、我们的工具,甚至是我们自身的傲慢,都将我们推向一个我们的价值被降级为拉取数据的世界。而谴责我们的基本反馈循环是:我们通过技术技能来展示和评价自己,因此他人也通过技术技能来评价我们。
图片来自作者。
就这样。这就是压迫我们的病理现象。其实很简单:我们渴望影响力,却在追求一种被视作交易技能的卓越表现——我们的 SQL 技能。我们渴望在数据之外有所影响,但我们的目光却只盯着数据。这可能是我们至今仍未证明分析主管价值的原因。或者为什么你还会看到分析总监为其他高管编写 SQL。或者为什么我们的工作是被动的,不管我们做什么似乎都无法摆脱这种循环。
技术工作当然是分析中的必要部分。你不能在没有提取和分析数据的情况下分享见解。我不是说我们应该停止——这显然是不可能的。但我们倾向于过度关注工作中的技术方面,以至于忘记了分析不仅仅是一个技术领域。分析是通过数据提供价值。“通过数据”部分确实是技术性的。然而,“提供价值”并不是。而后者才是真正产生杠杆效应的地方。
工具问题:你不能没有 YouTube 成为 YouTube 明星。
说到这些,我想引起大家对这一因果计算中一个被低估的杠杆的关注:我们的工具。我通常不认为工具是至关重要的。人员和过程是任何成功数据项目的命脉。打破我们技术困境的首要基础要求是思维方式的转变。
但有时工具确实至关重要。毕竟,你不能没有 YouTube 成为 YouTube 明星。而且我们无法忽视的是,我们的影响力受到可用工具的限制。我们的工具——IDE、Jupyter notebook、BI 工具——在很大程度上是技术性的(意料之中)。就像我们一样,我们的工具也专注于创造,而在这个过程中让我们陷入坏的循环。
我的主要论点是:正确的工具可以打破不良循环。例如,正确的工具可以打破我上面列出的循环:
-
打破“速度”循环: 我们的工具不应赋予我们更快地提取和分析数据的能力。它们应当赋予我们将上下文添加到工作中,并同样轻松快速地传递知识而非数据。
-
打破仪表板过度使用的循环: 我们的工具应该推动我们分享可以与上下文并置的可视化,而不是推动我们创建更多的仪表板。
-
推动对齐,而不是垃圾搜索: 促使我们朝着对齐和影响的方向前进,而不是首先进行查询。文字应该始终是首位,因为业务目标应该始终是首位。 SQL 或 Python 可以在之后跟进。
-
根本上不是以创造为先,而是以影响为先。 我们需要专注于核心:文字的传递和解释。因此,基本的原始要求应该是文字及其相关的生态系统。
我们需要一个能推动我们超越技术工作的工具——一个基于我们价值不仅来自于我们推送的代码,而是来自于我们创造的见解的信念的工具。我们正经历一个亨利·福特时刻,我们需要停止对更快马匹的渴望。最终,我们需要一个新颖的界面,能够让我们轻松地制作出提升我们的分析,而不是更多让我们更深入技术领域的工具。虽然我不能确定它会是什么样子,但我有我的怀疑,显然现在正是变革的时机。
最后的评论
反应性、帮助台分析、被忽视的建议——这些问题指向一个系统性问题:我们陷入了一个负反馈循环中。再多的水也无法扑灭这场火。是时候积极对抗我们被极客诱惑的倾向,并在此过程中认真重新考虑我们的工具。
多变量高斯分布下的异常检测基础
异常检测概述、多变量高斯分布的回顾以及在 Python 中实现基本异常检测算法的两个示例
·
关注 发表在 Towards Data Science · 11 min read · 2023 年 7 月 5 日
–
我们与生俱来的模式识别能力使我们能够在填补空白或预测未来事件时运用这一技能。然而,有时会发生不符合我们期望的情况,超出了我们对模式的认知。这些情况被称为异常。如果我们尝试预测某些事物,我们可能希望将异常数据排除在训练数据之外。或者我们可能希望识别异常以改善我们的生活。在这两种情况下,异常检测技术都能在大多数行业和学科领域中发挥作用。
本文将引导你了解异常检测的基础知识以及统计异常检测模型的实现。
什么是异常检测?
一般而言,异常检测是指识别异常现象的过程。异常检测的目标是识别那些与我们的期望不符的事件、发生情况、数据点或结果。因此,实施异常检测的关键是理解预期事件的基本模式。如果我们知道预期的模式,我们可以用它来映射前所未见的数据点;如果我们的映射不成功,而我们的新数据点落在预期模式之外,那么很可能我们发现了异常。
通常有三种类型的异常情况。第一种类型包括相对于整个数据集被认为异常的单独实例(例如,一辆汽车在高速公路上以非常低的速度行驶,相比于所有高速公路交通,这种情况被认为是异常的)。第二种类型包括在特定背景下的异常实例(例如,相比于所有信用卡交易,看似正常的信用卡交易在特定个人的消费模式中却是异常的)。第三种异常类型是集体性的——即使每个实例本身都符合一定的期望,一组实例也可能被认为是异常的(例如,一次单独的欺诈性信用卡交易在亚马逊上可能不显得特别,但在短时间内连续发生的一组交易则很可疑)[1]。
异常检测技术分为三类:
-
监督检测需要数据集中有正标签和异常标签。可以应用诸如神经网络或提升森林等监督学习算法,将数据点分类为预期类别/异常类别。不幸的是,异常数据集往往非常不平衡,通常没有足够的训练样本来使上采样或下采样技术帮助监督学习。
-
半监督检测处理部分标记的数据。半监督技术假设输入数据仅包含正实例,并且输入数据遵循预期模式。这些技术试图学习正案例的分布,以便能够生成正实例。在测试过程中,算法将评估异常实例可能是由模型生成的概率,并使用这一概率来预测异常情况。[2]
-
无监督检测使用完全未标记的数据来创建期望的边界,任何落在此边界之外的都被认为是异常的。
异常检测技术可以应用于任何数据,数据格式会影响哪个算法最为有效。数据类型包括 序列(时间序列、链表、语言、声音)、表格(例如,发动机传感器数据)、图像(例如,X 光图像)和 图(例如,工作流或过程)。
胸部 X 光图像中的异常检测示例 [4]
由于问题和技术的多样性,异常检测实际上是数据科学的一个广泛领域,应用范围广泛。其应用包括:欺诈检测、网络安全应用、销售或交易数据分析、稀有疾病识别、制造过程监控、外星行星搜索、机器学习预处理等。因此,获得强大且高效的算法有可能在许多领域产生重大影响。
让我们看看可以用来检测异常的最基本算法。
用于异常检测的高斯分布
基本的异常检测技术之一利用高斯(即正态)分布的力量来识别异常值。
高斯分布由卡尔·弗里德里希·高斯发现,它建模了许多自然现象,因此是建模数据集特征的热门选择。该分布的概率密度函数是一个以算术平均数为中心的钟形曲线,曲线的宽度由数据集的方差定义。大多数情况都在中心附近,概率密度函数的两端有两个拉长的尾部。实例越稀有——距离中心越远——它成为异常值的可能性就越大。 Eureka!——我们可以利用这个概念来建模数据集中的异常。
概率密度函数,定义为 f(x),测量数据集中某个结果 x 的概率。正式地,
假设我们的数据集只有一个特征,并且该特征遵循正态分布,那么我们可以使用上述的 f(x) 来建模我们的异常检测算法。然后我们可以设置一个阈值 epsilon 来决定一个情况是否异常。Epsilon 应根据启发式方法设置,其值将依赖于使用场景和对异常的敏感度。
描述正态分布的图 [5]
在正态分布中,2.5% 的实例发生在均值下方两个标准差处。因此,如果我们将阈值设置为 0.054,那么在我们的数据集中,大约 2.5% 的事件将被分类为异常(均值下方两个标准差的 CDF 为 2.5,而 -2 的 PDF 为 0.054)。较低的阈值将导致分类的异常更少,而较高的阈值则敏感度较低。
在实际应用中,可能会存在一个权衡,因为一些正例可能会低于阈值,而一些异常值可能会隐藏在阈值之上。理解使用案例并测试不同的 epsilon 值是必要的,然后确定最适合的值。
单特征的例子很简单——如果我们有多个特征怎么办?如果我们的特征完全独立,我们实际上可以取特征概率密度函数的乘积来分类异常。
对于两个不相关特征的情况,这变成
本质上,特征概率的乘积可以确保如果至少有一个特征存在异常值,我们可以检测到异常(假设我们的 epsilon 足够高);如果我们的实例在多个特征中表现出异常值,我们的概率将更小(因为我们的总概率值是各个分数的乘积),从而更有可能将一个值识别为异常。
然而,我们不能假设我们的特征是独立的。这就是多变量概率密度函数发挥作用的地方。在多变量情况下,我们构建一个协方差矩阵(用 Σ 表示)以捕捉特征之间的关系。然后,我们可以利用协方差矩阵来避免“重复计算”特征关系(这是一种非常初步的表述实际发生的情况)。多变量分布概率密度函数的公式如下,这些来自杜克大学的幻灯片很好地推导了这个公式。
在这里,x 是一个输入向量,μ 是特征均值的向量,Σ 是特征之间的协方差矩阵。
为了简化我们的工作,我们可以使用 scipy 库来实现这个函数:scipy.stats.multivariate_normal 以特征均值和标准差向量作为输入,并且具有一个 .pdf 方法用于根据一组点返回概率密度。
让我们在实际示例中尝试这个实现。
两特征模型在 Python 中的实现
首先,让我们观察一个具有两个特征的示例,这将使我们能够在欧几里得空间中可视化异常点。对于这个示例,我生成了两个特征,分别从正态分布中抽取了 100 个样本(这些是正样本)。我计算了特征均值和标准差,并利用 scipy.stats 库中的分布信息拟合了一个多变量正态模型。**值得注意的是:**我仅用正样本拟合了我的模型。在实际数据中,我们需要清理数据集,以确保特征符合正态分布,并且没有异常值或奇异值——这将提高模型定位异常的能力(尤其是有助于确保特征的正态分布要求)。最后,我向数据集中添加了 5 个异常样本,并使用 .pdf 方法报告概率。
下图的散点图展示了结果:x1 特征绘制在 x 轴上,x2 特征绘制在 y 轴上,异常点已标注,颜色表示来自多变量概率密度函数的概率。
展示正样本和异常点的散点图 [5]
一旦我们将阈值设置得足够低,我们将能够区分异常值和期望值。下面的两个图表比较了 1x10^-7 和 1x10^-9 的 epsilon 值。1x10^-9 的 epsilon 值往往能更好地捕捉我们预期的异常值,而 1x10^-7 则将一些正样本识别为异常值。
在较高和较低 epsilon 值下识别的异常点的散点图比较 [5]
在这个示例中,很容易识别出 epsilon,因为我们可以直观地描绘和识别异常点并分析结果。让我们看看在具有更多特征的示例中情况如何变化。
使用 Python 实现多变量模型
在这个示例中,我将使用 葡萄酒数据集 来自 ODDS 库 [3]。该数据集包含 13 个数值特征和 129 个实例。特征捕捉了有关葡萄酒的信息,原始数据集用于基于葡萄酒分析的分类任务。为了进行异常检测,将目标类别中的一个类进行了下采样,并作为异常点呈现。总共有 10 个异常点,129 个实例中约有 8%。我们处理的是一个相当干净的数据集,没有缺失值。
我们首先必须确保我们的特征符合高斯分布。尽可能的话,我们应当去除异常值,并使用归一化策略对分布进行归一化。在这个数据集中,4 个特征已经符合正态分布(酒精、灰分、灰分的碱度和非黄酮酚)而 4 个特征可以通过取对数来进行归一化(总酚、前花青素、颜色强度和色调)。虽然对剩余特征存在更好的策略,但为了这个练习的目的,我仅仅从我们的训练数据集中删除了它们。最后,我通过排除所有包含至少一个特征值超出或低于均值 2 个标准差的行来去除异常值。其余代码与上述示例相同。
与上节中的两个特征示例不同,现在不再可行在二维平面上可视化结果,但我们可以使用混淆矩阵指标(包括召回率和精确度)以及 ROC 曲线下面积来帮助我们找到适用于用例的正确 epsilon。
由于通常存在精确度与召回率之间的权衡,epsilon 的设置取决于我们用例的敏感度要求。在这个例子中,我寻找一个可以最大化曲线下面积的 epsilon 值。一些用例可能要求尽可能多地找到异常(以包括正值为代价),而其他用例可能只在绝对确定的情况下检测异常(以遗漏一些异常为代价)。我为几个不同的 epsilon 值计算了评估指标。
按 epsilon 值的评估指标线图比较 [5]
随着 epsilon 的增加,召回率提高。尽管在提出的 epsilon 值范围内精确度相对较低,但通常在 0.0035 和 0.0065 左右达到峰值。AUC 尝试在精确度和召回率之间取得平衡,并在 0.0065 附近达到峰值。让我们来看看混淆矩阵。
描述混淆矩阵的表格 [5]
我们的模型在发现所有异常点方面表现相当出色,只漏掉了一个。考虑到我排除了三分之一的特征,这个结果非常棒。不幸的是,我们的模型还将 40 个正实例标记为异常,这意味着如果我们使用这个模型进行异常检测,我们必须手动检查一半的正实例,以确认它们是否确实异常。
为了改进该模型,我们可以进一步工程化剩余特征,并找到可能对异常值稍微不那么敏感的 epsilon 值。这个问题的其余部分是简单的,留给读者作为练习(iykyk)。你可以在这里找到源代码。
高斯异常检测的潜在缺陷
多变量高斯分布是异常检测的一个很好的模型——它简单、快速且易于执行。然而,它的缺点可能会阻碍它在众多使用案例中的应用。
第一,多变量分布可能产生相当低的概率密度值。通常,这对现代计算机来说不是问题。但有时这些值可能会低到计算机无法有效处理的程度。
第二,我们必须确保我们的特征遵循正态分布。如果投入时间和精力进行适当的特征工程和数据处理,这可能不会是一个大问题,但投入的努力是有风险的,因为我们无法在工作完成之前知道回报。
第三,该模型无法处理分类特征。如果我们的数据集中包含分类特征,我们必须为每种分类特征的组合创建一个单独的模型(这可能会成为一项繁重的工作)。
最后,该模型假设所有特征具有同等重要性,并且特征之间没有复杂的关系。处理此问题的一种选择是从头开始实现多变量分布概率密度函数,并包括一些参数来帮助处理特征重要性。为了处理特征关系问题,我们可以进行进一步的特征工程,创建新特征,但这个过程可能会很困难、耗时且有风险(就回报而言)。
尽管如此,使用多变量高斯分布进行异常检测是解决表格数据异常检测问题的一个很好的第一步。它可以用于设定基准,或作为捕捉数据集中异常的完美工具,并为我们提供了一种直观理解异常检测的方法。
感谢阅读!在不久的将来,我希望能做一个关于异常检测的完整系列,如果你对这个话题感兴趣,请继续关注。
来源:
-
www.kaggle.com/code/matheusfacure/semi-supervised-anomaly-detection-survey
-
ai.googleblog.com/2023/02/unsupervised-and-semi-supervised.html
-
Saket Sathe 和 Charu C. Aggarwal。 LODES: Local Density meets Spectral Outlier Detection. SIAM 数据挖掘会议,2016 年。
-
Nakao, T., Hanaoka, S., Nomura, Y. 等。《胸部放射图中的无监督深度异常检测》。J Digit Imaging 34,418–427(2021)。
doi.org/10.1007/s10278-020-00413-2
数学排版由 Codecogs 在线 LaTeX 编辑器 提供。
带有示例的 Jupyter Notebook 可以在这里找到。
对比增强 CT 基础知识
静脉对比增强对于 CT 成像至关重要。它可能如何影响你的 CT 图像数据集
·
关注 发表在 Towards Data Science ·7 分钟阅读·2023 年 3 月 8 日
–
“风格如文森特·梵高的脑部 CT”。 DALL-E 2.
对比剂的使用在放射成像中无处不在,但网上关于这个主题的信息却出奇地少。在这里,我将描述 IV 对比剂的基础知识,它在 CT 图像中的表现,以及它可能如何影响你的成像数据集。
作为从事医学影像研究的数据科学家,了解对比剂在数据集中的使用情况非常重要,因为对比剂会强烈影响 CT 检查的外观,包括强度和纹理。根据应用场景,对比剂可能是成像特征的主要来源,或者是一个不希望出现的变异来源。你还会发现对比剂的使用可能很微妙,有时标记也不准确,因此对这一主题有良好的工作知识将帮助你更有效地组织数据集和规划研究。
CT 衰减基础
要理解为什么在 CT 检查中使用对比剂,首先必须了解一点 X 射线物理学。CT 扫描仪是一个 3D 成像系统,它测量被体内器官和组织吸收的 X 射线能量。在扫描仪内部,旋转的 X 射线管将高能光子射穿身体并进入探测器阵列,探测器测量光子能量的衰减率或衰减。
在计算机断层扫描中,Radon 变换用于将旋转的 1D X 射线投影重建为 2D 轴向图像。GIF 来自WikiMedia。
在体内,密度较高的结构如皮质骨会阻挡更多的光子,增加衰减率。这些高衰减区域在最终扫描中会显得非常明亮。
密度较低的结构,如充满空气的肺部,会通过光子并显得较暗。衰减以Hounsfield 单位(HU)(以 CT 发明者戈弗雷·侯恩斯菲尔德命名)报告,并进行标准化,使空气的衰减值为-1000HU,水的衰减值为 0HU。脂肪组织的典型衰减值为-100 到-50HU,血液的衰减值为+30HU,而软组织的衰减值为+10 到+50HU。
对比材料
对比剂的目的是突出那些否则很难与周围环境区分开的组织。如果没有对比剂,体内大部分软组织的 X 射线吸收非常相似,会显得均匀的灰色。
对比剂通常是静脉注射(注射到静脉中)或口服(吞咽),尽管对比剂也已被改编为所有可能的给药方法。口服对比剂用于突出胃、小肠和大肠的胃肠道成像。静脉(IV)对比剂更为常见,应用于多种指示(也可以与口服对比剂结合使用)。
在这两种情况下,对比剂由惰性重金属如碘或钡组成,这些重金属悬浮在液体溶液中。重金属具有非常高的衰减率,优先阻挡 X 射线能量,在最终 CT 图像中显得明亮。
静脉对比在 CT 中的表现
静脉对比度捕捉了血液在体内的流动。最简单的层面上,血液更多的组织会显得更亮,或增强。在下面的腹部 CT 检查中,左侧 CT 是在注射对比剂前获得的,右侧 CT 是在注射后获得的。脂肪组织(脂肪)血流少,在两幅图像中表现相似,而肝脏和脾脏则由于接受高血流,在最右侧的图像中显得更亮(更增强)。注意最大区别在于主动脉以及肝脏和脾脏的血管。
无对比(左)和后对比(右)腹部 CT。图片来自 Radiopaedia,注释由作者添加。
下面展示了另一个例子,一个来自经历出血性中风的个体的后对比头部 CT 扫描。扫描中明亮的对比剂区域指示了出血的位置和严重程度。
CT 血管造影点征标示了中风患者出血的位置和严重程度。图片来自 Radiopaedia。
对比阶段捕捉了随时间变化的灌注变化
循环是一个动态过程。考虑将少量对比剂注入手臂的静脉(为了确保注射的时间保持一致,对比剂通过泵注入,有时压力高达 300psi)。这种注射量的对比剂需要几秒钟才能到达心脏和肺部。从心脏,它将经过主动脉,分支到主要动脉,再通过毛细血管系统进入体内组织,最后通过静脉循环返回心脏。在多个心动周期中,肾脏会开始从血液中滤除对比剂,并将其排泄到膀胱中。
一名女性接受对比 CT 检查。照片来自 Wikimedia Commons。
CT 对比成像利用循环的这一动态特性,通过在注射后一个或多个特定时间点,或阶段捕捉图像。
数百种 CT 成像协议捕捉了这些对比阶段的各种组合。这些阶段对比 CT 将精确地定时到对比剂注射的时刻,定时会根据扫描目的和要求测试的放射科医师的偏好有所不同。
例如,对比增强特别有用来成像肾脏,肾脏有一个特征性的灌注模式。为了捕捉这一点,影像学协议被定时以捕捉对比剂通过肾脏的精确时刻。我在研究生阶段参与的一个出版物是对使用肾脏对比 CT 训练的分类器的可解释 AI 技术的验证。
肾脏影像学的常见阶段。来自一份在线发布的案例报告。
一般而言,在所有指示下,CT 对比阶段被简化为 4 个类别:
-
前对比或非对比,体内没有静脉对比剂(检查可能在注射对比剂之前进行,或可能根本没有使用对比剂)。
-
动脉期,通常在注射后 15–30 秒,对比剂在心脏、主动脉和动脉中进行灌注。
-
静脉期,通常在注射后约 60 秒,对比剂在组织中进行灌注并返回循环。
-
延迟期或肾图像期,通常在注射后 120–180 秒,对比剂正在被肾脏过滤并从循环中去除。
一项 CT 研究可能只有一个对比阶段,可能有所有四个阶段,或者任何组合。
你需要知道的关于数据科学项目的事项
首先,要意识到对比剂的使用会影响体内几乎每种组织的外观,除了脂肪组织和游离液体;即使是你可能不预期的组织,如骨头,基于对比剂的使用,其强度可以变化 20–30HU。
对比剂系列的组合将根据指示和下单检查的放射科医生的偏好而有所不同。协议也会定期更新。这意味着如果你将来自不同患者群体、不同医院或不同扫描仪的检查组合在一起,你的数据集中可能会出现不一致的对比检查组合。
处理这个问题有两种方法。如果你使用 CT 进行其预期的应用(例如,你在对头部 CT 的胶质母细胞瘤病例进行建模),请准确确定要包括哪些 CT 对比阶段,并将其作为选择标准。例如,你可能要求所有胶质母细胞瘤病例必须有前对比和动脉期对比扫描;如果检查没有这种确切的组合,则将其排除。额外的系列也会被排除。这通常是在讨论研究设计时与放射科医生进行的对话。
如果你使用 CT 进行一种偶发应用,你通常可以更加宽容。例如,我们的骨密度模型可以将脊柱分割出来,是在所有四个对比相位图像上进行训练的。如果病人有多个对比相位序列,我们只需将所有相位上的骨测量值平均即可。我们进行了全面的验证,证明静脉注射对模型准确性没有影响,只对后续密度测量产生轻微影响(误差不超过 10%),我们承认这是我们目前方法的局限性。
最后,这可能是最不幸的事实,对比相位通常没有很好的标注。通常在系列描述中用缩写形式表示,但这些可能很难解释。DICOM 头部有一组标签,从(0018, 0010) 对比剂注射剂开始,但我发现这些报告不一致。我发现的唯一可靠的方法是通过阅读图像本身来准确标记对比相位,并且有 100% 的信心。
CT 对比相位是一个在深度学习的最新突破中有望受益很多的领域。我的同事兼好朋友 Gian Marco Conte 在《放射学杂志》发表了一篇文章,他训练了一个 GAN 来合成脑胶质母细胞瘤缺失的 MRI 序列,类似的方法也可以用于合成 CT 对比相位。
作为一个病人…
虽然我从未进行过 CT 检查,但我个人做过几次静脉注射 MRI,我可以向你保证,使用对比剂是无痛的。在程序开始之前,在你的手臂上放置了一根静脉注射管,在检查过程中,当注射对比剂时,你会感到一阵冷风吹到你的手臂上。有些人声称他们口中有一种金属味,但我个人没有经历过这种感觉。
信息提取的起始:突出关键字并获取频率
一种快速的方法,用于在 PDF 文档中突出显示感兴趣的关键字并计算其频率。
·发表于 数据科学 ·10 分钟阅读·2023 年 8 月 28 日
–
介绍
随着每天可用信息量的增加,能够快速收集相关统计数据对于关系映射和获取对重复数据的新视角变得至关重要。今天我们将深入探讨 PDF 文本提取,也称为信息提取,以及对不同语料库进行快速事实和想法的形成。今天的文章深入探讨了自然语言处理(NLP)的领域,这是计算机理解人类语言的能力。
信息提取
信息提取(IE),正如 Jurafsky 等人所定义的,是*“将嵌入文本中的非结构化信息转化为结构化数据的过程。”[1]。一种非常快速的信息提取方法不仅是搜索以查找某个词是否出现在文本中,还包括计算该词提到的频率*。这一点的支持是基于一个词在文本中出现得越多,它就越重要,并且与语料库的主题关系越大。 重要的是要注意,停用词的去除对于这个过程非常重要。为什么?因为如果你简单地计算语料库中所有单词的频率,像the这样的词会被提到很多次。这是否意味着这个词在传达文本信息方面很重要?不,因此你需要确保你关注的是那些有助于语料库语义意义的词汇频率。
信息提取(IE)可以导致在文档中使用其他自然语言处理技术。这些技术超出了本文的代码范围,但我认为它们既有趣又重要,因此值得分享。
第一种技术是命名实体识别(NER)。正如 Jurafsky 等人详细说明的那样,“命名实体识别(NER)的任务是找到文本中每个命名实体的提及并标注其类型。”[1] 这类似于在文本中搜索单词频率的想法,但 NER 更进一步,通过使用单词的位置以及其他文献规则来寻找文本中的不同实体。
信息提取(IE)还可以支持另一种技术,即关系抽取,这就是“在文本实体之间找到并分类语义关系抽取。”[1]。目标不仅是提取文本中不同词汇出现的频率以及它们所属的实体标签,还要如何将这些不同的实体联系在一起,以形成语料库的潜在语义意义、模式或摘要。
之前的三个任务都与事件抽取的目标相关。Jurafsky 等人进一步指出,“事件抽取是寻找这些实体参与的事件。”[1]。这意味着,通过从文本中寻找和提取不同的统计数据和标签,我们可以开始阐述关于这些事件发生的假设,并且通过这些实体了解不同事件之间可能存在的关系。
过程
过程(图像来源于作者)
该过程的目标是快速了解一个文本语料库是否不仅包含与您所寻找的信息相关的内容,而且还提供频率数据,以便判断是否有足够的信息来进行不同文档之间的比较。最后,它提供了查询词在文本中高亮显示的可视化,这有助于根据周围的词语得出关于关系和文本内容的结论。整个过程是用 Python 在 Google Colab 中实现的,可以轻松地转移到您选择的任何 IDE 中。让我们看看代码吧!
代码
这个代码所需的 Python 库是PyMuPDF和Counter。
import fitz # PyMuPDF
from collections import Counter
接下来,我们将创建一个名为“highlight_terms”的函数,该函数接受一个输入 PDF,一个输出 PDF 的路径,一个输出文本文件的路径,以及我们希望高亮显示的术语。
def highlight_terms_and_count(input_pdf_path, output_pdf_path, terms_to_highlight, output_text_file):
"""
A function which accepts a PDF file and a sting of words as input
and outputs a highlighted PDF file of the queried words and a text file
with the query word frequences.
Arguments:
input_pdf_path (str): Path to a PDF file
output_pdf_file (str): Path to the output pdf file
terms_to_highlight (list): List of terms (str) to highlight
output_text_file (str): Path to output text file.
Returns
output_pd_file : A PDF highlighted with the queried words.
output_text_file: A text file containing the frequency of each queried word.
"""
# Open the PDF file
pdf_document = fitz.open(input_pdf_path)
term_counter = Counter()
for page_number in range(len(pdf_document)):
page = pdf_document[page_number]
# Get the text on the page
text = page.get_text()
for term in terms_to_highlight:
term_instances = page.search_for(term)
term_counter[term] += len(term_instances) # Count term instances on this page
for term_rect in term_instances:
# Create a highlight annotation
highlight = page.add_highlight_annot(term_rect)
# Set the color of the highlight (e.g., yellow)
highlight.set_colors(stroke=(1, 1, 0))
# Set the opacity of the highlight (0 to 1)
highlight.set_opacity(0.5)
# Save the modified PDF
pdf_document.save(output_pdf_path)
pdf_document.close()
# Save term frequencies to a text file
with open(output_text_file, 'w') as text_file:
for term, frequency in term_counter.items():
text_file.write(f"{term}: {frequency}\n")
一旦我们创建了函数,就可以设置文件路径到我们的不同目录。
if __name__ == "__main__":
input_pdf_path = "/content/AlexNet Paper.pdf" # Replace with your input PDF file
output_pdf_path = "/content/output.pdf" # Replace with your output PDF file
terms_to_highlight = ["neural", "networks"] # Add the terms you want to highlight
output_text_file = "/content/term_frequencies.txt" # Text file to store term frequencies
highlight_terms_and_count(input_pdf_path, output_pdf_path, terms_to_highlight, output_text_file)
就这样,简单如斯!这对于分析时快速了解某个词(或词组)在文档中的相关性非常有帮助。此外,当查看高亮显示的输出 PDF 时,标出词语的位置可以帮助引起您的注意,并与查询词周围的其他词语建立关系。
示例
在今天的示例中,让我们看看来自 Google Scholar 的一篇学术文章。如果我想知道一篇文章是否有足够的信息关于Neural Networks,该怎么办呢?我们可以查询文档,然后使用查询到的频率来评估文档是否集中于神经网络。我们将查看的第一篇文档标题为ImageNet Classification with Deep Convolutional Neural Networks[2]。
比如,我们对研究神经网络感兴趣,并想查看这些词在文本中出现的次数和位置。通过查询Neural和Networks,我们将得到一个高亮显示的 PDF,如下所示。
此外,还将创建一个文本文件,记录Neural和Network这两个词的出现频率,分别为 21 和 23。词频的多少确实取决于用户是否认为某个词在文档中提及的次数足够,以至于被认为是相关的。由于这两个词在文档中出现超过 20 次,我认为它们与文档的上下文相关。
这个过程可以轻松扩展到多个文档中,然后可以比较不同文档之间某些词的频率。通过这样做,我们可以比较文档,并得出哪些文档与我们寻求的信息更相关的结论。
限制
虽然这种方法简单且能够完成所需的任务,但还是有一些值得讨论的限制。
-
词汇在语料库中出现的频率越高就越能支持其潜在含义的假设并不总是成立。
-
查询错误的词汇可能导致你无法揭示文本的正确含义或找到你所寻找的信息。
-
该方法论更多地是对信息提取的总结,并为更深入的分析提供了一个起点。
关于假设的第一个局限性认为,词汇使用得越频繁,就越能支持文本的潜在含义,这取决于作者的发表方式和他们如何表达自己的观点,并不总是成立。此外,不同的词汇可以用来描述相同的含义,而仅关注几个高频词汇,你可能会发现自己对文本语料库附加了错误的含义。
第二个局限性来自于第一个关于词汇查询的限制。如果你没有查询正确的词汇,可能会错过文本语料库的重要潜在含义。克服这一点的一种方法是使用 PyMuPDF 或 PyPDF2 将 PDF 转换为文本文档,然后计算出现频率最高的 N 个词。从这些频率中,你可以找出这些词在文本中的位置,这有助于你找到最重要的信息所在。
今日方法论的第三个局限性是它没有深入到信息提取的层面。不过,这段代码确实很好地为你开始文本提取项目奠定了基础,并可以衍生出几个不同的方向。以下是一些你可以从这个过程继续发展的可能方式:
-
开始比较文档,选择某个词及其频率较高的文档。
-
评估文档中突出显示的区域,并创建一个脚本来提取这些区域。然后,对每个句子进行情感分析。
-
与刚才提到的方法相同,只不过现在要执行主题建模分析。任何被突出显示的句子都将用于支持文本中的不同主题。
优势
尽管我提到这个过程存在一些局限性,但它确实有一些好处,我相信你会发现它的使用有些实用之处。首先,它可以展示一个词在不同文本中的相关性。这在学术研究中尤其有帮助,特别是当你在研究某个主题时。如果我在研究机器学习,而一篇学术文章提到它的频率比另一篇高,我可能更倾向于先查看那篇文章。一旦我选择了一篇文章,这个过程将突出显示词汇在该文章中的位置。与其盲目地筛选文献,这个过程将我们的注意力集中在文本中的信息所在之处。说到节省时间!
这个过程的另一个好处是你可以开始标记某些句子的位置,这可能对你引用不同文档中的信息时非常有用。能够追溯到你找到这些信息的地方不仅对提供证据给你的观众很重要,也是一种确保你不会抄袭的好方法。我辅导了许多学生,并且使用这个过程为他们标记不同的文章,以便他们看到我从哪里获得我的工作(根据我们研究的主题),并将标记的文档作为学习的参考。
最后,这个过程是你文本提取项目的绝佳起点。它收集初步统计数据,以开始塑造项目方向,并提供一个可视化的文本理解工具,并为客户提供内在含义的证据。一个真实的例子是,我为一位主要在食品行业工作的客户开发了一个项目。他们想知道他们收到的这份巨大文档(数百页)是否提到他们寻求销售的商品,并且还想知道这些商品与谁相关。我能够查询他们销售的不同商品,并将文档中的产品高亮显示,以便快速参考。他们非常喜欢!我的唯一建议是开始注释页码,这将进一步缩短分析时间!
结论
今天我们讨论了如何分析 PDF 文档,找到并定位文档中的感兴趣词汇。此外,我们还可以收集查询词汇的频率,以更好地理解文本语料的可能含义,以及是否与我们想要深入了解的内容相关。信息提取至关重要,因为它不仅帮助我们发现不同实体之间的关系,还能提供关于这些相关实体和不同文档中可能出现的行为模式和事件的洞察。试试这个代码,希望它对你下一个自然语言处理项目有所帮助!
如果你喜欢今天的阅读,请关注我,并告诉我是否有其他话题你希望我深入探讨!如果你没有 Medium 账户,可以通过我的链接 这里 注册(这样我会获得小额佣金)!此外,可以在 LinkedIn 上添加我,或者随时联系我!感谢阅读!
来源
1 最佳替代 Seaborn Distplot 的 Python 库
原文:
towardsdatascience.com/the-best-alternative-to-seaborn-distplot-in-python-ea95391e6d29
数据科学
Seaborn Distplot 已被弃用——让我们探索它的替代品
·发表于 Towards Data Science ·8 分钟阅读·2023 年 6 月 14 日
–
图片来源:Bon Vivant 于 Unsplash
Seaborn 是 Python 中一个著名的数据可视化库。
由于它建立在 matplotlib 之上,并且与 pandas 数据结构完美兼容,因此在 Python 中处理数据时非常方便,因为它将数据转化为有洞察力的可视化图表。它有助于专注于所需的信息并更快地掌握结果。
然而,每个库都会随着时间的推移而发展,Seaborn 也是如此。
当我在项目中使用 Seaborn 创建分布图时,遇到了函数弃用的警告,如下所示。
图片来源:作者
所以,我开始寻找替代品,并今天分享我的发现。
在这篇简短的文章中,你将了解为什么 Seaborn 弃用了出色的函数distplot()
,目前的最佳替代方案是什么,以及如何使用它创建与distplot()
相同的图表。
这里是内容的预览——
· Seaborn 中的 Distplot · 为什么 Seaborn Distplot 被弃用? · Seaborn Distplot()的替代方案有哪些? ∘ Seaborn 中的 displot() · displot()在 seaborn 中的使用场景 ∘ 双变量分布 ∘ 数据子集的图表
我选择了令人惊叹的例子来使这篇文章有趣,并使用了来自 UCI 机器学习库的 Dry Beans 数据集,该数据集在 CC BY 4.0 许可下提供。
Dry Beans 数据集 | 图片来源:作者
让我们深入了解吧!
在查看替代方案之前,首先了解一下 distplot()
函数及其用途。
Seaborn 中的 Distplot
Distplot()
是 Seaborn 库中的一个多功能函数,广泛用于单变量数据分析。它帮助你在同一可视化中创建直方图和核密度估计(KDE)图。
什么是单变量数据分析?
它用于一次探索单个变量的特征和分布,而不考虑其与数据集中其他变量的关系。
回到 distplot()
,它由直方图和 KDE 图组成。
Distplot()
中的直方图显示了落入不同桶(即箱)的数据点的频率或计数。
整个数据点序列或列表被分箱成不同大小的桶。可视化图形只是一个条形图,其中 X 轴通常是桶或箱,Y 轴表示桶中的数据点数量。
这样的图有助于你了解数据如何在数值范围内分布。
而 KDE 图则通过分析基础概率分布函数来帮助你可视化变量的分布。简单来说,它帮助你理解在不同的桶或箱中观察数据点的可能性。
使用 KDE 图,你可以了解数据分布的形状、峰值及其扩展范围。
例如,我们可以对“Perimeter”这一列使用 distplot()
函数。
import pandas as pd
import seaborn as sns
df = pd.read_excel("Dry_Bean_Dataset.xlsx")
sns.distplot(df["Perimeter"])
Seaborn distplot() | 作者提供的图片
如上图所示,条形图表示直方图,而平滑的线条表示 KDE 图。
正如我提到的,distplot()
在已经创建的直方图上创建了一个 KDE 图,这就是为什么在 Y 轴上你可以看到概率密度值的原因。
不要混淆概率与概率密度!
你需要将概率密度乘以曲线下的面积,以从每个概率密度值中获得概率。
这样的 KDE 值只能用于不同桶之间的相对比较。
现在,让我们理解一下为什么将来不应该使用它。
为什么 Seaborn 的 Distplot 被废弃了?
Distplot()
是 Seaborn 库中最早添加的几个函数之一,因此其函数定义与后续添加的其他函数有显著不同。
这是根据 Seaborn 官方文档 的 distplot()
函数定义。
seaborn.distplot(a=None, bins=None, hist=True, kde=True, rug=False,
fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None,
color=None, vertical=False, norm_hist=False, axlabel=None, label=None,
ax=None, x=None)
迈克尔·瓦斯科姆 精确地解释了——distplot()
API 既没有用于选择 DataFrame 列的 x、y 参数,也没有条件 hue
映射。
所以,当 Seaborn 开发者在更新 Seaborn v0.11.0 中的分布模块时,他们发现没有比废弃 distplot()
更好的方法来使其与其他分布图函数保持一致。
结果是 Seaborn 的distplot()
在 Seaborn v0.11.0 中已被弃用。
调用这个函数并不会真正阻止你创建图,但它会发出一个弃用警告,如我之前提到的。
这就是为什么我开始探索其他替代方案。
Seaborn Distplot()的替代方案是什么?
Seaborn 文档建议了两个替代方案——displot()
和histplot()
。但我个人发现displot()
是一个多功能的解决方案。
让我展示一下与已弃用的distplot()
相比,它有多相似或不同。
Seaborn 中的 displot()
这是一个适用于所有类型(单变量和双变量)分布图的一站式解决方案。你需要做的就是传递一个 DataFrame 和你想查看分布的列名。
所以,要获得类似上面的分布图,你可以使用以下代码来处理‘Perimeter’列。
sns.displot(df, x="Perimeter")
使用 seaborn displot()的直方图 | 图片作者
它简单地创建一个与已弃用的distplot()
函数创建的直方图相同的直方图。你可以使用函数histplot()
获取这种类型的图,它是已弃用函数的另一个替代方案。
那么 KDE 图呢?
你也可以使用displot()
函数获取 KDE 图。这时,**kind**
参数就会发挥作用。你可以将**kde**
赋值给kind
参数,以获取如下所示的 Kernel Density Estimate 图。
sns.displot(df, x="Perimeter", kind='kde')
使用 Seaborn displot()的 KDE 图 | 图片作者
到目前为止,一切都很好!
但你可能会有一个问题——displot()
函数如何创建一个类似于distplot
的图,其中 KDE 绘制在直方图的顶部?
答案是——**kde**
参数。
正如你所见,默认情况下displot()
创建一个直方图。因此,要在直方图上方创建 KDE 图,你可以将**kde**
参数设置为**True**
,如下所示。
sns.displot(df, x="Perimeter", kde=True)
Seaborn 使用 displot()的直方图和 kde 图 | 图片作者
使displot
函数与distplot
不同的真正原因是上面图表的 Y 轴。
在已弃用的函数distplot()
中,Y 轴表示概率密度,而在函数displot()
中,Y 轴表示计数,即每个箱子的数据显示点数量。
Y 轴上的计数可以直接帮助你理解哪个箱子或值的范围包含最多/最少的数据点,而这在概率密度情况下并非如此。
好吧,displot()
函数的灵活性不仅仅止于此。让我展示一下你可以用这个函数做什么,这在distplot()
中是比较困难的。
seaborn 中 displot()的使用案例
函数displot()
具有大量的参数,你可以调整这些参数来创建各种图形。
seaborn.displot(data=None, *, x=None, y=None, hue=None, row=None, col=None,
weights=None, kind='hist', rug=False, rug_kws=None,
log_scale=None, legend=True, palette=None, hue_order=None,
hue_norm=None, color=None, col_wrap=None, row_order=None,
col_order=None, height=5, aspect=1, facet_kws=None, **kwargs)
你可以在上述定义中看到,kind
参数默认设置为 ‘hist’
,这解释了为什么 displot()
在未指定 kind
参数时创建直方图。
我不会详细讲解这些参数,但我必须提到一些有趣的参数。
双变量分布
displot()
函数能够从 DataFrame 获取输入以及从该 DataFrame 中获取 X-Y 轴变量,使其在你想获得双变量分布,即两个变量的分布时非常有用。
例如,假设你想获取当考虑两个变量 Perimeter 和圆度时的数据点分布。你只需在 X 和 Y 参数中提到这些变量名称,如下所示。
sns.displot(df, x="Perimeter", y="roundness")
使用 Seaborn displot() 的双变量分布 | 图片作者
上述图表清楚地呈现出最大的数据点数量集中在 Perimeter 在 600 到 800 之间且圆度大于 0.85 的暗色区域。
这样你可以为所有数值列获得这种类型的双变量分布。
那么,分类列呢?
在数据集中,你可以看到有一个分类列 — Class,它表示不同的豆类。你可以使用这个变量来创建数据的子集,这些子集可以通过 displot
轻松绘制。
数据子集的图表
使用 displot()
函数时,你无需单独创建 DataFrame 的子集。你只需使用 **hue**
参数来为数据的每个子集创建直方图或 KDE 图。
让我们看看它的实际效果 —
sns.displot(df, x="Perimeter", hue='Class')
使用 Seaborn displot() 创建数据子集的直方图 | 图片作者
这就是你如何为数据的每个子集查看不同直方图的方法。
如果你希望在不同的子图上获取这些不同的直方图,那么你应该使用 col
参数,而不是 hue
参数,如下所示。
sns.displot(df, x="Perimeter", col='Class')
使用 Seaborn displot() 的子图 | 图片作者
这样,displot()
将根据你的不同子集创建相应数量的子图。
你可以根据项目需要探索 displot()
中的其他参数。
希望你觉得这篇文章有用。每个数据分析库随着时间的发展而不断演变。因此,一些函数会被弃用,取而代之的是改进后的函数,它们提供更好、更简单的用户体验。
尽管 Seaborn 中的 distplot()
已被弃用,但它并没有完全退出市场。你仍然可以使用它,但最好切换到更好的函数—displot
,以获得不同的分布图。
有兴趣阅读更多在 Medium 上的故事吗?
💡 考虑 成为 Medium 会员 以无限访问 Medium 上的故事和每日有趣的 Medium 通讯。我将获得你费用的一小部分,但对你没有额外费用。
💡 一定要注册并加入 100+其他人,以便不再错过关于数据科学指南、技巧和最佳实践的文章,包括 SQL 和 Python。
感谢阅读!
数据集:干豆数据集
引用:Dry Bean Dataset. (2020). UCI 机器学习库。 doi.org/10.24432/C50S4B
。
许可证:CC BY 4.0
AI 和数据领导力的最佳学习路径
原文:
towardsdatascience.com/the-best-learning-paths-for-ai-and-data-leadership-fabc3d4f8e36
让数据更有用
如何快速提升数据相关主题的能力
·发表于 Towards Data Science ·7 分钟阅读·2023 年 4 月 30 日
–
(觉得不耐烦?跳过文本和猫咪照片,直接查看学习路径!)
你的 作者。
首先,感谢大家鼓励我写作!我刚注意到,在 Medium 上,我的粉丝社区的规模是 奥巴马 的 70%。哇!
我被这个了不起的社区给予的所有爱所深感荣幸和谦逊。我不知道是因为我是一个乐观的怪人还是尽管如此,但谢谢你们!感谢你们对我职称的不响应,当我随机开关职称时,没有对任何指标产生影响——你们的存在对我来说意义重大,感谢你们关注我的想法,而不是我的标签。特别是自从我经历了近 10 年的职业变化,谁知道我最终决定的变化是否会像假期一样精彩。
与你分享有用的思考一直是我的极大快乐,但现在我已经发布了超过 180 篇博客文章,很多人告诉我你们在我的内容中感到困惑,需要更好的索引。结果发现,对于新读者来说,整理我写的各种主题是非常混乱的。我听到了!并非所有人都对所有内容感兴趣。最终,我会准备一个精心策划的网站来帮助你们,但在此期间,让我通过为所有文章添加标准化的超级标题来迈出第一步。这样,每次你都能知道自己在处理哪个类别,从而直接跳到你感兴趣的内容,而跳过我对随机深奥话题的思考。总的来说,这就像是我为你们准备了小型出版物供你们选择一样。
轻微偏离一下来捍卫各种话题的广泛性,在我脑海中,它们都与相同的事情有关:决策智能!* 无论写作内容有多么数据导向,它始终建立在提升现实世界行动的原则上。决策智能是关于给自己提供技能和工具,将信息(无论是你对午餐谈话的记忆还是你在庞大数据库中的探索)转化为更好的行动(决策!),无论规模(从小吃到千兆字节)还是环境(从选择大学专业到构建AI 系统)。我认为跨越这些话题范围是完全自然的——对于任何认真研究决策的学生来说甚至是必要的——尽管我承认,即使有 180+篇文章,我也只是勉强触及了所有值得了解的内容。
但如果你关注得更为狭窄,希望这个新的索引能为你的知识盛宴增添一些韵律和理由。
这是我的猫赫克斯利帮助我保持索引的地方。
决策技能
在这里,你会找到关于如何成为更好的决策者的建议,无论是否有复杂的算法。它专注于人类方面的内容,如与偏见作斗争、制定目标、理解你的非理性等。这是那些希望从心理学、经济学、神经科学、管理科学、谈判和其他经典决策科学等学科中获得智慧的人所需的地方。
示例:
数据驱动的领导力和职业
针对数据领导者和有志成为领导者的人。这是我放置关于组织中缺少什么、你可能做的导致数据团队成员离职的事情、按什么顺序招聘、如何建立数据驱动文化等文章的地方。我还从有志成为团队成员的角度包含数据科学职业文章,比如面试时需要问的问题… 对于经理来说也很有用(了解你的团队成员关于如何应对你的建议总是很有帮助)。
示例:
与 AI 交朋友
这里我以互联网有史以来最友好的方式,或者你(完全免费!)的钱退回,介绍关于 机器学习 和 AI 的概念。部分文章将是更深入(和讽刺的)探索,扩展我在 YouTube 上受欢迎的 与机器学习交朋友(MFML)课程 中的课程(索引 在这里),而其他文章则探讨 AI 时代精神 或我曾经被迫接受的 误解。在这里让自己免疫,以便这些对常识的侵犯不会再出现在你的口中。
示例:
不拘一格的揭秘者
我亲爱的 VC 和 CEO 群体,另请高就!(转到上述任何一个类别,但跳过这个。)这个是给(永远的)学生们的。你们中的一些人真的很喜欢我挑一个 随机的深奥术语 并详细解释它,使其变得直观。是的,这非常琐碎!是的,你们大多数人不关心它!但这些东西对那些,嗯,可能三个人来说就像猫薄荷一样,喜欢看 浮夸的术语被削弱、闪亮的新软件被挑剔直到它承认、以及 公式被解释 以便一个孩子(或高管)可以理解。因此,偶尔我会通过展示我们如何深入理解复杂事物来取悦我们四个人。如果我们深入了解,它们就会变得简单。这也是你会发现 为何一个主题在教科书中的位置 的地方。无论它应该在这里还是 绝对不应该在这里(即使没有人告诉学术界)。
示例:
统计思维
我是一个正从统计学中恢复过来的统计学家,可能永远不会完全恢复,因此我有很多要说的统计学内容。太多了!我在一个 10.5 小时的秘密课程中讲述了许多内容,关于统计决策的课程我还没有放到网上(前半小时有盗版形式,但大部分内容正在等待专业摄制组的录制——在此之前,唯一的观看方式是邀请我现场演讲)。偶尔,我会详细阐述课程中提到的一些内容,这个类别就是你可以找到这些内容的地方。
示例:
让数据变得有用
那些关注我一段时间的人应该会认识这三个词……“让数据变得有用的学科”是我对数据科学的定义。欢迎来到这个涵盖一般数据科学加上分析的类别,减去已经被吸收到上面更专业类别中的所有话题。如果你是一个实践中的数据科学家,你会想关注这个类别以及任何一个最符合你兴趣的前面类别。
示例:
如何黑客攻击自己
如果上述类别中没有,那么它要么是我在问答环节中给出的建议总结(通常涉及职业、生存、个人提升或生活平衡),要么是某种技能/见解,让我在成长为你们所熟知和喜爱的(或讨厌的,毕竟这是互联网,嗨)版本时变得更好一点。示例包括公众演讲技巧、制定新年决心的建议和数学冒名顶替症的想法。
示例:
哦,我文章中的许多链接将引导你到我写的其他与突出词相关的文章(还有其他链接会带你去隐藏彩蛋和幽默),因此我的博客是一个复杂的选择你冒险的网络。因为升级自己应该是有趣的,并且带有一点儿随意的偶然性。
享受吧!
(不要忘记 告诉我 你最感兴趣的类别,因为这将有助于塑造我选择的主题平衡。)
谢谢阅读!来看看课程如何?
如果你在这里玩得开心,并且你在寻找一个有趣的、以领导力为导向的课程,旨在让 AI 初学者和专家都感到愉悦,这是我为你准备的小礼物:
课程链接:bit.ly/funaicourse
阅读 Cassie Kozyrkov 的每一篇故事(以及 Medium 上的成千上万其他作家的故事)。你的会员费直接支持…
kozyrkov.medium.com](https://kozyrkov.medium.com/membership?source=post_page-----fabc3d4f8e36--------------------------------)
P.S. 你有没有尝试过在 Medium 上点击鼓掌按钮多次,看看会发生什么? ❤️
喜欢作者吗?与 Cassie Kozyrkov 联系
让我们成为朋友吧!你可以在Twitter、YouTube、Substack和LinkedIn找到我。想让我在你的活动中演讲?使用这个表单与我联系。
脚注
好吧,并不是所有*的内容;我承认那些教你关于公共演讲的课程确实是出于一时兴起。
人类开发者与 AI 合作伙伴的最佳结合
图片由作者使用 Midjourney 制作
生成性 AI 将如何影响产品工程团队 — 第六部分 | 后记
·
关注 发表在 Towards Data Science ·12 min read·2023 年 8 月 1 日
–
这是六部分系列的最后一部分,调查生成性 AI 生产力工具如何影响整个产品工程团队的结构,如 GitHub Copilot、ChatGPT 和 Amazon CodeWhisperer。
在最后一部分中,我们将探讨之前文章中忽略的许多复杂性,人工工程师在人工智能时代的不可替代价值,并对领导者提出反思、适应和创新的号召。
“以前在…”
在这一系列文章中,我们经历了不少旅程,我认为有必要简要回顾一下我们在前五篇文章中涵盖的内容,以便引入我们尚未涵盖的所有内容:
在第一部分中,我们看到生成式 AI 编码工具如 Copilot 和 ChatGPT 有潜力显著提升技术角色人员的生产力,如工程师和数据科学家。这些工具通过自动化繁琐、重复、耗时的任务,改变了开发人员需要做的工作。理论上,它去除了开发人员不喜欢的工作内容,使他们的宝贵工作变得更快更轻松。
在第二部分中,我们考虑到开发任务的自动化程度提高和开发人员生产力的提升,可能会导致产品团队中工程师与产品经理的比例发生重大变化;在历史上,团队中大约有五名工程师对应一名产品经理,但随着生成式 AI 工具的出现,这一比例可能会接近 1:1。
在第三部分中,我们探讨了生成式 AI 编码助手不仅具备了协助基本工作如重构代码或编写测试的能力。我们还探讨了长期来看,AI 工具可能会重构遗留代码,包括创建测试和文档,并简化一些团队结构,如移动应用开发,这些团队结构往往不是因为价值流的差异而创建,而是因为技术技能不同。我们还考虑了对初级工程师及其职业发展的可能影响。
在第四部分中,我们考虑了这种变化如何使公司能够在相同产出的情况下大幅减少工程师人数、在相同预算下快速增加产出,或某种组合。我们开始建模投资增长、预算维护或成本减少之间的选择可能对工程和产品人数的影响。
在第五部分中,我们调查了这些好处可能如何以不同的方式影响不同类型的公司。新的创业公司应该尽快开始使用这些新工具。较大的公司,虽然可能有最强烈的财务压力来改变团队结构,但由于文化惯性会面临适应困难,但今天应该鼓励他们开始实验这些工具,并根据自己的战略做出如何采用这些工具的决策。我们还看到,“外包”公司最有可能受到负面影响,因为客户希望保留内部员工并在其他地方节省成本。
迄今为止我们讨论的一切都围绕着假设**“下一代产品工程团队可能会有更少的工程师”**展开,但我认为可以公平地说,我们在证明或反驳这一假设方面还远远不够。
“是的,但……”
现在,我想讨论过去几个月我在这方面的对话中收到的许多发人深省的挑战,并且要讨论我在服务于最初假设时做出的大量假设。
我留下了很多潜在的反驳意见没有处理,不是因为它们没有困扰我,而是因为在实验这些工具并观察它们如何真正帮助团队的过程中,还有太多的不确定性和工作要做。
这是一个包含许多批评和未回答问题的大清单:
你把大量的信任寄托在 AI 工具上,希望它们能够编写优质的代码。它们不可能像人类一样优秀。
我承认,我对这些工具的质量感到印象深刻,但我也不试图证明它们需要像优秀开发者那样好。我故意避免建模没有技术专业知识的情境,因为根据我使用这些工具的经验,它们仍然需要大量的监督和指导。监督是为了确保它们不会做出愚蠢或危险的事情(比如将 API 密钥写入源代码),指导则是为了确保它们做对了事情(使用正确的语言、框架或设计模式)。
我有一种感觉,这些 AI 工具需要成为软件工程领域的麦当劳;虽然去一家优秀的非连锁餐厅与出色的员工合作可以是一种超凡的体验,但这并不总是可能的。麦当劳在全球范围内都是干净、便宜、健康(我的意思是没有细菌滋生)且最重要的是一致的。正如我一位亲爱的意大利朋友在面对一份大牌连锁披萨时所说,“它不会让你死”。在某种程度上,这就是我们对 AI 工具的期望。
但,我也不认为这就是故事的结局。我们今天看到的工具距离一年的质量还有很大差距。即便在我将原文编辑成这一系列文章的过程中,每天都有关于更多改进的消息;UC Berkeley 推出了一个比 GPT4 更擅长编写 API 调用的模型。微软宣布了“膨胀注意力”,允许模型扩展到数十亿个标记的 LongNet。StackOverflow 宣布了 OverflowAI,承诺对愚蠢的问题提供更多犀利的回应(抱歉,我的意思是,更好、更有用的搜索)。
即使你对现有工具的能力持怀疑态度,我担心忽视它们可能发展出的潜力会显得目光短浅。
[编辑:即便是在我第一次起草这篇文章的一周左右时间内,Stack Overflow 已经宣布了OverflowAI,Github 宣布了防止知识产权问题的额外工具,StabilityAI 宣布了一个专注于编码的 LLM。市场的发展速度令人惊叹]
AI 工具将会面临知识产权问题。还会有安全问题。如果它们停止工作,我们将无法继续工作。
是的,这些都是可能的。
但,这不是我们第一次处理类似问题,我们已经有了应对的方法。我与许多公司交流时发现,他们因为担心泄露公司机密而陷入某种程度的僵局,这些机密可能会被用来进一步训练 LLM。虽然对于免费和个人订阅用户,这种情况可能确实存在,但我强烈建议亲爱的读者自行研究大型供应商,了解具体的风险,以及这些供应商为解决这个非常合理的担忧所采取的措施。查看一些大公司的常见问题解答,以确定是否有足够好的答案来满足你的使用案例和风险情况:OpenAI,Github Copilot,AWS CodeWhisperer(Google Duet 仍在封闭测试中,数据安全文档尚未发布)。
安全和数据保护也是类似的情况。今天阅读这篇文章的大多数人已经依赖于 Github、微软或 AWS 的安全性。你可能将代码存储在 Github 中,或将应用程序或数据存储在 Azure、GCP 或 Amazon 上。问问自己,为什么你愿意接受超云供应商的风险,却不愿接受编码工具的风险。使用 ChatGPT 的风险不可忽视,5 月份报告了数据泄漏,本周报道的越狱潜力,以及云安全供应商 Netskope 报告的内部用户数据泄漏。和其他技术一样,你可以选择禁止它在你的组织中使用,但人们,像自然一样,总会找到办法。要妥善解决安全问题,你需要教育用户并提供安全、易于使用的替代方案。如果 OpenAI 无法胜任,也许其他供应商可以。
另一个担忧是无意中暴露知识产权风险,例如模型可能在‘(偶然?)’训练过程中使用了封闭源材料,这使得工具可能使你的组织面临违反法律的风险(并承担纠正违约的风险)。坏消息是——如果你认为这是一个新风险,你可能应该更仔细地检查你在组织中使用开源软件的情况。许多公司在正确管理和理解其“软件材料清单”(SBOM)——即其软件所依赖的封闭和开源源代码的列表——方面远远不够。你绝对应该担心这些工具中的一个可能会偶然使你侵犯他人的知识产权,但你应该扩展你已经用于开源软件和开发者的大红剪贴按钮的控制措施。
这些风险由你承担,如果你认真考虑这些工具可能提供的机会,你也应该阅读文档并与供应商讨论他们采取的保护措施。确保你做好功课。Copilot 的常识隐私报告给出的评分为 63%,较低,获得了‘黄灯’警告(它在‘学校’和‘家长同意’上的评分特别低,拖低了总分)。
这应该始终成为你采购流程的一部分。你始终需要从风险的角度考虑任何你打算放置在生产代码或数据旁边的工具,决定你对风险的接受程度以及如何减轻风险是你的责任。
更积极的一点是,我认为 Salesforce 最近的公告很好地指示了这些工具的发展方向。Salesforce 推动 AI Day 的主要营销重点之一是他们称之为‘Einstein Trust Layer’的部分,这似乎是一个真正令人印象深刻的包装,针对不同的 LLM 模型,能够大大增强访问安全性并保护客户和公司信息(说真的,看看这个视频,尽管它不是关于代码的)。
我们刚刚看到七家主要的科技公司(亚马逊、Anthropic、谷歌、Inflection、Meta、微软和 OpenAI)签署了自愿的‘负责任 AI’承诺,其中包括水印输出。可以合理地假设,这些市场上的最大玩家,大多数已经是我们信任的公司,将发布类似的信任和安全包装,以解决有关知识产权、安全、隐私以及 LLM 可能有些有毒和与事实关系可疑的问题。
仍然需要有人设计整体解决方案。
另见:
-
需要有人管理所有的数据和数据管道。
-
需要有人管理应用程序之间的重叠。
-
需要有人确保产品的安全性。
-
需要有人监控和回应问题。
-
需要有人管理团队和产品之间的依赖关系和互动。
对,你说得对。仍然有很多工作需要完成,不只是编写代码。
这太棒了!
这意味着我们仍然需要人类一段时间,并且开始显示我们应该为工程师提供培训的地方。但我们也应该预期工具、自动化和更高质量的代码会开始积极影响这些问题清单。通过更多的文档、减少‘聪明’的代码、更清晰的接口、更好的解释性和更好的测试覆盖,我们可能会看到这些挑战减少。
但工程师的大部分时间实际上并不是在编写代码,因为我们不断被要求去参加无聊的会议。
是的,没错。AI 并不会解决所有问题,但如果你作为工程师在会议上的时间比在编程上多,那么问题不在于你的生产力,而在于你所在组织的管理方式。
也许 AI 有一天会解决这个问题,但在短期内,更小、更精简和更自动化的组织可能不需要这么多会议。
坦率地说,对于大多数组织来说,提高开发者生产力的最佳方法是更好地优先排序工作,对低价值结果说不,并给团队更多时间专注于交付高质量的产品。但如果我们不能做到这一点,也许我们可以有 AI 编码助手来替代。
我们不能用 AI 来替代产品经理吗?
啊,这个很不错。
我收到的关于这些文章的一个令人惊讶的反馈是:“这真的很有趣,但在我的业务中,我们的产品支持远远不够。” 结果我发现,我用 5:1 的工程师比例展示了一个无意识的偏见,许多技术团队已经因为他们的比例不仅高得多(比如说 10:1 或更高),而且产品技能在组织中的价值不够高而面临巨大挑战。一些公司似乎仍然认为工程师写代码,而产品经理是一种昂贵的奢侈品。
我认为从客户那里引出需求是非常重要的。我也认为运行一个有效且易于理解的商业优先级流程是非常困难的。在我们能让利益相关者自己进行软件提示设计之前,还需要一段时间。
产品经理对出色的产品工程至关重要。产品经理集中工程资源,并帮助业务识别最有价值的结果。我认为我们现在最不需要的就是减少产品支持,即使我们可以通过自动化来协助他们的一些日常任务。
我怀疑在这些新团队中,产品经理和技术负责人将是最关键的角色。
你没有考虑 X、Y 或 Z
你几乎肯定是对的。不过如果你已经做到了,那就太好了!给我留言,开始讨论,或者最好的方式是写一篇新的文章,阐述你对 Y 或 Z 的看法。(但不要谈 X。我们不再讨论 X 了。)
让我们总结一下
这整个系列文章的重点是考虑一个问题:今天,我觉得还没有足够的产品和技术领导者积极参与讨论,如果生成性 AI 编码工具的承诺兑现,可能对他们的团队产生什么影响。我们不仅仅是在谈论对开发者生产力的小幅提升。我们可能谈论的是产品创建方式的改变。
如果我们讨论的内容有一部分是真的,那么构建软件的团队可能会与现在大相径庭,这将对产品和技术人员的预算产生重大影响。整个行业面临着破坏的风险,尤其是开发者角色的减少。
尽管公司可能会通过投资更多的成果来缓解这一问题,但一个企业可以支持的价值流是有限的。那些花时间仔细和果断地理解和接受即将到来的变化的公司可能会获得巨大的竞争优势。
这个论点也有哲学方面的内容。我相信人类工程师可能有一种不可言喻和不可替代的价值,但我不再能自信地告诉你这是什么了。
我们知道开发者编写代码,我们可以根据他们编写代码的速度和代码的有效性来为他们定价。但是这一说法未能真正理解工程师的实际工作是什么。多年来,很容易证明熟练的人类工程师能够做一些算法无法做到的事情,但现在情况不再如此。如果人类与机器之间的界限仅仅是可以创建的解决方案的复杂程度,那么我们正处于危险的沙土之中。正如我之前所写:
工程师不仅仅被教如何编程。他们被教如何思考。
作为一个行业,我们必须认识到这一代新工具可以轻松复制广泛的工程任务。在这样做的过程中,我们还应理解,仍然存在一些人类具备的独特技能是难以复制的。作为领导者,我们的工作是识别这些技能并投资于人员,以优化这些技能。
这篇文章是一个行动号召。如果你是产品或技术领导者,你应该将其视为一个挑战,考虑生成型 AI 工具对你们团队的影响,并让你的团队参与回答这个问题。
给定时间和空间来考虑这些工具将如何帮助他们,最有可能的创新来源将是你们的团队本身。但是,作为一个领导者,你也需要认识到,火鸡可能不太愿意为圣诞节投票。人们可能因为对就业的真实威胁感到害怕和不愿意参与,你需要发挥他们的才能来帮助你了解是否应该削减预算。成为老板很难,但否则你的竞争对手可能比你更果断和无情。
我们应该明确,最有趣、最混乱、最不受控制、最有影响力和最令人兴奋的进展将出现在那些小型初创公司和技术以外的团队中。不要犯错,忽视你自己组织中的非技术人员或初创社区中微小公司的贡献。
首先要对自己进行教育,然后对你自己公司里的其他人进行教育,了解真正的风险是什么。通过关注你公司内部的好奇早期采用者和外部技术巨头及小型初创公司的动向,考虑机会。要意识到这些进展可能会从根本上重塑你的产品工程,然后走出去,保持好奇,提问,并鼓励你的团队也这样做。
我还没有设法推翻自己的假设——但现在我需要你的帮助来设计实验。
本系列的其他文章:
附言:如果你喜欢这些关于团队的文章,看看我的Teamcraft 播客,在这里我和我的共同主持人安德鲁·麦克拉伦讨论了使团队成功的因素。
适合你神经网络的最佳优化算法
原文:
towardsdatascience.com/the-best-optimization-algorithm-for-your-neural-network-d16d87ef15cb
如何选择它并最小化你的神经网络训练时间。
·发表于 Towards Data Science ·13 分钟阅读·2023 年 10 月 14 日
–
图片来源:unsplash.com。
开发任何机器学习模型都涉及一个严格的实验过程,该过程遵循思想-实验-评估循环。
图片由作者提供。
上述循环重复多次,直到达到令人满意的性能水平。“实验”阶段包括机器学习模型的编码和训练步骤。由于模型变得更加复杂且在更大的数据集上训练,训练时间不可避免地增加。因此,训练大型深度神经网络可能会非常缓慢。
对于数据科学从业者来说,幸运的是,存在几种加速训练过程的技术,包括:
-
迁移学习。
-
权重初始化,如 Glorot 或 He 初始化。
-
批量归一化用于训练数据。
-
选择一个可靠的激活函数。
-
使用更快的优化器。
尽管我指出的所有技术都很重要,但在这篇文章中我将深入关注最后一点。我将描述多种神经网络参数优化算法,强调它们的优点和局限性。
在这篇文章的最后一部分,我将展示一个可视化图,显示讨论过的优化算法之间的比较。
对于实际实现,本文中使用的所有代码可以在这个GitHub 仓库中访问:
[## articles/NN-optimizer at main · andreoniriccardo/articles
通过在 GitHub 上创建一个帐户,参与 andreoniriccardo/articles 的开发。
批量梯度下降
传统上,批量梯度下降被认为是神经网络中优化方法的默认选择。
在神经网络对整个训练集X生成预测之后,我们将网络的预测与每个训练点的实际标签进行比较。这是为了计算一个成本函数J(W,b),它是模型生成准确预测能力的标量表示。梯度下降优化算法使用成本函数作为指导来调整每个网络参数。这个迭代过程持续进行,直到成本函数接近零,或无法进一步降低。梯度下降算法的作用是以特定方向调整网络的每个权重和偏置。选择的方向是最能降低成本函数的方向。
作者提供的图片。
从视觉角度来看,可以参考上面的图像。梯度下降从最左边的蓝点开始。通过分析起始点周围的成本函数梯度,它将参数(x 轴值)调整到右侧。这个过程重复多次,直到算法得到了非常好的最优近似。
如果成本函数有 2 个输入参数,函数不是一条直线,而是创建了一个三维表面。可以考虑该表面的等高线来显示批量梯度下降步骤:
作者提供的图片。
神经网络由成千上万的参数组成,这些参数会影响成本函数。虽然可视化百万维度的表示是不切实际的,但数学方程对理解梯度下降过程很有帮助。
首先,我们计算成本函数J(W,b),这是网络权重W和偏置b的函数。然后,反向传播算法计算成本函数相对于网络每层的每个权重和偏置的导数:
知道了调整参数的方向后,我们更新它们。每个参数更新的幅度由梯度本身和学习率 alpha 调节。Alpha 是优化算法的一个超参数,其值通常保持不变。
批量梯度下降提供了几个优点:
-
简洁性:这是一种直接且易于理解的方法。
-
超参数管理:只需要调整一个超参数,即学习率。
-
最优性:对于凸成本函数,它可靠地在合理的学习率下达到全局最优。
梯度下降的缺点是:
-
计算强度:它可能较慢,特别是对于大型训练集,因为在评估所有样本后更新参数。
-
局部最优和鞍点:它可能会陷入局部最优或鞍点,从而减慢收敛速度。
-
梯度问题:它容易出现梯度消失问题。
-
内存使用:它需要将整个训练数据存储在 CPU/GPU 内存中。
小批量梯度下降
在批量梯度下降算法中,所有训练样本都用于计算单个改进步骤。该步骤将是最准确的,因为它考虑了所有可用的信息。然而,这种方法在实际应用中往往过于缓慢,建议实现更快的替代方案。
最常见的解决方案是称为小批量梯度下降,它只使用训练数据的小子集来更新权重值。
考虑整个训练集 X 和相关标签 Y:
其中 m 表示训练样本的数量。
与其将整个批次喂给优化算法,不如仅处理训练集的一小部分。假设我们将子集 X^t 和 Y^t 喂给算法,每个子集包含 512 个训练样本:
例如,如果总训练集包含 5,120,000 个点,则可以将其分成 10,000 个小批量,每个小批量包含 512 个样本。
对于每个小批量,我们执行经典的梯度下降操作:
-
计算相对于小批量 t 的成本,J^t(W,b)。
-
执行反向传播以计算 J^t(W,b) 相对于每个权重和偏差的梯度。
-
更新参数。
下图中的绿色线条显示了小批量梯度下降的典型优化路径。虽然批量梯度下降会沿着更直接的路径到达最优点,但由于每次迭代中数据集的限制,小批量梯度下降似乎会采取几步不必要的路径。
图片由作者提供。
原因在于,小批量梯度下降在任何时间 t 只有一小部分训练集用于计算其决策。由于可用信息的限制,显然所走的路线不是最直接的。
然而,小批量梯度下降的显著优势在于每一步计算非常快速,因为算法只需评估数据的一小部分,而不是整个训练集。在我们的例子中,每一步只需要评估 512 个数据点,而不是 500 万。这也是为什么几乎没有真实应用需要大量数据时使用批量梯度下降的原因。
如图所示,使用小批量梯度下降算法无法保证迭代 t+1 的成本低于迭代 t 的成本,但如果问题定义良好,优化算法可以非常快速地达到接近最优点的区域。
小批量大小的选择代表了网络训练过程中的一个附加超参数。批量大小等于总样本数量 (m) 对应于批量梯度下降优化。相反,如果 m=1,我们正在执行随机梯度下降,每个训练样本就是一个小批量。
如果训练集很小,批量梯度下降可能是一个有效的选择,否则,像 32、64、128、256 和 512 这样的常见小批量大小通常被考虑。出于某种原因,等于 2 的幂的批量大小似乎表现更好。
虽然批量大小为 1 的随机梯度下降是一种选择,但它往往非常嘈杂,并且可能远离最小值。此外,考虑到每个样本的计算时间,随机梯度下降效率很低,因为它无法利用向量化的好处。
动量梯度下降
请记住,在批量和小批量梯度下降中,参数更新遵循一个定义的公式:
因此,在这个方程中,每一步优化的大小由学习率(一个固定的量)和在成本函数特定点计算出的梯度决定。
当梯度在成本函数的近似平坦区域计算时,它将非常小,从而导致相应的小梯度下降步长。考虑下图中点 A 和 B 的梯度差异。
图像由作者提供。
动量梯度下降 解决了这个问题。我们可以把动量梯度下降想象成一个沿着坡道滚下的保龄球,坡道的形状由成本函数定义。如果保龄球从坡道陡峭的部分开始下降,它的运动开始时较慢,但会很快获得速度和动量。由于其动量,即使在坡道的平坦区域,保龄球也能保持很高的速度。
这就是动量梯度下降的核心概念:算法会考虑以前的梯度,而不仅仅是迭代 t 时计算的梯度。类似于保龄球的类比,迭代 t 时计算的梯度定义了保龄球的加速度,而不是速度。
在每一步中,权重和偏置的速度都是使用前一速度和当前迭代的梯度计算的。
参数 beta,即动量,调节新速度值是根据当前斜率还是过去速度值来决定的。
最后,使用计算出的速度更新参数:
相较于迷你批量梯度下降,动量梯度下降在大多数应用中表现出更优越的性能。动量梯度下降相对于标准梯度下降的主要缺点是它需要额外的参数进行调整。然而,实践表明,beta 等于 0.9 的值效果很好。
RMS Prop
考虑一个成本函数,其形状类似于长形碗,其中最小点位于最窄的部分。该函数的轮廓由下图中的水平线条描述。
图片来源:作者。
在起始点距离最小值较远的情况下,梯度下降(即使是带有动量的变体)开始时沿着最陡的斜坡前进,在上图中,这不是通向最小值的最佳路径。RMS Prop优化算法的关键思想是早期修正方向,并更迅速地瞄准全局最小值。
与动量梯度下降类似,RMS Prop 需要通过一个额外的超参数(称为衰减率)进行调整。通过实际经验,已经证明将衰减率设置为 0.9 是大多数问题的良好选择。
Adam
Adam及其变体可能是神经网络中最常用的优化算法。Adam,即自适应动量估计,源自动量梯度下降和 RMS Prop 的组合。
作为两种优化方法的混合,Adam 需要调整两个额外的超参数(除了学习率 alpha)。我们称它们为 beta_1 和 beta_2,它们分别是动量和 RMS Prop 中使用的超参数。与其他讨论的算法一样,beta_1 和 beta_2 也有有效的默认值选择:beta_1 通常设置为 0.9,beta_2 设置为 0.999。Adam 还包括一个 epsilon 参数,它作为平滑项,并且几乎总是设置为像 e-7 或 e-8 这样的小值。
在大多数情况下,Adam 优化算法优于上述所有方法。唯一的例外是一些非常简单的问题,在这些问题中,简单的方法效果更快。Adam 的效率确实有一个权衡:需要调整两个额外的参数。然而,在我看来,这是为其效率付出的微小代价。
Nadam 和 AdaMax
值得提及的两个算法是作为广泛使用的 Adam 优化算法的修改版:Nadam 和 AdaMax。
Nadam,即 Nesterov 加速自适应矩估计,通过将 Nesterov 加速梯度(NAG)融入其框架来增强 Adam。这意味着 Nadam 不仅受益于 Adam 的自适应学习率和动量,还受益于 NAG 组件,这是一种帮助算法更准确预测下一步的技术。尤其在高维空间中,Nadam 的收敛速度更快,效果更佳。
AdaMax则采用了略微不同的方法。虽然 Adam 根据梯度的一阶矩和二阶矩计算自适应学习率,但 AdaMax 仅关注梯度的最大范数。AdaMax 在处理稀疏梯度方面的简单性和高效性使其成为训练深度神经网络的一个有吸引力的选择,尤其是在涉及稀疏数据的任务中。
优化算法比较
为了实际测试和可视化每种讨论的优化算法的性能,我使用上述每种优化器训练了一个简单的深度神经网络。网络的任务是对 28x28 像素的图像中的时尚物品进行分类。数据集名为 Fashion MNIST(MIT 许可),由 70,000 张小型灰度服装图像组成。
我用来测试不同优化器的算法在下面的代码片段中展示,更详细的信息请参见下方的 GitHub 仓库。
# Load data
(X_train, y_train), (X_test, y_test) = load_my_data()
# Print an example
#print_image(X_train, 42)
# Normalize the inputs
X_train = X_train / 255.
X_test = X_test / 255.
# Define the optimizers to test
my_optimizers = {"Mini-batch GD":tf.keras.optimizers.SGD(learning_rate = 0.001, momentum = 0.0),
"Momentum GD":tf.keras.optimizers.SGD(learning_rate = 0.001, momentum = 0.9),
"RMS Prop":tf.keras.optimizers.RMSprop(learning_rate = 0.001, rho = 0.9),
"Adam":tf.keras.optimizers.Adam(learning_rate = 0.001, beta_1 = 0.9, beta_2 = 0.999)
}
histories = {}
for optimizer_name, optimizer in my_optimizers.items():
# Define a neural network
my_network = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# Compile the model
my_network.compile(optimizer=optimizer,
loss='sparse_categorical_crossentropy', # since labels are more than 2 and not one-hot-encoded
metrics=['accuracy'])
# Train the model
print('Training the model with optimizer {}'.format(optimizer_name))
histories[optimizer_name] = my_network.fit(X_train, y_train, epochs=50, validation_split=0.1, verbose=1)
# Plot learning curves
for optimizer_name, history in histories.items():
loss = history.history['loss']
epochs = range(1,len(loss)+1)
plt.plot(epochs, loss, label=optimizer_name)
plt.legend(loc="upper right")
plt.xlabel("Epoch")
plt.ylabel("Loss")
[## articles/NN-optimizer at main · andreoniriccardo/articles
通过在 GitHub 上创建账户来为 andreoniriccardo/articles 的开发做贡献。
github.com](https://github.com/andreoniriccardo/articles/tree/main/NN-optimizer?source=post_page-----d16d87ef15cb--------------------------------)
结果图表在这条折线图中可视化:
图片由作者提供。
我们可以立即看到动量梯度下降(黄色线)比标准梯度下降(蓝色线)快得多。相反,RMS Prop(绿色线)似乎获得了与动量梯度下降相似的结果。这可能是由于几个原因,如超参数调节不完全或神经网络过于简单。最后,Adam 优化器(红色线)在所有其他方法中明显优越。
学习率衰减
我希望在这篇文章中包含学习率衰减,因为尽管它不严格算作优化算法,但它是一种加速网络学习过程的强大技术。
图片来源:unsplash.com。
学习率衰减指的是学习率超参数alpha在训练周期中的减少。这种调整是必要的,因为在优化的初始阶段,算法可以接受更大的步伐,但当它接近最小点时,我们更愿意采取较小的步伐,以便它能在更接近最小点的区域内跳跃。
有几种方法可以在迭代中减少学习率。一种方法由以下公式描述:
其中,衰减率是一个额外的调节参数。
另一种可能性是:
第一个叫做指数学习率衰减,而第二个中,参数k是一个常量。
最后,也可以应用离散学习率衰减,例如在每t次迭代后将其减半,或手动减少它。
图片由作者提供。
结论
时间对每个数据科学从业者来说都是宝贵而有限的资源。因此,掌握加速学习算法训练的工具可以带来差异。
在这篇文章中,我们已经看到标准的梯度下降优化器是过时的工具,并且存在一些替代方法,它们在更短的时间内提供更好的解决方案。
选择适合特定机器学习应用的优化器并不总是容易的。这取决于任务,而且尚未有明确的共识关于哪一种优化器最好。然而,正如我们上面所看到的,Adam 优化器在大多数情况下是一个有效的选择,了解最受欢迎的优化器的工作原理是一个很好的起点。
如果你喜欢这个故事,请考虑关注我,以便接收到我即将发布的项目和文章的通知!
这是我过去的一些项目:
了解像 Facebook 和 LinkedIn 这样的公司如何从网络中提取洞察。
语言模型能否发明独特的幻想角色名字?让我们从零开始构建它。
使用深度学习生成幻想角色名称:从头构建语言模型 [## 使用 Scikit-Learn 的支持向量机:友好的介绍
每个数据科学家都应该在工具箱中拥有 SVM。了解如何通过实践掌握这一多用途模型…
参考文献
-
深入学习 — Aston Zhang、Zachary C. Lipton、Mu Li 和 Alexander J. Smola
-
深入了解整流器:超越 ImageNet 分类的人类水平表现 — Kaiming He、Xiangyu Zhang、Shaoqing Ren、Jian Sun
-
动手机器学习:使用 Scikit-Learn、Keras 和 TensorFlow(第 2 版) — Aurélien Géron
PyCon US 2023 最佳讲座
原文:
towardsdatascience.com/the-best-talks-from-pycon-us-2023-91d470ba5265
我们对世界上最大 Python 大会的看法
·发表于 Towards Data Science ·11 分钟阅读·2023 年 4 月 25 日
–
PyCon 2023 标志。图片由 PyCon US 2023 提供
从 2023 年 4 月 19 日至 4 月 23 日,我们参加了第二届 PyCon —— 这是 Python 编程语言的最大年度大会。每年,PyCon 在全球举办多个会议,我们参加了在犹他州盐湖城举行的美国会议。
今年,PyCon 庆祝了其 20 周年,在开幕式上,回顾视频展示了之前参会者分享的过去会议的照片和记忆。虽然这是我们第二次参加 PyCon,但我们很高兴重新联系了去年结识的朋友,并建立了新的联系。总的来说,我们很享受这次会议,并想回顾一些我们喜欢的数据科学相关讲座。
如果你无法参加 PyCon,也不用担心!PyCon 计划将讲座上传到他们的 YouTube 频道供大家观看。我们会在讲座上线后在这里提供链接。
下面是我们将介绍的讲座的快速概述:
-
特征工程是为每个人准备的!— Leah Berg 和 Ray McLendon
-
Ned Batchelder 的主旨演讲
-
为什么你应该关注开源供应链安全 — Nina Zakharenko
-
基于 LLM 的代理:如何使用 Haystack 开发智能 NLP 驱动的应用程序 — Tuana Celik
-
进入 Logisticverse:使用 Python 提高交通网络效率 — Uzoma Nicholas Muoh
-
生成器、协程和纳米服务 — Reuven M. Lerner
-
公共数据讨论
-
自然语言处理中的公平性和偏见缓解方法 — Angana Borah
-
10 种测试中可能犯的错误 — Shai Geva
-
Python 与 UX 的结合:通过代码提升用户体验 — Neeraj Pandey, Aashka Dhebar
特征工程是为每个人准备的!— Leah Berg 和 Ray McLendon
在会议演讲开始的前两天,PyCon 提供了多种不同主题的教程。这些教程是与会者学习一个主题并通过 Python 实际应用的绝佳方式。
去年我们举办了一次自然语言处理研讨会后,能够再次被选中教授一个关于 Python 特征工程的三小时初学者研讨会,我们感到非常兴奋。通常,特征工程仅在为机器学习模型创建输入的背景下讨论。然而,我们抓住机会解释了它如何也能增强数据可视化、数据质量和可解释性。
在整个研讨会中,我们介绍了如何探索和创建离散数据和连续数据的特征。与会者通过在 Google Colab 笔记本中分析技术产品评论和股票市场数据获得了实际经验。
现在,让我们深入探讨一下我们在会议中最喜欢的一些演讲。
主题演讲 — Ned Batchelder
Ned Batchelder,波士顿 Python 组织者,coverage.py 维护者,以及 edX 的贡献者,在会议的第一天以软件开发人员沟通的重要性开场。
虽然许多会议与会者可能对这次非技术性的演讲感到惊讶,但我们发现它非常清新且急需。沟通是任何协作环境中的一个重要组成部分,而 Ned 在技术会议上强调这一点,提醒我们在这个领域中它的价值。
由 Priscilla Du Preez 拍摄,Unsplash 提供
Ned 的演讲突出了一个重要观点:每条信息,无论是面对面交流、通过文本、电话还是其他媒介传达,都承载着信息和情感。无论你的意图如何,人们会根据各种因素(包括他们与你的历史、与你的相似性或他们当前的情感状态)来解读你的信息情感。
Ned 提出的改善沟通的建议包括实践谦逊、明确表达以及谨慎选择用词。随着他分享了不良沟通的例子以及如何改进,我们不禁反思自己的沟通风格。这是一个发人深省的提醒,让我们意识到我们都可能曾经发送或接收过被误解的信息,我们都可以从努力更有效地沟通中受益。
为什么你应该关心开源供应链安全 — Nina Zakharenko
开源供应链。图片由 SLSA 提供
许多数据科学家依赖开源 Python 模块,如 pandas、numpy 和 scikit-learn 来进行他们的工作。然而,容易忽视这些包可能存在的潜在风险,包括它们如何成为攻击的目标以及这可能产生的影响。如果你像我们一样,可能以前没有考虑过这些问题,但了解它们对确保你的工作安全和完整性至关重要。
Nina 的演讲对供应链每个步骤中的各种攻击进行了出色的概述,并提供了这些攻击的最新实例。
-
未经授权的更改 — 攻击者修复了一个漏洞,同时引入了另一个漏洞(例如:Linux 伪善者提交)
-
被攻击的源代码仓库 — 攻击者获得对私人系统的访问权限并对源代码进行恶意修改(例如:PHP 自托管 Git 服务器)
-
从修改后的源代码构建 — 攻击者从一个与官方仓库不匹配的版本构建源代码(例如:Webmin)
-
被攻击的构建过程 — 攻击者获得对构建系统的访问权限并注入恶意代码(例如:SolarWinds)
-
被攻击的依赖 — 攻击者攻击了广泛使用的依赖项以访问其依赖项(例如:event-stream)
-
上传修改后的包 — 攻击者获得对系统的访问权限并可以上传修改后的包(例如:Codecov)
-
被攻击的包仓库 — 攻击者攻击了整个包仓库(例如:Browserify 伪造攻击)
-
依赖变得不可用 — 许多其他包依赖的包不再可用(例如:left-pad)
Nina 通过分享一个名为 Scorecard 的工具来结束了演讲,该工具帮助开源维护者评估他们项目的安全状态。
基于 LLM 的智能体构建:如何使用 Haystack 开发智能 NLP 驱动的应用程序 — Tuana Celik
Deepset 是一家拥有搜索引擎背景的欧洲公司。他们将生成预训练变换器(GPT)模型集成到他们的工作中,并创建了一个名为 Haystack 的开源库。该库让你可以快速轻松地构建一个用于简单问答(QA)系统的“智能体”。
图片由 Jon Tyson 提供,来源于 Unsplash。
尽管 Haystack 可以应用于 QA 系统之外,但演讲特别集中在这一用例上。他们首先解释了 Haystack 如何将文档转化为向量或“嵌入”,这使得在进行查询时可以快速从存储中提取相关文档。通过这种方法,代理可以用类似于 ChatGPT 的自然语言回答查询。
使用 Hugging Face 上现有的模型是 Haystack 的一大优势。即使是较简单的模型也可以在无需完整 GPT-4 风格模型的情况下提供优异的结果。通过微调这些模型,性能可以进一步提升,从而创建出世界一流的 QA 系统。
使用这些技术,可以开发一个完全自包含的系统,达到 GPT 级别的性能,而不必使用第三方 API 来冒险泄露组织的数据。
进入物流宇宙:使用 Python 改善运输网络的效率 — Uzoma Nicholas Muoh
完全披露,Nick 是我们的朋友,我们在 PyCon 2022 上认识了他,我们非常喜欢他今年的演讲。Nick 深入探讨了创建高效运输系统的复杂世界。
Nick 首先讨论了运输公司、司机和产品公司不同的视角。高效运输货物的挑战在于平衡产品运输需求、司机休息时间以及减少空载运输的里程。
图片由 Sven Brandsma 提供,来源于 Unsplash。
我们很喜欢 Nick 介绍了我们之前没有使用过的几种 Python 库,例如 Google 的 ortools。这让我们深刻认识到,我们试图通过数据科学解决的许多问题,已经被其他学科(如运筹学)处理过了。
演讲还包含了使用网络图可视化货物运输位置的精彩部分。这使得识别低效路线变得容易,并找到优化整体运输过程的方法。看到这些可视化如何用于解决物流中的复杂问题,真是非常有帮助。
生成器、协程和纳米服务 — Reuven M. Lerner
作为数据科学家,我们曾从一些软件开发者朋友那里简要了解过生成器,但坦率地说,我们并没有多加使用。我们很高兴从流行的 Python 教育者和作者 Reuven 那里学到了更多关于它们的知识。
生成器允许你即时迭代一系列值,而不是一次性生成所有值。它们非常适合迭代大型数据集,因为它们在内存使用上非常高效,因为它们不会将所有值存储在内存中。数据科学家可以使用生成器读取大型数据集或生成无限的数字序列。
协程可以消耗和生成值。协程可用于创建轻量级的并发任务,这些任务可以暂停和恢复执行,以允许其他任务运行。这对于网络通信或输入/输出操作等任务很有用,因为在这些任务中,切换任务而不是阻塞程序直到任务完成是有益的。
最后,Reuven 介绍了纳米服务的概念,这可以被认为是坐在程序内并通过 API(即send())访问的协程,类似于微服务如何被划分为小部分,每部分都有自己的服务器和状态。这种方法允许在代码中实现更大的模块化和灵活性,因为你可以在需要时访问这些小部分或“纳米服务”。
公民数据讨论
PyCon 的一个独特方面是无法在线访问或在活动结束后获取的开放空间。这些是指定的房间,参与者可以聚集在一起讨论感兴趣的话题。
我们参加了一个专门讨论公民数据的开放空间,很高兴看到一群多样化的个人分享他们独特的观点。我们从讨论中得到了一些关键的启示。
首先,我们发现每个辖区都有自己的公民数据获取政策。虽然这些数据是公开的,但获取这些数据并不总是直接的。有些辖区要求数据必须亲自获取或在实体 CD 上获取,这对那些寻求数据的人来说可能带来挑战。
Chris Yates在Unsplash上的照片
讨论的第二点是,第三方承包商通常会聚合数据,但合同不总是要求数据集必须是开放的。因此,以前免费的但难以获取的数据可能变得昂贵,这让我们感到惊讶。
最后,我们了解了美国数字服务(USDS),这是一个致力于提升美国数字服务标准的政府组织。我们很高兴见到一些 USDS 成员,并听到他们为改变合同、使公民数据更开放而做出的精彩工作。
自然语言处理中的公平性与偏见缓解方法 — Angana Borah
作为自然语言处理(NLP)领域的专业人士,我们对公平性和偏见话题有强烈兴趣。这次讲座很好地涵盖了这个主题,从高层概述到对用于开发更好 NLP 解决方案的标准指标和技术的深入探索。
Angana 对她所做和将继续做的工作的热情在讲座中显而易见。她强调了在自然语言处理(NLP)中解决公平性和偏见问题的重要性,以及当前训练方法的不足。进一步的资金和研究是必要的,以开发更好的系统来解决这些问题。
对于这个话题的深入了解,我们推荐 Michael Kearns 和 Aaron Roth 的《伦理算法》。Angana 在讲解公平性和偏见方面做得很出色,但这本书进一步扩展了隐私等话题,这在当前被广泛使用的大型语言模型(LLMs)中是一个主要关注点。
10 种自我挖坑的测试方法 — Shai Geva
数据科学家常常缺乏软件开发背景,这可能导致忽视最佳实践,例如编写测试。Shai 的演讲提供了一个很好的介绍,阐述了不仅要编写测试,还要有效编写测试的重要性。他的演讲涵盖了 10 个糟糕测试的标志。
图片来源:Karl Pawlowicz 由 Unsplash 提供
-
没有测试 — 如果你还没有为你的项目编写测试,先从小而简单的测试开始。
-
如果不失败,就不算通过 — 始终确保你的测试以你预期的方式失败。
-
测试过多内容 — 每个测试应确认代码行为的一个单一事实。
-
语言不明确 — 在测试的名称中使用决定性、明确和具体的语言。
-
细节决定成败 — 尝试将所有信息孤立在测试本身,而不是在代码中跳来跳去。
-
测试未隔离 — 你不希望测试结果会因运行顺序的不同而变化。
-
范围不当 — 尝试使用一致的行为测试。
-
到处都是测试替身 — 尽量不要使用 mock、patch 等,因为对代码库的更改会迅速使其过时。
-
测试慢 — 目标是三秒内完成测试,并在观察模式下运行,以便快速识别和解决瓶颈。
-
错误的优先级 — 测试的目标是发现 bug。它们应该具备以下特性:可维护、快速和强大。
我们喜欢 Shai 演讲的简洁性,并且在下次编写测试时会牢记这些原则。
Python 与用户体验:通过代码提升用户体验 — Neeraj Pandey, Aashka Dhebar
Neeraj 的讲座突出了用户体验和数据科学之间的协同作用。用户体验(UX)设计师和研究人员通常会进行各种实验,收集有关设计选择和/或用户行为的数据。使用 Python 的数据科学技术可以帮助分析这些数据。
Neeraj 关于鞋店的案例研究完美地展示了这些协同作用。他演示了如何使用 k-means 聚类来个性化推荐、促销和内容,以及如何使用自然语言处理(NLP)技术如情感分析从客户反馈中识别用户痛点。
点击流分析用于优化网站导航和提高用户参与度,而市场篮分析帮助调整商店布局,以便根据经常购买的商品进行调整。Neeraj 还展示了如何使用 NLP 技术自动化用户研究调查结果,以及如何使用统计技术如假设检验来评估 A/B 测试结果的显著性。
图片由 Firmbee.com 提供,来源于 Unsplash
总体而言,他的讲座突出了数据科学如何帮助改善 UX 并推动业务成功。尽管他讨论的技术对我们来说并不新鲜,但我们欣赏他清晰而引人入胜的演讲风格以及精美制作的幻灯片。
我们之前已经与公司 UX 部门分享了一些这些技术,但我们相信 Neeraj 的案例研究将进一步强化我们一直试图传达的观点。我们很高兴与 UX 的同事分享他的演讲。
结论
我们在 PyCon 上进行的第二次工作坊非常愉快,并收到了有价值的反馈,这将帮助我们改进。我们很高兴将这些反馈融入到工作坊的扩展版本中,在这个版本中我们将教授我们的数据科学流程,帮助你提高项目的成功率(更多内容请见 这里)。
虽然我们觉得今年的数据科学讲座没有去年那么多,但我们仍然在面向一般软件开发的会议中发现了价值。
如果你是一名数据科学家,正在寻找一个 Python 会议参加,我们推荐这个会议,如果你有兴趣成为一个更全面的程序员并学习更多关于软件开发的知识。无论你的技能水平如何,社区都很欢迎你,这也是一个扩展网络的绝佳机会。
偏差-方差权衡
理解这一著名概念及其对机器学习模型的影响
·
查看 发表在 数据科学的前沿 ·5 分钟阅读·2023 年 2 月 23 日
–
图片由 Piret Ilver 提供,来源于 Unsplash
偏差-方差权衡是数据科学领域中的一个基础且广泛讨论的概念。理解偏差-方差权衡对于开发准确和可靠的机器学习模型至关重要,因为它可以帮助我们优化模型性能,避免如欠拟合和过拟合等常见问题。
在定义偏差-方差权衡之前,需要先分别定义偏差和方差。
偏差与方差
偏差
偏差指的是通过使用简化模型来逼近实际问题而引入的错误。具有高偏差的模型无法捕捉数据的真实复杂性,容易发生欠拟合,导致在训练数据和测试数据上表现不佳。偏差通过目标变量的期望值或真实值与模型预测值之间的差异来表示。
方差
方差是指模型对训练数据中小的波动的敏感性引入的错误。具有高方差的模型倾向于对训练数据过拟合,从而在新的、未见过的数据上表现不佳。方差通过模型对不同训练集的预测结果的变异程度来表示。
理解偏差-方差权衡对于开发准确可靠的机器学习模型至关重要。它有助于优化模型性能并避免诸如欠拟合和过拟合等常见陷阱。通过像下图这样的靶心图来可视化偏差和方差的概念是一种有效的方法。
来源:V. Gudivada, A. Apon & J. Ding, 2017
图示展示了方差和偏差的关系:
-
一个具有高偏差和高方差的模型会产生大量错误,并且结果非常不一致。
-
一个具有高方差和低偏差的模型往往更准确,但结果会有很大的变动。
-
一个具有高偏差和低方差的模型会产生许多错误预测,但结果非常一致。
-
最后,一个具有低偏差和低方差的模型能做出良好的预测,并且结果一致。
从图中可以直观地看到,所有模型应该具有低偏差和低方差,因为这种组合会产生最佳结果。然而,这就是偏差-方差权衡出现的地方。
权衡
图片来源:Possessed Photography 在 Unsplash
偏差-方差权衡出现的原因是增加模型的复杂性可以减少偏差,但会增加方差。另一方面,降低复杂性可以减少方差,但会增加偏差。目标是找到偏差和方差之间的最佳平衡,从而在新的、未见过的数据上实现最佳的泛化性能。
这直接与所使用模型的复杂性有关,如下图所示。
偏差-方差权衡和误差关系(图像由作者提供)
图表显示了模型复杂性如何与偏差和方差的值相关。低复杂度的模型可能过于简单,无法理解训练数据中的模式,这种现象称为欠拟合。因此,它在测试数据上无法做出良好的预测,导致高偏差。
另一方面,具有过多自由度的模型可能导致所谓的过拟合,即模型在训练数据上表现优秀,但在测试数据上的性能显著下降。这是因为模型对训练数据过于适应,丧失了泛化能力,当需要解释从未见过的数据样本时,无法得到良好的结果。
随着模型复杂性的增加,偏差减少(模型对训练数据的拟合更好),但方差增加(模型对训练数据的敏感度更高)。最佳的权衡点出现在误差最小的位置,在这种情况下,是在适中的复杂度水平。
为了帮助理解,我们来看一个实际的例子,说明偏差-方差权衡的概念。
例子
Steve Johnson 的照片,来源于 Unsplash
为了说明偏差-方差权衡在机器学习模型中的影响,让我们看看具有不同复杂度水平的模型在相同数据集上的训练和测试表现。
对于这个例子,将生成一个输入 X
和输出 y
之间具有二次关系的随机数据集。然后,我们将数据分成训练集和测试集,并拟合三个不同度数的多项式回归模型(1、2 和 20)。我们将结果模型与训练数据和测试数据一起绘制,并计算训练集和测试集的均方误差。
结果图显示了不同多项式回归模型的偏差-方差权衡:
不同度数模型得到的结果(图像由作者提供)。
模型的度数为 1 时过于简单,具有高偏差和低方差,导致欠拟合,并在训练数据和测试数据上都出现高误差。模型的度数为 20 时过于复杂,具有低偏差和高方差,导致过拟合,在训练数据上误差低,但在测试数据上误差高。模型的度数为 2 时在偏差和方差之间有一个良好的平衡,结果是测试误差最低。
这个例子演示了找到机器学习模型的合适复杂度水平的重要性,以平衡偏差和方差,并在新的、未见过的数据上实现良好的泛化性能。
希望这篇文章能够帮助你理解偏差-方差权衡,以及在开发机器学习模型时如何考虑它。
任何评论和建议都非常欢迎。
随时通过我的 LinkedIn 联系我,并查看我的 GitHub。
偏差-方差权衡,解析
原文:
towardsdatascience.com/the-bias-variance-tradeoff-explained-2d1311c2b7c2
颠覆性的揭示者
偏差-方差权衡,第三部分,共 3 部分
·发布于 Towards Data Science ·4 分钟阅读·2023 年 2 月 15 日
–
我们在这一系列的第一部分和第二部分中涵盖了许多内容。第一部分是开胃菜,我们讨论了理解偏差-方差权衡旅程中需要了解的一些基础知识。第二部分是我们丰盛的主菜,我们深入探讨了过拟合、欠拟合和正则化等概念。
吃蔬菜是个好主意,因此在继续之前,最好去阅读那些早期的文章,因为第三部分是甜点:你通过遵循逻辑所获得的总结。
我们的总结将一目了然。图像由作者提供。
偏差-方差权衡一目了然
偏差-方差权衡的核心是:
-
训练性能和实际性能(你关心的那个)并不相同。
-
训练性能是关于模型在其学习的旧数据上的表现,而你真正关心的是当你输入全新数据时,模型的表现如何。
-
当你增加复杂性以提高过拟合而不改善实际性能时,当你将模型应用于验证集时会发生什么?(或者如果你像冠军一样使用四分法,可以应用于调试集)。你会看到标准差(方差的平方根)增长的速度超过了偏差的缩小速度。你在训练中使事情变得更好,但在整体上却变得更糟!
-
当你减少复杂性以提高你的欠拟合而不改善真实表现时,当你将模型应用到你的验证集(或调试集)时会发生什么?你会看到偏差比标准差缩小得更多。你在训练中让事情变得更好,但在一般情况下变得更糟!
-
黄金模型就是你不能在不比标准差更多地损害偏差的情况下改善偏差,反之亦然。那就是你应该停下的地方。你已经把事情做好了!
这张图是一个卡通草图,对于挑剔的数学家来说不够通用,但它传达了要点。由作者创建。
长话短说:偏差-方差权衡是一个有用的方式来思考调整正则化超参数(这是一个复杂的词,意为*“在拟合模型之前必须选择的设置”*)。最重要的是,有办法找到复杂度的最佳点!这涉及在你改变正则化设置时观察调试数据集中的均方误差(MSE)。但如果你不打算这样做,你可能最好忘掉你刚刚读到的一切,记住这点:
不要试图作弊。你无法超越你的信息能买到的最佳模型。
不要试图作弊。如果你的信息不完美,那么你对任务的建模能力是有上限的。你可以在你的训练集上做得“更好”,但在(适当大小的)测试集或现实世界中做不到。
所以,停止认真对待训练性能结果,学会像成年人一样验证和测试。(我甚至为你写了一个简单的以 Mr. Bean 为主角的解释,这样你就没有借口了。)
如果你理解数据拆分的重要性,你可以忘掉整个讨论。
说实话,那些理解数据拆分重要性的人(以及模型的真正考验是其在未见过的数据上的表现)大多数可以忽略这整个讨论,继续过自己的生活。
换句话说,除非你打算调整正则化模型,否则如果你的逐步流程在应用 ML/AI 方面是稳固的,著名的偏差-方差权衡你不需要了解太多。只需避免本指南中的AI 白痴的不良行为,你就会没事的。
7 种严重搞砸你的机器学习项目的方法
towardsdatascience.com
感谢阅读!怎么样来个课程?
如果你在这里玩得开心,并且在寻找一个设计来取悦 AI 初学者和专家的有趣领导力课程,这是我为你准备的小东西:
课程链接:bit.ly/funaicourse
想要提升决策技能而不是提升你的 AI 能力?你可以通过 这个链接 从我这里学习决策智能课程。
[## 你生活的方向盘——决策智能视频教程 | LinkedIn Learning…
决策能力是你能学到的最宝贵的技能。你的人生归结为两件事:你的生活质量…
bit.ly](https://bit.ly/decisioncourse?source=post_page-----2d1311c2b7c2--------------------------------)
附言:你有没有试过在 Medium 上多次点击拍手按钮看看会发生什么? ❤️
喜欢这位作者?与 Cassie Kozyrkov 连接
让我们成为朋友吧!你可以在 Twitter、YouTube、Substack 和 LinkedIn 上找到我。想让我在你的活动上发言?请使用 这个表单 与我联系。
阅读 Cassie Kozyrkov 的每一个故事(以及 Medium 上其他成千上万的作者的故事)。你的会员费用直接支持…
kozyrkov.medium.com](https://kozyrkov.medium.com/membership?source=post_page-----2d1311c2b7c2--------------------------------)
数据科学的诞生:历史上首次假设检验与 Python 见解
深入了解每位数据科学家都需要掌握的 Python 驱动的见解
·发布于Towards Data Science ·7 分钟阅读·2023 年 9 月 8 日
–
对图片选择感到困惑?通过阅读文章发现原因!图片来源:pixabay.com.
在 18 世纪伦敦精致的氛围中,一位开创性的个体开始了一项任务,这将永远改变我们对数据和统计学的理解。约翰·阿布斯诺特,一位杰出的苏格兰医生和数学家,踏上了一段非凡的旅程,驱动他的则是对出生记录复杂性的无法抑制的好奇心。他未曾意识到,他的好奇心将为统计学的革命奠定基础。
男孩出生是否比女孩多?
这是 18 世纪让约翰·阿布斯诺特感兴趣的直接问题。他想了解为什么似乎出生的男婴比女婴多。他的好奇心促使他分析了多年来来自伦敦的大量出生记录。实质上,他试图弄清楚这种模式是否自然或随机,或者是否存在更深层次的解释来说明男性和女性出生数量的差异。
数据收集
阿布斯诺特的数据收集工作非常卓越。在 1629 年至 1710 年的几十年间,他收集了伦敦的出生数据。这些记录提供了丰富且可靠的数据来源,涵盖了相当大一部分人口。
阿布斯诺特对收集这些历史出生数据的奉献为他后来的分析奠定了基础。这些广泛的记录为他提供了调查出生性别比例趋势的机会,为他开创性的统计分析奠定了基础。
零假设
阿布斯诺特对出生性别比例的自然研究是他研究的核心。他假设在人口中,男性出生与女性出生的比例应该大致相等。换句话说,他认为长期来看,性别之间不应存在显著偏倚。
这一假设基于“自然”平衡男女后代数量的观点,如果这种平衡被打破,可能对物种的生存和延续产生更广泛的影响。阿布斯诺特的工作是对现代人口性别比例理解和偏离预期比例研究的先驱。
阿布斯诺特对这一自然假设的好奇心使他踏上了以数据驱动的旅程,最终完成了他著名的分析和开创性的可视化工作,我们将在本文中进一步探讨。
统计分析与可视化
既然我们已经深入了解了约翰·阿布斯诺特(John Arbuthnot)杰出的数据收集工作,现在让我们关注他在 18 世纪如何进行统计分析和数据可视化。我们还将探索如何使用现代 Python 模拟来重现他的工作。本文中提到的所有代码可以在我的GitHub库中自由访问:
[## GitHub - andreoniriccardo/articles
通过在 GitHub 上创建账户,参与 andreoniriccardo/articles 的开发。
github.com](https://github.com/andreoniriccardo/articles?source=post_page-----4745dccaf6d--------------------------------)
作者提供的图片
阿布斯诺特的开创性贡献之一是他巧妙地使用了数据可视化。在没有现代统计软件的情况下,他创建了一个时间序列图,生动地表现了男性出生数量超过女性的年度情况。这种可视化帮助他揭示了数据中的模式和趋势。
作者提供的图片
从图表中可以看到,阿布斯诺特在水平轴上表示每一年,在垂直轴上表示每年的男性出生超出女性出生的数量。图表类似于过山车,起伏反映了出生性别比例的年度波动。
阿布斯诺特对这幅图的解释至关重要。他注意到,尽管有起伏的波动,但没有明显的长期趋势。换句话说,虽然男性和女性出生比例每年有所变化,但它似乎始终高于他认为的预期或自然的 1:1 性别比例(虚线)。这一时期的平均值为每 100 个女孩出生 107 个男孩,最高达到每 100 个女孩出生 116 个男孩。
为了更详细地理解这一点,考虑一下如果男性和女性出生数量相等,每年的过剩应为零。任何偏离零的情况都表明一种性别的过剩。
在现代背景下,我们可以使用 Python 重现阿布斯诺特的分析。通过绘制相同的数据并应用统计技术,我们可以验证他的发现,并展示今天数据可视化和分析工具的强大功能。绘制上面图表的代码如下:
阿布斯诺特的见解和遗产
阿布斯诺特的开创性实验标志着假设检验的诞生。除了定义自然假设的出生比例相等外,他还进行了统计假设检验,计算了我们现在称之为 p 值(使用符号检验),将其解释为统计显著性的度量,并大胆地拒绝了零假设。
他最初的假设很简单:如果零假设成立,即男性和女性出生的数量相等,那么这种明显的男性出生过剩必须不仅仅是巧合。他计算出这种情况纯属偶然的概率是极其微小的。为了说明这一点,可以考虑这个类比。我们可以将性别比例的结果等同于连续 82 次掷硬币,每次都得到正面。发生这种事件的概率极其小,82 次连续得到正面的概率为 1/2⁸²。这个极其微小的数字表明零假设——男孩和女孩的出生数量相等——是不可信的。
阿布斯诺特不仅揭示了他发现的统计不可能性,还进一步探索。他提出了一种潜在的力量在起作用,导致男性出生的过剩。他假设这种力量旨在抵消男性观察到的更高死亡率,暗示了一种“天意”的存在。这一可能的解释在现代理论中已被否定。
阿布斯诺特的研究,像任何科学努力一样,也不是没有缺陷。他的数据可能存在计数错误,而且他的分析仅限于英国国教徒的洗礼。然而,尽管存在这些局限性,他的核心发现经受住了时间的考验。今天,普遍接受的“自然”性别比例大约是每 100 个女孩出生 105 个男孩,这验证了阿布斯诺特的基本见解。
现代解释:Python 模拟
在本节中,我们将利用现代统计工具的能力重新审视 Arbuthnot 的假设并对其进行检验。通过 Python 模拟,我们将探讨观察到的男性出生过剩是否确实是偶然的结果,还是有更深层的原因。所有代码都可以在我的 GitHub 仓库 中找到:
## GitHub - andreoniriccardo/articles
通过在 GitHub 上创建一个账户来为 andreoniriccardo/articles 的开发做贡献。
如果男孩与女孩的出生比例恰好为 50:50,我们可以将这一过程看作是一次公平的掷硬币。通过几行代码,我们可以模拟掷 82 枚硬币(如同 Arbuthnot 考虑的年份数)几百万次的过程:
由于无处不在的 中心极限定理,我们可以自信地说,结果分布遵循正态分布:
作者提供的图片。
我们可以清楚地看到,如预期的那样,在 82 次掷币中,预期值为 41 次正面,获得超过 60 次正面/反面的概率是微不足道的。
我们可以进一步突出一些百分位。我选择绘制 97.5 和 2.5 百分位,因为它们代表了在显著性水平为 5% 的双尾假设检验中的接受限度。
作者提供的图片。
任何超过 50 或低于 32 的结果都被认为是统计学上显著的证据,以拒绝零假设。
最后,借助于 scipy 库,我们可以进行正式的 z 检验:
输出是:
结论
在重新审视 John Arbuthnot 令人瞩目的 18 世纪数据分析时,我们不仅向一位统计学先驱致敬,还挖掘了现代数据科学的根源。Arbuthnot 的显著性检验照亮了假设检验和统计推断在我们解读数据底层意义中的持久重要性。未来的数据科学家们,请记住;Arbuthnot 的开创精神提醒我们,即使在过去,统计洞察也为未来铺平了道路,使数据驱动的发现继续塑造我们对世界的理解。
如果你喜欢这个故事,考虑关注我以便获得我即将发布的项目和文章的通知!
这里是我过去的一些项目:
利用遗传算法和 Google Maps API 探索欧洲 50 个最受欢迎城市的魅力,开启高效的旅行体验…
## 从头开始使用 Numpy 构建深度神经网络 ## 欧罗巴旅行优化:遗传算法和 Google Maps API 解决旅行推销员问题
现代深度学习库是强大的工具,但它们可能使从业者对神经网络的…视而不见。
## 欧罗巴旅行优化:遗传算法和 Google Maps API 解决旅行推销员问题
参考资料
-
J. Arbuthnot, ‘论神圣天意的辩护…’,《哲学学报》第 27 期(1710 年),186-190 页。