新冠肺炎对策的新数据集
我们正在发布一个新冠肺炎对策的公共数据集,让数据科学家能够找出击败病毒的最有效的工具。
我们为什么需要这些数据?
疫情冠状病毒传播速度惊人,全球 190 个国家都有病例报告。在每天都很重要,而明确的答案又难以找到的情况下,各级决策者都在争先恐后地采取最佳行动。也许任何人现在最重要的问题是:我们应该做什么?
许多国家目前正在进行严格的封锁,希望这将减缓病例数量的惊人增长,并以某种方式重新控制局势。与此同时,我们有许多亚洲国家的例子,如新加坡和韩国,在武汉最初爆发的早期就有许多携带者到达,尽管他们远没有处于一个舒适的位置,但至少保持了一个低得多的病例数增长。虽然有许多关于为什么会这样的假设,但几乎没有确凿的证据。
为了帮助回答这些和其他问题,我们正在建立一个由世界各国政府应对新冠肺炎疫情的综合数据库。截至 3 月 24 日,我们的数据集目前包含 1300 个条目,由 15 名志愿者收集,记录了来自 96 个国家的措施。同一天,在全球 418 678 例确诊病例中,有记录的国家占 338 203 例。数据集中的中值国家记录了 8 项行动,记录最完整的国家是中国,记录了 118 项措施,到目前为止,我们只记录了他们截至 2 月 24 日的反应。
我们的核心重点是开发一个旨在减少新冠肺炎传播的措施的综合数据集。这些措施包括封锁、追踪接触者、暂停营业、旅行禁令和公共卫生。虽然数据集包含了一些经济刺激和治疗措施,但我们已经停止收集这些项目,专注于减少传播的核心问题。
对数据科学家的邀请
我们认为这个数据集可以回答许多有影响的问题。因此,我们公开发布它,希望世界各地的数据科学家将使用它来发现新的见解。
如果您对使用有任何疑问,可以在这里联系我们。请注意,截至 3 月 26 日,我们正在努力提高数据可用性,我们预计在 3 月 28 日前完成升级。
组织
创建该数据集的一个挑战是,世界各国政府做出了大量不同的回应。例如,虽然几乎每个国家都隔离新冠肺炎确诊病例,但可能出现的情况是,他们有症状的密切接触者也被要求隔离,或者不顾症状隔离密切接触者,或者他们的整个工作场所被关闭。被隔离的人可能只是被指示呆在家里,或被发出正式命令,可能会或不会得到津贴,可能会或可能不会受到警察的检查。一个国家可能会以如此多的方式对阳性检测做出反应,这对数据收集者来说是一个挑战——我们需要找出哪些信息最终可能是有用的,以及如何最好地组织这些信息。我们的解决方案是以关键字或标签的形式记录数据。这允许我们对数据施加一些结构——在我们发现已经实现了相同措施的地方重用标记——同时允许收集器添加他们认为最终可能重要的任何标记。
该数据集目前包含 200 个独特的标签。标签的最终数量可能在这个数字左右——我们正在努力组织标签集,以减少其数量,但我们也经常发现需要添加新标签的新型对策。
标签的数量给分析带来了挑战——显然不可能推断出每个标签的独特因果关系。虽然有可能使用算法方法来找到似乎具有特别大影响的标签,但是这种方法无法捕获大量的数据结构(例如,我们可以猜测公共交通清洁和公共设施清洁可能具有类似的影响)。虽然我们不知道我们最终将如何处理这个问题,但我们目前正在努力改进数据的结构(例如,将“超过 100 个被禁止的集会”替换为“禁止的集会”,强度为 100)。我们还在研究一个聚合标签的方案,以产生一个“准备好”用于数据分析的数据集。
数据源
我们从许多来源获取了数据,包括国家卫生部门和新闻网站,但维基百科的编辑们值得特别感谢,因为他们如此迅速地汇编了如此多的信息,介绍了世界上每个国家在疫情方面的经历。我们还要感谢我们的数据世界,我们从他们那里整合了一个测试数据的数据集。
据我们所知,还有许多其他的政府回应数据库:人道主义数据交换中心在记录世界各地政府回应方面做了令人难以置信的工作,牛津大学发布了令人印象深刻的全面的新冠肺炎政府回应跟踪系统。我们相信我们的每个数据集都有独立的优势,我们正在联系两个团队,讨论如何最好地集中我们的资源。
经验教训
令人惊讶的是,世界上有这么多的人渴望自愿抽出时间来帮助这项研究工作。每当我在任何地方提到这个项目,我都会得到大量的帮助,虽然我真诚地期望许多人可能会做出一点努力,然后被常规生活分散注意力,但我发现大多数来帮助的人都非常专注,不仅致力于填写数据集,而且理解最终目标,并提供如何改进的建议。我非常感谢迄今为止做出贡献的每一个人,我相信这是一个将帮助人们在未来几周和几个月做出拯救生命决定的数据集。
未来的步骤
提高数据可用性是我们当前的首要任务。我们也在努力使这个数据库达到“相对完整”的状态(在这一点上,我们预计将有大约 3000 个测量值),并保持我们的数据是最新的。
我们还希望整合不同类型的数据。例如,我们对获取社交距离测量和口罩使用影响的数据感兴趣——您可以为我们的努力做出的一个简单贡献就是今天就填写这份调查。
我们真诚地希望这个数据集以及世界各地数据科学家的技能能够帮助决策者找到度过这场快速发展的危机的最佳方式,在这场危机中,所有后果都是不确定的,每个决定都有可怕的利害关系,每天都很重要。
Python 3.10 中的新功能
看看 Python 最新版本中包含的最佳特性
Python 3.10 的第二个 alpha 版本于 11 月初发布,通过它,我们可以一窥 Python 的未来。
一些令人兴奋的举措正在实施,这些举措可能会将未来的 Python 生态系统改变为更明确、更可读的代码——同时保持我们都知道和喜爱的易用性。
由于新的年度发布时间表[ PEP 602 ],我们现在可以看到更短的开发窗口,这意味着我们可以在 2021 年 10 月预期的许多功能已经以某种形式出现,我们将涵盖迄今为止的所有新功能:
**Further Extensions to Type Annotations**
- Postponed Evaluation of Annotations
- Type Union Operator
- TypeAlias Annotation**Why Typing is Important****New Methods and Behaviors
** - Equal Length Flag for zip()
- Bit Count for Integers
- Mapping for Dictionary Views
如果您更喜欢视频,我们在这里涵盖了本文中的所有内容:
*所有文章图片均由作者制作,除非另有说明。
类型注释的进一步扩展
版本 3.9 引入了对 Python 中的类型提示和注释的大检修和清理。这看起来像是一个持续的趋势,在 3.10 中会进一步增加输入功能。
从 Python 3.0 到现在类型注释的变化时间表。
1.注释的延期评估
类型注释的计算总是在函数定义时执行,这意味着类型注释是以自顶向下的方式逐行计算的。
虽然这看起来合乎逻辑,但这样做有两个问题:
- 引用尚未定义的类型的类型提示(前向引用)不起作用,必须表示为字符串。我们将需要编写
"int"
而不是int
(尽管这只适用于自定义,而不是内置/预定义类型)。 - 它降低了模块导入的速度,因为那时会执行类型提示。
因此,相反,注释将存储在__annotations__
中,对它们的评估可以一起执行——允许前向引用并首先执行模块导入(减少初始化时间)。
2.类型联合运算符
3.10 引入了带有|操作符的条件逻辑。在注释数据类型时,我们可以将|用作 OR。例如,我们有一个预期为int
或float
的变量,我们把它写成int | float
,就像这样:
def f(x: **int | float**) -> float:
return x * 3.142f(1) # pass
f(1.5) # pass
f('str') # linter will show annotation error
在 3.10 之前,等效的操作将使用typing.Union
方法编写,就像Union[int, float]
一样。
3.TypeAlias 批注
回到前向引用问题,避免前向引用的一个常见解决方案是将它们写成字符串。
然而,将类型写成字符串会在将这些类型赋给变量时产生问题——因为 Python 会假设我们的字符串文字类型注释只是一个字符串。
在我们通常使用类型注释的地方使用该类型注释变量将会返回一个错误。例如:
MyType = "ClassName" # ClassName is our type annotation
def foo() -> MyType:
...
这里,我们试图使用MyType
作为类型的别名,但是,MyType
将被读取为字符串值——而不是类型别名。
只要在代码的后面定义了ClassName
,这就是有效的。目前,这将抛出注释错误。
为了解决这个问题,增加了一个方法来显式地将MyType
标识为类型别名:
**from typing_extensions import TypeAlias**MyType: **TypeAlias** = "ClassName"
def foo() -> MyType:
...**OR**MyType: **TypeAlias** = ClassName *# if we have defined ClassName already*
def foo() -> MyType:
...
为什么打字很重要
虽然这肯定不是一个巨大的、改变游戏规则的举动,但是看到 Python 开发者加倍努力增强类型化特性是非常酷的。
Python 的优势来自于它的易用性和没有陡峭的学习曲线。其中一个原因是我们的代码中不需要显式定义类型。
这可能看起来违反直觉,但是给开发人员选项来定义类型可以极大地增强代码库的可读性和可维护性。例如,从变形金刚库的源代码中提取这些内容:
即使没有上下文,我们也可以阅读这些代码,并立即掌握我们应该期望将哪些数据提供给这些函数、类和方法,以及我们应该期望返回哪些数据类型。
在复杂的代码库(甚至是简单的代码库)中,类型注释可以极大地提高可读性。同时,不是每个人都想(或需要)使用它们——所以一个可选的、无异常的功能达到了完美的平衡。
这些变化表明了对 Python 的类型注释特性的承诺。我们最喜欢的库(和我们自己的代码)更加清晰,这可能会对 Python 生态系统产生有趣的长期影响。
新的方法和行为
除了新的类型变化,我们还对其他核心 Python 功能进行了一些更新和新特性。
邮政编码的等长标志
第一个是 PEP 618,它为zip()
函数添加了一个可选的strict
标志。如果我们设置了strict=True
,如果zip
的两个输入长度不相等,就会出现错误。
如果没有 strict=True 标志(左),则不会产生错误,并且较长的列表会被截断以创建压缩生成器。当 strict=True 时,产生一个错误。
新的strict
参数允许我们控制zip
的行为,而不是盲目地截断不匹配的数据——这将使许多开发人员在未来某个时候不再头疼。
整数的位数
也被称为总体计数,这种新方法允许我们计算一个整数的二进制表示中一的数量。我们写的都是int.**bit_count()**
。
我们只是返回代表每个整数的二进制值中的正位数:
0 = 00000000
1 = 00000001
2 = 00000010
3 = 00000011
10 = 00001010
11 = 00001011
12 = 00001100
100 = 01100100
101 = 01100101
102 = 01100110
字典视图的映射
三个字典方法dict.keys()
、dict.values()
和dict.items()
都返回一个字典的不同视图。现在,每个视图对象都添加了一个mapping
属性。
这个新属性是一个包装原始字典的types.MappingProxyType
对象——如果我们在视图上调用它,我们将返回原始字典。
这就是目前的全部内容——虽然我们进入 3.10 的开发时间表才几个月,但是已经有很多有趣的变化了!
Python 的发展还在继续,看起来随着时间的推移,会有更多有趣的特性加入到这种语言中。
我希望你喜欢这篇文章。如果你想要更多,我已经开始在 YouTube 这里发布编程教程。或者如果你有任何问题、想法或建议——请通过推特或在下面的评论中告诉我。
感谢阅读!
如果您还在使用 Python 3.9,我在这里介绍了完整版本中的所有内容:
有什么新的,下一步是什么?
towardsdatascience.com](/python-3-9-9c2ce1332eb4)
🤖《变形金刚》课程 NLP 的 70%折扣
Python 3.9 中的新功能
看看 Python 最新版本中包含的最佳特性
Pablo Guerrero 在 Unsplash 上拍摄的照片
又到那个时候了,Python 的新版本迫在眉睫。现在是测试版(3.9.0b3),我们很快就会看到 Python 3.9 的完整版本。
一些最新的特性令人难以置信地兴奋,在发布后看到它们被使用将是令人惊奇的。我们将讨论以下内容:
- 字典联合运算符
- 类型提示
- 两种新的弦乐方法
- 新的 Python 解析器——这非常酷
让我们先来看看这些新特性以及如何使用它们。
( 意大利文 )
字典联盟
我最喜欢的新特性之一,语法简洁。如果我们有两个字典a
和b
需要合并,我们现在使用联合操作符。
我们有合并操作员|
:
a = {1: **'a'**, 2: **'b'**, 3: **'c'**}
b = {4: **'d'**, 5: **'e'**}c = **a | b**
print(c)
**[Out]:** {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}
和更新操作符|=
,它更新原始字典:
a = {1: 'a', 2: 'b', 3: 'c'}
b = {4: 'd', 5: 'e'}**a |= b**
print(a)
**[Out]:** {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}
如果我们的字典共享一个公共键,将使用第二个字典中的键-值对:
a = {1: 'a', 2: 'b', 3: 'c', **6: 'in both'**}
b = {4: 'd', 5: 'e', **6: 'but different'**}print(a | b)
**[Out]:** {1: 'a', 2: 'b', 3: 'c', **6: 'but different'**, 4: 'd', 5: 'e'}
用 Iterables 更新字典
|=
操作符的另一个很酷的行为是能够使用一个可迭代对象用新的键值对更新字典——比如一个列表或生成器:
a = {'a': 'one', 'b': 'two'}
**b = ((i, i**2) for i in range(3))**a |= **b**
print(a)
**[Out]:** {'a': 'one', 'b': 'two', **0: 0, 1: 1, 2: 4**}
如果我们用标准的 union 操作符|
进行同样的尝试,我们将得到一个TypeError
,因为它只允许dict
类型之间的联合。
类型提示
Python 是动态类型的,这意味着我们不需要在代码中指定数据类型。
这没什么,但有时会令人困惑,突然之间 Python 的灵活性变得比其他任何东西都更令人讨厌。
从 3.5 开始,我们可以指定类型,但这相当麻烦。这次更新确实改变了这一点,让我们举个例子:
无类型提示(左)使用 3.9 的 v 类型提示(右)
在我们的add_int
函数中,我们显然想给自己加上相同的数字(出于某种神秘的未定义的原因)。但是我们的编辑器不知道这一点,使用+
将两个字符串加在一起是完全可以的——所以不会给出警告。
我们现在可以做的是将预期的输入类型指定为int
。利用这一点,我们的编辑立即发现了问题。
我们还可以非常具体地了解所包含的类型,例如:
类型提示可以在任何地方使用——多亏了新的语法,它现在看起来更简洁了:
我们将 sum_dict 的参数指定为 dict,返回值指定为 int。在测试定义期间,我们也确定它的类型。
字符串方法
不像其他新功能那样吸引人,但仍然值得一提,因为它特别有用。添加了两个用于删除前缀和后缀的新字符串方法:
"Hello world".remove**prefix**("He")
**[Out]:** "llo world"
Hello world".remove**suffix**("ld")
**[Out]:** "Hello wor"
新解析器
这是一个看不到的变化,但有可能成为 Python 未来发展中最重要的变化之一。
Python 目前主要使用基于 LL(1)的语法,该语法又可以被 LL(1)解析器解析,该解析器从上到下、从左到右解析代码,并且只对一个标记进行前瞻。
现在,我几乎不知道这是如何工作的——但我可以给你一些当前 Python 中由于使用这种方法而出现的问题:
- Python 包含非 LL(1)语法;正因为如此,当前语法的某些部分使用了变通方法,造成了不必要的复杂性。
- LL(1)在 Python 语法中造成了限制(没有可能的变通办法)。这个问题强调了下面的代码根本无法使用当前的解析器实现(引发一个 SyntaxError ):
with (open("a_really_long_foo") as foo,
open("a_really_long_bar") as bar):
pass
- LL(1)在解析器中用左递归中断。这意味着特定的递归语法会导致解析树中的无限循环。Python 的创造者吉多·范·罗苏姆在这里对此进行了解释。
所有这些因素(以及更多我无法理解的因素)都对 Python 产生了重大影响;它们限制了语言的发展。
基于 **PEG,**的新解析器将让 Python 开发者拥有更大的灵活性——从 Python 3.10 开始我们将开始注意到这一点。
这是我们对即将到来的 Python 3.9 所能期待的一切。如果你真的等不及了,最新的测试版 3.9.0b3 — 在这里可以找到。
如果您有任何问题或建议,请随时通过 Twitter 或在下面的评论中联系我们。
感谢阅读!
如果您喜欢这篇文章,并且想了解 Python 中一些鲜为人知的特性,您可能会对我以前的文章感兴趣:
一些鲜为人知和被低估的 Python 特性的示例
towardsdatascience.com](/lesser-known-python-features-f87af511887)
scikit 中的新功能-了解
照片由 Jungwoo Hong 在 Unsplash 上拍摄
0.23 版最新发展概述
如果你对数据科学感兴趣并使用 python,那么 scikit-learn 可能是你联系人列表中的快速拨号。您可能需要更新此联系人。
两个月前,scikit-learn 发布了0.23 版本 ,引入了许多令人兴奋的特性和改进。该版本将至少兼容 Python 3.6 。这篇文章将引导你了解一些有趣的新增内容。稍后,我还会先睹为快地介绍目前正在开发的下一个版本 0.24 中即将推出的一些特性。
主要特点
1)新的回归模型
Scikit-learn 引入了以下三个新的回归变量:
a)泊松回归变量
b)伽马回归变量
c)特威迪回归变量
from sklearn.linear_model import PoissonRegressor
from sklearn.linear_model import GammaRegressor
from sklearn.linear_model import TweedieRegressor
这三种模型都被归类为广义线性模型(GLMs ),支持非正态损失函数。它们在建模误差遵循非正态分布的分布**、的情况下很有用,例如泊松或伽马分布、或总是正的**,正如**Kida所很好地解释的那样。**
选择哪种分布在很大程度上取决于用例,例如目标变量的正性质,分布的尾部如何,等等。潜在应用的几个例子是风险建模、气候事件预测和保险定价。
2)稳定和快速的 k 均值估计器
众所周知的算法将样本分成预定义数量的具有相等方差的聚类,该算法现在应该被优化,并且对于大样本具有比 0.23 之前版本更好的可扩展性。
3)改进的基于直方图的梯度提升估计器
改进是双重的:首先,回归器和分类器,即HistGradientBoostingClassifier
和HistGradientBoostingRegressor
,都支持模型训练期间的样本权重,如这里的所示。
其次,如果已知先验,现在可以指定 单调约束 的性质,即特性可以对响应/目标变量具有的约束。例如,在预测房价时,较大的卧室面积可能会对价格产生积极影响(约束值= 1),而距离市中心的距离可能会对价格产生消极影响(约束值= -1)。值为 0 将表示不受约束的要素。
4)改进的套索和弹性网
两个著名的线性回归器现在支持模型训练期间的样本权重**。在功能上,这导致了一个新的参数sample_weight
,它在fit()
函数中接受一个数组或一个列表,代表数据集中每个样本的权重。**
5)管道和估算器的交互式 HTML 可视化
如果你正在 Jupyter 笔记本上建模,你现在可以交互地可视化你的模型管道和估算器的概要工作流程。这需要调用display='diagram'
选项。此功能的交互性质允许您悬停在某个估计器上,并扩展它以获得更多细节。看看这个很酷的官方演示。****
其他有趣的功能
1)将内置数据集作为数据帧加载
Scikit-learn 提供了几个内置数据集,例如load_iris
、load_digits
、load_breast_cancer
、load_diabetes
和load_wine
、load_linnerud
、fetch_california_housing.
现在您可以使用关键字as_frame=True
将这七个数据集加载为 pandas DataFrames 。
早些时候,这些嵌入的数据集被加载为asklearn.utils.Bunch
类型。
from sklearn.datasets import load_iris
df = load_iris(as_frame=True)# 0.25 onwards, type(df) should return pandas.core.frame.DataFrame
2)在一次热编码期间丢弃所选类别
标准例程preprocessing.OneHotEncoder
对分类特征进行一次热编码,现在允许丢弃每个二元特征的第一个类别(只有两个类别)。这是用标签drop='if_binary'
实现的。具有 1 个或 2 个以上类别的功能将不受此标志的影响。最新版本还有一个更高效的OneHotEncoder
实现。
3)高斯斑点的中心
在生成各向同性高斯簇(斑点)时,你现在可以通过return_centers=True
参数访问每个簇的中心。
from sklearn.datasets import make_blobsX, y, centers = make_blobs(n_samples=20, centers=3, n_features=2,
random_state=0, return_centers=True)
即将到来的 v-0.24 中即将到来的变化
很快,目前正在开发的下一个版本 0.24 就要发布了。以下是一些你可以期待的有趣特性。
1)估算值的逆变换
来自sklearn.impute
的SimpleImputer
允许对数据集中的缺失数据进行插补。很快,就可以将估算的数据转换回原来的状态。首先,需要在调用SimpleImputer()
时设置一个标志add_indicator=True
,然后在这个很酷的功能上使用函数inverse_transform.
阅读更多信息。
2)平均绝对百分比误差(MAPE)
这将是回归问题的可用的新评估指标。这种度量对目标变量的全局缩放不敏感。在数据数量级差异较大的情况下,通过计算误差相对于真实值的相对百分比,它可以作为误差的公平衡量标准,例如,如下面的代码片段所示。下面例子中的mean_absolute_error
将是 100001.8。
平均绝对百分比误差。ϵ是一个任意小的正数,例如 1e-6。变量 y 和 y_hat 代表真实值和预测值。
# Implementation in upcoming version 0.24from sklearn.metrics import mean_absolute_percentage_errorimport numpy as npy_true = np.array([1, 10, 1e6])
y_pred = np.array([0.9, 15, 1.2e6])mape = mean_absolute_percentage_error(y_true, y_pred)
>>> 0.2666....#============ My implementation below ============eps = 1e-6dev = [np.abs(x-y)/max([eps, np.abs(x)]) for x, y in zip(y_true,
y_pred)]mape = sum(dev)/len(dev)
>>> 0.2666....
3)**confusion matrix plot**
中的可选颜色条
在绘制混淆矩阵时,颜色条现在是可选的。如果不需要的话,这就不需要一个替代解决方案来隐藏色条。
plot_confusion_matrix(estimator, X, y, colorbar=False)
这让我想到了这篇文章的结尾。在你更新了你的 scikit-learn 并想用 python 可视化数据之后,你可以关注我最近的文章Matplotlib 3 的新特性** 这里。**
机器学习快乐!
新一代计算机视觉:AWS DeepLens
如何使用 AWS DeepLens 部署对象检测模型
( 来源 )
AWS DeepLens 可以被描述为一种可配置的摄像机,使用户能够在更短的时间内找到练习实时流媒体处理技术的机会。
AWS DeepLens 可能部署三种不同类型的建模。在这篇文章中,我们将研究预先训练好的物体检测模型。
AWS DeepLens 是一个可编程的摄像机,使开发人员能够开始实践深度学习…
www.commencis.com](https://www.commencis.com/thoughts/new-generation-computer-vision-aws-deeplens/)
- 预训练模型
该项目使用户能够将初始训练的模型部署到他们的设备上。可以通过以下路径选择 项目>创建项目
预训练模型导入项目页面(图片由作者提供)
2。亚马逊 SageMaker 训练模型
使用此模型类型,您可以在 AWS SageMaker 中创建和训练您的模型,并提供以下信息,然后单击导入按钮:“作业 ID”、“模型名称”、“模型框架”。
亚马逊 SageMaker 训练模型选择页面(图片由作者提供)
为了能够使用这种模型类型将您的模型部署到您的设备中,AWS Sagemaker是打开一个 SageMaker 笔记本实例 作为代码编辑器所必需的服务。
如果您是 AWS 服务的新手,以前从未使用过 AWS SageMaker,AWS 会为您提供一个 AWS 自由层 。通过使用这个帐户,您可以在头两个月开始使用 AWS SageMaker。
3。外部培训模型
通过选择这种类型的模型,预计您已经在 AWS 环境之外训练了您的模型,并将您的模型上传到 AWS S3 存储桶中。为了能够将您的模型上传到 DeepLens,您需要填写以下字段,然后单击导入按钮:“模型工件路径”、“模型名称”、“模型框架”。
外部培训模型选择页面(图片由作者提供)
AWS 深度镜头
在开始使用任何服务之前,必须在链接中设置必要的权限,以便能够正确使用它们。将使用的第一个服务是 AWS DeepLens。为了能够使用此服务,您的地区将从以下地区中选择:
欧洲(法兰克福)欧盟-中部-1
美国东部(北弗吉尼亚州)美国东部-1
亚太地区(东京)AP-东北-1
在设置开发环境策略和区域之后,通过使用 AWS 管理控制台,在“Find Services”标题下,您将能够通过使用 search 按钮键入服务的名称来快速找到任何服务,如下所示。
AWS 管理控制台(图片由作者提供)
此页面包括关于服务的基本信息。更多详细的技术细节,可以访问“更多资源选项卡下的*文档*。**
AWS Deeplens 介绍页(图片由作者提供)
设备注册
产品拆箱后,第一步是将您的设备正确注册到 AWS DeepLens 服务中。
注册设备介绍屏幕(图片由作者提供)
将设备连接到 PC 后,点击 【注册设备】 按钮,然后选择您的硬件版本,点击如下图所示的 开始 按钮。
设备硬件版本选择(图片由作者提供)
首先,应使用适配器将设备连接到电源,并打开电源按钮。当设备打开时,电源 led 将变为蓝色。
将 USB 电缆插入设备的“ 注册 ”端口,即可将 PC 与设备连接。
DeepLens 注册 USB 口(图片由作者提供)
当您能够成功注册 AWS DeepLens 时,您将能够通过“ 已注册 ”状态在页面左侧的资源>设备选项卡下看到您的设备。
设备选项卡(图片由作者提供)
部署预先训练的模型
在“ 项目 ”部分下,需要点击位于右上方的“ 新建项目 按钮才能够看到项目类型。
创建新项目(图片由作者提供)
在这一步中,需要选择一个预先填充的项目模板。选择“ 使用项目模板 ”作为项目类型,并从列表中选择“ 对象检测 ”,向下滚动到屏幕,单击“ 创建 ”。
选择项目模板(图片由作者提供)
在 指定项目详细信息 页面中,接受项目名称和描述提要中的默认值。
指定项目细节部分(图片由作者提供)
在同一页面的底部,您将看到项目内容选择设置。对于 型号 和 功能, 接受默认值并点击 【创建】 继续。
项目内容部分(图片由作者提供)
在此步骤中,您将把对象检测项目部署到您的设备上。您当前创建的项目将成功列在“ 项目 ”部分。查看完相应的项目后,点击单选按钮,并在右上方选择**【部署到设备】*** 。***
项目页面(图片由作者提供)
在 【目标设备】 页面上,您需要选择您的设备并点击 【查看】 按钮。
目标设备页面(图片由作者提供)
**将有一个额外的页面,其中有您的部署细节,包括关于 ***【类型】【λ】*和 【型号】的信息。 仔细检查后,选择 【部署】 按钮继续。
审查和部署模型(图片由作者提供)
当点击“部署”时,您的模型将通过向 AWS DeepLens 显示其下载百分比上传到您的设备。
正在向设备部署(图片由作者提供)
部署后,在“ 设备 ”选项卡上,在您的项目部署后,单击 【查看输出】 选择您的浏览器进行相应的流认证导入。
流媒体认证的浏览器选择(图片由作者提供)
模型输出
有两种不同的方式来查看我们的模型输出。下面列出了这些,并在单独的主题中进行了解释。
- JSON 格式的 MQTT 主题值输出
- 项目流
- AWS 物联网核心— MQTT 话题值
成功导入证书后,浏览器会通过弹出屏幕要求您选择合适的证书版本。
当您想要 JSON 格式的输出时,您可以 【复制】 唯一生成的主题,并点击*【AWS 物联网控制台】*** 打开 AWS 物联网核心 服务。**
JSON 格式的输出(图片由作者提供)
复制后的主题格式如下*" $ AWS/things/deep lens _***<uuid>***
/infer "*,粘贴到 【订阅主题】 下,点击 【发布到主题】 按钮。
AWS 物联网核心— MQTT 客户端(图片由作者提供)
点击 发布到主题 后,JSON 格式的输出开始发布。如果您想停止发布,可以选择右上方的 【暂停】 。
AWS 物联网核心—主题发布后(图片由作者提供)
2。项目流
在为我们的浏览器导入证书后,我们可以单击“ 【视频流】 部分下的“ 【查看视频流】 来打开一个新的选项卡,其 IP 地址为“ 192.168.1.47:4000”。
视频流部分(图片由作者提供)
当在指定的 IP 地址上启用流时,我们可以看到两个不同的选项卡。第一个选项卡称为“ ”项目流“ ,这是应用了我们的对象检测模型的流。在这个流中,我们看到对象周围的蓝色框架,在框架的顶部,检测到对象的名称及其可能性百分比。因为模型是在有限数量的对象中训练的,所以不能识别帧中的所有对象。如果我们想要检测比预训练的对象检测模型更多的对象,我们需要通过导入外部自定义模型 来导入我们的自定义模型。
项目流输出(图片由作者提供)
第二个流叫做 “直播流”。 当我们选择此选项卡时,我们可以查看普通摄像机流,它显示帧的速度比“项目流”快,因为它没有在对象上应用任何模型。
直播流输出(图片由作者提供)
非常感谢您的提问和评论!
参考文献:
面向新常态的新黑客马拉松
如果没有别的,我们已经通过疫情了解了我们的互联网的力量以及还有多少工具有待开发。作为开发人员,我们正处于一个激动人心的位置,为我们的新常态设定标准,并为下一个前沿领域铺平道路。本周末,我们将举办我们的第一次先锋黑客马拉松,试图为那些与世隔绝的人提供社区,并提供一点奖励激励的、富有成效的乐趣来对抗全球幽居热。
帮助将真实世界上传到互联网。让数十亿呆在家里的人在网上工作变得更有趣。在 Zoom 通话中叠加心率。提高视频会议质量。建立一个串联的竞争对手,一个朋友而不是同事。舞台是你的。
我们将于本周六上午 11 点开始。在 24 小时内,您将有机会体验我们定期在网上举办的许多活动:专家 ama、反馈会议和餐饮。我们也在尝试一些新的形式:有奖迷你黑客、剪刀石头布锦标赛、《我的世界》@午夜和实时项目投票。
由专家、你的黑客伙伴和我们选出的最佳项目,将有机会在评委面前展示他们的作品,并向全世界直播。评委包括 Zeit 首席执行官 Guillermo Rauch ,Repl.it 首席执行官 Amjad Masad ,前可汗学院研发负责人和 iOS 构建者 Andy Matuschak 和 Tandem 首席执行官 Rajiv Ayyangar 等。
前三名项目有一个$5k 现金奖金池和超过$150,000 的开发者积分。每个参与的人都可以免费获得三个月的 Repl.it。最重要的是,你将有机会见到来自世界各地的黑客——目前有 50 多个国家的代表。
物理会议中心有明显的能量,当独自在家时,滚动浏览项目提要时,这种能量很容易丢失。我们的目标是把这种能量带到网络上,在一个 24 小时在线黑客宫殿里。
在这里报名:https://pioneer.app/hackathon。
杰克逊&先锋队
Java 15 的新特性
本地记录和密封类在 Java 15 中找到了自己的路
Photo by 五玄土 ORIENTO on Unsplash
保持六个月周期的传统,在 2020 年 3 月 17 日发布了 Java 14 之后,我们现在有了 Java 15,下一个非 LTS 版本将于 2020 年 9 月 15 日推出。
下面快速浏览一下 Java 15 的一些特性:
- 密封类(预览)— JEP 360
instanceof
(第二次预览)— JEP 375 的模式匹配- 记录(第二次预览)— JEP 359
- 文本块(标准)— JEP 378
- 隐藏类— JEP 371
- 移除 Nashorn JavaScript 引擎— JEP 372
- 重新实现传统 DatagramSocket API — JEP 373
- 禁用和反对偏向锁定— JEP 374
- 谢南多厄:一个低停顿时间的垃圾收集器——JEP 379
- 删除 Solaris 和 SPARC 端口— JEP 381
- 外部存储器访问 API(第二个孵化器)— JEP 383
- 不赞成激活 RMI 进行删除— JEP 385
Mac OS 上的 Java 15 安装设置
- 要开始使用 Java 15,请从这里的下载 JDK。
- 复制并提取
/Library/Java/JavaVirtualMachines
中的 tar 文件,如下图所示:
$ cd /Library/Java/JavaVirtualMachines
$ sudo cp ~/Downloads/openjdk-15_osx-x64_bin.tar.gz /Library/Java/JavaVirtualMachines$ sudo tar xzf openjdk-15_osx-x64_bin.tar.gz
$ sudo rm openjdk-15_osx-x64_bin.tar.gz
一旦完成,使用任何文本编辑器打开bash_profile
。我用的是vim ~/.bash_profile
。将 Java15 的路径设置为 JAVA_HOME,保存更改并执行source ~/.bash_profile
以反映更改。
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-15.jdk/Contents/Home
最后,您已经准备好使用 Java 15 编译和运行程序了。我们将使用 JShell,一个交互式 REPL 命令行工具,用于快速测试 Java 15 的新特性。
值得注意的是,Java 15 中发布的许多特性都在预览版中。这意味着尽管他们现在正在全力工作,但将来可能会有所改变。有些可能会成为标准,或者在下一个发布周期中被删除。为了测试预览功能,您需要在运行 JShell 或 Java 程序时显式设置--enable-preview
,如下所示:
jshell --enable-preview javac --release 15 --enable-preview Author.java
在接下来的几节中,让我们讨论 Java 15 中的重大语言变化。
1.密封类(预览)
Kotlin 中的密封类已经存在一段时间了,Java 15 最终引入了这个特性,以便更好地控制继承。
顾名思义,密封类允许您将类层次结构限制或允许给某些类型。
这对于模式匹配非常有用,因为您有特定数量的类要在它们之间进行switch
。
以下语法在 Java 15 中定义了一个密封类:
public sealed class Vehicle permits Car, Bike, Truck { ... }
所以,上面的代码意味着,只有在关键字permits
之后定义的类才被允许扩展Vehicle
sealed
类。
如果您已经在与Vehicle
相同的文件中定义了类Car
、Bike
和Truck
,您可以省略关键字 permissions,编译器将隐式处理它,如下所示:
sealed class Vehicle {...}final class Car extends Vehicle {...}
final class Bike extends Vehicle {...}
final class Truck extends Vehicle {...}
正如你在上面看到的,我们已经定义了每个类的最终修饰符。现在,你需要记住密封类的一个重要规则:每个允许的类都必须设置一个显式修饰符。可以是final
也可以是sealed
或者non-sealed
。
以下是每个修改器如何影响继承:
- 声明为
final
的允许子类不能进一步扩展。 - 声明为
sealed
的允许子类可以进一步扩展,但是只能由该子类允许的类来扩展。 - 一个被允许的子类可以被声明
non-sealed
可以被任何类进一步扩展。超类不能进一步限制这个类层次结构中的子类。
在 Java 15 之前,开发者只能使用final
关键字或范围修饰符来控制继承。因此,在定义类层次结构时,密封类为 Java 开发人员带来了额外的灵活性。
Java 的反射 API 还获得了两种处理密封类的新方法:
java.lang.constant.ClassDesc[] getPermittedSubclasses();boolean isSealed()
2.记录(第二次预览)
记录是作为 Java 14 中的预览特性引入的,目的是在编写基于 POJO 的数据载体类时减少样板代码。这在 Kotlin 中以数据类的形式存在了很长时间。
现在,有了 Java 15,记录得到了第二次预览。虽然没有任何重大变化(只是一些小的增加),但仍然有一些您应该知道的主要说明和限制:
- 在 Java 15 之前,人们可以在记录中声明原生方法(尽管这不是一个好主意)。现在,JEP 明确禁止在记录中声明本机方法。可以理解的是,定义一个
native
方法通过引入外部状态依赖偷走了 USP 记录。 - 对应于记录类的记录组件的隐式声明字段是
final
,现在不应该通过反射修改,因为它将抛出IllegalAccessException
。
记录意味着数据载体类,您应该完全避免在其中定义本机方法。
密封类型的记录
我们知道记录是最终的,不能延长。令人高兴的是,记录可以实现接口。
因此,您可以定义一个密封的接口,并通过以下方式在您的记录中实现它们:
sealed interface Car permits BMW, Audi { ... }
record BMW(int price) implements Car { ... }
record Audi(int price, String model) implements Car { ... }
地方志
也可以在方法中定义记录来存储中间值。与本地类不同,本地记录是隐式静态的。这意味着它们不能访问变量和封闭方法的实例成员,这实际上很好,因为它防止了记录捕获值。
本地记录对于以前必须创建助手记录的 Java 开发人员来说是一大福音。
使用以下方法,了解本地记录的引入如何帮助在流 API 中执行值的计算:
List<Merchant> findTopMerchants(List<Merchant> merchants, int month){
// Local record
record MerchantSales(Merchant merchant, double sales) {}return merchants.stream().map(merchant -> new MerchantSales(merchant, computeSales(merchant, month)))
.sorted((m1, m2) -> Double.compare(m2.sales(), m1.sales()))
.map(MerchantSales::merchant)
.collect(toList());}
结论
虽然上面两个是 Java 15 中的两个主要语言特性,但我们在第二个预览版中也有模式匹配以获得用户反馈,文本块现在是一个标准特性,最重要的是一个新的隐藏类特性。
隐藏类是与框架开发者相关的 JVM 特性。它允许通过使用Lookup::defineHiddenClass
定义类实现来使它们不可被发现。这样做的话,既不能使用Class.forName
找到这样的类,也不能在字节码中引用它们。
这些是 Java 15 中引入的主要变化。
新泽西正在成为新冠肺炎感染的新伦巴第
美国的新泽西州和意大利的伦巴第地区在美国报告数据的前 18 天的人口密度、总人口和活跃新冠肺炎病例方面非常相似。新泽西州大约有 890 万人口,密度约为每平方英里 1213 人。伦巴第大约有 1000 万人口,每平方英里 1100 人。意大利总人口密度为每平方英里 533 人,总人口约 6040 万。这对新冠肺炎的传播意义重大,因为人们普遍认为在人口更密集的中心发生的人与人之间更密切、更频繁的互动会导致病毒更快速的社区传播。还推测新泽西和意大利在实施广泛测试之前已经建立了社区传播。从第 1 天到第 18 天,当新泽西州的活跃案件的增长与意大利的增长重叠时,新泽西州的可能轨迹出现了一幅格外严峻的画面。
新泽西和意大利每天的活动和新病例增加了一倍,并实施了抑制措施。数据来源:【https://github.com/CSSEGISandData/COVID-19
上图以暗黄色条显示了意大利的活跃病例(在意大利疫情爆发的早期主要集中在伦巴第),橙色条显示了该国每天的新增病例。新泽西州的活动案例用绿色条显示,每天的新案例用蓝色条显示。所有案例数据都对应于左边的 y 轴。来自这两个地区的数据从每个地点的明显“开始”起相互重叠,并以天而不是离散的日期向前发展,因为检测到的开始发生在每个地点的不同时间。意大利数据的第一天是 2 月 21 日,新泽西数据的第一天是 3/10。以天为单位的翻倍率(或病例以当前增长率翻倍所需的时间)每天计算一次,意大利用灰色绘制,新泽西用绿色绘制,对应于代表天数的右侧 y 轴数字。垂直黄线表示伦巴第和整个意大利实施缓和措施的日期。绿色竖线表示新泽西州关闭所有非必要业务的日期,并命令居民待在家中。值得注意的是,相比意大利,新泽西将更多的商业开放视为“必需”,而且自 3 月 20 日起,意大利居民受到了更严格的限制。
在疾病发展的最初几天,新泽西州的倍增时间一直低于意大利——这意味着新泽西州的病例倍增时间更短。从 3 月 26 日的一份报告中可以清楚地看到,伦巴第仍然受到严重影响,病例在一天之内跃升了 2500 例,该地区仍然严重影响着意大利的总体数字——所以这种比较可能仍然成立。
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
新报:塑造行为的激励
人工智能校准和安全
因果模型如何描述代理人的动机。
机器学习算法通常非常有效,但很难确定它们的安全性和公平性。通常,机器学习系统的属性是通过测试来建立的。然而,即使系统在测试环境中表现安全,在部署时也可能表现得不安全或不公平。或者,可以通过分析输入扰动、个体决策或网络激活来研究模型的属性,但这通常很困难、耗时,并且对专业知识要求很高。
我们的替代方法不是检查或测试单个模型,而是观察给定的培训环境是否会刺激不安全或不公平的决策。
这种方法并不是全新的——激励是一个直观且切题的讨论对象。例如,参见下面 Stuart Russell 对竞争推荐系统的激励的讨论。(其他例子包括哈德菲尔德-门内尔等人的注释 1和史蒂夫·奥莫亨德罗的基本人工智能驱动。)
图片来自 Pixabay
放入[社交媒体推荐]机器的目的是什么?给人们提供他们想点击的东西,因为这是我们赚钱的方式。你如何最大化点击率——你只是给人们发送他们喜欢点击的东西,对吗?就这么简单。事实上,这不是算法在做的事情…这不是强化学习的工作方式。强化学习通过改变世界的状态来最大化回报。在这种情况下,世界的状态是你的大脑……[所以]它以一种更可预测的方式改变你,这样它就可以给你发送它知道你会点击的东西。”—斯图尔特·罗素
改变用户行为的压力可以被视为一种不受欢迎的激励。像这样的基于激励的论点是强有力的,因为它们独立于系统架构而应用。然而大多数 以前的 关于激励的工作都集中在具体的问题上,这使得它很难应用到新的问题和情况中。在我们最近的工作中,我们已经开始开发一个通用的激励的因果理论,它允许我们在一个统一的框架中陈述和制定多种公平和安全问题的解决方案。
在我们的理论中,一个激励,粗略地说,是一个代理人为了最好地实现其目标而必须做的事情。我们考虑两种类型的激励:当代理必须控制其环境的某个组件以最大化其效用时,存在控制激励(例如上面的社交媒体推荐示例中的“用户意见”)。当智能体的决定必须对其环境的某个组成部分做出因果反应时,就会出现反应激励,例如,移动机器人在崎岖地形上导航时应该注意障碍物的位置。
控制激励
示例
为了使激励分析形式化,我们可以使用因果影响图。因果影响图通过将决策问题分解成图形来表示,其中每个变量都依赖于其父变量的值(如果有箭头 X- > Y,则 X 是 Y 的父变量)。它由三种类型的节点组成:
例如,斯图尔特·罗素的社交媒体操纵例子可以用下面的影响图来表示。
控制对用户意见的激励
在这个模型中,推荐算法选择一系列帖子显示给用户,以最大化用户点击的帖子数量。如果我们把用户对每个帖子的回复看作是一个独立的事件,那么用户欣赏的内容就会收到更多的点击。然而,这些职位也有间接影响。如果用户浏览了许多两极分化的文章,那么他们可能会采纳其中的一些观点,并且在点击内容方面变得更加可预测。这可以允许该算法在该系列中后面的帖子上实现更高的点击率,并且意味着对受影响的用户意见有控制激励。
为了减轻 Stuart Russell 的担忧(同时保留系统的功能),我们希望去除对用户意见的控制激励,同时保留对点击的激励。我们可以重新设计这个系统,这样就不会因为真实点击率而获得奖励,而是因为基于原始用户意见模型的帖子的预测点击而获得奖励。以这种方式训练的代理人会认为用户意见的任何修改都与改进其性能无关。
为了在实践中工作,点击预测本身必须不包括用户意见修改的影响。我们可以通过使用假设帖子之间独立的预测模型来实现这一点,或者通过只向每个用户显示一个帖子来学习。这说明了在考虑激励时的一个重要考虑:只有当没有一个变量(如预测的点击)作为另一个变量的“代理”时,一个变量(如点击)缺乏激励才有实际意义。否则,即使对点击没有控制激励,对预测点击的控制激励也可能系统地诱导与对点击的控制激励所诱导的相同类型的决策。在未来的工作中,我们计划分析代理变量会产生什么样的隐性激励。
对用户意见没有控制激励
这个例子符合控制激励与安全和性能相关的循环模式:一些控制激励对于良好的性能是必要的,但是错误的控制激励可能导致系统不安全。例如,AlphaGo 工作得很好,因为它有保护其石头(性能)但不保护其服务器(安全)的控制激励。确保控制激励符合用户的偏好是安全激励设计的核心问题。
定义控制激励
既然我们有了控制激励的基本直觉,我们可以考虑如何定义它们。假设有某个变量 X(比如用户的政治观点)。我们可以考虑如果 AI 系统表现不同,X 可以获得的值。如果将 X 设置为任何可达到的值 X(如“左翼”、“中间派”或“右翼”)会改变绩效,那么我们说 X 上有一个控制激励。根据这个定义,从决策到效用的因果路径上的任何变量都可能出现控制激励。
Everitt 等人定义了干预激励的相关概念。如果可以通过直接设置其值来获得效用,则变量面临干预激励。(这相当于控制的值不为零。干预激励对代理人行为的预测不如控制激励,因为它们没有考虑代理人能够用其决策影响什么——因此我们的论文的标题是“塑造行为的激励”。
让我们回到我们的例子来强调这两种激励之间的区别。所有导致效用的变量都有干预激励,但只有那些也在行动下游的变量才有控制激励。
回应激励
最佳决策必须响应哪些事件?
这个问题对人工智能的安全和公平都有重要的影响。为了人工智能的安全,如果变量是一个关机命令,人工智能系统的行为最好能对这个变量作出反应。这样的反应激励不足以保证安全,但这是一个好的开始。相反,如果缺乏这种激励,那么最优政策很容易变得不安全。同样理想的是,对人类的一般命令有一个响应激励,对价值学习系统有一个对人类价值的响应激励。
这对公平也有重要影响。如果种族或性取向等敏感变量有反应激励,那么这表明训练算法的激励是反事实的不公平。我们在论文中指出,如果在一个敏感的属性上有一个反应激励,那么所有的最优政策相对于该属性都是反事实不公平的。我们的论文采取了一些步骤来定义不公平激励:主要关注如何在给定的图表中排除不公平激励的存在。
因此,响应激励的可取性取决于变化的变量。对于一些变量,我们希望人工智能系统对它们做出响应,以便安全地运行。对于其他变量,如果一个人工智能系统对此做出反应,那么我们认为该系统是不公平的。
应用、限制和后续步骤
这个理论已经通过它的应用证明了它的价值。除了讨论的安全和公平问题,还被应用于分析 AI 拳击方案和奖励篡改问题 ( 博文)。正如公平的例子所示,这个理论并不一定要求代理人进行因果推理或有因果模型,只是我们,设计者,可以对代理人的行为进行因果推理。
从长远来看,我们的愿望是,当研究人员预计到可能的安全或公平问题时,他们会使用这一理论来对他们的人工智能系统进行激励分析。在应用我们的图形标准来自动辨别存在哪些激励之前,这通常涉及绘制各种代理组件如何能够配合在一起的因果图,并形成关于应该(或不应该)存在哪些激励的判断。在非常乐观的情况下,激励分析将成为建立人工智能系统可信度的标准工具,类似于统计方法如何用于描述人工智能性能。但在短期内,我们预计使用这些方法需要一些工作,因此我们很乐意在需要的地方提供建议。
这个理论还没有完成,因为它目前仅限于单代理设置。我们正在努力将其扩展到多决策的情况,最终,我们希望它能够处理多个代理。该文件可从以下网址获得:
r .凯里、E .朗罗伊、T .埃弗里特和 S .莱格。塑造行为的激励机制 (2020),SafeAI@AAAI。
迁移学习的新视角
构建机器学习概念
映射关于域、任务和顺序的问题
在专栏“构建机器学习概念”中,我试图从机器学习(ML)空间中提取概念,并将它们投射到新的、可能不寻常的框架中,以提供新的视角。该内容面向数据科学社区的人们,以及对 ML 领域感兴趣的精通技术的个人。
由作者创建。包括由 Vectra AI 和 taviphoto 通过 iStock 制作的图形。
介绍
“构建机器学习概念的最后一期致力于引入混合处理,并将其与主动学习和直推式&归纳半监督学习一起映射到一个新的框架中。
引发我写这篇文章的原因是,如今迁移学习无处不在,并向许多方向发展。它有各种各样的形状和颜色,但是方法论缺乏一个更高层次的框架。让我们详述一下。
框架:迁移学习的八种途径
转移学习(TL)可能是深度学习中最重要的发展之一,使其适用于现实世界的应用。许多人可能还记得“ImageNet 时刻”,当时 AlexNet 击败了 ImageNet T21 竞赛,并使神经网络成为计算机视觉挑战的标准。然而,有一个问题——你需要大量的数据来完成这项工作,而这些数据通常是不可用的。
随着 TL 的引入,这个问题得到了解决。这使我们能够在 ImageNet 上预先训练一个卷积神经网络 (CNN),冻结第一层,只在一个较小的数据集上重新训练它的头部,使 CNN 进入行业大规模采用。
2018 年,自然语言处理 (NLP)的这个“ImageNet 时刻”终于到来了。我们第一次从重复使用静态单词嵌入转向共享完整的语言模型,这显示了捕捉一系列语言信息的非凡能力。在这一发展中,塞巴斯蒂安·鲁德发表了他的论文关于 NLP 的神经 TL,该论文已经绘制了 TL 中四个不同概念的树形分解图。
映射维度
这让我思考:使用一两个数据集的洞察力来学习一项或多项任务有哪些不同的方式。这些是我能想到的维度:
- 任务:我们是在预训练和微调阶段尝试教我们的网络相同的任务,还是利用第一个任务的知识将其用于不同的第二个任务?(例如,预训练“动物分类器”并将模型微调为“狗品种分类器”与使用“动物分类”网络的主干来训练“绒毛耳朵对象检测器”)
- **域:**我们的数据集来自同一个域还是不同的域?(例如,两个数据集都是“在野外”拍摄的彩色图像,而一个数据集是灰度 x 射线图像)
- **顺序:**我们是同时学习任务还是依次学习?(例如,我们共同计算所有任务的损失,并将其用于训练,而不是完成第一次训练,移植网络的权重,然后开始第二次训练)
我也考虑过增加“重要性”来包含辅助任务,但是我们不要把事情弄得太复杂。因此,我最终得到了与 Ruder 用于 NLP 的维度相似的维度。让我们绘制出所有八种组合,由三个二元维度产生。
轻量级定义
我将对这些术语做出一些自以为是的决定,这些决定没有广泛的文献支持——请耐心等待。
- **任务微调:**当我们预训练一个模型,然后用相同的任务将其微调到相同域中的另一个数据集时,这适用于我们的问题(例如,使用预训练的 ImageNet 分类模型(INCM),然后将其微调到狗品种分类器)。
- **领域适应:**我们正在进行相同的任务,但是正在将我们的模型转移到由手头的另一个数据集给出的新领域中(例如,采用预先训练的 INCM,并在基于 x 射线对健康和患病患者进行分类时对其进行微调)。
- **任务适应:**利用预训练模型的知识(即,其中间输出作为嵌入)来训练它执行不同的任务(例如,使用 INCM 的主干作为特征提取器,并添加第二个网络来执行对象检测)。
- **模态转换:**即使领域和任务不同,使用在图像等方面预先训练的网络可能是有意义的。至少,该网络已经掌握了该模式(例如,使用 INCM 主干网在 x 射线中对乳腺癌进行目标检测)。
- **数据集合并:**如果你想在相同的任务上同时训练来自相同领域的两个数据集,请随意合并它们(例如,将从 Instagram 抓取的图像添加到 ImageNet 数据集,以训练更好的分类器)。
- **权重共享:**即使您正在同时训练两个问题,共享一些中间权重也是有意义的(例如,使用 OCR 生成的文本和 PDF 文档的原始图像来馈入一个联合的中间表示,以对页面的上下文进行分类,以及它是否是一个新文档的开始)。
- **多任务学习:**最受欢迎的实例之一是特斯拉的大型视觉网络,其中一个共享的主干网同时接受多项任务的联合训练(例如,使用特斯拉中摄像机的相同镜头并行运行对象检测和道路标记分割)。
- **并行训练:**最后,如果你有两个不同的问题(域和任务)并且你想同时训练它们,就并行进行(例如,为同一个客户端执行内容审核和电子邮件分类)。
扩展的 2x2x2 矩阵
2x2x2 矩阵、映射任务、域和顺序。由作者创建。
使用维度任务、域和顺序,我们最终得到这个 2x2x2 矩阵,映射出之前介绍的概念。对于 2D 可视化,我在 x 轴上放置了两个维度,并将二进制条目加倍,最终得到 8 个不同的单元(例如,左上角的单元将是相同域、相同任务和顺序顺序)。
关闭
在这篇文章中,我们使用了任务、领域和顺序的维度来构建我们执行 TL 的方式。我喜欢沉迷于我的咨询过去,将它们扩展到一个更大的矩阵,让我思考全新的场景,同时试图填充空白的领域。这导致了一些相当明显的情况(例如,“数据集合并”和“并行训练”),一直到一些已知的还没有普遍使用的名称的过程(例如,“任务微调”)。
如果你有任何其他非传统的映射,对此事的想法,或者对我们在 Luminovo 的工作感兴趣,我很乐意收到你的来信。你可以在 Linkedin 上发表评论或联系我。
敬请关注下一篇文章。
用于统计测试的新 Python 库—比 statsmodels 更简单,比 scipy.stats 更丰富
PYTHON 中的统计模型
统计建模变得更加简单
Pingouin 统计建模 Python 库
Python 的 statsmodels 和 scipy 库令人难以置信。但是,当涉及到执行简单但最广泛使用的统计测试时,如 t 测试、方差分析(ANOVA)和回归,这两个库似乎同时做了太多和太少。
Statsmodels 功能强大,但是它的输出对初学者来说是多余的,难以解析。然而,Scipy.stats 更容易使用,但是提供的输出有些欠缺(例如,只有测试统计和概率值)。
有没有介于两者之间的东西——为最常见的统计测试提供简单而详尽的输出的库?
Pinguoin 前来救援
于 2018 年 4 月发布,目前正在进行积极开发
是一个相对较新的库,旨在为许多常见的统计测试提供简单而详尽的输出。
安装并导入 pingouin
如果你不想安装,打开我的共享 Deepnote Python 笔记本,在你阅读这篇文章的时候一个单元一个单元地运行它。否则,pingouin 可通过 pip 和 conda 获得,因此选择您喜欢的安装方法。
pip install pingouin
conda install -c conda-forge pingouin
这篇文章将只涉及 t 检验、方差分析、回归,以及 pingouin 如何与 熊猫、集成,但是 pingouin 可以做的不止这些(例如,中介),所以查看它的文档。
“学生”t 检验
很容易进行 t 检验并得到最小但重要的结果,这些结果被方便地存储在熊猫数据帧中。
import pingouin as pgx = [1, 2, 3, 4, 5]
y = [0, 1, 2, 3, 6]model = pg.ttest(x, y) # output is a pandas dataframe
print(model)
熊猫数据帧中 t-test 的清晰但全面的输出(运行代码此处
真正令人难以置信的是,结果不仅包括 T 统计量(T)和 p 值(p-val),还包括其他统计量,所有这些都在熊猫数据框架的一行中:自由度(dof)、95%置信区间(CI95%)、科恩的 d 效应大小度量(cohen-d)、反映假设证据强度的贝叶斯因子(BF10)和统计功效(power)。
方差分析(ANOVA)
执行方差分析同样简单。我们将使用 pingouin 中的内置数据集,并改编一个来自官方文档的示例,在该示例中,我们可以看到胆固醇是否可以通过性别(男性或女性)和药物(A、B、C)来预测。
当我们使用 pingouin 时,我们也可以使用与 pandas 数据帧相关联的anova
方法。也支持相当多的其他方法。或者也可以使用等价的pg.anova
函数来代替 pandas 方法。
dt = pg.read_dataset('anova3')# pandas method anova
dt.anova(dv="Cholesterol", between=["Sex", "Drug"]).round(3)# pingouin function anova
pg.anova(dv="Cholesterol", between=["Sex", "Drug"], data=dt)
熊猫数据帧中 ANOVA 的清晰而全面的输出(运行代码此处)
同样,输出是在熊猫数据帧中。Pingouin 几乎使得用 Python 来适应简单的统计模型变得太容易了,并且产生的输出清晰但非常全面——甚至可能比强大的统计计算语言 r 提供的输出更好。
回归
Pingouin 还执行线性和逻辑回归。这里,我们导入了 seaborn 库,这样我们就可以使用内置的 iris 数据集。我们使用萼片长度和萼片宽度来预测花瓣长度。
import seaborn as sns
iris = sns.load_dataset("iris")X = iris[['sepal_length', 'sepal_width']] # predictors/features
y = iris['petal_length'] # outcome/target
pg.linear_regression(X, y)
熊猫数据框架中线性回归的清晰而全面的输出(运行代码此处)
给 Pingouin 一个机会,我很好奇你对它的想法,以及你是否认为你会使用它。另外,如果你喜欢这篇文章,可以看看我的其他几篇关于 Python 和 pandas 数据科学的文章。
** [## 用 Python 中的 pivot_table 重塑熊猫数据框—教程和可视化
使用 pd.pivot_table 将 long 转换为 wide
towardsdatascience.com](/reshape-pandas-dataframe-with-pivot-table-in-python-tutorial-and-visualization-2248c2012a31) [## 在 Python 中更有效地循环的两种简单方法
使用枚举和压缩编写更好的 Python 循环
towardsdatascience.com](/two-simple-ways-to-loop-more-effectively-in-python-886526008a70) [## 真实或虚假的关联:你约会的有魅力的人更令人讨厌
使用 Python 模拟数据、测试直觉并提高数据科学技能
towardsdatascience.com](/real-or-spurious-correlations-attractive-people-you-date-are-nastier-fa44a30a9452)
更多帖子, 订阅我的邮件列表 。**
带有 Huggingface、AWS Lambda 和 AWS EFS 的新型无服务器 Bert
使用无服务器框架、AWS Lambda、AWS EFS、efsync、Terraform、HuggingFace 的变形金刚库,构建一个无服务器问答 API
Jean-Philippe Delberghe 在 Unsplash 上拍摄的照片
原载于 2020 年 11 月 15 日https://www . philschmid . de。
介绍
4 个月前,我写了文章“使用 HuggingFace 和 AWS Lambda 的无服务器 BERT”,演示了如何通过 AWS Lambda 和 HuggingFace 的 Transformers 库以无服务器方式使用 BERT。
在这篇文章中,我已经预测过 “伯特和他的朋友罗伯塔、GPT-2、艾伯特和 T5 将在未来几年推动商业和商业理念,并将像互联网曾经做的那样改变/颠覆商业领域。”
从那以后,BERT 在谷歌搜索中的使用从 10%的英文查询增加到几乎 100%的英文查询。但不是这样。谷歌现在用 BERT 为谷歌搜索提供超过 70 种语言的能力。
https://youtu.be/ZL5x3ovujiM?t=484
在本文中,我们将解决我上一篇文章中的所有缺点,比如模型加载时间、依赖大小和使用。
我们将构建和上次一样的“无服务器的 BERT 驱动的问答 API”。但是,我们没有使用压缩技术来将 Python 依赖关系融入 AWS Lambda 函数,而是使用了一个名为 efsync 的工具。我构建了 efsync 来自动将依赖项上传到 AWS EFS 文件系统,然后将它们挂载到我们的 AWS Lambda 函数中。这允许我们将我们的机器学习模型包含到我们的函数中,而不需要从 S3 加载它。
TL;DR;
我们将使用无服务器框架、 AWS Lambda 、 AWS EFS 、 efsync 、 Terraform 、HuggingFace 的 transformers 库以及在 SQuADv2 上微调的 Google 的mobileBert
模型来构建一个无服务器问答 API。
你可以在这个 Github 库中找到它的完整代码。
库和框架
无服务器框架
无服务器框架帮助我们开发和部署 AWS Lambda 功能。它是一个 CLI,开箱即可提供结构、自动化和最佳实践。
自动气象站λ
AWS Lambda 是一种无服务器的计算服务,让你无需管理服务器就能运行代码。它只在需要的时候执行你的代码,并且自动伸缩,从每天几个请求到每秒几千个请求。
亚马逊弹性文件系统(EFS)
亚马逊 EFS 是一项完全托管的服务,可以轻松设置、扩展和优化亚马逊云中的文件存储。自 2020 年 6 月起,您可以将 AWS EFS 安装到 AWS Lambda 函数
Efsync
Efsync 是一个 CLI/SDK 工具,可以自动将文件和依赖项同步到 AWS EFS。它使您能够将 AWS Lambda 运行时的依赖项直接安装到 EFS 文件系统中,并在 AWS Lambda 函数中使用它们。
将(行星)地球化(以适合人类居住)
Terraform 是一款基础设施即代码(IaC)工具,用于安全高效地构建云原生基础设施。Terraform 使您能够使用 HCL (HashiCorp 配置语言)来描述您的云原生基础架构。
拥抱脸的变形金刚库
变形金刚库为自然语言理解(NLU)和自然语言生成(NLG)提供最先进的机器学习架构,如 BERT、GPT-2、罗伯塔、XLM、DistilBert、XLNet、T5。它还提供了 100 多种不同语言的数千个预训练模型。
建筑
由菲利普·施密德创造
辅导的
在我们开始之前,确保您已经配置并设置了无服务器框架和平台。此外,您需要访问 AWS 帐户来创建 EFS 文件系统、API 网关和 AWS Lambda 函数。
在教程中,我们将使用来自 Google 的预训练BERT
模型构建一个问答 API。
我们将向 lambda 函数发送一个上下文(一小段)和一个问题,lambda 函数将使用问题的答案进行响应。
我们要做什么:
- 使用
terraform
创建所需的基础设施。 - 使用
efsync
上传我们的 Python 依赖到 AWS EFS。 - 用无服务器框架创建一个 Python Lambda 函数。
- 将
BERT
模型添加到我们的函数中,并创建一个推理管道。 - 配置
serverless.yaml
,添加 EFS,设置一个 API 网关进行推理。 - 部署和测试功能。
您将需要一个名为serverless-bert
的新 IAM 用户,并使用aws configure --profile serverless-bert
在 AWS CLI 中对其进行配置。这个 IAM 用户在完整教程中使用。如果你不知道怎么做,看看这个链接。
注意: 我不建议使用 *AdministratorAccess*
为生产使用创建 IAM 用户
在我们开始之前,我想说的是我们不会对每一步都进行详细说明。如果你想更多地了解如何在 AWS Lambda 中使用深度学习,我建议你看看我的其他文章:
- 从零到英雄的缩放机学习
- 如何使用 GitHub 操作和无服务器为 AWS Lambda 设置 CI/CD 管道
- 带 HuggingFace 和 AWS Lambda 的无服务器 BERT
- efsync 我的第一个开源 MLOps 工具包
您可以在这个 Github 库中找到完整的代码。
使用terraform
创建所需的基础设施
首先,我们使用 terraform 定义和创建所需的基础设施。如果你还没有设置,你可以看看这个教程。
作为基础设施,我们需要一个 AWS EFS 文件系统、一个访问点和一个挂载目标,以便能够在 AWS Lambda 函数中使用它。我们也可以创建一个 VPC,但出于本教程的目的,我们将使用默认的 VPC 和他的子网。
接下来,我们创建一个目录serverless-bert/
,其中包含本教程的所有代码,还有一个包含我们的main.tf
文件的子文件夹terraform/
。
之后,我们用我们首选的 IDE 打开main.tf
,并添加 terraform 资源。我为他们所有人提供了一个基本模板。如果您想定制它们或添加额外的资源,请查看文档了解所有可能性。
要更改 EFS 的名字,您可以编辑aws_efs_filesystem
资源中的值creation_token
。否则,EFS 的名字将是“无服务器-伯特”。此外,我们在最后为efs_access_point_id
创建了一个 SSM 参数,以便稍后在我们的serverless.yaml
中使用。
为了使用 terraform,我们首先运行terraform init
来初始化我们的项目和提供者(AWS)。请注意,我们必须在terraform/
目录中。
之后,我们用terraform plan
检查我们的 IaC 定义
完成后,我们用terraform apply
创建我们的基础设施
使用efsync
将我们的 Python 依赖关系上传到 AWS EFS
下一步是在 AWS EFS 文件系统上添加和安装我们的依赖项。因此我们使用一个叫做efsync
的工具。我创建了 efsync 来将 AWS Lambda 运行时的依赖项直接安装到您的 EFS 文件系统中,并在 AWS Lambda 函数中使用它们。
运行pip3 install efsync
安装 efsync
安装完成后,我们在根目录serverless-bert/
中创建一个requirements.txt
,并向其中添加我们的依赖项。
Efsync 提供不同的配置。这次我们使用带有yaml
配置的 CLI。为此,我们在根目录中创建一个efsync.yaml
文件。
这里我们必须调整efs_filesystem_id
和subnet_Id
的值。通过在管理控制台中查找或使用这两个 CLI 命令来获取这些值。
注意,如果您之前更改了creation_token
,您必须在此处进行调整。
您可以为efsync.yaml
配置选择一个subnet_Ids
。如果你想了解更多的配置选项,你可以在这里阅读更多的。
在配置完我们的efsync.yaml
之后,我们运行efsync -cf efsync.yaml
在我们的 AWS EFS 文件系统上安装我们的 Python 依赖项。这大约需要 5-10 分钟。
使用无服务器框架创建 Python Lambda 函数
第三,我们通过使用带有aws-python3
模板的无服务器 CLI 创建 AWS Lambda 函数。
这个 CLI 命令将创建一个包含handler.py
、.gitignore
和serverless.yaml
文件的新目录。handler.py
包含一些基本的样板代码。
将BERT
模型添加到我们的函数中,并创建一个推理管道
因为我们没有将 Python 依赖项包含到 AWS Lambda 函数中,所以我们有大约 250MB 的存储空间用于模型文件。对于那些不太熟悉 AWS Lambda 及其局限性的人,你可以查看这个链接。
如果您想使用大于 250MB 的模型,您可以使用 efsync 将它们上传到 EFS,然后从那里加载它们。更多 此处阅读 。
要将我们的BERT
模型添加到我们的函数中,我们必须从 HuggingFace 的模型中枢加载它。为此,我创建了一个 python 脚本。在执行这个脚本之前,我们必须将transformers
库安装到我们的本地环境中,并在我们的function/
目录中创建一个model
目录。
在我们安装了transformers
之后,我们在function/
目录下创建了get_model.py
文件,并包含了下面的脚本。
为了执行这个脚本,我们在function/
目录中运行python3 get_model.py
。
提示 :将 *model*
目录添加到 gitignore 中。
下一步是调整我们的handler.py
,包括我们的serverless_pipeline()
。
首先,我们将所有需要的导入和我们的 EFS 文件系统添加到PYTHONPATH
中,这样我们就可以从那里导入我们的依赖项。因此我们使用sys.path.append(os.environ['EFS_PIP_PATH'])
。我们将在稍后的serverless.yaml
中定义EFS_PIP_PATH
。
我们创建了serverless_pipeline()
函数,它初始化我们的模型和标记器,并返回一个predict
函数,我们可以在handler
中使用它。
配置serverless.yaml
,添加 EFS,设置推理的 API 网关。
我为这个例子提供了完整的serverless.yaml
,但是我们检查了我们的 EFS 文件系统所需的所有细节,并省略了所有的标准配置。如果你想了解更多关于serverless.yaml
的知识,建议你去看看从零到英雄的缩放机学习。在本文中,我介绍了每种配置,并解释了它们的用法。
我们需要用下面的命令安装serverless-pseudo-parameters
插件。
我们使用serverless-pseudo-parameters
插件让我们的AWS::AccountID
在serverless.yaml
中被引用。在custom
下或我们的functions
部分中引用了所有自定义变量。
自定义:
efsAccessPoint
应该是你的 EFS 接入点的价值。这里,我们使用我们的terraform
模板先前创建的 SSM 参数。LocalMountPath
是 EFS 在 AWS Lambda 函数中的安装路径。efs_pip_path
是我们使用efsync
安装 Python 依赖项的路径。
功能:
-
securityGroupIds
可以是 AWS 帐户中的任何安全组。我们使用default
安全组 id。这个应该是这样的sg-1018g448
。 -
subnetsId
应该与 EFS 文件系统具有相同的 id。它们应该是这样的subnet-8f9a7de5
。
部署和测试功能
为了部署功能,我们运行serverless deploy --aws-profile serverless-bert
。
这个过程完成后,我们应该看到类似这样的东西。
为了测试我们的 Lambda 函数,我们可以使用失眠症、邮差或任何其他 REST 客户端。只需在请求体中添加一个带有context
和question
的 JSON。让我们用 colab 笔记本中的例子来尝试一下。
我们的serverless_pipeline()
用83.1
正确回答了我们的问题。此外,您可以看到完整的第一个请求花费了 2900 毫秒或 29 秒。其中 15 秒用来初始化我们函数中的模型。
第二个请求只用了 390 毫秒。
最棒的是,如果有几个传入请求,我们的 BERT 模型会自动扩展!它可以扩展到数千个并行请求,而不用担心任何问题。
结论
我们已经成功地实现了一个无服务器问答 API。对于实现,我们以无服务器的方式使用 IaC 工具和“最先进的”NLP 模型。从开发人员的角度来看,我们降低了复杂性,但包含了许多 DevOps/MLOps 步骤。我认为有必要包括 DevOps/MLOps,如果你想在生产中运行可扩展的无服务器机器学习,它可以处理你的部署和供应。
感谢阅读。如果你有任何问题,随时联系我或评论这篇文章。你也可以在 Twitter 或者 LinkedIn 上和我联系。
抖音算法和 Trump 的塔尔萨拉力赛的新研究
这一事件说明了抖音的算法是如何让大众政治沟通变得更容易实现的,但这仍然不是民主乌托邦。
今年夏天,我分析了大约 8 万个抖音视频中的数据,这些视频与特朗普在塔尔萨竞选连任集会上的恶作剧有关。我的主要兴趣是理解抖音的算法是如何在这场恶作剧中发挥作用的。这篇文章总结了我的研讨会研究论文的发现,该论文在 RecSys 2020 研讨会上提出了负责任的建议。
背景
为什么川普政府想要禁止抖音?几周前,这款应用似乎离死亡只有几天了。但我们中的许多人仍然在问:特朗普到底为什么要禁止它?亚洲记者埃沃特综合了三种主要解释:
- 美国和中国之间的紧张关系
- 抖音青少年和 K-pop 斯坦坦克他的塔尔萨集会
- 抖音的政治权力
所有这三个因素很可能影响了禁令,可能还有更多我们永远不知道的。但鉴于特朗普政府在 2020 年 7 月才开始采取行动,完整的时间表表明,塔尔萨的恶作剧可能是某种催化剂:
- 2017 年:特朗普上任
- 2018:字节跳动将 Musical.ly 融入抖音(来源)
- 2019 年:抖音全球下载量突破 10 亿(来源)
- 2020 年 6 月 14 日:特朗普的连任竞选活动吹嘘即将在塔尔萨举行的集会创纪录的出席人数(80 万+)
在恶作剧的前几天,前竞选经理布拉德·帕斯科吹捧破纪录的注册
- 2020 年 6 月 20 日:只有 6200 人参加的拉力赛在一个有 19000 个座位的竞技场举行
[## 由于出席人数低于预期,特朗普取消了在塔尔萨集会上的户外演讲
特朗普总统在塔尔萨周六晚上的集会上取消了对竞技场外拥挤人群的演讲计划…
www.businessinsider.com](https://www.businessinsider.com/trump-canceled-outdoor-speech-at-tulsa-rally-over-low-turnout-2020-6)
- 2020 年 6 月 20 日:报道称抖音青少年和 K-pop 歌手集体注册参加塔尔萨集会,用人为夸大的注册号码来恶作剧
国会议员亚历山大·奥卡西奥·科尔特斯回应布拉德·帕斯科,强调了韩国流行音乐斯坦斯和抖音用户的恶作剧
- 2020 年 7 月 7 日:川普建议禁止抖音(来源
当我读到这些事件时,我想知道抖音的“为了你”推荐算法是否在促进恶作剧中发挥了作用。因为与脸书、推特和其他主要依赖朋友、关注者或其他用户决定的网络的平台不同,抖音的应用程序采取更主动的方式向你展示媒体。一位记者这样总结这个算法:
“为什么不开始向人们展示一些东西,看看他们会怎么做?”(约翰·赫尔曼)
第一次打开抖音应用程序时,你从一个简短的类别列表中选择兴趣(例如,烹饪、舞蹈、动物、运动等。).紧接着,抖音的推荐算法“为你”筛选出无限的视频源,使用广泛的信号来推断你的兴趣,并进一步个性化推荐。在很大程度上,抖音的推荐算法似乎决定了创作者视频的命运。
这让我想知道抖音的算法是如何决定塔尔萨集会恶作剧宣传视频的命运的,我和我的顾问尼克·迪亚克普洛斯(Nick Diakopoulos)就此进行了一项小型研究。由于无法直接获得抖音的数据,我们在寻找答案方面受到了一定的限制,但我们仍然能够解决三个主要的研究问题:
- 塔尔萨的视频和其他视频相比,的总体受欢迎程度如何?
- 个人用户如何体验塔尔萨视频的受欢迎程度?
- 基于统计模型,在控制其他因素的情况下,塔尔萨视频的受欢迎程度是否得到了独特的提升?
资料组
我们使用大卫·蒂瑟创建的非官方 API 收集数据集。从记者 Jenna Amatulli 收集的[视频种子开始,我们使用种子视频的标签和配乐来滚雪球般地收集样本。我们最终得到了 600 多个号召行动的塔尔萨视频,鼓励用户注册参加集会的门票作为恶作剧。然后,我们从遇到的所有用户那里收集了多达 300 个最近的视频,以此作为比较的基准。总数据集约为 80,000 个视频。](https://twitter.com/ohheyjenna/status/ 1274558069876367361)
数据集有几个值得注意的限制。首先,在抖音的界面中,所有计数都是四舍五入的,因此,例如,4,300,021 次播放被报告为“430 万次播放”第二,所有的剧都是平等报道的。“为了你”页面中的一个播放,直接分享视频的一个播放,以及第四次观看视频的人的一个播放——它们都被计算在同一个桶中。尽管如此,这些数据足够丰富,足以提供一些有力的见解。
结果
1.总体模式
我们首先观察了视频受欢迎程度的总体模式,发现视频的受欢迎程度逐例增加。本质上,我们发现了参与度反馈循环的证据,其中喜欢和评论导致更多的播放:
正如大多数抖音创作者会告诉你的,点赞越多的视频往往会获得更多的播放。
值得注意的是,我们发现创作者的观众规模并不能可靠地保证他们的视频播放。换句话说,如果一个创作者有 20 万名粉丝,就没有办法持续预测他们的新视频会吸引多少次播放——这取决于具体情况,例如视频计数和评论计数。这对许多抖音用户来说很直观,但我们的数据为这一现象提供了一些经验证据:
在我们的数据中,一些追随者很少的创作者发布了受欢迎的视频,而有很多追随者的创作者并没有持续获得大量播放。
这一阶段的分析还表明,塔尔萨的视频(促进注册)比其他视频更有可能受欢迎。例如,70%的塔尔萨视频的播放量不到 1000 次,而 85%的其他视频的播放量不到 1000 次。此外,塔尔萨相关视频的播放量中值为 292 次,而数据集其余部分的视频播放量中值为 155 次。在下图中,播放次数越多,代表 Tulsa 视频的线条明显向右移动:
塔尔萨视频的受欢迎程度分布略高,例如,只有 70%的塔尔萨视频获得 1,000 次或更少的播放,而 85%的其他视频获得 1,000 次或更少的播放。
总体受欢迎程度的“S 曲线”表明了高度的不平等。本·韦斯特(Ben West)研究了抖音的不平等,并在一份 2 万份视频样本中发现基尼系数为 0.93(“抖音几乎完全不平等”)。我们样本中的基尼系数为 0.94,证实了抖音作为一个平台的高度不平等。值得注意的是,这种模式并不是抖音独有的,事实上之前的工作表明“S 曲线”在用户生成的视频平台中相当普遍:
S 曲线流行模式在以前的工作中已经发现,如查等人(2009)的“分析大规模用户生成内容系统的视频流行特征”中的图表所示。
2.用户特定的模式
在分析的第二阶段,我们放大了特定用户,以查看他们在塔尔萨的视频表现如何。Mary Jo Laupp 的视频是我们数据集中最受欢迎的 Tulsa 视频,似乎受益于算法放大。在收集数据时(集会后几天),Laupp 的视频播放次数远远超过 200 万次,尽管她只有大约 18,000 名粉丝,她的第二大热门视频播放次数不到 10 万次。在她所有视频的图表中,塔尔萨的视频遥遥领先于其他所有视频:
Mary Jo Laupp 的视频是我们数据集中最受欢迎的塔尔萨视频,播放量超过 200 万次。由于她当时只有大约 18000 名粉丝,我们可以有把握地推断,抖音的算法放大了视频。
正如我们在论文中报道的那样,我们发现了一些类似的案例,尽管大多数没有像玛丽·乔·劳普那样经历急剧的增长。尽管如此,对于数据集中 76%的用户来说,他们的塔尔萨视频比他们的中值视频获得了更多的播放,这证明了塔尔萨视频的总体受欢迎程度有所提高。
3.统计建模
最后,我们使用统计建模来确定塔尔萨视频是否经历了系统性的受欢迎程度的增加。同样,我们的数据集不能说明一切,但我们能够控制视频长度和参与度统计等因素(即计数、评论计数、分享计数),伪 R 表明这些因素解释了数据中约 67%的变化。
塔尔萨视频获得了更高的参与度,从而带来了更高的播放量
根据我们的统计模型,塔尔萨的视频并没有经历系统的普及。相反,由于更高的参与度,它们获得了更高的播放次数,与我们数据集中的其他流行视频一样。换句话说,我们没有发现抖音的算法对塔尔萨视频给予特殊对待的证据。
统计模型发现,塔尔萨视频的播放量没有出现系统性增长。
在的论文中有更多的统计细节(例如相关性测试和 Wilcoxon 符号等级测试),这些数据都指向同一个结论:塔尔萨视频吸引了更多的用户参与,从而导致更多的播放,但它们并没有从抖音的算法中获得特殊待遇。
限制
即使在这样的博文中,也要注意到科学研究的局限性。我们不得不使用抖音的全面统计数据,在收集数据时,我们可能错过了一些相关的视频。给定我们的研究问题,最大的限制是我们使用总播放计数来估计算法为你页面的受欢迎程度。换句话说,我们无法区分“来自‘为你’页面的剧本”和“来自其他地方的剧本”这是媒体曝光研究中的一个标准限制,但也是一个值得注意的重要限制。
同样值得注意的是,抖音的透明度努力可以提供关于算法推荐的视频的更多信息。例如,他们可以发布该算法推荐了 50 万次或更多次的视频列表,这将有助于提供一些问责制。
那又怎样?
对我来说,从我们的分析中最大的收获是抖音用户可以帮助决定哪些视频变得流行。在许多情况下,抖音的创作者不需要大量的追随者来接触大量的观众,他们只需要一个引人入胜的视频。这个原理相当简单,并在其他平台上使用,但抖音似乎已经破解了代码,并微调了他们的算法,不再强调朋友/追随者的作用。
在某些方面,这使得抖音成为一个非常民主的平台,因为用户可以通过简单的喜欢、评论、分享或完成一个视频来为哪些视频变得流行进行投票。事实上,创作者经常要求观众“喜欢并分享这个视频”,“保持高比例”,或者(我个人最喜欢的)“给这个视频加油。”抖音应该如何处理这种行为?Instagram 采取了惩罚性的方式。就我个人而言,我希望抖音认识到这种行为不是“游戏系统”,而是基本上为人们在应用程序中看到的视频投票。
关于投票和民主的问题,还值得考虑的是,抖音不允许政治广告。在我看来,这使得抖音对威权领导人构成了威胁,尤其是考虑到视频流行的民主、草根式投票。但是,与此同时,抖音本身在某些方面是集权和独裁的。平台定期删除数百万视频,其强大的算法产生了明显的不平等——我们数据集中前 1%的视频占所有播放的 76%。此外,尽管在透明度方面做出了努力,但该平台的不透明性在其向创作者付费的新方法中得到了强调,用户称这种方法“T6”充满了问题
简而言之,抖音不仅仅是一个分享视频的有趣应用程序——它具有现实世界的社会、政治和经济后果,需要进一步关注。有时,后果很有趣,比如特朗普在塔尔萨集会上的恶作剧,或者在内森·阿波达卡(Nathan Apodaca)在一个标志性的抖音喝了越橘汁后,Ocean Spray 的品牌彻底改造:
[## 病毒海洋喷雾抖音视频如何一夜之间改变了一个 90 岁的公司
在商业中,时机就是一切。汤姆·海斯,我们在这里说你接任 90 岁的首席执行官的时机…
finance.yahoo.com](https://finance.yahoo.com/news/how-the-viral-ocean-spray-tik-tok-video-transformed-a-90-yearold-company-overnight-173804141.html)
但有时后果并不像对特朗普的恶作剧或讽刺性的蔓越莓汁品牌那样有趣。我们知道像抖音这样的算法可以放大危险的虚假声明、极端主义信息和其他有问题的媒体,例如抖音在 7 月份放大的反犹太迷因。
不管后果是有趣还是令人担忧,越来越明显的是,抖音教对我们的社会产生了重大影响。鉴于这种影响,我们应该继续让抖音为它放大的信息和它制造的不平等负责。这款应用可能会对威权领导人构成威胁,但它离民主乌托邦还很远。
如果你对我在本帖中总结的 研究有任何问题或意见,请联系我!
凯特琳·皮特尔、布鲁克·艾琳·达菲和艾米丽·洪德写了一篇关于 Instagram pods 的令人着迷的 研究论文 。维多利亚·奥米拉还写了一篇关于现象的的精彩论文。两者都极大地帮助了我的研究。
新 TF2 对象检测 API
ML 提示和技巧/ TF2 OD API
欢迎新动物进入动物园——模型评估
(图片由作者提供)
Tensorflow 对象检测 API (TF OD API)刚刚变得更好。最近,Google 发布了新版本的 TF OD API,现在支持 Tensorflow 2.x,这是我们一直在等待的巨大改进!
介绍
**物体检测(OD)技术的最新进展是由行业广泛采用该技术推动的。**汽车制造商使用物体检测来帮助车辆在道路上自主导航,医生使用它来改善他们的诊断过程,农民使用它来检测各种作物疾病……和 还有许多其他的使用案例(有待发现),在这些案例中,OD 可以提供巨大的价值。
Tensorflow 是一个深度学习框架,为自然语言处理(NLP)、语音合成、语义分割和对象检测中的许多最先进的(SOTA)模型提供支持。TF OD API 是一个开源的对象检测模型集合,由深度学习爱好者和该领域的不同专家使用。
现在,当我们介绍了基本术语后,让我们看看新的 TF OD API 提供了什么!
新的 TF OD API
新的 TF2 OD API 引入了急切执行,使得对象检测模型的调试更加容易;它还包括 TF2 模型动物园支持的新 SOTA 模型。对于 Tensorflow 1.x .用户来说,好消息是新的 OD API 是向后兼容的,所以如果你喜欢,你仍然可以使用 TF1,尽管强烈建议切换到 TF2!
除了之前 TF1 模型动物园有的 SSD (MobileNet/ResNet)、更快的 R-CNN (ResNet/Inception ResNet)、Mask R-CNN 模型外,TF2 模型动物园还推出CenterNet、ExtremeNet、efficent det等新 SOTA 模型。
TF2 OD API 模型动物园中的模型在 COCO 2017 数据集上进行了预训练。如果你对这个数据集中已经包含的类别感兴趣,预先训练的模型可以用于开箱即用的推理,或者在新数据集上训练时用于初始化你的模型。使用 TF OD API 模型而不是自己实现 SOTA 模型可以让您有更多的时间关注数据,这是实现 OD 模型高性能的另一个关键因素。然而,即使您决定自己构建模型, TF OD API 模型提供了一个很好的性能基准!
您可以根据自己的需求(速度与精度)从一长串不同的型号中进行选择:
TF2 OD API 模型动物园中包含的模型。
在上表中,您可以看到表中仅给出了平均 COCO mAP 指标。尽管对于模型的性能来说,这可能是一个相当好的方向,但是如果您对模型在不同大小的对象或不同类型的对象上的表现感兴趣,那么附加统计信息可能会很有用。例如,如果你对开发你的高级驾驶辅助系统 ( ADAS )感兴趣,你不会真的关心探测器探测香蕉的能力是否差!
在这篇博客中,我们将重点解释如何对 TF2 模型动物园中现成的不同预训练efficient det检查站进行详细评估。****
效率检测— SOTA OD 模型
EfficientDet 是一个与 RetinaNet 模型非常相似的单次检测器,有几处改进: EfficientNet 主干 、加权双向特征金字塔网络(BiFPN)和复合缩放方法。
BiFPN 是非常流行的 FPN 的改进版本。它学习表示不同输入特征重要性的权重,同时重复应用自上而下和自下而上的多尺度特征融合。
特征网络设计 : a) FPN 引入自上而下的路径融合多尺度特征,b) BiFPN 在现有自上而下的路径上增加自下而上的路径,创建双向 FPN。来源:https://arxiv.org/pdf/1911.09070.pdf
提高目标检测模型精度的常用方法是增加输入图像的大小或使用更大的主干网络。复合缩放不是在单个维度或有限的缩放维度上操作,而是联合放大主干、特征网络和盒/类预测网络的分辨率/深度/宽度。
TF2 OD API Model Zoo中包含了具有不同缩放因子的 EfficientDet 模型,缩放因子在模型名称中用{ X} 表示,而输入图像分辨率用*{ RES }*X {*RES }*efficient det D {X }{*RES }*X {*RES }*表示。
用于高效检测的复合缩放配置。来源:https://arxiv.org/pdf/1911.09070.pdf
EfficientDet 架构采用 EfficientNet 作为主干网络,BiFPN 作为特征网络,以及共享类/箱预测网络。来源:https://arxiv.org/pdf/1911.09070.pdf
预训练 EfficientDet 模型的评估
我们希望进行详细的精度比较,以研究复合扩展配置对网络本身性能的影响。出于这个原因,我们创建了一个 Google Colab 笔记本,在其中我们解释了如何对模型进行评估,以及如何有效地比较评估结果。我们对详细的评估统计感兴趣,包括每个类和不同对象大小的统计。
不幸的是,TF OD API 不支持这种现成的统计数据。这就是为什么我们创建了 TF OD repo 的一个分支,并更新了相关脚本,以按照本期中给出的说明引入该功能。
在笔记本中,我们提供了如何设置tensor flow 2和TF2 OD API的说明。我们还包括脚本,可以轻松下载 EfficientDet 检查点,以及额外的脚本,可以帮助您获取 COCO 2017 Val 数据集,并创建 tfrecord 文件,供 TF OD API 在评估阶段使用。
最后,我们修改 EfficientDet 检查点的pipeline.config
文件,为后续评估 8 EfficientDet 检查点做好准备。TF OD API 使用它们来配置培训和评估过程。培训管道的模式可在object_detection/protos/pipeline.proto
中找到。在高层次上,配置文件分为 5 个部分:
model
的配置。这定义了将被训练的模型的类型(即,元架构、特征提取器……)。train_config
,决定用什么参数来训练模型参数(即 SGD 参数、输入预处理、特征提取器初始化值……)。eval_config
,它决定将报告什么样的组指标进行评估。train_input_config
,它定义了模型应该在哪个数据集上进行训练。eval_input_config
,其中定义了模型将在上评估的数据集。通常,这应该不同于训练输入数据集。
model {
(... Add model config here...)
}train_config : {
(... Add train_config here...)
}train_input_reader: {
(... Add train_input configuration here...)
}eval_config: {
}eval_input_reader: {
(... Add eval_input configuration here...)
}
我们只对配置文件的eval_config
和eval_input_config
部分感兴趣。仔细查看 Google Colab 中的单元格,了解我们如何设置评估参数的更多详细信息。TF OD API 中另外两个没有启用的标志是include_metrics_per_category
和all_metrics_per_category
。在应用了 Colab 笔记本中给出的补丁后,当设置为true
时,这两个选项将启用我们感兴趣的详细统计(按类别和大小)!
Allegro Trains —高效的实验管理
为了能够有效地比较模型评估,我们使用一个名为 的开源实验管理工具来训练**** 。很容易将它集成到您的代码中,并且它支持开箱即用的不同功能。它可以作为张量板的替代品,用于可视化实验结果。
来源:https://allegro . ai/WP-content/uploads/2019/11/allegro-logo-1 . jpg
OD API 中的主脚本是object_detection/model_main_tf2.py
。它处理训练和评估阶段。我们创建了一个小脚本,它在一个循环中调用model_main_tf2.py
来评估所有 EfficientDet 检查点。
为了将 Allegro Trains 实验管理集成到评估脚本中,我们必须添加 2 (+1)行代码。在model_main_tf2.py
脚本中,我们添加了以下几行:
from trains import Tasktask = Task.init(project_name="*NAME_OF_THE_PROJECT*", task_name="*NAME_OF_THE_TASK*")# OPTIONAL - logs the pipeline.config into the Trains dashboard
task.connect_configuration(FLAGS.pipeline_config_path)
火车会自动开始为你记录许多事情。你可以在这里找到全面的特性列表。
比较不同的效率检测模型
在这个 链接 上,可以找到 TF2 OD API 收录的 8 款 EfficientDet 车型的评测结果。我们将实验命名为efficientdet_d{X}_coco17_tpu-32
,其中{x}
表示 EfficientDet 模型的复合比例因子。如果您运行示例 Colab 笔记本,您将得到相同的结果,并且您的实验将显示在演示训练服务器上。
**在本节中,我们将向您展示如何有效地比较不同的模型,并验证它们在评估数据集上的性能。**我们使用 COCO 2017 Val 数据集,因为它是 TF OD API 中评估对象检测模型的标准数据集。
Trains 自动捕获代码、超参数和度量(图片由作者提供)。
我们感兴趣的是 COCO 对象检测模型评价指标 **。**按下这里的查看实验结果。该页面包含我们感兴趣的所有指标的图表。
我们可以先看一下DetectionBoxes_Precision
图,它包含数据集中所有类别的平均精度度量。地图度量的值对应于 TF2 动物园模型的表格中报告的地图度量。
COCO 2017 评估数据集中所有类别的 detection boxes _ Precision metrics(图片由作者提供)。
多亏了我们对pycocotools
应用的补丁,我们还可以得到每个类别的地图度量。由于 COCO 数据集中有 90 个类别,我们想知道每个类别对平均准确度的贡献。通过这种方式,我们可以对被评估模型的性能有更加**的深入了解。**例如,您可能只对某个类别中的小对象的模型表现感兴趣。从汇总的统计数据来看,不可能获得这样的洞察力,而建议的补丁可以做到这一点!
EfficientDet D0 模型的每个类别映射指标(图片由作者提供)。
**我们还使用 Allegro Trains 的功能来比较多个实验。实验对比显示了模型之间的所有差异。**我们首先可以获得相关统计数据的详细标量和绘图比较。在我们的示例中,我们将比较 EfficientDet D0、D1 和 D2 模型的性能。显然,复合缩放对模型的性能有积极影响。
拥有每个类别的统计数据的额外好处之一是,您可以**分析复合比例因子对某个感兴趣类别的准确性的影响。例如,如果您对检测监控视频中的公交车感兴趣,您可以分析显示公交车类别的地图性能与 EfficientDet 模型的复合比例因子的图表。**这有助于决定使用哪种模型,以及性能和计算复杂性之间的最佳平衡点在哪里!
“bus”类别的映射指标与 EfficientDet 模型的复合比例因子(图片由作者提供)。
您还可以比较的一件有趣的事情是模型配置文件** pipeline.config.
您可以看到 EfficientDet 模型之间的基本差异在于输入图像的尺寸和滤波器的数量/深度,如前所述。**
(图片由作者提供)
下一个图包含 3 个 EfficientDet 模型的 mAP 值。有一个明显的好处是增加输入图像的分辨率,以及增加模型中的滤镜数量。虽然 D0 模型实现了 33.55%的平均动脉压,但 D2 模型优于它,它实现了 41.79%的平均动脉压。您还可以尝试执行每个类的比较、其他 EfficientDet 模型的比较,或者您对应用程序感兴趣的任何事情。
EfficientDet D0、D1 和 D2 车型的地图对比(图片由作者提供)。
TF OD API 是如何用于提高工地安全的?
Forsight 是一家早期创业公司,我们的使命是将建筑工地变成工人的安全环境。 Forsight 利用计算机视觉和机器学习,处理实时闭路电视镜头,帮助安全工程师监控个人防护设备(PPE)的正确使用,以保持现场安全。
我们的施工现场监控管道建立在 TF OD API 之上,其功能包括 PPE 检测和监控、社交距离跟踪、虚拟地理围栏监控、禁止停车区监控和火灾探测。在 Forsight,我们还使用 Trains 来跟踪我们的实验,在团队成员之间分享它们,并记录一切,以便我们可以重现它。
(图片由作者提供)
随着新冠肺炎疫情的继续,世界各地的建筑项目都在积极寻找在保证工人安全的同时重启或继续项目的方法。计算机视觉和机器学习可以帮助建筑经理确保他们的建筑工地是安全的。我们建立了一个实时监控渠道,跟踪员工之间的社交距离。
使用 TF OD API 进行社交距离监控(图片由作者提供)。
除了新的无形的 COVID 威胁之外,所有建筑工人每天都面临一些古老的危险,特别是“致命四大危险”:坠落、被物体击中、夹在物体之间以及触电危险。确保工人穿戴个人防护装备对建筑工地的整体安全至关重要。TF OD API 是构建自主 PPE 监控管道的一个很好的起点。我们的下一篇博客将讨论如何使用新的 TF OD API 训练一个基本的头盔探测器。****
使用 TF OD API 的个人防护装备(PPE)监测(图片由作者提供)。
建筑工地的某些区域比其他区域更危险。创建虚拟地理围栏区域并使用 CCTV 摄像机对其进行监控,为施工经理增加了巨大的价值,因为他们可以专注于其他任务,同时了解工地上发生的任何地理围栏违规事件。此外,地理围栏可以很容易地扩展到监控机器和重型设备的访问。
使用 OD API 进行地理围栏监测(图片由作者提供)。
结论
在这篇博客中,我们讨论了使用新的 TF2 OD API 的好处。我们已经展示了如何有效地评估 TF2 OD API 模型动物园中现成的预训练 OD 模型。我们还展示了如何使用 Allegro Trains 作为高效的实验管理解决方案,实现强大的洞察力和统计。最后,我们展示了一些建筑环境中物体检测的真实应用。****
这个博客是提供关于使用 TF2 OD API 的指导和建议的博客系列中的第个博客。在下一篇博客中,我们将展示如何训练一个定制的对象检测器,使您能够检测穿着 PPE 的工人。请关注我们,获取更多实践教程!此外,如果您有任何问题或意见,请随时联系我们!****
[1]“现代卷积物体探测器的速度/精度权衡”
黄 J、拉特霍德 V、孙 C、朱 M、科拉迪卡拉 A、法蒂 A、菲舍尔 I、沃伊娜 Z、
宋 Y、S、墨菲 K、2017
[2] TensorFlow 对象检测 API,https://github . com/tensor flow/models/tree/master/research/Object _ Detection
[3]“Efficient det:可扩展和高效的对象检测”谭明兴,庞若明,郭诉乐,
[4]“efficient net:卷积神经网络模型缩放的再思考”谭明星和郭诉乐,2019,
数据可视化新手?从纽约市开始
视频教程
我是如何利用纽约的大量公开数据以及 Plotly 和 Pandas 来发展我的数据可视化技能的
本文附有视频,并演示了第一个示例的代码。
介绍
像许多其他人一样,由于冠状病毒,我已经在家工作了几个星期。部分受 Terence Shin 关于隔离期间尝试数据科学项目的文章的启发,我决定利用一些空闲时间来提高我的数据科学技能。我是一名高中计算机科学教师,鉴于数据科学在当今世界日益突出,将数据科学技能添加到我可以教给学生的内容组合中对我来说很重要。我学到的一件事是,如果你想自学数据可视化,纽约市是一个很好的起点,我将在本文中解释为什么。在这个过程中,我将提供一些小型的纽约主题项目的例子,您可以试着更加熟悉如何用 Python 处理和可视化数据。
曼哈顿的 choropleth 地图,其中每个地块根据其到最近的公共图书馆的距离进行着色。
原因 1:数据,数据,数据
纽约市提供了大量高粒度的公共数据(在某些情况下可以精确到单个建筑)。你可以很容易地找到关于评估财产价值、按邮政编码划分的收入等级、公共设施位置等信息。此外,有很好的定制下载程序可以得到你需要的数据。
纽约市开放数据网站是搜索公开可用数据集和下载文件的一个很好的起点。
纽约开放数据门户:https://opendata.cityofnewyork.us/
纽约市政府发布了一个名为 PLUTO 的数据集,其中包含了该市每一个地段的税务相关信息。使用这个庞大的数据集,您可以获得关于城市中任何给定地块的各种信息,例如建筑面积的平方英尺数、楼层数、用于税收目的的评估财产价值、所有者的姓名等等。此外, MapPLUTO 数据集将这些数据与地理数据合并,为城市中的每个地块提供多边形。访问这些数据的一个很好的工具是 Chris Whong 的自定义 PLUTO downloader,它可以让您准确地选择您想要下载的城市区域,以及您想要的 PLUTO 数据的列。
Chris Whong 的纽约冥王星自定义数据下载器:【https://chriswhong.github.io/plutoplus/
纽约市首都规划平台是另一个优秀的自定义下载平台,您可以在其中查看所有公共设施,如公园、学校、医院、青年中心、停车场等。一旦您细化了您的选择,您可以下载数据作为一个 CSV 文件。
纽约市首都规划平台:https://Capital Planning . NYC . gov/map/facilities # 10/40.7128/-74.0807
原因 2:可识别性
作为一个标志性的全球城市,纽约既是商业圣地,又是旅游热点,还是无数电影和电视剧的背景,它的品牌知名度很高。大多数人可能对纽约的地理有一些基本的了解,如中央公园、五个区、纽约的一些街区(如上东区、哈莱姆区等)。).
这种可识别性可以帮助您在预处理数据时理解数据,或者在您点击 run 时对结果进行检查。但是,即使你对这个城市不熟悉,其他观看你作品的人也很有可能会很熟悉。这使得涉及纽约市数据的项目非常适合个人作品集、博客或其他您希望与其他人分享以展示您的技能的媒体。
原因 3:多样性和密度
纽约既人口稠密又非常多样化。这些因素有助于使与纽约市相关的可视化更加有趣;可以在单个邻域的水平上进行非常有意义和数据丰富的可视化。它的多样性提供了许多分析和可视化数据的维度,尤其是以视觉或地图的形式,包括以下示例:
- 社会经济地位与地理的关系
- 种族/民族和地理之间的关系
- 语言和地理的关系
范例项目#1:根据到最近图书馆的距离绘制曼哈顿地图
目标
这个项目的目标是可视化每个地块到最近图书馆的距离。但是,使用非常类似的过程,您还可以可视化到许多不同感兴趣要素的距离,例如地铁站、公园、学校或医院。choropleth 地图提供了一种极好的方式来直观显示大量地理数据。使用这种方法,很容易识别城市中潜在的“阅读沙漠”或“绿色空间沙漠”。
数据
我使用了 MapPLUTO 数据集来加载曼哈顿所有地块的信息,包括它们的纬度和经度。我还使用纽约市首都规划平台下载了曼哈顿所有图书馆的数据,包括它们的名称和纬度/经度。然后,我将这些数据作为熊猫数据帧加载到我的 Python 程序中。
计算到最近图书馆的距离
我第一次尝试计算每个批次的最近库是一种幼稚的蛮力方法,如下面的代码片段所示。由于大量的冗余计算,这被证明太慢了。
df['dist'] = df['coord'].apply(lambda x: min([geopy.distance.distance(x, y).km for y in libs['coord']]))
我的重大突破是想起了大学的一次讲座,教授提到了一种叫做 K-D 树的东西。这是一种为快速找到给定点的最近邻而优化的数据结构。这个的一个实现包含在sklearn.neighbors
库中。因为我们处理的是(纬度,经度)坐标对,所以我们应该使用带有“哈弗辛”距离度量的BallTree
。使用这个库来计算最近的库将运行时间加快了几个数量级。
到最近图书馆的距离是在单个批次的水平上计算的,给出了图书馆访问的细粒度视图。
我学到了什么
- **明智地使用 choropleth 地图。**它们在某些情况下可能很棒,但在其他情况下可能会误导人。例如,美国 2016 年总统选举结果的县级 choropleth 地图会给人以该国绝大多数人投票给红色的印象,但这是误导性的,因为人口密度更高的地区倾向于投票给蓝色。
- **算法效率至关重要。**尤其是在处理大型数据集时,要注意你是否在执行许多冗余的计算。做一些研究,看看是否有工具可以更好地完成你的部分任务,这样你就不会重复发明轮子。
代码
在https://github.com/thomashikaru/nycvisualization访问数据文件和代码。
范例项目#2:根据人口密度绘制纽约市社区地图
目标
这个项目的目标是可视化纽约市不同社区的人口密度。稍加变化,同样的方法可用于可视化种族、收入或其他特征的分布。
数据
除了将城市划分为单独的地段或邮政编码之外,还可以将城市划分为相邻的制表区域。这些对应于纽约熟悉的街区,如上西区、唐人街或公园坡。找到包含每个邻域人口的数据文件相对容易,使用纽约开放数据工具下载包含邻域边界多边形的 GeoJSON 文件也相对容易。
从人口转换到密度
用总人口数来给地图着色可能会产生误导,因为社区的大小差别很大。相反,我们可以根据人口密度给地图上色。这需要计算每个邻域的面积,而这并不直接包含在数据中。使用area
库,我们可以计算每个 GeoJSON 多边形的面积,然后使用这些值计算密度(人口除以面积)。
Choropleth 地图根据人口密度显示纽约市的邻近地区。
我学到了什么
- **(再次)明智地使用 choropleth 地图。**每个邻域的大小变化很大,有些随意。可视化每个邻域的密度比绝对人口更有意义。
- 将不同来源的数据结合起来。每个邻域的人口数据存储在一个 CSV 文件中(我将该文件读入 Pandas DataFrame),而每个邻域的多边形存储在 GeoJSON 文件中。我浏览了 GeoJSON 文件,制作了一个字典,将每个社区代码映射到它的区域,然后使用了熊猫。Series.map()函数将数据帧中的邻域与相应的区域进行匹配,以计算密度值。
代码
在 https://github.com/thomashikaru/nycvisualization 的访问数据文件和代码。
摘要
如果您是数据科学或数据可视化的新手,可以考虑选择纽约市作为起点,这样可以花更少的时间寻找数据,花更多的时间获取新技能。利用现有的大量数据和优秀的定制下载程序。
尝试上面提到的项目之一,熟悉有用的数据科学工具如 Pandas 和 Plotly,以及常用的数据格式如 GeoJSON 和 CSV。
我希望你学到了新东西。祝你在学习旅途中好运!
参考
[1] T. Shin, 14 天隔离期间要做的 14 个数据科学项目 (2020),中等。
[2] N. Piepenbreier,用 Python 漂亮地可视化新冠肺炎数据(不超过 5 分钟) (2020),中等。
[3] E .马尔迪,如何用 plottly(2020)创建交互式地图地块,中。
[4] T. Shin,如何用 Choropleth 图谱可视化疫情冠状病毒 (2020),中等。
新的 Windows 终端:你不能要求更多
新的 Windows 终端在一个智能和高度可定制的包中结合了一切。
新的微软视窗终端
GNOME 终端、终结者、 Cmder 、Hyper……很多用户信誓旦旦的 shell 接口和终端模拟器。有些提供更好的功能,有些提供便利或扩展的可定制性。
GNOME 终端,Terminator,Cmder,Hyper…很多用户信誓旦旦的 shell 接口和终端模拟器。但是神话和现实有交换思想的倾向。因此,每隔一段时间就会出现一种新的力量来统治他们。
依我拙见,《终结者》是天赐之物,直到最近还是我的司机。它提供了你能从终端模拟器中得到的一切,没有 Cmder 或 Hyper 的小故障。但是神话和现实有交换思想的趋势,因此,经常会出现一个新的国王来统治他们。
这一次,王者不知从哪里冒出来,而且是新的微软 Windows 终端。我的意思是,**谁会想到微软会开发一个新的终端模拟器,它结合了你想要命令行工具做的任何事情,是开源的和高度可定制的?**在这个故事中,我们将深入了解新的微软终端,熟悉它的功能,并看看我们如何对它进行定制。
学习率是我每周给那些对 AI 和 MLOps 世界好奇的人发的简讯。你会在每周五收到我关于最新人工智能新闻、研究、回购和书籍的更新和想法。在这里订阅!
新的 Windows 终端
Windows 终端是一个现代的、快速的、高效的、强大的和多产的终端应用程序。它结合了许多命令行工具和 Shell,如命令提示符、PowerShell 和 WSL(Linux 的 Windows 子系统)。因此,在一个应用程序中,我们可以为 Windows 用户提供命令提示符和 Powershell,为 Linux 终端高级用户提供 bash。
PowerShell 和 Ubuntu 并肩运行
Windows 终端的主要功能包括多个选项卡,其中有不同的命令行工具,分割区域,Unicode 和 UTF-8 字符支持,GPU 加速的文本渲染引擎,以及在主题和配置选项之间切换的简单方法。Windows 终端是一个开源项目,它将利用不断增长的贡献者社区继续扩展其功能。
装置
安装再简单不过了;只需前往微软商店并安装应用程序。Windows 终端也将继续通过商店接收自动更新;因此,您将始终拥有最新的稳定版本。
关键特征
新的 Windows 终端不会取代 PowerShell 或命令提示符。它们都在那里,您可以将它用作单独的控制台。但是它将它们结合在一个新的简洁的界面中。您还可以运行其他终端,就像我们将看到的那样,因此,让我们来看看主要功能。
- **多标签:**终端最需要的特性是多种标签支持。使用新的 Windows 终端,您可以运行自己选择的不同命令行工具或应用程序(例如,命令提示符、PowerShell、WSL 上的 Ubuntu、通过 SSH 的 Raspberry Pi 等)。)
多标签支持
- **活力文字:**新的 Windows 终端使用了 GPU 加速的文字渲染引擎。你可以在那里展示任何你想要的东西,无论是图标还是表情符号。由于一种叫做卡斯卡迪亚码的新字体,CJK 表意文字和编程连字也成为可能。
卡斯卡迪亚码字符
- **可配置性:**新的 Windows 终端——本质上是一个大型 JSON 文档——的设置为您提供了对每个 shell 外观的大量控制。您可以为 PowerShell、命令提示符、Ubuntu 终端甚至 SSH 连接创建不同的配置文件,每个文件都有自己的字体样式和大小、颜色主题、背景模糊/透明级别等。要获得灵感,请前往 Windows 终端主题。
Windows 终端主题
bash on Windows 上的 Ubuntu
Bash on Ubuntu on Windows 微软在 //Build 2016 发布的巨大公告。自那时以来,我们走过了漫长的道路。WSL 2 现已正式发布,Windows 10 内部运行完整的 Linux 内核。
因此,作为一个例子,我们将定制在新的 Windows 终端中运行的 Ubuntu 终端。但是首先,如果您需要安装说明以及为什么要这样做,请阅读下面的文章:
[## 双重引导已死:Windows 和 Linux 现在合二为一了。
用 WSL 2 把你的 Windows 机器变成一个开发者工作站。
towardsdatascience.com](/dual-boot-is-dead-windows-and-linux-are-now-one-27555902a128)
有了这个设置和准备,很容易使它看起来像标准的 Ubuntu 终端。前往 Windows 终端主题并搜索 Ubuntu 主题。
当您按下Get theme
按钮时,一个配置对象被添加到您的剪贴板中。这个对象看起来像这样:
{
"name": "Ubuntu",
"black": "#2e3436",
"red": "#cc0000",
"green": "#4e9a06",
"yellow": "#c4a000",
"blue": "#3465a4",
"purple": "#75507b",
"cyan": "#06989a",
"white": "#d3d7cf",
"brightBlack": "#555753",
"brightRed": "#ef2929",
"brightGreen": "#8ae234",
"brightYellow": "#fce94f",
"brightBlue": "#729fcf",
"brightPurple": "#ad7fa8",
"brightCyan": "#34e2e2",
"brightWhite": "#eeeeec",
"background": "#300a24",
"foreground": "#eeeeec"
}
这些是关于每种颜色在您的终端中应该是什么样子的说明。现在,打开终端设置,将这个对象粘贴到一个名为schemes
的数组中。你会看到这个物体有一个名字:Ubuntu
。将该名称复制并粘贴到配置文件列表中指定 Ubuntu 终端的对象中。因此,该对象现在应该如下所示:
{
"guid": "{07b52e3e-de2c-5db4-bd2d-ba144ed6c273}",
"hidden": false,
"colorScheme": "Ubuntu",
"acrylicOpacity": 0.75,
"useAcrylic": true,
"name": "Ubuntu-20.04",
"source": "Windows.Terminal.Wsl"
}
作为额外的奖励,我已经相应地将acrylicOpacity
和useActylic
选项设置为0.75
和true
。这为窗口设置了一个很好的不透明度。此外,要在启动应用程序时将 Ubuntu 终端用作默认终端,请在设置的开头将guid
代码复制到defaultProfile
中:
"defaultProfile": "{07b52e3e-de2c-5db4-bd2d-ba144ed6c273}"
仅此而已。现在你有了运行在 Windows 10 内部的 Ubuntu,有了漂亮的终端应用,让你有家的感觉!
结论
在这个故事中,我们介绍了新的 Windows 终端,它是什么,如何获得它,它的主要功能是什么,以及如何让它遵循您自己的风格。你可以设置更多的选项:背景图片、按键绑定、自定义提示等。要摆弄这些选项和更多信息,请查阅官方文档,或者像这样的 GitHub 库。
学习率是我每周给那些对 AI 和 MLOps 世界好奇的人发的简讯。你会在每周五收到我关于最新人工智能新闻、研究、回购和书籍的更新和想法。在这里订阅!
关于作者
我的名字叫迪米特里斯·波罗普洛斯,我是一名为 BigDataStack 工作的机器学习研究员。我也是希腊比雷埃夫斯大学的博士生。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲中央银行、经合组织和宜家等主要客户设计和实施人工智能和软件解决方案。
如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据运算的帖子,请在 twitter 上关注我的媒体、 LinkedIn 或 @james2pl 。
COVID 数据中的新手冒险
图片来自 CDC 开源
给许多有兴趣探索或掌握数据科学的人的建议是,找到一些让你感兴趣的数据,看看你能学到什么。当新冠肺炎重创马萨诸塞州,该州开始公布数据供下载时,这似乎是一个很好的起点。虽然大部分工作也可以在 Excel 中完成,但我使用 Python 来处理,以考虑到可重复性和潜在的数据增长。
注意,对于那些读过我写的更多商业媒体文章的人来说,这篇文章有点“编码”。欢迎来到人工智能产品管理思维的极客部分:你的客户有一个问题需要回答,这可能需要一些代码。然而,由于这个例子不需要复杂的机器学习,所以很容易理解。
作为一名自学成才的程序员,我承认可能有更好的方法来完成这项工作,并使用更多的 Python 函数进行设计,但这个故事更多的是关于旅程,而不是编码专业知识。
马萨诸塞州在这里发布其 COVID 数据:https://www . mass . gov/info-details/新冠肺炎-更新-信息#每日更新-
如果您对您所在州的相同分析感兴趣,这可能允许下载半原始数据,我在最后提供了一些州的开放数据链接示例。您还可以从 CDC 或其他网站(如 COVID data tracker)获取数据。我发现关注和使用我所在州的数据让我更好地了解了如何做出最有可能影响我生活的决定。对我来说,有时候做工作是理解别人如何看待这个问题的最好方式。
注意:这需要一个简单的 Python 3 Anaconda 环境。
首先加载一个库:
import numpy as np
import pandas as pd
import zipfile
from zipfile import ZipFile
from download import download
import csv
from io import BytesIO
import requests
import os
import matplotlib.pyplot as plt
在马萨诸塞州,每天都有一个压缩数据集,文件名中包含日期。为了下载,我做了一个函数:
def get_zip(zip_file_url):
url = requests.get(zip_file_url)
zipfile = ZipFile(BytesIO(url.content))
zip_names = zipfile.namelist()
if len(zip_names) == 1:
file_name = zip_names.pop()
extracted_file = zipfile.open(file_name)
return extracted_file
return [zipfile.open(file_name) for file_name in zip_names]
我发现随着时间的推移,命名约定会发生一些变化,因为数据格式从五月更新到六月,所以我分解了链接的组件,这样就可以很容易地只更改每次运行的日期。
June_Date_Name = “june-7–2020"Website_name = [https://www.mass.gov/doc/covid-19-raw-data-](https://www.mass.gov/doc/covid-19-raw-data-)Download_String = “/download”
june_zip_file_url = Website_name + June_Date_Name + Download_String
所以接下来需要做的就是运行这个函数:
get_zip(june_zip_file_url)
如果这是一次生产运行,我会将数据缓存或加载到云中,但是当我在探索时,文件格式和 zip 文件结构每月都有变化,我会将文件下载并解压缩到磁盘。
file_path = (“Extracts-June”)path = download(june_zip_file_url, file_path, kind=”zip”,replace=True,verbose=True)
作为一个新手,我确信有一个更好的方法来获得所有的区别。csv 文件转换成数据帧,但是对于这项工作,我只是将它们列出来(并不是所有文件都用于启动)。进一步的改进只会把所有的。csv 文件并忽略。xlsx 文件及其包含的计算和所需数据的过滤器,但如果您正在关注一个问题,该问题是主要的。
June_County_data = pd.read_csv(June_Directory + “/County.csv”)
June_Age = pd.read_csv(June_Directory + “/Age.csv”)
June_Age_means = pd.read_csv(June_Directory +”/Age Means.csv”)
June_Cases = pd.read_csv(June_Directory + “/Cases.csv”)
June_DateofDeath = pd.read_csv(June_Directory +”/DateofDeath.csv”)
June_Admissions = pd.read_csv(June_Directory +”/Hospitalization from Hospitals.csv”)
June_LTC_Facilities = pd.read_csv(June_Directory +”/LTC Facilities.csv”)
June_Race_Ethnicity = pd.read_csv(June_Directory +”/RaceEthnicity.csv”)
June_Sex = pd.read_csv(June_Directory + “/Sex.csv”)
June_Testing = pd.read_csv(June_Directory + “/TestingByDate.csv”)
由于我的兴趣,首先,主要是重新打开和测试的效果,我从 5 月开始关注(同样,更好的代码将通过日期而不是文件位置来指定数据,但这是关于冒险的。)
June_Testing_Format = June_Testing[[“Date”,”Molecular New”,”Molecular Positive New”,
“Serology New”, “Serology Positive New”]]
May_on_Testing_Data = June_Testing_Format.iloc[100:] # Start on May 1
当我开始研究分子检测数据(检测你是否感染了病毒)时,马萨诸塞州州长提出了一个目标,即每天进行 45,000 次检测,目标阳性率为 5%。
当我在五月底运行代码时,这是图表:测试趋势上升…
5 月份,测试开始下降。
现在,在六月的第一周,每天的测试仍然在下降,但是在重新开放的第二阶段之前,阳性率似乎降到了 5%以下。我玩了 7 天均线,但是平的趋势线看起来更好。
May_on_Testing_Data[‘Days’] = np.arange(len(May_on_Testing_Data))
x = May_on_Testing_Data[“Days”]
y = May_on_Testing_Data[“Molecular New”]plt.plot(x, y, ‘o’)
m, b = np.polyfit(x, y, 1)
plt.plot(x, m*x + b)
plt.title(“New Molecular Tests per Day for COVID-19 in Massachusetts from 05–01 to 06–09”)
plt.axhline(y= 20000, xmin=0, xmax=1, color=”g”)
plt.xlabel (‘Days’)
plt.show()
6 月,该州增加了抗体血清学检测。在马萨诸塞州,你可以要求你的医生推荐这项测试或者直接报名。保险范围是可变的。我很好奇,想知道抗体测试进行得如何,测试水平有多高,以及即使考虑到 CDC 抗体测试的不确定性和测试提供商的警告,抗体呈阳性的趋势是否存在。请参见下面 Quest Diagnostics(马萨诸塞州领先的 COVID 测试公司)的示例。注意:普通感冒是一种冠状病毒。
到目前为止,似乎没有很多抗体测试。无论这是由于直接支付的费用(119 美元),还是由于人们不被鼓励进行检测,还是由于新闻中关于假阳性的消息。
在波士顿,马萨诸塞州总医院的最新研究显示,在 750 名居民的代表性样本中,抗体阳性率为 9.9%。
从 5 月至今的总体血清学阳性率来看(自 5 月 1 日以来进行了 41,228 次检测,约占人口的 0.06%),有些日子的峰值约为 10%,但由于样本可能包含很高比例的知道自己感染了病毒的人,因此得出人口中抗体水平正在上升的结论似乎还为时过早。
随着黑人的命也是命的抗议和媒体对可变存活率的关注,我开始想知道马萨诸塞州的数据是什么样的,所以我从种族/民族数据中提取了最后一部分数据,绘制了种族/民族的死亡百分比,并查看了这些数据。
Race_Data = June_Race_Ethnicity[-6:]Race_Data_Total = Race_Data[‘Deaths’].sum()
Race_Data [‘Death Percents’] = Race_Data [‘Deaths’] / Race_Data_Total
Race_Data [‘Death Percents’]= round(Race_Data [‘Death Percents’], 3)
Race_Data.head(10)
我真正需要了解的是,这是否代表了人群中的爆发。我能找到的最新数据是 2017 年的。认识到误差幅度,看起来黑人实际上比白人做得更好。
Race_Census_Data = {‘Race/Ethnicity’: [‘Non-Hispanic White’, ‘Non-Hispanic Black/African America’,
“Hispanic”, “Non-Hispanic Asian”, “Non-Hispanic Other”, “Other”],
‘Census Percents’: [.714,.089,.123,.071,0,.031]
}Race_Census = pd.DataFrame (Race_Census_Data, columns = [‘Race/Ethnicity’,
‘Census Percents’])
根据新闻,我对此感到惊讶,并四处查看这是否是一种异常现象。果然,凯泽家庭基金会也采取了同样的观点,认为马萨诸塞州的病例与人口统计数据相当,黑人的死亡率略低于人口分布的预期。
Covid 立即行动的人口统计数据页面中的图片
所有这些让我再次对测试感到好奇。设定一个日期,看看我是否会加入血清学阳性,如果不会,至少增加另一个数据点。然后可能会回到线性回归之外的东西,使用 Tensorflow,在云和 GPU 中运行,以及所有这些复杂性。甚至可能测试 COVID ACT NOW API 。
你将带着数据走向何方?你会确定一个模型,说我们中有足够多的人已经暴露,它是安全的兴高采烈地去海滩吗?你会更好地理解你的本地数据,并做出自己的“哇,这是趋势上升/下降决策/ 超过 5% 积极决策”吗?
你会将你的阳性结果趋势与国家出版物和其他外部分析进行比较吗?当范围从 4%到 10%时,您会质疑加权/平滑措施吗?
你会四处搜寻什么血清学测试看起来最有效的数据吗?
你会绕过所有的数据工作,直接注册警报或监控网站让你知道你住的地方什么时候有危险吗?
或者你会在秸秆市场上购买最好的芜菁价格(我对内幕和期货交易的基本了解的推荐)?
冒险是你的追求!
系列中的下一个:https://medium.com/me/stats/post/a54e5f51e1fa
样本数据链接:(注意:有些州不提供数据可视化)。
加州:https://www . cdph . ca . gov/Programs/CID/DCDC/Pages/Immunization/ncov 2019 . aspx
科罗拉多州:【https://data-cdphe.opendata.arcgis.com/search?tags=covid19】T2
康涅狄格州:【https://data.ct.gov/browse?】T4 类别=健康+和+人类+服务
明尼苏达州:https://mn.gov/covid19/data/index.jsp
纽约州:https://www1 . NYC . gov/site/doh/covid/新冠肺炎-data . page #下载
华盛顿州https://www.doh.wa.gov/Emergencies/Coronavirus
美国疾病控制中心:https://www.cdc.gov/nchs/covid19/index.htm
covid Act Nowhttps://covidactnow.org/?s=44750(还提供了一个状态数据源列表和一个API用于它们的数据)
COVID 数据中的新手冒险——将 API 用于聚合数据,将 Plotly 用于图表
来自 COVID ACT NOW APIs 的标准化数据允许对各州的每日阳性率进行比较
图片由 Alison Doucette 提供
在《COVID 数据历险记》的第一集中,我们开始探索使用 Python 基础知识(类似于 Excel 的函数)来查看新冠肺炎数据和马萨诸塞州的趋势。本周的挑战是利用由 COVID ACT NOW 发布的 API 来探索所有给定了标准化数据集的州,并利用 Plotly 进行可视化。
如果你想继续学习,你可以在这里找到 COVID ACT NOW API 的文档。GitHub 存储库非常有用,因为它展示了如何调用 API 以及如何提取数据。虽然有可能提取。CSV 文件(在我们的第一次冒险中,我们从一个. zip 文件导入)这次我要求 JSON 作为格式。
对于那些对 PLOTLY 感兴趣的人,这里有一个到文档的链接。虽然有很多复杂的图表可用,但我只是复制了我用 Matplotlib 做的简单图表。
首先是一些图书馆。(由于这是在 Anaconda 中使用 Juypter 笔记本,在开始之前,我按照这里的说明在终端中进行了 conda 安装。
import numpy as np
import pandas as pd
import requests
from pandas import DataFrame
import matplotlib.pyplot as plt
import plotly.graph_objects as go
import plotly.express as px
因为我知道我将为美国的不同州调用 API,所以我决定在组件中构建 URL,前缀是州代码(例如:MA 或 TX)作为一个单独的变量,后缀包括对 trends 和 JSON 格式的“时间系列”数据的请求。这将允许我在将来的某个时候比较不同的状态。
**注意:从 7 月 5 日起,API 的输出不再与记录的 JSON 相匹配,所以这段代码不再起作用。根据 GIThub 链接:“**从 6/5 开始,cumulativePositiveTests
和cumulativeNegativeTests
从timeseries
行中移除。该数据在actualsTimeseries
字段中仍然可用。
URL_prefix = “[https://data.covidactnow.org/latest/us/states/](https://data.covidactnow.org/latest/us/states/)"state_code = “MA”URL_suffix = “.OBSERVED_INTERVENTION.timeseries.json”Call_URL = URL_prefix + state_code + URL_suffix
然后是时候用请求调用 API,请求数据并打印出状态代码。
response = requests.get(Call_URL)
data = response.json()
print(“Status Code”,response.status_code)
一旦我有了数据,我们的目标就是为每日检测率以及 COVID 检测的阳性率绘制趋势图。API 的伟大之处在于每个州的数据格式都是标准化的。缺点是 API 不包含抗体测试的数据。
正如本周《纽约时报》指出的那样,缺乏抗体并不一定意味着你从未被感染,或者你缺乏免疫力,拥有抗体也不一定意味着它们不会随着时间的推移而消失,但观察这些数据很有趣。
一旦接收到数据,我只需要将数据划分到我想要的列中,包括包含阴性测试的第一行作为开始日期,并排除尚未进行测试的日期。
*COVID_Series = (data[“timeseries”])
COVID_Run_Date = (data[“lastUpdatedDate”])
COVID_df = DataFrame(COVID_Series,columns=[‘date’,”cumulativePositiveTests”, “cumulativeNegativeTests”])
Start_Row = COVID_df[‘cumulativeNegativeTests’].notna().idxmax()
End_Row = COVID_df[‘cumulativeNegativeTests’].notna()[::-1].idxmax()
COVID_df = COVID_df.iloc[Start_Row:End_Row]*
然后,我需要确定每天的新测试,并计算每天的阳性率。
*COVID_df[‘date’] = pd.to_datetime(COVID_df[‘date’], format=’%Y-%m-%d’)
COVID_df['State'] = state_code
COVID_df[‘Dly_PosTests’] = COVID_df[‘cumulativePositiveTests’].diff()
COVID_df[‘Dly_NegTests’] = COVID_df[‘cumulativeNegativeTests’].diff()
COVID_df[‘Dly_Tests’] = COVID_df[‘Dly_PosTests’] + COVID_df[‘Dly_NegTests’]
COVID_df[‘Dly_Pos_Rate’] = (100* (COVID_df[‘Dly_PosTests’] / COVID_df[‘Dly_Tests’]))*
这给了我一组数据来绘制图表:
我对阳性测试结果的增长很感兴趣。
*fig = px.line(COVID_df, x=”date”, y=”cumulativePositiveTests”)
fig.update_layout(
title=”Cumulative Positive Tests to Date”,title_x=0.5,
xaxis_title=”Month”,
yaxis_title=”Positive Tests”,
font=dict(
family=”Courier New, monospace”,
size=12,
color=”#7f7f7f”
)
)
fig.show()*
考虑到数据隐私问题,如果可能对第一反应者进行重复检测,则不可能绘制出已检测人群的百分比,但可以绘制出每日阳性率。
每天的测试总数可以给你一个关于测试模式的想法。
最后,我们可以看看用天数代替时间后的一些趋势:
*COVID_df[‘Days’] = np.arange(len(COVID_df))fig = px.scatter(COVID_df, x=”Days”, y=”Dly_Tests”, trendline=”ols”)
fig.update_layout(
title=”Total Tests per Day Trend”,title_x=0.5,
xaxis_title=”Days of Completed Testing”,
yaxis_title=”Tests per Day”,
font=dict(
family=”Courier New, monospace”,
size=12,
color=”#7f7f7f”
)
)
fig.show()*
**
利用 COVID ACT NOW APIs 提供美国各州的标准化数据。也就是说,数据有点混乱,需要更多的清理,因为数据输入错误可能会导致一些扭曲的值:(下面第 4 行是佛罗里达州的数据)。
结果图如下:
而不是更可能匹配真实情况的东西:(从第 14 行开始)并使用 LOWESS 趋势:
**
在这次冒险中,我们坚持一次只为一个州调用 COVID ACT NOW APIs,但是我们可以为所有的州调用它们,并开始比较各个州。我们可以使用移动平均线来平滑给定的周模式数据。我们可以建立一个用户界面,使整个过程更加用户友好。谁知道我们会去哪里?
当你和云雀一起起床时,你的每一天都是以冒险开始的!
图片由 Alison Doucette 提供
Python-igraph 新手指南
python-igraph 常用函数的简单指南,包含示例和代码
目前,随着不同模块的出现,处理图形/网络数据变得更加容易。对于 python 来说,其中两个这样的模块是 networkx 和 igraph 。我使用 python-igraph 模块已经有一段时间了,我发现它在我的研究中非常有用。我在我最新发布的工具 GraphBin 中使用了 python-graph。在本文中,我将向您介绍 python-igraph 的一些基本功能,这些功能只需一个调用就可以使实现变得更加容易。
你可以阅读我的前一篇文章用 python-igraph 可视化图形数据,在那里我介绍了 Python-igraph 模块。
使用 CiteSeer 数据集介绍 python-igraph 模块
towardsdatascience.com](/visualising-graph-data-with-python-igraph-b3cc81a495cf)
在本文中,我们将介绍执行以下任务的函数。
- 创建图表
- 将图表可视化
- 获得关于图的顶点和边的信息
- 获取顶点的相邻顶点
- 从顶点开始的广度优先搜索(BFS)
- 从顶点确定最短路径
- 获得图的拉普拉斯矩阵
- 确定源顶点和目标顶点之间的最大流量
1.创建图表
图一。示例图表
让我们从绘制如图 1 所示的示例图开始。
这是一个包含 5 个顶点的有向图。我们可以创建如下的图表。
# Create a directed graph
g = Graph(directed=True)# Add 5 vertices
g.add_vertices(5)
顶点将被标记为从 0 到 4 和 7 个加权边(0,2)、(0,1)、(0,3)、(1,2)、(1,3)、(2,4)和(3,4)。
# Add ids and labels to vertices
for i in range(len(g.vs)):
g.vs[i]["id"]= i
g.vs[i]["label"]= str(i)# Add edges
g.add_edges([(0,2),(0,1),(0,3),(1,2),(1,3),(2,4),(3,4)])# Add weights and edge labels
weights = [8,6,3,5,6,4,9]
g.es['weight'] = weights
g.es['label'] = weights
2.将图表可视化
现在我们已经创建了我们的图表,让我们使用 igraph 的绘图功能来可视化它。
visual_style = {}out_name = "graph.png"# Set bbox and margin
visual_style["bbox"] = (400,400)
visual_style["margin"] = 27# Set vertex colours
visual_style["vertex_color"] = 'white'# Set vertex size
visual_style["vertex_size"] = 45# Set vertex lable size
visual_style["vertex_label_size"] = 22# Don't curve the edges
visual_style["edge_curved"] = False# Set the layout
my_layout = g.layout_lgl()
visual_style["layout"] = my_layout# Plot the graph
plot(g, out_name, **visual_style)
图二。彩色图形
运行这段代码将得到如图 1 所示的图形。如果你想的话,你可以给顶点上色,如图 2 所示,通过添加g.vs[“color”] = ["red", "green", "blue", "yellow", "orange"]
代替线visual_style[“vertex_color”] = ‘white’
。你可以从我以前的文章用 Python-igraph 可视化图形数据中读到更多关于可视化图形和分析它们的内容。
3.获取图的顶点和边的信息
通过调用vcount()
、ecount()
、is_directed()
、maxdegree()
、get_adjacency()
函数,可以获得图的一些基本信息,如顶点数、边数、图是否有向、最大度、图的邻接矩阵等。
print("Number of vertices in the graph:", g.vcount())
print("Number of edges in the graph", g.ecount())
print("Is the graph directed:", g.is_directed())
print("Maximum degree in the graph:", g.maxdegree())
print("Adjacency matrix:\n", g.get_adjacency())
输出如下所示。
Number of vertices in the graph: 5
Number of edges in the graph 7
Is the graph directed: True
Maximum degree in the graph: 3
Adjacency matrix:
[[0, 1, 1, 1, 0]
[0, 0, 1, 1, 0]
[0, 0, 0, 0, 1]
[0, 0, 0, 0, 1]
[0, 0, 0, 0, 0]]
4.获取顶点的相邻顶点
您可以使用函数neighbors(vid, mode=ALL)
获得给定顶点的相邻顶点。如果我们考虑顶点 0,相邻的顶点或邻居将是顶点 1、2 和 3。
print(g.neighbors(0, mode=ALL))
5.从顶点开始的广度优先搜索(BFS)
从顶点开始执行广度优先搜索,可以使用函数bfs(vid, mode=OUT)
。
print(g.bfs(0)[0])
返回的顶点 id 将是[0, 1, 2, 3, 4]
。
6.从顶点确定最短路径
您可以使用函数get_shortest_paths(vid)
获得从给定顶点开始的最短路径。你想指定目标顶点为get_shortest_paths(vid, to=destination)
。
print(g.get_shortest_paths(0))
上面的线将导致从顶点 0 开始到所有顶点的所有最短路径,这将是[[0], [0, 1], [0, 2], [0, 3], [0, 2, 4]]
。
print(g.get_shortest_paths(0, to=4))
上面这条线将返回从顶点 0 到顶点 4 的最短路径,即[[0, 2, 4]]
。
7.获得图的拉普拉斯矩阵
您可以使用laplacian()
函数获得图的拉普拉斯矩阵。
print("Laplacian matrix of a graph:\n",g.laplacian())
输出如下所示。
Laplacian matrix of a graph:
[[3, -1, -1, -1, 0], [0, 2, -1, -1, 0], [0, 0, 1, 0, -1], [0, 0, 0, 1, -1], [0, 0, 0, 0, 0]]
8.确定源顶点和目标顶点之间的最大流量和最小切割
让我们假设在我们的例子中源顶点是顶点 0,目标顶点是顶点 4。我们可以使用函数maxflow(source, target, weights)
确定源和目标之间的最大流量和最小切割(根据最大流量最小切割定理)。
maxflow = g.maxflow(0,4,weights)print(maxflow.value)
print(maxflow.flow)
print(maxflow.cut)
print(maxflow.partition)
图三。图中最大流量与对应于
流量的最小切割
上面的行将输出一个图形流对象,流的最大值为13
,每个顶点的流值为[4.0, 6.0, 3.0, 0.0, 6.0, 4.0, 9.0]
,边上的最小割 id 为[5, 6]
,顶点之间的划分为[[0, 1, 2, 3], [4]]
。
图 3 表示与最大流量和最小切割相关的值,切割用紫色标记。边上紫色的值是流量值。我们可以看到,顶点 0、1、2 和 3 在一个分割中,顶点 4 在另一个分割中,这两个分割由割形成。
你可以从我的文章 10 图算法直观解释中读到更多关于图算法的内容。
10 种基本图形算法的快速介绍,包括示例和可视化
medium.com](https://medium.com/@vijinimallawaarachchi/10-graph-algorithms-visually-explained-e57faa1336f3)
最后的想法
如果您遇到一个不知道如何使用的函数,您可以简单地打印它的 docstring,它将描述该函数的输入、输出以及它的作用。举个例子,
print(g.bfs.__doc__)
print(g.laplacian.__doc__)
print(g.maxflow.__doc__)
就个人而言,我发现 python-igraph 是我工作中非常有用的模块。您可以使用提供的函数轻松地表示图形和执行不同的分析任务。
我附上了 jupyter 笔记本,其中包含了我在本文中使用的所有示例和代码。请随意使用它,并希望您也能在工作中使用 igraph。
感谢您的阅读!
干杯!
参考
[1]https://igraph.org/python/doc/igraph-module.html的 Python-igraph 手册