原文:TowardsDataScience Blog
协议:CC BY-NC-SA 4.0
使用变压器实现语音识别的突破
原文:https://towardsdatascience.com/breakthroughs-in-speech-recognition-achieved-with-the-use-of-transformers-6aa7c5f8cb02?source=collection_archive---------2-----------------------
思想和理论
让我们来谈谈由于变形金刚而在语音识别方面出现的关键突破!
作者图片
亲爱的读者。让我们谈论一些不能不激发你的想象力的事情——让我们谈论由于变形金刚而在语音识别方面出现的关键突破。
本文概述了在语音识别中使用基于 Transformer 的体系结构时使用的主要技巧。每一个特别激动人心的想法都用粗体突出显示。在这个过程中,将会有许多链接允许您更详细地解析所描述的技术的细节。在本文的最后,您会发现基于 Transformer 的语音识别模型的基准。
略谈语音识别
开发人员使用语音识别为各种产品创建用户体验。智能语音人工智能助手、呼叫中心代理增强和对话式语音人工智能只是最常见的几种用途。像 Gartner 这样的分析师预计,语音到文本(STT)的使用在未来十年只会增加。
语音识别(语音到文本,STT)的任务看似简单——将语音信号转换成文本数据。
解决这个问题的方法有很多,新的突破性技术也在不断涌现。迄今为止,最成功的方法可以分为混合和端到端解决方案。
在STT的混合方法中,识别系统由几个组件组成,通常是声学机器学习模型、发音 ML 模型和语言 ML 模型。单独组件的训练是独立执行的,并且为推断构建解码图,在解码图中执行对最佳转录的搜索。
端到端方法是一个系统,其所有部分一起训练。在推理中,这样的系统通常会立即返回文本。端到端方法根据学习标准和架构类型进行分类。
有趣的是,基于变压器的解决方案不仅在混合系统和端到端系统中都有应用,而且比许多其他现代解决方案都要好!
一点关于变形金刚
Transformer 架构出现在 2017 年的后续论文【1】中,解决机器翻译的问题。有很棒的论文详细解释了这种架构是如何工作的——看看这两篇( 1 )。 2 。
作者图片
后来,NLP 有了很大的发展,变压器架构得到了发展,需要解决的任务范围增加了,基于变压器的解决方案的结果越来越少。
在接管 NLP 之后,transformers 已经被引入其他机器学习领域:语音识别、语音合成和计算机视觉等等。
现在让我们进入正题。
语音转换器
语音识别中第一次提到变压器可以追溯到 2018 年,当时一群中国科学家发表了一篇研究论文【2】。
作者图片
架构的变化很小——卷积神经网络(CNN)层是在将特征提交给转换器的输入之前添加的。这使得减少输入和输出序列的尺寸差异成为可能(因为音频中的帧数明显高于文本中的标记数),这对训练有有益的影响。
尽管结果并不令人眼花缭乱,但这项工作证实了变形金刚确实可以成功地用于语音识别!
首次改进
2019 年,语音转换器在不同方向有几项关键改进:
- 这篇论文的作者提出了一种将 CTC 损耗集成到语音转换器中的方法。CTC 丢失已经在语音识别中使用了很长时间,并且具有几个优点。
首先,由于允许使用空白字符进行对齐,它允许我们考虑特定音频帧与特定转录字符的对应关系。
其次,这是 Speech-Transformer 的第二个改进,它简化了将语言模型整合到学习过程中的过程。
- 拒绝正弦位置编码(PE) 。与长序列相关的问题在语音识别中更为严重。拒绝以不同的方式发生——在一些论文中,从绝对位置编码过渡到相对 PE(如在论文 [4】之后的中所见),在其他论文中——通过用池层替换 PE(如在论文 [5】之后的中所见),在第三篇论文中——用可训练卷积层替换位置编码(如在论文 [6]之后的中所见)。后来的工作证实了其他技术对抗 sidusion PE 的优越性。
- 变压器首次适应流识别。这两篇论文的作者[ 5 ]和[ 7 ]分两个阶段完成了这项工作——首先,他们调整了编码器,使其能够以块为单位接收输入信息并保留全局上下文,然后使用单调分块注意力 (MoChA)技术进行在线解码。
- 仅使用变压器的编码器模块。对于某些系统(例如,混合方法或基于传感器的解决方案),要求我们的声学模型完全像编码器一样工作。这项技术使得在混合系统【8】和传感器识别系统【9】中使用变压器成为可能。
在 2019 年 10 月,在一篇研究论文(【10】)中,对基于 ESPNet 框架的变压器与其他方法进行了广泛的比较,这证实了基于变压器的模型的识别质量。在 15 项任务中的 13 项中,基于 transformer 的体系结构比循环系统要好。
使用变形金刚的混合语音识别
在 2019 年末-2020 年初,变形金刚在混合语音识别方面取得了 SOTA 成果(如[ 8 ]所示)。
如前所述,混合方法的一个组成部分是声学模型,它现在使用神经网络。本文中的声学模型由几层变换器编码器组成。一个这样的层的示意图如图 3 所示。
作者图片
在这项工作中最有趣的事情,我想强调的是,作者再次证明了可训练 卷积(即,类 VGG)嵌入相比正弦 PE 的优势。他们还使用迭代损失来提高训练深度变形金刚时的收敛性。深度变形金刚这个话题还会进一步讨论。
变压器传感器
更准确地说,两款 Transformer Transducer——一款来自脸书【9】,一款来自谷歌【11】出现在 2019 年底和 2020 年上半年。形式上,在脸书的工作中,它被称为变压器-传感器(由连字符分隔)。但是这两项工作的本质是相同的— 将变压器集成到 RNN 传感器架构中。
作者图片
集成并不针对整个变压器,而仅针对编码器,作为 RNN-T 框架中的音频编码器。在这篇论文【11】中,预测器网络也是基于变压器的,但是层数更少——在推理过程中经常需要调用该组件,不需要更复杂的架构。
与 CTC 损失不同,RNN-T 损失允许您不仅考虑基于输入序列的概率,还考虑基于预测标签的概率。此外,transformer 传感器架构的一个优点是,这种方法更容易适应流识别,因为只使用了 Transformer 的编码器部分。
2020 年夏天,另一篇论文【12】发表,命名为 conv-变压器换能器,其中音频编码器由三个块组成,每个块包含卷积层,然后是变压器层。今年秋天,在[ 13 ](这是[ 11 ]的延续)中,作者提出了可变上下文层技术,该技术允许训练一个能够使用未来上下文的可变大小的模型,在推理阶段提供折衷的延迟/质量。
本地&全球背景
基于变压器的架构的优势之一是其高效率,同时考虑到了全球背景。在音频信号中,本地连接比全球连接起着更大的作用。2020 年夏天,发表了几部作品,引起人们对这些方面的关注,并再次将基于变压器的模型引入差距:
- [ 14 的作者提出通过在多头注意力(MHA)模块后添加卷积模块来改变变压器模块的架构。卷积更擅长考虑局部信息,而变压器模型擅长提取全局信息。作者将最终模型命名为 Conformer 。同样,受马卡龙网的启发,作者使用了半步前馈网络。
- 论文 15 介绍了弱注意抑制技术;建议使用稀疏注意力,动态地将小于某个阈值的权重置零,以便我们使模型在整个上下文中分散较少的注意力,并且更多地关注有意义的帧。
可流式传输的变形金刚
如上所述,换能器方法允许系统用于流式语音识别,即,当音频实时进入系统时,处理立即发生,并且系统一准备好就返回响应。流识别是语音对话人工智能任务的先决条件。
然而,对于要进行流式传输的系统,transformer 模型本身必须能够顺序处理音频。在最初的转换器中,注意力机制查看整个输入序列。
语音识别中有以下流数据处理技术,用于基于转换器的解决方案:
- 有时间限制的自我关注被使用,例如在下面的论文【11】。每个变压器层都有一个有限的前瞻性上下文。这种方法的缺点是,随着层数量的增加,随着展望未来的一般环境的增加,延迟也会增加。
- 分块处理 —思路见 5 、 16 、 17 。想法是将片段/块/组块作为输入提供给转换器。这种方法的缺点是上下文仅限于片段。为了不丢失全局上下文,可以将其作为单独嵌入进行传输,如[ 5 ]所示,或者使用具有循环连接的架构,其中来自先前片段的嵌入被传输到当前片段,如[ 16 ]所示,或者使用来自存储在存储体中的所有先前处理的片段的信息。这种方法被称为增强记忆,在 17 中提出。
电磁变压器
在接下来的研究论文【18】中,提出了一种适用于流识别的模型,包括混合设置和传感器系统。
Emformer 继续发展[ 17 ]中的观点。像它的前身一样,Emformer 使用增强内存。执行计算优化、计算缓存,不从当前层使用内存库,而是从先前的转换器层使用,并且添加了 GPU 并行化。
因此,有可能实现系统训练的显著加速和推理时间的减少。此外,由于更少的无用计算,该模型收敛得更好。
无监督语音表示学习
变形金刚成功应用的另一个领域是基于未标记数据构建高级音频表示,在此基础上,即使简单的模型也会产生良好的结果。
在这里我要特别说明一批作品——mock injay【19】Speech-XLNet【20】Audio ALBERT【21】TERA【22】wav2 vec 2.0【23】。
构建这种视图的一个想法是破坏频谱图(通过沿时间轴屏蔽它,如在 Mockingjay 和 Audio ALBERT 中,或者沿时间轴和频率轴屏蔽它,如在 TERA 中,或者打乱一些帧,如在 Speech-XLNet 中),并训练模型来恢复它。那么这种模型的潜在表示可以被用作高级表示。这里的转换器充当一个模型,或者更确切地说,它的编码器加上之前和之后的附加模块。
作者图片
生成的视图可用于下游任务。此外,模型的权重可以被冻结或留给下游任务进行微调。
另一个想法是在 wav2vec 2.0 中实现的。是VQ-wav2 vec【24】的延续。
首先,使用卷积神经网络层从音频信号构建潜在表示。潜在表示被馈送到变换器的输入,并且也用于构造离散表示。变压器入口处的一些帧被屏蔽。transformer 模型被训练成通过对比损失来预测类似离散的授权。与 vq-wav2vec 不同,离散和潜在表征的学习现在一起发生(端到端)。
作者图片
在[ 25 ]中,作者将 wav2vec 预训练的思想与 Conformer 架构结合使用。作者使用 LibriLight 数据进行预训练,并在撰写本文时获得了 LibriSpeech 语料库上的 SOTA。
大规模设置
大多数科学出版物都考虑在小型的大约 1000 小时的案例上训练的模型的结果,例如 LibriSpeech。
然而,像[ 26 ]和[ 27 ]这样的研究表明,基于变压器的模型即使在大量数据上也显示出优势。
结论
本文研究了在语音识别中使用基于转换器的模型时遇到的技术。
当然,这里并没有体现语音识别领域所有与变形金刚相关的论文(STT 与变形金刚相关的作品数量呈指数级增长!),但我努力为你收集了最有趣的想法。
最后—基于 LibriSpeech 变压器的模型案例的 WER 图:
作者图片
作者图片
参考文献
- A.瓦斯瓦尼等人,2017,“注意力是你所需要的一切”,https://arxiv.org/abs/1706.03762
- 长度董等,2018“语音转换器:无递归序列到序列的语音识别模型”,,
- 南 Karita 等人,2019,“利用连接主义时间分类和语言模型集成改进基于 Transformer 的端到端语音识别”,https://pdfs . semantic scholar . org/FFE 1/416 BCF de 82 f 567 DD bebccfeb . pdf
- 页(page 的缩写)周看了看周虎。,2019,“利用并行调度采样和相对位置嵌入提高语音识别的变换器泛化能力”,https://arxiv.org/abs/1911.00203
- E.Tsunoo 等人,2019,“带上下文块处理的变压器 ASR”,https://arxiv.org/abs/1910.07204
- A.Mohamed 等人,2019,“用于自动语音识别的卷积上下文的变压器”,https://arxiv.org/abs/1904.11660
- E.Tsunoo 等,2019,“走向在线端到端的变压器自动语音识别”,https://arxiv.org/abs/1910.11871
- Y.王等,2019,“基于变换器的混合语音识别声学建模”,
- C.叶等,2019,“变压器-换能器:带自我注意的端到端语音识别”,https://arxiv.org/abs/1910.12977
- 南 Karita 等人,2019,“Transformer vs RNN 在语音应用中的对比研究”,【https://arxiv.org/abs/1909.06317
- 张等,2020,“变压器换能器:一种具有变压器编码器和 T 损失的流式语音识别模型”,【https://arxiv.org/abs/2002.02562】
- W.黄等,2020,《变压器换能器:低延迟、低帧率、可流式传输的端到端语音识别》,、
- A.Tripathi 等人,2020,“Transformer Transducer:一种统一流式和非流式语音识别的模型”,https://arxiv.org/abs/2010.03192
- A.Gulati 等人,2020,“Conformer:用于语音识别的卷积增强变换器”,https://arxiv.org/abs/2005.08100
- Y.史等,2020,“基于变压器的弱注意抑制语音识别”,
- Z.田等,2020,“用于端到端语音识别的同步变压器”,,
- C.吴等,2020,“基于流式传输器的具有增强记忆的自注意声学模型”,,
- Y.史等,2020,“Emformer:基于高效记忆变换器的低延迟流式语音识别声学模型”,
- A.T.Liu 等人,2019,“Mockingjay:深度双向变换编码器的无监督语音表示学习”,https://arxiv.org/abs/1910.12638
- X.宋等,2020,“Speech-XLNet:自注意网络的无监督声学模型预训练”,
- 页(page 的缩写)迟等,2020,“音频阿尔伯特:一个用于音频表征的自我监督学习的 Lite BERT”,,
- A.T.Liu 等,2020,《:语音的变换编码器表示的自监督学习》,【https://arxiv.org/abs/2007.06028】
- A.巴耶夫斯基等人,2020,“wav2vec 2.0:语音表征的自我监督学习框架”,【https://arxiv.org/abs/2006.11477】T4
- A.巴耶夫斯基等人,2020“VQ-wav2 vec:离散语音表示的自我监督学习”,https://arxiv.org/abs/1910.05453
- Y.张等,2020,“拓展半监督学习在自动语音识别中的应用”,
- 长度陆等,2020,“面向大规模语音识别的变形金刚探索”,
- Y.王等,2020,“变压器在行动:基于变压器的声学模型在大规模语音识别应用中的比较研究”,
浓缩咖啡的冲泡比
原文:https://towardsdatascience.com/brew-ratio-for-espresso-e1315b?source=collection_archive---------20-----------------------
咖啡数据科学
探索投入产出比
浓咖啡的酿造比例有很大的变化范围,在味道的口感和拍摄的强度上有巨大的图像。许多人坚持 2:1(输出对输入)拍摄,最近,3:1 甚至 5:1 比例的长时间慢速拍摄的想法已经普及。我个人比较喜欢 1:1 到 1.4 之间的拍摄比例。
所有图片由作者提供
对于这个简短的测试,我想展示拍摄比例的差异,并讨论对口味的影响。我认为这个变量比其他浓缩咖啡变量更个人化,因为它对口感有影响。我会具体看比率 1.5,1.3,1.1。
鸣谢:很多人将 brew 比率写成输入输出,但我更喜欢另一种方式,因为我更喜欢在比率冒号的左边写一个较大的比率数字。
照片中的镜头
为了拍摄这些照片,我使用了韩国研磨机、Kim Express 机器、VST 篮子、Pyxis 秤和自制分配器。每一次注射都是间断的,预注射时间比正常时间长(至少 30 秒),我在注射过程中使用了压力脉冲。三个镜头只是冲泡比例不同。
我考虑制作一份意大利香肠,这样我就可以品尝到完全相同的味道,但与使用三份独立的、每份之间间隔很长时间的香肠相比,它对最初的味道、口感和回味有很大的影响,可能会被混淆。在这方面,我没有吃任何东西或喝任何东西之前,这些镜头,他们都被拉了几个小时。
在拍摄过程中的几个不同时间,每列都是不同的酿造比:
1.5 : 1 …………… 1.3 : 1 ……………… 1.1 : 1
所有三个镜头有相似的提取,这是一个很好的健全检查。他们在同一时间间隔看起来也很相似。
绩效指标
我使用两个指标来评估技术之间的差异:最终得分和咖啡萃取。
最终得分 是记分卡 7 个指标(尖锐、浓郁、糖浆、甜味、酸味、苦味和回味)的平均值。当然,这些分数是主观的,但它们符合我的口味,帮助我提高了我的拍摄水平。分数有一些变化。我的目标是保持每个指标的一致性,但有时粒度很难确定。
用折射仪测量总溶解固体量(TDS),这个数字结合咖啡的输出重量和输入重量用于确定提取到杯中的咖啡的百分比,称为提取率(EY) 。
表演
短距离射击味道更好。这对我来说并不奇怪,因为在 1:1 的拍摄之后,已经没有什么可提取的了。随着 TDS 的增加,口感真的改善了。太短的镜头可能会变得太酸,但我没有发现这个问题,特别是这个烤。
镜头比率
对于 1.5:1 的注射,预输注时间要长几秒钟,但总的来说,时间非常相似。
TCF 是时候盖上过滤器了
有时候我们被某个参数束缚住了,以至于很难去实验。测试比例的最佳方法是制作一份意大利香肠(使用多个杯子),这样你就可以品尝提取物的不同部分,并将它们混合在一起。
我的目的不是告诉每个人拉一个特定的投篮比例(在这种情况下,一个较低的投篮比例),而是,我的目的是鼓励实验。
如果你愿意,可以在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡视频和浓缩咖啡相关的东西。你也可以在 LinkedIn 上找到我。也可以关注我中和订阅。
我的进一步阅读:
浓缩咖啡系列文章
工作和学校故事集
个人故事和关注点
乐高故事启动页面
摄影飞溅页
使用图像处理测量咖啡研磨颗粒分布
改善浓缩咖啡
断奏生活方式概述
测量咖啡研磨分布
咖啡萃取
咖啡烘焙
咖啡豆
浓缩咖啡用纸质过滤器
浓缩咖啡篮及相关主题
意式咖啡观点
透明 Portafilter 实验
杠杆机维修
咖啡评论和想法
咖啡实验
布里奇顿:网飞最热门的电视连续剧分析
原文:https://towardsdatascience.com/bridgerton-an-analysis-of-netflixs-most-streamed-tv-series-c4c9e?source=collection_archive---------14-----------------------
使用 Python 和 Tableau 中的 NLP 技术对 Bridgerton 电视连续剧上的 300,000 多条推文进行分析
在 Unsplash 上由 Thibault Penin 拍摄的照片
《布里奇顿》系列电视剧在圣诞节上映后,占据了全球大多数电视频道。几乎所有的电影爱好者都在谈论这件事,因为炒作,我被*【胁迫】在 网飞 看了这部连续剧。最近, CNN 报道称,《布里奇顿》是“ 有史以来最大的网飞剧集” ,因为它已经在超过 8200 万个家庭中播放。然而,最吸引我注意的是推特上的官方标签,这帮助为这部剧制造了更多的轰动。正如你在下图中看到的,它们都有一个特殊的标志。如果你问我,我会说这是伟大的营销策略!*
推特上布里奇顿官方标签的截图(图片由杰西卡·乌戈格伦提供)
基础
为了这个项目,我决定在我上一个情感分析项目的基础上,根据 Twitter 用户对电视连续剧《布里吉顿》的评论做一个评论。用于该项目的推文创建于 2020 年 12 月 27 日至 2021 年 1 月 28 日。除了,分析只涵盖了用 英文 写的推文。我可以肯定地说,如果你在那段时间里在你的推文中使用了任何 布里奇顿 标签或者提到了“ 【布里奇顿】 ”,那么你的推文就是这个分析的一部分。
以下是我想了解的关于这部电视剧的一些事情:
- 最受欢迎的布里奇顿标签
- 最受关注的人物布里顿
- 普通观众对布里奇顿的看法
- 关于布里奇顿的推特常用词
- 哪个国家关于布里奇顿的推特最多
我还在组合中加入了一个 Tableau 仪表板,让您可以按国家、日期和时间来浏览我的分析结果。
项目策略
项目步骤如下所示。在我上一个项目中详细讨论了一些关键概念。因此,在本文中,我将展示一些简短的 Python 脚本,用于实现我的分析的一些结果。
布里奇顿电视剧分析项目流程图(图片由杰西卡·乌戈格伦使用 Canva 开发)
使用的 Python 库包括 Pandas(用于数据清理/操纵)、Tweepy(用于推文挖掘)、NLTK(用于文本分析的自然语言工具包)、TextBlob(用于情感分析)、Matplotlib & WordCloud(用于数据探索)、Emot(用于表情符号识别)、Plotly(用于数据可视化)等内置库,如我的 Jupyter 笔记本所示。
推特挖掘
有一个月,我使用他们的 API 和 Python 库, Tweepy 从 Twitter 上搜集了一些推文。要使用 Twitter 的 API,你只需要在创建 Twitter 开发者账户后获得一些证书。你也可以查看我上一篇文章中关于如何使用 Twitter 的 API 的简要说明。对于搜索查询,我使用了单词“Bridgerton”和所有官方的 Bridgerton 标签。我甚至添加了错误的拼写,例如,为拼错电影名称的用户添加了“Brigerton”。请参见下面的代码片段。
用于 Bridgerton Tweet 挖掘的 Python 脚本(代码由 Jessica Uwoghiren 编写)
数据清理和处理
我一直说,一个数据科学或分析项目,大约 80%都是围绕这一步展开的。想象一下处理 300,000 多行数据,您不可能检查每一行的正确性或完整性。在任何数据项目中,缺失值总是一个大问题。在这个例子中,Location 列有许多缺失值,因为只有少数 Twitter 用户在他们的简历中有正确的位置。我还需要确保没有使用“Tweet ID”的重复 Tweet,这是我的数据集的主键。请参见下面的熊猫数据框。
显示推特数据集的熊猫数据框(截图来自 Jupyter 笔记本作者杰西卡·乌戈格伦
使用正则表达式从推文中提取标签和角色名
我非常喜欢分析的这一部分。我想看看哪个官方的 推特“布里吉顿”标签 和 角色名字 最受欢迎。我必须找到一种方法,从每条推文中提取这些信息,并将它们返回到我的数据框中的新列。我是怎么做到的?答案是正则表达式。REGEX 代表“正则表达式”,它用于指定想要匹配的字符串模式。它在这里证明是有效的。对于角色的名字,我使用了 REGEX 来纠正名字拼写错误的地方,如下面的代码片段所示。
Python 脚本从 Bridgerton Tweets 中提取标签和角色名(代码由 Jessica Uwoghiren 编写)
查看我的 Jupyter 笔记本这里看最后的数据框。基于上面的分析,最受欢迎的标签如下所示。
布里奇顿推特标签的频率。(图片由 Steve Uwoghiren 使用 Adobe Photoshop 开发)
布里奇顿推文中的词频
对于这部分分析,我使用了 WordCloud 库,根据推文中使用的单词频率生成单词云图像。使用 Matplotlib 库中的 Pyplot 模块显示下图。单词云以更大的文本尺寸显示具有更高频率的单词*。*
关于 Bridgerton 电视剧的推文中最常用的词(图片由 Jessica Uwoghiren 使用 WordCloud 和 Python 的 Matplotlib 库生成)
位置地理编码
为了确定哪个国家在推特上发布的关于布里吉顿电视剧的信息最多,我使用了位置地理编码,这是一种返回给定城市、地点、州或国家的精确坐标的奇特方式。我这样做是因为大多数 Twitter 用户只在他们的简历中使用他们的“州”或“城市”,而我需要检索他们的国家名称。像我的上一个项目一样,我使用了开发者的 API 来返回每个 tweet 位置的 国家代码和国家名称 。
情感分析
最后,我想看看对 Bridgerton 系列的整体看法。为了实现这一点,我使用了一种被称为自然语言处理(NLP)的机器学习技术。另一种说法是处理人类文本或单词。NLP 有几个方面,这里最重要的是“情感分析”。一个简单的例子,请查看我上一篇关于这个主题的文章。
对于这个分析,我使用了 TextBlob 中的情感分析器模块。Python 上的库。该算法通过给每个句子一个极性分数来分析句子的情感。基于极性得分,人们可以定义推文的情感类别。对于这个项目,我将一条负面推文定义为极性得分为 < 0,而 ≥ 0 为正面。情感类别的分布如下所示。您可以在 Tableau dashboard 这里 探索按国家划分的情绪类别分布。
根据 2020 年 12 月 27 日至 2021 年 1 月 27 日的推文(由 Jessica Uwoghiren 使用 Python 的 Plotly 库生成的情节),观众对布里吉顿电视剧的总体看法
交互式 Tableau 仪表板
为了帮助读者更深入地探索我的分析,我利用 Tableau 创建了一个用户友好的交互式仪表板。这允许你通过国家、推文创建日期、时间等等来探索结果。请注意,虽然可以在任何设备上查看仪表板,但最好使用平板电脑或计算机查看。
布里奇顿推特分析仪表板剪辑(仪表板由杰西卡·乌戈格伦使用画面创建)
最终想法
感谢您花时间阅读这篇文章。你可以去我的个人资料浏览更多文章。一如既往,我喜欢分享我的见解。以下是一些例子:
- 布里奇顿的营销策略: 这个特殊的布里奇顿标签引起了超越网飞订户的轰动。这让人们在推特上谈论这部电视剧。
- 假日季: 根据cnn.com的报道,这部电影在圣诞节期间上映也帮助提升了这部电视剧的收视率,在上映的第一个月就有超过 8200 万家庭观看了这部电视剧
- 发微博最多的国家: 与尼日利亚和印度等其他国家相比,美国、英国和加拿大的推特用户发了更多关于这部电视剧的微博。我想到了几个原因,如互联网普及率较低,网飞用户较少等。
- 推出电影或产品?你可能要考虑研究一下布里奇顿的推特策略。吸引你的观众,让人们为你销售你的产品!
评论
文章中使用的所有参考文献都有超链接。关于在 Jupyter Notebook、GitHub、Tableau Dashboard 和我的社交媒体页面上编写的完整 Python 代码,请使用以下链接:
- Tableau 仪表盘
- Jupyter 笔记本
- GitHub 资源库
- 个人网站
- 领英
- 推特
- 数据技术空间社区
弥合人工智能的概念验证与生产差距
原文:https://towardsdatascience.com/bridging-ais-proof-of-concept-to-production-gap-insights-from-andrew-ng-f2ac119ee737?source=collection_archive---------16-----------------------
关于在现实世界中部署机器学习项目的挑战和解决方案的三个关键要点(来自吴恩达)
亚历克斯·拉德里奇在 Unsplash 上的照片
我们经常听说人工智能( AI )和机器学习( ML )领域令人兴奋的突破和新的最先进的研究。
尽管有这些进步,残酷的现实是这些概念验证(PoC)项目中的大多数没有部署在现实世界中。为什么会这样?
这个问题被称为 PoC 到生产的差距,ML 项目在走向实际部署的过程中遇到了重大的瓶颈和挑战。
在这篇文章中,我们发现了吴恩达分享的三个关键经验教训,关于团队如何弥合这一差距以从 ML 项目中交付更大的实际价值。
关于演讲者
吴恩达|图片来自维基共享资源
Andrew NG是 deeplearning.ai 的创始人,Coursera 的联合创始人。
他目前是斯坦福大学的兼职教授。他是百度公司的首席科学家和谷歌大脑项目的创始人。
目前也是 Landing AI 的创始人兼 CEO。
(1)小数据问题
行业中对 ML 应用的讨论主要集中在消费互联网用例上,如社交媒体(如脸书)、娱乐(如 YouTube)和电子商务(如亚马逊)。
这种现象并不奇怪,因为这些公司可以从数百万用户那里获得大量数据。
然而,在消费互联网之外,还有许多其他应用和行业只能访问小数据。
这种小数据在人工智能项目的部署中是一个巨大的挑战,因为数据分布不均匀的问题被大大放大了。虽然我们可以构建平均精度良好的 ML 模型,但这些模型在数据中较少出现的罕见事件上可能仍然表现不佳。
一个例子是胸部 X 射线诊断 ML 算法的开发,该算法对积液等常见疾病的预测很好,但对疝气等罕见疾病的预测很差。
虽然整体模型可能具有出色的性能指标,但部署一个遗漏明显疝病例的系统在医学上是不可接受的。
幸运的是,在研究更好的算法来处理小数据方面取得了进展。以下是一些例子:
- 合成数据生成(如 GANs)
- 一次性/一次性学习(如 GPT-3)
- 自我监督学习
- 迁移学习
- 异常检测
国立癌症研究所在 Unsplash 上拍摄的照片
即使您只有少量数据,在企业中开发 ML 解决方案之前等待更多数据(例如,首先构建新的 it 基础设施)几乎总是一个糟糕的想法。
更谨慎的做法是,从您拥有的任何数据开始,然后反向工作以确定您需要收集哪些额外的数据。只有从一个系统开始,您才能进一步了解如何构建或增强 It 基础架构。
(2)通用性和稳健性
事实证明,许多在已发表的论文中运行良好的模型在生产环境中往往不起作用。
这个问题源自于构建不良的概括和不健壮的模型,它被证明是部署 ML 概念证明的又一个挑战。
回到早期的 X 射线诊断的例子,一个团队可以基于从现代机器获得的高质量 X 射线图像构建一个高性能算法,这些现代机器由像斯坦福医院这样的知名机构的训练有素的技术人员操作。
如果我们要在一家更老的医院运行这种模型,那里的 x 光机更老,技术人员训练更差,成像协议也不同,我们预计模型的性能会降低。
这种表现与人类放射科医师形成对比,后者可能在两家医院中对扫描进行类似的良好诊断。
这一挑战适用于所有行业,不仅仅是医疗保健行业。它突出了深入理解训练数据分布和具有领域知识以了解数据和过程的细微差别的重要性。
鉴于这一挑战没有明确的解决方案,研究人员和工程师必须共同努力开发系统化的工具和流程以确保算法可推广到用于训练以外的数据。
在 Unsplash 上拍摄的 ThisisEngineering RAEng
(3)变革管理
许多团队没有意识到人工智能解决方案会扰乱许多利益相关者的工作。如果没有正确的认同和接受,企业用户将会犹豫是否使用你辛辛苦苦构建的 ML 模型。
下图说明了在管理技术带来的变化时的五个关键考虑因素😗*
变更管理的注意事项|作者图片
在提供保证和解释模型的预测方面,团队可以利用可解释的人工智能的工具(特定于每个利益相关者的需求),以及第三方审计服务来审查 ML 系统的代码和设置。
一旦利益相关者理解了最大似然算法是如何得到他们的预测的,并且确信这是公平合理的,那么模型就更有可能被部署和使用。
当然,ML 解决方案本身是完全无用的。任何项目的第一步(可能也是最重要的一步)是范围界定,技术和业务团队一起在“人工智能能做什么”和“什么对业务有价值”的交叉点上确定用例。
结论
据麦肯锡称,到 2030 年,人工智能可以为世界经济带来 13 万亿美的增长。更重要的是,这种价值大部分存在于消费互联网行业之外的行业,这证明了还有大量未开发的价值。
为了在所有行业实现人工智能的全部潜力,有必要将人工智能转变为一个系统工程学科,在这里项目被有效地部署以交付重要的价值。
请随意查看下面的完整研讨会:
在你走之前
欢迎您加入我的数据科学学习之旅!关注我的媒体页面和 GitHub 以了解更多精彩的数据科学内容。同时,享受将您的项目投入实际部署的乐趣!
弥合人工智能和软件工程之间的鸿沟
原文:https://towardsdatascience.com/bridging-the-gap-between-ai-and-software-engineering-e7ff1f?source=collection_archive---------24-----------------------
如何在您的数据科学家和软件工程师之间创造协同效应
AI @ DayTwo 旨在改善我们业务的各个方面。从血糖反应水平预测到个性化算法和微生物组分析,我们的人工智能应用涵盖许多领域和方面。为了最大化我们研究的影响,我们不会将研究集中在一个方向。相反,我们有大量的研究渠道,有多个人工智能问题,我们希望与业务团队、工程团队和公司外部的其他研究小组合作解决。这允许数据科学家和每个领域的业务或工程团队之间的紧密合作。此外,对于我们进行的任何研究,我们都会召集一个学习论坛,提供一个分享知识的地方,并提出我们在路上可能遇到的障碍。这些论坛也有助于确定和激励未来的研究方向。
作者图片
在实践中,大规模应用机器学习需要大量的基础设施和系统工程投资。今天,我们的主要挑战之一是缩小开发和培训 ML 模型的数据科学家与负责将这些模型引入我们的生产系统并使其可用的 ML 软件工程师之间的差距。我们一直在寻找新的方法来创建数据科学家和软件工程师之间的共享语言,并共同将我们的人工智能解决方案扩展到我们的主要产品中。
人工智能解决方案
在第二天,一旦一个主题已经被充分研究和建模,我们的数据科学团队就继续进入机器学习模型本身需要集成到我们的生产流程中的阶段。拥有一个机器学习模型或算法,可以解决我们的一个问题,这听起来很令人兴奋,并让我们对我们所取得的成就感到满意,毕竟,获得高准确率是每个数据科学家的梦想。但严峻的事实是,要将该解决方案部署到生产环境中,我们仍有许多工作要做,这些工作如果做得不恰当,可能会危及整个目标。此外,通常,这种工作需要数据科学团队中没有的知识,并且还必须有具有更广泛的系统工程概述能力的人参与。这就是为什么这两个团队之间的顺利合作如此重要,这甚至导致了新的行业职位名称命名为 ML 软件工程师。
照片由莱昂在 Unsplash 上拍摄
第二天的路
在第二天,我们非常依赖 AWS 服务,我们利用它们来满足我们的特定需求,我们从不害怕尝试新的服务,尤其是当它有可能对我们有用的时候。此外,我们还与 AWS 解决方案架构师密切合作,因为我们知道他们对自己的服务能力有着更深入的了解,当需要就某个解决方案集思广益时,他们是我们的咨询对象。
为了支持数据科学家和 ML 工程师之间顺畅、快速的协作,我们确保所有团队都熟悉相关的 AWS 服务,并能够编写适当的代码。例如,我们的一个推荐引擎涉及在用户流的某个点上对多个分类模型进行推理。为了支持这一点,我们使用 SageMaker MMS 端点基础设施,并确保我们将工作分开,以便我们的数据科学家在推理 docker 容器模块中编写代码,该模块调用实际的机器学习模型,而 ML 软件工程师编写端点包装器并将其集成到产品流中。此外,由于我们在多个开发环境中工作,我们开发了从代码无缝部署服务的能力,没有任何瓶颈,因此,我们确保所有团队成员都具备这方面的知识(使用 AWS CDK)。
在某些情况下,需要更复杂的算法(不仅仅是触发某种模型的推断)。在这些情况下,需要将额外的算法编程到流程中,我们要么由数据科学家将其编码到推理 docker 容器中,要么由 ML 软件工程师直接编码到产品流程代码中。在这种情况下,每种情况都要分别审查和决定。
作者图片
投资于教授我们的数据科学家技术,如 *Docker、Jenkins、REST APIs、Git、VS-Code remote work、CDK、Setuptools、Bash、*等,让他们能够自我驱动和独立,并推动他们成为全栈数据科学家。同样,向我们的软件工程师教授机器学习的基础知识,并让他们接触算法和人工智能管道,从长远来看,当团队之间真正的协作和协同作用出现时,会有回报。
收场白
将人工智能解决方案集成到产品中可能具有挑战性并且非常耗时。人们可能会认为大部分工作是在训练 ML 模型,而现实表明在软件工程方面也需要大量的时间。可能有助于缩小这些差距的主要要点是 (1) 确保您的数据科学和工程团队相互沟通。 (2) 确保你的数据科学团队会说软件工程的语言(反之亦然)——投资将你的一些软件工程师变成 ML SE,将你的一些数据科学家变成全栈数据科学家。 (3) 在你的产品中集成一个新的 AI 解决方案时,不要低估工程工作。 (4) 在团队之间的协作中投入资源,并经常回顾以供下次改进。
如果你想了解更多关于我们正在开发的最新最棒的产品,请随时联系我。
亚龙
带回亲自参加的数据科学训练营
原文:https://towardsdatascience.com/bring-back-the-in-person-data-science-bootcamp-67cc9dbb6675?source=collection_archive---------22-----------------------
照片由 CX 洞察在 Unsplash 上拍摄
意见
这太有趣了
现在我们终于可以在疫情隧道的另一边看到光明,我对 METIS 和镀锌有一个请求。
请带回来亲自参加数据科学训练营。
我知道去偏远地区是你去年唯一的选择。但当你们都永远远离我时,我感到震惊和难过。
我是梅蒂斯大学的毕业生——我喜欢这种经历。我的一些最好的朋友是我的训练营同学,我从这次经历中获益良多。我会去一个完全偏远的训练营吗?没门,我不会为日复一日的缩放课程付 17000 美。
我肯定不止我一个人有变焦疲劳。经过一年多的 Zoom 会议和 Zoom pair 编码,上周我第一次在办公室见到了我的团队。太棒了!我们有一个正常的会议,我们用白板,我们在外面吃午餐。如果我想问问题,我就转身问。面对面的感觉总是比变焦好,但经过 15 个月的强制变焦,面对面的感觉甚至比正常情况下更好。
训练营
全日制训练营是一大进步。你需要辞掉工作,拿出一大笔钱,至少花几个月时间在训练营结束后找工作,因为很多雇主会对你的训练营教育持怀疑态度。最重要的是,数据科学家的供需状况不像几年前那么好了——通常,当一个工作很热门(且薪酬很高)时,供应(数据科学家)的增长速度比需求快得多。
这是一个很大的风险,但对许多人来说,这也是转向数据职业的唯一途径(离开工作岗位两年去获得硕士学位实在是太长了)。训练营有责任让他们的学生全力以赴,提供尽可能多的价值。其中一部分就是给他们一个空间,让他们可以一起学习,一起编程,一起玩耍,一起交流。
我从训练营经历中得到的最大收获是我的同伴。它们让学习变得更有趣,让我的项目更有趣,让找工作的压力更小,并成为我的社交网络和职业网络的一部分。你可以试着让它超过 Zoom,但你就是无法复制社交体验。在我看来,一场酣畅淋漓的乒乓球赛胜过我们之间的十几场比赛,而且这还远远不够。
所以梅蒂斯、激励和其他训练营,不要把疫情作为增加利润的借口。你的学生对你做出了很大的承诺,所以你应该尽你所能给他们最好的体验。
通过找到“几个重要原因”,将可解释的人工智能带到下一个层次
原文:https://towardsdatascience.com/bring-explainable-ai-to-the-next-level-by-finding-the-few-vital-causes-4838d46857de?source=collection_archive---------24-----------------------
一个有效的可解释人工智能应该旨在发现“重要的少数”原因,而不是“琐碎的许多”事件。下面是如何用 Python 实现的。
[作者图]
可解释 AI (缩写为 XAI )是解释机器学习模型所做选择的能力。在现实世界中,XAI 通常是机器学习应用程序成功的关键。
例如,以预测客户流失这样的经典任务为例。当然,模型精度是根本。但是,一旦你知道哪些客户更有可能离开公司,关键问题是:“我们如何让他们改变主意”?为了帮助回答这个问题,我们需要知道为什么模型认为他们有风险。换句话说,我们需要确定客户流失的原因(老实说,我认为“症状”这个词比“原因”更合适,但在这里我会互换使用它们)。
最重要的概念是任何个体(或一群个体)都有自己的原因。这些原因可能(经常)不同于其他人的。在这篇文章中——给定一个机器学习模型——我们将看到如何为每个个体(或群体)找到(并可视化)最重要的原因。正如约瑟夫·巨然所说,我们将关注“至关重要的少数”而不是“微不足道的许多”症状。
虽然这篇文章是基于一个特定的用例(客户流失),但下面的内容可以应用于任何机器学习任务。所有的分析都将基于 Kaggle 上的 Orange Telecom 数据集。你可以在 Github 中找到包含所有代码的 Python 笔记本。
不令人满意的结果
当谈到可解释的人工智能时,你可以肯定有人会说出这样的情节:
图一。Python 中 SHAP 库的 Force plot。[作者图]
这被称为“力图”,很容易通过 Python 的 SHAP 库获得。总的来说,我认为这个情节是次优的。
数据可视化的第一条戒律:人类的注意力非常有限。
「原力情节」有什么问题?它包含的信息太多了!事实上,
- 它显示 SHAP 值和观察值。有效的 XAI 应该只基于后者,因为 SHAP 值对人类来说是不可理解的;
- 它显示了所有的特征。有效的 XAI 应该能够只选择少数与单个(或一组)客户相关的特性;
- 它既显示了对客户流失概率产生积极影响的特征(红色),也显示了产生消极影响的特征(蓝色)。有效的 XAI 应该只关注客户流失的原因,因为我们对客户流失感兴趣。包括降低流失概率的因素令人困惑;
- 它显示观察值,但不提供上下文。有效的 XAI 应该基于上下文。例如,图中显示该客户拨打了 2 个国际电话,但是并没有解释为什么这是相关的。换句话说:2 个国际电话太多了吗?还是太少?
找到“至关重要的少数”
在 XAI,我们离不开 SHAP 价值观(在本文中,我们将把 SHAP 视为魔法,但如果你想知道它是如何在引擎盖下运作的,我已经写了一篇文章详细解释了这一点: SHAP 解释了)。
例如,假设我们有一个适合某些数据的模型:
model_fitted = model.fit(X, y)
。
SHAP 有两个输入:拟合模型和预测矩阵。
shap_values = get_shap(model_fitted, X)
。
最需要理解的是,SHAP 的输出是一个与 X
形状相同的矩阵。换句话说:
现在,我们来看看 ID 为 950 的客户的输入数据。X.loc[950, :]
:
图二。原始功能(客户 id: 950)。[作者图]
相应的 SHAP 值存储在这里,shap_values.loc[950, :]
:
图 3。SHAP 值(客户 id: 950)。[作者图]
当 SHAP 值为正数(粉红色)时,意味着相应的功能提高了该客户流失的可能性。SHAP 为负时相反(蓝色)。例如,“国际计划”有助于提高该客户的流失率,而“总夜间分钟数”会降低流失率。
“力图”(见图 1。)显示所有这些数字(19 个原始特征和 19 个 SHAP 值),每个彩色条的长度与 SHAP 值的大小成比例。
但是,如前所述,我们只想关注最重要的症状,即“重要的少数”。第一步是看看 SHAP 值是如何产生的:
图 4。SHAP 值(客户 id: 950)。[作者图]
这些特征已经通过增加 SHAP 进行了分类,因此主要症状在右边。我们可以只保留从右边开始的 4 或 5 个特征,而不是显示所有 19 个特征,从而获得更有效的可视化效果。事实上,有了“国际计划”、“国际通话总量”、“全天费用”以及更多,我们已经考虑了最大部分的风险因素。
好吧,但也许,在这种情况下,我们只是运气好。也许,对于其他顾客来说,有很多原因,而不仅仅是几个。因此,让我们为所有有风险的客户复制上面的情节。
图 5。每个客户的 SHAP 值按升序排序。[作者图]
(注意,这一次,我们不能在 x 轴上标注特性名称,因为每个客户的排序顺序可能不同)。
我们在一个客户身上看到的似乎适用于所有客户:几乎所有的风险都是由少数几个功能造成的。
实际上,这是一种“普遍”行为:它不仅发生在这个数据集或这个应用程序中。一个结果的绝大部分是由极少数原因造成的这一观点在自然界几乎随处可见,被称为 帕累托原理 。
这个概念非常强大,因为不管你有多少特性,它都是有效的。
但是“少”是多少呢?
让我们回到我们的客户。我们已经决定只保留具有最高正 SHAP 值的要素。但是,确切地说,他们有多少人?我们希望找到一个可以大规模应用的规则,而不需要我们为每一个客户做出决定。
当然,没有固定的规则。但是这里有一个在实践中很有效的方法。首先,我们需要按升序对 SHAP 值进行排序。下一步是计算累积和。让我们看看结果:
图 6。SHAP 值,累积和(客户 id: 950)。[作者图]
仔细想想,最终位于 y 轴正侧的特征(在粉色背景上)实际上是“触发”客户从无风险(SHAP 总和≤ 0)到有风险(SHAP 总和> 0)的特征。我们希望专注于这些功能,而忽略其他功能。
这可以用几行 Python 代码来完成:
shap_sorted = shap_values.loc[950, :].sort_values() main_causes = shap_sorted[shap_sorted.cumsum() > 0].index
既然我们已经找到了“关键的几个原因”,最重要的部分是理解为什么它们会导致流失风险增加。
“治标,治本。”— 迈克尔·克莱顿
如果我们对所有有风险的客户重复上述过程,我们将得到如下表格:
图 7。主要症状选择表。[作者图]
表中的每个素都是一个布尔值,表示该功能是否是该客户的相关症状。
一旦我们获得了这张表,我们就可以彻底摆脱 SHAP 价值观了!
重点是: SHAP 价值观非常有用,但没有实际(或商业)意义。在确定主要原因时,我们不能没有它们。但是,一旦我们这样做了,就没有理由把它们带在身边。
从 XAI 的角度来看,最重要的部分还没有到来。的确,仅仅指出相关症状是不够的。真正与众不同的是能够解释为什么这些功能会让客户面临风险。
一种有效的方法是通过基于主要原因的平行图将客户与样本的其余部分进行比较。
图 8。主要原因的平行图(客户 id: 950)。[作者图]
红线代表客户。蓝线是参考人群(即样本)的中值,而蓝带的上下边界分别是人群的第 25 和第 75 百分位。
任何说商业语言的人都能理解这个情节。
事实上,它并不涉及诸如 SHAP 价值观之类的复杂概念。此外,它一目了然地显示了“正常”人口是如何构成的,以及该客户相对于样本中的其他客户有多极端。
在这种情况下,我们立即注意到这个家伙持有“国际计划”,而至少 75%的客户没有。尽管如此,他拨打的国际电话(总国际电话数= 2)还是少于大多数客户(事实上,至少 25%的客户至少拨打了 3 次国际电话)。此外,这个人比大多数人支付更多的费用(总日费、总夜费),也打更多的电话(总日分钟数)。
在这一点上,很容易理解为什么这个客户有流失的风险:这个人实际上是在为他没有使用的东西(一个国际计划)付费,并且他比客户群中的其他人付费更多。从图 1 中不可能注意到这一点。
从单一客户到群体
我们已经为客户 n. 950 建立了一个地块。但在大多数实际情况下,不可能一一列举。想象一下,有成百上千的高风险客户。在这种情况下,更有效的方法是建立症状相似的客户群并将它们放在一起。
让我们看几个例子:
图 9。主要原因的平行图(一组客户)。[作者图]
图 10。主要原因的平行图(一组客户)。[作者图]
在这种情况下,我们比较了两种分布:
- 红色表示有相同症状的一群顾客。实线代表中间值,而范围在第 25 和第 75 百分位之间;
- 蓝色代表样本的其余部分。
这些图表使我们的方法具有可扩展性。事实上,一旦获得了同类集群,就很容易用更适合任何给定组的“处理方法”来处理每个集群。
你可以在这个 Github 笔记本里找到帖子的所有代码。
感谢您的阅读!我希望这篇文章对你有用。
我感谢反馈和建设性的批评。如果你想谈论这篇文章或其他相关话题,你可以发短信到我的 Linkedin 联系人。
将机器学习引入数据
原文:https://towardsdatascience.com/bring-machine-learning-to-the-data-c85a4b2f34b6?source=collection_archive---------38-----------------------
Google BigQuery 展示了一个新的范例
图片来自穆罕默德·哈桑在 Pixabay
从数据仓库或数据湖中提取数据的传统方法——然后对其进行清理、转换并构建模型——正慢慢被一种更新的方法所取代
将计算带到数据或
将机器学习/算法引入数据
特别是因为像谷歌、亚马逊和微软这样的大提供商将数据库和数据仓库等服务与机器学习服务相链接,所以不再需要将数据集成到其他平台或系统中。在像 Google 的 BigQuery 这样的服务中,传统的数据库系统甚至用 ML 工具进行了内部扩展[2]。
新范式的优势
新方法的优势包括简化的基础架构。如果我们看一下下面的简化架构,就可以清楚地看到,如果服务已经可以在云环境中相互通信,或者集成在一个服务中,那么就不需要第三方系统的进一步接口。这大大缩短了这些环境的设置和维护时间。
经典分析流程架构—作者图片
另一个重要因素是数据科学流程可以显著简化。每个数据科学家和工程师都知道这一过程有多耗时,因此将您需要的一切都放在云环境甚至服务中的方法大大简化了这一过程。
集成的数据湖和分析平台
第三点是可编程性的简化——比如分析师只用 SQL 就能轻松完成机器学习任务。下面我想用 Google BigQuery 中的一个简单例子来说明这一点。如果您想更深入地了解数据平台现代化这一主题,您可能会对这篇文章感兴趣。
BigQuery ML 示例
为了展示解决方案如何简化数据分析过程,我将使用 BigQuery 及其 ML 功能。这里,我使用了公共数据集,其中包含了爱荷华州所有批发购买的酒。
在这个例子中,我只是想做一些聚类。这个例子非常简单,但是很好地展示了可能性和您必须采取的步骤。
步骤 1 —创建模型
CREATE OR REPLACE MODEL DATA.iowa_bottle_clusters OPTIONS (model_type=’kmeans’, num_clusters=3, distance_type = ‘euclidean’) ASSELECT item_description, AVG(state_bottle_cost) AS state_bottle_cost,FROM `bigquery-public-data.iowa_liquor_sales.sales`WHERE EXTRACT(YEAR FROM date) = 2018GROUP BY item_description;
上面,您可以看到我使用了 k-Means 算法,并将聚类数的参数设置为 3。我的想法是,如我所说,高度简化的例子只是使用变量state _ bottle _ payed(酒精饮料部门为每瓶订购的酒支付的金额)将其分为三个价格类别。
第二步——评估模型
创建模型后,BigQuery 会自动为您提供一些指标。这些允许对聚类算法进行评估。对于戴维斯-波尔丁指数,目标将是最低的可能值【3】。
指标—按作者分类的图像
另一个很棒的特性是我们得到的损失图表。
随着
SELECT * FROM ML.TRAINING_INFO(MODEL Data.iowa_bottle_clusters);
和
SELECT davies_bouldin_index FROM ML.EVALUATE(MODEL Data.iowa_bottle_clusters);
如果需要,您可以稍后查询结果。
第三步——预测
Via ML。预测我们将看到某个特定品牌属于哪个集群。
SELECT centroid_id, item_description, state_bottle_cost FROM ML.PREDICT(MODEL Data.iowa_bottle_clusters,(SELECT item_description, AVG(state_bottle_cost) AS state_bottle_cost FROM bigquery-public-data.iowa_liquor_sales.sales WHERE date <= '2018-02-02' AND date >='2018-01-01' GROUP BY item_description) ) ORDER BY centroid_id;
步骤 4 —检查结果
现在让我们检查结果是否有意义(当然这是一个非常简单的例子),但是让我们看看。以下是三个集群的示例:
第一组中只有一个项目似乎是高级产品:
1 —雷米·马丁路易十三干邑— 1599.19
在第二组中,我们有更多的瓶子,这似乎被认为是中产阶级,例如:
2 —达尔莫尔雪茄麦芽苏格兰威士忌— 93.33
2 —卡瓦兰雪利酒橡木单一麦芽— 73.33
2 —吉姆梁酒厂的杰作— 104.91
还有一组你可能会和可乐或其他混合物一起喝的产品:
3—斯米尔诺夫葡萄— 8.25
3 —斯米尔诺夫酸青苹果— 8.25
3 —伯内特水果潘趣酒— 4.48
所以最终的结果并没有那么糟糕——但当然可以优化。这里您需要的只是 BigQuery 和一些基本的 SQL。
结论
在这篇短文中,我想提供一些关于将机器学习或算法转移到数据的范式的理论基础知识。此外,相对于传统方法的优势是显而易见的。尤其是在设置和维护方面,以及在节省时间方面的实际数据分析过程。最后,我展示了现在只使用 SQL 和 Google 的 BigQuery 开发一个机器学习模型是多么容易。要了解更多信息,请下面的链接。
资料来源和进一步阅读
1唐斯,B. N .,奥菲姆,D. M .,黑尔,w .,Xi,l .,多纳霍,L. A .,&卡拉,D. (2014)。将计算引入数据的实际例子。生物分子技术杂志:JBT , 25 (增刊),S5。
【2】Google,什么是 BigQuery ML? (2020)
[3]戴维斯博士,波尔丁博士(1979 年)。“一个集群分离措施”。IEEE 模式分析与机器智能汇刊。PAMI-1 (2),第 224 至 227 节。
在几秒钟内将你童年的图画变成现实 Meta 创造性人工智能的演示
原文:https://towardsdatascience.com/bring-your-childhood-drawings-to-life-within-seconds-a-demo-of-metas-creative-ai-1e8695d9f3b6?source=collection_archive---------4-----------------------
创造性人工智能正在兴起。在几秒钟内,Meta Demo Lab 的这款全新工具将静态绘图转换为生动的卡通版本。
从图画中创造一个动画角色从未如此简单。[作者 GIF,使用 Meta 演示实验室创建]
随着假期的临近,是时候用 AI 来点轻松的娱乐了。作为一个孩子,你可能会幻想你的画变成现实——移动、跳舞、奔跑……感谢 Meta AI 研究,这不再需要保持幻想!
在演示实验室,只需几秒钟就能把一幅画变成一个成熟的动画角色。诉讼程序极其简单;这简直是儿戏。我们去看看吧!
画点什么
嗯……不需要言语。画一幅人体解剖图就可以了。理想情况下,它在白色背景上,没有阴影或其他物体。
我的静态图。我希望我能说它源于我的童年,但遗憾的是我今天才画的。
创建一个遮罩
上传后,程序会自动创建一个遮罩,覆盖你所画角色的体表。这个演示很好地将人物从背景中分离出来。如果它没有完全捕捉到所有内容,标记和橡皮擦允许手动纠正遮罩。
为你的角色创建一个面具[截图来自演示实验室
重新调整分数
创建遮罩后,是时候设置关节(脚踝,手腕,膝盖,臀部,肩膀,肘部,手腕,耳朵,眼睛,头部中心)以确保逼真的动画。
在这种情况下,除了眼睛和(明显的)耳朵,一切都非常准确。同样,一个简单的拖放就可以修复它。你可以故意弄乱关节,看看会发生什么,但我们在这里适当地做一下。
设置角色关节【截图来自演示实验室
还有…跳舞!
整个过程几乎在几秒钟内完成。之后就是挑选自己喜欢的动画,渲染,就大功告成了!
[作者 GIF,使用 Meta 演示实验室创建]
该动画可以作为一个简单的 MP4 下载——本文中转换为 GIF 格式降低了质量。
或者……盒子!
[作者 GIF,使用 Meta 演示实验室创建]
或者…跳过!
[作者 GIF,使用 Meta 演示实验室创建]
嗯,你明白了。目前有 32 部动画可供选择。
人工智能在哪里?
好吧,酷,但是人工智能在哪里?如果他们不从你的上传中学习,Meta 就不是 Meta 了。在开始上传时,他们会请求将您(孩子)的绘画存储在一个公共数据库中,该数据库随后将用于进一步培训和开发该工具。与任何机器学习算法一样,手头的高质量数据越多,我们未来可以预期的结果就越好。
尽管从表面上看这是一个噱头,但就此放弃创造性人工智能将是一个错误。人工智能正在以越来越快的速度产生新的内容。事实上,Gartner 将生殖人工智能确定为 2022 年的顶级技术趋势之一:
进入市场的最可见、最强大的人工智能技术之一是生成式人工智能——从数据中学习内容或对象的机器学习方法,并使用它来生成全新的、完全原创的、真实的人工智能。— Gartner
Gartner 预测,正在创建的所有数据的百分比将从 2021 年的不到 1%飙升至 2025 年的 10%。原因显而易见。把我们自己限制在内容创作上,在创作音乐、动画、艺术和——对我们来说很不幸——写作方面有大量的机会。
我们还没有到人类创造力过时的地步。现在,只需快速参观一下 Meta Demo Lab,就能在假期中神奇地将您孩子的杰作带回来!
[作者 GIF,使用演示实验室创建]
https://www.gartner.com/en/newsroom/press-releases/2021-10-18-gartner-identifies-the-top-strategic-technology-trends-for-2022 https://developer.ibm.com/blogs/what-is-generative-ai-and-how-much-power-does-it-have/
使用亚马逊 SageMaker 自带容器
原文:https://towardsdatascience.com/bring-your-own-container-with-amazon-sagemaker-37211d8412f4?source=collection_archive---------5-----------------------
SageMaker 中最灵活的实时推理选项
图片来自斯蒂芬·菲利普斯拍摄的 Unsplash
过去我曾谈论过如何在亚马逊 SageMaker 上训练一个定制的 TensorFlow 模型。这很容易,因为 SageMaker 为流行的框架管理容器,比如 TensorFlow、PyTorch、HuggingFace 等等。这允许开发人员使用这些提供的容器,并专注于以一种称为脚本模式的方法提供用于训练和/或推断的脚本。
现在,假设 SageMaker 现有的深度学习容器不支持您正在使用的框架。这是一个真正的可能性,因为有许多现有的 ML 框架将在未来的每一周推出。SageMaker 提供了一个名为自带容器 (BYOC)的功能,作为开发者,你可以完全控制这个容器。在本文中,我们将通过一个示例,将一个预训练的空间 NER 模型引入 SageMaker,并通过部署过程创建一个用于推理的实时端点。如果您想直接跳到代码,请查看这个库的源代码和其他与推理相关的 SageMaker 示例。
注意:对于刚接触 AWS 的人来说,如果你想继续学习,请确保在下面的 链接 中注册账户。部署过程中会产生成本,尤其是如果您让端点保持运行。本文还将假设您对 SageMaker 和 AWS 有一定的了解。
目录
- 容器设置
- 构建 Docker 映像并将其推送到 ECR
- 创建模型
- 创建端点配置
- 创建端点
- 推理
- 结论和附加资源
1.容器设置
在我们开始之前,请确保创建一个笔记本实例并在 SageMaker 上运行。一旦您打开了 SageMaker JupyterLab 设置,您的目录应该如下所示。创建一个笔记本(Python3 内核),然后创建一个包含 docker 文件和推理/服务文件设置的目录。
总体结构(作者截图)
服务/预测代码的 docker 文件和目录(作者截图)
您的 Docker 文件将指向您的 NER 目录,其中包含您的代码来编排 SageMaker 上的模型服务以及 Docker 将安装的内容。在这个 NER 目录中,有四个文件有助于这个设置。
NER 目录(作者截图)
- nginx.conf :配置设置 nginx 前端。你可以直接复制这个文件,因为对于大多数 BYOC 例子来说它是。
- serve :这个程序在后台启动一个 gunicorn 服务器,它是在容器启动托管时启动的,你也可以把这个文件保持原样。注意,通常情况下,如果你是负责培训和主持的 BYOC 人,你也会有一个“培训”文件。关于这个例子,请查看这个代码。
- predictor.py :这个程序实现了一个 Flask web 服务器,在 /ping 和 /invocations 中有两条路径是至关重要的。Ping 接收 GET 请求,如果您的容器是健康的,则返回 200。调用是您可以对正在使用的模型使用推理逻辑的地方,它将从您的模型返回预测。
- wsgi.py :是你的 predictor.py 文件的包装器,不需要修改,除非你用另一个文件名命名 predictor.py。
我们要查看的文件是 predictor.py,因为配置的其余部分不需要修改或编辑。
负载空间模型
在这里,我们可以加载我们的空间模型进行推理。接下来,正如我们所讨论的,我们正在处理两个 URL。我们可以使用 ping 路径对我们的容器执行健康检查。
健康检查
现在我们可以专注于调用路径中的推理逻辑。
空间推理
这里我们期待一个 JSON 输入,所以我们将在给端点提供信息时在客户端进行配置。我们的容器现在已经设置好了,我们现在需要创建一个 Dockerfile ,它指向并执行这些文件并且安装我们的模型依赖。
空间安装的 docker 文件
在这里,我们安装 Spacy 并将我们的代码指向 SageMaker /opt/program 目录,该目录是 SageMaker 在为模型提供服务时创建的。
现在,我们可以进入笔记本,专注于将此图像推送到 ECR,SageMaker 可以在那里检索并使用此图像进行推理。
2.构建 Docker 映像并将其推送到 ECR
SageMaker Classic 笔记本带有对 Docker 的支持,因此我们也可以在实例上的终端中进行本地测试。在进入创建端点的步骤之前,我们需要构建 Docker 映像并将其推送到 ECR,SageMaker 在 ECR 中存储和检索所有用于训练和推理的映像。以下 shell 命令可以在笔记本中运行,无需任何重大更改。
将 Docker 图像推送到 ECR
在这里,我们使 serve 文件可执行,用我们的算法名命名我们的 ECR 存储库,并基于我们的容器结构和 Docker 文件构建 Docker 映像。这需要一点时间,但是你应该能够在最后看到一个成功的映像,以及一个用你的映像创建的 ECR 存储库。
图片被推送到 ECR(作者截图)
3.创建模型
现在,我们可以专注于使用 SageMaker 构建实时端点。对于实时端点创建,传统上要遵循三个步骤:模型创建、端点配置创建和端点创建。我们可以通过使用 SageMaker Boto3 客户端来编排这些步骤。
客户端设置
注意这里有两个客户端: sm_client 用于模型、端点配置和端点创建。运行时客户端用于推断和调用端点。
现在的第一步是模型创建,这里我们需要指向我们推送的 ECR 图像,以便 SageMaker 可以创建我们的模型。我们通过提供我们的算法名称和 account_id 作为容器位置的变量来实现这一点,您也可以从 ECR 中手动抓取图像 URI,尽管不建议这样做。
模型创建
在这里,我们还指定了我们正在使用的实例类型,因此请确保查看 SageMaker 实例以了解什么适合您的用例及价格。您应该看到单返回您创建的模型,我们将在端点配置创建的下一步中使用它。
模型已创建(作者截图)
4.创建端点配置
我们现在可以使用我们的模型名,并简单地将其作为我们的端点配置的输入,这将为我们正在创建的端点类型提供必要的细节。
端点配置
端点配置创建(作者截图)
5.创建端点
现在,我们可以使用端点配置来创建端点,我们将用它来进行另一个简单的 Boto3 调用。
端点创建
这应该需要几分钟的时间来执行,但是如果您看到一个成功的消息,我们现在可以看到一些示例推理了。
端点已创建(作者截图)
6.推理
现在我们可以调用端点了。我们需要记住,我们在 predictor.py 文件中输入了一个样本输入 json,因此我们在调用之前正确地配置和序列化了输入。
示例调用
现在我们可以看到一些来自我们端点的 NER 结果样本。
作者截图
如果您不想让您的端点启动并运行,请确保运行下面的 Boto3 调用来删除您的端点,以免产生成本。
删除端点
7.结论和附加资源
https://github.com/RamVegiraju/SageMaker-Deployment/tree/master/RealTime/BYOC/PreTrained-Examples/SpacyNER
要访问示例的完整代码,请查看上方的链接,还有大量其他 SageMaker 推理示例和资源。BYOC 一开始可能会令人生畏,但是它提供了难以置信的灵活性来配置和调整 SageMaker 以与您的框架一起工作。在一天结束时,通过改变当前设置中的几个文件,您可以使用您正在使用的任何模型和框架进行大规模的推理。
要了解使用什么 SageMaker 推理选项,请查看这篇文章。要了解如何使用现有的 SageMaker 图像,请查看这篇文章。
如果你喜欢这篇文章,请在LinkedIn上与我联系,并订阅我的媒体 简讯 。如果你是新手,使用我的 会员推荐 报名。
让你的电报聊天机器人更上一层楼
原文:https://towardsdatascience.com/bring-your-telegram-chatbot-to-the-next-level-c771ec7d31e4?source=collection_archive---------3-----------------------
发现可以改变现状的高级功能
Telegram 是一个流行的开发聊天机器人的平台:优秀的文档,活跃的社区,各种各样的库和大量的例子。
如果你是刚入门的话,这里有很多教程,尤其是关于 T2 媒体的。并且 Stackoverflow 也是一个很好的回答问题和理解问题的资源(你的作者经常被发现在那里试图帮助其他开发者🤓).
相反,本文关注于与使用 Python 电报机器人实现电报机器人相关的更高级的方面:
- Pull vs Webhook
- 获取聊天 ID
- 显示“正在输入…”并建议答案
- 深层链接
- 发送媒体和文件
Christian Wiediger 在 Unsplash 上拍摄的照片
本地工作的轮询模式
电报机器人可以通过拉或推机制工作(参见更多网页挂钩)。“拉”机制是 bot(您的代码)定期检查服务器上新的可用消息的地方。
每个人都同意这不是一个理想的方法(不必要的资源浪费,消息在 24 小时后被丢弃),但是在本地开发时它是方便的。(不需要 ngrok 之类的隧道软件)。
def main(): updater = Updater('myTelegramToken') dp = updater.dispatcher *# define command handler* dp.add_handler(CommandHandler("help", help_command_handler)) *# define message handler* dp.add_handler(MessageHandler(Filters.text, main_handler)) updater.start_polling()
生产上的网络挂钩
一旦 bot 为部署做好准备,就该启用 Webhook 了:这样做 Telegram 会将更新推送到注册的 webhook 端点,只有当有新的消息传入时,您的服务才会变得繁忙。
updater.start_webhook(listen="0.0.0.0", port=3978, url_path='myTelegramToken') updater.bot.setWebhook('https://example.com/svc/myTelegramToken')
注意 : webhook 与无服务器架构或“按需”节点配合良好。我已经在 Heroku 自由层上部署了 Telegram webhooks,它会在 30 分钟不活动后进入睡眠状态,但如果推送新消息,Heroky Dyno 会启动,消息会在几秒钟内消耗掉。
注 2 :根据 bot 部署的位置,需要配置端口号。例如,在 Heroku 上,端口通常由 port 环境变量定义,不应该硬编码。
如何注册 webhook
你可以调用一个setWebhook
URL:使用你的私有令牌并传递 webhook 的 URL(必须是 HTTPS)。
[https://api.telegram.org/bot{](https://api.telegram.org/bot(mytoken)/setWebhook?url=https://mywebpagetorespondtobot/mymethod)myTelegramToken}/setWebhook?url=https://example.com/svc
在拉和推模式之间切换
我发现使用环境变量以编程方式在轮询和 webhook 之间切换非常方便:默认设置是polling
在本地工作,但是,当部署在实时系统上时,它可以被覆盖(到webhook
)。
# read MODE env variable, fall back to 'polling' when undefined mode = os.environ.get("MODE", "polling")if DefaultConfig.MODE == 'webhook': # enable webhook updater.start_webhook(listen="0.0.0.0", port=3978, url_path='myTelegramToken') updater.bot.setWebhook('https://example.com/svc/myTelegramToken')else: # enable polling updater.start_polling()
获取聊天 Id
回复收到的信息非常简单。
update.message.reply_text("Hi there!")
然而,有时我们希望能够在用户没有询问任何事情的情况下发起消息(例如,几天后的通知,以重新吸引我们的用户)。
检索(并保存)在用户发送的消息的 JSON 有效负载中找到的chat_id
(是的,您至少需要一条消息)
{'update_id': , 'message': { 'message_id': 412, 'date': , 'chat': { 'id': , 'type': 'private', 'username': 'gcatanese', ....
当解析有效负载 Python 时,不要忘记不同的消息有稍微不同的 JSON。
def get_chat_id(update, context): chat_id = -1 if update.message is not None: # text message chat_id = update.message.chat.id elif update.callback_query is not None: # callback message chat_id = update.callback_query.message.chat.id elif update.poll is not None: # answer in Poll chat_id = context.bot_data[update.poll.id] return chat_id
建议的行动
引导对话,为用户提供预定义的选项以供选择。这可以通过使用InlineKeyboardMarkup
来实现,这是一个出现在信息旁边的键盘(像一个问题)。
作者图片
下面是创建选项的 Python 片段:
options = [] options.append(InlineKeyboardButton(text='Text', callback_data='1')) options.append(InlineKeyboardButton(text='File', callback_data='2')) options.append(InlineKeyboardButton(text='GoogleDoc', callback_data='3')) options.append(InlineKeyboardButton(text='Gallery', callback_data='4'))reply_markup = InlineKeyboardMarkup([options])context.bot.send_message(chat_id=get_chat_id(update, context), text='What would you like to receive?', reply_markup=reply_markup)
重要的是要理解响应将由一个CallbackQueryHandler
来处理,并且传入的 JSON 有效负载不同于纯文本消息。
# input from text message text = update.message.text # selection from callback choice = update.callback_query.data
注意:一旦做出选择,选项就会从聊天中消失。
注 2 :使用常数值定义callback_data
,该常数值将用于决定要做什么。与按钮上的text
不同,该值不应改变,因为它对用户不可见。
choice = update.callback_query.dataif choice == '1': # Choice 1: Text update.callback_query.message.edit_text('You have chosen Text')
显示“正在键入…”
显示输入指示器是聊天机器人的一个常见功能:用户被告知消息即将到达,即使有一点延迟。
context.bot.send_chat_action(chat_id=get_chat_id(update, context), action=telegram.ChatAction.TYPING, timeout=1) time.sleep(1)
注:在显示打字指示器时,我通常会引入一个短暂的延迟,以营造一种真实对话的感觉。
带有附加参数的深度链接
深度链接是一种允许打开与给定机器人对话的机制。这有助于在网站、电子邮件或社交媒体上分享机器人的链接。
定义深层链接时,可以添加一个附加参数:
[https://sigusoft.com/username_bot?start=signup](https://sigusoft.com/username_bot?start=signup)
该链接打开电报应用程序,提示与机器人进行对话。附加参数被传递给处理/start
命令的CommandHandler
。
def start_command_handler(update, context): param_value = context.args[0] update.message.reply_text('Value is ' + param_value)
发送文件
聊天机器人可以通过不同的方式发送文件(如 pdf、Office)。
使用send_document
和文件的完整 URL:
url='https://github.com/gc/TelegramBotDemo/raw/main/test.pdf' context.bot.send_document(chat_id=get_chat_id(update, context), document=url)
注意:这种方法需要一个直接指向文件的 URL。
另一种方法是首先在本地下载文件,然后用同样的方法发送它send_document
。
# fetch from Google Drive url = 'https://drive.google.com/file/d/0BZ3dWQ2ZXVOdE1V/view' r = requests.get(url, allow_redirects=True) # save local copy open('file.ppt', 'wb').write(r.content)# send file to user context.bot.send_document(chat_id=get_chat_id(update, context), document=open('file.ppt', 'rb'), filename="Presentation.pptx")
注意:当 URL 不直接指向一个文件时,这种方法通常是必要的,但它是一个按需输出内容的端点。
创建媒体集
一个很酷的功能是发送一组媒体,如照片,视频和音频。
作者图片
list = []# define list of files list.append(InputMediaPhoto(media='https://../mintie.jpg', caption='Mint')) list.append(InputMediaPhoto(media='https://../pinkie.png', caption='Pink')) list.append(InputMediaPhoto(media='https://../orangie.png', caption='Orange')) context.bot.send_media_group(chat_id=get_chat_id(update, context), media=list)
注意:机器人最多可以同时发送 10 个媒体文件。
注 2 :每条消息在电报速率限制内计数(每秒 30 条消息),因此您最多可以发送 3 条消息,每条消息包含 10 个媒体(总共 30 个),但在这种情况下,您不能在同一事务中添加任何其他内容(甚至不能是一条简单的文本消息)。
结论
我希望这篇文章有助于理解一些更高级的场景,并发现可以让您的 Telegram 聊天机器人变得更特别的功能。我的建议是总是首先考虑用户在寻找什么(他们为什么要聊天?)然后以一种让他们的谈话没有摩擦、愉快的方式来设计:取得良好的平衡决定了你的聊天机器人的成功。
查看一下 Github repo ,在那里你可以获得上面显示的代码片段。
如有问题和建议,请在 Twitter上找到我。
聊天愉快!
将人工智能引入下一代保险解决方案
原文:https://towardsdatascience.com/bringing-ai-to-next-generation-insurance-solutions-1a75d8e81a33?source=collection_archive---------36-----------------------
财产保险应用中的卷积神经网络
建筑足迹——旧金山(图片由作者提供)
从无人驾驶汽车到加密货币,科技正在颠覆我们生活的方方面面——包括我们工作、饮食和交流的方式。同样,企业正在整合技术和数字化业务流程,以推动增长并为客户创造价值。虽然技术改变了许多行业,但财产和意外伤害(P & C)行业采用技术的速度相对较慢。事实上,P & C 行业的成本结构并没有改善。在过去十年中,每份保单的管理成本增加了 30%以上。
为了解决不断增加的费用和损失率,像河马保险和柠檬水这样的保险技术正在利用人工智能和自动化的力量来重新定义客户与他们的保险公司互动的方式。通过放弃传统的保险代理并创建在线分销渠道,这些保险技术公司能够最大限度地减少整个价值链中的客户接触点,从保险报价到绑定,一直到理赔。虽然大多数保险技术都专注于通过为最终用户提供快速无缝的在线体验来扰乱住宅房地产市场,但商业和工业保险市场的扰乱时机已经成熟。
下一个 insurtech 颠覆者将是一家能够规划商业和工业资产、构建分析以更好地进行风险选择和索赔管理,并扩展流程以覆盖中小型企业(SME)的公司。为了简化在线分销渠道,在核保、定价和理赔之间建立分析驱动的反馈回路至关重要。在这种情况下,航空影像和照片可用于构建定制分析解决方案,以便为(再)保险公司提供更好的风险选择和管理。考虑从航空图像中构建数据精炼厂和数据管道,这有助于在飓风或地震袭击后进行核保和事后分析。
虽然有许多方法可以从空间影像中构建数据驱动的工作流,但在本文中,让我们探索一种从航空和街景数据中提取洞察力的强大方法。在本文中,让我们探索 Con voluntive Neural Networks(CNN)如何帮助构建简单而强大的地理空间数据预测模型。来自这些预测模型的可操作见解有助于提高承保和理赔管理的风险选择决策树的质量。
卷积神经网络:
卷积神经网络(CNN)是用于图像分析和分类问题的最常见的神经网络类型。与标准神经网络类似,卷积神经网络也有一个输入和一个输出层,以及多个隐藏层。对于细胞神经网络,隐含层包括一对运算— 【卷积】 和 汇集 。CNN 架构的示意图如下所示,带有两对卷积和汇集操作。我们从输入图像开始,它通常是一个 3D 矩阵。然后,通过将 3D 阵列穿过一系列卷积层来转换图像。卷积和池层的最佳堆叠数量取决于图像中存在的更精细的模式。在每个卷积操作结束时,我们创建一个输入图层的特征地图。在达到预定数量的卷积层之后,我们将卷积后的 3D 输出展平为 1D 向量,然后将其馈送到标准的多层感知器神经网络模型。
卷积神经网络示意图(图片由作者提供)
卷积: 卷积层的作用是从图像中提取特征。图像通常由边缘、形状和对象等图案组成。由于这些模式是固定的,我们可以使用较小维度的滤波器/核来提取这些大规模图像特征。作为卷积层的一部分,我们预定义了选定数量的过滤器及其尺寸。过滤器可以被认为是一个小矩阵(例如 2×2 ),其值用随机数初始化。然后,我们通过在输入图像的每个 2x2 像素块上滑动 2x2 滤波器的中心来卷积滤波器和图像,然后将滤波器中的每个值乘以图像中的像素值,最后将这些乘积求和。卷积层的结果输出表示输入图像的特征图,其中提取了不同的模式。下图显示了 2D 图像阵列(4x4)、过滤器(2x2)和尺寸为 4x4 的输出要素图。
卷积(输入图像 X 滤波器=特征图)
汇集: 卷积后就是汇集操作。汇集卷积特征图的目的是— (1)压缩信息&减少数据的维度,(2)改善计算时间,以及(3)控制过拟合。有两种常见的池功能:a)最大池和 b)平均池。“最大池”函数返回过滤器覆盖的卷积数组的最大值,“平均池”返回过滤器覆盖的卷积数组的平均值。下图显示了池大小为 2x2、步幅为 2 的最大池示例。在这里,我们将尺寸从 4x4 减少到 2x2。汇集的值表示原始图像中最活跃的像素(例如,边缘、图案)。
Max Pooling[Pool Size = 2 x2&Stride = 2](图片由作者提供)
现在我们已经介绍了卷积神经网络的基本构建模块,让我们看看如何使用 TensorFlow Keras API 轻松实现卷积层。下面的代码片段显示了卷积层的一般实现。对于这个实现,我们选择默认的过滤器数量为 64,内核/过滤器大小为 3x3。我们还使用了最大池,池大小为 3x3,跨度设置为 1 个像素。整流线性 (ReLU)是本实施方案的激活功能选择。
卷积层—卷积和池化操作的 Keras 实现
我们可以很容易地堆叠这些卷积层,以创建一个所需深度的 CNN 模型,如下面的代码片段所示。例如,我们首先用输入图像实例化一个 Keras 张量,然后将一个层的输出作为输入依次传递到下一个卷积层。最后,我们将 3D 特征图展平成 1D 特征向量,然后将它们馈送到标准前馈网络,该网络具有表示我们试图解决的分类问题中的标签数量的多个端节点。
整合—卷积神经网络
应用:
我们已经看到在 Keras 中实现一个基本的 CNN 是多么容易。现在,让我们将 CNN 模型应用于三个不同的数据集,并评估其从空间图像中推断信息/模式的有效性。前两个数据集涉及从航空影像中识别土地利用类别,这有助于对感兴趣的属性/基础设施进行圈定和地理编码,以及为数据管道构建暴露数据集。最后一个数据集着眼于评估建筑物损坏,这有助于自动化理赔工作流。
数据集:
1。UC-Merced 土地利用数据集: 该数据集拥有近 2100 张航空影像,涵盖 21 个不同的土地利用类别。下面显示了 16 个不同图像的样本,以及指定的标签。数据集可以从这个链接下载。虽然每个图像的数据都有一个指定的标签,但是我们可以通过视觉观察发现,可以为一些图像分配多个标签。例如,第一图像可以被标记为“棒球场”、“树”和“建筑物”。
UC-Merced 土地利用图片样本(图片由作者提供)
2。UC-Merced 土地利用数据集(多标签): 为了使 UC-Merced 土地利用目录更能代表地面参考数据,https://big earth . eu/的研究人员用一个或多个(最多七个)标签手动重新标记了每幅图像。在重新标记的数据集中有 17 个不同的类,下面显示了一个带有指定标签的图像示例。多标签的 UC-Merced 土地利用数据库可以从这个链接下载。
UC-Merced 土地利用图像样本【多标签】(图片由作者提供)
3。作为 phi-net 挑战的一部分,加州大学伯克利分校的太平洋地震工程研究(PEER)中心已经收集了一个大型结构图像数据集。该数据集有助于开发和评估基于视觉的自动化算法,用于结构健康监测和损伤评估。phi-net challenge 中有八个检测任务,在这项研究中,我们将使用任务 1 场景级数据,解决图像中的缩放问题。共有 24,309 幅图像,它们分为三类——a)像素,b)对象和 c)结构。可以从这个网页请求数据集。
任务 1:场景级图像(图片由作者提供)
结果:
对于所有这三个应用程序,基本的 CNN 模型架构与前面所示的相同,只是对读/写操作进行了微小的修改,以反映所使用的输入-输出数据。完整的模型实现可以在我的 GitHub 页面上找到。
单个类别: 在这个数据集中的 2100 幅图像中,我们使用了 2000 幅图像用于训练和验证目的,剩余的 100 幅图像用于测试模型。下图显示了测试数据集中的图像样本,包括实际标签(左)和预测标签(右)。该模型在识别图像中的模式和预测适当的标签方面做得相当好。还存在实际标签和预测标签之间存在微小不匹配的情况。例如,第 3 行第 1 列的图像被归类为“密集住宅”,但 CNN 模型预测它是一般的“建筑”类别。
实际【左】和预测【右】(图片由作者提供)
为了总结 CNN 模型在这个分类问题上的性能,我们基于测试数据的实际和预测标签生成了混淆矩阵。我们可以看到该模型具有良好的泛化能力,混淆矩阵看起来是合理的。
混淆矩阵(图片由作者提供)
多标签: 同一个代码实现可以进一步扩展进行多标签分类。与前面的分析类似,我们使用 2000 张图像来训练和验证模型,剩余的 100 张图像用于测试目的。
测试数据集中的图像样本—实际标签(图片由作者提供)
上图展示了来自测试数据集的图像样本以及实际标签。现在,对于相同的图像,让我们比较和对比 CNN 模型生成的标签。我们可以清楚地看到,预测的标签更能描述图像,突出了 CNN 模型在图像中选取多个模式的有效性。
测试数据集中的图像样本—预测标签(图片由作者提供)
建筑物损坏: 现在,让我们过渡到评估同一 CNN 模型在评估视觉损坏估计中的缩放问题时的鲁棒性。如前所述,这里的目标是对场景级图像进行分类,并将它们归类为像素、对象或结构。该模型能够达到 82%的预测准确度分数。
混淆矩阵——建筑物损坏评估任务 1 的模型性能(图片由作者提供)
结束语:
世界上大多数风险都没有保险。经济损失与保险损失之差称为 【保障缺口】 。保险投保率不高的原因有很多,但普遍的成本结构是最令人望而却步的原因。如果我们能够利用最新的技术和计算进步来降低保险成本结构,我们将能够在缩小保障差距方面取得重大进展。
在本文中,我们谈到了构建一个简单的卷积神经网络模型的主题,该模型可以帮助从空间数据中获得可操作的见解。当这些自动化模型集成到再保险(保险公司)数据工作流程中时,可以帮助优化组合比率并降低保险成本结构。地理配准完成后,这些模型可自动进行调整,以满足以下要求:
1。为感兴趣的区域开发建筑物和基础设施的位置级暴露足迹
2。创建网格级别的暴露集和风险图,可以进一步扩展以开发新的参数保险产品
3。改进核保和定价的风险选择决策树
4。微调索赔管理流程
感谢阅读这篇文章!感谢所有反馈。如有任何问题,请随时联系我。
如果你喜欢这篇文章,这里还有一些你可能喜欢的文章:
*https://medium.com/@kap923/hurricane-path-prediction-using-deep-learning-2f9fbb390f18
参考文献:
- 杨和纽萨姆(2010)。土地利用分类的视觉词汇和空间扩展,ACM 地理信息系统进展空间国际会议,2010 年。
- 乔杜里,德米尔。路易斯安那州布鲁佐内(2018 年)。使用半监督图论方法的多标签遥感图像检索,IEEE 地球科学与遥感汇刊,第 56 卷,第 1 期
- 高,y .和莫萨拉姆,K. M. (2019 年)。PEER Hub ImageNet(φ-Net):结构图像的大规模多属性基准数据集,同行报告 №2019/07,加州大学伯克利分校太平洋地震工程研究中心。
- 高,杨,&莫萨拉姆,K. M. (2018)。基于图像的结构损伤识别的深度迁移学习。计算机辅助土木和基础设施工程,33(9),748–768。*
通过 ARM 模板将所有基础设施作为一个代码
原文:https://towardsdatascience.com/bringing-all-of-the-infrastructures-as-a-code-through-arm-templates-ba9987ccac1f?source=collection_archive---------39-----------------------
使用 ARM 模板通过 ARM 模板将虚拟机和存储帐户置于安全的私有虚拟网络中
奥马尔·弗洛雷斯在 Unsplash 上拍摄的照片
动机:
假设我们已经有了一个基础设施。有时我们可能需要再次复制相同的基础架构。手动操作肯定会在迁移阶段给我们带来错误。因此,我们将利用来自 Azure 的名为 Azure ARM Templates 的服务,以幂等的方式部署我们的基础设施。
建筑:
苏拉布什雷斯塔。通过 ARM 模板 1 将所有基础设施作为一个代码。2021.JPEG 文件。
先决条件:
- Azure Blob 存储
- Azure 虚拟机
- Azure VNet
Azure 虚拟网络:
Azure 虚拟网络是 Azure 在云中的网络。这个虚拟网络可以细分成不同的子网。在本练习中,我们将创建一个带有一个子网的虚拟网络,该子网是私有的,不能访问互联网。虚拟网络,填写详细信息,查看+创建。
苏拉布什雷斯塔。通过 ARM 模板 2 将所有基础设施作为一个代码。2021.JPEG 文件。
您的虚拟网络将成功部署。
苏拉布什雷斯塔。通过 ARM 模板 3 将所有基础设施作为一个代码。2021.JPEG 文件。
Azure 虚拟机:
现在,我们在 VNet 中创建一个 Azure 虚拟机。 Azure 虚拟机,填写基本细节,选择刚刚创建的 VNet ,审核+创建。
苏拉布什雷斯塔。通过 ARM 模板 4 将所有基础架构作为一个代码。2021.JPEG 文件。
部署应成功完成
苏拉布什雷斯塔。通过 ARM 模板 5 将所有基础设施作为一个代码。2021.JPEG 文件。
Azure Blob 存储:
让我们创建 Azure Blob 存储。存储账户,+创建,填写基本信息,审核+创建。
苏拉布什雷斯塔。通过 ARM 模板 6 将所有基础设施作为一个代码。2021.JPEG 文件。
您的部署将被创建。
苏拉布什雷斯塔。通过 ARM 模板 7 将所有基础设施作为一个代码。2021.JPEG 文件。
ARM 模板:
ARM 模板是以 JSON 形式编写基础设施以获得最大可用性的幂等方法。创建虚拟机、虚拟网络和子网是一个非常漫长的过程,我们在创建过程中可能会出现错误,因此,ARM 模板是首选。我已经创建了 ARM 模板,并且在我的 GitHub 上。但是不要担心,我会教你如何编写 ARM 模板,更重要的是生成它们,因为从头开始编写非常困难。
假设我已经创建了一些基础设施,我想为它创建一个 ARM 模板。进入资源组,选择资源,和导出模板。
苏拉布什雷斯塔。通过 ARM 模板 8 将所有基础设施作为一个代码。2021.JPEG 文件。
然后下载按钮。
苏拉布什雷斯塔。通过 ARM 模板 9 将所有基础设施作为一个代码。2021.JPEG 文件。
您将获得 template.json 和 parameter.json。template . JSON 包含您想要使用其详细信息创建的基础结构,parameter . JSON 包含您想要为资源指定的唯一名称。在这篇文章中,我将添加我的默认值。您可以通过 parameter.json 添加唯一的名称,并输入下面给出的命令。
在您使用 CLI 执行命令后,它可能无法运行,因为您必须对 JSON 文件进行一些整理,比如删除订阅 id 以实现动态可用性,还需要删除不必要的键值对。对于这篇文章,你不必担心,因为我提供的 JSON 已经发挥到了极致。打开代码后,这里是您需要线性输入的命令。
az create group --name prem-vm --location eastusaz deployment group create --resource-group prem-rg --template-file template.json
演示:
正如在体系结构中承诺的那样,让我们检查一下虚拟机和存储帐户。
苏拉布什雷斯塔。通过 ARM 模板 10 将所有基础架构作为一个代码。2021.JPEG 文件。
苏拉布什雷斯塔。通过 ARM 模板 11 将所有基础设施作为一个代码。2021.JPEG 文件。
我们的两个资源都在我们创建的虚拟网络中。
结论:
我们展示了如何利用 Azure ARM 模板轻松创建复杂的基础设施。这只是最低限度,因为我们可以向 ARM 模板添加越来越多的内容。还有其他工具,如 Terraform 和 Pulumi,我们可以利用它们以声明和命令的方式编写 IaC 代码。可能性是无限的,选择是无限的,你想做什么取决于你自己。如果你遇到任何问题或难以遵循这些步骤,请在下面评论这篇文章或在 给我发消息。你也可以在 Linkedin 和 GitHub 上和我联系。
资源:
1 Azure 虚拟网络:https://docs . Microsoft . com/en-us/Azure/Virtual-Network/Virtual-networks-overview
[2] ARM 模板:https://docs . Microsoft . com/en-us/azure/azure-resource-manager/templates/overview
将数据科学引入能源领域
原文:https://towardsdatascience.com/bringing-data-science-to-energy-cbebfc704c57?source=collection_archive---------27-----------------------
为什么可再生能源项目工程师应该学习数据科学
作者照片
可再生能源项目工程师有很多责任。他们必须准确预测未来 30 多年的天气,设计一个电厂以最大限度地降低建设和运营成本,并管理涵盖地面以上 500 英尺空间到地面以下 30 英尺土壤特性的研究。工作量的多样性带来了准确性的压力;这些研究中的小错误可能代价高昂。一座 100 兆瓦发电设施 1%的能源预测误差会造成超过 200 万美的终生收入损失。
由于所需任务的范围,理想的工程师必须是全面的,具有强大的工程背景。通常,他们拥有机械、土木或环境工程学位。虽然这些课程非常适合培养管理项目工程研究所需的技能,但通常不会教授熟练的数据科学技能,如如何编程、高级统计和机器学习。结果是可再生能源工程师的劳动力在没有适当培训(或时间)的情况下有效地处理大量数据。这给清洁能源革命带来了一个问题。
但是这真的是个问题吗?能源评估软件已经存在,Excel 模板可用于定制其输出。机器学习听起来不必要的复杂,只是一个时髦词,它将要求我们雇用软件工程师来减缓没有附加值的项目开发。有些人不应该需要计算机科学学位来从事工程工作。
当然,软件确实存在,Excel 模板确实有效,项目工程师不需要成为软件工程师,但现有的软件会咬人,Excel 模板会咬人,编写机器学习代码所需的技能水平略高于用 byte 这个词制造双关语所需的水平。提升项目工程师的数据分析技能的成本是微不足道的(免费的开源工具、免费的培训材料、很少的学习时间),并且它为开发公司整体带来了巨大的利润(更少的错误、更高的生产率和更好的项目洞察力)。这里有一个例子。
项目工程师的一项常见任务是,在给定不同布局约束的情况下,估计项目在其整个生命周期内将产生的能量。这种分析对于项目的经济性是至关重要的,因此受到高度的审查,但是一个项目在完成开发时可能会运行上百种不同的评估。这些评估通常是匆忙地成批执行的,一次运行十次迭代,每批之间间隔几个月。以下是传统流程:
1.必须对现场天气数据进行汇编、清理和分析。
2.必须汇编和分析卫星气象数据集。
3.必须跨现场数据和卫星数据绘制模型,并预测新的天气数据集。
4.这些天气数据必须输入到能源评估软件中,并设置特定的输入,以代表项目布局的单次迭代。
5.能源评估软件的输出必须输入到 Excel 模板中,由该模板进一步处理结果。
6.将创建一个报告来汇总 Excel 模型的结果。
7.对于项目的每个布局迭代,必须重复步骤 4-6。
通常,此流程的第 1-3 步包括从各种网站下载 CSV,并将它们全部插入一系列 Excel 模板,将数据从一个模板复制并粘贴到下一个模板。有时,除了 Excel 之外,还会使用特定应用软件。“清理”过程是通过手动梳理成千上万的数据点来删除您不喜欢的数据点(或者因为您没有时间而什么都不做),并且分析结果是高度主观的。如果你让两个工程师重复这个过程(或者同一个工程师试着做两次),你会得到两个不同的答案。用于预测天气数据的模型通常非常简单,但这并不全是坏事,因为这个过程有太多的不确定性,无法保证任何更复杂的事情。总的来说,这个过程可能需要一天的时间来完成,并需要另一名工程师的详细审查。
步骤 4-7,如果设置得好,非常单调,不需要任何批判性思维。这相当于让某人重复屏幕上的相同点,一次也不出错。手动错误可能而且经常发生,尤其是在时间紧迫的情况下(每次都是这样)。
再次说明,这个过程是可行的。优秀的工程师足够勤奋,能够发现大的错误,并且能够将所有的小错误一笔勾销。是的,时间下沉是巨大的,但是工程师只是被期望在办公室呆到很晚来完成它。最重要的是,任何人都可以被训练成这样。
与此同时,可再生能源项目的利润率继续下降。市场竞争越来越激烈,如果一个项目想要有机会,能源预测的不确定性必然会加剧。最重要的是,工程师的工作量呈指数增长,他们花在疯狂屏幕上的任何时间都可以更好地用于工程。
幸运的是,上面概述的整个过程可以在工程师喝杯咖啡的时间内完成。他们只需要指定想要运行的布局场景,然后 play。当他们回来时,他们可以把他们含咖啡因的能量用于批判性地分析结果,这是他们以前负担不起的。他们可以相信分析没有人为错误,不确定性更少,并且团队中的任何人都可以完全重现。
这个黑魔法按钮是什么?这是一种无需正式培训、无需任何费用即可打造的东西。任何工程师都可以编写一个简单的程序来自动化整个过程,从获取数据,到使用高级统计模型进行分析,然后创建交互式视觉效果和有吸引力的报告。该工程师甚至可以完美地定制程序,以匹配他们公司的工作流程,这是第三方软件永远做不到的。我知道,因为我自己也做过。
对建筑工程师数据科学技能的好处远不止这个例子。全自动、可重复的工作流节省了无数时间和错误,复杂的模型(如机器学习)可以利用当前未充分利用的数据来释放业务洞察力。可再生能源项目工程师有更好的方法来分析他们的数据,开发公司也有更好的方法来利用他们工程师的时间。
这些技能非常容易学习,任何项目工程师都可以在不需要计算机科学学位的情况下掌握它们。强调这种训练对任何工程团队都有好处。知道了这一点,一个更难回答的问题是“为什么工程师不应该学习数据科学?”
将联合学习引入企业
原文:https://towardsdatascience.com/bringing-federated-learning-to-the-enterprise-50284a88f842?source=collection_archive---------45-----------------------
如果公司可以通过跨不同的云和多个数据平台训练数据来建立更准确的 ML 模型,会怎么样?
来源: Freepik
A 面对市场的不确定性和波动性,企业扩展和提高其机器学习(ML)模型性能的能力已经成为一项至关重要的工作。问题是,对于许多企业来说,运行它们的 ML 模型的体系结构不是盟友,而是性能和可用性的敌人。
随着云原生架构的发展,跨不同云平台集成的概念在最近几年肯定有所增长。对于数据、分析和人工智能企业社区来说,情况更是如此,因为企业正在努力充分利用现有的技术投资,以便在当前市场不确定性的情况下优化运营。不幸的是,这种集成通常需要投资软件,以促进本地、混合、边缘和多云部署的使用,从而最有效、最经济地移动和处理数据。
将这种松散耦合的体系结构串联在一起确实可以降低成本,并产生一种敏捷和灵活的感觉。但是想象一下在这种环境中高速大规模地移动 ML 模型数据。当然,这是可以做到的,但通常是异步的。对于异常检测等用例,模型的实时准确性取决于对实时数据的实时访问。以在高度管制的市场中运营的组织为例。对于金融机构来说,即使是高度统一的内部数据架构也可能阻碍进步,因为金融法规可能会限制数据本身的移动性。
但是,如果公司可以通过跨多个云或跨多个数据主权区域/网络训练数据来更快速地提高其 ML 模型的准确性,而又不损害数据隐私或安全性,会怎么样呢?
进入联合学习
第一次讨论是在谷歌 2016 年发表的一篇论文中,联合学习允许数据科学家构建一系列本地数据模型,这些模型从一个共享模型中协作学习,同时将所有训练数据保留在本地。谷歌在 2017 年继续将这一想法付诸实践,为所有 Android 移动设备配备了一个键盘(Gboard)工具,可以不断改善预输入预测,使用来自所有参与设备的数据,而不必实际上将数据从每个设备移动到云。这一理念给谷歌(和 Android 用户)带来了许多重要的好处:
- 针对个性化(每台设备)预输入推荐的更准确、更强大的预测模型
- 利用一般数据保护法规(欧盟 GDPR)中提到的数据最小化原则,改进数据隐私
- 提高性能,降低延迟和功耗,从而改善成本模型
不幸的是,即使取得了早期的成功,联合学习还没有进入主流企业解决方案。但这种情况正在慢慢改变,因为供应商正在寻找将这种独特的架构产品化的方法。2019 年,谷歌推出了开源框架 TensorFlow Federated (TFF),谷歌希望这将鼓励更广泛的行业进行实验。将来,该公司可能会寻求构建一个更具可操作性的,甚至是产品化的应用程序。
跳进拳击场
但是谷歌不是唯一一个调查联合学习的供应商。鉴于 IBM 作为早期创新者的传奇历史,在许多潜在影响但有些不可预测的想法上,如区块链和量子计算,该公司自己调查联合学习的概念也就不足为奇了。
在该公司最近更新的 Cloud Pak for Data(现在是 3.5 版本)的一系列新功能中,IBM 在一个联邦学习的技术预览版中加入了 Python 算法包。基本想法是让公司有能力训练和完善人工智能模型,而不必集中支持这些模型的数据。但是 IBM 并不打算让它的客户将它的联邦学习的实现用于像预输入预测这样的孤立用例。相反,该公司希望企业将联合学习视为一个机会,通过更好的模型训练来推动更好的人工智能成果,而不受数据孤岛的阻碍,并责成集体参与,而不必担心上文提到的隐私、合规、安全或性能问题。
IBM 的方法有三个重要且相互关联的结果。首先,它允许数据科学家和 AI 开发人员利用大量数据,而不必在源和模型之间维护稳定、高性能的数据管道。其次,它使数据科学家能够利用源数据,而不必担心创建和维护数据隐私和安全。第三,企业可以节省维护模型训练性能的成本和风险,避免重新构建或移动数据的需要。
这是否意味着 IBM 客户可以简单地将现有项目移植到联合学习环境中?当然不是。鉴于联合学习本身的许多复杂性,公司应该仔细评估调整现有项目以利用这一新功能的价值。例如,客户必须仔细规划他们希望如何共享数据、调整超参数、构建隐私模型等。以便最有效地利用联合学习。此外,因为联合学习本身是一种非常不成熟的技术,所以有许多未回答的问题必须由所有社区参与者来解决,例如如何克服数据异构性、客户端模型偏差、推理攻击预防等挑战。
最佳策略将包括客户和技术合作伙伴之间的一些联合试验,这些合作伙伴希望为特定的业务成果构建定制的实施。为此,IBM 已经有了一个良好的开端,因为已经有 50 家系统集成商和技术合作伙伴在开发特定于行业的内容,作为 Cloud Pak for Data 的一部分出售。即使是横向数据库、数据管理和数据科学合作伙伴,如 Anaconda、MongoDB 和 NetApp,也可能会找到直接支持垂直化实施的新市场途径。
不管联合学习的市场路线如何,市场领导者谷歌和 IBM 的这些早期努力对企业人工智能从业者来说是个好兆头。虽然联邦学习不太可能以一键、可部署的服务选项出现,但它现在作为一个框架(来自谷歌)和一套库(来自 IBM)可用的事实证明,对于努力解决艰难的架构人工智能挑战的公司来说,隧道尽头有一盏灯。
注: 本帖 摘自一篇最初出现在 Omdia VisionAIres 社区 内的帖子。
将更多的人类带入人工智能的生命周期
原文:https://towardsdatascience.com/bringing-more-humans-into-the-ai-lifecycle-ac5bed?source=collection_archive---------29-----------------------
介绍 Rubrix,一个人在回路的工具,用于跟踪、探索和迭代人工智能项目的数据
Ehimetalor Akhere Unuabona 在 Unsplash 拍摄的照片
启动人工智能项目变得比以往任何时候都容易。像拥抱脸枢纽或带代码的论文这样的倡议让开发者可以即时获得最新的研究成果。迁移学习和 AutoML 方法的兴起意味着你不需要花几个月的时间来为你的项目训练一个模型。然而,以我的经验来看,这只是故事的(一小)部分。
几乎每个处理“应用”人工智能项目的人都会同意,像数据收集和管理,或者模型服务和监控这样的事情要重要得多,而且很难做好。虽然这些事情也变得越来越容易,但管理数据和模型的任务仍然感觉像是将工具和流程拼凑在一起。当我们谈论工具和过程时,我们最终谈论的是人,我们,使用工具并试图遵循过程的人。
《毕竟是人》,蠢朋克,2005 年。
关于所谓的 ML/data science 项目生命周期已经写了很多,但是关于在这样的“生命周期”中工具、数据、模型和人之间的相互关系却写得不多。让我们来看看一个“简化的”生命周期:
一个“简化的”人工智能项目生命周期
上图显示了流程中涉及的一系列活动和角色:
- 数据收集和标记:此活动中涉及的典型角色是数据工程师、数据科学家、业务和主题专家,甚至是数据饥渴项目的群众工作者。
- 模型开发和实验:这里的核心角色是数据科学家。
- 模型测试:典型角色有 ML 工程师和数据科学家。
- 模型部署:这里的角色是 ML 和 DevOps 工程师。
- 监控和可观察性:主要角色还是 ML 和 DevOps 工程师。
到目前为止,我们有流程和角色。但我们缺少两个关键因素:“生命”和“周期”。数据和模型不是静态的,它们是“活的”东西,训练/测试/服务模型也不是一次性的活动,它们形成循环。
《现代生活》,德沃,1981 年
进入 ML 模型的生产使用,事情会变得复杂。实践中出现了几个关键问题,例如:
数据科学家可以轻松地回到业务和主题专家那里收集更多数据吗?
我们是否可以轻松地与专家分享“实时”预测,以收集更多训练示例?
我们能否在不将生产数据持续转移到数据收集和标记阶段的情况下测量生产精度?
我们能否直接从最终用户那里无缝收集反馈?
所有上述问题都有一个潜在的主题:为基于人工智能的解决方案管理数据的角色、工具和过程之间的摩擦。
在 Recognai,自从四年前我们开始与客户合作企业 NLP 项目以来,我们就遭受了这些摩擦。我们开发了内部和开源工具来帮助我们更好地支持我们的客户。但是有一些东西我们一直在构建、重建和重新思考:一个连接模型、数据和参与项目的人的工具,这样他们都可以在过程的任何一步为改进数据做出贡献。
在围绕这个想法进行了多次迭代之后,我们终于高兴地分享了 Rubrix ,一个免费开源的https://github.com/recognai/rubrix/,人工智能项目的人在回路工具。
红框是:
- 一个 Python 库使数据科学家、数据工程师和 ML 工程师能够在数据、模型和用户之间建立桥梁,用于数据收集、模型开发、测试、 部署和监控。
- 一个网络应用,用于在整个项目工作流程中探索、管理和标记数据。
- 一个开放 API ,用于存储、检索和搜索人类注释和模型预测。
Rubrix 和相关的生命周期活动(作者图片)
Rubrix 可以安装pip
:
pip install rubrix
唯一的非 Python 依赖项是 Elasticsearch。您可以使用 Docker 和docker-compose
来启动它,或者使用现有的 Elasticsearch 实例。
要获得更详细的设置指南,请查看 Rubrix 的指南,但是如果你渴望尝试它并且熟悉 Docker:
下载docker-compose.yml
并启动 Rubrix 服务器和 Elasticsearch:
mkdir rubrix && cd rubrix wget -O docker-compose.yml [https://git.io/rb-docker](https://git.io/rb-docker) && docker-compose up
现在,在进入更多的细节之前,让我们先来看看 Rubrix 是如何工作的!
以下代码从 Hugging Face hub、 AG 新闻数据集(一个众所周知的文本分类基准)加载一个零镜头文本分类器,并使用 Rubrix 存储预测和人工标注的标签:
AGNews 数据集上的 Rubrix 日志零炮预测
就是这样!您和您团队的其他成员现在可以探索这个分类器如何在一个看不见的数据集上工作:
带有 AGNews 数据集和零炮预测的 Rubrix 探索模式(图片由作者提供)
根据带标签的数据集探索模型预测,这只是您可以使用 Rubrix 做的许多事情中的一件,因为在“现实生活”中,有时您没有开始的标签,或者您没有模型,或者您只想在开始训练您的第一个模型时查看您的数据。模型开发是 Rubrix 最初的设计用途之一。
Andrej Karpathy 的这条推文总结了尽早查看数据的全部要点。
关于管理数据对人工智能的重要性,另一个伟大的灵感来自文森特·d·沃默达姆,他是 Rasa 的研究倡导者,也是令人惊叹的 calmcode.io 和 human-learn 等库的创造者:
以零触发分类器结束我们的第一个例子,让我们看看 Rubrix 的另一个有趣的用例:模型监控和可观察性。如果你对模特监测感兴趣,我强烈推荐你这篇来自本·洛里卡和帕科·内森的 文章 。正如我上面提到的,Rubrix 与 Elasticsearch 堆栈紧密集成。由于 Kibana 的易用性和 Rubrix 的数据模型,在 Rubrix 数据集的基础上构建自定义仪表板轻而易举。这是我们在 Jupyter 笔记本中记录零炮预测时实时仪表盘的样子:
自定义监控仪表板,带有红色字体和基巴纳字体(图片由作者提供
回到我们为什么构建 Rubrix,让我们介绍一下 Rubrix 指导原则:
1.没有人应该被迫改变他们的工作流程来为项目做贡献。
对于数据科学家来说,这个原则意味着 Rubrix 不会要求他们离开他们喜欢的工具,如 Jupyter Lab 或 Colab,来扩展任何类或围绕任何新的抽象包装他们的模型。
*对于*数据和 ML 工程师来说,这意味着 Rubrix 为读写(大量)数据提供了简单而有效的方法。我们设计了易于在自动化脚本中使用的 Rubrix。
*对于业务和*主题专家来说,这意味着一个干净且易于使用的用户界面,在这里他们可以感觉到控制,并且可以透明地检查数据和模型预测。
我们为提高透明度和信任度而感到兴奋的另一个用例是与 Kibana 仪表板配套的 Rubrix 中的模型可解释性。
这里有一个 Rubrix 数据集的例子,它包括使用集成梯度方法提取的情感分类器的令牌级属性,使用变压器解释和 captum.ai 库。
Rubrix 提供了一个不可知的数据模型,所以你可以使用其他库和技术,比如 Lime。
探索带有模型解释的情感分类器预测
基巴纳对积极情绪标签的平均表征归因分数的自定义可视化(图片由作者提供)
下面是记录预测和令牌属性的代码:
2.API 应该对每个人都足够简单,同时支持复杂的工作流。
数据模型符合这个简短的描述:
数据集是记录的集合,其形状由任务(例如文本分类)定义。
快照是用于再现性和自动化管道的数据集的存储版本。
一个记录由它的输入定义,并且可选地包含注释、预测、和数据。
注释通常是由人类代理为给定的任务和输入定义的基本事实。
预测通常来自来自机器代理(例如文本分类器的输出)。
在这个小图表中:
Rubrix 数据模型(图片作者)
让我们看看如何为 NER(命名实体识别)创建和记录一个记录,这是一个广为人知的 NLP 任务😗*
上面的代码使用 rb.log 方法记录了一个带有歌曲和乐队标签的 NER 示例,如果数据集不存在,它也会创建一个数据集。数据集是增量的,您可以使用 rb.log 来批量记录大型数据集(正如我们在监控示例中看到的)。这是该记录在 web 应用程序中的外观:
红色字体中的 NER 探险景观(图片由作者提供)
Rubrix 只需要调用两个主要的方法😗*
- rb.log(records,name) 将记录存储到一个 Rubrix 数据集中。
- rb.load(name) 将记录从 Rubrix 数据集中读入 Pandas 数据帧。
为了理解这两种方法支持的工作流类型,让我们看一个加载 Rubrix 数据集以微调预训练模型的示例。我们将遵循指南"微调预训练模型"从拥抱脸。
工作流程如下:
1 -我们已经使用 rb.log 创建了一个具有零命中率预测的 Rubrix 数据集,并且我们已经花了一些时间使用 Rubrix web-app 注释模式来手动标记一些示例。这和之前的例子是一样的,但是在这个例子中我们没有任何先验标签。
具有零触发预测的数据集中的红框注释模式(图片由作者提供)
2——在花了一些时间进行注释之后,我们准备好使用 rb.load 并准备好我们的数据集来微调模型。通常,我们会将其分为训练、测试和验证,但是让我们尽可能简单地描述这个例子:
3 -从这一点开始,只是按照指南中的描述对训练器 API 进行常规微调。请注意,我们使用的是无壳蒸馏器而不是有壳蒸馏器
如果您对此感兴趣,您可以:
- 阅读更多关于 Rubrix 的数据模型和 Python API 参考的信息。
- 查看我们的深入教程,了解如何将 Rubrix 与🤗转换器和数据集。
3.拥抱与其他工具、库和框架的集成。
我们生活在一个激动人心的时代,每个月都有新的库和工具发布。人们对用于不同事情的许多工具感到舒适,例如数据注释,或者模型实验跟踪,我们想要拥抱这种多样性。
Rubrix 不是一个全有或全无的工具或平台,我们的目标是让用户能够构建新颖的工作流,并将 Rubrix 与他们选择的工具相结合。这就是为什么,除了 Python 库和 web 应用程序,我们还为开发人员设计了一个开放的 REST API。
此外,为了激发你的想象力和创造力,请查看 Rubrix 的文档:
- 将 Rubrix 整合到 Streamlit 应用的指南,
- 一个使用 Rubrix 和通气管弱监控的教程
- 食谱提供了将 Rubrix 用于主要 NLP 库的代码片段,如我们喜爱的斯坦福大学的 spaCy、Flair 或 Stanza。
- 用 scikit-learn 和 ModAL 进行主动学习的基础教程。
4.提供一个最小的特性集,让社区来指导接下来的工作。
你可能已经注意到,我一直在谈论人工智能项目,但我们只看到了自然语言处理的例子。原因很简单:自然语言处理和知识图用例一直是 Rubrix 在 Recognai 开发的原始驱动力。然而,Rubrix 的数据模型和架构旨在轻松添加新的用例和应用程序。Rubrix 涵盖了广泛的 NLP 和知识图应用,只支持两个任务,文本分类和标记分类。
对于知识图用例,可以使用令人惊叹的 kglab 和 PyTorch 几何库和 Rubrix 随意查看节点分类教程。
我们设想的直接用例是 t ext2text ,它将涵盖许多其他 NLP 应用,如文本摘要或机器翻译;计算机视觉任务如图像分类;以及语音识别任务如 speech2text 。但在此之前,我们想听听你的声音。
这就是为什么我们很高兴宣布 Rubrix,这样你就可以成为一个开放友好的社区的一部分,并推动接下来的发展。
如果你想加入 Rubrix 社区或谈论你的即时和预想的应用,请在 Rubrix 的 Github 的论坛上给我们留言。
“我打这个号码
是为了约会
我不知道该做什么
我需要约会”发电厂乐团的《计算机之恋》,1981 年
感谢
感谢 Paco Nathan、Amélie Viallet、David Carreto、Ignacio 塔拉贝拉和 Francisco Aranda 为改进本文提供的巨大帮助和建议。
脚注
- 如果你不熟悉人在回路的概念,我强烈推荐你斯坦福大学以人为中心的人工智能研究所的这篇文章。
数字广播
原文:https://towardsdatascience.com/broadcasting-in-numpy-58856f926d73?source=collection_archive---------28-----------------------
理解 NumPy、PyTorch 和 TensorFlow 的关键概念之一
图片来源:作者
广播是一种匹配不同形状的数组的维数的操作,以便能够对这些数组执行进一步的操作(例如每素算术)。
一个非常强大的功能,但是文档有些不足。通常,当数组大小不匹配时,人们会从错误消息中了解到这一点。
最简单的广播示例是 n 维数组乘以标量,这显然意味着每个素的素乘以标量值:
广播类似于众所周知的“类型提升”:在大多数语言中,当添加一个整数和一个浮点时,整数首先被自动转换为浮点类型。
在 2D(例如用向量除一个矩阵)中,广播有点棘手,因为运算的结果取决于操作数的特定形状:
所有这些形状变化(灰色数字)都是动态发生的,不占用额外的内存(也称为视图)。
在 3D 及以上版本中,广播甚至更不直观,使用它需要了解广播规则的一般形式。它们在不同的来源中以略微不同的方式表述,确切的措辞也随着时间而改变。我发现来自 Python 数据科学手册 的三步法则是最全面的:
规则 1:如果两个数组在维数上不同,维数较少的那个数组的形状在它的前(左)侧用 1 填充*。*
规则 2:如果两个数组的形状在任何维度上都不匹配,则在该维度中形状等于 1 的数组将被拉伸以匹配另一个形状。
规则 3:如果在任何维度中,尺寸不一致并且都不等于 1,则产生错误。
拉伸意味着相应的层被复制:
将彩色图像转换为灰度图像是 3D 广播的一个很好的例子。根据 sRGB 颜色空间的公式,可以通过图像颜色通道的线性组合获得亮度:
使用广播,这可以简单地写成
其中im
是具有标准索引顺序的图像,例如 if im.shape == (1080, 1920, 3)
then gray.shape == (1080, 1920)
其中 1080 是图像的高度,1920 是其宽度,3 是色彩平面(RGB)的数量。完整示例:
图片来源:openastronomy.org
有一个专门的函数np.[broadcast](https://numpy.org/doc/stable/user/basics.broadcasting.html)
返回一个生成器对象
虽然广播很少被明确地完成(因为循环将在 python 中执行,这比在 C 中慢)。通常它发生在“幕后”。
但是广播并不局限于算术运算。更多用法示例见我的文章“ Numpy Illustrated ⁴”
广播最初是在 1995-1999 年左右在 NumPy 的前身 Numeric⁵图书馆引入的,被 PyTorch 、 TensorFlow 、 Keras 等采用。甚至 Matlab 在 2016b 中加了感谢“这些年来要求这种行为”的用户。
参考文献
- 杰克·范德普拉斯。Python 数据科学手册,数组计算:广播
- 维基百科。灰度
- NumPy 文档。广播
- 列夫·马克西莫夫(2020)。 Numpy 图解:Numpy 视觉指南
- 大卫·阿谢尔;保罗·迪布瓦;康拉德·欣森;吉姆·胡古宁;特拉维斯·奥列芬特(1999)。《数值 Python》
布朗洛奖章预测者
原文:https://towardsdatascience.com/brownlow-medal-predictor-36586d?source=collection_archive---------28-----------------------
使用数据驱动方法预测美国橄榄球联盟布朗洛奖章投票数
Ruck 竞赛。图片由教皇, CC BY-SA 4.0 ,通过维基共享
布朗洛奖章(Brownlow Medal)被授予由裁判决定的 AFL 在主客场赛季中“最佳和最公平”的球员。每场比赛结束后,三名现场裁判分别给比赛中第一、第二和第三名的选手 3、2 和 1 票。在颁奖之夜,每场比赛的投票都被记录下来,根据资格,获得最高票数的选手将被授予奖牌。
由于集体裁判意见中“最佳和最公平”定义的主观性,预测布朗洛奖牌获得者具有挑战性,这可能会受到公众舆论的影响。此外,一些球员更有可能在视野之内——中场球员在历史上赢得了绝大部分的选票。
此分析的目的是了解有助于布朗洛投票的玩家行为的关键可量化预测因素,并建立一个合理的预测模型,为整个赛季的下注策略奠定基础。
基线模型概述
基线模型的目标是勾勒出一个框架,从这个框架中可以改进模型的未来迭代。
性能测量我们将基线模型的性能评估测量定义为实际投票与预测投票的均方根误差(RMSE );这种方法根据与实际观测的距离非线性地惩罚预测。
数据数据集包括来自菲茨罗伊数据包的 2012-2021 赛季约 85,000 行球员比赛统计数据。2021 赛季的数据已经被预留出来作为预测的测试数据集。
预处理数据经历如下所述的一些转换。
- 玩家投票是基于每场比赛分配的——这需要对每场比赛的玩家统计数据进行标准化——因此可以根据天气、场地等因素的预期变化进行调整。这一过程也自然地为缩短了游戏时间的 2020 赛季进行了调整。
- 我们最初还以 4:1 的比例平衡职业,以确保训练数据不会过度偏向没有获得投票的玩家。
学习算法底层学习算法是一个基于树的分类框架(xgboost ),它在玩家匹配的基础上为投票计数生成概率和预期类别。该模型仅使用数字变量,并经过交叉验证。
每场比赛只能分配三张选票,这使得这成为一个分类问题,我们需要用概率来理解预测,并能够辨别 2 票对 3 票游戏之间的质量差异。
该模型是堆叠的,它依次计算 0-3 票的条件概率,而不是一个多类分类问题。为简单起见,我们将各个模型标记为概率 B1、概率 B2、概率 B3,以分别表示获得至少 1、2 和 3 票的概率。
这允许我们使用迁移学习——先前迭代的结果成为后续模型的输入。
模型结果:可变重要性
可变重要性允许我们识别和解决可能降低模型预测质量的问题。有 50 多个可能的预测变量。
为了建立一个不会过度处理问题的稳健模型,我们希望在最终模型增加复杂性之前,先减少预测因子的数量。
prob_B1 模型的可变重要性(图片由作者提供)
上面的图表让我们第一次很好地了解了在 prob_B1 模型中,当玩家至少获得一票时,哪些变量的贡献最大。最初的想法-
- 前 4 个变量是其他统计数据的线性组合,特别是梦之队积分和排名积分是常用的衡量球员表现的综合统计数据。
- 处置比全部财产稍微重要一些;对投篮得分的贡献。
- “有效”变量与原始总数非常相似,但是在变量重要性方面排名较低,这意味着裁判员在场上没有完全量化处理的质量。
因此,在模型的下一次迭代中,我们将从数据集中删除线性组合以及高度相关的变量。
最后一个条件模型(prob_B3)的变量重要性图表显示,先前模型的条件概率在对最终预测的贡献方面排名很高。
概率 B3 模型的可变重要性(图片由作者提供)
整体精度
输出是一系列条件概率,其中整个数据集的分类精度在 2–5%的数量级。2020 年第一场比赛(RI v CA)的选定球员的原始条件概率如下。
2020 年第一轮选定球员的条件概率结果(里士满对卡尔顿)
- 初始模型结果是匹配不可知的,因此它们不认为给定匹配内的概率之和对于概率 B1、概率 B2、概率 B3 模型中的每一个应该分别等于 1、2、3;因此,我们需要在匹配的基础上使结果正常化。
- 此外,我们还想对结果进行归一化处理,使单个玩家级别上的概率总和等于 1。
归一化过程的结果如下所示(注意,由于四舍五入,一些总概率不完全是 1)。
2020 年第一轮(里士满对卡尔顿)选定球员的标准化概率
在纯概率基础上目测结果,我们看到该模型正确地建议了 Dion Prestia (3 票)的结果,但与 Dustin Martin、Jack Martin 和 Patrick Cripps 的 1 票和 2 票类别混淆了。
根据标准化的概率,我们将它们转换成预测的投票数。考虑了两种方法,一种是原始值,另一种是原始值的排序。在这两种情况下,我们确保每场比赛分配的总票数必须始终加起来正好是 6。
概率到投票的转换(加权和类别)
同样,Jack Martin 没有获得任何投票,而 Dustin Martin 在我们的模型中获得了 1 票(实际上是 2 票),我们保留这个离群值的示例,作为在基线模型的后续迭代中进行改进的机会。
ESPN 的一篇文章描述了另一种分配投票的方法,该文章提出,3、2.5、1.5 或 0.5 的投票分配方法会导致更低的误差幅度。我们将在未来的研究中调查这种配置。
赛季末的准确性
我们承认可能存在总体不准确,但这项工作的目标是在(1)季末水平和(2)逐轮汇总水平达到合理的准确性。
每种预测方法的准确性通过实际投票与按季节预测的投票以及整个训练集的均方根绝对误差(RMSE)来衡量。
不同季节的模型精确度
虽然分级分类法似乎比原始值法更好,但平均法更胜一筹。下图显示了 2020 赛季前 15 名竞争者的最终预测结果。
2020 赛季实际投票和预测投票(图片由作者提供)
在上面的图表中,有几件事很突出—
- 目测显示,pred-votes 方法通常会低估投票数,而 pred-class 方法则更加平衡。总的来说,平均模型在获得正确的最终预测顺序方面做得很好。
- 2020 年,拉奇·尼尔、扎克·梅里特和泰勒·亚当斯是一个典型的异类。
逐轮汇总的精确度
下面的图表让我们可以更详细地分析每一轮比赛,并随着赛季的进行,对预期的误差有一些信心。对前 8 名竞争者的结果进行了更详细的分析。
2020 赛季绩效指标(图片由作者提供)
从表面上看,随着赛季的发展,基线模型通常可以在样本中产生合理的预测,误差在 1-2 票以内。
出样模型精度
2021 年的数据是样本外的,因此预计预测不如 2020 年准确,因为 2020 年在训练集中。在训练集中,最后一轮的 RMSE 是 0.9,而在样本外的 2021 数据中,RMSE 是 3.3。
2021 赛季实际和预测投票(图片由作者提供)
- 2021 年值得注意的异常值是马库斯·邦滕佩里、达西·帕里什和萨姆·沃尔什,他们的结果都被模型低估了。
- 托克·米勒是一个因为赛季中的停赛而没有资格获得布朗洛的球员的例子——如果他在随后的比赛中被裁判无意地否决,那么调查他将会很有趣。
2021 赛季前 8 名布朗洛奖牌获得者的道路(作者图片)
对此可能的解释是我们最初的模型中没有考虑到的因素-
- “可见性”因素,可见性可以通过身体特征来定义——纹身、发色、身高——这使得球员更容易被注意到或记住(被裁判)。
- 影响因子,一些球员对比赛结果的影响可能比原始统计数据(如处置)实际显示的影响更大。
- “浮华”的因素,一些球员在包的外面走得更快,或者在包的里面更有统治力。
- 媒体对裁判判罚的影响;有些球员比其他人更“受人喜爱”。
现在,评估模型质量的框架已经到位,我们现在可以在迄今所学的基础上进一步改进预测模型。
反思和后续步骤
我们可以通过将基线模型输出与 2021 年样本数据中的几个公共模型进行比较,对我们的结果质量进行基准测试——仍然需要砍伐,但肯定不是最不准确的!
专家同行的 2021 赛季基准模型-球员投票和最终排名
练习的下一阶段基于布朗洛预测器的结果构建成一种形式,该形式可用作逐轮投注策略的基础,从中我们可以监控 2022 赛季的实况结果。然后,我们将回到我们的关键学习,以提高预测模型的准确性。
参考文献
- 维基百科—布朗洛奖章(链接)
- ESPN 的布朗洛奖章获得者,每一票都投给 2021 ( 链接)
- AFL.com.au:布朗洛的内幕:每个俱乐部的最爱,一票奇迹,前三名(链接)
- AFL.com.au:禁赛:34 名球员没有资格参加布朗洛(链接)
- Foxsports.com.au:布朗洛奖牌预览:统计数据证明谁将赢得近年来最接近的比赛和价值选择(链接)
- 先驱太阳报:冠军数据布朗洛追踪者:前 20 名选手揭晓(链接)
- Betfair.com.au:2021 年布朗洛奖牌预测(链接)
- 菲茨罗伊简介(链接)
基于浏览器的数据库客户端
原文:https://towardsdatascience.com/browser-based-database-clients-5ff927c4cb5d?source=collection_archive---------19-----------------------
照片由 Fotis Fotopoulos 在 Unsplash 上拍摄
数据工程
远离基于桌面的数据库客户端
背景
从十多年前的大学时代,当我的数据库实验室讲师给了我一张 Oracle 11g 数据库的 CD,让我安装在系统上,到今天,当我可以用一个简单的 CLI 命令启动一个数据库实例,我们已经取得了很大的进步。随着数据库从内部迁移到云,数据库客户端也从桌面或 Mac 应用程序迁移到浏览器。这种转变不明显地与使用 Docker 等易于使用的虚拟化工具向平台独立性的转变完全一致。
随着数据工作成为后衰退十年科技繁荣的核心,数据库和数据仓库工具也经历了巨大的创新,导致了工程师现在日常使用的工具。这直接导致了 SaaS 上市的全面繁荣。虽然有点晚,但这种影响也影响到了数据库客户机,导致了基于浏览器的 SQL 客户机的上升趋势。本文将讨论一些流行的基于浏览器的数据库客户机,以及为什么它们在未来几年会越来越流行。
云服务集成客户端
基于云的数据库和数据仓库服务,比如 Amazon RDS、Azure Synapse、Google BigQuery、Snowflake 等等,提供了一个基于浏览器的客户端,可以用来与数据库进行交互。除了 Snowflake 之外,大多数集成的 SQL 客户端功能不够丰富,也不够成熟。例如,语法突出显示、命名实施、数据管理工具等。,受限于这些集成客户端。
由于这些集成客户机的有限特性所带来的不便,工程师们经常转向使用成熟的数据库客户机应用程序作为他们的 IDE。
T5 桌面客户端
毫无疑问,DataGrip、MySQL Workbench、dBeaver、Oracle SQL Developer 等应用程序提供的功能比基于浏览器的客户端提供的功能更重要,但大多数高级功能(如逆向工程、备份和恢复等。)对数据库开发人员和数据仓库工程师更有用,而不是对数据分析师、ML 工程师、数据科学家和其他业务用户。
基于浏览器的客户端
为了使工程师和业务用户的生活更加轻松,使用一个更全面、功能更丰富、基于浏览器的工具来实现一致的开发体验以及更好的 SQL 查询共享和协作功能更有意义。基于浏览器的数据库客户端经常会创新并演变成成熟的 BI 工具。许多基于浏览器的数据库客户端如 JackDB 是专有的 SaaS 工具,而其他如 Superset 是 OSS 项目,每个人都可以免费使用。
探索和可视化工具或数据库客户端的选择取决于目的。业务用户需要从数据库和仓库中获取数据,以探索和总结数据;他们还经常需要想象和讲述一个故事。根据需求,有几种不同类别的基于浏览器的数据库客户机。现在让我们简单看一下这些类别。
笔记本风格的数据库客户端
分析师和企业用户喜欢笔记本电脑。受 Jupyter 和 Zeppelin 的 Spark、Python 和 R 代码笔记本的启发,SQL 的神奇语法也在几年前随着 CloudySQL 和 iPython-sql 引入。像 Count.co这样的产品已经开发了一个完全成熟的笔记本电脑,专门为 SQL 开发,并将其提升到一个新的水平。几个月前我试用了这款笔记本。界面看起来是这样的:
图片作者。请不要被触发,因为我没有使用大写的 SQL 关键字。谢谢大家!
正如您所看到的,它非常类似于 Jupyter 笔记本,只是它在视觉上更具吸引力,并且像普通的数据库客户端一样支持数据库连接。它还支持分叉和版本控制,如上所示。
像 Count.co 一样,市场上也有其他笔记本。选择通常取决于您使用的技术。例如,Databricks 的 SQL 笔记本集成了 charing 库。类似地,您可以在 Azure Data Studio 中使用 SQL 内核。让我留给你一个不太受欢迎的 SQL 笔记本,由 HVF 实验室制造。
图片作者。摘自这个开源项目 (MIT 许可)。
https://datasciencenotebook.org/
像 Count、Databricks 和 Franchise 这样的笔记本可以有一些集成的图表和可视化库。但是,它们对于构建报告和仪表板并不理想。这就是我们进入一个完全独立的领域。在您继续之前,请查看上面的链接。这是对当今市场上从 Jupyter 到 Deepnote 的所有数据科学笔记本的一个很好的总结。
具有 BI 功能的数据库客户端
大多数人不会把我将要谈到的三个工具看作数据库客户机。 Redash 、数据库和超集。相反,他们将这些工具称为 BI 工具。虽然这些工具很少用于企业级 BI 报告和仪表板,但我认为将它们视为全面的 BI 工具是公平的,因为它们确实拥有 BI 工具中需要的所有东西。只是随着大量的钱流入到像 Tableau 或 Looker 这样的东西中,OSS 社区的进步并没有那么快。
https://stackshare.io/stackups/metabase-vs-redash-vs-superset
在过去的五年中,我广泛地使用了这三个工具,主要用于数据探索、查询编写和报告调度(读取 CSV 转储调度)。我目前正在为一个项目使用超集,我喜欢它。访问这个链接,你会对这些工具的可视化能力有一个很好的了解。
其他数据库客户端
其他一些数据库客户机既不属于笔记本类,也不属于 BI 工具类,这意味着它们更适合 SQL 开发,而不是数据探索和可视化。 SQLPad 、 PopSQL 、 JackDB 都是比较流行的。有时,当您的唯一目标是编写 SQL 查询并以表格格式、线形图或条形图查看结果时,您不需要一整套不必要的功能。
我需要单独提一下修图。这是另一个怪物。它不仅仅是一个数据库客户端,不仅仅是一个笔记本。这个要复杂得多,是为开发人员设计的,而不是数据科学家和分析师。不过,开发人员可以使用 Retool 来满足数据科学家和分析师的需求。
虽然 VSCode 是一个桌面应用程序,但我需要为它提供支持数据库客户端扩展的强大支持,不管它们可能多么基础。VSCode 很棒,因为您无论如何都会将它用于其他目的。如果它带有数据库客户端扩展。太好了。
结论
基于浏览器的数据库客户端、笔记本电脑和 BI 工具是未来的趋势。留意像 Superset 这样令人惊奇的 OSS 项目。您可能会在下一个数据作业中使用一个或多个这样的工具。
我很快会写我最常读的作品之一的续集,其中我将涵盖数据工程师、数据科学家和数据分析师的基本堆栈。如果你觉得我的文章有用,请订阅并查看我的文章🌲Linktree。你也可以考虑用我的推荐链接购买一个中级会员来支持我。干杯!
https://kovidrathee.medium.com/membership
BSTS 和因果影响:通过网页浏览量分析戴尔 XPS 笔记本电脑的受欢迎程度
原文:https://towardsdatascience.com/bsts-and-causalimpact-analysing-dell-xps-laptop-popularity-by-web-page-views-30015c2456f?source=collection_archive---------26-----------------------
新冠肺炎消费者对 Dell XPS 笔记本电脑的兴趣如何?
来源:图片由Clker-Free-Vector-Images/29580 Images来自 Pixabay
免责声明:本文是在“原样”的基础上编写的,没有担保。它旨在提供数据科学概念的概述,不应被解释为专业建议。本文中的发现和解释仅是作者的,不支持或隶属于本文中提到的任何第三方。这篇文章不是为了推销任何特定的公司或产品。
背景
2020 年 2 月, Forrester 预测,由于新冠肺炎,对包括计算机和通信设备在内的硬件的需求将非常疲软,因为在经济活动疲软期间,消费者往往会推迟对硬件的资本投资,而软件和云服务将继续蓬勃发展。
其中一个原因是,与软件和云服务相比,硬件通常需要更多的前期投资。因此,经济活动疲软的时期会诱使消费者和企业推迟购买硬件,直到经济状况再次好转。
确定消费者对特定产品范围的兴趣的一种方法是通过分析网页浏览量,例如,某个特定的硬件或软件产品在规定的时间内有多少网页浏览量?
业务场景
戴尔 XPS 是一个面向高端市场的高品质笔记本电脑品牌。笔记本电脑在数据科学家中也很受欢迎(我自己就用一台)。
现在,让我们考虑一下这个场景。假设戴尔希望确定消费者对 XPS 笔记本电脑的兴趣是否因疫情的经济影响而降低。
在这种情况下,我们如何衡量消费者的兴趣?除了查看销售数字,一种可能是查看搜索术语“Dell XPS”的网页浏览量。
事实上,这甚至可能是更可取的,因为人们应该考虑到消费者推迟支出但仍在考虑最终购买该品牌笔记本电脑的可能性,这将反映在页面浏览量保持在与以前类似的水平上。
虽然很容易简单地观察 2020 年 3 月前后网页浏览量的变化,但这并不一定能说明全部情况。
例如,如果没有发生疫情,我们无法确切知道页面浏览量会是什么样子。
在这方面,以下分析将利用以下方法:
- 使用 BSTS (贝叶斯结构时间序列建模)包从 R 到样本从后验分布
- 使用因果影响来尝试计算如果新冠肺炎事件没有发生,网页浏览水平会是什么样
网页浏览量数据来自 pageviews.toolforge.org,它允许对整个维基媒体基金会的特定搜索词的网页浏览量进行分析。
具体来说,从 2015 年 7 月到 2021 年 3 月,检查了搜索词“戴尔 XPS”的页面浏览量。当使用 CausalImpact 软件包建模时,还会在同一时间段内分析搜索词“VMware Workstation”的页面浏览量,并将其用作控制序列— VMware Workstation 是一种虚拟机管理程序,允许在一台 Windows 或 Linux PC 上设置多个操作系统。
假设软件产品受疫情经济衰退的影响较小,如果经济因素没有显著变化,消费者对戴尔 XPS 和 VMware Workstation 的兴趣比较可能会更好地概括消费者对戴尔 XPS 产品的兴趣水平。
BSTS
以下是指定时间段内“戴尔 XPS”页面浏览量的图示:
来源:RStudio 输出
我们可以看到,在第 1700 天之后——这大约是新冠肺炎疫情在 2020 年 3 月开始站稳脚跟的时候——我们可以看到页面浏览量呈下降趋势。然而,还不清楚这是最近事件的直接结果,还是随机波动的结果。
使用 BSTS 的目的是基于来自后验分布的 MCMC(马尔可夫链蒙特卡罗)采样来量化潜在页面浏览量水平的范围。与其直截了当地预测页面浏览量接下来会如何,我们可以根据后验分布观察到的潜在范围是什么?
页面视图数据以 CSV 格式加载到 R 中。为了让 BSTS 正确解释数据,数据帧随后被转换为 xts 格式:
mydata<-read.csv("dellxps.csv")library("xts") mydata$my_dates <- as.Date(mydata$Date) mydata <- xts(mydata$Dell.XPS, mydata$my_dates)
现在,BSTS 模型被具体化了。在这种情况下,考虑到网页浏览数据固有的易失性,在这种情况下,只有localineartrend将被建模。
执行 1000 次迭代,并绘制模型组件。
library(bsts) ss <- AddLocalLinearTrend(list(), mydata)model <- bsts(mydata, state.specification = ss, niter = 1000)plot(model) plot(model, "components")
这是趋势和生成的分布,后者显示了在特定时间点可能观察到的潜在结果的范围:
趋势
来源:RStudio 输出
分配
来源:RStudio 输出
现在,让我们进行一些预测。对未来 15 个时间段进行预测,目的是生成一系列在此时间段内可以观察到的潜在页面浏览量。
pred <- predict(model, horizon = 15, burn = 100) pred plot(pred)
来源:RStudio 输出
从上面可以明显看出,BSTS 预测了在选定时期内网页浏览量的一系列结果。提供了平均值、中间值和区间预测。在这个范围的最极端,BSTS 模型预测页面浏览量可能低至 144 或高达 690。
> pred$mean [1] 418.5689 420.4969 419.4255 418.6695 415.5628 [6] 413.9601 413.5601 414.8989 415.8069 416.0139 [11] 415.7935 413.9589 408.6109 410.5100 411.8946$median [1] 417.8570 417.9747 419.1763 418.3281 417.6503 [6] 414.5861 418.8882 415.3306 417.3510 413.3739 [11] 417.3411 407.7334 411.0777 411.6520 411.1981$interval [,1] [,2] [,3] [,4] [,5] 2.5% 288.8354 285.9850 275.0117 254.0120 248.9270 97.5% 542.8098 565.5993 567.6804 591.9176 580.5002 [,6] [,7] [,8] [,9] [,10] 2.5% 221.8867 208.5441 210.8201 198.3210 195.1280 97.5% 596.5839 608.9127 613.7725 615.1689 640.2005 [,11] [,12] [,13] [,14] [,15] 2.5% 182.5640 174.2203 141.7563 143.3177 144.2848 97.5% 648.4422 650.0539 642.7709 694.1793 690.8501
在整个时间序列中观察到的每天 471 次页面浏览的总体平均值,预测平均值明显低于平均值。然而,由于页面浏览量中存在大量“峰值”,平均值出现了明显的偏差。如果没有这些异常值,平均水平可能更接近于 BSTS 计算的水平。
因果影响
如前所述,时间序列分析的一个缺点是,在没有干预的情况下,不可能分析时间序列的变动。
换句话说,假设新冠肺炎的经济衰退导致硬件更换周期延长,那么如果新冠肺炎事件没有发生,消费者对戴尔 XPS 系列的兴趣会有多大是不可能的。
我们最接近这样做的方法是通过分析时间序列和没有受到干预影响的控制序列。同样,假设软件的更换周期不会受到最近事件的影响,VMware Workstation 的网页浏览量用作控制系列。
为了消除异常,两个系列都用对数格式表示。
因果影响用于分析前期和后期,如下所示:
pre.period <- c(1, 1705) post.period <- c(1706, 2101)impact <- CausalImpact(data, pre.period, post.period) plot(impact)summary(impact) summary(impact, "report")impact$summary
以下是后验推断结果:
> summary(impact) Posterior inference {CausalImpact}Average Actual 6.3 Prediction (s.d.) 6.1 (0.45) 95% CI [5.2, 6.9] Absolute effect (s.d.) 0.19 (0.45) 95% CI [-0.63, 1.1] Relative effect (s.d.) 3.1% (7.4%) 95% CI [-10%, 17%] Cumulative Actual 2495.5 Prediction (s.d.) 2421.4 (178.46) 95% CI [2078.2, 2745.2] Absolute effect (s.d.) 74.13 (178.46) 95% CI [-249.67, 417.3] Relative effect (s.d.) 3.1% (7.4%) 95% CI [-10%, 17%]Posterior tail-area probability p: 0.34393 Posterior prob. of a causal effect: 66%For more details, type: summary(impact, "report")
在这种情况下,与预测的 6.1 相比,戴尔 XPS 的实际网页浏览量在 6.3 时实际高于预期(均以对数格式表示)。因果效应的后验概率为 66%。
让我们阅读由 CausalImpact 生成的扩展摘要。
> summary(impact, "report") Analysis report {CausalImpact}During the post-intervention period, the response variable had an average value of approx. 6.30\. In the absence of an intervention, we would have expected an average response of 6.11\. The 95% interval of this counterfactual prediction is [5.25, 6.93]. Subtracting this prediction from the observed response yields an estimate of the causal effect the intervention had on the response variable. This effect is 0.19 with a 95% interval of [-0.63, 1.05]. For a discussion of the significance of this effect, see below.Summing up the individual data points during the post-intervention period (which can only sometimes be meaningfully interpreted), the response variable had an overall value of 2.50K. Had the intervention not taken place, we would have expected a sum of 2.42K. The 95% interval of this prediction is [2.08K, 2.75K].The above results are given in terms of absolute numbers. In relative terms, the response variable showed an increase of +3%. The 95% interval of this percentage is [-10%, +17%].This means that, although the intervention appears to have caused a positive effect, this effect is not statistically significant when considering the entire post-intervention period as a whole. Individual days or shorter stretches within the intervention period may of course still have had a significant effect, as indicated whenever the lower limit of the impact time series (lower plot) was above zero. The apparent effect could be the result of random fluctuations that are unrelated to the intervention. This is often the case when the intervention period is very long and includes much of the time when the effect has already worn off. It can also be the case when the intervention period is too short to distinguish the signal from the noise. Finally, failing to find a significant effect can happen when there are not enough control variables or when these variables do not correlate well with the response variable during the learning period.The probability of obtaining this effect by chance is p = 0.344\. This means the effect may be spurious and would generally not be considered statistically significant.
最终,分析得出的平均值高于预测值,但不具有统计学意义,即可能是偶然获得的。
这也可能意味着干预期比预期的要短——即新冠肺炎对硬件市场的任何可能的经济影响都是短暂的。
最终,BSTS 和 CausalImpact 的分析未能证明过去一年对戴尔 XPS 的兴趣受到了负面影响。
限制
当然,以上分析带有局限性。首先,它只是在考虑硬件市场无数产品中的一种。对其他硬件产品的兴趣可能相对下降,但对戴尔 XPS 的兴趣仍然很强。
此外,我们无法确定消费者对某个特定软件产品(在本例中为 VMware Workstation)的兴趣是否代表了整个软件市场。如果使用 CausalImpact 来比较戴尔 XPS 与另一款软件产品的页面浏览量,结果可能会有所不同。
此外,只考虑了一个干预点。2020 年 3 月—新冠肺炎被宣布为全球疫情。可能有其他重要的干预点没有被考虑,但可能仍然是重要的,例如,那些与新产品的发布、市场的新进入者等相一致的干预点。
最后,只有一个来源的网页浏览量被用作基准。有很多方法可以衡量消费者对产品的潜在兴趣,这里没有讨论。
结论
这是贝叶斯方法如何用于分析时间序列中的干预的一个例子。具体来说,您看到了如何使用 BSTS 和因果影响:
- 分析网页浏览
- 后验分布样本
- 生成后验预测
- 使用干预分析预测时间序列
在进行分析时,我们也看到了一些与贝叶斯时间序列建模相关的局限性,以及如何谨慎解释结果。
非常感谢您的宝贵时间,非常感谢您的任何问题或反馈。你也可以在 michael-grogan.com的找到更多我的数据科学内容。
参考
- bsts 功能—r 文档
- 因果影响函数—记录
- 数据黑客:R 如何将数据帧转换为 xts &动物园时间序列
- Toolforge —浏览量分析(戴尔 XPS)
- Toolforge —浏览量分析(VMware 工作站)
气泡图
原文:https://towardsdatascience.com/bubble-charts-70ef7485c51e?source=collection_archive---------27-----------------------
plotly Express vs . plotly . graph _ objects
安德鲁·伍尔夫在 Unsplash 上的照片
数据可视化
数据可视化讲故事是人类最原始的交流形式。有可追溯到公前 44000 年的洞穴绘画,远早于公前 3000 年的文字交流。
根据进化论,我们是视觉物种:我们进化的方式使得大量的精神资源被用于视觉感知和知识获取。比起文字,我们更注重视觉素。
我们的大脑是一个带宽非常宽的并行图像处理器。一些数据证实了上面的说法:传输到我们大脑的信息 90%是视觉的;视觉信息传递到大脑的速度比同样的信息以文本形式传递要快 6 万倍;65%的学生是视觉学习者。
数据可视化是一种交流工具。这是讲述我们数据中的故事并将其传达给适当受众的最有力方式。但在一个充满屏幕和视觉素的世界里,我们必须防止观众出现视觉疲劳的症状。
所以我们的图表和数字应该:视觉上有趣;展示一个清晰的故事;有可以利用的信息;有一个信息丰富的标题,清晰标注的轴,适当的图例,最好是没有不必要素的二维图表。
当信息的本质是显示三个或更多数字变量之间的联系或相关性时,一个好的图表应该帮助我们找到模式,确定相关性的存在或不存在,识别异常值,并显示集群和缺口的存在。气泡图非常适合这种用途。
气泡图
气泡图用于确定至少三个数值变量 是否相关或共享某种模式。在笛卡尔坐标系中,为一对数值变量( A,B )的每次观察绘制一个气泡或圆盘,圆盘根据变量 A 的值水平放置,根据变量 B 垂直放置。第三个数值变量©通过气泡的区域表示。你甚至可以在不同的泡泡中使用不同的颜色加入第四个变量( D :数字或分类)。
通过这些数据点产生的形状以及气泡或圆盘相对大小的差异,讲述了三个或四个变量之间的关系,而不是它们的确切值。
在特殊情况下,它们可以用来显示一段时间内的趋势或比较分类变量。它们被认为是散点图的自然延伸,其中的点被气泡或圆盘所取代。
带有 Plotly Express 的气泡图
Plotly Express (PE)是 Plotly.py 的高级包装器,与 Plotly 生态系统的其余部分完全兼容,简单、强大,有点类似 Seaborn。它是免费的,可以用于商业应用和产品。该库包括绘制趋势线和地图的函数,以及执行刻面和动画的函数。有了 PE,你可以在线制作交互式图形,也可以离线保存。
我们使用了从 Kaggle 1下载的数据集。它属于 80 种谷类产品的营养数据。这些数据是由康奈尔大学的学生于 20 世纪 90 年代早期在当地的威格曼斯超市收集的。我们想知道《消费者报告》的评级和一些特定的营养数据(糖、钠、维生素)之间是否有关联。
首先,我们导入 Plotly Express 为 *px,*熊猫库为 pd ,并将我们的 csv 文件转换成数据帧:
import pandas as pd import plotly.express as pxdf = pd.read_csv(path + 'cereals.csv', index_col = False, header = 0, sep = ';', engine='python')
下面的屏幕截图显示了数据集的前十条记录:
实际的数据探索表明,我们只需使用*df.dropna(inplace = True)*
消除一些具有 N/A 值的行,数据集就可以绘制图形了。
对于本文中的气泡图,Plotly Express 函数为 *px.scatter*
,对应的参数为:*data_frame*
; x=
代表一个数值变量的数据帧中的列名;*y=*
表示另一个数值变量的数据帧中的列名;*size=*
通过气泡的区域表示第三个数值变量的数据帧中的列名。
df.dropna(inplace = True)fig0 = px.scatter(df, x = 'sugars', y = 'rating',size = 'vitamins')fig0.write_image(path + "figbubble0.png")fig0.show()
图 0:气泡图。作者用 Plotly Express 制作的图表。
毫无疑问,这不是一个有用的讲故事的合适图表。
我们认为 0 糖和 93 等级的泡沫是异常值。我们没有删除该点,而是在范围[0–80]内建立了 y 轴。此外,我们使用*px.scatter*.
中的 *color*
参数合并了第四个数值变量
我们用 *update.layout*
更新了图表:设置标题、字体大小、 模板、以及带有宽度和高度的图形尺寸。然后我们更新了 x 轴和 y 轴(文本、字体、tickfont)。我们将图表保存为静态的 png 文件,最后,我们绘制了图表。
fig1 = px.scatter(df, x = 'sugars', y = 'rating', size = 'vitamins', color = 'sodium')fig1.update_layout( title = "Cereals Consumer Reports Ratings ", "title_font_size = 40, template = 'seaborn', width = 1600, height = 1400)fig1.update_xaxes( title_text = 'Sugar', title_font=dict(size=30, family='Verdana', color='purple'), tickfont=dict(family='Calibri', color='black', size=25))fig1.update_yaxes( title_text = "Rating", range = (0,80), title_font=dict(size=30, family='Verdana', color='orange'), tickfont=dict(family='Calibri', color='black', size=25)fig1.write_image(path + "figbubble1.png") fig1.show()
图 1:一个合适的气泡图。作者用 Plotly Express 制作的图表。
图 1 清楚地显示了消费者评价和谷物含糖量之间的负相关关系。右侧的彩色垂直刻度表示钠的量(color = ‘sodium’
)。由于图表上的彩色气泡分布均匀,我们可以得出结论,钠的含量不会显著影响消费者的鉴赏能力。最后,气泡的大小与谷物中维生素的数量有关。该图显示了评级和维生素之间的零关系。
气泡图与 Plotly.graph_objects
*plotly.graph_objects*
模块包含了 Python 类的层次结构。*Figure*
是初级类。*Figure*
具有数据属性和布局属性。数据属性有 40 多个对象,每个对象引用一个特定类型的图表( trace )及其相应的参数。布局属性指定图形的整体属性(轴、标题、形状、图例等。).
使用 plotly.graph_objects 的概念是使用 .*add_trace(go.Scatter())*
创建图形,然后添加.update_layout(), .update_xaxes, .update_yaxes
等方法来操作图形。最后,我们用.write_image()
导出图形,并用.show().
渲染
注意,我们键入了带有颜色、色彩空间、不透明度、大小和其他大小参数的mode = ‘markers’
和字典。特别是,*sizeref*
属性允许缩放气泡的大小,而*colorscale*
允许显示特定的调色板。图例的文本由*name*
属性表示。
import plotly.graph_objects as go fig2 = go.Figure()sizeref = 2.*max(df['sodium'])/(1502)fig2.add_trace(go.Scatter( x = df['sugars'], y = df['rating'], mode = 'markers', name = 'Size = vitamins * Color = sodium', marker = dict(color = df['sodium'], colorscale = 'portland', opacity = 0.8,size = df['vitamins'], sizemode = 'area', sizeref= sizeref, sizemin= 4, showscale = True )))fig2.update_layout(title = "Cereals Consumer Reports Ratings ", title_font_size = 40, template = 'seaborn', width = 1600, height = 1400)fig2.update_layout(legend=dict( yanchor="top", y=0.99, xanchor="left",x=0.01), legend_font_size= 20, showlegend = True)fig2.update_xaxes(title_text = 'Sugar', title_font=dict(size=30, family='Verdana', color='purple'), tickfont=dict(family='Calibri', color='black', size=25))fig2.update_yaxes(title_text = "Rating", range = (0,80), title_font=dict(size=30, family='Verdana', color='orange'), tickfont=dict(family='Calibri', color='black', size=25))fig2.write_image(path + "figbubble2.png") fig2.show()
图 2:带有 Plotly.graph_objects 的气泡图。作者使用与上图相同的数据集制作的图表。
总结一下:
当我们想要显示三个或四个变量之间的关系而不是它们的确切值时,气泡图是合适的。Plotly Express 和 Plotly.graph_objects 允许您使用少量且一致的代码行创建高质量的静态图像。
但是您必须注意以下警告:
- 请记住,气泡的面积与其半径不成正比,而是与其平方成正比;
- 与散点图不同,气泡图不会随着数据点数量的增加而改善;
- 它们不应用于表示零或负值,因为没有负或零区域;
- 要用气泡图显示一段时间内的趋势,你必须把时间变量放在横轴上。
如果你对这篇文章感兴趣,请阅读我以前的(https://medium.com/@dar.wtz):
带 Plotly Express、跟踪和布局的面积图
带有 Plotly Express、主题和模板的直方图
参考文献
[2]:https://www . ka ggle . com/Crawford/80-麦片/discussion/
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://sigusoft.com/datagrip/3209.html