admin管理员组

文章数量:1645531

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

神经网络实际上是如何工作的——Python 实现第 2 部分(简化)

原文:https://towardsdatascience/how-neural-networks-actually-work-python-implementation-part-2-simplified-80db0351db45

在这篇文章中,我们继续揭穿神经网络是一个我们不太明白其工作原理的黑箱的理论。我们的目标是以一种容易理解的方式实现神经网络。万一有些概念不能马上讲清楚,请查阅参考资料部分的前几篇文章。

在本文结束时,您应该能够在给定输入数据的情况下,通过一个具有许多功能和训练示例的网络实现数据的单次转发。

让我们从数据和我们将使用的神经网络架构开始。

数据和神经网络架构

我们将使用包含 3 个特征和395训练示例的数据,如下图Figure 1所示。神经网络是浅层的-它在输入层有 3 个节点(因为我们有 3 个特征),一个 4 个神经元的隐藏层,和一个输出神经元。

图 1: 数据和神经网络。该数据包含 3 个特征(x1、x2 和 x3)和 395 个以 y 为因变量的示例。该网络是一个 3–4–1 NN,即具有 3 层的 NN——3 个输入值,4 个隐藏层节点,1 个输出值(来源:作者)。

参数初始化

为了执行向前传递,我们需要定义参数(权重和偏差)的初始值。我们将从标准正态分布中随机生成所需的权重,并将偏差设置为零。进行参数初始化时,最重要的概念是确保权重和偏差矩阵具有所需的维数。在执行矩阵乘法时,尺寸错误会给我们带来问题。

概述重量和偏差矩阵的尺寸(参见链接)

初始化参数时,有两条规则需要考虑:

等式 1:权重和偏差矩阵的维数(来源: Post )。

  • **l** ( **wˡ** )的权重矩阵将具有** **(nˡ, n^(l-1))**的维度,即的行数将等于当前层l中神经元的数量,列数将等于前一层l-1 中神经元的数量。**
  • 偏置矩阵将有 **nˡ** 行和 1 列。这只是矢量引用:上一篇。
  • 例如,在我们的例子中,我们在隐藏层需要 4 乘 3 的权重矩阵。请记住,我们在输入层不需要权重,因为那里不发生任何计算,我们只是传递输入值。

注 1: 输入数据必须为(n,m)维,其中 n 为特征数,m 为训练样本数。也就是说,每个训练示例将作为输入矩阵 x 中的一列出现。

**符号:**本文中,dim(A)=(r, c)表示矩阵A的维数为 r 乘 c,其中 r 为行数,c 为列数。nˡ是层 l 中神经元的数量。在上面所示的架构中,n⁰=3n¹=4n²=1

参数初始化之后,接下来要做的事情是执行实际的计算。

实际计算

在任何给定的层 l,进行以下两个计算:

等式 2: 在第 1 层完成的计算。在等式 2–1 中,权重矩阵与输入矩阵相乘并添加偏差,而在第二个等式中应用激活。

**等式 2–1:**权重矩阵与输入相乘,并添加偏差。注意,这里的输入可以是实际的输入值,也可以是前一层l-1的值。这些方程的计算需要我们理解矩阵乘法和矩阵加法。如果A中的列数等于B中的行数,则两个矩阵AB可以相乘为A·B。记住A·BB·A不一样(矩阵乘法不可交换)。此外,相加的两个矩阵必须具有相同的维数。

等式 2–2:激活函数应用于Equation 2–1的结果,成为l层的输出。请注意,在生成的矩阵/向量上使用激活不会影响其维度。

现在让我们将所有这些放入 Python 代码中

对于每一层,我们将初始化参数,然后执行所需的计算。在输入层,即层0没有计算发生,因此我们直接进入隐藏层,即层1

第 1 层的计算

