TowardsDataScience 博客中文翻译 2021(七百二十八)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

每个程序员都应该知道的 VSCode 快捷方式和“窍门”

原文:https://towardsdatascience.com/vscode-shortcuts-and-hacks-every-programmer-should-know-8d544bf6ab85?source=collection_archive---------5-----------------------

小窍门

“一天一条捷径让手指远离”——我

让我们从简单的开始吧——如果你喜欢快捷方式,你最好知道 VSCode 快捷方式配置页面的快捷方式。

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

VSCode 快捷方式页面(图片由作者提供)

好吧,我希望你通过了。答案如下:

**Mac**: Cmd[⌘]-K Cmd[⌘]-S
**Windows**: Ctrl-K Ctrl-S

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

VSCode 快捷菜单 GIF by author

好吧,我想这并不容易。让我将这篇文章分成三个不同的部分:

嗯,你可能已经知道了……对吗?2)我想你可能还不知道…
3)我打赌你不知道!

请注意,下面看到的 VSCode 上的所有快捷方式实际上都可以通过上面显示的配置页面进行定制

呸,你可能已经知道了…对吗?

这些可能是最简单的日常快捷方式,所有程序员都应该知道,因为它们以如此少的资源改善了我们的生活质量。

1。切换浏览器/面板/终端

# Explorer
**Mac**: Cmd[⌘]-B
**Windows**: Ctrl-B# Panel
**Mac**: Cmd[⌘]-J
**Windows**: Ctrl-J# Terminal **Mac**: Ctrl-`
**Windows**: Ctrl-`

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

vs code Toggles-GIF by author

2。分割(并选择)编辑器

VSCode 和任何编辑器的优点在于,人们可以很容易地一次查看和编辑多个文件。以下是如何创建多个编辑器窗口并在它们之间切换:

**Mac**: Cmd[⌘]-\ 
**Windows**: Ctrl-\# To select which editor to use:
**Mac**: Cmd[⌘]-[1-9] # select editor 1 to 9
**Windows**: Ctrl-[1-9]

3。在您的工作空间中搜索并打开文件

是的,永远不要从文件浏览器中点击打开文件。对于一个新手程序员来说,这绝对是一个危险的信号。

**Mac**: Cmd[⌘]-P, Enter
**Windows**: Ctrl-P, Enter

结合[2]和[3],我们可以实现以下目标:

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

使用拆分编辑器(2)和搜索文件(3)-GIF(按作者)

4。打开命令面板

毫无疑问,你必须知道的最简单和最有效的快捷键之一——打开命令面板可以让你做几乎任何事情,包括通过键盘访问所有的扩展。

**Mac**: Cmd[⌘]-Shift-P
**Windows**: Ctrl-Shift-P

这包括通过键盘触发扩展功能或更改主题。

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

5。向上/向下移动线

**Mac:** ⌥ + ↓ (down) / ⌥ ↑ (up)
**Windows**: Alt + ↓ (down) / Alt + ↑ (up)

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

向上/向下(向左)移动一行;向上/向下移动段落(右)-按作者排列的 gif

我想你可能还不知道…

好吧,我想我们大多数人都知道容易的,所以我们不要在他们身上浪费太多时间。让我们继续有趣的话题。

1。选择并编辑所有出现的单词

当试图在一个文件中编辑一个单词的多次出现时,这是非常有用的。(注意 : 这与 *Cmd-D* 非常相似,在这里选择下一个出现的单词。)

**Mac**: Cmd[⌘]-F2
**Windows**: Ctrl-F2

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

VSCode 上的 cmd-F2(GIF 由作者提供)

2。使用 VSCode 的源代码控制

即使对于喜欢使用命令行的人来说,拥有一个 GUI ( 源代码控制)有时也有助于提高我们的生活质量,尤其是当发生合并冲突时。通过直观地检查我们想要提交的文件,它给了我们保证,因为我们知道我们将要提交什么文件,并且节省了我们键入一些 git 命令的时间!

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

VSCode 源代码控制演示—作者 GIF

3。多个光标

能够随心所欲地同时在不同的地方进行选择性编辑就像是创建了自己的多个副本!有什么更好的方法来提高生产率?

为此,按住Alt键并选择您想要放置光标的位置(您可以一次选择多个!).完成后,只需按下Esc即可恢复到单个光标。

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

多光标-作者 GIF

我打赌你不知道!

现在,本节中的这些快捷方式/技巧有些晦涩,老实说,没有多少人会使用它们,除非他们是经验丰富的程序员,尽可能地在他们的开发工作流中挤出每一英寸的效率。

1。用户片段

如果你已经使用了足够多的编程语言,你应该知道你最常用的代码片段/样板文件。要定制您自己的代码片段,请转到首选项>配置用户代码片段。然后,您可以在一个全局(跨所有工作区使用)片段文件或一个仅用于您当前工作区的文件之间进行选择。

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

接下来,我们定义几个关键字段:

(a) scope:将该代码片段应用到的项目的语言
(b) prefix:您要键入以触发该代码片段的“键绑定”或前缀
(c ) body:实际的代码片段本身,其中每一行都是列表项
(d) description:对代码片段正在做的事情的可选描述

例如,我为 Pytest 的parametrize创建了一个代码片段:

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

Pytest 参数化片段—作者提供的图片

注意$<number>定义了一旦代码片段被触发,用户应该输入的字段。使用tab将允许用户在所需的输入之间切换。

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

如何使用示例 Pytest 片段— GIF by author

2a。VIM 扩展

VIM 是你讨厌或喜欢的技能之一。我再怎么强调了解 VIM 的基础知识对于加快一个人的工作流程是多么重要也不为过。我认为使用 VSCode 的 VIM 最有力的论据是,您只需学习一组快捷键(键绑定),就可以在终端或 VSCode 上应用它们。

比如 VSCode 剪行的快捷键是Cmd-X。但是,如果您了解 VIM,您可以应用一个等价的键绑定dd来剪切一行,这样就不需要学习另一组键绑定了!此外,VIM 键绑定通常更简洁,随着时间的推移,可以节省更多的击键次数。

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

VIM 与 VSCode 键绑定— GIF by by author

我使用的分机是:

Name: Vim
Id: vscodevim.vim
Description: Vim emulation for Visual Studio Code
Version: 1.21.8
Publisher: vscodevim
VS Marketplace Link: [https://marketplace.visualstudio.com/items?itemName=vscodevim.vim](https://marketplace.visualstudio.com/items?itemName=vscodevim.vim)

一定要看看我下面的文章,我简要介绍了 VIM 和一些我最喜欢的在 VIM 中使用的键绑定。

2b。将 **CAPS LOCK** 键重新映射到 **ESC**

这是使用 VIM 的延续,因为退出键在 VIM 中用于退出任何当前模式。把你的左手伸到键盘的角落去按那个退出键实在是太没有效率了!相比之下,使用CAPS LOCK键逃跑——你一生中小拇指移动距离的总和将会大大增加。

在这一点上相信我。

3。打开设置(UI)和**settings.json**

令人惊讶的是,VSCode 对此没有 keybinding!然而,作为一个喜欢尽可能自定义我的 VSCode 工作空间的人,我经常访问设置(首选项>设置)和settings.json。以下是我为自己设定的按键。

# Open settings (UI)
**Mac**: Cmd[⌘]-,
**Windows**: Ctrl-,# Open `settings.json`
**Mac**: Cmd[⌘]-Shift-,
**Windows**: Ctrl-Shift-,

最后的想法

如果你想要更多关于生产力黑客的文章,请在评论中告诉我!😃

支持我! —如果你喜欢我的内容并且没有订阅 Medium,请考虑支持我并通过我的推荐链接在这里(注:你的一部分会员费将作为推荐费分摊给我)。

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

戴红帽的女孩在 Unsplash 上的照片

用非策略强化学习走下悬崖

原文:https://towardsdatascience.com/walking-off-the-cliff-with-off-policy-reinforcement-learning-7fdbcdfe31ff?source=collection_archive---------21-----------------------

政策外强化学习和政策内强化学习的深入比较

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

一座悬崖,作为背景。艾伦·卡里略在 Unsplash 拍摄的照片

为了学习强化学习(RL)的基础知识,萨顿和巴尔托[1]的教科书悬崖行走的例子是一个很好的开始,提供了 Q-学习和 SARSA 的例子。你可能知道,SARSA 是 S tate、Aaction、 R eward、 S tate、Aaction 的缩写——用来更新价值函数的轨迹。为了保持类比,Q-learning 可以概括为 S tate,Aaction, R eward, S tate 或者 SARS(注意第二个动作无所谓!).不同之处在于,SARSA 是 on-policy 而 Q-learning 是 off-policy 。这到底是什么意思?

操纵悬崖

在进入那个问题之前,我们先来定义一下我们的悬崖世界。我们勇敢的特工站在悬崖边,试图走最少的步数(允许的步数有)到达悬崖的另一边。为了建立这个目标的模型,达到目标结束这一集并给予+10 的奖励,每个中间步骤花费-1,掉下悬崖花费高达-100。不用说,应该避免走下悬崖。

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

悬崖行走环境,有奖励,起点和终点。步入悬崖或球门瓷砖结束了学习插曲。

一开始,我们完全不知道,但是我们通过观察很快就学会了。在几次从悬崖上滚下来或者在无人区里漫游之后,我们应该学会如何到达目的地。每走一步,我们观察一个奖励,并使用时间差(TD)更新方程。我们先来看看 SARSA :

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

SARSA:时间差分更新方程

简单地说:我们将自己的预测与观察到的回报进行比较,并利用这种差异做出更好的预测。在简单的数学中:我们测量误差(r_t+1 + Q_t+1)-Q_t,并用该误差更新我们对Q_t的估计。注意,当Q_t=(r_t+1+Q_t+1)适用于所有状态和动作时,我们的算法已经收敛。

让我们写出 Q 值代表什么,因为这对理解很重要。考虑一整集的回报轨迹。使用简化符号,我们可以将 Q 值定义如下:

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

q 值(没有状态、动作和折扣的简化表示)。请注意,每个 Q 值估计的是累积的未来回报。

当然,回报是不确定的,所以我们不能简单地将我们的 Q 值设定为等于单一的回报轨迹。这个想法很简单。Q 值预测轨迹的值。当r_T=-100由于坠入悬崖,所有的 Q 值都会受到严重影响。

现在, Q-learning 的工作方式与 SARSA 略有不同:

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

Q-learning:时间差分更新方程

你知道为什么 Q-learning 可能被称为 SARS 算法:对于我们的更新,当评估我们的行动a_tr_t+1时,我们在a_t+1采取的实际行动无关紧要。也许a_t+1在我们真实的样本轨迹中把我们引下悬崖;这无关紧要,因为我们取的是未来行动的最大值,而不是真实值。

在探索中学习

在训练过程中,两种算法都选择每块瓷砖的最佳动作,给定我们当前的信念(“贪婪”动作选择):

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

为当前 Q 值选择最佳行动的最大化问题

特别是在早期,这些信念(Q 值)可能是完全错误的——如果我们总是走最长的路,因为它曾经有效,我们永远不会知道有捷径。探索是获得更好政策的关键。

ε-贪婪策略通常遵循贪婪方法,但有时也会做些别的事情。假设有 5% ( ϵ=0.05)的时间,我们采取随机行动。当站在边缘时,那个随机的动作可能只是告诉我们*‘向右走’*当我们真的,真的不应该的时候。对于我们的 Q-learning 代理和 SARSA 代理来说,这样的行动不会有好结果。

站在离悬崖一瓦远的地方会变得更有趣。我们可以看到为什么我们稳健的 Q-learning 非常舒服地靠近边缘,而我们摇摆不定的 SARSA 朋友可能更喜欢保持安全的距离。对于奖励更新,Q-learning 只是简单地看不到未来多一步;下一个图块的实际动作无关紧要。

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

用 SARSA 更新时间差(按策略)。使用实际轨迹,在跌落悬崖时获得的大的负奖励被用于更新所有先前状态和动作的 Q(s,a)值。[作者自己的作品]

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

使用 Q 学习的时间差异更新(偏离策略)。掉下悬崖时获得的巨大负回报不会影响早期的 Q 值,因为最优轨迹用于更新。[作者自己的作品]

结果呢?一个训练有素的 Q-learning agent 通常遵循最优路径,而 SARSA agent 则需要走一点弯路。例如,参见下面的模拟样本路径:

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

学习完成后 Q-learning 和 SARSA 的示例路径。注意,SARSA 绕过了悬崖,因为政策更新更重视跌入悬崖。

超越悬崖(政策上与政策外)

到目前为止还好,但是悬崖漫步是一个程式化的教科书例子。一只山羊可以弄明白这一点(它们实际上每天都在这么做)。对于实际的 RL 问题,我们可以用这些信息做什么呢?

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

一只山羊。穆罕默德·努里·伊塞诺鲁Unsplash 上的照片

你不太可能使用 SARSA 或 Q-learning 来解决更具挑战性的强化学习问题。在这两种情况下,我们都需要用 Q 值来填充表格。为了获得准确的查找表,我们必须多次观察每个状态-动作对,以了解所有的Q(s,a)。悬崖行走问题只有 192 个状态-动作对(48*4),但典型的 RL 问题太大了,无法在查找表中捕获。

尽管没有使用实际的算法,策略学习和非策略学习的原则是相同的。简而言之:(I)使用实际回报轨迹来更新 Q 值的更新函数是符合政策的,(ii)包括最大值算子的更新函数可能不符合政策。无论我们使用什么样的探索方案,政策上/政策外的两难选择仍然是相关的——我们将在后面深入探讨。悬崖漫步问题仅仅阐明了权衡和行为。

行为策略还是目标策略?

为了充分理解政策上和政策外之间的困境,我们应该掌握行为政策和目标政策之间的区别。评估 RL 算法时,明确我们实际测量的性能非常重要。

行为策略是包含随机探索的策略,目标策略不包含随机探索。如果我们总是遵循我们学到的最佳路径(目标策略),就没有理由绕过悬崖。如果我们在现实中部署行为策略,我们应该谨慎。通常,我们使用行为策略在安全的环境中学习——很可能是模拟——并在现实生活中部署最终的目标策略。然而,情况并非总是如此。

举例来说:假设我们训练一个真实的机器人(而不是虚拟代理)安全地机动到悬崖的另一边。你不希望你昂贵的机器人在快乐探索的同时驶下悬崖。如果新的观察有现实生活中的后果,你在探索时显然会谨慎得多。还可以考虑用历史数据来测试你的交易算法,或者用真钱在股票市场上释放它来学习——这是非常不同的含义。

仔细探索的一个更常见的原因是实验通常计算量很大。由于 Q-learning 具有不太一致的回报模式,轨迹比 SARSA 具有更大的方差,并且收敛更具挑战性。此外,嵌入式最大化问题max a ∈ A(s_t)`可能需要大量的努力来解决——不是每个动作空间都只包含四个移动。

探索很少是“免费的”,即使是在虚拟环境中。

正面交锋

燃眉之急:哪种算法更好?你应该用哪一个?Q-learning 还是 SARSA?

从表面上看,Q-learning 显然提供了一条更短的路径(通常是最优的),从而提供了一个更好的解决方案,但这忽略了隐藏在下面的细微差别。下图显示了一个清晰的权衡;平均来说,SARSA 会得到更大的奖励,而 Q-learning 平均来说需要更少的步骤。当然,这只适用于行为策略——用 Q-learning 得到的目标策略显然更胜一筹。

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

**左:**奖励对比。平均而言,由于坠入悬崖的次数较少,SARSA 会产生更高的回报。**右:**步骤对比。平均来说,Q-learning 需要更少的步骤,因为它对跌落悬崖不太敏感。

再说一次,我们不能简单地比较目标政策并得出 Q-learning 更好的结论。恰好对ϵ=0.05成立,但是用ϵ=0.001代替它,我们可以用两者获得最优路径。随着探索趋向于 0,SARSA 和 Q-learning 收敛到相同的方法。学习过程中探索通常会减少——例如通过设置ϵ=1/n——并且表面上看起来 Q-learning 的好处也随之消失。

“视情况而定”将是对“哪一个更好?”这个问题最忠实的回答,但不是最有用的一个。让我们试着推导出一些经验法则。

在下列情况下使用策略学习(SARSA):

  • 学习是昂贵的
  • 计算工作量是一个瓶颈
  • 你不需要探索一切
  • 行动问题很难解决
  • 你不介意微调探索参数
  • 你愿意为了稳健而牺牲一些回报
  • 学习时的奖励很重要
  • 你厌恶风险

在下列情况下使用偏离策略学习(Q-learning):

  • 学习是廉价的
  • 计算工作量不太相关
  • 你想探索很多东西
  • 行动问题很容易解决
  • 你不想麻烦微调探索
  • 学习时的奖励并不重要
  • 只有目标策略的性能才是重要的
  • 你喜欢冒险

还是那句话,两者都能达到同样的解决质量,适当的调优是必不可少的,这取决于问题和目的,不存在一刀切等答案。等等。毕竟,它们是经验法则。确定您需要哪种方法的最佳方式?去站在悬崖边,感受一下这种感觉。

想看完整的代码吗?在我的 GitHub 库上查看一下吧。

有兴趣用深度 Q-learning 解决悬崖行走问题?请查看我关于 TensorFlow 实现的文章:

*

转而寻找政策梯度实施?

参考

[1]萨顿和巴尔托(2018 年)。强化学习:简介。麻省理工出版社。*

想在 12 周内成为数据科学家?

原文:https://towardsdatascience.com/want-to-become-a-data-scientist-in-12-weeks-d32d5ff0bef4?source=collection_archive---------24-----------------------

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

菲尔·肖顿在 Unsplash 上的照片

花钱前再想一想

我看到很多广告声称要让你在 12 周内成为一名数据科学家。他们说他们可以教你 python 编程,Python 库如 Pandas、Matplotlib 和 scikit-learn,其他可视化工具如 Tableau、SQL,可能还有更多。12 周后,你将获得一份收入约 10 万美元的工作。但是在那之前,你必须付一大笔钱去上那些课。他们有多现实?

他们现实吗?

这要看你处于哪个层次了。如果你已经会一门编程语言,转行做 Python 新职业,那么只要努力,三个月就能学会这一切。但是,如果你没有任何编程背景,那么,即使你没有其他工作,只专注于学习,认为你可以在三个月内学会这一切,那就太雄心勃勃了。

合理的时间框架

如果你想成为一名数据科学家,你需要学习这两种语言中的至少一种。而且学习编程语言并不意味着只是学习 if/else 语句和循环。不仅仅是这样。你需要学习数据结构和编程解决问题,这需要一些时间。你应该至少花三个月的时间只学习一门语言。如果你不这样做,并且匆忙地一下子学习图书馆、数据库,你可能最终会把所有的东西都学到无用的程度。我并不是说在你开始学习其他任何东西之前,你需要成为一个绝对的编程专家。但是你至少需要能够自如地编写一些代码解决问题。有很多编程问题可以测试你自己。我建议,试试 leetcode 。他们在 leetcode 中有三种不同类别的问题,简单、中等和困难。看看你能不能解决一些简单的问题。然后继续学习像 Numpy、Pandas、Matplotlib、seaborn、scikit-learn 等库。

