TowardsDataScience 博客中文翻译 2019(四百九十七)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

R 中的终极 EDA 可视化

原文:https://towardsdatascience.com/the-ultimate-eda-visualization-in-r-e6aff6afe5c1?source=collection_archive---------13-----------------------

清除创建雨云情节的障碍

介绍

最近我在为一个研究项目做 EDA(探索性数据分析)。同事给我介绍了一个情节,叫雨云情节。它是点状图、盒状图和核心密度的结合(或者你可以把它想成半小提琴图),它确实以一种视觉愉悦的方式传达了无数的信息(因此很多时候我们错误地称它为彩虹图:)。下面是该图的一个示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Rain cloud plot for a comparative politics project

看起来很神奇,不是吗?尽管我成功了,但我还是被剧情的最终结局惊呆了!

请注意,这篇文章是基于宝拉·安德里亚·马丁内兹米卡·艾伦大卫·罗宾逊的伟大工作。因此,我不会通过展示所有的细节来重新发明情节;相反,我将介绍一些你可能需要的技巧,以使这样的情节符合你的需要。

准备

我将使用来自世界价值调查第五波的数据集作为例子。我已经清理了数据集,您可以从这里简单地 git 克隆。这里是数据集的一瞥:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

国家列有 22 个唯一的国家值:

阿根廷、澳大利亚、巴西、保加利亚、加拿大、智利、芬兰、法国、格鲁吉亚、匈牙利、日本、墨西哥、荷兰、挪威、波兰、罗马尼亚、塞尔维亚、斯洛文尼亚、瑞典、英国、美国和乌拉圭。

其余各栏对应于受访者对与民主的基本特征相关的 6 个问题的回答,得分为 1-10 分。例如,对于上面的每个变量,都有这样的问题提示:

许多事情可能是可取的,但并不是所有的事情都是民主的本质特征。请告诉我,对于以下各项,您认为它作为民主的一个特征有多重要。

【①政府 税收 富人补贴穷人;

(2) 宗教 权威解释法律;

使用此量表,其中 1 表示“根本不是民主的基本特征”,10 表示肯定是“民主的基本特征”

为了创造情节,你需要的另一个东西是 R 包 RColorBrewer

RColorBrewer 是一个 R 包,它允许用户使用预先制作的调色板创建彩色图表,以清晰可辨的方式可视化数据。有 3 类调色板:定性,发散,顺序。

问题 1

如果您没有包含许多组(在本例中为国家)的大型数据集,以上链接中提供的代码示例在大多数情况下都适用。但是,当你有“很多”组的时候,它就一定会断。截止值大约是 8–12,取决于您选择的特定调色板,并放入以下代码中。

# borrowed from [Paula Andrea Martinez](https://orchid00.github.io/tidy_raincloudplot)'s post mentioned above
g <- 
  ggplot(data = name_of_your_data, 
         aes(x = EmotionCondition, y = Sensitivity, fill = EmotionCondition)) +
  geom_flat_violin(position = position_nudge(x = .2, y = 0), alpha = .8) +
  geom_point(aes(y = Sensitivity, color = EmotionCondition), 
             position = position_jitter(width = .15), size = .5, alpha = 0.8) +
  geom_point(data = sumld, aes(x = EmotionCondition, y = mean), 
             position = position_nudge(x = 0.3), size = 2.5) +
  geom_errorbar(data = sumld, aes(ymin = lower, ymax = upper, y = mean), 
                position = position_nudge(x = 0.3), width = 0) +
  expand_limits(x = 5.25) +
  guides(fill = FALSE) +
  guides(color = FALSE) +
  coord_flip() + 
 **scale_color_brewer(palette = "Spectral") +
  scale_fill_brewer(palette = "Spectral") +**
  theme_bw() +
  raincloud_theme

因此,如果您有一个像我们这里的例子这样的数据集,这在实际的分析设置中会有很多次,上面的 R 代码会中断并产生令人讨厌的错误:

> g
Error: Insufficient values in manual scale. 22 needed but only 1 provided.

您会看到这一点,因为 ggplot 无法从我们为 22 个组/国家选择的调色板(在本例中为“光谱”)中获取足够的颜色。然而,所有的默认调色板只有 8-12 种颜色。因此,我们需要将调色板“切割”成更小的间隔,从而创造更多的颜色来适应我们的群体。我们可以通过手工“剪切”默认调色板并通过colorRampPalette函数创建一个新的调色板来实现

getPalette = colorRampPalette(RColorBrewer::brewer.pal(8, "Set2"))(22) # I set (26) when creating the plot above for better transition of colors.

这将削减我们原来的调色板介绍 22 小间隔,并提取相应的颜色。我尝试了一些默认的调色板,我最喜欢调色板“Set2”。我实际上创建了 26 种颜色,而不是 22 种,因为这将允许最后几组有更明亮和更饱和的颜色。

尝试最让你满意的不同调色板和颜色组合:)

问题 2

这是一个更微妙的问题,只有在数据失真的情况下才会变得明显。其微妙的原因是,代码不会抱怨任何事情,并按照您的要求生成丰富多彩的情节。然而,在你把它投入生产和报告后,你可能会被问到“为什么它们看起来不像是在同一个规模上?”

让我给你看一个例子。请比较以下数字,第一张图中以为绘制变量,第二张图中以民权为绘制变量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1

图 1 看起来和预期的一样,我们看到了数据分布的一个很好的描述。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 2

图 2 看起来很诡异,不是吗?密度图看起来又细又扁,似乎与图 1 不在同一尺度上。但是让我告诉你,生成这两个数字的代码是完全一样的,没有任何错误!

问题在于数据的分布和密度图的特殊性。图 2 中的公民权利变量比税收变量更偏向顶端,这意味着更多的人认为保护公民权利绝对是民主的一个基本特征;他们认为政府向富人征税来补贴穷人是民主的本质特征。某个国家在公民权利变量中的中位数几乎是 9。这种偏度直接导致 pdf 拍摄的密度估计超出 10 的范围,甚至扩展到 12!但是,雨云图默认将密度限制/修剪为 10,从而导致密度区域超出 10 的范围,导致密度图看起来像是被挤压和压缩的。

到目前为止,还没有一个好的解决方案将面积损失附加到顶值 10。然而,在研究了一点之后,我发现雨云图中有一个参数可以帮助我们解释这个图。

g <- 
  ggplot(data = name_of_your_data, 
         aes(x = factor(country), y = tax, fill = factor(country))) +
  **geom_flat_violin(position = position_nudge(x = .2, y = 0), trim = TRUE, alpha = .8, scale = "width")** +
  geom_point(aes(y = tax, color = factor(country)), 
             position = position_jitter(width = .15), size = .5, alpha = 0.8) +
  geom_boxplot(width = .1, outlier.shape = NA, alpha = 0.5) +
  geom_point(data = sumld, aes(x = factor(country), y = mean), 
             position = position_nudge(x = 0.3), size = 2.5) +
  geom_errorbar(data = sumld, aes(ymin = lower, ymax = upper, y = mean), 
                position = position_nudge(x = 0.3), width = 0)+
  expand_limits(x = 5.25) +
  guides(fill = FALSE) +
  guides(color = FALSE) +
  scale_color_manual(values = getPalette) +
  scale_fill_manual(values = getPalette) +
  #coord_flip() + # flip or not
  theme_bw() +
  raincloud_theme +
  theme(axis.title = element_text(size = 42),
        axis.text=element_text(size=42))

这里的关键是参数scale = "width"。该参数记录在这里的中。根据这份文件:

如果是“面积”(默认),所有的小提琴都有相同的面积(在修剪尾部之前)。如果为“计数”,面积将与观察次数成比例缩放。如果“宽度”,所有的小提琴都有相同的最大宽度。

如果我们设置scale = "width",这两个数字看起来会是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 3: Adjusted plot for the tax variable

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 4: Adjusted plot for the civil_rights variable

我们可以看到这些图,尤其是图 4,不再像图 2 那样压缩,每个国家内变量的分布变得更加明显。这正是我们想要的,了解每个国家的分布情况。这里需要注意的一点是,由于我们将最大密度宽度配置为相同,因此密度的面积并不相同(尽管图 2 中没有显示,因为各国的修剪面积并不相同)。这一缺点在瑞典尤为明显,如图 4 所示。然而,鉴于我们的目标是查看国家内部而不是国家之间的分布情况,我认为调整后的版本更适合我们。

结论

我希望这篇文章能扫清你在尝试制作令人惊奇的雨云情节时可能遇到的障碍。我可以想象它在学术界和工业界会有更广泛的存在,因为它在浓缩大量信息方面很优雅。

最后说明一下,雨云图在 Python 和 Matlab 中的实现也可以在这里找到。

希望这篇文章对你的生活有用。请随时让我知道你是否有更多关于雨云情节的问题:)

编码快乐!

A/B 测试终极指南。第 2 部分:数据分布

原文:https://towardsdatascience.com/the-ultimate-guide-to-a-b-testing-part-2-data-distributions-5ed429abbce?source=collection_archive---------15-----------------------

A/B 测试是一种非常流行的技术,用于检查产品中的细微变化,而不会错误地考虑由外部因素引起的变化。在这一系列的文章中,我将尝试给出一个简单的关于如何设计、运行和评估 a/b 测试结果的操作手册,这样你就可以得到这些惊人的统计显著结果了!

在上一集中,我们已经讨论了在进行 a/b 测试之前对样本大小的估计。下一步是考虑我们实现的检查测试结果统计显著性的确切方法。

但是在进入不同的统计测试之前,处理一点概率分布是很重要的,为什么我们需要知道我们的数据是如何形成的。也就是说这篇文章会比其他的更理论化,所以坚持住!但是这些知识对于下一步很重要:为每种类型的分布选择正确的统计检验。

注意:我这里不做概率分布的理论解释,所以如果你不熟悉这个概念,最好从 这里 )开始。

当涉及到 a/b 测试用户行为时,我们最有可能观察到几种类型的分布:

  • 二项分布
  • 正态分布
  • t 分布
  • 卡方分布

当然,还有很多,但是我们将集中讨论这四个,因为它们应该涵盖了你在实践中遇到的 99%的情况。

二项分布

这种情况发生在每次试验中只有两种可能的结果,并且这些试验已经重复了一定的次数。二项式分布的例子:用户搅动/返回,赢得/输掉游戏,等等。

你可以确定存在一个二项分布,如果以下所有都成立:

  • 有 n 次试验
  • 每个试验都是独立的,即一个试验的结果对另一个试验没有影响
  • 每次试验只有两种可能的结果:成功和失败,概率分别为 p 和(1-p)

已知成功概率§、试验次数(n)和成功次数(x),我们可以使用以下公式绘制二项式分布:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基本上,它的意思是,知道了成功的概率§和试验的次数(n ),我们就能够计算出在 n 次试验中获得一定成功次数(x)的概率。

还记得第一篇文章中的那个游戏吗?让我们回到那个例子,假设我们有 100 个用户(n=100),其中只有 30 人在安装游戏后的第二天返回(x=30)。此外,我们知道,在我们的案例中,用户返回的概率(即保留率)是 70% (p=0.7)。那么,从 100 个返回者中只得到 30 个返回者的概率是多少呢?

使用二项分布的公式,我们得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

概率接近于零,这意味着这是一个极不可能的情况。所以这个结果是检查产品是否有问题的好理由。

如果我们用不同的概率 p 绘制二项式分布,图表看起来会像这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

平均值和标准偏差可使用以下公式计算:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二项式分布是离散的,而不是连续的分布。因为变量 x 是 n 次试验的成功次数,所以它只能取数字 0,1,2,3,4……名词(noun 的缩写)

正态分布

我们列表中的下一站是正态分布:就可识别性而言,这是其他分布中的佼佼者,许多统计测试都基于测试数据是正态分布的假设。

这种分布的广泛流行并非偶然,因为出于某种原因,许多真实世界的数据集近似正态分布。这里的例子可以是人的身高或年薪,以及更多。

如果所有的检查点都被填满,你可以确定存在正态分布:

  • 分布的均值、中值和众数都相等
  • 曲线在中心对称(即围绕平均值μ)
  • 所有的值围绕平均值对称分布(正好一半的值在中心的左边,正好一半的值在右边)
  • 曲线下的总面积等于 1(即总 p = 100%)

这种分布的一个更重要的特征是,知道了标准差和平均值,你就可以说得到精确值的概率。这来自曲线的形状:

  • 68%的数据在平均值的一个标准偏差范围内
  • 95%的数据落在平均值的两个标准偏差内
  • 99.7%的数据在平均值的三个标准偏差范围内

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了描述这种分布,统计学家使用以下公式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,P(x)完全由两个变量描述:均值μ(也称为中位数和众数)和标准差σ。这两个值可以用以下公式计算:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果μ = 0 且σ= 1,正态分布也可称为标准正态分布(又名 Z 分布)

您可以使用公式轻松地将任何正态分布转换为 Z 分布:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 Z 被称为“Z 得分”,这是一个非常重要的显著性检验统计数据,因此我们将会经常用到它。

学生的 t 分布

t 分布是正态分布的近亲。稍微矮一点胖一点的表弟。

当您有小样本(通常在实践中少于 30)时,使用 t 分布代替正态分布。样本越大,t 分布就越像正态分布。事实上,对于大于 30 的样本大小(例如,更多的自由度),分布几乎完全遵循正态曲线的形状。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了描述 t 分布,我们使用以下公式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中γ是 gamma-function,ν是自由度的个数(简单来说就是样本数减 1)。

均值和标准差也类似于它的正常表亲,只是略有不同:对于 t 分布,我们通常假设给定数据是来自某个总体的一个样本,这意味着均值(μ)和标准差(σ)被认为是样本均值和样本标准差。在实践中,所有的变化是,我们使用自由度的数量(ν = n-1)而不是样本数量(n)来计算标准偏差,并且我们还使用其他字母来表示这两个指标:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

T 分布也有自己的 Z 得分版本,称为 T 得分,在统计测试中大量使用:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卡方分布

最后,但不是最不重要的,是卡方分布。这种方法广泛用于分类数据的统计测试。

卡方分布是伽马分布的一种特殊情况(就像 T 分布一样),并且只有一个参数:自由度(ν),就像可能类别的数量减一一样简单。分布只有正值,而且是右旋的。其形状因ν而异:从ν很低的非常不对称的形状,到ν很高的几乎正常的形状(当ν接近无穷大时,卡方分布变为正态分布)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分布的平均值等于自由度的数量:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

标准差等于自由度数量的两倍的平方根:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就像前两个一样,卡方也有自己的度量标准用于统计测试:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 Oi 是样本中 I 类出现的次数(观察频率),Ei–是样本中 I 类出现次数的假设(预期频率)。这个假设是我们在进行测试时要检查的。

所以,这些是你在开始测试你的数据时能找到的最常见的分布。下一次将讨论每种情况下的具体统计检验,也就是为什么不应该对卡方分布数据应用 t 检验。

A/B 测试终极指南。第 3 部分:参数测试

原文:https://towardsdatascience.com/the-ultimate-guide-to-a-b-testing-part-3-parametric-tests-2c629e8d98f8?source=collection_archive---------7-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A/B 测试是一种非常流行的技术,用于检查产品中的细微变化,而不会错误地考虑由外部因素引起的变化。在这一系列的文章中,我将尝试给出一个简单的关于如何设计、运行和评估 a/b 测试结果的操作手册,这样你就可以得到这些惊人的统计显著结果了!

在部分 中,一个 两个 中,我们已经讨论了在运行 a/b 测试之前样本大小的估计和最常见的概率分布,它们实际上描述了您的数据是如何形成的。现在是时候再做一步了:选择正确的统计检验,并最终使用它!

所有的统计检验可以分为两大类:参数非参数。这两个群体都致力于解决或多或少相同的问题,但在不同的情况下解决问题:

  • 仅当假设正态(或接近正态)分布时,才使用参数检验。最广泛使用的测试是 t 检验ANOVA
  • 当连续数据不是正态分布或者数据是离散的时,使用非参数检验。其中有代表性的有卡方费雪精确 检验曼恩-惠特尼 U 检验

为了让所有这些理论更接近现实生活中的问题,让我们来看一个例子:

因此,我们在过去几年里一直在开发这款令人惊叹的街机游戏,事情似乎进展得很好:保留率很稳定,转化为购买和 LTV(终身价值)使我们能够通过获得付费流量将游戏的活跃观众保持在一定水平。换句话说,我们正在驾驶一辆沃尔沃汽车:虽然它不是法拉利,但它足够可靠,可以在合理的时间内以合理的价格将乘客从 A 点带到 B 点。

但是,当然,总有改进的空间(旁注:作者不是法拉利赞助的,也没有说服你购买任何跑车):社区要求添加合作模式已经有一段时间了,经过长时间的激烈讨论,游戏团队决定投入一些时间和资源进行开发。

现在我们在这里:6 个月之后,一个已经完成并经过测试的功能,激动而准备好的 t̵o̵ ̵r̵o̵c̵k̵!̵!在面向全体观众推出之前,̵将对其进行 A/B 测试。

我们暂时不讨论实验设计和样本量估计的话题(如果你感兴趣,请查看系列的第一篇文章),然后直接开始估计结果:

对于有 2500 名用户的测试组(与对照组的规模相同),我们得到了这些数字:

  • 平均会话时间从 8 分钟增加到 9 分钟
  • 第一天的保留率从 40%增加到 45%
  • 同时,转化率从 2%下降到 1.7%(哦哦)

所以对于平均来说。会话长度与对照组相比,测试组有巨大的(根据产品经理)1 分钟的进度!第一天的保留率更高(5%)!

但是董事会却没有同样的热情。从他们的角度来看,合作模式吸引了更多的玩家,但同时,它分散了他们对核心游戏的注意力,而核心游戏是所有盈利的所在。

产品经理强烈反对这种解释,他说,我们的会话长度增长了 11%,留存率增长了 5%,转化率仅下降了 0.3%,这可能只是一个概率问题。

经过 3 个小时的反复讨论,他们决定给数据人员打电话。这是我们最终登上舞台的时刻:通过调用获胜案例(测试或控制)来收集所有数据并挽救局面!

首先,我们查看了指标分布,并决定了合适的统计方法:

平均会话长度是正态分布的,因此我们可以使用参数测试来检查差异的显著性

第一天的保留率和转换率是二项式分布(两种情况都有两种结果:退货/退货、转换/未转换),这意味着我们需要使用非参数测试