(参考Equation 1中的规则)对于隐藏层,layer 1,我们需要一个维度为(n¹,n⁰)的权重矩阵(即当前层的神经元数乘以上一层的神经元数。这是 4 乘 3。我们需要(n¹, 1)作为偏差,也就是 4 乘 1。为了便于打印出数据,我们现在不使用本文开头定义的数据(我们将在本文后面这样做)。我们将使用下面的子集。

图 2: 将输入数据转换成输入矩阵。输入矩阵的每一行都包含特征数据。如果每一行都包含训练示例,我们需要转置 x ,然后乘以权重矩阵(来源:作者)。

输出:

X:  [[ 9 14 10 11  8]
 [ 9 16  8 12  9]
 [ 9 16  7 10  9]]
X shape: (3, 5)
w1:  [[-0.14441 -0.05045  0.016  ]
 [ 0.08762  0.03156 -0.20222]
 [-0.03062  0.0828   0.02301]
 [ 0.0762  -0.02223 -0.02008]]
w1 shape:  (4, 3)
b1:  [[0.]
 [0.]
 [0.]
 [0.]]

**第 1–5 行:**导入所需的包,并定义输入数据。输入数据X具有维度(3, 5),3 个特征和 5 个训练样本。

**回忆(特征数量影响输入层神经元数量)😗*输入层神经元数量始终等于特征数量,因此,我们在输入层有 3 个神经元。

**第 7–12 行:**根据Equation 1中的两条规则初始化参数。dim(w¹) = (n¹, n⁰) = (4,3)

输出:

f11 shape:  (4, 5)
w2:  [[0.01866 0.04101 0.01983 0.0119 ]]
w2 weights:  [[0.01866 0.04101 0.01983 0.0119 ]]
b2: [[0.]]
y0:  [[0.03629 0.03134 0.04005 0.03704 0.03582]]
y0 shape:  (1, 5)
y_hat:  [[0.50907 0.50783 0.51001 0.50926 0.50895]]
y_hat shape:  (1, 5)

第 1–2 行: w1 乘以输入矩阵xdim(w1)=(4, 3)dim(x)=(3, 5),因此dim(w1·x)=(4,5)基于矩阵乘法的规则。

注 2: 最初,我们说(而且是矩阵加法的一个规则)两个矩阵 A 和 B 只有维数相同才能相加。但是dim(w¹·x)=(4, 5)但是dim(b¹)=(n¹, 1) =(4, 1)然而我们在第 1 行添加了它们。这是为什么呢?Numpy 包裹来救我们了。

“广播一词描述了 NumPy 在算术运算过程中如何处理不同形状的数组。在某些约束条件下,较小的阵列在较大的阵列中“广播”,以便它们具有兼容的形状。来源: Numpy 文件。

在阵列广播之后,dim(b¹)变成了(4,5),因此,z11=w¹·x+b¹也变成了 4 乘 5 的矩阵。

**第 4 行到第 10 行:**应用 Sigmoid 激活来获得第 1 层 f11 的输出。这是该层中所有神经元的输出。

**第 12–24 行:**显示了输出层的计算。如预期的dim(w²)=(n², n¹)=(1, 4)dim(b²)=(n², 1)=(1, 1)。这里我们还需要应用数组广播的概念。

注 3: 输出为 1 乘 5 矩阵。你期望你期望的是一个单一的数字吗?请记住,此输出是我们数据中所有 5 个训练示例的预测向量。换句话说,使用 Numpy 允许我们以如此高效的方式通过网络传递所有的训练示例。不要担心输出向量上的值,因为这只是数据基于随机初始化的权重通过网络的一次传递。

我们需要在模型学习的训练期间优化参数值。训练网络需要前向传递/传播(如本文所讨论的)和反向传播。后者允许我们使用一些损失函数来评估模型,计算函数相对于参数的偏导数,并相应地调整参数值。这个过程是迭代的,通过网络传递整个数据集(正向传递)和反向传递(反向传播)的过程构成一个完整的迭代。这就是所谓的新纪元。我们将在接下来的文章中讨论所有这些。

在我们结束之前,让我们写一些代码,对开始提到的数据集进行一次完整的前向传递(我们将直接从https://kipronokoech.github.io/assets/datasets/marks.csv加载数据)。

输出:

w1 shape:  (4, 3)
w2 shape:  (1, 4)
X shape:  (3, 395)
w1 shape:  (4, 3)
b1 shape (4, 1)
w2 shape:  (1, 4)
b2 shape (1, 1)
f1 shape (4, 395)
z2.shape (1, 395)
yhat shape (1, 395)

关于上面的代码,有几点需要注意:

  • 我们需要传递维度为(# features, # training examples)的输入特征数据。通常,在熊猫数据帧(df)中,我们在行中有训练示例,在列中有特征,但我们需要输入矩阵中的数据,因此我们转置了第 107 行的X
  • 正向传递的输出yhat是所有训练示例的预测向量。出于这个原因,我们对数据上的 395 个训练例子进行了yhat(1, 395)
  • 此时,我们没有使用目标变量(y)。我们将在反向传播和模型评估中使用它。

参考资料:

  • 如何用 Python 从零开始实现神经网络——单个神经元上的前向传递。
  • 反向传播如何在神经网络中工作

我们已经在前一节中讨论了单个神经元的计算。本文讨论了一个完整的浅 3-4-1nn 的单前锋传球。接下来,我们的重点将是理解反向传播。

请以每月 5 美元的价格注册 medium 会员资格以便能够阅读我和其他作者在 medium 上的所有文章。

你也可以订阅,当我发表文章时,你可以把我的文章发到你的邮箱里。

感谢您的阅读,欢迎下次光临!!!

神经网络的实际工作方式— Python 实现(简化)

原文:https://towardsdatascience/how-neural-networks-actually-work-python-implementation-simplified-a1167b4f54fe

对于很多人来说,神经网络(NN)是一个黑匣子。我们知道它的工作原理,但我们不明白它是如何工作的。本文将通过一些例子来展示神经网络实际上是如何工作的,从而揭开这一信念的神秘面纱。如果这篇文章中有些术语不太清楚,我已经写了两篇文章来涵盖真正的基础知识:第一篇和第二篇。

数据和架构

在第一个示例中,让我们考虑一个简单的情况,其中我们有一个包含 3 个特征、一个目标变量和一个训练示例的数据集(实际上我们永远不会有这种数据,但是,这将是一个非常好的开始)。

事实 1:数据的结构影响建模所选择的架构。事实上,数据集上特征的数量等于输入层中神经元的数量。在我们的例子中,如下图所示,我们有 3 个特征,因此架构的输入层必须有 3 个神经元。

隐藏层的数量影响学习过程,因此根据应用来选择。具有几个隐藏层的网络被称为深度神经网络(DNN)。在这个例子中,我们正在处理一个浅层神经网络。我们在输入/第一层有 3 个神经元,在隐藏层有 4 个神经元,在输出层有 1 个神经元,这是一个 3–4–1 神经网络。

图 1 —左:数据,右:神经网络架构(来源:作者)。

记号

让我们先设置一些符号,这样我们就可以毫不含糊地使用它们。为此,让我们重新绘制上面的体系结构,以显示神经网络中使用的参数和变量。

图 2:带有变量和参数的 3–4–1 神经网络我们需要在给定输入值的情况下计算输出ŷ(来源:作者)。

以下是我们将使用的符号:

  • x⁰ᵢ-iᵗʰ输入值。输入层(层 0)的特征 I 的值,
  • nˡ——l 层中的神经元数量。如图 2 所示,第一/输入层有三个神经元,n⁰ =3,第二/隐藏层有 4 个单元,因此 n =4,最后,对于输出层,n =1。网络中有 L 层。在我们的例子中,L=2(记住,我们不把输入算作一个层,因为这里不发生任何计算),
  • m——训练样本的数量。在我们的例子中,m=1,
  • wˡⱼᵢ
  • 第一层中 jᵗʰ神经元的 zˡⱼ加权输入,
  • f ˡgˡ是层 l 的激活函数,
  • bˡⱼ——l 层 jᵗʰ神经元上的偏置****

矩阵和矩阵运算

为了有效地进行神经元运算的计算,我们可以使用矩阵和向量作为任何给定层的输入、权重和偏差。我们现在将有以下矩阵/向量和运算:

  • 输入为 x,
  • 权重作为矩阵 wˡ到达层 l,
  • 层 1 中的偏差为矢量 bˡ,
  • zˡ = wˡ∙f^(l-1)—是层中所有神经元的加权输入,l . Medium 在格式上有限制。f 是来自前一层的输入的幂(l-1)。
  • 点积-对于任意两个等长的向量 a 和 b,点积 a∙b 定义为:

等式 1:点积 a∙b(来源:作者)。

aᵢ bᵢ是向量 a 中的 iᵗʰ元素和 b 中的 iᵗʰ元素之间的标量乘法*

  • f ˡ = gˡ(zˡ+bˡ)将是层 l 的输出

矩阵乘法

两个矩阵只有兼容才能相乘。当且仅当第一个矩阵的列数等于第二个矩阵的行数时,称两个矩阵相乘是相容的。因此,对于 A(m,n)和 B(n,p),那么 A∙B 的阶为(m,p)(见下图 2)。

图 3: Multix 乘法(来源:作者)。

****重要提示:矩阵乘法是不可交换的,也就是 A∙B 不等于 B∙A,要确定你是按照正确的顺序把它们相乘。

矩阵加法

两个矩阵 A 和 B 只有在维数相同的情况下才能相加,比如说 A(m,n),那么 B 也一定是(m,n)阶的,结果 A+B 也是(m,n)维的。

在我们的网络中利用矩阵运算需要我们为输入、权重和偏差找到合适的维度。

单个神经元的计算

为了演示在一个神经元中完成的计算,让我们考虑在隐藏层的第一个神经元中的计算(注意,权重是随机生成的,并且在开始时将偏差设置为 0)。在本节中,我们基本上假设我们有一个单神经元网络,即 3–1 个神经元。

图 4:单个神经元——隐藏层的第一个神经元(来源:作者)。

在这种情况下,我们有 3 个输入值 5、6 和 6,以及相应的权重 0.01789、0.00437 和 0.00096。神经元通过计算 z ₁₁来衡量输入,加上偏差 b ₁₁,最后,对结果应用激活函数(我们将使用 sigmoid 函数)来获得 f ₁₁,从而产生输出。

加权输入:

等式 2:加权输入是相应输入值和权重的乘积之和。这相当于 1×3 权重矩阵和 3×1 输入矩阵/向量之间的点积。

z¹₁₁ = (0.01789*5) + (0.00437*6) + (0.00096*6) = 0.12143

添加偏置,然后应用 sigmoid 激活函数:

Sigmoid 激活函数

f¹₁₁ = g(z¹₁₁+b¹₁₁) = g(0.12143+0) = 1÷(1+e^(−0.12143)) = **0.530320253**

这个神经元输出 0.5303。

把这个放到 Python 代码中

首先,我们需要随机生成权重,并将 bias 设置为零。

输出:

**Weights:  [[0.01789 0.00437 0.00096]]
Weights shape:  (1, 3)
Bias:  [[0.]]
Bias shape:  (1, 1)**

第 1–4 行:导入 numpy,设置其输出值的精度为小数点后 5 位。除非明确设置了另一个精度级别,否则 numpy 在第 3 行后执行的所有计算都将保留 5 位小数。

第 5–8 行:在第 6 行,一个随机种子被设置为 3(可以是任何数字)。播种确保生成的随机数是可预测的,即每次运行代码时生成的随机数都是相同的。第 8 行实际上使用标准的正态分布生成随机数。为什么要乘以 0.01?我们希望该数字较小(介于 0 和 1 之间)。我们将在下一篇文章中对此进行更多的讨论

第 11–14 行只打印出矩阵的参数值和尺寸(参见下文,了解权重和偏差矩阵形状的调整,非常重要!!!)

>>>尺寸重要说明<<<

We need to get dimensions of weights and biases matrices correctly. Given the number of neurons in each layer, the dimension for the matrices can be deduced as:

Dimensions for matrices of weights and biases (Source: Author).

  • The weights matrix for layer l (wˡ) will be of dimension (nˡ, n^(l-1)), that is, wˡ will have the number of rows equal to the number of neurons in the current layer, l, and the number of columns will be equal to the number of neurons in the previous layer, l-1.
  • The bias matrix will have nˡ rows and 1 column. This is just a vector.

In our network, we have n⁰=3 input values and n¹ =1 neuron in the output, therefore, dim(w¹) = (n¹, n⁰) = (1, 3) and dim(b¹) = (n¹, 1) = (1,1). Hope this justifies the choice of shapes for the matrices of weights and biases.

Next is to multiply weights with input, add bias and apply sigmoid function.

输出:

**input shape:  (3, 1)
f11:  [[0.12141]]
The output:  [[0.53032]]**

第 1–4 行定义输入并打印形状。如果不对输入进行整形,结果将是 shape (3,)的数组。应该避免称为秩 1 数组的(,)性质的数组,因为它们会在矩阵乘法过程中引起问题。reshape(-1,1)函数告诉 numpy 根据给定的值的数量动态设置数组的行数并保持列数为 1。在我们的例子中,我们有 3 个输入值,因此我们有(3,1)作为输入形状。*

第 5 行到第 13 行 —将权重矩阵与输入矩阵相乘以获得加权输入并添加偏差,然后对结果应用 sigmoid 激活。当乘以第 6 行中的矩阵时,注意顺序——TT 是权重矩阵乘以输入,而不是相反(还记得上一节中的矩阵乘法规则吗?).

并且输出为 0.5303 。注意,它与我们之前得到的相匹配。

将代码放在一起

现在让我们把所有这些放在一起

输出:

**Weights:  [[0.01789 0.00437 0.00096]]
Weights shape:  (1, 3)
Bias:  [[0.]]
Bias shape:  (1, 1)
input values:  [[5]
 [6]
 [6]]
input shape:  (3, 1)
output [[0.53032]]**

OneNeuronNeuralNetwork 类有两个参数——权重和偏差——由 magic/dunder 函数 init 初始化。

每次从类中创建对象时,都会调用 init 函数。init 方法让类初始化对象的属性,没有其他用途——来源:Udacity

我们使用 sigmoid_function 作为静态方法,因为它是一个普通的函数,不必接收第一个参数“self”。我们只是把它放在课堂上,因为它与这里的内容相关,否则就不是强制性的了。

正向传递中整个网络的计算

我们在上一节已经讨论了单个神经元的计算。在下一篇文章的中,我们将讨论在给定一些数据的情况下,整个网络如何执行单次转发。

请以每月 5 美元的价格注册成为 medium 会员,以便能够在 medium 上阅读我和其他作者的所有文章。

你也可以订阅,以便在我发表文章时将我的文章放入你的邮箱。

感谢您的阅读,欢迎下次光临!!!

NLP 是如何在医疗保健信息学中得到利用的

原文:https://towardsdatascience/how-nlp-is-being-leveraged-in-healthcare-informatics-283a53c8035e

医疗保健行业仍有如此多的非结构化文本数据可供利用

来自像素的免费使用照片

动机

医疗保健是“影响”可见且具体的领域之一。你看到人们的生命得到拯救,生活质量得到改善,并找到了治愈困扰不同人群数十年的疾病的方法。有许多报告和论文讨论了医疗保健信息学和人工智能(AI)市场不断增长的规模。其中一位来自 B2B 研究公司 Markets and Markets,他估计今年全球自然语言处理(NLP)在医疗保健和生命科学领域的市场规模为18 亿美元。它还提到,该市场预计将增长,到 2026 年价值将达到 43 亿美元。自然,将最先进的技术引入这一领域的努力至少从三十年前就开始了。在我看来,医疗保健领域仍有许多未开发的工作领域,数据科学、人工智能和新技术可以在降低成本、提高流程效率和透明度以及改善治疗和诊断方面发挥关键作用。特别是,由于医疗保健中产生的大量非结构化文本数据,自然语言处理方法变得更加重要。

在这篇文章中,我研究了可以在医疗保健中使用的各种数据源,NLP 如何在各种操作中使用和利用的应用,以及在医疗保健中使用 NLP 可以获得什么好处。这篇文章希望对那些正在考虑攻读医疗保健信息学学位的人或任何想进行研究或进行涉及健康相关数据集的附带项目的人有所帮助。

医疗保健中的数据源

EMR 和 EHR

电子病历(EMR)和电子健康记录(EHR)是医疗保健领域的经典数据源。例如,MSIS 和 TMSIS 数据库是由美国社会安全局管理的。它们包含关于医疗补助接受者的信息、他们的人口统计信息和各种健康指标。最终的缺点是由于安全和隐私的限制,很难访问数据。通常,这些数据存储在安全的飞地中,只允许授权用户使用特殊的身份验证方法访问它们。即使是这些授权用户,当他们想要使用数据时,也经常被要求访问和停留在保护这些数据的数据中心。

其他非结构化临床数据

除了 EMR 和 EHR 记录之外,其他临床数据还包括医生和抄写员的笔记、医学图像、医嘱条目和各种管理记录,这些都是日常临床操作的副产品。这些文档包含许多自然语言,这使得 NLP 技术更加有用。然而,它们通常是非结构化的,所以您需要注意细节,以确保从这些文档中解析出的信息是准确的。

保险数据

保险数据包括关于每个保险产品所包含的特定保单和索赔记录的信息。分析保险数据与其他健康记录的组合将能够为患者提供更个性化的治疗和保险产品。

审查数据

由于物联网技术的出现,健康监测应用程序(如 FitBit)生成的数据现在与云同步,公司和机构可以实时访问这些数据。这是一种以前没有的大数据。然而,用户必须更加谨慎地对数据做出假设,因为与在受控实验或调查环境中收集的数据相比,数据更容易出现各种统计错误。例如,从 FitBit 收集的数据可能不代表研究人员希望了解的整体兴趣人群,因为此类应用程序的用户可能有不同于平均人群的特定倾向。

社会化媒体

社交媒体是研究人员以前无法获得的另一个有价值的数据来源。推文、Meta 和 Instagram 帖子中的评论、来自 reddit 和 buzzfeed 的文本数据都是社交媒体数据的例子。这些是有价值的,因为它们有时是疾病爆发、暴力、精神健康问题等的前兆。或者针对某些话题指向特定的舆论。请看这篇论文,例如,它讨论了使用实时社交媒体数据来检测和远程监控艾滋病结果的方法。[2]

自然语言处理在医疗保健中的应用及其收益

降低成本

许多患者依靠电话来获得诊断或与临床机构交流。在这个过程中会产生巨大的成本。结合 NLP 和深度学习方法制作的移动应用程序或聊天机器人可以解决这个问题。

提高行政事务的效率

可以利用 NLP 方法从医生笔记、医疗政策文档等中提取信息。这将实现高效的计费、准确的预先授权批准和医疗政策评估[3,4,5,6]。

NLP 对于组织各种文档也很有用。在临床过程中会产生大量的医疗文档。假设医生或医学研究人员想要查阅过去 8 年中与疾病 X 相关的所有笔记,那么除非有一个“文档分类和标记”系统,否则很难找到这些资源。编纂医疗程序和治疗方法也很有价值。使用特定的“代码”将有助于医生、保险公司和管理人员更容易地相互沟通,而不必参考复杂的术语。在这些情况下,包括主题建模和语料库分类在内的 NLP 方法可以派上用场。最后,当快速响应和效率很重要时,汇总文档是必要的。围绕提取一段文本的要点的语料库摘要技术的 NLP 研究在最近二十年中已经取得了很大的进展,因此有助于摘要更专业的内容,例如医生笔记。

治疗最优化

医生需要做两件事来优化对个体患者的治疗——个体的具体特征和他们如何体验疾病的细节。为了获得这些信息,医生和病人之间应该进行坦诚的对话。然而,由于各种各样的原因,从对陌生人敞开心扉的焦虑到害怕被评价等等,这些对话经常不会发生。患者有时会更放心地与他们信任的人或相处时间较长的人交谈,包括亲密的朋友和家人。但更重要的是,他们经常在社交媒体上畅所欲言,分享自己的真实感受和经历。在某种程度上,社交媒体已经成为一个类似日记的空间,人们在这里写下他们的日常生活,分享他们的实际意见,以获得网络上其他人的支持和同情。这就是社交媒体非常有价值的原因。

我们可以使用 NLP 方法分析患者在社交媒体上发表的帖子和评论,从这种分析中获得的见解有助于医生确定要强调的积极结果和要跟进的消极结果。[5]此外,将病人告诉医生的话与他们告诉自己亲密圈子里的人的话进行比较,可以帮助医生确定他们如何才能改善病人与临床医生之间的沟通。

预防

许多新形式的非结构化数据,如来自社交媒体的帖子和评论,往往可以指向更大的健康趋势。它们的范围从某些司法管辖区的阿片类药物滥用模式到某个国家某些年龄组自杀风险的增加。例如,应用于社交媒体数据的 NLP 方法已被证明是筛选自杀风险和疾病爆发的有效方法。看看这张纸。[7]

我们研究另一个关于川崎病(KD)的例子。具有 NLP 功能的 CDSS(计算机化临床决策支持系统)已经证明了其提醒临床医生在紧急情况下考虑川崎病(KD)的潜力。[3,4,5,6]这种 NLP 工具在 22 例后来被诊断为 KD 的患者的急诊科总结中进行了培训。然后,它被应用到 253 份急诊病历中,这些病历都是关于被诊断为 KD 或其他发热性疾病的儿童的。在识别 KD 高可能性患者的任务中,该工具的敏感性得分为 93.6%,特异性得分为 77.5%。

偏置

当然,NLP 并不是解决医疗保健领域所有问题的神方法。我们需要考虑和警惕的一个主要问题是“算法偏差”。在我们用于 NLP 的许多临床数据源中,一定存在多种偏差。例如,医生的偏见将被嵌入到医生笔记中。自然,使用这些数据源得出的结果和分析在某种程度上也会包含数据中的相同偏差。在大多数情况下,这种偏见会被强化。这就是为什么许多人机交互(HC)研究越来越多地关注如何使算法更加透明、可解释,并且不受渗透到所使用数据中的偏见的影响。

参考

[1] 医疗保健和生命科学市场中的 NLP(2021),市场和市场

[2] S. Young,C. Rivers,B. Lewis,使用实时社交媒体技术检测和远程监测艾滋病毒结果的方法 (2014),PubMed

[3] A. Kulkarni,文本分析&医疗保健中的 NLP:应用&用例 (2020),Lexalytics 公司博客

[4] S. Rangasamy,R. Nadenichek,M. Rayasam,A. Sozdatelev,医疗保健中的自然语言处理 (2018),麦肯锡公司博客

[5] R. Attrey,A. Levit,自然语言处理在医疗保健中的前景 (2018),西安大略大学医学杂志

[6] 自然语言处理在医疗保健领域的 14 大用例,马鲁蒂理工大学实验室

[7] G. Coppersmith,R. Leary,P. Crutchley 和 A. Fine,社交媒体的自然语言处理作为自杀风险的筛选 (2018),生物医学信息学见解

关于作者

数据科学家。在密歇根大学刑事司法行政记录系统(CJARS)经济学实验室担任副研究员。即将入学的信息学博士生。他喜欢运动、健身、烹饪亚洲美食、看 kdramas 和制作/表演音乐。结帐他的 网站

如何不被时间序列模型所迷惑

原文:https://towardsdatascience/how-not-to-be-fooled-by-time-series-forecasting-8044f5838de3

知道什么时候你看到的是看起来准确的预测,什么时候预测实际上非常准确

尼古拉斯·卡佩罗在 Unsplash 上的照片

很容易被时间序列模型骗。我见过能够(似乎)准确预测最随机趋势的模型,如股票和密码价格,使用的是大多数人不完全理解的先进技术。时间序列在这方面真的像魔术一样吗?执行正确的数据操作,应用足够复杂的模型,很快,对未来任何日期索引线的预测都惊人地准确?

如果你看到了我所描述的同样的事情,并且持怀疑态度,你有这种感觉是对的。通常发生的情况是,分析师正在传递一系列单步预测,这些预测在数据的验证切片上看起来是准确的。分析师得出结论,他们创建的模型足够强大,可以准确预测未来的许多时期。这可能会有意或无意地发生——如果要我猜的话,我会说大多数分析师,他们通常会看到基于横截面数据构建模型的例子,从来没有想过向数据集添加时间元素可能会对他们的模型产生什么影响。时间序列不同于其他机器学习,必须采取额外的预防措施,否则结果会令人误解。

自相关的作用

一部电视剧的现在通常与其过去高度相关。这被称为序列的自回归(AR)特性,或自相关。具体来说,任何给定的值都可能非常接近它之前的值。

这一事实的含义比它们初看起来更深刻。让我们考虑一个线性模型,它有一个自回归分量、一个趋势分量和一个季节分量,例如:

作者图片

该函数表示前一个值(x_{t-1})乘以因子α,序列的“季节性(s_t)、序列的“趋势(t_t)和误差项(e_t)确定序列中的下一个值。假设您想将该模型应用于真实数据,特别是预测未来 10 个月的数据。你有 100 个月的观察时间来做这件事:

作者图片

作者图片

数据有了,就准备模型吧。要从列出的方程中获得第一项,即自回归项,我们可以使用 pandas 的shift()方法:

data['AR1'] = data['Target'].shift()

对于季节性,我们可以使用傅立叶变换,而不是使用月份值,傅立叶变换使用波函数来模拟季节性:

data['MonthSin'] = data['Month'].apply(
    lambda x: np.sin(np.pi * x/(12/2))
)
data['MonthCos'] = data['Month'].apply(
    lambda x: np.cos(np.pi * x/(12/2))
)

最后,我们可以使用数据集中已经存在的year变量来模拟趋势。

现在,我们有了我们需要的所有三个组成部分:前一个序列的价值(x_{t-1})、趋势(t_t)和季节性(s_t)。我们假设误差项(e_t)是随机的,无法建模。所以,让我们写一个正常的机器学习管道,看看会发生什么。

data_processed = data[
    [
         'Target',
         'AR1',
         'MonthSin',
         'MonthCos',
         'Year'
    ]
].dropna()
data_processed.head()

作者图片

我们使用 scikit-learn 来分割我们的数据,这样最后 10 个观察值就在测试集中。

y = data_processed['Target']
X = data_processed.drop('Target',axis=1)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=10, shuffle=False
)

剩下的就是小菜一碟了。训练线性模型:

lr = LinearRegression()
lr.fit(X_train,y_train)

对看不见的测试数据进行预测:

pred = lr.predict(X_test)

最后,评估误差:

mean_absolute_error(y_test,pred)

这将返回值 3.8。我们甚至可以画出结果。

sns.lineplot(
    y='Target',
    x='Date',
    data=data.reset_index(),
    label='actuals',
)
sns.lineplot(
    y=pred,
    x=data.index[-10:],
    label='predictions',
)
plt.rcParams["figure.figsize"] = (8,6)
plt.show()

作者图片

看起来相当不错!假设您向您的主管展示了该模型,他们同意该模型是准确的,并且应该实施。但是等等,一个问题。该模型严重依赖上一个序列的值来预测下一个值。如果我们不知道所有十个步骤的前一个值,我们如何将这个模型扩展到未来呢?

做到这一点的一种方法是扩展我们的方程,以便可以使用多步骤过程动态评估线性模型。考虑在原始等式中,不是使用实际的过去值作为输入,而是使用过去值的预测,因此第二预测步骤可以写成:

作者图片

更一般地说,我们可以说:

作者图片

其中 j 是预测范围内的任意时段。这是将你的预测延伸到未来时期的可靠方法。问题解决了。除此之外,我们遇到了两个问题:

  1. 为此,编写预测评估程序需要做大量的额外工作。
  2. 我们的模型没有经过这种方式的测试,所以测试集度量可能会产生误导。

我们可能认为第二点没什么大不了的,但实际上,正如我们将看到的,这是一件大事。因为在测试集中,我们知道我们所做的所有 10 个预测的 AR1 值,所以我们报告的错误性能被大大夸大了(或者你可以说缩小了,因为越小越好)。我们的图表也很容易让人误解。这个模型实际上没有那么精确,至少 10 步内没有。

我们可以使用 scalecast 包有效地演示这一点。我们将使用相同的数据并将相同的术语添加到Forecaster对象中:

from scalecast.Forecaster import Forecasterf = Forecaster(y=data['Target'],current_dates=data.index)f.set_test_length(10)
f.generate_future_dates(10)
f.add_seasonal_regressors('month',sincos=True,raw=False)
f.add_seasonal_regressors('year')
f.add_ar_terms(1)

然后我们称之为模型。但是,我们要用两种不同的方式来称呼它。第一种方法是 scalecast 的默认方法,其中测试集预测是通过我们已经介绍过的动态预测过程进行的。在测试集中,AR1 的值不再是已知的,但相反,它是 10 个步骤中的 9 个步骤的预测值(在步骤 1 中,我们使用实际值,因为我们知道它是什么)。第二个模型将与我们评估的没有 scalecast、非动态评估的模型完全相同,其中我们总是知道测试集中 AR1 的值:

f.set_estimator('mlr')
f.manual_forecast(call_me='mlr_dynamic')
f.manual_forecast(call_me='mlr_non-dynamic',dynamic_testing=False)

然后我们绘制结果图:

f.plot_test_set()
plt.rcParams["figure.figsize"] = (8,6)
plt.show()

作者图片

上图中的红线是我们之前评估的模型,同样的趋势,同样的预测值。橙色线是我们用同样的输入获得的结果,但是是动态测试模型。差别很大!以至于,事实上,测试 MAE 下降到 9.1,或者几乎差 2.5 倍!

f.export('model_summaries')[['ModelNickname','TestSetMAE']]

作者图片

哇哦!现在我们需要解释我们的主管发生了什么事。

更广泛的影响

这意味着什么?我可以用同样的输入运行同样的模型,似乎可以预测任何事情,我是说任何事情,如果我不动态测试误差项的话。下面,显示的图显示了一条红线,它是非动态评估的预测,以及一条橙色线,它显示了模型在完整测试集上的更公平表示,即真正的样本外预测。所有应用的模型都属于多元线性回归类。

标准普尔 500 指数

以下是我对 2021 年开始后不久标准普尔 500 唯一训练数据的预测:

作者图片

我可以预测到它的急剧上升,也几乎可以预测到它开始下跌的准确时间。

比特币

2021 年 12 月,我本可以预测到最近的比特币崩盘:

作者图片

新冠肺炎(新型冠状病毒肺炎)

通过使用一个主要机场的航班乘客作为代理,我可以预测到 2015 年新冠肺炎疫情航空旅行的下降,以及随后的复苏!!

作者图片

请记住,所有这些模型都是在一个数据集上训练的,并在他们从未见过的数据切片上进行验证。因此,我只能断定,我偶然发现了世界上最强大的模型之一。不错!

如何避免制造误导模型

所以,很明显,我不可能预测到这些事情。但是,我们有多经常看到这样的结果,当实际上,除了一系列单步预测之外,分析师试图传递高度准确的模型?这些模型中有很多没有受到挑战,因为它们是用先进的机器学习算法构建的,或者是由不了解情况的分析师构建的。无论它们看起来多么花哨,无论它们的解释多么雄辩,高级模型,包括递归神经网络和 LSTMS,都不是魔法。他们无法预测不可预知的事情。这并不意味着没有高智商的人在用它们做着不可思议的工作,只是意味着当它们被不正确地应用时,它们会变得极具误导性。

所以,现在我们知道不该做什么了。在第二部分中,我们探索了可以帮助我们建立不会欺骗的高效时间序列模型的验证技术。它们在测试集上看起来不那么准确,但它们更擅长预测未来,这正是我们在预测时真正关心的。因此,如果你感兴趣的话,可以订阅并注册电子邮件通知。本分析中使用的所有数据都是虚构的,通过公共 API 获得,或者通过麻省理工学院许可获得。看到这里的笔记本我创造的。

如何(不)做 MLOps

原文:https://towardsdatascience/how-not-to-do-mlops-96244a21c35e

凯文·Ku 在 Unsplash 上的照片

如何(不)做 MLOps

最初发表于我的博客。

我的公司——嗯,我的团队——组织了一个叫做读报俱乐部的组织。这个想法是让我们每个人向整个团队提交一篇论文,我们觉得这篇论文很吸引人,并且与我们的工作相关。因此,对于几周前举行的论文展示会议,我决定展示“使用反模式避免 MLOps 错误”。

自去年以来,我们一直在关注 MLOps 和 ML Engineering。我主要是一名数据科学家,但也是 MLOps 团队的一员,我发现这篇文章与我们的工作非常相关。

“正如设计模式编纂最佳软件工程实践一样, 反模式 提供了一个词汇来描述有缺陷的实践和方法。”

这些实践包括整个 ML 模型部署生命周期的步骤,包括性能跟踪、监控等部署后任务。定义了九种反模式。我也加入了我在建造模型和大规模部署它们的经验中的一些想法。

💡还有一个关于 数据交换 的不错的播客,你可以听听。

现在从这些反模式开始…

数据泄露

我们试图避免的最大和最常见的问题之一是数据集中的信息泄露。模型使用了不应该使用的数据/信息(或在推断过程中不可用的数据/信息),这在我们的评估阶段给了我们不正确的结果。当训练-测试分割不是按顺序进行时,时间序列数据也容易出现这种情况。对于不平衡数据,执行不正确的过采样是另一个例子——在将数据分成训练集和测试集之前进行过采样。其他示例包括预处理阶段,在训练测试分割之前,再次执行标准归一化。

立即行动,不要反思

大多数时候,来自我们模型的预测被直接使用,没有任何检查、过滤甚至检验。这导致围绕概念漂移和错误预测的问题。

避免这种情况的一个好方法是定义系统和过程来研究数据和预测的偏差。数据漂移仪表板—可以监控和跟踪数据指标的简单仪表板在这里非常有用,即使是手动检查。预测也可以通过这样的仪表板,简单的聚合指标和图表可以用来跟踪预测的分布。如果在违反某些阈值时发出警报,就可以避免大量的调试工作。

地毯下的调谐

虽然我不一定理解这是严格的反模式,但我绝对认为这是一个很好的指导原则,可以节省大量的金钱和时间。这与超参数是如何调整的有关。作者提出,超参数空间的随机搜索(在定义的范围内)产生了计算上廉价并且与网格搜索等效的替代方案。这会给你的迭代(周期)和成本带来很大的不同。记录与超参数相关的一切也是非常重要的,以便它是可重复的(包括使用的随机种子)。

我个人发现像权重和偏见和 Neptune.ai 这样的工具在这里非常有用。这些工具成倍地增加了你的实验周期,这是在大多数公司应用 ML 解决问题时最重要的实践。

PEST——感知的经验优势

机器学习研究是由理论建议的经验验证和确认驱动的。对应用机器学习研究的新贡献包括(I)验证以前未验证的理论建议,(ii)结合经验验证的新理论建议,或(iii)对现有学习管道的有效扩充,以产生改进的经验性能。作者提到,通常新提出的 ML 方法的经验验证是不充分的,有缺陷的,或发现有所欠缺的,这导致了术语 PEST 的定义。他们谈到需要相同的实验管道来比较和评估 ML 模型。

不良信用转让

该反模式讨论了未能正确识别性能提高的原因。虽然您的模型架构和那些超级调整的超参数将提升您的性能,但未能将(可能的)收益归因于其他任务,如巧妙的问题表述、某些预处理步骤等。可能会导致未来的问题。

扩展前面提到的数据漂移仪表板,并使用实验跟踪工具,人们应该能够从部署的每个模型中定义推论,以便能够适当地进行属性划分。

给自己的考试打分

这些都是不正确的评估和验证实践所带来的问题。测试和评估数据应独立采样,对于稳健的性能分析,应在模型开发完成之前保持隐藏,并且只能用于最终评估。

解决这个问题的一个方法是投资特色商店。这些可以是独立的地面真相系统,由数据管道驱动,定期创建您的训练测试数据集,确保您总是可以有看不见的测试集。

一劳永逸

说到模特训练,我们很多人都是这种心态。这个反模式讨论了概念漂移和建立模型再培训作业和管道的合理需求。围绕贝叶斯模型已经有了一些工作,用于概念漂移的检测和适应。

前面提到的推断仪表板可以帮助捕捉这些漂移,只需通过人工检查。当然,这也可以自动化。

带着矛盾的心情交流

预测很重要,但预测中的不确定性可能更重要。对于基于模型预测做出决策的情况,以及这些决策是否至关重要(与财务、健康等相关)。)那么这些不确定性就变得至关重要了。报告预测不确定性的机制变得很重要,如果出现问题,可以启用后备系统和更有信心的模型。

最后,数据危机即服务

回到特征(数据)存储的概念。每一个产生你的数据的管道都应该被记录下来,并且详细的信息应该被传达。一种有效的方法是构建与要素存储同步的数据目录。这确保了新的管线可以容易地创建和调度,遵守特征存储的预定义标准,并且更重要的是,设置了能够在需要时复制这些管线的过程。这也有助于跟踪数据血统。

作者的建议

几十年来,技术债务一直让工程师望而却步。技术债务对我们来说(读 ML 的人)并不真正与软件工程相关,但它与数据管道、模型管道、模型(再)培训工作、反馈机制等等都有关系。

为了解决这些问题,他们提出了一些具体建议:

  • 使用这些反模式来设置流程以避免这些错误
  • 使用断言来跟踪数据质量
  • 记录数据传承并创建“审计跟踪”
  • 出现错误时,使用集合和后备系统
  • 在多个层面确保人在回路中的操作能力

如何不和图表撒谎

原文:https://towardsdatascience/how-not-to-lie-with-charts-3516b38a680b

数据可视化

如何不和图表撒谎

你可以用数据可视化来告知,或者误传。如果你想做前者,而不是后者,我们会考虑要避免的事情。

改编自著名的短语* —作者的形象

数据被用来说服我们——提出一个论点。数据科学家或数据记者想要讲述一个关于一个想法、一项研究、一个理论、一项新技术的故事。

但有时有一个隐藏的议程。

也许是一个政客在推动一个党派议程,或者是一个营销主管试图销售一种产品,但有时数据的呈现方式是设计师希望你做一些他们想要的事情——也许是为他们的政策投票,或者也许是购买一台新的洗衣机或冰箱。

我们可能希望数据公平地呈现给我们,但情况并非总是如此。那么,我们能做些什么来发现那些可能想要误导我们的人,以及我们如何确保我们不会无意中误导他人呢?

让我们考虑一下图表是如何对我们撒谎的(然后我们会看一些真实的例子)。

图表说谎的 5 种方式

Alberto Cairo 告诉我们,使用图表欺骗观众有五种方法:

  • 使用设计不佳的图表
  • 显示可疑的数据
  • 显示不足的数据
  • 隐藏不确定性
  • 暗示误导模式

Cairo 是在媒体中使用图表的权威。他在为西班牙和巴西的主要报纸工作时学会了印刷媒体行业。现在他是佛罗里达州迈阿密大学传播学院视觉新闻学的骑士教席,也是私人和政府组织的顾问。

Cairo 也是许多书籍的作者,包括真实艺术:数据、图表和交流地图和功能艺术:信息图形和可视化介绍。

但是上面列出的欺骗方法来自于图表如何说谎:对视觉信息变得更聪明(从现在开始, HCL )。这本优秀的书以一个必要的章节开始,讲述了图表是如何工作的,但很快就进入了主题的实质:他们如何对我们撒谎,如何发现他们在对我们撒谎,以及自己如何不这样做。

糟糕的设计

图表设计不佳的原因有很多。在同一个图表上对不同的测量使用不同的刻度,例如,扭曲图形的比例,选择错误的基线(如果它不是零,你需要思考为什么不是)或使用三维图表。

饼图

有些人会说,简单地使用饼图是糟糕的设计,因为数据通常可以通过其他方式更好地交流。

他们说得有道理。

如果一个饼图有两个或三个以上的部分,它们可能很难解释,因为我们不太擅长判断一个饼图部分所代表的数量。与相同数量的饼图相比,更容易看出一堆柱形图之间的差异,这就是为什么条形图通常比饼图更可取。

想象一下你正在考虑安装太阳能电池板——当天气晴朗时,你可能会这么做。看看这张一年日照时间的饼状图:

饼图-作者图片

哪个月阳光最充足?七月,五月?哪个阳光最少?看起来是一月或十二月。

现在看一个显示相同数据的条形图:

条形图-作者提供的图像

这里不需要猜测。哪一列更大是完全清楚的,并且您对月份之间的数字差异有更好的了解。

也许没有饼图那么吸引人,但是数据更清晰。

但是,如果普通的饼状图很难解释,三维饼状图可能会特别有问题。

三维图表

看看下面的图表,它是由 HCL 中的一个例子启发而来的。想象一下,饼图代表我的公司在小部件制造领域的市场份额(我是橙棕色部分)。

作者从 图表如何说谎 的例子中获得灵感,作者 Alberto Cairo

看来我做得不错!我没有主导市场,但我的份额看起来很大。

但这不是真的。

3D 效果并没有给出真实的画面。我的饼图部分,也就是从其他饼图中挤出来的部分,看起来很大,但实际上是四个饼图部分中最小的。

这张更常规的图表显示了实际情况。

作者图片

基线效果

下一张图有一个不同的问题。数据来自 HCL,显示了在奥巴马总统任期内美国学校毕业率的改善情况。两个图表显示了相同的数据,但左边的图表显示了成就的明显变化——最后一列的长度是第一列的两倍多——但这是误导性的,因为使用的基线不是零而是 70%(美国政府公布的原始图表比这张图表更引人注目,但说明了同样的问题)。

作者提供的图片

右边的图表是一个更真实的零基线条形图,显示增长是真实的,但没有左边的图表让我们相信的那么剧烈。

如果图表不是从零开始,那么你必须知道为什么不是。例如,气候变化否认者有一个臭名昭著的图表,它绘制了 0 到 100 摄氏度范围内的温度变化。在这种尺度下,全球气温的变化几乎不明显。但这显然是无稽之谈,因为水的冰点和沸点(0 和 100)与气候变化没有多大关系。这是一个明显的例子,零基线是完全不合适的。大多数合理的图表显示了最近几年平均温度的变化,相对较小的温度变化更容易被看到。

可疑的数据

2018 年,据报道,某家英国银行存在性别薪酬差异问题。媒体抓住标题数字不放,称女性薪酬比男性低 44%左右。以下是英国政府官方网页的一个片段(暂时关注左边的图表):

银行的性别薪酬差距,2018 年-英国政府转载于开放政府许可 v3.0

但是,尽管报纸抓住了这些数字,但它们并没有说明全部情况。虽然总体来说女性确实比男性挣得少,但世界银行报告称,做同样工作的男性和女性的薪酬相似。到底发生了什么?

在比较类似的工作时,没有明显的性别工资差距。但是有一个问题。

标题数字的原因是从事低收入工作的妇女比男子多,所以这些妇女的总收入当然低于男子。

世行不存在性别薪酬差距问题,而是存在机会均等问题。

右边的图表显示,大多数高薪雇员是男性,女性倾向于从事低薪工作。

这仍然是一个问题,但不是报告的问题!

解决性别薪酬差距问题相对简单——给女性加薪就行了。但是,改变公司各个层面的性别比例需要更长的时间——你不能解雇大部分男性,雇佣更多女性,因为那样会因为公司的不良行为而惩罚员工个人。你必须等待人们继续前进或者退休。

有时需要多挖掘一点才能找到真实的故事。

数据不足

有时,我们可能会被缺乏数据或不清楚到底在测量什么所误导。

不要忘记通货膨胀

当政客们想要吹嘘他们在任期内如何资助某事或工资如何上涨时,他们通常会引用绝对数字——资助增加了 X 百万美元,平均工资增加了 Y 千英镑。

根据经合组织的数据,这是 2001 年至 2020 年间英国的平均工资。

2001 年至 2020 年英国平均工资——作者图片,数据来源:OECD

蓝线显示实际增加的 GB 磅数。2001 年平均工资为 22,371 英镑,2020 年为 36,987 英镑。这相当于增加了 14616 GPB,增幅约为 65%。

现在,如果我是一位执政时间很长的首相,我可能会忍不住指出,如此显著的增长是在我的任期内发生的。但这并不完全正确。

由于通货膨胀,现在英镑的价值比 10 年前要低,所以 2001 年的英镑价值比 2020 年的英镑高,所以这种增长并不像乍看上去那样。

图表中的红线使用 2020 英镑的值作为平均工资的衡量标准,正如你可以看到的那样,工资的增长没有那么急剧。2001 年的起点是 31,542 英镑(2020 年),2020 年的起点当然与之前的 36,987 英镑(2020 年)相同。现在,这比 2020 年增加了 5,445 英镑,或在 10 年内增加了约 17%——不太好!

如果你看到一个政客声称国防经费、护士工资、对外援助资金、教育预算或其他任何东西都大幅增加,确保他们使用的是经过适当调整的数据。如果你正在研究这样的证据,那么确保你也是。

阿尔贝托·开罗在他的书中提供了一个类似的例子。它对近年来最卖座的电影提出了质疑,并发现尽管按照现代标准,实际数字看起来很小,但电影《大白鲨》仍然是最大的财务成功之一。

我们所说的平均是什么意思

上面的例子是合理的,因为我们看到的是一段时间内的工资轨迹,而不是某个人的收入。

但是如果我们对普通英国人的实际工资感兴趣,这是一个有用的图表吗?

平均实际上是什么意思?大多数人的收入都在这个平均工资左右吗?

根据经合组织,他们对平均值的定义如下:

“平均工资的计算方法是将基于国民账户的工资总额除以整个经济中的平均雇员人数,然后乘以每个全职雇员每周平均工作时间与所有雇员每周平均工作时间的比率。”

换句话说,它是工资的平均值,并根据人们工作的实际时间进行调整。

但是,正如 Alberto Cairo 指出的那样,当一位政治家说减税将意味着普通人减税 X 美元时,这意味着什么呢?一般人是谁?

平均值可以是一组数据的统计平均值、中值或众数。这个词的日常用法通常是统计平均值,即某一特定测量值的总和除以这些测量值的个数。

但是平均数可能会被少数非常高的薪水扭曲,英国国家统计局(ONS)更喜欢使用中位数,这是范围的中心点,也就是说,50%的工人收入高于这个数字,50%的工人收入低于这个数字。

国家统计局 2021 年的工时和收入年度调查显示,全职工人的平均工资为 38,552 英镑,中位数为 31,285 英镑。差别很大。

所以,我们需要明确一点,我们说的是平均工资还是一般人的工资。

清楚不确定性

所有模型都是近似值。它们必须如此,因为它们是现实的简化版本。要想百分之百准确地预测一个事件,唯一的方法就是使用时间机器。即便如此,如果《回到未来》电影可信的话,那也可能行不通。

但是当我们看到 a 候选人在选举中有 75%的胜算时,我们自然会相信他们真的会赢,如果他们赢不了,我们就会抱怨说民意测验专家说的是错的。75%的胜算,当然还有 25%的败局。但试图说服一个押注热门人选的人相信,如果选举再举行 100 次,我们的候选人将赢得其中的 75 次,是没有用的。

缓解这个问题的一种方法是使用误差线。这是我们之前看到的相同的降雨量数据,但是让我们假设这是一个预测。误差棒显示我们的预测误差在正负 10%以内。

作者图片

误导模式

相关性并不意味着因果关系——这是统计学家的口头禅。仅仅因为两个变量变化的方式看起来像是有联系的,并不意味着一个直接影响另一个。例如,冰淇淋销售和晒伤之间可能有某种关系。那么,我们是否可以得出结论,吃冰淇淋会导致晒伤?

显然不是。

这种不太可能的相关性是由一个混杂变量引起的。在这里是太阳。当天气晴朗时,更多的人被晒伤,也有更多的人吃冰淇淋。晒伤病例和冰淇淋消费量都在上升,但它们都依赖于第三个变量,而不是相互依赖。

然而,有时混杂变量不太明显。在 HCL 中,Cairo 给出了一个很好的例子。散点图似乎显示,吸烟的人越多,预期寿命越长——这至少是一个意想不到的发现。然而,仔细观察,它实际上表明,富裕国家的人比贫穷国家的人更长寿,吸烟更多,而贫穷国家的人往往寿命更短。在中等收入国家,人们的寿命和吸烟率各不相同。将数据组合在一张图表上显示出奇怪的相关性,但当突出显示国家财富时,很容易看出正是这一点对预期寿命产生了重大影响。

我希望通过图表可能说谎的五种方式的小旅行是有用的,并将帮助你更深入地思考如何呈现你的数据。当然,真正的专家是 Alberto Cairo,他给出了比我更多的例子,我强烈推荐他的书。

一如既往地感谢阅读。如果你想知道我什么时候发表文章,你可以在 Medium 上订阅(见下面的链接),或者,你可以得到我偶尔的免费时事通讯,Substack 上的技术文件。

参考

图表如何说谎:让视觉信息变得更聪明作者 Alberto Cairo,W. W. Norton &公司(2019)

《真实的艺术:数据、图表和地图的交流》,作者 Alberto Cairo,New Riders (2016)

功能艺术:信息图形和可视化介绍作者 Alberto Cairo,New Riders (2012)

*报价

“谎言有三种:谎言、该死的谎言和统计数据”这句话经常被认为是马克·吐温说的,但它的起源https://en.wikipedia/wiki/Lies,_damned_lies,_and_statistics可能早于他的用法。

本文包含附属链接。

如何不用 Python 做意大利面

原文:https://towardsdatascience/how-not-to-make-spaghetti-out-of-python-7f4d96d4000b

遵循这些简单的准则,避免让你的 Python 代码看起来像一盘热意大利面

(图片由 Pixabay 上的 TanteTati 提供)

介绍

P ython 是你梦想中的编程语言;它很容易写,使用简单,并且有一个生态系统,甚至可以把一条鲸鱼炸出水面。考虑到这一点,很容易理解为什么许多初学者和希望自学编程的有抱负的程序员选择 Python 作为他们学习的第一语言。如此易于理解,如此具有宣示性的一大好处是,许多人可以不费吹灰之力就能接触到这种语言并尝试使用它。

然而,可访问性是一把双刃剑。此外,自学成才的程序员是一把双刃剑,作为一个自学成才的程序员,我可以证实,这些问题中的一些肯定在早期适用于我,甚至在我学习 Python 的时候,那是在我开始编写计算机程序之后。参与技术的好处之一是每天都有变化,或者你可以从旧的事物中学到新的东西。虽然学习如何以最容易理解和一致的方式格式化 Python 代码的最好方法可能是通读 PEP8 指南,但这个列表可能对那些想让自己的 Python 看起来更好的人也有帮助。此外,还有一些有用的提示没有包含在 pep 8 compliance 中,但无论如何都可能会改进代码的某些方面,以使其更具可读性。事不宜迟,让我们来看看一些简单的准则,您可以在 Python 团队中利用它们来相应地组织和呈现代码。

最小参数

我想分享的第一个好建议就是在编写函数时少用参数。功能通常应该有一个单一的逻辑目标。在某些情况下,这可能是一个多步骤的过程,这就是一种称为提取的技术真正可以派上用场的地方,这种技术将在本文中进一步讨论。函数确实不应该有一个扩展的参数列表,除非这对函数来说是完全必要的。例如,绘图就是一个很好的例子。

参数实际上会大大降低函数调用的速度,尤其是在使用关键字参数时。相反,尽量减少这些争论当然是个好主意。它不仅会消除这样的代码

def hello(x, y, anexample, anotherargument, anothername,   anothername, anothername, anothername):
    return(nothing)

但是它也将帮助我们函数的用户更容易地调用这些函数。在这方面,另一个可以利用的优势是不同类型的论点。在某些情况下,使用关键字或默认的位置参数是有意义的,而在某些情况下,它没有多大意义。

逻辑分离

你可以做的一件事就是在你的代码中使用逻辑分离,这样可以让你的代码更容易阅读,同时也更有意义。这适用于多种不同的方式,例如定义之间的空白。没有文档字符串或任何使用空白进行逻辑分隔的堆叠在一起的函数的问题是,很难区分函数的开始和结束位置。当然,缩进肯定会对此有所帮助,但通过在函数和类之间创建更多的分离,它肯定会使您的代码更加易读和简单。

逻辑分离代码的另一个可能更重要的方面是通过函数。相关代码,以及直接依赖于另一个方法的代码可能应该用那个方法和它一起定义。这使得人们更容易理解正在发生的事情。相信我,当到处都是纠缠不清的方法定义时,很难弄清楚到底发生了什么,并且您需要不断地找出发生了什么。当函数没有恰当地命名时,这变得更加困难。

提取,血统

我推荐用来清理 Python 代码的下一项技术是抽取。在这个列表的所有选项中,我想说拔牙可能是最有价值的。提取是我在自己的代码中经常使用的一种技术。在许多情况下,您可能有一个解决特定问题的函数的想法,当您有了这个想法并想要测试您的方法时,在担心代码的细节之前,先放下您的想法是最有意义的。

在这种情况下,提取技术适合你!使用提取,您可以最小化特定函数中的所有调用,以使该函数更具可读性。这是一个类似这样的多阶段过程。

  • 首先,命名你的部分代码,并通过子程序定义你的目标。换句话说,我需要采取步骤 1、2 和 3 来得到结果,所以 1、2 和 3 都是我们函数的子程序。在我们对代码的哪些部分可以并且应该被提取有了一个好的想法之后,我们进入第二步。
  • 第二步是提取这些代码部分。为此,请从函数中移除相应的代码。
  • 提取的最后一步是将所有这些代码片段包装到它们各自的方法中,最后从我们提取的原始函数中调用这些方法。

如果您想更深入地分析和演示如何在代码中使用抽取技术来改进代码,我实际上有一整篇文章专门讨论这个主题。如果你想了解更多,你可以在这里阅读:

[## 更多的方法意味着更好的代码

towardsdatascience](/more-methods-means-better-code-1d3b237f6cf2)

键入您的参数

下一个技巧是我在 Python 中忽略的一个长类型技巧。这是键入要提供给函数的参数。很明显为什么 Python 程序员经常忽略这一点。除非正在使用一些很酷的魔法(例如 multiple dispatch ),否则键入参数在语法上对语言没有任何作用。然而,在两种特定情况下,它肯定会有所帮助。首先是简单地分析你的代码。知道一个论点的细节,什么方法可以用于一个论点,等等,要容易得多。当你看一个函数的时候,如果类型是指定的。

此外,这种类型规范非常适合 Python 支持的文档系统。也就是说,虽然对于创建伟大的、可工作的代码来说并不完全必要,但它确实提供了相当多的好处,而且除了多花几秒钟来输入冒号和类名之外,不会花费任何成本。

命名约定很重要!

学习一门新语言时的一个新手错误是没有意识到这门语言特有的命名惯例。作为程序员,我们为什么要使用命名约定?命名惯例允许我们仅仅通过观察事物来区分它们是什么,而不是实际上需要找出它们是这个还是那个。您可能已经注意到,因为使用了大写,所以很容易区分 Python 包中的方法、类和命名别名。在 Python 中,

  • 所有大写字母通常是为诸如 mime 和解释器之类的东西保留的,但它可能最常用于表示全局或环境变量。
  • 第一个大写字母代表一个构造函数。
  • 所有小写字母都表示定义的变量,除非小写字母后面有括号,否则它们表示函数调用。
  • 在 Python 中,模块通常也用小写字母表示。

结论

计算机编程这个错综复杂的网络是不断增长和持续的,因此我们的学习过程也必须是持续的。代码约定以及任何个人或组织编写代码的方式总有改进的空间。也就是说,如果有人想让自己的 Python 代码更加平易近人、更加漂亮,这些技巧中的一些肯定会派上用场。

在这个列表所涵盖的主题中,我可以肯定地说,关键的焦点应该是你将方法放在哪里,以及你如何定义你的方法。虽然这并不是所有软件的情况,当然,甚至不是很接近,我喜欢考虑引入标准元语言或 SML 的方法论。这种语言的核心思想是,每个函数只做一件事,并接受一个参数来做这件事。虽然这可能不是关于通用编程规模的最恰当的建议,但肯定可以从这个想法中吸取一些教训。希望这些建议就像意大利面中的橄榄油,你再也不用担心为你的意大利面代码找到番茄酱了!

隐藏层数如何影响自动编码器潜在表示的质量

原文:https://towardsdatascience/how-number-of-hidden-layers-affects-the-quality-of-autoencoder-latent-representation-181215c8e7d1

自动编码器中超参数调谐—第 1 部分

Clark Van Der Beken 在 Unsplash 上拍摄的照片

介绍

你可能已经知道自动编码器潜在表示包含了输入数据的最重要的特征,当它的维数明显低于输入数据的维数时。

自动编码器潜在表示的质量取决于许多因素,例如隐藏层数每层中的节点数、、潜在向量的维数、、、隐藏层中激活函数的类型、、优化器的类型学习速率数量、、技术上,这些因素被称为自动编码器模型 超参数

获得这些超参数的最佳值称为超参数调整。机器学习中有不同的超参数调整技术。一个简单的技术是手动调整一个超参数(这里是隐藏层数),同时保持其他超参数值不变。

今天,在这一集里,我将向你展示隐藏层的数量是如何影响自动编码器潜在表现的质量的。

我们使用的数据集

我们将使用 MNIST 数据集 (见最后的引文)在这里建立自动编码器模型。

获取并准备 MNIST 数据集(作者代码)

方法

我们将建立三个具有不同架构的自动编码器模型,这些模型仅取决于隐藏层的数量,而模型中的其他超参数值保持不变。我将使用几种可视化技术来验证结果。

具有一个隐藏层的自动编码器

(图片由作者提供)

上述自动编码器架构可以编码如下。

用一个隐藏层定义自动编码器架构(作者代码)

(图片由作者提供)

现在,我们可以训练模型了。

(作者代码)

(图片由作者提供)

现在,我们可以看到编码后压缩的 MNIST 数字。

(作者代码)

带有一个隐藏层的自动编码器的输出(图片由作者提供)

此输出不够清晰,无法区分 MNIST 数据集中的每个数字,因为单个隐藏图层不足以捕捉 MNIST 数据中大多数复杂的非线性模式(关系)。

我们可以将上面的输出与原始的 MNIST 数字进行比较。

(作者代码)

原 MNIST 数字(图片由作者提供)

现在,我们可以在潜在空间中可视化测试 MNIST 数据,以查看具有一个隐藏层的自动编码器模型如何能够区分九个数字。

(作者代码)

可视化潜在空间中的测试 MNIST 数据(图片由作者提供)

这些数字在潜在空间中没有清晰的独立簇。这意味着仅具有一个隐藏层的自动编码器模型不能清楚地区分测试 MNIST 数据中的九个数字。

作为一个解决方案,我们可以增加自动编码器模型中的隐藏层数。

具有两个隐藏层的自动编码器

(图片由作者提供)

上述自动编码器架构可以编码如下。

定义具有两个隐藏层的自动编码器架构(作者代码)

(图片由作者提供)

现在,我们可以像以前一样训练模型。

(图片由作者提供)

现在,我们可以看到编码后压缩的 MNIST 数字。

具有两个隐藏层的自动编码器的输出(图片由作者提供)

此输出比前一个输出好得多,因为两个隐藏层可以捕获 MNIST 数据中大量复杂的非线性模式(关系)。但是,这个结果仍然离最初的 MNIST 数字相差甚远。

原 MNIST 数字(图片由作者提供)

现在,我们可以在潜在空间中可视化测试 MNIST 数据,以查看具有两个隐藏层的自动编码器模型如何能够区分九个数字。

可视化潜在空间中的测试 MNIST 数据(图片由作者提供)

与之前的输出相比,一些数字在潜在空间中有清晰的独立簇,而一些没有。这意味着具有两个隐藏层的自动编码器模型可以在一定程度上区分测试 MNIST 数据中的九个数字,但不是完美的!

作为一个解决方案,我们可以进一步增加自动编码器模型中的隐藏层数。

具有三个隐藏层的自动编码器

(图片由作者提供)

上述自动编码器架构可以编码如下。

定义具有三个隐藏层的自动编码器架构(作者代码)

(图片由作者提供)

现在,我们可以像以前一样训练模型。

(图片由作者提供)

现在,我们可以看到编码后压缩的 MNIST 数字。

三层隐藏自动编码器的输出(图片由作者提供)

此输出比前两个输出好得多,因为三个隐藏层可以捕获 MNIST 数据中大多数复杂的非线性模式(关系)。除此之外,这个输出足够接近原来的 MNIST 数字,但它并不完美!

原 MNIST 数字(图片由作者提供)

现在,我们可以在潜在空间中可视化测试 MNIST 数据,以查看具有三个隐藏层的自动编码器模型如何能够区分九个数字。

可视化潜在空间中的测试 MNIST 数据(图片由作者提供)

与前两个输出相比,大部分数字在潜在空间中具有清晰的独立簇。这意味着具有三个隐藏层的自动编码器模型可以清楚地区分测试 MNIST 数据中的九个数字。

结论

您可以尝试进一步增加自动编码器模型中的隐藏层数。当您这样做时,由于模型变得更加复杂,有许多隐藏层,这可能会导致过拟合,从而显著降低自动编码器潜在表示的质量。为了减轻自动编码器模型中的过拟合,您可以尝试不同的正则化技术,如 辍学提前停止

在这篇文章的结尾,我想用一张图片向您展示三种自动编码器模型的输出,并与原始的 MNIST 数据进行比较。

自动编码器输出一张图片(图片由作者提供)

最上面一行代表原始的 MNIST 数据。随着我们一个接一个地增加 autoencoder 模型中隐藏层的数量,autoencoder 潜在表示的质量也会提高!我们可以考虑进一步增加隐藏层的数量,但这可能会导致我前面提到的过度拟合。

今天的帖子到此结束。

如果您有任何问题或反馈,请告诉我。

阅读下一篇(推荐)

  • 深度学习中的自动编码器介绍

https://rukshanpramoditha.medium/an-introduction-to-autoencoders-in-deep-learning-ab5a5861f81e

  • 自动编码器潜在向量的维度如何影响潜在表示的质量

https://rukshanpramoditha.medium/how-the-dimension-of-autoencoder-latent-vector-affects-the-quality-of-latent-representation-c98c38fbe3c3

  • 自动编码器如何在降维方面优于 PCA
  • 全集我的 神经网络与深度学习教程

**

点击图片进入我的神经网络和深度学习课程(作者截图)**

支持我当作家

我希望你喜欢阅读这篇文章。如果你愿意支持我成为一名作家,请考虑 注册会员 以获得无限制的媒体访问权限。它只需要每月 5 美元,我会收到你的会员费的一部分。

**https://rukshanpramoditha.medium/membership

非常感谢你一直以来的支持!下一篇文章再见。祝大家学习愉快!**

MNIST 数据集信息

  • ****引用:邓,l,2012。用于机器学习研究的手写数字图像 mnist 数据库。 IEEE 信号处理杂志,29(6),第 141–142 页。
  • ****来源:http://yann.lecun/exdb/mnist/
  • **许可:Yann le Cun(NYU 库朗研究所)和 Corinna Cortes (纽约谷歌实验室)持有 MNIST 数据集的版权,该数据集在知识共享署名-共享 4.0 国际许可(CC BY-SA)下可用。您可以在此了解有关不同数据集许可类型的更多信息。

鲁克山普拉莫迪塔
2022–08–23

政策梯度如何让你登上月球

原文:https://towardsdatascience/how-policy-gradients-in-reinforcement-learning-can-get-you-to-the-moon-15940cbc076a

RL 实践课程—第 7 部分

墨西哥霍尔博克斯的贾戈达和凯(图片由作者提供)

策略梯度是一系列强大的强化学习算法,可以解决复杂的控制任务。在今天的课程中,我们将从头开始实现普通的渐变政策和登月🌗。

如果您是强化学习的新手,请查看 课程简介 以了解基础知识和术语。

同样,你可以在 这个资源库 中找到今天课程的所有代码👇🏽

喜欢吗?在 GitHub 上给它一颗星

内容

  1. 政策梯度如何上月球?🚀🌙
  2. LunarLander环境
  3. 基线代理
  4. 欢迎政策梯度🤗
  5. 策略梯度代理
  6. 关键要点
  7. 家庭作业📚
  8. 下一步是什么?

1.政策梯度如何上月球?🚀🌙

为了登上月球,我们使用宇宙飞船,这是一个巨大的、模块化的工程,结合了令人难以置信的力量和温和的精度。

在我们旅程的开始,我们使用强大的火箭(如下图所示)来帮助宇宙飞船摆脱地球的引力。

两枚火箭将我们的宇宙飞船推入太空

一旦火箭耗尽,宇宙飞船将它们安全地释放到地球的海洋中,并开始其 385,000 公里(239,000 英里)的月球之旅。

三天后,我们的宇宙飞船接近月球,并开始绕月球运行。这部精湛戏剧的最后一幕是登陆

宇宙飞船释放了一个装置,月球着陆器,月球的引力场向下拉向它的表面。我们整个任务的成功取决于这个装置的平稳着陆。

月球着陆器(维基共享资源)

在今天的讲座中,我们将使用强化学习来训练一个代理(又名控制器)将这个设备降落在月球上。

此外,我们将使用 OpenAI 中的LunarLander环境作为着陆问题的一个方便(和简化)的抽象。

最后,这就是您今天要实现的代理如何在月球上着陆。

2.LunarLander环境

在进入建模部分之前,让我们快速熟悉一下LunarLander环境。

状态

代理获得具有 8 个分量的状态向量:

  • 目前在 2D 世界的位置: xy
  • 沿这两个轴的速度: vxvy
  • 相对于垂直方向的角度位置 θ :
  • 角速度 ω ,捕捉设备绕自身轴的旋转。
  • 两个二进制信号( s1s2 )指示设备的两个腿中的哪一个(如果有的话)与地板接触。

动作

有 4 种可能的操作:

  • 0无所事事。
  • 启动左引擎。
  • 2点燃主引擎(中央)。
  • 3点燃右侧发动机。

奖励

在这种环境下,奖励函数被设计成向代理人提供足够的信号。这使得训练更加容易。

这是着陆器在每个时间步得到的奖励:

  • 如果着陆器远离着陆垫,它会得到负奖励。
  • 如果发生事故,它将获得额外的-100 分。
  • 如果是休息,它会获得额外的+100 点。
  • 每条腿着地+10 分。
  • 启动主引擎每帧-0.3 分。
  • 发射侧边引擎每帧-0.03 分。
  • 最后,解决了 200 分。

奖励工程的利弊

奖励工程是一种建模技巧,通过向代理提供频繁的反馈来帮助 RL 代理学习。奖励很少的环境更难解决。

然而,它也有两个缺点:

👉🏽设计奖励功能很难**,就像你看到LunarLander-v2奖励后可能想象的那样。在人们找到鼓励代理学习正确行为的奖励函数之前,通常要进行大量的反复试验。**

👉🏽奖励塑造是环境特定的**,它将被训练的代理的泛化限制在稍微不同的环境中。此外,这限制了在模拟上训练的 RL 代理到真实世界环境的可移植性。**

3.基线代理

👉🏽notebooks/01 _ random _ agent _ baseline . ipynb

像往常一样,我们使用一个随机代理来获得问题的快速基线。

接下来,我们使用 100 集来评估这个代理,以获得着陆器的总奖励和成功率:

然后我们画出结果

终于意识到我们的代理人是一个彻底的灾难

Reward average -198.35, std 103.93
Succes rate = 0.00%

*由于代理固有的随机性,当您在笔记本电脑上运行笔记本时,这些数字不会完全相同。无论如何,成功率几乎肯定是 0%。

另外,你可以看一段这个随机代理的视频,来说服自己我们还远远没有解决问题。

失败时间

事实证明,登上月球并不是一件容易的事(多么令人惊讶)

让我们看看政策梯度如何帮助我们登上月球。

4.欢迎政策梯度🤗

任何强化学习问题的目标都是找到一个最大化累积回报的最优策略**。**

到目前为止,在课程中,我们已经使用了基于值的方法,如 Q-learningSARSA 。这些方法以间接的方式找到最优策略,首先找到最优 Q 函数,然后使用这个 Q 函数按照ε-贪婪策略选择下一个最佳动作。这样他们就能得出最优策略。

****另一方面,基于策略的方法直接找到最优策略,而不必估计最优 Q 函数。

基于策略的方法的两个基本步骤如下:

第一步。政策参数化

我们使用神经网络模型来参数化最优策略。这个政策被建模为一个随机政策,与确定性政策相反。我们称之为策略网络,我们将其表示为

策略取决于参数 θ

随机政策和勘探与开采的权衡

随机策略将一个给定的观察(输入)映射到一个概率列表,每个概率对应一个可能的动作。

为了选择下一步要采取的操作,代理会根据操作的概率对其进行采样。因此,随机策略自然地处理探索与利用的权衡,而没有像ε这样的超参数技巧(如 Q-learning 中使用的ε-贪婪技巧)。

**在LunarLander-v2环境中,我们的随机策略将有 8 个输入和 **4 个输出。4 个输出中的每一个都代表采取 4 个行动中的每一个的概率。

策略网络的架构是一个您需要试验的超参数。我们今天要用的是一个有 64 个单元的隐藏层。

政策网(图片由作者提供)

解决我们的 RL 问题就相当于找到了这个神经网络的最优参数。

但是我们如何找到这个网络的最佳参数呢?

第二步。寻找最佳参数的政策梯度

评估一项政策有多好很容易:

  • 首先,我们对 、N 随机剧集遵循该策略,并收集每集的总报酬

  • 第二,我们平均这个 N 总报酬,得到一个整体绩效指标。这个表达式就是总报酬的经验平均值**。**

此外,总报酬以及 J 取决于策略参数 θ,a 我们的目标是找到使 J 最大化的参数 θ

同样,有不同的算法来解决这个最大化问题(例如,遗传优化),但通常在深度学习中,基于梯度的方法是王道👑。

基于梯度的方法是如何工作的?

我们从政策参数θ₀的初始猜测开始,我们希望找到一组更好的参数,θ₁

θ₁和θ₀的区别在于我们在参数空间中行进的方向。

问题是,增加 J 的最佳方向是什么?

而答案就是……这个渐变。****

什么事?

一个函数 J 相对于一个参数向量 θ 的梯度就是我们需要从 θ 到产生 J 的最大增量的方向。

J 相对于θ的梯度

但是,我们在梯度方向上应该移动的距离呢?

这是另一个(非常流行的)超参数:学习率α

配备了梯度和适当调整的学习率,我们做一步梯度上升,以提出一个更好的参数θ₁向量

梯度上升的一步

如果我们迭代重复这个公式,我们将获得更好的政策参数,并有望解决环境问题。

****

这就是梯度上升如何帮助我们找到最优的政策网络参数。

剩下的问题是,我们如何计算这些梯度?

估计政策绩效的梯度

为了实现这个算法,我们需要一个可以数值计算的策略性能梯度的表达式。

利用一点微积分和统计学,我们可以从数学上证明,政策参数可以用轨迹样本来近似,这些轨迹样本是用当前政策收集的,如下 :

其中轨迹𝛕是直到情节结束所观察到的状态和所采取的动作的序列

重要的是要强调这样一个事实,即这些轨迹必须使用当前政策参数来收集。

符合策略与不符合策略的算法

策略梯度方法是基于策略的算法,意味着我们只能使用在当前策略下收集的经验来改进当前策略。

另一方面,使用非策略算法,如 Q-learning,我们可以保留使用旧版本策略收集的轨迹的回放记忆,并使用它们来改进当前策略。

此外,上面的公式对应于最简单的政策梯度方法。然而,有这个公式的变化,取代每轨迹总回报 R(τᵢ)

每集总奖励

其他成功指标。

特别是,我们将在本课程中看到两个版本,一个在今天,另一个在下节课:

  • 给定动作后的累积奖励,又名奖励-继续****

  • 优势函数,是当前策略的 Q 函数和 V 函数的区别。

如果我们已经有了一个公式,为什么还需要其他公式来估计梯度?

政策梯度公式的所有 3 个变量都有相同的期望值,所以如果你使用一个非常大的轨迹样本,这 3 个数字将非常相似。然而,就计算性能而言,我们只能负担得起一小组轨迹,因此这些估计的可变性很重要。

特别

  • 奖励去的版本有一个比原来的公式更低的方差
  • 并且优势功能版本甚至比奖励去版本具有更小的方差。

较低的方差导致更快和更稳定的策略学习。

今天,我们将实现奖励到去的版本,因为它几乎与原始的累积奖励的香草政策梯度公式一样复杂。在下一讲中,我们将看到如何估计优势函数并得到更好的结果。

想了解细节吗?

由于本课程的目的是给你一个实践这个主题的方法,我将数学术语保持在最低限度。

如果你想了解从上面推导政策梯度公式的所有步骤,我推荐你阅读 Wouter van hees wijk的这篇 优秀博文📝。**

5.策略梯度代理

👉🏽notebooks/03 _ vanilla _ policy _ gradient _ with _ rewards _ to _ go . ipynb

让我们实现最简单的策略梯度代理,其中策略梯度公式中的权重是阶段性的回报。

超参数只有 3:

  • learning_rate是政策梯度更新的大小。
  • hidden_layers定义策略网络架构。
  • gradient_weights是每个时间步的奖励:即从当前时间步到剧集结束的奖励总和。

我们使用 Tensorboard 设置了基本的日志记录,并开始训练我们的 VPGAgent:

训练逻辑封装在[src/vgp_agent.py](https://github/Paulescu/hands-on-rl/blob/main/04_lunar_lander/src/vpg_agent.py)中的agent.train()函数中。该函数本质上是一个具有n_policy_updates次迭代的循环,在每次迭代中,我们:

  1. 收集batch_size轨迹的样本
  2. 使用随机梯度上升更新策略参数。
  3. 将度量记录到 Tensorboard
  4. 可能评估当前代理,如果它是我们目前找到的最好的代理,将其保存到磁盘。

什么是正确的 **batch_size** 使用方法?

每次策略更新的轨迹数量(又名batch_size)是一个超参数**,你需要调整它以确保你的训练在合理的时间内收敛到最优解。**

👉🏽如果batch_size太低,您将得到非常嘈杂的梯度估计,并且训练将不会收敛到最优策略。

👉🏽相反,如果batch_size太大,训练循环会不必要地变慢,而你会坐着等🥱

标绘训练结果

当模型正在训练时,我们到终端并按如下方式启动 Tensorboard 服务器:

$ tensorboard --logdir tensorboard_logs

如果您访问控制台上打印的 URL,您会看到一个类似于此的图表,其中横轴是代理到目前为止收集的轨迹总数,纵轴是每集的总奖励。

1M 步后每集总奖励(图片由作者提供)

我们清楚地看到代理正在学习,并在 100 万步后实现了大约 250 英镑的平均总回报。

由于总报酬不是一个非常直观的衡量标准,我们在100新剧集的培训结束时直接评估代理,并检查登陆成功率:

Reward average 245.86, std 30.18
Succes rate = 99.00%

哇哦!99%的准确率已经很不错了吧?

让我们快速休息一下,回顾一下,然后展示作业。我们走吧。

休息和补水的时间到了(图片由作者提供)

6.关键要点

今天我想让你睡在这三样东西上:

  • 首先,策略梯度(PG)算法直接参数化最优策略,并使用梯度上升算法调整其参数。
  • 第二,与深度 Q 学习相比,PG 算法更稳定**(即对超参数不太敏感),这很好。**
  • 最后,PG 算法的数据效率更低**,因为它们不能重用旧的轨迹来更新当前的策略参数(即它们是基于策略的方法)。这是我们需要改进的地方**

7.家庭作业

👉🏽笔记本/04 _ 作业. ipynb

  • 你能找到一个更小的网络来解决这种环境吗?我用了一个隐藏层 64 个单位,但我觉得这是矫枉过正。
  • 你能通过适当调整batch_size来加速收敛吗?

8.下一步是什么

在下一课中,我们将介绍一种新的技巧来提高策略梯度方法的数据效率。

敬请关注。

爱情,

活下去。

学习。

想支持我吗?

你喜欢阅读和学习关于 ML、AI 和数据科学的知识吗?

无限制地访问我在 Medium 上发布的所有内容,并支持我的写作。

👉🏽今天使用我的 推荐链接 成为会员。

**https://pau-labarta-bajo.medium/membership

👉🏽订阅 datamachines 简讯

👉🏽 跟着我 上媒。

祝你愉快🤗

避寒胜地**

时间序列数据的排序如何识别异常行为

原文:https://towardsdatascience/how-ranking-timeseries-data-can-identify-abnormal-behaviour-475c7fd21fb5

行业笔记

时间序列数据的排序如何识别异常行为

通过简单的 python 脚本告知您的维护策略并防止故障

美国公共电力协会在 Unsplash 上拍摄的照片

温度和压力等传感器读数有助于了解资产的“正常”行为。当读数偏离该标准时,它可能是损坏或低效运行的指示,如果不加以纠正,可能会导致代价高昂的设备故障。因此,这些数据有助于形成任何主动维护或检查活动。

例如,问题是温度与许多因素有关;资产的工作强度(例如生产水平)、环境温度和冷却效率。这使得寻找和识别真正关注的温度水平和变化变得棘手,可能需要昂贵的数据专家,有时我们只是没有收集足够的数据来获得准确的结果,或者没有兴趣在这方面投资。

然而,我们可以做一些更简单的事情。

如果我们有多种资产,例如发电机,我们可以将每个发电机的行为相对于其他发电机进行排序。通过随着时间的推移跟踪这一排名,我们可以寻找行为变化的*证据。*然后可以对此进行标记,以便进行深入调查。代码非常简单,不需要昂贵复杂的模型就可以获得结果。

本文侧重于工程应用,但很容易看出如何将其应用于任何受多种因素影响的基准测试。

一个例子

让我们以发电机为例,假设您有 20 台不同发电机的历史发电量和温度读数。只考虑发电机正常生产的时间。发电机 A 是 2016 年排名最高的生产商(最高产量),也是最热门的——这并不奇怪,我们知道这两者是相关的。在同一年,发电机 B 是最冷的(第 19 位)之一,具有中等的包装生产水平(第 11 位)。在接下来的四年里,这些相同类型的排名持续稳定,所以我们有信心这是他们的“标准”。

然而,在 2021 年,发现发电机 A 是该年第二热的,但却是最低的生产者之一。好像有什么不对劲,为什么还是这么热?此外,发电机 B 现在是第七热的发电机,但其生产值没有改变。这也很奇怪,这种发电机在这些生产水平下不会运行得这么热,还会发生什么呢?

只看温度读数可能会忽略发电机 A 的异常温度,因为从表面上看,温度读数没有太大变化,是它们与发电的关系发生了变化。孤立地看待这两者可能没有突出问题。同样,B 可能已经被遗漏,因为发电机仅是第七热的,因此可能被认为不够热而不必担心。

这是一个首过指标,现在应该对这两项资产进行全面的数据调查。当时还有什么在影响这个系统?例如,资产是否长期离线?通讯中断了吗?传感器精度有问题吗?是否存在可能导致此类行为的已知问题?回答这些问题,了解检查或主动工作是否符合您的利益。

代码

这个例子使用 python 中的 pandas 库。一般来说,工作流程是:

  1. 源时间序列数据 —以:时间戳、资产、世代、温度的形式
  2. 按期望的时间间隔分组——获得年或月平均值、总和、偏差等。
  3. 申请排名
  4. 分析结果

下面是更详细的工作流程。

准备要排序的数据

# import pandas library
import pandas as pd# read in timeseries data, may be via csv or queried direct
# from a database
df = pd.read_csv(r'filepath\filename.csv')# create a variable for your desired time interval
# i.e. year or month
df['year'] = pd.to_datetime(df['TimeStamp']).dt.to_period('Y')# group the data by generator and year and find the aggregate values
#e.g. average temperature over the year
df2 = df.groupby(['GeneratorId','year']).agg({'average_temp': ['std', 'mean'], 'generation': ['std', 'sum']})# write to excel
df2.to_csv(r'filepath\filename.csv', index = False)

虽然您可以在这一步应用排名,但我建议导出数据子集,并对照实际值进行检查。这将确保脚本像预期的那样工作,并可能使您以后免受代码中任何讨厌的错误的困扰。

对数据进行排序

这个函数非常简单,一旦读回 python apply:

df2['average_temp_rank'] = df_year.groupby('year')['average_temp_mean'].rank(pct=True)

这将把温度等级应用到名为“average_temp_rank”的新列中。对其他要排序的值重复此操作,如 generation sum,就这样!

分析一下

然后可以在 python 或 excel 中进行进一步的分析,以跟踪这些排名是如何变化的。一种方法可以是趋势代排名:温度排名比率,这是保持稳定还是变得不匹配?

上面没有提到的是一段时间内的标准差排名。温度波动是否超过正常值?特别是在发电机中,这些频繁的波动会导致材料因这些变化而膨胀和收缩,从而导致损坏。

深入挖掘

如前所述,这部分是关键。排名分析将为我们提供一些线索,表明有什么地方出了问题,从而引发更广泛的调查。

虽然这是一个简化的例子,但显然排名分析可以有一系列有用的应用。请在评论中告诉我你如何在你的行业中使用它们。

https://medium/@hollydalligan/membership

NLP 基准有多可靠?

原文:https://towardsdatascience/how-reliable-are-nlp-benchmarks-fb1a0a70e26a

WiC 数据集案例研究

作者司南 雷奥纳多

尼尔·托马斯在 Unsplash 上的照片

排行榜的争夺

如今,对数据集和构造越来越多的关注是研究模型学习何种行为的自然结果。这种关注导致研究人员建立基准平台,如 GLUE 及其继任者 SuperGLUE [1]基准,旨在成为语言理解任务的优秀评估平台。尽管许多研究人员开展研究,为这些基准的排行榜提供主要工作,但很少有人关注开箱即用和问题的关键边缘,评估数据集的充分性。上下文中的单词(WiC)数据集[2]是 SuperGLUE 基准中的数据集之一,它通常用于评估 NLP 系统的词义消歧[3]能力。这篇文章将评估这样一个数据集的质量及其在评估 NLP 性能中的用途。

WiC 数据集

WiC 数据集包括由两个句子对组成的例子,这两个句子对共享一个多义(多种意义)单词的出现,该单词被称为中枢单词。词义消歧是 NLP 模型的一项高级任务,研究人员为这项任务做了大量的工作,制作了一个二元分类数据集。二元分类任务是一个问题,其目标是识别在两个句子中两次出现的中心词是否具有相同的含义:

表 WiC 数据集片段[ 作者图片 ]

这些例子是使用三种广泛的词汇资源半自动构建的:WordNet、VerbNet 和 Wiktionary。作者在构建 WiC 数据集时遵循的程序已在[2]中描述。我们按照同样的过程自行重建 WiC 数据集;因此,我们能够以 93.4%的准确度检索测试集的目标标签。逆向工程背后的动机不是为了作弊,而是为了更深入地分析测试集(即 Welch t-Test,分析单个目标标签的性能等。),我们需要知道测试集上的目标标签。此外,通过仅设置两个启发式规则成功地再现数据集表明,WiC 严重依赖于资源,并且几乎完全是自动构造的任务。它应该是基于知识的,并允许语言模型产生它们的下降粒度函数来区分词义。

数据集被组织成三个部分(训练集、验证集和测试集),并且仅针对训练集和验证集提供监督。原始论文中报告了三个数据集的大小:

表 WiC 数据集分割的统计[ 作者的图片]

在分析 WiC 数据集后,可以概括出三个值得注意的问题。

1。独特枢纽词的不同分布

第一个问题涉及训练集、验证集和测试集中的唯一关键词的分布的显著差异。特别是,训练集遵循长尾分布,而验证集和测试集是均匀分布的,如图 1 所示:

图 1:不同数据集部分的样本分布[ 作者图片 ]

尽管研究人员打算鼓励模型学习通用函数并避免在训练集上过度拟合,但数据分割之间的这种不平衡分布将使一些中枢产生偏差,并阻止模型学习正确的粒度函数来预测正确的类。

2。不平衡标签

第二个问题是关于中心词的不平衡标注。尽管所有三个数据集拆分都经过精心设计,具有平衡的目标标签,但对于单个 pivot 单词的目标标签来说,情况并非如此。在图 2 和图 3 中,我们报告了数据集中出现的两个只有真或假标签的枢纽词示例:

图 2:中心词“academy”的不平衡目标标记示例[ 作者的图像 ]

图 3:枢纽词“furniture”的不平衡目标标注示例【作者图片】

训练集的显著百分比(12.93%,包括不止一次出现)显示了这个问题。这可能会导致学习中的偏差,并导致模型过度适应特定的中枢。由于大型神经语言模型已被证明是非常有效的样本,因此在训练和测试集的重要部分上存在过度拟合的高风险。此外,当用具有这样缺陷的数据集训练时,该模型无法学习感觉的粒度。对于这些枢轴样本,可以认为模型预测是任意的。

3。词典标注

第三个问题是,一些句子对是根据它们的词典角色而不是意义或词义来标记的。这种效应可能依赖于词源,Wiktionary,它将动词分为及物动词和不及物动词。最后一个缺陷可能会误导模型,因为它完全违背了任务的目标。当检查图 4 中的样本时,甚至人类也会感到困惑。

图 4:作者根据词典角色图像标注的一个例子

好,我们来评价一下质量…

我们执行了 5 个不同的实验集,旨在深入评估基准的质量。我们在所有实验中使用了 3 种不同的机器学习方法:SVM、MLP 和余弦相似度。此外,我们使用各种数据扩充技术来理解 WiC 数据集构建约束及其对学习的可能影响,获得了 13 个额外的训练集。执行扩充步骤是为了测量(1)分布转移和(2)不同场景中的枢轴重叠的影响。

首先,我们使用 SVM 模型执行网格搜索,从 14 个可用数据集(包括原始数据集)中识别并选择性能最佳的数据集。随后,选择的数据集被用于执行与 MLP 模型的实验。相比之下,第三种方法基于余弦相似性,并且不包括任何训练步骤。在这种方法中,使用 BERT [4]构建每对中两个句子的向量表示。余弦相似性分数被评估,并且使用阈值导出输出。在最初的文章之后,我们进行了同样的 3 组子实验。此外,由于我们对调查训练/验证和测试集之间的分布差异的影响感兴趣,我们执行了 Welch t-Test。

由于我们没有一个完整的实验数据集,我们使用训练集设计了 K-Fold 验证程序。特别地,我们将训练集分成 5 个折叠,使用 4 个折叠用于训练目的,并丢弃剩余的 1 个折叠。评估在原始验证集上进行。我们将该实验的显著性水平设置为“事实标准”值的 5%,这是文献中大多数实验中常用的。该值意味着,如果 P 值结果小于显著性水平,则可以认为两个群体之间的差距具有统计显著性。

Welch t 检验结果报告在表 3 中:

表 3。韦尔奇 t 检验结果[ 图片作者 ]

实验中使用的群体数据如图 5 所示:

图 5。Welch t-Test 对训练、验证和测试数据集进行 K 倍验证[ 图片作者 ]

Welch t-检验结果清楚地显示了可能与 WiC 数据集的构造缺陷和上述数据的不同分布有关的显著差异。在 Welch t 测试结果之后,我们分析了目标类(真和假)的准确性。令人惊讶的是,在其中一个目标标签中,所有模型的表现都更好。虽然余弦相似性在真实标签上被极化,但是其他两个模型(SVM 和 MLP)在错误类别上报告了更好的性能。

另一个非常重要的结果来自对错误预测的详细分析。这种暗示来自于这样一个事实,即有几个模型锁定了某些精度值。因此,分析这些错误,我们发现 638 个样本中的 81 个,或 12.7%,被所有模型错误预测。因此,我们决定运行一个涉及一些人类主管的最终实验,因为强力胶基准声明“任务应该超出当前最先进系统的范围,但可以由大多数受过大学教育的英语使用者解决。”[3].

特别是,我们提取了这 81 个没有目标标签的常见错误预测(61 个正确,20 个错误),我们要求一小组人类主管提供标签。分析它们,我们注意到 50 个错误分类的中枢词在训练数据集上不存在,并且剩余的 31 个错误分类的中枢中的 24 个遭受不平衡的目标标签效应。此外,错误预测样本的标签分布(61 个真和 20 个假)证明了我们关于不平衡分布和低质量监督的假设。

人类专家测试表明,高级母语者在这些错误预测的数据子样本上报告了 52.93%的准确度值。这些实验表明,构造缺陷影响 WiC 数据集,使其成为 NLP 模型和人类专家无法完成的任务。

结论

WIC 数据集是超级胶水基准中包含的数据集之一。它被设计用来测量 NLP 的一个基本问题,即词义消歧任务(WSD)。具体而言,它提出了一种创新的方法来完成 WSD 任务,即将其转移到二元分类任务(对/错)中,目标是识别一个中枢词在两个观察到的句子中是否具有相同的含义。虽然将 WSD 任务转换成二进制分类问题可以被认为是一种非常创新的解决方案,但是所产生的数据集显示出低水平的质量,特别是在表达词义的粒度方面提供的知识水平不足。

训练集和验证测试集之间的分布差异限制了分类模型的预期性能。因此,最常用的分类模型(SVM、余弦相似度和 MLP)表现出不超过 68%准确度的低性能。此外,韦尔奇 t 检验结果表明,如果误差不超过 5%,排行榜结果就不能被认为是显著的。

最后,额外的调查表明,12.7%的验证集样本不能被任何模型正确预测,因为:

  • 在常见的错误预测中,61.72%的关键词不存在于训练数据集上,模型没有任何数据样本可供学习。
  • 对于剩余的 38.28%可学习的中枢词,77.42%的中枢遭受不平衡的目标标签。

建议

首先,如果您想在 WiC 数据集上评估您的模型,请仔细考虑😊。然后,调整 WiC 数据集以修复其中出现的许多构造缺陷:

  • 定型集应该遵循与验证集和测试集相同的分布。
  • 除了整个数据集级别上的平衡目标标签之外,每个中枢词也应该具有平衡的目标标签。

此外,我们认为应该扩展人类监督测试。事实上:

  • 在 WiC 论文中,人类基线建立在以下基本思想之上:“我们从测试集中随机抽取了四组 100 个实例,其中两个注释者之间有 50 个实例重叠。”[2].然而,像为一项任务设定一个黄金标准这样的强有力的结果可能不会用这种初步评估来表述。
  • 除了测试集检查之外,训练集和评估集应该由人类主管检查。词义消歧问题(WSD)即使对人类来说也是一项复杂的任务,并且 WSD 数据集,尤其是如果从词典编纂来源自动生成的话,应该非常小心地处理评估过程。
  • 如果可能的话,整个训练、评估和测试集应该由人类专家进行检查(而不是随机选择 100 个样本),因为许多研究人员依赖这个基准而不质疑质量,并且他们使用它来评估他们昂贵的机器学习模型的性能。如果我们仔细观察强力胶基准测试的排行榜,我们可以看到一些昂贵的型号的行为几乎就像抛硬币一样。

参考书目

  1. Wang,a .,Pruksachatkun,y .,Nangia,n .,Singh,a .,Michael,j .,Hill,f .,Bowman,S. R. (2019)。强力胶:通用语言理解系统的一个更棘手的基准。doi:10.48550/ARXIV.1905.00537
  2. 皮列瓦尔,麻省理工学院,卡马乔-科拉多斯,J. (2019)。WiC:用于评估上下文相关意义表达的上下文相关单词数据集。
  3. 洛雷罗 d .豪尔赫 A. (2019)。语言建模是有意义的:通过 WordNet 传播表示以实现全覆盖的词义消歧。计算语言学协会第 57 届年会会议录。https://doi/10.18653/v1/p19-1569
  4. Devlin,j .,Chang,m .,Lee,k .,Toutanova,K. (2018 年)。BERT:用于语言理解的深度双向转换器的预训练。

科学贡献如何变成一个有毒的环境

原文:https://towardsdatascience/how-science-contribution-has-become-a-toxic-environment-6beb382cebcd

意见

计算机科学是如何继承了其他学科同样的错误的

图片由作者用OpenAIDALL-E 生成

同行评议是学术研究的核心,如果你想在任何科学期刊上发表论文,无论是医学、物理学还是生物学期刊,这都是必不可少的一步。尽管在计算机科学领域,引领潮流的不是期刊,而是会议,选择将被选中并发表的幸运论文,他们也使用同行评议。同样,事实上,项目委员会也进行同行评审。

结果是,机器学习/人工智能领域的研究包含了与其他学科相同的问题,创造了一个不是基于期刊编辑,而是基于会议委员会的权力系统。

什么是同行评议?这是为了什么?为什么有人认为它是有毒文化的基础?如何改进?这对计算机科学界有什么影响?本文试图回答这些问题

看到所有瑕疵的眼睛

由作者使用 OpenAI 和 DALL-E 生成的图像

什么是同行评议?给出一个明确的答案是困难的。多年来,它似乎已经成为一种必要的礼仪形式,以安抚对一篇科学文章的命运负有责任的神秘实体。

因此,同行评议就像诗歌、爱情或正义。但这与资助申请或第三方审查的论文有关”——理查德·史密斯

没有人能够独立评估自己的工作质量;研究人员通常无法在自己的研究中发现错误和缺陷。同行评审的最初想法是,外部研究人员(同行)应该在发表前评估一篇科学文章的质量,并提供如何改进稿件的建议。

在最经典的同行评议形式中,科学期刊的编辑收到一份手稿,然后选择两位该领域的专家阅读并提供意见。通常情况下,编辑在阅读稿件后会选择该领域的两名相关专家,他们会提供匿名意见(针对稿件作者)。在审查结束时,作者会收到期刊的决定和/或在某些情况下收到一系列评论,如果他们想发表自己的作品,就必须对这些评论做出回应。

这个系统后来不断发展,现在每个期刊都使用自己的版本。有些期刊先把手稿寄给一位顾问;其他人选择至少三或四个评审者。在其他情况下,即使是审稿人也不知道是谁写的稿子(双盲)。

这种模仿——与我见过的系统相差不远——比扔硬币好不了多少,因为在论文是否应该发表的问题上,审稿人之间的一致程度比你可能会偶然想到的好不了多少— 理查德·史密斯

俱乐部成员的价值

图片由作者用OpenAIDALL-E 生成

如今,同行评议被用于各种领域,无论是发表文章还是分配资金。各机构召集专家进行同行评审,并决定哪些项目应该获得资助。

另一方面,专家评审的文章或项目会增加价值。毕竟,在同行评审期间,作者会经历一个严格的过程,如果有错误或弱点,评审者会要求他们改正。如果作者不改正他们手稿中的弱点,只有一种命运:退稿。

最负盛名的期刊和会议以拥有有史以来最高的退稿率而自豪(《自然》杂志每周收到的 200 篇论文中,只有不到 8%被接受)。此外,科学家希望在这些期刊上发表文章,因为他们的研究更有声望(或者至少更大的感知价值)与他们相关。

此外,一篇发表在期刊上或被著名会议接受的文章,平均来说,会被更多的引用,得到更多的宣传,被更多的读者阅读。所有这些都转化为职业发展,赢得声望很高的奖项等等。

但真的是这样吗?这些有声望的报纸的文章被拒绝或被遗弃在门外是没有价值的吗?

“我们是由我们的朋友来评判的。

我们错了,先生。犹大保持优秀的公司。——出自电影《T4》调侃 (1996)

计算机科学怎么还有人类审稿人

由作者使用 OpenAI 和 DALL-E 生成的图像

即使是关于最复杂的人工智能的文章,仍然要经过人类审稿人的手。在计算机科学中,手稿的路径是以预印本的形式发布在 arXiv 上,然后提交给会议,根据 arXiv 上和会议手稿中的审稿人的指示进行修改,如果被接受,还会添加一个会议链接。一篇文章的价值取决于会议的价值,而会议的接受率越低,会议的声望就越高。

与科学文章一样,同行评议在计算机科学领域也是盲目的。会议通常使用单盲审查,作者不知道审查者的姓名。为了减少偏见,更有声望的会议已经实施了双盲评审,评审者不知道作者是谁。理论上,这可以防止同行评议偏向或偏向作者。

最重要的会议包括元审查者,以确保过程在科学上是严格的。元审稿人是该领域的专家,当审稿人没有就手稿的命运达成一致意见时,他应该做出最终决定。

谁看守望者?

图片由作者用OpenAIDALL-E 生成

“同行评审的实践是基于对其效果的信任,而不是基于事实”。— 来源

同行评议严重影响了研究人员的生活。“发表或灭亡”是学术界的常用表达。事实上,科学家是由他们的出版物质量来评估的。然而,评估通常不在于评估他们的研究的相关性,而在于评估他们的出版物的影响因子(重要性)。由于同行评议是选择哪些手稿可以发表的关键步骤,你可能想知道这一过程是否运作良好和/或其缺陷是什么。

“对同行评议的一个主要批评是,几乎没有证据表明这一过程实际上是有效的,它实际上是对高质量科学工作的有效筛选,它实际上提高了科学文献的质量”——来源

对同行评议过程的第一个反对意见是,我们没有精确的标准来定义一篇文章或一个好的研究提案的质量。是什么让一篇文章有价值?或者说,是什么让一个研究提案能够带来有趣的发现?从某种意义上说,重要的研究是事后发现的(衍生应用、被引用的次数等等)。

2008 年的一项研究表明,通过向几家期刊提交一篇有八处故意错误的文章,在 420 名审稿人当中,不到一半的审稿人只发现了两处错误。事实上,任何经历过同行评审的人都会有这样的印象,即许多决定都是武断的;评论者的评论特别严厉,只是因为他们受到匿名保护,而不是以良好科学的名义。

此外,专家人数有限,随着提交率的增加,我们没有足够的合格人员来进行审核。另一方面,同行评审没有报酬;它是研究人员提供的免费服务,没有任何报酬。多年来,学术界工作人员的工作量增加了,因此许多研究人员拒绝了出版商的请求。这导致手稿作者收到的评论质量很差,或者在发表前不得不等待很长时间。

截图是作者在 PubMed 上用简单的关键词研究拍摄的。如图所示,关于一切的出版物呈指数增长。

同行评议的另一个严重问题是它并非没有偏见。事实上,几项研究表明,授予奖学金对少数民族和妇女不利。此外,知名作者更有可能被知名期刊接受,无论他们的工作质量如何,从而使不平等的循环永久化,知名作者可以获得奖励和资助,而其他人分享其中的碎屑。

新科学,旧罪恶

图片由作者用OpenAIDALL-E 生成

最近,爱德华·李教授发表了一篇博客文章,批评同行评议是有毒文化出现的原因。他注意到,一方面,会议项目委员会如何保持一定的接受率,许多论文被拒绝而没有真正的原因,或者他们用“缺乏新颖性”来证明拒绝的合理性。

“我们中有太多的人使用自托马斯·库恩以来就过时的科学概念,认为一门学科的进步是新事实的积累”——爱德华·李

这种对新奇事物断断续续的追求正是源于这种过时的科学观。除了成为许多研究人员的障碍之外,它还不允许他们发表对未来工作至关重要的工作(不同的方法,相同的想法在其他领域的应用)。毕竟,没有任何作品是完全原创的,而是基于前人的见解。

此外,作为一个评论家带来了相当大的优势。在计算机科学中,有机会在文章发表前阅读文章会导致不公平的优势。匿名审稿人往往与作者有利益冲突,他们的文章也同样提交给会议。结果是他们有更多的动机拒绝竞争对手的文章。

2017 年,莫斯科的高等经济学院为一座“匿名同行评审者纪念碑”揭幕。

Lee 建议质量差的文章设法发表(因为经过一些修改后,它们会被提交给每一次会议,直到被接受)。另一方面,许多博士生和其他学生反而对这种拒绝文化感到沮丧,以至于离开学术界。

此外,即使有截止日期,大多数文章都是在最后 24 小时内(甚至是截止日期之后)提交的,这导致了所谓的“紧急审查”有限的阅读时间和压力导致对每篇文章的关注减少(一些研究人员有时不得不阅读 1000 多篇论文)。因此,在类似的情况下,评论看起来更像是随机选择。

图片由卡莱斯·拉巴达在 unsplash 拍摄

事实上,主要会议收到过多的文章和接受率甚至逐年下降,截至 2022 年:

  • AAAI: 9000 份申请,15 %的接受率
  • ICML: 5630 份手稿,21 %的接受率
  • NeurIPS: 9122 份手稿,25 %的接受率

在这些前提下,如果审稿人将阅读所有这些手稿或只限于阅读标题和摘要,这是有争议的。如果是这样的话,这就不允许评估手稿的价值或将其标记为“缺乏新颖性”因此,如此数量的文章,很难相信如此大量的被拒绝的手稿是不值得的。

来自河两岸的回忆

图片来自马丁·桑切斯来自 unsplash

任何攻读博士学位的人都必须在某个时候提交至少一篇文章。通常情况下,要求发表至少一篇文章(如果不是更多)才能为自己的博士论文辩护。

每个会议或科学期刊都有具体的手稿格式指南。虽然其中一些是有争议的,并不总是清楚的,但他们必须不假思索地遵循。

浏览不同的提交指南本身就是一个挑战。

第一步显然是为了避免案头拒绝(当编辑决定由于“缺乏新颖性”或缺乏相关性的手稿将不会被转发给审稿人)。回复是一封没有人情味的电子邮件,实际上和每一份被拒绝的稿件都一样。典型的感觉是,手稿实际上并没有被阅读,而是被某个随机过程丢弃了。

仁慈的审稿人建议接受提交的手稿。图片由来自 unsplash 的 Jan Antonin Kolar 拍摄

惊心动魄的等待过后,点评往往令人失望。事实上,许多评论与手稿无关。此外,评论的语气相当咄咄逼人,仿佛目的是攻击提交的作品。此外,评论者经常试图通过建议他们引用自己的文章来增加他们的统计数据,即使这些文章与主题无关。

“作者应该引用 XXXX 的开创性工作,该工作在(另一个完全不同的领域)的背景下使用了类似的模型”——我收到的一位真正的评论家评论的释义

近年来,能够在学术界获得稳定的工作职位已经变得非常具有竞争力。能否获得一个职位通常取决于出版物的数量或质量。这导致了掠夺性期刊和会议的泛滥。事实上,近年来,向付费期刊或会议提交稿件的邀请越来越多,这些期刊或会议保证以出版换取报酬。

每次发表文章或参加会议后,我的邮箱都会被掠夺性期刊和会议的邮件淹没。这些通常是不知名的会议,声称有声望的研究人员(来自不知名的机构和公司)出席,并且似乎与你感兴趣的领域只有模糊的关联。

“NLP 似乎不是你们(公司)的重中之重,因为在离截止日期 3 天的时候,没有人注册参加(虚假的 NLP 会议)”—摘自掠夺性会议销售代表的真实电子邮件,我忽略了之前的所有电子邮件。

虽然这些会议显然没有价值,但许多绝望的研究人员经常参加,希望他们可以提升自己的简历。

掠夺性会议试图抓住另一个作者。图片来源:卡米尔·苏莫塔尔斯基来自 unsplash

另一方面,做一个评论者也不容易。随着越来越少的人可以进行同行评审,你经常会被联系(即使是不完全属于你领域的文章)。虽然审稿人不得不阅读充满方法错误的文章,但通常高质量的手稿会被其他审稿人拒绝。在这些情况下,不清楚编辑如何决定继续(拒绝或接受)。

这些期刊提供了一种格式,在这种格式中,它们实际上推动追求新奇,并使用多种选择(1 个优秀,5 个差)综合一个人的评论,几乎就像是对猫途鹰的评论。这给人的印象是,编辑更感兴趣的是新颖的文章,而不是调查结果的整体质量。

甚至阿尔伯特·爱因斯坦也有一篇手稿被《物理评论》拒绝因此,我们不应该认为拒绝等同于质量差

此外,当您需要成为审核者时,您必须在很短的时间内完成审核。虽然会议和期刊对手稿有严格的文字限制,但作者将大部分结果放在附录中(有时肯定会滥用它),阅读起来很累。就我个人而言,我发现所有对附录的不断引用令人讨厌,这使得阅读一篇文章相当痛苦。

如何自救科学

图片来自廷杰伤害律师事务所来自 unsplash

一篇有趣的文章表明,很难量化同行评审的有益效果。通过分析计算机科学领域的 9000 篇评论和 2800 篇投稿,作者注意到同行评议过程的排名和引用数量的影响之间没有相关性。事实上,从长远来看,被会议拒绝的论文对计算机科学产生深远影响的例子数不胜数:

  • PageRank 的手稿在 1998 年被 SIGIR 拒绝。
  • word2vec 手稿收到大会弱拒绝和强拒绝。
  • 介绍辍学的文章在 2012 年被 NIPS 拒绝。
  • 还有, YOLO ,卡尔曼滤波器,变压器 XL ,罗伯塔手稿被一个会议拒绝。

一些改善同行评审的尝试正在进行中。正如经常被批评的那样,评论者滥用盲评来评判带有特别敌意的文章。一方面,有一些实验,审稿人的名字在稿件决定后被公布。在其他情况下,作者的评论和回复会被发布。

像《自然》这样的期刊在投稿前给编辑提供了询问的机会。会议可以设立一个服务台,在截止日期前提交摘要或征求建议。这将有助于作者在提交前改进手稿。

此外,收到数千份提交材料的会议应该增加审查人员的数量,以确保更高质量的审查。此外,向审稿人支付服务费可以确保质量。事实上,通常被选中的评审者会要求他们自己的研究团队成员帮助他们或进行评审(这对博士生来说是一个额外的负担)。或者至少在职业发展或申请资金时,应该考虑作为评审者的服务。

另一方面,编辑和元审稿人的权力几乎是绝对的,因此应该保持平衡,特别是在审稿人在决策上存在分歧的情况下。目前,虽然这些尝试令人鼓舞,但还不够,应该深入讨论这一制度。

提交你的手稿。来自 unsplash 的 Abolfazl Ranjbar 的图像

还有,在 ArXiv 上提交的文章,对于一个研究者的职业生涯应该更有价值。同行评审可以在 ArXiv 上进行,而不需要截止日期,使评审者有足够的时间和压力(也许通过授予作者答辩权)。甚至将注册和验证用户的评论作为一种公开的同行评审。因此,我们可以尝试从以编辑为中心的模式转向以社区为中心的模式。

离别的思念

美国国立卫生研究院的一名评审员正在评估一项拨款提案。图片来源:此处

每天都有越来越多的文章被提交,其中许多文章几乎没有相关性,有明显的错误,甚至有科学不端的例子。因此,我们需要能够区分哪些文章是相关的,哪些是不相关的。多年来,解决方案一直是同行评议,我们盲目相信期刊和会议的权威,但现在是时候对该系统进行批判性分析了。

然而,通过当今科学支柱的同行评议并非没有问题。结果是许多文章仅仅因为一个武断的决定而被拒绝。评论者的评论常常是傲慢的,甚至不完全恰当。毕竟,匿名保证了一个没有责任的权力位置。同行评议最终导致一个昂贵的过程,延长出版时间,并不能保证成功。

甚至计算机科学和新学科也不能幸免于历史上影响其他学科的问题。当越来越多的论文产生,研究人员的职业生涯严重依赖于出版物时,我们应该重新思考科学的一个不可触及的支柱,同行评议。

我相信任何提交文章的人都遇到过挫折,如果你愿意在评论中分享你的故事,我很高兴听到。

如果你觉得有趣:

你可以寻找我的其他文章,你也可以 订阅 在我发表文章时得到通知,你也可以在**LinkedIn**上连接或联系我。感谢您的支持!

这是我的 GitHub 知识库的链接,我计划在这里收集代码和许多与机器学习、人工智能等相关的资源。

**https://github/SalvatoreRa/tutorial

或者随意查看我在 Medium 上的其他文章:

附加资源

  • 关于枪枪,这里查这里和这里
  • 关于“匿名审稿人纪念碑”,请点击这里,这里,这里和这里
  • 博士生与学术倦怠:此处,此处,此处
  • 计算机系博士生苦苦挣扎:此处,此处
  • 更多关于被会议拒绝的开创性论文:这里
  • 关于如何重新思考计算机科学同行评议的文章:此处
  • 关于掠夺性会议:这里、这里、这里、这里**

SciPy 和 Scikit-learn 如何优化模型的响应

原文:https://towardsdatascience/how-scipy-and-scikit-learn-can-optimize-your-models-response-12cf7f0ba3e9

看看一些方便的优化功能,从预测切换到处方!

拥有一个复制基本事实的健壮模型是很好的,但是能够找到将最小化或最大化其响应的特性值可能会更好。理解为什么用巧克力饼干🍪!

本·斯坦在 Unsplash 上拍照

语境

想象一下,你刚刚被一家巧克力饼干厂雇佣了!
很棒的工作,不是吗?

作为一名数据科学家,你的老板要求你在流程的第一步工作,这时所有的配料(面粉、黄油、糖等)都已经准备好了。)混合在一起,因为操作人员面临的主要问题是,他们有时会在面团中结块……这会危及饼干的质量!😱

好消息是他们已经能够测量:

  • 配料的主要特性(如面粉的含水量,黄油的柔软度),
  • 混合器的设置(其速度、温度等。),
  • 面团中的结块率,从 0 到 10% (5%是临界阈值)

数据是干净的,结构良好(不用提醒你,这是虚构的😂)而且不用花太多时间,你就可以创建一个模型,可以满怀信心地预测面团中块状物的百分比。

为了展示您的模型有多健壮,您将所有人聚集在搅拌机周围,向模型输入当前批次的属性,并宣布面团将具有(灾难性的!)7%的包干率。

当混合操作结束时,每个人都可以看到你的模型是正确的…但是,最终,面团必须被扔掉…

你的老板看着你说:

"有些参数我们可以控制(搅拌器的速度、我加的水量),有些参数我们无法控制(面粉的湿度、房间的确切温度等)。).

请使用您的模型告诉我们,对于每一批,如何微调生产参数以最大限度地降低废品率。

这是一个严峻的事实:你的随机森林模型表现良好,但是,作为 100 个决策树的组合,它是完全非线性的…这使得你不可能找到一个最佳值,因为你可以用一个简单的线性方程解决…

好消息是 SciPy 确实提供了一些方便的优化功能来帮助您;让我们来发现如何!

建模

为了举例,我们将使用一个“过于简单”的模型,但是对于更复杂的问题,原理是一样的。

假设面团块率(Y)受两个主要参数的影响,存储在“X”NumPy 数组中:

nb_samples = 15np.random.seed(22)
X = np.random.randint(1, high=10, size=(nb_samples, 2))print(X)y = X[:, 0] / X[:, 1]
print(y)

输出:

[[6 5]
 [1 5]
 [7 7]
 [5 9]
 [5 3]
 [9 8]
 [3 9]
 [9 6]
 [5 3]
 [3 2]
 [7 4]
 [4 3]
 [8 8]
 [8 8]
 [5 5]][1.2        0.2        1\.         0.55555556 1.66666667 1.125  0.33333333 1.5        1.66666667 1.5        1.75       1.33333333  1\.         1\.         1\.        ]

注意:完整笔记本的链接在文章的最后提供📑

因为我们有一个“适当的”(但很简单的)数据集,所以让我们用一个简单的 Scikit-Learndecision tree regressor创建一个非线性模型:

model = DecisionTreeRegressor(max_depth=4)
model.fit(X, y)
model.score(X, y)#0.9343996768065437

画出它的样子:

plt.figure(figsize=(15, 15))
tree.plot_tree(model)
plt.show()

决策树表示法—作者图片

我们可以观察到,根据 X[0]和 X[1]的值,该决策树有 8 种可能的输出。

SciPy 优化库

SciPy Optimize 库提供了一组函数来最小化(或最大化)目标函数。唯一的预防措施是您应该选择与您的用例相对应的一个:

  • 使用“最小化” = >的局部(多变量)优化在您有标量/线性函数要求解时非常有用,该函数假定有一个最优值,如下面的凸函数(x +y):

f(x,y)= x+y-作者图片

  • “双重退火”全局优化 = >当你有一个非线性函数,意味着随机搜索最优解时,这是很有用的。这是我们在使用集合树(Random Forest,XGBoost 等)等模型时遇到的典型情况。).