仅仅学习其中几个库就需要另外三个月的时间。探索性数据分析的思路,自己去做,需要一定时间的练习和把握。学习 SQL 应该不会花太多时间,因为你会发现熊猫和 SQL 有很多相似之处。但是,即使你学得很快,学习使用几个大数据集和中级复杂查询,组织和设置数据集也需要几个月。所以,我说的是至少八个月。

这些只是最低要求

如果你人脉好,运气够好,之后会找到工作的。但是你需要记住,你必须不断学习更多的工具和更多的概念。你需要不断提高你的编程技能。有一点很重要,就是统计。如果你已经很擅长了,那太好了!否则至少学习一些初级的推断统计和模型拟合,学习用 Python 或者 r 实现,Python 的 scikit-learn 库只是机器学习的工具。但是学习一些真正的概念会很有用。此外,我认为数据挖掘是一项重要的技能。外面有如此多的数据。我们需要提取它们。许多工作机会也要求它。

我不想让人沮丧。如果你能发展所有这些技能,你在就业市场上会很吃香。所以,花一两年的时间也不是一个坏主意。它会给你的生活增加很多价值。

12 周到 18 周什么是合理的

在 12 周内成为一名数据科学家看起来太难了。但是如果你没有那么多时间,并且想尽快找到一份工作,那么成为一名数据分析师可能是一个不错的目标。如果你是大学毕业生或大学生,我敢肯定,你知道 excel。

  1. 进一步提高你的 excel 技能。学习一些高级技术,如垂直查找、数据透视表、宏、visual basic。我觉得接起来会更快。Excel 现在这么先进。有许多数据分析师角色需要高级 excel 技能。
  2. 学习一个好的数据可视化工具,比如 Tableau。无需编写任何编程逻辑或代码,您就可以进行大量的可视化工作。它有如此多的内置选项。简单的拖放可以实现复杂的可视化。
  3. 学习 SQL。学习 SQL 可能比学习编程语言更容易。SQL 查询就像常规语言。所以更容易把握。另外,在就业市场上,这是一项无价的技能。我在不同的会议上遇到过很多人,他们在过去的 10 年里都是 SQL 开发人员。
  4. 开始学习 Python 或 r 之类的编程语言,但如果这是你的第一语言,你必须坚持练习一段时间才能学好。

发展软技能

这三项技能合在一起应该会让你有工作能力。但是我们太注重学习工具,却忘了花些时间培养软技能。

  1. 在你将使用这些工具的地方发展一些商业洞察力是很重要的。没有一些好的现实世界的知识,将很难有效地使用这些工具。因此,阅读文章、书籍或报纸来保持更新和发展一些现实世界的知识。所以,你可以谈论如何在人群中或面试中使用这些工具。
  2. 网络是另一项有价值的技能。参加聚会,参加研讨会,会议,听有经验的人讲话。这是发展知识和建立联系的好方法。
  3. 在堆栈溢出、堆栈交换和闲置通道方面与社区合作。这会让你了解最新的就业市场,最新的技术,并提高你的软技能。

结论

我不反对训练营。我从训练营开始了我的旅程,我很感激那个训练营。但这是一个长达六个月的学习编程概念和 SQL 的训练营,这是现实的。我们学习了一些编程语言的基础知识。更重要的是,它是免费的。是 LaunchCode 发来的。如果你在美国,请检查。他们很好。我确信他们仍然是自由的。我的建议是,开始上免费课程。甚至完全没有必要为学习编程语言付费。外面有很多很棒的免费课程。CourseraEDXuda city有一些质量不错的免费课程。先试试那些免费的课程。这会给你一些启示。很可能,你会做出更好的决定,去哪个新兵训练营支付你或你父母的血汗钱。否则,你可能会成为另一个受害者。

想用 Python 做 ETL?

原文:https://towardsdatascience.com/want-to-do-etl-with-python-137709f37680?source=collection_archive---------5-----------------------

找到最适合您的用例的 Python ETL 工具

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

Unsplash 上拍摄的 ThisisEngineering RAEng

提取、转换和加载

现代组织依赖于使用一流的工具和技术收集的巨大数据池来提取数据驱动的见解,这有助于做出更明智的决策。由于现在的行业标准技术进步带来的改进,组织现在可以更容易地访问这些数据池。

但是在这些公司实际使用这些数据之前,它需要通过一个叫做 ETL 的过程,ETL 是提取、转换和加载的缩写。

ETL 不仅负责向这些组织提供数据,还负责确保数据具有正确的结构,能够被他们的业务应用程序高效地使用。今天的企业在选择正确的 ETL 工具时有很多选择,比如用 Python、Java、Ruby、GO 等构建的工具,但是对于这篇文章,我们将更多地关注基于 Python 的 ETL 工具。

什么是 ETL?

作为数据仓库的核心组件,ETL 管道是称为提取、转换和加载的三个相关步骤的组合。组织使用 ETL 过程来统一从多个来源收集的数据,以便为他们的企业应用程序(如商业智能工具)构建数据仓库、数据中心或数据湖。

您可以将整个 ETL 过程视为一个集成过程,它帮助企业建立数据管道并开始将数据接收到最终系统中。下面是对 ETL 的简要说明。

**●提取:**包括从 CSV、XML 和 JSON 等多种格式中选择正确的数据源,提取数据,以及测量其准确性。

● Transformation: 当数据在临时或暂存区中等待最后一步时,所有的转换功能(包括数据清理)都应用于该数据。

**●加载:**涉及将转换后的数据实际加载到数据存储或数据仓库中。

2021 年的 Python ETL 工具

Python 凭借其简单性和高效性风靡全球。它现在正被用于开发一系列领域的大量应用程序。更有趣的是,热情的 Python 开发者社区正在积极地生产新的库和工具,使 Python 成为最激动人心和最通用的编程语言之一。

因为它现在已经成为数据分析和数据科学项目的首选编程语言,Python 构建的 ETL 工具现在非常流行。为什么?

这是因为他们利用 Python 的优势提供了一个 ETL 工具,不仅能满足您最简单的需求,还能满足您最复杂的需求。

以下是目前在 ETL 行业引起轰动的 10 大 Python ETL 工具。

1. Petl

是 Python ETL 的缩写, petl 是一个完全用 Python 构建的工具,设计得非常简单。它提供了 ETL 工具的所有标准特性,比如从数据库、文件和其他来源读取和写入数据,以及大量的数据转换功能。

petl 也足够强大,可以从多个数据源提取数据,并支持大量文件格式,如 CSV、XML、JSON、XLS、HTML 等等。

它还提供了一组方便的实用函数,可以让您可视化表、查找数据结构、计算行数、值的出现次数等等。作为一个快速简单的 etl 工具,petl 非常适合创建小型 ETL 管道。

虽然 petl 是一个一体化的 etl 工具,但是有些功能只能通过安装第三方包来实现。

在这里了解更多

2.熊猫

Pandas 已经成为一个非常受欢迎的用于数据分析和操作的 Python 库,这使得它成为数据科学社区中最受欢迎的库。这是一个非常容易使用和直观的工具,充满了方便的功能。为了在内存中保存数据,pandas 将 R 编程语言中的高效 dataframe 对象引入 Python。

对于您的 ETL 需求,它支持几种常用的数据文件格式,如 JSON、XML、HTML、MS Excel、HDF5、SQL 和许多其他文件格式。

Pandas 提供了标准 ETL 工具所能提供的一切,使其成为快速提取、清理、转换和向终端系统写入数据的完美工具。Pandas 还可以很好地使用其他工具,如可视化工具等,以使事情变得更容易。

在使用熊猫时,你应该记住的一件事是,它将所有东西都放入内存中,如果内存不足,可能会出现问题。

在这里了解更多

3.路易吉

Spotify 的 Luigi 是一个工作流管理系统,可以用来创建和管理大量的批处理作业管道。Luigi 允许用户将数以千计的任务连锁化和自动化,同时通过网络仪表板方便地提供所有管道的实时更新。它提供了大量的模板,让您可以快速创建数百个任务。

Luigi 还提供了一个依赖图,为您提供了管道中各种任务及其依赖关系的可视化表示。

Luigi 最大的优点之一是它确保所有文件系统操作都是原子的。由于 Luigi 的良好记录,它提供了列表中其他 ETL 工具中最好和最强大的 ETL 管道创建功能。这就是像 Spotify、Foursquare、Stripe、Buffer 等企业继续依赖 Luigi 的原因。

在这里了解更多

4.阿帕奇气流

Apache Airflow 是一个非常易用的工作流管理系统,它允许用户无缝地创建、调度和监控所有工作流管道,甚至是 ETL 管道。它最初是由 Airbnb 开发的,但后来被添加到 Apache 软件基金会的剧目中。

为了让您了解作业管道的最新进展,Airflow 附带了一个名为 Airflow WebUI 的直观用户界面。

气流可以在不同级别的工作负载之间平稳地上下调节。这里要注意的主要事情是,Airflow 本身并不做 ETL,相反,它让您能够在一个地方监督管道处理。

您可以使用自己选择的其他库和操作器来扩展气流。Airflow 还可以与微软、谷歌和亚马逊等一系列云服务提供商很好地集成,并提供简单的即插即用运营商。

在这里了解更多

</5-essential-tips-when-using-apache-airflow-to-build-an-etl-pipeline-for-a-database-hosted-on-3d8fd0430acc>

5.美味的汤

Beautiful Soup 是目前最受欢迎的基于 Python 的 web 抓取工具之一,当谈到 ETL 时,Beautiful Soup 可以帮助你从任何你想要的网站上提取数据。

如果您不知道 web scraper 是什么,它是一个位于 HTML 或 XML 解析器之上的小程序,在我们的例子中,它提供 Pythonic 式的习惯用法,用于从解析树中找到正确的数据。Beautiful Soup 不仅允许您抓取数据并按原样存储,还可以用来为您的数据提供一个定义好的结构。

使用它,您可以导航、搜索和修改文档的解析树,并提取您需要的任何内容。默认情况下,它还可以处理所有的文档编码和解码,这样就少了一件需要担心的事情。Beautiful Soup 完全由 Python 构建,甚至可以与各种产品无缝集成。

在这里了解更多

6.

Bonobo 是一个完全包含的轻量级 ETL 框架,它可以完成从提取数据、转换数据到加载到终端系统的所有工作。

为了创建 ETL 管道,Bonobo 使用了图表,这使得构建和可视化所涉及节点的一切变得更加容易。

Bonobo 还支持管道图中元素的并行处理,并确保转换过程中的完全原子性。如果你想从 Bonobo 中获得更多,你可以通过它的扩展来实现。

它的一些流行的扩展是 SQLAlchemy、Selenium、Jupyter、Django 和 Docker。真正让 Bonobo 轻量级和快速的是它针对小规模数据的能力,这使它成为简单用例的一个好选择。

如果你知道如何使用 Python,你会毫无疑问地找到 Bonobo。

在这里了解更多

7. Odo

Odo 是 Blaze 生态系统 的五个库之一,旨在帮助用户存储、描述、查询和处理手头的数据。

这里列出 Odo 是因为它擅长将数据从一个容器迁移到另一个容器。作为一个轻量级的数据迁移工具,Odo 可以在小型的内存容器和大型的核外容器上创造奇迹。

Odo 使用小型数据转换函数网络将数据从一种格式转换为另一种格式。支持的数据格式列表包括内存中的结构,如 NumPy 的 N 维数组、Pandas 的 DataFrame 对象、列表,以及传统的数据源,如 JSON、CSV、SQL、AWS 等等。

由于所支持的数据库具有极快的原生 CSV 加载能力,Odo 声称它可以击败任何其他纯粹基于 Python 的加载大型数据集的方法。

在这里了解更多。

8. Pygrametl

网站/GitHub 回购:https://chrthomsen.github.io/pygrametl/

这个开源框架非常类似于 Bonobo,并允许 ETL 管道的顺利开发。当实际使用 pygrametl 工具时,您必须对 Python 有所了解,因为该工具要求开发人员在其中编码整个 etl 管道,而不是使用图形界面。

该工具提供了常用操作的抽象,例如与来自多个来源的数据交互、提供并行数据处理能力、维护缓慢变化的维度、创建雪花模式等等。

使用这种方法的一个主要好处是,它允许 pygrametl 与其他 Python 代码无缝集成。这在简化这种 ETL 过程的开发中起着关键作用,甚至在需要时便于创建更复杂的操作或管道。

在这里了解更多

9.马拉

如果您不喜欢自己编写所有代码,并且认为 Apache Airflow 对您的需求来说太复杂,那么您可能会发现 Mara 是您 ETL 需求的最佳选择。您可以将 Mara 视为编写纯基于 Python 的脚本和 Apache Airflow 之间的轻量级中间地带。为什么?

这是因为 Mara 基于一套预定义的原则,可以帮助您创建 ETL 管道。这些假设解释如下:

使用 Python 代码创建数据集成管道。

PostgreSQL 将作为数据处理引擎。

一个 web UI 将用于检查、运行和调试 ETL 管道。

节点依赖上游节点完成,无数据依赖或数据流。

命令行工具将被用作与数据和数据库交互的主要来源。

将使用基于 Python 多处理能力的单机流水线执行。

成本较高的节点先运行。

这些假设负责降低管道的复杂性,但由于一些技术问题,Mara 仅在 Linux 和 Docker 上可用。Mara 还提供了一系列工具和实用程序,用于在其 GitHub repo 上创建数据集成管道。

在这里了解更多。

10.气泡

Bubbles 是另一个基于 Python 的框架,可以用来做 ETL。但是 Bubbles 不仅仅是一个 ETL 框架,它还有更多。Bubbles 为用户提供了一组工具,可以对数据进行多种操作,比如监控、审计、清理和集成。

大多数 ETL 工具使用脚本或图形来描述它们的 ETL 管道,而不是气泡。在其核心,Bubbles 使用元数据来描述其管道,使管道设计者的任务变得容易得多。

使用 Bubbles 的最好理由之一是它是技术不可知的,这意味着您不必担心如何使用数据存储,您可以简单地专注于以您选择的格式获取数据。由于其技术无关性,Bubbles 提供了一个抽象的 ETL 框架,可以在各种系统上快速使用,以执行所有必要的 ETL 操作。

在这里了解更多

结束…

如今,现代企业更加依赖数据来做出明智的决策,ETL 工具在这一过程中发挥着至关重要的作用。它们不仅能帮你节省时间,而且非常经济实惠。鉴于 ETL 工具日益增长的重要性,它已经成为当今企业的必需品。

现在市场上有很多 Python ETL 工具,它们是用一系列编程语言构建的,可以满足您所有的 ETL 需求。请记住,并不是所有的 ETL 工具都是一样的,虽然其中一些工具可能提供了丰富的特性集,但其中一些工具可能非常简单。

认识你的作者

克莱尔 D 。是 Digitalogy 的内容制作师和战略家,他可以将你的内容想法转化为清晰、引人注目、简洁的文字,与读者建立强有力的联系。

上跟我连线Linkedin&Twitter。****

想要擅长时间序列预测吗?预测天气。

原文:https://towardsdatascience.com/want-to-get-good-at-time-series-forecasting-predict-the-weather-a2fc745b9b3?source=collection_archive---------19-----------------------

了解时间序列的组成部分

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

来源:图片由 geraltPixabay 拍摄

对于一个最初来自经济学背景的人来说,我会花一些时间来建立可以预测天气模式的模型,这可能看起来很奇怪。

我自己也经常质疑这一点——但这是有原因的。温度模式是最容易预测的时间序列之一。

时间序列组件

当时间序列被分解或分解成单个元素时,序列由以下部分组成:

  • **趋势:**时间序列在一段重要时间内的大致方向
  • **季节性:**在时间序列中频繁重复的模式
  • **随机:**时间序列中的随机波动

仔细想想,温度数据的组成非常明显。

至少在北半球的大部分地区,总的趋势是气温随着夏季月份的到来而上升,随着冬季月份的到来而下降。

例如,这是爱尔兰都柏林机场 2015-2018 年的平均温度波动,来源于气象局:

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

资料来源:RStudio

分解这个时间序列直观地揭示了以下内容:

趋势

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

资料来源:RStudio

季节性

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

资料来源:RStudio

随机

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

资料来源:RStudio

正如我们在上面的图表中看到的,季节模式清楚地显示了一个年度周期。例如,自相关函数揭示了每 12 个月温度数据的强相关性。这是有道理的,因为显而易见的是,一月份的气温将与其他年份记录的一月份气温表现出最大的相关性。在比较七月的温度时也是如此,以此类推。

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

资料来源:RStudio

对这些组成部分的直观理解有助于更好地理解它们在其他时间序列中的应用。

例如,航空乘客数量的季节性模式(至少在新冠肺炎之前)是,夏季几个月航空乘客较多,冬季乘客总体较少。下面是一个乘客数量波动的例子,它是使用来自旧金山开放数据的数据生成的:

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

来源:Jupyter 笔记本输出

领域知识对于识别时间序列的组成部分也很重要。例如,专门从事能源市场分析的数据科学家会直觉地知道,商业用电量往往遵循每周一次的模式,而不是每年一次的季节性模式。也就是说,消费倾向于在高使用率的日子(如星期一)达到峰值,而在周末显著下降。

首先可以预测一个时间序列吗?

很多时候,那些时间序列分析的新手会试图预测数据中存在大量内在随机性的序列。

例如,股票价格往往遵循非常随机的模式。这些时间序列通常是由周期性而不是季节性驱动的,因此时间序列中的波峰和波谷不会以特定的间隔出现。

因此,尽管整体趋势可能会给出股票方向的长期观点,但直接预测时间序列仍然非常困难,因为时间序列中的模式通常不会重复。

也就是说,很多时候,人们可能试图使用 ARIMA 模型来预测股票价格,而没有花足够的时间来理解时间序列的组成部分。我也为过去犯的这个错误感到内疚。

此外,值得注意的是,温度数据不会受到人为干预的影响。然而,许多时间序列可以(包括股票价格),因此,过去的数据无法解释这些干预。

使用一个单独的例子,假设我试图使用谷歌的社区移动数据来尝试预测一个主要城市在六个月内的移动趋势。

这种预测毫无意义,因为它完全依赖于时间序列本身以外的因素,如政府封锁、新冠肺炎流通等。

结论

严格来说,在预测时间序列时,不必从天气模式开始。但是,您应该从一组易于预测且具有可预测趋势和季节性模式的数据开始。

人们犯的一个大错误是试图预测一个具有许多内在随机性的时间序列。你不仅无法对这些数据做出可信的预测,而且像自相关函数这样的术语对你来说也没有直观的意义。

