TowardsDataScience-博客中文翻译-2022-五十六-

TowardsDataScience 博客中文翻译 2022(五十六)

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

什么是生存分析?手工示例和 R

原文:https://towardsdatascience.com/what-is-survival-analysis-examples-by-hand-and-in-r-3f0870c3203f

了解更多关于生存分析(也称为事件时间分析)及其使用方法,以及如何手动和在 R

伊恩·基夫的照片

介绍

F 还是今年的最后一个帖子,我想介绍一个比较不为人知(却很重要)的统计方法:生存分析

虽然生存分析是统计学的一个分支,但它通常不包含在统计学的介绍性课程中,而且对普通大众来说相当陌生。它主要是在生物统计学课程或高级统计研究项目中讲授。

在这篇文章中,我将解释什么是生存分析,以及如何和在什么环境中使用它。我将解释生物统计学家用来分析生存数据的主要工具和方法,以及如何估计和解释生存曲线。

我将通过具体的例子详细展示如何在 R 中应用这些技术。在实践中,生存分析几乎总是通过统计程序完成,而不是手工完成。然而,对于任何统计概念,我相信手工操作可以真正理解这些概念以及这些程序实际上是做什么的。出于这个原因,我还将展示一个简单的例子,说明如何手工执行基本的生存分析。

注意,这篇文章的灵感来自:

  • Van keile gom 教授的课堂笔记和我作为教学助理对她在 UCLouvain 讲授的题为“存活率和持续时间数据分析”的课程的个人笔记
  • 勒格朗教授在加州大学鲁汶分校讲授的“临床试验统计学”课程的课堂笔记

什么是生存分析?

生存分析(也称为事件时间分析或持续时间分析)是统计学的一个分支,旨在分析一个或多个事件发生之前的预期持续时间,称为生存时间或持续时间。

在生存分析中,我们对某个事件感兴趣,想分析事件发生前的时间

虽然感兴趣的事件通常是死亡(在这种情况下,我们研究患有特定疾病的患者的死亡时间)或复发(在这种情况下,我们研究某种疾病的复发时间),但它不限于医学和流行病学领域。

事实上,它可以用于许多领域。例如,我们也可以分析时间,直到…

  • 从某种疾病中痊愈
  • 失业一段时间后找到新工作
  • 出狱后再次被捕
  • 第一次怀孕
  • 机械系统或机器的故障
  • 银行或公司破产
  • 客户购买新产品或停止当前订购
  • 一封信送来了
  • 打电话给出租车公司后,出租车会来接你
  • 一名员工离开公司
  • 等等。

如你所见,感兴趣的事件不一定是死亡或疾病,但在所有情况下我们感兴趣的是特定事件发生的时间

为什么我们需要特殊的生存分析方法?

生存数据,也称为事件发生时间数据,需要一套特殊的统计方法,原因有三:

  1. 持续时间始终为正:直到感兴趣的事件发生的时间不能小于 0。

2。不同的测量取决于研究问题、背景等。例如,我们可能对以下内容感兴趣:

  • 癌症患者存活超过 5 年的概率?
  • 打电话给出租车公司后,出租车到达的典型等待时间?
  • 100 名失业者中,有多少人有望在两个月后重新找到工作?

3。审查几乎总是一个问题:

  • 大多数情况下,事件发生在研究结束之前,存活时间是已知的。
  • 然而,有时,在研究结束时还没有观察到该事件。假设我们研究乳腺癌患者的死亡时间。幸运的是,一些患者不会在研究结束前死亡。
  • 其他时候,另一个事件发生在感兴趣的事件之前。例如,癌症患者可能死于车祸。
  • 甚至有时患者退出研究或搬到另一个国家,因此我们无法观察她的存活时间(这被称为失访或退出)。
  • 在某种意义上,删失可以被看作是一种缺失数据。
  • 由于这些原因,很多“标准”描述性统计假设检验回归模型都不适合这类数据。需要特定的统计方法来考虑这样一个事实,即我们遗漏了一些患者的确切存活时间。我们知道他们存活了一定的时间(直到研究结束或直到停药),但我们不知道他们确切的存活时间。

供您参考,当在研究结束时尚未观察到该事件时(即存活持续时间大于观察到的持续时间),这被称为右删截。另一方面,如果参与者在研究开始前发生感兴趣的事件时进入研究,但我们不知道确切的时间,则会发生左删截。当然,我们希望分析所有可用的数据,包括关于被审查患者的信息。

因此,生存分析的目标是以适当的方式对事件时间数据进行建模和描述,同时考虑这类数据的特殊性。

生存分析中的常用函数

我们不打算深入细节,但重要的是用生存分析中最常见的函数打下基础。

T 为非负连续随机变量,代表感兴趣事件发生前的时间。我们考虑以下功能:

  1. 生存函数
  2. 累积风险函数
  3. 冒险函数

生存函数

最常见的是生存功能。对于每个 tt:

s(T)= P(T > T)= 1 F(T)

对于每个时间 tt,S(t)表示事件发生前的时间大于该时间 tt 的概率。换句话说,它模拟了感兴趣的事件在 tt 之后发生的概率。

在上面提到的例子中,它给出了这样的概率:

  • 随机选择的患者将存活超过 tt 时间,
  • 出租车到达时间超过 tt 分钟,或
  • 一个失业的人要花超过 tt 个月的时间才能找到一份新工作。

生存函数 S(t)是:

  • 递减函数,
  • 取[0,1]中的值(因为它是一个概率),并且
  • t=0 时等于 1,t=∞时等于 0。

视觉上我们有:

作者的情节

曲线显示了随着时间的推移,没有经历过某一事件的个体(或实验单位)的比例。随着时间的推移,事件会发生,因此没有经历过事件的比例会降低。

累积风险函数

累积危险函数定义为:

h(t)=-对数(t)

并且具有以下属性:

  • 增加功能,
  • 在[0,+∞]中取值,并且
  • s(t)= exp(H(t))

累积风险是到 tt 时间为止经历的总风险。

冒险函数

危险函数或危险率定义为:

并且具有以下属性:

  • 正函数(不一定增加或减少)
  • 风险函数 h(t)可以有许多不同的形状,因此是总结生存数据的有用工具

在癌症患者的例子中,h(t)测量在 tt 时间之后立即死亡的瞬时风险,假设个体在 tt 时间还活着。

将风险率与生存函数联系起来;生存曲线代表风险率。斜率越陡,表明风险率越高,因为事件发生得越频繁,未经历过事件的人的比例越低。相反,平缓的坡度表示较低的风险率,因为事件发生的频率较低,降低了未经历该事件的人的比例。

请注意,与侧重于不发生事件的生存函数相反,风险函数侧重于事件的发生。

估计

为了估计生存函数,我们需要使用一个能够处理截尾的估计量。最常见的是非参数卡普兰和迈耶( 1958 )估计量(有时也称为乘积限估计量,或更简单地说,K-M 估计量)。

卡普兰-迈耶估计量的优点是:

  • 使用和解释起来简单明了
  • 它是一个非参数估计量,所以它从数据中构造一条生存曲线,并且对基本分布的形状不做任何假设
  • 它给出了生存函数的图形表示,用于说明目的

请注意,估计成立的一个重要假设是,删失独立于事件的发生。我们说删截是非信息性的,即删截的受试者与未删截并继续被跟踪的受试者具有相同的生存前景。

用手

为了理解它是如何工作的,让我们首先在下面的数据集上手动估计一下: 1

##    subject time event
## 1        1    3     0
## 2        2    5     1
## 3        3    7     1
## 4        4    2     1
## 5        5   18     0
## 6        6   16     1
## 7        7    2     1
## 8        8    9     1
## 9        9   16     1
## 10      10    5     0

其中:

  • subject是个人的标识符
  • time是事件发生的时间(以年为单位) 2
  • event是事件状态(0 =审查,1 =事件发生)

请记住,对于每个主题,我们至少需要了解两条信息:

  1. 直到感兴趣事件的时间或直到审查的时间,以及
  2. 我们是否观察到了感兴趣的事件或者我们是否观察到了审查。

我们首先需要计算不同事件时间的数量。忽略删截观察,我们有 5 个不同的事件时间:

257916

手工计算的最简单方法是填写下表(一个有 5 行的表,因为有 5 个不同的事件时间):

我们逐个填充列:

  • y(j) =有序的不同事件时间:

257916

所以表格变成了:

  • d(j) =每个不同事件时间的观察次数。为此,每个不同事件时间的频率非常有用:
## time
##  2  5  7  9 16 
##  2  1  1  1  2

表格变成:

  • R(j) =处于危险中的剩余个体数量。对于这一点,时间的分布(审查和不审查)是有用的:
## time
##  2  3  5  7  9 16 18 
##  2  1  2  1  1  2  1

我们看到:

  • 一开始有 10 个科目
  • 就在时间 t=5 之前,剩下 7 名受试者(10 名受试者——2 名发生了事件——1 名被审查)
  • 就在时间 t=7 之前,还有 5 名受试者(= 10–2–1–2)
  • 就在时间 t=9 之前,还有 4 名受试者(= 10–2–1–2–1)
  • 就在时间 t=16 之前,还有 3 名受试者(= 10–2–1–2–1–1)

表格变成:

  • 1(d(j)/R(j))很简单,因此该表变为:

卡普兰-迈耶估计量为:

因此,对于每个 j,我们取累积积:

  • j1=0.8
  • j2=0.8⋅0.857=0.6856
  • j3=0.6856⋅0.8=0.54848
  • j4=0.54848⋅0.75=0.41136
  • j5=0.41136⋅0.333=0.1369829

最后,我们得到了生存概率(四舍五入到 3 位数):

我们现在可以用图形表示卡普兰-迈耶估计量:

作者的情节

要绘制这条生存曲线,请记住:

  • x 轴对应于初始数据集中的time变量,并且
  • y 轴对应于上面找到的生存概率。

在 R 中

现在我们将我们的结果与 r。

我们首先用时间和事件变量创建数据集:

# create dataset
dat <- data.frame(
  time = c(3, 5, 7, 2, 18, 16, 2, 9, 16, 5),
  event = c(0, 1, 1, 1, 0, 1, 1, 1, 1, 0)
)

然后我们用survfit()Surv()函数运行卡普兰-迈耶估计器:

# KM
library(survival)
km <- survfit(Surv(time, event) ~ 1,
  data = dat
)

注意,Surv()函数接受两个参数:

  1. time变量,以及
  2. event变量。

survfit()函数中的~ 1表示我们在没有任何分组的情况下估计 Kaplan-Meier。稍后在文章中可以看到更多。

最后,我们显示结果并绘制卡普兰-迈耶图:

# results
summary(km)
## Call: survfit(formula = Surv(time, event) ~ 1, data = dat)
## 
##  time n.risk n.event survival std.err lower 95% CI upper 95% CI
##     2     10       2    0.800   0.126       0.5868        1.000
##     5      7       1    0.686   0.151       0.4447        1.000
##     7      5       1    0.549   0.172       0.2963        1.000
##     9      4       1    0.411   0.176       0.1782        0.950
##    16      3       2    0.137   0.126       0.0225        0.834
# plot
plot(km,
  xlab = "Time",
  ylab = "Survival probability",
  conf.int = FALSE
)

作者的情节

生存概率可以在survival栏中找到。请注意,手动结果和 R 中的结果是相似的(手动结果的任何差异都是由于四舍五入)。

或者,我们可以使用{survminer}包中的ggsurvplot()函数:

library(survminer)
# plot
ggsurvplot(km,
  conf.int = FALSE,
  legend = "none"
)

作者的情节

注意存活曲线上的十字表示删失观察。

使用ggsurvplot()函数的优点是很容易直接在图上画出中位数存活率: 3

ggsurvplot(km,
  conf.int = FALSE,
  surv.median.line = "hv",
  legend = "none"
)

作者的情节

求生存中值: 4

summary(km)$table["median"]
## median 
##      9
# or more simply
km
## Call: survfit(formula = Surv(time, event) ~ 1, data = dat)
## 
##       n events median 0.95LCL 0.95UCL
## [1,] 10      7      9       5      NA

假设感兴趣的事件是死亡:

  • 在时间零点,生存概率为 1(受试者 100%存活)。
  • 中位数表示中位生存时间为 9 年。 5 这是存活率 S(t)为 50%的时间。换句话说,就是一半受试者预期死亡的时间。
  • 从图中我们还看到,S(5)=P(T>5 年)=这些受试者生存 5 年以上的概率= 75%。这意味着 75%的受试者存活超过 5 年,25%的受试者在前 5 年内死亡。

为了完整起见,让我们用一个大得多的数据集做另一个例子;{KMsurv}包中的tongue数据集。 6

# load data
library(KMsurv)
data(tongue)
# preview data
head(tongue)
##   type time delta
## 1    1    1     1
## 2    1    3     1
## 3    1    3     1
## 4    1    4     1
## 5    1   10     1
## 6    1   13     1
  • type是肿瘤 DNA 图谱(1 =非整倍体肿瘤,2 =二倍体肿瘤)
  • time是死亡时间还是在职时间(以周为单位)
  • delta是死亡指示器(0 =活着,1 =死了)

在这个例子中,我们关注非整倍体类型:

anaploid <- subset(tongue, type == 1)

我们现在可以画出估计的生存函数,并估计中位死亡时间。由于它是一个估计量,我们也可以为每个时间 tt 的估计生存时间和估计中位生存时间构造一个置信区间。 7

# results
fit <- survfit(Surv(time, delta) ~ 1,
  data = anaploid,
  conf.type = "log-log"
)
fit
## Call: survfit(formula = Surv(time, delta) ~ 1, data = anaploid, conf.type = "log-log")
## 
##       n events median 0.95LCL 0.95UCL
## [1,] 52     31     93      65     157
# plot
ggsurvplot(fit,
  surv.median.line = "hv",
  legend = "none"
)

作者的情节

中位生存时间估计为 93 周,95%的置信区间为 65-157 周。

卡普兰-迈耶曲线可以被视为生存数据的描述性统计。我们现在关注统计学的第二个分支,假设检验,它允许根据一个样本得出关于总体的结论(如果你需要,参见关于总体和样本之间的差异的快速提醒)。

假设检验

生存分析领域的假设检验主要关注:

  • 一个总体的风险函数:在这种情况下,我们测试一个删失样本是否来自一个具有已知风险函数 h0(t)的总体。例如,我们可能有兴趣比较样本患者的存活率和总体存活率(来自生命表)。
  • 两个或更多人群的风险函数比较:在这种情况下,我们有兴趣评估不同受试者组之间的存活率是否存在差异。例如:
  • 两组:我们感兴趣的是比较女性和男性结肠癌患者的存活率
  • 3 组或更多组:我们感兴趣的是根据黑色素瘤患者的治疗(例如治疗 A、B 和 C)来比较他们的存活率 8

对数秩检验

在本文中,我们使用对数秩检验(也称为 Mantel-Cox 检验)重点比较两组之间的生存率。

测试背后的直觉是,如果两组有不同的风险率,两条生存曲线(因此它们的斜率)将会不同。更准确地说,对数秩检验将每组中观察到的事件数与如果存活曲线相同(即,如果零假设为真)时预期的事件数进行比较。

注意,对于 Kaplan-Meier 估计量,对数秩检验是非参数检验,它对生存分布不做任何假设。

对于此示例,考虑以下数据集:

##    patient group time event
## 1        1     1  4.1     1
## 2        2     1  7.8     0
## 3        3     1 10.0     1
## 4        4     1 10.0     1
## 5        5     1 12.3     0
## 6        6     1 17.2     1
## 7        7     2  9.7     1
## 8        8     2 10.0     1
## 9        9     2 11.1     0
## 10      10     2 13.1     0
## 11      11     2 19.7     1
## 12      12     2 24.1     0

其中:

  • patient是患者的标识符
  • group是组(组 1 或组 2)
  • time是死亡时间(年) 9
  • event是事件状态(0 =审查,1 =死亡)

假设我们对比较组 1 和组 2 的存活率感兴趣,也就是说,我们比较两组之间的存活率曲线:

  • H0: S1(t)=S2(t)代表所有的 t
  • H1: S1(t)≠S2(t)

这是一个统计测试,因此如果 p 值< α (usually 0.05), we reject the null hypothesis and we conclude that survival (or the time to event) is significantly different between the two groups considered.

To perform the log-rank test, the following test statistic will be useful:

By hand

As for the Kaplan-Meier estimator by hand, it is best to also fill in a table for the log-rank test by hand.

Let’s present the final table and comment below on how to fill it, column by column:

j 是不同事件次数的数量。我们看到有 5 个(忽略删截观察),所以我们在表中写 1 到 5。

y(j)是有序的相异事件次数:

4.19.71017.219.7

d(j)1 是第 1 组每个不同事件时间的观察次数:

## time
##  4.1   10 17.2 
##    1    2    1

当没有事件时,我们简单地在表中写 0。

R(j)1 是第 1 组处于危险中的患者的剩余数量。为此,时间的分布(对于第 1 组,删失和未删失)是有用的:

## time
##  4.1  7.8   10 12.3 17.2 
##    1    1    2    1    1

我们看到:

  • 开始时,有 6 个病人
  • 在时间 9.7 之前,剩下 4 名患者(6-1 名在时间 4.1 出现事件,1 名在时间 7.8 被审查)
  • 在时间 10 之前,还剩下 4 名患者(6–2)
  • 在时间 17.2 之前,还剩 1 名患者(6–5 名)
  • 在时间 19.7 之前,剩下 0 个病人(6-6)

d(j)2 R(j)2 遵循相同的原则,但这次针对组 2。所以我们有,分别对于 d(j)2 和 R(j)2:

## time
##  9.7   10 19.7 
##    1    1    1
## time
##  9.7   10 11.1 13.1 19.7 24.1 
##    1    1    1    1    1    1

d(j) R(j)也遵循相同的原则,但这次考虑的是两组。所以我们有,分别为 d(j)d(j)和 R(j)R(j):

## time
##  4.1  9.7   10 17.2 19.7 
##    1    1    3    1    1
## time
##  4.1  7.8  9.7   10 11.1 12.3 13.1 17.2 19.7 24.1 
##    1    1    1    3    1    1    1    1    1    1

Ej 是假设 h1≡h2 时第一组中事件的预期数量。它是按如下方式获得的

Oj 是第一组的观测事件数,所以等于 d(j)1 列。

Oj Ej 很简单。

N(j)定义如下

D(j)是 R(j)1。

N(j)/D(j)很直接。

我们有|Uobs|=1.275

如果您对计算 p 值感兴趣:

P 值= 2×P(Z > 1.275)= 2×0.101 = 0.202 > 0.05。

在 R 中

我们现在将 R 中的结果与survdiff()函数进行比较:

dat <- data.frame(
  group = c(rep(1, 6), rep(2, 6)),
  time = c(4.1, 7.8, 10, 10, 12.3, 17.2, 9.7, 10, 11.1, 13.1, 19.7, 24.1),
  event = c(1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0)
)
dat
##    group time event
## 1      1  4.1     1
## 2      1  7.8     0
## 3      1 10.0     1
## 4      1 10.0     1
## 5      1 12.3     0
## 6      1 17.2     1
## 7      2  9.7     1
## 8      2 10.0     1
## 9      2 11.1     0
## 10     2 13.1     0
## 11     2 19.7     1
## 12     2 24.1     0
survdiff(Surv(time, event) ~ group,
  data = dat
)
## Call:
## survdiff(formula = Surv(time, event) ~ group, data = dat)
## 
##         N Observed Expected (O-E)^2/E (O-E)^2/V
## group=1 6        4     2.57     0.800      1.62
## group=2 6        3     4.43     0.463      1.62
## 
##  Chisq= 1.6  on 1 degrees of freedom, p= 0.2

或者,我们可以使用ggsurvplot()函数来绘制生存曲线,同时执行对数秩检验:

fit <- survfit(Surv(time, event) ~ group, data = dat)
ggsurvplot(fit,
  pval = TRUE,
  pval.method = TRUE
)

作者的情节

正如我们所看到的,p 值和结论是相同的(与手工结果的任何差异都是由于四舍五入)。

至于卡普兰-迈耶估计,我们在一个更大的数据集上做另一个例子。考虑到烧伤患者葡萄球菌感染前的时间数据,也可在{KMsurv} : 12 中获得

# load data
data(burn)
# preview data
head(burn)
##   Obs Z1 Z2 Z3 Z4 Z5 Z6 Z7 Z8 Z9 Z10 Z11 T1 D1 T2 D2 T3 D3
## 1   1  0  0  0 15  0  0  1  1  0   0   2 12  0 12  0 12  0
## 2   2  0  0  1 20  0  0  1  0  0   0   4  9  0  9  0  9  0
## 3   3  0  0  1 15  0  0  0  1  1   0   2 13  0 13  0  7  1
## 4   4  0  0  0 20  1  0  1  0  0   0   2 11  1 29  0 29  0
## 5   5  0  0  1 70  1  1  1  1  0   0   2 28  1 31  0  4  1
## 6   6  0  0  1 20  1  0  1  0  0   0   4 11  0 11  0  8  1

使用对数秩检验,我们想要检验使用常规沐浴护理方法(Z1 = 0)护理烧伤患者与最初使用 4%葡萄糖酸氯己定(Z1 = 1)进行身体清洁的患者之间葡萄球菌感染时间差异(T3变量)的假设。事件指示器在变量D3中。

对于这个测试,我们使用一个双边选择和一个 5%的显著性水平。

# fit
fit <- survfit(Surv(T3, D3) ~ Z1, data = burn)
# plot with log-rank test
ggsurvplot(fit,
  pval = TRUE,
  pval.method = TRUE
)

作者的情节

在样本中,常规洗澡(Z1 = 0)的患者感染时间似乎比身体清洗(Z1 = 1)的患者短。这是因为没有经历过感染的患者的百分比下降得更快,所以风险率更高。

然而,如果不进行合理的统计测试,这一结论不能推广到人群。基于对数秩检验的结果,我们不拒绝两组患者感染时间相同的假设(p 值= 0.051)。

走得更远

在这篇文章中,我们介绍了什么是生存分析,什么时候,为什么以及如何使用它。我们讨论了删失和生存曲线。我们展示了如何通过 Kaplan-Meier 估计器来估计生存函数,以及如何通过对数秩检验来检验两组之间的生存。我们用手工和 r .来说明这些方法。

正如你注意到的,我们没有展示如何建模生存数据。有几种回归模型可用于生存数据,最常见的是半参数 Cox 比例风险模型( 1972 )。它起源于医学领域,用于调查和评估患者的生存时间与其相应的预测变量之间的关系。

我们已经看到 Kaplan-Meier 估计值对于可视化组间存活率和检验组间存活率是否显著不同的对数秩检验是有用的(因此两种方法都使用分类变量作为预测值)。然而,它对于评估定量预测器的效果并不理想。Cox 模型的优势在于,它既适用于定量预测因子,也适用于分类预测因子,同时适用于几个风险因素(因此它可以同时对多个变量的影响进行建模)。

利用 Cox 模型,我们通过不同因素 X1,X2,…,Xq 对风险函数的影响来模拟它们对存活率的影响:

其中:

  • h(t|X)是以存活到 tt 时间为条件的瞬时死亡率。
  • h0(t)是总体水平基线风险——潜在风险函数。它描述了一般人的风险如何随着时间的推移而演变。
  • exp(β1X1+β2X2+⋯+βqXq)描述了协变量如何影响风险。特别是,xixi 的单位增加导致危险增加 exp(βi)倍。

这篇文章旨在介绍生存分析中的介绍性概念,所以这个模型将在另一篇文章中开发。与此同时,如果你想了解更多关于生存数据建模的知识(感谢 Cox 模型和其他模型),请看来自 Joseph Rickert 的帖子

感谢阅读。

和往常一样,如果您有与本文主题相关的问题或建议,请将其添加为评论,以便其他读者可以从讨论中受益。

参考

戴维·考克斯,1972 年。"回归模型和生命表."皇家统计学会杂志:B 辑(方法论)34(2):187–202。

卡普兰,爱德华 L,保罗梅尔。1958."不完全观测值的非参数估计."美国统计协会杂志53(282):457–81。

  1. 请注意,在生存分析中,估计值的精度(和检验的功效)不取决于患者的数量,而是取决于事件的数量。因此,为了使分析有效,最好对事件发生的地方进行多次观察。为了便于说明,我们在这里研究一个小样本。 ↩︎
  2. 注意time变量可以用其他单位表示,比如秒、天、周、月等。 ↩︎
  3. 在生存分析中,中位数优于平均数,因为生存函数经常向右倾斜。平均值通常会受到异常值的影响,而中位数则不会。参见本部分中对两者进行比较的讨论。 ↩︎
  4. 请注意,如果存活曲线没有超过 50%(因为在最后一个时间点,存活率大于 50%),那么中位存活率就无法计算,只是没有定义。 ↩︎
  5. 请注意,中值存活率是以与初始数据集中的time变量相同的单位表示的。因此,如果时间单位是月,中位生存时间将是 9 个月。 ↩︎
  6. 关于数据集的更多信息可以在曲柄?tongue上找到。 ↩︎
  7. 看看我们在这个线程中使用log-log作为置信区间的原因。 ↩︎
  8. 注意,如果要比较的群体具有自然排序(例如教育水平;无、低、中、高),将它考虑在内的测试具有更强的检测显著影响的能力。这些测试被称为趋势测试。 ↩︎
  9. 请记住,时间单位可以不同于年。 ↩︎
  10. 大样本就是这种情况。这里描述的例子不满足这个条件,但是我们仍然把它作为一个例子来展示。 ↩︎
  11. 注意,可以考虑其他权重,但这超出了本文的范围。 ↩︎
  12. 关于数据集的更多信息可在曲柄?burn上找到。 ↩︎

相关文章

原载于 2022 年 12 月 22 日 https://statsandr.com**的

柱状图和柱状图的区别是什么?

原文:https://towardsdatascience.com/what-is-the-difference-between-a-barplot-and-a-histogram-e62d0e532e7d

它们看起来是一样的,但是它们之间的区别是相关的

卢克·切瑟在 Unsplash 上的照片

D 数据可视化并不像听起来那么简单:你不必展示你的数据;你必须讲一个故事,你必须恰当地选择你的英雄。

在这种情况下,你的英雄是你选择用来讲述你的故事的图表,你必须知道一件重要的事情:不是每个人都是技术人员。事实上,从事数据工作的人必须掌握的一件事是讲故事和数据展示技术,因为在大多数情况下,我们必须向不懂数学和统计学的人讲述故事。

如果你有一些年幼的孩子,你会给他们读一本有很多图片和几个单词(而不是相反)的书,不是吗?这是因为孩子们想要理解,但直到他们学会如何阅读,他们才能理解你的故事,而你读它,看图片。他们真的看到狼在森林里寻找小红小红帽,但他们得到了书中图片的帮助:这有助于他们开发想象力。

在本文中,我们将看到两位主宰您的数据故事的英雄,他们是:

  • 条形图
  • 柱状图

由于这两个英雄非常相似,我将给出一些实际的例子,告诉你如何以及何时更好地使用他们,以及当你使用他们时你传达了什么。

1.直方图

引用维基百科:

直方图是数字数据分布的近似表示

实际上来说,直方图有助于我们看到我们想要展示给人们的数据的频率。由于直方图在视觉上用条形表示,条形越高,频率越高。

我们来看一个例子;如果我们有一个数据框“df ”,其中我们想要表示称为“我的数据”的数据的频率,我们可以用 seaborn 绘制一个直方图,如下所示:

import seaborn as sns
import matplotlib.pyplot as plt#plotting the histogram
sns.histplot(data=df, x='MY DATA', color='red', binwidth=1)#labeling
plt.title(f"THE FREQUENCIES OF MY DATA", fontsize=25) #plot TITLE
plt.xlabel("MY DATA", fontsize=25) #x-axis label
plt.ylabel("FREQUENCIES", fontsize=25) #y-axis label#showing grid
plt.grid(True, color="grey", linewidth="1.4", linestyle="-.") 

直方图。图片作者。

在直方图中,我们将“binwidth”定义为每个矩形的宽度。在这个例子中,我将 binwith 设置为 1。

假设这个直方图表示测量的时间,并且每个仓具有 1 分钟的宽度。这张图表告诉我们这个故事:

最频繁测量的时间在 6.5 到 7.5 分钟之间,因为这个数值范围已经测量了大约 60 次(最高柱的高度非常接近 60)

还有,关于分布我们能说什么?嗯,我们可以清楚地说,数据不是正态分布(高斯),因为它们明显(右)偏斜。

2.条形图

一个条形图(或条形图)是一个图形,其中用矩形条表示数据,矩形条的高度与它们所表示的值成比例。

换句话说,一个条形图显示了一个数字变量和一个分类变量之间的关系,每个分类变量被表示为一个条形:条形的大小(它的高度)表示它的数值。

让我们看一个例子:

柱状图。图片作者。

在这种情况下,我们有 40 种产品,我们可以看到每种产品的价格,帮助我们比较产品本身。在这种情况下——当我们有“很多”产品时——为了更好地可视化,我们最好按升序或降序排列条形。

如果我们使用 seaborn,我们的数据框架是“df”,我们要绘制的数据是“产品”和“价格”,我们可以这样做:

import seaborn as sns
import matplotlib.pyplot as plt#setting the ascendent order
order = df.groupby(['PRODUCT']).mean().sort_values('PRICE').index#plotting the barplot
sns.barplot(data=df, x='PRODUCT' , y='PRICE', order=order)#rotating x-axes values for better viz
plt.xticks(rotation = 'vertical')#labeling
plt.title('PRODUCT PRICES')
plt.xlabel(f'PRODUCTS')
plt.ylabel(f'PRICE[$]')#showing grid
plt.grid(True, color="grey", linewidth="1.4", linestyle="-.") 

以升序排列的柱状图。图片作者。

所以,这样我们很容易看出,最贵的产品是“product32”,最便宜的是“product30”。

结论

在本文中,我们已经看到了直方图和条形图之间的区别;两者都使用矩形作为解释数据的视觉方式,但它们传达的结果是不同的。总结:

  • 直方图:
  1. 近似于数据的分布
  2. 显示数值数据之间的关系
  3. 帮助我们理解一个数值出现的频率
  • 柱状图:
  1. 用矩形条表示数据,矩形条的高度与其表示的值成比例
  2. 显示了数值变量和分类变量之间的关系
  3. 帮助我们比较不同分类变量的值

剧透提醒:如果你是一个新手或者你想学习数据科学,并且你喜欢这篇文章,那么在接下来的几个月里我将开始辅导像你这样有抱负的数据科学家。我会在接下来的几周告诉你我什么时候开始辅导,如果你想预订你的座位… 订阅我的邮件列表 :我会通过它和在接下来的文章中传达我辅导旅程的开始。

我们一起连线吧!

中等

LINKEDIN (给我发送连接请求)

推特

考虑成为会员:你可以免费支持我和其他像我一样的作家。点击 这里 成为会员。

数据工程师、数据科学家和数据分析师的区别是什么?

原文:https://towardsdatascience.com/what-is-the-difference-between-a-data-engineer-a-data-scientist-and-a-data-analyst-8d3431ce505e

“大数据”是一个广泛的领域,至少涵盖五个学科和三个职位。虽然数据科学、数据工程和数据分析无疑是重叠的职业道路,但它们之间有着重要的差异。这是细目分类。

卢克·切瑟在 Unsplash 上的照片

当想到被亲切地称为“大数据”的现代数据产业时,很容易将所有“数据人”归入“数据科学家”这一笼统的术语但现实是,在企业层面处理大数据问题需要很多相关的规则。

暂且将数据库管理员(通常称为 DBA)放在一边,我们仍然会遇到数据分析师、数据工程师和数据科学家。虽然人力资源可能并不总是知道公司中这些相关角色之间的实际区别,但就日常职责和专业知识而言,它们是非常不同的。

数据分析师和数据工程师有什么区别?

数据分析师通常使用像雪花亚马逊红移谷歌 BigQuery 这样的工具在“数据仓库”方面工作。通常,他们负责将记录系统中组织有序的结构化数据移动到高性能数据仓库和特定于团队的“数据集市”中,以生成分析和商业智能(BI)报告。

相比之下,数据工程师往往被分配到“数据工程”和“事件流”项目。数据工程师的角色在概念上类似于数据分析师,但主要区别在于,与“纯”数据分析师相比,数据工程师更可能专注于处理半结构化、非结构化和流式数据(如来自实时事件的数据)。

为了处理可能有重复或不完整记录的数据,数据工程师必须依靠诸如 AirflowdbtFivetranAirbyte 等工具来提取、转换和加载(ETL)数据。(事实上,许多数据工程师现在更喜欢在转换数据之前加载数据,这导致了 ELT 过程。)这些复杂的过程通常部分是手动的,可能涉及数据湖和流数据引擎——如 Apache SparkKafkaAmazon Kinesis 等软件。

数据科学家和数据工程师有什么区别?

“数据科学”和“机器学习”(ML)是我们将涉及的最后两个数据相关学科,这些项目往往由拥有“数据科学家”头衔的个人完成像数据工程师一样,数据科学家通常习惯于处理所有类型的数据,因此数据科学家可能会像数据工程师一样使用相同的数据湖和各种数据准备工具。然而,数据科学家通常以解决数据科学或 ML 问题为最终目标来转换他们的数据,而数据工程师通常更感兴趣的是创建可重复的工程流程来支持他们组织的其他部分。

与数据分析师相比,数据分析师可能会处理大量用于商业智能和竞争分析的一次性报告生成,数据科学家倾向于得出统计结论(证明或否定假设)或帮助创建 ML 应用程序(如 ML 支持的图像识别)。这意味着数据科学家喜欢使用 Scikit-learnTensorFlowPyTorch 等软件进行数据科学和 ML 工作。与数据工程中的相关工具相比,这些框架往往更专门用于数据科学或 ML 工作流,例如,这些工具可能无法支持 ML 数据模型的选择、训练和评估。

同时,数据工程师通常从数据仓库、数据集市和分析报告中获取数据;将数据转换成不同格式;然后交给数据科学家或数据分析师。作为复杂数据工程项目的一部分,他们可能会弄脏自己的手,进行编程设置和配置,这可能需要几个月的时间才能完成。为软件即服务(SaaS)公司构建产品内分析是一个典型的需要数据工程师团队的项目示例。这种类型的项目不太可能涉及数据科学家,除非需要统计分析或 ML 支持的功能。

数据分析师、数据工程师和数据科学家之间的区别

我们已经看到,这三条“大数据”职业道路是相关的,并且有许多重叠,但数据工程师、科学家和分析师之间的主要差异归结为两点:1)他们试图解决的典型问题,以及 2)他们选择的工具。

数据分析师最有可能与“商业智能”(BI)问题相关联,这意味着他们的任务是为公司生成可操作的 BI。虽然他们经常使用数据工程工具,并且可能乐于建立数据仓库,但是组织的数据分析师可能是通过数据集市建立特定于团队的分析报告的人。他们可能隶属于业务分析师团队或某个组织的某个职能部门(如市场营销),也可能定期向高级管理层汇报。

同时,数据工程师通常不太关注 BI 报告,而是负责清理和处理复杂的数据。他们可能会使用更“程序化”的方法(像软件工程师一样),并且可能会习惯于采取手动步骤来提取、加载和转换(ELT)数据。数据工程师可能熟悉数据仓库和数据湖之间的区别,他们经常参与围绕实时流分析的事件驱动架构的平台级计划。

最后,但绝对不是最不重要的,数据科学家可能有更多的研究背景,至少通过正式的培训和教育课程。机器学习(ML)和统计分析方面的专家更可能使用术语数据科学家,尽管有许多人的职称是统计员(统计分析师)、信息学家(信息科学家)或 ML 工程师。鉴于 ML 理论上可以应用于几乎任何可以想象的问题,当组织试图优化他们的业务并向客户提供价值时,数据科学家非常受欢迎。但是,他们通常不是向首席执行官提供商业情报的人。

结论:数据分析、数据科学和数据工程

虽然每个数据学科的工作描述都不是一成不变的,但了解数据科学、数据工程和数据分析之间的相似性和差异是很有用的。

总的来说,在统计机器学习(一方面是“纯”数据科学和 ML)和支持执行决策的一次性人工报告(另一方面是“纯”数据分析和 BI)之间有一个连续体。数据工程师介于两者之间,他们通常会深入参与软件工程和产品架构。

大数据中没有硬性规定,随着数据规模的持续增长,数据相关学科的变化速度比技术领域的任何其他部分都要快。如果你不太确定某人在数据科学、分析或工程方面的经验,就问问他们喜欢从事的项目类型以及他们喜欢使用的工具。

您还可以询问他们是否更喜欢细节(如工程事件流软件架构),或者他们是否对处理各种各样的数据相关项目感到满意。最后,请记住,大数据中的职称既意味着很多,同时又毫无意义;它们有助于加深你的理解,但不应该被用来限制别人。

编码快乐! 🧑‍💻🎧👩‍💻🎶👨‍💻

Derek Austin博士是《职业编程:如何在 6 个月内成为一名成功的 6 位数程序员 》一书的作者,该书现已在亚马逊上架。

机器学习和深度学习有什么区别?

原文:https://towardsdatascience.com/what-is-the-difference-between-machine-learning-and-deep-learning-d0fb539e07a1

向新学员介绍数据科学中这两个经常误导的概念

图片作者。

在数据科学的背景下,遇到术语机器学习深度学习并不罕见。它们的用法往往是一样的,有时甚至可以表示同样的意思。

这经常导致没有经验的读者混淆这两个术语的真正解释。

本文旨在澄清这两个术语,以便读者能够分别准确理解什么是机器学习和深度学习。

导言:一些定义

为了更好地理解机器和深度学习之间的差异,我们必须首先理解这两个学科实际上是什么,以及它们所处的环境。这对于那些希望在该领域找到自己的定位,并且刚刚开始进入数据分析世界的人来说尤其重要。

本文提到的每一个学科都是人工智能领域的一部分。正如许多人所知,这也是计算机科学的一部分。因此,无论是机器学习还是深度学习,都是先 AI 后 CS 的一部分。

计算机科学是一个非常广泛的科学学科,所以我们将只关注人工智能,因为这是我们作为分析师的工作领域。

人工智能是一个非常广阔的领域。机器学习和深度学习只是目前最知名的两个学科。

其他人是

  • 搜索和优化 algorithms‍的创建
  • 创建逻辑、感知、学习和规划结构
  • 机器人技术

还有许多其他的,根据我们想要考虑的详细程度,这些可以扩展到集成其他组。

因此,作为人工智能的一部分,机器学习和深度学习触及并影响了上述学科,后者也是如此。

为了形象化这种层次结构,让我们来看看这张图片

图片作者。

当然,机器人专家会使用机器学习或深度学习来教机器实现目标。在这种情况下,他将很可能使用强化学习、机器的另一个分支或深度学习。

现在让我们把重点放在差异上,形成一套可读的要点。

机器学习的定义

正如我们提到的,机器学习是人工智能的一个分支,而人工智能又是计算机科学的一个分支。

机器学习允许一台机器在没有被特别编程的情况下执行任务。因此,机器学习成为自动化任务的最有趣和最强大的解决方案之一。

事实上,这也是数据科学家成为工作场所杰出人物的原因之一——他们事实上是自动化的推动者。

数据科学家是自动化的推动者

由于机器学习,分析师可以考虑任何任务,并在其中集成一定程度的自动化,这样他们就可以

  • 帮助加快执行速度
  • 减少人为失误
  • 允许在多个方面扩展业务

这些要点中的每一个都是商业环境中的基础,因为它们对经济方面有直接影响。

你可以在下面的链接中详细阅读什么是机器学习,以及例子和应用,在那里我为那些想接近该领域的人详细写了这个主题。

深度学习的定义

正如我们所见,深度学习是机器学习的一部分。这个术语不仅仅是一门独立的学科,它还表示一套解决特定问题的特定工具。

机器学习这个术语指的是学科,而深度学习指的是机器学习的方式。神经网络是这个领域的主角。事实上,神经网络通过它的层进行学习,这些层可以非常深。

神经网络被认为是深度学习的本质,而且确实有很多这样的网络……每一个都是为了解决特定类型的问题而设计的。

例如,有些神经网络“记住”很长的序列,因此输出不仅受最新数据的影响,还受之前很久的数据的影响。这些被称为 LSTM (长短期记忆)神经网络。另一些被称为 卷积 神经网络,将过滤器应用于图像,以便只学习所代表的主题的最相关特征。

如果你想了解神经网络,在这个链接你会找到一篇介绍性文章,解释它们是如何工作和学习的。

传统机器学习和深度学习的区别

传统机器学习和深度学习的关键区别可以在这些算法试图解决的问题中找到。其中许多是为解决特定问题而设计的,例如时间序列或文本回归和分类。

无论如何,两家都有各种问题的算法。

这里列出了传统机器学习和深度学习算法的主要区别。

专门化

深度学习是一套技术和算法,肯定更适合特定的问题,通常非常复杂。由于神经网络可以模拟任何功能,如果它们有无限的资源和时间,它们被用于解决涉及非结构化数据的复杂问题,如文本、视频和音频。

对于表格形式的结构化数据,不太复杂的机器学习技术也可以超过深度学习算法的性能。

此外,在从更大的数据集(大数据)中学习时,神经网络比传统算法更有效。

复杂性

虽然有非常复杂的传统机器学习算法,如 XGBoost ,但深度学习算法从定义上来说更复杂。

设计深度学习模型是数据科学中最重要的挑战之一。机器学习工程师每天都在努力进行领域创新。该领域最相关的一些公司是抱脸谷歌Meta百度OpenAI 以及许多其他公司。

计算请求

通常,传统的机器学习算法比深度学习算法需要更少的计算能力。这是因为神经网络可以利用 GPU(图形处理单元——基本上是显卡)来提高训练速度。除了 GPU,他们还可以利用 TPUs (张量处理单元),这是针对深度学习优化的芯片。

一些传统的机器学习算法也可以利用 GPU——其中包括 XGBoost、LightGBM 和 Catboost。

可解释性

在谈论机器学习和深度学习之间的差异时,经常没有考虑的一个方面是模型和算法的可解释性有多大。

神经网络通常被认为是黑盒——也就是说,我们知道它们如何工作,但我们不知道它们如何实现预期的结果,也无法预测它。只有尝试不同的架构,才能逐渐接近最佳配置。

另一方面,传统的算法,如决策树,很容易解释,并且交流这些算法如何工作以及它们如何获得结果也相对容易。

结论

机器学习和深度学习本质上是一样的东西——允许机器做出足够精确的推论以用于商业或非商业背景的方法和技术。这些方法取决于我们面临的环境。

在小型表数据集上使用深度学习技术可能会矫枉过正,因为“平凡的”随机森林可以表现得更好,更快地收敛到解决方案。

我的建议是一如既往地仔细评估背景,问自己一些有助于理解我们面临的问题的明确问题。

如果您想了解更多关于技巧和方法的信息,我建议您浏览我的 Medium profile,其中包含一些关于心智模型和模板的文章,以优化数据科学领域的工作。

如果你想支持我的内容创作活动,欢迎点击我下面的推荐链接,加入 Medium 的会员计划。我将收到你投资的一部分,你将能够以无缝的方式访问 Medium 的大量数据科学文章。

https://medium.com/@theDrewDag/membership

感谢您的关注,很快再见!👋

欧盟的人工智能法案是什么,会改变什么?

原文:https://towardsdatascience.com/what-is-the-eus-artificial-intelligence-act-and-what-will-it-change-b1f6812f5dd5

解释欧盟的人工智能法规提案

照片由 安德烈·德·森蒂斯峰 unsplash

欧盟 AI 新规提案,简称“AI 法案”,于 2021 年 4 月公布,一直是数据界广泛讨论的话题。这并不奇怪,因为它将对人工智能的一些领域产生巨大影响,而且在实践中如何应用这一规定还有很多不确定性。作为一名高级数据科学家,我已经参与了许多数据科学项目,我在可解释的人工智能方法和人工智能伦理方面有特殊的专业知识,所以我想阅读这份提案,以评估建议的法规的可行性。在多次阅读了欧盟 AI 法案的拟议版本后,我写了这篇文章来分享我对这一法规的解读和想法。请注意,该提案包含了如此多的小细节,以至于一篇帖子无法涵盖所有细节,并且围绕该主题有许多误解,我无法在一篇简短的帖子中澄清。该提案有所有欧盟语言版本,您可以在此处找到的所有版本。

这篇文章的大纲如下:首先,我要说明为什么需要这项条例,然后,我将解释这项条例的主要部分和如何履行这些要求,违反这项法令的惩罚是什么,以及预计何时会发生的时间表是什么。最后,我列出了自己对这一行为的一些想法和担忧。在这篇文章的结尾,你也可以找到这个规则的摘要。

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

为什么欧盟提议对人工智能进行监管?

为了理解这一规定的紧迫性,有必要了解 AI 法案背后的动机是什么。AI 行为的两个主要原因是:

  1. 确保人工智能系统安全,尊重基本权利和欧盟价值观:欧盟的法律基于欧盟的基本价值观,包括尊重人类尊严、自由和民主。最重要的是,欧盟受到基本权利的约束,包括不受歧视的权利、男女平等、数据保护和隐私权以及儿童权利。尽管人工智能技术有多种好处,但人工智能系统可能会强烈抵触工会的价值观和权利,并为有害的做法提供强大的工具。确保人工智能的发展尊重人们的权利并赢得他们的信任,让欧洲适应数字时代。
  2. 防止欧盟内部市场分裂:随着人工智能系统的风险变得明显,一些成员国已经在考虑人工智能产品和服务的国家规则。由于产品和服务可能会跨境流通,不同的国家规则将分割欧盟内部的市场,并危及不同成员国对基本权利和欧盟价值观的保护。

照片由克里斯蒂安卢unsplash 拍摄。

《大赦国际法》提出了什么样的规定?

本提案中的监管力度取决于人工智能系统产生的风险水平。为了减少不必要的成本,并防止新的人工智能应用程序的采用速度放缓,人工智能法案希望对那些对人类风险低或最小的人工智能系统保持温和,并只针对那些带来最高风险的人工智能系统。该法规将禁止某些人工智能实践,为高风险人工智能系统规定义务,并要求某些人工智能应用程序透明。法规还建议建立欧洲人工智能委员会,就具体问题提供建议和帮助,以确保法规的顺利有效实施。

该法案中“AI”是如何定义的?

术语“人工智能”的定义非常宽泛,令人惊讶的是,许多应用都属于“人工智能”。在本条例中,“人工智能系统”是指采用一种或多种技术开发的软件(清单见附件一):

  1. 机器学习方法,包括监督、非监督和强化学习,使用包括深度学习在内的多种方法;
  2. 基于逻辑和知识的方法,包括知识表示、归纳(逻辑)编程、知识库、推理和演绎引擎、(符号)推理和专家系统;
  3. 统计方法,贝叶斯估计,搜索和优化方法。

风险等级是如何定义的?

本提案中的风险级别分为三组:不可接受的风险、高风险和低或最低风险。

摄影由飞:D

A)不可接受的风险

在这一类别中,人工智能系统的风险如此之高,以至于它们是被禁止的(有三个例外)。被禁止的做法是:

  1. 操纵系统:超出人的意识范围的技术,或利用特定群体的任何弱点(年龄、身体或精神残疾)以扭曲某人的行为,从而对该人或另一人造成伤害的技术。
  2. 社会评分算法:公共机构使用的人工智能系统,用于评估自然人的可信度,从而对公民进行“社会评分”,
  3. 实时生物识别系统:使用实时系统,在公共场所远距离识别人员,用于执法目的,除非在以下三种例外情况下绝对必要:
    i) 有针对性地搜索潜在的犯罪受害者或失踪儿童;
    ii) 预防迫在眉睫的安全威胁或恐怖袭击;
    iii) 对严重刑事犯罪的作案人或嫌疑人的侦查。
    这三种例外情况要求评估使用该系统与不使用该系统时危害的严重性和规模,并且它们的使用需要始终得到相关机构的批准。

B)高风险

被确定为高风险的人工智能系统可能会对一个人的生活和保障其生计的能力产生重大影响,或者会使一个人参与社会变得复杂。设计不当的系统可能会以有偏见的方式运行,并显示出历史歧视的模式,因此,为了降低这些系统的风险,只有当它们符合下一节讨论的某些强制性要求时,才能投入使用。在以下情况下,人工智能系统被视为高风险:

  1. 它包含在附件二所列的欧盟协调立法中,在投放市场之前,必须经过第三方一致性评估。属于这一类别的产品有机械、医疗器械和玩具等。
  2. 该清单列于附件三。此类别中的系统分为八大类,分别是
    i) 使用生物特征识别;
    ii) 运营关键基础设施(道路交通、水、热、气、电);
    iii) 决定受教育机会或评价学生;
    iv) 用于招聘,或决定晋升、终止合同或任务分配;
    【v】确定获得服务和福利的途径(如社会援助、补助金、信用评分);
    vi) 用于执法;
    vii) 用于移民、避难或边境管制管理;
    viii) 协助司法系统(如协助研究事实和法律)。

c)低风险或最小风险

对于不被认为是高风险的 AI 系统,只需要某些透明度规则。这些义务是:

  1. 如果一个人工智能系统与人交互,它必须通知用户,用户正在与人工智能系统交互,除非从使用的上下文来看这是显而易见的。
  2. 如果人们接触到情绪识别系统或根据性别、年龄、发色、纹身等将人们划分到特定类别的系统,必须告知他们。
  3. 经过处理的图像、音频或视频内容,如果与可能看起来真实可信的现有人物、地点或事件相似(如“深度伪造”),则必须明确声明该内容是人工生成的。

然而,鼓励低风险和最小风险人工智能系统的提供商自愿创建和实施行为准则。这些行为准则可以遵循为高风险系统设置的要求,或者可以包括对环境可持续性、残疾人无障碍、开发团队多样性以及利益相关方参与人工智能系统的设计和开发过程的承诺。

为军事目的开发或使用的人工智能系统不在本条例的范围之内。法规适用于 a)投放市场、b)投入服务、c)在联盟内使用或 d)影响联盟内人员的所有系统(例如,如果 AI 执行的活动在联盟外运行,但其结果在联盟内使用)。同样,人工智能系统的工作是有偿还是无偿也没有区别。

高风险 AI 应用需要什么?

照片由 Desola Lanre-Ologununsplash上拍摄。

考虑到监管干预的早期阶段以及人工智能行业正在快速发展的事实,以及审计专业知识现在才开始积累,监管严重依赖内部评估和报告。高风险人工智能应用的需求清单很长,而且经常令人困惑,很难理解这些需求必须满足的精确程度。高风险系统的提供商必须至少:

  1. 建立风险管理系统:需要在高风险 AI 系统的整个生命周期中定期更新。它需要识别和分析所有已知和可预见的风险,这些风险可能在高风险人工智能系统用于预期目的或合理滥用时出现,特别是如果它对儿童产生影响。
  2. 编写技术文件:必须随时更新,文件必须遵循附录 IV 中规定的要素,因此必须至少包含:
    a) 人工智能系统的一般描述,例如其预期目的、系统版本和硬件描述,
    b) 人工智能系统的详细描述,包括人工智能系统的一般逻辑、关键设计选择、 培训数据的主要特征、系统的预期用户群以及系统旨在优化的内容,
    【c)人工智能系统的能力和性能限制的详细信息,包括总体预期准确度水平和特定人群的准确度水平,以及对健康、安全、基本权利和歧视风险的评估。
    如果高风险人工智能系统是受附件二中所列法令管制的产品的一部分(如机械、医疗设备和玩具),技术文件也必须包含这些法令所要求的信息。
  3. 满足对使用的训练、测试和验证数据集的要求(如果系统是用数据训练的):数据集需要相关、有代表性、没有错误和完整。它们必须具有适当的统计特性,尤其是针对打算使用高风险人工智能系统的人群。必须考虑相关的设计选择、收集的数据、数据准备过程(如注释、标记、清理、汇总)、数据假设(数据应该测量和代表的内容)、可能偏差的检查以及任何可能的数据差距和缺点的识别。
  4. 实现适当级别的准确性、健壮性和网络安全:高风险的人工智能系统必须实现适当级别的准确性,并且必须在其整个生命周期中保持一致。它需要对人工智能系统使用中可能出现的错误、故障和不一致具有弹性。用户必须能够中断系统或者决定不使用系统的输出。此外,人工智能系统必须对通过利用系统漏洞来改变其用途或性能的企图具有弹性。
  5. 对系统进行符合性评估:在某些情况下,全面的内部评估(遵循附件六中的步骤)就足够了,但在某些情况下,需要第三方评估(参见附件七)。请注意,对于那些属于附件二所列法令范围内的高风险系统(如机械、医疗器械和玩具),必须由这些法令中指定的机构进行符合性评估。
  6. 将详细说明交给用户:用户必须能够解释系统的输出,监控其性能(例如识别异常、功能障碍和意外性能的迹象),并且必须了解如何正确使用系统。说明应包含提供商及其授权代表的联系信息,具体说明性能的特征、能力和限制(包括可能影响预期性能水平的情况),并且说明必须明确说明输入数据的规格。
  7. 将系统注册到公众可访问的欧盟数据库:所有高风险系统及其汇总表必须注册到欧盟数据库,并且这些信息必须随时保持最新。汇总表必须包含附录 VIII 中列出的所有信息,包括供应商的详细联系信息、人工智能系统的商品名称(以及任何其他相关识别信息)、系统预期用途的描述、人工智能系统的状态(已上市/不再上市/已召回)、某些证书的副本、系统可用的成员国列表以及电子使用说明。
  8. 在系统使用时保持记录:当系统在合同安排或法律允许的范围内运行时,人工智能系统必须自动记录事件(“日志”)。这些日志可用于监控实际操作,它们有助于评估人工智能系统是否正常运行,特别注意危险情况的发生。
  9. 保持上市后监控并报告严重事件和故障:提供商有义务记录和分析从用户(或通过其他来源)收集的关于高风险人工智能系统在其整个生命周期内性能的数据。提供商还必须立即报告已经发生的任何严重事故或故障。

当局必须被授予对训练、验证和测试数据集的完全访问权,并且如果必要的话,还可以访问源代码。请注意,当局必须尊重在此过程中获得的信息和数据的保密性(包括商业信息和商业秘密)。由于有关当局拥有很大的权力来决定哪些人工智能系统可以在欧盟市场上设置,该法规为可以进行符合性评估的各方制定了严格的规则。例如,不允许出现利益冲突,当局不能提供任何可能与人工智能系统竞争的活动或咨询服务。

该法规还列出了人工智能系统的进口商和经销商的义务,他们需要确保人工智能系统满足该法案中列出的要求。此外,高风险人工智能系统的用户也有义务:例如,他们需要确保输入数据与高风险人工智能系统的预期用途相关,如果用户遇到任何严重事故或系统故障,用户必须中断人工智能系统的使用,并将事件通知提供商或经销商。

违反该法案的处罚是什么?

照片由马蒂厄斯特恩unsplash

罚款分为三类:

  1. 使用禁止的人工智能做法或违反数据要求:3000 万欧元或上一财年全球年营业额的 6 %,以较高者为准。
  2. 不符合本法规的任何其他要求:2000 万欧元或上一财年全球年营业额的 4 %,以较高者为准。
  3. 就本条例的要求提供不正确、不完整或误导性信息:1000 万欧元或上一财政年度全球年营业额的 2 %,以较高者为准。

在决定罚款金额时,应考虑具体情况,例如不遵守行为的性质和持续时间及其后果,以及实施侵权行为的经营者的规模和市场。

什么时候举行?

2018 年 3 月,欧洲委员会成立了人工智能专家组,起草人工智能道德准则的提案。2019 年 4 月,“可信人工智能的道德准则”发表。欧盟人工智能法规的第一份草案于 2020 年 2 月发布,被称为“人工智能白皮书”。该文件邀请所有感兴趣的各方对拟议的条例提出反馈意见,共收到了来自公司、商业组织、个人、学术机构和公共当局的 1000 多份意见。根据这些反馈,2021 年 4 月公布了人工智能法案的当前版本。尚不清楚该法规将于何时生效,但据估计,该法规最早将于 2023 年被接受,假设有两年的过渡期,该法规将于 2025 年开始适用。

我觉得这个表演怎么样?

照片由粘土堤上的unsplash拍摄。

我已经关注人工智能伦理和透明度讨论好几年了,似乎更多的人已经开始理解盲目信任人工智能系统的风险。我们已经知道人工智能系统歧视女性的情况,在招聘工具中给她们较低的分数(链接)和较低的信用额度(链接)。此外,一个旨在为美国医院工作的人工智能系统决定,白人病人比同样生病的黑人更迫切需要帮助,即使黑人比普通白人病得更严重(训练数据有偏差,因为白人有更好的健康保险,所以他们的疾病得到更好的诊断,链接)。所以 AI 的风险不是想象出来的。

这就是为什么我赞扬监管人工智能系统的尝试,以确保人们将得到平等对待。太多的提供商和开发者不知道或不关心检查他们的系统是否会歧视某些人,以及这对这些人可能意味着什么。但我不认为这项规定中建议的过度报道是实现预期目标的正确方式。我认为有些要求听起来不错,但很难或不可能实现。

在多次阅读该提案后,有几个句子特别突出。例如,如果用于训练人工智能系统的数据不满足本法规中设定的要求,则会受到最高级别的处罚。例如(从提案中直接引用):“训练、验证和测试数据集应该是相关的、有代表性的、没有错误的和完整的。”此外,数据必须对作为系统预期用户组的人群具有适当的统计属性。这些要求在真实的数据科学案例中非常沉重,令人失望的是,该法规没有更好地说明如何确保数据集符合限制。例如:一个数据集可能包含大量不同的年龄组、种族和同等数量的男性和女性,但在详细的分析中,我们注意到年轻的黑人女性非常少。所以如果我们看一个特征的统计,数据集看起来不错。但是如果我们观察三个特征的组合,例如年龄、种族和性别,我们就开始发现问题了。如果我们同时关注多个特征,那么不可避免的是,群体规模将变得如此之小,以至于不再具有统计学意义。那么,我们如何确保我们的数据集中不存在偏见,并且我们不必支付 3000 万欧元的罚款呢?

该条例指出,它严重依赖内部报告,因为审计方面的专门知识现在才开始积累。然而,罚款似乎非常高,即使我们正处于这种监管的早期阶段。对我来说,这就像是一场赌博:你是要承担意外忘记提及某件事的风险,如果你被抓到,你的公司就要完蛋了,还是为了安全起见,你会放弃所有人工智能系统的开发?我认为后果似乎不必要的严厉,因为立法者似乎并不完全知道满足一些要求有多困难。出于这个原因,我认为对基本人工智能系统的投资下降的风险非常高,因为投资者担心高额和不可预测的罚款。我希望立法者能够修改这一规定,只要求现实世界的人工智能系统能够完成的步骤。让我们不要用不公平的立法来破坏良好的意愿!

《大赦国际法》概述

欧盟监管人工智能系统的最新提案包含以下几点:

  • 人工智能系统根据其产生的风险分为三类。
  • 不可接受的风险系统通常是被禁止的。这类系统包括操纵系统、社会评分算法和实时监控系统。
  • 高风险系统对一个人的生活和保障其生计的能力有重大影响,或者会使一个人参与社会变得复杂。这些系统可以确定服务和福利的获取,用于招聘或评估学生。只有符合某些强制性要求(包括内部评估和报告),才能投入使用。
  • 低风险和最小风险系统必须遵守特定的透明度规则。例如,如果一个人工智能系统与人交互,它必须通知用户,用户正在与人工智能系统交互。还有“深度假货”视频等。必须明确说明内容是人为生成的。
  • 该法规预计最早将于 2025 年开始实施。

作者是一名高级数据科学家,也是可解释人工智能方法的专家,她花了多年时间关注人工智能伦理的讨论。她有学术背景,拥有多年的计算物理模拟经验和理论粒子物理博士学位。她对监管人工智能的尝试很感兴趣,因为人工智能模型不是以直截了当的方式工作,所以编写这样的监管并不容易,但她完全支持监管人工智能,因为人工智能开发者太专注于快速构建模型,而没有考虑人工智能伦理。

进入数据领域的正确路径是什么?

原文:https://towardsdatascience.com/what-is-the-right-path-to-get-into-the-data-field-5fbbf5635184

我个人对这个问题的回答,基于我自己的经验

照片由麦凯布在 Unsplash 上穿

在过去的几个月里,我看到了一个趋势:越来越多的人希望进入分析领域,但他们需要在选择正确的道路上得到引导。

首先,我想公开感谢所有花了一些时间在 Linkedin 上给我发直接信息或电子邮件的人:我真的很感谢你伸出手来,问我的意见。此外,我要感谢所有给我写信鼓励我继续写作的人:这真的是“我引擎的汽油”

在本文中,我想告诉你我个人对一个典型问题的回答:进入数据领域的正确途径是什么?

当然——不过还是再说一遍——这只是我的看法,基于我的经验。

1.你不需要博士或硕士学位

让我们从简单的开始(否认):你不需要博士或硕士学位。

再读一遍。

当然,拥有一个高等学位会对你有所帮助,但你并不需要它。

我相信,人们认为他们需要一个博士学位才能进入数据世界的事实是因为,直到最近,与数据相关的工作(尤其是数据科学家的角色)都是由研究领域的人获得的。事实是,在过去几年里,这类工作在需求方面激增,但在就业市场上,在供应方面却缺乏技能;这就是我们不需要博士或硕士学位的原因。此外,考虑一个基本事实:不是每个公司都有 R&D 部门,他们也不做研究:今天的大多数公司只需要分析数据来获得洞察力,或者他们需要预测(即销售预测),这些工作可以用“正确的”知识和“正确的”实践能力来完成,当然不需要博士或硕士学位。

当然:你需要知识,而且,你需要实践;但是今天,实践比 更重要。嗯,说实话,总的来说,我们生活在一个实践似乎比学位更受重视的时代。

所以,如果你想获得博士或硕士学位,决定权在你(祝你学业顺利!),但你真的不需要它们进入这个领域。

2.“好;那么,我从哪里开始呢?”

我通常被问到的第二个问题是:“我从哪里开始?

或者:“所有这些要学的东西都让我不知所措:我应该专注于什么?我应该走哪条学习道路?

这些是最难回答的问题,我来告诉你为什么。

有两个“困难”:

  1. 数据领域还很不成熟,而且经常有人需要做“横向的”工作任务。

2.即使你得到了一份有明确任务的工作,你也必须明白自己喜欢做什么。

第二个是最难的一个。我们再重复一遍:你要明白你喜欢做什么。

我告诉你一件事:如果你只是因为有高薪工作和远程工作的可能就想进入数据世界,那你是得不到的。

相信我。

路很难走,你必须喜欢它:否则,你哪儿也去不了。

所以,我个人对这个问题的回答是慢慢来(对,几个月!),这样你就开始热爱学习的道路,你开始明白你喜欢做什么。如果你想阅读我关于如何以及为什么要学习数据科学的建议,你可以阅读下面的文章:

https://medium.com/mlearning-ai/why-and-how-enjoying-the-learning-path-in-data-science-fe98642cb512

我知道,有很多东西要学,你需要大量练习,你会感到不知所措。我理解你的挣扎,这就是为什么我的建议如下:

  • 从 Python 开始。Python 是一种非常灵活的编程语言,是世界上不同行业最需要的语言之一。即使最终你会选择成为一名数据分析师或业务分析师,掌握 Python 知识也变得越来越重要。所以,去上一门 Python 课程,继续下去。我没有特别的 Python 课程可以推荐给你,但是,在这篇文章中,我写了我对如何学习数据科学 Python 的建议。总结:学习基础知识,继续用 Python 进行数据分析,如果你觉得舒服,学习一些机器学习。
  • 继续学习 SQL 基础知识。如果你想从事数据领域的工作,不管是什么角色,你都需要从数据库中提取数据。所以,学习 SQL 基础知识非常重要。如果你想在开始一门课程之前免费开始,这样你就会明白你是否喜欢它以及如何加深概念,你可以从这里开始。
  • 学习 Tableau/powerBI 。这些是数据可视化最常用的工具。没必要两个都学;我在这里的看法是,你有两种可能: 1) 你很想为某个特定的事务所工作;在这种情况下,你得了解他们用的是两个中的哪一个,并学习它。 2) 只学两者之一;事实是,不管使用什么工具,重要的是获得可视化的经验;你将形成的心态比你使用的工具更重要:当你得到它时,你可以在工作中学习另一种工具。
  • 深化您的 Excel 专业知识。我知道,几乎每个人都使用 Excel,但是在分析数据时,有一些有趣的函数需要知道。在这里我的建议是拿一些 YouTube 上关于 excel 中数据分析技术的视频,做一些练习。

所以,除了这些需要学习和练习的东西之外,这里的重点是了解你喜欢什么,就像我在开始所说的那样。阅读求职门户网站(和 Linkedin 上)的各种工作 描述了解所需的硬技能,并尝试了解你是否喜欢这份工作;此外,在建立关系网的时候,和人们交谈,问问他们在工作中做什么。

为了更好地理解,让我们简化一下:

  • 一个数据分析师大部分时间花在数据库上,用 tableau/powerBI 创建仪表盘。你喜欢整天做那件事吗?
  • 一个数据科学家花大部分时间分析数据,寻找最适合数据的 ML 模型。你喜欢整天做那件事吗?

此外,另一个需要了解的事实是,对于同样的工作岗位,如果你是为一家初创公司还是一家公司工作,你的工作日将会不同。简化:

  • 初创公司通常是小公司,你没有预先定义的工作:这意味着你的工作可能是“横向的”;我的意思是,如果你没有数据,你可以抓取它们,分析它们,用 ML 做一些预测,做一些仪表板,等等;所以,问题来了:你是喜欢发现没有边界的新事物,还是让你不知所措?
  • 在大公司,你通常会有一份预先定义好的工作;例如,如果你想成为一名数据分析师,在一家大公司,你的工作可能会主要集中在数据库和仪表板上;你喜欢探索新的事物,但在一定的范围内,还是让你感到无聊?

所以,这就是为什么需要几个月的原因:因为你需要了解你想发展哪种硬技能,以及你想在什么样的环境中工作

还有,如果你全职工作,想转行进入数据领域,你可能会发现很难一边全职工作一边学习。让我告诉你,我真实而深刻地理解你:我在全职工作、成家立业的同时,完成了数据科学的硕士学位。所以,如果你想知道我对如何学习 Dat 科学的建议,即使你是全职工作,请阅读我的文章:

3.奖金:如何加速你的职业生涯进入数据领域

正如我说过的,进入数据领域的道路漫长而艰难,但有一些方法可以加速它:

  1. 联网。人际网络是一座金矿,因为认识人并与他们建立关系真的会促进你的职业发展;你无法想象你遇到的一个人能给你推荐一份工作的可能性有多大。
  2. 写作。写作可以促进你的职业生涯,因为越来越多的公司需要人们为他们的人工智能产品写文章;还有,有时候他们可能需要文章来告知人们关于 ML 和 AI 的信息;这是自由职业的一个典型例子(你甚至可以在你目前的雇员工作之外做这件事)。
  3. 为某个特定的公司创建项目。如果你找到了一家理想的公司,一个好主意是创建一个个人项目,在这个项目中,你可以展示你的技能,用你的数据能力帮助他们获得一些成果。比如:你想在营销公司工作吗?向他们展示你如何使用 ML 来聚集客户可以让你得到这份工作!

如果你是一个新手,你想学习 Python 和数据科学,那么考虑一下我可以在这条美丽的学习道路上指导你。联系我,让我们谈谈(见下面我的联系人)。

还有,如果不想错过我的最新文章,可以 订阅我的邮件列表

考虑成为会员:你可以支持我,不需要额外的费用。点击 这里 成为会员,每月不到 5 美元,你就可以解锁所有的故事,并支持我的写作。

我们连在一起吧!

中等

LINKEDIN(向我发送连接请求)

推特

什么是可变比率阴影,为什么大玩家争相获取它

原文:https://towardsdatascience.com/what-is-variable-rate-shading-and-why-big-players-are-rushing-to-get-it-ea90a71a5d98

最先进的优化实现了 40%以上的渲染成本降低

作者图片

小时候经常玩——魔兽世界:冰封状态,极品飞车:地下,波斯王子:时之沙,GTA:副城和使命召唤 4:现代战争。当时,这些游戏看起来很疯狂——“贴近生活”的图形、逼真的动作和过热的电脑。

新游戏中场景和视觉效果的日益复杂,加上新技术,如增强和虚拟现实,更高的帧速率,达到每秒 120 帧,分辨率和动态范围推高了渲染成本。

GPU 设计的最新进展开辟了一种新的方法来降低计算成本,同时对视觉质量的影响最小——可变速率着色(VRS)。

VRS 允许动态选择像素块的阴影率—更低的阴影率—更高的效率和更低的质量。更高的着色率-更高的质量,但也有更高的计算要求。因此,目标是在质量和计算之间取得平衡。

最先进的技术声称在不损失质量的情况下,渲染时间减少了 40%。很好,不是吗?

下面,我将简要介绍渲染管道、可变速率着色的一般方法,并讨论最新的解决方案,如来自 NVIDIA、微软和 AMD 的解决方案,以及尚未上市的学术进展。

渲染管道

渲染管道的目标是获取世界的 3D 模型,并转换成可以在屏幕上显示的 2D 表示。

图形管道。图片由 C. Vetter 提供。

场景的原始 3D 模型(顶点)在转换为像素之前要经过几个阶段。顶点首先通过顶点着色器跨图元(三角形或直线)进行插值。然后用几何着色器对这些进行细化。裁剪用于裁剪延伸到单位立方体之外的对象或对象的一部分(用于容纳显示的空间)。光栅化将形状的 3D 空间转换为光栅化图像(像素)。然后,片段着色器识别每个像素的颜色,并在帧缓冲操作后生成最终图像。

本文的重点是片段着色器。对于每个像素,我们需要从我们要显示的纹理中查找它的颜色。

抽样示例。图片由作者提供。

对每个像素的颜色进行采样是非常昂贵的。例如,对于 1920 × 1080 分辨率,需要 2,073,600 次查找。正如我们将在下面看到的,这个数字可以通过 VRS 大大减少。

如果你有兴趣了解更多关于图形管道的知识,请查看 YouTube 频道。

可变比率阴影—一般原则

为每个像素查找颜色非常耗时,虽然我们可以依靠高度并行的 GPU来进行这些独立的计算,但实现高帧率仍然具有挑战性。VRS 允许我们通过识别像素块来减少处理工作,我们可以通过查找一次来分配相同的颜色,而不会明显降低质量。

考虑下图。对于某些区域,我们可以在没有明显变化的情况下降低颜色估计的准确性。这些可能是图像中快速移动的区域——例如,车轮后面的区域、眼睛焦点周围的区域、游戏中由于雾而能见度降低的区域,或者颜色均匀的区域。

第二层可变比率阴影。作者图片

两种类型的虚拟现实

根据 VRS 的实现方式,我们可以通过两种方式为像素块分配颜色:

  • 第 1 层是基于每次绘制着色率的。例如,我们可以指定半透明背后的资产具有较低的着色率,或者指定策略游戏中的水应该以较低的着色率着色,而森林应该以较高的着色率着色。
  • Tier 2 类型允许在绘图中以更高的粒度指定阴影率。例如,我们可以选择指定了相同阴影率的像素块。描述如何应用 VRS 的数据结构称为 VRS-map(也称为 VRS-texture)。每个位置保存要应用于图块的着色率(具有相同着色率的像素区域)。拼贴大小和阴影率取决于硬件实现。然而,最常见的瓷砖尺寸是 16x16 和 8x8 以及 1x1、1x2、2x1、2x2、2x4、4x2、4x4 的阴影率。

在本文中,我将重点介绍第 2 层 VRS,因为它提供了更多的灵活性和潜在的节省。

总则

像许多计算机图形技术一样,VRS 利用人眼的低效率来减少计算,同时保持渲染图像的质量与参考图像一致。

根据可用的数据和硬件,我们可以基于以下因素降低阴影率:

  • 有凹渲染。我们可以依靠眼睛跟踪,并使用有凹渲染来降低头戴式设备的眼睛焦点外围的图像的阴影率。然而,由于它需要额外的硬件能力,所以我不会在本文中涉及太多的细节。

有凹渲染。图片由作者提供。

  • 空间频率。也许降低阴影率最直接的方法是寻找颜色一致的区域。有许多方法可以做到这一点,但大多数方法依赖于梯度信息估计(例如边缘检测)来识别低频区域。
  • 议案。快速移动的物体将被我们的视觉系统平滑处理——使这些区域呈现出快速、平滑的变化,这与降低阴影率是完美的匹配。这些方法依赖于运动矢量,而运动矢量在实践中通常是不可用的。

估计 VRS 地图

为了估计当前帧的 VRS 贴图,我们需要找到该帧中可以应用降低的阴影率的区域。然而,由于该帧还没有被渲染,我们将依赖于来自过去的、已经被渲染的帧的信息来估计当前帧的着色率。根据现有信息,我们可以:

  • 使用可从先前渲染阶段获得的运动矢量,然后重新投影先前帧以获得当前帧的估计;
  • 例如,使用基于流、块匹配、基于神经网络和基于摄像机运动的方法,即时计算运动矢量。
  • 使用没有重新投影的前一帧,假设场景中的变化很小,这在实践中经常成立。

最先进的 VRS

VRS 是一项非常强大的技术,如果应用得当,可以显著提升游戏性能。因此,大多数主要的游戏引擎和 GPU 供应商都在寻找将 VR 集成到他们的生态系统中的方法。

微软 VRS (MSFT-VRS)

来自微软的各种版本的 VRS 解决方案已经在 2021 年的游戏开发者大会上展示过,并在 2022 年的延期闪电和 2022 年的 XboX 中的应用中讨论过。Jacques van Rhyn 也发表了一系列博客文章,强调技术细节和性能基准测试:博客文章#1博客文章#2博客文章#3

微软的 Tier 2 VRS 通过对来自前一帧的 sRGB 彩色缓冲器的亮度运行 Sobel 边缘检测器来为当前帧生成 VRS 图。对最终颜色值运行边缘检测器具有优势;例如,它捕捉由于后期处理效果而模糊的区域。我们可以使用一个可配置的阈值,这取决于边缘检测器需要多强。

边缘检测的示例-边缘被识别的区域会看到较高的阴影率。图片由作者提供。

NVIDIA 自适应着色(NAS)

NVIDIA 在一篇名为游戏中视觉无损内容和运动自适应阴影的论文中正式描述了其 VRS 解决方案。正如这篇文章的名字所示,两个方面影响了 VRS 贴图的计算:错误,这将由应用较低的阴影率和运动 模糊产生。

误差计算:下图给出了阴影率减半的 1D 信号的误差计算示例。该误差被定义为相邻像素的亮度导数。使用算术平均值、“均方误差”或“最大值”对每个图块的最终误差求和。

图片由作者提供。

对于 2D 图像块,在水平和垂直方向上计算误差。因此,垂直和水平阴影率是独立评估的。

运动模糊:由降低的阴影率引起的误差可能被运动模糊隐藏。NVIDIA 区分了两种可能影响最终着色率的模糊类型:

  • 由引擎作为特殊效果引入的模糊。
  • 液晶显示器的持续模糊。在渲染下一个屏幕之前,在屏幕上显示图像;这在物体运动中引入了不连续性。当眼睛以线性、连续的运动跟踪物体时,物体在视网膜上模糊,产生模糊的外观。

图片由作者提供。

游戏开发者大会上也展示了 NAS,这里有张幻灯片。对于那些想要尝试的人来说,NVIDIA 已经发布了可以为 Vulkan 编译的代码。你可能也有兴趣看看这个 SIGGRAPH 演示,NVIDIA 在这里展示了其早期版本的 VRS。

AMD 保真 FX

与微软和英伟达的解决方案类似,在他们的设计中, AMD FidelityFX VRS 依赖于估计相邻像素之间的梯度。

AMD VRS 使用 8×8 的拼贴大小,并分析 2×2 区域内的像素对。基于区块内 2×2 块中的像素对之间的最大亮度增量来设置阴影率。类似于上面的方法,该方法具有控制质量和节省之间的折衷的可调阈值。

如果包括运动矢量,该方法可以基于运动的强度减少增量。

即使网上没有很多关于 AMD 解决方案的资源,你也可以在代码中查看具体的实现

动态采样率(DSR)

与之前在空间域操作的方法不同,动态采样率分析离散余弦变换(DCT)空间中图块的频率信息。

该方法分析系数的 2D DCT 矩阵,以确定该图块的当前采样率是否是最佳的。DCT 系数被聚合成一个值,该值概括了图块中的高频信息量。当前帧的着色率基于预设的阈值和着色贴图的先前状态。

通过使用来自先前 VRS 图的信息来决定当前的着色率,该方法解决了时间不稳定性的问题。考虑一个静态场景的例子,在步骤[t-1],我们决定降低阴影率。我们的决定基于这样的观察,即估计误差略低于保持较高遮光率的阈值。在步骤[t],具有降低的阴影率的区块看到误差稍微增长并超过阈值。因此,我们增加了阴影率。在帧[t+1]处,重复这种情况。同一拼贴的阴影率的这种变化导致闪烁。

为了缓解阈值附近误差的微小变化导致闪烁的问题,该方法被实现为有限状态机。控制状态之间转换的阈值对于转换到增大和减小的遮光率是不同的。选择这些值是为了使值的微小变化不会导致图块的阴影率变化。

采样率最终状态机。Marti Anglada 提供的图片。

自适应采样和刷新率(ALSaRR)

本文中讨论的最复杂和感知最准确的可变速率着色工作称为自适应局部着色和刷新率感知模型。与其他旨在找到在质量和节约之间取得平衡的着色率的方法不同,该模型确定了固定预算下的最佳帧速率和 VRS 贴图。

该模型将运动矢量、亮度和 MIP ID 图作为输入。基于质量评估模型,该方法估计每个 VRS-map 配置的所有可能的质量水平。然后,该模型使用贪婪背包解算器,从粗略着色率图开始,并基于质量与带宽的排序比率逐渐增加着色率。

ALSaRR 管道。图片由阿克谢·金达尔拍摄。

流水线中最重要的部分是质量模块,它估计由较低的阴影率引入的误差。质量估计器完全基于感知模型。

图像质量模块。图片由阿克谢·金达尔拍摄。

当对图像应用降低的阴影率时,该模型假设傅立叶空间中的质量退化管道。在此管道中,纹理首先由小中见大贴图选择进行转换;然后,通过应用的 VRS 对图像的所选小中见大贴图进行下采样。然后,该模型假设显示对象的运动引入了模糊,这是保持类型和眼睛运动模糊的组合。在模糊滤波器之后,剩余的频谱通过对比灵敏度函数(CSF) ,滤除人眼不可见的频率。将结果与通过 CSF 的原始参考信号进行比较,并获得质量分数。

警告和总结

估计 VRS 图所花费的时间不应大于所带来的计算节省。因此,VRS 方法通常依赖于不需要太多计算工作的非常直接的计算机视觉技术。总体而言,由于问题的性质,第 2 层 VRS 在以更高的分辨率运行时会获得更高的性能增益。

上述每个 VRS 解决方案都降低到 2x2 着色率,因为较粗糙的着色会引入明显的伪像。

资源

YouTube 频道有很酷的计算机图形学讲座;

微软 VRS: 在 2021 游戏开发者大会上的演示2022 年 VRS 应用于 differed lightning2022 年 XboX 中的 VRS博文#1博文#2博文#3

NVIDIA VRS: 论文SIGGRAPH 演示文稿游戏开发者大会幻灯片代码

AMD VRS:AMD fidelity FX VRS 演示代码

DSR VRS: 动态采样率论文

ALSaRR VRS: ALSaRR 项目页面

在准备这篇文章的时候,我还发现了这篇关于可变速率阴影的博客文章,你可能会觉得有用。

上述方法假设 VRS 的硬件实现。也有基于软件的实现,允许在技巧上有更多的灵活性,如 CoD-VRS 。用于减少闪烁的一个非常酷的技巧是从依赖于多个先前帧的重投影帧中累积梯度,以试图平滑时间伪影,例如 VRS-map 闪烁。

喜欢作者?保持联系!

我错过了什么吗?不要犹豫,直接在 LinkedInTwitter 上给我留言、评论或发消息吧!

什么是用于分析的良好建模的数据?

原文:https://towardsdatascience.com/what-is-well-modeled-data-for-analysis-28f73146bf96

托拜厄斯·菲舍尔在 Unsplash 上的照片

建模数据是不够的——您需要做得更好

本文将限于对 读访问 数据建模,以便进行分析——即 I/O 的 O 部分。

我也不打算讨论数据质量或预处理,但我相信你不会忘记这些事情。

为什么您应该关心数据建模?

它是关于从您的数据中获取最大价值—快速、重复和稳健。

你想用你的数据,对吧?不然何苦呢?

当您有建模不良的数据时,请考虑一下。当然,您可以不假思索地将所有东西都倒入数据湖中,从而有效地创建了一个“数据沼泽”。对于数据工程师来说,这样做很快。但是,每次数据科学家或数据产品开发人员想要使用数据时,他们都必须花费几天到几周的时间来检查模式并迭代复杂的查询,直到他们以所需的结构获得所需的确切数据。换句话说,你已经做了一次简单的事情,你正在强迫你的合作者重复做困难的事情。

现在考虑当你有了模型良好的数据时。不可否认,数据工程师需要花更多的时间与领域专家、数据科学家和数据产品开发人员合作,才能很好地完成建模。但是,如果你“一次”这样做——不要忘记随着数据类型/需求的变化而进行维护和更新——那么你会让你的合作者的生活变得更容易。他们可以更快地找到数据,更快地查询数据,而且数据以他们需要快速移动的结构交付。你做一次难的事情,然后你可以重复做容易的事情。

这不是证据吗?

良好建模数据的各个方面

为了产生良好建模的数据,考虑以下七个属性:
我确定我遗漏了一些…但是七是个好数字…

1.存储数据的模式/形状

你可以有 6 桌,也可以有 60 桌(或更多)。您可以在不同的表中实现多对一和多对多关系,或者您可以找到将所有这些信息压缩到一个表中的方法。你可以选择实现一个星型模式,一个键-值模型,或者甚至尝试一个图模型

我不打算支持或反对任何特定的模式或技术。

存储数据的最佳模式取决于消费者的范围/需求,您知道他们是什么吗?在你知道之前,不要选择一种技术或模式。

考虑到在不同的模式/技术中隔离完全不同类型的数据可能是最好的——特别是当您的消费者被隔离时。不要假设所有数据都需要在一个集中的整体中——参见:数据网格

如果您的消费者用例足够多样化,您甚至可能希望在不同的模型中存储相同的数据。

根据经验,接吻——也就是说,保持简单,笨蛋。

2.查询的简单性

如果您的数据科学家和数据产品开发人员必须进行复杂的查询来获得他们需要的数据,以他们需要的结构,那么您就犯了一个对数据建模的错误。每次他们需要进行查询时,都要花很长时间才能正确形成每个查询。当他们或其他人需要调整一个复杂的查询来做一些不同的事情时,这也将花费很长时间。

一些注意事项:

  • 需要多少个表连接或图遍历?
  • 数据转换或计算是否发生在查询级别?
  • 每个查询中有多少个字符/行/循环?
  • 了解并避免 SQL 反模式

高级提示——考虑免查询。在你的数据模型之上实现一个 API 方法/微服务的中间层,它将从一个治理良好的、可测试的代码库中完成所有复杂的查询。微型插头——我的公司,tag . bio,有一个平台在这方面做得非常好。

3.查询速度

执行一个查询不应该花费几个小时。当然,这取决于数据量,但是根据经验,如果执行一个查询来获取少量的数据花费了过多的时间,即超过几秒钟,那么对于该用例来说,您就有了一个糟糕的数据模型。

监控性能,在 最终确定您的数据模型之前,让您的消费者开始查询数据

4.查询输出的模式/可理解性

数据科学家和数据产品开发者喜欢数据框架。对数据模型的查询会产生有用的数据框吗?数据框应仅包含原始值,即文本、数字、布尔标志,而非复杂对象。

例如,如果一个查询在嵌套了 JSON 对象的行中生成值——或者上帝不允许——XML 对象,您的数据科学家消费者将会讨厌您。

当然,也有可能您的消费者希望查询输出模式是另外一种模式——与他们一起工作,实现他们所需要的。

最后,数据模型的消费者需要理解他们在查询中得到的数据。数据字典很棒——但是请考虑使用人类可读的列标题。没有人理解设计糟糕的首字母缩写词——一年后的你也不会。

5.查询输出的数量

对大数据源的查询可能会产生大的结果集,这可能是也可能不是问题。显然,如果一个查询返回消费者不使用的列或行,那么就去掉它们— 我指的是列/行,而不是消费者。😃

有许多其他的设计模式和技术可以解决大型查询输出的“消防软管”问题——包括但不限于,以较小的块缓存和提供数据的中间层——但是我不能在这里一一介绍。

好了,这里还有一个选项——考虑实现一种方法,允许消费者从查询中获得随机的数据子集,并带有一个可选的种子参数。

不要想当然地认为“事情就是这样”。如果查询输出数量是一个问题,并且它降低了用户的速度,那么就修复它。

6.聚合与数据丢失

当数据科学家执行查询时,他们会感到非常沮丧,因为他们看到他们关心的数据已经“方便地”进行了汇总,例如“每月总计”,而他们想要的是粒度数据,例如“每日计数”。

此外,在数据模型中创建总计和平均值是“有损耗的”,也就是说,您会丢失来自输入源的信息。

同时,在消费者不需要时提供粒度数据会增加查询复杂性、查询计算时间和查询量。我特别想到了 IOT 的例子,传感器以毫秒的频率记录数据。也许你的消费者需要毫秒级的数据,或者他们只需要日平均值。

不要假设,去问他们。

考虑在原始(无损)和聚集(有损)结构中存储和建模数据。只要模式不会变得太复杂,您的消费者就会喜欢有选择。

7.测试、维护和新兴数据类型

你不能假设你的数据模型永远是完美的——需要改变,新的数据类型出现。但是你也不能随后心血来潮地改变一切,而不破坏生产中的用例。

为数据模型的维护和变更制定一个合理的计划。

特别是,当您调整数据模型以适应不断变化的需求/新出现的数据类型时,建立数据测试框架是监控生产用例中任何潜在问题的一个好方法。

作为数据工程师/数据建模师——数据测试是你的责任,而不是数据科学家和数据产品开发人员的责任。

结论

感谢阅读!如果你有任何想法或问题,请告诉我。

构建企业级人工智能应用需要什么

原文:https://towardsdatascience.com/what-it-takes-to-build-enterprise-grade-ai-applications-8dac496e7880

端到端思维的力量

索纳软件 2022

人工智能通常被称为第四次工业革命。毫无疑问,它正在彻底改变企业的经营方式。但构建企业级 AI 应用极具挑战性。我的数据科学职业生涯一直专注于帮助公司提供强大的人工智能解决方案。对于我目前在 Sonasoft 的角色来说尤其如此,我在那里花时间构建端到端的人工智能应用。

随着时间的推移,我已经确切地了解了如何大规模交付可靠而健壮的人工智能,我想分享其中的一些见解。

什么是企业人工智能?

当大多数人想到人工智能时,他们会想到自动驾驶汽车、计算机生成的艺术,或者通过从氨基酸序列预测蛋白质结构来推进药物发现。这些都需要在 AI 研究的前沿发展深度学习和大规模神经网络。但是它们与大企业有多大关系呢?好吧,如果你的生意是制造汽车或销售毒品,它们是 100%相关的。然而,对于大多数企业来说,构建和部署它们是不必要的复杂和昂贵。这就引出了一个问题。人工智能究竟能为大多数企业做些什么?

几年前,麦肯锡分析了许多垂直行业的数百个人工智能用例。他们的发现相当惊人。人工智能最有价值的用例出现在它被用来推动现有的商业智能和分析的时候。换句话说,坦白地说,大型企业的最佳人工智能用例是最平凡的。不过,这不应该让人感到意外。首先,如果你已经对你的数据有了很好的理解,那么你就有可能创造出更强大的人工智能解决方案。其次,对许多企业来说,重要的是提高效率、节约成本以及由此带来的更高利润。这些通常是通过复合的渐进式变革而不是一次性的革命性变革来实现的。

根据我的经验,三种形式的人工智能对企业的影响最大:

  1. 预测。商业的许多方面都依赖于对未来结果的准确估计。下周需要多少库存来满足需求?下个月的价格会是多少?所有这些问题都可以用预测模型来回答,预测模型将历史数据与当前状态结合起来,以预测未来的状态。
  2. 异常检测。通常在商业中,你需要发现流氓或异常事件。例如,这种交易是合法的,还是可能是欺诈性的?这个文件应该被访问吗,还是有黑客试图窃取我的数据?这就是异常检测模型脱颖而出的地方。
  3. 分类。销售团队需要区分哪些销售线索是最有力的,哪些应该被忽略。同样,如果你从事贷款业务,你需要知道哪些人是好的信用风险者。这些只是分类模型可以帮助您做出更好决策的几个例子。

如上所述,人工智能的一个关键胜利是帮助企业通过可靠和具有统计意义的数据洞察力做出决策,数据是关键词。

数据是基础

我怎么强调数据在实现人工智能驱动的提升中的基础作用都不为过。企业人工智能的成功将取决于您可以访问的数据的数量、质量和范围。许多人工智能应用依赖于监督学习,为此你需要精确标记的数据。即使在使用无监督学习进行异常检测时,数据越多,结果就越准确。深度学习算法通常是数据饥渴的,需要大量的训练数据来确保它们的许多参数得到调整,以确保最终的模型能够很好地推广到看不见的场景。

当然,数据量并不是一个充分的限定条件。 CRISP-DM 是一个广泛用于数据挖掘和数据科学项目的框架。六个步骤中有两个与数据直接相关;数据理解和数据准备。我坚信,数据科学家必须了解数据是如何获得的,并且应该尽可能多地参与数据工程过程。每当我为一家公司做一个新的企业人工智能项目时,我总是坚持要访问他们所有的数据。我指的是他们所有的数据。我还与他们的主题专家(SME)交谈,以了解数据是什么,数据来自哪里等。如果您无法选择自己收集和设计最终数据集,那么花时间了解采样过程和任何决策是非常重要的,要特别注意潜在的数据泄漏源。

索纳软件 2022

下一个关键步骤是获得所有数据的整体视图,以确定它是否适合人工智能。我关注的主要问题包括:

  • 数据有什么特点?是否需要监督学习,如果需要,目标的性质是什么?了解您试图预测的标签是否不平衡将对数据预处理步骤产生重要影响。它还会影响用于评估最终模型性能的指标的选择。
  • 时间在数据中扮演什么角色?尽可能多地给数据打上时间戳有助于确保避免包含只有在预测目标值后才可用的特性。
  • 数据中有什么空白吗?如果是,它们是否重要?了解这些差距的来源及其性质(随机遗漏“MAR”或非随机遗漏“MNAR”)将决定适当的处理方法,每种方法都有其优点和缺点。
  • 数据中是否存在季节性或其他基于时间的模式?如果是,如何最好地利用这一点?
  • 有什么显著的相关性吗?如果是这样,中小企业能对此给出合理的解释吗?这对于区分真实关系和杂散噪声非常重要。
  • 任何外部数据可能有助于扩充这些数据吗?例如,这些数据会受到天气的影响吗?

所有花费在评估数据潜力以解决已确定的业务问题上的时间都是值得的。这降低了下游浪费时间和资源的风险。只有当我确信已经以应有的谨慎和关注完成了数据工程,以避免做出错误的假设和引入偏见时,我才会转向数据工程。

避免假设和偏见

我们人类容易出错,有偏见,这就是为什么我们收集的数据遭受同样的问题不足为奇。有缺陷的数据有许多来源,如导致数据不完整的收集做法、当前数据中固有的历史不平等或反映证据不足的假设的数据。通常,公司文化和对数据的信念如此根深蒂固,以至于你甚至意识不到自己在做假设。例如,“我们总是在月底看到收入增加,因为那是人们发工资的时候。”这很可能是真的,但也可能是因为您的系统总是在每月的最后一个工作日进行用户直接借记。这种假设可能会导致从模型中排除高价值的特征。

自然,机器学习算法反映了它们的制造者或用于训练它们的数据的偏见,在某些情况下甚至可以放大它们。这就是通常所说的算法偏差。最著名的算法偏差案例之一在 COMPAS 系统中得到了证明,该系统是为预测罪犯是否有可能再次犯罪而开发的。该算法的性能在整体准确性方面进行了优化,但对非裔美国人的再犯率的假阳性预测是白种人的两倍。

即使发现了数据中的偏差,也常常会采取幼稚的方法来解决它。例如,如果您怀疑存在性别偏见,您可以选择在用于定型模型的数据中隐藏性别。然而,不能依靠这个来消除实际的偏差,因为性别可能会影响数据中的其他特征。即使是最大的跨国公司也会被这一点所困扰,正如苹果公司在首次推出信用卡时所发现的那样。尽管有一个系统忽略了申请人的性别,但它仍然给女性较低的信贷限额,这是由于对历史上有偏见的数据集的训练以及从其他数据中推断性别

人工智能解决方案必须达到与我们对人类决策者的要求相同的可信度。这取决于他们的人类开发人员,以确保这是交付。数据科学家需要识别这些典型的陷阱,然后主动寻找由此产生的偏差。偏差测试应该是每个人工智能产品开发周期的一部分,评估输入的数据和最终的模型结果。一旦出现任何偏差,就应该在用例的上下文中考虑可能结果的伦理。然后,企业的公平政策和目标应该规定适当的步骤来减轻它。

性能意味着可扩展性,而不是完美

每个数据科学家都想创造价值。Value 通常(也是错误的)被定义为在尽可能广泛的输入数据范围内提供最佳性能的模型。从表面上看,这似乎值得称赞。毕竟,一个不准确的人工智能模型往好里说是无用的,往坏里说是有害的。然而,这是一个灰色阴影的例子。完美的模型是不存在的,专注于寻找一个会导致很多问题。首先,它很可能会大大减慢这个过程,这会影响对人工智能程序的支持。但更糟糕的是,它还经常牺牲真实世界的模型性能。如果您的生产环境缺乏对神经网络的硬件支持,那么开发一个巨大的神经网络模型是没有意义的。最后,最准确的解决方案并不一定能在业务底线方面带来最好的改善。正确预测的收益几乎永远不会等于错误预测的成本,忽略这种不对称会严重影响交付的净值。

不要追求完美,你应该寻求找到一个对手边的用例足够好的模型,用一个经过深思熟虑的基准来定义“足够好”。随着更详尽的模型竞争和更智能的超参数调整,解决方案的升级将在以后进行。在考虑部署之前,您需要问自己几个重要的问题:

  • 这个模型能在大规模下足够快地运行吗?
  • 您能否将该模型部署到您现有的后端系统中?
  • 您能够连接所需的数据馈送吗?
  • 您将如何访问模型输出并利用它们?

当然,您还需要做一些功课,了解最终的模型输出将如何被利用,以及所涉及的好处和风险。采取这种方法将会看到你的业务投资更快和更真实的回报,以及更高的获得高级管理层支持的机会,这对于完成人工智能转型计划至关重要。

最重要的是,任何人工智能应用的构建都应该考虑到其业务影响。这需要更多的考虑,而不仅仅是模型对于给定的评估指标的表现如何。因此,对待你的人工智能应用程序,就像对待你开发和构建的任何其他任务关键型软件一样,要使它们健壮、可扩展和可维护。

监控所有事情

MLOps(机器学习操作)是一种将 DevOps 背后的原理应用到机器学习领域的方法。目标是简化人工智能应用程序的生产过程。但是,看到一个人工智能应用程序部署到生产中并不是人工智能生命周期的结束。MLOps 还与已部署解决方案的监控和维护(或操作)相关。一旦部署了一个解决方案,您需要确保它继续按预期执行。这是确保成功的关键一步。有几个方面需要关注。

数据完整性

拥有始终准确可靠的数据对于保持人工智能应用程序的性能绝对至关重要。但是,考虑到所涉及的复杂系统的动态特性,维护高水平的数据完整性是很困难的。不良数据的检测并不简单,因为部署的应用程序可能会继续产生结果,尽管存在任何数据问题。因此,您需要主动监控数据,以发现诸如太多缺失值、范围违规和类型不匹配等问题。

系统健康

人工智能应用天生就是处理器和数据密集型的。这使得它们容易受到后端性能问题的影响。监控 CPU、内存、磁盘和网络使用趋势的偏差至关重要,这样才能发现可能影响解决方案全面运行的问题。

模型漂移

即使是高度精确的模型也会随着时间的推移而出现缓慢的性能下降。这是因为他们接受了在一系列条件下获得的一组给定数据的训练,这些条件随着时间的推移不可避免地会发生变化。这被称为模型漂移,有多种类型。

概念漂移描述了模型的输入数据特征和目标变量之间关系的变化。例如,假设您有一个帮助提高股票分销效率的模型。在训练模型时,它是基于您现有的手动股票分配。但是一旦模型开始运行,模型特征和实际库存水平之间的基本关系就会改变。这是因为您不再依赖手动方法。换句话说,有一个漂移纯粹是模型存在的结果。这种漂移通常伴随着解决方案性能的下降,因为它表明正在建模的关系发生了变化。监控评估指标是否与开发阶段设定的预期性能水平不同,这可能是概念漂移的信号。

标签漂移是指目标变量的真实值与训练中看到的值相比的可能性变化。例如,疫情爆发时,抵押贷款违约率较高。在预测偿债可能性的模型中,这将表现为标签漂移。理解地面真相的分布是如何变化的,将有助于理解正在发生的变化。

然而,只有当与模型预测相关联的标签可用于比较时,才能监控概念和标签漂移。考虑到地面实况可能只有在预测做出并被利用很长时间后才被返回,寻找其他不依赖于标签的漂移是很重要的,这些漂移可以给出近期性能问题的线索。

特征漂移指生产数据中输入数据特征的性质相对于训练期间设定的期望值的变化。数据中的这些变化通常反映了以前在训练模型时看不到或不太常见的业务或环境条件的流行程度。例如,银行内部信用贷款标准的变化将触发偿债模型所使用的信誉的特征漂移。

预测漂移,或监控预测输出分布的变化,可以帮助检测输入数据特征性质的多元变化。部署后批准向传统上信用较差的客户贷款将导致偿债结果的概率分布发生变化,违约的总体可能性更高。

监控和补救上述情况通常需要专业工具。有许多人工智能和 MLOps 平台旨在提供帮助,尽管它们通常需要经验丰富的数据科学家。关键是要快速确定任何问题的根本原因。这应该是您在选择 MLOps 工具时考虑的关键性能指标。这将减少糟糕的模型性能对利用模型数据产品的业务操作的影响。

AI 是一个端到端的问题

我经常看到一些公司认为他们可以以零敲碎打的方式解决人工智能问题。他们意识到人工智能将帮助他们,因此他们注册了一个承诺为他们转变业务的人工智能平台。然后他们试图开发一个有效的人工智能模型。他们很快发现他们需要专家的帮助,所以他们雇佣了一个数据科学家团队。几个月后,他们有了一个工作模型,DevOps 团队被要求将其集成到生产中。此时他们碰上了各种各样的疼痛。一旦部署完成,团队认为可以让模型自己继续工作。但是几个月后,他们发现模型的预测不再提供商业价值。

索纳软件 2022

构建成功的企业 AI 应用实际上需要端到端的方法。在这个过程的每个阶段,你都需要记住你的应用程序需要被部署。它需要及时获取数据。它需要能够在您的生产系统中大规模运行。它需要向需要的人提供可操作的结果。最重要的是,它必须与您现有的业务流程无缝融合。这种端到端的观点是成功和失败的关键。

确保整个团队都参与进来

任何成功的企业人工智能项目的最后一个要求是获得公司其他部门的支持。在过去的几年里,艾的名声一直不好。一个被广泛引用的统计数据是,87%的人工智能项目没有进入生产阶段。

造成这一统计数据的因素有很多。首先,人们普遍不信任人工智能,许多员工认为它会导致机器接管他们的工作,或者比人类主导的系统做出更有偏见、更不准确的决定。这通常源于缺乏让人工智能变得可解释的努力。术语可解释的人工智能(XAI) 指的是一套帮助人类理解并因此信任人工智能解决方案产生的结果的过程和方法。利用 XAI,并花时间表明最终目标是帮助他们把工作做得更好,应该会大大提高他们的认同度。

其次,许多人对人工智能的表现做出不切实际的断言。他们承诺让你的成本减半,或者生产率翻倍。现实是,在大多数运营良好的公司,人工智能会给你带来 10%到 20%的额外优势。但这可能会转化为利润的大幅增长。

最后,人工智能转型通常需要改变公司文化,这必须来自最高层。这可能意味着帮助首席执行官和首席技术官了解人工智能应用的潜在提升,以及推迟不可避免的事情而落后于竞争对手的风险。

结论

AI 绝对是改变游戏规则的技术。但是构建和部署成功的企业人工智能应用程序是困难的。如果你想精心打造一个成功的 AI 应用方案,那就为生产而建,设定现实的预期。并且总是把它当作一个端到端的问题来对待,以增加你做对的机会。

在每天使用 Git 个月后,我学到了什么

原文:https://towardsdatascience.com/what-ive-learned-after-using-git-daily-for-6-months-cef247e0b45d

我想我明白了

克里斯·林内特在 Unsplash 上的照片

这篇文章是写给那些刚开始学习 Git,立志学习 Git,或者已经使用过 Git 但没有积极使用的人。我曾经属于“用过 Git 但不要积极使用它”的群体。

学习 Git 可能会让人望而生畏。希望我在过去 6 个月里学到的 Git 命令列表会让这个任务看起来更简单。您可以将这些看作是 Git 命令的一种最简单的列表,您可以学习这些命令,从而确信您已经掌握了足够的知识,可以为项目做出贡献。

为了查找我分享的 git 命令的用法,这里有一个我过去用过的 Git 参考指南:【https://git-scm.com/docs

这里也有一个来自 Github 的有用的备忘单,我在过去也提到过:https://education.github.com/git-cheat-sheet-education.pdf

跳槽前认识的饭桶

我的职业生涯始于一名数据分析师。在我的分析师角色中,我只是偶尔使用 Git 所以可能一个月只有几次。我所在的公司并没有使用 Git 来进行版本控制。相反,我们会有版本文件夹,在那里我们保存新版本的代码,每个月/sprint 我会为更新的代码创建一个新文件夹(听起来熟悉吗?).我个人认为,如果所有数据专业人员正在编写代码,他们都应该使用 Git。公平地说,在我离开之前,这家公司试图将 Git 作为最佳实践来实施,但当一家公司在没有 Git 版本控制的情况下发展其分析部门时,让每个人都改变并开始使用它似乎几乎是不可能的。

3 年后,我转行做了数据科学家。以下是我在从事数据分析师工作时知道的 Git 命令(按照我学习的顺序排列):

[git config](https://git-scm.com/docs/git-config)
  • 当您开始使用 git 时,系统会提示您设置用户名和密码,您需要使用 git config 来设置它们
[git clone](https://git-scm.com/docs/git-clone) <link to remote repository>
  • 将远程存储库的文件复制到本地存储库
[git add](https://git-scm.com/docs/git-add) <file name or just use . to add all files>
  • 暂存更改,为提交做准备
[git commit](https://git-scm.com/docs/git-commit) -m <commit message here>
  • 提交或“保存”您的所有更改,并准备将它们推送到远程存储库
[git push](https://git-scm.com/docs/git-push)
  • 将您的更改推送或“保存”到远程存储库
[git pull](https://git-scm.com/docs/git-pull)
  • 用远程分支上所做的更改更新您的本地存储库
[git pull origin](https://git-scm.com/docs/git-pull) <branch name (typically master)>
  • 用远程分支的更改更新当前分支

基本上,我知道最基本的 Git 命令——足够开始使用了。我从未使用过git init,因为我通常会创建一个新的主分支或者使用git clone😅

我还在 VS 代码中使用 Git,这样我就不用一直使用上面提到的一些终端命令了。然而,使用 VS 代码“源代码控制”侧边栏扩展的缺点是缺乏灵活性。最终使用终端变得更加容易。当我在多个 Github 库之间切换时尤其如此。

我在过去 6 个月中学习的 Git 命令

好了,这里是我现在知道的 git 命令(除了上面的列表)。如果你知道这些,你应该知道足够有意义的贡献。我试着按照我学到的命令的顺序列出这些命令。

[git status](https://git-scm.com/docs/git-status)
  • 这将显示所有已更改并准备登台的文件(git add)
[git clone](https://git-scm.com/docs/git-clone) --branch <branch name> <repo link>
  • 使用它来克隆远程存储库中的特定分支
[git branch](https://git-scm.com/docs/git-branch)
  • 显示本地存储库中的分支列表
[git branch -d](https://git-scm.com/docs/git-branch) <branch name>
  • 从本地存储库中删除一个分支
[git checkout](https://git-scm.com/docs/git-checkout) <branch name>
  • 从远程存储库中检出(切换到)一个分支
[git checkout -b](https://git-scm.com/docs/git-checkout) <new branch name>
  • 创建一个新分支,它是您当前所在分支的克隆
[git push --set-upstream origin](https://git-scm.com/docs/git-push) <branch name>
  • 每当我在本地创建一个不在远程上的分支时,我都使用这个命令在远程上创建分支。通常在使用git checkout -b后会用到这个。
[git reset](https://git-scm.com/docs/git-reset)
  • 删除所有暂存的更改
[git reset --hard](https://git-scm.com/docs/git-reset)
  • 将文件重置为上次提交时的状态(使用该选项时要非常小心,因为您正在删除 Git 历史记录)
[git restore](https://git-scm.com/docs/git-restore) <file name>
  • 将您的文件恢复到最新提交的状态
[git diff](https://git-scm.com/docs/git-diff)
  • 检查您的更改与上次提交之间的差异
[git log](https://git-scm.com/docs/git-log)
  • 查看您在该分支上的提交历史
[git stash](https://git-scm.com/docs/git-stash)
  • 将所有更改放在一个工作目录中,以避免在切换分支之前必须暂存和提交您的更改
[git stash list](https://git-scm.com/docs/git-stash)
  • 显示所有隐藏更改的列表
[git stash pop](https://git-scm.com/docs/git-stash)
  • 将您的最后一次储存应用到您当前的分支,并将其从储存列表中移除

你可能会惊讶于git mergegit rebase不在名单上。从技术上来说,我用过一两次,但是我没有把它们包括在内,因为我还没有信心使用它们。我通常会使用 Github 进行合并,因此学习这些还不太相关。

我学到的最佳实践

这些最佳实践是我根据经验学到的。我将快速列出我认为需要牢记的重要事项:

  • 在您暂存(git add)您的更改之前,请保存所有文件,因为git add只会暂存您已保存的更改。我通常喜欢在登台之前关闭 VS 代码中的所有选项卡,以确保没有遗漏任何需要保存的文件。
  • 您不必在每次提交后都进行推送。我通常会添加一些提交,然后在切换分支或注销之前一次全部提交。
  • 在切换分支之前保存并提交所有更改
  • 当我写提交时,添加一个#后跟 Git 问题号,这样您的提交就会出现在相关的 Git 问题中
  • 在创建主程序的新分支之前,一定要做一个git pull来确保你的新分支是基于最新的代码
  • 如果我使用git stash,我会尽可能快地弹出并清除列表
  • 合并旧分支后,立即将其从本地存储库中删除,以保持本地存储库分支列表的整洁
  • 不要让你的 git 分支比 sprint 更老,因为你离开它们越久,它们就越难合并。如果他们需要进行另一次冲刺,使用git pull origin master将主分支合并到你的分支中,并用最新的变化更新它。
  • 在 git 中,通常可以引用由空格分隔的多个文件。例如,当您使用git branch -d <branch name>时,您可以一次删除多个分支,只要您用空格将它们分开。

下一步是什么?

我想我想学习git rebase以及如何粉碎承诺。我还听说git revertgit reset更安全,所以我也要调查一下。在接下来的 6 个月里,我们将看看我是否能学会这些以及我还能学到什么!

感谢阅读!如果你喜欢读这篇文章,请在 LinkedIn 上与我联系,并查看我的其他文章。

如果你是中级新手,可以考虑使用下面的我的推荐链接订阅👇

https://medium.com/@andreasmartinson/membership

参考

  1. 南 git-scm.com,沙孔和 b .施特劳布
  2. github.comGit 备忘单

我从构建自己的数据科学课程中学到了什么

原文:https://towardsdatascience.com/what-ive-learned-from-building-my-own-data-science-courses-49fc67353ea2

照片由 @melpoole @unsplash.com 拍摄

我在数据科学领域工作了将近十年。虽然我有机会为不同的公司和行业工作,但我仍然觉得我作为数据科学家的经历中缺少了一些东西,因为我想回馈全球社区。除了管理 DareData 工程,帮助世界各地的客户和在当地社区教学,我仍然觉得我想建立一些东西来帮助初学者启动或改善他们的职业生涯,并最终改善他们的生活。

在与我帮助过的公司的不同团队和人员合作时,我注意到许多人在网上课程中遇到了困难,因为他们大多数人都匆匆忙忙地学习基础知识——跳到华而不实和性感的东西,或者对观众建立了太多的假设。谁愿意花 1 个小时学习一个单独的 if 命令或者一个 R 索引器?

从我的经验来看,很多人。

有很多人在数学、统计或编程方面没有任何背景,他们渴望学习,就像其他学生一样。这是我建立课程时唯一的主要假设——创造一些初学者无需任何先验知识就能掌握的东西,并想象我的课程将是他们的第一个“着陆点”。

到目前为止,我已经完成了 4 门与数据科学和编程相关的课程——我的课程包括 R 编程、自然语言处理基础和一般数据科学。自从一年前开始,我已经在 Udemy 上建立了一个超过 3000 名学生的社区——建立了有意义的关系,并将我的沟通技巧提高了十倍。

在本帖中,我将分享一些关于内容创作的见解,从可以帮助你制作自己的课程的技巧到你在制作过程中可能学到的东西。

你通过教学来学习

这是一句老话,但我在为我的课程教授和研究材料时确实感觉到了。

数据科学可能是世界上最广泛、发展最快的行业之一,因为它包含许多不同的学习途径。如果你参与了很多项目,从专业上来说,学习新事物或巩固已知概念的时间是有限的。我学到的一件事是,教学是弥合几个概念——无论是编程概念还是不同算法的数学假设——中“松散差距”的最有效方式之一,教学并帮助学生解决他们的问题是积累知识的最佳方式之一。

相信我,没有人希望(尤其是老师)在回答学生问题时措手不及。当然,声明你没有意识到一些你没有尝试过的概念并没有什么坏处——这完全没关系。但是这些问题会激发你的好奇心,让你学到更多。

在我的课程开发过程中,我主要通过两种方式学到了很多东西:研究资料和帮助学生。

学生有一个初学者视角,他们通常会提出非常有创意和重要的问题。这些问题与了解每个概念的基本原理和玩“假设”场景特别相关。

你建立一致性

要建立新的课程或改进现有的课程,你必须始终如一。你必须经常根据听众的反馈改进材料。此外,竞争总是存在的,其他教师总是建立不同的课程,以达到他们的观众。

对于那些想把网上教学作为一种严肃爱好的人来说,你必须以制作高质量的内容为目标。为了做到这一点,你必须建立一致性,将研究、编写材料、编辑和帮助学生纳入你日常工作的一部分。这并不容易,因为我们大多数人都有日常工作和其他个人事务,自然会占据一天中的大部分时间。

你为成为一名成功的在线教师而建立的一致性将对你的个人生活和职业生活都有用。对我来说,这无疑有助于培养习惯,让我成为更好的专业人士。

解释每个概念,至少一次

当解释复杂于其他指令的高级概念或代码时,在课程中第一次出现时解释基本思想总是一个好主意——如果你没有这样做,至少给学生指出一个资源,在那里他们可以了解关于该指令的更多信息。

一个简单的例子是使用 Python 为循环做一个,以举例说明一些概念——比如遍历几个模型结果。不要假设你课程中的每个人都知道循环在那种语言中是如何工作的。花 30 秒时间解释概念背后的主要思想,或者让你的学生找到一些可以解释的资源。

从一开始就确定目标受众

当构建新材料或从头开始第一门课程时,最重要的是你的听众的目标。你已经确定你的目标受众了吗?你是希望帮助新手开始你的行业之旅,还是帮助经验丰富的专业人士表演新把戏?

你的听众目标将最终决定你作为一名教师的成功。如果你找到了一个可以享受你的内容并从中获得价值的利基市场,你就找到了当老师的最佳时机!

但是..这个最佳点并不容易找到——它需要大量的测试和试错实验。市场很大,有很多角度可以选择,所以你可能会迷路。首先,定义几个目标人物角色。不要害怕失败。一些例子:

  • 计算机编码初学者;
  • 商业分析师;
  • 机器学习工程师;
  • 数据工程师

例如,在我的《绝对初学者 R 编程》课程中,我定义了以下三种受众:

  • 从事数据工作但从未编码的专业人员;
  • 业务分析师可能会编写代码,但主要使用拖放工具;
  • 数据科学学生;

这是三种完全不同的受众,但他们有一些共同点:他们想学习如何在数据科学和分析的背景下编码

有一个“单一”的目标受众可能会使你的课程过于具体,从而降低注册的可能性。太广泛的目标受众会让你的课程过于宽泛,从而更难抓住受众的需求。

最好的事?你的目标受众是可变的。在你教书的时候,你可能会发现新的目标受众,那些你从未想象过的受众。没关系!不要仅仅因为你认为他们是“正确的人”,就停留在你最初目标受众的某一部分。

最重要的是尽快让学生参与进来,这样你就可以得到对你的材料的反馈。

瞄准基线,快

这可能是我给那些想开始建立自己内容的人的最好建议。把你的内容拿出来..现在!

一旦收到不太积极的反馈,追求完美只会让你感到沮丧。在最初的几门课程中,你不太可能达到目标。从长远来看,学生的反馈比完美更有价值。

开始构建课程,从头开始准备材料,宜早不宜迟。虽然以更好更一致的材料为目标总是一个好主意,但是试着尽快为你的课程设定一个基准版本。

一旦你认为你的课程涵盖了大部分要点,就发表吧!再一次,以我的 R 编程课程为例,当我设计课程的时候,我已经有了一些关于处理外部文件和统计数据的章节。但是这两个部分对于想学习如何用 R 编写代码的人来说并不重要,这就是为什么我在发布第一批材料几个月后发布了它们。

我从最初的学生那里得到的反馈是改进我的课程的关键——这真的是使我成为最畅销老师的成败关键。

对待你的课程,就像你在制造一个产品,它是一个 MVP。沿着这条线迭代。真正重要的是你的目标受众对你内容的看法。

你会帮助别人

在开发课程的过程中,你还会发现最令人欣慰的一件事是,你的课程将帮助某人推进他们的职业生涯或重新转变他们目前的职业道路。当知道我的内容正在帮助一个离我 18000 公里远的人时,我激动不已。

在我的教学之旅中,我被来自世界各地学生的信息所淹没。这无疑给了我一股能量,让我不断进步,不断创造可以改善人们生活的有趣内容。我收到的消息范围很广,从试图通过数据科学考试的大学生到由于能够开始编码而能够在工作中更有成效的人。

练习,练习,练习

为了构建更好的材料,大多数在线教师倾向于关注视频和声音资产,而不太重视学生可能从中受益的练习和其他实用内容。

我所学到的是,一本好的简明的练习册,其中包含将“理论”例子与现实生活中的例子相结合的实践练习,是提高课程质量的最佳方式之一。

不要把你为课程设想的练习和实践部分留到第二计划中。

仔细思考练习,站在学生的角度考虑问题。相信我,很难做好练习来避免学生的挫败感,但是一旦你能够做好练习,你将拥有一门更有价值的课程,让更多的人受益。

第一次课程后不要放弃

一些课程最终比其他课程拥有更多的学生。这就是商业运作的方式——如果你的第一门课程最终获得了一些动力,不要得意忘形,如果你的第一门课程没有达到你为自己设定的目标,也不要失去希望。这两种结果都是完全正常的,也是经历的一部分。

学习如何建设好的课程是一个持续的项目,在你找到你的听众并能够提供帮助更多人的好材料之前,需要时间和一些迭代。不要在第一次尝试时就放弃,并且永远以进一步提高为目标。

就个人而言,我为绝对初学者重新录制了几乎整个 R 课程。第一次拍摄还可以,我已经上传到了 Udemy,但是几个月后,我注意到我的作品好多了。用我新发现的“经验”改进材料并重新录制大部分课程是有意义的。我们都从经验中学习,如果你想成为一名成功的内容创作者和在线教师,你能做的最好的事情是..开始!

感谢你花时间阅读这篇文章!一些关于我的观众数量的统计数据——目前,我在 Udemy 上有大约 3000 名学生,来自 100 个国家。我一年半前就开始了,自从在平台上开始以来,我已经开设了 4 门课程。

这是一次宝贵的经历,让我认识了更多的人,围绕 DS 进行了更有意义的对话,帮助了更多的学生,并从一项爱好中获得了一些收入。当然,这也是一个需要花费几个月大量工作时间的爱好,所以一定要确保你每周能节省 4 到 5 个小时来创作新的内容,并重复当前的内容。

你可以在下面的链接中找到我的课程,我希望你能成为我的学生!

机器学习从业者能从训狗师那里学到什么

原文:https://towardsdatascience.com/what-machine-learning-practitioners-can-learn-from-dog-trainers-b8eaa6a63656

训狗不是火箭科学,但它接近于数据科学

见见普拉达。普拉达是有史以来最好的狗——一只美丽、可爱、有爱心、真正伟大的动物。10/10 的好狗狗。

普拉达:一只非常好的狗狗

我的朋友一年前救了普拉达,并对训狗产生了热情。他向我解释说,训狗分两步走。第一步,你教好狗狗你想要的行为。第二步是将这种行为与某个触发器联系起来。

实现第一步就是一遍又一遍地重复这一行为,无论何时只要它们这样做了,就用赞美和款待来奖励它们。

实现第二步有点复杂。你想让狗明白什么信号应该触发你训练的行为。

在某种程度上,第二步的过程与训练模型的方式非常相似。

利用训犬来建立对模型训练的直观理解

让我们想象一下,你刚刚救了一只 10/10 的好狗狗,你想教它伸出爪子。你决定,从现在开始,在你每天晚上去公园散步之后,你将开始训练它。你开始你的第一次训练,并在每次它抬起爪子时奖励它(教它行为)。

最初的几个训练实例

经过几次训练后,你的狗狗开始自己抬起爪子了!这是一个令人兴奋的发展——你的动物现在知道这种行为,并把抬起爪子的事实与表扬联系起来。是时候教它把抬起小爪子和口头暗示联系起来了。回教室去!

我们快到了。

经过几次训练之后——现在你每次使用语言提示时,你的狗都会给你它的爪子!你非常兴奋,你想把这个展示给你所有的朋友。

你决定在你家组织一个小聚会,有一些好吃的小吃,一些好听的音乐,还有一些好朋友。每个人都到了之后,你决定表演时间到了。你蹲在狗狗旁边,开玩笑地说:“给我爪子!”但是你的狗不动。你再重复一遍命令。什么都没发生。

你开始大量出汗。您用不同的声音再试一次,但没有任何变化。你意识到此时什么都不会发生。

你现在成了小组的笑柄——这正是迈克所期待的。自从你前几天在餐厅公开不同意它对电影《所有地方的一切立刻》的评论后,他就一直在寻找一种方法来奚落你,显然他现在有了。

该死——发生了什么事?

从噪音中解析信号

在你这边看起来“清楚”的东西,在你的狗那边可能就没那么清楚了。因为在它这边——这是它收到的输入:

导致“麦克事件”的输入

从这些输入中,很难理解你的口头暗示,以及他所学的行为,是所期望的。

这里的教训是:如果你想让你的狗在任何地方(在家里,在公园,在街上)回应你的暗示,无论环境如何(周围是否有人),无论你说它的方式如何(无论你大声喊,轻声说,还是在与你的伙伴讨论时说),无论你的身体语言如何(无论你是否伸出手),无论你是说暗示的人还是其他人,你都需要相应地训练它。

这就是机器学习和我们所说的泛化的相似之处。您希望您的模型在大多数情况下都能正常工作,包括存在以前无法预见的数据的情况。您希望您的模型能够理解“真实”信号,并且不考虑来自每个观察值的个体可变性或随机特征的噪声,这些噪声在模型的决策过程中实际上不应该有任何重要性。

在上面的例子中,通过在始终相同的受控环境中训练你的狗,它最终使用了信号(声音提示和行为)和噪音(在公园里,你蹲着,你使用自信的声音,等等。)来做决定。

你的狗对训练数据过度拟合,结果,它在训练阶段有很好的表现(因为它对训练集拟合得很好,甚至拟合了噪音),但它没有很好地概括学习——即,口头提示在不同的设置中工作得不好。

关于这种平行的有趣之处在于,它还允许对过度拟合如何发生(当你有许多不同的特征可能最终混淆你的模型时)以及修复它的一些策略(在这种情况下,在不同的设置中训练你的 doggo 朋友,以便它能够更好地区分噪声和信号)建立直观的理解。

但是我们知道真正的信号是什么吗?

你的狗狗现在每次都伸出爪子——有时你一张嘴就伸出爪子。这让你感到奇怪——怎么会这么快?它是否对你将要说的话产生了某种直觉?

也许答案是你认为是信号的东西(你使用声音提示的事件)并不是。真正的信号是你希望你的狗伸出爪子。也许在某些情况下,你通常希望这样,或者有一些迹象表明,你可能在某个特定的时刻希望这样——你的狗处理、学习的信息,现在能够用来使它的预测更加准确。从你的角度来看,这是奇妙而神奇的——从你的狗的角度来看,这只是重复的观察。

机器学习有趣的一点是(不幸的是,你在训练狗时没有),你有工具从你的模型的角度看问题。您可以访问训练数据、评估指标、特性重要性,并且您可以(在大多数情况下/非黑盒模型中)了解决策是如何做出的。

这肯定没那么神奇——但至少当你的利益相关者问你它是如何工作的,为什么它会以这种方式工作时,你可以很容易地给出答案,并确保他们最终会使用你的工作。

希望你喜欢阅读这篇文章!我总是很兴奋地发现数据科学和其他领域之间的相似之处。如果你知道任何其他有趣的,请在下面的评论中分享!如果你想更多地了解我,这里有几篇你可能会喜欢的文章:

</7-tips-to-avoid-public-embarrassment-as-a-data-analyst-caec8f701e42> https://medium.com/@jolecoco/how-to-choose-which-data-projects-to-work-on-c6b8310ac04e

什么是好的数据管道——数据工程师的生产前清单

原文:https://towardsdatascience.com/what-makes-a-good-data-pipeline-a-pre-production-checklist-for-data-engineers-8eb0328327b6

成为数据工程师最重要的部分是构建高度可伸缩和可靠的数据管道

在我以前的一篇关于这个主题的文章中,即学习数据工程的核心——构建数据管道,我谈到了构建数据管道(也称为提取、转换和加载(ETL)管道)的 8 个关键组成部分

在今天的文章中,我将更详细地解释是什么使得数据管道适合在生产环境中部署。希望这也能在您将业务关键数据管道部署到生产环境之前,为您提供一种“清单”。

我将首先解释在生产环境中数据管道可能出错的地方,然后解释需要做些什么来(尽可能)防止管道出错,并确保在管道出现错误和故障时安全快速地恢复。除非你非常幸运,否则你的管道很有可能在某个阶段出问题。

让我们来看看在生产中运行数据管道时,您可以做些什么来保持平和的心态。

昆滕·德格拉夫Unsplash 上拍摄的照片

数据量波动

在真实的生产环境中,数据量并不总是保持稳定。由于各种原因,如业务扩展、更多的客户获取、营销推广等,数据量可能会上升或下降。事实上,在大多数情况下,数据量都会波动。因此,数据管道需要能够自动伸缩,以应对数据量的波动。因此,“清单”上的第一项是了解您的数据量是否波动,如果波动,您需要利用提供自动扩展功能的数据基础架构来实时响应数据量的变化。您希望避免以下情况:

  • 基础设施过度配置,这将导致不必要的浪费。
  • 基础设施供应不足,这可能会导致管道故障,或者管道完成,但完成的级别低于服务级别协议(SLA)。

因此,了解数据量的变化模式是如何发生的,并在底层基础架构中拥有弹性以立即响应变化是至关重要的。

数据延迟变化

数据延迟是指从数据源获取数据并交付给最终用户使用的速度。当业务需求发生变化时,用户的数据延迟需求也会发生变化。需要以足够灵活的方式定义数据管道,以便在不对源代码进行重大更改的情况下适应这种变化。如果是批处理管道,您可以利用工作流编排来调整调度频率。如果是流式管道,您可以修改管道的触发频率。

让我们以 Apache Spark 结构化流为例,你可以调整流管道触发间隔如下:

  • 默认-如果没有明确指定触发器设置,则默认情况下,流式管道将以微批处理模式执行,在这种模式下,只要前一个微批处理完成处理,就会生成微批处理。
  • 固定间隔微批处理—流式管道将以微批处理模式执行,微批处理将在用户指定的间隔启动。
  • 一次性微批处理—流式管道将只执行一个微批处理来处理所有可用数据,然后自行停止。
  • Available-now 微批处理—类似于一次性微批处理触发器,流式管道将处理所有可用数据,然后自行停止。不同之处在于,它将根据源选项(例如,文件源的 maxFilesPerTrigger)在(可能的)多个微批处理中处理数据。
  • 具有固定检查点间隔的连续——流式管道将以新的低延迟连续处理模式执行。

如果您预见到数据延迟要求在未来可能会发生变化,您需要选择一个能够轻松促进数据延迟变化的计算引擎和框架。Apache Spark 结构化流加上 delta lake 作为数据存储格式是很好的组合,它提供了统一批处理和流数据管道的能力。

数据质量检查和管理

验证数据质量规则并保证端到端数据管道中的可靠数据是非常必要的,因为质量差的数据会导致糟糕的决策和/或糟糕的机器学习(ML)模型。当数据工程师开发和部署数据管道时,他们需要:

  • 一是大力开展数据质量检查。这些数据检查包括技术验证,包括统计检查、缺失值检查、数据类型检查、数据重复检查以及业务检查,这些通常由数据资产的业务所有者或用户定义。
  • 第二,报告违反关键数据质量规则的情况并发出警报。当您调试由数据质量恶化引起的管道问题时,这些报告将非常有用。
  • 第三,了解数据质量差的根本原因,并根据根本原因提供相应的修复方法。

有一些开源库是专门为数据质量管理设计的,例如:

  • great_expectations —共享、开放的数据质量标准。它帮助数据团队通过数据测试、文档和分析消除管道债务。
  • Deequ —基于 Apache Spark 构建的库,用于定义“数据的单元测试”,测量大型数据集中的数据质量。Python 用户可能也会对 PyDeequ 感兴趣,这是 Deequ 的一个 Python 接口。

一些商业 ETL 框架如 Databricks Delta Live Table 也提供数据质量管理功能。增量实时表通过验证和完整性检查防止坏数据流入表中,并通过预定义的错误策略(失败、丢弃、警报或隔离数据)避免数据质量错误。此外,您还可以监视数据质量随时间的变化趋势,以深入了解数据的发展情况以及哪些地方需要进行更改。

在数据管道中包含数据质量检查和验证步骤始终是最佳实践,以交付高度可靠的数据。我将写另一篇文章,专门讨论在数据管道中嵌入数据质量检查。如果您想在文章发表时得到通知,请随时关注我。

数据模式演变

随着业务环境和需求的快速变化,数据模式(定义数据形状的蓝图,如数据类型、列和元数据)也相对快速地变化。好的数据管道应该能够灵活地处理数据模式的变化,同时保持数据质量。

  • 数据质量的模式实施-为了维护和确保数据质量,模式实施是必要的,这意味着当数据工程师将数据(与预定义表的模式不匹配)写入和持久存储到目标表中时,写入将被拒绝,管道将失败。
  • 针对管道灵活性的模式演变——正如刚才所解释的,期望数据模式一直保持不变是不现实的。您的数据管道应该足够灵活,允许用户轻松地更改表的当前模式,以适应随时间变化的数据。在执行追加或覆盖操作时,通常会使用模式进化来自动调整模式以包含一个或多个新列。

根据数据管道的性质及其支持的业务用例,数据工程师在创作数据管道时需要考虑模式如何变化。使用模式实施来维护数据的最高标准,并确保最高级别的数据完整性。模式演化通过使预期的模式改变容易自动发生来补充实施。

管道监控和可观察性

了解并记录管道的工作方式(包括审核日志、作业指标、数据质量检查、管道进度和数据沿袭)对于您找出错误的根本原因并快速恢复管道非常必要。良好的可见性和可观察性使您有信心将数据管道部署到生产环境中。

数据工程师可以利用工作流编排工具进行管道日志记录。大多数工作流编制器工具支持标准的 Python 日志记录级别——关键、错误、警告、信息和调试。它们通常还允许您通过配置自定义日志记录消息,使您能够更好地了解工作流的任务和作业。

此外,数据工程师还可以将工作流编排器与实时监控解决方案相集成,例如用于实时指标、关键警报和通知的 PrometheusGrafana

如果您的数据管道是业务关键型的,并且具有极高的 SLA,那么实现健壮的日志记录和监控机制绝对是值得的。

错误处理和管道恢复

管道恢复不仅仅是修复错误和重新运行工作流。更重要的是,在修复错误时,您必须确保底层数据不会因为错误而损坏。例如,如果将数据写入目标位置的任务中途失败,根据存储位置和数据格式,这可能会非常棘手。如果您正在将数据写入一种提供原子性、一致性、隔离性和持久性(ACID)事务保证、数据快照隔离以及并发支持的数据格式,那么在写入数据阶段失败应该不会太麻烦,并且您可以安全地重新运行该任务,而不必太担心数据质量和可靠性。

Delta Lake 就是这样一种格式,它提供了 ACID 事务、可扩展的元数据处理,并在现有数据湖(如 S3、ADLS、GCS 和 HDFS)的基础上统一了流和批量数据处理。但是,如果您正在将数据写入没有这种数据可靠性保证的数据格式,则必须手动清理,然后才能重新运行失败的作业。

一旦确信数据质量不会因管道故障而受到影响,就可以利用以下方法进行错误处理和管道恢复。

  • 首先是得到通知。为管道设置有意义的通知,以便在出现严重错误和失败时通知您。
  • 第二,让管道在失败时自动重试。数据工程师可以定义重试次数,以及每次重试之间的时间间隔。
  • 第三,当自动重试不起作用时,手动修复故障。为了能够快速修复错误,拥有足够详细的日志是非常必要的。

摘要

我希望这篇博客能为您提供一些有用的技巧,帮助您的数据管道更少出错,并以高度可伸缩和可靠的方式运行。下面是一个快速总结,作为一个清单:

  • 检查您的管道是否能够自动扩展以处理数据量波动;
  • 检查是否可以调整调度/触发频率来处理数据延迟方面的需求变化;
  • 了解数据质量预期,确保在管道中验证这些预期,并报告关键的数据质量违规情况;
  • 了解数据模式将如何发展,并在管道中为模式实施和模式发展建立机制;
  • 我建议至少要有一些监控和可观察性。当然,取决于你的数据管道的 SLA,SLA 越高,应该安排更有力的监控和可观察性;
  • 当出现管道故障时,首先检查并了解原因是否是底层数据损坏,以及是否存在任何数据质量问题。如果是,在重新运行管道之前清除损坏的数据是非常重要的;
  • 最后,了解管道的根本原因,并内置一些自动管道恢复,如重试;

如果你想在有新博客发表时得到通知,请随时关注我。我一般每周都会发表 1-2 篇关于数据和 AI 的文章。

如果你想看到更多围绕现代高效数据+AI 栈的指南、深度潜水、见解,请订阅我的免费简讯— 高效数据+AI 栈 ,谢谢!

注:以防万一你还没有成为媒体会员,并希望获得无限制的媒体访问权限,你可以使用我的推荐链接注册!我可以免费给你一点佣金。非常感谢你的支持!

是什么造就了一个高级编辑?

原文:https://towardsdatascience.com/what-makes-a-senior-editor-fc14d7d93f42

迄今为止我的旅程

好奇带我去了一些真正奇妙的地方!

大家好!我是 Kathy,我于二月份加入神话般的 TDS 团队,担任高级编辑。我有地质学和工程学的学位,三十年的 IT、数据科学和技术写作经验。在加入团队之前,我是加拿大化学工程杂志的执行主编。但我的故事远不止这些!

好奇心驱使我。我热爱户外运动,对周围的物理环境有着似乎永无止境的疑问,因此地质学是我的天然选择。虽然我在莱克海德大学开始了采矿地质学家的教育,但我最终从阿尔伯塔大学毕业,前往卡尔加里从事石油地质工作——但在此之前,我在加拿大北部作为采矿地质学家在帐篷里度过了一个夏天。

我经常觉得那段经历塑造了后来的一切。它不仅迫使我深入挖掘以克服障碍,还教会了我冒险和探索舒适区之外的价值。这也坚定了我对旅行的热爱——需要亲眼目睹和体验更多的东西!

我继续努力,回到学校完成了化学和生物资源工程硕士学位,同时在不列颠哥伦比亚大学担任数据科学家。这些年在编程语言、数据处理和数据库方面提供的培训比我想象的还要多!我的工作日用于构建与大学相关的报告和模型,而晚上和周末则用于与水相关的研究和工程模型。

凭借这一坚实的基础,我建立了自己的咨询业务,作为地质建模专家主要从事国际石油项目,但也与客户一起从事各种项目,如萨克斯第五大道精品百货店、不列颠哥伦比亚省公园和保护服务公司以及南阿尔伯塔理工学院(SAIT)。现在,我接触到了尖端的 3D 可视化房间、ETL、数据库设计和数据仓库。

技术写作和培训成为我工作中不可或缺的一部分,我出版了二十多本科技手册,并为客户建立了在线帮助和知识库。我在私营和公共部门设计、编写和教授了许多与 IT 相关的课程,包括 SAIT 的快速跟踪数据库管理项目。但是我想要更多。

我提交了一篇关于 ETL 和数据仓库的获奖会议论文,并出版了面向 SAS 用户的 Essential PROC SQL 手册,之后我将注意力转向小说,出版了亚历克斯·格雷厄姆系列的两本惊悚小说。口渴,我的处女作小说,获得惠斯勒独立图书奖提名;蓝火是 Clive Cussler 冒险作家大赛的半决赛选手,也是国际鲁伯里图书奖的入围作品。一路走来,我学到了讲故事的艺术——以及一个好编辑的价值。

这些天来,编辑是我的重点,我很高兴能作为高级编辑加入 TDS 社区。这一新职位有其独特的挑战,时间是其中之一。我喜欢与新作者一起工作,但我也想与我们早期的和已建立的作者合作;我想通过时事通讯分享想法和信息,并推广我们的作者;我渴望看到我能在我们繁忙的提交队列中找到什么宝石。这不是一天或一周就能完成的!

但是我知道我已经找到了属于我的地方。在 TDS,我不断学习和阅读我想探索的新概念。我正在走出我的舒适区去调查一些新的东西。

好奇。写下你的发现。我迫不及待地想看到你与我们的 TDS 社区分享什么!

跟我连线:https://www.linkedin.com/in/katherineprairie

是什么让 Bagging 算法优越?

原文:https://towardsdatascience.com/what-makes-bagging-algorithms-superior-4a3882dab59f

证明随机森林等装袋算法性能优于决策树的证据

维多利亚·帕拉西奥斯在 Unsplash 上拍摄的照片

在我之前的文章中,我比较了随机森林和梯度推进,我简要介绍了集成方法的概念,并解释了为什么它们比单独的机器学习模型表现得更好。然而,在那篇文章中,我们仅仅认为这是事实,而没有真正讨论为什么会这样。

今天,我们将深入研究集成方法的概念,特别是 bagging 算法,并提供证据说明它们为什么优于单个决策树模型。

相关代码的链接可以在我的 GitHub 这里找到。

定义

在我们开始之前,让我们快速回顾一下决策树、集成方法和 bagging 的定义。

决策树是一种监督学习算法,可用于分类和回归问题。树的每个节点代表一个变量和分裂点,分裂点将数据分成单独的预测。

集成方法涉及聚合多个机器学习模型,目的是减少偏差和方差。

Bagging 也称为 bootstrap aggregating,是指使用称为 bootstrapped 数据集的训练数据子集创建和合并独立、并行决策树集合的过程。

单一决策树

为了理解集成方法产生的改进,我们将首先检查一个决策树模型是如何建立的,并在基础模型上进一步重申。

head(swiss)

Swiss 是一个包含 6 个变量的 47 个观察值的数据框架(每个变量都以百分比表示),它显示了大约在 1888 年瑞士 47 个法语省份的标准化生育率和社会经济指标。

在这里,我们将生育率设置为我们的目标变量,即我们的模型试图预测的变量和作为预测变量的其他变量。

# Seed for reproducibility 
set.seed(20)# Assign half of the data set as training data 
training.rows = sample(1:nrow(swiss), 0.5*nrow(swiss))
train = swiss[training.rows, ]
head(train)

# Tree package 
install.packages(tree)
library(tree)# Fit single decision tree model to training data 
s_tree = tree(Fertility ~ ., data = train)# Plot model
plot(s_tree)
text(s_tree, pos = 1, offset = 1)

假设我们想预测这个地区的生育率。

我们可以从树的顶部到底部手动跟踪数据,或者使用 r。

predict(s_tree, swiss["Courtelary", ])

两种方法得出的值都是 55.22。

此外,我们可能还想看看我们的模型在维持集(有时称为测试集)上的表现,这是我们的模型最初没有训练的数据。

# Get test set 
test = swiss[-training.rows, ]
y_tree = predict(s_tree, test)# Plot predicted vs observed values 
plot(test$Fertility, y_tree, main = "Predicted vs observed fertility", ylab = "Predicted values", xlab = "Actual values")
abline(0, 1, col = "red")

自举样本

在我们讨论单决策树模型的结果之前,让我们使用一个引导示例重复这个过程。这可以通过将示例函数中的 replace 参数设置为 true 来实现。

# Use bootstrapped sample 
set.seed(8499)
bag.rows = sample(1:nrow(train), replace = TRUE)
bag = train[bag.rows, ]# Fit decision tree model 
s_bag = tree(Fertility ~ ., data = bag)# Predict 
predict(s_bag, test["Courtelary", ])

使用自举数据集,我们得到的预测值为 75.68。

如你所见,55.22 和 75.68 的预测值相差甚远。这反映了决策树是一个典型的高方差模型。换句话说,即使使用稍微不同的数据集来训练模型,也会导致非常不同的决策树,从而导致不同的预测。

解决这个问题的一种方法是采用袋装决策树的思想,其中构建了许多树,并对预测进行平均以获得整体的单个预测。这就是所谓的随机森林。

库特拉里生育率的真实值是 80.2,所以第二棵树预测的 75.68 更接近。然而,我们只是直接比较了一个特定省份的预测。尽管第二个树的预测更接近于 Courtelary,但我们并不确定它是否真的整体表现更好。

随机森林

为了解决决策树模型中的高方差问题,我们可以部署随机森林,它依赖于一组决策树来生成预测。本质上,随机森林模型将对大量决策树返回的值进行平均。

# Set the number of decision trees 
trees = 1000# Construct matrix to store predictions 
preds = matrix(NA, nrow = nrow(test), ncol = trees)# Fit decision tree model and generate predictions 
set.seed(8499)
for (i in 1:trees) {
    bag.rows = sample(1:nrow(train), replace = TRUE)
    bag = train[bag.rows, ]
    s_bag = tree(Fertility ~ ., data = bag)
    preds[, i] = predict(s_bag, test)
}# Take the average from predictions 
y_bag = rowMeans(preds)# Plot predicted vs observed values 
plot(test**$**Fertility, y_bag, main **=** "Predicted vs observed fertility", ylab **=** "Predicted values", xlab **=** "Actual values")
abline(0, 1, col **=** "red")

上图表明,使用训练数据构建的单一决策树在预测测试数据时表现不佳。这些点离参考线相当远,并且对于许多外部节点来说,这些点看起来并没有广泛地分散在参考线上。

另一方面,袋装决策树方法似乎表现得更好。这些点更加紧密地分布在参考线周围。然而,一些点似乎仍然在实际和预测之间有很大的差异。

round(mean((test**$**Fertility **-** y_tree)**^**2), 2)
round(mean((test**$**Fertility **-** y_bag)**^**2), 2)

决策树的 MSE 是 128.03,袋装方法的 MSE 是 53.85。

正如所料,通过取 1000 个预测的平均值,袋装预测的 MSE 要低得多。这告诉我们,平均而言,袋装预测更接近真实值。这与我们对图表的评论一致,袋装预测显示出与真实值更好的一致性。

在本文中,我们回顾了集成方法的概念,特别是 bagging 算法。我们不仅展示了 bagging 算法是如何工作的,更重要的是,为什么它优于单个决策树模型。

通过对多个决策树取平均值,随机森林模型能够解决单个决策树模型中存在的高方差问题,从而生成更准确的整体预测。

如果你从这篇文章中发现了任何价值,并且还不是一个媒体会员,如果你使用下面的链接注册会员,这对我和这个平台上的其他作者来说意义重大。它鼓励我们继续推出像这样的高质量和信息丰富的内容——提前感谢您!

https://chongjason.medium.com/membership

不知道接下来要读什么?这里有一些建议。

是什么让数据科学家辞职?

原文:https://towardsdatascience.com/what-makes-data-scientists-resign-77600516d0a8

意见

促使数据科学家考虑转向绿色牧场的 3 个方面

简·廷伯格在 Unsplash 上拍摄的照片

众所周知,一般来说,特别是在“数据科学和分析”领域,人员流失最近激增。它甚至导致了一个新词的出现“伟大的辞职”——如果你在过去几年里一直关注任何与数据科学/分析相关的对话,你很难逃脱这个词。

https://en.wikipedia.org/wiki/Great_Resignation

在过去的十年中,“数据科学和分析”已经成为增长最快的行业之一,各组织了解“数据”可以释放的力量,并希望利用它赢得客户。一个接一个的辞职潮让行业领袖们大吃一惊,他们艰难地意识到,他们珍爱的员工想要一些不同的东西。

在“数据科学和分析”领域工作超过 12 年(..仍在继续),这些年来,我有机会见证了与同事的几次正式/非正式对话,主题是“是什么让数据科学家离开??

下面我试着总结一下:成千上万次自发的咖啡聊天、正式的会议室讨论和坦率的出租车辩论;围绕主题,深入探讨三个主要因素,这三个因素甚至可能导致积极的数据科学专业人士放弃对当前组织的热爱,开始寻找新的工作

数据科学领导者/经理注意事项—整理以下三项,您将会看到数据科学和分析损耗显著减少。

请注意:

  • 我将整个“数据科学和分析”领域简称为“数据科学”。
  • 我绝不是说员工离开他们的组织不会有其他因素。然而,我确实觉得其他地方陈述的许多其他原因可以是这三个主题之一的子集。
  • 在处理之前,必须理解以下主题同样适用于所有领域;然而,在我看来,它们与数据科学和分析更相关。

1.工作。

显而易见,如果你不喜欢你做的事情,或者觉得它不够吸引人,最终你会厌倦做它。然后离开。

  • 顾名思义,数据科学是一个充满智力挑战的领域。从事数据科学工作的人是工程师、统计学家和数学家——也就是说,到目前为止,他们大部分时间都倾向于智力。因此,这些人对他们的工作有很高的期望— 它必须挑战他们,它必须让他们探索新事物,实施它们并产生影响。
    数据科学家是学者型的存在,他们经常需要联系他们所做的工作。他们希望我们做的工作具有智力挑战性。这是“参与工作”的一个重要方面。
    在一次谈话中,有人非常坦率地告诉我“人力资源人员卖给我一个很好的角色,在这个角色中我会做很多人工智能和机器学习的工作,但在加入后却做了商业报道。我没有攻读博士学位来做这种工作。”显然,他/她很快就离开了。
  • “参与式工作”的另一个方面是数据科学给企业带来的“影响”或“感知影响”。当数据科学家看到组织将数据科学工作视为一项现成的研究,而不是一个将决定下一个业务战略的项目时,他们通常会退缩。
    →让数据科学团队感受到他们的工作有助于推动业务发展,这对领导层来说非常重要。
  • “投入工作”的另一个方面是随之而来的学习。学习也可以被认为是鼓励参加培训,进行自学,并最终选择在实际项目中应用它。“学习机会”是让数据科学家参与进来的东西,缺乏这些机会通常会导致单调、满足感,并最终退出。
    →当数据科学家感到他们的学习曲线已经达到稳定状态时,他们通常会开始寻找出路。
  • 工作必须提供失败和学习的机会和自由。数据科学家希望有尝试新事物的自由,即使这会导致失败。这种“测试和学习的自由”在流失率较低的组织中很普遍。

数据科学领导者/经理注意: 给数据科学家令人兴奋的工作,如果做得好,会产生影响,保持工作时不时地变化,以打破单调,关注他们的培训需求,并给他们失败的自由!

2.人民。

和你一起工作的人是你的工作家庭。你的工作生活占了你生活的三分之一;所以,你确实花了相当多的时间和你的工作家庭在一起。最好开心的度过!

团队合作在大多数领域都很重要,尤其是在数据科学和分析领域。这个领域需要来自同一个团队或跨其他团队的个人之间的大量协作。数据科学家喜欢与他人分享知识,要对他们的项目产生影响,通常需要让许多其他利益相关方参与进来。他们需要参加知识分享会、同行评议和会见客户——没有逃避工作和与工作无关的同事互动。

我把工作家庭分成三个同心圆:

2.1 经理/团队领导:

有研究表明,员工离职的最重要因素是他们的经理(请看下面的文章)

  • 喜欢微观管理的管理者,不太信任他们的员工,不把他们当作个体来关心。
  • 那些不认可/欣赏兢兢业业的工作并提供成长和发展机会的经理往往会在他们的团队中发现高流失率问题。
  • 全年不沟通以提供可操作的反馈而只是围绕绩效评估周期关注负面因素的经理。

→请注意,它在“数据科学和分析”档案中更相关,因为工作很少定义明确并持续发展,需要协作和定期的利益相关者管理。数据科学经理可以创造或破坏数据科学团队的工作环境。

..下面的文章正确地指出:“员工离开他们的经理,而不是公司”。

https://getlighthouse.com/blog/why-employees-leave-managers-not-companies/

2.2 内层:

这包括你的直属团队;也就是说,你每天与之工作/互动的人。他们是你工作家庭的核心。你和他们一起集思广益,分享你的工作,观察他们的工作,交流知识,给予反馈,获得反馈,和他们开玩笑,吃,喝,出去——没有逃避不了的!
→当务之急是与内层工作同事建立尊重和亲切的关系

一起工作而不是相互对抗是非常重要的。

当你和你的同事相处不好时,你或他们会变得过于争强好胜,并且经常关注对方的缺点——生存变得困难。

2.3 外层:

这个小组由该组织的领导层组成。

  • 他们负责发展和维护积极的工作文化。他们必须确保工作场所的欺凌或结党行为得到认真监控和及时处理。
  • 组织的领导层负责开发和维护一个协作和健康的工作环境,开展团队建设活动、社交活动、营造一种体贴和尊重的氛围——所有这些对于员工的幸福感和忠诚度都至关重要。
  • 此外,领导还负责设定公司的愿景和使命,并确保所有团队和个人都与之相关。
  • 组织的领导层必须足够平易近人,足够透明,并经常与员工沟通。交流不能通过冷冰冰的电子邮件或就事论事的新闻信件,而要通过传统的面对面的情感互动。

..我们都知道这会导致什么。

数据科学领导者/经理注意: 专注于在您的组织内构建透明、积极、健康、开放、协作的数据科学文化,让数据科学家感觉与整体愿景/使命紧密相连!

3.奖励。

不需要天才也能理解,如果一个人觉得一件工作没有足够的回报,你会想离开那件工作。

  • 数据科学家知道他们拥有的技术专长、软技能和商业敏锐度的独特重叠;不容易找到。他们还知道,在过去的十年里,越来越多的组织试图释放“数据”的价值,因此,对数据科学/分析的需求比以往任何时候都要多。
    数据科学是一项受欢迎且难以替代的技能。由于经济繁荣,数据科学家的薪水在增加,而当数据科学家的薪酬与他们所做的工作或市场不一致时;他们很快就冒险出去了。
  • “奖励”也可以被认为是一个职业发展的机会。当数据科学家感觉到他们的组织有胃口和空间让他们成长为高级职位时,他们喜欢留下来。在一些组织中,必须担任管理角色才能晋升,而在其他组织中,有个人贡献者(IC)角色,在这种角色中,一个人可以在没有承担管理职责的强迫下成长到相当高的级别。
    →正如你所猜测的那样,拥有明确的 IC 路径的组织比那些强制要求管理人员晋升的组织流失率更低。

数据科学领导者/经理注意: 公平的薪酬和发展机会是必备的。如果此时业务需求不同,要公开透明,承认差距!

摘要

在过去几年中,“流失”已经成为所有领域的一个巨大问题,“数据科学和分析”也不例外。虽然有些方面超出了组织内数据科学领导者的控制范围;有很多方面可以控制和调整,以改善数据科学家的健康状况,并阻止他们离开。

任何数据科学专业人员在任何工作中都关心的三个方面是:

  • 工作。
    ——有挑战性吗?迷人吗?重复?我有失败的自由吗?
    -我有影响力吗?
  • 人民。
    -直属经理:是微观管理吗?给予独立?提供可行的反馈?
    ——同事:乐于助人,乐于协作?他们竞争过度了吗?
    ——领导:信得过吗?沟通?认可优秀的工作?
  • 奖励。
    -赔偿?额外津贴。
    -未来成长?自由选择 IC 还是管理路径?

→如果上述三个主题中的任何一个成为关注点,就会在任何员工的心中升起一面“红旗”。

→如果上述三个主题中的任何两个成为问题,那么我认为他们很可能已经在寻找更好的出路。

..需要注意的是,上面说的大部分都是 可解

保持联系..

如果你喜欢这篇文章并且对类似的文章感兴趣 在 Medium 上关注我加入我的邮件列表(..如果你已经不是了..)跳上去成为Medium 家族的一员获取成千上万篇有用的文章。(如果您使用以上链接,我将获得您约 50%的会员费)**

..不断学习,不断成长!

鲁棒视觉模型的卷积有什么特别之处?

原文:https://towardsdatascience.com/what-makes-the-convolutions-of-robust-vision-models-special-5f9c1a0c5bb5

透过卷积滤波器的镜头理解对抗鲁棒性

基于与 Janis Keuper 的合作。

在 CIFAR-10 上训练的 ResNet-18 中每一层的第一卷积滤波器的符号可视化。图片由作者提供。

深度学习对计算机视觉产生了重大影响。它使计算机能够从数据中自动学习高级特征,并被用于开发在各种任务(如对象识别、图像分类和语义分割)上优于传统方法的模型。应用包括自动驾驶、医疗诊断和人脸识别等。然而,深度学习模型已被证明对输入数据的分布变化本质上是敏感的。

例如,给定足够大和足够好的数据,人们可以很容易地训练模型识别街道标志(因为这对于自动驾驶任务来说是必要的)。如果执行正确,该模型将识别训练期间显示的街道标志和以前未显示的标志(它将展示泛化)。人们可以很容易地得出结论,高验证准确性将对应于将安全地识别所有新数据的模型。但是,如果新数据的分布发生变化,情况往往就不是这样了。对于自动驾驶,这可能是由于天气条件的变化、车载摄像头的低分辨率、照明条件差等。这在以前没有反映在训练数据中。我认为获取代表所有可能环境的训练数据是不可能的。

不幸的是,甚至更糟糕的是,深度学习模型已经被证明更加敏感:对人类来说,对输入数据几乎无法察觉的扰动(敌对攻击)可以迫使模型以很高的可信度做出错误的预测。在我们之前的例子中,这可能意味着一辆汽车将一个停止标志误认为一个简单的限速标志,这可能会产生灾难性的后果。这些扰动通常通过应用于整个输入的噪声来建模,但是一般来说,也可以修改输入的小部分,例如通过在街道标志的特定位置放置胶带来愚弄模型。

把这些胶带放在停车标志上会愚弄你的普通神经网络。照片由艾克霍尔特等人拍摄。al (2017)

一种常见的防御机制是通过对抗训练进行调整,将最坏情况下的扰动注入训练中,以加强决策边界并减少过度拟合。然而,这种技术大大增加了培训成本。因此,自然地,对对抗性鲁棒性的更深入理解对于找到更好的解决方案是至关重要的。

虽然大多数正在进行的研究工作正在从各种角度研究这些问题,但在大多数情况下,这些方法可以概括为研究图像数据中分布偏移的影响以及由此产生的激活、显著性和特征图的差异。相反,我们建议研究训练 CNN 模型的学习权重(卷积滤波器)的变化,并提出:是什么使得鲁棒视觉模型的卷积特别?

评估数据和实验设置

为了了解对抗性训练产生的差异,我们从在 CIFAR-10、CIFAR-100 和 ImageNet-1k 上训练的 健壮工作台-排行榜(健壮模型)收集了 71 个模型检查点(基于 13 种不同的架构)。所有这些模型都被训练以抵抗基于不同方法的 L-infinity 有界对抗性攻击,然而,所有模型都被训练有对抗性训练。此外,我们使用标准训练程序(正常模型)为每个出现的架构训练了一个单独的模型,没有任何特定的健壮性规则化,也没有任何外部数据(即使健壮性对应方依赖于它)。由于使用我们选择的参数在 ImageNet1k 上进行训练导致了相当差的性能,我们用来自优秀的timm-库的等效预训练模型替换了这些模型。我们总共收集了 615,863,744 对形状为 3×3 的鲁棒/正常卷积滤波器。

过滤器模式分布

首先,我们想了解模式的差异。由于所学习的滤波器在幅度上是不同的,并且在较深的层中幅度通常较低(为了改善梯度流),我们首先将所有滤波器归一化为单位长度。这使我们能够专注于滤波器模式,而不受幅度的干扰。接下来,我们对所有滤波器进行奇异值分解(SVD)。这给出了基于最大方差的表示:由 3×3 = 9 个系数加权的 3×3 = 9 个主分量(也称为基向量或本征图像)的总和允许重构每个滤波器。

将滤波器分解成加权基向量的和。通过奇异值分解获得基向量。图片由作者提供。

这为我们提供了优势,即基于 SVD 获得的表示不限于单个像素,而是捕捉滤波器的相关子模式(参见 v0 … v9)。要分析多个滤波器,我们可以简单地将系数视为分布。

通过正常和稳健模型的 KDEs 对 CIFAR-10、CIFAR-100 和 ImageNet-1k 的 SVD 系数分布进行可视化。图片由作者提供。

为了测量两个分布 Pi,Qi 有多不同,我们可以使用任何散度度量。在这项工作中,我们使用了众所周知的 Kullback-Leibler 散度(KL ),并稍微调整了一下以增强对称性。

KL 散度的对称变体。图片由作者提供。

对于每组滤波器,我们获得 9 个分布。为了比较两个滤波器组,我们计算每个基向量上的 KL,并计算加权平均值。每个基向量的权重由其方差比给出。在下面的章节中,我们称之为分配转移

注意:在我们以前的工作中[2]看到了稀疏滤波器对分布的巨大影响。稀疏滤波器将主要由近零系数描述,这将导致 kde 中的大尖峰。KL 散度将大大增加并偏向 KDEs 的这个区域。因此,在此分析中,我们从层权重中移除稀疏。

最大的配送班次位于哪里?

我们研究了过滤模式中最显著的变化,并测量了不同深度阶段的分布变化。为了比较具有不同深度的模型,我们将滤波器系数按照它们在模型中的相对深度的十分之一进行分组。对于所有数据集,获得的位移似乎随着卷积深度而增加。但是,这种差异随着数据集复杂性的增加而减小(imagenet 1k > CIFS ar 100 > CIFS ar 10)。此外,可以在第一个卷积层(但不是随后的早期层)中看到显著的偏移。请注意,ImageNet1k 模型中的主要卷积阶段使用更大的内核大小,因此不包括在本研究中,但我们希望在那里有类似的观察结果。图片由作者提供。

正常模型和稳健模型之间的最大差异出现在第一层和最深层。然而,随着数据集复杂性的增加,这种差异会缩小。图片由作者提供。

为了更好地理解观察到的分布变化的原因,我们将第一个和最后一个(最终)卷积层可视化:

从最终卷积层中为特定法线模型(左)及其健壮对应物(右)选择的过滤器。作者提供的图片。

对于最深的卷积层,我们观察到正常的滤波器明显缺乏多样性,并且大多使我们想起高斯模糊滤波器,而敌对训练的滤波器似乎在结构上更丰富,并且更可能执行不那么琐碎的变换。我们在许多深层观察到这种现象。

从主卷积层中为特定的法线模型(左)和它的健壮对应物(右)选择的过滤器。作者提供的图片。

另一方面,主要卷积阶段显示了我们在其他层中很少发现的惊人相反:正常模型显示了预期的各种滤波器的不同集合,然而,所有鲁棒模型都开发了大量高度相似的滤波器。因为只有它们的中心权重是非零的,所以这些滤波器执行输入通道的加权求和,相当于 1×1 卷积。

我们假设,结合通常使用的重新激活(及其导数),初级滤波器执行输入数据的阈值处理,这可以消除小的扰动。实际上,绘制自然样本和扰动样本的激活差异,允许我们获得视觉确认,即这些滤波器成功地从各种感兴趣区域(ROI)移除扰动,例如从猫、背景和前景。看起来对抗稳健模型本质上并不稳健,而是学会了对数据进行预处理。

对抗训练学习第一层中的卷积滤波器,其可以成功地去除输入图像的特定区域中的扰动。图片由作者提供。

我们观察到过滤器质量有哪些差异?

我们还可以考虑“好的”卷积滤波器将具有什么属性:为了尽可能多地利用学习到的网络,卷积层中的所有滤波器都应该有助于预测,并且层中的模式通常不应该太重复,并且产生不同的特征图。

我们通过三种不同的静态指标来衡量质量(即仅使用学习到的参数):

稀疏度——无贡献过滤器的比率
给定层中所有权重都接近零稀疏度的过滤器的比率。由于它们的低幅度,这些滤波器对特征图没有贡献。为了最大限度地利用可用的网络容量,该值应该尽可能低。

方差熵——滤波器模式的多样性
我们再次利用 SVD 来理解给定层中模式的多样性。当 SVD 找到最大方差基时,它自然会识别出最重要的“子模式”。通过捕获解释方差的分布,我们可以识别单个子模式是否占优势(缺乏多样性;偏斜方差分布)或所有子模式同等重要(随机/最大多样性;均匀方差分布)。我们用非负对数熵来量化解释方差的分布。熵方差值为 0 表示当前滤波器的同质性,而最大值表示在所有基本向量上均匀分布的方差,如在随机的、未初始化的层中发现的。接近两个区间边界的值表示退化,并且很难提供好的阈值。

正交性——滤波器组/结果特征图的冗余 正交性有助于梯度传播,并与生成的特征图的多样性直接耦合。由于计算限制,我们测量滤波器组之间的正交性,而不是单个滤波器。滤波器组被视为向量,并被归一化为单位长度。正交性就是层权重和它的转置之间的点积。正交性值 1 规定了层中所有滤波器组的正交性,而 0 表示并行滤波器组可能产生不同比例但相同的特征图。

最后,所有这三个指标都量化了与网络规模相关的已用容量。

通过在 CIFAR-10(左)、CIFAR-100(中)、ImageNet1k(右)数据集的正常和对抗训练之间的稀疏性(上)、方差熵(中)和正交性(下)测量的深度,比较过滤器质量的分布。图片由作者提供。

与结构中的发现类似,我们观察到数据集复杂性的质量差异较小,但稳健模型和正常模型的质量也普遍提高。ImageNet1k 上的结果不太确定,因为样本量小,质量基线接近最优

稀疏度:我们观察到正常模型的所有层都有很高的稀疏度,随着数据集的复杂性而降低。稳健训练显著地进一步最小化了稀疏性及其在所有深度上的跨度。值得注意的异常值包括 CIFAR-10 的初级阶段以及最深的卷积层。一般来说,稀疏度在中间阶段似乎较低。

方差熵:平均方差熵在整个模型中相对恒定,但随着层的加深而减小。稳健模型的熵随后开始降低,并且不太显著,但是这种差异随着数据集的复杂性而减小。与 CIFAR-10 相比,稳健的 CIFAR-100 模型在更深的层中显示更低的熵,而正常模型之间没有明显的差异。ImageNet1k 模型显示所有深度的熵都更高。

正交性:稳健模型显示正交性随着深度几乎单调增加,除了最后十分位数,而正常模型最终开始降低正交性。同样,差异随着数据集的复杂性而减小,并且非稳健模型的所获得的测量值的跨度显著增加。

结论

对抗训练的模型似乎比它们的非正则化变体学习更多样、更少冗余和更少稀疏的卷积滤波器集合。我们假设质量的提高是对额外训练压力的反应,因为更具挑战性的对抗性问题占用了更多的可用模型容量,否则这些容量将会退化。随着数据集复杂度的增加,我们在正常训练中观察到类似的效果。然而,尽管正常训练的 ImageNet1k 模型的滤波器质量相对较高,但是它们的鲁棒性却不是这样。因此,单凭滤波器质量不足以建立鲁棒性。

下一步

不幸的是,我们无法完全揭开对抗性训练对卷积滤波器的影响。特别是,尚不清楚数据集复杂性是否是质量下降的原因,或者我们衡量的质量差异是否只是严重过度参数化架构的副作用,在这种架构中,对抗性训练可以缩小与更复杂数据集的差距。看起来似乎有必要进行更多的分析,以充分掌握对抗性训练的影响,而且,很可能还有其他机制在发挥作用,导致稳健的模型。另一方面,滤波器质量似乎至少是实现鲁棒性的必要条件。因此,似乎值得探索我们是否可以通过正则化在训练期间实施更高的滤波器质量来增加鲁棒性。或许,这甚至可以成为对抗性训练的更廉价的替代品。

你怎么想呢?我们很好奇你的想法!请在评论中分享。

参考资料:

[1] P. Gavrikov 和 J. Keuper,透过卷积滤波器的透镜观察对抗性鲁棒性 (2022),CVPR 2022 研讨会

[2] P. Gavrikov 和 J. Keuper, CNN 滤波器 DB:训练卷积滤波器的实证研究 (2022),CVPR 2022 Orals

这项工作由德国巴登-符腾堡州科学、研究和艺术部资助,基金号为 32–7545.20/45/1(Q-AMeLiA)。

当你的客户质疑你的结果时,该(不该)说什么

原文:https://towardsdatascience.com/what-not-to-say-when-your-client-questions-your-results-6a5481ff6ea6

日常诚信

利用这些关键时刻建立信任和理解

安妮·索沃斯Unsplash 上的照片

如果你从事分析工作,总有一天你的结果会受到质疑。迟早,你会遇到怀疑、困惑,甚至被解雇。你可能会在一个重要的演示中出错,或者被告知你的分析是不相关的。

这可能听起来很可怕或令人沮丧,但我希望我能说服你,这些事件是宝贵的机会。即使你犯了一个错误或完全误入歧途,这些对话也能增进你的人际关系、理解和效率。潜在的长期好处远远超过任何暂时的不适。

对于数据科学的完整性来说,分歧是至关重要的时刻。它们可能是意想不到的,每当人们毫无准备时,道德失误的几率就会增加。在意见不合时,有很多方法可以混淆重要的信息。为自己的错误辩解可能很有诱惑力;显然这和一开始撒谎没有太大区别。防御性还会阻止我们充分听取或反思反馈,导致更被动的欺骗。

解决分歧所需的“软技能”通常会改善沟通,从而提高数据科学工作的质量。最重要的是,他们维护诚信。为困难的对话做准备对每个人都有好处!

当对话出现问题时,问题来自情绪和想法。分歧是有压力的,很容易针对个人。当不同的视角可能更有帮助时,我们可能会将情况分为“坏”或“好”。在这里,我将描述一些我见过的情况,并讨论可能有助于导航此类事件的技术。有些技巧看似简单,但在高压互动中,简单并不总是意味着容易!

这篇文章是基于个人经验和观点。虽然你的情况可能不同,但我希望我的想法可以激励你以自己的方式为这些不可避免的情况做好准备。

注意:我不严格地使用“客户”和“数据科学家”。客户可以是任何利益相关者,甚至只是你的老板。数据科学家可以是任何人,他的角色包括传达来自数据的信息。

练习非防御性反应

分歧的最初时刻至关重要。当受到挑战时,你是深思熟虑地回应还是感情用事?在我看来,在一个人感到惊讶的演示或其他时间敏感的场合,分歧很少能得到解决。眼前的目标不是找出一个答案,或者决定谁是错的,而是打开一个讨论和发现的空间。

我认为被问到问题的人感到有回答的压力是正常的。问题意味着答案,对吗?但是,即使我在飞行中想到了一个响应,我也经常想在完全适应之前检查它。

当人们感受到如此大的压力以至于脱口而出时,问题就出现了。有时候,他们很幸运,碰巧是对的。在其他情况下,在恐慌时刻做出的反应是不准确的。在这一点上,道德失误的风险更高,因为有人必须承认错误两次。

所以,一个问题被提出来了,但是回答是有风险的。同时,你不能忽视一个关注点。怎么办?

一个有用的建议是准备一些现成的回答。如果你在网上搜索“非防御性回应”,你会发现很多有用的短语。你甚至可以在镜子前或者和朋友一起练习。以下是我最喜欢的一些:

  • 这是一个好问题
  • 谢谢你提醒我这件事
  • 我需要考虑一下
  • 我不准备对此给予应有的考虑,但是我们能不能以后再约个时间讨论这个问题?
  • 我没有那样想过
  • 凡事皆为可能

上一次我取得了惊人的成功。让我们用在一个句子里:

他们:有没有可能你们的数字都是错的?

我:一切皆有可能。

重要的是要记住,非防御性的回应并不是为了回避问题或“推进对话”目标是争取时间,这样你就可以诚实完整地回答问题。非防御性的回应也让我想起了一些令人稍感不适的事实。客户确实问了一个好问题。我确实需要对此多加注意。也许我确实需要改变我的想法或假设。是的,有可能我错了。

当出现分歧时,你可能是错的,客户可能是错的,或者在理解或目的上可能有一些偏差。不太自信的人可能会默认自己是错的,但由谁在高压下最自信来决定最终的“答案”并没有什么帮助。非防御性的回应有助于将讨论重新定位到中立的领域,从而实现高质量的解决方案。

我的一份报告与客户认为的记录系统的结果大相径庭。客户坚持认为他们的消息来源在技术上不可能是错的。他们问了我一些问题,比如我是否不小心把我的计数翻了三倍,我说“一切皆有可能。”

那一次,事实证明我的数字是正确的。客户端编写了一个不正确的查询;有趣的是,完美数据的假设已经扩展成为对从该数据得出的任何报告的可靠性的期望。当你错了的时候,非防御性的回应是有帮助的,但当你对了的时候,非防御性的回应是无价之宝(这两种情况会时有发生)。如果你是对的,但是喜欢争论或者不屑一顾,客户可能会不高兴。如果你认真对待客户的担忧,并深思熟虑地解决这种情况,然后证明是正确的,最重要的是,你可能会留下非常积极的印象。那个客户可能会跟着你去任何地方!

无论你是对的、错的还是介于两者之间的,对客户关心的问题深思熟虑会建立信任。如果你一直关注最终产品的质量,人们通常会放你一马。意见不合是一个展示你的关心和认真的机会;他们有建立关系的巨大优势。

收集信息

当你真诚地试图理解差异时,用一个问题来回答一个问题通常是有效的。由于对目标和定义的不匹配解释,产生了许多分歧。充分理解问题的本质很重要。

提问对于在细节上达成共识非常有帮助。当新的结果与一些过去的分析相冲突时,获得一份原始材料的副本是非常有帮助的。报告有时会过时或涉及不同的产品、部门等。在其他情况下,他们可以加快找到你自己的错误的根本原因。

我有一个客户,由于信息与他们的报告不符,他非常不高兴。为了保护隐私,我不会分享实际的问题,但这里有一个虚构的情况类似。我报告说,一家连锁杂货店的每位顾客平均每月花费(比如说)800 美元。利益相关者坚持认为这是错误的,并出具了一份数字更低的报告。经过一些调查后,发现利益相关者关心的是食品支出,而不是所有的商店采购,包括化妆品和清洁用品。鉴于主要利益相关者的责任集中在食品上,他们采取这种观点是很自然的。对我来说,使用不同的定义也是很自然的,因为这更符合行业标准,也是其他客户想要的。但是共同的理解对于项目的有效进行是至关重要的。

考虑邮件

上面的建议集中在口头交流上,但也适用于电子邮件或聊天。当你可以选择讨论的形式时,考虑一下现场互动的压力更大。电子邮件可以提供思考的时间。另一方面,电子邮件是永恒的,所以一定要花时间思考!

通过电子邮件,你可以在撰写回复时寻求帮助。有些人发现在写作中诚实更容易。此外,通过电子邮件提醒利益相关者,让他们有机会提前提出问题,帮助你做好准备。

我发现一些客户确实需要现场会议,但总结问题、概述计划和建议调查时间表的跟进电子邮件几乎总是受欢迎的。就我个人而言,我通常喜欢做演示和现场会议,但在压力下往往会停滞不前。因此,如果可能的话,我更喜欢用电子邮件来联系更困难的客户或话题。

照片由 Unsplash 上的激励工具拍摄

不要拿救命稻草

在争论中,一个乐于助人的旁观者通常会提出建议。他们的想法通常是慷慨的,想象数据科学家可能是正确的。这可能很容易让人同意,但是要小心!轻率地拿走救命稻草会让你很快失去信誉。我见过很多演讲,观众都在那一点上离开了。

不久前,我展示了一张包含算术错误的幻灯片。有人建议使用包含半精细操作的替代数学方法,这样可以使结果正确。他们真好,但更好的办法是承认错误并改正它。

当我感到困惑时,很容易抓住绳子轻松脱身。然而,当一个人抓住一些随机的想法(这让他们看起来很好),它发出的信息是,他们不体贴,不关心质量,很可能在他们的头上。最好感谢助人为乐的人,但要谨慎。"有这个可能,约翰,谢谢你的建议!"“好主意,莎莉,但我需要更多时间来看数据以确定!”

有用的旁注:建议以后继续讨论可能更好,而不是通过建议替代方案来增加复杂性。你的想法很有价值,但是一个人在压力下可能无法给予他们应有的考虑。

不要轻视

一个完全无益的回答是“你不相信数据?”将困难归咎于某人缺乏“数据素养”也算。

数据没有内在的可信度。必须针对特定应用或业务环境审查其有用性。即使数据合适,一个数据产品也是由很多组件组成的,比如需求、定义、管道、查询、代码、报告、分数等。有这么多潜在的错误或误解来源,对于数据科学家来说,倾听他们的担忧似乎是明智的。

回想一下我之前讨论的那个客户,他有一个他们认为 100%可靠的记录系统。这可能是真的,但是由于一个有问题的查询,他们的数字是不正确的。人们,甚至是数据科学家,经常高估数据产品的准确性。数据的干净程度意味着分析的准确性。一个结果的完美“逻辑上”来自于数学定理的正确性或代码的优秀。有一种光环效应,可以让人相信哪怕是无意义的结果。

客户的问题是对抗对数据产品过度信任的重要砝码。我目睹了一个戏剧性的例子,现在我来描述一下(为了保护隐私,一些细节做了改动)。

曾经,有一个与一家知名公司有关的分析小组声称有着令人印象深刻的记录。他们的代表是一位魅力四射的高管,这位高管有着激励客户认识数据新世界内在可能性的天赋。但是,在一个新客户的项目中,出现了一些问题。一些结果似乎不一致,另一些则违背了传统智慧。

首先,该公司无视批评。反对者通过项目负责人追踪这个问题。这位魅力型领袖坚持说没什么不对,而且很有说服力。偶尔会有唇枪舌剑,在此期间,这位高管解释了他的公司的方法有多先进,他们的资质有多可靠,以及该项目的转型潜力。有一次,这个有声望的组织把他们的整个代码库发了过来,包括几千行代码,同时要求批评家们找出其中的一个错误。

相关派别花了几周时间挖掘源代码,未能找到一个代码错误,但汇编了一份报告,说明了最终结果的危险信号。项目负责人左右为难,倾向于信任公司的声誉,但对批评者的坚持感到不安。

跳过一些痛苦的遭遇,让我只说,这对这家久负盛名的公司来说是一场灾难。高管的话让利益相关者推迟了几个月,但最终整个项目需要重做。更重要的是,该公司经历了信任和尊重的巨大损失。

远离电梯

上面描述的情节是一个典型的“不,它不是/是的,它是”的僵局,尤其是戏剧性的结果。这种僵持浪费了很多时间。此外,我觉得它们代表了对完整性的破坏,或者至少是高风险的。事实上,这一事件是我将客户异议视为诚信话题,而不是“软技能”讨论的一个重要原因。

对我来说,“不,这不是/是的,这是”的僵局就像一部下降的电梯。你以诚实的异议开始,你通过的最初几层并不太糟糕。如果你继续下去,你会陷入否认,你的某个部分知道有问题,但你可以压制那个声音。接下来是疏忽,最底层是一种特别激进的说谎类型,在这种情况下,有人会否认现实。在我看来,尽早下电梯是数据科学家的工作——最好不要上电梯。电梯不会去你想去的任何地方。即使有些客户试图把你拖上电梯,也不要靠近!

要有目的性,不要有说服力

当我想起魅力型高管的那一集时,我想起了这句话:

雄辩,用甜言蜜语而不是权威来说服人;作为暴君,而不是国王——布莱士·帕斯卡

一个数据科学家可能占据一个特权地位。客户可能对自己的数据了解有限,或者缺乏对分析或建模技术的理解(毕竟这就是他们雇佣你的原因)。擅长演讲的数据科学家可能会特别受欢迎。这个优势是责任,不是机会。

雄辩的正确用途是教育,而不是说服。同样重要的是,我们不要用自己的推理来隐藏令人不安的事实。

当我第一次读到帕斯卡语录时,我被“作为一个暴君,而不是作为一个国王”所迷惑。也许因为我是美国人,“暴君”和“国王”对我来说可以互换,但也许在 17 世纪的法国,“国王”意味着合法或正当的领导。所以,这句话提醒我要避免用语言来假设不劳而获的权威。“暴君”这个词是不是太戏剧化了?如果我告诉你,上述事件涉及医疗保健,有可能通过资源分配影响人们的治疗,会怎么样?

甚至更强烈的语言可能是合适的。在她的中,凯茜·奥尼尔将一种算法归类为“数学毁灭武器”(WMD),如果它满足三个标准:“不透明、规模和破坏。”这种系统产生了一种反馈循环,强化了有害的做法。这一集算是大规模杀伤性武器吗?文字,而不是数学,模糊了这个系统,这使得它与书中的场景有点不同,但仍然不透明。规模是区域性的,这似乎足够广泛,尽管不像某些大规模杀伤性武器那样糟糕。损坏的风险是存在的。我认为大规模杀伤性武器的三个基本要素已经得到满足。

反馈回路呢?由于这个项目被纠正了,所以我不能确定。然而,我可以想象错误可能自我维持的方式。专注于一个主题的计划会生成更多的记录,而更多的项目会跟踪可用的数据。还存在确认偏差的风险——矛盾的分析可能会被“纠正”以匹配原始结果,导致越来越多的共识朝着错误的方向发展(因为数据科学不是科学,确认偏差对我们来说并不完全是坏事——它有时是有用的,尽管是危险的!)最后,从事这项工作的人有动机不去注意他们先前的错误。

在这种情况下,有许多选择将这个项目带到了大规模杀伤性武器的边缘。质量控制基本缺失;所做的事情包括频率表之类的,在最终的运行中可能没有看到。整个组织都接受这样一个前提,即如果代码没有 bug,那么分析必须是有效的。利益相关者会议是唯一有意义的质量控制机制,而这些几乎被雄辩所破坏。

即使在更好的情况下,倾听客户的意见也很重要。没有一个质量控制过程是完美的,将商业概念转化为数字有许多细微差别。不屑一顾破坏了一种非常重要的保护。

最后的想法

客户沟通的主要目的是建立和保持一种共识。数据科学家必须理解客户想要完成什么以及为什么。随着项目的进展,对话会提炼出共同的理解。

在这个过程中,分歧是很自然的一部分。它们是有用的检查站。也许我需要解决一些事情。也许我需要改变我的视角,以更好地符合客户的目的。有时候,我可能有机会充当老师,增加另一个人的了解。

尽管我个人经历了分歧带来的巨大好处,但我仍然一点也不喜欢它们!对我来说,需要努力记住我的目的,克服情绪。我是那种需要“小费”的人,多多益善。我希望我的经历可以帮助人们为这些困难的、有价值的互动做好准备。我很乐意在评论中看到更多的故事或建议!

奥卡姆剃刀在机器学习中的意义

原文:https://towardsdatascience.com/what-occams-razor-means-in-machine-learning-53f07effc97c

对这一简单定律的实际解释

照片由максирыжкинUnsplash

"一切都应该尽可能简单,但不能更简单。"

——阿尔伯特·爱因斯坦

不久前,我写了一篇关于“没有免费的午餐定理”的文章,这是一个受哲学启发的定理,它暗示没有一个单一的机器学习算法是所有问题的普遍最佳算法。

像没有免费的午餐定理一样,机器学习中另一个起源于哲学的概念是奥卡姆剃刀。奥卡姆剃刀基本上是说,给定相互竞争的理论和解释,最简单的应该是首选。用奥卡姆的话来说,“实体的增加不能超出需要。”

哲学起源和表述

奥卡姆剃刀是一个可能起源于早期哲学家的观点。事实上,亚里士多德(公元前 384-322 年)说“在其他条件相同的情况下,我们可以假设从更少的假设或假说中得出的论证更优越。”托勒密(约公元 90 —约 168 年)做了一个更简单但等价的陈述——“我们认为用最简单的假设来解释现象是一个好原则。”

亚里士多德第一个阐述了奥卡姆剃刀背后的思想。图片来源:Lysippos 之后,公共领域,通过维基共享

直到一千多年后,一位名叫奥卡姆的威廉的英国方济各会修士和神学家提出了一个说法“实体的繁殖不能超过必要性”,这后来被称为奥卡姆剃刀。换句话说,在其他条件相同的情况下,简单的解决方案比复杂的更受青睐。

用概率论证明

奥卡姆剃刀是基础概率论的直接结果。根据定义,更复杂的理论包含更多的假设。我们在理论中加入的假设越多,其中一个假设不正确的可能性就越大。如果一个假设不能使我们的理论更加准确,它只会增加整个理论是错误的概率。

例如,如果我们想解释为什么天空是蓝色的,一个基于光的属性的简单解释比一个涉及太空中的外星人将蓝色尘埃散射到地球大气层中以赋予天空颜色的解释更有可能是正确的。更复杂的解释涉及更多的假设,其中许多还没有得到科学验证,因此更复杂的理论,尽管它预测了相同的结果,但更有可能是不正确的。

机器学习的实际应用

奥卡姆剃刀听起来很简单,但它在实际的机器学习中真正意味着什么?1996 年,佩德罗·多明戈斯(Pedro Domingos)正式将奥卡姆剃刀应用于机器学习,引入了以下含义,他称之为“奥卡姆两剃刀”:

  • 第一把剃刀:给定两个具有相同泛化误差的模型,应该优先选择较简单的一个,因为简单本身就是可取的。
  • 第二把剃刀:给定两个训练集误差相同的模型,简单的一个应该优先,因为它可能具有更低的泛化误差。

多明戈斯指出,第一个剃刀是正确的,但第二个剃刀,虽然奥卡姆剃刀暗示,不一定是正确的。事实上,根据模型在已经看到的训练数据上的表现来做出决策是一种糟糕的做法。

因此,如果你想在实践中使用奥卡姆剃刀,这里是如何做的:如果两个模型在验证/测试数据集上有相同的性能,选择更简单的模型,因为它更有可能概括得更好。奥卡姆剃刀实际上只是机器学习中偏差-方差权衡的一个例子。

偏差-方差权衡。来源:临床数据科学基础,4.0 授权 CC 下。

如上图所示,奥卡姆剃刀是机器学习中普遍优化问题的陈述。在选择用于任何问题的模型时,我们希望模型既足够复杂以避免欠拟合,又足够简单以避免过拟合。

有时候奥卡姆剃刀可能被误解为简单的模型总是比复杂的模型更好。然而,这种想法既违反了奥卡姆第一剃刀的谓词(“给定两个具有相同泛化误差的模型”),也违反了没有免费的午餐定理,该定理基本上表明,在所有机器学习问题上,没有一个单一的机器学习算法普遍优于所有其他算法。在两个模型之间进行选择时,我们只能说,如果简单模型的泛化误差等于或小于更复杂模型的泛化误差,则简单模型更好。

超越理论——实际考虑

虽然奥卡姆剃刀只在较简单的模型比较复杂的模型获得相同或更好的泛化误差时适用,但在实际情况下,我们可能会选择较简单的模型,即使它的泛化误差低于较复杂的模型。事实上,更简单的模型可以提供以下优势:

  • 更少的内存使用。
  • 更快的推断时间。
  • 好交代。

例如,考虑一个欺诈检测问题,其中决策树达到 98%的准确率,而神经网络达到 99%的准确率。我们还假设这个问题需要快速的推理时间,并且我们的部署服务器有内存限制。最后,让我们添加一个需求,即模型的预测需要解释给公司内部正在处理这个用例的监管机构。

在这种情况下,考虑到这个问题的额外要求,决策树是比神经网络好得多的模型。决策树可能是一个更小的模型,具有更快的推理时间,并且比神经网络更容易解释。除非在这个问题的上下文中,百分之一的准确度下降是显著的,否则选择决策树而不是神经网络将是一个实际的决定。

摘要

奥卡姆剃刀是一种哲学思想,也可以应用在机器学习中。在机器学习的背景下,剃刀理论认为,在其他条件相同的情况下,简单的模型比复杂的模型更受青睐。这种说法并不意味着简单的模型普遍比复杂的模型更好,而是说模型必须足够复杂以学习数据集中的模式,但又足够简单以避免过度拟合。

因此,如果你想使用奥卡姆剃刀而不被割伤,请确保在决定选择更简单的模型而不是更复杂的模型之前,比较不同模型的泛化误差,并考虑你正在解决的问题的实际要求。

来源

  1. B.杜伊南,奥卡姆剃刀,(2021),布列塔尼卡。
  2. 页(page 的缩写)多明戈斯,奥卡姆的两把剃刀:锋利和钝,(1998),KDD'98:第四届知识发现和数据挖掘国际会议论文集

加入我的邮件列表

加入我的邮件列表,获取我的数据科学内容的更新。当你注册的时候,你还会得到我免费的解决机器学习问题的逐步指南!也可以在 Twitter 关注我,了解内容更新。

当你这么做的时候,考虑加入媒体社区,阅读成千上万其他作家的文章。

闭包到底是什么?

原文:https://towardsdatascience.com/what-on-earth-are-closures-a4f9c7c652d2

闭包函数及其使用方法概述

(图片由 Pixabay 上的 jarmoluk 提供)

介绍

如果有一样东西对每一种编程语言都很重要,不管那种语言的范例是什么,那就是函数。函数是从一种语言传到另一种语言的普遍概念,这很有意义。甚至当我们用汇编语言进行低级编程时,我们仍然在使用本质上的函数。虽然我不确定它们是否一定被称为函数,因为我一直认为它们是子例程(或者是例程,如果它是 jmped 并且没有被调用的话)。如果你不知道我刚才到底在说什么,不要担心…

这与闭包无关。

我的观点是:函数在编程中是通用的。无论何时你开始学习一门新的编程语言,你首先应该了解的事情之一就是如何用这门语言编写函数。在某些情况下,函数也可以非常灵活,当然这因语言而异。在某些情况下,某些语法是可能的,而在其他情况下则不可能。计算机编程中一个惊人强大的概念是闭包函数的概念。今天我想回顾一下闭包函数到底是什么,以及为什么我认为它们是非常有用的技术。正如长期读者所料,今天我将使用 Julia,但是闭包函数在许多其他语言中也是完全可能的,包括(但不限于):

  • 计算机编程语言
  • C
  • C++

哦,对了,还有 SML,一种我只是模糊地熟悉的语言;不过,这种实现可能有点过火,因为到处都有函数定义。此外,如果您想看我努力安装这种语言,然后在编程时努力完成每一步,甚至到了我不知道如何将两个整数相除的地步,我实际上已经写了一篇关于尝试这种语言的文章,您可以在这里阅读:

请不要嘲笑我的绝望。

什么是闭包函数?

为了开始理解为什么闭包函数如此重要——特别是对于数据科学,我们可能应该从定义一个闭包函数开始。如果你在谷歌上搜索这个词,你可能会得到类似于

"闭包是与第一类函数绑定的词汇范围的名称."

如果你不理解什么是词法范围,或者什么是一级函数,那么这种描述是没有用的。幸运的是,这些只是计算机编程中简单概念的大名字。好吧,也许这些概念在引擎盖下不那么容易理解,但是通过查看代码比通过描述更容易理解。词汇范围意味着函数能够访问传统上不可用的范围。考虑典型的功能范围,

function example_of_scope(x, y)
    mu = mean([x, y])
    x += 5end

函数定义有一个私有范围。它可以访问它上面的作用域,在这个例子中是全局作用域,在 Julia 中是“Main”这是因为首先它是该作用域的子作用域,其次全局模块 Main 的作用域总是公共的。也就是说,如果我们移动到这个函数下面,并试图调用这个函数的值,我们会得到一个错误:

function example_of_scope(x, y)
    mu = mean([x, y])
    x += 5end

范围从顶级范围(在本例中是主模块)一直限制到我们的函数,每个部分包含越来越多的定义。例如,假设我们在 Main 中有一个名为“Tacos”的模块来保存我们的函数,那么我们的作用域应该是这样的:

module Main
# |Main scope
  | module Tacos
   # Tacos scope
     |
      function example_of_scope(x,y)...end

这是词法作用域,所以基本上——你可能用过的大多数语言都使用词法作用域,另一种方法是动态作用域,这通常意味着所有的名称绑定都是全局的。我们可以从 example_of_scope 访问 Main 和 Tacos 中定义的定义,但是不能从 Tacos 或 Main 访问 example_of_scope(x,y)中定义的定义。请记住,这些术语通常特指函数,在大多数情况下,使用一种非词汇范围的语言可能会很烦人。

这是拼图的一部分,那么什么是一级函数呢?第一类函数只是一个可以被当作参数的函数。在 Julia 中,我们可以很容易地传递 type::函数,并将函数作为参数。

example(f::Function, x::Int64) = f(x)

闭包函数是词法范围和更像常规类型对待函数的组合。在 Julia 中,这是非常流畅地完成的,并且使用了一些非常容易识别的语法,所以它实际上是一种很好的语言来演示这一点。

function example2(n)
    h = function hello()
        blahblahblah
    endend

所以现在我们有了 h 的函数作用域,它是在 example2 的函数作用域内定义的。记住,闭包函数实际上被称为闭包函数的一个重要部分是,这个作用域需要是词法性的。这意味着 hello 可以访问 example2 的范围。来自所述范围的所有值都保存在函数的定义中。例如,我们可以从 hello 函数中访问 n。

function example2(n)
    h = function hello()
        println(n)
    end h
endourfunc = example2(5)
ourfunc()5

闭包函数也是我的包 OddFrames.jl 中面向对象语法的主干,如果您想查看在该包中使用它们的上下文,可以在这里查看构造函数的源代码:

https://github.com/ChifiSource/OddFrames.jl/blob/last-0.0.7-patch/src/type/frame.jl

不同语言的实现

现在我们已经了解了闭包函数的基本知识,以及它们的技术定义,让我们看一些用不同语言实现闭包函数的例子。我们列表中的第一个是 Python,这有点奇怪。与 Java 类似,Python 使用 lambda 语法来定义匿名函数,这非常方便。只要想想作为一名数据科学家,您在另一个函数中编写匿名函数的频率,就可以看出这些函数有多有用。另外,我将要展示的所有代码都可以在我的随机代码库中的文件中找到,这里有一个链接:

https://github.com/emmettgb/Random_Code/tree/main/closure_examples

无论如何,这是我们之前用 Python 复制的例子:

def example2(n):
    h = lambda : print(n) return(h)ourfunc = example2(5)
ourfunc()5

这个例子很容易理解。我们用 lambda 创建函数 h,然后返回它。Python 让这变得非常简单,只需理解 lambda 就能理解这种语法。顺便说一句,如果你对 lambda 没有很好的理解,我确实写了一整篇关于它的文章!这里有个链接!:

基本上,lambda 为 Python 做的就是允许语言创建匿名函数。朱莉娅也有这种能力,可能有更多的方法来创造它们,但这里有两个例子:

f = () -> 5
f()5begin
     5end

begin 块将把函数返回给放在它前面的任何东西,这是一件需要注意的重要事情。我有一整篇文章是关于匿名函数的概念的,如果你想详细说明这一点,当在另一个函数的上下文中使用时,匿名函数本身通常是闭包:

https://towards data science . com/what-on-earth-is-an-anonymous-function-f 8043 EB 845 f 3

不幸的是,当谈到在 C 中做同样的事情时,我们会很快意识到,确定返回类型有些困难。然而,这可以通过使用 GNU FFCALL 变得简单一些。然而,有一种方法不需要 FFCALL 就可以实现,而且也很简单,最大的问题是获取返回类型。这是我们的函数,这次是用 C 语言复制的:

#include <stdio.h>
typedef int (*fptr)();fptr example2 (int n)
{
  void h ()
    { printf("%d", n); }
    return h;
}int main()
{
    fptr h = example2(5);
    h();
    return 0;
}

请允许我在这里解释一下代码。我们首先创建一个函数指针,*fptr,然后我们使用它作为返回类型,所以我们返回一个指向函数 h 的指针。这样做很好,并且有效地在 C 中创建了一个闭包。有趣的是,很多人使用苹果的 C 编译器的“block”语法,并使用 FFCALL 甚至 GCC 扩展来实现这个指针定义可以实现的功能。我不确定是否有必要更进一步,因为其他语言中的许多例子都将与前两个非常相似,只是要么有更多的语法,要么有不同的调用结构(除了像 SML 这样的函数式语言,但是……没有)。)

真实世界的用例

既然我们已经不再将闭包视为一个概念,那么请允许我向您展示一个实例,我在 Julia 中使用闭包做了一些非常棒的事情。我将要展示的代码是我的 Toolips.jl 项目的一部分。这个项目现在还很早,因为我现在有太多事情要做,而且我在空闲时间还在做的其他开源包的数量多得令人应接不暇。该项目旨在成为一个模块化的网络开发框架,既作为后端工具又作为前端工具,但通过元编程功能 JavaScript 完成所有前端工作。无论如何,如果你有兴趣观看这个项目或者给它一颗星(我很感激!)下面是 Github 资源库的链接:

https://github.com/ChifiSource/Toolips.jl

无论如何,我想用这个包来描绘两个核心思想,我认为它们都是网络开发的好主意。

  • 数据和回报应该功能化,
  • 应该存储发电机类型,并为每个服务单独调用。

根据我在这里提出的第一点,函数被大量用作数据应该是很明显的。这里有一个与我在 OddFrames.jl 中使用的技术类似的技术,这里使用了一些私有方法,这些方法也是闭包函数,这就是我展示它们的原因:

mutable struct ToolipServer
    ip::String
    port::Integer
    routes::AbstractVector
    remove::Function
    add::Function
    start::Function
    function ToolipServer(ip::String, port::Int64)
        routes = []
        **add, remove, start = funcdefs(routes, ip, port)**
        new(ip, port, routes, remove, add, start)
    endfunction ToolipServer()
        port = 8001
        ip = "127.0.0.1"
        ToolipServer(ip, port)
    end
end

这里有很多要看的,但是重要的部分是我加粗的部分。该部分通过调用 funcdefs()创建闭包函数,如下所示:

function funcdefs(routes::AbstractVector, ip::String, port::Integer)
    add(r::Route) = push!(routes, r)
    remove(i::Int64) = deleteat!(routes, i)
    **start() = _start(routes, ip, port)**
    return(add, remove, start)
end

因为这些是闭包函数,在它们各自的定义中,我们能够使用调用它的原始函数中定义的所有值。这就是 ip、端口和路由都作为参数提供的原因。代码中引用我们下一个函数的部分再次以粗体显示,下面是这个函数:

function _start(routes::AbstractVector, ip::String, port::Integer)
    server = Sockets.listen(Sockets.InetAddr(parse(IPAddr, ip), port))
    println("Starting server on port ", string(port))
    **routefunc = generate_router(routes, server)**
    [**@async**](http://twitter.com/async) **HTTP.listen(routefunc, ip, port; server = server)**
    println("Successfully started Toolips server on port ", port, "\n")
    println("You may visit it now at http://" * string(ip) * ":" * string(port))
    return(server)
end

目前,这个服务器还很简单,但是你已经可以看到它的结构是如何发展的了。这里最重要的是 generate_router()调用和 HTTP.listen()调用。在 HTTP.listen()中,我们提供 routefunc 作为参数,它是 generate_router 的返回。单单这个名字 routefunc 就可以帮助人们设想它实际上是做什么的。routefunc 是函数的返回,而不是函数。这是因为函数不是静态的,它需要根据提供给它的数据而变化。下面是这种情况的具体表现:

function generate_router(routes::AbstractVector, server)
    route_paths = Dict([route.path => route.page for route in routes])
 **   routeserver = function serve(http)**
     HTTP.setheader(http, "Content-Type" => "text/html")
     full_path = split(http.message.target, '?')
     args = ""
     if length(full_path) > 1
         args = full_path[2]
     end
     if fullpath[1] ! in keys(route_paths)
         write(http, generate(route_paths["404"]), args)
     else
         write(http, generate(route_paths[fullpath[1]]), args)
     end
 end # serve()
 **   return(routeserver)**
end

我将 routeserver 的返回和定义都用粗体显示,以便于查看。该函数在每次发出请求时运行,HTTP I/O 流由 HTTP 作为该函数的参数提供。之后,这个函数所做的就是生成与某人请求的 uri 相对应的页面。从表面上看,它很简单,但从外表上看,它变得非常强大。我认为这是闭包函数的一个很好的用法,此外,我认为这是解决管理路线和事物问题的一个很酷的方法。我知道有些人可能会好奇为什么我决定使用这种技术,而不是使用 HTTP。路由器,或者更进一步说,为什么我想首先开发一个网络服务器。

要回答第一个问题,用 HTTP.Router 处理许多独立的路由要困难得多。此外,流的处理不可能像在这个上下文中那样干净,在某些情况下,定制流甚至根本不可能。为了回答第二个问题,老实说,在 Julia 的 web 开发框架方面,我们真的很有限。对于 Julia 中的这个任务,我们可以选择 Mux.jl 和 Genie.jl。以下是 Mux 的文档:

对,没错,就是这样。

有一段时间,Mux.jl 也被弃用了,我想——或者可能是其他什么包。无论如何,当谈到 web 交互性时,虽然我们有一个很好的 WebIO/Interact.jl 连接,但是 WebIO mimes 评估起来有点慢,这完全可以理解——但是很烦人。他们也更倾向于科学互动,老实说,这是我认为 Interact.jl 的归属。Interact 真的真的很擅长那个。这是软件包应用程序。虽然已经有一些网络应用程序,比如 Pluto.jl,是建立在这个基础上的,但是我认为 Interact 的目标从来就不是成为一个全功能网络应用程序的后端(或者可能是,我不确定?)

事实上,我是 Genie.jl 的早期用户。Genie 可能是目前 Julia 网络开发的最佳选择,只是有些事情我希望它有所不同。其中最大的问题是,整个文件系统是一个很难做到轻量级的系统。这让我想起了 Django 与 Flask 的争论,说用 Flask 制作 API 比用 Django 要容易得多,但用 Django 制作 web 应用程序比用 Flask 容易得多。Mux.jl 非常注重成为一个反应式前端工具,我认为它在那个应用程序中做得相当好。也就是说,我们没有任何真正微观的微观框架。也就是说,我试图创造这一点——以及一定程度的模块化,这将允许它建立在附加功能的基础上。

结论

在讨论 Toolips.jl 时,我们可能有点跑题了,但重点仍然存在,闭包函数非常有用。我认为它们对我如此有用的部分原因是因为 Julia 有非常好的语法表达式和函数语法。这使得把这些定义拿出来并很好地使用它们变得容易多了。此外,你可以在任何地方使用函数作为参数,计算和表达式化字符串,Julia 代码,等等,所有这些加起来就是一个非常健壮的接口来编写这种性质的函数。我也喜欢 Python 的实现,我确信作为数据科学家,我们以前都使用过 lambda,它在处理数据时非常方便,如果你曾经在另一个函数中使用过它,那么你实际上是在编写一个闭包函数。

我希望这篇文章对阐述闭包函数这个主题有所帮助。它们真的很酷,在很多不同的情况下肯定会派上用场。它们对于函数式编程也非常有用,我想这是一个我在这里没有过多涉及的话题,但是我认为它的含义是非常清楚的。总的来说,这肯定是需要了解并加以利用的。因此,我很高兴我能与你详细地分享它!感谢您阅读本文,祝您在将所有代码转化为函数的过程中愉快!

如果你刚刚通过了技术面试,你该怎么办?

原文:https://towardsdatascience.com/what-should-you-do-if-you-just-tanked-your-technical-interview-273f3b1fa28b

如何识别哪里出了问题,并从糟糕的技术面试中恢复过来

知道自己表现不佳而退出面试是难以接受的。无论你目前已经就业并试图获得下一个职位,还是试图进入软件行业,在一次糟糕的面试后产生的负面情绪都会严重损害你的信心。深呼吸。

拒绝是一个非常情绪化的事件,不管它是在什么样的背景下发生的。仅仅因为你经历了一次糟糕的面试并不一定意味着你会被这份工作拒绝,但这是很有可能的。

上周我退出了面试,我知道我搞砸了。几个小时后我收到了拒绝邮件。我是一名专业的软件工程师。我三个月前升职了,我的雇主对我很满意。尽管如此,我没有很好地展示我自己和我的知识。

与大多数公司在面试中提出的技术编码问题相比,真正的软件开发需要非常不同的技能。 HackerrankLeetcodeStrataScratch 等技术面试题库展示了大多数雇主使用的。在我的专业工作中,从来没有人要求我找出两个数列之间的最小公分母和最大公因数,但是我在无数次面试中被问到过非常相似的问题。

请记住,现实生活中的编码不同于面试中的编码。仅仅因为你在技术面试中表现不佳,并不意味着你没有很强的技术技能和知识。

也许你得到了这份工作,也许没有。不管怎样,都有成长的空间。让我们一步一步地了解如何从一次糟糕的技术面试中恢复过来,以便充分利用这次学习经历。

1。从糟糕的技术面试中恢复过来:原谅自己
2。从糟糕的技术面试中恢复过来:把你的失败用
3。从糟糕的技术面试中恢复:建立你的课程
展示你的技术技能
展示你的软技能
从糟糕的技术面试中恢复的最终想法

1.从糟糕的技术面试中恢复过来:原谅自己

首先要做的是原谅自己表现不好。你尽力了!你把自己放在那里!这是一个庆祝你努力的巨大理由。意识到你获得了一次面试机会。给自己一个大大的拥抱,放松自己。说不和批评某人实际上很容易做到,但是承认你为获得新工作机会投入的时间和精力是值得追求的。

如果你有一种直觉,你做得不好,或者你马上感觉到你的表现差强人意——给自己一点时间来感受你的情绪。悲伤、失望、沮丧或愤怒都是正常的。我很快对自己感到沮丧,因为我没有在面试中很好地展示我的知识、技术技能和软技能。给自己时间和空间去思考这些情绪。短暂的正念冥想可以帮助你处理你的动作。你可能想去散散步,静静地坐一会儿,或者做一件单调的工作,比如吸尘。

莎伦·麦卡琴在 Unsplash 上的照片

在你减压并让你的负面情绪消散一点后,庆祝!你工作努力,聪明,会成为他们团队的一大亮点。出于这样或那样的原因,这在面试中没有表现出来,没关系。

现在是关注积极面的时候了。写下你在面试中做得好的三件事。你为面试官准备了一些很棒的问题吗?也许你在熟悉公司和他们的产品方面做得很好,或者你花了很多时间尝试实践技术编码问题。无论你认为你做得好,花时间为自己庆祝这些小胜利。

在面试中表现出色是知识、准备和自信的结合。认识到你的优势和你已经做得很好的地方是建立和保持面试信心的重要部分。

对自己好很重要。你可能很快会有其他的面试,或者你可能想申请其他的工作。保持你的动力和信心是你最终获得下一份编码工作的关键。

2.从糟糕的技术面试中恢复过来:将你的失败付诸实践

一旦你经历了个人情感的大起大落,消化了拒绝和失望,重新成为自己的头号粉丝,认真审视一下你本可以做得更好的地方。你是一个有知识、有技能的人,但你永远有成长的空间。

就像你思考自己做得好的地方,思考自己做得差的地方。也许你只准备了一个通用的编码面试,他们实际上让你在一个前端面试的 React 代码库中实现功能组件。也许你没有很好地讲述你的思维过程,这意味着面试官不能给你一些提示来引导你走向正确的方向。不管是什么情况,记下你认为你最大的三个增长领域是什么。

如果你得到了明确的反馈,那太好了!不是每个公司都花时间通过分享面试笔记来投资他们的申请人,这样你就有希望从他们那里学习和成长。然而,用批判的眼光看待这些反馈真的很重要。指出别人的弱点或缺点是很容易的,所以对这些反馈要有所保留。不要害怕为自己辩护。并非所有的批评都是正确的。

在我最后一次面试中,我真的让我的紧张情绪占了上风。我无法恰当地展示我的知识,面试官让我去复习基础知识。我知道我知道最基本的,但我的神经和情绪阻碍了我展示出来。当然,复习基础知识可能会让我对自己的知识更有信心,但这并不意味着批评是完全公平的。

用批判的眼光看待面试官的反馈。花点时间弄清楚反馈的哪些方面是你关心的,并且愿意继续努力的。考虑一下你认为最重要的三个增长领域是什么,需要投入时间去改进。

3.从糟糕的技术面试中恢复过来:建立你的课程

表现差的领域是成长的最大机会,所以试着往好的方面看。在最坏的情况下,这次糟糕的面试只是你的又一次训练。

如果你认为你在技术面试中最大的成长领域,你可以为自己建立一个技术面试课程。

在技术面试中有两个主要方面需要改进。要么是你的技术技能缺乏代表性,要么是你的软技能缺乏代表性。我将带你看一些例子,以及如何考虑训练自己来提高你在技术面试中的表现。

展示你技能的问题

你可能每天都在工作,但是你的雇主没有使用最新最好的。也许你的编码挑战是一个使用钩子功能组件。如果你说你精通 React,确保你已经掌握了非常简单的基础知识。回顾潜在雇主首选框架的文档是展示你知识的好计划。

也许你在日常工作中并不经常创建一个新的组件,但这是一件你可以练习的小而简单的事情。记住这些小事可以帮助你在面试中保持冷静,让你在面试中看起来优雅、沉着。

你去面试的编程语言是 Java 吗?也许可以考虑学习 JavaScript,因为它更轻量级,所以你可以用更少的输入来交流你的精彩想法。

展示你的软技能的问题

仅仅因为你以前找到了一份工作,并不意味着你将来会找到每一份你申请的工作。我目前是一名软件工程师。自从我在这家公司以来,我得到了提升,但我刚刚被另一家公司拒绝了。没事的!它发生了。

面试是应该练习的东西,但是我懂。很难将持续的面试准备与你的日常工作和生活融为一体。如果你已经有一段时间没有参加面试了,你想换工作,不管是在你现在的公司还是去另一家公司,重新参加面试就像拔牙一样痛苦。

尽管三个月前得到了提升,但当我参加一年多来的第一次技术面试时,我还是感到不知所措、紧张和有压力。不幸的是,那是一家我真正感兴趣的公司,我没有得到那份工作。我很久没练习了,我表现出来了。

如果你真的想尽快换工作,那就开始申请吧,不管申请的顺序是什么。然而,如果你的目标是一家或几家公司,并且你真的对它们很感兴趣,那么在你向这些理想雇主提交申请之前,你真的应该考虑排队参加一些其他公司的“实践”面试。

很难认真对待模拟面试或与你的朋友或家人练习对话,以使它们成为真正良好的面试实践。没有什么比一次真实的面试更能激励你去复习你的算法问题解决技巧和准备行为问题。

从一次糟糕的技术面试中恢复过来的最后想法

面试很难。用清晰、连贯的叙述来为你所有的技术知识提供证据确实是一个挑战。

离开一个面试,你觉得自己表现很差,或者你被告知同样多的事情,希望是善意的话语,这可能会令人沮丧和悲伤。这种糟糕的表现很难不打击你的自信心和对自己技能的信心。

提醒自己,面试是人为的环境。一次糟糕的面试不会使你迄今为止所做的工作无效。你仍然是一个才华横溢、知识渊博的开发人员,也是一个优秀的团队成员。

掸掉身上的灰尘,重新考虑你在技术面试中的优势和劣势,然后去参加下一次面试吧!

开放自由写作和代笔工作:【margo.hatcher.writes@gmail.com】T2。我专注于前端编程和数据科学。

这是什么

原文:https://towardsdatascience.com/what-the-hash-d678538b313

陷入不可避免的类型错误

所有 Python 开发人员在某个时候(或者实际上,很多时候)都面临的一个共同问题是带有神奇单词TypeError不可销毁类型。我们都同意,如果没有适当的背景,这听起来并不好,而且可能接近可怕。

Python 是一种大量建立在字典之上的语言。例如,名称空间就是这样存储它们的功能和属性的。理解字典如何在 Python 的 API 之外工作可以帮助我们理解这种数据结构并避免常见错误。

这篇文章将深入探讨映射类型,它们在内部做什么,以及这些知识如何帮助我们更多地了解不可修复的异常。

映射

数据访问有两种方式:

  • 全扫描,该过程需要遍历数据结构的所有元素。在 Python 中,一个例子就是List。虽然我们可以通过索引来访问一个条目,但是没有办法直接识别容器中的特定元素,而且索引可能会随着时间而改变。
  • 键查找,其中流程知道如何直接识别和检索特定的项目。映射是支持这种数据访问策略的数据结构。一个dict将是 Python 的一个映射类型的实现。

这两种方法的主要区别在于,对于映射,存储在容器中的数据需要提供一个,它将用于标识一个项目,以及一个,它是包含我们想要检索的数据的元素。

为了使键查找一致,需要满足几个属性(如果我们不修改容器):

  1. 一个值应该只能通过一个键访问。唯一值可以避免冲突,并有助于确保没有数据被不同的元素覆盖。
  2. 在键-值对的整个生命周期中,键应该总是返回相同的值。

哈希函数

hashable 键映射到存储在容器中的值确保上述属性成立。当我们向字典中添加一个新的对时,键本身不会用来存储值,而是存储对它应用散列函数的结果。

散列一个键来存储值。图片由作者提供。

根据图表,散列函数帮助我们在密钥的整个生命周期内基于密钥唯一地获得所需的值。让我们想象一下,如果哈希函数不具备这些属性,会发生什么情况:

哈希未保存属性混乱。图片由作者提供。

  1. 我们从产生相同散列的两个密钥k1k2开始H1
  2. 使用k1我们可以检索v1v2,最终导致数据不一致。
  3. 插入一个新的对(k3, v3),其中k3被散列为H0,这意味着我们丢失了v0的内容,因为我们用v3覆盖了它。

如果没有适当的保证,我们会得到意想不到的结果,甚至会丢失数据。

易变性

然而,散列函数并不是键查找中唯一涉及的函数。实际的关键对象也是等式的一部分。因此,为了确保满足两个主要的查找属性,我们需要引入一个重要的主题:可变性

我们说一个对象是不可变的,如果它的状态在创建后不能被改变,否则就是可变的。

即使散列函数是定义良好的,如果我们将散列函数应用于那些在其生命周期中拥有多种状态的可变对象,也会产生不同的结果。然后,我们在上面展示的混乱的映射中结束。

为了讨论方便,我们假设length是一个合适的哈希函数。如果我们想使用一个list作为键,我们将应用len(list)来访问容器。通过添加或删除元素(改变列表)来更新列表的状态意味着我们不能正确地从映射中存储和获取数据。

不耐洗型

上面的例子展示了为什么 Python 只允许不可变的对象成为映射键。字符串或整数是不可变的,所以开发人员可以安全地用它们创建dict:

但是尝试使用诸如listset这样的类型,会引发TypeError: unhashable type。为什么?因为这两个是可变的。我们可以随意添加和删除元素,因此哈希函数的结果会有所不同。

不可哈希类型错误告诉我们,我们正在尝试创建一个字典,其值不适合成为正确的键,因为我们无法确保哈希函数将总是为同一对象返回相同的输出。

不可变类型

strint是典型的字典键;在某些时候,我们可能需要其他数据类型。幸运的是,Python 为表带来了一些不可变的集合:

  • list vs. tuple:虽然列表是一个通用的有序集合,但是元组通常为它们的元素带来意义和结构。此外,元组是不可变的,由于它们不能被更新,每个位置保存一条特定的信息(推荐来源)。
  • set vs. frozenset:这两个结构共享了 C 实现的大部分,但是frozenset是不可变的。
  • frozenmap:这个还没有实现,但是有一个 PEP-603 正在考虑为映射添加一个持久数据结构。

结论

有时候,跳到一个主题的根本来理解 Python 为什么以这种方式工作是既有价值又令人兴奋的。

在本帖中,我们回顾了:

  • 映射数据类型的工作原理。
  • 散列函数和不变性如何在存储和访问数据时确保一致性和安全性。
  • 不同的可变和不可变 Python 类型。

选择 MLOps 工具/基础设施时需要考虑什么

原文:https://towardsdatascience.com/what-to-consider-when-selecting-mlops-tooling-infrastructure-88b0103a3171

指导您的公司建立其 MLOps 生态系统时需要考虑的事项

作者创作的标题卡

AI/ML 社区中最近最热门的话题之一是采用 MLOps 作为最佳实践。挑战在于 MLOps 很难实现。作为一家大公司的机器学习工程师,我已经了解了许多不同的启用 MLOps 的选项,因为感觉每周至少有一家新供应商联系我,问我是否有兴趣测试他们的新 MLOps 启用工具。到目前为止,我还没有看到任何 AI/ML 社区达成共识,认为有一个特定的 MLOps 工具被认为是 MLOps 的“工具”。对 MLOps 工具没有普遍共识的部分原因是不同的公司有不同的需求,我见过的一些工具对某些人来说比其他人更好。

这篇文章的目的是帮助你思考你自己公司的需求,以及你如何考虑 MLOps 工具和基础设施的高级方法。因为我提到了不同的公司有不同的需求,所以你不会在这篇文章中看到强硬的回答。此外,您不会看到我推荐任何特定的工具或平台。这些考虑足够广泛,以至于我们谈论的是哪个工具或平台并不特别重要。

为了保持简单和结构化,我们将基于两个变量分析一组 4 个组合:MLOps 工具和 MLOps 基础设施。当我提到 MLOps 工具时,我指的是您将用来启用 MLOps 的实际工具,当我提到 MLOps 基础架构时,我指的基本上是运行 MLOps 工具的计算平台。为了得到这些东西的 4 个组合,我将工具和基础设施分成两个考虑事项:

  • 工具#1:供应商产品解决方案:如果您选择使用外部供应商产品来帮助实现贵公司的 MLOps 需求,这将是参考。正如供应商产品通常所做的那样,他们试图抽象出许多挑战,这些挑战有望简化 MLOps 支持流程。
  • 工具#2:开源或定制解决方案:与供应商生产解决方案相反的是选择使用开源或定制的、自主开发的解决方案。与供应商产品解决方案相比,它可能会为您的公司节省大量资金,但它也要求您的 MLOps 工程师在技术上有足够的能力来实现这样的事情。
  • 基础设施#1:云提供商:如今,各种规模的公司使用云提供商来托管公司的 it 基础设施非常普遍。这些云提供商也有向特定领域提供特定服务的趋势,机器学习肯定也不例外。所有三大云提供商(AWS、谷歌云平台和微软 Azure)都有强大的机器学习支持选项。(但不是特别支持 MLOps,至少现在还不是。)
  • 基础设施#2:自我管理的环境:鉴于云计算仍然相对较新,许多大型组织仍然维护自己的服务器群以满足其计算能力需求是很常见的。也就是说,公司利用这些环境托管 MLOps 解决方案的情况并不少见。

现在,我们已经概述了我们的选择,让我们进入组合的好处,以及谁可能是这些不同组合的最佳服务对象。

组合#1:云提供商的供应商产品解决方案

好处:假设一切顺利,这种组合应该为您的公司提供最有效的实现 MLOps 的方式。因为这里基本上没有什么本土的东西,你应该能够削减你的公司必须保留的员工数量。对产品和云基础设施的支持将来自这些公司。在一个完美的世界里,这应该是任何人的最佳选择…

挑战:好吧,正如你可能会说的,实际上我对上面提到的好处并不太有信心。如果你不小心,这可能是最昂贵的选择,抛开这个事实,你实际上是试图从两个不同的盒子里取出拼图块,并希望它们能组合在一起。有时他们可以,但我经常看到供应商产品解决方案并没有真正与云提供商很好地融合。如果你考虑到云提供商也寻求提供他们自己的机器学习服务,那感觉有点故意的。(顺便说一下,这纯属猜测。)此外,如果你的公司已经以利基的方式建立起来,你实际上是在试图将一个圆钉同时穿过一个正方形和三角形的孔!

这是给的:在你将在本帖中读到的所有四种组合中,我显然最纠结于谁最适合这个选项。我能想到的最接近的是一家初创企业,尤其是如果这家初创企业提供的产品不是 MLOps 本身。例如,如果我是一名数据科学家,有一个用人工智能以一种新的、前沿的方式预测天气的好主意,我可能不想处理所有的东西来实现 MLOps。鉴于初创公司没有更成熟公司的“包袱”,初创公司在确保供应商产品/云提供商组合能够很好地满足其需求方面有更大的灵活性。但这也可能成为一个代价高昂的解决方案,所以尽管我认为一家初创公司仍然可以从这种组合中找到价值,但他们必须非常小心地正确设置。

组合 2:基于自我管理基础设施的供应商产品解决方案

好处:如前所述,许多公司仍然管理自己的服务器场以满足计算需求,但这些公司中的许多人也是 AI/ML 的新手。此外,AI/ML 可能更多的是一种“附带利益”,而不是核心产品本身提供的价值。(通过“这是给谁的”一节中的示例,这一点会更清楚。)像这样的公司可能有兴趣雇用一些数据科学家,但他们可能希望最大限度地减少实现 MLOps 所需的人才。鉴于这些因素,供应商产品工具可能是弥合使用您自己的计算基础架构和不必维护您自己的 MLOps 支持团队之间差距的最佳解决方案。

挑战:任何厂商的产品都会带来挑战,那就是确保贵公司的产品能够与工具正确集成。这里的挑战没有“云提供商上的供应商产品”选项那么大,但它仍然存在。任何供应商产品带来的另一个挑战是,它可能无法 100%地完成您希望完成的任务,尤其是在 MLOps 方面,我个人还没有见过任何供应商产品能够 100%地完成我希望它完成的任务。也就是说,您可能不得不购买多个供应商的产品来真正获得您需要的一切,或者您可能不得不围绕供应商的产品构建一些较小的定制解决方案来使其工作。

这是为谁准备的:最有可能从这种选择中受益的群体是,一家大型公司,其核心产品不是 AI/ML,但已经维护了自己的计算平台。我想象这里有一个像麦当劳一样的大型快餐公司。(我对麦当劳的内部运作没有内幕消息,所以以下纯属猜测。)我想麦当劳可能会维护自己的服务器群,以支持所有餐厅的收银机操作。归根结底,麦当劳的核心产品是食物,尽管人工智能/人工智能可以在某些方面有所帮助,但我无法想象麦当劳会想雇佣一群强大的人工智能/人工智能专家来为他们维持人工智能运营。(再说一次,我对麦当劳一无所知,所以我可能会大错特错。)

组合#3:云提供商上的开源/定制解决方案

优势:假设您在自己的内部服务器平台上已经有了一个很好的 MLOps 解决方案,但是您的公司决定在未来减少物理空间。云提供商提供出色的解决方案,帮助您相对轻松地迁移您的定制 MLOps 解决方案。此外,云提供商本身提供许多机器学习服务,经验丰富的 MLOps 工程师可以轻松利用这些服务。

挑战:就像很难将供应商产品集成到自我管理的基础设施上一样,将定制的 MLOps 解决方案移植到云提供商上也同样困难。MLOps 工程师可能可以灵活地让维护自己平台的基础架构工程师实现非常具体的事情,而云提供商则没有这么灵活。这并不意味着云提供商完全僵化;这不像处理完全可塑的东西那么容易。

这是给谁的:这个选项绝对最适合拥有强大的 MLOps 工程师但希望减少其物理计算基础架构的公司。虽然维护您自己的基础架构有很多好处,但也有很多相关的挑战。撇开维护服务器本身的更明显的挑战不谈,对于纯会计来说,还有一个更微妙的挑战。正如公司摊销建筑物或车辆之类的东西一样,许多公司也摊销他们的 IT 基础设施组件。单单这个会计结构就可能是一个巨大的挑战,所以如果您发现您的 MLOps 工具需要的 GPU 比您公司现有的更多,会计结构可能会阻止您及时获得这些 GPU。

组合#4:自我管理基础设施上的开源/定制解决方案

好处:在之前的组合中,我们谈到了在供应商产品和云提供商之间使用刚性结构的挑战。因为这个选项基本上让您可以完全控制您的 MLOps 系统,所以您可以自由和灵活地做任何您想做的事情。在您的公司拥有强大的 MLOps 工程团队和自己的计算平台的世界中,这种灵活性可能是一个梦想。

挑战:当然,这是一种“天上掉馅饼”的组合。虽然这种组合提供了很大的灵活性,但它也把所有的责任都推给了你自己的人。这意味着您必须拥有一支强大的 MLOps 工程师团队和同样强大的计算基础设施。仅从人力资源的角度来看,这自然意味着你需要雇佣最强的人才,这显然会非常昂贵。

这是谁的:自然,大多数公司都无法利用这一选项,但有一个小众群体可以(并且确实)从中受益:人工智能发电站。我特别指的是苹果、谷歌或亚马逊这样的公司。这些人工智能巨头已经在雇用最优秀和最聪明的人,因为他们维护自己的服务器生态系统,让他们聪明的工程师在自我管理的基础设施上构建定制解决方案自然是最有意义的。

这篇文章到此结束!我希望您能够更好地理解贵公司在选择如何启用 MLOps 时应该考虑的事项。随着供应商产品继续变得更好,云提供商继续推出新的机器学习解决方案,这一领域将如何演变,这将是一件有趣的事情。取决于这些事情如何发展,这些组合中的一个可能会对你的公司更有吸引力。在这个领域工作真是太棒了!感谢您的阅读,我会在下一篇文章中与您联系。😃

如果时间序列在增长(但长度不变),该怎么办

原文:https://towardsdatascience.com/what-to-do-if-a-time-series-is-growing-but-not-in-length-421fc84c6893

只需使用 AutoML 进行多元时间序列预测

用于多元时间序列预测的 AutoML(图片由作者提供)

有一种观点认为时间序列预测是一项复杂的任务。但是大家也不要心烦,因为也有好处——一下子有好几个时间序列的时候任务很多,这样的任务就更难了!当我们开始比较时,我们明白预测一个单变量时间序列并不困难(为幸福而休息)。但是当时间序列与其他参数的并发序列(多维序列)一起扩展时,该怎么办呢?如果你有预测这样一个系列的任务,但没有太多的经验,该使用什么方法和算法,以及该做什么(剧透——使用 AutoML,当它工作时,通过阅读关于这个主题的几篇文章来填补空白)。

什么是时间序列

如果我们从头开始,它是一个按时间排序的值序列。时间序列有一种模式:一个序列的当前值与之前的值相关。如果序列没有这样的性质,那么恭喜你(或者不是),你正在处理一个不能用经典(也不是很)模型预测的过程,在这种情况下你应该看看马尔可夫过程。

下面的简单图片说明了所描述的属性—这个背景足以继续阅读帖子(图 1)。

图一。时间序列示例(图片由作者提供)

如果你想了解更多关于如何预测时间序列的知识(尤其是用 AutoML),我已经贴了几篇关于这个话题的文章: AutoML for time series:绝对是个好主意时间序列的 AutoML:使用 FEDOT 框架的高级方法

什么是多元时间序列

越来越接近主题。多维(多变量)时间序列是由几个一维(单变量)序列组成的系统,其中一个(目标)的值不仅取决于其先前的值,还取决于另一个或几个额外序列的先前值。

多元时间序列的一个例子如图 2 所示。

图二。多元时间序列示意图。目标参数显示为红色,外部时间序列显示为蓝色(图片由作者提供)

从图中可以看出,为了预测时间序列 1 的未来状态,我们可以使用时间序列 2 和 3 的值。如果你对这样一个系列的例子感兴趣——这里,在不同点测量的海平面如图 3 所示。

图 3。太平洋不同点水位的多元时间序列。基于卫星测高数据(哥白尼《来自卫星观测的海平面每日网格数据》 [1])(图片由作者提供)

“多元时间序列预测”的两个不同案例现在值得强调。在第一种情况下,我们将只有当前时间指数和历史值的外生时间序列的可用数据,即 t,t-1,t-2,t-n,而预测指数 t+1,t+2,t+f(其中 f 是预测范围)的数据是未知的。或者,在第二种情况下,目标时间序列的预测指数值是未知的,但有关于这些时间点的外生指数的信息。这可以在图表中最清楚地显示出来(见图 4)。

图 4。使用辅助时间序列预测目标变量(图片由作者提供)

在第一种情况下,我们处理传统的时间序列预测任务,因为未来的状态是可以预测的。在第二种情况下,我们解决了回归问题,但因为数据是按时间顺序排列的,我们也可以将这种情况称为“动态回归”,它考虑了数据的滞后依赖性。在本文中,我们将只讨论第一种情况,因为第二种情况是回归问题的特殊情况。

P.S .如果你想了解更多关于使用时间模式的动态回归,请点击这篇文章:)这样,我会知道这个主题对你来说是有趣的,我会准备一个与该领域相关的新帖子。

我们如何预测这样的系列

越来越接近主题。使用向量自回归(VAR)来预测时间序列系统的行为。VAR 是对多个时间序列自回归思想的推广,因此被认为是多元序列预测的经典工具。一些时间序列可以包含在经典的预测模型中,如 ARMA。在这种情况下,这种模型将被称为向量自回归移动平均模型(VARMA)。递归神经网络也用于解决这个任务,它们是这个领域非常流行的工具。“更高级”方法的使用,例如基于 VAR 优化的,通常出现在科学文章中,关键词为“多元时间序列预测”。

让我们尝试考虑将已知的预测单变量时间序列的方法推广到多变量情况的方法。正如在文章AutoML for time series:advanced approach with FEDOT framework中所描述的,可以使用经典模型(AR,ARIMA)和回归机器学习模型来预测时间序列。为了使用回归模型,有必要对序列进行特殊的矩阵变换。对于单变量的情况,转换方案如下图所示(图 5)。

图 5。转换成单变量时间序列的滞后矩阵(图片由作者提供)

对于多元时间序列,将获得下表(图 6)。移动窗口大小和预测范围与上图相同。

图 6。转换成多元时间序列的滞后矩阵(图片由作者提供)

具有特征的结果表可以用作机器学习模型的训练样本,例如岭回归或随机森林,或者用于任何其他合适的算法。这样,模型将基于目标变量和外生时间序列的先前值生成预测。这个概念有两个缺点:

  • 同时用于所有时间序列的移动窗口的大小可能不是最佳的。对于其中一个系列来说,只通过 5-10 个元素“回顾过去”就足以成功地预测未来状态,而对于另一个系列来说,则需要数百个元素的滞后转换;
  • 不能保证外生时间序列与目标时间序列相关。

解决这些问题是可能的。然后我们再考虑怎么做。现在,让我们专注于如何运行 AutoML 工具来解决多变量时间序列预测的问题。

数据描述

演示将使用来自模型 NEMO (欧洲海洋建模核心)的海平面数据。这个模型允许我们准备一个包含 SSH(海面高度)测量值的数据集。我们收集了 25 个时间序列。它们在地图上的位置可以在下图中看到(图 7)。

数据集是合成的,由我们团队生成,即由 朱丽娅·鲍里索娃 。在BSD 3-Clause“New”或“Revised”License:SSH 数据集可以通过 链接【2】获得。

图 7。海平面数据集的可视化(图片由作者提供)

我们感兴趣的时间序列在图中用一个正方形突出显示。这是我们将要预测的一个,使用这个点的参数的历史值和相邻点的历史值。预测展望期为 50 个要素。

整个数据集(名为 SSH)以及运行它的代码可以在库 pytsbe 中找到。

如何在 FEDOT 中预测这些行

让我们继续看代码示例。所以,任务是用 25 个时间序列来预测其中一个(目标)在未来的值。

要运行这个例子,使用下面的代码(我们的时间序列是 numpy 数组,这里有一个启动的例子,FEDOT 版本为 experiments — 0.6.0):

我们用时间序列形成一个字典,它将被用作模型中的特征。

简单介绍一下配置选项

如果出于某种原因,我们不想在模型中包含所有的时间序列,我们可以只包含那些需要的键-值对来形成一个字典。因此,如果有大量的时间序列,导致模型过于复杂,不适合长时间,那么一个可接受的解决方案可能是修剪特征空间。

如果不需要运行 AutoML 算法,但是需要在有限的时间内建立至少简单的模型,我们可以使用 fit 方法中的参数 predefined_model='auto '。正如你可能知道的,FEDOT 的 AutoML 内核是基于一种进化算法。并且进化算法在优化开始之前生成一个或多个流水线(初始假设)。这些初始假设被反复修改,从而得到越来越精确的解。

所以,回到预定义的 _model='auto '参数。AutoML 算法将生成一个初始假设。但是,优化过程不会开始。该算法将只训练这一个自动生成的初始假设,并返回拟合的管道。这样做将允许我们在不运行 AutoML 算法的情况下快速准备模型。也就是说,我们使用预定义的管道配置(在这种情况下,由算法自动生成),并且只训练它,不训练其他任何东西。自然,这个过程需要的时间比运行 AutoML 内核少得多。下面是代码中的一个示例:

让我们回到进化(在这个实验中我们不使用 predefined_model):经过一定数量的代后,得到了如下结果(图 8)。

图 8。获得的模型和发现的管道结构对多元时间序列预测的验证结果(图片由作者提供)

看起来不错。让我们试着弄清楚内部发生了什么。

关于可视化的免责声明

我们最近更新了可视化工具,因此当使用 FEDOT framework 0 . 6 . 0 版或更高版本时,图形(管道)的显示可能与本文中的图片不同。

FEDOT 如何预测这些行

让我们考虑寻找解决方案的过程。首先,算法需要一些东西来启动进化过程——一些有效的初始假设。这种初始假设是自动生成的,并且获得了以下管道—查看图 9。

图 9。多元时间序列预测任务的初始假设(图片由作者提供)

这里发生了什么?—首先,时间序列被传递到每个“数据源”节点(1)。这些节点不会对它们的时间序列做任何事情,而是进一步传递它。

这样做是为了能够将新的数据源连接到管道。这也有助于理解哪些时间序列在管道中被转换(注意斜杠后面的名称,它们显示了时间序列的标签,因此我们可以识别它们)。因此,可以清楚地看出,滞后变换被应用于名为 0 的时间序列,并且它的副本被转移到 GLM 模型(2)。GLM 是一种广义线性模型,可以直接处理时间序列,不需要滞后变换。然后将滞后变换的输出传递给岭回归模型(3)。

然后,来自两个模型(GLM 和岭)的每个时间序列的预测被转移到岭回归模型(4),在这种情况下,最终模型也是岭回归。不要担心大量的岭回归模型——这只是一个初始假设,进一步的进化会在节点中选择更多的最优模型。

然后,基于该初始假设,通过使用变异来生成用于进化算法的初始流水线群体。在优化 AutoML 流水线结构的过程中,该算法可以改变节点中的操作(模型),删除节点和边,添加新的节点和边,以及调整操作的超参数。这意味着可以获得以下结构(图 10)。

图 10。优化过程中获得的可能管道结构(图片由作者提供)

从图 10 中可以看出,如果有必要,我们可以删除节点和整个分支。因此,我们可以剔除与目标无关的时间序列。

在图形优化过程中,我们可以单独调整每个序列的移动窗口大小(由滞后变换中的超参数窗口大小调节)。它解决了模型中不具有代表性的外生预测序列的问题。

这些“痛苦”是为了什么?

显然,为了减少预测误差:)但是,严肃地说,这个问题真的很好——是时候检查实现的方法是否至少给出了一些优势。为了确定外生时间序列的使用确实会影响最终预测的误差,我们来进行一个实验。

我们将使用算法自动生成的初始假设来预测时间序列。在这种情况下,我们将使用目标时间序列的历史值作为预测值,然后我们将迭代扩展附加时间序列的数量。对于目标时间序列的最后 50 个元素,我们将比较预测值和实际值。度量:平均绝对误差(MAE)。该测试的结果显示在下面的动画中:

动画。实验外生时间序列数量的迭代扩展(图片由作者提供)

图 11 显示了误差对来自系列数量的验证样本的依赖性。

图 11。在模型中使用不同数量的时间序列获得的 MAE 值(图片由作者提供)

从图中可以看出,模型中包含的时间序列数量影响误差值。注意:在这个实验中,我们没有调整管道的超参数,也没有使用进化算法修改初始结构。与简单模型相比,当模型使用大量时间序列时,有更多的机会来改进模型。因此,在超参数调整和其他优化程序之后,更复杂模型的优势可能会增加。

结论

在这篇文章中,我们考虑了预测多元时间序列的方法。我们讨论了如何用 AutoML 预测这样一个序列。然后,我们详细查看了 AutoML 工具 FEDOT 中用于多变量 TS 预测的所有内容是如何设计的。

预测时间序列,用 FEDOT!

有用链接:

本帖中使用的数据集(&许可证):

  1. 哥白尼“从卫星观测得到的海平面每日网格数据”。参考文献。致 Taburet,g .,Sanchez-Roman,a .,Ballarotta,m .,Pujol,M.I .,Legeais,J.F .,Fournier,f .,Faugere,y .,Dibarboure,G.: Duacs dt2018: 25 年的再加工海平面测高产品— 2019。
    链接到数据集哥白尼数据集
    许可许可协议
    链接更新到 2022 年 11 月 2 日
  2. 海面高度(SSH)合成数据集。
    链接到数据集SSH 数据集
    许可证BSD 3-条款“新的”或“修订的”许可证
    链接到 2022 年 11 月 2 日是最新的

如何预测多元时间序列的解释由 me(米哈伊尔·萨拉法诺夫)NSS 实验室团队准备

当 A/B 测试结果不显著时该怎么办

原文:https://towardsdatascience.com/what-to-do-when-a-b-test-result-is-not-significant-21e905ff9eba

落实具体行动的四步框架

来源:马库斯·温克勒在 Unsplash 上的文章

太长;不要读

  • 第一步:检查实验设置&数据正确性
  • 第二步:检查样本量和统计功效是否足够:如果收集的样本满足所需的最小样本量,进行非参数检验,评估实验是否功效不足。如果流量不足,继续等待,因为通常不建议根据历史趋势制定推断假设(最后的选择)。
  • 第三步:检查新产品功能是否成功:深入细致的用户分析&评估产品功能的有效性例如,使用热图/漏斗绘制用户旅程,探索产品采用情况,按用户组细分等
  • 第四步:确定下一步行动:如果第二步有暗示,建议延长试验期或减少差异,或者如果第三步有激励,向产品经理交付相关的可操作分析。

介绍

本文讨论了当实验被证明在统计学上无关紧要时,数据科学家应该如何反应。最好是对统计功效、最小样本量计算等 A/B 检验有一些基础知识,并且有兴趣深入研究细节的人。

我们多久观察到一次无关紧要的结果?

可悲但真实的是,在这个行业中,意想不到的微不足道的结果经常发生。根据我个人的经验和对数据科学团队的观察,几乎三分之一的实验都以北极星度量的无关紧要的 p 值而告终。此外,除了这些关键指标之外,很可能还有其他指标无法证明统计意义。

因此,我们遵循科学方法来解释这些测试结果并得出可信的结论是至关重要的。受< 值得信赖的在线受控实验:A/B 测试实用指南 >(见参考文献)的启发,我想介绍一种循序渐进的方法,将我们从这种看似毫无头绪的状态带入可操作的阶段。

有哪些常见的原因?

在我们很好地了解原因之前,最佳解决方案不会形成。如果假设没有新奇效应、变化厌恶和网络效应(这些应该有一个完全不同的章节,因此不是本文的重点),常见的原因包括:

  1. 测试功能实际上并不成功。
  2. 评估指标的方差太大,无法反映治疗的变化。
  3. 该实验仅影响随机人群的一小部分,稀释了评估指标,导致提升不明显
  4. 实际处理效果小于最小可检测效果,因此在给定预定样本量的情况下,实验提升不能被解释为显著结果。

本质上,上述 4 个原因可以归为两个关键问题:

  • 产品问题:新的特性或策略实际上在推动评估指标方面并不有效。
  • 统计功效不足问题:换句话说,实验动力不足,对检测我们预期的微小效应不敏感,即使它确实存在。通常是由于样本不足和方差过大造成的。

第一类问题很容易理解,所以我将用本文的大部分时间讨论第二个问题,这通常更常见。

对 GoodUI.org 115 次 A/B 测试的评估表明,大多数测试动力不足(乔尔杰夫 2018 )。

统计能力不足的原因之一是,大多数现实世界的 A/B 测试针对的是用户的一个小众子集,而不是整个人群,这使得合格的实验用户群不再有大约 10 亿的数量级(大多数大型科技公司的 MAU),而是比这个数量级小 100 倍左右。

例如,一个电子商务平台的结帐页面上的结帐按钮的 UI 实验样本只涉及登录结帐页面的用户。如果我们假设这个电商平台的 MAU 是 10 亿,一般的用户旅程是‘登陆页—商品详情页—购物车—结账页’,每个阶段的转化率是 5%,那么我们一个月能找回的最符合条件的实验流量只有:

10 亿用户×5%×5%×5% = 12.5 万用户。

虽然 10 亿的 MAU 并不是微不足道的,但对于像每用户 GMV 这样的不稳定指标来说,125,000 并不是一个很大的数字。此外,如果这种面向消费者的 A/B 实验已经面临流量短缺,那么当我们为其他商业方进行测试时,如抖音的创作者、亚马逊的商家、脸书的广告商等,可能会更加困难。这重申了理解数据科学家在遇到权力不足和无足轻重的结果时应该做什么的必要性。

来源:Unsplash 上的活动创建者

详细展开:数据科学家应该做什么?

步骤 1: 检查实验设置&数据正确性

  1. 检查实验参数是否按预期分布:再次检查以确保暴露于该实验的人口流量百分比与计划相符。此外,处理组中的用户确实可以看到所有新产品特性的变化,而控制组中的用户只能与当前版本进行交互。虽然它们似乎是非常基本的甚至是不必要的健全性检查,但在我过去的组织中,数据科学团队不止一次发生事故。
  2. 确保数据正确可信:数据科学家需要具体检查以下 3 件事:
    • 构建关键指标的 SQL 是否正确? - 交通分流是真的随机吗? ( 考虑使用卡方检验对两组之间的合格人群差异进行检验 )
    • 两组中的流量是否相同? ( 检查性别、年龄等关键特征的 p 值分布是否均匀)

第二步:检查样本量和统计功效是否足够

  1. 如果实际累计流量没有达到我们预先计算的最小样本量: 显然,保持等待从统计学角度来看是最优解。然而,由于外部因素,如咄咄逼人的产品经理或即将召开的管理会议,我们有时需要给出建议。在这种情况下,尽管不推荐,我们可以基于历史模式进行经验推断—如果我们观察到在过去的大多数日子里治疗和控制差异为正,那么证明统计显著性可能只是时间问题。当基于这些描述性模式制定推论时,我们需要警告自己不要为了 p 值而编造故事。
  2. 如果实际累计流量已经达到我们预先计算的最小样本量:
    2–1。进行非参数测试
    建议从非参数测试开始,以收集更多信息供我们参考。尽管这些非参数测试不太稳健,统计能力也较弱,但当我们的基础数据可能是非正态的,并且被极端值扭曲甚至扭曲时,它们会更加准确。
    2–2。评估功率是否足够
    不幸的是没有直接的后测试方法来判断测试是否功率不足。我个人的方法是基于经验,考虑到历史实验和商业背景。然而,我相信问我们自己两个问题有助于评估 A/B 检验能力的充分性:
    (1)我们的指标是否通过使用更一般的人群而不仅仅是暴露的实验组进行计算而被稀释了
    (2)我们的关键指标是否正在经历比预期更高的方差

步骤 3: 检查新产品功能是否成功

更深入研究的目标是发现并排除任何可能的产品原因导致的无关紧要的结果。下面列出了一些技巧:

  • 用户转化分析:在漏斗图中可视化用户旅程,了解用户的行为如何受到处理的影响。
  • 页间分析:分析 A 页的处理如何影响用户在其他页面的行为。
  • 页面内分析:使用热图分析页面 A 上的治疗功能如何影响用户与页面 A 上其他模块的交互。
  • 用户群分析:按地理区域、流量来源、新/老用户等关键业务维度细分实验队列。探索一组反映高统计学显著性而其他组对变化无动于衷并冲淡治疗效果的可能性。

来源:印度尼西亚 UX 的 Unsplash

第四步:确定下一步行动

  1. 如果无关紧要的结果更可能是电力不足问题,我们有两类方法来提高测试灵敏度:
    1–1。 扩大样本量
    (1)延长实验周期让测试运行更长的时间框架;
    (2)调高流量比,将实验暴露给更多用户。
    1–2。减少方差
    (1)设计波动性较小的度量指标(如‘搜索总数’通常比‘搜索者数量’有更大的方差);
    (2)通过二值化或对数变换来变换度量;
    (3)实施分层或使用预先存在的数据的控制实验(CUPED) :分层通过组合来自各个层的结果来减少方差,CUPED 使用预先实验数据来控制固有方差。两者都是非常有用的技术,可以很容易地应用于几乎所有的 A/B 测试框架。(查看如何使用 CUPED 使 A/B 测试速度加倍以获得更多详细信息 )
    (4)设计成对实验:如果您有几个拆分流量的实验,并且每个实验都有自己的控制,请考虑将单独的控制集中起来以形成一个更大的共享控制组,并提前将两组中的每个人配对以减少特质差异。阿里巴巴淘宝的数据科学团队采用了这一想法,以对长期以来样本不足的商家进行更稳健的实验。
  2. 如果无关紧要的结果更有可能是产品问题,我会建议制定一份结构化的报告,并以完整的方式传递这一信息。鼓励在步骤 3 中附上的分析,关于哪里的功能出了问题哪些是潜在的改进方向

作者提供的图片—上述框架的流程图

总结和警告:不要偷看 P 值

E 每个人都想要冲击。产品经理不希望自己从头设计的功能因为无关紧要的结果而被扼杀在摇篮里。数据科学家也不想放弃他们可以在绩效评估中撰写的潜在内容。

然而,人们应该永远记住,数据科学家被称为“科学家”,因为他们应该采用科学的方法来分析产品,而偷看 p 值操纵数据以伪造故事肯定不在其中。

处理无关紧要的测试结果的一个推荐方法是彻底探究其原因,同时谨慎地防止我们自己无意中犯下假发现错误来操纵具有统计意义的结论。

参考

柯哈维,r .,唐,d .,,徐,Y. (2020)。可信的在线控制实验:A/B 测试实用指南。在可信的在线控制实验:A/B 测试实用指南 (p. I)。剑桥:剑桥大学出版社。

格伯,艾伦 s 和唐纳德 p .格林。2012.现场实验:设计、
分析和解释。诺顿公司。
https://www . Amazon . com/Field-Experiments-Design-analysis diversion/DP/0393979954。

更多细节请参见 Michael Berk 撰写的《如何使用 CUPED 将 A/B 测试速度提高一倍:https://towardsdatascience . com/How-to-Double-A-B-Testing-Speed-f 80460825 a90

动力不足的 A/B 测试——困惑、神话和现实,作者格奥尔吉·格奥尔杰夫:https://blog . analytics-toolkit . com/2020/under powered-A-B-Tests-困惑-神话-现实/

当你的实验返回一个无统计学意义的结果时,该怎么办

原文:https://towardsdatascience.com/what-to-do-when-your-experiment-returns-a-non-statistically-significant-result-81ecaf56fb32

从无统计学意义的结果中可以学到很多东西——当你报告结果时需要非常小心

Unsplash 上由 Ameer Basheer 拍摄的照片

TL;博士

  • 当你得到一个没有统计学意义的结果时,有两种主要的解释:(1)影响(如果有的话)太小而不能被捕捉到(2)你的研究动力不足
  • 深入研究结果,了解为什么它在统计上不显著,可以获得一些有助于改进实验设计的知识
  • 报告时——重要的是报告所有的结果以及它们的置信水平(并让你的听众理解置信水平的含义),以确保根据你的结果做出合理的商业决策

形势

想象一下:

  • 你正在为一家游戏公司工作,该公司发布了一款免费游戏(有可能删除付费用户的广告)。
  • 你支持的收购团队的目标是增加付费用户的数量。他们有针对这一指标的季度 OKR。
  • 他们开展了一项新的电子邮件活动,邀请免费用户转向付费用户,他们想了解这项活动的影响

您通常会与他们讨论为这种活动进行实验是否有意义,但团队担心发送这些电子邮件的潜在负面影响(例如,用户选择退出电子邮件通信)。

  • 您与团队一起定义一个总体实验标准(即一个考虑了不同因素的综合指标,它将作为决定实验成功与否的标准)
  • 您可以定义您希望在实验后运行的后分析(例如,确保您的研究有足够的能力对数据进行切片)
  • 您与团队讨论,以了解哪个时间段最适合该实验,以及他们如何定义该实验的“成功”
  • 根据之前定义的 OEC 和你认为你能影响它的程度,你可以计算出一个好的实验样本量
  • 你实际上是在进行实验,A 组是邮件活动的目标,B 组没有收到邮件。

你选择的时间框架是“几天后”:结果出来了——但不幸的是,它们在统计学上并不显著。

深入研究结果

您的结果没有统计学意义有两个潜在原因:

  • 你的活动没有影响或者影响很小
  • 你的学习动力不足

重要的是要很好地理解是什么真正导致你的实验没有统计学意义。这将让你确保在实验后做出的决定是正确的。

你的活动影响极小

想象两个相同的淡水湖,你在其中一个湖里倒入一杯盐。你对你治疗组的湖水含盐量有影响吗?从技术上来说,你确实往湖里加盐了——但是这种影响很难测量,如果不是不可能的话。

在我上面提到的情况下,你给你的免费用户发了一封邮件。很可能不是治疗组的每个人都收到了邮件并打开了它——你的目的是治疗整个治疗组,但你只治疗了一个小组。也许你的电子邮件产生了影响,但是由于你的治疗组中实际上没有得到治疗的用户数量,记录这种影响可能会变得棘手。

在这种特定情况下,根据你的研究问题和你试图证明的东西,你可能想使用一种方法,如编者平均因果效应 (CACE),这将允许你估计你的电子邮件对实际收到/打开它的群体的影响。

但有时,即使有这些方法,效果大小仍然太小,以至于没有统计学意义。在这种情况下——问题是:如果变更影响很小或没有影响,您是否希望继续进行变更?

你的学习动力不足

简而言之,这意味着你没有足够的观察结果来自信地说你观察到的变化(如果有的话)是由于你的治疗或者仅仅是由于随机的机会。

这在很大程度上取决于你想要什么样的信心水平,以及你正在寻找什么样的指标来跟踪“变化”。这就是为什么在运行您的实验之前,总是建议进行功效分析,以了解在您想要的显著性水平上,需要多大的样本量才能获得具有统计显著性的结果,以及您为您的实验选择的成功度量。

不得不报告“由于样本量太小而没有统计上的显著影响”并不是一个理想的情况。因为这给解释和讨论留下了很大的空间,而这并不是你设计实验的真正目的。然而,一线希望是,如果你真的处于那种情况下,由于这个实验,你现在对你的治疗的影响程度(及其方向)有了更好的理解,你可以用这个更新的数据重新进行功效分析,这有望为潜在的下一次实验提供更合适的样本量。

(无耻的自我推销:在后续文章中,我将深入研究计算功率时的不同参数,以及如何使用它们来确保您能够回答您想要回答的问题)。

举报什么?

报告有统计学意义的结果肯定是有偏见的。但是随着时间的推移,我们似乎失去了这个词的全部含义。

你一直在用那个词,我认为它的意思不是你想的那样

“统计显著”意味着我们看到的结果不太可能是偶然的。但是“这种可能性”是(或者至少应该是)由你/你的利益相关者设定的,基于你对出错的风险以及结果的偶然性有多满意。

通常,选择约 95%的置信度作为阈值(著名的 p <0.05). But this is simply a convention — it doesn’t have to be what you use for your project. In the case of the email campaign presented above, if the campaign had an impact of +20% adoption, but you are only sure about this result with ~90% confidence — most likely you’ll still proceed with launching this campaign (while technically not having a statistically significant result at 95%).

Generally speaking — to avoid this binary approach, 文献 (1)建议报告观察到的差异(效应大小)以及 p 值(可能会突出显示“统计信号”的结果)。这样你就可以对效果的大小有一个全面的了解,并对效果有信心。

结论

在商业世界中,我们喜欢 stat sig 与非 stat sig 的二元方法,因为这感觉像是“科学支持”的绿灯,让我们继续做出决定。

但这可能会产生破坏性影响,从激励人们不报告非 stat sig 影响到扼杀没有显示 stat sig 积极影响的项目(尽管它们确实产生了积极影响)。

最终,很好地理解实验实际显示的东西和一些常识可以帮助你最大限度地利用这些结果。

希望你喜欢阅读这篇文章!你有什么建议想要分享吗?在评论区让大家知道!

如果你想更多地了解我,这里有几篇你可能会喜欢的文章:

</7-tips-to-avoid-public-embarrassment-as-a-data-analyst-caec8f701e42> https://medium.com/@jolecoco/how-to-choose-which-data-projects-to-work-on-c6b8310ac04e

(1)重要的真诚:报告非显著性统计结果,Denis C. Visentin,Michelle Cleary,Glenn E. Hunt

作为一名数据科学家,当你感觉陷入困境时该怎么办

原文:https://towardsdatascience.com/what-to-do-when-youre-feeling-stuck-as-a-data-scientist-1e53723ff235

低迷会在你最意想不到的时候到来:工作太慢或太忙乱;天气太热,或者时事太分散注意力。也许一个最初让你兴奋的项目变成了一个哑弹,或者你正在尝试的一个工具让你慢了下来。一个数据科学家(或者任何人,真的)可能会比平时更不专注或更不投入,原因有很多。幸运的是,我们都可以做一些事情来寻找新的灵感火花。

本周,我们收集了最近最受欢迎的几本书,我们发现它们特别令人振奋——无论是因为它们提出了改变事物的具体步骤,还是对你可能已经很熟悉的话题提供了新的视角。

  • 借邻学科之见 。看看其他团队的同事在做什么可以让你对自己的工作流程有不同的看法。 Olivia Iannone 倾向于软件工程最佳实践,建议你可以简化你的数据管道的方法,从尝试 sprints 到创建声明性数据产品。
  • 启动宠物项目 。几年前,当 Jan Majewski 的数据科学技能达到顶峰,而他的日常工作又不能提供他所追求的学习机会时,他就自己动手开始了一个副业项目。这最终成为他新的日常工作,并促使他拓展自己的技能。
  • 给你的数据一个有创意,让人瞠目结舌的造型 。有时候,对于一个感觉陈旧的项目,你需要的是改变你展示发现的方式。Kruthi Krishnappa 分享了分层数据的六个圆滑的可视化想法——谁知道呢,也许你的工具包里就缺少一个圆形的树形图呢?

照片由 Unsplash 上的 Nvr Endng Anupam 拍摄

  • 制定回答疑难问题的框架 。“探索数据可能会很痛苦、很无聊,但这也是根据经验回答任何问题的起点。”昆廷·加利亚博士的最新深度探索使用了一个食谱的隐喻——从原料选择到最终品尝——作为克服挑战性问题的强大心智模型。
  • 实验,找出适合你的 。塞斯·比里奥说,当我们感觉自己在“兜圈子”时,“重要的是检查我们的日常工作,并找到新的方法让事情变得有趣。”他接着提出了五个具体的、以数据科学为重点的建议来帮助你摆脱常规:例如,阅读研究论文或从基本原理中探索新方法。

当事情不像我们希望的那样顺利时,另一个完全合理的想法是什么也不做,只是让休息和清晰的议程来做它们的事情。如果这是你的首选操作模式,但你仍然想读一些有趣的东西,我们也为你准备了。

感谢您本周与我们共度时光;对于你们中那些最近跨越并成为中级会员的人来说,你们的支持对我们来说意义重大。

直到下一个变量,

TDS 编辑

我们能从黑盒模型中学到什么

原文:https://towardsdatascience.com/what-we-can-learn-from-black-box-models-eda3677c42f2

使用非线性模型的数据探索和知识生成

(来源: flaticon )

黑盒模型可以自动模拟复杂的关系。与线性模型相比,捕捉数据中的这些趋势可以提高它们的准确性。

然而,准确性只是好处之一。

我们可以分析这些模型,了解它们是如何做出这些预测的。这可以揭示我们数据集中的潜在关系。在某些情况下,这些对我们来说可能是全新的。这就是机器学习如何成为数据探索知识生成 的工具。

此外,提供感觉检查帮助调试模型。这些知识可以用来

  • 通知特征工程非线性模型。
  • 做出超越模型的决策时提供帮助。

我们将讨论如何从黑盒模型中学习。这包括理解数据中的重要关系以及这些关系的本质。

为什么我们可以从非线性模型中学习?

在我们深入探讨之前,让我们先讨论一下 为什么 我们可以从这些模型中学习。非线性模型可以模拟数据中的非线性关系和相互作用。就拿图一中的二手车价格散点图来说吧。汽车价格并不总是随着年龄而降低。对于老爷车(classic = 1),它增加。我们说在我们的数据中有一个相互作用。价格和年龄的关系取决于第三个特征——经典

图 1:交互的例子(来源:作者)

非线性模型可以自动模拟这样的关系。让我们以图 2 中的简单决策树为例。汽车首先被分为普通(0)和经典(1)。正常车,车龄 15 年以下的价格更高。对于老爷车来说,更低。这并没有完全抓住我们在图 1 中看到的关系。要做到这一点,我们可以给决策树增加更多的层次。我们也可以使用更复杂的算法,如随机森林、XGBoost 或神经网络。

图 2:交互的决策树模型(来源:作者)

当我们谈论数据探索/知识生成时,我们通常会依赖这些更复杂的算法。它们有时被称为可解释模型或黑盒模型。他们能够捕捉数据中复杂的关系。同时,我们不需要“告诉”他们这些关系的存在。像决策树一样,我们可以只给他们经典和年龄特征。在进行预测时,模型将自动利用特征之间的相互作用。

相比之下,线性模型(即线性和逻辑回归)不太复杂。为了捕捉这些模型的非线性关系,我们需要做特征工程。使用新特性,我们可以将非线性关系表示为线性关系。为了了解要创建什么特征,我们需要研究我们的数据。我们可能还需要相关领域的领域知识。

从某种意义上来说,黑盒模型在模型的结构中进行这种特征工程。他们非常擅长在数据中寻找模式。问题在于这些模型的内部运作过于复杂。我们无法理解他们如何通过单独查看模型参数/结构来做出预测。我们需要使用额外的技术来理解它们是如何工作的。

我们能学什么,怎么学?

这就是可解释机器学习(IML)领域的用武之地。除其他外,它旨在开发我们可以用来理解黑盒模型如何做出预测的方法。我们讨论了其中的一些技术,以及它们在模型/数据方面能教给我们什么。

提供一个基准

首先,黑盒模型可以提供的一条有价值的信息是基准。通过捕捉非线性关系和相互作用,这些模型可以提高预测的准确性。为了确定性能,我们实际上不需要 IML 方法。我们可以依赖准确度、精密度或回忆等指标,或者 ROC 曲线等可视化指标。

使用黑盒模型可以告诉我们预测目标变量的能力有多强。我们可以将这些结果与不太复杂的线性模型的性能进行比较。假设,我们发现黑盒模型要精确得多。这告诉我们,线性模型在我们的数据中遗漏了重要的关系。此时,我们可以用 IML 方法来理解那些关系是什么。

重要的关系

首先,我们可以了解数据中哪些特征是重要的。这些是可用于预测目标变量的特征。大多数非线性模型能够处理大量特征(超过 50 个)。这些特征是否高度相关也无关紧要。这意味着,通过使用非线性模型,我们可以理解大量特征的重要性。相比之下,像线性回归这样的模型需要一个较小的不相关特征集(8-10)。

我们可以使用的一个度量是排列特征重要性。在图 3 中,您可以看到用于预测鲍鱼年龄的 xgboost 模型的分数。我们可以看到鲍鱼壳的长度在预测年龄时很重要。接下来的三个特征基于鲍鱼的重量。虽然这些特征高度相关,但是它们没有对模型产生负面影响。我们可以理解,所有这些特征都可以用来预测年龄。

图 3:特性重要性分数的例子(来源:作者)

如果我们使用相关性来识别重要的关系,我们可能会错过其中的一些特征。这是因为相关性仅给出线性关联的度量。换句话说,这种方法只能突出显示具有显著线性关系的要素。相比之下,特征重要性告诉我们一个特征对模型的预测有多重要。模型的预测能力可能来自相互作用和非线性关系。这些将反映在特征重要性分数中。

SHAP 值可以提供一个替代的衡量标准。我们可以使用这些来找到每个特征的绝对平均 SHAP 值。与要素重要性类似,这可以判断哪些要素对预测的贡献较大。这两种方法的问题在于,它们没有告诉我们模型所捕捉的关系的性质。

非线性关系

如果某个特征与目标变量有某种关系,则该特征可用于进行预测。它可以是线性的,也可以是图 4 中所示的非线性关系之一。为了找到并可视化黑盒模型捕捉到的非线性关系,我们可以使用其他 IML 方法。

图 4:非线性关系的例子(来源:作者)

可视化的例子有 部分相关图 (PDP)累积局部效应 (ALE)图。这两种方法都显示了要素和模型预测之间的一般关系。PDP 易于理解,但会受到功能依赖性的负面影响。ALE 图没有这个问题,但它们更复杂,更难解释。

另一种方法是使用 SHAP 值。上面我们提到了这些。对于给定的预测,它们给出每个特征对该预测的贡献。我们可以绘制 SHAP 值对特征值的曲线图。这就是所谓的依赖图。它可以向我们展示某个特性的值与其对预测的贡献之间的关系。

我们将在下面的文章中讨论这些以及更多的方法。第一篇更深入地介绍了如何发现并可视化非线性关系。第二部分关注 SHAP 值和用于应用它们的 Python 代码。我们还会查看这些值的不同聚合。这些包括上面提到的平均 SHAP 和依赖图。

相互作用

互动实际上被认为是一种非线性关系。它们相对于一个特征是非线性的。这些特征关系将取决于第三个特征的值。事实上,交互可以更加复杂。一个特征的关系可能取决于两个或多个特征的值。对于大多数应用程序,我们只关心两个特征之间的那些。

一种可视化互动的方法是 冰图 。你可以在图 5 中看到一个例子。这里,数据集中的每个观察值都用一条线表示。该数据集包含二手车销售的详细信息(例如,价格、车龄和车型)。对于每个观察值,该线显示预测价格(部分 yhat)如何随车龄变化。黄色粗体是我们上面讨论的 PDP 的一个例子。它给出了所有单个预测线的平均值。

图 5:冰图示例(来源:作者)

我们根据汽车类型给上面的线条涂上颜色。蓝色代表老爷车,红色代表普通车。你可以看到老爷车的关系偏离了平均趋势。直觉上,经典作品的价格会随着年代增长是有道理的。冰图告诉我们,车龄和价格的关系取决于车的类型。换句话说,车龄和车型是有交互作用的。

另一种方法是使用 SHAP 交互值 。这些是 SHAP 值的扩展,其中考虑了主效应和交互效应。我们可以用这些来可视化互动。我们还可以计算平均绝对相互作用效应来突出重要的相互作用。这类似于特征重要性分数,但用于交互。另一个用来强调互动的指标是弗里德曼的 h 统计量。

同样,我们将在下面的文章中更深入地讨论所有这些方法。第一篇深入探讨了如何发现和可视化交互。第二种侧重于使用 SHAP 来分析相互作用。我们还讨论了用于应用该方法的 Python 代码

我们能用这些知识做什么?

所有这些 IML 方法都可以帮助我们理解模型是如何做出预测的。一个直接的好处是,它们可以帮助我们对模型进行感官检查。我们可以使用领域知识将模型捕获的关系与我们预期的关系进行比较。这些方法还允许我们向客户或同事解释我们的模型。

在本节中,我们将集中讨论间接好处。通过理解模型,我们了解了数据中的潜在关系。我们可以利用这些知识来改进线性模型,或者做出超越模型的决策。

改进线性模型

我们提到黑盒模型可以提供一个基准。它们可能优于线性模型,但这并不意味着这些模型的终结。这是因为我们可以使用我们获得的知识来通知我们的特征工程。我们可以创建新的特性来提高线性模型的性能。

例如,假设我们想使用线性回归对一辆二手车的价格建模。使用 PDP,我们发现价格与车龄成二次关系。同样,使用 ICE 图,我们发现了车龄和车型之间的相互作用。我们可以通过向数据集添加新要素来捕捉这些非线性关系。

具体来说,在下面的等式中,我们添加了年龄和交互项年龄*经典。其中 classic = 1 代表老爷车,否则为 0。

y =β₀+β₁(age)+β₂(age)+β₃(age*classic)+β₄(classic)

y =β₀+β₁(age)+β₂(age_sqrd)+β₃(age_classic_int)+β₄(classic)

在第一个方程中,Y 由两个特征的非线性方程建模——年龄和经典。现在,它是由四个特征的线性方程模拟的。特征工程甚至可以帮助简单的非线性模型,如决策树。最终,它允许我们用简单的模型捕捉复杂的关系。我们将在下面的文章中更实际地演示这个过程。

问题是我们为什么要这么做?非线性模型同样准确。那么,为什么不使用它们,避免额外的功能工程的麻烦呢?这是因为拥有一个简单的模型会给 T4 带来很多好处。首先,在许多行业中,对你可以使用的模型类型都有规定。也就是说,你可能需要在银行和保险等行业使用线性模型。

即使没有规定,你也可能更喜欢线性模型。黑盒模型很复杂。即使使用 IML 方法,我们也不能 100%确定它们是如何工作的。这可能会在它们投入生产时带来惊喜。相比之下,回归和决策树在本质上是可解释的。我们可以通过直接观察它们的参数来理解它们是如何工作的。这增加了它们在野外行为的确定性。

支持决策

模型用于自动化决策。有了 IML,他们的影响不再仅限于这些决定。我们获得的知识可以在更广泛的组织中为决策提供信息。以前不为人知的关系可以提供巨大的价值。例如,我们探索的交互告诉我们,老爷车会随着年龄增长而涨价。这可能会影响投资老爷车的策略。

也就是说,我们应该避免过于复杂的解决方案。对于数据科学家来说,使用数据来为决策提供信息并不新鲜。我们有许多技术和工具可以用来帮助探索数据。大多数都比使用黑盒模型简单得多。不利的一面是他们确实需要一些指导。我们需要知道我们想在数据中找到什么。有了 IML 方法,黑盒模型可以为我们找到新的重要模式。

我希望这篇文章对你有帮助!如果你想看更多,你可以成为我的 推荐会员 来支持我。你可以访问 medium 上的所有文章,我可以得到你的部分费用。

https://conorosullyds.medium.com/membership

你可以在推特上找到我

图像来源

所有图片都是我自己的或从www.flaticon.com获得。在后者的情况下,我拥有他们的保费计划中定义的“完全许可”。

参考

C.Molnar,可解释机器学习(2021)https://christophm . github . io/Interpretable-ml-book/shap . html

南用 Python 进行可解释的机器学习 (2021)

什么?什么时候?怎么会?:树外分类器

原文:https://towardsdatascience.com/what-when-how-extratrees-classifier-c939f905851c

什么是树外量词?什么时候用?如何实施?

Unsplash 上的Eunice lituaas拍摄的照片

在过去的十年中,基于树的模型越来越受欢迎,主要是因为它们的鲁棒性。基于树的模型可以用于任何类型的数据(分类/连续),可以用于非正态分布的数据,并且几乎不需要任何数据转换(可以处理缺失值/比例问题等)。)

虽然决策树和随机森林通常是基于树的模型,但不太为人所知的是 ExtraTrees。(如果你不熟悉基于树的模型,一定要看看下面的帖子)。

什么是树外模型?

与随机森林类似,ExtraTrees 是一种集合 ML 方法,它训练大量决策树并聚集来自决策树组的结果以输出预测。然而,额外的树和随机森林之间几乎没有区别。

随机森林使用打包来选择训练数据的不同变化,以确保决策树足够不同。但是,Extra Trees 使用整个数据集来训练决策树。因此,为了确保各个决策树之间有足够的差异,它会随机选择分割特征和创建子节点的值。相比之下,在随机森林中,我们使用算法进行贪婪搜索,并选择分割要素的值。除了这两个区别,随机森林和额外的树基本上是相同的。那么这些变化有什么影响呢?

什么时候应该使用提取物?

照片由 Jens LelieUnsplash 上拍摄

随机森林仍然是基于集成树的模型(最近有来自 XGBoost 模型的竞争)。然而,从我们之前对随机森林和额外树之间的差异的讨论中,我们看到了 Extra Trees 的价值,尤其是当计算成本是一个问题时。具体来说,在构建具有大量特征工程/特征选择预建模步骤的模型时,计算成本是一个问题,相比其他基于系综树的模型,ExtraTrees 是一个不错的选择。

如何建立一个 ExtraTrees 模型?

ExtraTrees 可用于构建分类模型或回归模型,可通过 Scikit-learn 获得。在本教程中,我们将介绍分类模型,但是代码可以用于稍加调整的回归(例如,从 ExtraTreesClassifier 切换到 ExtraTreesRegressor)

建立模型

我们将使用 Scikit-learn 中的 make_classification 来创建虚拟分类数据集。为了评估该模型,我们将使用 10 重交叉验证,以准确性作为评估标准。

超参数调谐

额外树模型的详细参数列表可在 Scikit-learn 页面上找到。 Extra Trees 研究论文明确提出了三个关键参数,陈述如下。

“参数 K、nmin 和 M 具有不同的效果:K 确定属性选择过程的强度,nmin 确定平均输出噪声的强度,M 确定集合模型聚合的方差减少的强度。”

让我们从实现的角度更仔细地看看这些参数。

  • K 是 Scikit-learn 文档中的 max_feature,指每个决策节点要考虑的特性数量。K 值越高,每个决策节点考虑的特征越多,因此模型的偏差越低。然而,过高的 K 值降低了随机化,否定了系综的效果。
  • nmin 映射到 min_sample_leaf,并且是在叶节点所需的最小样本数。其值越高,模型越不可能过度拟合。样本数量越少,分裂越多,树越深,越专门化。
  • M 映射到 n_estimators,是森林中树的数量。其值越高,模型的方差越低。

如下所示,可通过 GridSearchCV 选择最佳参数集。

最终外卖

照片由 Riccardo AnnandaleUnsplash 上拍摄

  • ExtraTrees 分类器是一种基于系综树的机器学习方法,它使用依赖随机化来减少方差和计算成本(与随机森林相比)。
  • 树外分类器可用于分类或回归,在这种情况下,计算成本是一个问题,特征已仔细选择和分析。
  • 额外的树可以从 Scikit-learn 实现。对于调优很重要的三个超参数是 max_feature、min_samples_leaf 和 n_estimators。

就是这样!树外之物,何时,如何!

参考

https://machinelearningmastery.com/extra-trees-ensemble-with-python/ https://stats.stackexchange.com/questions/175523/difference-between-random-forest-and-extremely-randomized-trees

你喜欢在数据科学项目中忽略什么

原文:https://towardsdatascience.com/what-you-love-to-ignore-in-your-data-science-projects-208754eea8e8

唯一真正安全的系统是关闭电源,浇铸在一块混凝土中,密封在一个有武装警卫的铅衬房间里。—吉恩·斯帕福德

马太·亨利Unsplash 上拍照

在这个故事中,我们将直奔主题。关于这个主题有很多内容要讲;因此,我们将把它分成不同的文章。在第一篇文章中,我们将把理论放在一边。

让我们假设您正在构建您的下一个数据科学项目,是时候向全世界发布它了。这个版本不是一些小的 Python 库;这是一个成熟的 MLOps 项目,许多微服务在 Kubeflow 或 Kubernetes 上运行和通信。这就是你在现实世界中遇到的那种复杂性。

在发布过程中有一个步骤我们很容易忘记,不,它不是测试。通常,我们无法检查我们的代码、它的依赖项以及它运行的环境是否存在安全缺陷。

微服务的速度比传统的整体服务快得多。因此,微服务安全审计经常被忽视,以保持新功能的高发布速度。

我们需要后退一步,看看软件开发生命周期(SDLC),并确定我们可以应用安全控制的时间点。

在这个故事中,我们将讨论 STRIDE 框架。在接下来的几周里,我们将看到如何将它应用到 harden Docker、Kubernetes 和您的应用程序中。然后,我们将使用像docker-benchgrype这样的工具来看看事情是如何工作的。

Learning Rate 是为那些对 AI 和 MLOps 的世界感到好奇的人准备的时事通讯。你会在每个月的第一个星期六收到我关于最新人工智能新闻和文章的更新和想法。订阅这里

典型的 SDLC 流程

在大多数情况下,每个工程项目都是从一个规范,一个设计文档开始的。然后,工程师开始用代码实现软件,构建和部署服务。

你看到这里的问题了吗?通常,直到项目的最后,在生产中部署新工具之前,安全审计经常被遗忘。那么,如果您在这一点上发现了一个安全缺陷,该怎么办呢?在大多数情况下,修理它会非常昂贵。因此,在部署之前,通常不会进行安全验证。

我们将了解如何在微服务 SDLC 中实施实际的威胁建模和服务强化,以确保安全性。

左移原则

我们上面描述的问题的解决方案是将安全考虑转移到 SDLC 过程的早期阶段。这种思维方式被称为左移原则。

通过左移,我们必须采取的确保应用和底层执行环境的安全性的步骤被合并到开发过程中。

那么,如何才能做到这一点呢?以下步骤提供了我们可以遵循的足够简单的算法:

  1. 让安全团队评估设计文档和体系结构图,并在您编写时找出安全缺陷。
  2. 考虑上一步的结果,完善设计文档。
  3. 在代码开发期间持续运行工具,比如 linters。这些工具应该为开发人员提供可操作的反馈,以便快速补救安全风险。
  4. 在部署之前,扫描依赖项和软件版本的安全缺陷。
  5. 扫描您将部署服务的环境,查找安全缺陷。
  6. 持续监控正在运行的部署,确保一切顺利运行,没有安全事故。
  7. 评估服务部署后对应用程序或基础架构的任何重大更改。
  8. 如果您需要重新构建或重新部署系统中的任何东西,请遵循前面的步骤。
  9. 自动化这个过程中的大部分步骤。
  10. 重复此过程,直到服务退役。

但是我们应该检查什么呢?什么会出错?我们可以用 STRIDE 这样的威胁建模框架来回答这个问题。然而,在研究 STRIDE 之前,我们应该确保了解一些安全关键概念。

关键安全概念

要理解安全性,我们应该首先理解它的基本概念。理解这些概念对于理解 STRIDE 框架也是至关重要的(稍后将详细介绍)。因此,在介绍 STRIDE 之前,让我们回顾一下:

  • 真实性:非正版用户冒充合法用户时。
  • 完整性:当攻击者篡改数据或系统配置时。
  • 不可否认:否认某事发生的行为,例如,通过删除系统日志。
  • 保密性:敏感数据暴露时。
  • 可用性:系统正常运行时间受到影响时。
  • 授权:当系统中的用户或服务不考虑访问级别和权限时。

我们现在准备学习 STRIDE!

进展

STRIDE 是一种助记符,有助于记住攻击者影响系统的主要方式。除此之外,它还是一个系统化的威胁分析框架,让您想到可能会出错的地方:

  • “S”代表欺骗:这是指用户或服务出于恶意伪装成某人或某物。它影响了的真实性
  • “T”表示篡改:这是指攻击者出于恶意修改系统,比如更改配置文件。影响完整性
  • “R”表示否认:这是指用户或应用程序清除他们的足迹,否认做了可疑的事情。它影响不可否认性
  • “I”表示信息泄露:当机密信息被泄露给未经授权的人员或方时,此事件发生。影响保密
  • “D”表示拒绝服务:此事件影响系统的可用性。它影响可用性
  • “E”表示特权提升:当用户或服务承担了他们无权承担的角色时,会发生此事件。影响授权

结论

有很多教程可以帮助你建立你的第一个深度学习模型。现在也有教程帮你在生产中部署。然而,我认为安全性没有得到应有的关注。

在下一篇文章中,我们将看到如何在 Docker 和 Kubernetes 上应用 STRIDE。敬请期待!

关于作者

我叫 Dimitris Poulopoulos ,是一名为 Arrikto 工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。

如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据运算的帖子,请关注我的 MediumLinkedIn 或 Twitter 上的 @james2pl

所表达的观点仅代表我个人,并不代表我的雇主的观点或意见。

关于 MySQL 中生成的列,您需要了解什么

原文:https://towardsdatascience.com/what-you-need-to-know-about-generated-columns-in-mysql-23871b376d66

将自动生成的数据添加到表中

汉斯·雷尼尔斯在 Unsplash 的照片

MySQL 生成的列是一个强大的、易于使用的高级工具,可以帮助任何想要向表中添加自动生成的数据的人——在这篇博客中,我们将学习掌握它们所需的一切。

生成的列允许您在不使用INSERTUPDATE子句的情况下在表中存储自动生成的数据。这个有用的特性从版本 5.7 开始就是 MySQL 的一部分,它代表了触发器生成数据的另一种方法。此外,生成的列可以帮助您使查询更容易、更有效。

现在让我们学习掌握 MySQL 中生成的列所需要知道的一切。

什么是 MySQL 生成的列?

生成的列类似于普通列,但您不能手动更改其值。这是因为表达式定义了如何根据从同一行的其他列中读取的其他值来生成生成列的值。所以,生成的列在表的域内工作,它的定义不能包含JOIN语句。

换句话说,您可以将生成的列视为一种视图,但仅限于列。注意,生成的列不同于 SQL 触发器,只有在使用语法如下的[CREATE TABLE](https://dev.mysql.com/doc/refman/8.0/en/create-table-generated-columns.html)https://dev.mysql.com/doc/refman/8.0/en/alter-table-generated-columns.html [ALTER TABLE](https://dev.mysql.com/doc/refman/8.0/en/alter-table-generated-columns.html)语句时才能定义它们:

generate_column_name column_type [GENERATED ALWAYS] AS (generation_expression)
[VIRTUAL | STORED] [NOT NULL | NULL]
[UNIQUE [KEY]] [[PRIMARY] KEY][COMMENT 'string']

AS (generated_column_expression)子句指定您添加或更新到表中的列是一个生成的列。generation_expression定义了 MySQL 将用来计算列值的表达式,它不能引用另一个生成的列或除当前表的列之外的任何内容。

另外,请注意,生成表达式只能包含不可变的函数。例如,不能在生成的列表达式定义中使用返回当前日期的函数,因为它是可变函数。

您还可以在AS前面加上GENERATED ALWAYS关键字,以使生成的列更加明确,但这是可选的。然后,您可以指明生成的列的类型是VIRTUAL还是STORED。你将在下一章了解这两种类型的区别。默认情况下,如果查询中没有明确指定,MySQL 会将生成的列标记为VIRTUAL

现在让我们看看在一个CREATE TABLE查询中生成的列语法:

CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(100) NOT NULL,
first_name VARCHAR(60) NOT NULL,
last_name VARCHAR(60) NOT NULL,
full_name varchar(120) GENERATED ALWAYS AS (CONCAT(first_name, ' ', last_name))
);

Arctype 中的CREATE TABLE查询

在这个例子中,full_name列将自动存储first_namelast_name列的连接。

MySQL 中存在哪些类型的生成列?

如前所述,您可以将生成的列定义为VIRTUALSTORED。现在让我们仔细看看这两种类型。

虚拟生成的列

MySQL 不存储标记为VIRTUAL的生成列。这意味着 MySQL 会在需要时动态评估其价值。这通常在任何BEFORE查询被触发后立即发生。换句话说,虚拟生成的列不占用存储空间。

存储生成的列

MySQL 存储任何生成的标记为STORED的列。这意味着每当您插入或更新一行时,MySQL 负责评估它的值并将其存储在磁盘上。换句话说,存储列需要存储空间,就像普通列一样。

虚拟生成的列与存储生成的列

现在让我们进一步了解虚拟列和存储生成列的优缺点。

虚拟生成的列

优点

  • 它们的创建是即时的,因为 MySQL 只需改变表元数据。
  • 它们不需要磁盘空间。
  • INSERTUPDATE查询没有开销,因为 MySQL 不需要生成它们。

缺点

  • MySQL 在读取表时必须对它们进行评估,这使得涉及它们的 SELECT 查询变得更慢。

存储生成的列

赞成的意见

  • MySQL 可以读取它们,就像它们是普通的列一样,这保证了在没有开销的情况下快速检索。

骗局

为什么采用生成的列?

采用生成列有几个原因,但下面三个是最重要的原因。

  • 它们为您提供了缓存功能,使您的查询速度更快:生成的列使您有可能定义包含有用数据的列,这样您就可以在需要时高效地检索这些数据。
  • 它们允许您简化查询表达式:您可以将复杂性分散到生成的列中,然后在简单的过滤操作中使用它们,而不是让查询变得复杂。
  • 它们使您能够定义函数索引 : MySQL 将函数索引实现为隐藏的虚拟生成列。换句话说,生成的列使您有可能定义涉及 MySQL 函数的高效和高级索引。

MySQL 生成的实际例子中的列

现在让我们在一些例子中看看生成的列,这些例子来自我作为一个与数据驱动的初创公司合作的后端开发人员的经历

1.出于一致性原因,使用生成的列来连接列

在开发应用程序的前端时,您可能会注意到数据表示中的某些模式。例如,在体育运动中,一个队中的运动员通常用以下格式来标识:

first_name [first_character_middle_name.] last_name [(jersey_number)]

如您所见,您可以通过将这四列与以下生成的列聚合来轻松生成该数据字段:

string_identifier VARCHAR(255) GENERATED ALWAYS AS
(CONCAT(first_name, ' ', IF(middle_name IS NULL, '', CONCAT(LEFT(middle_name, 1), '. ')), last_name, IF(jersey_number IS NULL, '', CONCAT(' (', jersey_number, ')'))))
STORED

这将产生:

Cristiano Ronaldo (7)
Lionel A. Messi (10)

在这种情况下,生成的列使您能够直接在数据库级别标准化数据字段格式。此外,存储生成的列避免了每次需要时构建该字段的不可避免的开销。

2.使用生成的列来自动生成哈希 id

通常,您使用网站 URL 中的资源 id 或REST API来检索您需要的数据。但是公开暴露你的身份会带来安全问题。当您发现自己使用自动递增的 id 时尤其如此,这很容易预测,并使抓取或 bot 攻击更容易。

public_id VARCHAR(40) GENERATED ALWAYS AS SHA1(CONCAT("PLAYER", id)) VIRTUAL

为了避免这种情况,您可以考虑通过使用自动生成的、随机的、更安全的公共 id 来隐藏您的原始 id。您可以通过散列您的 id,使用虚拟生成的列来实现这一点,如下所示:

注意,为了避免生成已知的哈希值,您可以用一个特殊的关键字连接您的 id。点击了解更多关于 MySQL 加密和压缩功能的信息

3.定义生成的列以简化数据筛选

筛选数据时,有些列比其他列更有用。此外,您经常需要更改存储在列中的值的表示形式,以使筛选更简单或更直观。您可以定义一个有用的生成列,以所需的格式存储执行筛选所需的信息,而不是在每个筛选查询中都这样做。

例如,您可以定义一个生成的列,以便更容易地找到篮球队的队员,如下所示:

filter_string VARCHAR(255) GENERATED ALWAYS AS
(CONCAT(first_name, ' ', last_name, IF(birthdate IS NULL, '', CONCAT(' ', DATE_FORMAT(birthdate, "%m-%d-%Y"))))
STORED

这种列将产生:

LeBron James 12-30-1984
Stephen Curry 03-14-1988

这包含数据有用的过滤和球员的出生日期在美国的格式。

生成的列与触发器

如前所述,您只能在表中使用生成的列。此外,它们只能涉及不可变的函数,MySQL 生成它们的值以响应INSERTUPDATE查询。另一方面,触发器是一个存储程序,每当与特定表相关的INSERTUPDATEDELETE事件发生时,MySQL 就会自动执行该程序。

换句话说,触发器可以涉及几个表和所有 MySQL 函数。与生成的列相比,这使它们成为更完整的解决方案。同时,MySQL 触发器本质上使用和定义起来更复杂,并且比生成的列更慢。

结论

MySQL 生成的列无疑是一个很好的工具,可以服务于多种用途并带来多种好处。采用它们既简单又有效,尽管没有多少数据库开发人员使用它们。无论哪种方式,知道如何利用它们对于使你的后端应用程序更快、更干净、更简单来说都是必不可少的。我希望通过真实世界的例子解释生成列的用例,能够帮助您获得更多数据库领域的知识,直到下一次。

感谢阅读!我希望这篇文章对你有所帮助。请随意留下任何问题、评论或建议。

原载于 2022 年 6 月 28 日【https://arctype.com】

你需要知道的关于 DeepLearning 更新的机器学习专业化。人工智能

原文:https://towardsdatascience.com/what-you-need-to-know-about-updated-machine-learning-specialization-by-deeplearing-ai-97118fa03297

一切新的都是早已被遗忘的旧的,不是吗?

迪特玛·贝克尔在 Unsplash 上的照片

2022 年 4 月 18 日,Coursera 十周年之际,吴恩达( DeepLearning 创始人。AICoursera联合创始人,机器学习和 AI 最著名的普及者之一)发布了新的机器学习专精。这是 2010 年创建的原始机器学习斯坦福课程的更新版本,自最初发布以来,约有 500 万人参加了该课程。

前一段时间我参加了最初的课程,7 月份课程一结束,我就参加了更新的课程。让我们仔细看看这些学习资料,找出,到底更新了什么,是否值得在 2022 年上这门课。

TL;速度三角形定位法(dead reckoning)

是的,它是。在我看来,现在这是开始你的机器学习之旅的最佳方式,尤其是如果你是一个完全的初学者,而且以前从未听说过数据科学和机器学习。

前一篇文章

在我之前关于这个话题的文章中,我分享了我对斯坦福最初的机器学习课程的想法。在那里,我列出了我个人对这门课的缺点的看法,以及对值得补充的内容的建议。

既然我已经采用了两个版本——原始版本和更新版本,在我的进一步推理中,我将依赖于本文中表达的论点(主要是在与原始课程部分的比较中)。所以,如果你想熟悉我最初的想法,我在下面分享我之前文章的链接。

与原始课程的比较

在这一部分,我将主要基于我之前所陈述的来比较这门课程的两个版本。我不知道深度学习的人。人工智能团队已经阅读了我的评论,但几乎我所有的要求都得到了适当的考虑和满足。😃

过时

在我之前的文章中,我说过这门课程的主要缺点是它已经过时了。当然,我不是唯一理解这一点的人,我认为这是它更新的主要原因。

虽然课程讲述的基础知识永远不会改变,但更令人高兴的是知道你收到的所有信息,包括作业和实例,都是当前的热门话题和相关内容。

基于这门课程的诸多优点,仅仅消除这一缺点就已经是这门课程成为 非常好的 学习材料的充分条件。但它的创造者走得更远,改进和完善了教育计划和与学生互动的方式,不仅更新了课程,还使其更加完整、广泛和有趣。

Python 而不是 Octave

在最初的课程中,实际作业必须在 Octave (MATLAB)上解决。尽管有很多方法可以绕过它,但官方的实现并没有使用 Python。对大家来说幸运的是,这个已经被修复了,现在课程使用 Python

这不仅意味着你不需要学习一门你这辈子几乎肯定不会再用到的编程语言(抱歉,MATLAB 程序员)。也意味着和 Python 一起,你将获得关于你开始从事数据科学或机器学习工作时几乎每天都会用到的库的基础知识: numpyscikit-learntensor flow。简直太棒了!

需要注意的是,课程不会教你 Python ,你需要了解这种语言和编程的基本知识——变量、条件表达式、循环和函数就足够了(课程中不会用到最纯粹形式的类和面向对象编程)。所以如果你是一个完全的初学者,也许你应该先学习一些 Python 基础课程。

集成学习

原来的课程没有提到任何一个集成模型,现在会详细告诉你决策树(之前也没有发生过),解释集成学习的动机,演示随机森林助推模型。

虽然这里只在决策树而不是其他模型的上下文中解释了集成学习,但它是朝着正确方向迈出的第,允许您获得机器学习模型动物园的更完整图片。

你还会看到 XGBoost 库,这是经典机器学习最强大的工具之一(这里的经典我指的是没有深度神经网络的机器学习),所以你马上把它放进你的工具箱!

分类变量

最初的课程也根本没有提到分类变量,这对我来说似乎很奇怪,因为这将使初学者在他决定自己解决的第一个任务中感到困惑(因为分类变量非常常见)。这个故障已经纠正到这里,课程会告诉你一键编码

你必须自己熟悉剩下的方法,但是因为这个课程是为初学者设计的,我不认为这是一个缺点。

无监督学习算法:聚类、异常检测和降维

至于无监督学习算法,情况仍然大致相同。 K-Means 仅用于聚类,而高斯混合模型(GMM) 用于异常检测。

课程中提到降维是一种辅助技术,当我们有几次关于主成分分析的单独讲座时,对它的关注比以前少了。

更新:不过 2022 年 12 月课程更新多了一点,几个关于 PCA 的视频像原来的课程一样被退回来了。

虽然看起来我认为许多其他方法被忽略了(上次我也是这样认为的),但我已经改变了我的想法,我稍后会谈到这一点。

抱歉,支持向量机

在进入更一般的考虑之前,老实说,我应该注意到支持向量机 资料被从更新的课程中删除,尽管原始课程包含它们。

也许由于计时的原因,提到 SVM 并不适合本课程,但我认为它被删除是因为它的复杂性,因为这种算法及其核心技巧很难理解,可能是经典监督学习中最困难的方面。

所以,我认为删除它是为了不吓跑新来者;无论如何,把 SVM 改成决策树随机森林助推是个不错的交换。

更新:在 2022 年 12 月增加了 PCA 和反向传播材料后,SVM 很可能会被包括在该计划中,并有一些即将到来的更新。

还有什么?更一般的推理

结构化

更新的专业化变得更加结构化。原始源由 11 周组成,其中的材料没有相互分离。

现在,专业化的内容分为 3 门课程,每门课程都有一个特定的主题,并按周进行内部划分。因此在球场内导航,返回球场并搜索特定资料变得更加容易。顺便说一下,这三门课是:

  1. 监督机器学习:机器学习介绍,回归(线性回归),分类(逻辑回归);
  2. 高级学习算法:神经网络、决策树、随机森林、boosting 和应用机器学习的实用建议;
  3. 无监督学习、推荐器、强化学习:聚类、异常检测、推荐系统和强化学习。

查看专业化主页获得更详细的描述。

更多的实验室、更多的可视化和更多的交互性

在我看来,另一个好的解决方案是包含更多的实践实验室,并允许人们看到更多的代码。由于代码现在可以在 Jupyter 笔记本上执行,这解放了作者的双手。实验室(几乎所有的实验室都是可选的,所以没有人会被吓跑)变得越来越多,越来越详细,越来越多样化。

同时,它们中的许多包含非常直观和交互式的可视化。老实说,其中一些的质量本来可以更好(老实说,我不明白他们为什么使用纯matplotlib)甚至用于互动情节,而不是例如 plotly )但其中一些确实可以让你获得非常有用的见解。

为了了解什么是交互性,你可以在 YouTube 上看一下最近的专业化演示。

第三道菜太棒了

尽管我说过有可能提到更多的算法和方法用于无监督学习任务,第三个专业化课程涵盖的内容远不止之前的类似部分。

仅在第一周审查聚类和异常检测。第二周致力于商业上最成功的机器学习应用——推荐系统的两个算法:协同过滤基于内容的过滤,第三周致力于深度 Q-Learning (DQL)* ,一个强化学习算法,真的很牛逼!*

首先,关于强化学习的故事总是非常鼓舞人心,至少对我来说是这样,因为我认为这是机器学习中最基于“机器”的部分。第二,吴恩达的教学天赋和课程团队使这个最复杂的科学领域之一,或者至少是它的基础,为每个人所理解。

顺便说一下,强化学习是机器学习的一部分,其中一个代理在给定的环境中学习做一些事情,而不知道事情是如何工作的,并且在成功的情况下只接收奖励。机器学习的这一部分也是新闻中最受欢迎的:这是机器人学习下国际象棋围棋视频游戏的地方。你还可以找到十几个 YouTube 视频,在这些视频中,人工智能代理学习不同的东西:从走路到拳击。

强化学习图。公共领域

将所有这些放在一起,第三门课程展示了现实世界机器学习应用的极其广阔的图景,并将专业化带到了下一个层次。

毫无疑问,专业化是为初学者设计的

出于各种作者的原因,专门化被做得尽可能简单,有时甚至太多。对于大多数学习者来说,这不是一个缺点,而是一个优势,但无论如何,这是一个具有多种后果的特征。

最重要的是,这关系到熟悉高中数学的人(并且理解什么是导数,最优化任务,为什么梯度下降真的有效,等等。).对你来说,课程中会有很多轻描淡写的内容,就好像你缺少描述某些算法背后的数学知识的额外讲座。这是因为课程试图完全不用数学,但有时看起来很奇怪,例如在谈到神经网络时没有提到反向传播

更新:在 2022 年 12 月的更新中增加了一些关于反向传播的讲座,所以这个评论已经失去了相关性。

当然,你可以通过阅读众多书籍中的一本或参加更高级的 ML 课程来填补这些轻描淡写的内容。但是,如果你是一名计算机科学学生,可能有更有效的方法让你深入人工智能、数据科学和机器学习的世界。毕竟你开始探索 ML 真的不需要很强的数学背景,但是如果你决定认真做的话可能需要了解很多数学点

摘要

我在课程完成时得到的假设,在我看 DeepLearning 的加速你的 AI 职业生涯讨论时被完全证明了。AI 战队

显然,吴恩达和他的团队已经尽一切可能给任何人机会通过这个专业并理解什么是机器学习。这有助于:

  • 想找 ML 相关工作的同学,
  • 想要改变他们活动领域的专业人士,
  • 或者只是那些对人工智能是什么以及人工智能是否真的有危险感兴趣的人,至少目前是这样。

吴恩达提到,传播人工智能和 ML 知识的目标之一是让非技术专业的人更容易获得人工智能,因为它对他们仍然非常有用。人工智能相关的产品和商品正越来越积极地进入我们的生活,通过了解基本知识,无论你从事什么职业,你都可以极大地促进你的工作或看到这样做的机会。我们正在谈论的是自动化,如果编程已经使得自动化常规动作成为可能,那么 AI 使得自动化常规动作成为可能,这需要某种程度的智能就在我们眼前。

这种专业化是实现这一目标的步骤之一。它不会马上告诉你训练神经网络的所有方法或降维任务的所有陷阱。但是没有一个专业、课程或书籍能做到。相反,它让对机器学习有了尽可能广泛的理解,并且足够深入去从事它。缺乏数学可能会惹恼一些爱好者,但这大大降低了入门门槛,利大于弊。

如果您:

  • 从未听说过机器学习,
  • 害怕你的数学知识不够,或者
  • 不在 IT 或技术行业工作,

这个专精是一个极好的选择。它会奖励你探索新事物的决定,而不会用复杂的术语和公式吓到你。而当你完成它的时候,你将能够开始实施你自己的项目或者不害怕借助更高级的材料继续熟悉 AI word。

在最坏的情况下,学习人工智能会很有趣,在最好的情况下,它可以让你的生活变得更好。

参考

*https://www.coursera.org/specializations/machine-learning-introduction *

感谢您的阅读!

  • 我希望这些材料对你有用。在 Medium 上关注我,获取更多这样的文章。
  • 如果您有任何问题或意见,我将很高兴得到任何反馈。在评论里问我,或者通过 LinkedIn 或者 Twitter 联系。
  • 为了支持我作为一个作家,并获得数以千计的其他媒体文章,使用我的推荐链接获得媒体会员资格(不收取额外费用)。

你需要知道的 ARIMA 时间序列项目

原文:https://towardsdatascience.com/what-you-need-to-know-for-your-arima-time-series-project-804713b8f00d

关于时间序列的基本概念,帮助您开始第一次时间序列预测项目

亚历山大·托多夫在 Unsplash 上拍摄的照片

如果你沉浸在数据科学和统计学领域,你可能听说过“时间序列”这个术语。凭直觉,您可能会想到一系列随时间绘制的数据。差不多就是这样,但是要执行一个时间序列项目,你需要理解和执行许多概念和组件。在本文中,我将介绍执行时间序列分析项目所需的主要术语和概念。

在本文的后面,我将引用 python 中的 statsmodels 库。

目录

什么是时间序列

时间序列数据的组成

时间序列分析的步骤

ARIMA/阿玛

结论

什么是时间序列

时间序列数据是一段时间内定期定义的观察值的集合。时间序列数据的一些常见示例是每月销售指标、每日股票价格等。观察的频率可以从每小时、每天、每月、每年等等变化。取决于问题/目标的焦点是什么。对许多公司来说,分析时间序列数据是非常重要的,因为它可以产生关键的见解,帮助指导业务决策。了解其业务季节性的公司可以预测在一年的某个时间需要进行多少库存、人员或价格调整。在经济学中,你可以看到一段时间内与失业或通货膨胀相关的时间序列数据。商业周期(如下所示)也是经济学中常见的时间序列周期。

商业周期图。来源:作者

时间序列数据的组成部分

当观察时间序列数据时,有 4 个主要部分需要寻找:趋势、季节性、周期性事件和不规则性。

趋势

在寻找趋势时,你是在寻找一个长期序列中清晰的上升或下降模式。通常,一个趋势是无法立即识别的。

如果我们能找到一个趋势的原因,它将被称为决定性的。而无法解释的趋势被认为是随机的。例如,如果你在 Medium 上发表了一篇非常有趣和有用的文章,那么这篇文章的参与度很可能会有一个上升的趋势,使得这个趋势具有确定性。

趋势图示例。来源:作者

季节性

与趋势不同,季节性更容易预测。季节性由一年内以固定和已知的频率发生的变化组成。季节性可以指日历季节(如夏季和冬季)或商业季节(如节假日)的周期性波动。例如,冬季服装的销量会上升,因为天气变冷,人们需要保暖。

季节性图表示例。来源:作者

周期性

与季节性不同,周期性数据是一种上升和下降模式,在不同时期之间没有精确或可预测的变化。这方面的一个例子是由于经济条件引起的商业周期波动。

  • 注意:很容易混淆周期性和季节性行为。如果数据的波动是在一个固定的频率,并与日历上的某个时间相关,这是季节性的。如果数据的波动不是在一个固定的频率,它是周期性的。

循环图示例。来源:作者

不规则性

当你从数据中剔除趋势和季节性时,就会出现不规则性。它是不可预测的、不一致的和随机的,因为我们去掉了数据的模式部分。不规则性通常被称为“噪音”。

带有噪声的图形示例。来源:作者

时间序列分析的步骤

当准备做时间序列分析时,首先需要做一些检查。

检查稳定性

平稳性是指时间序列中数据的统计特性不会随时间而改变。这也可以理解为数据具有恒定的均值、方差和协方差。这是一种衡量数据是否具有季节性/趋势等结构模式的方法。

为什么检查平稳性很重要?

首先,静态数据更容易分析。

当预测未来事件时,时间序列模型假设每个点彼此独立(不依赖于时间)。由于静态数据不包含趋势或季节性(随时间变化),这些数据被认为是相互独立的。

平稳性很重要的另一个原因是方差。非平稳数据有利于理解数据的趋势和季节性,但是,它可能包含数据点之间的大量差异。模型中的差异太大会导致模型过度拟合,无法做出准确的预测和预报。

为了澄清,静态数据可以包含变化的值,但是它变化的方式不会随时间而改变。可能更容易想象:

静态图示例(无趋势/季节性)。来源:作者

如何识别平稳数据:

有两种统计测试可以用来检查时间序列数据是否平稳。

ADF 增强的迪基-富勒试验

ADF 检验是一种统计检验,称为“单位根检验”。单位根是时间序列数据的一个特征,使其具有非平稳性。时间序列数据中单位根的数量对应于使数据稳定所需的差分运算的数量。

ADF 测试方程包含多个差异项,这增加了测试的彻底性。

ADF 测试在以下假设和前提下进行:

零假设:时间序列不是平稳的或者有单位根。

替代假设:时间序列是平稳的或者没有单位根。

statsmodels 中的 ADF 方法将输出 p 值、测试统计值、测试中考虑的滞后次数以及临界值临界值。如果检验统计量小于临界值,p 值小于您设置的 alpha 值(常规 alpha = 0.05),那么就有足够的证据拒绝零假设,并声明时间序列是平稳的或没有单位根。

去趋势/差分

去趋势应用于移除数据中的趋势。趋势被认为是平均值随时间的变化。例如,如果您有一个显示季节性上升趋势的图表,主要目标可能是通过删除潜在趋势(上升趋势)来查看图表中的子趋势(季节性)。

带趋势的图表。来源:作者

当我们去除上升趋势时,我们只剩下时间序列数据的子趋势,通常是波动性/季节性(如下所示)。

移除趋势的图表。来源:作者

如何去趋势化数据?

取消数据趋势的方法之一是使用差分。差异有助于消除时间序列数据的变化,消除趋势和季节性,从而稳定一段时间内的平均值。我们可以把差分看作是一个新的数据集,其中每个观察值都是它自己和前一个观察值之间的差。

差异将通过 ARIMA 方法中的一个参数来实现。关于这个参数的更多信息将在本文的 ARIMA/ARMA 部分。

ARIMA/阿玛- PACF/ACF 图的前期工作

ARIMA/ARMA 模型包含 3 个参数,用于模拟时间序列数据的主要方面。这些参数被标记为 p、d 和 q

p :该参数代表模型的 AR(自回归)阶。自动回归是指变量对自身的回归。在自回归模型中,预测值是变量以前值的线性组合。**

为了确定 p 的值,需要绘制偏自相关函数(PACF)。p 的阶是图上非零部分自相关的数目,也被认为是分界点。

d :该参数表示您希望数据求差分以使其稳定的次数(它执行积分的次数)。顺序为 0 表示原始数据是固定的。一阶差表示数据具有恒定的平均趋势/线性趋势,二阶差表示二次/时变趋势。

****q:q 值的阶数代表预测方程中使用的滞后预测误差的数量,从移动平均模型中得出。移动平均值也称为滚动平均值,它是通过在 n 个时间段内对时间序列中的数据进行平均计算得出的。q 的阶数是在自相关函数(ACF)图(ACF 的分界点)中找到的有效值的数量。

重新封顶:

  • 参数:AR 的项数取决于 PACF 截止的滞后时间
  • q 参数:MA 的项数取决于 ACF 截止的滞后

下图是部分自相关图的一个示例。如果我们想找到 p 参数的顺序,我们需要计算非零(有效)值的数量。在这种情况下,p 的顺序可能是 2,因为只有 2 个有效值。

部分自相关图示例。来源:作者

ARIMA/ARMA

ARIMA 和 ARMA 模型是时间序列数据上最常用的统计方法,用于更好地理解数据或预测未来事件。另一种流行的时间序列方法是 LSTM 模型,这是基于深度学习而不是纯粹的统计。在本文中,我将只讨论 ARIMA,并在下一篇文章中继续讨论《时间序列》中的 LSTM。

ARIMA 代表自回归综合移动平均线,ARMA 代表自回归移动平均线。两者的区别在于 ARIMA 包含一个差分项,而 ARMA 没有。当原始数据是平稳的时,使用 ARMA 模型。如果数据不需要差分,ARMA 将是使用的正确模型。ARIMA 的“综合”部分是对需要多少差异项(非季节性差异)来使数据稳定的度量。

所以 ARMA 的参数只包含 p 和 q,而 ARIMA 包含 p、d 和 q

结论

有许多方法可以着手分析时间序列数据,包括像 LSTM 这样的深度学习方法。然而,我将在下一篇文章中深入研究 LSTM 的时间序列,并在另一篇文章中概述我为这个项目编写的代码。

虽然时间序列听起来很直观,但是如果您想要一个高效且正确的模型,那么需要了解许多组件才能有效地进行时间序列分析。我希望这篇文章能让你对时间序列分析中使用的主要概念有一个很好的理解,并关注即将到来的文章。

如果你想更多地了解我,请随时查看我的网站并联系我!

额外资源

**https://online.stat.psu.edu/stat510/lesson/2/2.2 https://www.real-statistics.com/time-series-analysis/arima-processes/arima-differencing/ https://people.duke.edu/~rnau/411arim2.htm

🫶🏽**

你的验证损失低于你的培训损失?这是为什么!

原文:https://towardsdatascience.com/what-your-validation-loss-is-lower-than-your-training-loss-this-is-why-5e92e0b1747e

仅仅因为你的模型从训练集中学习并不意味着它的性能会更好。

有时,数据科学家会遇到验证损失低于训练损失的情况。这是一个奇怪的观察结果因为模型正在从训练集中学习,所以它应该能够更好地预测训练集,然而我们观察到更高的训练损失。出现这种情况有几个原因,我将在本文中逐一介绍常见的原因。

Freepik.com 的 Wayhome 工作室

原因 1: L1 或 L2 正规化

症状:验证损失始终低于培训损失,但两者之间的差距随着时间的推移而缩小

无论是使用 L1 正则化还是 L2 正则化,都是通过向误差函数添加模型权重来有效地扩大误差函数:

作者图片

正则化项仅在训练集上训练模型时应用,增加了训练损失。在验证和测试期间,您的损失函数只包含预测误差,因此损失通常低于训练集。

作者图片

注意验证和列车丢失之间的差距是如何在每个时期后缩小的。这是因为随着网络学习数据,它也会缩小正则化损失(模型权重),从而导致验证和训练损失之间的微小差异。

然而,该模型在训练集上仍然更准确。

让我们比较一下模型在训练集和验证集上的 R2 分数:

作者图片

请注意,我们不是在讨论损失,而是只关注模型对训练集和验证集的预测。正如预期的那样,模型对训练集的预测优于验证集。

原因二:辍学

症状:验证损失始终低于培训损失,两者之间的差距大致相同,培训损失有波动。

在模型训练期间,通过随机冻结层中的神经元,丢弃会惩罚模型变化。像 L1 和 L2 正则化一样,退出仅适用于培训过程,并影响培训损失,导致验证损失低于培训损失的情况。

作者图片

在这种情况下,模型在训练集上也更准确:

作者图片

这是意料之中的。当网络中存在正则化或丢失时,较低的损耗并不总是意味着较高的精度。

原因 3:训练损失是在每个时段期间计算的,但是验证损失是在每个时段结束时计算的

症状:开始时验证损失低于培训损失,但后来有类似或更高的值

请记住,当您的所有训练数据通过网络精确传递一次时,每个时期就完成了,如果您以小批量传递数据,每个时期可能会有多次反向传播。每个反向传播步骤都可以显著地改进模型,尤其是在最初的几个时期,此时权重仍然相对未经训练。

因此,当每次反向传播显著更新模型时,您可能会在最初的几个时期中获得较低的验证损失。

作者图片

理由 4:纯粹的运气!(适用于所有 ML 型号)

症状:验证集比训练集有更低的损失和更高的准确率。你也没有那么多数据。

请记住,噪音是独立变量无法解释的因变量的变化。当您进行训练/验证/测试分割时,在某些迭代中,训练集中的噪声可能比测试或验证集中的噪声多。如果模型没有过度拟合,这会使模型在训练集上不太准确。

如果您正在使用它,这可以通过更改 train_test_split 函数中的随机种子来解决(不适用于时间序列分析)。

请注意,由于大数定律,当数据集很重要时,不太可能出现这种结果。

让我们进行一个实验,观察验证精度对 train_test_split 函数中随机种子的敏感度。我将在 for 循环中运行模型训练和超参数调整,并且只更改 train_test_split 中的随机种子,并可视化结果:

for i in range(10):
    X_train, X_val, y_train, y_val = train_test_split(X, Y, test_size = 0.3, random_state = i)
    xg = XGBRegressor()
    grid_obj = GridSearchCV(xg, parameters, n_jobs=-1)
    grid_obj = grid_obj.fit(X_train, y_train)
    val_r2.append(r2_score(y_val, grid_obj.predict(X_val)))
    train_r2.append(r2_score(y_train, grid_obj.predict(X_train)))

作者图片

在 10 个实验中的 3 个实验中,模型在验证集上的 R2 分数略好于训练集。在这种情况下,将随机种子更改为在验证集和定型集之间均匀分布噪声的值将是合理的下一步。

关于剧情还有更多要说的。数据科学家通常专注于超参数调整和模型选择,而忽略了对我们的结果有重大影响的简单事物,如随机种子。不过,我会在以后的文章中写这方面的内容!

摘要

我们讨论了导致验证低于培训损失的四种情况,并解释了根本原因。我们经常看到,较低的验证损失不一定转化为较高的验证准确性,但当它转化为较高的验证准确性时,重新分配训练集和验证集可以解决这个问题。

我们进行这项研究的假设是,我们没有遭受其他问题,如数据泄漏或采样偏差,因为它们也可能导致类似的观察结果。

请务必关注更多内容!

Word2vec 背后是什么

原文:https://towardsdatascience.com/whats-behind-word2vec-95e3326a833a

https://towardsdatascience.com/tagged/word-embeddings-primer

单词嵌入的概念和方程概述

照片由斯蒂芬·斯坦鲍尔Unsplash 上拍摄

自然语言处理(NLP)领域需要语言学、统计学和计算机科学的知识。因此,在没有对你不太熟悉的学科进行大量背景研究的情况下,开始一项新的研究或项目可能会很有挑战性。无缝地跨越这些学科也是一个挑战,因为它们的术语和方程格式不同。

我从统计学来到 NLP,想了解文本集合(语料库)中的单词如何以向量(单词嵌入)的形式转换成可用数据,如下面两个例子所示:

aardvark [  0.7660651 -0.9571466 -0.4889298  ...  -0.1600012 ]
zulu     [ -0.4566793  0.7392789  0.5158788  ...   0.0398366 ]

我想了解什么是真正要测量的,什么是最重要的,以及在向 Word2vec、fastText 和现代语境化单词表示中的算法生成的矢量数据的转换中,什么会受到损害。

基本上,单词嵌入值中的数字真正代表什么

此外,许多单词有多重含义( senses ),所以我特别想知道一个有多重含义但只有一个向量(比如 100 个维度)的单词如何在统计上仍然有效。然后,我希望能够基于 Word2vec 模型编写自己的单词嵌入训练算法,这样我就可以探索特定意义的表示。

本文是系列文章的第一篇。它介绍了单词如何通过它们在文本中的接近度相互关联的概念,以及创建单词关系数据背后的理论。在这个系列中,我还将把语言学和计算机科学中的 NLP 概念翻译成统计学的观点。

NLP 今天的大部分发展都集中在深度学习人工智能算法上,但任何进入该领域的人都应该对所有的构建模块有清晰的概念把握。

本系列的文章包括:

  1. word 2 vec 背后有什么 ( 本文 )
    单词嵌入的思路和方程概要 (7 分钟阅读)
  2. 单词转化为向量
    单词嵌入概念 (13 分钟读完)
  3. 统计学习理论
    神经网络基础 (14 分钟读取)
  4. word 2 vec 分类器
    如何训练单词嵌入 (15 分钟读取)
  5. word 2 vec 超参数
    一套创意重新加权 (6 min 读取)
  6. 词语嵌入的特点
    以及反义词的问题 (11 分钟读完)

在我们深入研究 NLP 和单词嵌入之前,让我们简要地看一下导致 Word2vec 产生的背景。我们将关注 Word2vec,因为它普及了今天使用的单词嵌入类型。

作为单词定义基础的单词邻近度

计算语言模型的基本应用之一是预测句子中的单词,例如,在搜索引擎和消息应用程序的自动完成功能中:

(图片由作者提供)

这种模型可以是通过将大型文本语料库中的所有单词序列制成表格来概率性地预测每个单词的出现的语言模型,但是从实现的角度来看,由于数据量大,处理和存储所有这些信息是不切实际的。例如,即使是简单的数据集合的大小,例如单词对在一组文档中的每个文档中一起出现的频率的同现矩阵,也将是唯一单词总数的平方,可能是几十万个单词的平方。

单词嵌入是使用向量来表示单词,有助于减少这些计算挑战。单词嵌入不是存储所有文档中所有单词的所有信息,而是利用创造性的数据处理和统计降维技术来近似单词之间的关系。

这些现代的机器学习单词嵌入的一个有趣的特性是,当它们应用于语言模型时,它们不仅基于邻近频率预测单词序列,而且在某种程度上预测单词含义。

单词嵌入是哲学家路德维希·维特斯坦根的观点的一种体现,即“单词的意义是它在语言中的使用”(维特根斯坦,1953)。1957 年,语言学家约翰·鲁珀特·弗斯把这个概念更具体地表述为:

"从一个人交的朋友,你就可以知道这个人说的话."

约翰·鲁伯特·弗斯(1890–1960)
(图片来自 n·斯科特的文章(1961)。亚非学院公报, 24 (3) ,412–418,经允许转载)

因此,一个词可以通过它通常出现的词来定义。例如,因为根据上下文,“摇滚”这个词可能会出现在“地球”和“音乐”等词旁边,所以地球和音乐都与摇滚的定义有关。今天,这个概念在语言学中被称为分布假设(佩罗尼,2018)。

但是从统计 NLP 的角度来看,更自然的想法是,意义存在于使用单词和话语的上下文的分布中。……在这种概念下,许多统计 NLP 研究直接解决意义问题。”(曼宁和许策,1999 年)

类似于字典仅仅通过单词彼此之间的关系来定义所有单词,单词嵌入矩阵使用数值通过它们在使用中的接近度来定义它的单词。

为什么数据模型开始取代基于规则的模型

自然语言处理(NLP)领域的目标是让计算机使用人类语言进行交互。已经采取了许多方法在计算机中实现人类语言,语言学的思想也在依赖复杂的计算机算法中发展。强有力地建立在语言结构、规则和逻辑上的语言模型通常过于处理密集或复杂而不实用,并且在计算上工作良好的快捷方式通常具有明显的语言弱点。

统计学在经验主义 NLP 中发挥着突出的作用,不仅仅是在书面和口头语言数据的分析中,而是在机器学习背后的统计学习理论中,机器学习越来越多地应用于分析大型语料库( Stewart ,2019)。尽管如此,即使在机器学习和人工智能(AI)加速之前,统计 NLP 的价值也很突出。

“统计[NLP]模型是稳健的,概括得很好,并且在存在错误和新数据的情况下表现优雅。”(曼宁和许策,1999 年)

Word2vec 的首次亮相:是什么让它如此具有变革性

2013 年,随着 Mikolov 等人在谷歌发表的两篇介绍 Word2vec 的论文( Mikolov 等人,2013 a米科洛夫等人,2013 年 b 。Word2vec 使用一个浅层神经网络来产生单词嵌入,这种嵌入表现得特别好,并具有计算效率大幅提高的额外好处。使用 Word2vec,只需一台个人计算机,就可以从任何语言的相对较大的语料库中创建一组单词向量。Word2vec 的另一个突出特性是观察到单词向量在向量空间中聚集同义词和附近的相关单词。此外,向量似乎有数学属性。例如,通过添加向量值,可以找到计算语言学中的以下著名等式:

国王男人+女人≈王后

在二维情况下,该等式可能如下所示:

文字向量数学概念
(图片由作者提供)

这些 Word2vec 向量改进了 NLP 任务的许多应用,并且大量的研究随之而来,以研究神经网络单词嵌入的属性和含义。通过这项研究产生的想法最终导致了更强大的具有上下文敏感嵌入的人工智能模型(如 AllenNLP ELMo ,OpenAI 的 GPT ,以及谷歌的 BERT )。

摘要

在本文中,我们学习了语言学理论,即使用中的单词邻近性与单词含义有关,并且自然语言的规则可能不切实际。我们还了解到,使用单词邻近度来创建单词向量可以产生具有有用属性的可管理数据集。

在下一篇文章 单词到向量 中,我们将回顾创建单词嵌入背后的基本概念。

这篇文章是 1ˢᵗ系列文章中关于单词嵌入的初级读本:** 1。Word2vec | 2 背后的东西。单词成向量 |
3。统计学习理论 | 4。word 2 vec 分类器 |
5。word 2 vec 超参数 | 6。单词嵌入的特征**

关于这个主题的更多信息:对于本系列的每一篇文章,我将推荐一个关键参考资料,以获得关于这个主题的更多信息。对于这篇文章,你可能会特别喜欢:佩罗尼,C. S. (2018)。自然语言处理的词语表述和维特根斯坦的语言哲学未知领域

参考

弗斯,J. R. (1957)。语言学理论概要,1930-1955。在弗斯(编辑),语言分析研究,语言学会特刊,第 1-32 页。英国牛津:巴兹尔·布莱克威尔出版社。

曼宁和舒策(1999 年)。统计自然语言处理基础。麻省剑桥:麻省理工学院出版社。

Mikolov、Corrado、G . Chen、k .和 j . Dean(2013 年 a)。向量空间中单词表示的有效估计。可从 arXiv:1301:3781v3 获得。

Mikolov、Corrado、G . Chen、k . Sutskever 和 j . Dean(2013 年 b)。词和短语的分布式表示及其组合性。可从 arXiv:1310.4546v1 获得。

南卡罗来纳州佩罗尼(2018 年)。自然语言处理的词语表述和维特根斯坦的语言哲学未知领域

斯图尔特,M. (2019)。统计和机器学习的实际区别走向数据科学

维特根斯坦,L. (1953)。哲学研究。英国牛津:巴兹尔·布莱克威尔出版社。

*除非另有说明,数字和图像均由作者提供。

🤗抱脸是什么?

原文:https://towardsdatascience.com/whats-hugging-face-122f4e7eb11a

不,不仅仅是你手机上可爱的表情符号

照片由汉娜·布斯Unsplash 上拍摄

TL;速度三角形定位法(dead reckoning)

拥抱脸是一个社区和数据科学平台,提供:

  • 使用户能够基于开源(OS)代码和技术构建、训练和部署 ML 模型的工具。
  • 一个广泛的数据科学家、研究人员和 ML 工程师可以聚集在一起分享想法、获得支持并为开源项目做出贡献的地方。

🔥通过社区推进人工智能

随着最近向混合和灵活工作实践的转变,我们开始见证更多工具的使用和采用,这些工具使数据科学团队、专家和爱好者能够远程协作。

事实上,当谈到人工智能的进步时,操作系统社区变得越来越重要。没有一家公司,即使是“科技巨头”也无法独自“解决人工智能”——共享知识和资源来加速和推动未来的发展!

拥抱脸通过提供一个社区“枢纽”来满足这种需求。这是一个任何人都可以共享和探索模型和数据集的中心。他们希望成为一个拥有最大模型和数据集集合的地方,目标是为所有人民主化人工智能。

🚀入门->您的存储库

当你注册成为拥抱脸的一员时,你会得到一个基于 Git 的托管库,你可以在那里存储:模型、数据集和空间。我们将在这一部分的后面更深入地探讨这些问题。

现在,让我们开始行动吧!

注册成为社区个人贡献者是免费的。组织有一个“专业”计划和单独的定价模型

我注册了,在这个过程中,你还可以链接到一个主页、Github 和 Twitter 账户,如下所示:

图 1:拥抱脸,社区账号注册表单

一旦您创建了一个帐户,您将被重定向到您的个人存储库。在此页面中,您可以执行许多操作,包括:

  • 查看您的活动订阅源
  • 查看您的个人资料和设置
  • 创建新的模型、数据集或空间
  • 查看拥抱脸社区当前的趋势
  • 查看您所属组织的列表,并跳转到各自的区域
  • 利用有用的资源和文档

图 2:拥抱脸,用户档案/存储库

存储库的中心是您的活动提要,当您开始创建(或喜欢)模型、数据集和空间时,它会被填充。

现在我们已经开始运行了,让我们更深入地了解一下…

型号

当你创建一个新的“模型”时,它实际上是一个与你想要共享的 ML 模型相关的文件的 Git repo。它拥有你所期望的所有好处,比如版本控制、分支、可发现性等等。

💡我将在本节中描述的步骤(包括数据集和空间)都可以通过命令行使用 Hub API 端点 以编程方式实现。

单击 Hub 中的“+ New”按钮,然后选择“Model ”,会将您带到一个对话框,您可以在其中指定名称和操作系统许可证的类型,您将根据该许可证贡献您的模型代码和相关资产。

您还可以控制您的模型的可见性,即将其公开,并使其对 Hugging Face 社区可见,或者在您的个人存储库或组织中保持其私密性。

图 3:拥抱脸,创建一个新的模型库

创建模型后,您将进入存储库视图,默认情况下会选择“模型卡”选项卡:

图 4:拥抱脸,新模型库,模型卡

对于普通的 Git 用户来说,“文件和版本”选项卡会很熟悉:

图 5:拥抱脸,新模型库,文件和版本

我的模型库目前是空的,但下面的截图显示了一个完全填充的模型卡对拥抱脸社区模型的要求:

图 6:拥抱脸、Bert 基本模型(未封装)、模型卡

有几个不同的元素需要强调:

  1. 在顶部我们有模型名称,喜欢和紧接在与模型相关的标签之下。例如框架、模型类型和其他属性。
  2. 模型卡的主体可用于给出模型的概述、如何使用它的代码片段、约束和任何其他相关信息。此项目的内容是通过用正确的标记填充模型库中的 README.md 文件来确定的。
  3. 你可以训练模型来微调它,甚至通过指向一个 AWS SageMaker 实例,或者拥抱 Face 自己的 Infinity 容器化基础设施来部署它。如果你想在你自己的代码中使用这个模型,'< / > Use…'将会弹出一个代码片段,告诉你如何基于用来构建这个模型的框架来导入它。另一个非常好的特性是 Hosted inference API,它允许您显示一个小部件,让用户将样本值传递给模型来测试其输出。托管推理 API 小部件由模型文件中包含的元数据决定。
  4. 最后,您还可以看到关于哪些数据集用于训练模型以及使用模型的空间的元数据。

💡拥有一个详细的模型卡是很重要的,因为它可以帮助用户理解何时以及如何应用你的模型。

数据集

创建新数据集的流程与创建新模型的流程非常相似。点击中心的“+新建”按钮,然后选择“数据集”。您可以指定名称、许可证类型、公共或私人访问。然后您会看到一个存储库视图,带有“数据集卡片”、“文件和版本”,类似于模型库中的内容。

图 7:拥抱脸、imdb 数据集、数据集卡片

再次调用关键元素:

  1. 除了数据集标题、喜欢和标签,您还可以获得一个目录,这样您就可以跳到数据集卡片主体中的相关部分。
  2. 数据集卡的主体可以配置为包含嵌入式数据集预览。这非常方便,因为它显示了特性、数据分割和子集(如果有的话)。这些项目和先前项目的内容是通过用正确的标记填充数据集存储库中的 README.md 文件来确定的。
  3. 最后,您可以快速链接到 GitHub repo,以及通过 Hugging Face python 数据集库使用数据集的代码片段。还有进一步的元数据,如数据集的来源、大小以及拥抱脸社区中的哪些模型已经在数据集上进行了训练。

空格

共享空间给你一个地方来展示你的工作,在自我包含的 ML 演示应用程序的形式。如果你正在寻找灵感,有许多社区贡献的空间可供你查看。

图 8:拥抱脸,社区空间

这是一个很好的方式来建立一个项目组合,可以在演示时使用,与组织中的同事或更广泛的 ML 生态系统协作。

要开始,请单击中心的“+新建”按钮,然后选择“空间”。这将把您带到一个对话框,您可以在其中指定空间的名称和许可证类型。

您还需要选择一个 SDK。在撰写本文时,你可以从两个基于 Python 的应用托管框架中挑选: GradioStreamlit 。或者,你可以只使用自定义的 HTML。

图 9:拥抱脸,创建一个新的模型库

与创建新模型或数据集时一样,一旦创建,您将被定向到空间存储库。应用程序卡是您的演示出现的地方。

为了方便起见,我只选择了自定义 HTML 选项,并通过“文件和版本”选项卡编辑了 index.html 文件。但是您可以在这里嵌入任何东西,包括 iFrame 中的内容。

图 10:拥抱脸、空间、App 卡

创建共享空间并返回到您的个人资料后,您会看到它出现在您的活动订阅源中,并准备好与世界共享!

图 11:拥抱脸,具有更新空间的用户简档/存储库

🏄🏽‍♂️探索社区

社区模式

在你的个人(或组织)存储库之外,你还可以探索拥抱脸社区贡献的所有数万个模型、数据集和空间。

您可以从位于网页顶部的顶级导航菜单中访问它们。

图 12:拥抱脸,社区模特

社区资源库中的模型的大致⅔已经在 PyTorch 中构建,但是 TensorFlow 和其他常见 ML 库中的每个主要任务通常都有替代方案。

每个模型都有一个模型卡,如上面的模型部分所示,带有作者提供的关键信息,以及一个托管的推理 API 来查看模型的样本输入和输出。在“文件和版本”选项卡中,有一个存储库视图中所有文件的列表,以及一个包含以前模型运行和保存以供参考的文件夹。

任务

现在你可以花大量的时间在众多不同的社区模型中搜寻,试图找到一个可以帮助解决你正在努力解决的挑战的模型。

相反,拥抱脸通过提供模型的精选视图为你节省了麻烦,这取决于你试图使用人工智能处理的任务。

图 13:拥抱脸、顶层导航和任务页面

拥抱脸的大多数社区贡献都属于 NLP ( 自然语言处理)模型的范畴。但是你也可以找到与音频和计算机视觉模型任务相关的模型。

每项任务的文档都以直观的方式进行了解释。除了图表,每个解释都附有一个 youtube 视频短片,以及使用推理 API 和链接社区制作的模型的演示链接。

图 14:拥抱脸、任务、文本分类文档

还有对可能的用例以及任务变体的描述。许多任务描述页面将包括笔记本和培训脚本,以帮助入门。这些脚本涵盖了从设置和加载数据集到预处理(使用令牌化器)、模型比较和微调(使用训练器 API)的端到端流程。

📔把这一切都结合在一起!

在这最后一节中,我们将看看如何通过变形金刚、训练器和推理 API 以及 Python 笔记本来开始使用拥抱脸。

使用 Hugging Face 工具的一个主要优势是,您可以减少从头创建和训练模型的训练时间、资源和环境影响。通过微调现有的预训练模型,而不是从头开始训练,您可以在更短的时间内从数据到预测。

1.同步和认证

通过将您的笔记本与拥抱脸中心同步,拥抱脸鼓励并使您可以轻松地与拥抱脸社区的其他人分享您的制作或微调。如果您使用可以在您的用户资料的“访问令牌部分生成的令牌登录,它会将您的模型与网站同步。

图 15:拥抱脸、笔记本、认证

🧐注意——这里我们使用一个样板cola batory环境,但是高级选项允许在 Amazon SageMaker 和 AutoNLP 中进行直接培训,以及多种部署方法,包括拥抱 Face 自己的 Infinity。

2.数据准备

如前所述,拥抱脸 Github 提供了一个很好的数据集选择,如果你正在寻找一些东西来测试或微调一个模型。

在这里,我们试驾拥抱脸自己的模型 DistilBERT 来微调一个问答模型。

一旦安装并导入了必要的库,我们就可以使用 Datasets 库在一行中加载数据集。拥抱脸数据集通常以 Pyarrow 格式构建,但是也可以导入 JSON 或 CSV 文件。

图 16:抱脸,笔记本,加载数据集

接下来,我们预处理训练数据。Transformers AutoTokenizer 功能用于简化流程。更好的是,许多记号赋予器是由 Rust 支持的“快速”记号赋予器,以实现更高效的处理。

样板文件 Colab 向用户展示了如何截断长文档,以及如何在标记时考虑上下文分割。拥抱脸还提供了工具,通过使用偏移映射来帮助将令牌映射回原始数据上下文。

有一个数据集的 map 方法可以将标记化应用于整个数据集。

图 17:拥抱脸、笔记本、数据集准备

3.根据您的需求微调模型

一旦数据集准备好了,我们就可以微调模型了。作为 transformers 库的一部分,有一个 AutoModelForQuestionAnswering 类,它是从模型检查点预先训练的。然后,我们需要做的就是定义 PyTorch 模型的训练参数,并将其传递给训练器 API。

图 18:抱脸、笔记本、模特训练参数

可以轻松设置超参数,以匹配您想要的结果/环境。

4.培训定制模型

以下代码行是您开始模型训练过程所需要的全部内容。

trainer.train()

图 19:抱脸、笔记本、模特训练

5.模型输出

模型运行后,可以使用一行代码将它与教练 API 同步回中心:

trainer.push_to_hub()

样板 Colab 文档还包括一个模板,用于创建预测并将其后处理成有意义的输出。

一旦上传,你的模型卡将看起来像下面的截图,然后可以通过编辑进一步定制。

图 20:抱脸定制款

然后,您可以在 Hugging Face 网站上使用托管推理 API 在自动生成的模型页面上运行预测,或者将模型检查点加载到 Python 中,以开始基于微调后的模型进行预测。

另一个很酷的功能是,如果模型是在 TensorFlow 中创建的,您可以在 Tensorboard 中查看训练指标和模型指标。

现在,我们简要概述了什么是拥抱脸,如何开始共享模型和数据集,在社区中导航,以及如何在您自己的用例中重用现有的社区模型。

👏特别感谢我的兄弟 塔希尔·马哈茂德 此贴的合著者!

📚延伸阅读和有用的资源

字典里有什么?

原文:https://towardsdatascience.com/whats-in-a-dictionary-87f9b139cc03

基本 Python 数据结构的概述以及为什么应该使用它

Emmanuel Ikwuegbu 在 Unsplash 上拍摄的照片

这是我的系列文章中的第三篇,讨论 Python 中有用的特性以及使用它们的好处。一定要看看这里的前两部分:Lambda 中有什么?什么是列表理解?

当我还是计算机科学入门的助教时,我经常被问到的话题之一就是 Python 字典。学生们还不清楚 1)语法是如何工作的,以及 2)词典应该用于什么目的。我将在本文中解决这两个问题。

字典到底是什么?

字典是 Python 版本的散列图。如果你不知道那是什么,不要担心。我喜欢 Python 的实现的原因之一是它为用户抽象了许多复杂的东西。这对于数据科学家或其他研究人员来说是非常理想的,他们可能没有接受过密集的编程培训,但仍然坚持使用 Python。

一种看待字典的方式是将字典视为由成对的组成的查找表。它非常适合存储无序的对象集合,其中的键和值以某种方式相互关联。使用键是为了访问它们各自的值。

理解词典最简单的方法是看一个具体的例子。假设我有一个人员列表,我想记录每个人最喜欢的泰勒·斯威夫特的歌曲:

>>> swifties = {'Arjun' : 'Dorothea', 'Ali' : 'Champagne Problems'}

关于上述内容的一些要点:

  • 与列表不同,字典由花括号表示:{}
  • 字典中的单个条目由一个键-值对组成,其中键和值由冒号分隔。所以,上面的字典swifties有两个条目。在第一个条目中,键是字符串'Arjun',而值是字符串'Dorothea'
  • 字典中的条目用逗号分隔。

让我们继续上面的代码,看一些如何使用字典的例子。我将编写一个执行一些操作的代码片段,稍后我将解释它们:

>>> swifties['Ali']
'Champagne Problems'>>> swifties['Georgia'] = 'All Too Well'>>> swifties
{'Arjun': 'Dorothea', 'Ali': 'Champagne Problems', 'Georgia': 'All Too Well'}>>> swifties['Champagne Problems']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Champagne Problems'

我们来分解一下上面的代码:

  • 在第一行中,我们看到如何使用方括号来访问字典中的值。我们键入字典的名称,然后将我们想要访问其值的键放在后面的括号中。
  • 在第二行中,我们看到如何将一个条目添加到一个已经存在的字典中。它的语法类似于访问一个值,但是这次我们使用=将值赋给那个键。第三行打印出字典以及我们成功添加的条目。
  • 最后一行是为了说明我们不能使用值直接访问字典中的键;这是一条单行道。然而,一次访问所有的值是可能的(与键没有任何关联)——我稍后将向您展示如何操作。

最后,让我们看看几个实用函数,它们在使用字典时经常被证明是有帮助的:

>>> swifties.keys()
dict_keys(['Arjun', 'Ali', 'Georgia'])>>> swifties.values()
dict_values(['Dorothea', 'Champagne Problems', 'All Too Well'])>>> swifties.items()
dict_items([('Arjun', 'Dorothea'), ('Ali', 'Champagne Problems'), ('Georgia', 'All Too Well')])>>> swifties['Ella']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Ella'>>> swifties.get('Ella', '22')
'22'

同样,让我们来分解一下:

  • 在前三个例子中,我们看到了三个有用的函数,它们允许我们直接访问所有的 1)键、2)值或 3)条目(键-值对)。从技术上讲,它们是作为特殊的 Python iterable 对象返回的,但是通过键入list(swifties.keys())很容易将它们转换成列表。
  • 最后两个例子说明了访问字典中的值的第二种也可能是更好的方法:dict.get()函数。使用这个函数的好处是,如果您试图访问字典中不存在的键,您可以提供一个默认值。相比之下,使用方括号方法会给我们一个错误。

在这一节的最后,我将简要提及你应该记住的关于字典的三个要点。首先,从不依赖字典中条目的顺序。字典被设计成一个无序的集合,它不应该用来完成由其他数据结构更好处理的顺序任务。

有些人不同意这一点,因为从 Python 3.7 开始,字典事实上有一致的顺序。然而,有两个原因你应该避免在你的代码中依赖这种顺序:1)这违反了抽象障碍,因为哈希映射(字典所基于的)从来就不是有序的,2)你可能偶尔会发现自己在一个旧的代码库中工作,在这种情况下 Python 字典将不会是有序的。

其次,字典的键在 Python 中不能是可变类型(比如 lists)。这个细节对于高级应用来说并不太重要,但是它与可变类型不能被可靠地散列(这是一个将它们随机放在查找表中的时髦词)的事实有关,因为它们可以随时改变。值可以是任何东西(甚至其他字典!).

最后,字典中的键必须唯一(值不必如此)。如果允许重复,那么当您查找一个键时,Python 将不知道您想要哪个关联值。

对于字典来说,一个有用的类比是把它想象成一个银行金库:

  • 金库里的每个抽屉都对应一件物品。
  • 如果你去保险库,你的钥匙会和其他人的不同,你会用它来打开你放在抽屉里的贵重物品。
  • 很有可能其他人的抽屉里也有和你一样的东西(比如一条一模一样的项链),但是他们当然还是有一把不同的钥匙。类似地,字典中的键必须是唯一的,而值可以重复。

现在,让我们谈谈为什么我们可能会使用字典。

字典为什么有用?

好吧,所以字典很酷,但是拥有它们真的有意义吗?我们就不能把变量放在一个列表里然后就到此为止吗?

我想如果你真的很有创造力,你可以只通过列表来应付。然而,正如我在以前关于 lambdas 和 list comprehensions 的文章中提到的,Pythonic 编程风格反对不必要的复杂的做事方式。字典是编写简单逻辑代码的好方法。

这里有几个可能适合使用字典的场景:

  • 清洗和处理熊猫的数据。熊猫中的多个函数以字典为可选参数。您可以使用它们方便地重命名行,或者使用来更改整列的类型。见鬼,你甚至可以使用字典直接创建完整的数据框架。如果你是熊猫用户,理解字典是必须的。
  • 在交互程序中存储用户输入。许多程序包括从用户那里收集信息,并以某种方式进行转换。字典为存储这些数据提供了一种明智的方式——字典的结构很好地将用户与他们的特定信息联系起来。事实上,像 MongoDB 这样的专业数据库服务使用的内部结构与字典非常相似。

当然,这只是两个例子。在很多情况下,字典可能会被证明是有用的。总的来说,我建议寻找像上面第二点那样的情况,在这种情况下,你有一个明确的案例来存储一堆相关联的对。如果你这样做了,我相信最终的结果将是高质量的代码。

下次见,伙计们!

想擅长 Python? 获取独家、免费获取我简单易懂的指南点击 。想在介质上无限阅读故事?用我下面的推荐链接注册!

*https://murtaza5152-ali.medium.com/?source=entity_driven_subscription-607fa603b7ce---------------------------------------

我叫穆尔塔扎·阿里,是华盛顿大学研究人机交互的博士生。我喜欢写关于教育、编程、生活以及偶尔的随想。*

λ里有什么?

原文:https://towardsdatascience.com/whats-in-a-lambda-c8cdc67ff107

Python 中匿名函数的概述以及为什么应该使用它们

照片由图片栏上打开图标

当我还是计算机科学入门的助教时,经常让我的学生困惑的话题之一是 Python 中的 lambda 函数。这种困惑表现在两个方面:1)难以理解这些函数到底是如何工作的,以及 2)对于为什么要使用它们感到困惑。

我将在本文中解决这两个问题。

lambda 函数到底是什么?

Lambda 函数旨在作为定义函数的一种速记法,可以方便地编写简洁的代码,而不会浪费多行代码来定义一个函数。它们也被称为匿名函数,因为它们没有名字,除非被赋予一个名字。

这样的函数不是 Python 独有的,甚至在第一台计算机制造出来之前就已经存在了。它们起源于阿隆佐·邱奇在 1936 年发表的关于λ微积分的工作。

许多编程语言都包含了编写匿名函数的功能,但是我特别喜欢 Python 实现的简单性和清晰性。此外,匿名函数固有的简洁特性使它们非常适合 Pythonic 编程风格。

理解如何用 Python 编写 lambda 函数的最简单方法是将它们与使用def关键字定义函数的传统方法进行对比。让我们来看看下面这个具体的例子,在这个例子中,我们定义了一个函数,它接收一个数字并输出这个数字的平方:

def square(x):
    return x * x

和...相对

square = lambda x : x * x

关于上面的两个代码片段,需要注意一些要点:

  • 命名:在第二段代码中,lambda而不是函数的名字。这是一个告诉 Python 我们正在定义一个函数的关键字。可以认为它与传统函数定义中的关键字def相对应。一般来说,lambda 函数是在没有命名的情况下定义和使用的(见下一节)——但是如果必须给它命名,可以通过传统的变量赋值来完成。
  • 参数/输入:在传统的函数定义中,参数x在函数名后面的括号中。对于 lambda 函数,参数x位于冒号左侧的处。对于有多个输入的函数,所有的输入都在冒号的左边,用逗号隔开。
  • 返回值:在经典函数中,返回值跟在return 关键字之后。对于 lambda 函数,返回值位于冒号右边的处。

lambda 函数为什么有用?

好吧,那么 lambda 函数是古怪的,有点酷,但是拥有它们有什么意义呢?我们不能一直使用正则函数定义吗?

从技术上讲,是的——但这并不意味着 lambda 函数是无用的。它们的主要好处在于简单和方便。编写代码时——尤其是 Python 代码——可读性是最重要的。Lambda 函数是让代码更易读、更简洁的绝妙方法。

这里有几个使用 lambdas 的合适场景:

  • 在长程序中编写快速函数。在代码中间随机插入一个def语句在风格上很奇怪;函数通常被定义在代码文件的顶部,或者对于特别复杂的程序,被定义在不同的文件中。然而,这提出了一个单独的问题,因为代码的读者现在将不得不到处搜索来找出一个简单函数做什么。使用 lambda 函数解决了这个问题:程序员可以定义一个 lambda 函数并立即使用它,而不会中断代码流。
  • 使用熊猫分析数据。 Lambda 函数在数据科学中特别有用。pandas——Python 的综合数据科学模块——利用了许多操作,用户可以将函数作为可选参数传入。必须按照传统方式定义这些功能是一件痛苦的事情。我经常在工作中使用 Pandas,我可以证明这样一个事实,lambda 函数让我在快速编写和测试代码以处理数据方面变得更加容易。

当然,这只是两个例子。在许多不同的情况下,匿名函数都是有用的,但是这取决于程序员所做的事情的上下文。要记住的最重要的一点就是它们是否有助于简化代码。

然而,我要以一句警告来结束我的演讲:不要过度,因为那可能会无意中降低的可读性。我的一位教授非常喜欢 lambda 函数,甚至给我们出了一些可笑的试题,其中有时包含两三个嵌套的 lambda 函数。大多数学生甚至不能开始破译密码。

话说回来,这位教授还成功地用一张纸就能写完的代码写了一个完整的自然语言解析器,所以可能有些什么。我想,人各有志吧。

下次见,伙计们!

更新:在这里阅读本文的第 2 部分!

想擅长 Python? 获取独家,免费获取我简单易懂的指南 。想在介质上无限阅读故事?用我下面的推荐链接注册!

https://murtaza5152-ali.medium.com/?source=entity_driven_subscription-607fa603b7ce---------------------------------------

我叫穆尔塔扎·阿里,是华盛顿大学研究人机交互的博士生。我喜欢写关于教育、编程、生活以及偶尔的随想。

λ里有什么?—第二部分

原文:https://towardsdatascience.com/whats-in-a-lambda-part-2-6dc2fa89d2d1

既然您已经学习了 Python 中的 lambda 函数,我将介绍一个数据处理示例。

照片由图片栏上打开图标

这是我之前的文章的后续,Lambda 中有什么?一定要先查看一下——由于原文的受欢迎程度,我决定写这篇后续文章。在那篇文章中,我提到了 lambda 函数可以用于通过各种 Pandas 操作快速转换数据。在本文中,我将通过几个完整的例子来说明如何做到这一点。

上次,我详细解释了 lambda 函数的语法。我不会在这里重复所有的细节,但在我们进入数据之前,我会给出一个更复杂的 lambda 的例子。

假设您有下面的函数,它将一个数字列表中的所有元素进行平方:

def square_list(nums):
     squared_list = []
     for item in nums:
          squared_list.append(item * item)
     return squared_list

有没有可能把这个相当复杂的过程翻译成一个 lambda 函数?当然可以!我们简单地使用相同的语法,并利用我们的好朋友,列表理解:

square_list = lambda nums : [item * item for item in nums]

瞧啊。我们已经把我们的函数简洁地浓缩成一行可读的代码。快速复习一下:我们的参数nums在冒号的左边,我们的返回值(构建一个新的平方列表的整个列表理解)在冒号的右边,我们通过变量赋值语法给函数命名为square_list

现在我们已经解决了这个问题,让我们看一个将 lambdas 应用于熊猫数据处理的具体例子。假设您有以下名为my_df的数据框架,其中包含一些关于您的雇主希望您更深入分析的数据的汇总统计数据:

 mean   median       standard deviation
0    22      23                 1.7
1    33      25                 2.8
2    44      40                 4.9
3    55      55                 2.0
4    66      78                 1.0

当您浏览这个时,您意识到您想要对standard deviation列求平方,这样您就可以轻松地测量各自的方差。对于 lambdas,这是一个单行作业:

>>> my_df['standard deviation'] = my_df['standard deviation'].apply(lambda x : x * x)
>>> my_df
    mean   median       standard deviation
0    22      23                2.89
1    33      25                7.84
2    44      40               24.01
3    55      55                4.00
4    66      78                1.00

上面到底发生了什么?嗯,.apply()函数接收一些函数,并将其应用于所选列中的每个单独的值。这里,因为我们的 lambda 函数对单个值求平方,所以我们有效地对每一行的标准偏差值求平方,并将该列重新分配给新值。您可能还应该快速地将该列重命名为“variance ”,尽管我在这里没有提到它。

接下来,假设您想要将mean列转换为具有浮点值,但是您无论如何也记不起执行该操作的函数(提示:它是my_df[‘mean’].astype(float))。而且,和往常一样,你懒得去查(或者可能你就是没有互联网连接)。兰达斯再次出手相救:

>>> my_df['mean'] = my_df['mean'].apply(lambda x : float(x))
>>> my_df
   mean    median       standard deviation
0  22.0      23                2.89
1  33.0      25                7.84
2  44.0      40               24.01
3  55.0      55                4.00
4  66.0      78                1.00

此时,您可能想知道 lambdas 的唯一潜在用途是不是与.apply()函数一起使用。答案是否定的。为了探索另一个更复杂的用例,我们将使用下面的数据框架,它由两个学生在各种作业中的成绩组成:

 name    letter grade  score
0   Kayla            A     92
1   Kayla            A     94
2   Kayla            A     97
3   Kayla            B     81
4   Kayla            B     83
5   Kayla            B     85
6    Arif            A     93
7    Arif            B     86
8    Arif            A     99
9    Arif            B     80
10   Arif            A     94
11   Arif            B     88

这学期快结束了,我们想完成一些事情。首先,我们希望以更清晰的格式存储数据,这样我们可以更容易地看到两个学生的成绩。此外,我们希望看到每个学生每个字母等级的平均分。然而,有一个小小的警告:根据教学大纲,每个学生每降低一个字母的分数就会得到他们的最低分,所以我们只想把最高的两个分数作为平均分数。这让事情变得有点复杂,因为我们不能只使用内置的mean()函数。

好吧,那就很多了。它的美妙之处?结合使用 lambda 函数和[pandas.pivot_table](https://pandas.pydata.org/docs/reference/api/pandas.pivot_table.html)函数,我们可以在一行代码中完成我们的任务:

>>> grades_df.pivot_table(index='name', columns='letter grade', values='score', aggfunc = lambda series : (sorted(list(series))[-1] + sorted(list(series))[-2]) / 2)letter grade     A     B
name
Arif          96.5  87.0
Kayla         95.5  84.0

这里有很多东西需要打开;让我们一步一步来:

  • 首先,我们说我们想要创建一个数据透视表,将index设置为'name',将columns设置为'letter grade'。这意味着我们希望数据透视表的每一行都是学生的名字,每一列都是字母等级。
  • 接下来,我们将参数values设置为'score'。这意味着我们将查看数据透视表中'name''letter grade'的每个组合的'score'值。例如,对于组合'Arif''A',值是由值(93, 99, 94)组成的熊猫序列,因为这些都是对应于原始数据帧中包含'Arif''A'的行的分数。
  • 最后,参数aggfunc是我们的 lambda 函数发挥作用的地方。对于我们在上面的项目符号中创建的每个组合系列,aggfunc告诉 Pandas 我们希望如何将这些值聚合成一个值,该值实际上被放置在相应的 DataFrame 条目中。我们想要前两个分数的平均值。因此,我们的 lambda 函数接受一系列值,对其进行排序,取前两个值(使用否定列表索引),并对它们进行平均。具体看一下'Arif''A'的例子,我们可以看到,从系列(93, 99, 94)中,我们取9994的平均值,得出96.5——我们在数据透视表中看到的最终值。其他四个条目以相同的方式计算。

就我个人而言,我觉得大熊猫能在一条直线上完成所有这些令人印象深刻。也就是说,这是一个教学示例,说明 lambda 函数在 Pandas 中的使用,并不一定包含所有情况下最有效的解决方案。虽然在这个例子中对小列表来说没什么大不了的,但是像我们在 lambda 函数中所做的那样,对一个大得多的列表进行两次排序是很低效的。在这种情况下,最好定义一个只需要排序一次的传统多行函数。

在这里,我选择将简单的代码放在可以忽略的时间改进之上。像往常一样,您应该在您的特定用例中测量数据,并相应地决定解决问题的方法。

最后的想法

虽然我在本文中只说明了两种情况,但是 Pandas 包含了无数的操作,这些操作接受可选的函数,这些函数可以作为 lambdas 传入。我希望上面的详细介绍能够让您更好地理解在进行这种数据处理时如何应用 lambda 函数的知识。永远记住最终目标——更干净、更 Pythonic 化的代码。如果你记住这一点,你就成功了。

下次见,伙计们!

想擅长 Python? 获取独家、免费获取我简单易懂的指南点击 。想在介质上无限阅读故事?用我下面的推荐链接注册!

https://murtaza5152-ali.medium.com/?source=entity_driven_subscription-607fa603b7ce---------------------------------------

我叫穆尔塔扎·阿里,是华盛顿大学研究人机交互的博士生。我喜欢写关于教育、编程、生活以及偶尔的随想。

什么是列表理解?

原文:https://towardsdatascience.com/whats-in-a-list-comprehension-c5d36b62f5

概述 Python 对循环的替代以及为什么应该使用它们。

托尔比约恩·赫尔格森在 Unsplash 上拍摄的照片

更新:一定要看看本文 第二部分

这是我的系列文章中的第二篇,讨论 Python 中的独特特性以及使用它们的好处。请务必在此查看第一部分:Lambda 中有什么?

Python 作为一种编程语言之所以受欢迎,很大程度上是因为它能够以简单紧凑的方式完成复杂的任务。大多数语言中存在的常见编程思想通常在 Python 中有独特的实现,这有助于编写干净、可读的代码。列表理解是我最喜欢的 Python 特有的特性之一,因为它们提供了传统 for 循环的单行替代方案。

列表理解到底是什么?

列表理解是 Python 中的一种语法形式,允许程序员在一行中循环并转换一个 iterable。术语列表理解来源于两个特征:1)用于编写这种理解的类似列表的语法,以及 2)列表理解的输出总是 Python 列表的形式。

理解列表理解的最简单方法是将它们与传统的 for 循环进行对比。让我们来看看下面这个具体的例子,在这个例子中,我们要对列表中的每个数字求平方:

lst = [1, 2, 3, 4, 5]
squared_lst = []
for number in lst:
    squared_lst.append(number * number)

和...相对

lst = [1, 2, 3, 4, 5]
squared_lst = [number * number for number in lst]

关于上面的两个代码片段,需要注意一些要点:

  • 与 for 循环不同,list comprehensions 自动将其输出放入一个列表中。在第一个代码片段中,我们必须显式地创建一个新的列表,然后在 for 循环中向其追加内容。相比之下,在第二个代码片段中,我们简单地将 list comprehension 的输出赋值给我们的新变量。
  • 一开始阅读列表理解可能会令人困惑,因为如果你习惯于 for 循环,顺序就会颠倒。但是,它使用相同的基本概念。在这个列表理解中,语句for number in lst可以被认为对应于传统的 for 循环。它遍历列表中的每个元素,每次都将临时变量number绑定到元素。在列表理解的第一部分,number * number告诉 Python,在将元素添加到我们的新列表之前,我们要对它求平方。
  • 与 for 循环一样,原始列表lst保持不变。list comprehension 将转换后的元素放入一个新的列表中,然后该列表被赋值给我们的变量squared_lst

列表理解还能做什么?

上面的例子很酷,但是如果列表理解不能做任何更复杂的事情,那就太可悲了。这里我想强调两个特别的特性:1)过滤列表的能力和 2)模拟嵌套 for 循环的能力。

对于 Python 程序员来说,根据某种条件从列表中删除元素是一个相当常见的用例。例如,假设您希望过滤一个数字列表,只保留那些小于 100 的数字。您可以这样做:

>>> lst = [1, 324, 44, 500, 7]
>>> [number for number in lst if number < 100]
[1, 44, 7]

更好的是,您甚至可以对剩余的数字进行运算!列表理解允许您在一条语句中过滤和转换所有内容:

>>> lst = [1, 324, 44, 500, 7]
>>> [number * number for number in lst if number < 100]
[1, 1936, 49]

一个重要的注意事项:如果您使用上面的语法在单个列表理解中过滤和转换,请记住 Python 首先过滤,然后转换

Python 程序员的第二个常见用例是将一个 for 循环嵌套在另一个循环中。这里有一个这样的例子:

>>> nested_lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> for inner_lst in nested_lst:
        for number in inner_lst:
            print(number)
1
2
3
4
5
6
7
8
9

通过列表理解,您可以将整个嵌套的 for 循环缩减为一行:

>>> nested_lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> **[print(number) for inner_lst in nested_lst for number in inner_lst]**
1
2
3
4
5
6
7
8
9
[None, None, None, None, None, None, None, None, None]

我知道,这看起来有点混乱。一开始我也很困惑。但是如果你仔细阅读这一行,它遵循与嵌套的 for 循环相同的逻辑:首先,我们编写for inner_lst in nested_lst来访问外部列表中的每个单独的列表,然后我们编写for number in inner_lst来访问各自内部列表中的每个数字。和嵌套的 for 循环完全一样;我们只是删除了冒号和换行符。

一个小提示:出现 9 次None的列表只是列表理解的输出(因为 Python 中的print函数返回None)。

为什么列表理解有用?

好吧,所以列表理解很酷,但是拥有它们有什么意义吗?我们不能一直使用 for 循环吗?

从技术上讲,是的——但这并不意味着列表理解毫无用处。正如我在上一篇关于 lambdas 的文章中提到的,Pythonic 编程的原则之一是编写简单、简洁、可读的代码。列表理解是产生这种高质量代码的极好方法。

以下是使用列表理解的几种情况:

  • 使用MapReduce模型快速处理数据。假设您正在处理一些数据,并且希望在编写利用专业 MapReduce 框架的密集型代码之前快速获得一些见解。列表理解提供了一种简单的方法来模拟这个模型,以便运行小型测试。您可以快速过滤您的数据,并在理解的范围内映射一些转换函数,然后您可以将 Python 的reduce函数应用于结果列表。
  • 在 Jupyter 中模拟随机实验。如果你是一名数据科学家(或者正在接受培训成为一名数据科学家),你可能已经使用samplerandom以及 Jupyter 笔记本中的所有好东西运行了一些测试。一般来说,在评估某个假设时,使用 for 循环是为了模拟实验的数千次运行。下一次,你可以使用列表理解,让你的代码简单一点。

当然,这只是两个例子。总的来说,我建议明智地使用列表理解,以使你的代码更简洁,可读性更好。如果你是一名 Python 程序员,这是你应该非常熟悉的思维方式——如果你是这门语言的新手,这是你应该学好的思维方式。

下次见,伙计们!

想擅长 Python? 获取独家、免费获取我简单易懂的指南点击 。想在介质上无限阅读故事?用我下面的推荐链接注册!

https://murtaza5152-ali.medium.com/?source=entity_driven_subscription-607fa603b7ce---------------------------------------

我叫穆尔塔扎·阿里,是华盛顿大学的一名博士生,研究人机交互。我喜欢写关于教育、编程、生活以及偶尔的随想。

NumPy 数组中有什么?

原文:https://towardsdatascience.com/whats-in-a-numpy-array-e3c8a239dcfa

Python 的数组数据结构概述以及为什么应该使用它

尼克·希利尔在 Unsplash 上的照片

这是我讨论 Python 独特特性系列的第六篇文章;请务必查看 lambdaslist comprehensionsdictionarytuplef-strings 中的前五个。

如果您对数据处理感兴趣,那么您可能会使用 Python(如果您没有,那么您应该考虑这样做)。谈到用 Python 处理数据,理解如何使用 NumPy 数组是绝对必要的。上帝禁止你使用传统的 Python 列表来分析你的数据;特别是在数据科学的环境中,NumPy 数组比列表有很多优点。

NumPy 数组到底是什么?

NumPy 数组是通过 Python 的 NumPy 模块可用的顺序数据结构。乍一看,它的功能与列表非常相似:

>>> import numpy as np
>>> np.array([1, 2, 3])
array([1, 2, 3])

事实上,定义数组的一种方法是传入一个列表,如上所述。您还可以使用内置函数,如np.zerosnp.onesnp.arange,用指定的元素定义数组:

>>> np.ones(5) # An 5-element array with all ones
array([1., 1., 1., 1., 1.])>>> np.zeros(3) # A 3-element array with all zeros
array([0., 0., 0.])>>> np.arange(3, 10) # An array of numbers from 3 to 10 (not right-inclusive)
array([3, 4, 5, 6, 7, 8, 9])

您可以像访问列表一样访问、更改和分割 NumPy 数组的元素:

>>> my_arr = np.array([3, 5, 2, 4, 12])
>>> my_arr[3]
4>>> my_arr[2] = 33
>>> my_arr
array([ 3,  5, 33,  4, 12])>>> my_arr[2:4]
array([33,  4])

好吧,这很酷,但是到目前为止,看起来并没有比列表更好的地方,那么拥有这些数组有什么意义呢?

NumPy 数组为什么有用?

数组的主要优势在于它们能够快速操作和处理数据。当您处理数字时,您经常需要进行算术运算或快速生成汇总数据。在 NumPy 中,这可以使用许多内置函数来完成。这里有几个例子(你可以在这里查看完整的列表:

>>> my_arr = np.arange(0, 20)
>>> np.mean(my_arr) # Get the mean of numbers in array
9.5>>> np.sum(my_arr) # Get the sum
190

>>> np.sqrt(my_arr) # Square root of each element
array([0\.        , 1\.        , 1.41421356, 1.73205081, 2\.        ,
       2.23606798, 2.44948974, 2.64575131, 2.82842712, 3\.        ,
       3.16227766, 3.31662479, 3.46410162, 3.60555128, 3.74165739,
       3.87298335, 4\.        , 4.12310563, 4.24264069, 4.35889894])>>> np.cumsum(my_arr) # Cumulative sum up to each element
array([  0,   1,   3,   6,  10,  15,  21,  28,  36,  45,  55,  66,  78, 91, 105, 120, 136, 153, 171, 190], dtype=int32)

我非常喜欢最后一个——它将所有元素的总和增加到当前元素。因此,例如,输出数组的索引4处的元素是10,因为10 = 0 + 1 + 2 + 3 + 4(它们是输入数组的元素04)。如果你点击上面的链接,还有很多像这样的功能。

您还可以在数组之间执行非常方便的元素操作:

>>> np.array([1, 2, 3]) + np.array([-1, -2, -3])
array([0, 0, 0])>>> np.array([1, 2, 3]) * np.array([-1, -2, -3])
array([-1, -4, -9])

有琴弦收藏吗?想以某种方式操纵它们?NumPy 数组没有问题:

>>> strings = np.array(['MY', 'UPPERCASE', 'STRINGS'])>>> np.char.lower(strings)
array(['my', 'uppercase', 'strings'], dtype='<U9') # not so big now

不管怎样,我太兴奋了。您明白了——NumPy 数组是一种非常有用的数据结构,因为它们操作数据的逻辑简单明了。总的来说,NumPy 是一个非常适合 Pandas 的模块,如果你已经是 Pandas 的用户,我强烈建议你学习如何使用它。如果你两者都不使用,那么我建议两者都学!

和往常一样,你的目标应该是生成 Pythonic 代码,它不仅能完成手头的任务,而且易于阅读、理解和维护(人们经常忽略最后一点,但尝试这样做可能是个好主意,这样理解你的代码对将来接手它的人来说就不是一项可怕的任务)。NumPy 数组只是朝着这个方向迈出的又一步。

下次见,伙计们!

想擅长 Python? 获取独家、免费获取我简单易懂的指南点击

参考

[1] 计算和推理思维。https://inferentialthinking.com/chapters/05/1/Arrays.html

[2]https://www . plural sight . com/guides/different-ways-create-numpy-arrays

元组里有什么?

原文:https://towardsdatascience.com/whats-in-a-tuple-5d4b2668b9a1

概述 Python 对列表的替代以及为什么应该使用它们

克里斯里德在 Unsplash 上的照片

这是我讨论 Python 独特特性系列的第四篇文章;一定要检查一下 lambdaslist comprehensionsdictionary上的前三个。

啊,臭名昭著的元组。这是什么?我们真的需要它吗?它实际上和列表有什么不同吗?这些只是我当计算机科学入门助教时,我的学生问我的问题的一个子集。

而且理由很充分。乍一看,元组似乎是没有实际用途的冗余数据结构。然而,这只是一种误解。一旦你深入理解了元组,你就能够将它们与列表区分开来,并确定在什么情况下使用它们。

让我们开始吧。

到底什么是元组?

元组是 Python 中的一种数据结构,可用于存储对象集合。它们可以包含任何其他内容:数字、字符串、列表,甚至其他元组!要创建元组,只需使用常规括号并用逗号分隔元组。正如我们在下面的例子中看到的,它们的功能与列表非常相似:

>>> my_tuple = ('words', 76, ['list'], ('another', 'tuple'))>>> my_tuple
('words', 76, ['list'], ('another', 'tuple'))>>> my_tuple[0]
'words'>>> my_tuple[2]
['list']>>> my_tuple[3]
('another', 'tuple')>>> len(my_tuple)
4

然而,元组和列表之间有一个非常重要的区别:元组是不可变的,而列表是可变的。

可变性是一个复杂的主题,值得单独写一篇文章,但是基本思想如下:如果一个对象的值在定义了之后能够改变,那么这个对象就是可变的。更简单地说,您可以更改可变对象内部的值,但不能更改不可变对象内部的值。下面是一个使用列表和元组的具体例子:

>>> my_lst = [1, 2, 3, 4, 5]>>> my_tuple = (1, 2, 3, 4, 5)>>> my_lst[2] = 77>>> my_lst
[1, 2, 77, 4, 5]>>> my_tuple[2] = 77
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

正如您所看到的,试图在事后更改元组会让 Python 不高兴,因此它会向您显示一个错误。

元组为什么有用?

那么,你究竟为什么要使用元组呢?毕竟,它只是看起来像一个有更多限制的列表,所以坚持使用列表并就此收工不是更好吗?

这可能很诱人,但是元组比列表有一个巨大的优势——这个优势在某些应用程序中可以产生很大的不同。如果你读了我上一篇关于字典的文章,你会记得我曾简单地说过字典中的键不能是可变对象。

然而,在很多情况下,当构建字典时,您可能需要将与特定值相关联。例如,考虑这样一种情况,您正在跟踪班级中合作项目的成绩。您希望将合作伙伴收集到一个键中,而不丢失每个合作伙伴的身份信息,但是您不能使用列表,因为 Python 会抛出一个错误。对于这种情况,元组是完美的解决方案。

此外,如果您想减少 bug 并编写可维护的代码,元组也是一个不错的选择。如果你知道一个项目集合应该保持固定,那么使用一个元组可以防止一些其他的程序员来破坏那些应该保持不变的东西。如果不加检查,将可变列表留在代码中会导致问题。

我将把这个留给你:仅仅因为元组没有被充分利用并不意味着它们没有价值——许多 Python 程序员只是不明白如何正确地使用它们。现在你知道了,你可以把你的编程带到下一个层次。

下次见,伙计们!

更新 : 在这里阅读本文的第二部分!

想擅长 Python? 在这里 获得独家、免费获取我简单易懂的指南。想在介质上无限阅读故事?用我下面的推荐链接注册!

https://murtaza5152-ali.medium.com/?source=entity_driven_subscription-607fa603b7ce---------------------------------------

我叫 Murtaza Ali,是华盛顿大学研究人机交互的博士生。我喜欢写关于教育、编程、生活以及偶尔的随想。

元组里有什么?—第二部分

原文:https://towardsdatascience.com/whats-in-a-tuple-part-2-fe0582358bd1

既然您已经学习了 Python 中的元组,我将通过一个例子来展示它们为什么有用。

克里斯里德在 Unsplash 上的照片

这是我之前的文章的后续文章,什么是元组?在最初的文章中,我简单地提到了使用元组可能有用的编程环境——但没有深入细节。在本文中,我将通过一个详细、具体的例子向您展示我的意思。这个会很短很甜。

具体来说,我之前暗示过元组在使用字典时是多么有用。你可能会问,为什么要使用字典?嗯,这完全是一个独立的问题——长话短说,字典是一种数据结构,在熊猫中有一系列的用途(非常双关)。因此,如果您从事数据处理和分析,了解如何使用它们是很好的。

继续,让我回到我在上一篇文章中建议的例子。考虑以下情况:你在教一个班,期末作业——占课程成绩的大部分——是一个小组项目。当您评分时,您意识到您想要存储每个组的分数,但是您也不想丢失成员的个人信息。换句话说,您将通过其中的两个人来唯一地识别每个组。

使用字典解决上述问题的第一次尝试可能如下所示:

proj_grades = {['Aaron', 'Ella']: 'A', ['Jackie', 'Elaine']: 'B', ['Arif', 'Julie']: 'F'}# Arif and Julie have really been slacking off
# or maybe they're just not interested in your class
# that's valid.

不幸的是,这导致 Python 用下面的不愉快消息向您问候:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

换句话说,因为列表在 Python 中是可变类型,所以它们不能被散列(这是一个在表中随机放置一个键的时髦词)。这对于我们的目的来说并不重要,但是如果你好奇的话,哈希表是 Python 字典的底层数据结构。

无论如何,这带来了一点问题,因为您仍然需要存储数据。你将如何解决这个问题?元组!因为它们的功能几乎与 list 相同,除了它们不是可变的,所以它们在 Python 字典中是完全有效的键:

>>> proj_grades = {('Aaron', 'Ella'): 'A', ('Jackie', 'Elaine'): 'B', ('Arif', 'Julie'): 'A++'}
>>># Through the power of tuples, Arif and Julie are now
# acing the class.

现在您已经很好地组织了数据,您可以非常方便地将其转换为数据帧:

>>> pd.DataFrame(proj_grades, index=[0]) Aaron Jackie  Arif
   Ella Elaine Julie
0     A      B   A++

诚然,这不是 pandakind 所知的最漂亮的数据帧,但这是一个开始。重要的是,您已经以一种可读的方式收集了数据,现在可以按照您希望的方式进行清理、处理和分析。使用元组的目的是让您简洁明了地编写 Python 代码,并且仍然能够实现您的最初目标。当用 Python 编程时,这是一个你应该始终致力于体现的原则——因此我在我的文章中不断重申它。

目前就这些。下次见,伙计们!

想擅长 Python? 获取独家,免费获取我简单易懂的攻略

F 弦里有什么?

原文:https://towardsdatascience.com/whats-in-an-f-string-a435db4f477a

概述 Python 组合字符串和变量的方法,以及为什么应该使用它。

穆罕默德·拉赫马尼在 Unsplash 上的照片

这是我讨论 Python 独特特性系列的第五篇文章;一定要检查一下 lambdaslist comprehensionsdictionarytuples 上的前四个。

如果您是一个相对较新的 Python 用户,您可能遇到过需要将一些您定义的变量添加到字符串中的情况。不知道如何方便地做到这一点,您可能会得到一些不太漂亮的代码,如下所示:

>>> fruit = 'persimmon'
>>> sport = 'lacrosse'
>>> print('I eat ' + fruit + ' and I play ' + sport)
I eat persimmon and I play lacrosse.

它起作用了,但这不是一个值得一看的景象。更别说打字都是一种痛苦。幸运的是,有一个更好的方法。

到底什么是 f 弦?

照片由湄木Unsplash 拍摄

f-string 是 Python 简化的字符串格式化方法。这方面的一点背景:

  • 通常,您可以将字符串格式化视为一种构造字符串并在字符串中的指定位置插入用户定义的变量的方法(上面的代码显示了一个这样的示例)。
  • f 字符串并不是 Python 中完成这项任务的唯一方式。它还提供了带有“%”操作符和一个有用的.format()函数的 C 风格格式化,但是我在这里不详细讨论这些。我是 f 弦的拥护者,因为它们在形式和功能上是最具 Pythonic 风格的。

要定义一个 f 字符串,只需在字符串的第一个引号前加上一个f,并使用{}在字符串中的任意位置插入变量。让我们看一个例子。下面,我们定义与上面相同的字符串,但是这次使用 f 字符串:

>>> fruit = 'persimmon'
>>> sport = 'lacrosse'
>>> print(f"I eat {fruit} and play {sport}.")
I eat persimmon and play lacrosse.

有点酷,对吧?然而,他们的能力不止于此。从技术上来说,当我说 f-strings 可以将变量插入字符串时,我撒了一点谎。他们实际上可以插入整个表达式,比如函数调用:

>>> def my_func():
...     return "We are never ever getting back together."
...
>>> print(f"Taylor sings {my_func()}")
Taylor sings We are never ever getting back together.

就我个人而言,我觉得这非常方便。

f 弦为什么有用?

那么,为什么要用 f 弦呢?这个问题的答案很简单:它们简单、易读、优雅。换句话说,它们是蟒蛇。当您可以一次写出整个字符串,表达式用花括号清楚地分隔时,为什么要将一堆引号和加号挤在一起呢?这对代码编写人员和读者来说都更容易。

让我说得更具体一点。假设你正在处理熊猫的一些数据,如果你正在读这篇文章,你可能至少偶尔会这样做。但是,现实世界的数据往往是杂乱的。您的行到处都是,您的列有一半是未命名的,并且有大量的空值分布在各处。

经过一番探索,您意识到您的字符串分散在不同的列中:

 col1          col2             col3
0           This is  an example of  a broken string
1  A second example           of a     a broken one
2         I promise        this is     the last one

您不需要修复数据帧;您只需要一种快速的方法将组合字符串打印到终端中,这样您就可以分析一些东西。回车,f 弦:

>>> print(f"My combined string: {df.loc[0, 'col1']} {df.loc[0, 'col2']} {df.loc[0, 'col3']}")
My combined string: This is an example of a broken string

任务完成。

现在,我并不是说这是解决这个问题的最佳或唯一的方法。您可以通过使用.apply()函数来修复数据帧,或者提出一些其他新颖的解决方案。然而,上面举例说明了一个用例,如果您希望轻松快速地完成一项任务,它可能会有所帮助。

一般来说,我建议在两种情况下使用 f 弦:

  • 如果您只是浏览一些数据,并需要执行简单的字符串操作来收集一些信息
  • 如果您正在编写涉及格式化字符串的代码——这似乎是显而易见的,但我想强调的是,这种方法比上面提到的其他方法更具可读性和简洁。因此,你应该使用它。

一如既往,目标是让您的生活更简单,让您的代码更好。

下次见,伙计们!

想擅长 Python? 获取独家,免费获取我简单易懂的攻略 。想在介质上无限阅读故事?用我下面的推荐链接注册!

https://murtaza5152-ali.medium.com/?source=entity_driven_subscription-607fa603b7ce---------------------------------------

我叫穆尔塔扎·阿里,是华盛顿大学研究人机交互的博士生。我喜欢写关于教育、编程、生活以及偶尔的随想。

2023 年数据工程的下一步是什么?7 个预测

原文:https://towardsdatascience.com/whats-next-for-data-engineering-in-2023-7-predictions-b57e3c1bf2d3

一段时间内数据角色的搜索量。图片由蒙特卡洛提供,使用来自 ahrefs 的数据。

数据工程的未来会是怎样的?在这篇文章中,我分享了我对 2023 年及以后的一些预测。

年终预测文章是做作的,但它们是有目的的。它们帮助我们从日常琐事中解脱出来,考虑长期投资的方向。

当我们试图描绘一个正在向多个方向快速发展的行业的连贯的“大画面”时,它们也往往是一种谦逊的练习。我鼓励任何人去寻找一个需要从业者跟上时代的行业。

随着数据组织根据迫在眉睫的衰退评估并重新评估他们的优先事项,这些可能的方向具有了更多的意义,您的数据工程投资可以决定或破坏您公司保持敏捷、创新和竞争力的能力。

好消息是什么?需要是发明之母,我预测 2023 年将是帮助团队在数据操作上节省时间、收入和资源的技术的辉煌一年,这样工程师就可以专注于构建、扩展和以更少的资源做更多的事情。

以下是我对明年一些最重要趋势的预测(排名不分先后)。

预测 1:数据工程团队将在 FinOps /数据云成本优化上花费更多时间

随着越来越多的数据工作负载转移到云,我预见数据将成为公司支出的更大部分,并且将受到财务部门的更多审查。

众所周知,宏观经济环境正开始从一个快速增长和获取收入的时期转变为一个更加注重优化运营和盈利能力的时期。我们看到越来越多的财务官在与数据团队的交易中扮演越来越重要的角色,因此这种合作关系也将包括经常性成本。

数据团队将仍然需要主要通过作为其他团队效率的力量倍增器和通过数据货币化增加收入来增加业务价值,但是成本优化将成为越来越重要的第三条途径。

这是一个最佳实践仍处于萌芽状态的领域,因为数据工程团队一直专注于速度和敏捷性,以满足对他们的特殊要求。他们的大部分时间都花在编写新的查询或传输更多数据上,而不是优化繁重/恶化的查询。

数据云成本优化也符合数据仓库和 lakehouse 供应商的最大利益。是的,他们当然希望消费增加,但浪费会造成流失。他们更愿意鼓励从高级用例中增加消费,如创造客户价值的数据应用,从而增加保留率。他们短期内不会参与其中。

这就是为什么你会看到拥有成本成为讨论的一个更大的部分,正如我在最近与 Databricks 首席执行官 Ali Ghodsi 的一次会议上的谈话中所说的那样。你还会看到所有其他主要参与者——big query、RedShift、snow flake——围绕突出了最佳实践和特性

花费时间的增加可能来自额外的员工人数,这将更直接地与投资回报率挂钩,并且随着招聘受到越来越多的审查,这也更容易证明是合理的(FinOps foundation 的一项调查预测,FinOps 专门员工的平均增长为 5 到 7 人)。随着数据团队的现有成员采用更多的流程和技术来提高数据可靠性等其他领域的效率,他们的时间分配也可能会发生变化。

预测#2:数据团队角色将进一步专业化

目前,数据团队角色主要根据数据处理阶段进行划分:

  • 数据工程师通过管道输入数据,
  • 分析工程师清理干净,然后
  • 数据分析师/科学家对其进行可视化并从中收集见解。

这些角色不会消失,但我认为会根据业务价值或目标进行进一步细分:

  • 数据可靠性工程师将确保数据质量
  • 数据产品经理将推动采用和货币化
  • DataOps 工程师将专注于治理和效率
  • 数据架构师将专注于消除孤岛和长期投资

这将反映出我们的姐妹领域软件工程,其中软件工程师的头衔开始分裂成子领域,如 DevOps 工程师或站点可靠性工程师。随着职业开始成熟,变得更加复杂,这是一种自然的进化。

预测#3:数据变得更加复杂,但中央数据平台依然存在

图片由蒙特卡洛提供。

Zhamak Dehgani 最初概述的预测数据团队将继续向数据网格过渡并不一定是一个大胆的赌注。几年来,数据网格一直是数据团队中最热门的概念之一。

然而,我看到更多的数据团队在他们的旅程中设置了一个中转站,将领域嵌入式团队和卓越中心或平台团队结合起来。对于许多团队来说,这种组织原则给了他们两全其美的东西:分散团队的敏捷性和一致性,以及集中团队的一致标准。

我认为有些团队会继续他们的数据网格之旅,有些会把这个中转站变成永久的目的地。他们将采用数据网格原则,如域优先架构、自助服务,以及像对待产品一样对待数据——但他们将保留强大的中央平台和数据工程特警团队。

预测#4:大多数机器学习模型(> 51%)将成功投入生产

我相信我们会看到普通组织成功地将更多的机器学习模型部署到生产中。

如果你参加了 2022 年的任何科技大会(他们回来了!),你可能觉得我们都活在 ML 涅槃里;毕竟,成功的项目往往是有影响力和有趣的突出。但是这掩盖了一个事实,那就是大多数的 ML 项目在它们被发现之前就失败了。

2020 年 10 月, Gartner 报告称只有 53%的人工智能项目从原型阶段进入生产阶段——而且是在具有一定人工智能经验的组织中。对于仍在努力发展数据驱动文化的公司来说,这个数字可能要高得多,一些失败率估计飙升至 80%或更多。

存在许多挑战,包括:

  • 商业需求和机器学习目标之间的错位,
  • 不一般化的机器学习训练,
  • 测试和验证问题,以及
  • 部署和服务障碍。

我认为 ML 工程团队的趋势开始转变的原因是对数据质量的日益关注和使 ML 更可用的经济压力的结合(其中更易接近的界面如笔记本或数据应用如 Steamlit 起了很大作用)。

预测 5:数据契约进入早期采用阶段

一个数据协定架构的例子。图片由安德鲁·琼斯提供。

任何在 LinkedIn 上关注数据讨论的人都知道,数据合同是今年讨论最多的话题之一。原因是:它们解决了数据团队面临的最大的数据质量问题之一。

意外的模式更改是数据质量问题的主要原因。通常情况下,它们是不知情的软件工程师的结果,他们向服务推送了更新,却不知道他们正在下游的数据系统中制造混乱。

然而,值得注意的是,考虑到所有的在线聊天,数据契约仍然处于初级阶段。这一过程的先驱——像查德·桑德森安德鲁·琼斯这样的人——已经展示了它如何从概念走向实践,但他们也非常坦率地表示,在他们各自的组织中,这仍然是一项正在进行的工作。

我预测这个主题的能量和重要性将加速它在 2023 年从先驱者到早期采纳者的实现。这将为 2024 年的拐点做好准备,那时它开始跨越鸿沟成为主流最佳实践,或者开始消失。

预测 6:数据仓库和数据湖用例开始变得模糊

照片由卢卡·布拉沃Unsplash 上拍摄

回到上周,在你的数据快乐时光,你可能会说,“数据湖更适合流媒体、人工智能和更多数据科学用例,而数据仓库更适合分析用例,”而其他人则明智地点头。

在 2023 年说同样的话,你只会得到嘲笑和狂笑。

去年,数据仓库专注于流功能。雪花宣布 Snowpipe streaming 并重构了他们的 Kafka 连接器,以便当数据到达雪花时,可以立即查询,从而将延迟降低 10 倍。谷歌宣布 Pub/Sub 现在可以直接流式传输到 BigQuery 中,这使得将数据流连接到数据仓库变得前所未有的容易。

与此同时,像数据块这样的数据湖为存储的数据增加了元数据和结构。Databricks 宣布了 Unity Catalog ,这是一个使团队能够更容易地将元数据等结构添加到他们的数据资产中的功能。

新的表格式已经成为一场军备竞赛,雪花宣布 Apache Iceberg 用于流,而 Unistore 混合事务-分析处理表(HTAP)用于事务性工作负载,而 Databricks 则强调其 delta 表格式,该格式同时具有 ACID 和元数据属性。

你 2023 年快乐时光的一条更安全的线是哀叹你的商业利益相关者的期望——这是永远不会过时的经典。

预测#7:团队更快地解决数据异常

图片由蒙特卡洛提供。

Wakefield research 在 2022 年对 300 多名数据专业人士进行的调查显示,受访者平均花费 40%的工作日在数据质量上。那太多了。

数据停机时间是一个简单的等式:事件数量 x(平均检测时间+平均解决时间)。Wakefield 的调查还显示,组织平均每月经历 61 起事件,平均需要 4 个小时来检测事件,另外 9 个小时来解决事件。

在今年与数百名数据领导者的交谈中,我观察到许多人通过从静态硬编码数据测试转移到基于机器学习的数据监控,缩短了检测时间。

这很令人兴奋,因为自动根本原因分析有可能带来新的创新。分段分析、查询变化检测、、数据传承等特性有助于将“数据为何出错”的可能性从无限缩小到极少数,无论问题是与系统、代码还是数据本身有关。

2023 年:大数据变得更小、更易管理的一年

当我们结束 2022 年时,我会将数据工程描述为处于一个独特的时刻,在这个时刻,存储和计算限制在很大程度上被消除了-大数据可以像它想要的那样大。钟摆会像往常一样再次摆动,但不太可能在明年。

因此,明年最热门的趋势将不再是优化或扩展基础设施,而是让这个扩大的世界变得更有组织、更可靠、更易访问的过程。

我可能错了,但我在记录上。 连接 让我知道你对来年的想法和预测。

专家数据科学家的下一步是什么?

原文:https://towardsdatascience.com/whats-next-for-expert-data-scientists-1772060b51ff

意见

当你达到中级/高级阶段时,建议你把技能带到哪里

开始的结束。作者图片

我写这篇文章的部分原因是为了记录我的冒险和最近的挑战。我是一名高级数据科学家,从事过从因果推理到传统 ML 再到深度学习的全套 DS/ML 解决方案。我一直沉迷于自己的工作,以至于到目前为止,我花了很大一部分时间来掌握数据科学本身(统计、线性代数、Python 等)。).

这些工具的应用对我来说总是有点次要的,因为我专注于成为工具本身的真正专家。经过许多漫长的日子和无数个小时后,我发现自己在高度自信地表演我的手艺,正如我所渴望的那样。我在寻找下一座要攀登的山,这很大程度上感觉就像坐在那里,手里拿着所有的工具,寻找要解决的问题。

这个故事将探索这种感觉,确定我打算做什么,并提供共同成长。

漫无目的的建筑大师的感觉

今天人们有很多方法可以找到数据科学和 ML。我非常着迷于那些专门研究完全处于左领域的领域的人,如土木工程,然后过渡到数据科学以扩大他们的工作。就我个人而言,我几乎是从零开始的,只研究数据科学。

我并不真的来自一个我在应用数据科学方法方面有丰富专业知识的领域。我有兴趣,但没有什么是我密切相关的。我在数据科学和机器学习领域发现了很多奇迹,所以到目前为止我花了很多时间广泛地学习人工智能、因果推理、MLOps 等的复杂性。在完成了应用数据科学的硕士学位并作为一名高级数据科学家工作了一段时间后,我想知道我的“下一座山”是什么样子的。我应该深入研究统计学,成为一名统计学大师吗?我应该成为更多的软件工程师,并学习如何以最高的能力编程吗?或者将重点转移到产品领域来构建数据产品?我正在评估前方的一些山脉,它们听起来都同样诱人。

这种感觉很像非常了解我的工具,并且在给定的时刻非常熟练地使用任意数量的工具,但是却在寻找正确的问题来解决。如果我说实话的话,会有点不舒服。我的本能是参加在线课程或学位,给自己成就感,但我不相信这真的能解决我正在寻找的目标。对我来说,我不得不做出结论,我正在寻找合适的利基领域来应用数据技能来解决具有挑战性的全球问题。找到那个我可以称之为自己的利基领域是很困难的。

我职业生涯的大部分时间都是在这种不确定性中度过的,所以我感觉就像在家一样试图把这个难题拼凑起来。如果你在阅读这篇文章时也有类似的困扰,知道你并不孤单。

公司路线

如果你把这个思考过程带给你的老板,你通常会被建议两条路线:技术个人贡献者路线和商业管理路线。

个人贡献者路线将要求你更深入地探究工具的优点。根据你的专业,成为 Python 或统计严谨性或分析速度的大师是这条道路上真正需要的。Cassie Kozyrkov 有一篇惊人的文章从分析师的角度对此进行了更多的讨论。这将引导你成为团队领导或主要角色。

管理路线将要求你深入了解公司的业务和/或管理人员和团队。成为沟通、数据产品管理和领导团队的大师通常是这条道路上所需要的。关于如何成为一名有效的领导者,有无数的书籍和课程,但作为一名数据领导者,你肯定是当今世界的异类(尤其是如果你渴望成为一名优秀的领导者)。在管理团队和监督技术组件的同时,将业务需求和愿望转化为成功的数据项目并不是一件容易的事情。现在真的没有多少[有用的]蓝图显示如何成为有效的数据领导者,这增加了这条路线的难度。

真正的独角兽也有可能两者兼而有之。这很难,但如果你有很高的情商和人际交往能力,然后选择专攻你的技能,那么它会自然地把你放在这两个领域之间。这种混合动力车的挑战是确保你仍然有一些平衡,而不是耗尽。

以上建议的任何一条路线都没有问题,如果你已经处于高级/领导级别,你可能会不顾一切地遵循其中一条。话虽如此,我想再提出两条我认为经常被忽视但对专业数据科学家来说至关重要的路线。

激情路线

我所知道的大多数[最好的]数据科学家都是带着对这一行业的强烈热情进入这一职业的。这种热情促使他们长时间熬夜学习以掌握这门手艺。当我们在学习严谨性方面的努力达到相对顶点时,现实是,对大多数人来说,利用时间的最佳方式不是阅读另一篇研究论文来保持这门技术的前沿。我们认为掌握更多的数学公式或算法将会产生与我们职业生涯开始时一样的影响,但事实上,我们现在正在玩一场不同的游戏。

作为初学者,必须掌握足够的基础知识,才能在自己的领域出类拔萃。作为专家,你想在你的技术应用方面出类拔萃,这就需要专攻某个应用领域。对于大多数中级/专家数据科学家来说,成为他们深切关注(或可以进化到关注)的领域的大师更有用。你是某种艺术家吗?你有兴趣帮助对抗气候变化吗?你希望在金融领域走得更深或更广吗?专业化对你来说很重要,但是选择专攻一个应用领域将会比学习刚刚发布的最新算法获得更大的回报。作为一个警告,我觉得这并不适用于博士候选人。他们可以是专业的数据科学家,在许多情况下,他们需要成为领域和工具专家。虽然它们的应用范围通常不会影响业务需求,但它仍然停留在研究的角度。

除了掌握特定的应用途径之外,对于中级和专家数据科学家来说,内容创建正变得越来越现实。数字创作者或教师是保持你技能敏锐的好方法,同时也能在你周围建立一个社区。随着像 Medium、YouTube 和 Twitter 这样的网站开始面向数据创建者,你可以从很少的开销开始。这并不容易,因为有很多人在尝试。成功地做到这一点需要毅力和质量,这需要你花费大量的时间和精力。如果你喜欢拓展自己的技能并与他人联系,那么我认为至少尝试一下会是一次非常有价值的经历。

和企业路线一样,我相信你也可以走这两条激情路线。它们可能会占用你大量的时间,但这些路线中的任何一条都已经很容易做到了。这些并不意味着比迄今为止大多数专家已经完成的攀登更“容易”。事实上,与公司路线相反,我认为两者都做实际上会让你在热情的人的每条路线上都更成功。如果您选择了一个您想要致力于的利基应用领域,并开始围绕它构建数据内容,您将成为一个更有效的实践者,因为您将吸引该社区中的相似个人,同时也能真正快速地深入下去。

我的建议:选择充满激情的路线

专家数据科学家之所以是专家,不是因为他们有很高的数学技能,而是因为他们有毅力。这种勇气来自于一种需要适当对待的激情,否则它会很容易消失。企业路线将是大多数人被迫选择的路线,而激情路线更多的是选择而非必需品。即便如此,我还是强烈建议你选择其中一个或者两个选项。我保证这是让你的激情燃烧得比以往任何时候都更明亮的最佳方式,更重要的是,这是社区所需要的。我们不需要另一个“在 6 个月内成为数据科学家!”当然——我们需要真实的人类分享他们的弱点,并公开展示他们的勇气和激情。这种为你关心的领域解决问题的展示是我们应该如何欢迎人们进入这个领域——学习编程和数学来解决你关心的问题和世界需要解决的问题。

在我自己的旅程中,我最近打了一个类似的电话。我开始写作还不到一年,并且一直在寻找我想深入研究的应用专业。花了一段时间来缩小范围,但最终环境和可持续发展空间一直在召唤我。我之前没有在这个领域接受过培训,所以我一直在自学,阅读专家的资料,并致力于一个自我指导的项目来进一步发展。随着这一过程的不断发展,我将开始记录和书写我的旅程,但这是自从我开始学习人工智能以来,我职业生涯中最兴奋的一次。如果有其他气候科学家正在寻求合作、分享知识或一起从事一个项目,请联系我们!很乐意收到你的来信。

对于和我处境相似的人来说,玛丽亚·莱斯的这个故事正是我跳入气候变化领域所需要的。请继续关注我的气候科学项目和思考的未来故事!

数据科学最好的语言是什么?

原文:https://towardsdatascience.com/whats-the-best-language-for-data-science-1e6d09b6df88

意见

这个问题的答案比你想象的更加微妙

Artturi Jalli 在 Unsplash 上拍摄的照片

更新——特别感谢吉本浩纪将本文翻译成日语。查看 这里

在最近的一次小组讨论中,我发现数据科学家在争论哪个机器学习框架更好:PyTorch 和 TensorFlow。我觉得好笑的是,这种争论的其他版本我之前已经听过无数次了。Python 还是 R?MATLAB 还是 Mathematica?Windows 还是 Linux?随着这些年来我学习了越来越多的编程语言,我发现问题不应该是哪种语言或框架是最好的,而是哪种语言或框架最适合手头的任务。

那么,创建机器学习原型的最佳语言是什么呢?如果你问五个数据科学家这个问题,你可能会得到五个不同的答案。要回答这个问题,你应该想一想你最习惯用哪种语言,以及该语言有哪些库和模型,这样你就可以尽快创建一个机器学习原型。

作为符号的编程语言与技术

我们通常将编程语言视为一种技术形式。编程语言都完成相同的开发机器代码的高级任务,因此可以被认为是等价的技术形式。然而,即使它们完成相同的任务,一种语言可能执行任务更快,或者甚至允许您完成另一种语言不能完成的其他更复杂的任务。当被视为一种技术形式时,语言在逻辑上是等价的。然而,从符号的角度来看,对于手头的任务,一种语言可能比另一种语言更好。

数学中的一个类比是计算函数导数的概念。为了完成这项任务,数学家需要使用一种形式的符号(图 1)。

图 1:微积分中用于计算导数的两种符号。左边的符号是由李布尼兹发明的,右边的符号是由艾萨克·牛顿爵士发明的。当被认为是一种技术时,这些在逻辑上是相等的。图片作者。

在图 1 的右边,我们有艾萨克·牛顿爵士开发的点符号。大约在同一时间,Gottfried Wilhelm Liebniz 左边的符号得到了发展。如果我们把这些符号看作技术,它们在逻辑上是相等的,因为它们都允许我们计算函数的导数。

然而,当我们把它们看作符号时,这两者并不一定相等。一种符号可能更适合某项任务。例如,Liebniz 的符号使得通过分离变量、分部积分和其他方法求解微分方程比牛顿的符号更直观。因此,我们可能会认为 Liebniz 的符号在求解微分方程时比牛顿的符号更强大(图 2)。

图 2:作为符号形式的导数是不等价的。Liebniz 的符号是一种优越的符号形式,它使得通过分离变量、分部积分和其他方法求解微分方程更加直观。因此,这是一个更强大的符号。图片作者。

如果两种不同形式的数学符号的有用性有不同程度的关联,那么编程语言也有不同程度的关联吗?绝对的!

优化创建初始原型所需的时间

在每一次关于哪种编程语言是最好的争论中,语言的计算性能似乎总是被提出来。举个例子【Peter Xie 的这篇文章显示 Python 比 C 慢 45000 倍,C 比 Python 快就意味着它是更好的语言吗?不一定。虽然我可以拿出一些技巧来加速我的 Python 代码,但我认为人们忽略了真正重要的一点。开发人员和数据科学家的时间远比机器时间昂贵。

人们经常在第一次或第二次迭代中试图让他们的代码得到完美的优化。我认为,人们不应该优化机器时间,而应该优化他们为概念证明编写代码和最初向客户交付价值所花费的时间。

卢卡斯·布拉塞克Unsplash 上拍摄

虽然 Python 的计算速度可能比 C 慢,但与 C 相比,我用 Python 创建机器学习模型所需的代码行更少,最终花费的时间也更少。在进行原型开发时,动态类型与静态类型之类的小事情会在速度上产生真正的差异。但这并不一定意味着 Python 是这项工作的正确语言,因为数据科学家使用的许多标准语言都有类似的功能和抽象。实际上,它似乎更多地归结于库,而不是核心语言。

如果你像我一样,你可能正在做大量的自然语言处理工作。我的经验是 Python 拥有最强大的 NLP 库。scikit-learn、NLTK、spaCy、gensim、textacy 等库允许数据科学家对文本数据进行快速清理、预处理、提取特征和建模。但是如果我想做数据分析或时间序列分析,我发现 R 中可用的包更强大。然而,如果我需要使用更复杂的时间序列方法,如递归神经网络,我经常会发现自己又回到了 Python,因为它的库非常适合深度学习。

当你开始使用深度学习等复杂的机器学习架构时,通常训练你的模型所需的时间会迅速增加。但是,随着计算能力的不断提高,培训时间越来越不成问题。事实上,我认为我们正在创造更复杂的机器学习,这在很大程度上是因为如此多的计算能力已经变得可用,并且组织正在竞相使用它的每一点。

最后,在为您的项目选择语言或库时,我建议选择一种能够优化您创建初始原型的时间的语言或库。当有人学习用一种语言编码时,他们实际上开始用那种语言思考。我自己也发现了这一点。我现在主要用 Python 编程,当我决定如何解决一个问题时,我会考虑如何用 Python 解决它。回顾我的职业生涯,当我学习新的语言时,我意识到,如果当时我使用的是一种语言,我会用完全不同的方式思考如何解决这个问题。

马库斯·温克勒Unsplash 上拍摄

影响原型制作速度的因素

影响原型开发速度的一个主要因素是构建模型架构所花费的时间。我通常倾向于 scikit 这样的库——学习构建模型架构。我根本不需要做太多的工作来构建一个模型架构,它允许我快速地构建一个初始模型。我通常从最简单的模型开始,然后逐步增加模型的复杂性。只有在我完成了简单的模型之后,我才会开始构建更复杂的深度学习模型。在这一点上,我仍然在寻找能够使用 Keras 和 Tensorflow 等工具尽可能快地构建模型架构的抽象。

影响原型制作速度的另一个因素是训练初始模型所需的数据量。通常我们可以从一个不需要太多数据的简单模型开始。但是有时候简单的模型并不能满足我们的精度要求,所以我们需要使用更复杂的模型,这通常需要更多的数据。当可能需要一个月的时间来获取/创建更多的数据时,这最终会降低原型开发的速度。

为了加快获取/创建更多数据的过程,您可以尝试使用迁移学习技术或预训练模型。虽然您可能能够使用这些技术或模型更快地构建原型,但是您也可能将一些严重的伦理问题引入到您的原型中。

快速原型制作时的伦理问题

作为一名数据科学家,我们有责任确保我们的模型不会产生针对受保护类别的有偏见的结果。亚马逊经历了惨痛的教训。如果您使用的是预先训练的模型,您可能无法访问该模型所训练的数据集。即使您有它被训练的数据,您可能也不知道这些数据是如何被清理、预处理或采样用于训练和测试的。这些步骤中的每一步都可能无法消除数据集中的继承偏差。更糟糕的是,它可能会在数据集中引入甚至放大偏差。我只能说我自己,但我不相信我能在迁移学习过程中消除预训练模型中的偏见。因此,我对这种方法的使用非常谨慎,但当我确信与业务用例相关的风险有限时,我会让像拥抱脸这样的网站决定我使用哪个库。

在这种情况下,机器学习模型的力量实际上正在取代库的力量或指示我使用什么的语言。因此,我经常发现自己在 PyTorch 中从事更前沿的数据科学工作,但这涉及到使用迁移学习或直接使用另一个组织构建的模型,而没有任何迁移学习。

结论

最终,经常发生的语言、库和模型之争被误导了。没有一种编程语言最适合数据科学。最好的编程语言是允许你最快地构建原型并向你的客户和/或最终用户交付价值的语言。

在构建原型时,不要马上优化你的代码。相反,优化数据科学家的速度。一旦您成功地证明了您的模型将解决手头的问题,您就可以使用一个分析器来帮助确定代码中的瓶颈在哪里。这允许您优化机器时间,但是在编写代码之前,您无法分析代码。不要本末倒置!确定您试图解决的问题类型,并选择将帮助您最快构建的最佳工具集。

参考

  1. https://Peter-jp-Xie . medium . com/how-slow-is-python-comparated-to-c-3795071 ce 82 a #:~:text = It % 20 is % 20450% 2000 万%20loops,mode % 20 for % 20a % 20 better % 20 performance。&text = Yes % 2C % 20it % 20 is % 20 难以置信!,比 Python 快 45% 2c 000% 20 倍% 20% 20% 20
  2. https://skl.sh/3dq3Iz0
  3. https://www . Reuters . com/article/us-Amazon-com-jobs-automation-insight/Amazon-scraps-secret-ai-recruiting-tool-that-show-bias-against-women-iduscn1 MK 08g

公制设计最难的部分是什么?

原文:https://towardsdatascience.com/whats-the-hardest-part-of-metric-design-de2919bbf2dd

面向数据科学家和商业领袖的指标设计

在关于度量的这个系列的前一期中,我们讨论了度量设计的重要性,并提出了与社会科学家合作的论点,尽管度量设计的核心责任最终在于决策者和领导者,而不是团队的常驻数学书呆子。

照片由安德烈·亨特Unsplash 上拍摄

我们还发现,理论上,创建指标的过程相当简单:

你只需确定你的 决策 需要哪些 信息,然后你想出一个 总结 信息的方法,使 对你的需求有意义【ta-da】对吧?对,但是…

好的度量设计不是简单地随意记下一些公式。

最难的部分

上面的总结没有错,但是它让公制设计听起来比实际上容易得多。有一个艰难的部分。好的度量标准设计不是简单地记下任何符合你想象的公式。这里的终极技能是解决一个千年老问题,这个问题在你小时候就被警告过。

图片来源: Pixabay

还记得那个关于神灯和精灵的睡前故事吗?还是那个关于迈达斯的?还是那个渔夫和他的妻子?无论你的文化是什么,它可能都有一个“小心你对的期望”的故事。而 那个 对于决策领导者来说是最难的部分的精华。

公制设计最难的部分?“小心你的愿望。”

为了想出一个好的度量和决策标准,你需要彻底地检查它,以确保你的决策标准不会导致你做出错误的决策。换句话说,你需要做好计划,就好像你在和一个邪恶的精灵斗智斗勇。

如今,精通代码的领导者至少会做一点点模拟来模拟他们的度量如何对各种混合输入做出反应,尤其是在数据分布的极端情况下,以确保他们真正希望的是他们真正想要的。如果这听起来像是一堆你完全不熟悉和/或你不擅长模拟的技术术语,你会希望与擅长模拟的人合作。编写代码在这里是容易的部分,所以你可以雇佣几乎任何一个新手来帮你,因为你将做最难的部分。即使你在技术上得到帮助,决策者的任务仍然是棘手的:决策者需要仔细考虑问题的复杂现实,并提出值得模拟的场景。

在设计度量标准时,如果没有量化理解、决策技巧和领域知识之间的结合,你成为数据驱动的决策者的尝试是不可靠的。

如果你没有做好你的功课去思考你的度量标准,你就是在给神奇的数据灯找麻烦。

整个努力取决于决策标准(进行预先计划的默认行为和切换到替代行为之间的界限),准确反映两种现实之间的界限:一种现实是你总是想做默认行为,另一种现实是你总是不想做。(有一些决策智能的基本原理被压缩到这一段中。我写它们的时候很调皮,好像你已经和它们相处得很好了——以防万一,我推荐你读读这个。)

如果你没有做好你的功课去思考你的度量标准,你就是在给神奇的数据灯找麻烦。不幸的是,在数据科学人群中,度量设计得到的关注比数据和统计方法少得多。太多的专业人士表现得好像他们期望度量设计是其他人的工作,这通常意味着它最终不是任何人的工作。然后,企业领导人说出一些考虑不周的愿望,没有人停下来思考,然后整个团队又回到了把数据和数学扔向错误问题的可怕的旋转木马上。

照片由吉列尔莫·迪亚斯Unsplash 上拍摄

太多的专业人士表现得好像他们期望度量设计是其他人的工作,这通常意味着它最终不是任何人的工作。

作为一个领导者,你解决这个问题的方法是自己学习度量设计或者雇佣一些决策科学人才来帮助你。除非你的团队具备这些技能,否则你很难做出好的数据驱动的决策。

感谢阅读!人工智能课程怎么样?

如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:

在这里欣赏课程播放列表,它被分成 120 个单独的一口大小的课程视频:bit.ly/machinefriend

https://kozyrkov.medium.com/membership

喜欢作者?与凯西·科兹尔科夫联系

让我们做朋友吧!你可以在 TwitterYouTubeSubstackLinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格联系。

寻找动手 ML/AI 教程?

以下是我最喜欢的 10 分钟演练:

Python 中单下划线和双下划线是什么意思?

原文:https://towardsdatascience.com/whats-the-meaning-of-single-and-double-underscores-in-python-3d27d57d6bd1

我从来没有注意过这些特殊的字符,直到我知道它们是什么意思

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

你有没有好奇过单双下划线在 Python 中给变量和函数命名时的不同含义?

我最近研究了这个主题来温习一些基础知识,并决定把它写下来,因为我确信有一天我会再次需要它。

这篇文章对下划线的不同用法进行了分类。它将涵盖:

  1. 单前导下划线: **_foo**
  2. 单尾随下划线:
  3. 单下划线: **_**
  4. 前后双下划线(用于定义 dunder 方法 ): **__bar__**
  5. 双前导下划线: **__bar**

了解每种语法的含义以及何时应该使用将有助于你在可读性和效率方面提高代码质量。

这也有助于你符合标准的命名惯例。

事不宜迟,让我们来看一些实际的例子🔍

新到中?你可以每月订阅 5 美元,解锁我写的不限数量的关于编程、MLOps 和系统设计的文章,以帮助数据科学家(或 ML 工程师)编写更好的代码。

https://medium.com/membership/@ahmedbesbes

1 —单前导下划线:_foo

变量、函数或方法名前面的单个前导下划线表示这些对象在内部使用。

这对程序员来说更多的是一种语法提示,而不是由 Python 解释器强制执行的,这意味着这些对象仍然可以从另一个脚本以一种方式访问。

但是,有一种情况,带有前导下划线的变量不能被访问。

考虑下面的文件module.py,它定义了两个变量。

如果您从解释器或其他地方使用通配符导入(尽管这是强烈不推荐的),您会注意到带有前导下划线的变量在名称空间中不可用。

但是,正如我们前面所说,如果导入模块并直接调用变量名,**_private_variable**仍然可以被访问。

单前导下划线一般在类中用来定义 【内部】 属性。我用双引号将内部括起来,因为 Python 中没有内部属性这种东西。前导下划线仍然是一个符号,应该如此对待。

如果您有一些不打算从类外部访问的属性,仅仅因为它们只在内部用于中间计算,您可以考虑给它们添加一个前导下划线,这将作为对您和您的 ide 的一个提示。

让我们来看一个例子:考虑一个定义了一个_ residency属性的 Employee 类,这个属性是计算薪酬包所需要的。

如您所见,_seniority属性可以从类的外部访问。

2 —单尾随下划线:foo_

有些情况下你想使用的变量名实际上是 Python 中的保留关键字比如classdeftypeobject等。

为了避免这种冲突,您可以添加一个尾部下划线作为命名约定。

**class_ = "A"**

3 —单下划线:_

在某些情况下,您会看到 python 开发人员使用单下划线。

简而言之就是这些。

→定义临时或未使用的变量。

例#1 如果不使用 for-loop 的运行索引,可以很容易地用单下划线代替。

如果你的函数返回一个五个元素的元组,但是你只需要使用其中的两个(比如第一个和第四个),你可以用下划线来命名剩下的三个。

→python 交互式解释器中最后一次评估的结果存储在“_”中。

→用作数字分组的可视分隔符

根据 PEP 515 ,下划线现在可以添加到数字文字中,以提高长数字的可读性。

这里有一个例子,你可以把十进制数按千分组。

4 —双前导和尾随下划线:foo

双前导和尾随下划线用于定义特殊的通用类方法,称为 dunder methods (在 score methods 下Ddouble的简称)。

Dunder 方法是保留的方法,您仍然可以覆盖它们。它们有特殊的行为,称呼也不一样。例如:

  • **__init__**被用作类的构造函数
  • **__call__**用于使对象可调用
  • **__str__**用于定义当我们将对象传递给print函数时,屏幕上打印的内容。

正如您所看到的,Python 引入了这个命名约定来区分模块的核心方法和用户定义的方法。

如果你想了解更多关于 dunder 方法的知识,你可以查看这个链接

5 —双前导下划线:_ _ 条

双前导下划线通常用于名称混淆。

名称管理是解释器改变属性名称的过程,以避免子类中的命名冲突。

让我们看下面的类来说明:

现在让我们通过使用内置的dir方法来检查car对象的属性。

我们注意到color_speed可用,而__brand不可用。

然而,这里有一个**_Car__brand**属性。这就是名称管理:解释器在属性前面加上一个“_”和类名。这样做是为了避免__brand属性的值在子类中被覆盖。

让我们创建一个子类,并尝试覆盖前面的属性:

现在让我们检查一下extended_car对象的属性:

正如我们所看到的,添加了一个新属性:_ExtendedCar_brand,而来自父类的_Car_brand仍然存在。

如果我们尝试访问这两个属性:

我们注意到__brand属性的值(来自父类)没有被覆盖,尽管ExtendedCar类的定义建议这样做。

资源:

我从来不知道单下划线和双下划线在许多不同的上下文中会有同样多的含义。

学习它们很有趣,一如既往,这里是我的资源列表,你可以更深入地了解这个主题。

感谢阅读🙏

同样,如果您已经做到了这一步,我要感谢您的宝贵时间,并希望您已经了解了 Python 编程语言非常特殊的方面的一些有用的东西。

如果你有兴趣学习更多关于 Python 技巧的知识,可以看看我以前的文章,或者至少是上一篇。

今天就这些了。下次见!👋

新到中?您可以每月订阅 5 美元,并解锁各种主题的无限文章(技术、设计、创业……)您可以通过点击我的推荐 链接 来支持我

https://ahmedbesbes.medium.com/membership

照片由卡斯滕·怀恩吉尔特Unsplash 上拍摄

你的数据科学职业生涯的下一步是什么?

原文:https://towardsdatascience.com/whats-the-next-step-in-your-data-science-career-1249a11e313f

在过去的几年里,不确定性太多了——从停工和裁员到全球不稳定和通货膨胀——职业道路的概念可能会觉得古怪。在如此多的不断变化中,我们如何计划我们的下一年,更不用说下一个十年了?

即使您的数据科学之旅仍然是一项模糊的进展中的工作,我们也始终建议倾听他人分享他们自己的成功、奋斗和顿悟。本周,我们将展示几篇杰出的帖子,作者在这些帖子中反思了他们的数据科学职业生涯,并充实了他们在这一过程中所学到的经验教训。

泰勒·希里在 Unsplash 上拍摄的照片

  • 想做大改变怎么办? 一个多才多艺的数据 pro 可以过渡成很多角色。但是,如果您的起点完全在这个领域之外,那么通往数据科学的道路将会更加曲折。在销售和商业战略领域工作了近十年后,露西·罗斯韦尔(Lucy Rothwell)迈出了这一大步——现在她能够就这一过程提供一些有益的观察。
  • 步入管理岗位的实务方面 。正如泰莎谢(Tessa Xie)所指出的,有很多关于找工作的指南,但对于那些想离开个人贡献者角色成为经理的人来说,资源却很少。因此,泰莎写了一本——里面充满了务实的、基于经验的想法,围绕着交流、指导等等。

你一路过关斩将,这意味着你至少应该得到一些奖金!暂时离开职业和工作话题,尝试一下这些。

我们感谢您本周与我们共度的时光,以及您为我们的作者提供的所有支持。另一种给你喜欢的作者以鼓励的方式,考虑成为一个中等会员

直到下一个变量,

TDS 编辑

蛋白质结构预测的 ML 上的 AlphaFold 之后是什么?CAMEO 和下一个 CASP 的自动滚动评估

原文:https://towardsdatascience.com/whats-up-after-alphafold-on-ml-for-structural-biology-7bb9758925b8

人工智能驱动的生物学革命会持续下去吗?我们能期待新的突破吗?蛋白质结构预测领域目前正在发生什么?

如果你对客串的滚动评价特别感兴趣,了解蛋白质结构预测的现状, 点击这里

如果你想了解即将到来的 CASP15,AlphaFold 如何改变它的重点,以及它的新挑战, 点击这里

介绍

AlphaFold 2 是由谷歌 Deepmind 开发的基于人工智能的程序,旨在解决预测蛋白质结构的问题,它在 2020 年末取得了成功,当时它“赢得了”第 14 届两年一次的蛋白质结构预测“竞赛”,该竞赛名为 CASP(结构预测的关键评估)。半年后,Deepmind 在《自然》杂志上发表了一篇经过同行评审的文章,描述了 AlphaFold 2 的工作原理,并在 GitHub 上公开发布了它的代码,作为人人都可以使用的 Google Colab 笔记本。随着科学家们开发出更好的笔记本,以及他们发现 AlphaFold 拥有的许多应用程序,甚至超过了它的最初目标,宣传越来越多。当 Deepmind 发布新版本的 AlphaFold 时,这种炒作变得更加严重,该版本更适合对多个蛋白质相互作用时产生的复合物进行建模。然后当 Deepmind 与欧洲生物信息学研究所联手发布所有已知蛋白质的 3D 模型数据库时。甚至更进一步,当科学家破解 AlphaFold 以反向使用它,从而设计出可以根据需要折叠以实现特定功能的蛋白质时。可能比我想的还要多。

这里有几篇文章,我在其中介绍了 AlphaFold 2、可用于运行它的笔记本,以及它在生物学研究中开辟的许多积极的道路:

现在,怎么了?

在 2020 年末和 2021 年年中,对 AlphaFold 的兴趣出现了非常强烈的峰值,第二个峰值甚至在几个月后也没有下降到 0。相反,我们可以看到一个稳定的基线,可能由许多仍在研究 AlphaFold 以及如何将其应用于问题的生物学家维持:

对从 Google Trends 检索到的关键字“AlphaFold”的兴趣。作者卢西亚诺·阿布利亚塔拍摄的这张照片和其他照片。

但是……

兴趣会不会出现新的高峰,体现新的突破?

目前在结构预测领域进展如何?

蛋白质结构预测的新一轮竞赛

关于第一个问题,我认为我们可以期待一个新的峰值兴趣,尽管不一定是突破,因为新的常设问题的复杂性更高,也因为蛋白质数据库中可供人工智能方法利用的数据更少。但是,让我们看看第 15 章是怎么说的!

CASP 刚刚宣布了它的下一版,第 15 版,因此接近 30 年的蛋白质结构预测评估(CASP1 自 1994 年以来不间断地每两年进行一次)。在最新一轮的 CASP14 中,来自世界各地的近 100 个团体提交了 84 个建模目标的 67,000 多个模型。与每个 CASP 一样,独立的评估人员将模型与实验确定的各种结构进行比较,其中确定硬靶的三级结构(即没有太多来自类似蛋白质的结构信息)是最重要的一个。(或者我们应该说“曾经”,因为 AlphaFold 2 解决了这个问题?)虽然你可以在我以前的文章中了解更多关于 CASP14 和 AlphaFold 2 的信息(当 AlphaFold 出现时,我是 CASP12 和 CASP13 的评估员,所以我知道所有这些第一手资料!),我想在这里强调一下 CASP 主办方对 CASP15 的期待。

正如我刚才暗示的那样,焦点很可能会转移到四级结构的预测上,即多个蛋白质在相互作用时如何在 3D 空间折叠在一起。CASP 的官方网站(https://predictioncenter.org/casp15/index.cgi)明确表示,CASP 的核心保持不变:对实验结构进行独立评估的方法进行盲测,以建立蛋白质和蛋白质复合物建模的最先进技术。但更详细地说,该网站还揭示了评估轨道的一些变化。

首先,三级结构预测将不再被分为容易和困难的目标,这是有意义的,因为突然之间所有的三级结构预测都变得相对容易了。不仅是因为 AlphaFold,还因为其他新工具开发了类似 AlphaFold 的方法和其他新方法,例如来自经典 CASP 领导者之一的 RoseTTAFold。

相比之下,CASP15 将强调模型的细粒度准确性,并将密切关注四级结构的预测,即由多个蛋白质一起形成的复合物的预测。虽然α折叠多聚体大大改善了这一点,但这还不如三级结构预测可靠。我们还将更加重视准确性评估,这是我们在 CASP13 评估中预期的 AlphaFold 预测的一个关键特征。

CASP15 会去掉一些不再有太大意义的类别。但它将保持对蛋白质复合物的准确性估计,其中预测者必须对由他人建模的蛋白质-蛋白质复合物模型进行排序。

由于三级结构预测已经确定,四级结构预测也取得了很大进展,CASP15 首次计划用 3 个有趣的案例进行实验,这些案例构成了预测结构生物学的下一个前沿:与 RNA 专家合作,评估 RNA 分子和蛋白质-RNA 复合物的建模;模拟蛋白质和小分子之间的复合物,这是制药的核心,因为大多数临床相关分子通过与蛋白质结合来发挥作用;预测构象集合,即解释蛋白质如何在溶液中运动的多个模型,这一点至关重要,因为迄今为止 CASP 一直专注于蛋白质的静态快照,但实际上是非常动态的。

自从 CASP14 和 AlphaFold 之后发生了什么?来自 CAMEO 的见解,蛋白质结构预测的滚动评估

虽然远不如 CASP 受欢迎,但这也是一个非常有趣的比赛。这是自动发生的,所以没有太多的专家指导和分析。但是它总是向所有人开放,让大家探索蛋白质结构预测方法的最新信息。

名字叫 CAMEO,代表连续自动化模型评估。你可以访问它的主页:

CAMEO 是一个社区项目,由瑞士 T2 生物信息研究所的计算结构生物学小组和巴塞尔大学的 T4 生物中心共同支持,由这些机构和欧盟资助。CAMEO 不断将由蛋白质结构预测社区建立的质量评估标准应用于由一组列出的服务器产生的 3D 模型。它提供各种分数,评估预测的不同方面,如查询序列的覆盖范围、局部准确性、完整性等。

到目前为止,大多数参与 CASP 的团体也将他们的服务器绑定到 CAMEO。此外,CAMEO 为所有目标产生天真的 AlphaFold 2 预测。你猜对了,它几乎总是在顶部!甚至在它的代码和论文正式发布近 1 年后的今天,这意味着即使是在它之后开发的方法也无法通过它。虽然你可能会认为这是因为预测的准确性实际上是有限的,AlphaFold 已经尽可能好了,但 CAMEO 的数据显示,事实上许多工具,甚至是新工具,都没有达到它的水平。

您可以在带有交互式图表的专用页面上亲自查看评估数据,在该页面上,您可以选择查看所有服务器或特定服务器在不同时间段内的简单、困难或中等目标的结果。以下是截至 2022 年 4 月 16 日的过去 3 个月中所有团队的硬性目标:

所有服务器的硬目标建模的最后 3 个月。直达链接截止 2022 年 4 月 16 日:https://www.cameo3d.org/modeling/3-months/difficulty/hard/?to_date=2022-04-16

如右图所示,3 个月的分析包括 9 个硬性目标。左边的图描绘了每个组提交的所有模型的平均 LDDT 与他们实际提交模型的目标的比例。

现在让我放大并添加一些注释,以便更详细地讨论:

在图中,我标记了一些关键名称和执行者,并且还突出显示了为所有靶贡献预测但表现不佳的各种服务器(右下),人们将通过简单地用最佳序列匹配(“Naive BLAST”)对 PDB 结构的 PDB 进行 BLAST 而获得的天真预测,这是事实上可用的最佳结构模板,即使它可能无法通过 BLAST 搜索检索,从 AF2-EBI 数据库中检索的模型是正确的(该数据库仅覆盖某些蛋白质组,因此覆盖了靶的低部分)。

作为关键的名字和演员,你会在右上角发现纯粹的 AF2 预测,这是你想去的地方。注意,在运行 AF2 时,有没有模板并没有实质性的区别,正如已经记录的那样。还要注意的是,偏差棒对它来说是非常重要的,这意味着 AF2 不能预测一些非常好的结构(而且对于一些目标来说,预测是极好的)。还要注意 RoseTTAFold(被认为是 AF2 最接近的竞争对手)的平均得分较低,甚至没有模拟所有目标(没有给出原因,但不一定意味着该程序不能处理它们)。最后,还有 3 种方法表现相当好,甚至比 RoseTTAFold 更好,尽管不是对所有目标都是如此:PaFold、ZlxFold 和 HelixOnAI,它们显然都是新的。

这些来自 CAMEO 的数据似乎表明竞争相当激烈,但只针对亚军,因为 AF2 似乎仍然是最好的。虽然惊喜总是会出现,就像 AF 自己在 CASP13 中首次亮相一样。此外,如上所述,CASP15 将关注细节、四级结构、配体和动力学,因此可能会有新的惊喜。谁知道从谁那里。

以下是我所有关于 AlphaFold、CASP 和蛋白质建模的文章和同行评议论文的总结

有关于蛋白质建模、生物信息学、蛋白质设计、分子建模或蛋白质生物技术的工作给我吗?这里联系我

www.lucianoabriata.com我写作并拍摄我广泛兴趣范围内的一切事物:自然、科学、技术、编程等等。 成为媒介会员 访问其所有故事(我免费获得小额收入的平台的附属链接)和 订阅获取我的新故事 通过电子邮件 。到 咨询关于小职位 查看我的 服务页面这里 。你可以 这里联系我

你的电脑最喜欢的度量标准是什么?

原文:https://towardsdatascience.com/whats-your-computer-s-favorite-metric-98c132b0488a

优化不同的函数:MSE vs RMSE vs MAD

均方差(MSE)是模型的损失函数 *最受欢迎的(也是最普通的)选择,它往往是您在数据科学初学者课程中学习的第一个选择。在以前的帖子中,我们研究了如何将它用于两个目的:

  1. 绩效评估:一目了然,我们的模型做得怎么样?换句话说,我们能快速阅读我们正在处理的内容吗?
  2. 模型 优化 :这是可能的最佳拟合还是我们可以改进?换句话说,哪个模型最接近我们的数据点?

结果是 MSE 对于模型评估来说是垃圾,但是对于优化来说却是极好的。绩效评估的目标是让一个(你、我、任何人)阅读一个分数,并了解我们模型的一些情况。模型优化的目标是让机器确定模型的最佳设置,使其适合您的数据。

总结这一切的一种更诗意的方式是,MSE 对人类有害,但对机器有益。

对于人类的需求,均方根误差(RMSE)比 MSE 更方便,平均绝对偏差(MAD)是最好的。为了计算 MAD,您只需在所有的错误上去掉符号,然后取平均值。换句话说,MAD 实际上给出了模型误差的平均大小,使其成为最直观的评估指标。

(缩写真多!如果你是第一次接触这些字母汤,在阅读之前,请快速浏览一下上一篇文章https://bit.ly/quaesita_mseeg。)

MSE 对人类不好,对机器好。

在这篇文章中,我将解释为什么 MSE 是你的机器最喜欢的指标(而不是你最喜欢的指标),为什么它比 RMSE 和 MAD 更适合优化。我还将向您展示 MSE 输掉比赛的情况。让我们开始吧!

作者创造的形象。

为什么你的机器喜欢 MSE

咳咳,机器不爱任何人任何事。然而,也有热爱 MSE,而这台机器的编程反映了他们的热爱。这些人就是构建优化算法的工程师。

你学过的一阶导数是 x,这是有充分理由的——在微积分中,平方非常简单。

出于对机器的热爱和尊重,专业人士以实现尽可能高效的计算优化算法为荣。开玩笑的。更像是出于对环境和钱包的爱和尊重。低效的算法代价高昂,所以我们避免使用。

如果你想使用优化算法(或微积分)快速找到给你最好的理想参数设置— 最优! —性能,有一个方便使用的功能真好。在优化便利性方面,很难超越 MSE。你学过的一阶导数是 x,这是有充分理由的——在微积分中,平方非常简单。微积分 101 的下一课是如何处理常数和求和,因为这些也非常简单。你猜怎么着?平方、总和、常数(1/n)是 MSE 的整体公式

MSE 通常是最有效的。

优化 MSE 与 RMSE

如果你用 RMSE 作为损失函数呢?(毕竟,这是更有意义的指标。)

你会得到同样的结果…无论你优化 RMSE 还是 MSE,获胜的模型都是一样的,但是你不太可能有选择。损失函数永远不会是 RMSE,除非你有太多的空闲时间。为什么?

声称使用 RMSE 的算法实际上只是在引擎盖下优化 MSE,但为了你的观看乐趣,在最后一步用平方根写下答案。

即使获胜的 MSE 解决方案与获胜的 RMSE 解决方案相同,但效率要求任何有自尊的工程师都不会在优化算法中使用 RMSE 而不是 MSE。相反,机器将使用 MSE 来寻找解决方案,也许它会在最后弹出一个平方根来满足你怪异的审美缺陷。

为什么效率爱好者对 RMSE 如此反感?微积分,就是这个原因。对平方的东西求导很容易。(还记得 d/d x x 吗?2x。简单。)和与常数的导数也很容易。所有这些的导数加上一个平方根是不必要的麻烦,特别是如果结果是相同的。

直接使用 RMSE 而不是 MSE 增加了一层麻烦(和额外的失败)——这样实现效率很低。

优化 MSE 与 MAD

疯子怎么办?难道我们不希望它发生在前的时刻吗?

当然可以,但是 MAD ( 公式这里)里面有个绝对值函数,有个尖角。尖的东西在微积分中不是你的朋友,所以优化 MAD 比优化 MSE 更昂贵。

但无论如何,都有很好的理由去做。

最重要的一点是,它比 MSE 更好地处理了异常值。MSE 对异常值过于敏感,使大误差对解决方案产生太大影响。

MSE 处理异常值很糟糕。疯子更擅长对付他们。

为什么 MSE 在异常值出现时会反常?离群值有很大的误差…现在我们把这个大数字平方?这是一个巨大的数字!如果一个巨大的数字增加了损失,而你试图让损失尽可能小,最快的方法就是减少那个令人讨厌的错误的大小。你会怎么做?简单。只要把线拉向异常值。

有了 MSE,异常值几乎接管了你的解决方案。对于 MAD,没有过度反应。那我们为什么不到处都用 MAD 呢?实施问题。MSE 使用起来更方便,而且它更有可能作为内置在您要借用的任何代码中的东西提供给您。

有意义吗?这是你想要的吗?这是你的问题吗?不一定。这是一个容易优化的损失函数。这就是为什么它无处不在。**但是,对于您的建模问题,还有其他损失函数有时会是更好的选择,现在您可以找到它们。

感谢阅读!YouTube 课程怎么样?

如果你在这里很开心,并且你正在寻找一个为初学者和专家设计的有趣的完整的应用人工智能课程,这里有一个我为你制作的娱乐课程:

**“损失函数”是“目标函数”的机器学习词——它们是一回事。

    • MSE 也超级方便统计推断。*

当一个计数变得疯狂时,或者如何在 DAX 中计数订单

原文:https://towardsdatascience.com/when-a-count-goes-mad-or-how-to-count-orders-over-time-in-dax-850b55145f3

当我们不得不扩大我们的范围,纳入比本期可见订单更多的订单时,会发生什么?

艾萨克·史密斯Unsplash 上拍摄的照片

我的委托人要求的

我的一个客户问了我以下两个问题:

  1. 我想统计所有订单,包括特定期间的未结订单
  2. 我希望根据一段时间内的订单数量对客户进行分类

这两个问题看似简单,但经过一番思考,我不得不再三考虑可能的解决方案。

要解决这两个问题,我们必须操作过滤器上下文,以包含比当前过滤器上下文中可见的更多的行。

现在,我将一次解决一个问题,并描述我是如何试图解决这些挑战的,以及在解决第二个挑战时,在找到正确的方法之前,我是如何走上错误的道路的。

数据模型

我在本文中使用了 Contoso 数据模型(参见下面的源代码和许可信息)。

数据模型如下图所示:

图 1 —数据模型

在线销售表与日期表有三种关系:

  • 订单日期至今
  • 截止日期至今(无效)
  • 发货日期至今(无效)

第一个问题的挑战

第一步是为期望的结果定义一个真值表。

我们需要这样一个表来指定期望的结果:

图 2 —未结订单的真值表

如您所见,在观察期开始前创建但在观察期内发货的每个订单都被定义为未结订单。

此外,在观察期间创建的所有订单都必须包括在计数中。

DAX 中的解

为了满足需求,我们需要创建两个度量。

1.简单订单计数

该度量对事实表中的订单数进行计数。

由于每个订单有几个订单行(订单中的每个产品一个),我必须使用 DISTINCTCOUNT()函数来度量:

Online Order Count = DISTINCTCOUNT(‘Online Sales’[Sales Order Number])

此度量返回当前筛选器上下文中的订单数。

2.活动订单计数

这个衡量标准稍微复杂一点:

我必须包含所有 OrderDate 在观察期开始之前的未结订单(Date 表的实际过滤上下文)。

这是衡量标准:

Online order count (open orders) =VAR FirstActualDate = MIN( ‘Date’[Date] )VAR ActiveOrders =
    CALCULATE(
        [Online Order Count]
        ,CROSSFILTER(‘Online Sales’[OrderDate], ‘Date’[Date], NONE)
        ,’Online Sales’[OrderDate] < FirstActualDate
          && ‘Online Sales’[ShipDate] >= FirstActualDate
        )RETURN
    ActiveOrders

我使用[在线订单计数]来统计订单。

然后,我使用 CROSSFILTER()禁用与数据表的活动关系。

此函数确保过滤器上下文不会应用于此计算。
或者,您可以使用 ALL('Date ')来删除日期表上的实际过滤上下文。

然后,我使用在度量开始时定义的变量 FirstActualDate,只包含在实际周期/过滤器上下文之前创建但尚未发货的订单。

我试图编写一个度量来获取当前过滤器上下文中的所有订单和所有未结订单,如上面的真值表中所定义的。但是这种方法会导致非常复杂的测量。

因此,我决定更改度量的最后一行,将[在线订单计数]度量和新度量加在一起,以获得正确的结果:

RETURN
    [Online Order Count] + ActiveOrders

通过这一步,我可以用一种简单的方法在结果中包含所有其他订单。

第二个问题的挑战

这个要复杂得多。

确切的要求如下:

必须对每个客户进行观察,并根据过去 180 天的订单数量对其进行分类(以下要求根据我的客户的原始要求改编为 Contoso 数据集)。

  1. 当客户下的订单少于 20 份时,该客户必须归类为“待联系”
  2. 当客户下了 21 到 35 份订单时,该客户必须被归类为“普通客户”
  3. 当客户下了 36 到 50 份订单时,该客户必须被归类为“好客户”
  4. 当客户下了超过 50 份订单时,该客户必须被归类为“非常好的客户”

我的客户强调计算每天和每个顾客的分类。

在这个阶段,单一客户并不那么重要。但是随着时间的推移,观察所有客户的发展是至关重要的。

我的第一个想法是这样的:我需要知道每个客户的订单之间的距离。然后尝试根据这些信息计算每个客户的类别。

获得这个结果的最直接的方法是创建一个计算列。

另一种方法是创建一个衡量标准并动态计算这些信息。

每种方法都有优点和缺点。但是我确信计算列可以支持该解决方案,因为随着时间的推移,每个客户都会在类别之间发生变化。

但最终的解决方案是一个措施,因为客户可以在一个月内创建 100 个订单,但在接下来的三个月内只能创建 10 个,随着时间的推移,他将转移到另一个类别。

在达克斯寻找解决方案的路上

第一步是获得每个订单之间的天数距离作为计算列:

DistanceToPrevOrder =
    VAR CurrentCust = ‘Online Sales’[CustomerKey]
    VAR CurrentDate = ‘Online Sales’[OrderDate] VAR PrevOrder = CALCULATE ( MAX(‘Online Sales’[OrderDate])
                       ,FILTER(‘Online Sales’
                       ,’Online Sales’[CustomerKey] = CurrentCust
                         && ‘Online Sales’[OrderDate] < CurrentDate)
                       )VAR OrderDistanceDay =
    IF (NOT ISBLANK(PrevOrder), INT ( CurrentDate — PrevOrder ) )RETURN
    OrderDistanceDay

在这里,我使用上下文转换来获取每个客户和每个订单的前一个订单的日期。

要了解有关上下文转换的更多信息,请阅读本文:

下一步是创建获得最终结果的方法。

我必须为每个类别创建一个度量。多种衡量标准是实现客户动态计数的唯一方法。

我的下一步是使用计算列生成结果。

但是用这种方法不可能得到正确的结果,因为当有订单时,这个度量只返回一个数字。

但是客户端每个周期需要一个数字。

我第二次尝试解决这一挑战时,采取了以下措施:

Customer to contact =VAR ActualDate = MAX(‘Date’[Date])
// Get only the rows where Max OrderDate per customer is ActualDate
        — 180 daysVAR Result = COUNTROWS(
                FILTER(
                   SUMMARIZE (
                         GENERATE(
                           ‘Date’
                           ,’Online Sales’
                           )
                           ,’Date’[Date]
                           ,’Online Sales’[CustomerKey]
                           ,”OrderCount”, CALCULATE (
                             DISTINCTCOUNT(
                               ‘Online Sales’[Sales Order Number]) )
                             )
                       ,’Date’[Date] < ActualDate
                            && ‘Date’[Date] >= ActualDate — 180
                            && [OrderCount] < 20
                       )
                   )RETURN
    Result

但是返回前两个类别的结果需要五分钟以上,这是不可接受的。

这个冗长响应的原因是 GENERATE()函数。

我试图用日期表中每个客户和每一行的每个组合生成一行。

我在 FILTER()函数中使用结果表来过滤出需要的行。为此,我使用上下文转换(CALCULATE(distinct count(' Online Sales '[销售订单号]))计算了 SUMMARIZE()结果中的 OrderCount 列

虽然我用 19,000 名客户的 Contoso 数据集得到了一个结果,但它不适用于我的客户数据。他的客户表上有超过 140 万行。

但是仔细观察发现结果也是不正确的。所以,这种方法是一个死胡同。

Unsplashengin akyurt 拍摄的照片

为了找到一种新的方法,我不得不退后一步,理清思绪,从新的角度看待这个挑战。

我意识到,在基于日期层次结构创建报告时,我总是有一个日期上下文。我不必为每个日期和每个客户生成一个表来计算订单数。在那之前,我完全走错了路。

然后我把问题分成两个问题:

  1. 过去 180 天内创建了多少订单?
  2. 在过去的 180 天里,每位顾客有多少订单
    答:根据这些信息,我可以对顾客进行分类

第一项措施是统计过去 180 天的订单:

Orders last 180 Days =
    VAR Last180Days =
           DATESINPERIOD(‘Date’[Date], MIN(‘Date’[Date]), -180, DAY) VAR OrdersLast180Days =
                        CALCULATETABLE(
                             SUMMARIZE(‘Online Sales’
                                ,’Online Sales’[Sales Order Number])
                             ,Last180Days
                            ) VAR OrderCountLast180Days = COUNTROWS(OrdersLast180Days)RETURN
    OrderCountLast180Days

第一步是生成一个表,其中包含实际过滤上下文之前的所有日期— 180 天。

在第二步中,我使用 CALCULATETABLE()和 SUMMARIZE()获得这段时间内所有订单的列表。

第三步也是最后一步是计算第二步的行数。

现在我用它来计算每个客户的订单数。

对于此计算,我为第一个类别创建了以下衡量标准:

Cat 1 Customers =
    COUNTROWS(
        CALCULATETABLE(VALUES(‘Customer’[CustomerKey])
                         ,FILTER(‘Customer’
                               ,NOT ISBLANK([Orders last 180 Days])
                               &&
                               [Orders last 180 Days] < 20
                              )
                         )
                   )

因为我需要考虑每个客户,所以我必须遍历 customer 表并检查每个客户的订单数。

让我们从外到内来看看这个衡量标准:

  1. COUNTROWS()将使用每个客户的订单数来计算表的行数
  2. CALCULATETABLE()生成一个表
    a .在 CALCULATETABLE()内部,我使用 VALUES('Customer[CustomerKey])来获取所有客户
    b .然后,我使用 FILTER()根据每个客户的订单数来过滤 Customer 表

因为 FILTER()是一个迭代器,所以我利用上下文转换来获取每个客户过去 180 天的订单数。度量[最近 180 天的订单]获取实际客户作为筛选上下文,并计算每个客户的订单量。

我必须使用 NOT is blank([订单持续 180 天])来排除没有任何订单的周期。如果没有这种排除,即使没有订单,我也可以获得所有时期所有客户的计数。这仅适用于第一个订单之前和最后一个订单之后的所有期间。我们总是在这些边界之间得到一个结果。

结果是在过去 180 天内订单超过 20 个的客户列表。该列表中的行是 COUNTROWS()的输入。

结果如下图所示(所有四个测量值):

图 3 —最终解决方案的结果(由作者提供)

这种方法有以下两个优点:

  • 我为每个客户创建了一个报告,因为每个客户的过滤上下文将预先过滤客户表。这样,我将得到每个客户的正确结果
  • 结果的计算在很短的时间内就完成了

图 4—解决方案的查询性能(由作者提供)

您可以看到存储引擎执行了大部分工作(蓝色部分)。尽管该引擎有 27 个查询要做,但它们可以在很短的时间内并行执行。

然后,我将这个解决方案转移到我的客户的 Power BI 文件中,在他的客户表中有 140 万个条目。

第一个视频花了一分多钟才显示出结果。这是一个不好的迹象。

然后我在订单年份上设置了一个过滤器。Power BI 在不到一秒的时间内完成了结果的计算。

我必须看看性能,并与我的客户讨论,看看这是否可以,或者我是否必须尝试进一步优化解决方案。

安德烈·亨特在 Unsplash 拍摄的照片

经验教训

虽然第一个挑战的解决方案相对简单,但第二个挑战被证明要困难得多。

我的错误是开始用我的客户定义问题的方式来思考。这种想法是找到正确方法的一大障碍。

我不得不从他的表述中断开我的思考,开始从一个新的角度思考。

当我这样做的时候,我在相对短的时间内找到了解决方案。我只需要将挑战分解成更小的部分,这很有效。

回过头来看,我想建议不要在和你的客户讨论的时候开始寻找解决方案。首先,完成挑战的定义。然后坐下来休息几分钟,在将思维切换到“DAX 模式”后看看挑战。

很容易让人想到:“我知道这个挑战的答案”或“我必须做这个或那个”。虽然这种想法可能是正确的,但它有时会导致错误的方法。

就像在 DAX 中一样,你思维的上下文转换需要时间,而且并不简单。

参考

我使用 Contoso 样本数据集,就像我以前的文章一样。你可以从微软这里免费下载 ContosoRetailDW 数据集。

Contoso 数据可以在 MIT 许可下自由使用,如这里的所述

我扩大了数据集,使 DAX 引擎工作更努力。
在线销售表包含 7100 万行(而不是 1260 万行),零售表包含 1550 万行(而不是 340 万行)。

https://medium.com/@salvatorecagliari/membership

当准确性不够时:可视化和游戏设计

原文:https://towardsdatascience.com/when-accuracy-isnt-enough-visualization-and-game-design-48b95425130a

建模通常从定义一个要优化的度量标准开始,通常,这个“好”的定义遗漏了一些东西。提高精确度会为歧视创造空间优化利润会加剧不公平不良行为会隐藏在良好的绩效指标背后【1】【2】【3】。数据科学为优化提供了许多工具,但请考虑定义问题本身:什么使解决方案令人满意,什么行为意味着它能按预期工作?没有一个答案是这个领域正在进行大量的工作 ( 包括需要提高学科本身的多样性)【4】【5】。然而,考虑两个有时不常见的工具可能会有所帮助:信息和游戏设计。

可视化:一个数字是不够的

一个“理想的”模型乍一看似乎是显而易见的:一个在从未见过的数据中进行预测时具有高准确度的模型。然而,考虑一个假设的计算机视觉产品,它以 92%的准确率识别受损的房屋。在一个测试集中,六个城市样本对应一个农村样本,这可能意味着 50%的农村准确率和 99%的城市准确率[6]。不同的城市或街区呢?什么样的建模选择会使这种差异变得更糟?总结出一个数字隐藏了这种复杂性。

显示可视化的线框,不仅仅是精度和回忆【7】。

团队经常在基础设施上花费资源来构建和维护模型,但是我很少看到有信息设计师【8】【9】。从的准确度到精确度和召回率绝对有帮助,但是按地区或在地图上显示这些指标呢?这看起来很简单,但构建超越汇总指标的可视化来询问多个维度上的性能,不仅使数据科学家,而且使更广泛的合作者群体能够对性能有更深入的理解,包括哪里有亮点,哪里出现差异(或不公平)。

游戏设计:我们不知道一切

可视化有助于理解目标绩效,但是错误的目标怎么办?考虑一个模型,该模型计算出在一个城市中何处激励创建新的健康饮食超市。我在旧金山建立了一个食物可用性模型。人们可以很容易地要求计算机放置超市,以优化健康和新鲜食品的获取,但这种模型不理解现有的社会中心,公共交通接入,收入不平等,这些地方的历史等。这些不同的因素有多重要?最优化可以达到市民认为不理想的数值理想解。

一个开源互动模拟旧金山食物可用性的截图【11】。

然而,通过使成为一个交互工具来交互地“测试”不同的解决方案,模型从开出一个答案变成了对不同答案进行推理的媒介【11】。工具使利益相关者能够将他们自己的知识带到问题中,围绕潜在的解决方案进行有根据的讨论,共同定义什么是理想的。人们可以引入模型中没有的视角,提出数据科学家可能没有考虑到的问题。数据团队如何设计这些工具? MLUX 的学科解决了这些问题,而游戏设计也提供了关于在复杂系统中培养能力的观点,为获得理解精心制作可访问的体验,以及实验【12】【13】【14】【15】【16】【17】。

参与式设计

信息和游戏设计一起询问工具如何实现新的思维方式以及模型如何不仅创造解决方案而且创造对话【18】【19】。理想情况下,这些方法的结合减少了其他人合作的障碍,使新的观点能够实质性地通知关于解决方案本身的决策或关于建模中未来步骤的推理。这种 echos 参与式设计,将利益相关者集中起来与工程师/设计师共同设计的方法【20】。这些用户参与解决方案的创建,而不是将解决方案带给用户。

著名的 EN-ROADS 模拟演示了让更多人参与对话的想法[19]。

这种头脑中的框架、可视化和游戏设计将 ML 从传统方法(或人类专业知识)的竞争对手转变为决策工具。这为人类合作者提供了一个新的额外的视角,并有助于实现一个比人类或机器单独实现的更全面、更明智的整体解决方案。

总结一下:理解的工具

可视化有助于解释一个系统或模型,而游戏设计可以帮助构建工具来推理不同的解决方案或行为。它们共同促成了类似参与式设计的东西。他们使模型的行为和参数对许多合作者是可访问的。当然,这些可视化和实验工具需要设计和技术人员。然而,最终,每个人都受益于将一个 ML 工具从一个独立的实体变成一个合作伙伴,增加和扩展人类对问题的理解,同时确保模型的影响【20】。

想在数据、设计和系统的交叉领域进行更多的实验吗? 关注我获取更多

当人工智能写维基百科的时候

原文:https://towardsdatascience.com/when-an-ai-writes-wikipedia-f7aa3eff9ebc

GPT 尼奥对我们了解多少?

诺贝尔文学奖得主,插图由Ru-DALLECC-BY

乔纳森·斯威夫特 1726 年的小说格列佛游记描述了一台“奇妙的机器”,它允许“最无知的人,以合理的费用,用一点体力劳动”来“在没有天才的帮助下,写哲学、诗歌、政治、法律、数学和神学方面的书。”

想象一下,将近 300 年后,当我偶然发现伊莱瑟雷版本的这台机器:GPT-尼奥时,我是多么惊讶和高兴。只需点击几下,我就能生成成千上万的单词。更具体地说,我能够为 118 位诺贝尔文学奖得主创建维基百科风格的传记,而没有研究的麻烦,没有空白页面的绝望,或者真的根本不需要劳动。

我偶然发现了 GPT-尼奥生成维基百科页面的能力。只需键入名字和姓氏,然后输入生活日期——例如,“多丽丝·梅·莱辛(1919 年 10 月 22 日-2013 年 11 月 17 日)”——就可以创建一个完整的类似维基百科的传记,通常还会有一个类似真实维基百科文章底部的类别列表——“美国女小说家”或“密西西比意外死亡”,威廉·福克纳就属于这一类别。

我的挑战不是写作,而是阅读这几页,我做到了。我发现 GPT-尼奥在真正的学术意义上可能是一个胡扯:

“说谎者是对真相感兴趣,知道真相,并故意歪曲真相的人。相比之下,胡说八道的人不关心真相,不知道或不关心什么是真的或假的。”伊恩·p·麦卡锡等人。al

尽管如此,GPT-尼奥还是很好地抓住了维基百科页面的感觉。1.3B(13 亿个参数)版本确定了 43 位文学奖得主为作者,9 位为诺贝尔奖获得者,而 2.7B 版本确定了 51 位获奖者为作家(包括 1.3B 版本确定的大多数,但不是所有人)。当我阅读这些传记时,我开始想知道 GPT-尼奥对书中毫不费力描述的个人“了解”多少。

“她最著名的作品是《最蓝的眼睛》,这是她职业生涯的主要部分,”GPT-尼奥这样评价托妮·莫里森。有人可能不同意《T2》《最蓝的眼睛》是莫里森最著名的小说,但它确实是她写的。对于海明威,机器指出“他的后期作品,如《太阳照常升起》 (1924 年)、《老人》&《海》 (1925 年)、《过河入林》 (1933 年)和《伊甸园》 (1939 年),通常被描述为“历史小说”。“酒吧的日期取消了,但标题是海明威的。

作者托马斯·曼恩的肖像由Ru-DALLECC-BY 完成

然而,这种准确性是例外。一般来说,机械作家不在乎细节是否正确:

“托马斯·曼恩是 12 本书的作者,包括《魔山》、《真理的魔力》、《现实的魔力》、《通货膨胀的魔力》和《一个没有素质的人》”。

它自信地将作品归功于它喜欢的任何人:“福克纳最著名的作品是喧嚣与骚动哈姆雷特树和其他故事,而爱丽丝·门罗的全部作品包括穿越时间的女孩…随后是我的生活是个谎言彩虹的尽头

奖项和“第一次”占据显著位置。“1958 年,在他们的儿子出生后,[若泽·萨拉马戈]被葡萄牙文学院宣布为年度父亲”或者“在他去世几个月后,[米盖尔·安吉尔·阿斯图里亚斯]在《人物》杂志评选的 50 位最伟大的西班牙演员中名列第 24 位。”

有时,这些说法包含脚注:“[辛克莱]刘易斯于 1885 年 2 月 7 日出生于纽约市,在一个大家庭的九个孩子中排行第七,在十二个孩子中排行第十一。[1]“但它们是无处可去的脚注。其他时候,机械作家生成了一个“外部链接”部分,其中包含作者采访或书籍的链接,但我在互联网上搜索时没有找到。

总的来说,GPT-尼奥的发明——尽管有时很滑稽,通常不真实——有一种怪异的一致性,使它们令人信服。受试者的寿命和生活事件几乎总是与提供的日期相匹配。GPT-尼奥只是在出生和死亡之间虚构了这个故事,将真实的人编织到故事的叙述中——“1914 年,[奈丽·萨克斯]遇到了德裔犹太无政府主义者罗莎·卢森堡,”或者“贝克特受到了亨利·詹姆斯作品的影响”——并引用了一些话来支持这个主题的知名度:“美国桂冠诗人查尔斯·赖特(Charles Wright)曾在《纽约客》(the New Yorker)上形容品特是“英语世界最重要的作家之一。”"

有时,作者自己也说:“在 1986 年的一次采访中,[鲍勃]迪伦说‘我对不跳舞的女孩有一种感觉。我是一个有问题的舞者。"

GPT-尼欧的胡扯技巧在描述所谓的哲学著作的冗长段落中表现得最为明显:

按照欧肯的说法,人的意志可以从三个方面来理解:作为由神的意志的意志所决定的纯粹主体;作为一个没有意志的意志;作为一个意志,它是由一个更高意志的形象决定的…无意志的意志是纯粹的心理现象,是这种意志的形象。人是上帝意志的主体,但这并不意味着人有完整的人格。

GPT·尼欧写了关于“知识的极限和真理概念的问题”,“自由和决定论的概念”,以及“真理概念是否真的只是一个观点的问题。”

你可能会想,它是怎么学会这些的?

GPT-尼奥在“堆”上接受了训练,这是一个巨大的文本数据集,包括英语维基百科和许多其他语料库。它附带了这样的免责声明:“已知包含亵渎,猥亵,或其他磨料语言。根据您的使用情况,GPT-尼奥可能会产生社会不接受的文本。”

生成的文本不可接受吗?有时候,是的。有人提醒我维基百科已知的偏见吗?还有,是的。被称为“翻译家、记者和编辑”的西格里德·温塞特的工作是这样被表彰的:

作者西格里德·温塞特的肖像由Ru-DALLECC-BY 完成

几件与她生活相关的物品正在乌普萨拉的艺术和文学博物馆与她生活中的其他纪念品一起展出。这些包括她的婚纱、全家福、她丈夫的来信和一些私人物品。****

路易丝·格吕克的传记开头提到她是“一名德国化学家和化学教授”。她是恩斯特·海因里希·格吕克的女儿”,然后她转而谈到了恩斯特·海因里希的成就。文本最终回到了她的工作上,但本该用来描述她成就的空间被她的家庭占据了,在这种情况下,是一个男人的工作。

机械作家是否不成比例地提到了男性?它是用不同的形容词来描述男女,还是把更多的篇幅用于女性主题的个人生活?我不确定。我的样本很小。在我观察的 118 位诺贝尔奖获得者中,只有 14 位是女性。然而,如果机械作者延续甚至放大人类生成的维基百科的已知结构偏见,我不会感到惊讶。

总的来说,我发现 GPT·尼欧的文章清晰明了,有时准确无误,但更多时候是错误的,而且完全没有引用。我在评估传记中的角色变成了一个令人生畏的事实核查角色,我不寒而栗地想到,如果机械的作者也选择编造一个参考书目来“证明”其主张,那么文本对一个不知情的读者来说会显得多么令人信服。

作为读者,我不相信机械的作者。但我的感觉对这台“奇妙的机器”来说毫无意义,它会愉快地生成文本,而不需要“体力劳动”,甚至根本不需要身体。

电脑生成的传记耐人寻味,令人不安,有时还很有趣。我把这个 集合 的每一句开场白放在一起,给人一种作品的感觉。

了解更多:

席德·布莱克,利奥·高,,康纳·莱希,斯特拉·彼得曼,
GPT-尼奥:大规模自回归语言建模与网格张量流 (2021),芝诺多

Leo Gao,Stella Biderman,Sid Black,Laurence Golding,Travis Hoppe,,Jason Phang,Horace He,Anish Thite,Noa Nabeshima,Shawn Presser,Connor Leahy, The Pile:一个 800GB 的多样化文本数据集,用于语言建模 (2020),arXiv.org

人工智能需要领域专家坐在驾驶座上——这就是为什么

原文:https://towardsdatascience.com/when-building-ai-you-need-to-put-domain-experts-in-the-driving-seat-this-is-why-47af5661127e

在以数据为中心的人工智能循环中,主题专家对模型的影响最大。让他们掌控一切。

我们需要让 AI 民主化- 我强烈认为,人们拥有用他们的想法改变世界的不可思议的潜力,每个人都应该能够使用 AI 来大规模实现这些想法。这篇文章揭示了曾经有选择地访问人工智能应该如何在无代码工具的帮助下民主化。

通过授权领域专家来构建他们自己的人工智能,使人工智能民主化。由埃里克·克鲁尔Unsplash 上拍摄的照片

背景

到目前为止,使用人工智能的好处只有那些有资源雇佣数据科学团队的大公司才能享受到。通常,有明确业务需求的公司会联系他们的技术组织来帮助自动化一些流程、帮助一些用户、个性化一些体验,或者分析数据以产生洞察力。然后,tech org 会安排一些有数据处理经验和数据科学背景的工程师来构建这些模型。收集模型的需求,收集数据,为训练模型做准备(清理和注释),实验,最后,发布前的评估在之后发生。数据科学团队负责这些项目。

即使在这些主要以技术为中心的团队中,虽然业务用户可能会请求人工智能,但他们通常会等待数据科学家来训练具有长发布周期的模型。在许多情况下,这些模型甚至没有出现——它们表现不佳,或者甚至是不可行的(即,你赚的钱/省的钱不能超过你在构建这些模型上花的钱)。

人工智能将要取代的任务要么目前由人类完成,要么基于领域专家通常会做的事情。在这些数据科学项目中,领域专家充当模型性能或数据注释本身的“顾问”。一名数据科学家与一名专家配对,领域专家向其传授知识,然后该专家参加定期会议以提供反馈。

人工智能从数据中学习-数据科学家与领域专家密切合作,创建训练数据和模型。照片由附身摄影Unsplash 上拍摄

为什么我们在构建 AI 的同时需要领域专家?

从我成功交付客户项目的个人经验、我看到的用例以及来自网络的证据来看,我已经意识到在构建 AI 的过程中有一个领域专家是无价的。以下是一些原因。

领域专家比任何人都了解问题。

拥有 ML 算法的数据科学家经常用他们专注于数据的镜头跳入这个问题——基于探索性数据分析发现人工智能可以提供的潜在价值,甚至使用他们在文献中看到解决的类似问题提供解决方案。我为自己这样做感到内疚(明确地说,有经验的数据科学家会避免这种锤子找钉子的陷阱)。但是领域专家知道痛点是什么,需要解决什么。

也许 ML 能解决的最明显的事情并不是主要问题。例如,在医学成像领域,我们经常听到人工智能对 CT 扫描、核磁共振成像等进行诊断。如果你问医生目前进行诊断需要多长时间,他们会告诉你几乎是瞬间完成的。那么人工智能在帮助什么呢?医生可能更倾向于告诉你建立一个人工智能,通过替代信号提供在家协助,或者通过自动记录这些扫描来让他们能够看到更多的病人(注意:自动诊断可能会提供可访问性和成本优势,但你明白这一点。)也就是说——人工智能可以提供医生最初可能没有意识到的其他好处——放射学工具可以在辐射剂量降低 80%的情况下提供高分辨率成像?不是那种东西。

领域专家也知道他们目前如何解决这些问题。

当数据科学家与领域专家合作时,他们做的第一件事就是知识转移——包括问题和解决方案。专家根据他们的培训和经验可以很容易地描述首选解决方案。他们为科学家提供了关于为什么以及如何开发这种解决方案的见解。这些指导科学家获取数据注释和模型训练。虽然通过这一过程,科学家获得了一小部分专业知识,但最终,他们会将模型与数据相匹配,以完成领域专家的工作。

例如,当有人去买衣服,有一个购物助理,该助理不会开始指向“买了这个的人也买了这些”的建议。他们会试图理解顾客购买的原因,例如,是为了某个活动吗?为了这个季节?—了解用户喜欢什么,即偏好(即使不知道他们的购买历史),然后开始推荐他们可能喜欢试穿的衣服(根据他们的专业知识)。当顾客从试衣间出来时,他们会给出反馈,并根据顾客的问题提供替代方案。这就足够了,数据科学家仅仅通过查看产品目录和购买历史是不会知道的。

领域专家知道数据是怎么回事。

数据科学家,作为他们职业的本质,倾向于调查数据和发现模式,并基于它们创建解决方案。由于这些模式经常出现在大型数据中,它们可能很容易遗漏细微差别和例外情况。虽然他们知道数据中的发生了什么,但他们不知道数据中的发生了什么。

例如,与我交谈过的一位数据科学家提到,在几个月的模型训练和注释后,有一次专家说模型做出了不正确的预测,但在确认这与知识转移笔记中的预期一致后,这位科学家不明白他们为什么做出这种判断。这位专家说,这不是“教科书”上的东西,但在实践中可以在少数案例中看到。显然,有一些信息可以被捕获和注释,但是没有足够的例子来训练。

数据几乎总是不能捕捉到整个背景。在上面的医学例子中,医生根据病人的病史,甚至病人说了什么或他们的身体语言说了什么来增加他们的诊断信息。在推荐的例子中,数据没有捕捉到用户的意图。

领域专家没有时间创建像素级的注释,甚至没有时间执行评估。

与我交谈过的许多数据科学家感叹,他们很难与领域专家预约时间来帮助指导他们。在早期阶段,虽然数据科学家可能期望专家质量的注释,但他们会求助于多个知识传授会议,以便在专家有时间时尽可能多地获取信息。但是这种时间经常开始消失,特别是当领域专家看不到进展或者不知道他们的输入是如何帮助改进模型的时候。

在其他情况下,他们只是没有时间做琐碎的注释任务——例如,医生没有时间为医学图像中的语义分割或实例分割执行像素完美的注释。

通信周期越慢,迭代速度越慢。

沟通周期本身可能很长——例如,如果科学家花大约一周的时间来训练一个新的模型版本,并且他们安排了一个周会,他们可能直到那个会议才会得到反馈。虽然在理想情况下,科学家可以期待专家在问题出现时尽快做出回应,但实际上我们都有重要的事情要处理。取而代之的是,我们在 slack 上玩标签,电子邮件和离线通讯工具本身增加了获得反馈的延迟。

其他原因

还有其他因素在其他地方讨论过。 Pedram Atee 指出了领域专家和数据科学家之间的差距,还提到我们的问题比数据科学家多。卡耐基梅隆大学的一篇关于 ML 的博客证明了领域知识在 MLOps 周期的每一步都很重要。让这些领域专家参与进来是创建具有合理反馈周期的正确解决方案的关键。领域专家还通过提供对第一类和第二类错误的见解来帮助获得正确的答案并提高模型性能。最后,随着模型开始在实践中使用,它们需要是可解释的。但是这个解释也需要与领域专家提供的解释相匹配。

所有这些原因都指出,数据科学家帮助确定用于构建正确模型的正确算法,领域专家帮助定义和规定模型应该做什么。

你不能通过理解频率来演奏音乐。你需要一个艺术家。附身摄影Unsplash 上拍摄的照片

那么,为什么要把领域专家放在驾驶座上呢?

如果领域专家带来的价值(如上)还不足以说服你,让我们来谈谈为什么让他们来控制,而不是让数据科学家或业务用户来控制。

在过去几年中,我们看到的一个重要的范式转变是“以数据为中心的人工智能”的兴起。由吴恩达在 Landing AI 首创,并获得了压倒性的行业协议,这种范式规定,改善模型性能的重点应该是改善数据。许多数据注释公司,如 Scalesnuck已经改变了他们的信息。

我也有一段时间持同样的观点。当我与更喜欢将模型作为内部知识产权的客户交谈时,我建议数据是您的 IP,而不是模型。模型的艺术状态每六个月就会改变,所以为什么要大量投资。你也不去建立一个数据库系统,为什么要建立一个 ML ops 平台?

因此,如果我们正在构建以数据为中心的模型,让领域专家来控制不是更好吗?数据科学家可以切换到支持角色,并使用他们的 ML 工具带来构建最佳模型,以涵盖专家指定的用例及条件(当然,由数据证明)。

要让领域专家掌握主动权,您需要为他们提供一套特殊的工具,这些工具可以抽象出数据科学术语,帮助提炼他们的知识,并提供良好的培训示例。我已经在其他地方讨论过这个,但是简而言之,通过为专家提供这样的工具,你改善了反馈周期,这实际上为数据科学家提供了更多更好的数据。

授权领域专家构建 ML,并观察他们的进展。照片由尤金·特里古巴Unsplash 上拍摄

无代码人工智能工具使领域专家能够构建人工智能

Jean-marc Buchert 对无代码人工智能工具做了一个很好的概述。有了这样的工具,无代码人工智能开始看起来像一个伟大的起点,领域专家今天可以使用它来开始构建模型。如果你宁愿构建而不是购买,确保你的工具的用户界面是面向领域专家的,而数据科学家拥有迭代训练模型和快速部署它们所需的数据和模型管道。

我将列出几个我最喜欢的。

这些是我最喜欢的专注于领域专家的无代码人工智能工具:

  1. Landing.ai 的 LandingLens —我喜欢他们的平台从“缺陷书”开始,清楚地让专家告诉模型什么是缺陷的好例子,以及其他。正如我前面提到的,这是一个以数据为中心的人工智能平台,但可能不会像接下来的几个平台那样自助。
  2. Levity . ai——Levity 有一个拖放 UI,让你将任何 ML 模型插入到你的工作流中,并让你不用代码就能训练它们。规定的方法是从他们的一个模板化的工作流开始,但是一般来说,您可以根据需要构建复杂的模型流。
  3. 浮潜. ai警惕. io——这些都是 NLP 工具,帮助领域专家为分类和其他任务创建弱规则。一旦系统有了一堆这样的规则,它就学会通过将这些规则应用到数据上的结果组合起来执行任务。我发现这些工具吸引许多领域专家的一点是,他们可以立即得到反馈:( a)一次自动标记 100 个文档;( b)熟悉他们自己输入的规则。
  4. Platform.aiCrowdAINanonets 等。—这些平台还为标记、训练和自动化计算机视觉任务提供了无代码接口。
  5. Akkio 是我第二喜欢的工具,他们的数据源和模型面向领域专家或非数据科学家,这使得它非常强大。
  6. AI Hero — AI Hero 帮助产品团队推出人工智能驱动的功能,而无需雇佣数据科学团队。产品团队中的领域专家可以轻松地创建一个原型,随着您提供的数据的增长,模型自动化会自动学习并升级到您可以在生产中使用的东西。

我承认我偏向 AI 英雄(既然我是创始人)。

虽然这只是我最喜欢的一个列表,但它并不详尽,而且有很多针对不同垂直行业的工具。

人工智能从领域专家提供的好的和坏的例子中学习。刘玉英在 Unsplash 上的照片

结论

领域专家更好地理解问题和痛点,并可以帮助指导数据科学家创建适用于不同用例的解决方案。领域专家对以数据为中心的人工智能反馈回路影响最大。无代码人工智能工具提供了一种很好的方式,通过赋予领域专家抽象 ML 细节的 UX,让他们坐上驾驶座。

本文由 Rahul Parundekar 为 AI 英雄撰写。

Rahul 是一名人工智能专家,在设计和构建人工智能产品、工程、研究和领导方面拥有 13 年以上的经验,热衷于通过人工智能改善人类体验。他喜欢了解如何使用 ML 练习,并以他的经验帮助 ML 练习者。跟他谈 这里

AI 英雄 是一个无代码平台,帮助你分分钟从 零到 ML 。您可以从我们不断增加的自动化列表中进行选择,以标记文本、推荐产品、标记图像、检测客户情绪和其他任务,所有这些都通过一个简单的、无代码的自助式平台完成。

当变更数据捕获成功时

原文:https://towardsdatascience.com/when-change-data-capture-wins-271875e3df1a

意见

关于实时数据管道何时是保持生产数据库和仓库同步的最可靠方式的指南

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

与 Striim 的约翰·库泰合著

在分析团队多次降低生产数据库的速度后,数据仓库应运而生。分析性工作负载不适合事务性数据库,事务性数据库针对高延迟读取、写入和数据完整性进行了优化。同样,生产应用程序在事务数据库上运行也是有原因的。

定义:事务性(OLTP)数据存储是在事务中保持 ACID(原子性、一致性、隔离性和持久性)属性的数据库。例子包括 PostgreSQL 和 MySQL,它们可以扩展到每秒 2 万个事务

分析团队并不太关心在一秒钟内插入 2 万行—相反,他们希望连接、过滤和转换表,以便从数据中获得洞察力。数据仓库正是为此使用 OLAP 进行了优化。

定义: OLAP (在线分析处理)数据库针对大量数据的多维分析进行了优化。例子包括流行的数据仓库,如 Snowflake、Redshift 和 BigQuery。

不同的团队,不同的需求,不同的数据库。问题仍然是:如果分析团队使用 OLAP 数据仓库,它们是如何被填充的?

作者图片

使用 CDC 提高数据服务级别协议

让我们后退一步。分析团队拥有的几个领域示例:

  • 客户细分数据,发送到第三方工具以优化营销和客户支持等业务功能
  • 欺诈检测,对产品上的可疑行为发出警报

如果这些分析是在数据仓库之上运行的,那么数据仓库中所需的基线数据量就来自生产数据库。来自第三方工具的补充数据非常有用,但通常不是分析团队开始的地方。将数据从数据库移动到数据仓库时,通常考虑的第一种方法是基于批处理的。

定义:批处理数据管道涉及定期检查源数据库,并运行管道来更新目标(通常是仓库)中的数据。

这种方法存在技术上的困难,最明显的是需要知道源中发生了什么变化以及目标中需要更新什么的逻辑。批量 ELT 工具确实减轻了数据专业人员的负担。然而,没有一个批处理 ELT 工具能够解决其中最大的问题:数据 SLA。考虑每三小时运行一次的数据管道。任何独立运行在该数据之上的管道,即使也是每三个小时运行一次,在最坏的情况下也会过时六个小时。对于许多分析来说,六个小时的延迟不会改变指针。这就引出了一个问题:团队什么时候应该关心数据新鲜度和 SLA?

定义:SLA(服务水平协议)是供应商和客户之间的一份合同,涉及到应用程序可用性和停机时间时,客户可以从供应商那里得到什么。数据 SLA 是分析团队及其利益相关方之间就数据的预期新鲜程度达成的协议。

当新数据对业务产生有意义的影响时,这就是团队应该关心的时候。回到分析团队项目的例子,如果发生欺诈事件(如数百个欺诈订单),时间是至关重要的。3 小时的数据 SLA 可能导致企业损失数千美元,而不是不到 100 美元。

当新鲜感迫不及待时—提示 CDC,或改变数据捕捉。CDC 工具读取数据库上的更改日志,并在目标数据中模拟这些更改。如果数据管道遇到错误,这可以很容易地重新运行。

借助实时变更日志,CDC 工具可以近乎实时地保持两个数据存储(生产数据库和分析仓库)完全相同。然后,分析团队对新鲜的数据进行分析。

CDC 入门

作者图片

最常见的生产事务数据库是 PostgreSQL 和 MySQL,它们都已经存在了几十年。作为目标而不是来源,仓库通常不会以同样的方式支持 CDC(尽管这也在发生变化)。

要为 CDC 设置源数据库,您需要:

  • 确保 WAL(预写)日志已启用,并且 WAL 超时足够长。这直接发生在数据库设置中。
  • 确保基于 CDC 工具的当前规范将归档日志存储在源上。
  • 创建一个复制槽,CDC 工具可以在其中订阅更改日志。
  • 监控源和目标数据库基础架构,确保两者都不会过载。

在源数据库上,如果一行数据更改为 A,然后更改为值 B,再更改为 A,那么这种行为会在目标仓库上重演。重放确保了数据的完整性和一致性。

虽然存在像 Debezium 这样的开源 CDC 解决方案,但托管 CDC 解决方案允许用户更少地担心基础设施,而更多地担心管道的业务规范,这是他们的业务所特有的。

作为开发工具的分析和上市顾问,我以前在 Perpay 领导数据工程职能,并建立了一个变更数据捕获堆栈。在我看来,变更数据捕获不仅仅是实时分析。这是将数据从运营数据库复制到分析系统的最可靠、最可扩展的方式,尤其是在下游延迟要求很高的情况下。

比较比率时,要小心混淆效应

原文:https://towardsdatascience.com/when-comparing-rates-beware-of-confounding-effects-44ebd097356f

Niklas Ohlrogge 在 Unsplash 上拍摄的照片

通常,我们使用包含代表比率的变量的数据集,我们使用这些变量在组之间进行比较或作为模型中的因素。为了使这些比较更有意义或更准确,我们需要校正这些比率中可能的混杂效应,并使用调整后的比率。

什么是混杂?

混杂是指自变量和因变量之间的关系受到一个或几个其他变量的影响。例如,如果我们想比较两组人的死亡率:一组饮酒量低,另一组饮酒量高,我们需要确保其他因素不会对结果产生大的影响。如果我们的低度消费者都是老年人和电视迷,而我们的重度饮酒者都年轻健康,从这项研究中得出结论可能会很复杂。

混淆的例子(图片由作者提供)

另一个例子是当比较国家之间的新冠肺炎死亡率时。撇开计算 Covid 死亡的不同标准的问题和关于 Covid 死亡或与 Covid 有关的问题,我们可以想知道各国是否有比其他国家更好的策略。让我们以西班牙和爱尔兰为例。在本文中,我们将使用基于略微不同的时间框架的官方数据,只是为了展示标准化的技术,而不是得出一个明确的结论。西班牙通常被认为是欧盟中受影响最大的国家之一,爱尔兰因其新冠肺炎管理而受到称赞。我们发现西班牙和爱尔兰的数字如下:爱尔兰每百万居民死亡 1145.32 人,西班牙每百万居民死亡 1885.95 人,高出 65%!这些价格被称为原油价格。但是西班牙和爱尔兰的人口结构非常不同,如下图所示。西班牙是一个更老的国家,平均年龄为 44.9 岁,而爱尔兰的平均年龄为 38.2 岁。

比较爱尔兰和西班牙的人口(图片由作者提供)

那么,如何才能做到“控龄”呢?主要有两种方法,间接法和直接法。

间接法

对于间接法,我们使用参考人群(例如爱尔兰人群)按年龄细分的比率,并根据爱尔兰的比率计算研究人群(在本例中为西班牙)的预期值。然后我们可以计算 SMR(标准化死亡率):

让我们来看一个例子,在下面的表格中,我们看到了爱尔兰按年龄分类的死亡率(大约,因为两国官方统计的年龄分类不同)。然后,我们简单地将爱尔兰每个年龄组的比率应用于西班牙人口,如表 1 所示。

表 1:以爱尔兰为参考人群的间接方法(按作者分类)

因此,SMR 是观察到的死亡总人数(87,905)除以将爱尔兰比率应用于西班牙人口后的预期死亡人数(87,218),87,905/87,218 = 1.01。如果年龄分布相似,这两个国家会有相似的表现。

我们也可以计算 SMR 的置信区间,可以使用各种方法(见乌尔姆,1990)或在线计算器,使用范登布鲁克近似:https://www.openepi.com/SMR/SMR.htm

直接法

对于直接法,我们使用一个标准的参考群体。它可以是任何人群,这并不重要。在欧洲,统计学家经常使用欧洲标准人口(ESP),理论人口加起来有 10 万。

因此,我们将西班牙和爱尔兰的年龄组比率投射到 ESP 上,以获得预期比率。如果这两个国家的年龄结构与 ESP 相同,则这些比率称为年龄标准化比率(ASR)。然后我们可以比较这个假想总体的两个比率:绝对差、百分比差或比率。

下面我们可以看到,西班牙的死亡率是每 100,000 人中有 169 人死亡,爱尔兰是 166 人死亡,这也是与我们的粗略死亡率非常不同的结果。

表 2:直接法,以欧洲标准人口作为参考人口(作者提供的表格)

然后可以将这两个比率添加到我们的数据集中,以建立更准确的模型。

如果我们的数据集只包含原始费率,我们可能需要使用单独的数据集来进行这些修正,并添加调整后的费率/

那么安科瓦和回归呢?

如果我们使用年龄作为变量之一运行 ANCOVA 或回归模型,我们会得到类似的结果吗?如果我们看一下每个年龄组每 100,000 人死亡率的对数图,我们会看到西班牙的数字略高(黄线):

对数(每 100,000 人的死亡率)与平均年龄,按国家分类(图片由作者提供)

但是在运行一个回归后,我们可以看到,只有变量年龄和变量国家没有统计学意义(p 值:0.2)。年龄和国家之间也没有任何互动。

Call:lm(formula = log_deaths_prop ~ MedianAge + country + MedianAge *country, data = covid)Residuals:Min 1Q Median 3Q Max-0.9192 -0.3084 0.1060 0.2702 0.8555Coefficients:Estimate Std. Error t value Pr(>|t|)(Intercept) -2.138301 0.213343 -10.023 4.34e-11 ***MedianAge 0.104358 0.004267 24.458 < 2e-16 ***countrysp 0.395764 0.301712 1.312 0.200MedianAge:countrysp -0.002458 0.006034 -0.407 0.687— -Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 0.4549 on 30 degrees of freedomMultiple R-squared: 0.975, Adjusted R-squared: 0.9725F-statistic: 390.7 on 3 and 30 DF, p-value: < 2.2e-16

结论

我们看到,当比较数据集中任何类型的比率时,我们需要小心并控制潜在的混杂因素,使用调整或标准化的比率会对任何模型产生很大影响。这可能发生在许多实例和领域中:在在线营销中,我们可能会看到 CTR(点击率)或转换率因设备类型(例如移动设备与笔记本电脑)或一天中的时间而异,优化时需要针对这些因素进行调整。

来源和附加链接

https://dc-covid.site.ined.fr/en/data/spain/

https://data.cso.ie/

https://es . statista . com/estadisticas/1125974/新冠肺炎-波森塔耶-德-法勒西米恩托斯-波尔-埃达德-y-genero-en-espana/

[https://www . isd Scotland . org/products-and-services/GPD-support/population/standard-populations/#:~:text = The % 20 European % 20 standard % 20 population % 20(ESP,is % 20 originally % 20 introduced % 20 in % 201976](https://www.isdscotland.org/products-and-services/gpd-support/population/standard-populations/#:~:text=The European Standard Population (ESP,was originally introduced in 1976)

https://ourworldindata . org/grapher/covid-deaths-daily-vs . total-per-million

计算标准化死亡率置信区间的简单方法。美国流行病学杂志 1990;131(2):373–375。

数据科学什么时候成了机器学习的代名词?

原文:https://towardsdatascience.com/when-did-data-science-become-synonymous-with-machine-learning-2d7d9f93f4ca

机器学习只是数据科学众多不同方面的一小部分。

Unsplash 上的 Shubham Dhage 拍摄的照片

许多刚刚开始接触数据科学的人对这个领域有一种虚幻的想法,认为它是一个温床,日复一日,一小时又一小时,一秒又一秒地产生最先进的机器学习算法。虽然推出很酷的机器学习模型是工作的一部分,但这远不是你作为数据科学家唯一要做的事情。

事实上,数据科学涉及相当多的不那么光彩的繁重工作,甚至使可用的数据语料库适合于分析。根据数据科学家 Vicki Boykis 在 2019 年进行的 Twitter 民意调查,不到 5%的受访者声称将大部分时间花在 ML 模型上[1]。最大比例的数据科学家表示,他们的大部分时间都花在清理数据以使其可用上。

一旦清理干净,就会有大量与机器学习无关的数据处理和分析任务要做。在本文中,我将从两个角度讨论这个话题:1)数据科学中经常被忽视的方面,以及 2)盲目关注机器学习可能带来的潜在问题。

数据科学是什么?

数据科学的核心是从数据中收集有意义的见解。关于这个定义,有两件重要的事情需要理解:1)数据几乎永远不会以有助于分析的便利状态可用,2)推理建模(即机器学习)远不是从数据中提取洞察力的唯一方式。

我大四的时候,学校的计算机科学系开始开设一门新的专题课程——CS 194:数据工程。该课程旨在教授学生如何通过专注于现实应用的项目来管理大规模数据——两位教授都是成功的专注于数据的创业公司的创始人。该课程将自己定位为教授学生整个数据科学生命周期,并帮助他们成为成功的数据工程师和科学家。

如果你看一下的课程大纲【2】,你会注意到机器学习只是课程描述的一小部分。事实上,快速浏览一下主页[3]就会发现一个详细的主题列表,其中很少有与机器学习相关的。

那么,这门课教什么呢?前几周主要关注数据结构化、查询和清理。这一点很重要——大多数数据科学课程都给学生提供了很好的数据集,让他们可以处理并专注于分析部分。从教育学的角度来看,这有一定的道理,但也有误导性。现实世界中的数据几乎永远不会是您想要的形式,您的大部分工作将涉及结构化和处理数据,以使其完全可用。

课程的后半部分讨论了处理数据的各种方法,包括汇总、可视化(我自己的研究领域)、近似、并行化等等。每一个都是一个详细的主题,应该有自己的文章来公正地对待它,但我在这里的观点很简单:有许多方法可以洞察数据,机器学习只是其中之一。

盲目应用机器学习会出什么问题?

好的数据科学不仅仅是数字。

我是华盛顿大学以人为中心的数据科学实验室的一名学生,虽然我热爱编程和定量分析,但并非所有实验室成员都是如此。事实上,我有一个经常合作的人,他从来没有写过一行代码,但他写了大量关于机器分类、推荐系统和一堆似乎与机器学习直接相关的其他主题的研究论文。

怎么会?好吧,和他谈谈,他会告诉你他的目标是推进数据科学人类的一面,这样他就可以影响这个领域变得更加多样化、公平和包容。我们在今天的先进技术中看到的许多问题,如带有种族偏见的面部识别算法,都是从数据科学的限制性实践中产生的,这些实践未能解释数据本身的偏见,这是一种被纯定量方法忽略的衡量标准。通过使用定性研究方法和伦理设计原则,像我的实验室伙伴这样的研究人员希望在未来几年改变这种情况。

要点很简单:今天部分数据科学仍然存在伦理问题的原因是因为对纯机器学习的无情和毫无根据的痴迷。如果我们要改善这一领域的发展,就必须转变我们的视角。

最后的想法

数据科学是一个新兴的领域,将其简化为一个概念是一种曲解,往好里说是错误的,往坏里说是危险的。要想在这个领域取得整体上的成功,有必要消除似乎只注意机器学习的流行文化狭隘观点。

用其他学科的类比可能更容易理解。将数据科学简化为机器学习类似于将计算机科学简化为构建 iOS 应用。或者,举一个不太专业的例子,这就像认为烹饪艺术只涉及漂亮、闪亮的甜点。但是就像为了让甜点有意义,你必须首先适当地烹饪整顿饭一样,如果你推出这种模式,你需要做相当多的重要工作。

但是如果你愿意做所有其他的事情,它会让你最终的模型变得更好。如果没有别的,记住这一点。

下次见,伙计们!

参考

[1]https://twitter.com/vboykis/status/1089920316644704256?s=20
【2】https://cal-data-eng.github.io/syllabus/
【3】https://cal-data-eng.github.io/

想擅长 Python? 获取独家、免费获取我简单易懂的指南点击 。想在介质上无限阅读故事?用我下面的推荐链接注册!

https://murtaza5152-ali.medium.com/?source=entity_driven_subscription-607fa603b7ce---------------------------------------

什么时候放弃是有成效的

原文:https://towardsdatascience.com/when-giving-up-is-productive-5a9b1189ea2c

识别失败的数据科学项目的信号

布雷特·乔丹在 Unsplash 上的照片

顽强地攻克每一个难题,但不要对明显的失败视而不见。

数据科学充满了左转和死胡同。这是好奇心的副产品,为了回答那些不太了解的问题,我们不得不遵循这种好奇心。我发现大多数数据科学家在遇到他们不知道答案的问题时都会感到兴奋。通常找到这个答案会带来非凡的东西,或者至少教会你一些你以前不知道的东西。问题是,要知道在荒野深处用弯刀导航和承认自己迷路之间的区别,是时候呼叫空运出森林了。

重点不是寻求失败——而是快速失败

我们从不承担一个认为行不通的项目。你可能会接受一些具有挑战性的、未知的、你还不知道如何解决的新事物;但是你的跋涉总是从寻找答案的意图开始。这些往往是最富有成效的事业,导致惊人的结果。只是有时我们发现,经过多次尝试,答案就是遥不可及…而且并不总是显而易见的。

在我们继续徒步旅行的类比时,请不要离开我。当你在路上时,你可以将你的周围环境与你在地图上的预期路线进行比较。三角测量你所处的位置需要技巧,有些人比其他人更精通,但是你有一个总的向导知道你什么时候偏离了航向。这并不意味着当你发现自己处于意想不到的地方时,你会放弃徒步旅行,这只是意味着你需要重新调整以确保你到达最终目的地。花时间去探索是体验的一部分。然而,如果你发现自己找不到回来的路线,那么是时候停下来,评估一下情况,考虑跳伞,而不是漫无目的地四处游荡。

所以我们需要的是一张数据科学项目的地图。我们如何确定我们已经偏离了正确的轨道?我们该如何克服自己“不用了,我懂了,都挺好”的固执?当我们迷路时也是这样。花点时间评估一下情况,问自己几个关键问题,对自己诚实。

评估形势

Unsplash 上的 Mael BALLAND 拍摄的照片

你对这 5 个问题的回答会让你把暂时的沮丧和闷烧的垃圾箱区分开来(或者它已经着火了,你只是在享受温暖)。

1.我现在对原问题的理解比开始的时候更好了吗?

如果你不能更详细地阐述这个问题,或者对幕后的细枝末节有更好的把握,那么你可能需要探索更多。即使是最模糊的项目,你越做越清晰,所以不要把它归因于一个糟糕的请求。也许答案不在您正在处理的当前数据集中,也许是时候对其他 SME 进行采访了,或者您可以作为用户亲自体验这一过程。不管怎样,这是一个信号,在对这个问题了解得更多之前,不要跳槽。

简化的数据科学流程—作者图片

需要明确的是,这个决定不是在问题发现阶段做出的。当然,你会与中小企业见面,花时间了解要求。如果你没有进行任何探索性的分析,或者至少尝试过某种形式的建模,那么你还不够深入。尽管面试很重要,但我们永远不应该打电话放弃面试。不管从他们的角度来看这个问题是否棘手,我们仍然需要给它一个体面的机会。

2.我知道它为什么不起作用吗?

好吧,你知道得更多,太棒了,你已经运行了多个实验,酷——输出仍然是垃圾。好吧,放松点。是不是因为你没有 X 功能所以不行?您的培训记录是“已完成”的数据,生产运行是“进行中”的记录吗?这似乎是显而易见的,但诚实地问自己是否知道为什么它很糟糕,并隔离任何障碍。受项目影响的人对找出帮助你克服它们的方法不感兴趣是非常罕见的。随便问问。

以下是一些常见问题,有助于您更深入地探究:

  • 如何更好地可视化我的功能或结果?
  • 训练中表现稳定的速度有多快?
  • 是否有任何特征未被规范化(如果与模型相关)?
  • 与生产数据相比,我的培训/测试数据有多旧?
  • 某些细分市场比其他市场表现更好吗?

3.我还有什么想法可以尝试?

现在墙上的头状凹痕似乎在加深。确保你的想法不是出于绝望。如果你已经周而复始几个星期或几个月,你扔东西在墙上只是为了看看它是否坚持,那么你可能没有真正的想法来尝试。我不是说在项目上疯狂投入有时不会带来有趣的成功。我指的是这样一个事实,你正在阅读这篇文章,到目前为止已经深入了 3 个问题。真正评估你是否有合理的想法。如果是这样的话,那就把它们写下来,一旦你在列表的末尾没有进一步的成功,那么这可能是值得一提的。

有许多技术取决于模型类型、数据量、类的平衡等等——这本身就值得一篇文章。然而,我想给你一些指导。以下是我体验过的提供最大好处的技术。

  • 首先应用弱学习者,或者基于关键特征分割数据并训练单独的模型。这可能会导致部署一个集合模型,或者简单地了解更多关于您的数据片段并增强您以前的模型。
  • 除了基本的上采样或下采样,尝试更高级的方法来解决类别不平衡。这是假设你一开始就解决了阶级不平衡的问题…你已经解决了,对吗?
  • 使用较少的功能。可能对一些人来说听起来不直观,但是我们经常把自己的偏见注入到我们认为预测应该如何工作中。这一步尝试起来简单得可笑,有时可能会让我们大吃一惊。
  • 简化模型。复杂的问题通常不需要复杂的解决方案。体验这一点的一个好方法是与谷歌的 Tensorflow 游乐场互动,更多的层和神经元!=更智能的模型。

4.因为这个我没有在做什么?

无论你是在做个人项目还是专业项目,很有可能还有其他事情在等着你。如果不是,那么继续你的车轮可能没有太大的伤害。我想事实并非如此。它甚至可能不是另一个数据科学项目,也许这是在占用你上新课的时间。如果真的需要,你可以(通常)回到这个项目,再试一次。这是一个很大的问题,真正的问题是你的时间用在其他地方是否会更好。花点时间认真思考一下。

5.我学到新东西了吗?

我把这作为最后一个问题留给那些和我一样讨厌失败感的人。你可能已经为此倾注了一切,但你就是不想放手。可能你不能回答这个问题,但是这样做你对你只是初学者的东西有了更深的理解。或者你学到了一种你以前从未听说过的方法。这是成长的缩影。这次尝试,虽然没有完全成功,但对你未来的能力做出了有意义的贡献。不要低估它的价值。我不怀疑你开始你的数据科学之旅,从事无意义的项目,只是为了学习如何建立一个神经网络。如果你发现了其中的价值,为什么你在这次尝试中没有发现类似的价值呢?

向前看意味着什么

布雷特·乔丹在 Unsplash 上的照片

你可能已经注意到我没有提到任何关于“没有完成项目的后果是什么”。我发现回答这个问题通常是不相关的。如果这个项目最初被认为没有价值,你就不会开始。为什么从你开始到现在,重要性会发生变化?回答你为什么在穷乡僻壤开始徒步旅行,并不能帮助你判断你有多迷路。

即使风险很高,跳槽仍然让你不舒服,那就吸取你现在的教训,重新思考这个问题。也许你不能解决整个问题,但是有些部分是可以解决的。或者,您可以发现一个更适合数据科学解决方案的相关问题。不要害怕承认你的时间用在其他地方可能会更好。

"当我们允许自己失败时,我们同时也允许自己超越。"― 埃洛伊塞·里斯塔德

贝叶斯机器学习实际上什么时候有用?

原文:https://towardsdatascience.com/when-is-bayesian-machine-learning-actually-useful-1fd8af456e4c

关于一个有点争议的范式的个人想法

Javier Allegue Barros 在 Unsplash 上拍摄的照片

介绍

当谈到贝叶斯机器学习时,你可能要么喜欢它,要么更喜欢与任何贝叶斯保持安全距离。鉴于当前最先进的模型几乎从未提及贝叶斯,后者背后可能至少有一些基本原理。

另一方面,许多高知名度的研究小组几十年来一直在研究贝叶斯机器学习工具。现在仍然如此。

因此,这个领域也不太可能完全是骗人的。正如生活中经常发生的那样,真相可能介于两个极端之间。在这篇文章中,我想分享我对这个问题的看法,并指出贝叶斯机器学习何时会有所帮助。

为了避免混淆,让我们简要定义一下贝叶斯机器学习在本文中的含义:

“机器学习的贝叶斯框架指出,你首先列举数据的所有合理模型,并为这些模型中的每一个分配你的先验信念 P(M)。然后,在观察数据 D 的基础上,你评估这些数据在每个模型下计算 P(D|M)的可能性有多大。”

T5【邹斌】格拉马尼

不太正式的是,我们将来自贝叶斯统计的工具和框架应用于机器学习模型。我会在最后提供一些参考,以防你还不熟悉贝叶斯统计。

此外,我们的讨论基本上将机器学习等同于神经网络和一般的可微分模型(特别是线性回归)。由于深度学习目前是现代机器学习的基石,这似乎是一种公平的方法。

作为最后的免责声明,我们将区分 frequentist 和贝叶斯机器学习。前者包括你可能已经熟悉的标准 ML 方法和损失函数。

最后,事实上‘贝叶斯’是用大写字母写的,而‘frequentist’不是,没有判断的意思。

现在,让我们从一个令人惊讶的结果开始:

你的频率主义模型可能已经是贝叶斯的了

这种说法听起来可能令人惊讶和奇怪。然而,贝叶斯和频率主义学习范式之间有一个清晰的联系。

让我们从贝叶斯公式开始

作者图片

并将其应用于贝叶斯神经网络:

作者图片

作为一个示例,我们可以

作者图片

即网络输出定义了目标变量的平均值,该平均值可能遵循正态分布。对于网络上的先验权重——假设我们总共有 K 个权重——我们可以选择

作者图片

具有 (2)(3) 的设置对于贝叶斯神经网络来说是相当标准的。为 (1) 寻找后验权重分布在贝叶斯网络的任何合理设置中都是徒劳的。这对于贝叶斯模型来说也不是什么新鲜事。

我们现在有几个选项来处理这个问题,例如 变分贝叶斯最大后验估计 (MAP) 。从技术上讲,后者只给出了后验最大值的点估计,而不是完整的后验分布:

作者图片

假设概率密度在其定义域上严格为正,我们可以引入对数:

作者图片

由于最后一个被加数不依赖于模型参数,它不影响 argmax 。因此,我们可以不考虑它。

从贝叶斯映射到正则化均方误差

方程式 (2)(3) 的目的仅仅是说明性的。让我们用下面的内容代替可能性和先验:

作者图片

Z 项是归一化常数,其唯一目的是产生有效的概率密度。

作者图片

当一个函数的最大值等于反函数的最小值时,我们可以写成

作者图片

最后, argmax 也不受与常数相乘的影响:

作者图片

最后一项只不过是带有正则化的标准 MSE 目标。因此,给定特定的先验和似然性,正则化的 MSE 目标等价于贝叶斯映射目标。

如果你反过来,你可以找到几乎任何频率损失函数的先验概率对。然而,常客目标通常只给你一个点的解决方案。

贝叶斯方法,另一方面,给你一个完整的后验分布,上面有不确定性区间。使用 无信息先验分布 你也可以在必要时移除正则项。然而,我们不会在这里讨论推导。

贝叶斯机器学习在现实世界中的代价

因此,理论上,贝叶斯机器学习比频率主义方法产生了更完整的图像。然而需要注意的是后验分布的困难性,因此需要对其进行近似或估计。

然而,近似和估计都不可避免地导致精度损失。以流行的贝叶斯神经网络的变分推理方法为例。为了优化模型,我们需要通过从变分分布中取样来近似一个所谓的 ELBO 目标。

通常的 ELBO 物镜看起来是这样的——如果您不理解所有内容,也不要担心:

作者图片

我们的目标是最大化 (7) 或者最小化它的负值。然而,期望项通常不是难以处理的。这个问题最简单的解决方法是应用 重新参数化技巧 。这使我们能够估计厄尔巴维亚

作者图片

梯度运算的线性允许我们通过 (8) 估算 (7) 的梯度:

作者图片

使用这个公式,我们基本上是从一个重新参数化的分布中采样 M 个梯度。此后,我们使用这些样本来计算“平均”梯度。

ELBO 的无偏梯度估计

Kingma 和 Welling (2013) 的里程碑式论文所示,我们已经

作者图片

本质上,等式 (9) 告诉我们,平均而言,我们基于采样的梯度等于真实梯度。 (9) 的问题在于我们对采样梯度的高阶统计矩一无所知。

例如,我们的估计可能有一个非常大的方差。因此,虽然我们平均在正确的方向上梯度下降,但我们的效率低得不合理。

由于重采样导致的额外随机性也使得难以找到梯度下降的正确停止时间。再加上非凸损失函数的问题,你在非贝叶斯网络中表现不佳的几率相当高。

总之,贝叶斯世界中的真实后验可以给我们一个关于最优参数的更完整的描述。然而,由于我们需要求助于近似值,我们很可能以比标准方法更差的性能结束。

贝叶斯机器学习实际上什么时候有意义?

以上考虑引出了一个问题:你到底想不想使用贝叶斯机器学习。就我个人而言,我看到了两种特殊的情况。请记住,以下是经验法则。支持或反对贝叶斯机器学习的实际决定应该基于手头的具体问题。

贝叶斯机器学习实际上什么时候有用?一个简单的指导决策树—始终适应您的具体问题。(图片由作者提供)

小数据集和丰富的先验知识

让我们回到之前的正则化 MSE 推导。我们的目标是

作者图片

在数据集的大小 N 和模型参数的数量 K 之间存在明显的权衡。对于足够大的数据集,右侧的先验与地图解决方案无关,反之亦然。这通常也是后验推理的一个关键特性。

后验分布的形象化表现。更多的数据使后验更接近数据。更少的数据使得它越来越类似于先验分布。(图片由作者提供)

当数据集相对于模型参数的数量很小时,后验分布将非常类似于先验分布。因此,如果先验分布包含关于问题的合理信息,我们可以在一定程度上缓解数据的缺乏。

以简单的线性回归模型为例。根据信噪比,在参数收敛到“最佳”值之前,可能需要大量数据。如果你有一个关于“最佳”解决方案的合理的先验分布,你的模型实际上可能收敛得更快。

1)由于小数据集和随机噪声,普通 OLS 回归线是关闭的(图片由作者提供)

2)在任何模型拟合发生之前,一个消息灵通的先验已经产生了一个合理的范围(图片由作者提供)

3)在“训练”之后,贝叶斯模型产生一条预测平均回归线,该预测平均回归线更加接近数据生成回归线(图片由作者提供)

然而,恰恰相反,你同样可以通过使用错误的先验知识来搞乱你的模型。结果,收敛到“最佳”解可能比没有任何先验知识更慢。贝叶斯统计中有更多的工具来减轻这种合理的异议,我渴望在未来的文章中讨论这个主题。

此外,即使你不想完全贝叶斯,地图估计仍然是有用的给定高质量的先验知识。

现代贝叶斯机器学习的功能先验

一个不同的问题可能是在神经网络权重上表达有意义的先验知识的困难。如果模型是一个黑盒,你如何告诉它该做什么?除了一些模糊的零均值正态分布?

解决这个问题的一个有希望的方向可能是 功能贝叶斯 。在这种方法中,我们只告诉网络,基于我们的先验知识,对于给定的输入,我们期望什么样的输出。因此,我们只关心我们的模型能够表达的后验函数。确切的参数后验分布只是次要的。

简而言之,如果你只有有限的数据,但有充分的先验知识,贝叶斯机器学习实际上可以有所帮助。

不确定性量化的重要性

对于大型数据集,您的先验知识的影响变得越来越不相关。在这种情况下,获得一个 frequentist 解决方案可能是完全足够的和优越的方法。然而,在某些情况下,全貌——也称为后验不确定性——可能很重要。

考虑基于某种机器学习模型做出医疗决策的情况。此外,该模型并不产生最终决定,而是支持医生的判断。如果贝叶斯点精度至少接近一个 frequentist 等效,不确定性输出可以作为有用的额外信息。

假设专家的时间有限,他们可能想更仔细地研究高度不确定的模型输出。对于低不确定性的输出,快速的健全性检查可能就足够了。这当然首先要求不确定性估计是有效的。

因此,贝叶斯方法也带来了监控不确定性性能的额外成本。当决定是否使用贝叶斯模型时,这当然应该被考虑在内。

贝叶斯不确定性可以发挥作用的另一个例子是时间序列预测问题。如果您以自回归方式对时间序列建模,即您估计

作者图片

你的模型误差越大,你就越想预测未来。

即使对于高度简单的自回归时间序列,如

作者图片

你估计模型中的微小偏差

作者图片

从长远来看,会导致灾难性的误差积累:

作者图片

一个完整的事后分析可以更清晰地描绘出其他类似的可能情况会如何发展。即使模型平均来说可能是错误的,我们仍然可以了解不同的参数估计如何影响预测。

具有不确定性的贝叶斯预测(紫色)与频率点预测(红色)。虽然从长期来看,frequentist 预测稍微更准确,但贝叶斯不确定性区间正确地包含了已实现的平均轨迹。(图片由作者提供)

最后,如果最后一段让你对尝试贝叶斯机器学习感兴趣,这里有一个很好的方法可以开始:

MC 辍学的贝叶斯深度学习之光

幸运的是,如今训练贝叶斯模型的成本并不太高。除非您正在处理非常大的模型,否则贝叶斯推理增加的计算需求应该不会有太大问题。

贝叶斯推理的一个特别直接的方法是 MC dropout 。后者是由 Gal 和 Ghahramani 引入的,并且已经成为一个相当流行的工具。总之,作者表明在模型的训练和推断过程中使用辍学是明智的。事实上,这被证明等同于具有特定的、基于伯努利的变分分布的变分推断。

因此,MC 辍学可以是一个很好的起点,使你的神经网络贝叶斯化,而不需要太多的前期工作。

利弊

一方面,MC dropout 使得建立现有的贝叶斯模型变得非常简单。您可以简单地用 dropout 重新训练它,并在推断过程中保持 dropout 打开。您以这种方式创建的样本可以被看作是从贝叶斯后验预测分布中抽取的。

另一方面,MC 丢失中的变分分布是基于伯努利随机变量的。理论上,这应该使它比普通的高斯变分分布更不精确。然而,构建和使用这个模型非常简单,只需要普通的 Tensorflow 或 Pytorch。

此外,对这种方法的有效性也有一些更深层次的批评。这里有一个有趣的争论,涉及到作者之一这里

无论你从这种批评中得到什么,MC Dropout 都可以成为更复杂方法的有用基线。一旦你掌握了贝叶斯机器学习,你就可以尝试用更复杂的模型来提高性能。

摘要

我希望这篇文章能让你对贝叶斯机器学习的有用性有所了解。当然,它不是灵丹妙药,在很多情况下,它可能不是正确的选择。如果你仔细权衡利弊,贝叶斯方法可能是一个非常有用的工具。

另外,我很高兴就这个话题进行更深入的讨论,无论是在评论中还是通过私人渠道。

贝叶斯统计参考文献

[1] Gelman,Andrew 等,“贝叶斯数据分析”。CRC 出版社,2013 年。

[2]约翰·克鲁施克。"做贝叶斯数据分析:与 R,JAGS 和斯坦的教程."学术出版社,2014。

[3]西维亚、德文德吉特和约翰·斯基林。"数据分析:贝叶斯教程."OUP 牛津大学,2006 年。

原载于 2022 年 1 月 27 日【https://sarem-seitz.com】

当语言遇到数据

原文:https://towardsdatascience.com/when-language-meets-data-9cb38e6e2275

从聊天机器人到情感分析,我们看到文本数据的真实使用案例激增。人工智能中一些最热门的创新围绕着用越来越多的文本训练的模型;另一方面,我们可以追踪该领域面临的许多挑战,这些挑战来自有限的、不具代表性的或完全有偏见的语言数据集。

本周,我们分享了六篇最近的帖子,这些帖子通过广泛的主题和方法涵盖了数据和语言——NLP 粉丝将会有一场爆炸,但程序员、数据工程师和人工智能爱好者也会有。让我们开始吧!

  • 【墙上所有大型语言模型碰到(目前) 。GPT-3 和类似的生成模型可以产生听起来真实的文本,即使它缺乏真实性。 Iulia Turc 探讨了这些模型的基础问题——“将他们的陈述基础化为现实的能力,或者至少将它们归因于一些外部来源”——以及为什么开发接近人类表现的模型如此困难。
  • 自然语言查询正在引起轰动 。直到最近,人类不得不发明(然后学习)复杂的语言,以便与计算机交流和处理数字数据。 Andreas Martinson 讨论了 NLQ 的新兴世界——自然语言查询——以及它如何更好地改变数据专业人员的工作,并使数据库访问民主化。
  • 选择合适的工具简化复杂的 NLP 任务 。笨重的和流线型的工作流程之间的区别有时可以归结为看似微不足道的选择。 Kat Li 调查了五个鲜为人知的 Python 库——从 Pyspellchecker 到下一个单词预测——并解释了它们如何在正确的 NLP 上下文中使用时节省时间和精力。

Unsplash 上的 4motions Werbeagentur 拍摄的照片

  • 如何将你从文本中获得的发现转化为引人注目的视觉效果 。如果你有修修补补的心情,你会喜欢Petr kolab的最新教程。超越通常的嫌疑人——看着你,字云!—本教程将带领我们创建更高级(更精致)的可视化效果,包括和弦图和打包气泡图。
  • 关于算法和拼写 。在一个整洁的新项目中, Socret Lee 构建了一个高棉语拼写检查器,作为一个更大的键盘应用程序的一部分。Socret 的文章耐心地解释了这一过程,并聚焦于对该工具的实现至关重要的两个概念:BK 树和编辑距离。
  • 当情感分析、流行文化、社交媒体碰撞 。一个受欢迎的网飞节目的新一季提供了分析文本(和表情符号)的完美机会!)按比例。阿曼达·伊格莱西亚斯·莫雷诺的最新文章利用 Twitter API 研究了关于摄政时代的推文中的极性。

TDS 上总是有更多的东西可以探索,所以我们希望你仍然有一些时间和精力阅读一些其他主题的优秀读物;我们只是不能和你分享这些。

一如既往地感谢你的热情和好奇心。为了支持我们发布的工作,考虑在 Twitter 或 LinkedIn 上分享你最喜欢的文章,告诉你的数据科学同事关于我们的情况,和/或成为一名媒体成员

直到下一个变量,

TDS 编辑

何时不使用神经网络

原文:https://towardsdatascience.com/when-not-to-use-neural-networks-a97608dbd3f6

模型选择指南和正确选择的不存在

艾莉娜·格鲁布尼亚克在 Unsplash 上的照片

答前一阵子,一个朋友问我一些挑选 AI 模型的指导。当时,他的大部分人工智能教育都围绕着神经网络及其许多变体。对他来说,他从课程中得到的理解是,神经网络强大到足以解决任何问题;它们总是正确的选择——为什么要学习其他技术呢?

老实说,我能理解。早在我开始机器学习之旅的那一天,我也对“较弱的模型”抱有怀疑——如果我们可以直接跳到支持向量机和人工神经网络,为什么要学习僵化的技术?幸运的是,我现在知道得更多了——我希望我的朋友也知道!

在这种情况下,我认为这实际上可能是一个比我想象的更频繁的问题。因此,我希望能揭示一些简单的模型在宏观事物中所扮演的角色。

如果你是一个初学数据的科学家,这是你特别感兴趣的,因为为每项任务选择正确的模型是你可以发展的最重要的技能之一。此外,模型选择是这样的事情之一,如果做错了,可能会破坏整个企业。最后,知道什么时候使用每个模型也可以指出你接下来应该研究哪些模型。

所以让我们从基础开始。

所有模型都是错的,但有些是有用的

乔治·博克斯的这句话立刻向我们指出了一个基本事实:所有的模型都是近似值。换句话说,没有正确型号正确选择。因此,根据定义,我们总是使用错误的模型。然而,这并不是说它们不能有用。

一个有用的模型是一个能给用户带来价值的模型:更大的利润,更低的成本,对问题的洞察力,有用的建议,一系列的行动,等等。

初学者的错误是认为准确性等于价值。例如,每个亚马逊页面都有几十个我永远不会购买的产品建议。就精确度而言,该算法的精确度接近 0%。然而,它偶尔的点击率所带来的额外收入每年会增加数十亿美元。同样,Medium 每天给我发送大约 20 条阅读建议,我可能会从中阅读一到两条——足以让我每天都访问该网站。准确性只是有用性冰山的众多冰山之一。

更具体地说,模型的有用性可以归结为以下四个属性:

  1. 可解释性:模型对它所解决的问题提供了多少信息
  2. 可解释性:能够解释其输出背后的原因
  3. 灵活性:描述复杂主题的能力有多强
  4. 复杂性:运营和培训的成本有多高

例如,当我们检查一个决策树时,我们学习它是如何解决问题的(可解释性),并且我们可以追踪哪些决策将一个输入带到了一个特定的输出(可解释性)。一棵树越深,它就越强大(灵活性)和昂贵(复杂性)。

另一方面,神经网络相当不透明。其权重很少或没有解释价值,也不能解释其推理。尽管如此,一个足够大的网络可以近似任何功能,尽管其成本很高。

这些属性的价值取决于问题。有些问题很直观,但很难形式化,比如识别人脸。这些问题通常受益于灵活但复杂的解决方案,如神经网络。其他的在一开始是不直观的,但是通常可以通过逻辑步骤来解决,比如接受/拒绝贷款请求。对于这些问题,一个更简单但更容易解释的模型可能是你最好的选择。

很明显,虽然神经网络很棒,但是它们缺乏一些关键的属性:可解释性和可解释性。因此,每当需要这两个属性时,神经网络可能不太适合这项任务。

剩下的就是理解这些属性何时是必不可少的。

经验法则

我的一个教授曾经漂亮地这样说:在 AI 内部,我们用简单的模型解决挑战性的任务,用复杂的模型解决简单的任务。因此,让我们一点一点地分解它:

  • 简单模型是经典的机器学习方法,如线性分类器、决策树、k 近邻等。一般来说,你可以在一个下午实现模型,而不需要太多的谷歌搜索或数学。
  • 难题是所有那些我们人类需要训练去解决的任务,在我们能想出一个好的答案之前需要一些时间去思考。例如,评估房子的价值、审查贷款提案、为病人决定行动方案等。
  • 复杂模型是所有的大量数值方法,如支持向量机和神经网络,或者更广泛地说,几乎所有的核方法和基于梯度的方法。你不太可能把自己编码成任何有用的程度,尤其是在没有大量谷歌搜索的情况下。
  • 简单的问题是我们每天都要解决的直觉任务。例如,当你看到一个你认识的人时,你不会停下来思考——你会立刻认出(1)这是一个人,(2)这个人是谁,以及(3)他的面部表情。事实上,你现在正在读这篇文章,而没有真正考虑字母的形状,或者每个音节如何与你内心听到的声音相对应。更有甚者,你甚至不知道你体内的数百万个神经元是如何连接的,所以你才能理解这一切。

改写我的教授的话,对人工智能来说容易的事情通常对我们来说很难。同样,对我们来说非常简单的事情,对机器来说却非常复杂。

根据这一推理,在直觉问题上,我们可以通过观察算法的输出来验证它们。我们不需要解释或见解。在大多数情况下,要求算法给出解释更像是一种调试工具,而不是你会用到的东西。

另一方面,在人类难以解决的问题上,检查算法的为什么是检查其推理是否可靠的最有力的方法之一。此外,这种推理通常有助于解决问题本身,例如向用户展示其贷款申请被拒绝的原因。

举个更复杂的例子,假设你训练了一个模型来预测房价。从理论上讲,这种模式应该以现实为基础。例如,在类似的社区里,大房子应该比小房子贵。同样的道理也适用于房间和楼层的数量——如果你不能解释模型的权重,你就永远无法真正确定它的行为总是恰当的。因此,选择一个更简单但可审计的模型是最安全的选择。

与此同时,当判断推文是积极的、中立的还是消极的时,更直接的技术,如从-1 到+1 的评分可能太简单了,无法评估讽刺、讽刺和打字错误等元素。此外,当生气时,人们可以创造一些有趣的新词,而没有词汇会有条目。在这种情况下,一个完全不透明的模型,比如单词嵌入或完全成熟的转换器,可能是最有效和可靠的方法。

最后,作为第二条经验法则,一个模型越强大,它就越不可解释。例如,虽然决策树是最容易审计的模型之一,但随机森林就不那么容易审计。同样,虽然 k-最近邻模型很容易理解,但高斯过程明显更加不透明。另一个例子是线性 SVM 模型与其所有内核变体相比,这是很难理解的。

在同一主题上,当构建模型时,这种效果通常不利于可解释性/可解释性方面。例如,在 PCA 特征上训练决策树比纯决策树方法可读性差得多。合奏也是如此。

复杂程度

为了方便起见,这里有一个(固执己见的)列表,列出了最常见的方法如何与可解释的复杂规模的概念相关联。

高度可解释/可解释的模型:所有线性模型、逻辑回归、决策树、k 近邻等。这些模型更多的是“算法”而不是“数学”

中间模型: boosters 和森林模型(如 XGBoost)、朴素贝叶斯、高斯过程等。一般来说,这一类别的方法要么是更简单模型的更强大版本(例如,从决策树到决策树),要么是更数学化的。

高级模型:核支持向量机、神经网络、贝叶斯模型等。这类方法通常是解决各种问题的唯一可行的方法,并且/或者被定制为拥有特定的特性(例如不确定性估计)。此外,它们的复杂程度也各不相同(例如,变压器 MLPs)。

边缘案例

就像生活中的所有事情一样,总有一些明显的方法不是你所需要的。这里有一个不完整的场景列表,在这些场景中,你可以用一个简单的模型代替一个复杂的模型,反之亦然。

计算机视觉任务:在处理图像和视频时,我们通常除了 CNN 和视觉变形器(vit)之外没有其他选择。但是,您使用的公式会显著影响模型的有用性。例如,分割/检测模型比图像分类器更容易解释(毕竟,它们告诉你物体在哪里)。探索混合方法也是值得的,例如使用 CNN 解析场景,使用更简单的模型推理结果。

当准确性成为优先事项时:回到房价预测器,对于一家公司来说,不惜一切代价获得最佳估计可能比强烈地意识到为什么更有吸引力。这同样适用于日内交易投资环境中的资产价值预测。在这种情况下,一个复杂的神经网络可能就是你所需要的多余的东西(只是要确保你永远记住,总有一天它会适得其反)

何时可解释性是优先考虑的:在某些环境中,比如医疗管道,拥有一个可解释的模型可能是法律要求,而不是选项。在这种情况下,您的最佳选择是使用仍然符合所需需求的最复杂的方法。这里的一个好建议是一个自动调谐 XGBoost 模型

使用插件:虽然我说过神经网络既不可解释也不可解释,但一些文献致力于解决这类问题。例如,人们可以使用 SHAP 值来获得对模型内部工作的一些有意义的见解。对于某些问题,这些混合方法可能已经足够了。然而,不要期望这能带来任何奇迹。

到目前为止,我们已经考虑了最近被称为“以模型为中心的方法”:给定一个问题,我们寻找解决它的最佳模型。虽然许多任务通常都是这样,但在现实世界中,问题也是可以改变的。例如,一个人经常可以在一个公司内重新构思问题,以更易于管理的方式解决它们。类似地,当试图提高模型的准确性时,人们可以只获取更多的数据点,而不是尝试所有最先进的技术(这是很多的)。

因此,在这篇文章的结尾,我想提醒你,现实世界提供了比你在大学学位里看到的更多的可能性。现实世界是以数据为中心的。尽管选择正确的模型非常重要,但也要确保你拥有优秀的数据。

他的一切都是为了现在。如果你对这篇文章或报纸有任何问题,请随时评论或与我联系。你也可以订阅每当我在这里发布就会收到通知。你也可以直接给我买杯咖啡来支持我

如果你是媒体新手,我强烈推荐订阅。对于数据和 IT 专业人员来说,中型文章是 StackOverflow 的完美组合,对于新手来说更是如此。注册时请考虑使用我的会员链接。

感谢阅读:)

当异常值显著时:加权线性回归

原文:https://towardsdatascience.com/when-outliers-are-significant-weighted-linear-regression-bcdc8389ab10

贝基尔·登梅兹在 Unsplash 上拍摄的照片

包含显著异常值的加权回归方法

离群者往往是淘气的。它们有可能扰乱一个简单的回归过程,因为它们将自己作为与其他数据同等重要的数据引入,往往会扭曲拟合的模型。一种直接的方法是在拟合模型之前,使用异常值检测方法将它们从数据集中移除。但是这有它的警告。有时,异常值可能很重要,并且对于构建适合数据的模型来说是必不可少的,这样它就可以代表所有的观察/测量结果。然而,这直接导致离群值扭曲拟合模型的问题。那么,如何解决这个问题呢?你猜对了,加权回归

加权回归被定义为“ 线性回归的推广,其中误差的协方差矩阵被并入模型 ”。简而言之,这意味着在数据科学家看来,并非所有的数据点都是平等的,这种不平等也应该反映在拟合的模型中。在将数据集拟合到回归模型的过程中,等式的不平衡可以通过一些技巧来缓解。这些技术包括:插入一个新的二进制列来标记异常值,以及赋予每个数据点相对于数据集其余部分的重要性权重。

对数据进行加权的艺术往往是模糊的。什么数据比另一个数据更重要?为什么呢?它应该受到多大的重视?数据科学家在尝试应用这种方法时应该问的所有好问题。一个简单的方法是使用一个异常稳健的回归模型,如 Huber 回归器,来达到这个目的。然而,还有许多更先进的方法来对数据进行加权,有些方法使用数据本身的先验知识,有些方法则应用更复杂的统计技术。本文将通过使用异常值检测和阈值方法来关注回归之前的数据加权。

首先,让我们加载并准备将用于拟合回归模型的数据。数据集 提示 是一个示例数据集,可从其在线存储库中的 Seaborn 库中获得。这个数据集是商业统计案例研究的一部分[1]。它由一家餐馆的一名服务员在几个月的时间里提供的 244 条小费组成。数据集有 6 个探索变量( X )和作为响应变量( y )的“提示”。除了变量“总账单”之外,其余的探索性变量都是分类变量。为了将这些分类变量用于回归,数据集需要一些准备工作。必须为分类变量创建虚拟变量(代表定性属性的存在与否)。同时,我们来看看数据集是如何分布的。

Tips 数据集的散点图。图片由作者提供,转载自 Seaborn 示例

我们现在有 8 个探索性变量,可以用来进行回归。从分布图中我们可以看到,单独使用变量“总账单”时,它与“小费”之间存在明显的线性关系。然而,在大约 25“总账单”标记处发生了有趣的事情,数据不再遵循与以前相同的线性关系。有人可能会说,可能有两个甚至三个可能的线性模型是建模该数据集所必需的。然而,本文的重点是单一加权回归拟合,而不是分段建模。从我们观察到的情况来看,周六和周日的晚餐似乎在“总账单”和“小费”的线性度上偏离最大。由于我们希望用单一的线性模型来拟合数据,因此这些数据点的权重可能需要与其他数据点有所不同,以便不会扭曲预测结果。在此之前,让我们创建一个基线回归模型,我们可以用它来比较不同权重的回归模型。

在不对探索性变量进行加权的情况下,我们得到的线性模型的 R 平方得分为 0.4699,均方误差为 1.011。正如上面在快速数据分析中提到的,单一线性模型对于该数据集来说过于简单。但是我们将继续沿着这条路走下去,看看通过给回归模型增加权重能做些什么。

首先,让我们讨论一下在回归建模中可以使用哪些类型的权重。

  • 连续权重:每个变量都有一个独特的权重,遵循某种概率分布函数(即高斯分布)。
  • 离散权重:特定变量或变量范围具有基于特定条件(即内点/外点)分配给它们的离散权重
  • 分段连续加权:连续加权和离散加权的组合

然后进一步解释和演示每种加权方法在回归中的应用。也许首先想象这些权重会更好。为此,将使用示例函数,其中 x 轴遵循标准化(0–1)异常值决策得分。这些分数是对某个值相对于数据集其余部分是异常值的可能性估计。因此,决策得分越高,就越有可能是异常值。然而,我不会深入探讨似然估计及其在加权回归中的数学应用,如果你想了解更多,我会建议你去阅读 加权线性回归 。y 轴代表我们的权重。所以,让我们想象一下!

Top:三种类型的连续加权函数。底部:一个离散的和分段连续的加权函数。图片由作者转载自 例题权重

虽然这是一个伟大的可视化,这意味着什么,你如何生成这些加权函数,我们如何将它应用于回归?从上面我们可以看到,我们有相当多的权重选项可供选择。所以,我们从连续加权型开始。我们将使用高斯函数作为对 tips 数据集进行加权回归的权重。为此,我们首先需要找到数据集的离群决策得分。这将通过使用可从PyOD获得的内核密度估计(KDE)异常值检测方法来完成。

通过使用连续加权函数,我们得到一个线性模型,其 R 平方得分为 0.4582,均方误差为 1.033。您可能会注意到,这种性能比没有加权的线性模型更差!那么,为什么 R 平方值更差的回归模型是更好的选择呢?我们只是在浪费时间吗?我们通过在回归模型中使用权重实现了什么?简单的回答是,这是意料之中的…

为了更广泛地解释这一点,虽然整体模型性能确实下降了,但对数据进行加权的目的是将更多的重要性分配给更有可能发生/测量的数据。因此,允许在数据中仍然重要的离群值对模型有贡献,但是对整个模型本身只有次要的重要性。因此,较低的模型性能并不表示拟合不佳。但是,它确实表明,也许我们衡量模型性能的方式现在应该改变了。

嗯,这一切都很好,但是现在如何准确地评估我们的加权模型性能呢?为此,这实际上把我们带到了第二种类型的加权。离散加权。让我解释一下。因为权重是离散的,对于我们的示例情况二进制。这意味着内点和外点之间有明显的区别。有了这种区别,一个新的数据集从原始数据集产生,用它来更好地评估我们的模型性能指标。内线。

为了做到这一点,我们将使用 和我公开参与的项目 来评估离群决策分数。因此,让我们将离散加权应用于加权回归模型。

通过使用离散加权函数,我们得到 R 平方得分为 0.4606、均方误差为 1.028 的线性模型。内含物的比例为 77.5%,离群物的比例为 22.5%。如果我们现在针对基线模型评估加权模型,仅考虑内联体,我们会得到以下结果:

  • 基线 : R 平方= 0.3814 &均方误差= 0.5910
  • 连续加权 : R 平方= 0.3925 &均方误差= 0.580
  • 离散加权 : R 平方= 0.3966 &均方误差= 0.5763

由此我们可以看出,就拟合整个数据集而言,未加权模型仍然表现最佳。然而,就内联程序而言,它的表现最差。这意味着,虽然未加权的模型总体上表现更好,但它现在可能偏向于离群值,降低了它对内部值的预测准确性。

然而,这一发现不能全信。因为我们毕竟是数据科学家,对我们自己在模型可解释性上的偏见持怀疑态度也很重要。从性能指标中可以明显看出,对数据集进行加权可以消除异常值偏差。然而,要重申的是,单一的线性模型,甚至可能是离群点检测方法,都不太适合这个数据集。那么,这项工作取得了什么成果?我们已经看到,回归模型中可以包含显著的异常值,而不会使它们与内部值同等重要。并且即使它们对最终的模型拟合有贡献,但毕竟是重要的,它们相对于预测的重要性已经被相应地调整。

在回归过程中为数据应用正确的权重变得与数据集本身一样重要。很难说您的数据存在一个完美的权重集,但是通过上面的例子,希望在尝试包含异常值时可以使这项任务变得简单一些。人们应该注意考虑在拟合过程中允许异常值存在的含义,并始终选择最能代表我们数据的答案。加权回归是实现这一点的许多方法之一,它的使用是一种宝贵的资产。

我将不包括分段连续加权的例子,正如上面的连续和离散加权例子一样,这应该很容易使用两者的组合来实现。

最后,我希望这将有助于您的数据科学技能,并成为处理重大异常值时的有力工具。祝你在数据世界的努力一切顺利!

[1] Bryant,P. G .和 Smith,M .(1995)实用数据分析:商业统计案例研究。伊利诺伊州霍姆伍德:理查德·d·欧文出版社

当 R 遇到 SQL 查询数据帧时

原文:https://towardsdatascience.com/when-r-meets-sql-to-query-data-frames-a94d9d92b0f2

在 R 数据帧上运行 SQL 命令的全面概述。

图片由 Peggy_MarcoPixabay

介绍

作为一名数据科学家,您可能已经听说过 SQL 和 r。SQL 非常适合与关系数据库进行交互。另一方面,r 是执行高级统计分析的一个很好的工具。然而,有些任务在 SQL 中比在 R 中简单,反之亦然。如果我们能有一种工具,可以结合每种工具的优点,会怎么样?这就是**sqldf**派上用场的地方。本文旨在强调sqldf的一些特性,类似于 SQL 中的特性。

什么是 SQLDf

sqldf是一个开源库,用于在 R 数据帧上运行 SQL 语句。它可以与 SQLite、H2、PostgreSQL 和 MySQL 数据库等多种数据库协同工作。

入门指南

安装软件包

是时候动手了!但是,我们首先需要使用install . packages函数安装sqldf 库。

# Install the library 
install.packages("sqldf") # Load the library 
library("sqldf")

数据和预处理

在本文中,我们将使用一个标准的机器学习数据集,称为“成人收入”,在 UCI 机器学习许可证下免费提供。通过直接从我的 Github 中读取或者使用read.csv()功能下载并保存在你当前的工作目录中,开始获取数据集。

data_url = "[https://raw.githubusercontent.com/keitazoumana/Medium-Articles-Notebooks/main/data/adult-all.csv](https://raw.githubusercontent.com/keitazoumana/Medium-Articles-Notebooks/main/data/adult-all.csv)"# Read the data
income_data <- read.csv(data_url)# Check the first 5 rows of the data
head(income_data, 5)

数据集的前 5 行(图片由作者提供)

数据的列(V1,V1,…,V15)是不可理解的,我们可以用下面的语法重命名它们。这些名字来自 UCI 机器学习网站,所以没有什么是发明的。

new_columns = c("Age", "Workclass", "fnlwgt", "Education", "EducationNum", "MartialStatus", "Occupation", 
           "Relationship", "Race", "Sex", "CapitalGain", 
           "CapitalLoss", "HoursPerWeek", "Country", "Income")# Change column names
colnames(income_data) <- new_columns# Check the first 5 rows of the data again
head(income_data, 5)

重命名列后数据集的前 5 行(作者图片)

正如您在前面的屏幕截图中看到的,更改已经成功执行。

最后,让我们使用 tidy 向数据集添加一个 ID 列,这将是每个人的标识符。在本文的后面,您会发现本专栏的好处。

# Add the ID column to the dataset
income_data$ID <- 1:nrow(income_data)# Show the first 5 rows

添加 ID 列后数据集的前 5 行(图片由作者提供)

使用 sqldf 的 SQL 查询

为了能够执行任何 SQL 查询,您需要使用sqldf函数,该函数将字符串格式 的查询作为参数 ,如下所示。

**sqldf**("YOUR_SQL_QUERY")

在这一节中,我们将讨论从简单到更高级的不同查询,从选择列开始。

列选择

我们可以检索满足一个或多个条件的数据列。例如,我们可以提取古巴成年人的年龄、种族、性别、每周工作时间和收入。

注意:在语法中,确保不要忘记古巴周围的符号,以使其工作。

cuba_query = "SELECT Age, Race, Sex, HoursPerWeek, Income \
              FROM income_data \ 
              WHERE Country = 'Cuba'"
cuba_data = sqldf(cuba_query)
head(cuba_data, 5)

关于古巴成年人的前 5 行数据(图片由作者提供)

我们可能想增加一个额外的限制,以便只获得每周工作 40 小时以上且不到 40 岁的古巴成年人。

cuba_query_2 = "SELECT Age, Race, Sex, HoursPerWeek, Income \
              FROM income_data \ 
              WHERE Country = 'Cuba'\ 
              AND HoursPerWeek > 40 \ 
              AND Age > 40"cuba_data_2 = sqldf(cuba_query_2)
head(cuba_data_2, 5)

40 岁以上、每周工作超过 40 小时的古巴成年人(图片由作者提供)

GROUP BY 语句

除了选择列之外,我们可能还希望将数据划分到不同的组中,以便在诸如AVG()COUNT()MAX()MIN()SUM()等函数的帮助下获得更全面的概述。使用GROUP BY,不同行中具有相同值的特定列将被分组在一起。

例如,让我们考虑每个国家每周的平均工作时间,然后按照平均工作时间的升序排序。

# Prepare the query
wwh_per_country_query = "SELECT Country, AVG(HoursPerWeek) 
                         AS AvgWorkHours \
                         FROM income_data 
                         GROUP BY Country 
                         ORDER BY AvgWorkHours ASC"# Run the query
wwh_per_country_data = sqldf(wwh_per_country_query) # Get the first 5 observations 
head(wwh_per_country_data, 5)# Get the last 5 observations
tail(wwh_per_country_data, 5)

平均每周工作时间:前 5 次观察(图片由作者提供)

平均每周工作时间:最近 5 次观察(图片由作者提供)

为了更清楚,我们来分解一下查询。

  • 我们选择所有的国家和他们各自的每周工作时间。然后使用AVG函数计算平均工时的结果,并存储在一个名为 AvgWorkHours 的新列中。
  • GROUP BY Country:上一条语句结束时,所有同名国家的结果都是 AvgWorkHours 。然后,GROUP BY 用于创建每个国家的唯一实例及其相应的 AvgWorkHours。
  • ORDER BY AvgWorkHours ASC:最后一条语句用于使用ASC(升序)函数对 AvgWorkHours 进行升序排序。

如果你是一个更图形化的人,你可以使用纯 R 脚本显示前面的结果。从 R 切换到 SQL!是不是很神奇:)

# Create a plot# Create room for the plot
graphics.off()# Sets or adjusts plotting parameters
par("mar")
par(mar = c(12, 4, 2, 2) + 0.2)# Show the final plot
barplot(height = wwh_per_country_data$AvgWorkHours, 
        names.arg = wwh_per_country_data$Country,
        main ="Average Working Hours Per Country",
        ylab = "Average Weekly Hours",
        las = 2)
  • par() 函数用于调整绘图参数,mar为长度为 4 的向量,分别设置下、左、上、右的边距大小。
  • las=2用于以垂直方式显示国家名称,以便更直观。值为 1 将水平显示它们。

平均每周工作时间(图片由作者提供)

这只是 sqldf 所能做的?只是列选择和分组依据?

当然不是!可以执行更多的 SQL 查询。让我们用连接的使用来结束这篇文章。

JOINS 语句

它们用于根据链接这些表的列,组合来自至少两个数据集(即表)的行。为了成功演示这个场景,我们需要创建一个额外的数据集。

数据集创建

让我们从创建两个不同的数据集开始。

  • 第一个被称为**personal_info_data**,它将包含一个人的所有个人信息。
  • 第二个名为**backg_info_data**,包含所有的学术、薪水等信息。
# Prepare the query 
query_pers_info = "SELECT ID, Age, MartialStatus, Relationship, Race, Sex, Country FROM income_data"# Store the result in the personal_info_data variable
**personal_info_data** = sqldf(query_pers_info)# Show the first 5 rows of the result
head(**personal_info_data**, 5)

个人信息数据的结果:前 5 行(作者图片)

创建第二个使用与前一个相似的方法。

# Prepare the query
query_backg_info = "SELECT ID,Workclass, Education, Occupation, CapitalGain, CapitalLoss, HoursPerWeek, Income FROM income_data"# Store the result in the backg_info_data variable 
**backg_info_data** = sqldf(query_backg_info)# Show the first 5 rows of the result
head(**backg_info_data**, 5)

背景信息数据的结果:前 5 行(作者图片)

注意**personal_info_data**中的 ID 是指**backg_info_data** 中的 ID因此,我们两个数据集之间的关系是 ID 列。sqldf可以执行所有不同类型的连接,但是我们的重点将放在内部连接上,它返回两个表中具有匹配值的所有记录。

以下语句提取成年人的年龄、婚姻状况、国家、教育和收入。

# Prepare the query
join_query = "SELECT p_info.ID, \
                  p_info.Age, \
                  p_info.MartialStatus, \
                  p_info.Country, \
                  bg_info.Education,\
                  bg_info.Income \
              FROM personal_info_data p_info \ 
              INNER JOIN backg_info_data bg_info \
              ON p_info.ID = bg_info.ID"# Run the qery
join_data = sqldf(join_query)# Show the first 5 observations
head(join_data, 5)

连接查询的前 5 个观察结果(图片由作者提供)

为了清楚和可读性,该查询被分解,并创建了额外的变量。

  • sp_info:写 personal_info_data 就太长了。教育,个人信息数据。MaritalStatus 等。我们创建一个别名/实例来代替原来的名字。别名大部分时间都比原来的短。
  • bg_info:与上一个类似的是 backg_info_data 的别名。

结论

没有一个 R 用户掉队!🎉 🍾您刚刚学习了如何使用sqldf与 R 数据框进行交互。如果您仍然在执行复杂的任务,而使用 SQL 可能会更容易,那么现在是时候尝试一下sqldf了,它可能会帮助您和您的同事节省时间并提高效率!

此外,如果你喜欢阅读我的故事,并希望支持我的写作,考虑成为一个媒体成员解锁无限制访问媒体上的故事。这样做,我会得到一点佣金。

欢迎在媒体推特YouTube 上关注我,或者在 LinkedIn 上问好。讨论人工智能、人工智能、数据科学、自然语言处理和人工智能是一种乐趣!

额外资源

R 网站上的 SQL 文档

UCI 机器学习

R 文章的源代码

当 SQL 仓库遇到探索性分析

原文:https://towardsdatascience.com/when-sql-warehouse-meets-exploratory-analysis-dd74c7812225

探索更快的选项

Unsplash 上的 Venti Views 拍摄的照片

在现代数据栈时代,云 SQL 仓库对于数据从业者来说并不陌生。Snowflake、BigQuery 和 Redshift 等主要公司已经帮助数千家企业简化了他们的数据基础架构。人们用它们来

  1. 在表中接收和存储数据。
  2. 运行查询和作业来转换数据。
  3. 通过消费数据构建应用或获得洞察力。

总的来说,所有流行的 SQL 仓库在成本效益方面都做得很好,适用于任何规模的企业,它们都设计有云原生功能,包括但不限于:

  • 连接 — it 可以连接数千个云服务,为客户构建端到端的解决方案,包括 ETL/ELT、云功能和数据分析/BI 工具。
  • 弹性 —它可以根据实际需要独立、动态地扩展存储和计算。
  • 可用性 —它构建强大可靠的软件,并为不想接受不必要挑战的所有客户重复使用,客户以超低成本享受高可用性。

使用 SQL 仓库的最终目的

信不信由你,无论基础设施构建得多么复杂,人们使用 SQL warehouse 的最终目的都很简单— 获得洞见

  • 对人而言:对你的业务建立更好的理解。
  • 对于产品/服务:建立更好的 API 或 AI 模型!

获得洞察力也经常被称为最后一英里价值,人们使用它来进行沟通,以做出更好的数据驱动的决策。为了向你的听众传达一种“洞察力”,你需要经历这些步骤,并且做得很好:

  1. 洞察力的发现:这通常也被称为探索性分析。这就像金矿开采,如果配备了智能和快速的工具,你应该可以轻松获得它们。
  2. 洞见的讲故事在短时间内将你从专家角度的理解简洁地传递给你的听众的理解。
  3. 洞察力的沟通:以故事的形式向你的听众分享和展示“洞察力”,可以是会议中的 PPT,也可以是聊天应用中分享的卡片。

如你所见,更好的沟通是我们为人们所做的所有数据工作的核心价值。

SQL 仓库遇到探索性分析时的问题

正如我们前面所讨论的,现代 SQL 仓库总体来说很棒,但是在最后一英里中不如“获得洞察力”部分好,为什么呢?

以下是一些观察结果:

  • 接口:为了简单起见,通常 SQL 是与一个仓库进行交互的标准接口,当然这也是为什么叫 SQL 仓库的原因。然而,探索性分析喜欢直观的 UI,支持切片和切块的快速交互迭代。
  • 速度:他们的基础架构针对“大规模”进行了优化,处理的数据量越多(例如大型连接),节省的成本就越多。类似地,它服务的客户端越多,它提供的效率就越高,因此这些查询通常很慢。然而,探索性分析喜欢挖掘同一个数据集,用户不应该等待任何改变。
  • 成本:迭代大型慢速查询不仅耗时,而且费用昂贵,你的账单通常是按“时间*资源”计算的,重复同样的昂贵查询,只有微小的变化,会很快堆积你的账单。

随着时间的推移,我希望 SQL warehouse 在探索性分析方面会有所改进,但目前还不是很好。

改进的选项

差距现在很明显:SQL warehouse 擅长大数据处理,比如大连接,这是一个高资源消耗的操作,从调度,以及资源分配到作业执行。然而,探索性分析大部分时间集中在单个立方体上,它需要具有亚秒周转的交互式用户体验。

那么我们如何解决这个问题呢?

关键是避免昂贵的部分被重复执行。根据关键点,根据哪一方付出努力,至少有 3 个分类选项:

  1. 用户:创建一个中间表,用于探索性分析的钻取。
  2. 仓库:透明缓存每一步的结果,尽可能重用缓存。
  3. 第三方:将探索性分析功能与数据建模功能分开,让各方负责一件事。事实上,一些现有的 BI 工具提供了这种类型的功能,例如 PowerBI 服务。

利弊很容易辨别:

选项 1 要求用户成为专家,因此维护负担落在用户身上,如果他们已经为服务付费,谁还想要更多的工作呢?

选项 2 的实现和运行成本都很高,尤其是当用户行为不可预测时,虽然我相信仓库供应商有动机,但它可能永远不会成为他们路线图中的优先事项。

选项 3 似乎是解决这个问题的最有希望的方法,责任分离很好,钻井体验也很棒。

案例研究:SQL 数据仓库的瞬间探索

让我们以为例来展示分布式中间层是如何帮助我们的。

在这种情况下,我们在任何数据上构建一个统一的分析 API,它包括一个与主要 SQL 仓库(如雪花)一起工作的数据模型。它的分布式查询引擎使得探索性分析总是在不到一秒的时间内得到回答,即使有数十亿行。

这个视频展示了一个演示,展示了当我们将探索性分析从 SQL 数据模型中分离出来时的体验。

我希望这篇文章有助于带来新的想法。感谢阅读!

何时在数据可视化中使用 3D

原文:https://towardsdatascience.com/when-to-use-3d-in-data-visualisation-f3739e320da7

使用三维表示数据时的注意事项

并非所有的 3D 图形都像这张一样令人困惑。来源:作者

我的上一篇文章关于为什么使用运动可以成为数据可视化的有效工具之后,在这篇文章中,我们将注意力转向三维图表。我们将通过一些例子来强调在展示额外信息时的注意事项。

就像动画一样,在数据可视化中使用 3D 已经过时了。因此,在考虑向观众展示数据的最佳方式时,它经常被视为一种选择。

虽然许多最糟糕的视觉化作品往往是 3D 的(不相信我?看看这个宝石或者这个例子以及本文后面的一些图表),相关性是而不是因果关系。一些最吸引人和最强大的视觉化也以三维形式呈现。事实上,有证据表明,在某些情况下,三维可视化可以比传统的 2D 方法更有效。[1]

现实情况是,3D 图表风险很高。如果弄错了,你很可能最终会创造出相当于巧克力茶壶的数据可视化。然而,如果做对了,你就能产生引人入胜的、有洞察力的、原创的出色数据可视化。

所以,如果你是一个寻求观想刺激的人,请继续读下去。然而,如果在你的图表中增加第三维度的肾上腺素听起来像是高血压的处方,那么你已经被警告了…

3D 制图的注意事项

不要:当 3D 不提供任何新信息时,使用 3D

这似乎是显而易见的,但令人惊讶的是,你经常看到 3D 图表,其中更传统的可视化数据的方法会有效得多。

让我们考虑下面的例子:

很糟糕,但不幸的是,这不是你在本文中看到的最糟糕的图表。来源:作者

当你看到上面的图表时,你毫无疑问地执行了一个吐槽,并且可以清楚地看到这是一个令人震惊的可视化数据的方式,它仍然值得考虑为什么是这样的细节:

  • 前景中的条形遮住了背景中的条形。
  • 第三个维度在每个条形的顶部创建了两条水平线,使得判断高度更加困难。这也使得读者在浏览多个条形时可能无法进行同类比较。
  • 图表的右下区域离轴很远,因此几乎不可能确定该区域中条形的值。

很明显,一个简单的二维堆积或分组条形图会以更简单、更有效的方式呈现所有上述数据点。

不要:忽略视角和观点

添加额外的维度还会添加两个额外的参数,这两个参数需要在创建图表时进行设置:

  1. 视角。当我们观察物质世界时,离我们较远的物体看起来比离我们较近的物体要小。图形透视模拟这种效果。虽然这使对象看起来更逼真,但在数据可视化中使用时会引起问题。如果一个对象的大小可以根据它离我们的距离而改变,那么当大小也被用来表示数据值时,这可能会引起混乱。因为这个原因,当谈到观想时,透视是最好避免的
  2. 观点。创建 3D 图表时,我们需要考虑如何查看它;我们的“眼睛”相对于图表的位置在哪里?这需要仔细审查,以确保信息表达清楚。

下面的图表允许我们更详细地研究这两个参数:

来源:作者,虽然我并不以此为荣

这可不好。

比尔·盖茨允许这成为 Excel 中的默认图表类型,这一事实比阴谋论者目前对他的任何想象都更令人震惊。然而,它强调了忽视视角和观点的影响。具体来说:

  • 此图表中视点的位置有效地遮挡了读者的大部分信息。使用透明度来弥补这一点只会造成复杂的视觉混乱。
  • 透视法的使用使得比较图表前面的条形和后面的条形变得非常困难,因为它们本质上是用不同的尺度来衡量的。

Do:将 3D 映射到 3D

利用 3D 可视化最明显的时候是你的数据也有三维的时候。

下面的例子很好地证明了这一点:

这张图表的作用有几个原因:

  • 在可视化中对地球的熟悉减少了对我们工作记忆的需求[2],有助于补偿三维和动画创造的增加的复杂性。
  • 任何熟悉地图地理数据的人都会理解,使用三维可以立即解决试图将球形数据投影到 2D 表面时存在的固有问题。事实上,有大约 50 种技术来实现这一点,所有这些技术都必须在如何最好地“扁平化”地理信息方面做出重大妥协[3]。
  • 通过在全球范围内缓慢移动视点,它允许观看者消化呈现给他们的信息,同时也提供信息的完整画面。

做:跳出框框思考

数据可视化中第三维最强大的一个方面是,它为如何表示数据开辟了许多可能性。

这使得在设计向观众展示数据的方式时,创造力成为过程中的一个关键部分。

下面的例子展示了艺术和数据是如何融合在一个实体装置中,呈现出人们对 2012 年伦敦奥运会的情感反应:

物理装置展示了对 2012 年奥运会的情感反应。来源:NAND 工作室

然后,该装置将数字信息叠加到物理模型上,为观众提供他们正在观看的具体细节。

这是一个很好的例子,展示了 3D 数据可视化是如何被用来创造一些原创的、身临其境的和信息丰富的东西。试着用饼状图来做吧!

结论

虽然在 3D 中可视化数据并非没有风险,但希望这篇文章已经表明,它不应该作为向观众展示信息的一种选择而被放弃。

下次你创建图表时,请不要忘记考虑使用额外的维度。

更多示例:

我附上两个进一步的例子,说明三维可视化是如何被用来产生巨大的影响。如果你有更多的例子要补充,请评论。

  • 这个谷歌实验由一个互动艺术画廊组成,使用机器学习将相似的作品聚集成一个 3D 艺术“景观”
  • 这个来自《纽约时报》的著名例子通过两个时间轴创建了一个三维图表。这是一个非常好的例子,因为它确实不应该工作,但在传递收益率曲线的复杂信息方面非常有效。

参考文献:

[1]对虚拟现实、三维可视化和 2D 视觉交互模拟效果的比较评估:探索性荟萃分析。Ikpe 大法官阿库潘和穆拉利·尚克尔,2019 年

【2】有什么问题?熟悉度、工作记忆和问题解决任务中的迁移。詹姆斯·科尔、汉娜·斯奈德、钱德拉·l·布罗杰德和安吉拉·弗兰德。2015

[3]50 个映射投影的视觉指南:https://gisgeography.com/map-projection-types/

何时使用量子计算机

原文:https://towardsdatascience.com/when-to-use-a-quantum-computer-830367322b8f

量子计算很奇怪

量子机器学习要不要入门?看看 动手量子机器学习用 Python

不,我不是指控制量子计算机运行的量子力学的奇怪现象。

我指的是媒体报道中的差异。在大众媒体中,量子计算被吹捧为一种神奇的设备,可以解决我们所有的问题。相比之下,批评性文献怀疑量子计算是否会有任何用处。

如果我们相信媒体所写的关于量子计算的一切,这就像患有人格障碍,你在快乐和毁灭之间摇摆不定。

作者图片

我也有罪。我已经在我的每周帖子里提出了这两个问题,我已经写了将近两年了。我强调了量子计算机能做的所有不可思议的事情。但我也澄清了由于对量子计算机的严重误解而导致的过高期望。

虽然我试图通过不仅仅依赖数学公式来使整个主题尽可能容易理解,但我尽最大努力保持尽可能的脚踏实地。

因此,在我之前的帖子中,我指出了量子计算机的作用:

量子计算所做的只是让实现非确定性算法成为可能。

当然,如果没有进一步的澄清和解释,这个定义是没有用的。

所以让我们看看这意味着什么和它的含义,因为这是识别我们应该用量子计算机解决的问题的关键。

但是在我们进入这个话题之前,让我简单解释一下为什么我强调“应该”而不写“可以”。原因很简单,量子计算机可以做数字计算机能做的一切。但是量子计算机是昂贵的设备,它的少数量子位容易受到噪声的影响。

IBM 目前的 QPU(量子处理单元)Eagle 有 127 个量子位。所以它能做 127 位 CPU 能做的一切。因此,如果我们有数百万(1 兆量子位)或数十亿(1 千兆量子位)的量子位,量子计算机可以做目前 CPU 能做的一切。

但是,即使是拥有数十亿量子位的量子计算机,也比同等的经典芯片速度更慢、更容易出错、更昂贵。所以我肯定会坚持使用数字电脑…除非有使用量子计算机的理由。

问题不在于我们是否可以使用量子计算机。相反,问题是我们是否应该这样做。那么,我们为什么还要为微小的处理器、嘈杂的结果和成本而烦恼呢?

我们应该使用量子计算机来解决非确定性多项式(NP)问题。根据定义,这些是非确定性算法可以在多项式时间内解决的决策问题,而确定性算法则不能。这听起来像一个同义反复,但它有意义。

为了理解这意味着什么,我们需要谈谈复杂性理论。这是一个关于解决一个问题所需的时间或步骤数量如何随着问题规模的增加而增加的理论。

我们来考虑两个问题。首先,两个数相乘,例如,“三乘以七等于几?”第二,两个数的因式分解,例如,“21 的质因数是多少?”这两个问题都很容易解决。原因是问题规模很小。

这些问题怎么样:

  • 101 乘以 223 是多少?
  • 22523 的质因数是什么?

虽然你可以用纸和笔解决第一个问题,但你可能很难解决第二个问题。对了,这些也还是小问题。

n 位数相乘的复杂度增加了大约 n2 倍。我们称之为多项式问题解。相比之下,寻找一个 n 位数的质因数的复杂性是 e{n{1/3}}.这意味着努力随着位数的增加而呈指数增长。

不要低估多项式复杂度和指数复杂度之间的差异,这一点很重要。虽然你的智能手机在几秒钟内将 800 位数字相乘,但在超级计算机上对这些数字进行因式分解需要大约 2000 年。

我们认为可以在多项式时间内解决的问题是易处理的,而指数增长的问题是难处理的。对于 n 的大值,具有指数增长复杂性的问题变得如此困难,以至于即使是最好的超级计算机也要花费太长时间来解决它们——在某些情况下,这意味着数百万甚至数十亿年。

以上任务你都费心解决了吗?如果我告诉你 22523 的质因数是 101 和 223 呢?

这个解是否正确可以在多项式时间内检查,因为检查是乘法。这使得数的因式分解成为一个不确定的多项式决策问题。

决策问题是一个我们可以回答是或不是的问题。此外,这个答案必须通过简洁的证明来验证。如果一个证明的复杂性呈多项式增长,那么它就是简洁的。

此外,如果我们可以猜测它的解决方案,一个问题被称为是一个非确定性多项式(NP)问题。这意味着我们没有特定的规则可以遵循来推断解决方案,但如果我们幸运的话,我们仍然可以在第一次尝试中找到正确的解决方案。

因此,如果一个非确定性算法可以在多项式时间内解决一个 NP 问题,这意味着它使这样一个问题易于处理。

量子计算的力量源于它实现非确定性算法的能力。因此,我们可以为这种 NP 问题创建算法。

这正是我们应该使用量子计算机的时候。我们应该在面对经典计算机无法有效解决的 NP 决策问题(即多项式复杂性)时使用量子计算机。

以乘法为例。这是一个我们已经可以有效解决的决策问题。因此,我们不应该使用量子计算机,即使我们可以。

另一方面,因式分解是一个我们无法有效解决的决策问题。因此,我们应该为它使用一台量子计算机。

优化呢?假设您想要在一系列城市之间找到最短的可能路线。这是一个我们还不能有效解决的问题。然而,这不是一个决策问题,因为即使有人告诉你,你也无法证实一个解决方案是最好的。在考虑所有可能的路线之前,你永远不会知道是否有更好的解决方案。

但这并不意味着量子计算不能帮助优化。例如,它可以用来首先找到可能的路线。当然,有时候寻找有效路线本身就是一个 NP 问题。但是一旦我们有了一条路线,我们可以快速检查它是否正确,即使我们无法判断它是否是最优的。

在这种情况下,我们应该使用量子计算机来寻找路径。然后,传统的优化器可以选择最佳路线。这就是我们所知的变分量子经典算法

显然,你需要在问题领域有深厚的专业知识来判断你是否应该使用量子计算机来解决它。

使用这些知识来识别你的领域中应该用量子计算机解决的问题。它会把你带到杆位。

量子机器学习要不要入门?看看 动手用 Python 学习量子机器。

在这里免费获得前三章。

何时使用贝叶斯

原文:https://towardsdatascience.com/when-to-use-bayesian-8723c818b742

应该考虑贝叶斯建模的 5 个场景

介绍

大多数统计模型都有一个频率模型和一个贝叶斯模型。两种方法之间的决策不仅仅是模型之间的选择,更是统计“语言”之间的选择。

Frequentist 统计是基于从一个潜在的真实模型中对数据进行假设性重采样。尽可能用简单的英语进行最大似然估计。它说似然性是给定(以基础模型为条件)的观察数据的概率。在所有可能的基础模型中,哪一个给了我们看到数据的最高概率?我们正在寻找的这个模型的贝叶斯等价是“哪个模型,或者一组参数值,我们最确定是真实的模型?”

抛开哲学不谈,选择这样或那样的方法有一些实际的原因。频繁主义者的方法通常是首选,所以在本文中,我将介绍一些使用贝叶斯建模可能有意义的场景。

注意:关于贝叶斯推理的直觉的初级读本,请看这篇文章

Unsplash 上由 Carlos Muza 拍摄的照片

初始信息

贝叶斯统计是关于信念的。我们对真实模型有一些先验的信念,我们将它与我们数据的可能性结合起来,得到我们对真实模型的后验信念。(我不会在这里过多地讨论数学,但如果感兴趣,请再次查看这里的。)

在某些情况下,我们在看到任何数据之前就已经了解了我们的领域。贝叶斯推理提供了一种直接的方式来将这种信念编码到一个先验概率分布中。例如,假设我是一名经济学家,预测利率对科技股价格变化的影响。我对经济学的信念是,低利率通常会在一定程度上推高价格,可能是每个利息点 5%左右,但可能不会超过每个利息点 25%。我们可以使用正态分布作为先验分布,以-5%为中心,方差为 40%。它看起来会像这样:

关于利率对股票价格影响的先验信念~正态(-5,40)。图片作者。

如果我担心我潜在的有偏见的先验信念对后验的影响,我可以

  1. 使用“较弱的先验”,例如均值为 0、方差为 1600 的正态分布(也称为标准偏差=40)。

关于利率对股票价格影响的弱先验信念~正态(0,1600)。图片作者。

或者

2.做敏感性分析,我尝试了一大堆不同的先验,看看它实际上对后验分布有多大影响。

有限的数据

这个场景与前一个场景相关。如果我们的数据集非常小,一些异常值可能会导致 frequentist 模型的不正确拟合(即使用 sklearn 普通最小二乘法线性回归)。然而,如果我们使用贝叶斯方法,参数的先验分布可以作为正则化来防止不可能的极值。

在数据是随时间推移而获得的情况下,您可以对现有数据进行贝叶斯推断,获得后验分布,然后在获得新数据时将该后验分布用作先验分布。这个过程称为“贝叶斯更新”,可以一遍又一遍地重复。

不确定度测量

如前所述,贝叶斯推断提供了更易解释的置信区间,通常称为“可信区间”这种后验分布直接类似于我们对模型中某个参数的信念,或者是给定新数据的预测。你可以说“我 95%确定参数 θ 在 2.2 到 3.6 之间。”

将此与 frequentist 置信区间进行比较,frequentist 置信区间可以说“在大量重复样本中,我们在 1.7 和 3.4 之间类似计算的区间将在 95%的时间内包含真实值。”如果你关心传达不确定性(特别是对非统计学家),贝叶斯方法可能更有意义。

有限的测试数据

如果您在两个不同的发行版上进行训练和测试,一个可能的情况是测试发行版中的数据量要小得多。比方说,我们希望训练一种计算机视觉算法,从全身 CT 扫描中定位一种罕见的癌症类型。我们将来自更常见癌症类型的患者的扫描纳入训练,并保存一些罕见癌症患者进行测试。

我们可以从我们的评估中得到一个精确点估计,但是更合适的方法可能是使用贝叶斯方法来评估[ 1 ]。我们可以为我们的分类器的准确性创建相对较弱的先验,添加评估试验作为数据,并获得后验分布,其中我们可以说“我有 95%的信心,测试分布上的分类器准确性在 65%和 82%之间”。

分层模型

分层模型在贝叶斯框架中运行良好。在分层模型中,有多个层次的随机变量。例如,您正在对学生的标准化考试成绩进行建模。每个学生的分数来自他们所在学区的分数分布。学区的参数来自全国学区平均分数的更全球化的分布。

分层模型。 ϕ代表全局参数。 𝜃是特定于组的参数,来自ϕ.定义的全球分布 y 是属于 s 组之一的特定数据点。作者图片

分层方法的一个好处是,您可以对所有分类的属性进行建模,即使给定分类中只有很少的数据点。在这个例子中,如果我们有非常少的来自某所学校的数据点,那么它的分布将会更广,更类似于全球的总体分布( ϕ )。同样,与为每个聚类创建单独的模型相比,层次模型更能抵抗离群值和有限数据。

等级线性模型的频率主义方法可能寻找后验分布的模式,这通常在等级模型中,可以在后验空间的边缘或边界[ 2 ]。在学习模型参数时,这可能会给你一个不正确的结果。通过贝叶斯推理,我们获得了一个完整的后验分布,并且我们可以计算更合适的(对于复杂的分布)统计数据,如均值、中值和 95%可信区间。

随着最近计算和算法的进步,贝叶斯推理对于更大的模型和更多的数据更加可行。虽然在实践中,频率主义方法通常是默认选择,但在某些情况下,贝叶斯方法可能是更好的选择,最常见的情况是:

  1. 你有可量化的先验信念
  2. 数据有限
  3. 不确定性很重要
  4. 模型(数据生成过程)是分层的

参考资料:

[1]https://www.youtube.com/watch?v=5f-9xCuyZh4

[2]https://discourse . MC-stan . org/t/hierarchical-linear-models-Bayes-vs-frequentist/12012/1

当你的经理不是你最好的向导时

原文:https://towardsdatascience.com/when-your-manager-isnt-your-best-guide-841f385760b9

你应该相信副总裁的反馈还是经理的反馈?

作者使用几个工具创建的图像,包括 DALL E 2

在我的上一篇文章中,我们研究了下面的民意调查,我认为如果你没有关于情况和所涉及的个性的额外背景,有一个可靠的经验法则支持一个反馈来源而不是另一个。现在是时候提几个可以改变答案的修饰词了。

推特投票链接。就问题的目的而言,您可以假设:副总裁不是数据科学背景,而经理有技术背景,但不做数据工作。副总裁和经理都擅长他们的工作。

经验法则

如果我们对项目、副总裁或经理一无所知,那么用差异 进行逻辑检查,经理更倾向于作为更清晰的信息来源。(更多关于这个话题的在这里。)

例外

但是如果你有更多的上下文呢?下面列出了一些可能会让我们倾向于副总裁的因素:

缺乏可测量性

如果影响是不可测量的,那么你的有用性或缺乏有用性取决于你所服务的人们的现实扭曲领域。如果副总裁说你的工作非常有影响力,而且没有办法证明不是,那么你就是有用的……除了:

支持

当你在旁观者眼中是有用的,仅仅在最资深的旁观者眼中是有用的是不够的。你需要确定他们会投入工作(这就是工作!)以确保其他人都以自己的方式看待事物。如果你不相信副总裁会记得你的名字,当他表扬你出色的工作时,那么他们告诉你有一次你和他们共乘一部电梯也没关系。

如果一个副总裁在森林里为你辩护,但没人听到,那就没有发生过。但是如果副总裁有为他们所鼓励的人说话的历史,你就要更加重视他们的反馈。

经历

如果你的经理是新来的,副总裁的反馈可能是一个更清晰的信号。无知是所有层次差异的典型来源。

另一方面,如果副总裁是新来的,祝你好运,在这个雷区里跳舞吧。顺便说一下,你可以通过观察所有精明的运营商在获得新副总裁时的做法来了解很多信息。这是一场值得门票的演出。

你们团队的问题

一个好的经理比你的上级更有动力支持你。当一个团队运作良好时,你的经理的胜利就是团队的胜利,反之亦然,但如果你的团队有重大问题,而你的经理正在努力处理这些问题,你正在处理一个离家太近的局部混乱产生过程。无论什么错误的严重性可能会扭曲信息太多,以至于你不能相信你的阅读。

管理无能

如果你有充分的理由怀疑你的经理不称职或不值得信任,那么将你的信息获取偏向你不认识的魔鬼是相当合理的。但是注意不要跳出油锅,跳进火里。

对自己工作的理解

你的直接经理通常更能理解你的工作及其含义,但也有极少数例外,比如副总裁与你有相同的专业背景,而你的经理却没有。即便如此,任何承担大范围任务的人都不太可能有时间去处理他们投资组合中的任何单个项目,所以一定要确保给你反馈的人拥有必要的知识和背景来给你建议。没有理解,反馈和预测就缺乏营养价值。

缺乏新奇感

如果你正走在一条被践踏得很好的道路上,并且参与的每个人都很好地掌握了大量像你这样的项目是如何进行的,那么离开争吵不休的经理和副总裁,看看像你这样的项目的丰富历史,然后回来问问他们每个人都知道什么而另一个人不知道。如果这里没有信号,就用历史吧。毕竟你是一个数据科学家。不妨走一走。

杂!

这些异常就像潘多拉盒子里的东西:一旦我开始列表,就没有停止的可能…除了(!)凭意志的力量。但是如果你想出更多的例外,请在这里留下评论继续这个列表。

感谢阅读!人工智能课程怎么样?

如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:

在这里欣赏课程播放列表,它被分成 120 个单独的一口大小的课程视频:bit.ly/machinefriend

https://kozyrkov.medium.com/membership

又及:你有没有试过在 Medium 上不止一次点击拍手按钮,看看会发生什么? ❤️

喜欢作者?与凯西·科兹尔科夫联系

让我们做朋友吧!你可以在 TwitterYouTubeSubstackLinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格取得联系。

数据孤岛在您组织中的位置

原文:https://towardsdatascience.com/where-data-silos-live-in-your-organization-f51ecdd90809

你听说过影子 IT,但是影子数据呢?

照片由斯蒂芬·彼得森Unsplash 上拍摄

数据孤岛和黑暗数据:每个组织都有——从定义上来说,我们没有人知道完整的范围。有时数据隐藏起来,不受数据团队的审查,类似于 shadow IT

影子数据(或数据孤岛)在以下情况下出现:

  • 自主性和速度优先于技术标准;
  • 数据访问或资源有限,迫使团队围绕现有系统和流程工作;或者
  • 数据消费者决定部署他们自己的点解决方案,而不是与您合作。

但是消费者不是挥舞白旗,而是经常在数据团队的监视之外找到他们需要的东西——这是有风险的。

如果您的数据平台或产品过于笨重,数据消费者,甚至您的数据团队成员都会找到另一条路——很可能是一条不太可靠和合规的路。奥利弗·鲁斯Unsplash 上拍摄的照片

数据孤岛给数据消费者和数据团队带来了许多风险,例如:

  • 脆弱性:我敢打赌,金融分析团队的 John 没有为他的数据集准备像依赖管理和异常检测这样的系统。当高管们来问你为什么这个指标是错的时,如果你不知道它是如何产生的,那就很难调试。无论哪种方式,这都会带来有价值的业务数据丢失的风险。
  • 知识流失:如果一个数据“超级用户”离开了,你不会想知道如何对你现在继承的他们的深奥系统进行逆向工程。这不仅是一种糟糕的资源分配,而且他们的系统可能在被发现成为问题之前就已经造成了数不清的麻烦(一家公司发现,在一名团队成员离开后,他们的一种预测算法被发现自动运行,导致数百万美元的收入受到影响)。
  • 保安:“我都不知道这件事!”不会阻止监管机构对不当处理个人数据处以罚款。对 GDPR 来说,罚款最高可达公司收入的 4%——哎哟。
  • 不稳定的访问:当分析师无法访问他们需要的东西时,他们会变得暴躁,这是理所当然的,因为这些东西无法加入到他们的规范用户表中。这些数据孤岛要么造成不透明,要么需要重复流程,这两者都不是积极的结果。
  • 狭隘的决策:虽然数据消费者可以通过用户友好的点解决方案快速行动,但对于复杂的决策,他们可能需要专家来考虑实验设计、采样偏差和混杂因素。整个部门可能会围着马车,朝着一个不会从根本上增加业务价值的目标前进,或者以任意的方式进行衡量。

那么,数据团队如何识别隐藏在暗处的数据孤岛呢?他们能否以此为契机,发现其数据平台的弱点,并通过鼓励或强迫的方式吸引消费者?

在我看来,答案是肯定的。让我们看看数据孤岛在哪里,以及如何打破它们。

数据仓#1:转换和预聚合

但是在我们谈论数据消费者之前,让我们不要让自己作为数据专业人员完全摆脱困境。在我们不切实际的尝试中,我们创建了我们的数据孤岛,以满足不断增长的数据需求,同时在我们团队的能力范围内工作。

我们公司前几天经历了一个事件,这是由于将 DataDog 添加到我们的技术堆栈中,这将一些跟踪信息引入到流入我们应用程序的数据结构中。

当数据被持久化到 S3 中,然后被摄取到数据块中时,它只是被部分加载,所以我们的管道中有丢失的数据。

我们的事后分析得出结论,我们的 Spark 工作过于复杂,有太多的转换。作为最佳实践,我们应该做的是在关键的检查点将作业分解成一系列更小的转换,这些转换写入到可以监控的表中。

在处理老派的 ETL 和商业智能实现时,我见过类似的场景。数据是为性能而预先聚合的,底层对于负责诊断关键指标暗中下降的分析师来说是不可见的。如果分析师知道基础数据是如何转换的,他们就很幸运了,更不用说能够成功找到下降的原因了。

随着从 ETL 到 ELT 的转变,这种行为也有所改变。如今,您更可能看到数据团队围绕将转换分解成清晰的步骤(例如,事件= >会话= >用户= >活动)建立最佳实践,而不是编写只有所有者才能理解的三页 SQL。

虽然商业智能工具会吹捧它们的数据准备能力,但这最终会变成对工具之外的团队不可用的另一个业务逻辑筒仓。很明显,最后一英里操作有一些好处,也许 BI 中的“不超过 SELECT*”这样的规则太苛刻了,但是任何可重用的语义必须对您的团队广泛可用。

解决方案 :将复杂的转换或 SQL 查询分解成不同的检查点,这些检查点将数据写到被监控数据质量的表中。

确保您的业务逻辑不会被锁定在只有部分用户可以访问的单一工具中。例如,您可以通过实现一个能够服务于商业智能和分析用例的度量层来消除孤岛;以及可以跨机器学习应用使用的特征存储。

编码语言也可能自然形成孤岛,因此应尽可能考虑标准化。这种极端形式目前正在上演,用 Python 编码的 Tesla 工程师正试图集成到主要用 Scala 编码的 Twitter 中。

数据筒仓#2:电子表格

sasi rin pamaivia Shutterstock。

在许多组织中,电子表格仍然是使数据民主化的最成功的方式,即使它们可能偶尔会成为数据团队痛苦和嘲笑的来源。

我们在财务部门的合作伙伴可以通过 PC 和 VLOOKUP 做一些了不起的事情,根据我的经验,没有什么比将表格放入 Google Sheets 并与合作伙伴合作手动添加标签更好的方法来民主化新数据的原型,这些标签是他们在分析中可以看到的有意义的属性。

当电子表格从原型进入生产阶段时,它就变成了一个数据仓库。或者换句话说,如果您不止一次看到同一个电子表格在业务运营中发挥作用,那么是时候将逻辑向上游移动,创建更系统的东西了。

该审查通常会揭示解决您的数据平台中的差距的方法,并可以帮助您进行上游转换,以提高可观察性和可扩展性。您甚至可能会发现新的机会,使诸如终身价值(LTV)等指标标准化,以获得更广泛的应用,并在更精细的层次上产生它们。

在消除财务数据孤岛时,数据完整性非常重要。除非您能够向财务合作伙伴展示您的系统精确到每一分钱,是最新的,并且在他们需要提供业务关键报告时可用,否则您将无法将电子表格逻辑向上游移动。

数据孤岛#3:“一体化”解决方案——ESP、CDP、DMP、A/B

如果做错了,这些可能是最难控制的筒仓。

许多营销技术栈,如电子邮件服务提供商和营销自动化平台,在现代数据仓库的进步之前脱颖而出。这意味着提高影响力的最便捷方式是采用一体化解决方案,直接收集、管理和向营销人员提供数据。不可否认,我曾经推销过运行实验的“单行 javascript”梦想,它可以让你避免与“它”进行任何进一步的对话。

这种孤岛造成的一些最紧迫的问题是,这些系统很快经历了客户群的无序蔓延(产品页面重复访问者 2020 年 10 月),并且分割的活动通常缺乏衡量。

回想我做咨询的时候,我估计一家大型电信公司正在“微瞄准”不到 1%的客户群,因为他们不知不觉地将营销活动过滤到满足其复杂细分中每个属性的客户。****

但是几年前我们有了转机——数据团队和技术现在能够足够快速和灵活地以业务的速度运行,同时利用仓库中丰富的数据释放新的机会(“嘿,想为 LTV 优化而不是点击进入?”).营销人员和其他业务合作伙伴看到了数据团队的价值,而不是绕过它。

这些营销第一的解决方案正在适应。无论您是选择现代的 CDP 还是反向 ETL 来将数据传输到营销人员手中,必备的特性是在您的企业数据仓库上进行收集、转换和基本的分段操作。

解决方案 :我发现让营销团队参与进来的最佳方式是创建尊重和满足他们对速度和自主权的需求的系统,同时合作确保强有力的治理和衡量是解决方案的一部分。

你不仅需要给他们一个更好的工具,在某种程度上你还需要让孤立的系统退役,即使会有阻力。在你到达这一点之前,请穿上营销的鞋子走一英里。合作开展营销活动,并利用这一经验展示您可以自动化和优化流程,同时为营销活动带来更高的回报。

不幸的是,数据孤岛本身就带有政治色彩。营销自动化工具可以从营销预算中获得资金,而数据仓库将来自数据团队相对较少的预算。构建业务案例,同时与运营商和高管达成共识。

我的推荐?主动消除孤岛

让睡觉的狗躺着可能很诱人,但在我看来,数据团队应该积极主动地消除数据孤岛或任何“影子数据”系统。

我通常选择梦想领域的方法——“如果你建造了它,它们就会到来。”(这种方法可能更类似于收集需求、确定项目范围、获得批准、构建最小可行产品、获得反馈、迭代,它们就会到来——但这远没有那么简洁)。

但是,如果您构建了它,但他们没有来,那么您需要解决这是否是您的技术解决方案的失败,缺乏组织的认同,或者完全是其他原因。然后,您需要找到一个解决方案,让您走上打破孤岛的正确道路。

毕竟,数据最终是数据团队的责任,消费者将做他们需要做的事情来访问它。作为数据领导者,我们前进的最佳途径是接受这一现实,并采取措施缓解它。

关注我,了解更多关于数据领导、数据科学应用和相关主题的故事。订阅将我的故事发送到你的收件箱。

损失函数从何而来?

原文:https://towardsdatascience.com/where-do-loss-functions-come-from-c93bc34c0bc5

用极大似然估计量推导线性回归损失函数

杰斯温·托马斯在 Unsplash 上的照片

介绍

我们都知道,在线性回归中,我们的目标是最小化误差平方和(SSE)。然而,为什么是上交所,这种说法是从哪里来的?

在这篇文章中,我希望用最大似然估计来回答这个问题。

最大似然估计器

在数据科学社区呆上足够长的时间,我相信你会遇到术语最大似然估计器(MLE)。

我不打算给出 MLE 的详细分析,主要是因为它已经以不同的方式做了很多次,可能比我能解释的还要好。此处链接的是我所见过的 Josh Starmer 的 StatQuest 的最佳解释,它真是太棒了。

然而,为了完整起见,我将给出一个简短的描述。MLE 是一种计算最佳参数的方法,这些参数最好地描述了给定的数据或统计模型。

你可以这样想,给定我们观察到的数据,什么参数最适合这个数据。或者,什么参数最有可能给出这种数据分布。

例如,假设我们有一些数据 X ,我们想要找到可能生成这些数据的参数 θ 的最佳值。我们可以根据 θ: 的值,通过计算数据点个体概率的乘积来计算“可能性”

作者在 LaTeX 中创建的方程。

其中 L(θ | X) 是这个值的可能性 θ 产我们的观测数据Xf(X _ n |θ)是概率(概率密度函数)

所以,我们想找到最大化【L(θ| X)θ 的值,因此它是最大似然估计量!

简单线性回归

让我们以最基本的线性模型,简单的线性回归为例:

作者在 LaTeX 中创建的方程。

其中 y_i 为给定观测值的响应 x_iβ_0β_1 为我们想要拟合的参数, ϵ 为正态分布误差:

作者在 LaTeX 中创建的方程。

其中 σ 为方差。

这个等式可以用下面的方式重写:

作者在 LaTeX 中创建的方程。

其中 yx 的条件分布假设为正态分布。

请记住,假设条件分布是正态分布,而不是响应的边际分布。这里链接的一个很棒的线程解释了这个概念。

应用 MLE

单个响应和可观测值的概率密度函数(PDF)是以我们的预测为平均值的正态分布:

作者在 LaTeX 中创建的方程。

我们使用分号来区分参数和随机变量。

因此,我们的可能性函数是:

作者在 LaTeX 中创建的方程。

一般来说,人们更喜欢使用对数似然法,因为在数学上/计算上使用总和比乘积更方便:

作者在 LaTeX 中创建的方程。

正态分布 PDF 中的副标题:

作者在 LaTeX 中创建的方程。

这等于:

作者在 LaTeX 中创建的方程。

你注意到上学期有什么熟悉的东西吗?

对于感兴趣的读者来说,这里有一个更完整的推导,链接到这些表达的出处。

机器学习中的 MLE

现在在机器学习中我们只对 β_0β_1 的参数感兴趣。 因此,对于机器学习中的简单线性回归模型,我们希望最大化的对数似然是:

作者在 LaTeX 中创建的方程。

由于我们通常认为它是最小化损失函数,因此我们取对数似然的负值,并找到最小化该函数的参数:

作者在 LaTeX 中创建的方程。

最小化负对数似然性与最大化对数似然性是一样的。这里链接的线程很好地解释了这一点。

现在,在假设的线性回归中被说成是常数。 考虑到这一点对于简单的线性回归,我们需要最小化以下表达式:

作者在 LaTeX 中创建的方程。

也就是我们都知道的经典平方和**

结论

在这篇文章中,我们已经展示了如何使用线性回归的最大似然估计来导出平方和。这就是为什么它被用作我们机器学习问题的损失函数。

可以对二项式分布进行类似的推导,并得出用于逻辑回归的对数损失!

和我联系!

(所有表情符号都是由 OpenMoji 设计的——开源的表情符号和图标项目。许可证: CC BY-SA 4.0

python 的随机数是从哪里来的?

原文:https://towardsdatascience.com/where-does-python-get-its-random-numbers-from-81dece23b712

迪伦·诺尔特在 Unsplash 上的照片

python 的随机数是从哪里来的?

现代伪随机数发生器及其新的 NumPy 实现的简单说明

在生成正态分布的数字样本时,我很好奇它们“从哪里来”——特别是计算机如何能够创建遵循选择分布的数字,无论是正态分布、指数分布还是更古怪的分布。无论创建这些正态分布值的方法是什么(反转采样博克斯-米勒或快速的金字形神算法),它们都始于一个基本构件:一系列均匀分布的值。

这就引出了一个问题:这些是从哪里来的?在大多数情况下:从一个“伪随机数发生器”——或 PRNG。注意到 NumPy 在 2019 年 7 月改变了他们默认的 PRNG 以回应这个 NEP (尽管互联网上仍然充斥着旧的做法)我很想知道:

  • 他们为什么要改变它
  • PRNGs 最初是如何工作的

然后用简单的英语写下我的想法,同时附上一些有用的图表和代码示例。这是这些笔记,主要由 Melissa O'Neill 的这篇(非常容易理解)论文和这篇相关讲座指导,Melissa O ' Neill 是 2014 年 PRNG 的 PCG 家族的作者,现在形成了 NumPy 的默认 PRNG。

为什么是“伪”?

因为产生真正的随机性是很难的——对人类(试试你的运气这里看看你怎么样)和机器都是如此。如果我们认为机器只是接受输入并根据我们给它们的指令产生输出,那么根据定义,输出将和输入一样随机。

有一些方法可以确保这种输入是“真正”随机的,这些方法主要涉及硬件来测量自然界中真正随机的东西(如大气噪声),但通常我们用选定的(非随机)初始值来“播种”算法。即使我们使用发电机启动时的机器时间(作为整数)作为种子,这也不是 100%随机的。然而,我们也许应该首先质疑是否值得追求真正的随机性。

我们想要“真正的随机性”吗?

这要看上下文。如果我们认为随机性是可预测性的反义词,而可预测性是安全性的敌人,那么回答这个问题就容易多了。当我们使用随机数来生成用于安全(即加密)的密钥时,我们希望这些数字看起来尽可能随机,以最小化威胁的可能性。因此,在这种情况下,真正的随机数发生器是有用的。

在其他情况下,当涉及到生成模拟时,我们可能会有其他优先事项,抵消绝对零可预测性的愿望。我们可能对一个函数感到满意,当你知道初始值(或足够的序列)时,它是完全确定的和可预测的,当你:

  • 不知道起始值
  • 实际上,知道“足够多”的序列是不可能的

这就引出了下一个问题:

PRNGs 的哪些特性是理想的?

速度、尺寸和再现性

这里没有什么特别的——我们想要的是能够快速生成大量可再现的随机数,并且不占用太多内存,特别是如果我们计划让它们在不同的线程中运行的话。

均匀性

如果我们知道生成的随机数将落在区间[0, n]内,那么我们希望该区间内的每个数字都有均等的机会被选中——否则,即使理论上我们有很多数字可以选择,但实际上这个数字会小得多。举个例子,如果我们在区间[0, 255]中有可能的数字,但实际上我们的 PRNG 只选择了3250,那么这根本不是随机的。另一方面,我们不一定想要一个保证一致性的算法。如果是这种情况,那么如果我们有一系列的n号码可供选择,并且我们已经选择了n-1号码,那么最终的号码根本不是随机的——它将仅仅是还没有被选择的号码。通过反向工作,我们可以看到,当我们到达范围的末端时,任何保证一致性的算法都将减少随机性,也称为“周期”。

一个长‘期’

如果我们承认,为了让计算机生成一个序列,我们必须给它一个函数,将前一个数字转换成下一个数字,那么如果我们最终得到一个我们以前见过的数字,我们将开始重复这个序列。只要我们从一个有界区间中选择数字,这种情况就一定会发生,因为如果我们在[0, n]中选择数字,那么根据定义,第n+1个数字一定是之前一个数字的重复。换句话说,在适当大小的序列上,所有 PRNGs 都将复制,因此变得确定。为了防止这种情况,我们可以在这种情况发生之前使数字的数量(句点)比我们希望采样的数字序列的长度大得多。

图案缺失

这似乎是显而易见的,但值得一提。例如,满足上述所有属性的一个好算法就是简单地“加 1”:

作者图片

这将是:

  • 惊人的快,小,可重复(我们只需要知道X_0我们开始的价值)
  • 统一:给定区间中的每个数字将被选择一次
  • 长周期:只要我们不在某个值上“绕回”以确保数字大小不会变大,它就不会重复,即映射一个大数字,y,回到零并重新开始

换句话说,前面的条件提供了伪随机算法表现为随机的能力,但并不能保证这一点——我们仍然需要一个好的算法,当你不知道初始条件时,它缺乏可预测性。

这一位很关键,如果您知道算法的“状态”(比如上一个随机数和将其转换为下一个随机数的函数),所有 PRNGs 都是确定的。关键是,如果没有这些信息,数字就会显得随机——就像一只火鸡认为圣诞节是一只“黑天鹅”,而农民却不是(随机性是相对于你的信息集而言的)。

lcg

线性同余生成器(lcg)是最古老的 PRNGs 之一,幸运的是非常容易理解。

换句话说,为了得到序列中的下一个数字,我们取前一个数字,然后:

  • 乘以某个常数a
  • 添加一些其他常数c
  • 当我们除以其他常数时取余数m

到目前为止,没有什么太“计算机科学 y”的可怕的单词或短语,如“矩阵线性递归”或“梅森素数”。让我们为{a, c, m}选择一些值,看看输出是什么样子。

具体来说,让我们以非常简单的 Lehmer 1951 发生器的形式构成一个发生器- a=3c=0,为了确保我们生成 8 位数字,让我们设置m=2^8=256。这最后一位只是意味着数字将保持在[0, 255]之间,因此适合 8 位。

**3, 9, 27, 81, 243**, 217, 139, 161, 227, 169, 251, 241, 211, 121, 107, 65, 195, 73, 219, 145, 179, 25, 75, 225, 163, 233, 187, 49, 147, 185, 43, 129, 131, 137, 155, 209, 115, 89, 11, 33, 99, 41, 123, 113, 83, 249, 235, 193, 67, 201, 91, 17, 51, 153, 203, 97, 35, 105, 59, 177, 19, 57, 171, 1, **3, 9, 27, 81, 243**, 217, 139, 161, 227, 169, 251, 241, 211, 121, 107, 65, 195, 73, 219, 145, 179, 25, 75, 225, 163, 233, 187, 49, 147, 185, 43, 129, 131, 137, 155, 209

那么我们已经看到了什么问题呢?

  • 所有的数字都是奇数,所以我们根本没有一致地接触到所有的数字(任何可观察到的模式都是随机性的对立面)
  • 这段时间很短——你可以看到我们在中途回到起点,然后开始重复自己

如果 lcg 如此糟糕,那么这与今天的 PRNGs 有关系吗?

因为 lcg可怕。上面的 LCG 很糟糕,但这与作为一个数字生成器家族的 LCG 本身关系不大,而与我们参数化它的方式关系更大。事实上,下面的 LCG 被称为drand48,并且是java.util.Random的基础:

但是与上面的 LCG 规范有一个关键的不同。

不只是输出‘状态’,而是它的一个函数

在第一个例子中,我们只是生成了序列中的下一个数字并输出它。如果是255,那么我们序列中的下一个数字是255。别开玩笑了。在上面的 LCG 实现中,情况并非如此——我们有下面的yield seed >> 16。在 python 中,这是一个按位运算符,将所有位向右移动 16 位,结果最右边的 16 位被丢弃。

我们可以举一个例子——如果我们有数字1017,我们可以用二进制表示为11 1111 1001(间距只是为了便于阅读)——如果我们做1017 >> 3,那么我们最后得到111 1111(也就是127),也就是说,我们将所有内容向右移动 3 位,并删除右边的前 3 位。这只是一个这样的函数,它展示了一种提高产量的方法。现在,我们的 LCG 算法有了以下设置:

  • 生成序列中的下一个数字——这是 LCG 的“状态”(只是术语)
  • 使用“状态”生成“输出”——这是随后用于形成序列一部分的数字

这就是为什么我们可以有一个具有“8 位输出”的“16 位发生器”,因为发生器的“状态”是一个 16 位数字,但输出是一个 8 位数字,其中 8 位数字是通过对 16 位状态应用一些函数来创建的。正如我们将会看到的,创建具有不同输出状态的 PRNGs 可以极大地改善它们的统计特性。

随机图表:可视化随机性

为了获得关于各种算法有多随机的一些直觉,我们需要一种方法来可视化这种随机性。为此,我们将再次借用梅丽莎·奥尼尔论文中的一个观点。实际上,随机数发生器比我们将要做的要大得多(64 位状态,32 位输出),但以下是想法:

  • 创建一个具有 16 位状态的生成器,即种子/状态在范围[0, 65535](其中上限为2**16-1)内
  • 输出一个从 16 位状态导出的 8 位数字——即输出序列中的每个数字都在[0, 255]
  • 取序列并将相邻的点成对分组,即[x_0, x_1], [x_2, x_3], etc
  • 这些对在一个 256 x 256 的图形中形成了{x, y}坐标
  • 使用 PRNG 生成2^16坐标并绘制,如果没有配对坐标,则该坐标为白色,给定坐标上的配对越多,该坐标将越黑

在某种程度上,这将给我们一个很好的随机图像。如果我们有一个好的算法,我们会有一个有很多点的图,总体上看起来是随机的。通过一个例子就可以很容易地看出这一点。让我们用一个参数化好的“16 位状态,8 位输出 LCG”画出几个“随机图”。

作者图片

左上角的图表显示了当我们取 16 位状态数中最右边的 8 位时得到的结果。例如,如果我们迭代的“状态”是用二进制表示为1111 1111 1000 0101的数字65413,那么我们将输出最右边的 8 位- 1000 0101(或133)。我们对所有的数字都这样做,将它们成对分组并绘制出来。

我们可以看到,这些数字看起来一点也不随机——它们形成了整齐的直线。这是马萨格里亚定理,显示了当我们的周期太小时 lcg 的问题(因此得到像这样的重复值)。然而,随着我们向更高的 16 位状态发展,情况开始有所好转。在右下方的图表中仍然有一个清晰的结构,但我们在覆盖空间方面做得更好。

因此,当看到这一点时,我们可以做出如下观察:由 LCG 产生的 16 位状态数中的 8 位组越高,它们看起来越随机。

输入 PCG

尽管 lcg 仍有广泛的实际用途,但它们不是 2019 年前 NumPy 的默认 PRNG。相反,在 NumPy 1.17 之前,使用了一种叫做梅森扭扭器的算法——具体来说是 mt 19937——因为其周期长度(绝对巨大)是一个梅森素数(2**19937 - 1-2 的负 1 次方)而得名。然而,随着 1.17 NumPy 版本的发布,它切换到默认 PRNG 是一个 PCG - 置换(线性)同余发生器

PCG 是 Melissa O'Neill 创建的一个生成器家族,它巧妙地利用了上面的观察结果——尤其是图表。想法是这样的:

  • 输出状态的函数,而不是直接输出状态,似乎增加了随机性
  • lcg 在低位(左上图)明显缺乏随机性,但高位往往“更随机”(右下图)
  • 例如,如果我们有一个输出 8 位数的 16 位状态,那么我们只需要选择 8 位来输出
  • 为什么我们不使用 16 位状态中最随机的前几位来选择将哪个函数应用于 16 位状态的其余部分,以生成 8 位输出
  • 换句话说,让我们使用我们状态中最随机的部分来随机选择一个变换函数应用于状态的其余部分——一种随机的排序算法

让我们看一个简单的例子。

PCG 的

上述 9 个图表执行以下操作:从 16 位状态计算 8 位输出,其中 8 位输出是通过预定的位移(从左上 0 到右下 8)生成的。但是,如果不是固定的换档,而是随机的换档呢?

我们从哪里得到这种随机性?从我们 16 位状态的最高几位开始。换句话说,如果我们有一个状态57277 ( 1101 1111 1011 1101),我们可以:

  • 使用最高的 2 位11来确定移位,在本例中为 3
  • 将此移位应用于其他位,01 1111 1011 1101 s.t .我们不是选择最左边的 8 位,0111 1110,而是将 3 向右移位并选择位1111 0111

在某种程度上,我们在查看上述 9 个图表时所做的是使用 8–15,9–16 图的随机性来随机选择我们是否从{4-11} - {7-14}图中选择一个数字。让我们看看这个是什么样子的:

作者图片

很明显,仍然有一些结构,但通过简单地取 16 位状态的最高 2 位,并使用它来选择状态其余部分的置换,改进是巨大的——因此命名为置换(线性)同余生成器。但这仅仅是一种这样的转换——位移。

其他变形呢?有大量的变换(异或、旋转等)可用于创建 PCG 族,其中高位随机选择哪种排列应用于线性生成的状态。让我们来看另外两种可以使用的排列。

旋转

我们可以(随机)选择的一种变换是比特的“旋转”。就像前面的>>操作符一样,我们将位向右移动并丢弃溢出,通过旋转,我们移动一个方向,但不是丢弃溢出,而是将溢出带到另一侧。

如果我们有数字113,用二进制表示为111 0001,我们可以执行2的“右旋转”来创建011 110060。这里,我们将最右边的 2 位(01)旋转到最开始的位置,并将所有内容下移。

xorshift

我们可以应用的另一种变换是“xorshift”。还是那句话,我们用同一个例子来说明。再次采取113 ( 111 0001)我们可以:

  • 将其下移一个量,例如 2,得到001 1100
  • 按位异或函数应用于原始数字和移位后的数字

在这种情况下,我们将对111 0001001 1100计算xor(或者 python 中的^)以获得110 1101(当只有 1 位为 1 时为 1,如果两者都为 1 或 0,则为 0)。

PCG XSH-RS 和 PCG XSH-RR

现在让我们看看两种常见 PCG 的随机曲线图,看看它们与上面的相比如何。它们是:

  • PCG XSH-RS:首先计算一个 xorshift 操作,然后随机地移位结果位
  • PCG XSH-RR:首先计算一个 xorshift 操作,然后随机地旋转结果位

作者图片

同样,仍然有结构,但他们是一个显著的进步。这种结构的存在是因为我们使用的是“小型”发电机。正如 16 位状态的高 8 位比低 8 位更随机一样,32 位状态的高 16 位比低 8 位更随机。当我们使用越来越大的状态时,我们自然会增加周期。将这两者结合在一起就是为什么即使是非常大的(96 位状态,32 位输出)lcg 也能通过 大碾压——Pierre L ' e cuyer 和 Richard Simard 打包的一组广泛的统计测试,用于测试 PRNGs 是否具有前面提到的理想特性。

给定随机选择的排列的附加随机性,PCG 的性能比 lcg 好得多,因此不需要如此大的状态来通过测试套件。正是因为这个原因,它们被作为 NumPy 中的默认 PRNG——确切的算法是 PCG XSL RR 128/64。

世界人口中心在哪里?

原文:https://towardsdatascience.com/where-is-the-population-center-of-the-world-749dc3f86a63

我们发现地球上有一个圈,50%的人住在这个圈内

世界上的大部分权力集中在美国和欧洲等西方国家,使得这些地方在世界舞台上非常突出。但是如果从人口数量来看,世界的中心在哪里呢?受到 youtube 上一个真实生活故事视频的启发,我去寻找一个你能在地球上画的最小的圆,50%的人住在这个圆里面,50%的人住在外面。这个圆圈的中心可以被称为世界人口中心。

在这篇文章中,我们将深入探讨许多与地理相关的话题,这些话题是我在读博士时就有的激情所在。您将学习如何:

  • 将网格数据读入 Python
  • 将格网数据集与面相交
  • 在地理投影之间转换数据
  • 在平面地图上画圆,也称为大圆距离

在接下来的几节中,我将慢慢介绍我们的解决方案,从我们所有分析的人口数据开始。

github 上的也有这篇文章和代码。

人口来源数据

我们分析的核心是人口数据。我选择使用在 WorldPop 上发布的 1 公里网格人口数据集。在比尔和梅林达·盖茨基金会的资助下,许多大学整理了这个数据集。它覆盖了全球,并提供了生活在特定网格单元中的人口数量:

世界人口网格数据的可视化

我选择使用他们提供的最新数据集,即 2020 年的数据集。

array([[-3.4028235e+38, -3.4028235e+38, -3.4028235e+38, ...,
        -3.4028235e+38, -3.4028235e+38, -3.4028235e+38],
       [-3.4028235e+38, -3.4028235e+38, -3.4028235e+38, ...,
        -3.4028235e+38, -3.4028235e+38, -3.4028235e+38],
       [-3.4028235e+38, -3.4028235e+38, -3.4028235e+38, ...,
        -3.4028235e+38, -3.4028235e+38, -3.4028235e+38],
       ...,
       [-3.4028235e+38, -3.4028235e+38, -3.4028235e+38, ...,
        -3.4028235e+38, -3.4028235e+38, -3.4028235e+38],
       [-3.4028235e+38, -3.4028235e+38, -3.4028235e+38, ...,
        -3.4028235e+38, -3.4028235e+38, -3.4028235e+38],
       [-3.4028235e+38, -3.4028235e+38, -3.4028235e+38, ...,
        -3.4028235e+38, -3.4028235e+38, -3.4028235e+38]], dtype=float32)

read命令产生一个包含所有人口数据的 numpy 数组。一个显著的特征是所有的-3.4028235e+38值,文件的元数据显示它们是 NA 值。这主要包括没有人居住的水体。接下来,我们将这些值转换为适当的 NA 值,并对所有非 NA 值求和:

7.966754816

所以根据数据集,2020 年有 79 亿人生活在地球上。这完全符合我的预期。为了以后的使用,我们将这段代码重新打包成一个函数,它决定了一个.tif网格文件的总人口大小:

7966755000.0

将人口数据装箱

在第一步中,我们将地图上的所有人口网格单元相加。显然,在我们寻找包含一半人口的圆的过程中,我们不想把整个地图加起来。作为第一步,我们将确定一个小边界框内的总人口。为此,我们要确定哪个网格单元在盒子里面,哪个不在。在地理术语中,这被称为将边界框与 gridcells 相交。首先,我们构建我们感兴趣的边界框:

作者图片

这很好地显示了我们使用荷兰的边界框作为我们的第一个目标。

我探索的第一个解决方案涉及到将每个 gridcells 转换成一个地理点,并执行框和点之间的交集。这种解决方案的问题是,它占用了大量的 RAM,并且每次我试图生成点时,我的 Python 会话都会崩溃。为了补救这种情况,我选择将工作外包给 GDAL。GDAL 是一个带有 Python 绑定的地理空间处理库。

在 GDAL 中,我可以使用 warp 工具来执行所需的分析。然而,这要求所有输入数据都是磁盘上的文件。所以首先我们必须将边界框保存到磁盘,然后我们可以调用 GDAL:

在这里,我们使用 Warp 的切割功能将网格切割成边界框内的 gridcells,并将结果作为新的 tif 文件转储。之后,我们可以简单地使用我们的get_population函数来计算住在盒子里的总人数:

31.186402

这表明有 3100 万人生活在这个盒子里。这与居住在荷兰的 1700 万人非常吻合,加上比利时和德国的人口中心也在这个范围内。为了方便起见,我们将这些步骤封装到一个新的函数中供以后使用:

31.186402

将盒子升级为圆形

但是我们的挑战是用一个圆来执行这个操作,而不是一个盒子。幸运的是,上面给出的整个工作流程并不局限于一个盒子形状,而是适用于任何多边形类型的形状。因此,我们的下一个挑战是围绕一个特定的中心点以特定的半径构建一个圆。

这里的一个问题是,我们使用的人口网格是在经纬度坐标中定义的。圆形地球在平面上的投影使我们不能简单地在地图上画圆。我找到的解决方案采用我们提供的纬度中心点,并将其重新投影到米距离的投影上。然后,我们在投影中构建一个圆,并将该圆投影回经纬度(WGS84):

作者图片

这很好地显示了我们的 2200 公里完美圆在经纬度投影中转化为一个椭圆形。这解释了为什么格陵兰岛在地图上比非洲大得多。我们的格林兰圈准备就绪,我们可以调用get_population_in_shape函数:

1.81848775

这证实了居住在格陵兰岛及其周围的人并不多,准确地说是 180 万。

寻找人口中心

在 Youtube 视频中,主持人命名了一个围绕孟吉镇的 3300 公里的圆圈,以展示世界上 50%的人口居住在其中的最小圆圈。使用我们的工具和数据,我们可以检查这一点:

作者图片

这表明,根据我们的数据,我们很接近,但世界上只有 48%的人生活在圈内。稍微调整一下半径,我们会发现,如果我们将圆扩大一点,我们可以得到精确的 50 %:

3983.822592
0.5000559

我的圈子需要更大一点,这可能与我使用的特定数据集有关。

基于这些工具,下一步可以使用优化算法来尝试并确定我们可以找到覆盖地球 50%人口的最小圆的确切位置和半径。

这篇文章和代码也可以在 github 的上找到。

我是谁?

我叫 Paul Hiemstra,是荷兰的一名教师和数据科学家。我是科学家和软件工程师的混合体,对与数据科学相关的一切都有广泛的兴趣。你可以在 medium 上关注我,或者在 LinkedIn 上关注我。

如果你喜欢这篇文章,你可能也会喜欢我的其他一些文章:

人口数据归属

world pop(www.worldpop.org——南安普顿大学地理与环境科学学院;路易斯维尔大学地理和地球科学系;纳穆尔大学地理系)和哥伦比亚大学国际地球科学信息网络中心(CIESIN)(2018 年)。全球高分辨率人口分母项目-由比尔和梅林达盖茨基金会资助(OPP1134076)。【https://dx.doi.org/10.5258/SOTON/WP00647

我们应该在哪里放置电动汽车充电站?(使用 QGIS 和纸浆)

原文:https://towardsdatascience.com/where-should-we-be-placing-ev-charging-stations-using-qgis-and-pulp-d2bb7b664a55

实践教程

我们应该在哪里放置电动汽车充电站?(使用 QGIS 和纸浆)

曼彻斯特电动汽车充电站最佳位置模型开发之旅

曼彻斯特市的道路图——图片由作者提供

到说服潜在的电动汽车(EV)购买者,发展现有的充电站网络至关重要。术语“里程焦虑”描述了电动汽车车主担心在旅行中耗尽电动汽车电池的情况。目前,大多数电动汽车车主都可以使用家庭充电,而对于那些住在公寓或公寓的人来说,家庭充电几乎是不可能的,这在曼彻斯特市尤为明显。因此,为了满足所有潜在买家的需求,有必要明智地发展充电网络。

使用 GIS 数据

本研究的方法是高度重视地理信息,如交通流量、现有电动汽车充电、充电器的潜在停车场位置和土地使用分类。

68 公里网格中的 GIS 数据输入—作者提供的 QGIS 图像

充电需求是根据 39 至 140k 范围内不同测量点的每日汽车交通流量计算的(图 1)。因为交通流量的测量点不是均匀分布的,在某些区域可能会缺失,所以构建了一个 68 km 的格网,在其中计算每个格网单元的平均交通流量(图 2)。对于那些不包括任何测量点的网格,交通流量将是周围网格的平均值。图 3 所示的土地使用分类也用于确定快速和慢速充电器的合适位置,因为它假设快速充电器将安装在商业或混合使用区域,而慢速充电器则分布在公寓和公寓周围。

停车场(左)和现有的电动汽车充电器(右)——图片由 QGIS 作者提供

图 4 显示了潜在的电动汽车充电地点,我们在这些地点使用了市政管理的停车场,主要是因为这些数据容易获得(您可以根据您的可行地点进行更改)。图 5 显示了现有的电动汽车充电地点,因此,这些地区的充电需求已经得到满足。反过来,我们的模型必须通过选择充电需求最高的最合适的停车场来考虑这些因素。

开发优化模型

T 这一节讲述了 Python 代码的组成部分,完整的图片可以在 github 找到。我们的第一步是创建一个函数,为需求位置(网格单元的质心)和潜在的电动汽车充电位置(停车场)生成集合。

def gen_sets(df_demand, df_parking):
    *"""Generate sets to use in the optimization problem"""* # set of charging demand locations (i)
    demand_lc = df_demand.index.tolist() # set of candidates for charging station locations (currently    existing parking lots) (j)
    chg_lc = df_parking.index.tolist()

    return demand_lc, chg_lc

其次,使用距离矩阵来生成服务区的概念,如果需求质心和停车场之间的距离大于 500 米(驾驶员愿意为汽车充电的步行距离被认为是 500 米),则二进制变量将被设置为 0,否则其值将为 1。这也可以在 QGIS 中使用距离矩阵函数来执行。

# distance matrix of charging station location candidates and charging demand location
coords_parking = [(x, y) for x, y in zip(df_parking['Easting'], df_parking['Northing'])]

coords_demand = [(x, y) for x, y in zip(df_demand['centroid_x'], df_demand['centroid_y'])]

distance_matrix = distance.cdist(coords_parking, coords_demand, 'euclidean')
scaling_ratio = 1
distance_matrix2 = scaling_ratio * distance_matrix
distance_matrix3 = pd.DataFrame(distance_matrix2,index=df_parking.index.tolist(), columns=df_demand.index.tolist())

然后,我们需要创建一个包含所有参数gen_parameters的函数,以及一个包含每个网格单元 i 中现有电动汽车充电站当前满足的需求的函数gen_demand(这来自 GIS 建模)。然后,我们可以将混合整数线性问题公式化,该问题包括目标函数、变量和约束。我们的目标函数旨在通过从收费收入中减去总资本和运营成本,使加油站的利润最大化。除了保证网格单元 i 在站的服务区域中的需求之外,这些约束确保在站充电的汽车少于站的容量和充电需求。

def optimize(df_demand, df_parking):

    # Import i and j set function
    demand_lc, chg_lc = gen_sets(df_demand, df_parking)

    # Import parameters function
    di, m, p, t, ci_j, cr_j, ce_j, pe, alpha, lj, N, distance_matrix     = gen_parameters(df_demand, df_parking)

    # Import current demand of car park z in cell i
    diz = gen_demand(df_demand)

    # set up the optimization problem
    prob = LpProblem('FacilityLocation', LpMaximize) # Variables
    n = LpVariable.dicts("no_of_chgrs_station_j",
                         [j for j in chg_lc],
                         lowBound=0)
    q = LpVariable.dicts("Remaining_dem_station_j",
                         [j for j in chg_lc],
                         0)
    c = LpVariable.dicts("Tot_costs_station_j",
                         [j for j in chg_lc],
                         0)
    x = LpVariable.dicts("UseLocation", 
                         [j for j in chg_lc], 
                         0, 1, LpBinary) # Equality Equations r = np.full([len(demand_lc), len(chg_lc)], None)

    for i in demand_lc:
        for j in chg_lc:
            if distance_matrix[i][j] <= 500:
                r[i][j] = 1
            else:
                r[i][j] = 0 # Create empty dictionary for the remaining demand in cell i zip_iterator = zip(demand_lc, [None]*len(demand_lc))
    dr = dict(zip_iterator)

    # For each cell i subtract the existing number of charging   stations from the charging demands in cell i for i in demand_lc:
        for j in chg_lc:
            dr[i] = di[i] - diz[i] * m[j]
            if dr[i] < 0:       # limit minimum demand to zero
                dr[i] = 0 # Objective function prob += lpSum(p[j] * t[j] * x[j] - c[j] for j in chg_lc)

    # Constraints for j in chg_lc:
        prob += c[j] == (cr_j[j] + ce_j[j] + ci_j[j] + 0.1 * ce_j[j] + 0.1 * ci_j[j]) * n[j]+ pe * alpha * q[j]
    for j in chg_lc:
        prob += q[j] - n[j] * m[j] <= 0                            
    for j in chg_lc:
        prob += q[j] <= lpSum(r[i][j] * dr[i] for i in demand_lc)
    for i in chg_lc:
        prob += lpSum(x[j] * r[i][j] for j in chg_lc) - 1 <= 0
    for j in chg_lc:
        prob += n[j] - x[j] >= 0
    for j in chg_lc:
        prob += n[j] - lj * x[j] <= 0
    prob += lpSum(x[j] for j in chg_lc) == N 

    prob.solve()

红点表示电动汽车充电器的最佳停车场

结果

如果我们只考虑实现 10 个快速充电器(40 分钟充电到 80%),优化产生上述结果。停车场 1-6 都位于通往城市的交通要道沿线(较暗的区域),表明充电需求较高。除此之外,所有确定的快速充电器位置都位于商业/混合使用区域(黄色区域)周围,如超市、商场和餐馆。您还会注意到,更大比例的充电器位于市中心之外(图中左),因为所有现有电动汽车充电器中约有 50%位于市中心,满足了现有需求。

结论

如果你已经到达这一部分,我希望这个案例研究已经鼓励你在你自己的城市重现这一点,你所需要的是一些在英国容易获得的地理信息,如交通流量,你可能想要放置站的地方和现有的电动汽车充电位置。该模型中充电站的最优位置主要由交通流的地理分布和基于土地利用分类的不同充电可能性决定,因此地理信息在优化过程中起着重要作用。然而,这种模式有一些局限性。在未来的研究中,改变网格的大小对于找出它的灵敏度是必不可少的。此外,充电需求的建模方式没有考虑交通流的结构,特别是车辆的起点和终点。因此,在每个需求节点中,电动车辆电池的状态是未知的。

欢迎在评论中分享你的想法,或者在 LinkedIn 上给我发你的问题,我会试着发布关于能源和气候变化的数据科学内容。

参考

[1]:边,,弗雷德里克·沃林,安德斯·阿韦林,,于志新(2018 年 8 月)寻找公共充电站的最佳位置——基于地理信息系统的 MILP 方法https://www . science direct . com/science/article/pii/s 1876610219300803

[1]:葛,s,冯,刘,(2011 年 9 月)。基于网格划分法的电动汽车充电站规划。在电气
和控制工程(ICECE),2011 年国际会议上(第 2726-2730 页)。IEEE。

数据源

现有电动汽车充电器位置

市政会管理的停车场

道路形状文件

土地利用分类

日交通流量

我们应该在哪里吃饭?决策分析的五个规则解释

原文:https://towardsdatascience.com/where-should-we-eat-the-five-rules-of-decision-analysis-explained-67684c3a5001

温和地介绍将数据科学与可操作价值联系起来的学科

乍得·蒙塔诺在 Unsplash 上的照片

作为一名数据科学家,我发现决策分析领域是我工作中被低估的工具。当我对统计和编程的热情将我拖进杂草深处时,决策分析将我的注意力拉回到全局影响上。

决策分析的核心由五条规则组成,这些规则开启了一个强大的量化框架。这些规则最初是由罗纳德·霍华德教授制定的,并在他的书【决策分析的基础】中进行了概述。

这些规则概述了决策的“代数”。它们提供了在数学上严格的框架中捕捉主观信念和偏好的能力。

在本帖中,我们将探索决策分析的每一条规则,以回答这个时代的一个重大谜团— 今晚我们应该在哪里吃饭?

晚餐的决定

我们正试图决定我们想在以下两个餐馆中的哪一个吃晚餐:

  1. 轮盘赌墨西哥卷饼:轮盘赌墨西哥卷饼是德克萨斯州奥斯汀的一家新的(虚构的)墨西哥卷饼店,所以你知道它很不错。他们的鲑鱼玉米饼有库存的时候非常好吃。不幸的是,他们提供的唯一一餐是沙拉,这令人失望。
  2. 可靠的兰迪披萨店:可靠的兰迪披萨店有很好的意大利辣香肠披萨。他们偶尔会卖完辣香肠,但他们总是有奶酪披萨作为备用。

规则

我们现在将使用决策分析的五个规则来分解这个决策。到最后,我们就知道今晚去哪里吃饭了。

1.概率规则

我们必须用概率来量化决策中的所有不确定性。

第一条规则指导我们分配概率来量化决策中的任何不确定性。这些概率本质上是贝叶斯而非频率主义的,因为它们捕捉了决策者的主观信念。**

晚餐的决定有两个不确定性:

  1. 当我们到达时,轮盘赌的墨西哥玉米卷是否有墨西哥玉米卷。
  2. 我们到的时候可靠的兰迪家是否会有意大利香肠。

根据过去的经验(数据),我们认为轮盘赌的墨西哥玉米卷有 75%的可能性会有墨西哥玉米卷,可靠的兰迪的墨西哥香肠有 90%的可能性会有。

概率评估是数据科学为决策分析工作流做出贡献的地方。也许我们可以使用建模技术来分析数据,以获得更精细的见解。例如,一个优秀的数据科学家可能会计算出一个概率,说明我们去餐馆的时间。事实上,决策分析的一个核心概念是信息 (VOI)的价值,它基于数据科学家更新决策者信念的能力来量化数据科学家工作的价值。见这里更详细的讨论 VoI。

在决策分析中,数据科学的作用是告知决策者的信念。

基于我们的信念,我们可以用下面的决策树来表示决策:

图片作者。总结晚餐决定的树。我真的拍了照片,吃了所有展示的食物。

注意,在决策树中,方块代表决策,圆圈代表彩票。

红色方块代表关于我们将选择哪家餐馆的决定。一旦我们选择了一家餐馆,我们将面临一次不确定的抽奖,关于他们将提供哪些饭菜。

2.顺序规则

我们必须根据我们的偏好排列所有可能的结果。

在晚餐决策中,有四种可能的结果:轮盘赌的墨西哥玉米卷,轮盘赌的沙拉,可靠的兰迪的意大利香肠披萨,可靠的兰迪的奶酪披萨。

我们必须以非循环的方式对结果排序。例如,我们不能更喜欢墨西哥玉米卷而不是沙拉,沙拉而不是奶酪披萨,奶酪披萨而不是墨西哥玉米卷,因为这导致了偏好的循环。

在这种情况下,排序我们的偏好很简单。玉米饼是最好的选择。之后,意大利香肠披萨是我们的第二选择,其次是奶酪披萨。沙拉令人失望,所以我们将它放在底部。我们的顺序是:

  1. 轮盘赌店的玉米卷
  2. 可靠兰迪店里的意大利香肠披萨
  3. 可靠兰迪的奶酪披萨店
  4. 轮盘赌上的沙拉

3.等价规则

如果我们更喜欢 A 而不是 B and B 而不是 C,那么存在一个概率 p 使得我们对 B 和一个 A 的概率为 p 和 C 的概率为 1-p 的彩票不感兴趣

等价法则允许我们将每一个可能的结果等同于最好和最差结果之间的抽奖——墨西哥玉米卷和沙拉。让我们从意大利香肠比萨饼开始。

我们需要确定无差异概率p、使得:

图片作者。我们需要在墨西哥卷饼和沙拉之间进行抽签,我们认为这两种食物和意大利辣香肠披萨一样受欢迎。

比起意大利香肠比萨饼,我们更喜欢墨西哥卷饼;比起沙拉,我们更喜欢意大利香肠比萨饼。因此,自然地,一定有一些沙拉风险,我们愿意接受美味的墨西哥玉米卷,而不是一个肯定火辣香肠比萨饼的机会。

考虑两种极限情况:

  • 如果 p=1 ,我们将对意大利辣香肠披萨和墨西哥玉米卷不感兴趣。我们没有。我们更喜欢玉米卷!
  • 如果 p=0 ,我们将对保证的意大利香肠比萨饼和保证的沙拉无动于衷。我们没有。披萨好吃多了!

所以, p 介于0 和 1 之间。

无差异概率仅仅描述了我们的偏好。它不是根据数据计算出来的。

我对有保障的意大利香肠比萨饼和有 80%机会吃墨西哥卷饼和 20%机会吃沙拉的彩票不感兴趣。所以,对于可靠的兰迪的意大利辣香肠披萨,我们将使用 p =80%。

我们还需要确定我们对奶酪披萨的无差异概率。奶酪比萨几乎和意大利香肠比萨一样好,但仍然比沙拉好得多。我的无差异概率是 70%,所以我同意下面的说法:

图片作者。我对保证奶酪比萨饼和这里显示的墨西哥玉米卷和沙拉之间的彩票不感兴趣。

4.替代规则

如果我们在 B 和 A 和 C 之间的一张彩票之间无动于衷,我们必须愿意用 B 来代替彩票。

替换规则允许我们用我们在上一节中确定的彩票来交换决策树中的意大利香肠比萨饼和奶酪比萨饼。此过程给出了以下决策树:

图片作者。在用比萨饼代替他们的等价彩票后的决策树。

替换是有帮助的,因为现在我们的决策树只有两种可能的结果——玉米卷和沙拉。注意,可靠的兰迪披萨店的彩票可以用全概率法则简化。

有靠谱兰迪分支的玉米饼总概率是(0.90 x 0.80) +(0.10 x 0.70) = 79%。我们发现,用同样的方法或通过识别总概率总和必须为 100%,分支的沙拉的总概率是 21%。

这种简化产生了以下决策树:

图片作者。使用全概率法则简化“可靠的兰迪比萨店”分支后的决策树。

5.选择规则

如果我们更喜欢 A 而不是 C,我们面对 A 和 C 之间的多张彩票,我们必须选择 A 概率最高的彩票。

这个规则是直观的。我们已经把我们的决策树减少到了在墨西哥卷饼和沙拉之间的两次抽签。比起沙拉,我们更喜欢玉米饼,所以一定要选择玉米饼概率较高的彩票,也就是可靠的兰迪披萨店。

轮盘赌的墨西哥卷饼实际上是墨西哥卷饼和沙拉之间的抽奖,有 75%的机会是墨西哥卷饼。根据决策分析的规则,我们确定可靠的兰迪比萨店相当于在墨西哥卷饼和沙拉之间进行抽奖,有 79%的机会得到墨西哥卷饼。

看来我们今晚要吃披萨了!

结论

在这篇文章中,我们探讨了决策分析的五条规则。这些规则是强大的定量决策框架的基础。尽管我们探索的晚餐例子非常简单,但它有助于为更复杂的决策建立直觉。

决策分析的核心是将信念和偏好转化为理性行动。

感谢你阅读这篇文章。如果你对更多决策分析和统计内容感兴趣,关注我LinkedIn

参考

  1. 罗纳德·霍华德,《决策分析的基础》IEEE 系统科学与控制论汇刊 4.3(1968):211–219。

哪些特征工程技术可以提高机器学习预测?

原文:https://towardsdatascience.com/which-feature-engineering-techniques-improve-machine-learning-predictions-227d732068f5

对于 ML 从业者来说,理解各种特征工程技术是很方便的。毕竟,关于机器学习和深度学习模型如何实时执行,特征是最具决定性的因素之一。

阿兰·范在 Unsplash 上的照片

当谈到机器学习时,人们可以做的改善 ML 模型预测的事情将是选择正确的特征并移除那些对模型性能影响甚微的特征。因此,选择正确的特征可能是数据科学家或机器学习工程师需要的最重要的步骤之一,他们经常被分配工作,特别是在构建那些能够分别在测试数据集上很好地概括的复杂模型时。

例如,考虑到预测一个人是否会患心脏病的任务,可以产生良好影响的最强指标之一将是身体质量指数(身体质量指数)。当我们试图预测一个人可能有的血压(BP) 水平时,如果不考虑这一特征,并且不在我们的数据集中使用它,往往会导致结果不太准确。在这种情况下,身体质量指数可能是一个人正在遭受这些医疗状况的强烈指示。因此,考虑这一特性是很重要的,因为它对结果有很大的影响。

考虑另一个预测某人是否会拖欠贷款的案例研究。在贷款给一个人之前,考虑中的银行会在贷款前询问一系列问题,如工资、资产净值和他们的信用记录。如果我们让一个人根据一系列因素,比如上面提到的,来决定是否给一个人贷款,他/她会检查总工资和他们的整体信用记录。

类似地,当数据以与人类相同的方式提供给 ML 模型时,它将学习获得重要的表示,以决定一个人是否会偿还贷款。如果我们去除工资等特征,那么 ML 模型将会丢失一些关键信息,而这些信息对于它来说是无法完全破译一个人是否会偿还贷款的。因此,由于数据中缺少一个最重要的特征(工资),它的预测可能会有很大的误差。因此,这凸显了拥有正确的功能对于我们的机器学习和深度学习模型分别在测试集和实时数据上表现良好的重要性。

机器学习中的各种特征化技术

既然我们已经了解了在确定模型预测质量时决定正确特征的重要性,我们现在将继续寻找各种有助于模型预测并改善其结果的特征化技术。

归罪

这是一种我们填充数据中缺失值的方法。我们在互联网上发现了大量的数据集,例如玩具数据集,它们包含几乎所有的特征和标签,没有异常或缺失数据。然而,这在现实生活中可能远非如此,因为大多数真实世界的数据都包含缺失值。因此,必须采取特定的步骤来确保缺失的值以某种方式被填充。

我们可以用各种方法进行插补。我们可以用平均值或特征的平均值来填充缺失值。还有其他方法,如特征的中位数插补和众数插补。因此,通过执行这些方法,我们不会得到包含缺失值的数据。

如果我们预测一个人是否会拖欠贷款,我们会使用工资作为我们机器学习模型的重要特征之一。然而,所有参与者的工资信息可能不会出现在我们的数据中。因此,最好的方法之一是分别用整个薪金特征的平均值来估算或填充这些缺失值。

缩放比例

我们倾向于为我们的模型赋予不同的特征集,基于这些特征集,我们可以确定用于预测结果或目标变量的最佳特征。然而,需要注意的是,当我们最初接收数据时,我们使用的特征可能具有不同的比例。

举个例子,有助于确定房价的特征。在这种情况下,特征可能是卧室的数量和利率。我们无法比较这两个特征,因为卧室的数量是以单位来衡量的,而利率则分别以美元($)来衡量。如果我们把这个数据给我们的 ML 模型,它会简单地理解为美元是一个大数目的单位,分别高于卧室功能的数量。然而,正如我们在上面看到的那样,这远非事实。因此,在将要素提供给模型进行预测之前,执行要素的缩放操作非常重要。

正常化

这是我们执行缩放操作的一种方式,其中在转换数据中的其他值之前,对所考虑的单个要素取最大值和最小值。我们确保这些特性的最小值为 0,最大值为 1。这将确保我们能够用我们的模型产生最佳结果,并获得良好的预测。

以客户是否会离开或留在互联网服务为例,月费和任期等特征是一些重要的特征。看看每月的费用,可以是美元($) ,而任期可以是年或月为单位。由于它们的规模不同,因此在这种情况下,归一化会非常方便,并确保我们获得最佳的模型预测。

标准化

在转换要素时,标准化类似于归一化,只是我们转换数据的方式使得我们得到的输出对于每个单独的要素都具有单位方差和零均值。正如我们已经看到的,不同的特征有不同的尺度常常会使混淆模型,仅仅因为数据的尺度就认为一个特征比另一个更重要,执行标准化操作可以帮助确保我们得到最好的预测。因此,这是机器学习实践者在构建最佳预测时经常采取的步骤。

在预测汽车价格时,我们会分别考虑气缸数量和行驶里程等因素。由于这两个特征的规模不同,在给出预测模型之前,我们必须进行标准化,使特征之间有一个共同点。

一个热编码

想象一下,在我们的数据中有大量的分类特征。我们数据中的一些分类特征可以包括国家、州、名称等特征。我们从这些特征中看到,我们只生成这些实例的出现,而没有得到数字表示。

为了使我们的 ML 模型工作良好并利用数据,分类特征(如上所示)应该被转换成数字特征,以便模型执行计算。因此,我们执行这个热编码步骤,以便将分类特征转换成数字特征。

现在有人可能会问,算法实际上是如何做到这一点的。它会简单地将每个特性的每个类别视为一个单独的列。特定类别的存在或不存在将被标记为 1 或 0。如果我们发现一个特定的类别存在,我们就把值设为 1,反之亦然。

响应编码

这是另一种与热编码非常相似的方法,因为它可以处理分类数据。但是,它将分类特征转换为数字特征的过程与以前的方法不同。

在响应编码中,我们最感兴趣的是每个类别目标的平均值。例如,以确定房价为例。为了预测每个地区的房价,我们将对这些地区进行分组,并找出每个地区的平均房价。稍后,我们将使用每个地区的特定平均房价来替换地区,用来表示这个数字值,这在早期是一个分类特征。因此,我们的模型可以从本质上了解一个社区在决定房价方面有多大影响。因此,在这种情况下,响应编码非常方便。

考虑到预测汽车价格的问题,可能会有 SUV 或者轿车之类的汽车。价格有时可以由这两个特征决定。因此,在使用响应编码转换分类特征(汽车类型)时,响应编码会很有用。我们只考虑 SUV 和轿车的平均价格。如果我们将 SUV 作为汽车类型,我们用 SUV 汽车细分市场的平均价格来代替它。当我们将汽车类型视为轿车时,我们分别用轿车细分市场的平均价格来代替。

处理异常值

离群值是被认为是数据中异常的数据点。然而,同样重要的是要注意,数据中的一些异常值对于模型正确地确定结果是非常有用和重要的。如果我们发现数据中有大量异常值,它可能会扭曲模型,无法对异常值做出正确的预测,也无法对实时数据进行很好的概括。因此,我们必须采取正确的步骤,确保在训练模型并将其投入生产之前删除它们。

有各种方法可以用来去除数据中的异常值。其中一些包括从每个特征中找到标准偏差。如果数据点高于或低于平均值 3 个标准偏差,我们可以自动将它们归类为异常值并将其移除,以便它们不会影响机器学习模型预测。

考虑到一个人是否会拖欠贷款,可能会有一个人的工资信息。工资信息可能并不总是准确的,在这个特性中可能有很多异常值。用这些数据训练我们的 ML 模型通常会导致它在测试集或看不见的数据上表现不佳。因此,最好的步骤是在将数据提供给 ML 模型之前从数据中移除异常值。这可以通过理解工资的标准偏差来实现,并且对于模型来说,高于或低于 3 个标准偏差的值将被自动移除,以进行稳健的预测。

对数变换

当我们发现数据中存在严重偏差时,可以使用这种技术。如果存在大量偏斜,即数据包含大量集中在特定区域的值,而少数异常值和数据点远离平均值,则我们的模型很有可能无法理解这种复杂的关系。

因此,我们将使用对数转换来转换该数据并减少偏斜度,以便该模型对异常值更加稳健,并能够对实时数据进行很好的概括。对数变换可以是一种方便的特征工程技术,分别提高 ML 模型的性能。

类似于上面预测一个人是否会拖欠贷款的问题,我们也可以将对数转换应用于工资,因为我们在工资信息中看到许多偏差。大量的人(大约 80%)获得基本工资,而一小部分人(大约 20%)获得大量工资。数据中存在相当大的偏差,这实际上可以通过使用对数变换来消除。

结论

阅读完这篇文章后,我相信您能够理解对您的机器学习模型很重要的各种特征工程技术。由于使用了人工智能,在正确的时间使用最好的特征工程技术可以非常方便,并为公司提供有价值的预测。

如果你想获得更多关于我的最新文章的更新,并且每月只需 5 美元就可以无限制地访问中型文章,请随时使用下面的链接来添加你对我工作的支持。谢了。

https://suhas-maddali007.medium.com/membership

以下是您联系我或查看我作品的方式。

GitHub: 苏哈斯马达利(Suhas Maddali)

YouTube:https://www.youtube.com/channel/UCymdyoyJBC_i7QVfbrIs-4Q

LinkedIn: (1)苏哈斯·马达利,东北大学,数据科学| LinkedIn

中等: 苏哈斯·马达利—中等

哪些模型是可解读的?

原文:https://towardsdatascience.com/which-models-are-interpretable-5c7d2d0aa208

一些可解释的机器学习模型概述

作者图片

模型解释是有监督机器学习中的一项基本任务。解释模型如何表示信息对于理解支配我们数据的动态是至关重要的。我们来看几个容易解读的模型。

为什么我们需要解释我们的模型?

数据科学家的角色是从原始数据中提取信息。他们不是工程师,也不是软件开发者。他们挖掘内部数据,从矿井中提取黄金。

了解一个模型做什么和如何工作是这项工作的一部分。尽管有时黑盒模型比其他模型更好,但如果我们需要从数据中学习一些东西,它并不是一个好主意。相反,一些本质上非常擅长解释如何将数据转化为信息的模型,必须总是优先选择和深入研究。

机器学习模型是一种将信息翻译成合适且可理解的语言的方法,这种语言就是数学。如果我们能把一些东西翻译成数学,我们就能从中学到更多,因为我们可以根据需要掌握数学。因此,模型不仅仅是我们可以用来预测顾客是否会购买某样东西的算法。这是一种理解“为什么”具有特定特征的客户可能会购买某些东西,而另一个具有不同特征的客户不会购买任何东西的方式。

因此,模型解释对于给我们所寻找的信息以适当的形式是至关重要的。

通过特征重要性进行解释

解释模型如何“思考”我们的数据以提取信息的一种可能方式是查看特征的重要性。重要性通常是正数。该数字越大,模型对该特定功能的重要性就越高。

在本文中,我将展示一些模型,这些模型使用 Python 和 scikit-learn 库为我们提供了它们自己对特性重要性的解释。让我们永远记住,不同的模型赋予我们不同的功能重要性。这是完全正常的,因为每个模型都是一种看待信息这个奇妙而复杂的棱镜的方式。我们从来没有完整的视图,所以特性的重要性很大程度上取决于我们选择的模型。

我们先导入一些库和 scikit-learn 的“wine”数据集。

import numpy as np 
from sklearn.datasets 
import load_wine,load_diabetes 
from sklearn.tree import DecisionTreeClassifier 
from sklearn.ensemble import RandomForestClassifier,GradientBoostingClassifier from sklearn.linear_model import * 
from sklearn.svm import LinearSVC,LinearSVR 
import xgboost as xgb 
import matplotlib.pyplot as plt 
from sklearn.pipeline import make_pipeline 
from sklearn.preprocessing import StandardScaler

现在,让我们加载数据集并存储要素的名称。

X,y = load_wine(return_X_y=True) 
features = load_wine()['feature_names']

现在,我们准备计算不同类型模型的特征重要性。

决策树

基于树的模型根据特征在整个树中提供的叶子纯度的总改善来计算特征的重要性。如果一个特征能够正确地分割数据集并提高特征的纯度,那么它肯定是重要的。为了简单起见,基于树的模型中的重要性分数被归一化,使得它们总和为 1。

在 scikit-learn 中,每个基于决策树的模型都有一个名为 feature_importances_ 的属性,其中包含了特性的重要性。拟合我们的模型后就可以访问了。

让我们看看一个简单的决策树模型会发生什么。

tree = DecisionTreeClassifier() 
tree.fit(X,y) 
plt.barh(features,tree.feature_importances_)

作者图片

正如我们所见,一些特征的重要性等于 0。也许它们并不比例如“脯氨酸”特性更能提高纯度。

一个非常重要的基于树的模型是随机森林,它对特征重要性非常有用。一般来说,集成模型对每个弱学习者给出的每个特征的重要性分数进行平均,然后像在决策树中一样将最终分数再次归一化。

以下是如何计算随机森林模型的要素重要性。

rf = RandomForestClassifier() 
rf.fit(X,y) 
plt.barh(features,rf.feature_importances_)

作者图片

例如,随机森林给出的特征重要性可用于执行特征选择

甚至梯度推进决策树模型也能给我们自己对特征重要性的解释。

gb = GradientBoostingClassifier() 
gb.fit(X,y) 
plt.barh(features,gb.feature_importances_)

作者图片

即使对于 XGBoost 也是如此。

xgboost = xgb.XGBClassifier() 
xgboost.fit(X,y) 
plt.barh(features,xgboost.feature_importances_)

作者图片

线性模型

线性模型也能给我们特征的重要性。实际上,它是一个特性的系数的绝对值。如果我们使用多类线性模型进行分类,我们将对与单个要素相关的系数的绝对值进行求和。

在计算要素重要性时,所有线性模型都需要标准化或规范化的要素。默认情况下,一些模型需要这种变换,但是如果我们想要相互比较系数,我们总是必须应用它。这就是为什么我将使用 scikit 中的 pipeline 对象——在训练模型之前学习标准化我们的数据。

让我们看一个线性核支持向量机的例子。

svm = make_pipeline(StandardScaler(),LinearSVC()) 
svm.fit(X,y) 
plt.barh(features,np.abs(svm[1].coef_).sum(axis=0))

作者图片

这同样适用于逻辑回归。

logit = make_pipeline(StandardScaler(),LogisticRegression()) logit.fit(X,y) 
plt.barh(features,np.abs(logit[1].coef_).sum(axis=0))

作者图片

可用于特征重要性的其他线性模型是回归模型,因此我们必须加载一个回归数据集来查看它们是如何工作的。对于下面的例子,我将使用“糖尿病”数据集。

X,y = load_diabetes(return_X_y=True) features = load_diabetes()['feature_names']

让我们看看线性回归是如何计算特征重要性的。

lr = make_pipeline(StandardScaler(),LinearRegression()) lr.fit(X,y) plt.barh(features,np.abs(lr[1].coef_))

作者图片

套索回归是一个非常强大的模型,可以用于特征重要性(也可以用于特征选择

lasso = make_pipeline(StandardScaler(),Lasso()) lasso.fit(X,y) plt.barh(features,np.abs(lasso[1].coef_))

作者图片

套索回归最亲密的朋友是岭回归,它也很有帮助。

ridge = make_pipeline(StandardScaler(),Ridge()) ridge.fit(X,y) 
plt.barh(features,np.abs(ridge[1].coef_))

作者图片

我们将看到的最后一个模型混合了套索和岭回归,它是弹性净回归。

en = make_pipeline(StandardScaler(),ElasticNet()) en.fit(X,y) plt.barh(features,np.abs(en[1].coef_))

作者图片

结论

模型解释通常是通过计算特征重要性来完成的,一些模型给了我们他们自己对特征重要性的解释。对于那些不能给出特征重要性的模型,我们可以使用一些模型不可知的方法,比如 SHAP(例如,对解释神经网络非常有用)。正确使用特征重要性比模型本身的预测能力更能提高数据科学项目的价值。

原载于 2022 年 6 月 5 日【https://www.yourdatateacher.com】

哪些模型需要规范化数据?

原文:https://towardsdatascience.com/which-models-require-normalized-data-d85ca3c85388

关于需要预处理数据的模型的简要概述

作者图片

数据预处理是每个机器学习项目的重要组成部分。应用于数据的一个非常有用的转换是规范化。有些型号要求它必须正常工作。让我们看看其中的一些。

什么是正常化?

标准化是一个与变量缩放比例相关的通用术语。缩放将一组变量转换为一组具有相同数量级的新变量。它通常是线性变换,因此不会影响特征的相关性或预测能力。

为什么我们需要规范化我们的数据?因为有些模型对特征的数量级很敏感。例如,如果一个特征的数量级等于 1000,而另一个特征的数量级等于 10,则一些模型可能“认为”第一个特征比第二个特征更重要。这显然是一种偏见,因为数量级并没有给我们任何关于预测能力的信息。因此,我们需要通过转换变量,使它们具有相同的数量级来消除这种偏差。这就是缩放变换的作用。

此类转换可以是标准化(将每个变量转换为 0–1 区间)和标准化(将每个变量转换为 0 均值和单位方差变量)。我在另一篇文章中广泛地谈到了这些转变。根据我的经验,标准化工作得更好,因为如果有异常值,它不会收缩变量的概率分布,例如,标准化会收缩。因此,我将在整篇文章中谈论标准化。

需要规范化的模型

我们来看看一些需要在训练前进行缩放的模型。对于下面的例子,我将使用 Python 代码和 scikit-learn 的 Pipeline 对象,它在应用模型之前执行一系列转换,并返回一个可以像模型本身一样调用的对象。

我将要使用的缩放函数是标准化函数,由 StandardScaler 对象执行。

线性模型

除了线性回归,所有的线性模型实际上都需要归一化。Lasso、Ridge 和 Elastic Net 回归是强大的模型,但它们需要标准化,因为所有变量的惩罚系数都是相同的。

lasso = make_pipeline(StandardScaler(), Lasso()) ridge = make_pipeline(StandardScaler(), Ridge()) en = make_pipeline(StandardScaler(), ElasticNet())

逻辑回归也需要标准化,以避免在训练阶段出现梯度消失的问题。

逻辑回归。作者图片

logistic = make_pipeline(StandardScaler(), LogisticRegression())

如果您在没有预先规范化的情况下训练线性回归,则不能使用系数作为要素重要性的指标。如果您需要执行要素重要性(例如,用于降维目的),则必须提前对数据集进行规范化,即使您使用的是简单的线性回归。

lr = make_pipeline(StandardScaler(), LinearRegression())

支持向量机

支持向量机是基于距离的强大模型。他们试图在特征的向量空间中找到一个超平面,该超平面能够根据目标变量的值线性地分离训练记录。

SVM 的例子。作者图片

经过一些修改,SVM 甚至可以用于非线性函数和回归目的。

由于距离对要素的数量级非常敏感,因此也有必要对 SVM 应用缩放变换。

svm_c = make_pipeline(StandardScaler(), LinearSVC()) # For classification svm_r = make_pipeline(StandardScaler(), LinearSVR()) # For regression

k 近邻

KNN 是一种非常流行的基于距离(通常是欧几里德距离)的算法。预测考虑了要素空间中给定点的 k 个最近邻。

k-最近邻。作者图片

就像 SVM 一样,即使是 KNN 也需要使用规范化数据。

knn_c = make_pipeline(StandardScaler(), KNeighborsClassifier()) # For classification knn_r = make_pipeline(StandardScaler(), KNeighborsRegressor()) # For regression

神经网络

最后,神经网络对特征的数量级非常敏感。激活函数总是需要归一化的数据,否则训练阶段将遭受消失梯度问题,就像逻辑回归一样。

神经网络。作者图片

nn_c = make_pipeline(StandardScaler(), MLPClassifier()) # For classification nn_r = make_pipeline(StandardScaler(), MLPRegressor()) # For regression

结论

缩放是一个非常重要的预处理变换,它可以极大地影响训练阶段。如果执行不当,模型的结果肯定是不可靠的。这就是为什么当模型需要时,使用适当的规范化技术是很重要的。

如果你对我在这篇文章中谈到的模型感兴趣,我在我的Python 中的监督机器学习在线课程中广泛地谈到了它们。

原载于 2022 年 6 月 12 日【https://www.yourdatateacher.com】

您应该使用哪种工具进行数据库迁移?

原文:https://towardsdatascience.com/which-tool-should-you-use-for-database-migrations-4e0b9c44b790

根据您的需求选择一个范例。

我所有的数据团队都有一个关系数据库作为我们运营的核心。当你有一个关系数据库,你将不可避免地要改变它!这篇文章将帮助你在三个有用的版本化数据库迁移框架之间做出选择——分别是https://sqitch.org/https://flywaydb.org/liquibase 。GitHub 中有一个关联的存储库,它遍历 dockerized PostgreSQL 数据库中相同表的每个实现。****

TL;博士;医生

帮助你决定的快速决策树(图片由作者提供)

为什么是这三种?

我将本指南的重点放在 sqitch、flyway 和 liquibase 上,因为它们都有两个重要的特征。首先,它们几乎可以与任何关系数据库一起工作——这就排除了微软优秀的 DACPACs。第二,它们都允许用户用普通的 SQL 编写迁移——这省去了像 Alembic 和 T21 这样的迁移的 ORM 实现。

您的数据来自 CRUD 应用程序吗?

你有选择

许多 OLTP 工作负载的定义特征是后端从应用程序层接收和存储数据。所有这三种迁移工具都擅长于保持数据库及其应用程序同步的基本功能。迁移是自动应用于数据库的,而数据仍然保持在相同的表中。

你的数据来自云存储吗?

考虑飞行路线

相比之下,许多 OLAP 工作负载可以通过从云存储(如 S3 或 Azure Blob 存储)再次加载所有暂存文件来轻松复制。Flyway 作为一个 SQL 执行器在这里大放异彩,它可以可靠地再现给定数据库的状态。特别是,在不同类型的普通 SQL 文件中,很容易将 DML 与 DDL 分开。这允许您再次运行相同的转换,但是加载最新的数据。

Flyway 擅长在“回调”中用新数据重复相同的任务

有很多有序的 DML 变换吗?

考虑飞行路线

如果您的数据操作语言在准备好用于下游之前在多个表之间移动数据,那么 flyway 比 sqitch 具有独特的优势,因为您可以很容易地从文件名中推断出执行的顺序。 Flyway 分为“版本化迁移”(V前缀,通常是您的 DDL)和“回调”(afterMigrate前缀,通常是您的 DML)。我的大多数团队都使用 XXXX 数字脚本作为命名约定。在下面的简化示例中,很容易看出毛表是在价格表之后加载的**

这种可解释性对于负责批量分析工作负载的开发人员来说是超级有帮助的。【警告:由于我专注于数据科学,所以有所偏颇。事实上,我部署的所有统计模型都依赖于管道,这些管道迭代地清理和聚集数据,直到它们为模型做好准备。如果您不受实时操作的约束,这就意味着在某个时间间隔会出现大量的“请按顺序执行这个 SQL”。Flyway 是一种每次都能得到相同结果的可靠方法。**

执行的顺序在文件系统中是清楚的(图片由作者提供)

相比之下,sqitch.plan 文件中的 sqitch 隐藏了相同的排序逻辑。当团队使用交叉引用的票号作为他们的文件名时,这变得更加困难。现在,你必须在三个地方查找,以找出什么(文件系统),什么时候(sqitch.plan),以及为什么(JIRA 等人)做了任何事情。

执行顺序在 sqitch.plan 中是显而易见的,但在文件系统中却不明显(图片由作者提供)

您需要恢复迁移吗?

考虑 sqitch

Sqitch 在开发中有更多的开销,因为您必须编写逻辑来进行更改,编写逻辑来测试它是否工作,编写逻辑来在测试失败时恢复更改。这在开始时需要做更多的工作,但是它有一个很好的特性,即您可以将迁移回滚到历史上的任何给定时间点。不幸的是, 回滚迁移是 flyway 中的一项付费功能。

信任但用 sqitch 验证(图片由作者提供)

您使用环境变量来参数化您的部署吗?

避免 liquibase

如果你还没这么做,我会很惊讶的。将数据库秘密置于版本控制之外是安全性 101。不幸的是,使用环境变量是 liqui baseT5的付费特性。flyway 和 sqitch 都支持现成的参数化。当然,您可以深入并修改它们的 docker 入口点,但是为什么有必要这样做呢?!

请将您的秘密置于版本控制之外(图片由作者提供)

还是不确定?

分叉这个存储库 来尝试构建一些您的核心表结构。配置文件和卷映射等所有棘手的事情都已解决,您可以简单地将迁移切换到这三个工具中的任何一个。

你是哪种类型的“数据主管”?

原文:https://towardsdatascience.com/which-type-of-head-of-data-are-you-5203915d6445

隐藏在“数据主管”头衔背后的角色

不同的“数据主管”角色—图片由 Castor 提供

介绍

在过去的几年里,我们看到了数据量的爆炸式增长。随着这一角色的演变,进入这一职位的人的类型也在演变。那么什么样的人应该成为数据领导者呢?这个问题没有简单的答案。数据主管的工作并不是放之四海而皆准的,担任这一角色的人也是如此。

这个职称怎么用有问题。因为“数据负责人”这个词用得很不严谨,所以你无法真正判断一家公司在寻找什么。他们可能在寻找商业智能领导者或数据工程领导者。或者他们两个都想要!也许他们只是在找一只独角兽。也可能他们根本不知道自己想要什么。这导致了员工的困惑,他们不知道自己在这个模式中的位置,也使公司很难根据他们的需求雇佣合适的人。本文旨在帮助大家达成共识。

大多数时候,当一家公司宣称他们需要“数据主管”时,他们可能意味着他们需要:

  1. BI 领导者或经理:知道如何通过清晰地展现业务问题或机遇来理解数据的人
  2. 数据工程领导者:擅长根据 IT 标准确保数据准确和可用的人

这是两种截然不同的角色。我同意它们有时会重叠,但它们通常需要不同类型的人,戴着不同类型的帽子。你怎么知道你想成为哪种类型的数据头?所需的背景/技能?我们在这里都涵盖了。

数据工程领导和 BI 领导有不同的职责——图片由 Castor 提供。

类型 1:工程领导者

代表团

数据工程领导者是使数据科学家的工作成为可能的人。他们与工程师和数据分析师合作,确保公司的数据基础设施可扩展、可靠、安全且经济高效。

他们是做什么的?

工程领导者专注于建立数据科学团队和组织的技术骨干。他们在幕后工作,使分析工作成为可能。他们的任务是创建一个可扩展的、自动化的、安全的、端到端可审计的数据管道。他们的工作可能包括为数据工程(例如 ETL 作业)基础设施管理(例如监控),以及安全和治理(例如隐私政策)构建新的工具或流程。当组织足够成熟时,工程领导者可能会从事数据科学和机器学习。如果你自己也是这种角色,你很可能同时身兼数职:优先处理项目;领导工程师团队;与其他部门沟通,了解他们可以从您的部门中获得什么,同时跟上行业趋势,以保持您的组织的竞争力。我们深入研究每一个类别。

数据工程

工程负责人的一个关键职责是监督和优化数据集成过程。数据集成指的是将来自不同来源的数据组合成一个真实的单一来源的活动:数据仓库。这是数据工程生命周期的第一步,可以使用 ETL 工具来完成。数据工程师通常负责完成这项任务,但也可能由业务分析师、数据科学家和软件开发人员共同完成。数据工程负责:

  • 确保始终有足够的资源支持管道。
  • 跟踪和监控管道中每个组件的容量利用率,包括存储、计算、网络带宽和延迟考虑因素。
  • 定期审查绩效指标,以便在问题变成关键问题之前发现问题。

基础设施管理

作为一名工程领导者,关注数据基础设施的细节是不可取的。这意味着了解您的数据是如何存储的,它是如何在您的系统中移动的,以及您如何将它整理成正确的形状以供分析。数据工程领导者需要知道有哪些工具可以用来处理数据。他们还应该了解这些工具是如何工作的,这样他们就可以做出明智的决定,决定何时应该使用它们,或者哪些功能值得整合到现有的工具中。数据基础设施工具在过去几年中激增,跟踪生态系统变得非常困难。出于简化的目的,我们将指南整合在一起。不要犹豫去看看。

安全和治理

安全性和治理也是数据工程领导者的日常工作。

  • 数据治理是一组确保以高效的方式管理数据资产的流程。在数据工程的上下文中,这意味着确保您有一个关于如何处理数据、如何跟踪数据质量以及谁将使用数据的计划。数据质量是对数据的准确性、相关性和及时性的衡量。这也是对其支持业务流程的有用性的一种度量。良好的数据质量计划将确保您组织的所有信息在被任何应用程序或服务(即用户)使用之前都是最新和准确的。这有助于减少公司内部的错误,并在以后解决问题时节省时间(和金钱)。
  • 数据安全&隐私:作为数据工程师领导,你有责任确保你的系统符合安全标准。这意味着保持行业领先的工具和协议,以确保您公司的敏感信息免受黑客和其他恶意行为者的攻击。请记住:每次您对您的系统进行更改或部署更新时,都有可能危及用户的隐私。

数据工程领导职位向首席技术官汇报,包括领导一个数据工程师团队。数据工程师负责存储和处理数据,构建和维护数据管道,并创建将数据加载到记录系统(SOR)中的 ETL 作业。他们还与数据科学家合作,了解如何扩展和优化 SOR,以支持业务需求。

他们的背景是什么?

工程领导者通常具有计算机科学、软件工程或同等经验的背景。他们也有领导开发团队的经验,包括远程或亲自管理团队。

数据工程负责人负责制定技术路线图,并确保其符合公司的业务战略。这包括建立一个敏捷过程(比如 Scrum)来管理发布,与客户一起定义需求,编写技术规范,审查其他开发人员编写的代码,并且在关注成本和保持质量控制的同时完成所有这些工作。

数据工程领导者的关键指标

数据工程领导者的任务是最终为公司的其他利益相关者提供干净可靠的数据。因此,衡量他成功的关键指标主要与数据质量有关,包括数据的准确性、一致性、完整性和可靠性。数据工程主管还负责公司内部良好的数据管理,以及自动化流程以提高生产率。自动化和良好的数据管理的自然结果是基础设施成本节约。如果您想评估自己作为数据领导者的表现,这也是一个不错的指标。我们已经编辑了一个小指南,解释这些指标如何工作以及如何测量它们。

类型 2:商业智能领导者

代表团

BI 领导者的使命是利用数据推动业务成果。这可能意味着任何事情,从帮助公司做出更好的决策,到优化收入和利润,到改善客户体验。数据业务负责人可能不太懂技术,但有很强的业务知识。他们能够理解如何使技术团队符合业务的需求。

他们是做什么的?

BI 领导者对其组织的数据计划的成败负责,但他们不需要成为每个工具如何工作的专家或能够详细解释它。他们需要知道事情作为一个整体是如何运作的,以及每个部门的目标是什么,但不一定要知道如何使用特定的技术来实现这些目标。

商业智能领导者的使命是利用数据推动商业价值。在某种程度上,他们更直接地接触投资回报的产生。具体来说,他们为三件事而战:、数据发现可操作化指标一致性

发现

数据发现是查找、理解和使用数据做出决策的过程。为了在数据驱动的决策中取得成功,您需要一个可靠的数据发现流程。

将数据发现作为常规业务流程的一部分(而不仅仅是事后的想法),您会发现自己比以往任何时候都更快地做出更好的决策!

数据发现从询问您想要实现的目标开始。换句话说,访问组织中的所有信息是不够的;了解如何使用这些信息也很重要。数据发现确保来自不同团队和小组的人一起收集和分析数据,以便让每个人都了解他们在做什么——无论他们是在尝试新产品创意,还是在查看今年迄今为止表现最好的广告活动。

指标一致性

BI 领导还围绕指标强制执行公司范围内的一致性。如果没有强大的度量流程,后者最终会分散在电子表格、内部仪表盘和数据工具中。由于数据中的多重定义缺乏信任,报告收入等本应简单的指标会变得非常棘手。分散的系统导致团队在定义、所有权和度量标准的准确性上产生分歧。

为了确保在整个公司范围内一致地管理指标,您可以执行以下操作:

  • 为您创建的任何框架或代码库编写文档。如果您已经购买了数据目录工具,您可以在专用于此目的的部分记录您的指标。
  • 确保组织中的所有部门都使用指标存储。这应该是一个工具,他们可以记录他们的指标,它应该支持可视化,以便用户可以看到随着时间的推移趋势。您还应该实施良好的文档实践来支持您的知识工人对数据的访问。

操作化

如果数据工程师领导寻求为公司的其他部门提供干净的数据,那么数据业务领导的任务就是将这些数据操作化。操作化是一种方法,包括让“操作”团队(销售、营销,..).我们将它与仅将数据用于报告和商业智能的更经典的方法区分开来。运营分析不是使用数据来影响长期战略,而是为企业的日常运营提供战略信息。简而言之,就是让公司的数据发挥作用,让组织中的每个人都能做出更明智、更快速的决策。

只有当数据发现已经成为常规业务流程的一部分,而不仅仅是事后的想法时,才能实现数据的可操作性。运营团队并不总是习惯于处理数据。如果您实施了一个强大的 数据发现 流程,领域专家只会将数据作为他们日常运营的一部分,而独立于技术团队。

通常,将数据交给其他团队需要投资一个坚如磐石的数据文档工具。这将确保公司数据:

  • 易于搜索(包括自己搜索)允许所有部门在需要时访问信息。
  • 易于理解:用户可以快速理解他们的源系统中每个表内存在什么。

这三大支柱交织在一起。没有数据发现或指标协调,就无法实现数据操作化。BI 负责人通常并行推动这三个项目。

他们的背景是什么?

BI 领导者通常具有市场营销/销售或产品管理背景。他们有与客户打交道的经验,了解他们想要实现的目标。他们知道如何将其转化为团队可操作的项目。关键是他们自己生活在战壕中,知道如何在现实世界中让事情发生——而不仅仅是在纸上。

他们也有足够的技术知识来理解工程师们在做什么以及他们为什么这样做。他们能够清楚地表达他们正在做什么,以及为什么它很重要。他们知道设定目标,衡量进展,让人们对取得的成果负责。

商业智能领导者的关键指标

数据业务领导者所影响的变量比数据工程领导者所影响的变量更难量化。您可以查看记录的数据集的百分比来评估发现工作,但是围绕指标衡量一致性更难。衡量数据可操作性的一个好方法是看你允许其他团队独立解决的问题的数量。例如,当数据团队相对年轻时,它可能会收到来自营销团队的许多关于归因的请求。随着数据民主化程度的提高,运营团队可以轻松访问数据,依赖数据团队解决归属问题的需求也随之降低。营销团队在解决这类问题时变得更加独立,最终将归因相关请求的数量降至零。衡量数据可操作性的一个好方法是查看各种类别中请求数量的减少。该指标准确衡量企业能够使用数据的程度。你能从列表中剔除的问题越多,你的数据就越容易操作。

结论

并不是没有一个叫做“数据主管”的角色,只是大多数公司实际上并不存在。

相反,当一家公司决定他们需要有人来负责他们的数据时,他们通常会联系两个非常不同的角色:BI 领导者和数据工程领导者。问题是这些角色之间没有任何关系!对一家公司来说,明确定义你所寻找的那种个人资料是很难的。寻找数据负责人的公司通常会寻找能够帮助他们理清所有混乱数据的人。但这有更多的粒度,每个人都会从公司澄清他们在招聘过程中的确切角色中受益。‍

关于我们

我们写了利用数据资产时涉及的所有过程:从现代数据堆栈到数据团队组成,再到数据治理。我们的博客涵盖了从数据中创造有形价值的技术和非技术层面。如果你是一名数据领导者,并希望更深入地讨论这些话题,请加入我们为此创建的社区

在 Castor,我们正在开发一个数据文档工具 Figma,Slack generation。

或者对 Fivetran,Looker,Snowflake,DBT 的狂热爱好者来说是数据方面的。我们将目录软件设计得易于使用、令人愉快且友好。

想去看看吗?联系我们,我们将向您展示一个演示。

原载于https://www.castordoc.com

耳语:以人类水平的性能转录和翻译音频文件

原文:https://towardsdatascience.com/whisper-transcribe-translate-audio-files-with-human-level-performance-df044499877

一个兼容 97 种语言的人工智能模型——以及如何使用它

照片由 DeepMindUnsplash 上拍摄

现在很明显,深度学习研究的大方向已经发生了根本性的变化。

几年前,大多数创新论文的操作方式是这样的:选择一个数据集 X ,在该数据集上构建并训练一个新模型,并通过报告 SOTA 结果来证明你的模型是最好的。但是如果我们在数据集 Y 上测试这个模型会发生什么呢?

比如:在 ImageNet 数据集上训练一个强大的 ResNet 。该模型将在分类猫和狗方面表现出色,但在分类卡通狗、手绘狗或梵高风格的狗等图像时会有困难。

OpenAI 已经开始了这种范式的转变,推出了概括得很好的模型,如CLIP【1】。为此,他们使用元学习方法,专注于零射击分类:

零镜头分类是模型对看不见的标签进行分类的能力,而无需对它们进行专门的分类训练。这种学习方法更好地反映了人类的感知。

遵循同样的步骤, OpenAI 发布了Whisper【2】、anAautomaticSpeechRecognition(ASR)车型。在其他任务中,耳语可以转录大型音频文件,具有人类级别的性能!

在这篇文章中,我们详细描述了 Whisper 的架构,并分析了该模型是如何工作的,以及它为什么如此酷。

让我们开始吧!

耳语——概述

让我们简单描述一下 Whisper 的特征:

  • 开源:模型由 OpenAI 创建并开源。我们稍后将看到如何使用它的编程教程。
  • 多任务训练:该机型架构新颖,适合多任务训练。耳语是为 i) 语言识别,ii) 语音活动检测,iii) 转录,和 iv) 翻译而训练的。
  • 多语种:除了英语,耳语接受了 96 种其他语言的培训。
  • 多样数据:模型在 68 万小时的音频上训练。其中 65%的时间用于英语语音识别,17%用于多语言语音识别,18%用于英语翻译。
  • 卓越的性能:作者称 Whisper 在英语语音识别方面达到了人类水平的性能。
  • Whisper vs 商业产品:实验表明 Whisper 直接挑战商业竞争对手如亚马逊 Alexa & Siri ,甚至胜过他们——尽管论文中掩盖了他们的名字。

限制:据我所知,OpenAI 不会公开他们的训练数据集。他们只报告评估数据集。

嘀咕对我们有什么好处

该模型在许多行业都有显著的应用,包括我们的日常生活,例如:

  1. 我们可以即时转录大型音频文件,如播客。
  2. 我们可以毫不费力地抄写演讲稿。
  3. 为我们的 Youtube 视频或其他内容制作准确的字幕会容易得多。此外,使用非英语语言不是一种限制。如果我们需要翻译,耳语者也可以处理!
  4. 学生们再也不用在听课时记笔记了!
  5. 有听力障碍的人生活质量会好得多。想象一下,如果你能超级准确地转录你的话。

额外收获:open ai 有机会利用 Whisper 为其下一款 GPT 型号 GPT 4 无缝创建一个更好、更多样化的数据集。

耳语建筑

图 1 展示了耳语的顶层架构。让我们一步一步地描述这个数字:

图 1:Whisper 的顶层架构及其主要组件(来源)

Whisper 的实现的核心就是大家熟知的【4】的编解码变压器。作者选择使用原始版本,而不是更新的复杂版本——他们不想通过模型改进让耳语变得伟大。

至于输入,音频被分成 30 秒的块,并转换成一个对数-梅尔频谱图【附录 A】。然后通过具有 GELU 激活函数的两层 CNN 对声谱图进行处理,并用正弦位置嵌入进行丰富。现在,输入可以由变压器的编码器部分进行处理。当编码器完成时,它发送KV注意力编码向量,由解码器交叉处理。

解码器有更多的工作要做。请记住, Whisper 是一种多任务架构——解码器必须首先决定要做什么,然后再进行预测。每个不同任务的流程在图 2: 中有更好的说明

图 2: 密语解码器部分的不同任务(来源)

我强烈建议访问该报的网址,并在那里获得更高质量的图片。

所以,解码器从 SOT 开始(<|start-of-抄本| > token)。然后,它必须确定音频中是否有真实的语音。如果有,解码器预测该语音的特定语言标记,例如英语的 EN 。如果不是,解码器预测<| nospeech |>令牌。用户也可以明确指定语言。

接下来,解码器决定(根据用户请求)首选任务是转录还是翻译—由<|转录| ><|翻译| > 标记指定。最后,该模型通过为该情况包含一个<| notimestamps |>标记来指定是否预测时间戳。

概括地说,每个可能任务的流程是:

  • 输入音频→无语音
  • 输入音频→语言识别→ 转录 →时间戳
  • 输入音频→语言识别→ 转录 →无时间戳
  • 输入音频→语言识别→ 翻译 →时间戳
  • 输入音频→语言识别→ 翻译 →无时间戳

就是这样!我们现在已经知道了耳语是如何端到端工作的。

作者创造了 9 种模型变体,每种都有不同的尺寸。此外,这些模型中的一些只有英语,而另一些是多语言的。

请随意查看论文的附录并检查每个模型的训练配置和超参数。

耳语的竞争优势

自动语音识别任务对于深度学习来说并不新鲜。让我们看看为什么耳语脱颖而出:

大规模弱监管方法

这种方法定义了耳语的核心哲学——事实上,这个短语包含在了报纸的名字中。

训练 ASR 系统的传统方法是让它们以无人监管的方式从原始音频格式中学习。这种方法消除了对人工干预的需要,但是对于更具体的任务(也称为下游任务),该模型可能需要额外的微调。

当然,总有被监督的方式。然而,这取决于找到大量由人类仔细标记的高质量音频数据的能力。同样,这很有挑战性。

耳语的作者变得有创意并想到:让我们尝试使用大量数据(大规模)来训练我们的模型,这些模型不一定具有黄金标准的质量(弱监督)。这里的关键是数据的数量和多样性。最终,这种方法是成功的——Whisper可以显著地扩展和推广。

多任务流水线

作者想要建立一个不仅仅能够进行语音识别的模型。

一个潜在的担忧是,在许多任务上联合训练一个单一的模型可能会造成干扰。如果一个任务被单个模型更好地学习,而不是被集成到试图同时学习其他任务的父模型中,会怎么样?

经过一些实验,作者发现不仅不同任务之间没有干扰,而且耳语从并行学习所有任务中受益匪浅!

实验结果

接下来,作者对上述说法进行了测试,并展示了 Whisper 与其他型号相比的表现。

英语转录评价

请记住,作者不只是想创建一个在数据集 X 上优于所有 SOTA 模型的模型。他们的目标也是创建一个能在相似数据集上轻松概括的模型。换句话说,他们想创造一个能适应**分布变化【Apendix B】**的模型。

首先,我们来看看表 1 :

表 1: Whisper 在各种数据集上优于 SOTA wav2vec 模型(来源)

WordEerrorRate(或WER)——越少越好。这里的任务是转录。 Wave2vec 在 LibriSpeech 数据集上进行了专门的训练和微调,而 Whisper 则没有。

LibriSpeech 数据集上,两个模型是相等的。然而, Whisper 在所有其他数据集上都远远超过 Wav2vec

英语翻译评估

同样,作者在翻译任务中将 Whisper 与其他 SOTA 模特进行了比较。结果如表 2 所示:

表 2: 耳语模特与其他 SOTA 模特在音频到英语翻译上的 BLEU 评分(来源)

除了低资源设置外, Whisper 的表现优于其他所有机型。平均而言,耳语获得更高的 BLEU 分数。记住 Whisper 是在零射击配置中使用的——其他模型已经使用各自的数据集进行了充分的训练。

此外,由于 Whisper 的目的是很好地进行归纳,作者想要测试 Whisper 如何处理噪声数据。结果如图 3 所示:

图 3:Whisper 的 WER 与其他添加了噪声的模型(来源)

这些发现相当有趣:

NVIDIA STT 的型号在低噪音方面表现最佳,但 Whisper 可以更好地扩展。最终,耳语在高噪音下胜过所有机型。该分析还展示了 Whisper 的卓越的泛化能力。**

如何使用 Whisper —编码示例

接下来,我们将展示如何使用 HugginFaces 库来使用 Whisper完整的例子可以在这里找到。

第一步:安装[ffmpeg](https://ffmpeg.org/)

让我们从安装依赖项开始。首先,我们需要命令行工具[ffmpeg](https://ffmpeg.org/)

***# on Ubuntu or Debian**
sudo apt update && sudo apt install ffmpeg

**# on MacOS using Homebrew (https://brew.sh/)**
brew install ffmpeg

**# on Windows using Scoop (https://scoop.sh/)**
scoop install ffmpeg*

因为我们的演示将在 Colab 上运行,所以我们选择第一个选项。

第二步:下载 Whisper

接下来,用pip安装耳语。该命令将总是从 OpenAI 库下载最新版本。

*pip install git+https://github.com/openai/whisper.git*

我们现在已经完成了 Whisper 及其依赖项的安装。

步骤 3:下载样本音频文件

我们将使用来自 archive.com 公共领域的葛底斯堡演讲音频文件【5】

然后用 耳语 CLI 转录我们的音频文件。就这么简单!

输出还包括每个数据段的时间戳。

该命令还创建了 3 个文件:gettysburg_johng_librivox.m4b.vtt gettysburg_johng_librivox.m4b.srtgettysburg_johng_librivox.m4b.txt。其中包含各种格式的字幕和片段。

默认情况下, CLI 命令使用small型号版本。关于参数和如何处理命令的更多信息,请看一下原始脚本

翻译示例

**耳语可以处理多种语言,翻译成英文。我们来看一个例子,不过这次我们用耳语搭配 Python

首先,我们将从 Youtube[6]下载一段希腊语视频,并将其转换为音频文件。我们需要安装pytube库:

*!pip install pytube*

这是我们将要转录的视频——它包含了希腊人最著名的演讲!

让我们从转录音频开始。我们将使用large版本来提高精确度:

除了几处差异之外,这份抄本非常准确。此外,请注意,音频非常嘈杂——这是在拥挤的体育场发表的演讲,人们在鼓掌、吹口哨等等。

最后,我们将同一个音频文件传递给耳语进行翻译:

翻译几乎无可挑剔。有趣的是,在英语翻译过程中,希腊语中的一些差异被修正了。

显然, Whisper 更适应英语——这并不奇怪,83%的训练数据集是为英语保留的。

结束语

耳语是一个非凡的模型,也是人工智能社区的一个里程碑。

以人类水平的表现转录 97 种语言的音频文件的能力是无可比拟的。这一惊人的成功源于 Whisper 采用的新颖方法(以及 OpenAI 的许多其他模式)。

这种方法着重于学习如何根据任务不可知的信息归纳出新的任务。此外,这是人类感知的工作方式:人类只需要几个例子就可以根据他们过去的经验对以前看不见的物体进行正确的分类。

感谢您的阅读!

我每个月写一篇关于 AI 的有影响力的论文的深度分析。
保持连接!

参考

  1. 亚历克·拉德福德等 从自然语言监督中学习可转移的视觉模型(2021 年 2 月)**
  2. 亚历克·拉德福德等人通过大规模弱监督的鲁棒语音识别(2022 年 9 月)**
  3. A.瓦斯瓦尼等人关注就是你需要的一切(2017 年 6 月)**
  4. A.Baevski 等人语音表征的自我监督学习框架 (2020)
  5. 林肯葛底斯堡演说https://archive.org/details/gettysburg_johng_librivox
    许可:公共领域
  6. PASOKwebTV 频道

附录

【A】梅尔频谱图: 使用傅立叶变换将每个周期信号从 t 时域转换到频域。换句话说,我们创建了信号的频谱。*但是如果我们要对一个非周期信号进行变换呢?*

我们可以通过对信号的几个加窗段执行 FT 来计算几个频谱。我们将它们“缝合”在一起,这叫做 声谱图

Mel 谱图是使用 *Mel 标度的特殊谱图Mel 音阶中,音高被转换成一个新的音阶,这样音高声音中的相等距离与听者的距离相等。例如,人耳可以分辨 3k 和 3.5k Hz 之间的差异,但却很难分辨 11k 和 11,5k Hz 之间的差异,即使这两对相差相同的值(0.5 Hz)。这就是我们使用梅尔标度的原因。*

【B】分布偏移: 分布偏移是一个模型训练的数据随着时间的变化而发生的现象。因此,久而久之,模型的效率降低,预测变得不准确。

这种现象经常出现在生产中的机器学习系统中。例如,用户的行为或其他外部因素可能会随着时间而改变——这将对部署的模型产生负面影响。

有时,分布转移与术语‘概念漂移’互换使用。然而,它们并不相同。**

谁排放的二氧化碳最多?带有 Plotly.graph_object 的树状图动画

原文:https://towardsdatascience.com/who-emits-the-most-co2-a-treemap-animation-with-plotly-graph-object-1f3c0e4918cc

使用 Plotly Gragh_object 制作一个带有滑块的动画树形图,用于更改数据显示

【找到本文代码 这里 。]

作者图片

在本文中,我们将学习如何使用 Plotly 库的 Graph_object 模块,通过“树形图”可视化来可视化分层数据。

Plotly Express vs . Plotly Graph _ object

Plotly Python 库是一个用于交互式可视化的开源库。Plotly Express 模块提供了一个快速简单的实现,作为使用简单语法创建最常见图形的起点,但在涉及更高级的图表类型或自定义时,它缺乏功能性和灵活性。

与 Plotly Express 相比,Plotly Graph Objects (Go)需要更多的编码,但更具可定制性和灵活性。用 Plotly 库生成的每个图形实际上都使用了图形对象,除非是用字典手工构造的。

您可以在一次函数调用中使用 Plotly Express 模块,用几行代码创建一个树形图。然而,Plotly Express 不提供添加更多类似滑块动画的交互式功能。在本教程中,我将向你展示如何使用 Go 来创建带有滑块动画的动画树状图。

得到💬任何数据科学或编程问题的 GPT 式答案。为成千上万的人生成摘要和学习笔记📚只需一次点击即可获得学习资源。👉

https://aigents.co/learn

准备数据

本文使用了 1947-2020 年的 CO2 排放数据,这些数据是开放数据,可以从数据【1】中的我们的世界免费获取。数据集包含温室气体排放属性,如二氧化碳、甲烷、一氧化二氮...等等。

数据集中的一些属性。图片作者。

树形图使用嵌套的矩形可视化分层数据。分级数据通常存储为矩形数据框,不同的列对应于分级结构的不同级别。

要创建树形图,在正确的层次结构中创建数据集是非常重要的,否则,它将不起作用。该顺序从层级的底部到顶部开始,底部级别是指“子代”,顶部级别对应于“根父代”。

首先,我的数据集包含每个国家和每年的排放量,我们称之为 df_ghg_country。由于每个国家/孩子属于一个洲,每个国家的“中间父将是洲。因此,“大陆”列将是 df_ghg_country 中子“国家”的父列。接下来,所有的大陆将组成“世界”。因此,在大陆级别,大陆将是孩子,而"世界"将是"根父"

为了使树形图工作,每个父矩形的总值/大小需要等于所有嵌套子矩形的总和。要获得每个中间父/洲矩形的大小,将所有相应子/国家的值相加。这可以通过创建一个新的数据框架来获得各大洲每年的二氧化碳排放总量来实现。然后,在这个新数据框中创建父列,它应该接收值“world”。我们姑且称这个数据框为 df _ GHG _ continental。下面的代码将完成这项工作:

要获得每年根父/世界矩形的大小,只需将所有国家每年的所有人均二氧化碳值相加,即可创建一个新的数据框。这个就叫 df_ghg_world 吧。由于“world”本身是最终的父项,它没有父项,因此该数据集的父列将接收空值。创建 df_ghg_world 可以通过下面的代码实现:

要制作包含所有等级的最终数据集,只需连接所有上述数据框 df_ghg_country、df _ GHG _ continental 和 df_ghg_world。最终的数据集将如下所示:

作者图片

用滑块动画创建树形图

做一年的树状图地块

要使用 Plotly Graph_Objects 制作树形图,我们需要使用 Go。图,并至少提供以下参数:

  1. 每个矩形的标签
  2. 每个矩形的大小/值:设置与每个矩形相关的值。该值用于指定每个矩形的大小。
  3. 父母

随着更多关于外观改进的争论,动画树状图来了!

2020 年人均二氧化碳排放量。作者图片

添加滑块动画:

我们的数据是一个时间序列数据集。为了了解每个国家对全球二氧化碳排放量的贡献如何随着时间的推移而变化,我们将添加一个动画,自动向前移动一个滑块,该滑块负责改变我们想要可视化的显示数据。

我们可以使用 go.layout 和 go.Figure 中的滑块和帧参数来实现这一点。通过创建一个帧列表,其中每个帧都对应于特定年份的树形图,每个帧都将在动画中逐一显示。详细步骤和代码如下:

  1. 使用 plotly.go 创建一个图表列表,其中包括数据中每年的树形图。
  2. 使用 Plotly.go.frame 将步骤 1 中的每个图形转换为一个框架,从而创建一个框架列表。

3.制作一个滑动条列表,列表中的每个元素都是每个滑动条外观的字典。

请注意,在步骤 2 中为每个框架指定的名称应该与上面代码片段中第 8 行 args 内部指定的名称相同。

4.创建布局对象,它是一个字典,其中滑块(在步骤 3 中)是一个参数,播放按钮包含在“updatemenus”键中

5.使用带有布局和框架参数的 Go.figure 创建图形。框架(在步骤 2 中)被添加为图形对象中的关键点。这些帧指向一个图形列表,当动画被触发时,每个图形都将被循环显示。布局对象(在步骤 4 中创建)被传递给 Go.Figure 中的布局构造函数。

你现在可以和这张地图互动,看看在过去的 60 年里,每个国家的二氧化碳排放量是如何变化的。每个矩形的大小与特定国家的人均二氧化碳份额成正比。

1960-2020 年期间每个国家的人均二氧化碳排放量。图片作者。

现在你有了它,一个令人惊叹的使用 Plotly 的 Graph_objects 模块的动画树形图可视化。请在评论中告诉我你的想法!

[1]公开数据:数据中关于我们世界的二氧化碳和温室气体排放的数据。访问链接。

[2] 阴谋地文档

感谢您的阅读。如果你觉得我的帖子有用,并且正在考虑成为中级会员,你可以考虑通过这个 推荐会员链接 :)来支持我,我将收取你的一部分会员费,不需要你额外付费。如果你决定这样做,非常感谢你!

谁是你在斯特拉发的头号支持者?

原文:https://towardsdatascience.com/whos-your-number-1-supporter-on-strava-5a888230f361

探索 Strava API 并使用 Python 找到答案

维克多·比斯特罗夫在 Unsplash 上拍摄的照片

头号动机

在过去的几年里,Strava 成了我追踪骑行和跑步活动的首选应用。这款应用有很多很酷的功能,其中一个就是你的朋友可以为你的活动给你好评。有时候,这些荣誉只是激励你继续前进的动力。

2022 年,当我准备攀登阿尔卑斯山并比以前更经常使用 Strava 时,我注意到有些人在荣誉方面比其他人更慷慨。但是我不知道是谁,这让我开始思考。有没有一种方法可以比应用程序提供的更深入地了解我的统计数据?嗯,有。

在本文中,我使用了一种非常常见的“提取转换负载”方法来构建项目。我将展示我如何设法从 Strava 获取活动数据(提取),计算新的见解(转换),并构建“Kudos Graph”和其他可视化工具,以了解应该感谢谁的支持(加载)。

随着时间的推移,我发现这种方法是组织类似数据项目的好方法。在开始之前,最后注意一点,这里显示的所有内容都是可复制的,代码可以在 Github(本文末尾的链接)上获得,因此您可以构建自己的代码。

让我们开始编码吧!

#2 API 连接和授权

这可能是本文中不太有趣的部分,但却是必要的部分。为了使用 Strava API 并获得您的数据,您首先需要在网站上注册一个应用程序(没有看起来那么可怕),并获得授权令牌。

  1. 注册一个应用程序可以在登录时通过以下链接完成:【https://www.strava.com/settings/api】T4。这将为您提供您的客户端 ID 和客户端密码。
  2. 第一步只会让你到此为止,并授予你访问顶线数据。要访问活动级别数据,您需要遵循以下链接:http://www.strava.com/oauth/authorize?client_id=【REPLACE _ WITH _ YOUR _ CLIENT _ ID】&response _ type = code&redirect _ uri = http://localhost/exchange _ token&approval _ prompt = force&scope = profile:read _ all,activity:read_all
  3. 在登陆页面点击“授权”,在出现的网址中写下你得到的授权码: http://localhost/exchange _ token?state =&CODE =【THIS _ IS _ THE _ CODE _ YOU _ NEED _ TO _ COPY】&scope = read,activity:read_all,profile:read_all

我从 Benji Knights Johnson 的这篇文章中得到了所有这些,文章中对这些步骤进行了更详细的解释:

https://medium.com/swlh/using-python-to-connect-to-stravas-api-and-analyse-your-activities-dummies-guide-5f49727aac86

现在让乐趣开始吧。

#3 认证

我们需要做的第一件事是认证,即从 Strava 获取访问令牌。下面的函数将通过一个 POST 请求做到这一点,该请求包含我们在上一节中获得的到端点https://www.strava.com/oauth/token的细节(客户端 id、客户端秘密、刷新令牌和授权码)。

#4 提取数据

在本节中,我们创建两个函数来:

  1. 获取档案中所有活动的列表。
    使用我们之前得到的访问令牌,并指定两个定义我们感兴趣的活动范围的日期,我们得到这两个日期之间所有活动的列表及其主要特征。
  2. 获取特定活动的 kudoers 列表。
    不幸的是,先前请求的结果中不包含活动的 kudoers 列表。我们需要构建 get_kudos 函数,该函数返回单个活动的 kudoers 列表,由 activity_id 标识。

#5 转变数据

现在我们已经得到了我们想要的数据,我们的想法是只保留我们需要的,并把它放在熊猫数据帧中。

下面的转换函数从活动列表中提取以下数据:

  1. 用作活动的唯一标识符的活动 id。
  2. 每项活动的 kudos 数。
  3. 通过在一个循环中利用 get_kudos()函数,得到一个活动的所有 kudoers 的列表。
  4. 每次活动的距离。
  5. 每项活动花费的时间。
  6. 活动的类型。

⚠️:strava API 的使用是有限制的。我们被限制为每 15 分钟 100 个电话,每天 1000 个电话。

在这个项目中,我们调用 API 一次来获取活动列表,然后对每个活动调用一次来获取每个活动中的 kudoers 列表。

这意味着,如果在考虑的窗口中有超过 100 个活动,代码将不能工作,您需要稍微修改它以符合 API 使用限制。

#6 荣誉图(以及其他一些见解)

剩下唯一要做的就是利用我们刚刚构建的函数,开始绘制一些有趣的东西!

就我而言,我正在考虑我在 2022 年的活动,直到今天——2022 年 10 月 24 日。

从我们的数据结构中,可以非常容易地获得给定期间的一些高级 KPI:

高级 KPIs 按作者分类的图片

因为我们在前一节中获得了每项活动的运动类型,所以我们也可以很容易地调查某些类型的活动是否比其他活动更容易获得荣誉。以下是每种活动的平均荣誉数:

每种活动类型的平均 kudos 数—按作者分类的图片

即使它不是最受欢迎的活动类型,跑步是我拥有最多数据点的运动,所以这是我试图挖掘更多的地方。我们可以试着理解为什么一项活动会比另一项活动获得更多的荣誉。让我们来看看跑步的距离和活动将获得的荣誉之间可能的相关性。

事实证明,似乎存在正相关关系,即跑步时间越长,kudos 的数量就越高,如下图所示。诚然,鉴于我们考虑的数据点数量很少,这一结果的统计学意义是有争议的。这里唯一确定的结论是,我需要跑得更多。

我们可以在分析中走得更远,看看其他变量的影响,但我将把这留给另一篇文章。

跑步的距离和获得的荣誉数成正相关——作者图表

最后,我们可以绘制“荣誉图”,从中我们可以看到谁是我们最大的支持者,并大声喊出来。
当然,有些人比其他人更沉迷于 Strava,当他们向下滚动活动提要时会给予称赞,而其他人只会偶尔打开应用程序,只对他们碰巧看到的最近活动给予称赞。
这张图表绝不是在评判人们是否给予赞扬,它只是简单地展示了你在其他地方看不到的新见解——即使是在这款应用的高级版本中也看不到。

显示最高支持者的“荣誉图”——按作者分类的图表

#7 最后的想法

毫无疑问,我们可以利用从 Strava API 获得的所有数据做更多的事情。这只是回答一个不寻常的问题的第一枪,也是一个很好的练习。

如果你想分析你的 Strava 活动,找出谁是你最大的支持者,完整的代码可以在这里找到:
https://github.com/Guigs11/strava_kudos

感谢一路看完文章!
欢迎在下方留言,如有任何问题/备注,也可通过
LinkedIn联系我!
更多来了!

为什么在应用自动化之前,业务流程分析是至关重要的

原文:https://towardsdatascience.com/why-a-business-process-analysis-is-critical-before-applying-automation-29ba9868a96e

Unsplash.com 上的 UX-印尼图片

为什么在应用自动化之前,业务流程分析是至关重要的

A 业务流程分析是了解各种流程的健康状况,并确定提高其效率和有效性的方法的有力途径。换句话说,这是关于诚实的自我反省,以了解什么是有效的,什么是而不是

这种分析使流程所有者能够了解流程中涉及的活动和人员,识别延迟、错误或客户投诉等问题,收集有关这些问题的数据,然后阐明流程改进或增强的计划和路线图。

它在应用于正确的现状流程时效果最佳,因为它可以让流程负责人了解流程是否满足既定目标,并在发现流程不理想时做出合理的判断和决策。在实施任何自动化之前,使用业务流程分析来确保流程得到优化并且“自动化就绪”也是有用的。

然而,在许多公司中有一个普遍的误解,特别是那些在这种分析和自动化计划方面是新手的公司——自动化可以帮助他们神奇地“修复”损坏的流程。

不能。

本文探讨了其中的原因。

业务流程分析:自动化哪些流程

流程图、流程图、差距分析和根本原因分析等业务流程分析工具,以及业务流程自动化(BPA)和机器人流程自动化( RPA )等自动化技术,可以帮助您找到差距并简化以下领域的多种流程:

  • 人力资源(HR)、招聘和员工入职
  • 应付账款
  • 资料管理
  • 物流和交付
  • 合同管理
  • 采购
  • 库存跟踪
  • 销售
  • 审计和合规
  • 电子邮件营销
  • 社会化媒体

如果这些过程满足以下条件,分析/自动化计划最有可能成功:

  • 是可重复的
  • 需要持续、稳定的输出
  • 不要频繁改变或波动

简而言之,为了获得最佳结果,您应该只对您试图优化的流程中重复的、不变的部分应用自动化。

图片由杰克森煨上Unsplash.com

自动化“不完整”的流程也是不可取的。流程会随着时间的推移而中断,这并不是因为员工懒惰、冷漠、无能或未经培训,而是因为组织、客户、行业或市场已经随着时间的推移而演变。因此,旧的做事方式不再合适或充分。结果:一个破碎的过程。您可以通过以下一些症状来识别中断的流程:

  • 输出延迟或质量差
  • 多轮评审和签署
  • 不高兴或不满意的顾客
  • 缺乏团队凝聚力
  • 缺乏问责
  • 归咎责任的倾向

如果你的组织中的一个过程被破坏了,执行一个详细的分析来绘制端到端的图,找到问题的根本原因,并创建一个详细的计划来重新设计它。不要简单地假设自动化可以帮助您解决每一个问题,并神奇地将一个表现不佳的过程转变成一个表现良好的过程。

业务流程分析:开始之前要考虑的关键方面

在开始业务流程分析之前,请记住该计划不是一项无足轻重的工作,也不能保证其成功。你还必须首先理解你试图解决的问题,理解你期望从努力中得到什么以及为什么。准备好发现一些不愉快的事实,并在分析完成后做出一些艰难的决定。

确保:

  • 收集有关流程的信息,以了解其问题和目标
  • 直观地定义流程,使其更易于分析和补救
  • 根据确定的目标衡量和比较当前的有效性
  • 阐明“完美”的过程和结果是什么样的
  • 确定相关的关键性能指标(KPI)来量化测量自动化性能
  • 就“未来”流程提出建议
  • 了解流程范围、变更管理、业务目标等。创建改进/流程重新设计计划
  • 获取重新设计工作所需的资源,包括人力和技术(例如 RPA)资源

这种详细的分析将帮助您计划和执行自动化工作。一旦工作开始,通过将结果与您之前确定的 KPI 进行比较,定期评估绩效。

还要注意不要强行将某个特定的流程纳入分析范式——特别是如果它被破坏了——而不是识别自动化的最可能的候选对象。并且投入一些关心、思考和计划来确保这个过程实际上已经为自动化“准备好”了。下面的策略会有所帮助。

如何为业务流程分析和自动化选择候选流程

业务流程分析和随后的自动化可以帮助您提高运营效率、生产率、质量,并满足其他业务目标——但是如果您打算自动化的流程一开始就被破坏了,那么就不会了。如果有什么不同的话,从一个还没有优化的过程开始,你的自动化结果将是令人印象深刻的。这就是为什么必须:

检查流程是否已经优化

在开始自动化计划之前,确保流程已经优化到最佳程度。

绘制价值流

绘制流程的整个端到端价值流。从客户开始,到客户结束,包括组织内外参与向客户提供产品或服务的每一个参与者。还要强调构成价值流的所有单个任务。

以整体的方式从头到尾观察价值链,了解自动化如何优化整个流程,而不仅仅是特定的活动或职能角色。这很重要,因为它将帮助你理解自动化一个已经优化的过程的所有可能的收益,并考虑你可以实现这一点的所有方法。

想长远,不要急功近利

不要只考虑自动化速赢。您可以将“低挂的果实”——即,标准的、稳定的、可重复的过程——作为您的第一个自动化候选者。它们可以帮助建立信心,并使以后复杂的过程更容易自动化。然而,要确保这种方法不会产生“快速解决”的心态,因为这可能会阻止您理解业务流程分析和自动化的真正和长期的收益。

选择和应用自动化工具

创建真正的端到端价值流后,选择并应用自动化工具来提高性能或效率。根据价值流选择技术,而不是相反,以最小的摩擦或用户的反对获得切实的结果。如果您在了解您的自动化过程候选之前选择技术,它将很可能延续功能孤岛、习惯和思维定势,这将使实现自动化的所有好处更加困难。它甚至可能会阻碍流程的效率和生产力,而这正是自动化所要支持的目标。

总而言之:

  • 自动化一个破碎的过程将会产生令人失望的结果
  • 在开始自动化之前,规划端到端的价值流
  • 在规划过程中,从客户开始,到客户结束,包括流程中涉及的每个参与者,并强调组成流程的各个任务
  • 关注长期收益,而不仅仅是速赢
  • 基于价值流选择和应用自动化工具,以实现自动化的好处,而不会产生功能孤岛、习惯或思维模式

结论

为了增加业务流程分析和自动化的成功机会,请记住以下要点:

  • 自动化并不是解决困扰组织的所有问题的灵丹妙药
  • 最佳自动化过程候选已经被优化到最佳可能程度
  • 永远不要应用自动化来“修复”损坏的流程
  • 在自动化之前执行业务流程分析,以了解流程是否经过优化,是否适合自动化,或者流程是否损坏,不适合自动化

如果您正在考虑在您的组织中进行业务流程分析或自动化,我们希望这篇文章对您有用。如需更多类似的真知灼见,请访问我们的真知灼见页面

为什么宠物项目是培养整体数据科学技能的最佳方式

原文:https://towardsdatascience.com/why-a-pet-project-is-the-best-way-to-develop-holistic-data-science-skills-b5f2db7e113a

创建自己的项目并从头开始构建数据产品可以加速您的学习

作者图片

大约两年前,我在数据科学技能发展方面遇到了一点瓶颈。随着快速的进步,我已经度过了兴奋的初始阶段,对编码、分析和 ML 有了相当好的了解,但感觉我错过了更广阔的视角。

在我的全职工作中,我正在应对有趣的挑战,但它们的范围有限,而且我缺少开发完整产品的技能。我尝试在课程中学习像 Docker 或 AWS 这样的技能,但我觉得它们只是触及了表面,并没有真正让我为现实生活做好准备。

如果你曾经有过类似的感觉,我强烈建议启动一个宠物项目,让你走出平台期,加速你作为数据科学家的成长

我认为构建一个完整的数据项目是解决上述问题的好方法。我也在寻找新的公寓出租,并决定通过关注房地产数据来一举两得。

两年后,一个小小的副业项目扩展成了一个房产对比引擎— www.resider.pl ,一个拥有成千上万用户和背后伟大团队的网站。在这篇文章中,我将分享这段旅程开始时的一些要点,以及如何通过一个宠物项目加快你的职业和技能发展的技巧。

一个宠物项目为你的技能发展创造了最终的路线图和测试平台

一旦你经历了预测泰坦尼克号幸存者的最初兴奋,并获得了一些 Coursera 证书,你就会意识到你仍然缺少的技能范围是巨大的。参加课程学习并获得证明你在深度学习、Docker、AWS 或 GCP 方面能力的证书很容易。

上述方法的关键问题是它没有回答两个关键问题:

  • 你是否学到了正确的技能,以及它们如何解决你的问题?
  • 你真的学会了它们并自信地从头开始实施它们了吗?

开发一个宠物项目与学习过程相反——你的路线图是由你在项目中遇到的实际技术问题引导的。解决这些问题的能力是对你技能的最终考验——如果解决方案不起作用,你需要继续学习。

问题解决循环

作者图片

上面的例子展示了我在项目开始时遇到的一个问题-解决方案循环。

  • 我知道如何构建定价模型,但不知道如何提供快速预测,所以我学习了如何用 FastApi 创建 API。
  • 然后我意识到,虽然它在我的电脑上工作得很好,但我不能把它运到其他任何地方,这导致了学习 Docker。
  • 一旦我有了一个 dockerized API,我意识到我需要把它放在某个地方,这样它就可以被网站前端访问。AWS EC2 是我最初的选择,这是关于如何使用虚拟机的一堂很好的课
  • 在这个过程的最后,我遇到了一个完全意想不到的处理端口和安全设置的问题——这个问题在课程中很少提到,但在现实生活的项目中几乎每次都会碰到

当接近项目的这一部分时,我对 FastApi、Docker 或 AWS EC2 一无所知,但是找到解决实际问题的方法感觉更自然。让整个 API 设置工作起来也是一个明显的测试,证明我对所有涉及的步骤都理解得足够好。

在整个项目中,我不断重复上面的循环,这让我永远不会耗尽学习新东西的想法。从问题开始,然后找到最佳解决方案,这让我学会了在 AWS Ground Truth 上进行 Dala 标记,用 spaCy 建立命名实体识别模型,或者用 CatBoost 建立价格基准模型。

一旦你迷上了解决问题的反馈循环,学习就会有更多的回报!

为什么你会把你的空闲时间用来做没有报酬的工作?

如果我们同意宠物项目对技能发展很有帮助,那么还有一个非常重要的问题——保持动力。

宠物项目动机的 3 个关键驱动因素:

作者图片

我相信求知欲和好奇心对于你的项目成功是完全不可或缺的。如果你对你试图解决的问题没有热情,你可能会在一个流行的话题上创造一个模仿者,没有任何独特或有用的东西。一旦你遇到第一次挑战,对这个话题的兴趣也能防止你气馁。

愿意学习是另一个必备条件。宠物项目是一个长期的游戏,以技术技能的提高为主要目标。如果你是一个已经完成了 10 个类似项目的程序员,你会对免费做第 11 个项目感到兴奋的机会是相当小的。

如果你看到了最终将你的宠物项目转变成一项业务的潜力,那就更好了,因为它可以在未来保持项目发展的势头。但是如果你的唯一目标是赚钱,那么当事情变得比预期困难时,你很可能会失去动力,放弃这个项目。

在我的宠物项目上花费数千小时,我得到了什么?

作者图片

从一开始,这个项目的发展速度比我最初预期的要快得多。老实说,我最初并没有计划在日常工作之外每周花大约 20 个小时编写额外的代码,但这真的会上瘾,随着每个问题的解决,下一个改进的想法就会出现。

硬技能

这个项目最切实的好处是加速学习和提高我的硬技能。当我开始这个项目时,我有几年的编码经验和一些 ML/DS 知识,但我必须从头开始学习构建 E2E 产品的大部分技能。

对我来说,这是一个艰难的旅程,从一个有抱负的数据科学家在 Jupyter 笔记本上进行实验,到建立数据库,数据管道,API,以及云中全面数据项目所需的一切。

开始一个宠物项目的另一个好处是,如果它足够有趣,你可以让其他具有互补技能的人参与进来,一起学习。对我来说,情况确实如此,当我让 Filip(目前是 Resider 的 CTO)加入时,学习曲线甚至更快了,因为他已经具备了大量的开发运维及云技能,这是我能够从他那里学到的。

软技能

如果你是一名程序员,有一个很大的风险,那就是你会过于专注于自己的专业领域,而与业务或其他技术领域(如前端或设计)有点脱节。

在团队中从事自己的项目是项目和产品管理的一个很好的速成班。它也给你一个很好的视角,让你了解不同的领域是如何影响整个开发过程的,以及它们是如何联系在一起的。

它也教会了我一些谦逊,关于产品开发不同领域的重要性。起初,我真的认为一个伟大的数据产品即使使用蹩脚的 UI 也会保护自己——因为它太神奇了,人们最终会发现它的。Alek(目前是 Resider 的 CPO)花了很大的耐心和毅力才说服我,事实恰恰相反,没有出色的 UI,即使是最好的分析和 ML 领域也注定会失败。

在安全的环境中犯错

你自己的项目是一个犯错的机会,在典型的企业环境中,这可能会让你丢掉工作。当你在一家大公司工作时,犯错是代价高昂的,所以你需要格外小心每一个变化和新功能。

在你自己的项目中,你能够更快地开发一切,这转化为更快的学习。在这个过程中,您可能会意外地终止生产 API,从数据库中删除重要记录,或者搞乱整个登录面板。您可以快速修复它,并学会在更昂贵的环境中不重复同样的错误。

建立一个宠物项目是艰难的,但也是值得的

尽管 Resider 至少在一年前就已经度过了宠物项目阶段,现在正在发展成为一项全面的业务,但初始阶段是我的数据科学之旅中最有趣的部分之一。

尽管有很多必要的工作和几十个小时的踩水时间,我觉得没有更好的学习方法了。这个项目为我提供了一个清晰的路线图,让我在从事我真正感兴趣的事情的同时发展整体的技术技能,这帮助我保持动力。

我希望这篇文章能激励你开始一个宠物项目,如果你已经在着手一个项目的话,也能提供一些建议

感谢您的宝贵时间!

为什么准确性不是一切:精度和召回简单解释

原文:https://towardsdatascience.com/why-accuracy-isnt-everything-precision-and-recall-simply-explained-25bc093c7cda

解释数据科学中精确度和召回率的重要性

阿菲夫·库苏马在 Unsplash 上拍摄的照片

介绍

数据科学面试中的一个常见问题是‘当你 99%的数据属于一个类别时,你如何衡量一个分类模型的性能?’

这是一个直截了当的问题,然而许多人却结结巴巴,不知道如何回答。

在本文中,我们将通过讨论召回率、精确度以及两者的调和平均值(F1 分数)来探索上述问题的答案。

准确性问题

让我们从解释为什么准确性可能不是一个好的衡量标准开始。如果 99%的数据集属于一个类,那么通过简单的猜测,任何模型都可以达到 99%的准确率!

该模型将简单地很好地学习来预测单个类别,从而获得与类别分布相等的准确度分数。

即使没有机器学习模型,我也可以纯粹猜测样本属于哪一类,准确率达到 99%!

因此,对于这个特殊的问题,精确度不是衡量模型性能的好指标。因此,我们必须寻求替代的测量方法。

注意:有时准确性是一个很好的衡量标准,但这完全取决于作品的背景。

混淆矩阵

在我们继续之前,理解混淆矩阵很重要。这将您的结果分为正确和不正确的两类分类,在测量性能时比测量准确度更能提供信息。

由作者生成的图像。

每个象限显示了我们对这两个类别的分类情况。我们可能有 99%的准确率,但我们可能总是错误地分类 1%的类别!

这显然是不好的,我们可以从混淆矩阵中推断出这一信息,以确保我们充分预测了这两个类别。

下面是我使用 Sci-Kit Learn 的混淆矩阵函数为基本逻辑回归分类器用 Python 编写的一个生成的混淆矩阵:

作者用 Python 制作的图像。

用于生成上述图的完整代码可以在我的 GitHub 上找到,如下所示:

https://github.com/egorhowell/Medium-Articles/blob/main/Data Science Basics/Precision_Recall.ipynb

精确

精度度量:在我们预测为真的样本中,有多少是真的。

从数学上来说,这可以计算为:

作者用 LaTeX 制作的图像。

假阳性在统计学中被称为第一类错误。

如果样本的概率为 ≥ 0.5 ,大多数算法将该样本指定为阳性,如果 < 0.5 ,则将该样本指定为阴性。该边界值被称为阈值。当我们增加阈值时,精度也增加并趋向于 1。

这是有意义的,因为概率为 0.9 的样本比概率为 0.5 的样本更有可能是阳性的。因此,我们对放入阳性类别的样本更具选择性和精确性。

当我们想要高度选择性和正确地将哪个样本分类为真实样本时,例如电子邮件垃圾邮件检测,就需要使用 Precision。

回忆

召回措施:在所有真实样本中,我们正确地将多少归类为真实。

在数学上,它的计算方法是:

作者用 LaTeX 制作的图像。

假阴性在统计学中被称为第二类错误。

随着阈值的降低,召回率增加并趋于 1。这是因为我们开始将越来越多的样本归类为阳性,最终,在阈值为 0 时,一切都是阳性的。因此,我们不会有假阴性,因此 Recall 将等于 1。

当我们想要确保捕获所有真正的阳性时,回忆是有用的,即使这意味着增加我们的假阳性(假警报)。这很重要,例如,在癌症检测的情况下,标记它比不标记它更重要。

F1 分数

然而,我们现在有一个问题。提高阈值可以最大限度地提高准确率,但会降低召回率。那么解决办法是什么呢?

F1 得分是通过取召回率和精确度之间的调和平均值而在召回率和精确度之间折衷的值;

作者用 LaTeX 制作的图像。

我们使用调和平均值的原因是为了放大极值的影响。例如,假设我们的精度为 0.9,召回率为 0。这个的算术平均值是 0.45。然而,相应的模型显然是不好的,因为我们将捕捉到非常少的真正的积极因素。

召回率、精确度和 F1 与阈值图

下面是使用 Sci-Kit Learn 的精确回忆曲线函数的我的基本逻辑回归模型的回忆、精确和 F1 分数作为阈值的函数的图:

作者用 Python 生成的图像。

生成上述图形的完整代码可以在我的 GitHub 中找到:

https://github.com/egorhowell/Medium-Articles/blob/main/Data Science Basics/Precision_Recall.ipynb

在上图中,我们看到当阈值较低时,召回率为 1,而当阈值较高时,精确度为 1。此外,请注意当回忆开始减少时,F1 分数如何显著下降,这表明调和平均值如何惩罚极值。

结论

在本文中,我们已经讨论了为什么准确性并不总是您的模型的最佳性能指标。相反,你应该确定它的精确度和回忆分数,以及一个混淆矩阵来全面分析你的结果。当您有一个不平衡的数据集以确保您的模型按预期执行时,这一点尤其重要。

和我联系!

(所有表情符号由 OpenMoji 设计——开源表情符号和图标项目。许可证: CC BY-SA 4.0

为什么精确的模型并不总是有用的

原文:https://towardsdatascience.com/why-accurate-models-arent-always-useful-382f0cd64cfb

经济效用函数如何将你的模型与你的客户联系起来

Afif Kusuma 在 Unsplash 上拍摄的照片

首先,我想说,围绕如何评估您的模型,有很多优秀的技术内容。F1 分数、MSE、MAE、Huber 损失、精确度、召回率、交叉熵损失以及许多其他指标都是互联网上广泛讨论的术语。然而,这些指标通常侧重于使您的模型适合您的数据,而不是优化您的模型以适合您的业务——至少以直接的方式。

通常缺少的是一个经济分析框架来优化模型的效用。效用被简单地定义为顾客可以从服务中获得的乐趣或价值——在这种情况下就是你的 ML 模型。

虽然这个概念没有在 ML 课堂上教授,但我认为做经济分析和效用评估对于在现实世界中建立实用、持久的模型是非常重要的。在技术和非技术利益相关者联合起来共同开发机器学习模型的经济层之前,机器学习在您的组织中的商业价值和边际效用并没有得到很好的定义。

注意:这篇文章是为从事人工智能产品的技术型 ML 人员以及产品经理和非技术型利益相关者而写的。在这篇文章中会有一些数学,但是我已经在这篇博客的结论部分包括了高层次的概念步骤。

一个带有二进制分类器的 ML 例子

想象一下,你有一个非常优柔寡断的朋友,他永远不知道一部新电影是否值得看。因为你是一个令人难以置信的好朋友,也是一个优秀的人工智能实践者,你决定建立一个简单的二元分类模型来预测你的朋友是否会喜欢或不喜欢一部即将上映的电影。

你做了艰苦的工作,为你朋友看过的许多不同的电影标注你的偏好。你做一些特征工程,提取主要演员、类型、导演和其他特征,添加到你的训练数据中。您还可以添加一个标签,表明您的朋友是否喜欢这部电影(1)或不喜欢(0)。最后,你有一个如下的数据集。

电影偏好数据集示例,按作者排序的图像

你遵循正常的机器学习协议,用你最喜欢的分类器训练一个模型,并用 300 部电影的测试集测试它。

您发现您的模型具有相当高的准确性——90%的标签被正确预测。有鉴于此,你可以构建一个基于这种模式的应用程序,并将其交付给你的朋友,这样他们就可以开始变得更果断了!

几周后,你和朋友一起吃午饭,问他们是否在用你的应用。你的朋友犹豫了一下,并透露虽然许多推荐都是准确的,但仍有一对夫妇没有达到目标,因此他们停止使用该应用程序。

当只有准确性不起作用时

分类结果

发生了什么事?你的朋友为什么停止使用该应用程序?

要回答这个问题,我们必须看得更深一点。在二元分类器中,你意识到实际上有两种可能是对的,也有两种可能是错的。

下图是可能的预测结果。要了解假阳性、假阴性、真阳性和真阴性,请查看此链接

作者图片

在你朋友的例子中,这些是 TP、FP、FN 和 TN 的定义

TP =你正确地推荐了一部你朋友喜欢的电影(标签= 1,预测= 1)

TN =你正确地没有推荐你的朋友不喜欢的电影(标签= 0,预测= 0)

FP =你错误地推荐了一部你朋友不喜欢的电影(标签= 0,预测= 1)

FN =你错误地没有推荐一部你朋友会喜欢的电影。(标签= 1,预测= 0)

数据集中的预测和结果,按作者分类的图像

经济分析

在这个阶段,我们开始构建我们的经济层。第一阶段包括 2 个步骤:

  1. 列出与您的模型相关的所有收益和成本
  2. 衡量每项收益和成本的美元价值

在你为你的朋友设计的电影解决方案中,假设一个 FP 的成本是一张电影票 20 美元,浪费了 2 个小时的时间。也有一些负面的情绪伤害,你可以把它转换成一个特定的金额——在这个例子中是 12 美元。对你的朋友来说,获得正确预测的好处价值 50 美元。如果你的朋友错过了一部你的应用程序没有推荐的电影,你解释为 5 美元,他们也不会感觉很糟糕。

其中一些成本已经以美元计算,因此更容易分解。其他成本更难,因为它们是时间和情感成本,你必须深入了解你的朋友(或客户)才能量化。经过一番努力,你为了你朋友的收益和成本,把上面的整合成下面的定义。

A =花费的时间= 10 美元

B =看一部烂片的情感伤害= 50 美元

C =错过一部好电影的精神损失= 12 美元

D =看一部好电影的情感快乐= 50 美元

E =错过一部糟糕电影的情感快乐= $5

F =电影票价格= 20 美元

寻找和衡量不同的成本和收益,然后将其转化为一种可解释的货币,这是构建效用优化层所缺少的但却是必不可少的一步。

沟通经济学和 ML

您现在构建一个函数,将您朋友的量化成本和收益与分类结果联系起来。为了保持方程的简单,我们添加了上面方程中定义的变量标签(A、B、C 等)。在此阶段,我们将不同的收益和成本相加,为每个分类结果创造美元价值。

例如,误报是 80 美元,因为你加上了电影票的价格,看电影花费的 2 小时时间,以及观看一部糟糕电影的情感伤害。真正的肯定是 10 美元,因为对你的朋友来说,看这部电影值 50 美元,但他们花了 40 美元的时间和金钱。为了简单起见,我们假设每部电影都是 2 小时。

假阳性= F+2(A)+B = 20+(10 * 2)+$ 50 = 80

假阴性= C = 12 美元

真正= D-F-2(A) = $50 -$20 -($10*2) = $10

真负值= E = $5

效益成本比率

既然所有的成本和收益都与我们的分类结果相关联,我们可以引入一个效用函数。这不同于调优最精确的模型。

一个可能有用的经济效用函数的例子是收益成本比。这是一种流行的计算方法,是一般金融和经济分析的一部分。对这一比率的高层次解释是,大于 1 的值意味着收益大于成本,小于 1 则意味着相反。

作者图片

我们可以执行以下步骤:

  1. 计算 TPs、TNs、FPs 和 FNs 的数量
  2. 使用您为每个结果计算的成本作为权重来计算效益成本比

回到电影的例子,回想一下,我们有一个 300 部电影的测试集,其中 90%被正确预测。按照上面的说明操作后,对于每种类型的分类器结果,您会得到以下数量的数据点。

TP 预测= 80 次预测

总预测数= 190 次预测

FP 预测= 30 次预测

FN 预测= 0 预测

正如所料,300 个预测中有 270 个是正确的(TP + TN)。我们可以看到有 30 个误报,一个 FP 的成本是 80 美元。

我们的成本收益比是预期收益总额除以预期成本总额。

[(权重* TP) +(权重* TN)] / [(权重* FP) +(权重* FN)]

我们的预期收益是 TP 和 TN,我们的预期成本是 FP + FN。如果我们应用为 TP、TN、FP 和 FN 计算的权重,我们可以创建以下等式。

[($ 10 * TP)]+[($ 5 * TN)]/[($ 80 * FP)+($ 12 * FN)]

如果我们将所有计算出的数字应用于成本收益比:

[10(80)+5(190)]/[80(30)+12(0)]= 1750/2400 =. 729

大于 1 的值意味着模型在增值。在我们的例子中,值是 0.729。这意味着尽管 300 个预测中有 270 个是正确的,但这个模型正在伤害你的朋友。难怪你的朋友不再使用该应用程序了!!

二元分类之外的经济函数

我们也可以将这个框架扩展到其他类型的问题。例如,在多类分类器中,您可以测量正确的、不正确的、遗漏的和超出范围的话语,然后将相应的权重应用于这些测量,以创建您的收益和成本。您也可以使用一个一对一分类器来构建每个类级别的深度指标。一些类别标签可能比其他标签具有更高的精度更重要,因此可能应该设置经济指标来优化这些类别子集。

无论您使用什么型号,应用这种经济分析来帮助您决定生产中型号的正确设置都不会有什么坏处。

可行的步骤和更深入的 ML 指标

既然你已经量化了你朋友的偏好,你可能会决定你需要一个能为你朋友产生较少推荐的模型。实现这一点的一个方法是设置一个阈值,并衡量这个阈值如何影响你的效用函数。根据我在大公司和小公司的经验,我看到阈值被任意设置,经济层面将有助于增加一些背景知识来解释为什么阈值是这样的。还有其他方法来为你的模型分配阈值,我不会在这里讨论。

像 F1 这样的更深层次的指标确实考虑了精度和召回率(以及分类结果),与只考虑精度相比,这可以更好地了解模型的性能。敏感性和特异性等概念是众所周知和讨论过的概念,与本文有重叠。

即使在这些情况下,经济函数仍然是有价值的,可以用来为不同的结果分配货币价值,并直接将您的模型与客户的需求联系起来。

现实世界中的经济函数

当然,现实世界比电影中的例子要混乱得多。整合收益和成本的过程可能需要多次迭代和大量时间。衡量“情感伤害”等方面也非常困难。要得到一个合适的衡量标准,需要对你的客户有非常深刻的了解,即使这样也可能不是 100%准确。您应用的权重可能不正确,并且存在主观上违背以客户为中心的风险。

为了减少偏见,创建这个经济层的过程落在了机器学习人员、产品经理和任何对客户有洞察力的利益相关者身上。

结论

在本文中,以下是我们采取的高级概念步骤,经济层步骤以粗体显示:

  1. 来源,并准备您的数据
  2. 建立和训练模型
  3. 使用测试集生成预测
  4. 使用预测,标记分类结果(在二元分类器的情况下,标记 TP、FP、TN、FN)
  5. 了解分类结果的成本和收益,并转换为美元。这需要 ML 人员与对客户需求有很好感觉的利益相关者一起工作。
  6. 用步骤 5 中计算的收益和成本值衡量分类结果
  7. 计算一个经济效用函数(或大于 1),在本例中该函数是一个收益成本比
  8. 根据您的效用函数优化您的模型。这可能会影响准确性。在收益成本比的情况下,我们希望模型大于 1,而我们的原始模型小于 1。

总之,虽然人们普遍认为机器学习和人工智能为你的业务、客户和底线增加了很多价值,但开始衡量和优化这种价值很重要。

如果你对这种类型的内容感兴趣,并想探索更多,有一些奇妙的想法,以进一步探讨这些想法如何桥梁经济学和 ML。

<https://www.linkedin.com/pulse/why-utility-determination-critical-defining-ai-success-bill-schmarzo/> 

为什么人工智能研究员不应该成为你的第一个数据科学雇员

原文:https://towardsdatascience.com/why-an-ai-researcher-shouldnt-be-your-first-data-science-hire-a043eb78e2e7

等到你的团队更加成熟的 4 个理由

许多组织通过过分强调人工智能研究和在招聘狂潮中狼吞虎咽博士学位来开始他们的数据科学之旅。这是一个好主意,如果:

  • 你正在投资一个研究部门,你不打算问你的研究人员他们最近为你做了什么。
  • 你已经知道你正在解决一个有价值的、重要的问题,并且知道用现有的算法不可能解决这个问题

为了研究而研究是一项高风险的投资,很少有公司能承担得起,因为从中得不到任何有价值的东西是一种非常现实的可能性。

图片来自 Pixabay

如果你的目标是解决商业问题,这里有一些人工智能研究员不应该成为你的第一个雇员的原因:

  1. 他们是你这种数据科学的初学者。
  2. 他们对真实世界的数据没有经验。
  3. 你没有适合他们的环境。
  4. 你还没给他们找到好项目。

如果你是一名研究人员,请阅读这一段: 研究人员,我一生中有很大一部分时间是作为你们中的一员度过的,所以我非常尊重当你被引导到尊重你的技能的工作中时,你能有多大的价值。这篇文章的重点不是让雇主远离你,而是避免一种对所有相关人员来说都很悲惨的情况:被雇佣到一个没有准备好欣赏你所能提供的最好的环境中。坚持让雇主做好功课,以确保你能胜任自己的工作。

#1 —研究人员是你这种数据科学的初学者

有两种不同的数据科学;雇佣你真正需要的人。

  • 研究(如人工智能研究、统计学研究、数据科学研究等。)
  • 应用(如 AI 工程、应用统计学、应用数据科学等。)

用一个厨房的比喻来说,人工智能研究完全是关于设备的创新——创造通用工具的蓝图供他人使用。这是一个与应用人工智能非常不同的学科,后者更多的是在配方中进行大规模创新。如果你正在使用数据解决业务问题,应用人工智能是你需要的(而不是出售一种方法让别人用数据解决他们的业务问题)。

你卖的是哪个?该雇佣哪个团队取决于你的回答。作者创造的形象。

两者都非常有价值和重要,但是一方面的专业知识很少能转化为另一方面。当然,研究是寻找聪明勤奋的人的好地方,但是要知道他们将在工作中学习应用数据科学的大部分相关技能。点击了解更多

#2 —他们没有处理真实世界数据的经验

人工智能研究人员发明通用算法和方法供他人使用。他们不是来用你的具体数据解决你的具体问题的。事实上,虽然真实世界的数据可以为展示他们的发明创造一个很好的机会,但对研究人员来说,数据不需要太多就可以变得太真实。

没有人想承受额外的压力,要同时应对来自解决方案的数据特性的速度波动。使用一个众所周知的、被充分理解的、没有太多惊喜的数据集会更安全。这就是人工智能研究人员喜欢使用合成数据集基准数据集的原因。

合成的和真的味道不一样。来源: Pixabay

模拟合成数据集(根据配方由计算机生成)以创建受控条件。人工智能研究人员使用它们的原因与他们穿着实验服的同事不喜欢在肮脏的人行道上进行实验的原因相同。就像真实世界本身一样,真实世界的数据可能会非常混乱,分散人们对研究问题的注意力。

研究人员更喜欢避免真实世界的数据,原因与他们穿着实验室外套的同行不喜欢在肮脏的人行道上进行实验一样。

合成数据集的行为和复杂性是一个熟悉的朋友,因此调试没有那么可怕。即使研究团队转向业务问题的实时数据,他们也只有在确定数据集在合成数据集上的表现符合预期时才会这么做,这种心态与软件工程中的单元测试并无太大区别。

基准数据集可能是来自过去项目的模拟或真实数据集,研究社区使用这些数据集来比较不同研究团队之间的结果。如果你的算法在一个真实世界的数据集上得分 65%,而我的算法在另一个数据集上得分 98%,那么我的算法比你的好吗?如果不使用基准数据进行比较,就很难说。

使用基准数据集就像每个人都同意在同一杯纯净水上尝试他们的微波原型,看看谁能让它最快沸腾。真恶心,没人打算真的把水端给任何顾客。

这并不是说所有的人工智能研究人员都不喜欢真实世界的数据集——案例研究和概念证明都很棒,但你正在开发普遍有效的技术,拥有一个无菌的环境会减少你需要与之斗争的原因。

拥有一个无菌的研究环境会减少你需要对抗的原因。

但是我跑题了。我的观点是,研究人员不太可能有太多的经验来处理各种各样的真实世界继承的数据集,包括缺点和所有缺点,这些都是在没有他们参与的情况下收集的。这正是你要强加给他们的数据。点击了解更多关于继承数据的信息。

#3 —你没有适合他们的环境

如果你正在考虑让研究员成为你的第一个雇员,你可能还没有合适的环境来充分利用他们。博士项目有一个共同点,那就是它们迫使学生专攻某一领域。

来源:Matt may博士图解指南,经许可使用。

专家是很棒的,如果没有他们,我们都会处于黑暗时代,但是他们没有被训练成你在数据科学第一次雇佣中最需要的人:冷酷务实的多面手。

理想的数据科学新员工应该是多面手,他的热情是尽一切努力让数据变得有用。如果能完成任务,没有什么方法是太愚蠢或太廉价的。

在你的团队准备好高效工作之前,有许多零星的工作需要做。从建立基础设施获得数据资产与利益相关者争论壮大你的团队。你理想的雇员是准备好卷起袖子做任何需要做的事情的人。

DALL E 2 完全知道我在说什么。(图片由作者生成。)

公平地说,许多博士幸存者迫不及待地将他们的毕业礼服扔到篝火上,进行彻底的职业转变,因此学位本身并不是数据科学的禁忌。远非如此。但是做研究的愿望与在应用领域成为第一个雇员的要求相冲突。

#4 —你还没有为他们找到一个好项目

不要马上让研究人员加入进来。最好等到你的团队发展到可以理解他们需要一个研究员的时候。

研究人员专门发明解决问题的新方法,而不是解决问题的新方法。

由于研究人员专门发明解决问题的新方法而不是解决问题的新方案(区别很微妙但很重要!)只有当你确认解决问题所需的算法尚不存在时,你才需要他们的帮助。这时你就要向研究人员寻求帮助来发明它们。

等到你用尽所有可用的工具后,再雇人为你制造昂贵的新工具。

大多数团队不会提前知道解决他们问题的工具是否已经存在,所以按照正确的顺序做事更有意义:在自己制作那支太空笔之前,先检查一支铅笔是否能完成工作。首先开始,如果你发现现成的解决方案没有给你太多的爱,那么你应该考虑雇佣研究人员。

摘要

只有当你有合适的问题让他们解决时,研究人员才属于研究部门之外——他们的技能是从零开始创造新的算法和测试,而现成的版本并不存在——否则他们将经历一个悲惨的西西弗螺旋(这将完全是你的错,而不是他们的错)。研究人员通常会花上十年以上的时间进行培训,这至少值得尊重,因为他们不会从事完全不相关的任务。

研究人员通常会花上十年以上的时间进行培训,这至少值得尊重,因为他们不会从事完全不相关的任务。

为应用项目雇佣研究人员的最佳时机往往是在你的分析师帮助你确定了一个有价值的项目,并且试图用应用数据完成该项目的科学家已经失败之后。当你让职业发明家上场时。

那么什么是更好的招聘顺序呢?

参见我的数据科学和人工智能十大角色指南,按招聘顺序排列。

为什么分析需要影响驱动的方法

原文:https://towardsdatascience.com/why-analytics-needs-an-impact-driven-approach-43179f3bec4e

数据量及其复杂性不断增加,使得企业找到合适的地方来创造价值和推动影响变得更加困难和昂贵

图片由 Freepik 上的rawpixel.com提供。

当你的营销团队在不同的地区、国家和平台开展数以千计的活动时,有数以百万计的假设可以测试,也有无数的干预措施可以实施。或者,一个网站上有数百个不同的接触点,可能会影响消费者参与或流失的方式,每个消费者细分市场都有所不同。

不断追问为什么度量会改变

这意味着您的指标,如广告支出回报、转换率或购物篮大小都在定期变化。但是你知道他们为什么会改变吗?你知道该怎么做才能让局势朝着对你有利的方向发展吗?如果你想产生影响,每天都需要在你的营销和销售工作中运用新的知识。即使是表现良好的努力,未能跟踪和做出增量变化也可能导致长期低迷。

使用传统的商业智能工具意味着你需要知道正确的问题来开始。即便是找到正确的问题,也可能既令人沮丧又耗时。当业务团队向数据团队抛出不同的问题,希望找出指标变化的原因时,数据团队被这些请求淹没了。通常,当找到正确的问题和根本原因时,采取行动已经太晚,错过了创造价值的机会。

需要一种新的方法

为了找到原因,企业需要速度和规模来通过数据进行转型,需要一种将洞察时间从数周缩短到几分钟的方法,以及一种对优先级的准确视图,以使团队成员能够专注于真正重要的事情。

这就是机器学习的力量发挥作用的地方:

  • 每一种可能性都会在几分钟内被分析,
  • 业务团队可以实时获得可行的见解,并且
  • 桌面上没有留下任何机会。

鉴于数据的丰富程度只会越来越大,企业,尤其是快速增长和分散市场中的企业,需要更好、更快地驾驭这种复杂性,以保持竞争力。

高层次的观点可以提供信息,但还不可行

让我们看一下我们的国际跨平台营销活动示例,假设您看到全球投资回报率提升了 47%(见图 1)。这是一个令人印象深刻的结果,但是为了保持性能,您需要诊断是什么推动了这种增长。

图 1(作者图片)

在分析此次营销活动的投资回报率时,如果您能在几秒钟内了解每个子营销活动或子细分市场对您的全球营销工作的投资回报率的贡献有多大,会怎么样?你可以很容易地查看关于平台、国家和人口统计的信息,以便有一个更好的背景?如果你甚至可以交叉检查投资回报率的变化和其他相关指标的变化,如 CPI、预测收入或应用内转化率,会怎么样?

我相信你也认为这很棒,但是你可能会想:“我今天不能在我的仪表板上做这件事吗?“事实上,不是……因为仪表板很好地向您展示了变化,但它们不能帮助您看到所有的变化是如何组合在一起的。

转向仪表板进行分析并确定下一步行动可能会产生误导

让我们看一下下面的图 2,在图 2 中,您可以看到按国家划分的 ROI 变化的简单可视化。你很可能会将注意力转向芬兰、爱尔兰和西班牙,因为它们的变化最大。如果我告诉你,全球投资回报率的主要贡献者实际上是克罗地亚、奥地利和比利时,而芬兰实际上是最小的贡献者之一,会怎么样?

图 2(作者图片)

由于图 2 没有考虑营销支出的规模和收入变化,它转移了您的注意力,而不是将注意力集中在高影响力国家。看着单个的变化会忘记每件事对你的业务真正起到了多大的推动作用。当你全面考虑时,你就能理解每个国家对全球投资回报率的拉高或拉低。我们在下面的图 3 中总结了这种分析的结果。

图 3。各国对全球投资回报率的贡献。请注意,所有贡献总计为 47%,即投资回报率的整体变化。(图片由作者提供)

真正的洞察力产生于对影响的思考

在这样的小范围内工作,可以通过手动切片和切块找到类似的见解,因为团队会知道通常要寻找的嫌疑人,但随着数据集的增长,更多的因素和子因素开始发挥作用,并且需要随着时间的推移进行性能比较,这变得不可能。依赖直觉只会导致错失机会或损失积蓄。

仅仅因为你有复杂的数据,使用它不一定也很复杂。由机器学习支持的决策智能平台可以帮助简化和自动化您的数据流程。这意味着:

  • 您的业务团队将在几分钟内获得潜在机会的信息,并且
  • 您的数据团队从手动切片和切块以及临时请求中解放出来,能够专注于战略优先事项并承担主动角色
  • 你的分析师被授权提供洞察力,将你的团队的注意力集中到真正重要的事情上

关于作者

迈克尔·克拉普特是 Kausa 的联合创始人兼首席技术官。

Kausa 加速数据探索,通过全面持续地测试所有假设,在几秒钟内提供可操作的见解。可以在 网站 了解更多。

自定义异常为什么以及如何产生更干净、更好的代码

原文:https://towardsdatascience.com/why-and-how-custom-exceptions-lead-to-cleaner-better-code-2382216829fd

通过创建您自己的自定义异常来清理您的代码

(图片由 Unsplash 上的莎拉·基利安拍摄)

异常和错误之间有很大的区别;异常是故意的,而错误是意外的。这篇文章关注于创建你自己的异常,以及如何使用它们来清理你的代码,从而产生一个不容易出错的程序,一个更好的流程和更快的调试。我们来编码吧!

肮脏的方式

为了演示自定义异常是如何工作的,我们将想象我们正在构建一个网站。我们重点关注改进网站的登录功能,目前看起来是这样的:

(userexists、redirect 和 show_popup 是在我们项目的其他地方定义的函数;他们做什么和如何工作与本文无关)

这是一个相当简单的功能:

  1. 我们传递电子邮件和密码
  2. 检查是否存在与该电子邮件地址相关联的帐户。如果没有,显示弹出窗口并重定向到/注册页面
  3. 检查凭据是否有效。有效:显示弹出窗口。无效:显示弹出窗口和重定向

您可以像这样调用函数:

login_dirty(email='mike@bmail.com', password='my_pa$$word')

现在的登录功能有什么问题?

登录功能的问题是。我跟这个的意思是,它对不该负责的事情负责。我通常把我的项目分成两部分:

  1. 干净的代码
  2. 肮脏的代码

对我来说,区别在于干净的代码不知道你的业务逻辑。你可以从一个项目中提取“干净”的功能,并在完全不同的项目中使用它们。然而,脏代码包含业务逻辑;例如,当您无法登录时会发生什么。你被重定向了吗?是否显示弹出窗口?让我们通过删除带有自定义异常的所有业务逻辑,使我们的登录功能变得更好、更干净。

干净的方式

我们想要一个没有任何业务逻辑负担的登录功能。如果它不能登录一个用户,我们只需要发出信号,这是不可能的;我们代码的其他部分(脏的部分)可以决定如何处理它。

当你看我们函数时,有两件事可能出错:

  1. 电子邮件地址未知(即用户未注册)
  2. 电子邮件-密码组合不正确

这两件事就是阻止成功登录的异常:首先我们将编写一些代码,允许引发这些异常。然后我们将清理我们的函数和函数被调用的方式。

创建自定义例外

创建自定义异常比您想象的要容易:

正如你看到的,我们创建了一个新类,它继承了异常类。然后,为了给其他开发人员一个好消息,我们只重写 str 方法。

我们也可以像在UserNotFoundException中一样将参数传递给异常。这里我们做的事情和以前完全一样,只是我们需要使用 init 方法将email存储为一个属性。

2.清理登录功能

使用新的异常来看看这个函数看起来有多漂亮和干净:

除了看起来更好之外,功能更干净和纯粹;它只负责登录,如果不知道任何关于重定向和弹出窗口。这种逻辑应该被限制在项目中的几个地方,而不应该到处都是。自定义异常对此有很大帮助。

3.调用我们的登录

在我们的 main.py 文件中,我们现在可以像这样调用登录函数:

正如你所看到的,当我们无法登录时会发生什么是非常清楚的。主要的好处是,如果您以后决定无效的凭据也应该被重定向;没有很多地方可以搜索,因为您的业务逻辑并没有遍布整个项目。

结论

在本文中,我希望展示为什么要使用定制异常:为了帮助保持对代码的业务逻辑的概述,它们有助于保持您的函数纯净/干净和可调试。您自己的异常很容易在整个项目中创建和使用。

我希望一切都像我希望的那样清楚,但如果不是这样,请让我知道我能做些什么来进一步澄清。同时,看看我的其他关于各种编程相关主题的文章,比如:

编码快乐!

—迈克

喜欢我正在做的事情吗? 跟我来!

https://mikehuls.medium.com/membership

软件系统为什么以及如何衰退

原文:https://towardsdatascience.com/why-and-how-software-systems-decay-fa7ec83c4ff3

从 IBM 最大的转型项目中吸取的经验教训

Unsplash 上由 Daniel F 拍摄的照片

企业软件系统,不管是完全自主开发的,第三方开发的,还是混合开发的,都不可避免地会老化,就像这个世界上的其他东西一样。这种现象被称为比特腐烂代码腐烂软件侵蚀软件腐烂软件【系统】腐烂

软件衰退要么是软件质量随着时间的推移而缓慢恶化,要么是响应能力下降,最终导致软件出现故障、不可用或需要升级。这不是一个物理现象:软件实际上并没有衰退,而是缺乏对它所处的变化环境的响应和更新。
[ 软件腐烂@维基百科 ]

关于 Thomas Reinecke —在过去 5 年中,我担任了几个关键的 IBM 内部转型项目的首席架构师,我有独特的机会共同领导和影响 IBM 一些最复杂、最全面和最有影响力的业务转型,其中提到了支持、销售和业务合作伙伴生态系统的转型。我一直是一个非常好奇和善于思考的人,所以一段时间以来我一直试图理解软件衰退背后的机制。我本质上仍然是一名 IT 工程师,所以我对实用的东西更感兴趣。然而,在我分享我自己的实际经验之前,我们将从一些理论开始。

软件系统衰退最相关的问题似乎是:

  • 衰老的机制和原因是什么?
  • 衰老能被影响吗?如何影响?
  • 老龄化的后果是什么,以及与之相关的成本?

本文将回答这些问题。

理论和预备读物

本章提供了软件衰退的理论和科学概念。我推荐文章软件熵(维基百科)、软件腐烂(维基百科)和处理软件熵的必然性——软件平衡可达到吗(中等)。

保持秩序和结构是一件代价高昂的事情,物理定律似乎以软件熵的形式对我们不利。根据[雷曼-贝拉迪 1985 年]…

  • 使用的计算机程序将被修改
  • 当一个程序被修改时,如果不主动去修改它,它的复杂性就会增加
  • 软件熵随着技术债务的积累而增加
  • 增加的熵导致增加的无序、增加的错误率、增加的维护和改进的成本和时间,最终导致系统的经济死亡

你可能还会发现关于熵的更哲学的观点很有趣…

视频熵:宇宙的无序|什么是熵?YouTube 上的 by ( 太空中的猫头鹰

就像我们自己的腐烂一样,可以肯定地说,软件系统的腐烂是不可避免的,不管我们喜欢与否。然而,重要的是了解加速和减速因素,并且当我们计划、构建或维护软件系统时,其中一些因素会直接受到我们的影响。

软件系统衰退——我自己的观察

以下面的列表(大致按相关性排序)作为我个人经验教训的集合,这些经验教训来源于现实世界的经验:

功能复杂程度

总的来说:越低越好。这个方面是由系统必须服务的角色用例的数量驱动的。时间是最大的影响因素,因为我们可以假设使用的系统将被修改,所以初始状态通常在其生命周期中具有最低的复杂性,特别是当系统作为 MVP 启动时。我在这里的首要建议是始终挑战即将到来的业务需求——系统承担的越多,老化得越快。并非所有的需求都是业务关键的,许多甚至是无效的,特别是对于特定的业务单位,偏离标准化业务流程的请求应该发出危险信号。接受的一次性越多,衰减越快。建立一个授权的架构评审委员会(稍后会有更多内容)并有一个强大的业务架构师来监督过程领域是有价值的,并且可以减缓衰退。

我见过角色和用例从现有系统中迁移出来的情况,但是这通常意味着遗留系统被耗尽并迁移到新系统中。在发生有限重组移动的罕见情况下,支持移动功能的代码/配置没有得到适当清理的风险很高——通常是由于风险、成本原因,因此这通常会留下技术债务。

技术选择

我们可以就此谈论几个小时…构建与购买,最新的酷狗屎与已建立的顶级公司,本地与混合或公共云,两者的混合,开发语言,框架,容器解决方案等等。理论上,这是一套非常丰富和令人兴奋的选择,但现实是不同的:

基础技术决策通常由公司战略、大型供应商交易和高管意见驱动。我见过这样的例子,其中这样的决策受到一个较小的高级技术领导团队的显著影响。然而,一般来说,应该假设潜在选项列表被“我们一直都是这样做的”(构建)或“我们将彻底改变并使用一个供应商”(购买)极大地浓缩了。

为了从一开始就减缓衰退,请确保您组织中可用的资源和技能非常适合您的技术选择。如果你不得不在你组织中的技术人员不熟悉的技术栈上开始一个项目,老化率将会高得多,仅仅是因为可避免的错误更有可能发生,尤其是在项目的早期。

标准化水平

一般来说,对标准化的投资越多,衰减的速度就越慢,但是代价也很高,尤其是对于“快速尝试—快速失败”的方法。由于我们关注的是衰变,以下是值得关注的领域:

  • 分段 —如果您需要将多个产品部署到同一个平台上(例如,具有外部、内部角色的 Salesforce 部署),请确保代码、配置、对象模型、存储、API 端点等通过在元素名称上使用前缀来正确分段。这将有助于每个可能参与项目的人认识到元素属于哪里。对于共享元素来说,这可能没那么简单。分割也可以应用于较大的特征
  • 整合——显然,越少越好。但是,即使您需要集成大量的子系统,就像大型组织中的典型情况一样,从通信流和技术的角度来看,hub 解决方案和 orchestrators 也可以用来构建一个复杂的集成蜘蛛网。然而,应该注意的是,集成中心系统通常在业务或执行层面上不是很受欢迎,因为它们通常对业务只有间接的影响。
  • 源代码&开发——最明显的问题是源代码。在撰写本文时,源代码仍然主要由人编写,人的因素给代码带来了不同的技能、编码风格和质量期望..开发组织越大,越多样化,偏离的水平就越高,这将随着时间的推移增加老化率,导致更早的衰退。我推荐使用标准化的林挺过程(可以根据您的需求定制),为代码评审测试代码文档设定标准,并通过 CI/CD 管道中的自动化来执行这些标准。另一个建议——非常类似于 hub 解决方案——是投资于核心服务,它们可以集中具有更广泛使用模式的功能。对象、类、方法和异常的适当命名约定也有助于大大减缓衰退。

架构和所有权

如果我们假设业务需求是老化率的一个主要原因,我们可以考虑架构作为它的对应物。然而,这需要一个组织设置,其中架构审查委员会有权审查、质疑甚至停止实施提议。在一个理想的世界中,每个产品(对于较小的设置)或者每个能力(对于较大的项目)都有一个产品负责人,他在业务和项目团队之间进行转换,并且拥有一个开发团队。项目中还应该有多个架构师,他们在各自的领域都有专长,比如数据架构师、集成架构师、业务架构师,以及一个负责监督整个产品的首席架构师。产品所有者将与一个或多个被指派的架构师一起工作,通过我们称之为“精化”的过程来驱动对他们所收到的需求的提议解决方案的创建。在这个过程中,需求被转化为人物角色/用户故事,对现有架构、对象模型、所需配置和实现细节的更改被指定,记住一些目标:

  • 提议的解决方案必须符合架构原则
  • 遵循 KISS(保持简单,笨蛋):过度工程化总是比将一个提议减少到绝对最小要容易得多,包括现有功能的重用,这需要关于实现的大量知识
  • 不承担或承担很少的债务,关注软件熵

所有权是软件系统腐烂速度的另一个关键驱动因素。上面的设置非常适合稳定的所有权,其中每个 PO 和小队拥有他们各自能力的代码和配置,理想情况下对质量、设计和开发原则有一些热情。然而,如果假定位置和小队是容易替换的,并且新的需求被简单地加到任何小队的当前备用能力上,那么整个系统的快速系统衰减是有保证的。如果每天都有其他人介入并改变它,谁会对“他们的孩子”及其质量充满热情呢?所有权可以是纵向(按功能,例如“结帐功能”)和横向(按技术,例如跨多个功能使用的“通知框架”或“REST 端点公开”)的混合。最大的挑战是确保理想情况下一个团队拥有一段代码,而不是几段或一段都没有。

软件维护和技术债务

随着时间的推移,市场需求会发生变化,功能性和非功能性需求也会发生变化。正如我们所了解的,这增加了复杂性,不可避免地导致您的软件老化。让我们假设,项目初始阶段的风暴和压力时期已经结束,您已经覆盖了所有的角色和需求用例,并且您的软件基本上处于维护模式。这个生命周期阶段的需求至少有两个方面:

  • 随着时间的推移,缺陷被发现,你的开发组织(现在已经大大减少了)试图修复它们。你可以假设最初领导这个项目的关键人物已经离开了,所以这个阶段现在主要是在那些依赖于其他人留下的质量的人的手中
  • 软件中的依赖项(例如库)需要更新,这通常需要对软件进行更改,这比仅仅提高 package.json 中的版本号更昂贵。这里的噩梦场景是一个重要的库被弃用,而没有兼容的继任者

无论您添加新功能还是更改现有功能,都需要完成这两项活动来维护您的软件。如果你想保持正常运转,这些是你的固定成本。

然而,还有第三个方面,相对于它对衰退的影响,这一点通常被大大低估了— 重构。依我看,在项目进入维护阶段之前,你应该在生命周期的每个季度计划一次重构冲刺,作为最佳实践,重构冲刺不应该关注直接的商业价值。你的开发组织将在这些冲刺中产生的间接价值是反击债务,减缓衰退,提高质量,性能,架构,对象模型,并清理所有的战术实现,这些很可能必须在通常发生的能力开发的热潮中完成。

然而令人悲伤的现实是,团队很少被给予重构冲刺的时间——市场需求太重要、太迫切,间接的业务影响很少受欢迎,而且人们认为团队会边走边清理。这只是一个事实,减少债务的时间很少给出,如果这伴随着提供特性/功能的强大压力,软件在增长的同时几乎会更快地腐烂。在这种模式下,开发中的软件系统在进入维护模式之前甚至不需要 3-4 年的时间就可以在内部腐烂。

证明文件

软件开发是一个资源稀缺、时间和成本压力的故事。所有这三个方面通常都促使人们希望最大限度地减少对没有直接商业价值的元素的投资,这通常会导致文档数量、质量和维护的不足。总的来说,你有多种方法来记录你的项目,我个人推荐两种方法:源代码剧本

  • 源代码文档应适用于所有类、方法、元数据、配置,包括对象模型正确洞察源文件。一个合适的类名和方法名的术语是非常有价值的,但是不应该认为这些名称足以描述一个函数的功能。这是最初的开发团队可以留给维护人员的遗产,如果以正确的数量和质量完成,将有助于降低老化率
  • 在过去几年里,我们在最近的大型项目中使用了剧本的方法。它是一个轻量级 Wiki/CMS 解决方案(如 wiki.js 或 Confluence)或类似解决方案的部署,被设置、推广并作为任何项目相关文档的一站式商店(显然不包括源代码)。理想情况下,该解决方案带有适当的标记和搜索功能,并允许 WYSIWYG 创作,使内容创建尽可能简单。对于 ERM 图表,我们通常使用清晰的图表、壁画或其他类似工具。如果认真对待,以行动手册的形式创建适当的文档可以对您的系统恶化的速度产生非常积极的影响。

可以在 Github 页面上免费构建一个非常轻量级的文档系统,您可能会发现这篇文章很有帮助:

https://itnext.io/create-compelling-documentation-with-github-pages-16e4149efe9e

永远不要把你的需求管理系统(不管你是用吉拉还是别的什么)当成你的文档系统,问题不是存储文档的可靠工具——仅仅因为它描述了请求是什么,而不一定描述了最终的实现;-)

摘要

我们已经了解到,软件和宇宙中的其他事物一样会老化,衰退是不可避免的。通过观察一些有影响的人,您应该知道如何影响系统老化的速度。我们还了解到,一个强健且缓慢老化的系统的最大反对者是需求、时间和金钱,这并不奇怪。要做出正确的优先顺序和投资决策,你首先要回答你认为这个系统会持续多久,以及衰退的速度是否与你做出的决策一致。

谢谢你

我没有因提及的品牌、产品和公司而获得任何报酬或奖励。如果你喜欢这个故事,并想在 medium 上阅读成千上万个这样的故事,你可以成为 medium 会员,每月只需 5 美元。如果你愿意支持我的写作,请使用我下面的推荐链接,我将免费获得你的一部分会员资格。

https://medium.com/@thomas.reinecke/membership

为什么以及如何弃用仪表板

原文:https://towardsdatascience.com/why-and-how-to-deprecate-dashboards-357a68f041ba

当有太多的仪表板需要筛选时,建立一个自动化的弃用流程来保持 BI 实例的整洁。

你的仪表盘没这么重要。图片来自 Unsplash

一个人可以从多少仪表板中获得合理的洞察力并采取行动?虽然我不知道答案(这实际上会是一个很好的调查),但我希望我们都同意极限确实存在。当我们先跑后走,不分析问题本身就为每个问题创建一个仪表板时,这就是仪表板膨胀的时候。

定义:仪表板膨胀 是当浪费时间寻找相关的视觉来回答问题或重新创建已经存在的视觉时,对组织的影响。

这种情况下的成本是时间(因此也是效率)。当 holy grail Looker 实例组织得很差时,增长主管花更多的时间在 CAC 上寻找一个有用的图表,按付费用户和免费用户进行细分,而不是实际改变增长策略。如果清洁度和组织性已经荡然无存,分析团队会重新创建已经存在的可视化效果。

仪表板膨胀可能是实施不当的自助服务策略的结果,也可能是自助服务的对立面,这取决于您的观点。自 2013 年以来,一些人一直说仪表板不是答案,但 10 年后,它们会一如既往地被使用。虽然肯定会出现数据应用、自动化洞察和可操作化数据等新趋势,但仪表板在很长一段时间内不会有任何发展。

在他们已经存在的前提下,我们如何组织他们?

战略铺平了前进的道路

他们说创业公司赢是因为他们行动快,创业公司的分析团队也是如此。通常有这么多事情要做,所以在技术债务已经存在之前,很难将战略优先于每件事情的持续执行。

如果有人刚刚开始考虑 BI 工具策略,这一节是为你准备的。通常,战略会谈是在走得太远太快,需要往回走的时候进行的。在这种情况下,回答这些问题是关于你希望世界是什么样子,而不是今天是什么样子。

只有回答一些高层次的问题,如作为数据领导者,您如何展望您组织内部的商业智能,并积极地进行修正以尽可能与愿景保持一致,才能避免仪表板膨胀。

💡思考整体分析策略。

  • 您如何决定优先考虑哪些数据产品,以及如何交付它们?
  • 谁负责建模数据和构建可视化?

💡具体说明商业智能的游戏规则。

  • 实例中的文件夹是如何组织的?
  • 组织中谁拥有查看、编辑和管理权限?
  • 可视化什么时候达到寿命终止状态并且不再被支持?

这些问题的答案因公司规模而异(50 人对 500 人?)、文化(集中式还是分布式分析团队?),业务类型(B2B 还是 B2C?),还有更多。然而,最后一个问题是最重要的。

让我们从头开始:这里是我开始的基本策略。

分析策略

  1. 确保每个数据产品都有一个足够大的用途,以优先考虑数据产品的持续维护。目标应该与更大的公司目标相联系。
  2. 确定并记录每个数据产品的 SLA。每个用户的属性来源真的需要通过 API 公开吗?它真的会被近乎实时地使用吗?(不,绝对不会。)
  3. 每个数据产品应该回答一个问题,而不是一个陈述(即而不是“免费 vs 付费用户的 CAC”,做“免费和付费用户之间 CAC 什么时候最低?”).

BI 实例组织

  1. 按团队组织文件夹中的实例。“常规”文件夹可以包含公司范围的指标,但不应过度使用。
  2. 每个团队应该只对他们的团队文件夹有编辑权限,对其他所有内容都有查看权限(团队绩效或 PII 除外)。
  3. 自动清理您的 BI 实例——这非常重要,值得单独列出一节。

清理是维持战略的关键

作为数据专业人员,我们都有过被称为任务关键型的问题。人们说情人眼里出西施;批判性也是。当我们发现每 15 分钟更新一次的仪表板实际上并没有被使用,当然,它可以被删除一次。但是,是什么防止了同样的问题再次发生呢?

策略只和它的维护一样好,维护的一个很关键的部分就是弃用。

虽然人工 QA 可能是一家公司内最政治正确的方法,但它是最手工的,也是最难优先考虑的。我提出了一个自动化的仪表板弃用策略,只需构建一次,需要最少的人工支持。

自动化仪表板弃用策略会获取所有 BI 元数据,并自动删除一段时间内未使用的视觉效果。

我将使用 Looker 浏览 Python 中的伪代码示例,因为它很受欢迎并且容易膨胀,同时还会给出其他企业工具的指南(因为几乎任何 BI 工具都可以做到这一点)。

让我们来谈谈技术。

1.编写一个脚本,将所有 BI 元数据转储到仓库中。

初始化对实例的访问。对于 Looker,这是通过一个 Python SDK 实现的。为实例 URL、客户机 ID 和客户机机密设置环境变量。其他 BI 工具可能也有官方 SDK(例如 Tableau ,其他的有非官方 SDK(例如 Domo ),或者你可能会发现直接调用 rest API 很方便(例如 PowerBI )。

import looker_sdk
sdk = looker_sdk.init31()

直接通过 SDK 获取所有可以获取的数据。对于 Looker 来说,最有用的信息是获取所有仪表盘、外观和用户。对于 Tableau 服务器,获取工作簿、视图和用户。无论是哪种 BI 工具,您都需要清理响应,要么将它转换为 JSON,要么只提取相关的特定字段(如 ID、名称、创建日期、用户)。

dashboards = sdk.all_dashboards()
looks = sdk.all_looks()
users = sdk.all_users()

从内部使用统计报告中获取数据。许多工具不直接通过它们的 API 公开用法和历史。然而,它们确实公开了原始数据集,比如在 Looker (i__looker 元数据)和 PowerBI (原始审计日志)的情况下,或者带有 TableauDomo 的预建报告。任何任意 BI 报告本身都可以导出为 Python 中的数据集。我们真正需要的是一份报告,上面有每个视频的最新访问日期。

history_data = sdk.run_look(my_admin_look_id, result_format="json")

将所有这些输出写入仓库表。我不会用这个的代码片段来打扰你。用数据转储覆盖表(像所有视觉效果一样),并追加随着时间推移而构建的数据(像历史访问)。这个过程应该是等幂的,并按计划(我建议每天)运行,以实现完全自动化。

2.对数据进行建模,以了解使用情况。

无论您选择如何转换数据,原始表都需要连接、透视和聚合才能有意义。

让我们回顾一下现有的来源:

  • 每个视觉效果的表格(仪表板和 Looker 示例的外观)。称之为 looker_dashboardlooker_look
  • 用户表。称之为 looker_user
  • 历史访问表(原始或汇总至最近访问日期,根据视觉效果)。称之为looker _ historical _ access

我们需要的结果是一个表,其中每个视图都有一行,分别是创建它的时间、创建它的用户以及最后一次查看或编辑它的日期。粗略的查询可能如下所示:

with history as (
    select visual_id,
           max(access_date) as latest_access_date
    from looker_historical_access
    group by visual_id
), dashboards as (
    select
        id as visual_id,
        name as visual_name,
        user_id as visual_created_user_id,
        created_at as visual_created_at,
        'dashboard' as type
    from dashboard
), looks as (
    select
        id as visual_id,
        name as visual_name,
        user_id as visual_created_user_id,
        created_at as visual_created_at,
        'look' as type
    from look
), visuals as(
    select * from dashboards union all select * from looks
)
select
     v.*,
     coalesce(h.latest_access_date, v.visual_created_at) as latest_access_date,
     u.email
from visuals as v
left join history as h on h.visual_id = 
left join user as u on v.visual_created_user_id;

我忽略了几件事:

  • 历史访问表可能已经聚合,也可能尚未聚合,这取决于您的源报表。它也可能不包含一个干净的“visual _ id”,因此必须派生它。
  • 你必须联合不同的视觉信息(无论是仪表板和 Looker 的外观还是 Tableau 的工作簿和视图)。
  • 有时,创建视觉效果并不算访问它,所以你需要确保最近创建的视觉效果没有被标记为删除。
  • 当您开始引入用户访问数据、文件夹结构等等时,数据会变得更加复杂。如果基于这个过程,您可以在不同的 dbt 模型中更严格地构建它,但是我已经为初学者采用了最简单的方法。
  • 要通过 Slack 提醒用户,您需要将他们的电子邮件映射到 Slack 用户名。
  • 如果它是一个表而不是一个视图,请按计划更新它。

3.弃用前自动警告用户,然后删除视觉效果。

因此,我们已经获得了仓库中的所有数据,并且我们知道哪些视觉效果最近没有被使用(我通常建议将 60 或 90 天作为“不是最近”的阈值)。BI 工具通常在数据团队之外大量使用,那么应该如何沟通这种努力呢?

传达努力的原因。组织沟通永远是最难的一步。在开始弃用之前,记录并向更广泛的组织传达保持一个干净的 BI 实例的好处(…或者如果您愿意的话,可以传阅这篇文章)。目的不是删除别人的作品;这是为了让公司的每个人都能更快地从数据中获得洞察力。

为自动化沟通创建一个反对松弛渠道。BI 工具的任何用户都应被添加到此渠道。

查询 X-7 天内未被访问的视觉效果,并发送一条 Slack 消息。如果在 60 天的空闲时间删除,包含的视觉效果应该是 53 天未使用的,或者如果在 90 天的空闲时间删除,应该是 83 天未使用的。为每个视频发送一个 Slack,标记创建它的用户。

# Everything below is pseudo-code, with utility methods abstracted away
deprecation_days = 60
warn_visuals = get_warehouse_data( # Pseudo method
    f'''
    select visual_name, created_by_user
    from modeled_looker_data
    where current_date - last_accessed_date = {deprecation_days - 7}
    ''')
slack_message_template = '''
    Visual {{visual_name}} created by @{{slack_username}} will be 
    deprecated in 7 days. If this is incorrect, please contact the 
    analytics team.
'''
for visual in warn_visuals:
    send_slack_message(slack_message_template, visual) # Pseudo method

查询准备删除的图像,并通过程序删除它们。在准备好要删除的视觉效果列表后,你必须遍历它们并删除每一个。在迭代中,可能会有不同的方法与不同类型的视觉效果相关。在对该步骤中使用的数据建模时,可以存储该类型。这些图像中的每一个之前都应该有警告信息。

deprecation_days = 60
delete_visuals = get_warehouse_data( # Pseudo method
    f'''
    select visual_id
    from modeled_looker_data
    where current_date - last_accessed_date >= {deprecation_days}
    ''')
for visual in delete_visuals:
    visual_id = visual['visual_id']
    if visual['type'] == 'look':
         sdk.delete_look(visual_id)
    else:
         sdk.delete_dashboard(visual_id)

就像木工里说的:量两次,切一次。在删除东西的时候,通过注释掉实际的删除来运行自动化过程几个星期,以确保逻辑是合理的。

最后的想法

这篇文章的标题是有目的的:我发现清理令人兴奋,这包括自动清理 BI 实例。他们说,当你的工作空间整洁时,工作效率就会提高,那么为什么你的 BI 实例不能同样整洁呢?

最后,如果我不在下面补充几点意见,那将是我的失职。

大多数企业工具没有自由层,这就是为什么我包括了一个粗略的代码大纲,而不是难以持续测试的特定代码片段。我也没有提到更新的或者代码繁重的 BI 工具,比如超集、Lightdash、Metabase 等等。尽管我建议无论使用何种工具都使用这种方法,但是 API 中公开的特定端点可能会有所不同。

提到数据目录在元数据工作中的作用是很重要的。虽然大多数现代数据目录连接到 BI 工具并为您收集元数据,但它们(还)没有完全建立为主动和删除视觉效果。然而,中间的一个折中方案是直接从一个集中的数据目录中导出 BI 元数据,然后自己编写弃用逻辑。这种方法仍然需要处理 API 之类的东西。

【sarahsnewsletter.substack.com】原载于https://sarahsnewsletter.substack.com/p/the-thrill-of-deprecating-dashboards

为什么以及如何在 Pandas 中将类似列表的列“展开”为行

原文:https://towardsdatascience.com/why-and-how-to-explode-a-list-like-column-to-rows-in-pandas-b69c3391c01c

一个非常酷的熊猫把戏,你应该看看

图片由 Pixabay 提供(作者修改)

什么是列表式列?在 pandas dataframe 中,我所说的将一个类似列表的列“分解”成行是什么意思?为什么我们需要这样做?这听起来像是一个罕见的数据争论问题,但在数据世界中并不罕见(记住,数据以各种形式和格式出现在我们面前)。

解释它的最好方式是给你看一个真实世界的例子。假设我们想对以下 TED 演讲数据(2006 年至 2021 年)进行一些分析,并使用单词云来可视化“教育”标签类别中最受欢迎的 TED 演讲。你可以在Kaggle.com上这里下载数据。

作者图片

在这个数据框架中,我们有每个 TED 演讲的名字,总浏览量,以及它所属的标签。请注意“tags”列与典型的列(例如,string、integer、float 等)有何不同。)你会看到的。“tags”列由一组用逗号分隔并用方括号括起来的标记组成——看起来就像一个 python 列表!我们称之为类似列表的列(这个列的实际数据类型是 object/string)。

嗯,虽然在一个列表式的列(即标签列)中显示 TED talk 所属的所有标签很简洁,但用这种格式分析数据并不方便。例如,如果我们想从数据帧中过滤掉所有带有“教育”标签的 TED 演讲,我们该怎么做呢?

幸运的是,有一个非常简单明了的Pandas方法叫做DataFrame.explode() ,可以用来专门解决这个问题。它将把类似列表的列的每个元素转换成一行,复制索引值。让我们通过例子来看看它是如何工作的。

正如我前面提到的,“标签”列只是一个列表的字符串表示(dtype: object),因此我们需要首先使用 python 的ast.literal_eval()方法将“标签”列从字符串转换为列表。

from ast import literal_eval
df['tags'] = df['tags'].apply(literal_eval)

然后我们使用 Pandas 的dataframe.explode()方法将列表分解成行。在explode程序之后,我们还可以使用drop_duplicates()来删除任何可能的重复。

df = df.explode('tags').drop_duplicates()

作者图片

不错!现在我们有了一个更容易处理的数据框架!有了重塑后的数据框架,我们可以快速创建一个单词云,只需几行代码就可以将“教育”标签类别中最受欢迎的 TED 演讲可视化。

额外收获:为 TED 演讲创建一个单词云

让我们创建一个单词云,将 2006 年至 2021 年最受欢迎的 TED 演讲可视化在标签类别“教育”中。创建单词云的方法有很多。这里我们将使用matplotlib来做这件事。

作者图片

还有很多方法可以美化如上图所示的基本单词云,包括改变背景颜色、调整字体大小、使用定制的遮罩图像等。如果你想做一个比我们在这篇文章中创建的基本视觉效果更好的视觉效果,你可以在这里阅读我关于文字云的另一篇文章。

https://medium.com/@insightsbees/let-your-artistic-creativity-shine-with-advanced-python-visualization-d4fcccd78848

总的来说,如果您的数据帧有一个类似列表的列,并且您需要通过解包列表并将每个元素分解为一行来重塑数据帧,您可以使用下面的代码片段轻松实现您的目标。

from ast import literal_eval
df['column_name'] = df['column_name'].apply(literal_eval)
df = df.explode('column_name').drop_duplicates()

数据源:

本文中用于演示的数据集是一个免费的开放数据集,可以从 Kaggle 的网站这里下载。这个数据集是由 Ramshankar Yadhunath 创建的。

你可以通过这个推荐链接注册 Medium 会员(每月 5 美元)来获得我的作品和 Medium 的其他内容。通过这个链接注册,我将收到你的会员费的一部分,不需要你额外付费。谢谢大家!

为什么以及如何将熊猫数据框由宽变长

原文:https://towardsdatascience.com/why-and-how-to-reshape-a-pandas-dataframe-from-wide-to-long-ca90c89156b9

一段简单的代码就完成了这个任务

图片由 Pixabay 提供(作者修改)

作为数据科学家,我们知道数据并不总是以最适合分析或可视化的格式出现。将表格或 pandas 数据帧从宽格式转换为长格式就属于这种情况,我们需要对数据应用一些“技巧”来进行分析。

让我们看一个真实世界的例子来理解概念和技术。假设我们想要创建一个动画条形图竞赛图来说明世界前 15 个国家的 GDP 从 1960 年到 2020 年是如何演变的。你可以从世界银行的网站下载原始数据。

作者图片

这是“宽格式”表格的典型示例。对于每个国家,我们在单独的列中有其每年的 GDP,总共有 61 列/年的 GDP 数据。基本上,表格按年份水平延伸,使其非常宽,因此得名“宽格式”。

虽然“宽格式”的表格看起来容易阅读,而且在现实中很常见,但用 Python 绘图却非常困难。我们需要“转置”表格/数据帧,这样我们就有一个变量表示时间列(在我们的例子中是“年份”),另一个变量表示每年的值(在我们的例子中是 GDP)。

作者图片

那么用 Python 怎么做呢?为了将数据帧由宽变长,我们需要使用一个名为pd.melt()的 pandas 函数。在下面的代码中:

第 2 行:我们从 pandas 数据帧中得到“Year”列的列表。这些是要转置的列。

第 3 行:我们指定数据帧中的哪些变量是“id _ var”——基本上是不被改变/转置的列(即,我们的数据帧中的前四列)。我们还需要指定数据框架中的哪些变量将被转置——在我们的例子中,所有的年份变量(1960[YR1960],1961[YR1961],1962[YR1962]等等。)

重新成形的长格式数据帧将具有代表年份的“变量”列和代表每年的值(即 GDP)的“值”列。列名“变量”和“值”都是由pd.melt()给出的默认名称。

作者图片

我们可以进一步清理数据,比如将这两列重命名为“Year”和“GDP ”,并确保它们具有正确的数据类型。

作者图片

额外收获:使用重塑的数据框架创建一个条形图竞赛

现在我们可以使用raceplotly整形后的数据帧中轻松创建一个条形图比赛动画。如果没有raceplotly,可以通过运行下面的命令行来安装:

pip install raceplotly

raceplotly中最重要和必需的论点是:

  • item_column:表示要分级的项目/条的列的名称(‘国家名称’)
  • value_column:表示用于排名的值/度量的列名(“GDP”)
  • time_column:表示时间变量的列名(“年”)

作者创建的 Gif

将一个表从宽转置为长听起来是一件复杂的事情,至少在 SQL 或 Excel 中是这样。但是在 Python 中,pd.melt()是一个非常方便和简单的方法,可以快速获得想要的结果。感谢阅读。我希望你喜欢这个快速 Python 教程!

数据源:

应用程序演示中使用的数据集是从世界银行网站https://data.worldbank.org/indicator/NY.下载的开放数据集(无需许可)GDP.MKTP.CD?name_desc=true

你可以通过这个推荐链接注册 Medium 会员(每月 5 美元)来获得我的作品和 Medium 的其他内容。通过这个链接注册,我将收到你的一部分会员费,不需要你额外付费。谢谢大家!

为什么以及如何为 Python 项目设置日志记录

原文:https://towardsdatascience.com/why-and-how-to-set-up-logging-for-python-projects-bcdd4a374c7a

杰克·沃克Unsplash 上拍照

Python 的日志库非常强大,但在数据科学项目中通常没有得到充分利用。

大多数开发人员默认使用标准的打印语句来跟踪应用程序或数据管道中的重要事件。

有道理。

“打印”完成了这项工作。它很容易实现,没有样板代码,也不需要阅读文档来理解如何使用它。

但是随着代码库变得越来越大,由于 print 语句的不灵活性,您可能会很快遇到一些问题。

Python 的日志库为应用程序的调试和审计提供了更完整的解决方案。

原则上,使用日志库很简单。尤其是对于单个脚本。但是根据我的经验,我发现很难清楚地理解如何为包含多个模块和文件的更复杂的应用程序设置日志记录。

不可否认,这可能只是由于我在开始使用库之前长期无法阅读文档。但是也许你有同样的挑战,这就是为什么你可能会点击这篇文章。

经过一点研究,下面是我如何用最少的样板代码和简单的配置文件为我的数据科学项目设置日志记录。

为什么使用日志记录而不是打印?

首先,让我们讨论一下在项目中使用 Python 日志库的理由。

日志记录主要是为了开发人员的利益

打印/记录声明是为了开发者的利益。不是电脑的。

日志记录语句有助于诊断和审核与应用程序正常运行相关的事件和问题。

在日志语句中包含/排除相关信息越容易,监控应用程序的效率就越高。

打印报表是不灵活的

它们不能被“关闭”。如果你想停止打印一个语句,你必须修改源代码来删除或注释掉这一行。

在大型代码库中,很容易忘记删除所有用于调试的随机打印语句。

日志记录允许您添加上下文

Python 的日志库允许您轻松地将元数据添加到日志中,例如时间戳、模块位置和严重性级别(调试、信息、错误等)。).这些元数据是自动添加的,无需硬编码到语句中。

元数据也是结构化的,以在整个项目中提供一致性,这可以使日志在调试时更容易阅读。

将日志发送到不同的位置并以不同的格式发送

打印语句将输出发送到终端。当您关闭终端会话时,打印语句将永远丢失。

日志库允许您以不同的格式保存日志,包括保存到一个文件中。对于记录日志以备将来分析非常有用。

您还可以同时将日志发送到多个位置。如果您需要记录多个用例,这可能会很有用。例如,从终端输出进行常规调试,以及出于审计目的在文件中记录关键日志事件。

通过配置控制行为

可以使用配置文件来控制日志记录。拥有一个配置文件可以确保整个项目的一致性以及配置与代码的分离。

这还允许您根据环境(例如开发与生产)轻松维护不同的配置,而无需更改任何源代码。

记录 101

在研究一个示例之前,需要解释日志模块中的三个关键概念:记录器、格式化器和处理程序。

记录器

用于生成日志的对象通过以下方式进行实例化:

import logginglogger = logging.getLogger(__name__)

“logger”对象创建并控制项目中的日志记录语句。

您可以随意命名记录器,但是最好为每个模块实例化一个新的记录器,并使用 name 作为记录器的名称(如上所示)。

这意味着记录器名称跟踪包/模块层次结构,这有助于开发人员快速找到日志在代码库中的生成位置。

格式化程序

格式化程序对象确定日志消息的顺序、结构和内容。

每次调用 logger 对象时,都会生成一条日志记录。一个 LogRecord 对象包含一个数量的属性,包括创建时间、创建模块和消息本身。

我们可以使用 Formatter 对象定义在最终的日志语句输出中包含哪些属性以及任何格式。

例如:

# formatter definition
‘%(asctime)s — %(name)s — %(levelname)s — %(message)s’# example log output
2022–09–25 14:10:55,922 — INFO — __main__ — Program Started
Handlers
Handlers are responsible for sending the logs to different destinations.

日志消息可以发送到多个位置。例如到标准输出(例如终端)和文件。

最常见的处理程序是 StreamHandler 和 FileHandler,前者将日志消息发送到终端,后者将消息发送到文件。

日志库还附带了一个数量的强大处理程序。例如,RotatingFileHandler 和 TimedFileHandler 将日志保存到文件中,并在文件达到某个大小或时间限制时自动轮换日志所在的文件。

如果需要,您还可以定义自己的自定义处理程序。

关键要点

  • 记录器是使用 logging.getLogger()实例化的
  • 使用“name”以模块名称自动命名您的记录器
  • 记录器需要“格式化程序”和“处理程序”来指定日志消息的格式和位置
  • 如果没有定义处理程序,您将看不到任何日志消息输出

为项目设置日志记录

💻这个示例项目的完整代码可以在这个 GitHub repo 中获得

常见 Python 项目结构

下面是数据科学项目的典型项目布局。我们将使用它作为设置日志记录的示例项目。

# common project layout├── data             <- directory for storing local data
├── config           <- directory for storing configs
├── logs             <- directory for storing logs
├── requirements.txt 
├── setup.py
└── src              <- project source code
  ├── main.py         <- main script
  ├── data_processing <- module for data processing
  │  ├── __init__.py
  │  └── processor.py
  └── model_training   <- module for model_training
  ├── __init__.py
  └── trainer.py

我们有一个包含应用程序源代码的“src”目录。以及用于与代码分开存储数据和配置的目录。

程序的主入口点在“src/main.py”文件中。主程序从“src/data_processing”和“src/model_training”模块调用代码,以便预处理数据和训练模型。我们将使用来自相关模块的日志消息来记录管道的进度。

您可以通过编写 Python 代码来定义记录器或使用配置文件来设置日志记录。

让我们通过一个例子来研究这两种方法。

基本日志设置

我们可以为项目设置一个日志记录器,简单地将日志消息打印到终端。这类似于 print 语句的工作方式,但是,我们将使用来自 LogRecord 属性的信息来丰富消息。

作者图片:在终端上记录输出

在我们的“src/main.py”文件的顶部,我们启动记录器并定义处理程序(StreamHandler)和消息格式。

我们只需要在主文件中这样做一次,设置就会在整个项目中传播。

在我们想要使用日志记录的每个模块中,我们只需要导入日志记录库,并在每个文件的顶部实例化 logger 对象。如‘src/data _ processing/processor . py’和‘src/model _ training/train . py’代码片段所示。

就是这样。

使用配置文件

我们可以使用配置文件来定义格式化程序和处理程序,而不是在 main.py 文件的顶部使用 Python 代码来定义它们。

对于大型项目,我的首选方法是使用配置文件,因为它有以下好处:

  • 您可以为开发和生产环境定义和使用不同的日志记录配置
  • 它将配置从代码中分离出来,使得在具有不同日志记录需求的地方重用源代码变得更加容易
  • 易于将多个记录器和格式化程序添加到项目中,而无需在源代码中添加太多的代码行

我们可以使用 logging.config.fileConfig 将 main.py 文件中的代码更改为从配置文件中加载。

在下面更新的代码中,我创建了一个函数(setup_logging ),它根据环境变量(例如 dev 或 prod)的值加载配置文件。这允许您在开发和生产中轻松使用不同的配置,而无需更改任何源代码。

在配置文件(logging.dev.ini)中,我们定义了两个记录器。一个将日志发送到终端,一个将日志发送到文件。

关于记录配置文件格式的更多信息可以在记录文档中找到

调试提示

最初在我的项目中设置日志记录时,我遇到了不少问题,在终端或文件输出中我看不到任何日志。

这里有一些建议。

确保您已经在配置中指定了所有的处理程序

如果在您的配置文件中有一个错误指定的处理程序,您可能在终端(或其他目的地)中看不到任何日志。不幸的是,日志库似乎无声无息地失败了,并且没有给出许多指示来说明为什么您的日志设置没有像预期的那样工作。

确保您设置了正确的“级别”设置

例如:logger.setLevel(日志记录。调试)。默认级别是日志记录。警告,这意味着只记录警告、错误和关键消息。如果您的日志消息使用 INFO 或 DEBUG,您需要显式设置级别,否则您的消息将不会显示。

不要混淆“日志”和“记录器”

承认这一点我很尴尬,但过去我花了很长时间试图找出为什么信息没有显示出来。原来我使用的是 logging.info()而不是 logger.info()。我想我会把它放在这里,以防不仅仅是我有错别字。值得一查。🤦‍♂️

结论

在这篇文章中,我们讨论了使用 Python 的日志库来帮助调试和审计应用程序的好处。

我强烈建议在您的项目中开始使用日志记录而不是“打印”语句,特别是对于在生产环境中使用的代码。

在理解了记录器、格式化器和处理程序的关键概念以及如何在不同的模块中启动记录器之后,设置日志就相对简单了。

可以使用 Python 代码配置日志记录,也可以从日志记录配置文件中加载日志记录。这篇文章的完整代码示例可以在 GitHub repo 中找到

This article was originally published on the [Engineering For DataScience](https://engineeringfordatascience.com/posts/python_logging/) blog

资源

你为什么没有通过 SQL 面试?

原文:https://towardsdatascience.com/why-are-you-failing-your-sql-interviews-3afe6c32ac2d

UnsplashNeONBRAND 拍摄的照片

避免这 5 个常见错误

随着数据素养越来越重要,我们将会看到越来越多的数据科学以外的职位的 SQL 面试。不幸的是,这些面试可能会令人生畏、棘手、艰难——尤其是如果你是第一次学习 SQL 的话。

根据我做数百次 SQL 访谈的经验,本文涵盖了我见过的 5 个最常见的错误。虽然有些似乎显而易见,但我已经采访了足够多来自不同背景的候选人,我认为每个人都值得单独讨论。我相信任何一个有扎实的 SQL 基础并且能够避免这 5 个错误的候选人都可以通过任何 SQL 面试。

什么是“SQL 面试”?

虽然“SQL 面试”可能有不同的定义,但一般来说,这是一个持续 30 分钟到 1 小时的面试,主要目的是编写 SQL 代码,从数据库中查询数据。像“上个月优步司机的平均星级为 4.70+的百分比是多少”“芝加哥哪 10 家商店的 Yelp 五星评级最高?”常见。

虽然我见过许多人轻松通过这些面试,但我也采访过许多在面试中苦苦挣扎的求职者。虽然小错误看起来微不足道,但它们可能最终成为候选人是否继续前进的决定性因素。

错误 1:没有时间意识

这是目前为止候选人遇到的最常见的错误。你可以把 SQL 面试想象成一次考试,有两个很大的区别。

在考试中,你通常会把所有的问题都列在前面。这意味着你可以在考试开始时花几分钟来了解你可能如何分配你的时间,这可能会影响你如何回答某些问题或跳过问题以获得尽可能好的分数。

在 SQL 面试中,区别在于:

  1. 只有面试官会知道问题,他们会一一揭晓
  2. 没有蹦蹦跳跳

这使得时间变得尤为重要——因为你真的不知道会有多少问题,定步调可能很困难。我面试过许多看起来有望通过面试的候选人,但最终失败了,因为他们无法通过整个面试。

虽然这个错误可能是最难解决的,但是一个可以帮助你节省宝贵时间的通用规则是认识到越简单的查询越好。更复杂的答案不仅需要更长的打字时间,而且面试官解释和评估的时间也更长。例如,如果我们想回答“芝加哥哪 10 家商店拥有最多的 Yelp 五星评级?”有两种方法可以做到这一点,两种方法都会得到相同的分数,尽管第二个答案要花 3 倍的时间来写。

更简单+更好:

SELECT 
store_id,
SUM(CASE WHEN rating = 5 then 1 else 0 end) n_5star 
FROM ratings_db
WHERE market = 'Chicago'
GROUP BY 1
ORDER BY 2 DESC
LIMIT 10

更复杂,可能会让面试官感到困惑:

WITH temp_table as (
SELECT 
rating_id,
store_id,
rating
FROM ratings_db
WHERE market = 'Chicago'
AND rating = 5
)temp2 as (
SELECT 
store_id,
count(*) n_5star,
DENSE_RANK() OVER(ORDER BY n_5star DESC) rk
FROM temp_table
)SELECT
store_id
FROM temp2
WHERE rk <= 10

错误 2:没有事先澄清问题

照片由 Neora AylonUnsplash 上拍摄

如果你对被问到的问题不是 100%清楚,你需要做的第一件事就是要求面试官澄清。面试官希望你成功,应该随时愿意帮助进一步澄清问题。

为了了解为什么这个错误会代价高昂——假设你不太确定问题是什么,但你还是开始回答了。你可能会在面试官理解之前花几分钟回答错误的问题,这意味着之后你可能不得不从头开始。

错误 3:不知道如何处理时间戳

卢卡斯·布拉塞克在 Unsplash 拍摄的照片

不同的公司使用不同的指标。但是,所有公司都用时间戳。因此,了解如何处理时间戳对你面试的任何公司都是相关的。

参加面试时,了解与时间戳相关的基础知识总是一个好主意:

  • 如何获取当前时间戳:这对于过滤类似于“最近 30 天”“昨天”的内容很有用。current_datecurrent_timestamp应该就是你所需要的。
  • 加减时间戳: timestampdiff是确定两个时间戳之间经过时间最清晰的方法。例如,timestampdiff(seconds, ts1, ts2).使用一个简单的减号可能有点含糊(结果是秒吗?分钟?毫秒?)
  • 比较时间戳:类似于数字,可以用<>来比较时间戳。如果时间戳更大,那么它就更近(即 2021 < 2022)
  • 提取组件: YYYY-MM-DD HH:MM:SS 2022-01-01 23:59:59是标准的时间戳格式。要知道,你也可以提取或截断时间戳来关注相关的时间单位(例如,对于一个小时,你可以做DATE_TRUNC(hour, ts)或使用HOUR(ts))

错误 4:使用错误的连接

几乎在每一次 SQL 访问中,都应该有一个问题,你需要连接两个或更多的数据集。几乎总是,你在决定使用LEFT JOIN还是INNER JOIN

有时,连接会给你相同的答案——然而也有一些时候面试官在寻找一种特定类型的连接来回答问题。如果我们再把 SQL 面试看作一次考试,使用错误的连接意味着你会被扣分——我已经在几次面试中看到这是决定性的因素。

在进行联接之前,您应该考虑内部联接是否会产生与左联接不同的结果。如果结果不同,那么确保你使用的是正确的。如果你不确定,你可以随时向面试官询问更多的上下文(例如,内连接会丢失数据,而左连接会保留更多的数据,我们对哪一个感兴趣?)

错误 5:语法和格式错误

最后,如果你是一个边缘候选人,你要避免可能让你脆弱的小错误。以下是一些我见过的求职者纠结的语法问题:

  • 运算符之间的顺序错误:而不是between 0 and 1,他们可能会键入between 1 and 0
  • 不缩进。我见过一些应聘者在一行字里输入他们的全部答案。这使得作为一名面试官很难评估代码,我将不得不花更多的时间来检查他们的代码。
  • 不用化名。特别是对于连接表的问题,如果你不为表取别名,你可能要花很多时间一遍又一遍地写表名:

不推荐:

SELECT
rides_database.ride_id,
driver_database.first_name,
driver_database.email
FROM rides_database 
JOIN driver_database
ON rides_database.driver_id = driver_database.driver_id

改为:

SELECT
r.ride_id,
d.first_name,
d.email
FROM rides_database r
JOIN driver_database d
ON r.driver_id = d.driver_id

总结想法

如果这篇文章能让你学到什么,那就是避免每一个错误都会增加你通过考试的机会。面试令人伤脑筋,我发现做好准备有助于缓解这种情况。希望我上面列出的五个错误是你在接下来的面试中能记住的!

你为什么不接受数据科学的采访?

原文:https://towardsdatascience.com/why-arent-you-getting-data-science-interviews-6c7a31c8970f

数据科学面试

获得面试的方法和当你感到困难时的提示

蜜桃红·坎普斯·菲利佩在 Unsplash 上的照片

很多关于获得数据科学工作的信息都集中在面试准备上,这非常重要!然而,许多人也发现自己对之前的阶段有疑问。你如何获得数据科学面试机会?

现在,如果你甚至还没有开始求职过程,我建议你在阅读这篇文章之前,从我的博客如何选择正确的数据科学职位开始。如果你已经知道你想要什么样的职位,这篇文章将会引导你经历一个模糊且有点可怕的过程,把这些申请变成面试。

具体来说,在这篇文章中,我将谈论获得面试的不同方法,以及如何有效地接近这些方法,以便你获得足够的面试机会,从而获得一份工作。我们将介绍三种不同的获得面试机会的方式以及如果你已经找了一段时间的工作却还没有得到面试机会该怎么办

如果你更喜欢看而不是读,你也可以去我的 YouTube 频道看这个博客的视频版

让我们深入了解如何获得面试机会!

目录

获得面试的不同方法

获得面试机会有三种基本方式:原始申请、接触看门人和获得推荐。此图从时间/精力和有效性方面比较了这三种方法。让我们从最低努力到最高努力来回顾所有这些。

图片由艾玛丁 |获得面试机会的三种方式

原始应用程序

原始申请只是意味着向职位空缺提交你的简历。要做到这一点,你需要从寻找工作机会开始。最常见的地方是典型的大型招聘网站,如 Linkedin 和 Indeed。但是在你去那些招聘网站之前,我建议你直接去你感兴趣的公司的网站。在那里你可以找到你正在寻找的特定角色,并且网站会有最准确和最新的招聘信息。

要做到这一点,你需要知道你想为哪些公司工作。为了更好地帮助这一点,我创建了两个知名科技公司的名单。一个列表是招聘分析驱动角色的公司,另一个列表是招聘算法驱动角色的公司。你可以通过链接下载 pdf 文件,然后点击该公司,进入他们的职业页面进行你自己的研究。如果你认为这些列表是有帮助的,请随意与你的朋友分享这个 pdf 文件或这个博客。

你可以做的另一件事就是花时间做一些个性化的事情,来增加你使用原始应用程序的机会。简单地向数百份工作发出相同的简历可能很有诱惑力,但要记住,其他人也是这么做的。

如果你想脱颖而出并获得面试机会,那么付出额外的努力是很重要的。对公司做一些调查,调整你的简历,使之最适合这个职位。这种努力显示了你对这份工作更高的兴趣,并且可以大大提高你的申请回复率。

正如你可能猜到的,原始申请是申请工作和获得面试的最常见方式,这意味着经常会有很多竞争。发出原始申请时,很难说你会和多少人竞争。这就是为什么你想把这和其他获得面试的方法结合起来。

联系看门人

获得面试的第二种方法是联系 看门人。看门人是你感兴趣的公司的技术招聘人员或雇员。

要通过这种方法获得面试,我推荐 4 个基本步骤:

  1. 列出你感兴趣的公司。
  2. 找到这些公司看门人的联系信息。
  3. 写一封电子邮件或 LinkedIn 信息,然后发出去。
  4. 定期跟进,直到你被拒绝。

这是通过门卫获得面试的基础。我不会深究如何联系看门人的细节,因为我有另一篇关于这个主题的博客文章,里面有被证明有效的电子邮件模板。

参考

获得面试的最后一种方法实际上是最有效的,那就是通过推荐。因为这是进入面试阶段最有效的方法,所以我想更详细地谈谈如何寻求和利用推荐。

照片由克里斯蒂娜@ wocintechchat.comUnsplash 上拍摄

关于推荐,首先要知道的是实际上向谁寻求推荐。推荐是获得面试的最有效方法,但这并不意味着你应该开始在 LinkedIn 上随机询问一些人。如果你只是让陌生人给你介绍他们的公司,你可能根本得不到回复。

相反,推荐人应该来自既了解你又熟悉你的工作的人。这就是人际关系网如此重要的原因。如果你想从一个你不太了解的人那里寻求推荐,花点时间努力一下。给他们买咖啡,做一次信息采访,了解他们。本质上,建立关系应该是寻求推荐的第一步。这是最需要时间和精力的方法,但也是获得面试机会最有效的方法。

了解转介流程

假设你有愿意推荐你的人。你现在做什么?你的目标应该是让推荐你的人尽可能顺利地完成推荐过程。所以,首先,不要问他们公司有没有空缺。相反,你应该自己做调查,并把你感兴趣的确切职位信息发给推荐你的人。

现在怎么办?你是通过普通的求职网站申请工作还是怎样?推荐相对简单,但如果你不知道他们是如何工作的,他们可能会令人困惑。在大多数公司中,推荐人将使用内部职位公告板提交推荐。作为推荐人,你需要做的就是提供你的简历和你想申请的职位。

在许多情况下,你不应该通过正常途径申请工作,因为一旦你申请了,推荐就无效了。但是,也有一些公司会要求你同时自己申请。所以,最好的办法是在申请之前和推荐你的人澄清说明。

因此,推荐的基础是找到你想要申请的确切职位,然后将你的信息交给推荐人,这样他们就可以将你的申请作为推荐人提交。大多数情况下,你不必通过其他方式额外申请,你也不应该这样做,因为这会影响推荐过程。不过,请咨询推荐你的人来澄清这一点。

现在,如果你有一个朋友在谷歌这样的大公司工作,有多个职位空缺,你可能想知道你是否可以利用他们的推荐同时申请多个职位。

答案是视情况而定。有些公司会允许你一次申请多个职位,而有些公司不会。你需要向同意推荐你的人澄清。如果你可以一次申请多个职位,这是值得的,因为这将增加你获得面试的机会。

一份好简历的重要性

这就是获得面试的三种基本方式。你应该把这三者结合起来,给自己最大的机会去面试至少几家公司。值得一提的是简历的重要性,正如你所知,你需要一份好的简历来让任何方法为你所用。

在发送我们的申请、联系看门人或请求推荐之前,花时间仔细检查你的简历以使它尽可能的好是值得的。你的简历展示了你申请的职位所需要的技能吗?你在微调你的简历以最适合每个职位吗?

如果你不确定如何自己仔细检查你的简历,我有一份免费简历清单供你使用。

如果我得不到面试机会呢?

此时,很难不停下来问自己,“如果我做了所有这些,但还是没有得到面试机会,那该怎么办?”。

找工作时很容易灰心丧气。你可能已经找了一段时间的工作,但仍然没有得到面试机会。你是做什么的?如果你没有成功,你能做些什么来增加你的机会?

无论你是在找实习还是全职工作,最重要的是要记住保持势头!获得面试机会需要时间和大量的申请。如果你让自己变得气馁,放慢申请的速度,那么你只会减少获得面试的机会。往前压,一直走。

我说继续下去的原因是因为它确实比你预期的要花更长的时间来得到你的求职结果。招聘人员审查简历并回复你需要时间。不要期望马上从许多公司得到回复,在等待回复的时候,你能做的最好的事情就是继续找工作。

诊断您的问题

现在,如果你已经给了它时间,你的简历是最好的,你仍然没有得到面试,是时候开始认真考虑你的问题是什么了。为了找到能让你获得面试的解决方案,你需要正确地诊断你的问题。

我首先会考虑的是你发了多少份申请。长时间找工作会让你觉得自己一事无成,但如果你没有发出足够多的申请,你找工作的时间就没那么重要了。一般来说,我会说,如果你申请了不到 500 份工作,接触了 10 个看门人,并要求不到 10 个推荐人,那么你需要做的第一件事就是发出更多。

如果你发出了至少 500 份申请,等了 2 到 3 个月,得到的面试机会少于 5 次,那么你可能需要考虑你的目标职位。如此低的申请面试转换率可能表明就业市场认为你的背景与你所寻找的职位不匹配。

要解决这个问题,有两个选择。第一,你可以切换目标位置。如果就业市场似乎认为你不适合一个角色,那么你可能需要尝试另一个。如果你犹豫要不要这么做,你也可以尝试申请小公司和初创公司的工作。竞争没有那么激烈,你可能会有更好的机会获得面试机会。

很难放弃你想要的工作类型和你想要为之工作的公司类型,但有时你确实不得不考虑工作需求。如果你正在寻找的东西不起作用,你可能需要改变你正在寻找的东西。

招聘季节

我们关于面试的讨论差不多结束了,但是我还有一件事想提一下——招聘季节。

照片由 Tim GouwUnsplash 上拍摄

在和学生打交道时,我发现有些人太在意进入公司的招聘季节。他们担心,如果他们在一年中的某个时间没有准备好,或者在某个时间没有申请,将不会有任何空缺。这些类型的担忧会让一个人发疯,让找工作的过程变得更有压力。

在找工作和考虑招聘季节时,你必须承认两个简单的事实。第一,这不是你能控制的。你无法控制公司何时决定招聘。不同的因素可能会影响公司的招聘决定,如整体经济、行业趋势和公司的财务状况等。所以不同的公司有不同的时间表。

第二,许多公司一年到头都在招人,尤其是初创公司和成长中的中型公司。可能有一段时间,一家公司的空缺职位比其他时间多,但许多公司全年都有一些职位可供选择。这两件事的底线是,在大多数情况下,对招聘季节感到紧张无助于你找到工作。

话虽如此,我不能说招聘季是一个神话。当公司得到新的预算时,招聘季节就会到来。具体时间因公司而异,但常见的情况是年初的人数多于年末的人数。

这意味着在 1 月、2 月和 3 月,许多公司已经计算出人数,并开始张贴空缺职位和雇用新员工,这可以使年初成为找工作的好时机。

对于学生和新毕业生来说,这也是一个美好的时刻,因为实习生和大学毕业生项目正在开放。你经常可以找到专为大学生和大多数大公司毕业生设计的求职页面。

例如,亚马逊有一个学生项目,通过 MetaGoogle ,你可以设置一个过滤器来选择专门针对新毕业生和实习生的角色。对于较小的上市公司,如 Lyft 和优步,你可以找到专为那些希望开始职业生涯或寻找实习机会的人设计的页面。

结论

本帖到此为止!记住,有三种方法可以获得面试机会:

  • 原始应用程序
  • 联系看门人
  • 利用推荐

推荐是最有效的,但是当你继续找工作的时候,你会想要使用这三种方法。记得保持势头,在你的简历和推荐上付出额外的努力!

一旦你真的获得了面试机会,接下来要担心的就是如何在面试中表现出色。我随后写了两篇博客关注这部分过程:一篇是关于准备面试时你需要知道什么,另一篇是关于让你的准备更有效的学习技巧。我强烈建议去看看。

感谢阅读!

如果你喜欢这个帖子,想支持我…

为什么争论度量标准是浪费时间

原文:https://towardsdatascience.com/why-arguing-about-metrics-is-a-waste-of-time-b1c6f9026724

数据科学自封的语言警察

西格蒙德·弗洛伊德和其他精神分析学家,1922 年。来源:维基百科

当心理学还处于婴儿期时,我想可能会有不少这种风格的学术通信:

心理学家 1:亲爱的先生!你所谓的“记忆”实际上并不是记忆!取而代之的是内存…”

心理学家 2: “尊敬的先生!我向你保证,我的定义是记忆,而你的不是记忆…”

想象一下他们像争吵的孩子一样,来回争吵却毫无进展。那段时间我不在(你也不在),但我有一个清晰的印象,这门学科的历史引发了足够多的职业尴尬,以至于所有心理学研究生——包括我自己——从第一天起就被灌输操作化的实践,直到我们忍不住在睡梦中大喊“操作化”。

Diana Polekhina 在 Unsplash 上拍摄的照片

如果你以前没有听说过 操作化 这个术语,我在这里为你写了一本入门书。长话短说,这是严格调查模糊概念的可测量代理的创建。

操作化是为严格调查模糊概念创造可测量的代理。

为了走出黑暗时代,并声称自己是一门真正的科学,心理学必须在这一领域发展出坚实的最佳实践,从一个非常重要的实践开始:一个共同的理解,即度量标准不是通用的,它们只是有用的代理。

你和我被允许使用同一个词来表示不同的东西,只要我们在开始时定义我们的术语,就像当我们在解决不同的问题时,我被允许让 X=5,你被允许让 X=10。因此,今天的学术话语采取了更加文明的语调:

现代心理学家: “亲爱的同事!你对记忆的操作化和我对记忆的操作化是不同的。因此,我不能在我自己的研究中使用你的发现,但我仍然认为你很棒,我祝你在那里做的一切顺利。祝你生活愉快!”

好多了,你同意吗?谁不喜欢操作化的文明影响呢?

卢卡斯·布拉塞克在 Unsplash 上的照片

不幸的是,数据科学的年轻学科,以及许多科技行业,似乎跳过了关于操作化的整个章节。每当我听到一些咄咄逼人的新手唱着一个版本的“亲爱的先生!你所谓的用户快乐并不是用户快乐!!!"以一种最好归入上一个千年的风格(或者至少归入互联网论坛的坏部分)。

对其他人如何定义他们的术语感到愤怒(我看到你,我的小但忠诚的读者群,他们喜欢讨厌我互换使用 AI 和 ML)不仅是无益的,而且通过试图将所有潜在的含义塞进同一个盒子,它减少了人类创造力的范围。要么这个盒子变得太大而无用,要么它一直很小,但除了最初争论的少数赢家之外,对所有人都没用。为了保持小规模,语言警察必须忙于对任何敢于改变他们神圣术语的人进行恶毒的攻击。

你希望人们怎么做,把他们的度量用户命名为 UserHappiness1092412?或者,每当他们想要表达什么的时候,使用一个完整的连字符段落?

我更喜欢自己生活,也让别人生活。毕竟,只要不误导,速记和随意的语言是有用的。作者可以尽自己的一份力量,定义我们的意思什么时候重要,什么时候不重要,什么时候不重要。

是一个人工智能!Eduardo Velazco Guart 在 Unsplash 上拍摄的照片

坦率地说,如果我在下一篇博文的顶部写道,“为了讨论的目的,定义人工智能是指飞机”,然后我写道在人工智能中飞行,我会说我是清白的。收起你的尖牙,纯粹主义者,当你意识到你每次写代码或解方程都在做同样的事情时,你会觉得很傻。

你第一次学习操作化是在你童年的数学课上。

你第一次遇到操作化是在你童年的数学课上,在那里你学到了你可以使用 X 作为你喜欢的任何东西的占位符。你只需在这一页的顶部写下,“让 X 成为……”

照片由米克·豪普特Unsplash 拍摄

心理学家和其他社会科学家被训练去理解抽象概念也是如此,但我希望这种训练成为常态。要是每个人的老师都强调说,不先去查确切的定义就过多地解读抽象词汇是很危险的就好了…

在你查看度量标准是如何定义的之前,养成不要把科学发现看得太重的习惯。

如果你想用“用户幸福度”这个术语来简写“用户在这个调查问题上点击至少 4 颗星(满分 5 颗星)的倾向”,那么你可以这么做。在我将你的任何发现移植到我自己的应用程序之前,我有责任确保查阅你的定义。如果我选择给你建议,我会根据你的目标,而不是我的用词品味。

我敢打赌,围绕操作化的更好的心理习惯可以挽救相当多的婚姻。哇,想象一下,如果人们真的定义他们的话,而不是提高音量。桑迪·米勒在 Unsplash 上拍摄的照片

但是,即使我不喜欢你的衡量标准,我们也没有必要争论某样东西是不是用户快乐,就像没有一个理智的人会争论我选择标记为 X 的数量是否与你八年级笔记本上的 X 相同一样。

如果我们学会记住 X 只是一个占位符,那么我们的争论就会少得多,“幸福”这个词和它所有模糊的朋友也是如此。

照片由 Cytonn 摄影Unsplash 上拍摄

感谢阅读!YouTube 课程怎么样?

如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:

在这里欣赏整个课程播放列表:bit.ly/machinefriend

喜欢作者?与凯西·科兹尔科夫联系

让我们做朋友吧!你可以在 TwitterYouTubeSubstackLinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格取得联系。

为什么将数组作为通用数据模型

原文:https://towardsdatascience.com/why-arrays-as-a-universal-data-model-808d140e59f

走向数据管理的乐土

所有图片由作者提供

对于任何致力于数据问题的人来说,这都是激动人心的时刻,因为数据行业一如既往地火热和炒作。众多的数据库、数据仓库、数据湖、湖屋、特征存储、元数据存储、文件管理器等。在过去的几年里一直在冲击市场。我的整个职业生涯都在从事数据管理,但与市场趋势背道而驰的是,我们一直在为每一种不同的数据类型和应用程序创建新的数据系统,这让我感到非常困惑。2014 年至 2017 年,我在英特尔实验室和麻省理工学院担任数据库研究员期间,我问了自己一个简单的问题:我们可以建立一个单一的数据库来存储、管理和处理所有数据,包括表格、图像、视频、基因组学、激光雷达、要素、元数据、平面文件和未来可能出现的任何其他数据类型,而不是每次我们的数据需求发生变化时都建立一个新的数据系统。

这个问题源于一个简单的观察,即所有数据库系统(及其变体)都有显著的相似性,包括将数据放置在选择的存储介质上,以及根据特定的查询工作负载提取数据进行处理。因此,为了回答上面的问题,我不得不问一个稍微不同的问题:有没有一个数据模型可以高效地捕获所有应用程序的所有数据?因为如果这样一个通用数据模型存在,它可以作为构建一个通用数据库的基础,该数据库具有所有数据库通用的所有子系统(查询规划器、执行器、认证器、事务管理器、API 等。).在这篇博文中,我认为这样的模型确实存在,而且它是基于多维数组

在阐述为什么数组是通用的之前,我需要回答另一个问题:为什么您应该关心通用数据模型和通用数据库?以下是一些重要的原因:

  • 数据多样化。您可能认为传统的数据仓库(或数据湖,或 lakehouse)可以处理所有的表格数据,但实际上,组织拥有大量其他非常有价值的数据,如图像、视频、音频、基因组、点云、平面文件等等。他们希望对这些数据集合执行各种操作,从分析到数据科学和机器学习。
  • 供应商优化。为了能够管理其多样化的数据,组织求助于购买大量不同的数据系统,例如数据仓库、ML 平台、元数据存储和文件管理器。那要花费金钱和时间;金钱是因为一些供应商有重叠的功能,您需要为此支付两次费用(例如,身份验证、访问控制等),时间是因为团队必须学习操作许多不同的系统,并在需要通过组合不同的数据源来获得洞察力时争论数据。
  • 整体治理。即使组织对众多的供应商感到满意,每个不同的数据系统都有自己的访问控制和日志记录功能。因此,如果组织需要对其所有数据实施集中治理,则需要在内部构建。那要花费更多的钱和时间。

即使我已经成功地让你相信了通用数据库的重要性,我还需要做最后一个重要的评论。如果通用数据库不能为其服务的所有数据类型提供出色的性能,那么它就是不可用的。换句话说,通用数据库必须和专用数据库一样高效,否则会有很多人对采用它持怀疑态度。这就是通用数据库的困难所在,也是为什么今天没有人建立这样一个系统(嗯,几乎没有人)。

在这篇博文中,我展示了多维数组是正确的选择,不仅因为它们的通用性,还因为它们的性能。在完全公开的情况下,我是 TileDB 的创始人兼首席执行官,这是一家以多维数组为一等公民构建通用数据库的公司。我将介绍我们在 TileDB 设计阵列数据模型时做出的许多关键决策、高效的磁盘格式以及支持它的强大存储引擎。我的目标是强调通用数组原则,希望本文可以作为从专门构建的数据系统转向开发更通用的数据库的一小步。

深呼吸,我们即将进行一次技术性跳水!

如果你符合以下条件,这篇博文的其余部分就属于你了:

  • 您使用单一数据类型(表格、基因组学、激光雷达、图像等),并可能使用特殊用途的数据系统,但您希望深入了解多维数组如何为您的用例提供优雅且性能更高的解决方案。
  • 您使用现代本机工具处理来自许多来源的各种数据,并希望了解通过通用格式、引擎和接口使多维数组能够适应任何数据集或工作负载的技术设计选择。
  • 对您来说,了解您要使用和比较的工具的基础是很重要的,并且需要确定它们是精心设计的,以满足您现在和将来的需求。

数组数据模型

我们在 TileDB 遵循的基本阵列模型如下所示。我们对密集稀疏数组进行了重要的区分。密集阵列可以具有任意数量的维度。每个维度都必须有一个包含整数值的域,并且所有维度都具有相同的数据类型。数组元素由一组唯一的维度坐标定义,称为单元。在密集数组中,所有单元格都必须存储一个值。一个逻辑单元可以存储多个不同类型的值(可以是整数、浮点数、字符串等)。属性定义所有单元格中具有相同类型的值的集合。密集数组可能与一组任意的键值对相关联,称为数组元数据。

数组数据模型

稀疏阵列与密集阵列非常相似,但它有三个重要的区别:

  1. 稀疏数组中的单元可以是空的。
  2. 维度可以具有异构类型,包括浮点和字符串(即,域可以是“无限的”)。
  3. 允许单元多重性(即,具有相同维度坐标的单元)。

关于是使用密集数组还是稀疏数组对数据建模的决定取决于应用程序,它会极大地影响性能。此外,在选择将数据字段建模为维度或属性时,应该格外小心。这些决策将在下面的性能部分详细介绍,但现在,您应该知道:阵列系统针对在维度坐标 上快速执行范围条件 进行了优化。数组也可以支持属性上的有效条件,但是通过设计最优化的选择性能将来自维度上的查询,原因很快就会清楚。**

维度上的范围条件通常称为“切片”,结果构成“切片”或“子数组”。下图显示了一些例子。在 numpy 表示法中,A[0:2, 1:3]是一个切片,由第一维上的坐标为 0 和 1 的单元格的值以及第二维上的坐标为 1 和 2 的单元格的值组成(假设只有一个属性)。或者,这可以用 SQL 写成SELECT attr FROM A WHERE d1>=0 AND d1<=1 AND d2>=1 AND d2<=2,其中attr是一个属性,d1d2是数组A的两个维度。还要注意,切片可能在每个维度上包含多个范围(多范围切片/子数组)。

切片数组数据

上述模型可以扩展到包括“维度标签”。这个扩展可以应用于密集和稀疏数组,但是标签在密集数组中特别有用。简而言之,维度可以接受将任意数据类型的值映射到整数维度坐标的标签向量。下面展示了一个例子。这在数据非常密集(即没有太多的空单元)但维字段不是整数或在整数域中不连续出现的应用程序中非常有用。在这种情况下,通过首先有效地查找标签向量中的整数坐标,然后如上所述应用切片,来执行多维切片。为什么这可能比简单地用稀疏数组建模数据更好的原因将在下面的性能部分变得清楚。

标注维度的密集数组

多维数组捕获的用例

多维数组已经存在很长时间了。但是,对于数组有两种误解:

  1. 阵列仅用于科学应用。这主要得益于它们在 Python、Matlab、R、机器学习等科学应用中的大量使用。数组捕捉科学用例绝对没有错。相反,这样的应用程序很重要,也很有挑战性,没有关系数据库可以高效地容纳它们(原因很快就会清楚)。
  2. 阵列只有密集。在 TileDB 之前构建的大多数阵列系统(即存储引擎或数据库)只关注密集阵列。尽管密集阵列适用于广泛的用例,但对于稀疏问题,如基因组学、激光雷达和表格,密集阵列是不够的。稀疏阵列已被忽略,因此,没有阵列系统能够声称普遍性。

对于支持密集和稀疏阵列的系统来说,天空是适用性的极限。图像是 2D 密集阵列,其中每个单元是可以存储 RGBA 颜色值的像素。类似地,视频是 3D 密集阵列,二维用于帧图像,第三维用于时间。激光雷达是具有浮点坐标的 3D 稀疏阵列。基因组变体可以通过 3D 阵列来建模,其中维度是样本名称(字符串)、染色体(字符串)和位置(整数)。时间序列分笔成交点数据可以用 2D 数组来建模,用时间和分笔成交点符号作为标注维度(这当然可以任意扩展到密集或稀疏数组)。类似地,天气数据可以用具有浮点标签(纬度/经度实际坐标)的 2D 密集阵列来建模。图可以被建模为(稀疏 2D)邻接矩阵。最后,平面文件可以存储为简单的 1D 密集数组,其中每个单元格存储一个字节。

数组可以模拟各种各样的应用程序

但是表格数据呢?数组在这里有很大的灵活性。在最复杂的场景中,我们可以将一个表存储为一组 1D 数组,每列一个(对于熟悉它的人来说,类似于 Parquet )。如果我们想一次对一系列行进行切片,这是很有用的。或者,我们可以将一个表存储为一个稀疏数组,使用列的子集作为维度。这将允许对维度列进行快速切片。最后,我们可以使用上面针对时间序列分笔成交点数据所解释的带标签的密集数组。

数组包含表

您可能想知道我们如何为每个应用程序做出所有这些关于维度与属性以及密集与稀疏的决定。要回答这个问题,我们需要了解密集和稀疏阵列如何在存储介质上布置数据,以及切片时哪些因素会影响性能,这是下一节的重点。

为什么阵列有利于数据管理

在基于上述阵列模型构建的系统中,提高性能的第一步是确定磁盘格式。这将决定 IO 成本,对于许多查询工作负载来说,IO 成本通常是主要因素。我将首先解释我们在 TileDB Embedded 中采取的一些架构决策,以构建高效的数组格式。然后我将解释这种格式如何产生高效的切片操作,并总结所有的性能因素。

磁盘格式

让我们从如何存储维度坐标和属性值开始。为了有效地支持云对象存储和版本化写入,我们选择了多文件格式,其中每个维度或属性的值都存储在单独的文件中。密集数组不会具体化维度坐标,而稀疏数组必须。下图显示了密集和稀疏阵列示例。请注意,所有维度和属性中的每个单元格值都出现在对应文件中的相同绝对位置。此外,在可变长度属性或维度中,需要一个单独的文件来存储每个值在值文件中的起始位置的字节偏移量。

维度和属性磁盘布局

这种将相同类型的值分组在一起的布局非常适合在查询期间对属性/维度进行压缩、矢量化和子集化(类似于其他列式数据库)。因为典型的查询会对这些值的子集进行切片,所以我们不会将整个文件压缩为单个 blob。相反,我们平铺(即分块)成更小的块。因此,我们需要一种机制来创建细胞群。如上图所示,每个图块中的单元格在相应的文件中将显示为连续的。切片是 IO 和压缩的原子单位,(以及其他潜在的过滤器,如加密、校验和等。).

出现了一个问题:我们如何在一维文件中对多维空间的值进行排序。该顺序将决定每个单元在其相应图块中的位置,以及图块在文件中的位置。我们称这个顺序为阵列中单元的全局顺序。我将分别解释密集和稀疏数组的全局顺序和平铺。

在密集阵列中,全局顺序和平铺由 3 个参数决定:

  1. 每个维度的空间切片范围。
  2. 每个图块内的单元格顺序
  3. 平铺顺序

下图描述了我们改变上述参数时的三种不同订单。请注意,每个分块的形状和大小仅由空间分块范围决定。

密集阵列的全局顺序示例

稀疏数组的情况略有不同,因为仅基于空间切片进行切片可能会导致每个切片中非空单元的数量严重失衡,从而进一步影响可压缩性和切片性能。在稀疏阵列中,全局顺序可以确定如下:

  1. 通过指定与密集情况下相同的三个参数,或者
  2. 通过使用希尔伯特空间填充曲线

一旦确定了全局顺序,就通过一个额外的参数来指定平铺,该参数称为平铺容量,即每个平铺中非空单元的数量。下图描述了稀疏阵列的所有上述参数的不同选择的不同全局顺序(非空单元用深蓝色表示)。

稀疏阵列的全局顺序示例

为什么全局顺序和平铺如此重要?对于大多数典型的切片形状,全局顺序应该尽可能地保留查询结果的同位置性。记住,数组是多维的,而存储数组数据的文件是一维的。您只有一次机会(除非您想为冗余付费)按照一个 1D 顺序对数据进行排序。这个顺序绝对决定了多维查询的性能。原因是您的结果在文件中出现得越近,IO 操作检索它们的速度就越快。此外,图块的大小也会影响性能,因为完整的图块将从存储中提取到内存中。下面的例子展示了给定切片的一些好的和坏的全局顺序和分块,集中在密集阵列上(对于稀疏的情况可以进行类似的论证)。

全局顺序对结果磁盘局部性的影响

你会说,“我需要知道我的切片的形状,以便选择全局顺序”。在我们开发的许多应用程序中,典型的查询模式确实是已知的。如果不是这样,数组仍然给你机会定义一个顺序,为你的大多数查询模式带来可接受的性能。这里最重要的一点是,阵列为您提供了简单灵活的方法来操作数据在磁盘上的表示,以便为所有类型的数据和应用程序实现理想的性能。这就是数组通用的原因!

索引和访问数组数据

既然我们已经弄清楚了磁盘上的格式,那么我们如何有效地对数组进行切片,以及我们可以选择构建什么索引来方便查询呢?首先,我们关注高密度阵列,并使用下图中的示例。除了切片查询,我们还知道以下内容:维数、全局顺序、平铺以及数组中没有空单元的事实。这些信息统称为数组模式。仅使用数组模式和简单的算法,我们可以计算组成查询结果的单元块(即磁盘上的连续单元集)的数量、大小和位置,而无需任何额外的索引。因此,我们可以设计一个高效的多线程算法,它可以从磁盘中提取相关的图块,解压缩并将单元板复制到结果缓冲区中,所有操作都是并行的。如果适当地开发算法,并且明智地选择全局顺序和平铺,切片密集阵列确实是快速的!

索引隐含在密集数组中

稀疏数组中的切片更加困难,因为在数组被写入之前,我们不知道空单元的位置。因此,与密集数组不同,我们需要显式存储非空单元格的坐标,并在它们之上构建一个索引。索引必须很小,以便在提交查询时可以快速加载到主存中。在 TileDB 中,我们使用 R 树作为索引,但也存在其他多维索引。R 树将非空单元的坐标分组到最小包围矩形(MBR)中,每个瓦片一个,然后递归地将这些 MBR 分组到树结构中。下图显示了一个示例。然后,切片算法遍历 R 树,找出哪些图块 MBR 与查询重叠,从存储中并行获取这些图块,并对它们进行解压缩。然后对于每个部分重叠的瓦片,算法需要进一步逐个检查坐标,以确定它们是否落在查询切片内。这个简单的算法,如果高效开发(使用多线程和向量化),可以产生极其高效的多维切片。

用于索引稀疏数组的 r 树

绩效总结

我已经提到了数组格式的某些方面对性能的影响,但下面我对它们进行了总结:

  1. 维度与属性。如果大多数查询工作负载在一个数据字段上有一个范围条件(即切片),则该字段应该被建模为一个维度。否则,它应该被建模为一个属性。
  2. 维数。随着维度数量的增加,你会经历收益递减。您应该选择最多 4-5 个维度,这些维度对于您的查询来说是高度选择性的(即,具有高修剪能力)。这个数字是经验值,因应用而异。
  3. 全球秩序。全局顺序决定了单元相对于查询的位置,并且可以极大地影响整体成本。
  4. 平铺尺寸。如果查询片太小而切片太大,则会从存储中提取大量冗余数据,并对其进行解压缩和处理,因此性能会下降。相反,如果切片太大而切片太小,则处理大量切片会产生额外的开销。
  5. 密集 vs 稀疏。如果数组中的所有单元格都必须有一个值,那么这个数组应该是密集的。如果绝大多数单元是空的,那么阵列应该是稀疏的。如果数组相当密集,但是维度坐标从非整数域中取值或者是非连续的整数,那么数组应该是密集的,并且标注维度。

最后,应该清楚的是,数组可以有效地对表格数据建模,但反之亦然,这将进一步证明为什么关系数据库(或 Parquet 之类的表格格式)从未在科学领域取得成功。以一个简单的 2x2 密集阵列[[1, 2], [3, 4]]为例。回想一下,密集数组并不具体化单元的坐标,而是从数组模式中推断结果位于何处(即,维度、全局顺序和平铺)。在数组引擎中,数组值将在文件中序列化为1, 2, 3, 4(假设没有平铺范围和以行为主的单元格顺序),数组将能够在单元格(1, 0)中定位值,即第二行第一列,很容易定位为 3。然而,在表格格式中没有维度的概念。如果表格格式将一列中的数组值存储为1, 2, 3, 4,那么对于本例来说,它不会拥有前两个值对应于第一行,后两个值对应于第二行的必要信息。因此,没有办法定位单元格(1, 0)的值,除非我们创建两个额外的列来显式存储每个值的坐标并扫描该表,这将导致大量不必要的开销。如果你觉得这个例子很简单,试着想象一下在多维、平铺和不同的平铺和单元顺序的情况下会变得多么复杂。

构建存储引擎,而不是格式

到目前为止,我们已经设计了一个很好的数据模型和一个相关的磁盘格式,这可以带来出色的性能,但是我们将从这里走向何方呢?在回答这个问题之前,我将指出我们在其他阵列系统中观察到的一些缺陷:

  • 关注密集阵列。我们所知的另外三个出色的阵列系统 SciDB、HDF5 和 Zarr,只专注于高密度阵列。如上所述,密集阵列有广泛的应用,但无法支持稀疏数据的用例,如激光雷达、基因组学、表格等。
  • 专为单一语言打造。例如,Zarr 是用 Python 编写的,因此不能在其他语言中使用。这限制了它的可用性。其他的 Zarr 实现正在出现,但是达到对等的工程成本非常高。
  • 专为有限后端打造。例如,HDF5 是围绕单文件格式的理念构建的。对于 HPC 环境和 Lustre 这样的分布式文件系统来说,这是一个很好的选择,但是对于所有文件/对象都是不可变的云对象存储来说,这是不可行的。此外,对象存储对延迟提出了其他限制,需要在高效 IO 的读取算法中加以考虑。
  • 关注格式规范。定义和公开数组格式规范没有错。格式规范的最大问题是实现负担留给了更高级别的应用程序(例如,MariaDB 之类的 SQL 引擎,或者 Spark 之类的计算框架)。这反过来提出了两个问题:(1)围绕构建将解析和处理格式的存储层有大量的重复劳动,以及(2)不同的社区需要就发展格式规范达成一致,因为改变它将导致所有使用它的应用程序崩溃。

我认为数据模型和格式规范是不够的。我们需要专注于构建强大的存储引擎,以支持和发展阵列数据模型和格式,并遵循以下设计原则(我们在 TileDB Embedded 中遵循了这些原则):

  • 支持密集和稀疏阵列,这样我们就可以实现通用性。
  • 内置 C++以提高性能,但包装在众多 APIs、C++、C#、Python、R、Java、Go、Javascript)中以获得更广泛的采用。这些 API 还可以促进与 SQL 引擎、计算框架、机器学习库和其他特定领域工具的集成。
  • 针对所有后端(基于 POSIX、HDFS、S3、GCS、Azure Blob 存储、MinIO,甚至 RAM)进行优化,在存储引擎中抽象 IO 层并使其可扩展。
  • 关注存储引擎,而不是格式规范。更高级别的应用程序应该与存储引擎集成并使用其 API。他们应该完全忘记底层的格式规范。这将允许存储引擎快速发展和改进格式,而不会破坏更高级别的应用程序。

以上只是存储引擎应该具备的“基本”功能。为了建立通用数据库的基础,需要一些更高级的特性:

  • 版本控制和时间旅行,这对任何数据库系统都是至关重要的。
  • 计算下推,如属性条件和更复杂的查询,如分组聚合。这可以消除不必要的数据复制和移动。

主要的收获是,如果有正确的存储引擎支持,多维数组会非常强大。构建一个精心设计的阵列引擎是一项艰巨的任务。幸运的是,现在已经有了这样一个引擎,叫做 TileDB Embedded ,它在麻省理工学院的许可下是开源的。我希望它的设计原则将推动新的阵列引擎的出现。

结论

在这篇博文中,我说明了多维数组是一个强大的数据模型,可以作为一个通用数据库的基础,该数据库可以捕获所有数据类型和应用程序。我解释了普遍性的好处,并展示了数组数据模型。然后,我描述了一种高效的磁盘阵列格式,并通过深入的技术探讨阐述了为什么它可以带来出色的性能。最后,我认为,如果不构建一个强大的存储引擎来支持和改进阵列模型和磁盘格式,它们是不够的。

我一直期待着社区的反馈。你可以在 TileDB Slack workspace论坛找到我和我的团队,或者你也可以直接联系我们。对于进一步的阅读,我建议使用 TileDB 文档和以下博客/网络研讨会:

非常感谢整个 TileDB 团队 让这一切成为可能!

为什么我们不能用 NoSQL 呢?

原文:https://towardsdatascience.com/why-cant-we-just-use-nosql-40b754ca3005

肖恩·朗斯在 Unsplash 上拍摄的照片

软件工程师和数据工程师如何看待数据

答大约一年前,我写下了我对数据工程师和数据科学家处理数据的关键区别的想法。我假设数据工程师的思维过程是确定性的,因为他们与确定性系统一起工作。相比之下,数据科学家的思维过程是概率性的,因为他们与概率系统打交道。在我看来,思维的差异是显而易见的,也是可以理解的。

当我想到数据工程师和应用程序开发人员时,非确定性问题就消失了。两组都在处理确定性系统。尽管如此,有时他们的理解似乎有很大的差距。在这里,差异不是源于思维模式,而是源于两个群体的不同侧重点。

几个月前,我参加了一个数据建模会议,会上我的一位出色的同事向我们介绍了医疗领域中不同的数据模型。数据模型非常复杂,有许多多对多关系、深层层次结构和复杂的相互依赖关系。有人说,为什么我们一定要对数据建模?为什么我们不把它储存在 NoSQL 的数据库里?当人们提到 NoSQL 时,他们通常指的是面向文档的数据库。

在本文中,我将深入研究开发人员和数据人员的不同优先级如何导致我提到的数据建模会议期间提出的问题。

开发者如何思考

应用程序开发人员的工作(前端、后端、全栈等。)就是按照产品负责人的要求去做。这并不是说开发者没有产品的所有权。当开发人员构建这个产品时(想想一个移动应用程序或 SaaS 产品),他们关心的是构建一个能给最终用户最好体验的系统,确保应用程序优雅可靠地运行。因为开发人员的目标是确保最终用户的最佳体验,所以他们更关心能够实现这一点的系统。他们的顾客是最终用户。

选择一个数据库、一个键值存储或者一个缓存对于构建一个优秀的产品来说是非常关键的。除非产品需要将数据分析和见解输入到最终用户仪表盘或电子邮件中,否则他们不会关心数据工程师。这不一定是坏事。这可能意味着您已经将关键系统(应用程序)与非关键系统(分析和业务洞察)分离。最终用户立即受到影响的任何事情都是至关重要的。

如果改善最终用户体验需要您使用图形数据库或文档存储,或者在最终用户和应用服务器之间放置几层缓存,那么这就是开发人员应该做的事情。重申一下,他们的工作是让最终用户体验尽可能好。多年来,许多不同的架构支持软件子系统的解耦。解耦是通过将应用程序及其对应部分分解成由 API 或事件连接的微服务(就像在中一样,是一种由事件驱动的架构),甚至是通过 web 挂钩来实现的。有各种各样的架构可供选择。

好了,系统已经被分离了。现在怎么办?企业如何使用应用程序捕获和生成的数据?为了回答这个问题,我们需要深入了解数据工程师的思维方式。

数据工程师如何思考

数据工程师仅仅出现了十年左右。这个物种是从一种变形进化而来的,是许多其他物种的聚合,产生了软件、数据和业务的有趣混合物。这是我对数据工程师工作的理解—

数据工程师根据软件工程的原则构建和维护系统,以确保企业能够使用系统中所有可用的数据并从中获得洞察力。

数据工程师从数据、数据的可用性、安全性、移动性和可靠性方面进行思考。数据工程师可以使用不同的工具和技术来解决所有这些问题。传统上,这些事情大部分都是用专有软件通过拖放和配置的方法来处理的。在过去十年左右的时间里,数据工程师已经越来越倾向于开源软件。这可能有几个原因。

首先,现有的软件通常是经过许可的,而且以一些新公司的规模来看,成本很高。他们必须开发自己的软件来应对这种规模。一旦他们解决了他们的问题,他们就开源了这些项目。这些项目中的大部分现在由 Linux 基金会和 Apache 基金会维护。

因为数据工程师强大的数据库管理和 DevOps 连接必然是性能和优化的坚持者。如果不是,他们可能是入错了行。这是麻省理工学院的查尔斯·莱森关于性能工程的介绍性演讲。这是我在一篇文章中讨论的核心思想。

麻省理工学院的 Charles Leiserson 关于性能工程的一个非常有趣的基础讲座

后端和前端开发人员主要处理 API 响应时间、不同级别的缓存和网络,而数据工程师处理完全不同的数字世界,本质上是以不同的方式跟踪相同的指标。不久前,我写了每个数据工程师都应该知道的数字。这些大部分应该在信封计算的后面,但是我们似乎从来不关心这些。我们应该。

本文中提到的数字非常笼统,但是数据工程师必须跟踪和优化的实际数字对于他们正在使用的堆栈来说非常具体。例如,如果您正在使用 Spark 处理大量数据,您需要为您的工作找到最佳数量的分区,使用最大数量的可用内核,减少节点间的混乱,等等。

如果您在 Redshift 上托管一个数据仓库,您将需要基于不同于 Spark 的参数来调整您的查询,但有一点是肯定的 MPP 系统的原则将适用于这两种情况。因此,即使 Spark 和 Redshift 的内部实现在存储和处理方面有所不同,MPP 背后的大多数核心思想对它们来说都是正确的,这就是为什么一旦你学会了优化一种数据库或 MPP 系统,你就会理解所有优化背后的一般原则。

收场白

我在文章开头说过,数据工程师和软件开发人员的思维方式不同,因为他们的侧重点不同。他们经常使用相似的基本工具(编程语言、测试框架)但不同的实现(缓存、数据库等)。).我说的软件开发人员和数据工程师思维过程的区别,也可以说对于基础设施工程,自动化测试,前端开发等等。虽然这篇文章的标题是一个反问句,但我希望我已经说清楚了,数据工程师和软件开发人员正在构建不同种类的系统。所以,是的,他们不能都使用 NoSQL,就像他们不能都使用关系数据库,或只是 OLAP 系统,或任何你最近听说的奇特类型的数据库。

如果你同意我的主要观点,你也会同意一个好的(也可能是有效的)工作方式是理解一个工程团队的其他功能的优先级,而不仅仅是你自己的。如果您是一名数据工程师,请理解为什么应用程序团队使用特定的数据模型。相反,如果你是一名软件工程师,你要明白你的应用程序如何需要数据并不能达到洞察业务的目的。一旦你们有了相同的理解,你们会更加欣赏彼此的工作,也许会做出更好的决定,并可能避免大量的技术债务。

如果你觉得我的文章有用,请订阅并查看我的文章🌲 Linktree 。你也可以考虑用我的推荐链接购买一个中级会员来支持我。

https://kovidrathee.medium.com/membership

为什么因果关系是相关的:一个物理学家的观点(第一部分)

原文:https://towardsdatascience.com/why-causation-is-correlation-a-physicists-perspective-part-1-742696d130e8

我们都听说过这句话,“相关性并不意味着因果关系”,但从来没有人谈论因果关系到底是什么。基础物理学给了我们一个答案,它可能会让你吃惊:这一切都回到了相关性。

虽然雨和伞是相互关联的,但是每个人都同意伞不会引起雨(图片由 Unsplash 上的 Alex Block 拍摄)

这是一个城市的雨天,每个人都带着雨伞。是下雨导致人们打开雨伞的吗?还是人们打开雨伞导致了下雨?虽然雨和雨伞高度相关,但两个可能的因果关系中只有一个是有效的:当然是雨导致人们打开雨伞,而不是相反!

答案感觉很直观。事实上,人类通常非常善于对因果关系做出判断,因为这些判断有助于我们预测、计划和证明我们的行为。

除了日常生活,人类的进步有赖于我们从结果中解读原因。从诸如“人类导致了全球变暖吗?”抽象思维实验,如“是什么导致了宇宙的创造?”对于科学和社会来说,有一个清晰的因果关系概念是至关重要的。

如果因果关系如此直观,肯定有一个简单的定义,对不对?也许自然法则可以给我们一个直截了当的答案。

不幸的是,事实证明我们人类对因果关系的概念根本不存在。充其量,这种观念是一种涌现的现象,充满了偏见。令人惊讶的是,在定义因果关系方面,我们能做的最好的事情是依靠一种特殊形式的相关性。

好奇?请继续阅读。

黄金标准:受控实验

传统上,因果关系是通过受控实验来确定的(图片由疾病预防控制中心拍摄)

统计学有多种方法帮助我们从结果中辨别原因——这是对因果推断的研究。做出因果推断依赖于受控实验的理念:我们考虑所有可能影响结果的变量,系统地隔离每个变量,并研究结果如何变化。这种方法为什么有效?

这归结于我们的自然法则。我们的世界受精确的数学方程支配,其中许多方程可以(近似地)写成以下形式:

尽管这个等式看起来微不足道,但它告诉我们,有一个明确的未来,可以通过当前状态持续预测,并且这种预测会随着时间的推移保持一致。受控实验充分利用了这一事实:受控变量总是在现在,而结果总是在未来。因此,受控实验允许我们将这些物理方程转换成

这是所有因果推论的标准假设。

但是光有方程还不足以区分原因和结果,因为即使是方程也有歧义。比如说我可以预测 2 = 1+1,得出 1 是因,2 是果的结论;我们可以把等式改写为 1 = 21,把因果倒过来!问题是方程只是关系,有多种写法和解读方式。为了区分原因和结果,需要一个额外的消除歧义的因素。

进一步说,这种因果模糊性根深蒂固,一直到自然的基本法则。解决这些含糊不清的唯一方法,是接受因果关系不是自然的基本条款,而是一个复杂的涌现现象,涉及人类的偏见。

因果难题

一场台球的“因果”游戏(由乔纳斯·瑟吉斯Unsplash 上拍摄)

为了进一步说明为什么因果关系很难定义,我们来玩一个台球游戏。想象我击中了⚪ ️(white 球),它与⚫️(黑球)相撞,⚫️进了一个口袋。问题是:是什么导致⚫进入口袋?

我们中的许多人可能会得出以下结论:⚪击中了️️⚫️,因此显然⚪引起了运动。

但是让我们从⚪'s 的角度来考虑。⚪看到️⚫️冲向它,迎面撞上它,然后转向球洞(就像一个好战的醉酒司机!).虽然这种观点可能不常见,但认为⚫️是原因并非完全不合理。⚪ ️and ⚫️之间的唯一区别是台球运动员对⚪.有更直接的“控制”但是如果没有打台球的背景,就很难确定我们可以“控制”什么事情。

为什么这个台球场景是相关的?嗯,现实世界本质上是由许多微小的台球组成的:粒子不断地相互碰撞。每次两个粒子相互作用,我们都会遇到同样的因果难题。在粒子的世界里,没有“静止”或“活动”粒子的概念。

这个难题有一个解决方案:也许我们可以把台球(⚪和️️⚫️)都作为结果的原因。

但是台球就够了吗?不应该包括击球的人和台球桌吗?但是房间里的空气分子呢,它们不相关吗?地球?太阳系?整个宇宙呢?如果我们把一切都包括在内,那么这种因果关系的概念有什么用呢?

在认定一个事件的原因时,我们的界限在哪里?我们需要一直追溯到宇宙的开端吗?(鸣谢:TheAstronomyBum,维基百科)

在受控实验的语言中,问题是没有基本的方法从无数的可能性中选择出控制变量。

现在,定义因果关系的关键问题应该很清楚了。

  1. 我们需要一种方法来明确地将对象和事件分为原因或结果。
  2. 我们需要想出如何限制我们包含的对象/事件的数量,以便创建一个有用的因果关系概念。

这些问题似乎令人生畏。幸运的是,物理学有答案。由于我们讨论的复杂性,我决定写两篇独立的文章。第一篇文章将关注因果关系的界限,以及时间之箭如何区分原因和结果。第二篇文章将关注对因果关系这一原始概念的提炼,并探索我们对因果关系的直觉是如何产生的。

在我们的旅程中,我们会偶然发现许多深奥的物理学课题,包括相对论、宇宙学、量子物理学和混沌。

这趟旅程相当刺激,所以请系好安全带!

因果关系就是相关性

让我们从基础开始,我们有什么工具来定义这个因果关系的概念?物理学给了我们粒子间相互作用的方程式。问题是,对任何单个粒子或成分都没有任何优待——原因和结果之间没有简单的区分。

物理学告诉我们粒子是如何运动的,就像这里描绘的气泡室照片。然而,没有明确的因果关系(鸣谢: CERN

那么方程给了我们什么呢?这些方程最终是空间和时间中粒子之间的关系。换句话说:相关性!(其实在基础物理中,几乎所有的计算都涉及到 关联函数 )。我们因此被迫得出一个惊人的结论:

没有因果关系的基本概念,只有相关性。因此,我们对因果关系的概念必须是一种从特定类型的相关性中衍生出来的宏观涌现现象。

这可能会让一些人感到震惊,因为我们经常被告知“相关性并不意味着因果关系”。我并不是说我们应该抛弃这句众所周知的格言;相反,我们只需要添加一个更有力的次要条款:

因果关系必须来源于某种特定形式的相关性。

那么,下一个问题是这些特殊类型的相关性是什么。它们在哪里开始和结束?在这个过程中的某个地方,人类的偏见必须发挥作用。

现在,我们将推迟对导致因果关系的相关性类型的讨论,因为这将迫使我们绕道进入量子世界——一个充满意想不到的相关性的领域。

同时,为了描述因果关系的开始和结束,宇宙需要参与进来。为此,我们需要爱因斯坦的帮助。

因果边界:以光速

可能最接近我们的因果关系概念的物理概念是*因果关系** 的概念。这个概念是爱因斯坦相对论的直接结果。

(**旁注:我将保留“因果关系”这个词来指代日常概念。物理学中的术语“因果关系”有一个非常特殊的技术含义,所以在这篇文章中,当我使用“因果关系”时,我只是指那个技术含义。*)

爱因斯坦的理论与因果关系的概念紧密相连(照片由巴克罗姆·图尔萨诺夫Unsplash 上拍摄)

为了理解相对论和因果关系是如何关联的,爱因斯坦设想了一个假设的场景:太阳突然消失,地球会发生什么?

在爱因斯坦的理论出现之前,(错误的)答案来自牛顿的理论:太阳的引力会瞬间消失,所有的行星会瞬间偏离它们的轨道。

牛顿的回答深深困扰着爱因斯坦:一个近 1 亿英里外的东西消失,怎么会立刻影响到我们?那感觉就像幽灵般的远距离行动!

为了纠正这个结论,爱因斯坦认为,起初,地球不会感觉到任何变化。只有在巨大的重力扰动(以光速传播)到达我们的星球后,我们才会开始感受到它的影响。重要的一点是,需要有一个信使(在这个例子中是引力波),把我们认为是因果的东西联系起来。爱因斯坦将这一深刻的观察推广到宇宙万物:

为了让一个事物与另一个事物进行有意义的互动,需要有一个信使。此外,信使的速度不能超过光速。

这些宇宙间的联系是因果关系的前兆。另一个深刻的认识是,这些关系最终编码在宇宙的几何(或形状)中。不管怎样,撇开题外话,我们现在可以定义爱因斯坦理论中的因果关系

当两个事件可以通过信使联系起来时,它们被称为因果联系

这实际上意味着什么?它告诉我们,当考虑地球上的事件时,我们可以安全地忽略银河系另一端“现在”正在发生的事情——忽略定义“现在”意味着什么的微妙之处。因此,这意味着不可能有一场协调的银河间战争(抱歉,星战迷们!).

无论如何,现在物理学已经给了我们宇宙中这种特殊的因果关系(如果你愿意,也可以称之为因果关系),我们已经准备好定义因果关系的最一般形式了。

时间的因果箭头

爱因斯坦的相对论带来了另一个强有力的概念:事件的时间顺序。可以从数学上证明,当两个事件按上述定义有因果关系时,事件的时间顺序是一致的。

一致的时间方向是将相关性转化为因果关系的关键因素(鸣谢:卢西恩·阿利克夏

这种一致性是我们每天都认为理所当然的。例如,我们都同意我们的父母出生在我们之前,2000 年发生在 2020 年之前。这都要归功于我们宇宙的因果结构,它给了我们事件一致的时间顺序!

现在,把原因和结果分开有两种选择:原因在结果之前或之后。这就是人类(或人为)偏见的来源。由于大爆炸,我们的宇宙被构造成我们都经历相同的时间流。因为我们只能操纵现在的条件来影响未来的事件,所以只有一种自然的方法来定义因果关系:

过去的事件导致未来的事件

虽然这听起来完全是同义反复,不言而喻,但这一点也不明显,它可以从爱因斯坦对宇宙的数学描述中推导出来。事实上,甚至有一个一致的一般概念的因果关系是一个伟大的王牌爱因斯坦的理论!

因果关系的另一个奇怪的另一面是因果关系断开事件的时间顺序可能是模糊的!意思是像这样的问题,“智慧生物何时在宇宙中首次进化?”从技术上来说是一个观察者依赖的陈述。所以当外星人来访的时候,可能会有一个无法解决的争论,到底哪个文明先来!

从相关到因果

下面是我们对因果关系讨论的总结:

  • 物理定律只给出相关性,而不是因果关系。所以因果关系一定是这些关联的子集
  • 爱因斯坦的理论创造了一个因果关系的概念,这是宇宙结构的一部分
  • 一致的时间箭头,结合爱因斯坦的因果关系,允许我们将过去定义为原因,将未来定义为结果

以上所有这些给了我们最普遍的因果关系:现在正在发生的每一个事件,从你在屏幕前阅读这篇文章,到夏威夷海浪的涨落,它们都是由一系列类似的事件引起的,这些事件涵盖了地球和宇宙的整个因果历史!

回到我们之前的台球游戏,这意味着我们事实上必须包括宇宙起源的一部分,才能完全抓住游戏的因果关系。这呼应了卡尔·萨根的一句名言

如果你想从零开始做一个苹果派,你必须首先创造宇宙

所以,看起来我们所做的一切都是徒劳的,但是我们仍然没有一个可行的定义,来解释在我们的日常生活中,什么是由一件事引起另一件事。

为了弥合这些差距,我们将不得不考虑讨论中的相关性的大小(这将在本文的第二部分讨论)。要判断某样东西是否应该作为原因的一部分,人类的偏见就必须介入。例如,虽然大爆炸是人类在地球上存在的原因,但在寻找癌症的治疗方法时,我们不会将其包括在内。这在很大程度上是因为我们无法控制大爆炸,包括它也不会帮助我们治愈癌症!

然而,这是否意味着我们的因果推理和科学方法是被误导的或错误的?答案是否定的。因果关系是一个非常有用的概念,可以帮助我们提取关于世界的信息。基础物理学揭示的是,我们应该将因果关系视为一种复杂的现象,这种现象来自基本定律和人类直觉的结合。缺乏一个基本的定义只是再次强调我们应该停止对如何定义因果关系的迂腐,并接受它的效用,以提取洞察力并帮助我们导航世界。

最后,我们的因果概念也强调了我们共同的人性,因为它依赖于我们共同的宇宙经验和代理感。我认为我们都应该珍惜这样一个事实,那就是我们都在同一把因果保护伞之下,并为物理定律赋予我们理解这个宇宙的能力而欢欣鼓舞。

如果你喜欢这篇文章,你可能会对我下面列出的其他见解感兴趣。如果你想从物理学家的角度看一个不同的话题,不要犹豫给我发信息,因为我很乐意与你分享更多的想法。👋

https://medium.com/intuition/why-we-dont-live-in-a-simulation-a-physicist-s-perspective-1811d65f502d https://medium.com/swlh/entropy-is-not-disorder-a-physicists-perspective-c0dccfea67f1

为什么公司应该管理自己的机器学习团队,而不是外包

原文:https://towardsdatascience.com/why-companies-should-manage-their-own-machine-learning-team-instead-of-outsourcing-it-12f3754061f7

意见

照片由来自佩克斯达莉亚·谢夫索娃拍摄

许多公司已经采用机器学习技术来生产各种机器学习解决方案,以解决他们的业务问题。随着每天生成的数据量不断增加,许多公司使用数据来构建智能解决方案,以通过自动化来增强其业务运营。

机器学习开发遵循在机器学习项目中实现的一系列阶段,以创建商业解决方案。这些阶段涉及指定要解决的业务挑战、数据收集、数据准备、模型训练、模型评估以及任何机器学习模型的生产部署。

当涉及到开发机器学习解决方案时,许多公司采取两种方法之一。

第一种方法是雇用一组专家,建立一个机器学习团队,研究公司特定的业务问题。为了产生成功的机器学习解决方案,团队应该具有适当的机器学习技能和能力。

数据科学家、机器学习工程师、商业智能分析师和其他机器学习专家可能是机器学习团队的一部分。强烈推荐这种方法,特别是对于长期的机器学习项目。

第二种方法是将机器学习项目的开发外包给承包商、自由职业者或提供机器学习服务的机构。公司签署法律文件(即保密协议等)。),与外包团队讨论主要项目的主要目标和想法,同时共享相关数据以开发业务解决方案。

在这种方法中,公司不会投资很多 ML 软件或设备来完成项目。拥有机器学习高级专家的外包团队将致力于该项目,并将解决方案交付给客户。这种方法可以让公司节省时间和金钱。

在本文中,您将了解在工作中运行自己的机器学习团队的好处。

为什么管理自己的机器学习团队很重要

1.完全控制您的数据

在这个数字时代,数据是任何公司的新资产。您可能有一些机器学习项目的敏感数据,您不想与外部供应商共享。暴露你的机密数据可能会导致隐私问题,但拥有一个内部机器学习团队可以确保你的数据是隐私的。

照片由 Pixabay 从 Pexels

您的内部团队可以使用开源 MLOps 来处理您的项目,从数据准备到模型部署。拥有和管理开源 MLOps 技术的能力使公司能够完全控制机器学习项目。

2.让领域专家参与您的项目

外部供应商可能拥有领域知识,但他们不会与您的内部机器学习团队处于同一水平。在你公司的某个领域呆了很长时间的人会对你试图用机器学习技术解决的商业挑战有更好的了解。

没有领域知识,任何机器学习项目都不可能建立高质量的模型。我们都知道,特征工程是机器学习实现的重要组成部分,如果你没有足够的领域知识来从事特征工程,你的 ML 项目将面临失败的风险。

“说到底,有些机器学习项目成功了,有些失败了。有什么区别?最重要的因素无疑是所使用的功能。” —华盛顿大学的佩德罗·多明戈斯教授

3.易于处理不确定的需求

当从事机器学习项目时,以 100%的准确率确定解决您的业务问题所需的准确项目需求可能是一项挑战。探索和分析您正在处理的数据集后,您可能会发现新的需求(例如为特定要素收集更多数据)。

来自 Pexels 的 Vanessa Garcia 拍摄的照片

因此,为外部供应商设定这些要求以参与您的机器学习项目将是一项挑战,因为这将扰乱他们的管理流程,因为他们倾向于为许多组织从事各种项目。它还会要求外部供应商处理您的额外需求,从而增加成本。

当你有一个内部的机器学习团队来处理你的项目时,不确定的需求可以很容易地管理。公司也不会担心任何新的额外成本或任何复杂的成功实施项目。

4.更好的项目管理

外部供应商经常同时为不同的客户进行许多机器学习项目,这可能导致一些项目达不到预期。因此,这会导致延迟交付解决业务问题的解决方案。

照片由来自 Pexels 的 fauxels 拍摄

建议公司拥有自己的机器学习团队,因为这将允许他们完全控制项目,有效地管理项目,并按时提供解决方案。

5.易于快速定制

在您的公司中拥有一个机器学习团队可以让您简单地定制您的机器学习解决方案,以便它可以随着时间的推移快速适应新的业务变化或需求。当你外包时,外部供应商可能需要很长时间来理解和执行你公司的新变化。

结论

决定如何在您的公司中实现机器学习开发过程是一项困难的任务,可以通过正确的方法来处理。

如果你想要一个快速的咨询或概念验证,看看一个机器学习解决方案是否能给你的业务带来价值,你可以外包一个机器学习团队。然后,一旦你确定需要一个机器学习解决方案,我们建议雇佣一个机器学习专家团队来解决你的业务问题。

即使你确定外部供应商适合你的机器学习项目,你也必须确保外部供应商愿意与你长期合作。您的员工还可以提供外部供应商需要的领域知识,以全面理解您试图解决的业务挑战和您将使用的数据集。

在这种情况下,你将能够创建一个财务上成功的机器学习产品。否则,公司可能会浪费资源(金钱和时间)来生产一种看似有用但不能解决客户挑战的服务/产品。

如果你学到了新的东西或者喜欢阅读这篇文章,请分享给其他人看。

如果您有任何问题或疑虑,请随时联系我。

为什么数据治理很重要:简介

原文:https://towardsdatascience.com/why-data-governance-matters-5385d722c4c6

我在这个学科的经历和我学到的东西

来源

介绍

虽然不像其他“数据”学科(科学、工程、管理、分析师等)那样吸引人,但数据治理是目前大多数公司都无法承受的一个领域。在这篇文章中,我将讨论为什么这很重要,以及为什么不管是哪家公司,这都是双赢的。

目录

  • 这是什么
  • 为什么它很重要
  • 为什么这是双赢

这是什么

数据治理是公司为充分利用数据而制定的规则和政策。它是思考你作为一个公司的目标是什么,思考你的数据应该如何被用来达到或超过这些目标,并尽你所能建立结构来实现这些目标。这些结构很可能是软件发布,如数据目录;团队建设,以传达新数据流程的新标准和培训;和/或数据管理计划或其他责任措施,以确保数据是它应该是什么样子。

如果你研究数据治理领域的主要参与者,比如 Alation 或 ASG,你会学到很多基础知识。一个关键的组成部分是关注元数据。这些是关于数据的属性。元数据越清晰、有组织、自动化和可用,从数据本身提取的商业价值就越多。

为什么它很重要

数据治理至关重要的一个原因是,根据消息来源,数据治理预计每年将增长 23%。软件开发,管理重点,在该地区招聘更多的人;所有可用的数据都指向这个增长方向。

另一个原因是,这很有意义。我们都知道这样一个老生常谈的话题:数据量每年都在呈指数级增长,企业越来越重视他们的数据。数据治理基本上是将业务模型放在数据上。为什么不进行组织并部署基础设施,以充分利用公司增长最快的资产呢?

为什么这是双赢

这就是我个人经验的切入点。我在银行业工作了几年,我看到了实时建立的数据治理工具的意识和实现。银行业因落后于最新技术而臭名昭著,但即使是他们也比预期的更快地抓住了这个机会。

银行、保险和医疗保健等更大、更老的公司大多采用分层数据基础架构。举个例子,大银行仍然使用大型机作为基础。最上层是各种关系数据库工具(sql server、oracle、postgresql 等)、SAS 服务器、各种具有自己的隔离数据存储机制的独立应用程序、分布式数据湖、云存储等。这些技术升级是进化的产物。多年来,它们被用来解决不同的问题和不同的用例。这是有道理的,因为我们所有的银行都已经存在了很长时间,并在新技术可用时继续尝试(当然是在每家公司都这样做之后)。但突然到了 2022 年,高级管理人员回头看看,当他们最终戴上数据治理的帽子时,一切看起来是多么混乱。

大型机数据不是为在其上运行机器学习脚本而设计的,所以我们需要一个分布式数据湖来运行 pyspark。数据湖不能直接从大型机接收数据,因此我们需要 SQL server 和数据仓库等其他工具作为中介。在云存储出现之前,已经开发了数百个用于独特业务目的的高度专业化的应用程序,这些应用程序需要与 oracle 或 sas 协作来继续执行重要的银行功能。SAS 曾经是跨银行数据运行脚本的最佳方式,但现在正在转变为优先考虑云处理。这个清单还在继续。一家银行(实际上是任何一家公司)是一个活的有机体,它会随着时间的推移适应环境,而不会过多地考虑长期前景。随着时间的推移,许多小决定创造了这个疯狂的,分层的画面来回顾。

但是,现在我们有了这个超级复杂的数据基础设施,我们如何才能推进一个符合公司目标的清晰的数据治理框架呢?这需要添加一个应用程序来组织一切:数据目录。该应用程序将连接到公司内的每个数据资产,填充/组织元数据,通过数据管理分配责任,记录不同用户的查询并对每个查询的相关性进行排名,让数据用户提交评论和意见,包括数据字典,以便每个人都说同一种语言。本质上,这是一种胶水,将把银行和其他大公司的近乎无限的碎片粘在一起,并使它们朝着更清晰的方向排列。更令人兴奋的是,数据目录可以帮助数据用户了解数据质量和治理标准。非常有前途的技术,只会越来越相关。

如果你看一下 Alation 的客户页面,你将能够看到比银行客户多得多的信息。仅举几个例子:戴姆勒、Ancestry、思科、Hulu、通用磨坊、Autozone、Salesforce、惠普、辉瑞、Chegg、LinkedIn 等等。即使您认为拥有现代数据堆栈的公司仍然受益于数据治理支出和关注,如 Salesforce。他们有一个关于他们经历的有趣的网络研讨会,值得一看。

感谢阅读!

安德鲁

考虑通过我的推荐链接加入 Medium:https://andrewhershy.medium.com/membership

如果你觉得这篇文章有帮助,请看看我的其他文章:

我写了一个 python 脚本帮我玩彩票

基尼指数 vs 信息熵

Alteryx 是否是你数据分析需求的正确选择?

利用数学和 python 优化你的投资组合

Excel vs SQL:概念上的比较

为什么数据治理很重要:主数据管理(MDM)

原文:https://towardsdatascience.com/why-data-governance-matters-master-data-management-mdm-5d9af0f64573

什么是主数据管理?

坎凯奥·维莱辛在 Unsplash 上拍摄的照片

这是关于 数据治理 及其相关性系列的一部分。主数据管理(MDM)通常被认为是数据治理的一部分。

目录

  • 什么是主数据?
  • 什么是主数据管理?
  • MDM 解决什么问题?
  • 重复数据为什么不好?
  • MDM 是如何工作的?
  • 结论

什么是主数据?

先从了解主数据开始。毕竟,这是我们的目标。

关于 Wikipedia : 主数据的定义表示包含最有价值的、在整个组织中共享的一致同意的信息的业务对象。 [1]

另一个:关于为业务交易提供上下文的业务实体的数据。 [1]

有点模糊对吧?这是一个很难定义的术语。以下是一些被视为“主”数据的示例:

  • 客户
  • 制品
  • 服务
  • 供应商

如果你没有得到它,不要担心,随着我们继续前进,它会变得有意义。

什么是主数据管理?

用我自己的话来说,我将 MDM 描述为“试图确保主数据是独特的,并且具有最小的质量问题”

Wikipedia: 主数据管理(MDM)是一门技术支持的学科,其中业务和信息技术共同确保企业官方共享主数据资产的统一性、准确性、管理性、语义一致性和责任性。[2]

我认为真正理解 MDM 的唯一方法是首先理解它要解决的问题。但希望这些定义至少模糊地设置了舞台。

MDM 解决什么问题?

MDM 旨在解决重复的主数据。

这里的主要思想是在整个企业中存在主数据的重复记录。例子包括:

  • 具有不同地址和电话号码的同一客户的多个实例,等等。
  • 多个版本的产品名称相同,但属性不同。或者更糟的是,多个属性相同但名称略有不同的产品
  • 名称相同但属性不同的多个供应商

让我们看看一个虚构的汽车修理店“汽车修理 ABC”的重复客户示例。

  • Ben 在 Car Repair ABC 有一个现有帐户,但他意外地用不同的电子邮件打开了另一个会员帐户。这导致了他们系统中的两个 Ben 实例。这是一个由于内部控制限制而创建重复记录的例子。
  • ABC 公司的广告部有自己的数据库,其中包含当前客户和潜在客户。该数据库与销售、会计等客户记录没有一对一的匹配。这是一个由于企业内部孤立/分割的源系统流程而存在重复记录的例子。
  • 并购:汽车维修 ABC 收购了一家较小的汽车商店。如果 Sally 在合并前在两家商店都有帐户,则合并后可能会有多个 Sally 实例。这是一个与 M & A 相关的重复的例子。

这些是重复数据的几个基本示例。重要的是要记住,这个问题不仅仅是客户数据的问题。同样的原则也适用于产品、服务、员工或任何其他主数据

重复数据为什么不好?

有了这些重复的数据,越来越难知道什么是真的,什么是假的。我们的客户到底是谁?我们的产品是什么?

“在一个又一个案例研究中,重复的主数据与错过的收入、利润和效率机会联系在一起…在传统的架构环境中,数据没有集成,因此无法在所有应用程序中唯一地识别和一致地描述客户,或者在整个公司范围内统一跟踪产品。缺乏这种数据凝聚力的组织不可能认识到他们业务的总价值”——Val Lovicz【3】

此外,如果没有治理主数据的基础,数据科学家获得洞察力或创建模型的能力就会受到限制。如果重复使我们的结论不准确,客户回归模型会带来什么样的价值?

MDM 是如何工作的?

第一步是在一个新的地点创建唯一的主记录,一个真实的单一来源。假设在所有不同的企业源系统中有 1000 个“John Smith”的实例。有多少独一无二的“约翰·史密斯”,多少是重复的?这就是 MDM 要解决的问题!

MDM ETL 流程的高级视图——将特定类型主数据的所有实例集中到一个地方。(图片来自作者)

在将所有的源记录编译到一个数据库中,并为每个实例指定惟一的 id 之后,会发生两个步骤:匹配和存活。

匹配:这里的基本概念是有一个算法可以遍历所有的记录(在我们的例子中,是 1000 个约翰·史密斯)。然后,它将创建约翰·史密斯的聚类,它认为这些聚类是同一个人。这些聚类是通过一系列逻辑匹配规则来确定的,这些规则将某些共享属性置于其他属性之上。例如,规则可以将出生日期的匹配优先于电子邮件的匹配。

匹配算法已经确定 John Smith 的这 10 个实例(来自我们的 mdm db 的 1000 个实例)都是同一个人的副本(图片来自作者)

存活:通过匹配过程形成 John Smith 的聚类后,下一步是选择每个聚类共享的最强的属性,并将这些属性“存活”到一个主记录中。

底部新的“幸存”黄金记录在所有记录中提取了最强的实例,在群集内,形成这个特定“John Smith”的最准确、唯一的实例(图片来自作者)

即使有几个实例不一致(例如,姓名“Jon Smith”或电子邮件“john.smith@emailz.com”),最强的属性仍保留在底部加粗的主记录中。“最强”属性由每个集群中的大多数实例共享,或者由生存配置中更细微的逻辑规则决定。

结论

MDM 是数据治理的重要组成部分,几乎每个大型企业都使用它。这是数据分析师/科学家在职业生涯中应对各种数据环境时需要了解的一个基本概念。

我建议查看下面的资料来源中列出的文章,Val Lovitz 的“超越匹配”,通过更全面的示例进一步了解匹配是如何工作的。

希望这篇文章对那些坚持到最后的人有所帮助。干杯!

考虑通过我的推荐链接加入 Medium:【https://andrewhershy.medium.com/membership

来源

[1] 主数据—维基百科

[2] MDM —维基百科

【3】超越匹配 —瓦尔·洛维茨

为什么数据质量比代码质量难

原文:https://towardsdatascience.com/why-data-quality-is-harder-than-code-quality-a7ab78c9d9e

如何检测、理解、修复和减少数据质量问题。

照片由帕特里克·福尔Unsplash 拍摄

作为一名数据工程师,我总是对自己处理的数据质量不如自己编写的代码质量有信心。代码,至少,我可以交互地运行它,并在部署到产品之前编写测试。数据,我经常不得不等待它在系统中流动,并被用来处理数据质量问题。而且不仅仅是出现了错误。也是这种感觉,比代码 bug 更多的未知数据质量问题等着被发现。但是,数据质量比代码质量更难解决吗?

代码质量是确保代码符合预期的过程。同样,数据质量是确保数据满足期望的过程。在本文中,我想抽象出期望值(在谈论数据时称为数据质量维度),因为它们可能会根据您的使用情况而有所不同。相反,我讨论处理数据质量问题的不同步骤:检测、理解、修复和减少质量问题。然后,我解释了为什么我发现这些步骤中的每一步在应用于数据时都比应用于代码时更难实现。

为什么检测数据质量问题很难?

一个公认的原则是,您遇到的数据质量问题的数量将与您的代码库和数据的大小成比例。大多数数据存储库将比任何代码存储库大几个数量级。最重要的是,您可以每天部署几次代码,但是数据可以在几毫秒内更新。随着数据更改越来越多,您遇到数据质量问题的可能性也越来越大。

检测数据质量问题有三种主要方法:

  • 一位业务用户报告了一个问题。
  • 数据测试失败。
  • 数据监控会发出警报。

首先,您的数据需要一个通信渠道,以便用户报告数据问题。不要低估这一点,否则您最终会得到越来越多的修补数据问题的 SQL 代码,而这些问题应该从源头上解决。然后,您可以开始添加测试来捕捉已知的数据问题,并添加数据监控来提前发现未知的数据问题。

测试数据与测试代码

数据测试是将数据资产与一组预期进行比较的过程。数据预期被硬编码为规则,并在生产数据上运行。一方面,在更新生产代码之前,代码测试作为 CI 管道的一部分运行。在软件工程团队中,在发布到产品之前,对代码进行阶段化、测试和验证是很常见的。另一方面,如今大多数数据团队都致力于定期对数据库和仓库中的静态数据进行测试。为了在代码库中拥有良好的测试覆盖率,软件工程团队可能会尝试拥有一个执行所有代码行的测试套件,这就是 100%测试代码覆盖率的神话。对数据进行良好的测试覆盖意味着什么?

您可以编写的数据测试的数量与列的数量成正比。您不需要为每一行编写测试,而是为每一列编写一些测试。例如,测试可以检查缺少的值、值是否在某个范围内,或者一个表中的列值是否与另一个表中的列值相匹配。你可以使用像远大前程Soda 或者 dbt tests 这样的开源测试库来测试数据。

开始您的数据质量之旅的一个方法是识别在下游更常用的数据模型。当然,核心模型可能会对用户对数据质量的看法产生更大的影响。然而,数据集变化的比率使得为每一列编写多个测试不切实际,许多团队转而求助于数据监控。

监控数据与监控代码

数据监控,也称为数据可观察性,是持续收集数据指标的过程。例如,对于每个数据集,您可以收集有关每个数据集的行数、列数和值的数据。您还可以收集关于数据集的元数据,例如上次更新的时间。

指标可用于根据过去的数据自动创建期望值并帮助您发现未知的数据质量问题。例如,如果一个表在历史上每天添加 5 到 10,000 个新行,而突然有一天它只获得了 100 个新行,那么监控就会发出警报。

许多团队在监控中面临的最大问题是警报疲劳,因为误报会越积越多。这个问题在软件工程团队使用的云监控工具中是共有的。一方面,像 Datadog 这样的云监控工具大多求助于收集低维的时间序列数据,如 CPU 消耗和 API 响应时间。另一方面,数据质量监控工具收集列和表之间的多元数据。因此,通过对多个变量进行统计分析发出警报比通过观察时间序列中的一个指标发出警报更难

为什么理解数据质量问题很难?

当您收到数据问题的警报时,您的数据可能已经更改。您可能需要签出数据的以前版本来调试错误。任何严肃的软件开发团队版本都控制着它的代码库。不幸的是,我们不能对数据仓库说同样的话。版本控制数据资产仍然是一件好事,但很难做到。像雪花这样的数据仓库和像数据块这样的数据湖提供了时间旅行能力。检出单个数据集的先前版本很容易;更难的部分仍然是一致地恢复所有受影响的数据和代码。使用其他提供原子回滚的数据版本控制工具,如 lakeFS ,您只能对数据湖进行版本控制。

一旦找到了引起错误的数据,就需要找到错误的来源。不幸的是,浏览数据依赖关系绝非易事。 OpenLineage 提供了数据沿袭收集的标准,但需要为数据堆栈的每个组件配置一个客户端,如果它们提供集成的话。

找到错误来源后,您可能希望了解错误是何时引入的,并将数据与以前的版本进行比较。为了计算数据集之间的差异,你需要求助于一个数据协调工具,比如 data-diff (最近由 Datafold 开源),它集成了十几个数据存储系统。

将所有这些与版本控制代码进行比较,探索代码依赖性,并直接通过 git 的代码编辑器可视化代码差异。对我来说,这方面的数据质量将受益于整合。

为什么解决数据质量问题很难?

调试完数据质量问题后,您会做什么?如果错误是由中间模型造成的,那么您可以修复代码。否则,数据质量问题可能源自外部系统。这带来了另一个挑战,数据质量问题并不总是能立即得到解决,在某些情况下,你甚至无法了解真相。然而,即使您的代码依赖于其他库,大多数情况下您也可以访问源代码来修补它并提交一个 pull 请求。

当您发现代码错误时,您可以暂停程序并向用户发送一个错误代码。您可以收集堆栈跟踪并将其存储在某个地方,但大多数情况下,您不需要重新执行失败的代码。例如,如果有人访问您的电子商务网站并试图订购一件商品,但付款失败,您会向该用户发送一条错误消息。当您解决问题时,您最多可以向用户发送电子邮件,但您不必重新处理所有失败的支付。

当检测到数据质量错误时,您可以隔离这些数据。然后,您可以尝试手动修复数据,使用数据插补技术或修改产生数据错误的代码。然后,您必须重新处理来自源的数据,以更新所有下游依赖项。能够使用数据编排(称为回填)重新处理旧数据而没有副作用,这在很大程度上取决于您作为数据工程师是否能够让您的数据处理代码起作用和幂等。

“回填是一个真正显示数据工程师和优秀数据工程师之间差异的话题。大概是因为回填需要经验和耐心。运行管道很容易,但当您的管道需要重新计算或重新吸收过去 4 年的数据时,它将给您的系统带来沉重的压力。”— Christophe Blefari 在他的 数据简讯上。

减少数据质量问题

在经历了几次检测、理解和修复循环之后,您可能会问自己如何改进您的数据架构以避免如此频繁地经历这个过程。您可以尝试在外部来源的数据质量问题被接收后立即检测出来。然而,大多数问题可能是由系统故障和错误的逻辑引起的。

为了提高代码质量,您可以重构代码以减少代码库中重复逻辑的数量。通常,更少的代码也意味着编写更少的测试和导航代码库的开销更少。我们同样可以说数据质量问题的数量与数据的大小成正比。但是数据越多不总是越好吗?

您可能不想减少您正在摄取的总体数据,但是您可以减少您创建的中间数据模型的数量。当前的一个趋势是,数据网格组织提倡在组织内分散数据所有权和民主化数据使用。这说起来容易做起来难,与其说是技术变革,不如说是组织变革。像 Castor 这样的数据目录有助于在整个组织中发现数据,以避免创建另一个具有相同信息的数据集。

减少中间模型数量的另外两个趋势是从 ETL 到 ELT 的转换和度量层。一方面, ELT 管道将转换移到右边,在您存储原始数据之后,在您的数据仓库或 lake 中发生。在过去,有时会创建一个 ETL 脚本来服务于一个单一的仪表板(完全相反)。另一方面,指标层 将转换从 BI 工具向左移动到数据仓库。但是度量层只是抽象转换逻辑的一种方式。语义层(一个更广泛的概念)仍然充满了未解决的问题。

“语义层的核心动机是提供一个定义概念的地方,包括(但不限于)指标,这种方式不需要你在定义中重复自己。语义建模包括定义正确的构建模块,允许您基于它们定义更高级别的概念。”—从 往下语义兔子洞 作者 JP 蒙泰罗。

这里有最后一个不受欢迎的建议来减少中间模型的数量:减少接收和转换数据的频率。你可能认为更多的数据、更多的仪表板和更新鲜的数据总是更好,但要知道所有这些都带来了它们自己的问题,例如在运行更多的数据集成和处理作业时增加警报疲劳。

如果每天只消耗数据,是否需要每分钟摄取数据?最近,Benn Stancil 创造了术语反向编排,其中 ETL/ELT 作业的频率是从数据和 SLA 的消耗中推断出来的。

“例如,一个频繁更新的数据摄取任务可能会定期失败并自我纠正,所有这些都在延迟 SLA 的范围内。提醒人们任务失败会教会我们忽略这些警告,并将系统问题和内部故障与影响数据是否可信的实际问题区分开来。”—从 向下,通过本模板使用 DAG

使数据质量成为一个更容易解决的问题

正如我们所看到的,数据比代码变化更快,包含更多的依赖关系,这使得引入新的质量问题更加容易。您可以采取一些措施来减少数据质量问题的影响,例如添加数据测试和监控。有时,这是处理来自外部来源的数据质量问题所能做的全部工作。

但是你能做些什么来减少来自你的逻辑的质量问题的数量呢?首先,您可以教育数据生产者减少中间数据模型的数量,从将原始数据加载到中央存储库并在那里进行大部分转换开始。虽然这将减少模型的数量,但它不是一个灵丹妙药,因为它还会增加管道之间的依赖性,并且需要一组最佳实践。

数据质量生态系统没有代码质量成熟。例如,调试数据质量问题仍然是数据工程师花费最多时间的步骤。数据工程师需要在不同的工具之间周旋,以控制数据版本、导航数据依赖关系和比较数据集,而您可以在调试代码时通过代码编辑器完成所有这些工作。

最后,数据组织在不同的系统(应用程序、数据库、数据湖、数据仓库)上存储数据,而大多数代码存储在同一个代码托管系统(Github)上。这使得数据质量工具(测试、监控、沿袭、目录)更难支持所有系统的集成。为了简化数据堆栈所有层的集成,我们需要为所有三个核心数据领域制定更多的数据标准:数据存储、数据移动和数据转换。

在 Airbyte,我们正致力于通过提供用于移动数据的开源连接器来解决集成的长尾问题。说到数据存储系统,开放式数据湖表格式(胡迪的 Delta Lake,Iceberg)有可能简化数据堆栈不同层之间的集成,但仍需要更广泛的采用。我们仍然缺少数据转换的标准。

原载于 Airbyte 博客

数据科学家和工程师辞职的原因

原文:https://towardsdatascience.com/why-data-scientists-and-engineers-quit-their-jobs-afc2350eef9a

这不仅仅是因为他们工资太低

蒂姆·高在 Unsplash 上拍摄的照片

最近对数据科学家的一项研究得出了以下非常明显的结论:“典型的数据科学家为大型科技公司工作——他们在那里工作大约一年,平均有 6.2 年的该领域经验。值得注意的是,自 2017 年以来,他们已经换了两次(或更多)公司,平均而言,他们可能只会在当前雇主那里呆 1.7 年。只有极少数受访者(2%)在过去五年里没有换过工作。

人员流动是数据科学和数据工程专业中的一个大问题,它伤害了每个人。数据科学家和工程师自己不希望频繁地从一个职位跳到另一个职位,因为这无助于他们建立长期的技能和专业知识,而且在他们的简历上看起来很糟糕。同样,对于雇主来说,替换这些技能既困难又昂贵。找到特定的技术背景并不容易,新加入者的加速时间是进一步的机会成本。通常,快速替换某人的愿望会导致不合格员工的恶性循环,从而加剧人员流动问题。

因此,让我们列出数据科学家和数据工程师离职的主要原因。大体上,这些原因分为三类:经济、技术和环境。雇主需要解决这三个问题,才有机会长期留住他们的数据科学员工。

经济原因

我认为,经济原因是相当清楚和众所周知的。许多许多雇主不知道如何给数据科学家和工程师的技能定价,在缺乏良好智能的情况下,他们定价过低。

在 LinkedIn 上最近的一个例子中,Moez Ali 发布了一个招聘信息,要求有 6 年以上工作经验的人,但描述为“入门级”,并提供大约 65,000 美元的工资。有很多很多这种招聘的例子,包括天真的招聘,要求有 5 年以上的经验,在一个软件包中存在不到 3 年。

像这样发布招聘信息会暴露出雇主对他们要招聘的角色和技能一无所知,这对于任何称职的数据科学家/工程师来说都是一个很好的信号,表明他们将加入一个不重视他们技能的环境。除了反映在薪酬上,这种缺乏认可也很可能延伸到影响工作满意度和保留率的其他方面,就像下面段落中的一些原因一样。

技术原因

即使雇主支付高薪,如果他们不致力于支持数据科学家/工程师工作的技术环境,他们也无法留住他们。数据科学家和工程师对他们的方法的有效性和效率充满热情,他们希望使用最新的技术。以下是许多组织中经常遇到的技术难题的几个例子:

  1. 没有对数据治理/工程的承诺。许多组织不会投资于企业数据的工程层,这意味着数据专业人员需要不断处理混乱、不一致的源系统数据。这就产生了“80%的数据科学是数据清理”的格言。事实并非如此,但遗憾的是,在许多组织中,情况确实如此。
  2. 没有使用 GitHub/版本控制。这很难想象,但在许多环境中,人们仍然通过电子邮件相互发送代码,或者通过 Box 或 Sharepoint 共享代码。试图以这种方式解决和重用代码令人难以置信地令人泄气。
  3. 不支持工装。在许多组织中,数据科学家不得不下载他们自己的 ide 和其他工具,并努力发布他们的工作,因为缺乏这样做的平台。在数据科学家还不存在的时候,他们经常被防火墙和安全层所困扰。由于缺乏在 AWS 或其他云提供商上托管企业数据或代码的策略,许多最新的云工具都不可用。所有这些都让数据科学家觉得他们被关进了上世纪的工具里。
  4. 强制低效/过时的产出。围绕 Powerpoint 和其他工具构建的组织沟通文化未能适应,数据专业人员被迫使用效率低下的手动软件生成所有结果。太多的数据科学家仍然花费大量时间编辑 Powerpoint 幻灯片。
  5. 没有培训/发展支持。在一个新的更好的技术工具层出不穷的职业生涯中,数据科学家和工程师应该得到良好的支持,以参加与其领域相关的最新技术会议和学习计划。他们不应该为此去乞求或通过多个审批层。这应该很好地反映在数据专业人员的组织预算中。

环境原因

如果你足够幸运,能为符合上述所有条件的罕见雇主工作,那么离开的风险就很大,因为你可能正从煎锅走向火坑。但是还有一个因素需要考虑,那就是数据专业人员的工作环境。

许多组织中的经理、领导和合作者根本不了解数据科学家和工程师的工作,这可能会导致数据专业人员受到伤害,损害他们的自尊和价值感。例子包括:

  • 期望他们执行卑微的数据任务。你不需要数据科学家或工程师来下载数据集,或在 Excel 中运行简单的分析。这不是你雇佣数据科学家或工程师的原因。
  • 不信任工作只是因为没有努力去理解它。你雇佣这些专业人士是为了将更先进的方法带到桌面上,所以当他们提出这样的方法时,你不应该因为你没有时间完全理解而对他们打折扣。
  • 没有阐明职业发展。数据科学家和工程师和其他人一样雄心勃勃。如果你不能清晰地描绘出一条路径,让他们在你的组织中进步,提升影响力和回报,他们就像其他人一样可能会离开。
  • 完全根据非技术标准对其进行评估。数据科学家和工程师之所以被聘用,是因为他们拥有非常具体且必需的技术技能。他们不应该被迫完全按照非技术人员的评估标准来执行。这表明了一种文化,在这种文化中,数据技能比非数据技能更不受重视,并反映了一种组织自大,这可能会伤害数据专业人员的自尊。

我肯定我错过了许多数据专业人员离职的其他原因,但我提到的这些原因是我观察到的雇主中最常见的。许多组织可以从对这一重要问题的更多认识或教育中受益,所以请在下面的评论中随意添加您的任何意见。

为什么数据科学家仍然不能拥有一切:笔记本的缺点

原文:https://towardsdatascience.com/why-data-scientists-still-cant-have-it-all-the-downside-of-notebooks-54e56e03c9bf

计算机科学的遗产已经用 IDE 优先的开发过程诅咒了数据科学家,即使这只鞋不太合适。

不是一个理想的数据科学工作流程—照片由拍摄在 Unsplash 上比较纤维

介绍

组织已经努力建立数据专家团队来解决棘手的问题,但是这些团队使用的工具仍然类似于过去代码繁重的集成开发环境(ide)。计算笔记本有许多品牌(Jupyter、Colab、Sagemaker、Databricks 等),是数据科学家的主要工具。

ide 反映了软件编程的遗产,而数据科学实际上反映了与传统软件编程完全不同的实践。数据科学家迅速改变领域,必须自己争论数据、产生分析、共享结果和生产。这个工作流程不仅有许多步骤,而且需要与许多利益相关者互动。因此,很明显,为个人编码而优化的笔记本电脑不能满足多角色练习的所有方面。

最近我们看了微软研究院 2020 年写的一篇论文,想和大家分享一下成果。研究人员进行了一项混合方法的研究,通过采访和调查专业数据科学家来检查计算笔记本是否满足数据科学家的需求。虽然计算笔记本为数据科学提供了快速、互动的空间,但微软研究得出结论,笔记本在几个关键领域失败了,包括设置、探索性数据分析、可靠性、共享和可再现性/可重用性。让我们开始吧。

加载和清理数据可能是一个令人沮丧的手动过程

在这个过程的开始,当从外部数据源导入多个数据集时,用户可能会面临复杂的问题。有时,这需要从云中下载数据到本地数据源,并在以后重新上传。虽然一些图书馆缓解了这个问题,但数据科学家必须有意识地在他们的工作流程中增加额外的步骤来解决这个问题。此外,当数据集太大时,笔记本电脑可能难以运行,必须付出额外的努力来完全处理大量数据。

在这些初始阶段,用户还必须能够轻松清理他们的数据集。数据清理是一个繁琐的过程。笔记本电脑很难简化数据清理过程,因为用户仍然需要复制和粘贴稍加修改的相同行,这为人为错误留下了空间。

“快速”探索和分析可能会耗费不必要的时间

建模过程通常既复杂又耗时。偶尔,它会导致内核崩溃。笔记本用户也不能同时评估备选方案,允许快速调整,并提供即时反馈。此外,可视化很难在笔记本上定制和调整,导致不断复制和粘贴。可视化效果受笔记本空间的限制,在导入/导出时可能会意外渲染。这两个步骤都需要迭代;然而,没有简单有效的迭代方法。

大型数据集导致笔记本不一致

随着数据集越来越大,内核崩溃的可能性也越来越大。如果操作员在执行过程中失败,笔记本或数据将变得不一致。部分数据可能已经发生了一些变化,但不是全部,并且很难理解笔记本崩溃时在该过程中的什么地方停止了。为了支持这一点,我们可以部署像 Spark 这样的重型系统来实现我们想要的结果,但是这给需求增加了另一层基础设施和另一套专门知识。

不支持笔记本电脑上的轻松协作

协作有多种形式,但笔记本通常不支持共享选项。狭义地说,共享笔记本可能只是共享代码,如果不共享底层数据和/或环境设置,这通常是没有用的。这需要除了共享笔记本之外的额外指令和步骤,尽管基于云的系统在环境不可知方面已经变得更好。

在当前的远程环境中,实时并行协作可能极其重要。即使合作者具备编程知识,注释和代码也不能取代画外音和现场互动。但更糟糕的是,数据科学家需要向没有相同数据背景的利益相关者或客户展示他们的发现,而计算笔记本使这成为不可能。

在笔记本上复制结果和重用代码并不是一件容易的事情。

如果其他人要复制笔记本结果,他们也必须确保环境设置和定制完全相同。如果用户没有与原始笔记本的作者相同的扩展名,这可能会失败。重用和改编代码也很困难,因为可能很难重新创建第一次编写笔记本时创建的依赖关系。

此外,还有一个更高级的复制版本,它主要是将样板代码和流程转换成可重用的模板。数据科学家经常对新数据重新运行相同的分析,或者在多个项目中遵循相同的工作流程。在这些情况下,将以前执行的代码保存到可重用的片段中的能力极大地提高了数据科学家的效率。

结论

除此之外,计算笔记本还存在其他一些问题,特别是在以下情况下:管理代码、保存笔记本内部和之间的代码历史、维护数据安全性和访问控制,以及部署到生产环境中。计算笔记本仍然非常有用,但即使是现代的实现仍然给数据科学家留下了很多问题。解决这些棘手问题可以显著改善用户体验,并减少专业数据科学家每天必须使用的工具数量。

我们自己的产品 Einblick 和许多其他产品一样,已经采取了一种新的方法来解决这些问题。当今的解决方案包括:

  • 借鉴 Figma 或 Miro 的经验,通过实时白板和演示模式实现协作,以便数据科学家可以轻松地与领域专家一起工作。
  • 通过智能采样或强大的计算引擎支持大型数据集。
  • 使用 AutoML 和其他传统的“无代码”特性来抽象出可重复的任务。
  • 将 ML 管道和工作流程转化为可共享的“功能”,以允许在不同的分析中重复使用。

随着数据变得越来越流行和重要,数据科学家使用的工具必须重新评估。将需要多功能工具,要求笔记本电脑的未来迭代变得协作、可扩展和高效。提高数据科学家的生活质量会对公司的整体发展产生巨大影响。

原帖https://www . ein blick . ai/blog/problems-with-notebooks-msftpaper/

引用

Souti Chattopadhyay,Ishita Prasad,Austin Z. Henley,Anita Sarma 和 Titus Barik。2020.计算笔记本有什么问题?痛点、需求和设计机会。2020 年中国计算机学会计算系统中人的因素会议论文集(CHI '20)。美国纽约州纽约市计算机械协会,1-12。https://doi.org/10.1145/3313831.3376729

为什么人们说将一个 ML 模型部署到生产中如此困难?

原文:https://towardsdatascience.com/why-do-people-say-its-so-hard-to-deploy-a-ml-model-to-production-814548d446b5

多方面的变化给 ML 服务带来了特殊的挑战

丹·洛马尔在 Unsplash 上拍摄的照片

你已经听到过这样的说法,你已经听到过这样的文字,你已经听到过分析师和供应商在屋顶上唱着这样的话: 87%的数据科学项目从未投入生产

这是为什么呢?

当然,这要视情况而定,但更准确的答案是构建 ML 服务比构建其他类型的软件更复杂。虽然 ML 应用程序与传统的软件和数据工程项目有许多相同的复杂性,但是 ML 引入了一个新的工件,增加了一层复杂性:模型本身。

我是这样开始思考的:

  • 在传统的软件工程中,你主要关心的是代码
  • 在数据工程中,你主要关心的是代码数据
  • 在 ML 工程中,你主要关心的是代码、数据、和模型

图片作者作者

也不仅仅是我。在最近的一篇文章中,软件思想领袖马丁·福勒分享了为什么 ML 服务如此复杂:

“除了代码之外,对 ML 模型和用于训练它们的数据的更改是另一种类型的更改,需要管理并融入软件交付过程。”

在本文中,我将深入探讨您需要了解这三个组件中的每一个以及它们如何相互作用,并提供一些管理它们以部署您的模型的技巧和建议。

维度 1:代码

代码在 ML 应用程序中的角色本质上是“粘合剂”,它:

  • 公开一个 API
  • 转换数据以提取适当的特征
  • 使用模型进行推理
  • 整合业务逻辑

在很大程度上,它是一个相当已知的量,并具有确定性。换句话说,给定相同的输入,它将产生相同的输出。即使你的代码是有状态的(不推荐),我也认为“状态”是输入的一部分。

以下是您在管理 ML 服务代码时可能面临的几个挑战:

对代码的更新会导致回归

特征提取代码通常由数据科学家编写。当需要创建 API 时,开发人员需要将代码从培训环境迁移到预测服务。此外,他们可能必须将服务的输入(可能是一个 REST 请求)转换成可用的数据。开发人员和数据科学家绝对希望更新这些代码,因为他们对服务进行迭代,这可能会导致回归。

温馨提示:

  • 除非有令人信服的理由,否则不要使用 Python 创建模型服务。大多数数据科学家使用 Python。它使部署过程更加简化。根据我的经验,用户在重新部署一个新模型时会从“几周/几个月”减少到几天。有些团队需要高得离谱的性能,宁愿把所有代码都转换成 Rust/Go。大多数人不知道。对了,AWS Sagemaker 是用 Python 写的。
  • 请记住,即使在 Jupyter 笔记本上也要实施良好的编码实践。你会惊讶地发现,什么样的代码最终会进入生产环境。

依赖性更新可能会产生不可预见的后果

预测服务中的依赖项非常重要,因为如果没有精确配置,不仅代码的行为可能与预期不同,模型本身也可能做出与定型环境不同的预测。为了使服务正确运行,应该使用 ML 库、运行时和依赖项的正确版本。也就是说,依赖关系必须不时更新,以至少跟上安全补丁。

提示:确保您使用的 Python 和 ML 库的版本与用于训练模型的版本相同。您可以使用“pip 冻结”来确定您正在使用的版本。

部署环境可能不稳定

可伸缩预测服务需要适当的环境才能正确运行代码。例如,特定的 ML 库只能在特定的 OS 发行版上运行。Docker 是配置可再现环境的标准,但是为 ML 用例配置 Docker 可能极具挑战性。如果配置正确,它将为您提供一个干净的工件,您可以从中部署到许多不同的服务,并提供在本地运行服务的能力,以便您可以在出现问题时进行调试。

温馨提示:

  • 确保 Docker 映像(或相关的运行时)公开了服务的健康、文档和监控端点。
  • 对于 GPU 支持,使用 Nvidia 的 docker image ,它为 GPU 工作负载提供了一个良好的开箱即用基础。相信我,你不会想在“cuda 地狱”里结束的

维度 2:数据

一旦您解决了与管理代码相关的关键挑战,就该查看数据了。

数据在某种程度上是确定性的,但是花费了数年时间来构建数据管道,很难知道你将接收什么类型的数据和多少数量的数据。你会一直感到惊讶。出于这个原因,我会说数据是拼图中最易变的一块。

一旦您的服务投入生产,就无法知道数据将如何随时间变化——这是否意味着突然收到坏数据,或者只是随着用户行为的改变而经历数据的变化。虽然数据变化通常无法预测,但您仍然可以通过某些策略来管理它。

数据可能会漂移并导致服务质量下降

随着时间的推移,数据的变化可能会导致各种问题:模型可能会产生不太准确的预测或根本无法执行。数据漂移,或生产输入数据的变化,可能发生在久而久之或随着季节的变化。重要的是要知道它是否正在发生,以便您可以在必要时重新培训您的模型。

温馨提示:

  • 经常快速部署会让您对自己的渠道更有信心。不仅如此,它还有其他好处,如防止因输入数据漂移而出现问题。
  • 使用 ML 专用监控工具,如 WhyLabs显然,aiAporia 可以帮助检测数据漂移和监控性能。

模型性能也可以改变久而久之,但可能更难以监控,因为它需要您将预测与下游结果结合起来。例如,将 ML 驱动的产品推荐和产品是否被消费者实际购买之间的点连接起来。

提示:监控性能通常包括与下游指标相结合。确保将您的推理结果发送到与您想要连接的指标相同的地方(可能是一个数据仓库)。

坏数据会中断服务

API 是一个强大的构造,因为它向外界公开了功能。这意味着您不太可能控制向您的服务发送什么。意外数据和不正确的数据一样糟糕,很可能在某个时候您的服务会同时收到这两种数据。尽量确保这不会削弱你的系统。

提示:使用像 Pydantic 这样的数据验证框架来验证传入的数据,这样它就不会意外地中断您的服务。

需要新数据来验证新模型

随着生产中数据的变化,您可能不需要冒险部署新的模型。因此,用您仍在验证的模型来测试生产数据会很有帮助。获取生产数据可能很困难,因为生产环境通常部署在安全的环境中。

提示:使用像 Istio 或 AWS App Mesh 这样的服务网格可以帮助分散生产流量,并帮助使用影子管道验证新模型。

维度 3:模型

最后一个维度当然是模型本身。

我认为模型是一个确定性函数,尽管它是三维空间中最黑的一个。这类似于阅读“意大利面条代码”的体验,即使是最有经验的工程师也无法理解:一个经过训练的模型由复杂的向量组成,这些向量本身就非常难以理解,但给定一个特定的输入,输出对于模型的给定版本应该总是相同的。

模型可能会发生变化,因为数据科学家正在迭代模型性能,或者正在自动重新训练模型,以保持模型使用最新数据进行训练。一个模型在生产的过程中有很多机会崩溃。

模型可能很难复制

ML 框架有不同的方法来保存模型,以确保预测的可重复性。根据保存模型的方式,可能是序列化 Python 类,也可能只是保存模型的权重。这两种方法都可能无法重现模型,这取决于训练环境的上下文。如果模型保存不正确,那么它可能会在生产中产生不稳定的预测。

提示:保存模型时要做好调查,确保这是推荐的保存方式。例如, Pytorch 拥有文档,它解释了根据您的上下文来保存模型的各种方法。

人和系统之间的交接可能很复杂

保存模型可能会产生多个包含模型权重和相关元数据的文件。所有这些都是再次实例化模型所必需的。您将希望将这些工件移动到一个集中的位置,在那里自动化部署管道可以将模型交付到生产中。

问题是生产 CI/CD 管道可能位于云中的安全环境中。设计一个从数据科学家的笔记本电脑(或远程培训环境)到生产的安全、简化的系统可能会很复杂。

提示:试着找到一个标准,你可以用它来协调模特培训和模特服务。像 MLFlowBentoMLTFServingCortex 这样的工具有助于将模型协调到模型注册中心,并最终到达部署的目的地。例如,使用 MLFlow 管理您的实验和培训,使用 BentoML 管理模型服务和部署。

你可能会意外失去优秀的模特

为了回滚坏的更新或者调试工作模型,持久化模型的各种版本是极其重要的。您甚至可能想要在生产中运行多个模型版本(称为 A/B 测试),以便衡量哪个模型运行得最好。更复杂的部署可以运行模型版本实验,如" multi-arm bandit "可以对模型进行实时评分,并将更多流量导向最佳模型。

提示:像 S3 或谷歌云存储这样的工具可以作为共享模型存储库,数据科学家和开发人员可以使用它来共享模型,这是一个很好的解决方案。

结论

拥有三个不同且不断变化的维度所带来的复杂性并不小,尤其是考虑到开发过程通常涉及多个利益相关者。我们仍然处于开发最佳实践的早期,因为操作 ML 项目是一个如此新的领域。随着更多的工具和从业者进入这个市场,毫无疑问,最佳实践将开始出现,就像它们在传统软件、DevOps 甚至数据工程中出现的那样。

正如吴恩达所说,这些 MLOps 工具和流程的目标是让“人工智能成为一个高效而系统的流程”我们越能简化这些过程,公司就越能从 ML 中获益。

为什么我们要最小化均方差?

原文:https://towardsdatascience.com/why-do-we-minimize-the-mean-squared-error-3b97391f54c

你有没有想过为什么我们要最小化平方误差?在这篇文章中,我将展示最著名的损失函数背后的数学原因。

彼得·塞坎在 Unsplash 上拍摄的照片。最小化平方误差就像试图到达谷底。

学习机器学习时首先遇到的话题之一是线性回归。它通常被认为是回归的最简单算法之一。就我而言,当我学习线性回归时——早在我攻读物理学学位的时候——有人告诉我,线性回归试图找到最小化数据平方距离之和的直线。数学上这是 y_p=ax+b ,其中 x 是将用于预测 y_t 的独立变量, y_p 是相应的预测, ab 是斜率和截距。为了简单起见,让我们假设 x∈R 和 y∈R 分别为 T16 和 T17 和 T18。我们想要最小化的量——也就是损失函数——是

MSE 损失函数

这种损失背后的直觉是,我们希望惩罚更多的大错误,而不是小错误,这就是为什么我们要平方错误项。对于损失函数的这种特殊选择,10 个 1 单位的误差比 1 个 10 单位的误差更好,在第一种情况下,我们将损失增加 10 个平方单位,而在第二种情况下,我们将损失增加 100 个平方单位。

然而,虽然这很直观,但似乎也很武断。为什么使用平方函数,而不使用指数函数或任何其他具有类似属性的函数?答案是这个损失函数的选择没有那么随意,可以从更根本的原理推导出来。我给你介绍一下最大似然估计

最大似然估计

在这一节中,我将介绍最大似然估计,这是我在机器学习中最喜欢的技术之一,我将展示我们如何将这一技术用于统计学习。

基础

首先是一些理论。考虑一个数据集 X ={x1,…,xn} 从分布 p_real(x) 独立抽取的 n 个数据点。我们还有分布 p_model(θ,x) ,它由参数 θ 索引。这意味着对于每个 θ ,我们有不同的分布。例如,可以有 p_model(θ,x)=θ exp()-θ* x)*,也就是指数分布。

我们要解决的问题是找到使 X 被 p_model(θ,x)* 生成的概率最大的 θ* 。对于所有可能的 p_model 分布,这是最有可能生成 X 的分布。这可以形式化为

由于来自 X 的观测值是独立提取的,我们可以将等式改写为

虽然从数学的角度来看,这个方程完全没问题,但它存在一些数值问题。特别是,我们在乘以概率密度,密度有时可能非常小,所以总乘积可能会有下溢问题——即:我们无法用 CPU 的精度来表示值。好消息是,这个问题可以通过一个简单的技巧来解决:只需将 log 应用于乘积,并将乘积转换为总和。

由于对数是一个单调递增的函数,这个技巧不会改变 argmax

例子

让我们设计一个例子,看看如何在实际问题中使用这种技术。假设您有两个遵循高斯分布的数据点,或者至少这是您所怀疑的,并且您想要找到这些数据点的最可能的中心。

点由两个分别以(3,3)和(-3,-3)为中心的高斯分布生成。

我们的假设是这些分布遵循一个单位协方差的高斯分布,即:【σ=[[1,0],[0,1]]。因此,我们要最大化

其中θ=(θ_1、θ_2)θ_1**θ_**2是中心

根据 MLE,使用下面的片段可以得到最合理的中心

**from** scipy.optimize **import** minimize
**import** numpy **as** np
**class** **ExampleMLE**:
    **def** **__init__**(self, x1, x2):
        self.x1 **=** x1
        self.x2 **=** x2
    **def** **loss**(self, x):
        mu1 **=** (x[0], x[1])
        mu2 **=** (x[2], x[3])
        log_likelihood **=** (**-** 1**/**2 ***** np.sum((self.x1 **-** mu1)******2) 
                          **-** 1**/**2 ***** np.sum((self.x2 **-** mu2)******2))
        **return** **-** log_likelihood *# adding - to make function minimizable
# x1 and x2 are arrays with the coordinates of point for blob 1 and 2 respectively.* p **=** ExampleMLE(x1**=**x1, x2**=**x2) 
res **=** minimize(p.loss, x0**=**(0, 0, 0, 0))
**print**(res.x)

在下图中,我们可以看到最合理的最大似然生成分布。在这种特定情况下,真正的中心在(3, 3)(-3, -3)中,最优发现值分别是(3.003, 3.004)(-3.074, -2.999),因此该方法似乎是可行的。

最大似然法找到的最优高斯分布的原点和等高线图。

使用最大似然法进行预测

在上一节中,我们已经看到了如何使用 MLE 来估计分布的参数。但是同样的原理可以推广到预测给定 xy ,利用条件概率P(Y|X;θ) 。在这种情况下,我们想要估计我们的模型的参数,在给定 x 的情况下更好地预测 y ,这是

使用和以前一样的技巧

现在,产生真实数据的过程可以写成 y=f(x)+ϵ ,其中 f(x) 是我们要估计的函数, ϵ 是过程的固有噪声。这里我们假设 x 有足够的信息来预测 y ,再多的额外信息也无法帮助我们预测噪声 ϵ 。一个常见的假设是这种噪声是正态分布的,即: ϵ∼N(0,σ ) 。这种选择背后的直觉是,即使知道描述系统的所有变量,你总会有一些噪声,而这种噪声通常遵循高斯分布。例如,如果你取同一个城镇中所有相同年龄的女性的身高分布,你会发现一个正态分布。

因此,对于我们的情况,条件概率的一个好选择是

其中 f^(x) 是我们的模型,由 θ 索引。这意味着我们的模型 f 将预测高斯的平均值。

现在把条件概率代入我们想要最大化的方程,我们得到

其中 y_ip 是输入 x_i 的回归模型的输出。请注意, nσ 都是常量值,因此我们可以将它们从等式中去掉。因此,我们想要解决的函数是

这相当于最小化平方误差损失!

但是为什么呢?我们在损失函数背后的直觉是,它惩罚大的小的错误,但是这与条件概率和正态分布有什么关系呢?关键是极值在正态分布中不太可能出现,所以它们会对可能性产生负面影响。例如,对于p(x)= N(x;0,1)log⁡p(1)∶1.42,而对数⁡p(10)≈−50.92 。因此,在最大化可能性时,我们将首选避免极值(y _ t-y _ p)θ 值。那么问题的答案是为什么我们应该最小化 MSE?,因为我们假设噪声呈正态分布。

结论

我们刚刚看到,最小化平方误差不是一个任意的选择,而是有理论基础的。我们还看到,它来自于假设噪声呈正态分布。我们在这篇文章中研究的同样的过程可以用来获得多种结果,例如,方差的无偏估计、维特比算法、逻辑回归、机器学习分类等等。

这个故事最初发表在这里:amolas.dev/posts/mean-squared-error/

为什么除了训练集和测试集之外,我们还需要一个验证集?

原文:https://towardsdatascience.com/why-do-we-need-a-validation-set-in-addition-to-training-and-test-sets-5cf4a65550e0

用简单的英语解释培训、验证和测试集

舒米洛夫·卢德米拉在 Unsplash 上的照片

您可能已经熟悉了训练集和测试集。在训练 ML 和 DL 模型时,通常会将整个数据集分成训练集和测试集。

这是因为您需要一个单独的测试集来根据看不见的数据评估您的模型,以提高模型的泛化能力。

我们没有在用于训练的相同数据上测试我们的模型。如果我们这样做,模型将试图记忆数据,而不会对新的看不见的数据进行归纳。

验证集也是原始数据集的一部分。就像测试集一样,是用来评估模型的。然而,这并不是最终的评价。

机器学习是一个高度迭代的过程 —吴恩达

机器学习不是一蹴而就的。在找到您寻找的最佳模型之前,您需要通过为超参数设置不同的值来试验不同的模型。

这就是验证集发挥作用的地方。

训练集与验证集与测试集

培训、测试和验证是 ML 工作流程中的关键步骤。对于每一步,我们都需要一个单独的数据集。因此,entree 数据集分为以下几个部分。

  • 训练集:就数据集的大小而言,这是最大的部分。训练集用于训练(拟合)模型。模型参数从训练数据中学习它们的值(规则或模式)。换句话说,训练集用于在超参数的固定组合上拟合模型的参数。
  • 验证集:我们的模型训练过程不是一次性的过程。我们必须通过尝试超参数的不同组合来训练多个模型。然后,我们在验证集上评估每个模型的性能。因此,验证测试对于超参数调整或从不同模型中选择最佳模型非常有用。在某些情况下,验证集也被称为开发(Dev)集
  • 测试集:在调整过程之后,我们选择具有最佳超参数组合的最佳模型。我们使用测试集来衡量该模型的性能。

理解训练集和测试集的作用是很简单的。您可能还不熟悉验证集的作用,也就是今天文章的标题。

让我们看一个例子。

比方说,我们希望通过尝试不同的n_estimatorsmax_depth超参数值,在数据集上训练一个随机森林分类器。

from sklearn.ensemble import RandomForestClassifierrf_clf = RandomForestClassifier(**n_estimators=?, max_depth=?**)

n_estimators的默认值是 100,而max_depth的默认值是无。但是我们对这些默认值不感兴趣。相反,我们想尝试以下值。

  • n _ 估计值: 100,500,1000 (3 个不同的值)
  • 最大深度: 2,3,5,10 (4 个不同的值)

超参数有 12 (3 x 4)种不同的组合。这意味着我们将通过一次考虑每个超参数组合来构建 12 个不同的随机森林分类器。举个例子,

rf_clf_1 = RandomForestClassifier(**n_estimators=100, max_depth=2**)

我们在训练集上训练第一个模型,在验证集上评估它的性能,记录它的性能分数并将其放在一边。

rf_clf_2 = RandomForestClassifier(**n_estimators=100, max_depth=3**)

我们在相同的训练集上训练第二个模型,在相同的验证集上评估它的性能,记录它的性能分数并将其放在一边。

同样,我们训练所有 12 个模型并记录性能分数。然后,我们选择具有最佳性能得分的模型,并记下其超参数值。假设这些超参数值是n_estimators=500max_depth=3

rf_clf_best = RandomForestClassifier(**n_estimators=500, max_depth=3**)

最后,我们在测试集上对该模型进行了评估。

总之,训练集用于拟合模型参数,验证集用于调整模型超参数。最后,我们使用测试集来评估最佳模型。

有人可能会问,为什么我们需要一个单独的验证集。我们不能使用训练集而不是使用单独的验证集来调整模型超参数吗?答案是,我们也使用验证测试进行某种测试,测试不应该在用于训练的相同数据上进行。

使用验证和测试集将提高模型对新的未知数据的概括能力。

此外,请注意,如果您不打算通过尝试超参数的不同组合来优化模型,则不需要验证集(冗余)。在这种情况下,您可以只使用训练集和测试集来继续训练过程。

如何创建训练集、验证集和测试集

现在,您已经熟悉了训练集、验证集和测试集的用法。在本节中,我们将讨论如何在 Python 中创建这些集合。

我们将讨论创建训练集、验证集和测试集的 3 种不同方法。

1.使用 Scikit-learn train_test_split()函数两次

您可能已经熟悉了 sci kit-learntrain _ test _ split()函数。这里,我们使用它两次来创建训练集、验证集和测试集。下面是怎么做的。

首先,我们通过分配原始数据集中 70%的样本来创建训练集。因此, train_size 为 0.70。

from sklearn.model_selection import train_test_splitX_train, X_rem, y_train, y_rem = train_test_split(X, y,
                                                  **train_size=0.70**)

训练装置包括 X_trainy_train 部件。 X_remy_rem 部分属于剩余的数据集,用于在下一步创建验证和测试集。

X_valid, X_test, y_valid, y_test = train_test_split(X_rem,y_rem,
                                                    **test_size=0.15**)

验证集包括 X_validy_valid 部分。 X_testy_test 零件属于测试组。在这里,我们使用了test_size=0.15。这意味着对于每个验证和测试集,我们得到原始数据集中 15%的样本。

2.使用 Fast-ML 训练 _ 有效 _ 测试 _ 分离()函数

在上面的方法中,您需要调用 train_test_split() 函数两次来创建训练集、验证集和测试集。通过使用 Fast-ML 库中的train _ valid _ test _ split()函数,您可以通过一次函数调用创建所有集合!

X_train, y_train, X_valid, y_valid, X_test, y_test = train_valid_test_split(X, y, **train_size=0.70**, **valid_size=0.15**, **test_size=0.15**)

3.使用 Scikit-learn GridSearchCV()和 RandomizedSearchCV()函数

在这里,我们不需要显式地创建验证集,因为这些函数会在后台创建它以及 k-fold 交叉验证。

首先,我们需要使用 Scikit-learntrain _ test _ split()函数将数据集分成训练集和测试集。

X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    **test_size=0.15**)

测试集包含原始数据集中 15%的样本,而训练集包含 85%的样本。

然后,我们用训练集执行 GridSearchCV()或 RandomizedSearchCV()函数。

from sklearn.model_selection import GridSearchCVgs = GridSearchCV(cv=5)
gs.fit(X_train, y_train)

找到最佳模型后,我们使用之前创建的测试集对其进行测试。

通过在 GridSearchCV()函数中设置cv=5,该算法将训练集分成 5 个部分,每个部分包含 17% (85/5)的样本。在每次迭代中,都会保留一个折叠作为验证集,如下图所示。

(图片由作者提供)

在每次迭代中,验证集都会发生变化,如图所示。在计算绩效得分时,将取平均值。

如果你不熟悉 k 倍交叉验证、网格搜索或随机搜索,请阅读我写的以下文章。

[## 超参数优化的网格搜索和随机搜索的 Python 实现

towardsdatascience.com](/python-implementation-of-grid-search-and-random-search-for-hyperparameter-optimization-2d6a82ebf75c)

训练、验证和测试数据集需要多大?

这是一个很好的问题,也很难给出准确的答案,因为集合大小取决于以下因素。

  • 你拥有的数据量
  • 模型的表现应该有多好
  • 检测绩效得分的微小变化

一个重要的规则是,您应该为定型集分配尽可能多的数据。为训练集分配的数据越多,模型从数据中学习规则的能力就越强。

另一个规则是,在分割数据集之前,您应该总是打乱数据集。

最后,每个数据集应该是原始数据集的一个很好的代表性样本。

Scikit-learn 默认的测试集大小是原始数据的 25%。

对于只有数百或数千行的小数据集,最好使用0.8 : 0.1 : 0.10.7 : 0.15 : 0.15进行训练、验证和测试集。

对于拥有数百万或数十亿行的大型数据集,您不需要为验证和测试集分配更大比例的数据。最好使用0.98 : 0.01 : 0.010.96 : 0.02 : 0.02进行训练、验证和测试集。

验证(开发)集应该足够大,以检测你正在尝试的算法之间的差异 —吴恩达

验证集用于超参数调整。它应该足够大,以捕捉性能分数的微小变化,从而突出最佳模型。

摘要

现在,您对训练集、验证集和测试集有了一个清晰的概念。作为总结,记下以下事情。

  • 训练集用于模型训练(学习参数)
  • 验证集用于超参数调整。
  • 测试集用于最佳模型的最终评估。
  • 如果您不打算执行超参数调优,则不需要验证集(冗余)。
  • GridSearchCV()和 RandomizedSearchCV()函数在后台创建验证集。因此,在使用这些函数时,我们不需要显式地创建验证集。

今天的文章到此结束。如果你对这篇文章有任何疑问,请在评论区告诉我。

感谢阅读!

下一篇文章再见!一如既往,祝大家学习愉快!

成为会员

如果你愿意的话,你可以注册成为会员,以获得我写的每一个故事的全部信息,我会收到你的一部分会员费。

https://rukshanpramoditha.medium.com/membership

订阅我的电子邮件列表

订阅我的电子邮件列表,再也不会错过精彩的故事了。我一点击发布按钮,你就会在收件箱里收到每一篇文章。

https://rukshanpramoditha.medium.com/subscribe

拉克山·普拉莫蒂塔
2022–04–11

我们为什么要在机器学习模型中设置随机状态?

原文:https://towardsdatascience.com/why-do-we-set-a-random-state-in-machine-learning-models-bb2dc68d8431

随机状态=42

图片来自 Pixabayaalmeidah

你可能已经在你的机器学习模型中使用了 随机状态 。你知道 随机状态 是一个模型超参数,用来控制机器学习模型中涉及的随机性吗?

在 Scikit-learn 中,随机状态超参数用random_state表示。它通常采用下列值之一。

  • 无:这是默认值。这允许函数使用来自np.random的全局随机状态实例。如果你用random_state=None多次调用同一个函数,这个函数在不同的执行中会产生不同的结果。
  • int: 我们可以用整数来表示random_state。是啊!我们可以使用包括 0 在内的任何整数,但不能使用负数,只能使用正整数。最流行的整数是 0 和 42。当我们对random_state使用整数时,该函数将在不同的执行中产生相同的结果。只有当我们改变整数值时,结果才会改变。

使用随机状态——一个经典的例子

下面我们用一个例子来看看 随机态 是如何工作的。为此,我们使用 Scikit-learn 的 train_test_split() 函数和 LinearRegression() 函数。 train_test_split() 函数用于将数据集分成训练集和测试集。默认情况下,该函数在分割前会对数据进行混洗(使用shuffle=True)。 train_test_split() 函数中的随机状态超参数控制洗牌过程。

有了random_state=None,我们在不同的执行中得到不同的训练和测试集,洗牌过程失去了控制。

使用random_state=0,我们在不同的执行中得到相同的训练和测试集。使用random_state=42,我们在不同的执行中得到相同的训练和测试集,但是在这一次,训练和测试集与之前使用random_state=0的情况不同。

训练集和测试集直接影响模型的性能得分。因为我们在 train_test_split() 函数中为random_state获得了具有不同整数值的不同训练和测试集,所以随机状态超参数的值间接影响了模型的性能得分。

现在,请看下面的代码。

随机状态超参数的影响(作者代码)

现在,我们为random_state尝试整数值 0、35 和 42,并重新执行上述代码三次。我们会得到以下结果。

  • 对于random_state=0,我们得到 909.81 的 RMSE。
  • 对于random_state=35,我们得到 794.15 的 RMSE。
  • 对于random_state=42,我们得到 824.33 的 RMSE。

根据随机状态超参数中使用的整数值,我们得到模型的三个显著不同的 RMSE 值。

现在,有一个明确的问题。我们接受什么样的价值观为正确的 RMSE 价值观?我们不接受任何单一的价值。相反,我们得到这些 RMSE 值的平均值。最好尽可能多地(例如 10 次)重新执行上述代码,并获得平均 RMSE。手动做这个很无聊。相反,我们可以使用 sci kit-learncross _ val _ score()函数来自动完成这项工作。

执行交叉验证以获得平均 RMSE (作者代码)

交叉验证结果(图片由作者提供)

使用随机状态的其他流行的机器学习算法

train_test_split() 函数是一个使用随机状态的经典例子。除此之外,下面的机器学习算法包括随机状态超参数。

  • k means():k means 算法中的random_state控制质心初始化的随机数生成。更多详情,请看我写的这篇文章
  • RandomizedSearchCV():RandomizedSearchCV 函数中的random_state控制在不同执行中获取超参数组合样本的随机化。更多详情,请看我写的这篇文章
  • DecisionTreeRegressor()DecisionTreeClassifier():这些算法中的random_state通过搜索最佳特征来控制节点分裂过程中涉及的随机性。它将定义树结构。
  • RandomForestRegressor()RandomForestClassifier():这些算法中的random_state控制两个随机过程——在创建树时引导样本,以及在创建每棵树的节点分裂过程中获取随机特征子集以搜索最佳特征。更多详情,请看我写的这篇文章
  • 椭圆包络():椭圆包络函数中的random_state决定了用于混洗数据的随机数发生器。更多细节,请阅读我写的这篇文章。

何时使用随机状态

以下几点给出了“我们为什么要在机器学习模型中设置随机状态”这个问题的答案—今日话题。

我们通常在机器学习模型中使用随机状态,原因如下。

  • 一致性:有时,我们需要模型的不同执行之间的一致结果。当我写数据科学教程时,我总是为机器学习模型中的随机状态设置一个整数值。这是因为我需要在不同时间运行模型时得到相同的结果,并且我希望您在试用我的代码时得到相同的结果。
  • 实验目的:有时候,我们手动调优我们的模型。在这些情况下,我们希望保持所有其他的超参数,包括随机状态常数,除了我们正在调整的那个。为此,我们可以为机器学习模型中的随机状态设置一个整数。
  • 提高模型性能:有时,您可以通过使用不同的随机状态多次运行您的模型来获得显著的性能提高。这是因为random_state也是一个超参数,我们可以调整它以获得更好的结果。这在编写教程和参加机器学习竞赛时非常有用。但是不建议在生产环境或其他类似的实际场景中使用这种方法,在这些场景中,准确度分数的微小变化都会严重影响最终结果。

何时不使用随机状态

这是一个令人困惑的问题。当您没有为随机状态超参数指定一个整数时,默认的None总是在后台应用。None允许函数使用来自np.random的全局随机状态实例。这也是模型所依赖的一种单随机状态!

换句话说,不指定随机状态并不意味着函数不使用随机状态。它使用一个由 NumPy 随机状态实例定义的。

这要危险得多,在生产环境、医疗领域等现实生活场景中应该避免。作为一个解决方案,我们可以通过做交叉验证来得到平均值,就像我之前讨论的那样。

摘要

不同类型的随机化任务涉及机器学习模型和其他相关功能。当分割数据集、分割决策树或随机森林中的节点、初始化聚类中的质心时,会发生随机化。随机状态超参数用于控制机器学习模型中涉及的任何此类随机性,以获得一致的结果。

我们可以使用交叉验证来减轻机器学习模型中涉及的随机性的影响。

随机状态超参数直接控制不同函数的多种类型的随机性。

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressorX_train, X_test, y_train, y_test = train_test_split(**random_state=42**)rf = RandomForestRegressor(**random_state=42**)

即使我们对两个随机状态使用了同一个整数,每个函数的随机性也是独立控制的。互不影响。

今天的帖子到此结束。

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

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

https://rukshanpramoditha.medium.com/membership

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

接下来阅读(推荐)——我写的!

通过例子学习如何做交叉验证。

了解随机森林如何在幕后工作,以及随机森林中涉及的两种随机性。

了解参数和超参数之间的区别。

https://rukshanpramoditha.medium.com/parameters-vs-hyperparameters-what-is-the-difference-5f40e16e2e82

特别感谢 Pixabay 上的 aalmeidah ,为我提供了这篇文章的封面图片。请注意,我稍微编辑了图像。

鲁克山·普拉莫蒂塔
2022–04–30

为什么我们在深度学习中使用交叉熵——第 1 部分

原文:https://towardsdatascience.com/why-do-we-use-cross-entropy-in-deep-learning-part-1-e787f885c1c

解释人工神经网络中最广泛使用的损失函数之一

第二部分可用 这里用

如果你在深度学习领域刚刚起步,看过一些专业文章,我很确定你遇到过以下任何一个术语:交叉熵二元交叉熵、分类交叉熵

都来源于同一个概念:,这个概念你可能从物理和化学上比较熟悉。但是,物理和人工智能有什么关系呢?公式从何而来?我们如何解读它们?我们将它们应用在哪些问题上?

熵、交叉熵和范畴交叉熵是人工智能领域中的重要概念。然而,没有多少课程或文章深入解释这些术语,因为正确地解释它们需要一些时间和数学知识。在这两个系列的文章中,我将尝试使用我在寻找类似本文的文章时收集的资源和直觉给出一个清晰的解释。此外,我将提供公式的正式数学描述以及它们的来源。

。在我的书目研究过程中,我发现了克里斯托弗·奥拉的 这篇 不可思议的文章,启发了我写这篇文章。如果你有时间,我强烈推荐你阅读它,并查看克里斯托弗的网站。

照片由 mahdis mousaviUnsplash 上拍摄

熵定义

在基础物理和化学的热力学课上,你可能对熵这个术语很熟悉,但它还有两个来自数学和计算机科学不同分支的概念:

物理学中的熵

根据经典热力学,熵是一个系统中无序程度的度量。**

一个物理系统可以被看作是一组粒子,每个粒子都有一个相关的能量。无序是指系统可以采用的可能组态的数量(也叫微观态,一个系统的组态越多,无序度越大,熵也就越大。

总能量为 5E 的三粒子系统所有可能的微观态。这些条代表与每个粒子相关的能量,例如对于微观状态 1:粒子 1 有 2E,粒子 2 有 2E,粒子 3 1E。因此,总的系统能量是 2E + 2E + 1E = 5E。图片由作者提供。

注 1 。如果你想了解更多关于物理学中熵的知识,请观看这个视频

统计学中的熵

从熵的热力学定义推导出,我们也可以把熵想成: “熵是随机变量不确定性的度量”

这么说吧:我们的随机变量是一个系统的微观状态(可能的能量配置),其中每个配置是我们的随机变量可以取的一个值。然后,假设每个微观状态发生的概率相同,我们的系统可以采用的配置越多,我们对系统实际所处的微观状态的不确定性就越大。

两个系统的概率分布:系统 1 有两个微观状态(m 1,M2),系统 2 有六个微观状态(M1,…,M6)。图片由作者提供。

统计学中对熵的另一种可能的理解可能是: 【熵是一个随机变量的信息量】 。因为我们对一个变量的结果越不确定,这个变量提供给我们的信息就越多。如果我们确定或几乎确定一个变量的结果,那么测量它就没有价值,因为它不会给我们提供相关的信息。

与系统 2 相似但熵较低的第三个系统。回想一下,所有的概率必须等于 1。图片由作者提供。

所以不确定性越高,信息量越高,熵也就越高。

信息论中的熵

信息论使用熵的概念来解释一个与物理学非常不同的概念, “熵是编码消息的最佳平均长度”

继续以微软为例,假设我们想将位于马德里(西班牙)的实验室的实验结果发送到世界各地的悉尼(澳大利亚)的阳光海滩。首先,我们必须决定我们将使用哪种编码系统来编写我们的消息(二进制、十六进制、ASCII 等等)。假设我们选择二进制编码来简化示例。
接下来,我们应该定义如何表示每个实验结果。由于我们有 6 个微状态,我们可以将它们表示为:

6 种微观状态的二进制表示。作者图片

另一种可能的编码是一键编码:

另一种可能的编码。图片由作者提供。

还有许多其他可能的解决方案……但是哪一个是最佳的呢?现在想象一下,信息的每一位都有一个价格,比如说每一位 10€,现在我们的第一次编码的平均价格是每实验 30€,而一键编码是每实验 60€。因此,我们自然希望优化我们的信息,使整体价格尽可能低。****

注 2 。注意,我用的是“价格”这个词,而不是“成本”。这是因为我稍后将使用术语“成本”来指代另一个概念,这样,我可以避免产生歧义。

从我们的实验中得到的代表每个微观状态的最佳长度就是熵所代表的长度。在熵障碍下,我们无法获得更短的信息编码。

熵公式

如果你在互联网上查找熵公式,你可能会得到不同的结果,这取决于你正在搜索的领域,原因是存在许多熵公式(看这个)。

但是,在深度学习中我们感兴趣的是香农熵,它来自信息论领域(香农熵也用于熵的统计理解)
我们为什么要用它? 原因将在下一篇文章深度学习中的交叉熵一节中给出,但首先,让我们看看这个公式是从哪里来的。

注 3 。得到熵公式的推理是基于我在本文开头提到的 Christopher Olah 的文章【1】。为了更深入地了解,我建议你访问他的网站。

码字的空间

码字空间指的是你可以用 n 位信息创建的所有可能的编码信息的集合。

所以对于仅仅 1 位,你只能代表两个不同的 (我们例子中的实验结果): 01 。用 2 位可以表示四个字: 00011011 。以此类推(见表)。

然后,对于二进制代码,我们可以表明,用 n 个表示位的我们可以表示个 2^n 个字(演示很简单,只需将位数想象为要填充的间隙,对于第一个间隙,您有两个选项( 01 ),对于第二个选项,又有两个选项( 01 ),以此类推现在,为了计算你拥有的所有选项,你将 2 2 2 … 2 = 2^n 选项(二进制字符串)乘以 n 位)+

3 比特的码字空间。最后一列显示了可能的组合数(8),从顶部开始:000,001,…作者图片。

如果我们操作并清除 n(位数),我们可以看到,要用二进制表示 5 个字,我们需要使用 3 位。

清除 n 并计算表达 6 个实验所需的最小位数(我们不能有 2.585 位,所以我们必须向上取整)。图片由作者提供。

但是,这只有在我们使用相同数量的比特来表示每个单词时才成立。如果我们使用一个变长码会发生什么?

回想我们的编码实验结果,我们仍然必须找出最便宜的方式来传送讯息。于是代替拥有: 000001010011100,101;我们可以尝试用 0001100101110、111 来表示。

现在新编码系统的平均价格已经降到了 26.67€/实验,而不是 30€。

更重要的是,如果实验 100、101、110 和 111 中的每一个只发生了 5%的时间呢?那么平均消息价格会更低,因为我们的消息通常由 2 位字组成。

可变长度编码系统的平均价格。80%的时间我们会使用 20 个€单词,而只有 20%的时间会使用 30 个€单词。图片由作者提供。

成本函数

为了获得最优解,我们需要一个目标函数来最小化

(还记得我说过我使用价格这个词而不是成本,因为我想引入另一个不同的术语,而不是产生歧义吗?现在是时候了)我们将 成本 定义为当用 n 比特编码一个字时我们牺牲的码字空间的部分。当我说使用 2 比特来表示一个字的成本是 1/4 时,这意味着我损失了 1/4 的码字空间。

使用 00 代表一个单词可以防止使用所有以 00 开头的字符串(灰色单元格)。这相当于 1/4 的成本。作者图片

目标函数(从现在起,我将称之为成本函数** )必须表示使用长度为 X 比特的代码来表示结果的成本(即,该函数以比特为单位获取代码的长度,并根据码字的空间输出使用该代码的成本)**

再次查看表示码字空间和使用可变长度码的成本的表格,您可能能够得到以下成本函数:

使用 x 比特编码一个字的成本函数。结果被表示为码字空间的一部分。作者图片

分析成本函数的性质 C(l):

成本函数被限制在 0 和 1 之间。长度为 0 的代码牺牲了整个代码字空间,因为我们发送的是一个只能代表一个结果的空消息。作者图片

达到最低限度

最后,我们必须根据成本来决定表示单词的最佳长度。我们有整个码字空间为我们工作,因此我们的预算是 1,并且我们必须找到最短的可能代码,使得:

定义我们问题的函数。作者图片

回想之前,我们对根据每个结果发生的概率使用可变长度代码感兴趣(因此将 l 1,…,l6 表示为不同的变量,而不仅仅是 l)

直观地说,我们希望将一个更短的码(因此在码字空间中成本更高)分配给最频繁出现的单词,而将一个更长的码(成本更低)分配给不太可能出现的单词。但是我们如何量化变短变长是短 3 位还是长 3 位?****

答案是概率

可以这样想:我们有一个成本函数,它的总和必须是 1(否则我们就是在浪费码字的空间),我们想给每一项分配一个与它们的概率成比例的成本,总和为 1!与成本函数相同,实验的概率之和为 1。

长度为 L 的单词的最低成本是作者的单词本身 P(x)图像出现的概率

注 4 。虽然我刚刚做出的声明需要数学证明,但我不想超载这个帖子。如果你有兴趣阅读,这里的是一个非常直观形象的解释链接。

最后,我们只需运算这些项,并将长度 l 写成概率 P(x) 的函数。

作为概率函数的码字长度。图片由作者提供。

注 5 。当您将概率值(在[0,1]中连续)代入上面的公式时,您会看到长度“l”的结果是一个小数值。但那不可能是对的!怎样才能构造出 1.6145 比特的代码?嗯,我会把这个解释留给克里斯托弗,但简单的回答是,我们不能,我们必须围捕,尽管有一种方法可以做得更好…

熵呢

我们能够使用二进制编码字出现的概率来计算它的最佳(最短)长度。然而,计算熵还有最后一步,因为“熵是编码消息的平均最佳长度”,这一步是计算我们消息的所有单词长度的平均值:**

离散随机变量的熵公式。

开发日志术语:

熵公式最常见的表示。作者图片

注 6 。通常,你会看到以对数为底 10 的熵公式。在大多数情况下,这无关紧要,因为 log_10(x) = log_2(x) / log_2(10),本质上是乘以一个常数 1/log_2(10)。这种基数的变化只适用于忽略常数的优化或比较方法,但使用基数 2(每一位信息只取 2 个可能的值)计算消息的最佳平均长度与使用基数 10 是不同的。阅读了解更多信息。

最后的结果

到目前为止,我已经提出了三种不同的(但相关的)熵概念,并使用数学和视觉表示法从头推导出了它的表达式。

然而,还有一项任务。我们必须为我们的实验室解决对实验结果进行最佳编码的问题!

因此,我们只需将实验的概率分布代入熵公式,并计算各项:

注 7 。我将使用标题为系统 3 的图像中绘制的最后一个概率分布,但请记住,这对任何离散随机变量都是一样的。

计算系统 3 的编码系统的最佳平均长度。

记住这是一个平均值;因此,一些实验可能用 1 位来表示,其他的用 2 位或 3 位来表示…熵只是告诉我们平均最小值,但它并不反映每个消息应该如何编码。请注意,我使用以 2 为底的对数来计算熵,因为我们使用的是二进制编码(使用以 10 为底的对数会产生一个不同的结果,它由常数 1/log_2(10)加权,并不反映真实的结果)

我希望这篇文章能帮助你更好地理解熵。在下一篇文章中,我将谈论交叉熵以及为什么我们在人工智能模型中使用它。最后,我将解释我们在哪些问题中应用它,以及如何解释它。

参考

****【1】视觉信息理论。克里斯托弗·奥拉。2015.https://colah.github.io/posts/2015-09-Visual-Information/

****【2】熵真的是“无序度”的度量吗?熵的物理学解释和变得容易。Parth G. 2020。https://www.youtube.com/watch?v=mg0hueOyoAw

****【3】对熵的更好描述。史蒂夫·莫德。2016.https://youtu.be/w2iTCm0xpDc

为什么我们在深度学习中使用交叉熵——第二部分

原文:https://towardsdatascience.com/why-do-we-use-cross-entropy-in-deep-learning-part-2-943c915db115

解释人工神经网络中最广泛使用的损失函数之一

。这是第一部分的延续:为什么我们在深度学习中使用交叉熵——第一部分

交叉熵二元交叉熵、和 C 分类交叉熵是深度学习中的关键概念,也是用于构建神经网络的主要损失函数之一。都来源于同一个概念:,这个概念你可能从物理和化学上比较熟悉。然而,没有多少课程或文章深入解释这些术语,因为正确地解释它们需要一些时间和数学知识。

在第一篇文章中,我提出了三个不同但相关的熵概念,以及熵公式的来源。然而,仍然有一个关键概念需要解决,因为深度学习不使用熵,而是使用它的近亲,称为交叉熵。这个术语是什么意思,如何解读,应用在哪些深度学习问题上,是本帖的重点。

mahdis mousaviUnsplash 上拍摄的照片

交叉熵

回想第一篇帖子(链接),熵公式可以解释为 一条编码消息的最优平均长度

使用二进制编码(对数基数为 2)的离散随机变量 X 的熵公式。图片由作者提供。

注 1 。回想一下上一篇文章,对数的底并不重要,因为改变对数的底相当于乘以一个常数。这只适用于优化和比较方法,其中常量被忽略。

作为熵的替代,交叉熵被定义为随机变量 X 的熵,使用概率分布P(X)编码,但是使用不同的概率分布 Q(x) 来计算平均值。

换句话说,一个随机变量 X 分布为 Q(x) ,但是使用分布 P(x)的编码系统,它的最佳平均消息长度是多少?

使用二进制编码的交叉熵公式(log_2)。图片由作者提供。

注 2 。定义交叉熵的另一个常用符号是 H(Q,P)。然而,为了保持符号与熵公式一致,我考虑使用子索引。

为了弄清楚,让我们举个例子。我将采用与第一篇文章相同的例子,但请记住,它适用于任何离散随机变量。

在这个例子中,我们正在研究对我们的实验室实验进行编码的最佳平均长度,这可能导致 6 种不同的结果( 微状态 ):微状态 1 (M1)、M2、…、M6。
现在让我们假设我们有一些参数 K 可以在我们的实验中修改,这样当我们使用 K 的不同组合时,我们可以获得结果(微观状态)的不同概率分布

变体 K1 和变体 K2 的实验结果的概率分布。Y 轴(概率)已被缩放以提高可视化。图片由作者提供。

如我们所见,熵是概率分布的函数,即分布 P(x)Q(x) 的熵不必相同。原因在于,为了计算熵,我们已经将每个结果的相应概率设置为成本值(详细解释参见第一部分的熵公式一节),换句话说,P(x)的编码不一定与 Q(x) 的编码相同。虽然两种情况下 X 是同一个随机变量,但改变的是它的分布。

现在出现了下面的困境:如果我们只能使用一种编码系统来发送实验变量 K1 和 K2 的结果,那么哪种编码会更优,因此我们应该使用哪种编码?编码 K1 还是 K2?

这个问题的解决方案是通过计算每个变量 K1 和 K2(相对于另一个变量)的熵和交叉熵,并使用编码系统 K1 和 K2 对结果进行平均以获得全局平均长度。

K1 和 K2 哪个编码系统更好?从顶部到底部计算两种编码的熵和交叉熵。注意,编码指的是分配给特定结果 xi 的成本 log_2(1/P(xi))。作者图片

根据计算,用于发送 K1 和 K2 变体的消息的最佳编码系统是来自 K1 的编码系统,其产生最短的长度(2.622)。

有人可能会认为这两种编码之间的差异并不显著,因为在处理位时,结果必须四舍五入。然而,当消息中包含的单词序列足够高时,这种差异是显而易见的。假设你的信息是一条最多 280 位的推文。使用编码 K1,你平均能够发送 280/2.622 ~ 106 个单词,而使用编码 K2,你能够交流 103 个单词(谁没有在一条推文中不能多写 3 个单词的痛苦呢?)随着你增加每条信息的字数,这种差距还会继续扩大。

注 3 。再者,还有一个概念叫做分数位,这是一种在交流多个最优长度为十进制的单词时,最大化单词最优长度的方法。

一个重要的观察结果是交叉熵是不对称的,所以

交叉熵是不对称的。作者图片

深度学习中的交叉熵

我们已经看到了一个如何将交叉熵应用于问题的例子,但由于深度学习对(仅仅)编码消息不太感兴趣,所以这个功能为什么、何时以及如何进入场景?

答案当然在于它的应用,那么我们来介绍一下交叉熵在深度学习中解决的问题。

用于分类任务的深度学习

假设您想要将心电图信号(ECM)分类为一组代表心血管疾病的不同模式。实际上,即使对于最有经验的心脏病专家来说,这也是一项非常困难的任务,因为心脏异常的模式可能非常微妙,健康人和心脏病患者之间的差异非常小。

注 4 。如果你对如今如何使用深度学习解决 ECM 的分类感兴趣,请参考这篇文章

强迫模型仅仅预测一个从 1K 的整数,其中 K 是类的数量(ECM 模式),不是一个好的策略。使用这个系统,我们的模型的误差将是“绝对的”,在这个意义上,我们将能够判断模型的表现是好是坏,但不能判断它的预测有多坏或多好。
假设模型预测了类别 2,但正确结果是类别 4,那么我们如何计算误差?计算正确类别和预测类别(| 4–2 | = 2)之间的距离(或 MSE)不能用作误差测量,因为这样我们就可以说预测类别 2 比预测类别 9(| 4–2 |<| 4–9 |)更好,也就是说,基于我们的人类标准,我们假设类别 2 比类别 9 更接近类别 4。此外,该方法还假设类别 3 与类别 4 的接近程度与类别 2 的接近程度相同,这在实践中是不可能评估的:鳄鱼、猫和狗有多相似?也许猫和狗是 1 个单位的相似,但那么鳄鱼和猫又有多少个单位的相似呢猫 vs 狗?我们不能简单地这样做,因为我们不能用猫和狗的度量单位来比较鳄鱼和猫!

我们不能用猫和狗的对比来比较鳄鱼和猫。照片由加埃塔诺·塞萨蒂拍摄于 Unsplash (鳄鱼)劳埃德·亨内曼拍摄于 Unsplash (猫) Marliese Streefland 拍摄于 Unsplash (狗)。由作者编辑。

另一种思考问题的方式是概率,其中模型将估计 ECM 呈现每个模式的概率,而不是输出 12K、

我们网络的输出将是所有 K 类的概率分布

因此,概率大于> 0.5 的 ECM 模式将是网络在输入 ECM 信号中已经分类的模式。

注 5 。这种将数据样本分配到其最可能的类别的简单而直观的假设来自于朴素贝叶斯分类器的概念,在理想情况下,我们知道真实的潜在条件概率是最好的可能分类器,其中 P(类别 k | x) 较大(给定数据样本 x,读取属于类别 k 的概率)。

现在,为了计算误差,我们还必须为预期输出(即真实类别)定义一个概率分布,因为我们希望为正确类别定义概率 1,为其余类别定义概率 0,这与使用一键编码一样简单。所以 1 类会是【1 0 0…0】,2 类【0 1 0…0】,等等。

范畴交叉熵

在这一点上,我们已经定义了问题方法和模型输出的形式,但是我们还没有建立任何损失函数。

我们需要找到一种方法来测量模型输出和真实类别向量之间的差异,即我们需要定义两个概率分布之间的距离度量。

毫不奇怪,数学家们已经想到了能够解决这一需求的工具。解决方案在于信息几何领域下的发散概念

`在信息几何中, 散度 是一种统计距离:一个二元函数,它在一个统计流形上建立了从一个概率分布到另一个概率分布的分离(其中每个点代表一个概率分布的空间)( 维基百科 )

目前有不同的散度测量值(),然而,其中一个非常特殊,因为它大大简化了我们的计算:kull back–lei bler 散度

库尔贝克-莱布勒散度的数学定义。图片由作者提供。

值得注意的是,库尔贝克-莱布勒散度是不对称的:

库尔贝克-莱布勒散度是不对称的。图片由作者提供。

因为我们使用 Kullback-Leibler 散度作为误差度量(概率之间的距离越大。分布模型的预测越差),我们希望最小化它。

注 6 。以下推导摘自这段视频。

定义:
P* →真实类分布
P →预测模型分布
θ →模型参数
P(y|x) →给定输入数据x*P(y | x;θ) →在给定输入数据 x 和参数 θ 的情况下,属于 y 类的模型的预测概率

为分类问题重写的 Kullback-Leibler 散度。请注意,求和是针对所有可能的类别 Y(在我们的 ECM 问题类别 1-15 中),它实际上与输出概率向量一起运行。图片由作者提供。

和操作条款:

由于第一项不依赖于模型的参数(θ),我们可以将其视为常数值,因此在优化问题中可以忽略它。图片由作者提供。

最后,我们可以证明:

最小化 Kullback-Leibler 散度相当于最小化真实类别概率分布(P*)和预测(P)之间的交叉熵

最小化 Kullback-Leibler 散度等于最小化真实类问题之间的交叉熵。分布(P*)和预测值(P)。图片由作者提供。

也就是说,在优化问题中,交叉熵可以被视为两个概率分布之间距离的度量

注 7 。我们也可以考虑计算 KL 散度 D_{KL}(P||P^,因为我们知道 KL 是不对称的。然而,这样做会导致数学上的不确定性。运算这些项并去掉不依赖于θ的项后,我们得到下面描述的公式。当 P(y|x) = 0(记住 P*(y|x)是一个热码编码向量)且 log(0)未定义时,会出现不确定性。

由于不确定性日志(0),计算 KL 散度 D_{KL}(P||P^*是不可能的。图片由作者提供。

计算多个类别的交叉熵被命名为分类交叉熵,以区别于二元交叉熵。在深度学习库中,如 Tensorflow,已经存在一个预先构建的函数来计算分类交叉熵:

tf.keras.losses.CategoricalCrossentropy()

二元交叉熵

在前一个问题中,我们必须将一个数据点 x 分类到多个类中,但是对于只有两个类的二进制分类问题呢?

我们也可以用概率来思考这个问题。唯一的区别是,现在我们模型的输出不是一个概率向量,而是代表输入数据点 x 属于第一类的概率的单个值,因为我们可以通过应用 P(类 2) = 1-P(类 1)来计算属于第二类的概率

二元分类模型。回想一下,所有可能类别的概率之和必须等于 1 。图片由作者提供。

我们可以再次应用交叉熵公式。利用现在我们只有两个类的事实,我们可以展开求和:

二元交叉熵的推导。因为只有 2 个类,所以满足 P(类 2) = 1-P(类 1),其中 P(类 1) = P(y1|x)。图片由作者提供。

然而,我之前没有提到的一个事实是,损失函数通常是在一批数据点上计算的,所以平均损失是在这些点上计算的。然后,您可能会看到二进制交叉熵(BCE)为:

N 个数据点批次的 BCE 公式。图片由作者提供。

同样,分类交叉熵,大多数深度学习库都有一个预建的二元交叉熵函数。在张量流的情况下:

tf.keras.losses.BinaryCrossentropy()

结论

到目前为止,在这一系列的两篇文章中,我已经介绍了交叉熵分类交叉熵二元交叉熵的直觉和形式推导,以及它们在分类问题中的应用。用几行文字总结所有内容:

  • (Shannon)熵 =编码消息的最佳平均长度,其中公式中的对数底定义了可能的编码字符(二进制代码为 2)
  • 交叉熵 =分布为 Q(x) 的随机变量 X 的最优平均消息长度,但在优化问题中使用分布 P(x) → 的编码系统,可以看作是两个概率分布之间距离的度量
  • 分类交叉熵 =交叉熵作为损失函数应用于多分类问题(当有两个以上的类别时)
  • 二元交叉熵 =在二元分类问题中作为损失函数应用的交叉熵(当只有两个类别时)

最后,如果你想阅读更多关于如何使用神经网络模型进行分类的内容,我推荐阅读我的文章5 分钟内 Sigmoid 和 SoftMax 函数,其中我解释了用于输出多类和二元问题中概率分布的两个激活函数。

机器学习中为什么要用梯度下降进行优化?

原文:https://towardsdatascience.com/why-do-we-use-gradient-descent-for-optimization-in-machine-learning-19428760a7ed

选择计算优化技术

马里乌斯·哈克斯塔德在 Unsplash 上的照片

我注意到,大多数机器学习指南都直接进入梯度下降,而没有探索为什么我们实际上使用这种方法来优化我们的模型。从数学的角度来看,这似乎很奇怪。梯度下降依赖于梯度的知识来“滑下斜坡”,但在学校,当我们想找到一个函数的最小值,其梯度可以计算,我们通常不应用梯度下降。相反,我们只是通过直接求解梯度为 0 时,解析地找到最小值。那么,为什么当我们转向计算机领域时,我们会突然改变策略并使用迭代技术呢?此外,为什么我们使用梯度下降,而不是,例如,牛顿下降,其他流行的迭代优化技术?

牛顿下降

首先给不熟悉的人介绍一下牛顿下降法。这扩展了对函数使用线性近似的思想。考虑寻找 x 使得 f(x)=0 的问题。让我们构建一个线性近似:

作者图片:线性函数逼近

让我们挑选 x_kx_{k+1} 来求解 f(x)=0 的线性近似:

作者图片

现在,我们需要切换到优化框架。我们想要一个算法,收敛到梯度为 0 的驻点。所以如果我们用函数项代替梯度项,我们可以得到最终的牛顿下降公式:

图片作者:牛顿后裔

梯度下降与分析优化

相比解析优化,我们使用梯度下降优化模型的主要原因是它通常更快!解析解通常需要复杂的线性代数运算,例如矩阵求逆,这在大规模计算时计算成本非常高,并且可能在数值上不稳定。

为了演示这一点,我们将使用简单的 OLS 线性回归作为例子。在这种情况下,给定输入观测值矩阵、 X 和目标向量 y ,线性 OLS 解为:

作者图片:线性 OLS 解析解

不过这里要注意的关键是方阵求逆,它的时间复杂度为 O(n ) ,其中 n 是特征的数量因此,这对于机器学习中经常遇到的更大的问题来说并不是很适用👎。

同时,计算梯度下降中使用的梯度要简单得多,计算机可以非常快速地运行这些计算数千次,即使是在更大的范围内👍。

梯度下降 vs 牛顿下降

现在,让我们继续比较梯度下降和牛顿下降,这两种算法都是迭代优化算法。起初,牛顿血统看起来占了上风:

  1. 👍更快的收敛速度:与梯度下降中的次线性收敛速度相比,牛顿下降具有二次收敛速度。这意味着与梯度下降相比,它需要更少的步骤来收敛。
  2. 👍更快的二次收敛速度:此外,在二次函数中(例如一直使用的线性 MSE),牛顿收敛改进为一步下降!!

然而,有几个主要缺陷阻碍了它的使用:

  1. 👎没有可调的学习率:再看一下更新等式,你会注意到没有学习率项。事实上,牛顿下降假设学习率为 1,这意味着由于不灵活的下降步骤,没有保证全局收敛,梯度下降中没有发现这个问题。这显然是一个大问题,因为模型初始化现在会影响收敛。这也意味着下降模式不太清晰。虽然梯度下降会逐渐收敛到一个值越来越小的解,但牛顿下降往往会跳跃很多,这使得评估进展更加困难。
  2. 👎逆 Hessian 计算:牛顿更新方程使用逆二阶偏导数矩阵,称为 Hessian。然而,这并不能保证存在!作为对称矩阵,对于 Hessian 的逆的存在,也必须是正定。但是即使它确实存在,大规模的计算也是极其昂贵的!这意味着即使牛顿下降需要更少的步骤来收敛,梯度下降对于机器学习中的用例来说通常仍然更快。

我希望这激发了更多使用梯度下降作为机器学习中优化的基础。

如果您觉得这篇文章有用,请考虑:

推广的方式,我真的希望你觉得这篇文章有趣,让我知道你的想法!!

为什么我们要用标准差?

原文:https://towardsdatascience.com/why-do-we-use-the-standard-deviation-51d5d1a502a8

照片由алексарцибашевUnsplash 上拍摄

费希尔、参数化、效率和 CLT

感觉就像知识已经进步了,而且还在继续进步,速度如此之快,以至于在学校没有时间来解释事情是如何以及为什么会是现在这个样子。对我来说,标准差就是其中之一:简单地表述为测量离差的方法,没有解释我们为什么要做这个复杂的平方、平均、平方根的过程。这里的目的是简要回顾一下理论统计学的历史(激动人心!!!)并在此过程中理解它如此流行的历史和理论原因;或许还有为什么不应该。

这是什么?

先快速定义。换言之,给定一组数据,如果我们:

  • 计算每一点与平均值的偏差
  • 平方偏差
  • 将它们相加,然后除以计数(得到平均方差)
  • 求总和的平方根

我们得到标准差(STD)。更正式地说,如果我们有一个随机变量X,并且我们通过收集n个观察值{x_1, x_2, ...x_n}(例如,可能是随机人的身高记录)形成一个样本,那么我们可以计算样本标准差为:

作者图片

在这个定义中,我们假设我们知道总体均值(不使用样本均值作为估计)。如果我们没有,我们会用样本平均值替换总体平均值,并利用贝塞尔的修正值(除以n-1而不是n——如果对此感兴趣,那么我在这里写了一个直观的解释器)但总体来说,想法是一样的。取离中心点的平方偏差的平均值,然后求它们的平方根。

为什么看起来像那样?

我不认为这太夸张了,当你真正看到它时,它似乎有点复杂。当然,数学运算很简单——但除了它从你 11 岁起就已经被灌输到你的大脑中这一事实之外,我们为什么会这样表述它其实并不那么明显。

给出的一种解释通常如下:

  • 我们对观察结果进行平方处理,使它们都是正面的
  • 求平方根会将数量返回到原始测量单位

换句话说,我们需要所有的值都是正的,以防止负偏差抵消正偏差(我们希望所有测量的离差累积起来),然后我们希望最终的数字与我们测量的数据相当。在这个例子中,走在街上,问人们他们有多高,我们希望我们的离差以米为单位,而不是以米的平方为单位,所以我们对总和求平方根。

但是这个解释并不完整。有很多方法可以让价值观变得积极。我们可以取它们的绝对值,也可以使用不同的(偶数)指数,比如 4。如果我们不使用幂(平方),那么我们就不需要在最后求平方根,把量返回到正确的单位。为了理解为什么会这样,我们需要回顾一下历史。

统计与概率

在学校,我总是发现很难剖析概率和统计之间的区别。他们成对出现在我的大脑中,尽管我的大脑有许多缺陷,但这并不一定感觉像他们中的一个。因为在当今世界,他们有点像成对出现的。但情况并非总是如此。

概率已经存在了一段时间,但主要与机会游戏有关——硬币、卡片和骰子。给定一个固定的“数据生成过程”(即掷硬币或掷骰子),概率涉及的问题有:预测在n试验中x的概率是多少?不涉及数据本身,更多的只是纯粹的数学——给定一个数学函数(我们知道),它产生某种结果的概率是多少?

类似地,统计学也存在,但不像我们今天所知道的那样。如果我们追溯到 1900 年代以前,统计通过对国家感兴趣的数量进行描述性统计来关注“国家事务”,这个词本身来自拉丁语“地位”或“政府”。在某种程度上,统计过去只是描述性的统计——给定一些数据,我们能否想出一些方法将所有信息浓缩成几个数字来表示?没有真正发展起来的用数据做概率陈述的概念。对以下问题的回答:

“我们有多大把握在样本数据中收集的平均身高等于整个人群的真实平均身高?”

简单地说“我不知道”。那么是什么改变了呢?

费希尔和参数化

20 世纪的到来带来了像高尔顿、T2、皮尔森这样的公司,并在 1901 年成立了 T4 生物技术公司。皮尔逊在他的课堂笔记中首次引入了术语“标准差”,你可以在这里看到他对它的使用(有趣的是,他还在这里创造了短语“正态”来指代正态分布,而不是德莫维尔和高斯之前使用的“误差定律”)。

然而,真正推动事情发展的是罗纳德·费雪,他在很大程度上被认为是建立了现代“推理”统计学。是他推动了可能性(而不是逆概率)的概念。如果概率给你一个框架,并要求你计算某一组数据从该框架中出现的几率,那么就是他将统计学表述为一种逆过程:给定一组观察到的数据,最有可能生成该数据的框架是什么?

我们如何计算出“最可能框架”?我们对它进行估计——特别是通过选择一个分布,然后使用数据来推断给定数据时最有可能的参数化。举个例子,给定一组数据,我们想知道总体均值最可能的估计值是多少。正是费雪的影响使我们使用样本均值的统计。正是费雪的影响让我们陈述了:

  • 我们能“期望”样本意味着什么
  • 统计数据的分布应该是怎样的

通过这种新发现的对什么是估计总体参数的最佳统计的关注,费希尔的标准差的论点得以诞生。

费希尔对爱丁顿(大约 1920 年)

眼下的问题如下。给定两种测量离差的方法——STD 和 MAD——哪一种最好?费希尔用他新发现的统计“效率”的概念来回答这个问题。简而言之,他认为如果有两种做事方法,那么我们应该选择方差最小的一种。这意味着,在任何给定的一天,当我们采样并计算统计数据时,该统计数据更有可能接近我们希望知道的数量(总体参数)。

这是一个很难不同意的论点。然后他证明了(带着一些假设)STD 比 Eddington 喜欢的 MAD 更有效。事实上,我们可以通过自己画一些样品来证明他展示的东西。我们可以:

  • 从标准正态分布(均值为零,方差为 1)中生成 10,000 个观察值的 10,000 个样本
  • 计算每个样本的样本标准偏差和平均偏差(每个样本 10,000)
  • 绘制它们的分布
  • 计算“相对效率”(RE)

其中,re 定义为其“效率”的比率,对于随机变量x,其定义为:

作者图片

Relative Efficiency, STD/MAD: 87.20%

作者图片

那么这说明了什么呢?左图显示样本 STD 的分布,而右图显示样本 mad 的分布。然后,我们计算每种方法的效率,可以在每张图表的顶部看到,STD 的效率略好于 MAD。当我们观察它们的相对效率时,我们发现 STD 的效率比 MAD 高 12.5%左右。费希尔通过分析证明了这个结果,这个结果使得争论偏向于 STD。

有什么注意事项吗?

是的。与许多统计结果一样,上面的结果是由下式得出的:

  • 渐近地
  • 假设所讨论的抽样变量是正态分布的

爱丁顿(理所当然地)对这个结果感到沮丧,这个结果有助于指导下面的数学理论,因为这不是他在作为科学家的日常生活中所看到的。在某种程度上,这是一个科学家的手动波动的实际观察与一个运用极限定理的数学家的整洁优雅的数学证明,正如经常发生的那样,整洁的数学赢得了胜利(另一个例子见 1970 年后宏观经济学文献的方向——保罗·罗默关于它的好论文在这里)。事实证明,在非正态性存在的情况下(甚至是最微小的量),结果会发生逆转。事实证明,生活中几乎没有什么是完全正常的。

证明它

就像以前一样,让我们用一些模拟来证明这一点。在上面,我们生成了样本,并使用 RE 比较了效率。让我们再做一次,但这次我们将使用 Taleb 工作中的一个巧妙技巧来创建一个“混合分布”,这样我们最终会得到:

  • 以前“窄”分布的大多数观察结果
  • 来自更广泛的异常值生成分布的一些观察

最终结果是我们的分布不再是完美的正态分布。换句话说,这意味着我们将:

  • 来自高斯N(0, 1)的样本具有概率1-p
  • 来自高斯N(0, (1+a))的样本具有概率p

其中我们将p设置为一个小数值 s.t .我们只是偶尔从产生异常值的高斯分布中得到观测值。我们可以看到,当我们设置a=0时,我们回到了之前的世界,在那里我们有一个恒定的方差1。现在,让我们执行以下操作:

  • 重复之前的取样,但采用上述程序
  • 对不同的a值重复此步骤

我们将确定概率p=0.01

作者图片

这说明了什么?从最左边开始,它表明当a=0我们回到完美的高斯世界,STD 在相对效率(RE)方面胜过 MAD。然而,随着我们开始将非正态性纳入我们的数据,这种情况很快发生逆转,MAD 的效率有时是 STD 的 12 倍。

为什么?

一个原因是想一想 MAD 和 STD 是怎么公式化的。STD 通过平方偏差为每个偏差创建正值。我们可以把这个平方看作是对每个偏差应用一个权重,这个权重就是偏差本身的大小。由于这个优点,较大的偏差得到较大的权重。当我们像上面所做的那样引入非正态性时,我们最终得到一些大的偏差(超过和高于高斯),这相应地导致标准偏差增加,超过等权重 MAD 函数所发生的情况。正是这种对异常值的响应造成了 STD 统计的可变性,从而导致其失去效率。

也正是这一特性导致学生在学校被教导“去除异常值”——因为它们破坏了标准差的效率。所有这些导致了标准差占优势的第二个原因。

标准差与常态有着内在的联系

这一点越看越明显-甚至人口标准差的符号也与正态分布中比例参数的符号相同。在没有高阶矩的分布中(完全对称,没有过度峰度),你真正需要的是标准差。对于像钟形曲线这样的凸凹凸函数,一旦有了平均值和标准差,就大功告成了,这些统计数据中有足够的信息来描述完整的分布。

这一点和标准差与正态分布的独特性质在这篇文章中得到了很好的说明。这本书很值得一读,但我会试着解释一下。让我们假设以下情况:

  • 我们有一个盒子,里面装满了写有数字 0 或 1 的彩票
  • 我们挑选出n张彩票,把写在上面的数字加起来——称之为总值y
  • 我们这样做了一万次

然后我们可以查看我们拥有的y的值,并创建一个直方图,在那里我们计算某个y出现的次数。例如,如果我们设置n等于 10,那么我们将为每个y抽取 10 个数字(0 或 1)。我们能得到的最大值是 10,最小值是 0,我们期望平均值是 5 ( n/2 ) -平均来说,我们期望 50%的时间画 0,50%的时间画 1。如果我们要绘制直方图,我们将得到一个钟形曲线,随着样本数量增加,我们的钟形曲线将变得更加平滑。

作者图片

随着增长,获得任何特定数字的可能性变小(因为有太多的数字可供选择)。我们在上面的图表中看不到这一点,因为我已经移除了轴标签。然而,假设直方图以条形面积表示频率,随着n变大,每个条形的height * width变得越来越小(从左图到右图)。

我们可以通过归一化来解决这个缩放问题——我们可以通过减去某个中间值m来将它们居中,并通过使用某个分散值s来将其缩小以创建z,而不是只取值的直接和y:

作者图片

然后,我们可以绘制这些值的直方图——z中心极限定理与直方图的面积有关,这就是标准偏差的来源。 CLT 指出,随着n变大,数量z的直方图上这些标准化的条的面积接近极限值——对于ms的一些选择。

事实证明,为了使这成为真,对 **s** 的唯一选择是标准差。换句话说,没有其他衡量离差的方法能达到这个目的(比如 MAD)。我认为这从根本上证明了标准差的概念与正态分布的内在联系——没有标准差就没有 CLT。标准差是我们可以用来确保上述直方图的极限分布成为正态分布的唯一离差度量。

性病占优势有问题吗?

一如既往:视情况而定。如果我们处在一个纯高斯主义的世界里,原因是:

  • 拥有一个真正足够大的样本,让 CLT 能够正常发挥作用(而不是我们还在收敛的半路上)
  • 一个真正的高斯变量(通常由游戏构造而成,游戏规则是由造物决定的)

那我们就不用担心了。

然而,对于更真实的情况,当我们面对不完全正态的对称分布时,值得考虑使用 MAD 作为离差的替代度量。特别是如果我们最终进入大偏差的领域,这些大偏差实际上是我们唯一关心的偏差,因为它们是支配所有其他事件的事件(一场灾难性的洪水对一系列小阵雨)。如果你觉得这个东西有趣,那么进一步的信息可以在这里这里找到。

为什么我们在数据科学中使用 XML?

原文:https://towardsdatascience.com/why-do-we-use-xml-in-data-science-99a730c46adb

学习 XML 的基础知识以及如何在 Python 中处理它

瓦列里·塞索耶夫在 Unsplash 上的照片

XML 代表可扩展标记语言,现在被用作基于文本的数据格式,用于交换结构化的数据。最初开发它是为了取代 HTML,因为它在数据技术方面已经达到了极限。

XML 文件是如何构造的?

所谓的标记语言,如 HTML 或 XML,使用标记来构造文本信息。在 HTML 中有一组固定的标记,它们被定义在尖括号(<>)中。例如,这些包括标题(

、…)或段落(

),它们用于构建网站的结构:

<!DOCTYPE html> 
<html> 
<head> 
<title>Title Text</title> 
</head> <body>  
<h1>Main Header</h1> 
<p>The first paragraph</p>  
</body> </html>

例如,这是一个非常简单的网站的结构。标记定义了页面的结构,目前页面只包含一个标题和一个简短的段落。

XML 使用相同的结构,不同之处在于标记的数量不受限制,它们的命名可以自由选择。这使得模拟许多类型的数据结构变得相对容易。

可扩展标记语言给出的唯一规则是标记必须总是以开始标签<markup_1>开始,以结束标签</markup_1>结束。唯一的例外是带有此表单的标签<markup_1>。</markup_1>

为了显示嵌套信息,还可以在一个开放标签中定义几个新标签。这里有一个例子:

附加功能是所谓的参数。这些可以为每个标记定义,并且必须始终包含名称和值。该值必须用引号定义,即使它是一个数字。

在我们的示例中,当我们想要描述集合中的多辆汽车时,参数的引入非常有用:

可扩展标记语言的优点和缺点

使用可扩展标记语言文件具有以下优点:

  • 广泛分布,因此与现有应用程序高度兼容
  • 文件的高度安全性
  • 由于文本文件的可读性,信息易于恢复
  • 易于人机理解
  • 简单的结构和布局,使它能被许多用户迅速理解
  • “方言”形式的扩展性

这个长长的优点列表唯一真正的缺点来自于可扩展标记语言使用的文本格式。文本信息只能用相对较多的内存来存储,因此会导致处理性能降低。二进制文件格式,如 BSON,对于相同的信息需要少得多的存储空间,但是不可读,因为信息是以 0 和 1 存储的。

哪些应用程序使用可扩展标记语言?

由于可扩展标记语言的基于文本的存储,这种格式相对容易阅读和理解。这就是它被广泛应用的原因。最常见的用例之一是数据交换,即在应用程序中导入和导出数据。这就是它对数据科学家如此有价值的原因。此外,导入 Python 并像处理 Python 字典一样处理它也非常容易。

此外,可扩展标记语言的一般用途很少,因为大多数用例已经创建了特定于其应用程序的 XML 变体。例如,有一种数学标记语言(MathML),它是 XML 的一种方言,用于正确表示数学等式和术语。

如何用 Python 编辑 XML 文件?

Python 中有几种打开 XML 文件的方式和模块。我们将尝试使用一个由我们之前的例子组成的字符串。我们可以试着保留原来的结构:

另一方面,我们也可以尝试将可扩展标记语言的结构转换成一个 Python 字典。对于许多经常使用 Python 的开发人员来说,这要容易得多:

这是你应该带走的东西

  • XML 代表可扩展标记语言,现在被用作交换结构化数据的基于文本的数据格式。
  • 由于可扩展标记语言的基于文本的存储,这种格式相对容易阅读和理解。
  • 此外,这种格式的优势在于可以适应不同方言的不同用例。

如果你喜欢我的作品,请在这里订阅https://medium.com/subscribe/@niklas_lang或者查看我的网站* 数据大本营 !还有,medium 允许你每月免费阅读 3 篇 。如果你希望有无限制的 访问我的文章和数以千计的精彩文章,不要犹豫,点击我的推荐链接:【https://medium.com/@niklas_lang/membership】每月花$5***获得会员资格**

* *

为什么需要数据策略?

原文:https://towardsdatascience.com/why-do-you-need-a-data-strategy-f9ad8a66ba51

在许多组织中,数据已经成为董事会级别的话题。在您的组织中,您(很可能)有一个适当的业务战略来定义如何实现和保持可持续的竞争优势。然而,大多数组织还没有一个关于如何从数据中提取正确价值以建立竞争优势的战略。

照片由盒装水更好Unsplash

正如迈克尔·波特(Michael Porter)在 1996 年对 T1 所做的著名解释,一个公司只有在能够创造出一种可以保持的差异时,才能超越竞争对手。这种差异是相对于竞争对手的优势,也是可持续发展的优势。此外,现代商业战略非常注重多样化。数据和由数据推动的创新无疑是可以创造额外竞争优势的主要支柱之一。这正是您需要数据策略的原因。您的数据策略应该定义组织如何将数据作为资产进行管理。

业务战略和数据战略之间的关系(图表由作者提供)

制定任何战略都是一项具有挑战性的任务。也许与其说它是科学,不如说它是一门艺术。此外,数据策略是一个相当新的主题,关于这个主题的资源非常少。因此,明确定义制定数据战略的目标非常重要。定义要从数据中提取哪些值、提取这些值所需的元素以及确保成功实施数据策略的步骤是数据策略的三个主要目标。这些将在下面详细解释。

数据策略的组成部分(图表由作者提供)

数据价值创造:这无疑是构建数据战略的起点之一。在高层次上,这个过程应该分为两个部分。首先,我们需要理解(也许想象一点)我们可以从数据中创造的所有可能的价值。当然,这意味着我们需要对业务领域和我们拥有或能够获得的数据有深入的了解。第二步,就是做出正确的选择。有了这些选择,你就能让你的公司在市场上处于一个特殊的位置。

此外,价值可以有不同的形式。例如,您可以提供由数据驱动的产品或服务。您还可以通过数据支持的新功能来强化当前产品或服务的现有地位。这些功能往往非常独特,可以帮助您从基于成本的定价转向差异化或基于价值的定价。第三,你可以使用数据来改善内部业务流程(尽管运营效率是否真的是战略的一部分是一个长期存在争议的话题)。

数据价值创造(作者图表)

数据基础:这一部分包括您在组织中需要的所有拼图,以实现从数据中提取的选定值。数据架构、数据管道、人工智能和机器学习算法、组织和能力、基础设施、数据质量控制、数据治理以及数据管理的所有其他基本元素,这些都是高效提取数据价值所必需的。这是一个广泛的话题,我想写一篇未来的文章来为这个话题带来更多的结构。不过,我会参考一个中等经典,Monica Rogati 的人工智能需求层次(2017)。这篇文章总结了实现人工智能所需的所有数据基础的需求,确实超前了。

数据基础(来源:“人工智能需求层次”莫妮卡·罗加蒂)

构建这个视图也是一个两步的过程。首先,考虑到现有的策略(即 IT 策略),您需要对您组织中的“现状”有一个清晰的了解。第二,您需要使用您所掌握的所有专业知识来可视化数据基础的“理想”状态。

数据战略执行计划:没有执行力的好战略是没有意义的。当一个策略失败时,你会想这是不是因为这个策略不好;或者执行力不足。这也是一个非常广泛的话题,值得写几篇文章。但是,以下三项是执行计划的基本要素:

  1. 目标和措施详细说明如何将数据战略转化为短期和长期目标和措施。
  2. 组织结构审查当前组织和(如果需要)支持实施我们的数据战略所需的理想组织。
  3. 组织文化解释与组织紧密相关的文化价值观如何在数据战略中实施。

制定战略不是一件容易的事情。由于数据创新用例的快速发展,围绕数据的需求比以往任何时候都更加复杂。数据策略是一个新的话题,这篇文章总结了我目前对这个话题的想法。我希望你喜欢阅读这篇文章,如果你对这个话题有任何想法,我很乐意在评论区听到你的想法。

为什么显卡对机器学习有帮助?

原文:https://towardsdatascience.com/why-does-a-graphics-card-help-in-machine-learning-8f365593b22

理解显卡对于机器学习进步的重要性

克里斯蒂安·威迪格在 Unsplash 上拍摄的照片

显卡,也称为图形处理单元(GPU),负责在计算机中计算图像,然后可以在显示器上显示。它代表处理器的计算和监视器之间的接口。然而,显卡的发展现在已经非常先进,除了这个功能之外,它们还可以在计算过程中支持和减轻 CPU 的负担。

显卡是怎么工作的?

计算机的处理器计算某个程序想要在屏幕上显示什么数据,并将其作为所谓的图像数据输出。这些数据大多是数字,然后由 GPU 转换,以便可以在显示器或其他设备上显示。

许多膝上型电脑和计算机包含已经安装在电路板(即主板)上的图形卡。这样的集成显卡 (IGP)没有自己的内存,也是访问电脑的主内存。由于 IGP 没有内存组件,其尺寸非常小,因此主要用于小型设备,如平板电脑或笔记本电脑。然而,由于共享工作存储器,这种设计伴随着低时钟速率和低性能。因此,IGP 主要用于主要用于办公应用或浏览的设备。

与此相对的是专用显卡,自带内存,即所谓的 VRAM。然而,这也增加了尺寸并需要其自身的冷却。因此,专用 GPU 是独立的组件,通常通过 PCI 接口连接到主板。由于它们自己的内存,它们的功能要强大得多,例如,用于游戏或机器学习目的的设备。剩余文章的大部分将主要讨论专用显卡,因为现在有更多的用例需要这样的 GPU。

显卡有哪些组成部分?

在许多情况下,GPU 由以下组件组成:

  • 风扇
  • 冷却装置
  • 图形处理器
  • 记忆
  • 存储接口
  • 图形输出接口(VGA、Displayport 等。)

Rafael Pol 在 Unsplash 上的照片

我们现在将详细介绍最重要的组件:

图形芯片

显卡芯片做显卡的实际工作,是系统的大脑。这是图像计算的地方。例如,其他组件主要用于尽可能多地装备图形芯片,以便它能够以最高性能工作,而不必等待内存。

图形存储器

图形存储器存储计算图像和视频文件所需的所有数据。如前所述,独立内存可用于绕过对计算机主内存的访问,从而保持计算机的性能。

内存大小和连接在选择中起着决定性的作用,因此图形内存不会遭受性能损失。总的来说,显卡中没有任何组件需要妥协,否则,无论其余组件多么强大,整个系统的性能都会受到影响。

存储接口

存储器接口决定了可以访问数据的带宽。带宽越高,短时间内可以传输的数据就越多,这对于高帧率的电脑游戏,也就是有很多变化的图像来说,尤为重要。

存储器接口的更高比特率通常可以等同于更高的性能。你可以把内存接口想象成图形芯片的“存储器”。比特率越高,可用的存储区域就越大。反过来,有了更多的区域,数据可以更清晰地放置,从而可以更快地再次使用。在许多显卡中,内存接口是阻碍系统性能提升的瓶颈。

冷却装置

强大的 GPU 只有结合足够的冷却单元才能真正发挥性能。否则,GPU 可能会很快过热,必须降低性能以防止损坏。然而,GPU 通常应该能够在短时间内承受 100°C 的温度。

根据 GPU 的不同,使用主动被动冷却。主动冷却仍然是从旧设备中得知的,当性能提高时,这些设备会发出明显的风扇噪音。主动冷却的特点是主动尝试将热量从芯片中带走。在大多数情况下,仍然使用风扇,风扇根据热模式以更高或更低的速度运行。然而,这样做的缺点是,在大量使用时会出现已经描述过的声音模式。

另一方面,在被动冷却中,热量通过冷却介质(如液体)从芯片中散发出去。冷却装置的表面设计得非常大,以便能够在负载下吸收大量热量。这意味着即使在高性能下也不会有额外的噪声。

哪些应用需要好的显卡?

正如我们已经看到的,所有具有视觉输出的程序都需要一个显卡来创建相应的图像和视频。然而,集成显卡对于许多程序来说已经足够了。

除此之外,还有一些特殊的应用程序需要更高的图形性能,因此没有强大的专用显卡是不行的。其中包括:

  • 游戏:为了在充满动作的电脑游戏中实现快速的图像变换,强大的显卡必须能够在短时间内处理大量数据。
  • 3D 建模:当设计和规划新的汽车、机器或其他部件时,会创建 3D 模型来可视化组件。如果要从不同的角度观察元件,图形卡必须在几分之一秒内计算出新的视图,否则图像可能会抖动。
  • 图像处理和视频编辑:如今,图像和视频的分辨率越来越高,即它们包含的像素比以前更多。为了能够快速处理所有这些像素,GPU 也需要更高的性能。
  • 机器学习 :机器学习的主题实际上并不太适合前面的列表,因为这里不需要高分辨率或快速变化的图像序列。然而,强大的显卡对于机器学习也非常重要,因为所谓的张量用于工作和计算。这些非常类似于图像的数字表示。因此,GPU 计算机器学习模型的速度比传统处理器快得多。

如何找到完美的显卡?

首先,最好确定你愿意花在新 GPU 上的预算。这个市场就像许多其他市场一样,通常你只能以更高的价格获得更多的性能。目前,你不可能买到低于 180 €的好的专用显卡。以下所有型号在大多数情况下并不比已安装的 GPU 更强大。

中档型号的价格从 300 到 550 €不等,对于当前的游戏来说应该足够了。只有 550€以上的车型才能实现绝对顶级的性能。在许多排名中领先的显卡,配备 24 GB VRAM 的英伟达 RTX 3090 Ti,甚至在 1500€左右。

如前所述,GPU 嵌入在一个组件系统中,只有在与 PC 的其余部分顺利交互时才能提供最快的性能。所以,光有非常好的显卡是不够的,还要搭配新的组件,像强大的处理器。特别是新的和通常也是昂贵的 GPU 也应该被最新的组件包围,以便充分发挥它们的潜力。

最后,必须确保与以前的计算机兼容,否则,显卡将无法使用。为了安全起见,您可以使用许多免费的 PC 配置器之一,并检查兼容性。为此,您只需选择您已经拥有的组件,如 CPU、RAM、主板等。,然后选择您想要的图形卡。这将对组件是否适合在一起给出明确的答案。此外,不仅与其他组件的兼容性很重要,而且新 GPU 还有足够的安装空间。

这是你应该带走的东西

  • 图形卡,也称为图形处理单元(GPU),负责在计算机中计算图像,然后可以在显示器上显示。
  • 图形卡可以安装在计算机的主板上,即集成的,或者作为外部组件连接,即专用的。
  • 它由几个重要的组件组成,如图形芯片、图形内存、内存接口和冷却。只有当这些组件充分协调时,才能获得显卡的全部性能。
  • 强大的显卡对于游戏、图像编辑和机器学习尤为重要。
  • 选择新显卡时,应考虑与其他组件的兼容性。

如果你喜欢我的作品,请在这里订阅https://medium.com/subscribe/@niklas_lang或者查看我的网站* 数据大本营 !还有,medium 允许你每月免费阅读 3 篇 。如果你希望有无限制的 访问我的文章和数以千计的精彩文章,不要犹豫,点击我的推荐链接:【https://medium.com/@niklas_lang/membership】每月花$5***获得会员资格**

* *

为什么数据需要按摩?

原文:https://towardsdatascience.com/why-does-data-need-a-massage-5c7170bac45a

数据转换基本原则的概述

图片由 Unsplash 上的 Adeolu Eletu 拍摄

这篇文章是“创业分析”系列的一部分,因此它可能对那些刚刚开始弄清楚如何构建自己的 BI 解决方案的人有所帮助。我试图回答我在 BI 实施阶段开始时经常听到的最常见的问题。为什么我们需要做任何数据转换?这是一个非常合理的问题,因为数据转换可能是实施过程中最具挑战性、最耗费时间和金钱的部分。

这不是任何类型的教程,而是基本原理的鸟瞰。

为什么我们需要转换数据?

实际上,我们不需要。如果来源只是一个简单的系统或几个谷歌表,那么我们没有。然而实际上,我们通常从一开始就有很多来源,例如某种 CRM、Google analytics、google sheet、我们产品的数据库、网站等等。

转型的主要思路是:

  • 加入数据
  • 使数据非正常化

我相信连接不同来源的数据是显而易见的。我们需要将 GA 和 CRM 结合起来,以了解客户端设备和薪水、客户端位置和客户端偏好或产品类型之间是否存在任何关联。我们可能需要能够执行某种基于地理的群组分析,等等。
这是一个不太明显的想法,为什么我们需要“反规格化”,在我们的例子中什么是“反规格化”?

反规格化

源系统通常为处理用户请求、某种操作事件而优化。在大多数情况下,一种手术是与其他手术分开的。换句话说,当系统创建用户订单时,我们只对这个特定用户的信息感兴趣,不需要(或几乎不需要)其他用户的信息。从数据的角度来看,这里通常使用的是所谓的规格化形式

在这一点上,我必须补充一点,不是所有的计算机系统都是这样工作的,不是所有的计算机系统都使用关系数据库,但是为了简单起见,让我们假设我们处理的是一个类似于中等规模的电子商务商店的关系数据库。

在我们的例子中,我们需要收集的用户相关数据的 ER 图可以是这样的:

作者图表

系统可以执行某些预定义的操作,如用户创建、用户地址的更改、用户删除或停用、用户订单的位置等。所有这些预定义的操作通常在应用程序开发阶段变得清晰,并且可以由开发人员进行编码。当然,发展页可以像“永远”,但这是另一个故事。关键是我们定义,我们编码,我们使用正确的开发方法,每个人都很高兴。

从分析的角度来看,情况是不同的。我们可能需要计算按国家或地区、按操作、按第一个/最后一个操作名称、订单数或不同页面或网站上的其他用户操作细分的用户数。由于分析本身是一个数据驱动的过程,分析师通常无法预先制定需要什么样的具体切片分析。换句话说,在 BI 系统实现阶段,分析师可能需要执行的操作集不是预先定义的。

我们可以将分析师的请求看作是对 BI 系统的查询,或者更专业地说,是对分析数据库(数据仓库,DWH)的查询。并非所有的分析师都非常精通技术,不仅分析师对数据感兴趣,任何业务用户都可能需要访问数据来做出深思熟虑的数据驱动的决策。这意味着我们需要某种程度的抽象,为此目的的行业标准是维度事实模型。这个模型的思想是定义一个简单的模型,由事实(比如我们的例子中的用户行为)和维度(任何可以分割数据的东西)组成。下面是它可能的样子:

作者图表

在这种情况下,任何分析查询都将始终是这三个具有不同聚合函数和过滤器的表的连接。我们现在不需要编码所有可能的查询。我们唯一需要实现的是一组度量(类似于 SQL 中的聚合函数)和一组维度。

这是一个非常基本的例子,维度事实模型有它的复杂性和警告,但它应该足以让我们基本理解为什么我们需要转换数据,这是现在的重点。

怎么做

我前面提到的转换可以通过多种不同的方式执行,每个 BI 系统都有自己的机制,但一种常见的方式是在 DWH 级别(即数据库级别)执行大多数转换。如果这样的数据库支持 SQL 标准,那么我们需要的一切就是 SQL 查询。不仅仅是 SQL 查询,还有存储它们的地方、执行它们的机制和组织执行序列的方法。

人们可以使用许多数据库的嵌入式可能性来将对象(如视图和存储过程)存储在数据库本身和执行调度程序中,或者使用任何外部工具。我个人更喜欢使用一些外部工具,比如 DBT。它允许在 GIT 中存储所有内容,并提供了一种重用现有代码的机制,将查询与自动测试和文档结合起来,并具有许多其他优秀的特性。另外,它是一个开源工具。这是我的选择,我有一些成功的项目,所有的事情都是通过 MS SQL 或 PostgresSQL 完成的,不需要任何额外的工具。

为什么 FFT 只适用于高度复合的输入?

原文:https://towardsdatascience.com/why-does-the-fft-only-work-for-highly-composite-inputs-7bbaa718351e

以及如何调用复数来解决卷积上的 leet 码问题

美国国家海洋和大气管理局在 Unsplash 拍摄的照片

许多人认为复数是一个深奥的概念,出现在数学的深处,远离实际应用。

现在,考虑计算机视觉中最有影响力的算法是卷积神经网络。因此,尽可能高效地执行卷积的算法非常重要。为了开发最有效的算法,你需要调用复数。通过快速傅立叶变换(FFT)。

复数在算法开发领域的立足点主要是通过 FFT 算法,这种算法具有不合理的影响,以至于有人将其称为本世纪最重要的算法。我们将花一点时间激励它,然后探索它令人讨厌的特性,在这个过程中了解它的工作方式。

I)动机:多项式和卷积

在我们纠结于如何快速执行傅里叶变换之前,让我们先了解一下为什么我们会在意。

Cormen 等人[clr_text_book]所著《算法导论》一书的第 30 章题为“多项式与 FFT”。为了从算法的角度理解 FFT,我们需要从多项式开始。一维多项式是形式为\(x\)的函数:

上面的等式可以产生直线、抛物线、椭圆等。由于 x 的最高幂是 n-1 ,如果 a_{n-1},这将是一个 n-1 次多项式!= 0 。现在,我们如何在计算机内存中表示一个一维多项式呢?最简单的想法是取系数, a_0,a_1,… a_{n-1} 并将它们放在一个数组中,因为系数完全指定了多项式。这被称为系数表示法。在面向对象的编程范例中,我们可以编写一个类,它的实例(对象)由系数数组定义。既然我们已经在计算机中表达了多项式,我们希望能够对它们进行算术运算。加法很简单。你只要把系数向量加在一起。如果一个多项式对应的数组比另一个大,没有问题。通过向较短的一个填充零,使它们大小相同。一旦你否定了第二个多项式的所有系数,减法实际上就是加法。让我们忽略除法,因为将两个多项式相除大多数时候会导致一个甚至不是多项式的东西。乘法是非常有趣的(既不是微不足道的也不是不可能的),我们将用它来激励 FFT。

假设我们要将两个多项式相乘——第一个多项式由系数给出: a_0,a_1,a_2 第二个由: b_0,b_1,b_2 。将它们相乘得到多项式:

这个结果多项式具有系数 c_0,c_1,c_2,c_3,c_4 ,其中:

上面的等式看起来很混乱,但是它们简单地来自乘法的分配性质。这意味着第一个多项式中的每一项都要乘以第二个多项式中的每一项,这意味着一个双 for 循环,一个循环遍历第一个多项式的项,另一个遍历第二个多项式的项。

这是在下面的 Python 代码中实现的,该代码将表示要相乘的多项式系数的两个数组作为输入,并将相乘后的多项式的系数数组作为输出。

上面的函数很好很简单,只有两个循环。如果第一个多项式的次数为 n (意味着数组 a 具有 n+1 个元素,包括常数)并且第二个多项式的次数为 m ,则计算次数(乘法、加法等)为。)算法执行将大致为C1+C2。(n. m) 对于某些常数C1C2(因为两个循环)。另一种说法是,该算法的时间复杂度是O(n·m)(因为它在任何计算机上花费的时间将与执行的计算次数成比例)。

对于特殊情况 n=m ,这变成了 O(n ) ,这意味着运行时间与输入的大小成二次比例。为了简单起见,我们将在本节中假设这种特殊情况,在第三节中再次推广到 nm

请注意,上面的 Python 代码只是将两个数组作为输入,并生成一个数组作为输出。在代码本身中没有关于多项式的显式上下文。事实上,在多项式领域之外,有一种操作的名称,它将向量【a _ 0,a_1,a _ 2】【b _ 0,b_1,b _ 2】作为输入,并将向量【c _ 0,c_1,c_2,c_3,c _ 4】作为输出。这叫做“卷积”。除了等效于多项式乘法之外,它在概率论中用于确定两个随机变量之和的分布,并且也是卷积神经网络中的基本操作,卷积神经网络是当前计算机视觉中的前沿模型。

概括地说,用多项式的系数表示,我们可以轻松地执行加法和减法,但乘法有点困难。在计算机内存中,有没有其他方法来表达多项式,使乘法变得容易?

确实有。如果我们对多项式 x_0,x_1,…x_{n-1} 取任何\(n\)个输入,并在每个输入处对多项式求值(得到 y_0,y_1,… y_{n-1} ),那么对:

也会完全指定多项式(出于显而易见的原因,称为点值表示)。这是因为将这些 x_i 值中的每一个代入多项式并使其等于 y_i 会产生\(n\)个系数中的一个等式, a_0,a_1,… a_{n-1} (这里是未知的)。由于有 n 个方程和 n 个未知数,我们可以从这些方程中取出所有的系数,因此完全指定了多项式。

如果在这种表示中给我们两个多项式(两个多项式的次数都是 n 并且具有相同的 x_i ),那么将它们相乘就变得微不足道了。如果第一个多项式在 x_0 处为 y_0 ,第二个多项式在 x_0 处为y _ 0’,那么在 x_0 处为它们乘积的多项式的值是多少?简单来说就是y _ 0y _ 0’。同样,我们可以得到所有nx _ I 的乘积值。

但是这张图有个问题。我们将两个 n 次多项式相乘得到的多项式的次数为 2n (因为两者的 x^n 项相乘将得到一个次数为 2n 的项)。因此,我们需要 2n 个点值。但是,如果我们只为两个输入多项式存储了 n ,我们就没有足够的项来计算它们的乘积,这需要 2n 个值。

我们需要的是,能够有效地从系数形式中,得到我们想要的任意数量的点的点值形式。然后,我们可以只为两个多项式生成 2n 个点值,并将每个 i 的两个多项式的 y_i 逐点相乘,以获得乘积多项式的点值表示。

假设我们有一个多项式的系数形式,想要得到点的点值形式: x_0,x_1,… x_{n-1} 。所以,我们想找到:

因此,我们有大约 n 个系数和 x_i 的幂之间的乘法运算要执行。也就是说,这种算法的运行时间将按比例缩放为 O(n ) 。一旦我们得到这两个多项式的点值表示,进行实际的多项式乘法只是另一个不改变复杂度的 n 乘法, O(n )

由于使用之前的 Python 算法直接进行卷积也是一个 O(n ) 运算,所以到目前为止,这种转移到点值表示的技巧对我们来说并没有多大作用。

但是我们还有一张牌可以打。可以选择一组 x_i ,使得移动到点值表示变得更加有效。快速傅立叶变换(FFT)算法使用特殊的 x_i 值来大幅提升性能。我们将在下一节深入研究这个算法。作为一个引子,那些特殊的 x_i 值是复数。在那之后,我们将选择多项式乘法。

为了概括这一部分,我们描述了一维多项式(只有一个变量, x ),考虑了将它们存储在计算机上,以及将它们相乘如何等价于它们系数的一维卷积。有一段时间,占主导地位的计算机视觉算法是卷积神经网络。这里的基本操作是将图像视为像素值的二维数组,并与另一个更小的二维数组(称为内核)进行卷积。除了机器学习之外,图像上的这种卷积运算对于检测边缘、模糊等目的也是有用的。这个在视频中被 3 蓝 1 棕[3b1b _ 卷积]很好的掩盖了。

图像实际上可以被认为是两个变量的多项式( xy ),内核也是如此。卷积运算只是将对应于图像的多项式与对应于内核的多项式相乘。但那是另一天的话题。

II)书中的算法

在上一节中,我们描述了我们的目标是如何将表示为系数数组的多项式有效地转换为点值表示。直接的方法包括简单地在所有点上评估多项式,并且其运行时间与系数的数量成比例为 O(n ) 。然而,这是针对一组通用的 x _ I 的,我们承诺会有一些 x _ Ix _ I会变得更有效。而那些特殊值就是单位的第 n 个根。方程的解:

[clr_text_book]第 30 章中的算法可以做到这一点,但有一个警告,输入数组的大小必须是 2 的幂。这有点令人失望,因为你在现实世界中遇到的大多数输入你都期望不*是 2 的幂。

他们说可以处理非 2 次方大小数组的算法是存在的,但是超出了本书的范围。然后,在练习中,他们询问相应的算法,该算法将对 3 的幂起作用(但不询问实现)。这给了一个提示,如何得到一个更通用的算法。我们暂且假设\(n\)2 的一个幂,在这一节用一些图片描述书中的算法(这一节应该算是对书本身的补充)。然后,我们将描述是什么阻止我们将非幂的 2 输入传递给算法。最后,我们将归纳出一种算法,该算法适用于大小为 3 的幂的输入,并描述如何将一组这样的算法组合成一个更通用的算法,该算法可以适用于任何高度合数的输入。对于大多数 FFT 应用,我们可以自由选择输入大小。因为我们总能找到一个非常接近任何数的高度复合数,这就足够了。

II-A)团结之根速成班

注意:如果你已经熟悉了单位的 n 次根,你可以直接跳到减半引理这一小节。

数字 i

没有一个实数,它与自身相乘的结果是 -1 。起初,人们满足于说平方根的概念根本不适用于 -1 等负数。但是,即使在试图寻找一般三次方程的根时, -1 的平方根仍不断出现(结果是,它最终会抵消,产生一个实数)。而人们最终说“如果 -1 的平方根不存在于实数线上,不代表它在任何地方都不存在”。他们创造了一个新的数, i 被明确定义以满足与自身相乘将导致 -1 的性质。因为它存在于“实数”范围之外,所以它被称为“虚数”。事实是,所有的数字(实数或复数)都是我们为了理解世界而发明的虚构概念。

复杂平面

一旦你有了新的数字 i ,你可以把它乘以 2 得到一个新的数字 2i 。事实上,对于每一个实数,我们都可以把它乘以 i ,得到一个由复数组成的全新数系。我们可以把原来的数轴放在二维平面的 x 轴上,把新的复数放在 y 轴上。这种特殊的二维平面被称为“复平面”。请注意,将 0 乘以 i 得出 0 ,就像任何其他数字一样。所以, 0 是两条线相交的地方。在这个二维平面上具有坐标 (x,y) 的点可以写成: x+iy 如图所示。

图 1:复杂平面。图片作者。

单位圆

虽然整个复平面很吸引人,但我们将只关注位于单位圆上的点,圆心在 0 。从原点(也是圆心)到每个点的距离是 1 。圆上的任何点(例如下图中的红点)完全由它与 x 轴的角度 θ 指定。可以看出,绿色和红色的点是斜边为\(1\)(圆的半径)的直角三角形的一部分。所以,红点的 x 坐标是那个直角三角形的底边, cos(θ) ,y 坐标是直角三角形的垂线, sin(θ) 。所以,点本身用复数表示: cos(θ)+i sin(θ) 。而以尤拉的著名身份,这位无非是 e^{iθ}

图 2:复平面上的单位圆。每个点都由一个数字来表示,θ是 x(实数)轴和指向该点的矢量之间的角度。图片作者。

所以我们已经确定,圆上的任何一点都由 e^{iθ} 指定。现在,当我们把这个数提高到 T2 的 n 次方时会发生什么?

等式(2):将单位圆上的一个数提高到 n 次幂,只是将其旋转乘以 n。

我们在由角度 描述的同一个圆上得到一个新点。

团结的根源

现在,让我们回到寻找统一的第 n 个根的问题上。满足以下等式的值:

让我们从右手边开始。只是一个 1 。但是我们只想说单位圆上的点(形式为 e^{iθ} )? θ 的哪些值导致 1 ?当然, θ=0 满足这个要求,因为任何数的 0 的幂1 并且 i 乘以 00 。所以, x=e^{i 0} = e⁰ = 1 总是一个解。但是还有更多。

现在,想象从 θ=0 开始,逐渐增加 θ 。当我们这样做时,我们绕着圆圈移动。

图 3:数字 1 由许多复数表示。每当圆圈循环一次,你就回到 1。作者使用https://github.com/ryu577/pyray创建

θ = 2𝜋 会发生什么?我们绕着它转了一整圈,发现自己又回到了 1 处。
所以, e^{i 2𝜋} 也等于 1 。当我们继续增加 θ 超过这个值时,我们进行另一个循环,在 θ = 2𝜋+2𝜋=4𝜋 处,我们回到 1 处。这里的模式是,所有 2𝜋的整数倍都以 1 结束。所以,

我们想要求解的方程变成了:

取两边的第 n 个:

现在,我们的原始方程似乎有(可数的)无穷多个解。所以,我们从只有一个解( x=1 )到现在的无限解。但是如果你更深入一点,你会发现并没有真正的无限不同的解决方案。你得到 n 不同的解决方案,然后它们开始重复。第一种解法是 x=1 对应 k=0 。第二个是 ω_n=e^{2i𝜋/n} 对应 k=1 。这被称为“单位的主根”,其他的都是这个的整数次方。第三个是 e^{4𝜋 i/n} = ω_n 对于 k=2 以此类推。一旦我们到了 k=n ,我们就得到了 e^{2𝜋 n/n} = e^{2 𝜋} = 1 (与 k=0 时相同)。并且用 k=n+1k=1 是同一个数。因此,只有范围从 0n-1k 的值产生了我们之前没有看到的明显的根。

我们来考虑一下 n=3 的情况。换句话说,我们现在正在寻找单位的立方根,这些数字满足:

插入:

,对于 k=0,1,2 ,我们得到以下 3 个不同的值,然后,它们开始重复。

图 4:单位的立方根。作者图片

减半引理

现在,我们来了解一下最重要的概念,这个概念对于我们如何在快速傅立叶变换中获得加速非常重要,同时我们也来了解一下为什么 FFT 只能处理高度复合的输入。

如果你在\(n\)恰好是偶数时取第 n 个单位根,并将它们全部平方,你就得到第 n/2 个单位根。但是从上一节中,我们知道确切地有 n 个不同的 n 个根和 n/2 个不同的 n/2 个根。因此,当我们对第 n 个的根求平方时,只有一半的根是不同的数字,而另一半的根只是环绕并重复现有的根。正是这种冗余的引入帮助我们节省了一些计算并加快了速度。

这在下面针对 n=8 的情况进行了演示。将团结的每一个第 8 根平方带给我们四个不同的点,团结的第四个根。

图 5:如果我们把单位的 8 次方根全部平方,前四个就成了单位的 4 次方根,接下来的 4 个循环并与前四个重合。图像创建使用:https://github.com/ryu577/pyray

II-B)各个击破

现在,让我们看看减半引理实际上是如何被用来创建一个有效的算法。记住,FFT 的问题陈述非常简单。给定一个多项式的 n 个系数(存储在一个数组中),在单位的第 n 个根处计算该多项式。

首先考虑一种简单的方法,这种方法需要进行 O(n ) 计算,我们可以把这些想象成一个表,沿着表的列放置 n 个系数(输入),沿着表的行放置 n 个单位根。在表格的 i,j 单元格中,我们将该行对应的 ω 提升到 j 的幂,并乘以 a_i ,即该单元格所在列的对应系数。然后,我们对所有行求和,得到每列一个元素(见下图的绿色部分)。这些 n 元素被打包成输出向量, y 。整个过程如下图所示。

图 6:将简单的离散傅立叶变换可视化为矩阵。图片作者。

为了改进 O(n ) 的计算,我们使用了一个技巧,依赖于上一节中的减半引理,并帮助将问题分成更小的子问题。这是在许多 CS 算法中出现的分治策略,如合并排序、有序数组中的二分搜索法等。

由于引理涉及平方所有的单位根,我们试图仅用原始输入的平方来表达感兴趣的方程。我们想要做的所有评估都是在形式的单位的\(n\)个根中的每一个上的多项式:

我们能修改这个方程,使它只涉及 x 中的多项式吗?让我们先摘低垂的水果。已经有 x 及其幂的系数,也就是均匀索引的系数。将这些和剩余的(奇数索引系数)分离出来,我们可以写出原始多项式:

现在,我们希望将原始多项式分解成更小的多项式,这样我们就可以分而治之,

所以,我们成功地将原多项式分裂成两个多项式。这两个多项式都只涉及 x 的幂。由于第一个多项式甚至具有来自原始多项式的索引项,我们可以将其称为 A_0(x) (索引使得除以 2 的余数是 0 ),类似地,第二个多项式可以称为 A_1(x) 。这给了我们:

等式(3)

其中:

因此,在第 n 个单位根处计算 A(x)ω_n⁰、ω_n、… ω_n^{n-1} 的原始问题简化为在第 n 个单位根的平方处计算多项式 A_0(x)A_1(x) 。两个新多项式都更小,并且具有 n/2 个系数。

现在,上一节的减半引理出现了。当我们平方 n 个单位根中的每一个时,第一个 n/2 个恰好是不同的 n/2 个单位根。剩下的 n/2 个如图 5 所示循环重复。所以,我们不用再计算多项式了。因此,我们需要计算多项式的点数也减少了一半。并且由于 n 根的平方是 n/2 根,这两个子问题涉及在单位的 n/2 根处评估具有 n/2 系数的多项式,因此也是离散傅立叶变换问题,只是具有不同的(更小的)系数阵列。除法步骤现在完成了。但是现在我们知道了如何除法,我们就不仅仅停留在一个除法上了。相反,我们继续前进,直到我们遇到基本情况,这是一个长度为 1 的数组。此时,傅立叶变换就是数组本身的元素。划分问题的过程是 FFT 带来的速度的核心。下图直观地显示了这一点,以进一步加强直觉。我们为 n × n 乘法进行设置,如图 6 所示。但是接下来,我们将 n × n 矩阵分成两个更小的矩阵,每个矩阵的大小为 n × n/2 。矩阵的红色部分只是蓝色部分的重复,所以可以丢弃。这就使得两个更小的矩阵 n/2 × n/2

图 FFT 算法的除法步骤。将原矩阵分成两个 n*n/2 的矩阵。这些矩阵的红色区域不需要计算,因为它们是蓝色区域的重复。原始矩阵的蓝色区域是用等式(3)从两个较小的蓝色区域和用等式(4)从黄色区域计算的。图片作者。

为了获得原始矩阵的蓝色部分,即来自0->n/2–1的输出值,我们可以通过等式(3)使用两个分离矩阵的蓝色部分。为了得到原始矩阵的黄色部分,从 n/2 - > n-1 的输出值,我们可以使用下面的等式:

现在,根据定义,

将这些代入方程(4),

等式(4)

有了分而治之的工作原理的背景,我们可以介绍 Python 代码了(注意:它的初始框架是由 ChatGPT-3 编写的,其余部分是从[clr_text_book]第 30 章中的伪代码翻译过来的)。

第 10 行是递归的基本情况,大小为 1 的数组。这里,离散傅立叶变换仅仅是阵列本身。

第 20 行和第 23 行利用了我们的观察结果,即我们可以将 FFT 分成更多大小为一半的 FFT。

然后,第 29 行中的 for 循环组合两个较小的 FFT,并根据等式(3)(第 30 行)和(4)(第 31 行)产生较大的 FFT。

II-C)复杂性分析

为了理解这种方法带来的加速,让我们看看更简单的简单实现,让我们考虑执行一个 8 元素数组的离散傅立叶变换。为了计算所有不需要分而治之的操作,让我们回到图 6 中的矩阵。

图 6:为了清楚起见重复了一遍。作者图片

在上面的矩阵中总共有 64 个单元,并且它们都需要至少一次乘法(将系数与复数相乘)。因此,这至少需要 64 次乘法(也需要计算复数根,但我们会忽略这一点,因为任何方法都需要它)。为了将它们相加并得到输出 y 向量,我们需要对每一行求和。将 8 个数相加需要 7 次加法,因此需要额外的 7 × 8 = 56 次加法。因此,朴素方法有 64 次系数复数乘法和 56 次加法。让我们看看各个击破的效果如何。

“fft_2”程序中算法的实现方式如下面的图 7 所示。我们从 8 元素数组开始,想要得到 DFT。我们在代码中引用的 y_0y_1 ,我们在下图中为左右数组调用 y_ly_r (因为这就是它们在递归树中的排列方式)。当 y_l 被分割成两个更小的数组时,它们分别被命名为 y_{ll}y_{lr} 等。我们看到只有三个递归层次进行算术运算。这并不奇怪,因为 log_2(8)=3 。在图的左边,我们看到递归树的每一层都发生了 8 次乘法和 4 次加法。总共有 24 次加法和 12 次乘法。与简单方法的 64 次乘法和 56 次加法形成对比。

图 FFT 程序带来的计算优势。

一般来说,每次迭代中的问题大小被分成两个子问题,每个子问题的大小是原来问题的一半。然后,我们需要一个 for 循环(或 O(n) 计算)来组合两个子问题的输出,并解决感兴趣的原始问题。假设大小为 n 的输入数组所需的总操作数是 T(n) 。每次拆分成两个子问题,我们都需要做 2T(n/2) 的功来解决其中的每一个,然后 O(n) 的功来组合它们,意思是 c.n+d 对于某些常数, cd 。这可以表述为:

继续这种模式,

n/(2^k)=1n=2^k 时我们停止。这意味着:

在那个阶段,我们得到\(T(1)\)这是零加法或乘法。代入上面的等式,我们得到:

也就是 O(n.log(n)) 计算。

III)回到多项式

首先,让我们把第一节中的 lose end 连接起来,并描述这个新的分治算法将如何帮助执行多项式乘法比 double for-loop 快得多。假设我们有两个用系数数组表示的多项式。这些数组的大小是\(n\)\(m\)。这两个多项式看起来类似于:

第一多项式的次数( x 的最高次)为 n-1 ,第二多项式的次数为 n-2 。因此,乘积多项式, C(x) 的次数为 n+m-2 ,如下所示:

总共有 n+m-1 个系数。

为了进行乘法运算,我们首先要将两个输入多项式转换成点值形式。一旦到了那里,只要两者被评估的点是相同的,我们就可以逐点相乘得到\(C(x)\)的值。要指定\(C(x)\)\(n+m-1\)个系数,我们需要\(n+m-1\)个点来计算它们。因此,我们希望\(A(x)\)\(B(x)\)也按\(n+m-1\)点计算。但是,它们分别只有\(n\)\(m\)个系数,对它们应用傅立叶变换将分别在\(n\)\(m\)个单位根上对它们求值。所以,我们让它们都有\(n+m-1\)个系数。方法是假设它们都是 n+m-1 次多项式。只要在最后加上零系数。所以,这两个多项式变成:

只需将这些较大的零填充数组传递给 FFT 例程,它将计算每个单位的第 n+m-1 根上的两个多项式的值。这些步骤将花费 O((n+m))。log(n+m)) 时间。

然后将这两组 n+m-1 值逐点相乘,耗时 O(n+m) 时间。现在我们已经有了在这些 n+m-1 单位根上的 C(x) 的点值,我们可以回到那个多项式的系数表示。这最后一步被称为逆傅立叶变换(因为它做的事情与傅立叶变换相反)。而按照[clr_text_book]的定理 30.7,这也可以在 O((n+m)log(n+m)) 时间内完成。事实上,FFT 程序只需要稍微修改一下,就可以转换成逆 FFT 程序。

整个过程耗时 O((n+m))。log(n+m)) 时间,这比天真的方法的 O(nm) 要好。

[clr_text_book]的图 30.1 形象地显示了这两种方法(它们考虑了情况 n=m )。我无耻地把那个图贴在这里。

图 8:两个多项式直接相乘是 O(n)。但是有另一条路,一条捷径。图片摘自[clr_text_book]。

但是我们难道没有忘记我们的有效实现只对 2 的幂有效吗?如果 n+m-1 不是 2 的幂呢?一个解决方案是找到下一个更大的数字,它是 2 的幂。如果我们幸运的话,可能会很接近。但是如果 2 的下一个幂非常遥远呢?为什么我们会受到这种限制呢?

为什么是 2 的幂?

乍一看,似乎整个分而治之的模式就是我们被 2 的力量困住的原因。直到你意识到[clt_text_book]充满了分而治之的算法。例子是二分搜索法,排序算法像合并排序和快速排序等等。并且它们都没有仅作用于作为 2 的幂的输入的限制。即使你实现它们时假设输入大小是 2 的幂,然后给它们数组的大小不是 2 的幂,它们也能工作。事实上,FFT 是那本书里唯一没有推广到 2 的非幂的算法。如果给 fft_2 例程一个大小不正确的数组,会发生什么?没有东西损坏,没有爆炸发生,也没有抛出错误。但是,可悲的是,产生的值是不正确的。它们不会与你从简单方法中得到的相匹配。

限制的原因是使用了第二节中的减半引理。如果你在 n 为偶数时取第 n 个单位根并将它们平方,你将得到第 n/2 个个单位根,最后的 n/2 个值将很好地合并到第一个 n/2 个中。但是如果 nn不均匀,这整个事情就破裂了。首先, n/2 甚至不是一个整数。对复数求平方甚至不会产生单位的[n/2]根或任何东西。这就是为什么假设 when n 不相等只会导致错误的答案。因为我们希望能够一直进行到基本情况的分割, n 必须是 2 的幂,fft_2 例程才能工作。

但是,如果 n 不是 2 的强大力量,而是有惊无险呢?假设我们有: n=32 ⁰* 。当然,我们可以尝试在 n=42 ⁰* 处评估 FFT,但如果我们稍微修改 fft_2 例程,并在 2 假设失效时使用一种“弹出按钮”,即使这样也没有必要。当我们递归地将 32 ⁰* 大小的数组分成两部分时,我们将保持均匀的数组大小,直到到达 6 。然后,当我们进一步把它分成大小为 3 的数组上的两个调用时,我们就默认了只计算多项式的简单方法。我们所需要的是在最顶端的一个“如果”条件,检查 n 是否是 2 的幂,如果是,返回到简单的例程。

但是如果我们有一个输入大小为 n = 3⁷2* 的数组呢?一旦我们用完了两种分割方式(这将很快发生),我们最终会得到两个大小分别为 3⁷ 的非常大的数组。在那一点上,你会希望有一个例程来处理 3 输入的功率,而不是 2 的功率。事实上,是有的。正如我们可以为其他分治算法选择“除法”的数目一样,我们也可以为 FFT 选择“除法”的数目。在下一节中,我们将介绍 FFT 的一个版本,fft_3,它基于 3 大小的输入功率工作。现在,我们可以有一个主例程,只要输入是偶数,它就将数组传递给 fft_2,如果它是 3 的倍数,则传递给 fft_3,并传递给原始实现作为最终的后备。但是我们可以有前 m 个质数的版本,fft_2、fft_3、fft_5、fft_7、fft_11 等等。现在,只要我们得到高度复合的输入数组大小,我们仍然可以获得 FFT 的所有好处。很容易找到一个仅比任何 n 稍大的高度复合数,这足以满足我们的多项式乘法和大多数其他用例。

3 次方的 FFT

最后,让我们介绍一种 FFT 算法,它工作在 3 的幂上,而不是 2 的幂上。这种方法显然可以扩展到任何数字(但我们想把它用于素数)。正如上一节所讨论的,fft_2 例程对输入大小而不是 2 的幂给出错误答案的原因是减半引理。如果我们想让它适用于 3 的幂,我们需要一个相应的“三等分引理”。

如果\(n\)3 的幂,并且你取第 n 个单位根并将它们全部立方,你得到第 n/3 个单位根。其他的 2n/3 根刚好缠绕并与 n/3 根重叠。

这将使我们能够将 FFT 分成三个子问题。但是,我们还想知道如何将它们组合成我们想要的 FFT 阵列。将等式(4)推广到三路分割的情况,数学计算如下:

图 9:解决如何填充 3 路 FFT 分裂的数组。

在最后一步中,我们使用了以下事实:

有了所有这些事实,我们就有了 fft_3 算法:

结论

FFT 不仅仅是一种局限于信号处理的算法,许多人在信号处理领域都有所了解。它有广泛的应用,甚至延伸到意想不到的领域,如微分方程和深度学习。这是一种将复数的数学之美与冷静、高效的算法思维相结合的算法。与其他分治算法不同,它有一个奇怪的怪癖,这意味着它只有在被分成精确的部分时才起作用。这就是为什么它的效率增益只适用于高度复合的输入。但是对于大多数实际应用来说,这不是问题,因为我们在选择输入大小方面有一些自由。即使对于大质数,也有办法利用它带来的效率。

如果你喜欢这个故事,成为推荐会员:)

https://medium.com/@rohitpandey576/membership

参考

【Veretasium _ fft】:Veretasium 关于 FFT 算法的视频:https://www.youtube.com/watch?v=nmgFG7PUHfo

[clr _ text _ book]:Cormen 等人的《算法导论》第三版。

[3b1b _ 卷积]:视频由 3 蓝 1 棕“但什么是卷积”https://www.youtube.com/watch?v=KuXjwB4LzSA

为什么折线图中的动态颜色需要在 Power BI 中采用不同的方法

原文:https://towardsdatascience.com/why-dynamic-colors-in-line-charts-need-a-different-approach-in-power-bi-b1dc5ffe7549

我们不能在 Power BI 中对折线图应用条件格式来控制线条的颜色。但有时我们想修正这些颜色。让我们看看我们如何能做它。

斯凯工作室Unsplash 拍摄的照片

介绍

在我以前的文章中,我解释了如何使用 DAX 表达式控制颜色:

在那篇文章中,我引用了 IBCS 规则来选择高对比度的列视觉效果颜色,而不是标准的 Power BI 颜色。

我的一个客户问我如何将这些规则应用到线条视觉上。

这个问题导致了两个问题:

  • 无法通过规则/条件格式来设置线条的颜色
  • 如何确保解决方案是可持续的,并且不需要人工操作

让我们看一下这两个挑战的详细描述,以及我们是如何解决它们的。

这两个问题

客户希望看到以年份分隔的每月值:

图 1——线条视觉的起点(作者提供的图片)

为了满足客户的要求,我尝试为线条视觉效果的线条颜色设置一个 DAX 度量。

当尝试这样做时,我们意识到不可能设置一个规则来控制线条颜色。

好,然后我们可以手动将线条的颜色设置为固定的颜色。

但是,一旦我们获得其他年份的数据,Power BI 就会选择下一个可用的颜色,并将其分配给新系列。

这意味着客户需要每年手动设置一次颜色,以避免出现随机颜色。

他想要一个自动化和可持续的解决方案来解决这个问题。

使用日期表格

在与我的客户讨论的过程中,我们意识到我们需要稳定的标签,并给它们分配颜色。

然后,我们需要一种机制,在一年中的每次变化时转换标签。

有了这个想法,找到解决方案就迈出了一小步:用一个额外的列扩展日期表。

在我关于 Power BI 和 DAX 的第一篇文章中,我在我的数据表中提到了索引列:

💔-ways-to-improve-your-reporting-with-an-expanded-date-table-2d983d76cced>

在本例中,有趣的列是 YearIndex 表。
基于此列,我们需要为所有行创建一个新列,规则如下:

  • 当 YearIndex 为零时,标记实际年份
  • 当 YearIndex 为负数时,标记相对于实际年份的前几年
  • 当 YearIndex 为正数时,标记相对于实际年份的未来年份

使用这些规则,我们可以添加一个名为“YearIndex_Name”的列,该列具有固定标签:

  • 实际年份
  • 去年
  • 明年
  • 行动。年数—“前一年之前的年数”
  • 行动。年+“下一年之后的年数”

正如我在上面引用的文章中所描述的,必须定期更新数据表(最多每天一次),以确保正确标记索引列。

现在我可以开始实施解决方案了。

在一个 SQL Server 数据库中,我在一个新列上用下面的 UPDATE 语句实现了这一点:

UPDATE [dbo].[Date]
  SET [YearIndex_Name] =
    CASE
      WHEN [YearIndex] = 0 THEN 'Actual Year'
      WHEN [YearIndex] = -1 THEN 'Previous Year'
      WHEN [YearIndex] < -1 THEN 'Act. Year ' + CONVERT(nvarchar(25), [YearIndex])
      WHEN [YearIndex] = 1 THEN 'Next Year'
      WHEN [YearIndex] > 1 THEN 'Act. Year +' + CONVERT(nvarchar(25), [YearIndex])
    END;

如果我不能更改源中的日期表,我会在超级查询中添加一个条件列:

图 YearIndex _ Name 的条件列(作者提供的图)

但是,由于这个 GUI 不允许输入复杂的表达式作为输出,我必须修改 M 表达式以获得所需的结果:

图 YearIndex _ Name 列的修改后的条件列(由作者提供)

完整的 M 表达式如下:

if [YearIndex] = 0 then "Actual Year"
   else if [YearIndex] = -1 then "Previous Year"
   else if [YearIndex] < -1 then "Act. Year " & Text.From([YearIndex])
   else if [YearIndex] = 1 then "Next Year"
  else "Act. Year +" & Text.From([YearIndex])

在用 DAX 生成的日期表中,我用下面的表达式实现了这一点:

"YearIndex_Name", SWITCH (
    TRUE()
    // This can be done with a DATEDIFF as well
    // The Syntax used here is shorter
    ,YEAR([Date]) - YEAR(Now()) = -1, "Previous Year"
    ,YEAR([Date]) - YEAR(Now()) < -1, "Act. Year "
                                & CONVERT(YEAR([Date]) - YEAR(Now()),STRING)
    ,YEAR([Date]) - YEAR(Now()) = 0, "Actual Year"
    ,YEAR([Date]) - YEAR(Now()) = 1, "Next Year"
    ,YEAR([Date]) - YEAR(Now()) > 1, "Act. Year +"
                                & CONVERT(YEAR([Date]) - YEAR(Now()),STRING)
    )

日期表的结果如下所示(实际日期为 09 年 3 月。2021):

图 4 —从带有 Year 和 YearIndex 列的日期表中提取(作者提供的图)

现在,我可以在 Power BI 中使用这个专栏,并使用 Line Visual。

新列的使用

在我的例子中,我使用数据库中的数据表。

为了进行测试,我使用以下表达式添加了一个计算列,而不是更改日期表并重新加载日期表:

YearIndex_Name_DAX = SWITCH(
    TRUE()
    ,[YearIndex] = -1, "Prev. Year"
    ,[YearIndex] < -1, "Act. Year " & CONVERT([YearIndex], STRING)
    ,[YearIndex] = 0, "Actual Year"
    ,[YearIndex] = 1, "Next Year"
    ,[YearIndex] > 1, "Act. Year +" & CONVERT([YearIndex], STRING)
    )

我可以用最小的努力改变这个表达式来模拟从一年到下一年的转换。

我添加了一个新的列作为图例。然后,我过滤视觉效果,只显示实际年份、前两年和后一年。

现在我给线条分配了固定的颜色:

图 5-指定颜色的线条视觉效果(作者提供的图片)

为了测试机制,我需要模拟一年的切换。

为此,我更改了 DAX 列的表达式,将 2022 年检测为实际年份,并更改了可视化的筛选器,以显示调整后的年份:

图 6 —移位数据的线条视觉效果(作者提供的图片)

正如你所看到的,实际年份仍然是黑色的,尽管数据是 2022 年而不是 2021 年,我们得到了下一年的新线条。

这证明了这种机制是有效的。

最后,我更改了设置以提高数据的可读性:

图 7 —可读性提高的线条视觉效果(作者提供的图片)

我必须反复检查这个设置,看看用户是否喜欢它,或者我们是否需要做其他的改变来提高可读性。

下一步是什么

Power BI 中的线条视觉对线条的颜色几乎没有控制。

https://ideas.powerbi.com上有一些条目可以改变这一点:

基于数据集中列的折线图数据颜色

折线图标记颜色条件格式

我添加了一个关于此处描述的主题的新条目:

折线图中线条的条件格式

请投票支持我和其他人的想法,以增加微软将此功能添加到 Power BI 的可能性。

我们需要用建议的机制来解决这个限制,直到这个特性在 Power BI 中实现。

照片由弗雷德·希普Unsplash 上拍摄

参考

IBCS —国际商务沟通标准—IBCS 规则的网站,提供该规则手册的在线版本。

我使用 Contoso 样本数据集,就像我以前的文章一样。你可以从微软这里免费下载 ContosoRetailDW 数据集。

Contoso 数据可以在 MIT 许可下自由使用,如这里的所述

我扩大了数据集,使 DAX 引擎工作更努力。
在线销售表包含 7100 万行(而不是 1260 万行),零售表包含 1850 万行(而不是 340 万行)。

https://medium.com/@salvatorecagliari/membership

为什么 ELT 不能解决您的数据问题

原文:https://towardsdatascience.com/why-elt-wont-fix-your-data-problems-11cef8340850

意见

改善您的数据基础设施和数据文化需要的不仅仅是华丽的管道

图片由来自 PixabayHatice EROL 提供

历史喜欢重演。

换句话说:我们人类有一种天赋,伪装成新事物,一次又一次地给自己制造同样的问题。

数据栈和数据管道也不例外。

今天的数据基础设施格局由“现代数据栈”(即,一个围绕云数据仓库的数据栈)和 ELT 管道主导。

这种模式无疑是旧模式的一个进步,但它并没有把我们从旧问题中拯救出来。如果我们不小心,现代数据堆栈和 ELT 可能会导致困扰我们多年的问题再次出现。即:

  • 数据生命周期中的工程瓶颈。
  • 工程师和数据消费者之间的脱节。
  • 对数据的普遍不信任。

这些问题都是可以避免的,尤其是有了今天的技术。因此,让我们深入了解它们真正的来源,以及如何才能真正预防它们。

ETL 和 ELT:复习

到目前为止,您可能已经厌倦了阅读 ETL 和 ELT 数据管道的比较。但以防万一,这里还有一个!

在数据能够被操作化,或者投入工作以满足业务目标之前,必须收集和准备数据。数据必须从外部来源提取转换为正确的形状,加载到存储系统。

数据转换可能发生在数据到达存储之前或之后。简单地说,这就是 ETL 和 ELT 管道的区别。虽然在现实中,并不是这么简单的划分

今天,我们倾向于将 ELT 管道作为与 ETL 相比的尖端解决方案来讨论。经常引用的理由是,通过将转换留到以后:

  • 数据可以更快地进入存储。
  • 对于不同的用例,我们可以更灵活地决定如何处理未转换的数据。

这两件事都不一定是真的。我们一会儿会谈到原因。

首先,我想谈一谈为什么 ETL 开始被负面看待。

ETL 的问题是

加载之前进行转换本身并没有什么不好。

术语“ETL”的含义已经不止于此。它让我们想起了遗留的基础设施,在许多情况下,这些基础设施至今仍在引发问题。它意味着一个定制的,手工编码的工程解决方案。

在数据工程的早期,数据用例通常不太多样化,对组织的日常运作也不太重要。在技术层面上,内部数据存储限制了公司可以合理保留的数据量。

鉴于这两个因素,为每个用例手工编写 ETL 管道是有意义的。在加载之前,数据经过了大量的转换和删减。这达到了节省存储和为预期用途准备数据的双重目的。

ETL 管道并不难编码,但事实证明大规模维护它们是有问题的。因为它们经常被嵌入到组织的数据基础中,所以很难被移除。如今,发现企业的数据架构仍然依赖于成千上万个独立的、菊花链状 ETL 作业并不罕见。

数据工程师的工作变成了编写看似永无止境的 ETL 代码,并在出现问题时灭火。对于基于 ETL 的架构,很难有足够大的工程团队来处理这种工作负载,并且随着数据量不可避免地扩大,很容易落后。

ETL 的问题在于它在规模上效率低下,这导致了工程资源的瓶颈。

这个问题以多种方式出现:

  • 需要持续的专门工程来处理各种不断变化的用例
  • 工程倦怠和难以雇用足够的工程师来处理工作量
  • 断开工程师(理解技术问题)和数据消费者(理解业务需求和结果)之间的联系
  • 由于结果不一致,对数据不信任

随着近年来数据量的爆炸式增长,这些问题已经从不便变成了阻碍。

进入现代数据堆栈。

英语教学问题和现代数据堆栈

正如我们之前提到的,现代数据栈的关键是云数据仓库。云数据仓库的兴起从两个主要方面促进了 ELT 管道的发展:

  • 几乎无限制、相对廉价的云中扩展消除了存储限制
  • 数据转换平台(一个流行的例子是 dbt)被设计用来转换仓库中的数据

考虑到对定制 ETL 日益增长的不满,近年来钟摆戏剧性地转向支持 ELT 是有道理的。

乍看之下,不受约束的 ELT 似乎是个好主意。我们可以将所有数据放入仓库,并在需要时出于任何目的对其进行转换!会出什么问题呢?

ELT 与新的工程瓶颈

下面是可能出错的地方:即使有了现代的数据堆栈和先进的 ELT 技术,许多组织仍然发现自己遇到了工程瓶颈。只是处于数据生命周期的不同点。

当可以不加选择地将数据传输到仓库时,不可避免地,人们会这么做。尤其是如果他们不是同一批人,以后还得清理数据。这不是恶意的;这仅仅是因为数据生产者、消费者和工程师都有不同的优先级,并且以不同的方式思考数据。

今天,参与其中的工程师不仅仅是的数据工程师。我们还有的分析工程师。分析工程的概念是 dbt 在他们的分析平台的流行创造了一个新的专业领域后创造的。除了平台,这一新的专业人士浪潮更少关注基础设施本身,而是更多地关注转换和准备消费者可以操作的数据(换句话说,准备数据产品)。因为职称可能会变得令人费解,所以从现在开始我就只说“工程师”了。

看待这个问题的一种方式是:许多工程师致力于促进英语教学中的“T”。然而,源源不断的原始数据会把数据仓库变成一片数据沼泽,工程师们几乎无法幸免。

数据消费者需要转换后的数据来满足他们的业务目标。但是如果没有工程师的帮助,他们无法访问它,因为它在仓库里处于不可用的状态。根据输送到数据仓库的内容,整理数据在各方面都很困难。

这种模式可能会导致以下问题:

  • 需要持续的专门工程来处理各种不断变化的用例
  • 工程倦怠和难以雇用足够的工程师来处理工作量
  • 断开工程师(理解技术问题)和数据消费者(理解业务需求和结果)之间的联系
  • 由于结果不一致,对数据不信任

听起来熟悉吗?

数据治理的重要性

最终,现代数据堆栈不是一颗神奇的子弹。要确定它是否有价值,你必须从业务成果的角度来看。

任何数据基础设施都是如此。

数据进入仓库的速度有多快,或者有多少都不重要。重要的是你能从可操作化的数据中获得多少商业价值:也就是说,在数据仓库的另一边已经投入使用的转换数据。

确保运营数据离开仓库的最佳方式是确保进入仓库的数据经过精心策划。这并不意味着应用成熟的、特定于用例的转换,而是在摄取期间执行基本的清理和建模。

这为工程团队的成功奠定了基础。

没有办法避开数据治理和建模。幸运的是,有许多方法可以完成这项任务。

这里有几件事可以帮助你。

遵循新概念指导方针,比如数据网格。

数据网格没有为架构和治理提供脚本。然而,它确实提供了有用的框架,可以在现代数据堆栈的背景下微调您组织的指导方针。Data mesh 非常强调数据如何在组织中移动的人的方面,而不仅仅是基础设施的技术方面。

例如,让领域驱动的团队拥有数据的整个生命周期可以帮助涉众看到更大的图景。数据生产者不太可能不加选择地将数据转储到数据仓库中,工程师将更加了解如何使用数据,消费者可以对他们的数据产品产生更多的信任。

在你的管道中建立质量控制

您的入站数据管道处于把关数据质量的最佳位置—利用这一优势!

对于给定的数据源,您的管道应该监视您的数据的形状;例如,通过遵循一个模式。理想情况下,在将数据放入仓库之前,应该对不符合模式的数据进行基本转换。

如果管道被要求引入它不能自动清理的杂乱数据,它应该停止,或者至少提醒您这个问题。

是的,这可能意味着“真正的 ELT”永远不存在,因为转换发生在数据仓库之前和之后。

在不牺牲速度的情况下,相对容易地实现这一点是可能的。因为预加载转换是基本的,它们不应该限制您能够对数据做什么。相反,从仓库中干净的数据开始提供了更多的灵活性。

所有这一切都要归功于当今市场上数据平台的大量涌现。您可以使用类似 Airflow 的工具来协调和监控您的管道。或者,您可以建立一个观察平台,使您现有的 ELT 管道更加透明。

在河口,我们提供我们的平台 Flow ,作为替代解决方案。

Flow 是一个实时数据操作平台,旨在创建连接堆栈所有组件的可扩展数据管道。它结合了 ELT 平台的功能和数据编排特性。

通过流传输的数据必须遵循一个模式,或者被动态转换。可以进行实时报告和监控,并且该平台的架构可以从故障中恢复。

超越英语教学和现代数据堆栈

管理公司内的数据和利益相关者总是需要战略思维和治理。

新的范式不会改变这一事实,尽管人们很容易这么想。现实是困扰 ELT 和现代数据栈的问题与那些使 ETL 不可持续的问题非常相似。

幸运的是,现在有很多工具可以大规模实现有效的治理和数据建模。有效地使用它们,虽然具有挑战性,但却是非常可能的。

本文原载于 河口博客 。在LinkedInGithub上找到我们的团队。

为什么每个数据科学家都应该学习数学优化

原文:https://towardsdatascience.com/why-every-data-scientist-should-learn-mathematical-optimization-3ac102663456

阿曼德·库利在 Unsplash 上拍摄的照片

数据科学课程侧重于数据可视化、特征工程、数据处理、(无)监督学习、聚类、编程、深度学习,有时还包括数据工程。优化不是这些课程的一部分,大部分甚至没有提到!这是一个遗憾,因为它可以在许多业务流程中增加价值。优点是它的灵活性,简易性和牢固性。它拥有机器学习无法完成的能力。通过优化,你可以做出决策,而通过机器学习,你可以做出预测。好奇?继续读!

数据分析的四种类型

如果你熟悉这四种类型的数据分析,你可以跳过这一节。

在下图中,您可以找到四种类型的分析。

四种类型的分析:描述性、诊断性、预测性和规定性分析。图片作者。

  1. 描述性分析
    这种类型侧重于总结过去的数据。它被广泛用于跟踪 KPI。数据显示在仪表盘或报告中,并且每天、每周或每月持续更新。这是最简单的分析。你从数据库中提取数据,你可以开始可视化。
  2. 诊断分析 深入挖掘,找出事情发生的原因,诊断分析就来了。这种类型的分析采用从描述性分析中发现的见解,并深入寻找这些结果的原因。一个例子是根本原因分析。
  3. 预测分析
    预测分析想要告诉你一些关于未来的事情,预测可能会发生的事情。这是使用预测或机器学习技术来完成的。
  4. 规定性分析 关于“下一步最好做的事”的建议属于规定性分析。在当前的情况下,决定采取什么样的行动是很困难的,但是这就是为什么规定性分析有可能为企业增加更多的价值。这里可以使用人工智能或数学优化(除了其他技术)。

最佳化

数学优化属于规定分析部分,这使它成为一种真正有价值的技术。它广泛应用于能源、医疗保健、物流、体育赛事、金融、制造和零售等领域。你可以优化包裹的路线,选择最具成本效益的方式来提供电力,创建工作时间表或以诚实的方式分配任务。

马修·史密斯Unsplash 上拍照

但是到底什么是数学优化呢?它是如何工作的?这一切都始于一个业务问题。想象一下,你是一家快递公司的一员,你发现包裹到达客户手中的时间太晚了。你收到投诉并开始分析。你的送货过程一定有问题。你会发现每个快递员只是随机抽取一定数量的包裹进行递送。在递送一个包裹后,递送者使用谷歌地图来查找如何到达下一个地址。哇,这么多优化的可能性!你开始思考:如果送货车装满了包裹,包裹离得很近,送货人沿着最短的路线走,会怎么样?这将对交付过程产生巨大的影响!交货时间将会改善,这将导致更少的投诉和更满意的客户!递送员可以在更短的时间内递送更多的包裹,并且货车使用更少的燃料。只有赢在这里!🎉

为送货人寻找最佳路线、选择彼此靠近的包裹以及装满货车都是可以使用优化解决的例子。要解决这类问题,您应该采取以下步骤:

图片作者。

你应该从理解问题开始。这包括定义问题,设定界限,与利益相关者交谈,找出你想要最小化或最大化的价值。

下一步(通常也是最难的一步)是对问题建模。你应该把你在第一步中发现的一切都转化为数学。这意味着定义变量约束目标。你可以把变量想象成你可以影响的值。例如,如果您想选择 x 个彼此相邻的包裹,每个包裹将收到一个组号。与包相关的组号可以是变量。约束是您希望在模型中使用的限制。假设一辆货车最多可以装载 600 公斤的包裹,这是一个限制的例子,一辆货车所选包裹的总重量不能超过 600 公斤。最后但同样重要的是,目标是您想要最大化或最小化的公式。如果我们在讨论一个路径问题,你可以想象你想要最小化总的旅行里程数。使用数学对问题建模后,您可以继续下一步。

如果你正确地做了前面的步骤,并且知道如何编码,解决这个问题并不难。对于求解步骤,你需要一个框架和一个求解器。一些示例框架是 pyomo或 toolspulpscipy 。自由解算器的例子有 cbcglpkipopt 。也有可用的商业解算器,它们要快得多,如果你想解决有许多变量和约束的问题,你应该使用商业解算器。你用 Python 编写你的问题例如,你调用求解器并等待结果。现在可以继续最后一步了。

您可以分析求解器得出的结果,以发现性能的提高。您可以将这些结果与当前的流程进行比较,看看是否值得将该模型投入生产以不时地优化您的流程。

如果你想在简单的现实生活例子中看到这些步骤,你可以在这里找到它们。本文讨论更高级的概念。

结论

优化是如此强大,每个数据科学家都应该能够实现它,或者至少熟悉它解决复杂业务问题的可能性。这是对机器学习的补充,因为你可以做决定,而不是预测。不需要带标签的数据。此外,当数据分布发生变化时,没有必要重新训练模型。

感谢阅读,享受优化!❤

除了上面提到的文章,如果你想开始学习优化的基础知识,我可以推荐这个 Udemy 课程OR 工具示例

有关系的

别忘了 订阅 如果你想在我发表新文章时收到电子邮件。

为什么每个软件工程师都应该学习 SQL

原文:https://towardsdatascience.com/why-every-software-engineer-should-learn-sql-ae3d7192a8d9

通过合理利用数据库来加速你的程序

托比亚斯·菲舍尔在 Unsplash 上拍摄的照片

几乎每个软件应用程序都依赖于将数据存储在可访问的地方。对于小的脚本和程序,这通常是在计算机的内存中,或者有时只是作为本地磁盘上的纯文本或二进制文件。

然而,较大的应用程序几乎肯定会使用存在于程序本身外部的数据库,而目前最流行的数据库技术是关系数据库。大多数关系数据库都可以使用结构化查询语言(SQL)进行查询,因此对于软件工程师来说,除了对 SQL 有基本的了解之外,还必须编写与数据库交互的高效代码。

如果你在想“哦,但是我已经知道如何从我的数据库中选择数据,肯定不会比这难太多”,再想想吧!我见过很多代码使用一个for循环来完成一项任务,而使用 SQL JOIN子句可以更快更简单地完成这项任务。

本文将使用一个非常基本的例子来展示正确使用 SQL 的强大功能。本文的代码是用 Python 编写的,使用的是 SQLAlchemy ORM 库,但是我将包括程序打算模拟的原始 SQL,以便更加与语言无关。

虽然示例和测试看起来很简单,但这是根据我在生产中看到的真实代码改编的,所以请注意!

TL;DR:SQLJOIN实现要快得多。

这个例子

我将使用的例子是一个在线商店。该数据库将包含一个users表和一个orders表,其中将存储网站用户的信息以及这些用户下的任何订单。每个表都有一个 ID 列,而orders表包含一个user_id列,该列包含一个引用users表的外键。

计算机编程语言

结构化查询语言

测试设置

如您所见,每个order都有一个payment_status列,其中包含一个布尔值,表示订单是否成功支付。目的是测试一个函数,该函数找到至少有一个失败订单的用户,并返回一组描述这些用户的User对象。

测试将在本地 dockerised MySQL 数据库上运行,该数据库使用以下docker-compose.yml文件创建:

该数据库将预加载一些使用 Python faker库生成的用户和订单。该测试将针对 10、100 和 1000 个用户和订单的每种组合运行,并使用 Python timeit库对 100 多次迭代进行计时。

为了避免数据库缓存使用的不一致性,每个查询都将带有前缀SQL_NO_CACHE标志。

将有两个测试函数。我们将使用一个简单的 Python 实现,包括查询失败的订单,然后遍历结果,并在每次迭代中对users表运行 select 语句,以生成一组至少包含一个失败订单的User对象。第二个实现将使用 SQL JOINDISTINCT在单个查询中生成同一组用户。

函数的代码如下所示。

计算机编程语言

结构化查询语言

从代码中可以清楚地看出,使用 SQL JOIN 的实现将只进行一次数据库查询,而更简单的 Python 实现将进行最少 1 次最多 N 次查询,其中 N 是orders表中的行数。

结果呢

毫不奇怪,该函数的纯 SQL 实现比依赖 Python for循环的实现要快得多。

在 10 个用户和 10 个订单的情况下,Python 函数在 5.97 毫秒内完成,而 SQL 实现只花了 1.04 毫秒。随着orders表中行数的增加,运行时间也增加了,但 Python 的情况开始变得糟糕。

在 10 个用户和 1000 个订单的情况下,SQL 实现仍然保持在 1.28 毫秒,而 Python 实现每次测试花费了 458.49 毫秒!当然,这是因为 SQL 实现只进行了一次数据库调用,而 Python 实现进行了大约 500 次调用。

有趣的是,就运行时而言,users列中的行数对 Python 实现的影响很小,但对 SQL 实现的影响较大。这可能是因为 MySQL 服务器需要做更多的工作来在更大的列表中查找DISTINCT用户,而 Python 版本是逐个用户地构建set对象。

完整的结果可以在下面看到,还有一些图表显示了每个函数的性能如何随数据库中的行数而变化。

基准输出

n_users: 10, n_orders: 10
Python: 5.97ms, SQL: 1.04msn_users: 10, n_orders: 100
Python: 46.22ms, SQL: 1.22msn_users: 10, n_orders: 1,000
Python: 458.49ms, SQL: 1.28msn_users: 100, n_orders: 10
Python: 4.85ms, SQL: 0.96msn_users: 100, n_orders: 100
Python: 48.08ms, SQL: 1.40msn_users: 100, n_orders: 1,000
Python: 441.89ms, SQL: 2.53msn_users: 1,000, n_orders: 10
Python: 4.97ms, SQL: 1.04msn_users: 1,000, n_orders: 100
Python: 46.54ms, SQL: 1.57msn_users: 1,000, n_orders: 1,000
Python: 451.37ms, SQL: 5.75ms

图表

图片作者。

图片作者。

作者图片

作者图片

结论

虽然上述两种实现都可以被优化以获得更高的性能,但是 SQL 实现每次都会胜出。最棒的是,用的 SQL 其实很简单,谁都可以学!

网上有很多学习 SQL 的免费资源,所以如果你是一名软件工程师或者有抱负的人,就去那里开始学习吧!好处将是巨大的。

如果您喜欢这篇文章,您可能也会喜欢我的关于我的 Python 库quiffen的文章,这个库用于解析来自QIF文件的金融信息:

我也可以在我的博客,在推特LinkedIn 上找到我,所以如果你有任何问题,请随时聊天!

-艾萨克

另外,我在下面列出了我运行的基准测试的完整代码,所以你可以自己尝试一下!

为什么 GPT 不告诉你真相

原文:https://towardsdatascience.com/why-gpt-wont-tell-you-the-truth-301b48434c2c

在古代中国,总结的才能仅次于占星术和医学。(GPT-3 关于任务总结的声明)

当我写关于文本摘要的文章时,这是一个公认的沉闷话题,我想以某种方式让它变得漂亮起来。因此,我做了一个想让自己听起来比他们更风趣的人会做的事情,用我的介绍段落提示了 GPT-3。它进而产生了一个合理的定义和关于不同风格摘要的样板文件。令人印象深刻的是,它能够模仿一个人为了达到某个目标字数而写的东西,但在让我的文章脱颖而出的能力方面却乏善可陈。以下是其中的一部分:

简而言之,文本摘要是创建文本文档的缩短版本,同时保留其最重要的信息的过程。这可以自动或手动完成。自动文本摘要通常用于生成新闻文章的摘要,或者提供冗长文档的简要概述。(GPT-3 总结,尝试#1)

无聊。但我怀疑它可以做得更好,毕竟它的前身 GPT-2 以一个创造性的独角兽故事亮相,使它的创造者 OpenAI 一举成名。让一个生成文本模型说一些令人难忘的事情有点像玩彩票——你买的票越多,你中奖的可能性就越大。这是因为采样解码,一种在潜在输出空间导航时依赖于一定量随机性的技术。所以我玩彩票,直到 GPT-3 告诉我:

在中国古代,总结的天赋仅次于占星术和医学。(GPT-3 总结,第 N 次尝试)

最后,一些我不知道的东西,一些可以在人类祖先的努力中放置一个看起来枯燥的任务的东西。那么……头奖?也许吧,如果这是真的。是吗?

我希望这是真的。两个听起来最浮夸的职业(占星术和医学)和不太受称赞但(显然)几乎同等重要的总结任务之间的对比颇具诗意。就像被低估的救赎。

Raimond Klavins 在 Unsplash 上拍摄的照片

尽管我尽职尽责,我仍然不知道这是不是真的。谷歌在网上一字不差的找不到这句话,第一页的结果似乎也没有一个支持。所以我决定把它排除在我的文章之外;无聊总比误导好。

根植性问题

这个问题是研究界众所周知的,他们用基础来描述它。目前,大多数生成性文本模型缺乏将他们的陈述化为现实的能力,或者至少将它们归因于一些外部来源;他们经常产生幻觉听起来似是而非的谎言。这限制了它们在创造性领域(写小说、游戏、娱乐等)的适用性。)并使它们在真实应该是一等公民的地方(新闻、科学文章、教育等)变得危险。).

让生成模型变得迂回曲折的是这样一个事实,即大多数时候,它们听起来(实际上)是真实的。当被提示有关总结的事实时,GPT-3 反复产生正确的陈述,并逐渐建立了我对其知识的信心。当它最终做出一个对我来说是全新的声明时,我已经投入了感情,并坚信它是真的。更背信弃义的是,文本生成模型可以使用各种策略使它们听起来更权威,比如包括虚构的数字、特定领域的行话或大量(虚假)细节。

在居心不良的人手中,情况变得更加令人担忧。生成模型为不良行为者提供了大规模撒谎的工具。他们可以用大量的内容淹没社交平台,仅仅因为其数量就似乎是真实的。他们还可以根据个人的社交媒体资料,通过描绘谎言来说服每个人。

检索:走向基础的一步

研究人员目前试图解决根植性的方法是在生成过程中加入一个额外的检索步骤:在产生输出文本之前,模型被训练在一些外部数据库中执行查找,并为其主张收集支持证据。

谷歌最先进的对话模型 LaMDA [1]使用一整套工具集来帮助确定其响应:一个检索组件、一个计算器和一个翻译器。它的输出是在多个连续的步骤中产生的,这迭代地提高了它的准确性:

  1. 基于对话的历史,LaMDA 首先产生一个不受约束的响应(在这个阶段是不接地的)。
  2. LaMDA 评估是否需要调整(即是否使用其任何工具)。
  3. 当 LaMDA 决定需要支持证据时,它(a)产生查询,(b)发出查询以查找支持文档,以及(b)以与检索到的源一致的方式重写先前的响应。
  4. 步骤二。第三。直到 LaMDA 决定不需要进一步调整。请注意,这可能需要检索多份证据。

虽然这种方法被证明比没有检索的基线模型改善了接地性(从 60%到略低于 80%),但它仍然远远低于人类的表现(即使人类无法访问信息检索系统,也只有约 95%)。

为什么根植性仍然很难

定义和衡量根植性本身就是一项挑战。在谷歌最近的一篇论文[2]中,研究人员区分了事实核查(即判断一个陈述是否普遍正确)和归因(即识别一个支持文档)。后者更容易处理,因为它推迟了确定的来源是否可信的问题。但是,即使在分离了这两个概念之后,关于归因的推理也不是无足轻重的。通常,决定一个文档是否支持一个陈述需要一些常识或额外的信息[2]:

支持文件 : 《指环王》剧场版运行时间为 178 分钟,《双塔奇谋》运行时间为 179 分钟,《王者归来》运行时间为 201 分钟。

声明: 《魔戒》三部曲的完整运行时间为 558 分钟。

在上面的例子中,该声明仅由文档支持,并提供了三部曲由所提到的三部电影组成的附加信息——那么该声明可归因于证据吗?人们可以通过问一个普通人是否会认为证据充分来解决这样的争论。但这也是很难确定的,因为它高度依赖于一个人的文化背景。

确保脚踏实地的另一个挑战是缺乏培训数据。为了教授一个关于归因的模型,人们必须提供正反成对的<陈述,证据>。考虑到属性的细微差别,此类数据点需要手动注释。例如,LaMDA 作者通过向众包工作人员展示未接地的模型响应(来自步骤 1)并要求他们手动执行步骤 2 到 4 来收集训练实例:发出查询、收集支持证据并修改模型的响应,直到它与证据一致。

最后,整合一个检索组件是一个工程挑战。在每个训练步骤中,模型需要(可能多次)查找外部数据库,这会降低训练速度。这种延迟问题也适用于推理过程,对于基于 Transformer 的模型来说,这已经是一个紧迫的问题。

结论

大多数文本生成模型(包括 GPT 家族)都倾向于做出错误的陈述,因为它们无法将它们的响应建立在外部世界的基础上。这是因为他们被训练成听起来真实,而不是 T2 真实。LaMDA 等模型试图通过引入检索组件(即,在外部数据库中查找)来解决这个问题,并迭代地改进模型响应,直到它与证据一致。虽然很有希望,但这一策略并没有得到充分的证明。观察社区如何应对这一紧迫的挑战将是一件有趣的事情。特别是,备受期待的GPT-4会应付自如吗?

参考

[1] LaMDA:对话应用的语言模型 (Thoppilan 等人,2022)

[2] 测量自然语言生成模型中的属性(拉什金等人,2022)

为什么梯度裁剪方法加速了训练

原文:https://towardsdatascience.com/why-gradient-clipping-methods-accelerate-training-d3094e3290a

马丁·亚当斯在 Unsplash 上的照片

加速方法现在有了理论依据

优化分析是机器学习中一个活跃的研究和兴趣领域。我们中许多上过优化课的人都知道,有一些加速优化方法,如 ADAM 和 RMSProp,在许多任务上比标准梯度下降法更好。尽管这些自适应方法被广泛使用,但是直到最近,它们为什么在非凸问题上表现良好的理论依据还不存在。今天,我想介绍一下 2020 年发表的一篇论文《为什么梯度裁剪会加速训练:适应性的理论辩护》。

TL;DR
在一种新颖的、宽松的平滑条件下,这种平滑条件是由梯度范数和 Lipschitz 常数的经验分析所激发的,对于为什么梯度削波/归一化梯度方法优于标准方法有一个理论解释。

贡献:

论文的贡献可以概括为:

  • 一种宽松的平滑条件,允许局部平滑常数随梯度范数增加。
  • 松弛光滑条件下限幅梯度下降和归一化梯度下降的收敛速度。
  • 松弛光滑条件下普通梯度下降收敛速度的上下限,证明普通梯度下降可以任意慢于削波梯度下降。
  • 类似地,限幅随机梯度下降和普通随机梯度下降的上界,证明了限幅 SGD 可能任意快于普通 SGD。

l-光滑性

在引入提出的松弛光滑条件之前,让我们回顾一下 L-光滑函数的定义。

定义:目标函数 f 被认为 L- 平滑,如果:

(等式 1)

对于二次可微函数,这个条件等价于(设置 y = x-h ):

(等式 2)

作者解释说,L-光滑性的这一定义的局限性是,假设存在一个整体常数 L,它限制了梯度的变化。即使是简单的多项式函数如 f(x) = xxx 也能打破假设。一种补救方法是假设 L 存在于某个局部区域中,并表明迭代不会脱离该区域,或者运行基于投影的算法来保证迭代不会脱离该区域。然而,这种补救措施会使 L 变得非常大,并且不会有助于严格的理论收敛速度。

本文背后的主要动机可以归结为这个问题:

我们能否找到一个细粒度的光滑条件,在这个条件下,我们可以同时从理论上和经验上设计快速算法?

图一。梯度范数和 Lipschitz 常数(L)的图表显示了很强的正相关性。(来源:【https://openreview.net/pdf?id=BJgnXpVYwS )

为了从经验上理解梯度和李普希茨常数之间的关系,作者展示了梯度范数和李普希茨常数的图,该图显示了很强的正相关性(图 1)。正相关的假设是梯度和 Hessian 在它们的计算中共享分量,例如权重的矩阵乘积。为了捕捉李普希茨常数和梯度范数之间的正相关性,作者提出了一个宽松的(较弱的)光滑性条件,允许局部光滑性随着梯度范数增长。

松弛光滑条件

定义:二阶可微函数 f 是(L0,L1)-光滑的,如果:

(等式 3)

这个定义是一个宽松的条件,因为可以平衡 L0 和 L1,使得 L0 < < LL1 < < L. 其次,我们可以找到全局( L0,L1 )光滑的函数,但不是L-光滑的函数。文中的一个引理有助于更好地理解松弛条件的第二个好处:对于多项式次数大于或等于 3 的一元多项式函数,该函数是( L0,L1)-光滑的,而不是L-光滑的。宽松条件只是要求 f 的二阶导数小于 f 的一阶导数,可以表示为 :

(等式 4)

这是真的,因为一阶导数必须是比二阶导数更高的多项式。然后,当 x 接近正/负无穷大时,分数的绝对值将是无穷大。

我们可以从L-smooth(eq 2)的定义中知道这个函数不是 L -smooth,它要求 f 的二阶导数的范数有界于某个常数 L,然而f″(x)无界

问题设置和假设

有了动机和提出的条件,在进行理论分析之前,我们继续看问题的设置和必要的假设。

我们定义 f 为非凸优化问题。因为这个优化问题通常难以直接解决,所以通常的做法是进行优化,直到达到ε驻点。

(4)

接下来,对要研究的函数类作出以下假设。

  • 假设 1:函数 f 的下界为 f *,大于负无穷大。
  • 假设 2:函数 f 是两次可微的。
  • 假设 3:函数 f 是(L0,L1)-光滑的(等式 3)。
  • 假设 4:给定一个初始化 x0,我们假设:

(等式 5)

假设 4 允许我们假设目标函数 f 的梯度范数可以由某个常数有界。这个常数 M 对于“坏的”初始化 x0 会更大,对于“好的”初始化会更小。

最后,为了放松全局假设,对于初始化 x0,上述假设仅需要在由 S 定义的局部区域中成立:

其中 K 是任何固定的正常数。(等式 6)

削波/归一化梯度下降的收敛性

削波梯度下降使用以下等式在每次迭代中更新其权重:

(等式 7)

归一化梯度下降有如下更新:

(等式 8)

通过更仔细的检查,我们发现这些更新非常相似。通过允许

我们有

这些更新相当于一个常数因子,因此对削波梯度的分析也适用于归一化梯度下降。

然后,对于满足假设 1、2 和 3 并且在集合 S(等式 6)中的一类函数,限幅 GD 的迭代复杂度的上限为:

(等式 9)

在哪里

换句话说,限幅 GD 的上限为

(等式 10)

香草梯度下降的收敛性

普通梯度下降在每次迭代中使用以下公式更新其权重:

(等式 11)

对于满足假设 1、2、3 和 4 并且在集合 S(等式 6)中成立的一类函数,并且 M 如假设 4 中所定义的,标准 GD 的迭代复杂度的上限为:

具有固定步长的标准 GD 的上限和 Big-O(等式 12)

作者进一步提供了固定步长香草梯度下降的下界,并表明它不能比以下更快地收敛到ε-驻点:

(等式 13)

请注意,普通 GD 的 Big-Omega(最佳情况)和 Big-O(最差情况)符号相差 log(M)倍。比较限幅 GD 的上界和普通 GD 的上界,我们可以知道,当 M 较大,或者问题初始化较差时,限幅 GD 可以任意快于 GD。

这在直觉上也是可以接受的。当权重初始化不良时,梯度可以取任意小或大的值,并且正则化(削波)权重将稳定训练,从而导致更快的收敛。这是凭直觉知道的,但直到现在才得到理论上的解释。

本文通过采用第五个假设,将复杂性分析扩展到非确定性(随机)梯度下降设置。它得出一个类似的结论,当 M 很大时,限幅 SGD 可以任意快于普通 SGD。

结论

今天介绍的论文最终弥合了理论快速算法和经验快速算法之间的差距。提供的分析让我们对加速优化方法的选择充满信心,并提醒我们正确初始化的重要性。

对于那些有兴趣在这一领域继续研究的人,作者留下了可能改进的方向。首先是将这种分析扩展到其他加速方法,如动量法。第二个方向是进一步研究经验激励的平滑条件,提供更紧密和更清晰的理论保证。

参考文献:
[1]张,何,苏,贾德贝,为什么梯度裁剪加速训练:适应性的理论辩护(2020),2020

为什么图建模框架是无监督学习的未来

原文:https://towardsdatascience.com/why-graph-modeling-frameworks-are-the-future-of-unsupervised-learning-2092b089caff

用于在无监督学习场景中估计特征重要性的迭代图建模方法

由拜耳制药公司的机器学习工程师 Abhishek Singh ,前微软、摩根大通&公司、汇丰银行和拜耳制药公司的数字健康数据科学Cristiana de aze vedo von Stosch 合著。

在 Titanic 数据集上迭代有向图方法。图片作者。

并非所有的特征都是相同的。此外,特征确定重要性仍然是机器学习中的一个基本问题。

监督学习中的大多数特征重要性方法依赖于目标特征。然而,如果目标特征不存在,并且仅存在独立特征,则计算特征重要性是一个挑战。

像图建模这样的新技术已经揭示了在无监督学习应用中发现特征重要性。

图建模框架的案例

如果对于样本数量而言,您有太多的特征,或者想要移除共线特征以改进模型,有许多技术可以应用于监督学习设置中,如决策树、随机森林等。

到目前为止,很少有方法可以识别无监督学习问题中的特征重要性。

基于特征重要性确定的特征选择将减少任何建模方法的处理时间。在无监督的学习设置中,特征重要性方法可以被应用于寻找最小的特征子集,该子集最好地从数据中揭示有趣的自然分组。

为特征重要性确定创建图建模框架的 7 个步骤

想用这种方法创建自己的图形建模框架吗?按照我们下面的步骤,开始为你的无监督学习排名问题创建解决方案!

对于这个实验,我们应用了这些方法:我们提出的排序方法、随机森林、决策树和使用高尔距离的聚类。

对于数据,我们使用了来自 UCI ML 数据集 : 乳腺癌虹膜免疫疗法地铁州际交通的 4 个数据集,以及著名的泰坦尼克号个体乘客生存状态数据集。

这个实验是在 Python 中运行的,使用随机森林和决策树算法及其默认的内部参数。这个项目的代码是 GitHub 上的

准备数据

我们希望通过开始处理列在数据集中出现的顺序来创建一个有向图。这些柱子将成为我们的节点。有向边允许在任何数字和/或分类数据集上创建图形。

我们将把五个数据集的列转换成虚拟列,并包括基本列和属性。在没有分类列的情况下,可以将连续属性放入虚拟列中。

有向图的基本元素:节点和有向边。图片作者。

逐步创建您的图表

要在无监督学习中利用图表方法创建用于特征选择的节点,请遵循以下方法。

  1. 将所有列和行作为节点和边转换成有向图。将属性顺序设置为未排序(单元格#10 )。
  2. 使用 Google PageRank 计算每个节点的排名,确定排名最高的节点( cell #14 )。
  3. 将此节点设置为图形中的起始节点。再次构建图表(单元格#14 )。
  4. 重复这个过程 n- 次。在这种情况下, n 是独立特征的数量。对于每次迭代,创建一个 m*n 大小的矩阵(m =节点数,n =迭代次数)。
  5. 存储所有迭代中每个虚拟特征的最小分数。
  6. 计算每组假人在每个特征级别的总和。
  7. 按升序对模型的输出(特征)进行排序,并对其进行排名。

自己尝试一下,看看你的结果会把你带到哪里!

评估结果:监督学习与提议的排序方法

在下图中,您可以看到在乳腺癌、Titanic 和 Iris 数据集中运行的特征排名结果。我们比较了两种监督方法(随机森林,决策树)和提出的排序方法。在每个表中,显示了由三种算法中的每一种算法识别的前 9、6 和 4 个特征。

排名结果显示在梯度热图表中。在我们的实验中,我们用深绿色表示最重要的特征,用红色表示最不重要的特征。

尽管这三种算法返回的特征排序略有不同,但所提出的排序方法能够在所有实验中识别排名最高的特征。

使用乳腺癌、Titanic 和 Iris 数据集的随机森林、决策树和提议的排序方法实验的排序结果。在每个表中,显示了由三种算法中的每一种算法识别的前 9、6 和 4 个特征。

聚类排名靠前的数据集

为了进一步比较从我们提出的排序方法得到的排名靠前的结果与其他金标准方法的“适合度”,我们将使用不同的数据子集运行聚类算法,以比较聚类的可分性。

引入聚类

聚类采用整个数据集并识别集合的可分性。然而,聚类方法无法确定重要性的顺序。在群集技术中,数据集中的记录被组织到不同的逻辑分组中。数据分组的方式是同一组内的记录比组外的记录更相似。聚类根据相似性矩阵自动将数据集分成不同的组。

聚类方法使用逻辑分组。因此,不能提取关于特征重要性的信息。如果没有排名方法,就需要分析所有列的维度和数据项,这非常耗时。

类似地,聚类是比较所提出的排序方法和随机森林结果以及评估它们的可分性适合度的有用工具。

不同数据集的聚类

为了进一步分析我们的发现,我们使用三组排名靠前的特征来执行五组聚类实验。在我们的聚类算法中,我们使用高尔距离来计算两个实体之间的距离,这两个实体的属性中都有混合的分类值和数值。

聚类方法的有效性取决于“距离”的定义。如果这个属性不存在,就必须定义它,这并不容易,尤其是在多维场景中。

通过参考轮廓宽度,可以显示一个聚类中的点与相邻聚类的接近度。这样做提供了一种可视化评估和分析集群数量的方法。

例如,该度量的范围为[-1,1]。查看轮廓系数时,有几个关键点需要考虑。

  • Near +1:表示样本远离相邻聚类。
  • 0:表示样本位于或非常接近两个相邻分类之间的判定边界。
  • Near -1:表示样本可能被分配到了错误的簇。

轮廓宽度图与每个聚类实验中的聚类数,对 5 个数据集的每个数据集运行不同的特征。使用绿色(o)标绘的所有特征,使用红色(#)标绘的建议分级方法的顶部特征,蓝色(#)标绘的建议分级方法的顶部特征,黄色(x)标绘的随机森林的顶部特征,绿色(x)标绘的随机森林的顶部特征。水平虚线表示轮廓宽度为 0.2 的基准阈值,这是“好的”可分离性的阈值,用于选择最佳的聚类数目:高于 0.2,模型具有好的可分离性,低于差的可分离性。离这个阈值越远,模型的可分性越好。

使用上图中的信息,数据显示所提出的分级方法产生了排名靠前的特征片段。当在聚类方法中使用时,而不是来自随机森林示例的排名靠前的特征段,可分性更容易识别。在该练习的所有运行中,使用所提出的排序方法的顶部特征的聚类实验的轮廓宽度系数总是高于使用来自随机森林方法的顶部特征时的轮廓宽度系数。

图形建模概要

我们提出了一种新的图建模方法,该方法可以在没有目标特征的情况下识别数据集的特征重要性。在本文中,我们提出的排名方法使用数据集运行,目标特征列从其数据集“隐藏”,我们计算它们的特征重要性以及常用的监督方法(不隐藏目标列)。

在使用监督方法和提议的排序方法确定最有影响力的特征的排序之后,所有方法在其最高特征重要性顺序中包含大量重叠。

我们的框架试图用图建模来弥合监督和非监督特征选择方法之间的差距。在无监督的设置中实现我们提出的基于图的排序方法允许识别特征的重要性。与随机森林和决策树相比,这些排名靠前的功能还提供了更好的聚类。

虽然仍有许多研究要做,但基于图论的特征重要性识别可以扩展到半监督学习设置。

利益冲突

这项工作基于个人实验、研究和公开可用的数据集,与现任或前任雇主的数据没有任何联系。如有任何出版或专利目的,请联系作者。

作者投稿

克里斯蒂安娜·德·阿泽维多·冯·斯托施进行文献综述,撰写手稿,并提供概念指导。Abhishek Singh(Abhishek Singh)编写代码并运行实验。马修·埃利斯·普里查德编辑了这篇文章。

为什么拥有许多功能会影响模型的性能

原文:https://towardsdatascience.com/why-having-many-features-can-hinder-your-models-performance-865369b6b8b1

特征工程的活动对于提高预测模型的性能非常有用。然而,如果我们不牢记要避免的某些原则,它可能会使我们的结果变得更糟。

图片作者。

数据分析项目总是从数据集开始。这可能是客户提供的,在 Kaggle.com 等网站上公开发现的,或者是我们和我们的团队创建的。

在任何一种情况下,数据集将显示一个解剖结构,该解剖结构将根据它想要描述的现象的类型而变化,并且将具有构成该结构的一定数量的列。

在我们项目的开发过程中,团队会对该数据集的几个方面感兴趣:

  • 代表的现象是怎样的实际数据?
  • 我们的列的数据类型是什么?
  • 有多少行和多少列?

和许多其他人。回答这些问题很重要,因为它们有助于定义我们团队的调查范围。

它们帮助我们了解要做多少 EDA (探索性数据分析),我们可以预测什么以及如何预测(使用机器学习或其他统计方法)以及如何构建数据预处理计划。

我在专门的文章中谈到了其中的一些问题。你可以在这里阅读它们

一个分析管道通常要经过几个步骤,其中一个被称为特征工程。

在此阶段,分析师修改、转换和添加数据集中的列(也称为特征、维度、变量等),目的是丰富关于所描述现象的信息。通常这是在现象本身的建模阶段完成的。

例如,如果我们正在研究一个时间序列,一个特性工程活动可以从序列中出现的日期开始创建额外的列,以提取属于周末的年、月、日等。

假设是,如果我们添加更多关于目标变量的信息,目标变量(如果我们谈论的是监督学习)可以更好地建模——在这种情况下,我们通过设计一些时间特征来丰富这个系列。

但是有时这个过程会产生一些问题,这些问题可能很难识别。这样的问题往往会导致训练集过拟合。

我已经写了关于过度拟合和为什么它是机器学习的最大障碍之一。如果您有兴趣了解更多信息,我建议您阅读这篇文章。

在这篇文章中,我将专门讨论当我们在特征工程上走得太远时,也就是当我们向数据集添加太多信息时,可能出现的问题。

为什么要做特征工程?

特征工程的动机是增加有价值信息的可用性,并通过在数据中包含这种新的“视角”来训练模型。

对这一活动的解释是正确的。想要添加信息通常是一个要追求的活动,但是只有当我们确信数据确实对模型有用的时候。

正如我经常在网上写文章和发表文章一样,我们首先关注的应该是尽可能多地收集高质量的数据以便最好地代表我们想要研究和建模的现象。

我所说的“高质量”指的是包含尽可能接近可观察现实的例子的数据。

我们希望确保问题的答案包含在我们的数据集中。

因此,进行特征工程可以帮助我们在分析阶段回答这些问题,或者帮助我们的模型找到一种更简单的方法来预测目标。

为什么拥有大量的特性是一个问题?

然而,粗心的分析师可能会遇到问题,如果他添加太多的新变量到他的数据集中。

其中一些可能实际上是有用的,其他的甚至可能阻碍我们的模型的推广。

接收潜在不相关信息的模型可能很难概括这种现象。

通过形式化,如果分析师向数据集添加了太多的列,他可能会出错,例如

  • 通过提高信噪比来添加无关信息
  • 增加待映射现象的复杂性
  • 在数据集中插入一些混杂
  • 列比行多

这些方面中的每一个都会对我们的模型产生有用结果的能力产生负面影响。让我们看看怎么做。

添加无关信息(提高信噪比)

我们的数据集中代表该现象的例子越多,信噪比就越高。我们总是希望以这样一种方式最大化这个比率,即我们可以使样本尽可能接近收集数据的人群。

我们数据集中的每个例子都应该用代表我们想要研究的现象的某些特征来描述

如果不发生这种情况,这个例子基本上没有用。然而,这种无用性没有被我们的模型过滤掉,我们的模型将试图学习使用这种有噪声的信息来映射 X 到 y 的最佳方式。这会降低模型的性能。

增加要绘制的现象的复杂性

我们想要建模的现象越复杂,模型就越难找到描述该行为的函数。

我说的复杂是什么意思?在这种情况下,我们指的是列数。每一篇专栏文章都描述了一些现象,随着描述的丰富,自然会有复杂性的增长。

有时一个现象天生就很复杂,无法建模(例如天气预报)——在这种情况下,我们需要能够理解我们添加的列会使问题变得多么复杂。

添加混杂因素

混杂变量是“混淆”模型的变量。彼此相关但并不真正产生影响的变量(虚假相关性等)会在训练阶段混淆模型。

在这种情况下,模型错误地了解到变量 K 对目标产生了很大的影响——当后者随后被部署到生产中时,其性能与训练中看到的性能相差甚远。

同样,解决方案是相同的:仔细研究添加到数据集中的变量的性质,思考这实际上如何帮助模型。

列比行多

这是一个有点模糊的场景,但是如果分析师使用外部库来进行特性工程,这种情况就会发生。例如,如果您想对由金融蜡烛线组成的时间序列进行 FE,技术分析库会对数据集应用数百个以上的列。

列:要学的东西
行:要学的例子

基本上,我的建议是始终避免列比行多的情况。

如何识别最重要的特征?

我们已经看到,过于自由的特征工程过程会对我们的模型造成损害。

相比之下,识别哪些特征要包含在我们的数据集中的过程称为特征选择。

特征选择帮助我们隔离对模型性能贡献最大的变量。

有多种选择特征的方法。本文不会详细讨论这个主题,但是我可以链接到一篇关于 Boruta 的文章,这是一个 Python 中的特性选择库。该库易于使用,并允许计算数据集中每个要素的重要性。一个重要的特性当然要包含在训练集中,而有些甚至可以被删除或转换。

结论

特征工程当然是我们必须经常思考的一项活动,但重点是不要做过头。

人们很容易认为某个变量会对模型的性能产生积极影响— 检验假设的最佳方式是通过实验。Boruta 在这方面有所帮助:当添加一个新变量时,我们可以使用这个库(和其他方法一起)来估计这个特性与结果的相关性。

如果我们不想通过选择过程来研究特征,建议是避免提到的障碍,并评估模型的性能如何随着更多变量的逐渐插入而变化。

如果你想支持我的内容创作活动,欢迎点击我下面的推荐链接,加入 Medium 的会员计划。我将收到你投资的一部分,你将能够以无缝的方式访问 Medium 的大量数据科学文章。

https://medium.com/@theDrewDag/membership

下次见!👋

推荐阅读

对于感兴趣的人来说,这里有一个我为每个与 ML 相关的主题推荐的书籍列表。在我看来,有一些必不可少的书籍对我的职业生涯产生了巨大影响。
免责声明:这些是亚马逊会员链接。我会收到亚马逊为你推荐这些项目的一小笔佣金。你的体验不会改变,你也不会被收取更多费用,但它将帮助我扩大业务规模,围绕人工智能制作更多内容。

有用的链接(我写的)

为什么我决定攻读机器学习博士学位

原文:https://towardsdatascience.com/why-i-decided-to-do-a-phd-in-machine-learning-fdee03bb956f

我离开工业界进入学术界的 5 个关键原因

Unsplash 上的美元吉尔拍摄的照片

紧张的日程安排、不合作的主管和低工资。你不必苦苦寻求建议反对读博士。更糟糕的是,这大部分来自学生自己。

那么为什么会有人想读博士呢?

我认真思考了我的决定,我想和你分享原因。如果你正在考虑读博士,希望他们能帮你做决定。

我不喜欢朝九晚五的生活

第一种是常见的。在面试过程中,一位教授问道:

"为什么这么多申请者都有 2-3 年的行业经验?"

他想了解这种趋势的原因。我不能代表其他人,但我只是…很无聊。

在很大程度上,我喜欢自己作为数据科学家的角色。我研究有趣的数据集,建立有影响力的模型。然而,我变得不快乐。我的学习开始停滞不前,我开始对僵化的朝九晚五的时间表感到沮丧。主要是由于我所处的行业,我没有目标感。是改变的时候了。

同样,我认为更广泛的趋势是由这种改变的需要所驱动的。我周围的朋友都在辞掉工作。我们中的许多人已经对成为专业人士的意义不再抱有幻想(如果你愿意,可以称之为四分之一生命危机)。同时,我们有了更多的人脉和经验。那些没有接受世俗的人正在利用这些来寻找更好的机会。

就个人而言,这次经历是一次觉醒。我一直很努力。我天真地以为自己会自然而然地得到一个好职位。我指的是提供有趣和满足感的工作。这不是真的。我意识到我需要自己找到它。

我发现了一个有趣且有成就感的项目

这一搜索让我获得了都柏林大学(UCD)的博士学位。我将应用 ML 来监控爱尔兰海岸线(我刚刚开始,所以请不要问我细节)。首先,我将使用开源卫星数据和计算机视觉方法。从那时起,我将对博士学位的方向有很大的控制权。

这种控制对我来说很重要。我的意图实际上是攻读可解释机器学习的博士学位。我发现这个子领域非常有趣,我已经写了很多关于方法的文章,比如和PDP。虽然这不是重点,但我将有自由在我的研究中融入 IML 方法。事实上,在遥感应用中需要这些。

大多数深度学习技术没有披露数据特征如何生效以及为什么进行预测。遥感大数据加剧了当前人工智能不透明和不可解释的问题。

教授王博士

最终,我仍然能够在 IML 探索我的兴趣。与此同时,处理气候数据给了我一种使命感。至关重要的是,为了满足我的第三个理由,我还会在这个过程中发展新的技能。

这将导致一个更有趣的工作

当我开始寻找改变时,我不仅仅是寻找博士职位。我也申请了工业界的职位。我甚至接受了一些采访。问题是我被最有趣的学校拒之门外。

我对更高级的数据科学角色感兴趣。即使用最新的工具并将 ML 应用于图像或文本数据。虽然我是一名数据科学家。我更关注表格数据,并且使用了过时的工具。任何建模都是通过简单的逻辑回归完成的。

我需要提高技能,是的,我能听到你在尖叫——“有比博士学位更好的提高技能的方法!”我同意,但这些都不符合我最后的理由。我也被 ML 研究科学家的角色所吸引。其中绝大多数都需要博士学位。

我喜欢写作

无论是学术论文还是期末论文,写作似乎都是博士生的主要压力来源。然而,这部分研究并没有让我担心。我真的很喜欢写作,在媒体上呆了 3 年后,我有了很多练习。

好吧,所以学术论文要严谨得多。尽管如此,我开发的技能使他们不那么令人生畏。同时,博士研究将有利于我的媒体页面。

为了不断创造新的内容,你必须不断学习新的东西。学习是任何博士学位的核心。重要的是,所有的工作都是开源的。与行业角色不同,这意味着我可以分享我学到的一切。灵活的时间表也让我能够平衡博士的工作量和内容创作。

我想在网上赚钱

我必须承认,我更喜欢通过写作赚钱。3 年的努力工作(和运气)创造了一个收入流,这将补充我的津贴。然而,网上赚钱容易上瘾,我决定更认真地对待它。

我最近推出了一个 Python SHAP 课程和一个时事通讯(如果你注册,你将可以免费使用该课程)。我甚至开始告诉人们,我经营着一家小型(也称微型)在线企业。通过更好的内容创作,博士学位将帮助我发展这项业务。

(来源:作者)

经过 4 年的博士学习,希望它能提供一个重要的收入来源。我最想做的就是全职做这件事。然而,我的目标是赚足够的钱来扩展我的选择。这就是为什么我不需要仅仅根据薪水来做职业决定。

最后,这四个原因结合在一起。我需要改变,并且我找到了一个有趣且令人满意的机会。这个机会将允许我写作和发展我的网上业务。同时,内心的实用主义者也满足了。我还将发展技能,从而获得博士和商业之外的机会。

我读博士才一个月。然而,我已经学到了很多,也遇到了很多有动力和兴奋的人。希望能保持下去。否则,请留意这篇题为“为什么读博士是我一生中最糟糕的决定”的文章。

我希望你喜欢这篇文章!你可以成为我的 推荐会员 😃 来支持我

https://conorosullyds.medium.com/membership

|Twitter|YouTube|时事通讯 —注册免费参加 Python SHAP 课程

为什么我的第一个机器学习项目失败了

原文:https://towardsdatascience.com/why-i-failed-my-first-machine-learning-project-deb996c52254

野外的数据科学和机器学习

为什么我的第一个机器学习项目失败了

你可以从机器学习项目失败的地方学到重要的经验

米隆·奥利拉在 Unsplash 上的照片

机器学习是有意义的

作为一名实践数据科学家,我的第一个机器学习项目失败了,但让我告诉你我在这个过程中学到了什么。

首先,我认为需要一些背景知识。我刚开始工作不久,就被要求承担一个项目;那是我们合作的一个慈善机构。这在行业中很常见,其理念是你自愿花时间帮助慈善机构解决一些挑战,而这些挑战可以用你的专业知识来解决。当我被要求接手这个项目时,我欣然接受了这个机会,因为这是一个利用我的技能为社会做出积极贡献的机会。

该慈善机构通过志愿者网络在伦敦帮助消除食物贫困。食物匮乏是目前伦敦的一个大问题。

超过 230 万伦敦人生活在贫困线以下,33%的成年人不吃饭是为了省钱,这样他们的孩子就可以吃饭。

通过其志愿者网络,慈善机构协调物流,将超市和零售商的多余食物运送到急需食物的食物银行。

热情但幼稚的方法

这是一项非常崇高的事业,所以我自然想做好。但自私地说,我想展示我能领导一个由分析师、工程师和数据科学家组成的团队做些什么。我马上开始工作,会见我们的客户,并试图找出我们可以增加价值的地方。我们的范围界定会议揭示了慈善机构在志愿者招募方面的一个主要痛点。

经过一些头脑风暴会议后,我们想出了一个计划:我们决定构建一个应用程序来预测送货班次的志愿者注册情况。这样做的目的是帮助志愿者管理者通过将资源分配到可能会出现人员不足的班次来主动管理招募工作。从表面上看,这似乎是一个有监督的机器学习问题,我们会将其构建为一个回归模型,并使用慈善机构提供给我们的历史转变数据。

我把团队分成两个阵营,一个阵营开发前端 web 应用,另一个阵营开发模型。我们花了 4 到 5 个月的时间开发这个应用,并成功地将它交给了我们的客户。我建议试用 3 个月,并在结束时进行反馈,以评估该应用程序在野外的使用情况。那么,哪里出了问题?

开发时间太长

这是那些事后变得更加清晰的见解之一。不幸的是,对我们和慈善机构来说,我们花了太长时间来开发这个应用程序。这不是因为缺乏计划,因为即将发生的事情是无法预料的。

发起这个项目的慈善机构的运营总监就在我们递交申请之前离开了。新董事没有参与项目,也没有参与开发过程;对于如何解决志愿者招募的困境,他们有自己的想法。这导致该工具根本没有被慈善机构采用,这让我和我的团队非常失望。这是你可以认为是不幸情况的事情之一,但即使如此,这里也有值得吸取的教训。

任何项目都可能发生这种情况,因此在交付之前尽可能减少开发时间是非常重要的。将一个大项目分解成更小的“概念证明”是一个很好的策略,你可以快速失败并快速迭代。它还通过保持关键利益相关者的参与,在一定程度上缓解了政权更迭,尽管总有可能新老板只是想用另一种方式做事。

我相信了机器学习的宣传

我们漫长的开发时间部分是因为我们选择了机器学习路线。这是我作为首席数据科学家的失败之一。我充分意识到 ML 在实践中的实现有多复杂,但是我固执地坚持了下来。我想给项目团队一个学习如何构建 ML 管道和智能应用程序的机会,我也有一些自私的动机。我想向我的老板炫耀一下,说我们发布了一个“智能应用程序”,为慈善机构增加了价值。

在实践中,ML 是混乱的:不仅开发需要多次迭代,在客户端你需要有能力的分析师来监控生产中的模型。慈善机构没有雇佣任何有机器学习经验的人,所以我们从一开始就注定要失败。一个简单的仪表板映射过去一年左右的招聘趋势,对慈善机构来说是一种享受,团队可以非常快速地制作出这种产品,并立即开始增加价值。如果需要更复杂的方法,我们可以在进一步的迭代中追求机器学习。

项目的次优方法

这里缺少的一点背景是,我被要求在项目进行到一半时接手这个项目。在我接手之前,这个项目还有一个领导,但是很快就发现他无法在 BAU 的工作量之外管理这个项目。当我加入的时候,这个项目没有方向和结构,人们几乎是带着他们自己的分析碎片在运行。一些人已经尝试建立模型(错误的方式)。老实说,这也是我动摇地选择 ML 路线的部分原因;我想保持团队对这个项目的热情,ML 是一个很好的卖点。

在我们的反馈会议中,我们的客户告诉我们,他们与其他组织合作过类似的项目,但结构略有不同。一种方法是创建项目管道,通过慈善机构交付的问题陈述的积压来启动。然后,一个由毕业生安置的学生组成的团队将被要求挑选一个项目,并带着它运行,不时向高级经理汇报。我们的客户说,这种方法有助于在一致的团队中更快地交付项目,因为毕业生的 BAU 工作量往往更轻。一个更正式的参与这类项目的结构可能会有很大帮助。

往好的方面想

这并不完全是悲观的。我们未能对慈善机构的志愿者招募灾难产生积极影响,但我们确实学到了一些重要的教训,并取得了一些成功。

在这里,它们被简洁地表达出来:

  • 领导团队交付 ML 管道和 web 应用程序。
  • 学习如何在整个项目生命周期中激励项目团队。
  • 学习一些关于项目交付和复杂性的有价值的经验。
  • 理解何时不使用机器学习。
  • 与慈善机构的客户建立良好的关系。
  • 了解慈善机构招募志愿者的来龙去脉。
  • 即使失败,也要学会庆祝小胜利。

⭐️ 我喜欢通过分享我在野外的数据科学经验来帮助人们。如果你还不是会员,可以考虑订阅 Medium,从我这里获得更多有用的内容。

https://johnadeojo.medium.com/membership

我加入麦肯锡成为数据科学家的原因

原文:https://towardsdatascience.com/why-i-joined-mckinsey-as-a-data-scientist-2fb3b586fd0d

Unsplash猎人赛跑的照片

尽管每周工作 80 小时,你应该成为数据科学顾问吗?

时间过得真快;我们告别了疯狂又意外的 2021 年,步入了新的一年……一个多月前!回想 2021 年,我意识到我已经离开咨询行业一年多了。

回顾过去,加入麦肯锡是我职业生涯中(到目前为止)做出的最好的决定之一,我确实从这次经历中学到了大量关于数据科学和职业发展的知识(如果你想了解我在数据科学方面学到的经验,请阅读我以前的文章这里)。

因此,作为对我自己和对咨询界感兴趣的人的一个备忘录,我想在这篇文章中分享一些关于我为什么最初加入麦肯锡的想法;在我的下一篇文章中,我将分享我最终决定离开的原因。希望这些文章能为那些考虑将数据科学咨询作为职业发展的人提供一些见解。

  1. 咨询是一个寻找激情、了解不同行业和不同行业专家的好地方

在金融行业做了近两年的量化研究员后,我意识到我热爱我工作中的分析和数据方面,但我并不是金融行业的狂热爱好者。

所以我决定把我的可转移数据技能带到别的地方。问题是,在哪里?我只知道我不想做什么,却不知道我做什么。我想使用地理空间数据吗?优化消费者营销活动或 B2B 销售渠道?

如果你的处境和我一样,咨询行业是理想的选择——知道你想处理数据,但不知道你想处理哪种数据和/或你对哪个行业感兴趣

因为咨询公司服务于广泛的客户,无论你的兴趣和热情在哪里,你都会找到适合你的东西。即使是在同一个行业,你也会在规模、成熟度、文化和其他方面与各种各样的公司共事。

因为经验丰富的顾问过去曾与数十家公司合作过,所以他们通常会在某个领域开发出最佳实践/行动手册。因此,作为数据科学领域的新手,咨询是“了解诀窍”的最佳场所之一。

2.咨询是改变你职业生涯的好方法

尽管在技能组合方面有很多重叠,但从定量金融研究员到数据科学家的转变并不容易;许多数据科学招聘人员不熟悉其他领域(就我而言,是定量金融行业),通常不知道如何正确评估非传统背景。咨询公司雇佣来自的员工,他们的背景比典型的行业工作更加多样化,所以如果你想将职业生涯转向数据科学,这是一个完美的垫脚石和支点机会。

如果你以后申请行业工作,有咨询背景肯定是一个优势;部分是因为大多数咨询公司的声望,部分是因为你作为顾问所获得的技能和经验。

3.您将学会变得敏捷、快速学习,并成为一名全栈数据科学家

在咨询行业,每个项目都是不同的,每个新项目都像是找到了一份新工作。因此,你学会变得非常敏捷,快速适应不同的工作环境、经理、队友和利益相关者。有些客户使用 Python,有些客户更喜欢 R;有些客户的数据在数据库中,可以通过 SQL 提取,有些只有 CSV 甚至 pdf 格式的数据。作为一名数据科学顾问,你经常需要找到创造性的方法来解决看似不可能的问题通过在职学习来提升自己的技能

因为每个项目的设置和团队都是不同的,作为一名数据科学家,有时(如果你幸运的话)你会得到一整个团队的数据工程师;有时候,你必须成为数据工程师,尝试从 pdf 文档中处理客户的“完美”数据。正因为如此,大多数数据科学顾问都是“全栈”数据科学家,他们可以处理数据科学项目的整个端到端流程,包括数据工程、模型构建、工具构建和见解生成。

如今,这些技能对公司来说非常有价值,尤其是对于初创公司或刚刚开始建立数据科学团队的公司。此外,这也是我测试我真正感兴趣并想专攻的数据世界中的职业道路的完美方式(如果你不熟悉不同的数据职业,请在此阅读我之前的文章)。

4.退出选项很棒,甚至鼓励寻找退出选项

与大多数试图避免人员流失的行业公司不同,咨询公司并不太担心员工离职。为什么会出现这种情况可能很明显——当咨询校友离开并加入行业公司时,他们就成为了咨询公司的潜在客户。

每个行业公司都会在某个时候为某些事情聘请顾问;有谁比你自己的校友更能为你的竞争对手担保呢?

因为咨询公司接受员工的最终离职,他们创造了许多渠道,如内部招聘板、时事通讯等。让他们的校友分享咨询之外的工作机会。

此外,大多数公司喜欢雇佣前顾问,因为他们有在不同行业的不同公司适应和部署数据科学解决方案的经验。顾问们习惯于被抛入深水区,从零开始快速学习。

对我来说,咨询是一种很好的方式,可以让我知道自己下一步想做什么,同时保留自己的选择,一旦我明白了这一点,麦肯锡的品牌、网络和支持(例如,付费“搜索”时间以找到新工作)就帮我找到了下一个机会。

5.你建立的网络令人难以置信

由于许多人最终会离开咨询行业,因此行业公司的管理和领导团队中有许多咨询校友。因此,当你考虑离开咨询行业时,很可能已经有一位 McK 校友在你梦想的公司工作了;与校友建立关系网总是比发冰冷的电子邮件容易。

前咨询顾问的另一个共同点是最终创办自己的公司,利用他们在各个行业的经验和一路走来发现的机会。如果你的梦想是最终建立一家自己的公司,也很可能在咨询行业找到志同道合的联合创始人(或者你可以通过麦肯锡的网络找到并加入一家符合你兴趣的早期企业)。

结论:

我认为你绝对应该加入咨询公司(McK 或其他公司),成为一名数据科学家,如果以下任何一条符合你的话:

  • 作为一名数据科学家,你还不知道自己对哪种数据感兴趣
  • 你不知道哪个行业适合你
  • 你希望将你的职业生涯从另一个领域转向数据科学
  • 你想学习数据科学的可靠的最佳实践(注意最佳实践不一定意味着尖端;事实上,几乎总是相反)

咨询可能不适合你,如果:

  • 你想深入并专注于数据科学的某个领域(例如,你知道你只想专注于构建 ML 模型并成为该领域的专家);这在咨询行业是可能的,但在行业角色中可能更容易实现
  • 你想在数据科学的前沿方法论上工作(我会在我的下一篇文章中解释为什么你很难在咨询业实现这一点,我会解释我为什么离开麦肯锡)

不知道接下来要读什么?我可能有一些推荐给你:

https://medium.com/geekculture/avoid-these-five-behaviors-that-make-you-look-like-a-data-novice-40f01158ae00

我离开麦肯锡成为数据科学家的原因

原文:https://towardsdatascience.com/why-i-left-mckinsey-as-a-data-scientist-30eec01504e5

照片由李俊成Unsplash 上拍摄

开始成为数据科学顾问之前应该考虑的事情

在我之前关于麦肯锡的文章中,我谈到了 为什么我决定加入麦肯锡担任数据科学顾问 以及为什么我认为这对有抱负的数据科学家来说是一个伟大的职业之举;我还谈到了我从担任数据科学顾问 中学到的 宝贵经验。

鉴于公司的声望和我在那些文章中提到的伟大成就,两年后我选择离开让很多人感到惊讶。在本文中,我想分享促使我决定离开的原因,以及如果你也在考虑以数据科学家的身份加入咨询行业,你应该知道和考虑的事情。

只是为了抢走每次我在文章中提到麦肯锡时出现的负面声音——我在这里提到的原因完全是出于对个人和职业发展的考虑。至于“公司是否道德”、“顾问对公司是否有用”等争论。每个人都有权发表自己的意见,这些都不在我讨论的范围之内。

好了,现在我们来谈谈我离开的原因:

作为一名 DS,很难感受到你的工作的长期影响

你可能会听到很多咨询师说这是他们离开咨询行业的原因。我曾经认为这只是人们在面试中使用的一个方便的理由,但它最终成为驱使我离开的主要原因之一。

这部分是由咨询的性质决定的。顾问为公司提供特定领域的专业知识和建议。在每个项目结束时,提议的解决方案(通常是数据科学项目的模型或分析)将被打包并交给客户实施、测试和/或维护。想象一下,你作为数据科学顾问为客户建立了一个需求预测模型:在将模型交给客户之前,你可以使用历史数据评估模型的性能,如果合作伙伴成功说服客户延长项目以测试模型,你可能会获得几周的新数据来评估影响。但是最有可能的是,在客户正式部署它之后(或者如果它将被部署和使用),您不会知道它的性能,更不用说它在未来几年的持续影响了。

直到今天,关于实施阶段是否应该成为咨询公司范围的一部分仍有争议。一些人认为,如果顾问开始实施所提出的解决方案,他们就扮演了管理者的角色,而另一些人认为,提出解决方案而不实施是浪费时间和金钱。在我任职期间,麦肯锡开始越来越重视实施;但在行业的当前阶段,有抱负的数据科学顾问不应该抱太大希望,他们将看到他们的模型投入生产,并能够观察到长期影响。

没有太多机会与尖端的 DS 概念合作

公司雇佣顾问是因为他们没有专业知识。因此,自然地,大多数为分析需求而与顾问合作的客户都不是数据科学领域最先进的。作为一名数据科学顾问,你很可能不会为亚马逊或谷歌的搜索优化构建推荐引擎。****

到处都有项目关注相对前沿的技术,如动态定价,但大多数项目将利用更简单的方法。更不用说那些刚刚开始开发他们的分析实践的客户通常对黑盒模型更不信任,并且更喜欢可解释性。作为一名数据科学顾问,您将有更多的机会学习如何向非分析型受众解释分析概念(在我看来,这是一项非常有价值的技能),但实施 DS 领域最新实践的机会较少。

这是一些人比其他人更关心的问题。如果你作为一名数据科学家的兴趣在于机器学习、人工智能和/或其他高级分析领域,那么在决定你想从事咨询行业的哪些项目,或者咨询行业是否适合进入之前,有必要记住这一点。然而,如果你对通过数据和/或建模解决现实世界的商业问题更感兴趣,咨询是开始学习和实践这些技能的最佳地方。

可扩展性并不总是最重要的,很难考虑/采取长期举措

由于咨询服务通常是短期的,甚至有时时间紧迫,客户希望在几周内看到交付成果。由于时间紧迫,而且在大多数情况下,顾问并不对交付后可交付成果的可持续性负责,因此在选择方法时,效率通常优先于可扩展性。许多分析交付品、模型或分析最终更多的是“概念证明”或“原型”,而不是真正成熟的产品。

自从在科技行业工作以来,特别是作为一名经理,我已经知道了长期计划的重要性。这种类型的项目通常由经理和领导者发起,他们将自己从团队的日常工作中提升出来,主动解决差距以实现整个公司的愿景。咨询顾问几乎不需要考虑长期计划,因为他们是被雇来解决一个(或一组)问题的;因此,工作的性质是被动的,而不是主动的,工作的范围通常是预先确定的。想象一下,你被雇来计算如何放置拼图的一部分,但是你对如何移动拼图的其余部分没有发言权;这可能会令人沮丧,你无法理解拼图的其余部分,因此永远无法发展移动这些碎片的技能。

漫长的工作时间是真实的,旅行可能会令人沮丧

最后的原因更多的是个人层面,而不是专业层面。由于工作和行业的性质(就像律师一样,顾问按小时向客户收费),咨询行业并不以工作与生活的平衡而闻名。对大多数工作日来说,直到午夜才完成分析是常态。

除了长时间工作之外,在疫情之前,顾问们需要从周一到周四为大多数项目前往不同的城市。你可能会对自己说,“听起来很令人兴奋,我可以参观不同的城市!”,我一开始也是这么想的。然而,出差的兴奋很快就会消失,特别是因为你探索这座城市的时间有限,而且大多数晚上都在外观相似的商务酒店工作到很晚。

概要:

就像我在以前的文章中提到的为什么我决定加入麦肯锡成为一名数据科学家,尽管咨询是你作为一名有抱负的数据科学家开始职业生涯的好地方,但它可能并不适合所有人。作为咨询行业的数据科学家,需要谨记以下几点:

  • 如果你更像一个“探索者”而不是“建设者”,那么咨询可能更适合你,因为对于大多数项目来说,你将把原型交给客户,而不会看到它成长
  • 一般来说,你将获得更多的数据故事讲述技能,而不是尖端的建模技能
  • 你将有更多的机会通过短期分析项目参与高效解决问题;但为稳健的分析做长期规划的机会较少

有兴趣阅读更多关于数据科学的职业?这里有一些你可能会感兴趣的文章:

</5-lessons-mckinsey-taught-me-that-will-make-you-a-better-data-scientist-66cd9cc16aba> [## 麦肯锡教给我的 5 条经验将使你成为更好的数据科学家

towardsdatascience.com](/5-lessons-mckinsey-taught-me-that-will-make-you-a-better-data-scientist-66cd9cc16aba) </5-mistakes-i-wish-i-had-avoided-in-my-data-science-career-6c22a44304a1>

为什么我更喜欢概率预测——命中时间概率

原文:https://towardsdatascience.com/why-i-prefer-probabilistic-forecasts-hitting-time-probabilities-726667b9c91d

点位预测有利于决策。有了概率预测,你也可以做出正确的预测。

照片由阿伦视觉Unsplash 拍摄

介绍

在数据科学中,预测通常涉及创建预测未来事件的最佳模型。通常,“最佳”模型是最小化给定误差度量的模型,例如均方误差 (MSE)。最终结果是一系列数值,描述了时间序列的预测轨迹。统计学家或计量经济学家称之为点预测。

更传统的预测模型通常预测给定未来时期的整个概率分布。从现在开始,我们将这些称为概率预测

概率预测的一个好处是能够导出点预测和区间预测。将后者视为应用于预测的置信区间的时序模拟。

当然,一个点的预测更容易传达给非技术利益相关者。谁想处理所有可能的结果——给我一个衡量标准来作为我决策的依据!

现在,确实存在着过于复杂的解决方案最终被贵公司搁置的风险。然而,我们也不应该仅仅为了取悦我们的非技术终端用户而过多地降低复杂性。

作为一个例子,让我们看看击中时间的问题。在你的标准数据科学课程中,这是一个相当不常见的话题。尽管如此,它还是很有用的。

击中次数和击中时间概率

为了我们的目的,我们用一个非常直观的定义:一个 击中时间 仅仅是我们的时间序列第一次进入观察空间的某个子集。数学上,

(图片由作者提供)

在哪里

(图片由作者提供)

并且我们假设时间序列在实数中有实现。后者不是一个必要的要求,但使问题变得更加具体。

我们可以问的一个可能的问题是,当过程第一次超过给定的阈值时。我们感兴趣的子集是

(图片由作者提供)

有了C利益的门槛。现在,当我们谈论击中时间概率时,我们想知道击中时间的概率分布,即

(图片由作者提供)

对于连续时间的时间序列,p通常是一个概率密度..然而,由于数据科学中的大多数时间序列问题都是离散的,所以让我们也专注于这种情况。因此,p是通常更容易处理的概率质量函数。

不幸的是,击中时间的概率很难分析计算,而且往往难以处理。

幸运的是,概率模型可以通过蒙特卡罗模拟来回答击中时间的问题。我们将在下面进一步研究这种方法。

起初,击中时间概率的想法可能看起来像一个很好的玩具问题,几乎没有实际意义。然而,请考虑一个简单的容量规划问题。由于需求增加,公司可能必须决定何时扩大运营能力。

一方面,这在某种程度上肯定可以用一个点预测来回答。只需选择您预测超过阈值的时间戳作为您的预测命中时间。如果一个分数预测首先就足够了,那么一个击球时间的“分数预测”肯定也能很好地工作。

让我们看一个简单的例子:

在野外击中时间的概率

为了简单起见,我们使用古老的航空乘客数据集。请记住,单个实验远远不足以得出任何概括的结论。

最辉煌的航空乘客数据集。(图片由作者提供)

虽然这些数据已经严重过时,但它足够简单,可以帮助我们快速地阐明观点。

命中时间点预测

首先让我们考虑如何使用标准点预测来解决命中时间问题。最终,我们只能确定我们的预测何时达到某个阈值。

这里我选择了550乘客的任意阈值。对于数据背后的虚构航空公司来说,这可能会为何时增加机队运力提供重要线索。

对于点预测方法,程序现在很简单:

  1. 拟合任意时间序列模型(这里我们将使用 SARIMAX (12,1,1,1)模型来捕捉趋势和年度季节性)。
  2. 在足够长的时间范围内进行预测,以使时间序列超过给定的阈值。
  3. 将预测第一次超过阈值的时间戳标记为您的击中时间。

对于statsmodels.tsa.sarimax.SARIMAX,这看起来如下:

C>=550 的点预测和各自的预测击中时间。(图片由作者提供)

事后来看样本集,我们发现我们的击中时间预测晚了一年。在现实世界的应用程序中,迟到一年可能会对您的业务案例造成不利影响。

正如我们将看到的,概率变量给出了一个更完整的图像。不幸的是,我们不能以封闭的形式计算各自的概率质量函数。

命中时间概率的蒙特卡罗估计

幸运的是,statsmodels ' SARIMAX 提供了均值和标准差预测。由于预测分布是高斯分布,我们可以使用这个知识进行蒙特卡罗模拟。从那里,我们可以估计每个月成为C=550的命中时间的概率:

击中次数(C>=550)的概率质量函数(蒙特卡罗估计)。(图片由作者提供)

这个看起来好多了。我们的模型预测,时间序列将最有可能在预测点预测前一年超过阈值。事后的数据也更加符合这一预测。

此外,我们还看到,预测击中时间点(红线)也不是概率变量的期望值(紫线)。这是很重要的,因为实际时间序列的点预测实际上是概率预测的平均值。

然而,由于 SARIMAX 的潜在动力,这并不能转化为平均击球时间。

最后,让我们看看我们的质量函数估计的累积分布函数:

击中时间概率的累积分布函数(蒙特卡罗估计)。(图片由作者提供)

在这里,超过阈值的概率在第二年已经超过 60%,而不是第三年。点预报打击时间不合适的另一个原因。

结论

虽然使用点预测通常更方便,但在某些情况下,这种复杂性降低可能会太多。即使在这个相当简单的例子中,“简单”方法也已经落后一年了。

当然,你特殊的击球时间问题可能会让你走上直路。但是,请记住,您只能在事后判断预测的质量。到那时,再转向上面讨论的更复杂但也更全面的方法显然为时已晚。

最终,概率性预测总是可以简化为单点预测。反之亦然,不幸的是事实并非如此。就我个人而言,我非常推荐概率路线,因为它还有许多其他优点。

在以后的文章中,我计划提供更多关于其他优势的见解。如果您感兴趣,请随时订阅,以便在那时收到通知。

参考

【1】Bas,Esra。概率和随机过程基础。斯普林格国际出版公司,2019 年。

【2】汉密尔顿,詹姆斯·道格拉斯。时间序列分析。普林斯顿大学出版社,2020 年。

Hyndman,Rob J .和 George Athanasopoulos。预测:原理与实践。OTexts,2018。

数据集:https://www.kaggle.com/datasets/rakannimer/air-passengers(在开放数据库许可证(ODbL) 1.0 下许可)

原载于 2022 年 12 月 6 日 https://www.sarem-seitz.com**的

为什么我停止向 CSV 转储数据帧,为什么您也应该这样做

原文:https://towardsdatascience.com/why-i-stopped-dumping-dataframes-to-a-csv-and-why-you-should-too-c0954c410f8f

是时候告别 pd.to_csv()和 pd.read_csv()了

米卡·鲍梅斯特在 Unsplash 上的照片

构建端到端的数据驱动管道极具挑战性,要求也很高。我自己也经历过,这个过程非常繁琐,最终可能不可避免地会有许多中间文件。虽然这些文件通常用作检查点或帮助管道中的其他模块,但如果没有为这些中间文件选择合适的格式,可能会不知不觉地损害运行时和提升存储要求,因为首选格式总是 CSV。

作为一名数据科学家,我知道 CSV 在数据读取、写入、预览、探索等方面提供了巨大的灵活性。它是你、我和几乎所有使用数据框架的人的首选格式。我过去常常利用 CSV 格式导出数据帧,直到最近,我发现了一些节省时间和存储优化的 CSV 替代方案。

幸运的是,Pandas 提供了多种文件格式来保存数据帧,例如:

  1. 战斗支援车
  2. 泡菜
  3. 镶木地板
  4. 羽毛
  5. JSON
  6. HDF5

这促使我根据上述形式在以下参数上的体验表现对其进行排名:

  1. 它们在磁盘上占据的空间。
  2. 对磁盘进行读写操作所需的时间。

实验装置

出于实验的目的,我用 Python 生成了一个包含一百万行三十列的随机数据集——包括字符串、浮点和整数数据类型。

我将下面描述的每个实验重复了十次,以减少随机性,并从观察结果中得出公正的结论。下面的统计数据是十次实验的平均值。

实验

实验 1:保存后利用的磁盘空间

文件格式的内存利用率(图片由作者提供)

  • 显然,如果你正在寻找一种内存优化的格式,HDF5 应该而不是成为你的首选。这里,所利用的磁盘空间是上图中最佳格式的两倍多——JSON,它本身的大小接近其他四种格式的两倍。
  • 到目前为止, Parquet、CSV、Feather 和 Pickle 似乎是存储我们的数据帧的合适选项,因为它们都为相同数量的数据阻塞了辅助存储的大致相同的部分。

实验 2:加载和保存花费的时间

以各自的格式加载和保存数据帧所花费的时间。(图片由作者提供)

这是我们开始注意到使用 CSV 格式的缺点的地方。

  • 现在让我们单独考虑加载时间。读取一个 CSV 文件所用的时间几乎是这里最好的选择——pickle 的三倍(T1)、三倍(T3)。此外,正如我们前面看到的,Pickle 和 CSV 占用的空间相同,为什么要选择较慢的选项呢?
  • 关于节省时间,CSV 是可供选择的最昂贵的选项——消耗接近羽毛的八倍。

显然,在将数据帧存储为特定格式时,加载时必然会再次使用相同的格式。换句话说,一旦您将数据帧存储为 pickle,您就别无选择,只能将其作为 pickle 文件读取。因此,在上面的第三个条形图中,我们查看它们的总效率,即加载时间+保存时间。

  • 遗憾的是,CSV 并不是我们的最佳选择。
  • 与 Feather、Parquet 和 Pickle 相比,CSV 的平均速度是这些格式的 2.5 倍,这是非常高的。

在我看来, ParquetFeather 是我们在这篇文章中探讨的六种文件格式中最好的选择。

结束语

我知道 CSV 很棒。我也爱他们,我是 CSV 的粉丝,原因数不胜数,比如:

  • 如果需要,CSV 允许我只读取列的子集,从而节省 RAM 和读取时间。
  • CSV 本质上是一个文本文件。因此,Pandas 允许我查看 top-n(比如 5、10、15 等。)CSV 中存在的行。
  • Excel 是我最喜欢的工具之一,我可以直接在 Excel 中打开一个 CSV。

然而,CSV 正在扼杀你的管道。事实上是的。仅仅因为到处都有 CSV,您就要花费大量的时间进行读写操作。

除非您需要在非 pythonic 环境(如 Excel)之外查看数据框架,否则根本不需要 CSV。您应该更喜欢 Parquet、Feather 或 Pickle,因为正如我们在上面观察到的,它们提供的读写操作比 CSV 快得多。

所以下次当你准备执行 pd.to_csv() 的时候,想想你是否真的需要一个 csv。

作者使用 memegenerator.net 创建的图像

为什么我在机器学习博士研究中使用权重和偏差

原文:https://towardsdatascience.com/why-i-use-weights-biases-for-my-machine-learning-ph-d-research-11ab2fe16956

实验跟踪、超参数优化、私人托管

照片由弗雷迪婚姻Unsplash

让机器学习变得更容易的工具的数量正在增长。在典型项目的所有阶段,我们可以利用专用软件来获得洞察力。我们可以监控我们的培训渠道,观察部署过程,自动进行再培训,并跟踪我们的实验。尤其是最后一类,实验跟踪,随着越来越多的专用工具的引入,已经获得了关注。海王星。艾已经收集了一份概述 15(!)不同的 ML 实验管理工具

Neptune 概述中涉及的工具之一是 Weights & Biases,通常缩写为 W&B。如果我没有弄错的话,我想我一直在使用这个工具,当时它还在 0.9 版本中。在开始我的 ML 博士研究后,我开始更加欣赏 W&B 提供的好处,并且我已经在我参与的几乎所有项目中使用了它。该软件是成熟的,与任何 python 兼容,并帮助我理解和比较我的实验结果。在下面,我列出了这个工具对任何一个 ML 研究者都有价值的主要原因。

跨不同框架的实验跟踪

很容易,这是我如此看重 Weights & Biases 框架的首要原因:它允许用户跟踪他们的实验,而不管使用的是什么机器学习框架。与所有主流 ML 框架(TF、PyTorch、sklearn 等)的原生集成。)意味着我们可以在一个地方收集来自 Jupyter 笔记本、TensorFlow 脚本、PyTorch 脚本、基于 Sklearn 的代码和任何其他库的结果。这个特性的有用性很难被夸大:我们有一个单独的空间来收集所有的日志和结果!我们不再需要手动跟踪实验 A 的纯文本日志的存储位置,以及这个位置是否不同于实验 b 的位置,非常方便简单。

wandb 跟踪工具的集成非常简单。我们可以通过在适当的地方添加几行代码来快速更新预先存在的脚本。为了展示这个过程,请看下面的脚本。它显示了测井前的一个(简单)实验,带有权重和偏差:

升级这个脚本以支持使用权重和偏差进行日志记录非常简单。在为 wandb 包(Weights & Biases python 库)添加了一个额外的 import 语句后,我们登录我们的(免费!)账户在第 4 行。然后,在第 21 到 24 行,我们利用集成回调来记录训练进度,并利用 wandb.log 语句来手动记录测试结果:

除了跟踪原始实验结果,如测试分数,W&B 还捕获元数据(即关于数据如何产生的数据)。这一点使我想到了下面的原因。

元数据跟踪和查询

除了跟踪实际数据——度量、预测甚至梯度——权重和偏差库还跟踪使用的计算单位、实验的持续时间和开始命令。乍一看,这些信息似乎只是一个很好的好处,但没有什么真正有用的。但是,我们用户可以通过 python 代码查询 W&B 服务器。

通过一个简短的脚本,我们可以收集关于实验的统计数据,例如我们使用的计算小时数,或者根据用户定义的标准对单次运行进行排名。自动查询这些数据的能力使我能够收集有关我的计算使用情况的统计数据。根据计算使用情况,我可以得出我的实验将花费的金额。在这里,一个小时的花费可能不到一美元,但是一个小时的计算是远远不够的。特别是当我优化 hyperparameter 时(见下面的列表),我很快积累了数百个小时。而且这只是针对一个单一的研究思路。因此,你阅读我的博客帖子有助于我支付任何即将到来的计算账单。谢谢!

透明性、再现性和可理解性

最终,我们希望发表研究成果,部署模型。尤其是对于前者,对整个实验有一个透明的视角可以让其他人理解和验证你所做的是正确的。任何人都可以输入一些好看的数字——比如说,98 %的准确率——但只有当硬结果支持这一点时,它才是可信的。

默认情况下,记录到 Weights & Biases 的实验是私人的,这意味着只有你和你的团队成员可以看到它们。然而,为了增加透明度,实验可以公开,特别是在提交作品发表时。有了这个设置,任何有链接的人都可以访问你的结果并验证它们。

即使我们只为自己记录数据,我们也会从 Weights & Biases 提供的透明度中受益。我们可以看到参数(批量大小、时期、学习率等。)我们解析我们的脚本,可视化它们产生的结果,并在任何时候(以后)从中获得洞察力。最好的是,我们甚至可以使用我们存储的信息来重现结果!

交互式强大的图形用户界面

虽然 W&B 可以通过其 API 进行交互,但我更经常使用基于浏览器的界面。它让我轻松地浏览所有的实验。为了增加清晰度,在开始加权和偏差时,我指定了实验的组和工作类型。第一个特性允许我在 UI 中对实验进行分组;后者进一步将运行划分为更精细的类别。为了给你一个看起来像什么的例子,看下面的截图:

在左边,我们看到许多(事实上超过 10k!)实验列举。如果我没有把它们归类到有意义的组中,我很快就会失去这个概述!由于分组功能,我们可以看到运行被放置到子类别中。此外,在每个组中,我们可以通过将运行分成不同的作业类型来增加更多的粒度层。最实际是,这将是“训练”或“评估”在上面的截图中,我在启动脚本时使用了 job_type 参数来区分实际的训练运行和助手实验。如果我把这些助手作为训练的一部分,我会大大减慢它的速度。然而,作为一个独立脚本的一部分,这些额外的信息——实际上是细微之处——可以事后收集,并与已完成的实验联系起来。

值得注意的是,交互式 GUI 使得基于许多标准组织实验变得容易。这个特性让我们获得更多的洞察力:我们可以看到哪些批量有效,找到适当数量的训练时期,或者查看扩充是否改进了度量。除了我在这里介绍的内容,Weights & Biases 还提供了更多有助于提高洞察力的特性。要了解更多信息,我建议浏览这个 ML 研究工具背后的人提供的示例笔记本,以获得实践经验。

它是免费的

这个论点很简短:W&B 是免费使用的,直到你达到一个公平的使用配额。在撰写本文时,您的数据大小可能不会超过 100 GB,但这已经是足够的容量了。超过这些限制,您可以花很少的钱购买额外的存储空间。

通过(免费)团队轻松协作

Weights & Biases 提供团队:不同的用户在一个项目上合作。对于学术研究和开源团体,团队可以免费创建。根据您的订阅级别,您可以创建的协作者和独特团队的数量会有所不同。共同点是团队成员可以将数据记录到单个项目中,使多个实验之间的协作变得轻而易举。

提供自托管服务

对于处理敏感数据的用户来说,有机会自己托管 W&B 应用程序。在撰写本文时,有三种托管软件的方式。首先,使用谷歌云或亚马逊网络服务。该选项导致在选择的云中运行定制的 W&B 版本。第二个选项类似,但使用 Weights & Biases 的云结构。

最后,最后一个选项最适合敏感数据和总体数据控制。尽管如此,它带来了必须提供底层资源和设置运行中的 W&B 实例的开销。最重要的是,必须监控存储容量,因为常规的每用户存储配额约为 100 GB。大量使用,例如在处理大型项目(GPT 风格、Neo 等)时。),可能超过百万兆字节,并可能达到百万兆字节。因此,提前使用可扩展的数据系统。

总而言之,自托管路线非常适合处理敏感数据或需要完全控制记录数据的(学术研究)团队。因此,在研究小组处理企业数据(并利用 ML 工具)的典型情况下,ML 运营商应该考虑私人托管。

内置超参数优化

除了提供数不清的方法来记录所有数据类型,Weights & Biases 还提供了进行参数搜索的工具。请想一想:没有必要设置一个额外的服务(即搜索协调器)。相反,人们可以让 W&B 应用程序处理所有讨厌的东西。在进行了 k-fold 交叉验证的超参数搜索后,我可以向你保证 Weights & Biases 非常适合这种极端情况。如果你已经设置了 Optuna,那么继续使用它。但是如果到目前为止您一直在使用权重和偏差进行日志记录,但是希望扩展,那么可以尝试一下提供的优化工具。

由于参数优化是一项常见的实践——我敢打赌,它甚至可能是许多 ML 研究方向的标准实践——拥有一个结合了日志记录和参数研究的单一工具是一件幸事。此外,由于实验已经通过 W&B 记录,自然也要使用他们的优化框架。

这些是我喜欢使用 W&B 库进行 ML 研究的主要原因。如果你有另一个观点认为使用权重和偏好是一个极好的选择,那么请在评论中与我们分享!

为什么我没有为我的第一份数据科学工作做好准备

原文:https://towardsdatascience.com/why-i-wasnt-prepared-for-my-first-data-science-job-b727d5c8230b

为什么你可能不是呢!

克里斯蒂安·埃尔富特在 Unsplash 上拍摄的照片

回到 2008 年,金融危机正如火如荼,我急需一份工作。我刚刚从应用数学的研究生院毕业,我不知道我要做什么工作。2009 年,我找到了第一份工作,成为一名数据科学家。第一天,我对自己在研究生院学到的技术和算法充满信心,但很快发现,我的学校教育并没有让我为工作中需要掌握的任何技能做好准备。

十多年过去了,我仍然遇到同样毫无准备的应届毕业生。但是为什么会这样呢?

数据科学生命周期

图 1:数据科学生命周期。图片作者。

为了回答这个问题,我发现自己在回顾数据科学的生命周期(图 1)。你会注意到生命周期并不是完全线性的。在数据科学行业工作了几年后,我发现随着更多信息的披露或准确性阈值没有完全达到,您可能会从一个阶段回到另一个阶段。然而,在学校里,我学到了一套简单的线性步骤:

特征工程- >建模- >完成!

线性生命周期并没有考虑到您将会发现的信息,这些信息可能会引导您回到生命周期中的前几个步骤。事实上,你甚至会发现你的问题无法用你现有的数据来解决。在行业中,一个新的机器学习产品首先是作为概念验证开始的,因为你不知道它是否会工作。不幸的是,在学术界,教授必须给你的工作打分,所以他们确保问题有解决方案。虽然这使得分级更简单,但对于行业实践来说是不现实的。在您开始概念验证或查看数据之前,您无法知道您的问题是否有解决方案。

这种二分法可能会导致新的数据科学家认为每个问题都有解决方案,而在行业中,您的数据可能无法解决您的问题,解决问题的技术尚不存在,或者有许多其他原因。当你的机器学习项目失败时,你和你的经理可能会开始认为机器学习项目有风险,预算中的美元可能会分配给其他风险较小的工作。如果你习惯了在学校 100%的成功率,这可能会非常令人沮丧。因此,数据科学家和管理者应该考虑失败,即学习机会是成功。

“我没有失败。 我刚刚发现了一万种行不通的方法。”—托马斯·A·爱迪生

商业理解

回顾图 1 中的生命周期,您会注意到生命周期的第一步是业务理解。您应该从了解业务领域、其流程和数据开始每个概念的验证。拥有这些基础知识甚至可以帮助你发现新的问题来解决。不幸的是,在学校里,我只学会了如何解决问题,而没有学会如何识别它。

我经常从新数据科学家那里听到同样的故事:他们的老板希望他们识别机器学习用例,但他们不知道如何识别。如果幸运的话,他们可以直接接触到客户或真正伟大的产品所有者。但是这些人只能告诉他们他们的业务流程。他们可能没有机器学习的知识,所以他们可能无法识别适当的机会。

照片由 Towfiqu barbhuiyaUnsplash 上拍摄

我也见过新的数据科学家试图不与客户交谈就完成一个项目。这样做的数据科学家可能会选择从他们的数据集中删除空值,但是如果他们与客户交谈,他们可能会发现用户在某些情况下选择不输入数据。这导致画面不完整,并可能在构建模型时造成偏差。访问客户可以帮助您快速了解各种客户行为甚至业务规则是如何影响数据集的。

从许多方面来说,业务理解是生命周期中最关键的部分,但在当今的数据科学课程中却常常缺乏。

数据采集和理解

在第一轮业务理解之后,下一步可能是获取数据集。在学校里,我可以立即获得多个数据集,但我发现在我的职业生涯中,获取数据可能需要几天、几个月或几年的时间!事实上,解决您的问题的数据可能还不存在。我理解学术界为什么会出现这种情况——你只有有限的时间做家庭作业,所以你不能让你的学生像业内人士那样花整个学期来获取数据。然而,这让学生对现实世界毫无准备。

数据科学项目中经常缺乏的另一个领域是数据理解。当我毕业时,我几乎没有在数据集上执行探索性数据分析的经验。在学校,我主要学习模型和算法,但一旦我开始我的第一份工作,我几乎所有的时间都集中在数据和数据中的偏见上。当你不花时间探索你的数据时,你就增加了放大你的机器学习模型中的偏差的可能性。正确探索数据和使用适当的数据采样技术是关键。

建模

我认为我所受的教育为我做好了充分的准备。不幸的是,我只花了大约 15%的时间在建模上。正如我在上一节中提到的,我其余 85%的时间都花在获取和理解数据上。

图 2:数据科学家在学术界和工业界花费的时间。图片作者。Andrej Karpathy 是特斯拉人工智能的高级主管,描述了他在完成博士学位并开始在特斯拉工作后的类似经历。

但是为什么学术界关注的是模型和算法,而工业界关注的是数据?可能是廉价、高质量、真实的数据集很难得到。虽然理解不同算法背后的理论以及如何使用它们很重要,但更重要的是理解数据和数据中的偏差。

举个例子,一个心理学家想要进行一项研究,但是没有足够的资金。为了降低成本,心理学家可能会在他们的研究中使用 18-24 岁的大学生。虽然心理学家可能会发现重要的结果,但他们样本中的个体可能并不代表整个人口。

计算机科学行业也存在同样的问题。大型科技公司花费大量时间来收集和标记数据,这需要很大的代价。最终,课堂数据集并不能让你做好在行业中需要做的所有注释、清理和预处理的准备。

部署

我们尚未讨论的数据科学生命周期的最后一个阶段是部署。你可能足够幸运,在你的第一份工作中,有一个机器学习工程师为你处理这个阶段;然而,我的经验是,我负责部署我在第一份工作中创建的模型——这是我在学校里从未学过的。学术界经常教你如何用你的模型做预测,但是他们通常不会涵盖将你的模型部署到云的最佳架构。

我在工作中学到的另一件事是,当你向真实用户部署一个模型时,你的数据会随着时间而改变,导致你的模型退化或做出完全不正确的预测。我曾经遇到过这种情况,一个企业主没有告诉我他们重命名并重组了文档上的类别。突然,我的模型预测了错误的类别,更新的数据点花了很长时间才出现,以至于模型在生产中几个月都做出不正确的预测。

模型降级和再培训是部署流程不可或缺的组成部分,应包含在数据科学课程中。

结论

如果你开始怀疑自己的第一份工作,只要知道你不是一个人!我接触过的每一个应届毕业生都有类似的感受,要弥合学术界和工业界之间的鸿沟,这个领域还有很长的路要走。

如果你是一名应届毕业生,我鼓励你更深入地研究我们在这篇文章中涉及的领域,以帮助弥合教育中可能存在的巨大差距。我还建议你作为数据科学家的第一份工作是加入一个更有经验的数据科学家团队。这将允许您从团队中的高级数据科学家所犯的错误中学习,而不是自己犯错误。

参考

  1. https://www.datascience-pm.com/tdsp/
  2. https://youtu.be/y57wwucbXR8?t=521

为什么增量 ETL 适合您

原文:https://towardsdatascience.com/why-incremental-etl-is-right-for-you-121b4406bf03

使用 Databricks 自动加载器的增量数据处理教程

嘶!你在听吗?在 Unsplash 上由 Manja Vitolic 拍摄的照片

企业环境中的数据通常会随着时间无限增长。例如:

  • 网上商店的交易积累速度很快。
  • 服务器上运行的应用程序的日志数据。
  • 数百万在线购物者的点击流数据。
  • 来自数百台互联设备的物联网传感器数据。

在上述所有情况中,共同点是数据会随着时间的推移而积累和扩展,需要明智地处理。

什么是增量数据处理?

在高级别上,增量数据处理是将新的或新鲜的数据从源移动到目的地。

增量 ETL 是数据湖架构中最重要的模式之一。可靠地加载新数据降低了成本,并有助于高效地扩展数据管道。

如今,大多数数据管道都是从云存储的某种形式的文件摄取过程开始的。

从历史上看,在数据湖中接收文件是一个复杂的过程,因为许多系统被配置为处理目录中的所有文件,或者工程师需要实现自定义逻辑来识别新数据。

通常定制逻辑相当复杂,事实上重新处理所有数据的方法相当昂贵。

如果您可以有效地加载新数据,而不必花费大量金钱来读取所有数据或创建自己的处理框架,会怎么样?现在有可能了。

什么是 Databricks 自动加载器?

一个现成的解决方案,允许您从云存储中增量加载新数据文件,而无需任何复杂的设置。

在引擎盖下,Autoloader 使用 Spark 结构化流 API,以便从名为 cloudFiles 的源类型中读取新数据。

如果您熟悉 Spark 读写操作,那么自动加载器的实现非常直观。

仅使用以下 4 个参数,就可以使用自动加载器轻松地配置和设置增量数据处理流水线。

  • 数据源 —源数据的目录。自动加载器将自动接收到达此位置的文件。
  • 源文件格式cloudFiles 应该是自动加载器摄取的默认格式,您也可以指定一个选项 cloudFiles.format 来表示源文件本身的格式。
  • —接收源数据的目的表。可以使用来指定。表()自变量
  • 检查点目录 —让自动加载器知道在哪里存储检查点的参数。检查点就像 Spark 流的簿记服务,它跟踪流的进度,也可以用来跟踪数据集的模式。

如何使用自动加载器增量摄取数据?

为了实现以下内容,您只需要一个 Databricks 工作区和一个集群来运行您的笔记本。

让我们熟悉一下我们将在本教程中使用的航班延误 CSV 数据示例。你可以在 GitHub 库中找到 3 个不同日期的航班延误的 CSV 文件,以及一个跟踪笔记本。

数据集具有以下架构:

数据集的模式:按作者分类的图像

场景

现在让我们想象一下,您是一名数据工程师,负责创建和维护一个存储航班延误的数据湖表。每天,源系统将前一天的集体航班延误上传到云存储目录中。您的任务是每天以最佳方式处理这些数据。

设计

下面的示意图准确地描述了实施过程。正如人们常说的,图片比文字更有说服力,在数据工程中,视觉表现通常比一整页文字更能让人们正确看待事物。

我喜欢把这个叫做数据工程的伪代码!

自动加载器示意图概述:作者图片。

如上图所示,该解决方案可用于表示任何通用的文件接收场景,其中数据随着时间的推移积累在数据湖中以备将来使用。

履行

为了跟随并实现本教程,您需要从 git repo 下载 CSV 文件,因为我们试图模拟源系统的行为。

为了保持示例的简单和易于复制,我们不会在本教程中使用任何类型的云存储解决方案,而是坚持使用内置的 Databricks 文件系统(dbfs)。

理想情况下,在生产设置中,源系统将文件发送到某种登陆/暂存云存储目录。

让我们把伪代码变成实际的实现。

用上面的代码准备一个空的笔记本。ETL 过程的第一步是从源目录中读取数据。语法与传统的 spark read 相同,只是稍有改动。

提取 —我们以流的形式读取数据,因为 Auto Loader 利用了底层的 Spark 流。注意,我们需要指定 cloudFiles 作为格式来暗示我们想要使用自动加载功能。如前所述,我们还需要提供一个检查点目录,作为簿记功能的存储位置。

转换 —没有转换的 ETL 很无聊。Spark 模式推理将我们数据集中的第一列作为timestamp读取。因此,我们可以应用一个简单的转换将时间戳列转换为日期类型。

Load —对于加载阶段,我们只需调用 Spark writeStream 方法,并传递检查点位置和我们希望存储数据的目标表名。目标表是一个增量表。如果不存在,执行将创建一个名为 DailyDelays 的增量表。

现在 ETL 代码已经准备好了,让我们开始展示。为了模拟源系统将文件上传到源目录,让我们使用工作区本身提供的文件上传选项上传我们的第一个 CSV 文件(可以在 git repo 中找到)。您可以在工作区菜单→数据→创建表格选项中找到它。记得在默认路径/FileStore/tables/后面添加一个后缀,如下所示,并上传第一个文件。

上传 CSV 文件:作者图片

文件上传后,运行带有 ETL 代码的单元,如果一切顺利,您将开始注意到流式查询被激活,如下所示。这意味着第一个 CSV 文件已经在处理中。

流式查询:按作者排序的图像

要确认数据是否被成功接收,请在另一个笔记本中查询如下所示的目标增量表,您应该已经看到了一些奇妙的结果。

目标表:按作者分类的图像

现在将第二个 CSV 文件上传到同一个目录中,看看魔法是如何展开的。无需调整/更新代码的任何部分,流式查询立即选取这个新文件进行处理,并将其吸收到同一个目标表中。显然,您可以通过查询目标表来确认这一点。如前所述,每个文件只包含某一天的延迟。如果你现在在表格中发现两个不同的日期,自动加载器已经发挥了它的魔力。

如果你仍然不能相信,让我们再做一次检查,上传第三个文件,几秒钟后,我们的目标表应该有 3 个不同日期的数据。

注意:如果您想知道为什么执行代码的单元持续运行并且从不停止,这是因为它运行一个活动的流查询。Spark 流查询有一个默认触发器,每 500 毫秒运行一次,这相当于在数据到达时连续处理数据。当您期望低延迟和接近实时的数据接收时,这非常有用。请注意,这意味着您的集群需要始终在线。

当然,每种情况都是不同的,在我们的示例中,我们确实说过数据每天只到达一次,让这个查询一直运行没有任何意义,最好是每天运行一次,但仍然只处理前一天到达的新文件。

这可以通过对我们现有的 writeStream 逻辑进行简单的更改来实现。通过引入 trigger once 方法,我们仍然可以利用这个强大的功能,以便查询只执行一次,然后自动停止。

自动加载器触发一次:作者图像

结论

增量数据处理不可避免地成为大多数数据管道的首选方法,如果使用得当,自动加载器和 Spark 流可以在数据管道的所有阶段完美地实现这一目的。许多供应商认识到对最佳数据处理方法的内在需求,将其作为内置功能提供,这并不奇怪。

它有几个优点:

  • 处理速度更快,因为数据更少。
  • 一致的性能,因为只处理更改的数据。
  • 不用说,它直接影响处理数据所需的资源成本。

去吧,给自动装载机一个机会,我可以保证你永远不会回头!

CSV 文件以及助手笔记本可以在 git repo 中找到。

为什么自动生成代码很难?

原文:https://towardsdatascience.com/why-is-automatically-generating-code-hard-88d9720ed2bd

用程序合成自动生成代码的挑战

几年前,我迷上了一个叫做 FlashExtract 的工具。这是一个在 Microsoft Excel 中自动生成数据提取代码的工具。在 FlashExtract 中,用户可以突出显示他们想要从 Excel 表中提取的文本。FlashExtract 会自动提取 Excel 表格中的相似文本。

因此,如果您想提取工作表中的所有电话号码,您只需突出显示一个电话号码,工作表中的其余电话号码也会自动提取出来。这几乎就像魔术一样,因为你不必写任何代码或公式。你不必做手工工作,通过表和搜索所有的电话号码。

从文档中提取电话号码。不过,FlashExtract 专门用于表格数据。图片作者。

程序合成

FlashExtract 使用一种叫做程序合成的技术来实现这种自动行为。程序合成指的是根据用户对程序行为的说明生成程序的技术。为了了解更多,我编写了自己的程序合成器,从文本文档中提取模式。在本文中,我想讨论我在开发用于数据提取的程序合成器时遇到的挑战。

用于数据提取的程序合成器

下面是我的程序合成器如何工作的基本想法:

图片作者。

程序合成器生成某种语言的程序,如正则表达式、Python、Java 等。我的合成器用正则表达式(regexe)生成程序,因为 regexe 通常用于查找文本中的子串匹配。

所以,这里有一个正则表达式可以捕获电话号码:

图片作者。

然而,电话号码可能比这复杂得多。可能还有其他符号,如代表国家代码的“+”或表示区号的括号。为了捕捉所有这些可能性,合成器从一组预定义的正则表达式中学习一个正则表达式:

图片作者。

预定义的正则表达式可以有任何指定匹配正则表达式长度的限定符。以下是合成器学习的量词类型:

图片作者。

合成器的目标语言可以描述为预定义的正则表达式和字符串文字的模式。

生成正则表达式的挑战

给定上面的目标语言,程序合成然后将生成程序,具体地说,在这种情况下是正则表达式,它与用户的文本示例(即用户提供的电话号码)一致。如果一个正则表达式捕获了所有用户提供的电话号码,那么它就是一致的

假设用户提供了两个电话号码的例子。程序合成器可以生成许多一致的正则表达式:

图片作者。

以上是程序合成器生成的正则表达式示例。Regex 1、2 和 3 捕获用户提供的所有电话号码示例。注意,一些生成的正则表达式可能过于笼统。Regex 2 捕获电话号码。但是,Regex 2 也可以捕获社会安全号(SSN),例如“049–99–8933”。其他生成的 Regex 可能过于具体,比如 Regex 3,它只捕获区号为“203”的电话号码。虽然 Regex 3 不能捕获诸如 SSN 之类的文本,但是它太具体了,不能按照用户的要求提取文档中所有的电话号码。

注意,即使只有两个电话号码的例子,程序合成器也可以生成许多可能的一致正则表达式。程序合成器如何确定选择哪个正则表达式?这个搜索问题在程序综合中引入了两个常见的挑战:

  1. 我们如何选择一个真正符合用户意图的正则表达式?用户可能实际上想要非常具体的东西,比如区号为“203”的电话号码(参见 Regex 3)。或者用户可能想要所有的电话号码,而不考虑区号(参见 Regex 1)。虽然程序合成能够生成许多有效程序,但挑选一个与用户意图匹配的有效程序是程序合成的一个常见挑战。
  2. 此外,我们必须想出一个策略来导航有效程序的大空间,以及有效地存储可能的程序。可能的程序数量是指数级的。如果我们让 x 成为我们语言中预定义正则表达式的最大数量,那么一个用户提供的 n 个令牌的例子将有最多个 x^n 个可能的正则表达式来捕获它。

更具体地说,程序合成的挑战实际上在于用户意图的多样性和程序空间的难处理性。克服这些挑战的常用技术如下:

  • 消除用户意图的模糊性 : 获得有用的用户反馈,以确定用户的意图。
  • 限制程序空间的棘手问题:一些技术通过以有效的方式表示候选程序的空间来克服棘手问题。其他策略包括使用试探法在搜索空间中导航。

用户意图不明确

作为输入的少量用户示例可能导致用户意图的模糊性。简单的策略有助于减少合成器的意外输出。一个简单的策略是向用户呈现或可视化所学习的程序,并允许他们直接编辑该程序。

此外,向用户呈现合成的程序和程序的提取输出还可以以应该提取什么的更精炼的示例的形式引出用户反馈。显示生成的程序有助于用户理解合成器如何解释他的输入,即生成的程序是太普通还是太具体,或者可能正好合适。

获得更多用户输入的另一个简单方法是间接让用户与合成器的当前输出进行交互。下面是合成器如何引发这种反馈的界面:

图片作者。

上面的一组问题是从学习过的正则表达式中提取出来的。当用户对 SSN“049–99–9004”回答“否”并对电话号码回答“是”时,这将通知合成器不要生成也捕获 SSN 的正则表达式。它还教导合成器不要创建对特定区号(如“203”)过于具体的正则表达式。

程序空间的难解性

处理指数级大量有效候选节目的一种策略是有效地表示可能的节目。在我们生成的正则表达式的例子中,许多正则表达式共享相同的子表达式:

图片作者。

我们可以通过将可能的正则表达式存储为树来利用这种观察,其中(1)树中的每个节点都是预定义的正则表达式或文字,以及(2)从根节点到任何叶节点的任何路径都形成与用户提供的示例一致的正则表达式。

图片作者。

在上面的图像中,合成器基本上表示了树结构中正则表达式的可能空间,因此具有相同起始子表达式的正则表达式用相同的节点表示。将正则表达式的空间表示为树允许合成器生成大量有效的正则表达式,而不必在内存中枚举它们。

处理可能节目的大空间的另一个策略是设计一些搜索策略,以便能够快速导航该空间。在程序合成中,有几种搜索技术可用,最简单和最天真的是暴力搜索。其他更有效的搜索技术包括使用版本空间代数、机器学习和概率推理。你可以在这里阅读更多关于这些技术

结论

在本文中,我解释了为什么为数据提取自动生成正则表达式具有挑战性。这些挑战在开发程序合成器时很常见。我还讨论了处理这些问题的一些解决方案。要阅读关于程序合成器实现的更多细节,请查看我在这里为 IBM 制作的一个程序合成器,我在一份研究出版物中描述了它:https://dl.acm.org/doi/10.1145/3025453.3025540

截至 2022 年更新: SEER 现采用为 模式归纳 可以在 IBM Cloud 上免费试用:https://Maeda-Han . medium . com/Pattern-Induction-what-is-a-Pattern-part-1-79 ee 1 BD 5 ADC 6

前田花非写的。

为什么交叉熵等于 KL-散度?

原文:https://towardsdatascience.com/why-is-cross-entropy-equal-to-kl-divergence-d4d2ec413864

图 1:从正态分布中抽取的两个概率分布(图片由作者提供)

尽管最初的概念建议使用 KL-divergence,但在构建生成性对抗网络[1]时,通常在损失函数中使用交叉熵。这经常给这个领域的新手造成困惑。在本文中,我们将介绍熵、交叉熵和 Kullback-Leibler 散度[2]的概念,并了解如何使它们近似相等。

当我们有一个以上的概率分布时,熵和 KL-散度的概念就起作用了,我们想比较它们彼此之间的公平程度。我们希望有一些基础来决定为什么最小化交叉熵而不是 KL 散度会产生相同的输出。让我们从正态分布中抽取两个概率分布 pq 。如图 1 所示,这两种分布是不同的,但是它们都是从正态分布中采样的。

1。

熵是系统不确定性的度量。直观地说,它是从系统中消除不确定性所需的信息量。系统各种状态的概率分布 p 的熵可以计算如下:

2。 交叉熵

术语交叉熵指的是存在于两个概率分布之间的信息量。在这种情况下,分布 pq 的交叉熵可以表述如下:

3。 KL-Divergence

两个概率分布之间的散度是它们之间存在的距离的度量。概率分布 pq 的 KL 散度可以通过以下等式来测量:

其中等式右侧的第一项是分布【p】的熵,第二项是根据 p 的分布 q 的期望。在大多数实际应用中, p 是实际数据/测量值,而 q 是假设分布。对于 GANs, p 是真实图像的概率分布,而 q 是伪图像的概率分布。

4。 验证

现在让我们验证 KL-divergence 确实与使用交叉熵进行分布 pq 相同。我们在 python 中分别计算了熵、交叉熵和 KL 散度。

然后我们如下比较这两个量:

右手边的第二项,即分布 p 的熵,可以被认为是一个常数,因此,我们可以得出结论,最小化交叉熵代替 KL-散度导致相同的输出,因此可以近似等于它。

换句话说,我们的目标是在优化终止时达到分布 p 的不确定性水平,并且由于所有机器学习优化都是在受控数据集上执行的,该数据集在实验期间预计不会改变,因此,我们期望 p 的熵保持恒定。

5。 结论

在本文中,我们学习了熵、交叉熵和 kl 散度的概念。然后我们回答了为什么这两个术语在深度学习应用中经常互换使用。我们还用 python 实现并验证了这些概念。完整代码请参考 github 资源库。https://github.com/azad-academy/kl_cross_entropy.git

参考资料:

[1] Goodfellow,I .等人,生成对抗网。神经信息处理系统进展。第 2672-2680 页,2014 年

[2]https://en . Wikipedia . org/wiki/kull back % E2 % 80% 93 lei bler _ divergence

为什么调试数据流很难?

原文:https://towardsdatascience.com/why-is-debugging-data-flows-hard-78aa0f1e095

用户研究观察人类如何调试大数据流中的错误

“我输出中的这些错误来自哪里?!"在大型数据流的输出中发现错误是一个常见的问题。大型数据流接收多个数据集,这些数据集通过许多代码模块进行处理,这些代码模块可能由多个开发人员编写。

图片作者。

然而,在数据流中追踪错误的来源是困难的:

  • 它通常是通过反复试验来完成的。
  • 必须分析每个中间输出,因为错误会在整个数据流中传播。
  • 不是错误源但传播错误的代码模块可能被误识别为错误源。

考虑到这些挑战,我们构建了一个名为 WhyFlow 的可视化交互式工具,帮助用户识别数据流中传播错误的模块。在建立 WhyFlow 之后,我们进行了一项用户研究,我们要求用户识别小玩具数据流中的错误。

虽然给用户提供了小的玩具数据流,但我们发现非常有趣的是,即使使用可视化工具处理带有简单错误的小玩具数据流,用户(都是计算机科学专业的高材生)也发现完成这些调试任务非常耗时。

在本文中,我们希望深入研究我们给用户的具体任务,检查它们,并展示为什么我们认为即使在今天,调试数据流仍然是一件具有挑战性的事情。

什么是数据流?

连接客户和商店表的迷你数据流示例。对于每个模块,显示了中间输出数据点。图片作者作者

数据流包含处理、转换和联接数据的代码模块。输入数据源从左到右流经数据流。该数据流连接两个数据库表, CustomerStore ,然后在数据流的末尾,它计算每个位置的人数。

客户模块读取客户表中的位置等个人信息,而商店模块读取包含特定商店信息的商店表。数据流使用 ValidateLocation 模块清理客户表中的位置细节,然后innerjoinolocation模块通过当前位置字段连接两个表。最后,工作流使用 GroupbyLocationCount 模块计算某个位置内存在多少个匹配。

错误如何传播到数据流中

将数据流的最终输出用于其他目的的用户可能会捕捉到错误的输出。由于以下原因,错误会传播到数据流

  1. 故障代码模块或
  2. 由于上游故障代码模块导致的不正确输入。

假设一个商店经理注意到有一个错误的记录,记录中的商店位置不正确。管理器通知开发人员,以便修复传播错误的模块。在此示例中,数据流在联接模块中有一个错误,该模块中出现了左联接,而不是内联接。

其中一个模块中出现错误的数据流,导致错误向下游传播到最终输出。用户在输出端捕捉到错误。图片由作者提供。

虽然这种数据流有点小,总共只有 5 个代码模块和不到 50 个数据点,但我们希望用户能够轻松地调试这种数据流中出现的错误。

然而,当我们将这些数据流的调试任务交给人类时,我们发现这是一项耗时的任务。我们甚至为他们提供了自动生成的错误数据点解释和易于理解的数据点可视化,以帮助用户进行调试。

在下文中,我将描述我们进行的用户研究,我们要求用户扮演开发人员的角色,他们需要识别通过数据流传播的错误的来源。我们从观察中发现,即使在很小的数据流中调试错误也是非常耗时和具有挑战性的。

用户研究:实验设置

我们招募了 10 名参与者。在实验中,我们让用户扮演一个调试器的角色,这个调试器必须找出数据流中的错误。

实验前给用户的一些教学指南。图片作者。

数据流

我们的用户看到了两个数据流。这两个数据流是从TPC-决策支持(TPC-DS) 基准查询和数据集复制的。TPC-DS 基准测试广泛应用于系统研究和行业,用于评估通用决策支持系统和大数据系统。

图片作者。

在实验开始时,我们向参与者提供了没有任何错误的数据流 W1 和 W2,并要求他们描述每个代码模块的预期操作,并识别它所操作的列。这一练习有助于参与者熟悉数据流。

所有可能的代码模块

所有的用户都上过数据库应用入门课程。虽然参与者熟悉标准的关系操作符,但是他们不熟悉它们是如何在数据流中实现的。在教程中,我们预先向用户提供了所有可能的代码模块的空间知识。

图片作者。

我们发现这是必要的,因为当我们在没有告诉他们可能的代码模块的空间的情况下运行初始试点用户研究时,一些用户花了 4 个多小时试图完成一个调试任务。大多数用户研究对一个人的限制通常建议不要超过 2 小时。

错误类别和可能的错误

此外,我们还提供了可能引入错误的空间。这也帮助我们将每个用户的时间限制在 2 小时。

错误的示例包括重复错误、不正确的筛选器谓词、不正确的空值处理、不正确的字符串操作或不正确的字符串常量操作数,或者用左连接替换了内部连接。具体地说,以下是引入数据流 W1 和 W2 的可能误差:

1.过滤器错误:这些错误会修改过滤器操作,使其在输出中选择正确和不正确的值。

2.联接类型错误:这些错误会修改联接类型,用完整的外部联接替换内部联接。

3.连接列错误:这些错误会修改连接操作的参数,导致连接操作在不正确的列上进行。

我们没有涵盖的错误是分组和聚合代码模块中的错误,或者是涉及丢弃数据的错误(因为我们局限于数据流的特定类型的历史数据血统,称为数据流的why-出处,它不维护关于被丢弃的数据点的信息)。

图片作者。

当一个代码模块中出现错误时,该错误会传播到下游的其他代码模块。然后,错误在每个下游代码模块中有不同的表现。我们称之为标签传播

我们在教程中向用户解释标签传播是如何工作的。图片作者。

为了简化实验,并让用户专注于调试而不是标记,我们预先标记了数据点,并向用户解释“数据流中的所有数据点都已经由识别出不正确数据点的领域专家进行了标记。”

将传统的手动调试与借助错误解释的调试进行比较

为了理解人类如何调试数据流中的错误,我们将该实验设置为用户对比研究。我们比较了用户在错误解释的帮助下进行调试(我们称之为 WhyFlow 的工具)和用户手动调试(基线工具)。在基线工具中,用户只限于单击简单数据流可视化中的模块,以表格格式查看每个代码模块的输出数据点。

手动调试数据流的接口(我们的基线)。图片作者。

WhyFlow 与基线的不同之处在于,它使用户能够直观地检查数据流。它的核心特性是在不同的代码模块中由不正确的数据点产生的错误解释。错误的解释是谓词,它捕获导致最终输出错误的数据点。WhyFlow 为每个代码模块生成解释。解释有助于用户快速识别错误数据点的共有特征。例如,如果一个代码模块有一个错误,其中发生了左连接而不是内连接,那么错误数据点将包含不相等的列值,而内连接应该发生在该处。要了解更多解释是如何产生的,你可以在这里阅读。

WhyFlow 界面截图。联接模块中有一个错误,所有错误数据点的值都不相等,而内部联接应该出现在该处。图片作者。

我们假设,与基线相比,WhyFlow 用户可以在更短的时间内更准确地识别错误并选择合适的解释。

用户任务

在实验的开始,我们用一个快速教程和一些模拟调试任务对每个参与者进行了工具培训。然后,我们向参与者展示 WhyFlow 中数据流 W1 和 W2 的正确执行,并要求他们描述每个代码模块的预期操作,并识别它所操作的列。

然后,我们在这些数据流 W1 和 W2 中引入错误,并要求用户调试错误并确定错误的来源。如果他们使用的是 WhyFlow,我们会问他们,“在描述错误出现的数据的列中选择一个解释。”如果他们使用基线,我们会问他们,“对观察到的误差给出一个解释。描述出现错误的数据,例如,包括错误列和不正确数据共有的特征。”换句话说,要完成一个调试任务,用户必须要么选择一个对 WhyFlow 错误的解释,要么提供一个对基线的解释。

对于每个条件,为什么流和基线,每个参与者都有三个针对不同错误类别的调试任务。我们随机排列了他们开始时的条件顺序和每个条件下的任务顺序。

用户研究中使用的 6 种不同的错误场景。错误以粗体和斜体显示。图片作者。

我们还要求用户在他们认为他们已经识别出有问题的模块、确定了错误类别,或者可以对错误的性质表达一些直觉时,大声思考并说出他们的想法。我们记录了这些事件发生的时间,以及用户在实验过程中所说的话。

对用户如何调试数据流错误的观察

在实验过程中,我们观察了用户在使用 WhyFlow 时如何调试数据流中的错误。他们的工作流程分为以下步骤:

  1. 高层数据流分析:用户首先选择一个可疑模块。WhyFlow 显示代码模块的错误和正确数据点。
  2. 代码模块分析:用户接着分析数据面板中的数据点。
  3. 假设并识别错误类别:用户通过分析数据点来识别错误类别,例如“看起来像是一个不正确的过滤谓词导致值等于 CT ”。
  4. 错误解释:用户通过查看错误数据点上生成的解释来确认他们假设的错误类别。在这种情况下,用户试图找到一个解释谓词,其本质上是说,例如“所有的错误数据点都有值 CT ”。

在每一步,我们记录下用户完成时的时间戳。

用户如何使用 WhyFlow 来调试错误:(1)高级数据流分析,(2)和(3)代码模块分析以及假设和识别错误类,以及(4)通过选择与错误类相关的错误解释来进行错误解释。图片作者。

大多数用户花了太多时间来完成调试任务(步骤 3 和 4)

对于每个用户,我们给出了完成调试任务的时间。我们标记每个错误类和工具的平均时间(B 代表基线,W 代表 WhyFlow)。错误识别错误类别或解释的用户用“x”字形而不是圆圈来区分。图片由作者提供(同样取自此处)。

我们对用户完成调试任务的总时间进行了双向重复测量 ANOVA。我们没有发现显著的交互作用,也没有发现所用工具的显著主效应(为什么流与基线)。换句话说,WhyFlow 中自动生成的错误解释在帮助用户快速完成调试任务方面并没有显著的不同。

但是 WhyFlow 中的用户能够快速识别错误类别(步骤 3)

对于每个用户,我们给出识别错误类别的时间。图片由作者提供(同样取自此处)。

我们对用户描述错误类别的持续时间进行了双向重复测量方差分析,将错误类别和使用的工具(WhyFlow vs Baseline)作为独立因素。错误类别既没有显著交互效应,也没有显著的主效应。我们确实发现了工具使用的显著主效应(F1,9 = 10.15,p = 0.01)。换句话说,用户用 WhyFlow 识别错误类花费的时间更少。除了连接类型错误,他们对错误的最初直觉比基线更准确。

完成调试任务的剩余大部分时间主要用于选择错误解释的任务(步骤 4)

对于每个用户,我们用 WhyFlow (W)来估计选择一个解释的时间,或者在基线(B)中提供一个解释,作为完成调试任务和描述错误类之间的时间差。不正确的解释用“x”字形标记,而不是用圆圈。图片作者(同样取自此处)。

换句话说,大多数用户花了很多时间在 WhyFlow 中选择一个解释。具体来说,我们观察到用户花在 WhyFlow 中选择解释的时间与识别错误类别的时间一样多。三名用户评论说,“有很多解释。”一位用户说,“看到 1000 个解释,就好像是 1000 种不同类型的错误。”一些模块生成了多达 60 个解释。四个用户发现很难辨别建议的解释的质量,因为它们中的许多似乎彼此相似。

最终,WhyFlow 在帮助用户快速确定错误类别方面所提供的任何收益都会因为花费时间来搜索和选择适当的解释而丢失。我们估算了在 WhyFlow 中选择一个解释或在基线中提供一个解释的时间,作为完成调试任务(步骤 3 和 4)的总时间与描述错误类(步骤 3)的时间之差。

上图显示了每个用户的大概解释时间。这次我们再次进行了双向重复测量方差分析,我们发现了工具使用的显著主效应(F1,9 = 6.790,p = 0.028)。

大多数用户在 WhyFlow 生成的解释的帮助下选择了正确的解释(步骤 4)

我们发现用户使用 WhyFlow 比使用 Baseline 更频繁地选择正确的解释。有五个用户最初错误地识别了连接类型错误类,例如,认为错误类型是除连接错误类型之外的其他错误类型。但是这五个用户从 WhyFlow 生成的解释中选择了正确的解释,例如“错误的数据点具有不相等的 storeID ”,尽管该模块是对 storeID 执行连接的连接模块,因此它们应该相等。

按语言化错误类别的正确性和最终解释的正确性细分的用户百分比。图片作者(同样取自此处)。

总的来说,我们的定量结果表明 WhyFlow 可以是一个有效的数据流调试工具,因为用户可以使用 WhyFlow 选择更准确的解释。

结论:为什么调试数据流中的错误具有挑战性

WhyFlow 面向调试数据流并试图确定最终输出中错误数据点原因的最终用户。WhyFlow 用谓词解释错误,并可视化数据流、输出的出处以及错误和正确数据点之间的差异。我们的结果表明,WhyFlow 使大多数用户能够准确地定位和交流故障。

但是为什么调试数据流中的错误仍然具有挑战性呢?一方面,我们发现提供自动生成的错误解释有助于用户识别错误类别的任务,尽管不一定有助于解释和选择错误的解释。调试数据流是一项耗时的任务,即使解释小数据流上的错误也是如此。用户研究中的数据流量很小,超过不超过 40 个代码模块,引入的错误有些简单。但是用户仍然花了很长时间来调试错误。

此外,我们的用户研究是有限的。现实世界的部署往往有我们的研究没有涵盖的其他方面:

  • 调试多个错误。在我们的评估中,WhyFlow 针对数据流进行了测试,只引入了一个错误。然而,即使数据流中只引入了一个错误,我们的用户研究表明,这仍然是一个非常耗时的过程,因为 WhyFlow 用户平均总共需要大约一个小时来调试三个数据流中相当简单的错误。虽然调试数据流中的一个错误仍然具有挑战性,但实际上,数据流可能有多个错误。
  • 支持可解释的错误。 WhyFlow 的当前语言无法捕捉聚合错误。但是,在执行聚合的模块中可能会出现错误。此外,还存在可能丢失所需数据点的误差。在 WhyFlow 的帮助下,无法调试输出中缺失的数据点。

改进人工调试数据流中错误的方式肯定有很多机会。

详细论文:https://openreview.net/forum?id=uO07BC54cW

为什么每个人都停在我的车旁边?

原文:https://towardsdatascience.com/why-is-everybody-parking-near-my-car-and-other-adventures-in-discrete-event-simulation-6d4c350f4bc3

…以及离散事件模拟中的其他冒险

我离开企业界已经一年多了。从那以后,我通过我的咨询公司 Data Driven Supply Chain LLC,将我的时间和才能投入到改善客户的供应链上。创业的一个好处是,虽然我的工作时间很长,但我在工作时有相当大的灵活性。如果我刚刚从早上 7 点到下午 2 点为一个客户编写了一个优化模型,我需要休息一下(我的计算机需要时间来运行这个模型)。是时候去健身房或者为今晚的晚餐买些杂货了。

我住在郊区,所以当我进行这些短途旅行时,我会开车。不久前,我开始注意到一些奇怪的事情,在下午安静的时间去健身房。我会坐在我的车里,收拾我的运动包。我抬头环顾四周,有那么多人围着我,进出他们自己的车。这是为什么呢?我在一个能轻松停放 200 辆车的停车场,停车场里可能还有十个人。那么为什么这十个中有五个在我附近呢?

这种情况并不是每次我在健身房都会发生,但发生的次数足够让我注意到它。有段时间,我以为是巴德尔-迈因霍夫现象;我只是注意到它,因为它在我的脑海里。但我在健身房看到过这种事。在药房。到达目标。在杂货店。在麦当劳。(为了平衡健身房。)发生了什么事?

数学建模(包括供应链建模)的关键技能之一是能够观察复杂的现实世界,识别系统的核心组件,并进行简化。为了弄清楚发生了什么,我简化了系统,并为一家企业设计了一个“模型停车场”。在这个模型中:

  • 停车场有 25 个车位,大小相同,排成一排。商业入口在一端。空间被指定为空间 1(最靠近企业)、空间 2(第二靠近企业)、…空间 25(离企业最远)。
  • 从整点(例如,上午 8:00、8:06、8:12、…上午 8:42、8:48、8:54、9:00、9:06…)开始,每六分钟有一辆车到达停车场。因此,每小时有十辆车到达。
  • 汽车在停车场停留整整三十分钟:上午 8:12 到达的汽车将在上午 8:42 离开。
  • 汽车在到达停车场后立即进入和离开停车点——不需要等待有人退出,不需要在车道上等着。因此,上午 8:42 空出的停车位可立即用于上午 8:42 到达停车场的汽车。
  • 所有的汽车都可以占据任何一个停车位——没有预留停车位,没有对汽车来说太小的停车位,没有明显不知道在线间停车意味着什么的笨蛋,等等。
  • 当汽车到达停车场时,它会立即占据离商店最近的空地。

下图显示的是早上 7:59 的停车场,里面没有任何汽车。假设该建筑位于空间#1 的左侧。空间#1 离建筑最近;25 号空间离大楼最远。

(请注意,本文所有图片均为我创作。)

现在,任何人都可以立即在这个简单的模型中找出漏洞。汽车不会到达尼斯,即使是六分钟的增量;顾客在一个企业中花费的时间也不尽相同。你可以立即腾出或占用一个停车位的想法是可笑的。但是可笑的简单才是重点。我们从简单模型开始,并以此为基础进行构建。

离散事件模拟:是什么?

现在是介绍本文中使用的关键分析方法的好时机:离散事件模拟。离散事件仿真(DES)是对在不确定性下运行的系统进行建模的一种强有力的方法。

在离散事件模拟中,你(用计算机代码)建立一个系统模型。从广义上讲,DES 中的系统是一组协同工作以服务于某一目的的物理和人力资源。系统可以包括工厂、仓库、港口以及供应链和物流中的其他设施;餐馆和商店;网站;呼叫中心;医疗设施……这个清单几乎是无止境的。

在 DES 中构建了一个系统之后,您就要让它经受日常生活中的不确定性。“来者”从外部进入系统( deus ex machina )并使用资源。

  • 顾客来到你的商店
  • 卡车到达你的装货码头装货或卸货
  • 顾客来到收银台结账
  • 汽车到达你餐馆的免下车餐馆
  • 病人到达急诊室

借助 DES,您可以跟踪一段时间内的资源利用情况(例如,装货码头、x 光机、收银员),并据此做出业务决策。(更准确地说,软件跟踪利用率,您查看结果。)因为资源使用的时间和持续时间是高度可变的,所以使用模拟允许我们对这种不确定性建模。

对于离散事件仿真,有许多好的软件选项,包括开源软件和商业软件。对于这篇文章,以及我的咨询工作,我使用了https://r-simmer.org/,一个用于离散事件模拟的优秀 R 包。我使用 tidyverse 包进行数据管理和可视化。如果你有兴趣学习如何使用,它的网站有很棒的教程;但是从现在开始,我将以一种与软件无关的方式来谈论模拟。

在我们简化的停车场例子中,我们让事情变得简单:没有不确定性。每隔 6 分钟就有一批人到达,到达后 30 分钟就有一批人离开。现实世界并不那么美好,但同样,我们开始时故意简单化。

在 DES 中,您(或您的软件)维护一个事件列表。名称是描述性的—事件列表只是一种跟踪系统变化(“事件”)并将时间戳与它们相关联的方法。在研究生院学习 DES 的时候,我不得不手写事件列表。为了演示,我们将在这里做同样的事情。使用上面列出的简化假设,并假设第一辆车在早上 8:00 准时到达,我们将在一个多小时内跟踪到达、离开和当前占用的空间。

下图显示了停车场在事件列表中的进程。假设建筑在左侧,空间#1 是最左侧(最近的)空间;25 号空格是最右边(最远)的空格。绿色空间是开放的;红色空间被占用。时间从上到下进行,与我们刚刚描述的事件列表相对应。

注意到什么了吗?一旦第五辆车在上午 8:24 到达,就有五个被占用的空间——这五个空间离商店最近。即使每六分钟就有一辆车来,三十分钟后就有一辆车离开, 占用的停车位不会改变 。我们可以继续写几个小时的事件列表——我们会得到相同的结果。这涉及到利特尔法则,这是排队论中的一个重要概念,是对排队等候的人或事物的分析研究。(Queue 是 line 的另一个名称,在美国不常使用)。

利特尔定律, L = Lambda * W ,描述简单,但应用强大。它适用于任何 排队系统:几乎任何人或事物到达、等待一段时间、然后离开的地方。(想象一个停车场、装卸码头、餐馆、商店、健身房、医院、填空……)

  • l:系统中的平均项目数。在我们的例子中,停车场里平均有多少辆车
  • λ:系统的平均到达率。在我们的例子中,在指定的时间段内有多少辆车进入停车场:每小时到达 10 辆车,或者作为一个表达式:(10 辆车/ 60 分钟)
  • w:在系统中的平均时间。在我们的例子中,30 分钟

l =λ W =(10 辆车/ 60 分钟)* (30 分钟)= 5 辆车*

等等!利特尔法则说,平均来说,我们在停车场会有 5 辆车。在允许前五辆汽车进入系统后,在模拟研究中称为“热身期”,这是我们手工计算时看到的汽车(和占用的空间)数量。虽然我们遵循的规则是到达的汽车占用最近的可用空间,但利特尔法则告诉我们,无论选择什么样的空间,都会出现 5 辆汽车的结果。

利特尔定律的不足之处在于,输入是平均利率——不考虑这些利率的可变性。

忽视可变性,后果自负

任何在零售店或快餐店的前台工作过的人都可以理解,这些是非常不同的:

  • 下午 2 点到 3 点之间,5 个进来的顾客平均分布,分别是下午 2 点,2 点 12 分,2 点 24 分,2 点 36 分,2 点 48 分。每个都需要五分钟注意力。
  • 在下午 2 点到 3 点之间,5 个顾客在下午 2 点 10 分同时进来。每一个都需要五分钟的注意力。下午三点前不会有其他顾客进来。

在这两种情况下,你在一个小时内为五位顾客服务——利特尔法则对餐馆中的平均顾客数量给出了相同的结果。但是对运营、客户满意度和员工压力水平的影响会非常不同!

(大学时,我在一家连锁三明治店工作,出于法律原因,我称之为地铁。客观地说,我不擅长做“三明治设计师”的工作。地铁,谢谢你给我上了现实世界中的排队论课。)

组织忽视可变性是危险的。仅查看平均输入(每小时的客户数、每天到达的卡车数、每小时的生产率)可能会隐藏这些输入中有影响的可变性。这就是离散事件模拟如此强大的原因之一。

因为这个世界不像我们最初的停车场模型那样可预测,我们现在要在输入中加入一些可变性,看看会发生什么。此表代表原始输入和假设,以及我们对它们所做的任何更改。

关于泊松过程的更多细节请点击这里

你可以看到随着时间的推移,这将如何改变我们停车场的面貌。到达时间不可预测;汽车在停车场停留多长时间是不可预测的;他们在哪里停车是不可预测的。令人欣慰的是,离散事件模拟允许我们相对快速地模拟这种不确定性下的停车场。DES 软件根据我们设置的参数,随机生成汽车的到达时间和在停车场停留的时间。然后,DES 软件会随着时间的推移跟踪每个停车位(以及整个停车场)的状态。下面,我们在一个模拟中看到停车场的状态,平均每小时有 10 个到达,平均停车 30 分钟。在这个画面中,我们每 20 分钟查看一次停车场,从早上 8:00 到中午 12:00。

不是那么容易预测的,是吗!根据利特尔定律,在一整天的时间里,停车场中汽车的平均数量仍然(非常接近)为 5 辆。(在这一点上暂时相信我)。但是可变性是显著的。上午 8 点 20 分,停车场只有三辆车。上午 11 点 20 分,9 辆车在。

如果我们要在 24 小时内跟踪停车场中的汽车数量,它可能看起来像下面的图。x 轴是模拟开始后的小时数(因此 x=0 表示上午 8:00,x=2.5 表示上午 10:30,依此类推)。y 轴表示停放的汽车数量(绿线)和等待停放的汽车数量(红线,整个模拟过程中为零)。您可以看到,虽然停放的汽车数量大致平衡在 5 辆左右,但正如利特尔定律所表明的那样,一天中有很大的变化。

此时你可能会想,“但是等等!如果汽车的到达时间不再是可预测的,并且汽车在停车位上花费的时间不再是可预测的,那么跟踪停车场中的汽车数量有多大用处呢?它不会是可变的吗,就像输入是可变的一样?"

如果你在想:答案是肯定的!(此外,你可能对模拟有所了解。)在离散事件模拟中,您有硬币的两面:您可以包含现实生活中的随机性,但是您的结果取决于您包含的特定随机性!

这种随机性的影响可以通过多次复制模拟并汇总结果进行分析来减轻。如果我们将停车场模拟复制 12 次,并绘制每次复制的停车场中汽车数量的时间序列,它可能如下图所示。您可以检查每个时间序列,并查看复制之间的差异。但是在每次复制中,停车场(随着时间的推移)的平均汽车数量非常接近 5 辆,正如利特尔法则所暗示的那样。(请注意,上面的时间序列没有出现在下面的复制中)。

如果运行模拟的多个副本,可以跟踪一段时间内资源(整个停车场或单个空间)的利用率。您还可以找到资源在复制过程中的总利用率,然后创建一个箱线图,汇总各复制中每个资源的利用率。

下图就是这样一个箱线图,显示了生成上述时间序列图的 12 个重复的总利用率。箱线图表示利用率的最小值、最大值、中间值和四分位数间距(IQR)。红点表示平均利用率。

在 x 轴的最左侧,我们可以看到整个停车场的利用率。其跨复制的利用率非常相似,平均利用率略高于 20%。根据利特尔定律,拥有 25 个停车位,利用率为 20%的停车场平均容纳(25 * 20%) = 5 辆汽车。(副标题表明实际平均值为 5.1 辆——模拟结果并不总是与理论完全相符。)

在 x 轴上,在整个停车场之后,该轴从左到右利用各个空间。记住,space1 表示离大楼最近的停车位;space2 表示下一个最近的停车位;空间 25 表示离建筑物最远的空间。

因为司机通常喜欢把车停在离大楼更近的地方,所以 1 号车位(离大楼最近的车位)的利用率一直很高,平均在 71%左右。离建筑越远,利用率就越低,14 到 25 号空间很少被使用,如果有的话。(下次当你在一家大卖场,发现车位没有满的时候,看看最后面的车位有多少被利用了。我猜不是很多。)

我开发了一个闪亮的应用程序,可以让你试验输入参数,看看它如何改变停车场的利用率(应用程序的输出与前两张图片非常相似)。您还可以看到当每个开放的停车位具有相等的选择概率时会发生什么,以及根据利特尔定律,当系统中的预期汽车数量大于停车位数量时会发生什么。(提示:漫长的等待,越来越多的汽车徒劳地在停车场盘旋。)

请注意,在应用程序中运行模拟可能需要一些时间。当输出可供查看时,您将收到一个弹出通知。

结论…那么为什么这么多人在我的车附近?

现在,是时候回答当初促使这篇帖子的问题了。当我进入或离开停车场的某个位置时,为什么我周围似乎有很多活动发生?

为了回答这个问题,我们首先再次建立一个简单的模型。假设一个停车场一排有 25 个车位,我们可以求出每对车位之间的距离。例如,空间#1 到空间#3 之间的距离是两个空间;空间#16 和空间#25 之间的距离是九个空间。然后,我们可以制作所有空间之间成对距离的直方图。

最不常见的距离是…24 个空格。当你停下来想一想,这是有意义的。只有一对正好相隔 24 个空格的空格:#1 和#25。下一个最不常见的距离是 23 个空格。只有两对相距 23 个空格的空格:#1 & #24,以及#2 和#25。你可以在图表上从右到左继续这个逻辑,直到我们得到一对空格之间最常见的距离:一个空格。(#1 & #2,#2 & #3,等等,直到我们到达#24 & #25。总共 24 次。)

这是一个有趣的起点,因为它表明,如果我们随机选取两个空间,它们之间最常见的距离是 1,有 8%的概率。有 37%的概率它们之间相隔 5 个或更少的空间,平均距离为 8.667 个空间。

您可以在 R 中使用一个简单的脚本使用 sample 函数来测试这一点。或者更类似的,你可以用乒乓球或者标有#1 到#25 的纸条来做实验。

这种影响在我们的停车场模拟中可能会更加明显。记住,人们倾向于尽可能把车停在离大楼近的地方,而较远的车位很少被使用,至少在交通流量较少的时候。在上面的利用率方框图中,查看空间#12 到#25 的利用率:最低。这表明,同时到达/离开更有可能发生在彼此靠近的空间,因为我们都试图把车停在停车场的前面

在停车场模拟中测量这种效应稍微复杂一点,但只是一点点。R 中的包以数据帧的形式提供详细的模拟输出,包括每辆车的到达和离开时间以及停车位。由此,您可以确定:

  • 当到达/离开发生在彼此指定的时间窗口内时。在这个例子中,我把任何一对在 5 分钟内到达或离开的人称为“几乎同时”
  • 有多少对到达或离开是“几乎同时”的
  • 在这些几乎同时发生的停车对中,它们之间相隔多少个停车位?

下图显示了结果。在模拟的所有到达/离开配对中,不到 1%的配对在 5 分钟内发生。(鉴于这些模拟代表了 24 小时的模拟时间,这并不太令人惊讶。)但是在“几乎同时”的到达和离开中,超过 20%* 在相邻的空间中(x 轴上的距离= 1)。超过一半的人相距三个或更少的车位——就停车场而言,非常接近。*

那么为什么健身房里有那么多人把车停在我身边?统计和概率,伙计们。这就是原因。此外,因为我不想走比绝对必要的更远的路去跑步机。

(请注意,如果我们将“几乎同时”定义为相互之间在 5 分钟、10 分钟或 12 小时内发生……相对频率百分比将非常稳定,那么这个柱状图看起来会非常相似。)

真实结论

我希望你已经发现这篇关于离散事件模拟(DES)的能力的文章既有趣又有知识性。唉,我只是触及了 DES 力量的皮毛。使用 DES,您可以对复杂的多阶段流程进行建模,如制造工厂、仓库和物流中心。使用 DES,您可以了解在参与昂贵且难以纠正的资本项目之前业务流程重大变化的影响。使用 DES,您可以了解如何为业务中的极端波动制定计划,例如,如果您的制造工厂不得不在一夜之间将产量提高 25%,或者如果您的商店的每周客流量从本周到下周翻了一番。**

数据驱动供应链有限责任公司提供数据科学和供应链交叉领域的咨询服务和培训。请随时联系我,ralph@datadrivensupplychain.com,了解更多关于如何使用模拟和其他数据科学技术来评估、改进和设计供应链的信息。

既然你已经读到这里,如果你觉得这很有价值,你会考虑捐赠吗?

感谢您的阅读,并祝模拟愉快!

为什么 ggplot2 对数据可视化这么好?

原文:https://towardsdatascience.com/why-is-ggplot2-so-good-for-data-visualization-b38705f43f85

探索 ggplot2 中的图形语法

巴德·赫利松在 Unsplash 上的照片

ggplot2 是在 r 中使用的一个众所周知的数据可视化包。由于 ggplot2 从一开始就开发得很好,工程师可以花更多的时间专注于理解带有图形的数据,并添加额外的功能来丰富 ggplot2。Python 端有很多选项可供选择,例如 Matplotlib、Seaborn、Plotly、Altair,还有很多其他的包。但是没有一个包像 ggplot2 一样在 R 中占主导地位,并且是数据可视化的首选。

为什么 ggplot2 对数据可视化这么好?答案是 ggplot2 在创建基于 图形语法的数据可视化方面是声明性的和高效的。 分层的语法使得开发的图表有结构性和丰富性。生成 ggplot2 感觉就像玩乐高积木。核心概念和语法对新用户来说很优雅,社区支持高级用例。ggplot2 中各种漂亮的主题和调色板使可视化看起来专业,并吸引最终用户。

30 秒内的 ggplot2 示例

大多数数据可视化工具从选择一个可消费格式的数据集开始。ggplot2 在这里也不例外。r 有一个内置的虹膜数据集,可以很容易地用作数据框。

data(“iris”)
summary(iris)
head(iris)# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3.0 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 4 4.6 3.1 1.5 0.2 setosa

一旦装载了虹膜数据帧。我们可以初始化一个ggplot对象,用来声明共享的数据输入,建立美观(映射)。由于用户可以用不同的图层来表示同一幅图上的相同数据,这就节省了复制输入和美观的时间。

ggplot(data=iris, mapping=aes(x=Sepal.Length, y=Sepal.Width, color=Species)) + 
  geom_point() + 
  geom_line()

作者图片

在上面的例子中,我们用萼片的长度作为 x 轴,萼片的宽度作为 y 轴来定义美学。此外,还提供了颜色参数来用相同的颜色标记相同的物种。注意,我们不必引用美学。这是由于aes()是一个报价功能。这意味着它的输入 x、y 和颜色在这里被提到在虹膜数据的上下文中被评估。

使用geom_功能创建层。根据 ggplot 参考,有超过 50 种不同类型的geom_功能。使用geom_pointgeom_line时无需指定输入数据和美学,因为它们已经在ggplot对象中定义。您也可以用不同的数据框和外观覆盖已经定义的ggplot

ggplot2 采用类似管道的语法使用 "+" 来连接层,这一点超级简洁,类似于 R 中的">% "或者 bash 脚本中的 "|" 。它使你的代码非常容易跟踪和调试。

如果你想有 3 个不同的图显示物种而不是颜色,只需将物种从颜色移动到面。

🎉tada,非常简单!

ggplot(data=iris, mapping=aes(x=Sepal.Length, y=Sepal.Width)) +
  geom_point() +
  geom_line() + 
  facet_wrap(~Species)

作者图片

ggplot2 是初学者友好的

当初学者选择数据可视化库时,一个关键的事情是它需要简单,并且反馈循环短,这意味着用户可以快速看到他们创建的图。通过上面的几行代码,我们可以生成一个好看的图形。ggplot2 利用了图形的语法,这使得开发一个情节就像构建乐高积木一样。使用 ggplot2 用图层构建图形的整个过程很容易理解,对初学者来说非常友好

照片由哈维·卡夫雷拉Unsplash 拍摄

对于初学者选择qplot (R 内置)还是ggplot2也有一些讨论。有几个原因让我更喜欢ggplot2:

  • ggplot2 比 qplot 应用更广泛。如果在 StackOverflow 上搜索 ggplot2 vs.qplot,结果是96k vs . 3k(2021 年 12 月)。这意味着作为一个初学者,你在 ggplot2 上找到答案的机会比 qplot 高。或者如果你最后问了一个问题,它能被回答的几率更高。
  • ggplot2 看起来更好,主题丰富。它鼓励我去探索更多的选择,让我的情节看起来更好。ggplot2 附带了大量的主题和许多第三方添加的主题。你可以参考 ggtheme 来看看众多的选项来很好地增强你的剧情。引人注目的图形可以从心理上说服初学者,学习 ggplot2 是值得的。

图形的语法:ggplot2 背后的大思想

图形需要一个作为层的结构来描述它是如何构造的。就像画画一样,我们从一个简单的草图开始,为一个初步的绘画准备草图,引入画面的阴影,最后有细化。各种步骤(层)最终有一个最终的情节定义图形的语法。

Hadley Wickham(《ggplot2》的作者)在他的论文《图形的分层语法》中解释说,ggplot 2 是用图形的语法思维开发的他重新映射了图形的初始语法的核心思想,如下图所示。

图片来自 Hadley Wickham 论文《图形的分层语法》

分层语法定义了以下组件:

  • 形成美学的默认数据集和映射集:我们用数据aes 在 ggplot 函数调用中定义的数据集和映射集。如果图层不使用其他数据集,我们可以假设使用相同的数据框和美学。
  • 图层:图层可以分为四个部分:数据和美学映射、统计变换、几何对象和位置调整。图层定义了最终图形的构建模块。根据您在图上显示数据的方式,几何对象只能显示特定的美感。
  • Scale :处理数据到美学属性的映射。
  • 坐标系:将物体的位置映射到绘图平面上
  • Facet :使用特定维度上的子图显示数据。

有了 ggplot2 中的分层语法,在创建情节时就可以很容易地采用这种结构。对于开发人员来说,由于该层可以轻松地独立运行,因此调试起来也不费力。通过使用管道(ggolot2 中的“+”)添加带有隔离层逻辑的附加层,在现有的 ggplot2 图表上进行扩展也变得非常简单。

超越 R

“图形语法”的概念因数据可视化而闻名。相比其他数据可视化工具,很多人真的很喜欢 R 中的 ggplot2。比如这个 Reddit 线程提到 ggplot2 的体验比 Matplotlib 好很多。

一个叫做 plotnine 的 Python 包是为采用 Python 中图形语法的概念而设计的。在 Python 环境中,用户可以编写类似 ggplot2 的代码,与其他 Python 代码混合使用。plotnine 目前在 Github 上获得 2.9k+颗星;你可以看到这个概念在其他语言中是多么有价值。当不同的语言开始从一个人那里借用库,这就证明了它有多好。

在 ggplot2 中创建地块是结构化和有组织的。它以ggplot为切入点开始。然后在geom_上展开以添加层。此外,各种规模和主题也将适用。更复杂的情节遵循这种模式,给用户一致的体验。另一方面,在 Matplotlib 这样的框架中,代码可以与其他 Python 代码分散在一起。代码的顺序不太重要,但是很难阅读;Matplotlib 比 ggplot2 写更多的代码也很麻烦。

最后的想法

我以前只用 Python 处理数据。然而,当涉及到数据可视化时,人们使用的库非常多,并且越来越难以整合。当我碰巧学习 ggplot2 和图形的语法时,我开始学习 R 并使用 R 进行数据分析。对于数据分析任务,使用 Python 还是 R 仍然是一个争论,但在使用 ggplot2 多年后,这是我执行任何数据可视化任务的首选工具。我强烈推荐如果你对 ggplot2 不熟悉,即使不写一行 R 代码,也要虚心一试。很快你就会发现为什么 ggplot2 对你的推荐这么好。

如果你想了解更多关于 R 和 ggplot2 的知识,我也强烈推荐 Hadley Wickham 的《数据科学的书 R:导入、整理、转换、可视化和建模数据

希望这个故事对你有帮助。本文是我的工程&数据科学系列的部分,目前包括以下内容:

Chengzhi Zhao

赵承志

数据工程和数据科学故事

View list47 stories

你也可以 订阅我的新文章 或者成为 推荐媒介会员 也可以在媒介上获得所有的故事。

如果有问题/评论,请不要犹豫,写下这个故事的评论或通过 LinkedinTwitter 直接联系我。

为什么企业采用一个框架来解决人工智能相关的问题至关重要?

原文:https://towardsdatascience.com/why-is-it-crucial-for-businesses-to-adopt-a-framework-to-address-ai-related-concerns-90bc058b5e64

负责任的人工智能框架就足够了吗,或者我们需要通过政策来规范这个行业吗?

信用:大三毒害元素

考虑你的周围环境:几乎可以保证某种形式的人工智能已经存在。你可能已经和 AI 有了日常的互动,却没有意识到。人工智能目前处于高度发达的状态,以我们无法想象的方式彻底改变了我们的生活和商业实践。

随着全球人工智能市场预计到 2028 年将达到 6483 亿美元,可以肯定地说,人工智能正在迅速扰乱我们的生活。人工智能的扩展也表明,这项技术正在获得广泛接受,几乎每个行业都在采用它。

对一些人来说,人工智能的适应与生产率密切相关,并能激发兴奋感。然而,许多人把这个缩写与恐惧联系在一起。人工智能通常被定义为能够执行人脑可以执行(甚至更好)的任务的任何机器,其他几个越来越令人担忧的问题正在出现。AI 的主流实现试图解决各种合法的问题,包括劳动力的替代、安全问题和缺乏隐私。

虽然不可避免的是,所有组织最终都会增加对人工智能的使用,但组织领导人需要注意他们的方法,以确保合规。为了设计和开发人工智能,以公平地影响客户和社会的方式授权业务和工作场所,需要一个负责任的人工智能框架。

什么是 AI?

在了解什么是负责任的 AI 之前,我们先快速回顾一下“人工智能”。AI 是一个广义的术语,指任何模仿人类行为的计算机软件,包括学习、批判性思维和规划。

但是人工智能是一个广泛的主题;一个学期不可能涵盖全部课程。机器学习——人工智能的一个子集——是目前业务流程中最普遍的实现类型。机器学习是自主处理大量数据的能力。这种类型的人工智能由无限学习轨迹上的算法组成。

信用:Besjunioronenva to Elements

今天,机器学习是最流行的人工智能应用之一。从制造业到零售业,从银行业到面包店,企业正在扩大机器学习的优势范围。根据德勤在 2020 年进行的一项调查,67%的企业目前正在利用机器学习,97%的企业计划在未来几年这样做。

你可能也与机器学习互动过:键盘上的预测文本、网飞推荐、亚马逊购物建议以及你订阅的社交媒体帖子的排列都是机器学习的例子。

在业务方面,机器学习可以快速分析数据,识别模式和异常。以这种方式,如果生产输出中存在差异,算法可以通知负责维护系统的授权机构。

责任人艾案

机器学习的能力是无限的。如果人类每天的生产力不超过五个小时,机器学习可以在二十四个小时内达到并保持同样的生产力水平。与我们见过的其他技术相比,人工智能有能力自动决定向谁推荐什么,甚至根据数据对客户进行优先排序。

凭借这一水平的能力,人工智能可以用固定成本的软件迅速取代依赖于人的可变成本。

作为首席执行官,我们有义务将损失降至最低,并以股东的最大利益行事。但这种结构是否暗示我们会用 AI 驱动的算法取代人类?

随着人工智能对我们生活的影响不断增长,企业领导人有更大的责任来管理人工智能可能产生的潜在道德和技术影响。这最终会导致潜在的问题,因此企业必须概述一个直截了当的人工智能战略。这就是有责任的人工智能发挥作用的地方。

R 负责任的人工智能是一个强调需要设计、开发和部署具有道德、有效和值得信赖的标准和协议的认知方法的过程。负责任的人工智能必须整合到人工智能开发和部署过程的每个方面,这必须包含每一个步骤。

随着人工智能对企业和社会产生巨大影响,现在首席执行官们有责任确保人工智能在各自的组织内得到负责任和合乎道德的实施。数百篇关于人工智能偏见、侵犯隐私、数据泄露和歧视的新闻文章在互联网上流传,在人工智能的部署方面,商业领袖陷入了困境。

负责任的人工智能由三个主要支柱支持:

问责

  • 这是向与系统互动的合作伙伴和其他利益相关者解释和证明决策和行动的需要。人工智能中的问责制只有在结论可以由决策算法推导和解释时才能实现。

责任

  • 这是指人的角色和人工智能系统的能力,以回答一个人的决定,并确定错误或不合理的结果。随着责任链的增长,需要将人工智能系统的决策与系统决策中数据的公平使用和利益相关者的行动联系起来。

透明度

  • 这指的是描述、检查和再现机制的要求,通过这些机制,AI 系统做出决策,并学习适应它们的环境和管理所使用的数据。当前的人工智能算法通常被称为黑盒——需要有方法来检查这些算法和随后的结果。

信用:MegiasDonenva to Elements

为了确保公平收集和管理用于训练算法和指导决策的数据,还需要透明的数据治理。这样做是为了减少偏见,确保隐私和安全。

责任 AI 的优势?

由于人工智能对人们的生活有着精确的影响,实施的伦理方面应该是最优先考虑的。

以下是负责任的人工智能带来的五个关键优势(基于埃森哲人工智能的研究)。

最小化无意偏差

  • 当你在你的人工智能中建立责任时,你确保你的算法和支持它们的数据是无偏见的,并代表整个观众,而不是挑出一个。

确保 AI 透明

  • 建立信任的支柱之一是让人工智能实践变得清晰。可解释 AI 的存在将帮助员工和客户更好地理解和感知系统。

为员工提供新的机会

  • 让你的组织中的个人能够提出他们对人工智能系统的关注,这些系统最终将在不阻碍创新的情况下改善发展。

保护隐私,确保数据安全

  • 在数据安全和隐私受到优先考虑的时候,负责任的人工智能实践将确保敏感数据不会被不道德地使用

为客户和市场带来更多好处

  • 通过创建道德的人工智能实践,您可以降低风险因素,并建立有利于与业务互动的每个利益相关者的系统。

负责任的人工智能不是打勾!

信用: kenishirotieEnvato elements

负责任的人工智能不仅仅是通过打勾来遵守规则。此外,这不是一个单一用户的旅程,而是一个需要所有利益相关者参与的旅程。

研究人员和开发人员必须接受教育,了解他们在创建具有直接社会影响的人工智能系统时的责任。监管者必须理解如何管理责任。一个很好的例子是,当自动驾驶汽车意外撞上行人时,确定谁是错的。

是硬件的制造商(传感器和摄像头制造商)吗?
软件程序员?还是给汽车开绿灯的监管者?

所有这些问题以及更多的问题必须告知社会为负责任地使用人工智能系统而制定的法规,这些法规都需要参与。

公司现在被期望自我监管他们的人工智能,这需要开发和实施他们自己的指导方针和负责任的人工智能实践。

谷歌、IBM 和微软等公司都有文档化的过程指南。然而,这方面的主要问题是,负责任的人工智能原则可能不一致;一个组织应用的东西对另一个组织来说可能完全不同。较小的企业甚至缺乏制定自己政策的手段。

为负责任的人工智能引入一个通用的指导方针是一个变通方法。目前,欧盟委员会关于可靠人工智能伦理指南的出版物可以作为一个合适的起点。正如指南中所概述的,人工智能应用程序必须满足七个基本要求才能可信。

然而,这些规则只存在于欧洲。尽管谷歌、脸书和微软等科技巨头正在推动额外的监管,但这方面的进展甚微。时间会证明一切。

样本责任 AI 框架调查

谷歌 | 微软|IBM|欧盟委员会

负责任的人工智能不仅对企业至关重要,对国家和全球社会也是如此。埃隆讨论了人工智能及其监管框架——以下是引文。

“我通常不支持监管和监督……我认为人们通常应该尽量减少这些事情……但这是一个对公众构成严重威胁的案例。”——埃隆·马斯克

责任人工智能课程

有许多关于人工智能的在线课程,但关于其负责任的应用的课程较少,包括应用人工智能中的伦理和偏见等主题。

我强烈推荐苏格兰爱丁堡大学通过 edX 举办的短期课程“数据伦理、人工智能和负责任的创新”。这个中级课程主要面向在相关领域工作的专业人员。

短期在线课程(ed.ac.uk)

资源

如果你有兴趣了解更多关于公司和组织在人工智能的道德和责任方面所做的事情,我为你收集了一些资源。

负责任地使用技术:IBM 案例研究|世界经济论坛(weforum.org)

人工智能高级专家组|塑造欧洲数字未来(europa.eu)

技术伦理实验室|圣母大学(nd.edu)

CODAIT —开源(ibm.com)

呼叫|罗马呼叫

人工智能伦理| IBM

为什么生产后不断监控机器学习和深度学习模型很重要?

原文:https://towardsdatascience.com/why-is-it-important-to-constantly-monitor-machine-learning-and-deep-learning-models-after-4136f6067547

理解生产后监控 ML 和深度学习模型的重要性可以对这些模型给业务组织带来重大影响。

马库斯·斯皮斯克在 Unsplash 上的照片

作为一个主要参与数据相关活动(如数据处理、数据操作和模型预测)的人,你还被赋予了作为数据科学家或机器学习工程师的额外任务,以实时部署产品。在完成了了解各种模型的正确参数并最终提出最佳模型的繁重工作后,实时部署模型可以在给业务留下深刻印象和创造货币影响的方式上产生重大影响。

最后,模型被部署,它能够根据训练它的历史数据进行预测并给出它的决策。此时,大多数人认为他们已经完成了很大一部分机器学习任务。虽然确实已经做了大量的工作,因此模型已经生产化,但是在机器学习生命周期中还有一个经常被忽略的步骤,那就是监控模型,并检查它们是否对未来数据或模型以前没有见过的数据执行。

照片由马修·施瓦茨Unsplash 上拍摄

尽管在训练 ML 模型和考虑我们任务的最佳评估度量上花费了大量时间,但是总会有测试数据分布可能与训练数据分布完全不同的情况。这听起来有点复杂,但是让我花点时间来进一步简化它。给你一个背景,假设你在 2005 年训练了一个健壮的推荐系统,向不同的用户推荐书籍。在那个年代,哈利波特系列曾经相当火爆,大多会被推荐。如果一个用户实际上寻找的书大多与儿童小说有关,他们很可能会被推荐《哈利·波特》。然而,在当今时代,如果只推荐《哈利·波特》系列,那就没有意义了,因为那里有很多其他作家的畅销书。这并不是要诋毁 JK 罗琳(哈利波特系列的作者)的作品,而是要展示在训练期间根据完全不同的数据训练的推荐系统模型可能并不总是在生产阶段可用的测试数据上表现最佳。因此,在对一组特定的数据训练模型,并期望它在分布与训练数据完全不同的数据上表现良好时,可能会出现问题。现在让我们来看看如果我们在生产后不监控我们的 ML 和深度学习模型,我们可能会面临的潜在问题。

数据漂移

照片由杨奇煜·巴赞内格Unsplash 上拍摄

我们测试了大量模型,以根据评估指标(如均方误差或许多其他取决于业务需求的指标)获得最佳结果。此外,我们还进一步将数据分为训练测试集,以便监控模型如何实时运行。我们在使用测试集时所做的一个基本假设是,该分布与我们实时查找数据的方式非常相似。如果生产时间中的数据反映了测试数据,那么模型也可以像对测试数据那样执行。尽管如此,总会有这样的情况,在生产时间中可用的数据与测试数据的分布非常不同。这种现象也被称为数据漂移,如果不加以控制,会导致公司损失大量利润。因此,在生产之后不断地监控模型以查看行为是否与测试阶段的实际预期相似是至关重要的。****

概念漂移

照片由尼克·费因斯Unsplash 上拍摄

当考虑包含输入数据‘X’和底层目标变量‘y’的受监督机器学习问题时,有许多 ML 模型试图理解 X 和 y 之间的关系。换句话说,它们试图基于一组不同的参数将输入‘X’与目标变量‘y’进行映射,这些参数取决于它们在幕后使用的算法。然而,由于我们无法控制的情况,也可能存在输入和输出之间的关系随时间变化的情况。这可能导致 ML 模型在实时部署时性能不佳。这也被称为概念漂移,即输入和输出之间的关系在几天或几个月的时间里发生了变化。因此,持续监控当前正在流向生产中的 ML 模型的数据,以确保它在没有概念漂移现象的情况下表现最佳,这可能会很方便。

图书馆的贬值

照片由 Hadassah CarlsonUnsplash 拍摄

在模型训练和特征工程阶段,为了获得最佳预测,实际使用了各种库。为了执行这些任务,使用了各种库,这些库通常使得训练模型的任务更容易遵循和简单使用。然而,随着时间的推移,这些库有时会被弃用,它们的一些特性也会发生变化。在这种情况下,当我们处理数据并执行预测时,执行最优的库现在不一定执行得很好。正是在这种情况下,持续的模型监控非常方便,最新的库和环境可以用来进一步改进模型及其预测。

管道问题

照片由昆腾·德格拉夫Unsplash 上拍摄

为了执行恒定流的操作,通常要考虑流水线,在这种方法中,大量的操作可以轻松执行。特征标准化降维等操作都是在流水线中完成的,使得操作变得更加容易,并且易于部署。然而,当我们不能持续地监控模型时,管道中可能会出现问题。当我们试图不断加载数据并从我们的模型中获得预测时,这些管道可能会出现问题。当我们监控我们的模型时,我们有更大的机会检测到这些管道问题,并确保预测是实时生成的,而不会延迟它们的操作。

结论

在实时执行了模型部署任务之后,现在是时候持续监控模型的性能了。如果不定期进行监控,可能会出现数据漂移、概念漂移、管道问题以及各种库的废弃等问题。当我们不监控我们的模型时,也可能有其他问题。感谢您花时间阅读这篇文章。请随时让我知道你的想法和意见。

以下是您联系我或查看我作品的方式。谢了。

GitHub: 苏哈斯·马达利(Suhas Maddali)(github.com)

LinkedIn: (1)苏哈斯·马达利,东北大学,数据科学| LinkedIn

中等: 苏哈斯·马达利——中等

为什么均方差(MSE)这么受欢迎?

原文:https://towardsdatascience.com/why-is-mean-squared-error-mse-so-popular-4320d5f003e5

快速浏览一下大家最喜欢的损失函数

作者创造的形象。

太有创意了,很痛

作为一名正在康复的统计学家,我会第一个告诉你,我的人民是一群痛苦的墨守成规的人。人工智能爱好者喜欢更多的科幻味道的名字,统计爱好者喜欢完全按照罐头上说的去做……这种态度没有比流行的指标 MSE 和 RMSE 更令人讨厌的了。

这些名字是——等等——字面意思是计算它们的方法。就像召唤一个非常温顺的小恶魔。

如何计算均方误差(MSE):

  1. 你发现了 错误
  2. 你纠正了那些错误。
  3. 取误差平方的平均值。

哒哒,那是 MSE。

如果你在寻找均方根误差(RMSE),你只需要在最后取一个平方根。

4。你拿根。

是的,这些公制名称是如此有创意,它伤害。它们真的只是反向的配方。

如果你从这个快速的解释中发现了 MSE 是什么,请继续阅读!如果你不确定什么是“错误”和/或你感到有点困惑,请快速浏览我的介绍 MSE 演练这里

观看我的课程中计算和优化的 MSE:bit.ly/mfml_006

婴儿的第一损失函数

均方差(MSE)是众多指标http://bit.ly/quaesita_opera中的一个,你可以用它来衡量你的 型号的性能。如果你上了一堂 机器学习 课,你很可能会在教学大纲中很早就遇到它——它通常是婴儿的第一个 损失函数连续 数据。***

(如果你对任何一个加粗的单词的意思不清楚,你可能会想通过链接对每个概念做一个温和的介绍。)****

*你已经知道 MSE 是什么了,但是为什么它如此受欢迎呢?为什么好像是大家最喜欢的评分功能?

有几个原因,有些甚至是很好的原因。

为什么我们可能希望计算 MSE?

  1. ****绩效评估:我们的模型表现如何?
  2. 型号 优化 :这是最合适的吗?我们能让模型更接近我们的数据点吗?

性能评估和优化是两个不同的目标…没有宇宙法则说你必须对两者使用相同的函数。如果你继续呆在应用人工智能/人工智能的话,理解这种微妙之处将会减轻很多未来的困惑。

对于这个讨论,我假设你理解如何以及为什么一个函数被用于评估和优化,所以如果你对此模糊不清,现在可能是一个绕一个小弯路的好时机。

说到 型号 评测 ,MSE 就是垃圾。说真的。它作为一个度量有很多问题,首先是它的规模不对(这个问题通常通过用平方根代替 RMSE 来解决),但并没有就此结束。它还加重了离群值的权重,使得 MSE 和 RMSE 都难以解释。没有一个能准确地反映出 的含义 ,这对于一个想知道他们的模型平均有多错误的人来说是最感兴趣的。为此,理想的度量标准是所谓的 MAD 。没有理由不使用 MAD 进行评估——它很容易计算。

那么,为什么每个人都对 MSE 如此着迷呢?为什么是你学习的第一个模型评分函数?因为它真的有不同的用途:优化,而不是评估。

如果你想使用优化算法(或微积分)快速找到给你最好的理想参数设置— 最优! —性能,有一个 方便的 功能配合工作真好。这一点很难超越 MSE。你学过的一阶导数是 x,这是有充分理由的——在微积分中,正方形让事情变得超级简单。微积分 101 的下一课是如何处理常数和求和,因为这些也非常简单。你猜怎么着?平方、总和以及常数(1/n)就是 MSE 的全部公式!

朋友们,这就是 MSE 如此受欢迎的真正原因。务实懒惰。这是最容易优化的模糊合理的误差函数。这就是为什么它是勒让德和高斯在 19 世纪之交使用的第一个回归模型……也是为什么我们今天仍然喜欢它。

但是它能满足你所有的需求吗?它是否在所有条件下都优于其他损失函数?当然不会,尤其是当你的数据中有大量异常值时。

实际上,你经常会用到两个函数:一个损失函数和一个 独立的 绩效评估指标。点击此处了解更多信息。

现在您已经知道了喜欢 MSE 的原因,您还可以自由选择其他可用的损失函数,尤其是当您拥有大量计算资源和/或较小数据集时。

感谢阅读!YouTube 课程怎么样?

如果你在这里很开心,并且你正在寻找一个为初学者和专家设计的有趣的完整的应用人工智能课程,这里有一个我为你制作的娱乐课程:

寻找动手 ML/AI 教程?

以下是我最喜欢的 10 分钟演练:

脚注

“损失函数”是“目标函数”的机器学习词——它们是一回事。*

为什么 MSE =偏差+方差?

原文:https://towardsdatascience.com/why-is-mse-bias²-variance-dbdeda6f0e70

“好”统计估计量及其性质简介

偏差-方差权衡

“偏差-方差权衡”是你在 ML/AI 中会遇到的一个流行概念。为了让它变得直观,我想我应该给你们当中的公式爱好者一个关于这个关键公式来源的简单解释:

MSE =偏差+方差

嗯,这篇文章不仅仅是要证明这个公式——那只是一个的意思(呵)到此结束。我用它作为一个借口,给你一个幕后的视角,看看统计学家如何和为什么操纵一些核心构件,以及我们如何思考是什么让一些估算者比其他人更好,但要注意:这是关于这里的技术。

作者创造的形象。

我的博客不喜欢探究公式和一般化的事实,所以许多读者可能想借此机会赶紧离开。如果证明的想法让你充满了存在主义的恐惧,这里有一篇有趣的文章供你欣赏。不要担心,你仍然可以遵循即将到来的偏差-方差权衡文章,但你必须相信这个公式是准确的。这篇文章是写给那些要求证明的人的!(以及关于装饰华丽的希腊字母的讨论。)

先决条件

还在吗?很好。如果你对一些核心概念有所了解的话,这些东西会更容易理解,所以这里有一个快速的清单:

偏向;分销;Estimand 估计;估计量;期望值 E(X);损失函数;卑鄙;模型;观察;参数;人口;概率;随机变量;样本;统计;方差 V(X)

如果你遗漏了一个概念,我会在我的统计术语表中帮你找到。

E(X)和 V(X)

为了确保您对我们讨论的构建模块感到满意,让我们从我的发行版参数领域指南中摘录一段:

期望值 E( X )

一个期望值,写成 E(X)E(X = x) ,就是随机变量 X 的理论概率加权均值(这个字读作“平均”)。

你可以通过加权(乘以)每个潜在值X**X可以取的相应概率 P(X = x) 然后组合它们(用积分∫表示像身高这样的连续变量,或者用和表示像身高四舍五入到最近的英寸这样的离散变量): E(X) = 【T18

米洛斯·托马舍维奇在 Unsplash 上的照片

如果我们正在处理一个公平的六面骰子, X 可以以 1/6 的相等概率取{1,2,3,4,5,6}中的每个值,所以:

e(X)=(1)(1/6)+(2)(1/6)+(3)(1/6)+(4)(1/6)+(5)(1/6)+(6)(1/6)= 3.5

换句话说,3.5 是 X 的概率加权平均值,没人关心 3.5 甚至不是掷骰子的允许结果。

方差 V(X)

将上面的 E( X )公式中的 X 替换为 (X - E(X)) ,得到一个分布的方差。让我授权你在冲动袭来时计算它:

v(X)= E[(X-E(X))=∑【X-E(X)】P(X = X)

那是一个定义,所以这部分没有证明。让我们兜一圈,得到一个公平骰子的方差:V(X)=∑[X-E(X)]P(X = X)=∑(*X-3.5)P(X = X)=***(1–3.5)(1/6)+(2–3.5)(1/6)

如果你处理的是连续的数据,你会用一个积分来代替一个和,但这是同样的想法。

备选 V(X)公式

在我们下面的证明中,我们将对方差公式做一点改变,用最右边的位替换中间的位:

v(X)= E[(X-E(X))]= E[(X)]-【E(X)]

我欠你一个解释,它是从哪里来的,所以让我们快速地覆盖它:

v(X)= E[(X-E(X))]
= E[X**-2XE(X)+E(X)]
= E(X)-2e(X)E(【T22

这是如何发生的,为什么会发生?关键的一点是从第 2 行到第 3 行…我们可以用括号这样做的原因是,期望值是求和/积分,所以无论我们允许用常数和括号来做什么,我们也允许用期望值来做。这就是为什么如果 ab 都是常数,那么 E[aX+b=aE(X)+b。哦,而且 E(X)本身也是一个常数——算出来之后就不是随机的了——所以 E(E(X)= E(X)。很高兴事情解决了。

关于符号和 bling 的注释

Estimands (你要 估计 的东西)往往用不加修饰的希腊字母表示,最常见的是θ。(这是英文中的字母“theta ”,如果我们觉得“th”应该有自己的字母;“th”与“pffft”非常接近,使得θ成为统计中标准占位符的绝佳选择。)

Estimands θ是参数,所以它们是(未知的)常数:E(θ) = θ,V(θ) = 0。

估算者 (你为了 估算估算者 而使用的公式)通常用在希腊字母上加上 bling 来表示,比如在θ上加一个小帽子,就像这样:

既然让这篇博文在一篇中等的帖子里很好地渲染一个带着帽子的θ是一件痛苦的事情,那我就请你发挥你的想象力,每当我键入“θhat”的时候,就能看到这个整洁的小家伙。此外,无论如何,你都要用笔和纸来完成这个过程——你不会像疯子一样,只是通过阅读来学习公式,对吧?这样你就不会被我的符号弄糊涂了。你将抄下用上面漂亮的帽子格式化的公式,然后阅读你自己的笔记,如果你迷路了,瞥一眼我闲聊的解释来帮助你。

推导 MSE 公式

估值器是随机变量,直到你插入你的 T2 数据,得到 T4 估值。估计值是一个常数,所以你可以把它当作一个简单的数字。再说一遍,这样我们就不会混淆了:

  • Estimand ,θ,我们试图估计的东西,一个常数。
  • 估计量,θhat,我们用来得到估计值的公式,一个取决于你得到的数据的随机变量。抽签的运气!
  • 估算,一旦我们将数据插入估算器,最终会得出一些数字。

现在为了知道我们的估计量θhat 是否笨得像砖头一样,我们要检查我们是否能 期望 它接近估计量θ。所以随机变量 X = (θhat - θ)的 E()是我们要处理的第一个变量。

E(X)= E((θhat-θ))= E(θhat)-E(θ)= E(θhat)-E(θ)= E(θhat)-θ

这个量在统计学上有一个专门的名字:偏差。

无偏估计量是 E(θhat) = θ的估计量,这是一个很好的性质。这意味着我们可以 期望 我们的估计量是正确的(平均而言)。在我的温和介绍博客文章中,我解释了偏见指的是“系统性偏离目标的结果。”我应该更恰当地说,偏差是我们的估计量(θhat)给出的结果与我们的目标(θ)之间的预期距离,换句话说:

Bias = E(θhat) - θ

选择“最佳”评估者

如果你喜欢无偏估计量,那么你会喜欢一些 UMVUEs。这个缩写代表一致最小方差无偏估计量,它指的是无偏估计量中最佳选择的标准:如果它们都是无偏的,选择方差最小的一个!(现在我已经带你到了硕士水平统计推断教材的第七章。不客气)

UMVUE,不是悍马。瑞安在 Unsplash 上的照片

“你给我提供了两个具有相同偏差的估值器,所以我选择了方差较小的那个,duh”的花哨术语是 效率

当然,有许多不同的方法来选择一个“最佳”的评估者。要寻找的好的属性包括无偏性、相对效率、一致性、渐近无偏性和渐近效率。前两个是 小样本属性 ,后三个是 大样本属性 ,因为它们处理的是当样本量增加时估计量的表现。随着样本量的增加,如果一个估计量最终达到目标,那么它就是 一致的 。(没错,是时候极限了!读这个如果你的时间- >无限。)

效率是一个非常重要的属性,因为没有人希望他们的评估者到处都是。(恶心。)因为效率与方差有关,所以让我们尝试将 X = (θhat — θ)代入方差公式:

方差V(X)= E[(X)]-[E(X)]
变成V(θhat-θ)= E[(θhat-θ)]-[E(θhat-θ)]

方差衡量随机变量的分布,因此减去一个常数(可以将参数θ视为一个常数)只会移动所有值,而不会改变分布,V(θhat - θ) = V(θhat),因此:

v(θhat)= E[(θhat-θ)]-[E(θhat)-E(θ)]

现在我们重新排列术语,记住常数 E(θ) = θ:

E[(θhat - θ) ] = [E(θhat) - θ] + V(θhat)

现在我们来看看这个公式,因为它有一些特殊的东西,有特殊的名字在里面。提示:还记得偏见吗?

Bias = E(θhat) — θ

我们能在公式中找到吗?当然可以!

e[(θhat-θ)]=[偏差] + V(θhat) =偏差+方差

那么左边的东西到底是什么?这是一个有用的量,但我们在给它命名时并不太有创意。因为“误差”是描述我们的射击点(θhat)和我们的瞄准点(θ)之间的差异(通常记为ε)的恰当方式,所以 E[(θhat - θ) ] = E(ε)。

E(ε)名为,等一下,均方误差!简称 MSE。是的,它的字面意思是 E(ε):我们取误差平方ε的平均值(期望值的另一种说法)。统计学家们,创造力加分。

MSE 是模型的损失函数中最受欢迎的(也是最普通的)选择,它往往是你第一次被教授的(在我自己的机器学习课程中)。

所以我们有:

MSE =偏差+方差

现在你已经完成了数学,你已经准备好理解机器学习中的偏差-方差权衡是怎么回事了。我们将在我的下一篇文章中讨论这个问题——点击跟随按钮继续关注。

感谢阅读!YouTube 课程怎么样?

如果你在这里很开心,并且你正在寻找一个为初学者和专家设计的有趣的完整的应用人工智能课程,这里有一个我为你制作的娱乐课程:

寻找动手 ML/AI 教程?

以下是我最喜欢的 10 分钟演练:

如何在您的数据科学职业生涯中使用 SQL 反连接

原文:https://towardsdatascience.com/why-is-nobody-talking-about-sql-anti-joins-f970a5f6cb54

数据科学

以及为什么你应该知道它们

作者图片

我经常在社交媒体上看到类似上面的图片。它们包括一条简短的消息,说明这些是“常用的 SQL 连接”。问题是这些帖子通常会忽略反连接。我相信反联接在你职业生涯的早期学习是很重要的,这样你就能意识到它们,以备不时之需。在这篇文章中,我想向您展示如何有效地使用反连接来快速获得您需要的数据洞察力。

我将使用这个 SQLite 沙盒数据库作为我的代码示例:【https://www.sql-practice.com/。

什么是反联接?

作者图片

在上图中,您可以看到一个反连接的可视化表示。反连接是指您希望保留原始表中的所有记录,但那些与另一个表匹配的记录除外。我在工作中从未使用过右反连接,左反连接通常适用于您的用例。事实上,我通常根本不使用右连接,因为只需切换表的顺序,就可以完成与左连接相同的事情。

使用代码的反联接示例

这是一个左反联接的例子。除了WHERE子句之外,它与左连接完全相同。这就是它与典型的左连接的区别。

上面的查询查找在 physicians 表中没有匹配的 physician_id 的所有入院。通过将上面示例中的 physician_id 列设置为 null,可以找到左侧表中所有在右侧表中没有匹配记录(null 值)的行。

在这个特殊的例子中,这将返回 0 行,因为表中有相同的医生。

什么时候应该使用反联接?

描述上面的查询示例应该会使用例变得清晰。在上面的代码中,您可以看到第一个 CTE(通用表表达式)将内科医生表过滤为普通外科医生。

然后将该表连接(使用反连接)到入院表,以查找所有不涉及普通外科医生的入院。从这个例子中,您可以看到,当您想要查找两个连接表之间所有不匹配的记录时,这种类型的连接非常有用。

为了亲自查看这些不匹配项,我们可以将上面的查询修改为一个左连接并显示所有列。您将看到,对于右边的表,不匹配的列将全部为空值。

快速注意:您可以在WHERE子句中引用任何列,它不必与您用来进行连接的列相同。

例如,您可以将 first_name 列替换为 physician_id,并获得与 antijoin_example2.sql 中显示的查询相同的结果。

也就是说,最佳实践是使用与连接中的列相同的列——我只是想指出这一点来帮助您理解连接在做什么。

当您应该使用 EXCEPT 运算符时

如果您使用 Oracle SQL,本节仍然适用,只需将所有对 *EXCEPT* 运算符的引用替换为 *MINUS* 运算符即可。

我可以听到一些人已经在问,“但是等等,EXCEPT操作符已经做了同样的事情。为什么我不应该直接使用那个运算符呢?”

如果您不确定[EXCEPT](https://www.postgresqltutorial.com/postgresql-except/) 操作符是什么,基本上它会获取一个表,并查找第一个表中不在第二个表中的所有记录。这与反联接的目的完全相同,但它们用于不同的场景:

  • 当您只需要在两个表之间比较的列时,可以使用EXCEPT
  • 当需要的列比使用EXCEPT操作符比较的列多时,使用反连接

如果我们在这个例子中使用了EXCEPT操作符,我们将不得不把这个表连接回它自己,这样就可以得到与原来的录取表相同的列数。

正如您所看到的,这只是导致了一个额外的步骤,代码更难理解,效率更低。您几乎总是希望避免将表连接回自身。

也就是说,EXCEPT操作符仍然有用,只是在使用EXCEPT操作符时,除了要比较的列之外,还需要获得额外的列。

更新:我在下面的文章中介绍了第三种反连接方法。如果您已经理解了如何使用EXISTS子子句,请跳到本文中的“如何将EXISTS子句用于反连接”一节。

https://medium.com/learning-sql/understanding-the-sql-exist-clause-f3eaa3c2c34b

结论

现在您知道了如何以及何时使用反联接。这就像在左或右连接中添加一个WHERE子句一样简单😎

感谢阅读!

https://medium.com/@andreasmartinson/membership

如果你喜欢这篇文章,请通过 LinkedIn 与我联系,或者看看我的另一个故事:

</10-quick-sql-tips-after-writing-daily-in-sql-for-3-years-37bdba0637d0> </5-window-function-examples-to-take-your-sql-skills-to-the-next-level-2b3306650bb6>

参考文献

  1. sql-practice.com(2022),SQL Practice.com
  2. PostgreSQL 除运算符 (2022),PostgreSQL 教程

为什么统计在数据科学、机器学习和分析中很重要

原文:https://towardsdatascience.com/why-is-statistics-important-in-data-science-machine-learning-and-analytics-92b4a410f686

理解作为一名数据科学家拥有强大的统计学背景的好处

Joshua Hoehne 在 Unsplash 上拍摄的照片

S 统计学,就其最广泛的意义而言,指的是基于数据进行评估、解释、展示和决策的工具和方法的集合。有些人认为统计学是对技术数据的数学分析。

“从大数据中实现价值的一个重大制约因素将是人才短缺,特别是在统计和机器学习方面具有深厚专业知识的人,以及知道如何利用大数据的洞察力来运营公司的经理和分析师。”——麦肯锡

在本文中,我将尝试解释为什么我认为对数据科学和机器学习爱好者来说,拥有对统计学的更深入理解是至关重要的。深入研究统计数据是一种数学分析形式,采用多种定量模型来产生实验数据或实证研究。收集、分析、解释和展示数据都是应用数学的要素。统计学的数学基础是线性代数、微积分和概率论。

我在完成 python 数据科学资格认证时学习了一部分统计学,但后来才意识到统计学 101 是不够的。因此,我认为任何称职的数据科学家都应该对统计学有更深的理解,并精通“R”或 Python。

数据科学到底是什么?

数据科学是一个研究领域,它利用尖端工具和技术来揭示隐藏的模式和趋势,从而产生有价值的见解,可用于做出更明智的业务决策。它还包括预测分析,其中数据科学家采用各种机器学习或统计算法。

数据科学生命周期

要理解统计在数据科学中扮演的角色,您必须首先对数据科学的生命周期有一个透彻的理解。关于生命周期有几种观点,但是我使用一种简化的观点。它包括下面列出的五个阶段。

其他生命周期

下面列出的生命周期是特定于数据科学的更现代的方法。

  • 缩写 OSEMN 代表获取、清理、探索、建模和解释,它代表一个五阶段生命周期。
  • 微软 TDSP:团队数据科学过程结合了许多当代敏捷实践。它由五个阶段组成:业务理解、数据获取和理解、建模、部署和客户接受。

统计学对数据科学家的重要性

我们可以利用统计分析技术来量化我们所拥有的,因此我们可以使用一些度量标准来描述它,而不是筛选大量的数据。

数据科学中的高级机器学习算法利用统计学来识别数据模式并将其转换为可用的证据。数据科学家使用统计学来收集、评估、分析数据并从中得出结论,以及为相关变量实现定量数学模型。数据科学既需要技术技能,如 R 和 Python 编程,也需要“软技能”,如沟通和关注细节。

下面列出了一些数据科学家必须掌握的最重要的技能,以提高他们的统计能力。

统计数字

数据科学家应该努力学习统计学,因为统计学将数据与组织在所有学科中面临的问题相关联,例如如何增加收入、限制支出、创造效率以及最大化通信等。

数据操作

利用 Excel、R、SAS、Stata、Power Query M、Apache Spark 等系统,数据科学家可以对大型数据集进行清理和组织。

批判性思维

数据科学家使用线性回归识别和建模因变量和自变量之间的关系。数据科学家选择在实施过程中考虑了潜在假设的程序。如果假设被违反或选择错误,结果将是不正确的。

组织

数据科学家不断被来自各种来源和项目机会的数据淹没。统计功能方面的专业知识使数据科学家能够在预算和时间限制内有效工作。日常流程也有助于数据安全保护。

解决问题

除了纯计算和基本数据分析,数据科学家还使用应用统计学将抽象发现与现实世界的问题联系起来。此外,数据科学家利用预测分析来规划未来行动。所有这些都需要仔细考虑,以及理性和创新的解决问题的策略。

charlesdeluvioUnsplash 拍摄的照片

几个重要的使用案例:

数据科学中的统计学,从根本上说,是寻找各种非结构化数据之间的结构和关系。结构化数据有助于揭示您收集的数据背后不同的有价值的见解。

逻辑回归,最广泛使用的分类方法之一,有助于根据可观察到的模式预测定性反应。该方法使用当前未知变量的关系和图上其他变量的值来预测该变量的值。

数据分析和机器学习建立在对逻辑回归、、交叉验证和其他帮助机器预测你下一步行动的技术的理解之上。其中一个例子就是当你在 YouTube 上听歌的时候。您会看到您喜欢的歌曲的建议,即使您以前从未听过这些歌曲。推荐歌曲背后的原因是统计数据。

集群是另一个很好的例子。例如,在医疗紧急情况下,了解受影响人群的百分比可以帮助您设计解决方案。在数据科学中,将你的买家分成不同的年龄组被称为聚类。它可以帮助你制作广告,了解更多关于你的目标受众的信息。

统计学在 ML/AI 中的重要性:

数据分析师必须了解并建立数据的全面图景,然后才能大规模收集数据以进行进一步分析,如双变量、单变量、多变量和主成分分析。

许多机器学习性能测量,比如精度、准确度、召回率、均方根误差、f 分数等等,都是基于统计的。

数据探索是数据分析过程中的第一步也是最重要的一步。数据分析师使用数据可视化和统计方法来描述数据集特征,如大小、数量和准确性,以更好地了解数据的性质。

数据可视化和探索促进了从数据中发现新的和意想不到的见解。有了这些信息,统计数据有助于验证我们已经知道的东西被揭穿,从而激发人工智能不同分支的发现。

照片由卢克·切瑟Unsplash 上拍摄

数据可视化和分析:

统计使用像饼图条形图这样的工具以结构化的格式描绘数据。通过收集个别的、不相关的信息,你无法得出准确而精确的结论。

饼图、直方图和条形图等可视化工具在使数据在广泛的数据研究中更具交互性和可理解性方面大有作为。它们为理解复杂数据提供了一种引人入胜且易于理解的方法。

数据分析是分析数据集以根据可用信息做出决策的过程,这越来越多地借助专业软件和系统来完成。它识别潜在的模型和模式,作为数据可视化的输入源,并通过预测需求来帮助公司改进。

我们可以通过使用集中趋势的度量来分析数据。描述数据集中心点或典型值的汇总统计数据称为集中趋势的度量。这些度量通常被称为分布的中心位置,表示分布中大多数值的位置。它可以被认为是倾向于围绕一个中心值聚集的数据。均值、中位数众数是统计学中最流行的三种集中趋势度量。这些计算中的每一个都使用不同的方法来确定中心点的位置。

这些统计工具有助于模式的早期检测,并使最没有经验的用户也能理解它们。因此,得出结论和制定行动计划变得不那么复杂。

关键要点:

统计在现实生活和职业生活中都是必不可少的。它帮助你分析给你的数据,并据此做出决定。

  • 阅读饼状图、条形图等的能力。统计知识有助于你理解数据,并最终提高你展示数据的技巧,让你和其他人都能得出结论。
  • 它使你能够很容易地看到任何数据的趋势;它使您能够有效地分析数据;它能让你得出更好更准确的结论。
  • 在 ML 统计知识的基础上,你可以完全理解你的模型的有效性。如果没有它,你根本无法理解 R 或任何其他性能指标。

然而,你并不需要去学院或大学学习统计学课程。你可以在网上轻松完成。作为一名高管,我对统计的观点和使用案例有很大不同,所以我选择了其他一些课程。

以下是一些优秀的在线统计课程的链接,这些课程将帮助您快速发展扎实的基础技能。

  1. R | data camp 的统计基础
  2. 统计学基础| edX
  3. 统计学习| edX
  4. 统计和 R | edX
  5. 统计学入门| Coursera
  6. 用 R | Coursera 进行数据分析

这是一个非常高层次的观点,解释了为什么我认为所有的数据科学家都应该更多地研究统计学。请在下面的评论中告诉我你的想法。

为什么网球是这样计分的?

原文:https://towardsdatascience.com/why-is-tennis-scored-the-way-it-is-scored-4c82d4bc2262

约翰·福南德在 Unsplash 上拍摄的照片

为什么网球是这样计分的?

将“分数问题”应用于网球

对于一项被认为是典型的英国运动,温布尔登几乎傲慢地被称为“锦标赛”,我很惊讶地知道它可能起源于中世纪 12 世纪的法国(尽管英国人对从其他文化中窃取东西并不陌生)。“爱情”、“15 岁”、“30 岁”以及随后“40 岁”的离奇跳跃的起源似乎有点神秘,但总的来说,起源大致可以追溯到这篇伟大的文章中凝结下来的大量信息。

有趣的是(我似乎找不到太多相关信息),一场网球比赛(不是比赛)本质上是一场争夺 4 分的比赛——如果我们现在忘记“平手”的话。不管我们怎么称呼分数,这就是一场比赛的本质:第一到第四。这就带来了一个问题——如果网球是一场其他分数的比赛,它会是什么样子?比如 6?还是 8?或者只有一场比赛跑到 100 分呢?

事实证明,选择 4 个点效果非常好,为了证明这一点,我们可以回到老的“点的问题”

积分的问题是什么?

一个经典的概率问题,可以说导致了“期望值”的概念,点的问题(从此处弹出)涉及以下问题:

"假设两名玩家 *a* *b* 进行了一场 *n* 点数的比赛,如果玩家 *a* *x* 点数,玩家 *b* *y* 点数,我们现在被迫停止游戏,我们应该如何在两名玩家之间分配奖金?"

举一个简单的例子来说明,如果我们有两个玩家,他们在任何给定的点数上获胜的可能性相等,并且他们目前的点数也相同,那么我们应该对半分彩池,即每个人都有 50%的获胜机会。当我们开始考虑:

  • 赢得给定点数的概率不等,例如玩家a有 70%的胜算,而玩家b只有 30%的胜算
  • 当前点数不相等,例如玩家a当前比玩家b多 10 点

这是帕斯卡和费马首先讨论的问题。

解决方案在于每个玩家还需要多少分

关键不是每个玩家目前有多少积分,xy,而是每个玩家需要多少积分才能赢得游戏,即(n-x)(n-y)。如果我们拿两场比赛来看,比分是:

  • 8–4,第一至 10
  • 18-14 岁,第一至 20 岁

显然,第一个玩家和第二个玩家赢的机会是一样的。

以相等的机会赢得一个给定的点来解决

如果我们改为将每个玩家需要的剩余点数标注为xy(而不是赢得的点数),那么我们可以得到以下结论:如果我们玩x + y - 1多点,那么肯定有一个玩家赢了。例如,如果a需要x=2并且b需要y=4,那么在5点之后:

  • 至少赢了 2 局,游戏就结束了
  • 至少赢了 4 局,游戏就结束了

事实上,对于一个概率相等的结果,我们可以将a:b的概率表示为:

作者图片

换句话说,我们可以将上述表述如下:如果我们玩x+y-1点,即一个玩家必须赢的足够多的点,每一方总结玩家a(左)或玩家b(右)获胜的所有可能组合。我们举一个具体的例子来论证。让我们来看看:

  • 玩家a需要 2 分才能获胜
  • y=4:玩家b需要 4 分才能获胜

看左边,我们有:

作者图片

换句话说,我们计算玩家b没有赢得足够分数的所有时间,即他们需要 4 分才能赢,所以我们计算他们赢少于 4 分的所有时间,根据定义,这些时间玩家a必须赢。同样,看右边,我们得到:

作者图片

这一次我们正在计算玩家b 赢得足够分数获胜的次数。为了将这些计数转换成概率,我们需要除以出现的总次数,也就是左右两边的总和。幸运的是,我们可以利用帕斯卡的恒等式,该恒等式陈述(在这种情况下):

作者图片

其中:

回到上面的数字例子,我们得到了 26/(2⁵和 6/(2⁵).的概率

当我们有不相等的概率时呢?

以前我们认为ab在任何给定的点上获胜的概率是相等的——这就像一个“未加权”的例子,意思是转换成我们只需除以组合总数的概率——没有对每个组合发生的概率进行加权,因为权重都是相等的。

现在我们有了一个“加权”案例。这就像抛硬币两次,a双头赢,b双尾赢。如果我们使用一个有 90%机会正面朝上的装满硬币,显然a获胜的概率比b获胜的概率高得多,尽管事实上仍然只有一种结果导致胜利(双正面或双反面仍然只能在两次投掷中出现一次)。概率发生变化,但结果计数保持不变。

为了进行修正,我们从二项式系数转移到二项式定理得到:

作者图片

其中pa赢得任何给定点数的概率(相应地1-p是玩家b获胜的概率),因此P_aa总体获胜的概率。换句话说,我们在这里做的是抓住玩家b赢得点数不足的每一个机会(因此玩家a赢了),并且:

  • 计算可能发生的情况,例如,如果我们打 5 分,有 5 种情况b只能赢 1 分(他们只赢第一分,他们只赢第二分,等等)
  • 用它发生的概率来衡量

然后最后将所有这些加在一起,得到b赢得不足点数的总概率——或者换句话说,a赢了。鉴于我们只是在看玩家a,我们也可以把它改写为:

作者图片

这可能是一种更直观的写法,因为它将a获胜的概率表示为a赢得足够分数时的(概率加权)机会的总和。

这和网球有什么关系?

如上所述,每一场网球比赛(再次忽略平手)本质上都是一场争夺 4 分的比赛。使用上述框架并进行以下对比:

  • x:在a发球的情况下a赢得比赛所需的点数
  • y:在b返回的情况下b赢得游戏所需的点数
  • p:a发球得分的概率

然后,我们可以模拟一场网球比赛,用xy玩一玩,看看如果我们不选择一场到 4 的比赛,而是选择一场到其他东西的比赛,会发生什么。

给定一个概率,pa赢一局的概率是多少?

现在,让我们用一点 python 来展示当我们改变赢得游戏所需的点数时,赢得无二游戏的概率如何变化。

作者图片

那么以上说明了什么呢?以蓝线为例,这显示了对于“一对四”网球比赛(最接近标准),当我们改变a赢得给定分数的概率(x 轴)时,a赢得整场比赛的概率(y 轴)是如何变化的。我们可以看到,增加您赢得任何给定点数的概率的效果是,在该范围的中间,您赢得游戏的机会增加了 1 比 1 以上——只需看看以下事实:

  • 50%的几率赢得任何一点都有 50%的几率赢得游戏
  • 赢得任何一点的几率为 60%,则赢得游戏的几率大于 60%(当蓝线穿过 60%的 x 轴时,几率接近 70%)

我们还可以看到,每场比赛的分数越多,赢得整场比赛的机会对赢得任何单个分数的机会就越敏感——随着我们向游戏中添加越来越多的分数,50%左右的线变得越来越陡峭。事实上,随着我们添加越来越多的“试玩”(点数),我们正在减少每场游戏的随机性,从而增加“更好的玩家”(即p > 0.5)获胜的机会。这类似于大数定律指出当我们增加试验时,样本均值将接近总体均值。相反,在这里,随着我们增加尝试,更好的玩家赢得游戏的概率接近 1,这里我们可以将 1 视为指标函数的输出,其中:

  • 1 表示a是更好的玩家
  • 0 表示b是更好的玩家

有什么意义?

关键是,如果决定一场网球比赛应该是第一场到第八场的比赛,或者更多,那么我们将会有一场更无聊的运动。每场网球比赛都有一个发球者和回球者,所以根据定义,发球者有优势。职业男子网球的这种优势在p=65%左右。如果我们有更长的游戏,那么我们会:

  • 更少的断点
  • 结果网球比赛就没那么有趣了

事实上,我们可以用上面所做的来说明这一点。有了p=65%和一场‘一对四’的网球比赛,我们被打破的概率是 20%。如果我们将比赛长度增加到 8 分,我们最终的概率会下降到 11.4%,几乎是中断次数的一半。令人兴奋的不仅仅是网球评分系统被离散化的事实,它被离散化成一个合适的增量大小,这给了游戏足够的随机性,以防止稍微好一点的玩家每次都赢。如果你是那个更好的玩家,你会觉得不公平,但如果你是其他人,你会觉得更刺激一点。

为什么对数均匀分布对超参数调整有用?

原文:https://towardsdatascience.com/why-is-the-log-uniform-distribution-useful-for-hyperparameter-tuning-63c8d331698

菲利普·d·Unsplash 上的照片

通过这个小小的改变来改进你的网格搜索

如果您使用过任何形式的网格搜索来调整模型的超参数,那么您很可能遇到过使用对数均匀分布的情况。

在网格搜索的最基本场景中,我们将超参数的可能值定义为一个列表。然而,当使用随机搜索或更高级的贝叶斯方法时,我们也可以使用统计分布来定义搜索空间。

您是否曾经想过,为什么一些超参数的范围是使用均匀分布定义的,而另一些则使用对数均匀分布?如果是这样,本文将回答这些问题。

均匀分布和对数均匀分布

在我们继续之前,让我们快速回顾一下这些发行版实际代表了什么。

均匀分布假设某一范围内所有值的概率相等。通常用 ab 表示范围的下限和上限。超出该范围的值根本不可能发生。分布的概率密度函数(PDF)如下:

来源

对数均匀分布中,点在 log(a)log(b) 之间均匀采样,其中 log 最常见的是以 10 为底的对数。

理论答案

TL;博士对这个有名无实的问题的回答是,对数均匀分布对于探索在几个数量级上变化的数值非常有用。

话虽如此,用一个具体的例子可能更容易理解这句话。假设我们正在调整一个套索模型(不管是回归还是分类)。它有一个超参数alpha,决定正则化的强度——值越大,正则化越强。我们知道值应该≥ 0,没有上限。此外,使用alpha = 0 使模型等于普通逻辑回归,但是,由于数值原因,不建议在scikit-learn使用该值。

有了上面的信息,我们知道了对 alpha 的值的约束。但是我们不知道哪些值对模型和我们的数据最合适。这就是为什么我们想要有效地探索非常广泛的可能价值。对于我们的问题,让我们假设我们探索 0.0001 和 100 范围内的值。

使用对数标度和对数均匀分布的主要好处是,它允许我们在几个数量级上创建均匀分布的搜索空间。这是因为由于对数标度,从 1 到 10 的值与从 10 到 100 的值一样多。让我们理解这一点,并确保它变得清晰。重申:

  • 在线性空间中,很明显,在第二个范围中会有更多的可能值,这仅仅是因为这个范围在线性空间中代表了更大的距离。后者的范围是前者的 9 倍。
  • 在对数空间中,这两个范围的宽度相同,因为它们都是 10 的后续幂运算。

那么在实际中如何使用对数均匀分布呢?我们开始时不知道超参数的哪些值会产生良好的拟合。我们使用几个数量级的大空间进行搜索。通过这种方式,我们可以知道哪些价值观起作用。然后,我们可以重复这个过程,这一次,将可能值的范围缩小到产生良好匹配的值周围的区域。

手工编码示例

在本节中,我们将快速浏览一下这两个发行版,以巩固我们对它们之间联系的理解。首先,我们导入库。

然后,让我们定义分布的范围。如上例所示,我们使用 0.0001 和 100 作为下限和上限。此外,我们指定我们希望从每个分布中获得的随机生成值的数量。

在下一步中,我们从均匀分布和对数均匀分布中生成随机值。

我们使用了均匀分布的numpy实现,因为它比scipy中的实现更容易使用,后者需要传入locscale参数,而不是下限和上限。你可以在笔记本上看到一个scipy实现的例子(最后的链接)。然后,我们绘制随机生成的值的直方图来查看分布的形状。

我们可以立即看到分布的特征形状。在第一种情况下,0.0001 和 100 之间的每一个值都有相同的可能性。在第二种情况下,10 和 100 之间的值对应于所有生成值的大约 1/6,遵循对数标度的逻辑和边界值之间的幅度差。

作者图片

我们还深入探讨了均匀分布和对数均匀分布之间的关系。我们已经提到过,对数均匀分布在边界值的对数之间均匀采样。这正是我们在下面的代码片段中所做的。然后,我们通过对随机生成的值进行 10 次幂运算,将这些值放回到线性标度上。

在下图中,我们可以看到这些值在对数标度上均匀分布(0.0001 的对数为-4,而 100 的对数为 2),在线性标度上呈对数均匀分布。

作者图片

最后,我们还可以验证对数均匀分布生成了一个均匀分布的搜索空间。

运行代码会产生以下摘要:

Number of values between 0.0001 and 0.001: 1659 
Number of values between 0.001 and 0.01: 1620 
Number of values between 10 and 100: 1614

每个箱中的观察值的数量大致相同,并且随着我们增加随机生成的值的数量,将收敛到相同的数量。因此,我们已经确认搜索空间是均匀分布的。

需要记住的一点是,我们没有设置种子,这意味着每次运行代码时,这些数字都会略有不同。

外卖食品

  • 在对数均匀分布中,点在对数(a)对数(b)之间均匀采样
  • 对数均匀分布对于探索在几个数量级上变化的值是有用的,
  • 我们可以使用该分布对大范围的值进行初始扫描,然后在确定哪些值更适合我们的模型和数据后缩小范围。

你可以在我的 GitHub 上找到本文使用的代码。此外,欢迎任何建设性的反馈。你可以在推特上或者评论里联系我。

喜欢这篇文章吗?成为一个媒介成员,通过无限制的阅读继续学习。如果你使用这个链接成为会员,你将支持我,不需要你额外付费。提前感谢,再见!

您可能还会对以下内容感兴趣:

</8-more-useful-pandas-functionalities-for-your-analyses-ef87dcfe5d74>

为什么 MAD 总是比 STD 小?

原文:https://towardsdatascience.com/why-is-the-mad-always-smaller-than-the-std-77c7fcee80a4

照片由达维德·马泽基Unsplash 拍摄

直觉、求导和詹森不等式

平均绝对偏差(MAD)和标准偏差(STD)都是测量一组数据的离差的方法。MAD 描述的是预期偏差,而 STD 则更抽象一些。给出的通常例子涉及发现 68%的观察值在 1 个标准差内,95%在 2 个标准差内,等等——但这只是正态分布的特殊情况

虽然由于切比雪夫不等式,STD 确实可以用于为更多的(有限均值和方差)分布提供这样的界限,但关键是 STD 从了解数据的分布中获得信息内容,这在现实世界中是一个很好的假设。部分由于这个原因,部分由于属性替换在 STD 的抽象定义后面,这两个概念经常被混淆,当引用的数字恰好是 STD 而不是正确的 MAD 时,就产生了“平均偏差为 x%”的说法。

这里的目的是展示:

  • 疯牛病和性病是如何联系在一起的
  • 混淆这两者会导致严重的问题
  • 当疯狂是唯一的选择

快速定义

平均绝对偏差(MAD)和标准偏差(STD)都是测量一组数据的离差的方法。对于随机变量X,我们可以收集n个观察值{x_1, x_2, ..., x_n}来形成一个样本,样本 STD 由下式给出:

作者图片

样本 MAD 由下式给出:

作者图片

在这两种情况下,我们都假设平均值为 0。原来m < s不管分配。

为什么?

一个直观的答案是把每个函数想成一个加权和。对于 MAD,我们给每个值一个相等的权重1/n。然而,对于 STD,我们通过x_i/n对每个值进行加权,即因为我们对每个值进行平方,这意味着我们有效地对每个值进行加权,其中权重是偏差本身的大小。这将通过赋予较大的权重来夸大较大的偏差,反之亦然。

高斯情况下的求导

事实证明,在正态分布的情况下,我们可以相当简单地得出m < s的结果(几乎总是如此)。我们想要的是一种用性病来表达 MAD 的方法。假设结构的标准偏差在正态分布中被参数化,我们可以通过获取 MAD 的期望值来实现:

作者图片

[## 为什么我们要用标准差?

towardsdatascience.com](/why-do-we-use-the-standard-deviation-51d5d1a502a8)

期望是:

  • 我们得到某个 MAD 的概率——p(x)
  • 乘以那个 MAD—x的绝对值项

现在假设正态分布是对称的,我们可以:

  • 将它乘以 2,只从 0 到无穷大积分(不是从负无穷大),就像对折一样
  • 去掉绝对值符号,因为这是由我们只看正域(从 0 开始积分,而不是负无穷大)这一事实保证的

这给了我们:

作者图片

现在我们需要做一点叫做“变量替换”的魔术,使整个积分更容易处理。对于替换,我们使用以下内容:

作者图片

求微分得到x dx,所以我们可以把它代入我们的积分:

作者图片

所以重新排列上面的我们得到:

作者图片

把这个代入,我们就有了替换积分。很有帮助的是(这些巧妙的替换往往如此),取消了u,我们得到了一个相当简单的积分:

作者图片

在这最后一步中,我们有:

  • 重新代入u后积分,并将积分范围返回到{0, infinity}
  • 计算定积分

因此,在正态分布的情况下,MAD 约为 STD 的 0.8 倍,反之亦然,STD 约为 MAD 的 1.25 倍。

越胖的尾巴会怎么样?

为了回答这个问题,我们可以利用我们先前的直觉,根据每个点各自的大小对每个点进行 STD 加权。随着尾部越来越厚,我们越来越有可能得到非常大的偏差。由于这些较大的偏差在 MAD 中仅获得相等的权重,因此它们对 STD 的影响要比 MAD 大得多,因此会增加这个比率。

在 1,000,000 次移动的简单情况下,其中:

  • 999,999 是-1
  • 1 是一百万

我们将有MAD=2但是STD=1000导致我们之前 1.25 倍的比率膨胀到 500 倍。

其他发行版呢?

这里有一篇很棒的文章展示了这如何应用于遵循相同过程的均匀分布——导出 MAD 和 STD,然后取它们的比率。但是,我们怎么能笼统地说 MAD 永远小于或等于 STD 呢?

为此,我们可以依靠詹森不等式。Jensen 不等式是一个非常有用的结果,它在几乎所有处理凸性的领域都有应用,并且与如何:

  • 凸函数的两个值的平均值与
  • 取平均值时凸函数的值

这一点通过如下图示更容易看出:

作者图片

橙色线代表在 2 个点(x=2x=8)的函数平均值,我们可以清楚地看到,这总是大于这 2 个点的任何线性组合的实际函数——这就是詹森不等式所陈述的。回到 MAD vs STD 的例子,我们可以这样写:

作者图片

但右边的项只是方差的表达式,因为绝对值表达式是多余的,因为我们无论如何都要对观察值进行平方。我们可以这样表达:

作者图片

然后求平方根让我们回到:

作者图片

这何时会导致问题?

正是由于上述结果我们才会有这样的说法:

  • 大多数偏差会比 MAD 小
  • 会有一些比疯子更大的
  • 会有一些比 MAD 大得多的(取决于你的变量有多少峰度)

这是必需的,这样我们的平均偏差就是它——如果我们有一些大得多的值,那么我们必须只需要一点点小的批次来平均我们的平均值。

如果我们对一个非常糟糕的结果(或估计误差)被一串好的结果抵消没有意见,那么这就没有问题,混淆 2 也没什么问题。然而,现实生活中很少出现这种情况。一些例子包括:

  • 一旦你在 21 点输掉了所有的钱,你就不能再赢回来了(一个大的负错误会让你血本无归)
  • 一家超市低估了库存,在一周内完全耗尽并破产,这并不能被接下来几周的完美预测所抵消
  • 谷歌地图估算你的旅程时间——航班提前 30 分钟并不能抵消迟到 30 分钟而错过的时间
  • 根据误差的平方,或者有吸收障碍的任何其他例子

在上面所有的例子中,如果你把你的决定建立在 MAD 的概念上,而不考虑你会得到更大偏差的事实(即使在高斯世界中),那么你会遇到麻烦。

性病不存在的时候呢?

上面隐含的假设是我们有一个变量,它的分布有一个有限的方差。有了有限的方差,我们就有了有限的(因而也是可比较的)标准差。由于样本统计的性质,我们总是有一个有限的样本方差,要计算它,我们只需获取所有数据,并将其代入上述 STD 方程。

然而,也有这样的情况,当人口方差为无穷大时,我们必须计算离差的唯一度量就是 MAD。我们仍然可以计算样本标准差,但这实际上不再是一个有用的量,因为它不能用于估计总体参数(因为它不存在/无限)。例子是遵循帕累托分布的任何事物:

  • 城市的规模
  • 在 Steam 上玩游戏的时间(有些人玩得很多,有些人玩得很少)

在这种情况下,理解 MAD 是至关重要的,因为 STD 不会带我们去任何地方。

概述

总而言之:

  • 由于詹森不等式,所有分布的 MAD <= STD
  • 当我们对错误有一个凸暴露时,混淆 STD 和 MAD 会导致严重的错误(一个大错误比几个抵消的小错误重要得多)
  • 有时 MAD 是我们真实人口无限变化的情况下的唯一选择

为什么样本方差是 n-1 个自由度的卡方分布?

原文:https://towardsdatascience.com/why-is-the-sample-variance-distributed-with-n-1-degrees-of-freedom-c9edcdada28b

安托万·道特里在 Unsplash拍摄的照片

将网上随处可见的直觉派生物混合在一起

这是我一直在努力解决的问题——一半是因为我对卡方分布感到不舒服,一半是因为“自由度”的概念看起来非常模糊。大多数推导是:

  • 符号沉重的,大量不必要的数学知识迎面扑来
  • 最终从技术上证明了为什么它有n-1个自由度,但不知何故让你不明白

不管怎样,直觉有点欠缺。幸运的是,互联网上有一些很好的解释来解释为什么会出现这种情况。嗯,主要是在交叉验证上——统计堆栈交换。这里的目的是将它们拼凑成直观的东西,而不删除不必要的数学来表达观点。如果你有时间,原始帖子来自一些非常聪明的人,值得一读简历这里,这里这里以及这些未经交叉验证的这里这里

为什么重要?

因为很好地理解我们的抽样分布是很重要的。我们一生中很少会知道:

  • 我们数据的分布
  • 真实人口平均数
  • 真实的总体方差

因此,我们必须继续收集样本,计算样本统计数据(例如样本均值和方差),然后将它们与一些假设值进行比较。如果不知道这些样本统计数据应该遵循什么分布,我们就不能对我们得到的样本值与我们假设的总体值相比的可能性做出任何陈述:

  • 只是碰巧
  • 这不太可能是偶然的,我们可以带着“一定程度的信心”接受这个假设值为真

上述过程被称为“假设检验”,我们对样本统计分布的了解使上述想法得以量化。

我们想证明什么?

想法是这样的:我们有一些变量,X -它可能是任何东西。事实上,不,它不可能是任何东西。我们不需要知道太多关于X的信息,但是我们需要知道(或者强加)的一件事是它必须是正态分布的。我们不需要知道X的真实均值或方差——只要知道它遵循正态分布。正态分布现象的经典例子是自然事物——身高、鞋码、出生体重等。假设我们生活在一个经典的钟形统计土地上是相当大的,但这是这个特殊的统计结果所必需的。

给定这个变量X,我们就可以通过收集变量的n个观测值(比如记录随机人的身高),每个观测值称为x_i,形成一个样本x_1, x_2, ..., x_n。如上所述,我们不知道随机变量X的真实均值和方差是什么,但是我们可以通过使用样本数据来“推断”它们,从而“估计”这些东西。

我们可以把样本均值写成:

作者图片

和(校正的)样本方差为:

作者图片

我们试图证明以下几点:

作者图片

换句话说,样本方差乘以n-1并除以某个假设的总体方差(因为我们不知道真实方差是多少),遵循带有n-1“自由度”的卡方分布。

为什么会这样呢?

让我们先陈述一下直观的/非数学的结果。因为:

  • 我们假设每个x_i都是独立的(例如,你的身高不会影响我的身高——除非是我的 ma 在读这篇文章),并且是对正态分布变量的观察
  • 样本标准偏差要求您在某个点对这些值进行平方(因为它们是样本平均值的平方偏差)
  • 平方(标准)正态分布值实际上是卡方变量的定义

我们应该期望这个变量V是卡方分布的。n-1位,而不是n位,则来自以下内容。为了计算样本方差,我们需要一些东西来计算离差。我们不知道分布的真正中心(总体平均值),而是用它的估计值——样本平均值来代替它。

事实证明,与样本均值的偏差平方和总是小于真实总体均值附近的值。因此,我们的样本方差(如果未校正)将总是总体方差的低估值。使用n-1而不是n自由度解决了这个问题,因为卡方分布的自由度越低,分布越紧密。

这种略微紧密的分布弥补了我们对真实总体方差的低估。如果我们不这样做,我们将无法拒绝真实人口方差小于实际人口方差的假设。希望到最后,你会相信这是正确的改正。

卡方分布是什么样的?

在推导之前,让我们先画出:

  • 正态分布
  • 平方正态分布
  • 卡方分布

这样我们就能想象我们在做什么。

作者图片

所以在左边我们有一个标准的正态分布——这里没什么不寻常的。接下来,我们对从左边的正态分布中采样的每个值进行平方。假设我们已经对它们进行了平方,每个值都是正的,与零的偏差大于标准正态变量,因为 2 的偏差变成了 4,等等。

最后,我们有各种卡方变量——“各种”,因为每个变量都有不同的“自由度”(dof)。简单地说,假设卡方分布是我们对独立标准正态分布变量的平方求和得到的结果(确切地说),那么自由度就是我们求和的数量。你可以通过我们中间的图表看起来与具有 1 个自由度的卡方变量有多相似来看出这一点,因为我们中间的图表是如果我们只平方一个值并且不添加任何其他平方值会发生的情况。

为了得到带有dof=2的图表,我们可以只取成对的正态分布值,将它们平方并求和。如果我们这样做 1000 次,并将结果绘制成直方图,我们将得到非常类似于卡方图的东西,在右边上面有 2 个自由度。

我们的样本方差应该服从这种分布,这有直观意义吗?

是的—有两个原因:

  • 方差必须始终为正,卡方分布也必须始终为正
  • 我们的样本方差公式包括对正态分布值求平方并求和,这非常接近卡方分布的公式

所以不用深究太多,它似乎并不合适。

为什么我们指的是“修正的”样本方差?

在我们开始推导样本方差的分布之前,最后一件事是看看样本方差本身的定义——当我们有与样本均值的n平方偏差时,为什么要除以n-1而不是n?

这种校正被称为贝塞尔校正,是上述结果的数学含义——样本均值周围的偏差平方和总是小于真实总体均值周围的偏差平方和。我们可以通过计算校正后的样本方差的期望值来仔细检查除以n-1是否正确。如果你对此感到高兴(或者只是高兴地接受我的话,我们应该除以n-1),那么就直接跳过。

我们可以将未校正的样本方差的“期望值”(即除以n而不是n-1)如下所示:

作者图片

我们有:

  • 扩展了平方
  • 使用样本均值的定义来简化括号展开后最右边的两个术语
  • 使用期望的属性“内部”引入了期望运算符:

作者图片

现在我们只剩下两个需要计算的量,这两个量都可以通过重新排列下面的方差定义来计算:

作者图片

重新安排并放入我们的第一个上下文中:

作者图片

这是根据X分布的定义得出的。那么对于第二种情况:

作者图片

将这两个值代入我们的原始方程,我们得到:

作者图片

换句话说——如果我们除以n而不是n-1,样本方差的值将是总体方差的低估值。我们落后了多少?正如我们在倒数第二行中看到的,我们未达到样本均值的方差。因此,如果我们的样本均值略高于真实均值,我们将得出比实际值略小的偏差,反之亦然。

让我们用 python 来演示一下——使用样本均值而不是真实总体均值会导致低估。我们将执行以下操作:

  • 从标准正态分布(均值为零,方差为 1) 100x 中抽取 100 个观察值(即 100 个观察值中的 100 个样本)
  • 使用样本平均值计算每个样本的样本方差
  • 使用总体平均值(刚好为零)计算每个样本的样本方差
  • 比较我们所有 100 个样本的 2,并绘制它们

我们期望使用样本平均值计算出的数字比使用总体平均值计算出的数字稍小。

作者图片

因此,模拟支持直觉——真实总体均值周围的变化总是略高于样本均值周围的变化。为了纠正这一点,我们需要通过只除以n-1而不除以n来提高样本方差。如果我们真的知道真实的总体均值,那么我们可以用它来代替样本均值作为中心来计算我们的变异性。在这种情况下,我们最终会被n而不是n-1除。

开始推导

因此,给定一个来自随机变量Xn观测样本x_1, x_2, ..., x_n,我们知道如果X正态分布为:

作者图片

然后我们可以通过以下操作将X转换成一个标准的正态分布变量Z:

作者图片

或者用语言来说:

  • 减去平均值,使每个观察值都集中在 0 附近
  • 按标准偏差缩小离差,这样我们的方差为 1

通过卡方分布变量定义的陈述,我们可以得到Q为:

作者图片

所以我们知道Q是分布卡方与n dof。这里聪明的一点是尝试重新安排上面的公式,以便我们包括样本方差的项。在上面的公式中,我们将偏差集中在真实的总体均值上——然而,实际上我们不知道这是什么。我们只有样本均值来计算我们的偏差。让我们首先将它分解如下:

作者图片

我们有:

  • 将顶部分成两个表达式
  • 扩展了括号
  • 将不依赖于i的常数移至总和之外

请注意,最终项只是样本均值周围的偏差(未平方)之和,根据样本均值的定义,这将为零,因此最终项消失。我们现在剩下以下两个术语:

作者图片

第一项:在样本方差中代入

文字中的第一项是样本平均值周围的方差平方和除以总体方差(一个已知常数)。看看上面我们对样本方差的定义,我们可以把它代入得到:

作者图片

现在我们有一个表达式:

  • 我们知道Q是具有n自由度的卡方分布
  • 表达式中的第一项是我们要检查其分布的确切数量!!!

如果我们能找出右边第二项的分布,那么我们只需要推断我们感兴趣的部分的分布。

第二项:样本均值的分布

我们的第二项是归一化样本均方。鉴于我们知道:

作者图片

作者图片

那么我们有以下结果:

作者图片

如果我们平方一个标准的正态变量,那么我们得到一个自由度为 1 的卡方变量。对上述项求平方得到:

作者图片

这是上面等式中的第二项。代入我们所知道的关于上述等式的分布,我们得到:

作者图片

进行最后的跳跃

对我来说,以上已经足够好了,我相信——为了在分布上平衡上面的等式,那么我们所关心的(右边的第一项)应该具有带n-1 dof 的卡方分布。

然而,形式上还需要一点,为了完成证明,我们:

  • 需要证明样本方差和样本均值是独立的,这样上面等式右边的两项就彼此独立了
  • 一旦证明了这一点,我们就可以引用科克伦定理,它们是独立的卡方变量
  • 使用矩母函数(MGF)的唯一性来证明我们关心的变量具有带n-1自由度的卡方变量的 MGF,因此它必须如此分布

如果你想看看这个,那么我推荐这篇文章的最后一点,但对我来说,这已经足够好了,还有它提供的直觉。

最后一点直觉?

我遇到的关于我们为什么将自由度下移 1 的另一个论点是,当我们有变量Q时,我们进行的第一次分解——我们不知道真实的总体均值,所以我们将分数的顶部分开,以包括样本和总体均值:

作者图片

这是一个很好的方式来表明我们的样本方差只关注第一项(样本均值周围的离差)而不是第二项(样本均值周围的离差)。我们在数据中缺少的第二个变量(如果不知道总体均值,我们就无法知道)意味着我们需要使用n-1而不是n来缩小样本方差的分布。

摘要

希望你和我一样确信,这实际上并不像你刚得到公式和积分符号时的第一感觉那样神秘。这个想法很简洁——因为我们需要使用样本均值来锚定我们的离差度量,我们错过了样本中的一些方差——样本均值围绕真实总体均值的方差。因此,当评估我们的样本方差与一些假设的总体方差时,我们需要使用少 1 个自由度的卡方分布。

这个分布稍微紧密一些,以弥补我们的样本方差稍微低估了真实总体方差的事实。如果我们不这样做,我们将无法拒绝真实人口方差小于实际人口方差的假设。

P.S 失去一个自由度’这个想法的直觉呢?

我认为这是值得一提的——摘自这里。“自由度”这个术语对我来说一直有点不确定,大致翻译为“等式中的移动部分”。根据这一优点,我们可以认为它如下。当我们知道真实总体均值时,样本方差分布为χ^ 2,dof 为n。然而,当我们使用样本时,意味着我们“失去了一个自由度”。为什么?因为当我们使用样本均值时,我们会失去每个标准化观察值之间的独立性。换句话说:

作者图片

对于第一项,所有观测值(x_i减去均值)将是彼此独立的;但第二项不会。这是因为在第二个表达式中,这些观察值被用于计算样本均值。n=2的极端情况下,如果我们知道:

  • 第一个观察
  • 样本均值

那么第二次观察就不是随机的,因为它必须是相对于第一次观察的平衡行为——以便等于样本均值。因为我们“失去了 1 次观察的随机性”,所以我们只有n-1个自由度。在我看来,这不是一个真正有意义的论点,为什么我们最终会使用稍微紧密的采样分布,但这仍然很有趣。

为什么这种趋势时间序列是平稳的?

原文:https://towardsdatascience.com/why-is-this-trending-time-series-stationary-f3fb9447336f

从一个怪异的例子看扩展的 Dickey-Fuller (ADF) 测验

简·侯伯Unsplash 上拍照

平稳性是时间序列分析中最基本的概念之一。一般来说,平稳性将为用各种统计方法模拟时间序列提供极好的特性。扩展的 Dickey-Fuller (ADF) 检验可能是最广泛使用的检验平稳性的方法。

网上有很多关于这个话题的文章。我不会在基本的介绍上浪费你的时间,比如平稳性的定义,如何做 ADF 测试等等。在这篇文章中,我将分享我在一个应用程序中遇到奇怪的情况后探索 ADF 测试的旅程。

我将展示的学习路径是学习数据科学的典型路径。首先,我们认为我们理解了一个工具或概念,但我们只是承认并记住了这个术语。当我们将它应用于实际数据时,我们可能会发现意想不到的、具有挑战性的问题,这些问题促使我们进行更多的研究和进一步的理解。

同样,我会在 GitHub 上分享我的代码;最后请在参考文献部分找到链接。

意外旅程的开始

前几天我在处理一些时间序列。图 1 显示了其中的一个。没有双重的上升趋势存在,方差也随时间变化。有了这个清晰的可视化,我不需要测试稳定性。不知什么原因,我还是用 ADF 测试试了一下。令人惊讶的是,p 值几乎为 0,这意味着我应该拒绝零假设,并接受它是平稳的。

图一。有趋势的时间序列(图片由作者提供)

太奇怪了。测试结果似乎是错误的。我想调查 ADF 测试背后发生了什么。我尝试的第一步是用合成数据复制这个问题。我用下面的代码生成了一些测试数据。代码只是模仿了缓慢趋势的行为,而不是季节性。

图 1 中有 20,000 个观察值,这意味着趋势上升非常缓慢。我创建了一个斜率为 0.0005 的时间序列。经过 1000 次观察后,时间序列平均值从大约 0 上升到 0.5。然后让我们使用默认参数使用来自stats models . TSA . stat tools的 adfuller()函数对其进行测试。p 值为 0.01,再次出现“问题”。图 2 显示了结果。你可以忽略标题,把注意力放在上升趋势上。稍后我会解释为什么我们有来自三个不同 ADF 测试的 p 值。

图二。具有 ADF 测试结果的合成时间序列(图片由作者提供)

DF 测试背后的数学原理

我们必须深入了解 ADF 测试究竟在做什么。原来它的数学背景并不复杂。首先,ADF 测试只是 T2 的迪基-富勒测试的高级版本。DF 测试有三个主要版本(来自维基百科):

版本 1: 测试单位根:∆yᵢ = δyᵢ₋₁ + uᵢ

版本 2: 用常数检验单位根:∆yᵢ = a₀ + δyᵢ₋₁ + uᵢ

*第三版。**趋势不变且确定的单位根检验:∆yᵢ = a₀ + a₁t + δyᵢ₋₁ + uᵢ

在每个版本中,零假设是有一个单位根,δ=0。****

Statsmodels 包支持带参数“回归”的所有三个版本。****

对于版本 1,回归是‘n’(没有常数,没有趋势)。

对于版本 2,回归是‘c’(仅常数);这是默认设置。

对于版本 3,回归是“ct”(常数和趋势)。

我用三种不同的设置重新运行了测试,下面是新的结果。

对于版本 1,p 值为 0.09。我们不应该拒绝无效假设。

对于版本 2,p 值为 0.01。我们已经将它视为一个问题,因为这是默认设置。

对于版本 3,p 值为 0.00。这是意料之中的,因为时间序列确实是稳定的,具有确定的趋势

所以对于这个例子数据,如果我们用版本 1 (regression='n ')测试,我们不会说它是平稳的。我们可能不应该使用默认设置。但是你可能也想知道,为什么这个常数项会有这么大的不同呢?我们再多挖点。

从 DF 检验到线性回归

基于上述定义,DF 检验只是线性回归。图 3 显示了线性回归的所有点。y 轴是∆yᵢ,x 轴是 yᵢ₋₁,uᵢ是余数。版本 1 意味着我们必须拟合一条没有截距(没有常数)的线。版本 2 意味着我们必须用截距(常数)拟合一条线。

图 3。∆yᵢ和 yᵢ₋₁(图片由作者提供)

****Skitlearn linear regression通过参数 fit_intercept 很好地支持了这两个选项。图 4 下面是两条拟合的线。如你所见,有截距的线比没有截距的线更合适。R 平方得分也明确证实了这一点。另外,请注意橙色线的斜率小于蓝色线的斜率。换句话说,橙色线的斜率更接近于 0。

图 4。线性回归结果(图片由作者提供)

我们也可以通过可视化来思考:点不是以(0,0)为中心,所以拟合的回归线不应该经过(0,0)。截距应该大于 0。因为 0 是起始均值,∏y 应该大于 0,所以总体均值会增加。如果我们强制回归线通过(0,0),会对数据进行欠拟合,由于来自(0,0)的影响,斜率会变得更接近 0。

我们已经看到包括截距影响是否符合线性回归。为什么一条线的拟合方式会影响 ADF 测试结果,p 值从何而来?

从线性回归到 p 值

现在有点复杂了。DF 检验的最终 p 值不是来自线性回归的系数 p 值。基本上,统计数据有一个特定的分布,称为 Dickey-Fuller 表。然后,我们使用 MacKinnon 的近似 p 值进行检验统计。您可以在 Statsmodels 源代码中找到详细信息。

因为零假设是δ=0,意味着测试拟合线的斜率是 0。我们不需要详细讨论如何获得 p 值。p 值和斜率(线性回归中的δ,而不是趋势斜率)之间关联的逻辑链如下:

****一般来说,如果斜率远离 0,p 值应该更小,更有可能拒绝零假设,暗示无单位根且平稳。如果斜率为 0 或非常接近 0,p 值应该更高,更有可能接受零假设,并建议单位根和非平稳。对于第二种情况,维基百科说,“这些测试的统计能力很低,因为它们通常无法区分真正的单位根过程(δ = 0)和近似的单位根过程(δ接近于 0)”。这就是为什么我们首先会有这个问题。我们正在处理一个接近单位根的过程。版本 1 找到了一个单元根,而版本 2 找不到单元根。

为什么版本 1 适用于上面的例子?

版本 1 适用于图 2 中的数据,因为我们使斜率更接近 0,所以 p 值更高。

但是,我们不能使用版本 1 作为默认设置。版本 1 有两种情况(强制线通过(0,0)):

情况 1: (0,0)更接近所有数据点。如果直线必须经过(0,0),那么直线会更平坦,斜率会更接近 0。图 4 演示了这种情况。请注意,图 4 中的演示只适合一个变量 yᵢ₋₁,实际的 ADF 将适合更多的滞后变量。

情况二:(0,0)远离所有数据点。如果直线必须穿过(0,0),我们可能会拟合失败;本质上,斜率是 0,这意味着我们无法找到∆yᵢ和 yᵢ₋₁的线性关系,这样一条线将通过(0,0)并覆盖大多数数据点。因此,测试结果会偏向有根单元

下面的图 5 显示了版本 1 测试未能拒绝零假设(p 值为 0.6)的一个例子,数据是稳定的,平均值为 10。图 6 解释了原因。如你所见,我们找不到没有截距的直线(r 平方为 0),所以拟合直线的斜率为 0 (∆yᵢ不依赖于 yᵢ₋₁).

图 5。版本 1 无法识别静态时间序列(图片由作者提供)

图 6。线性回归找不到没有截距的直线(通过(0,0))(图片由作者提供)

从 DF 测试到 ADF 测试

现在我们了解了 DF 检验是线性回归,以及如何从线性回归中获得 p 值,让我们继续学习 ADF。ADF 的公式为:

再次,线性回归。“扩充”的部分是我们必须适应更多的系数。****

statsmodels 包允许显示 AFT 测试的详细摘要。图 7 是结果。

图 7。ADF 测试的详细摘要(图片由作者提供)

我们看到“OLS 回归”(线性回归的默认解决方案)和 17 个系数。我没有指定最大延迟,所以测试将尝试一个基于时间序列长度的数字,即 17。

常数(截距)也是合适的。该值为 0.0596。

让我们通过使用 Scikit-learn 中的线性回归来实现 ADF 测试。图 8 是代码和输出。

图 8。用 Scikit-learn 进行 ADF 测试(仅线性回归部分)

截距为 0.0596,其他系数与图 7 相同。Scikit-learn 中的线性回归只是简单的 OLS。我们正在做同样的事情,所以结果是一样的也就不足为奇了。

旅程的终点

在我弄清楚如何设置参数之后,我使用版本 1 (regression ='n ')测试了图 1 中的原始时间序列,得到的 p 值为 0.08,表明它不是平稳的。请注意,图 1 中的数据是零均值,所以你可以想象(0,0)更接近数据点(∆yᵢ,yᵢ₋₁).使用版本 1 测试将帮助我们。

因为图 1 中的趋势斜率是最小的,所以我们也可以用步长对时间序列进行重采样,这样会增加斜率。例如,如果我用四个步骤测试它(值[::4]),它将不能通过 ADF 测试的默认设置(回归的 p 值是 0.17 = ' c ')。

问题解决了。

外卖食品

不要盲目相信 ADF 结果。可视化是你的朋友。

ADF 检验是简单的线性回归,statsmodels 的实现使用 OLS 来解决回归问题。然后,它使用 Dickey–Fuller 表提取 p 值,验证拟合回归中第一个滞后变量的系数为 0 的零假设。

ADF 检验在检验近单位根过程(δ接近于 0)时有局限性。

我们需要相应地选择合适的 ADF 版本。例如,当你看到一个恒定的趋势,并想测试“趋势平稳”,你需要选择“ct”作为参数。如图 1 和图 2 所示,如果要捕捉均值为 0 的信号的缓慢趋势,可能需要选择“n”作为参数,以避免拟合截距的影响。Statsmodels 还支持带参数“ctt”的量化趋势。在某些情况下,这个高级选项可能是个不错的选择。如果你想进一步挖掘,请参考处理关于包括截距和确定性时间趋势项的不确定性。

希望你对 ADF 测试有所了解。

享受你的时间序列吧!

LinkedIn 上联系我。

PS:我对时间序列数据有经验和热情。如果你喜欢这篇文章,你可能会对我其他关于时间序列 帖子感兴趣。

参考文献

GitHub 上的笔记本文件

为什么 Julia 2.0 不会很快出现(为什么这是一件好事)

原文:https://towardsdatascience.com/why-julia-2-0-isnt-coming-anytime-soon-and-why-that-is-a-good-thing-641ae3d2a177

朱莉娅 2.0:你不应该屏住呼吸等待它

作者图片

如果你已经编程有一段时间了,很有可能你经历过生态系统的突破性变化,这些变化可能会让你留下不好的印象。我遇到的许多人都轻蔑地谈到 Python 生态系统从版本 2 开始所经历的转变。x 到 3.0。虽然大多数人可能同意从长远来看这是值得的,但这种转变仍然消耗了生态系统的大量资源。

但是朱莉娅呢?有一个 1。x 版给人的感觉是生态系统还是太不成熟?2.0 版本会引发大规模采用吗?会成为 Julia 成为顶级编程语言的催化剂吗?

在本文中,我们将探讨为什么 Julia 不可能很快发布 2.0 版本,以及为什么这对当前和未来的 Julia 开发者来说是一件好事。

编辑:我和我的合著者很高兴地告诉大家,我们的新书《茱莉亚速成班》已经开始预售了:

https://logankilpatrick.gumroad.com/l/juliacrashcourse

历史背景(0.6 版➡️0.7 版➡️1.0 版)

在 Julia 生态系统的早期,对 Julia 的很多批评都源于生态系统的易变性。这种语言的核心 API 将会改变,这使得开发人员不得不努力适应变化。这些频繁的变化阻碍了行业采纳者对该语言的信心,这就是为什么许多最初的用例是学术或爱好项目。

随着通往 1.0 和稳定性的道路越来越近,核心开发团队发布了 Julia 0.7,它是通往 Julia 1.0 的桥梁,并包含了许多关于 API 在新版本中将如何变化的警告。就个人而言,这段时间正是我开始使用 Julia 的时候。我对这种语言的第一次体验是在我为 NASA 工作的一个大型 Julia 项目中处理反对警告和更新语法。

下一个朱莉娅版本是什么?1️⃣.9️⃣

即将发布的次要 Julia 版本是 Julia 1.9。根据目前的发布时间表,这个版本可能会在 3-4 个月左右推出。你可以在 GitHub 上看到提议的改变:

https://github.com/JuliaLang/julia/blob/master/NEWS.md

我个人感到兴奋的一大变化是:

@kwdef现在被导出并添加到公共 API ([#46273])

这是一个来自社区的长期开放请求,以前您必须使用外部包来完成。添加的另一个新功能是:

新的pkgversion(m::Module)函数获取加载给定模块的包的版本,类似于pkgdir(m::Module)。([#45607])

这应该给用户更多的关于什么版本被加载到某些模块中的上下文,这是你过去必须繁琐地弄清楚的事情。

所有这些都是说,在每个新的 Julia minor 版本中仍然有许多令人惊讶的新功能、错误修复和改进。

朱莉娅 1.9 ⁉️之后的下一步是什么

嗯,朱莉娅 1.9 后是…..朱莉娅 1.10😄。不,真的!Julia 的核心开发者和联合创造者 Jeff Bezanson 在今年的 JuliaCon 上说:

“没有 2.0 计划。没有日期,也没有规格。确实没有这样的计划在进行中。如果有人想到了一些听起来不错但可能会被打破的想法,我们只需将其标记为 2.0 问题,并将其留到发生时再解决。”

如果您想了解 2.0 中正在考虑的问题类型,请查看:

https://github.com/JuliaLang/julia/milestone/23

正如你所看到的,细节是相当稀少的,因为大部分被提出的想法都可以在不破坏改变的情况下实现。

跳到 27:45 听 Jeff 谈论 2.0

另一位 Julia 联合创始人 Viral Shah 在 Slack 上向我指出,Julia 生态系统已经能够:

添加主要的语言特性,如多线程,而不需要修改主要版本号。像 GPU 处理这样的功能从主线语言设计和依赖性中分离出来,可以自行发展(同样没有 2.0)

这个设计决策允许生态系统快速发展,同时为核心 API 提供稳定性。

为什么 2.0 不会很快到来是件好事?🎊

作者图片

Julia 的稳定性是用户和开发人员多年来越来越喜欢的东西(特别是对于那些经历了早期 Julia 时代不断变化的人)。从设计的角度来看,它真实地说明了所做的高质量决策,即我们一直到现在(自 1.0 发布以来的 4 年)都没有做出突破性的改变。

杰夫进一步说:

“B 但是就我个人而言,在我想看到的事情中,我认为没有一件真的需要重大改变。我认为我们应该做的任何事情都可以在 1。x 非破方式。所以我认为现在不需要 2.0。”

随着 Julia 核心团队的需求和观点的改变,这显然会随着时间而改变,但是今天的开发人员可以高枕无忧,因为他们知道如果他们投入时间、金钱和智力资本来用 Julia 构建系统,API 将在未来几年保持稳定。

虽然我个人认为 2.0 版本会给这种语言带来很大的可见性,但在生态系统继续呈指数增长的同时,尽可能保持稳定可能更好。一个小小的反驳点是,如果有 2.0 版本,早做比晚做可能更好,因为我们等待的时间越长,就有越多的 Julia 代码需要更新才能工作。希望,如果有一天到来,基诺·菲舍尔可以重启自动为你更新废弃语法的茱莉亚·菲莫克莱尔

你对朱莉娅 2.0 有什么看法?在下面留言告诉我吧!

为什么 Julia 的生态系统比大多数其他编程语言更加一致

原文:https://towardsdatascience.com/why-julias-ecosystem-is-more-consistent-than-most-other-programming-languages-fa1fd0273bde

朱莉娅的一致性概述,以及为什么这是一件好事

(图片由 Pixabay 上的 xresch 拍摄)

介绍

生态系统是任何编程语言的一个非常重要的方面。这可以从语言变得流行的过程中看出来,因为通常程序员不想使用一种还没有他们需要的可用工具的语言。每一种高级编程语言都需要一种生态系统,这种生态系统足以促进特定编程语言的目标和希望。虽然 Julia 是一种相对较新的语言,而且与许多其他语言相比,它的生态系统可以说是很小的,但这个生态系统近年来随着语言本身的发展已经成长了很多。

然而,这些生态系统的另一个经常被低估的特性是一致性。这既体现在实际语法的一致性上,也体现在文档和格式上。方法调用需要以某种方式构造,以某种方式命名,就像构造函数和事物也需要以某种方式构造一样。然而,在 Julia 中,事情更进了一步,方法的实际一致性被带到了整个包的生态系统中。今天我想花一些时间来欣赏 Julia 的这一部分,解释它背后的方法论,以及演示如何制作一个也符合生态系统的包。本文中不会有太多代码,但是如果您想亲自查看或尝试本文中使用的代码,这里有一个链接,指向我在 Github 上用来演示这些内容的笔记本:

https://github.com/emmettgb/Emmetts-DS-NoteBooks/blob/master/Julia/julias consistent ecosystem via method extension.ipynb

朱莉娅生态系统的一致性

与许多其他编程语言相比,Julia 的包似乎更加一致。通常,一个有经验的 Julia 程序员实际上可以猜出他们想要使用的方法调用,而不管它实际上是什么类型的。之所以会这样,与 Julia 的核心范式和方法论有关,

多重派遣。

你真的不能谈论太多关于 Julia 语言而不谈论多重分派。因此,我写了很多关于多重分派的文章。如果您想了解更多关于多重分派的知识,以及为什么我认为 Julia 是第一种真正完美地使用泛型编程概念作为范例的语言,我有一篇关于这个概念的文章,您可以在这里阅读:

在整个 Julia 的生态系统中,例如当使用 DataFrames.jl 包时,您会发现在整个生态系统中都可以找到为 Base 中的核心数据结构和类型创建的相同的 Julia 基本函数。这意味着,在许多情况下,我们可以猜测我们希望对我们的值调用什么方法。需要删除数组中超过特定限制的值?使用过滤器!()方法。需要删除数据帧中超过特定限制的值?使用过滤器!()方法。当事物被设计成具有这样的一致性时,并且假定除了这些类型之外的参数通常是相同的,Julia 很快就开始感觉比当今存在的许多其他语言更加流畅。使用软件包不再需要你学习整个 API 和做大量的研究,现在这一切都很容易,可以浓缩成一点点的学习,然后将常规的 Julian 方法应用于一切。

这实际上是如何做到的?

既然我们了解了 Julia 的生态系统是如何更加一致的,我们需要真正了解这是为什么。这一切的基础来自于 Julia 的延展性。在 Julia 中,所有的方法定义都是可扩展的,这是因为方法定义在语义上不同于函数定义。函数只是一个定义的名称,例如下面的函数 myfunction():

function myfunction(x::Int64)end

这个函数是 myfunction,但是方法是 myfunction(x::Int64)。也就是说,我们可以使用 import 关键字直接导入一个函数。一旦我们以这种方式导入了一个函数,我们就可以通过为该定义编写新方法来扩展它的功能。不过,在我们真正开始做之前,我们可能想创建一个类型来分派我们的新方法。我们将扩展过滤器!()函数,完全是因为我之前讲过。在这方面,我们要做的第一件事是直接导入函数。

import Base: filter!

现在我们将创建我们想要过滤的类型。为了简单起见,我将创建一个包含两个不同数组的类型,这是非常基本和容易理解的。

mutable struct TwoArrays
    first::AbstractArray
    second::AbstractArrayend

我也不需要创建任何类型的内部构造函数,因为这是一个非常适合我要用过滤器演示的内容的构造函数!()函数。如您所料,这个函数已经有了一个方法定义,可以在数组上调用。记住,实际上我们的目标是过滤这个结构中的两个数组。如果我们尝试调用过滤器!()在这种类型上,我们会得到一个方法错误。我们实际上可以用一行代码实现整个目标:

filter!(f::Function, ta::TwoArrays) = begin filter!(f, ta.first); filter!(f, ta.second) end

因为我们不期望从变异函数过滤器返回!(),我们不需要预期任何回报,这使得这完全是在公园散步。为了中等可读性,这里也是同一函数的多行版本。

function filter!(f::Function, ta::TwoArrays)
    filter!(f, ta.first)
    filter!(f, ta.second)
end

现在我们要做的就是尝试我们的功能!

tas = TwoArrays([5, 6, 7, 8], [5, 6, 7, 8])
filter!(x -> x > 6, tas)

对于那些对使用匿名函数作为参数感到困惑的人,这里有一个到另一篇文章的链接,在这篇文章中,我详细介绍了匿名函数是什么:

这段代码运行良好,两个数组中的所有值都大于 6!

println(tas.first)
println(tas.second)[7, 8]
[7, 8]

结论

Julia 是一门非常棒的语言。更好的是,围绕这种语言使用了多种多样的调度方式。已经想到的一些东西,比如构造函数和这种轻松扩展方法的能力,绝对是其他实现无法比拟的。Julia 以一种非常酷的方式处理很多事情,这是我非常喜欢这门语言的一点。很容易理解为什么在编程语言的整个范围内使用相同的基方法是非常有价值的。它使软件包更容易使用,在某些情况下,你可以大胆猜测如何做某事,你实际上是正确的!感谢您阅读这篇文章,我希望这在扩展 Julia 的前沿既有启发性又有信息性!

数据科学的领导者应该感到不安

原文:https://towardsdatascience.com/why-leadership-is-uncomfortable-de7699bd738c

利用不适实现数据科学领域的有效领导

领导一个团队不是我们很多人的梦想吗?这是职业道路上的自然进程,每个人都有成长的雄心,在自己的公司、客户和整个分析界留下自己的印记。更重要的是,至少对我来说,数据科学文化意味着许多最有激情的个人也希望传递他们的知识和专业技能。

但是,领头的是。没有什么能让你为领导一个分析团队做好充分的准备。当然,你可以参加一些课程,其中一些课程有其价值,但没有什么能让你完全达到目的。你需要运用的经验和技能太抽象了,理论上学不到。它们只有在实践中才能真正理解。

最重要的是,在数据科学中,我们经常让我们的项目管理和领导风格进入舒适的领域。我们每天都要处理如此多的抽象、前沿的技术,以至于我们几乎没有精力去处理领导的混乱。我们在技术方面如此努力,以至于我们试图在非技术方面做自然的事情。这并不是很好,因为我们作为数据科学领导者面临的问题是混乱的、未知的领域。正是因为我们在一个尖端领域。

因此,在我们组织的其他部门行之有效的管理理念似乎并不适合我们的数据科学团队。我们的情况感觉太独特了,这些哲学似乎都没有处理我们问题背后的细微差别。

丹尼尔·延森Unsplash 上拍照

对我来说,我做了大量的实验来寻找有效的方法。重要的是,我也明白了适合我的并不适合所有人。它太依赖于更广泛的组织文化、被领导团队的个性以及领导者的个性。

所以,我不会声称这篇奇异的文章会让你成为一个成功的领导者。但我希望它能给你找到个人道路的工具。对我来说,这条路一直由一个重要的灯柱指引:“我将要迈出的这一步有多不舒服?”

Artem LabunskyUnsplash 上拍照

越是舒服的一步,越需要正当的理由。作为未知领域的领导者,我们倾向于回到我们知道的事情上。符合我们的个性、举止和优势的事情。我们经常忘记或忽略那些令人不舒服但却能带来更好结果的选择。

在数据科学中,有两个大的主题可以帮助我们,因为我们袖手旁观的不适灯柱。第一个是仆人式领导,即把我们团队的成功看得比我们自己的成功更重要。第二是持续学习,在我们的职业生涯中,每天都致力于挑战自我,不断成长。他们会给你正确的心态,然后找到你需要的工具。

那到底是什么意思?

仆人领导

说实话,别人叫我做仆人领导,我都受不了。这个词听起来很善良,但却很模糊,对任何人来说几乎意味着任何事情。正因为如此,每个人似乎都从中获取了一些不同的东西。

一方面,你让人们带走了他们需要的东西,让他们的团队的工作生活尽可能舒适。另一方面,你让人们带走了他们可以以任何他们喜欢的方式对待他们的团队,只要它导致成功地交付项目。服务型领导是每个人都认同的完美咨询理念之一,因为它对每个人来说意味着完全不同的东西。

但它确实有它的价值,这也是我们经常听到它的原因。我们只需要小心,不要只拿走让我们舒服的部分,而忽略了不舒服的部分。从本质上讲,服务型领导主张首先帮助团队,其次是领导。实用的建议是:“把团队的幸福和成功放在你自己的前面。”

照片由奥斯丁·迪斯特尔Unsplash 上拍摄

优先考虑团队听起来显而易见,但实际上它相当强大,令人深感不安。你必须做和说让你不舒服的事情,无论是正面的还是负面的。你必须愿意牺牲自己的舒适,以支持你的团队在学习、项目和更广泛的职业生涯中取得成功。

对于数据科学领导者,也就是你,当你觉得下一步是一个你已经熟悉的模型时,挑战自己“我将这个模型推给我的团队是因为我已经熟悉它,而我现在不想学习新的东西吗?”

同样,当你觉得下一步是使用你的团队成员正在向你推销的令人兴奋的新模式时,你自己会说“这是因为我不喜欢进行艰难的对话来推动我的团队朝着不同的方向前进吗?”

做一个仆人型领导意味着选择优先考虑团队而不是领导。不幸的是,这样做的自然结果是,领导者经常会被挤出他们的舒适区。所以,当下一步感觉舒适时,我们需要暂停。推动我们自己去证明为什么这个选择对团队更好。如果没有这种保护,我们往往会朝着对我们作为领导者来说自然更容易的方向前进,而不是朝着对我们团队最有利的方向前进。

根据我的经验,我发现了六个主要的工具,我可以在仆人式领导中加以利用。这些并不是详尽的,它们的应用将具体到你的情况,所以把它们作为一个起点,添加到对你有意义的地方。

作为一名领导者,你通常比你的团队成员拥有更多的背景和经验。这并不是说你比你的团队拥有更多的技术专长,但是你通常会有互补的组织或上下文知识,可以帮助团队最好地利用他们的技术知识。花时间分享你所拥有的背景知识,并帮助团队理解它。告诉团队不同的模型在什么情况下工作,这些模型在你的组织中是如何被理解的,以及在开发过程中需要注意的危险信号。

反思——花时间回想你团队中的事件。是什么导致了成功?是什么导致了失败?我们是否为我们的模型和分析设定了适当的期望值?如果没有一个花时间反思的领导者,数据科学团队很容易陷入困境,交付与更广泛的组织目标不一致的模型。

辩论 —数据科学团队需要鼓励辩论。该团队试图利用数据来理解世界,正如任何形式的科学一样,将会有相互竞争的假设。如果我们不鼓励争论,而支持舒适,那么我们的解决方案和他们给出的答案将会受制于那些在特定项目中工作的人的个人偏见。我们需要利用团队中的多样性(各种形式)来最小化这些个人偏见的影响。

流程 —流程对数据科学团队至关重要。领导者将不得不处理模糊性,但对于更广泛的团队,我们需要确保有步骤可循,以支持整个团队的一致性以及团队总体目标的一致性。这并不是说团队不能有创造性的自由,只是创造性的自由在哪里可以被很好地定义。例如,你的建模过程是用 R 语言还是 Python 语言?你不能让一半的团队成员使用一种语言,而另一半使用另一种语言,而不牺牲交叉共享的机会。

反馈 —反馈是领导者使用的最主要也是最明显的工具之一,因此,有很多研究和文章来学习如何提供有效的反馈。简而言之,根据我的经验,积极和消极之间的平衡最常被打破。为了保持团队成员的士气,天平必须向积极方面严重倾斜。需要几个积极的反馈来平衡一个消极的反馈。如果你找不到平衡,那么你需要考虑这个团队成员是否应该继续留在你的团队。如果你想让他们留下来,那么你必须想出如何向他们表达积极的一面,否则你会期望他们离开。

做一个仆人领导,优先考虑你的团队。但是总是回头看看你不舒服的灯柱来寻求指导。当事情感觉很自然的时候,强迫自己去证明它是正当的。

持续学习

第二个基本理念是持续学习。你必须不断寻找让你不舒服的新思想、新领导方法。正是因为它们让你感到不舒服,你才需要刻意去寻找它们。

加里·巴特菲尔德在 Unsplash 上拍摄的照片

我们许多人生活在回音室里。我们的组织是一体的。当然,我们阅读的文章,我们互动的社交媒体,我们观看的电视节目都可能是回音室。他们只是向我们复述我们已经熟悉的想法。你有多少次读完一本书后说“这本书太棒了,我真的很喜欢”,但仔细想想,你并没有从那本书里获得任何新的东西,它只是强化了你已经培养的一些信念。

很有挑战性。我们都不想不断地阅读与我们现有信念不一致的东西。但那是我们学习的地方——在思想的交汇处。如此多的科学进步来自文化的融合是有原因的。随着不同的文化而来的是相互冲突的观点,这些观点会引发争论并导致新的发现。

因此,当我阅读一些关于如何成为一名有效的领导者的材料时,我会找出我预计会不同意的作者和观点。我故意走出我的回音室。这意味着我需要保持开放的心态来寻找我觉得可以合作的想法,同时花时间来故意拒绝我仍然不同意的想法。

具体来说,我问自己“我不同意哪一部分?为什么?他们如何证明自己的观点?”同样,“我拒绝这个想法仅仅是因为它让我不舒服吗?因为这不符合我之前的性格?”

这是一个不舒服的过程。我们都不喜欢或不想犯错,这个过程的大部分时间都花在怀疑自己上。但是,这是非常值得的,因为总是有东西要学,即使这就是为什么这种观点没有意义。

我可能会从一篇告诉我自己一切都是对的文章中获得很多乐趣,但我会从一篇告诉我自己是错的文章中获得更多知识。

从很多方面来说,成为一名有效的领导者意味着大部分时间都不自在。这意味着以你觉得不自然的方式支持你的团队,这让你很苦恼,因为这不是你的本能选择。这也意味着学习那些让你不舒服的想法,花时间去发现其中的真相,帮助你更有效地管理你的团队。

然而,正是在这种不适中,你才能最好地服务于你的团队并继续学习。这种不适,如果利用得当,将成为指引你走向成功领导之路的一盏明灯。它不会回答你的问题,但是它会把你推向对你的团队、你的组织和你的具体情况最有益的工具的方向。在他们的日常生活和更广阔的职业生涯中,领导的位置会给你的团队带来成功。

取得联系

请在 LinkedIn 上联系我,了解更多关于数据科学领域的观点!

为什么 MLOps 工具应该是开源的

原文:https://towardsdatascience.com/why-mlops-tools-should-be-open-source-5ad696463f54

意见

照片由energepic.com派克斯拍摄

大多数公司使用 MLOps 工具来自动化管道,监控和管理不同的机器学习项目,以解决他们的业务问题。MLOps 工具支持在机器学习项目中系统地工作。

在本文中,您将了解到:

  1. 什么是 MLOps?
  2. 为什么需要 MLOps?
  3. 为什么 MLOps 要开源?
  4. 开源 MLOps 工具示例

我们开始吧!🚀

什么是 MLOps?

MLOps 来自两个术语“机器学习”和“操作”,指的是旨在自动化机器学习项目生命周期的程序集合。MLOps 为数据科学团队和 IT 专业团队提供了一个指导,让他们能够共同协作,创建最有效的机器学习解决方案来解决特定问题。

MLOps 与 DevOps 类似,但执行方式不同。由于机器学习本质上更具实验性,只要数据随着时间的推移不断变化,MLOps 就会考虑其他实践,如数据验证、功能再造、模型分析和评估。目标是为机器学习项目中的所有重要步骤创建一个连续的管道。

MLOps 的关键阶段是:

  • 数据采集
  • 数据分析
  • 数据转换/准备
  • 模型培训和开发
  • 模型验证
  • 模型服务
  • 模型监控
  • 模型再训练

MLOps 工具可以帮助您在机器学习生命周期的所有重要步骤中,使端到端的机器学习项目变得灵活、可管理和可重复。

为什么需要 MLOps?

在机器学习项目中工作会带来很多挑战,尤其是当你必须处理一些基本问题时,比如:

  • 收集和清理大量数据
  • 分析和可视化您的数据以收集见解
  • 在训练您的机器学习模型时,跟踪不同的实验配置和结果
  • 将您的模型部署到生产中
  • 监控您的机器学习模型性能

有了 MLOps,您将能够操作所有必要的步骤,在高效的工作流程中创建您的 ML 解决方案。它还将帮助您节省时间并降低运营成本。项目负责人、数据科学家和您团队中的其他专业人员将更加敏捷,并有策略来轻松做出决策以实现他们的目标。

MLOps 为寻求将机器学习模型集成到他们的应用程序中的团队提供了很多好处。它将简化您的部署过程,帮助您改进操作和维护活动,并且它还将使您的模型能够在需要时进行扩展。

建议在这些情况下,公司应考虑使用 MLOps 工具来实现其业务目标。

  • 扩展现有的机器学习模型
  • 计划建立复杂的机器学习模型
  • 有多个团队的机器学习项目,如数据科学团队和 IT 团队。

为什么 MLOps 要开源?

开源 MLOps 工具让您有机会自由灵活地使用、阅读和修改源代码,而无需花费大量金钱。

以下是 MLOps 应该开源的一些强有力的理由。

1.成本效益

来自 Pexels 的 Artem Beliaikin 的照片

与开源工具相比,大多数专有 MLOps 平台的成本更高。专有 MLOps 不断要求现有客户为升级或新功能付费,以便在他们的平台上使用。

有时你可以支付订阅计划,但你不会使用该计划中的所有功能,这是浪费金钱。使用开源 MLOps 工具,您可以选择最适合您需求的工具,并可以自由修改它们以支持您的特定需求。

2.所有权

来自像素罗德尼制作的照片

开源 MLOps 工具让您有机会完全掌控和管理它。您可以在自己的基础设施中安装并运行开源的 MLOps 工具,以运行您的机器学习项目。

大多数专有的 MLOps 工具是由公司拥有的,这些公司不允许您作为客户完全控制他们的工具来运行您的项目。有时,您需要请求许可或发送请求,以便在他们的平台上执行特定任务。显然,这可能比预期的要花更多的时间。

3.没有隐私问题

照片由斯科特·韦伯Pexels 拍摄

他们说数据是新的石油,因此你不希望每个人都可以访问你的资产。根据 findstack.com 的数据,不同行业的公司每天产生大约 186.265 千兆字节的数据。到 2023 年,生成的数据将价值约 770 亿美元。

数据通常是高度敏感的。使用专有的 MLOps 可能会导致数据隐私问题,因为您无法完全控制平台。开源 MLOps 工具可以通过以下方式帮助您避免任何类型的隐私问题:

  • 更好地控制您的数据。
  • 调整您的 MLOps 工具以符合您的数据隐私政策。
  • 全面审核您的 MLOps 工具,以检查数据操作并进行必要的更改。

4.围绕这个工具建立一个社区

照片由马修·贝尔泰利Pexels 拍摄

开源 MLOps 工具是围绕其用户社区构建和维护的。社区中的任何人都可以为平台贡献新想法或新功能。你也可以帮助其他人解决平台上的问题。

工具的代码总是可用的,这给了社区成员一个创新和有效协作的机会。例如,MLflow GitHub 存储库目前有 155 个 pull 请求在工具中提出新的变更。这些拉取请求要么添加新功能,要么解决 bug。

与开源 mlop 相比,专有 mlop 无法提供相同的优势。解决 bug 或获得专有 MLOps 工具的帮助可能需要更多时间,因为他们有一组特殊的人员来响应您的请求。

开源 MLOps 工具示例

有很多开源的 MLOps 工具,你可以开始运行和管理你的机器学习项目。大多数工具提供不同的服务,所以你必须根据你的需求选择一个。这里有一些推荐的流行的开源 MLOps 工具。

1。元流

这是一个 python 友好的基于代码的 MLOps 系统,但它也支持 R 语言。你可以在大型团队的各种机器学习项目中使用这个 MLOps 工具。它提供集成到 AWS 中的不同机器学习服务。

Metaflow 自 2019 年 12 月以来一直是开源的,最初是在网飞开发的,旨在帮助数据科学家和机器学习工程师建立和管理现实生活中的数据科学项目

开源软件配备了内置特性,可以:

  • 管理外部依赖关系
  • 管理计算资源
  • 重放和恢复工作流运行
  • 在本地和远程执行模式之间来回切换。
  • 执行集装箱化运行

Metaflow 以 Python 包的形式提供给 macOS 和 Linux 用户。你可以通过访问他们的 GitHub 库下载,或者从 PyPI 获得最新版本:

pip 安装元流

2。MLflow

这是另一个开源的 MLOps 工具,可以帮助你管理机器学习项目的生命周期。MLflow 目前提供四个组件:

(a)物流跟踪

该组件帮助您在运行机器学习实验时使用 API 或 UI 来记录参数、指标、代码版本和输出文件,并最终可视化结果。可以使用 Python API、R API 和 Java API 来记录和查询实验。

(b)物流项目

该组件帮助您以可重用和可复制的形式打包您的机器学习代码,以便您可以将其部署到生产中或与其他数据科学家共享

(c) MLflow 模型

该组件帮助您管理通过使用各种 ML 库开发的机器学习模型,并将它们部署到不同的模型服务和推理平台。

(d)示范登记册

您可以使用该组件通过在中央存储库中注释、存储和管理模型来协作管理 MLflow 模型的整个生命周期。

注意:它还集成了几个流行的 MLOps 解决方案,如 Amazon SageMaker、Google Cloud、Docker、H20.ai、Kubernetes 和 Databricks。

3。DVC,或数据版本控制

这是数据科学和机器学习项目的开源版本控制系统。它可以对项目中的数据集、机器学习模型和其他文件进行版本控制。

它还通过代码将它们连接起来,并使用亚马逊 S3、微软 Azure Blob 存储、阿里云 OSS、SSH/SFTP、谷歌驱动、谷歌云存储、HDFS、HTTP、网络连接存储或光盘来存储文件内容。

作为一个敏捷的 MLOps 工具,DVC 可以帮助数据科学团队协作和开发可共享和可复制的机器学习项目。数据版本控制系统模仿任何标准的 Git 储存库、服务器或提供者,你可以很容易地在你的机器学习项目中实现 DVC。

最后的想法

与专有的 MLOps 工具相比,开源 MLOps 工具具有很多潜力和优势。这就是为什么越来越多的机器学习项目采用开源的 MLOps。

如果您的团队没有太多的工程专业知识来创建和管理运行您的机器学习项目的基础架构,则仅建议使用专有的 MLOps 工具。

在本文中,您已经了解了什么是 MLOps,为什么您的机器学习项目需要 MLOps,为什么 MLOps 应该是开源的,以及现有 MLOps 工具的示例..

如果你学到了新的东西或者喜欢阅读这篇文章,请考虑分享给其他人阅读。

为什么神经网络对计算机视觉很有帮助

原文:https://towardsdatascience.com/why-neural-networks-can-solve-simple-tasks-d268a770dbce

换句话说,简单的问题

照片由法赫米·法克鲁丁Unsplash 上拍摄

R 最近,我在上发帖说什么时候不用神经网络。这一次,我想反过来谈谈为什么这些奇特的网络在解决视觉和语言问题上如此有效会很好。所以在某种意义上,这是一篇关于机器学习模型的灵活性方面的文章,以及为什么神经网络是灵活性之王。

在之前的帖子中,我提出了以下经验法则:在 AI 内部,我们使用简单的模型来解决挑战性的任务,使用复杂的模型来解决简单的任务。在这种情况下,复杂是指我们需要推理的问题,而简单是指我们凭直觉解决的问题。例如,你需要做一些思考来将 48976 乘以 15948,但是你可以很容易地识别照片中的人脸。在计算上,乘法是微不足道的,而识别人脸是非常复杂的。

当谈到机器学习算法时,许多技术可以解决复杂的人类问题。不过,确实只有一种方法能够可靠地解决简单的人类任务:神经网络 s。这一切都归结于它天生的灵活性,可以将特征组合成更有意义的表示。为了理解这一点,我们需要了解一下算法如何看待

模特看到了什么

在说计算机视觉之前,我们先通过咖啡品鉴稍微绕道一下。不要太书呆子气,当谈到好咖啡与坏咖啡时,有几个特征很重要。这里有一个关于购买/寻找好咖啡的精彩视频。以下是我的简单总结:

  • 豆子收获后的天数
  • 烘烤后的天数
  • 使用的烘焙强度
  • 它有多少“身体”
  • 酸性有多强
  • 它有发酵的味道吗?

由于我们是数据科学家,我们可以将此建模为一个简单的分类问题:我们有一些整数特征(自收获/烘焙以来的天数)、一些类别(烘焙强度、酒体和酸度)和一个布尔值(发酵/未发酵)。然后,我们可以买一些咖啡包,交给一些专家,记录他们对每个包的反馈。换句话说,他们有多喜欢/不喜欢每个样本。

准备好我们的数据集后,我们可以尝试一些机器学习模型来预测给定的咖啡包是好是坏。在这个背景下,我强调了每个模型如何看待解决这个问题的任务。

免责声明:虽然我基于 Hoffmann 的视频给出了上述特征,但下面的大多数例子都是虚构的。欢迎在评论区分享你的咖啡喜好,尽管☕️.

线性模型:

一个线性分类器本质上学习了一个"y =ax+b函数。这里, y 表示标签, x 表示特征, A 表示特征权重, b 表示特征偏差。请注意, Ab 是向量,为我们的六个特征中的每一个保持一个值。学习过程因此学习适当的 Ab 值,当咖啡好的时候产生正的 y ,否则产生负的。

直觉上, b 代表了我们对每个特性本身的重视程度,不考虑咖啡本身( x )。这就是这个术语被称为“偏见”的原因同时, A 衡量我们对咖啡特性的重视程度。因此,举例来说, b 代表我们总体上对酸度的喜爱程度,而 A 则模拟了每种酸度如何改变我们的基本估值。

注意,线性模型不执行特征间推理。换句话说,它所做的只是总结出它对每个特性的看法。因此,举例来说,考虑到咖啡豆的年龄,它不能评估烘焙强度如何与咖啡的酸度相互作用,或者我们对每种元素的感知如何变化。换句话说,他们看到的只是一堆数值。**

决策树(DTs)

在每个节点上,DTs 将寻找最具分割性的特征。例如,过去三个月烘烤的许多包装被认为是合适的,而大多数不新鲜的被认为是坏的。然后,它将寻找下一个最佳特征来按顺序分割每个子集。例如,对于最近烘烤的包装,咖啡主体导致了最大的意见分歧。相比之下,对于不新鲜的咖啡,发酵的味道非常能说明咖啡的质量。

同样, DTs 不能直接混合特征。然而,他们可以通过他们的层级性质利用一些相互依赖。在这个例子中,这棵树可以察觉到发酵的味道对陈咖啡比对新烘焙的咖啡更重要。尽管如此,所有决策一次只考虑一个特性。

神经网络

神经网络层是激活函数σ内的线性模型。数学上,我们得到“y =σ(ax+b)”对于一个三层网络,我们得到下面的组成:"y = l₃(l₂(l₁(x)),"或者,扩展层项,我们得到完整的表达式"y = σ(a₃⋅σ(a₂⋅σ(a₁⋅x+b₁)+b₂)+b₃)"传统上,L₃ 被称为输出层,而L₁和 L₂被称为隐藏层(因为被“隐藏”在输入和输出之间)

关键在于认识到每一层都将一组特征作为输入,并产生另一组特征。换句话说,它结合了各种特征,创造了一种新的问题表现形式。然后,第二层获取组合的特征,并输出已经混合的特征的组合。最后,第三层也是最后一层从接收到的特征混合中产生最终输出。

虽然线性模型对特征关系是盲目的,决策树只能间接实现它们,但神经网络不断混合特征,以创建更精细的表示。在文献内部,“隐藏”的层次产生“隐藏”的特征。然而,我发现将“隐藏”一词解释为神经网络就像侦探一样不断发现数据中隐藏的模式更有启发性。

这种对特征的不断细化使得神经网络成为模型灵活性之王。也是从深度学习中的深度一词而来。神经网络不是在“浅层表示”上操作,而是创建理解层,揭示数据的深层结构。

意义就在里面

之前,我们考虑了一个简单的监督学习设置。现在,查看以下数据:

图片由作者提供。

我问你,全能的人类,这个形象的内容是什么?

很难发现,嗯?

是的,我对待你就像线性模型对待它的数据一样:没有上下文,宝贝

看,视觉数据的问题是像素几乎没有价值。换句话说,1920x1080 的全高清图像只不过是两百万多一点的无意义特征。因此,上面的条带只是一个常规的图像降采样和展平。这具有剥夺图像像素的所有先前空间关系的效果。
下面是另一个例子:

图片由作者提供。

在这个版本中,我只是随机像素。如上所述,不能从图像中得出任何意义。这说明了图像的含义是如何在像素关系中编码的。从数学上来说,这张图像的像素与原始图像完全相同,但却完全无法辨认。
为了您的观赏乐趣,以下是原文:

布里吉特·托姆在 Unsplash 上拍摄的照片。由作者调整大小和裁剪

整篇文章最关键的一段来了:

神经网络擅长处理复杂的输入,如图像、音频和文本,因为它们天生具有将较小的特征组合成复杂抽象的能力。一遍又一遍,无意义的像素被组合成图案和图案的图案。

相反,由于更简单的模型在提取多特征模式的能力方面受到限制,它们不能处理高维问题。简而言之,包含大量无意义特征的场景。

作为一个元示例,这篇文章中没有一个单词或句子可以捕捉到它的全部含义。相反,整个信息被一点一点地编码在每个单词、每个句子中。说到音频,一秒钟的音乐是用 44.1k 的微小样本来表示的。我们需要将这个数字调整到更易于管理的程度,比如任何有意义操作的音符或音素序列。

回到咖啡

在我们的咖啡例子中,所有特征都是完全有意义的:烘焙日期、酸度、酒体等。这些特征之所以存在,是因为我们人类直接或间接地从嘴里感知到了它们。更简单的模型适用于这类问题,因为寻找有用特征的所有工作都已经完成了。在这里使用神经网络几乎总是没有任何好处。

现在,考虑一台真正对咖啡取样的机器,识别通过其传感器的微量化学物质。它能产生的特征数量是巨大的。这一次,更简单的模型不再适合这项任务。相反,神经网络模型可以解析数据丛林,并得出对分类非常有用的有限特征集。

神经网络将提出的大多数特征可能与我们人类可能注意到的东西非常相似。例如,它可能学会评估样品中酸性分子的低/高频率。同样,缺少更多的芳香成分可能意味着不新鲜的豆子或更老的烘焙。

这个实验也可能适得其反。在上一篇文章的中,我强调了灵活的模型如何经常学习伪模式,这些伪模式在本地解决了一个数据集,但没有推广到外部数据。例如,我们可能在对所有老烘焙咖啡进行采样的那天没有正确清洁机器,因此,算法学会了将灰尘检测为劣质咖啡的标志。

神经网络出现之前的日子

最后,在神经网络在 2010 年代非常流行之前,我们有其他技术来解决这些复杂的任务。例如,有很多令人兴奋的人脸识别方法。特别是,许多作者衍生了几种模式匹配算法来寻找面部标志,如眼睛、鼻子和嘴巴。

作者使用许多信号处理技术进行音频处理,如快速傅立叶变换(FTT),将高维信号转换为频带甚至音符和音素。同样,文本数据可以转换成更经济的表示,比如单词包,以及最近的单词向量(文本嵌入)。

尽管如此,**所有这些技术都有一个共同的主题:有人提出了有价值的特征,将高维问题简化为更有价值的表示。这种方法如此普遍,以至于有了一个名字:特征工程,这是人类天真无邪的壮举。**

神经网络,尤其是卷积网络,带来了一个戏剧性的转变:特征学习神经网络将单调乏味的特征进化为更恰当的表达方式的过程自动化。此外,网络可以重复创建多层次的表示,这对于我们人类来说很有挑战性。最后,他们不需要昂贵的专家来解决新的任务。

回到这篇文章的开头,我说过“只有一种方法能够可靠地解决简单的人类任务:神经网络* s。”这里的关键词是可靠地。例如,支持向量机解决了一些奇特的问题,如内核 PCA光谱聚类,然而,你不能期望支持向量机开箱即用地可靠处理任何输入数据。XGBoost 也是如此。*

一个伟大的神经网络可靠性的例子是麻省理工学院的工作利用无线信号反射探测穿墙的人类。作者同时记录了几个演员做日常活动时的相机图像和 WIFI 反射。然后,他们对相机图像运行了一个姿势估计框架,并训练了一个模型来使用 WIFI 数据而不是图像复制结果。关于隐私的结果令人印象深刻。网络是如何完成这样的壮举的?没有人知道。它完全靠自己学习。没有特征工程,只有原始数据,和几个矩阵。

毕竟,通过墙壁探测人是一项简单的任务:)

暂时就这些了。如果你对这篇文章或报纸有任何问题,请随时评论或与我联系。您也可以订阅我在这里发布的通知。顺便说一下,说到咖啡,如果你愿意直接支持我的工作,你可以给我买一杯)

如果你是新手,我强烈推荐订阅。对于数据和 IT 专业人员来说,中型文章是 StackOverflow 的完美组合,对于新手来说更是如此。注册时请考虑使用我的会员链接。

感谢阅读:)

为什么不用 CNN 提取特征?

原文:https://towardsdatascience.com/why-not-use-cnn-to-extract-features-1f18341bee8

如何发现数据中的意外模式

潜在空间图示例(图片由作者提供)

意外中有美。

就在你认为你已经想通了所有事情的时候,一些新的事情突然出现,让你大吃一惊。数据分析也是如此。当你查看数据集,试图找到模式和趋势时,有时你会遇到一些不太有意义的东西。这就是异常检测的用武之地。

异常检测是识别数据中异常模式的过程。这些异常模式可能是不符合正常趋势或行为的任何东西,它们可能是由各种各样的事情引起的,例如数据收集中的错误、异常值,甚至是恶意活动。异常检测非常重要,因为它可以帮助您发现数据中的问题,否则您将无法发现这些问题。

异常检测的方法有很多种,但是在这篇博文中,我们将关注一种特殊的方法:流形学习。流形学习是一种寻找高维数据的低维表示的技术。

自动编码器

自动编码器是一种人工神经网络,分为两个主要部分:编码器网络和解码器网络。

每个部分执行以下操作:

  1. 编码器 网络:在一个叫做潜在空间的低维空间中减少一个高维输入。
  2. 解码器网络:将潜在空间映射成输入图像的表示。

自动编码器属于非监督学习技术的范畴,因为数据不需要有标签。编码器减少输入数据的维数,解码器从潜在空间再现输入,并且两个网络被优化以减少输入和输出数据之间的差异。

编码器和解码器网络可以被设计为服务于特定的任务。在图像的情况下,我们通常使用我们训练的卷积神经网络(CNN ),以便减少输入 X 和其重构输出 X '之间的均方误差(MSE ),即

输入 X 与其重构输出 X '之间的均方误差

自动编码器的常见使用案例有:

  • 维度缩减
  • 图像压缩
  • 数据去噪
  • 异常检测

对于后者,经典方法侧重于通过查看输入与其重建版本之间的差异来发现异常。假设当输入类似于训练数据集时,自动编码器表现良好,但是在异常周围产生高重建误差。为了使用这种方法,我们用无异常数据训练自动编码器,并观察自动编码器的输入和输出之间的差异。

另一种可能性是确保模型学习潜在空间的有意义的表示,并直接在这个低维空间中发现异常。这就是拉普拉斯自动编码器的用武之地。

但是首先,我们必须建立一个 K-最近邻图来训练拉普拉斯自动编码器。

k-最近邻图

k-最近邻图(k-NNG)是每个节点与其最近邻相连的图。例如,在下图中,每个节点都连接到其三个最近的点。

k-NN 图形草图(图片由作者提供)

欧几里德范数可能是最直观的接近度度量,因为它给出了两点之间的最短距离。可以根据应用选择其他流行的距离度量,如闵可夫斯基、曼哈顿、汉明或余弦

对于高维输入,如图片,我们需要选择一个距离度量来衡量图像之间的相似性,如结构相似性指数(SSIM)或基于梯度方向直方图(HOG)。

例如,我们可以使用 HOG 描述符,并用 Wasserstein 度量或卡方距离计算两个直方图之间的距离。

选择度量标准时,我们需要记住,一个好的距离度量标准应该是:

  • 信息量:距离可以直接翻译为相似程度
  • 反身:从“A 到 B”和“B 到 A”的距离相等
  • 灵敏:距离变化时变化平滑
  • 有界:指标落在受限范围内

拉普拉斯自动编码器

使用自动编码器时,最大的挑战是确保模型实际学习潜在空间的有意义的表示。

拉普拉斯自动编码器也使用编码器-解码器结构,但是区别在于用于训练两个网络的损失函数。

仍然训练自动编码器,以便减少输入和其重构输出之间的误差,但是在损失函数中增加了正则化项,以便在高维和低维之间保持相同的邻居。这意味着输入空间中的接近数据点将在潜在空间中保持接近。

为了构建拉普拉斯自动编码器,我们首先必须在输入数据上构建 KNN 图,并且在损失函数上添加正则化项,一旦相同的邻居被映射到潜在空间中,该正则化项鼓励保持相同的邻居。

从 KNN 图中,我们导出了一个权重矩阵(W ),当 Xi 和 Xj 之间的距离很大时,它具有小的 W(i,j ),而当 Xi 和 Xj 之间的距离很小时,它具有大的 W(I,j)。正则化函数定义如下:

拉普拉斯自动编码器的正则化函数

其中 Zi 和 Zj 分别表征来自输入 Xi 和 Xj 的潜在空间中的映射点。第一个参数(λ)是正则化权重,我们可以将其作为模型的超参数进行调整。

拉普拉斯自动编码器旨在优化的全损失函数定义如下:

拉普拉斯自动编码器的损失函数

最后的话

那么,当你的数据不太符合模型的时候,你能做什么呢?

使用卷积神经网络(CNN)来查找数据中的意外模式。CNN 非常适合从图像中提取特征,并已被证明在发现传统方法难以检测的模式方面非常有效。

使用非监督方法相对于监督等效方法的主要优势在于,我们不需要标记任何数据,这是一项非常昂贵的任务。权衡的结果是,我们可能检测到不是异常的模式,而是数据集固有的模式。

我希望你喜欢这个教程,并发现它很有用。如果你有任何问题或意见,欢迎在下面发表。

好奇想了解更多关于 Anthony 的工作和项目吗?在媒体LinkedInTwitter 上关注他。

需要技术写手?将您的请求发送到https://amigo CCI . io

为什么打包你的 ML 代码没有你想象的那么痛苦

原文:https://towardsdatascience.com/why-packaging-your-ml-code-is-not-as-painful-as-you-might-expect-d3583439ec1d

如何将您的机器学习代码及其依赖项转移到您的生产环境中。

包装您的 ML 模型—用稳定扩散创建的图像

Jane 在一家成功的初创公司担任机器学习(ML)工程师。他们即将发布其产品的第一个版本,该版本严重依赖于她正在研究的 ML 算法的性能。经过几次迭代之后,她所训练的模型在一个坚持的测试集上表现得相当好,她已经准备好进行下一步了。

首先,她使用 Gradio 快速开发出一个原型,并将其放在拥抱脸空间上。现在,她有了一个运行中的 ML 驱动的应用程序,它有一个简单的 UI,可以与信任的朋友和同事分享。Jane 利用这一点获得反馈,并验证模型在真实场景中的性能。

她现在准备开始开发过程的下一阶段;构建一个合适的推理服务器。她确信模型即服务(MaaS)方法是前进的方向,因此在她的任务列表中添加了一些新项目:

  • 打包模型
  • 构建一个 REST API
  • 优化服务的性能
  • 解决缩放问题
  • 简化版本推出

今天是星期一。她拿起单子上的第一项:包装模型。在这个故事中,我们研究了她的两种选择,以及为什么走得最多的路——尽管是一条崎岖的路——是甜蜜点路线。

Learning Rate 是一份时事通讯,面向那些对 AI 和 MLOps 世界感到好奇的人。你会在每个月的第一个星期六收到我关于最新人工智能新闻和文章的更新和想法。订阅这里

模型打包和依赖管理

ML 模型是一个数学函数,它接受一个明确定义的输入并产生一个输出。但这也是 Jane 必须打包的一段代码,然后加载到一个与她工作的环境完全不同的环境中。

模型预测依赖于她编写的代码、它的依赖关系和模型权重。所有这些工件都需要出现在推理服务器上。不幸的是,这不是一件容易的事情。您可能认为,对于 Jane 来说,启动一个 VM,在其中使用 ssh,安装所有的依赖项,复制模型的代码和权重,运行一个 flask 应用程序,并将其称为推理服务器就足够了。它不是;那么,有什么问题呢?

依赖性是很多令人头疼的问题的根源。很难在不同的环境中保持它们的一致性,甚至其中一个环境中的微小升级都会产生难以追踪的问题。

您的模型代码可能依赖于数十或数百个其他库(例如,pytorchtorchvisiontorchmetricsnumpyscipy等)。).您的应用服务器也有自己的依赖项(例如flaksgunicorn等)。).众所周知,跟踪一切并维护独特的环境非常困难。Jane 必须同步她的开发、测试、试运行和生产环境。这是一场噩梦。

Jane 以前亲身经历过这些困难,所以她知道有两种选择:以不可知的形式保存模型以约束模型的依赖关系,或者将整个推理应用程序包装在一个容器中。

约束模型依赖关系

Jane 的选择之一是约束她的模型的依赖关系。今天,完成这项工作的主要方法是使用一个名为 ONNX(开放式神经网络交换)的库。

ONNX 的目标是成为 ML 模型的互操作性标准。使用 ONNX,Jane 可以用任何语言定义网络,并在任何地方一致地运行它,不管 ML 框架、硬件等等。

这看起来很理想,但简以前也曾上当。由于 ML 和数值库迭代速度很快,所以翻译层经常会出现难以追踪的 bug。ONNX,不管它的意图是好是坏,仍然会导致比它试图解决的问题更多的问题。

此外,正如我们所看到的,Jane 必须考虑与她的模型无关的部分。数据处理部分或者服务器的代码呢?

将推理代码打包到容器中

当我们谈论集装箱时,十有八九是指码头集装箱。虽然 Docker 有一点学习曲线,但入门并不困难,是 Jane 的最佳选择。

Jane 必须编写 DockerHub 文件,构建映像,并将其推送到映像注册中心,比如 DockerHub。在稍后阶段,这可以通过 CI/CD 管道实现自动化,因此在这方面投入时间会让她走得很远。Jane 现在可以将这个映像放入任何运行容器运行时的计算机中,并毫无困难地执行它。

容器和 Docker 彻底改变了我们打包应用程序的方式。它们无处不在,即使你不想深入细节,一些服务也可以帮助你将你的 ML 代码打包成标准的、生产就绪的容器。 CogBentoMLTruss 是提供更快速运送模型的项目。

然而,我的观点是,既然您无论如何都要编写一个 YAML 文件,那么最好学习 Docker 和 Kubernetes 的语法。您也可以将这些知识转移到其他领域,帮助您对部署过程中的许多步骤有一个总体的了解。

结论

开发您的 ML 模型只是构建 ML 驱动的应用程序的一步。事实上,它往往是前进的许多小步中最小的一步。

当您准备打包它并构建推理服务器时,您实际上有两个选择:约束它的依赖关系或将其打包到一个容器中。

在这个故事中,我们看到,虽然 ONNX 等工具的承诺是雄心勃勃的,但将模型代码及其依赖项打包到一个容器中仍然是一条路要走。接下来,我们将看到如何使用 Docker、KServe 和 Kubernetes 来实现这一点。

关于作者

我叫 Dimitris Poulopoulos ,我是一名为 Arrikto 工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。

如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据操作的帖子,请关注我的 MediumLinkedIn 或 Twitter 上的 @james2pl

所表达的观点仅代表我个人,并不代表我的雇主的观点或意见。

posted @ 2024-10-18 09:37  绝不原创的飞龙  阅读(452)  评论(0)    收藏  举报