决策树示例-作者图片

在开始最优搜索之前,我们需要创建一个目标函数,返回我们的非线性模型的结果:

def objective(v):
    return model.predict(np.array([v]))[0]

然后,只需设置每个特征的边界(X[0]和 X[1])并启动优化过程:

bounds = [[1, 10], [1, 10]]result = dual_annealing(objective, bounds, maxiter=100)print(f"Status: {result['message']}")
print(f"Total Evaluations: {result['nfev']}")
print(f"Minimum reached: {result['fun']}")
print(f"Solution vector: {result['x']}")

输出:

Status: ['Maximum number of iteration reached']
Total Evaluations: 410
Minimum reached: 0.2
Solution vector: [1.78224412 9.35220569]

通过将边界设置为等于原始要素的空间,该函数可以提出一对值来有效地最小化目标函数:

1 号优化结果—作者提供的图片

现在让我们用 X[1]上的约束来重现这个过程,次于 4:

bounds = [[1, 10], [1, 4]]result = dual_annealing(objective, bounds, maxiter=100)print(f"Status: {result['message']}")
print(f"Total Evaluations: {result['nfev']}")
print(f"Minimum reached: {result['fun']}")
print(f"Solution vector: {result['x']}")

输出:

Status: ['Maximum number of iteration reached']
Total Evaluations: 404
Minimum reached: 1.3333333333333333
Solution vector: [4.32296802 1.87272909]

