TowardsDataScience 博客中文翻译 2020(九百零五)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

走向终结不公正:深度学习可以阻止警察暴行上升的 3 种方式

原文:https://towardsdatascience.com/towards-ending-injustice-3-ways-deep-learning-could-halt-the-rise-of-police-brutality-8e2887b2171d?source=collection_archive---------63-----------------------

深度学习可能会解开一个世纪以来的不公正、暴力和种族偏见。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

【S】顶了一下,掉在了地上!我也要拍了!”你心脏的每一块肌肉都紧张起来,你的头脑中涌出一股肾上腺素。遵从你自己模糊的——但又绝对自信的——生存本能, 你倒在地上 。一群警察包围着你,把你包围在一个无法逃脱的圈子里,手里拿着晃来晃去的手铐、手枪、泰瑟枪和棍棒。当你坐起来,双手被手铐铐住,试图自我恢复时,领头的副警长未经深思熟虑就把你推到铺着碎石的人行道上,并怒吼道:

“趴在地上别动!你在拒捕!”

你看着旁观者倾斜的、同情的眼睛,他们手里拿着耳机和相机,故意避开这个事件。最后,你认出了夹在芝加哥警察局警官背心上的一排警察身体摄像机,并让自己放心:“好了,冷静下来……有 客观的 权威的 无可辩驳的 证据表明,缺乏可能的原因和过度的暴力被录了下来。”当你淤青的脖子、胳膊肘和手腕像扭曲的布娃娃一样躺在人行道上时,你试图回忆起你的情况的起源和故事。你是一个 26 岁的黑人,沉浸在芝加哥市中心区的低收入地带,在下午 6:00 漫步回到你的公寓,直到一对警察冲向你,权威地喊道,“站住,不许动!必要的话我会开枪打*!”在过去的六年里,你在芝加哥的市中心地区艰难跋涉,你会听到同样的话在退化的小巷、隐藏的毒品交易热点和简陋的市中心公寓中回荡。不过,这次他们是冲着你来的。*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我告诉你这个的时候,不要惊慌——你已经被种族侧写了。 等一下*……*蜂拥而至的警察人体摄像机和附近的行人实时发布事件的片段应该足以解放你并谴责这些警察,对吗?不幸的是,成百上千起累积的、系统性的、出于种族动机的警察暴力事件被推入了执法调查的黑箱程序。换句话说,一个又一个的视频证据文件(证明提交审查)是由警察部门自己主观执行的,存在大量妨碍调查过程的交叉干扰偏见(例如,当地政治/党派关联、执法机构的自身利益以及主要视频调查人员的个人偏见)。

尽管我们可以争辩说客观的道德和伦理标准是存在的,即使是在像美国这样一个政治分层和两极分化的环境中,仍然有总是阻碍违反这些标准的人类偏见、条件和本性。然而,更重要的是,警察暴力受害者的人口统计常常留下创伤后的创伤,不管正义、盘问和执法调查是否完成。虽然警察部门已经国有化并部署了既得的人体摄像机,并为种族貌相和预防性过度暴力进行了培训,但还没有实时监控警察暴力事件的技术。此外,非常少的自动化或半自动工具与身体摄像机共存,这些工具可以客观地解析和识别相应音频记录上的情绪和偏见。

在过去十年中,移动规模、低内存深度卷积神经网络(DCNNs)和自然语言处理(NLP)实现的出现为从大数据分区中半监督和非监督提取视觉文本意义铺平了道路。换句话说,视觉算法(监督/半监督 CNN 模型)和语言识别/序列算法(RNNs 和 LSTM 网络)适用于包括实时音频-语音识别、人类活动识别以及从文本字符串中提取意图和情感的语义在内的任务,这使得研究人员能够在大型语言和视觉数据集内以很少的计算能力推导和分析客观和新颖的模式。尽管 NLP 和计算机视觉研究任务经常与计算生物学、生物医学诊断和一系列企业应用相关联,但深度学习尚未触及其中最大的怪物——【人类不公正】。根据 2017 年警察暴力报告,在任何给定或预选的一年,巴西有近 4224 人死于警察暴行,美国有 1147 人,德国有 11 人。各州之间甚至存在更多的种族和社会经济差异(你可以自己研究)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在美国,警察暴力事件已经成为缺乏一致的可能原因的种族指控事件,经常在未解决的过度暴力案件中达到高潮。尽管警方的人体摄像头属于内部调查人员的职权范围,但能够客观分析人体摄像头捕捉到的语音和视频数据的框架却少之又少。然而,实时深度学习语言和视觉模型的使用对于在给定事件 期间和之后监控警察暴行 可能是至关重要的。无论是使用深度前馈网络(DNNs)来理解和预测攻击性身体行为的发生,还是集成实时情绪分析算法来对暴力言论进行分类,深度学习(DL)都可以改变我们如何为警察暴力的全球危机带来正义。

1。)使用深度卷积递归架构来检测暴力行为

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

deepconvltm(Ordonez 和 Roggen,2016 年)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过检测学习辨别运动特征(Bertasius 等人,2018 年)

人类活动识别(HAR)架构的兴起为研究人员提供了一个多参数的镜头,通过使用加速度和惯性测量的输入变量来分类简单的视觉行为(例如,行走、跑步、开门等)。最终,卷积神经网络(CNN)能够在切片窗口中方便地分析和分解这些测量,以识别、概括和定位图像中的动作。CNN 在 HAR 问题上的应用通常利用开放数据集,如 Otago 练习程序,从加速度计数据中提取和采样特征。相应的运动数据被解释为具有非常高的空间和时间分辨率的多变量时间序列数据。诸如奥塔哥锻炼计划和其他开放访问的 HAR 数据集的数据集使用相对于时间的相对高分辨率的传感器数据,并且 CNN 几乎完全适合于分割该数据用于模式识别和识别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

学习识别以自我为中心的视频中的动作(Bek,2014)

虽然递归神经网络(RNNs)最近在 HAR 任务中获得了牵引力(由于其时间特性),但当通过其网络提取特征样本时,CNN 引入了更高程度的精度和局部性。CNN 实现了相对于发生时间(即动作或行为的发生时间)的平移不变性。换句话说,平移不变性使 CNN 能够精确定位行为类别(例如,行走、坐着、跑步等),而不管运动中的变化(平移)。你可以将不变性概念化旋转、平移或移动写在纸上的数字‘2’。无论旋转或改变位置,它作为数字“2”的身份将保持不变。类似地,通过平移不变的 CNN 处理的时间数据可以连续基于传感器数据跨时间分类和区分动作,而不管给定的动作是否在运动。最终,这种平移不变性机制使 CNN 能够以精确的逐帧速率有效地在时间上映射行为。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

谐波网络:深度平移和旋转等变(沃拉尔等人,2017 年)

在论文《 利用 3D 卷积神经网络对监控视频中的 3D 运动长方体进行人体动作识别 》中,Arunnehru 等人操纵了 KTH 视频数据集,涵盖了人体挥手、鼓掌、奔跑、拳击、行走、慢跑等六种动作。这些连续的动作由 25 个不同的人在四个不同的场景中进行注释、对应和执行,包括穿着不同服装和不同比例(即摄像机放大和视频比例)的室内和室外设置。与仅从空间维度计算特征图的 2D CNN 相比,3D 卷积神经网络可以通过将多个连续/连接的帧堆叠在一起来同时捕获空间和时间维度。通过利用时间分量,可以经由 3D CNN 对视频上的运动进行分类。然而,在等式的另一边,递归神经网络(RNN)仍然是从原始感觉-时间/序列数据中提取特征的关键角色:RNN 将保留在原始传感器数据集上,如 WISDM 储存库,该储存库提供包括慢跑、坐着、站着和行走(上楼和下楼)在内的活动,而不是用时间维度来查看视觉信息。对于纯粹基于传感器的数据,当使用三个轴上的加速度和角速度等变量时,RNNs 在精度和验证准确度方面都超过了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在是有趣的部分——将 3D CNNs 或 RNNs 应用于疑似警察暴行或扣押/搜查案件中的可疑行为分类。更具体地说,操纵 3D CNNs 和 rnn 的潜力,通过测量和可视化警察采取的姿势、加速度/角速度的突然跳动以及房屋中的一般运动来识别边缘攻击行为。可以设计和预训练组合的 CNN/RNN 模型架构来检测侵略性的执法行为。与检测可疑活动的人类活动识别项目类似,类似的算法可以部署在城市街道摄像头和警察身体摄像头上,以客观地识别相应警察的攻击行为。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.)实时语音识别和情感分析来检测言语攻击

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用于声音情感识别的独立于语言和分类器的特征分析研究(Noroozi 等人,2018 年)

虽然计算机视觉模型可能是最臭名昭著的深度学习驱动的算法,用于实时检测、特征采样和识别可疑和攻击性行为(在空间视觉层面上),但最近机器学习在人机交互(HCI)和 NLP 应用中的兴起已被证明在更微妙的维度上分析攻击性时至关重要——人类语言和语音。通常,大规模的 NLP 框架和架构(例如谷歌人工智能的 BERT 语言模型)已经适应人类文本的静态分类。换句话说,研究人员通常将这些语言模型用于监督/半监督,包括输入文本样本并等待处理后的输出。然而,用于声音和文本情感检测的实时、自主情感分析架构的应用在最近 1-2 年才刚刚起步。对于涉及种族貌相、违反扣押和搜查的可能原因以及对受害者的贬损性语言的高风险案件,基于实时语音的模型对于客观地分解官员的意图和升级为攻击行为可能至关重要。

最终,存在两种不同的方法来从原始语音数据中上下文地提取情绪和情感:1 .2)通过 CNN 声谱图特征提取和采样从原始音频波形中理解情感。)组合两个模型:将音频转录成文本的语音识别架构,随后是对结果文本执行分类的 RNN 情感分类算法。也许,最吸引人的声音情感分析方法是通过具有深度 CNN 架构的原始音频波形分析(第一种方法)。通过系统地捕获被称为 Mel 频率倒谱系数的独特声音特征,并将结果特征输入 CNN 模型,我们可以描绘和区分样本声音的广泛数据集之间的情感阈值。Tripathi 等人在论文“ 使用语音特征和转录的基于深度学习的情感识别系统 ”中探索了深度 CNN 从语音特征/转录中分解和识别情感的能力。该论文考虑了使用从原始音频数据集导出的语音转录+相应的语音特征(声谱图和 MFCC),这些都为深度神经网络创建了必要的特征熔炉。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

CNN 使用的音频和图像特征(Singh,2018)

任何 语音意图/情感识别任务中,Mel 频率倒谱系数(MFCCs)操作可能将最重要的特征样本输入到深度神经网络中。通过使用提取的 MFCC 特征,我们可以过滤掉失真的背景噪声,并定位音频记录中重要的特定声音特征。MFCCs 的功能是 Mel 标度,将纯音的感知频率/音高与其实际测量频率相关联。MFCC 由 39 个特征组成,小到足以“迫使”神经网络学习和区分语音音频信息中的特征。在相应的论文中,Tripathi 等人实现了深度 CNN,以跨他们的声音数据集在语义上映射高级和低级特征关系,从而准确地识别情绪。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用语音特征和转录的基于深度学习的情感识别系统(Tripathi 等人,2019 年)

为了从每个录音样本中精确提取完整的声音特征,必须从数据集中的每个样本中捕获声谱图(音频波形随时间变化的全频率特征轮廓)(USC 的交互式情感运动捕获)。该论文有效地采用最大图像宽度为 256 个窗口的结果谱图输入。他们将每个音频文件的持续时间固定/调整为 6 秒,覆盖了 75%的相关数据集。仅通过原始音频输入,他们的模型 4A 在基准 USC 数据集上达到了 73.6%的准确率。

此外,在 Bertero 等人的论文“用于交互式对话系统 的 实时语音情感和情感识别”中,建立了一个接口,以便实时区分诸如批评、防御/焦虑、敌意、孤独、爱和悲伤之类的情感。更重要的是,他们利用了单过滤器 CNN,使得该框架计算紧凑,能够执行实时推理。通过使用类似于 Tripathi 等人的更紧凑的 CNN 模型,可以对更细微的情绪进行实时推断。在警察暴行发生率上升的背景下,Tripathi 等人和 Bertero 等人都证明,原始音频输入提供了丰富的特征样本,这些特征样本可以区分低-高水平的情绪特征,这些特征在分析警官的声音情绪时可能是至关重要的。通过使用实时情绪识别系统,来自警察身体摄像机的音频可以通过情绪识别系统传送,并在警察辱骂时中继到总部。