(如果您想了解发行版的更多细节,请查看本系列的第二篇文章

参数测试

“参数”这个名称意味着这些测试是基于数据具有某种形式的(正态或 t 分布)的**分布的假设,因此我们可以使用该分布**(平均值,标准差)的某些参数 来比较测试组。

这种类型最流行的代表是 Z-test学生 T-testANOVA (方差分析)。

对于我们的例子,让我们选择 T-test 来检查平均会话长度的增加是否像产品经理声称的那样令人兴奋。

T 检验(学生的 T 检验)

t 检验测量两组之间的差异有多显著。我们所说的“不同”是指。😃

换句话说,如果我们有两个均值不同的样本,这种差异可能只是偶然存在的吗,这两个样本来自同一个总体,或者这实际上是来自不同分布的两组?

我们首先绘制两组中每节课的时长:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

要使用双样本 T 检验,我们需要每个分布的三个参数:样本均值(x1,x2)、标准偏差(s1,s2)和每组中的观察次数(n1,n2)。我在上一篇文章中已经描述了如何计算它,所以这里我们将只使用现成的数字:

对照组(橙色组)的平均值为 x1 = 8,而测试组的平均值为 x2 = 9。各组的标准偏差为 s1 = 0.5,s2 = 0.6。控制组和测试组的会话数为 n1=n2=25000(每个玩家在 A/B 测试期间进行了 10 次会话)。

知道这些数字后,可以使用以下公式计算 T 值:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 Sp 为样本分组方差,由下式给出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

μ1μ2 是两个种群的实均值。但是我们只有样本均值 x1x2…那么如何处理这个呢?

嗯,整个测试的主要目标是证明μ1 和μ2 之间存在显著差异,正因为如此,x2 高于 x1。或者换句话说,证明两个样本来自同一总体(μ1 = μ2)的零假设是错误的。

诀窍就在这里:在测试中,我们实际上假设零假设为真,μ1 = μ2,并检查在这种情况下测试组和对照组获得如此不同结果的可能性。而如果μ1 = μ2,那么(μ1 — μ2)=0。

我们案例的最终计算如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结果,我们得到了一个相当高的 t 值!

最后一步是检查,p = 0.05 的临界 t 值是多少(只是一个关于 p 值的快速提醒:这是错误地认为两个样本之间存在显著差异的概率,而事实并非如此。因此,尽管 5%通常就足够了,但有时人们会为了更保守的结果而选择 1%的 p 值。

根据临界值表(你可以很容易地在网上找到),对于我们的样本量和 p = 0.05,当 t>1.96 时,可以拒绝零假设。我们远远超过了这个值,因此我们可以说平均会话长度增加 1 分钟是有意义的。

看起来我们证明了产品经理对敬业度的乐观看法是正确的,这太棒了!但其他问题仍然存在:我们的货币化指标下降了吗?这 5%的保留率增长有意义吗?

为了回答这两个问题,我们需要使用非参数测试**,但是这些家伙值得一篇单独的文章。敬请关注!**

数据清理的终极指南

原文:https://towardsdatascience.com/the-ultimate-guide-to-data-cleaning-3969843991d4?source=collection_archive---------0-----------------------

当数据是垃圾的时候

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

source

我花了几个月的时间分析来自传感器、调查和日志的数据。不管我制作了多少图表,算法有多复杂,结果总是误导人。

对数据扔一个随机的森林,就跟给它注射病毒一样。一种病毒,除了损害您的洞察力之外别无其他意图,就好像您的数据是垃圾一样。

更糟糕的是,当你向首席执行官展示你的新发现时,哎呀,你猜怎么着?他/她发现了一个缺陷,一些闻起来不对劲的东西,你的发现与他们对领域的理解不匹配— 毕竟,他们是领域专家,比你,作为分析师或开发人员的你更了解。

立刻,血液涌上你的脸,你的手在颤抖,片刻的沉默,然后,可能是道歉。

那一点也不差。如果你的发现被当作一种保证,而你的公司最终根据它们做出了决定,那会怎么样?。

你摄入了一堆脏数据,没有清理干净,你告诉你的公司对这些结果做一些事情,结果证明是错误的。你会有大麻烦的!。

不正确或不一致的数据会导致错误的结论。因此,您对数据的清理和理解程度对结果的质量有很大的影响。

维基百科上给出了两个真实的例子。

例如,政府可能希望分析人口普查数据,以决定哪些地区需要在基础设施和服务方面进一步支出和投资。在这种情况下,获得可靠的数据以避免错误的财政决策是非常重要的。

在商业世界中,不正确的数据可能代价高昂。许多公司使用客户信息数据库来记录联系信息、地址和偏好等数据。例如,如果地址不一致,公司将承受重新发送邮件的成本,甚至失去客户。

垃圾进,垃圾出。

事实上,一个简单的算法可以胜过一个复杂的算法,只是因为它被给予了足够多和高质量的数据。

高质量的数据胜过花哨的算法。

由于这些原因,有一个逐步的指导方针,一个备忘单,通过要应用的质量检查是很重要的。

但是首先,我们要达到的目标是什么?。优质数据是什么意思?。质量数据的衡量标准是什么?。在采取任何行动之前,理解你试图完成的目标,你的最终目标是至关重要的。

索引:

数据质量

坦率地说,除了维基百科上的那个解释,我找不到更好的解释了。所以,我在这里总结一下。

有效期

数据符合定义的业务规则或约束的程度。

  • 数据类型约束: 特定列中的值必须是特定的数据类型,如布尔、数值、日期等。
  • 范围约束: 通常情况下,数字或日期应该在一定的范围内。
  • 强制约束 : 某些列不能为空。
  • 唯一约束: 一个字段或字段组合在整个数据集中必须是唯一的。
  • 集合成员约束 : 列的值来自一组离散值,例如枚举值。例如,一个人的性别可能是男性,也可能是女性。
  • 外键约束 : 与在关系数据库中一样,外键列不能有不存在于被引用主键中的值。
  • **正则表达式模式:**必须采用特定模式的文本字段。例如,电话号码可能需要具有(999)999–9999 的模式。
  • **跨字段验证:**跨多个字段的某些条件必须成立。例如,患者的出院日期不能早于入院日期。

准确(性)

数据接近真实值的程度。

虽然定义所有可能的有效值可以很容易地发现无效值,但这并不意味着它们是准确的。

一个有效的街道地址可能实际上并不存在。一个有效的人的眼睛颜色,比如蓝色,可能是有效的,但不是真实的(不代表现实)。

另一个需要注意的是准确度和精确度的区别。说你生活在地球上,实际上是真的。但是,不精确。究竟在哪里?。说你住在特定的街道地址更准确。

完全

所有必需数据的已知程度。

由于各种原因,数据会丢失。如果可能的话,你可以通过质疑原始资料来缓解这个问题,比如重新采访对象。

很有可能,这个主题要么给出一个不同的答案,要么将很难再次触及。

一致性

同一数据集内或跨多个数据集的数据一致性程度。

当数据集中的两个值相互矛盾时,就会出现不一致。

一个有效的年龄,比如 10 岁,可能与婚姻状况不符,比如离婚。一个客户记录在两个不同的表中,有两个不同的地址。

哪个是真的?。

同样

使用相同度量单位指定数据的程度。

重量可以用磅或公斤来记录。日期可能遵循美国格式或欧洲格式。货币有时是美元,有时是日元。

因此数据必须转换成单一的测量单位。

工作流程

该工作流程由三个步骤组成,旨在产生高质量的数据,并考虑到我们谈到的所有标准。

  1. **检测:**检测意外的、不正确的和不一致的数据。
  2. **清理:**修复或清除发现的异常。
  3. **验证:**清洗后,检查结果以验证正确性。
  4. **报告:**记录有关所做更改和当前存储数据质量的报告。

你所看到的连续过程实际上是一个迭代的、无止境的过程。当检测到新的缺陷时,可以从验证到检查。

检查

检查数据非常耗时,并且需要使用多种方法来探索底层数据以进行错误检测。以下是其中的一些:

数据剖析

关于数据的汇总统计,称为数据剖析,对于给出数据质量的一般概念非常有帮助。

例如,检查特定的列是否符合特定的标准或模式。数据列是记录为字符串还是数字?。

缺少多少个值?。一列中有多少个唯一值,以及它们的分布情况?。这个数据集与另一个数据集有联系或有关系吗?。

形象化

通过使用统计方法(如平均值、标准偏差、范围或分位数)分析和可视化数据,可以找到意想不到的错误值。

例如,通过可视化各国的平均收入,人们可能会看到一些*****(链接有图片)。有些国家的人比其他任何人挣得都多。这些异常值值得研究,不一定是不正确的数据。***

软件包

您的语言中有几个可用的软件包或库,可以让您指定约束并检查违反这些约束的数据。

此外,它们不仅可以生成违反了哪些规则以及违反了多少次的报告,还可以创建一个图表,显示哪些列与哪些规则相关联。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传********外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

source

比如年龄不能是负数,身高也不能是负数。其他规则可能涉及同一行或跨数据集的多列。

清洁

根据问题和数据类型,数据清理涉及不同的技术。可以应用不同的方法,每种方法都有自己的利弊。

总的来说,不正确的数据要么被删除,纠正,或估算。

无关数据

不相关的数据是那些实际上不需要的,并且不适合我们试图解决的问题的上下文的数据。

例如,如果我们正在分析关于人口总体健康状况的数据,电话号码就没有必要了— 列式

同样,如果你只对一个特定的国家感兴趣,你不会想包括所有其他国家。或者,只研究那些去做手术的患者,我们不会包括每个人— 按行排列

只有当你确定某个数据不重要的时候,你才可以丢弃它。否则,探索特征变量之间的相关矩阵。

即使你注意到没有相关性,你也应该向领域专家请教。你永远不知道,一个看似不相关的特性,从某个领域的角度,比如从临床的角度,可能是非常相关的。

复制

重复数据是数据集中重复的数据点。

这种情况经常发生,例如

  • 来自不同来源的数据被组合在一起
  • 用户可能会按两次提交按钮,认为表单并没有真正提交。
  • 提交了两次在线预订请求,以更正第一次意外输入的错误信息。

一个常见的症状是两个用户拥有相同的身份号码。或者说,同一篇文章报废了两次。

因此,它们应该被简单地移除。

类型转换

确保数字存储为数字数据类型。日期应该存储为 date 对象,或者 Unix 时间戳(秒数),等等。

如果需要,分类值可以与数字相互转换。

通过查看摘要中每一列的数据类型,可以很快发现这一点(我们已经在上面讨论过)。

需要注意的是,不能转换为指定类型的值应该转换为 NA 值(或任何值),并显示警告。这表明该值不正确,必须修正。

语法错误

****删除空格:应该删除字符串开头或结尾多余的空格。

**"   hello world  " => "hello world**

****填充字符串:字符串可以用空格或其他字符填充到一定宽度。例如,一些数字代码通常用前置零表示,以确保它们总是具有相同的位数。

**313 => 000313 (6 digits)**

****修复错别字:字符串可以用许多不同的方式输入,难怪会有错误。

****Gender**
m
Male
fem.
FemalE
Femle**

这个分类变量被认为有 5 个不同的类,而不是预期的 2 个:男性和女性,因为每个值都不同。

一个条形图有助于可视化所有的唯一值。人们可以注意到一些价值是不同的,但确实指的是同一个东西,即“信息技术”和“IT”。或者,也许只是大写的不同,即“其他”和“其他”。

所以我们的职责就是从上面的数据中识别出每个值是男是女。我们如何做到这一点?。

第一种解决方案是手动将的每个值映射到的“男性”或“女性”。

**dataframe['gender'].map({'m': 'male', fem.': 'female', ...})**

第二种解决方案是使用模式匹配。例如,我们可以在字符串开头的性别中查找 M 或 M 的出现。

**re.sub(r"\**^m**\$", '**Male**', '**male**', flags=re.**IGNORECASE**)**

第三个解决方案是使用模糊匹配:一种识别预期字符串和每个给定字符串之间距离的算法。它的基本实现是计算将一个字符串转换成另一个字符串需要多少次操作。

****Gender   male  female**
m         3      5
Male      1      3
fem.      5      3
FemalE    3      2
Femle     3      1**

此外,如果您有一个城市名称这样的变量,您怀疑拼写错误或类似的字符串应该被同样对待。比如“里斯本”可以输入为“里斯本”、“里斯本”、“里斯本”等。

****City     Distance from "lisbon"** lisbon       0
lisboa       1
Lisbon       1
lisbona      2
london       3
...**

如果是这样的话,那么我们应该用一个唯一的值来代替所有意义相同的值。在这种情况下,用“lisbon”替换前 4 个字符串。

注意像“0”、“不适用”、“NA”、“None”、“Null”或“INF”这样的值,它们可能意味着相同的事情:值丢失。

使标准化

我们的职责不仅是识别错别字,还要将每个值放入相同的标准化格式中。

对于字符串,确保所有值都是小写或大写。

对于数值,请确保所有值都有特定的度量单位。

例如,高度可以用米和厘米来表示。1 米的差异被认为与 1 厘米的差异相同。所以,这里的任务是将高度转换成一个单位。

对于日期,美国版本与欧洲版本不同。将日期记录为时间戳(毫秒数)不同于将日期记录为 date 对象。

缩放/转换

缩放意味着转换数据,使其符合特定的比例,如 0–100 或 0–1。

例如,学生的考试分数可以重新调整为百分比(0-100),而不是 GPA(0-5)。

它还可以帮助使某些类型的数据更容易绘制。例如,我们可能希望减少偏斜度来帮助绘图(当有这么多异常值时)。最常用的函数是对数、平方根和倒数。

具有不同测量单位的数据也可以进行缩放。

学生在不同考试中的成绩,比如 SAT 和 ACT,是无法比较的,因为这两种考试的规模不同。1 次 SAT 成绩的差异被视为与 1 次 ACT 成绩的差异相同。在这种情况下,我们需要重新调整 SAT 和 ACT 分数来取数字,比如说,在 0-1 之间。

通过缩放,我们可以绘制和比较不同的分数。

正常化

虽然归一化也会将值重新调整到 0-1 的范围内,但这里的目的是转换数据,使其呈正态分布。为什么?

在大多数情况下,如果我们要使用依赖于正态分布数据的统计方法,我们会对数据进行归一化。如何?

可以使用日志功能,或者使用这些方法中的一种

根据使用的缩放方法,数据分布的形状可能会发生变化。例如,“标准 Z 分数”和“学生的 t 统计量”(在上面的链接中给出)保留了形状,而 log 函数可能不会。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传********外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Normalization vs Scaling (using Feature scaling) — source

缺少值

鉴于缺失的价值观是不可避免的,这就给我们留下了一个问题,当我们遇到它们时该怎么办。忽略缺失的数据就像在船上挖洞一样;它会下沉。

有三种或者更多的方法来处理它们。

—一个。放下。

如果一列中的缺失值很少发生并且是随机发生的,那么最简单和最直接的解决方案是删除有缺失值的观察值(行)。

如果该列的大部分值都丢失了,并且是随机发生的,那么通常的决定是删除整个列。

这在进行统计分析时特别有用,因为填充缺失值可能会产生意外或有偏差的结果。

—两个。估算。

它意味着根据其他观察值计算缺失值。有很多方法可以做到这一点。

—首先是,一个是使用统计值,如平均值、中位数。然而,这些都不能保证数据的无偏性,尤其是在有许多缺失值的情况下。****

当原始数据没有偏斜时,平均值最有用,而中值更稳健,对异常值不敏感,因此在数据偏斜时使用。

在正态分布的数据中,可以得到平均值的两个标准偏差以内的所有值。接下来,通过在(mean — 2 * std) & (mean + 2 * std)之间生成随机数来填充缺失值

**rand = np.random.randint(average_age - 2*std_age, average_age + 2*std_age, size = count_nan_age)dataframe["age"][np.isnan(dataframe["age"])] = rand**

—第二个。使用线性回归。基于现有的数据,我们可以计算出两个变量之间的最佳拟合线,比如说,房价与面积 m。****

值得一提的是,线性回归模型对异常值很敏感。

—第三个热卡:从其他类似记录中复制数值。只有当您有足够的可用数据时,这才有用。并且,它可以应用于数值和分类数据。

我们可以采用随机方法,用一个随机值来填充缺失值。将这种方法更进一步,可以首先根据某种特征,比如性别,将数据集分成两组(strata) ,然后随机地分别填充不同性别的缺失值。

顺序热卡插补中,根据辅助变量(s )对包含缺失值的列进行排序,以便具有相似辅助变量的记录顺序出现。接下来,用第一个可用记录的值填充每个缺失值。

更有趣的是,还可以使用 𝑘最近邻插补,该插补将相似的记录分类并放在一起。然后通过首先找到最接近具有缺失值的记录的𝑘记录来填充缺失值。接下来,从𝑘最近邻中选择(或计算出)一个值。在计算的情况下,可以使用像平均值(如前所述)这样的统计方法。

—三个。旗帜。

一些人认为,无论我们使用什么样的估算方法,填充缺失值都会导致信息的丢失。

这是因为说数据丢失本身就是信息性的,算法应该知道这一点。否则,我们只是通过其他功能来强化已经存在的模式。

当丢失的数据不是随机发生时,这一点尤其重要。以一项调查为例,来自特定种族的大多数人拒绝回答某个问题。

缺失的数字数据可以用比如说 0 来填充,但是在计算任何统计值或绘制分布图时必须忽略这些零。

分类数据可以用比如说“缺失”来填充:一个新的类别,它表明这段数据缺失。

—考虑到…

缺失值与默认值不同。例如,零可以解释为缺失或缺省,但不能同时解释为缺失和缺省。

缺失值不是“未知”。一项进行的研究表明,一些人不记得他们是否在学校被欺负过,应该被视为未知,而不是失踪。

每次我们丢弃或估算价值时,我们都在丢失信息。因此,萎靡不振可能会有所帮助。

极端值

它们是与所有其他观察结果显著不同的值。任何数据值距离 Q1 和第三季度四分位数超过(1.5 * IQR)都被视为异常值。

在被证明有罪之前,局外人是无辜的。也就是说,除非有充分的理由,否则不应删除它们。

例如,可以注意到一些不太可能发生的奇怪、可疑的值,因此决定删除它们。不过,它们值得在移除前进行调查。

还值得一提的是,一些模型,如线性回归,对异常值非常敏感。换句话说,离群值可能会使模型偏离大部分数据所在的位置。

记录内和跨数据集错误

这些错误是由于在同一行或不同的数据集中有两个或多个相互矛盾的值造成的。

例如,如果我们有一个关于城市生活成本的数据集。total 列必须等于房租、交通费和伙食费的总和。

****city       rent  transportation food  total**
libson     500        20         40    560
paris      750        40         60    850**

同样,孩子也不能结婚。一个员工的工资不能少于计算出来的税金。

同样的想法也适用于跨不同数据集的相关数据。

验证

完成后,应该通过重新检查数据并确保规则和约束成立来验证正确性。

例如,在填写完丢失的数据后,他们可能会违反任何规则和约束。

如果不可行的话,它可能涉及一些手动校正。

报告

报告数据的健康程度对于清理同样重要。

如前所述,软件包或库可以生成关于所做更改、违反了哪些规则以及违反了多少次的报告。

除了记录违规,还应该考虑这些错误的原因。为什么它们会首先发生?。

最后的话…

如果你做到了,我很高兴你能坚持到最后。但是,如果没有质量文化,上面提到的一切都没有价值。

无论验证和清理过程有多强大,随着新数据的到来,人们将继续遭受损失。

与其花时间和精力去治疗疾病,不如预防疾病。

这些问题有助于评估和提高数据质量:

数据是如何收集的,在什么条件下收集?。收集数据的环境确实重要。环境包括但不限于位置、时间、天气条件等。**

在去上班的路上询问受试者对的看法和在家里是不一样的。在一项研究中,使用平板电脑回答问卷有困难的患者可能会丢掉结果。**

****数据代表什么?。包括所有人吗?只有城里的人?。或者,也许只有那些选择回答的人,因为他们对这个话题有强烈的看法。

****清洗数据的方法有哪些,为什么?。不同的方法在不同的情况下或者不同的数据类型下可能会更好。

****您是否投入时间和金钱来改进流程?。投资于人员和流程与投资于技术同样重要。

最后,…不用说,

感谢您的阅读!

请随意联系 LinkedIn 或 Medium。

使用 Python 正则表达式模块的最终指南

原文:https://towardsdatascience.com/the-ultimate-guide-to-using-the-python-regex-module-69aad9e9ba56?source=collection_archive---------8-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

原始模式查找器

处理文本数据的主要任务之一是创建大量基于文本的要素。

人们可能希望找出文本、电子邮件(如果在文本中出现的话)以及大文本中的电话号码中的某些模式。

虽然实现这样的功能听起来很简单,但是如果我们使用 Python 的 regex 模块,就会简单得多。

例如,假设你的任务是找出一段特定文本中标点符号的数量。这里引用了狄更斯的文字。

你通常是怎么做的?

一个足够简单的方法是这样做:

target = [';','.',',','–']string = "**It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way – in short, the period was so far like the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of comparison only.**"num_puncts = 0
for punct in target:
    if punct in string:
        num_puncts+=string.count(punct)print(num_puncts)
------------------------------------------------------------------
19

如果我们没有 re 模块的话,那就太好了。对于 re,它只有两行代码:

import re
pattern = r"[;.,–]"
print(len(re.findall(pattern,string)))
------------------------------------------------------------------
19

这篇文章是关于一个最常用的正则表达式模式和一些我经常使用的正则表达式函数。

什么是regex

更简单地说,正则表达式(regex)用于在给定的字符串中查找模式。

我们想找到的模式可能是任何东西。

我们可以创建类似电子邮件或手机号码的模式。我们可以创建模式,从字符串中找出以 a 开头以 z 结尾的单词。

在上面的例子中:

import repattern = r'[,;.,–]'
print(len(re.findall(pattern,string)))

我们想要找出的模式是r’[,;.,–]’。这个模式捕获了我们想要捕获的 4 个字符中的任何一个。我发现 regex101 是测试模式的好工具。这是模式应用于目标字符串时的样子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如我们所看到的,我们能够根据需要在目标字符串中找到所有出现的,;.,–

每当我需要测试一个正则表达式时,我都会使用上面的工具。比一遍又一遍地运行 python 程序要快得多,调试也容易得多。

现在我们知道我们可以在目标字符串中找到模式,但是我们如何真正创建这些模式呢?

创建模式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 regex 时,我们需要学习的第一件事是如何创建模式。

我将逐一介绍一些最常用的模式。

正如您所想的,最简单的模式是一个简单的字符串。

pattern = r'times'string = "**It was the best of times, it was the worst of times.**"print(len(re.findall(pattern,string)))

但这不是很有用。为了帮助创建复杂的模式,regex 提供了特殊的字符/操作符。让我们一个一个地看一下这些操作符。请等待加载 gif 文件。

1.[] 操作员

这是我们在第一个例子中使用的。 我们想在这些方括号中找到任意字符的一个实例。

[abc] -将找到 a 或 b 或 c 的所有出现

[a-z] -将查找 a 到 z 的所有事件。

[a-z0–9A-Z] -将查找 A 到 Z、A 到 Z 和 0 到 9 的所有事件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Python 中,我们可以很容易地使用如下模式:

pattern = r'[a-zA-Z]'string = "**It was the best of times, it was the worst of times.**"print(len(re.findall(pattern,string)))

除了.findall之外,regex 中还有其他功能,但我们稍后会谈到。

2.点运算符

点运算符(。)用于匹配除换行符以外的任何字符的单个实例。

关于操作符最好的部分是我们可以把它们结合在一起使用。

例如,我们想找出字符串中以小写 D 或大写 D 开头,以长度为 6 的 e 结尾的子字符串。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.一些元序列

在使用 regex 时,有一些模式我们会反复使用。所以 regex 为它们创建了一些快捷方式。最有用的快捷方式是:

\w,匹配任何字母、数字或下划线。相当于[a-zA-Z0–9_]

\W,匹配除字母、数字或下划线以外的任何内容。

\d,匹配任意十进制数字。相当于[0–9]

\D,匹配除十进制数字以外的任何数字。

4.加号和星号运算符

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

点字符用于获取任何字符的单个实例。如果我们想找到更多。

加号字符+,用于表示最左边字符的一个或多个实例。

星形字符*,用于表示最左边字符的 0 个或多个实例。

比如我们想找出所有以 d 开头以 e 结尾的子串,我们可以在 d 和 e 之间有 零个字符或者更多的字符 我们可以用:d\w*e

如果我们想找出所有以 d 开头以 e 结尾的子串,并且在 d 和 e 之间至少有一个字符,我们可以使用:d\w+e

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们也可以通过{}使用更通用的方法

\w{n} -重复\wn 次。

\w{n,} -重复\w至少 n 次以上。

\w{n1, n2} -重复\w至少 n1 次,但不超过 n2 次。

5.^脱字符和$ 美元符。

^匹配字符串的开头,$匹配字符串的结尾。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

6.单词边界

这是一个重要的概念。

你有没有注意到在上面的例子中我总是匹配子串而不是一个单词?

那么,如果我们想找到所有以 d 开头的单词呢?

可以用d\w*做图案吗?让我们看看如何使用网络工具。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正则表达式函数

到目前为止,我们只使用了re包中的findall函数,但是它还支持更多的函数。让我们一个一个地研究这些函数。

1.findall

我们已经用了findall。这是我最常使用的正则表达式函数之一。让我们更正式地理解它。

输入: 模式和测试字符串

输出: 字符串列表。

#USAGE:pattern = r'[iI]t'
string = "**It was the best of times, it was the worst of times.**"matches = re.findall(pattern,string)for match in matches:
    print(match)------------------------------------------------------------
It
it

2.搜索

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输入: 模式和测试字符串

输出: 定位第一个匹配的对象。

#USAGE:pattern = r'[iI]t'
string = "**It was the best of times, it was the worst of times.**"location = re.search(pattern,string)
print(location)------------------------------------------------------------
<_sre.SRE_Match object; span=(0, 2), match='It'>

我们可以使用以下方法获取这个位置对象的数据

print(location.group())
------------------------------------------------------------
'It'

3.代替者

这是另一个伟大的功能。当你使用 NLP 时,有时你需要用 X 来代替整数。或者你可能需要编辑一些文件。在任何文本编辑器中只有基本的查找和替换。

输入: 搜索模式、替换模式和目标字符串

输出: 被替换的字符串

string = "It was the best of times, it was the worst of times."
string = re.sub(r'times', r'life', string)
print(string)
------------------------------------------------------------
It was the best of life, it was the worst of life.

一些案例研究:

当需要验证时,在许多情况下使用正则表达式。你可能在网站上看到过类似“这不是一个有效的电子邮件地址”的提示。虽然可以使用多个 if 和 else 条件来编写这样的提示,但是 regex 可能是这种用例的最佳选择。

1.PAN 编号

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在印度,我们用 PAN 号而不是美国的 SSN 号来识别税号。PAN 的基本验证标准是所有字母必须大写,字符必须按以下顺序排列:

<char><char><char><char><char><digit><digit><digit><digit><char>

所以问题是:

“ABcDE1234L”是有效的 PAN 吗?

如果没有正则表达式,你通常会如何解决这个问题?您很可能会编写一个 for 循环,并在字符串中保留一个索引。使用正则表达式,就像下面这样简单:

match=re.search(r’[A-Z]{5}[0–9]{4}[A-Z]’,'ABcDE1234L')
if match:
    print(True)
else:
    print(False)
-----------------------------------------------------------------
False

2.查找域名

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有时我们有一个大的文本文档,我们必须从这个大的文本文档中找出电话号码或电子邮件 id 或域名的实例。

例如,假设您有以下文本:

你需要从这篇文章中找出所有的主要领域- askoxford.com;bnsf.com;hydrogencarsnow.com;mrvc.indianrail.gov.in;web.archive.org

你会怎么做?

match=re.findall(r'http(s:|:)\/\/([www.|ww2.|)([0-9a-z.A-Z-]*\.\w{2,3})',string)](http://www.|ww2.|)([0-9a-z.A-Z-]*\.\w{2,3})',string))
for elem in match:
    print(elem)
--------------------------------------------------------------------
(':', 'www.', 'askoxford.com')
(':', 'www.', 'hydrogencarsnow.com')
(':', 'www.', 'bnsf.com')
(':', '', 'web.archive.org')
(':', 'www.', 'mrvc.indianrail.gov.in')
(':', 'www.', 'mrvc.indianrail.gov.in')

|在这里是 or 运算符,match 返回元组,其中保存了()内的模式部分。

3.查找电子邮件地址:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面是一个在长文本中查找电子邮件地址的正则表达式。

match=re.findall(r'([\w0-9-._]+@[\w0-9-.]+[\w0-9]{2,3})',string)

这些都是高级的例子,但是如果你试着自己理解这些例子,你应该对提供的信息很满意。

结论

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虽然乍一看可能有点令人生畏,但在数据操作、创建特性和寻找模式方面,regex 提供了很大程度的灵活性。

当我处理文本数据时,我经常使用它,在处理数据验证任务时,也可以包含它。

我也是 regex101 工具的粉丝,经常用它来检查我的正则表达式。我想知道如果没有这个令人敬畏的工具,我是否还会使用正则表达式。

另外,如果你想在 了解更多关于 NLP 的知识,这里的是一门很好的课程。您可以免费开始 7 天的免费试用。

谢谢你的阅读。将来我也会写更多初学者友好的帖子。在 媒体 关注我,或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter@ ml whiz联系。

解释机器学习模型和预测的博弈论——最终指南

原文:https://towardsdatascience.com/the-ultimate-guide-using-game-theory-to-interpret-machine-learning-c384cbb6929?source=collection_archive---------6-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第 6 部分—沙普利值和 SHAP 包

这是翻译 ML 教程的第六部分。在以前的帖子中,我们已经介绍了几种解释机器学习模型的方法。在高度可解释的模型中,所有模型都有它们的问题,像回归这样的高偏差模型或者像决策树这样的高方差模型。我们解决了偏差和方差之间的权衡,基本上结合了几个模型,特别是高方差模型,所以我们有了最好的模型,低偏差和低方差,代价是我们不再能控制模型如何做出决策或变量之间的关系,即模型变成了一个黑盒。

第 1 部分— 可解释性介绍
第 2 部分— 统计建模—全语用指南
第 3 部分—解释低偏差和高方差模型。
第 4 部分——有可能解决偏倚和方差之间的权衡吗?
第 5 部分——可解释性的本地方法。
第六部分—(本帖)可解释性的全局方法。

可选项目:
数据科学的范围是什么
统计学简史

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在上一篇文章(第 5 部分)中,我们看到了一些解释黑盒模型的局部方法。在本帖中,我们将着眼于更强大、更复杂的全球方法,这些方法可以结合两个世界的优点,即统计模型的可解释性和机器学习模型的灵活性。
我们的黑盒模型代表将是 xgboost,但它可以是任何其他深度神经网络或集成,我们的全局可解释性模型代表将是 Shapley Value,还没有竞争对手。

首先讲一点历史和背景。

这种博弈论是什么?

博弈论是数学的一个分支,研究代理人如何在考虑冲突和合作的不同策略之间进行选择。这有点让人想起经济学的定义,经济学是研究当人们在竞争目标之间拥有稀缺商品(如时间或金钱)时,他们如何做出决定,如早起并在媒体上阅读一篇文章或获得更多睡眠。毫不奇怪,随着约翰·冯·诺依曼(杰出的数学家)和奥斯卡·莫根施特恩(经济学家)的《博弈论与经济行为》一书的出版,博弈论在经济学中被“专业化”了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Understanding Game Theory is Super Important for Action Learning Machine Models. If your prediction is passive, it only generates an output to analyze, no problem, but if you (or your client) make a decision with that prediction, you are certainly worth studying game theory. Reinforcement Learning algorithms can already solve problems of cooperation and conflict, that is, problems of Game Theory.

那么博弈论(以下仅 GT)和经济学有什么区别呢?博弈论是经济学家了解社会如何做出选择的另一个工具,而 GT 不仅研究社会中的选择,它还被用于许多领域,如计算,逻辑,政治,哲学,新闻,营销和许多其他进化生物学,以解释达尔文进化中的利他行为。博弈论是研究代理人如何在给定他们如何互动的情况下做出最佳决策的领域。这里我们开始更感兴趣,因为机器学习模型的一个问题是变量之间复杂的相互作用。我们继续。

劳埃德·沙普利——博弈论的化身

博弈论,像几乎所有的科学一样,有一个历史演变和几个父母。1713 年的沃尔德格勒夫,1838 年的古诺已经在讨论这个问题了,但是是诺依曼在 20 世纪 30 年代系统化并扩展了这个领域。很多人都知道这个领域的另一位天才,约翰·纳西,他的重要贡献(子博弈中的均衡)使他获得了 1994 年的诺贝尔奖,但我们在这里感兴趣的是 2012 年沙普利和阿尔维姆·罗斯的诺贝尔奖。沙普利被认为是该领域最伟大的理论家,他的一生与 JW 的进化交织在一起,他在不同的领域做出了贡献,如稳定婚姻问题。在 1953 年的著作中,他研究了当代理人有不同的利益/需求时,如何让公平。Shapley 解决了这个问题,但问题仍然存在,它与解释机器学习模型有什么关系?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

John Nash, Lloyd Shapley and Leon Petrosyan. Unfortunately I don’t know who the boy in the green t-shirt is but I can guarantee that he is very well matched.

为了传达 Shapley 值(所谓的公允价值),让我们在两个区域之间建立一个关系:Shapley 的合作/竞争代理将是我们的模型(X)变量。他们计划分配的“工作”将是我们目标的方差(y ),每个代理/变量支付的公允价值是该变量在预测中的权重/重要性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Dictionary Machine Learning <-> Game Theory

沙普利值 e Piscinas

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在最初的文章中,著名的机场问题被用在一个人必须决定建造多大的机场跑道以及每个代理商将为这条跑道支付多少费用的地方。我会为自己开脱数学上的严谨,创造一个更接近我们现实的问题(除非你有飞机)。在我们的例子中,
我们住在一栋有 99 名居民的大楼里,并决定建一个游泳池。于是有两个疑问:
1)要建的池子的大小是多少;
2)每人应该贡献多少。

解决这个问题最传统的方法是投票,这个泳池会不会建,有多大,如果建了,我们平摊费用,不管你会不会游泳。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

想象我们有三组人住在这栋楼里。第一组人不太喜欢游泳,他们想要一个小游泳池,比如 20 米长的。

  • B) 第二组是休闲游泳者,通常使用游泳池,他们想要一个 30 米的游泳池。
  • C) 最后一组由迈克尔·菲尔普斯和他的朋友组成,他们需要一个位于 50 米公寓的奥运泳池。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Michel Phelps happy to pay the right price on his new 50m pool.

