用于分析新冠肺炎的地理空间数据和工具
一个数据,可视化,工具和项目的集合,参与到周围的新冠肺炎
新冠肺炎对世界各地的生活产生了巨大的、改变生活的影响,这一点无需赘述。随着我们周围的世界每天都在变化,人们越来越关注地理。
连线文章*在疫情的热潮中,地理强势回归强调了我们重新关注我们与地理的关系。*
疫情正在重新定义我们与太空的关系。不是外太空,是物理空间。热点、距离、传播、规模、接近度。一句话:地理。突然,我们无法停止思考 在哪里 。
这不仅体现在我们如何思考我们与物理空间的日常关系,也体现在我们与数据和信息的关系。几乎在每一份新闻出版物中,你都可以找到与位置相关的地图和数据,信息每天都会被添加和更新很多次。
来自《纽约时报》的新冠肺炎病例总数(截至 2020 年 4 月 15 日)
虽然这种规模的危机在许多方面都是前所未有的,但对于那些处理地理空间数据的人来说,许多人都熟悉危机测绘的概念,即使用地理空间工具、数据和数字的力量来收集数据和信息,供应对危机的人使用。
这方面的第一个例子是对 2010 年海地地震的反应。在海地,可靠的地理空间数据(如道路和设施)有限,无法用来告诉当地的人们往哪里走。在地震后的几天里,许多人向 OpenStreetMap 贡献了自己的力量,这是一个类似于维基百科的开放项目,用户可以在地图上添加地理空间数据。
反应非常热烈。这些来自世界银行和 OpenStreetMap 博客和维基的帖子描述了人们的反应,但是这段视频展示了地震后增加的数据量。
2010 年 1 月添加到 OpenStreetMap 的数据
从那时起,已经发生了许多使用地理空间数据和工具的不同灾难。从洪水、飓风、地震、火灾、流行病、人道主义危机、龙卷风等等,都利用地理空间数据来应对这些灾害。
新冠肺炎是一场规模更大的危机,但地理空间社区对这场危机做出了压倒性的回应,提供了数据、工具和参与方式。这篇文章的其余部分将旨在分享其中的一些举措。
如果有你知道的不在列表中的资源,请随意添加到回复中!
免责声明 :我的专长是地理空间数据和分析,而不是流行病学或空间流行病学。该指南只是地理空间社区提供的资源的集合。
数据
约翰·霍普金斯大学系统科学与工程中心(JHU·CSSE)的新冠肺炎数据仓库
JHU·CSSE 仪表板
该数据集被全球许多不同的机构和新闻组织使用,是疫情期间最常引用的数据源之一。
这是由约翰·霍普金斯大学运营的 2019 年新型冠状病毒视觉仪表板的数据存储库…
github.com](https://github.com/CSSEGISandData/COVID-19)
谷歌云也在谷歌云平台上提供了 JHU 的数据集,并且正在与一些组织合作。
未发布
未预测的社交距离记分卡
Unacast 是一家人类移动数据和见解公司,它已经建立了一个社会距离记分卡,使用移动数据来分析移动模式的变化,直到县一级。他们的首席执行官托马斯·沃勒(Thomas Walle)在 LinkedIn 上发帖称:
如果您希望将位置数据用于研究和公共卫生目的,请联系我们,我们将免费向您提供我们的全球数据集。我们相信我们的数据具有强大的力量——强大的力量意味着巨大的责任。
上周,一些研究机构、大学和健康组织联系了 Unacast
www.linkedin.com](https://www.linkedin.com/posts/thomaswalle_dataforgood-locationintelligence-geospatialdata-activity-6644427802152095744-IdHY)
疾病控制中心
美国县级的 SVI 数据
社会脆弱性也会对个人和社区如何受到疾病的影响产生重大影响。疾病控制中心(CDC)发布了其社会脆弱性指数,定义为:
社会脆弱性是指社区在面临人类健康面临的外部压力,如自然或人为灾害或疾病爆发时的复原力。降低社会脆弱性可以减少人类痛苦和经济损失。疾病预防控制中心的社会脆弱性指数使用 15 个美国人口普查变量来帮助当地官员识别在预防灾害方面可能需要支持的社区;或者从灾难中恢复。
您可以在县或美国人口普查区级别下载 shapefiles 形式的数据。
[## 社会脆弱性指数(SVI):数据和工具下载| CDC
完整的 SVI 文档可在每年的数据标题下下载。SVI 地理空间数据…
svi.cdc.gov](https://svi.cdc.gov/data-and-tools-download.html)
天气来源
天气和气候学会对新冠肺炎的发展产生影响,但人类对社会距离命令的反应也会产生影响。WeatherSource 是一个数据提供商,拥有大量与天气相关的数据集,包括预报和气候学,并向研究新冠肺炎的人开放其 API。
[## 天气资源-商业天气和气候技术。
仅在美国,天气造成的年收入损失就超过 6000 亿美元。每个人都谈论天气…
weathersource.com](https://weathersource.com/)
脸书
墨西哥 60 岁以上人口的分布。
通过他们的 Data for Good 计划,脸书正与不同的研究人员和网络合作,提供广泛的匿名数据,如高密度人口地图、社交连接、协同定位地图、移动数据等。一些资源是公开的,例如人口密度地图,而其他资源是为特定组织保留的。
我们很想听听那些使用这些数据集来改进我们的产品并更好地了解……
data.humdata.org](https://data.humdata.org/organization/facebook)
OpenStreetMap
纽约市的开放街道地图
OpenStreetMap 通过一个名为 Planet.osm 的项目,在一个可下载的文件中提供其全球数据集和不同地理上更小的摘录。这包含了你在地图上看到的所有数据:道路、建筑、交通、兴趣点、医院、土地、水等。您还可以使用用户界面transition Turbo来提取通过transition API从 OSM 查询的数据。请记住,OSM 数据是用户生成的,在某些领域可能不完整。
这里找到的文件是定期更新的,OpenStreetMap.org 数据库的完整副本,以及那些出版的…
planet.openstreetmap.org](https://planet.openstreetmap.org/)
纽约时报
《纽约时报》正在 GitHub 上提供美国地图背后的国家、州和县级数据。
美国州级数据(原始 CSV) |美国县级数据(原始 CSV)】纽约时报发布了一系列数据…
github.com](https://github.com/nytimes/covid-19-data)
新冠肺炎移动数据网
新冠肺炎移动网络被描述为:
…一个由世界各地大学的传染病流行病学家组成的网络,与科技公司合作,使用聚合的移动数据来支持新冠肺炎应对措施。我们的目标是利用来自移动设备的匿名聚合数据集,以及对解释的分析支持,为州和地方层面的决策者提供关于社交距离干预效果的每日更新。
有一个电子邮件联系他们,但你可能需要成为一个学术机构的一部分,才能使用这些数据。
COVID19 移动数据网络的参与者共同致力于隐私价值和数据保护,因为…
www.covid19mobility.org](https://www.covid19mobility.org/)
联合国人道主义事务协调厅(OCHA)人道主义数据交换
联合国 OCHA 新冠肺炎资料页
联合国 OCHA 人道主义数据交换有许多不同的数据集可用于新冠肺炎(以及其他国家),包括上述一些数据集以及意大利的移动模式数据、测试数据和其他国家的特定数据。
新冠肺炎旅行限制监测-使用二级数据源,如国际航空运输…
data.humdata.org](https://data.humdata.org/event/covid-19)
工具
卡通
CARTO 是一个空间平台,提供了广泛的工具来存储、分析和可视化空间数据,他们正在将其平台提供给公共和私人组织:
出于这个原因,CARTO 将通过我们的资助项目向抗击冠状病毒爆发的公共和私营部门组织开放其平台。无论您是为公众分享建议的媒体机构、优化资源配置的医疗保健组织还是希望评估封锁影响的政府实体,我们都希望帮助您处理您的使用案例,并确保我们在此次疫情期间共同做出数据驱动的决策。
该程序已经被许多组织使用,包括 ForceManager 和 mendesaltaren 之间的合作,以及来自 Telefónica 、 Ferrovial 、 Google 和 Santander 的额外支持,以开发 AsistenciaCOVID-19 ,一个自我诊断和新冠肺炎信息应用程序。
[## CARTO 为对抗新冠肺炎的组织提供免费的可视化软件
在抗击新冠肺炎的斗争中,地图已经成为了解疾病传播的一个有价值的工具。许多…
carto.com](https://carto.com/blog/carto-free-for-fight-against-coronavirus/)
ESRI
ESRI 是一家地理空间软件和平台提供商,为世界各地许多不同的私人和公共组织提供广泛的地理空间分析工具和产品。从他们的新冠肺炎资源页面:
随着围绕冠状病毒疾病 2019(新冠肺炎)的形势继续发展,Esri 正在为我们的用户和整个社区提供位置智能、地理信息系统(GIS)和制图软件、服务以及人们用来帮助监控、管理和交流疫情影响的材料。使用并分享这些资源来帮助你的社区或组织做出有效的反应。
在这里,您可以请求 GIS 帮助、访问 GIS 资源、查看地图和仪表盘,以及获得与新冠肺炎相关的信息。
随着围绕冠状病毒疾病 2019(新冠肺炎)的形势继续发展,Esri 正在为我们的用户提供支持…
www.esri.com](https://www.esri.com/en-us/covid-19/overview)
QGIS
QGIS 是一个免费的开源桌面 GIS 工具,允许您使用地理空间数据、创建地图、执行地理空间操作、连接到外部工具以及与非常广泛的插件生态系统集成。
了解 QGIS 项目及其社区的进展情况。
www.qgis.org](https://www.qgis.org/en/site/)
仪表板
谷歌移动报告
样本谷歌移动报告
谷歌正在使用其平台上收集的移动数据来创建和发布移动报告,这些报告捕捉了几个不同场所类别(如零售和娱乐、公园、杂货店和药店等)中移动模式的变化。
社区流动性报告旨在提供对旨在抗击新冠肺炎的政策发生了哪些变化的见解。这些报告按地理位置绘制了不同类别场所(如零售和娱乐场所、杂货店和药店、公园、中转站、工作场所和住宅)的移动趋势。
随着全球社区对新冠肺炎做出反应,我们从公共卫生官员那里听说,同样类型的聚集…
www.google.com](https://www.google.com/covid19/mobility/)
Domo
多莫新冠肺炎地理空间仪表板
BI 公司 Domo 使用约翰·霍普斯金新冠肺炎公司的数据创建了一整套地理空间和非地理空间仪表板,包括每日更新、地图、测试、经济、预测等主题。
冠状病毒(新冠肺炎)使用 Domo 的商业云按国家、地区、州或县绘制的交互式地图。看…
www.domo.com](https://www.domo.com/covid19/geographics#global-tracker)
画面
Tableau 共享了一个使用 Tableau 发布的不同仪表板的图库,以及一个使用约翰·霍普斯金新冠肺炎数据的入门工作簿。
太平洋标准时间每天晚上 10 点更新,这个全球指标仪表板可视化约翰霍普金斯大学数据的子集…
www.tableau.com](https://www.tableau.com/covid-19-coronavirus-data-resources)
Cuebiq
Cuebiq 是一家人类移动数据提供商,它发布了一系列交互式可视化和分析,使用的数据涉及广泛的主题,包括《纽约时报》的几篇文章,分析意大利的移动模式等。
可视化公司如何使用 Cuebiq 的位置数据来构建自己的仪表板,以分析…
www.cuebiq.com](https://www.cuebiq.com/visitation-insights-covid19-dashboard-gallery/)
路灯数据
StreetLightData 使用移动数据来分析道路上的交通模式,以了解汽车流量计数、交通分析等。使用他们的数据结合 Cuebiq 数据来分析美国每天的车辆行驶里程(VMT)是如何变化的。您可以使用地图并下载数据。
在这个前所未有的旅游波动时期,汽车行驶里程(VMT)的下降如何影响您的…
www.streetlightdata.com](https://www.streetlightdata.com/VMT-monitor-by-county/)
参与其中
火辣的 OSM
人道主义 OpenStreetMap 团队(HOT)是一个即使只有几分钟空闲时间也能参与进来的好地方。HOT OSM 是一个任务系统,不同的组织可以请求帮助收集受重大灾害影响的不同地区或社区的数据,类似于前面描述的 2010 年海地地震。
任务管理器是为人道主义 OpenStreetMap 团队在 OpenStreetMap 中的协作制图过程而设计和构建的制图工具。该工具的目的是将一个制图项目划分为较小的任务,这些任务可以由许多人在同一个整体区域内快速完成。它显示了哪些区域需要映射,哪些区域需要验证映射。
这种方法允许在紧急情况或其他人道主义绘图情况下将任务分配给许多单独的绘图者。它还允许监控整个项目进度,并帮助提高映射的一致性(例如,要覆盖的元素、要使用的特定标签等)。).
在全球各地的社区中,有许多不同的与新冠肺炎相关的开放任务。你只需要在 OpenStreetMap 上创建一个账户,然后选择你想要参与的项目。从那里你将简单地跟踪一个卫星图像,找到该项目所要求的不同功能。
[## 热门任务管理器
为了充分利用任务管理器中的许多功能,请使用台式机或笔记本电脑,而不是…
tasks.hotosm.org](https://tasks.hotosm.org/contribute?difficulty=ALL&text=covid)
其他资源
NAPSG 基金会
公共安全 GIS 国家联盟(NAPSG)正在其网站上收集与新冠肺炎相关的各种资源,包括地图、仪表盘、数据、资源等。
最后更新:上午 11:40 美国东部时间 04/13/2020 NAPSG 基金会正在编制公开可访问的新冠肺炎地理空间和…
www.napsgfoundation.org](https://www.napsgfoundation.org/resources/covid-19/)
OGC
开放地理空间联盟(OGC)正在收集许多地理空间资源,包括底图、数据和数据管道、资源、仪表盘以及关于可视化数据和制图最佳实践的建议。
了解新冠肺炎疫情的范围及其与人口、基础设施和其他方面的关系
www.ogc.org](https://www.ogc.org/resources-for-COVID-19-from-ogc)
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。**
使用四键的地理空间索引
给地球正方
当你在网上或手机上浏览交互式地图时,你看到的是一幅幅方形拼贴画的效果。每个图块包含一点地图信息,并与其周围的八个图块完美匹配。这种安排非常有效,以至于你几乎不可能察觉到你不是在浏览一个无限的位图,而是一个有限的小方块。
本文的目的不是深入研究所谓的“滑动地图的复杂性,而是讨论一个有趣的数学副产品,它用于唯一地引用瓦片,但在地理空间索引应用程序中也非常有用。为了跟踪他们的交互式地图解决方案,微软开发了一个索引概念,这在其在线文档中有详细描述,即 Bing 地图磁贴系统。
这个索引系统还有其他不太明显的应用,比如地理空间区域的划分和它们在数据库中的有效索引。它的工作原理有点像优步的 H3,但是它没有使用“六边形”,而是使用了“正方形”的层次结构我在几何形状的名字周围加了引号,因为它们在球体上的投影自然会扭曲它们。
我们之前已经看到了使用 H3 地理空间索引系统的优势,不仅用于快速参考,还用于快速距离查询。由于它们的几何形状,正方形的工作效率不高。不过,它们也有显著的优势,不仅在为光滑地图生成定制切片时,而且在索引矩形数据时。这里我考虑的是对在线地图服务的查询。这些查询通常需要一个边界框规格,矩形(至少在投影坐标中),而不是六边形。
缓存使用案例
为了激励使用 Bing 地图磁贴系统及其“四键”概念背后的数学,让我们回到我已经发布的关于探索车辆能源数据集的代码。在之前的一组文章中,我通过将数据转换成数据库,将出行数据聚类成其端点簇,使用 H3 计算地理围栏多边形,并最终命名它们来接近 VED。
这个命名过程包括通过他们的公共和免费的天桥 API 从 OpenStreetMap 服务中检索数据。我还设计了一个非常简单的缓存机制,以避免在开发代码时重复调用 API。用户不应该滥用 API 并尽可能缓存检索到的数据。我缓存 API 结果的方法很幼稚,因为我使用集群标识符作为文件名的基础。这里没有地理参考,并且如果聚类算法参数化改变,这些文件名容易改变。
我在本文中探索的另一个解决方案涉及到使用以某种方式在地理上被引用并且与算法变化无关的文件名。输入四键代码。
四键
quadkey 这个名字是 quadtree key 的缩写。这些键中的每一个都编码了由细节级别组织的纬度和经度空间中的正方形区域。在第一层,整个可绘制的地球表面分成四个四键。可以把它想象成一个地图缩放级别,让你看到整个世界。每个四键都有一个一位数的代码,从 0 到 3。通过放大到下一个级别,四个原始四键中的每一个都分裂成四个,我们在代码中添加另一个数字。下面的图片来自微软官方文档,描述了这个过程。
上图说明了如何根据位置和细节层次导出四键代码。(图片来源:微软- 必应地图磁贴系统)
通过查看上面的图像,我们可以立即想象一个可能的“代数”来操作四键。计算特定四键的邻居、孩子或父母的操作会立即浮现在脑海中。也可以查询四键的地理属性,比如角、中心和边的长度。幸运的是,这种数学工具已经以" pyquadkey2 " Python 包的形式存在。
如果你用低级软件开发人员的眼光来看待四键编码,你会发现编码一个细节层次只需要两位。典型的 23 级最大值只需要 46 位来编码,这允许我们使用 64 位整数来存储这些代码。幸运的是,上面的包所遵循的二进制四键的规范已经存在。
缓存示例
让我们看看如何在缓存用例中使用四键。这个想法是收集包含所有聚类点的最小四键集,然后只查询 OSM 的边界坐标。然后,代码将每个回复存储在一个相应的 JSON 编码的文本文件中,该文件根据使用的四键命名。通过这种方式,我们得到了一个仅依赖于地理位置的 OSM 数据缓存,而不是依赖于聚类方案。下图显示了编号为 52 的簇的 18 级四键。
上图显示了 52 号星团,叠加的四键用于缓存其 OSM 数据。作者创造的形象。
正如您所看到的,细节层次的选择是一个重要的决定,它允许您在四键的数量和为每个键收集的信息量之间进行权衡。官方文档包含一个指导您选择细节层次的表格。表格的第三列显示了在赤道以米/像素测量的地面分辨率。选择每像素米作为单位揭示了它的最终目的:使用 256 像素宽的方形图块的光滑地图。您需要将列值乘以 256,以获得赤道上四键边的米数。在第 18 层,我们得到 152.88 米。请记住,当你远离赤道,宽度缩小到零。
密码
要遵循代码描述,请克隆 GitHub 库并运行名为:
07-cluster-names-quadkey.ipynb
这个文件是一个已有文件的修订版,具有相同的前缀号码和旧的缓存实现。请注意,在运行上面的笔记本之前,您可能必须执行以前的笔记本,以准备好要使用的数据库。
我们从管理缓存的函数开始。第一个是对 OSM API 的低级调用,在没有缓存信息时使用。
下一个函数使用四键作为输入来查询数据。它确定数据是否已经被缓存,在这种情况下,它只从相应的文件中读取数据,如果没有,则从 API 中查询数据并缓存它。
注意我们是如何查询 quadkey 在西南角和东北角的地理坐标的。现在我们有了四键数据,我们必须在查询它之前合并它。请记住,每个簇通常有多个四键。为了连接数据,我们必须首先查询它的元素类型,即“node”和“way”,为此我们使用了 next 函数。
执行实际合并的函数剥离所有元数据,只保留“元素”数组。
现在,当合并 OSM 数据包列表时,我们可以使用前面的函数作为构建块。
该代码使用下面的函数检索与单个集群相关联的四键。每个点被转换成一个四键代码,并添加到一个集合中,为了唯一性,转换回一个列表,并返回。
我们现在准备将所有代码放在一个函数中,该函数检索单个集群的合并 OSM 数据。
从这个函数开始,笔记本代码非常接近于它的原始版本。唯一有意义的增加是在地图上再现了四键“方块”,如上面星团 52 的图像所示。
结论
本文展示了如何使用四键数学来生成地理空间索引。这些操作非常类似于 H3,但是是正方形而不是六边形。我们已经看到六边形对于某些应用更好,例如 KNN 搜索。尽管如此,正方形对于模拟 sippy 地图瓦片和与地球的纬线和经线对齐的矩形区域是完美的。由于将四键代码打包成 64 位整数更加方便,并且支持非常高效的 Python 包,四键确实是地理空间工具包中的另一个好工具。
参考
资源
CartoDB python-quadkey 存储库(这里使用的替代包)
YouTube: 地球平铺显示四键
相关文章
如何使用 HDBSCAN、H3、图论和 OSM 探索地理数据。
towardsdatascience.com](/geographic-clustering-with-hdbscan-ef8cb0ed6051) [## H3 的快速地理空间索引
H3 六角电力重装上阵!
towardsdatascience.com](/fast-geospatial-indexing-with-h3-90e862482585)
使用 R 的地质统计学实践
如何使用带有 R 的地理定位数据进行估计
介绍
在本文中,您将了解什么是地质统计学,以及如何使用克里金法(一种插值方法)利用地理位置数据进行估算。在我们的示例中,我们将获取纽约的房地产销售价格,并创建一个模型,为我们提供城市中任何位置的价格估计。
开始之前,让我们先了解一下如何将地统计数据插入到空间统计数据的字段中。
空间统计
空间统计学是统计学中一个相对较新的领域,它基于数据之间的空间相关性的思想:两个观测值在空间上越接近,它们的相关性就越强。时间相关性已经研究了很长时间,但是不可能将时间序列模型直接应用于空间数据,因为时间相关性假设通常使用序列相关性结构,而空间相关性发生在二维或三维。然而,有时空模型同时结合了两者。
在空间统计中,有四类数据:地统计、格网、点和流。我们在这里只讨论地质统计学,但是知道其他的有助于我们理解什么是地质统计学。
在地统计数据中,随机变量可以在集合中的任意无限点(例如,一个城市或一个国家)进行测量,尽管实际上,它只在某些点进行测量。这就是我们将使用的例子的情况:你可以在纽约的任何一点(我们的集合)有房地产价格(我们的随机变量),我们只在其中的一些点(销售实际发生的点)测量它。然后我们的兴趣将是为没有发生销售的点估计相同的变量。
地统计数据示例-按作者分类的影像
在点阵数据中,一个随机变量在一个有限集中被度量,用一个矩阵表示,可以是正则的,也可以不是。一个例子是,当我们把一个国家分成几个州,然后测量每个州的平均收入。
晶格数据的例子。如果你想探索这张地图,这里是它的链接——作者图片
在点数据中,随机性不一定来自变量,而是来自它的位置。例如,如果我们想要了解或预测城市中的犯罪地点:我们会有一系列犯罪地点,并对寻找高密度的聚类(危险区域)感兴趣。
点数据示例-按作者分类的图像
在流数据中,我们有一个随机变量,它不仅与一个位置相关,而且与两个位置相关。迁移数据就是一个例子:对于任意两两组合的地点,我们知道从一个地点到另一个地点的人数。
流量数据示例—按作者分类的图像
现在我们知道什么是地质统计学(什么不是)。在了解克里金法之前,我们还有最后一个话题要讲:变异函数。
变异函数
如果空间统计基于“两个观测值在空间上的距离越近,它们的相关性就越强”这一思想,则变异函数会根据这些观测值之间的距离显示相关性的表现。
变异函数被定义为“给定两次观测之间的距离,返回这两次观测之间差异的方差的函数”。
以下是纽约房地产价格的经验变异函数示例。
作者图片
正如我们所见,两栋建筑离得越远,它们的价格差异就越大,相关性就越低。
基于这些点,我们可以估计一个非常适合它们的函数,然后将它用于克里金法。
作者图片
克里金法
克里金法是一种插值方法:给定一些数据点,它试图找到一个穿过这些点的函数,这样就可以对中间值进行估计。
虽然线性回归和反距离加权插值法基于假设的预定义模型,但克里金法基本上是根据经验构建的。它的优势之一是它不是一个确定性的模型,而是一个概率性的模型,这意味着它不仅给你一个估计,它还告诉你你对这些估计有多确定。
进行这些估计的公式如下:
权重是根据变异函数估算的,并且完全取决于观测值之间的距离。
用 R 怎么做
数据
我们将使用在 Kaggle 上提供的数据集,其中包含 2016 年纽约市的房产销售数据:位置、价格、面积、税收等级等。鉴于我们在这里的目标,我们将忽略除了它的位置,价格和面积的财产的所有信息。我们使用面积的原因是我们想计算每平方英尺的价格,而不仅仅是销售价格。从现在起,我们将只谈每平方英尺的价格,并把它称为“价格”。
代码
完整的代码可以在这里找到。在本文中,我们将只浏览它的主要部分。
在进行了一些数据清理之后,我们首先来看看价格在地图上的表现:
**IN:**
# Plotting prices
mapnyc <- data.frame(latitude = db$lat,
longitude = db$lon,
price = db$PRICE.SQUARE.FEET)Token_map_box = #<mapbox API token>palette_rev <- rev(brewer.pal(10, "RdYlBu"))pal <- colorNumeric(palette = palette_rev, domain = c(max(mapnyc$price):min(mapnyc$price)))
leaflet() %>% addTiles(urlTemplate = Token_map_box) %>%
addCircleMarkers(data = mapnyc, color = ~pal(price), radius = 2)
是的,这和我们在开头看到的情节是一样的——作者的图片
正如我们所看到的,曼哈顿的销售少了很多,尤其是在较低的部分。此外,那里的价格似乎比皇后区(东部)要高很多。此外,我们可以看到,紧挨着水的房产也更贵,这是有道理的,因为他们可能有很好的风景。
现在,让我们看看价格是否遵循正态分布:
**IN:**
hist(db$PRICE.SQUARE.FEET)**OUT:**
作者图片
正如我们所看到的,我们的数据不是正态分布的,所以让我们使用它的日志来代替。请注意,这一步并非绝对必要:遵循正态分布的数据不是克里金法的假设之一。然而,在这种情况下,预测能力有所提高。
**IN:**
db$PRICE.SQUARE.FEET.log = log(db$PRICE.SQUARE.FEET)
hist(db$PRICE.SQUARE.FEET.log)**OUT:**
作者图片
目前,我们所做的只是使用一个常规的数据帧。然而,空间数据在 r 中的行为方式完全不同。我们可以将我们的数据框架转换为 SpatialPointsDataFrame,它将点数据存储为位置,以及关于它们的附加信息(如价格)。在此之前,我们还将把数据帧分成训练集和测试集,以便在最后计算一些误差指标。
**IN:**
# Train/test split
smp_size <- floor(0.75 * nrow(db))set.seed(123)
train_ind <- sample(seq_len(nrow(db)), size = smp_size)train <- db[train_ind, ]
test <- db[-train_ind, ]# Converting to spatialpointsdataframe
projection = "+proj=longlat +ellps=WGS84 +no_defs"train_spdf = SpatialPointsDataFrame(train[28:29], train[-c(28,29)], proj4string = CRS(projection))
test_spdf = SpatialPointsDataFrame(test[28:29], test[-c(28,29)], proj4string = CRS(projection))
db_spdf = SpatialPointsDataFrame(db[28:29], db[-c(28,29)], proj4string = CRS(projection))
请注意“sp”包中的函数 SpatialPointsDataFrame。它将位置列作为第一个参数,其余数据作为第二个参数,投影作为第三个参数。投影是将球面坐标转换成平面坐标的函数。有许多不同的方法可以做到这一点,我们使用了 WGS84 系统。
然后我们移除所有重复的位置,因为克里金法在每个位置只取一个值(价格)。
**IN:**
# Removing duplicate locations
train_spdf = train_spdf[-zerodist(train_spdf)[,1],]
test_spdf = test_spdf[-zerodist(test_spdf)[,1],]
db_spdf = db_spdf[-zerodist(db_spdf)[,1],]
现在,让我们通过查看一般经验变异函数来看看是否存在任何空间相关性。同时,我们还可以找到变差函数的最佳拟合,并将两者一起绘制。
**IN:**
# Choosing the best variogram
vario.fit = autofitVariogram(PRICE.SQUARE.FEET.log~1,
train_spdf,
model = c("Exp", "Sph"),
kappa = c(0, 0.01, 0.05, seq(0.2, 2, 0.1), 5, 10),
fix.values = c(NA),
start_vals = c(NA),
verbose = T)fit.v = vario.fit$var_modellzn.vgm <- variogram(PRICE.SQUARE.FEET.log~1, train_spdf) # calculates sample variogram values
lzn.fit <- fit.variogram(lzn.vgm, model=fit.v, fit.kappa = TRUE) # fit modelplot(lzn.vgm, lzn.fit) # plot the sample values, along with the fit model**OUT:**
作者图片
这里的经验变异函数用圆圈表示,而我们的拟合用直线表示。“automap”软件包有一个名为“autofitVariogram”的功能,它从用户给定的参数组合(如函数的形状)中找出经验变异函数的最佳拟合。空间相关性似乎很明显,我们的线与数据相当吻合,所以我们继续。
现在我们已经从可用数据中获得了变差函数,我们希望绘制新数据的估计值,以便创建纽约的价格热图。要做到这一点,我们需要一个 NY 网格,它实际上是城市边界内的一组小方块。这也许是讨论 r 中不同类型的空间数据的好时机。空间坐标可以给你点、线或多边形。我们的价格数据是以点数给出的,纽约市的边界是以多边形给出的,可以在这里下载作为 shapefile(。shp)。
**IN:**
# Getting NY polygon
ny_polygon = st_read('data/borough_boundaries/geo_export_a88ff5b0-7fb1-479d-a22b-224328f6d976.shp')
ny_polygon = st_transform(ny_polygon, projection)spd <- sf::as_Spatial(st_geometry(ny_polygon), IDs = as.character(1:nrow(ny_polygon)))
spd_data = ny_polygon
spd_data$geometry = NULL
spd_data <- as.data.frame(spd_data)
spd <- sp::SpatialPolygonsDataFrame(spd, data = spd_data)grid <- makegrid(spd, cellsize = 0.001)
grid <- SpatialPoints(grid, proj4string = CRS(projection))
grid <- grid[spd, ]
我们在这里做的是使用与原始数据相同的投影获得 NY 多边形,将其转换为 SpatialPolygonsDataFrame,然后使用它来制作网格,其中每个单元格的大小等于变量“cellsize”。该数值越小,地图就越详细(或像素化程度越低),但构建地图的时间就越长。
然后,我们转到克里金法部分本身,将它应用到网格中:
**IN:**
# Kriging
heat = krige(PRICE.SQUARE.FEET.log ~ 1, locations = train_spdf, newdata = grid, model = fit.v)heat %>% as.data.frame %>%
ggplot(aes(x=x1, y=x2)) + geom_tile(aes(fill=var1.pred)) + coord_equal() +
scale_fill_gradient(low = "yellow", high="red") +
scale_x_continuous(labels=comma) + scale_y_continuous(labels=comma) +
theme_bw()**OUT:**
作者图片
这里,我们使用函数“克里格”,告诉它使用什么模型(“fit.v”是我们拟合变差函数的地方),“newdata”是我们的网格。然后我们将其绘制成热图,我们可以清楚地看到曼哈顿下城周围的高价格区域为红色区域,尽管我们在那里没有太多的数据。
然后,让我们评估我们的模型在测试数据中的性能,将其与另一个更简单的方法进行比较:K-最近邻 (KNN)。简而言之,KNN 要做的是,对于测试集上的每一栋建筑,取最近的 K 栋建筑的价格(在我们的例子中,K 的最佳值是 14),并用它们的平均值来估算价格。我不会在这里讨论我们的 KNN 模型的细节,因为这不是本文的范围,但是您可以在 GitHub 上的完整代码中找到它。
**IN:**
kriging_error = rmse(test_spdf$PRICE.SQUARE.FEET, exp(kriging_test_prediction$var1.pred))knn_error = rmse(test$PRICE.SQUARE.FEET, exp(knn_model$pred))# final results
cat(paste('Kriging error:', kriging_error, '\nKNN error:', knn_error))**OUT:**
Kriging error: 159.360604969667
KNN error: 162.557634288862
这里,我们使用了均方根误差 (RMSE)来比较这两个模型,它取预测值和实际值之间的平均平方差的平方根。正如我们所见,克里金法误差略小,但幅度非常小。根据应用的不同,选择 KNN 可能会更好,因为它计算起来更快更容易。然而,这里的目标是展示克里金法的工作原理以及如何使用 r。
更进一步
如果您想使用这些数据尝试更高级的方法,那么查看克里金回归可能会很有意思,它使用其他解释变量(例如建筑物的建造年份)将克里金与回归结合起来。
此外,如果您喜欢这篇文章,您可能也会对另外两篇文章感兴趣:
从人群中获取样本的最好方法是什么?
towardsdatascience.com](/sampling-methods-for-data-science-ddfeb5b3c8ed) [## 如何提高你的机器学习模型质量?
数据科学家减少分类 ML 模型错误的逐步方法
towardsdatascience.com](/how-can-you-improve-your-machine-learning-model-quality-b22737d4fe5f)
如果你想进一步讨论,请随时通过 LinkedIn 联系我,这将是我的荣幸(老实说)。
用 JavaScript 实现 GeoTIFF 坐标查询
如何在没有外部库的情况下从地理空间栅格像元中检索数据
如果您在 Node.js 或客户端 JavaScript 中构建地理空间应用程序,您最终可能需要从特定坐标的栅格中提取数据,或者提取大量数据。从历史上看,这在 JavaScript 中并不简单,因为地理空间栅格最常见的格式是 GeoTIFF 文件类型,不容易解析。
作者图片
有一些可用的解决方案,随着 JavaScript 语言和节点生态系统的最新进展,这不再是过去的技术障碍。
GDAL?
在 JavaScript 真正有能力解析 GeoTIFF 文件之前——除非你用自己的包装器包装底层编程语言——最好的办法是通过exec()
调用另一个应用程序,比如 python 脚本或命令行实用程序。第一个想到的是gdallocationinfo
,它是 GDAL 套件的一部分,可用于使用纬度和经度查询栅格,如下所示:
gdallocationinfo -valonly -wgs84 <geotiff filename> <longitude> <latitude>
如果您只是查询栅格中的一个点,这种方法就足够了。然而,有一些问题:
- 如果在客户端这样做,用户必须安装 GDAL。
- 除了每次解析文件之外,通过
exec()
调用它还有一个开销。
作为一个现实世界的例子,使用这种方法查询 60 个 GeoTIFF 文件中的一个点,每个文件有数百个波段,在速度相当快的计算机上需要大约 10 秒钟的处理时间。多个点会很快累积成不合理的时间量。
如果调用 shell 脚本和加载文件是大部分开销,那么为什么不使用为库提供绑定的gdal
npm 包呢?截至 2020 年 9 月,这也不是一个很好的选择,主要是因为它需要 GDAL 版本 2(当前版本是 3.1),所以如果你在你的机器或服务器上安装了 GDAL,你将不得不做一些困难的版本杂耍来使它工作,如果你甚至可以让它从源代码开始构建。它也不提供异步绑定,这意味着如果您不希望您的线程被阻塞,您必须设置 web workers(如果运行 Node.js 服务器,这是有问题的,取决于您打算做多少处理)。
作者图片
GeoTIFF.js
这个库已经存在了 4-5 年,几个月前才发布了 1.0.0 版本。GeoTIFF.js 不仅为同名文件类型提供了读写功能,还提供了内置的异步功能,甚至还有一个 web worker 池来处理更重要的任务。
该库本身没有提供一种简单的方法来查询栅格中的地理坐标,因此您需要自己编写该功能。然而,一旦您从 GeoTIFF 中提取地理元数据,这就非常容易了。
首先,加载 GeoTIFF 及其相关图像。为了获得最佳效果,请确保首先将其投影到 WGS84。如果您将文件保存在内存中,您将不会处理从磁盘中重复读取它的开销,尽管它可能很小:
const file = await geoTIFF.fromFile(<geotiff filename>);
const image = await file.getImage();
现在,获取地理信息并计算一些数字,您将使用这些数字来计算哪个像素对应于给定的纬度和经度:
const bbox = image.getBoundingBox();
const pixelWidth = image.getWidth();
const pixelHeight = image.getHeight();
const bboxWidth = bbox[ 2 ] - bbox[ 0 ];
const bboxHeight = bbox[ 3 ] - bbox[ 1 ];
边界框数据存储为[xMin, yMin, xMax, yMax]
。我们现在可以获得坐标,并计算出它对应于哪个像素:
const widthPct = ( <longitude> - bbox[ 0 ] ) / bboxWidth;
const heightPct = ( <latitude> - bbox[ 1 ] ) / bboxHeight;
const xPx = *Math*.floor( pixelWidth * widthPct );
const yPx = *Math*.floor( pixelHeight * ( 1 - heightPct ) );
注意, *heightPct*
已经被倒置,因为这个天气模型的原点在左下角。一些天气模型在右上角有它。你可能需要写一些代码来决定是否基于这个事实反转 *heightPct*
。
现在怎么办?当然,您可以从image
中提取整个光栅。对于较小的图像,这很好,您可以将整个数据数组保存在内存中,这样查询起来非常便宜和快速。但是,如果您正在处理大型栅格和/或大量波段,这将需要很长时间和相当多的内存。
幸运的是,GeoTIFF.js 提供了一种使用边界框提取栅格的方法,因此我们将只使用一个逐个像素的边界框。事实证明,这非常快速,即使是在具有大量波段的非常大的栅格上也是如此(此外,GeoTIFF.js 支持切片栅格-切片大栅格应该可以进一步提高性能,但我尚未对其进行测试。):
const window = [ xPx, yPx, xPx + 1, yPx + 1 ];
const data = await image.readRasters( {window} );
现在你有了这个特定点上所有波段的数组。
[
Float32Array [ 0.07990912348031998 ],
Float32Array [ 0.16144123673439026 ],
Float32Array [ 0.1751343011856079 ],
Float32Array [ 0.2101452350616455 ],
Float32Array [ 0.2505287826061249 ],
Float32Array [ 0.3461601734161377 ]
...
]
请注意,您可以让readRasters
使用一个 web worker 池,这增加了多线程的潜力,但是使用这样小的边界框,启动一个新的 web worker 的开销会大大降低性能,所以不建议使用这种方法。
作者图片
性能比较
GeoTIFF.js 查询逻辑如何应对对gdallocationinfo
的调用?这可能取决于你打开了多少个文件(尤其是重复打开),但是我的实验和实践结果是决定性的。在一个固态硬盘上,我使用相同的纬度和经度查询了相同的栅格(大约 500px 乘 200px,有 250 个波段),并记录了经过的毫秒数。
exec(gdallocationinfo…)
Run 1: 62ms
Run 2: 163ms
Run 3: 64ms
Run 4: 68ms
Run 5: 176ms
----
Average: 106.6ms
这种方法似乎每运行几次就会经历随机的停顿,这对它的总处理时间是有害的。除了我的服务器之外,我的开发计算机也注意到了这一点。
GeoTIFF.js
Run 1: 58ms
Run 2: 60ms
Run 3: 60ms
Run 4: 54ms
Run 5: 57ms
----
Average: 57.8ms
这个库不仅比调用gdallocationinfo
稍快,而且性能非常稳定,几乎将平均处理时间减半。
使用这种技术,我能够将 JavaScript 天气预报算法的性能提高近三倍,因为它可以读取大约 60 个地理位置和数千个波段。使用gdallocationinfo
,这通常需要大约十秒钟。在使用 GeoTIFF.js 切换到上述技术后,该算法运行时间不到三秒。如今,通过一些额外的缓存技术,我的生产服务器可以在不到一秒钟的时间内检索到从几千个栅格波段生成的预测-只有迁移到完整的二进制或其他一些更具编译性的解决方案,性能才有可能得到显著提高。
当然,还有其他读取 GeoTIFF 数据的外部库,但是用exec()
调用它们似乎不太可能比 GeoTIFF.js 提供更多的优势,特别是因为您无法将 GeoTIFF 图像或数据本身(作为原始数值数组)缓存在您的 JavaScript 应用程序中。
是的,你总是可以用一种实际上适合处理这些数据的语言或框架来阅读 GeoTIFFs,但是这种范式正在开始改变。JavaScript 继续发展和成熟,Node.js 中构建的服务器变得越来越常见,实现类似基于浏览器的天气模型分析应用程序不再是白日梦。您可能需要使用这种技术。也许你会想出更快的东西,如果是这样,我很想听听!
使用 Bitnami 获得完全配置的 Apache Airflow Docker 开发堆栈
我已经使用它大约两年了,来构建定制的工作流界面,如用于实验室信息管理系统(LIMs)、计算机视觉预处理和后处理管道的界面,以及设置和忘记其他基因组学管道。
我最喜欢的气流特征是,它对你正在做的工作或工作发生的地点完全不可知。它可以发生在本地、Docker 映像上、Kubernetes 上、任意数量的 AWS 服务上、HPC 系统上等等。使用 Airflow 可以让我专注于我试图完成的业务逻辑,而不会在实现细节上陷入太多。
在那段时间里,我采用了一套系统,通过 Docker 和 Docker Compose 快速构建主开发堆栈,使用了Bitnami Apache air flow stack。一般来说,我要么使用相同的 Docker compose 堆栈(如果它是一个足够小的独立实例)将堆栈部署到生产环境中,要么在我需要与其他服务或文件系统交互时使用 Kubernetes。
比特纳米 vs 滚自己的
我曾经用康达卷自己的气流容器。我仍然对我的大多数其他容器使用这种方法,包括与我的气流系统交互的微服务,但是配置气流不仅仅是安装包。此外,即使只是安装这些软件包也是一件痛苦的事情,我很少能指望一个没有痛苦的重建工作。然后,在包的顶部,您需要配置数据库连接和消息队列。
在来了 Bitnami 阿帕奇气流 docker 组成栈为开发和 Bitnami 阿帕奇气流舵图为生产!
用他们自己的话说:
Bitnami 使您可以轻松地在任何平台上安装和运行您最喜爱的开源软件,包括您的笔记本电脑、Kubernetes 和所有主要的云。除了流行的社区产品之外,现已成为 VMware 一部分的 Bitnami 还为 IT 组织提供了一种安全、合规、持续维护且可根据组织策略进行定制的企业产品。https://bitnami.com/
Bitnami 堆栈(通常)从 Docker 构建堆栈到舵图的工作方式完全相同。这意味着我可以使用我的 compose 栈进行本地测试和开发,构建新的映像、版本、包等,然后部署到 Kubernetes。配置、环境变量和其他一切都是一样的。从头开始做这一切将是一项相当大的任务,所以我使用 Bitnami。
他们有大量的企业产品,但这里包含的所有东西都是开源的,不涉及付费墙。
不,我不属于 Bitnami,虽然我的孩子吃得很多,对出卖没有任何特别的道德厌恶。;-)我刚刚发现他们的产品非常棒。
项目结构
我喜欢把我的项目组织起来,这样我就可以运行tree
并且对正在发生的事情有一个大概的了解。
Apache Airflow 有 3 个主要组件,应用程序、工作程序和调度程序。每个都有自己的 Docker 映像来区分服务。此外,还有一个数据库和一个消息队列,但是我们不会对它们进行任何定制。
.
└── docker
└── bitnami-apache-airflow-1.10.10
├── airflow
│ └── Dockerfile
├── airflow-scheduler
│ └── Dockerfile
├── airflow-worker
│ └── Dockerfile
├── dags
│ └── tutorial.py
├── docker-compose.yml
所以我们这里有一个名为bitnami-apache-airflow-1.10.10
的目录。这就引出了非常重要的一点!钉住你的版本!它会让你省去那么多的痛苦和挫折!
那么我们有一个 docker 文件每个气流件。
使用以下内容创建此目录结构:
mkdir -p docker/bitnami-apache-airflow-1.10.10/{airflow,airflow-scheduler,airflow-worker,dags}
Docker 撰写文件
这是我对docker-compose.yml
文件的偏好。我根据自己的喜好做了一些更改,主要是我固定版本,构建我自己的 docker 映像,我为dags
、plugins
和database backups
安装了卷,并添加了 Docker 插槽,这样我就可以在我的堆栈中运行DockerOperators
。
你随时可以去抢原文docker-compose
这里。
version: '2'
services:
postgresql:
image: 'docker.io/bitnami/postgresql:10-debian-10'
volumes:
- 'postgresql_data:/bitnami/postgresql'
environment:
- POSTGRESQL_DATABASE=bitnami_airflow
- POSTGRESQL_USERNAME=bn_airflow
- POSTGRESQL_PASSWORD=bitnami1
- ALLOW_EMPTY_PASSWORD=yes
redis:
image: docker.io/bitnami/redis:5.0-debian-10
volumes:
- 'redis_data:/bitnami'
environment:
- ALLOW_EMPTY_PASSWORD=yes
airflow-scheduler:
# image: docker.io/bitnami/airflow-scheduler:1-debian-10
build:
context: airflow-scheduler
environment:
- AIRFLOW_DATABASE_NAME=bitnami_airflow
- AIRFLOW_DATABASE_USERNAME=bn_airflow
- AIRFLOW_DATABASE_PASSWORD=bitnami1
- AIRFLOW_EXECUTOR=CeleryExecutor
# If you'd like to load the example DAGs change this to yes!
- AIRFLOW_LOAD_EXAMPLES=no
# only works with 1.10.11
#- AIRFLOW__WEBSERVER__RELOAD_ON_PLUGIN_CHANGE=true
#- AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION=False
volumes:
- airflow_scheduler_data:/bitnami
- ./plugins:/opt/bitnami/airflow/plugins
- ./dags:/opt/bitnami/airflow/dags
- ./db_backups:/opt/bitnami/airflow/db_backups
- /var/run/docker.sock:/var/run/docker.sock
airflow-worker:
# image: docker.io/bitnami/airflow-worker:1-debian-10
build:
context: airflow-worker
environment:
- AIRFLOW_DATABASE_NAME=bitnami_airflow
- AIRFLOW_DATABASE_USERNAME=bn_airflow
- AIRFLOW_DATABASE_PASSWORD=bitnami1
- AIRFLOW_EXECUTOR=CeleryExecutor
- AIRFLOW_LOAD_EXAMPLES=no
# only works with 1.10.11
#- AIRFLOW__WEBSERVER__RELOAD_ON_PLUGIN_CHANGE=true
#- AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION=False
volumes:
- airflow_worker_data:/bitnami
- ./plugins:/opt/bitnami/airflow/plugins
- ./dags:/opt/bitnami/airflow/dags
- ./db_backups:/opt/bitnami/airflow/db_backups
- /var/run/docker.sock:/var/run/docker.sock
airflow:
# image: docker.io/bitnami/airflow:1-debian-10
build:
# You can also specify the build context
# as cwd and point to a different Dockerfile
context: .
dockerfile: airflow/Dockerfile
environment:
- AIRFLOW_DATABASE_NAME=bitnami_airflow
- AIRFLOW_DATABASE_USERNAME=bn_airflow
- AIRFLOW_DATABASE_PASSWORD=bitnami1
- AIRFLOW_EXECUTOR=CeleryExecutor
- AIRFLOW_LOAD_EXAMPLES=no
# only works with 1.10.11
#- AIRFLOW__WEBSERVER__RELOAD_ON_PLUGIN_CHANGE=True
#- AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION=False
ports:
- '8080:8080'
volumes:
- airflow_data:/bitnami
- ./dags:/opt/bitnami/airflow/dags
- ./plugins:/opt/bitnami/airflow/plugins
- ./db_backups:/opt/bitnami/airflow/db_backups
- /var/run/docker.sock:/var/run/docker.sock
volumes:
airflow_scheduler_data:
driver: local
airflow_worker_data:
driver: local
airflow_data:
driver: local
postgresql_data:
driver: local
redis_data:
driver: local
锁定您的版本
这里用的阿帕奇气流的版本是1.10.10
。1.10.11
有一些我想加入的很酷的更新,所以我会继续关注它!
您可以通过查看主站点上的变更日志来随时了解最新的 Apache Airflow 版本。
我们正在使用 Bitnami,它的机器人可以在新版本发布时自动构建和更新它们的映像。
虽然这种方法对机器人来说很棒,但我不推荐仅仅希望最新版本能够向后兼容并与你的设置兼容。
相反,固定一个版本,当新版本出现时,在您的开发堆栈中测试它。在写这篇文章的时候,最新的版本是1.10.11
,但是它不能开箱即用,所以我们使用1.10.10
。
比特纳米阿帕奇气流码头标签
一般来说,一个 docker 标签对应一个应用版本。有时也有其他变体,如基本操作系统。在这里,我们可以只使用应用程序版本。
Bitnami Apache air flow Scheduler 图像标签
构建自定义图像
在我们的docker-compose
中,我们有占位符来构建自定义图像。
我们现在只创建一个最小的 Docker 文件。稍后我将展示如何用额外的系统或 python 包定制 docker 容器。
气流应用
echo "FROM docker.io/bitnami/airflow:1.10.10" > docker/bitnami-apache-airflow-1.10.10/airflow/Dockerfile
会给你这个气流申请 docker 文件。
FROM docker.io/bitnami/airflow:1.10.10
气流调度程序
echo "FROM docker.io/bitnami/airflow-scheduler:1.10.10" > docker/bitnami-apache-airflow-1.10.10/airflow-scheduler/Dockerfile
会给你这个气流调度 docker 文件。
FROM docker.io/bitnami/airflow-scheduler:1.10.10
气流工人
echo "FROM docker.io/bitnami/airflow-worker:1.10.10" > docker/bitnami-apache-airflow-1.10.10/airflow-worker/Dockerfile
会给你这个气流工 docker 文件。
FROM docker.io/bitnami/airflow-worker:1.10.10
调出堆栈
抓住上面的docker-compose
文件,让我们开始吧!
cd docker/bitnami-apache-airflow-1.10.10
docker-compose up
如果这是您第一次运行该命令,这将需要一些时间。Docker 将获取它还没有的任何图像,并构建所有的 airflow-*图像。
导航到用户界面
一旦一切就绪并开始运行,导航到位于[http://localhost:8080](http://localhost:8080.)
的 UI。
除非您更改了配置,否则您的默认username/password
是user/bitnami
。
登录查看您的气流网络用户界面!
添加自定义 DAG
这里有一个我从阿帕奇气流教程中抓取的 DAG。为了完整起见,我把它包括在这里。
from datetime import timedelta
# The DAG object; we'll need this to instantiate a DAG
from airflow import DAG
# Operators; we need this to operate!
from airflow.operators.bash_operator import BashOperator
from airflow.utils.dates import days_ago
# These args will get passed on to each operator
# You can override them on a per-task basis during operator initialization
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': days_ago(2),
'email': ['airflow@example.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5),
# 'queue': 'bash_queue',
# 'pool': 'backfill',
# 'priority_weight': 10,
# 'end_date': datetime(2016, 1, 1),
# 'wait_for_downstream': False,
# 'dag': dag,
# 'sla': timedelta(hours=2),
# 'execution_timeout': timedelta(seconds=300),
# 'on_failure_callback': some_function,
# 'on_success_callback': some_other_function,
# 'on_retry_callback': another_function,
# 'sla_miss_callback': yet_another_function,
# 'trigger_rule': 'all_success'
}
dag = DAG(
'tutorial',
default_args=default_args,
description='A simple tutorial DAG',
schedule_interval=timedelta(days=1),
)
# t1, t2 and t3 are examples of tasks created by instantiating operators
t1 = BashOperator(
task_id='print_date',
bash_command='date',
dag=dag,
)
t2 = BashOperator(
task_id='sleep',
depends_on_past=False,
bash_command='sleep 5',
retries=3,
dag=dag,
)
dag.doc_md = __doc__
t1.doc_md = """\
#### Task Documentation
You can document your task using the attributes `doc_md` (markdown),
`doc` (plain text), `doc_rst`, `doc_json`, `doc_yaml` which gets
rendered in the UI's Task Instance Details page.

"""
templated_command = """
{% for i in range(5) %}
echo "{{ ds }}"
echo "{{ macros.ds_add(ds, 7)}}"
echo "{{ params.my_param }}"
{% endfor %}
"""
t3 = BashOperator(
task_id='templated',
depends_on_past=False,
bash_command=templated_command,
params={'my_param': 'Parameter I passed in'},
dag=dag,
)
t1 >> [t2, t3]
不管怎样,把这个文件放到你的code/bitnami-apache-airflow-1.10.10/dags
文件夹里。文件名本身并不重要。DAG 名称将是您在文件中设置的名称。
气流会自动重启,如果你刷新用户界面,你会看到新的tutorial
DAG 列表。
建立自定义气流码头集装箱
如果你想添加额外的系统或 python 包,你可以这样做。
# code/bitnami-apache-airflow-1.10.10/airflow/Dockerfile
FROM docker.io/bitnami/airflow:1.10.10
# From here - https://github.com/bitnami/bitnami-docker-airflow/blob/master/1/debian-10/Dockerfile
USER root
RUN apt-get update && apt-get upgrade -y && \
apt-get install -y vim && \
rm -r /var/lib/apt/lists /var/cache/apt/archives
RUN bash -c "source /opt/bitnami/airflow/venv/bin/activate && \
pip install flask-restful && \
deactivate"
明确地说,我不再特别赞同这种方法,除了我喜欢添加flask-restful
来创建定制的 REST API 插件。
我喜欢像对待 web 应用程序一样对待 Apache Airflow。我已经被烧了太多次,所以现在我的 web 应用程序只负责路由和渲染视图,其他的什么都不管。
除了它处理我的工作流的业务逻辑之外,气流几乎是一样的。如果我有一些疯狂的熊猫/tensor flow/opencv/任何我需要做的东西,我会将它们构建到一个单独的微服务中,而不会触及我的主要业务逻辑。我喜欢把气流想象成盘踞在网中的蜘蛛。
不过,我有足够的偏执,我喜欢建立自己的图像,这样我就可以把它们推到我自己的 docker repo。
总结和从这里去哪里
现在您已经有了基础,是时候构建您的数据科学工作流了!添加一些自定义 Dag,创建一些自定义插件,一般构建东西。
如果你想要一个教程,请随时联系我,在 jillian@dabbleofdevops.com 或者在推特上。
小抄
这里是一些有希望帮助的命令和资源。
登录到 Apache Airflow 实例
默认的用户名和密码是user
和bitnami
。
Docker 编写命令
建设
cd code/bitnami-apache-airflow-1.10.10/
docker-compose build
拿出你的筹码!运行docker-compose up
会让您的所有日志出现在 STDERR/STDOUT 上。
cd code/bitnami-apache-airflow-1.10.10/
docker-compose build && docker-compose up
如果您想在后台运行,请使用-d
。
cd code/bitnami-apache-airflow-1.10.10/
docker-compose build && docker-compose up -d
比特纳米阿帕奇气流配置
您可以使用传递到 docker-compose 文件中的环境变量来进一步定制气流实例。查看自述文件了解详情。
加载 DAG 文件
定制的 DAG 文件可以挂载到/opt/bitnami/airflow/dags
或者在 Docker 构建阶段复制。
使用 Docker Compose 指定环境变量
version: '2'
services:
airflow:
image: bitnami/airflow:latest
environment:
- AIRFLOW_FERNET_KEY=46BKJoQYlPPOexq0OhDZnIlNepKFf87WFwLbfzqDDho=
- AIRFLOW_EXECUTOR=CeleryExecutor
- AIRFLOW_DATABASE_NAME=bitnami_airflow
- AIRFLOW_DATABASE_USERNAME=bn_airflow
- AIRFLOW_DATABASE_PASSWORD=bitnami1
- AIRFLOW_PASSWORD=bitnami123
- AIRFLOW_USERNAME=user
- AIRFLOW_EMAIL=user@example.com
码头后清理
Docker 会在你的文件系统上占据很多空间。
如果您只想清理气流通道,那么:
cd code/docker/bitnami-apache-airflow-1.10.10
docker-compose stop
docker-compose rm -f -v
运行docker-compose rm -f
会强制删除所有容器,-v
也会删除所有数据卷。
移除所有 docker 图像
这将停止所有正在运行的容器并删除它们。
docker container stop $(docker container ls -aq)
docker system prune -f -a
这将删除所有容器和数据卷
docker system prune -f -a --volumes
最初发表于【https://www.dabbleofdevops.com】。
冷静点。线性回归中何时添加协变量
精确测量效果指南!
丹·万鲁宁
线性回归模型使得在其他变量(协变量)不变的情况下测量治疗效果变得容易。但是什么时候以及为什么要包含协变量呢?
这篇文章将回答这个问题。
首先,我们将在预测的上下文中讨论协变量:当它们改进超出样本拟合时添加它们。
然后,我们将讨论何时应该使用协变量来衡量因果效应,何时不应该:
获得正确的测量结果
- 添加可能导致估计偏差的混杂因素
- 不要添加下游结果
- 不要添加碰撞器
得到精确的估计
- 添加可预测结果的质控品,而非治疗品,以提高精确度
- 不要添加预测治疗但不预测结果的质控品
帖子摘要
预测:使用样本外性能
如果您不影响回归中任何变量的值,您可能只关心预测。例如,如果你想卖一套公寓,你可能想预测销售价格。你可以对其他公寓的销售价格进行回归训练,包括卧室数量等协变量。在这种情况下,您可能只关心如何准确预测销售价格。你可能不想评估如果你增加一间卧室,你能多卖多少钱(相比之下,这是一个因果问题)。
要决定是否应将协变量添加到预测上下文中的回归中,只需将数据分为训练集和测试集。使用协变量而不使用训练数据来训练模型。无论哪个模型在测试数据中预测得更好,都应该使用。
添加协变量会减少预测中的偏差,但会增加方差。样本外拟合是这种权衡的评判标准。如果你有很多变量,像 L1 正则化这样的技术可以帮助你决定包括哪些变量。你也可以考虑更复杂的黑盒模型,因为你不关心可解释性。
当你试图测量因果关系时,事情变得更加复杂。
因果效应
回归是可以解释的。通过回归系数,很容易确定回归中变量的变化如何与结果的变化相关联。例如,如果你拥有很多狗狗美容沙龙,你可能会考虑是否要在狗狗离开时给它们头巾,让它们看起来很可爱。
泰迪熊
您想知道赠送头巾是否会增加收入,因此您进行了回归分析:
其中 gives_bandanas 是一个 0,1 的指示变量,表示沙龙是否提供头巾。\beta_1 将准确地告诉您赠送头巾对收入的影响。
向回归中添加或不添加控件的原因通常分为两类:
- 获得正确的测量结果(如减少偏差)
- 效果测量的精度
获得正确的测量
在 3 种主要情况下,向您的回归中添加协变量会影响或破坏您的最终治疗效果估计。
- 混杂因素(包括它们)
- 下游结果(不包括它们)
- 碰撞器(不包括它们)
添加可能使评估产生偏差的混杂因素
如果不考虑混杂因素,它们可能会使您的治疗效果评估不正确。混杂因素是指影响治疗价值和结果的因素。
例如,让我们说,在高档社区的顾客更倾向于要求头巾。高档社区也往往会有人在狗狗美容上花更多的钱。因此,花哨会影响治疗(不管美容院是否提供头巾)和结果(收入),而且是一个混杂因素。
让我们举例说明:
现在让我们看看如果我们不控制幻想会发生什么。
混杂、有偏模型(gives_bandanas 系数包括花哨效应)
gives _ bandanas 的真正效果是收入增加 10000 美元,但我们测量的效果要大得多。事实上,真实的效果甚至不在我们模型的 95%置信区间内。
但是如果我们在回归中加入幻想会怎么样呢?
控制混杂因素模型是无偏的
现在我们有了一个精确的效果测量!
检查这些混杂因素的一个好方法是在有和没有混杂因素的情况下进行回归。如果感兴趣的系数(如 gives _ bandanas)变化很大,这是存在偏见的迹象。
扩展:查看我的 stats stackexhange 帖子,看看无偏系数需要什么数学假设。关键假设是严格的外生性(类似于感兴趣的变量(如 gives _ bandanas)和回归中不受控制但也会影响结果的其他变量之间没有相关性)。
虽然控制混杂因素是有帮助的,但是控制下游结果或碰撞会扭曲我们估计的治疗效果。
不添加下游结果
如果我们加入由我们的治疗引起并影响结果的变量,我们将通过增加的变量去除我们的治疗对结果的影响。例如,让我们想象这样一种情况,给狗送头巾会使顾客更有可能回到美容院,而收入会受到有多少顾客回来的影响。
让我们看看当我们将回报率作为协变量时,赠送头巾的效果是如何丧失的。
让我们看看回归是如何运行的:
当不包括下游效应时,我们想要什么
当我们不包括下游变量时,我们得到一个非常接近真实的+100 效应的估计效应。
但是如果我们把包括进去呢:
下游效应吸收并消除处理的影响
将 return_rate 添加到回归中消除了使用头巾的影响。这是因为保持 return_rate 不变,赠送头巾实际上没有影响。但是我们仍然对使用头巾的效果感兴趣(即使通过其他变量),所以我们不应该控制下游的影响。
我们不仅需要担心添加下游效果,还需要担心添加碰撞器。
不要加对撞机
对撞机是一个受治疗和结果影响的变量。在回归中加入对撞机会扭曲治疗和结果之间的关联。例如,一个沙龙是否作为储藏室。如果你的沙龙赠送手帕,你可能需要一个壁橱来存放它们,因此赠送手帕会影响是否有储藏室。此外,收入高的沙龙可能会看到更多的顾客留下东西,因此这些沙龙需要一个地方来存放失物。让我们考虑一个例子,其中头巾对收入没有任何影响,但如果我们意外地控制了这个碰撞器,就可以找到关联。
回归在没有碰撞器的情况下运行良好。
没有对撞机,没有问题
我们没有测量任何给头巾的效果,碰撞器不包括在内。这是一件好事,因为在这种情况下,头巾没有收入的影响。但是当我们加入对撞机时会发生什么呢?
对撞机让头巾看起来有效果,其实没有!
现在我们测量了赠送头巾和实际上并不存在的收入之间的显著负相关。这是因为回归的“固定不变”解释。对于给定的存储价值,收入与赠送手帕成负相关。
知道是否添加协变量来精确测量效果是最重要的,但知道协变量何时可以提高估计的精确度也很重要。
协变量对系数估计精度的影响
如果协变量可以预测结果,并且与您试图估计其系数的变量不高度相关,则协变量可以提高您估计特定系数的精确度。
这个结果可能看起来与直觉相反:增加协变量不是应该增加方差从而降低精度吗?对结果的预测是这样,但对回归系数的估计却不是这样。
如果我们满足普通最小二乘法的一些标准假设(我们的结果和协变量之间的关系是线性的,单位之间不相互影响,治疗和影响结果的其他协变量之间没有相关性,homoskedastity—请参见我的 stats stackexchange 帖子了解所有假设和含义)治疗系数的 OLS 估计方差为:
分母中的和指的是在我们的治疗应用中有多少差异(给予头巾)。这与我们添加的协变量无关。
\sigma 是回归的误差方差。我们对回归结果的预测越好,这个值就越低。因此,如果我们添加对结果有高度预测性的协变量,sigma 将会降低,我们将会有更高的精确度。
但是,如果我们以 gives _ bandana 作为结果,以所有其他协变量作为解释变量来运行回归,R _ { gives _ bandanas }代表 R。这意味着,如果我们添加与治疗高度相关的协变量,我们对治疗系数的估计将具有更高的方差。这说明了一个事实,你不应该增加与治疗高度相关的变量,除非它们是与结果高度相关的混杂因素。
我们来举例说明。假设赠送头巾与美容院所在位置的狗的数量无关,但美容院的收入相关(将狗的数量加入回归将提高精确度)。还有,假设沙龙是否从当地的大手帕供应商那里获得广告影响了沙龙是否赠送大手帕,但不直接影响沙龙的收入(加上沙龙是否收到广告会降低精准)。
让我们从仅使用治疗的回归开始。
公正处理的无偏测量
我们测量了一个相当接近 5 的真实影响的精确效果。
现在让我们添加预测协变量。
当我们增加一个好的预测器时,测量更精确
现在我们可以更精确地测量效果了!gives _ bandanas 上的系数更接近 5,标准误差更低。
但是如果我们增加了一个与治疗相关的非预测因素呢?
当我们增加一个与治疗相关的非预测因子时,精确度会降低
现在我们的精度更低了,离 5 的真实效果更远了。
摘要
总结一下,请参考下面的图表。如果你想了解更多关于通过实验测量效果的知识,请查看我的其他帖子:
帖子摘要
以最简单的方式在谷歌云平台上获得深度学习
两分钟内在 GCP 上创建一个深度学习虚拟机
照片由 lalo Hernandez 在 Unsplash 上拍摄
亲爱的读者:
我问你这些问题:
- 你想快速开始在云端训练你的深度神经网络吗?
- 想学点云计算但是不知道从哪里开始?
- 买不起 GPU 却租得起?
如果你回答**“是的!”我的朋友们,请继续读下去。会让你的生活轻松一点!**
(注意:我喜欢详细地设置我的虚拟机。有趣的是,我发现这里描述的步骤完全不令人满意!)
食谱
我假设你登录了你的 GCP 账户。
在您的菜单中,转到AI Platform -> Notebooks
:
这会带你去Notebook Instances
:
点击NEW INSTANCE
并选择您想要使用的图像。作为一名谷歌粉丝,我选择最新的TensorFlow
图片。
其中一些图像是为深度学习而构建的。如果你想用 GPU 训练你的网络,选择With 1 NVIDIA Telsa K80
。
好的好的好的。我能听到你。我也问过自己同样的问题:
“如果我想使用运行在具有 96 个 vCPUs 的虚拟机上的 8 个 NVIDIA Tesla V100s,我该怎么做?”
如果你愿意支付这些费用,你可以点击CUSTOMIZE
获得。如果你接受默认值,不要担心。此过程将创建一个成熟的计算引擎虚拟机,您可以在以后轻松地对其进行修改。
在我们继续之前,勾选Install NVIDIA GPU driver automatically for me
。这照顾我们的 GPU 设置!
现在按下那个CREATE
按钮。
稍等一会儿…
看到绿色勾号后,点击OPEN JUPYTERLAB
。
瞧啊。现在,您可以使用云中的 GPU“深入学习”了!这就是全部,我的朋友们。
如果我想进一步定制我的虚拟机,该怎么办?
这个也很容易做到!
点击主菜单中的Compute Engine
。你会在那里看到你漂亮的虚拟机。
停止虚拟机以开始编辑它。像这样做你所有平常的奇妙变化:
- 添加防火墙规则,以便您可以在另一个端口上运行 TensorBoard
- 添加额外磁盘
- 增加虚拟 CPU 的数量,但随后却减少了数量,因为您已经被触手可及的处理能力搞疯了
- 对你的公羊做同样的事
- 用你的 GPU 做同样的事情
就是这样!各位,不使用虚拟机时,一定要记得关闭它们。
直到下一次,
贾斯廷
原载于 2020 年 4 月 4 日【https://embracingtherandom.com】。
熟悉数据科学最强大的武器~变量(Stat-02)
图片由皮克斯拜的 Gerd Altmann 提供
变量类型的基本概念、测量级别和不同的 python 表示技术
“你可以拥有没有信息的数据,但你不能拥有没有数据的信息.”—丹尼尔·凯斯·莫兰
数据是信息时代的原材料。没有数据,我们就无法想象现代技术。如果我们有数据,我们就能获得大量关于任何事件或空间的信息。当今世界对数据有着强烈的渴望。就现代技术而言,它可以与石油相提并论。
但是如果你不知道数据,这没有任何意义。首先,我们必须熟悉我们正在探索的数据。如果我们不了解数据,我们建立在数据之上的系统或分析模型将会以无用的分析或系统而告终。因此,我们需要熟悉数据类型及其表示技术。
该参数保存的数据在统计学中称为变量。一个数据集可能描述股票市场,其他数据集可能描述人口、雇员数据等等。因系统而异。具有变化值的属性是变量。
这篇文章将在这方面帮助你。这里将显示所有变量类型和变量的可能图形表示。如果你感兴趣,这将是最适合你的文章。让我们开始吧。
内容
- 变量的类型
- 测量级别
- 使用 python 的数据表示(条形图、饼图、排列图
1.变量的类型
数据来源庞大。我们可能会从不同的数据源中找到不同类型的数据。但是了解数据的特征是很重要的。变量定义了数据的特征。有一些参数,我们可以很容易地划分或分类的变量。基本上有两种类型的变量。
变量类型(作者照片)
主要有两种变量类型:I)分类变量和 ii)数值变量
我。分类:分类变量代表可以分组的数据类型。它也被称为定性变量。
示例 : 汽车品牌是一个分类变量,包含奥迪、丰田、宝马等分类数据。答案是保存分类数据是/否的分类变量
二。数值:所有用数字表示的变量称为数值变量。它也被称为定量变量。它可以是 a)离散的,或 b)连续的。
**a)离散:**简单来说,所有包含可数数据的变量称为离散变量。
示例 : 变量-子女数量、SAT 分数、人口等。,所有这些变量都包含离散数据。
**b)连续:**不可数的变量称为连续变量。它需要永远计数,计数过程将永远不会结束。
例子:年龄是一个连续变量。但是为什么呢?假设,你的年龄是 25 年 2 个月 10 天 7 小时 40 秒 44 毫秒 10 纳秒 99 皮秒……等等。它永远不会结束。另一个例子可能是"**平均值"**变量。取平均数 1.232343542543245……永无止境。
变量的快速比较。
定量对比定性(作者照片)
2.测量级别
根据维基百科,“衡量标准或衡量尺度是一种分类,描述了分配给变量 s 的值内的信息的性质。”
心理学家斯坦利·史密斯·史蒂文斯提出了最著名的四个测量等级的分类。音程 iv。比率
标称和序数标尺用于测量定性/分类变量。另一方面,区间和比值刻度用于测量定量/数值变量。
测量水平(作者照片)
一、名义上的:它是一个拉丁语单词,意思是只有名字。名义层代表不能按任何顺序排列的类别。该级别仅代表单个类别或名称。
- 它只代表质量。
- 有了名义尺度,我们可以确定变量中两个个体之间的差异。
- 它没有提供任何关于差异大小的概念。
例:假设,一个变量代表汽车品牌→奥迪、丰田、宝马等。我们不能以任何方式排列这些名字。因此,这类变量属于名义计量水平。
二世。序数:是有序的级别或等级。它表示可以排序的分类变量。有了这个尺度,我们可以确定一个变量的差异方向,但不能确定差异的大小。
举例:我们有一个名为 Height 的变量,代表矮、中、高三种人的身高。我们可以很容易地将这些值排序为高→中→矮。这个顺序提供了一个很好的关于差异方向的直觉,但是它没有提供任何线索来识别彼此之间的高度差异。
序数尺度直觉(照片通过统计如何进行)
**三世。区间:**一个代表水平之间相等的区间,可以用实数表示的变量称为区间标度。它不仅对测量值进行分类和排序,而且还指定标尺上每个区间之间的距离在从低区间到高区间的标尺上是相等的。
例:温度是一个变量,其中 10 摄氏度与 20 摄氏度、70 摄氏度、80 摄氏度之间的间隔相同。考试成绩、身高、时间等。可以作为区间尺度的一个很好的例子。
**四。比率:**它具有区间标度一样的所有性质。此外,它必须满足标度中有意义的零。先说清楚。
假设,我们在考虑 C 和 F 标度的体温。我们发现两个人的体温分别是 10 摄氏度和 20 摄氏度,或者 10 华氏度和 20 华氏度。我们不能说第二个人的体温比第一个人高两倍。因为 0°C 和 0°F 不是真正的零度,这意味着不存在温度。如果你想用一个比例标度来表示温度,那么我们必须考虑开尔文标度,因为 0 开尔文表示没有温度。
3。用 Python 进行数据表示
在这里,我们将讨论柱状图、饼状图和排列图来表示变量。
分类变量表示:
假设,我们有一个汽车销售市场的数据集,我们将分析汽车品牌变量。首先,我们计算不同汽车品牌的频率。好像是下面这样的东西。
演示汽车品牌频率
让我们把它转换成数据帧。因为我们要用这个演示数据来分析图形表示。频率代表每个品牌售出汽车的数量。您可以对任何数据集进行同样的操作。让我们用熊猫数据帧来转换图像。
import pandas as pd
import matplotlib.pyplot as plt
df=pd.DataFrame({"Brand":['Audi',"BMW","Mercedes"],"Frequency":[124,98,113]})
熊猫数据框
计算相对频率
相对频率表示个体频率分布的百分比。
*相对频率(%)=(个别频率/总频率)100
df['Relative Frequency(%)']=
round((df.Frequency/sum(df.Frequency))*100,2)
我们在主数据集中添加了一个相对频率列。
具有相对频率栏的数据框
让我们用频率画一个条形图。
条形图:
import matplotlib.pyplot as pltfig,ax=plt.subplots()
var=plt.bar(df.Brand, df.Frequency, align='center', alpha=0.5)#this loop is used to represent frequency on each bar
for idx,rect in enumerate(var):
height = rect.get_height()
ax.text(rect.get_x() + rect.get_width()/2., 1.01*height,
df.Frequency[idx],
ha='center', va='bottom', rotation=0)#adding labels and title
plt.ylabel('Frequency')
plt.xlabel('Brand Name')
plt.title('Car Sales Statistics')plt.show()
这是一个频率条形图。
条形图代表频率
我们还可以用饼图来表示不同分类数据之间的频率分布。
饼图:
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
ax.axis('equal')ax.pie(df.Frequency, labels = df.Brand,autopct='%1.2f%%')
plt.show()
相对频率饼图。
相对频率饼图
帕累托图
帕累托图是一种特殊类型的条形图,其中类别按频率降序显示,单独的曲线显示累计频率。
具有累积频率的数据帧。
我们用 python 来画图吧。
from matplotlib.ticker import PercentFormatterdf = df.sort_values(by='Frequency',ascending=False)
df["Cumulative Frequency"] = round(df["Frequency"].cumsum()/df["Frequency"].sum()*100,2)
fig, ax = plt.subplots(figsize=(10,5))
ax.bar(df.Brand, df["Frequency"], color="blue")
ax2 = ax.twinx()
ax2.plot(df.Brand, df["Cumulative Frequency"], color="red", marker="D", ms=7)
ax2.yaxis.set_major_formatter(PercentFormatter())ax.tick_params(axis="y", colors="black")
ax2.tick_params(axis="y", colors="black")
ax2.set_ylim(0,105)
ax.set_ylim(0,130)
plt.show()
频率表的排列图。
图表的左侧代表频率,右侧代表累积频率
到目前为止一切顺利。我们在文章的最后。
数字变量表示:
我们还可以用条形图、饼图和排列图来表示数字数据。如果我们想找到数字数据的频率,我们可能会发现每个数据的频率为 1。但是表示数据是不可行的。那么,我能做什么呢?
我们可以把数值数据分成不同的区间,然后统计区间内数据出现的频率。让我们试着对 python 数据框架有更好的直觉。
df=pd.DataFrame({"data":[10,40,20,5,30,100,110,70,80,63,55,32,45,85,87,77,65,44,33,4,56,90,95,96]})
数据帧的前 5 个数据。
如果要统计频率,大部分数据的频率会是 1。
df['data'].value_counts()
这给出了频率…
数字数据的频率。
现在,如果我们想用条形图、饼图来表示上述频率,它不提供任何信息。所以,我们需要计算间隔内的频率。假设,我们将数据分成 5 个相等的区间。
d=df['data'].value_counts(bins = 5).sort_index()
它显示了下面的频率分布。
左栏表示间隔,右栏表示频率。
我们可以用柱状图,饼状图和排列图来表示数字变量的频率。试着按照上面的技巧画出数字变量的图表。这是你的任务。
结论
分母变量对于数据科学任务非常重要。在我们分析的最开始,我们必须看一看它。我们经常忘记把它考虑进去。希望这几分钟的阅读能让你对变量,变量的类型等等有一个很好的直觉。你将在 Github 中获得完整的 jupyter 笔记本文件。
如果你有任何问题,请在评论区告诉我。
数据科学统计系列文章
- 少即是多;采样的‘艺术’(Stat-01)
- 熟悉数据科学最重要的武器~变量(Stat-02)
- 要提高数据分析能力,您必须了解频率分布(Stat-03)
- 通过可视化频率分布找到数据集的模式(Stat-04)
- 比较多个频率分布,从数据集中提取有价值的信息(Stat-05)
- 通过简短的讨论消除你对 Mean 的误解(Stat-06)
- 通过规范化提高您的数据科学模型效率(Stat-07)
- 【数据科学基础概率概念(Stat-08)
- 从朴素贝叶斯定理到朴素贝叶斯分类器路线图(Stat-09)
- 数据科学爱好者关于假设检验需要知道的一切(Stat-10)
- 用 ANOVA 进行多组间的统计比较(Stat-11)
- 用卡方检验比较分类变量的相关性(Stat-12)
通过参加兼职项目,在你的 DS 工作中获得额外的学分
是时候探索你舒适区之外的一些未被触及的数据库了。
保罗·吉尔摩在 Unsplash 上的照片
你已经开始工作一段时间了,事情看起来很好,你的日子可能充满了完善一些核心模型。但是过了一段时间,你可能会对更新你的任务清单感兴趣:你刚刚完成了一件大事,正在寻找一个小任务来打破常规吗?遭遇“文思枯竭”,不确定下一步该怎么做?或者,也许你只是想让别人注意到你打算要求的加薪?有很多方法可以处理这些情况,但是偶尔,如果你想在你的时间表中增加一些新的东西,我建议你做一个工作方面的项目!
什么是“兼职项目”?
即使你的公司确实有一个数据科学团队,也有理由猜测仍然有很多地方和大量数据没有发挥出它们的全部潜力。我说的是数据科学团队以外的任务,这些任务可能会帮助其他员工或公司:你是否熟悉一些还没有人接触过的数据,并且你可以帮助从中提取一些见解或预测?也许销售部门想要一个季节性的模型?或者下一个可能流失的客户是谁?也许反欺诈部门可以得到帮助,自动抓捕坏人?如果你很难想出例子,就问问你的老板或同事,看他们是否能想出什么。如果失败,去找最近的分析师团队。
分析师?
分析师是伟大的人。他们天生好奇,超级透彻,通常拥有无价的领域知识,这些知识是他们经过数月甚至数年完善的。他们可能很擅长 SQL、数据库和仪表板。最好的甚至用一些 python 脚本,使用 pandas 或 sklearn。但是,即使他们是顶尖的,他们通常也达不到大多数数据科学家能做的事情:使用机器学习,这就是你的用武之地!
如果到目前为止,您仍然想不出您可以帮助谁以及如何帮助,请直接与分析师团队交谈:询问他们的任务,他们做什么会占用他们的大部分时间,他们在进行分析时会关注什么特性。如果他们已经使用了某种结构化数据,那么明智地将它与其他数据混合在一起可能会奏效?礼貌地请求,只有少数人会拒绝帮助。如果你能为一项可能的任务找到线索——现在是赚钱的时候了。试着拿着一个你可以摆弄的虚拟 CSV 走开。它不需要很长或很复杂,甚至不需要所有可能的栏目,只要能让你开始就行了。
不要做什么?
不要(不要!)光顾,看不起或认为你可以通过简单的自动化和一个花哨的 jupyter 笔记本来消除某人的工作。无论你写的是什么代码,都可能被你采访的人使用。他们将是运行它的人,是判断你所做的是否有任何好处的人。他们的合作对这个项目的成功至关重要。试着看看他们的痛点是什么。描述一下你们合作项目的可能成果,看看这是否能让他们兴奋起来。
好的,我有一个 CSV 文件。现在怎么办?
确保你不要选择那些需要大费周章和清理的数据。记住,你实际上已经有了一份全职工作,我们只是伸手去摘一些容易摘到的果子。获取数据,了解你试图解决的问题类型(回归?分类?),那么就运行一个简单的模型。看看你是否真的能预测到什么。看看特征重要性,看看是否有有用的东西跳出来。
我的案例研究
我被安排帮助公司的反欺诈团队对欺诈进行建模。到目前为止,分析师一直在对一些数据库进行 SQL 查询。他们之前了解了 2-3 个运行良好的特性,并通过 SQL 查询查看了那些特性中得分最高的项目。这些项目被标记为可疑,分析师将手动检查它们,以检查它们的其他质量是否也同样可疑。尽管这很有效,但它花了很长时间,对我来说,很明显我们可以一起做得更好:当我们有几十个其他功能时,为什么只看 2-3 个功能呢?
我得到了一个包含 1600 行历史欺诈和非欺诈交易的样本 CSV,有 8 个特征。我用 python 的 Catboost tree boosting 包来建模这个分类问题。该模型现在由分析师运行,他们定期添加他们认为可以改进该模型的更多特性。据估计,这使得消除欺诈的过程至少加快了 5 倍。
使用 Catboost
我强烈推荐这些任务的 Catboost 梯度推进包。它是如此强大和简单易用,以至于可能只需要 1-2 个小时就可以建立起第一个工作模型,即使你以前从未听说过这个软件包。即使在电脑上运行也很快;非常好地处理表格数据并使用分类特征而不需要预处理(no 1-热编码!只是标记哪一列是分类的)。即使没有超参数调整,它也能很好地工作。当然,你喜欢和熟悉的其他东西也很好,只要你记住,有一天,不是你的人可能会想经营它,所以保持简单。
很快
基本就是这样。最糟糕的情况是这个实验浪费了 3-4 个小时却没有任何效果。最好的情况是,你交了一个新朋友,也许学到了一些新东西,做了一些会在很长一段时间内有用(我敢说甚至非常有用)的事情。试试看!
资源:
- 关于 Catboost 的所有相关信息:https://catboost.ai/
获得真实世界的数据分析师经验
更多的实践机会可以让未来的分析师练习他们的技能,并真正理解手头的任务。
简介
对于有抱负的数据科学家和分析师来说,参加工作面试可能会令人紧张。对工作内容知之甚少或一无所知,使得在与经理或潜在团队成员的面试中很难进行有意义的对话。消除这种焦虑的方法之一是获得真实世界的经验,然而这是先有鸡还是先有蛋的问题的开始。在你获得经验之前,你需要被雇佣,但是在你被雇佣之前,你需要经验(看起来很熟悉?).
为了在讨论数据分析主题时有信心,你需要具备的一件事仍然是实际获得现实世界的经验,但是要获得这种经验,你需要通过面试。
这就是实习大有帮助的地方。我目前是一名分析师,但获得额外的实践经验不会有坏处,我听说了的虚拟实习,以及他们如何帮助有抱负的分析师获得丰富的实际经验,并在谈论数据科学和分析主题时更加自信。
实习流程
在虚拟实习期间,你将在分析主管的领导下与客户一起工作。首先,你将评估数据的质量。接下来,您将着手计划并详细说明从数据中获得洞察力所需采取的步骤。这涉及诸如数据探索、模型开发和解释之类的事情。在客户项目的最后阶段,您还可以创建一个将呈现给客户的自助式高管级仪表板。
我们将详细讨论这些步骤,我将在接下来的段落中分享我的工作成果。
实习很巧妙的一点就是可以看到资深咨询师的样板作品。他们可以用来衡量你的工作如何比较,并给你一个机会来更新你自己的。
任务 1 —数据质量评估
您将获得客户用例及其数据。您必须对数据进行评估,这项任务包括确定需要关注的领域,并给出缓解这些问题的建议。
在线存储照片和文档。从任何 PC、Mac 或手机访问它们。在 Word、Excel 或……上创建和协同工作
1drv.ms](https://1drv.ms/b/s!AqcNgsjUVF_BidtoywVth6QZwb9Ifg?e=73ashc)
任务 2 —分析方法(两周计划)
对于第二个任务,你应该给出一个详细的两周计划来概述你的方法。您应该包括数据探索、模型开发和解释的步骤。一个好的介绍将证明对客户是有用的。
在线存储照片和文档。从任何 PC、Mac 或手机访问它们。在 Word、Excel 或……上创建和协同工作
1drv.ms](https://1drv.ms/b/s!AqcNgsjUVF_BidtnjJIJug6MmoNmRA?e=Usb6ww)
任务 3 —仪表板
最后,您需要创建一个交互式自助服务控制面板,客户可以用它来回答以下问题:
- 如何利用现有客户和普查数据锁定新的高价值客户?
- 我们当前的哪个客户对我们的利润贡献最大?
- 关于我们的高价值客户,调查显示了什么?
哪个客户对我们的利润贡献最大?【Tableau 链接此处】
关于我们的高价值客户,调查显示了什么?【Tableau 链接此处】
总结
除了自学和参加 Kaggle 比赛,从实习中获得工作经验有助于保证你成为一名数据分析师。你将从中获得的一些技能是利用你的分析技能解决业务问题,确保数据质量,制作可解释的和准确的模型,并将这些见解传达给执行领导。这些都是任何有抱负的数据分析师或科学家的关键技能。
在分析工具方面,你也将获得大量使用微软 Power BI 和 Tableau 的实践。以及遵循和实施行业级数据质量评估框架。这意味着您将使用现有的公司指南来衡量您的数据的完整性、一致性和有效性。
作为一名分析师,我最喜欢的事情之一是,您可以使用外部数据源来揭示使用主数据集时不明显的模式。例如,我整合了澳大利亚人口普查数据和客户数据。这有助于我的洞察力,我建议你也去看看。
让我知道进展如何。如果你需要任何支持或者你想分享你的实习成果。你可以在这里找到我。
祝你好运!一定要把手弄脏,更重要的是,享受。
开始在 R 中使用反连接
什么是反联接&我如何使用它?
图片由 Free-Photos 来自 Pixabay
介绍
假设您已经对其他更常见的连接类型(内、左、右和外)有了一些了解;添加 semi 和 anti 可以证明非常有用,可以节省您原本可以采取的多个步骤。
在之前的一篇文章中,我概述了半连接的好处以及如何使用它们。在这里,我将用一个非常相似的反连接解释来跟进。
如果你想先复习一下半连接,你可以在这里找到。
过滤连接
反连接和半连接与我刚才强调的其他四个有很大的不同;最大的区别是它们实际上被归类为所谓的过滤连接。
从语法上看,它与任何其他连接都非常相似,但其目的不是用额外的列或行来增强数据集,而是使用这些连接来执行过滤。
过滤连接不是通过添加新的信息列来分类的,而是它有助于保持或减少给定数据集中的记录。
反加入者
使用反连接的目的是获取一个数据集,并根据某个公共标识符是否不在某个附加数据集中对其进行过滤。如果它出现在两个数据集中…它被排除。
一个很好的方法就是编写替代方案。
地区分析示例
假设您是一名数据分析师,正在帮助您的销售团队工作,该团队刚刚聘用了一名新的客户经理。这位新代表需要客户,销售主管希望确保这些客户目前没有被占用。对于这个问题,假设我们有两个数据集;一个包含所有帐户,另一个记录所有销售活动,这将有一个活动 id 和一个帐户 id。
第一个数据集
|帐户 id |当前所有者|帐户名称|收入
第二数据集
|活动标识|帐户标识|活动类型|
您需要做的是使用第二个数据集过滤第一个数据集。
在一个没有反联接的世界里
让我们首先尝试在不使用反连接的情况下解决这个问题
根据我们现在对左连接的了解,我们可以做以下事情:
accounts %>%
left_join(activity, by = 'account_id')%>%
filter(is.na(activity_type))
如您所见,我们可以将活动数据集连接到我们的帐户数据集。对于在该数据集中没有匹配的任何账户,活动类型将被填充为 NULL。因此,如果您想要一个不在第二个数据集中的帐户列表,您可以在 activity type 为 NULL 的地方进行筛选。
这很好,并且有效地执行了我上面解释的相同功能。两个讨厌的事情是 1。它为您提供了一个新字段 activity _ type2.如果同一个帐户在活动数据集中出现多次,那么当你加入时,它将为尽可能多的匹配创建一个新记录。
之后,我们还可以添加一条 select 语句来提取该字段,这只是增加了另一行代码,您可以编写这些代码来实现该功能。
accounts %>%
left_join(activity, by = 'account_id')%>%
filter(is.na(activity_type))%>%
select(-activity_type)
使用反连接进行简化
现在让我们用一个反连接来进一步简化事情。
accounts %>%
semi_join(activity, by = 'account_id')
这将使我们得到与上面每个例子完全相同的输出。它将过滤出出现在活动数据集中的客户记录。因此,在我们的场景中,只有未被处理的客户会被转移到新代表那里。这种方法不会向数据集中添加列或行。它专门存在,并用于过滤目的。
结论
现在,在短短的几分钟内,我们已经介绍了很多内容,并提供了一些 dplyr 功能,可以简化您的代码和工作流程。
我们了解到:
- 变异连接和过滤连接之间的区别
- 如何在没有反连接的情况下执行“过滤连接”
- 反连接的特定输出和意图
- 如何使用反连接
我希望这能对你作为数据专家的日常工作有所帮助。
祝数据科学快乐!
开始学习数据科学并在新冠肺炎期间获胜
了解企业如何从数据中获得洞察力,以降低成本并提高员工的工作效率。
www.mltrons.com 新冠肺炎期间的数据策略
都在你的数据里
“由于最近的疫情,游戏规则被颠倒了。随着物理接触的消失,企业需要走向数字化。”
目前的情况再糟糕不过了,但与此同时,它也为我们提供了创新的机会,因为新的人类需求每天都在涌现。从网上购物的繁荣到网上协作工作的转变,由于我们在过去十年中建立的虚拟世界,我们正在疫情中生存。
如今,当企业考虑数字化时,首先想到的是数据。每天都会产生大量的数据,这是我们利用这些数据制定决策的最佳时机。在这个不确定的时代,企业需要在更高的风险水平下,以更大的紧迫感和更广泛的影响力做出更好的决策。这比以往任何时候都更需要高速、大容量的高质量数据分析。
因此,如果你正在考虑如何开始利用数据科学,那么恭喜你,你已经领先了。为了帮助您踏上数据科学之旅,以下是研究表明企业现在应该做什么的指南。
1.构建清晰、集中的数据战略
对于一个组织来说,现在最糟糕的决定是减少其转型计划,并恢复到传统的工作模式。组织需要一个强大的集中式数据科学战略,并采用支持投资的方法。借助人工智能和高级分析,大部分价值将来自降低成本、提高生产率和缩短洞察时间。如果实施得当,这可以帮助公司提高 10-15%的总体底线。
因此,简而言之,企业应该将数据科学和分析建立为卓越中心。高管需要坐下来,用清晰的里程碑来定义转型的指导性愿景。更重要的是,公司的每一个员工都需要成为这种转变的一部分。
2.确定并构建目标业务用例
一旦定义了高级分析策略,数据科学家和业务用户需要在 2 到 3 个月的敏捷冲刺中一起工作,从原始数据到可操作的见解。识别为业务创造价值的用例是在病毒期间脱颖而出的关键。我们的研究表明,大部分投资都在数字营销和内部生产力方面,因此利用此类用例非常有益。最后一步是将移动数据应用于业务的多个方面。在这一步中,公司将开始看到思维方式向生产力的转变,因为数据驱动的思维节省时间,最终节省金钱。
3.在应用数据科学领域培训现有员工
组织应开展内部活动,对当前员工进行基本数据科学概念和基本技能的培训。
目标应该是让每个员工都掌握高级分析的基本应用。理想的结果是,组织希望其员工了解他们可以提出的问题类型,他们可以从高级分析中获得的价值,以及他们如何解释技术信息来推动业务决策。对于旨在直接提高员工生产率的企业来说,这种再培训将是一项重要的竞争要务,这一点在今天比以往任何时候都更加重要。
根据麦肯锡的一项研究,总的来说,年收入超过 1 亿美元的公司中,82%的高管认为,再培训和再技能培训至少是解决技能缺口的一半方法。
为什么是现在?
今天很明显,公司正在积极反思他们的数字化转型之旅,并探索建立强大的数字化足迹的方法。这是一个投资系统的好时机,这些系统可以帮助公司分析从在线来源收集的数据,以产生可操作的见解。我们必须承认,人工智能和高级分析已被证明是依赖它来推动业务决策的公司的竞争优势。
尽管经济增长率为负,但企业现在有足够的时间通过加强高级分析实践、将数据转化为竞争优势以及培训现有员工来赶上竞争对手。我们非常肯定,一旦经济复苏,实施这一计划的公司将看到两位数的增长前景。我们都知道数据是新的石油,利用它将产生巨大的价值,因此公司应该立即开始关注它。
为了给高管们提供建议,我们在新冠肺炎举办免费的 30 分钟一对一办公时间 来帮助这些高管建立他们的数据科学战略。 点击这里 即可报名
关于作者:Raheel Ahmad是一名企业家,是 NYU 坦登可视化成像与数据分析(VIDA)中心的访问研究员学者。他也是m trons 的联合创始人。
深度学习 OCR 入门
现代 OCR 的实用介绍,包括培训和测试所需的一切。
一项人类不该做的字符识别任务。
不久前,我开始研究潜在的 OCR 实现,目标是仅使用生成的训练数据在 tf.keras 2 中创建一个清晰的卷积递归神经网络(CRNN)基线。另一个目标是创建一个存储库,允许以后使用相同的模板探索不同的体系结构和数据域。该存储库应该是模块化的,易于使用,并充满解释性评论,以便我的同事可以很容易地跟进。
在高强度的谷歌搜索之后,我没能找到一个满足我要求的库。虽然有一些好的资源和实现,但我决定创建自己的[1、2、3。
在我的笔记本电脑 GPU 上训练下面的简单模型需要几分钟,但是没有 GPU 你也可以很容易地训练它。
传统的文档处理流水线通过应用 OCR 软件从文本图像中解析文本来工作。通常,图像由边界框模块预先准备,边界框模块为 OCR 模块隔离图像内的文本区域。管道的后续阶段将:解析文本,提取含义、关键字、值和表格,并以更易于编程的形式返回结果,如:数据库条目、CSV,或将输出与公司的内部系统集成。
在这篇文章中,重点是 OCR 阶段,以基于深度学习的 CRNN 架构为例。在 GitHub 中共同发布了一个完整的功能实现,旨在作为一个端到端管道模板,包括数据生成和推理。重点是提供一个清晰的、有良好文档记录的管道,可以很容易地扩展到不同的架构,而不是神经网络(NN)架构本身。
我的目标是让人们能够在不访问 GPU 或任何训练数据的情况下,仅使用存储库中的指令来训练和测试简单的 OCR 模型。这篇文章将讨论一些实现细节,但是对于那些只想尝试代码的人来说,这些并不是真正需要的。
注意,虽然在这个例子中为了简单起见我们只解析数字,但是在回购中使用的 trdg 文本生成器可以从维基百科生成随机句子,用于训练更通用的 OCR 模型。也就是说,为了在更具挑战性的数据领域(如噪声图像、手写文本或自然场景中的文本)上实现良好的性能,需要调整模型和数据增强方法。
CRNN
OCR 中常用的神经网络架构很少,比如 CRNN 和各种基于注意力的模型[ 4 , 5 ]。CRNN 模型使用卷积神经网络(CNN)来提取视觉特征,这些视觉特征被整形并馈入长短期记忆网络(LSTM)。然后,LSTM 的输出被映射到具有密集层的字符标签空间。
CRNN OCR 模型的基本构件。块内的层数和具体参数在不同的实现中有所不同。在推理时,不使用 CTC 丢失,而是将来自密集层的输出解码成相应的字符标签。详情见代码。
有时 LSTM 层可以被去除
LSTM 层的功能是学习文本的语言模型。例如,考虑一种情况,其中 CNN 特征提取层产生“tha_k you”的编码,但是 place _ 处的字符没有被很好地识别。也许在那个地方有一个污垢点或者字符是以一种草率的方式手写的。但由于 LSTM 层通过数据了解到文本中有大量的“谢谢”输入,OCR 可以预测正确的缺失字母。
同样的推理对随机字符串不起作用,比如“1252 _ 5”;在这种情况下,没有“语言模型”的上下文历史,所以实际上我们可以删除这个任务的 LSTM 部分,使模型更快更轻。这正是我们的数字唯一的例子,但真实的话,LSTM 层应该使用。
在提供的示例存储库中,LSTM 的使用由 use_lstm 布尔控制,它是 models.make_standard_CRNN()的输入参数。
实施
这里的重点是高层次的概述和 tf.keras 实现中几个稍微复杂的部分,尤其是与 CTC 损失相关的部分。鼓励有兴趣更详细了解 CTC 损失的人阅读 这篇 的优秀文章。
在最高级别上,训练代码构建由图像高度和我们的字典中的字符总数参数化的神经网络,创建数据生成器并训练模型。注意,在我们的实现中,训练和推理可以接受任何长度的文本,图像宽度不需要预先定义。
单个批次中的图像必须具有相同的尺寸,但这由数据生成器(下面的 datagen)负责,将图像填充到批次中最大图像的尺寸。训练数据完全由 trdg 模块生成。
以下代码行构造了回调函数,用于在每个时期后可视化批图像及其预测,并在训练期间保存已训练的权重。在此之后,我们编译模型,选择我们喜欢的优化器,并为选定数量的时期进行训练。
tf.keras 中的高级函数
破解 tf.keras 2.1 中的 CTC 丢失
在 tf.keras 2.1 中为 CRNN 实现 CTC loss 可能会很有挑战性。这是由于来自 NN 模型的输出(最后一个密集层的输出)是形状的张量(batch_size、时间分布长度、数据中唯一字符的数量),但是批量条目的实际预测目标是单词中的字符标签,例如[1,3,6,2,0,0,0]。因此,预测和目标将不会具有相同的形状。tf.keras 2.1 中的一个限制是 y_true 和 y_pred 的维度必须匹配。在推理时,我们只需要模型输出和 CTC 解码函数来产生字符标签。
除了批次的 y_pred 和 true 标签(batch_labels),ctc_batch_cost 还需要每个输入单词的字符数(label_length)。这需要忽略 batch_labels 中的“虚拟标签”,例如,在一个最长的字为 7 个字符长的批处理中,4 个字符的字在位置[4:7]中的标签,因此 batch_labels 的形状为(batch_size,7)。还有,我们要馈入 input_length,也就是 y_pred (y_pred.shape[1])的时间维度。
在某些 keras 实现中,损耗是在神经网络内部实现的,输出不是上面的 y_pred。在这些实现中,模型已经返回计算的 ctc 批次损失,并且在 model.compile()中使用虚拟损失来最小化来自 NN 的输出(CTC 损失)。我不想在模型中实现 loss,因为我认为这使得代码与标准的 tf.keras 格式不同,并可能在以后搜索不同的架构和参数时导致复杂性。
但是我仍然需要依靠一些黑客技术来解决 y_true 和 y_pred 的不匹配维度。最后,我将标签、输入长度和 batch_labels 嵌入到一个形状为 y_pred 的数组中,并将其作为 y_true 返回。这种打包在数据生成器中完成,张量在损失函数中解包。
数组的打包实际上也考虑了所需的参数。只有当发送到 CTC loss 的 y_pred 的时间维度大于批中最长文本的字符数时,打包才可能导致错误。但这是使用太多卷积的结果,或者是由于输入定义不当。一个 6 个字符长的单词不能通过建议 5 个字符来识别。
如何自己测试 OCR
要开始使用,下载或克隆 github repo 并设置包含 Tensorflow 2.1、 trdg (pip install trdg)和 Jupyter notebook 的 Python 环境。自述文件包含如何使用 Docker 设置环境的说明。
设置好环境后,用 jupyter 笔记本打开 笔记本 (点击查看示例输出)。执行第一个单元以创建模型、数据生成器和编译模型。第二个单元将训练模型。第三个单元格将调用推理函数来预测放置在 inference_test_imgs/文件夹中的所有图像中的文本。训练也可以通过主文件夹中的“python train.py”来完成,但是你会错过训练过程中的可视化输出。
从推理输出的例子来看,预测的准确性取决于训练参数、神经网络结构和所使用的数据生成参数。在这个例子中,我们将与第一和第三个例子相似的数字输入神经网络。人们可以通过探索不同的神经网络结构、训练参数、字体、背景和其他数据扩充参数来改进结果。
希望你能从这个简短的介绍开始!更多详情和评论请查看 Github **。**我们也希望聘请有好奇心的、久经考验的软件工程师来开发人工智能/人工智能产品,请随时联系我们。感谢您的阅读!
我在 Medium 的其他帖子:
图论入门
图论简化版
图论简介
这是我全新系列 图论:围棋英雄 的第一个帖子。查看本系列下一篇文章的索引页面。它总是得到很好的维护和更新。
图论本质上是对图或网络的性质和应用的研究。正如我上面提到的,这是一个巨大的主题,本系列的目标是了解如何应用图论来解决现实世界的问题。如果我们看看我们生活的前提,我们可以看到许多问题突然出现,这些问题又可以被建模为图表。例如,从所有给定的类别中选择一个服装组合可以被认为是一个完美的场景。
作者照片
如果我们从每个类别中选择一件商品,比如从帽子中选择一件,从 T 恤衫中选择另一件,等等,我们最终会有 n 个可能的选项。我们这里的限制是,每个类别只有有限数量的资源。尽管如此,我们还是有相当多的组合。在这种情况下,我们可以使用图表来展示每个节点中不同类别的服装,以及它们之间通过边的关系。希望节点和边背后的想法大家都知道。如果没有,节点可以被认为是每个类别的每个项目,例如,红色的帽子是一个节点,绿色的裤子也是一个节点。不同节点之间的关系可以使用边来描述,即从红色帽子到蓝色 t 恤。
图的另一个典型例子是朋友的社交网络。将数据可视化到图表上使我们能够生成并回答关于数据的不同有趣问题。
来自触摸屏的截图
在社交网络的情况下,我们可以问这样的问题:约翰有多少朋友,或者凯西和米兰之间有多少共同的朋友。
图形的类型
有不同类型的图形表示可用,我们必须确保在编程解决包含图形的问题时,我们理解我们正在处理的图形的类型。
- 无向图
顾名思义,节点之间不会有任何指定的方向。因此,从节点 A 到 B 的边与从 B 到 A 的边是相同的。
在上图中,每个节点可以代表不同的城市,边显示双向道路。
- 有向图
与无向图不同,有向图在不同的节点之间有方向或者说方向。这意味着如果你有一条从节点 A 到 B 的边,你只能从 A 移动到 B。
来自维基媒体的截图
和前面的例子一样,如果我们把节点看作城市,我们有一个从城市 1 到城市 2 的方向。这意味着,你可以从城市 1 开车到城市 2,但不能回到城市 1,因为没有从城市 2 回到城市 1 的方向。但是如果我们仔细观察图表,我们可以看到双向的城市。例如,城市 3 和 4 有指向两边的方向。
- 加权图
许多图可以有包含权重的边,以表示真实世界的含义,如成本、距离、数量等
照片由Estefania Cassingena Navone通过freecodecamp.org拍摄
加权图可以是有向图,也可以是无向图。在这个例子中,我们有一个无向加权图。从绿色节点到橙色节点的成本或距离是 3,反之亦然。我们可以将这种关系表示为类似于 (u,v,w) 的三元组,该三元组显示了边从哪里进入、去往哪里以及两个节点之间的成本或距离。就像我们之前的例子一样,如果你想在两个城市之间旅行,比如城市绿色和橙色,我们将不得不支付 3 美元的费用,或者换句话说,我们将不得不开车 3 英里。这些指标是自定义的,可以根据情况进行更改。对于一个更详细的例子,考虑你必须从绿色到粉红色的城市。如果你看看城市图,我们找不到两个城市之间的任何直接道路或边缘。所以我们能做的就是经由另一个城市旅行。最有希望的路线是从绿色开始,经过橙色和蓝色,变成粉红色。如果权重是城市之间的成本,我们将不得不花费 11 美元通过蓝色到达粉红色,但如果我们通过橙色选择另一条路线,我们将只需支付 10 美元。
特殊图形
除了上面的划分,我们还有另一组图叫做特殊图。
- 树
最重要的特殊图是树。这是一个没有圈的无向图。等价地,它有 N 个节点和 N — 1 条边。
作者照片
上面给出的所有图都是树,甚至最左边的图也是,因为它没有圈。
- 有根树
有根树是具有指定的根节点的树,其中所有其他节点或者朝向根或者远离根。
作者照片
红色的节点是根节点。最左边的树被称为树内,因为所有其他节点都向根节点靠近。另外两棵树是外树,因为所有其他节点都离开了根。
- 有向无环图 ( DAG s)
Dag 是没有圈的有向图。这些图在表示具有依赖关系的结构(如调度程序和编译器)时起着重要的作用。
作者照片
我们可以用这个图来表示有意义的事物之间的拓扑顺序。例如,如果我们在流程管理器中使用 DAGs,我们可以说子流程 x 和 y 应该在继续处理 z 之前完成。
- 二部图
二部图的顶点可以分成两个不相交的集合,比如 U 和 V,其中图中的每条边连接 U 和 V 之间的顶点。
截图来自 Wolfram Mathworld
如果我们看这个图,我们可以看到每个图可以分成两个不相交的集合(U,V ),每个边连接 U 和 V 之间的节点。
- 完整图形
我们称一个图为完全的当且仅当,每一对顶点之间有唯一的边连接。具有 n 个顶点的完整图被表示为 Kn。
截图来自 Wolfrom Mathworld
由于要遍历的边的数量,完全图被认为是最坏情况图。
图形的表示
在这里,我们讨论如何在内存中存储一个图形,以便进一步处理。
- 邻接矩阵
有效的方法是使用大小为 NxN 的矩阵,其中 N 是节点的数量。我们称这个矩阵为邻接矩阵。
上面给出的是一个有向加权图及其对应的邻接矩阵 M 。该矩阵的大小为 5×5,因为总共有 5 个节点。从节点 A 到 B 的成本是 4,在 **M[A][B]中给出。**类似地,从一个节点到其自身的成本是零,因此所有对角线元素将总是零。这是存储密集结构的图形信息的空间有效的方法,并且边查找将总是花费恒定的时间。但是,随着节点数量的增加,跟踪边信息所需的空间也将呈指数增长。如果大部分的边都没有适当的信息,我们将最终建立一个稀疏矩阵。
- 邻接表
我们用来存储节点和边信息的另一个重要结构是邻接表。这是从节点到边列表的映射。
摄影:苏伦德·巴斯瓦纳经由 researchgate.net
给出的例子是一个无向加权图。如果我们看最右边的图,我们可以看到从每个顶点开始的几个列表。节点 1 有两条输出边,即 2 和 5,我们用它的成本来表示这些信息。列表中的每个元素都有目标节点和相应的成本或权重。
如果邻接表是稀疏的,则邻接表是存储图信息的有效机制,即,与相同情况下的邻接矩阵相比,邻接表将占用更少的存储器。但是,这仍然是一个比邻接矩阵稍微复杂的表示。
- 边缘列表
边列表是一种简单地将图表示为无序边列表的方式。假设任何三元组(u,v,w)的符号表示:
“从 u 到 v 的成本是 w ”。
作者照片
对应于左侧的有向加权图,右侧给出了边列表。列表中的每一对都显示了两个节点之间的边信息以及相关的权重。
在接下来的帖子中,我们将讨论可以通过图论解决的不同问题。
Python 入门的 3 个简单技巧(放弃 Excel!)
面向 Excel 高级用户的熊猫介绍
让我们学一些蟒蛇和熊猫吧!资料来源:Nik Piepenbreier
所以你已经实现了思想上的飞跃,想要学习 Python——这太棒了!但是从哪里开始呢?
让我来指导您完成您已经知道如何在 Excel 中以及如何在 Python 中完成的任务!
您将使用 Pandas,这是 Python 中的主要数据分析库。
如果您需要安装 Pandas,您可以使用 pip 或 conda:
pip install pandas
#or
conda install pandas
Pandas 将数据加载到数据框中,你可以把它想象成 Excel 表格。
让我们将数据集加载到数据报中。您可以通过使用以下代码来实现这一点。我们还将使用熊猫头方法探索前五行:
用熊猫生成我们的数据框架。资料来源:Nik Piepenbreier
为了跟随 Excel 中的教程,文件可以在这里找到。
Excel 表格和 Pandas 数据框架之间有许多不同之处。让我们快速浏览一下!
比较 Excel 工作表和 Pandas 数据框架。资料来源:Nik Piepenbreier
好了,现在我们开始吧!
过滤、排序和重新排序列
Excel 是一个更加可视化的工具,可以很容易地点击一个按钮,抽象出你想要完成的功能。
按单列排序
在 Excel 中对单个列进行排序。资料来源:Nik Piepenbreier
例如,如果您想在 Excel 中对一列进行排序,您只需:
- 选择数据选项卡,
- 突出显示要排序的列,然后
- 单击从 A 到 Z 排序或从 Z 到 A 排序。
为了在熊猫身上做到这一点,你应该写:
熊猫按单列排序。资料来源:Nik Piepenbreier
按多列排序
有时您可能希望按多列排序。
在 Excel 中按多列排序。资料来源:Nik Piepenbreier
同样,Excel 使这变得很容易:
单击数据选项卡
- 点击排序
- 输入要作为排序依据的列
对于熊猫,只需在“by”参数中添加一个列表:
在 Pandas 中按多列排序。资料来源:Nik Piepenbreier
过滤列
在 Excel 中筛选列是一项简单的任务!只需点击数据选项卡,然后过滤。这将在所有列标题上创建箭头。当您点击这些时,只需填写您的选择:
在 Excel 中筛选列。资料来源:Nik Piepenbreier
对熊猫来说,这同样简单:
在 Pandas 中过滤一个列。资料来源:Nik Piepenbreier
最棒的是,您还可以使用比较运算符来选择 10 个以上的单位,或者基于多个条件进行选择:
- 比较:可以用>(大于)、<(小于)、==(等于)、> =(大于等于)、< =(小于等于),
- 和【条件】条件:将每个条件用括号括起来,并用与符号(&)将括号分开
- 或条件:用括号将每个条件括起来,并用竖线(|)将括号隔开
熊猫身上不同类型的过滤器。资料来源:Nik Piepenbreier
重新排序列
重新排序列更多的是给你自己一个视觉提示。
要在 Excel 中拖动对列进行重新排序,您可以通过单击列的标题来选择该列,将鼠标悬停在旁边,直到光标变为四向箭头,然后按住 SHIFT 键并将该列拖动到新位置:
在 Excel 中移动列。资料来源:Nik Piepenbreier
要在 Pandas 中完成同样的事情,您只需按照您想要的列的顺序将它们放入一对方括号中:
熊猫栏目重新排序。资料来源:Nik Piepenbreier
数据透视表(含百分比)
数据透视表是那些在 Excel 中把你带到下一个级别的东西之一。
它们允许您轻松快速地汇总数据,而无需依赖复杂的公式。
假设您想知道每个地区的总销售额,您可以:
- 选择数据,单击“插入”选项卡上的“数据透视表”,然后单击“确定”创建表格。
- 将 Region 拖动到“行”框中,将 Sales 拖动到“值”选项卡中。Excel 会自动假设我们要将这些值相加。
在 Excel 中创建数据透视表。资料来源:Nik Piepenbreier
要在 Pandas 中完成同样的事情,您可以简单地使用 pivot_table 函数:
在 Pandas 中创建数据透视表。资料来源:Nik Piepenbreier
让我们稍微分解一下:
- 我们创建一个名为 pivot 的新变量。
- 我们使用熊猫数据透视表函数。我们的第一个论点是数据帧 df。
- 索引参数是’ region ‘,它告诉 Pandas 基于’ Region '列创建行。
- 我们将参数值分配给字段“Sales”,让 Pandas 知道我们想要计算销售列。
- 最后,我们使用 agg func(’ aggregation func ')参数告诉 Pandas 对值求和。默认值为“平均值”。
要深入了解熊猫数据透视表的功能,请查看我在熊猫的数据透视表上的另一篇文章。
将数据透视表值显示为百分比
您可能希望将值显示为列总数的百分比。同样,Excel 使这变得非常容易:
在 Excel 中计算数据透视表中的百分比。资料来源:Nik Piepenbreier
- 只需右键单击一个值,
- 选择将值显示为→占列总数的%
在熊猫身上也一样容易做到这一点。最简单的方法是为此创建一个新列:
计算熊猫的数据透视表百分比。资料来源:Nik Piepenbreier
让我们来看看发生了什么:
- 我们通过使用 pivot[‘% of column total’],声明了一个新列——这将为该列指定名称’ % of column total ’
- 然后,我们将行中的每个值(pivot[‘sales’])除以整个列的总和(pivot[‘sales’]sum())并乘以 100
创建图表
在 Excel 中创建图表。资料来源:Nik Piepenbreier
现在,如果你想创建一些图表,这在 Excel 和 Python 中都非常容易。
我们先来看 Excel。如果要将此数据透视表绘制成柱形图:
- 将指针放在表格中的一个单元格上,
- 转到插入→二维柱形图
对熊猫来说,这甚至更容易。Pandas 内置了 Python 顶级的数据可视化库功能之一。就像加法一样简单。plot(kind = 'bar ')到代码的结尾:
在 Pandas 和 Matplotlib 中创建图表。资料来源:Nik Piepenbreier
这可能看起来有点令人生畏。让我们来分解一下:
- 从 matplotlib 导入 pyplot 作为 plt
- 重写您之前的代码(第 2-3 行)
- 现在画出“销售”列,并指定一个 kind =“bar”作为参数
- 最后,使用 savefig 方法保存文件。
注意:如果你使用的是 Jupyter 笔记本,你可以在导入你的库后,通过编写以下代码来显示图表:
%matplotlib inline
额外提示:正确格式化值
在处理数据时,正确设置值的格式可能会有所帮助。
在 Excel 中设置数据格式。资料来源:Nik Piepenbreier
例如,将货币格式化为美元(等等。)或百分比。
要在 Excel 中做到这一点,您需要:
- 选择要格式化的值,
- 在“主页”选项卡的“号码”部分中,选择所需的类型
熊猫将这一点隐藏了一点,这可能会让新来者颇感困惑。
实现这一点的一个简单方法是使用 apply()函数。这个函数的作用是获取一个序列,并对其应用另一个函数。应用的函数将是格式化值的函数。
如果您想设置透视数据框架中销售列的格式,您可以编写:
在 Pandas 中格式化值。资料来源:Nik Piepenbreier
这可能看起来有点不全面(确实如此),但是在如何设计数据样式方面,它确实给了您很大的灵活性。让我们仔细看看:
- 我们定义了一个名为 format()的函数,它接受一个参数(x)
- 该函数仅用于返回使用特定格式的字符串格式的格式化值。
- ${:,. 2f}部分表示实际的格式。冒号(:)用于表示格式的开始,逗号(,)用于表示千位逗号分隔符,而. 2 表示两位小数。
- 这种符号可能有点难以适应,我倾向于谷歌搜索我想要的样式,然后复制粘贴。
同样,如果你想保持百分比,你可以写:
熊猫中的格式化百分比。资料来源:Nik Piepenbreier
在这段代码中,我们创建了另一个名为 format_percent()的函数,并执行了与上面类似的步骤。
注意:列总计的“% 1”列已被修改为不将该值乘以 100。这是因为格式化程序会自动完成这项工作。
在那里你可以学到更多
非常感谢您阅读这篇文章!希望你觉得有用!
我已经写了一些文章,解释了如何用 Python 处理普通和高级的 Excel 任务,如果你想看看的话!
如果你准备好投入 Python 和 Pandas,我还写了一本电子书,提供了对 Python、Pandas 和 Matplotlib 的完整介绍,可以让你很快上手!
你可以通过点击这个链接找到它。
祝您愉快!