3.用自然语言处理和拓扑学习固定法律判决

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于拓扑学习的法律判决预测(钟等。

最后,在法律领域打击警察暴行的斗争中,也许最大的游戏规则改变者之一正在我们说话的时候发展——NLP 和拓扑学习预测法庭判决和结果。在论文“”中,钟等人有效地采用了一种拓扑学习框架来理解法庭案件子任务之间的依赖关系,包括相关法律条文、案件事实等。最终,钟利用这些子任务之间的联系,根据案件的背景和参数,基本上生成了最终判决。通过使用事实编码器卷积神经网络(CNN),他们能够将输入文本(例如,案件事实、案件背景等)消化到查找层、卷积层和汇集层。在根据真实的法庭数据进行验证后,他们获得了以下混淆矩阵,范围从几个月的处罚到死刑/终身监禁。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于拓扑学习的法律判决预测(钟等,2018)

对于种族定性和警察暴行的法庭案件,尤其是在保守倾向的地区,拓扑学习可以被整合以发现更客观的法庭命令和结果。虽然许多法院法官遵守司法约束(即限制偏见和行使自己的权力),但人类的偏见在潜意识层面上泛滥成灾。拓扑学习框架理论上可以消除偏差,当训练伦理规范和准备数据集。

结论和伦理含义

随着以人为中心的视觉和文本深度学习框架的迅速崛起,猖獗的种族定性和警察暴力事件可以得到更公平的分析,就最客观的正义决策途径咨询执法部门和地区法院。无论是实施人类活动识别算法来识别攻击性的警察行为,分析言语虐待的实时语音识别,还是判断法庭结果的拓扑学习系统,深度学习都可能彻底改变我们如何简化实现正义的过程。尽管深度学习的集成呈现出初步的前景,但预处理数据中的偏差仍然存在,并且很可能继续存在。在深度学习和法律正义系统之间打结之前,算法必须经过伦理审查,否则我们最终会处于比开始更不公正的位置。

参考

用于多模式可穿戴活动识别的深度卷积和 LSTM 递归神经网络

通过检测学习辨别运动特征(Bertasius 等人,2018 年)

学习识别以自我为中心的视频中的动作(Bek,2014)

谐波网络:深度平移和旋转等变(沃拉尔等人,2017 年)

使用语音特征和转录的基于深度学习的情感识别系统(Tripathi 等人,2019 年)

基于拓扑学习的法律判决预测(钟等,2018)

面向可解释人工智能的特征空间探索🚀

原文:https://towardsdatascience.com/towards-explainable-ai-with-feature-space-exploration-628930baf8ef?source=collection_archive---------70-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

安迪·凯利在 Unsplash 上的照片

基于大量数据训练的神经网络导致了难以置信的技术飞跃,几乎影响了我们生活的每一个部分。

这些进步是有代价的——即数据模型的可解释性可解释性。与操作的复杂性相对应,为输入“选择”给定输出的标准变得相当神秘,导致一些人将神经网络称为“黑盒”方法。

深度神经网络工作得如此神奇,因为它们学习数据的有效表示,并且它们被有意地限制为捕捉数据中复杂的非线性模式。识别非线性模式的代价相当于失去视觉,只是为了获得更微妙的声音感知。在学习这些表示的过程中,神经网络的每一层中的特征在训练期间改变,并且随着不同的网络架构/数据集以不同的方式改变。这让我们想到了几个与深度学习相关的研究问题:

  1. 我们如何理解与这些变化相关的模型性能?
  2. 我们如何确定每层的最佳单元数量?
  3. 我们如何定量描述网络中的变化分布?

我们试图在最近的论文“训练期间的特征空间饱和”中回答这些问题,该论文现已在 arXiv 上发布。通过在训练期间将主成分分析(PCA)应用于每一层中学习到的表示,我们可以确定解释这种差异所需的层大小或维度数量,从而逼近内在维度。通过一种类似于信息瓶颈方法[1]、SVCCA [2]和彩票假设[3]的方法,我们试图通过训练来识别网络上的动态分布。

层特征空间的固有维度

为了回答需要多个维度来解释层特征差异的问题,我们看一下自动编码器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

派进去,派出来。自动编码器学习将数据压缩成特征向量,并且对于理解所学习的表示的动态是有用的。

自动编码器学习数据集的紧凑表示。它们对于识别神经网络压缩的限制以及整个模型训练中特征/表示的动态非常有用。

PCA 的输出是对应于数据相关性的各种方向(特征向量)和特征值。在这种情况下,我们的输入是在整个训练过程中根据图层表示计算的特征协方差矩阵。该矩阵捕获与特征独立性和相关性程度相关的一些动态。换句话说,某些神经元响应与层中的其他神经元一致或独立的程度。我们称这个投影为层特征空间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

阈值处理仅解释了最终全连接层的方差投影。

通过选择不同的阈值来投影特征(通过特征值的累积和计算),我们能够比较图像的重建,在这种情况下,是一片饼。我们把这个阈值称为 delta (δ ) ,它的范围是解释方差所需的方向的 0 到 100%。因此,对于 100%的增量,我们期望输入的近乎完美的重构——没有一个被排除。

在我们的实验中,超过 99%的阈值,特征在特征向量上的投影会留下几乎无法辨认的图像。大部分结构丢失,表明模型执行需要绝大多数特征子空间维度。这种方法允许我们比较由网络学习的特征空间,并且理解网络已经学习数据的最佳压缩的程度。

饱和度为模型训练提供了一个窗口

我们把解释层特征的方差所需的特征向量比例称为饱和度。每层具有介于 0 和 1 之间的饱和指数,指示层特征子空间的固有维度。这使我们能够在深度神经网络中比较各层的饱和度。此外,我们比较了 Alain】和 Ben gio【4】的探测分类器方法,显示了每层输出执行分类任务的相对能力。

我们观察到饱和度反映了推理过程是如何分布的。当饱和度较高时,图层的特征以复杂和非线性的方式变化,对应于探测分类器精度的相对较高的增益。接近最后一层时,层精度的边际增加会减少,大多数情况下饱和度也会减少。因此,饱和度是最佳网络深度的指标,因为冗余层会以模式使饱和度向零收敛,如本文所述。

输入分辨力

输入分辨率是神经网络架构中需要平衡的三个方面之一(包括深度和宽度)[5]。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

与网络深度收益递减相关的饱和“尾巴”。探头性能仅在高饱和部分有所提高。饱和度的计算速度比探头精度快几个数量级。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

饱和度“驼峰”与层的重要性有关。高分辨率数据的分类需要更复杂、非线性的特征空间分离,因此需要更高的饱和度。

arXiv 文章中阅读更多相关内容,或者在 GitHub 上下载用于生成图的代码(delve Python 库)。

“训练期间特征空间饱和”,【https://arxiv.org/pdf/2006.08679.pdf

[## delve-团队/delve

Delve 是一个用于可视化深度学习模型训练的 Python 包。如果你需要一个轻量级的 PyTorch 或者…

github.com](https://github.com/delve-team/delve)

感谢合著者 Mats L. Richter ,Wolf Byttner, Anders Arpteg ,以及 Mikael Huss 。非常感谢卡尔·托姆梅阿格林·希尔姆基尔、拉斯穆斯·迪德里克森、理查德·锡格河亚历克西斯·德拉科普洛斯萨兰·N·苏布拉曼尼扬皮奥特·米格达乌尔夫·克鲁姆纳克在撰写本文期间提供的宝贵反馈。

如果您在研究中使用这项工作,请注明:

[@misc](http://twitter.com/misc){shenk2020feature,
  title={Feature Space Saturation during Training},
  author={Justin Shenk and Mats L. Richter and Wolf Byttner and Anders Arpteg and Mikael Huss},
  year={2020},
  eprint={2006.08679},
  archivePrefix={arXiv},
  primaryClass={cs.LG}
}

参考

[1]信息瓶颈法,https://en.wikipedia.org/wiki/Information_bottleneck_method

[2] SVCCA,https://medium . com/@ maddyschiappa/SVCCA-summary-e 83 a 53 f 7 DD 68

[3]彩票假说,https://towards data science . com/breaking-down-the-Lottery-Ticket-Hypothesis-ca 1c 053 B3 e 58

[4]概率分类器,“使用线性概率分类器理解中间层”,https://arxiv.org/abs/1610.01644

[5] EfficientNet,https://towards data science . com/efficient net-scaling-of-convolutionary-neural-networks-done-right-3 FDE 32 AEF 8 ff

面向可解释的图形神经网络

原文:https://towardsdatascience.com/towards-explainable-graph-neural-networks-45f5e3912dd0?source=collection_archive---------17-----------------------

GNN 解释方法的新进展

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

拉斐尔·比斯卡尔迪在 Unsplash 上拍摄的照片

目录

  • 什么是图卷积网络
  • GNNs 可解释性的当前挑战
  • 第一次尝试:可视化节点激活
  • 重用卷积神经网络的方法
  • 模型不可知的方法:GNNExplainer
  • 关于我
  • 参考

这是一个稍微高级一点的教程,假设有图形神经网络的基础知识和一点计算化学。如果你想为这篇文章做准备,我在下面列出了一些有用的文章:

什么是图形神经网络

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图一。图像卷积和图形卷积。【来源】

卷积神经网络(CNN)和图神经网络(GNNs)的主要区别是什么?

简单来说就是输入数据。

您可能还记得,CNN 所需的输入是一个固定大小的向量或矩阵。然而,某些类型的数据自然是用图表来表示的;分子、引用网络或社交媒体连接网络可以表示为图形数据。在过去,当 GNNs 不流行时,图形数据通常以这样一种方式转换,即它可以作为输入直接提供给 CNN。例如,分子结构仍然被转换成固定大小的指纹,其中每一位指示某一分子亚结构是否存在[1]。这是一个将分子数据插入 CNN 的好方法,但是它不会导致信息丢失吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图二。通过从 NH 原子对中选取不同的分子亚结构将分子映射到位指纹,这些亚结构由不同的半径范围(h=0,h=1,…)定义。 [来源]

GNNs 利用图形数据,摆脱了数据预处理步骤,充分利用了数据中包含的信息。现在,有许多不同的 GNN 架构,其背后的理论变得非常复杂。然而,GNNs 可以分为两类:空间和光谱方法。空间方法更直观,因为它将汇集和卷积操作(如在 CNN 中)重新定义到图形域。频谱方法从一个稍微不同的角度处理这个问题,因为它专注于使用傅立叶变换处理被定义为图形网络的信号。

如果你想了解更多,可以看看 Thomas Kipf 写的博客文章,这是对 GCNs 的深入介绍。另一篇有趣的文章是“MoleculeNet:分子机器学习的基准” [2],它很好地介绍了 GNNs,并描述了流行的 GNN 架构。

GNNs 可解释性的当前问题

在写作的时候,我一方面可以数出对 GNN 解释方法有贡献的论文。然而,这是一个非常重要的话题,最近变得越来越流行。

GNNs 比标准神经网络更晚流行。虽然在这个领域有很多有趣的研究,但它仍然不太成熟。GNNs 的库和工具仍处于“实验阶段”,我们现在真正需要的是让更多的人使用它来发现 bugs 错误,并转向生产就绪模型。

嗯,创建生产就绪模型的一种方法是更好地理解它们做出的预测。这可以用不同的解释方法来完成。我们已经看到了许多有趣的可解释方法应用于 CNN,如梯度属性,显著图,或类激活映射。那么为什么不在 gnn 中重用它们呢?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3。与神经网络和其他机器学习模型一起使用的流行解释方法及其属性【来源】

事实上,这就是目前正在发生的事情。最初用于 CNN 的可解释方法正在被重新设计并应用于 GNNs。虽然不再需要重新发明轮子,但我们仍然需要通过重新定义数学运算来调整这些方法,使它们适用于图形数据。这里的主要问题是,关于这一主题的研究相当新,第一份出版物出现在 2019 年。然而,随着时间的推移,它变得越来越流行,很少有有趣的解释方法可以用于 GNN 模型。

在这篇文章中,我们将看看新颖的图形解释方法,看看它们如何应用于 GNN 模型。

第一次尝试:可视化节点激活

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4。 左图: 具有 3 个堆叠层的神经图指纹模型的计算图的可视化,这是 Duvenaud 等人提出的架构,在这里,节点代表原子,边代表原子键。**右:**更详细的图,包括每个操作中使用的焊接信息【来源】

Duvenaud 等人在 2015 年发表了关于 GNNs 解释技术的开创性工作[3]。这篇论文的主要贡献是一个新颖的神经图指纹模型,但他们也为这种架构创建了一种解释方法。该模型背后的主要思想是创建可区分的指纹,这些指纹是直接从图形数据本身创建的。为了实现这一点,作者必须重新定义图形的池化和平滑操作。这些操作然后被用来创建一个单一的层。

这些层被堆叠 n 次以生成矢量输出,如图 4 所示(左图)。图层深度还对应于相邻结点的半径,结点要素是从这些半径收集和汇集的(在这种情况下为 sum 函数)。这是因为,对于每一层,池操作从相邻节点收集信息,类似于图 1。对于更深的层,池操作的传播从更远的邻域延伸到节点。与普通指纹相反,这种方法是可区分的,允许反向传播以类似于 CNN 的方式更新其权重。

除了 GNN 模型,他们还创建了一种简单的方法来可视化节点激活及其相邻节点。不幸的是,论文中没有很好地解释这一点,有必要看看它们的代码实现来理解底层机制。然而,他们在分子数据上运行它来预测溶解度,它突出了对溶解度预测具有高预测能力的分子的一部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 5。论文作者在溶解度数据集上测试了他们的模型,以突出影响溶解度的部分分子。通过他们的解释方法,他们能够确定使分子更易溶解的分子亚结构(例如 R-OH 基团)和使其更难溶解的分子亚结构(例如非极性重复环结构)。【来源】

具体是怎么运作的?为了计算节点激活,我们需要做以下计算。对于每个分子,让我们通过每一层向前传递数据,就像在典型的 CNN 网络中对图像所做的那样。然后,我们用一个 softmax() 函数提取每个层对每个指纹比特的贡献。然后,我们能够将一个节点(原子)与其周围对特定指纹位贡献最大的邻居(取决于层深度)相关联。

这种方法相对直接,但是没有很好的文档记录。在这篇论文中所做的最初工作是很有希望的,随后是将 CNN 解释方法转换到图形领域的更精细的尝试。

如果想了解更多,可以看看他们的论文代码库,或者我在本期 Github 底部的方法详解。

重用卷积神经网络的方法

敏感分析类激活映射激发反向传播是已经成功应用于 CNN 的解释技术的例子。目前致力于可解释的 GNNs 的工作试图将这种方法转换到图的领域。围绕这一领域的大部分工作已经在[4]和[5]中完成。

我将为您提供这些方法的直观解释,并简要讨论这些方法的结果,而不是集中在这些论文中已经完成的这些方法的数学解释上。

概括 CNN 的解释方法

为了重用 CNN 的解释方法,让我们考虑 CNN 的输入数据,它是一个图像,是一个格子状的图形。图 6 说明了这个想法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6。一幅图像可以概括为一个格子状的图形。红十字只显示了一小部分可以用图形表示的图像。每个像素可以被认为是节点 V ,其具有 3 个特征(RGB 值)并且通过边 E 连接到相邻像素。

如果我们记住图像的图形一般化,我们可以说 CNN 解释方法不太关注边缘(像素之间的连接),而是关注节点(像素值)。这里的问题是图数据在边中包含了很多有用的信息[4]。我们真正寻找的是一种概括 CNN 解释技术的方法,以允许节点之间的任意连接,而不是像格子一样的顺序。

有哪些方法转化到了图域?

到目前为止,文献中已经提出了以下解释方法:

  • 敏感性分析[4]
  • 导向反向传播[4]
  • 分层相关性传播[4]
  • 基于梯度的热图[5]
  • 类别激活图(CAM)〔5〕
  • 梯度加权类激活映射(Grad-CAM) [5]
  • 激发反向传播[5]

请注意,[4]和[5]的作者没有提供这些方法的开源实现,所以还不可能使用它们。

模型不可知的方法:GNNExplainer

代码库中的论文可以在这里找到

别担心,实际上有一个你可以使用的 GNN 解释工具!

GNNExplainer 是一个与模型无关的开源 GNNs 解释方法!它也是非常通用的,因为它可以应用于节点分类、图分类和边缘预测。这是第一次尝试创建一种特定于图形的解释方法,由斯坦福大学的研究人员发表[6]。

它是如何工作的?

作者声称,重用以前应用于 CNN 的解释方法是一种糟糕的方法,因为它们没有包含关系信息,而关系信息是图形数据的本质。此外,基于梯度的方法对于离散输入工作得不是特别好,这对于 GNNs 来说经常是这种情况(例如,邻接矩阵是二元矩阵)。

为了克服这些问题,他们创造了一种模型不可知的方法,找到了一个以最显著的方式影响 GNNs 预测的输入数据的子图。更具体地说,选择子图来最大化与模型预测的互信息。下图显示了 GNNExplainer 如何处理由体育活动组成的图表数据的示例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7。图表数据说明了不同的体育活动。目标是解释中心节点的预测,下一个体育活动。对于红色图形, Vi 被预测为篮球。GNNExplainer 能够选择一个子图来最大化预测的互信息。在这种情况下,它从图表中提取了一个有用的信息——当某人在过去玩球类游戏时,选择篮球作为下一项体育活动的可能性很高。【来源】

作者提出的一个非常重要的假设是 GNN 模型的公式。该模型的架构或多或少可以是任意的,但它需要实现 3 个关键计算:

  • 两个相邻节点之间的神经信息计算
  • 来自节点邻居的消息聚合
  • 聚合消息和节点表示的非线性转换

这些所需的计算多少有些限制,但是大多数现代 GNN 架构无论如何都是基于消息传递架构的[6]。

GNNExplainer 的数学定义和优化框架的描述就在本文中。但是,我不会告诉您(和我自己)太多的细节,而是向您展示一些使用 GNNExplainer 可以获得的有趣结果。

实践中的 GNNExplainer

为了比较结果,他们使用了 3 种不同的解释方法:gnnexplaner基于梯度的方法(GRAD)图形注意力模型(GAT) 。上一节提到了毕业生,但 GAT 模型需要一点解释。这是另一种 GNN 架构,它学习边的注意力权重,这将帮助我们确定图网络中的哪些边对于节点分类实际上是重要的[6]。这可以用作另一种解释技术,但是它只适用于这个特定的模型,并且它不解释节点特性,这与 GNNExplainer 相反。

让我们先来看看应用于合成数据集的解释方法的性能。图 8 显示了在两个不同数据集上运行的实验。

BA-Shapes 数据集基于bara basi-Albert*(BA)*graph,这是一种图形网络,我们可以通过改变它的一些参数来自由调整大小。在这个基础图上,我们将附加一些小的房屋结构图(图案),如图 8 所示。这个房屋结构有 3 个不同的节点标签:顶部、中间和底部。这些节点标签只是表示节点在房子中的位置。因此,对于一个类似房子的节点,我们有 1 个顶部节点、2 个中间节点和 2 个底部节点。还有一个额外的标签,表明该节点不属于类似房子的图形结构。总的来说,我们有 4 个标签和一个由 300 个节点和 80 个房子状结构组成的 BA 图,这些节点和结构被添加到 BA 图中的随机节点。我们还通过添加 0.1N 的随机边缘来增加一点随机性。

BA-Community 是两个 BA-Shapes 数据集的并集,因此总共有 8 个不同的标签(每个 BA-Shapes 数据集 4 个标签)和两倍多的节点。

让我们看看结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8。目标是为红色节点的预测提供一个解释。解释方法被设置为找到最准确地解释结果的 5 节点子图(标记为绿色)。【来源】

结果似乎很有希望。GNNExplainer 似乎用最准确的方式解释了结果,因为选择的子图与地面真相相同。Grad 和 Att 方法未能提供类似的解释。

该实验也在真实数据集上运行,如图 9 所示。这次的任务是对整个图网络进行分类,而不是对单个节点进行分类。

Mutag 是一个由分子组成的数据集,这些分子根据对某种细菌的诱变作用进行分类。数据集有许多不同的标签。它包含 4337 个分子图。

Reddit-Binary 是一个数据集,表示 Reddit 中的在线讨论线程。在这个图形网络中,用户被表示为节点,而边表示对另一个用户的评论的响应。根据用户交互的类型,有两种可能的标签。它可以是问答或在线讨论互动。总的来说,它包含了 2000 个图表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9。GNNExplainer 运行图表分类任务。对于 Mutag 数据集,颜色表示节点特征(原子)。对于 Reddit-Binary 来说,任务是对图形是否是在线讨论进行分类。【来源】

对于 Mutag 数据集,GNNExplainer 可正确识别已知具有致突变性的化学基团(如 NO2、NH2)。GNNExplainer 还解释了被归类为 Reddit-Binary 数据集在线讨论的井图。这种类型的交互通常可以用树状模式来表示(看看基本事实)。

关于我

我即将从南安普顿大学毕业,学习电子工程,是 IT 创新中心的研究助理。在我的业余时间,你可以发现我摆弄数据或者调试我的深度学习模型(我发誓这很有效!).我也喜欢徒步旅行:)

以下是我的社交媒体资料,如果你想了解我的最新文章:

参考

【1】重访分子哈希指纹https://chembioinfo . WordPress . com/2011/10/30/重访-分子哈希指纹/

【2】MoleculeNet:分子机器学习的基准https://arxiv.org/abs/1703.00564

【3】用于学习分子指纹的图上卷积网络https://arxiv.org/abs/1509.09292

代码库:https://github . com/HIPS/neural-fingerprint/blob/master/examples/visualization . py

【4】图卷积网络的可解释技术https://arxiv.org/pdf/1905.13686.pdf

【5】图卷积神经网络的可解释方法http://open access . the CVF . com/content _ CVPR _ 2019/papers/Pope _ explability _ Methods _ for _ Graph _ 卷积 _ 神经网络 _CVPR_2019_paper.pdf

【6】gnnexplaner:为图形神经网络生成解释https://cs . Stanford . edu/people/jure/pubs/gnnexplaner-neur IPS 19 . pdf

代码库:https://github.com/RexYing/gnn-model-explainer

走向机器学习——K 近邻(KNN)

原文:https://towardsdatascience.com/towards-machine-learning-k-nearest-neighbour-knn-7d5eaf53d36c?source=collection_archive---------29-----------------------

根据油耗和发动机大小对汽车进行简单的 K 近邻(KNN)分类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

纳亚尼·特谢拉在 Unsplash 上的照片

介绍

机器学习(ML)是当今一个非常流行的术语。我认为在网上过一天,不符合条件是不可能的。和我之前的许多人一样,我敢打赌,和我之后的许多人一样,不久前我在这个有趣的领域开始了我的旅程。

关于这个主题,有许多写得很好、很好的在线资源。我不是想发明新的轮子,我只是想分享我的观点,或者说我在学习密歇根大学的热门在线课程 Python 中的应用机器学习时的想法。另外,我的目标是强调 K 最近邻法(KNN)的一些关键见解,我希望对初学者(比如我)有所帮助😊)从这种流行的机器学习方法入手的时候。

为了让事情更有趣一点,我使用了来自 Udacity 的燃油经济性数据集。

简而言之,KNN

KNN 算法是一种监督最大似然算法,常用于分类和回归应用。KNN 分类器是基于实例(记忆)的分类器,这意味着它们依赖于类别(输入)之间的相似特征,以便预测新的(独立的)输入或数据点的类别。一般来说,我们需要一个训练数据集,在这里我们的模型被训练来预测,我们在一个独立的数据集上评估模型性能,以检查准确性。

KKN 到底是如何运作的?好吧,假设我们有一个需要分类的数据集(数组)。查看下图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:作者

然后,在位置(50,40)添加一个新的数据点(棕色)。我们检查距离该新点最近的 K 个点(“邻居”)。我们假设 K = 5。所以我们需要找到离新条目最近的 5 个点(棕色点)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:作者

如果选择 5,则根据欧几里德距离找到 5 个最近的点(浅紫色线),我们可以看到 5 个点中有 4 个是红色的,因此我们的棕色点被分类到“红色”角。

K=5 表示带有异常值的噪声模型和可能的错误标记数据(低 K=1 或 K=2)之间的平衡,或导致拟合不足的大 K,因此基本上,结果不太详细,或在最坏的情况下,所有东西都变成一个类。正确的 K 取决于数据集。大多数情况下,K 是一个奇数,以避免随机决策,如果一个点距离两个已知类的距离相等。

足够的理论让我们开始实践吧!😊

Python 实现

读取和检查数据

首先我们将导入依赖项,在这种情况下,我们需要 numpy、pandas、matplotlib 和 scikit-learn。

我们还需要一些数据。在这个例子中,使用了来自 Udacity 的流行的汽车燃油经济性数据集。这是一个包含 3929 辆汽车基本信息的数据集,比如品牌、型号、年份、变速器类型、车型、汽缸数量、油耗、二氧化碳排放量等。

在这里,我将举例说明如何使用 KNN 算法,根据气缸数量、排量、综合油耗和二氧化碳排放量,将未知车辆类别的汽车分类到适当的类别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们检查 VClass 列的唯一值,以获取数据集中的所有车辆类。我们有 5 节课。此外,我们创建了一个新列,其中包含用于绘图的类标签。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于我们的模型需要首先被训练,我们将把数据分成训练和测试数据(稍后用于评估)。为此,我们使用 scikit-learn 库中的 train_test_split 函数。

对于大型数据集(3929 个条目),我们不需要担心训练和/或测试规模。因此,函数的 test_size 参数为 None (=0.25),这意味着测试集包含 25%的数据。

检查数据总是好的做法。为此,使用了特征对图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

训练数据集的配对图

可以观察到一些有趣的模式。即随着气缸数量的增加,排量和 CO2 输出增加,而平均每加仑里程减少。此外,更大的燃料消耗会产生更多的二氧化碳。

观察数据的另一个好方法是 3D 绘图。这里,二氧化碳、气缸数和排量分别绘制在 x、y 和 z 轴上。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3D 图—二氧化碳与气缸和排量的关系

同样,我们可以观察到,气缸多、排量大的汽车往往会产生更多的二氧化碳。尽管如此,一些 4 缸或 6 缸的小型汽车也会产生大量的二氧化碳(可能是大功率输出的运动型汽车)。但总的来说,发动机越大,产生的二氧化碳就越多。

建立和测试模型

首先,我们需要选择 K 个最近邻的数量。如前所述,对于这个例子,选择 KNN= 5

然后对模型进行训练,显示精度。