预测一个不受外部因素影响的时间序列(温度模式是极少数因素之一)将让你更好地理解为什么诸如自相关、平稳和其他因素具有理论相关性。事实上,当需要预测更复杂的数据(如销售数据)时,您将能够更好地理解 1)模型的理论工作方式,以及 2)使用不同时间序列模型对数据的优缺点。

免责声明:本文是在“原样”的基础上编写的,没有担保。它旨在提供数据科学概念的概述,不应被解释为专业建议。本文中的发现和解释是作者的发现和解释,不被本文中提到的任何第三方认可或隶属于任何第三方。

搞定你的面试,获得一份数据科学家的工作:成为异类

原文:https://towardsdatascience.com/want-to-land-your-dream-applied-data-science-job-be-the-anomaly-c5f5304d41f2?source=collection_archive---------23-----------------------

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

达里娅·皮姆金娜在 Unsplash 上拍摄的照片

这不是一篇关于改善你求职过程的博客文章(读这篇文章,而不是)。

这是一篇关于我们(我和我的同事 Joshua Loong 和 Lewis Davies 作为百思买高级分析部门的招聘经理)在寻找应用数据科学家的博文。如果这能帮你找到工作,那太好了。更充实的职业,令人惊叹。但是完全透明:我写这篇文章是希望提高我们招聘渠道中候选人的质量。

“寻找数据科学家,这是一个坚实的平均水平。”

你听过有人这么说吗?号码

我们都希望找到顶级异常。我在 RJMetrics(一家被 Magento/Adobe 收购的商业智能软件初创公司)和 Best Buy Canada(一家 F500 全渠道零售商)招聘数据科学家和分析师的经历都是如此。我们在大海捞针。在同龄人中排在前 95%的人。

但是 KPI 是什么呢?什么是“好?”在众多编写 python、能够清理数据、运行回归和开发应用程序的人中,是什么定义了最佳候选人?

在招聘能够使用数据解决实际业务问题的应用数据科学家的背景下(比如自动化、优化),我和我的同事们对以下三种能力印象深刻:

“我是唯一一个能够…”

#1 生成我自己的公关

一个独角兽数据科学家应该能够清楚地说明业务问题,它如何与组织或战略目标保持一致,为什么建议的解决方案是最好的,以及预期的影响。都是外行人说的。不要依赖产品经理来管理利益相关者和客户,

我们采访了许多分析专家,他们能够将技术需求转化为分析和模型,但从来没有问过自己为什么他们要这么做。为什么今年建立财务预算预测模型比预测销售人员绩效更重要?

我们认为数据科学家应该对他们的工作有发言权:优先考虑为组织带来最大价值的项目和任务。这从理解为什么我们被要求处理一个给定的计划开始。它确保我们致力于最有价值的项目(收入或成本节约潜力)。成功是什么样子的?首席执行官不断向您询问插入数据科学以提高利润的新方法。

我们也遇到过数据科学家不能用外行的术语说话,导致利益相关者不理解我们是如何工作的。当我们的老板错过最后期限时,这尤其令人沮丧,因为新的发现需要重要的模型改变,但他们不知道为什么。

如果你能直接与高管沟通,就更容易推后不可行的需求和时间表。解释为什么 X 问题太难建模,错误的做法,或者为什么 Y 方法可能需要更多时间。

因此,当企业要求创建一个应用程序来个性化 web 体验时,我们首先要问为什么:

  • 做一个根本原因分析
  • 描述一下这个问题
  • 概述对业务的影响
  • 解释为什么解决这个问题将有助于我们实现战略目标
  • 然后起草一个解决方案,估计它对 KPI 的影响(试试这个亚马逊新闻发布练习)

换句话说,创建一个类似 mad lib 的执行摘要:

“我们的业务面临着 _________________ 的挑战,因此我们正在开发一个 _______ 的解决方案,我们预计它将产生 _____ 的影响。我们使用了以下高级分析方法和现代分析工具 ____,包括现在可重复用于 ______ 的组件和基础架构。老办法是 __。新的方式更好,因为 ____”

如果你被挖掘来领导越来越多的数据科学项目,并获得更多的资源和自由,不要感到惊讶。如果领导理解你,他们会相信你的判断。

#2 做你自己的魔鬼代言人

表明你已经检查了你的盲点。

数据科学面试流程通常涉及一个项目组件,候选人在其中解决一个分析问题。可能会涉及到数据清理、ETL 和建模组件。大多数候选人在所有这些方面都做得不错,但在两个关键领域有所失误:

  1. 他们未能概述其模型的限制和警告(即,为什么他们的模型在众多其他选项中是“最好的”),以及
  2. 忘记提出对未来迭代的改进(如果您可以访问其他数据集或有更多时间,您会尝试什么?).

从来没有“完美”的模型,我们在构建它的时候都会想到局限性和替代方案。然而,许多候选人未能传达这些信息。

是的,强调为什么我们刚刚提出的模型可能不是最好的是很可怕的,因为它可能会使它完全无效。但另一种选择要糟糕得多:在不清楚如何改进的情况下使用次优模型。

在百思买,持续改进和建设性反馈是推动我们发展的核心价值观。整个技术组织使用敏捷和精益原则。不怕提出半生不熟的想法并与同行辩论的候选人最受欢迎。所以,继续前进,展示你可以扮演我们自己的魔鬼代言人;展示批判性思维。展示你是一个很好的资源来激发想法。

这里有一篇概述批判性思维策略的博客文章。我强烈建议将列出的一些问题作为日常产品开发的一部分。我还想暂停一下,推荐数据科学家们读读《思考的快与慢》,这本书是关于两位获得诺贝尔奖的心理学家对人类非理性和偏见的研究。这本书真的帮助我在解释数据时更加意识到偏见。

#3 在此想象和塑造数据科学的未来

我认为团队中的每个人都在塑造公司未来的过程中扮演着关键角色。不仅仅是首席执行官或副总裁。这意味着认可公司的愿景(例如,在百思买,我们致力于 通过技术 )和来丰富人们的生活,并思考我们如何才能朝着这个目标前进。给我们自己发挥创造力的空间。

在数据科学的背景下,这可能是寻找新的工具或开发流程,甚至是能够更容易地将机器学习部署到生产中的团队结构,或者更快地实现 MVP,等等。什么可以改善我们作为数据科学家的生活,以及受益于优化体验的客户的生活?

无论你如何展望数据科学的未来,请发挥领导作用并塑造它。与未来的雇主分享你的愿景,为什么它让你兴奋/吸引你,以及我们可以实现的一种方式。不一定是对的。目标是证明你在考虑明天。因为普通和中等数据科学家太忙于对现在做出反应,用没有价值的有趣事实创建报告。

不要埋没你的成就

关于简历的最后一点。如果你避开只描述做了什么的要点,通过屏幕的几率会高得多:例如*“使用 DBT 设置 ETL 管道……”*

相反,强调你取得的成果/影响:例如*“通过使用 DBT 建立 ETL 管道,生产力提高了 30%……”*所以从星形中的 R 开始。

没有人想要一份完美的简历,但是让我们向雇主展示你不仅仅是为了工作而工作。你是一个有目标的数据科学家:你的存在是为了最大化业务价值。因此,庆祝你所带来的影响。为你庆祝。

想学数据科学?先学编码

原文:https://towardsdatascience.com/want-to-learn-data-science-learn-coding-first-6adcb6258dc?source=collection_archive---------11-----------------------

在过去几年与有抱负的数据科学家共事后,我的建议是

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

Unsplash 上的 Karsten Winegeart 拍摄

几年来,我一直在教授硕士级别的数据科学,并在训练营指导有抱负的数据科学家。与那些试图进入该领域的人一起工作很棒——我可以和他们一起学习,这有助于我发展解释我每天使用的工具的能力。看着人们成长为初出茅庐的数据科学家也很有意义。

这些年来,我看到了足够多的学生,对谁会成功有了很好的认识。我这里的“成功”指的是相当广泛的——那些能从课程中学到很多东西,并在工业界找到一份好工作的人。

这种感觉与虔诚或某种原始智力没有什么关系。这都与他们开始训练的技能有关。

让我们快速浏览一下数据科学家可能需要的一些技能:

  • 编码
  • 统计数字
  • 机器学习
  • 各种专业化(例如,大数据工具、数据可视化等。)

对于任何数据科学家来说,至少掌握其中一些技能是必不可少的。但是有一点在刚开始时尤为重要。

有抱负的数据科学家表现出色和努力奋斗的区别主要在于编码技能。

大多数好的数据科学课程都涉及学习抽象的东西,即方法背后的理论和数学,然后有机会将其付诸实践。将其付诸实践意味着编写代码,要么实现您所学的内容,要么使用已经实现它的工具。将事情付诸实践有助于巩固对概念的理解。

如果你纠结于代码,将一个概念付诸实践是不会有启发性的。相反,这将是令人沮丧的,学习将是如何让你的代码做你想要的。很难同时学习两件相互依赖的事情——如果你不理解代码,也不完全理解它在实现什么,你就不会从编码练习中获得太多。

拥有统计学的基础也很重要,因为它提供了上下文和对许多机器学习概念的理解,但在我看来,它远不如编码那么基础。虽然数学和统计有助于提供更深层次的复杂性,但大多数机器学习算法本质上是非常直观的。描述它们并不难,因为它们的工作原理显而易见。如果你能让学生理解算法背后的直觉,具体的数学可以等等——但是能够编写使用该算法的代码对于他们真正理解它是必要的。

如果你不明白你正在使用的任何工具是怎么回事,你就不会提高你对理论的理解。

我不想听起来像是在宣称其他技能不重要。但是,如果我有一个对数据科学完全无知的人想要闯入,我的建议将是先获得非常舒适的编码。通过理论和实践相结合的方法,其他的东西也可以随之而来。但是如果一个学生在代码上挣扎,那么其他的事情也会是一场挣扎。

你可能感兴趣的其他故事

[## 为什么大多数数据科学组合项目没有得到招聘经理的认可

towardsdatascience.com](/why-your-data-science-portfolio-project-sucks-208ee830ad1b) [## 让你的数据科学简历脱颖而出

towardsdatascience.com](/making-your-data-science-resume-stand-out-119d2eb37d8c)

想转行做数据科学?咬紧牙关

原文:https://towardsdatascience.com/want-to-make-a-career-change-to-data-science-bite-the-bullet-66037888baf3?source=collection_archive---------34-----------------------

将职业生涯转向数据科学具有挑战性,但肯定是可能的。

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

斯文·米克在 Unsplash 上的照片

你已经研究数据科学有一段时间了,并决定这是适合你的职业。这很好,大多数人都在决策过程中挣扎,从来没有走那么远。然而,显而易见的问题是:“我如何转行到数据科学?”你也会意识到我们每个人都有不同的背景;可能是学术上的,经济上的,或者个人的。因此,当谈到你的职业改变时,没有什么灵丹妙药。

你可以从当前的数据科学家和志同道合的人那里获得很多信息。但是请记住,转行从事数据科学绝对不同于已经发展成为数据科学家的角色。因此,在你的职业转变过程中,学习并与经历相似的人分享经验可能是你能做的最好的事情之一。为此,我决定写这篇文章来分享我迄今为止的经验。

1。管理你的期望

我知道这不是你想先读的,但你会一直得到我诚实的意见。所以给你:

“如果人们知道我是如何努力获得成功的,这看起来一点也不美妙”——米开朗基罗。

转行很简单,但可能非常困难。例如,一些顶级的研究生课程只在每年的九月和十月开始。假设你的新年决心是注册一个硕士学位。在这种情况下,你可能要等到 12 月份才能申请,并且只能在下一年开始招生。也就是等了将近两年才开始读硕士。

此外,学习本身是一个缓慢的过程。我写过关于如何利用神经科学研究的见解来提高你的编码技能的文章。尽管如此,掌握大多数技能仍需要数年时间,尤其是对那些来自完全不相关背景的人来说。这就引出了我的第二点…

2。练习,练习,练习

你必须投入工作。在接下来的几年里,纪律应该是你最好的朋友。否则,你会花更长的时间来达到你的目标,并要求你再次管理你的期望。改变你的思维模式:你不是在学习如何编码;你将成为一名程序员/数据科学家。所以,像一个人一样思考和行动。

以我的小经验,编码需要几个小时(很多小时)的练习,就像弹钢琴一样。首先,你必须熟悉语法(在我的例子中是 Python ),这在一开始是不自然的。大多数时候不会。所以,你应该每天练习。程序员会怎么做?答案很简单,开始编码就行了。

第二,尝试不同的学习方法:看视频应该是你最后的手段。所以,通过阅读、理解和尝试复制别人的代码来练习。你可以使用 KaggleGitHub 来找到写得好且简洁的代码,不管你的水平如何。还有,业余时间看数据科学方面的书。你可以完全避开技术书籍或教科书,寻找不同的类型。世界排名第一的棋手芒努斯·卡尔森,不下棋的时候,他就在读关于象棋和历史上著名棋手的书**【2】**。也就是说,这里有一些开始的想法:

https://www.goodreads.com/book/show/39813845-the-art-of-statistics https://www.goodreads.com/book/show/28186015-weapons-of-math-destruction?ac=1&from_search=true&qid=yedjexfopY&rank=1

3。该系统不是为职业变化而设计的

如果你也过了 30 岁,那么你将面临一些艰难的挑战。对于已经有工作的人来说,很少有资金或奖学金。显然,企业、机构和政府会优先资助更年轻的候选人(至少在英国是这样)。因此,开始攒钱支付学费、课程和书籍。

如果你想转行去脸书、亚马逊、网飞或谷歌(简称方)等公司工作,有很多先决条件。其中一些先决条件甚至可能包括博士学位。因此,你将不得不再次管理你的期望,存更多的钱。当转到一个不同的领域时,公司不会在意你过去的经历。跨国公司有严格的招聘流程,不会因为你比一般应聘者年龄大而破例。所以,提前计划,确保你尽可能多地了解实现目标需要什么。

关于“系统”的最后一点招聘经理通常不喜欢雇佣比他们年长的人。即使你的简历上可能没有你的出生日期,也很容易猜出你的年龄,只是不会邀请你参加面试。所以,一定要建立良好的关系网,结交新的朋友,并与和你志同道合的人取得联系。每个人都有大量的工作机会。

4。走人迹罕至的路

你必须做些不同的事情。为什么?让我们假设:

  • 您比数据科学学生/候选人的平均年龄要大。
  • 你没有足够的积蓄在短期内资助自己读完硕士学位。
  • 你没有很强的定量背景(例如工程或物理),因为你来自一个完全不同的背景。
  • 你全职工作,甚至可能有自己的家庭。
  • 你真的想去美国或英国学习。

如果你决定走和别人一样的路,那你就陷入了困境。如果你选择等待一个完美的时刻,当我上面列出的所有事情——不知何故——都被整理好的时候,那么你将永远不会成功。你必须忍受并尝试完全不同的东西:

  • 试着自愿加入研究小组,这样你就可以处理一些数据了。
  • Y Combinator**【4】**学习如何像企业家一样思考。
  • 找到你可以通过自动化解决的问题。思考与你当前行业或职业相关的问题。
  • 邀请一些同事创业(如果失败了,再尝试,再尝试)。
  • 写一篇关于数据科学或者人工智能的博客
  • 尝试搬到不同的城市。蒙特利尔和巴黎正在成为人工智能的全球中心。

最后,你可能听说过,不是每个人都同意进行训练营,因为这可能是浪费金钱。我恭敬地表示不同意,认为“视情况而定。”为什么如果你意识到走预先设定好的路(硕士学位、攻读 GRE/GMAT、竞争性博士课程、实习、第一份工作等等),并不适合你。然后,一个为期九周的训练营,挤满了志同道合的人,带着合作的态度和企业家精神,听起来是个好主意。也许,因为你的生活与大多数数据科学学生不同,少走的路可能是最好的一条。

结论

如果你想从数据科学转行,那么你必须“咬紧牙关”。首先承认这可能比你想象的简单,但比你希望的要难。达到精通需要很长时间,但挫折的解药在于管理你的期望。你必须遵守纪律,使用不同的学习方式。尽管如此,数据科学的标准学术和专业道路并不适合那些正在改变职业的人。很难接受,相信我,我知道。但是,通过让自己走出去,用不同的方式做事,和志同道合的人交往(也许在训练营),会给你带来进步。这很有挑战性,但肯定是可能的。

感谢阅读。这里有一些你会喜欢的文章:

参考文献:

【1】https://www . goodreads . com/quotes/115896-if-people-know-how-how-hard-I-had-to

【2】https://en . Wikipedia . org/wiki/Magnus _(2016 _ film)

【3】https://towards data science . com/trends-in-data-science-that-will-change-business-strategies-1 fa 3 F5 ee 96 b 7

【4】https://www.ycombinator.com/

想在数据科学领域赚更多的钱?不要成为管理者,要成为领导者

原文:https://towardsdatascience.com/want-to-make-more-money-in-data-science-dont-become-a-manager-become-a-leader-85f60187b80e?source=collection_archive---------14-----------------------

行业笔记

领导数据科学团队的 4 项基本技能

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

图片来自 PublicDomainPictures 来自 Pixabay

对许多人来说,在数据科学领域赚更多的钱意味着进入管理层。

事实上,一项研究显示经理“价值 1.75 名员工”

这一统计表明,经理的收入几乎是非管理人员的两倍。尽管工资差异因行业和职位类型而异,但有一点是明确的:经理通常会得到更多的报酬。

但获得晋升不一定与管理有关。更关键的是,钱不在管理上。钱在领导身上。

管理是一种领导角色吗?绝对的。你应该学习如何成为一名优秀的经理来获得晋升吗?不一定。

在本文中,我想介绍我从开发人员到经理再到数据科学团队主管这些年来学到的一些顶级技能。

TLDR;学会成为数据科学领导者,而不是数据科学管理者。

有没有见过这样一个迷因,它展示了一个象形文字般的角色坐在一个“任务”盒子上,被其他象形文字般的角色拉着,看起来绑在一起?在图像中,有一个箭头指向标签为“boss”的盒子顶部的字符

该图像的正下方是一个类似的图像,但是没有人坐在盒子上面。相反,有一个箭头指向前面的字符,标签为“leader ”,因为该字符指向前方。

我喜欢这个形象,因为它说明了领导的价值高于管理。换句话说,领导者不仅要管理,还要努力指明方向。由于其复杂性,这种品质对于数据科学领导者来说更加重要。

但是形象并没有告诉我们如何成为领导者。它没有告诉我们需要什么技能。它没有为我们提供图像传达给我们的成千上万个词中最关键的 4 个词。所以我会努力的。

数据科学家的 4 项领导技能

1.思考概念,而不是工具和技术

为了有效地领导数据科学团队,理解您作为开发人员所处理的工具和技术与高阶概念的关系是至关重要的。例如,像 Google BigQuery 这样的数据库只是存储某些类型信息的简单方式。概念是存储,技术是 BigQuery,工具是 SQL。

领导团队需要我们调整我们的思维来设定概念方向,并理解可以支持概念方向的工具和技术正在讨论中。这有点像学者如何使用理论来发展假设,以帮助测试他们的理论。