游泳池的每一米都将花费相同的单位,1 美元。因此,如果我们做平均,我们将有一个 33 米的游泳池,价格为 33 美元,而如果我们做 50 米的游泳池,A 组和 B 组将支付比理想情况多得多的费用。Shapley 认为这是一种不公平的成本分配方式,并且对于池大小来说效率低下。为此,他想到了下面的策略。如果我们不考虑总成本,而只考虑边际成本,也就是说,因为其他人已经支付了一部分,所以多付了多少。既然汇款单干扰了结果,我们必须从这些边际成本的期望最低水平开始。因为如果 C 组先来,它将支付最多,而 A 组和 B 组将什么也不支付(同样的事情也发生在机器学习中!).当我们计算这个的时候,欧瑞卡!沙普利价值和公平价格!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Table dividing Pool construction costs by Marginal benefits. Note that we started with group A who would like a 20 meter pool with a marginal cost of 20. So we split this into 3. After that we split the extra cost of the 30 meter (+10) meter pool between B and C, therefore +5 for each. Lastly, the difference from 30 to 50 meters is paid in full by group C.

任何想要 20 米泳池的人都要支付 6.67 英镑,想要 30 米泳池的人要支付 11.67 英镑,在这种情况下,迈克尔·菲尔普斯和他的朋友们将支付 31.67 英镑购买 50 米泳池。每个人都是赢家,这是应该支付的合理价格。

在机器学习中,由于变量总是相互关联的,因此变量进入贡献的顺序有很大的不同。例如,在决策树中,我们可能会在一个非常重要的变量之前随机选择一个次要变量,这将增加错误变量的重要性。为了解决这个问题,我们将平均所有可能的排列/订单的边际贡献,这将是贡献的公允价值。这就是为什么特性的重要性使用起来如此危险。这里是我的警告,不要使用它们,它们通常是不稳定的,而且通常与人类的直觉毫无关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Example when we are using Educ and Grit to predict wages. If we add Educ first, its importance will be 300 (real) + 100 (shared with Grit). If we add Grit first, it’s 200 + 100. But when calculating the Shapley Value Let’s find the actual values ​​for the two variables, 300 for Educ and 200 for Grit!

这个理论并不复杂,但它是一个需要等待天才去思考的洞见,我们现在的问题是计算性的。一个已经知道了 60 多年的理论,为什么我们从那时起就不再应用它了?最大的问题是,她在计算上非常昂贵,我们需要等待第二个天才和慈善的灵魂来解决这个问题,并与社区分享。这些人是存在的,他们是斯科特·m·伦德伯格(Scott m . Lundberg)和 T4(Su-in Lee),他们写了精彩的文章解释了如何计算沙普利值,并在【SHAP】(SHapleyAadditive exPlanations)上提供了代码。我们现在可以计算诺贝尔奖和开源软件包支持的变量的数量。我们生活在一个多么美好的世界啊!

解释没有 Shapley 值的黑盒模型

让我们用一个包含房价和特征的数据集作为例子来说明我们的想法(这里有代码)。

让我们用热图和关联图来看一下相关性,以了解重要性的线性顺序:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

On the left our famous correlation heatmap, and on the right our correlation graph, both give the same idea, but I always prefer the graph because it gives a better idea of ​​which groups of variables correlate more quickly.

第一个错误是被简单的相关性冲昏了头脑。我们已经在第 2 部分中看到,变量都是相互关联的,当我们运行模型时,重要的是变量相互独立解释的程度,因此解释最多的变量可能解释与目标/ y 方差相同的方差。有时,相关性较低的变量与其他变量(即更具外生性的变量)差异如此之大,以至于它们变得更加重要。一种分析方法是线性回归:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Same regression run twice with pure data (left) and normalized data (right)