模型的精度为 0.4933 。理论上看起来不太好。但是对于我测试过的两辆车,这个模型给出了很好的预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

福特嘉年华是“小型车”,宝马 M5 是“大型车”。

精度随 K 不同而变化吗?

在这里,我们将检查是否改变最近邻 K 的数量可以改变我们的模型的准确性。为此,我们编写了一个简单的 for 循环。此外,random_state 被改变,这导致不同的训练/测试分离组合。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

随机状态= 11

对于这个数据集和这个训练/测试分割,较大的 K 值导致较小的准确性。不同的训练/测试分割可能会产生不同的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

随机状态= 44

有趣的是观察到训练集#44 产生更大的最大和最小准确度。

不同的训练/测试比率会改变模型的准确性吗?

最后但并非最不重要的是,我们将检查是否改变列车测试分割率可以增加我们的模型的准确性。首先,我们生成可能训练/测试比率的列表 t。同样,K 设置为 5。然后创建一个循环,其中对于每个可能的 t 比率,运行 200 次模拟,并计算每个模拟的精度。然后计算每个比率 500 次运行的平均准确度,并绘制成散点图,以观察性能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

随机状态= 11

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

随机状态= 44

从图中可以看出,精度随着训练样本量的减少而降低。改变 random_state 在这里似乎没有影响,这是有意义的,因为我们对每个训练/测试比率运行 500 次模拟,然后计算平均精度。

结论

这里给出了一个 KNN 分类器在流行的汽车油耗数据集上的简短实现。首先,给出 KNN 方法的简要说明。然后,检查数据集以查看数据集中的一致性。然后,我们定义一个 KNN 分类器,K 设置为 5,这意味着一个新的数据点根据 5 个最近的邻居进行分类。

对于两个独立的测试示例,福特嘉年华和宝马 M5,分类工作良好。此外,模型会针对不同的 K 值进行评估,对于这个特定的数据集,K 值越小,模型越精确。将 random_state 更改为不同的值可以改变这种行为,但不会显著改变。

此外,增加训练规模与测试规模的比率,应该会产生更好的结果。这里,由于大量模拟,更改 random_state 值的影响较小。

走向机器学习——线性回归

原文:https://towardsdatascience.com/towards-machine-learning-linear-regression-and-polynomial-regression-df0c83c15b6e?source=collection_archive---------46-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

瑞安·斯通在 Unsplash 上的照片

最近,我在 Coursera 上开设了一门密歇根大学的应用机器学习课程。该课程涵盖了一些广泛流行的机器学习算法。我决定写几篇关于这个主题的简短文章,旨在帮助刚接触这个主题的人进入机器学习的有趣世界。我的上一篇文章讨论了 K 近邻(KNN)分类的主题。你可以看看如何使用 KNN 根据发动机大小、气缸数量、燃料消耗和二氧化碳排放量将汽车分类为车辆类别。今天我们更进一步,处理线性回归,另一个非常流行和广泛使用的技术。

文章的结构:

  • 介绍
  • 数据集加载和描述
  • 数据分析
  • 模型训练和评估
  • 奖励:多项式回归
  • 结论

享受阅读吧!🙂

介绍

在观察上一篇文章中的燃油经济性数据时,一些特性(如发动机排量和二氧化碳排放量)显示了一个有趣的模式。发动机排量的增加(“更大”的发动机)导致更高的 CO2 输出。让我们看看这个简单的数据散点图。有人会说数据显示了某种线性关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以观察到数据分布的一些线性(来源:作者)

根据排量来预测你的车会产生多少二氧化碳,这难道不是很有趣吗?因此,今天的文章将研究线性回归,以及如何使用 Python 和 Scikit-Learn 库将它应用于一组数据。

什么是线性回归,为什么这么受欢迎?

首先,这是一个非常简单的算法。它试图用一条直线(或线性方程)来描述两个变量之间的关系。如果我们再次查看上面的散点图,我们可以看到 CO2 是因变量,是解释变量的位移。在研究两个变量之间的关系之前,这种图通常被用作第一步。因此,该方法假设 Y (CO2)的每个值都可以描述为 X (位移)的线性函数,遵循以下简单等式:

Y=w*X + b

其中 w 为直线的斜率, by 轴截距。或者用机器学习的术语来说,更多时候 w 被简称为t*和 b 代表。*****

然而,必须考虑一些假设:

  1. 线性关系:x 和 y 之间必须存在线性关系。
  2. 独立性:时间序列数据中的连续残差之间没有相关性
  3. 同方差:每个 x 的残差的恒定方差
  4. 正态:残差呈正态分布

这些所谓的残差是什么?嗯,残差是观察值与拟合线的值(或偏差)。基本上就是蓝点离拟合线(绿线)的距离(红线)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

残差是从拟合线到观察值的距离(来源:作者)

最小二乘误差

到现在,你可能会问自己,我们是如何计算出 wb 参数的?嗯,我们需要计算函数的“损失”,也就是所有残差的总和。这里,最小二乘误差开始发挥作用。这是一种常见的方法,计算从观察点(图上的红圈)到拟合线(绿线)的平方差,并汇总所有这些平方距离。该方法的目标是找到产生最小可能距离平方和wb 。距离的平方和通常被称为“均方误差MSE

让我们跳到一个更实际的例子,关于我们的汽车油耗数据。🙂

数据集加载和描述

像往常一样,首先我们导入依赖项,加载数据并查看数据帧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据帧的切片(来源:作者)

同样,我们将使用来自 Udacity 的燃油经济性数据集。它包含了 3920 辆汽车的技术规格,包括气缸数、发动机尺寸(排量)、油耗、二氧化碳排放量等数据。我们只对发动机尺寸和二氧化碳排放量感兴趣。

数据分析

由于 2D 阵列的 Scikit-learn 要求,并且由于我们只有 1 个输入特征, ,我们选择并整形解释变量。(-1,1)整形使用的是。然后使用 Scikit-learn 的 train_test_split 函数将数据拆分为训练样本和测试样本。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

训练/测试分割(来源:作者)

模型训练和评估

下一步,我们准备我们的模型。因此,使用线性回归函数,并用训练数据拟合来训练模型。

我们可以通过调用来检查回归函数的 wb 参数。coef_** 和**。拦截 _** 属性。同样,通过调用计算 R 平方(决定系数)。分数,类似于 KNN 。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

模型的结果(来源:作者)

现在,让我们对训练数据进行线性回归。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

线性回归—训练数据(来源:作者)

在我们绘制测试数据的回归图之前,首先我们根据我们的模型计算预测的 Y 值,我们的操作如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

线性回归—测试数据(来源:作者)

正如我们从训练和测试数据中观察到的,我们的模型非常适合预测排量一般的汽车的二氧化碳排放量,这些汽车的发动机为 3-4 升。对于所谓的异常值,即与观察类的平均值有较大偏差的点,该模型表现出较弱的性能。即非常节能的汽车,如排放量非常低的混合动力汽车,或与之相反的功率输出非常高的汽车。此外,对于发动机非常小的汽车,该模型往往会大大高估二氧化碳的排放量。

奖励:多项式回归

简而言之,多项式回归是回归分析的一种形式,其中使用 n 阶多项式而不是线性模型来建模数据关系。这种方法增加了模型的复杂性,当解释变量和因变量之间存在更复杂的数据关系时,可以产生更好的结果。也就是说,在我们的案例中,乍一看,排量和 CO2 输出之间的关系似乎符合线性趋势,但是我们扪心自问,二次函数甚至更高阶函数是否能更好地捕捉这种关系?

让我们来了解一下!🙂

要使用 Scikit-Learn 应用多项式回归,我们将使用预处理模块中的 PolynomialFeatures 类。基本上,它生成多项式特征,然后用于最小二乘线性回归方法。当我们假设二次关系时,我们将多项式的次数设置为 2。

我们训练模型。

接下来,我们绘制结果,与之前描述的线性回归模型进行比较。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

多项式与线性回归(来源:作者)

应用二阶** (k=2) 多项式回归,一个二次函数,在我们的训练和测试数据集上产生略微更好的结果。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

多项式回归的结果(k=2)(来源:作者)

在最后一步,我们测试不同阶多项式的模型精度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

准确性与计算时间(来源:作者)

从上图可以看出,当 K 值进一步增加时,精度会有所提高,但计算时间会大幅增加!此外,由于非常高的模型复杂性和过拟合,将 k 增加到 13 以上会开始降低精度。

结论

本文给出了一个简单的线性回归例子。线性回归的主要优势之一是趋势描述,更稳定的预测,但在异常值或极值(最小值或最大值)的情况下往往不准确。多项式回归提高了性能,但是随着模型复杂性的增加,往往会过度拟合,并显著增加计算时间。

我希望每件事都被清楚地解释和介绍了。直到下一次,随时检查我的其他文章。🙂

** [## 走向机器学习——K 近邻(KNN)

根据油耗和发动机大小对汽车进行简单的 K 近邻(KNN)分类。

towardsdatascience.com](/towards-machine-learning-k-nearest-neighbour-knn-7d5eaf53d36c) [## 测量和计算普利特维采湖国家公园的河流流量

你想知道如何测量和计算溪流或河流的流量吗?

towardsdatascience.com](/measuring-and-calculating-streamflow-at-the-plitvice-lakes-national-park-678223318191)

欢迎每一个评论或建议!领英

请随时关注我在媒体上的故事。干杯!**

利用人工智能实现精确的火灾预测

原文:https://towardsdatascience.com/towards-more-accurate-fire-predictions-using-ai-ee6d5c26955c?source=collection_archive---------44-----------------------

卫星+人工智能=前所未见的信息

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

地图显示了美国西部植物相对于干生物量的水量。数字越低,植被越干燥,发生野火的风险越大,反之亦然。作者图片。

美国西部森林野火的风险正在增加。在过去的五十年里,大规模野火发生的频率和破坏的面积分别增加了四倍和六倍。野火带来的风险增加,促使科学家试图评估野火的风险,以帮助通知是否在灾难性的野火发生之前将人们转移到安全的地方。

为了克服这一挑战,我使用大量数据和深度学习来制作美国西部的动态森林干旱地图,这是有史以来第一次。这些地图可能最终导致野火风险评估的改进。

野火风险和森林干燥的作用

在野火风险评估中,森林干燥度——野火点燃和蔓延的重要预测指标——是使用气象指标(如先前的降水和温度)来估计的。研究人员将森林干燥度称为活燃料水分含量(LFMC ),因为它表明了树木和灌木等燃料相对于其干生物量的含水量。新鲜燃料的含水量越低,燃料越干燥,野火的风险就越大,反之亦然。

然而,气象指标并不总是代表真正的森林干旱。就像你阳台上的植物一样,不同的植物有独特的策略来应对干旱。一些可能能够通过关闭气孔(叶子上的孔)来保存水分,而另一些可能不能。一些植物可以通过长更深的根来获得更多的水分,而另一些则不能。然而,绘制什么物种生长在哪里以及它们如何对水分胁迫做出反应是很困难的。因此,火灾模型经常忽略这些影响。这可能会导致对森林干燥度的错误估计,最终在我们的野火风险评估中引入错误。我们怎样才能做得更好?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

美国林务局在 2016-2019 年间进行的森林干燥度测量。图片作者。

当我看到美国林务局在美国西部收集数千份森林干燥度测量数据时,我看到了一个机会。利用这些测量数据,我用神经网络直接估算了森林的干燥度。

从太空感知的森林干旱

虽然观察森林变褐和变绿很常见,但观察森林干燥(和潮湿)很有挑战性,因为我们看不到树里面的水。虽然存在一些模型来估计森林的干燥度,但它们无法缩放,因为它们需要知道植被的几何形状。因此,科学家们只能估计 5-17 种植物的森林干燥度。通过让神经网络使用各种遥感输入来计算树冠几何形状的影响,我能够通过验证 56 种不同的物种来绘制整个美国西部的森林干旱地图。

在交叉验证时,我发现我的景观尺度森林干燥度制图工作与其他较小尺度的分析一样准确。可用于模型训练的大量地面数据,结合基于领域知识对神经网络进行的修改,产生了这个结果(如下所述)。

物理辅助神经网络

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将森林干燥度(表示为“LFMC”)与输入变量联系起来的概念模型。图片作者。

由于森林干燥度是一个随时间变化的变量,它依赖于整个前一个季节(在这种情况下是 3 个月)的时间观察,我使用了一个基于长短期记忆(LSTM)模型的递归神经网络。这一决定是在初步结果表明仅从卫星观测的快照(及时)预测森林干旱导致非常差的时间可预测性之后做出的。

利用 Sentinel-1 卫星的微波后向散射和 Landsat-8 卫星的光学反射来训练 LSTM 模型。

我根据我们对将输入与森林干燥联系起来的物理过程的概念性理解,通过使用精心设计的输入,使模型成为物理辅助的。这是通过两种方式实现的:

  1. 通过使用微波和光学比率,这些比率是根据与卫星有关的机械模型的形式选择的。由于微波后向散射对植被水和光学反射对干生物量具有更高的敏感性,微波后向散射和光学反射的比率模拟了森林干燥的定义的结构。因此,我包括了偏振和光学反射率和指数的微波反向散射的比率。
  2. 通过选择辅助静态输入,提供关于土壤类型、植被结构和地形对遥感观测的影响的信息。

用于实现物理辅助递归神经网络的完整代码库可以在这里找到并且该算法的进一步细节包括在杂志环境遥感中的这个【开放存取出版物】中。

结论

现在有了动态的、完整的森林干燥度地图,我计划测试野火发生和规模对森林干燥度的敏感性。在这个过程中,我将量化这些森林干旱地图对野火风险预测的价值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用我的 LSTM 模型绘制的森林干燥度图。森林干燥度显示为树木含水量相对于其干生物量的百分比。从地图上看,与 2019 年相比,2020 年似乎会因为更干燥的燃料而导致火灾活动增加。图片作者。

使用我的 网络应用 探索你在美国西部当地社区的森林干旱动态。

这篇文章的修改版本最初出现在 AWS 公共部门博客中。

走向无代码分析:让每个人都成为数据科学家

原文:https://towardsdatascience.com/towards-no-code-analytics-making-everyone-a-data-scientist-f7693bd0abfd?source=collection_archive---------42-----------------------

Wix 让每个人都成为网站建设者,Canva 让每个人都成为设计师。现在,是时候让每个人都成为数据科学家了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

弗兰基·查马基在 Unsplash 上拍摄的照片

在互联网的早期,建立一个网站是 T4 的技术壮举。现在,像 Wordpress 这样的无代码工具使任何人都可以快速启动一个网站,与 1995 年的 31,000 个网页相比,今天已经有超过 50 亿个网页。

同样,今天的数据科学受到高技术准入门槛的损害,但将通过无代码分析工具实现民主化。数据科学家通过复杂工具的字母汤“将数据转化为见解”。

r,SAS,SQL,NoSQL,TF,D3.js,NLTK,RF,MATLAB,ML。我编了一个,没关系。

关键是,如果企业不理解数据科学,他们就无法利用数据科学,而且不是每个人都可以雇佣数据科学家团队——在美国,他们的工资超过六位数。

一项关于 500 名美国雇员如何使用数据的调查显示,企业没有从数据中获得他们需要的洞察力。例如,68%的营销人员需要更多的数据可视化功能,54%的会计师需要更多的预测分析功能来预测风险。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 GetApp 的统计数据。用制作的图形美观。AI

商业领袖对此能做些什么

无论你是管理一个营销团队还是经营一家咖啡馆,所有领导者都应该能够使用数据科学,而不需要成为“人工智能向导”或“代码忍者”。

这就是数据科学民主化的含义。像 Apteo 这样的无代码工具的目标是让每个人都成为数据科学家,让所有规模和技能水平的团队利用这项技术,从可视化到预测分析。

为了明确无代码分析可以应用于任何垂直领域,你可以看看一个罗宾汉数据追踪器,这个摇摆州追踪器,或者这个汤姆·布拉迪分析

民主化——不仅仅是一个时髦词

通过民主化的设计,Canva 成为了一家 60 亿美元的公司。

Wix 通过民主化网站建设,在纳斯达克获得了高达 126 亿美元的市值。

Shopify 使电子商务民主化,目前在纽约证券交易所的市值超过 1000 亿美元。

有人可能会说,谷歌——一家价值万亿美元的公司——通过让世界信息触手可及而使知识民主化,通过让你按点击付费而无需购买广告牌而使广告民主化,等等。

1998 年探索谷歌理念的开创性论文提出了这样的假设:

“迄今为止,大多数搜索引擎的开发都是在很少公布技术细节的公司进行的。这导致搜索引擎技术在很大程度上仍然是一门黑色艺术,并以广告为导向。

22 年后,谷歌每天回答数十亿次查询。谷歌让寻找信息变得容易。无代码分析使寻找见解变得容易。

甚至在 90 年代,我们就知道“最好的导航服务应该让在网上找到几乎任何东西变得容易。”同样,最好的数据科学服务应该让你很容易找到对数据的任何见解。

寻找洞见

忘记从令人困惑的自述文件中导入依赖项或在 Tableau 中编写 SQL,无代码工具使任何人都可以识别趋势、KPI 驱动因素并创建预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Apteo 的三步流程。

例如,假设你是一个 SaaS 的企业主,对降低“用户流失率”感兴趣那是你的 KPI。无代码工具允许您选择 KPI,或者您试图解决的问题,所有繁重的工作都在后台完成。

在 Apteo 的例子中,有助于分析 KPI 的属性是自动选择的,但是用户可以添加或删除属性。很快就会创建一个模型,让您根据插入的属性生成预测。

从亚马逊、沃尔玛、网飞和麦当劳到你

许多行业领先的公司将他们的成功归功于数据的力量,但他们也有资源雇佣大型数据科学团队。

例如,沃尔玛使用预测模型来预测特定时段的需求,这样他们就可以安排适当数量的员工,改善结账体验。

亚马逊的推荐功能为亚马逊的收入贡献了高达 35%的份额——上一财年几乎达到1000 亿美元

麦当劳以3 亿美元收购了数据公司 Dynamic Yield,以预测其各地的客户需求,减少浪费,并增加利润。

再举一个例子,你的网飞反馈是为你和你的个人兴趣定制的,通过预测模型输入数据,比如你喜欢的节目,你观看它们的日期和时间,你使用的设备,你是否暂停了节目(以及你是否在之后继续),等等。

通过使用无代码数据科学工具,您自己的企业可以利用从亚马逊到沃尔玛的行业领导者使用的强大技术。

走向激流科学:数据工程

原文:https://towardsdatascience.com/towards-torrent-science-data-engineering-d79e774886cb?source=collection_archive---------48-----------------------

激流科学

挖掘 BitTorrent 网络

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

艾莉娜·格鲁布尼亚克在 Unsplash 上的照片

最近,我在综艺节目上偶然发现了一篇名为“网飞如何利用盗版挑选节目”的旧文章。它讲述了网飞如何挖掘 BitTorrent 网络来确定哪些程序必须被选择用于其平台。最近的一篇文章(“Torrent 流量在欧洲、中东和非洲超过网飞”)强调,多年来 BitTorrent 流量已经逐渐下降,但其使用在欧洲、非洲和亚太地区仍然很突出。显然大量流媒体平台的兴起是 BitTorrent 流量复苏的原因(查看这篇文章)。顺便说一句,必须注意的是,VPN 的广泛使用使得识别流量的来源变得困难,因此必须有保留地分析这些统计数据。

有人为了社会的更大利益而分享他们的带宽,这种想法违背了“公地热”的理论,这是令人惊讶的。