优化结果 n 2 —作者提供的图片

该算法再次能够找到给定边界内的最小可能值(1.333)。

最大化或目标化

与其最小化函数,还不如尽量最大化或者达到一个特定的值。在这种情况下,你只需要修改目标函数。

  • 通过在结果前添加“-”来最大化 = >
  • 瞄准 = >通过在结果计算中包含目标

最大化示例:

def objective_max(v):
    return -model.predict(np.array([v]))[0]bounds = [[1, 10], [1, 10]]result = dual_annealing(objective_max, bounds, maxiter=100)print(f"Status: {result['message']}")
print(f"Total Evaluations: {result['nfev']}")
print(f"Maximum reached: {-result['fun']}")
print(f"Solution vector: {result['x']}")# Output
Status: ['Maximum number of iteration reached']
Total Evaluations: 410
Maximum reached: 1.75
Solution vector: [8.0829203 4.2638071]

优化结果 3 —作者提供的图片

从现在开始,再也没有理由让面团结块了,巧克力曲奇的质量是安全的🍪🍪🍪

相应的代码存储在这里:

https://github/pierrelouisbescond/medium_articles/blob/main/medium_optimize.ipynb

请不要犹豫,浏览我在 Medium 上的其他文章:

https://pl-bescond.medium/pierre-louis-besconds-articles-on-medium-f6632a6895ad

