机器学习中的 ROC 曲线
曾经对 ROC 曲线的工作原理感到困惑吗?这可能会把一些碎片拼在一起。
二元分类的逻辑回归模型中的默认设置是将预测概率为 0.5 或更高的所有结果分类为 1。低于 0.5 的概率值被分类为 0。
如果我们可以把这个阈值设为 0.5,并增加或减少它,会怎么样呢?它将如何影响分类模型正确预测正面结果的能力?这些正是 ROC 曲线旨在以高度可解释的方式直观回答的问题。
ROC 曲线绘制在图表上,Y 轴为真阳性率(灵敏度), X 轴为假阳性率(1 -特异性)。对于从 0 到 1 的许多阈值,发现了 TPR 和 FPR 的值。这些值随后被绘制在图表上。我基于逻辑回归问题创建的基本 ROC 图如下所示:
解释:
这里的主要目的是在 ROC 曲线上找到一个点,在该点下的面积最大。这是因为在这一点上,模型可以正确地区分二进制类,它们之间的重叠最小。
休·哈维博士的一幅精美简洁的图像可以用来更好地理解这一点。
Harvey, H. (2019). [image] Available at: https://twitter.com/DrHughHarvey/status/1104435699095404544 [Accessed 18 Jul. 2019].
因此,随着 AUC 的增加,二元类之间的重叠减少。在那个特定的阈值点,模型可以最好地区分类别。以下列出了 ROC AUC 的一些重要要点:
- ROC AUC 为 0.5 表明阳性和阴性数据类别完全重叠,该模型基本上是无意义的,仅相当于简单的猜测
- ROC AUC 为 1 表示正负数据类别完全分离,模型尽可能高效。
- 你的 ROC AUC 越接近 1 越好。
最后总结一下,ROC 曲线是通过将我们的阈值从 0 变到 1 来为每个模型生成的。它最终帮助我们可视化灵敏度和特异性之间的权衡,并理解我们的数据类是如何分离的。
附加 cookie:
使用以下 python 代码可以很容易地找到 AUC 分数:
from sklearn.metrics import roc_auc_scoreroc_auc_score(‘Actual Values’, ‘Predicted Probabilities’)
ROC 曲线和有效前沿
解释如何用一点金融来解释 ROC 曲线
第一次看到一个 ROC 曲线(受试者工作特性),很迷茫。为什么数据科学家和统计学家对同一个事物有这么多的称呼(例如,回忆和敏感度是同一个事物,而敏感度和真实肯定率是同一个事物)?这条曲线到底想告诉我什么?
但是在思考和使用它们之后,我意识到 ROC 曲线基本上是你的模型的成本/收益曲线。更具体地说,ROC 曲线是金融市场有效前沿曲线的数据科学表亲。
有效边界
让我先戴上我的金融帽子。金融的核心概念之一是风险和回报之间的权衡——你的钱面临的风险越大,你就应该得到越多的补偿(通过更高的预期回报)。尽管风险的定义在很大程度上取决于你的性情和投资哲学,但潜在的直觉很有意义:如果你没有得到回报,为什么还要承担额外的风险?
As your risk increases, you should demand a higher expected return as compensation
虽然你可能不一定同意前一个图中资产的等级顺序,但它表达了这一点。然而,这并不是故事的全部。没有人只持有股票或债券的投资组合。我们持有多样化的投资资产组合。那么当我们开始投资股票、债券、黄金等时,风险和收益曲线会发生怎样的变化呢?在同一个投资组合中。也就是说,如果我们计算我们可能持有的所有投资组合的风险和回报值,然后将它们全部绘制在散点图上,风险和回报图会是什么样子?它看起来会像这样:
The Efficient Frontier
眼熟吗?它看起来就像一条 ROC 曲线!上图中的曲线,我们称之为有效边界,是投资世界的关键。它可能值得自己的一系列博客文章,但这里要注意的要点是:
- 蓝点代表的投资组合受曲线绿线(有效边界)上的投资组合支配。这意味着,一个理性的投资者永远不会想持有红线上的劣质投资组合,因为对于相同的风险,他可以在有效边界上获得更高的回报。对于一组给定的投资资产,只有一个有效边界。
- 为什么有效前沿线有曲线形状?因为承担更多风险的回报是递减的。在这一点上,我无法说得很清楚,但回报减少的原因是,随着你在风险曲线上越走越远(在 X 轴上向右移动),你的投资组合越来越集中在股票和其他风险资产上。这些风险资产高度相关,所以你开始失去投资组合多样化的好处。我们将在后面看到 ROC 曲线以类似的方式表现。
回到数据科学
那么,为什么要谈论金融和有效边界呢?这不是数据科学的帖子吗?这是因为当它影响我们的钱包时,成本和收益是最直接和最容易理解的。为什么有效边界有吸引力应该是显而易见的——沿着它的投资组合给你带来最大的投资回报。ROC 曲线的工作方式也是一样的——下方面积最大的曲线代表能给我们带来最大收益的模型。这个模型基本上就是你的数据科学有效前沿。
在 ROC 曲线的情况下,什么是收益(砰),什么是成本(美元)?让我们来看看实际的 ROC 曲线。
ROC is your model’s Cost vs. Benefit Curve
收益是你的模型的真实阳性率,成本是假阳性率(我稍后会用简单的英语解释这个,请耐心听我说)。就像投资组合风险和回报一样,我们希望找到一个模型,对于给定的假阳性率,该模型能给出最高的真阳性率。在上面的 ROC 曲线图中,random forest 的曲线下面积最高(0.847)。正如你所看到的,对于任何假阳性率,它都会产生最高的真阳性率(只需将手指放在 X 轴上的任意一点,然后垂直向上移动;你穿过的最后一条线是给你最大爆炸的模型)。曲线下的区域全面总结了模型在不同成本水平上的性价比。
混乱矩阵
现在让我们用一个例子来解释成本和收益的含义。在二进制分类问题中,我们试图将观察结果分为两组,如好投资对*坏投资。*下面的 2 乘 2 矩阵(称为混淆矩阵)显示了一个简单的股票预测模型的结果,该模型试图猜测股票在未来 12 个月内是上涨还是下跌(数据是虚构的,仅供说明)。
We are trying to predict whether a stock will go up or not over the next 12 months
红色的数字代表不正确的预测,而绿色的数字代表正确的预测。ROC 曲线很酷的一点是,它在一个图表中捕捉了所有这四个数字,并直观地显示了它们之间的权衡。
轰动/好处
让我们先计算一下我们的收益(真实阳性率):
真阳性率= 30 / (10 + 30) = 75%
那 75%是什么意思?总共有 30 + 10 = 40 个好的投资,我们正确地预测并利用了其中的 30 个,或 75%。还不错!尽管真正的正回报率是我们模型的优势,但请注意,它的计算包括了我们错误预测为不良投资的 10 只股票(预测=不良,实际=良好)。因此,真正的正利率(我们的 bang)是一个既包括我们的正确预测,也包括我们的机会成本(当它实际上是一只好股票时不投资的结果)的数字。
机会成本一点都不好玩,那么我们该如何降低它呢?在之前的 ROC 曲线中,看橙色线(朴素贝叶斯)。如果我们愿意承担最大成本(大约 100%的假阳性率),预测一切都是好的投资,会发生什么?在这种情况下,你抓住了每一个好的投资,但却招致了巨大的成本。
还要注意,在上面的 ROC 曲线示例中,随机森林能够将机会成本降低到几乎为零,而朴素贝叶斯却无法在不导致最大成本的情况下做到这一点。一般来说,我们总是不得不接受至少一些错过的机会。最后,注意 ROC 曲线展示了与有效前沿相同的收益递减。这意味着每一次减少错失机会的尝试都会让你付出更多的代价。
美元/成本
在减少错过的机会(也称为假阴性)和增加我们模型的假阳性率(成本)之间有一个权衡。让我们先计算一下上一个例子的成本:
假阳性率= 20 / (40 + 20) = 33%
这意味着有 40 + 20 = 60 个不良投资,不幸的是,我们被其中的 20 个,或者 33%困住了。在我们的例子中,这些是真正的负成本,而不仅仅是错过的机会。我们投资了,损失了 20 倍,哎哟!
让我们更深入地研究 ROC 曲线所代表的成本与收益的权衡。假设我的模型有真实的信号(它不只是产生随机噪声),我可以使用一个概率阈值来调整它打开的频率。例如,如果我将阈值设置为 90%(只有当模型给出 90%或更高的概率时,才预测一个好的投资),它几乎永远不会开启——但当它开启时,我们会期望更多的时候赚钱。
另一方面,如果我将阈值设置为 10%,我们的模型将一直开启。我们会投资大量的股票,但更多的股票(相对于 90%门槛的情况)是赔钱的。这些赔钱的人是假阳性,我们在追求尽可能多的好投资(真阳性)的过程中付出的代价。
把这一切联系在一起
如何适当地调整您的模型的阈值是另一天的主题。这在很大程度上取决于你的模型的个体特征,假阳性和假阴性的平均成本,等等…
但我希望大家从所有这些中吸取的一个关键点是,每个分类模型都可以在以下两者之间进行权衡:
- 机会成本:你的模型预测的收益/真阳性率越高,你错过的机会就越少,你的机会成本就越低。但是,当你降低机会成本时,你最终会撒下更大的网,随着更多真正的积极因素,你也会捕捉到更多…
- 误报:较高的误报率意味着你的模型采取更多的行动,但也更容易出错。这些误报就是你产生的成本。
ROC 曲线是特定模型如何有效地权衡成本和收益的可视化。这就是为什么曲线下面积最大的模型,如有效边界模型,在以产生的成本提供最大收益方面优于其他模型。
摇摆命令行
节省您时间的 21 个 Bash 命令
本文是对 Bash 命令的简单介绍。知道如何在命令行中移动是节省时间的一项基本技能。我们将讨论 21 个最常见的命令及其关键标志。我们还将介绍 Bash 快捷方式,为您节省大量的击键次数。⌨️
A shell
条款
术语 Unix 、 Linux 、 Bash 、 shell 、*命令行、终端、*和 shell 脚本是不同的东西,但是它们共享我们将讨论的命令。这里有一个差异和相似之处的快速分析。
Unix 是贝尔实验室在 20 世纪 70 年代开发的一种流行的计算机操作系统。它不是开源的。
Linux 是最流行的 Unix 衍生品。它运行着世界上大量类似计算机的设备。
你的 终端 是让你进入操作系统的模拟器程序。您可以同时打开多个终端窗口。
shell 语言用于向底层操作系统发送命令。
Bash 代表*伯恩再次脱壳。*它是最常见的与操作系统通信的 shell 语言。这也是 macOS 的默认外壳。要了解更多关于支持 Linux 和 Bash 的开源基金会的信息,请查看本文。
命令行界面 (CLI) 是指基于键盘输入的界面,在这里输入命令。通常,它用于实时信息和文件操作。将 CLI 与通常使用鼠标的图形用户界面(GUI)进行对比。CLI 通常被称为命令行。
脚本 指的是包含一系列 shell 命令的小程序。脚本被写入文件,可以重用。您可以在脚本中创建变量、条件语句、循环、函数等等。
唷。明白了吗?我们下面讨论的命令适用于上面所有斜体的术语。我会交替使用 Bash 、 shell 和命令行。
另请注意:我交替使用目录和文件夹。这两个术语的意思是一样的。
标准输入/输出流是标准输入( stdin )、标准输出( stdout )和标准误差( stderror ) *。他们会突然冒出一大堆。当我使用术语 *print 时,我指的是打印到 stdout,而不是打印机。
最后,将下面前缀为 my _ whatever 的命令替换为 your whatever。😄
事不宜迟,下面是我们将在本文中讨论的命令列表。
21 大 Bash 命令
获取信息
**man**
:打印一个命令的手册(帮助)
**pwd**
:打印工作目录
**ls**
:列出目录内容
**ps**
:查看正在运行的进程
操作
**cd**
:更改工作目录
**touch**
:创建文件
**mkdir**
:创建目录
**cp**
:复制
**mv**
:移动或重命名
**ln**
:链接
重定向和管道
**<**
:重定向标准输入
**>**
:重定向标准输出
**|**
:将一个命令的内容传送到下一个命令
阅读
**head**
: 读取文件的开头
**tail**
: 读取文件的结尾
**cat**
:读取一个文件或者连接文件
结束
**rm**
:删除
**kill**
: 结束一个流程
搜索
**grep**
:搜索
**ag**
:搜索
档案馆
**tar**
:将多个文件合并成一个文件
让我们开始吧!
前 21 条命令解释
首先让我们看看以 stdout 形式返回信息的命令,这意味着标准输出。一般情况下, stdout 会写到你的终端。
获取信息
**man command_name**
:打印命令手册。就像帮助一样。
**pwd**
:打印当前工作目录的文件路径。您经常需要知道自己在文件系统中的位置。
**ls**
:列出目录内容。另一个超级常用命令。
ls -a
:也用-a
列出隐藏文件。
ls -l
:使用-l
查看文件的更多信息。
注意标志可以这样组合:ls -al
。
**ps**
:查看正在运行的流程。
ps -e
: 用-e
打印所有正在运行的进程,而不仅仅是与当前用户 shell 关联的进程。这通常是你想要的。
操作
**cd my_directory**
:将工作目录更改为我的 _ 目录。使用 my_directory 的相对路径../
在目录树中上移一级。
CD
**touch my_file**
:在指定的路径位置创建 my_file 。
**mkdir my_directory**
:在指定的路径位置创建 my_directory 。
**mv my_file target_directory**
:将我的文件移动到目标目录。
mv
也可用于重命名文件或文件夹,如下所示:
mv my_old_file_name.jpg my_new_file_name.jpg
**cp my_source_file target_directory**
:将源文件复制一份,放入目标目录。
**ln -s my_source_file my_target_file**
:用符号链接将我的目标文件链接到我的源文件。
当 my_source_file 的内容更新时, my_target_file 的内容会自动更新。如果我的目标文件的内容被更新,那么我的源文件的内容也被更新。酷毙了。
如果 my_source_file 被删除,那么*my _ target _ file’*的内容被删除,但是文件继续存在。只是一个空文件。
如果 my_target_file 被删除, my_source_file 继续存在,其内容保持不变。
-s
标志也允许你链接目录。
-
- 2019 年 4 月 12 日更新,纠正并澄清 ln -s 和 mv 行为。感谢杰森·沃尔沃克。**
现在让我们看看输出重定向和管道是如何工作的。
重定向和管道
**my_command < my_file**
:将 stdin 重定向到 my_file 。当 my_command 需要用户输入来执行某项操作时非常有用。
**my_text > my_file**
:将 stdout 重定向到 my_file 。创建 my_file 如果它不存在。覆盖 my_file 如果它确实存在。
例如ls > my_folder_contents.txt
创建一个文本文件,列出你的工作目录的内容。
使用 double >>
将 stdout 附加到 my_file 而不是覆盖它。
现在我们来看看管道命令。
Pipe the result of one command to the other
**first_command | second_command**
:管道符|用于将一个命令的结果发送给另一个命令。管道左侧命令的 stdout 被传递给管道右侧命令的 stdin。
“一切都是管道”是 Unix 中的一句口头禅——因此几乎任何有效的命令都可以通过管道传输。
用管道链接命令会创建一个管道。多个管道可以像这样连接在一起:
first_command | second_command | third_command
Pipeline
请注意,管道并行执行所有命令。这种行为偶尔会导致意想不到的结果。点击阅读更多。
说到读取,我们来看看从命令行怎么做。
阅读
**head my_file**
:读取 my_file 的前几行。也可以读取其他 stdin。
**tail my_file**
: 读我的 _ 文件的最后几行。也可以读取其他 stdin。
Head at the front, tail at the back.
如果您是使用 pandas 的数据科学家,那么最后两个命令应该听起来很熟悉。如果不是,头尾尾都是映射得比较好的隐喻,应该不会太难记。
让我们看看另一种读取文件的方法。
cat
根据传递的文件数量,打印一个文件或连接多个文件。
cat
**cat my_one_file.txt**
:一个文件,cat
将内容打印到 stdout。
当您给 cat 命令两个或更多文件时,它的行为会有所不同。
cat my_file1.txt my_file2.txt
:对于两个或更多的文件,cat
con cat 将文件的内容合并在一起,并将输出打印到 stdout。
如果您想将连接的文件保存为一个新文件,使用>
写操作符,如下所示:
cat my_file1.txt my_file2.txt > my_new_file.txt
现在我们来看看移除和结束事物。
结束
**rm my_file**
:从你的文件系统中删除 my_file 。
rm -r my_folder
:删除 my_folder 以及 my_folder 中的所有文件和子文件夹。-r
用于递归。
如果不想每次删除都有确认提示,请添加-f
。
**kill 012345**
: 通过给它时间关闭来优雅地结束指定的运行进程。
**kill -9 012345**
: 立即强制结束指定的运行过程。-s SIGKILL
与-9
意思相同。
搜索
接下来的几个命令——grep
、ag
和ack
——用于搜索。Grep 是古老的、值得信赖的兄弟——可靠,但是速度较慢,用户友好性稍差。
Get a grep!
**grep my_regex my_file**
:在 my_file 中搜索 my_term 。为每个匹配返回文件的整行。 my_term 默认为正则表达式。
grep -i my_regex my_file
: -i
使搜索不区分大小写。
grep -v my_regex my_file
:返回所有不包含 my_term 的行。-v
返回逆,像很多语言中的不是。
grep -c my_regex my_file
: 用-c
返回找到匹配的次数。
grep -R my_regex my_folder
:用-R
递归搜索文件夹和所有子文件夹中的所有文件。
现在让我们转向Ag——grep更年轻、更快、更帅的兄弟姐妹。
Get it?
如果您运行以下命令并发现您的机器上没有 ag ,请参见此处的安装说明。在装有自制软件的 Mac 上运行brew install the_silver_searcher
。(更新于 2019 年 8 月)。
**ag my_regex my_file**
:返回行号和任何匹配的行。
ag -i my_regex my_file
: -i
为不区分大小写。
Ag 自动读取你的*。gitignore* 文件并排除任何匹配文件或文件夹的结果。相当酷!
ag my_regex my_file–skip-vcs-ignores
:用–skip-vcs-ignores
覆盖自动版本控制系统文件读取。
也可以做一个*。忽略文件,从标签*中排除文件路径。
第三个同胞是 Ack 。Ag 和 Ack几乎是同卵双胞胎——他们 99%可以互换。Ag 更快,所以我会坚持使用它。
档案馆
现在让我们看看如何制作 tarball 档案。
**tar my_source_directory**
:将源目录下的多个文件合并成一个 tarball 文件。此命令对于分发其他人将下载的文件很有用。
tar
一个 tarball 有*。tar* 文件扩展名,代表磁带存档。磁带告诉你这个命令有多老了!
tar -cf my_file.tar my_source_directory
:用 my_source_directory 的内容创建一个名为 my_file.tar 的 tarball 文件。-c
用于创建,-f
用于文件。
用-xf
提取一个 tar 文件。-x
用于提取,-f
用于归档。
tar -xf my_file.tar
将 my_file.tar 中的文件展开到当前工作目录。
现在让我们来看看拉链和解压*。tar* 文件。
tar -cfz my_file.tar.gz my_source_directory
使用 gzip 压缩文件。-c
表示创建,-f
表示文件,-z
表示压缩。Gzip 为文件的消费者节省了空间和下载时间。
通过在我们之前看到的提取命令中添加-z
标志来解压缩.tar.gz
文件。
tar -xfz my_file.tar.gz
。-x
为提取,-f
为文件,-z
为压缩。
tar 有很多其他的标志可以使用。
Bash 别名
创建 Bash 别名来保存您在终端中的击键。然后你可以做类似于键入bu
而不是python setup.py sdist bdist_wheel
的事情。
只需在您的~/.bash_profile
中添加以下内容:
alias bu="python setup.py sdist bdist_wheel"
如果你没有一个~/.bash_profile
文件,你可以从命令行用touch
命令创建一个。
然后重启你的终端,用两次击键构建你的 Python 包。没有比输入 2 个字母而不是 44 个字母更好的了。😃
添加您喜欢的任何其他别名,并观察您的生产力增长。🌴
让我们回顾一下我们已经讲过的内容。
回顾:21 个 Bash 命令
获取信息
**man**
:打印命令
的手册(帮助)**pwd**
:打印工作目录
**ls**
:列出目录内容
**ps**
:查看正在运行的进程
操作
**cd**
:更改工作目录
**touch**
:创建文件
**mkdir**
:创建目录
**cp**
:复制
**mv**
:移动或重命名
**ln**
:链接
重定向和管道
**<**
:重定向标准输入
**>**
:重定向标准输出
**|**
:将一个命令的内容管道化到下一个命令
阅读
**head**
: 读取文件的开头
**tail**
: 读取文件的结尾
**cat**
:读取文件或连接文件
结束
**rm**
:删除
**kill**
: 结束一个流程
搜索
**grep**
:搜索
**ag**
:搜索
档案馆
**tar**
:将多个文件合并成一个文件
包装
在本文中,您已经看到了 21 个最常见的 shell 命令。如果你还有一个你认为应该上榜的,请在 Twitter @discdiver 上告诉我。
您还看到了如何创建 Bash 别名来节省时间。
如果您想深入了解,这里有一些资源:
- 征服命令行是马克·贝茨的一本很棒的免费电子书。
学习掌握和征服最有价值和最有用的命令行工具,用于基于 Unix 和 Linux 的系统。在这个…
conqueringthecommandline.com](http://conqueringthecommandline.com/book/basics)
- 来自 gnu.org 的官方 Bash 文档在这里。
Sed
和Awk
听起来像是两兄弟,但它们实际上是 Bash 中常见的文本处理实用程序。在这里了解更多关于他们的。cURL
—读作“curl”——用于通过 url 和测试服务器传输数据。点击了解更多。- 如果你想学习如何把这些命令和其他 Bash 代码放到脚本中,这里有一个很好的指南。
- 这里有一个关于 Bash 脚本的大备忘单。
像任何语言一样,学习 Bash 需要练习。用它来提高你的工作效率,并享受把它教给别人的乐趣。😄
我写了如何使用编程和数据科学工具,如 Docker、Git 和 Python。如果你对此感兴趣,在这里阅读更多和关注我。👏
炮轰快乐!
火箭(数据)科学
过去几年,中东集团相当吵闹。作为一个被许多敌人包围的小国,以色列一直处于冲突之中。简言之(根据以色列外交部的说法):
来自东北——因“隔壁”叙利亚战争引发的边境事件
来自北方——来自黎巴嫩边境的真主党威胁
来自南方——ISIS 在埃及边境附近的敌对活动
来自西方——伊斯兰圣战组织/哈马斯试图从加沙地带发动恐怖袭击
来自东部——朱迪亚和萨马拉暴力再起
据谷歌称,自 2001 年以来,巴勒斯坦武装分子从加沙地带向以色列发动了数千次火箭/迫击炮袭击,作为持续的巴以冲突的一部分。
如果你在以色列生活了几个月以上,你很可能熟悉臭名昭著的警报“红色代码”(希伯来语:צבע אדום),这意味着由于火箭发射,人们必须立即找到避难所。
撇开政治不谈,我认为尝试对火箭发射进行可视化建模(通过使用警报日志)可能是一个很酷的项目,由于我在以前的文章中被多次问到,我决定尝试并详细说明我在处理这样一个项目时使用的方法和工具。
A 部分—获取相关数据
第一步是在谷歌上搜索以色列警报的某种“记录”数据。
上面提到的搜索引导我进入“Home Front Command”网站,在那里我可以查询以色列过去的警报:
Home Front Command’s site
结果产生了一长串过去的警报:
Small portion of the data
就我个人而言,我更喜欢使用纯文本/表格数据,快速浏览 Chrome 的 DevTools 可以发现查询请求/响应的 API(这只是使用搜索按钮时“在幕后”发出的网络请求),这使得可以立即获取纯文本答案:
The query URL
The website’s text response
总之,我提取了从 2014 年 7 月(可用的较早日期)到 2019 年 5 月的警报历史。
B 部分—丰富数据
首先,原始数据没有指定确切的位置,而只是“区号”(由于历史和技术原因),所以我必须以某种方式构建“区号到城市列表转换器”。
尽管没有公开的“字典”来记录后方司令部的代号,但谷歌搜索发现,每个代号在维基百科上都有一个独特的页面,囊括了该地区城市的完整列表:
Google search results show a re-occurring pattern of Wikipedia page per area code
因此,使用一个简短的 Python 脚本使我能够获得每个区域的城市列表(没什么特别的,使用 GET request per area,并提取页面主体中的所有 URL 名称)。
第二,我不得不分解数据集,以使每个警报作为一个独特的行出现在对等城市,这样它就可以在以后作为独立的数据呈现。
最后,我使用开源的地理 API 将城市名称转换成 GPS 坐标。
总而言之——这是数据经历的过程:
The procedure — visually
C 部分—数据清理/完整性
在这一部分中,我必须进行一些合理性检查,包括:
1.手动修复错误刮取的值——因为刮取永远不会完美。
2.手动修复不可能的 GPS 坐标-由于模糊的城市名称,一些城市似乎不在以色列境内。
3.删除不相关的数据-警报系统测试或国家危机演习等事件也包含在数据集中,因此特定的时间/日期被删除(它们很容易过滤掉,因为它们总是在特定的月份在所有城市同时发生)。
4.标记不适用数据—例如由于缺乏维基百科/谷歌中的信息,一些地区无法翻译成城市列表——不幸的是,这些数据没有出现在项目中。
D 部分—可视化数据
我第一个也是最喜欢的可视化聚合工具是 Tableau,使用这个工具可以非常容易地呈现数据:
Heat map of “Code Red” alarms over the past 5 years
Heat map of “Code Red” alarms per month (interesting to notice the increase during summer periods of July-August, the Israeli summer)
Full Heat map of “Code Red” alarms per distinct months. note: data is available only from July 2014
除此之外,一个朋友向我介绍了一个神奇的开源工具,叫做开普勒,用于地理空间数据,在其中你可以看到数据的动画,甚至可以自己重塑它:
Top siren activity
(note when exploring the animated data: while the launch destination is an exact GPS coordinate, the launch source was added only for aesthetic purposes and it is not accurate)
bird’s eye view of alarms in the past 5 years
你也可以在下面的链接中使用这些数据,自己制作其他很酷的动画:
Kepler.gl 是一个强大的基于网络的地理空间数据分析工具。基于高性能渲染引擎和…
开普勒](https://kepler.gl/demo/map?mapUrl=https://dl.dropboxusercontent.com/s/ynd93swqccgnebr/keplergl_gxj4nuk.json)
E 部分——留在上下文中
这一部分与数据无关,我只是想利用这个平台来强调,即使一些数据可能看起来很迷人/美丽,但人们永远不要忘记背后的故事。在这种情况下,尽管我很喜欢这个项目,但我希望这些数据一开始就不存在。
希望你觉得这篇文章有趣/有用,一如既往地欢迎你的反馈。
火箭 vs 裁判?
NBA 季后赛即将来临,每个人都很高兴看到联盟的巨头们为赢得梦寐以求的冠军而对决。在东部联盟,扬尼斯·阿德托昆博和密尔沃基雄鹿队希望横扫科怀·伦纳德和多伦多猛龙队。在勇士队在第六场比赛中主场击败休斯顿火箭队后,金州勇士队现在发现自己处于横扫波特兰开拓者队的位置。
在整个系列赛中,詹姆斯·哈登表达了他的沮丧,尤其是在第一场比赛后的采访中。
“我是说,我只是想要一个公平的机会,伙计,”
他认为裁判让他输掉了系列赛的第一场比赛。他并不孤单,因为粉丝们也有同感。他们的抗议有一定的合理性吗?
2015 年,NBA 实施了最后两分钟报告。它详细记录了裁判在比赛最后两分钟做出的每个决定。通常在比赛后一天发布,一份报告详细说明了裁判在比赛最后两分钟内必须做出的每一个决定。在汇总了系列赛中的每一份报告(除了第六场比赛,因为 NBA 没有发布它)后,我们可以看到裁判在比赛的最后阶段有多准确。
这些报告将呼叫分为以下类别:
错误呼叫(IC):进行了错误呼叫
不正确的非通话(INC):应该打电话但没有打
正确的呼叫(CC):做出了正确的呼叫
纠正不判罚(CNC):裁判没有判罚是正确的
这个系列是这样分解的:
总的来看,裁判在最后时刻要做出 136 个判罚。在被要求做出决定的次数中,只有 16 次是错误的。这意味着在整个系列赛中,裁判 88%的时间都是正确的。
对于每一种叫牌类型,报告都会分配一个承诺玩家/球队和一个劣势玩家/球队。当我们看数据时,我们看到火箭的犯规几乎是勇士的两倍(13 次对勇士的 7 次)。火箭犯规更多,但他们应该得到判罚,所以说裁判作弊或有偏见是不公平的。
好吧,火箭犯规更多,所以他们应该为他们的失败负责,对吗?让我们先深入一点。
到目前为止,我们只分析了正确的调用。我们的目标是考虑可能显示偏见的呼叫。
正确的判断(顾名思义)是正确的,因此不能用来确定偏见。在这些情况下,正确的呼叫是应该的,因此我们无法确定恶意意图。
相反,查看不正确的电话可能能够说明问题。
不正确的吹罚可能是裁判对情况视而不见,而不正确的吹罚可能表明裁判在积极帮助球队获胜。
确定了衡量偏差的最佳方法后,我们可以查看数据,看看裁判的表现如何。
看起来犯规判罚并没有偏袒一方。在 16 次不正确的吹/不吹中,每个队有 8 次处于劣势。因此,尽管裁判 88%的时候都是正确的,但他们对两队来说都是同样错误的。
在第一场比赛后,金州勇士队的德雷蒙德·格林指出,
“我想我们可以在每场比赛后都坐在这里抱怨裁判的判罚。这就是我们玩的游戏的本质。裁判是一门不精确的科学。原来如此。”
德雷蒙德·格林可能是对的,但正如证据所表明的,裁判可能不是这次的问题。
数据科学在人工智能中的作用
电子表格的时代已经结束。谷歌搜索,护照扫描,你的网上购物记录,一条微博。所有这些都包含可以收集、分析和货币化的数据。超级计算机和算法使我们能够实时理解越来越多信息。在不到 10 年的时间里,CPU 有望达到人脑的处理能力。
随着大数据和快速计算能力的兴起,许多组织的首席执行官、首席技术官和决策者都在想办法创新他们的公司。当他们想要推出新产品或服务时,他们希望通过数据分析来洞察市场、需求和目标人群等。人工智能和机器学习正在快速被企业采用。这一趋势很可能会上升。
让我们来看一些统计数据:
根据 IDC 的数据,2018 年全球在人工智能和认知技术上的支出将达到 191 亿美元,比一年前增长 54.2%。到 2021 年,人工智能和认知支出将达到 522 亿美元。
人工智能技能是 LinkedIn 上增长最快的技能之一,从 2015 年到 2017 年增长了 190%。
当我们谈论“人工智能技能”时,我们指的是创造人工智能技术所需的技能,包括诸如神经网络、深度学习和**机器学习、**等领域的专业知识,以及实际的“工具”,如 Weka 和 Scikit-Learn。
招聘:人工智能专家
在人工智能领域,职位空缺比求职者上升得更快。
AI-related jobs include machine learning engineer, predictive modeler, cmt analytics manager, data scientist, computer vision engineer, computational linguist, and information strategy manager.
Source: Indeed.com
没有什么能减缓人工智能的传播。科技公司正在大力投资 it,普华永道的一份报告估计,到 2030 年,人工智能可以为全球经济增加 15.7 万亿美元——并推动北美的 GDP 增长 14%。
也许机器学习最引人注目的方面是它看似无限的适用性。已经有很多领域受到 ML 和现在 AI 的影响,包括教育、金融等等。机器学习技术已经应用于医疗保健领域的关键领域,影响了从减少护理差异到医学扫描分析的方方面面。
AI 到底是什么?
人工智能是“貌似智能的算法”的一般领域,目前机器学习是该领域的前沿。
随着时间的推移,我们对人工智能的定义发生了变化。从 1939 年的智能机器人开始,我们已经走了很长一段路,如下图所示。
Source: 1939 I AM A SMART FELLOW ROBOT TALKS Stock Footage
人工智能只是一台能够模仿或模拟人类思维或行为的计算机。其中,有一个子集叫做机器学习,它现在是人工智能最令人兴奋的部分的基础。通过允许计算机学习如何自己解决问题,机器学习取得了一系列突破,这些突破一度似乎几乎不可能。这就是电脑可以在照片中认出朋友的脸或者驾驶汽车的原因。这就是人们积极谈论类人人工智能到来的原因。
A simplified explanation of AI, Machine Learning, and Data Science. Source: Suraj Jena, June 10, 2018
那么,机器学习和数据科学是如何交叉的呢?
机器学习是人工智能的一个分支,其中一类数据驱动的算法使软件应用程序能够高度准确地预测结果,而不需要任何显式编程。
这里的基本前提是开发能够接收输入数据并利用统计模型预测输出的算法,同时随着新数据的出现更新输出。
所涉及的过程与预测建模和数据挖掘有许多共同之处。这是因为这两种方法都需要搜索数据来识别模式并相应地调整程序。
我们大多数人都以这样或那样的形式体验过机器学习。如果你在亚马逊上购物,或者在网飞上看了一些东西,这些个性化的(产品或电影)推荐就是机器学习在起作用。
另一方面,数据科学采用数学和统计学等计算机科学学科,并融合了数据挖掘、聚类分析、可视化以及机器学习等技术。
因此,两者之间的主要区别在于,作为一个更广泛的术语,数据科学不仅关注算法和统计,还关注整个数据处理方法。
机器学习是人工智能的一个子集。虽然数据科学是从数据中提取知识或见解的跨学科领域
VENN diagram of AI, Big Data and Data Science Fraunhofer FOKUS
人工智能技术中如何使用数据科学领域的例子
IBM Watson 是一项人工智能技术,可以帮助医生快速识别患者病历中的关键信息,以提供相关证据并探索治疗方案。它接受患者的医疗记录,然后根据来自 300 多种期刊、200 多本教科书和 15 多页文本的信息提供基于证据的个性化建议,这使医生可以即时访问大量针对患者治疗计划的个性化信息。
蓝莓。这个机器人在被喂以成千上万部电影的字幕后,可以表演即兴喜剧。科里·马修森,埃德蒙顿阿尔伯塔大学的人工智能研究员,创造了一种算法,旨在与他在舞台上即兴表演。他训练它创造用于即兴表演的对话线,当对话有意义时奖励它,当它吐出胡言乱语时惩罚它。
虽然蓝莓不会很快在第二城市试镜,但这个可爱的机器人偶尔会用有趣的台词击中要害。我将展示一个蓝莓的短片作为结束。
Kory Mathewson, inventor of Blueberry. Video Credit: Bloomberg, Hello World, Is AI Ready for Improv Comedy
参考文献:
“随着公司拥抱人工智能,这是一个求职者的市场”,Ann Saphir,2018 年 10 月 15 日
“人工智能能否取代数据科学家?”佩德罗·乌里亚-雷西奥,2018 年 9 月 14 日
“AI 准备好即兴喜剧了吗”,彭博商业周刊,《你好世界》第一季第 16 集,2018 年 6 月 11 日
"专家谈:数据科学 vs .数据分析 vs .机器学习",Sarihari Sasikumar,2018 年 10 月 18 日
“ I .将‘G’放在‘AI’中:人工智能(狭义/应用)中使用的术语概述——以及它们彼此的意义”,Suraj Jena,2018 年 6 月 10 日
“媒体领域的人工智能和机器学习”,弗劳恩霍克·福库斯
“人工智能通过生产力和个性化改进推动 GDP 增长 15.7 万亿美元”,普华永道出版社,2017 年 6 月 27 日
"根据 IDC 2018 年 3 月 22 日发布的新支出指南,到 2018 年,全球在认知和人工智能系统上的支出将增长至 191 亿美元
“领英 2018 新兴工作报告”,领英,2018 年 12 月 13 日
机器学习在重新定义零售银行业务中的作用
Photo by Sean Pollock on Unsplash
随着高级分析算法在核心银行日常业务中的广泛应用,银行业正在经历一场转型之旅。通过各种渠道获取客户、现有的客户参与度、预测信用卡或贷款申请的违约者等等,这些都是分析做了大量工作的几个领域。我将解释一些我过去在一家领先的跨国银行的高级分析团队工作的经历,在那里我们使用了一些来自分析和机器学习的有趣概念来解决复杂的业务问题。
顾客就是上帝(或者是这样?)
跟踪上帝是不可能的,但你可以借助先进的分析算法来跟踪你的潜在客户。银行可以提供有关他们购买模式、人口统计、交易、服务请求等的大量信息。这被有效地用于预测顾客购买特定产品的倾向。在分析部门工作时,我与许多销售团队合作,他们需要一份潜在未来客户的排序列表,用于直接邮件/电话营销活动。这些活动通常包含针对该产品的有吸引力的优惠,如信用卡的低利率、储蓄账户的高利率等。这是由于相信来自排名列表的大量顾客将准备购买该产品,而不是随机联系的顾客。不仅预测了产品的潜在客户,还预测了哪些客户打算关闭他们的账户(客户流失)。
逻辑回归等数据科学算法在预测客户购买倾向概率或客户流失概率方面表现出色。例如,考虑以下现实生活中的业务问题:
一家领先的跨国银行希望制定一项战略,以遏制其储蓄账户产品不断增加的客户流失。他们联系高级分析部门,通过预测他们中的哪一个有关闭账户的倾向来帮助他们留住最好的客户,以便他们可以与他们联系,并提供有吸引力的交易来继续他们的宝贵关系。
高级分析团队首先缩小问题范围并定义损耗,例如,客户取出他们的存款,关闭他们的储蓄账户,并且不将他们的钱再投资于同一家银行提供的另一种产品。企业希望提前 3 个月预测流失,以便有足够的时间来设计保留策略。
然后,团队继续收集所需的数据,这通常会占用项目的大部分时间,例如收集哪些数据、收集多长时间、需要哪些额外数据等问题。是非常关键的要求。一旦舞台设置好,数据科学家就要执行他们的最后一步——机器学习。这些算法将读取数据,并根据之前的账户关闭情况,找出导致流失行为的模式。然后,它将利用当前场景中新的可用客户信息,预测流失的可能性。
我遇到了一个令人震惊的项目,预测 10 年后客户购买零售银行产品的倾向!猜猜这些算法的驱动特征是什么?—在商业社交媒体网站上追踪的当前教育背景和成就有助于了解这个人将来想把钱投到哪里。
自然语言处理算法(如零售银行中的朴素贝叶斯分类器)的一个非常有趣的用途是分析交易。每笔交易都有一个代码和一个简短的描述。数据科学家使用语言解析从生成的海量文本中提取关键词或标记,以通读描述并发现更多关于交易的信息。它可以识别您是否在零售店购买过产品,是否向您持有的另一个银行账户转账,或者是否支付了另一家银行的信用卡账单。然后,可以将交易与您如何评价您当前与银行的关系联系起来,企业可以根据这些重要信息决定各种客户拓展策略。
他们看到什么就买什么
根据经济学定律,选择会宠坏我们。摆在顾客面前的选择越多,他们就变得越困惑,不购买该产品的可能性就越大。利用硬核机器学习算法的一个非常利基的领域是有针对性的数字营销,零售银行业务不断利用这一点来识别和抓住访问网站的潜在客户,方法是显示定制的 web 内容,以满足访问者的需求并提供他们正在寻找的产品。企业如何知道客户想要什么?数字足迹!
数以百万计的网站访问者生成数千千兆字节的数据,这些数据包含的信息包括:他们来自什么渠道,银行网站上最常见的登录页面是哪个,他们浏览了哪些页面,他们花了多少时间阅读内容,他们每天或每周进行了多少次独特的访问,等等。这些数据被称为网站访问者的数字足迹,也称为点击流数据。银行和金融机构一直在处理这些数据,以生成关于访问者正在寻找什么的准确信息,并且他们有效地向访问者显示定制内容,在主页上显示他们感兴趣的产品。这促使访问者点击展示链接,了解更多关于产品的信息,正如俗话所说,他们看到什么就买什么。你不应该显示太多的内容,因为这会让访问者感到困惑,他们可能会不做任何交易就注销,或者没有留下他们的信息以便以后联系。来自数字足迹的信息可以被定制到访问者愿意转换的百分比!定制内容的显示基于哪些当前访问者显示了过去已转化的其他访问者的特征。由于转换率极低,因为该银行网站上的数百万访问者中只有少数人会在网上购买产品或服务,因此我们需要使用一些非常强大的机器学习算法,这些算法可以在有限的数据量下捕捉模式以进行学习。此外,由于每秒都会生成数字足迹,因此算法需要读取大量数据。机器学习算法,如随机森林(使用 Bagging 方法)或梯度推进(使用推进方法)在这里工作得很好。这些算法在处理大量数据时是有效的,并且可以以良好的准确度识别模式。数据科学家还使用一种称为堆叠或集成的技术,其中不同算法的输出被组合并输入到另一个模型中,以计算各种机器学习算法组合的概率。
所以,下次你访问一家银行的网站,弹出窗口显示提供诱人的住房贷款利率时,请确保后台运行的重载机器学习算法已经监控了你在网站上的活动,并知道你在寻找什么。
集群—一站式分析解决方案
银行和金融机构的大部分决策都是通过将具有相似特征和特定行为方式的事物分组来完成的,这样就可以批量应用决策,从而节省时间、精力和金钱。聚类算法来拯救!我数不清有多少次我们提议用集群来解决业务问题,但我会分享两个例子,我清楚地记得我们是在哪里这样做的。
第一个是为一家银行设计的,它想从不太忠诚的客户中找出最忠诚的客户。我们的方法是基于三个指标来定义忠诚度:交易的新近性、交易的频率和交易的货币价值(在分析界更为人所知的是 RFM 模型)。这三个指标结合起来,根据对业务更重要的因素赋予每个指标一定的权重,使我们能够对哪些客户与其他客户相比互动更多进行排名(这些客户最终会处于休眠状态,并属于不太忠诚的类别)。一个重要的考虑是深入研究交易,否则错误可能会悄悄进入。例如,这非常有趣,当我们根据 RFM 评分发展分类时,我们看到每个储蓄账户持有人在近期价值上得分很高。这对我们来说非常有趣,我们花了几天时间来确定发生了什么,后来才意识到每个储蓄账户都有账户持有人的应收利息,并且在每个月底贷记到账户中。
第二种情况是,业务部门希望确定绩效低于平均水平的银行分支机构,衡量标准包括获得的新客户、账户中保持的平均余额、发送给总行审批的房屋贷款申请的质量、客户的发起人得分、员工流失等。使用 k-means 聚类,我们从较低的分支中识别并区分了这些指标上的所有高性能分支。这有助于银行做出决策,如审查绩效较低的分支机构的财务目标或关注员工培训,并激励绩效较高的分支机构激励他人。
所有高级分析和数据科学算法背后的核心理念是帮助企业更快地做出更好的决策。他们说数据是新的石油,分析是将石油转化为燃料的过程。
在深度学习中滚动
在现有艺术家身上训练人工智能来创作新颖的音乐
我用几种机器学习技术制作了这个音乐视频。音乐是由一个人工智能在阿黛尔的专辑“21”上训练了两周产生的。视觉效果是由一个人工智能生成的,该人工智能从她的歌曲“在深渊中翻滚”的每一行歌词中创建了图像。他们一起创造了一个有趣的,也许是令人不安的机器辅助创作的观点。
这一切都始于我和我的朋友们玩的一个叫做 Cover Me Badd 的活动/游戏。这有点像带回家的卡拉 ok,或者 DIYMTV。每个季度,你组建一个乐队,然后选择一首翻唱歌曲。但你不能翻唱这首歌。我们把所有的歌曲放进一顶帽子里(嗯,一顶虚拟的帽子),把它们混在一起,然后随机分发给每个乐队,所以你必须翻唱别人提交的一首歌。然后你录下这首歌,制作一个音乐视频,我们在最后聚在一起开一个大派对,看所有的视频。
这个季度,我被安排去采访阿黛尔的《在深渊中翻滚》。我知道我不可能唱好这首歌,因为我的声音太难听了。所以我训练了一个机器人为我唱歌。
训练“Adeldroid”
我最近发现了 SampleRNN,这是一种机器学习算法,可以从音频样本中学习,然后吐出类似的声音作为输出。达达机器人小组已经使用 SampleRNN 制作了一个无尽的死亡金属电台。他们还训练了一名披头士乐队的模特,创作了《深入披头士》专辑。
这个概念有点简单:你把一个音乐源(作为 PCM。wav 文件),将其分割成小段,然后从这些小段中随机选取,并将它们输入到递归神经网络中。每次你给它输入一些片段,这个模型就能更好地模仿那个声音。前 500-1000 次迭代将是噪音和静态的,但过一会儿它的输出将开始成形,听起来类似于你喂它的东西。它可以模仿声音、吉他、钢琴、鼓——如果你的训练数据是这样的话,甚至可以同时模仿。
Here’s what successive trainings of SampleRNN on Ariana Grande sounds like
现在,如果你在你的家用电脑上训练这个模型,可能需要几个月才能得到有用的东西。你需要的是一个特别为机器学习而构建的非常强大的 GPU。在我写这篇文章的时候,最好的是 NVidia Tesla P100,如果你想要自己的,价格在 10,000 美元左右。幸运的是,我们可以简单地从云中租用一个(这仍然是一个很大的成本,但比投资自己的硬件要少得多)。
有几家公司会让你在云中使用他们花哨的 GPU。由于我在谷歌工作,我决定使用谷歌云平台的计算引擎。他们有一个预构建的虚拟机映像,其中已经安装了所有 NVidia CUDA 驱动程序和 Tensorflow 等机器学习软件,并准备好在他们的 Google Cloud 深度学习虚拟机映像中使用。你只需点击按钮,它就会为你提供一个带有 Tesla GPU 的虚拟机,然后你登录并复制你的音乐文件和用于 Tensorflow 代码的 SampleRNN,并立即开始训练。
提示:确保在运行训练命令之前运行屏幕 Linux 实用程序,这样它就不会在你退出时被杀死。
那你等着。我对我的模型进行了大约 4500 次迭代,持续了大约两周。(按照特斯拉虚拟机每小时 50 美分的价格,大约是 170 美元。所以,是的,创造你自己的唱歌机器人并不便宜。)
我会每天登录,检查最新的样品,以确保它们是好的。有几次,代码因为超出界限的无限值而崩溃。没关系,你可以删除最后几个快照,然后从那里重新开始训练,这样通常就可以了。
一旦我对进度感到满意(大约在第 3500 次迭代时),我停止了训练,并将样本输出持续时间从每 10 次迭代生成 3 秒剪辑(这对测试很有好处,因为它们会减慢训练过程)提高到每一次迭代生成 8 秒剪辑。我又让它运行了几天,以产生一个我可以从中提取的好的素材集。
拼凑机器人的散文诗
然后,我把我从云端生成的所有样本下载到我的电脑上,开始了漫长而艰苦的分类过程。人工智能创造的背后隐藏着大量的人类劳动,从收集人类创造的内容的数据,到使用发展中国家的数字劳动力(例如机械土耳其人)来标记训练数据,到聚合和排序模型的输出并微调参数。
我亲身经历了后者。我的分类系统是基于 macOS 的 Finder 颜色标签:
- 红色/橙色/黄色:人声(红色最好,黄色……不太好)
- 绿色:环境/旋律乐器
- 紫色/蓝色:鼓/低音/背景节奏
- 灰色:怪异/另类/最爱
由于我对将近 1500 个剪辑进行了分类(只有迭代 3000 到 4500 是可列表的),并且每个迭代有 10 个剪辑,我将从每个迭代中抽取几个剪辑。如果某件事真的很有希望,我会在同一个迭代中听更多,否则我会尽可能快地完成它们。
一旦我完成了对最好的样本的标记,我必须将它们排列成某种“歌曲”,有开头、中间和气候结尾,希望能创造出一种旅程,而不是仅仅将随机的片段连接在一起。我真的受到了乐队 Yacht 与机器学习合作的技术的启发,并试图适应他们在与 AI 合作时强加给他们创作过程的“规则”:
你们中的一些人可能知道,使用机器学习来制作一首有结构的歌曲,有开头,中间和结尾,有独唱,合唱,独唱,仍然有点,超出了我们的能力范围。但这是一件好事,因为旋律是模特的工作,但编曲和表演完全是我们的工作。
所以对我们来说,我们决定用这个过程创作的每一首歌都必须从我们备份目录中的现有旋律中插入…我们还决定不能添加任何音符。我们无法添加任何和声。我们不能即兴演奏或解释,或者从根本上说,不能以任何方式创新。没有加法改变,只有减法或换位改变……我们可以随心所欲地构造、剪切和拼贴。
现在,他们想出的规则是处理由人工智能生成的纯 MIDI 音符,而不是实际的音频样本,所以他们有更多的自由,但我喜欢他们的坚韧,并决定在同样的限制下工作。最终我想出了你一开始听到的音乐。
如果我再做一次,我想我会稍微放松一下约束,并尝试将人工智能生成的样本分层到一些更连贯的节拍上,至少保持稳定的节奏,因为人工智能样本非常有节奏和混乱。或者我会从生成的样本中拼接出某些声音,并在采样器中使用它们来创作我自己的旋律。
我还有一个假设,可能会提高模特的节奏感。不是以固定的 3 秒钟间隔随机切割训练输入并将其投入到模型中,而是将所有歌曲的时间扭曲为相同的速度。然后根据速度将它们分割成一个小节的持续时间或其他固定数量的节拍,并将其输入神经网络。如果你能给它输入训练数据,所有数据都有相同的规律节奏,它可能会选择更有节奏的队列,并学会发出更稳定的鼓声。下次要尝试的东西。
生成视觉效果
因为 Cover Me Badd 需要一个音乐视频,我需要一些视觉效果。我刚刚听说了这个叫做 Runway 的新应用,它非常棒,尤其是对于那些想要开始 ML 的艺术家来说。它开放了几十种不同的机器学习模型,经过预先训练,点击按钮即可使用。你只需输入或拖放你的输入(文本、图像、视频等),它将在你的本地机器或云中运行它,并给你结果。它也有一个很棒的 API,可以通过 MIDI、OSC 或 HTTP/JSON 接受输入并产生输出,所以你可以将其连接到许多不同的乐器/应用程序或你自己的代码中。
The image for the lyric “You had my heart inside your hand”
我决定在 Runway 中使用 AttnGAN 模型,它接受文本作为输入,生成图像作为输出。我把它连接到我写的 Javascript 上,一行一行地输入阿黛尔的“在深渊中翻滚”的歌词,每行一张图片。我真的很喜欢它所产生的抽象但令人不寒而栗的可识别的图像。
我首先想滚动所有的图像以及产生它们的歌词,然而,结果是一次看太多了。所以我删除了歌词,并使用 P5.js 编写了一个小算法,在图像滚动时将它们“融合”到一起。把它们扔在一起,还有维奥拉!我成功地避免了为我的封面和提交播放任何音乐!
我的朋友在聆听聚会上说的一句令人难忘的话是,“这个机器人需要学习让音乐变得更好!”嗯,是的,但是 200 美元是它能学会的最好的了。
数据去神秘化— DIKW 模型
首先了解全局将为这一旅程的成功奠定基础
总体而言,数据是科技和商业领域最大的新趋势之一。数据“专家”正迅速成为行业中薪酬最高的个人,每家公司都希望在数据能力的浪潮中冲浪。
它正在成为理解我们周围世界的一种基本方式。我们可以将数据科学视为认识论或一种认知方式。我们可以想一想,处理问题和解决问题的方法。
但正如任何新趋势一样,我们必须问自己:所有这些流行语实际上意味着什么?
什么是数据科学家?简而言之,比任何软件工程师更擅长统计,比任何统计学家更擅长软件工程的人。
本文的目标是揭开数据分析的神秘面纱。我们将解释这些流行语的含义,大数据能做什么和不能做什么,以及如果您要加入数据列车,应该探索哪些技术
本文是关于数据分析的四篇系列文章的第一篇。我们将从一些基础知识开始,然后在此基础上一步一步地解释计算和思维过程中更复杂和更强大的系统,并帮助您理解为什么每个人都对数据如此着迷。
迪克夫金字塔
在开始讨论数据分析之前,让我们从一个简单但极其重要的概念开始:DIKW 金字塔。虽然许多人熟悉金字塔,但很少有人了解如何解读它,如何使用它,以及他们自己的立场。
DIKW Pyramid
要详细说明这个概念,请听 Jennifer Rowley (2007):“通常信息是根据数据定义的,知识是根据信息定义的,智慧是根据知识定义的。”
现在让我们来解释金字塔的每一层。
数据只是一组信号或符号。仅此而已——只有噪音。它可能是服务器日志、用户行为事件或任何其他数据集。它是无组织的,未经加工的。它是惰性的。如果我们不知道这意味着什么,这是没有用的。
当你开始让数据变得有用时,你就获得了信息。当我们应用系统来组织和分类数据时,我们可以将这种非结构化的噪音转化为信息。这个阶段应该回答“什么”、“什么时候”和“谁”的问题。简而言之,信息是有意义的数据。这个“意义”可能是有用的,但并不总是有用的。
知识是旅程的下一步,也可能是最重要的一步。它隐含地需要学习。这意味着我们可以获取数据,对其进行分类和处理,生成信息,然后以一种有用的方式组织所有这些信息。信息可以帮助我们理解关系,而知识让我们发现模式。这是让我们建立预测模型并产生真实见解的基础。我喜欢的一个定义是,知识是一种心理结构,由积累的学习和对信息的系统分析构成。
智慧是最后的边疆。它允许我们正确地预测未来,不仅通过检测和理解模式,而且深入理解这些模式背后的“为什么”。智慧是关于未来的:它依赖于知识和模式模型,但它可以帮助塑造你的“直觉”和直觉,给你一个指数级的竞争优势。知识会因为现实的快速变化而快速老化,但智慧会更加僵化。目前,这是一项纯粹的人类技能,但人工智能正在快速追赶。当人工智能变得比人类智慧更好时,结果将是不可预测的。
下图完美地展示了这种思维模式:
A different view of the DIK(I)W Pyramid
这个例子还引入了’洞察力的概念,有时也称为’智能。这是智慧的零星体现。洞察力是连接知识和智慧的纽带。
虚假的例子
数据:下雨了
信息:一小时内气温下降了 5 度,湿度上升了 5%,下午 3 点开始下雨。
知识:湿度的快速增加,伴随着低压区引起的温度下降,将可能使大气无法保持水分和雨水。
智慧:根据观察和数学模型,我们可以预测未来下雨的原因和时间,而且我们可以如此快速系统地预测,不需要太多的分析。我们已经了解了蒸发、气流、温度梯度、变化和降雨之间发生的所有相互作用。
奖励积分
代表性启发式 被我们的大脑用来推断模式。我们的大脑使用其大部分能力来创造模式,并沉迷于试图理解和预测现实世界中的模式。这意味着在处理数据时,我们需要非常小心,避免过早下结论。知道我们有这种到处追逐和看到模式的倾向,可以帮助我们在推断模式时慢下来。这是一个值得单独写一篇文章的主题,但是最好从一开始就记住。
可用性偏差 与前面的概念有些关系。这是一种思维捷径,依赖于即时、紧急的信息,并试图仅使用最明显的信息来概括研究结果。在这种偏见下,人们倾向于对更近的信息做出更重的判断,使新的观点偏向最新或最接近的新闻。你可以在下面的文章中了解更多。
它是什么?它如何影响我们的决策过程
medium.com](https://medium.com/@anthony.figueroa/availability-heuristic-8b70e38afec8)
DIKW 等级的起源
不是数据科学。即使是工程领域也不行。这种心理框架的起源是诗歌。诗人 T.S .艾略特是第一个提到“DIKW 等级制度”的人,尽管他没有用那个名字来称呼它。1934 年艾略特在《岩石》中写道:
Where is the Life we have lost in living?
Where is the wisdom we have lost in Knowledge?
Where is the Knowledge we have lost in Information?
虽然这是第一次提到艺术中的等级制度,但不是唯一的一次。在管理和信息科学流行起来之前,弗兰克·扎帕在 1979 年提到了等级制度:
Information is not Knowledge,
Knowledge is not wisdom,
Wisdom is not truth,
Truth is not beauty,
Beauty is not love,
Love is not music,
and Music is THE BEST
参考
- 拉塞尔·l·阿科夫,“从数据到智慧”,《应用系统分析杂志》16(1989):3–9。
- 米兰·泽莱尼,“管理支持系统:走向综合知识管理”,《人类系统管理》7,第 1 期(1987):59–70。
- 米(meter 的缩写))库利,建筑还是蜜蜂?(伦敦:霍加斯出版社,1987 年)。
- 哈兰德·克利夫兰,“作为资源的信息”,《未来学家》,1982 年 12 月,第 34-39 页。
- 艾略特,岩石(费伯和费伯 1934)。
- 弗兰克·扎帕,“帕卡德鹅”在专辑乔的车库:第二和第三幕(塔记录,1979)。
- Nikhil Sharma,“数据信息知识智慧(DIKW)层次结构的起源”,(谷歌公司,2008 年 2 月)。
罗森布拉特的感知机,第一个现代神经网络
初学者深度学习快速入门。
在过去的十年里,机器学习已经在许多领域产生了变革性的影响,如认知神经科学、图像分类、推荐系统或工程。最近,神经网络和深度学习吸引了更多的关注,它们的成功被科学和主流媒体定期报道,例如 Deep Mind 的 AlphaGo 和 AlphaGo Zero 或最近的 AlphaStar 。这种新的兴趣部分是由于对开源库的访问,例如 TensorFlow 、 PyTorch 、 Keras 或 Flux.jl 等等。
虽然这种对高效和多功能库的更多访问通过减少实现深度学习算法所需的计算机科学知识,打开了创新应用的大门,但仍然需要对基础数学理论的良好理解,以提出用于所考虑任务的高效神经网络架构。不幸的是,社会对数学的形象可能会吓跑学生(参见纪录片 我是如何开始讨厌数学的 以获得例证)。缺乏数学素养也可能是政治和非技术行业经常对深度学习的表现和能力持怀疑态度或过于乐观的原因之一。此外,苏珊娜·沙特克最近发表了一篇文章,讨论为什么人们不信任人工智能以及为什么业界可能不愿意采用它。她列举的一个关键原因(尽管不是唯一的原因)如下:
在 IBM2018 年的一项研究中,63%的受访者认为缺乏技术技能是人工智能实施的障碍。
94%的高管认为人工智能是业务的关键,但只有 18%的高管大规模采用了人工智能。问题是对人工智能的不信任——我们…
towardsdatascience.com](/people-dont-trust-ai-we-need-to-change-that-d1de5a4a0021)
本系列的历史观点和目标
尽管深度学习只是在最近才成为主流媒体,但它的历史可以追溯到 20 世纪 40 年代初,由麦卡洛克和皮茨建立的第一个人工神经元数学模型。从那以后,科学文献中提出了许多架构,从 Frank Rosenblatt (1958 年)的单层感知器到最近的神经常微分方程 (2018 年),以解决各种任务(例如,下围棋、时间序列预测、图像分类、模式提取等)。下面的时间线(由法维奥·巴斯克斯提供)提供了深度学习历史的一幅相当准确的图片。
Thanks to Favio Vázquez for this amazing figure. Check out his posts, they are really good!
正如你所看到的,这段历史很复杂。因此,在数量有限的博文中涵盖所有这些不同的架构是不现实的。此外,这些神经网络结构中的一些可以从高级数学领域或者甚至从统计物理学中提取。这些系列不是详细讨论这些架构中的每一个,而是旨在逐步向初学者介绍深度学习背后的数学理论,它使用的基本算法,以及提供一些关于其发展的历史观点。为此,我们将从简单的线性分类器开始,如 Rosenblatt 的单层感知或逻辑回归,然后转到完全连接的神经网络和其他广泛的架构,如卷积神经网络或 LSTM 网络。其他各种主题,如凸和非凸优化,通用近似定理,或技术和道德的良好做法也将在路上解决。因为我们的目标是帮助初学者理解深度学习算法的内部工作原理,所以所有将要介绍的实现基本上都依赖于 SciPy 和 NumPy,而不是像 TensorFlow 这样高度优化的库,至少在可能的情况下。此外,为了教学和科学推广,本系列中使用的所有代码都可以在 GitHub [ 此处 ]上免费获得。事不宜迟,让我们开始吧!
麦卡洛克和皮茨的人工神经元模型(1943 年)
人工神经元的第一个数学模型是由沃伦·麦卡洛克(1898-1969,美国神经生理学家)和小沃尔特·h·皮茨(1923-1969,美国逻辑学家)在 1943 年提出的阈值逻辑单元。然而,在深入研究他们的模型之前,让我们先快速回顾一下生物神经元实际上是如何工作的。
Left: Warren S. McCulloch. Right: Walter H. Pitts Jr.
生物神经元的高级描述
神经元是大脑的组成部分。简而言之,神经元是电可兴奋的细胞,通过专门的连接与其他细胞进行交流。存在不同的生物模型来描述它们的属性和行为,例如
- 早在 1907 年,路易斯·拉皮克(1866-1952,法国神经科学家)就提出了整合-发射模型。
- 霍奇金-赫胥黎模型,以获得 1963 年诺贝尔生理学和医学奖的艾伦·a·霍奇金(1914–1998,英国生理学家和生物物理学家)和安德鲁·f·赫胥黎(1917–2012,英国生理学家和生物物理学家)命名。
- 以理查德·菲茨休(1922–2007,美国生物物理学家)和 j·南云(日本工程师)命名的菲茨休-南云模型,基本上是霍奇金-赫胥黎模型的简化。
- 或者是尤金·m·伊兹基科维奇(生于 1967 年,俄罗斯数学家)最近的脉冲神经元模型。
尽管这些模型中的一些开始被采用作为复杂神经网络的构建模块(例如,参见脉冲神经网络),我们此后将限制我们自己对神经元的非常高级的描述。下图显示了示意图。出于我们的目的,我们只对以下元素感兴趣:
Schematic representation of biological neuron. From Wikipedia.
- 树突,也称为树突,是一个神经细胞的分支原生质延伸,它将从其他神经细胞接收到的电化学刺激传播到细胞体(或细胞体)。
- 胞体是从树突接收到的信号汇合并传递的地方。它包含许多细胞器以及细胞核。
- 轴突丘是连接轴突的细胞体的特殊部分。正是它控制着神经元的放电。如果它接收到的信号的总强度超过了阈值,神经元就会向轴突发出一个信号(称为动作电位)。
- 轴突是从胞体向下延伸到末端的细长纤维。它的作用是通过它的突触将神经信号传递给其他神经元。
- 突触是位于连接神经元和其他神经细胞的轴突末梢最末端的小间隙。在那里,神经递质被用来将信号通过突触传递给其他神经元。
生物神经元的工作原理可以总结如下。首先,它从其树突(即,从其他神经元)获取输入。第二步,在 soma 中对这些输入进行加权求和。结果然后传递给轴突小丘。如果这个加权和大于阈值限制,神经元将会触发。否则,它将保持静止。我们神经元的状态(开或关)然后通过其轴突传播,并通过其突触传递给其他连接的神经元。虽然非常简单,但这种对生物神经元工作原理的高级描述足以理解麦卡洛克和皮茨在 1943 年提出的人工神经元的数学模型。
人工神经元的数学模型
基于对神经元工作原理的基本理解,麦卡洛克和皮茨在他们的开创性论文中提出了第一个人工神经元的数学模型,这是早在 1943 年神经活动中固有思想的逻辑演算。尽管非常简单,他们的模型已经被证明是非常通用和容易修改的。今天,他们最初模型的变体现在已经成为大多数神经网络的基本构建模块,从简单的单层感知器一直到微软用来赢得 2016 年 ImageNet 竞赛的 152 层深度神经网络。
麦卡洛克&皮茨的神经元模型,以下简称为 MCP 神经元,可由以下规则定义:
- 它有一个二进制输出 y ∈ {0,1},其中 y =1 表示神经元启动, y =0 表示它处于静止状态。
- 它有 n 个兴奋性二进制输入 xₖ ∈ {0,1}。
- 它有一个单一的抑制输入 i 。如果它是开着的,神经元就不能激发。
- 它有一个阈值θ。如果它的输入总和大于这个临界值,神经元就会触发。否则,它将保持静止。
给定输入x=【x₁、x₂、x₃、 … 、xₙ ]ᵀ,抑制输入 i 和阈值θ,输出 y 计算如下
对于任何具有神经网络基础知识的人来说,这样的模型看起来可疑地像现代人工神经元,这正是因为它是!
许多不同的论文和博客帖子已经展示了如何使用 MCP 神经元来实现不同的布尔函数,如 OR、and 或 NOT。下面用马文·明斯基的符号来说明这些。
Three boolean functions are modeled using MCP neurons. For more details, see the post mentioned below by Akshay Chandra Lagandula
必须强调的是,通过堆叠多个 MCP 神经元,还可以表示更复杂的功能(例如,触发器、除以 2 等)。尽管有这种灵活性,MCP 神经元仍有很大的局限性,即
- 单个 MCP 神经元不能代表 XOR 布尔函数或任何其他非线性函数。
- 所有的突触权重都被设置为 1,这意味着所有的输入对输出的贡献是相等的。
- 所考虑的功能需要由用户硬编码。无法从数据中得知。
- 绝对抑制规则(即如果抑制输入 i 开启,神经元不能触发)限制性太强。
尽管如此,MCP 神经元在当时的研究界引起了极大的兴奋,半个多世纪后,引发了现代深度学习。在这个过程中,最重要的改进之一,解决了 MCP 神经元的一些限制,来自于弗兰克·罗森布拉特和他的感知机。
注: 阿克谢·钱德拉·拉甘杜拉去年夏天出版了一本关于麦卡洛克·皮茨的《神经元》的精彩介绍。最值得注意的是,他举例说明了布尔函数(例如 AND、OR 等)是如何使用这个模型实现的。对于更深入的细节(和漂亮的数字),强烈鼓励感兴趣的读者去看看。
[## 麦卡洛克-皮茨神经元——人类第一个生物神经元的数学模型
众所周知,深度神经网络的最基本单元被称为人工神经元/感知器…
towardsdatascience.com](/mcculloch-pitts-model-5fdf65ac5dd1) [## 感知器:人工神经元(麦卡洛克-皮茨神经元的本质升级)
深度神经网络的最基本单元被称为人工神经元,它接受输入,处理它…
towardsdatascience.com](/perceptron-the-artificial-neuron-4d8c70d5cc8d)
罗森布拉特的单层感知器(1957 年)
在麦卡洛克和皮茨之后大约 15 年,美国心理学家弗兰克·罗森布拉特(1928-1971)受到突触可塑性(即学习过程中大脑神经元的适应)的赫比理论的启发,提出了感知器,这是对 MCP 神经元模型的一个重大改进。这项发明让他获得了国际认可,迄今为止,电气和电子工程师协会(IEEE),“世界上最大的专业协会,致力于推动技术创新和卓越,造福人类”,以他的名字命名其年度奖项。
Left: Frank Rosenblatt, from Wikipedia. Right: Mark I Perceptron machine, the first implementation of the perceptron algorithm. From Wikipedia as well.
罗森布拉特的主要成就是表明,通过放松 MCP 的一些规则(即绝对抑制、所有输入的平等贡献以及它们的整数性质),人工神经元实际上可以从数据中学习。更重要的是,他为这种改进的 MCP 神经元模型提出了一种监督学习算法,使人工神经元能够自己直接从训练数据中计算出正确的权重。在深入机器学习有趣的东西之前,让我们快速讨论一下感知器可以解决的问题类型。
二元分类
二进制(或二项式)分类是基于规定的规则将给定集合的元素分类成两组(例如,分类图像是描绘猫还是狗)的任务。下图描述了此类问题的两个实例。在左边,任务是识别两个线性可分的类之间的分界线(即分界线是简单的直线),而在右边,两个类是非线性可分的(即分界线是而不是简单的直线)。
Examples of linear and nonlinear binary classification problems. In the rest of this post, we will consider only example (a).
正如我们将看到的,罗森布拉特的感知器只能处理线性可分类的分类任务。然而,必须注意的是,右图中的例子也可能被感知器处理,尽管它需要一个称为特征工程的输入预处理,以将其转换成一个线性可分问题*。*这将在以后的帖子中解决(希望如此)。
为了更好地理解感知器处理二元分类问题的能力,让我们考虑它所依赖的人工神经元模型。
Artificial neuron used by the perceptron. From Wikipedia.
正如你所看到的,这个神经元与麦卡洛克&皮茨在 1943 年提出的非常相似。然而,它有一些主要的区别,即
- 神经元接受与突触权重 b 相关的额外恒定输入(在上图中表示为θ),也称为偏差。关于 MCP 神经元,偏差 b 仅仅是激活阈值的负值。
- 突触权重 wₖ 不限于一,因此允许一些输入比其他输入对神经元的输出有更大的影响。
- 它们也不局限于严格为正。因此,一些输入可能具有抑制性影响。
- 绝对抑制法则不再适用。
在数学术语中,感知器所依赖的人工神经元的非线性是
该函数对应于 Heaviside 函数(即 H ( z ) = 0,如果 z < 0,否则 H ( z ) = 1)。请注意,感知器的等效公式(其中二进制输出定义为 y ∈ {-1,1})考虑的是符号函数,而不是亥维赛函数,即
无论公式是什么,感知器(和许多其他线性分类器)的决策边界是这样的
或者,使用我们简洁的数学符号
该决策函数线性依赖于输入 xₖ ,因此得名线性分类器。此外,这个方程是一个超平面(1D 的一个简单点,2D 的一条直线,3D 中的一个规则平面,等等)的方程。突触权重的向量 w 垂直于该平面,而偏差 b 是从原点的偏移。既然我们对罗森布拉特的感知器为什么可以用于线性分类有了更好的理解,那么有待回答的问题是
给定一组 m 个例子( x ₘ,yₘ),感知器如何学习正确的突触权重 w 和 bias b 以正确区分两类?
感知机学习算法
如前所述,Rosenblatt 的主要成就不仅表明他对 MCP 神经元的修改实际上可以用于执行二进制分类,而且还提出了一种相当简单但相对有效的算法,使感知器能够从示例中学习正确的突触权重 w 。该算法如下所示
在继续讨论 Python 实现之前,让我们考虑四个简单的思想实验来说明它是如何工作的。
- 假设 mᵗʰ示例 x ₘ 属于类别 yₘ =0,并且感知器正确预测 ŷₘ =0 。在这种情况下,重量修正由δw**=(0-0)xₘ给出,即我们不改变重量。这同样适用于偏见。
- 同样,如果 mᵗʰ例子 x ₘ 属于类 yₘ =1,感知器正确预测 ŷₘ =1,那么权重修正为δw= 0。这同样适用于偏差。
- 现在假设 mᵗʰ例子 x ₘ 属于类别 yₘ =0,并且感知机错误地预测 ŷₘ =1 。在这种情况下,权重修正由δw**=(0–1)xₘ=–xₘ给出,而偏差更新为b=b–1。
- 最后,如果 mᵗʰ例子 x ₘ 属于类 yₘ =1 而感知器错误预测 ŷₘ =0,权重修正为δw=xₘ。偏差也根据 b = b+ 1 更新。
如你所见,这个算法非常简单。然而,乍一看,为什么这样一个简单的算法实际上可以收敛到一组有用的突触权重,这可能还不清楚。虽然相对简单,收敛的证明将不会在这里提出,实际上将是一个即将到来的职位的主题。对于这篇文章的其余部分,只要做出一个信念的飞跃,相信我,它确实会收敛。与此同时,如果你是一个怀疑论者或者仅仅是不相信,你可以看看阿克谢·钱德拉·拉甘杜拉的帖子,从几何学的角度直观地了解它为什么有效。
本帖将讨论 Minsky 和 Papert 在 1969 年提出的著名的感知器学习算法。这是一个…
towardsdatascience.com](/perceptron-learning-algorithm-d5db0deab975)
现在让我们继续有趣的事情,用 Python 实现这个简单的学习算法。假设您已经熟悉 Python,下面的代码应该是不言自明的。
请注意,为了清晰和易用,我们将在整个课程中尽量坚持使用 scikit-learn API。在我的 towards data science Github repo(此处)上可以免费获得该代码的扩展版本(带有各种健全性检查和其他内容)。我们的模型学习到的最终决策边界如下所示
Linear decision boundary learned by the perceptron.
对于这个特定的例子,我们的感知器在整个数据集上经过三次,才正确地学习到这个决策边界。虽然它正确地对我们训练数据集中的所有例子进行了分类,但我们将在后面的帖子中看到,感知器的泛化能力相当有限,特别是由于它的边缘很小,并且对有噪声的数据非常敏感,这甚至可能阻止学习算法收敛。尽管如此,请不要犹豫,从 Github 下载相应的脚本,并使用这个简单的实现来建立您对它为什么工作、如何工作以及它的局限性的直觉。毕竟,
锻造造就铁匠,航海造就水手,熟能生巧。
感知器的消亡
这种学习算法对于线性可分问题的简单性和效率是它在 20 世纪 50 年代末和 60 年代初如此流行的一些关键原因。然而,这种受欢迎程度导致罗森布拉特夸大了他的感知学习能力,在科学界引起了不切实际的期望,媒体也报道了这一点。正如我们将在后面的文章中看到的,这种感知机确实有很大的局限性,极大地限制了它在现实生活中的应用。的奇招来自马文·明斯基(1927–2016,美国认知科学家)和西蒙·派珀特(1928–2016,南非裔美国数学家),他们在 1969 年出版了臭名昭著的名著感知机:计算几何导论。在本书中,作者展示了 Rosenblatt 的感知器(以及任何其他单层感知器)实际上是多么有限,而且值得注意的是,它无法学习简单的逻辑异或函数。有人认为,这本书的出版和对感知机极限的展示引发了 20 世纪 80 年代所谓的人工智能冬天…
结论
本文是我在法国巴黎国立高等艺术学院教授的深度学习入门系列文章的第一篇。由于我们必须先学会走,然后才能跑,因此我们的注意力一直集中在深度学习的非常初步的方面,从历史和数学的角度来看,即麦卡洛克&皮茨的人工神经元模型和罗森布拉特的单层感知器。因为这些是现代神经网络的非常基本的构建模块,所以在进入现代深度学习之前,不要犹豫,尽可能多地阅读它们,并玩 Jupyter 笔记本,以确保您完全掌握它们的属性和限制。我知道在单层感知器上给一个帖子贴上深度学习的标签可能有些牵强。然而,即使可以在网上找到大量的教程(有些真的很好,有些有点可疑)来运行深度学习库,如 TensorFlow,而不需要对底层数学的深刻理解(没有双关语),拥有这样的见解将被证明是非常有价值的,并防止你后来屈服于深度学习的常见陷阱。所以我们一步一步来,好吗?
在接下来的几篇文章中,我们将讨论以下主题:
- 感知器收敛定理。
- 罗森布拉特感知器的极限,走向灭亡的途径。
自适应线性神经元和 Delta 规则
towardsdatascience.com](/improving-upon-rosenblatts-perceptron-d0517d3c5939)
最后,你会在下面找到一个关于麦卡洛克&皮茨神经元和罗森布拉特感知器的历史和数学的附加在线资源列表。不要犹豫,看看这些,因为它们可能会处理一些我们只见过的方面!
PS:如果你知道任何其他相关链接,不要犹豫给我发消息,我会编辑帖子来添加它:)
其他在线资源
- Sebastian Raschka 关于 单层神经网络和梯度下降 的博文。
- Jonty Sinai 的博客文章简单地命名为 感知器 。
- Amanda Gefter Nautilus 关于 Walter Pitts 不可思议的历史。
*想阅读更多此类内容吗?*查看我其他关于低秩结构和数据驱动建模 的文章或者干脆我的 机器学习基础知识 !
有没有想过我们为什么使用它,它来自哪里,如何有效地优化它?这里有一个解释(代码…
towardsdatascience.com](/binary-cross-entropy-and-logistic-regression-bf7098e75559)
清除编程面试任务:Python 中的 RSS 提要解析器
如何使用 Python 完成数据科学和数据工程面试编程任务
最近一直在面试数据科学家的职位。其中一家公司给了我一个任务,用 python 创建一个 RSS 提要解析器。它以增量方式获取提要条目,并将它们存储在数据库中。
完整代码可以在github上找到。
问题阐述
因此,与其深入技术细节,我想回顾一下问题的背景。
对于那些不知道的人来说,RSS 是一种基于网络的内容(或提要)共享格式。(https://en.wikipedia.org/wiki/RSS)。以下是手头问题的细节:
- 要解析的 RSS 提要是 印(https://audioboom.com/channels/4930693.rss)
- 需要设计一个合适的数据模型来表示每个帖子
- 任何支持 python 连接的关系数据库都可以用来存储 post 数据
- 禁止使用能够进行 RSS 解析的库(如 feedparser)
- 负载应该是递增的,即只有先前没有处理的记录应该被处理
- 应该安排脚本每天运行一次以获取更新
方法和系统设计
显然我决定用 python 3.7 ,用生命终结支持来换 python 2.7 。以上基本上意味着我必须自己实现 RSS 解析器。考虑到 1 天的时间限制,所有其他决定都非常简单,为这项工作留出 3-4 个小时(假设每天工作 8-9 个小时)。下面是我最终使用的方法:
1。RSS 解析器库的限制,基本上指望我自己写解析器。由于它最终是基于 xml 的内容,我决定使用一直可靠的 BeautifulSoup 库(【https://www.crummy.com/software/BeautifulSoup/bs4/doc/】) 2。我选择的关系数据库是postgres(https://www.postgresql.org/)。没有特别的原因,除了易用性和熟悉度,显然还有疯狂流行的开源支持。
3。库 自动调度器(【https://apscheduler.readthedocs.io/en/latest/index.html】)每天调度一次任务(简单的库开始, 气流(【https://airflow.apache.org/】库此外,由于没有给出环境规范,我决定使用两个docker(https://www.docker.com/)容器来构建所有这些,一个用于,一个用于
有了上面分享的方法,让我们开始实施吧!
设置事物
首先设置 docker 环境和容器:
1.为容器创建一个单独的网络进行交互:
***docker network create rss***
2.使用数据库名称、密码的环境变量创建 postgres 容器。公开端口,设置绑定挂载和工作目录:
***docker run -d --name rss-postgres \
--net=rss \
-e POSTGRES_DB=audioboom \
-e POSTGRES_PASSWORD=parserssfeed \
-p 5432:5432 \
-v $(PWD):/home \
-w /home \
postgres***
3.创建 python 容器,绑定挂载,设置工作目录并运行它:
***docker run -dt --name rss-python \
--net=rss \
-v $(PWD)/src:/home/src \
-w /home/src \
conda/miniconda3-centos6 bash***
4.为 python 安装必要的库:
***docker exec rss-python conda update -c base -c defaults conda
docker exec rss-python conda install beautifulsoup4 lxml psycopg2
docker exec rss-python conda install -c conda-forge apscheduler***
让我们现在开始构建我们的数据模型…
创建数据模型
看了一些帖子后,我意识到需要三个实体:
****1。 帖子:保存 feed 上发布的每个帖子的条目
2。itunes_data: 一篇文章可以有选择地包含它的 itunes 列表的链接。媒体:一篇文章可以呈现 0 个或多个媒体对象
跟踪这三个实体几乎包含了整篇文章。
请使用此 github 链接 进行精确的创建表查询(因为它们非常简单)
可以通过运行以下命令一次性创建表:
***docker exec -it rss-postgres psql -U postgres -d audioboom -f create_db.sql***
编码开始…
助手模块 除了主脚本之外,还创建了三个脚本来抽象一些带有函数调用的底层功能:
****1。content _ fetcher . py:用于半健壮地处理网页请求,并返回其内容
2。data _ parser . py:将网页内容转换为 BeautifulSoup 对象进行解析,解析 feed 中给定的 RSS post 记录,并返回相同的字典。
3。DB _ connect . py:包含 DB helper 函数,用于获取连接、获取已有记录的计数(用于增量加载)以及执行给定的查询。
Main.py!!!
****最后,让我们构建将所有部分连接在一起的脚本…
1。 导入:下面几行将导入所需的模块和对象
***from data_parser import get_soup, parse_record, store_tags
from db_connect import get_connection, get_max_records,execute_query
from apscheduler.schedulers.blocking import BlockingScheduler***
****2。我们还将定义一些全局变量(我知道这不是一个推荐的做法,但考虑到时间限制,这是我们都必须采取的一个折衷方案)
***# Query to find the max record processed so far
get_max_query = 'SELECT COALESCE(max(itunes_episode),0) FROM tasteofindia.posts;'# Query template to insert values in any table
query_string = 'INSERT INTO tasteofindia.{0} ({1}) VALUES ({2}{3});'# List of columns present in the table
col_list = {
'posts' : [<check the github script for the actual names>]
,'itunes_data' : [<check the github script for the actual names>]
,'media' : ['itunes_episode','url','type','duration','lang','medium']
}# Creating insert queries for all the tables from template
query_strings = {k: query_string.format(k , ','.join(col_list[k]),('%s,'*(len(col_list[k])-1) ),'%s' ) for k in col_list}***
未显示 帖子& itunes_data 的列列表。同样请参考 github 链接 。放给itunes _ episode看,了解一下大意。****
****3。begin(feed _ URL,db _ credential _ file):获取凭据文件上的的连接,并开始解析来自 feed url 的 feed:
***def begin(feed_url,db_credential_file):
try:
connection = get_connection(db_credential_file)
update_feed_data(feed_url,connection)
except Exception as e:
print('Error Received...')
print(e)
finally:
print('Closing connection')
connection.close()***
一个简单的功能,开始所有的骚动,让事情动起来。
4。update _ feed _ data(feed, conn ): 请求给定 url 的 BeautifulSoup 对象并尝试处理其中的任何记录:
***def update_feed_data(feed,conn):
content = get_soup(feed)
print(f"Processing Records for : {feed}")
records = content.find_all('item')
process_records(records,conn)
return***
同样,按照函数范式,它通过检索 BeautifulSoup 对象来完成工作,并传递内容以供进一步处理。
5。process_records(
***def process_records(content,conn):
record_count = len(content)
current_max = get_max_records(conn,get_max_query)
print('Current Max : ',current_max)
records = {} if record_count == current_max:
print("No new records found!!")
return records print(f"Total Records Found: {record_count}. Currently present: {current_max}") # List comprehension on the result of map operation on records
[persist_taste_of_india_record(conn,record) for record in map(parse_record, content[record_count-current_max-1::-1])] return records***
这是最大的功能。它检查是否找到新记录。如果是,它首先为每个记录调用parse _ record(),然后继续保存记录。****
6。persist _ tastse _ of _ India _ record(conn, data ): 它尝试分别持久化帖子的每个组成部分(基于定义的实体)
***def persist_taste_of_india_record(conn,data):
persist_record(conn,data,'posts')
persist_record(conn,data['itunes'],'itunes_data')
for media in data['media']:
persist_record(conn,media,'media')
conn.commit()
return True***
conn.commit() 是必需的,否则数据库中的更改不是永久的,并且会在会话过期后丢失。
****7。persist _ record(conn, data ,TB _ name):根据对象类型执行插入查询:
***def persist_record(conn,data,tb_name):
query_param = tuple(
list(map(lambda k : data[k],col_list[tb_name]))) execute_query(conn,query_strings[tb_name],query_param)
return***
*****query_param 只是将列顺序中的值存储在一个元组中。
*execute _ query()最后将数据插入数据库
****8.执行并调度它:脚本通过调用 begin 函数并调度它每天执行一次来完成,如下所示:
***if __name__ == '__main__':
feed_url = 'https://audioboom.com/channels/4930693.rss'
db_credentials = 'connection.json' print('Main Script Running...')
begin(feed_url,db_credentials)
scheduler = BlockingScheduler()
scheduler.add_job(begin, 'interval',[feed_url,db_credentials], hours=24) try:
scheduler.start()
except Exception as e:
print('Stopping Schedule!!') print('Main Script Exiting!!')***
我在这里使用了阻塞调度程序,因此 python 线程总是活跃的。如果您想要停止执行,那么 try…catch 块将干净地退出。现在,您只需使用以下命令执行主脚本,立即运行一次,并安排在每天同一时间运行一次:
***docker exec -d rss-python python main.py***
瞧啊。
就是这样。您已经准备好一个 RSS 解析器,每天运行并更新数据库。
提高
显然,许多升级和增强是可能。许多最佳实践没有被遵循。坚实的原则,后台调度程序,使用 docker 编写文件等可能是第一步。在构建这个系统的时候,我首先关注的是得到一个功能性的系统,并在重构和设计上花费最少的精力。
尽管如此,请留下您的评论,并随时通过 github 联系我。
RTest:R 包的漂亮测试
specflow 和 cucumber.io 支持非编码人员解释 R 包的测试报告,此外还允许非编码人员创建测试用例。简单 r 包验证的一步。
by startupstockphotos http://startupstockphotos.com/post/143841899156
目录
- 为什么要 RTest?
- 【RTest 有什么特别之处?
- RTest的测试实现示例。
- 延伸阅读
为什么是 RTest?
在 R 中测试似乎很简单。从使用usethis::test_name("name")
开始,然后在test that中用类似expect_equal
的功能编写测试代码。网上可以找到很多教程,甚至有一整本书都是关于“[测试 R 代码](https://www.amazon.de/gp/product/1498763650/ref=as_li_tl?ie=UTF8&camp=1638&creative=6742&creativeASIN=1498763650&linkCode=as2&tag=zappingseb-21&linkId=ca15df0c474acdcf98c8750db741c4e3">Testing R Code (Chapman & Hall/Crc the R)<img src="//ir-de.amazon-adsystem.com/e/ir?t=zappingseb-21&l=am2&o=3&a=1498763650)”的。可悲的是,这不是我能走的路。正如我几次提到的,我在一个受到严格监管的 T21 环境中工作。在这样的环境中,你的测试不仅会被编码员检查,也会被不会编码的人检查。你的一些测试甚至会由不会编码的人来编写。像 specflow 或 cucumber 这样的东西会真正帮助他们编写这样的测试。但是这些在 r 中是不存在的。另外,这些人不能阅读命令行测试报告。你可以训练他们这样做,但我们认为为我们和他们提供一个漂亮的测试环境更容易,这个环境叫做 RTest 。
如果你想了解更多关于开发这样一个环境的原因,你可以阅读文章:为什么我们需要对一种编程语言进行人类可读的测试。
RTest 有什么特别之处?
为了解释我们将哪些特性放入 RTest 中,我将开始描述一个基本的测试工作流程。
1 测试代码从写代码开始。你的 R 包将包含函数、类和方法。应对这些进行测试。
2 编写测试现在主要包括这样的调用:
*my_function(x,y){sums_up(x,y) return(z)}x=3
y=4
z=7stopifnot(my_function(x,y)==z)*
很容易看出,如果你的函数my_function
不能将两个值相加,你的测试将会失败。您将创建一组这样的测试,并将它们存储在您的包的一个单独的文件夹中,通常称为tests
。
3 之后你可以运行所有这样的测试。您可以在tests
文件夹中包含一个脚本,或者使用 testthat 并运行testthat::test_dir()
。
4 如果你的一个测试失败了,脚本会停止并告诉你哪个测试在控制台中失败了。这描述了下图所示的 4 个步骤。
RTest 现在的特别之处在于两个主要步骤。
- 测试的定义
- 测试执行的报告
对于测试的定义,我们决定使用 XML。为什么是 XML?XML 不仅仅比纯 R 代码更容易阅读,它还有一个特性,叫做 XSD;“XML 架构定义”。我们创建的每个 XML 测试用例都可以立即对照开发人员设计的模式进行检查。它也可以与我们自己的Rtest.xsd
进行核对。这意味着测试人员可以在执行测试用例之前仔细检查它们。这为我们节省了大量的时间,并且给所有的测试用例一个固定的结构。
报告是用 HTML 实现的。这是因为 HTML 自带了许多用于报告的特性。它允许测试结果着色,链接到测试用例并包含图像。 RTest 和test之间的 HTML 报告的主要区别在于,RTest 报告每个应该执行的测试,而不仅仅是失败的测试。测试报告还将包括由函数调用创建的值和作为参考给出的值。读者可以看到比较是否正确。这样,测试报告包含的信息比测试和控制台日志包含的信息多得多。
使用 RTest 的测试实现示例
请注意,整个示例存储在一个 github gist 中。如果你喜欢这个例子,请列出要点。
- 给定一个对两列求和的函数:
*my_function <- function(data = data.frame(x=c(1,2),y=c(1,2))){stopifnot(dim(data)[2]==2)data[,"sum"] <- apply(data,1,function(x){sum(x)})return(data)}*
2.我们希望有一个成功的和一个不成功的测试。两者在 XML 文件中都有三个部分:
*<params><reference><testspec>*
params
账户输入参数
reference
为输出数据帧
testspec
测试是否静默运行,容差是多少
对于成功的测试,我们的测试应该是这样的:
您可以立即看到 RTest 的一个特殊功能。它允许为多个测试使用数据集,我们将这些数据集存储在input-data
标签中。这可以节省文件中的空间。这里将使用数据集test01
。此外,可以为每个测试给出测试描述。对于存储在 XML 中的每个 data.frame,列的类型可以在col-defs
中给出。这些都是数字。
这里给出了input-data
:
这是一个数据帧,其中 x 列只携带 1,而 y 列只携带 2。该测试应创建一个数据帧,每行的 sum 列为 3。
我们可以通过改变reference
标签让测试失败,而不是在sum
列中只有 3,我们可以添加一个 3.5 让测试失败。整个测试用例可以在有 90 行的 github gist 中找到。
3.测试用例的执行只是一行代码。您应该在 XML 文件目录中有您的工作目录,并且应该在全局环境中定义my_function
。
*RTest.execute(getwd(),"RTest_medium.xml")*
4.测试报告现在包含一个成功测试和一个失败测试。两者都将被可视化:
General test outcome in RTest test report
所有测试都有附加信息。对于失败的测试,我们将总和设置为 3.5 而不是 3。它在表的末尾报告:
example of a failed data frame comparison in RTest
此外,报告还包含测试运行环境的信息:
System information for an RTest test report
就是这样。现在你可以用 RTest 测试任何包。
进一步阅读
- RTest github 知识库
- RTest 文档网站
- 为什么我们需要对编程语言进行人类可读的测试?
- 作者的 LinkedIn p 年龄
RTX 2060 Vs GTX 1080Ti 深度学习基准:最便宜的 RTX 卡 Vs 最贵的 GTX 卡
使用带有 fast.ai 和 PyTorch 库的 CIFAR-10 和 CIFAR-100 数据集对 2060 和 1080Ti 进行训练时间比较。
TLDR #1 : 尽管只有一半的 VRAM,一半的零售价格,RTX 2060 在计算机视觉中可以突破 1080Ti,一旦它的张量核心在py torch+Fastai中被激活。
不到一年前,凭借其 GP102 芯片+ 3584 个 CUDA 内核+ 11GB 的 VRAM, GTX 1080Ti 是上一代英伟达帕斯卡系列(泰坦版除外)的顶级 GPU。需求如此之大,以至于零售价格经常超过 900 美元,远远高于 699 美元的官方建议零售价。
2018 年秋季,英伟达推出了最新的图灵阵容,命名为“RTX”,拥有光线追踪核心和张量核心。整体价格大幅上涨:例如,RTX 2080Ti 的零售价为 1150 美元甚至更高。
图灵/ RTX 范围内的机器学习的一个关键特征是 张量核心 :根据英伟达的说法,这使得计算可以在“浮点 16”而不是常规的“浮点 32”中运行,并将训练深度学习模型的时间缩短了 50%。
大约一个月前(2019 年 1 月 7 日),英伟达发布了图灵系列中最便宜的 GPU:RTX 2060。
使用 Jupyter 笔记本,我在每个 Cifar 数据集上用 FP32 和 FP16 训练了 ResNet 模型 18 到 152,以比较 30 个时期所需的时间。
有了 Fastai,从 FP32 切换到 FP16 训练就像添加 * 一样简单。to_fp16() *
在你的常规代码的末尾。
- 常规 FP32 版本,带有预训练的 Resnet 18 模型:
learn = create_cnn(data, models.resnet18, metrics = accuracy)
- FP16 版本:
learn = create_cnn(data, models.resnet18, metrics = accuracy)***.to_fp16()***
就这样,你现在可以访问 RTX 张量核心了!
注:关于“FP16”训练的更多信息,也称为“混合精确训练(MPT)”,查看那些优秀的帖子。
TLDR 排名第二。
****
注:“bs * 2”表示 batch_size 大两倍,如 256 比 128。
设置
硬件:我使用的是一台“现实生活”的高端游戏电脑,具有以下规格
- AMD 锐龙 7 1700X 3.4GHz 8 核处理器
- MSI X370 Krait 游戏主板
- 32 GB DDR 4–2400 内存
- 1 TB Nvme 三星 960 EVO
- 华硕 GTX 1080 ti-11GB Turbo(800 美元)
- 巴利特 RTX 2060–6GB(350 美元)
这些零件是我个人使用的,没有任何公司、出版商或供应商支付或赞助。
软件:我双开机用的是 Ubuntu 和 Windows 10。
- Ubuntu 18.04 + Anaconda/Python 3.7
- CUDA 10
- PyTorch 1.0 + fastai 1.0
- Nvidia 驱动程序 415.xx
注意:在每次培训之前,这些卡被切换到一个辅助 PCie 插槽(x8 ),不处理 PC 双显示器,从而确保他们的计算能力 100%集中在培训上。
我提到这一点是因为我在一台 2007 Ergotron LX 双支架 (我有史以来购买的最好的长期电脑!):一个 24 英寸的 1080p(垂直)和一个 27 英寸的 1440p(横向)都连接到同一个 GPU,因此人们可以认为它会从培训中窃取“一些”计算能力。
A screenshot of my dual monitors: the 24" vertical on left, the 27" landscape on right.
顺便说一句,如果你想检查双显示器对训练表现的影响,请使用 1080Ti 向下滚动文章底部进行比较。
两种 GPU 规格的快速总结。
GTX 10 人阵容中的 1080 Ti(最后一位):
RTX 20 强阵容中的 2060(第一个):
要点:
- RTX 2060 的 CUDA 内核数量大约是 1080Ti 的一半(1920 对 3584)
- 它的内存带宽大约是 1080Ti 的 70%(336 对 484 GB/s)
- 它有 240 个张量核(来源)用于深度学习,1080Ti 没有。
- 它的额定功耗为 160W,带有一个 8 针连接器,而 1080Ti 的额定功耗为 250W,需要一个双 8+6 针连接器。
- 它的价格不到 1080Ti(在瑞典斯德哥尔摩)零售价的一半。
附加信息:
- 方法:为了保持可比性,我在三个版本中运行了每个基准测试。
-版本“ FP32 ”和版本“ FP16 ”对 1080Ti 和 2060 使用了相同的 batch_size(有人可能认为 1080Ti 的 VRAM 大约是 2060 的两倍,但我选择了这种方法。您可以自行运行测试)。
-版本“ FP16 bs*2 ”使用了两倍大的 batch_size,以受益于 FP16 训练背后的理论(详见上面两个链接的帖子)。 - 我使用的 Jupyter 笔记本,包括 30 个纪元的所有持续时间,都可以在我的 GitHub repo 中找到。你需要法斯泰·V1 来运行它们。
- 我用来计算持续时间、时间尺度和图表的电子表格也在回购协议中。
CIFAR-10 基准测试
Resnet 18
- “完成 30 个周期的时间”的持续时间(秒):
- 时标:
Resnet-34
- 持续时间(秒):
- 时标:
Resnet 50
- 持续时间(秒):
- 时标:
Resnet 101
- 持续时间(秒):
- 时标:
Resnet 152
- 持续时间(秒):
- 时标:
CIFAR-100 基准测试
Resnet 18
- 持续时间(秒):
- 时标:
Resnet 34
- 持续时间(秒):
- 时标:
Resnet 50
- 持续时间(秒):
- 时标:
Resnet 101
- 持续时间(秒):
- 时标:
Resnet 152
- 持续时间(秒):
- 时标:
奖金:
我比较了 1080Ti 作为红色独立 GPU(无显示器)和蓝色主 GPU(处理双显示器,参见前面的讨论)的性能。
注:我用的是 Cifar-10。
- 持续时间(秒):
- 时标:
我们如何重新控制个人数据
回归去中心化网络
数据是驱动我们经济的“新石油”,但最近的数据泄露事件表明,我们或许应该对分享我们的数据保持警惕。重新控制我们个人数据的方法是回到一个去中心化的网络,这对消费者和公司来说都是一个双赢的局面。
服务的交易数据
2018 年 3 月,很明显,剑桥分析公司出于政治目的使用了数百万脸书用户的个人数据。这一丑闻痛苦地表明,我们以前多么不担心自己的个人数据。事实上,我们对自己数据缺乏控制是万维网发明者蒂姆·伯纳斯·李在 2017 年表达的担忧之一,他声称今天的互联网不像过去那样开放。
尽管最初的意图是“向所有人开放的免费空间”,但网络已经演变成一个由谷歌和脸书等少数互联网巨头管理的中央集权系统。
他们的共同点是共享的商业模式,乍一看似乎很有吸引力:他们不为他们的服务向我们收费。然而,如果我们阅读他们的数据政策中的小字,我们很快就会意识到我们正在付费——不是用钱,而是用我们的个人数据。
这十年的口号是“数据是新的石油”,因此显然,公司拥有的数据越多,就越强大。以脸书为例,一个普通用户的数据据说相当于大约 20 美元的年收入。这似乎是一个相当大的数字——特别是考虑到该网站有 22.7 亿活跃用户——但从我们作为消费者的角度来看,实际上并没有那么多。让我们反过来:假设你丢失了所有的私人信息和照片,你愿意花多少钱把它们找回来?当然,20 美元对于重新控制你的数据来说是一个很小的代价。
我们不断地创造关于我们个人生活、职业生活、购物习惯等的数据。很长一段时间以来,似乎没有人特别担心我们“提供”给脸书、谷歌等公司的信息量。但在不久的将来,人们会希望重新控制自己的个人数据。
今天的集中式网络商业模式不仅影响了我们的隐私,也扼杀了创新。只能有一个赢家,即拥有最多数据的赢家。在许多领域,这些赢家已经确立。这使得他们几乎没有创新的动力。毕竟,你为什么要改变一场胜利的游戏?
社交媒体公司不是大数据游戏的唯一参与者。几乎每家公司都会收集客户的信息,在某种程度上,它们都是大数据公司。甚至超市也会跟踪和分析你买的东西,并根据你的个人资料给你发送个性化广告。对许多这样的公司来说,数据只是达到目的的一种手段:他们需要数据来优化他们的服务或销售,但他们实际上对拥有或管理数据没有直接的兴趣。此外,拥有数据越来越成为公司的一项责任,特别是自从 GDPR(通用数据保护条例)生效以来:如果他们存储数据,他们也必须能够保护它。
想象一个分散的网络
到 2035 年,我们将重新控制我们的个人数据。这意味着我们可以选择将数据存储在任何我们想存储的地方,与我们使用的应用程序无关。我们的个人数据将存储在我们自己控制的所谓的“数据舱”中。在理想情况下,我们将为每个用户提供多个数据容器,例如,一个用于个人数据,一个用于工作相关信息,一个用于官方文档等。我们发布的所有内容都将保存在我们自己的数据舱中,这些数据舱存储在我们选择的服务器上。
为了实现类似社交网络的东西,我们当然需要分享我们的一些数据。只是,在 2035 年的去中心化网络中,我们将可以选择——分别为每个应用程序——我们想要提供哪个数据容器。
我们仍将是数据的所有者——不会制作任何副本——相反,我们只是将应用程序链接到我们愿意开放的数据窗格部分。要实现这一点,必须满足一个重要条件:应用程序必须能够重用其他应用程序创建的数据。
用一个现在的例子来解释这一点:假设你所有的朋友都在脸书,但你更喜欢像 Ello 这样不太受欢迎的替代品。2019 年,选择 Ello 将意味着你不能与你的任何朋友互动(除非你是一个潮流引领者,并能说服他们加入你的 Ello——但我们只是用另一个点取代了一个中心化点)。2035 年,你的朋友使用哪个社交网站将不再重要。由于应用程序将不再拥有任何数据,它们将仅仅成为不同的界面来查看来自你朋友的数据荚的信息。因此,在 Ello 上,你可以看到朋友在脸书上的帖子,并与之互动。因此,应用程序之间的切换将变得容易,它们之间的竞争将基于服务质量,而不是数据所有权。
目前,互联网的一半隐藏在属于少数公司的数据仓库中。这就好像是你的浏览器决定了你可以访问哪些网站。想象一下,Safari 用户看不到谷歌 Chrome 用户创建的任何网站。这就像社交网站决定你可以联系哪些朋友或联系人一样毫无意义。
在去中心化的愿景中,数据存储和应用将成为两个独立的市场。社交网站将试图通过其服务的用户友好性而不是其拥有的用户数量来超越彼此。提供数据存储的服务器也将有一个新的市场。
大数据时代的终结:然后呢?
网络去中心化颠覆了大数据商业模式。它改变了应用程序的竞争方式:它们将不得不通过创新来说服客户,例如用户友好的界面、最好的客户服务、完美的数据安全性等,而不是通过已经拥有大量关于现有成员的数据来吸引新成员。更重要的是,他们还必须通过另一种方式赚钱,比如收取年费。或者有些会给你付费或者(有意识地)出售你的数据的选择。关键是这种思维方式创造了选择和多样性,从而创造了机会。
夺回对我们数据的控制权的影响当然将远远超出社交媒体的范围。例如,今天的大多数消费者并不真正知道他们的超市有哪些关于他们的信息,更不用说他们对这些信息施加任何控制了。在一个分散的系统中,客户将拥有他们所有的数据。乍一看,这似乎是超市的一大劣势,但事实上,这也是一个获得比他们自己可能收集的更多数据的机会。这变成了一场交易游戏:顾客可能会同意分享他们所有的个人购物数据——来自每家超市——以换取个性化的交易。如果超市 Y 注意到你总是在他们竞争对手的店里买酸奶,他们可以给你提供个性化的乳制品降价。它使他们能够分析客户的完整购物行为,为他们提供宝贵的见解,以优化他们的产品。
今天的大多数消费者并不真正知道他们的超市有什么关于他们的信息。在一个去中心化的系统中,客户将拥有他们所有的数据,并且可以选择(有意识地)“出售”它们。例如,对于超市来说,这可能是一个很大的优势,因为他们可以要求访问客户的完整购物数据,也可以了解他们从竞争对手那里购买了什么。这将使他们能够分析客户的完整购物行为,为优化他们的产品提供有价值的见解。
为什么现在是收回我们隐私的好时机?
向一个去中心化的网络转移——或者实际上是回归——首先是要让人们相信这样做的重要性。对数据隐私的日益关注无疑是朝着正确方向迈出的一步。2018 年,欧盟也发出了一个重要信号,推出了《一般数据保护条例》(GDPR),旨在让个人对自己的个人数据拥有更多控制权。
像 GDPR 这样的法规也使得公司拥有数据更加昂贵,这可能会刺激他们转向不同的商业模式;尤其是对于那些只将大数据作为达到目的的手段,而不是作为其商业模式的核心组成部分的公司。
公司需要开始以不同的方式思考数据。像石油一样,数据不应该被保存和储存,而应该成为推动引擎运转的物质。
有趣的是,让人们重新控制自己的数据并不意味着会更少。事实上,从分散的角度来看,将会有更多的数据,因为公司也将能够请求访问竞争对手收集的数据。
魔方?不,机器人和人工智能还没有出现
再来说说目前备受关注的 OpenAI 灵巧机械手。
这是一个炒作疫苗的帖子。换句话说,我会试着让人们不再对机器人技术的最新发展大肆宣传。具体来说,OpenAI 声称在学习用机器人手解决魔方方面取得了一些相当惊人的成果。不考虑他们强大的广告机器,效果究竟有多惊人?
有什么大惊小怪的?
惊人的结果显然不是解开魔方。它是用相对非平凡的机器人系统处理魔方的能力。我们说的是暗影灵巧 E 系列手办:
[1]
实际上,这手牌就是去年玩这个方块的那手牌:
[1]
所以,最后我们还是在说旋转立方体。
控制手的难点在于它有 20 个自由度。此外,用一只手拿着魔方并解决它是非常困难的,即使对一个人来说也是如此(虽然我可以想象同时控制两只机器手是相当困难的,原因将在后面介绍)。
解决这个问题有许多障碍,如估计手的姿态、跟踪立方体、学习旋转立方体等等。令人印象深刻的是,在模拟训练控制策略后,他们能够在基于摄像机输入的真实系统上做到这一点。此外,手能够适应突然的扰动,即玩具长颈鹿在旋转立方体时触摸它。
简而言之,人们可以将他们的方法分为三个重要部分:计算机视觉(感知)强化学习和领域随机化。
自适应域随机化
当你可以进行受控实验时,强化学习效果很好。这意味着你有一个模拟,你可以重置,快速执行。如果你想在一个真实的系统上尝试这一点…好吧,祝你好运,也许你可以问问你的曾曾孙辈学习得如何,对机器人和/或它周围的各种物体/人的一些轻微伤害,因为它的随机探索行为。
为了将策略转移到真实的系统中(假设我们有一个可用的系统模拟),我们可以使用域随机化。这可以归结为将扰动应用到我们现有的模拟中来创造更多的模拟。这样,我们也许就能捕捉到现实世界的复杂性。
这不是一个非常新的想法,它可以追溯到很久以前,实际上,OpenAI 在他们以前的机器人手论文中使用了简单的扰动进行域随机化,但是基于他们之前的许多人的工作。唉,这里显然有些新奇的东西,“自适应域随机化”。它有什么适应性?他们声称,通过从学习到的生成性分布中取样,他们可以为政策生成越来越困难的模拟。好吧,这似乎是合乎逻辑的,生成式发行版是 21 世纪的东西,它们以某种方式让它发挥了作用。不错,但是…
假设有一个模型(模拟)相当方便……
我们设定这个目标是因为我们相信,成功训练这样一只机器手来完成复杂的操纵任务,为通用机器人奠定了基础。[1]
是的,通用机器人……我想知道假设我们有通用机器人可能遇到的所有情况的模拟是否合理。我会让你得出自己的结论,这是一个相当哲学的问题。
政策升华,有何新意?
因此,因为训练会花费太多时间,他们用某种好的开始策略初始化不同的实验(模拟的实例)。他们并行积累了很多数据,这些数据来自不同的政策。学习理论中一个众所周知的事实是,如果你的训练数据没有反映实际的数据分布,你的模型将训练得很差。为此,他们采用 DAGGER 算法进行行为克隆,以有效地适应初始策略。这里没什么新东西。
处理太多数字的问题
对于块重定向任务,我们使用 4 × 8 = 32 个 NVIDIA V100 GPUs 和 4 × 100 = 400 个工作机,每个工作机有 32 个 CPU 核心。对于魔方任务,我们使用 8 × 8 = 64 个 NVIDIA V100 GPUs 和 8 × 115 = 920 个工作机,每个工作机有 32 个 CPU 内核。[1]
这项任务需要大量的计算能力,让我重复一遍,大量的计算能力。光看这些数字就让我头晕。920x32 CPUs???都是为了控制这一手一个任务。然后它让你想知道…花了多少时间?嗯…
我们已经连续几个月以这种规模训练魔方策略,同时改进模拟保真度、ADR 算法、调整超参数,甚至改变网络架构。魔方训练所使用的经验的累积量大约是 13000 年,与 OpenAI Five [1]所使用的 40000 年处于同一数量级
嗯,这真是太神奇了。我们需要 13 000 年才能学会解魔方(其实不是从零开始解,而是雇佣一个解算师来解),nice:)。当然,支持这种计算的主要论点是人类有很长的进化时间,数百万年的进化。既然我们正在建造这些系统,我们应该能够通过分享我们的一些进化经验来加快它们的学习,即添加足够的先验知识,这样我们就不必等待 13000 年才能让我们的机器人学会如何拖地板。
事实上,即使在所有的训练之后:
用机器手解魔方还是不容易。我们的方法目前解决魔方的 20%的时间时,应用最困难的争夺的需要 26 面旋转。对于需要 15 次旋转才能撤销的更简单的加扰,成功率是 60%。[1]
结论
总而言之,我认为 OpenAI 的贡献在某种意义上是相关的,它显示了通过一些聪明的工程技术,计算能力可以带给我们多远。实际上,在无限计算能力的假设下,你可以解决任何问题。有趣的是,随着处理能力的提高,我们正在实现什么。
另一方面,我不得不提到,这种研究是不可持续的,也许处理这么多数字来解魔方是不合理的,而且是多余的。 13000 年,64 个 GPU,训练几个月,这些数字都得往下走。
[1]
参考文献
[1]OpenAIhttps://openai.com/blog/solving-rubiks-cube
基本 k 近邻
初级 ML
最直观的 ML 模型
有时在数据科学中,你会发现自己拿起一个导弹发射器就是为了杀死一只蚂蚁。
不过,在这种情况下,我们将讨论可能是最直观的机器学习算法。然而,不要被愚弄了,尽管它很简单,kNN 算法在某些情况下仍然非常有效。
一些快速注释:
首先,kNN 是一种非参数算法,这意味着它不假设您的数据遵循任何特定的分布。另一个很酷的事情是,它可以执行分类和回归任务,这两个我们将在这篇文章中触及。
直觉
首先,我们将使用一个数据集的简单表示来说明我们将如何使用 kNN 来执行一个分类任务。
设洋红色为 A 型,黑色为 b 型。这些点将组成给定的数据。假设蓝色是我们希望根据给定数据进行分类的数据点。
为此,我们将选择一个值 k ,它将是与我们的新数据点“最相似”的点数。
在这个二维例子中,我们将选择我们的相似性度量作为欧几里德距离。
因此,例如,如果我们让 k=2 ,那么我们将寻找与我们的新数据点最相似的 2 个点。如果我们用距离来表示,我们会寻找最近的两个点。
The red line touches precisely 2 points.
之后,我们计算每种类型的数据点在 k 个最近点的集合中所占的比例。然后,我们选择具有最高比例的类型,并将我们的新数据点分配给该类型。
在我们的例子中,最近的两个点都是黑色的。
Prop of black = 2/2
Prop magenta = 0/2
因此,我们将把我们的新数据点归类为 b 类。
另一方面,如果我们选择 k 为 8,我们将:
Prop of black = 3/8
Prop magenta = 5/8
在这种情况下,我们会将新的数据点分配给类型 a。
回归设置
在这种情况下,我们在很大程度上遵循同样的想法。
例如,如果我们要使用 kNN 来预测房子的价格,我们可能有如下设置:
我们希望找到 k 个最相似的点,并使用这些点的响应值的平均值作为所讨论的新数据点的预测值。
如果我们让 k 为 6,并且我们想要使用这个数据集来预测一个有两个卫生间的房子的价格,那么最相似的数据点将首先是其他有两个卫生间的房子,然后是有一个和三个卫生间的房子。
实际上,相应的预测价格值是洋红色点的平均价格。得到的预测是蓝点。
k 的选择
正如我们所见,K 的选择确实很重要。
请注意 K 值如何在数据没有任何变化的情况下改变模型的性能。任何这样的变量被称为超参数。
的确超参数优化本身就值得一整篇帖子。
然而,出于本文的目的,我们将只提及网格搜索算法。
内容如下:
- 选择一组超参数值
- 使用这些值中的每一个值来训练模型
- 评估每个模型的性能,并选择导致误差最小的值。
这是一个关于 k 值增加时,这个过程的大概情况。
Generic Graph Showing How Test Error(Magenta) and Training Errors(Blue) Change over 1/K
最后的想法
首先,kNN 受到维数灾难的困扰,因此随着输入变量数量的增加,kNN 可能会越来越困难。值得考虑使用降维技术来解决这个问题。
此外,kNN 需要适当缩放的数据。换句话说,您可能必须对数据进行归一化,因为测量值之间的单位差异会严重损害模型的有效性。
另一件需要考虑的事情是,只要数据中的真实关系符合参数模型的假设,线性回归等参数方法往往会优于 kNN 等非参数方法。有趣的是,在一些不遵循所有假设的数据上,参数方法甚至可能比非参数方法表现得更好——所以不要排除它们!
总之,kNN 理解和实现起来相对简单,因此它是一个很好的方法,可以作为其他技术的基准。
我希望你喜欢这本书,并发现它在某种程度上是有用的,无论是学习新的东西还是刷新已经存在的东西。
我本人是数学金融专业的应届毕业生,所以我既是一名教师,也是一名学习者。
也就是说,我非常乐意接受任何建议、更正或你在阅读这篇文章时想到的任何一般性反馈。
请随时在 LinkedIn 上与我联系—
[## 约万·梅德福德-加拿大滑铁卢大学| LinkedIn
查看约万·梅德福德在全球最大的职业社区 LinkedIn 上的个人资料。Jovan 的教育列在…
www.linkedin.com](https://www.linkedin.com/in/jovanmedforddataanalyst)
如果你愿意,你也可以在 Twitter 上关注我—
约万·梅德福德的最新推文(@JovanMedford)。一点特别的东西🤯|数学、金融和科技作家…
twitter.com](https://twitter.com/JovanMedford)
使用 Docker 容器在本地运行 Amazon SageMaker 笔记本
Photo by Aleks Dorohovich on Unsplash
A mazon SageMaker,AWS 的云机器学习平台,由 4 个主要产品组成,支持数据科学工作流程中的不同流程:
Source: https://docs.aws.amazon.com/sagemaker/latest/dg/how-it-works-mlconcepts.html
- 真相:大规模按需数据标注服务的托管服务。
(生成示例数据,用于监督算法) - 培训:培训和调整任何规模模型的托管服务。
(训练一个模型) - 推理:托管预建模型并对新数据运行推理的托管服务。
(部署模型) - 总而言之,Notebook:AWS 托管的服务器,供数据科学家访问和管理上述 3 项功能以及许多其他数据科学任务。
虽然托管的笔记本服务提供了一种非常方便的方式来获得与 Amazon SageMaker 一起工作的完整服务器,但在许多情况下,出于成本、访问便利性或“可定制性”的考虑,需要进行本地设置。
在这篇文章中,我将详细介绍本地托管的笔记本 Docker 容器背后的动机,并描述已经复制的 Amazon SageMaker 笔记本实例的各种功能。
这篇帖子的目标读者是正在使用或计划使用亚马逊 SageMaker 的数据科学家和机器学习工程师。对 Amazon SageMaker 及其笔记本实例的基本了解加上 Docker 的知识将是有用的。
TL;速度三角形定位法(dead reckoning)
对于忙碌的人,这里有一个快速总结:
- 托管的 SageMaker Notebook 实例预构建了许多重要功能,包括一套全面的工具和库、具有最新机器学习框架的多个内核、GPU 支持、Git 集成和许多真实世界的示例。
- 尽管如此,它需要钱,要求所有数据都在线上传,需要互联网接入,特别是 AWS 控制台登录,并且很难定制。
- 为了克服这些缺点,我创建了一个 Docker 容器,它提供了一个类似的设置,可以在任何笔记本电脑/台式机上本地使用。
- 复制的功能包括完整的 Jupyter 笔记本和实验室服务器、多个内核、AWS & SageMaker SDKs、AWS 和 Docker CLIs、Git 集成、Conda 和 SageMaker 示例选项卡。
- AWS 托管的实例和本地容器并不相互排斥,应该一起使用来增强数据科学体验。
Docker 图片的完整源代码存放在 Github 上:https://github.com/qtangs/sagemaker-notebook-container
Docker 图片已经发布到 Docker Hub:https://hub.docker.com/r/qtangs/sagemaker-notebook
在这篇文章中,
我将探索:
- 为什么我们首先需要一个笔记本实例?
- 为什么我们需要本地笔记本容器?
- 复制了哪些功能?
- 缺少哪些功能?
- 如何开始使用容器?
为什么我们首先需要一个笔记本实例?
在探索本地实例之前,让我们深入了解一下 Amazon SageMaker 笔记本实例提供的好处:
- 完整的按需系统:对于一个不怎么处理基础设施的数据科学家来说,这是开始使用 Amazon SageMaker 最简单的方法。使用 AWS 控制台,只需点击几下鼠标,您就可以访问配备了最常用库和工具的综合系统。
- 多个机器学习内核:Notebook 实例提供了各种内置内核,包括标准的 Python 2 和 3,流行的框架如 TensorFlow、MXNet、PyTorch 和 Chainer,以及其他运行时如 R、PySpark。
- 适用于不同工作负载的多种机器规模:您可以选择最基本的多用途实例类型,如 t2、t3 或 m4、m5、计算优化型(r4、r5)以及强大的基于 GPU 的类型(p2、p3)。
- 使用 GPU 机器的弹性推理:虽然使用 p2,p3 产生 GPU 驱动的性能提升,但是它们很贵。相反,您可以附加一个额外的弹性推理实例(eia1 类型)来使用 GPU 训练和测试您的模型,其成本只是 p2、p3 的一小部分。
- 安全性:默认情况下,笔记本实例是安全的,您需要登录 AWS 控制台才能访问它。
- Git 集成:您可以将 Notebook 实例与 Git 存储库(由 AWS CodeCommit 或 Github 或任何其他 Git repo 托管)相链接,以便对您的所有工作进行代码版本控制。如果你在团队中工作,这一点尤其重要。
- 大量示例:为了让你快速入门,AWS 在每个实例中都嵌入了大量示例,大多数来自 Github 上托管的 AWS 示例。只需很少的努力,您就可以将一个示例的完整源代码导入到您自己的实例中。
为什么我们需要本地笔记本容器?
尽管 AWS 托管的笔记本实例有很多好处,但是本地笔记本容器也有一些缺点。以下是本地笔记本容器的一些好处:
- 降低成本:运行一个 AWS 托管的实例要花钱;此外,还没有办法使用 spot 实例,它通常用于降低 EC2 实例的成本。运行本地容器不需要任何成本。
- 易于使用本地数据:由于 SageMaker 笔记本实例运行在云中,它只能访问在线数据。任何本地数据都必须首先上传到 S3 或其他在线存储器。本地容器不需要这样,它可以使用简单的 Docker 卷挂载。
- 跳过 AWS 控制台:访问 AWS 托管的实例需要登录 AWS 控制台,有 12 个小时的超时,这意味着每天至少要登录一次。使用本地容器,您只需配置一次 AWS 凭证,之后就不再需要登录了(除非需要访问 S3 或其他 AWS 服务)。
- 离线访问:本地容器的另一个优点是,你可以在没有互联网连接的情况下随时访问它,尤其是当你想专注于数据清理、特征工程、数据分析等等的时候。不需要培训服务器的功能。
- 定制:虽然 AWS 提供的 Notebook 实例已经包含了许多通用的库和工具,但是可能仍然需要针对特定的用例进行进一步的定制。SageMaker 通过生命周期配置和直接终端访问实现了这一点。然而,这有时会感觉受到限制,尤其是需要 shell 脚本知识。对于本地容器来说,能够使用数据科学家团队需要的所有工具轻松配置 Docker 映像是一个优势。
- 灵活性:有了 Docker 映像,一组数据科学家可以决定将其集中托管在一个高容量服务器中,或者设置笔记本实例集群。选择是无限的。
注意:AWS 托管的实例和本地容器并不互斥。您可以同时使用两者,如果您正确设置了 Git 集成,它们可以同步,这样您就可以在日常工作的两种选择之间无缝切换。
复制了哪些功能?
本地 Docker 容器的主要目的是尽可能多地维护 AWS 托管的实例的最重要的特性,同时增强本地运行能力的体验。以下是已复制的功能:
Jupyter 笔记本和 Jupyter 实验室
这只是从 Jupyter 的官方 Docker 图片中截取的,做了一些修改以匹配 SageMaker 的笔记本设置,包括:
- 将默认用户命名为
*ec2-user*
,并允许无密码*sudo*
访问。 - 允许定制 Miniconda 和 conda 版本。
- 跳过 Jupyter 集线器
- 将笔记本目录设置为
*/home/ec2-user/SageMaker*
多核
使用 Conda environments ( *conda env create*
)创建多个与 SageMaker 内核名称相匹配的内核。例如:
*conda_python2*
*conda_python3*
*conda_tensorflow_p36*
内核列表是动态的,即 docker 映像可以包含一个或多个内核。它是在构建 Docker 映像时由参数*CONDA_ENVS*
设置的。最初支持的 Conda 环境包括*python2*
、*python3*
、*tensorflow_p36*
、*mxnet_p36*
。通过在*base/utils/envs*
文件夹中添加 Conda 环境文件,可以简单地创建额外的内核。
AWS 和 SageMaker SDKs
每个内核都包括 AWS Boto3 SDK 和 SageMaker SDK。这对于所有与 AWS 服务交互的 Python 代码都是必不可少的,包括 SageMaker 的培训和部署服务。
AWS CLI
AWS CLI 是为与 AWS 交互的 shell 脚本安装的。
注意:AWS SDK 和 CLI 都需要在主机中配置一次 AWS 凭证。
Docker CLI
许多 SageMaker 示例使用*docker*
来构建用于训练的定制图像。我们没有在 Docker 上安装一个完整的 Docker,这是一个复杂的操作,而是利用了主机的 Docker 引擎。为了实现这一点,我们在 Docker 映像上安装了 Docker CLI,并依靠主机的 Docker 套接字来连接主机的 Docker 引擎。这是通过在运行容器时包含*-v /var/run/docker.sock:/var/run/docker.sock:ro*
来实现的。
注意:在 Windows 上,将挂载更新为:
*-v //var/run/docker.sock:/var/run/docker.sock:ro*
。
Jupyter 实验室中的 Git 集成
安装 Git 是为了允许直接从容器访问 git。此外,jupyterlab 上安装了 jupyterlab-git 扩展,用于与 git 进行快速 GUI 交互。
康达标签
就像 AWS 托管的实例一样,基于 Docker 的实例包含一个 Conda 选项卡来管理 Conda 环境。
注意:虽然这是为了模拟实际情况,但是不建议您在这里对 Conda 环境进行修改。相反,更新
*base/utils/envs*
下相应的 YAML 文件并重建 Docker 映像,这样您的更改就会被记录下来并可以与其他人共享。
SageMaker 示例选项卡
AWS 提供的所有 SageMaker 示例都与简单的 2-click 复制功能一起反映在 Docker 映像中,因此您可以轻松地使用现有示例并进行尝试。其他例子(来自 fast.ai 和 PyTorch )还没有包括在内,但将来会包括在内。
缺少哪些功能?
GPU 支持
目前,该容器仅为 CPU 工作负载而构建。对于任何使用 GPU 的本地培训和测试,您必须使用 AWS 托管的实例。注意,如果您使用 SageMaker 的培训作业运行 GPU 驱动的培训,那么您不需要本地容器上的 GPU。
其他内核
使用 Conda 可以很容易地添加其他基于 Python 的内核。然而,对于 R 和 Spark 运行时,未来还需要做更多的工作。
局部训练和推理
使用 AWS 托管的实例,您可以使用 SageMaker 的本地模式在该实例上运行训练和推理。目前,Docker 容器没有为此而设置。将来,将添加网络配置来支持这一点。
使用最新的 SageMaker 设置自动更新
目前,每当 SageMaker Notebook 实例更新时(新的 SageMaker 版本),内核配置都需要手动更新。将来,这些可以使用 CloudWatch 事件和 AWS Lambda 函数自动更新。
Python 库
为了保持 Docker 映像尽可能精简,许多库没有包含在给定的内核中。如果您需要容器中的某些库,您可以在*base/utils/envs*
文件夹中使用自定义环境 YAML 文件构建自己的容器。在未来,我的目标是使它更容易定制。
其他工具
一些工具,如 nbdime 、Jupyter Notebook Diff 和 Merge 工具以及 plotlywidget (一个开源的、用于 Python 的交互式图形库)应该会在未来被集成。
如何开始使用容器?
可以在 Github 库找到说明:https://github.com/qtangs/sagemaker-notebook-container
摘要
亚马逊 SageMaker 的笔记本实例是 AWS 云机器学习平台的重要组成部分。
在 Docker 容器映像中复制它有望进一步简化对 SageMaker 世界的访问。
在未来的帖子中,我将继续关注使用 Amazon SageMaker 的机器学习基础设施,以及我们如何应用最佳实践来简化和巩固这些基础设施组件。
感谢您的阅读。请在下面评论分享你的想法。
这项工作的完整项目托管在Github上。
用一个命令在 AWS 上运行深度学习容器
有许多公开可用的 Docker 图像,如 TensorFlow 、 PyTorch 、 Jupyter Docker Stacks 或 AWS 深度学习容器,可用于训练深度学习模型。
有了 Spotty 你只需要一个命令就可以在 AWS 上运行 Docker 容器。Spotty 为您管理所有必要的 AWS 资源,包括卷、快照和 SSH 密钥,将本地项目与实例同步,并使用 tmux 将远程进程从其终端分离。
你所需要的只是在你的项目的根目录下有一个名为 **spotty.yaml**
的配置文件。
装置
要求:
使用 pip 安装或升级 Spotty:
pip install -U spotty
配置文件
一个配置文件描述了 EC2 实例的参数和 Docker 容器的参数,这些参数将被用作项目的环境。这里有一个例子:
有了上面的配置,Spotty 将在 us-east-2 (俄亥俄州)地区运行一个按需 p2.xlarge 实例。随意更改这个配置:例如,您可以将参数image
更改为pytorch/pytorch:latest
来运行 PyTorch 容器。
如果您想启动一个 Spot 实例,而不是一个按需实例,请删除onDemandInstance
参数。要找到所选实例类型的最低价格区域,使用spotty aws spot-prices -i <INSTANCE_TYPE>
命令。
在文档中阅读更多关于配置的信息。
启动容器
一旦项目目录中有了一个spotty.yaml
文件,就可以使用下面的命令启动容器:
spotty start
该命令将启动一个 EC2 实例,将本地项目与该实例同步,并运行容器。
使用spotty ssh
命令连接到容器。
不要忘记稍后使用 **spotty stop**
命令停止实例!
AWS 深度学习容器
AWS 深度学习容器是预装深度学习框架的 Docker 映像,针对最高性能进行了优化:
AWS DL 容器包括对流行框架(如 TensorFlow 和 Apache MXNet)的最新版本的 AWS 优化和改进,以及为云中的训练和推理提供最高性能的库。例如,AWS TensorFlow 优化通过显著改进的 GPU 扩展使模型的训练速度提高了一倍。
Docker 图片在亚马逊 ECR 有售。在这里你可以找到一个图像 URL 列表,可以在一个不稳定的配置文件中使用。
要运行 AWS DL 容器,实例应该能够访问 Amazon ECR:
- 使用
managedPolicyArns
参数将arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess
策略附加到实例角色。 - 在容器运行之前使用
commands
参数登录 Amazon ECR:$(aws ecr get-login --no-include-email --region us-east-2 --registry-ids 763104351884)
。
确保图像名称中的区域和登录命令中的区域与 **region**
参数匹配。
结论
Spotty 是一种使用 Docker 容器在 AWS 上训练深度学习模型的快速简便的方法。它将节省您管理 AWS 资源的时间,并通过将项目与实例同步、运行自定义远程脚本和使用 tmux 分离远程进程来帮助工作流。
如果你喜欢这篇文章,请在 GitHub 上启动 项目,并与你的朋友分享这篇文章。
运行更多的特技播放
[Via hence-the-boom on Unsplash](http://Photo by HENCE THE BOOM on Unsplash)
受穆罕默德·萨努的启发,对 2009-2019 年美国国家橄榄球联盟特技表演进行了分析
介绍
足球中的恶作剧是这项运动中最有趣的部分之一。双逆转,假摔,跳蚤闪烁通常会成为亮点。它们在本质上是高度变化的:要么你抓住防守放松警惕并轻松触地得分,要么你让你的跑卫把鸭子扔进双包并把球放在银盘子里给对方。对于任何一个经常看足球比赛的人来说,特技表演的高变化性是直观的。可能不直观的是它们的实际价值。直到最近,公众还不容易获得客观评估特技表演所需的数据。感谢罗恩·尤尔科的出色工作,以及本·鲍德温和 Github 用户@德里克 97 的精彩教程,任何像我这样的笨蛋都可以花几个小时分析高飞在 10 年期间发挥的价值。
预期增加的点数(EPA)
你如何捕捉一部戏的价值?显然,在几乎所有情况下,50 码的完成比 2 码的跑更有价值。然而,第一次 4 码跑比第三次 1 码跑更有价值吗?那是一个很难准确回答的问题。然而很明显,并不是所有的码都是平等的。随着时间的流逝,结束半场对抗防守的传球可能会增加 30 码。所做的只是填充统计数据。任何 NFL 教练都宁愿在关键情况下进行第三次向下转换,不管多短。Ron Yurko 撰写了一篇论文,详细介绍了预期加分指标。在论文中(见此处),他能够确定一个球队在比赛中任何一点的得分。如果在一次游戏之后,预期点数度量较高,则该玩家增加预期点数。当然,诸如麻袋或拦截之类的游戏会导致负面的 EPA。
显然,90 码以上的进攻型打法有最高的 EPA,红区失误有最差的 EPA。以下是数据集中排名前五的 EPA 行动:
Description (3:15) (Shotgun) B.Roethlisberger pass deep middle to J.Smith-Schuster for 97 yards, TOUCHDOWN.
EPA 9.5
Description (10:06) (Shotgun) C.Johnson up the middle for 91 yards, TOUCHDOWN.
EPA 9.3
Description (7:44) (Shotgun) C.Palmer pass short middle to M.Floyd for 91 yards, TOUCHDOWN.
EPA 9.2
Description (8:51) (Shotgun) P.Mahomes pass deep middle to D.Robinson for 89 yards, TOUCHDOWN. PENALTY on KC-D.Robinson, Taunting, 15 yards, enforced between downs.
EPA 9.1
Description (11:51) (Shotgun) D.Carr pass deep middle to A.Cooper for 87 yards, TOUCHDOWN.
EPA 8.9
你明白了。下面是倒数 5 名:
Description (12:14) (No Huddle, Shotgun) M.Vick to WAS 10 for -6 yards (R.Kerrigan). FUMBLES (R.Kerrigan), touched at WAS 10, RECOVERED by WAS-D.Hall at WAS 25\. D.Hall for 75 yards, TOUCHDOWN. Lateral batted by 91 - Kerrigan The Replay Assistant challenged the backward pass ruling, and the play was Upheld.
EPA -12.8
Description (11:14) (Shotgun) J.Tuel pass short right intended for T.Graham INTERCEPTED by S.Smith at KC 0\. S.Smith for 100 yards, TOUCHDOWN.
EPA -12.7
Description (6:05) (Shotgun) M.Cassel sacked at DEN 25 for -17 yards (M.Haggan). FUMBLES (M.Haggan), RECOVERED by DEN-J.Hunter at DEN 25\. J.Hunter for 75 yards, TOUCHDOWN.
EPA -12.1
Description (2:51) M.Vick pass short left intended for B.Celek INTERCEPTED by P.Robinson at NO 1\. P.Robinson for 99 yards, TOUCHDOWN. PENALTY on PHI-M.Vick, Low Block, 15 yards, enforced between downs. The penalty for a low block during the interception return will be assessed on the ensuing kickoff.
EPA -12.1
Description (7:50) (Shotgun) E.Manning pass short left intended for H.Nicks INTERCEPTED by B.McCann at DAL -1\. B.McCann for 101 yards, TOUCHDOWN.
EPA -12.1
环保局是一个有趣的事情,因为在进攻中,它可以大于触地得分。这是有道理的,因为如果你在自己的端区防守,你预计 1)不会在一次击球中得分,2)由于场地短,另一个队更有可能在下一次击球中得分。它也可以是-12,因为在红区 1)你预计平均得分约为 5 分,2)防守队的下一次控球应该是在开球后,可能是在他们自己的半场。
特技表演
现在我们有了一个衡量一部戏价值的标准,我们可以开始将不同类型的戏分组并进行比较。比如摘自@Deryck97 上面链接的教程,2018 年 rush vs. pass 打法对比:
Both the mean and the standard deviation of pass plays are higher.
那么,使用 nflscrapR 数据,我们如何知道一个游戏是否是一个技巧游戏?不幸的是,没有简单的指示变量来表示“特技播放”。相反,我们必须想出创造性的方法来识别它们。
假踢
最容易开始的比赛是假踢。大部分剧本描述都包含了剧本的形成。如果一场比赛被标为“踢阵型”或“射门阵型”,但比赛类型是跑动或传球,那么它很可能是假球。我不得不手动过滤一些其他类型的游戏,比如当玩家错过了一个快照并中止游戏时,但这很容易。以下是 python 代码:
punts = df.loc[df.desc.str.contains('punt|Punt')]
fake_punts = punts.loc[(punts['play_type']=='run')|(punts['play_type']=='pass')]# drop enforced penalties
fake_punts = fake_punts.loc[fake_punts.penalty!=1]# drop non enforced penalties
fake_punts =fake_punts.loc[~fake_punts.desc.str.contains('Penalty')]# drop punter mishandles fake_punts=fake_punts.loc[~fake_punts.desc.str.contains('Aborted|Shotgun')] # drop plays where punter intentionally runs out of end zone (not likely to fake a punt in own redzone)
fake_punts = fake_punts.loc[~fake_punts.desc.str.contains('SAFETY
')] # drop plays without description
fake_punts.dropna(subset=['desc'], inplace=True)
然后,我将同样的过滤器应用到以平手结束的游戏中。最终,在大约 22,000 次试踢(常规赛和季后赛)中,我发现了 177 次假球。不到 1%的假率!
让我们也想出一些基线。我将展示汤姆·布拉迪的平底船的平均 EPA、传球的平均 EPA、跑动的平均 EPA 和传球的平均 EPA🐐。
哇!假船票的价值大约是汤姆·布拉迪船票的 7 倍。当然,EPA 的标准偏差也要高得多。非假平手的 EPA 的标准偏差是 1.16,而假平手的标准偏差是 3.17。很明显,如果你造假失败,那么你就有一个很大的负面 EPA。
假球也一样有价值吗?根据我简单的分析,没有。扔出失球,糟糕的抢断,点球等等——假球的 EPA 是 0.06。这比你的平均通过率高,但不是超级令人兴奋,因为我是在伪造的投注号码后跑的。我相信这是因为你放弃了一个投篮机会。如果你在一个假动作中失败了,你就会失去一些你原本可以从尝试中得到的分数。如果你所做的只是得到第一次得分,你甚至不会得到那么多预期的分数。他们有一个类似假平底船的大标准差。因此,如果你落后几个点,你可能还是会更好地掷骰子,用一个假的。
特技跑/传球
不幸的是,技巧跑位和传球并不容易区分。作为免责声明,本文的重点是从 NFL 的比赛数据开始。我不是在写关于假戏的论文。因此,虽然我竭尽全力成功地隔离了特技播放,但我并不声称 100%准确或最好的可能过程。
让我们从传球开始。我开始时抛出了明显的战术(点球,两分转换尝试)以及我已经分析过的战术(踢法)。我也放弃了具有极端获胜概率的策略(<5% & > 95%的获胜概率)。这里的想法是避免孤注一掷的后期横向游戏,如钩和后者。
然后,我在游戏描述中搜索了数据集中尝试次数少于 30 次的玩家的跳蚤闪烁和传球。跳蚤闪烁覆盖了 QB 的侧边,理论上,任何其他的技巧传球都会涉及到一个通常不会传球的跑卫或宽接球员的侧边。最后,我把那些只出现了很短时间并被我的过滤器过滤掉的 QB 列入黑名单。他们很容易找到,因为整个系列的戏剧都在描述中突出了出来。
快到了。对于跑位戏,我分离出了有横向或反向描述的戏。幸运的是,没有太多防守球员在摸索恢复后落后的情况。我最终得到了 180 个剧本的样本(手动删除了一两个奇怪的剧本)。我选择排除两点转换的尝试,所以不幸的是这一优点没有包括在内:
Two-point attempt starts at 0:43s
咻。结果如下:
我很惊讶地发现反转和横向跑动是如此的有价值!理论上,他们就像拥有一个传球能力是汤姆·布拉迪两倍的球员。因为跑位通常没有传球有价值,所以我期望技巧传球有更高的 EPA。特技通行证仍然是有价值的,但是许多 EPA 仅仅是由跳蚤市场驱动的。事实上,只计算跑锋和 WR 传球(n=194),EPA 是 0.024——比正常传球还糟糕!跳蚤-闪烁,当单独分组时(n=66),EPA 为 0.3——非常有价值。我估计你非 QB 扔拦截的风险太高了。
理论与实践
当然,如果一个团队总是假摔,那么防御将会调整,EPA 将会下降。这里恰当的批评是,正是这出戏的新颖之处让它们变得有价值。尽管如此,我的分析表明,球队肯定应该运行更多的逆转和假摔。
换一种说法,我认为风险承受能力并不是避免假踢或转身的好理由。这里打个比方。在 21 点中,打到 16 点感觉不舒服。你经常崩溃,觉得自己很愚蠢。然而,这几乎总是数学上最好的玩法,因为庄家通常会赢 16。当你住在 16 楼的时候,通常你只是给了房子额外的优势。
就像打 16 分一样,在自己的场地假装踢了一脚,然后失败了,这可能感觉很愚蠢。然而,这在数学上是有利的。有足够的空间尝试超过 1%的时间。
同样,我认为很重要的一点是,所有这些特技都有很高的标准差。这表明,即使这些打法的 EPA 与正常打法相同,有时当一支球队被击败时,尝试它们仍然是有利的。如果你有 80%的胜算,游戏理论说不要尝试一系列疯狂的游戏,这些游戏可能会立即逆转胜算。出于同样的原因,当团队遥遥领先时,他们会聪明地跑得更快。另一方面,如果你的胜率是 30-40 %,那么你的球队可能需要一个假摔或射门来达到 55%的胜率。让我们看看团队实际上是怎么做的:
Average Win Prob at time of punt attempt: 0.462
Average Win Prob at time of fake punt attempt: 0.398
Average Win Prob at time of field goal attempt: 0.578
Average Win Prob at time of fake field goal attempt: 0.561
Average Win Prob at time of run attempt: 0.559
Average Win Prob at time of trick run attempt: 0.534
Average Win Prob at time of pass attempt: 0.490
Average Win Prob at time of trick pass attempt: 0.557
似乎只有在困难的情况下,球队才会正确地使用假摔。投篮、技巧传球和技巧跑动都是在球队(平均)已经领先的情况下进行的。这是次优的,可能是因为教练太保守了。
当然,尽管如此,还是有一些技巧永远不是最佳的:
自从我看到一条令人印象深刻的 Mohamed Sanu 统计线,这篇文章就一直在我的脑海中萦绕。我一定会大声喊出来。在 Sanu 传球的 8 次尝试中,他平均每场比赛得 2 分!这太疯狂了。这是 8 个通行证:
(14:53) (Shotgun) Direct snap to M.Sanu. M.Sanu pass deep middle to A.Green for 73 yards, TOUCHDOWN.
(12:48) M.Sanu pass deep right to G.Bernard pushed ob at CLE 9 for 25 yards (B.Mingo). {Ball lateraled from Dalton to Sanu} Cleveland challenged the pass completion ruling, and the play was Upheld. (Timeout #2.)
(1:03) M.Sanu pass deep right to B.Tate pushed ob at ATL 24 for 50 yards (D.Lowery).
(:06) (Shotgun) M.Sanu pass short left to A.Dalton for 18 yards, TOUCHDOWN. {Dalton pitched out to Sanu, who then passed to Dalton.}
(3:28) (Shotgun) M.Sanu pass short right to A.Green to TB 27 for 11 yards (B.McDougald). #14 lateral to #12
(12:44) Direct snap to M.Sanu. M.Sanu pass deep left to Ju.Jones for 51 yards, TOUCHDOWN.
(8:56) T.Sambrailo reported in as eligible. Direct snap to M.Sanu. M.Sanu pass incomplete deep left to J.Jones.
(8:55) (Shotgun) M.Sanu pass short right to M.Ryan for 5 yards, TOUCHDOWN.
所以,还有其他变量在起作用。如果你的一个外接球手有一个金色的深球,那么数学就简单多了。这段视频让它更加令人印象深刻:
综上所述,NFL 球队应该更经常地进行特技表演。别的不说,就是好玩。代码可以在这里找到。
*取决于许多因素
如何管理一个出色的数据科学团队
© Blake / Adobe Stock
操作框架
从一开始就做好!
我们正在见证对数据科学家的需求爆炸式增长——“21 世纪最性感(也最受追捧)的工作”。大学正在迅速创建数据科学项目。学生们争相报名。不断听到数据科学如何改变业务的高管们都遭受了严重的 FOMO。在这种爆炸中,隐藏着对没有任何成功计划的团队梦想破灭的伤害。
这是从一开始就应该做的。
“快而不急” —约翰·伍登
仅仅寄希望于新的数据科学家能够从你的数据宝库中发掘出真知灼见是不现实的。失败的几率高得惊人— 行业专家认为只有六分之一的大数据项目会成功。一些原因是一般性的——缺乏领导、团队合作、支持和沟通。有些是数据科学特有的,比如有缺陷的数据架构、无效的遗留技术以及团队内部的技能差距。
两位作者(他们曾在 Credit Sesame 共事)在数据科学领域共同度过了半个多世纪。我们已经看到该领域从“管理科学”(科学原理,包括大量使用数据和分析,应用于商业)发展到“商业智能”、“商业分析”,并最终发展到今天的“数据科学”。我们使用分析技术创建了第一个直接小型企业小额贷款机构,准确预测谁最有可能离开公司,并确定准确的时间点来展示任何给定客户最有可能购买的产品。在这篇文章中,我们提出了一个框架来增加你的努力取得成果的几率。
Data visualization of how food ingredients are connected [1]
框架(我们将以餐饮业为例)
数据科学是关于将原始成分(数据)转化为有用的东西(知识和见解)。餐饮业也认同这一首要原则。此外,数据科学和优秀餐厅中的成功团队也非常擅长三个要素:伙伴关系、领导力和赞助。
暂时用餐馆的比喻来说——一家成功的餐馆不全是厨师(甚至是名厨),而是“房子前面”(用餐空间)和“房子后面”(厨房)的合作关系。
向食客展示整个餐厅所能实现的目标的餐馆老板提供了领导能力来协调团队中每个人的激励。领导者知道团队需要什么样的技能组合(厨师、糕点师),并且清楚地知道团队的每个成员以及整个团队的伟大意味着什么。
最后,餐厅需要那些相信它能实现目标并愿意提供他们的赞助来实现目标的人的支持。
成功的活动流程
❶ 了解你的消费者——他们的偏好和对你服务的熟悉程度。
餐厅需要了解自己的食客。你的团队需要了解你的分析的内部消费者。
❷ 寻找、储存并正确准备高质量的食材。
餐馆从供应商那里购买食物原料,然后准备好并储存在小型冷藏箱中。您从数据库中提取数据,对其进行转换,然后将其存储在仓库中。
❸ 使用正确的技术和技能来创造让你的消费者满意的产品。 一个厨艺大师的技术是烹饪的。你是分析型的。
❹ 确保饭菜精美并及时送到。
出色的展示能吸引食客和消费者。
❺ 获得关于你的消费者如何享受你努力创造的东西的反馈。
优秀的团队拥抱持续改进。没有反馈,这是不可能的。
够理智了吧?但是你有没有发展你的分析过程来有效地完成所有这些活动?对于一个餐厅来说,连一项活动都完成不了,就意味着失败。数据科学团队也是如此。下面我们将描述与您的团队相关的每项活动。
© zinkevych / Adobe Stock
1 |了解你的消费者——他们的偏好和对你产品的熟悉程度。
理解——甚至预测——消费者的需求对于确保创造价值至关重要。但是,简单地理解你的分析性见解的消费者想要有价值的见解来帮助他们解决问题,就像知道食客想要一顿美味的晚餐——这是必然的。你得深入挖掘。
你的消费者分析能力如何?换句话说,他们的分析商数2是多少?他们能以什么形式消化自己的见解?他们是希望定期获得易于理解的见解,还是希望获得更大的、改变游戏规则的见解,这些见解可能需要更多的时间来开发,以及更精细的演示?如果消费者不懂得分析,你怎么能确保你提供的不仅仅是只是暂时满足对分析的渴望的空卡路里呢?
了解你的消费者对于了解洞察应该如何产生、产生什么以及产生的频率是至关重要的。这意味着发展强大的关系,以便更容易理解和预测他们试图解决的业务问题以及他们必须做出的决定。
© karandaev / Adobe Stock
2 |采购、储存并正确准备高质量的配料。
与餐馆不同,数据科学只有一个主要成分:原始数据。但是它有无限多的种类和口味,必须可靠地获得、准备和储存,就像餐馆餐具室里的配料一样。有些数据是脏的。其他数据非常容易损坏。所有数据应:
- 来源于数据库、数据湖和其他数据源。(想想农民、鱼贩和觅食者。)
- **已转换,**因此它们很容易用于提取-转换-加载(“ETL”)过程。(想想 prep 大厨。)
- 存储在数据仓库中。(想想步入式冰箱。)
3 |使用正确的技术和技能来创造一个让你的消费者满意的产品。
做这件事的最好的人是高技能、非常受欢迎的专业人士,他们从事接近艺术的工作。他们经常处于聚光灯下。最好的团队依靠他们取得成功。像顶级厨师一样,您的分析师也需要设备、空间和支持才能大放异彩。你需要满足他们不断发展和推动自己的欲望。你必须向你的厨师展示,如何确保他们做出的东西——尽管他们认为可能会很棒——会让你的消费者喜欢。Credit Sesame 的经验法则是,任何数据科学工作产品都应该易于实施,为我们的成员改善信用健康,并启发公司内所有的分析消费者。
Yuck v. Yum [3]
4 |确保你的产品被恰当地展示,被很好地组合在一起,并且被及时地交付。
你展示最终产品的方式可能会吸引或者排斥你的消费者。优秀的餐厅明白视觉外观的重要性— 多项研究表明,盘子里食物的外观会影响食客对味道的感知。
对于分析的消费者来说也是如此——明智地使用颜色,避免混乱,逻辑流程和有吸引力的图形一起工作来教育,也许还能激起进一步启发的欲望。有效的数据可视化和数据故事将吸引你的消费者,并帮助他们消化你的产品。
餐馆确保食客在汤热的时候得到汤,在冰的时候得到冰淇淋。同样,您的消费者应该及时收到他们的分析。分析的延迟——瘫痪可能会导致你的消费者不想使用或者不能使用的陈旧产品。
5 |获得关于消费者如何享受你努力创造的东西的反馈。
顶级餐馆老板知道哪些菜单最受欢迎。他们寻找留在盘子里的东西,或者更糟的是,送回厨房的东西。调查反馈、投诉、在线评论——餐馆老板利用所有这些来了解什么可行,什么不可行。有时候侦查对于发现问题是必要的。许多用餐者可能不愿意给出反馈,因为害怕冒犯他人或显得不知情。
同样,您需要知道您的工作产品的哪一部分被执行了?哪些部分没有被触及?你是否注意到对你认为最有价值的见解缺乏兴趣?是因为洞察力不够清晰,还是因为您的团队在开发洞察力时没有合适的业务环境?
成功=经验丰富的数据科学团队
您还需要以下调味元素来确保您的数据科学团队保持卓越。
- **合伙关系。**房子的正面和背面一定要配合好。例如,与数据架构师和数据工程师的密切关系意味着可以随时访问准备充分的数据。招聘团队站在你这边意味着你可以获得你需要的人才。与你的分析消费者建立密切的伙伴关系将有助于你的团队更好地了解他们的业务。
- **领导。**数据科学领导者应该推动为团队设定方向的愿景,并使团队与消费者保持一致。这一愿景应该清晰地向分析的消费者传达可以产生的价值。这种价值最终将来自团队通过数据科学从数据中释放价值的能力。例如,在 Credit Sesame,我们团队的愿景是通过数据科学释放我们数据的价值,从而改善信用健康。
- 赞助。强大的高管支持对于促进数据驱动的文化是必要的,在这种文化中,每个人都明白产生改变游戏规则的见解需要时间、资源和投资。赞助意味着数据科学家不太可能被视为只提供仪表盘和报告的快餐厨师,而不是推动战略的思想领袖。
Virtuous cycle of data science greatness
外卖食品
食客可以指望他们最喜欢的餐馆提供精心准备的美味佳肴。要引导您的数据科学团队走向伟大,请从那些伟大的餐厅中获得启示。
❶了解你的消费者的需求,他们的 AQ,和他们的业务。
❷使用正确的设备采集、存储和正确准备数据。(是的,觅食可能是必须的!)
❸使用正确的技术和技能来创造工作产品,愉悦和滋养你的消费者。避免空卡路里!
❹介绍你的作品,让它平易近人。迅速递送它。
❺得到反馈。如果不明确,寻找表明反馈的线索。回到第一点。冲洗,重复。
最后,再加入三种调味料来完成你的成功秘诀:
- 合作关系
- 领导力
- 赞助
想打造米其林 3 星数据科学团队?使用这个五步框架,加上上面的三种调料,你的团队将会持续地提供让你的消费者高兴的热辣、美味的商业见解。
参考
[1]图像功劳:“味道网的中坚力量。由 Yong-Yeol Ahn、Sebastian E. Ahnert、James P. Bagrow 和 Albert-拉斯洛 Barabási 在 Nature 杂志上发表的文章由 CC 于 3.0 授权。
[2]尼科·莫尔和霍尔格·胡尔根。(2018 年 4 月)。"利用数据实现业务影响:洞察价值链的全面视角。"数字麦肯锡。
[3]意大利面图的灵感:C. N. Knaflic,《避免意大利面图的策略》(2013),用数据讲故事。凌乱的意大利面图片致谢:何塞·路易斯·斯蒂芬斯 / 土坯股票。旋转的意大利面图片来源: denio109 / 土坯股票。
延伸阅读
关于作者
Raj DevRaj 是利用数据科学和分析技术做出人才和人员决策的倡导者。Raj 是 EleveneX 的管理合伙人。此前,Raj 是不可能食品公司的人力运营副总裁。在此之前,他曾在 Credit Sesame 和特斯拉担任高级管理职务。Raj 拥有耶鲁管理学院的工商管理硕士学位。
马修·拉斐尔森马修是一名管理顾问,他通过数据科学帮助公司增加收入。此前,他是一名高级财务主管,拥有 25 年应用定量建模和数据科学来启动和管理数十亿美元业务的经验。他是 ProbabilityManagement.org 大学金融应用系主任,拥有斯坦福大学商学院的工商管理硕士学位。
设计和图表由Corrina Reffof谜语创意 。