BitTorrent 网络吸引我有两个主要原因。首先,从创新的角度来看,布拉姆·科恩功不可没。使用我刚刚熟悉的简单 CS 原则,在上传的同时下载和组装单个文件的想法很鼓舞人心。第二点是其运作的经济性。有人会为了社会的更大利益而分享他们的带宽,这种想法违背了公地悲剧的理论,这是令人惊讶的。

一言以蔽之的 BitTorrent

简单地说,它是一个对等共享协议,试图解决三个主要问题。首先,它提供了一种算法来将一个大文件分割成块,确定哪个对等体拥有哪个块,以及哪个块应该被发送到哪里,而不会产生很大的开销。第二,它试图解决一旦下载了文件,对等点就会频繁地从网络中流出的问题。最后,公平的问题,处理保持上传和下载率之间的相关性。

要使用 BitTorrent 网络,需要一个可以将对等点连接到网络的客户端。在网络上共享的每个文件都与包含客户端所需信息的种子文件相关联。共享完整文件的对等点称为种子,下载文件的对等点称为网络上的吸血鬼。为了网络的健康,种子设定者最好能长时间设定文件的种子。

该协议的更多技术细节超出了本文的范围。查看维基百科了解更多信息。

挖掘 BitTorrent 网络

BitTorrent 网络由与网络中的文件和网络中对等体的特征相关的数据组成。例如,网飞感兴趣的是确定哪些是它的消费者想要观看的受欢迎的节目。BitTorrent 是一个世界范围的网络,确定其同伴的地理位置有助于挖掘许多有趣的模式。比如一个国家的社会政治指标和观影习惯有什么关联?特定国家喜欢的音乐类型是什么?哪个国家的色情消费最高?

只有当我们有了一个从 BitTorrent 网络获取数据的框架时,这些问题和许多其他问题才能被探索。这是本文的重点。在这个系列、名为洪流科学的后续文章中,我将报告执行这一分析所采用的不同技术,并分享从这一调查中获得的结果。

数据工程

获取 BitTorrent 数据的过程分为两个部分。首先,抓取种子网站以找到流行的文件(大部分是盗版视频)以及与每个文件相关的对等点(种子和吸血鬼)的数量。许多流行的文件被多次上传,这就需要对文件名进行相似性匹配,并组合属于相同内容的信息。

其次,确定每个文件的对等体的地理位置。请注意,这些信息在 torrent 网站上并不容易获得。这需要对 BitTorrent 协议的工作原理有所了解。

整个过程必须定期重复,以收集时序数据。

让我们从第一部分开始。这需要抓取流行的种子网站,如海盗湾,1337x 等。本文仅关注 1337x.to。该网站定期更新按周和日分组的趋势种子列表,涵盖电视、电影、应用程序、游戏等类别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

种子网站快照:1337x.to

对于每个趋势部分,例如趋势纪录片,可以提取种子的名称。查看下面的快照。对于这些种子,我们需要提取种子和水蛭的数量,上传大小,时间等。以及播种者和吸血者的地理位置。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从 1337 年到 2010 年的趋势纪录片

这相当简单。每个网站都需要一个自定义代码。以下代码片段完成了 1337x.to 的工作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

代码片段— BeautifulSoup

欲了解更多关于使用美汤的信息,请查看本文。

以下是典型输出的示例。请注意,由于从多个来源上传相同的内容导致多个种子文件,从而出现了重复。以“阿特米斯奇幻历险”为例,它已经上传了两次(输出中的 2 和 3),可能在文件格式和其他规范上有所不同。但是当涉及到数据挖掘和提取模式时,必须将两者视为同一个文件,因为它们对应于同一个电影。这同样适用于名为“Gulabo Sitabo”的印地语电影(输出中的 1 和 4)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从网站抓取数据的实例(快照)。

在下一节中,我将讨论如何高精度地找到这些副本。

检测重复项

这个问题是关于寻找一对文本串之间的相似性。考虑一个函数,它可以返回一个度量或一个分数来表示两者之间的相似性。第一组想法可能围绕着类似 Jaccard 距离或余弦距离的相似性度量(查看这篇文章))。但这实际上是一个简单得多的问题,类似史密斯-沃特曼算法的东西适合于这个目的。

Smith-Waterman 算法执行局部序列比对;即,用于确定两串核酸序列蛋白质序列之间的相似区域。史密斯-沃特曼算法不是查看整个序列,而是比较所有可能长度的片段,并且优化相似性度量。”——维基百科上说的。

swalign 是一个 python 包,它实现了这种在幕后使用动态编程的算法。查看下面的代码片段,它展示了运行中的算法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用于检测相同种子内容的代码片段

匹配和不匹配值可以改变,以适应当前的应用。通常的值是 2 和-1,这对我们的目的来说也很好。可以看出,当比较 name1 和 name2 时,得分为 14 ,而 name1 和 name3,属于同一部名为 Gulabo Sitabo 的宝莱坞电影,得分为 88

注意,对于同名但不同集或季的电视节目,这种相似性度量将失效。尽管这将取决于一个人希望做什么样的分析。如果有人希望比较一部电视连续剧不同季节或不同集的受欢迎程度,这可能行不通。但是,如果人们希望在电视节目之间进行广泛的比较,那么这仍然是可行的。

通过考虑这样的启发,即只有字符串的开头部分与名称相关,而后面部分只是元数据,并删除点、空格和连字符,我们可以获得更准确的分数。这是使用下面的代码片段实现的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

代码片段:清理

提取对等地理位置

这是一个有趣的部分,因为它需要对 BitTorrent 协议的工作原理有更深入的理解。如前所述,为了使用 BitTorrent 下载文件,需要一个客户端,如洪水。向客户端提供关于所需数据的信息,这是找到拥有需要下载的文件的对等体列表所必需的。该信息以指向存储对等体列表的追踪器网站的指针的形式可用。

通过使用分布式哈希表,也可以在没有跟踪器的情况下执行上述任务。这在追踪器网站被来自对等点的请求过载时更有用,因为客户端需要定期刷新对等点列表。在这种情况下,每个节点都维护一个独立的路由表,当该节点与网络中的其他节点通信时,该路由表会更新。注意,即使对于无跟踪器的种子,至少需要一个节点来引导到网络中。

如果这一切都令人困惑,或者你打算了解更多,检查下面的视频。

让我们看一下完成这项工作的代码片段。我使用了 BitTorrent DHT 的 python 实现( Github 链接)——Bt DHT。

让我们尝试识别正在下载流行的开源图像编辑软件 GIMP 的同行的地理位置。这将需要从网站 1337x.to 获取的 infohash ,如下图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从 1337x.to 获得 GIMP 图像编辑器的 Infohash

下面的代码使用 dtdht 包从网络中提取对等体列表。输出显示了网络中当前与该种子相关联的对等体的 IP 地址列表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

提取对等 IP 列表的代码片段

一旦获得 IP 列表,我们就可以使用 geoIP2 数据库来确定地理位置。当你安装maxminddb-geolite2 时,这实际上非常简单。

查看下面的代码片段,其中显示了上面显示的 IP 地址所属的国家。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Gimp torrent 的对等机所在的国家。

显然,GIMP 正在被全世界下载,列表中有 145 个对等点。美国有 29 名同行,紧随其后的俄罗斯有 24 名同行。

下图显示了该特定软件在各个国家的同行频率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个国家的同行数量

接下来呢?

我目前运行了一个 cronjob,每 6 小时从 torrent 网站收集一次数据。在接下来的几周/几个月里,我将收集足够的数据来尝试数据挖掘算法,并寻找模式和关系。

俄语中有毒评论的检测

原文:https://towardsdatascience.com/toxic-comment-detection-in-russian-2950be3b9787?source=collection_archive---------22-----------------------

表达各种观点的自由,包括有毒、攻击性和辱骂性的评论,可能会对人们的意见和社会凝聚力产生长期的负面影响。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,自动识别和调节互联网上的有毒内容以消除负面后果的能力是现代社会的必要任务之一。本文旨在自动检测俄语中的有毒评论。作为数据来源,我们利用匿名发布的 Kaggle 数据集,并额外验证其标注质量。为了建立分类模型,我们对两个版本的多语言通用句子编码器、来自 Transformers 的双向编码器表示和 ruBERT 进行了微调。微调后的 ruBERT 达到了 F 1 = 92.20%,展示了最好的分类得分。我们向研究社区公开了经过训练的模型和代码样本。

1.介绍

如今,社交网站已经成为在线表达意见的主要方式之一。内容的快速增长导致未经核实的信息量每天都在增加。表达各种观点的自由,包括有毒、攻击性和辱骂性的评论,可能会对人们的意见和社会凝聚力产生长期的负面影响。因此,自动识别互联网上的有毒言论和不当内容以消除负面后果的能力是现代社会的必要任务之一。大公司已经进行了大量的研究[23],[26],[39],[47],然而,为了让社会接受这种限制言论自由权的制度,有必要进行深入的了解和公开的研究。

近年来,组织了越来越多的评估跟踪,如[3]、[21]、[42],并对最佳检测方法进行了评估。目前,先进的深度学习技术往往是这项任务的优越方法[1],[35]。虽然一些论文直接检查了俄语有毒语言、辱骂和仇恨言论的检测[2]、[8]、[17],但只有一个公开可用的俄语有毒评论数据集[5]。该数据集是在 Kaggle 上发布的,没有关于注释过程的任何细节,因此在没有深入检查的情况下在学术和应用项目中使用该数据集可能是不可靠的。

本文主要研究俄语文本中有害评论的自动检测。为此,我们对俄语毒性评论数据集进行了注释验证[5]。接下来,我们通过探索预训练多语言通用语句编码器(M-USE) [48]的预训练多语言版本、来自变压器(M-BERT) [13]和 ruBERT [22]的双向编码器表示的迁移学习来建立分类模型。性能最好的模型 ruBERT-Toxic 在二元分类任务中实现了 F 1 = 92.20%。我们在 GitHub 上公开了示例代码和经过微调的 M-BERT 和 M-USE 模型。