分析师应该如何打发时间?

原文:https://towardsdatascience/how-should-analysts-spend-their-time-e390872ceb70

如何多做重要的工作,少做不重要的工作

当我在谷歌开始建立机器学习模型时,我首先看到的是下图。它强调了编写实际的机器学习代码只是我要做的全部工作的一小部分。事实证明这是真的。

来源:机器学习系统中隐藏的技术债务

但是处理数据不仅仅是机器学习,那么对于数据分析师来说,这个图表是什么样的呢?

答案并不简单。有些时候,专注于构建仪表板和底层数据模型是有意义的,而有些时候,专注于分析和洞察更有意义。

考虑到这一点,这是我对分析师平均一周生活的评估。

作者图片

正如机器学习一样,有许多不同的任务与分析一样有价值。

然而,一个常见的话题是,数据人员花费超过 50%的时间被动工作,经常处理数据问题或试图查找或访问数据。这方面的例子有:

  • 一位利益相关者提到,仪表板中的 KPI 看起来与上周不同,您必须回答这是为什么
  • dbt 中的数据测试失败,您必须了解问题的根本原因是什么
  • 你想为一个新的客户群使用一个数据点,当你在 Looker 中搜索时,有五种不同的定义,但不清楚使用哪一种

不同地分配时间

以下是数据分析师如何分配时间的另一种选择