现在我们需要小心,估计的 Beta 值(上表的 coef 列)不能被解释为可变权重,因为它取决于 X 方差。例如,纬度变量有一个巨大的系数 6.74e5,但变量 It 的范围从 47,155933 到 47,7777624。
size _ house 变量的系数较小,范围为 290-13540。这里衡量变量重要性的一种方法是看 t 检验,变量越大(绝对值)越重要,或者,正如我更喜欢在运行回归之前归一化数据(右总结)。
请注意,所有指标都是完全相同的,R、误差、t 检验、除了系数值之外的所有指标都是一样的,因为我们可以对数据进行归一化,并且可以直接比较这些值,而不会丧失一般性。因为我们已经失去了一些读取估计系数的敏感性,所以对线性回归进行归一化是不常见的。只有当我们使用正则化方法时,才有必要进行归一化。

此外,请记住,除非明确传递,否则线性回归不了解变量如何相互作用,因此它们可能有一些变量,即使相关性很差,也可以通过使模型更具解释性来帮助改变其他变量的权重。最后,我们的致命弱点是,这是一个线性模型,因此任何非线性都必须明确传递,否则它将成为偏差。所有这些都将在本系列的第 2 部分中得到最好的探讨。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Why we don’t use Xtreme Gradient Boosting

让我们使用我们的 Megazord 算法 XGBoost,它几乎解决了所有这些问题,因为它是一个低偏差算法(由于树结构,参见第 3 部分)和低方差算法,因为它是一个非常聪明的单个树组件(参见第 4 部分),并且低于 XGBoost 产生的 5 个特征重要性:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The 5 feature importance types available from XGBoost, I don’t recommend using any, but if you’re in a hurry, go with Total Cover.

用哪个?我可以写一篇很长的文章来解释每一个的机制,它的优点和缺点,但是如果我们说:不要使用它,我们很快就会知道 Shapley 值!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Summary of the different methods of ordering the importance of variables. The order of the variables in the first column is the * fair * order with Shapley value and the only method that can put the variables in the same order, in this case, was Total Cover, and although the order is the same, the dimensions are different.

用 Shapley 值解释黑盒模型

这里,我们将删除算法的所有参数化,只关注 SHAP,但必须完成控制偏差和方差之间的权衡、插补、平衡和其他步骤的所有步骤,否则模型可能会解释错误的变量。训练完模型后,我们执行以下操作:

要运行 shap,只需两行:

解释者= shap。tree explainer(model)
shap _ values = explainer . shap _ values(X)

神奇的事情发生后,首先是我们的功能重要性

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Feature importance with Shapley Value, among several advantages, such as having a solid theory behind, being more like human intuition, being stable, answers a number of mathematical axioms that can be found in the original paper.

以下是我们扩展的功能重要性,以及一些有趣的见解:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Detailed Importance Feature.

这个图表第一次看的时候很吓人,但是让我们看看它的不同维度。

它由点(这些彩色点)组成,数据集中的每个观察值为每个变量生成一个点,即使变量为空并由灰点表示。请注意,变量的顺序与特征重要性顺序相同,这不是偶然的,它是通过将颜色表的所有权重相加而形成的。

另一个维度是分布的形状,当你有一大堆点时,它把球堆成躺着的小提琴的形式。

第三个维度是点的位置,注意在零点有一个垂直轴,这个轴上的点表示变量没有积极或消极的影响,如果点在这条线的右边,它积极地影响目标,而在左边,消极地,离轴越远,影响越大。

第四个也是最后一个维度是球的颜色,但这更简单,蓝点表示低值,红点表示高值,这是为每个变量做的。

了解不同的维度让我们分析结果。首先,我们有房子大小这个变量,正如标准化回归告诉我们的,大房子对价格有正面影响,小房子有负面影响,这很明显,但我们走得更远。请注意,0 轴右侧的分布有一个长尾,蓝色已经全部集中在 0 附近,这表明非线性,大房子影响很大,但通过减小房子的大小,模型不再对房子的大小敏感,好像房子的大小只在阈值之后才重要。

is_waterfront 变量也有这种解释,但在这种情况下,它是一个哑变量(只取值 0 和 1),在线性回归中,我们应该只有一个影响值用于此变量,但在分析汇总时,我们有不同的值。为什么?因为模型允许变量通过改变它们的值来相互作用。

分析个人预测

这个软件包的另一个巨大优势是能够向我们解释一个特定的预测,让我们用一个单独的数据集来预测它的价格:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Explaining the prediction of the first row of the dataset. This house has a 240k yhat. Note that Shapley Values ​​values ​​do not understand the entire house value, as they only represent the difference to the average value.

在这里,具有这些特征的房子的预测价值是 240097 美元。每个变量用一个彩色条表示,并表示它对预测的影响。蓝色条减少预测值,红色条增加预测值。

第二个例子是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The same variable can have different weights or even different signals, because in low bias models like Boosting, the variables can interact in complex ways.

有人会想,如果我们对所有的观测数据旋转这些预测,把这些条像塔一样堆叠起来,我们就能从宏观上看到变量的行为。作者也想过,但他们把这座塔转了 90 度:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

We can notice that both the impact of the variables

这个图表的一个有趣的特点是它是交互式的,你可以过滤特定的变量,按不同的影响排序,并对变量在你的模型中如何工作有丰富的见解。

最好的是最后,变量之间的依赖图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这些图表显示了变量如何相互作用,改变彼此的值。让我们关注右上图。房子的大小。请注意,它正在增长,甚至让人联想到线性增长,但为什么对于相同的房屋大小值,预测会有不同的影响?让我们把重点放在 4000u 大小的房子上。影响有很大的差异,因为其他变量与大小相互作用。尤其是纬度变量(赋予点颜色)。请注意,对于 2000u 以下的房屋,低纬度(蓝色)增加了房屋的价值,而在 2000u 之后,情况就相反了,
高纬度增加了同样大小的房屋的价值。当我们更仔细地分析数据时,我们注意到纬度较高的地方是城市中心湖边的房子,随着纬度的降低,这些房子变成了田地房子,更大的土地。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Example of interacting variables. Here we see the value of the latitude variable changing the return of house size to house price, and the real-world explanation lies in the nonrandom distribution of real estate. Houses near the lake are smaller and more expensive, and houses far from the center are usually less expensive per square meter and larger.

如果我们有一个线性模型,这些点必须排列在一条线上。但是由于这是一个低偏差模型,他可以理解这些复杂的行为。要进行真正的测试,让我们运行相同的 XGBoost,但 max_depth = 1,因此模型仍然可以理解非线性,但不能与变量交互,结果正如预期的那样,消除了相同 X 值的预测方差:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Trained model with maximum depth of only 1 tree break. Note that for the same size_house or latitude there is always only one impact value on the target as the variables stop interacting.

究竟如何解读沙普利价值?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Shapley value of a feature is its contribution to target prediction, weighted and summed over all possible permutations between features.

我们已经说过,这是由坚实的理论支持的划分变量权重的唯一公平的方法。但是这个数字的确切解释是什么呢?

Shapley 值是该特征对预测值和平均值之间的差异的贡献,即我们到目前为止分析的所有数字都必须根据平均值进行解释。这在单个预测图中很容易看到,因为对于房价预测,我们几乎没有影响价格的变量,因为实际上它们正在改变预测的平均值。

次要用途

这可能的用途非常广泛,在作者的 github 库中,他给出了其他非常酷的用途,如排序、自然语言和图像,下面是一些来自那里的例子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Risk of death by age. The interpretation would be as follows: If you are under 40 you are more likely to die for women. But if you are a woman and succeed and survive at age 40, the likelihood of death drops sharply and increases if you are a man.

SHAP 只为模特工作吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SHAP typically works with deep learning models.

不,SHAP 可以将深度神经网络应用到不同的环境中!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

In this example the author uses a deep neural network to predict the species of animal, and the SHAP is able to display which pixels (since each pixel is a feature) impacts the predictions more or less.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Similar to the previous explanation. Here Slundberg uses the classic MNIST dataset to explain digit predictions.

现在,你已经拥有了这个打开机器学习算法黑匣子的伟大工具,不要只是做出被动的预测,你现在可以向你的经理解释什么是推动你的业务的最佳杠杆。我必须开发的一个真实的例子是欺诈预测,在这种情况下,仅仅显示合同欺诈的可能性是不够的,我需要解释为什么这种联系被认为是欺诈,SHAP 帮助了我。例如,这可能有助于理解如何防范未来的欺诈。

我经常使用 shap 的另一个用途是在统计建模中。我们可以运行一个类似 XGBoost 的模型来了解变量的行为,哪些变量与哪些变量的交互更多,以回到我们节省时间的线性模型。

我使用 SHAP 的最后一个用途是了解我的模型是否有泄漏,即作为未来变量的信息泄漏。当我们对数据建模时,这是很常见的,我们无法控制表的构造,因为在绘制摘要时,最能说明问题的空值是明显的,Shap 值的一角会出现一系列灰点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SHAP is also your friend when debugging your model.

也就是说,你可以使用 SHAP:
—了解你的模型在做什么,从而更加信任它;
—特色工程调试;
——应用这些预测帮助人类决策。例如,如果员工离开公司的概率很高,
如果解释变量可以是工资或其经理,则解决方案会有很大不同。
—帮助将因果推理模型建模为线性回归。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Beware, although it is a fairly robust method, it does not mean that your estimates are causal. For a causal analysis all measures of the statistical booklet remain valid.

这篇文章中使用的所有代码都可以在 kaggle 中找到

另请参阅我们的系列文章:

LinkedIn GitHub

对 Coursera 上学习如何学习课程的深入评论

原文:https://towardsdatascience.com/the-ultimate-skill-learning-how-to-learn-9e2fabdc7f1e?source=collection_archive---------7-----------------------

如果你想学点什么,就要学会如何学习

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

@mrdbourke studying at a desk. Outtake from the video version of this article on YouTube.

如果你能拥有任何超能力,那会是什么?

飞行?

隐形?

超强实力?

当我年轻的时候,我的回答总是‘我有超能力去使用任何超能力。’相当于精灵出现时许下更多的愿望。

如果你再问我一次,我会修改我的答案。

我会有学习任何东西的超能力。

类似,但不是太多的逃避。

但是如果你可以选择任何一种超能力,为什么还要费神去学呢?为什么不直接去了解一切呢?

因为学习是有趣的部分。什么都知道会是一种无聊的生活。你见过一个 4 岁的孩子如何走进公园吗?现在和 40 岁的人相比。

如果你能学会如何学习,你就能把它应用到任何其他技能上。想学编程?运用你的学习能力。想学中文?运用你的学习能力。

为了提高我的学习能力,我参加了 Coursera 上的学习如何学习课程。这是有史以来最受欢迎的在线课程之一。我知道为什么。

它以简单易懂的方式教授。这些概念可以立即应用。甚至在整个课程中,当你在第 1 部分学到一些东西时,它会在第 2、3 和 4 部分再次出现,强化新的信息。

如果你以前看过这个课程,并且正在考虑报名,那么现在就关闭这篇文章,这样做是值得的。

否则,请继续阅读一些我最喜欢的外卖清单。

第一部分——什么是学习?

集中和分散的思维

这样的问题怎么回答?什么是学习?

本课程通过结合两种思维方式,集中和分散,对其进行分解。

集中思考包括致力于一个单一的任务。比如看这个帖子。你正在集中精力去理解屏幕上的单词是什么意思。

当你不专注于任何事情时,就会出现分散思维。你可能在大自然中散步或躺在床上准备睡觉时经历过这种情况。没有思想,但同时,所有的思想。

学习发生在这两种思维的交叉点上。

你专注于某件事一段时间,然后休息一下,让你的想法扩散。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

If the brain was a flashlight, focused thinking would be a single intense beam of light. And diffused thinking would be a wider but less intense beam.

你有多少次被困在一个问题上,然后在淋浴时想到答案?

这是两种思维在起作用的一个例子。它也不总是有意识地发生。

你是否曾经不知道下一步该做什么,把它留了一夜,回来后立刻看到了解决方案?

如果你想学点什么,利用这两种思维是很重要的。把集中注意力的紧张时期和无所事事的紧张时期结合起来。

学习结束后,散散步,打个盹儿或者无所事事。别为此难过。你给了自己最好的机会让分散的思维去做它的事情。

拖延症和如何克服拖延症

你在解决一个问题。你到达了一个难点。继续下去很不舒服所以你开始觉得不开心。为了修复这种感觉,你寻找一些愉快的事情。你打开另一个标签,脸书。您会看到红色通知并点击它们。有人和你联系的感觉真好。你知道莎拉邀请你参加她的生日。你看看邀请名单,加里也在。加里在那里。你不太喜欢加里。在中学的时候,他是个混蛋。嘿兄弟!他拍你的背时会大叫。很难。多滚动一点。一些新鞋的广告。你昨天看到的那些。“它们看起来真不错,黑色配橙色,”“我要去点它们,”你想。

你低头看你的笔记。你忘了你在哪里。

刚刚到底发生了什么?

你在解决一个问题。你到达了一个困难点。这很不舒服,你开始感到不开心。你寻找快乐的事情。成功了。但只是暂时的。现在你又回到了原来的位置,你甚至对自己分心的事实感到更加沮丧。

那么怎么修呢?

课程建议使用番茄工作法。我可以为这一个担保。

很简单。

你设置了一个计时器,在此期间除了你想做的事情什么也不做。即使变得困难,你也要继续努力,直到计时器结束。

一个典型的番茄定时器是 25 分钟,之后有 5 分钟的休息时间。在休息期间,你可以在开始另一个 25 分钟的会议之前做任何你想做的事情。

但是您可以使用工作/休息时间的任意组合。

例如,为了完成这个课程,我用了 1 小时的番茄计时器,中间有 15-30 分钟的休息时间。

一个小时的学习。
15 分钟休息。
1 小时学习。
15 分钟休息。
1 小时学习。
30 分钟休息。
1 小时学习。

如果 25 分钟太长了,那就从 10 分钟开始,一路向上。

为什么这样做有价值?

因为你无法控制是否能解决一天工作结束前出现的每一个问题。

但是你可以控制你投入的时间和精力。

可以控制:一天 4 小时的专注工作。

不能控制:解决一天中的每一道作业题。

用睡眠的方式更好地学习

我们已经讨论过集中思考和分散思考。睡眠也许是进行无意识扩散思维的最佳方式。

专注模式对于脑细胞就像举重对于肌肉一样重要。你在瓦解他们。

睡眠为它们提供了一个修复和形成新连接的机会。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Dr Terrence Sejnowski talks about how new synapses (connections) are formed on the dendrites during sleep.

像爱因斯坦和萨尔瓦托勒·达利这样的著名思想家会一次睡 10 个小时,并且一天打几次盹,这是有原因的。

他们知道清除白天积累的毒素对大脑至关重要,这些毒素会阻碍专注的大脑。

下次你想通宵学习的时候,你最好睡个好觉,第二天再继续。

间隔重复,每天一点

杰瑞·宋飞每天都写笑话。他的墙上有一个日历,每天他写笑话的时候,都会在上面打个 X。因为他每天都写,如果你看日历,你会看到一连串的 X。

一旦链条开始了,他所要做的就是继续下去。

不要断链。

这种技巧不仅适用于写笑话。它也可以用来学习。

学习如何学习课程中,他们提到了一个类似的概念,叫做间隔重复。

间隔重复包括在短时间内练习一些东西,随着你做得越来越好,增加每个时间段之间的时间。

例如,当开始学习中文时,你可以每天练习一个单词,坚持一周,直到你熟练为止。然后过了第一周,你一周练两次。然后每月两次。然后每两个月一次。最终,它会在你的脑海中凝固。

当你结合这两个概念时,最好的学习就发生了。不要通过每天练习一点来打破这个链条,通过更经常地复习困难的东西来加入间隔重复。

首先,你可以给自己设定一个目标,在一个给定的话题上每天吃一个番茄。一周后,你会在上面花 3 个小时。一年后,你将积累超过 150 小时。每天只有 25 分钟还不错。