在商业中,理论是如何为商业问题带来更多商业价值的概念模型。领导者帮助建立这些概念模型,而开发人员致力于各种假设,将这些模型变为现实。假设的测试要求我们使用可用的特定工具和技术,因此优秀的开发人员擅长应用这些工具/技术并将它们联系在一起,而领导者则确保他们符合最终带来价值的概念方向。

我把它看作一种漏斗,概念模型在顶部,假设在中间,所有这些最终导致生产。

漏斗底部是操作人员。那些知道一套独立的工具和技术,可以帮助把工作的假设变成商业规模的实际产品的人。

数据科学领导者了解这些部分,同时不断确保它们的开发方式与她/他/他们设定的概念方向一致。

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

作者图片

2.沟通

当领导者看到他们的概念模型变得栩栩如生并带来商业价值时,他们会感到兴奋;当数据科学家修复错误、实现新的模型代码并训练精确的模型时,他们会感到兴奋。重点是?兴奋很重要,情绪很重要,即使在数据科学中也是如此。

但是没有解释的结果没有什么商业价值。领导者不仅帮助创造商业价值,而且他们还通过团队的激励传达这种价值。换句话说,领导者帮助翻译数据科学成果,帮助非数据科学家理解他们的产品带来的商业价值。

不幸的是,对于数据科学来说,能够有效地传达让数据科学开发人员兴奋的商业价值是令人沮丧的困难。这种困难的部分原因是,大量的开发工作都是在实验中度过的(参见上面漏斗中的假设阶段)。此外,解释我们能够创建数据的图形表示以提取图形属性作为特征来提高模型准确性是多么酷,就像对业务利益相关者说克林贡语一样。

因此,与其他团队相比,有效沟通对于数据科学领导的重要性对于数据科学团队的成功更为重要。这意味着数据科学的领导者甚至不想解释他们的开发人员对什么感兴趣。相反,领导人会等待集体兴奋降温。他们反思围绕概念模型的执行而建立的情感,然后他们交付该价值的有效商业翻译。

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

作者图片

3.连接到 KPI

商业利益相关者看重的到底是什么?他们重视关键绩效指标或 KPI。

你问什么是 KPI?KPI 到底是什么取决于具体的业务。也就是说,每个企业都有一些用美元定义的 KPI。但是知道 KPI 是什么只是成功的一半。

有效传达数据科学的价值意味着知道如何将数据科学成果与企业重视的 KPI 联系起来。理想情况下,在设定概念方向时,这些都被确定或至少被广泛定义(见第 1 点)。

因为数据科学很少产生最终用户直接交互的解决方案,所以领导者还必须了解在数据科学团队之外需要采取哪些步骤来与业务部门进行适当的沟通,还必须有谁参与将数据科学输出与将确定业务价值的特定 KPI 联系起来。

4.支持计划

随着概念模型的确定、沟通技巧的增强以及可转化为 KPI,领导者还必须知道需要什么资源来支持他们的产品。在早期,从数据科学实验中获得的见解可能足以证明其对企业的价值,因为企业仍在试图理解他们最初是如何获得这种见解的。随着领域的发展、团队的壮大和薪水的上涨,数据科学领导者在实施团队工作方面面临越来越大的压力。

因此,数据科学的成果必须嵌入业务直接受益的业务产品中。这些嵌入可以是改善用户体验的应用程序,也可以是帮助员工提高效率的工作流。不管应用程序如何,这些数据科学成果现在都在与生产环境交互。

这意味着数据科学产品必须遵守为生产环境设置的业务策略、服务级别协议和安全协议。因此,对于数据科学领导者来说,了解 DevOps 以及在真实生产环境中支持其产品所需的资源变得越来越重要。这一新要求的重要性可以从企业对 MLOps 专家不断增长的需求中看出。MLOps 专家了解如何将数据科学家的工作与生产软件系统的需求联系起来。数据科学领导者必须知道如何根据运营团队的要求管理他们的开发团队,并为开发人员提供充分的计划,以支持他们已经投入生产的产品。

说到底,当经理远不如当领导有价值。在这里,我提供了一些关于我在数据科学领导生涯中已经学到(并且还在学习)的关键技能的想法。一如既往,我期待您的想法、反馈和想法。

比如参与学习更多关于数据科学、职业发展或糟糕的商业决策的知识?加入我

对于性能更好的模型,不要未经检查就假设数据是独立的

原文:https://towardsdatascience.com/want-to-ruin-your-model-assume-data-is-i-i-d-78c61a0b2076?source=collection_archive---------40-----------------------

关注数据中的自相关可以帮助您构建更好的预测模型

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

Ehimetalor Akhere UnuabonaUnsplash 拍摄的照片

首先,一个小测验。

在下面的两个例子中,报告的准确性可信吗?

  1. Shivram 想到了一个绝妙的主意,仅仅通过 iPhone 的移动来预测心率。他从数千名同意的用户那里收集 iPhone 动作的时间同步数据和 Apple watch 的心率数据。然后,他将数据随机一秒一秒地分成训练集、验证集和测试集。在他对自己的模型感到满意之后,他报告说,他能够从 iPhone 的运动中预测心率,在测试集上的准确率高达 98%!
  2. Abhilash 希望利用卫星图像来寻找森林的位置。他获得了一些卫星图像和人类绘制的森林地理位置图的训练数据。然后,他将像素随机分成训练集、验证集和测试集。在他对他的模型满意之后,他报告他的测试准确率为 99%!

在上述两种情况下,报告的准确性可信吗?

不要!

在这篇文章中,我们将了解为什么他们不是。我们还将学习一些基本的预处理原则,人们可以遵循这些原则来避免将来出现这样的陷阱。

为什么要关心数据是否是 id?

独立同分布数据(i.i.d .)在预测设置中有许多好的特性在预测设置中,知道一个数据点并不能告诉你关于另一个数据点的任何事情。当我们为模型训练拆分数据时,必须知道数据是否是独立的。

将数据分为训练集、验证集和测试集是在监督学习设置中测试模型性能的最标准方法之一。即使在我们进入建模之前(这在机器学习中几乎受到了所有的关注),不关心上游过程,如数据来自哪里,它们是否真的相同,以及我们如何分割它们,都会对预测的质量产生影响。

当数据具有高自相关性时,这尤其重要。点之间的自相关仅仅意味着一个点上的值与其周围的值相似。以温度为例。预计任何时刻的温度都与前一分钟的温度相似。因此,如果我们希望预测温度,我们需要特别注意分割数据。具体来说,我们需要确保在训练、验证和测试集之间没有可能夸大模型性能的数据泄漏。

模型性能会因信息泄露而被夸大到什么程度?

看完以上,很自然的会问,这是一个足够重要的问题,值得我去关心吗?通过一个高度自相关数据的例子,我们会看到答案当然是肯定的!我们将把这个例子分成两部分。首先,我们将数据随机分为训练集和验证集,并在验证集上实现非常高的准确性。然后,我们将使用分层随机抽样来分割数据,从而减少信息泄漏。然后,我们将看到同样的模型如何具有几乎为零的精度。

交互式示例

如果您希望以交互方式了解这个示例,您可以使用这个 colab 笔记本

我们先导入相关的包。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import sklearn.model_selection
import sklearn.linear_model
import sklearn.ensemble

我们来做一些响应变量自相关性高的合成数据。

# number of examples in our data
n = int(100*2*np.pi)
# Seed for reproducebility
np.random.seed(4)
# make one feature (predictor)
x = np.arange(n)
# make one response (variable to predict) which has high autocorrelation. Use a
# sine wave.
y =  np.sin(x/n*7.1*np.pi)+np.random.normal(scale = 0.1, size = n)
# merge them into a dataframe to allow easy manipulation later
df = pd.DataFrame({"x":np.array(x), "y":np.array(y), "y_pred":np.nan})
# visualize the response versus feature
sns.set(style = "ticks", font_scale = 1.5)
sns.regplot(x="x",y="y",data=df)

数据的随机分割

让我们将数据随机分为训练集和验证集,看看模型的表现如何。

# Use a helper to split data randomly into 5 folds. i.e., 4/5ths of the data is chosen *randomly* and put into the train set, while the rest is put into# is chosen *randomly* and put into the train set, while the rest is put into# the validation set.kf = sklearn.model_selection.KFold(n_splits=5, shuffle=True, random_state=42)# Use a random forest model with default parameters.# The hyperaparameter of the model are not important for this example because we# will use the same model twice- once with data split randomly and (later) with# data split with stratificationreg = sklearn.ensemble.RandomForestRegressor()# use k-1 folds to train. Predict on the kth fold and store in the dataframefor fold, (train_index, test_index) in enumerate(kf.split(df)):reg.fit(df.loc[train_index, "x"].values.reshape(-1, 1), df.loc[train_index, "y"])df.loc[test_index, "y_pred"] = reg.predict(df.loc[test_index, "x"].values.reshape(-1, 1))# visualize true y versus predicted yfig, ax = plt.subplots(figsize = (5,5))sns.kdeplot(data=df, x="y_pred", y="y",fill=True, thresh=0.3, levels=100, cmap="mako_r",ax=ax)ax.set_xlim(-2,2)ax.set_ylim(-2,2)ax.set_xlabel(r"y$_{\rm predicted}$")ax.set_title("Exaggerated predictive ability\nassuming data is i.i.d.")r2 = sklearn.metrics.r2_score(df.y, df.y_pred)ax.annotate(f"R$^2$ = {r2:0.2f}", xy =(0.95,0.95), ha = "right", va = "top", xycoords = "axes fraction")print(f"[INFO] Coefficient of determination of the model is {r2:0.2f}.")

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

假设数据是独立的,夸大了预测能力(但实际上不是)。

哇哦。!我们实现了 97%的 R2!似乎我们的模型在模拟正弦响应函数方面做得非常出色。

但是……模型真的能够理解 x 和 y 之间的响应函数吗?或者它只是作为一个最近邻插值?换句话说,模型只是通过记忆训练数据,输出最接近训练样本的 y 值来作弊吗?让我们通过使模型难以作弊来找出答案。

数据的分层分割

现在,我们将沿着 x(特征)轴将数据分成 5 个块,而不是随机分割数据。然后,我们将把 4 个数据块放入训练数据,1 个数据块放入验证集。

通过沿着自相关特征对数据进行分层,我们尊重了数据的非独立身份性质。

让我们看看模型是否有同样的精度。

# How many chunks to split data in? 
nbins = 5
df["fold"] = pd.cut(df.x, bins = nbins, labels = range(nbins))# Split the data into training and validation data based on the chunks.
# Train on 4 chunks, predict on the remaining chunk.
for fold in sorted(df.fold.unique()):
  train_index = df.loc[df.fold!=fold].index
  test_index = df.loc[df.fold==fold].index
  reg.fit(df.loc[train_index, "x"].values.reshape(-1, 1), df.loc[train_index, "y"])
  df.loc[test_index, "y_pred"] = reg.predict(df.loc[test_index, "x"].values.reshape(-1, 1))
# Visualize true y versus precited y.
fig, ax = plt.subplots(figsize = (5,5))
sns.kdeplot(
    data=df, x="y_pred", y="y",
    fill=True, thresh=0.3, levels=100, cmap="mako_r",ax=ax
)
ax.set_xlim(-2,2)
ax.set_ylim(-2,2)
ax.set_xlabel(r"y$_{\rm predicted}$")
ax.set_title("True predictive ability")
r2 = sklearn.metrics.r2_score(df.y, df.y_pred)
ax.annotate(f"R$^2$ = {r2:0.2f}", xy =(0.95,0.95), ha = "right", va = "top", xycoords = "axes fraction")
print(f"[INFO] Coefficient of determination of the model is {r2:0.2f}.")

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

同一模型的真实预测能力

现在,我们看到我们的模型具有低于随机的性能(旁注:不知道决定系数怎么会是负的?在这里阅读更多)!这表明,我们的初始模型并没有真正使用 x 作为 y 的信息预测器,而只是从训练集中找到最接近的 x,并吐出相应的 y。因此,如果我们不小心数据中的自相关,我们可能会夸大模型性能。

更糟糕的是,我们可能错误地推断出 x 的重要性,并进而得出几个科学结论。然而,我们的模型仅使用 x 来插入/记忆响应。不幸的是,这不是一个虚构的例子。这篇论文表明,地球科学中试图预测植被生物量的几篇论文(类似于本文开头 Abhilash 的例子)都被这个问题弄得千疮百孔。

结论

拆分数据可能会产生巨大的后果。如果有任何证据表明数据是自相关的,或者更一般地说是非同分布的,则分层分裂或使用信号分解来解相关数据的其他技术可能是有用的。至少,在开始建模之前将数据可视化是非常有益的。因此,下次你遇到 Shivram、Abhilash 或其他任何声称在随机拆分他们的数据后实现了非常高的建模性能的人时,你已经准备好帮助他们提出更好的预测模型,而不会夸大模型性能。

想成为一名杰出的数据科学家吗?开始练习这些非技术性技能

原文:https://towardsdatascience.com/want-to-stand-out-as-a-data-scientist-start-practicing-these-non-technical-skills-9e38ed86703e?source=collection_archive---------0-----------------------

仅仅擅长编码是不够的

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

Unsplash猎人赛跑的照片

成为数据科学家的很大一部分是量化的。一个人需要擅长数字,相当精通编码,并且能够分析图表和模式。这就是为什么大多数数据科学家通常来自数学和统计、工程和计算机科学等技术背景。

尽管如此,在作为一名数据科学家工作了几个月后,我意识到不仅仅是擅长数字,真正让一个人脱颖而出的是非技术技能。

当然,拥有强大的技术基础是至关重要的,但拥有更软的技能不仅会让你成为一个更全面的人,更重要的是提供额外的优势,帮助你最终获得下一份数据科学工作或获得晋升。

虽然发展这些技能可能不像报名参加在线编程课程那么简单,但你仍然可以采取一些可行的步骤和思维模式来提高这一特定领域的水平。

在这篇博文中,我想强调你应该注意的 5 个非技术性技能,并概述你可以采取的发展这些技能的实际步骤。

1.注意细节

有趣的是,关注细节是我曾经放在简历上的短语之一,只是因为它听起来很酷,但实际上,我并不完全知道它的意思——直到今天。

嗯,对细节的关注可以采取各种不同的形式,但其核心是,确保你正在进行的一项分析或交付物是专业的、准确的,并以正确的方式传达信息。

具体来说,在数据科学中,这可能是检查数据错误和执行健全性检查的尽职调查。例如,检查缺失的字段、不合理的数据(如年龄为 500 岁的客户)以及确保详尽类别的百分比总和为 100%。

除了数据检查之外,在创建幻灯片或设计仪表板时,关注对齐、颜色一致性、拼写错误、可视化选择、用户体验等也很重要。

虽然对你来说这可能听起来很无聊,但对细节的高度关注不仅通过你交付的工作质量建立了你作为分析师的信誉,更重要的是,它防止了与客户陷入尴尬的境地。你最不希望的就是客户在你之前发现一个巨大的错误。

至此,我将以最近收到的一条关于关注细节的重要性的建议来结束这一部分。

幻灯片的 80%可以在 20%的时间内完成,但剩下的 20%将占用 80%的时间。

这当然就是臭名昭著的帕累托原理,你可以在这里阅读更多关于的内容。

2.沟通

几个月前,我在博客中写了一篇关于沟通技巧的文章。在这里,我想进一步阐述这个观点,并重申那篇文章中提到的一些观点。

拥有良好的沟通技巧不仅仅是数据科学的专利,坦率地说,任何其他专业工作环境都是如此。工作场所的交流可以分为两种:口头交流和书面交流。

无需深入研究太多细节,两者之间的主要区别在于传输速度和记录证明。

口头交流传播速度很快,但没有记录证明。因此,它更常用于内部会议或客户会议,在这些会议中,你只是简单地向团队提供最新情况,或者需要对某个特定想法的即时反馈。

另一方面,书面交流的传输速度很慢,但可以提供记录证明。这可以是电子邮件、松散消息,甚至是代码中的注释。

在协作环境中工作时,拥有良好的沟通技巧会大有帮助。它不仅能提高或降低团队的效率,还能帮助说服其他人在项目过程中追求一个想法。

就我个人而言,在我职业生涯的早期,我一直在努力解决这个问题,因为我太习惯于从事自己的数据科学项目,而不必与其他人合作。但是就我现在所知道的,我会强烈鼓励任何认真从事数据科学家工作的人尽早开始练习这些技能。

这实际上看起来像什么?嗯,这可能是在编码时养成写评论的习惯,在执行探索性分析以总结您的发现后写一份总结报告或模拟电子邮件,开始一个简化复杂数据科学主题的博客,参加公共演讲课程等等。

正是这些小细节,随着时间的推移,会让你成为一个更有效的沟通者和数据科学家。

3.对客户感同身受

我在大学期间做学生顾问时学到的一件重要事情就是从客户的角度思考问题。

虽然你们中的一些人可能不渴望在未来从事咨询工作,但我个人认为这种心态适用于无论你是咨询领域的数据科学家还是纯产品分析人员。

能够站在客户的立场上,让您深入思考他们正在经历的痛点,以及如何利用数据来解决他们的问题。反过来,这可以用来制定解决某个问题的方法,也可以推动你的分析,并以增加最大价值的方式呈现它们。

例如,现在与政府客户的合作挑战着我,让我了解更多以前从未有过的政策决策,以及政府关心的问题,如医疗保健、教育、经济增长等。

因此,在获取数据和进行分析时,我在跟踪和传达会给我的客户带来最大影响的关键指标时变得更加谨慎。

总之,在做任何工作之前,想想客户会从中得到什么,然后专注于此,避免做无脑的、低影响的任务。

4.优先顺序和授权

就像你在大学期间在多项任务和考试之间周旋一样,作为一名数据科学家,你经常需要将时间分成不同的项目,当然还有项目中不同的任务。

那么,如何做到这一点呢?答案是优先化和授权。

优先化是对给定的一组任务分配相对重要性或紧迫性的过程。它意识到任务何时到期,以及完成它们各自的时间要求。

实际上,这可以包括拥有一份最新的日历,在开始一天的工作之前写下一份每日目标清单,甚至可以和你的经理谈谈,听听他或她对你应该把时间集中在什么事情上的看法。

另一方面,知道何时说不也很重要。作为一名研究生数据科学家,我认为为了向公司的其他人证明自己的价值,很容易陷入承担过多的陷阱。然而,这样做可能会导致巨大的压力,而且如果您最终没有实现最初的承诺,还会危及团队的整体进展。

因此,在承担一项任务之前,根据你目前的能力和优先顺序来评估你能承担什么。

接下来,我们有代表团。虽然作为一名刚从大学毕业的分析师,这可能不是最需要担心的事情,但仍然值得讨论一下。

随着你职业生涯的进展和你在公司的晋升,你的时间会慢慢地转移到人员和项目管理上,而不是实际上做技术工作本身。