作者图片

那么,有什么不同呢?

更多的分析时间

分析师应该做…等等…分析。他们应该有在上班的路上获得灵感的自由,并在午餐时间得到答案。这种类型的工作通常需要长时间的专注,准备好合适的工具,并且接受花半天时间在可能没有结果的工作上是可以的。

我看到,当数据分析师与其他人(如用户研究)密切合作时,这一点做得特别好,他们可以快速制定假设,在知道并非所有测试都是全垒打的情况下,让 A/B 测试运行良好。

“花额外的时间来确保你在做正确的工作,而不是把工作做好,通常是最值得花的时间”

处理数据问题花费的时间更少

我接触过的数据团队每天要花 20%以上的时间处理数据问题,随着规模的扩大,这变得更加棘手。当您是一个小型数据团队时,您可以查看一些数据模型来找到根本原因。随着规模的扩大,您开始有几十个其他数据人员依赖您的数据模型,工程系统在您没有得到通知的情况下崩溃,您不知道会影响您的数据模型的代码更改。

减少查找要使用的数据的时间

随着数据团队规模的扩大,寻找正确数据的难度也呈指数级增长。当你是一个小团队时,你知道所有东西在哪里。随着您的规模越来越大,这变得越来越困难,并且您经常会遇到同一个指标有多个定义的问题。当你变得非常大的时候,在最坏的情况下,仅仅是访问正确的数据就要花费几个月的时间。