**Bonus:** A great tool for spaced repetition is the [flash card software Anki](https://apps.ankiweb.net/) and for not breaking the chain, I recommend the [Don’t Break the Chain poster](https://www.writersstore.com/dont-break-the-chain-jerry-seinfeld/) from the writer’s store.

第 2 部分—分块

课程的第二部分介绍组块。多个神经元一起放电被认为是一个组块。组块是以一种它们一起工作的方式调用这些区域的过程。

为什么这很有帮助?

因为当多个神经元块一起放电时,大脑可以更有效地工作。

你如何形成一个组块?

一个组块是通过首先抓住一个主要概念的理解,然后弄清楚在哪里使用它而形成的。

如果你开始学习编程,试图背诵一门语言是不明智的。相反,你可以从一个简单的概念开始,比如说循环。你不需要从里到外理解这种语言就能知道在哪里使用循环。相反,当你遇到一个需要循环的问题时,你可以调用大脑中的循环块,并根据需要填充拼图的其他部分。

刻意练习:做困难的事情

形成一大块很难。首先,需要学习的重要概念有哪些?第二,你应该在哪里应用它们?

这就是为什么你应该花时间和精力去创造它们。不要学习每一个复杂的细节,而是找出主要的概念是什么。通过自我测试找出如何应用它们。解决例题。

做难的事情的过程叫做刻意练习。在你觉得更困难的事情上花更多的时间是一个普通人成为伟大的人的方法。

不要被旧思想所束缚

芭芭拉·奥克利博士引入了德语中的“心态”一词。

但是意义比一个单词的翻译更深刻。

每年你都会升级智能手机的软件。伴随着几项性能改进,一整套新特性也随之而来。

你的思维方式上一次软件升级是什么时候?

Einstellung 的深层含义描述了一种旧的思维方式阻碍了一种更新、更好的思维方式。

成为某方面专家的危险是失去像业余爱好者一样思考的能力。你对一直有效的方法如此在行,以至于对新事物视而不见。

如果你正在学习新的东西,尤其是这是你一段时间以来第一次学习,保持警惕是很重要的。保持开放的心态,不要害怕问愚蠢的问题。毕竟,唯一愚蠢的问题是没人问的问题。

回忆—你刚刚学到了什么?

到目前为止,在你读过的书中,最突出的是什么?

不要向上滚动。把文章放下,想一想。

你会如何向别人描述它?

不一定要完美,用你自己的话去做。

这样做就叫召回。不用回头看,把你刚刚学到的信息带回你的脑海。

任何题目都可以。看书?完成后,把它放下,用几句话描述一下你最喜欢的部分。

完成了在线课程?写一篇关于你最喜欢的话题的文章,不要回顾课程。听起来熟悉吗?

练习回忆是有价值的,因为它避免了能力的错觉。一遍又一遍地重读同样的东西,会给你一种理解它的错觉。但是回忆它并用你自己的话再现信息是一种找出你知道哪些部分和不知道哪些部分的方法。

第三部分——拖延和记忆

习惯僵尸

早上在你家煮咖啡,你要想多难?

不是很喜欢。如此之少,你的半睡眠僵尸模式的身体可以在厨房里摸索着用开水,仍然设法不被烧伤。

怎么会?

因为你做得够多了,这已经成了一种习惯。穿衣服或者刷牙都是一样的。这些事情你可以自动完成。

习惯在学习中起什么作用?

关于习惯,几乎任何事情都可以变成习惯。包括拖延症。

上面我们谈到了用计时器来对抗拖延症。但是你如何从习惯的角度出发呢?

学习如何学习课程的第 3 部分将习惯分成四个部分。

  1. 提示 —触发接下来三个步骤的事件。我们将使用你的手机关机的例子。
  2. 套路——当你被提示触发时会发生什么。在电话的例子中,你检查你的电话。
  3. 回报——你遵循常规所获得的良好感觉。检查你的手机,你看到一个朋友的信息,这感觉很好。
  4. 信念——强化习惯的想法。你意识到你检查了你的手机,现在你对自己说,“我是一个容易分心的人。”

你怎么解决这个问题?

你只需要移除四个步骤中的一个,其余的就会崩溃。

你能弄清楚这是什么吗?

暗示。

如果你的手机在另一个房间会怎么样?还是关机了?

提示永远不会发生,后续步骤也不会发生。

去除暗示的技巧不仅仅适用于拖延症。它也可以用于其他习惯。反之亦然。如果你想养成一个好习惯。考虑这四个步骤。

为了养成一个好习惯,创造一个线索,围绕它制定一个常规,如果你坚持到底,给自己一个奖励,你会开始形成一个信念,你是那种有好习惯的人。

字典不是产品在过程之后出现的唯一地方

思考你学习的结果是让你气馁的最快方法。

为什么?

因为没有尽头。学习是一生的旅程。

历史上从来没有人说过,‘我已经学得够多了。’

如果他们有,他们在撒谎。

我从小就一直说英语。即使做了 25 年的演讲,我仍然每天都犯错误。但是对我的英语水平感到沮丧会有帮助吗?号码

我能做什么?

我可以接受了解演讲和英语的一切是不可能的。取而代之的是,关注说话的过程。

这个原则可以和你试图学习或创造的任何东西联系起来。

如果你想更好地写作,最终产品可能是一本畅销书。但是如果我让你去写一本畅销书,你会写什么?

担心一本畅销书会有什么内容会让你精疲力尽。关注过程,每天写点东西会有用得多。

释放你的工作记忆,在前一天晚上制定一个任务清单

奥克利博士说,我们在工作记忆中大约有四样东西的空间。但如果你和我一样,可能更接近一。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Writing a task down free’s up a slot in your working memory.

一些和我一起工作的人有三台显示器,所有的事情都在上面发生,我不知道他们是怎么做到的。我坚持一个,有任务需要就推到两个。

如果我有第三个显示器,那就是我随身携带的 A5 笔记本。是我的私人助理。每天早上,我都会写下一张清单,上面列有我想在一天中完成的大约六件事情。有时候,我会在房间的白板上写下同样的清单,来真正清理我的大脑。

即使当我正在进行一个专注的会议,吃了 12 分钟番茄,事情还是会突然出现。这个想法没有停止番茄,而是停留在纸上。释放工作内存。

课程建议在前一天晚上列一个清单,但是我也喜欢早上做第一件事。把事情放下意味着它们已经不在你的脑海中,你可以把你所有的脑力投入到集中思考中,而不是担心你以后要做什么。

别忘了加一个收尾时间。一天中你会放弃的时候。

为什么?

因为有截止时间意味着你有一个固定的时间框架来完成任务。一个固定的时间表创造了另一个避免拖延的理由。

为专注的工作设定一个截止时间意味着你会给你的大脑时间来转换到分散的思维。谁知道呢。你在 4:37 解决不了的问题可能会在你 8:13 洗澡的时候自动解决。

第 4 部分——文艺复兴式学习&释放你的潜能

学习不是直线进行的

你可以整个周末都学习,然后在周一回去工作,没有人会知道。

你可以整个星期都在研究一个问题,但是到了周末,你会觉得情况比开始时更糟。

塞伊诺夫斯基博士知道这一点。并强调学习不是线性发生的。

学习困难的技能不会在几天、几周或几个月内发生。对大多数事情来说,几年是合适的时间框架。

我想知道我能多快学会机器学习背后的所有数学概念:微积分、线性代数、概率。我在 Quora 上找到一个关于它的问题。

一个研究机器学习 30 年的人回答说,“几十年。”然后解释了他是如何发现新事物的。

我很不耐烦。我关注的是产品而不是过程。

学习看起来更像一个破楼梯,而不是一条直线。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Sometimes you’ll go in circles, other times it’ll feel like you’re in decline, then somehow you’ll start heading in the right direction (at least it seems that way).

查尔斯·达尔文是大学辍学生

你是如何从医学院辍学到发现进化论的?

简单。你是查尔斯·达尔文。

但如果你不是查尔斯·达尔文呢?

别担心,不是每个人都是查尔斯·达尔文。

再也不会有第二个查尔斯·达尔文了。历史会重演,但永远不会完美。不如把它想成押韵。历史与未来押韵。

查尔斯·达尔文从医学院辍学,这让他的医生家人非常失望。然后他以裸体主义者的身份环游世界。

岁月流逝,但有一点从未改变,那就是他一直以孩童般的心态看待大自然中的事物。

在学习的间隙,他每天散步多次。专注的心和分散的心。

选修任何一门生物学入门课程,你就会知道接下来发生了什么。

我把几十年的故事浓缩成句子,但重点是每个人都必须从某个地方开始。

第一年你学新东西的时候,你很差劲。第二年你会更糟糕,因为你意识到你有多少不知道。

没有必要羡慕那些似乎知道自己在做什么的人。每个天才都是从某个地方开始的。

说他能的人和说他不能的人通常都是对的。

该课程认为亨利·福特说过上述的话。但是网上告诉我这是孔子的。

没关系。谁说的也是对的。

如果你相信你学不到东西,那你就对了。

如果你相信你能学到东西,那你就对了。

奥克利博士 20 多岁时是一名语言学家。她不喜欢数学。那么她是怎么成为工程学教授的呢?

通过改变她对她所能学到的东西的信念。

我曾经告诉自己,“我永远不会成为最好的工程师。”

我在一次聚会上对某人说的。他们回答说,“不是那种态度。”简单而深刻的陈述。最好的都是。

无论你决定学什么,都是从你告诉自己的故事开始的。假装你是你自己学习旅程故事中的英雄。挑战将会出现。这是必然的。但是主人公是如何处理它们的呢?你决定吧。

学习:终极元技能

对自己的学习负责是你能做的最重要的事情之一。

学习是终极元技能,因为它可以应用于任何其他技能。所以如果你想提高你做任何事情的能力,学会如何学习是你应该花时间去做的事情。

我在这篇文章中提到的东西只是触及了学习如何学习课程的皮毛。我忽略了锻炼,和别人一起学习,在不同的地方学习。但是你可以想象这些有什么好处。

如果你想更深入地了解,我强烈建议你去看看完整的“如何学习”课程。我支付了证书费用,但并不需要。你可以免费获得所有的资料。然而,我发现当我付钱的时候,我会更认真地对待事情。而这门课的信息是值得付费的。

如果你不为去年的自己感到尴尬,说明你学得还不够。—阿兰·德波顿

不断学习。

I learn best from combining text with visuals. If you’re the same, you might find the video version of this article helpful.

数据科学家数据可视化的终极技能

原文:https://towardsdatascience.com/the-ultimate-technical-skill-in-data-visualization-for-data-scientists-73bc827166dd?source=collection_archive---------5-----------------------

超越 ggplot2、matplotlib、seaborn、Shiny、Dash、R 或 python 的是什么。这些是在数据可视化方面达到下一个水平的技能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

摘要

任何处理数据的人都必须能够将数据可视化。随着用户界面(UI)技术最近的发展,对 UI 的期望大大增加。我主张让数据科学家创建富 web 应用程序的通用框架鼓励令人沮丧的开发体验,并且学习一些 web 开发中的基本技能将极大地改善开发体验。

介绍

人们普遍认为,数据是许多企业的新黄金,因为它允许更好的决策和更好的洞察力。我们总是需要查看数据:在勘探阶段,在模型诊断阶段或在生产期间。从 Excel 到 Tableau,通过python matplotlib,工具的复杂程度各不相同。不同的需求将导致自动化过程中不同类型的痛苦。尽管如此,我相当肯定我们都希望展示一些漂亮、别致和交互式的仪表盘和故事,并把它们分发给我们的利益相关者或观众。标准流程是将我们的解决方案打包成 web 应用程序(一个应用程序在客户端设备上运行部分逻辑,另一个在服务器上运行)。

根据我的经验,使用数据科学中典型的工具包创建 web 应用程序会导致令人沮丧和愤怒的时刻。然而,这个问题有一个非常好的解决方案,我希望它能像对我一样帮助你。剧透一下,我的解决方案包括学习 Lisp(it 的一种特殊方言),这是与人工智能相关的最古老的编程语言之一。

本文的目标读者是那些需要显示工作数据的人,尤其是那些需要创建 web 应用程序中常见的高度定制和适应性可视化的社区。也就是说,任何需要创建定制用户界面的典型数据科学家都可以从阅读中受益。

在继续阅读之前,如果你从未使用过ggplot2plotly,我肯定地建议你先了解一下它们,因为它们教授了一些数据可视化的标准逻辑,并提供了一个你应该从图中期待什么的基线。

故事

一种观点认为,有了背景,想法总是更容易被理解。我的背景相当普通:我总是喜欢解决问题,所以我走的是数据分析师的典型道路(或者你喜欢用的任何同义词:科学家、定量分析师、统计学家)。在大学里,我出于对该领域的热爱,在第一个学位时研究了一个不切实际的领域(数学)。在我的第一份工作中,我开始欣赏统计学、机器学习和编程,这使我在网上纳米学位和第二个正式硕士学位(不要评价我,幸好教育在瑞士很便宜)的空闲时间里深入研究它们。

这段时间,我投入时间用他们的标准包研究了Rpython进行数据分析。幸运的是,我强迫自己学习和使用 emacs,这让我成为一名更快乐的专业人士。

至于我的工作,随着人们逐渐习惯于与智能手机或网络浏览器进行交互,我逐渐增加了构建动态分析、报告和解决方案的需求。我在无数场合试图学习javascript,但我总是发现它太不直观,这导致我依赖Rpython来解决我的问题。我专业用了两年R Shiny。我们的故事从这里开始。

问题

在数据科学家中,Rpython是最突出的语言,它们都有一个事实上的标准库来创建 web 应用程序: ShinyDash 。两者都允许创建 web 应用程序,在宿主语言和javascript - js代码之间建立桥梁。它们还处理浏览器(前端)和服务器(后端)之间的通信(例如数据传输和用户交互),其中主机语言的进程运行直到终止。此外,它们处理所有的异步js交互,并且都提供了简化应用程序部署的解决方案。公平地说,他们在这些方面做得相当不错。然而,我认为合并前端和后端也会带来很多不便,这大大降低了这些框架的价值。

  1. 用户已经习惯了一个非常平滑、快速和动态的行为界面,它有许多奇特的特性,比如表单中的错误消息或动态 UI。由于目标是完全避免js,shiny 和 dash 用户在定制 HTML 输出以满足期望方面的表达能力降低了。例如,如果没有 *js*来创建一个颜色取决于浏览器宽度大小的按钮,这将是相当具有挑战性的。如果存在任何解决方案,它将涉及前端和后端之间的通信循环,导致未经打磨的体验。
  2. 真正模块化的组件很难在两种框架中编写。主要原因是节点 HTML 标识符和后端效果之间的强烈耦合,这是在 HTML 节点抛出用户事件时触发的。此外,对于Shiny,模块化代码很难实现,因为环境、名称空间或模块在 r 中并不常见
  3. 最后,这是最重要的一点,两种框架都会导致令人沮丧的开发体验。基于这些包的项目中的反馈周期慢得惊人,令人痛苦:当在生产环境中开发新的功能、组件、视图或选项卡时,后端通常会在每次源代码发生变化时完全重启,web 浏览器通常需要刷新,开发人员需要恢复应用程序的特定状态,以查看修改是否达到了预期目的。在任何合理规模的项目中,数据和包将在开始时加载,开发人员将为每一次迭代变更支付初始化成本。在最坏的情况下,由于语法错误,整个应用程序在重新加载时崩溃。(注意,两个框架中都有一个模拟热重装的 hack:后端监听一个文本区域,可以评估[在eval命令的意义上]写在里面的代码。也就是说,这可能会导致严重的安全问题。)

解决办法

解决的办法是把前端和后端再分一次,学会如何控制前端。这将解决前面列出的所有问题:

  1. 您可以充分利用它并控制前端,随着计算在 web 浏览器上呈现,所有 UI 操作都不再需要与后端通信。
  2. 大多数前端技术可以处理模块或名称空间。所以你可以有几个名为typedate的变量,只要它们位于不同的名称空间,就不会有混淆。此外,由于减少了与服务器通信的必要性,代码将更加模块化,因此更加健壮。
  3. 热模块替换(或热重装)也是由大多数框架实现的。最后一点是你应该说服你去尝试的最好的单一特征,如果没有这个特征,你将无法回到过去的生活。

艰难而不雅的方式

学习jsReactJS(破折号环绕其中)。这是一条艰难的道路,因为如前所述,js是一种有许多怪癖的艰难语言。我不是js专家,所以我不会提出任何强有力的主张,但我认为这条道路需要大量的投资

寄生语言

寄生语言是通过将语法转换成底层技术来利用现有语言及其工具的编程语言。比如 Scala,分别是 TypeScript,分别是 Java 的寄生语言js。寄生语言的优势在于它们可以添加某些范例,并抑制目标语言的一些弱点。例如,TypeScript 将类型属性添加到js

我声称 ClojureScriptcljs,一个针对jsClojure 的版本,是大多数数据科学家的完美候选。

因为cljs代码最终是js代码,所以您可以享受同样的速度优势。名称空间是cljs的标准特性,比在 Javascript 中更容易使用。通过拨轮阴影 cljs 使热装成为可能。

尽管如此,前面所有的观点都可以用js来实现,那么我为什么更喜欢cljs

这种语言非常简单,非常稳定,旨在产生优雅而简单的代码。它消除了大多数js的陷阱,最佳实践鼓励一种模型,其中数据是代码的中心,而不是容器(不再有 1500 个类的项目)。此外,它还带有一个久经考验的标准库,用于操作您的数据。我明确推荐阅读这个和观看那个来看看cljsjs的好处。

后端

至于后端,进行计算的部分,执行业务逻辑的代码将保持不变,但是需要在代码周围添加一个包装器,以响应来自前端的 HTTP(S) 请求。这很容易用R 铅管python 烧瓶来实现。

对于操作可以由客户端执行的简单情况(例如,按组过滤和分组表格),输入数据可以存储为csvjson,一个简单的 HTTP 服务器(在根文件夹中的python3 -m http.server命令的意义上)就足够了。见我的个人网站举例。

权衡

学习cljs也教会他们的用户对任何新的解决方案持怀疑态度。采用cljs有哪些弊端?

在功能方面,数据科学家现在负责客户端和服务器之间的通信,这意味着我们需要学习如何设计一些基本的 API。也就是说,这意味着后端为来自客户端的不同 URL 请求返回不同的数据。

生产部署不同于 RStudio 和 Plotly 提供的解决方案。也就是说,由于该架构是 web 应用的标准架构(后端和前端分离),因此有几个云提供商和教程可以为您提供支持。

代码库中现在有两种语言。引入一种新的语言及其工具总是伴随着风险。然而,我坚信有形的好处远远大于潜在的风险。

额外好处

学习cljs和使用提议的架构还有许多额外的好处。

  • 因为cljs是 Lisp 方言,因此是函数式编程语言。
  • 正如js可以瞄准网络、桌面和移动客户端一样,cljs也可以。
  • 使用Clojure将会非常容易,然后您也将能够在 Java 虚拟机上编程。
  • 来自 Google Closure 的工具,比如代码分割和死代码消除,对cljs来说是可用的,它们将优化你的应用程序的代码大小,带来更平滑的用户体验。
  • 你可以使用任何 js可视化框架,尽管plotly是一个很好的默认选项。听说过织女星吗?您现在可以使用它,而不依赖于Rpython的包装器。
  • 多亏了cljsjs之间的互操作性,你可以在你的语言的包装器上利用任何用js编写的ReactJS组件。你甚至可以重用 dash-html-components。
  • 在某个时候,你会学到 emacs,这是有史以来最好的生产力工具。再加上你的 Lisp 知识,你就可以随心所欲的配置了(但不要同时学习 emacscljs)。

结论

在本文中,我提倡数据科学家花时间学习 web 开发中的关键技能(cljs),以改善他们在制作这些应用程序时的开发体验。虽然R Shinypython Dash对于他们最初的目标来说是很好的工具,但是它们缺乏现代前端技术的关键特性,比如不刷新浏览器的热模块重新加载,这导致了次优的开发体验。

支持cljs胜过js的观点也已经被提及。但是我想提下一个论点来最终说服任何人去尝试cljs:用cljs创建可视化和 web 应用程序是非常有趣的。你解决问题的速度和大脑思考的速度一样快,这让你保持专注和创造力。我真的希望你能试一试!

在后续文章中,如果有兴趣,我会提供一个项目模板,并指导您完成。与此同时,我将邀请您通过访问以下链接来探索这种美丽的语言。

你怎么想呢?我错过了问题的核心吗?对于你的用例来说,shinydash够好了吗?

收场白

有一段时间,因为上面提到的所有原因(Shiny确实让我受到了精神创伤),我努力逃避我在 UI 方面的职业责任。毕竟,我是一名数据分析师/科学家,我更感兴趣的是发现模式,根据数据塑造我的团队的决策,并最终为我的客户创造更好的服务和产品。

然而,一个为 web 开发塑造我的团队基础设施和技术堆栈的机会出现了。一听说这个项目,我就知道我会被包括在内(不管我喜不喜欢)。因此,我做了任何人都会做的事情:我把自己的命运掌握在自己手中。我已经知道了cljs的许多优点和缺点,并决定为它努力游说。

不知何故,我的团队疯狂到相信我。有很多痛苦,不眠之夜和漫长的时间,但我们学到了很多东西,获得了宝贵的技能。我们已经和cljs一起快速设计了我们的前端,我非常高兴。

从本质上说,这篇文章是我作为一名数据科学家驱除我对 UI 开发的恐惧和沮丧的方式,我希望它能帮助许多人愉快地重新发现我们工作的这一部分。

来源和资源

  • ClojureScript Koans ,在浏览器上交互学习语言的语法。
  • Clojure Brave and the True ,学习 Clojure 和函数式编程概念的最佳起点。
  • 4Clojure ,寓教于乐的练习,借鉴他人的解决方案。
  • re-frame 文档,理解框架的最佳来源,读起来真的很享受。
  • purelyfunctional.tv ,多位例外发帖博客了解试剂(包装为ReactJS)并重新框定。
  • Clojure 的创造者自己提出的简单至关重要
  • ClojureScript: Lisp 的复仇,ClojureScript 的主要设计师之一。

数据科学的终极工具特性工厂

原文:https://towardsdatascience.com/the-ultimate-tool-for-data-science-feature-factories-55aed0f70974?source=collection_archive---------23-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如 Splice Machine 的联合创始人兼首席执行官 Monte Zweben 在早期的一篇文章中所写的那样,数据科学孤岛如何破坏应用程序现代化,任何团队都必须采取许多重要步骤来避免可能阻碍现代化进程的昂贵孤岛。其中最重要的两个是为正确的功能创造正确的团队通过功能工厂创造实验文化。前者非常简单:找到统计专家、主题专家和 SQL 天才,你就已经在通往数据科学梦之队的路上了。我们在许多公司看到的最大挑战是后者,即功能工厂,尤其是我喜欢称之为功能组织的东西。然而,在我们开始之前,让我们定义一下什么是特征:数据科学中的一个特征是你的机器学习模型可以用来预测结果(标签)的一条信息。想象 Excel 电子表格中的一列;列越多,模型预测的基础就越多。

科学家需要什么数据:特征组织

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

功能组织是将您测试过的每个功能、训练过的数据集和部署过的模型保存在一个有组织、有凝聚力的工作空间中的过程,可以方便地访问您团队中的所有数据科学家和工程师。现在,特征是至关重要的 他们会成就或破坏你的模型;垃圾进,垃圾出。找到并最大化这些特征的信号需要时间、实验和“快速失败并继续前进”的文化。但是你实验、测试和创造的越多,就越难准确地记住你做了什么以及你是如何做到的。如果管道中出现问题,如果没有痕迹,几乎不可能找到罪魁祸首。这就是组织变得至关重要的地方。没有高质量的特征组织,你注定会生活在分散的特征、随机的超参数和不匹配的模型中。

科学家有什么数据:功能过载

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们考虑一下数据科学团队生活中典型的一天。一个由经验丰富的数据科学家组成的团队负责使用公司数据建立一个模型,以准确预测哪些订单项目将可用以及何时将它们交付给客户,也称为 ATP ( 可承诺量)。这是许多公司面临的一个重要问题,如果处理得当,可以大大减少损失,提高客户满意度。

团队迅速采取行动:SQL 专家开始用复杂的连接组织不同的表,使其易于接收和试验,主题专家利用她对供应链管理的深厚知识,开始起草将引入信号的有价值的功能,数据科学家开始阅读研究论文,寻找为问题构建的最佳模型,试验确定的功能。构建第一个 PoC 模型;不是很棒,但是大意是有的。他们讨论结果,调整特征,去掉一些有噪声的,然后再试一次。这次的模式稍微好一点,但是他们可以打败它;数据科学家转向神经网络架构。现在变好了,增加了更多的功能,减少了,增加了,增加了两个新功能,去掉了一个。精度降低,但 F1 提高,这是好事,对吧?添加一个隐藏层,然后删除,然后添加一些神经元。我们知道我们是否已经收敛了吗?事情变得非常复杂。

代价是什么:我们真的在尽最大努力做数据科学吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作为一名数据科学家,我创建了无数的 Excel 电子表格,试图记住和记录我在每个实验中使用的功能、标准化技术、编码方案和模型超参数的微妙组合,以及每个实验提供的各种指标。这让人筋疲力尽、灰心丧气,并促使我选择我看到的第一个有效的模型,而不是仔细分析我的实验,寻找最佳可能的组合。最重要的是,当需要重新培训和重新部署模型时,我很可能忘记或放错了电子表格,需要从头开始调整。

我看到一些公司试图创建自己的解决方案来解决这一问题,尽管积极主动的方法令人钦佩,但推出自己的解决方案会占用团队的宝贵时间和资源,而他们本可以将这些时间和资源用于实际的数据科学研究。更糟糕的是,这不是一次性投资,因为随着新库的发布和旧库的改进,任何自主开发的解决方案都需要持续的维护和更新。

特征工厂的开始:MLFlow

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是开发过程中工程师们开始关注不可思议的开源社区的时候了。 MLFlow 是数据科学社区中我最喜欢的开源项目之一,因为它重新定义了特性组织,并推动了特性工厂的创建。它标准化了整个数据科学工作流的治理流程,从总体实验到单次运行试验,再到团队中的各个数据科学家。MLFlow 允许您按照自己的意愿精确地(或广泛地)跟踪您的流程,并让您的数据科学家有时间去做真正重要的事情。每一个超参数调整、每一个特性变化、你能想到的每一个可能的度量标准,都记录在一个有组织的位置(下一篇文章将详细介绍)。

所以你有了你的理想模型,每个超参数都调整到完美,你已经从你的特征中提取了最大量的信号,现在呢?MLFlow 也使部署变得简单。只需几行代码,您就可以让您的模型在 SageMaker 或 AzureML 上实时运行,而不管您选择的库是什么,通过简单的 API 就可以实时获得您的预测。MLFlow 是让你的团队保持同步的工具,让他们专注于手头的任务,并让他们直接行动**。**

在 Splice Machine,我们围绕 MLFlow 构建了一个名为 ML Manager 的包装器,我们每天都在实验中使用它。它与我们的数据库本地连接,并允许我们跟踪和部署我们在源位置构建的模型。它使我们的内部工作流程更有条理,我们的客户也非常喜欢它。您可以点击此处了解更多关于 ML Manager 和拼接机器平台的信息,或者注册观看关于如何操作机器学习的网络研讨会。

更新:关于 MLManager 和 MLFlow 的更深入的技术回顾和一些代码示例,请查看我的后续文章

成为 at 数据科学家的不确定不全面的指南

原文:https://towardsdatascience.com/the-un-definitive-un-comprehensive-guide-to-becoming-at-data-scientist-39593b27b1dc?source=collection_archive---------19-----------------------

帮助你成为数据科学家的小贴士。

So you wanna data science, huh?

我在 LinkedIn 上相当活跃,不时会看到关于“如何成为”数据科学家的文章。我发现这些文章中的许多都是基于作者/数据科学家的视角,非常主观,我发现自己不一定同意所有的建议,或者至少不同意成为数据科学家需要具备的条件。

我想,如果我不同意所有这些文章,我会写我自己的,可笑的怀疑,版本。事不宜迟,我列出了成为一名数据科学家需要具备的条件。

1。停止阅读数据科学家关于如何成为数据科学家的列表。

看了这篇文章,你就失败了。

Whoops.

等等,不,你没有。让我重新开始。

1。通过快速失败和快速灵活的转变,你可以学到很多东西。

有些事情是学校教不了你的,而实践经验可以。照本宣科通常不是你在新工作中学习的方式,相反,你会不断尝试不同的解决方案,向你的利益相关者提出不同的想法,直到有一个坚持下来。在整个过程中,你要记下你哪里失败了,哪里可以改进。

此外,你可能在快节奏的工作中工作,或者在截止日期的压力下工作。你可能没有获得完美解决方案的奢侈。你必须弄清楚你能从一个最低限度可行的产品中获得多少百分比的覆盖率,并且当你不可避免地遇到阻碍时,一定要转向不太明显的解决方案。

现实是,在很多工作中,变化是唯一不变的,以不太完美的方式灵活解决问题的能力是现状。我说拥抱它。随着时间的推移,你会学到很多关于如何迭代和成为更好的问题解决者的知识。

我觉得学校和训练营教你用干净的教科书来解决问题。但是解决工业中的问题并不能反映出上述环境的清洁程度。

当学习任何与数据科学相关的技能时,不要让完美阻碍你的学习。允许自己犯错。尽可能寻求对你的错误的反馈。问很多问题。失败是收集知识的最好方法之一。不要害怕弄糟你的家庭作业,你的个人爱好项目,或者你在工作中做过的模型。

2。学习如何与你的同事、同事和客户交谈。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Repeating things will either make you look smart, or just very slow on the uptake.

让我给你一个假设的场景:你在一家医疗保健公司工作(像我一样!)你正在思考医生如何更有效地管理他们的高危人群。您希望构建一个模型,在该模型中,您可以预测出在未来六个月内,特定医院因心脏相关诊断而就诊的急诊数量。

你决定建立一个模型。太好了!

你的第一步是什么?也许收集一些数据,做一些探索性的分析,建立一个 MVP 模型,看看你的模型是否合适。听起来不错。

好吧,那么,谁来消费你的模型呢?它是否解决了您的客户正在寻找解决方案的一系列特定问题?

当然,你是绿光资本投入生产的许多业务高层食物链上的数据科学家。你是如何传达这种模式的价值的?提前六个月预测急诊就诊对患者护理和价值节约有什么帮助?你有和这个预测相关的金额吗?这如何可能降低您客户的劳动力成本,并潜在地释放资源投资于其他类型的患者护理?

你想过如何解释这个模型的机制吗?你使用的是 ARIMA 还是时序回归模型?或者你在考虑一个更复杂的黑盒模型,比如神经网络,比如 T4 LSTM T5?你打算如何解释这些解决方案是如何将输入转化为输出的?

我之所以提到这些(不那么)愚蠢的问题,是因为你的沟通技巧对于获得各级同事的认同至关重要。

请这样想:在数据科学的食物链上,您可以通过三个步骤来为模型的开发开绿灯:说服您的数据科学同行,说服您的业务利益相关者,以及说服潜在客户。特别是关于你的模型的价值。

想想你会如何与这三组人交谈。你会像和 MBA 一样和数据科学家交流,像和医生一样交流吗?可能会有重叠,但是你仍然需要对你的想法进行大量的剪裁。

此外,我从更专注于产品的数据科学家同行那里获得的关于他们自身经历的智慧尤其让我深受启发。作为一名支持产品的数据科学家,你不可避免地要与产品经理合作,为公司成功推出新产品。当推出一个产品、功能或模型时,你如何定义成功的衡量标准?你如何与你的利益相关者一起 1)开发假设,2)开发一个框架来测试这些假设,3)使用分析/机器学习来支持/拒绝这些假设,以及 4)使用这些结论来推动有价值的商业问题的答案?