对于负责特定项目的健康和进展的经验丰富的数据科学家或项目经理来说,委派更为重要。这是成为一名优秀领导者的关键之一。

委托可能是一个复杂的话题,我个人对此没有太多的经验,所以我在这里将轻描淡写。但本质上,有效的授权包括了解你的团队的优势和劣势,提供健康水平的支持和反馈,以及建立一个清晰的预期结果。

正确的委托可以产生令人难以置信的结果,并使项目团队像一台润滑良好的机器一样运转。

5.思想开放,不断追求知识

随着数据科学的不断变化,新的工具和技术像爆米花一样不断涌现。软件、编程语言、建模技术都在不断发展,以服务于不同的目的——要跟上这种发展是相当具有挑战性的。

然而,要成为一名优秀的数据科学家,就要有一颗好奇的心和积极的学习热情。为了在这个领域保持相关性,与最新的行业趋势保持联系以及不断扩展你的技能组合是很重要的。

幸运的是,互联网上并不缺乏资源。YouTube,DataCamp,Coursera 之类的 MOOCs,你能想到的都有。这完全取决于你是否愿意投入时间和精力去做这件事。

我喜欢把思想开放看作是拥抱一个学生的心态,不管你在职业生涯的哪个阶段,他总是在追求知识。这不仅会让你在工作场所不可替代,从而确保职业生涯的长久,更重要的是,它提升了你的价值和能力。

我个人的趣闻是,当我被指派构建一个 PowerBI 仪表板时,当时我对此毫无经验,也毫无兴趣。然而,尽管如此,我还是意识到了我可以给项目团队带来的价值,以及通过提高特定领域的技能带来的长期职业利益。

因此,除了周末跟随教程视频学习我需要知道的东西之外,我还主动向更有经验的同事寻求指导。

现在回想起来,这是一次收获颇丰的旅程,学习一些全新的东西,这一切之所以成为可能,是因为我一开始就有开放的心态和学习的欲望。

最后,现实是,我们并不总是什么都知道,这没关系,但相反,最终重要的是要有努力改进的心态。

外卖食品

  1. 注意细节
  2. 沟通
  3. 对客户感同身受
  4. 优先顺序和授权
  5. 思想开放,不断追求知识

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

https://medium.com/geekculture/70-data-science-interview-questions-you-need-to-know-before-your-next-technical-interview-ccfbd37a37b3 </10-most-important-sql-commands-every-data-analyst-needs-to-know-f0f568914b98>

如果你还不是一个媒体会员,如果你使用下面的链接注册会员,这对我和这个平台上的其他作者来说意义重大。它鼓励我们继续推出高质量和信息丰富的内容——谢谢!

https://chongjason.medium.com/membership

数据仓库中的预警系统

原文:https://towardsdatascience.com/warning-systems-on-data-warehouse-37d57a8fee57?source=collection_archive---------49-----------------------

关于我如何以及为什么建造了 beoneer 的故事,这是一个允许我们在环境中的任何桌子上设置警告的系统。

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

在过去的几年里,我和 Shopify 的其他一些人一直在寻找一种在特定的桌子上设置警告的聪明方法。为什么是警告?原因很简单,正如我在这个以前的博客中解释的那样,我们花了很多时间来构建高质量的前厅数据集。也就是说,由于许多原因,这些数据集可能会随着时间的推移而开始退化。让我向你介绍一下这个问题,我们以前尝试过什么,以及我们是如何解决的。

问题是

是的,在 Shopify,我们非常关心数据集的质量,我们对所有数据集进行同行评审,尽可能地记录它们。当我们发布数据集时,它们是完美的。也就是说,我们工作在一个不断变化的环境中。然后,在某个时候,数据集质量会下降。这里有几个例子:

  • 有些数据不再可用:单看起来很容易,但当它是更大数据集的一部分,隐藏在 6 个连接之下时,识别和修复就不是那么简单了。
  • 原始数据的变化:你建立数据集时的假设可能会改变。有可能数据点开始返回一个新类型的值,或者在预先设定的范围之外(例如从 0 到 1),可能以前不能为 null 的东西,现在可以为 null。
  • 业务规则的变化:我们的一些数据集确实建模或复制了业务逻辑、商业合同、SLA 等。当这些契约发生变化时,我们需要修改数据集以包含新的现实。

当这三件事发生时,有两个主要步骤。首先,我们需要意识到并确定变化,其次,我们必须修复或废弃数据集。由于第一个值得关注,并且 Shopify 是很好的工具,所以我不想谈论太多。在这里我真的想重点讲第二个,因为虽然听起来很简单,但这是现实生活中的另一个故事。

每次我们遇到这种情况,我们都不得不问自己,“好吧,我们需要修理 XYZ,但是我们没有时间了。选项 A)我们删除数据集,选项 B)我们修复它”。在一个快速的头脑风暴会议后,我们不能用 A,因为它为其他资产提供动力,我们也不能用 B,因为我们没有时间去做。因此,我们最终会让数据集保持原样,即使我们知道它已经损坏。我们不能优先考虑其他工作,错误的影响不是很大(目前)。

结论:让我们警告数据集的用户,让他们意识到错误,然后我们将问题添加到 backlog 中

真正的问题是

真正的问题是,有一天,有人会查询你的数据集。这个人不会意识到这个问题,并且会得出错误的结论。当他们联系你,因为他们和他们一半的老板都被这个结果吓坏了,你告诉他们最糟糕的答案,哦,是的,对不起,我们知道这是一个错误。

我们到目前为止所做的努力

正如我们所说,我们多次面临这些问题,以下是我们已经尝试过的一些方法:

  • 传播 bug :在 Slack 上发一封令人讨厌的@here或者广泛传播的电子邮件,让每个人都知道你的数据集有 bug。如果有人要使用它,那就太好了。因为除此之外,从现在起的 6 个星期内,很少有机会有人会记得你,而且你刚刚用你的广播惹恼了很多人。
  • 文档:像大多数其他地方一样,我们有自己的文档库。你可以去那里并在这个特定的数据集上添加注释,但是除非有人去读它,否则没有人会看到。此外,所有经常使用您的数据集的现有仪表板或数据科学家不会在每次运行查询/报告时都去读取文档。
  • 找出谁在使用它:这是了解这个 bug 有多糟糕的关键。它将帮助您了解您需要给予修复多少优先级,但是首先,在此期间,它不能修复任何东西,其次,即使没有很多依赖项,也不意味着将来会有人使用它。

解决办法

所以我在寻找一种方法来解决这个问题,尤其是在像上面解释的那样糟糕的情况下,有些人真的对完全有效的查询结果感到压力。我们需要一种方式来警告用户这个数据集有特定的问题。

经过一番挖掘,我意识到一些聪明的数据工程师已经将Prestoevent listener设置为针对特定的 kafka 主题发送。换句话说,我们的 Presto 集群上的每个查询都生成一个 Kafka 事件。

注意:Presto 是在 Shopify 查询数据集的默认引擎。

“我意识到我可以构建一个软件来监控这个 Kafka 主题,执行一些正则表达式来识别查询是否是关于表的错误,我可以向用户发送一条 Slack 消息。”

为什么 Slack,Slack 是 Shopify 的主要沟通工具,人们通过这种方式监控他们的电子邮箱。所以一条松弛的消息是警告他们的最好方式。我有个计划

履行

在 Shopify,我们有一个叫 Hackday 的东西。连续三天,我们停止“正常”的工作,开始特殊的项目。每个人都选择了自己的项目。我决定试一试。我从事专业软件开发已经有几年了,但我确信我能做点什么。

我的申请基本上就是这四个步骤:

  1. 听听卡夫卡的话题
  2. 做一些聪明的正则表达式,以确定它是否是我的表
  3. 找到 Slack 句柄并向用户发送 Slack 消息。
  4. 让所有这些在某个地方运行。

所以我被这个快速卡夫卡式的话题解决了,我可以简单地听它。2 可以通过一个基本的网页来解决,数据科学家可以在特定的表格上添加警告并使用正则表达式。对于#3 和#4,我对 Shopify 的开发文化和环境印象深刻。已经有一个网络服务可以将用户的电子邮件(我从 Kafka 的消息中得到的)转换成一个松散的句柄。我也可以通过他们的 API 轻松连接到 Slack。对于最近的部分,它比我能想到的还要简单。基本上,如果我能在 Ruby on Rails 中找到这样做的方法,我只需点击一下鼠标就能部署我的应用程序。

结果

直到今天,我仍然对这个结果印象深刻。如果您在查询完成后的 3 秒内查询任何带有警告的数据集,您会收到如下所示的 Slack 消息。

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

数据科学家现在可以轻松地在任何表上添加警告消息:

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

特征

我一直在开发这个工具的特性。我补充道:

  • 小睡选项:这样用户就不会在每次查询表时疲惫不堪。
  • 特定列过滤:如果除了一列之外,您的所有数据集都正常,那么您只能警告使用该列的用户。
  • 表名中的正则表达式,可能有多个表受到影响。您可以设置一个正则表达式样式的表名。

统计数据

大约 3 个月后,举报人

  • 向 148 个不同的用户发送了 1300 多个警告。
  • 每天扫描大约 43 000 个 Presto 查询。
  • 在小时后发送了 300 个警告。

我对此非常高兴,尤其是下班后的 300 个警告。这意味着 300 次,有人收到一个警告,指示他很可能因为其他团队成员不在那里提供帮助而无法获得支持。

这个工具太棒了,我现在晚上可以睡得更好了,因为我知道如果有人查询这些表,他们会得到警告,并且不会对结果做出任何错误的决定。

旁注:当你给内部项目告密者打电话时,有多少人联系你,这真的令人印象深刻

原载于 2021 年 1 月 29 日https://coffeeanddata . ca

《权力的游戏》第八季真的有那么糟糕吗?

原文:https://towardsdatascience.com/was-game-of-thrones-season-8-really-that-bad-4c4acdfd45e6?source=collection_archive---------23-----------------------

探索性数据分析故事。

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

照片由 KyloUnsplash 上拍摄

我最近开始重新观看《权力的游戏》,从第一季开始。因为我从一开始就是这个系列的忠实粉丝,所以我认为第八季很大程度上是令人失望的。更具体地说,剧情线要么被抛弃,要么被仓促处理,故事里发生的事情我几乎都不认同。当时其他人似乎也有同样的想法。

所以,我想:我们能从数据科学的角度来看第八季吗?也就是说,除了观众自己对这一季的看法之外,我们能客观地证明写作确实糟糕吗?让我想想。首先,这里是我们将使用的工具:

工具:

以下是一些指导我们分析的基本问题:

问题:

  • 《GoT》第八季的剧本是不是独字比例比较小?独特词用来衡量文本的复杂程度:它们的比例越高,文本就越复杂。
  • GoT 第八季有没有不那么复杂的词?复杂 单词在我们的定义中会是长度超过 7 个字符的单词。
  • 《GoT》第八季有没有更多「容易」的词?在此上下文中,易字少于 5 个字符。
  • GoT 第八季有没有不那么复杂的句子?让我们把复合句定义为至少 15 个单词的句子。
  • GoT 第八季剧本的等级水平是多少?这个被称为弗莱施-金凯等级的标准指的是特定年级的学生是否能够阅读一篇文章,它的范围从 1 到 12。
  • 可读性评分呢?对于这个故事,我们将使用 Flesch 阅读难易程度评分,它指的是理解一篇英语文章的难度。

唯一单词得分

那么,我们开始吧。我决定比较两季第一季和第八季每集的独特词百分比。这是因为第一季的收视率相对较高,两者之间的任何差异都会让我们倾向于认为第八季的写作实际上更差。在分析了每集的文本后,我清理并标记了数据,以生成每一集的独特单词的比例。下面您可以看到一个 Datawrapper 可视化,横轴显示季节编号和相应的剧集。

令人惊讶的是,至少对我来说,第八季第四集在这一类别中得分非常高。书名是《最后的史塔克》,故事发生在对抗活死人军团的战役之后。其独特的字数比例的一个原因可能是该集讨论了多条情节主线。

另一方面,最低的是第八季的第二集,名为“七国骑士”,发生在与死者战斗之前。独特词汇得分低的一个原因可能是场景完全设置在一个地方,人物只为一个事件做准备,导致他们使用大致相似的词汇。然而,稍微出乎意料的是,跨两个赛季的独特性得分似乎没有巨大差异。尽管事实上许多人觉得这个系列的质量下降了,但这似乎并没有反映在这个指标上。

复杂的单词

继续研究复杂单词的百分比,我遵循了与上面相同的步骤,只是增加了一个“如果条件”来扫描更长的单词。下面是结果。我注意到的一件事是,在第八季第三集里,复合词的比例明显较低。这一集的标题是“漫漫长夜”,它跟随生者的军队与死者作战。因此,没有那么多复杂的词是有道理的,因为这一集主要是打斗场面。第一季和第八季的其他剧集中,复杂词的比例大致相当,徘徊在 3.02 到 4.41 之间。

“简单”的词

现在,让我们看看简单的(少于 5 个字符)单词。同样,对于复杂的单词,我只需要添加一个“如果条件”来扫描它们,结果如下。如你所见,每一集都有相似的单词,没有一集有明显多或少的简单单词。

复合句

复合句的百分比呢?好吧,看看下面。首先,不出所料,第八季第三集在这一项上得分很低。然后倒数第二,还有同季第五集,标题是《钟声》。这也是一个战斗集中的插曲,这有助于我们理解为什么它在这个指标上排名很低。第一季第一集和第二集的复合句得分也很低,这有点令人惊讶(至少对我来说,我认为第一季比第八季好得多)。还有趣的是,这一类别中得分最高的一集,第一季第八集是由乔治·r·r·马丁自己写的,这可能有助于复杂的句子。至于两个赛季的总体差异,我不认为这个指标有任何差异。你怎么想呢?

易读性指数

哪些剧集的文本更容易或更难阅读?第一季的第二集得分高于 90,相当于“非常容易”,而根据 Flesch 标准,介于 80-89 之间的剧集“容易”阅读。正如你所看到的,只有两集比较难读:S1.7。这是“相当容易”和 S1.8。这是“标准”。再一次,乔治·r·r·马丁写了 S1.8 这个事实可能导致它更难阅读。这一部分的一些后续步骤可能是为电视节目编制这一指标的平均值,特别是因为易读性指数通常指的是书面文本,比口头文本更复杂。

年级水平

现在让我们看看第一季和第八季所有剧集的分数。正如你所看到的,第一季的第 7 和第 8 集更难阅读(如上),也对应着更高的阅读水平。此外,小数点向下舍入到较低的级别(例如 6.2 舍入到 6)。其他集从 4.5 到 6.5 不等,唯一的例外是 S.1 E.2,其阅读水平得分为 3(或三年级)。如上所述,看看是否可以对电视节目进行某种类型的平均,以了解《权力的游戏》的排名,这将是一件有趣的事情。

适用于所有季节

既然我们已经查看了所有的指标,不如我们来看看每一季的表现如何?下面你可以找到一个线图,横轴是季节数字。有趣的是,在第六季中,句子的复杂程度有了一个飞跃,但这一指标在各季中基本保持相对相似。

结束的

总结我们的发现,我当然很惊讶地看到,按照我们使用的指标,第八季的得分并不比第一季差。相反,这一季剧集的剧本在独特的单词、复杂和简单的单词、复杂的句子和易读性方面得到了类似的结果。这可能表明,人们对该系列的不满主要在于情节主线及其处理方式,而不是文本组件本身。

感谢您的阅读!

观看语言模型学习下棋

原文:https://towardsdatascience.com/watching-a-language-model-learning-play-chess-f6e6c0e094c?source=collection_archive---------23-----------------------

根据象棋符号训练 GPT2 模型的结果

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

图片:www.pexels.com

在之前的一篇文章 (Chess2Vec)中,我分析了国际象棋比赛中的哪些走法是接近的,也就是说,它们经常出现在游戏中类似的情况下。如果两个或两个以上的移动在另一个之后或之前,它们被认为是以某种方式相关的。我分析的来源是国际象棋服务器 Lichess 上的游戏文件。

在这篇文章中,我想更进一步,调查是否可能只从文本文件形式的记录游戏中学习国际象棋的规则?为此,我使用机器学习模型,这些模型实际上是为分析自然语言而设计的——语言模型。

语言模型适合象棋吗?

自然语言处理被应用于与 NLP 任务没有或没有直接联系的各种目的,并且数据以除文本之外的形式被处理。例如,计算机视觉和蛋白质折叠预测是利用自然语言处理原理的过程的例子。

我们调查了一个领域中最先进的语言建模技术,这个领域起初似乎超出了他们的范围,即计算机象棋。因为规则是明确的,而不是模糊或模棱两可的,这是因为明确的规则控制着这里发生的事情,而不是因为人们有许多不同的方式来解释语言。

例如,的 GPT3 论文表明,通过用抓取的网站数据训练语言模型,人们可以在某种程度上发展算术能力。在这个过程中,简单的运算只能在给定的数字空间内学习,而不能超出这个空间。这是模型能力不足、训练时间不足,还是仅仅是数据不足的结果?

我们以广受关注的“计算机象棋”领域为例,评估语言模型的学习能力以及模型大小、训练时间和可获得的训练数据的影响。

因为国际象棋比赛是在不断增长的互联网国际象棋服务器上记录的,所以测试区是研究语言模型训练的理想场所。另一个优点是,语言模型的质量不仅可以使用语言模型的典型评估度量来测试,例如困惑,还可以通过测试好的游戏是否是根据国际象棋规则产生的来测试。

几十年来,国际象棋一直是一个受欢迎的人工智能试验场,由于 Deepmind 的努力,它在过去几年里变得特别热门。在那里,一个国际象棋引擎被创造出来,它通过仅利用规则和新的强化学习方法(“AlphaZero”)在游戏强度方面超越了以前存在的一切。

作为之前学习的后续,不再需要规则知识。新算法穆泽罗在不知道游戏规则的情况下,超过了 AlphaZero 在之前研究中的超人表现。

为了构建一个可以从头开始发现国际象棋规则的系统,我从一种完全不同的方法开始。只有游戏抄本被用来训练语言模型。然后我们将检查这些模型,看看这个系统是如何学习国际象棋的规则的。

数据和预处理

我们需要大量的游戏数据来教授语言模型。例如,我们可能从国际象棋服务器 Lichess 获得这些信息。自 2013 年以来,服务器上托管的所有游戏都按月份排列在一个列表中。每个月的压缩 PGN 文件是可用的。总的来说,有超过 400 GB 的压缩数据,玩了超过 17 亿个游戏。

虽然预处理(例如删除元数据)后数据量会显著减少,但此时数据量仍然很大。鉴于最初的 GPT2 语言模型是在 40GB 的互联网文本上训练的,我们在训练期间有足够的空间来试验不同数量的数据。