为了寻找最佳的时间分配

每个人的最佳分配是不同的,但我的猜测是你有改进的空间。最重要的第一步是仔细考虑如何度过你的时间。

“我建议每周花几分钟时间回顾过去的一周,记下你是如何度过时间的。如果你经常这样做,你会对自己是否合理利用时间有一个惊人的了解。”

寻找正确的数据

数据目录在理论上是伟大的,但是它们经常不能实现它们的潜力。相反,它们最终成为事后的想法,与破窗理论没有太大不同的事情开始发生。一旦人们停止维护数据目录中的几个数据点,你也可以把整个东西扔出窗外。幸运的是,事情正在朝着正确的方向发展,许多人正在思考如何让定义和元数据更贴近人们日常使用的工具。

减少处理数据问题所花费的时间

在过去的几年中,数据团队变得越来越大,并且正在创建更多的数据。当你是一个五人数据团队时,处理数据问题是很容易的。当有几十个数据人员都在创建不同的数据时,事情就不那么简单了。

作者图片

我们需要能够将当您是一个较小的数据团队时使生活变得简单的一些东西应用到较大的数据团队中。如何做到这一点的一些想法:

  • 每个数据资产都应该有一个所有者
  • 将数据资产封装到具有公共和私有访问端点的域中,因此并非所有人都可以访问所有数据
  • 与共享所有权的数据生产者形成闭环,以便尽可能在上游捕获问题
  • 让每个人都能够调试数据问题,这样他们就不必每次都上报给同样的几个“数据英雄”

