停止浪费你的时间,咨询一个主题专家
在从事数据科学项目时,请一位主题专家来审查您的工作可能会有所帮助。
当您开始为您的公司从事数据科学项目时,您可能会发现一个需要关注的问题,接收数据,清理数据,计算一些统计数据,并构建一个模型。但是,如果您不完全理解您正在使用的数据,您如何知道您是否在为公司提供有价值的见解呢?帮助理解数据并验证您的分析是主题专家(SME)发挥作用的地方。
什么是中小企业,谁是中小企业?
何时何地利用中小企业?
当您开始从事数据科学项目时,借助 SME 来更好地理解您正在分析的数据以及如何最好地看待问题可能会有所帮助。如前所述,如果一般知识不足以用数据集得出分析结论,那么就停止。为了给公司提供价值以及后续的行动项目,你需要退后一步考虑,这是一个我需要向 SME 寻求帮助的项目吗?
例如,如果您正在查看与公司特定领域相关的数据,如人力资源(HR),但您没有过去的人力资源经验,那么与拥有这些数据的中小型企业人力资源专业人员交谈可能会有所帮助。此人将能够更好地解释您正在查看的信息,理解您在尝试创建模型时可能需要考虑的领域,并能够通读和验证您的结果是否有意义。
这句话的最后一个方面是我认为最重要的。SME 可以通读您的分析和模型结果,并验证您的结果是否有意义。让别人看一下你的分析会对你接下来的步骤有所帮助。SME 可以根据他们对数据的理解,判断您的工作是否在正确的轨道上,或者您的分析是否没有意义。
考虑为计算机收集数据,然后分析这些数据。如果你的模型显示你的电脑屏幕不亮的原因是你的键盘上的 L 键坏了,这个输出对你来说有意义吗?大概不会。但是,如果你看着数据,它似乎是合理的,但你不确定,因为你没有系统作为一个整体的知识,会发生什么?理解你的结论是否有意义是 SME 能够有所帮助的原因。他们可以查看输出,并告诉你,不,这没有意义,因为你的键盘不能输入字母 L 不应该影响为什么你的显示器没有打开。
为什么需要中小企业?
当您从事数据科学项目并开始接触许多不同的数据类型时,问问自己,我对这些数据的理解是否足以对我的工作结果做出准确的预测或采取行动,还是没有?如果答案不是肯定的,那么你应该考虑咨询一个 SME,他可以坐下来和你一起看你的作品。与他们讨论手头的问题,你如何分析数据和你的输出。让别人检查你的工作可以为你提供有价值的反馈,让你知道你的分析是朝着正确的方向进行还是毫无意义。SME 在他们的领域有深入的知识,将帮助你根据你的数据设计有意义的结论,从而推动有价值的行动。
摘要
不是每个项目都需要你和主题专家交谈。你可能有足够的领域知识来得出结论并展示你的发现。但是如果你没有,不要为此担心。找一家你可以联系的中小企业,和你一起查看你的数据和分析。与他们讨论你的发现或问题,并询问他们的想法。这些人可以为您提供关于如何改进流程的宝贵反馈,以推动您正在寻找的有价值的行动。
你是否发现与中小企业合作有益?你如何在工作中利用它们?
如果你想了解更多,可以看看我下面的一些文章!
我放在书架上的伟大资源,我喜欢介绍给软件工程师和数据科学家。
towardsdatascience.com](/top-3-books-for-every-data-science-engineer-e1180ab041f1) [## 在数据科学中我们需要面向对象编程吗?
让我们讨论一下作为一名数据科学家转向面向对象编程的利弊。
towardsdatascience.com](/do-we-need-object-orientated-programming-in-data-science-b4a7c431644f) [## 清理数据时要问的 25 个问题
我在数据清理之前问这些问题,所以我知道开始时会遇到什么。
towardsdatascience.com](/25-questions-to-ask-as-you-clean-data-a8024537341b)
不要担心,在 30 分钟内创建您的深度学习服务器
对于所有的安装和环境
每当我开始一个新项目时,我都发现自己一次又一次地创建深度学习机器。
您从安装 Anaconda 开始,最后为 Pytorch 和 Tensorflow 创建不同的环境,因此它们不会相互干扰。在这个过程中,你不可避免地会把事情搞砸,然后从头开始。而且这种情况经常发生多次。
这不仅仅是大量浪费时间;这也是强大的(试图避免亵渎这里)令人恼火。检查所有的堆栈溢出线程。经常想知道哪里出了问题。
那么有没有更有效的方法呢?
原来是有的。 在这篇博客中,我将尝试以最小的努力在 EC2 上建立一个深度学习服务器,以便我可以专注于更重要的事情。
这个博客明确地由两部分组成:
- 设置预装深度学习库的亚马逊 EC2 机器。
- 使用 TMUX 和 SSH 隧道设置 Jupyter 笔记本。
不用担心;这并没有听起来那么难。只需按照步骤操作,然后单击下一步。
设置 Amazon EC2 机器
我假设你有一个 AWS 帐户,并且你可以访问 AWS 控制台。如果没有,你可能需要注册一个亚马逊 AWS 账户。
- 首先,我们需要转到 Services 选项卡来访问 EC2 仪表板。
2.在 EC2 仪表板上,您可以从创建实例开始。
3.亚马逊提供预装深度学习软件的社区 AMIs(亚马逊机器映像)。要访问这些 ami,你需要在社区 ami 中查找,并在搜索选项卡中搜索“Ubuntu Deep Learning”。你可以选择任何其他的 Linux 版本,但我发现 Ubuntu 对我的深度学习需求最有用。在目前的设置中,我将使用深度学习 AMI (Ubuntu 18.04)版本 27.0
4.一旦选择了 AMI,就可以选择实例类型。您可以在这里指定系统中需要的 CPU、内存和 GPU 的数量。亚马逊根据个人需求提供了很多选择。您可以使用“过滤方式”过滤器来过滤 GPU 实例。
在本教程中,我用的是 p2.xlarge 实例,它为 NVIDIA K80 GPU 提供了 2496 个并行处理核心和 12GiB 的 GPU 内存。要了解不同的实例类型,您可以在这里查看文档,在这里查看定价。
5.您可以在第 4 步中更改连接到机器的存储器。如果您没有提前添加存储,也没关系,因为您也可以在以后添加。我将存储从 90 GB 更改为 500 GB,因为大多数深度学习需求都需要适当的存储。
6.这就是全部,您可以在转到最终查看实例设置屏幕后启动实例。一旦你点击启动,你会看到这个屏幕。只需在密钥对名称中键入任意密钥名称,然后单击“下载密钥对”。您的密钥将以您提供的名称下载到您的计算机上。对我来说,它被保存为“aws_key.pem”。完成后,您可以单击“启动实例”。
保持这个密钥对的安全,因为每当您想要登录到您的实例时,都将需要这个密钥对。
7.现在,您可以单击下一页上的“查看实例”来查看您的实例。您的实例将如下所示:
8.要连接到您的实例,只需在本地机器上打开一个终端窗口,浏览到保存密钥对文件的文件夹,并修改一些权限。
chmod 400 aws_key.pem
一旦你这样做了,你将能够通过 ssh 连接到你的实例。SSH 命令将采用以下形式:
ssh -i "aws_key.pem" ubuntu@<Your PublicDNS(IPv4)>
对我来说,命令是:
ssh -i "aws_key.pem" ubuntu@ec2-54-202-223-197.us-west-2.compute.amazonaws.com
另外,请记住,一旦关闭实例,公共 DNS 可能会发生变化。
9.您已经启动并准备好了您的机器。这台机器包含不同的环境,其中有您可能需要的各种库。这台机器有 MXNet、Tensorflow 和 Pytorch 以及不同版本的 python。最棒的是,我们预装了所有这一切,因此开箱即可使用。
设置 Jupyter 笔记本
但是你仍然需要一些东西来充分使用你的机器。其中之一是朱庇特笔记本。要在您的机器上设置 Jupyter 笔记本,我建议使用 TMUX 和隧道。让我们一步一步地完成 Jupyter 笔记本的设置。
1.使用 TMUX 运行 Jupyter 笔记本
我们将首先使用 TMUX 在我们的实例上运行 Jupyter 笔记本。我们主要使用这一点,以便即使终端连接丢失,我们的笔记本仍然可以运行。
为此,您需要使用以下命令创建一个新的 TMUX 会话:
tmux new -s StreamSession
一旦你这样做了,你会看到一个新的屏幕,底部有一个绿色的边框。您可以使用常用的jupyter notebook
命令在这台机器上启动您的 Jupyter 笔记本。您将看到如下内容:
复制登录 URL 是有益的,这样当我们以后尝试登录我们的 jupyter 笔记本时,我们将能够获得令牌。对我来说,就是:
[http://localhost:8888/?token=5ccd01f60971d9fc97fd79f64a5bb4ce79f4d96823ab7872](http://localhost:8888/?token=5ccd01f60971d9fc97fd79f64a5bb4ce79f4d96823ab7872&token=5ccd01f60971d9fc97fd79f64a5bb4ce79f4d96823ab7872)
下一步是分离我们的 TMUX 会话 ,这样即使您离开 SSH shell,它也能继续在后台运行。为此,只需按 Ctrl+B,然后按 D(按 D 时不要按 Ctrl ),您将返回初始屏幕,显示您已从 TMUX 会话中分离的消息。
如果需要,您可以使用以下命令再次重新连接到会话:
tmux attach -t StreamSession
2.通过 SSH 隧道在本地浏览器上访问笔记本
第二步是隧道进入 Amazon 实例,以便能够在本地浏览器上获得 Jupyter 笔记本。正如我们所看到的,Jupyter 笔记本实际上运行在云实例的本地主机上。我们如何访问它?我们使用 SSH 隧道。别担心,填空很简单。只需在您的本地机器终端窗口上使用以下命令:
ssh -i "aws_key.pem" -L <Local Machine Port>:localhost:8888 [ubuntu@](mailto:ubuntu@ec2-34-212-131-240.us-west-2.compute.amazonaws.com)<Your PublicDNS(IPv4)>
对于这种情况,我使用了:
ssh -i "aws_key.pem" -L 8001:localhost:8888 [ubuntu@](mailto:ubuntu@ec2-34-212-131-240.us-west-2.compute.amazonaws.com)ec2-54-202-223-197.us-west-2.compute.amazonaws.com
这意味着如果我在本地机器浏览器中打开 localhost:8001,我将能够使用 Jupyter 笔记本。我当然可以。现在,我们只需输入在之前的某个步骤中保存的令牌即可访问笔记本。对我来说令牌是5 CCD 01 f 60971d 9 fc 97 FD 79 f 64 a5 bb 4 ce 79 F4 d 96823 ab 7872
您只需使用您的令牌登录,瞧,我们就能获得这款荣耀的笔记本电脑。
现在,您可以通过选择任何您想要的不同环境来选择一个新项目。你可以来自 Tensorflow 或 Pytorch,或者可能愿意同时拥有两个世界的优势。这款笔记本不会让你失望。
解决纷争
一旦机器重新启动,你可能会遇到一些 NVIDIA 显卡的问题。具体来说,在我的例子中,nvidia-smi
命令停止了工作。如果遇到这个问题,解决方法是从 NVIDIA 网站下载显卡驱动。
以上是我选择的特定 AMI 的设置。点击搜索后,您将看到下一页:
只需右键点击复制链接地址即可复制下载链接。并在您的机器上运行以下命令。您可能需要更改此中的链接地址和文件名。
# When nvidia-smi doesnt work:wget [https://www.nvidia.in/content/DriverDownload-March2009/confirmation.php?url=/tesla/410.129/NVIDIA-Linux-x86_64-410.129-diagnostic.run&lang=in&type=Tesla](https://www.nvidia.in/content/DriverDownload-March2009/confirmation.php?url=/tesla/410.129/NVIDIA-Linux-x86_64-410.129-diagnostic.run&lang=in&type=Tesla)sudo sh NVIDIA-Linux-x86_64-410.129-diagnostic.run --no-drm --disable-nouveau --dkms --silent --install-libglvndmodinfo nvidia | head -7sudo modprobe nvidia
停止您的实例
仅此而已。你已经拥有并运行深度学习机器,你可以随心所欲地使用它。请记住,无论何时停止工作,都要停止实例,这样当您不在处理实例时,就不需要向 Amazon 付费了。您可以在实例页面上右键单击您的实例来完成此操作。请注意,当您需要再次登录到这台机器时,您需要从实例页面获取公共 DNS (IPv4)地址,因为它可能已经更改。
结论
我一直觉得建立深度学习环境是一件很大的苦差事。
在这篇博客中,我们通过使用深度学习社区 AMI,TMUX 和 Jupyter 笔记本的隧道,在最短的时间内在 EC2 上建立了一个新的深度学习服务器。该服务器预装了您工作中可能需要的所有深度学习库,并且开箱即用。
你还在等什么?用自己的服务器开始深度学习就行了。
如果你想了解更多关于 AWS 以及如何在生产设置和部署模型中使用它,我想在 AWS 上调出一个优秀的课程。一定要去看看。
谢谢你的阅读。将来我也会写更多初学者友好的帖子。在媒体关注我,或者订阅我的博客来了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系到我
此外,一个小小的免责声明——这篇文章中可能会有一些相关资源的附属链接,因为分享知识从来都不是一个坏主意。
用误导的图表阻止新冠肺炎
阿根廷、俄罗斯和格鲁吉亚媒体如何在新冠肺炎期间操纵图表来推动他们的议程。
自新冠肺炎疫情爆发以来,全世界的媒体都在争相制作关于疫情的最漂亮、最翔实的图表。图表在向普通观众传达复杂的统计数据方面非常出色。图表还擅长误导人们对世界做出错误的结论。一些媒体因其在统计方面的无能而误导,而另一些媒体则故意操纵数据来描绘他们国家更好的图景。在这篇文章中,我们将看看阿根廷、俄罗斯和格鲁吉亚媒体是如何通过操纵图表来“抗击”疫情的。
阿根廷的新冠肺炎测试次数
如果你需要证明你的国家在测试人方面很棒,只需向阿根廷媒体寻求建议,他们在下图中做得很好:
阿根廷电视频道 C5N 操纵 y 轴来隐藏新冠肺炎测试的可怕数字。来源: Reddit 。原文来源: C5N
图表显示了每百万人中新冠肺炎测试的数量。对于不讲西班牙语的人来说,EEUU 是美国,Alemania 是德国,Noruega 是挪威。现在,看看那些柱状图:阿根廷测试的人数几乎和美国一样多!至少在你看数字之前看起来是这样。阿根廷每百万检测 330 人,而美国检测 7000 人。这是 20 倍多,但美国的标准只有 1.2 倍高。这张图表让阿根廷在测试人方面看起来还不错,但事实显然并非如此。电视频道任意操纵条形的大小,完全不考虑逻辑或缩放规则。这是未经处理的图形外观:
阿根廷的新冠肺炎图表做对了。作者的数据可视化。
这种可视化描绘了一幅完全不同的画面,表明阿根廷远没有美国和其他国家那样多的测试。但是谁想看到坏消息呢,对吧?
俄罗斯使曲线变平
把曲线拉平是每个国家都痴迷的事情,并不是一件容易的事情。但不是这个俄罗斯电视频道:
俄罗斯 3 月 5 日至 3 月 31 日的新冠肺炎病例数。来源: Reddit 。原文来源:今日俄罗斯
图表显示了从 3 月 5 日到 3 月 31 日新冠肺炎病例的增长情况。病例开始快速增长,但自 3 月 26 日以来,增长似乎放缓,并接近曲线的顶部。然而,正如我们从阿根廷图表中了解到的那样,外表可能具有欺骗性。
在 3 月 26 日之前,条形的高度与数字相对应。例如,您可以通过查看包含 495 个案例的 3 月 24 日棒线是包含 253 个案例的 3 月 20 日棒线的两倍来验证这一点,视觉上的增加对应于数字上的增加,其中 495 几乎是 253 的两倍。然而,从 3 月 26 日开始,条形的缩放变得与数字差异不一致。如果你看看这些数字,增长率保持不变:
- 3 月 28 日新增病例+228 例(增长 22%)
- 3 月 29 日+270(增长 21%)
- 3 月 30 日+302(增加 20%)
- 3 月 31 日+500(增长 27%)
然而,这些变化并没有用柱状图准确地描述出来。3 月 31 日病例增加 500 例并不对应于视觉上的增加,视觉上的增加显示了大约 50 例的增加。电视频道给上周的酒吧指定了任意的高度。下图应该是这样的:
新冠肺炎案例的俄罗斯图表做对了。作者的数据可视化。
在这个图表中,视觉上的差异与数字上的差异相对应,并描绘了一幅准确的画面:病例呈指数增长,这是一个不好的迹象。此外,如果你想知道,俄罗斯的图表也不是对数图。
更糟糕的是,由于这些图表是在电视上播放的,它们只显示了几秒钟,这对于任何人来说都太短了,无法详细检查图表并评估其标签、单位以及视觉元素与数值的对应关系。大多数人只会花几秒钟时间看一下柱状图,然后得出结论:情况正在好转。我们中很少有人会努力暂停电视,批判性地关注图表,一些媒体利用它来欺骗我们。
格鲁吉亚消灭了病毒
虽然对于前两张图,你仍然可以想出一些借口,如节省空间或使条形更明显,但来自佐治亚州公共卫生部的这张图没有留下原谅的余地:
图表显示了从 4 月 28 日到 5 月 9 日新增病例数量的下降。然而,看看 x 轴上的日期顺序:4 月 28 日,回到 4 月 27 日,现在是 4 月 29 日,4 月 26 日一直在 5 月 7 日和 5 月 3 日之间。人们不可能不小心把日期排列成如此奇怪的顺序。它需要手动和有意识的重新洗牌。
格鲁吉亚人很快就发现了操纵行为,并表达了他们的不满。一天后,图表被撤下,州长发言人坎迪斯·布罗斯为这个奇特的数字道歉:
提供的借口并没有使图表更有信息量,我不认为有任何方法来证明这样的错误。格鲁吉亚政府本可以利用这张图表来说服其公民支持早日重新开业。如果你想了解更多关于此案的信息,亚特兰大宪法日报有一篇很棒的文章。
结论
正如我们所见,有时媒体利用公众缺乏关注来推动他们的议程。我们对这些图表的误导性解释可能会影响我们投票、行为和决策的方式。因此,在如此多的图表中,停下来问一些关键问题是很重要的:
- 视觉效果和数字相符吗?
- y 轴和 x 轴的顺序和比例是否正确?
- 图表是夸大了某件小事的重要性,还是相反?
核对每一张图表并不总是容易的,但这是不被数据操纵所误导的必要条件。因此,让我们留意我们消费的新闻,并仔细思考我们相信的信息。
谢谢你看我的文章!如果你有任何意见、担忧或问题,我很乐意在评论中讨论!
启发我写这篇文章的书:达雷尔·赫夫的《如何用统计数据撒谎》。
你可以在 Reddit 上的 r/dataisugly 找到更多误导性和糟糕的图表。
在 CouchDB 中存储 Hyperledger 结构证书和密钥
Hyperledger Fabric 是关于权限的。这些权限以证书和密钥的形式提供。从广义上讲,它被称为身份。
当应用程序与 Hyperledger Fabric 网络交互时,它使用此身份来验证自己。结构网络验证身份并授权应用程序进行交互。
简而言之,身份是非常重要的,如果你不妥善保存,那么它可能会变成一个令人头痛的问题。😩
我可以在哪里存储身份?💼
在 Hyperledger 结构中,这种存储被称为 钱包 。
钱包有三种类型:
文件系统
这是一个简单的文件夹。本地存储钱包。对于钱包来说,这是一个不错的默认选择。在fabric-samples/balance-transfer
中,file system
是默认的钱包。当你运行balance-transfer
时,它会创建一个fabric-client-kv-orgName
文件夹并保存所有的身份。这个配置是在orgname.yaml
的链接中定义的。
内存中
应用存储中的钱包。当您的应用程序在不能访问文件系统的受限环境中运行时,请使用这种类型的 wallet 通常是网络浏览器。值得记住的是,这种类型的钱包是不稳定的;应用程序正常结束或崩溃后,身份将会丢失。— 文档
CouchDB
用 couchdb 当钱包。此选项最适合生产。
在本教程中,我们将把CouchDB
配置为钱包。👨🏻💻
为了演示,我使用了
Fabric Node SDK
和fabric/samples/balance-transfer
。
钱包使用 2 个存储来保存证书和密钥:
1.州商店:
状态存储用于存储注册身份的证书。它存储了身份的基本信息:
{
"name": "test",
"mspid": "org1",
"roles": null,
"affiliation": "",
"enrollmentSecret": "<ENROLLMENT_SECRET>",
"enrollment": {
"signingIdentity": "<PRIVATE_KEY_NAME>",
"identity": {
"certificate": "<SIGN_CERT>"
}
}
}
❗️ 注意:签名标识是存储在加密存储中的私钥和公钥的指针或地址。
2.加密存储:
加密存储用于存储身份的公钥和私钥。
要将 couchdb 配置为 wallet:
第一步
导入由Node SDK
提供的CouchDBKeyValueStore
库。
**const CDBKVS = require("fabric-client/lib/impl/CouchDBKeyValueStore.js");**
请务必阅读《T4 》,它值得一读。
第二步
设置state store
。
**let stateStore = await new CDBKVS({
url: "https://<USERNAME>:<PASSWORD>@<URL>",
name: "<DB_NAME>"
});
const Client = require("fabric-client");
const client = Client.loadFromConfig("path of network.yaml");
client.setStateStore(stateStore);**
<USERNAME>
是 couchdb 的用户名。<PASSWORD>
是 couchdb 的密码。<URL>
是 couchdb 的 URL。<DB_NAME>
(可选)是用作状态存储的数据库名。默认的 dbname 是userdb
。如果数据库不存在,它会创建它。
客户端 是用户和光纤网络之间的接口。
第三步
设置crypto store
。
**const cryptoSuite = Client.newCryptoSuite();
let cryptoKS = Client.newCryptoKeyStore(CDBKVS, {
url: "https://<USERNAME>:<PASSWORD>@<URL>",
name: "<DB_NAME>"
});
cryptoSuite.setCryptoKeyStore(cryptoKS);
client.setCryptoSuite(cryptoSuite);**
您必须根据上述步骤更新客户端,使其使用 couchdb。
在下一节中,我们将在balance-transfer
fabric 示例中实现上述步骤。
CouchDB 在平衡传递中的实现
我使用平衡转移织物样品作为参考。
我假设你知道如何进行余额转移。
启动余额转移网络
按照余额转移说明启动网络。
它将通过以下方式启动网络:
- 2 CAs
- 单独订购者
- 4 个同行(每个组织 2 个同行)
为钱包启动 couchdb
如果您使用基于云的 couchdb,这一步是可选的。
基于 Docker 的 Couchdb
**docker run --name couch-userdb -e COUCHDB_USER=admin -e COUCHDB_PASSWORD=password -p 5984:5984 -d couchdb**
如果不存在,上述命令将从 docker hub 中提取couchdb
的 docker 图像。
CouchDB 详细信息:
- 容器名称:
couch-userdb
- CouchDB 用户名:
admin
- CouchDB 密码:
password
- 网址:
localhost:5984
CouchDB 连接 URL 是
https://<USERNAME>:<PASSWORD>@<URL> [**https://admin:password@localhost:5984**](https://admin:password@localhost:5984)
在余额转移中更新客户
打开app/helper.js
,更新getClientForOrg
。
在下面的代码中,我们只是用上面的 couchdb 配置步骤替换了await client.initCredentialStores();
。
我们所做的改变,
- 第 13 行: 导入
CouchDBKeyValueStore
。从上面开始。 - 第 31–52 行: 设置状态存储和加密存储。第二步& 3。
上面的代码有一个小的变化。
**// Client variable is used as hfc
var hfc = require("fabric-client");
// Instead of Client
const Client = require("fabric-client");**
状态存储和加密存储的 db(dbname)不必相同。两家商店都可以有各自独立的数据库。这取决于要求。您可以将状态存储和加密存储 db 分别命名为
***orgName-state-store***
和***orgName-crypto-store***
。 每个组织必须有自己的状态存储和加密存储 db,否则会抛出认证错误。
**Error: fabric-ca request register failed with errors [[{"code":20,"message":"Authentication failure"}]]**
在余额转移中注册新用户
一旦注册了用户,就可以使用 couchdb apis 检查状态存储和加密存储。
例如:注册一个用户
我使用下面的参数来注册一个用户。对于org1
,我对state-store
和crypto-store
使用了相同的 db org1db
。
- 名称:
alice
- 组织:
org1
- 数据库名:
org1db
- CouchDB URL:
[**http://admin:password@localhost:5369**](http://admin:password@localhost:5369)
打开浏览器,转到**http://localhost:5369/org1db/_all_docs**
。返回保存在org1db
中的所有文档。
指标0, 1, 2
是admin
的证书。
索引3
是存储在state-store
中的alice
证书。
索引4-5
是crypto-store
中存储的alice
的公钥和私钥。
转到http://localhost:5369/org1db/alice
。它返回存储在状态存储中的alice
的所有细节。
检查signingIdentity
。
**"signingIdentity":"d37a97a8c2377c21537801ec1a929d81905ae57963a2f6c8ba0308931a7fc791"**
现在,检查上图中索引4 & 5
的 id。两者是一样的。
如果您还记得,signingIdentity
字段是存储在加密存储中的身份的私钥和公钥的引用。
结论
CouchDB wallet 是生产用例的绝佳选择。您可以尝试使用其他数据库,但是在这种情况下,您必须像CouchDBKeyValueStore.js
一样编写相应的库。
以下是我觉得有用的参考资料。如果您发现任何您认为可以添加到此处的资源,请不要羞于分享。😉
参考📌
- https://developer . IBM . com/tutorials/store-fabric-certificates-keys-IBM-cloud ant-fabric-node-SDK/
- https://stack overflow . com/questions/53639061/hyperledger-fabric-state-store 和 crypto-store 之间的区别是什么
- https://stack overflow . com/questions/54305378/hyperledger-fabric-client-credential-store-using-couch db
- https://stack overflow . com/questions/58371858/hyperledger-fabric-client-credential-store-using-couchdbcouchdbkeyvaluestore
基于 NLP 和时间序列的特朗普竞选策略分析
主题建模、聚类和时间序列预测的案例研究
美国总统选举将于 2020 年 11 月 3 日决定,对美国和世界产生巨大影响。虽然一些人认为特朗普是一位好总统,但其他人认为他是一位民粹主义者。不管一个人的政治倾向是好是坏,2020 年大选的后果可能会是惊天动地的。
尽管如此,在这篇文章中,我将向你展示特朗普集会的战略分析,作为拜登-哈里斯竞选团队事实上的数据科学家。我将尝试使用自然语言处理(NLP)对反弹进行主题建模,然后在提供策略分析之前,我将使用时间序列识别反弹中的主题趋势。首先,我从 https://factba.se/transcripts 的那里获得了川普集会的记录。
1.文本预处理
从 2017 年特朗普的第一次集会(佛罗里达州墨尔本)到 2020 年 10 月 12 日特朗普从新冠肺炎恢复后的第一次集会(佛罗里达州桑福德),我总共获得了约 100 份特朗普集会记录的数据。此后,我将数据放入 Pandas 数据框,以地点、日期和记录为列。以下是特朗普在佛罗里达州桑福德的集会摘录,我们立即看到了文本处理的必要性:
大家好。你好,奥兰多。你好,桑福德。和你在一起真好。谢谢你。回来真好。[观众唱“美国”]这是很多人。你知道我们的竞争对手,瞌睡虫乔,他今天有个集会,但几乎没人出席。我不知道这是怎么回事。昏昏欲睡的乔,但回到我的家乡佛罗里达州进行我的正式竞选活动真是太棒了。你们的祈祷让我充满活力,你们的支持让我谦卑。我们得到了难以置信的支持,现在我们在这里。你知道,我们在这里。但是我们会完成的,我们会让这个国家比以往任何时候都更伟大。[观众高呼“我们爱你”]谢谢。谢谢你。谢谢您们。
使用正则表达式,我从文字记录中删除了观众输入(在方括号中)。我还使用 NLTK 的 RegexpTokenizer 对包含 3 个或更多字母的单词进行标记,并删除带有任何标点符号的单词,然后再将它们连接到一个经过处理/分割的抄本中。
2.EDA——特朗普的 50 大词汇
有了一套“干净”的抄本,我开始着手建模。在探索性数据分析中,我使用 WordCloud 生成了特朗普在他的前两次集会和我获得的后两次集会中经常使用的前 50 个词:
前两场拉力赛:佛罗里达拉力赛,2017 年 2 月(左)和田纳西拉力赛,2017 年 3 月(右)-作者图片
对于 WordCloud 图片,单词越大意味着该单词在抄本中出现的频率越高。通过上面的可视化,我们可以看到为什么特朗普对他的支持者如此有影响力,频繁使用诸如“去”、“伟大”、“人民”和“国家”等词,激发情绪和不断呼吁采取行动。我们还看到“奥巴马医改”的出现,显示了特朗普在总统任期早期的执着。
最近的两场拉力赛:2020 年 9 月的明尼苏达拉力赛(左)和 2020 年 10 月的佛罗里达拉力赛(右)——图片由作者提供
在最近两次集会中,我们看到特朗普的用词没有太大变化。“去”、“人民”和“伟大”等词继续是热门词汇,而“拜登”和“中国”等词出现在特朗普开始在大选临近时攻击政治对手之际。
3.NLP —主题建模
谈到主题建模,我们通常使用 Scikit-Learn 的计数矢量器或 TFIDF 矢量器将转录本中的所有单词量化为特征。此后,我们通过潜在语义分析(LSA)、非负矩阵分解(NMF)或潜在狄利克雷分配(LDA)将所有特征简化为组件(特征的线性组合)。因此,可以通过过滤组件的顶部单词来识别主要主题。
经过反复试验,我认为 NMF 的 Count Vectorizer(总共 11353 个单词)是特朗普集会的最权威工具。通过仔细的分析和辨别,我从 NMF 的组成部分中找出了 3 个主题(使用了 90 个热门词汇):
- 话题一:吹捧成绩
know, said, **right**, people, like, **great**, got, think, **going**, want, **good**, **lot**, **years**, **president**, guy, time, thing, look, **won**, sir, **trump**, love, **way**, **big**, billion, remember, come, let, money, million, went, **deal**, better, tell, little, year, new, mean, guys, world, things, came, democrats, **thank**, bad, win, state, **best**, country, **beautiful**, hell, times, ago, **believe**, actually, michigan, true, took, somebody, party, crazy, obama, american, **incredible**, fake, getting, job, place, happened, day, **greatest**, man, long, china, away, saying, number, news, america, election, night, nice, wouldn, states, care, **history**, wanted, everybody, texas, maybe
- 主题 2:计划和寻求支持
**going**, great, **want**, **people**, country, **thank**, **vote**, know, **america**, **american**, **right**, like, years, president, got, democrats, way, **good**, **jobs**, time, lot, **need**, think, said, come, **new**, state, **job**, let, love, incredible, **care**, states, americans, tell, united, **believe**, history, **tax**, **borders**, look, **election**, democrat, big, working, republicans, military, **wall**, **coming**, **happen**, world, percent, **law**, republican, **border**, **taxes**, won, billion, **protect**, trump, work, things, man, governor, **happening**, thing, pay, **win**, **deal**, ice, beautiful, day, remember, party, veterans, **help**, folks, **voted**, **passed**, everybody, greatest, strong, florida, called, bad, women, illegal, hard, **unemployment**, today
- 话题 3:攻击政治对手
**going**, know, **said**, people, got, **biden**, great, like, right, want, think, years, **joe**, good, way, thank, **china**, **remember**, america, lot, country, let, thing, look, tell, **win**, guy, time, job, **big**, **world**, **left**, president, american, mean, **police**, **law**, **bad**, won, states, happen, called, things, deal, **history**, better, love, state, **hell**, ago, new, took, end, **little**, wants, half, **ballots**, happened, **vote**, open, year, everybody, come, wall, jobs, went, **crazy**, **news**, second, **terrible**, **governor**, day, **sleepy**, **bernie**, **order**, pennsylvania, peace, north, military, energy, seen, watch, saw, suburbs, gave, closed, war, **fake**, trump, saying
采用新组件作为模型的特征(而不是来自计数矢量器的量化单词),NMF 能够将主题相关性分数归因于每个集会。随后,我继续绘制各次集会的主题相关性时间序列:
集会中主题相关性的时间序列(按连续的时间顺序绘制)-作者图片
从时间序列中,我们可以看到,虽然“吹捧成就”的主题没有显示出明显的趋势,但“计划和呼吁支持”的主题似乎在接近选举时呈下降趋势。关于“攻击政治对手”的话题显示出明显的上升趋势,接近选举的平台期。因此,特朗普在竞选集会上的语气似乎有所转变——特朗普似乎对自己的计划不太乐观,正在更多地攻击他的对手。这也可以通过余弦相似性热图清楚地观察到:
2020 年 10 月 12 日以来特朗普最后 20 场集会的余弦相似性热图。(图片由作者提供)
查看热图的第一列(与 10 月 12 日的集会相比),特朗普在 2020 年 3 月 2 日集会上的语气似乎发生了突然转变。美国新冠肺炎的突然爆发会不会让川普缺乏安全感,从而促使他更多地攻击对手?
此外,我们在 2020 年 9 月 18 日的集会上观察到另一种语气的转变——根据时间序列,特朗普似乎对他的成就感到欢欣鼓舞。巧合的是,这也是最高法院大法官金斯伯格(民主党人)去世的日子。这是否也导致了特朗普语气的转变?
4.进一步 EDA:K-均值聚类
为了进一步分析特朗普集会,让我们探索一下是否可以根据其主题相关性将其分为几组。结果是,在绘制了总惯性与聚类数的关系以及剪影系数与聚类数的关系之后,我们可以:
总惯性与聚类数的关系图(左)和剪影系数与聚类数的关系图(右)-作者提供的图片
尽管我们无法在总惯性对聚类图中清楚地识别出一个弯头(弯头方法),但轮廓系数图清楚地表明,聚类的最佳数量是两个!轮廓系数通常在 1 和-1 之间评分,并量化一个点到聚类质心和远离其他聚类质心的接近程度。
接下来,我们用 Plotly 制作了一个特朗普集会的三维图,其中我们看到了两种类型的特朗普集会,他主要攻击政治对手或主要吸引选民:
特朗普集会与主题相关性的三维图。(图片由作者提供)
5.用 SARIMA 进行时间序列预测
回到我们的时间序列图,我们注意到一些有趣的事情——特朗普集会中似乎有一种主题相关性的周期性暗示。此外,关于“计划和呼吁支持”和“攻击政治对手”的主题似乎也有趋势成分。因此,时间序列是非平稳的,我们可以使用季节性自回归综合移动平均(SARIMA)模型进行预测分析。
集会上的主题相关性时间序列(按连续顺序),显示周期性。(图片由作者提供)
沿着探索的道路,我通过以 90:5:5 的比例将数据集分为训练集、验证集和测试集,进行了简单的正向验证
简单的验证模式。验证和测试集在时间上向前验证。(图片由作者提供)
使用 SARIMA 对最佳超参数进行简单的网格搜索后,我获得了以下平均绝对误差(MAE)分数:
使用最佳超参数,我将训练和验证集与 SARIMA 模型一起重新训练,然后在测试集上进行评估。我发现下面的错误分数还是很合理的:
跨集会的主题相关性时间序列及其在最近 6 次集会中的预测。(图片由作者提供)
6.模型与策略一起使用
时间序列预测模型可用于发现未来特朗普集会主题的潜在波峰和波谷。虽然拜登-哈里斯竞选团队可能有自己的一套对抗特朗普竞选团队的策略,但人们也可以参考中国古代战略手册《孙子兵法》,该手册提倡与对手反其道而行之。
“强的时候,避开他们。如果士气高昂,就让他们沮丧。似乎卑微到让他们充满自负。如果放心,就把它们耗尽。如果团结,就把他们分开。攻击他们的弱点。让他们大吃一惊。”
― 孙子
例如,拜登可以在特朗普被预测不那么咄咄逼人的时候更多地攻击他。相反,拜登可以吸引人群,并在特朗普预计会更具侵略性时谈论他的计划。因此,一个可以预测特朗普在竞选中的气质和语气的模型对拜登-哈里斯阵营非常有用。
7.结论
综上所述,我已经完成了对特朗普集会的颇有见地的探索性数据分析,也创建了对特朗普话题趋势的预测模型,作为案例研究。
这份仔细的分析是 Metis 数据科学训练营(新加坡)的项目 4,我要感谢所有人,特别是我的导师尼奥·韩伟,他迄今为止一直在指导我。这是一次令人兴奋的经历,也是一次惊人的学习之旅。谢谢大家!
这里是到我的 GitHub 的链接,它包含了这个项目的所有代码和演示幻灯片。也可以通过我的 LinkedIn 联系我或在下面评论来讨论!
支持我! —如果你没有订阅 Medium,并且喜欢我的内容,请考虑通过我的推荐链接加入 Medium 来支持我。
阅读谭·师鹏·阿尔文(以及媒体上成千上万其他作家)的每一个故事。您的会员费直接…
tanpengshi.medium.com](https://tanpengshi.medium.com/membership)
提高客户分析成熟度的战略方法
客户分析成熟度级别和不同成熟度级别公司的战略路线图
在 Unsplash 上由 Austin Distel 拍摄的照片
根据麦肯锡的一项研究,广泛利用客户分析的公司更有可能在关键绩效指标上超越竞争对手,无论是利润、销售额、销售增长还是投资回报
如今,企业已经意识到,客户分析是在当今市场中获得竞争优势的必备能力。近年来,客户数据的泛滥为企业更好地了解他们的客户并在战略决策中占据中心位置提供了一系列机会。然而, research 表示,虽然企业拥有本地化分析能力,但不到 15%的企业拥有根深蒂固的分析能力,或者认为这是他们组织内的一种差异化能力。
企业正在努力组织和构建大量的消费者数据,努力从多个接触点获取高质量的数据,并建立一种包含洞察力驱动的决策的组织文化。 Forrester 的客户分析成熟度评估为企业提供了涵盖六项关键能力的基准客户分析成熟度水平:战略、结构、数据、分析、流程和技术。根据客户分析成熟度报告,公司可以分为三个成熟度等级——初级、中级和高级。
初学者:有时使用基于汇总数据的后视镜报告分析,但不使用它来收集和分析有用的客户信息的公司属于初学者类别。这些公司没有投资专门的资源来处理消费者数据并推断出有价值的见解,而是基于假设和预感做出不科学的决策。对于这些公司来说,数据是在小仓库中获得的,并且数据提取源没有被缝合在一起以创建客户的单一视图。这些公司采用免费的分析工具或部分集成的 martech 平台来管理和组织数据。
**中级:**这些公司正处于从报告向洞察和注重行动的分析转变的过程中。这些公司将拥有专门的资源或团队(分析专家或数据科学家),他们正在学习将数据和见解转化为行动。团队努力创造一种数据驱动的文化,这种文化基于消费者的洞察和智能来支持协作决策。数据源被缝合在一起,集中于创建客户的单一视图,并且还促进了强大的归因能力。
**高级:**高级公司正在利用分析技术实时释放消费者意图信号和情感,在多个接触点提供有意义的个性化体验。这些公司采用人工智能驱动的分析和见解,专注于提供显著的投资回报率和 CX 改善。这些公司将有数据分析师和数据科学家团队与业务团队合作,共同致力于为消费者提供下一个最佳体验。团队能够处理非结构化数据,并将受众数据无缝地推送到集成的 martech 和 business tech 平台。这些公司通常采用完全集成的体验平台,包括营销云。
下面提到的是不同成熟度的公司的战略路线图。
一旦团队评估了他们当前的分析成熟度并确定了战略路线图,下一个任务就是确定实现客户分析成功的关键驱动因素。对于每一个公司来说,要将他们的成熟度等级提高到高级,团队必须努力建立实现关键业务目标所必需的能力。这些能力不仅将推动营销的改进,还将为客户服务、入职、保留和其他职能团队提供有意义的见解。
客户分析成功的战略方法
在 Unsplash 上由 Adeolu Eletu 拍摄的照片
- 能够创建客户的单一视图:
数据驱动型企业的口头禅是客户情报和可操作见解的重要性。在客户体验时代,领先的企业确保在各种不同的接触点和设备上最大限度地了解他们正在接触的客户和潜在客户。这成为满足多个跨职能团队需求的客户智能的基石。创建单一客户视图的能力使多个业务职能部门能够在正确的时间和地点做出最合适的决策,以提供增强的无缝客户体验。
客户分析必须从整体层面来看,考虑通过自有、付费和盈利媒体跟踪的消费者情绪和行为。从搜索引擎上的查询中捕获的消费者意图信号可以传递到统一的客户数据平台,该平台可以进一步推送到活动工作流,以实时触发定制的直接渠道活动。事实上,捕捉意图层面的数据甚至可以触发一线员工在各种线下接触点向消费者传达相关信息,并促成令人印象深刻的结果。
这将进一步导致消费者以特定的方式做出响应,并且数据必须再次传递回统一数据平台,以便为特定消费者的购买漏斗提供更多行为洞察。创建客户的单一视图不仅包括实时交付上下文体验,还将允许分析平台不断学习、优化各种底层流程,并向相关利益相关方推荐规范的见解。
2。能够进行预测性和规范性分析:
推动实时决策和触发沟通事件不仅是可能的,而且越来越有望成为卓越客户体验的基础组成部分。另一项能力是执行预测和说明性分析的能力,这是由客户交互的完整视图和技术的有效使用支撑的。
预测分析有助于企业根据历史消费者数据了解最有可能的未来情景及其影响。预测分析可以展示在“假设”场景中可能发生的情况,使企业能够预测任何给定流程中的哪些变化最有可能成功或失败。在营销领域利用预测分析的一个最成功的用例是线索评分。营销人员通常利用数据管理平台或客户数据平台上的潜在客户评分功能。这使得品牌能够为不同类别的潜在客户(热销售线索、温销售线索或冷销售线索)提供差异化的处理方式。
说明性分析利用人工智能和人工智能,使企业能够从消费者洞察中学习,并在整个消费者旅程中自动指定行动。说明性分析的用例可以在个性化、受众细分、内容管理等领域找到。Adobe Test and Target 使用说明性分析,根据历史用户行为向消费者推荐跨自有资产的下一个最佳体验。
3。建立归因模型的能力:
随着洞察能力系统的出现,尤其是在自动化营销领域,营销人员和分析师必须建立模型,确定如何将任何形式的转化的信用分配给转化路径中的接触点。对于企业来说,了解哪些渠道在多大程度上促成了特定的转化是至关重要的。企业可以从付费搜索或自然搜索结果中获得巨大的流量转换率。但这是否意味着以多种频率展示给消费者的展示广告活动对整体转化率没有贡献呢?
在大多数潜在客户开发或客户获取案例中,都有涉及帮助渠道的流程,如呼叫中心、触发式电子邮件、短信等,以将离开的访问者带回购买之旅。在这种情况下,营销人员考虑多渠道渠道来比较不同归因模型如何影响不同接触点的价值变得至关重要。为了比较线下和线上渠道对推动在线转化的影响,企业必须认识到平台集成和自动化的重要性。
捕捉消费者时刻并根据分析生成的消费者情报触发行动的能力在很大程度上取决于如何将内部应用程序和 martech 平台缝合在一起,从而无缝地摄取离线数据。
建立餐馆的战略集群
使用 k-Means 聚类实现在加拿大多伦多开设亚洲餐馆的最佳位置
加拿大多伦多由蕾切尔安娜贝尔
多伦多街区根据它们的集群标签进行颜色编码
1。简介
1.1 背景
建立一家新餐馆的成功取决于几个因素:需求、品牌忠诚度、食物质量、竞争等等。在大多数情况下,一家餐馆的地理位置是其成功的决定性因素。因此,为了最大化商业利润,确定最具战略意义的建立地点是有利的,也是最重要的。
1.2 业务问题
一位客户寻求在多伦多附近建立一家专营东南亚美食的亚洲餐厅。哪个社区似乎是企业运营的最佳和最具战略意义的位置?
这个顶点计划的目标是为操作定位最佳邻域。我们推理的基础是基于消费能力、种族群体的分布和每个社区的竞争。我们将主要利用 Foursquare API 和来自多伦多开放数据门户的大量地理和人口普查数据。
1.3 利益
寻求建立一个特定领域的新餐馆或计划扩大其特许餐馆的企业家伙伴们会对这一发现可能带来的竞争优势和商业价值非常感兴趣。
2。数据采集和清理
2.1 数据来源
他们各自的邮政编码和行政区旁边的街区是从维基百科上搜集来的。每个街区的地理坐标都是从这里提取的。至于多伦多的人口普查数据——家庭收入中值、总人口和每个街区的东南亚人口——多伦多的开放数据门户在这里提供了所有这些数据。
为了返回每个街区附近亚洲餐馆的数量,我们将利用 Foursquare API,更具体地说,它的 explore 函数。你必须注册一个 Foursquare 开发者账户才能访问他们的 API 证书。
2.2 数据清理
从多个来源下载或搜集的数据被合并到一个表中。由于缺乏记录,某些街区有很多缺失值。为实现图 1 中所示的数据帧,进行了一些假设:
- 只会处理具有指定区的像元;未分配的行政区被忽略。
- 丢失两个以上普查数据值的邻域被删除。
- 通过将东南亚人口统计的人口数除以每个街区的总人口数,计算出东南亚人口在每个街区的分布百分比;后两列是多余的,被删除了。
图 1:数据清理后的数据帧
3。探索性数据分析
3.1 树叶映射
该图书馆被称为帮助可视化,从地理上来说,每个以多伦多为中心的街区的位置。
图 2:用叶子在多伦多地图上标出的街区
3.2 亚洲餐厅的频率分布
使用 Foursquare API 的 explore 函数,我们可以返回位于每个街区的亚洲餐馆的数量。通过分别计算平均值,它可以让我们更好地了解每个邻域的发生频率。使用亚洲餐馆频率的理由是,我假设亚洲餐馆的数量和竞争之间存在相关性。一个街区中所述餐馆的数量越多,竞争就越激烈。我们分析的假设是,在竞争激烈的市场中建立一家新餐厅的进入壁垒很高,因为现有的亚洲餐厅可能具有品牌忠诚度的竞争优势。
虽然,与直觉相反,这些餐馆的存在可能是对亚洲美食需求的一个指标;竞争的存在甚至可能激励创新以降低成本和提高生产率。
因此,在一个由大约中等价值的餐馆组成的街区建立商业经营是合理的。
图 3:每个街区亚洲餐馆的平均频率分布
3.3 东南亚人口分布
我假设在一个特定的种族群体的人口和对其各自文化的需求之间也存在着线性关系。因此,对我们的客户来说,在东南亚人相对更密集的社区开展业务活动才是明智之举。
图 4:东南亚人在各街区的百分比分布
3.4 家庭收入中位数的分布
由于特许经营的亚洲餐厅可以归类为休闲餐饮,其目标受众更多地面向中产阶级收入者。从下面的柱状图可以推断出,平均家庭收入附近的居民区很容易负担得起并享受上述亚洲美食。
这项研究还假设,在这项研究中,所有社区的生活费用在决定其各自的消费能力方面是相对平等的。
图 5:各街区家庭收入中位数分布
4。预测建模
4.1 数据预处理
为了帮助基于数学的算法——就像我们在这种情况下的 k-Means 算法——同等地解释具有不同量值和分布的特征,我们必须归一化我们的数据;由于这些特征列的比例不同,我们将把这些值标准化为一个共同的比例。数据标准化的一种方法是标准定标器。
图 6:具有所有特征的标准化值的数据帧片段
4.2 k 均值聚类
在我们将特征值放入模型之前,我们必须预先分配算法应该标记的聚类数。为了确定要使用的最佳数目的集群,使用了 3 至 10 个集群,然后分别计算的平方误差被用作其性能的度量。
图 7:k 个簇的数量与其对应的平方误差之间的关系
图 8:使用 K 弯头可视化工具确定最佳 K 值的弯头点
使用 K 肘可视化器和每个 K 值的平方误差的分析表明,k = 6 将是最佳值。
在确定了聚类的数量之后,我们将把标准化的特征值拟合到我们的 k-Means 算法中;从而形成 6 个具有相似特征的聚集社区。
4.2.1 集群标签
多伦多的街区根据它们的集群标签进行颜色编码
图 9.1:聚类标签 0
集群 0:
- 消费能力高
- 中期目标客户的百分比
- 中期竞争者数量
图 9.2:集群标签 1
集群 1 :
- 消费能力低
- 中期目标客户的百分比
- 竞争者数量少
图 9.3:集群标签 2
集群 2 :
- 消费能力低
- 目标客户比例高
- 高竞争者的数量
图 9.4:集群标签 3
第三组:
- 消费能力低
- 目标客户比例高
- 中期竞争者数量
图 9.5:集群标签 4
集群 4:
- 中期消费能力
- 中期目标客户的百分比
- 竞争者数量少
图 9.6:集群标签 5
集群 5 :
- 中期消费能力
- 目标客户比例高
- 高竞争者的数量
4.2.2 集群摘要
总之,集群 0 的居民区拥有最高的相对消费能力,因为他们的家庭收入中位数明显高于其他集群。相当数量的东南亚人和亚洲餐馆表明对东南亚菜肴有足够的需求;和能够比其他人更有规律地消费膳食的顾客。
第 1 类消费能力低,同类餐馆数量少,这意味着消费能力指数低,需求不足,因此这类餐馆是最不理想的选择。
集群 2 在该地区拥有大量东南亚人口或目标客户,因此前景看好。然而,它的低消费能力和类似利基的大量竞争对手可能表明进入的高壁垒-与竞争对手提供的更便宜的选择相比,它的人口统计可能要求我们客户的更昂贵的菜单更少。
集群 3 ,尽管在人口统计和最佳竞争者数量方面有利,但其低消费能力将不幸地证明消费不足。
集群 4 在该地区的竞争者数量较少,这表明该地区对该美食的需求较低,尽管该地区拥有足够的消费能力水平和人口分布。
聚类 5 仅由一个小区组成,这是因为其竞争对手的数量非常多,并且分布在东南亚。尽管竞争对手众多,但这显示了前景。如果客户的特许经营餐厅已经建立,那么“集群标签 5”中的社区也可以考虑,因为该餐厅具有品牌忠诚度的竞争优势,可以对抗竞争对手的密度。
5。结论
在这项研究中,我根据他们的特征——消费能力、目标客户的百分比和竞争对手的数量——对社区进行了标记。最有希望开一家亚洲餐馆的社区群,以东南亚美食为利基,似乎是“集群标签 0”。
这个集群中的居民区的较高消费能力使他们很容易负担客户的亚洲餐馆菜单的稍微升级的价格。
目标顾客百分比的平均分布——东南亚人口统计——表明对亚洲美食的需求相对合理。
竞争者的数量并不多,但足以成为亚洲美食需求的良好指标。
我们的客户可以更具体地考虑 Guildwood 作为最佳结果的建立地点。然而,每当商业需求的动态发生变化时,我们总是可以瞄准不同的社区集群。举例来说,如果客户计划扩展一家知名的特许经营餐厅,那么“集群标签 5”中的社区将是最佳位置;这是基于一种假设,即上述餐馆相对于该地区的众多竞争者而言,具有品牌忠诚度的竞争优势。
总之,以上广泛的分析将大大增加餐馆成功的可能性。同样,我们可以用这个项目来分析可互换的场景,比如开一家不同菜系的餐厅。
6。未来方向
我认为这个模型可以在捕捉餐馆的个性特征方面做更多的改进。例如,两家餐馆可能有相似数量的竞争对手,但其中一家的地理半径可能较小,而另一家的地理半径较大。另一个例子是,东南亚人口更密集的餐馆可能不会比他们的民族同行更渴望他们的亚洲美食。
这项研究中的消费能力属性过于无知地假设所有上述社区的生活成本相对相等。更精确地计算购买力的生活成本账户将极大地改善研究结果。更多的数据,尤其是不同类型的数据,将有助于显著提高模型性能。
7。参考文献
[1]我这个项目的 Github:【https://github.com/TheClub4/Coursera_Capstone
[2]维基百科关于多伦多街区的信息收集页面:https://en.wikipedia.org/w/index.php?title =加拿大邮政编码列表:_M & oldid=945633050
[3]多伦多人口普查数据开放数据门户:
[## 幸福多伦多
最小值和最大值之间的数据值范围被划分为等长的类。例如,如果 5…
bit.ly](https://bit.ly/2Ja4v81)
[3]多伦多街区的地理坐标:https://cocl.us/Geospatial_data
[4] Foursquare 开发者 API:https://developer.foursquare.com
用数据科学赢得后新冠肺炎时代的战略举措
在您的数据科学团队中或与您的数据科学团队一起讨论的五个可行行动
图片来源:Mumemories via iStock
对许多人来说,新冠肺炎疫情撼动了 2020 年。今年标志着一个时期,不确定性突然变得比确定性更常见,而且似乎还会持续下去。在商业中,我们看到,尽管一些企业在不确定性中茁壮成长,但更多的企业需要彻底重新校准,以适应新常态的许多可能变体。在数据科学领域,我们在不确定性中茁壮成长,同时我们依赖统计学和人工智能作为黄金罗盘来穿越迷雾。在迷雾中,我们面对的是不断变化、充满活力的消费者需求,而实体客户比以往任何时候都更加遥远。这对许多行业和市场都很重要:供应链将以不同的速度运作,医院的产能管理与以前完全不同。拥有强大的数据科学能力将有助于企业的适应和发展。对一些人来说,这意味着从绝对零度开始,对所有人来说,这意味着采取正确的行动至关重要。
这篇文章将带你了解在后新冠肺炎时代赢得比赛的五个关键战略步骤。此外,它还列出了几个必须知道的技术和数据科学术语,可以帮助您与首席数据科学家展开正确的对话。
1。 集结部队进入队形
图片来源:Georgijevic via iStock
为了能够量化不确定性,并尽可能远离它,您将需要一个数据科学团队。您的数据科学团队将在所有后续步骤中发挥至关重要的作用。它们对于利用正确的数据、预测接下来会发生什么、帮助实现自动化以及在远程建立高质量客户关系方面发挥决定性作用至关重要。通常,表现良好的数据科学团队包括具有互补技能的人员,这些技能至少包括统计建模、AI / ML、数据工程以及项目和人员管理方面的知识。如果你缺少人才,即将到来的经济衰退可能会增加数据科学领域的人才。
即使你已经有了一个团队,现在也是时候重新审视他们的定位了。通常,当团队的位置靠近进行战略决策的董事会会议室时,团队的影响力是最佳的。从那里,他们可以部署到高影响力的项目中,在这些项目中,除了传统的分析师和 BI 角色之外,数据科学还将具有额外的价值。
最后但并非最不重要的一点是,对公司内的所有人进行不同层次的数据素养教育。鉴于内部和外部需求的转变,在公司内部寻找任何可以接受再培训的人。利用规模和现有资源,MOOCs 以小投入创造大价值。通过要求将洞察力作为决策的关键因素(而不仅仅是调味品),建立一种以数据和数学推理为基础的文化。后新冠肺炎时代的世界将与我们所知的不同,所以确保你的人现在就利用数据采取行动,而不是在一个不再相关的前新冠肺炎时代的经验。
2。 插上数据排气
图片来源:Jag_cz via iStock
越来越依赖数据和活跃的数据科学团队将使您的公司对数据如饥似渴。尽管应该保护敏感数据,并且应该实施正确的策略,但是您应该克制对数据仓库的某些部分应用锁定的冲动。相反,让创造力茁壮成长,让不敏感的数据大众化。
那么这意味着什么呢?这意味着今天的跨部门数据应该可供您的数据科学团队和组织的其他部门使用。您已经拥有的数据的民主化将增加透明度并增强跨部门的协作。为了在技术上实现这一点,将(部分)数据转移到云中,并考虑像 Apache Cassandra 或 MongoDB 这样的 NoSQL 解决方案,使您的数据可用于许多接口。此外,积极搜索和发现“黑暗”数据,这些数据只对某些人可用,或者尽管非常有价值却从未被挖掘。最后但同样重要的是,测量数据基础架构的质量并针对速度进行优化,以便应用程序和数据科学模型能够及时产生影响深远的见解。
此外,我们看到新冠肺炎教改变了社会和个人的价值观和规范。为了保持领先,你需要重新考虑在公司内部消费和记录哪些数据,并进行相应的实验。不要为非作歹,而是重新思考和调整你在数据收集方面的道德方法,不断改进你的产品和服务,以适应“新常态”。
3。 拨开迷雾
图片来源:AscentXmedia via iStock
更完整的数据将允许你对你的成功进程进行精确的测量。但是你的大部分预测和(在产)AI / ML 模型都会被目前的情况搞糊涂。他们都是在 COVID19 之前的数据上接受培训的,更不用说 COVID19 之后的数据(还)几乎不可用。尽管如此,你还是需要透过迷雾来避开危险。有哪些最佳实践?
首先,确保您的模型得到了正确的实现。企业和您的数据科学团队需要尽快知道准确性何时会出现偏差。建议您的首席数据科学家使用 Kubeflow、Azure ML 或 AWS Sagemaker 等解决方案来实现模型的自动化再训练。尽管有时可能需要一些人工干预,但它可以确保使用最新数据定期更新您的模型。
第二,实现和应用需要较少数据或不需要任何数据的模型。对于低数据,使用简单的机器学习模型来避免不准确的模型,例如过度拟合。过度拟合的模型非常适合小型训练数据集,但也会表现出现实世界中不存在的关系。与您的数据科学团队讨论 RidgeRegression、KNN 或朴素贝叶斯,以便使用更少的数据。
第三也是最后一点,考虑生成可能复制未来的场景数据。与业务部门一起,您的数据科学团队可能能够生成几个未来场景。如果您的数据科学能力更先进,请通过使用生成式深度学习技术(GANs)生成数据来支持这些场景。以前 GAN 驱动的合成数据似乎只适用于可再生能源领域,但新冠肺炎导致的数据缺乏将推动这一新的应用。展望未来,你可以利用机器学习来确定哪种场景类似于你公司的当前状态,从而对未来做出最准确的预测。
4.自动化提高效率
图片来源:AscentXmedia via iStock
尽管后新冠肺炎时代最明显的挑战似乎是在不确定性中取胜,但在不确定时期也不应忽视提高运营效率。虽然市场在短时间内波动、萎缩和增长,但赢家可能是那些擅长规模游戏的人。在这种情况下,我们可以从以前的经济衰退中吸取教训,专注于技术和数据科学驱动的自动化的参与者将在衰退期间和之后获胜。
数据科学驱动的决策通过将全职员工从重复性任务转移到他们更有价值的更多领域来帮助削减成本。此外,它允许您更快地扩展运营,这可能有利于需要超越竞争对手的销售和运营团队。自动化是技术和数据科学的结合,但是要小心复杂的怪物。机器学习不是银弹,大多数自动化问题 90%是通过简单的数据工程或使用简单的业务规则评估决策来解决的。如果您正在寻找在工作流自动化方面强大的工具,请讨论气流的实现,或者研究一下新的 kid-on-the-block: Prefect。
如果专注于低挂的果实,自动化可能是一个安全的赌注,在那里商业案例是强有力的。复杂之处通常在于这些病例的公开鉴定。此外,确保您教育了您的员工,并且共享了最佳实践。最后,确保人们在自动化他们自己的责任方面获胜。只有这样,他们才不会害怕失去影响力和工作的乐趣,这是后新冠肺炎时代让自动化发挥作用的必要条件。
5。 建立高质量的远程客户服务和关系
图片来源:ZargonDesign via iStock
对社会而言,在后新冠肺炎时代,保持距离似乎仍将是一个重要的价值观。我们看到消费者被迫远距离满足他们的需求,这造成了可能难以改变的客户习惯和期望。这些更新的期望很可能会传播到其他行业,你可能要为此做好准备,即使是在 2B。
借助数据科学,您可以在更私人的层面上与客户互动,从而加强您的数字关系。实际上,这可能意味着预测哪些服务和产品将符合个人需求,或者优化特定时间和地点的可用性。或者,用最吸引客户的语言交流。通过插入客户数据的排气(步骤 2),您的数据科学团队将能够使用聚类技术对客户进行细分。今后,您可以应用精心设置的 A / B 实验来快速了解和优化在线服务。
让这一点发挥作用意味着在实时电子商务等条件下查询数据科学模型。速度是至关重要的。为了做到这一点,您将需要流分析来处理和评估运动中的数据,而事件是 happening⁴.流分析开辟了在环境中应用数据科学模型的途径,以前我们在等待数据到来或模型生成答案时速度太慢。虽然今天的流分析设置比传统设置更复杂,但这无疑是一个值得关注和应用的领域,没有其他解决方案可以发挥作用。
你下一步应该做什么
总之,评估五个步骤中的每一个如何与你的公司和职位相关,会对你度过这个充满挑战的时期有很大的帮助。每一步都应该以某种方式激励你,并为公司内部的讨论提供素材。我们写这篇文章是为了提出更多的问题,尤其是为了促进讨论。作为第一步,您可能需要重新联系您的首席数据科学家,以探索后续步骤。如果你需要帮助,我们很乐意帮忙。
此外,我们期待听到您在后新冠肺炎时代利用数据科学推动成功的经历。祝你好运!
[1] C .蒋等,基于生成对抗网络的日前可再生能源情景预测 (2020),TechrXiv
[2]沃尔特·弗里克,如何度过衰退并在衰退后繁荣发展 (2019),《哈佛商业评论》2019 年 5-6 月刊
[3] Jasper van Rijn,作为新标准的网购的突破 (2020),IG & H 博客系列:零售商如何从电晕危机中反弹
[4] Databricks,流分析(2020 年查看),Databricks 词汇表
跟上人工智能研究的策略
原始图像由 OpenClipart-Vectors 在 Pixabay 上生成
帮助您掌控一切的 7 个技巧
人工智能的速度
对于任何关注人工智能(AI)、深度学习(DL)或机器学习(ML)领域的人来说,研究有时会像赛车一样从你身边飞驰而过。在 arXiv.org 上快速搜索显示,今年(2020 年)4 月 1 日至 5 月 1 日期间,宣布了 2683 篇与 AI、DL 或 ML 相关的新文章。研究社区不断被新的工作(好的和坏的)淹没,跟上似乎是不可能的。媒体对大赦国际的报道进一步加剧了这种情况。无论是自动驾驶汽车的即将到来,自然语言处理的进步,自动化医疗诊断,还是对控制论机器人起义的恐惧,人工智能都受到了广泛关注。
当然,人工智能接受的无数曝光有许多好处;然而,对于那些在实地工作的人来说,也有一些负面影响。首先,来自新应用程序、更好的体系结构、新兴子领域等的大量信息会分散注意力。随时都有数不清的兔子洞可以跳下来。虽然探索可能提供更好解决方案的新的和新兴的解决方案很重要,但如果我们把所有的时间都花在追逐闪亮的物体上,那么我们将永远不会取得任何进展。
其次,大量新研究和不断增长的人工智能行业可能会产生不必要的焦虑。成功和快速成功的压力甚至会动摇最有经验的研究人员和开发人员的信心。似乎其他研究人员的发布速度是他们的两倍,或者公司开发的应用程序也是他们的两倍。这可能导致糟糕的设计决策和浪费时间,从而破坏我们有效应用人工智能的能力。此外,这可能会使我们容易受到群体思维的影响,并限制我们用新颖和创造性的解决方案处理问题的能力。
最后,如果你想保持相关性,跟上与你的应用领域或行业相关的研究是必要的。诀窍是找到不消耗你所有时间并且最适合你的方法。本文的其余部分确定了实现这一目标的策略。同样重要的是,我们要让最先进的研究启发我们,而不仅仅是影响我们,但这将是未来文章的主题。
跟上的策略
所以好消息是有大量的资源可以帮助我们跟上与我们兴趣相关的研究。在这篇文章中,我分享了一些我使用的资源,并讨论了我的一些保持与人工智能研究同步的策略。下面的项目是根据我个人的优先顺序排列的,但是每个人的学习方式都不一样,所以我鼓励你尝试一下,看看哪些适合你。
0。实事求是,始终如一
我们所有人花在跟上人工智能上的时间都是有限的,所以要现实和一致。在你的时间表中留出固定的时间。认识到你的时间限制会帮助你选择最适合你的策略。聪明努力地工作。
1.看报纸
因此,尽管听起来很明显,但花点时间阅读论文是非常重要的。这将为你提供学习新的和正在出现的工作的明显好处,但它也将加强你提炼和理解复杂概念的能力。阅读技术论文是一项对工程和科学至关重要的技能,就像所有其他技能一样,熟能生巧。奖励:批判性阅读论文也是一种很好的方式,通过真正挑战作者提出的一切来提出新的研究/算法想法。
以下是我的一些读报小技巧。
1A。保持有条理。
所以我的第一个建议是保持你的文件有条理。就我而言,我的云驱动器上有一个“ReadMe”文件夹,里面有我想阅读的所有论文。所以,当你有一点时间的时候,你可以直接去你的文件夹,开始阅读。一旦你阅读了这篇论文,你可以把它移到你的数字图书馆的其他地方,或者简单地删除它。
1B。聪明阅读。
正如我在博士期间很快了解到的那样,阅读论文会花费很多时间,如果你没有一个好的策略,你将永远不会看完你需要的所有论文。就我个人而言,我发现三阶段方法对我非常有效。每个阶段都有特定的目的,随后的阶段建立在前一个阶段的基础上。这可以大大加快这个过程,因为你经常会发现,在许多情况下,完成第二阶段就足够了。
这是我的一般做法。
- 第一阶段:阅读摘要和结论。
- 第二阶段:通读整篇论文,但是跳过任何需要大量脑力劳动的技术细节。
- 第三阶段:批判性阅读,质疑作者的假设和主张。
- 第四阶段(奖金!):码起来!这显然不仅仅是阅读,而是最终真正理解新概念的最佳方式。
在不久的将来,我将发表一篇关于我的方法的更详细的文章。我也鼓励你去读一些其他的策略,找到适合你的。
1C。设置提醒。
谷歌学术是一个了不起的资源,原因有很多,但自动提醒是跟上新潮流的好方法。可以基于作者或搜索字符串创建通知。作者提醒对于关注该领域的重量级人物非常有用,搜索字符串提醒对于寻找新作者非常有用。
要创建作者提醒:
- 搜索一个作者,点击他们的名字,进入他们的谷歌学术简介。
- 选择个人资料右上角的“关注”按钮。
- 输入您的电子邮件地址并选择提醒选项。
作者图片
要创建搜索字符串警报:
- 登录谷歌学术,从侧面菜单中选择“提醒”。
- 点击“创建提醒”。
- 输入您的电子邮件地址、应该查询的搜索字符串以及应该包含的结果总数。
作者图片
专业提示:如果你使用 GMail,那么你可以利用这些奇特的过滤技巧来自动组织收件箱中的提醒。你可以在这里阅读花式过滤。
2.观看 YouTube
YouTube 是最令人兴奋的地方之一,我开始看到真正好的内容。有很多非常聪明的人正在发表论文评论、在线讲座和教程。所有这些都是快速了解新主题和获得直觉的极好来源。我发现这些视频为我节省了时间,并让我意识到了一些我以前不会看到的新话题。
我没有提供一个长长的潜在频道列表,而是只列出了三个 YouTube 频道,我建议从它们开始。我对每个频道都做了一些简介,并解释了为什么我认为这是值得的。检查完这些频道后,我会鼓励你检查更多的频道,找到适合你需要的频道。
- 扬尼克·基尔彻:扬尼克发表了非常好的论文评论。他浏览新发表的论文,并提供大部分必要的背景材料,以便很好地理解论文的贡献。他的视频直截了当,这使得他可以发布大量视频,其中大多数不到 30 分钟。如今,如果有我感兴趣的新论文,我会快速搜索一下,看看 Yannic 是否已经覆盖了它。
- 亨利人工智能实验室(Henry AI Labs):该频道由康纳·肖恩(Connor Shorten)运营,同时提供大量论文综述和讲解视频。像扬尼克一样,康纳非常博学,在解释人工智能概念方面做得非常出色。这个频道真正的金块(至少对我来说)是“AI 每周更新”系列。Connor 每周都会对人工智能研究的最新消息进行高水平的回顾。更新视频不到 30 分钟,包含大量内容。
- 两分钟论文:这个频道由 Karoly Zsolnai-Feher 运营,已经积累了超过 60 万的订户。Karoly 制作了制作精良的短视频(约 5 分钟)。这些视频通常水平很高,但非常清楚地说明了主题。这些视频很容易观看,而且可能会上瘾(从好的方面来说)。
专业提示:YouTube 设置允许你以高达 2 倍的速度播放视频,这对浏览人工智能内容非常有帮助。我发现 2 倍的速度是可以忍受的,只要你习惯了。为了更好的控制,你也可以使用插件,比如 YouTube 的增强器。
3.订阅新闻信件和子编辑
另一个很好的资源是使用新闻信件和子编辑来帮助过滤内容。诚然,我没有订阅很多新闻信件,但我发现 deeplearning.ai 的批次非常有用。吴恩达是人工智能领域最著名的人物之一,这是有充分理由的。每周他都会提供一份人工智能热门话题的精选列表,以及相关的背景和为什么这项研究可能很重要。我个人也认为 Andrew 涵盖了研究人员和应用程序开发人员都感兴趣的主题。我强烈推荐订阅这封新闻信,并寻找其他符合你兴趣的新闻信。
多年来,我一直是 Reddit 的忠实粉丝。我一直认为 Reddit 是一个基于社区的互联网过滤器。Reddit 拥有许多子社区 can Subreddits,这些子社区致力于特定的主题或主题。成员可以张贴内容,可以根据内容的接收情况进行投票表决。希望最有用和信息最丰富的内容被提升到列表的顶部。有几个不同的子主题与 AI 和 ML 相关,但我建议从深度学习开始。这个社区有不到 5 万名成员,Subreddit 非常活跃。
作为题外话,Reddit 不仅是一个很好的信息来源,也是一个与志同道合的人工智能爱好者互动的地方。我认为这对于该领域的新手和希望得到一些反馈的人,或者那些不经常与人工智能专家互动的人来说特别有用。我个人目前并没有在这些子栏目中发表文章,但希望在不久的将来会有所改变。
4.回到基础
我发现花点时间复习基础知识是很有用的。巩固你的基础会让你在阅读你所在领域的论文时更有效率。我也试着根据我一直在读的东西来选择这些话题。例如,假设您正在尝试学习语音识别算法,那么回顾一下您的基本信号处理和频谱分析是值得的。这将会给你一个优势,让你更好地理解和提高你正在阅读的内容。它还会帮助你挑战那些你可能信以为真的假设。
虽然不可能涵盖每个人的兴趣,但我会推荐以下几类作为考虑的主题。
- 结石
- 线性代数
- 最佳化
- 编程;编排
- 数字信号处理
- 随机过程、统计学和信息论
- 领域知识(取决于你的兴趣领域)
有很多免费和付费的在线资源可以学习这些类型的主题。我会推荐你看看 Coursera 、 edX 、斯坦福在线和麻省理工学院开放课件快速入门。
5.阅读技术博客
这年头绝对不缺 AI 和 ML 博客。基于博客的站点和目的,内容可以有很大的不同。当我试图寻找某个特定主题的信息时,我通常会通过谷歌搜索进入大多数博客。然而,有一些博客我会定期浏览,寻找新的内容。这里是我发现的前三个信息,但通常这将取决于你的兴趣。
专业提示:你可以使用新闻阅读器工具,如 in reader 或 Feedly 将你所有的博客内容收集到一个地方。
6.听播客
播客可能成功也可能失败,这取决于你是谁。有许多不同的人工智能和人工智能相关的播客,其中许多遵循相当相似的格式。其中大多数包括对研究人员和开发人员的采访,谈论新出现的问题,并涵盖这些领域的基础知识。我发现自己最近花在播客上的时间越来越少,但我仍然认为它们是很好的资源,值得一读。有些播客可能会很长,所以最好选择几个,坚持一段时间。
与 YouTube 上的部分类似,我没有提供一长串的可能性,而是在下面提供了一些建议。
- 线性题外话:这个播客提供了极少量的技术机器学习内容。剧集很短(不到 20 分钟),涉及的话题很广。
- 会说话的机器:这个播客的特点是更长的剧集(大约一个小时),比线性题外话更没有技术含量。这种形式是基于采访正在工作的人工智能从业者,并在非常实际的意义上讨论相关话题。
- 人工智能播客:该播客完全基于采访,每集时长 1 至 3 小时。完全透明,这个播客涵盖了广泛的主题,其中许多都是非技术性的,甚至是哲学性质的。我个人觉得很多剧集都很有趣,而且很多嘉宾都是人工智能社区中非常受尊敬的研究人员和开发人员。
7.监控社交媒体
现在,我承认这个建议有点虚伪,因为我几乎完全放弃了社交媒体。然而,我认识到它可以是一个很好的工具,用来跟踪你最喜欢的作者发生了什么,或者在你的领域发生了什么。许多研究人员和开发人员会经常在 Tweet 上发布关于行业新论文或发展的消息。这可以作为过滤掉重要信息的另一个来源。所以,如果你喜欢社交媒体,那就想办法让它为你服务。
结论
人工智能(和相关领域)正在经历一个前所未有的增长时期,这对这个领域来说是梦幻般的,但它肯定会势不可挡。每时每刻都有这么多事情发生,很容易分心,这可能会对你的工作造成损害。知道你并不孤单,这让你得到一些安慰。最重要的是认识到你有多少时间,并尽可能明智地使用它。
这篇文章介绍了一些我用来继续研究的策略。从列表中选择一些策略,并尝试一下。不要试图一次实现太多,否则它会很快变得难以承受。当你慢慢找到自己的学习方法时,看看哪些有用,哪些没用。最终,你需要找到最适合你的方式,这可能会随着时间而改变。不断探索,不断学习,增长见识。
学习数据科学的策略
数据科学之旅可能起点的卡通插图。(由 Chanin Nantasenamat 绘制)
数据科学
进入数据科学的实用建议
你想进入数据科学领域吗?但就是不知道怎么做?如果是这样,那么继续读下去,因为这篇文章是为你而写的。
去年年底,也就是 2019 年 12 月,我发布了一个 YouTube 视频,名为2020 年学习数据科学的策略 ,这是我最近开设的 YouTube 频道,名为 数据教授 ,在那里我分享了我作为一名自学数据科学的学术教授学习数据科学的策略,自 2004 年以来一直活跃在该领域长达 16 年。
在本文中,我将讨论如何通过与您分享我用来学习数据科学的一些学习策略,让您也走上成为数据科学家的类似道路。
闯入数据科学需要什么背景?
为了成为一名数据科学家,你应该拥有计算机科学学位吗?或者,如果你来自一个非技术背景,你也可以做一个类似的转变到数据科学吗?
首先,我不是计算机科学家,你可能还记得我的第一篇关于媒体的文章( 生物学家如何成为数据科学家:我如何从非技术背景过渡到数据科学 ),我的本科学位是生物科学。而且因为对计算机和数据的迷恋,我一直在自学做数据科学所必须的概念和技能。
数据科学是一个多学科领域,包括几个学科,如信息学、计算机科学、统计学、科学、数学、数据可视化以及最重要的问题解决。如果你查看 LinkedIn 上数据科学家的职位描述,你会注意到数据科学家可能拥有各种第一学位。如你所见,背景相当多样化。事实上,许多人不是计算机科学毕业生。然而,如果你有计算机科学学位,你可能会有优势。如果你没有,那也没关系(我也是生物专业的)。
拥有学习数据科学并将其应用于任何领域的热情,我相信这是成为数据科学家的关键。由于生物学中的大量数据,这刺激了我成为一名数据科学家的转变。特别是,通过应用机器学习来分析大生物数据,以努力(1)发现和发现新药,(2)理解药物的作用机制,以及(3)创建诊断工具,该工具将能够帮助临床医生和卫生专业人员诊断患者的特定感兴趣的疾病。
从哪里开始?
这是一个棘手的问题。当您想要进入数据科学领域时,实际上应该从哪里开始呢?答案可能会非常不同。如果你问一百个数据科学家,你可能会得到一百个不同的答案!
如果你问我,我是从生物学领域的知识开始的。我在生物学上遇到了一些数据问题,需要解答。在我最终成为一名数据科学家的过程中,我慢慢地一项一项地学会了必要的技能。这不是在 3 个月或 1 年内完成的,而是从 2004 年开始的。在数据科学这个术语被创造出来之前,我已经做了 16 年,发表了 100 多篇研究文章,从 2006 年开始教授数据科学(当时是数据挖掘),我能说我已经掌握了数据科学吗?绝对不行!我每天都在继续学习数据科学的新概念。数据科学的前景如此广阔,以至于可能需要花一生的时间来掌握(甚至可能不掌握整个领域,而只是其中的一个子集)。
正如您将在下面的漫画插图中看到的那样,闯入数据科学的起点相当灵活。无论你来自哪种背景,你都可以进入数据科学领域,只要投入必要的努力、时间和实践,你就会成为一名数据科学家。
**数据科学之旅可能起点的卡通插图。**在这里,您将看到无论您从哪里开始,您都可以继续学习数据科学中使用的其他技能。(由 Chanin Nantasenamat 绘制)
成为一名数据科学家需要多少时间?
另一个你可能想知道的流行问题是成为一名数据科学家需要多少时间。您可能从某个地方听说过,您可以在 3 个月或更短的时间内学习数据科学。
但是说真的,这可能吗?答案是有也没有,迷茫?你看,3 个月后,你可能会对数据科学提供的东西有所了解。你也许能获得数据科学的初步介绍。你甚至可能获得数据素养或成为一名公民数据科学家。
比方说,如果你有一个计算机科学学位,成为一名数据科学家所需的时间不会太长,因为你已经具备了计算的基础,你已经有了技术背景,你已经知道如何编程(如果没有,那也没关系!).所以你所拥有的这些技术技能会让你的转变更快。
比方说,如果你是一名 web 开发人员,你将学习 R 或 Python,那么你将比一个来自生物学等领域的非技术人员更有能力学习这两种语言或其中任何一种语言(没错,就是我!).
对于一个生物学专业的学生来说,学习 R 或 Python 所需要的时间可能会更长。然而,我相信如果你有学习的心态和热情,那么我认为这是必要的。我在某处读到过,如果你花 10,000 个小时,你就能掌握技能或知识。
比方说,你每天花大约两个小时学习编程和数据科学的概念,所以我相信在一两年内,你将能够学到足够的知识,成为一名数据科学家。既然你也在练习。我认为数据科学家是一种生活方式。成为其中一员需要奉献和终身学习来获得新的技能,这将使你在这个领域中处于循环之中。这是一个使用它或失去它的哲学。因此,除了终身学习,我还强烈建议将新获得的知识和技能应用到数据科学项目中。
就我个人而言,我作为生物信息学副教授的日常工作要求我跟上该领域的最新发展,以促进创新和开发新的生物信息学工具,以及应用现有的机器学习算法来提取知识,提供对疾病潜在机制的见解,以及寻求发现潜在治疗应用的新药。
我需要学习如何编码吗?
因此,你可能会有下一个问题,你是否需要学习如何编码,以便成为一名数据科学家?这真的取决于环境,所以是和不是。在我学习如何编码之前,我会使用这个叫 WEKA 的软件。它是一个点击式图形用户界面(GUI)软件,用于执行数据挖掘,我依靠它来分析我在博士研究期间收集的数据。
随着时间的推移,我开始注意到通过点击式界面进行数据分析并不是一个高效的过程。主要原因是它需要大量的手动工作,我将不得不实际使用鼠标点击并执行软件中的各种任务:(1)导入数据,(2)指定输入参数,(3)启动模型的训练,(4)收集数据,(5)将其放入 Excel,(6)将其合并,因此所有这些都非常繁琐。
在我读博期间,有一段时间我记忆犹新。就是我在大学机房控制 40-50 台电脑的时候。因此,在每台计算机上,我会运行一些计算(使用 WEKA 软件建立模型),然后我会手动从 40-50 台计算机中的每一台收集数据,然后将结果汇集在一起,以便在 Microsoft Excel 中进行后续分析和绘图。
在我的博士研究过程中,我从未学习过编码,而我只是依靠 WEKA 软件的数据挖掘功能,使用线性回归、J48(c 4.5 算法的 Java 实现)、反向传播神经网络和支持向量机等算法来完成所有的机器学习模型构建。在我的博士研究接近尾声时,我遇到了另一个伟大的基于 GUI 的多变量分析软件,称为 Unscrambler,它允许我运行另外两个机器学习算法,即主成分分析和偏最小二乘回归。
因此,在我 4 年的博士学习结束时,由于使用了两个基于 GUI 的软件:WEKA 和 unbrowser 软件,我能够以 13 篇论文(研究文章)毕业。我有没有提到,在我读博士的过程中,我确实尝试过学习 C++和 Java,但是没有成功。很大程度上停留在 Hello World 示例上,并没有真正获得任何进一步的进展。
那么我是什么时候学会编码的呢?你可能想知道。在透露答案之前,我先给你讲一下背景。于是在拿到博士学位后,我被同一所大学聘为讲师(快进到今天,我刚刚庆祝了我在学术界的 14 年+ 4 年读博= 18 年研究)。
好了,现在是我学习如何编码的时候了。在我担任讲师大约一年后,我遇到了一位研究助理(我将在下文中称为 RA ),他加入了我的研究实验室,帮助我将一些现有的工作流转换成编程工作流,即 Python 中的工作流。于是 RA 给我看了他一直用来学习 Python 的这本书叫做 Python Power!这是我第二次(也是成功的)尝试学习如何编码。那么为什么第二次尝试成功了呢?让我在下一节解释一下。
所以说了这么多,不编码做数据科学有可能吗?可以使用基于 GUI 的软件,如 WEKA 、 Rapid Miner 、 Orange 或其他类似软件(在现代称为无代码 AI)来执行机器学习模型构建。
但是,整个数据挖掘项目的整个端到端工作流程并不完全可能仅通过使用一个软件,如 WEKA 。所以我最终使用了名为 Ultra Edit 的文本编辑器,它允许我应用录制的宏来半自动完成一些所需的数据预处理。
绘图主要是使用 Microsoft Excel 和 Powerpoint 创建的(用于添加图内面板标签和设计多绘图图的布局)。我还使用了另一个软件来制作更复杂的图,比如等高线图,这是通过使用适马图软件实现的。挑战在于手动将第一个软件的输出转换为第二个软件的输入。这个过程反复重复,由此第二软件的输出被用作第三软件的输入,等等。
如您所见,通过基于 GUI 的软件来执行整个数据挖掘模型构建的整个端到端工作流确实是可能的,但代价是需要手工操作。
所以回想起来,如果我能重新开始我的博士学位,我肯定会在学习如何编码上投入更多的努力(事实是,我确实试图学习如何编码,但没有成功;几年后的第二次尝试成功了,因为心态的改变,我将在接下来的章节自学程序员中与你分享?)。
你看,如果你知道如何编码,即使只是一点点,它将有助于大大加快你的工作流程。想象一下用 R 或 Python 代码自动化整个端到端项目,而不是必须手动做所有事情。那么有什么区别呢?答案是时间和可靠性。特别是,自动化方法更不容易出现人为错误,同时计算和完成速度明显更快。
学什么语言?r 还是 Python?
所以现在非常重要的问题是你应该学习什么语言如何编码。如果你一直在谷歌搜索或者在 YouTube 上看视频,你可能会遇到两种在数据科学领域非常流行的语言。所以第一个是 R,第二个是 Python。一个经常被问到和争论的流行问题是,是学 R 还是 Python?
R 或 Python 有令人信服的理由吗?
所以答案真的取决于是否有令人信服的理由选择 R 或 Python。例如,您可能想要使用 Bio3D R 包或 shiny 包,因此如果是这种情况,那么就选择 R。或者,您可能真的想要使用 python 中的 Biopython 库,那么无论如何都要使用 Python。
你有学习伙伴或导师吗?
所以就我个人而言,我首先学习 Python 并不是因为语言本身的任何特殊原因。所以决定学习 Python 是因为我在前面提到的 RA 已经使用 Python 为我们正在进行的项目编写了工作流程。这或多或少地限制了使用 Python 的选择,因此我学习编码的旅程从这里开始。
所以我要求 RA 逐行解释 Python 源代码的意思。第一个解释对我来说没有意义。所以在一张纸上画一些漫画来描述每一行执行时实际发生了什么。不久之后,他离开了这个团队去攻读博士学位。所以我继续学习编码。
自学编码员?
因此,我得出结论,按照书中的例子编写代码并没有真正点燃我的学习过程。那么究竟是什么推动了我的学习呢?它框定了我自己的数据问题,并基于这个问题(这是最终的激励),我会寻找如何有计划地解决数据问题并产生必要结果的方法。这个小任务的完成会给我带来小小的胜利,有助于激发我的学习动力。通过寻找解决数据问题的方法,我实际上做了什么?
答案很简单。我发现了 栈溢出 。这是一个神奇而强大的资源,它允许我通过学习别人如何解决编码问题的例子来自学编码。有时,一些问题有多个答案,最终导致相同的结果。特别是,一些答案获得了更多的支持,而另一些可能获得了更少的支持,这实际上是一个关于它是否也帮助了其他人的学习旅程的主观问题。通过比较和学习这些多重答案,这帮助我认识到,为了完成工作(解决数据问题),我不需要记住语法(几年前当我试图学习 C++或 Java 但没有成功时,我盲目地试图这样做)。
所以这一次,我被解决数据/编码问题的愿望和达成最终解决方案所需任务的逻辑所引导。那么,我是如何得出需要完成哪些任务的逻辑的呢?我会简单地查看数据/编码问题,并尝试在纸上列出所有步骤,如果我必须手动完成,我会如何做。然后,我会一个接一个地对每一步进行顺序编码,直到所有问题都得到解决。在你知道之前,已经被分解成一口大小的馅饼被一个接一个地抓住并完成。
了解您的 Python 库和 R 包
因此,成为数据科学家的下一步是,你需要熟悉 Python 的标准库或 R 的标准包和模块。特别是,你需要知道 R 或 Python 中的哪些包或库可用于处理数据、预处理数据以及创建预测模型。
数据帧
例如,如果你在 Python 中处理数据帧,你将使用 pandas,因此, 你将不得不学习 pandas,以便你可以将不同的数据帧合并在一起。在 R 中,可以使用 dplyr 以及 R 中的 数据帧内置函数。
数据可视化
如果你想在 Python 中创建图形,你可以使用 matplotlib , seaborn , altair , plotly 和 plotnine ,而在 R 中你可以使用 R 基本绘图函数 ggplot2 和
机器学习
为了在 Python 中进行机器学习和建立预测模型,你需要使用 scikit-learn 或者你可以使用tensor flow,keras,py torch和 fast。
部署
在您已经构建了模型并且想要部署它之后。您可以从两种方法中选择一种:(1)作为应用程序编程接口(API)部署,或者(2)作为 web 应用程序部署。
在 Python 中,您可以使用 flask 部署您的 scikit-learn 模型(参见本教程 将机器学习模型部署为 REST API 作者 Nguyen Ngo )。来自 Google 的 云 ML 引擎 也是另一种选择(参见本教程 部署 scikit-大规模学习模型 作者高玉峰)。在 R 中,您可以使用plumber包来创建 web API(参见本教程 如何使用由 Shirin Elsinghorst 编写的 plumber 包 将您的机器学习模型作为 API 使用,以及本教程 R 可以 API,您也可以! 作者希瑟·诺利斯。
要将机器学习模型部署为 web 应用程序,建议您首先通过 Python 中的 pickle 函数和 R 中的 saveRDS 函数将模型保存到一个文件中。然后可以使用flask和Streamlit来提供实际的 web 应用程序
我还制作了一个视频系列教程,讲述如何使用 Streamlit 库用 Python 创建数据科学 web 应用程序。
* [## 如何用 Python 构建数据科学 Web 应用程序
第 1 部分:您的第一个 Web 应用程序,只有几行代码
towardsdatascience.com](/how-to-build-a-data-science-web-app-in-python-61d1bed65020)
如果您想用 R 语言创建数据科学 web 应用程序,那么请使用 闪亮 包查看下面的教程视频系列。*
掌控您的数据科学之旅
成为一名数据科学家最重要的部分是你必须坚持不懈。你必须努力尝试。你必须拥有自己的数据科学之旅。这段旅程并不容易,所以你必须付出额外的努力来完成它。
我的数据科学之旅非常了不起。我学到了很多东西。我见过很多有才华的人。我有机会做我真正喜欢的事情并获得报酬。所以我从来没有厌倦这份工作,总是有新的数据要收集,要分析,我们有持续的合作,真的有新的数据和新的机会不断流入学习生物学,所以这是一个非常非常令人满意的工作。如果我能让时光倒流,重新决定我想做什么,我会坚持同样的道路,成为一名数据科学家。我相信数据科学非常适合我自己的 Ikigai(查看令人敬畏的文章 Ikigai:过有意义生活的秘密 ,作者 Ketaki Vaidya )。
如果您想获得更多关于开始学习数据科学的建议和路线图,请不要忘记查看我之前在《走向数据科学》中的文章 关于学习数据科学我希望知道的 10 件事:开始数据科学之旅的终极路线图 。
开始数据科学之旅的终极实用建议
towardsdatascience.com](/10-things-i-wish-i-knew-about-learning-data-science-7a30bfb91759)*
最终带回家的信息
最重要的是,你必须编码。你必须做数据科学项目。如果您能从这篇文章中获得 2 个关键信息,请获得 2 个:(1)学习编码和(2)将您的编码技能应用到您自己的数据科学项目中。
“学习数据科学的最好方法是做数据科学。”
— Chanin Nantasenamat,数据教授
订阅我的邮件列表,获取我在数据科学方面的最佳更新(偶尔还有免费内容)!
关于我
我是泰国一所研究型大学的生物信息学副教授和数据挖掘和生物医学信息学负责人。在我下班后的时间里,我是一名 YouTuber(又名数据教授)制作关于数据科学的在线视频。在我制作的所有教程视频中,我也在 GitHub 上分享 Jupyter 笔记本(数据教授 GitHub 页面)。
数据科学、机器学习、生物信息学、研究和教学是我的激情所在。数据教授 YouTube…
www.youtube.com](https://www.youtube.com/dataprofessor?sub_confirmation=1)
在社交网络上与我联系
✅YouTube:http://youtube.com/dataprofessor/
♇网站:http://dataprofessor.org/(在建)
♇LinkedIn:https://www.linkedin.com/company/dataprofessor/
♇Twitter:https://twitter.com/thedataprof
♇Facebook:http://facebook.com/dataprofessor/
♇github:https://github.com/dataprofessor/
♇insta gram:*
优化企业级数据消费的策略
中间件服务,使用 ETL/ELT 和 MASA(网格应用和服务架构)的数据仓库
作为一名顾问,经常会遇到这样的客户需求:
- 我们需要消费多个信息系统的数据,所以要从它们调用多个 API 来获取所有的数据,这是一个很大的痛苦。
- 我们确实在一个数据库中有所有的数据,但是我们需要查询几十个表来将它们连接在一起以获得预期的结果。
- 我们相信我们有一个非常好的数据架构。DB 实例包含用于不同目的的多个数据库,我们以 3-norm 设计一切。然而,当我们想要跨多个数据库对整个系统进行一些统计时,这仍然是令人痛苦的。
用例
通常,三种类型的需求会导致上述问题。
BI(商业智能)仪表板
这可能是最常见的达到限制的用例。
虽然该公司仍处于初创阶段,但很快获得任何类型的数据可能都相对容易。在这个阶段,即使是 Microsoft Excel 也足以满足大多数需求。此外,不建议采用复杂的数据架构,因为这对初创企业来说成本太高。
然而,假设公司发展良好,可能会建立越来越多的部门,以及扩展更多的业务领域,数据持久层将会更加复杂。例如,财务、运输、IT 部门有多个独立的数据库。如果业务是 B2b,也可能有不同客户的多个数据库。当然,每个数据库中的表数量也可能很大。
现在,该高管希望拥有 BI 仪表板来支持决策制定。可以看出,一些高级报告可能需要涉及几个数据库中的大量表格。
业务流程中需要
同样常见的是,一些业务场景需要复杂的 SQL 查询作为流程的一部分,比如验证。
例如,公司依赖多个信息系统。在一些特定的业务场景中,我们需要根据几个信息系统来验证客户的请求。
在这种情况下,优化公司范围的数据架构会更有帮助,因为性能会影响正常的业务流程。
高级分析
如果公司是“数据驱动”的,或者其业务交易产生大量高速数据,则通常会涉及高级分析,如机器学习技术,以提高业务效率,识别潜力等。
在这种情况下,从多个系统中提取数据来训练机器学习模型或向部署的模型输入正确的数据可能是一场噩梦。
原因和可能的解决方案
塞萨尔·卡利瓦里诺·阿拉贡在 Unsplash 上拍照
主要困难/原因是:
- 查询本身可能非常复杂,包括各种技术,如连接和连接表、IF-ELSE 判断和大量条件过滤。
- 由于涉及的表太多,性能根本无法保证。
- 对于某些 DBMS,跨多个数据库运行查询可能并不容易。
根据我的经验,对于这种企业数据架构问题,有 3 种典型的解决方案。
中间件服务
经济性:★★★☆
维修性:★☆☆☆
灵活性:★☆☆☆
这个解决方案指的是构建一个中间件服务来与多个系统通信,并在返回到数据消费实体之前连接/聚合结果。
实现这一点的技术可以是多种多样的,可以是 Python、Java、Node。JS,C#,PHP 等。基于不同的前端数据消费实体,这些技术各有利弊。
这个解决方案可能是花费最少资源的一个,因为它是强烈的需求驱动的。也就是说,每当您需要另一个复杂的查询时,您要么需要向现有的中间件服务添加更多的组件,要么甚至从头开始开发一个新的组件(这可能是因为 DBMS 使用了完全不同的接口)。
因此,这种解决方案的可维护性和灵活性是最差的,尽管有时如果可以预见需求在短期内不会扩展,它仍然是最好的解决方案。
优点:
- 需求导向,只为你需要的东西开发
- 成本相对较低
缺点:
- 没有建立“平台”,因此未来新的类似需求将需要几乎相同的努力。
- 这个解决方案没有标准。如何实现完全取决于开发者。
- 对数据的每个请求都会触发对所有系统的查询,因此增加了所有现有系统/数据库的负担。
- 难以维持。
企业数据仓库
经济性:★★★☆
维修性:★★★☆
灵活性:★★★☆☆
数据仓库可能是目前业界最流行的解决方案。基本思想是建立一个系统,可以从多个信息系统中提取数据,然后将所有符合数据仓库标准(星型或雪花型模式)的数据存储在一个数据仓库中。
企业数据仓库通常包括以下组件:
- ETL/ELT 数据管道,其从各种数据源提取数据,然后转换数据到加载到数据仓库。随着大数据概念的发展,ELT 在业界越来越受欢迎,比 ETL 更受欢迎的还有 Azure 等一系列云提供商和 Apache Spark 等一堆分布式/并行计算引擎。
- 数据仓库是关于数据如何存储在 DBMS 中的另一个标准。与关注于提高插入/更新/删除性能的常规事务数据库不同,数据仓库是面向报告的,为阅读而优化。因此,从多个数据源提取数据并在存储到数据仓库之前对其进行预聚合是非常常见的,因此可以通过简单地查询几个表而不是几十个表来消耗数据。
优点:
- 这是一种“非侵入性”的解决方案。也就是说,消费请求由数据仓库来满足,因此事务系统没有额外的负担。
- 无论数据源的类型如何,在 ETL/ELT 过程中,都必须有相应的技术来从中提取数据。
- 数据可以预先转换。例如,不同的系统可能使用不同的用户性别指标(男/女、男/女、0/1 等。),但我们可以在转换中统一它们。
- 数据可以预先汇总。例如,可以在 ETL/ELT 过程中生成每日/每周/每月报告,因此消费者可以非常高效地读取可操作的数据。
- 使用 SCD(渐变维度)设计,数据仓库可以捕获数据源评估的历史。例如,如果有一个产品被移动到一个新的类别,它在数据仓库中是完全可追踪的,但是您可能会在事务数据库中丢失这个更改。
缺点:
- 数据仓库中的数据会延迟一段时间才可用。例如,如果 ETL/ELT 过程每天都在运行,那么数据每天都是最新的,直到“昨天”。
- 如果一个数据源改变了它的数据结构,ETL/ELT 需要相应地改变,这可能会导致大量的工作,以及在应用改变期间潜在的数据差异。
- 依赖于数据源特性。例如,如果原始数据源没有可靠的时间戳,ETL/ELT 过程就不能以优雅的方式实现增量加载(只加载自上次加载以来新的/更改的记录)。
MASA(网状应用和服务架构)
经济性:★☆☆☆
维护性:★★★★
灵活性:★★★★
MASA 是 Gartner 提出的一个相对较新的概念。它是从大量数据密集型企业(如优步[1])的经验中总结出来的。
令人惊讶的是,MASA 的想法更接近于第一种解决方案——中间件服务。然而,MASA 架构的重点是在企业后端系统(不面向客户)和前端系统(面向内部/外部客户)之间建立一个完整的综合 API 中介层。因此,MASA 和中间件服务之间的主要区别在于,前者旨在为不同粒度的后端系统构建统一的、系统的和可管理的服务。
MASA 架构由 3 个主要层组成[2]:
- 多粒度服务,包括所有的企业后端服务。“多粒度”意味着后端服务具有不同的规模,因此它们支持外部数据消费的能力也不同。例如,ERP/CRM 系统通常包含许多子组件,这些子组件被设计为在内部彼此紧密合作,而不是向外部提供数据。因此,确定后端服务的粒度以应用不同的策略非常重要。
- API 中介,负责将请求从外部 API(数据消费者的接口)映射到内部 API(后端服务的接口)。在两个 API 层之间的委托过程中,it 部门还需要实时转换数据,确保安全性,并监控使用情况和性能。
- 多体验应用,也称为“适合用途”应用。无论数据的最终用户是谁,目的是什么,前端的设计都应该满足他们的需求,并以期望的表示形式提供数据。
优点:
- MASA 是真正的“真实的单一来源”,因为它不像数据仓库那样以另一种形式复制数据。
- 最大限度地提高企业级所有数据消费的灵活性和敏捷性。比如可以在全公司范围内实现“自助式”数据消费。
- 理论上,数据可用性没有延迟。
缺点:
- 昂贵的
- 昂贵的
- 昂贵的
摘要
在这篇文章中,我解释了我对企业数据平台优化的看法。事实上,在一家数据驱动型公司的发展过程中,这三种解决方案都有可能被利用。也就是说,当一家公司仍处于初创阶段时,可能根本没有任何“优化”的解决方案。随着一些需求的提出,由于资源有限,公司可能会开始使用更简单的解决方案来解决这些问题。然后,随着公司越来越成熟,可能会引入数据仓库。我相信大多数公司可能只需要这种解决方案,并在很长一段时间内使用数据仓库。最后,如果该公司成为其行业的巨头,MASA 将成为最终的解决方案。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@qiuyujx/membership)
如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)
参考:
[1] Searle 等人【2017 年十大战略技术趋势:Mesh App 和服务架构。高德纳研究公司。https://www . Gartner . com/en/documents/3645328/top-10-strategic-technology-trends-for-2017-mesh-app-和
[2] B .戴利。MASA: 如何用应用、API 和服务创建一个敏捷的应用架构。高德纳研究公司。https://www . Gartner . com/en/documents/3980382/masa-how-to-create-a-agile-application-architecture-wit
Spark 加盟战略——方式和内容?
Spark 加盟的内涵& Spark 的加盟策略选择
在处理数据时,我们都处理过不同种类的连接,可能是inner
、outer
、left
或(可能是)left-semi
。本文介绍了 Spark 用来执行join
操作的不同连接策略。了解 spark join 的内部机制有助于优化复杂的 join 操作,找到一些内存不足错误的根本原因,并提高 spark 作业的性能(我们都希望如此,不是吗?).请继续阅读,找出答案。
Russ Ward 在 Unsplash 上拍摄的照片
Spark 加盟策略:
广播哈希连接
在开始广播 Hash join spark 之前,让我们先了解一下 Hash Join,一般来说:
散列连接
顾名思义,散列连接是通过首先基于较小关系的 join_key 创建一个散列表,然后遍历较大关系以匹配散列 join_key 值来执行的。此外,这仅支持“=”联接。
在 spark 中,散列连接在每个节点级别起作用,该策略用于连接节点上可用的分区。
现在,来广播散列连接。
广播散列连接
在广播散列连接中,其中一个join
关系的副本被发送到所有工作节点**,这节省了混洗成本**。当您将一个大关系与一个小关系连接时,这很有用。这也称为映射端连接(将工作节点与映射器相关联)。
当其中一个join
关系的大小小于阈值(默认为 10 M)时,Spark 部署这个连接策略。定义该阈值的火花属性是spark.sql.autoBroadcastJoinThreshold
(可配置)。
使用 BitTorrent 协议在执行者之间共享广播关系(在这里阅读更多)。这是一种对等协议,其中文件块可以由对等方彼此共享。因此,它们不需要依赖单个节点。对等协议是这样工作的:
对等协议
需要注意的事项:
- 广播的关系应该完全适合每个执行者和驱动程序的记忆。在驱动程序中,因为驱动程序将开始数据传输。
- 仅支持“=”联接。
- 支持除完全外部联接之外的所有联接类型(内部、左侧、右侧)。
- 当广播大小较小时,它通常比其他连接策略更快。
- 关系的副本在网络上广播。因此,当广播大小很大时(例如,当明确指定使用广播加入/更改默认阈值时),作为网络密集型操作可能会导致内存不足错误或性能问题。
- 广播后,您不能更改广播的关系。即使您这样做了,它们对工作节点也是不可用的(因为副本已经发布)。
洗牌哈希加入
无序散列连接
Shuffle Hash Join 涉及在同一个 executor 节点中移动具有相同连接键值的数据,然后进行 Hash Join(如上所述)。使用连接条件作为输出键,数据在执行器节点之间混洗,在最后一步,使用散列连接合并数据,因为我们知道相同键的数据将出现在同一个执行器中。
需要注意的事项:
- 仅支持“=”联接。
- 连接键不需要是可排序的(这在下面会有意义)。
- 支持除完全外部联接之外的所有联接类型。
- 在我看来,这是一种代价很高的连接方式,既涉及到洗牌又涉及到散列(如上所述的散列连接)。维护哈希表需要内存和计算。
混洗排序合并连接
让我们首先了解排序-合并连接
排序合并联接
排序连接包括,首先根据连接键对关系进行排序,然后合并两个数据集(考虑合并排序的合并步骤)。
现在,让我们来理解 spark 中的 shuffle 排序-合并连接策略:
无序排序合并连接
混洗排序-合并连接涉及混洗数据以获得相同工作者的相同 join_key,然后在工作者节点中的分区级别执行排序-合并连接操作。
需要注意的事项:
- 从 spark 2.3 开始,这是 spark 中默认的连接策略,可以用
spark.sql.join.preferSortMergeJoin
禁用。 - 仅支持“=”联接。
- 连接键需要是可排序的(显然)。
- 支持所有连接类型。
笛卡尔连接
在这个策略中,计算两个关系的笛卡尔积(类似于 SQL)来评估 join。
广播嵌套循环连接
请将此视为两种关系的嵌套循环比较:
for record_1 in relation_1:
for record_2 in relation_2:
# join condition is executed
如你所见,这可能是一个非常缓慢的策略。这通常是在无法应用其他连接类型时的后备选项。Spark 使用广播查询适当部分的[BroadcastNestedLoopJoinExe](https://jaceklaskowski.gitbooks.io/mastering-spark-sql/spark-sql-SparkPlan-BroadcastNestedLoopJoinExec.html)c
操作符来处理这个问题,因此您可以认为至少会广播一些结果来提高性能。
需要注意的事项:
- 支持“=”和非等值联接(“≤=”、“
- 支持所有连接类型
spark 如何选择加盟策略?
直接取自 spark 代码,让我们看看 spark 是如何决定加入策略的。
如果是“=”连接:
按照以下顺序查看连接提示:
1。广播提示:如果加入类型受支持,选择broadcast hash join
。
2。排序合并提示:如果连接键是可排序的,选择sort-merge join
。
3。无序散列提示:如果连接类型受支持,选择shuffle hash join
。
4。shuffle replicate NL 提示:如果连接类型是 inner like,则选择cartesian product
。如果没有提示或提示不适用
1。如果一边足够小可以广播,并且支持加入类型,则选择broadcast hash join
。
2。如果一边足够小,可以构建本地哈希映射,并且比另一边小得多,则选择shuffle hash join
,并且spark.sql.join.preferSortMergeJoin
为假。
3。如果连接键可排序,选择sort-merge join
。
4。如果连接类型是内部,选择cartesian product
。
5。选择broadcast nested loop join
作为最终解决方案。它可能会爆炸,但没有其他选择。如果不是’ =’ join:
看看加入提示,按以下顺序:
1。广播提示:挑broadcast nested loop join
。
2。shuffle replicate NL 提示:如果连接类型是 inner like,选择cartesian product
。如果没有提示或提示不适用
1。如果一边足够小,可以播放,则选择broadcast nested loop join
。
2。如果连接类型是内部相似,选择cartesian product
。
3。选择broadcast nested loop join
作为最终解决方案。它可能会爆炸,但我们别无选择。
再见。
能源物联网系统中的流学习
联合循环电厂的案例研究
图片来自https://www.pxfuel.com/en/free-photo-ebrro并获得了知识共享零许可——CC0。
联合循环电厂发电量的预测是电力和能源系统领域的一个关键挑战。这种发电量会随着环境变量而变化,例如温度、压力和湿度。因此,商业问题是如何预测作为这些环境条件的函数的电力生产,以便最大化利润。研究团体已经通过应用机器学习技术解决了这个问题,并且与传统的热力学分析相比,已经设法减少了计算和时间成本。到目前为止,这一挑战一直是从批量学习的角度来解决的,在批量学习中,假设数据是静止的,并且模型不会不断地将新信息集成到已经构建的模型中。本文介绍了一种更接近大数据和物联网范式的方法,在这种方法中,数据不断到达,模型以增量方式学习,在数据处理(时间、内存和计算成本)方面实现显著增强,并获得有竞争力的性能。本文比较和检查了几个流式回归器的每小时电功率预测,并讨论了在时间处理和预测性能方面应用于该流式场景的最佳技术。
介绍
联合循环发电厂(CCPPs)的效率是该技术在电力组合中渗透的一个关键问题。最近的一份报告[1]估计,在未来十年,涉及联合循环技术的项目数量将增加 3.1%,这一估计主要是基于 CCPPs 的高效率。CCPPs 中的电力生产预测包含许多因素,应考虑这些因素以实现准确的估计。电网运营商通常基于历史数据和环境因素(例如温度、压力和湿度)来预测电力需求。然后,他们将这些预测与可用资源进行比较,如煤、天然气、核能、太阳能、风能或水力发电厂。发电技术(如太阳能和风能)高度依赖于环境条件,所有发电技术都要进行计划内和计划外维护。因此,电网运营商面临的挑战是如何处理可用资源与实际需求之间的缺口。调峰电厂的发电量因环境条件而异,因此业务问题是预测作为气象条件函数的调峰电厂的发电量,因为这将使电网运营商能够就开启调峰电厂的数量(或是否从另一个电网购买通常昂贵的电力)进行经济权衡。
本文中提到的 CCPP 使用两台燃气轮机(GT)和一台蒸汽轮机(ST ),用同样的燃料比传统的简单循环发电厂多发电 50%。来自 GTs 的废热被输送到附近的两个 STs,产生额外的电力。在这个真实的环境中,热力学分析迫使数以千计的非线性方程的解几乎不可行,占用了太多的计算内存和时间成本。通过使用基于机器学习的方法来克服这一障碍,这是一种代替热力学方法的常用方法[2]。对其电力生产的正确预测对于电厂的效率和经济运行非常重要,并且最大化来自可用兆瓦时的收入。GTs 的可持续性和可靠性在很大程度上取决于电力生产预测,主要是在受到高盈利能力和
合同责任的约束时。
我们的观点接近真实系统,在真实系统中,快速数据可能是巨大的,它处于运动中,它是紧密相连的,并且只有有限的资源(例如时间、内存)来处理它。虽然每次有新实例可用时(批处理中发生的情况),重新训练学习算法似乎并不合适,但流观点在数据处理(更少的时间和计算成本)、算法训练(每次新实例出现时都会更新)方面引入了重大增强,并呈现了 CCPP 的现代化愿景,将其视为物联网应用,以及工业 4.0 范式的一部分。
流学习方法的相关性
大数据范式在过去十年获得了发展势头,因为它承诺为许多现实世界的应用提供有价值的见解[3]。随着这种新兴模式的出现,不仅可用数据量增加,而且数据到达速度的概念也随之增加,即这些现实世界的应用程序实时生成数据的速度比传统系统处理数据的速度更快。大数据范式的一个特例是实时分析或流学习(SL),其中可能无限的项目序列(数据流)连续到达,并且每个项目都有时间戳,因此有时间顺序。数据流一个接一个地到达,我们想要实时地建立和维护这些项目的模型(例如,预测器)。
这种情况使我们认为,我们必须处理潜在的无限且不断增长的数据集,这些数据集可能以批量实例或逐个实例的方式连续到达,这与传统系统(批量学习)形成对比,在传统系统中可以自由访问所有历史数据。这些传统的
处理系统假设数据是静态的,同时被访问。例如,数据库系统可以存储大量数据,并允许用户运行查询或事务。基于批处理的模型不会不断地将新信息集成到已经构建的模型中,而是定期从头开始重建新模型。然而,由 SL 执行的增量学习通过不断地将信息结合到它的模型中,为这种特定的流处理提供了优势,并且传统上旨在最小化处理时间和空间。由于其连续大规模和实时处理的能力,增量学习最近在大数据背景下获得了更多的关注。SL 也带来了许多新的挑战和严峻的条件:
- 在每个时刻只有单个样本(或小批量的实例)被提供给学习算法,
- 非常有限的处理时间,
- 有限的内存,以及
- 每次扫描数据流时都需要训练模型。
此外,这些数据流可能会随着时间的推移而演变,并可能偶尔受到其数据分布变化的影响(概念漂移 ) [4],迫使系统在非平稳条件下进行学习。
我们可以找到许多真实世界的 SL 应用示例,例如移动电话、工业过程控制、智能用户界面、入侵检测、垃圾邮件检测、欺诈检测、贷款推荐、监控和流量管理等。在这种背景下,物联网(IoT)已经成为 SL [5]的主要应用之一,因为它正在持续实时地产生大量数据。因此,流数据分析正在成为从每时每刻发生的事情中提取有用知识的标准,允许人们或组织在出现不便或新趋势时快速做出反应,帮助他们提高绩效。
系统描述
提议的 CCPP 由两台燃气轮机、一台蒸汽轮机和两台余热蒸汽发生器组成。在 CCPP 中,电力由 GTs 和 STs 产生,它们在一个循环中结合,并从一个涡轮机传输到另一个涡轮机。CCPP 捕捉燃气轮机的废热,以提高效率和
电力生产。基本上,CCPP 的工作原理可以描述如下(见图 1):
- 燃气轮机燃烧燃料:燃气轮机压缩空气,并将其与加热到很高温度的燃料混合。热空气燃料混合物穿过燃气轮机叶片,使它们旋转。快速旋转的涡轮驱动发电机,将一部分旋转能量转化为电能
- 热回收系统收集废气:热回收蒸汽发生器收集燃气轮机中的废气热量,否则这些热量会通过排气管逸出。热回收蒸汽发生器利用燃气轮机的废热产生蒸汽,并将其输送至蒸汽发生器
- 蒸汽轮机提供额外的电力:蒸汽轮机将其能量传送到发电机传动轴,在那里转化为额外的电力
这种类型的 CCPP 安装在世界各地越来越多的工厂中,这些工厂可以获得大量的天然气。如[3]中所述,拟建 CCPP 的设计额定发电能力为 480 兆瓦,由 2 × 160 兆瓦
ABB 13E2 燃气轮机、2 ×双压热回收蒸汽发生器和 1 × 160 兆瓦 ABB ST .燃气轮机组成。负荷对环境条件敏感;主要是环境温度(AT)、大气压力(AP)和相对湿度(RH)。然而,ST 负荷对排汽压力(或真空,V)很敏感。GTs 和 STs 的这些参数用作输入变量,GTs 和 STs 产生的电力用作本研究数据集中的目标变量。所有这些都在表 1 中进行了描述,并且对应于由图 1 中所示的传感器从测量点接收的平均每小时数据。
图一。基于[6]的联合循环发电厂的布局。HP 是高压,LP 是低压
压力,D 是汽包,G 是发生器,SH 是过热器,E 是 Evapo,EC 是 Eco,HRSG 是余热
回收蒸汽发生器。AT、AP、RH、V 和 PE 是表 1 中描述的变量。该图片属于我们在 https://www.mdpi.com/1996-1073/13/3/740/htm的开放获取出版物。
**表 1。**数据集的输入和目标变量。
我们的流学习方法
当设计 SL 算法时,我们必须考虑几个算法和统计因素。例如,我们必须面对这样一个事实,即由于我们不能存储所有的输入,我们不能撤销根据过去的数据做出的决策。在批量学习处理中,我们可以自由访问过程中收集的所有历史数据,然后我们可以应用准备技术,如预处理、变量选择或对数据集的统计分析等(见图 2)。然而,流处理的问题是无法访问整个过去的数据集,我们不得不
选择以下策略之一。
第一种是在每次接收新的一批实例或一个实例时执行准备技术,这增加了计算成本和时间处理;可能会出现这样的情况:由于新的实例不断出现,流程流无法停止以执行这一准备过程,这可能是一项具有挑战性的任务。第二个是存储第一组实例(预备实例)并执行那些预备技术和数据流分析,将结论应用于到来的实例。后一种情况在流应用于真实环境时非常常见,并且已经被本作品采用。本文稍后将展示选择第一组实例的大小(这可能取决于可用内存或我们收集或处理这些数据所花费的时间)对于在其余流中实现有竞争力的性能是如何至关重要的。
**图二。**本工程 SL 工艺方案。该图片属于我们在 https://www.mdpi.com/1996-1073/13/3/740/htm 的开放获取出版物。
一旦收集了这些第一批实例,在本文中,在流处理开始之前,将应用三种常见的准备技术来准备我们的流回归算法(SRs):变量选择、超参数调整和预训练。
我们通过使用测试-然后-训练评估,仅用到达的实例训练和测试我们的算法(参见图 3)。数据流回归通常在在线设置中进行评估,如图 3 所示,其中数据没有被分成训练集和测试集。相反,每个模型随后预测一个实例,该实例随后用于构建下一个模型。
**图三。**采用先测试后培训评估的流学习(在线学习)方案。该图片属于我们在 https://www.mdpi.com/1996-1073/13/3/740/htm的开放获取出版物。
问题的定义
产生的电功率的预测作为回归问题来处理。像每一种机器学习方法一样,SL 算法从数据集中估计独立输入变量和从属目标变量之间的未知依赖性。在我们的文章中,SRs 根据由电偶(xt,yt)(即实例)组成的数据集预测 CCPP 的发电量,并且它们建立了一个映射函数:
yˇt =(XT,yt)
利用这些夫妇。他们的目标是选择最佳函数,使系统的实际产量(yt)和基于数据集实例(训练实例)的预测产量(yˇt)之间的误差最小。
本文提供了流学习者的比较,因为在这些实时机器学习条件下,我们需要增量学习的回归方法。然后,本文确定了在当前场景中应用的最佳技术,即 CCPP 的实时电力生产预测。本文考虑了以下 SRs:
- 被动-主动回归方程
- 随机梯度下降回归器(SGDR)
- 多层感知器回归器(MLPR)
- 回归赫夫丁树
- 回归赫夫丁适应树(RHAT)
- 蒙德里安树回归器
- 蒙德里安森林回归量
实验
本文设计了一个广泛的实验基准,通过从误差度量和时间处理方面比较 7 种广泛使用的随机共振方法,找出最适合于 CCPPs 中电功率预测的随机共振方法。实验基准被分成 4 个不同的实验(见表 2 ),考虑了两个预备尺寸和两个变量选择选项。这样做的目的是在流式处理结束时,观察为准备阶段选择的实例数量的影响,并测试变量选择过程在此流式处理场景中的相关性。每个实验已经运行了 25 次,实验基准遵循了图 2 所示的方案。
表二SRs 比较的实验基准。
结果呢
数据探索性分析
输入变量(AT、V、AP、RH)对目标变量(PE)的影响不同。图 4 显示了输入和目标变量之间的相关性。一方面,我们观察到 AT 的增加如何导致 PE 的减少,散点的最小垂直分布表明它们之间有很强的反比关系。众所周知,温度升高导致的性能下降源于进气密度的降低。
**图 4。**散点图,用于可视化特征之间的相关性,以及拟合数据的线性回归模型。该图片属于我们在 https://www.mdpi.com/1996-1073/13/3/740/htm的开放获取出版物。
另一方面,我们可以看到随着 V 的增加如何产生 PE 的减少,也可以说它们之间有很强的反比关系。在这种情况下,价差略大于变量 AT,这暗示关系稍弱。这一结论也得到图 5 中相关值-0.87 的支持。从图 1 中可以看出,CCPP 使用了一个 ST,这大大提高了总的电气效率。并且当所有其他变量保持不变时,已知 V 对冷凝型涡轮机效率具有负面影响。
**图五。**热图,用于可视化特征之间的相关性。该图片属于我们在 https://www.mdpi.com/1996-1073/13/3/740/htm 的开放获取出版物。
在 AP 和 RH 的情况下,尽管 PE 随着它们的增加而增加,图 4 描绘了分散点的大的垂直分布,这表明弱的正相关关系,这也在图 5 中得到证实,其中 0.52 和 0.39 分别显示为这些变量的相关值。AP 还负责进气密度,当所有其他变量保持不变时,PE 随着 AP 的增加而增加。在 RH 的情况下,增加 GTs 的废气温度,导致 st 产生的功率增加。
SRs 比较
表 3-6 分别显示了实验 1、2、3 和 4 中每个服务请求的误差指标(MSE、RMSE、MAE、R2)和时间处理(时间),单位为秒。
**表 3。**实验 1 的结果:具有 5%预备实例的变量选择。注意,
RMSE =梅,因为所有的差异都是相等的。
**表 4。**实验 2 的结果:没有变量选择,具有 5%的预备实例。注意
RMSE =梅,因为所有的差异都是相等的。
表 5 。实验 3 的结果:具有 20%预备实例的变量选择。注意,
RMSE =梅,因为所有的差异都是相等的。
表 6。实验 4 的结果:没有变量选择,有 20%的预备实例。注意
RMSE =梅,因为所有的差异都是相等的。
现在,文章在表 7 中显示了实验 1 和 3 中变量选择过程的结果。
**表 7。**每个实验中的变量选择结果。那些选择的特征用 y
(是)表示,其余的用 n(否)表示。
讨论
讨论首先强调了在 SL 流程中具有代表性的预备实例集的相关性。如前所述,在流式场景中,不可能访问所有历史数据。然后,需要应用一些策略来对输入数据进行假设,除非发生漂移(在这种情况下,需要适应新的分布)。这些策略之一包括存储流的第一个实例(准备实例),以执行一组准备技术,使流算法为流处理做好准备。我们在工作中选择了这一战略。
预备技术有助于提高 SRs 的性能。理论上,通过选择对预测变量贡献最大的变量/特征子集(变量或特征选择),我们避免了可能对模型性能产生负面影响的不相关或部分相关的特征。通过选择最合适的算法参数(超参数调整),我们获得更好地适应数据的 SRs。并且通过在流式传输过程开始之前训练我们的 Sr(预训练,我们获得了为流式传输过程准备的具有更好性能的算法。缺点在于,我们在过程开始时收集的实例越多,就需要执行准备技术的时间越多。除了前面提到的限制之外,这是我们在每个场景中都应该考虑的一个权衡。
关于准备实例的数量,正如机器学习技术经常发生的那样,用于训练(或其他目的)的可用实例越多,SRs 的性能就越好,因为用更多的数据可以更好地表示数据分布,并且 SRs 被更多地
训练和调整以适应数据分布。但另一方面,这种情况通常会在内存大小、计算能力或流式传输过程必须开始的时刻等方面造成限制。将实验 1 和 3(见表 3 和表 5,其中执行了选择
过程,准备实例分别为数据集的 5%和 20%)与实验 2 和实验 4(见表 4 和表 6,其中未执行变量选择过程,准备实例也分别为数据集的 5%和 20%)进行比较,我们观察到在几乎所有情况下(除了 MTR 和 MFR,当执行变量选择时)当准备实例的数量较大时,误差度量如何改善。因此,通过留出一组实例用于准备目的,我们通常可以为这些流学习者获得更好的结果。
在变量选择过程的情况下,我们从表 3 和表 4 的比较中推断出,这种预备技术提高了 RHT 和 RHAT 的性能,同时也减少了它们的处理时间。对于 PAR、SGDR 和 MLPR,它实现了类似的性能,但也减少了处理时间。因此,当预备尺寸为 5%时,除了 MTR 和 MFR 之外,对它们都是推荐的。在比较表 5 和表 6 的情况下,这种预备技术提高了 PAR 和 RHAT 的性能,并且还减少了它们的处理时间。对于 SGDR、MLPR 和 RHT,性能和处理时间非常相似。因此,除了 MTR 和 MFR(当预备尺寸为 20%时)之外,它也适用于所有制造商。在关于在实验 1 和 3 中已经为流过程选择了哪些特征的内容中,我们在表 7 中看到 at 和 V 如何通过超参数调整方法优于其余的,这也在第 5.1 节中得到证实,因为它们与目标变量(PE)相关。
最后,关于最佳 SR 的选择,表 3-6 显示了在变量选择过程中,MLP 和 RHT 如何显示两种准备尺寸的最佳误差指标。当没有变量选择过程时,那么最佳误差度量是由 MFR 实现的。然而,就处理时间的
而言,SGDR 和 MTR 是最快的 stream 学习者。由于我们必须在误差度量结果和时间处理之间找到平衡,我们推荐 RHT。值得一提的是,如果我们检查性能指标(MSE、RMSE、MAE 和 R 2),RHT 显示出比 RHAT 更好的结果
,然后我们可以假设数据集中没有发生漂移。在漂移的情况下,RHAT 应该表现出比 RHT 更好的性能指标,因为它是为非稳定环境设计的。
结论
这项工作为这种场景提供了一种新的方法,在这种场景中,数据
不断到达,回归模型必须增量学习。这种方法更接近于新兴的大数据和物联网范式。所获得的结果显示了当将 SL 方法应用于该特定场景时,如何实现有竞争力的错误度量和处理时间。具体来说,这项工作已确定 RHT 为实现 CCPP 电力生产预测的最值得推荐的技术。该文章还强调了准备技术的相关性,以使流式算法为流式处理做好准备,同时强调了正确选择准备实例数量的重要性。关于特性的重要性,正如以前从批量学习角度解决相同问题的案例一样,我们建议对所有 Sr(除了 MTR 和 MFR)执行变量选择
过程,因为它减少了流处理时间,同时由于性能提升,它是值得的。
最后,作为未来的工作,我们希望将这种 SL 方法转移到联合循环电厂的其他过程中,甚至转移到其他类型的电厂中。
承认
我要感谢研究团队的其他成员(来自 UPV/EHU 的伊戈尔·巴列斯特罗斯,来自泰克纳利亚的伊萨孔·奥雷吉和哈维尔·德尔·塞尔,以及来自阿尔卡拉大学的桑丘·萨尔塞多·桑斯)。
参考
[1] 黑色和维奇。布莱克和维奇战略方向:电气报告:技术报告;布莱克和维奇:堪萨斯州,密苏里州,美国,2018。在线提供:https://www.bv.com/resources/2018-strategic-directions-电力-工业-报告(2020 年 1 月 28 日访问)
[2] 凯斯金,美国;使用软计算技术模拟热力系统。里面的 j .能源决议 2005,29,581-611。
[3] 周,周振华;北卡罗来纳州舒拉;金;Williams,G.J .大数据机遇和挑战:从数据分析角度进行讨论[论坛]。IEEE Comput。智能。玛格。2014, 9, 62–74.
[4]陆,j;刘;董,女;顾,女;伽马,j;概念漂移下的学习:一个综述。IEEE Trans。知道了。数据工程。2018, 31, 2346–2363.
[5] 德·弗朗西斯·莫拉莱斯;比费特公司;汗湖;伽马,j;物联网大数据流挖掘。2016 年 8 月 13 日至 17 日在美国加利福尼亚州旧金山举行的第 22 届 ACM SIGKDD 知识发现和数据挖掘国际会议论文集;第 2119-2120 页。
[6] Tüfekci,p .使用机器学习方法预测基本负荷运行的联合循环发电厂的全负荷电力输出。里面的伊莱克特。动力能源系统。2014, 60, 126–140.
注意
本文基于 2020 年发表在能源*期刊上的开放获取科学手稿。可在https://www.mdpi.com/1996-1073/13/3/740/htm处进入。
使用 Debezium、Kafka 和融合的 JDBC Sink Connector 将 MySQL 中的数据更改导入 ElasticSearch
如何使用 Debezium 将 MySQL 中的数据变化一步一步地导入 Elasticsearch
杰罗姆·普拉克斯在 Unsplash 上的照片
快速搜索能力,实时综合数据,现在是必要的,如果我们想建立像电子目录或电子商务。我们不希望我们的用户生气,因为他们花费大量时间只是为了从我们的门户网站获取信息。我们还希望我们的产品团队在不同的应用程序中输入的产品信息能够立即被我们的用户或客户搜索到。
比方说使用 MySQL 作为主要数据源的产品团队。我们将在门户网站中使用 ElasticSearch 作为搜索引擎服务。我们需要 MySQL 的每一个变化都会立即影响到 ElasticSearch 索引。如何达到那个要求?
在我的第一篇文章中,我将展示如何使用 Debezium、Kafka 和融合 JDBC Sink Connector 将 MySQL 中的数据更改流式传输到 ElasticSearch 中,以实现上述用例需求。感谢我的主人 Erfin Feluzy ,他把我介绍给 Debezium,并给了我写第一篇关于媒介的文章的灵感。
解决方案高级图表
解决方案 HLD 图
关于技术的简短介绍
Debezium
Debezium 是一个分布式平台,它将您现有的数据库转换成事件流,因此应用程序可以对数据库中的每个行级更改做出快速反应。Debezium 构建在 Kafka 之上,提供 Kafka Connect 兼容的连接器来监控特定的数据库管理系统。Debezium 在 Kafka 日志中记录数据更改的历史,因此您的应用程序可以在任何时候停止和重新启动,并且可以轻松地消耗它在不运行时错过的所有事件,确保所有事件都得到正确和完整的处理。
Debezium 是在 Apache 许可下的开源软件,版本 2.0
卡夫卡
Apache Kafka 是由 LinkedIn 开发的开源 流处理软件平台,捐赠给 Apache 软件基金会,用 Scala 和 Java 编写。该项目旨在为处理实时数据馈送提供一个统一、高吞吐量、低延迟的平台。
汇流 JDBC 水槽连接器
Kafka Connect Elasticsearch 接收器连接器允许将数据从 Apache Kafka 移动到 Elasticsearch。它将 Apache Kafka 中一个主题的数据写入 Elasticsearch 中的一个索引中,一个主题的所有数据都是相同的
让我们开始教程
在本教程中,我们将为每个服务使用一个单独的容器,不使用持久卷。ZooKeeper 和 Kafka 通常将它们的数据本地存储在容器中,这需要您在主机上将目录挂载为卷。因此,在本教程中,当容器停止时,所有持久化的数据都会丢失
第一步运行 Zookeeper
使用 debezium/zookeeper 映像在容器中启动 zookeeper。容器将以名称 zookeeperdbz 运行
> docker run -it — name zookeeperdbz -p 2181:2181 -p 2888:2888 -p 3888:3888 debezium/zookeeper:1.1
检查运行日志以验证 zookeeper 运行成功并监听端口2181
Starting up in standalone modeZooKeeper JMX enabled by defaultUsing config: /zookeeper/conf/zoo.cfg
.
.
.
020-05-13 17:18:28,564 - INFO [main:NIOServerCnxnFactory@686] - binding to port 0.0.0.0/0.0.0.0:2181
第二步运行卡夫卡
使用 debezium/kafka docker 映像在容器中启动 Kafka。该容器将以名称 kafkadbz 运行
> docker run -it — name kafkadbz -p 9092:9092 --link zookeeperdbz:zookeeperdbz debezium/kafka
验证 Kafka 服务器已启动
卡夫卡开始了
第三步运行 MySQL
在这个演示中,我将使用一个预配置的 Docker 映像,它也包含 Debezium 提供的样本数据。
使用 debezium/example-mysql image 在容器中启动 MySQL。容器将以名称 mysqldbz 运行
> docker run -it -d --name mysqldbz -p 3306:3306 -e MYSQL_ROOT_PASSWORD=debezium -e MYSQL_USER=mysqluser -e MYSQL_PASSWORD=mysqlpw debezium/example-mysql
上面的命令将创建一个名为 mysqldbz 的容器。
接下来,让我们执行容器,并在容器上输入交互式 bash shell。
> docker exec -it mysqldbz /bin/bash
要在 MySQL 上使用 capture CDC,Debezium 需要在我们的 MySQL 中启用 bin_log 配置。多亏了 Debezium,因为我们使用的是预配置的 MySQL Docker 映像,所以我们不再需要配置它了。让我们检查一下配置。
# more /etc/mysql/conf.d/mysql.cnf
MySQL bin_log 已启用
如您所见,bin_log 是启用的,默认情况下是禁用的。
检查样本数据库
# mysql -u root -p
Enter password: <enter your password>mysql> use inventory
Database changedmysql> show tables;
+---------------------+
| Tables_in_inventory |
+---------------------+
| addresses |
| customers |
| geom |
| orders |
| products |
| products_on_hand |
+---------------------+6 rows in set (0.00 sec)mysql> select * from customers;+------+------------+-----------+-----------------------+
| id | first_name | last_name | email |
+------+------------+-----------+-----------------------+
| 1001 | Sally | Thomas | sally.thomas@acme.com |
| 1002 | George | Bailey | gbailey@foobar.com |
| 1003 | Edward | Walker | ed@walker.com |
| 1004 | Anne | Kretchmar | annek@noanswer.org |
+------+------------+-----------+-----------------------+4 rows in set (0.00 sec)
步骤 4 启动弹性搜索服务
这里我们将使用单节点弹性和弹性版本 7.7。容器将以名称 elasticdbz 运行。
> docker run -it --name elasticdbz -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.7.0
步骤 5 启动 Debezium Kafka 连接服务
该服务公开 REST API 来管理 Debezium MySQL 连接器。容器将以名称 connectdbz 运行。
> docker run -it --name connectdbz -p 8083:8083 -e GROUP_ID=1 -e CONFIG_STORAGE_TOPIC=my_connect_configs -e OFFSET_STORAGE_TOPIC=my_connect_offsets -e STATUS_STORAGE_TOPIC=my_connect_statuses **--link zookeeperdbz:zookeeperdbz --link kafkadbz:kafkadbz --link mysqldbz:mysqldbz --link elasticdbz:elasticdbz** debezium/connect
不要忘记将该容器与 kafkadbz 、 zookeeperdbz、elasticdbz 链接,因为该服务需要与 kafkadbz 、 zookeeperdbz、elasticdbz 服务进行通信。
使用 CURL 检查 Debezium Kafka Connect 服务的状态,从响应中我们会看到我们使用的是 2.4.0 版本
> curl -H "Accept:application/json" localhost:8083/
{"version":"2.4.0","commit":"77a89fcf8d7fa018","kafka_cluster_id":"XcbUOTN_TNG4hCftkY_j3w"}
让我们注册 MySQL 连接器来监视库存数据库中的 CDC
> curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" localhost:8083/connectors/ -d '
{
"name": "inventory-connector",
"config": {
"connector.class": "io.debezium.connector.mysql.MySqlConnector",
"tasks.max": "1",
"database.hostname": "**mysqldbz**",
"database.port": "3306",
"database.user": "debezium",
"database.password": "dbz",
"database.server.id": "184054",
"database.server.name": "dbserver1",
"database.whitelist": "inventory",
"database.history.kafka.bootstrap.servers": "kafkadbz:9092",
"database.history.kafka.topic": "schema-changes.inventory"
}
}'
验证连接器是否在连接器列表中注册
> curl -H "Accept:application/json" localhost:8083/connectors/
["inventory-connector"]
现在,inventory-connector 已注册到连接器列表中
步骤 6 启动 Kafka 控制台消费者观察数据库上的变化
这一步只是为了观察数据库上的变化,如果你想消费主题,你必须写你的卡夫卡消费
部署 Debezium MySQL 连接器后,它开始监控inventory
数据库的数据变更事件。
要观看dbserver1.inventory.customers
主题,我们需要启动 Kafka 控制台消费者。容器将以名称 watcher 运行。
> docker run -it --rm --name watcher --link zookeeperdbz:zookeeperdbz --link kafkadbz:kafkadbz debezium/kafka watch-topic -a -k dbserver1.inventory.customers
运行观察器后,我们可以看到 Debezium 开始监控库存数据库,并将结果作为dbserver1.inventory.customers
主题。
Debezium 启动监视器
"payload":{"before":null,
"after":{"id":1004,
"first_name":"Anne",
"last_name":"Kretchmar",
"email":"annek@noanswer.org"
},
"source":{"version":"1.1.1.Final",
"connector":"mysql",
"name":"dbserver1",
"ts_ms":0,
"snapshot":"true",
"db":"inventory",
"table":"customers",
"server_id":0,
"gtid":null,
"file":"mysql-bin.000003",
"pos":154,
"row":0,
"thread":null,
"query":null
},
"op":"c",
"ts_ms":1589504913171,
"transaction":null}
让我们与表库存进行比较。客户
mysql> select * from customers;+------+------------+-----------+-----------------------+
| id | first_name | last_name | email |
+------+------------+-----------+-----------------------+
| 1001 | Sally | Thomas | sally.thomas@acme.com |
| 1002 | George | Bailey | gbailey@foobar.com |
| 1003 | Edward | Walker | ed@walker.com |
| **1004 | Anne | Kretchmar | annek@noanswer.org ** |
+------+------------+-----------+-----------------------+
它看起来像是 Kafka 主题中与客户库存表中的记录相匹配的最后一个事件
让我们尝试更新客户表。
mysql > UPDATE `inventory`.`customers` SET `last_name` = 'Kretchmar Kretchmer' WHERE `id` = 1004;
这是观察器中的结果
...
"payload":{
"before":{
"id":1004,
"first_name":"Anne",
"last_name":"Kretchmar",
"email":"annek@noanswer.org"
},
"after":{
"id":1004,
"first_name":"Anne",
"last_name":"Kretchmar Kretchmer",
"email":"annek@noanswer.org"
},
...
到这一步我们刚刚取得了什么?
至此,我们已经实现了 MySQL-Debezium-Kafka 的集成。当 MySQL 中有新的或更改的数据时,我们将从 Kafka 的主题中获得流式数据。
下一步是什么?
让我们开始与 ElasticSearch 整合
为了与 Elastic Search 集成,我们需要在 Debezium Kafka connect 容器上安装 Kafka Connect Elastic Sink 连接器。
步骤 7 下载 Kafka Connect 弹性汇连接器https://www . confluent . io/hub/confluent Inc/Kafka-Connect-Elastic search
步骤 8 提取下载的 zip 文件
解压缩的 zip 文件
第九步将 lib 文件夹重命名为 kafka-connect-jdbc
重命名为 kafka-connect-jdbc 后的 lib 文件夹
步骤 10 将 kafka-connect-jdbc 复制到 kafka-connect 的容器 debezium 中
> docker cp /**path-to-file**/confluentinc-kafka-connect-elasticsearch-5.5.0/kafka-connect-jdbc/* connectdbz:/kafka/connect/
步骤 11 验证所有依赖关系都已复制
> docker exec -it connectdbz /bin/bash
$ cd connect/kafka-connect-jdbc/
$ ls -all
ls-所有结果
步骤 12 重启 Debezium Kafka 连接容器
我们需要重新启动 Kafka connect 服务,使 Kafka connect 可以检测新安装的连接器插件
> docker stop connectdbz
> docker start connectdbz
步骤 13 注册 ElasticsearchSinkConnector
> curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" localhost:8083/connectors/ -d '
{
"name": "elastic-sink",
"config": {
"connector.class":
"io.confluent.connect.elasticsearch.ElasticsearchSinkConnector",
"tasks.max": "1",
"topics": "**dbserver1.inventory.customers**",
"connection.url": "http://**elasticdbz**:9200",
"transforms": "unwrap,key",
"transforms.unwrap.type": "io.debezium.transforms.UnwrapFromEnvelope",
"transforms.key.type": "org.apache.kafka.connect.transforms.ExtractField$Key",
"transforms.key.field": "id",
"key.ignore": "false",
"type.name": "customer"
}
}'
验证 ElasticsearchSinkConnector 连接器是否已在连接器列表中注册
> curl -H "Accept:application/json" localhost:8083/connectors/
["elastic-sink","inventory-connector"]
步骤 14 检查 MySQL ElasticSearch 同步
让我们检查数据库和搜索服务器是否同步。
> curl ‘[http://localhost:9200/](http://localhost:9200/customers/_search?pretty)dbserver1.inventory.customers[/_search?pretty](http://localhost:9200/customers/_search?pretty)'{
"took" : 12,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 4,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "dbserver1.inventory.customers",
"_type" : "customer",
"_id" : "1001",
"_score" : 1.0,
"_source" : {
"id" : 1001,
"first_name" : "Sally",
"last_name" : "Thomas",
"email" : "sally.thomas@acme.com"
}
},
{
"_index" : "dbserver1.inventory.customers",
"_type" : "customer",
"_id" : "1004",
"_score" : 1.0,
"_source" : {
"id" : 1004,
"first_name" : "Anne",
"last_name" : "Kretchmar Kretchme",
"email" : "annek@noanswer.org"
}
},
{
"_index" : "dbserver1.inventory.customers",
"_type" : "customer",
"_id" : "1002",
"_score" : 1.0,
"_source" : {
"id" : 1002,
"first_name" : "George",
"last_name" : "Bailey",
"email" : "gbailey@foobar.com"
}
},
{
"_index" : "dbserver1.inventory.customers",
"_type" : "customer",
"_id" : "1003",
"_score" : 1.0,
"_source" : {
"id" : 1003,
"first_name" : "Edward",
"last_name" : "Walker",
"email" : "ed@walker.com"
}
}
]
}
}
正如我们所看到的,现在 MySQL 中的所有数据都是同步的。MySQL 中的所有数据都可以在上面的弹性索引中找到。
让我们将新数据插入到 Customers 表中,看看弹性索引中会发生什么。
mysql> insert into customers values(default, 'Rizqi', 'Nugrohon', 'rizqi.nugroho@example.com');
Query OK, 1 row affected (0.05 sec)mysql> select * from customers;
+------+------------+--------------------+------------------------+| id | first_name | last_name | email |+------+------------+--------------------+-----------------------+|| 1001 | Sally | Thomas | sally.thomas@acme.com |
| 1002 | George | Bailey | gbailey@foobar.com |
| 1003 | Edward | Walker | ed@walker.com |
| 1004 | Anne | Kretchmar Kretchme | annek@noanswer.org |
| 1005 | Rizqi | Nugrohon | rizqi.nugroho@example.com |+------+------------+--------------------+---------------------------+
检查弹性指数
> curl ‘[http://localhost:9200/](http://localhost:9200/customers/_search?pretty)dbserver1.inventory.customers[/_search?pretty](http://localhost:9200/customers/_search?pretty)'{
"took" : 1476,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 5,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "dbserver1.inventory.customers",
"_type" : "customer",
"_id" : "1001",
"_score" : 1.0,
"_source" : {
"id" : 1001,
"first_name" : "Sally",
"last_name" : "Thomas",
"email" : "sally.thomas@acme.com"
}
},
...
{
"_index" : "dbserver1.inventory.customers",
"_type" : "customer",
"_id" : "1005",
"_score" : 1.0,
"_source" : {
"id" : 1005,
"first_name" : "Rizqi",
"last_name" : "Nugrohon",
"email" : "rizqi.nugroho@example.com"
}
}
]
}
}
插入带有名字 Rizqi 的 Viola 新数据
更新语句怎么样
mysql> UPDATE `inventory`.`customers` SET `last_name` = 'Adhi Nugroho' WHERE `id` = 1005;
Query OK, 1 row affected (0.05 sec)mysql> select * from customers;
+------+------------+--------------------+------------------------+| id | first_name | last_name | email |+------+------------+--------------------+-----------------------+|| 1001 | Sally | Thomas | sally.thomas@acme.com |
| 1002 | George | Bailey | gbailey@foobar.com |
| 1003 | Edward | Walker | ed@walker.com |
| 1004 | Anne | Kretchmar Kretchme | annek@noanswer.org |
| 1005 | Rizqi | Adhi Nugroho | rizqi.nugroho@example.com |+------+------------+--------------------+---------------------------+
再次检查弹性指数
> curl ‘[http://localhost:9200/](http://localhost:9200/customers/_search?pretty)dbserver1.inventory.customers[/_search?pretty](http://localhost:9200/customers/_search?pretty)'...
{
"_index" : "dbserver1.inventory.customers",
"_type" : "customer",
"_id" : "1005",
"_score" : 1.0,
"_source" : {
"id" : 1005,
"first_name" : "Rizqi",
"last_name" : "Adhi Nugroho",
"email" : "rizqi.nugroho@example.com"
}
}
]
}
}
妈妈咪呀,数据更新!!!
摘要
感谢我的师父Erfin Feluzyarticlehttps://medium . com/@ Erfin . Feluzy/tutorial-streaming-CDC-MySQL-ke-Kafka-dengan-debezium-3a1ec 9150 cf 8写的文章启发了我创作这篇文章。
最后,我们使用 Debezium 实现了 MySQL 和 ElasticSearch 的集成。我希望这个演示可以帮助您解决 MySQL DB 和 ElasticSearch 之间的数据延迟问题。现在 MySQL DB 中的所有改变都会立即影响到弹性索引。可以试着用另一个 DB 比如 PostgreSQL,Oracle,DB2,MSSQL 等。
参考:
https://medium . com/@ erfin . feluzy/tutorial-streaming-CDC-MySQL-ke-Kafka-dengan-debezium-3a1ec 9150 cf 8
https://debezium . io/documentation/reference/1.1/tutorial . html
https://docs . confluent . io/current/connect/Kafka-connect-elastic search/index . html
使用数据仓库进行流数据分析
使用 Amazon Kinesis Data Firehose、Amazon Redshift 和 Amazon QuickSight 来分析流数据
音频介绍
数据库非常适合存储和组织需要大量面向事务的查询处理的数据,同时保持数据的完整性。相反,数据仓库是为对来自一个或多个不同来源的大量数据执行数据分析而设计的。在我们这个快节奏、高度互联的世界中,这些来源通常采用 web 应用程序日志、电子商务交易、社交媒体源、在线游戏活动、金融交易交易和物联网传感器读数等连续流的形式。必须近乎实时地分析流数据,但通常首先需要清理、转换和浓缩。
在下面的帖子中,我们将演示如何使用 Amazon Kinesis Data Firehose、Amazon Redshift 和 Amazon QuickSight 来分析流数据。我们将模拟时间序列数据,从一组物联网传感器流向 Kinesis 数据消防软管。Kinesis Data Firehose 将把物联网数据写入亚马逊 S3 数据湖,然后近乎实时地复制到 Redshift。在 Amazon Redshift 中,我们将使用 Redshift 数据仓库中包含的数据来增强流式传感器数据,这些数据已经被收集并反规格化为星型模式。
邮政示范建筑
在 Redshift 中,我们可以分析数据,提出一些问题,例如,在给定的时间段内,每个传感器位置的最低、最高、平均和中值温度是多少。最后,我们将使用 Amazon Quicksight,使用丰富的交互式图表和图形来可视化红移数据,包括显示地理空间传感器数据。
特色技术
本文将讨论以下 AWS 服务。
亚马逊 Kinesis 数据消防软管
根据亚马逊的说法,亚马逊 Kinesis Data Firehose 可以捕获、转换和加载流数据到数据湖、数据存储和分析工具中。直接 Kinesis 数据消防软管集成包括亚马逊 S3、亚马逊红移、亚马逊弹性搜索服务和 Splunk。Kinesis Data Firehose 利用现有的商业智能 (BI)工具和仪表盘实现近实时分析。
亚马逊红移
根据亚马逊的说法,亚马逊红移是最流行和最快的云数据仓库。借助 Redshift,用户可以使用标准 SQL 在您的数据仓库和数据湖中查询数 Pb 的结构化和半结构化数据。Redshift 允许用户在数据湖中查询和导出数据。Redshift 可以联合查询来自 Redshift 的实时数据,也可以跨一个或多个关系数据库进行查询。
亚马逊红移光谱
据亚马逊介绍,亚马逊红移光谱可以高效地从亚马逊 S3 的文件中查询和检索结构化和半结构化数据,而无需将数据加载到亚马逊红移表中。红移光谱表是通过定义数据文件的结构并将它们注册为外部数据目录中的表来创建的。外部数据目录可以是 AWS Glue 或 Apache Hive metastore。虽然红移光谱是将数据复制到红移中进行分析的替代方法,但在本文中我们不会使用红移光谱。
亚马逊 QuickSight
据亚马逊称, Amazon QuickSight 是一种完全托管的商业智能服务,可以轻松地向组织中的每个人提供见解。QuickSight 允许用户轻松创建和发布丰富的交互式仪表盘,其中包括Amazon quick sight ML Insights。然后,可以从任何设备访问仪表板,并将其嵌入到应用程序、门户和网站中。
什么是数据仓库?
据亚马逊称,数据仓库是一个中央信息库,可以对其进行分析以做出更明智的决策。数据从事务系统、关系数据库和其他来源流入数据仓库,通常是有规律的。业务分析师、数据科学家和决策者通过商业智能工具、SQL 客户端和其他分析应用程序访问数据。
示范
源代码
这篇文章的所有源代码都可以在 GitHub 上找到。使用以下命令 git 克隆项目的本地副本。
云的形成
使用项目中包含的两个 AWS CloudFormation 模板来构建两个 CloudFormation 堆栈。请查看这两个模板并了解资源成本,然后继续。第一个 CloudFormation 模板 redshift.yml ,提供了一个新的亚马逊 VPC 以及相关的网络和安全资源、一个单节点红移集群和两个 S3 桶。第二个 CloudFormation 模板 kinesis-firehose.yml ,提供了一个 Amazon Kinesis 数据 firehose 交付流、相关的 IAM 策略和角色,以及一个 Amazon CloudWatch 日志组和两个日志流。
更改REDSHIFT_PASSWORD
值以确保您的安全。或者,更改REDSHIFT_USERNAME
值。在创建第二个堆栈之前,请确保第一个堆栈成功完成。
查看 AWS 资源
要确认所有 AWS 资源都已正确创建,请使用 AWS 管理控制台。
Kinesis 数据消防软管
在 Amazon Kinesis 仪表板中,您应该会看到新的 Amazon Kinesis Data Firehose 交付流,redshift-delivery-stream。
新的 Amazon Kinesis Firehose 交付流的 Details 选项卡应该类似于下图。请注意 IAM 角色 FirehoseDeliveryRole,它是由 CloudFormation 创建并与交付流相关联的。
我们不对传入的消息执行任何转换。注意新的 S3 桶,它是由云形成产生并与气流联系在一起的。存储桶名称是随机生成的。这个桶是传入消息将被写入的地方。
请注意 1 MB 和 60 秒的缓冲条件。每当传入消息的缓冲区大于 1 MB 或时间超过 60 秒时,消息就会使用 GZIP 压缩以 JSON 格式写入 S3。这些是最小的缓冲条件,也是我们所能得到的最接近红移的实时流。
请注意COPY
命令,该命令用于将消息从 S3 复制到 Amazon Redshift 中的message
表。Kinesis 使用由 CloudFormation 创建的 IAM 角色 ClusterPermissionsRole 作为凭证。我们使用一个清单将数据从 S3 复制到红移。据 Amazon 称,清单确保COPY
命令加载所有必需的文件,并且只加载数据加载所需的文件。清单由 Kinesis 消防软管交付流自动生成和管理。
红移星团
在 Amazon 红移控制台中,您应该看到一个新的单节点红移集群,由一个红移 dc2.large 密集计算节点类型组成。
请注意 CloudFormation 创建的新 VPC、子网和 VPC 安全组。此外,观察到红移星团可以在新 VPC 之外公开访问。
红移入口规则
单节点红移群集被分配到美国东部(N. Virginia) us-east-1 AWS 地区的 AWS 可用性区域。该群集与 VPC 安全组相关联。该安全组包含三个入站规则,都适用于红移端口 5439。与三个入站规则相关联的 IP 地址提供对以下内容的访问:1)美国东部-1 中亚马逊 QuickSight 的/27
CIDR 块,美国东部-1 中亚马逊 Kinesis Firehose 的/27
CIDR 块,以及对您而言,具有您当前 IP 地址的/32
CIDR 块。如果您的 IP 地址发生变化或者您不再使用美国东部-1 地区,您将需要更改这些 IP 地址中的一个或全部。Kinesis Firehose IP 地址列表在这里是。QuickSight IP 地址列表在这里是这里是。
如果您无法从本地 SQL 客户端连接到 Redshift,最常见的情况是,您的 IP 地址已经更改,并且在安全组的入站规则中不正确。
红移 SQL 客户端
您可以选择使用红移查询编辑器与红移进行交互,或者使用第三方 SQL 客户端以获得更大的灵活性。要访问红移查询编辑器,请使用在Redshift . ymlcloud formation 模板中指定的用户凭据。
红移控制台和红移查询编辑器中有许多有用的功能。然而,在我看来,红移查询编辑器的一个显著限制是不能同时执行多个 SQL 语句。而大多数 SQL 客户端允许同时执行多个 SQL 查询。
我更喜欢使用 JetBrains py charm IDE。PyCharm 具有与 Redshift 的现成集成。使用 PyCharm,我可以编辑项目的 Python、SQL、AWS CLI shell 和 CloudFormation 代码,所有这些都可以在 PyCharm 中完成。
如果您使用任何常见的 SQL 客户端,您将需要设置一个 JDBC (Java 数据库连接)或 ODBC(开放式数据库连接)连接到 Redshift 。ODBC 和 JDBC 连接字符串可以在红移星团的 Properties 选项卡或 CloudFormation 堆栈的 Outputs 选项卡中找到。
您还需要之前执行的aws cloudformation create-stack
AWS CLI 命令中包含的 Redshift 数据库用户名和密码。下面,我们看到 PyCharm 的项目数据源窗口包含一个红移dev
数据库的新数据源。
数据库模式和表
CloudFormation 在创建红移星团的同时,也创建了一个新的数据库,dev
。使用红移查询编辑器或您选择的 SQL 客户机,执行以下一系列 SQL 命令来创建一个新的数据库模式sensor
和sensor
模式中的六个表。
星形模式
这些表表示从一个或多个关系数据库源获取的非规范化数据。这些表格形成了一个星形模式。星型模式被广泛用于开发数据仓库。星型模式由一个或多个引用任意数量的维度表的事实表组成。location
、manufacturer
、sensor
和history
表是尺寸表。sensors
表是一个事实表。
在下图中,外键关系是虚拟的,而不是物理的。该图是使用 PyCharm 的模式可视化工具创建的。注意模式的星形。message
表是流式物联网数据最终将被写入的地方。message
表通过公共的guid
字段与sensors
事实表相关联。
S3 的样本数据
接下来,将项目中包含的样本数据复制到用 CloudFormation 创建的 S3 数据桶中。每个 CSV 格式的数据文件对应于我们之前创建的一个表。由于 bucket 名称是半随机的,我们可以使用 AWS CLI 和 jq 来获取 bucket 名称,然后使用它来执行复制命令。
AWS CLI 的输出应该如下所示。
样本数据红移
关系数据库,如亚马逊 RDS,是为在线交易处理(OLTP)而设计的,而亚马逊 Redshift 是为在线分析处理(OLAP)和商业智能应用而设计的。为了将数据写入红移,我们通常使用COPY
命令,而不是频繁的单独的INSERT
语句,就像 OLTP 一样,这会非常慢。据亚马逊称,Redshift COPY
命令利用亚马逊 Redshift 大规模并行处理(MPP)架构,从亚马逊 S3 上的文件、DynamoDB 表或一个或多个远程主机的文本输出中并行读取和加载数据。
在下面的一系列 SQL 语句中,用您的 S3 数据存储桶名称替换五处的占位符your_bucket_name
。存储桶名称将以前缀redshift-stack-databucket
开头。可以在 CloudFormation 堆栈redshift-stack
的 Outputs 选项卡中找到 bucket 名称。接下来,用 ClusterPermissionsRole 的 ARN (Amazon 资源名称)替换占位符cluster_permissions_role_arn
。ARN 的格式如下,arn:aws:iam::your-account-id:role/ClusterPermissionsRole
。ARN 可以在云生成堆栈redshift-stack
的输出选项卡中找到。
使用 Redshift 查询编辑器或您选择的 SQL 客户端,执行 SQL 语句将样本数据从 S3 复制到 Redshift dev
数据库中的每个相应表中。TRUNCATE
命令保证表格中没有以前的样本数据。
数据库视图
接下来,创建四个红移数据库视图。这些视图可能用于分析 Redshift 中的数据,以及稍后在 Amazon QuickSight 中的数据。
- sensor_msg_detail :使用 SQL 连接中的
sensors
事实表和所有五个维度表,返回聚合的传感器详细信息。 - sensor_msg_count :返回每个传感器红移收到的消息数。
- sensor_avg_temp :根据从每个传感器收到的所有信息,返回每个传感器的平均温度。
- sensor _ avg _ temp _ current:视图与前一视图相同,但仅限于最近 30 分钟。
使用红移查询编辑器或您选择的 SQL 客户端,执行以下一系列 SQL 语句。
此时,在 Redshift 中的dev
数据库的sensor
模式中,您应该总共有六个表和四个视图。
测试系统
有了所有必需的 AWS 资源和创建的红移数据库对象以及红移数据库中的样本数据,我们就可以测试系统了。包含的 Python 脚本kine sis _ put _ test _ msg . py将生成一条测试消息,并将其发送到 Kinesis Data Firehose。如果一切正常,这条消息应该会从 Kinesis Data Firehose 传送到 S3,然后复制到 Redshift,并出现在message
表中。
安装所需的 Python 包,然后执行 Python 脚本。
运行下面的 SQL 查询,确认记录在数据库dev
的message
表中。至少需要一分钟消息才会出现在红移中。
一旦确认消息出现在message
表中,通过截断该表删除记录。
流式数据
假设测试消息有效,我们可以继续模拟流式物联网传感器数据。包含的 Python 脚本,kinesis _ put _ streaming _ data . py,创建六个并发线程,代表六个温度传感器。
模拟数据使用一种算法,该算法遵循振荡的正弦波或正弦曲线,代表上升和下降的温度。在脚本中,我已经将每个线程配置为以任意偏移量开始,以给模拟数据添加一些随机性。
可以调整脚本中的变量,以缩短或延长传输模拟数据所需的时间。默认情况下,六个线程中的每一个都会为每个传感器创建 400 条消息,增量为一分钟。包括每个进行线程的偏移开始,脚本的总运行时间约为 7.5 小时,以生成 2,400 个模拟物联网传感器温度读数并推送到 Kinesis 数据消防软管。确保您能够保证在脚本的整个运行时间内保持与互联网和 AWS 的连接。我通常从一个小的 Amazon EC2 实例中在后台运行这个脚本。
要使用 Python 脚本,请执行以下两个命令之一。使用第一个命令将在前台运行脚本。使用第二个命令将在后台运行脚本。
查看output.log
文件,您应该看到在每个线程上生成的消息被发送到 Kinesis Data Firehose。每条消息都包含传感器的 GUID、时间戳和温度读数。
这些信息被发送到 Kinesis Data Firehose,后者再将信息写入 S3。这些消息是使用 GZIP 压缩以 JSON 格式编写的。下面,我们看到一个 S3 GZIP 压缩 JSON 文件的例子。JSON 文件按年、月、日和小时进行分区。
确认数据流向红移
从 Amazon Kinesis Firehose 控制台的 Metrics 选项卡,您应该可以看到传入的消息流向 S3 和 Redshift。
执行下面的 SQL 查询应该会显示越来越多的消息。
有多接近实时?
之前,我们看到了亚马逊 Kinesis Data Firehose 交付流是如何配置为以 1 MB 或 60 秒的速率缓冲数据的。每当传入消息的缓冲区大于 1 MB 或时间超过 60 秒时,消息就会被写入 S3。message
表中的每条记录都有两个时间戳。第一个时间戳 ts 是记录温度读数的时间。第二个时间戳是使用COPY
命令将消息写入 Redshift 时创建的。我们可以在 Redshift 中使用以下 SQL 查询来计算两个时间戳之间的差值(以秒为单位)。
使用红移查询的结果,我们可以在 Amazon QuickSight 中可视化结果。在我自己的测试中,我们看到在大约 7.5 小时内,对于 2,400 条消息,最小延迟是 1 秒,最大延迟是 64 秒。因此,在这种情况下,接近实时的时间大约为一分钟或更短,平均延迟大约为 30 秒。
用红移分析数据
我建议至少等待 30 分钟,让大量消息复制到 Redshift 中。随着数据流进入 Redshift,执行我们之前创建的每个数据库视图。在 Redshift 中,您应该看到流消息数据与现有的静态数据相结合。随着数据继续流入 Redshift,视图将根据当前的message
表内容显示不同的结果。
在这里,我们看到了sensor_msg_detail
视图的前十个结果。
接下来,我们看看sensor_avg_temp
视图的结果。
亚马逊 QuickSight
在最近的一篇文章中,开始使用 AWS Glue、Amazon Athena 和 QuickSight 在 AWS 上进行数据分析:第 2 部分,我详细介绍了 Amazon QuickSight 的入门。在这篇文章中,我假设你熟悉 QuickSight。
亚马逊最近增加了全套aws quicksight
API,用于与 QuickSight 交互。不过,在演示的这一部分,我们将直接在亚马逊 QuickSight 控制台中工作,而不是在 AWS CLI、AWS CDK 或 CloudFormation 中工作。
红移数据集
为了可视化来自 Amazon Redshift 的数据,我们首先在 QuickSight 中创建数据集。QuickSight 支持大量数据源用于创建数据集。我们将使用红移数据源。如果您还记得,我们为 QuickSight 添加了一个入站规则,允许我们连接到 us-east-1 中的红移星团。
我们将选择sensor
模式,这是本演示的表和视图所在的位置。
我们可以在 Redshift dev
数据库中选择任何想要用于可视化的表或视图。
下面,我们将看到两个新数据集的示例,显示在 QuickSight 数据准备控制台中。请注意 QuickSight 如何自动识别字段类型,包括日期、纬度和经度。
形象化
使用数据集,QuickSight 允许我们创建大量丰富的可视化效果。下面,我们看到来自六个温度传感器的模拟时间序列数据。
接下来,我们看一个 QuickSight 显示地理空间数据能力的例子。该图显示了每个传感器的位置以及该传感器记录的平均温度。
清理
要删除为此帖子创建的资源,请使用以下一系列 AWS CLI 命令。
结论
在这篇简短的帖子中,我们了解了如何使用 Amazon Kinesis Data Firehose 在 Amazon Redshift 中近乎实时地分析流数据。此外,我们还探索了如何在 Amazon QuickSight 中可视化这些分析的结果。对于依赖数据仓库进行数据分析但也有流数据源的客户来说,使用 Amazon Kinesis Data Firehose 或 Amazon Redshift Spectrum 是一个很好的选择。
本博客代表我自己的观点,不代表我的雇主亚马逊网络服务公司的观点。