学习这些技能是很棘手的,但是我已经习惯于找出我可以观察和学习的导师。我寻求各种利益相关者的反馈,看我如何改进。我和我的经理一起评估我认为可行的方法,以及可能不可行的方法(参见第 1 条的趋势?).

在许多这种情况下的共同点是学习如何像走路一样说话。说清楚。善于沟通。永远不要假设任何人都知道你在说什么。

3。了解您想要走哪条“数据”路径,并专注于磨练帮助您沿着这条路径导航的技能。

如今有许多“数据科学家”的分类。当我阅读关于如何成为一名数据科学家的文章时,他们越来越让我反感,因为他们将培训视为一刀切的方法。迄今为止,数据科学对不同的人和不同的组织有不同的含义。概括地说,我见过一些关于数据科学的宽泛定义。我特别喜欢 AirBnB 将数据科学专业二分法,但他们的方式绝不是“黄金标准”。

你更感兴趣的是讲故事、探索数据片段、挖掘隐藏在数据下的秘密吗?也许你是一名数据科学分析师,专注于构建故事,并在涉及任何面向数据的事情时成为一名侦探。

您是否对构建模型和算法更感兴趣,用您的编程能力做许多繁重的工作,并实现为产品提供动力的模型?也许你想考虑成为一名数据科学构建者或数据科学建模者

或者,你可能喜欢做实证测试,提出假设,使用各种研究方法确定如何得出因果结论,然后使用统计数据来验证这些结论。也许你可能是一个专门从事推理的数据科学家。

这些只是数据科学各个方面的例子。大多数分类法都有重叠的技能,尽管如果你更倾向于成为一名数据科学分析师(像我一样),你擅长将数据拼凑在一起,编织一个故事,并交流结果。你可能知道如何建立模型或进行 A/B 测试,但这不一定是你的专长(或兴趣)。

4。明白你绝对需要正确的技能和力学基础。

这是学校可以帮助你的地方,这是肯定的。从长远来看,拥有一套技术技能的基础将为你的成功做好准备,至少在学习最新的花式技术或最新的尖端工具方面。

这是什么意思?首先,理解一定程度的统计学。我建议从基础(比如描述性和推断性统计)开始,一直到基本的建模技术(至少学习回归模型的机制)。你会惊讶这将带你走多远,因为对这些主题核心的基本概念的理解将允许你更快更容易地学习更复杂的技术。

我是一名受过训练的心理学家,所以从技术上来说,数学对我来说从来都不是天生的。但是通过我所有的统计学课程,我学到了微积分和线性代数的知识。理解这里的基础知识会让你更容易理解你所使用的模型的机制。所述数学的使用将因公司、团队和项目而异。如果你正在构建算法,你可能会花时间复习微积分和线性代数,但如果你没有,你可能只需要知道一些基本知识就可以了。您的里程可能会有所不同。

最后,编程技巧。Python。R. SQL。可能是 Scala 和 Java。去读几本这方面的书吧。观看 Udemy/Coursera/Data Camp 视频。做黑客等级和/或 LeetCode 练习。不可避免的是,你会在面试中测试你的编程技能,所以我建议你能流利地掌握一些语言。同样,你的里程数可能会根据你需要深入的程度而变化:你可能在一个经常将代码放入产品的团队中,所以你可能会从做大量的在线编码挑战和了解一些基本的计算机科学中受益。或者,也许你所在的团队有更熟练的数据工程师将你的代码投入生产。拥有用 python 编写(潜在的模块化)脚本的技能可能就足够了。

如果你真的在寻找资源,你可以随时查看这些链接,寻找编程机器学习

(不过说真的,搜索各种资源来学习所需的技能并不太难)。

就我个人而言,我读了几本书(并做了笔记),从事业余爱好项目来学习 R 和 Python,并通过做编码挑战来进一步完善这些技能。

Programming looks EXACTLY LIKE THIS in real life.

我的心得:数据科学是一个巨大的领域,你能做什么,需要的技能千差万别。

然而,你会注意到,我把软技能放在这个列表的第一位,因为我认为,以我最无知、最不完美的观点来看,这些技能会让你在职业生涯中走得更远。任何人都可以拿起一本教科书,用最热门的语言学习最新的花哨算法或程序,但我读过的大多数列表似乎都忽略了这项工作最困难的部分之一:学习如何学习(再次)以及学习如何在多元化的团队中协作,就像一台润滑良好的机器。

米歇尔·塔特(Michelle Tat)是一名居住在大波士顿的反同性恋美籍华人活动家。她目前是 athenahealth 的产品分析经理,也是马萨诸塞州变性人政治联盟的联合主席。你可以在推特上找到她关于数据、社会正义和猫的帖子。

游戏设计中的恐怖谷

原文:https://towardsdatascience.com/the-uncanny-valley-in-game-design-6a6c38a36486?source=collection_archive---------6-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创造不会让玩家毛骨悚然的类人角色

恐怖谷的概念是由一位名叫森昌弘的日本机器人专家在 20 世纪 70 年代提出的。森喜朗也是第一届日本机器人制造比赛 Robocon 的创始人,也是研究机器人技术形而上学含义的 Mukta 研究所的主席。

森喜欢设计机器人,而且他也很擅长。他学得越多,他的作品看起来就越逼真——有人造皮肤、会动的眼睛和其他神奇的技艺。但是 Mori 注意到了一些有趣的事情:虽然简单的机器人引起了周围人类的积极反应,但是它们变得越逼真或像人,人们就越害怕它们——即使它们是机器人的优秀例子。

森注意到的是,在事物与人类的相似程度和我们的情感反应之间存在着某种关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以,他创造了一个图形来代表他的发现,关于我们如何对类似人类的事物做出反应

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该图形有两个轴:

  • 人类相似度 (横向),意思是机器人和一个活生生的人有多相似;和
  • 熟悉度 【垂直】,或者机器人在观看或与之互动的人身上是否产生积极或消极的情绪。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 我们从相当熟悉的开始,但是看起来不太像人类:一只机器人手(例如 Mecademic 的 Meca500 用于工业用途)。从情感上来说,我们对此持中立态度。
  2. 当我们沿着“人类相似度”轴移动时,我们会发现一个人形机器人(在这种情况下,毗湿奴工程公司的【NAO】*,*虽然填充动物也可以)。我们给物体添加了人类的特征,这使得更有吸引力——我们认为它有“个性”,或者在这种情况下,它很可爱。
  3. 但是如果我们太接近真实的人类,我们不会做出太好的反应,这让我们感到不安。我们现在在神秘的山谷中间。
  4. 当我们最终穿过山谷,移动到右上角时,我们又没事了。没有令人毛骨悚然的感觉,没有不可思议的负面反应。唯一的一点是,到目前为止,只有人类栖息在这边(没错,绿人还是人类)。我们在技术上还没到那一步,无论是机器人还是数字角色。

关于运动的一个注记

如果我们考虑静态的和移动的角色,那么曲线与略有不同。运动有助于感知“活着的”和“有感觉的”,例如 Travis,由位于 IDC Herzliya 的媒体创新实验室和佐治亚理工音乐技术中心开发:

但是移动的角色也会让我们毛骨悚然,看看 Spot ,由 Boston Dynamics 创造的——或者下面这个引起噩梦的婴儿:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

游戏可以…嗯,给我们一些有趣的小故障。不完全令人毛骨悚然,但如果你想要现实主义和沉浸感,你可能会想避免这些:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为什么会有恐怖谷?

人们似乎一致认为恐怖谷与期望有关。我们期望事物,尤其是人类,以特定的方式看待表现。****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

例如,我们习惯于看到别人的脸(虽然我在家工作,而且我的大多数 twitter 朋友都是机器人;).我们也可以如此浮躁,这真的很有趣。你看了左边的图片了吗?对你来说是不是也很模糊不舒服?

我们不能轻易接受一张不符合我们期望的脸,我们的大脑会试图纠正它,让它符合我们认为的人类应该有的样子

发生这种情况的原因是因为,作为智人,我们已经进化得非常擅长辨别面孔

人类的面孔已经变得独一无二,因为我们通过视觉(而不是气味或声音)来识别彼此。我们的面部变化实际上通过进化得到了增强。例如,人类基因组比身体的任何其他部分都有更多的区域来决定脸型变异

同样令人惊讶的是,我们在 尼安德特人丹尼索瓦人(我们最亲近的亲戚)身上发现了类似的变异,所以我们早就善于用我们的面部来检测和表达情绪了!**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Hominid sculpture reconstructions by Adrie and Alfons Kennis

现在,围绕着有一场争论,在我们对看起来像人类但不完全真实的机器人感到不安的背后,是哪种** 机制。这些是最大的竞争者:**

  • ****择偶。自动厌恶免疫系统无效的配偶——通过面部和身体特征可见。
  • 死亡率凸显。与生俱来的对死亡的恐惧和文化上支持的应对死亡不可避免性的方式。
  • 避开病原体。通过引起厌恶反应来避免潜在的病原体来源。惊恐和厌恶的反应就像尸体和明显有病的人。
  • 违反人类规范。 我们以人类的共情、智力等标准来判断机器人/实体。
  • ****宗教对人类身份的定义。对人类身份概念的威胁。民间传说,创造类似人类但没有灵魂的生物。
  • ****相互矛盾的知觉线索已证实知觉紧张与类别成员的冲突线索。厌恶混合实体。
  • ****对人类独特性和身份的威胁挑战人类的独特性——人类性的重新定义。

机器人和共情

但是我们的感情是双向的吗?我们是否也能像与生物交流一样与机器人交流?不管是好是坏…似乎我们可以!