“不要将每个数据问题都视为临时火灾,而是投资于基本的数据质量和控制,以降低数据问题再次发生的可能性”

如果您对如何改善您在数据团队中的工作有一些想法,请告诉我!

2022 年公司应该如何处理数据?

原文:https://towardsdatascience/how-should-companies-handle-data-in-2022-922595d9ea4c

随着工具、角色和数据架构的不断变化,有时很难跟上数据科学的最新行业方法。但我们是来帮忙的:本周,我们将重点介绍几篇出色的帖子,它们涉及技术、数据和商业交叉领域的广泛话题。(寻找其他主题的精彩读物?向下滚动。)我们开始吧:

  • 有效数据治理的想法还有意义吗?Louise de ley ritz和 Molly Vorwerck 最近的文章中发人深省的前提是,数据治理未能兑现其简化以数据为中心的工作流的承诺。但作者也认为,现在恢复和重塑这一概念还为时不晚,这样它才能与业务需求和现代数据堆栈相协调。
  • 权力大,责任大 。人工智能和算法驱动的决策的最新进展正在渗透到我们生活的方方面面。对于特拉维斯·格林(Travis Greene)来说,大量消耗数据的科技巨头的巨大社会和经济足迹必须伴随着更高的透明度和问责制——这是谷歌、Meta 和其他公司有很大发展空间的两个领域。
  • 混合数据组织的承诺 。在各种形状、大小和配置的数据团队中呆了 15 年后, Matthew Dawson-Paver 对什么可行,什么不可行有了很强的认识。他的图解概述解释了为什么将自治数据团队和业务或产品团队与嵌入式数据专家相结合的混合结构通常是最佳方法。
  • 企业如何找到合适的数据科学家? 在担心工具、框架和团队结构之前,有必要雇佣技能与公司目标和使命一致的数据科学家。为了做到这一点, Rose Day 建议少关注筛选过程的技术层面,多关注有助于确定共同兴趣和价值观的对话。

如果你想了解关于数据和商业的最新文章,请收藏我们来自行业专栏的笔记。

照片由 Serhat Beyazkaya 在 Unsplash 上拍摄

等等,还有呢!(但你知道。)我们最近也在其他领域发表了精彩的文章,我们不能分享其中任何一篇。这里有几个你绝对不想错过的:

  • Nura Kawa 引入了 class maps,这是一个新颖的可视化工具,它解释了分类算法的结果(包括 R 和 Python 中的例子!).
  • 在他的最新贡献 , 迈克尔·布朗斯坦展示了特征传播是如何在图形机器学习应用中处理缺失特征的一种高效、可扩展的方法。
  • 如果你想在本周得到一份实践指南,你一定不会错过 Rashida Nasrin Sucky 的卡方相关测试患者指南和。
  • 对于那些对理论感兴趣的人来说,古斯塔夫·希尔的深入研究关系机器学习的迷人世界绝对会成功。
  • 我们永远不会厌倦可以帮助实现更大利益的数据科学项目——比如喜马拉雅·比尔·施雷斯塔最近对学习曲线效应的探索,以及它如何推动可再生能源技术进入良性循环。

我们希望你度过了愉快的一周,充满了学习和新想法。感谢您一如既往地支持我们出版的作品。

直到下一个变量,

TDS 编辑

我们应该如何考虑数据血统?

原文:https://towardsdatascience/how-should-we-be-thinking-about-data-lineage-541ca5ab83d0

全面了解您的数据和分析生态系统

图片由 Rawpixel 提供,在 Envanto 支付

为什么数据血统现在如此热门?

数据血统是目前所有数据治理中谈论最多的话题之一,这是有充分理由的。

随着数据沿袭工具的发展,沿袭已经开始在释放数据的全部价值方面拥有越来越大的潜力。现在,人们对使用沿袭作为真正实现组织数据可操作化的途径,并使数据供应链具有弹性、健壮和可靠感到非常兴奋。

投资于采用数据驱动文化的组织高度重视沿袭,因为它使业务中各个级别的团队成员能够理解和信任数据管道,并有望更快地做出数据驱动的决策。它让您的团队充满信心,能够对不断变化的市场条件数据做出快速反应,并做出及时、准确的决策。而且,当出现问题时,它可以帮助数据生产者诊断这些问题,并快速恢复业务。

出于这些原因以及更多原因,数据谱系已经成为数据治理世界的最新必备工具,许多新的数据谱系工具,包括商业的和开源的,已经涌现出来。但是血统仍然很难完全理解,也很难实现。

数据血统到底是什么?

数据谱系是元数据更有趣、更有用的应用之一。它让数据用户更好地了解他们的数据,并清楚地了解他们的数据来自哪里;它要去哪里;以及它是如何改变的,由谁改变的,以及为什么改变。简而言之,它通过为您提供一个更完整、自上而下的数据和分析生态系统图,实现了更好的数据治理。

但是有不同类型的血统,每种类型服务于不同的目的,解决不同的问题。

  • 业务沿袭—业务沿袭提供了数据如何从其来源流向其消费地的概要视图。对于希望了解数据来源以及数据是否可信,但又不想迷失在细节中的分析师来说,这是一个重要的工具。
  • 技术谱系— 技术谱系则更详细,它允许数据工程师和更多的技术用户尽可能详细地查看基础设施和数据转换;查看表、列和查询级别沿袭。并跟踪数据在管道中的传输,让他们确认一切正常运行。

在您的业务概念、它们之间的关联方式以及它们的技术规范之间,存在着很大一部分难以捉摸的语义层。这一层决定了您的业务定义和您的技术谱系如何相互关联,它不像业务或技术谱系本身那样经常被讨论,但是它提供了关于哪些数据资产对您的组织真正重要的有价值的见解。它还为核心业务概念提供了关键的“事实来源”。连接这些层的能力使我们能够映射所有权和管理权的概念,完成图片并交叉您组织的社交图和数据图。

根据您需要了解的内容(无论是验证信任的关键业务数据来自何处,还是您的数据系统是否正常工作),这些不同类型的沿袭适合不同的需求。

数据沿袭如何帮助解决数据和业务问题

lineage 提供的洞察力使数据用户能够解决在大量互联数据中遇到的各种问题:

  1. 数据故障排除—如果您的组织依赖于一个关键的数据模型来做出实时决策,而该模型失败了,lineage 使您的团队能够跟踪数据流并确定错误的根本原因。
  2. 影响分析-如果您正在对数据源进行更改,lineage 允许您在数据流中向前看,以准确预测并准备好对模型的影响,并提醒下游数据使用者更改即将到来。
  3. 发现和信任——沿袭使数据科学家能够了解在哪里可以向模型添加必要的数据集,并确定这些数据集的所有者以推动流程。它还可以让数据科学家对其模型中数据的质量和来源放心。
  4. 数据隐私法规(GDPR 和 PII 映射)— Lineage 帮助您的数据隐私和合规团队确定 PII 在您数据中的位置。例如,在 GDPR 请求的情况下,lineage 可以确保您需要删除的所有数据都已删除,从而确保您的组织符合法规要求。
  5. 数据资产清理/技术迁移-在从一个系统或技术到另一个系统或技术的清理或迁移过程中,lineage 允许您识别和保留最重要的数据,以便将其移动到新设备。
  6. 数据评估—当您需要识别和分类对您的组织最关键的数据和分析时,lineage 允许您回顾数据供应链,并了解哪些源系统正在推动真正的业务价值和业务决策。

如何实现数据沿袭?

正如我在本系列的第一篇文章中所说的,数据沿袭是在数据从数据源流向消费者的过程中理解、记录和可视化数据的过程。这可能包括数据在传输过程中经历的所有转换—数据是如何转换的?什么变了?为什么呢?

太好了。但是你如何从技术上回答这些问题呢?实现沿袭有三个步骤:

  1. 收集新的世系相关元数据
  2. 将这些信息与您已经拥有的(或之前收集的)知识相结合
  3. 以对您的用例有用和适用的方式表示信息

收集血统

收集数据沿袭有几种不同的方法,每种方法都有其优点。根据您的用例以及您收集血统的系统,一种方法可能比另一种更适合您。

在这些不同的系统中,数据沿袭收集通过以下方式完成:

  • 该系统通过其应用编程接口(API)来公开沿袭。这种方法最常见于现代商业信息(BI)和数据可视化工具,如 Tableau 或 Looker。当提供这些工具的数据被编目时,从表到仪表板的数据流(沿袭)也被记录。
  • 该系统在运行时发出明确的沿袭信息,越来越多的公司在构建数据管道时采用这种方法。通常,这种基于推送的运行时沿袭方法在运行时被写出到文件或调用沿袭收集系统中的 API,并且它是极其健壮和准确的信息。一些转换系统,如 dbt,本身就能做到这一点。但是如果您正在创建自己的管道,那么自己发布这些信息是一个很好的实践。这可能需要对您的管道代码进行一些返工,但它非常可靠。你可以从 OpenLineage 的创建者 Julien LeDem 那里读到更多关于这个想法的内容。
  • 解析系统的转换代码以自动创建技术谱系是一种在系统没有明确发出关于数据谱系的结构化元数据时使用的方法,并且生成谱系视图的唯一方式是通过解析代码。这种对现有代码进行静态分析的方法可能很脆弱,无论是通过 CI/CD 还是其他方式,当需要重新扫描时,您都需要某种方式来触发或检测。
  • 手动沿袭条目——无论您使用什么系统来存储和维护沿袭,都应该绝对支持手动建模、扩充或修正从自动化系统收集的沿袭。虽然这听起来令人畏惧,而且肯定不性感,但是如果您的系统不支持扩充和覆盖血统,您将会走进死胡同。

当您考虑这些系统中的每一个时,您还需要决定是否要依赖您的数据先前建立的谱系(这可能容易收集,也可能不容易收集),或者在您编目数据时映射一个新的声明性谱系,实际上编写新的代码,说明“这个数据依赖于 X,那个依赖于 y。”

无论您决定什么,无论您的用例是什么,选择确保您的血统是可靠的、健壮的和值得信赖的系统是至关重要的。

用知识图表示和协调世系

不管你如何收集你的数据血统,有一件事是肯定的,那就是你必须能够以一种灵活的、支持简单进化的方式来存储和管理它。表现血统的最好方式之一是通过知识图;知识图是健壮的、可扩展的——如果您需要添加数据源的话——并且它们可以表示数据的多个层和视图——例如语义的或技术的——并且支持在这些视图之间导航。

现在有两种很好的方法来表示血统,一种是 OpenLineage 标准,另一种是语义标准 PROV-O (一种在 RDF 中描述出处的开放标准)。这两种表示都非常适合将出处信息合并到知识图或其他基于图的表示中。

但是为什么知识图在这里如此重要呢?首先,您会发现,当您从不同的系统收集血统信息时,这些信息可能是不完整的或矛盾的。通过推理和图表分析,知识图表可以以可靠的方式帮助整理矛盾的信息,并且还可以轻松地允许您添加额外的信息——无论是通过手动输入还是从另一个系统收集——而不会丢失您收集的任何原始信息。图表也可以很好地表现血统的演变以及它是如何随时间变化的。

利用血统

当然,拥有一个基于知识图的谱系表示法不仅仅是让解决矛盾和添加新信息变得容易——它也让谱系更容易付诸行动。显然,这使得创建基于图形的血统信息可视化变得容易,以便于探索,特别是当您在语义层和技术层之间移动时。

但是除此之外,它使得操作血统变得非常容易。使用基于图的查询和推理,当管道出现问题时,实现上游生产者和消费者的通知变得很容易;易于在数据集之间传播状态信息;易于进行根本原因问题分析和变更管道的影响分析;这样的例子不胜枚举。

凭借数据血统取胜

数据沿袭使您的组织能够全面了解您的数据,从数据的来源到数据的聚合方式,再到数据在传输过程中为了提供知识和意义而经历的任何转换!由于这种可见性,lineage 确保使用准确、完整和可信的数据来推动您的业务向前发展。

血统有很多。建立可靠的 it 观需要努力和深思熟虑。虽然没有灵丹妙药——当你建立一个数据驱动的文化时,许多东西必须聚集在一起——但如果你投入工作并把它做好,它将具有难以置信的价值。我希望这篇文章能够帮助您思考如何让 lineage 为您和您的团队工作。

群体学习如何工作——区块链和机器学习相结合以获得更好的解决方案

原文:https://towardsdatascience/how-swarm-learning-works-blockchain-and-machine-learning-combined-for-a-better-solution-20484d4f258c

群体学习简介

埃德加·恰帕罗在 Unsplash 上拍摄的照片

估计数字显示,一辆自动驾驶汽车每天可以产生万亿字节的数据。这些数据用于训练机器学习模型,以便汽车可以在道路上及时做出决策。

医院应用机器学习来更快地识别疾病。这些应用至关重要,尤其是对于高传染性疾病。患者不知道答案的时间越长,因此不能正确隔离自己,传染给他人的风险就越大。

它是如何工作的?在训练阶段,一个程序接收到数百万张带有标签的 x 光图像,例如,肺结核或肺炎。

最初,该程序随机预测疾病的类型,因为它在这个阶段没有学到任何东西。但是接下来,每次它猜出疾病,就和标签(肺结核还是肺炎?)并记录预测的错误程度。

该算法调整“标度”/参数/权重以最小化预测误差。优化器继续运行,直到它有把握地预测。

主要问题

我上面提到的机器学习系统面临着几个问题。

  • 违反数据保密性/数据隐私法规的风险。
  • 由于需要中央服务器来交换信息而导致速度缓慢和数据重复。

想象一下,医院 A 希望通过使用机器学习来更快地获得结核病(TB)的结果。但是医院没有太多以前病人的肺结核病例。它没有足够的标记数据来训练模型。

很好解决吧?去别的医院拿数据就行了。不幸的是,由于数据保密性的考虑,这是不可能的。这是不道德的。

自动驾驶汽车中的传感器和摄像头产生的万亿字节的数据怎么办?如果一辆车学会识别一辆自行车,它应该与所有其他节点共享该信息。但是考虑到数据量的海量,怎么做呢?

群体学习

群体学习是一种数据隐私保护框架,它使用区块链来分散基于机器学习的系统。数据或“知识”不会集中到一个中心位置,以允许医院或汽车之间的共享。

让我们来看看机器学习解决方案的四种构建方式,以便更好地理解。

本地学习

在本地学习环境中,例如,不同医院之间没有联系。所有的培训都在当地进行,并且停留在当地。一家医院不能与其他医院共享数据或知识,至少不能以自动化的方式。

一辆汽车学会识别一棵树,但不能与其他汽车分享。这是一个非常有限的结构。

局部/边缘学习。图片由作者提供。受研究文章中一篇的启发。

中央学习

数据和神经网络参数被发送到中央学习中的专用服务器。所有节点(医院或汽车等。)访问它,这样,信息就被共享了。

我认为这种设置甚至不如本地学习有用。随着数据的增加,考虑到数据隐私问题,这是不切实际的。至少在本地学习中,这两个问题是不存在的,训练完成的模型可以手动分享。

中枢学习。图片由作者提供。灵感来自于研究文章中的一篇。

联合学习

这种类型的部署是当今许多系统中使用的一种。这几乎和群体学习一样好。但是,仍然有一个中心位置。

系统在本地训练,原始数据留在本地的边缘。但是学习——神经网络刻度盘/参数/权重——被转移到一个中心位置。

这解决了隐私问题。模型“学习”只是一堆数字,并不透露病人或司机的信息。但是,中心位置仍然是一个薄弱环节。

联合学习。图片由作者提供。灵感来源于研究文章中的一篇。

群体学习

群体学习没有中心位置。就像在联合学习中一样,训练是在本地/边缘执行的。但是在 SL 的情况下,甚至学习也不能通过一个中央专用服务器共享。

这些实体使用区块链技术交流学习成果。

如研究论文所述,

新节点通过区块链智能合同注册,获得模型,并执行本地模型训练,直到满足定义的同步条件。接下来,在开始新一轮训练之前,通过群应用程序编程接口(API)交换模型参数,并将其合并以创建具有更新参数设置的更新模型。

群体学习。图片由作者提供。受研究文章中的一个启发。

最后的想法

群体学习(SL)是区块链和机器学习协同工作的一个令人兴奋的演示。这看起来是完美的解决方案。我提到了自动驾驶汽车,但研究的重点是疾病识别。数据保密至关重要。

群体学习背后的团队对三种疾病进行了测试。白血病、涡轮虫病和新冠肺炎。结果很有希望。值得看看研究文章。

群体学习这个名字的灵感来自于动物的集体行为,它们聚集在一起实现共同的目标。蜜蜂需要寻找新家时会蜂拥而至。你可能见过鸟类以一种美丽而同步的方式形成。

每个动物(节点)只有一个微小的信息,通过联合和交流,他们可以实现伟大的事情。这就是 SL 的意义所在。

暂时就这样了。感谢阅读。

参考

[1] 用于分散和保密临床机器学习的群学习

[2]https://github/HewlettPackard/swarm-learning

【3】什么是群体学习?AI、区块链和物联网携手揭开实时智能

本文标签: 中文翻译博客TowardsDataScience一百九十四