在 u 盘上共享交互式 Jupyter 仪表盘
当你从未想过要开发 web 应用程序时,如何向客户或同事交付交互式笔记本电脑…
许多数据科学可视化实际上是一次性的 web 应用程序,并不打算公开,甚至也不打算为私人用户提供基于云的服务。考虑到它们短暂的生命周期,锁定一个托管服务的基础设施(和安全风险)是不值得的。事实上,所采用的 web 技术实际上只是从云或互联网很重要的不同场景中“借用”来的。我们的可视化最初是用 web 风格的技术构建的,这只是偶然的……那么我们能不能改变我们的思维,让我们的头脑完全脱离云端呢?
您的概念验证数据科学项目的高潮是 Jupyter 笔记本中的美丽可视化。您甚至包括了一些滑块部件,以便您可以更改一些参数,并立即查看这对笔记本中间的绘图有何影响,以及您的模型的预测如何变化。
如果你能让你的客户在他们自己的时间里滑动滑块,你知道他们会完全理解你想要传达的东西——并为项目的其余部分开绿灯。
但是,让他们在自己的机器上访问您的可视化的最佳方式是什么呢?
一个简单的基于小部件的交互式笔记本
有一些很好的方法可以将笔记本发布为基于网络的云应用,包括 mybinder.org,如果你喜欢一切都公开的话。但是,如果您的笔记本使用的数据是机密的,并且您没有权限将其托管在任意基于云的服务上,该怎么办?
要求他们在自己的机器上安装 conda 并运行一系列终端命令来复制您的包环境,这将考验即使是最热衷于技术的客户的耐心。并且这些命令可能需要根据它们的操作系统和现有安装而变化。
简单的单个文件
你已经有了一个与客户共享普通文件的系统——也许 SharePoint 或 Dropbox 已经建立了协作,所以也许有一种方法可以利用这一点。
ContainDS Desktop 是用于 Windows 或 Mac 的软件,允许您在本地机器上运行隔离的 Jupyter 环境。现在,您可以将 Jupyter 工作区和软件包环境导出为一个独立的文件,这样就可以直接导入到在其他人的计算机上运行的 ContainDS Desktop 中,并向他们呈现已经在您自己的计算机上运行的确切环境和笔记本文件。
本文展示了如何创建一个交互式 Jupyter 可视化,然后将其导出并作为一个简单的文件与您的客户共享,这样他们就可以轻松地按预期运行它。
要安装 ContainDS Desktop 并启动一个简单的“容器”,为我们安装一些包和编写一些新笔记本做好准备,首先请遵循 ContainDS Desktop 入门教程。这也将指导您安装 Docker,它是由 ContainDS Desktop 在引擎盖下使用的。
新容器
如果您仔细阅读了入门教程,您应该已经拥有了一个新的 JupyterLab 环境,它应该在浏览器窗口中打开。如果您愿意或者继续使用现有的容器来创建一个新的容器,您可以使用它。
ContainDS Desktop 中的容器只是一个 Jupyter 包环境(例如,可以安装 numpy 和 pandas 的地方)和一个存放笔记本和其他数据的工作区。
在 ContainDS Desktop 中,单击“+ NEW”按钮查看一些可以用于新容器的起点。单击“最小笔记本”旁边的“选择”。
选择一个图像作为起点
在下一个屏幕上,将询问您希望如何存储工作区。为了确保您的笔记本文件可以轻松地从本地硬盘访问,请选择一个新文件夹—可能在您的个人文件夹中命名为“dsworkspace ”,但实际上这可以是您喜欢的任何位置。
指定存储工作区的文件夹
点击“创建”,然后新的容器将被启动,并在 ContainDS 桌面的左侧列出。如果需要先下载“最小笔记本”起点映像,可能需要一点时间。
容器现在正在运行
准备好后,点击“WEB”按钮启动 JupyterLab。
安装软件包
在 JupyterLab 中,单击终端图标打开一个新的命令 shell 选项卡。
要安装我们需要的软件包,请输入以下命令:
conda install -c anaconda numpy --yes
conda install -c anaconda ipywidgets --yes
conda install -c anaconda matplotlib --yes
jupyter labextension install @jupyter-widgets/jupyterlab-manager
在 Jupyter 终端标签中安装软件包
安装好所有东西后,重新加载 Jupyter 实验室浏览器窗口,确保新安装的 Javascript 正在运行。
写我们的笔记本
单击“+”按钮,这次单击“Python 3”图标打开一个新的笔记本选项卡。
将我们的样本笔记本中的单元格复制并粘贴到 GitHub 的这里。记住,粘贴代码后,按 shift+enter 键运行每个单元格。
我们完成了 Jupyter 演示
笔记本提供了一个滑块,用户可以选择参数‘t’的不同值。当您改变数值时,sin(t*x)
和cos(t*x)
图会根据系数‘t’移动。哇,这真的可以教人一些新的数学!如果你还没有遇到过,互动部件是 Jupyter 笔记本电脑的一个非常强大的可视化功能,可以真正让用户沉浸在数字中。
将 ipynb 笔记本保存为一个名为 Presentation.ipynb 的文件或任何适合您的文件。
导出为普通旧文件
好了,我们已经安装了我们需要的包,并创建了我们的交互式笔记本。现在我们来看这篇文章的要点。我们如何能直接与客户分享它,以便他们能在自己的机器上随心所欲地与之互动?
如果愿意,您可以关闭 JupyterLab 浏览器窗口。
回到 ContainDS 桌面应用程序,我们的容器仍然应该在左侧面板中突出显示。点击“共享”选项卡。“导出”子选项卡应该是可见的,要求一个文件夹位置。应该写入 containds 的文件。
设定共享文件的位置
你的下载文件夹的默认值应该没问题,所以只需点击“导出”。
在提交和导出容器时,您应该会看到一些输出。最后,保存的完整文件名。将显示“containds”文件。
在哪里。containds 文件已保存
分享给你的朋友!
最后一步保存的文件会很大(可能 5GB ),所以不能通过电子邮件发送。希望您已经设置了一个协作服务,可以用来共享。containds 的文件。如果你的组织批准,SharePoint,Dropbox,Google Drive 等都是合适的。或者,如果你想避开云服务,u 盘可能是最合适的。
您的收件人还需要安装 ContainDS Desktop。运行后,他们应该在“+新建”屏幕中单击“文件”选项卡。找到。包含您与他们共享的文件,然后单击“开始”。文件处理过程中会显示一些日志。
将 containds 文件导入到同事的机器中
一旦完成,容器将启动,ContainDS 桌面将向您显示新容器的日志屏幕。单击“WEB”在 JupyterLab 中打开笔记本,就像您离开时一样。
交互式 Jupyter 笔记本,就像我们保存它一样
您的同事或客户可以按照您的意愿与滑块进行互动!
结论
正如本文开头所讨论的,许多数据可视化首先并不真正适合 web 技术——我们在一次性应用程序中使用它们只是出于偶然和熟悉。
以上教程的重点是再现性——忠实地传输我们在自己的计算机上体验到的精确的计算环境、文件和数据。但是在这个过程中肯定有需要克服的缺点。
最明显的是,最终用户需要在他们自己的机器上安装一些软件:ContainDS Desktop,它也需要 Docker 在后台运行。
然后我们忽略了一个事实。containds 的文件本身是 5GB。
这些问题有潜在的解决方案。为了降低安装要求,值得注意的是 Docker 基于开源软件,可以简化并捆绑到 ContainDS 本身中——因此可能只需要一个安装程序,用户无需担心 Docker 是否在后台运行。
ContainDS Desktop 本身对于技术用户(如典型的数据科学家)来说是一个相对简单的 UI,但它比 Jupyter“web app”的非技术最终用户需要的功能更多。有可能建立一个精简的“容器浏览器”版本的软件,为最终用户简化事情。它还可以使用更友好的前端,如 Voilà ,这样最终用户就不需要担心代码单元格和通过笔记本按 shift+enter。
数据科学领域普及了这些类型的一次性 web 应用程序,随着学科范围的扩大,数据可视化工具也有了许多令人兴奋的发展。我期待听到您对本文中介绍的方法如何为您服务的想法。什么障碍阻止你与同事和客户轻松分享你的可视化?
关于 ContainDS Desktop 的任何问题或反馈,请通过我们的网站联系。
伯特模型嵌入没有你想象的那么好
面向多语言句子嵌入
由 Gaurav Baya 在 Unsplash 上拍摄的原始照片。由 Daulet Nurmanbetov 修改
我以前写过关于脸书的激光嵌入系统,意思相似的句子会有相似的向量嵌入。更重要的是,激光嵌入是多语言的,这意味着不同语言的句子将映射到同一个向量!
具有一个将相同意思的不同语言的句子映射到相同向量的嵌入系统是有利的。拥有这样一个系统将允许我们抽象出输入的语言,转而关注句子的意思。
这意味着,一旦我们将一个句子转换成一个向量,我们就可以建立一个下游模型,它可以在任何输入语言上工作,用于任何下游任务。
想找出有毒的句子?带有下游分类器的多语言嵌入模型将能够识别任何语言中的有毒句子。
在新闻文章中寻找交易信号?带有下游分类器的多语言嵌入模型将能够识别任何语言的交易信号。你明白了…
因此,让我们来看看 LASER 如何与英语句子相似性的其他模型进行比较:
结果在 English only STS 任务上,STS 是自然语言处理中句子意义相似度的竞争。越高越好。
上表显示了英语语言的基准。然而,激光嵌入不仅适用于英语,还适用于多种语言
随着 NLP 的所有最新创新,特别是 BERT 和多语言 BERT (mBERT ),人们可能会认为他们会放弃激光业务。然而,有趣的是,对于纯英语句子相似性任务,RoBERTa 和 mBERT 的表现不如 LASER。
从表中可以看出,会说多种语言的伯特和 same 罗伯塔在将意思相似的句子映射到同一个向量方面表现不佳。此外,当您混合不同的输入语言来计算相似性时,性能会进一步下降。
像 mBERT 这样的模型预测单个标记的向量值,而不是句子。由于语言中的词汇差异,这导致句子聚合与向量错位。意味着 mBERT 和其他预先训练的多语言转换器不适合开箱即用的跨语言句子相似性。
人们一致认为,mBERT 的输出是针对特定语言进行微调的,当比较不同语言的单词时,它们的向量有所不同。奇怪的是,在 Transformer 的早期层中,大约在 mBERT 的第 8 层,跨语言的向量彼此更加相似。
多语言嵌入的新范例
我们可以得到一个灵感来创造真正的多语言嵌入优于激光是一个蒸馏方法。看看像 DistilBERT 这样的模型,用它们作为灵感来创建我们的师生设置,在那里我们“强迫”多语言转换器产生跨语言的相同向量。为此,我们当然需要一个能够产生良好向量的教师模型。一个这样的候选是作为教师模型的纯英语句子 BERT (SBERT)模型。而且我们可以拿一个像 ALBERT 这样的大型多语言模型,作为学生使用。
这里的老师是斯贝特,学生是艾伯特或其他多语言转换者。图片来自使用知识蒸馏使单语句子嵌入多语言
上面的教师模型总是预测英语句子,而学生模型是多语言的,并且在给定外语输入的情况下“被迫”产生类似于英语的向量。意味着两件事:
- 向量空间跨语言对齐,即不同语言中的相同句子被映射到同一点
- 来自教师模型 M 的原始源语言中的向量空间属性被采用并转移到其他语言
现在,一旦我们有了训练设置,我们就可以获得用于翻译的大型平行文本数据集。即,相同的句子但是不同的语言,其中两个句子具有相同的意思(彼此的翻译)。
使用师生设置,现在我们可以强制艾伯特模型学习句子的“正确”向量嵌入。
这意味着在我们在足够数量的并行语言上训练模型之后,我们将教会 ALBERT 为任何语言产生相同的向量。一旦我们有了这个训练好的艾伯特模型,我们就可以直接用它来产生矢量嵌入。这是这个新训练的设置在多语言测试中的比较。
以下是 STS 任务中 10 种语言的向量相似度结果。
在表中,当在 SBERT 的监督下训练时,蒸馏使用开始胜过激光。我们可以看到,XLM-罗伯塔和姆伯特在跨语言句子相似性方面很弱。
外语语义搜索
让我们看看如何使用一个经过提炼的多语言转换器。
首先,让我们创建几个样本句子,我们想用它们来衡量语义相似度—
**Sample Sentences:**
'A man is eating food.',
'A man is eating a piece of bread.',
'The girl is carrying a baby.',
'A man is riding a horse.',
'An elderly man is enjoying dinner.',
'Friends sharing wine at a restaurant.',
'A woman is playing violin.',
'A child is learning to play a base guitar.',
'Two men pushed carts through the woods.',
'A man is riding a white horse on an enclosed ground.',
'A monkey is playing drums.',
'A cheetah is running behind its prey.'**Query Sentences:** 'A man is eating pasta.',
'Someone in a gorilla costume is playing a set of drums.',
'A cheetah chases prey on across a field.'
现在让我们把一些句子翻译成外语。我们将使用意大利语、法语、德语和俄语。这里是翻译的句子和问题—
**Sample Sentences:**
*'Un homme mange de la nourriture.',* #FR
'A man is eating a piece of bread.',
*'Das Mädchen trägt ein Baby.',* #DE
'A man is riding a horse.',
'An elderly man is enjoying dinner.',
*'Amis partageant du vin dans un restaurant.',* #FR
'A woman is playing violin.',
'A child is learning to play a base guitar.',
*'Due uomini hanno spinto i carrelli attraverso i boschi.',* #IT
'A man is riding a white horse on an enclosed ground.',
*'Una scimmia suona la batteria.',* #IT
'A cheetah is running behind its prey.'**Query Sentences:**
'A man is eating pasta.',
*'Кто-то в костюме гориллы играет на барабане',* #RU
'Ein Gepard jagt Beute über ein Feld.'
通过我们的多语言转换器运行语义搜索会产生即时结果—
**======================**
**Query**: A man is eating pasta.
**Top 3 most similar sentences in sample sentences**:
Un homme mange de la nourriture. (Score: 0.7051)
A man is eating a piece of bread. (Score: 0.6328)
An elderly man is enjoying dinner. (Score: 0.4780)
**======================**
**Query**: Кто-то в костюме гориллы играет на барабане
**Top 3 most similar sentences in sample sentences**:
Una scimmia suona la batteria. (Score: 0.3803)
A woman is playing violin. (Score: 0.3392)
A child is learning to play a base guitar. (Score: 0.3148)
**======================**
**Query**: Ein Gepard jagt Beute über ein Feld.
**Top 3 most similar sentences in sample sentences**:
A cheetah is running behind its prey. (Score: 0.3890)
A man is riding a white horse on an enclosed ground. (Score: 0.3078)
Due uomini hanno spinto i carrelli attraverso i boschi. (Score: 0.3035)
为了重现性,这是跨语言语义搜索的代码—
附加的代码将把每个句子转换成一个向量,并计算余弦相似度,为每个查询输出 3 个最接近的句子。
结论
使用跨语言句子嵌入模型,我们现在可以在为下游任务构建分类器时抽象输入语言。
这意味着,如果我们有一个只适用于英语文本的自然语言处理模型,我们现在可以将这个自然语言处理模型重新用于任何语言。
非常感谢 Nils Reimers,下面的库展示了如何提炼你自己的多语言句子模型,我鼓励你这么做。
参考
[1]尼尔斯·雷默斯和伊琳娜·古雷维奇。 制作单语句子嵌入多语使用知识蒸馏 arXiv (2020): 2004.09813。
前沿语义搜索和句子相似度
语义搜索是自然语言处理中一个值得解决的难题。
安东尼·马蒂诺在 Unsplash 上的照片
我们通常花费大量时间在大型文档中查找特定的信息。我们通常发现,如果使用 CTRL + F,即众所周知的 Google-fu,有效地在 Google 上搜索信息的艺术在 21 世纪的工作场所是一项有价值的技能。人类的所有知识对我们来说都是可用的,这是一个提出正确的问题,并知道如何浏览结果以找到相关答案的问题。
我们的大脑执行语义搜索,我们查看结果并找到与我们的搜索查询相似的句子。在金融和法律行业尤其如此,因为文档变得很长,我们不得不求助于搜索许多关键字来找到正确的句子或段落。时至今日,人类在发现上所花费的努力是惊人的。
自 NLP 出现以来,机器学习一直在试图解决语义搜索的这个问题。一个完整的研究领域——语义搜索出现了。最近,由于深度学习的进步,计算机能够在最少的人工参与下准确地向我们提供相关信息。
句子嵌入方法
自然语言处理(NLP)领域对此有一个术语,当提到一个词时,我们称之为“表面形式”,例如单词“*president”*本身就意味着国家的首脑。但根据背景和时间,这可能意味着特朗普或奥巴马。
NLP 的进步使我们能够有效地映射这些表面形式,并捕获这些单词的上下文,成为所谓的“嵌入”嵌入通常是具有某些特殊特征的数字向量。两个意思相似的单词会有相似的向量,这让我们可以计算向量相似度。
延伸这个想法,在向量空间中,我们应该能够计算任意两个句子之间的相似度。这就是句子嵌入模型所实现的。这些模型将任何给定的句子转换成向量,以便能够快速计算任何一对句子的相似性或不相似性。
最先进的语义搜索——寻找最相似的句子
这个想法并不新鲜,早在 2013 年,这篇论文就提出了用向量来表示单个单词。然而,从那以后,我们用 BERT 和其他基于 Transformer 的模型走了很长的路,使我们能够更有效地捕捉这些单词的上下文。
这里我们比较了最近的嵌入模型和过去的 word2vec 或 GloVe。
STS 是自然语言处理的句子意思相似度竞赛。越高越好。来自 SBERT paper 的表格
这些经过修改和微调的 BERT NLP 模型在识别相似句子方面相当出色,比更老的前辈好得多。让我们看看这在实际意义上意味着什么。
我有几篇 2020 年 4 月的文章标题,我希望找到与一组搜索词最相似的句子。
这是我的搜索词—
1\. The economy is more resilient and improving.
2\. The economy is in a lot of trouble.
3\. Trump is hurting his own reelection chances.
我的文章标题如下—
Coronavirus:
White House organizing program to slash development time for coronavirus vaccine by as much as eight months (Bloomberg)
Trump says he is pushing FDA to approve emergency-use authorization for Gilead's remdesivir (WSJ)
AstraZeneca to make an experimental coronavirus vaccine developed by Oxford University (Bloomberg)
Trump contradicts US intel, says Covid-19 started in Wuhan lab. (The Hill)
Reopening:
Inconsistent patchwork of state, local and business decision-making on reopening raising concerns about a second wave of the coronavirus (Politico)
White House risks backlash with coronavirus optimism if cases flare up again (The Hill)
Florida plans to start reopening on Monday with restaurants and retail in most areas allowed to resume business in most areas (Bloomberg)
California Governor Newsom plans to order closure of all state beaches and parks starting Friday due to concerns about overcrowding (CNN)
Japan preparing to extend coronavirus state of emergency, which is scheduled to end 6-May, by about another month (Reuters)
Policy/Stimulus:
Economists from a broad range of ideological backgrounds encouraging Congress to keep spending to combat the coronavirus fallout and don't believe now is time to worry about deficit (Politico)
Global economy:
China's official PMIs mixed with beat from services and miss from manufacturing (Bloomberg)
China's Beige Book shows employment situation in Chinese factories worsened in April from end of March, suggesting economy on less solid ground than government data (Bloomberg)
Japan's March factory output fell at the fastest pace in five months, while retail sales also dropped (Reuters)
Eurozone economy contracts by 3.8% in Q1, the fastest decline on record (FT)
US-China:
Trump says China wants to him to lose his bid for re-election and notes he is looking at different options in terms of consequences for Beijing over the virus (Reuters)
Senior White House official confident China will meet obligations under trad deal despite fallout from coronavirus pandemic (WSJ)
Oil:
Trump administration may announce plans as soon as today to offer loans to oil companies, possibly in exchange for a financial stake (Bloomberg)
Munchin says Trump administration could allow oil companies to store another several hundred million barrels (NY Times)
Norway, Europe's biggest oil producer, joins international efforts to cut supply for first time in almost two decades (Bloomberg)
IEA says coronavirus could drive 6% decline in global energy demand in 2020 (FT)
Corporate:
Microsoft reports strong results as shift to more activities online drives growth in areas from cloud-computing to video gams (WSJ)
Facebook revenue beats expectations and while ad revenue fell sharply in March there have been recent signs of stability (Bloomberg)
Tesla posts third straight quarterly profit while Musk rants on call about need for lockdowns to be lifted (Bloomberg)
eBay helped by online shopping surge though classifieds business hurt by closure of car dealerships and lower traffic (WSJ)
Royal Dutch Shell cuts dividend for first time since World War II and also suspends next tranche of buyback program (Reuters)
Chesapeake Energy preparing bankruptcy filing and has held discussions with lenders about a ~$1B loan (Reuters)
Amazon accused by Trump administration of tolerating counterfeit sales, but company says hit politically motivated (WSJ)
在运行每个查询与每个嵌入的相似性后,以下是我的每个搜索词的前 5 个相似句子:
======================
**Query: The economy is more resilient and improving**.Top 5 most similar sentences in corpus:
Microsoft reports strong results as shift to more activities online drives growth in areas from cloud-computing to video gams (WSJ) (Score: 0.5362)
Facebook revenue beats expectations and while ad revenue fell sharply in March there have been recent signs of stability (Bloomberg) (Score: 0.4632)
Senior White House official confident China will meet obligations under trad deal despite fallout from coronavirus pandemic (WSJ) (Score: 0.3558)
Economists from a broad range of ideological backgrounds encouraging Congress to keep spending to combat the coronavirus fallout and don't believe now is time to worry about deficit (Politico) (Score: 0.3052)
White House risks backlash with coronavirus optimism if cases flare up again (The Hill) (Score: 0.2885)
======================
**Query: The economy is in a lot of trouble.**Top 5 most similar sentences in corpus:
Inconsistent patchwork of state, local and business decision-making on reopening raising concerns about a second wave of the coronavirus (Politico) (Score: 0.4667)
eBay helped by online shopping surge though classifieds business hurt by closure of car dealerships and lower traffic (WSJ) (Score: 0.4338)
China's Beige Book shows employment situation in Chinese factories worsened in April from end of March, suggesting economy on less solid ground than government data (Bloomberg) (Score: 0.4283)
Eurozone economy contracts by 3.8% in Q1, the fastest decline on record (FT) (Score: 0.4252)
China's official PMIs mixed with beat from services and miss from manufacturing (Bloomberg) (Score: 0.4052)
======================
**Query: Trump is hurting his own reelection chances.**Top 5 most similar sentences in corpus:
Trump contradicts US intel, says Covid-19 started in Wuhan lab. (The Hill) (Score: 0.7472)
Amazon accused by Trump administration of tolerating counterfeit sales, but company says hit politically motivated (WSJ) (Score: 0.7408)
Trump says China wants to him to lose his bid for re-election and notes he is looking at different options in terms of consequences for Beijing over the virus (Reuters) (Score: 0.7111)
Inconsistent patchwork of state, local and business decision-making on reopening raising concerns about a second wave of the coronavirus (Politico) (Score: 0.6213)
White House risks backlash with coronavirus optimism if cases flare up again (The Hill) (Score: 0.6181)
你可以看到这个模型能够非常准确地挑出最相似的句子。
我使用的代码可以在下面找到—
上面的例子很简单,但是阐明了语义搜索的一个重要观点。人类需要几分钟才能找到最相似的句子。它让我们能够在没有人类参与的情况下找到文本中的特定信息,这意味着我们可以以计算机速度在成千上万的文档中搜索我们关心的短语。
这项技术已经被用来在两个文档中寻找相似的句子。或者季度收益报告中的关键信息。例如,通过这种语义搜索,我们可以轻松找到 Twitter、脸书、Snapchat 等所有社交公司的日活跃用户。尽管他们对 metic 的定义和称呼不同——日活跃用户(DAU)或月活跃用户(MAU)或货币化活跃用户(mMAU)。由 BERT 支持的语义搜索可以发现所有这些表面形式在语义上意味着相同的东西——一种性能的衡量标准,它能够从报告中提取出我们感兴趣的句子。
对冲基金正在利用语义搜索来解析和揭示季度报告(10-Q/10-K)中的指标,并在报告发布后立即将其作为定量交易信号,这并不是一个遥不可及的想法。
上面的实验显示了语义搜索在过去的一年中变得多么有效。
寻找相似句子——聚类
人们可以使用句子的这些向量嵌入的另一个主要方式是用于聚类。我们可以快速地将单个文档或多个文档中的句子聚集成相似的组。
使用上面的代码,人们可以利用 sklearn 的简单 k-means
from sklearn.cluster import KMeans
import numpy as npnum_clusters = 10
clustering_model = KMeans(n_clusters=num_clusters)
clustering_model.fit(corpus_embeddings)
cluster_assignment = clustering_model.labels_for i in range(10):
print()
print(f'Cluster {i + 1} contains:')
clust_sent = np.where(cluster_assignment == i)
for k in clust_sent[0]:
print(f'- {corpus[k]}')
同样,结果对机器来说是精确的。这是几个集群—
**Cluster 2 contains:**
- AstraZeneca to make an experimental coronavirus vaccine developed by Oxford University (Bloomberg)
- Trump says he is pushing FDA to approve emergency-use authorization for Gilead's remdesivir (WSJ)
**Cluster 3 contains:**
- Chesapeake Energy preparing bankruptcy filing and has held discussions with lenders about a ~$1B loan (Reuters)
- Trump administration may announce plans as soon as today to offer loans to oil companies, possibly in exchange for a financial stake (Bloomberg)
- Munchin says Trump administration could allow oil companies to store another several hundred million barrels (NY Times)
**Cluster 4 contains:**
- Trump says China wants to him to lose his bid for re-election and notes he is looking at different options in terms of consequences for Beijing over the virus (Reuters)
- Amazon accused by Trump administration of tolerating counterfeit sales, but company says hit politically motivated (WSJ)
- Trump contradicts US intel, says Covid-19 started in Wuhan lab. (The Hill)
结论
有趣的是,elastics 现在每个都有一个密集的矢量场,行业中的其他公司也有能力快速比较两个矢量,如脸书的 faiss 。这项技术是尖端的,但操作性很强,可以在几周内推出。任何知道要寻找什么的人都可以找到尖端人工智能。
如果您有兴趣了解更多信息,请随时联系我,我随时为您提供电子咖啡。在外面注意安全。
感谢 Nils Reimers 关于拥抱脸讨论的内容丰富的帖子,这让我写了这篇文章。
带有 Matplotlib 的赛博朋克风格
为您的下一个数据可视化未来霓虹灯发光。
更新 2020–03–29:现在有一个 Python 包可以方便地应用这种风格,这里 见 。通过 pip install mplcyberpunk
安装
1 —基础
让我们编一些数字,把它们放进熊猫的数据框里,并把它们画出来:
import pandas as pd
import matplotlib.pyplot as pltdf = pd.DataFrame({'A': [1, 3, 9, 5, 2, 1, 1],
'B': [4, 5, 5, 7, 9, 8, 6]})df.plot(marker='o')
plt.show()
2 —黑暗
还不错,但是有些普通。让我们通过使用 Seaborn 的深色风格以及更改背景和字体颜色来定制它:
plt.style.use("seaborn-dark")for param in ['figure.facecolor', 'axes.facecolor', 'savefig.facecolor']:
plt.rcParams[param] = '#212946' # bluish dark greyfor param in ['text.color', 'axes.labelcolor', 'xtick.color', 'ytick.color']:
plt.rcParams[param] = '0.9' # very light greyax.grid(color='#2A3459') # bluish dark grey, but slightly lighter than background
3 —灯光
现在看起来更有趣了,但我们需要我们的颜色在深色背景下更加闪亮:
fig, ax = plt.subplots()
colors = [
'#08F7FE', # teal/cyan
'#FE53BB', # pink
'#F5D300', # yellow
'#00ff41', # matrix green
]
df.plot(marker='o', ax=ax, color=colors)
4 —发光
现在,如何获得霓虹灯的外观?为了让它发亮,我们用低 alpha 值和略微增加的线宽多次重画线条。重叠产生发光效果。
n_lines = 10
diff_linewidth = 1.05
alpha_value = 0.03for n in range(1, n_lines+1): df.plot(marker='o',
linewidth=2+(diff_linewidth*n),
alpha=alpha_value,
legend=False,
ax=ax,
color=colors)
5 —终点
为了更好的调整,我们给线下的区域着色(通过ax.fill_between
)并调整轴的限制。
以下是完整的代码:
import pandas as pd
import matplotlib.pyplot as plt plt.style.use("dark_background")for param in ['text.color', 'axes.labelcolor', 'xtick.color', 'ytick.color']:
plt.rcParams[param] = '0.9' # very light greyfor param in ['figure.facecolor', 'axes.facecolor', 'savefig.facecolor']:
plt.rcParams[param] = '#212946' # bluish dark greycolors = [
'#08F7FE', # teal/cyan
'#FE53BB', # pink
'#F5D300', # yellow
'#00ff41', # matrix green
] df = pd.DataFrame({'A': [1, 3, 9, 5, 2, 1, 1],
'B': [4, 5, 5, 7, 9, 8, 6]})fig, ax = plt.subplots()df.plot(marker='o', color=colors, ax=ax)# Redraw the data with low alpha and slighty increased linewidth:
n_shades = 10
diff_linewidth = 1.05
alpha_value = 0.3 / n_shadesfor n in range(1, n_shades+1): df.plot(marker='o',
linewidth=2+(diff_linewidth*n),
alpha=alpha_value,
legend=False,
ax=ax,
color=colors)# Color the areas below the lines:
for column, color in zip(df, colors):
ax.fill_between(x=df.index,
y1=df[column].values,
y2=[0] * len(df),
color=color,
alpha=0.1)ax.grid(color='#2A3459')ax.set_xlim([ax.get_xlim()[0] - 0.2, ax.get_xlim()[1] + 0.2]) # to not have the markers cut off
ax.set_ylim(0)plt.show()
如果这对你有帮助,或者你有建设性的批评,我很乐意听听!请通过此处的或此处的或联系我。谢谢!
基于集成机器学习的网络安全威胁预测
使用多重插补处理缺失数据&实施集成学习算法来预测端点安全威胁。
这个项目的数据集和代码可以在我的 GitHub 存储库中找到。在这个故事的结尾分享了相同的链接。
T 多年来,网络犯罪行业一直在发展壮大,尤其是由于越来越多的数据(个人和组织的)可以在数字媒体上获得。如今,网络犯罪带来的问题导致全球各地的公司损失了数百万美元。 在 Ponemon Institute 对 16 个国家和地区的 17 个行业的 507 个组织进行的一项研究 中,定义了 2019 年数据泄露的全球平均成本为 392 万美元,比 2018 年的估计值增加了 1.5%。世界各地的组织都在大力投资使用机器学习和人工智能的预测分析能力,以缓解这些挑战。
根据凯捷研究院(2019) 的一份报告,48%的组织表示他们在 2020 财年实施网络安全预测分析的预算将增加 29%。56%的高级管理人员表示,网络安全分析师超负荷工作,近四分之一的人无法成功调查所有确定的问题。64%的组织表示,预测分析降低了威胁检测和响应的成本,并将总体检测时间减少了多达 12%。
利亚姆·塔克在 Unsplash 拍摄的照片
考虑到上述情况,从长远来看,将预测分析应用于调查可能被恶意软件感染的终端对于组织来说变得势在必行。该研究利用组织端点(台式机、笔记本电脑、手机、服务器等)的某些硬件和软件方面的规格知识来探索这一目标。).
数据混合了分类变量和数字变量。在这项研究中,面临的主要挑战之一是数据集中存在大量缺失数据。进一步分析后的数据被归类为**随机缺失(MAR)。**数据集中的变量有:
缺失数据分类和多重插补技术
缺失数据或缺失值只不过是正在进行的研究中感兴趣的变量缺少数据值。在执行统计分析时,它会带来几个问题。
使用gif gif创建
大多数统计分析方法都剔除了缺失值,从而减少了要处理的数据集的大小。通常,没有足够的数据来处理所创建的模型产生的结果在统计上并不显著。此外,缺失的数据可能会导致结果误导。结果往往偏向于在人群中代表性过高的某个/某些细分市场。
缺失数据分类
缺失数据的分类最早是由 Rubin 在他的题为***‘推论和缺失数据’***的论文中讨论的。根据他的理论,数据集中的每个数据点都有丢失的可能性。基于这种概率,Rubin 将缺失数据分为以下几种类型:
- 完全随机缺失(MCAR) :在这种情况下,数据的缺失与数据中的其他响应或信息无关。对于所有其他数据点,数据集中任何数据点缺失的概率保持不变。简而言之,数据缺失没有可识别的模式。与 MCAR 打交道时,需要注意的一件重要事情是,对 MCAR 的分析会产生公正的结果。
- 随机缺失(MAR) :与 MCAR 相比,MAR 是缺失数据的一种更广泛的分类,在某些方面也更现实。在 MAR 的情况下,对于为统计研究定义的某些数据子集,数据缺失的概率是相似的。数据的缺失可以归因于存在的其他数据,因此可以预测。同样,用更简单的话来说,在 MAR 的情况下,数据缺失是有模式的。
- 非随机缺失(NMAR) :不归入 MCAR 和火星的数据归入 NMAR。
使用小鼠的多重插补(通过链式方程的多元插补)
Rubin(1987)提出了估计缺失数据的多重插补方法。该方法从包含缺失值的数据集开始,然后使用线性回归等统计模型为缺失数据创建几组估算值。随后计算每个估算数据集的相关参数,最终汇集成一个估计值。下图显示了四阶多重插补方法的图示。
4 阶多重插补的步骤
单一插补方法,如均值插补、回归插补等。假设估算的估算值是真实值,忽略与估算值预测相关的不确定性。
与单一插补相比,使用多重插补的优势在于:
- 在单一插补技术情况下太小的标准误差通过使用多重插补得到很好的缓解。
- 多重插补不仅适用于 MCAR 数据,也适用于 MAR 数据。
- 通过多个估算数据集获得的数据的变化有助于抵消任何种类的偏差。这是通过添加单一插补技术中缺失的不确定性来实现的。这反过来提高了精度,并产生了稳健的统计数据,从而可以对数据进行更好的分析。
在 R 中进行多重插补的最流行方法之一是使用 **MICE(通过链式方程进行多元插补)**软件包。在我们的数据集上实现鼠标的代码共享如下:
library(mice)
library(caret)df = read.csv('Data.csv')
View(df)#checking for NAs in the data
sapply(df, function(x) sum(is.na(x)))##############converting into factors(categorical variables)
df$HasTpm = as.factor(df$HasTpm)
df$IsProtected = as.factor(df$IsProtected)
df$Firewall = as.factor(df$Firewall)
df$AdminApprovalMode = as.factor(df$AdminApprovalMode)
df$HasOpticalDiskDrive = as.factor(df$HasOpticalDiskDrive)
df$IsSecureBootEnabled = as.factor(df$IsSecureBootEnabled)
df$IsPenCapable = as.factor(df$IsPenCapable)
df$IsAlwaysOnAlwaysConnectedCapable = as.factor(df$IsAlwaysOnAlwaysConnectedCapable)
df$IsGamer = as.factor(df$IsGamer)
df$IsInfected = as.factor(df$IsInfected)str(df)
ncol(df)###############REMOVING MachineId FROM DATA FRAME
df = df[,-c(1)]##############IMPUTATION OF MISSING DATA USING MICE
init = mice(df, maxit=0)
meth = init$method
predM = init$predictorMatrix#Excluding the output column IsInfected as a predictor for Imputation
predM[, c("IsInfected")]=0#Excluding these variables from imputation as they don't have null valuesmeth[c("ProductName","HasTpm","Platform","Processor","SkuEdition","DeviceType","HasOpticalDiskDrive","IsPenCapable","IsInfected")]=""#Specifying the imputation methods for the variables with missing data
meth[c("SystemVolumeTotalCapacity","PrimaryDiskTotalCapacity","TotalPhysicalRAM")]="cart" meth[c("Firewall","IsProtected","IsAlwaysOnAlwaysConnectedCapable","AdminApprovalMode","IsSecureBootEnabled","IsGamer")]="logreg" meth[c("PrimaryDiskTypeName","AutoUpdate","GenuineStateOS")]="polyreg"#Setting Seed for reproducibility
set.seed(103)#Imputing the data
class(imputed)
imputed = mice(df, method=meth, predictorMatrix=predM, m=5)
imputed <- complete(imputed)sapply(imputed, function(x) sum(is.na(x)))sum(is.na(imputed))
集成学习方法
集成学习方法使用多个模型的组合计算能力来分类和解决手头的问题。当与只创建一个学习模型的普通学习算法相比时,集成学习方法创建多个这样的模型,并将它们组合起来,以形成最终的模型,从而进行更有效的分类**。集成学习也被称为基于委员会的学习或学习多分类器系统。**
集成学习方法被使用和赞赏,因为它们的能力可以提高弱学习者的表现,弱学习者通常被称为基础学习者。这反过来产生具有更高精度和更强泛化性能的预测。所创建的模型在本质上也更加稳健,并且对数据中的噪声反应良好。
Bagging 集成学习
Bagging 是 Bootstrap Aggregating 的缩写,用于解决分类和回归问题。装袋方法包括创建多个样本,这些样本在替换时是随机的。这些样本被用来创建模型,模型的结果被合并在一起。使用 Bagging 算法的优势在于,它们减少了预测模型过度拟合数据的机会。由于每个模型都建立在不同的数据集上,因此模型中可约误差的方差误差分量较低,这意味着模型可以很好地处理测试数据中的方差。 在这项研究中,我们使用了两种装袋算法,即装袋购物车算法和随机森林算法。
通用 Bagging 整体架构
推进集成学习
增强集成学习基于先前分类模型的性能,在调整训练数据集中存在的观察的权重的迭代方法上工作。如果分类不正确,则观察值的权重增加,如果分类正确,则权重减少。在可归约误差的偏差误差分量高的情况下,增强集成学习具有优势。升压减少了这种偏差误差,并有助于建立更强的预测模型。 在这项研究中,我们使用了两种 bagging 算法,即 C5.0 决策树 Boosting 算法&随机分级 Boosting 算法。
公共增强集成架构
所用各种型号的 R 代码如下所示:
# Example of Boosting Algorithms
control <- trainControl(method="repeatedcv", number=10, repeats=3, classProbs = TRUE, summaryFunction = twoClassSummary)
seed <- 7
metric <- "ROC"# C5.0
set.seed(seed)
fit.c50 <- train(IsInfected~., data=imputed, method="C5.0", metric=metric, trControl=control)# Stochastic Gradient Boosting
set.seed(seed)
fit.gbm <- train(IsInfected~., data=imputed, method="gbm", metric=metric, trControl=control, verbose=FALSE)# summarize results
boosting_results <- resamples(list(c5.0=fit.c50, gbm=fit.gbm))
summary(boosting_results)
dotplot(boosting_results)# Example of Bagging algorithmscontrol <- trainControl(method="repeatedcv", number=10, repeats=3, classProbs = TRUE, summaryFunction = twoClassSummary)seed <- 7metric <- "ROC"# Bagged CART
set.seed(seed)
fit.treebag <- train(IsInfected~., data=imputed, method="treebag", metric=metric, trControl=control)# Random Forest
set.seed(seed)
fit.rf <- train(IsInfected~., data=imputed, method="rf", metric=metric, trControl=control)# summarize results
bagging_results <- resamples(list(treebag=fit.treebag, rf=fit.rf))
summary(bagging_results)
dotplot(bagging_results)
结果呢
在应用各种集合模型之后,发现树深度为 3 且树数量为 100 的随机梯度增强模型给出了精确度和 ROC 曲线下面积的最佳值。
该研究旨在建立一个假设,即通过对组织端点规格的正确了解**(包括软件和硬件)**,可以预测端点受恶意软件攻击和其他网络安全威胁感染的可能性。为了实现本研究的目的,我们面临了与数据相关的几个现实挑战,如了解缺失数据、使用多重插补技术对缺失数据进行插补、数据交叉验证的挑战以及模型的性能评估。
****本研究中用于构建模型的变量列表并非详尽无遗,可以根据各种组织的可用性和适用性添加一些新的指标和变量,以构建更准确、更稳健的模型。
Philipp Katzenberger 在 Unsplash 上的照片
邀请您查看 GitHub repo 进行上述分析!
** [## visha kha-b18/网络安全-威胁-预测
恶意软件行业的扩散是大量个人和机密信息的结果…
github.com](https://github.com/vishakha-b18/Cybersecurity-Threat-Prediction)
在 LinkedIn 上与我联系!
[## Vishakha Bhattacharjee -哥伦比亚商学院助教| LinkedIn
目前在纽约哥伦比亚大学攻读商业分析硕士学位。前商业情报分析师在…
www.linkedin.com](https://www.linkedin.com/in/vishakha-bhattacharjee/)**
用 PyTorch 循环 GAN
cycleGAN 的一般概念,展示了如何将输入斑马生成为马,然后循环返回并生成斑马。(图片由作者提供)
在这篇文章中,我将分享一个有趣的项目,我是其中的一部分,该项目的目标是建立一个循环甘,可以接受 A 类的图像,并将其转换为 B 类,在这种情况下,马和斑马。我将依次介绍以下主题:
- 周期 GAN 描述,主要特性。
- 在哪里以及如何找到图像数据。
- PyTorch 中 GAN 循环的实现。
- 结果介绍。
循环甘描述
圈 GAN(据我所知)在论文 中首次被介绍使用圈一致对抗网络 进行不成对的图像到图像翻译。(我推荐任何对计算机视觉感兴趣的人阅读这篇论文,因为它不是很长,并且提供了周期 GAN 背后的直觉以及损失函数的重要数学公式。)使循环 GAN 有趣的是,它是并行学习的两个神经网络之间的组合/游戏。这两个网络被称为接收真实图像并输出虚假图像的发生器和分类图像是真实还是虚假的鉴别器。目标是随着时间的推移,生成器将变得更擅长欺骗鉴别器,而鉴别器将变得更擅长不被欺骗。为了相应地优化发生器和鉴别器,总共引入了八个损失函数。可以使用各种损失函数,但在这个项目中,我们使用基于最小二乘法的 LSGAN 损失函数和绝对平均值的 L1 损失函数。
鉴别器:LSGAN 损耗
如前所述,鉴别器的目标是将真实图像分类为真实图像,将虚假图像分类为虚假图像,为了对此进行优化,使用了以下最小平方损失函数:
这里的直觉是,在真实图像的情况下,完美的鉴别器将输出全 1,并且从第一项得到零损失。在伪图像的情况下,完美的鉴别器将输出全零,并且也获得零损失。LSGAN 用于模型中的每个鉴别器一次。
发生器:特技鉴别器
生成器的目标之一是欺骗鉴别者相信假图像是真的。为了让生成器在欺骗鉴别器方面做得更好,鉴别器应该为生成的图像输出全 1。在这种情况下,发电机的损耗为零。为了实现这一点,定义了与上述略有不同的 LS 损失函数定义:
发电机:周期一致性
我们对生成器施加约束,称为周期一致性。我们希望生成器能够首先从一个类域映射到另一个类域,然后在不对图像进行任何更改的情况下返回到第一个类域。该约束是通过在真实图像和恢复图像之间的像素到像素级别上使用 L1 损失函数来施加的:
生成器:身份丢失
当提供目标域的实像样本时,单位损失意味着将生成器正则化为接近单位映射。换句话说,如果一个输入图像已经看起来像目标域,那么生成器不应该将它映射到不同的图像中(例如,马不应该被重构为马)。这种特性是通过身份损失强加的,并且基于如上所示的相同的 L1 损失函数。在最初的 Cycle GAN 论文的第 5.2 节中讨论了通过 L1 正则化利用恒等函数的概念。
发电机架构
发生器结构(尺寸取决于图像大小)。(图片由作者提供)
如上图所示,生成器有三个主要组件,编码阶段、转换和解码。
编码:
编码阶段通过多个卷积层将图像中的特征转换成潜在空间表示。
转型:
转换阶段由六个或九个 resnet 块组成,用于组合在编码阶段捕获的适当潜在特征。resnet 块还具有跳过连接的好处,这有助于避免深度网络中的消失梯度。
解码:
解码阶段与编码阶段相反,通过转置卷积组装潜在表示。
鉴别器架构
鉴别器结构。(图片由作者提供)
鉴别器仅仅是由卷积层组成的网络,并且具有执行二元分类的功能,即图像是真的还是假的。
查找图像数据
对于任何对图像数据执行模式识别任务感兴趣的人来说,轻松快速地找到大量特定区域的图像是非常重要的。大多数深度学习框架,如 tensorflow、keras 和 PyTorch,都具有让用户轻松访问 cifar 10、mnist fasion/ digits 等流行数据集的功能。然而,找到个人图像数据需要更多的努力,但仍然不是很困难。我发现下面这个话题的论坛讨论很有参考价值: 链接 。我个人发现 ImageNet 在抓取图像数据方面既简单又可靠。根据我的经验,ImageNet 可以提供给定对象(如草莓)的大约 1000 张图像,对于深度学习应用程序来说,这可能是也可能不是足够的数据。
这个项目使用的数据是大小为 256 X 256 的马和斑马的图像。马/斑马数据集(不是我自己收集的)可以在以下链接找到: [链接](https://drive.google.com/uc?id=1jPelB2jzNZJq3ZU9Uk Mkt4MJtF3DRgg) 。
使用 PyTorch 循环 GAN 实施
发电机网络定义如下。
鉴频器网络定义如下。
分别用于发生器和鉴别器网络的上述损耗函数如下所示实现。
用于训练网络的完整代码可以在下面的笔记本中找到。通过 google corroboratory 使用 GPU 训练网络。
结果
下图显示了从上述实现中接收到的一些结果图像。
周期 GAN 结果。(图片由作者提供)
当我们查看从模型生成的图像时,结果的质量相差很大。一些图像结果通常是好的,而其他图像质量较低,例如图像中不包含任何被改变的动物的部分。通常,当从马图像生成假斑马时,如果有一匹棕色的马,并且马的身体的全部或大部分出现在图片中,并且马覆盖了图像的大部分,则获得最佳结果。如果图像中有大量噪声,即马的身体占据了图像的一小部分,那么发生器通常很难改变所产生的噪声。为什么会是这种情况的假设是,模型将图像解释为斑马,并且在这种情况下,由于来自身份损失函数的约束,生成器模型不改变输入图像。
一般来说,当模型要把斑马变成马时,它的表现比相反的情况要差。较差的表现最有可能归因于马的外观比斑马变化更大。注意到的另一个方面是,即使在训练数据图像中存在白色和黑色的马,在斑马转换图像上看到的变化是只有棕色被添加到斑马身体的较大或较小部分。这是因为数据集很可能包含更多棕色马的图像,因此模型过度适合棕色。
简单英语中的循环一致对抗网络
CycleGAN 背后的数学损失函数分析
CycleGAN 是一种不成对图像到图像翻译的方法。不幸的是,在没有完全理解或欣赏其中的数学知识的情况下使用 CycleGAN 是可能的。这真是太遗憾了。
在本文中,我将介绍周期一致的敌对网络背后的数学原理。请阅读论文获取更全面的解释。
不成对与成对
CycleGAN 的关键是我们没有前后图像。
让我们以上面显示的将斑马转换成马的例子为例(反之亦然)。
在配对的数据集中,马和斑马需要彼此“匹配”。我们实际上是把一匹马涂成黑色和白色。背景、闪电等。保持不变。
成对的数据集看起来像这样:
在不成对的数据集中,马和斑马不需要彼此“匹配”。这个数据集更容易创建。
不成对的数据集应该是这样的:
图片来自达拉斯马术中心
生成器和鉴别器
正如你可能对 GAN 的期望,我们有生成器和鉴别器。我们的生成器也被称为映射函数。
让我们列举几个变量:
马和斑马
X
指斑马Y
指一匹马
发电机
G
指的是将斑马转换成马的映射函数F
指的是将马转换成斑马的映射函数
鉴别器
Dx
指善于识别斑马的鉴别器。Dy
指善于识别马匹的鉴别者
将所有这些放在一起,我们就有了这样的东西:
图片来自 CycleGAN 论文
循环一致性损失
在论文中,循环一致性图表如下:
图片来自 CycleGAN paper
下面是正在发生的事情:我们把一匹马的图像转换成斑马。然后在这个新创建的斑马上运行鉴别器。然后我们把新创建的斑马变成一匹马。
我们将这匹新造的马与我们现有的马进行比较。这就是y^
vs y
的本质含义。我们新创建的马应该看起来和原来的马几乎一样。
我制作了一个信息图来解释这是如何工作的。
作者图片
现在我们重复这个过程。除了这一次,我们采取了一个斑马的形象,并试图转换成一匹马。数学术语中的损失函数
数学术语中的损失函数
对于我们的损失函数,我们有对抗性损失和周期一致性损失。
对抗性损失:
对抗性损失的损失函数如下:
图片来自 CycleGAN paper
我们来分析一下。
左手边接收:
Dy
(马识别者)G
(我们的斑马对马创作者)X
(一只斑马)Y
(一匹马)
RHS 包含以下术语:
图片来自 CycleGAN paper
这个术语测量我们识别我们创造的斑马是真是假的能力。我们从所有斑马中抽出一只斑马,让它通过鉴别器。
下一学期:
图片来自 CycleGAN paper
这个术语衡量我们把一匹马变成斑马的能力。我们从所有生成的马中抽出一匹马,并将其通过鉴别器。
现在我们做第一项加上第二项。这给了我们上面看到的对抗性损失等式。
周期一致性丧失:
这是循环一致性损失的损失函数:
图片来自 CycleGAN 论文
我们来看第一项:
图片来自 CycleGAN 论文
这意味着:
- 我们从斑马数据集中随机抽取一只斑马。(
x~p(x)
) - 我们将斑马通过生成器(
G
)来创建一匹马。 - 我们将生成的马通过另一个生成器(
F
)来创建斑马 - 我们将步骤 3 中创建的斑马纹与步骤 1 中的随机斑马纹进行比较,并取差值的绝对值之和。
全面目标:
完整的损失函数如下:
图片来自 CycleGAN paper
只是我们之前看到的对抗性损失函数和周期一致性损失函数的和。其中λ控制每个目标的相对重要性。
最终,我们希望实现以下目标:
图片来自 CycleGAN paper
我们试图最大化鉴频器的能力,最小化发电机的损耗。这使我们能够很好地区分斑马和马,同时也能很好地生成马和斑马。
结束
CycleGAN 背后的数学似乎有些令人生畏。但是我已经尝试在这篇文章中涵盖了大概的内容。我希望这能帮助到一些人。当我学习 CycleGAN 如何工作时,这篇文章肯定会对我有所帮助。
如果我犯了错误,请随时通过 twitter 联系我,我会尽快修复。
非常感谢《CycleGAN》的作者:朱俊彦、朴泰成、菲利普·伊索拉和阿列克谢·a·埃夫罗斯。我认为值得阅读他们的论文来更详细地了解这种方法。
原载于 2020 年 8 月 31 日https://spiyer 99 . github . io。
循环生成网络
生成网络解释
“其他人在他们的智慧的帮助下,将一个黄色的点变成了太阳”——巴勃罗·毕加索
将马的原始镜头转换为斑马的循环生成网络。
本文旨在解释循环 gan 的内部工作原理,以及它们如何应用于解决现实世界的任务。
介绍
C 循环生成对抗网络(简称cycle gans)【1】是强大的计算机算法,具有改善数字生态系统的潜力。它们能够将信息从一种表示转换成另一种表示。例如,当给定一幅图像时,他们可以模糊它,给它着色(例如,如果它原本是黑色的&白色的),提高它的清晰度,或者填补缺失的空白。
它们比你传统的设计/生产/写作平台更强大。因为cycle gan是机器学习算法,它们原则上可以学习实现任何想要的转换。相反,传统的转换软件(如 Photoshop)通常是硬编码的,用于执行特定的任务。此外, CycleGans 可以实现比现有软件更高的性能,因为它们可以从数据中学习,并随着数据的收集而改进。
了解不同层次的 CycleGans 的工作方式和能力令人兴奋,并提供了人工智能如何以前所未有的方式影响我们日常生活的见解。
CycleGAN 基于 3d 草图渲染手绘图像
生成网络
在谈论 CycleGans 之前,我们先简单讨论一下正则生成对抗网络。
生成对抗网络(简称 GANs)[2]是能够创建数据的机器学习算法。当他们得到图像、声音或文本等信息时,他们会学习产生新的看起来/听起来相似的输出。例如:给定一组人脸图像,算法可以自学 ( 训练,用机器学习的行话来说)人脸长什么样,并且能够创造新的人脸。我鼓励你看一看 这篇文章 ,我在其中旨在解释 GANs 的基本面。
环状 GANs 是传统 GANs 的特殊变体。他们还可以创建新的数据样本,但他们是通过转换输入样本来实现的,而不是从头开始创建输出。换句话说,他们学习转换来自两个数据源的数据;为该算法提供数据集的科学家或开发人员可以选择这些分布。在两个数据源是狗的图片和猫的图片的情况下,该算法能够有效地将猫的图像转换成狗的图像,反之亦然。
他们是怎么做到的?
什么是 CycleGan?
CycleGan 是学习两个域之间的两个数据转换函数的神经网络。其中之一就是转型**G**(x)
。它将给定的样本x ∈ X
转换成域Y
的元素。第二个是**F**(y)
,将样本元素y ∈ Y
转换成域X
的元素。
变换函数 F 和 g 的定义。
两个甘,一个辛克莱甘
考虑阅读 这篇文章 了解更多关于甘斯的内容
为了学习**F**
和**G**
,使用了两个传统的甘。每个 GAN 内部都有一个发生器网络,学习如何根据需要转换数据。GAN 的第一个生成器学习计算**F**
,GAN 的第二个生成器学习计算**G**
。
生成函数 G 和 f 的定义。
此外,每个发生器都与一个鉴别器相关联,该鉴别器学习区分真实数据y
和合成数据**G**(x)
。
生成函数 G 和 f 的定义。
因此,CycleGAN 由学习变换函数**F**
和**G**
的两个发生器和两个鉴别器组成。该结构显示在下图中:
CycleGan 表示法。它由两个甘组成,甘学习两种转化。
单 GAN 损耗
每个 GAN 发生器将通过最小化损耗来学习其相应的变换函数(或者**F**
或者**G**
)。通过测量生成的数据与目标数据的不同程度(例如,生成的猫图像与真实的猫图像相比的不同程度)来计算发生器损耗。差距越大,发生器将受到的惩罚越高。
鉴别器损耗也用于训练鉴别器,使其善于区分真实数据和合成数据。
当这两个代理设置在一起时,它们将相互改进。生成器将被训练来欺骗鉴别器,而鉴别器将被训练来更好地从合成数据中区分真实数据。因此,生成器将变得非常擅长创建/转换所需的数据(学习所需的转换,例如**F**
)。
总的来说,GAN 损耗如下:
单个 GAN 损耗的定义。d 是鉴别器功能,G 是发生器功能。
第二个发生器-鉴别器对也有类似的损耗:
作为学习所需转换**F**
和**G**
的一种方式,CycleGAN 将尝试最小化两个 GAN 损耗的总和。
循环转换一致性
理想情况下,我们希望我们的 CycleGAN 学习周期一致的转换函数**F**
和**G**
。这意味着,给定一个输入x
,我们希望来回转换**F(G(**x**))=** x'
准确地输出原始输入x
。理论上这应该是可能的,因为在输入端x
应用**G**
将在Y
域输出一个值,在输入端y
应用**F**
将在X
域输出一个值。
循环一致性减少了这些网络可以学习的可能映射集,并迫使**F**
和**G**
成为相反的变换。想象一下,学会的函数**F**
通过修改自己的耳朵将猫的图片转化为狗的图片,而**G**
通过修改自己的鼻子学会将狗的图片转化为猫的图片。虽然这些转换可以达到目标,但是它们并不协调,因为它们对数据应用了不同的更改。使用周期一致性迫使**F**
和**G**
彼此相反。这样猫的图片会通过修改耳朵转化为狗的图片,狗的图片会通过反过来修改耳朵转化为猫的图片。如果这两个函数是循环一致的,那么它们也是更有意义的映射。
左:输入 x 的循环一致性损失的直观表示。右:输入 y 的循环一致性损失的直观表示。
仅使用 GAN 损耗训练 CycleGAN 并不能保证保持周期一致性。因此,额外的周期一致性损失被用于实施该属性。这种损失被定义为输入值x
与其前向周期预测值**F**(**G**(x))
之间的绝对值差( L1 范数),以及输入值y
与其前向周期预测值**G**(**F**(y))
。差异越大,预测值与原始输入值的差距就越大。理想情况下,我们的网络会将这种损失降至最低。
循环一致性损失的定义。相当于上图中的可视化表示。
完全损失
用于训练网络的完整周期 Gan 损耗定义为两个 GAN 损耗和周期一致性损耗之和。
加权因子 ƛ (名为λ)用于控制周期一致性损失在全部损失中的权重。与其他损失相比,权重越高,减少循环一致性损失就越相关。
完全损失的定义
被优化以最小化该函数的 CycleGANs 将能够学习期望的变换F
和G
。机器学习培训的细节将留到我的后续文章中。
结果
CycleGans 已经在几个任务的完成情况上进行了测试,并且已经能够成功地解决它们。这些任务的几个例子是:
图像变换
输入:鲜花原图。输出:应用了焦点和效果的改进的花卉图片。
**照片增强:**CycleGans 经过训练,可以生成专业的花卉照片,具有几个级别的聚焦和模糊,以及任何照片编辑工具。
输入:风景图片。输出:相同的风景,不同风格的艺术品。
图像风格转换: CycleGans 被训练来转换图片和艺术品的风格,例如,他们已经能够将照片转换成相同风景的梵高风格的画作。
风景图片从冬天变成了夏天。
**季节转换:**与风格转换类似,CycleGANs 已用于转换拍摄照片的季节。这里的结果令人惊讶,因为许多图像看起来像真实的照片。
音频转换
**音乐类型转换:**苏黎世 ETH 大学的研究人员已经能够训练 CycleGANs 人将古典流行音乐类型的歌曲转换成古典音乐作品[4]。
**语音转换:**日本 NTT 通信科学实验室的研究人员展示了令人印象深刻的结果,他们使用 CycleGANs 在不同性别的说话者之间转换语音注册表[5]。
这部作品的音频样本可以在他们的网站找到。
其他人
CycleGan paper 官方网站提供了在互联网不同地方发现的其他 CycleGan 用例的图库。我希望这些有趣的例子能鼓励您进一步了解 CycleGans,并提出更多有用和有趣的应用。
CycleGan 使用的图库可以在这个网站找到。
CycleGan 问题
尽管 CycleGANs 在上述许多任务中取得了明显的成功,但仍显示出 100%的成功率。以下是他们目前的一些陷阱:
- 当 CycleGans 输入的数据来自他们接受训练的数据时,可能会产生意想不到的结果(见下图)。
- 需要几何变化而不是颜色或对比度的任务对输入的影响很小。
用于变换马和斑马图像的 CycleGan 没有人类的输入,因此它可以生成任意的变换。
进一步的研究可能侧重于改进这些领域的工作。一些策略包括使用更广泛和更多样化的数据集,以及使用半监督学习方法。
最后的话
我要感谢并祝贺来自加州大学伯克利分校人工智能研究实验室的朱俊彦、朴泰成、菲利普·伊索拉和阿列克谢·a·埃夫罗斯为 CycleGans 所做的工作。在他们的网站你会找到更多与项目相关的信息。
我鼓励你去看看我的 GANs 库,在那里你会发现不同类型的 GANs 在 Python 中的实现,以及一个正在从头开始在 PyTorch 和 TensorFlow 中的 CycleGan 实现。我将通过媒体发布一个教程,一旦我完成了。
感谢阅读这篇文章直到最后。我希望你在学习这个主题的过程中获得了乐趣,我将在下一期节目中与你见面。🎊
参考
【1】【朱俊彦】朴泰成菲力普·伊索拉阿列克谢·阿弗罗斯 、不成对的图像到图像翻译使用循环一致的对抗网络、**
【2】伊恩·j·古德菲勒、让·普盖-阿巴迪、迈赫迪·米尔扎、徐炳、大卫·沃德-法利、谢尔吉尔·奥泽尔、亚伦·库维尔、约舒阿·本吉奥,《生成性对抗性网络》,2014 年,【https://arxiv.org/abs/1406.2661
【3】泰罗卡拉斯萨穆利莱恩米卡艾塔拉简内赫尔斯滕贾科莱蒂宁******
【4】吉诺·布鲁纳【王】罗杰·瓦滕霍夫苏穆·赵 【象征性音乐流派转移用 CycleGAN、******
金子拓广龟冈博和田中寇信厚北藏 。CycleGAN-VC2:改进的基于 CycleGAN 的非并行语音转换,https://arxiv.org/abs/1904.04631******
周期性特征编码,是时候了!
找到一种简单的技术来转换时间、星期、月份或季节等特征,同时仍然保留它们的循环意义。
在 Unsplash 上由 Fabrizio Verrecchia 拍摄的照片
我总是发现关于特征工程的讨论很吸引人,因为它们揭示了数据科学家如何通过增加提供给算法的信息来改善建模过程。
即使您是数据科学的新手,您也可能知道有些变量不能直接输入到模型中。是的,我肯定是在谈论需要诸如 one-hot 或 get_dummies 编码方法之类的技术的分类特征。
当您处理时间序列数据时,您的数据帧索引通常具有日期时间格式(YYYY-MM-DD HH:MM:SS ),除了数据点的升序之外,您不会从中提取太多信息。
但是,您的数据集中可能存在一些隐藏的模式,这些模式不会被常规要素显示出来。我这里说的是循环模式,比如一天中的几个小时、一周中的几天、几个月、几个季节等等。
问题是,当涉及到将这些信息转换成可解释的特征时,我们通常会面临一个挑战。
让我们以建立一个能源消耗预测模型为例。
我们肯定地知道,一天中的时间将对这种消耗有很大的影响。
为了将时间编码为从 00:00 到 23:59,我们的第一个猜测可能是将其转换为从 00:00 开始经过的分钟数,从 0 到 1439:
这里的问题是,模型会将 23:58 和 00:02 之间的差异视为 1336 间隙,而它们之间仅相隔 4 分钟!
我们如何解决这个问题?
如果你还记得高中的一些事情,你可能知道一些具有循环行为的函数…最著名的是余弦,因为它根据 0-2π循环在-1 和 1 之间变化。
余弦函数(源)
所以让我们通过余弦转换我们的时间,我们很好,不是吗?
我们将在 0 到 2π之间归一化 x 后运行余弦函数,这相当于一个余弦周期。作为一张图表胜过千言万语,我们就用 Plotly 来看看相应的结果:
1440 分钟标准化并通过余弦转换
所以我们现在有了比以前更接近的 00:00 和 23:59 的值,它们都在 1 左右!
但是你看到我们创造的新问题了吗?
两个不同的时间会得到相同的值:
《采访》中的詹姆斯·弗兰科
解决这个新问题的最好方法是添加另一个循环信息来区分具有相同余弦值的两个时间。我们可以把它想象成一个双轴坐标系统。
这大概是给余弦的哥哥打电话的恰当时机:正弦!
0-2π周期上的余弦和正弦函数(y)
通过将原来的时间转换为它们对应的余弦和正弦值,我们现在可以为 00:00 到 23:59 之间的每个时刻分配不同的坐标,使它们具有唯一性!
这样一个系统的可视化使它变得更加明显:
我们创造的余弦-正弦坐标系统
为了举例,让我们在一段时间内随机绘制 15 个点:
这种编码体系是否完美?不幸的是没有,以下是一些原因:
- 你正在将一个信息转换成两个特征,从算法的角度来看,这将在数学上赋予它更大的权重。
- 基于决策树的算法(随机森林,梯度提升树,XGBoost)一次根据一个特征建立它们的分割规则。这意味着它们将无法同时处理这两个特征,而 cos/sin 值将被视为一个单一坐标系。
然而,权衡有时是游戏的一部分,这仍然是编码周期性特征的好方法。
值得一提的是,开源算法(如脸书的 Prophet)确实允许您从时间序列中自动提取周期性信息,如年、月或日模式:
摘自脸书的《先知快速入门指南》
Prophet 遵循 sklearn 模型 API。我们创建一个 Prophet 类的实例,然后调用它的 fit 和 predict…
facebook.github.io](https://facebook.github.io/prophet/docs/quick_start.html#python-api) [## 皮埃尔-路易·贝斯康德关于媒介的文章
数据科学、机器学习和创新
pl-bescond.medium.com](https://pl-bescond.medium.com/pierre-louis-besconds-articles-on-medium-f6632a6895ad)
Cynefin 和数据驱动的决策——了解您的领域
有两种方法可以做出数据驱动的决策,分析方法和实验方法,在任何给定的时刻,只有一种方法适合你!
Cynefin &数据驱动的决策。作者写的。
动机
我们需要更多的预测,更多的预测分析,通用的前后分析框架,更多的人工智能。然而 65%的经理报告说这些努力没有带来可见的价值。我认为失败的分析项目的一个重要组成部分是公司未能理解何时使用分析数据驱动的决策,以及何时使用实验数据驱动的决策。
我认为,像网飞、Airbnb 和 Zynga 这样的公司非常成功,因为他们理解这两种“数据驱动”决策的方法,并且擅长于实验方法,而通常情况下,公司只关注分析方面。让我们来定义它们:
- 分析:我们分析过去的数据,然后得出最优决策,然后我们“最优”行动。这通常就是“数据驱动的决策”的含义。但这只是硬币的一面。
- 实验:考虑来自未来的数据。这是怎么回事?数据是产品的一部分,反馈是决策的一部分。对于两种产品的&决策,我们只是试探,我们不会“用我们所有的筹码行动”。我们感知数据反馈,推断模式,行动,然后一遍又一遍地重复这个紧密的循环,直到有一天我们可能会以分析方法而告终。
像网飞、Airbnb 和 Zynga 这样的公司更经常选择实验性的方法…
据我所知,像网飞、Airbnb 和 Zynga 这样的公司比其他公司更经常选择实验性方法。通过这样做,他们有效地导航 cynefin 框架,并决定他们是在事物的“复杂”还是“复杂”的一边。
因此,让我们来看看如何才能在这两种方法上都表现出色!
- 让我们看看为什么以及什么时候分析方法起作用。
- 让我们看看为什么和什么时候实验方法会起作用,而分析方法会是灾难性的。
- 让我们回顾一下 cynefin 框架,它为这一点提供了一个很好的背景,并且可以看到,根据不同的情况,你必须能够使用这两种方法。
- 让我们最后来看看,为什么 OKRs 与这两种方法配合得如此好,但是您也必须小心地了解您在 OKRs 中的领域!
分析数据驱动的决策制定
让我们考虑一个建造桥梁的建筑师。他今年 40 岁,迄今为止在他的职业生涯中已经建造了 50 座桥梁。现在,他决定思考如何更好地建造桥梁,以使它们更具可持续性。
他收集他的*历史(过去)*数据,检查他建造的所有桥梁,检查天气数据,交通数据,并弄清楚一些事情。通过分析过程,他能够将恶化分解为以下主要驱动因素:
- 暴雨
- 繁重的交通负荷
根据他的观察,以及这些潜在原因在可预见的未来可能不会改变的知识,这位建筑师现在可以做出一个完全基于数据的决策,并再次建造许多具有特定据点的桥梁,无论是天气(在有大量暴雨的地区)还是针对他怀疑的交通负荷。
建筑师通过分析过去,推断出他未来的蜜罐。他知道 A 比 B 更了解 C,所以他可以利用这一点。
这是一个分析数据驱动的决策。它非常适合这个领域,在这个领域我们确实需要一个专业的架构师和大量的数据来正确地分析&建造更好的桥梁,但是在这个领域我们有“已知的未知”。我们有明确的限制,比如未来 50 年地球上的典型天气,这些限制内的一切都是物理的,因此是相对“稳定的&可预测的”。
分析数据驱动的决策示例
那么什么样的决定属于这一类呢?事实证明,虽然 Airbnb 这样的公司以实验思维著称,但他们确实有整个数据科学家轨道转向分析数据驱动的决策。
所有属于“优化”范畴的东西都在这个领域。运营工作流程、搜索引擎优化、任何符合 5 sigma 思维模式的东西。所有这些事情都有明确的限制,我们都知道,而且是可以预测的。
产品负责人的日常业务也适用于此。从我的经验来看:我的团队经历了相当多的压力,抱怨太多的“冲刺阶段的噪音”。我们决定对此采取分析方法,获得了一系列“噪音”基准,在我们公司,噪音显然在 10–20%左右,并从我们的 sprints 中获得了一系列数据。根据观察结果,我们能够将“冲刺阶段的噪音”降低到 5–10%以下,这个数字到目前为止都保持得很好。这是一种经典的分析方法。
实验数据驱动的决策制定
外汇交易员在一个完全不同的领域工作。想象一个日内交易者。他持有大量头寸,然后平仓,分析数据,分析盈亏。然后,他确定完美的交易,分析推断主要驱动因素,预测它们,然后进行下一次交易。
却看到他的位置转向南方。
对建筑师有什么不同?建筑师和交易者之间的关键区别是,建筑师实际上可以推断出因果关系,而交易者只能推断出模式,因此不得不不断探索,这与建筑师非常不同,建筑师一旦推断出因果关系,就可以以完全相同的方式为未来 20 年建造伟大的桥梁。
建筑师推断出因果关系:
暴雨= >造成大量潮湿和喷雾损坏= >损坏桥梁的钢部件= >损坏桥梁的整体状态。
交易者不能。他当然可以事后推断出因果关系,但他不能用它来预测,因为未来的事情不会是同样的关系,甚至第二天也不会。离晚上还很远。
交易者努力成为建筑师。他认为 A = > C,并且花了很多钱,最后却糊涂了。
那么交易者能做什么呢?毕竟,有相当多的交易者在市场上赚钱,甚至像 Bridgewater Associates 和 Renaissance Technologies 这样的大型对冲基金甚至自动/通过算法进行交易。交易者能做的是推断模式。他可以不断探索,调整和完善成为他的交易策略的模式。事实上,这在某种程度上是雷伊·达里奥描述 Bridgewater capital 创始故事的方式。
但为此,交易者不必采取行动,而是一直探索,并根据探索采取行动。他的过程更像这样:
- 探针 T=0: 尝试用一个 50 点的跟踪止损点&和一串均线的某个交叉点作为切入点,用 1%的资金。
- 道岔 T=1: 工作正常,200 点后停止。交易者可以推断出一些模式,他可以推断出 NFP 数据发布后对美元的强劲反弹往往会持续成对。
- 再次探测 T=2: 使用策略&继续探测,推导出更多模式,调整他的策略以包含这些模式。
- 探索,感觉,行动,探索,…
- T=5: 现在连续 3 次被止损,损失 50 点,注意这里没有硬消息数据。因此,他看到了一个与新闻数据和他交易的反弹相关的模式,并将其纳入了策略。
- …
这真的是,你在许多当前的科技公司看到的。
实验数据驱动的决策实例
实验数据驱动工作的关键是“将数据构建到产品中”或“将反馈构建到决策中”,并以假设驱动的心态开始解决问题。
一个很好的例子是网飞个性化引擎,或者说今天的大多数机器学习产品。一个附有 CD4ML 的机器学习产品正是这样做的:它进行实验,而不做任何假设。它推导出模式,然后采取行动,部署新的模型。在网飞,没有人试图猜测向谁推荐什么,相反,他们依靠大量的实验来找出答案。
另一个很好的例子是 Zynga 公司的大部分工作。他们“在每一个决策中建立数据”,他们甚至为他们的游戏发明了一种新的跟踪方式(ZTrack)来从他们的游戏中获得反馈。在一项实验中,他们开始让用户为他们的“Ville”游戏中的构建工具的进度付费。然后他们评估数据,意识到用户并没有为所有事情付费,但是他们会为最后一部分的进展付费(这是一个模式*)。基于这种认识,Zynga 为鼓励这种行为的构建工具进行了优化。
当然,原型和 SCRUM 或敏捷的本质都是基于这种工作的。没有将这一点结合到产品中会阻碍这种框架在您公司的成功。我工作中的一个很好的例子是,我缺少关于我们正在开发的产品的数据。我们开始在我们所有的版本中加入“追踪用户”的故事。在得到越来越多的反馈后,我们通过几个“探针”来看看如何改变方向,结果相当不错。产品的新方向现在完全不同了。
Cynefin &决策制定
Cynefin 是由斯诺登和库尔茨开发的一个框架,发表在 2003 年的一篇文章中。Cynefin 大致是一个确定你“周围环境”的框架。它可以用在各种各样的环境中,但是我们关心的是这里的决策部分。
图片来自埃德温·斯托普
cyne fin 框架的四个关键要点是(有关更多详细信息,请阅读 论文 !):
- 通常用于决策的三个假设并不总是有效,只是有时候:并不是所有涉及 人类&市场的事情都是有序的;人类的理性选择经常是一种错觉,尽管它在大多数时候是一个很好的近似;不是每个“眨眼”都是“眨眼”,不是某人的每个信号实际上都是信号。
- 有五个领域管理着我们的世界,而不仅仅是上面通常假设的有序的“简单的&复杂的”领域,这意味着秩序。
- 在所有这些方面,你都应该采取非常不同的方式。
- 有很多方法可以将事物从一个领域推进到另一个领域,比如探索、开发等等。
混乱和简单的领域都不属于数据驱动的决策领域,然而复杂和复杂是我们感兴趣的两个领域。
什么时候用什么?
你的业务的一部分将落入未知领域,一部分将落入复杂领域。斯诺登和库尔茨在他们 2003 年的论文中描述了一种“情境练习”,这种练习将大致产生一种类似地图的东西,通过它你可以确定哪些决策应该是由分析数据驱动的,哪些应该是由实验数据驱动的。
一个会话的流程为:
- 专注于一个背景,也许是你的公司,公司的一部分,等等。让一群人进入一个房间。给他们一些准备材料让他们进入环境。
- 对你的“意义构建”过程中重要的事情进行一次有条理的头脑风暴。
- 画出一个 Cynefin 框架,只要标出四个角。
- 让小组成员一起将几乎不需要讨论的物品放在这些角落里。
- 人们把所有其他物品放在广场的某个地方。
- 人们一起划分界限,清楚地将事物划分到适当的领域;这将留下一个大的“无序”域,这将在下面讨论。
- 人们讨论所有的无序项目,并“拉近”边界,直到只有严重争议的项目留在无序域中。
页(page 的缩写)472、库尔茨&斯诺登"战略的新动力:在复杂多变的世界中做出明智的选择
一旦你到了这里,你就知道用实验方法处理哪些部分,用分析方法处理哪些部分。等等,你在做 OKRs?让我们看看这是如何完美地融入这个框架的。
搭配 OKRs!
那么,这如何与基于数据的控制机制协同工作呢?我认为它配合得很好。例如,OKRs 作为一个关注更大目标的框架,当正确应用时,实际上为分析和实验决策留下了恰到好处的空间。在制定 OKR 的过程中,你只需要知道你在哪个领域行动。这里有一个例子:
典型的销售目标可能是:
**目标分析:**将产品 X 的销售收入增加 20%
KR1:大公司部门的销售收入增长了 5%
KR2:中小型公司市场增长 30%
KR3:每个销售代表都联系了 100 名 Q1 客户,询问产品 X
KR4:客户调查报告对产品 X 的满意度得分为 7.5+分
如果你经营公司已经有几年了,了解市场,并且有一个不错的销售团队,从某个特定产品中获得更多收入的问题可能会陷入复杂的领域。你可能会推断,要销售这样一个产品,你通常有 X%的成交率,所以你可以把事情分解成每个细分市场要联系的客户数量,最后可能还有一个质量指标。
另一方面,如果你的产品是新的,你不了解市场,客户是新的,或者你对它做了一些重大的改变,那么这个问题很可能会落入的复杂领域。目标有所改变,加入了探测&传感,但真正重要的变化是你应该定期进行的 OKR 检查!
**目标实验:**将产品 X 的销售收入提高 20%
KR1:在 Q1 的第 1-2 周,每个销售代表都联系了 10 个客户,询问产品 X
KR2:客户调查报告在产品 X 测试版上的推荐分数为 7.5+。
KR3:每个联系人都接受了关于产品利弊的调查。
KR4:我们有 500 名新客户使用产品 X
KR5:每个销售代表都联系了 Q1 的 500 个客户
看出区别了吗?实验性意味着我们不知道应该关注哪个细分市场,所以我们只是简单地估计新的客户数量(KR4 代替 KR1,KR2)。但这意味着我们必须探索,以快速获得紧密的反馈,这就是为什么我们现在有 KR1 & KR5。对于新产品,我们需要的是推荐,而不仅仅是质量,所以我们更换了 KR2。KR3 专注于获得更多反馈。
但是,OKR 进程并没有达到这个目标!与“客观分析”不同,在“客观实验”中,我们不知道要去哪里,要关注哪些客户,我们甚至不知道我们是否需要对产品 x 进行进一步的开发。因此,在这里,我们将每两周检查一次,并改变 kr,希望在季度末达到类似“客观分析”的水平,即我们知道的目标群体、紧密的细分市场和可靠的数字。但是,这需要在整个季度中不断探索和感知。
分析与实验目标。以相同的成功状态结束,但是在这之间表现非常不同。
现在轮到你了。你知道你的哪些问题&决策适合复杂或复杂的领域吗?去把它们画出来吧!你的 okr 能弥补差额吗?你的数据驱动决策方法反映了你领域的现实吗?
资源
- 库尔茨和斯诺登,2003 和他们的 cynefin 框架。
- 有一本很棒的书 J. Highsmith et。艾尔。来自名为 EDGE 的 ThoughtWorks。到目前为止,我只阅读了免费的一章,但想法是一致的。事实上,他们的论点是,今天,“实验数据驱动”是成功的关键。
- 关于 Airbnb 及其基于数据的决策的更多信息。
- 作者在 GitLab 上的一个 CD4ML 实现,并附有一些解释,以及与 ThoughtWorks 的通用概念的链接。
- 有关 OKRs 的更多信息,请阅读衡量重要因素。
cy thon——Python 函数的加速工具
当调整你的算法得到小的改进时,你可能想用 Cython 获得额外的速度,cyt hon 是 Python 的 C 扩展。
动机
如果你读了我的文章如何用 Python 从头开始创建你自己的矩阵模块,你可能想用你自己的算法创建你自己的矩阵类。这是一个好主意,因为你可以灵活地创建你喜欢的模块。但是在创建多维数组函数之前,您可能想了解 Numpy 和 Python Matrix 类之间的区别。
从空闲编码中检索
你为一个矩阵创建一个函数。让我们测试一下
让我们从一个例子开始,帮助你理解 Numpy 和你用 Python 创建的模块之间的区别。
我们期望使用 Numpy 的矩阵乘法将给出与第一个相同的结果。让我们看看它们是否在相同的矩阵维数上给出相同的结果。
创建多个不同维度的矩阵:
nump= []
mult=[]
for i in range(0,500,100): nump.append(calculate(npAB,(i,i))) mult.append(calculate(mulAB,(i,i)))
Python 实现和 Numpy 之间的性能。在这里找到实现的
我们创建了维度为 100x100、200x200、…、500x500 的矩阵。我们可以看到,随着维度的增加,我们的 Python 函数的时间量呈指数增长,而 Numpy 可以在几秒钟内完成计算**。如果 Numpy 也是一个 Python 库,它的性能怎么会比我们的 Python 实现好这么多呢?**
numpy——不完全是 Python 库
Numpy 集成了 C/C++和 Fortran 代码,在处理多维数组而不是使用纯 Python 时提供了高性能。
如果你不知道 C 和 Python 的区别,C 是编译语言,Python 是解释语言。虽然变量是在 C 中声明的,但变量不是在 Python 中声明的。这使得 Python 更容易编写,但也带来了成本,Python 需要在每次执行代码时解释变量。因此,对于多维数组,Python 的运行速度比 C 慢得多。
如果有一种语言能让你在实现 C 性能的同时使用 Python 语法,那会怎么样?Cython 可以帮助你做到这一点。
Cython 简介
Cython 是一个针对 Python 和扩展的 cy thon(T21)的优化静态编译器。最棒的是,它使得编写 C 扩展的语法像 Python** 本身一样简单。Cython 结合了 Python 和 C 的优势,让您可以高效地与大型数据集进行交互。由于 Cython 将代码降到了机器级别,因此加快了 Python 代码的执行速度。你可以在这里找到 Cython 文档。**
Cython 的编译扩展包含三个文件:
- 主文件
- 要在
.pyx
文件中编译的函数 - 一个
setup.py
包含制作扩展模块的指令
用 Cython 创建函数文件
创建一个名为mult_fast.pyx
的文件。.pyx
扩展名用于 Cython 文件
通过在可读的 Python synta x 中添加静态类型声明,我们可以很容易地将 Python 代码调成普通的 C 性能。这可以简单地通过cdef
type
name
=
value
来完成。另外,不要忘记在函数的参数中声明变量。
def mulAB( double[:,:] A , double[:,:] B):
cdef int Am = A.shape[0]
cdef int An = A.shape[1]
cdef int Bm = B.shape[0]
cdef int Bn = B.shape[1] cdef int i = 0
cdef int j = 0
cdef int k = 0 cdef double temp = 0.0 cdef double[:,:] C = np.empty((Am,Bn), dtype=np.double)
在我们的代码中声明变量之后,我们开始下一行with nogil.
现在你只需要在这里复制并粘贴你之前创建的函数:
with nogil:
for i in range(Am):
for j in range(Bn):
temp=0.0
for k in range(An):
temp += A[i,k] * B[k,j]
C[i,j] = temp
return np.array(C)
将所有东西放在一起:
mult_fast.pyx
文件
建立
将该文件另存为setup.py
。
setup.py
您可以复制并粘贴这个setup.py
文件作为您未来的 Cython 文件。您唯一需要更改的是extensions
和setup
( mult_fast
& [“mult_fast.pyx”]
)中的文件名。
在命令行上,键入:
python3 setup.py build_ext --inplace
最后一次接触 Main.py 文件
导入mult_fast.py
并写入main02.py
文件
准备好了吗?让我们发射
我们可以看到 Cython 的性能几乎和 Numpy 一样好。您可能不会选择在小数据集中使用 Cython,但是在处理大数据集时,使用 Cython 来快速完成我们的计算是值得的
结论
通过在我们的 Python 代码中进行一点点修改来利用 Cython,我们已经使我们的函数运行得更快了。我希望这篇文章能给你一些想法,让你以更有效的方式创建自己的模块。在这个 Github repo 中,您可以随意使用本文的代码。
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以通过 LinkedIn 和 Twitter 与我联系。
如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:
你创建了一个待办事项清单来提高效率,但最终却把时间浪费在了不重要的任务上。如果你能创造…
towardsdatascience.com](/maximize-your-productivity-with-python-6110004b45f7) [## 如何从头开始构建矩阵模块
如果您一直在为矩阵运算导入 Numpy,但不知道该模块是如何构建的,本文将展示…
towardsdatascience.com](/how-to-build-a-matrix-module-from-scratch-a4f35ec28b56) [## 用 Python 选择要投资的股票
您计划在未来 3 年投资几只股票,每只股票的每一美元都有不同的预期回报…
towardsdatascience.com](/choose-stocks-to-invest-with-python-584892e3ad22)**
D&D:什么时候为更大的修改器选择更差的辊型
一种利用 R 和概率的算法
在听 Matt Mercer DM 龙与地下城关于关键角色的时候,我有时会听到他给玩家提供一个选择:
- 使用自然滚动(一个 d20 并取值)+修改器,或
- 使用一个不利辊(两个 d20,取较低的值)+不同的修改器。
例如,如果你是一个试图攀爬大堆岩石的僧侣,你可以掷出一个顺子运动检定(选项 1。)把自己拉起来。DM 也可能提供你可以滚动一个杂技检查(你有一个更高的杂技调整值,因为你有一个很高的敏捷),不利条件是沿着岩石跳跃(选择 2。).成功通过检查所需的总值对于任何一次掷骰都是相同的:例如,15(该值称为 DC)。
你该如何选择?嗯,选择应该反映你的性格和他们会做什么。
但是,如果您想最大化检查成功的机会,那么使用下面的算法。请注意,您也可以想象您可以在 I)优势(两个 d20,取较高值)和自然掷骰之间进行选择,或者 ii)优势和劣势掷骰,因此算法也会考虑这一点。
- 估计支票的 DC。作为一名玩家,你可能不知道 DC,但你可以猜测打开沉船上的腐烂木箱可能比打开国王军械库中的坚硬箱子更容易。一般的指导是,简单任务的 DC 在 10 左右(即使不熟练的人也有很大的成功机会),中等在 15 左右(熟练的人有很大的成功机会),困难在 20 左右(熟练的人仍然需要一些运气才能成功),非常困难在 25 左右(熟练的人仍然需要很多运气才能成功)。
- 获得调整后的 DC : 从检查的 DC 中减去较低的修正值(选择更好的辊型)。以蒙克为例,如果你的杂技成绩为+6,体育成绩为+3,从估计的 DC 15 减去较低的修正值(+3),得到调整后的 DC 为 12。
- 获得不同掷骰类型之间的修改值的差异:对于我们的僧侣来说是(+6)-(+3) = 3。
- 在下面的图表中查找最佳选择:要找到要查找的地方,首先进入描述你正在做什么决定的面板。例如,和尚正在决定自然掷骰和劣势,这是第三个面板。其次,在 x 轴(12)上找到上一步中计算的调整后的 DC。第三,找出 y 轴上修改器值的差异(3)。找到他们相遇的颜色(在我们的和尚例子中是红点),并在右边的图例中查找以确定最佳选择。此处为蓝色,表示自然竞技检查比有劣势的杂技检查更有可能成功。
一个很好的经验法则是,如果任务非常困难,你应该愿意降低一个(优势对自然或自然对劣势)或两个(优势对劣势)等级,因为没有额外的修正加成你就没有成功的机会。如果修改量相差 5 或更大,你也应该愿意降一级。
如果你想知道:“这个邪恶的魔法是什么:这个图表是如何创建的?”,请继续阅读。
R +概率=巫师魔法。
让我们从基础开始。当你掷出 d20 时,1 到 20 中的任何一个数字都有 5%的概率被掷出:掷出 d20 是从 1 到 20 之间的离散均匀分布中抽取的。这种分布如下图所示。
然而,我们真正关心的是我们成功的机会:大于或等于 DC 的总机会(例如,垂直红线右侧的条形总面积代表 DC 为 15)。数学上,我们真正关心的是:
如果右边< 0,它应该正好是 0,如果大于 100%,它应该是 100%
这是一个简单的滚动公式。对于两个卷,我们可以利用卷是独立的这一点(所以某件事在两个卷上发生的概率是它在一个卷上发生的概率的平方)代入简单的公式。
现在,我们可以在代码中使用这些公式来确定应该为每个修改器差异和调整后的 DC 选择哪种类型的滚转。
上面创建的数据集如下所示。前两列显示神奇图表的 x 轴和 y 轴(调整后的 DC 和修改器差异)。下面显示的接下来的 4 列是通过某种类型的滚动检查的概率。下面显示的最后 3 列告诉您选择哪种类型的掷骰子来最大化成功的概率。
然后,我们可以透视这些数据,使其更容易绘制。
最后,我们可以将数据送入图表。
神奇!
D3.js —如何用最强大的可视化库制作漂亮的条形图
让我们做一个你不会羞于展示的形象。
选择一个首选的数据可视化库比看起来要困难得多。有这么多可供选择,尤其是如果你考虑到不同的语言。我大部分时间都在使用 Python 中的 Plotly 和 Matplotlib ,但是今天我们将尝试一些不同的东西——D3 . js,用——你已经猜到了——Javascript编写。
由 Kelly Sikkema 在 Unsplash 上拍摄的照片
让我们解决几件事情。首先,我不是一个 JavaScript 专家,所以没有必要指出有些东西没有被优化。第二,这个库非常冗长,我花了将近 100 行代码来制作一个看起来不错的条形图。
这并不一定是一件坏事,因为你可以定制每一个可视化的地狱。在继续之前,让我们快速看一下最终结果:
作者图片
这种颜色变化发生在悬停时,所以不,这不是任何类型的故障。可视化相当简单,但需要大量的工作。在继续编写代码之前,让我们稍微讨论一下 D3 。
那么,D3.js 是什么?
D3 代表数据驱动文档。以下是来自官方文档页面的声明:
D3 帮助您使用 HTML、SVG 和 CSS 将数据变得生动。D3 对 web 标准的重视使您可以获得现代浏览器的全部功能,而无需将自己束缚于专有框架,将强大的可视化组件和数据驱动的 DOM 操作方法结合起来。
厉害!那么,用它有什么意义呢?
我特别喜欢的一个特性是 D3 输出的是 SVG 而不是 Matplotlib 输出的 png。我的目的不是用三个字母的缩写来迷惑你,所以我不会深究 SVG 和 PNG 的区别。
这是你现在应该做的唯一一件事**(首先)——SVG 用于绘制矢量图形,这意味着没有像素,这进一步意味着我们在缩放时不会损失质量。但巴布亚新几内亚的情况并非如此。**
以这张图片为例:
来源:维基共享资源
图像说明了一切。
现在让我们制作图表。请注意,这将是一个很大的工作量。
让我们做一个图表
首先是数据。我们将以 JSON 格式存储一些虚拟数据。我把我的名字命名为sales.json
,它看起来像这样:
[
{“Period”: “Q1–2020”, “Amount”: 1000000},
{“Period”: “Q2–2020”, “Amount”: 875000},
{“Period”: “Q3–2020”, “Amount”: 920000},
{“Period”: “Q4–2020”, “Amount”: 400000}
]
数据到此为止。接下来,我们需要 HTML 文件。如果你不知道 HTML ,不要担心,因为它相当简单,我们不会在它上面花太多时间。
为了简单起见,我决定将 CSS 和 JavaScript 嵌入到 HTML 文件中,但是如果您愿意,可以随意将它们分开。我的档案名为barchart.html
:
<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”UTF-8">
<meta name=”viewport” content=”width=device-width, initial-scale=1.0">
<title>D3.JS Bar Chart</title>
</head>
<style>
rect.bar-rect { fill: #189ad3; }
rect.bar-rect:hover {
fill: #107dac;
transition: all .2s;
}
</style><body>
<div class=”canvas”></div>
<script src=”https://d3js.org/d3.v6.js"></script> <script>
// Everything else will go here
</script></body>
</html>
这是一个入门模板。不要担心 CSS ,我只是用它来给正常状态和悬停状态的条着色。
我们现在可以从图表本身开始了!
一点准备
让我们开始真正的交易。我们的图表部分需要一些维度信息,比如宽度和高度。此外,我们不想让图表占据整个图表部分,所以我们需要在顶部、右侧、底部和左侧添加一些边距。
为此,我们将设置几个常数:
const width = 1000;
const height = 600;
const margin = {‘top’: 20, ‘right’: 20, ‘bottom’: 100, ‘left’: 100};
const graphWidth = width — margin.left — margin.right;
const graphHeight = height — margin.top — margin.bottom;
我认为这些都是不言自明的。如果不是,这里有一个快速澄清:
- 整个图表区将占据 1000 x 600 像素
- 图表本身将位于图表区内,并且四周都有边距
- 底部和左侧的边距较大,因为我们将把轴放在那里
就这么简单。我们继续吧。
初始设置
好了,我们准备好开始有趣的部分了。我们需要以某种方式选择类别为canvas
的div
,因为我们的图表将存储在那里。在其中,我们将创建一个svg
(记住 D3 输出 SVG)并将它的高度和宽度设置为之前声明的值。
接下来,我们可以将图形元素插入到svg
元素中,并将其尺寸设置为之前声明的尺寸。我们不希望它从svg
的左上角开始,所以我们需要相应地translate
它。
最后,我们可以为 X 和 Y 轴组声明常量(暂时不用担心这些)。
代码如下:
const svg = d3.select(‘.canvas’)
.append(‘svg’)
.attr(‘width’, width)
.attr(‘height’, height);const graph = svg.append(‘g’)
.attr(‘width’, graphWidth)
.attr(‘height’, graphHeight)
.attr(‘transform’, `translate(${margin.left}, ${margin.top})`);const gXAxis = graph.append(‘g’)
.attr(‘transform’, `translate(0, ${graphHeight})`);const gYAxis **=** graph.append('g')
如果你现在打开 HTML 文件,你什么也看不到,但这并不意味着什么也没发生。只需弹出控制台,进入元素检查器。以下是您应该看到的内容:
厉害!接下来让我们完成这件事。
绘制图表
现在你期待已久的时刻到了。我们还有很多事情要做,所以让我们开始吧。
首先,我们需要以某种方式读取我们的 JSON 数据。然后,我们将分别在常量x
和y
中声明比例,这些是为了确保单个的条不会意外溢出svg
容器。
接下来,我们需要为数据集中的每个条目创建一个rect
元素(矩形)。每个矩形都有它的高度和宽度,X 和 Y 值,我们还为它添加了一个自定义类,这样就可以更容易地使用 CSS 进行样式化。
在完成enter
功能后,需要做几乎相同的事情,然后我们可以按照自己的意愿设置轴。
我们的图表在 Y 轴上只有 5 个刻度,同一轴上的值将被格式化为货币。是的,轴标签大小设置为 14。
要写的代码很多,所以要花时间去理解每个部分的作用:
d3.json(‘sales.json’).then(*data* => {
const y = d3.scaleLinear()
.domain([0, d3.max(data, *d* => d.Amount)])
.range([graphHeight, 0]); const x = d3.scaleBand()
.domain(data.map(*item* => item.Period))
.range([0, 500])
.paddingInner(0.2)
.paddingOuter(0.2); const rects = graph.selectAll(‘rect’)
.data(data); rects.attr(‘width’, x.bandwidth)
.attr(‘class’, ‘bar-rect’)
.attr(‘height’, *d* => graphHeight — y(d.Amount))
.attr(‘x’, *d* => x(d.Period))
.attr(‘y’, *d* => y(d.Amount)); rects.enter()
.append(‘rect’)
.attr(‘class’, ‘bar-rect’)
.attr(‘width’, x.bandwidth)
.attr(‘height’, *d* => graphHeight — y(d.Amount))
.attr(‘x’, *d* => x(d.Period))
.attr(‘y’, *d* => y(d.Amount)); const xAxis = d3.axisBottom(x);
const yAxis = d3.axisLeft(y)
.ticks(5)
.tickFormat(*d* => `USD ${d / 1000}K`); gXAxis.call(xAxis);
gYAxis.call(yAxis); gXAxis.selectAll(‘text’)
.style(‘font-size’, 14);
gYAxis.selectAll(‘text’)
.style(‘font-size’, 14);
});
如果您现在刷新 HTML 页面,您会看到页面上显示了一个图表。不仅如此,我们还增加了不同的颜色。不错!
今天到此为止。让我们在下一部分总结一下。
在你走之前
D3.js 需要大量代码——这一点毋庸置疑。但这正是它的特别之处——完全定制一切的能力。我们在这里仅仅触及了表面,调整的选项是无穷无尽的。
如果你喜欢这篇文章,请告诉我,因为我打算做一个关于图书馆的完整系列。
感谢阅读。
加入我的私人邮件列表,获得更多有用的见解。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
** [## 通过我的推荐链接加入 Medium-Dario rade ci
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@radecicdario/membership)**
基于随机森林的日客流量预测
探索时间序列预测 ML 模型的一种简单方法。
图片来源于期限
介绍
在搜索时间序列预测时,你一定遇到过许多传统的方法,如萨里玛,STLM,先知等。但是你知道吗,有强大的机器学习技术也可以很好地处理一些数据操作。
而随机森林和其他基于决策树的模型没有考虑时间序列数据的基本概念,如趋势、季节性等。,有一些方法可以生成捕捉这些模式的预测变量。
有无数的资源解释如何使用随机森林进行多步时间序列预测。在这篇博客中,我将解释(用简单的步骤)我如何使用特征工程和单变量时间序列数据的直接预测方法来实现我的项目目标——预测未来 91 天(即未来 13 周)零售店的客流量。我决定采用随机森林集合模型,因为它很健壮,在大多数情况下表现良好。
对于模型评估,我使用了两个误差指标——均方根误差(RMSE)和平均绝对百分比误差(MAPE)。
虽然 NDA 禁止我分享明确的数字结果和图表,但我将解释我采取的步骤,以建立一个工作模型,该模型后来包括在最终的预测工具中。
模型组成
数据处理
任何机器学习建模的第一步都是留出一个维持集。时间序列数据上的训练测试分割不能随机执行,因此我使用我的数据集中最近的 91 个日期作为测试数据,用于基于前述误差度量的最终评估。
RF 通过丢弃数据点或通过某种形式的插补来处理缺失值。平均似乎是一种自然的方式。然而,使用整个时间序列的平均值没有逻辑意义。因此,对于缺失值的处理,我使用了该周的平均客流量。
特征工程
时间序列预测使用按时间顺序排列的历史数据来预测未来可能的结果。我使用特征工程从历史数据中创建预测变量,这将帮助我捕捉数据中的趋势和季节性。
如图表所示,在零售商店数据中观察到年度和周末季节性,即周末客流量较高,节假日期间出现年度高峰(如预期)。
年度客流量趋势(示例),来源于作者
每周客流量趋势(示例),来源于作者
对在数据中观察到的这些模式进行编码的一种简单方法是建立一个学习函数模型,该学习函数将一周中任何给定的一天和的预期客流量预测为过去 N 周中在该天观察到的客流量的函数。例如,为了计算未来“星期五”的预期客流量,使用了过去 N 个星期五的数据。可以相应地选择超参数 N 的接近最优的值。我使用了基于网格搜索的方法,并选择了给出最佳 RMSE 的 N 值。用于此目的的验证数据是训练集中最近 91 天的数据。以下是我为此模型创建的预测变量:
N-滞后周 :在历史数据中找到要查看的最佳周数后,我创建了滞后变量(lag1,lag2…,lagN)来表示每周的滞后。这有效地捕捉到了工作日/周末对商店客流量的影响。 N 的值越大,创建的滞后变量的数量就越多,这直接抵消了训练数据点的数量。因此,我们可以使用多大的 N 是一个权衡。
- 滞后的差异 :我也创建了差异变量。这些是上面定义的连续周滞后之间的差异。它们捕捉特定一天的几周内的运动,并帮助稳定时间序列数据的平均值和方差。示例— diff0 = lag2 — lag1,…。
- 滞后平均 :我计算了滞后变量的移动平均窗口,并将其作为独立变量,以描述特定日期的平均客流量。
- 年度滞后 :为了捕捉数据中的季节性,即一年中的时间对预测日的预期客流量的影响,我计算了可用历史数据的平均每周客流量。例如,如果预测了属于一年中第I周的某一天的客流量,则年度滞后对应于过去所有年份中第I周观察到的平均客流量。我使用了周平均值,而不是过去几年的确切日期,因为一周中的某一天不会保持不变,我们观察到了零售业的周末效应。
- 黑色星期五和感恩节虚拟变量 :这是零售业中两个非常重要的节日,从历史数据中,人们很容易得出结论,这些日期每年都是明显的异常值。因此,它们需要分开处理,以免扭曲模型预测。我使用二进制指示变量来表示这种异常行为,以便允许被训练的模型推断出所述相关性。
直接预测
对于这个多步预测问题,我使用了“直接预测”技术,而不是递归预测。在递归预测中,创建单个模型,并将来自前一步骤的预测用作输入,而在直接预测中,为未来的每个范围创建单独的模型,即 h 单独训练的随机森林模型,用于预测未来的 h 范围。
虽然直接预测在计算上是昂贵的(并且随着预测时间范围的增加而更加耗时),但是它不必处理预测误差的聚集或者在长时间范围内收敛到无条件的平均值。然而,建立一个直接预测模型并不简单。对于未来的每一步,都需要相应地设计培训数据,如下例所示:
对于 horizon = 1,我使用实际客流量作为目标结果,并使用其他变量以如下方式训练第一个模型:
训练矩阵示例(地平线=1),来源于作者
对于 horizon = 2,我从 actual footfall 列中删除了最顶端一周的目标值,并根据以下内容训练模型,从而有效地增加了基于 horizon 的前瞻:
训练矩阵示例(地平线=2),来源于作者
变量的这种移动背后的原因在于,通过用对应于新的范围步长的观察值,即在这种情况下下周的目标值,替换目标变量(actual_footfall ),来自一个模型(预测范围 h+1)的特征被用于训练下一个模型。
为每个层位重复创建预测值和目标变量的过程。为了便于使用,我在 13 个预测变量矩阵(x_train)和 13 个目标向量(y_train)上为 13 个层位中的每一个创建了迭代表。
为了预测未来的每个层位,还需要设计相应的测试数据集。直接预测的 X_test 矩阵特征保持不变(平均年度滞后除外),这是 x_train 矩阵的最后 7 行。我使用这些最新观察到的日期和创建的特征来预测所有未来的步骤。为了便于使用,我在 x_test 矩阵上创建了一个 iterable,它对应于只改变年度滞后变量(如前所述,它是针对一年中的每一周进行预处理的)的每个时间范围。
现在,训练和测试数据以方便的数据结构的形式准备好了,我循环这些数据,并为每个地平线训练了一个随机森林集合。然后,这些模型被用于预测 7 天内目标时间段的商店客流量,并在测试集上进行评估。
结论
这个模型是经过严格的验证和调整而创建的,同时始终牢记客户目标。每一步都设计有意义的特征并提高模型效率,这是一种很好的学习体验。我们最终的工作原型是一个集成学习模型,包括 RF 和传统的时间序列分析技术。这种模型在现实世界中的应用非常广泛。它不仅可以扩展到预测健身房和餐馆等商业场所的客流量,还可以预测网站/网络应用程序的活动和流量。
参考
- 随机森林时间序列预测,https://www . r-bloggers . com/time-series-forecasting-with-Random-Forest/
- 对时间序列数据使用随机森林,https://stats . stack exchange . com/questions/384924/using-a-random-forest-for-time-series-data
- 直接预测 vs 递归预测,https://insightr . WordPress . com/2018/01/10/direct-Forecast-x-Recursive-Forecast/
使用深度学习的你最喜欢的作者的每日励志语录
自然语言处理
这个字幕是从机器人的输入中生成的。你永远不知道你会得到什么!
机器人的印刷设计。更多详情请访问:https://radiomurakami.live/
我一直是日本文学的狂热爱好者,而村上春树作为当代最著名的日本作家在我脑海中浮现。
村上的故事经常有非常生动和巧妙的场景描述,尽管日常生活平淡无奇。这不仅体现在他的小说中,也体现在他的短篇小说和沉思中,比如他的系列丛书村上广播(巧合的是,我们的机器人名字的由来)。
对我来说,这是一种非常强烈的认同感:在他选择用来描述他的角色和他们所处的环境的词语中,有一种人性的本质。
让我思考的是他的风格是否可以被效仿。由于他的许多作品还没有被翻译成英语,尤其是他的幽默短文,如果我们能有一个机器人像你最喜欢的作者一样写作,每天都从谁那里得到灵感,那不是很好吗?如果村上自己能够发现自己的“日语风格”,用有限的一组单词和语法结构表达自己的感情和思想,但以熟练的方式有效地将它们联系起来,那么机器能从这种模式中学习并创作简单而美丽的短语吗?
我和我的朋友保罗·图恩(Paul Tune)认为,尝试使用 GPT 2 号来制作一个村上机器人,以捕捉他的语气和风格,这将是一个有趣的项目,所有这些都在 Twitter 的角色限制之内。
在介绍了这个想法的概述之后,在本文的剩余部分,我将详细介绍村上电台机器人的开发过程,从原始数据收集,使用 GPT-2 的训练,迭代和展示机器人的一些深刻和相关的推文。
还有,是真的:字幕是我们 bot 生成的!
村上春树小传
西方世界的大多数读者对村上春树并不熟悉。
村上于 1949 年出生在京都,当时正值二战后的经济繁荣时期。他一直热爱音乐,尤其是爵士乐,于是和妻子在东京开了一家爵士酒吧。他经营酒吧 7 年了。
作为一个孩子,村上阅读了许多西方作品,从卡夫卡,狄更斯到库尔特·冯内古特。他的短篇小说之一《恋爱中的萨姆莎》是卡夫卡的《T2》中的主人公格雷戈·萨姆莎的故事的续集。
村上的写作生涯在 29 岁才开始,正如他在文章《我成为小说家的那一刻》中描述的那样。1978 年 4 月一个晴朗的下午,在养乐多燕子队和广岛鲤鱼队的棒球比赛中,他说
“球棒碰到球时令人满意的爆裂声响彻整个金谷体育馆。我周围响起了零星的掌声。在那一瞬间,没有任何理由,也没有任何理由,我突然想到:我想我可以写一本小说了。”
比赛结束后,他去新宿买了信纸和钢笔。半年后,他的第一部小说《听风吟》于 1979 年出版。
村上只是在 1988 年的作品《挪威的森林》中有了重大突破,这首歌是对约翰·列侬同名歌曲的引用。它很受年轻日本人的欢迎,并最终被翻译成英语,面向西方观众。
准备数据
可以说,任何数据科学项目中最乏味和最具挑战性的部分是数据的准备。在这种情况下,这没有什么不同。
我们几乎搜索了整个网络,寻找任何可用的英文采访,因为我们希望机器人能够直接接触村上来说话和写作。我们拥有的培训数据包括:
- 村上所有的小说都有,比如 1Q84 和著名的挪威的森林
- 发表在纽约客上的短篇小说
- 村上的采访(这样机器人可以学习第一人称视角)
- 来自 Goodreads 和报价目录的 Twitter 格式报价(这是为了确保模型将学习适应 Twitter 风格的写作格式,而不是长格式文本)
这里有一个警告。村上的所有作品都被不同的人从日语翻译成英语。因此,日语中句子的原始含义和微妙的选词可能无法完全捕捉到,这可以说是日语的著名之处。
幸运的是,村上春树的风格比他的同行更西化,这意味着用英语捕捉意思可能不像其他日本作家那样困难。
为训练收集的整个数据集超过 10 MB,并通过从采访和引用中删除任何非英语、非村上相关的文本来进一步手动清理。Goodreads 上的用户选择的引用中也有很多重复,我们必须审查并删除。我们还有一套单独的培训报价,我们将在下面解释。
训练模型
这里我们使用由 OpenAI 开发的 GPT-2 模型,这是一个因果(单向)转换器,在 800 万个网页和来自普通抓取的超过 15 亿个参数的数据集上进行预训练。GPT-2 经过训练,目标是预测句子中的下一个单词,这与我们手机上的自动完成功能非常相似,但方式更复杂。
因果方向意味着模型可以通过预测给定单词的下一个单词来按顺序生成文本!完美的机器人。
与自动完成功能不同,GPT-2 可以处理句子上下文,这允许它知道一个单词在句子中使用时的差异。以下列句子中的单词 fly 为例,
“这只苍蝇掉进了餐馆的汤里。”
和
飞机的发明让人们能够飞行
在这种情况下,虽然单词 fly 拼写相同,但一个表示昆虫(名词),而另一个表示动作(动词)。通过对整个句子和段落的训练,GPT-2 学习上下文,允许它区分像 fly 这样的词在不同上下文中的使用。这是一个同音异义词的例子,这个词听起来一样,但意思不相关。基于单词的模型(如 Word2Vec)无法捕捉这样的上下文。
我们使用具有 345M 参数的中等大小的 GPT-2 来训练村上广播机器人。下图显示了不同尺寸的 GPT-2 模型之间的区别:
来源:http://jalammar.github.io/illustrated-gpt2/
模型训练中最难的部分已经在预训练的模型中完成了,GPT-2 已经很好地掌握了英语。它将文本输入作为一个符号序列,并预测序列中的下一个输出符号,每个符号都有一个概率作为权重,这样以一种自我监督的方式学习。如果你有兴趣了解更多关于该模型如何工作的信息,杰伊·阿拉姆马有一篇图文并茂的文章,可视化了 GPT-2 的底层机制。
最初,训练包括编写一个被 Max Woolf 的作品破坏的脚本,但是随着从拥抱脸的变形金刚包中逐渐改进的功能,我们使用这个脚本进行训练。该包还具有使从训练模型中采样变得容易的功能。
训练模型很简单:我们所要做的就是将数据集加载到模型中。用了大约 8 个纪元左右,模型就被训练好了,可以部署了!
重复
其中一个主要的挑战是将报价降低到 Twitter 大小的报价。这比预期的要困难得多。一旦我们的初始模型在小说上得到训练,它就会学习如何从小说中生成散文,而不是我们想要的简洁的推文。
这是一个新训练模型的输出示例:
阳光照射下来,空气中弥漫着花香。我可以看到海岸平缓的曲线,白色的沙滩。海浪的声音,树叶的沙沙声,远处蝉的叫声。”
虽然这在村上小说中是一个很好的描述性填充,但它却是一个糟糕的引语生成器!我们必须生成、审查和管理更多的样本,以获得我们想要的使用这个初始模型的机器人。
为了做得更好,我们挑选了一组具有类似 tweet 特性的报价作为我们的数据集。通过在该数据集上训练模型,该模型能够产生更高质量的输出。在此之前,该模型用于生成看起来像村上小说中的散文样本的摘录。现在它产生了一个引用,有人会从小说中挑选出来。我们还通过将模型产生的最佳结果放入模型的下一次训练中进行了试验,这似乎有所帮助,尽管我们意识到了自我强化的偏差。
即便如此,要找到多少有些深刻的引语还是很难,更难的是要找到一个让村上引以为豪的引语。目前,我们仍然以人为本进行治疗,但目前仍在试验更先进的方法。
结果
目前,村上广播机器人的推文是由经过训练的 GPT-2 模型生成的。我们使用种子文本作为手动输入,然后由我们对完整的句子进行半策划。像村上一样,它在推特上发布有趣的日常生活描述和其他思考。
以下是我们最喜欢的一些:
来源:https://Twitter . com/radio _ Murakami/status/1223388001100804099
来源:https://Twitter . com/radio _ Murakami/status/1234984420278325248
来源:https://Twitter . com/radio _ Murakami/status/1225924725437804544
来源:https://Twitter . com/radio _ Murakami/status/1228823823916683264
它有时也能讨论时事,尽管是以一种微妙的方式:
来源:https://Twitter . com/radio _ Murakami/status/1265077706053554178
来源:https://Twitter . com/radio _ Murakami/status/125565622932074503
如果你想每天收到一些村上的美食,你可以点击这里的机器人🤖!
未来的工作
还有一些我们想看的东西—
- 我们肯定可以在选择最佳推文方面实现更多自动化。做到这一点的一个方法是使用另一个模型,如 BERT 作为鉴别器来改进 tweet 生成模型。我们目前正在对此进行试验。
- 我们将更具启发性的报价与设计捆绑在一起,这意味着必须引入与报价相关的图像,并相应地调整它们的大小。这需要一定程度的努力,但是这里的一些自动化也是可能的!
- 如果你想参与这个项目,或者对机器人引用的设计师质量的印刷品感兴趣,请在这里注册在不久的将来获得更多更新!
另外,写这篇文章的时候,我正在欣赏这个 播放列表 。希望你也会喜欢🎧
这首曲子是和保罗·图恩合著的。你可以在 Twitter 上关注他,或者查看他的个人网站!
参考
[1]a .,Wu J .,Child R .,Luan D .,Amodei D .,Sutskever I .,“语言模型是无监督的多任务学习器”,2019。(链接)
[2] Alammar J .,“图解 GPT-2(可视化变压器语言模型)”,2019。(链接)
[3] Anderson A .,Maystre L .,Mehrota R .,Anderson I .,Lalmas M .,“算法对 Spotify 上消费多样性的影响”,WWW '20,2020 年 4 月 20–24 日,台湾台北,第 2155–2165 页。(链接)
[4] Devlin J .,Chang M. W .,Lee K .,Toutanova K .,“BERT:用于语言理解的深度双向转换器的预训练”,2018。(链接)
数据科学家的日常生活:在家工作版
作为一名数据科学家,我们在家主要做什么
嗯,我知道许多数据爱好者想知道我们作为数据科学家到底是做什么的。尤其是在疫情的情况下;“你在家做了什么?”、“有生产力吗?”“数据科学家是远程工作,对吗?”。这是我看到的典型问题。
在这里,我将分享我自己作为一名数据科学家在家中工作的经历。
工作设备
首先,我们数据科学家总是需要数据访问才能正常工作。这意味着无论我们处于什么样的工作条件下;最重要的事情是确保我们可以访问数据(无论是在数据库中还是只是一个文件中)。
我对数据访问工作设备很认真,因为我们的工作总是围绕着数据。当然,有时工作是关于创建一个好的演示或仪表板,但即使这样,那种工作仍然需要数据支持。
根据我的经验,要访问数据库,我首先需要从我的公司获得可靠的设备,因为数据是一件敏感的事情。比如笔记本电脑、VPN 接入、互联网接入等。如果队伍很长,或者我们住在公司以外的另一个城市/国家(就像我一样),这可能需要很长时间。
工作日程
依赖公司;一些公司的工作时间很灵活;例如,只要你每天工作八小时,你就可以随时工作,但是有些公司有固定的工作时间,比如朝九晚五。
我的时间是固定的,这意味着我在工作时需要遵守我的工作时间表。我从周一到周五每天都工作。
虽然我有一个固定的时间表是件好事,但作为一名数据科学家,有时我们不能指望遵循这个时间表。根据我的经验,我们可以期望在更早的时间开始工作,但是大多数时候,我们需要晚一点完成,比如晚到你可以休假。虽然,我猜每个职业都有这种情况。
工作活动
我想人们更想了解数据科学家的活动,而不是设备或时间表。这是我的活动。
所以,我有一半的时间都被项目会议或其他会议占满了。是的,令人惊讶,对不对?数据科学家不从事编码工作,而是开会?
嗯,因为远程工作条件实际上使会议进行起来更容易。现在只需按一下按钮,我们就可以召开多个会议。尽管我们为什么需要这么多会议?因为这是工业情况下的正常活动。
很多数据科学家项目不是基于你自己的喜好,而是基于公司的需求。这意味着我们需要就公司想要什么、如何实施项目、预期结果、时间表以及项目进展情况进行大量讨论。
编码和数据部分在哪里?在那之后。我每周工作的另一半是编码、数据分析和建模,你努力学习它们,尽管它总是在我们同意项目和目标之后。
是的,分析数据和创建预测模型是我们的主要工作,但我们的责任不止于此。虽然数据科学家的耻辱是一直与模型和数据打交道,但事实是你只有一半的时间与它打交道(至少对我来说)。
对于一个数据科学的追求者,我总是建议你适当地了解业务;为什么?你的大部分活动,无论是在家还是在办公室,都会被业务人员围绕着,并期待你的项目如何帮助公司业务。
我在上面提到过,有时我的工作超出了计划。这是因为业务人员不了解分析和创建一个像样的预测模型实际需要多长时间。这就是为什么大多数时候最后期限比我们预期的要严格,我们需要努力做得更多。
任何其他工作活动与远程工作的其他职业相似;培训、研讨会和讨论。
工作效率
数据科学家在家工作时是否也能高效工作?我会说是和不是。
为什么是的?我们可以专注于我们的安全环境,没有任何办公室干扰来分析数据和进行建模。虽然,为什么不呢?因为我在上面提到过,数据科学家与其他业务人员一起工作,这包括你的同事。在远程工作时,很难协调和得到关于你需要的东西的解释。这可能导致等待时间的浪费。
这就是为什么生产率会根据当前的情况而波动。数据科学家毕竟还是人类工作者。
结论
数据科学家可以在任何地方远程工作,因为我们的工作描述主要包括分析数据和创建预测模型。虽然在家工作意味着比在办公室工作有更多的会议活动,但我们需要远程调整许多项目。
生产力会波动,因为有时我们真的很有生产力,但是我们需要等待调整。
如果你喜欢我的内容,并想获得更多关于数据或作为数据科学家的日常生活的深入知识,请考虑在这里订阅我的时事通讯。
如果您没有订阅为中等会员,请考虑通过我的推荐订阅。
与星共舞
从简单的计算规则中探索涌现行为
照片由 Unsplash 上的 Allef Vinicius 拍摄
对人类来说,星星是生活中最可靠的事实之一。我们的主星,太阳,在我们出生的时候就在那里,在我们死去的时候也会在那里。对于我们在夜空中可以观察到的几乎所有其他恒星来说,情况也是如此。是的,偶尔一颗恒星可能会“噗”的一声变成超新星,但总的来说,在我们的一生中,天空中的恒星不会有太大的变化。你可以用它们来设置你的时钟。
从更长的时间尺度来看,恒星会四处走动。每颗恒星都不断地被它周围的所有恒星轻微地推搡着。距离较近的恒星有很大的影响,但是距离较远的大量恒星也有影响。甚至神秘的“暗物质”也会影响恒星之间的相对运动。
几年前,Wolfram|Alpha 的天体物理学家兼研究程序员 Jeffrey Bryant 写了一篇博文,讲述了一个非常有趣的星系碰撞模拟,每个星系包含数十亿颗恒星。这篇文章包括完整的 Wolfram 语言代码,以重现这里显示的完整模拟:
碰撞星系是一种涌现行为的有趣例子,其中微小的个体物体对典型的微小外部影响做出反应。这种行为的另一个很好的例子是一群鸟,其中每只鸟单独对周围鸟的飞行方向的变化做出反应。
用 Wolfram 语言编写非常简单的代码就可以模拟这些突发行为。我的 Wolfram 语言示例大致基于 Wolfram 社区西蒙·伍兹的帖子。它考虑了平面上的许多物体,姑且称之为粒子,它们相互作用。每个粒子都有一个“朋友”,无论它在平面上的什么地方,它总是想朝这个朋友的方向运动。每个粒子也有一个“敌人”,它总是想远离这个敌人。然后,每隔一段时间,一个粒子可能会随机得到一个新朋友和一个新敌人。这有助于保持突发行为的趣味性和动态性。最后,每个粒子都想慢慢漂移到平面中心。这个规则使粒子慢慢远离中心。
这有很多规则,但是一旦分解,用 Wolfram 语言编程就很简单。让我们从挑选粒子数开始,从 1000 开始:
n = 1000
接下来,我们在坐标范围为(-1,1) x ( -1,1)的平面上生成 n 个随机粒子:
x = RandomReal[{-1, 1}, {n, 2}]
每个粒子都有一个朋友和一个敌人。我们用下面一行代码一次性生成它们。列表 p 包含每个粒子的朋友列表,列表 q 包含敌人列表:
{p, q} = RandomInteger[{1, n}, {2, n}]
比如 p 可能以 {621,47,874,…} 开头表示 x 中的第一个粒子与 x 中的第 621 个粒子是好友等等。
吸引力或排斥力的大小取决于粒子和它的朋友或敌人之间的距离。以下函数 f 使用非常简洁的 Wolfram 语言符号一次性计算所有粒子的力:
f = Function[{x, i}, (#/(.01 + Sqrt[#.#])) & /@ (x[[i]] - x)]
为了更新一个时间步长的每个粒子,我们使用下面的代码。第一项 0.995 x 代表粒子向平面中心的漂移。第二项代表吸引力,参数 0.02 指定整体吸引力有多强。最后一项代表排斥力。它的作用与吸引力相同,但方向相反
x = 0.995 x + 0.02 f[x, p] - 0.01 f[x, q]
最后,每个时间步都运行下面的条件语句。大约有 10%的时间是正确的,当这种情况发生时,一个单独的粒子被指派一个新的朋友和敌人:
If[ RandomReal[] < 0.5,
With[{r1 = RandomInteger[{1, n}]},
p[[r1]] = RandomInteger[{1, n}];
q[[r1]] = RandomInteger[{1, n}]
]]
为了将粒子可视化,我们使用一个基本的图形对象将粒子显示为白点。动态表达式检测其范围内是否有任何变量发生变化,如果有,它会重新评估。它本质上是一个智能的 while-true 循环,可以放在呈现的排版代码中的任何位置:
Graphics[{ White, PointSize[0.007],
Dynamic[
If[RandomReal[] < 0.1,
With[{r1 = RandomInteger[{1, n}]}, p[[r1]] = r; q[[r1]] = r]
];
Point[x = 0.995 x + 0.02 f[x, p] - 0.01 f[x, q]]
]},
PlotRange -> {{-1, 1}, {-1, 1}},
Background -> Black,
ImageSize -> 600
]
最终结果可以在 Wolfram 笔记本上直接看到(它会一直播放,直到你选择停止它),或者在下面我为 YouTube 制作的一分钟视频中看到:
很少的代码就能产生如此复杂的行为,这总是令人惊讶的。有很多有趣的方法来创造变化,我希望在未来的帖子中探索。例如,每个粒子可以有多个朋友和敌人,而不是用简单的白点来渲染,人们可以使用任意图形(圆形,多边形)来使事情看起来更奇怪。
丹尼尔·丹尼特的四种能力
理解计算控制算法的一个有用的想法
2018 年,在安纳普尔纳赛道徒步旅行时,我读了丹尼尔·c·丹尼特(Daniel C. Dennett)的 从细菌到巴赫,再回到 *。*我后来仔细研究了它,我期待着重读它。
在书中,丹尼特介绍了能力的四个等级。他们描述了四种逐渐胜任的智能,这四种智能通过连续的试错学习来学习。
这四种能力并不是这本书的中心思想。我在这里介绍它们,因为我发现它们对我理解计算控制算法非常有价值。
它们对教学也很有用。他们通过渐近性能和采样效率来组织计算控制算法。这四种能力还允许对细胞、动物或人类等与不太熟悉的计算算法相关的例子进行分类。
但是我们所说的能力到底指的是什么呢?
什么是能力?
能力就是表现良好的能力。它是一个代理与它的环境交互以实现目标的能力。
能力可以和理解力相对比,理解力是理解的能力。两者一起形成了一个有用的智能分解。
能力允许代理人进行控制——与系统交互并产生结果。这种能力的来源是通过试错从经验中学习。我们称之为进化学习。
进化学习
也许黑客应该表现得更像画家,定期从头开始
保罗·格拉厄姆
进化学习是试错学习。这是使用生成、测试、选择循环的迭代改进:
- 使用前面步骤中的信息生成群体
- 通过与环境的相互作用来测试人口
- 为下一步选择当前世代的群体成员
它是我们宇宙中的驱动力,不依赖于底物。它发生在生物进化、商业、训练神经网络和个人发展中。
从进化学习中可以学到很多东西:
- 低层次的失败推动更高层次的改进
- 迭代改进的有效性
- 二元(代理人和环境)观点的需要使它起作用,与非二元性的真理不一致
这些都是以后要探索的课程。目前,我们关注的是能力的四个等级。
四种能力
四种能力是进化学习的连续应用。每个代理都拥有能力较差的代理所拥有的所有能力。
第一等级是达尔文式的。该代理具有预先设计和固定的能力。它在其生命周期内不会改善。通过选择,通常基于单个数字,在代理的整个生命周期中聚合,改进在全局范围内发生。
生物学的例子包括细菌和病毒。计算实例包括 CEM ,进化算法如 CMA-ES 或遗传算法。
第二个是 Skinnerian 。这种代理通过学习对强化做出反应来改善其行为。
生物学的例子包括神经元和狗。计算实例包括无模型强化学习,如 DQN 或彩虹。
第三个是波普尔主义。这个代理学习其环境的模型。改进是通过离线测试计划及其环境模型来实现的。
生物学的例子包括乌鸦和灵长类动物。计算示例基于模型的强化学习,如 AlphaZero 或世界模型和经典最优控制。
最后一级是公历。这个代理构建思维工具,如算术、约束优化、民主和计算机。改善是通过系统的探索和对精神搜索的高阶控制来实现的。
我们唯一拥有格里高利智能的生物学例子是人类。我不知道有哪种计算方法可以建立自己的思考工具。现在我们已经介绍了我们的四个代理商,我们可以对它们进行比较。
比较四种能力
有几个指标可以用来比较我们的智能代理。
渐近绩效衡量代理在给定的无限机会下如何表现,以获取经验。这是一个代理人在极限下能有多好,并随着我们的代理人获得更复杂的能力而提高。
样本效率衡量代理需要多少经验才能达到一定的绩效水平。随着我们的代理变得越来越复杂,这种情况也会得到改善。采样效率的重要性取决于计算成本。如果计算很便宜,你就不太关心采样效率。
四个代理中的每一个都与相同的环境交互。与代理交互允许代理通过经验生成数据。代理如何处理这些数据决定了它需要多少数据。代理从每次交互中挤出的越多,需要的数据就越少。
例如,达尔文主义者通过由单个数字决定的选择来改进。对于生物进化来说,这是动物交配的次数。对于计算进化来说,这是一个适应度,比如每集平均奖励。这些都是微弱的学习信号。这解释了具有达尔文能力的代理人的低样本效率。
与 Skinnerian 试剂相比,它可以通过选择和强化来提高。能够对强化作出反应使得终生学习成为可能。它有能力从环境的时间结构中学习。Skinnerian 代理使用这些数据来学习预测未来回报的函数。
波普尔代理可以在其生命周期内通过学习其世界的模型来进一步改进。从这些模型生成的数据可用于规划,或生成环境的低维表示。
这些维度(从哪些数据中学到了什么)有助于理解智能代理的不同方法。
摘要
在本文中,我们快速浏览了丹尼尔·c·丹尼特的四个能力等级。他们描述了四种逐渐胜任的智能,这四种智能通过连续的试错学习来学习。
这种思想将通过试错法学习的代理组织起来,并应用于生物学和计算方法。
它允许理解学习算法的渐近性能和样本效率。它强调了智能代理的两个有用的方面——他们使用什么数据以及他们从这些数据中学到什么。
在我们最能干的特工中,人类是唯一的生物样本。我们没有计算的例子。
感谢阅读!
原载于 2020 年 2 月 26 日【https://adgefficiency.com】。
数据的阴暗面:隐私
我们都很欣赏 AI 和机器学习的价值,但是 w 关于隐私方面呢?
一张盖着摄像头的照片。
你认识最近在日常生活中使用谷歌眼镜的人吗?也许几年后这个问题会演变成一个新的问题问谁还记得它。关于谷歌眼镜的故事的普遍观点承认它是一个商业失败,如果我们不陷入忽视这一失败的隐私方面的错误,这是一个合理的推断。
与 10 年前相比,如今对个人数据隐私的关注程度更高,并且还在继续增加。但它是否达到了可以瓦解巨型公司的大量产品的水平,尽管它们的功能很有吸引力?
我非常怀疑社会中的隐私观念是否达到了令人满意的程度。技术发展很快,其后续影响在多年后才显现出来。我们都很欣赏 AI 和机器学习的价值,但是 w 关于所有这些数据的隐私方面呢?我称之为数据的阴暗面尤其是那些工作基于数据的人,在这件事上负有重大责任。
现代世界中的隐私
1890 年,沃伦·布兰代斯 T20 首次描述了隐私。在他们的文章中,隐私被定义为“不受打扰的权利”。在那个时代,世界是一个不同的地方,因此他们引用摄影设备和报纸,而主张这个定义。它今天仍然有效,但是它肯定不足以表达当代隐私概念的所有方面。
在现代社会,定义隐私要复杂得多。事实上,它比以往更加模糊。除了技术带来的好处之外,我们还面临着近期发展带来的副作用。正如在福柯的 纪律与惩罚:监狱的诞生 中所解释的那样,处于监视之下会使人们无法创造新的想法,并使人们质疑自己,在社会中发起自我审查运动,这有助于创造一个适当的环境,让暴虐的政权轻松地统治社会。
圆形监狱(杰里米·边沁设计的监狱,他启发了福柯)
那么,为了保护自己,我们应该停止使用技术吗?在这样一个技术成瘾的世界里做到这一点绝对不是那么简单的。让我们考虑一些例子,就侵犯隐私而言,您会如何应对以下设备:
- 你家周围的闭路电视摄像头。-如果它阻止了恐怖袭击呢?
- 移动设备中的位置跟踪器。如果它在自然灾害中救了你的命呢?
- 手表中的心率测量器。如果它在心脏病发作前警告你怎么办?
- 电视机上的一个音频收听器。-如果它推荐了你正在搜索的产品呢?
是的,我知道最后一个看起来不是那么不可或缺,但每件事都有利弊,每个人都有不同的重要程度,要对自己的数据做出有意识的决定,必须有一定程度的意识。除了技术在我们日常生活中的众多优势,问题仍然存在:谁将保护我们的敏感个人数据免受自私的科技公司、令人不快的政府或功利主义黑客的侵害?
保护你的隐私是很难的,因为如果你失足一次,它将永远存在。
—艾伦·施瓦茨
很明显,最近的一些案例如剑桥分析有助于让社会关注数据的伦理方面。马特图尔克在他的 2019 数据&艾景观 报告中解释道:
或许比以往任何时候都更重要的是,隐私问题在 2019 年跃升至公共辩论的最前沿,现在处于前沿、左侧和中心位置。我们与隐私的关系仍然很复杂,充满了混杂的信号。人们说他们关心 的隐私,但是继续购买各种具有不确定隐私保护的连接设备。他们说他们对脸书的隐私泄露感到愤怒,但脸书继续增加用户并超出预期(2018 年第四季度和 2019 年 Q1)。
你的客户是谁?
上面这个奇特的标题是罗马诗人尤维纳利斯的,可以翻译成“谁看着守望者?”。我用这句话来强调政府和公共机构等隐私机构之间的相互依赖性。
在这一点上,各种数据相关的行动都以某种方式依赖于法律法规,如 GDPR ,可以肯定的是,这些立法是隐私保护工作的一大进步,但它们不是确切的解决方案。
另一方面,像Privacy International这样的基金会在组织人员和建立共同的数据伦理方面发挥着关键作用。此外,由于数据相关领域越来越受欢迎,一些其他机构正在发布自己的道德准则,以明确这种卡夫卡式的环境。
然而,这些致力于隐私权的机构和群众运动本身是不够的。在我看来,这些努力需要来自数据行业中间的人的实际和道义上的支持。所有类型的数据从业者都对他们在这个领域的工作负责。
Dj 帕蒂尔用 5 C 解释了 数据科学的伦理规则 :
- 同意
- 清楚
- 一致性
- 控制和透明度
- 后果和危害
无论你涉及多少数据,关注这样的数据科学伦理是建立数据隐私和使你的工作尊重普遍人权的关键。
可信人工智能伦理准则欧盟报告强调人权的价值及其与人工智能的关系:
必须确保平等尊重所有人的道德价值和尊严。这超出了不歧视的范围,不歧视允许根据客观理由区分不同的情况。
此外,在同一份报告中还提到了人工智能的隐私方面:
人工智能系统必须在系统的整个生命周期中保证隐私和数据保护。…人类行为的数字记录可能让人工智能系统不仅可以推断个人的偏好,还可以推断他们的性取向、年龄、性别、宗教或政治观点。为了让个人信任数据收集过程,必须确保收集到的关于他们的数据不会被用于非法或不公平地歧视他们。
人类最古老最强烈的情感
在这篇文章中,我不打算提及侵犯隐私的危害,相反,我旨在提及一些有意识的人的道德责任。我知道很难确定哪种行为是道德的,因为它会因情况而异。无论如何,道德准则为我们提供了路线图,我们有责任让我们的工作尊重人权和数据隐私。我认为,这种责任优先于金钱,因此,如果有人要求你打破你的原则,你必须有能力拒绝。
人类最古老、最强烈的情感是恐惧,而最古老、最强烈的恐惧是对未知的恐惧
——惠普·洛夫克拉夫特
结论
我们都在使用强大的机器学习工具,访问大量的数据源,并轻松地充分利用这些技术机会。然而,应该记住,所有这些权力都伴随着责任,数据伦理是这个领域不可分割的一部分。这样我们就能最大限度地减少未知,并与最强烈的恐惧作斗争。
这一领域的一些其他来源:
- 经合组织人工智能原则
- 申报—蒙特利尔负责人艾
- 人工智能伦理:七个陷阱 安妮特·齐默曼和本德特·泽文伯根著
- 隐私是新的数字鸿沟,作者夏羽·拉沃伊
- 我强烈推荐关注 Zeynep tüfek ci,因为她在这个主题上的文章非常出色。
DataViz 系列:仪表板 KPI 基本模板
在 Unsplash 上由 Austin Distel 拍摄的照片
实践教程
仪表板中 KPI 模板可视化的剖析。带 Tableau 的动手演示,从零开始。
关键绩效指标(KPI)是任何业务领域中任何仪表板的基石。制造这些砖块的一个聪明的方法是开发一个 KPI 模板,这是一组混合数据来解释业务的表达式和参数。好的,但是我们如何制作 KPI 模板呢?
介绍
在本文中,我将解释并展示如何在专业仪表板中开发干净的 KPI 可视化的底层对象。这个想法是建立一个可以应用于任何业务领域的 KPI 模板。
我将通过 Tableau 来完成,但它可以很容易地适应其他 dashboarding 工具,如 Qlik 或 Power BI。如果您希望以演示的方式重复这些步骤,您可能希望创建一个 Tableau 公共登录(免费),并下载我使用的数据集(链接)。
如果你读了我的另一篇文章“仪表板设计的灵感”(下面的链接),我将在这里解释如何准确地开发驾驶舱中显示的任何 KPI。
如何将业务指标和故事塑造成仪表板
medium.com](https://medium.com/analytics-vidhya/inspiring-ideas-for-dashboards-design-172b31ca9620)
关于 Tableau 的详细信息,我已经在下面链接的另一篇文章的“报告或仪表板:Tableau Public ”一节中谈到了它的公共版本
我在家里的“真实世界”数据科学环境:数据库,ETL,数据分析,仪表板,9 个步骤。
medium.com](https://medium.com/analytics-vidhya/create-a-real-world-data-science-environment-at-home-7a4255ff6fa5)
KPI 要求
我们的目标是通过构建 KPI 的 3 个核心元素:KPI 值、趋势和绩效,来构建所有的对象,以制作一个标准的 KPI 模板。
例如,下面的可视化使用了我们将要开发的模板的 8 倍。
来自 Tableau Public 的截图
我们的 KPI 模板的输入是一个数据集,其中包含一个随时间变化的业务度量(例如,ID_DATE 上的月销售额)。
作者截图
我们希望 KPI 模板可视化能够动态响应时间和性能范围的选择器。
作者截图
KPI 模板的输出需要提供 3 个信息
a)所选期间内业务指标的 KPI 值
b) KPI 绩效定义为 KPI 值与基准
c) KPI 在一年滑动期内的趋势
作者截图
动手操作:Tableau 的 KPI 开发
在接下来的 6 个段落中,我将带您一步步地了解 KPI 模板可视化的实际开发过程。
1。创建数据源
你可以从这个链接下载源数据集。
作者截图
创建一个 Tableau 工作簿,并将“数据源”选项卡配置为连接到一个文本文件(该文件在示例中是一个. csv 文件)。
完成后,您应该会看到导入的数据:每一行都给出了一段时间内业务度量的值(例如,它可以是利润、利润,…,如果您处理销售领域、净推销商分数、参与度,…,在数字营销等方面。).
“值”是业务度量,“Id 日期”是它所引用的日期。
作者截图
数据类型是自动选择的,但是您总是需要检查它。
在这种情况下,它们是正确的:#表示数字列,Date 表示“Id Date”。您将始终需要检查这一点,以防手动更改数据类型。
我们现在需要创建所有的 Tableau 对象,它们将成为我们可视化的基础。这一切都是通过底部的选项卡创建一个 Tableau Sheet 开始的。
Tableau 表是 Tableau 中最详细的可视化级别。在这里您可以定义包含数据表达式(计算、转换、过滤等)的对象。)和可视化(图表、视图、地图等)。).通常,仪表板由几个 Tableau 表组成。
在左侧,您可以看到源文件的 3 列。Tableau 已经为它们添加了一些智能:它将“Id 日期”和“Id 行”归类为维度对象(蓝色),将“值”归类为度量(绿色)。
作者截图
2.构建参数和选择器
参数可用于向尺寸或度量对象传播值。在 Tableau 中(其他工具不同),使用参数的方法之一是通过选择器设置其值。另一种方法是存储一个常量值。对于我们的 KPI 模板,我们决定显示 3 个选择器:当前月份、年份和绩效范围。
- C **当前月份:**将其定义为整数列表,取值范围为 1 到 12。
作者截图
- 当前年份:定义为整数列表,有你需要的年份(2018,2019,2020)。
作者截图
- 性能范围:定义为一个字符串列表,包含您想要允许的性能。在此模板中,我们提供了显示 3 个范围,但您可能希望添加更多范围:
当前月份与目标值的比较
当月与上月相比
当前月份与去年当前月份的对比
作者截图
现在我们已经创建了 3 个参数,接下来我们可以构建实际的用户选择器:右键单击每个参数并选择“Show Parameter ”,这样它们就会出现在您的工作表中,并且可以被更改。
作者截图
要像我一样显示选择器,您需要右键单击参数并选择紧凑列表视图模式。
作者截图
最后,我们需要创建一个新参数来定义我们希望用于性能范围“当前月份与目标值”的目标值。我们可以将其定义为 10000(这可能代表期望的月销售利润、新客户数量或任何其他目标基准)。
作者截图
3.创建公用设施维度
基于上面定义的选择器“当前年份”和“当前月份”,我们需要通过构建一些维度来解释它们所代表的实际日期,我称之为效用维度。即使用户只选择一对“当前年份”和“当前月份”,这些维度也允许计算几个度量值,每个度量值在不同的时间段进行计算。
创建以下 4 个对象维度
作者截图
用下面的表达式
**Date Current Month - Current Year
=** MAKEDATE([Current Year],[Current Month],1)**Date Current Month - Previous Year**
= MAKEDATE([Current Year]-1,[Current Month],1)**Date Next Month**
= DATEADD('month',1,[Date Current Month - Current Year])**Date Previous Month**
= DATEADD('month',-1,[Date Current Month - Current Year])
解释:函数 MAKEDATE 根据提供的年、月和日建立一个日期。在我们的模板中,年和月是我们的参数,日被设置为 1。
函数 DATEADD 递增(或递减)所提供的日期。在这里,我们通过在当前月份上加 1 来计算下个月的日期。
然后我们创建一些维度,以文本格式很好地显示日期,比如
作者截图
作者截图
为此,我们创建了以下两个维度
作者截图
由下面的表达式定义。
**Current Period Lable**
= LEFT(DATENAME(“month”, [Date Current Month — Current Year]),3)
+ “-” + RIGHT(DATENAME(“year”,[Date Current Month — Current Year]),2)**Performance Reference Lable**
= CASE [Performance Scope]
WHEN 'CurrentMonth_vs_PreviousMonth' THEN LEFT(DATENAME("month", [Date Previous Month]),3)
+ "-" + RIGHT(DATENAME("year",[Date Previous Month]),2)
WHEN 'CurrentMonth_vs_PreviousYear' THEN LEFT(DATENAME("month", [Date Current Month - Previous Year]),3)
+ "-" + RIGHT(DATENAME("year",[Date Current Month - Previous Year]),2)
WHEN 'CurrentMonth_vs_Target' THEN "Target"
END
正如您所注意到的,它们基于我们之前构建的对象,而这些对象又是基于参数构建的。
4。在时间范围内建立 KPI 指标
这里是最有趣的部分:实际的 KPI 计算。对于任何 KPI,我们都需要两个成分:一个业务 度量,以及一个业务规则来将度量转化为 KPI。例如,来自电信公司:电话呼叫的持续时间将是业务度量,KPI“每日平均持续时间”的业务规则将是:每天电话呼叫的平均持续时间。
在我们的 KPI 模板中,我们的业务度量对应于 Tableau 对象“Value”,它表示名为 Value 的源列。我选择按月计算总值作为业务规则。
可以通过改变聚合函数来改变规则。例如,每笔交易的平均金额如下:
让我们构建相应的 Tableau 对象:
作者截图
为什么我们需要 3 个度量?因为我们考虑 3 个不同的时期:当月,上月,上年的当月。稍后当我们计算 KPI 绩效时,您会更好地理解原因。
他们的表达如下:
**KPI (Current Month)**
=SUM(IF (YEAR([Id Date]) = [Current Year]
AND MONTH([Id Date]) = [Current Month])
THEN [Value]
ELSE NULL
END)**KPI (Previous Month)**
=SUM(IF (YEAR([Id Date]) = YEAR([Date Previous Month])
AND MONTH([Id Date])= MONTH([Date Previous Month]) )
THEN [Value]
ELSE NULL
END)**KPI (Current Month Previous Year)** =SUM(IF (YEAR([Id Date]) = [Current Year] - 1
AND MONTH([Id Date]) = [Current Month])
THEN [Value]
ELSE NULL
END)
让我们解释一下第一个表达式 KPI(当月),其他的遵循相同的概念。我们需要保留属于当前月份的源“值,并在其他地方强制为空。
作者截图
这个过滤是由蓝色突出显示的表达式部分完成的,它逐行测试我们的数据源的日期(“Id Date”)是否属于“当前年份”和“当前月份”期间。
作者截图
例如,如果日期选择器设置为 2018 年 4 月,KPI 将只考虑绿色的源数据:
作者截图
下面突出显示的表达式的剩余部分聚合了 KPI 定义范围内的所有值(即 Sum)。
作者截图
作者截图
最后,我们可以构建另一个度量,读取之前构建的参数“性能范围”。创建对象
带着表情:
**KPI (Performance Scope)**
=CASE [Performance Scope]
WHEN 'CurrentMonth_vs_PreviousMonth' THEN [KPI (Current Month)]
WHEN 'CurrentMonth_vs_PreviousYear' THEN [KPI (Current Month)]
WHEN 'CurrentMonth_vs_Target' THEN [KPI (Current Month)]
END
您可以看到,根据性能范围选择器,该对象充当一个开关,选择一个 KPI(t)。在我们的模板中,我们决定只查看当前月份,因此在任何情况下我们的开关都是“KPI(当前月份)”,但是您可能希望将其扩展到其他范围(例如,当前年度、季度、周等)。).
作者截图
为了可视化我们的 KPI 的趋势,我们希望显示它在滑动年份的值。为此,我们可以构建以下对象和表达式,它利用了我们之前计算的日期。
**KPI Sliding Year**
=SUM(IF ([Id Date] > [Date Current Month - Previous Year]
AND [Id Date] < [Date Next Month] )
THEN [Value]
ELSE NULL
END)
5.构建参考度量
为了显示 KPI 性能,我们需要将一个时间范围内的 KPI 与一个基准进行比较。对于我们的 KPI 模板,我们设置了 3 个不同的基准:目标值、上个月的 KPI 值和上一年的同一个月。
作者截图
为了允许引用的动态行为,我们需要构建以下 4 个对象,我将在下面解释。
作者截图
**KPI Target**
=[Target]
这个对象只是从之前创建的参数 Target 派生而来。
**KPI Reference (Performance Scope)**
=CASE [Performance Scope]
WHEN 'CurrentMonth_vs_PreviousMonth'
THEN [KPI (Previous Month)]
WHEN 'CurrentMonth_vs_PreviousYear'
THEN [KPI (Current Month Previous Year)]
WHEN 'CurrentMonth_vs_Target' THEN [KPI Target]
END
根据选择器绩效范围的值,选择三个基准 **KPI(上月)、KPI(当月上年)**或 KPI 目标中的一个作为参考。
**KPI vs Reference (Performance Scope)**
=[KPI (Performance Scope)] - [KPI Reference (Performance Scope)]
该对象通过计算差异,将所选范围的 KPI 与 **KPI 参考(绩效范围)**进行比较。在其他情况下,表达式也可以是比率或%。
然后,我们创建另一个(相同的)度量,该度量仅用于以不同的方式显示其值。当我们构建实际的可视化时,我们将看到如何配置一些额外的属性。
**KPI vs Reference (Performance Scope) Sign**
=[KPI (Performance Scope)] - [KPI Reference (Performance Scope)]
6。将一切放在一起:KPI 可视化
我们现在需要结合 Tableau 维度和度量来制作我们的动态 KPI 可视化。
简而言之:我们将把维度和度量合并到 5 个 Tableau 工作表中,定义如何可视化它们中的每一个,最后使用工作表组成一个仪表板部分来呈现 3 个 KPI 的基本元素:值、趋势和绩效。
作者截图
- (1) KPI 值
- (2)标题
- (3)期间标签
- (KPI 值与参考值的符号
- (5) KPI 趋势
我将在下面介绍如何制作每张工作表。
(1) KPI 值
让我们从 KPI 值开始:您需要将对象 KPI (Performance Scope) 作为文本拖放(只需将其拖放到文本标记中,参见下面的黄色箭头)。
作者截图
要像我一样设置文本格式,您需要单击文本标记并设置如下属性
作者截图
有几种方法可以显示$符号。一种是右键单击 KPI(绩效范围)对象,格式化,并编辑数字格式如下:
作者截图
(2)字幕
标题区域显示 KPI 值与所选绩效值的比较。
您需要创建一个新的 Tableau 工作表,拖放 KPI vs Reference(绩效范围)和Performance Reference Lable作为工具提示(只需将它们拖放到工具提示标记中,参见下面的橙色箭头)。
作者截图
使“标题”窗口在 Tableau 画布的底部可见,单击顶部菜单“工作表”,然后选择“显示标题”。
然后双击标题区域和“插入”,添加两个对象如下
作者截图
要设置为 **KPI vs Reference(绩效范围)**显示的格式,您需要编辑其格式,如下所示
作者截图
我用的表达是
▲ +$#;▼ -$#;=
(3)期间标签
周期标签显示了我们分析的周期和比较的基准。
要构建可视化,您需要创建一个新的工作表,并将对象绩效参考标签和本期标签作为文本拖放
作者截图
(4)KPI 值与参考值的符号
为了直观地显示 KPI 值与参考值的比较,我们可以将其符号显示为彩色的▲或▼。它显示当前周期是比参考周期更好(绿色▲)还是更差(红色▼)。
要实现这一点,创建一个新的工作表,然后拖放对象KPI vs Reference(Performance Scope)Sign作为文本和颜色标记。
作者截图
要设置形状,请使用表达式编辑文本对象的格式
▲;▼;=
作者截图
要设置颜色,单击颜色选项卡,并选择红绿发散,以零为中心。这样正值将以绿色显示,负值以红色显示。
作者截图
(5) KPI 趋势
要显示去年的趋势,创建一个新的工作表,将 KPI 滑动年份拖放到区域行中,并在列中定义以下表达式。
DATETRUNC('month', [Id Date])
然后在标记编辑器中选择“区域”,你会看到类似下面的东西。
作者截图
然后,您应该自定义颜色和隐藏轴标签,以完全如上所示。
撰写仪表板节
您刚刚创建的所有工作表都可以合并到一个仪表板(部分)中。在真实的仪表板中,我们会一起显示许多 KPI 可视化,所有这些都基于相同的模板,以提供和谐和一致性,因此这里我们只使用一个 KPI 进行演示,以介绍这个概念。
让我们创建一个新的仪表板(通过单击下面的橙色框)并导入我们创建的所有工作表(参见黄色框),然后将它们排列如下
作者截图
如果您尝试更改选择器的值,您将看到 KPI 值和性能发生变化。
作者截图
努力
您可能认为仅仅为了一个 KPI 可视化,您就必须构建相当多的对象,对吗?。在真实的仪表板中,我们通常一起呈现许多 KPI(见下图),并且所有 KPI 共享相同的参数和效用维度。因此,您需要进行的实际开发不到我们在此演示中所做的一半。
此外,一旦您有了 KPI 模板,您可以通过复制我们通过 4 和 5 创建的度量来创建新的模板,如果基于不同的业务规则,只需替换基本的源度量和计算。这使得开发变得快速而简单,因此我毫不怀疑使用这个或类似的 temples 所带来的优势,而不是为每个可视化构建一组自定义的对象。
来自 Tableau Public 的截图
简而言之…
在这个故事中,我通过一个实际操作的场景,与您分享了我构建 KPI 模板可视化的方法。KPI 模板使得仪表板开发比非结构化开发更简单、更快速、更易于维护。
该方法可轻松应用于任何其他工具(例如 Qlik、Power BI 等)。)和业务领域,只要我们有一个随时间变化的度量标准。
我还提供了我使用的源数据,并一步一步地描述了我是如何实现 KPI 模板的每个部分的,这样,无论您的技能水平如何,如果您愿意,您都可以自己重做。