让我告诉你关于 Pleo 的事情。Pleo 是 Innvo Labs 在 2006 年创造的一个电子宠物恐龙玩具,它有很多很酷的功能,如摄像头,触摸和倾斜传感器,麦克风,红外线和其他功能。

最近,一项研究使用 功能磁共振 (通过检测与血流相关的变化来测量大脑活动)来观察与人类相比,人们机器人有多同情。这是受访者看到的视频(我觉得它应该有某种触发警告!)😗***

A study from the University of Duisburg-Essen in Germany using functional MRI to see how much people empathize with robots compared to humans.

如果你真的和研究中的大多数人一样同情 PLEO,你会忍不住想知道人机互动关系的含义。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你觉得 PLEO 不好的原因是,如果我们有很多机器人特征而很少人类特征的东西,人类角色会更加突出。反过来说,机器人脱颖而出

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果某种非人类的东西被赋予了人类的品质,我们会觉得它很可爱。如果我们赋予它太多的人类特征,它开始看起来像一个不完美的模拟(因此可能会令人反感)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

游戏中的恐怖山谷

我们希望游戏角色变得可爱,或者至少可信。因此,它们需要在图表的上半部分。也就是如果你希望他们讨人喜欢!如果没有,你知道在哪里寻找怪物的想法;)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Recommended Area (for likable characters!)

因为它们需要在图形的一个顶点上,所以它们可以是风格化的(像人形机器人或毛绒熊)或照片逼真的😗*******

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片写实主义

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(Far Cry 5, Ubisoft 2018)

照片写实游戏的目标是看起来和照片或者现实生活没有区别。或者比现实生活更好,我们将在下面看到。

在这种类型开发的优势中,我们可以看到照片逼真的游戏以一种视觉上可信的方式模拟现实,这使得它们通常更具沉浸感。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(NFS Payback, Polygon 2017)

然而,照片真实感的开发通常更加昂贵,并且需要更大的团队协同工作。

**这也更加**复杂,必须考虑到纹理、模型、运动、光线和表演等创造可信体验所需的因素。

这使得隐藏错误更加困难,因为模拟的每个方面都需要打磨到完美。

当现实主义出了问题…

创造一个完整的体验需要很多层次。如果少了一个,所有的东西都会倒塌。

我记得《最终幻想》电影上映的时候。像世界各地的其他高中生一样,我的朋友们&我是绝对的书呆子,他们已经知道自己想和计算机打交道。当电影终于上映时,我们都非常兴奋…也非常失望。我们所能看到的只是角色们怪异的表情,一个我们无法逾越的深渊。不久之后,随着电影 《极地特快》 的发行,以及最近游戏 质量效应《仙女座菌株》 的首次发行,这种情况注定会再次发生。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

许多人对 Mass Effect 2017 年的反响感到惊讶。由于对对话动画过于雄心勃勃的改进和大量的故事要播放,他们没有时间将动画应用到正在说话的角色嘴以外的面部部分。

文字、多人游戏、游戏性以及除了动画之外的一切都有各自的优点和缺点,但在可预见的未来,当谈到这款游戏时,粉丝们首先会谈论的是 人们说话时的表情有多怪异 。这不是抱怨,这只是一个最古老和最明智的公理的又一次重复:链条的强度取决于它最薄弱的一环。 The Kenpire

只制作一个虚拟角色的嘴的动画会是一个问题,我们将会看到为什么。

虚拟角色对精神变态的感知

波尔顿大学的安吉拉·汀威尔做了一个很棒的研究,他们使用回归分析来追踪用户面对这种纯嘴动画的反应。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果一个角色在眼睛区域缺乏对情绪状况的可见反应,这就会唤起一种与愤怒、冷酷、支配、漠不关心和不值得信任的关系——所有这些特征都与精神变态有关。****

因此,类人虚拟角色中不充分的上部面部动画可以唤起不可思议的,这是由于对角色中心理变态特征的感知。例如,表现出对尖叫声没有惊吓反应的角色被认为是最不可思议的。什么,我们没有计划让你的角色对周围的声音做出反应?******

但是如果你有足够的面部动画和注重细节的团队,你可以创造出类似于《刺客信条奥德赛》(育碧,2018):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

表达是如此之好,它几乎使这篇文章毫无意义!

图形保真度与人类保真度

要点应该是,你可以拥有一个看起来不可思议的游戏,但除了草,每个个体在夏日微风的抚摸下看起来都很美,图形保真度 不一定意味着人类保真度

而且你需要两个来创造一个现实体验**。******

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为我们对人脸、表情和动作如此敏感,所以我们需要尽可能覆盖所有感知领域。

那么,我们如何才能创造一个现实的和人性化的游戏体验…?

实现人类保真的最好方法就是观察利用 人类作为我们的基础。我们可以捕捉动作,也可以捕捉整个演员的表演。因为当你使用面部和身体捕捉时,你会…****

虚拟世界中的实时电影技术。

有机会玩塞纳的牺牲吗?我第一次看到预告片的时候就很敬畏。这是其中之一:

下面是他们如何实现如此美妙和人性化的表达:

当然,我们不希望事情看起来很真实,我们希望它们听起来和感觉起来也很真实。我想不出比《巫师 3》更成功的故事了。

逼真的电影对话

对于《巫师 3》,对话在 4 个阶段中创建:写作、任务设计、对话设计后期制作(包括修改相机、创建空闲、动画手势以及纠正面部和姿势)。****

总共有大约 2400 个对话动画,最棒的是:它们都是可重复使用的!不同角色之间支持共享。这里有一个小总结:

游戏的设计者所做的是添加对实时预览的支持,这允许创作者轻松地在场景中移动角色,同时他们可以通过在编辑器旁边预览整个场景来检查他们的结果。不仅如此,只需点击一下鼠标,场景就可以在预期的世界位置播放(渲染)。********

Real time dialog creation or The Witcher 3

格式化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(Ylands, Bohemia Interactive 2017)

现在除了现实人物之外的另一个选择。风格化是指简化在形状、颜色、图案和表面细节方面,以及在功能和与场景中其他物体的关系方面。****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(Mario Odyssey, Nintendo 2017)

风格化的好处之一就是人物不是人,这让他们的人性特征更加突出。此外,风格化允许几乎无限多种设计**。******

另一方面,角色可能不会像照片般真实的角色那样引起我们的共鸣,因为他们不是“人类的 T21”。如果简化破坏了模拟的真实性,这种体验就不那么身临其境了。

风格化有几个层次,但一般来说,游戏倾向于分为过度夸张的极简的**。******

过分夸张的风格化

在这种情况下,重点是更大的细节和形状,而不是在具有真实图形的游戏中常见的小细节和微表面。fire watch2016 出的一款过分夸张的游戏,没有让人失望。****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(Firewatch — Campo Santo, 2016)

游戏设计师决定使用复古国家公园海报的风格和颜色。丰富的色调和卡通动画看起来并不真实,然而游戏却令人难以置信身临其境——尽管不仅仅是从视觉角度来看,故事也很引人注目。********

由于没有与现实世界进行比较,玩家可能会真正迷失。利比·凯勒,奥德赛

极简风格化

**相对而言平淡,极简风格化玩的是简单。它通常**去除了所有中等和小的细节,并且可以例如仅使用彩色地图。我们有像《我的世界》 这样伟大的极简游戏,其中一个立方体比一个像素多一点,但充满了创造新的伟大事物的潜力。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(Minecraft — Mojang, 2011)

无论我们是在谈论太空入侵者还是通道,像素艺术的部分吸引力在于, 简单性避免了我们的注意力浪费在细节上 比如凹凸贴图,让一切看起来像湿塑料。玩了几分钟后,我们在《我的世界》看不到立方体,我们看到的是海洋、堡垒、隧道或树屋。爱好 GameDev。

机器人中的极简风格化

最后是一个成功的极简主义机器人的小例子——因为我们可以爱上任何一双可爱的眼睛!2018 年首次亮相的本田 3E-A18 机器人装置:

最后的想法

如果你想创造一个可爱的角色,从哪里开始呢?首先,你需要选择一个方向:风格化或者现实化。你的道路可能取决于你想做的游戏类型、团队和你可利用的资源。

如果你选择现实主义,你将需要额外关注每一个细节,并且很可能在后期制作上花费很长时间。如果你选择风格化的角色,你将需要关注他们的个性,关注会脱颖而出的人类特质。

无论你做什么,你都需要确保它是一个一致的体验,它有 保真度

最初,游戏要求角色只是一个进入他们虚拟世界的入口。这很容易通过令人愉快的卡通如马里奥和索尼克,或者英雄原型如萝拉·卡芙特来实现。某些类型,主要是 RPG,走得更远,提供了丰富多彩的个人演员阵容,每个人都有自己的个性和动机。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Evolution of games and their characters

今天我们有像《刺客信条》这样的游戏,它们看起来绝对令人惊叹。或者像《辐射新维加斯》或《生化奇兵》那样的故事情节。甚至程式化的游戏我的这场战争(我玩过最悲伤的游戏。对不起,我们永远不会忘记你!).还有创造甜蜜可信体验的小游戏,比如艾米丽不在

但是我相信创造可信体验的线索是作为一个愿意分享他们创造力的团队的一部分来工作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尽管动画制作人和概念艺术家之间的关系已经很好的建立起来了,但是编剧和演员的角色还是让这个行业不太舒服。传统上游戏演员应该是“配音演员”,但现在不再是这样了。许多工作室使用动作捕捉软件来捕捉演员全身的表演,将他们提供的特殊动作融入到角色的动画中。

我们都有不同的灵感,通过合作和对话我们可以成就伟大。有什么比赋予我们的作品一点自己的独特性更好的方式来创造人类体验呢?

你在游戏中体验过恐怖谷吗?当你追踪一个好故事或一个引人注目的角色时,你也有这种感觉吗?请在下面分享你的想法,我很乐意收到你的来信!

本文由Yisela Alvarez Trentini于 2019 年 3 月 3 日在 女性游戏开发者 Meetup(法兰克福) 上原创。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

失业的人工智能专家

原文:https://towardsdatascience.com/the-unemployed-ai-expert-de5528e0443b?source=collection_archive---------27-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Christopher Burns on Unsplash

失业的人工智能专家就像喜马拉雅山的雪人一样难以捉摸。事实上,在我跨越二十多年的 AI 生涯中,我从未遇到过一个。

然而,在过去的一年里,自从媒体意识到人工智能的惊人世界后,我一直收到这样的疑问:既然人工智能是一个新事物,我毕业后会找到工作吗?我从未见过人工智能专家等的广告。

我不怪人家问这些问题。在过去的几十年里,特别是在过去的一年里,我作为马耳他的一员。人工智能工作组,我见过成千上万的人,他们可能听说过人工智能,可能正在广泛使用它,但不知道他们在使用它,甚至不知道它是什么。这篇文章旨在澄清事实。

AI 并不是什么新鲜事物。事实上,我们可以在整个人类历史中追溯其最初的一些概念,如古埃及的移动雕像或达芬奇的机械计算器。

但真正点燃这一研究领域的火花发生在 1956 年夏天,在美国达特茅斯举行的一次研讨会上。

在那次为期两个月的活动中,计算机科学家和数学家齐聚一堂,解决创造智能机器的问题。当然,他们没有解决这个问题,但是,他们成功地创造了“人工智能”这个术语。

他们还为人工智能的各个子领域播下了种子,如机器学习、计算机视觉、自然语言处理、问题解决和许多其他领域。

在接下来的六十年里,人工智能成为了一个独立的领域,政府和私人机构向人工智能研究投入了数十亿美元。当然,像任何其他研究领域一样,有巨大的成功,也有巨大的失败。

人工智能的问题是,尽管我们每天都在使用它,但很难识别它,因为没有标签明确表明我们实际上在使用人工智能。

经验法则是,如果自动化过程需要某种智能,那么它最有可能是一个人工智能系统。

如果人工智能就在我们身边,为什么我们在马耳他看不到人工智能专家的显性工作?

想象一下,我有自动百叶窗,就是那种你按下按钮就能上下移动的百叶窗。那不是 AI 而是简单的自动化。我按下按钮,事情就发生了。我必须做出决定,触发一切。

但是,如果百叶窗连接到一个计算机系统,该系统可以检查外面的天气,知道你是否在家,随着时间的推移了解你的偏好,然后决定是否关闭或打开百叶窗,那么我们就接近于一个智能系统。

我可以找到无数这样的例子,让你在日常生活中使用人工智能。使用谷歌时,是人工智能在为你寻找信息。当你浏览脸书时,是人工智能决定你能看到哪些帖子。

一些洗衣机现在能够称重衣服并决定用水量,一些烤箱决定烹饪食物的正确温度——这是人工智能做出的决定。

在带气候控制的空调中,本质上是人工智能在不断地为你调节温度。

如果人工智能就在我们周围,为什么我们在马耳他没有看到人工智能专家的明确工作?原因是,与行业的巨大需求相比,全球范围内的人工智能专家很少。

中国科技公司腾讯(Tecent)声称,全球约有 30 万名“人工智能从业者和研究人员”,但拥有这些资格的人可以获得数百万个职位。

正因为如此,公司倾向于使用诸如软件开发人员、数据科学家等计算工作的总称,以便至少找到某人。

他们非常清楚,人工智能专家本质上是具有人工智能专长的计算专家。当公司设法聘请一个,他们就被用来处理最困难的问题,其中许多没有明显的解决办法。

当然,他们得到的报酬也与任务的难度成正比,我们的毕业生是业内报酬最高的。我们领域最大的招聘机构是互联网、金融科技、软件开发、教育、制造、电信、咨询和政府机构。

总的来说,如果我们想达到总理为马耳他设定的雄心勃勃的目标,即在人工智能方面进入世界前 10 名,该国需要更多的人工智能毕业生。

自去年以来,马耳他大学信息通信技术学院人工智能系的学生人数已经增长了 300%,但我们需要更多的学生来为我们的国家服务,并成为人工智能领域的全球颠覆者。

最初发表于【timesofmalta.com】

阿列克谢·丁力教授 是马耳他大学的 AI 教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他出版了几本同行评审的出版物,并且是马耳他的一部分。由马耳他政府成立的人工智能工作组,旨在使马耳他成为世界上人工智能水平最高的国家之一。

软糖罐里的意外一课

原文:https://towardsdatascience.com/the-unexpected-lesson-within-a-jelly-bean-jar-1b6de9c40cca?source=collection_archive---------17-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Patrick Fore

糖豆如何帮助我理解一个关键的人工智能原理

在英国维多利亚时代晚期普利茅斯的一个牲畜交易会上,一位名叫弗朗西斯·高尔顿的统计学家让大约 800 名与会者猜一猜展出的一头公牛的重量。然后他计算了所有估计值的中间值,结果是 1207 磅。令他惊讶的是,这头牛的测量重量为 1198 磅,这使得估计值的中位数与实际重量相差约 0.01%。正如高尔顿自己指出的:

……最中间的估计表达了人民的心声,其他的估计被大多数选民指责为过低或过高

这实际上意味着,作为一个群体,或者作为一群独立思考者,我们是非常非常好的评估者。

因为我热爱数据和科学,我想自己复制这个实验,所以不久前我在我的办公室用我自己的方式复制了这个实验。我负责软糖罐游戏,你可能在之前就听说过

我买了一个罐子,里面正好装了 490 颗豆子(是的,我都数过了)。然后,像弗朗西斯·高尔顿爵士一样,我让 30 名同事估计一下罐子里软糖的数量。令我惊讶的是,估计值的分布如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Distribution of Jelly Bean Estimates. Red line depicts the mean estimate.

平均估计是 487,离地面只有三颗糖豆的距离!通过这个简单的实验,我越来越相信民意群众智慧是真实存在的。

作为一个群体,我们是非常好的估计者,但作为个体,就不那么好了。

注意:有耐心的人比胡乱猜测的人表现更好。在我的实验中,一些人测量了罐子的体积,并估计了每颗软糖的体积,然后将其推断为罐子里软糖的数量。其他的干脆去说“嗯不知道……1000”(见图)。尽管如此,所有的估计都集中在一个值上,即地面真相。请记住这一点。

在本文的其余部分,我将把这个大众之声原则与我长期以来一直感兴趣的一个原则进行比较。这听起来可能很疯狂,但我认为人工神经网络与它有一个共同点。特别是因为在这两种情况下,零件的集合被赋予一个单一的任务,并一起工作来解决它。我希望在这篇文章结束时,你也有这样的感觉。

开始这种比较的一个好方法可能是提供一个人工神经网络中神经元的定义。我发现这种描述对 understand⁴:来说相当有说服力和简单

每个神经元接收一个或多个输入信号 x 1x 2 、…、x m,并向下一层的神经元输出值 y ,依此类推。输出 y 是输入信号的非线性加权和。

根据这种观点,人工神经网络中的神经元是集体思维的个体。事实上,ANN 的事实上的架构是一个相互关联的个体回归变量的集合。一个具有 n 个输入神经元的神经元的输出被定义为 by⁵:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后,每个输出 h 是来自所有输入 x 的单独线性回归之和的具有参数 Wb 的函数,这又将是下一层的输入(在激活函数之后,通常是非线性⁶)。神经元集体地并且只有集体地解决任务。尝试用一个神经元为一个复杂的任务建立一个人工神经网络分类器,你很可能会失败。这就像高尔顿让一个人估计一头牛的重量。估计很可能是错误的。这就是安真正集体工作的地方。这个概念可以在下一个例子中形象化:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Taken from here

在上面的图像中,经过训练的 NN 从“2”的图像中提取 784 个特征作为输入,并相应地对其进行分类。随着每个神经元的增加,系统的复杂性急剧增加,但反过来增加了有效提升分类器性能的可能特征排列的数量。但是加多了,你就会成为 overfitting⁷.的受害者我建议你访问这个谷歌游乐场来更好地理解这些和其他概念,在这里你可以看到每个添加(或移除)的神经元对一个简单分类器的影响。试着只用前两个特征( XX ) 训练模型,看看结果。现在多做一点。你能找到获得好结果所需的最少神经元数量吗?做简单的任务需要很多神经元/层吗?答案是否定的。我们一会儿再回到这个话题。

回到公牛和糖豆,这就像找到一个非常好的估计所需的最小个体数量。当然,向 10,000 人询问牛的重量会减少误差,但在 800 人的时候,我们已经有 99%接近事实了。只有当期望的输出没有被满足时,增加算法的复杂度才是有用的。从这里开始,从计算上来说,最好减少估计量,以找到达到期望性能所需的最小值。一旦找到这种平衡,vox populi 就会降低计算成本。为了理解这一点,我们可以看看我用 Python 快速制作的下一张图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Distribution plots with μ = 1 and σ = 0.1 from 10 to 1000 points.

我们可以创建一组随机正态分布,其中μ= 1T5σ*= 0.1,同时将样本数量从 10 个增加到 1000 个。因为我们知道均值基本事实设计为等于 1,所以我们可以计算这些分布的平均值,看看它有多接近 *μ。正如你可能已经猜到的,我们拥有的数据越多越好,这意味着我们的估计越来越接近我们的实际情况。在无限个样本之后,我们到达 μ ,但是由于显而易见的原因,这是不切实际的。甚至可能由于某种原因,1000 个样本太昂贵,我们决定使用 500 个点集合进行分析,这产生了满足我们需要的误差。这是我们的最佳点:足够概括以最大化性能,但足够具体以最小化错误。人工神经网络遵循类似的(尽管不完全相同)原理。