游戏的质量在这项研究中起着次要的作用,因为它只涉及简单地学习规则。然而,玩家的 ELO 评级对他们的游戏实力的影响可以通过基于他们的元数据过滤游戏来评估。然而,为了避免由于服务器上缺乏游戏活动而在早期被放弃的游戏,我们将使用最小长度进行过滤。一个名为“ pgnextract ”的命令行程序将 PGN 文件转换成个人电脑可以读取的格式,然后用象棋引擎软件对其进行处理。该程序通过使用用于操作 PGN 文件的命令行应用程序预处理批量数据来处理几乎所有需要的操作。pgnextract 可以在合理的时间内执行所需的转换,即使数据量很大。

游戏中的所有移动数字、结果、注释、变化和其他信息都在这些清理中被删除,只显示带有 SAN 符号的纯字符串。每场比赛被记录到一个文件中的一行。所有少于 20 步的游戏都被排除。

模型的训练

培训是在 Kubernetes 集群上进行的,该集群配备了英伟达 RTX 3090 GPU,每个 GPU 都有 24 GB 的视频 RAM 和 256 GB 的主内存。为了实现,使用了基于 Pytorch 的来自 HuggingFace 的变形金刚包。

在相同的条件下,如果一个单词序列是由语言模型生成的,那么它将会重复自己,除非下次选择最可能的单词。此外,模型经常重复短语。这也影响了这里棋牌游戏的制作。因此,利用诸如 top-k 抽样和 top-p 抽样的随机过程来生成游戏。这些方法有助于最大限度地减少重复,尽管重复仍然会发生。

模型评估

为了检验模型,使用了各种方法来制作游戏:

  • 两次移动后的典型开仓位置列表。
  • 在给定数量的移动之后从游戏数据集中的游戏位置。
  • 在给定次数的移动后从随机产生的位置

对于这些游戏中的每一个,跟踪产生的正确移动的总数。语言模型将不得不处理三个特定于国际象棋的度量来评估生成的移动。为第一个评估标准开发合法移动是最容易的,因为所有的测试情况都出现在大量的训练数据游戏中,因此模型记住数据就足够了。一种形式上的概括,即象棋规则实际上是被学习的,只需要用于非常长的生成的移动序列。

随着给定数量的移动的长度增加,第二种方法更加困难。因为研究中使用的游戏数据集不包括在训练数据中,所以随着所提供的序列长度的增长,将会出现越来越多的模型从未见过的位置。因此,模型必须学习规则,以生成合法的移动。

第三项措施需要由随机的棋步序列产生起始位置。由于这种高度的不可预测性,这些步骤中的大部分以前从未出现在人类游戏或测试数据集中。因此,模型很难为这些序列生成规则的移动。即使对人类来说,处理这样的随机位置也是非常困难的。在对国际象棋大师和业余爱好者的实验中发现,虽然优秀的国际象棋选手可以很容易地记住典型的位置,但他们对随机位置有问题。

结果

为了了解这两个变量如何影响学习过程,我们用不同数量的游戏(99,604;577,202;2163417 场)。几个时期后,使用上一节中描述的评估指标对每个模型进行评估,以评估结果。

通过这些统计数据,我们可以看到,当研究范围内的更多游戏用于训练时,在相同的时间内可以获得更好的结果。然而,模型的复杂性并没有这么大的影响。还值得注意的是,语言模型的典型评估指标,预测准确性和困惑度,在这里没有提供这方面的信息。

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

作者从移动 10 次/图像后的位置的平均正确移动次数

象棋知识是如何存储在模型中的?

我们已经看到模型中有更多的参数和更多的训练数据如何帮助语言模型更好地学习国际象棋规则。现在,我们将寻找在模型参数中如何表示国际象棋规则信息的任何模式。为此,我们将使用不同的可视化。

当适当地可视化和研究时,神经元激活可以揭示单个神经元和神经元群所扮演的角色。我们使用 Ecco 库进行分析。

让我们来看看一个经过训练的模型在不同情况下的内部运作。第一个位置来自开放阶段,当只有一个合法选项存在时,它是一次性发生的。

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

位置 1 /作者图片

如果我们观察序列的单个部分对新移动的影响,我们会发现最后部分的影响最大,但除此之外,整个序列也会影响输出。

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

颜色代码显示影响的强度,或者,我们也可以用百分比显示各个部分的影响。

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

模型有多确定生成的移动是正确的?

在生成器组件的最后一层的末尾,我们评估模型对于每个可能的令牌的机会。移动分两个阶段产生,两个部分都有很高的可能性被创造出来,但是,只有一个部分有 100%的可能性。

让我们来看看神经元的激活,看看模型如何根据移动序列跟踪棋盘。为了生成可接受的走法,语言模型需要棋盘及其棋子的表示。

通过检查神经元组的激活,我们看到一组(红色)活跃在棋盘的行信息上,另一组(蓝色)活跃在棋盘的列和块信息上。另外两个在绳子的两端被激活。

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

作者图片

现在让我们看看另一个位置,它来自所谓的“世纪游戏”。在具有大量选项的复杂中间位置,该模型达到了其极限。

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

位置 2 /作者图片

它识别出 d 文件上的一个片段是最后捕获的,并希望用 Rxd 或 Qxd 将其捕获回来。但是,在此位置没有有效的移动。棋盘在神经元中的表现是不正确的,所以没有可行的移动被创造出来。

许多潜在的 next 令牌分布在网络最后一层的多个候选中。

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

在第二个位置,可以看出,实际上先前移动的整个序列对将要产生的新移动有影响。

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

在这个例子中,神经元组在行信息以及图形和列信息上的专门化是明显的。另一方面,激活在序列开始时较少。

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

作者图片

在两个示例位置中,可以看到整个序列对生成的移动有影响,这对于生成正确的移动是必要的。通过观察神经元的活动,我们可以看到关于行、列和图形类型的信息存储在不同的神经元组中。因此,该模型似乎组织了表示棋盘状态所必需的信息的存储。

论文发表在自然语言处理最新进展国际会议(RANLP 2021)的会议录上。所有的细节都可以在那里找到。

水冷却器谈话:你真正工作了多少?

原文:https://towardsdatascience.com/water-cooler-talk-how-much-do-you-really-work-d1039fb97538?source=collection_archive---------32-----------------------

850 天工作、学习和睡眠数据的分析和可视化。哪个位置让我更有效率?

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

Priscilla Du Preez 在 Unsplash 上拍摄的照片。

**你每天工作多长时间?**我说的工作,不是指在饮水机旁聊天,花 15 分钟泡一杯咖啡,或者在厕所里回复你所有的 Whatsapp 信息。还有 而不是 偶尔上推特,或者写“就一封”个人电子邮件,里面有 100 个关于你最近一次尝试制作康普茶的细节。

我是说真正的工作时间。

衡量它的一种方法是跟踪和分类你在笔记本电脑上花费的时间。如果有任何有趣的趋势,或者工作时间与情绪或睡眠之间的相关性,它会让你清楚地看到你实际上在做什么。

猜猜是什么。一位痴迷于自我追踪、有抱负的数据分析师做到了!🎉你马上就会知道她发现了什么。

这篇文章中的数据来自我的每日和每周自我跟踪表,我已经填写了两年多了——你猜对了*——每日和每周。这些表格记录了我的心情、地点、正在服用的药物、习惯,我用它们来记录各种提示下的一些日志式的想法。睡眠数据来自 Oura 戒指,我也戴了两年多了。*

这篇文章的一个简短版本也以一个场景故事的形式存在。

最努力工作的城市

我过去经常旅行,所以在这个数据集中首先要调查的是我工作最多的城市。

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

排名如下:

1.葡萄牙里斯本🇵🇹 (31.25 小时)

2.法国🇫🇷卡昂(19.44 小时)

3.印度尼西亚巴厘岛🇮🇩 (17.86 小时)

但是,看数值。里斯本以的优势赢了卡昂

那里发生了什么事?你可能会想知道。

这很简单。我没有我的伴侣,作为一个相当不合群的人,没有太多事情可做。

你可能想知道的第二件事是,“哎呀,其他人平均每周只工作 17-9 小时?,你好像工作不多啊!

但是,还记得这篇课文的第一段吗?⬆️:嗯,我相信许多所谓的每周工作 40 小时的办公室工作最多是 25 小时的工作。所以,我的工作时间可能与你的没有太大的不同……我向你挑战,开始跟踪它——准备好大吃一惊吧。

不要误解我,这不是对任何人懒惰的评论,而是对我们感知的不准确的评论。如果你花那么多时间在办公室,看起来你好像“工作”了 40 个小时。

我认为这也是对不完善的工作标准的评论。

如果你能在 10 小时内完成和其他人 30 小时内完成的一样多的事情,你应该被要求在剩下的 20 小时里坐在办公室里吗?

**我不这么认为。**而且,你们可能应该根据结果而不是花费的时间获得相同的报酬。

工作时间短?故事的第二部分。

注意到我经常发布关于数据的帖子了吗?嗯,我正在重新培训成为一名数据分析师。这需要大量的学习,这也是我花费大量时间的地方。

下图显示了各个城市工作和学习时间的综合价值。

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

“赢家”和上一个案例中的一样:里斯本、卡昂和巴厘岛。但是,现在的数字要高得多。(仍然没有包括饮水机谈话,当我给我妈妈写任何康普茶尝试的时候,计时器被切换到跟踪“家庭时间”。)

☝️:这些数字应该是数字流浪者光辉形象的更新,他们每周在巴厘岛的游泳池边工作几个小时。没有。

真实的形象看起来很像这样:利用生活的低成本作为一个机会,尽可能多地投入时间到学习中,同时试图找到一个有空调的房间和一把像样的椅子来坐,但不是为此支付一大笔钱。你没有财产,你一周只工作 15 小时,记得吗?

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

我找到了一把好椅子,但有人比我快。好色客别墅,巴厘岛乌布(印度尼西亚)。

有工作城市和学习城市吗?

将工作时间和学习时间分开来看,我们可以算出在哪个城市的哪项活动上花费了更多的时间。

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

看起来里斯本在工作时间方面彻底击败了竞争对手,在工作时间和学习时间的差异方面也是如此。

图表的另一边是华沙,在那里我花在学习上的时间比工作上的时间多得多。我还记得那段时间,那是一些繁重的 SQL 查询的时期,我试图申请两份工作,并且有非常苛刻的选择过程。

不用说,他们的 SQL SELECT 没有返回我。这就是为什么你仍然可以享受我的职位。否则,我现在会在别的地方赚钱并产生巨大的积极影响。😛

时间趋势?

看一下趋势线,总体来说,我花在工作上的时间更少了,而花在学习上的时间更多了。

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

这怎么可能?现在是我想知道了。

一种解释可能是,随着时间的推移,我的经验增加了,作为一名自由职业者,我收取更多费用的能力也增强了。换句话说,我每小时挣得更多,因此在同样的经济效益下,我可以干更少的活。(如果我可以花一点时间自怜的话,这是一个更低、更悲惨的选择。)

把这些数字按季度分组怎么样?

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

当按季度分组时,过去两年讲述了一个早年赚钱动机的故事,随着时间的推移,这变成了对自我改善的长期收益的关注。💰🥳🌹

好吧,这是一个严重的过度解读。

它唯一显示的是,在过去的两年里,我花在工作上的时间比上半年花在学习上的时间还多。我敢肯定,你——读到这篇文章的两个人之一——对于 2021 年 Q1 和 Q2 的选举结果,正坐立不安。

更高的睡眠分数,而不是更多的工作🤷‍♀️

最后,我很好奇睡眠是否会影响我的工作时间。我的睡眠数据被一个 Oura 环跟踪,每天晚上,它都会根据我的睡眠质量计算出一个睡眠分数。分数越高,我的睡眠越好。

这是一个散点图,有一条趋势线来衡量相关性。

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

在绘制这张图表之前,我会假设高质量的睡眠会增加我的动力和注意力,从而让我花更多的时间在工作上。

但是,令人惊讶的是,事情似乎正好相反!

睡眠得分越高,我花在工作上的时间就越少。

为什么?也许更好的睡眠让我有时间反思我的优先事项,意识到工作是对生命的浪费,我应该去欣赏我凝视的每一根倒下的树枝。或者,有了更好的睡眠质量,我会更加专注,在更短的时间内完成所有工作。或者,一千个其他的解释。

重要的是,其他图表显示减少了花在工作上的时间,并不与花在学习上的时间显著增加相一致。有少量增加,但没有统计学意义。

后续步骤

不仅要衡量长度,还要衡量工作和学习的质量,这是很有价值的。这将有助于量化工作时间的减少意味着生产率的降低还是提高,并更精确地了解睡眠对这些指标的影响。

如果您对数据故事感兴趣,请查看以下内容:

水变成咖啡:浓缩咖啡

原文:https://towardsdatascience.com/water-into-coffee-espresso-c7b0d50f3c63?source=collection_archive---------23-----------------------

咖啡数据科学

压榨前将水和咖啡渣混合

几个月前,我尝试了一杯浓缩咖啡,将冰球放在盛有水的篮子里一整夜。其中一条评论问,如果我在咖啡中混合少量的水,然后用勺子把它放进压榨机里挤出咖啡,会发生什么?这是一个足够小的实验,所以我试了一下。

我从 9 克咖啡和 18 克水开始。我把它们放在碗里搅拌,直到所有的咖啡渣都变湿。我算了一下,我可以拿出大约 9 克咖啡液。这是终极预湿。

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

所有图片由作者提供

我确定稠度像泥浆,我给它几分钟。一些克莉玛已经显露出来了。

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

然后我把这些泥放进一个 Kompresso,但是我用了 Kompresso 的上半部分,这样我可以更好地观察发生了什么。

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

第一轮没进多少液体,就多加了 19 克水。

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

第一位果然是暗的。对于这种类型的测试,一切似乎都很正常。

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

事后我看了看咖啡冰球,没有看到任何奇怪的通灵现象。

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

我查看了几个输出样本的提取率(EY)。他们都遵循一条直线前进的趋势线。10%在 1:1 中被提取,这看起来很低,可能是水温较低的结果。最终的 EY 在输出比的良好范围内。

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

我看了数据,还估算了冰球中剩余的水。如果我假设它测量的 TDS 和最后一点流出的咖啡液体是一样的,我就能看到我错过了什么。

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

基于这一预测,最终的镜头将有超过 22%的 EY,但最终的比例是 3.6:1,这是我的典型比例的两倍多。

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

这是一个奇怪的测试。我有点想用热水再做一次。我的主要问题是,在整个实验过程中,水温会下降。主要的问题是,如果没有更长的浸泡时间、更高的压力或更高的温度,就不可能获得更高的提取率。

如果你愿意,可以在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡视频和浓缩咖啡相关的东西。你也可以在 LinkedIn 上找到我。也可以关注我

我的进一步阅读:

个人故事和关注点

乐高故事启动页面

浓缩咖啡系列文章

一台用于制作优质浓缩咖啡的叶片研磨机

浓缩咖啡:群头水温分析

真空罐能更快去除咖啡豆中的气体吗?

在水中跌跌撞撞:浓缩咖啡水实验

克莉玛,嗯,它有什么用?

南印度咖啡

重新研磨用过的咖啡,制成意式浓缩咖啡

冲泡咖啡渣

咖啡水果茶 via Flair Espresso

强迫症工具对浓缩咖啡不起作用

浓缩咖啡的水温

原文:https://towardsdatascience.com/water-temperature-for-espresso-1abe656b54d3?source=collection_archive---------15-----------------------

咖啡数据科学

提高提取温度

多年来,水温一直是浓缩咖啡和普通咖啡的有趣话题。取决于冲泡方法和咖啡烘焙,水温对味道有很大的影响。

然而,我们经常混淆水温和机器温度,因为使用加压机器,水可以达到比炉子上高得多的温度。结果,水一接触到咖啡,温度就下降了。即使把水加热到接近 100 摄氏度也会很棘手,因为它正在蒸发。

温度是需要跟踪的变量,尤其是对于杠杆式机器。

我收集了几个温度下的一些照片,以展示温度对味道和提取的影响有多大。我用了金特快和韩国磨床。我对每一次注射都遵循相同的协议,这意味着每一次注射都是不连续的,有 60 秒的预输注和输注期间的压力脉冲。

咖啡豆是中度烘焙的,所以如果你用的是较深的烘焙,你可能要用较低的温度。

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

所有图片由作者提供

机器温度

我通常用测温枪测量机器温度。我见过测试条,但温度枪对我有用,因为我的机器是喷漆的。在收集这些数据时,我意识到机器的温度与输出水温并不相同。所以我收集了一些数据,发现机器温度和输出水温之间存在线性相关性。

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

我以此为指导,推动高于正常水平。在过去的一年里,我的目标是将机器温度控制在 114 摄氏度,但这导致水温在 91 摄氏度左右。当我开始尝试更高的高度时,我发现我可能错过了一些更好的镜头。

绩效指标

我使用两个指标来评估技术之间的差异:最终得分和咖啡萃取。

最终得分 是评分卡上 7 个指标(辛辣、浓郁、糖浆、甜味、酸味、苦味和回味)的平均值。当然,这些分数是主观的,但它们符合我的口味,帮助我提高了我的拍摄水平。分数有一些变化。我的目标是保持每个指标的一致性,但有时粒度很难确定。

使用折射仪测量总溶解固体量(TDS),这个数字结合咖啡的输出重量和输入重量用于确定提取到杯中的咖啡的百分比,称为提取率(EY)** 。**

多个温度下的数据

我在这里显示的温度是使用上面的曲线从机器温度计算得到的水温。

温差的第一个视觉信号是水流得更快。对于 97C,我不得不将预输注减少到 30s,因为它流动得太快了。

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

从圆盘的底部看,较低温度下有暗点,表示流动缓慢,但是当温度达到 97℃时,圆盘的整体颜色变浅,暗点变少,表示流动均匀,提取率更高。

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

顺序:顶配:85C、87C、90C 底部:92C、95C 和 97C

证据就在味道和 EY。味道真的在上升到 97C 的路上提升了。

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

总时间随着温度的升高而下降,因为水流得更快了。

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

我真的很喜欢这个实验,因为它揭示了我没有充分加热我的机器。热水还会增加机器中的压力,进而影响预浸压力。也许实验的另一个设计是使用压力计来了解压力,然后释放压力以使比较更加公平,或者使用 DE1。

关键是要实验,因为水温会有不同的影响,取决于机器和烘烤。

如果你愿意,可以在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡视频和浓缩咖啡相关的东西。你也可以在 LinkedIn 上找到我。也可以关注我订阅

我的进一步阅读:

浓缩咖啡系列文章

工作和学校故事集

个人故事和关注点

乐高故事启动页面

摄影飞溅页面

使用图像处理测量咖啡研磨颗粒分布

改善浓缩咖啡

断奏生活方式概述

测量咖啡磨粒分布

咖啡萃取

咖啡烘焙

咖啡豆

浓缩咖啡用纸质过滤器

浓缩咖啡篮及相关话题

意式咖啡观点

透明 Portafilter 实验

杠杆机维修

咖啡评论和想法

咖啡实验

用 Plotly 制作瀑布图