[## sis metanin/毒性-评论-俄语检测

这个库包含来自 Transformers (M-BERT)的经过微调的多语言双向编码器表示…

github.com](https://github.com/sismetanin/toxic-comments-detection-in-russian)

文章的其余部分组织如下。在第 2 节中,我们给出了相关工作的简要概述,包括现有俄语注释数据集的总结。在第 3 节中,我们提供了俄语有毒评论数据集的概述,并描述了注释验证流程。在第 4 节中,我们描述了文本分类任务的语言模型的采用。在第 4 节中,我们描述了分类实验。最后,我们提出了系统的性能和进一步的研究方向。

2.相关著作

针对不同数据源的有害评论检测已经进行了大量的工作。例如,Prabowo 及其同事评估了朴素贝叶斯(NB)、支持向量机(SVM)和随机森林决策树(RFDT)算法,用于检测印度尼西亚 Twitter 上的仇恨言论和辱骂性语言[34]。实验结果表明,使用单词单字特征和 SVM 模型的分级方法的准确率为 68.43%。在论文[15]中,Founta 等人提出了一种基于深度 GRU 的神经网络,该网络具有用于有毒文本分类的预训练手套嵌入。所开发的模型在五个滥用文本数据集上取得了高性能,AUC 值在 92%到 98%之间。

越来越多的研讨会和比赛致力于有毒语言、仇恨言论和攻击性语言的检测。例如,SemEval-2019 的 HatEval 和 OffensEvalHASOC at FIRE-2019;在 GermEval-2019 和 GermEval-2018 上识别攻击性语言的共同任务;TRAC at COLING-2018。任务提交中使用的模型各不相同,从传统的机器学习,如 SVM 和逻辑回归,到深度学习,如 RNN,LSTM,GRU,CNN,CapsNet,包括注意机制[45],[49],到最先进的深度学习模型,如 ELMo [31] BERT [13],以及 USE [9],[48]。相当数量的表现最好的团队[18]、[24]、[27]、[28]、[30]、[36]、[38]利用了所列的预训练语言模型中的嵌入。由于来自预训练语言模型的表示显示了高分类分数,它们被广泛用于进一步的研究。例如,来自洛林大学的学者使用两种方法对推文进行了多类和二元分类:使用预训练的单词嵌入训练 DNN 分类器,并微调预训练的 BERT 模型[14]。他们观察到,BERT 微调比 CNN 和建立在 FastText 嵌入之上的双向 LSTM 神经网络表现得更好。

虽然大量研究检查了俄语社交媒体源中的毒性和攻击性行为[7]、[33]、[41],但直接探索文本毒性自动分类的研究论文数量有限。Gordeev 利用卷积神经网络(CNN)和随机森林分类器(RFC)来检测英语和俄语文本中的攻击状态[17]。攻击性注释消息的语料库包括大约 1000 条俄语注释消息和大约 1000 条英语注释消息;然而,它没有公开。经过训练的 CNN 模型在俄语文本的攻击性二元分类中取得了 66.68%的准确率。基于这些结果,作者认为细胞神经网络和深度学习方法在攻击检测任务中似乎更有前景。Andrusyak 及其同事提出了一种无监督的概率方法,使用种子字典对来自 YouTube 的用乌克兰语和俄语编写的辱骂性评论进行分类[2]。作者发布了一个包含 2000 条评论的人工标注数据集,但它包含了俄语和乌克兰语的评论。因此,它不能直接应用于俄语内容的研究。

最近的几项研究旨在自动识别俄语社交媒体中对移民和族裔群体的态度,包括识别基于身份的攻击。Bodrunova 和他的同事通过分析来自俄语 LiveJournal [8]的 363,000 个帖子,研究了人们对来自前苏联南部和其他国家的移民的态度。他们发现,在俄罗斯的博客中,移民既没有引发大量的讨论,也没有经历最糟糕的待遇。此外,北高加索人和中亚人受到非常不同的待遇。贝苏德诺夫的研究小组发现,传统上俄罗斯人对来自高加索和中亚的移民更加敌视;同时,他们普遍接受乌克兰人和摩尔多瓦人作为他们的潜在邻居[6]。然而,根据 Koltsova 及其同事的说法,各种中亚人和乌克兰人带头持否定态度[19]。尽管有些人讨论了旨在检测有毒语言、辱骂和仇恨言论的学术研究,但他们都没有向研究界公开他们的俄语数据集。据我们所知,俄语毒性评论数据集[5]是唯一公开可用的俄语毒性评论数据集。然而,这个数据集是在 Kaggle 上发布的,没有任何关于创建和注释过程的描述,因此在没有深入检查的情况下,在学术和应用项目中使用这个数据集可能是不可靠的。

因此,由于针对俄语毒性检测的研究很少,我们决定在俄语毒性评论数据集上评估深度学习模型[5]。据我们所知,没有研究致力于有毒评论分类的基础上,这种来源的数据。在最近的文本分类论文中,我们将多语言 BERT 和多语言使用确定为最常见和最成功的语言模型之一。此外,只有这些语言模型正式支持俄语。我们决定利用微调作为迁移学习方法,因为最近的微调研究报告了最好的分类结果[13]、[22]、[43]、[48]。

3.有毒评论数据集

Kaggle 俄语有毒评论数据集【5】是由 2chPikabu 的注释评论集合而成,于 2019 年发布在 Kaggle 上。它包含 14,412 条评论,其中 4,826 条被标记为有毒,9,586 条被标记为无毒。评论的平均长度是 175 个字符;最小长度为 21,最大长度为 7,403。

为了验证数据集的标注质量,我们决定手动标注注释的子集,并使用注释者间协议度量来比较原始标签和我们的标签。我们决定假设数据集注释是有效的,以防注释者之间达成实质性或高级别的一致。首先,我们对这个数据集的一部分(3000 条评论)进行人工注释,然后将我们的类标签与原始标签进行比较。这一注释是由众包平台 Yandex 上讲俄语的人进行的。托洛卡,这已经在一些关于俄语文本的学术研究中使用[10]、[29]、[32]、[44]。作为注释指南,我们使用 Jigsaw 毒性评论分类挑战中的毒性和子属性的注释说明。根据指导方针,注释者被要求在一组在线评论中检测文本的毒性。对于提供的每条评论,注释者需要选择评论中的毒性级别。为了从标注者那里获得更准确的响应,并限制作弊标注者对任务的访问,我们利用了以下技术:根据标注者对控制任务的响应为他们分配一项技能,并禁止给出错误响应的执行者;限制响应过快的注释者对池的访问;限制连续几次输入验证码失败的注释者对任务的访问。每篇文章都由 3 到 8 个注释者使用动态重叠技术进行注释。接下来,使用基于Yandex 的 Dawid-Skene 方法[12]对结果进行汇总。Toloka 的推荐。根据 Krippendorff 的 alpha 值 0.81,注释者表现出高度的注释者间一致性。最后,根据 Cohen [11]的说法,原始标签和我们的聚合标签之间的 Cohen kappa 系数构成了 0.68,这是注释者间协议的实质水平。因此,我们假设数据集注释是有效的,特别是考虑到注释指令中的潜在差异。

4.机器学习模型

4.1.基线

作为基线方法,我们选择了一种基于基本机器学习的方法和一种基于现代神经网络的方法。在这两种情况下,我们应用了以下预处理技术:用关键字替换 URL 和用户名,删除标点符号,并将字符串转换为小写。

第一种是多项式朴素贝叶斯(MNB),它往往在文本分类任务中表现良好[16,40]。为了构建 MNB 模型,我们使用了词袋模型和 TF-IDF 矢量化。

第二个是双向长短期记忆(BiLSTM)神经网络,它在最近的情感分析研究中表现出较高的分类分数。对于神经网络的嵌入层,我们在 RuTweetCorp [37]的俄语推文集合上预先训练了 Word2Vec 嵌入( dim = 300) [25]。在 Word2Vec 嵌入的顶部,我们添加了两个堆叠的双向 LSTM 层。接下来,我们添加了一个隐藏的完全连接层和 sigmoid 输出层。为了减少过拟合,具有高斯噪声的正则化层和丢弃层也被添加到神经网络中。我们使用 Adam 优化器,初始学习率为 0.001,分类二进制交叉熵作为损失函数。我们用 10 个时期的冻结嵌入来训练我们的网络。我们试图在降低学习速率的同时解冻不同时期的嵌入,但未能获得更好的结果。这可能与训练数据集的大小有关[4]。

4.2.来自变压器的双向编码器表示

目前官方提供了两个多语种版本的 BERT_BASE,但只有 Cased 版本是官方推荐的。BERT_BASE 接受一个不超过 512 个令牌的序列,并输出这个序列的表示。单词标记化由单词标记化器[46]通过初步的文本规范化和标点分裂来执行。基于 BERTBASE 案例,莫斯科物理与技术研究所的研究人员预先训练并发布了俄语的 ruBERT 模型[22]。我们使用了预先训练的多语言 BERT_BASE Cased 和 ruBERT,支持 104 种语言,包括俄语,有 12 个堆叠的变压器块,隐藏大小为 768,12 个自关注头,一般有 110M 参数。微调阶段使用论文[43]和官方知识库【2】中推荐的参数进行:训练周期数为 3,预热步骤数为 10%,最大序列长度为 128,批量为 32,学习速率为 5e-5。

4.3.多语言通用句子编码器

作为输入数据,多语言 USE_Trans 取不超过 100 个令牌的序列,而多语言 USE_CNN 取不超过 256 个令牌的序列。句子片断标记化[20]用于所有支持的语言。我们使用预先训练的多语言 USETrans,它支持包括俄语在内的 16 种语言,变压器编码器有 6 个变压器层,8 个注意头,滤波器大小为 2048,隐藏大小为 512,一般有 16 个参数。我们还使用了预先训练的多语言 USE_CNN,它支持包括俄语在内的 N 种语言,CNN 编码器有 2 个 CNN 层,滤波器宽度为(1,2,3,5),滤波器大小为 256,一般有 N 个参数。对于这两个模型,我们使用了来自和 TensorFlow Hub 页面的推荐参数:100 个训练时段,32 个批量,3e-4 的学习率。

5.实验

我们评估了以下基线和迁移学习方法:多项式朴素贝叶斯分类器、双向长短期记忆(BiLSTM)神经网络、来自变压器的双向编码器表示的多语言版本(M-BERT)、ruBERT、多语言通用句子编码器的两个版本(M-USE)。训练模型在测试子集(20%)上的分类性能可以在表 2 中找到。所有微调的语言模型在精确度、召回率和 F 1-measure 方面都超过了基线方法。根据结果,ruBERT 实现了 F 1 = 92.20%,展示了最好的分类分数。

6.结论

因此,我们微调了两个版本的多语言通用句子编码器[48],来自 Transformers [13]和 RuBERT [22]的多语言双向编码器表示,用于俄语中的有毒评论检测。微调后的 RuBERTToxic 达到了 F 1 = 92.20%,展示了最好的分类得分。这项研究对实践和研究的贡献有三个方面。首先,我们概述了现有的关于俄语内容中有毒评论检测的知识库。在这样做的过程中,我们确定了现有的唯一一个公开可用的俄文毒性评论数据集。其次,我们对这个数据集的标注质量进行了验证,因为它是在 Kaggle 上匿名发布的。最后,为了给进一步的研究提供强有力的分类基线,我们向研究社区公开了预先训练的基于 BERT、基于 ruBERT 和基于多语言使用的模型。

[## sis metanin/毒性-评论-俄语检测

这个库包含来自 Transformers (M-BERT)的经过微调的多语言双向编码器表示…

github.com](https://github.com/sismetanin/toxic-comments-detection-in-russian)

参考

你可以在会议论文中找到所有参考资料。

TPOT:Python 中的自动机器学习

原文:https://towardsdatascience.com/tpot-automated-machine-learning-in-python-e56800e69c11?source=collection_archive---------27-----------------------

面向所有人的机器学习?

每个人和他们的母亲都想进入机器学习领域。这很好,但是这些年来这个领域在一定程度上变得自动化了。如今,你不必成为一名机器学习工程师,就能生产出高质量的模型。如何?这就是像 TPOT 这样的图书馆发挥作用的地方。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

万基·金Unsplash 上拍摄的照片

如果你更喜欢视频,或者只是想巩固你的知识,请随意观看我们关于这个主题的视频。源代码包括:

让我们面对事实——机器学习并没有媒体炒作的那么有趣。你可以用它做一些令人惊奇的事情,不要误会我的意思。我说的只是实际的机器学习过程。你知道,寻找最优算法及其超参数的过程。

这一部分正在变得(或者已经变得)自动化,这很好——因为我们作为工程师可以专注于更有趣的事情。

理想的读者是熟悉 Python 编程语言和机器学习项目一般流程的人。你不需要成为专家,甚至不需要在这个领域工作,但是你应该熟悉最常用的算法以及如何使用它们。

这篇文章的结构如下:

  1. TPOT 是什么?
  2. 遗传程序设计简介
  3. 数据集加载和准备
  4. TPOT 在行动

所以事不宜迟,让我们开始吧!

TPOT 是什么?

TPOT,或基于树的流水线优化工具是一个用于自动机器学习的 Python 库。以下是官方定义:

把 TPOT 当成你的数据科学助理。TPOT 是一个 Python 自动化机器学习工具,它使用遗传编程优化机器学习管道。[1]

在某种程度上,TPOT 是你的数据科学助手。它自动化了“无聊”的事情,把数据收集和准备的任务留给了你。我知道这一部分对你们中的一些人来说并不有趣,但这是 80%的工作。有了像 TPOT 这样的图书馆,这个比例可能只会更高。

此外,由于显而易见的原因,数据收集和准备不能完全自动化。官方文件中的另一句话说明了这一点:

TPOT 将通过智能地探索成千上万个可能的管道来为您的数据找到最佳管道,从而自动化机器学习中最乏味的部分。[1]

让我们快速看一下你的平均机器学习管道,看看 TPOT 在哪里:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如您所见,该库自动化了该过程的每一个繁琐部分。

但是怎么做呢?通过使用被称为“基因编程”的东西。让我们在下一节探讨这个术语。

遗传程序设计简介

官方网站很好地总结了这个概念:

遗传编程(GP)是进化算法(EA)的一种,是机器学习的一个子集。进化算法用于发现人类不知道如何直接解决的问题的解决方案。摆脱了人类的先入之见或偏见,EAs 的自适应特性可以产生与人类最大努力相当甚至更好的解决方案。

受到生物进化及其基本机制的启发,GP 软件系统实现了一种算法,该算法使用随机变异、交叉、适应度函数和多代进化来解决用户定义的任务。GP 可用于发现数据中特征之间的函数关系(符号回归),将数据分组(分类),以及辅助电路、天线和量子算法的设计。GP 通过代码合成、遗传改良、自动错误修复应用于软件工程,并用于开发游戏策略……等等。[2]

有了正确的数据和正确的数据量,我们可以使用机器学习来学习任何函数。尽管如此,知道使用哪种算法可能令人生畏——它们实在太多了。我们仍然没有触及超参数调整的想法。

这就是遗传编程真正闪耀的地方,因为它受到达尔文自然选择过程的启发,它们被用于生成计算机科学中优化的解决方案。

遗传算法有 3 个特性:

  1. 选择:你有一个可能的解决方案和一个适应度函数的群体——然后在每次迭代中评估每个适应度
  2. 交叉——选择最优解,进行交叉,产生新的种群
  3. 变异——带着他们的孩子,用一些随机的修改使他们变异,直到你得到最合适或最好的解决方案

听起来确实很多,但是 TPOT 并不要求我们成为基因编程专家。了解这些概念总是有益的。

好了,到目前为止我们已经讨论了理论部分。我们将在下一部分收集和准备一些数据。

数据集加载和准备

我喜欢在我的大多数例子中使用泰坦尼克号数据集。数据集不是太基础,因为它需要一些准备,但也不是太复杂,因为准备过程需要太长时间。你肯定可以比我花更多的时间来准备这个数据集,但这足以满足我们的需求。

进口方面,我们现在需要三样东西:熊猫标准器火车试分裂:

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

接下来,我们可以加载数据集并显示前几行:

data = pd.read_csv(‘[https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv'](https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv'))
data.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是我们要做的准备工作:

  • 删除无关列(车票乘客 Id
  • 性别列重新映射为零和一
  • 检查一个乘客是否有一个独特的头衔(如医生)或更普通的头衔(如先生、小姐。)—可以从名称列中提取
  • 检查客舱信息是否已知——如果客舱栏的值不是 NaN
  • 开始的栏创建虚拟变量— 3 个选项
  • 用简单平均值填充年龄值

这是准备过程的代码:

data.drop([‘Ticket’, ‘PassengerId’], axis=1, inplace=True)gender_mapper = {‘male’: 0, ‘female’: 1}
data[‘Sex’].replace(gender_mapper, inplace=True)data[‘Title’] = data[‘Name’].apply(lambda x: x.split(‘,’)[1].strip().split(‘ ‘)[0])
data[‘Title’] = [0 if x in [‘Mr.’, ‘Miss.’, ‘Mrs.’] else 1 for x in data[‘Title’]]
data = data.rename(columns={‘Title’: ‘Title_Unusual’})
data.drop(‘Name’, axis=1, inplace=True)data[‘Cabin_Known’] = [0 if str(x) == ‘nan’ else 1 for x in data[‘Cabin’]]
data.drop(‘Cabin’, axis=1, inplace=True)emb_dummies = pd.get_dummies(data[‘Embarked’], drop_first=True, prefix=’Embarked’)
data = pd.concat([data, emb_dummies], axis=1)
data.drop(‘Embarked’, axis=1, inplace=True)data[‘Age’] = data[‘Age’].fillna(int(data[‘Age’].mean()))

请随意复制,因为这不是关于数据准备的文章。

这是我们的数据集现在的样子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看起来不错,但是有些属性比其他属性大得多,比如年龄、费用。我们将使用标准定标器来解决这个问题,但首先,让我们执行训练测试分割:

X = data.drop(‘Survived’, axis=1)
y = data[‘Survived’]X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8)

现在,让我们将标准定标器用于训练数据,并转换训练和测试数据:

ss = StandardScaler()
X_train_scaled = ss.fit_transform(X_train)
X_test_scaled = ss.transform(X_test)

这一节到此为止。在下一部中,我们将看到 TPOT 图书馆的运作。

TPOT 在行动

到目前为止,我们已经讨论了很多,现在我们将把重点转移到文章的核心部分。首先,我们需要导入 TPOT——回归变量或分类器。我们在这里处理分类问题,所以猜猜我们将使用哪一个。

from tpot import TPOTClassifier

培训过程再简单不过了:

tpot = TPOTClassifier(verbosity=2, max_time_mins=10)
tpot.fit(X_train_scaled, y_train)

在这里,我们将 verbosity 参数指定为 2,因为我们希望打印出更多的信息,并且还指定了我们希望训练持续多长时间。你可以随意训练更长时间,但是 10 分钟对于一个演示案例来说是完全可以的。

我们将在培训期间打印出一些信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

只有 4 代,所以模型不会完美,但我们不想花一整天来训练模型。你可以。

我们现在可以检查最佳管道:

tpot.fitted_pipeline_

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如你所看到的,梯度推进方法与调整的超参数值一起使用。TPOT 只用了 10 分钟就做到了这一点!想想手动到达这里需要多长时间。

我们现在可以检查测试集的准确性:

tpot.score(X_test_scaled, y_test)**>>> 0.8491620111731844**

无论如何都不可怕。

这就足够介绍 TPOT 图书馆了。你可以自由探索。官方文档是一个很好的起点。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

[## 通过我的推荐链接加入 Medium-Dario rade ci

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@radecicdario/membership)

参考

[1]https://epistasislab.github.io/tpot/

[2]http://geneticprogramming.com

TQDM: Python 进度条变得简单

原文:https://towardsdatascience.com/tqdm-python-progress-bar-made-easy-b9c735af4b93?source=collection_archive---------24-----------------------

在 Python 中创建进度条

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Jungwoo HongUnsplash 上拍摄

在过去的一个月里,我一直在和一个研究员同事一起创建一个 python 包。创建一个 python 包包括一些瞧和一些令人沮丧的时刻。虽然我们将在其他时间讨论 python 包的创建过程,但今天我们将学习 Python 中的进度条。

进度条的需要

老实说,如果你一次处理最少的信息(数据),进度条永远不会真正进入你的工作流程。但是对于迭代数据集、对大量信息进行编码或训练模型等情况,进度条会非常方便。

  1. 它们为您提供了已经取得的进展的估计和可能需要更多时间的近似值。
  2. 它们向您提供进程仍在运行且没有突然终止的信息。

进步

progress包是我一直用来在 Python 中创建进度条的包。它简单,直观,并提供各种风格的进度条。

首先初始化进度条的对象bar。然后,对于每个进度,使用bar.step()步进,最后使用bar.finish()关闭该栏。该模块在处可用。

例子

要迭代 10 个数据点,您将使用以下代码:

from progress.bar import Bar

bar = Bar('Progress bar', max = 10)
for i in range(10):
    bar.next()
bar.finish()

虽然它在终端上运行得很好,但当我在 Jupyter 笔记本上运行时,它根本没有显示进度条。所以,我开始寻找替代品,我找到了tqdm,我发现它被广泛使用,并决定进行转换。

tqdm

这个tqdm包使得创建进度条变得非常简单,既可以在终端上显示,也可以在 Jupyter 笔记本上显示。所以,我把代码换成了使用tqdm。文档和用法可在 GitHub 上获得。

例子

假设您有下面的循环,它迭代了 1000000000 次。

for i in range(1000000000):
    pass

为了有一个进度条来显示你已经取得的进展,我们将修改上面的代码如下(只要用tqdm()把这个范围括起来就行了):

from tqdm import tqdmfor i in tqdm(range(1000000000)):
    pass

当我们用tqdm运行这个循环时,i仍然保存来自range()方法的值。另一方面,tqdm获取迭代次数并使用它来显示进度条,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 tqdm 的进度条

该模块还可以扩展到许多复杂的问题,并可以与pandaskeras等集成。

结论

今天,我们探索了进度条,尤其是progresstqdm。我建议你使用tdqm,,但是这两个进度条都有很大的价值。

请在评论中与我分享你的想法、观点和建议。你也可以在 LinkedIn 上联系我:https://www.linkedin.com/in/bhanotkaran22/

跟踪和组织 ML 项目

原文:https://towardsdatascience.com/track-and-organize-your-ml-projects-e44e6c7c3f9d?source=collection_archive---------39-----------------------

使用 Neptune.ai 组织工作、跟踪和可视化实验

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Neptune.ai 仪表板和指标可视化(图片由作者提供)

每当我开始一个需要运行数百个实验的新项目时,集成实验跟踪工具是我添加到代码中的第一件事。这样的工具不仅仅是可视化度量和存储每次运行的超参数。在这篇文章中,我将介绍和描述 Neptune 工具,我在最近的项目中使用了它。

实验“管理”工具

实验跟踪工具给你的机器学习(不仅仅是)项目带来巨大的推动。您可以使用它们来跟踪超参数、可视化图表(如指标)和图像(混淆矩阵或错误分类的样本)、存储工件(模型权重)等等。

幸运的是,人们已经注意到项目管理工具是组织良好的项目的必备工具。因此,越来越多的工具和服务为此而被创造出来:彗星MLFlow海王星权重&偏差等等。

我使用哪个工具?

我个人使用 Neptune 做我的项目。我用过一次我很喜欢,但是坦白说我还是得找足够的时间来测试其他工具。正如作者所说,Neptune 是“最轻量级”的实验管理工具。您可以随时尝试,因为它是作为一项服务提供的,并且完全免费用于您的个人项目,这意味着:

  • 1 个公共和私人项目的用户帐户,
  • 高达 100GB 的日志、工件等存储空间,
  • 无限的实验和笔记本检查点。

公司或要求更高的用户也有其他选择。

“团队”计划允许您创建 10 倍以上的用户,并为您提供 10 倍以上的磁盘空间,但团队中每个用户的费用为 79 美元。天下没有免费的午餐……然而,用于教育、研究或非营利目的的团队计划是完全免费的(目前)。Neptune tool 也可以作为“企业”计划的一部分在内部使用(托管在您的组织内),但这主要是推荐给那些不喜欢为其产品使用 SaaS 解决方案的大型组织。

在代码中使用 Neptune

将 Neptune 与您的代码集成在一起是小菜一碟,真的。它基本上是一个带有简单 API 的 Python 模块,例如记录几个参数和指标,你所要做的就是你下面看到的。当然,代替这些神奇的数字,您将记录由机器学习框架返回的值(像 PyTorch Lightning 它对 Neptune 和其他工具有很大的支持)。

import neptuneneptune.init('Me/MyProject')
neptune.create_experiment(params={'lr':0.1, 'dropout':0.4})
neptune.log_metric('test_accuracy', 0.84)

访问Neptune 的官方页面,这里有很多它如何工作的例子,并列出了你可能感兴趣的所有特性。我会告诉你哪些是我觉得有用的,以及它们在我的项目中的样子。我将只展示我使用过的特性,但是请注意,您的项目需要大量的其他功能

一张图胜过千言万语,所以…

特征

从仪表板视图开始(图 1。)以及所有项目的列表(包括当前正在运行的实验)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图一。仪表板:项目列表、磁盘使用等(图片由作者提供)

在项目视图中(图 2。),浏览实验列表及其参数和结果(指标如 test_loss )。修改显示的列,包括实验信息(作者、运行时间、标签)和指标( Neptune 可以建议您根据您记录的内容添加一个指标列)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图二。实验:最近的运行、参数和结果(图片由作者提供)

可视化指标,默认情况下,每个图表单独显示(图 3。),但是您也可以创建自定义视图。您可以决定在同一个图表中显示多个可视化效果(图 4。).

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3。指标和其他值的可视化,例如 LR(作者提供的图像)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4。自定义图表:同一图表中的多个指标(图片由作者提供)

将任何文件(例如,权重、输出文件)保存为工件(图 6。).在预览窗口中查看它们(如果可能)或下载它们用于推断。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6。工件:保存/下载工件(如模型)(作者图片)

不使用这些是浪费时间

改变我的想法。

将您的代码连接到一个“管理”工具是一件轻而易举的事情。除此之外,以 PyTorch Lightning 为例,一旦您决定应该记录哪些指标等等。你可以互换使用 loggers(像 Tensorboard,Neptune,Weights & bias)。

您可以在后台运行实验,所有的日志、图像和结果将被保存供您以后查看。

尝试不同的工具,有些可以作为 Saas 使用,有些可以在本地运行。它们提供了各种各样的功能,当然比我描述的要多得多。它们也是相辅相成的,所以试一试,然后再看看另一个。找到你和你的团队最喜欢的一个,让你的项目井井有条。过会儿谢谢我。

使用 R 自己跟踪新冠肺炎数据

原文:https://towardsdatascience.com/track-covid-19-data-yourself-with-r-eb3e641cd4b3?source=collection_archive---------12-----------------------

变更数据

了解如何使用 R 监测您所在国家和全球的每日冠状病毒统计数据和趋势。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

KOBU 社Unsplash 上拍摄的照片

今年早些时候,当全球疫情第一次获得势头时,我像大多数人一样,依赖媒体来获取最新消息。我很快发现,媒体的报道不仅不一致,而且经常提供不完整的信息。这些局限性的根本问题是,它们经常导致对数据的误解和曲解,在任何特定时间点对这场全球危机的严重性存在广泛分歧的观点就证明了这一点。

媒体机构经常精挑细选他们报道的统计数据和图表,偏好与他们试图讲述的故事相一致的耸人听闻的标题。鉴于他们的主要目标是吸引观众,你不能过多地责怪他们的这种倾向。但是,如果你希望获得新冠肺炎病毒在你的国家的当前影响的准确和可靠的图片,包括跟踪和绘制趋势,你最好自己分析源数据。

在本文中,我们将介绍如何用 R 编写一个脚本来提取和分析当前的冠状病毒数据。最好的部分是,一旦你写了脚本,你可以很容易地保存和重新运行它。您不再需要依赖基于其他人决定分析和报告的数据的不完整快照。现在,您可以轻松快捷地获得最新的新冠肺炎数据,并且可以自己跟踪当前的统计数据和趋势!

让我们开始编码吧

我使用 R Studio 并将这个脚本保存在 R markdown (Rmd)中。如果您喜欢使用 base R,不用担心,代码也可以在标准的 R 脚本中运行。我不打算介绍如何安装 R [1]或 R Studio [2],但是这两个都是开源的(并且是免费的),您可以查看下面的参考资料,找到详细的文档和安装说明。

首先,打开一个新的 Rmd(或 R)文件。如果你使用 Rmd,使用Ctrl+Alt+I(Mac:Cmd+Option+I)来插入代码块。在这个新的块中,我们将加载我们将要使用的包。请注意,如果您还没有安装这两个软件包,那么您首先需要安装它们。我包含了下面的代码,用于安装和加载它们,不过如果需要安装它们,您需要先取消对安装行的注释(删除标签)。你只需要安装软件包一次,所以一旦你安装了它们,请随意删除那些注释行。

# install.packages('lubridate')
# install.packages('tidyverse')library(lubridate)
library(tidyverse)

我们不会太详细地讨论每个包的功能,因为这超出了本文的范围。但是,如果您想了解更多,我将在下面提供对它们的简要描述,并在参考资料中包含它们的文档链接。如果您打算经常使用 R,我强烈建议您仔细看看这些包的文档。他们很牛逼,值得学习!

第一个包是 lubridate,它提供了很多处理日期变量的有用函数[3]。出于我们的目的,我们只是使用 lubridate 将数据集中提供的日期格式转换为 r 可识别的日期变量。另一个包 tidyverse 实际上是组成“Tidyverse”的一组包[4]。当您安装(和加载)tidyverse 时,包含的整个软件包组会自动为您安装(和加载)。其中两个包含的包值得一提,因为我们将多次使用它们,dplyr 和 ggplot2。

dplyr 包“是数据操作的语法,提供一组一致的动词,帮助您解决最常见的数据操作挑战”[5]。可能会有一整本书只是介绍如何使用 dplr,所以现在这样的描述已经足够了。Ggplot2 是另一个用于绘制图形和图表的神奇软件包[6]。我在研究生院上了整整一学期的数据可视化课,专门使用 ggplot2,我们只触及了可用功能的皮毛。安装和加载这两个包之后,我们就可以开始挖掘和研究数据了!

加载并浏览数据

今年早些时候,当我第一次寻找可用的冠状病毒数据集时,我检查了几个不同的选项。在对这些选项进行了几周的测试后,我对欧洲疾病控制中心(ECDC)的数据产生了偏好[7]。它持续更新(每晚),并提供我正在寻找的大部分信息,包括每日病例数、死亡人数和人口信息,按国家/地区分类。在过去的 4-5 个月中,他们已经更新了数据集几次,更改了格式并添加了列。但总的来说,他们在维护和更新数据方面非常一致。因此,ECDC 数据集一直是我追踪新冠肺炎的首选来源,也是我们在这里要使用的。

# FROM: [https://www.ecdc.europa.eu](https://www.ecdc.europa.eu)
data <- read.csv(“[https://opendata.ecdc.europa.eu/covid19/casedistribution/csv](https://opendata.ecdc.europa.eu/covid19/casedistribution/csv)", na.strings = “”, fileEncoding = “UTF-8-BOM”, stringsAsFactors = F)data# convert date format
data$date_reported <- mdy(paste0(data$month,”-”,data$day,”-”,data$year))

ECDC 为他们的 CSV 格式的数据集提供了一个方便的 URL,我们可以使用内置的“read.csv”函数轻松地将其拉入 R 中。这个链接的好处是,他们每天使用相同的 URL 更新数据集,因此您永远不需要更改代码来导入数据集。运行 read.csv 行后( Ctrl + Enter 运行单行或高亮选择),数据集保存在“data”变量中。运行下一行“data ”,查看原始数据集。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

原始数据集的快照(图片由作者提供)

如您所见,“dateRep”列使用 DD/MM/YYYY 以一种非常独特的方式格式化日期。上面代码块中的最后一行代码实际上只是将日期字符串转换成 R(和 ggplot2)可以读取的格式。有很多方法可以完成这个任务,但是为了简单起见,我们将使用 lubridate 包中的 mdy()函数[3]。

基础探索

让我们先来看看全球累计总病例和死亡人数。第一行将汇总迄今全球新冠肺炎病例总数。接下来,我们将按国家进行细分,并计算该国的病例总数,以及每个国家单日报告的最大病例数。然后,我们按案例总数降序排列结果。下面,我们将计算同样的事情,但这次是冠状病毒死亡(而不是新病例)。

# total cases worldwide to date
sum(data$cases)# total cases and max single day by country
data %>% 
 group_by(countriesAndTerritories) %>% 
 summarise(cases_sum = sum(cases), cases_max = max(cases)) %>% 
 arrange(desc(cases_sum))# total deaths worldwide to date
sum(data$deaths)# total deaths and max single day by country
data %>% 
 group_by(countriesAndTerritories) %>% 
 summarise(deaths_sum = sum(deaths), deaths_max = max(deaths)) %>% 
 arrange(desc(deaths_sum))

上述代码块将有四个输出。下面是最后的输出,显示了各个国家的新冠肺炎死亡总数,以及一天内的最大死亡人数。目前(2020 年 8 月),美国是冠状病毒死亡人数最多的国家。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

新冠肺炎国家死亡人数(图片由作者提供)

绘制每日病例和死亡数

现在我们将开始绘制数据以确定趋势。因为我住在美国,所以我要策划美国的案子。您可以很容易地使用其他国家修改代码,我们将很快介绍这一点。

us <- data[data$countriesAndTerritories == ‘United_States_of_America’,]
usUS_cases <- ggplot(us, 
 aes(date_reported, as.numeric(cases))) +
 geom_col(fill = ‘blue’, alpha = 0.6) + 
 theme_minimal(base_size = 14) +
 xlab(NULL) + ylab(NULL) + 
 scale_x_date(date_labels = “%Y/%m/%d”)US_cases + labs(title=”Daily COVID-19 Cases in US”)

首先,我过滤数据集,只查看美国案例,并将其存储到一个变量中。然后,我使用 ggplot2 来绘制新冠肺炎的每日新病例。有关如何使用 ggplot2 的更多信息,请查看他们的文档[6]。运行上面的程序块后,您应该会看到下图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

美国每日新冠肺炎病例(图片由作者提供)

太棒了,对吧?当然,数据描绘的画面并不可怕,但你可以自己跟踪它的事实肯定是可怕的!

让我们继续,对冠状病毒死亡做同样的事情。代码实际上是一样的,只是我们现在跟踪的是“死亡”而不是“病例”

US_deaths <- ggplot(us, 
 aes(date_reported, as.numeric(deaths))) +
 geom_col(fill = ‘purple’, alpha = 0.6) + 
 theme_minimal(base_size = 14) +
 xlab(NULL) + ylab(NULL) + 
 scale_x_date(date_labels = “%Y/%m/%d”)US_deaths + labs(title=”Daily COVID-19 Deaths in US”)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

美国每日新冠肺炎死亡人数(图片由作者提供)

如你所见,死亡率描绘了一幅不同于案件数量的画面。虽然第二波病例是第一波的两倍,但第二波死亡人数还没有超过第一波。这些都是值得关注的有趣趋势,绝对值得追踪。

比较多个国家

抓紧你的帽子,因为我们将要涉及的最后一个情节将允许我们比较不同的国家!我选择了美国、中国、意大利和西班牙,但是你可以混合起来选择你感兴趣的任何国家/地区。

# Now lets add in a few more countries
china <- data[data$countriesAndTerritories == ‘China’,]spain <- data[data$countriesAndTerritories == ‘Spain’,]italy <- data[data$countriesAndTerritories == ‘Italy’,]USplot <- ggplot(us, 
 aes(date_reported, as.numeric(Cumulative_number_for_14_days_of_COVID.19_cases_per_100000))) +
 geom_col(fill = ‘blue’, alpha = 0.6) + 
 theme_minimal(base_size = 14) +
 xlab(NULL) + ylab(NULL) + 
 scale_x_date(date_labels = “%Y/%m/%d”)China_US <- USplot + geom_col(data=china, 
 aes(date_reported, as.numeric(Cumulative_number_for_14_days_of_COVID.19_cases_per_100000)),
 fill=”red”,
 alpha = 0.5)Ch_US_Sp <- China_US + geom_col(data=spain, 
 aes(date_reported, as.numeric(Cumulative_number_for_14_days_of_COVID.19_cases_per_100000)),
 fill=”#E69F00",
 alpha = 0.4)Chn_US_Sp_It <- Ch_US_Sp + geom_col(data=italy, 
 aes(date_reported, as.numeric(Cumulative_number_for_14_days_of_COVID.19_cases_per_100000)),
 fill=”#009E73",
 alpha = 0.9)Chn_US_Sp_It + labs(title=”China, US, Italy, & Spain”)

这段代码看起来有点吓人,但实际上非常简单。在顶部,我们筛选出我们感兴趣的国家的数据集,并将其保存在各自的变量中。接下来的一系列代码块创建了我们要堆叠的图,我们添加的每个国家一个。

考虑到我们要比较国家,这次我们将使用一个新列,它列出了该国过去 14 天每 100,000 人中的累计新增病例数。由于每个国家的人口不同,使用每 100,000 人的病例数使我们能够根据人口标准化病例数。让我们看看那是什么样子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

中国、美国、意大利和西班牙——每 100,000 人中超过 14 天的病例(图片由作者提供)

红色的小驼峰(在开始)是中国,绿色是意大利,黄色是西班牙,蓝色是美国。正如你所看到的,中国首先受到冲击,尽管总体影响明显低于其他三个国家(至少根据他们报告的数字)。可悲的是,相比之下,美国看起来仍然相当糟糕。在这四个国家中,西班牙受到第一波冲击最大,而美国和意大利似乎受到了类似的影响。

不幸的是,第二波像卡车一样袭击了美国(就累计病例而言),尽管我们似乎开始了下降趋势(手指交叉)。西班牙的第二波浪潮似乎仍在升温。我们必须继续监控他们的数据,看看他们何时开始拉平曲线。另一方面,义大利在第一波疫情之后,似乎在抑制新冠肺炎扩散方面做得非常出色。我们可以从他们的成功中吸取一些教训。

结论

这只是开始。我们只是触及了你可以用这些数据做的事情的表面。我希望您接受我们在这里介绍的内容,并使用它!让它成为你自己发现的跳板。您不再需要依赖媒体或其他数据科学家的片段来掌握新冠肺炎数据并跟踪趋势。请在评论中告诉我你是如何处理这些数据的,并与我们分享你的发现!

✍️ 订阅获取我的最新文章,这些文章刊登在像➡️数据科学创业公司&这样的出版物上

参考

[1] R,《R:统计计算的 R 项目》r -project.org ,2020。【在线】。可用:【https://www.r-project.org】T4。[访问时间:2020 年 8 月 10 日]。

[2] R 工作室,《R 工作室 IDE 桌面》rstudio.com,2020 年。【在线】。可用:https://rstudio.com/products/rstudio。[访问时间:2020 年 8 月 10 日]。

[3]lubridate package | R Documentation,“让处理日期变得简单一点”,rdocumentation.org,2020 年。【在线】。可用:https://www . rdocumentation . org/packages/lubridate/versions/1 . 7 . 9。[访问时间:2020 年 8 月 10 日]。

[4] tidyverse package | R 文档,“轻松安装和加载‘tidy verse’”,rdocumentation.org,2020 年。【在线】。可用:https://www . rdocumentation . org/packages/tidy verse/versions/1 . 3 . 0。[访问时间:2020 年 8 月 10 日]。

[5] dplyr 包| R 文档,“数据操作的语法”rdocumentation.org,2020。【在线】。可用:https://www . rdocumentation . org/packages/DP lyr/versions/0 . 7 . 8。[访问时间:2020 年 8 月 10 日]。

[6] ggplot2 软件包| R 文档,“使用图形语法创建优雅的数据可视化”,rdocumentation.org,2020 年。【在线】。可用:https://www . rdocumentation . org/packages/gg plot 2/versions/3 . 3 . 2。[访问时间:2020 年 8 月 10 日]。

[7]欧洲疾病防治中心,“CDC 新冠肺炎·疫情”ecdc.europa.eu,2020 年。【在线】。可用:https://www.ecdc.europa.eu/en/covid-19-pandemic。[访问时间:2020 年 8 月 10 日]。

使用 Apache Kafka、Pandas 和 MatPlotLib 跟踪实时黄金价格

原文:https://towardsdatascience.com/track-real-time-gold-prices-using-apache-kafka-pandas-matplotlib-122a73728a88?source=collection_archive---------20-----------------------

了解如何使用阿帕奇卡夫卡熊猫跟踪实时黄金价格。在条形图上绘制最新价格。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

克里斯·利维拉尼在 Unsplash 上的照片

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

在我们所处的时代,跟踪、处理和分析实时数据正成为许多企业的必需品。不用说,处理流数据集正成为数据工程师和科学家最重要和最需要的技能之一。

对于本文,我假设您熟悉 Apache Kafka——一个开源的分布式事件流平台。Apache Kafka 具有内置的分区、复制和容错机制。我在过去的几个项目中使用过 Apache Kafka,用于几个用例,包括度量收集、日志收集和流处理。

在我的数据工程和数据科学课程中,Apache Kafka 是我的学生们讨论的热门话题。在我在课程中提到的许多例子中,我决定分享这个例子。

我们将从以下 API 向 Kafka 中摄取流数据。

https://forex-data-feed . Swiss quote . com/public-quotes/BBO quotes/instrument/XAU/美元

我们将首先创建一个 Kafka 生成器,它将从上面的 API 中读取数据,并不断地将数据推送到 Kafka。

我们还将创建 Kafka 消费者,它将不断地从 Kafka 读取数据。一旦消息被阅读,我们将提取最新的黄金价格,并将结果绘制在条形图上。

技术栈:Apache Kafka、Pandas、Python、kafka-python 库和 MatPlotLib

准备工作

安装 Java

sudo yum -y install java-1.8.0-openjdk.x86_64

下载阿帕奇卡夫卡

$ cd /opt
$ sudo wget [http://apache.forsale.plus/kafka/2.5.0/kafka_2.13-2.5.0.tgz](http://apache.forsale.plus/kafka/2.5.0/kafka_2.13-2.5.0.tgz)
$ sudo tar -zxf kafka_2.13-2.5.0.tgz
$ cd kafka_2.13-2.5.0

在后台启动 Zookeeper 和 Kafka 服务器

$ cd /opt/kafka_2.13-2.5.0;export JAVA_HOME=/usr/lib/jvm/jre-1.8.0;export JRE_HOME=/usr/lib/jvm/jre$ nohup sudo /bin/zookeeper-server-start.sh config/zookeeper.properties &$ nohup sudo bin/kafka-server-start.sh config/server.properties &

创造一个新的卡夫卡主题— 戈德拉特

$ sudo bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1     --partitions 1 --topic Goldrates$ sudo bin/kafka-topics.sh --list --zookeeper localhost:2181

克隆我的 Github repo:

$ git clone https://github.com/mkukreja1/blogs.git

创建一个卡夫卡制作人

在 Jupyter 中安装 Kafka Producer 笔记本。我将通过这些步骤来理解这个流程。

Kafka/gold rates/kafkaproducergoldrates . ipynb

import sys
!{sys.executable} -m pip install kafka-pythonimport time
import json
from json import dumps
**from kafka import KafkaProducer**
from time import sleep
import requests as req

KafkaProducer — 用于创建异步消息生成器的高级类。

ticker_url="[https://forex-data-feed.swissquote.com/public-quotes/bboquotes/instrument/XAU/USD](https://forex-data-feed.swissquote.com/public-quotes/bboquotes/instrument/XAU/USD)"
brokers='localhost:9092'
topic='Goldrates'
sleep_time=300

声明一些将在程序中使用的常量。 经纪人 可以是参与您的 Apache Kafka 集群的经纪人列表。

producer = KafkaProducer(bootstrap_servers=[brokers],value_serializer=lambda x: dumps(x).encode('utf-8'))

这将初始化一个新的 Kafka 生成器。该生成器将在将数据发送到代理列表之前序列化数据。数据将被转换为 JSON 并使用 utf-8 进行编码。

while(True):
    print("Getting new data...")
    resp = req.get(ticker_url)
    json_data = json.loads(resp.text)
    producer.send(topic, json_data)
    time.sleep(sleep_time)

这段代码在一个永无止境的循环中运行。它从 Goldrates API 获取数据,将传入的 JSON 对象转换为 Python 对象,最后将这些数据发送到 Kafka 中的特定主题。在每次迭代之后,它休眠一个先前声明的周期=sleep_time 常数。

如果您的 Kafka Producer 运行正常,您应该会看到如下输出:

获取新数据…
获取新数据…

让这个笔记本保持运行,这样 Kafka 的消费者就可以阅读这些信息。

创造一个卡夫卡消费者

在 Jupyter 安装 Kafka 消费者笔记本。如前所述,我将通过这些步骤来理解这个流程。

Kafka/gold rates/kafkaconsumergoldrates . ipynb

import time
import json
**from kafka import KafkaConsumer**
from pandas import DataFrame
from datetime import datetime
import matplotlib.pyplot as plt

KafkaConsumer — 用于创建异步消息消费者的高级类。

brokers='localhost:9092'
topic='Goldrates'
sleep_time=300
offset='latest'

声明一些将在程序中使用的常量。 经纪人 可以是参与你的 Apache Kafka 集群的经纪人列表。Offset =*latest表示代码应该从 Kafka 队列中获取 latest 消息。您也可以选择从最早的开始。*

consumer = KafkaConsumer(bootstrap_servers=brokers, auto_offset_reset=offset,consumer_timeout_ms=1000)
consumer.subscribe([topic])

这初始化了一个新的 Kafka 消费者。

auto _ offset _ reset—仅在用户遇到意外问题时使用。在这种情况下,我们要求消费者重新开始阅读来自最新消息的消息。您也可以选择从最早的开始。**

自动提交间隔毫秒— 两次提交之间的时间段。

最后,我们要求消费者订阅,即从定义为常量的主题中获取消息。

oldprice_dict = {}
while(True):
    for message in consumer:
        #print(message)
        d=json.loads(message.value)
        df=DataFrame(d)
        for x in range(1):
            #print(x)
            new_price=df['spreadProfilePrices'][x][0]
            ts=df['ts'][x]
            #print(new_price)
            print("Latest Gold Price: " + str(new_price['ask']))
            datetime_time = datetime.fromtimestamp(ts/1000)
            goldprice_dict[str(datetime_time)]=new_price['ask']
            print("Gold Price at: " + str(datetime_time))
        print("-----------------------------------------")
        #print(goldprice_dict)
        plt.figure(figsize=(20,10))
        plt.bar(range(len(goldprice_dict)), list(goldprice_dict.values()), align='center',linewidth=0.5)
        plt.xticks(range(len(goldprice_dict)), list(goldprice_dict.keys()))
        plt.show()

    time.sleep(sleep_time)

对于每条消息,JSON 都被加载到 Pandas 数据帧中。从数据帧中提取黄金的最新价格和时间戳,并存储在 Python 字典中。最后,Python 字典用于绘制如下条形图:

x 轴—黄金价格读数的时间戳

y 轴-黄金价格值

如果一切顺利,对于每次迭代,最新的黄金价格将绘制如下:

预期产出如下:

最新黄金价格:1902.951
2020–10–26 15:16:16
黄金价格

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最新黄金价格:1902.968
2020–10–26 15:21:17
黄金价格

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最新黄金价格:1902.208
黄金价格:2020–10–26 15:26:18
————————

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最新黄金价格:1902.293
2020–10–26 15:31:19
黄金价格

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最新黄金价格:1902.693
2020–10–26 15:36:19
黄金价格

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文的所有代码都可以在下面的链接中找到:

[## mkukreja 1/博客

此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…

github.com](https://github.com/mkukreja1/blogs/tree/master/kafka/gold-rates)

我希望这篇文章是有帮助的。由 Datafence Cloud Academy 提供的 Apache Kafka 主题将作为大数据 Hadoop、Spark & Kafka 课程的一部分进行更详细的介绍。

跟踪每个表的 Azure Analysis Services 处理时间

原文:https://towardsdatascience.com/track-your-azure-analysis-services-processing-times-per-table-f2d3238f81a6?source=collection_archive---------27-----------------------

使用 Kusto 查询和诊断日志

最近我一直在与 Azure Analysis Services 合作。在我们的模型中,表的数量在快速增长,处理时间也在波动和增长。从 AAS 的角度来看,我有足够的理由进一步了解哪些表占用了最多的处理时间。

在这里,我将解释我所采取的步骤,以获得关于 Azure Analysis Services 全流程日志分析工作区Power BI 报告的处理步骤的详细信息。

  • 将诊断日志记录设置到日志分析工作区
  • 使用 Kusto 查询语言浏览日志
  • 将数据导入 Power BI

诊断日志

一如既往,起点是微软文档**。好吧,实际上是谷歌或者必应。但是很快我就进入了文档页面,其中包含了开始所需的所有步骤。下面列出了链接。**

在这种情况下,已经完成了诊断设置的配置,以便将日志发送到日志分析工作区。如果您仍然需要这样做,文档中包含了所需的操作。这很简单。

浏览日志

下一步是在我们的日志分析工作区(LAW)中探索日志,通过编写查询来获取我们正在寻找的信息。文档中的第一个示例查询是一个很好的起点。但这并不是我们想要的,因为我们想要的是模型的更新。而不是查询时间。

最后,我编写了两个查询,并在 Power BI 中将它们连接在一起。在第一个查询中,我专门寻找刷新流程的最高级别

在这种情况下,“OperationName”字段和“TextData_s”字段中的值“CommandEnd”在“< Refresh”上进行过滤。下面是查询,如果要用,别忘了在第二行加上自己的服务器和数据库名。

在第二个查询中,我们获得了刷新的详细信息,并希望过滤掉尽可能多的我们不使用的操作。这个查询产生了我们正在寻找的所有详细信息。

另一个选择是,为了在最后一个查询中得到更少的结果,将它加入到“RootActivityId_g”上的第一个查询中。这样可以确保只获得与第一个查询相关的数据。

在 Power BI 中可视化

Log Analytics 工作区提供了将书面查询导出到 M 语言的可能性,并包含一些关于如何在 Power BI 中使用脚本的帮助。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将 Kursto 查询导出到 Power BI(图片由作者提供)

在将两个 Kusto 查询添加到 Power BI 报告之后,在两个表之间的“RootActivityId_g”上创建了一个关系。从“ObjectReference_s”中,可以导出表名。最后,我添加了一个度量来计算以分钟为单位的持续时间。

模型中的数据提供了对每次刷新操作持续时间的深入了解,可通过第一次查询中的“RootActivityId_g”进行识别。从第二个查询中可以看到每个表的详细信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一次查询;每次刷新的状态(图片由作者提供)

如果我们考虑‘object name _ s’=‘Partition’和‘event subclass _ s’= 59,则每个表的步骤包括:

  • 查询来源
  • 读取数据并处理分区
  • 分析和编码
  • 每列每段的压缩率
  • 每列处理层次结构

这是一个简单的演示模型的例子。第一行显示所选表的完整持续时间。查看开始和结束时间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第二次查询;每个表的详细刷新信息(图片由作者提供)

结论

能够分析刷新过程中的不同步骤,并精确定位耗时的步骤,对我来说非常有价值。

在诊断日志中有大量关于您的 Analysis Services 实例的信息。例如关于“查询处理单元”(qpu_metric)和内存使用的信息。

从我的角度来看,作为一名数据工程师,用 Power BI 中的诊断日志监控 Azure Analysis Services 是 Azure 门户的一个很好的替代方案。您控制着整个流程的设计,并且可以向您的 BI 产品的最终用户提供监控解决方案,而无需登录 Azure 门户。

请让我知道你的想法或者你有什么建议给我!谢谢大家!

参考文献:

[## Azure Analysis Services 的诊断日志记录

任何 Analysis Services 解决方案的一个重要部分是监视服务器的性能。Azure 分析…

docs.microsoft.com](https://docs.microsoft.com/en-us/azure/analysis-services/analysis-services-logging) [## Azure 平台日志概述- Azure Monitor

平台日志为 Azure 资源和 Azure 平台提供了详细的诊断和审计信息

docs.microsoft.com](https://docs.microsoft.com/en-us/azure/azure-monitor/platform/platform-logs-overview) [## Kusto 入门

Azure Data Explorer 是一项用于存储和运行大数据交互式分析的服务。它基于关系…

docs.microsoft.com](https://docs.microsoft.com/en-us/azure/data-explorer/kusto/concepts/)

作为专业人士跟踪您的 ML 模型,使用 MLflow 跟踪它们。

原文:https://towardsdatascience.com/track-your-ml-models-as-pro-track-them-with-mlflow-11fc5486e389?source=collection_archive---------15-----------------------

使用 MLflow 跟踪 ML 模型的分步指南

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

维克多·加西亚在 Unsplash 上拍摄的照片

作为一名机器学习工程师数据科学家,你的大部分时间都花在实验机器学习模型上,例如调整参数、比较指标、创建和保存可视化、生成报告等。然而,在许多情况下,我们通常不会以健康的方式进行这种跟踪。进行这种跟踪的一种健康、简单和有效的方式是利用促进这种类型活动的工具,例如 ML flow

在这篇博客中,您将学习如何安装、如何跟踪指标、如何跟踪参数以及如何保存和重用 scikit-learn ML 模型。所以这个博客分为以下几个部分:

  • 什么是 MLflow
  • 构建 ML 管道
  • 跟踪 ML 管道
  • 可视化

所以,让我们开始吧!

什么是 MLflow?

MLflow 是一个管理 ML 生命周期的开源平台,包括实验、再现性、部署和中央模型注册[1]。 MLflow 是基于 python 的,你可以在这里找到源代码。所以,本质上 MLflow 提供了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图一。MLflow 功能|作者图片|创意取自来源

基本上 MLflow 提供了一套工具,让我们生活中的机器学习工程师数据科学家更加高效有效

在这篇博客中,我们将重点关注跟踪参数和指标的部分,以及生成、保存和加载模型以供再次使用。所以让我们继续安装吧!

由于 MLflow 是基于 python 的安装相当容易,你可以用 pip 来完成,比如:

pip install mlflow

很好,假设安装成功,我们将构建一个简单的管道,在其中我们将训练一个决策树来生成对蘑菇数据集的预测。所以让我们努力吧!

你可以在这里找到完整的实现:https://github.com/FernandoLpz/Tracking-ML-model-MLflow

建立洗钱渠道

正如我们提到的,我们将使用蘑菇数据集(你可以在这里找到数据集:来源)来建立一个机器学习模型。因此,管道将具有以下形式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图二。Pipeline |作者图片

在管道的每个部分,我们将执行特定的任务,例如:

  • 加载数据:读取 csv 文件,加载到 pandas 数据帧
  • 预处理:删除不必要的列,应用一键编码将分类数据转换成数字格式。
  • **拆分数据:**给定整个数据集,将生成训练集和测试集。
  • 参数调整:通过网格搜索,将获得决策树的最优参数,随后将应用 k-fold 交叉验证来观察具有最优参数的模型的行为。
  • 模型评估:在给定最优参数的情况下,通过使用测试数据进行计算,对模型进行测试,以计算精度。

然后,管道的每个组件的具体任务描述如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3。管道详情|作者图片

那么,没有被跟踪的管道将如下所示:

代码 1。无跟踪的管道

正如我们所看到的,属于一个类的每一个函数都代表了管道的每一个组件,每一个组件都有其特定的活动。然而,在我们的日常生活中,我们需要在不同的环境下创建模型的不同版本,也就是说,我们需要跟踪模型的变化和结果。让我们看看如何用 MLflow 来做到这一点!

跟踪 ML 管道

为了跟踪管道,我们将使用 MLflow: 提供的一些重要模块

  • MlflowClient(): 创建和管理实验和运行,以及创建和管理注册的模型和模型版本[2]。
  • mlflow.start_run(): 启动新的 MLflow 运行,将其设置为活动运行,在该运行下将记录度量和参数[3]。
  • mlflow.log_metric(): 记录单个键值度量。该值必须始终是数字[3]。
  • mlflow.log_param(): 记录当前活动运行中的单个键值参数。键和值都是字符串[3]。
  • mlflow.log_artifact(): 将本地文件或目录记录为工件[3]
  • **ml flow . sk learn . Save _ model()😗*将一个 scikit-learn 模型保存到本地文件系统[4]上的一个路径中。

因此,首先我们需要创建一个实验,或者如果我们已经有了一个实验,使用 id 来启动之前创建的实验,让我们看看下面的代码:

代码 2。正在初始化 MLflow 客户端

在第 15 行,我们创建了一个客户端实例*。在" try-except “块中,用于创建一个命令行提供的名为” data_name 的新实验。如果已经创建了一个名为 data_name 的实验,则取该实验的 id 。*

在第 29 行,我们生成一个上下文来执行 mlflow.start_run() ,使用实验 id运行名称作为参数。

好了,一旦以上完成,是时候开始跟踪工件、度量和参数了。让我们来看看我们是如何处理管道的 3 个组件的: load_data()parameter _ tuning()k _ fold _ cross _ validation()

代码 3。跟踪工件

第 6 行中发生的事情是,我们正在保存数据集的路径,该数据集将被加载到 MLflow 上下文中的数据帧中。

代码 4。跟踪参数

一旦找到最佳参数,就使用 mlflow.log_param()MLflow 跟踪它们,如第 16、17 和 18 行所示。

代码 5。跟踪指标

正如我们所看到的,为了跟踪指标,我们必须使用 mlflow.log_metric(),,正如您在第 10 行和第 11 行中看到的。

最后,这是使用 MLflow 跟踪的整个管道的样子:

代码 6。使用 MLflow 跟踪管道

最后,由于我们正在使用一个决策树,我们可能想要保存它并将其与其他树进行比较。同样,我们还需要保存最终的模型,我们将这样做:

代码 7。使用 MLflow 跟踪树拓扑和模型

形象化

MLflow 提供了一个工具来轻松查看你实验中所做的所有轨迹,这个功能是: mlflow ui

一旦我们创建了一个实验并跟踪了工件、参数或指标,我们就可以从命令行启动 UI,如下所示:

mlflow ui

它会像这样显示和输出:

[2020-09-27 00:31:50 -0500] [26723] [INFO] Starting gunicorn 20.0.4[2020-09-27 00:31:50 -0500] [26723] [INFO] Listening at: http://127.0.0.1:5000 (26723)[2020-09-27 00:31:50 -0500] [26723] [INFO] Using worker: sync[2020-09-27 00:31:50 -0500] [26725] [INFO] Booting worker with pid: 26725

所以你只需要进入你的浏览器并访问你的本地主机。然后我们会看到类似这样的内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4。MLflow UI |作者图片

如果您单击运行日期,您可以更详细地查看一些项目,例如我们跟踪的工件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 5。MLflow UI 工件|作者图片

你可以在这里找到完整的实现:https://github.com/FernandoLpz/Tracking-ML-model-MLflow

结论

在这篇博客中,我们看到了 MLflow 是什么,它的优势是什么,如何从安装到跟踪一个基本管道以及解释图形界面的可视化来实现它。

参考

[1]https://mlflow.org/

[2]https://www . ml flow . org/docs/latest/_ modules/ml flow/tracking/client . html

https://www.mlflow.org/docs/latest/python_api/mlflow.html

[4]https://www . ml flow . org/docs/latest/python _ API/ml flow . sk learn . html

使用 Python 追踪冠状病毒(新冠肺炎)在印度的传播

原文:https://towardsdatascience.com/tracking-corona-covid-19-spread-in-india-using-python-40ef8ffa7e31?source=collection_archive---------5-----------------------

从卫生部官方网站获取新冠肺炎病例的最新州级数据,并使用 Python 库将其可视化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Patrick Assalé 在 Unsplash 上的照片

冠状病毒或新冠肺炎无需介绍。它已经被世卫组织宣布为疫情,在过去的几周里,从健康和经济角度来看,它的影响都是有害的。关于它已经写了很多,特别是关于它的指数增长和“”的重要性的统计报告。

截至目前,我们大多数人都呆在家里工作,以避免冠状病毒的传播。我决定利用剩余时间编写一个 Python 脚本,从印度政府卫生和家庭福利部的官方网站中提取新冠肺炎病例的最新数据,并使用流行的 Python 包(如 GeoPandas、Seaborn 和 Matplotlib)将其转化为有见地的可视化。

使用的包

  • Beautifulsoup —用于从 htmlxml 文件中提取数据的库。
  • Requests —用于在 python 中发出 HTTP 请求的库。
  • GeoPandas —一个用 python 处理地理空间数据的库。
  • PrettyTable —在视觉上吸引人的 ASCII 表格中快速而简单地表示表格数据。
  • 还有其他常规包像熊猫,Matplotlib,Seaborn。

如果您的系统上没有安装上述任何软件包,请按照相应链接中提到的安装说明进行操作。

(注意,Geopandas 进一步依赖于 fiona 进行文件访问,依赖于 笛卡尔 matplotlib进行绘图)

搜集数据

要使用 Python 抓取网站,您需要执行以下四个基本步骤:

  1. 向您想要抓取的网页的 URL 发送 HTTP GET 请求,该请求将以 HTML 内容进行响应。我们可以通过使用 Python 的请求库来做到这一点。
  2. 分析 HTML 标签及其属性,例如类、id 和其他 HTML 标签属性。此外,确定内容所在的 HTML 标签。
  3. 使用 Beautifulsoup 库获取和解析数据,并在某种数据结构(如字典或列表)中维护数据。
  4. 输出任何文件格式的数据,如 csv,xlsx,json 等。或者使用这些列表数据,使用 Seaborn/Matplotlib 库进行可视化。

如果你是网络抓取的新手,查看这个博客的逐步解释,可以帮助你开始使用 Python 进行网络抓取。

** [## 用 BeautifulSoup 从 HTML 中提取数据

如今,每个人都在谈论数据,以及它如何帮助学习隐藏的模式和新的见解…

www.pluralsight.com](https://www.pluralsight.com/guides/extracting-data-html-beautifulsoup)

跳入代码中

导入必要的库—

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import requests
from bs4 import BeautifulSoup
import geopandas as gpd
from prettytable import PrettyTable

网络抓取—

url = 'https://www.mohfw.gov.in/'*# make a GET request to fetch the raw HTML content*
web_content = requests.get(url).content*# parse the html content*
soup = BeautifulSoup(web_content, "html.parser")*# remove any newlines and extra spaces from left and right*
extract_contents = lambda row: [x.text.replace('\n', '') for x in row]*# find all table rows and data cells within*
stats = [] 
all_rows = soup.find_all('tr')for row in all_rows:
    stat = extract_contents(row.find_all('td')) *# notice that the data that we require is now a list of length 5*
    if len(stat) == 5:
        stats.append(stat)*#now convert the data into a pandas dataframe for further processing*new_cols = ["Sr.No", "States/UT","Confirmed","Recovered","Deceased"]
state_data = pd.DataFrame(data = stats, columns = new_cols)
state_data.head()

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我们继续之前,请注意抓取的数据列实际上是“string”数据类型。我们需要将它们转换成“int”数据类型。

state_data[‘Confirmed’] = state_data[‘Confirmed’].map(int)
state_data[‘Recovered’] = state_data[‘Recovered’].map(int)
state_data[‘Deceased’] = state_data[‘Deceased’].map(int)

您也可以选择使用漂亮的表格来展示数据

table = PrettyTable()
table.field_names = (new_cols)for i in stats:
    table.add_row(i)table.add_row([“”,”Total”, 
               sum(state_data[‘Confirmed’]), 
               sum(state_data[‘Recovered’]),
               sum(state_data[‘Deceased’])print(table)

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(这是撰写本文时最新的可用数据)

条形图—全州确诊病例总数

绘制水平条形图,显示全州确诊病例总数—

sns.set_style(“ticks”)
plt.figure(figsize = (15,10))plt.barh(state_data[“States/UT”],    state_data[“Confirmed”].map(int),align = ‘center’, color = ‘lightblue’, edgecolor = ‘blue’)plt.xlabel(‘No. of Confirmed cases’, fontsize = 18)
plt.ylabel(‘States/UT’, fontsize = 18)
plt.gca().invert_yaxis()
plt.xticks(fontsize = 14)
plt.yticks(fontsize = 14)
plt.title(‘Total Confirmed Cases Statewise’, fontsize = 18 )for index, value in enumerate(state_data[“Confirmed”]):
    plt.text(value, index, str(value), fontsize = 12)plt.show()

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

圆环图-全国确诊、恢复和死亡病例总数

group_size = [sum(state_data[‘Confirmed’]),
              sum(state_data[‘Recovered’]),
              sum(state_data[‘Deceased’])]group_labels = [‘Confirmed\n’ + str(sum(state_data[‘Confirmed’])),
                ‘Recovered\n’ + str(sum(state_data[‘Recovered’])),
                ‘Deceased\n’ + str(sum(state_data[‘Deceased’]))]custom_colors = [‘skyblue’,’yellowgreen’,’tomato’]plt.figure(figsize = (5,5))
plt.pie(group_size, labels = group_labels, colors = custom_colors)
central_circle = plt.Circle((0,0), 0.5, color = ‘white’)
fig = plt.gcf()
fig.gca().add_artist(central_circle)
plt.rc(‘font’, size = 12)
plt.title(‘Nationwide total Confirmed, Recovered and Deceased Cases’, fontsize = 20)plt.show()

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

全部确诊病例的氯普图

本文中用来绘制带有邦界的印度地图的形状文件可以从这里的 下载。

# reading the shape file of map of India in GeoDataFramemap_data = gpd.read_file(‘Indian_States.shp’)
map_data.rename(columns = {‘st_nm’:’States/UT’}, inplace = True)
map_data.head()

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我注意到一些州和联邦直辖区(UT)的名称以及形状文件中的名称与政府网站上的州名不一致。因此,我修改了地理数据框架中的州/UT 名称,以便与我们的州数据框架中的名称相匹配。

更正map _ datadata frame中各州的拼写——

*map_data[‘States/UT’] = map_data[‘States/UT’].str.replace(‘&’,‘and’)
map_data[‘States/UT’].replace(‘Arunanchal Pradesh’,
                              ‘Arunachal Pradesh’, inplace = True)
map_data[‘States/UT’].replace(‘Telangana’, 
                              ‘Telengana’, inplace = True)
map_data[‘States/UT’].replace(‘NCT of Delhi’, 
                              ‘Delhi’, inplace = True)
map_data['States/UT'].replace('Andaman and Nicobar Island', 
                              'Andaman and Nicobar Islands', 
                               inplace = True)*

合并州/UT 名称上的两个数据帧 state_datamap_data

*merged_data = pd.merge(map_data, state_data, 
                       how = ‘left’, on = ‘States/UT’)merged_data.fillna(0, inplace = True)
merged_data.drop(‘Sr.No’, axis = 1, inplace = True)
merged_data.head()*

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在印度地图上显示各州的数据—

*fig, ax = plt.subplots(1, figsize=(20, 12))
ax.axis(‘off’)ax.set_title(‘Covid-19 Statewise Data — Confirmed Cases’, 
             fontdict =  {‘fontsize’: ‘25’, ‘fontweight’ : ‘3’})merged_data.plot(column = ‘Confirmed’, cmap=’YlOrRd’, 
                 linewidth=0.8, ax=ax, edgecolor=’0.8', 
                 legend = True)
plt.show()*

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

完整的 Python 代码

结束注释

新冠肺炎还没有大规模袭击印度。缺失的数据使得预测未来几个月疫情将如何发展变得不可能。在我结束这篇文章的时候,我为印度和世界各地的每一个人的安全和幸福祈祷。**

编者注: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里

Python 中的冠状病毒谷歌趋势

原文:https://towardsdatascience.com/tracking-coronavirus-engagement-with-google-trends-in-python-5a4b08bc6977?source=collection_archive---------7-----------------------

谷歌搜索的州级分析

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

疾控中心unsplash 拍摄的照片

冠状病毒是一种在动物和人之间传播的病毒家族。症状包括发烧、咳嗽和轻微的呼吸道疾病。在严重的情况下,感染会导致肺炎和死亡。在写这篇文章的时候,美国疾病控制中心报告了 645 例病例和 25 例死亡。在传染病研究领域,社交媒体数据已被证明是预测感冒和流感季节开始和发展的有用指标。在本帖中,我们将使用谷歌趋势 API 来衡量各州对冠状病毒的参与度。

我们将使用 python Google trends API py trends 来分析州级的“冠状病毒”谷歌搜索。

要安装 pytrends,请打开命令行并键入:

pip install pytrends

接下来,打开一个 IDE(我使用 Spyder)并导入 pytrends:

from pytrends.request import TrendReq

接下来,我们指定主机语言、时区和有效负载。我们将主机语言指定为英语(“en-US”),时区为中部标准时区,即“360”,我们可以将 google 属性过滤器(gprop)保留为空字符串。我们还设置 category = 0,对应于与该关键字相关的所有类别。

让我们看看纽约 2020 年 2 月至 2020 年 3 月的“冠状病毒”数据:

pytrends = TrendReq(hl='en-US', tz=360)
pytrends.build_payload(['Coronavirus'], cat=0, timeframe='2020-02-01 2020-03-10',  gprop='', geo='US-NY')

然后,我们将数据框定义为结果 pytrends 对象,并打印前五行:

df = pytrends.interest_over_time()
print(df.head())

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们也可以使用 seaborn 和 matplotlib 来绘制搜索“冠状病毒”的时间序列:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pdsns.set()
df['timestamp'] = pd.to_datetime(df.index)
sns.lineplot(df['timestamp'], df['Coronavirus'])plt.title("Normalized Searches for Coronavirus in NY")
plt.ylabel("Number of Searches")
plt.xlabel("Date")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们对马萨诸塞州的“冠状病毒”做同样的事情:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以定义一个函数来获取任何状态的数据:

def get_searches(key_word, state):
    pytrends = TrendReq(hl='en-US', tz=360)
    pytrends.build_payload([key_word], cat=0, timeframe='2020-02-01 2020-03-10',  gprop='',geo='US-{}'.format(state))    
    df = pytrends.interest_over_time()

    print(df.head())

    sns.set()
    df['timestamp'] = pd.to_datetime(df.index)
    sns.lineplot(df['timestamp'], df[key_word])

    plt.title("Normalized Searches for {} in {}".format(key_word, state))
    plt.ylabel("Number of Searches")
    plt.xlabel("Date")

让我们为 NY、MA 和 CA 调用这个函数:

get_searches('Coronavirus', 'NY')
get_searches('Coronavirus', 'MA')
get_searches('Coronavirus', 'CA')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我就说到这里,但请随意从其他州提取数据。你也可以随意输入关键字。也许你会想搜索“冠状病毒症状”或“冠状病毒死亡率”。

结论

总之,在这篇文章中,我们使用 python 库“pytrends”提取了与关键词“冠状病毒”相对应的州级谷歌趋势数据。社交媒体数据,如谷歌趋势数据,可能有助于衡量公共卫生相关话题的社会参与度,如冠状病毒。这可能有助于卫生机构,如疾病预防控制中心,定量评估需求,分配资源和沟通预防措施。我希望你觉得这篇文章有用/有趣。这篇文章的代码可以在 GitHub 上找到。感谢您的阅读!

追踪新冠肺炎病毒在印度的传播

原文:https://towardsdatascience.com/tracking-covid-19-transmission-in-india-e9ec286b8df0?source=collection_archive---------36-----------------------

研究动态传播率以追踪新冠肺炎在整个次大陆的传播

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由欧蒂莉通过 Unsplash 拍摄

凯文·斯特罗姆最近发表了一篇名为“我们需要追踪新冠肺炎的一个指标”的文章。这种度量被称为可变传播率,被指定为 R_t。使用美国新冠肺炎的公共数据,Systrom 计算了每个州的有效 R_t 率,并探索了 R_t 在跟踪病毒传播方面的有效性。

除了这篇文章,Systrom 还发布了一个 Python 笔记本,这样其他人就可以即插即用他的实现了。以 Kaggle 最近按州和地区划分的印度新冠肺炎案例数据集为例,有一个完整的世界可供探索。

贝当古-里贝罗公司

Systrom 实现的特定算法最初由流行病学家团队 Bettencourt 和 Ribeiro 于 2008 年发表。他们提出了计算动态 R_t 的贝叶斯方法,该方法将考虑以前的 R_t 和新的观察值——每天新病例的数量——并相应地进行调整。如果您对算法背后的数学和完整推导感兴趣,我建议您浏览之前链接的 Python Notebook,甚至是 Bettencourt 和 Ribeiro 的原始论文。

简而言之,电流 R_t 由下式计算:

  • P(R_t|k) ~乘积 L(R_t|k)

Systrom 做了修改。从第 0 天开始跟踪 R_t 公司的原始模型。这有一些长期的影响。第 30 天的模型不会忘记第 1 天 R_t 的高值。这意味着 1 的行为就像一条渐近线,每个状态的 R_t 都是 1,不会更低。

为了对此进行调整,Systrom 让他的模型简单地使用 7 天的移动窗口。任何一天的 R_t 值将基于前 7 天的 R_t。这种可能性受到最高密度区间的限制,以说明数据的彻底性。给定更多的样本大小-更完整的数据集-我们将获得更小和更集中的最高密度区间。

将 Systrom 的算法映射到印度

印度的一项开源努力已经产生了一个开放的各邦新冠肺炎病例数据集。模块化代码使得清除印度数据并将其插入笔记本变得容易。要做的两个小调整是:

  1. 处理不同的日期格式
  2. 将每日新病例计数更改为累计病例计数。

从那里开始,事情变得简单明了,我能够为所有的印度州和地区制作一个运行的 R_t 图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当前印度各邦的 R_t。数据不足 5 天的州被排除在外。未分配的病例是指没有附加州的新冠肺炎诊断。

R_t 的效果如何?

在 2020 年 5 月 1 日发布的最新名单中,印度将各区分为红色区、橙色区和绿色区。红色区域是指病毒增长率高的地区,被划分为热点。绿色区域是指没有新的新冠肺炎病例的区域。橙色区域是有病例报告的地区,但病例比红色区域少。你可以在这里找到那个列表。利用这些分界线,我将这些州分为三类:

  • 红色州:红色区域比橙色或绿色区域多的州
  • 橙色州:橙色区域多于红色或绿色区域的州
  • 绿色州:绿色区域多于红色或橙色区域的州。

R_t 是衡量每一次新冠肺炎诊断会将病毒传播给多少人的指标。更高的 R_t 将意味着该州将是橙色或红色,因为病例数继续扩散。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个状态 R_t 的条形/须状图。排除最高密度间隔大于 1 的状态

查看该图,我们可以看到,以红色和橙色区域为主的邦往往具有较高的 R_t 值。对于绿色的昌迪加尔邦和恰蒂斯加尔邦,它们都具有较大的最高密度区间。这是因为数据较少,尤其是缺乏日常数据。至于橙色的邦,如旁遮普和泰米尔纳德邦,红色的区域是人口密度高的地区,那里更容易在人与人之间传播,这反映了较高的 R_t。

从一个州的层面来看 R_t 描绘了一幅相当准确的画面。那些 R_t 较高的邦也可能被印度政府指定为新冠肺炎热点。

牢记上下文

这是对病毒如何渗透到人群中的一个有价值的观察,现在的预防措施,如传播的锁定效应。还有一些重要的因素需要记住。

这个模型没有考虑测试。它接受第 k 个新案例,认为数字是准确的。事实上,印度的测试设置并不普遍,只有一定比例的人口接受过测试。毫无疑问,存在未诊断的病例,这将对 R_t 产生重大影响。

这个数据集很难追踪。印度是一个拥有超过 10 亿人口的大国。由于封锁,印度有数百万人被困,其中一些人步行数百英里从主要城市地区返回家园。这个数据集是一个非凡的开源成果,但很难保证它 100%准确,在跟踪像 R_t 这样的衍生工具时应该记住这一点。

未来的工作

我将来要寻找的东西将是如何通过这个模型来解释已经测试过的人口比例。考虑到这一点,我们会对新冠肺炎的传播率有一个更准确的了解。

感谢阅读!如果你喜欢,请随时关注我!你可以在推特@EswarVinnakota 上找到我。如果你想谈谈,请随时通过 DMs 联系我或在LinkedIn上与我联系。

使用 46,166 条推文追踪戴森的公众形象

原文:https://towardsdatascience.com/tracking-dysons-public-image-using-46-166-tweets-68af509923a6?source=collection_archive---------23-----------------------

Google 自然语言 API 和 BigQuery 的一课

这项工作是个人项目,与戴森没有任何关系

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

这个项目开始于新冠肺炎,就像现在所有的事情一样。鉴于我天赋的空闲时间,我决定唯一合理的方式就是编程。作为戴森学院的一名本科生,我认为看看公众如何看待更广泛的公司会很有趣。因此,带着价值 300 英镑的免费谷歌云积分,我决定尝试一下。

碰巧的是,我让我完成的代码运行的那一周是公司历史上裁员最多的一周。这并不意味着要轻视成百上千失去工作的人,它最终成为了这个项目的完美测试环境,并产生了一些非常有趣的结果。如果你不关心我是如何完成这项工作的,请跳到最后查看结果的分类。

我,以我无穷的智慧,决定将这个项目命名为“戴森-泰蒙特”。

项目概述

我在这里的目标是建立一个谷歌云项目,捕获所有包含“Dyson”一词的推文,进行一些基本的情感分析,并最终将其放入 BigQuery 数据库。主要的 Python 应用程序将是一个 Docker 容器,可以轻松可靠地部署到虚拟机上。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Dyson-timent 的逻辑架构(图片由作者提供)

正如你所看到的,即使是这样一个小项目,也有很多活动的部分。该图还遗漏了 Google Secret Manager,我用它来存储我所有的 Twitter API 密钥。

从 VM 实例到 BigQuery 数据库获取 Tweet 数据的管道是使用数据流模板建立的。Python 应用程序将 Tweet 数据(作为 JSON)发布到 Pub/Sub 主题,然后数据流为我处理导入到 BigQuery 的操作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用数据流模板抽象出数据处理任务(图片由作者提供)

使用这样的模板大大降低了我这边的复杂性,使我能够专注于项目的其余部分。这是使用 IAAS 提供商的众多卖点之一——他们带走了大量无聊的任务并进行设置。

谷歌主机说够了,我们来说代码。

代码

对于项目的复杂性来说,代码本身实际上并不复杂,因为大部分繁重的工作都是由 Google 的 API 处理的。我们所要做的就是调用它们,这是在 Python 中使用各种 Google Cloud 包完成的,这些包都是使用 pip 简单安装的。

谷歌云凭据

因为我希望在云中的 Docker 容器中运行之前能够在本地运行,所以我需要一种方法来处理两种不同的获取云凭证的方法。当应用程序启动时,它会寻找一个环境变量AM_I_IN_A_DOCKER_CONTAINER *。*这个变量是在 docker 文件中设置的,所以如果 Python 找到了它,应用程序肯定知道它正在云中运行,并相应地设置自己。

检测代码是否正在云中运行的策略

在云中运行时,所有凭证都由 VM 实例自动处理。在本地运行时,我使用从 Google Cloud IAM 下载的服务帐户凭证文件(上面的第 16 行),并将其传递给我所有的云服务。

Twitter 流媒体

设置 Twitter 流非常简单,因为文档非常棒。

与 Twitter 流相关的代码

我简单地建立了一个StreamListener-继承类,如图所示,给了OAuthHandler我的 API 密钥和令牌,并把它们全部传递给了一个Stream *。*然后通过向流传递一个tracklist来过滤流,它只是一个搜索字符串列表——在我们的例子中是[‘#Dyson’, ‘Dyson’]

这不是一个完美的解决方案,因为搜索不够智能,无法排除任何与詹姆斯·戴森或该公司无关的“戴森”的提及。然而,我的假设是,大多数包含“戴森”的推文将与我们相关。

此时,任何包含单词“Dyson”的 Tweets 都出现在Listener 类的on_data() 方法中,在这里我们可以对它们做一些有趣的事情。

下面是传入的 Tweets 从字符串解析成 JSON 后的样子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Python 应用程序在调试中捕获的推文(作者截图)

如你所见,仅仅一条推文就包含了大量的数据。我最终提取的字段只有created_atid_strtextuser*.*locationlang。这些给了我大量有价值的信息。

自然语言 API

在这个阶段,我们有来自 Tweet 的相关字段。现在开始处理。我写了一个小函数,analyse_sentiment使用他们的 Python 包将 Tweet 文本和语言代码发送给云自然语言 API

因为来自 Twitter 的语言代码包含在我对自然语言 API 的调用中,它可以分析世界上几乎任何语言的推文!我们不局限于简单的古英语。

从自然语言 API 中获取文本并计算和返回情感的函数

这是我喜欢现代云技术的另一个原因;你可以在一行代码(第 7 行)中完成非常复杂的事情,比如语言处理,只需要进入 Google 预先训练好的 ML 模型。

我使用的 API 端点最终返回两个值:情绪和信心。情绪从-1 到+1 排列,其中+1 表示非常积极,而-1 表示非常消极。置信度从 0 到 1 排序,并表示 ML 模型对情感分数正确的“确信”程度。

我做了一个(无可否认是武断的)决定,丢弃任何置信度低于 0.1 的推文,希望提高最终数据的质量。

谷歌地图 API

我从推文中提取的另一个非常有价值的数据是用户的位置。现在我必须承认,做这一切感觉非常老大哥。但是我做这些事是为了一个好的理由——我自己的好奇心。

user.location字段似乎由 Twitter 用户的输入填充,因为它的格式不一致。推文无所不包,从胡言乱语到“美国”到“苏格兰东海岸”。因此,这使得很难转换到适合分析的特定 GPS 坐标。

我又一次被谷歌 API 的魔力所拯救。Google Maps API 本质上允许您在 API 调用中进行 Google Maps 搜索。这是非常有用的,因为 G-Maps 擅长于获取模糊的地名,并给它们分配一个精确的 GPS 坐标。

analyse_sentiment方法类似,我创建了一个place_search 函数,它获取用户模糊的地名,将其提供给 Google Maps,并将返回的纬度/经度数据转换为 BigQuery 理解为位置数据的形式(我们并没有忘记这些数据最终会出现在哪里!).

这种格式就是“众所周知的文本表示”(由此而来的wkt_loc)。

这样一来,剩下唯一要做的事情就是发送一个包含所有情绪和位置数据的 JSON 字符串到 Pub/Sub 主题!

这显然不是全部代码,但是这篇文章越来越长了。完整的代码,请查看我的 GitHub repo。

让我们从细节上退一步。

我们现在有代码可以通过关键字/短语来传输和过滤推文,确定推文的情绪是积极还是消极,确定推文来源的一组合理的 GPS 坐标,然后将其发送并存储在数据库中。

我觉得这太酷了。

完成了!

代码完成后,就可以部署到容器优化的计算引擎上了。因为我只做了一次,所以我使用云控制台用我的项目的最新 Docker 构建来启动一个 VM 实例。于是,在 2020 年 7 月 18 日,它开始运行。

对我的工作感到满意,我让它大部分时间在后台运行,时不时地回来检查错误,以确保我没有太快用完我的谷歌云积分(我就是这样)。

然后,在 7 月 23 日,戴森宣布,由于新冠肺炎的影响,它将裁员 900 多人。这个项目通过 Twitter 捕捉到了所有这些。

经过整整 8 天的监控,以及 BigQuery 中处理和呈现的超过 46,000 条推文,当我只剩下最后 50 个信用点时,我终于决定拔掉插头。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

46166 条推文(作者截图)

是时候通过开放数据来看看这一切是否值得了。

数据

啊,我们期待已久的时刻。如果你是从上往下跳的,请再打个招呼。

随着数千条推文在我的 BigQuery 数据库中烧出一个洞,我开始分析数据。为此,我做了一个 Google Data Studio 项目,因为它非常容易与 BigQuery 交互,并且可以生成非常好看的 web 报告。

首先要做的是查看平均情绪和一段时间内推文数量的图表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据!请看相关的数据工作室项目(图片由作者提供)

你能看看那个吗?在大多数日子里,平均情绪徘徊在 0.1 至 0.3 之间,我们可以将其解释为总体积极的情绪。

然而,在裁员的那天(23 日),人气大幅下滑至-0.2!这清楚地表明代码正在工作!

不过,从 24 日开始,我们看到未来两天将出现大幅反弹,创下新高。推文数量也出现了大幅增长。这是为什么??我想不通。

我拥有的最后一点数据是每条推文的来源位置。我在我的 Data Studio 项目中设置了一个 Google Maps visualiser,用于查询数据库中的所有内容。点的颜色基于情感,其中-1 是深红色,0 是灰色,+1 是绿色。让我们来看看。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每条推文的位置。红色是阴性,灰色是中性,绿色是阳性(图片由作者提供)

我们来剖析一下这个。大多数推文来自英国、美国和日本。戴森在所有这些国家都有很强的影响力,所以这是意料之中的。

日本有着压倒性的积极情绪,整个国家都是绿色的。相比之下,英国似乎大多是红色和中性。典型的英国人,总是消极的。

这显示了每天的所有数据,所以让我们在这里按日期深入查看。下面的 gif 循环显示每天的信息。顶部的滑块告诉你它在 7 月的哪一天上映。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按日期分类的推文(按作者分类的图片)

很酷吧。

除了 23 号——宣布裁员的那一天,英国每天的情况都很复杂。全球似乎也普遍存在负面影响。

看看日本的反应,我们得到了 24 日和 25 日积极反弹的线索。日本总是非常绿色,但在那些日子里,它明显更密集的推文。

24 日日本发生了什么让大家这么积极?!

我在 Twitter 上搜索 7 月 24 日包含“Dyson”一词的日文推文。你瞧,我发现了下面的推文。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

导致推文数量激增的推文(作者截图)

21800 条转发?!这几乎是我收集的所有推文的一半!推特上说了什么?我用谷歌翻译了一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(作者截图)

谜团解开了!日本大型家用电器公司山田电机(Yamada Denki)向一名转发并关注其 Twitter 账户的幸运儿赠送了一台新的戴森吸尘器。该项目一定收集了每一条转发,以及由此引发的所有其他推文。

事实上,让我们找到更多的证据。我会在地图上搜索 24 号和 25 号之间的“yamada”这个词。根据推特,有 21800 人转发了这条微博。我们的数据库里应该有类似的数字。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在互动地图中搜索山田(图片由作者提供)

20700 条推文,还不错!在这一点上,这似乎是非常确凿的,你不同意吗?

总之…

对于基于云的项目来说,Google Cloud 是一个非常有价值的工具。易于访问的 API 和 tick-box 环境设置极大地减少了您需要做的(从根本上)非常复杂的工作,如情感分析。即使对我这样的初学者来说。

我希望你觉得这很有趣,甚至可能启发你做一个类似的项目!

如果你想玩交互式地图,请查看我的数据工作室项目

完整代码见我的 GitHub repo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值