尽管对于应该 use⁸多少个神经元和多少层有一些通用规则,但选择这些限制是我在构建深度神经网络时经常遇到的一个常见问题。对于一个相当简单的问题,太多的神经元和/或层可能会导致严重的过度拟合(在我们之前的例子中,询问 10,000 个人关于牛的体重或使用 1000 点或更多)。太少的话,你将无法推广你的盲测模型。在某种程度上(一般来说),ANN 对简单性和复杂性之间的平衡感到很舒服。

回到 Google 的 TensorFlow Playground,我们可以看到,在一个非常简单的分类任务中,简单的人工神经网络达到低损失值所需的时间很短:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Simple ANN classifier with one Hidden layer and two neurons. Image generated from freely available TensorFlow Playground.

虽然微不足道,但这充分体现了我想表达的观点。测试训练损失在大约 350 个时期内达到大约 0.05(见散布图正上方的值)。现在让我们看看过度复杂的人工神经网络对相同的数据进行分类并使用相同的参数会发生什么:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Complex ANN classifier with six Hidden layers and 8 neurons. Image generated from freely available TensorFlow Playground.

甚至不到 200 个时期,损失值仍然不在与前一个例子相同的水平上。如果我们等待足够长的时间,网络会完成这项工作。根据前面段落中的正态分布示例,您可以使用数千个点来获得对 *μ,*的“更好”估计,但误差无法补偿高成本。在这个例子中,同样的事情正在发生。更不用说其他超配的 problems⁹,后一种架构对于这样的任务来说太昂贵了。第一种架构以非常低的成本完美地完成了工作,因此选择它而不是另一种是更明智的决定。

我喜欢将人工智能模型,特别是深度神经网络,视为复杂的系统,应该尽可能简单地构建。信不信由你,我的果冻豆罐实验帮助理解了这个原理。这两种情况都需要划分某个任务(刚好足够)来共同解决它。这似乎是最好的解决办法。正如阿尔伯特·爱因斯坦在 1933 年⁰:的一次演讲中指出的

几乎不能否认,所有理论的最高目标是使不可约的基本元素尽可能简单和少,而不必放弃一个单一的经验数据的充分代表。

我不能和那个*争论。*可以吗?

感谢您的阅读!

参考资料:

[1]高尔顿,F. 人民之声 (1907),自然75 (7),450–451 页。

[2]关于群体智慧故事的正文:https://towards data science . com/on-the-Wisdom-of-Crowds-collective-predictive-analytics-302 b7ca 1c 513

[3]安资源:https://towardsdatascience.com/nns-aynk-c34efe37f15a

[4] Koutsoukas,a .,Monaghan,K. J .,Li,x .,& Huan,J. 深度学习:调查深度神经网络超参数并与生物活性数据建模的浅层方法进行性能比较(2017)化学信息学杂志9 (1),42 .

[5]关于多层神经网络基础的伟大文字:http://ufldl . Stanford . edu/tutorial/supervised/MultiLayerNeuralNetworks/

[6]激活函数:https://towards data science . com/Activation-functions-neural-networks-1 CBD 9 F8 d 91d 6

[7]关于过拟合的一句话:https://www . Jeremy Jordan . me/deep-neural-networks-preventing-over fitting/

[8]https://stats . stack exchange . com/questions/181/how-to-choose-the-number of-hidden-layers-and-nodes-in-a-forward-neural-netw

[9]https://towards data science . com/preventing-deep-neural-network-from-over-fitting-953458 db 800 a

爱因斯坦真的这么说过吗? (2018) 性质557 (7703),30–31。

在分类系统中使用软 F1 损失的未知好处

原文:https://towardsdatascience.com/the-unknown-benefits-of-using-a-soft-f1-loss-in-classification-systems-753902c0105d?source=collection_archive---------2-----------------------

如何不保持一个决策门槛,仍然直接针对你关心的东西进行优化!

在生产中部署机器学习系统并确保其日常效率可能是一项非常艰巨的挑战。在过去的五年里,我看到越来越多的技术变得越来越复杂(算法、编码库、云服务等等)。这是用有用的人工智能应用重塑我们世界的好消息。

但是,和许多其他领域一样,化繁为简是成功的关键。莱昂纳多·达·芬奇将简单描述为“终极的复杂”。
在数据科学中,它不仅仅是一种理论,它可以采取流程的形式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Hilthart Pedersen on Unsplash

不管怎样,我为什么要说这个话题?
在一篇非常鼓舞人心的题为“ 机器学习:技术债务的高息信用卡的论文中,谷歌的一个人工智能研究团队分享了一些非常务实的建议,关于如何在生产中管理机器学习系统的复杂性。在他们描述的所有方面中,有一个问题是如何使 ML 系统适应外部世界的变化。

下面是他们对动态系统中固定阈值的看法:

通常需要为给定模型选择一个决策阈值来执行一些动作:预测真或假,将电子邮件标记为垃圾邮件或非垃圾邮件,显示或不显示给定的广告。机器学习中的一种经典方法是从一组可能的阈值中选择一个阈值,以便在某些指标(如精确度和召回率)上获得良好的折衷。然而,这种阈值通常是手动设置的。因此,如果模型根据新数据更新,旧的手动设置的阈值可能无效。跨多个模型手动更新多个阈值既耗时又脆弱。对于这类问题,一个有用的缓解策略是通过对 heldout 验证数据的简单评估来学习阈值。”

最近,我一直在研究一个 ML 系统,以帮助自动化汽车诊断。基于汽车数据,系统应该预测在发生事故时需要更换哪些零件。这是一个多标签分类问题,可以分解成数百个二元分类子问题(每个部分一个)。

考虑到所有的生产约束,学习和不断更新每个子问题的决策阈值对我来说非常乏味。

在这篇博文中,我想分享一些额外的缓解策略,以忽略决策阈值的调整,并仍然获得分类系统的优化性能。据我所知,没有像这样的普遍做法,没有文章,没有公认的研究。这只是我实验的结果。因此,我建议谨慎使用以下见解,并随时分享您的观点和我们可以一起讨论的任何问题。

如果你想重现结果,你可以一步通过这个 Jupyter 笔记本 。完整的代码在麻省理工学院的许可下共享在 Github 上。

研究案例

为了说明这个想法,让我们考虑一个从海报图像预测电影流派的机器学习系统。对于每个海报,可以分配一个或多个标签(动作、惊悚、戏剧、恐怖、奇幻等。).卷积神经网络当然是学习从电影海报到可能的标签列表的映射的非常好的方法。关于实现细节,可以在 tensor flow 2.0中阅读我关于“ 多标签图像分类”的文章,但也可以独立继续阅读本文。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

了解 F1 分数

给定一张电影海报,我们需要预测系统为每个标签生成 0 或 1 的预测。例如,如果一部电影有一些“动作”内容,系统应该给“动作”标签分配 1,否则应该给相同的标签分配 0。对于每部电影,我们以一个 N 维的二进制向量结束,这个向量代表所有的猜测,N 是所有可能的标签(电影类型)的数量。二元预测向量可能看起来像这样:00011000001…000.

当对一个标签进行推理时,有四种类型的预测:

  • 两种类型的正确预测(真阳性和真阴性)。
  • 任何观测值预测为阳性而实际为阴性的错误类型 I(假阳性,也称为假警报)
  • 任何观测值预测为阴性而实际为阳性的错误类型 II(假阴性)

这通常使用混淆矩阵来可视化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于此,通常分析两个指标:

  • Precision: TP/(TP+FP)
    在所有预测为阳性的示例中,实际为阳性的百分比是多少→我们希望降低错误警报率
  • 回忆:TP/(TP+FN)
    在所有实际为正的例子中,预测为正的占百分之几→我们要提高模型的灵敏度

但是因为这两个指标通常是相互对立的,所以我们可以依赖它们的调和平均值,即F1-得分

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在开发您的 ML 系统时,有一个单一的评估指标可以加快进度。

直接针对 F1 分数进行优化

在训练和评估机器学习算法(如神经网络)之前,我们需要定义两个主要函数:

  • ***一个损失函数:*它是现代机器学习的面包和黄油。我们需要它来测量训练批次的模型误差(成本)。它必须是可微分的,以便反向传播神经网络中的误差并更新权重。
  • ***一个评价函数:*它应该代表我们真正关心的最终评价指标。与损失函数不同,它必须更直观地理解模型在现实世界中的表现。

如果我们想使用 F1 分数作为评估指标,有两种可能的策略来最大化它:

策略 1: 通过设定阈值使 F1 分数最大化

当模型生成概率值时,我们需要为每个标签设置一个阈值,以获得二元预测。例如,如果动作的概率高于阈值 0.5,我们可以预测 1(电影是关于动作的),否则我们预测 0(没有动作)。使每个标签的 F1 分数最大化的最佳阈值在 0 到 0.5 之间(有数学证明,但不在本文中讨论)。我们通常在等待验证集上搜索阈值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

策略 2: 将 F1 得分嵌入损失函数

如果您想直接针对 F1 指标进行优化,这将是最简单的方法。损失函数不仅提供了模型误差的度量,它还是定义如何最佳拟合数据以实现最佳目标的学习过程的核心。出于某种原因,将 F1 分数嵌入损失函数并不是一种常见的做法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Introduction to loss functions (Algorithmia)

为什么在损失函数中出现 F1 得分是不寻常的?

F1 分数的问题是它不可微分,因此我们不能将其用作损失函数来计算梯度和在训练模型时更新权重。请记住,F1 分数需要二进制预测(0/1)来衡量。

通常我们使用binary cross-entropy loss,它代表某一特定类别观察值的负对数似然性-log(p),模型预测该类别的概率p。一般来说,这种损失效果很好,并广泛用于使用策略 1 训练分类器,但它并不直接与我们想要最大化的 F1 分数一致。

解决方案?

我们可以修改 F1 的分数,使其具有可区分性。我们可以通过使用概率而不应用任何阈值,将真阳性、假阳性、假阴性的数量计算为似然值的连续和,而不是将它们计算为离散的整数值。

让我们来看两个有助于理解这种转变的例子:

***Example 1:** If the target is 1 for a movie being Action and the model prediction for Action is 0.8, it will count as:0.8 x 1 = 0.8 TP (because the target is 1 and the model predicted 1 with 0.8 chance)0.2 x 1 = 0.2 FN (because the target is 1 and the model predicted 0 with 0.2 chance)0.8 x 0 = 0 FP (because the target is 1 not 0, condition negative is not valid)0.2 x 0 = 0 TN (because the target is 1 not 0, condition negative is not valid) **Example 2:** If the target is 0 for a movie being Action and the model prediction for Action is 0.8, it will count as:0.8 x 0 = 0 TP (because the target is 0 not 1, condition positive is not valid)0.2 x 0 = 0 FN (because the target is 0 not 1, condition positive is not valid)0.8 x 1 = 0.8 FP (because the target is 0 and the model predicted 1 with 0.8 chance)0.2 x 1 = 0.2 TN (because the target is 0 and the model predicted 0 with 0.2 chance)*

我们将这个版本称为**soft-F1-score**。下面,你可以看到在 TensorFlow 中的一批预测上实现它的代码。

这里有一些事情需要考虑:

  • 每个标签的成本实际上是该标签的1 — soft-F1。要想最大化软-F1,就要最小化1 — soft-F1
  • 你可以把soft-F1定义中的PrecisionRecall替换掉,得到一个更直接的基于 TP、FP、FN 项的公式。之所以要这样做,是因为当 TP = 0 时,F1 的调和平均值表达式是未定义的,但转换后的表达式是定义的。
    F1 = 2 * TP / (2 * TP + FN + FP)
  • 一批观察中的总成本将是所有标签上的平均成本。我们将称之为macro soft-F1 loss
  • 你必须确保批量足够大,以便在培训时看到一个代表macro soft-F1 loss

学习曲线(优化和评估指标)

让我们假设,为了简单起见,我们希望对所有标签只使用一个阈值来将任何概率值转换成二元预测。换句话说,我们现在将考虑默认阈值 0.5,并通过优化我们之前定义的宏软 F1 损失(策略 2)来尝试最大化宏 F1 得分@阈值 0.5,而不是通过为每个标签分别设置阈值来最大化性能。

与使用似然项的宏软 F1 不同,我们将在宏 F1 分数的实现中使用阈值 0.5。

在下面的学习曲线上,我们观察了训练过程中损失度量(宏软 F1)和评估度量(宏 F1-分数@阈值 0.5)的变化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Learning curves (macro soft-F1 loss and macro F1 @thesh 0.5) with a batch size of 256

您可能会注意到,在学习曲线上,宏观软 F1 损失降低到接近 0.69 的水平与宏观 F1 分数增加到接近 0.33 的水平相关。这两个值几乎互补为 1。请记住,我们定义的宏软 f 1 损失实际上是我们需要最小化的 1-软 F1 的宏。这是第一个指标,表明宏观软 F1 损失直接优化了我们的评估指标,即宏观 F1 得分@阈值 0.5。

了解宏观软-F1 损失的作用

为了解释这个损失函数的含义,我训练了两个神经网络模型,它们具有相同的体系结构,但是有两种不同的优化。第一个模型使用宏观软 F1 损失直接优化宏观 F1 得分,而第二个模型更经典,并针对二进制交叉熵进行了优化。在这两种情况下,当预测电影海报的类型时,训练的模型将为每个标签生成独立的概率分数。为了创建最终的决策系统,我们需要为每个标签选择 0 到 1 之间的决策阈值,以便将每个概率转换成二进制信息。通常,系统的性能取决于这些决策阈值的选择。因此,让我们检查一下,对于每种类型的优化,系统如何根据我们为某些标签设置阈值的级别来处理验证集。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有趣的事情正在这里发生!

当使用宏软 F1 损失训练模型时,我们得到几乎与阈值无关的 F1 得分(绿色曲线)。当使用二元交叉熵损失时,我们没有这种效应。这实际上是一个有趣的效果,因为它提供了将所有标签的阈值固定在 0.5 的可能性,并且仍然获得接近于当使用 BCE 损失时通过搜索最佳阈值所获得的性能。当构建生产 ML 系统时,这是一个非常好的特性。更新阈值并确保它们在新数据到来时保持最佳状态是一项巨大的工作。使用宏软 F1 损失可以帮助解决这个问题,但实际上这种行为来自哪里?

当使用两种不同的优化时,分析来自神经网络的概率值的分布将是有趣的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好了,现在可能看起来更清楚了!

当使用二进制交叉熵损失进行训练时,输出的概率分布具有一些高斯属性(注意蓝色直方图的钟形)。实际上,这种优化是从数据的原始分布中学习的。我们可以看到,对于覆盖 50%数据集的标签“Drama ”,概率分布集中在 0.5。顺便说一下,为“戏剧”构建的分类器似乎非常弱,因为这两个类别似乎没有在概率值上分开。我们还可以注意到,标签出现的频率越低,分布就越左移。例如,“喜剧”的概率得分似乎更低,这个标签只覆盖了数据集的 32%。该模型从这种罕见性中学习来预测较低的概率值。另一方面,当使用宏软 F1 损失时,我们正在创建一个不反映相同数量级的条件概率值的系统。相反,它学会不那么犹豫,并生成非常接近 1 或 0 的预测。我们在中间范围有较少的概率值。因此,在该范围内改变阈值时,性能不会发生太大变化。

使用宏软 F1 损失进行优化可以取代一些穷举技术,例如:

1-在验证集上搜索使性能最大化的最佳决策阈值

2-通过在训练前对少数类过采样或对多数类欠采样来校准概率值(在多标签分类的情况下非常复杂,因为标签同时出现)

缺点和对策

您可能已经注意到,在标签“Drama”的情况下,使用宏 soft-F1 loss 进行优化会产生一个预测“Drama”始终为正的模型(请注意概率直方图如何在最右侧接近 1,以及召回曲线如何在 100%的最大水平保持不变)。

每当训练好的分类器不提供信息时,这种副作用就可能发生。这是由于加州大学的研究人员在这篇 论文 的第 10 页上证明了 F1 度量的一些性质。

只要测试集中实际阳性的频率不为零,并且分类器不提供信息,就可以通过预测所有样本为阳性来最大化预期 F1

本文关注的是通过阈值化来最大化 F1 得分(策略 1),但同样的逻辑也适用于本文所述的基于软 F1 优化的最大化(策略 2)。

我们基本上希望最大化 F1 的期望值,作为正面预测的函数,因此我们可能需要定义以下术语:

*F1 = 2*tp / (2*tp + fp + fn) # translated expression of F1
a = tp + fn # number of actual positives
b = a / (tp + fp + fn + tn) # label frequency
c = tp + fp # number of predicted positives*

当分类器不提供信息时,真阳性的数量预计是所有阳性预测的一部分,等于基本比率(标签频率)

*E(tp) = c * b # expected tp in case of uninformative classifier
a + c = 2 * tp + fp + fn # denominator in previous F1 expression*

然后,可以使用以下公式计算预期 F1:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

并且期望 F1 相对于 c 的偏导数可以分解如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个导数总是正的,这证明了每当分类器没有信息时,系统将通过预测所有样本为正来学习获得最优 F1。

如果你觉得这种效果不好,我建议采取以下对策。

当考虑 F1-socre 时,我们默认推理正类(结果等于 1)。但是,你也可以考虑在相同的条件下,如果你对负类进行推理(结果等于 0),你会得到的 F1 分数。唯一的区别是 TP 和 TN 量的交替。

*F1_class1 = 2*tp / (2*tp + fp + fn)
F1_class0 = 2*tn / (2*tn + fn + fp)*

然后我们可以取这两个量的平均值来定义一个新的度量。

*New_F1 = (F1_class1 + F1_class0) / 2*

当然,让它变得可区分:

通过这样做,你可以期望系统通过不仅生成正面预测而且生成负面预测来抵消其先前的行为,以便优化这个新的损失。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这将保护系统在无信息分类器的情况下避免预测总是肯定的不可接受的行为。

摘要

生产 ML 系统的性能来自于部署可靠且易于维护的模型。决策阈值是复杂性的另一个来源。在这篇博文中,我分享了一个优化技巧,通过将 F1 得分的定义纳入损失函数(软 F1 损失)来避免不断调整决策阈值。这非常有帮助,尤其是在多标签分类的情况下,您希望使用相同的默认阈值 0.5 将预测转换为二进制结果,同时保持最佳的分类性能。

从海报预测电影类型是标签数量可能变高的一个例子。但这实际上是一个艰难的分类挑战。在一些标签上,我们只能得到非常弱的分类器。在无信息分类器的情况下,所描述的技术可能导致预测总是肯定的不良效果。如果你想避免这种影响,你可以使用双软 F1 损失。

在其他一些数据集上,比如汽车诊断,我可以看到非常有趣的结果。因此,如果您正在处理类似的任务,您可以在自己的数据集上尝试,并让我知道您得到的结果!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值