原文:https://towardsdatascience.com/waterfall-charts-with-plotly-43822918e9eb?source=collection_archive---------7-----------------------

为什么&如何

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

图片由 Muhamad Rizal Firmansyah 从 Unsplash 拍摄

瀑布图

又名:飞砖图、浮砖图、马里奥图

原因:是一个 2D 图,用于表示在一段时间内或在多个分类步骤内连续添加正值或负值的累积效果。随着时间或基于时间的瀑布图表示一段时间内的增加和减少。分类步骤或基于类别的瀑布图表示收入和费用或任何其他变量的加减,依次为正值和负值。

如何:瀑布图(WCs)由一系列竖条(柱)组成。初始值和最终值由全列表示(通常从零基线开始),而中间值显示为代表加法和减法的浮动列。最后一个竖线表示这种加法和减法的结果。加法通常用绿色表示,而减法通常用红色表示。另外,习惯上用另一种颜色表示起始列和结束列。建议通过用连接横线连接各列来展示累积效果的理念。

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

图 1:瀑布图的示意图。作者用 Plotly 做的。

现在应该清楚为什么它们被称为飞砖或浮砖图了。有人将它们命名为马里奥图表,因为它与流行的视频游戏有一定的相似性。

讲故事 : WCs 通常用于金融和商业中的在正值和负值之间波动的数据。基于时间的 WCs 显示每月或每年的总变化,同时显示整月或整年的利润或亏损。基于类别的 WCs 显示给定变量的连续增加的正值或负值的累积效应。正值可能是收入、收益、仓库库存增加、积极变化或收入流。负值可能是费用、损失、仓库存货、负变化或流出量。请记住,阅读是从左到右依次进行的。

WC 是一种有价值的数据可视化技术,因为它允许分析师清楚地确定哪些时段或项目显示最大收益,何时观察到最大损失,以及在评估的时间段内净变化是什么。它提供了比其他类似图表更多的上下文信息。

瀑布图与 Plotly

我们使用了开源的图形库 Plotly ,它提供了一组名为 graph objects 的类来构造图形。是具有数据属性和布局属性的主类。数据属性指的是一个轨迹,一个带有相应参数的特殊类型的图表。布局属性指定图形的标题、轴、图例和其他属性。

对于本文中的瀑布图,Plotly trace 为*go.Waterfall()*对应的参数为:*x=*设置 x 坐标(一般为字符串或日期时间对象);*y=*设置 y 坐标(通常是一列 con 数值,包括); *base=*设置数值基线。

最重要的参数是*measure=* 一个具有下列值之一的数组:相对;绝对;总计相对值,默认值,表示增加或减少。绝对值设置初始值,而总和计算代数和。

这是图 1 中瀑布图的代码:

import plotly.graph_objects as gofig1  = go.Figure()hrz = ["Initial", "Addition 1","Addition 2",
       "Subtraction 1","Subtraction 2","Final"]vrt = [100, 600, 700, -400, -300, None]fig1.add_trace(go.Waterfall(                 
                  x = hrz, y = vrt,
                  base = 0,
                  measure = [ "absolute","relative",    
                              "relative","relative",
                              "relative","total" ]                        
                )) fig1.show()

我们更新了图表以改进讲故事:text为每个条形设置注释;textposition将文字列表定位在内或将定位在外;update.layout 设置标题文本和标题字体。

这是图 2 中瀑布图的代码:

import plotly.graph_objects as gofig2  = go.Figure()hrz = [ "Initial",  "Addition 1", "Addition 2",
       "Subtraction 1","Subtraction 2","Final"]vrt  = [100, 600, 700, -400, -300, None]text = ['100', '+600', '+700', '-400', '-300', '700']fig2.add_trace(go.Waterfall(
               x = hrz, y = vrt,
               base = 0,
               text = text, textposition = 'inside',   measure = ["absolute",  "relative", "relative",
                          "relative","relative","total"]  
               )) fig2.update_layout(
                   title_text = "Category-Based Waterfall Chart",
                   title_font=dict(size=25,family='Verdana', 
                                   color='darkred')
                   )fig2.show()

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

图 2:瀑布图的示意图。作者用 Plotly 做的。

在我们的第二个例子中,我们将使用一个基于时间的瀑布图来表示一个虚构的地方每月访客数量依次增加和减少的累积效应。

首先,我们将创建一个数据框架,其中包含我们应该收集的关于访问者数量增减的数据。我们需要将库Numpy&Pandas分别导入为 nppd

import numpy  as np
import pandas as pdmonths =   ['Initial', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
            'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Final']visitors = [15000, +18000, +12000, -4000,  +8000, 
           -10000, -5000,  +20000, +15000, +18000,
           -16000, -18000, +10000, 63000]df = pd.DataFrame({'months' : months, 'visitors' : visitors,
                   'text' : visitors})

我们需要在 dataframe 中创建一个列,指示与*measure*相关的值。记住这个参数可以取以下三个值中的任意一个:*absolute;相对的;总计。*为了填充名为*measure* 的列,我们使用了 Numpy 方法np.select(),该方法根据条件列表返回一个从 choicelist 中的元素提取的数组。

conditionlist = [(df['months'] == 'Initial'),
                 (df['months'] == 'Final'),
            (df['months'] != 'Initial') & (df['months'] != 'Final')]choicelist   = ['absolute', 'total', 'relative']df['measure'] = np.select(conditionlist, choicelist,
                          default='absolute')

下面的屏幕截图显示了数据集的 14 条记录:

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

现在我们准备画 WC 了。

Plotly 允许通过 *increasing**decreasing**totals*.自定义浮动条的颜色

fig3  = go.Figure()fig3.add_trace(go.Waterfall(
               x = df['months'], y = df['visitors'],
               measure = df['measure'],
               base = 0,
               text = df['visitors'],
               textposition = 'outside',
               decreasing = {"marker":{"color":"crimson",                 
                  "line":{"color":"lightsalmon","width":2}}},
               increasing = {"marker":{"color":"forestgreen",
                  "line":{"color":"lightgreen", "width":2}}},
               totals     = {"marker":{"color":"mediumblue"}}
               ))

我们决定将注释放在条的外面,以避免混乱。最后,我们设置了标题并更新了坐标轴:

fig3.update_layout(
                   title_text = "Time-Based Waterfall Chart",
                   title_font = dict(size=25,family='Verdana',
                                     color='darkred'))fig3.update_yaxes(title = 'Visitors' , range = [0, 100000])
fig3.update_xaxes(title = 'Year 2020')fig3.show()

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

图 3:基于时间的瀑布图。作者用 Plotly 做的。

**总而言之:**瀑布图的关键概念是传达一段时间内或一系列相关项目中正值和负值的变化。它们很容易实现,尤其是用 Plotly。它们广泛用于金融分析和商业环境。

如果你发现了这篇感兴趣的文章,请阅读我之前的(https://medium.com/@dar.wtz):

分歧棒线,为什么&如何,用分歧讲故事

斜率图表,为什么和如何,用斜率讲故事

Wav2Vec 2.0:语音表示的自我监督学习框架

原文:https://towardsdatascience.com/wav2vec-2-0-a-framework-for-self-supervised-learning-of-speech-representations-7d3728688cae?source=collection_archive---------1-----------------------

思想和理论

解释语音识别模型

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

图片由下雪发自Freepik.com

Wav2Vec 2.0 是自动语音识别的当前最新模型之一,这是由于在该领域中自我监督训练是一个相当新的概念。这种训练方式允许我们在未标记的数据上预先训练模型,这总是更容易获得。然后,可以针对特定目的在特定数据集上对模型进行微调。正如以前的作品所显示的,这种训练方式是非常有力的[4]。

主要思想

如下图所示,模型分两个阶段进行训练。第一阶段是在自我监督模式下,这是使用未标记的数据完成的,其目的是尽可能实现最佳的语音表示。你可以用类似于思考单词嵌入的方式来思考这个问题。单词嵌入还旨在实现自然语言的最佳表示。主要区别在于 Wav2Vec 2.0 处理的是音频而不是文本。训练的第二阶段是监督微调,在此期间,标记的数据被用来教导模型预测特定的单词或音素。如果你不熟悉“音素”这个词,你可以把它想成特定语言中最小的声音单位,通常用一两个字母来表示。

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

图一。Wav2Vec 2.0 的训练阶段(图片由作者提供)

第一阶段的培训是这种模式的主要优势。学习一个非常好的语音表示能够在少量的标记数据上实现最先进的结果。例如,该论文的作者已经在一个巨大的 LibriVox 数据集上对模型进行了预训练。然后,他们使用整个 Libri 语音数据集进行微调,在测试清理子集上产生了 1.8% 的单词错误率(WER) ,在测试其他子集上产生了 3.3%的 WER。使用少了近 10 倍的数据,允许在测试-清理上获得 2.0%的 WER,在测试-其他上获得 4.0%。仅使用 10 分钟的标记训练数据(几乎没有数据),在 Libri 语音的 test-clean / test-other 子集上产生 4.8% / 8.2%的 WER。根据代码为的论文,它在 2018 年 1 月将会达到最先进的水平[5]。

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

图二。Wav2Vec 2.0 的结果(图片由作者提供)

Wav2Vec 2.0 模型架构

用于预测的最终模型的架构包括三个主要部分:

  • 处理原始波形输入以获得潜在表示的卷积层-
  • 变形金刚图层,创造情境化的表现- C
  • 线性投影到输出-。**

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

图 3。微调的 Wav2Vec 2.0 模型架构(图片由作者提供,基于 wav2vec 2.0:语音表示的自我监督学习框架)

这就是模型经过最终微调后的样子,可以在生产环境中开发了。整个魔术发生在训练的第一阶段,在自我监督模式下,当模型看起来有点不一样。该模型在没有线性投影生成输出预测的情况下被训练。

基本上,本文主旨部分提到的语音表征对应于图 4 中的‘语境表征C**’。预训练的主要思想类似于 BERT:变换器的部分输入被屏蔽,目的是猜测屏蔽的潜在特征向量表示*。然而,作者用对比学习改进了这个简单的想法。***

对比学习

对比学习是一个输入以两种不同方式转化的概念。之后,模型被训练以识别输入的两个变换是否仍然是相同的对象。在 Wav2Vec 2.0 中,变换层是第一种变换方式,第二种方式是通过量化,这将在本文的后续部分进行解释。更正式地说,对于一个被掩蔽的潜在表征【zₜ】,我们希望得到这样一个上下文表征【cₜ】以便能够在其他量化表征中猜出正确的量化表征【qₜ】。很好地理解前面的句子是很重要的,所以如果你需要的话,不要犹豫就此打住:-)用于自我监督训练的 Wav2Vec 2.0 版本如图 4 所示。

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

图 4。用于自我监督训练的 Wav2Vec 2.0 模型架构(图片由作者提供,基于 wav2vec 2.0:语音表示的自我监督学习框架)

为了总结我们到目前为止所学的内容,请看看表 1。

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

表 1。Wav2Vec 2.0 自我监督学习和监督学习的比较

量化

量化是将连续空间中的值转换为离散空间中有限的一组值的过程。

但是我们如何在自动语音识别中实现这一点呢?让我们假设一个潜在语音表示向量 、zₜ 覆盖两个音素。一种语言中音位的数量是有限的。此外,所有可能的音素对的数量是有限的。这意味着它们可以被相同的潜在语音表征完美地表征。此外,它们的数量是有限的,所以我们可以创建一个包含所有可能的音素对的码本。然后,量化归结为从码本中选择正确的码字。然而,你可以想象所有可能的声音的数量是巨大的。为了更容易训练和使用,Wav2Vec 2.0 的作者创建了 G 码书,每个码书都由 V 码字组成。为了创建量化表示,应该从每个码本中选择最佳字。然后,将选择的向量连接起来,用线性变换进行处理,以获得量化的表示。该过程如图 5 所示。

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

图 5。量化(作者图片)

我们如何从每个码本中选择最佳码字?答案是 Gumbel softmax :

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

