原文:TowardsDataScience Blog
协议:CC BY-NC-SA 4.0
用人工智能解开反物质的秘密
原文:https://towardsdatascience.com/using-ai-to-unlock-the-secrets-of-antimatter-d81426c21b3e?source=collection_archive---------32-----------------------
反物质仍然是令人困惑的科学之谜之一。但人工智能可能会给它带来一些启示。照片由分形哈桑在 Unsplash
这是物质的邪恶双胞胎
M 之后——那是我们和我们周围的一切构成的所有东西。然后是反物质。它与物质具有完全相同的性质,但电荷相反。它应该在很久以前就毁灭了所有的物质——但神秘的是,它没有。物理学家正在使用人工智能来找出原因。
我们在游泳池里。当我竭尽全力的时候,你在快乐地潜水。突然你抬起头,向我喷出一股水。“啊,”我惊叫道,“你这个讨厌的小畜生!”
“你可以用反物质洗掉我的细菌,”你大喊一声,飞快地穿过水。我追着你。“你这是什么意思,”
我物理老师说的!当物质和反物质相遇时,会有一声巨响,然后两者都消失了。
当反物质遇到物质时,它会爆炸
他是对的。但是用反物质来让你的细菌消失是相当昂贵的。
“是啊,我从来没在商店里见过它……”
这是因为地球上只有两个地方产生足够大量的反物质。这些是美国的费米实验室和瑞士的欧洲粒子物理研究所。
哇,那它比黄金还稀有!”
没错。此外,把它用作清洁剂可能会有致命的后果。
“为什么,”
因为当物质和反物质相遇时,它会爆炸。物理学家解释说,根据爱因斯坦的公式, E=mc 。 E 代表能量, m 是质量, c 是光速的平方。它基本上意味着能量和质量是一回事。
反物质是一种相当容易爆炸的物质。action advance对 Unsplash 的拍照
物质和反物质都有质量。当物质和反物质相遇时,它们的质量转化为巨大的能量。这可能会非常具有爆炸性。
“好吧,那你可以这样洗掉我的细菌,”你哭着把一股水泼在我脸上。我惊讶地摇摇头。“好的,谢谢,”然后我继续我的长度。
你赶上我了。我们怎么知道反物质真的存在?
大爆炸理论预言了这一点。一开始,有很多能量。那种能量变成了物质和反物质粒子,就像反向爆炸一样。
然后物质和反物质再次湮灭为能量。但是不知何故留下了一点物质。我们是由物质组成的,我们之所以存在,只是因为其中一小部分神秘地存活了下来。
大爆炸应该在早期宇宙中创造了等量的物质和反物质。但事实并非如此
home.cern](https://home.cern/science/physics/matter-antimatter-asymmetry-problem)
“你的意思是,我们只是许多疯狂爆炸的残留物,”
原则上,是的。我们不知道为什么一些物质被遗留下来并形成了我们今天所知道的宇宙。以及为什么太空中几乎没有反物质了。
但是,如果费米实验室和欧洲粒子物理研究所的人正在制造反物质,难道他们不能把我们都毁灭吗?
不,他们制造的反物质太少了。此外,他们总是确保一切都非常安全。
“他们为什么要制造反物质?”
因为我们想知道它是如何工作的!以及它的性质是否与普通物质有所不同。这就解释了为什么大爆炸后会有物质残留。
欧洲粒子物理研究所基础实验的实验装置。由基地合作提供
但是尽管所有的实验努力,物质和反物质似乎是完全一样的。唯一的区别是它们的电荷相反。例如,质子带正电荷。反质子带负电荷,但数量完全相同。
人们测量电荷和反物质的其他属性吗?
是的。欧洲核子研究中心的基地合作是致力于这个问题的小组之一。他们将测量技术改进到令人印象深刻的程度。但是,即使在这种精确的水平上,物质和反物质似乎具有相同的属性。事实上,当我开始我的物理学家生涯时,我在那里实习了几个月。
物理学家正试图揭开我们这个时代最大的谜团之一。Billy Huynh 在 Unsplash 上拍摄的照片
哦酷!但你没有解决问题。
没有。而且不知何故,太空中也没有足够的反物质来解决这个问题。
太空中有反物质吗?
是的。来自外太空的宇宙射线由反物质组成。但它们不含那么多。总的来说,我们只在太空中发现了极小一部分反物质,相比之下,如果今天宇宙中有相同数量的物质和反物质,我们会有所期待。
那么物理学家对此做了些什么呢?
甚至更多的研究!和开发新的研究工具。
比如什么?
大型强子对撞机(LHC)的实验,世界上最大的粒子加速器在欧洲粒子…
www6.slac.stanford.edu](https://www6.slac.stanford.edu/news/2018-08-01-particle-physicists-team-ai-solve-toughest-science-problems.aspx)
比如人工智能。它可以帮助 T4 探测反物质。建造足够灵敏的探测器来探测反物质粒子是非常困难的。
“为什么,”
因为探测器是由许多电子件组成的。电子产品总是会产生噪音。探测器需要将这种噪音与反物质留下的信号区分开来。人工智能的建立极大地改善了这一点。
到目前为止,我们还没有发现物质和反物质之间的任何不对称。也许人工智能会改变这一点。
“但现在这是一个谜!”
的确如此。但我的复仇不是!”当我把一大股水泼到你脸上时,我哭了。
在 JavaScript 中使用 ObservableHQ 处理您自己的数据。
原文:https://towardsdatascience.com/using-an-observablehq-plot-in-javascript-with-your-own-data-5eabeb6224f5?source=collection_archive---------13-----------------------
使用自定义数据和极少的编码知识定制数据可视化。
World Delaunay —代码输出示例:D. Ellis
介绍
大多数人都在努力学习一门新的编程语言并立即使用它。那么,当你看到一个很酷的网络可视化,并想为它改编代码时会发生什么呢——提示:这就是 ObservableHQ 的用武之地。
Observable notebooks 允许用户使用现有代码,只调整他们感兴趣的参数,并根据他们的特定需求定制可视化。这篇文章旨在描述一个过程,在这个过程中,你可以从众多可观察到的可视化中选择一个,应用你自己的数据,并把它们放在你自己的网站上。
可视化代码
在本教程中,我们将使用一个改编版本的迈克 Bostocks 世界机场德劳内图;
可观察的示例 Fork:世界机场 Delaunay Ref。@fil/geo-delaunay Ref。jasondavies.com/maps/voronoi/airports
observablehq.com](https://observablehq.com/@wolfiex/pyobservable-example)
并将其加载到网页中。
可观察的 API
方便的是,ObservableHQ 的优秀人员提供了一个用户友好的 API,我们可以利用它——让我们不必手动复制任何代码。首先,我们可以使用以下脚本替换相关的可观察用户和笔记本名称。
<!DOCTYPE html>
<body>
<script type="module">var user = 'wolfiex' // our username
var nbk = 'pyobservable-example' // our notebook nameasync function run(){const apistr = `[https://api.observablehq.com/@${user}/${nbk}.js?v=3`](https://api.observablehq.com/@${user}/${nbk}.js?v=3`)
const notebook = await import(apistr);
const define = notebook.default}run()</script>
注意:可以用 *import define from 'https://api.observablehq.com/@wolfiex/pyobservable-example.js?v=3'*
一步完成,或者下载笔记本和 *'./mynotebook.js'*
代替网址。
可观察运行时模块
我们需要做的最后一件事是导入运行时模块,它将用于运行我们的可观察脚本。这里我们补充一下
import {Runtime, Inspector} from "[https://cdn.jsdelivr.net/npm/@observablehq/runtime@4/dist/runtime.js](https://cdn.jsdelivr.net/npm/@observablehq/runtime@4/dist/runtime.js)";
到脚本的顶部
new Runtime().module(define, Inspector.into(document.body))
在我们定义了define
之后,在 run 函数内。
显示输出
要查看输出,我们可以将代码上传到在线平台(例如 github.io )或运行本地服务器。后者可以通过使用 node、electron 或 python(如果你安装了的话)来完成。
如果使用 python,您可以启动一个简单的服务器并导航到本地主机 URL 地址127.0.0.1:8000
。
python -m SimpleHTTPServer 8000
选择我们希望显示的内容
到目前为止,我们已经嵌入了可观察笔记本的所有单,产生了下面这个笨拙的例子:
整本笔记本的杂乱进口
https://wolfiex . github . io/observable tutorial/base _ import . html
这里为了便于展示,我们只希望显示图像"chart"
和滑块"rotate"
。为此,我们在运行函数中修改了new Runtime
命令。
仅嵌入图表
我们首先只显示“图表”本身。这是通过用下面的代码片段替换运行时代码来实现的。
new Runtime().module(define, name => { if (name === "chart"){return Inspector.into(document.body)()} });
将素添加到特定位置
工业中可视化的许多应用依赖于仪表板的创建。在这里,一个页面被分成许多部分,每个部分代表不同的信息。在本例中,我们首先创建一个新的 div 素,并将其放在<body>
标签下面(脚本中是而不是)。
<div id='topmost' style='position:absolute;display:block'></div>
这里的样式告诉它,它可以占据整个屏幕,并坐在其他 DOM 素的前面。默认情况下,这将在左侧。
我们现在更新运行时代码,以包括旋转滑块(viewof rotate)
。为了可读性,我们用一个switch
语句代替多个if
语句。
new Runtime().module(define, name => { switch(name){ case "chart": return Inspector.into(document.body)(); case "viewof rotate": return Inspector.into(document.getElementById('topmost'))(); } });
这里viewof rotate
被放置在带有id = 'topmost'
的素内,而不是主体内。这会产生下面的输出,其中我们的滑块不再显示在图表下方。
对象选择输出
https://wolfiex . github . io/observable tutorial/selected _ display . html
更改单格值和数据
我们已经获得了一组可视化效果,并将它们放在我们的网页上——但是我们如何改变它们的输入来匹配我们自己的数据呢?
在分叉笔记本时,我们最初在准备本教程时做了一些更改。其中之一是引入一个fillcolour
单来确定每个圆圈的颜色。我们从探索如何改变这一点开始,然后继续提供额外的数据。
改变变量值(如颜色)
我们首先将新的运行时命令分配给一个变量名—我们将把它命名为main
:
const main = new Runtime().module(define, name => { switch(name){ case "chart": return Inspector.into(document.body)(); case "viewof rotate": return Inspector.into(document.getElementById('topmost'))(); } });
我们现在可以使用以下代码更改fillcolour
变量的值:
main.redefine("fillcolour", 'red');
为绘图提供新数据
目前,用于绘图的数据已经上传到 ObservableHQ 服务器。相反,我们可能希望在观想中使用我们自己的数据。在下面的示例中,我们已经在本地下载了airports.csv
文件(参见 points 单格中的 URL ),并将在更新图表输出之前读入并编辑它。
为了简单起见,我们使用数据驱动文档(d3) 库来读取 CSV 文件。
这已经在笔记本中使用,因此可以在代码的运行时段中提取。或者,可以用下面的脚本导入:
<script src="https://d3js.org/d3.v6.min.js"></script>
我们现在能够加载文件并更新笔记本的点单。为此,我们定义了一个“解析”函数来处理从 CSV 读取的数据。
为了区分数据集,我们还向经度添加了一个随机分量,并在使用main.redefine
函数将处理后的数据推入points
之前取 70%的纬度值。
function parsedata(data){ //convert to numerical and add randomness data = data.map(({ longitude, latitude })=> [+longitude+Math.random(), +latitude*.7]) // update points cell main.redefine("points", data ); }
和任何好的代码一样,我们实际上需要运行它。这可以通过以下方式实现:
d3.csv("./airports.csv").then(parsedata)
编辑/自定义单格值和数据
https://wolf iex . github . io/observable tutorial/local _ data . html
读取变量
有时,我们感兴趣的只是在计算/模拟过程中,每次可变变量发生变化时提取它的值。在这里,我们可以返回一些函数,而不是返回一个素进行显示:
case 'my_mutable_varname': return { fulfilled(value) { console.log(name, value); }, rejected(error) { console.error(error); } };
其中,上述每个功能的定义如下:
- 观察者。完成 ( 值),其中值是每次执行后的结果
- 观察者。如果评估失败,则拒绝 ( 错误)返回错误。
添加新的样式或变化
在本节中,我们希望应用尚未在可观察笔记本中定义的样式。例如,如果想要将旋转滑块移动到右侧,我可以从在 HTML 页面中定义一个 CSS 部分开始:
<style> .right{ float:right } </style>
接下来,我们需要告诉导入的素它属于这个类。为此,我们将开关中的 Inspector 语句更改如下。
*const main = new Runtime().module(define, name => { switch(name){ case "chart": return Inspector.into(document.body)();* *case "viewof rotate":* var item = Inspector.into( document.getElementById('topmost'))();item._node.className += ' right'; return item; *} });*
在这里,我们分解了 inspector 返回的素,并且可以完全访问它的所有属性。虽然我们可以通过item._node.style
直接访问样式组件,如果我们有多个变更,或者希望将相同的变更应用于许多项目,但是定义一个类通常更容易。
结论
这是一个完全实时的可观察笔记本,我们把它改编成了我们自己的网页。
在本教程中,我们制作了一个我们感兴趣的可视化副本,然后将其嵌入到个人网站中,并更改了其中的变量/数据。
有关 observable notebooks 或 javascript 的更多信息,请查看文档中的信息部分:
浏览和可视化数据。分享和发表你的见解。发现并获得灵感。
observablehq.com](https://observablehq.com/collection/@observablehq/observable-documentation)
代码库
每个示例使用的代码可以在下面的链接中找到。这可以使用 node(如果安装的话)使用npm i;npm start
运行,或者使用本文中的 GitHub 链接查看。
描述如何将一个可观察的笔记本嵌入到网页中的 medium 文章的材料/ …
github.com](https://github.com/wolfiex/ObservableTutorial/blob/main/base_import.html)
资源:
笔记本是一个可移植的模块,可以集成应用程序的数据和用户界面。插图:剪贴画等…
observablehq.com](https://observablehq.com/@observablehq/downloading-and-embedding-notebooks) [ 可观察总部/运行时间
Observable runtime 让您可以在任何 JavaScript 环境中运行 Observable notebooks 作为真正的反应式程序
github.com](https://github.com/observablehq/runtime)
使用分析推动明智的直觉
原文:https://towardsdatascience.com/using-analytics-to-drive-informed-intuition-114a2e08f0d4?source=collection_archive---------43-----------------------
现实世界中的数据科学
真正的价值在于知情的直觉,而分析在形成这一点上的作用是无价的
拍的照片在上爆裂
我真的相信数据和分析部门有责任在组织内做出更好的决策。很少有从业者会不同意这种观点,但是对于我们来说,真正推动我们的愿景,理解人们如何做出决策是很重要的。
人类的决策过程是模棱两可的,到了神秘的程度。研究人员都同意的一件事是所有的决定都带有情感因素,这触及了数据和分析功能的核心使命。如何利用数据来影响情绪,进而影响决策过程?
我倾向于认为,所有人都是基于一个或两个因素的组合来做决定的。这要么是直觉,要么是信息。
通过直觉做出的决定通常很快,人们甚至不考虑这个问题。这是相当哲学化的,意思是说基于直觉做出决定的人将很难解释其背后的推理。决策者常常会利用自己的感觉得出结论,而结论又是基于研究领域的一些经验。
另一方面,我们根据信息做出决策。这些决定是理性的——基于事实和数据,不幸的是,这也意味着它可能相当缓慢。决策者会经常使用报告、分析和指标来形成自己的结论。这种方法导致准确的、可量化的决策,意味着一个人可以清楚地解释背后的基本原理。
我最初的研究领域是冶金工程,作为一名应届毕业生,我在一家铁合金冶炼厂工作。我记得每当我们从熔炉中放出熔化的合金,并闻到它散发出的烟雾时,年长的守卫是如何脱掉呼吸防护装备的。他们还会观察合金缓缓流动的旗帜、*胡须、*或照亮合金上方空气的火花。根据这些指标,他们会建议更改输入材料。这是基于直觉的决策。他们使用他们的感官,但无法解释为什么他们会提出某些建议,然而这是基于多年的经验。
基于直觉和信息的决策的特征(图片由作者提供)
我对同样问题的态度略有不同。我要求从熔融合金中提取一份样本。然后需要冷却,带到实验室,如果幸运的话,几个小时后我就能拿到结果。然后,化学分析结果将被插入冶金质量平衡,根据这个模型的输出,我将对输入的材料进行更改。我的方法是基于信息的,除了基于化学基础的学术研究外,几乎没有经验支持。
那么,哪种方法是正确的呢?嗯,我发现在大多数情况下,就需要改变什么而言,老一代的守卫者是对的。然而,他们没有搞清楚的是如何量化这种变化。他们的方法导致过程中更快的变化,因此朝着过程控制的正确方向迈出了一步,但是,它也很容易在相反的方向上超出控制范围。我的方法更准确,但需要更长的时间来实现,这意味着该过程将在更长的时间内失去控制,然而,超调的可能性较小。哪种方法是正确的这个问题的答案是我们数据和分析部门需要非常清楚地了解的。
这两种方法不一定有冲突。我们应该接受这样一个事实:决策总是带有情感色彩,因此直觉总是比信息更值得信任。那绝对没问题。在某些情况下,我们根本没有浪费时间分析问题的奢侈。我们必须根据直觉迅速做出决定。这些决策不仅仅是战术性的——试想一位首席执行官需要快速决策,以确保在竞争对手抢先一步之前打入市场。
不过,在我看来,我们在数据和分析方面的作用永远不会被否定。我们总是要做出更好的决策,知道我们在决策过程中做了什么,这意味着影响情绪。我们不应该推动我们的组织做出信息驱动的决策,而应该推动信息直觉的议程。这是一个细微的差别,但价值是巨大的。通过肯定直觉,你也将能够塑造它,一旦这发生,直觉将被告知。
当我们考虑问题的高级分析解决方案时,同样的原则也应该适用。lens.ai 的创始人 Mike Bugembe 最近说,组织犯的一个 T2 的关键错误是期望数据科学家应该孤立地解决业务挑战。他提出了一个重要的观察,即成功的人工智能部署将人类经验与技术能力相结合。这证实了我们在数据和分析方法中对知情直觉的绝对需求和价值,因为我们永远无法编码所有人类经验或在决策过程中孤立情感。
总之,尽管组织应该有使决策自动化的雄心,并且主要在规定的领域中运作,但是它不应该低估工作经验的价值,以及随后基于直觉的决策。在自动化决策不可行或不可能的情况下,应该使用数据来通知直觉,并有希望对其进行加工以改进决策。
通过 TigerGraph 使用 API 数据
原文:https://towardsdatascience.com/using-api-data-with-tigergraph-ef98cc9293d3?source=collection_archive---------40-----------------------
照片来自 Pixabay 作者托尔·戴奇曼
从 PokéAPI 中提取数据并构建图表
为什么这很重要?
不幸的是,并不是互联网上的所有数据都是打包好的 CSV 文件。事实上,人们可能经常希望使用流行 API 中的数据,但是如何将这些数据加载到图形中呢?
议程
- 看看 PokéAPI 数据集
- 创建图表
- 将数据从 API 加载到您的图表中
步骤 0:设置
在这篇博客中,我们将使用 Python 3(更确切地说是 Python 3.6.9)、requests、json 和 pyTigerGraph。你既可以在 Colab 上创建一个笔记本,也可以在你的本地计算机上运行它,但是,为了这节课的目的,我建议你使用 Colab。
如果你还没有,你需要安装 pyTigerGraph。如果您使用的是 Colab,以下是安装方法:
!pip install pyTigerGraph
在这篇博客中,我们使用的是 pyTigerGraph 的 0.0.9.6.2 版本。
接下来,你要确保你已经准备好了一个盒子。如果您还没有准备好盒子,请执行以下操作:
- 转到http://tgcloud.io/。
- 单击我的解决方案。
- 单击创建新解决方案。
- “空白图表”
- 通过步骤 1-4 获得一个免费盒子;记下你的域名。
- 单击“开始解决方案”
步骤 1:探索 PokéAPI
首先,我决定使用 PokéAPI。对于那些不知道的人来说,神奇宝贝是一种流行的视频游戏和卡牌游戏,玩家收集类似动物的生物(被称为神奇宝贝)并与之战斗。
出于此图的目的,我们将添加:
- 神奇宝贝名称
- 神奇宝贝类型(水、火等。)
接下来,我们将探索数据。文档位于此处:https://pokeapi.co/docs/v2。更具体地说,我们将关注神奇宝贝端点。
神奇宝贝 API
我们将使用 Python 来创建我们的图表。我们将使用的三个库是 requests(发出请求)、json(很好地打印我们的数据)和 pyTigerGraph(处理与图形相关的一切)。
import requests import json import pyTigerGraph as tg
接下来,看看 API 的神奇宝贝部分。在本例中,向链接 https://pokeapi.co/api/v2/pokemon/12/.发出了一个 GET 请求,让我们在 Python 代码中模仿一下:
URL = "https://pokeapi.co/api/v2/pokemon/12/" # URLres = requests.get(url = URL).json() # Makes the GET Requestprint(json.dumps(res, indent = 2)) # Printing the Results
这应该会打印出一个大的 JSON 对象。我们可以通过以下方式查看物种和类型:
print(res["species"])print(res["types"])
步骤 2:在 TigerGraph 中创建图形
首先,在 TigerGraph Cloud 中启动一个空白解决方案。记下你的域名!然后,在您的代码中,创建连接:
conn = tg.TigerGraphConnection(host="https://DOMAIN.i.tgcloud.io", password="tigergraph", gsqlVersion="3.0.5", useCert=True)
我们将使用 GSQL 来创建图表。在这个例子中,我们需要两个顶点:口袋妖怪和类型。这些应该用一条边连接(POKEMON 类型)。让我们将它添加到代码中:
# Sets up connection with GSQLprint(conn.gsql('ls', options=[]))# Create Edges (POKEMON_TYPE) and Vertices (Pokemon and Type)print(conn.gsql('''CREATE VERTEX Pokemon (PRIMARY_ID name STRING) WITH primary_id_as_attribute="true"CREATE VERTEX Type (PRIMARY_ID type STRING) WITH primary_id_as_attribute="true"CREATE UNDIRECTED EDGE POKEMON_TYPE (FROM Pokemon, TO Type)''', options=[])) print(conn.gsql('''CREATE GRAPH pokemon(Pokemon, Type, POKEMON_TYPE)''', options=[])) # Create the Graph
TigerGraph 云上的模式
您现在已经创建了图表!该加载数据了!
步骤 3:从 API 加载数据
首先,您需要通过更新 graphname 和添加令牌来更新您的连接凭据。
conn.graphname = "pokemon"conn.apiToken = conn.getToken(conn.createSecret())
现在,我们将尝试向我们的图表中添加一个神奇宝贝 butterfree。这将使用我们上面提出的请求。
URL = "https://pokeapi.co/api/v2/pokemon/12/" # URLres = requests.get(url = URL).json() # Makes the GET Requestprint(json.dumps(res, indent = 2)) # Printing the Results
为此,我们将把数据“上传”(我想你可以认为是“上传”)到 TigerGraph 中。首先,我们将增加物种到口袋妖怪顶点。
conn.upsertVertex("Pokemon", res["species"]["name"], attributes={"name": res["species"]["name"] })
厉害!接下来,我们将遍历这些类型,并将神奇宝贝连接到它的所有类型。
for ty in res["types"]: conn.upsertVertex("Type", ty["type"]["name"], attributes={"type": ty["type"]["name"] }) conn.upsertEdge("Pokemon", res["species"]["name"], "POKEMON_TYPE", "Type", ty["type"]["name"])
如果一切正常,恭喜你!你完了!现在你可以添加更多的神奇宝贝到你的图表中:
for i in range(1,100): # You can change the number based on how many Pokémon you want to add URL = f"https://pokeapi.co/api/v2/pokemon/{i}/" # URL res = requests.get(url = URL).json() # We don't have any parameters. conn.upsertVertex("Pokemon", res["species"]["name"], attributes={"name": res["species"]["name"] }) for ty in res["types"]: conn.upsertVertex("Type", ty["type"]["name"], attributes={"type": ty["type"]["name"] }) conn.upsertEdge("Pokemon", res["species"]["name"], "POKEMON_TYPE", "Type", ty["type"]["name"]) print("Added " + res["species"]["name"])
前往 GraphStudio,您可以在那里查看您的图形外观!如果所有东西都装好了,那么你做到了!恭喜你。
探索一番后会是什么样子!
第四步:轮到你了!
既然我们已经完成了这个示例,那么就轮到您来探索了!挑选出任何 API,然后使用 pyTigerGraph 创建一个图形。您甚至可以尝试调用额外的端点,继续增强图形!你已经得到了这个,我很高兴看到你会开发什么!
资源
可以在 Google Colab 上查看该项目:https://Colab . research . Google . com/drive/1 eibetcgq 18 tvp 9 _ dflgjiv3 edcum 5 hs?usp =共享
利用人工智能管理城市交通:用 k-NN 算法分类
原文:https://towardsdatascience.com/using-artificial-intelligence-ai-to-manage-metropolitan-traffic-classifying-with-k-nn-f12beb11ffca?source=collection_archive---------69-----------------------
利用人工智能管理城市交通:基于 K-近邻算法+可视化工具的分类
[ 视频片段:see tala eet hala-Tuhan Sapumanage:交通系统插曲
观看 Tuhan Sapumanage 展示他的人工智能解决方案
考文垂大学学术合作单位](https://l.facebook.com/l.php?u=https%3A%2F%2Fbit.ly%2F34I2xWp%3Ffbclid%3DIwAR0UxRelz-VxucAeAGlZgQgcegDR4BJgoXmU7AGk-74fWlVasIQOASn9Ah0&h=AT2ZfoNniGpyQkLujxkYzOo4loavxyOxT41X6uN9ib7JWAyguztVYXWB7HehCRopiO9QbHBd301gOid24VLqXEs73Gp_iD4aaCMpLzMykngQah0nlTv7vkWYhpkTetJKIXGt0KlpO2B2XYjQoz7-mIrVZnRxO-wE80N0GrSEzIFSGz8h3XJTxcz8Tw6ANnW5ndTbx6hPSz-cUUKL7CLAOniWbwEWTOVws_BcEj_-rCMoqVpjsMzPfXg5iXLz_qWeCy1bTt0gMYhxrirhyRhUYqpVOk6F_vkmlzmFFNB6ua2HItf0nyWgzK9VfCLlD9PaeqJqr4l4uyvTRIHrLRKMPjZw7UO1oDc9BDKjrLBXLd8jrmdVsnWwWcF_HLwYhSDt4VoFoiUBKsXdQAUZuY_38_r4ri_r6rpcceUk42qe3grMKvCsAVLlhA-WjNsnIy4K200ClhY5uwKL0quY9RTXliLBf84SApcNC1sarmvv8y6YsJx_gUR_SdFuiWfr7gbJI5rBxYaUEcPDp2NYRef8g6059UOEzcWNTP0Qx5B5fo4AcWdXEF61QooUJEVNfw9cPzYuuAproezcoBgwfUnNaHWRKAjZI2HFacjsf_CMVVPYvUTLT6gv42_Az6s0)
介绍
作为我学术研究的一部分,我参加了名为“人工智能(AI)和人机界面(HCI)”的模块,在该模块中,我有机会提出一个人工智能系统,该系统可用于指导大都市地区的交通,以及一个仪表板,该仪表板可用于向控制中心可视化交通流状况。
后来,在 2019 年 12 月,我应邀成为斯里兰卡国家电视频道黄金时段电视节目的演讲嘉宾,该节目旨在让年轻人有机会就我们面临的一些当代问题发表意见,在当天的主题为“交通系统”的演讲中,我提出了解决方案,作为我的 5 部分解决方案的一部分。所以让我们开始吧。
关于系统— I n 非技术简化语言
不管你住在哪里,都市区的交通显然是一个在许多方面影响我们的主要问题。在微观层面上,它使我们的日常安排被高度打乱,而在宏观层面上,它造成了巨大的经济损失。更不用说,还有拥堵带来的固有的环境污染,这在《电讯报》[ 1 ]的文章中有很好的解释。
虽然有许多想法和解决方案来改善交通流量,但没有多少显示出有希望的结果。因此,作为评估的一部分,我们被要求提出一个全面的基于人工智能的解决方案来解决上述问题。
我想到的是一个集成的解决方案,它有两个主要组件。人工智能系统和一个易于理解(和直观)的可视化工具。
AI 组件用于对拥塞的严重性进行分类(标记)。一旦人工智能系统决定某个特定的路口拥堵,它就会通过使用现有的交通灯网络向司机发出信号,决定将流入该路口的交通重新路由到下一个最佳替代方案。
更不用说,最好的部分是,该解决方案的设计方式不需要额外的专用基础设施,因为所需的输入可以由大都市的 CCTVs 获取,如上所述,交通指挥可以由现有的交通灯网络完成,前提是它们可以兼容连接。从而使其在经济上更加可行。
下一个主要组件是可视化工具。受苹果设计原则和史蒂夫·乔布斯设计哲学的启发,我确保减少混乱,使可视化工具易于理解和直观。这实际上充当了一个仪表板,可以放置在控制中心来监控交通流量和状态。
控制中心可以使用优化的界面来了解与交通流量和每个交叉点的当前状态相关的重要信息。来源:谷歌地图
该界面只使用了覆盖在地图上的圆圈(像谷歌这样的供应商会为地图这样做),并且只要求用户注意两个变量;圆的颜色和圆的大小。
圆圈的大小决定了特定连接的利用率百分比(从 0–100%)。也就是说,那里的车辆数量与可能的最大数量相比。而圆圈的颜色决定了拥堵的严重程度,拥堵程度是根据过往车辆的平均速度计算出来的。
关于系统——极客的技术信息
为了开发这个系统,我们首先创建一个样本。我们使用现有的闭路电视基础设施,并向人工智能系统输入车辆移动的平均速度和在给定路口的车辆数量。接下来,我们找到相关专家,请他们尽最大努力对初始样本进行分类。他们将速度分为不同的范围,他们认为交通流是自由流动的,缓慢的和拥挤的。接下来是利用率百分比,他们可以给出使特定路口畅通、缓慢和拥堵的车辆数量。两者都是数字数据。速度是每小时英里数/公里数,利用率百分比也是一个数字百分比。
接下来,基于 k-最近邻(k-NN)的人工智能模型可以针对每个交叉点的这种数据进行训练。在此之后,当应用于现实世界时,它应该能够分类一个路口是否拥堵(理想情况下是实时的)。每当人工智能系统决定一个特定的路口是拥挤的,它就会查看可选选项表。
备选路径表是一个包含交汇点 ID 和一组优先备选路径的表。一旦最初的路口出现拥堵,软件会在考虑新定向的交通后,计算下一个最佳替代方案的预计拥堵情况。它这样做,直到找到具有最小潜在拥塞的替代方案,从而引导输入流量有效地避免拥塞。
不用说,该系统可以定期升级、检查和更新,以提高其准确性。
特别感谢我的考文垂大学人工智能讲师 Richard Hyde 博士指导我们完成该模块,并在整个模块中提供帮助,这使我能够以一等荣誉的分数完成该模块,并在三个批次中获得该模块的最高分。
这是该系统的另外两个特点…
考文垂大学学术合作单位脸书专题页面:Tuhan Sapumanage 人工智能 TVShow
[1] 考文垂大学学术合作单位—脸书官方页面
[2] CharanaTV —脸书官方页面
Charana 电视台脸书版专题报道(描述):Tuhan Sapumanage —人工智能— TVShow
Charana 电视台脸书版专题报道(视频):Tuhan Sapumanage 人工智能 TVShow
参考文献
[1] 来自电报的文章
落款,Tuhan Sapumanage —计算机(英国)理学士,CIMA Adv Dip MA,研究员—机器学习,特邀演讲人—电视&主题演讲,Blogger—AI&商业/经济学,Toastmaster,Gavelier,MUNer & Compère
LinkedIn|Twitter|Medium|脸书|insta gram|research gate
利用人工智能探测新冠肺炎
原文:https://towardsdatascience.com/using-artificial-intelligence-to-detect-covid-19-349f232b04d2?source=collection_archive---------23-----------------------
人工智能工具可以帮助各州制定更具体的新冠肺炎病预防策略,改善公共卫生。
https://www.groupe-imagerie-medicale.fr/上的原始照片
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以 这里 。
2019 年底在中国出现,这种疾病是由新型冠状病毒引起的,这种病毒属于冠状病毒。
在检测到的数万例病例中,有几例新冠肺炎是无症状的。这种病毒最常见的症状是发烧和干咳。有些人可能还会感到疼痛、头痛、呼吸困难或急促。这些症状表明急性呼吸道感染或放射学可检测到的肺部异常。我们可以使用人工智能算法来检测疾病,使用自动 X 射线分析来支持放射科医生。
为了测试人工智能在检测新冠肺炎上的表现,我使用了约瑟夫·科恩博士的团队提供的数据库。该数据可在 GitHub 上获得。
该数据库包含 152 个观察结果,是根据新冠肺炎病例的胸部 x 光或 CT 图像构建的。
导入我们将要使用的包
我们将导入必要的包。使用的主要模块将是 keras 建模。
我们导入包含图像标签的数据库和数据。
该数据库包含 127 个关于新冠肺炎病的观察结果、4 个 ARDS、2 个肺囊虫、6 个链球菌和 2 个无发现。
导入数据
我们将数据库分为两组:感染新冠肺炎病毒的患者和其他患者。
我们的观察 90%会用于学习,10%用于验证。由于我们拥有的数据有限,我们将使用数据扩充。
预处理
我们将导入图像,并将其调整为 224x224 格式。
对于建模,我们将使用 25 个时期和 8 个批次大小。预训练的 ResNet 模型将用于填充我们拥有的小图像。
对于迁移学习,其思想是使用对数百万幅图像进行训练的网络的最后一层,以填充我们可用的少数图像。
对于建模,我们将使用 ResNet 的迁移学习。
对于第一次建模,我们在验证中获得了近 80%的准确性,在学习中获得了近 75%的准确性。
在损失中,我们的价值很低。这一结果是在 50 帧的基础上获得的,可以通过更多的图像得到极大的改善。
与我们拥有的图像数量相比,建模的结果是好的。如果有足够的数据库可以达到良好的性能,这种方法可以推广,并使大规模进行新冠肺炎筛选成为可能。
来源:
[ 冠状病毒:症状、诊断、治疗| Familydoctor.org
冠状病毒是一种在动物身上发现的病毒,可以传染给人类。冠状病毒症状包括咳嗽…
familydoctor.org](https://familydoctor.org/condition/coronavirus/) [ 冠状病毒疾病 2019(新冠肺炎)-症状
如果你出现新冠肺炎的紧急警告信号,请立即就医。紧急警告标志…
www.cdc.gov](https://www.cdc.gov/coronavirus/2019-ncov/symptoms-testing/symptoms.html) [ 临床对话
播客:在新窗口播放|下载我们邀请到了 NIAID 的安东尼·福奇博士和我们一起谈论新冠肺炎,这种疾病…
podcasts.jwatch.org](https://podcasts.jwatch.org/index.php/podcast-256-anthony-fauci-talking-with-patients-about-covid-19/2020/03/10/) [ 构建 X 射线和 CT 扫描的公共新冠肺炎数据集
在新冠肺炎疫情的情况下,简化诊断是否至关重要。去年,我们的团队开发了切斯特,一个…
josephpcohen.com](https://josephpcohen.com/w/public-covid19-dataset/) [ IEEE 8023/covid-chest Xray-dataset
我们正在用胸部 x 光或 CT 图像建立一个新冠肺炎病例数据库。我们也在寻找新冠肺炎病例…
github.com](https://github.com/ieee8023/covid-chestxray-dataset)
使用关联规则进行人力资源分析
原文:https://towardsdatascience.com/using-association-rules-with-categorical-data-e984f8bb8ee4?source=collection_archive---------32-----------------------
或者:如何将 Apriori 用于购物篮商店分析之外的数据
米卡·鲍梅斯特在 Unsplash 上的照片
A 关联规则算法,如 Apriori 是一种很好的方法,可以找到数据集中经常出现的项目,并查看它们之间的关系。
这是一种无监督的机器学习模型,通常用于发现交易中的关系,例如客户购买。
如果一个项目的出现次数大于我们设置的阈值,则该项目被认为是频繁的。如果您有 100 行数据,并将阈值设置为 0.1,那么发生 10 次以上的所有数据都会显示在我们的结果中。
在这个例子中,我们将对不同类型的问题使用先验知识。我们将使用包含年龄、性别、教育水平等信息的人力资源数据集,我们将尝试找出员工没有流失时出现的常见特征。
首先快速回顾一下主要的先验要素:
支持 是一个项目出现多少次
freq(A,B)/Total置信度 是给定 A 发生的概率
freq(A,B)/freq(A)Lift 类似于 confidence 但这也说明了 B 有多受欢迎
freq(A,B)/support(A)*Support(B)
在本例中,我们将使用 Kaggle 的 IBM HR Analytics 员工流失和绩效,您可以从以下链接下载:
预测你有价值的员工的流失
www.kaggle.com](https://www.kaggle.com/pavansubhasht/ibm-hr-analytics-attrition-dataset)
这段代码将使用 MLxtend 库(http://rasbt.github.io/mlxtend/)用 Python 编写
首先,我们导入我们的库。这个项目只需要熊猫和 MLxtend 。
import pandas as pd from mlxtend.frequent_patterns import apriori from mlxtend.frequent_patterns import association_rules
在阅读完数据后,我们可以看到有 35 列需要处理,但是我们将只使用我们认为更有趣的几列。
有几个使用起来不错的列,但是它们不是分类的,所以我们能做的是为它们创建库。Pandas qcut 函数可以为我们将年龄、离家距离和小时列分成 4 个箱。
pd.qcut(df['Age'], q=4)
这段代码向我们展示了年龄列可以分为以下四类:
类别(4,区间[float64]): [(17.999,30.0] < (30.0,36.0] < (36.0,43.0】<【43.0,60.0】]
因此,我们可以像这样创建一个 Age_Range 列:
df['Age_Range'] = pd.qcut(df['Age'], q=4, labels=['<=30', '>30 <=36', '>36 <=43', '>43'])
对 DistanceFromHome 和 HourlyRate 做了同样的操作后,现在我们必须为算法准备数据。Apriori 只接受布尔值,所以我们不会发送包含“单身”、“已婚”和“离婚”值的 MaritalStatus 列,而是将它转换为 3 个不同的列,分别称为“MaritalStatus _ 单身”、“MaritalStatus _ 已婚”和“MaritalStatus _ 离婚”,其中包含 0 或 1 值。
为此,熊猫 get_dummies 函数可以用于每个需要转换的列。首先,我们将创建一个包含所有将要使用的列的列表,以及另一个包含剩余列的列表。在使用 get_dummies 之后,原始列将被删除,只有布尔列会在那里,但是,未使用的列仍然在那里,所以我们删除它们。
columns = ['Attrition', 'Age_Range', 'BusinessTravel', 'Department', 'DistanceFromHome_Range', 'Education', 'EducationField', 'EnvironmentSatisfaction', 'Gender', 'HourlyRate_Range', 'JobInvolvement', 'JobLevel', 'JobRole', 'JobSatisfaction', 'MaritalStatus']not_used_columns = list(set(df.columns.to_list()) - set(columns))df = pd.get_dummies(df, columns=columns)df.drop(labels=not_used_columns, axis=1, inplace=True)
现在我们有了一个数据框架,可以使用并生成频繁项。
我们的数据集总共有 1470 行,所以让我们开始选择 0.05 的最小支持。这意味着只有在我们的数据中发生超过73 次的结果才会被考虑。而 max_len 是 antecedents 列中生成的列组合的数量。
#Apriori min support min_support = 0.05#Max lenght of apriori n-grams max_len = 3frequent_items = apriori(df, use_colnames=True, min_support=min_support, max_len=max_len + 1)rules = association_rules(frequent_items, metric='lift', min_threshold=1)rules.head(10).sort_values(by='confidence', ascending=False)
关联规则结果
就是这样!现在,您可以看到数据集中的频繁关系。
但是,如果我们只想知道在结果列中是什么给出了‘attraction _ Yes’还是‘attraction _ No’呢?
首先,让我们看看在我们的数据帧中每种情况出现了多少次。
df['Attrition_No'].value_counts()#1 1233 #0 237 #Name: Attrition_No, dtype: int64
否的情况比是的情况多得多,所以我们在选择阈值时也需要考虑到这一点,因为一个比另一个更常见。
对于否,让我们将阈值增加到 0.1,并过滤损耗 _ 否的后续列:
#Apriori min support min_support = 0.1#Max lenght of apriori n-grams max_len = 3frequent_items = apriori(df, use_colnames=True, min_support=min_support, max_len=max_len + 1) rules = association_rules(frequent_items, metric='lift', min_threshold=1)target = '{\'Attrition_No\'}'results_attrition_no = rules[rules['consequents'].astype(str).str.contains(target, na=False)].sort_values(by='confidence', ascending=False)results_attrition_no.head(10)
关联规则结果在结果列中只有 attachment _ No
现在我们可以看到,在我们的数据集中,来自研发部门、工作级别为 2 的人出现的几率为 11%,然而几乎 95%的 都没有自然减员。
附注:前提和结果列是如下所示的冷冻集:
array([frozenset({ ’ job satisfaction _ 4 ‘,’ JobLevel_2’}),
frozenset({ ’ Department _ Research & Development ‘,’ JobLevel_2’}),
frozenset({ ’ Department _ Research & Development ‘,’ job inclusion _ 3 ‘,’ job level _ 2 ’ })……
如果您想美化它并导出这个结果,您可以使用这段代码:
df['antecedents'] = df['antecedents'].apply(lambda x: ','.join(list(x))).astype('unicode')df['antecedents'] = df['antecedents'].str.title().str.replace('_', ' ')
现在,让我们将阈值更改为 0.02,看看损耗有多少 _ 是:
关联规则结果在结果列中只有 Attrition _ Yes
信心最大的是 30 岁以下,单身,工作一级的人。但与前一个案例不同的是,这些案例中只有 45%的人出现流失。
这是对 HR 数据使用 Apriori 的基础!希望您在下一个项目中尝试一下,并在您的数据集中找到新的关系,这可以让您对您的问题有更多的见解。
你可以在这里下载所有用来创建这个帖子的笔记本:https://gist . github . com/eduardoftdo/e 3d 2 b 7 ca 4a 06 D8 d 86 b d 0 aed 5 a 1
如果您有任何问题,并希望与我联系,请随时发送消息到 https://www.linkedin.com/in/eduardo-furtado/
利用注意力进行医学图像分割
原文:https://towardsdatascience.com/using-attention-for-medical-image-segmentation-dd78825eaac6?source=collection_archive---------12-----------------------
探索最近两篇关于使用注意力进行分割的论文,获得一些直觉和一个简短的 PyTorch 实现。
注意力机制是过去几年深度学习研究的最热门领域之一,始于自然语言处理,最近出现在计算机视觉任务中。在本文中,我们将重点关注注意力如何影响最新的医学图像分割架构。为此,我们将描述最近两篇论文中提出的架构,并尝试给出一些关于发生了什么的直觉,希望它能给你一些如何将注意力应用到你自己的问题上的想法。我们还将看到简单的 PyTorch 实现。
彼得·卡斯普日克在 Unsplash 上的照片
医学图像的分割在两个要点上不同于自然图像:
- 大多数医学图像非常相似,因为它们是在标准化的环境中拍摄的,这意味着在方向、图像中的位置、像素范围等方面几乎没有变化
- 例如当试图分割肿瘤时,在阳性类像素(或体素)和阴性类之间经常存在很大的不平衡
注意:当然,代码和解释都是对论文中描述的复杂体系结构的简化,目的主要是给出一个直觉和一个好主意,而不是解释每一个细节。
1.请注意 UNet
UNet 是细分领域的首选架构,目前大多数细分领域的进展都以此架构为基础。在本文中,作者提出了一种将注意力机制应用于标准 UNet 的方法。如果你想重温一下标准的 UNet 是如何工作的,这篇文章非常适合。
1.1.提议的是什么
该架构使用标准的 UNet 作为主干,并且不改变收缩路径。改变的是扩展路径,更准确的说,是注意机制被整合到了跳过连接中。
注意事项 UNet 的框图,红色为扩展路径块。来源:注意 UNet:学习在哪里寻找胰腺
为了解释扩展路径的一个块如何工作,让我们把来自前一个块的对这个块的输入称为 g ,把来自扩展路径的跳过连接称为 x 。下面的等式总结了这个模块的工作原理。
上采样模块非常简单,而 conv 模块只是两个(卷积+批处理范数+ ReLU)模块的序列。剩下唯一需要解释的是注意力障碍。
注意模块的框图。这里的尺寸假定一个三维输入图像。来源:关注 UNet:学习去哪里寻找胰腺
- x 和 g 都被送入 1x1 卷积,使它们达到相同数量的通道,而不改变大小
- 在一个上采样操作之后(为了具有相同的大小),它们被相加并通过一个 ReLU
- 另一个 1x1 卷积和一个 sigmoid,展平为一个通道,对地图的每个部分给予 0 到 1 的重要性分数
- 然后,该注意图乘以跳过输入,以产生该注意块的最终输出
1.2.为什么有效
在 UNet 中,收缩路径可以被视为编码器,扩展路径可以被视为解码器。UNet 的有趣之处在于,跳过连接允许在解码器中直接使用编码器提取的特征。这样,当“重建”图像的掩模时,网络学会使用这些特征,因为收缩路径的特征与扩展路径的特征连接在一起。
在这种连接之前应用注意块允许网络将更多的权重放在相关的跳过连接的特征上。它允许直接连接集中于输入的特定部分,而不是馈入每个特征。
注意力分布乘以跳过连接特征图,只保留重要部分。这种注意力分布是从所谓的查询(输入)和值(跳过连接)中提取的。注意操作允许有选择地挑选包含在值中的信息。该选择基于查询。
总结一下:输入和跳过连接用于决定关注跳过连接的哪些部分。然后,我们使用跳过连接的这个子集,以及标准扩展路径中的输入。
1.3.简短实现
以下代码定义了(简化版本的)注意块和用于 UNet 扩展路径的“上行块”。“下行模块”与原始的 UNet 没有变化。
使用注意时,注意块和 UNet 的扩展路径块的简短实现。
注意:ConvBatchNorm 是 Conv2d、BatchNorm2d 和 ReLU 激活函数的序列。
2.多尺度引导注意
我们将要讨论的第二种架构比第一种更有创意。它不依赖于 UNet 架构,而是依赖于引导注意块之后的特征提取。
建议解决方案的框图。来源:医学图像分割的多尺度自引导注意
第一部分是从图像中提取特征。为此,输入图像被馈送到预训练的 ResNet,并且我们在 4 个不同的级别提取特征图。这很有意思,因为低级特征往往出现在网络的起点,高级特征出现在网络的终点,所以我们可以访问多个尺度的特征。使用双线性插值,所有的特征地图都被上采样到最大的地图的尺寸。这给了我们 4 个相同大小的特征图,它们被连接并馈入一个卷积块。这个卷积块(多尺度特征图)的输出与 4 个特征图中的每一个连接在一起,为我们提供关注块的输入,这比前面的要复杂一些。
2.1.提议的是什么
引导注意力模块依赖于位置和通道注意力模块,我们将从描述它们开始。
位置和通道注意模块框图。来源:医学图像分割的多尺度自引导注意
我们将尝试理解这些模块中发生了什么,但我们不会对这两个块中的每个操作进行太多的详细描述(这可以通过下面的代码部分来理解)。
这两个块实际上非常相似,它们之间的唯一区别在于试图从信道或位置提取信息的操作。在展平之前应用卷积会使位置更加重要,因为在卷积过程中通道的数量会减少。在通道注意模块中,由于在整形操作期间保持了通道的原始数量,因此通道的权重更大。
在每个区块中,重要的是要注意到顶部的两个分支负责提取特定的注意力分布。例如,在位置注意力模块中,我们有一个(WH)x(WH)注意力分布,其中 (i,j) 素告诉我们位置 i 对位置 j 的影响有多大。在通道模块中,我们有一个 CxC 注意力分布,它告诉我们一个通道对另一个通道的影响程度。在每个模块的第三分支中,该特定注意力分布乘以输入的变换,以获得通道或位置注意力分布。与上一篇文章一样,在给定多尺度特征上下文的情况下,注意力分布然后乘以输入,以提取输入的相关信息。然后将这两个模块的输出逐素求和,以给出最终的自我关注特征。现在让我们看看这两个模块的输出是如何在全局框架中使用的。
具有 2 个改进步骤的引导注意力模块的框图。来源:医学图像分割的多尺度自引导注意
引导注意力是通过对每个尺度(在建议的架构中为 4 个尺度)的一系列多个细化步骤来构建的。输入特征图被馈送到位置和通道输出模块,该模块输出单个特征图。它还通过自动编码器,自动编码器产生输入的重构版本。在每个模块中,注意力图由这两个输出相乘产生。该注意力图然后乘以先前产生的多尺度特征图。因此,考虑到我们工作的具体尺度,输出代表了我们应该关注多尺度的哪些部分。然后,通过将一个模块的输出与多尺度注意力地图连接起来,并将其作为下一个模块的输入,就可以得到一系列这样的引导注意力模块。
这里有两个额外的损耗是必要的,以确保优化步骤正确工作:
- 确保自动编码器正确重建输入特征图的标准重建损失
- 一种引导损失,它试图最小化输入的两个后续潜在表示之间的距离
然后,每个注意力特征通过卷积块来预测掩模。为了产生最终的预测,取四个掩模的平均值,这可以看作是各种尺度特征的模型的一种集合。
2.2.为什么有效
由于这个架构比前一个要复杂得多,所以很难理解注意力模块背后发生了什么。以下是我对各种模块的贡献的理解。
位置注意模块试图基于输入图像的多尺度表示来指定关注特定尺度特征的哪个位置。频道关注模块通过指定对哪个频道关注多少来做同样的事情。在任一个块中使用的特定操作在注意力分布中给予通道或位置信息更大的重要性。组合这两个模块给出了注意力图,该注意力图给出了每个位置-通道对的分数,即特征图的每个素。
自动编码器用于确保特征图的潜在表示不会从一个步骤到另一个步骤完全改变。由于潜在空间是低维的,所以只提取关键信息。我们不希望这些信息从一个细化步骤改变到下一个,我们只希望进行小的调整。这些不会在潜在表象中被看到。
引导注意力模块序列的使用允许最终注意力图被细化,并且逐渐使噪声消失,并且给予真正重要的区域更多的权重。
将几个这样的网络以多种尺度组合起来,可以使网络具有全局和局部特征的视野。然后将这些要素组合成多比例要素地图。关注多比例要素地图和每个特定比例有助于更好地了解哪些要素会给最终输出带来更多价值。
2.3.简短实现
位置注意模块、通道注意模块和一个引导注意块的简短实现。
外卖食品
那么,从这些文章中可以学到什么呢?注意力可以被视为一种机制,它有助于根据上下文向网络指出哪些提取的特征需要关注。
在 UNet 中,这意味着,给定在扩展路径期间提取的特征,我们应该更加关注在收缩路径期间提取的哪些特征。这有助于使跳过连接更有意义,即传递相关信息而不是每个提取的特征。在第二篇文章中,给定我们正在工作的当前尺度,我们应该关注哪些多尺度特征。
一般的想法可以应用于广泛的问题,我认为看到多个例子可以帮助更好地理解注意力是如何适应的。
参考
使用自动机器学习预测下一个将由食品药品监督管理局(FDA)批准的单克隆抗体(MAB)
原文:https://towardsdatascience.com/using-automated-machine-learning-to-predict-the-next-monoclonal-antibodies-mab-to-be-approved-by-e2e0281f50f?source=collection_archive---------44-----------------------
目标
本实验的主要目的是通过学习从 Pubmed 获得的科学摘要,使用机器学习来预测哪种 MAB 将是下一个 FDA 批准的癌症治疗蛋白。这是一个基于 NLP 的二分类问题。
次要目标是评估自动化机器学习平台在实现主要目标方面能提供什么。来自加利福尼亚州 Mountainview 的人工智能初创公司 H2O.ai (www.h2o.ai)的商用 H2O 无人驾驶人工智能 AutoML 平台被选中。
癌症单克隆抗体市场
多年来,已经开发了许多治疗策略来研究、诊断和治疗癌症。方法像手术、化疗、放疗、骨髓移植、射频消融、激素治疗、靶向药物治疗、冷冻消融和免疫治疗是癌症患者的一些可用选择。
根据联合市场研究的数据,2017 年全球癌症药物市场价值约为 970 亿美,预计到 2025 年将达到惊人的 1770 亿美。如下图所示,一种称为单克隆抗体(MAB)的蛋白质类治疗药物价值约 410 亿美:
生产单克隆抗体是一项极其费力、苛求、耗时且昂贵的工作。下图说明了 MAB 生产的简化工作流程,从发现癌症靶点到大规模生产,最后到医院治疗。
https://raw . githubusercontent . com/jonghang/jonghangassets/master/science/mab _ prod _ flow . png
数据
数据采集和处理
维基百科上发表的单克隆抗体列表被用作从 Pubmed 检索科学摘要的基础。该列表经过筛选,仅包含针对癌症的单克隆抗体。
Pubmed 搜索字符串的推荐格式用于检索摘要,如下所示:
<单克隆抗体名称>【TIAB】其中【TIAB】是检索包含搜索词的摘要和标题的搜索标签。例如,要检索 MAB 贝伐单抗的摘要,搜索字符串将是贝伐单抗【TIAB】
Pubmed 已经为 MATLAB、R 和 Python 提供了 API,使我们能够检索摘要。R API 是通过 easyPubMed 包使用的。
用于构造搜索字符串的 r 函数:
检索摘要有两个步骤:
步骤 1:检索 XML 文档:
步骤 2:使用相应的 XML 文档作为输入,通过组合每个 MAB 的多个摘要来创建数据框,添加可选的日期列,并通过唯一标识符 PMID 聚合数据:
每个 MAB 的数据框存储为单独的 CSV 文件。有 40 个 FDA 批准的单抗和 190 个未批准的单抗。检查所有 CSV 文件的质量和正确性。
然后将 CSV 文件合并成一个数据集。抽取其中的 1%作为样本外测试集。剩下的 99%按照 70:30 的拆分比例拆分为训练集和测试集,用于机器学习建模。
下图显示了数据采集和处理工作流程:
https://raw . githubusercontent . com/jonghang/jonghangassets/master/science/mab _ data _ proc _ flow . png
单克隆抗体的名字被用作停用词。在建立机器学习模型之前,将它们从摘要中删除以防止目标泄露。
数据定义
用于训练、测试和样本外评估的数据集具有以下模式:
训练集示例
自动机器学习(AUTOML)平台
本次实验使用的 AutoML 平台是前面介绍的无人驾驶 AI(DAI)H2O . AI(【】www . H2O . AI)。这是一个非常易于使用的平台,内置了最先进的机器学习算法和可解释性功能。进行这个实验是为了测试戴在处理基于自然语言处理的二分类问题(如 Pubmed 文摘)时的表现。
H2O 无人驾驶人工智能(DAI)的实验设置
DAI 提供了一个友好、直观的界面来管理数据集和配置机器学习实验。
之前准备的相关数据集上传至 DAI,并出现在 DAI 中,如下所示:
通过指定要使用的训练集和测试集、要删除的训练集中的列以及要用作目标的列来开始实验:
戴为数据科学家配置机器学习实验提供基础和专家设置。基础设置中有 4 个配置选项— 精度、时间、解释性和计分器:
在引擎盖下,戴执行了一些分析,以便对每个默认选项的值给出建议。
准确性决定了在训练阶段执行渐进演化和集成时使用哪种 ML 方法。在低精度时,戴利用更多的特征和模型,允许它们相互竞争以获得最好的模型。无人驾驶人工智能以最高的精度执行模型和特征跟踪,并从所有这些变化中进行整合( H2O 无人驾驶人工智能文档)。
时间选项根据允许的迭代次数指定了相对时间,但是如果存在收敛,DAI 可能会执行提前停止。较高的数字可能会增加完成培训的时间。
可解释性选项指定了该实验的相对可解释性。更高的值有利于更易解释的模型。改变可解释性水平会影响特征预修剪策略、单调性约束和特征工程搜索空间。在较低的可解释性,戴可能会使用更多的和更复杂的数据转换器,否则在更高的价值。
记分员指出了该实验要优化的指标。AUC 是默认的,并且一直如此。可以很容易的被其他如精度,F1,F2 等代替。
戴提供了专家设置,允许数据科学家通过访问大量其他参数来更好地控制实验。在设置的模型选项卡中,我允许戴在整个培训过程中自行使用 XGBoost GBM 、 XGBoost Dart 、 LightGBM 和 Constant 模型,同时将 TenforFlow 模型设为强制。我认为 GLM、决策树、FTRL 和 RuleFit 模型不会提供任何优势,因此将它们关闭:
abstract_cleaned 列是唯一用于训练的列,这已成为 NLP 问题。因此,在 NLP 选项卡中进行了调整。用于 NLP 的内置基于单词的卷积神经网络(CNN) 和双向门控递归单(BiGRU) 在基于字符的深度学习关闭时一直在执行。科学摘要的语言本质以及本实验的目的并不保证使用基于字符的 CNN 模型。
模型训练是通过启动实验开始的。从上传数据集到开始实验,持续时间约为 5 分钟。
开始一项实验
模型性能
模型构建完成后,会自动生成一份报告。它是作为 Microsoft Word 文档下载的。该报告描述了在该实验中构建的机器学习模型的性能。结果总结在下图中:
样本外评估
前面在数据处理工作流中描述过,1%的摘要被留出用于使用训练的 ML 模型进行样本外评估,以便数据可以尽可能接近地模拟看不见的数据。
使用阈值 0.5 将结果总结如下,其中P(FDA _ predicted . 1>= 0.5)为 1 否则为 0 :
新数据的预测
数据准备
使用单克隆抗体作为搜索关键词从 Pubmed 检索 2010 年至 2020 年发表的新摘要,如下所示:
单克隆抗体[TIAB]和“2010”[PDAT]:“2020”[PDAT]
共获得 5180 篇摘要,其中 4610 篇预测为 fda 批准的P(FDA _ approval . 1>= 0.5),570 篇预测为 FDA 未批准的P(FDA _ approval . 1<0.5)。摘要经过两个阶段的过滤:
包含用于摘要检索的 MAB 名称的摘要被排除以避免冗余
保留包含单词“单克隆”的摘要,以便仅使用与单克隆抗体研究相关的摘要
在上述过滤之后,摘要的数量减少到 1248 个,其中 980 个预测为 1,268 个预测为 0。
结果
预计将获得批准的前 10 位摘要发表于 2012 年 6 月 27 日至 2020 年 3 月 28 日之间。
通过目测预测为 1 的前 20 个摘要,用于乳腺癌和结肠直肠癌的抗表皮生长因子受体(抗 EGFR )似乎是有希望的候选者。另一个潜在的候选者是程序性细胞死亡-1 ( PD1 )是一种抑制性受体,表达在活化的 T 和 B 细胞上,靶向非小细胞肺癌。
总之,最有希望获得 FDA 批准的两种候选单克隆抗体是:
反表皮生长因子受体(反 EGFR)
程序性细胞死亡-1 蛋白(PD1)
预测摘要的层次聚类
FDA 批准的潜在 MAB 候选人现已确定。我不得不更深入地研究他们的科学研究,这些研究导致了这种候选单克隆抗体的发现。现在有可能使用数据科学技术从摘要中获取知识,而不必阅读摘要。我对预测为 1 的摘要进行了层次聚类,然后从每个聚类中提取出顶级术语,以确定是否可以从中获得新知识。r 被用来完成这项任务。
预测的 FDA 批准 1 被读入 R 数据框:
创建并清理了摘要语料库:
从语料库中移除稀疏术语并将其转换成文档术语矩阵(DTM):
DTM 被转换成便于聚类的数据框架:
由此产生的 DTM:
从 DTM 创建的数据框与源数据集相结合:
通过为后续聚类选择相关列,创建了一个新的数据子集:
使用所得到的分级模型作为输入来绘制树突图。对图进行视觉检查以确定 k 的合适值,k 是聚类的数量。当确定了合适的 k 时,在图中添加一条水平线,以指示它在何处分隔这些聚类:
提取聚类并将源数据集注入到每个聚类中,以便源数据集中的行接收相应的聚类编号:
我们创建了一个函数,通过对每个术语的频率求和来提取前 20 个术语:
产生的热门词汇如下所示。排除常见术语,如癌症、单克隆、使用等:
每个集群的顶级术语
从聚类中挖掘出的顶级术语似乎为研究 MAB 的背景提供了一些有用的见解,我们可以将这些见解转化为知识。我们能得到的大概知识如下:
集群 1 :新的单克隆抗体靶向抑制剂正在开发中。
集群 2 :针对结肠直肠癌和患者生存的抗 EGFR 单克隆抗体正在研发中。
簇 3 : PD 1 和 PDL1 是正在/已经通过在基因水平上研究其表达而开发的 MAB 靶标。这项研究涉及对免疫细胞/系统的研究。
集群 4 :可能涉及细胞周期检查点的抑制剂研究
以下目标有望获得 FDA 对癌症治疗药物的批准:
- 表皮生长因子受体(EGFR)
- 程序性细胞死亡-1
- 程序性细胞死亡配体-1(L1)
- 免疫检查点抑制剂
利益
我们可以从这项工作中获益。以下是其中的一些:
学术:学术研究人员能够计划和修改研究领域,目标和避免冗余。这有助于他们充分利用研究基金。有抱负的研究生可以在选择研究课题和导师方面做出更好的决定。
投资者:投资者能够确定投资哪个 MAB 和哪个机构,以加快新 mab 的开发。这可能会减少开发时间,增加临床试验和上市的时间。
政府:作为一个向研究人员提供财政支持的机构,它能够相应地规划预算,将资金分配到哪里。政府也可以利用这些知识来改革教育、研究、人才发展政策。医院能够更有效地为临床试验和治疗规划床位。
使用 AWS DMS 跟踪 MongoDB
原文:https://towardsdatascience.com/using-aws-dms-to-tail-mongodb-aed8dd?source=collection_archive---------29-----------------------
数据摄取
AWS DMS 作为一个持续的数据摄取工具。
AWS DMS 是一项旨在将一个数据库迁移到另一个数据库的服务。无论是本地数据库到 AWS RDS 还是 AWS EC2(自管理数据库)到 RDS。目的很简单,并且假设迁移通常是短期的。DMS 不仅允许迁移整个数据库,还允许在满载时连续复制更改的数据。
从技术上讲,对迁移任务的持续时间没有限制。拥有一个本质上无限运行的迁移任务意味着它可以用于将数据库更改流式传输到 S3。因此,让我们来看看 DMS,以及我们如何使用它来填充我们的湖泊。
AWS 数据库迁移服务
DMS 服务概念相当简单,使用起来也很简单。如果默认值保持不变,则简单。有三个主要组件:端点、复制实例和任务。
端点
端点定义了到源和目标的连接。端点可以被配置为源或目标,以便限制误用。支持各种数据库,包括 AWS DocumentDB 和 S3。
任务
任务定义将哪个源端点迁移到目标。每个任务可以将一个源迁移到一个目标。端点可以在多个任务中引用。任务还定义了是执行完整迁移还是持续复制,或者两者都执行。完整迁移会在目标系统中创建时间点快照,而持续迁移会将每个更改复制到目标系统。
还可以将任务配置为从目标中删除现有的表或将其截断。其他优化设置包括在迁移中包括和排除哪些模式和表。
任务可以在多个状态之间转换,这些状态可以恢复、暂停或重置任务。如果作为任务的一部分迁移多个表,那么如果需要,可以单独重新加载每个表。对于正在进行的复制,该任务还在内部维护一个检查点状态,用于恢复复制。
可以在每个任务中应用一些基本的转换规则。它们作用于模式、表或列,并允许重命名、删除或在名称中添加前缀和后缀。数据不能被操纵。
复制实例
这些任务需要在一些 EC2 实例上执行。DMS 不是无服务器的,但是配置只涉及创建一个实例。不需要也没有能力通过 SSH 访问实例,甚至管理它。除非需要进行大量转换,否则大多数任务都是内存受限的。DMS 实例家族是一个很好的起点。Cloudwatch 指标允许对此进行监控,并且应该用于测试和容量规划。
跟踪 MongoDB 到 S3
我假设您有一个运行副本集的 MongoDB 服务器。如果没有,您可以很容易地在 AWS EC2 或 ECS 中设置一个。我将在 EC2 上使用一个,这是我专门为这个演示设置的。
首先,我们需要创建端点。有两个:源和目标。源端点应该指向 MongoDB 主机,目标指向 S3 桶。
复制实例
首先创建复制实例使我们能够测试到源和端点的连接。实例的大小应该由内存和磁盘需求决定。限制每个实例复制的表的数量是一个很好的做法。
下面的屏幕截图显示了如何配置该实例。https://docs . AWS . Amazon . com/DMS/latest/user guide/CHAP _ replication instance . html # CHAP _ replication instance。正在创建
创建复制实例非常重要,因为复制任务无法在实例之间轻松迁移。建议使用多个复制实例,尤其是当您有多个源和 50 多个表/集合要复制时。
源端点
AWS DMS 支持大量数据源,包括所有 RDS 数据库类型、MongoDB 和 S3。
是时候创建到我们的源 MongoDB 集群的连接了。如果您有一个集群和路由器,不幸的是,您不能连接到路由器,因为无法访问oplog
集合。您需要选择一个实例进行复制。您可以选择一个辅助节点,以便写入群集的数据不受影响,但数据仍能正确复制。
对于这个演示,我有一个 MongoDB 实例运行在 EC2 实例的副本集中。下面的配置是一个例子。
有几个关键的配置选项值得讨论。首先是数据模式。DMS 支持 MongoDB 的document
或table
模式。document
模式将操作日志和文档保存为 JSON,而table
模式将其保存为 CSV。使用table
模式,可以使用nestingLevel
作为NONE
或ONE
来指定要展平的级数。
接下来是_id as a separate column
或者extractDocId
。这允许提取文档_id
作为一个新列。如果这是 false(未选中)并且数据模式被设置为document
,那么输出文件有一个包含 JSON 字符串的单列。使用extractDocId=true
,输出文件有两列 CSV 格式,第一列是_id
,第二列是字符串形式的 JSON 文档。稍后当我们查看复制任务输出时,这一点会变得更加明显。你可以在这里找到更多信息。
目标端点
AWS DMS 支持多种目标数据库类型和 S3。配置 S3 目标相当简单,如下所示。bucket folder
定义了每个表的前缀。
最重要的设置是Extra Connection Attributes
。这是针对任何目标的。您可以指定压缩、分隔符、格式等。AWS 文档对此非常详细,并提供了很好的示例。我发现CDC Path
不起作用,也许这是因为 DMS API 实际上不允许指定这个。
迁移任务
一旦定义了端点,我们需要定义一个迁移任务。迁移任务定义了哪些数据以及如何将数据从源端点复制到目标端点。迁移类型设置允许作为一次性加载或连续复制进行迁移。
这个Task Settings
很值得讨论。第一个选项是Target Table Preparation Mode
;这定义了写入目标表的行为。对于 S3,这是指前缀。Do Nothing
将添加数据,Drop Tables on Target
将删除所选表格的表格前缀,truncate
将删除表格前缀下的所有数据对象。这是任务中所有选定表的全局设置。
Include LOB Columns in Replication
控制迁移多大的二进制对象。BLOB/CLOB 字段类型可能包含难以迁移的兆字节数据。DMS 允许读取这种类型的截断形式,或者可以完全排除它们。通常情况下,Limited LOB mode
是最佳实践,但是,当目标数据库/系统能够处理这种数据类型时,也可以使用Full LOB mode
。不幸的是,S3 目标端点不支持完整的 LOB 模式。
Enable Validation
这是一个很棒的功能,但同样不被 S3 支持。对于其他数据库类型,DMS 允许验证所有数据都已被完整准确地复制。对于 S3,我们可以在查看指标时看到这一点。
简单地说,Control Tables
允许审计和记录 DMS 动作和状态。除了日志之外,这对于快速检查状态也很有用。
运行和监控任务
创建并启动任务后,数据将开始通过复制实例流动。请注意,任务创建后,复制实例不能更改。如果您需要在新的复制实例上运行任务,则需要创建新的任务。
下面是 DMS 提供的一个监控的框架,碰巧相当详细。我的 MongoDB 源代码是一个带有模拟数据的小实例。所以只有几百份文件。然而,很明显,表/集合级别的监控是可能的,并且几乎可以通过 CloudWatch 即时更新,包括所有的插入、更新和删除。满载和 CDC 指标也在任务级别单独提供。EC2 指标以及这些指标可以决定在每个复制实例上运行多少任务,以及实例类型是否需要更新。
摘要
希望本指南为您提供了一个关于 DMS 的良好起点,以及它不仅可以用于数据库迁移,还可以用于数据湖的数据接收。我已经向您展示了一个连接到 MongoDB 的示例,但是,您也可以连接与 MongoDB 兼容的 DynamoDB!随着 DMS 和 DynamoDB 新版本的发布,这将增加更多功能,包括 CDC 复制。由于 DMS 是一项托管服务,因此它更易于操作,并提供了与 Cloudwatch 的完全集成,用于监控和警报。
将数据从 Python 同步到 AWS RDS
原文:https://towardsdatascience.com/using-aws-rds-and-python-together-5718a6878e4c?source=collection_archive---------16-----------------------
通过一个简单的 Python 脚本,我们可以将数据帧传输到 AWS RDS 数据库中的一个表中。
麦克默里朱莉在 pixabay.com
什么是亚马逊网络服务?
亚马逊网络服务是亚马逊公司提供的云平台。它是数据科学家和数据工程师等职位发布中最常强调/最受欢迎的平台之一。当今世界,随着大数据的日益增长,云平台变得越来越重要。除了灵活性、速度和实用性之外,像 AWS 这样的云平台是建立在你用多少就花多少的哲学基础上的,它们的可扩展成本。很多创业公司,世界巨头,政府机构都用 AWS。
什么是 AWS RDS(关系数据库服务)?
AWS RDS 是在 AWS 平台上创建传统数据库服务的服务。它可以安装得非常快,并立即站起来。在需要的范围内,你用多少就付多少。您可以根据增加的数据大小和调整您需要的速度。
如果在 AWS 上安装 RDS 系统,就不用和硬件打交道了。您不需要在数据库设置上花费太多时间,备份等操作是自动完成的。通常你只需要使用一些参数和能力。
AWS RDS 支持 AWS Aurora、PostgreSQL、MySQL、MariaDB、ORACLE、Microsoft SQL 数据库基础设施。
卡斯帕·卡米尔·鲁宾在 Unsplash 拍摄的照片
让我们开始在 AWS RDS 上创建数据库吧!
首先我们要开一个 AWS 账户。
我们需要进入 AWS 主页注册 AWS。进入该页面后,我们继续说创建一个 AWS 帐户。在所有步骤中,我们必须正确输入我们的信息,尤其是电子邮件地址。然后我们需要输入我们的付款信息。如果你没有超出限制,AWS 的一些服务是免费的。如果您输入了付款信息,请确保您没有超出这些限制。AWS 收取 1 美的费用来验证您的支付帐户,然后将其退回。
有关详细信息,您可以按照步骤创建一个 AWS 帐户。
让我们进入 RDS 并创建数据库。
创建 AWS 帐户后,我们输入 RDS。
我们单击控制台左侧的数据库选项。我们通过在打开的页面上说创建数据库来迈出创建数据库的第一步。
我们需要在打开的页面上选择数据库基础设施。在本例中,我们将继续浏览 MySQL 。
对于我们的操作类型,我们现在选择免费层。
我们需要从 Settings 部分确定要创建的数据库名称、用户名和密码。我为这个例子创建了一个名为 experiment 的 db,并创建了一个名为 admincv 的用户。
Amazon 为要创建的数据库提供了一些标准特性。如果您是出于试用目的进行这项研究,为了不收费,最好不要打开存储自动缩放功能。如果你在亚马逊设定的限额内使用,就不会收费。
稍作等待后,系统将使数据库可用。然后在状态字段中显示为“可用”。
现在数据库出现了。
让我们进入我们创建的数据库。
这里,“连接和安全”区域中的端点和端口信息很重要,记下来很有用。然后将需要这些信息,以便我们可以从 Python 访问 DB。
现在我们切换到 Python,连接数据库!
1-我们下载我们的库。
import pandas as pd import pymysql from sqlalchemy import create_engine
2-我们输入我们的连接信息。
我们在主机区域输入上面的端点链接。我们需要选择 3306 作为端口。用户名是我们之前创建的“cvadmin”。密码是您为该用户创建的连接密码。我们的数据库名是“deneme”。在将它赋给数据库变量之后,我们完成了所有的操作。
host=’deneme.cykgvlpxbgsw.us-east-2.rds.amazonaws.com’ port=int(3306) user=”cvadmin” passw=”yourpassw” database=”deneme”
3-我们通过收集连接信息来创建引擎。
以下代码中的 user、passw 等字段依赖于我们在上一步中创建的变量。
mydb = create_engine(‘mysql+pymysql://’ + user + ‘:’ + passw + ‘@’ + host + ‘:’ + str(port) + ‘/’ + database , echo=False)
我们将数据库中的数据打印出来。
我们用 name = "hisse "命令创建了一个表,现在我们可以打印我们拥有的数据。我有一个数据框架。它给出 Bist100 股票的每日价格。也可以用另一个 DF。
stockshistoricdata.to_sql(name=”hisse”, con=mydb, if_exists = ‘replace’, index=False)
让我们通过 DBeaver 检查数据是否打印在表上!
我们的数据现在在“hisse”表中。
结论
在数据科学项目中,为什么要将 Python 中的数据压入 AWS 上的数据库?你问这个问题是对的。如果你正在用大数据工作,如果数据在一个每日或每周新数据上,并且你的 python 代码工作几分钟或小时,这些情况可能是浪费时间。
为了避免这种情况,您用 Python 创建了一个脚本,这个新数据每天都打印这个表。它不会触及旧数据。您可以连接到“hisse”表,随时处理累积的数据。您可以通过打印一天的股票数据来节省时间和 CPU ,而不是从头开始创建所有数据。此外,多个人可以在同一个工作台上工作。
希望我写的东西有用。祝阅读愉快!
资源;
https://docs . AWS . Amazon . com/Amazon rds/latest/user guide/CHAP _ Tutorials。WebServerDB.CreateDBIns
https://AWS . Amazon . com/tr/premium support/knowledge-center/create-and-activate-AWS-account/?nc1=h_ls
我的 Linkedin 个人资料;
https://www.linkedin.com/in/onur-okyol-ba253b72/
使用 AWS Sagemaker 和 Lambda 构建无服务器 ML 平台
原文:https://towardsdatascience.com/using-aws-sagemaker-and-lambda-function-to-build-a-serverless-ml-platform-f14b3ec5854a?source=collection_archive---------5-----------------------
构建一个无服务器的 ML 应用程序来预测 AWS 上的航班延误
AWS Sagemaker 徽标
大多数数据爱好者都知道如何构建和训练模型,但如何部署模型并使其在现实生活中有用,有时对于初学数据的科学家来说是一个具有挑战性的问题。幸运的是,有许多不同的平台和工具可以帮助模型部署。Amazon Sagemaker 是我的最爱之一,因为它大大减少了构建、训练和部署模型的努力和犹豫。在众多 AWS 功能和工具的帮助下,如 Lambda function、S3、Dynamo DB,构建一个工作的 ML 应用程序的整个过程只需一下鼠标。
在这篇文章中,我想演示我们如何利用 AWS 的能力来构建一个预测航班延误的无服务器 ML 应用程序。
目录
- 资料组
- 演示架构
- 创建笔记本实例
- 创建 Sagemaker 端点
- 创建 Lambda 函数
- 创建 API 端点
- 端到端测试
- 结论
资料组
该数据集来自美国交通部,包含 2018 年 721 万条飞行记录,共有 28 列。
https://www . ka ggle . com/yuanyuwendymu/airline-delay-and-cancel-data-2009-2018
由于数据量很大(721 万),我们使用 Google Bigquerry 进行数据清洗、预处理和简单的特征工程。由于这个项目的目的是演示 AWS 如何帮助模型训练和部署,我们不会花太多时间讨论如何用 Bigquerry 预处理数据(可能是未来的主题)。准备用于训练的已处理数据随后以 CSV 格式存储到 S3 存储桶中。现在我们可以开始在 AWS 上构建我们的演示了
演示架构
为了使这个应用程序有用,我们将利用 AWS API Gateway 和 Lambda 函数来构建一个 API,它接受包含航空公司信息的 HTTP POST 请求(一个真实的例子可能是一个将航空公司编号作为输入的应用程序或网站),POST 请求将触发 Lambda 函数来解析值,并将测试数据发送到部署了模型的 Sagemaker 端点。返回值将再次被 Lambda 函数解析,并将预测结果发回给用户。架构图展示了从用户输入到预测输出的端到端管道。
作者创建的架构图
创建笔记本实例
正如我们前面提到的,预处理的结果存储在一个 S3 桶中,以方便使用。但是,Sagemaker 可以使用不同渠道的数据。比如来自 AWS IoT 的 Dynamo DB、Aurora 甚至 IoT 设备数据。Sagemaker 还提供了各种工具来自动调整和选择模型。让我们首先在 Sagemaker 中创建一个 Jupyter notebook 实例。从 AWS 主页中,选择 service 并进入 Sagemaker。并且你会看到下面的选项,选择笔记本实例。
Sagemaker 控制台
如果你以前从未使用过亚马逊 SageMaker,在最初的两个月里,你可以在获得 每月 250 小时的 T2 免费等级。中号或者 t3。中型笔记本电脑用于构建您的模型,外加 50 小时 m4 。输入笔记本的名称和实例类型。如果您之前从未创建过 IAM 角色,请创建一个新角色或使用默认的 Sagemaker IAM 角色。IAM 角色控制实例的资源权限。
笔记本实例配置
亚马逊 SageMaker 内置了 Jupyter 笔记本,允许你用 Python、Julia、R 或者 Scala 写代码。我们将在这个项目中使用 Python 3。它还提供了笔记本实例启动时加载的示例笔记本列表。每个示例笔记本都有不同的用例,并包含每个步骤的详细注释。我强烈建议初学者仔细阅读这些笔记本,你会对如何使用 Sagemakers 有一个更好的想法。
Sagemaker 示例笔记本
现在让我们创建我们的笔记本,笔记本是基于乳腺癌预测. ipynb. 修改的,你可以通读原始样本。记得更改 S3 存储桶名称和 CSV 文件以匹配您的名称。
创建 Sagemaker 端点
最后一行代码将删除从笔记本中创建的端点,让我们先注释掉最后一行。然后,您可以通过 Run All 或使用 Shift 和 Enter 键逐步运行单格来执行笔记本。通过运行笔记本,模型被训练和部署,并创建了一个 Sagemaker 端点。您可以从 Amazon SageMaker 控制台查看这个端点。您可以将默认端点名称更改为更有意义的名称。
创建 Lambda 函数
现在我们有了一个 SageMaker 端点。让我们创建一个 Lambda 函数来调用端点。它将解析 HTTP POST 请求,撤销 Sagemaker 端点,返回预测,解析结果并将其发送回用户。Lambda 可以使用 boto 3 sage maker-runtime . invoke _ endpoint()来调用端点
AWS Lambda 是一个有用的工具,允许开发人员基于每次使用的成本来构建无服务器功能。您还将受益于 FaaS 更快的开发速度、更简单的操作管理和可伸缩性。从 Lambda 函数中,从头选择作者。输入您的函数名,为此项目选择 Python 3.6。记住,选择 IAM 执行角色时,要使用一个策略,该策略允许您的函数调用 sagemaker 端点。
Lambda 功能配置
下面是 Lambda 函数的代码,它使用 ENDPOINT_NAME 作为环境变量,保存 SageMaker 端点的名称。记得在环境变量部分将变量分配给端点名称。
设置环境变量
import os import io import boto3 import json import csv# grab environment variables ENDPOINT_NAME = os.environ['ENDPOINT_NAME'] runtime= boto3.client('runtime.sagemaker')def lambda_handler(event, context): print("Received event: " + json.dumps(event, indent=2)) data = json.loads(json.dumps(event)) payload = data['data'] print(payload) response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME, ContentType='text/csv', Body=payload) print('res is !!!!') print(response) result = json.loads(response['Body'].read().decode()) print('result is!!!!') print(result) pred = int(result['predictions'][0]['score']) #pred = int(result['predictions'][0]) predicted_label = 'delay' if pred == 1 else 'no delay' return predicted_label
创建 API 端点
现在我们已经准备好了 Lambda 函数,让我们创建 API 来接收 HTTP 请求并集成一切。您可以按照 AWS 文档从 API Gateway 创建 API。或者只是按照这些简单的步骤。
- 打开 AWS API 网关控制台。选择创建 API 选择一个 API 名称,您可以将端点类型设为区域。选择创建 API。
创建新的 API
2.接下来,创建一个资源从动作下拉列表中选择,当资源被创建时,从同一个列表中选择创建方法来创建一个 POST 方法。
创建方法
3.在出现的屏幕上,输入以下内容:对于集成类型,选择 Lambda Function。对于 Lambda 函数,输入您创建的函数
4.设置完成后,将 API 部署到一个阶段。从动作下拉列表中,选择部署 API 。
部署 API
5.在出现的页面上,创建一个新阶段。并选择部署,这一步将为您提供调用 URL。
API 流程
端到端测试
现在我们已经构建了一个无服务器的 ML 管道,它可以从 HTTP POST 获取用户数据,并从我们部署的模型返回 ML 预测结果。我们可以在邮递员身上测试。Postman 是一个接口测试工具。做接口测试的时候,Postman 就像一个客户端。它可以模拟用户发起的各种 HTTP 请求,将请求数据发送到服务器,获得相应的响应结果,并验证响应中的结果数据是否与期望值匹配。现在,我们发送一个 POST 请求到上一步创建的调用 Url,它触发 Lambda 函数并调用我们的 Sagemaker 端点来进行预测。我们可以看到,我们得到的结果是“不成交”
邮递员测试
总结思路
AWS Sagemaker 是所有级别的数据科学家和 ML 应用程序开发人员实现健壮和完整的端到端 ML 解决方案的一个很好的工具。它可以自动化许多繁琐的工作,如超参数调整,模型选择,甚至数据标记。在 Lambda 函数的帮助下,ML 应用程序可以具有高度的灵活性和成本效益。
感谢您的阅读,我期待听到您的问题和想法。如果你想了解更多关于数据科学和云计算的知识,可以在 Linkedin 上找我。
乔·塞拉斯在 Unsplash 上的照片
参考
https://docs.aws.amazon.com/sagemaker/
https://AWS . Amazon . com/blogs/machine-learning/call-an-Amazon-sagemaker-model-endpoint-using-Amazon-API-gateway-and-AWS-lambda/
在 Python 中为预定消息使用 AWS SQS
原文:https://towardsdatascience.com/using-aws-sqs-for-scheduled-message-in-python-3ca4e?source=collection_archive---------31-----------------------
新闻捕手
如何开始使用 Lambda、S3 和 SQS 等 AWS 服务来创建新产品
Melanie Pongratz 在 Unsplash 上的照片
对于数据即服务产品来说,有时候,架构比想法本身更重要。这正是我们和朋友一起开发的产品的情况。Newscatcher 是一个 API,用于搜索在线发布的新闻文章。换句话说,我们从全球最受欢迎的新闻来源收集所有文章,将它们放在一个地方,并提供基于日期、来源和全文进行搜索的可能性。
到目前为止,我们已经发布了一个封闭的测试版。本质上,我们是开发者至上的团队,这就是为什么我们决定分享我们所经历的一切。Newcatcher API 的另一位创始人发表了一篇关于整个数据架构的文章。
两个人的团队在不到两个月的时间里为 200 名用户计划并发布了一个测试版,并且没有放弃他们的全职工作。
towardsdatascience.com](/launching-beta-data-product-within-two-month-with-aws-6ac6b55a9b5d)
我的目标是深入挖掘细节,谈谈产品的功能部分。解释数据管道,给出一些提示并揭示要避免的陷阱。我会努力让这篇文章既有趣又有用。如果您想知道如何构建相同的架构,也许您可以将它作为指南。
我们可以开始了吗?
挑战
让我们回到这个想法。我们希望构建一个包含最新新闻文章的 API。基点是每个在线新闻来源的 RSS 提要。 RSS 提要是简单的文本文件,包含文章的基本更新信息。几乎每个新闻来源都有一个储存标题、摘要、出版日期等信息的地方。我们的目标是创建一个数据管道,每小时从多个 RSS 提要获取信息。为了实现这个想法,我们面临一些简单的问题:
- 我们从哪里获得全世界成千上万新闻源的 RSS 提要?
- 如何每小时获取新文章?
- 我们把它存放在哪里,SQL 还是 NoSQL 数据库?
- 最快的查询方式是什么?
- 如何做一个 API?(是的,我们以前从未构建过 API)
为了回答第一个问题,我们使用了维基百科、 Alexa 和其他来源来搜集新闻来源网站和他们的 RSS 订阅。经过几个小时的手工清理,我们或多或少地获得了一些参考数据。csv 文件。一切都以. csv 开头。
下一步是每天多次使用 RSS 提要检索新文章。在这一点上,我们想出了使用 SQS 队列来逐步发送参考数据和获取文章更新的想法。它有两个主要优势:
- 容错。数据不是一个长时间的连续循环,而是通过成束的消息发送。一群人的错误不会影响其他人。日志中的错误很容易识别。
- 管理负载。易于管理其他服务的负载,如 DynamoDB 和 Elasticsearch。
SQS 队列和 AWS Lambda 串联完全符合我们的需求。多个 Lambda 函数可以同时启动。这意味着 lambda 可以接收每一串消息。公平地说,SQS 和 Lambda 函数的优势在数据管道中更加明显,我们接收 SQS 队列并将它们放入 DynamoDB 表中。在本文后面我们讨论 Lambda 函数的地方,只有一个用于发送 SQS 队列的函数。
现在让我们转到更技术性的部分。文章的下半部分包含了一个实际实现的生动例子。
数据管道
开始前的准备工作
在开始处理数据管道之前,需要完成一些步骤:
- 拥有一个 AWS 自由层账户
- 选择一个地区,对于您使用的其他服务,请选择该地区
- 使用 Linux 机器或创建一个 EC2 实例,该实例有权访问其他 AWS 服务
- 在您的 AWS 帐户上创建一个访问密钥
- 为此项目专门创建一个虚拟 Python 环境
- 安装 AWS CLI 并将配置为您之前创建的访问密钥
- 为 Python 安装
boto3
包
1.在亚马逊 S3 上提供数据
让我们从简单的事情开始。在 AWS 上打开 S3 服务,创建一个存储桶并上传您的。csv 文件在那里。恭喜你,三分之一完成了。
2.从传输数据。csv 文件到 NoSQL 表
如果您已经完成了前面提到的所有预安装要求,那么在访问不同的服务方面就不会有任何问题。
来自boto3
的资源和客户端
从现在开始,请记住,每次您想要使用 AWS 服务时,您都必须导入boto3
并建立适当的连接,无论是资源还是客户端。
我不知道何时使用它们中的每一个,试着阅读官方的文档或来自 Stackoverflow 的简短解释。对于您的项目,我们总是连接到 DynamoDB 作为资源,连接到 S3 作为客户端,连接到 SQS 作为客户端发送消息,并作为资源接收消息。
DynamoDB 中的表
还有一件事,你需要在 DynamoDB 中创建一个表。这并不困难:你进入 DynamoDB 服务,“创建表”。配置它的惟一方法是默认选择一个主分区键——这个变量对于每个观察都有一个惟一的值。如果您没有该变量,您可以创建两个变量 MD5 散列,这将为您提供一个唯一的 ID。例如:
将数据从 S3 发送到 DynamoDB 是一次性操作,如果您的数据没有被更改,则无需重复。该操作的代码片段从建立到所需服务的连接开始。
向 DynamoDB 发送数据的一种可能方式是通过一个字典列表,其中每个字典都代表来自您的。csv 文件。所以你需要一个函数来完成这项工作。每个变量将作为一个字符串发送。郑重声明你的。csv 文件的名称必须与您选择作为 DynamoDB 表主键的名称相同。
最后一部分是使用您之前打开的连接发送自身的过程。
你在if __name__ == '__main__':
下插入主代码,就可以把功能放在外面导入了。然后发射。虚拟环境中的 py。检查 DynamoDB 服务中表格上的“项目”选项卡。
3.向 SQS 发送参考数据
使用 AWS Lambda,我们将获取不可变的引用数据,并通过 SQS 将其发送给另一个 Lambda 使用。为了执行这个操作,我们需要创建一个 SQS 队列,以及具有所有权限的 Lambda 函数。
SQS 队列
这里没什么难的。您使用 SQS 服务并创建一个新队列。在标准和先进先出队列之间有一个选择。主要区别在于顺序:使用 FIFO 保存发送消息的顺序,而对于标准,不考虑发送消息的顺序。我们选择了标准的一个,我们真的不在乎顺序。
您还可以配置您的队列。该配置对您的主题和信息类型保持唯一性。在您的例子中,每条消息包含 6 个字符串变量。这里附上我们 SQS 队列的配置。
策略和角色
对于 Lambda 函数,最棘手的部分之一是 IAM 角色和策略。简而言之,一个角色就是一组策略。策略是授权一个服务对另一个服务执行的动作。一个角色可以附加多个策略。反过来,角色与服务相关联。您可以通过在现有策略中搜索来添加策略,也可以创建自己的策略。在下面的例子中,我们授权 Lambda 函数从 DynamoDB 表中检索信息,发送队列并离开日志。
λ函数
Lambda 的功能代码结构重复了步骤 2 中的代码,除了它不再是一次性的。对于我们的项目,这个函数是整个数据管道的起点。我们希望通过添加一个带有简单 cron schedule 表达式的触发器,让它每 30 分钟执行一次。
Lambda 函数的内部是这样的。
消息按照 SQS 队列的配置发送。我可以给你另一个建议。如果 SQS 的“交货延迟”选项不适合您,sqs.send_message
还有一个参数叫做DelaySeconds
。当您想要在 Lambda 函数中分离发送操作时,请使用此参数。例如,您有 10k 个观测值要发送,这些观测值将一个接一个地进行。取而代之的是,你将它们分成 5 个 2k 的片段,每个片段都有DelaySeconds=180
,你的下一个服务将会逐渐接收到它,而不会使你的平台过载。DalaySeconds
参数的最大限制是 900 秒,这就是为什么您总是必须根据零件数量删除 900,以获得队列组之间的最大延迟。
结论
希望你能在这篇文章/指南中找到有用的东西。你可以在我们的 Github 库上找到所有提到的代码。此外,我们已经发布了封闭测试版。如果您对新闻 API 感兴趣,注册,亲自测试我们的产品。
我计划写另外两个部分,分别是关于接收 SQS 消息、在 DynamoDB 上保存数据、使用 DynamoDB 流填充 es 索引、在 Flask 上创建 RESTful API 以及用 Zappa 安装 Gateway API 的测试版。注意安全,呆在家里。
使用 Azure Data Factory 基于 HTTP 上的 URL 模式增量复制文件
原文:https://towardsdatascience.com/using-azure-data-factory-to-incrementally-copy-files-based-on-url-pattern-over-http-b625fc?source=collection_archive---------3-----------------------
一个创新的 Azure 数据工厂管道,通过 HTTP 从第三方网络服务器增量复制多个文件
田宽在 Unsplash 上拍照
使用 Azure 数据工厂复制文件很简单;然而,如果文件被托管在第三方 web 服务器上,那么这就变得很棘手了,复制它们的唯一方法是使用它们的 URL。
在本文中,我们将看到数据工厂活动的一种创新用法,即动态生成 URL,通过 HTTP 获取内容,并将其存储在我们的存储帐户中以供进一步处理。
警告: Microsoft Azure 是一项付费服务,遵循本文可能会导致您或您的组织承担财务责任。
在继续本文之前,请阅读我们的使用条款:https://dhyanintech . medium . com/disclaimer-disclosure-disclosure-terms-of-use-fb3 BF BD 1e 0e 5
先决条件
- 有效的 Microsoft Azure 订阅
- Azure 数据工厂实例
- Azure 数据湖存储第二代存储
如果您还没有设置先决条件,请参考我们之前的文章,了解如何创建它们:
[ 使用 Azure 将 CSV 文件转换为 Power BI 视觉效果的权威指南
使用 Microsoft Azure 产品将新冠肺炎数据转化为惊人的 Power BI 视觉效果的分步指南。
medium.com](https://medium.com/@dhyanintech/a-definitive-guide-to-turn-csv-files-into-power-bi-visuals-using-azure-4483cf406eab)
本文将建立我们的数据工厂,从 GitHub 的新冠肺炎存储库中获取公开可用的 CSV 文件,GitHub 由约翰·霍普金斯大学系统科学与工程中心(JHU·CSSE)运营。我们对驻留在csse _ covid _ 19 _ data/csse _ covid _ 19 _ daily _ reports中的数据感兴趣。此文件夹包含每日病例报告,自 2020 年 1 月 22 日起,每天添加一次新报告。文件遵循一致的命名约定 MM-DD-YYYY 。战斗支援车
这是由约翰·霍普金斯大学运营的 2019 年新型冠状病毒视觉仪表板的数据存储库…
github.com](https://github.com/CSSEGISandData/COVID-19)
数据来源:GitHub 的文件列表(图片由作者提供)
为我们的项目获取这些文件的典型方式是从 GitHub 下载 zip 格式的存储库,在您的客户机上提取文件,然后手动将文件上传到我们的存储帐户。另一方面,如果我们希望我们的 Power BI 报告与新冠肺炎数据保持同步,我们必须每天上传一个新文件。我们希望找到一种解决方案来自动执行摄取任务,从而在无需额外手动操作的情况下保持数据最新。我们可以使用 Azure 数据工厂来实现这一点。我们的思考过程应该是:
- 创建一个从 GitHub 获取文件的管道,并将其存储在我们的存储帐户中
- 我们使用其 Raw URL 一次只能获取一个文件(在 GitHub URL 打开一个文件, Raw 打开没有 GitHub UI 的文件):https://Raw . githubusercontent . com/CSSEGISandData/新冠肺炎/master/csse _ covid _ 19 _ data/csse _ covid _ 19 _ daily _ reports/01-22-2020 . CSV
数据源:获取 Raw URL(图片由作者提供)
- 回想一下,文件遵循一个命名约定(MM-DD-yyyy . CSV);我们需要创建数据工厂活动来自动生成文件名,即通过管道请求的下一个 URL。
- 我们需要多次重复这项任务;第一次,我们将获取存储库中已经存在的所有文件,然后每天一次。
- 使用 Azure 数据块转换接收的文件
活动通常包含 Azure 数据工厂工作的转换逻辑或分析命令,并定义对数据执行的操作。
管道是一起执行任务的数据工厂活动的逻辑分组。可以调度管道执行,或者可以定义触发器来确定何时需要开始管道执行。
延伸阅读:
[ Azure 数据工厂中的管道和活动— Azure 数据工厂
适用于:Azure 数据工厂 Azure Synapse Analytics(预览版)本文帮助您了解管道和…
docs.microsoft.com](https://docs.microsoft.com/en-us/azure/data-factory/concepts-pipelines-activities)
登录到 Azure 门户,找到并打开你的数据工厂。我们可以通过多种方式做到这一点:
Azure 门户:定位资源(图片由作者提供)
设置数据工厂组件
在概述页面上选择作者&监视器,以在新的浏览器选项卡中加载我们的数据工厂实例。切换到下一个标签页(我们的数据工厂),在左上角的菜单中选择管理。让我们从创建链接服务开始,告诉数据工厂我们的资源在哪里。
链接服务
链接服务就像连接字符串,它定义了数据工厂连接外部资源所需的连接信息。
我们需要创建两个链接的服务,第一个告诉数据工厂我们的数据源(即 GitHub)以及如何连接到它。我们需要提供 HTTP 地址( Raw 没有文件名的存储库 URL)作为基 URL(https://Raw . githubusercontent . com/CSSEGISandData/新冠肺炎/master/csse _ covid _ 19 _ data/csse _ covid _ 19 _ daily _ reports/)。遵循以下步骤:
Azure 数据工厂:创建链接服务(图片由作者提供)
Azure 数据工厂:创建 HTTP 链接服务(图片由作者提供)
第二个链接的服务告诉我们的数据工厂数据目的地(即存储帐户)。创建一个新的链接服务,在新链接服务刀片上搜索存储,从匹配的资源列表中选择 Azure Data Lake Store Gen2 ,继续。从下拉列表(4)中选择正确的存储帐户。
Azure 数据工厂:创建存储链接服务(图片由作者提供)
此时,您的屏幕应该如下所示。发布所有以保存您的更改,即保存。上的发布发布所有刀片,等待展开完成;可能需要几秒钟。
Azure 数据工厂:发布更改(图片由作者提供)
接下来,我们需要创建数据集来告诉我们的数据工厂使用什么数据及其格式。我们需要创建两个数据集链接到我们的两个链接服务。
数据集
数据集是数据的命名视图,它简单地指向或引用我们想要在活动中用作输入和输出的数据。数据集表示不同数据存储中的数据,可通过链接服务访问。
在左上角菜单中选择作者,在工厂资源刀片上找到数据集,显示的数字。选择新数据集并按照步骤创建我们的第一个数据集来表示我们的 GitHub 数据。
Azure 数据工厂:创建数据集(作者图片)
我们的新数据集将打开,显示进一步配置和定义我们的数据结构的选项。注意,连接选项卡下的基本 URL 填充了我们在链接服务中提供的原始文件夹 URL。我们的数据位于文件 URL,因此我们需要为数据工厂提供绝对 URL 来消费数据。我们将使用相对 URL 字段来导出文件的完整 URL(基本 URL +相对 URL)。然而,我们希望我们的管道获取多个文件;因此,我们将使用一个参数动态生成文件名,而不是提供一个简单的文件名。
我们可以使用参数将外部值传递到管道、数据集、链接服务和数据流中。通过参数化资源,我们可以每次用不同的值重用它们。
参数设置用于管道运行的整个持续时间。它们就像编程语言中的常量一样,定义在源代码的顶部。
切换到参数选项卡, + New 创建一个新参数。如下所示设置字段;我们使用第一个 CSV 文件的名称作为默认值。切换到连接页签,将相对 URL 设置为@dataset().fileName
。
语法引用数据集参数: @dataset().PARAMETER_NAME
我们可以使用正确的语法键入参数名称,或者使用添加动态内容刀片来填充它(5–7)。
Azure 数据工厂中的动态内容使用表达式语言。
延伸阅读:
[ Azure 数据工厂中的表达式和函数——Azure 数据工厂
适用于:Azure 数据工厂 Azure Synapse Analytics(预览版)本文提供了有关表达式和…
docs.microsoft.com](https://docs.microsoft.com/en-us/azure/data-factory/control-flow-expression-language-functions)
Azure 数据工厂:创建和引用数据集参数(作者图片)
创建一个新的数据集来表示我们的存储帐户中的数据。遵循前面提到的步骤(在新数据集刀片上搜索Azure Data Lake Storage gen 2而不是 HTTP)。您的新数据集应该如下所示;发布所有更改,使它们可以在我们的数据工厂中使用。
Azure 数据工厂:创建数据集(作者图片)
既然我们已经满足了建立数据工厂的要求,那么是时候创建一个执行实际任务的管道了。让我们从从工厂资源刀片创建一个新管道开始(类似于创建一个新数据集)。
管道
为您的新管道命名,并在变量选项卡中创建两个类型为 string 和 01–22–2020 的变量(I 和 j)作为默认值。
变量可以在管道开始时设置,并在运行过程中读取和修改。变量在运行时包含实值,可以赋给参数。
它们就像编程语言中的常规变量。
Azure 数据工厂:使用变量设置管道(图片由作者提供)
活动
是时候将活动添加到我们的渠道中了;所有活动都可以在活动刀片上进行。我们将使用以下活动:
- 获取数据:获取我们商店中存在的所有 CSV 文件的列表。最初,这将返回 null,因为我们的存储中还没有文件。该输出将作为下一个设置变量活动的输入。
- 设置变量 (1):用我们存储的最新文件名设置我们的变量 i 。最初,这将使用变量 j 的默认值(即 01–22–2020)设置 i ,因为从获取数据活动的输入将为空。计算输出(变量 i )将作为下一个的输入,直到活动。
- 直到:生成从最近可用文件日期到今天的文件名,输入值 i 将作为开始日期,今天-1 将作为结束日期。生成的输出(变量 i )将作为下一个复制数据子活动的输入。
- 复制数据:通过 HTTP 复制实际的文件并存储到我们的存储器中。从到 activity(变量 i )的输入将被传递给我们的源数据集的参数 fileName,完成我们到原始 CSV 文件的 URL。该文件将通过 HTTP 访问,并保存到我们的存储。成功端将连接到我们的下一个设置变量活动。
- 设置变量(2 & 3):为下一次迭代增加变量 i 。我们需要两个设置变量活动,因为我们不能引用在值字段中设置的变量;因此,我们将使用变量 j 作为中间变量来增加 i 。
获取数据
在常规类别下找到获取数据,将其拖放到画布上。给它一个名字并继续,如下所示。
语法引用获取数据活动的输出: @{activity('GET_METADATA_ACTIVITY_NAME').output.FIELD_NAME}
Azure 数据工厂:获取数据活动(图片由作者提供)
设置变量(1)
在常规类别下找到设置变量,将其拖放到画布上。将其与获取数据活动的成功(绿色)结束连接。给它一个名字,并如下设置变量 i
@if(empty(last(activity('ac_checkAllAvailableFiles').output.childItems)),variables('j'),formatDateTime(addDays(formatDateTime(replace(last(activity('ac_checkAllavailableFiles').output.childItems).name,'.csv',''),'MM-dd-yyyy'),1),'MM-dd-yyyy'))
值字段可以打开添加动态内容刀片;您可以键入或复制粘贴上面的表达式,或者使用 blade 的控件来创建表达式。
Azure 数据工厂:设置变量活动(图片由作者提供)
直到
将定位到迭代&条件类别下的处,将其拖放到画布上,并将其与之前设置的变量活动的成功结束连接。给它一个名字;在设置选项卡中,输入以下表达式😗*
@greater(dayOfYear(formatDateTime(variables('i'),'MM-dd-yyyy')),dayOfYear(subtractFromTime(utcnow(),1,'Day')))
移至活动选项卡,编辑图标添加其余活动。我们将在中添加其他活动*,直到我们需要多次执行它们。单击编辑图标将显示一个空画布,表示我们现在正在向 Until 活动中添加要迭代的活动。*
Azure 数据工厂:直到活动(图片由作者提供)
复制数据
在移动&变换类别下找到复制数据 a,将其拖放到画布上。给它命名,设置源和宿标签配置,如图所示。我们将用变量 i 给文件名参数赋值。下面是文件名表达式,方便复制粘贴:)
@concat(formatDateTime(variables('i'),'MM-dd-yyyy'),'.csv')
Azure 数据工厂:用参数复制数据活动(图片由作者提供)
设置变量(2 和 3)
添加另一个设置变量活动。将其与复制数据活动的 s 成功结束连接。给它一个名称,并将变量 j 设置为
@addDays(formatDateTime(variables('i'),'MM-dd-yyyy'),1)
添加另一个设置变量活动,并将其与前一个设置变量活动的成功结束连接。将 i 设为@variables('j')
Azure 数据工厂:递增参数值(图片由作者提供)
我们的管道现在已经准备好了;它应该看起来像下面这样。此外,出于任何故障排除的目的,您可以参考本文末尾来自 GitHub 的我们管道的 JSON。
Azure 数据工厂:通过 HTTP 复制文件的管道
添加所有活动后的下一步是验证我们的管道。找到并选择 Validate 选项,以确保我们的管道没有错误并准备好执行。管道验证输出刀片将向我们显示验证的结果。
我们有两种选择来运行我们的管道和看到我们的劳动成果。我们可以调试运行我们的管道而不发布我们的更改,或者我们可以先发布我们的更改。建议先调试运行管道,然后发布更改;调试运行在管道的输出选项卡中显示 us 日志和其他有用的跟踪信息。花几分钟时间浏览输出日志,以清楚地了解执行和各种活动。示例输出如下所示。
Azure 数据工厂:典型的调试管道输出(图片由作者提供)
您还可以使用 Add trigger 选项立即运行管道,或者设置一个自定义触发器,以特定的间隔、时间或基于外部事件运行管道。
管道 JSON
结论
我们提出了一个通过使用 URL 在 HTTP 上复制数据的引人注目的问题。我们讨论了构成管道的各种组件,并建立了一个创新的数据工厂管道来解决手头的问题。我们还讨论了如何设置管道的自动执行,以及管道执行日志的简要概述。
后续步骤
如果您正在关注我们关于将 CSV 数据转换为 Power BI 视觉效果的系列文章,请阅读我们的下一篇文章,继续使用 PySpark 清理和转换 Azure Databricks 中的数据。
[ 在 Azure Databricks 中将模式漂移的 CSV 文件清理并转换为关系数据
使用 PySpark 处理模式漂移文件并将其加载到 Azure Databricks 中的 Azure Synapse Analytics 数据仓库
medium.com](https://medium.com/@dhyanintech/cleansing-and-transforming-schema-drifted-csv-files-into-relational-data-in-azure-databricks-519e82ea84ff)
如果您试图在您的数据工厂管道中添加和执行 Databricks 笔记本,我们有完美的东西向您展示。
[ 使用访问令牌在 Azure 数据工厂管道中执行 Azure Databricks 笔记本
关于如何使用 Azure Key Vault 安全访问在数据工厂管道中添加和执行 Databricks 笔记本的指南…
medium.com](https://medium.com/@dhyanintech/executing-azure-databricks-notebook-in-azure-data-factory-pipeline-using-access-tokens-3326b)
喜欢这个帖子?与 Dhyan 联系
让我们做朋友吧!你可以在 LinkedIn 上找到我或者在 Medium 上加入我。
用 B 样条和 K 均值聚类时间序列
原文:https://towardsdatascience.com/using-b-splines-and-k-means-to-cluster-time-series-16468f588ea6?source=collection_archive---------35-----------------------
在时间序列数据中寻找趋势变得更加容易
斯蒂芬·道森在 Unsplash 上拍摄的照片
电子商务中的数据科学家不断发现自己在查看时间序列数据。在某些情况下,我们分析单个时间序列并开发预测模型。但是在的其他案例中我们正在回顾成千上万的时间序列,并试图找出有趣的模式。
处理一组时间序列可能会很尴尬。它们很难以有意义的方式聚集在一起。然而,使用 B 样条,我们可以简化我们的时间序列,更容易地进行探索性数据分析。
现实生活中的例子
假设您是一家大型在线零售商的数据科学家,您的任务是识别产品销售趋势。你可能会得到一个类似于的数据集,这个数据集在 UCI 知识库中。它包含 811 种不同产品的 52 周销量。让我们来看看随机抽样的产品及其标准化销售量:
一个趋势很明显。大多数产品经历了相对稳定的销售,而 3 个产品经历了零星的高峰。在这些时间序列中可能隐藏着其他趋势,但试图通过人工检查来发现它们将是非常耗时和无聊的。
我们可以通过 k-means 等无监督的机器学习算法来运行这些数据,但我们的结果可能会过度拟合。此外,重要的不仅仅是每周时间序列的值,还有相对的上下移动,这不会被这个表示所捕获。
因此,我们需要一种方法来以简洁的方式表示我们的时间序列,这种方法不仅可以捕获每周序列的绝对值,还可以捕获形状。这就是 B 样条的用武之地。
什么是 B 样条?
b 样条是一种通过使用多项式的分段组合来近似非线性函数的方法。在深入研究 b 样条之前,让我们先来看看数据集中的单个时间序列,并尝试用线性回归模型对其进行拟合:
虽然线性回归捕捉到了总体下降趋势,但它过度简化了系列中的模式。想象一下,如果不是一个线性回归,我们拟合两个回归模型,一个用于系列的前半部分,另一个用于后半部分。这可能会有所帮助。现在想象一下,如果我们拟合 52 个不同的回归模型,每个模型都适用于系列中特定的一周。虽然这个模型肯定会过度拟合,但它在描述原始系列方面做得很好。
在适合一个模型和适合 52 个模型之间可能有一个中间地带。这是 b 样条背后的思想——拟合一系列局部模型。
创建 B 样条逼近
b 样条有两个组成部分,一个基和系数。基础决定了超参数:使用多少个局部模型(称为结)以及在每个模型中使用什么次数的多项式。然后将系数乘以这个基数,以逼近原始数据。
b 样条基是一个对角矩阵,有 52 行——系列中的每个时间段一行,每个局部模型一列。我们可以创建一个 b 样条基,它使用 6 个局部模型或节点,并使用三次多项式,代码如下:
如果我们使用热图绘制该矩阵的值,我们会得到如下结果:
矩阵中的每一列都有唯一的非零值区间,这些区间共同覆盖了整个矩阵。因此,通过将矩阵中的每一列乘以不同的系数,我们将能够控制局部区间上近似的形状。下面是我们的 B 样条基的另一种表示。
通过使用不同的权重或系数组合这六个多项式,我们可以得到原始时间序列的非线性估计。我们可以使用最小二乘估计来获得最佳拟合系数。
这是一个比我们最初的线性回归好得多的近似值。接下来,让我们看看如何使用 b 样条来执行无监督学习。
B 样条聚类
上述 b 样条可以用 6 个系数来表示。想象一下,如果我们为原始数据集中的所有 811 个时间序列创建一个 b 样条近似。我们将有一个 811x6 的矩阵,比我们原来的 811x52 数据集维数低得多。
通过用不同的 K 值运行 K-means,我们看到对于 K 有几个好的选择,但是为了简单起见,让我们坚持 K=2
现在,让我们从原始时间序列中随机抽取一个样本,看看它们是如何用 K=2 进行聚类的
正如我们最初通过眼睛发现的,K-意味着区分具有持续销售的产品和具有大量零星峰值的产品。通过选择不同的 K 值,我们还可以识别时间序列中的不同趋势。我们来看看 K=5
此外,我们可以将我们的聚类的质心乘以基数,以查看每个聚类的平均时间序列。
摘要
B 样条提供了一种仅用少量数据点来表示时间序列的有效方法。当我们试图聚集数百、数千或数百万个时间序列时,这就很方便了。
在这个例子中,我们使用 b 样条来执行分割。我们发现了有趣的相似点和时间序列片段,可以用来为产品决策提供信息。但是相同的 b 样条近似也可以用于分类或回归。
参考和链接
[1] Github 完整代码在 Rhttps://Github . com/RoryMichelen/Medium-Articles/blob/master/Clustering _ w _ B _ splines . rmd # L42-L56
[2]数据集:https://archive . ics . UCI . edu/ml/datasets/Sales _ Transactions _ Dataset _ Weekly
利用贝叶斯分类器检测假新闻
原文:https://towardsdatascience.com/using-bayesian-classifiers-to-detect-fake-news-3022c8255fba?source=collection_archive---------24-----------------------
有如此多的假新闻在流传,很难找到准确和未经捏造的消息来源。
照片由联合国新冠肺炎办事处通过联合国日内瓦办事处回应
有如此多的假新闻在流传,很难找到准确和未经捏造的消息来源。本文旨在使用朴素贝叶斯分类器对真假新闻进行分类。
什么是朴素贝叶斯分类器:
朴素贝叶斯分类器是一种确定性算法,它使用贝叶斯定理对数据进行分类。让我们看一个例子:
假设您想要预测今天下雨的概率:在过去的几天里,您通过观察天空中的云收集了数据。这是你的数据表:
此表显示了在下雨或不下雨的情况下,某个要素出现的次数。我们所拥有的实际上是一个包含下雨概率的表格,假设出现了灰色的云或白色的云。
现在有了数据,我们来做个预测。今天我们看到了灰色的云和没有白色的云,它更可能是一个雨天还是一个晴天?要回答这个问题,我们必须使用贝叶斯定理:
这个定理利用过去的数据做出更好的决策。
假设有灰色云,下雨的概率等于下雨的概率,乘以下雨的概率,除以灰色云出现的概率。
根据我们的数据:
P(B|A)(下雨的概率,给定灰色云)= 10/11
P(A)(下雨的概率)= 11/50+11 = 11/66 = 1/6
P(B)(灰色云的概率)= 1(灰色云已确认出现)
P(A|B) = P(B|A) * P(A) / P(B)
P(A|B) = 10/11 * 1/6 / 1
P(A|B) = 10/66
这是我们的结果!假设出现了灰色的云,下雨的概率是 10/66,也就是说,在 66 种不同的概率中,情景相同的情况下,有 10 种会下雨。
该项目:
简单介绍了朴素贝叶斯分类器之后,让我们来谈谈用朴素贝叶斯分类器检测假新闻。
假设新闻是假的,我们将统计一个词在标题中出现的次数。把它变成一个概率,然后计算标题是假的概率,与标题是真的相比。
我使用的数据集有超过 21,000 条真实新闻和 23,000 条假新闻。对于正常的数据集来说,这可能看起来不平衡,但这种不平衡对于计算初始概率是必要的:这是一个标题是假的概率,而不考虑它是什么。你可以联系我在 的数据集。
代码:
import pandas as pd import string
这是该程序的三个依赖项:pandas 用于读取 csv 文件,string 用于处理单词的大小写。
true_text = {} fake_text = {}true = pd.read_csv('/Users/XXXXXXXX/Desktop/True.csv') fake = pd.read_csv('/Users/XXXXXXXX/Desktop/Fake.csv')
这个脚本将读取两个数据集,其中包含假新闻和真新闻的实例。
def extract_words(category,dictionary): for entry in category['title']: words = entry.split() for word in words: lower_word = word.lower() if word in dictionary: dictionary[lower_word] += 1 else: dictionary[lower_word] = 1 return dictionary
假设标题是假新闻,这个脚本计算一个单词出现的次数,并在字典中为每个单词出现的次数加一。
def count_to_prob(dictionary,length): for term in dictionary: dictionary[term] = dictionary[term]/length return dictionary
该函数通过计算假新闻标题或真实新闻标题的总字数,将数字转换为概率。
def calculate_probability(dictionary,X,initial): X.translate(str.maketrans('', '', string.punctuation)) X = X.lower() split = X.split() probability = initial for term in split: if term in dictionary: probability *= dictionary[term] print(term,dictionary[term]) return probability
该函数将相关概率相乘,计算出标题的“分数”。要进行预测,请比较使用假新闻和真实新闻词典时的得分。如果假新闻字典返回更高的分数,则该模型已经预测该标题是假新闻。
true_text = extract_words(true,true_text) fake_text = extract_words(fake,fake_text)true_count = count_total(true_text) fake_count = count_total(fake_text)true_text = count_to_prob(true_text,true_count) fake_text = count_to_prob(fake_text,fake_count)total_count = true_count + fake_count fake_initial = fake_count/total_count true_initial = true_count/total_count
这个脚本使用上述所有函数为每个单词创建一个概率字典,然后计算标题的“分数”。
X = 'Hillary Clinton eats Donald Trump' calculate_probability(fake_text,X,1)>calculate_probability(true_text,X,1)
这个最终脚本评估标题:“希拉里·克林顿吃了唐纳德·特朗普”,以测试模型。
True
该模型输出 True,因为标题显然是假新闻。
您可以改进我的计划的地方:
我创建这个程序作为一个框架,以便其他人可以对它进行改进。以下是一些你可以考虑的事情:
- 考虑短语和单词
一个单词本身没有意义,但是一个短语可以让我们更深刻地了解新闻是否是假的
- 通过网络搜集获得更大的数据集
网上有很多真新闻和假新闻的来源,你只需要找到它。
构建贝叶斯网络的主要启发式方法——项目管理评估实例
原文:https://towardsdatascience.com/using-bayesian-networks-for-project-management-evaluation-13a6eda50605?source=collection_archive---------25-----------------------
安德鲁·尼尔在 Unsplash 上拍照
这篇文章展示了五篇论文的工作,其中项目管理度量与项目性能度量相关。我们使用在那些论文上发现的数据建立了贝叶斯网络(BN) ,并且我们在前面描述的标准下评估了结果网络。完成这项工作是因为我们想了解如何使用贝叶斯网络对项目管理系统建模,我们想知道哪些是最常见的限制,以及我们可以从以前的工作中获得哪些见解,目的是开发一个新的模型。
这不是对这些作品内容的批评,而是对这些研究在试图根据它们的信息来阐述 BN 时是如何有限的批评。在本节中,我们基于可靠的科学文献探索模型语义的重要性,并使用合格标准来确定构建真实贝叶斯网络的规则。
第一个限制:缺乏合成节点和概念结构
我们考虑的第一篇论文题为探索项目管理的价值:将项目管理绩效与项目成功(Mir&Pinnington,2014) 。为了实现这一目标,Mir 和 Pinnington 根据不同领域确定了关键项目的成功驱动因素。这些驱动器对应于 BN 的输入数据。此外,作者有一个抽样数据库,其中包括 4 周内收到的 154 份回复。
我们可以通过选择具有中枢特征的 BN 来模拟 Mir 和 Pinnington 的研究(图 1)。在提出的因果模型中,没有合成节点。使用该 BN 的局限性来自于将标准视为从原因节点到项目成功节点的相互依赖因素的基本假设。使用该网络的主要限制来自于计算“项目成功节点的 CPT 所需的组合数量。这个数字可能太大,无法使模型足够精确。例如,如果每个节点有两种状态(真/假),项目成功节点将需要 4,096 个值来完成其 CPT。如果每个节点有五个状态,就需要 2.44 亿个值!该 BN 将失去其效用,因为完成“项目成功”节点的 CPT 所需的组合数量可能太大而不够精确。
图一。 BN 基于 Mir & Pinnington 的/提议的带有合成节点的 BN。
这些原因解释了为什么我们建议使用合成节点。在这篇文章中,我解释了更多关于合成节点的内容:
在这篇文章中,我给出了一个更正式的观点,并讨论了建模的一个重要素:合成节点。
towardsdatascience.com](/bayesian-networks-and-synthetic-nodes-721de16c47e2)
这些节点减少了目标节点的 CPT 大小,提高了因果关系可视化的质量。图 1(右侧)对应于我们的建议;它显示了一个基于合成节点的 BN,该 BN 可以替换同一图的左图中显示的网络。如果网络中的每个节点有两个状态,引入合成节点后,“项目成功”节点的 CPT 将有 4 个值要计算,“项目管理社会配置”节点有 8 个值,“项目管理环境配置”节点有 4 个值,“项目管理因素”节点有 8 个值,这意味着总共有 24 个值,而不是 4096 个值。
之后,我们根据这篇文章之前定义的标准,基于这项研究完成了对 Mir 和 Pinnington 的 BN 的简短批评:
在这段历史中,我们讨论了在基于贝叶斯理论建立模型时要考虑的结构标准
towardsdatascience.com](/the-hyperparameter-tuning-problem-in-bayesian-networks-f470)
1 —确保语义一致性:由于每个节点没有具体的可测量输入,专家可能会曲解几个变量。例如,如何知道被评估组织的 PM 策略的水平?
2 —调整网络的完备性: Mir 和 Pinnington 的 BN 并不专注于项目管理的某个特定领域,但它汇集了各种概念。不可能确保网络包含了最重要的变量,也不可能揭示它们之间最重要的关系。作者在谈到其工作的局限性时强调了这一点:“(……)之前的工作也表明,项目成功的认知受到各种 和其他与项目环境相关的 因素的影响,例如,项目风险,或合同类型的选择” (Mir & Pinnington,2014)。
3 —保证结果的相关性:目标节点上的准确度和精确度之间的权衡很大程度上受研究中描述的方差的影响:“众所周知,除了 PM 性能之外,其他因素也会影响项目的成功。事实上,45%的差异(如多回归分析的最佳拟合模型所示)可以通过 PM 性能结构来解释,而 55%的差异仍然无法解释。”(米尔&平宁顿,2014) 。
4 —限制组合爆炸:由于目标节点依赖于几个输入,因此馈送网络所需的数据量太大。然而,original Mir 和 Pinnington 的 BN 代表了一个很好的例子,说明引入合成节点如何能够大幅减少训练编码模型的计算机所需的信息量。
5 —保证学习质量: Mir 和 Pinnington 的 BN 是从一个数据库中构建的,该数据库来自一个抽样,包括在 4 周内收到的 154 份回复。然而,该信息不能被组织在具有允许学习所有 CPT 的结构的数据库中。对于这个网络,不可能测量学习的质量,进行训练/测试比率或使用其他测试指标。
总之,这个例子显示了语义结构和所需数据量之间的关系。本研究展示了引入合成节点如何减少 CPT 计算的示例,这些节点是必要的,但不足以构建满足资格标准的网络。
第二个限制:状态数不正确。
我们的下一项研究涉及一篇名为“量化大型业务应用程序开发中需求定义和管理过程成熟度对项目结果的影响” (Ellis & Berry,2013) 。作者定义了需求成熟度和项目运营绩效的不同度量之间的相关性。
我们的首要任务是恢复信息,以便创建一个 BN 来重现 Ellis 和 Berry 的结果。建议的网络有十三个输入,一个中间节点(需求成熟度)和五个输出。我们根据这项研究构建的网络分为两部分。第一个揭示了影响需求成熟度的几个因素(图 2)。
图二。根据(Ellis & Berry 2013)与项目成功的相关因素设计的 BN。
Ellis 和 Berry 论文的第二部分展示了需求成熟度如何影响项目绩效的不同度量(图 3)。
图 3 RDM 成熟度和成功指标
我们在这项研究的基础上,按照本文前面定义的标准,完成了对埃利斯和贝里的网络的简短批评:
1 —确保语义一致性:他们的 BN 表示需求工程专家选择的标准。这些标准并不详尽,但它们可能与目标相关。
2 —网络的完整性: Ellis 和 Berry 选择了专家认可的主要概念。他们论文的范围仅限于需求成熟度。每个概念明确对应每个节点。
3 —保证结果的相关性:目标节点有 Yes 或 No 两种状态,每种状态都依赖于 RDM 成熟度节点中所有状态的组合。也就是说,所有的性能指标都仅仅依赖于需求成熟度。每个输出节点都有两个明确的状态(是/否),但它们在 RDM 的四个状态中的依赖性限制了它们的精度。此外,十二个输入节点中 RDM 成熟度的依赖性限制了结果的精确度。
4 —限制组合爆炸。由于所有输入节点都与单个中间节点“RDM 成熟度”相关,并且它具有四个状态,所以其 CPT 的组合是高的(32 768 个值)。没有足够的数据来创建能够给出可靠输出的“RDM 成熟度”节点的 CPT。
5 —保证良好的学习质量。由于“RDM 成熟度”节点的 CPT 具有组合爆炸,很可能其 CPT 上的学习质量较低。甚至没有足够的数据来训练网络或测试它。所以网络不能保证学习的质量。
总之,这个网络具有完整的语义结构;然而,仅设置一个具有四种状态的中间节点增加了 CPT 中的组合。相反,最好创建几个合成节点。
第三个限制:语义没有严格定义
下一篇论文题为项目组合管理在培养深思熟虑的和紧急的战略(科普曼、科克、基伦&格明登,2017) 。作者提出的关键变量和模型在 182 个中小企业和大公司的双信息源跨行业调查中得到检验。
图 4: BN 基于 Kopmann 等人(2017 年)
我们可以使用前两个案例中提到的标准来评估 Kopmann 等人(2017)的工作。
1 —确保语义的一致性:这个网络呈现了宏观环境中包含的可能影响投资组合成功的素。这些素被 PM 社区所接受。然而,可能有几个其他因素影响投资组合的成功,如环境、策略定义等。
2 —调整网络的完整性:无法确定该网络是否考虑了所有必要的变量。这些概念得到了项目管理专家社区的验证(Kopmann 等人,2017)。
3 —保证结果的相关性:由于变量数量很大,因此无法衡量结果的质量。此外,与每个变量相关的数据量不足以在它们之间创建关系。
4 —限制组合爆炸:有八个节点针对一个单个节点,数据量不够大,无法为目标节点创建准确的 CPT。此外,文中提出的每个中间节点都有几个输入节点。
5 —保证良好的学习质量:目标节点中的学习没有足够的精度,因为没有帮助建立其 CPT 的结构化数据库。
总之,Kopmann 等人(2017)的网络表明,应该定义 BNs 的语义。与其建立一个具有大范围和有限数量变量的因果模型,不如创建一个范围缩小的 BN(例如,不是项目组合管理而是项目管理),它具有详尽和必要数量的变量。
第四个限制:目标节点太多
接下来我们要批判的研究叫做“整合管理对建设项目管理绩效的影响”(Demirkesen&Ozorhon,2017) 。本文包括了被描述为项目管理集成最佳实践的输入,它使用了一个可用作合成节点的“集成管理”节点。这个节点用几个性能指标来衡量:时间、安全、质量、成本和客户满意度。我们从 Demirkesen 和 Ozorhon 的工作中构建了 BN(图 5)。
图五。BN 基于 Demirkesen & Ozorhon (2017 年)
这种因果网络的局限性在评估极端案例时显现出来。例如,图 6 显示了集成管理完全完成时的预期性能。该网络显示了即使 100%的证据处于“是”状态,也将如何传导到 64%的性能概率,这是 32%概率的改进。此外,当在每个定义的性能指标(时间、成本、质量、安全、客户满意度)中划分这个概率时,概率的增加变得不那么重要。
图 6(Demirkesen & Ozorhon,2017)的敏感性分析。
更一般地说,Demirkesen 和 Ozorhon 的模型缺少几个关键点。
1 —保证语义一致性:因果模型侧重于集成管理,节点与该领域相关。该研究的主要贡献在于解释了集成管理如何与项目的运营绩效相关联。Demirkesen 和 Ozorhon 模型的语义一致性是好的。
2 —调整网络的完备性:因果模型的节点用无法从所描述的项目中直接测量的变量定义。没有证据表明此网络中的相关概念是详尽的,或者包括所有关于集成管理的必要评估项目。
3 —保证结果的相关性: PM 绩效目标节点派生为五个节点。因此,答案的准确性降低了。引入更多测量性能的概念会降低结果在准确度和精确度方面的相关性。
4 —限制组合爆炸:集成管理节点上的组合较多,但仍可计算。目标节点中的 CPT 很低,因为每个 CPT 只取决于一个因素(PM 性能)。
5 —保证良好的学习质量:由于所有节点都有两种状态,并且本文中可用的数据足够多,所以 ML 的质量可能是好的。然而,这是不可能的,因为没有足够的措施来做新的测试。
总之,从 Demirkesen 和 Ozorhon 的文章《本文》中获得的信息使我们能够再造一个更好的 BN。然而,考虑到数据量,建议只研究一个目标(而不是五个),以确保结果的相关性。
第五个限制:因果路径的多重性和 ML 不可能性
最后一篇研究论文名为【建设项目中项目复杂性驱动的风险路径建模】 (Qazi et al .,2016)。这个网络有几个中间节点和四个目标节点,它们汇聚成“效用”函数。BNs 用于评估项目成本超支。数据来自对几家公司项目经理的调查。该模型对其 26 个节点中的每一个使用两种状态:真/假。它有八个输入节点和四个输出节点:
Qazi 等人的模型,如图 7 所示,它探索了项目复杂性特征、风险和项目目标之间的相互依赖性。
图 7。BN 基于 Qazi 等人(2016 年)。
我们如何评估拟议中的 BN?
1 —确保语义一致性:作者选择了项目管理专家群体认可的主要概念。然而,没有证据表明这个模型包括了干扰项目开发的变量的详尽列表。
2 —调整网络的完整性:Qazi 等人的网络范围太大。由于有四个目标节点,网络是否考虑了影响这些节点的所有变量并不明显。这项研究没有解释为什么有些节点指向某些目标而不是其他目标。
3 —保证结果的相关性:目标节点有四个,其中一些是相互依赖的。这些节点有两种状态,因此精度和准确度应该是最大的。然而,不可能在每个目标节点中测量这些特征。
4 —限制组合爆炸:Qazi et al . BN 的每个节点都有两种状态。即使在有三个父节点的节点中,也没有组合爆炸。该论文明确地提出了所有的 CPT,因此完全重建整个网络是可能的。
5 —保证良好的学习质量。没有足够的数据来训练或测试网络。因此,没有数据库来通过算法测量每个目标的准确度和精确度。
关于拟定 BN 的数据可访问性存在限制。Qazi 等人的网络不能完全复制,也不能用新的数据集训练。它没有显示任何与 PM 最佳实践实现(没有可观察变量的度量)相关联的完善度(成熟度等级)。不可能评估每个目标节点中结果的相关性,也不可能评估整个 BN 的学习质量。
综合
1。第一点(确保语义一致性)被大多数网络所满足,因为在所有情况下,信息都是从研究人员已经处理过的科学文章中提取的。在下一章中,我们应该包括专家使用的概念,并用相关的科学文献证明它们符合这个标准。
2。提出的因果模型不能保证网络的完整性。然而,(Ellis & Berry,2013)的研究更接近于构建一个模型,其输入特征有效地定义了需求的成熟度,其输出特征:项目的效率参数。
3。所研究的网络都不能保证结果的相关性。无法定义结果的精确度或准确度。这是构建 BNs 时最难的一点。没有足够的数据来测试这些网络,也不可能对学习算法应用性能测量。然而,(Demirkesen & Ozorhon,2017)教导我们更少的目标节点可以提高网络结果的相关性。
4。组合爆炸是构建 BNs 或更一般地说:网络时出现的一个重要问题。当几个输入节点指向一个目标节点时(Mir & Pinnington,2014),当中间节点中有太多状态时(Kopmann 等人,2017),或者当模型包括太多概念和子概念(Ellis & Berry,2013),都可能发生这种情况。然而,我们发现使用合成节点,并在每个节点中包含两个状态,减少了组合的爆炸。在我们的模型中,我们必须牢记这一启发。
5。我们了解到,为了保证学习质量,我们应该包含一个数据库,并在定义网络后应用指标。即使 Qazi 等人的论文给出了每个节点的 CPT,我们也不能基于 CPT 计算任何学习度量。
结论:定义 BN 构建规则
这篇文章中的分析允许我们提取工作规则来构建我们的模型。我们可以把这些规则总结为:
- 规则 1:限制模型的语义。我们已经展示了 PM 中的文献如何呈现不同性质的实体的相关性。然而,对于一个定义良好的 BN,建议从建模相同性质的实体开始。在我们的案例中,我们将使用项目管理成熟度的概念,排除关于公司核心竞争力或项目环境的概念。
- 规则二: 限制输入节点数量。链接到一个节点的许多输入节点会产生太多的组合而无法解决。这将在其子节点中产生组合爆炸。五个以上的输入节点会降低灵敏度分析的影响,因为反向传播算法将不得不覆盖太多的原因,并且每个原因的重要性将被削弱。
- 规则 3:将输入节点的状态数限制为两个。在输入节点中使用几个状态会导致子节点的组合爆炸。这降低了结果的准确性和相关性。同样,具有两种状态的节点是/否增加了网络的易理解性和客观性。
- 规则 4:使用合成节点。这些节点应该代表网络的语义;因此,应与专家讨论它们在结构中的位置。建议使用合成节点来减少 CPT 爆炸。因此,训练算法所需的数据量将减少,BN 的完整性更高,可解释性以及准确性增加。
- 规则 5:只使用一个具有适当数量状态的目标节点。我们已经展示了使用多个目标节点如何限制灵敏度分析和网络的客观性。我们建议只有一个具有适当数量状态的目标节点。这个命题解决了可访问性、完整性、精确性、不确定性、可解释性和易理解性之间的折衷。
感谢阅读至此!!!
链接到这篇文章的完整研究可以在下一个链接中找到(这篇文章直到 2020 年 6 月都是免费的)
提出了一种建立项目管理成熟度和项目超额成本之间因果关系的方法
www.sciencedirect.com](https://www.sciencedirect.com/science/article/pii/S09480?dgcid=author)
要了解 BN 的基础知识,我建议你看这篇文章:
假设世界上存在一种非常罕见的疾病。你患这种疾病的几率只有千分之一。你想要…
towardsdatascience.com](/will-you-become-a-zombie-if-a-99-accuracy-test-result-positive-3da371f5134)
如果你想继续阅读这样的故事,你可以在这里订阅!
参考文献:
德米尔克森,s .,&奥佐洪,B. (2017)。集成管理对建设项目管理绩效的影响。国际项目管理杂志,35(8),1639–1654。【https://doi.org/10.1016/j.ijproman.2017.09.008】
埃利斯,k .,&贝里,医学博士(2013 年)。量化大型商业应用程序开发中需求定义和管理过程成熟度对项目结果的影响。需求工程,18(3),223–249 页。
Kopmann,j .、Kock,a .、Killen,C. P .、& Gemünden,H. G. (2017)。项目组合管理在培养深思熟虑的和紧急的策略中的作用。国际项目管理杂志,35(4),557–570。https://doi.org/10.1016/j.ijproman.2017.02.011
T12 米尔,F. A .,T26 平宁顿,A. H. (2014 年)。探索项目管理的价值:将项目管理绩效和项目成功联系起来。国际项目管理杂志,32(2),202–217。https://doi.org/10.1016/j.ijproman.2013.05.012
Qazi,a .、Quigley,j .、Dickson,a .、& Kirytopoulos,K. (2016)。项目复杂性和风险管理(ProCRiM):建设项目中项目复杂性驱动的风险路径建模。国际项目管理杂志,34(7),1183–1198。【https://doi.org/10.1016/j.ijproman.2016.05.008】T21
用贝叶斯统计比较葡萄酒
原文:https://towardsdatascience.com/using-bayesian-statistics-to-compare-wines-efcb5?source=collection_archive---------47-----------------------
分级建模和 Gibbs 抽样概述,用于比较多组数据。
照片由 chuttersnap 在 Unsplash 上拍摄
当被问及更喜欢哪种葡萄酒时,大多数人都会回答红葡萄酒或白葡萄酒(有时还会说玫瑰葡萄酒)。即使我们最终确定了葡萄酒的颜色,仍有成千上万种葡萄酒可供选择(它们尝起来都非常不同)。一个狂热的葡萄酒爱好者可以很容易地区分这些葡萄酒,并且在挑选葡萄酒时对葡萄酒的国家和品种非常挑剔。在这篇博客中,我们将使用统计数据来帮助我们选择哪种葡萄酒更好。
我们将考虑本博客的 Kaggle wines 评论 数据集。这个数据集包含了一些品酒师对世界各地生产的不同葡萄酒的评论。葡萄酒的等级由分数栏给出,从 1 到 100。让我们假设,我的一个朋友喜欢南非的长相思,另一个喜欢智利的霞多丽。他们都认为 15 美是买一瓶酒的合适金额。现在让我们在不品尝任何一种的情况下完成这个。
让我们从看一下数据集开始这个旅程:
该数据集有 14 列 个数据点。有三个数字列,X,点数,价格;其中 X 是索引。其余 11 列是字符类型。
数据集的结构
现在,我们需要在南非长相思和智利霞多丽之间做出选择,所以让我们从数据集中过滤这些数据点。
wine_groups <- wine%>% filter( ((variety=="Sauvignon Blanc" & country=="South Africa") | (variety=="Chardonnay" & country=="Chile")) & price == 15)
注意:两国都生产这两种葡萄酒。所以我们需要使用这种组合过滤条件来选择数据,而不是在不同的过滤器中过滤品种和国家。
按照我们的特定条件选择数据,我们只得到 51 行。让我们先看一下所选的数据集,并形成我们的假设。首先,绘制这两种葡萄酒的箱线图,以估计点数的中值和范围。
从中可以看出“霞多丽”的值在 81 到 88 之间,中间值约为 85。长相思的数值范围从 85 到 90,中间值约为 87。从各组的中位数也可以明显看出,长相思比霞多丽有更好的分数,这可以用来形成我们的假设。查看这些值的平均值、中间值和标准偏差:
很明显,长相思被认为比霞多丽更好,但是我们不能确定这一点,因为数据很少。让我们进行一个双样本 t 检验来形成一个假设。
Two Sample t-test data: points by variety t = -3.2599, df = 49, p-value = 0.00203 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: -3. -0. sample estimates: mean in group Chardonnay mean in group Sauvignon Blanc 85.08108 87.21429
解释这些结果并形成我们的无效假设。无效假设表明两组之间的差异为零。p 值为 0.00203,小于 0.05,表明我们有 95%的把握认为长相思更好,或者我们也可以说有 0.2%的几率差异为零。重要的是,两个平均值之间的差值不为 0。基于这个 t 检验,我们形成了我们的假设,长相思比霞多丽更好评级。我们将尝试使用贝叶斯推理方法来找出这种差异。
统计建模
我们现在将使用 Gibbs 采样器来明确地模拟两组葡萄酒之间的差异。这用于对平均值和标准偏差(或精度)值执行完全条件更新。Gibbs Sampler 简化了我们使用 MCMC 方法更新多个参数的任务,它使用一种潜在的方便的全条件概率,将过程分成一次更新一个参数。为了对一个特定参数进行更新,我们将所有其他参数的当前值代入。有三个参数,我们试图用吉布斯采样器来估计,
- μ,两个定义组的平均值;
- del,两组的积分差异;
- τ,精度(定义为 1/Sd);
我们假设数据的范围覆盖在μ+2d 中,一般精度为τ。因此,这两组可以重新参数化为 mu+del 和 mu-del。其层次模型如下所示:
分层模型图
吉布斯采样:
对于吉布斯采样器的先验值,我们的最佳猜测如下:点数从 80 到 95 不等,中间值约为 85-87,因此 mu 的最佳估计值为 85。我们假设标准差约为 10,因此τ的先验估计值为 1/100。我们将 del 的初始值设为 0,因为根据零假设,组间差异为 0。在采样器的预烧期之后,这种先前的猜测将收敛于它们来自数据的原始值。我们运行采样器 5000 次迭代。对于正态似然性,平均值遵循具有参数μ0 和𝜎2 的正态分布,标准偏差𝜎2 遵循逆伽马分布(因此τ遵循伽马分布),而δ1 也遵循正态分布。这些分布用于更新我们的吉布斯采样器中的参数。
在从 Gibbs 方法生成样本之后,我们使用 MCMC 拟合方法创建图来分析估计参数(μ、del 和 tau)的收敛性。
迹线和密度图。
从该图中可以观察到,对于所有三个参数,模拟的马尔可夫链已经收敛到其后验分布,并且μ、δ1 和τ的后验参数估计值遵循正态分布。因为μ、δ1 和τ的后验估计也遵循正态分布,所以我们在 Gibbs 方法之前的猜测被认为是正态似然函数的共轭先验。对参数的这种完全有条件的更新为我们提供了如下后验值:
让我们以 mu+del 计算第 1 组(在我们的例子中是“智利霞多丽”)的平均值,我们得到 85.084,以 mu-del 计算第 2 组(“南非长相思”)的平均值,我们得到 87.204,标准偏差为 2.778。基于这些值,我们可以拒绝零假设,并接受两种葡萄酒之间的点数差异不为零。
因此,在我们的案例中,我们有一个赢家,南非长相思比智利霞多丽得到了 2.1198 的分数。
啊,但是我的朋友似乎很坚决,所以我们决定以每瓶 15 美的价格买下这两款酒。现在来看看南非长相思更好的概率有多大。
预测模拟
我们可以再次使用相同的吉布斯采样器对未观察到的数据进行预测。根据上一部分中使用的 Gibbs 抽样拟合模型,我们再创建两个各为 5000 的模拟,第一个用(mu + del)的最后一部分中的平均估计值表示“Chardonnay ”,第二个组用(model)的平均估计值表示“Sauvignon Blanc ”,具有公共标准偏差。在最后部分中接收的相同的吉布斯采样器输出拟合被用作该部分的仿真参数。
我们绘制了从该模拟接收的后验分布,并且它遵循正态分布曲线,
后验分布
这些样品帮助我们检查一种葡萄酒的平均水平是否比其他的好。一种酒的每一个样品都要与其他酒的每一个样品进行核对。这就产生了一个概率,告诉我们哪种酒更好,好多少。
结论
- 从我们的分析来看,很明显,南非长相思的评分 2.1198 分 优于智利霞多丽
- 此外,比较两个模拟组的平均值,我们观察到,对于 ,70.5% 的时间,南非长相思的评分优于智利霞多丽。
后续步骤
这种建模和比较也可以扩展到多个组,估计组内均值、跨组均值、精度等。
这里使用的数据集非常有趣,可以用于点估计、文本分析和 NLP 的回归建模(因为有很多文本列)以及更多…
欢呼…!!
在https://github . com/divyanshumarwah/wine-reviews-statistical-modeling-analysis/blob/master/wine-comparison 上找到代码。Rmd
在 LinkedIn 上与我联系并讨论这些想法。
在 GitHub 上找到其他令人兴奋的项目。
今天的文章 TowardsDataScience 博客中文翻译 2020(九百四十一)分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/97541.html