其中:

  • sim——余弦相似度
  • ***lϵℝᴳˣ***—logits 由 z 计算得出,
  • =-log(-log(uₖ)、
  • uₖ 从均匀分布 U(0,1) 中取样,
  • 𝜏——温度。

由于这是一项分类任务,softmax 函数似乎是在每个码本中选择最佳码字的自然选择。为什么在我们的例子中, Gumbel softmax 比普通的 softmax 好?它有两个改进:随机化和温度 𝜏 。由于随机化,模型更愿意在训练期间选择不同的码字,然后更新它们的权重。重要的是,特别是在训练的开始,防止只使用代码簿的子集。温度随着时间从 2 降低到 0.5,因此随机化的影响随着时间变小。

掩饰

让我们深入到掩蔽的细节。它由两个超参数定义:p= 0.065M = 10,并按以下步骤进行:

  1. 从潜在言语表征的空间中取出所有时间步骤 Z
  2. 样品没有替换比例 p 来自上一步的向量。
  3. 选择的时间步长是起始索引。
  4. 对于每个索引 i ,连续的 M 时间步长被屏蔽。

如下图所示,我们采样了两个标有橙色的向量作为起始索引。

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

图 6。选择蒙版的起始索引(图片由作者提供)

然后,从每个选择的向量开始, M = 10 个连续的时间步长被屏蔽。跨度可能重叠,由于它们之间的间隙等于 3 个时间步长,我们屏蔽了 14 个连续的时间步长。

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

图 7。屏蔽 M 个连续的时间步长(图片由作者提供)

最后,对比损失仅针对掩模的中心时间步长进行计算。

培训目标

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

训练目标是两个损失函数之和:对比损失多样性损失**。目前,只提到了对比损失。它负责训练模型来预测 K + 1 量化候选表示q’qₜ.中正确的量化表示 qₜ 集合 Qₜ 由目标 qₜK 干扰子组成,这些干扰子是从其他掩码时间步中均匀采样的。**

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

字母 κ 是训练过程中恒定的温度。 Sim 代表余弦相似度*。函数的主要部分类似于 softmax,但是我们取上下文表示**【cₜ和量化表示 q 之间的余弦相似度。为了更容易优化,我们还将 -log 放在那个分数上。*

*多样性损失**是一种正则化技术。作者设置了 G =2 个码本,每个码本中有 V =320 个码字。理论上它给出了 320320=102400 个可能的量化表示。然而,我们不知道该模型是否真的会使用所有这些可能性。否则,它将仅学习使用例如来自每个码本的 100 个码字,并且它将浪费码本的全部潜力。这就是多样性损失有用的原因。它基于熵,熵可通过以下公式计算:

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

其中:

  • x —离散随机变量𝒳的一种可能结果,
  • P(x) —事件发生的概率 x

当数据分布均匀时,熵取最大值。在我们的例子中,这意味着所有的码字都以相同的频率使用。这样,我们可以在整批训练样本上计算每个码本的熵,以检查码字是否以相同的频率使用。这个熵的最大化将鼓励模型利用所有码字。最大化等于负熵最小化,负熵是多样性损失。

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

微调

由于 Wav2Vec 2.0 的微调阶段并不包含任何突破性的发现,所以作者并没有太关注他们论文的这一部分。在训练的这个阶段,不使用量化。取而代之的是,在上下文表示 C 的顶部添加一个随机初始化的线性投影层。然后用标准的连接主义者时态分类(CTC) loss 和一个修改版本的 SpecAugment 对模型进行微调,这超出了本文的范围。有趣的是,作者并没有放弃掩蔽,因为它仍然可以作为一种正则化技术。

结论

Wav2Vec 2.0 使用自我监督的训练方法进行自动语音识别,该方法基于对比学习的思想。在巨大的原始(未标记)数据集上学习语音表示减少了获得满意结果所需的标记数据量。

这篇文章的要点是:

  • Wav2Vec 2.0 利用了自我监督的训练,
  • 它使用卷积层来预处理原始波形,然后应用变换器来增强具有上下文的语音表示,
  • 其目标是两个损失函数的加权和:
  • 对比损失,
  • 多样性丧失,
  • 量化用于在自我监督学习中创建目标。

我希望你喜欢我的文章,它能帮助你理解 Wav2Vec 2.0 的思想。要了解更多细节,我鼓励你阅读原文[1]。

参考

[1] A. Baevski,H. Zhou,A. Mohamed 和 M. Auli, wav2vec 2.0:语音表征的自我监督学习框架 (2020),CoRR

[2] A. Kim,香农熵背后的直觉 (2018),走向数据科学

[3] 熵(信息论),维基百科。

[4] J. Devlin,M. Chang,K. Lee,K. Toutanova, BERT:用于语言理解的深度双向变压器的预训练 (2019)

[5]LibriSpeech 上的语音识别测试-clean ,试卷用代码。

Python 中 ENSO 和季风数据的小波&傅立叶分析

原文:https://towardsdatascience.com/wavelet-fourier-analysis-on-the-enso-and-monsoon-data-in-python-31504eeadc2c?source=collection_archive---------10-----------------------

小波级数通过由小波生成的某个标准正交级数来表示实值或复值函数。我们不能简单地用傅立叶变换的基本知识来解释小波变换。

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

万花筒Unsplash 上拍摄的照片

傅里叶变换

傅立叶变换是将信号从时域变换到频域的有用工具。频谱中的峰值对应于信号中出现最多的频率。当频谱稳定时(信号中存在的频率不依赖于时间),傅立叶变换是可靠的。然而,整个时间序列的傅立叶变换不能告诉特定频率上升的瞬间。

一个快速的解决方法是使用滑动窗口找到一个给出时间和频率信息的频谱图(著名的短时傅立叶变换)。然而,这使用了窗口的刚性长度,因此限制了频率分辨率。这是由于信号分析中的不确定性原理(持续时间-带宽定理)在频率和时间分辨率之间进行了权衡(帕普利斯 1977;Franks 1969),类似于量子力学中关于粒子位置和动量的海森堡测不准原理。

小波变换

因为在地球科学中,我们主要处理动态系统,所以大多数信号在本质上都是非平稳的。在这种情况下,小波变换是一种更好的方法。

小波变换在时域和频域中都保持高分辨率(Torrence & Compo 1998Chao 等 2014)。它告诉我们信号中存在的频率细节及其在时间上的位置。这是通过分析不同尺度的信号来实现的。与使用一系列不同频率的正弦波的傅立叶变换不同,小波变换使用一系列称为小波的函数,每个函数具有不同的尺度来分析信号。使用小波的优点是小波在时间上是局部的,不像它们在傅立叶变换中的对应物。可以通过将信号与时间上不同位置的小波相乘来利用小波的这种时间局部化特性,从信号的开头开始,慢慢地向信号的结尾移动。这个过程被称为卷积。我们可以通过在每次迭代中增加小波的尺度来迭代整个过程。这将给出小波频谱图(或标度图)。标度类似于傅立叶变换中的频率。标度可以通过以下关系式转换为伪频率:

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

这种关系表明,较高的比例因子(较长的小波)对应于较小的频率。因此,在时域中缩放小波可以用于分析频域中的较小频率。

小波分析在厄尔尼诺-南方涛动海表温度和印度季风降水资料中的应用

我将小波分析概念应用于以摄氏度为单位的厄尔尼诺-南方涛动(ENSO)海洋表面温度(1871-1997)和以毫米为单位的印度季风降雨量(1871-1995)(Torrence & Webster 1999)的季度数据集。小波频谱图中的颜色模式取为 log2(幂)。用于此分析的小波是复数 Morlet 小波,带宽为 1.5,归一化中心频率为 1.0。如果比例过低,则可能会因违反奈奎斯特频率而发生混叠。如果尺度太大,小波计算可能是计算密集型的。

import pywt
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
plt.style.use('seaborn')

dataset = "monsoon.txt"
df_nino = pd.read_table(dataset, skiprows=19, header=None)

N = df_nino.shape[0]
t0 = 1871
dt = 0.25
time = np.arange(0, N) * dt + t0

signal = df_nino.values.squeeze() #to get the scalar values
signal = signal - np.mean(signal)

scales = np.arange(1, 128) #set the wavelet scales

def plot_signal(time, signal, average_over=5, figname=None):
    fig, ax = plt.subplots(figsize=(15, 3))
    ax.plot(time, signal, label='signal')
    ax.set_xlim([time[0], time[-1]])
    ax.set_ylabel('Signal Amplitude', fontsize=18)
    # ax.set_title('Signal + Time Average', fontsize=18)
    ax.set_xlabel('Time', fontsize=18)
    ax.legend()
    if not figname:
        plt.savefig('signal_plot.png', dpi=300, bbox_inches='tight')
    else:
        plt.savefig(figname, dpi=300, bbox_inches='tight')
    plt.close('all')

plot_signal(time, signal) #plot and label the axis

在上面的代码中,我使用了 pandas read_table方法来读取monsoon.txt中的数据。我不确定我最初是从哪里获得季风数据集的,所以我不能引用来源。如果有人知道,请在下面评论。上面的脚本使用模块wavelet_visualize来计算和绘制下图。

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

信号图(图片由作者提供)

def get_fft_values(y_values, T, N, f_s):
    f_values = np.linspace(0.0, 1.0/(2.0*T), N//2)
    fft_values_ = np.fft.fft(y_values)
    fft_values = 2.0/N * np.abs(fft_values_[0:N//2])
    return f_values, fft_values

def plot_fft_plus_power(time, signal, figname=None):
    dt = time[1] - time[0]
    N = len(signal)
    fs = 1/dt
    fig, ax = plt.subplots(2, 1, figsize=(15, 3), sharex=True)
    variance = np.std(signal)**2
    f_values, fft_values = get_fft_values(signal, dt, N, fs)
    fft_power = variance * abs(fft_values) ** 2  # FFT power spectrum
    ax[0].plot(f_values, fft_values, 'r-', label='Fourier Transform')
    ax[1].plot(f_values, fft_power, 'k--',
               linewidth=1, label='FFT Power Spectrum')
    ax[1].set_xlabel('Frequency [Hz / year]', fontsize=18)
    ax[1].set_ylabel('Amplitude', fontsize=12)
    ax[0].set_ylabel('Amplitude', fontsize=12)
    ax[0].legend()
    ax[1].legend()
    # plt.subplots_adjust(hspace=0.5)
    if not figname:
        plt.savefig('fft_plus_power.png', dpi=300, bbox_inches='tight')
    else:
        plt.savefig(figname, dpi=300, bbox_inches='tight')
    plt.close('all')

plot_fft_plus_power(time, signal)

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

傅立叶变换图(图片由作者提供)

def plot_wavelet(time, signal, scales, waveletname='cmor1.5-1.0', cmap=plt.cm.seismic, title='Wavelet Transform (Power Spectrum) of signal', ylabel='Period (years)', xlabel='Time', figname=None):
    dt = time[1] - time[0]
    [coefficients, frequencies] = pywt.cwt(signal, scales, waveletname, dt)
    power = (abs(coefficients)) ** 2
    period = 1\. / frequencies

    scale0 = 8
    numlevels = 10

    levels = [scale0]
    for ll in range(1, numlevels):
        scale0 *= 2
        levels.append(scale0)

    contourlevels = np.log2(levels)
    fig, ax = plt.subplots(figsize=(15, 10))
    im = ax.contourf(time, np.log2(period), np.log2(power),
                     contourlevels, extend='both', cmap=cmap)
    ax.set_title(title, fontsize=20)
    ax.set_ylabel(ylabel, fontsize=18)
    ax.set_xlabel(xlabel, fontsize=18)
    yticks = 2**np.arange(np.ceil(np.log2(period.min())),
                          np.ceil(np.log2(period.max())))
    ax.set_yticks(np.log2(yticks))
    ax.set_yticklabels(yticks)
    ax.invert_yaxis()
    ylim = ax.get_ylim()
    ax.set_ylim(ylim[0], -1)
    cbar_ax = fig.add_axes([0.95, 0.15, 0.03, 0.7])
    fig.colorbar(im, cax=cbar_ax, orientation="vertical")
    if not figname:
        plt.savefig('wavelet_{}.png'.format(waveletname),
                    dpi=300, bbox_inches='tight')
    else:
        plt.savefig(figname, dpi=300, bbox_inches='tight')
    plt.close('all')

plot_wavelet(time, signal, scales)

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

小波变换图(图片作者提供)

决赛成绩

对于 ENSO 数据集的分析[下图(a-d)],我们看到大部分功率集中在 2 到 8 年的周期内(或 0.125–0.5Hz)。我们可以看到,直到 1920 年,电力波动很大,而在那之后就没有那么多了。我们还可以看到,随着时间的推移,有一种从长到短的转变。对于印度季风数据集[下图(e-h)],虽然能量在不同时期均匀分布,但随着时间的推移,能量也从较长时期向较短时期略有转移。因此,小波变换有助于可视化信号的这种动态行为。

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

ENSO(a-d)和印度季风降雨(e-h)时间序列的小波分析
(a)和(e)分别显示了 ENSO 和印度季风的时间序列,单位为 C 和 mm。(b)和(f)显示傅立叶变换,©和(g)分别显示 ENSO 和印度季风的功率谱。(图片由作者提供)

参考

  1. 赵本峰、钟文伟、施志忠、谢永元(2014)。地球自转变化:小波分析。史前新纪元,第 26 卷第 4 期,第 260-264 页。https://doi.org/10.1111/ter.12094
  2. 弗兰克斯,L. E. (1969 年)。信号理论。
  3. 帕普利斯(1977 年)。信号分析(第 191 卷)。纽约麦格劳希尔公司。
  4. c .托伦斯和 G. P .康普公司(1998 年)。小波分析实用指南。美国气象学会通报,79(1),61–78。
  5. 小波变换(维基百科)

原载于 2021 年 4 月 5 日【https://www.earthinversion.com】

用谷歌 JAX 在 Python 中实现小波变换

原文:https://towardsdatascience.com/wavelet-transforms-in-python-with-google-jax-cfd7ca9a39c6?source=collection_archive---------5-----------------------

一个简单的数据压缩例子

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

来自 scikit-image 的草样本图像(左),作者进行的小波系数计算、压缩和重建

小波变换是信号分析的关键工具之一。它们广泛应用于科学和工程领域。一些特定的应用包括数据压缩、步态分析、信号/图像去噪、数字通信等。本文通过使用 CR-Sparse 库中提供的 DWT(离散小波变换)支持,关注一个简单的有损数据压缩应用程序。

有关小波变换的详细介绍,请参见:

Python 中的小波

Python 中有几个包支持小波变换。让我列举几个:

  • py wavelet是 python 中对离散和连续小波支持最全面的实现之一。
  • py torch-wavelet支持 2D 离散小波和 2d 双树复小波变换。
  • scipy 为连续小波变换提供了一些基本的支持。

PyWavelet 可能是可用的最成熟的库。它的覆盖面和性能都很棒。然而,该库的主要部分是用 c 编写的,因此,为 GPU 硬件实现重定向是不可能的。这也是人们想出更新的实现的原因之一,例如在 PyTorch 之上,py torch 提供了必要的 GPU 支持。

谷歌 JAX

CR-Sparse 库现在支持使用谷歌 JAX 库计算离散和连续小波变换。

JAX 通过利用 XLA 提供高性能数值计算。XLA 是一个特定领域的线性代数编译器。JAX 提供了一个类似 NumPy 的 API 和一个 JIT 编译器,这样使用 JAX 编写的代码可以很容易地被及时编译(使用 XLA)成特定硬件架构的机器代码。

因此,您可以在 JAX API 的基础上编写纯 Python 代码,并构建复杂的数值算法,这些算法可以高效地交叉编译到不同的 GPU 架构。

JAX 有像 pmap 这样的工具,它使得代码的并行评估变得简单明了。对于大型数据集,JAX 甚至在 CPU 上轻松胜过 NumPy。

然而,利用 JAX 确实需要一些工作。我们必须以某种方式编写我们的数值算法,以便它们可以被 JIT 编译。一个特定的需求是所有的代码都是使用函数式编程原则编写的。例如,JAX 数组是不可变的(而 NumPy 数组不是),所以对数组的任何更改实际上都在 Python 代码级别创建了一个新数组。XLA 编译器很聪明,可以重用内存。在某种程度上,以函数方式重写数值算法是一种非常有益的体验。它让您专注于基本的数学,避免不必要的全局状态操作,保持实现相当干净和简单。

CR-稀疏中的小波支持

CR-Sparse 专注于稀疏信号处理的功能模型和算法,即在信号处理问题中利用信号表示的稀疏性。小波变换是构造常见信号稀疏表示的关键工具。因此,它们构成了 CR-Sparse 库的重要部分。该实现是纯 Python,使用 JAX 遵循的函数式编程原则编写,并及时编译为 CPU/GPU/TPU 架构,无缝提供出色的性能。小波模块 API 受到py wavelet的启发并与之相似。此外,小波功能已经被包装成类似于 PyLops 的 1D 和 2D 线性算子。

请参考我以前的文章用谷歌 JAX 在 Python 中实现线性操作符以获得更多关于线性操作符设计的信息。

简单的小波数据压缩

分解和重构

小波变换是可逆的。

  • 我们可以使用小波分解信号,通过称为离散小波变换(DWT)的算法获得小波系数。信号被分解成两组系数:近似系数(信号的低通分量)和细节系数(高频。
  • 我们可以使用一种称为离散小波逆变换(IDWT)的算法从小波系数中重建信号。

多级分解

  • 通常,小波分解要进行多次。
  • 我们从信号开始,计算近似和细节系数,然后对近似系数再次应用 DWT。
  • 我们多次重复这一过程,以实现信号的多级分解。

以下示例显示了一个 4 级分解

X => [A1 D1] => [A2 D2 D1] => [A3 D3 D2 D1] => [A4 D4 D3 D2 D1]A1, D1 = DWT(X)
A2, D2 = DWT(A1)
A3, D3 = DWT(A2)
A4, D4 = DWT(A3)
  • 通过应用 DWT,信号 X 被分成近似和细节系数 A1 和 D1。如果信号有 N 个系数,那么分解将有 N/2 个近似系数和 N/2 个细节系数(从技术上讲,如果我们在计算 DWT 时使用周期化扩展,其他扩展会导致更多的系数)。
  • 通过应用 DWT,近似系数 A1 已经再次分裂成近似和细节系数 A2 和 D2。
  • 我们重复这个过程 2 次以上。
  • 通过连接 A4、D4、D3、D2、D1 中的系数来获得 X 的 4 级分解。
  • 如果信号 X 有 N 个样本,那么小波分解也将由 N 个系数组成。

信号的重建过程如下:

A3 = IDWT(A4, D4)
A2 = IDWT(A3, D3)
A1 = IDWT (A2, D2)
X = IDWT(A1, D1)

简单数据压缩

  • 结果表明,如果我们丢弃一些细节系数,信号仍然可以在相当高的信噪比下如实重建。
  • 如果我们去掉 D1 系数,我们可以实现 50%的压缩。如果我们降低 D1 和 D2 系数,我们可以实现 75%的压缩。

一个重要的考虑是在从剩余系数重构信号之后测量信噪比。如果压缩技术好,信噪比就会高。

这是对压缩问题的一种非常简单的处理方式,但它足以满足本文的目的。

我们现在展示使用 1D 和 2D 小波变换进行信号和图像压缩和重建的示例代码。详细的示例代码可以在示例库(在 CR-Sparse 文档中)这里找到。

此示例针对存储库中的最新版本运行,该版本可通过以下软件安装:

python -m pip install git+https://github.com/carnotresearch/cr-sparse.git

1D 信号分解、压缩、重建

第一,必要的进口。我们还需要 JAX,matplotlib 和 scikit-image 库。

**import** **jax.numpy** **as** **jnp**
**import** **matplotlib.pyplot** **as** **plt**
**import** **cr.sparse** **as** **crs**
**from** **cr.sparse** **import** lop
**from** **cr.sparse** **import** metrics
**import** **skimage.data**
**from** **cr.sparse.dsp** **import** time_values

在本例中,我们将构建一个由不同频率和幅度的多个正弦波组成的信号。

fs = 1000.
[T](https://docs.python.org/3/library/functions.html#int) = 2
t = time_values(fs, [T](https://docs.python.org/3/library/functions.html#int))
[n](https://docs.python.org/3/library/functions.html#int) = t.size
x = jnp.zeros([n](https://docs.python.org/3/library/functions.html#int))
freqs = [25, 7, 9]
amps = [1, -3, .8]
**for**  (f, amp) **in** zip(freqs, amps):
    sinusoid = amp * jnp.sin(2 * jnp.pi * f * t)
    x = x + sinusoid

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

正弦波混合样本(作者提供)

CR 稀疏线性算子模块(lop)包括 1D 小波变换算子。我们将构造操作符。我们将提供信号的大小、小波类型和分解的级数作为这个操作符的参数。

DWT_op = lop.dwt(n, wavelet='dmey', level=5)

通过对数据应用线性算子来计算小波系数。阅读这里的了解线性操作符如何在 CR-Sparse 中工作。

alpha = DWT_op.times(x)

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

信号的小波系数(由作者计算)

有趣的是,大部分细节系数可以忽略不计。小波系数的大小表示该系数携带的信号能量部分。丢弃这些系数不会导致很高的重建误差。

让我们去掉 10%的系数(压缩):

cutoff = [n](https://docs.python.org/3/library/functions.html#int) // 10
alpha2 = alpha.at[cutoff:].set(0)

出于我们的目的,我们只是将这些系数设置为 0。在数字通信设置中,这些系数不会被传输,并且会被接收器假定为零。我们还看到数组更新的语法有点困难。由于数组在 JAX 中是不可变的,因此 JAX 提供了通过更新旧数组的一部分来构造新数组的函数变体。详见此处

我们现在通过应用 DWT 线性算子的伴随算子(恰好是它的逆算子)从剩余的系数中重构原始信号。

x_rec = DWT_op.trans(alpha2)
snr = metrics.signal_noise_ratio(x, x_rec)
print(snr)

信噪比为 36.56 dB。

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

使用逆 DWT 完成重建(作者)

从这个图中我们可以看出,重建误差可以忽略不计。

2D 图像分解、压缩、重建

现在让我们在 2D 图像上试试运气。在这个演示中,我们将从 scikit-image 库中获取一个草地图像样本。

image = skimage.data.grass()

2D DWT 是 1D DWT 的直接扩展。

  • 给定大小为 NxN 的图像 X,计算每一列的 DWT。我们得到两个新图像 CA 和 CD,每个图像的大小为 N/2×N(即行数的一半)。
  • 对 CA 的每一行应用 DWT,以获得 CAA 和 CAD 图像(每个图像的大小为 N/2 x N/2)。
  • 对 CD 的每一行应用 DWT 以获得 CDA 和 CDD 图像。
  • 这样我们把 X 分割成[CAA,CAD,CDA,CDD] 4 个子图。
  • 我们可以组合这些子图像以形成单个系数图像。
  • 我们递归地在 CAA 部分上重复 2D DWT 分解,以计算多级分解。

2D IDWT 将[CAA,CAD,CDA,CDD]作为输入,并将 X 作为输出返回(首先对行应用 IDWT,然后对列应用 IDWT)。

我们将使用具有 5 级分解的 2D·哈尔小波变换算子。

DWT2_op = lop.dwt2D(image.shape, wavelet='haar', level=5)
DWT2_op = lop.jit(DWT2_op)

计算小波系数就是对图像应用线性算子:

coefs = DWT2_op.times(image)

让我们只保留 1/16 的系数(即只有 6.25%的系数)。我们将删除第一级和第二级细节系数。

h, w = coefs.shape
coefs2 = jnp.zeros_like(coefs)
coefs2 = coefs2.at[:h//4, :w//4].set(coefs[:h//4, :w//4])

重构包括应用恰好是其逆算子的伴随算子。重建后,我们将计算峰值信噪比来衡量重建的质量。

image_rec = DWT2_op.trans(coefs2)
# PSNR
psnr = metrics.peak_signal_noise_ratio(image, image_rec)
print(psnr)

PSNR 是 19.38 分贝。

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

作者仅使用 6.25%的小波系数进行图像重建(来自 scikit-image 的草地样本图像)

小波系数只有 6%的 19 dB PSNR 并不坏。此外,图像的细节得到很好的保留,没有块状伪像。

我希望这篇文章很好地介绍了 CR-Sparse 中可用的小波变换功能。

对于更高级的用法,请查看使用 LSQR 和 FISTA 算法的图像去模糊示例

OGRE(O-O Graphics Rendering Engine) 使用指南________________________________________________________________1 作者_________________________________________________________________________ 6 序____________________________________________________________________________7 教程的目的_________________________________________________________________ 7 读者要求___________________________________________________________________ 7 教程的由来_________________________________________________________________ 7 OGRE简介___________________________________________________________________ 8 OGRE特点_________________________________________________________________ 8 效率特性__________________________________________________________________8 平台和3D API 支持________________________________________________________ 8 网格Meshes_______________________________________________________________ 8 场景特性__________________________________________________________________9 特效______________________________________________________________________9 其它特性__________________________________________________________________9 OGRE中的模块_____________________________________________________________ 9 OgreMain 模块____________________________________________________________ 10 SDL 平台管理模块________________________________________________________ 11 Win32 平台管理模块_______________________________________________________11 BSP 场景管理_____________________________________________________________11 文件系统插件_____________________________________________________________11 GuiElement 插件__________________________________________________________ 11 OctreeSceneManager 插件___________________________________________________ 11 ParticleFX 插件___________________________________________________________ 12 Direct3D7 渲染系统插件____________________________________________________12 Direct3D8 渲染系统插件____________________________________________________12 SDL 渲染系统插件________________________________________________________ 12 3ds2oof 工具______________________________________________________________12 3Dstudio Max 导出器_______________________________________________________12 位图字体创建工具_________________________________________________________12 Milkshape3D 导出器_______________________________________________________ 12 Python 接口______________________________________________________________ 13 XML 转换器______________________________________________________________13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值