TowardsDataScience-博客中文翻译-2020-三十一-

TowardsDataScience 博客中文翻译 2020(三十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

凸包:包装数据的创新方法

原文:https://towardsdatascience.com/convex-hull-an-innovative-approach-to-gift-wrap-your-data-899992881efc?source=collection_archive---------20-----------------------

如何利用包装算法实现数据可视化

什么是凸包?

假设我们有一组数据点。

检索自维基百科

想象一下,一根橡皮筋绕在这些钉子的周围。如果松开橡皮筋,它会在产生原始集合的紧密边界的点周围捕捉。

最终的形状是凸包,由接触橡皮筋创建的边界的点的子集描述。凸包是计算几何中普遍存在的结构。凸包在数据科学中有许多应用,例如:

  • 分类:给定一组数据点,我们可以通过确定每一类的凸包将它们分成不同的类
  • 避碰:通过定义物体的凸包来避免与其他物体的碰撞。
  • 图像处理和识别:图像处理的要求是鲁棒性、高识别率和捕捉图像中物体形状的灵活性。这正是凸包发挥作用的地方。

Scikit 图像中检索

Scikit 图像中检索

  • 定义地图上的聚类:地理信息系统,简称 GIS,存储地理数据,如国家的形状,山脉的高度。用凸包作为工具来定义不同区域的聚类,GIS 可以用来提取不同区域之间的信息和关系。

凸包还应用于其他领域,如数据挖掘、模式识别、人工智能、统计中异常值的检测等等。我希望凸包的应用能让你对这个工具感兴趣。更好的是。我们可以为我们的数据创建凸包!在开始写代码之前,让我们先了解一下凸包算法是如何工作的

格雷厄姆算法

格雷厄姆的扫描算法是一种计算平面中一组确定点的凸包的方法。

直觉:

  • 对于每个点,首先确定从这些点之前的两个点行进是否构成左转或右转

从维基百科检索

  • 如果是右转,倒数第二个点不是凸包的一部分,而是位于凸包内部。下图中,由于 D 相对于矢量 BC 做了一个右转C而不是凸包的一部分。

检索自维基百科

  • 然后我们将 D 与向量 BA 进行比较。由于 D 相对于矢量 BA 做了一个左转,D 被追加到凸包的栈中

检索自维基百科

伪代码:

代码使用ccw作为左转或右转的行列式。如果ccw > 0,那么新的点如果在前 2 点的左侧。ccw <0用于左侧,而ccw=0用于线性

检索自维基百科

你可以在这里更深入的了解算法

为您的数据创建一个凸包

让我们看看如何利用 Python 的库来存储数据。用scipy.spatial.ConvexHull:使用凸包极其容易

或者用skimage把图像变成凸包

Scikit-image 中检索

Scikit-image 中检索

太好了!我们把数据包装得像礼物一样好。现在,它可以作为“礼物”送给你的朋友或同事了。用你的数据试试这个,观察它的神奇之处!

结论:

恭喜你!您刚刚学习了凸包,这是处理数据的额外工具。数据科学并不总是一条线性回归线。大多数时候,你会处理杂乱的数据。因此,知道有哪些工具将会给你带来灵活性和控制数据的能力。

如果你对如何用 Python 编写这个算法很好奇,可以在我的 Github 资源库中找到并分叉源代码。在我的笔记本中,我详细解释了每段代码,并提供了算法所需的函数(逆时针、点类、从点到向量、叉积等)。也许理解了这段代码会让你有信心尝试其他计算几何算法,并用 Python 创建自己的模块?

我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以通过 LinkedInTwitter 与我联系。

如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:

[## 如何用 Altair 创建交互式剧情

在 5 行简单的 Python 代码中利用您的数据分析

towardsdatascience.com](/how-to-create-interactive-and-elegant-plot-with-altair-8dd87a890f2a) [## 什么是卓越的图形以及如何创建它

作为一名数据科学家,了解如何制作重要的图表至关重要

towardsdatascience.com](/what-graphical-excellence-is-and-how-to-create-it-db02043e0b37) [## 用于机器学习的线性代数:求解线性方程组

代数是机器学习算法的底线机制

towardsdatascience.com](/linear-algebra-for-machine-learning-solve-a-system-of-linear-equations-3ec7e882e10f) [## 如何从头开始构建矩阵模块

如果您一直在为矩阵运算导入 Numpy,但不知道该模块是如何构建的,本文将展示…

towardsdatascience.com](/how-to-build-a-matrix-module-from-scratch-a4f35ec28b56) [## 高效 Python 代码的计时

如何比较列表、集合和其他方法的性能

towardsdatascience.com](/timing-the-performance-to-choose-the-right-python-object-for-your-data-science-project-670db6f11b8e)

参考

[1]哈桑·弗莱耶。图像处理中的凸包:范围审查。研究门。2016 年 5 月

[2]维基百科。格雷厄姆扫描

[3] Jayaram,M.A. 图像处理中的凸包:范围审查。科学&学术出版。2016

高级卷积层概述

原文:https://towardsdatascience.com/convolution-layers-e2e5ba340565?source=collection_archive---------43-----------------------

卷积层总结,以跟踪计算机视觉文献中的关键发展和先进概念

卷积层是计算机视觉体系结构的基本构件。采用卷积层的神经网络被广泛应用于分割、重建、场景理解、合成、对象检测等等

这篇文章的目的是提供一个摘要 和概述最近文献中出现的高级卷积层和技术。为了完整起见,我们从卷积的基础开始,然而,更严格的解释可以从。

卷积:从数学上来说,卷积是将两个信号合并成一个信号的“运算”,下面是维基百科中的一个插图,它突出了两个函数/信号 f(t)和 f(t-z)之间的卷积。卷积来获得(f*g)(t)

来自维基百科的卷积

深度学习中的主要卷积运算有

  1. 《2D》卷积:

形象地说,我们将一个核(绿色大小)卷积“滑动”到一个图像(蓝色)上,并学习这些核的权重。该内核的空间范围(F)是 3,并且过滤器,即内核的深度是 1,因此权重的数量是 331=9。我们可以通过“步幅”跳过像素并填充原始图像的区域,这里步幅是 0

图像来源

的卷积块接受尺寸为 W1×H1×D1 的图像或特征图以及尺寸为(FFK)的核,并且典型地需要四个超参数:

  • 过滤器数量 K: K
  • 它们的空间范围 F: F
  • 大步走
  • 零填充的数量:P:如果我们对任何图像进行零填充
  • 参数数量是(通道FF)*K
  • 典型地,权重矩阵的形状是(F,F,通道,K)

这些操作组合起来提供了 W2H2D2 的最终输出特征图。工作细节见帖子

  • w2 =(W1 F+2P)/S+1 w2 =(W1 F+2P)/S+1
  • H2 =(H1 F+2P)/S+1 H2 =(H1 F+2P)/S+1

对于卷积,使用了两个额外的运算

  • Max-pool :该操作减少了图像的数量维度:通常使用“Max”pool 操作中的 22 滤波器。过滤器用该块的最大值替换图像/特征图中的每个 22 块,这减小了下一层的特征图的大小。
  • 非线性 (relu,tanh 等)在 max-pool 操作之前使用,以将非线性添加到操作中[ TODO: 未来工作:添加关于各种非线性性能的注释]

滤波器(F)的空间范围是每个核的权重数量的主要贡献者。正如 CS231n 讲义中所解释的,当 F=3 和 F=7 时,砝码数量增加了三倍。通常,完整的深度网络由多层 CONV + RELU +池操作组成,以提取特征。因此,通常 F=3 被用作在每层学习特征向量的折衷,而不增加计算成本。

请参阅 C231n 课堂讲稿上的计算考虑部分作为额外参考

CS231n notes 中很好地总结了使用这三层的对象分类任务的关键架构,它们是 LeNet、AlexNet、ZFNet、GoogLeNet、VGGnet、Resnet。这些都是为了赢得 Imagenet 挑战赛而开发的。这些年来,有一种趋势是更大/更深的网络来提高性能。

图片来自 Resnet 文章

剩余/跳过连接

这些是微软团队在 2015 年推出的,目的是在更深的网络中保持准确性,作为 ImageNet 挑战赛的一部分。单个网络跳过的连接如下所示,其目的是学习剩余 R(x)。在更深的网络中,这允许在每一层学习“残留信息”。因此得名剩余连接。这项技术已经通过实验证明可以提高更深层网络的准确性。实现剩余/跳过的连接非常简单,如下所示。跳过连接也让我们克服了深层渐变消失的问题,并加快了训练速度。自从最初引入以来,这一实验结果已经在一系列计算机视觉算法中被广泛采用。resnets 的变体在此帖子中突出显示,其他细节和插图请参见博客

*R(x)* = Output — Input = *H(x)* — *x***def** res_net_block(input_data, filters, conv_size): x = layers.Conv2D(filters, conv_size, activation='relu',
      padding='same')(input_data)
  x = layers.BatchNormalization()(x)
  x = layers.Conv2D(filters, conv_size, activation=**None**,   
      padding='same')(x)
  x = layers.BatchNormalization()(x)
  x = layers.Add()([x, input_data])
  x = layers.Activation('relu')(x)
  **return** x

以上各层是用于计算机视觉任务的神经网络的关键组件,并且在广泛的领域和不同的体系结构中找到应用。现在我们转向更专业的层面。

卷积转置/步进卷积

具有步幅(≥2)和/或填充的卷积运算降低了所得特征图的维度。卷积转置是用来学习核的反向过程,将特征上采样映射到更大的维度。通常采用步幅> 1 来对图像进行上采样,这一过程在下面由 Thom Lane 撰写的文章中有很好的说明,其中 22 输入与填充和步幅卷积与 33 内核一起产生 5*5 特征图

图片来源 : Thom Lane 的博文

步长卷积在不同领域有着广泛的应用

  1. U-nets (医学图像分割)
  2. 生成模型 : :生成器:解码器,上采样层

****实现:所有主要的 DL 框架都跨越了卷积,然后需要使用适当的初始化,即随机或 Xavier 初始化。

屏蔽和门控卷积

屏蔽和门控卷积在 2016 年左右开始流行,在那里,Aaron van den Oord 等人的开创性工作引入了像素 RNN 和像素 CNN。这些是自回归方法,以先前像素为条件从概率分布中采样像素。

参考像素 RNN

由于每个像素都是通过对先前像素进行调节而生成的,因此在应用卷积运算时,为了确保对来自左侧和顶部行的像素进行调节,使用了掩码。两种类型的遮罩是:遮罩 A,用于第一通道和先前像素。蒙版:B,蒙版 B 所有通道和先前的像素,下面的层,都可用这里

图片来自像素 RNN 2016

注意:输入必须二进制化:2⁸,例如 256 位颜色,或者每个样本在 RGB 图像中介于 0-256 之间

引入屏蔽门控卷积以避免屏蔽卷积中的盲点。 Ord 等人,2016 提出隔离水平和垂直堆栈,即具有 1*1 卷积的门,水平堆栈中有剩余连接,如下所示。垂直堆栈中的剩余连接没有提供额外的性能改进,因此没有实现。

van den Oord 等人 2016 年推出的门卷积块

屏蔽门卷积的实现是可用的在这里

****应用:主要用于解码器,例如用于 VAE 框架中的在先采样,以避免训练 GAN 的问题,例如模式崩溃,并生成高分辨率图像。

  1. ****像素 CNN 解码器:以先前值为条件的像素,导致更好的性能。需要在逐个像素的基础上进行更长的推断/采样。这些在 PixelCNN++ 中进行了优化,并在 Tensorflow Probability 上实现。
  2. 像素-VAE: 组合,每个维度是协方差矩阵的对角元素,这种高斯假设导致样本图像质量差,因此将传统解码器与 PixelCNN 组合,以帮助分布的“小尺度/相似”方面,这降低了对潜在学习更多全局信息的要求,通过改进 KL 项来证明,从而提高了性能。实现见此处
  3. VQ-VAE 和 VQ-瓦埃 2 :在 VAE 的潜在码图中使用 Pixel-CNN,避免了所有潜在变量的高斯假设,从而在更高维度中产生不同的图像。VQ-VAE 实现是由作者开源的,其他实现也是广泛可用的

可逆卷积

基于归一化流的可逆卷积目前被应用于生成模型中,以学习计算机视觉中图像的潜在概率分布 p(x)。维护动机是提供更好的损失函数,即负对数似然。

两个最常见的生成框架建模遭受近似推理时间问题,即 VAE 的损失函数函数(基于证据的下界,即 ELBO)是对数似然的下界的近似,因此推理/重建是近似。在 GAN 的方法中采用的对抗损失是基于“搜索”的方法,并且遭受采样多样性的问题,并且难以训练,即模式崩溃。

标准化流量的数学预备知识在斯坦福课堂笔记中有最好的概述,这里,我们使用那里的摘要。

归一化流程中,随机变量 Z 和 X 之间的映射,由函数 f 给出,参数化θ,它是确定的和可逆的,使得

****

然后,使用变量公式的变化,可以获得 X 和 Z 的概率分布,在这种情况下,两个概率分布通过行列式项相关。不严格地说,决定因素是“比例”或标准化常数。

这里,

  1. ****“标准化”意味着变量的变化在应用可逆变换后给出了标准化的密度
  2. ****“流”表示可逆变换可以相互组合,以创建更复杂的可逆变换。

注:函数可以是单个函数,也可以是一系列序列函数,通常是从简单的(如潜在向量(Z ))到复杂分布(如(X)图像)的变换。这个公式允许我们“精确地”在两个分布之间进行变换,从而可以推导出负对数似然损失函数,推导见讲座

标准化流量和神经网络:Dinh 等人,2014 年(NICE)和 Dinh 等人,2017 年(Real-NVP)的工作,开始提供神经网络架构,采用标准化流量进行密度估计。Kingma 等人的 Glow 是当前(2018 年)的技术水平,它建立在这些作品的基础上,其中引入了 1*1 可逆卷积来合成高分辨率图像。

发光关节参考

可逆卷积的 Glow 实现

对于 1*1 学习可逆卷积,关键的新颖之处在于减少了权重矩阵的行列式项的计算成本。这是通过对权重矩阵进行置换的 LU 分解,即 PLU 分解来实现的。随机排列被用来在每次迭代中保持“流动”。数学细节包含在论文的第 3.2 节中,它们还提供了一个使用 numpy 和 tensorflow 的实现,以便于查询。

这些由 Hoogeboom 等人进一步推广为 N*N 卷积,更多细节和实现(带优化)请见博文。我们的目的只是为了突出这些模型,更全面的细节我们请读者参考 CS236 讲座 78 以及 Glow 论文和 Lilian Weng 的博客文章

****应用领域:图像合成与生成建模

用于图像处理的卷积神经网络——使用 Keras

原文:https://towardsdatascience.com/convolution-neural-network-for-image-processing-using-keras-dc3429056306?source=collection_archive---------1-----------------------

Python 中使用 CNN 的综合指南

美国地质勘探局在 Unsplash 上拍摄的照片

什么是图像分类?

图像分类是根据图像的特征将图像分成不同类别的过程。特征可以是图像中的边缘、像素强度、像素值的变化等等。稍后,我们将尝试理解这些组件。现在让我们看看下面的图片(参见图 1)。这三幅图像属于同一个人,但是当在诸如图像颜色、面部位置、背景颜色、衬衫颜色等特征之间进行比较时,这三幅图像会有所不同。处理图像时最大的挑战是这些特征的不确定性。对于人眼来说,看起来都是一样的,但是,当转换为数据时,您可能不容易在这些图像中找到特定的模式。

图一。分别说明了作者在 2014 年和 2019 年拍摄的肖像。

图像由称为像素的最小的不可分割的片段组成,并且每个像素具有通常称为像素强度的强度。每当我们研究数字图像时,它通常带有三个颜色通道,即红绿蓝通道,俗称“RGB”值。为什么是 RGB?因为已经看到这三者的组合可以产生所有可能的调色板。每当我们处理彩色图像时,图像由多个像素组成,每个像素由 RGB 通道的三个不同值组成。让我们编码并理解我们正在谈论的内容。

import cv2
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
sns.set(color_codes=True)# Read the image
image = cv2.imread('Portrait-Image.png') #--imread() helps in loading an image into jupyter including its pixel valuesplt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
# as opencv loads in BGR format by default, we want to show it in RGB.
plt.show()image.shape

image.shape 的输出是(450,428,3)。图像的形状是 450 x 428 x 3,其中 450 代表高度,428 代表宽度,3 代表颜色通道的数量。当我们说 450 x 428 时,这意味着数据中有 192,600 个像素,每个像素都有一个 R-G-B 值,因此有 3 个颜色通道。

image[0][0]

image [0][0]为我们提供了第一个像素的 R-G-B 值,分别为 231、233 和 243。

# Convert image to grayscale. The second argument in the following step is cv2.COLOR_BGR2GRAY, which converts colour image to grayscale.
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
print(“Original Image:”)plt.imshow(cv2.cvtColor(gray, cv2.COLOR_BGR2RGB))
# as opencv loads in BGR format by default, we want to show it in RGB.
plt.show()gray.shape

gray.shape 的输出为 450 x 428。我们现在看到的是一个由 192,600 多个像素组成的图像,但只包含一个通道。

当我们尝试将灰度图像中的像素值转换成表格形式时,我们观察到的就是这样的情况。

import numpy as np
data = np.array(gray)
flattened = data.flatten()flattened.shape

输出:(192600,)

我们有一个数组形式的所有 192,600 个像素的灰度值。

flattened

输出:数组([236,238,238,...,232,231,231],dtype=uint8)。注意灰度值可以在 0 到 255 之间,0 表示黑色,255 表示白色。

现在,如果我们拍摄多个这样的图像,并尝试将它们标记为不同的个体,我们可以通过分析像素值并在其中寻找模式来做到这一点。然而,这里的挑战是由于背景、色阶、服装等。图像之间各不相同,仅通过分析像素值很难找到模式。因此,我们可能需要一种更先进的技术,可以检测这些边缘或找到面部不同特征的潜在模式,使用这些模式可以对这些图像进行标记或分类。这就是像 CNN 这样更先进的技术发挥作用的地方。

CNN 是什么?

CNN 或卷积神经网络(CNN)是一类深度学习神经网络。简而言之,将 CNN 视为一种机器学习算法,它可以接受输入图像,为图像中的各个方面/对象分配重要性(可学习的权重和偏差),并能够区分它们。

CNN 的工作原理是从图像中提取特征。任何 CNN 都包含以下内容:

  1. 作为灰度图像的输入图层
  2. 输出层是一个二进制或多类标签
  3. 隐藏层由卷积层、ReLU(校正线性单位)层、汇集层和完全连接的神经网络组成

理解由多个神经元组成的 ANN 或人工神经网络不能从图像中提取特征是非常重要的。这就是卷积层和池层结合的地方。类似地,卷积和池层不能执行分类,因此我们需要一个完全连接的神经网络。

在我们深入了解这些概念之前,让我们试着分别理解这些单独的部分。

图二。说明了 CNN 从输入到输出数据的过程。图片摘自幻灯片 12《卷积神经网络简介》(斯坦福大学,2018 年)

假设我们可以访问不同车辆的多个图像,每个图像都被标记为卡车、轿车、货车、自行车等。现在的想法是利用这些预先标记/分类的图像,开发一种机器学习算法,该算法能够接受新的车辆图像,并将其分类到正确的类别或标签中。现在,在我们开始构建神经网络之前,我们需要了解大多数图像在处理之前都被转换为灰度形式。

[## 对于数据科学的工作,你的编码技能够好吗?

5 编码嗅探如果你在数据科学行业工作,你必须知道

towardsdatascience.com](/are-your-coding-skills-good-enough-for-a-data-science-job-49af101457aa)

为什么是灰度而不是 RGB/彩色图像?

图 3。图像的 RGB 颜色通道。图像鸣谢—萨哈,S. (2018)

我们之前讨论过,任何彩色图像都有三个通道,即红色、绿色和蓝色,如图 3 所示。有几种这样的颜色空间,如灰度、CMYK、HSV,图像可以存在于其中。

具有多个颜色通道的图像面临的挑战是,我们有大量的数据要处理,这使得该过程计算量很大。在其他世界中,可以把它想象成一个复杂的过程,其中神经网络或任何机器学习算法必须处理三种不同的数据(在这种情况下是 R-G-B 值),以提取图像的特征并将它们分类到适当的类别中。

CNN 的作用是将图像简化为一种更容易处理的形式,而不会丢失对良好预测至关重要的特征。当我们需要将算法扩展到大规模数据集时,这一点非常重要。

什么是卷积?

图 4。说明了如何对输入图像进行卷积以提取特征。学分。GIF via GIPHY

我们知道训练数据由灰度图像组成,这些图像将作为卷积层的输入来提取特征。卷积层由一个或多个具有不同权重的核组成,用于从输入图像中提取特征。假设在上面的例子中,我们正在使用大小为 3 x 3 x 1 (x 1,因为我们在输入图像中有一个颜色通道)的内核(K),权重如下所示。

Kernel/Filter, K = 
1  0  1
0  1  0
1  0  1

当我们基于核的权重在输入图像上滑动核(假设输入图像中的值是灰度强度)时,我们最终基于不同像素的周围/相邻像素值来计算不同像素的特征。例如,如下图 5 所示,当第一次对图像应用核时,我们在如下所示的卷积特征矩阵中得到等于 4 的特征值。

图 5。说明了当内核应用于输入图像时卷积特征的值。该图像是上面图 4 中使用的 GIF 的快照。

如果我们仔细观察图 4,我们会看到内核在图像上移动了 9 次。这个过程叫做大步前进。当我们使用步长值为 1 ( 非步长)的操作时,我们需要 9 次迭代来覆盖整个图像。CNN 自己学习这些核的权重。 该操作的结果是一个特征图,它基本上从图像中检测特征,而不是查看每一个像素值。

I 图像特征,如边缘和兴趣点,提供了图像内容的丰富信息。它们对应于图像中的局部区域,并且在图像分析的许多应用中是基本的:识别、匹配、重建等。图像特征产生两种不同类型的问题:图像中感兴趣区域的检测,通常是轮廓,以及图像中局部区域的描述,通常用于不同图像中的匹配(图像特征。(未注明)

让我们更深入地了解一下我们正在谈论的内容。

从图像中提取特征类似于检测图像中的边缘。我们可以使用 openCV 包来执行同样的操作。我们将声明一些矩阵,将它们应用于灰度图像,并尝试寻找边缘。你可以在这里找到关于功能的更多信息。

# 3x3 array for edge detection
mat_y = np.array([[ -1, -2, -1], 
                   [ 0, 0, 0], 
                   [ 1, 2, 1]])
mat_x = np.array([[ -1, 0, 1], 
                   [ 0, 0, 0], 
                   [ 1, 2, 1]])

filtered_image = cv2.filter2D(gray, -1, mat_y)
plt.imshow(filtered_image, cmap='gray')filtered_image = cv2.filter2D(gray, -1, mat_x)
plt.imshow(filtered_image, cmap='gray')

图 6。对数据应用 filter2D 变换时,显示带有边缘的图像。请注意,这两个图像明显不同。当我们谈论卷积层和内核时,我们主要是想识别图像中的边缘。使用 CNN 时,matrix_x 和 matrix_y 值由网络自动确定。图片取自作者开发的 Jupyter 笔记本。

import torch
import torch.nn as nn
import torch.nn.functional as fn

如果您使用的是 windows,请安装以下软件—# conda install pytorch torch vision cudatoolkit = 10.2-c py torch 以使用 py torch。

import numpy as np
filter_vals = np.array([[-1, -1, 1, 2], [-1, -1, 1, 0], [-1, -1, 1, 1], [-1, -1, 1, 1]])
print(‘Filter shape: ‘, filter_vals.shape)# Neural network with one convolutional layer and four filters
class Net(nn.Module):

 def __init__(self, weight): #Declaring a constructor to initialize the class variables
 super(Net, self).__init__()
 # Initializes the weights of the convolutional layer to be the weights of the 4 defined filters
 k_height, k_width = weight.shape[2:]
 # Assumes there are 4 grayscale filters; We declare the CNN layer here. Size of the kernel equals size of the filter
 # Usually the Kernels are smaller in size
 self.conv = nn.Conv2d(1, 4, kernel_size=(k_height, k_width), bias=False)
 self.conv.weight = torch.nn.Parameter(weight)

 def forward(self, x):
 # Calculates the output of a convolutional layer pre- and post-activation
 conv_x = self.conv(x)
 activated_x = fn.relu(conv_x)# Returns both layers
 return conv_x, activated_x# Instantiate the model and set the weights
weight = torch.from_numpy(filters).unsqueeze(1).type(torch.FloatTensor)
model = Net(weight)# Print out the layer in the network
print(model)

我们创建可视化层,调用类对象,并在图像上显示四个内核的卷积的输出(Bonner,2019)。

def visualization_layer(layer, n_filters= 4):

    fig = plt.figure(figsize=(20, 20))

    for i in range(n_filters):
        ax = fig.add_subplot(1, n_filters, i+1, xticks=[], yticks=[])
        # Grab layer outputs
        ax.imshow(np.squeeze(layer[0,i].data.numpy()), cmap='gray')
        ax.set_title('Output %s' % str(i+1))

卷积运算。

#-----------------Display the Original Image------------------- 
plt.imshow(gray, cmap='gray')#-----------------Visualize all of the filters------------------
fig = plt.figure(figsize=(12, 6))
fig.subplots_adjust(left=0, right=1.5, bottom=0.8, top=1, hspace=0.05, wspace=0.05)for i in range(4):
    ax = fig.add_subplot(1, 4, i+1, xticks=[], yticks=[])
    ax.imshow(filters[i], cmap='gray')
    ax.set_title('Filter %s' % str(i+1))

# Convert the image into an input tensor
gray_img_tensor = torch.from_numpy(gray).unsqueeze(0).unsqueeze(1)
# print(type(gray_img_tensor))# print(gray_img_tensor)# Get the convolutional layer (pre and post activation)
conv_layer, activated_layer = model.forward(gray_img_tensor.float())# Visualize the output of a convolutional layer
visualization_layer(conv_layer)

输出:

图 7。说明了原始灰度图像上不同过滤器的输出。快照是使用 Jupyter Notebook 和上述代码生成的。

注意:根据与过滤器相关联的权重,从图像中检测特征。请注意,当图像通过卷积层时,它会尝试通过分析相邻像素强度的变化来识别特征。例如,图像的右上角始终具有相似的像素强度,因此没有检测到边缘。只有当像素改变强度时,边缘才可见。

为什么是 ReLU?

ReLU 或整流线性单元是应用激活函数来增加网络的非线性而不影响卷积层的感受野的过程。ReLU 允许更快地训练数据,而 Leaky ReLU 可以用来处理消失梯度的问题。其他一些激活函数包括泄漏 ReLU、随机化泄漏 ReLU、参数化 ReLU 指数线性单位(eLU)、缩放指数线性单位 Tanh、hardtanh、softtanh、softsign、softmax 和 softplus。

图 8。说明了 ReLU 的影响,以及它如何通过将负值转换为零来消除非线性。图片来源:GIF via Gfycat。

visualization_layer(activated_layer)

图 9。说明了 ReLU 激活后卷积层的输出。图片取自作者开发的 Jupyter 笔记本。

图 10。阐释了内核如何处理具有 R-G-B 通道的图像。图像鸣谢—萨哈,S. (2018)

图 11。在 5 x 5 图像上应用 3 x 3 内核。图片致谢(Visin,2016)

卷积运算的一般目标是从图像中提取高级特征。在构建神经网络时,我们总是可以添加多个卷积层,其中第一个卷积层负责捕获梯度,而第二个卷积层捕获边缘。图层的添加取决于图像的复杂程度,因此添加多少图层没有什么神奇的数字。注意,应用 3 x 3 滤波器会在原始图像中产生 3 x 3 卷积特征,因此为了保持原始尺寸,通常会在图像两端填充值。

池层的作用

池层对通常被称为激活图卷积特征应用非线性下采样。这主要是为了降低处理与图像相关的大量数据所需的计算复杂度。合用不是强制性的,通常是避免的。通常,有两种类型的池,最大池,返回池内核覆盖的图像部分的最大值,以及平均池平均池内核覆盖的值。下面的图 12 提供了一个不同的池技术如何工作的工作示例。

图 12。说明了如何在激活图上执行最大和平均池。图片摘自幻灯片 18《卷积神经网络简介》(斯坦福大学,2018 年)

图像展平

一旦汇集完成,输出需要被转换成表格结构,人工神经网络可以使用该表格结构来执行分类。注意密集层的数量以及神经元的数量可以根据问题陈述而变化。此外,通常还会添加一个删除层,以防止算法过拟合。退出者在训练数据时会忽略一些激活图,但是在测试阶段会使用所有的激活图。它通过减少神经元之间的相关性来防止过度拟合。

图 13。展示了一个完整的 CNN,由输入图像、卷积层、汇集层、展平层、带有神经元的隐藏层和二进制输出层组成。这张图片是作者使用清晰图表制作的,可以在这里找到。

使用 CIFAR-10 数据集

下面的链接提供了一个使用 Keras 与 CNN 合作的端到端示例。

[## angeleastbengal/ML-项目

github.com](https://github.com/angeleastbengal/ML-Projects/blob/master/Understanding Image Processing %2B CNN.ipynb) [## 使用 Python 实现决策树分类器和成本计算剪枝

使用成本计算修剪构建、可视化和微调决策树的完整实践指南…

towardsdatascience.com](/decision-tree-classifier-and-cost-computation-pruning-using-python-b93a0985ea77) [## ML 行业实际使用的图像处理技术有哪些?- neptune.ai

处理可用于提高图像质量,或帮助您从中提取有用的信息。这是…

海王星. ai](https://neptune.ai/blog/what-image-processing-techniques-are-actually-used-in-the-ml-industry)

参考

  1. 萨哈,S. (2018)。卷积神经网络综合指南 ELI5 方式。[在线]走向数据科学。可在:https://towardsdatascience . com/a-comprehensive-guide-to-convolutionary-neural-networks-the-Eli 5-way-3bd 2 b 1164 a 53 获取。
  2. ‌Image 特色。(未注明)。【在线】可在:http://morpheo . inrialpes . fr/~ Boyer/Teaching/Mosig/feature . pdf .
  3. ‌Stanford 大学(2018 年)。卷积神经网络介绍。[在线]可从以下网址获取:https://web . Stanford . edu/class/cs 231 a/lections/intro _ CNN . pdf
  4. 弗兰切斯科·‌visin(2016)。英语:卷积运算的一种变体的动画。蓝色贴图是输入,青色贴图是输出。【在线】维基共享。可从以下网址获取:https://commons . wikimedia . org/wiki/File:Convolution _ algorithm - Same _ padding _ no _ strides . gif【2020 年 8 月 20 日获取】。
  5. ‌Bonner 大学(2019 年)。深度学习完全初学者指南:卷积神经网络。【在线】中等。可从:https://towardsdatascience . com/wtf-is-image-class ification-8e 78 a 8235 ACB 获取。

关于作者:高级分析专家和管理顾问,帮助公司通过对组织数据的商业、技术和数学的组合找到各种问题的解决方案。一个数据科学爱好者,在这里分享、学习、贡献;你可以和我在 上联系 上推特

卷积神经网络数学直觉

原文:https://towardsdatascience.com/convolution-neural-network-maths-intuition-6b047cb48e90?source=collection_archive---------29-----------------------

我花了很长时间才明白 CNN 是如何运作的。相信我,这上面的内容少得令人难以置信,真的很少。无论在哪里,他们都会告诉你在 CNN 中前向传播是如何工作的,但从来没有开始向后传播。不了解全貌,一个人的理解总是半吊子。

先决条件

  1. 应熟悉 CNN 的基础知识——卷积层、最大池、全连接层。做一个基本的谷歌搜索,理解这些概念。应该需要一个小时左右才能开始。
  2. 微分学——应该知道链式法则是如何工作的,以及微分的基本规则。
  3. 应该知道反向传播数学在人工神经网络中的实际工作原理。如果你不知道的话,我强烈推荐你阅读我之前关于这个的文章。

本文性质

所以,我对其余文章的主要问题是——它们没有提到整体流程。每一层和概念都得到了很好的解释,但是反向传播是如何跨层工作的——这方面的信息缺失了。所以,对我来说,很难想象错误是如何从整体上回流的。因此,这篇文章将采取 CNN 的几个场景,并试图让你了解整个流程。

目的不是覆盖深度,而是覆盖广度和整体流程。至于深度,我会在需要的地方给你指出相关的文章,以帮助你有更深的直觉。把这篇文章当作 CNN 数学的索引。只是为了清楚地设定期望,这不会是一个 5 分钟的阅读。但是,我会要求你在需要的时候阅读相关的文章。

场景 1: 1 个卷积层+ 1 个全连接层

作者图片

前进传球

x 是输入图像,比如说(33 矩阵),滤波器是 a (22 矩阵)。两者都将被卷积以给出输出 XX (2*2 矩阵)。

现在,XX 将被拉平,并馈入一个以 w (1*4 矩阵)为权重的全连通网络,该网络将给出一个—输出。

最后,我们将通过计算 Y(预期)和输出(实际)之间的均方误差来计算误差。

作者图片

我强烈建议你自己计算 XX。这会给你一个卷积层的直觉。

[## 人类的未来是基因工程和神经移植|数据驱动投资者

领先的技术、音乐和电影节将于 2020 年 3 月 13 日至 22 日举行。它将以前沿的谈话为特色…

www.datadriveninvestor.com](https://www.datadriveninvestor.com/2020/01/13/the-future-of-humanity-is-genetic-engineering-and-neural-implants/)

偶数道次

向后传递的目标是选择 滤镜w这样我们就可以减少* E 了。基本上,我们的目标是如何改变 w 和滤波器,使 E 降低。*

作者图片

让我们从第一个学期开始。

作者图片

猜猜怎么回事?!

第 1 行:使用链式法则。
第二行:运用微分学。花一分钟在这上面。应该很容易理解。如果不是查我以前的文章(前提中提到的)。或者检查这个一个

在下一步之前,一定要确保你自己做了这些计算。如果这不容易理解,请评论。

移到第二学期。

作者图片

不在办公室/假面骑士..这里有太多奇怪的逻辑吗?跟着我,会帮助你理解这一点。

第 1 行:基本链规则
第 2 行:第一项和第三项位于上述计算本身的线上。再次花一分钟或在纸上做它来理解这一点。

现在,这个转 w 到底是什么鬼!?我花了很长时间才明白这是怎么计算出来的。为此,您只需按照提到的顺序浏览这些概念。

  1. 转置卷积—输出为[11 矩阵],XX 为[14 矩阵(因为这里被扁平化)],对。所以,当我们反向传播时,我们增加了矩阵的大小。转置卷积有助于此。快进视频,看看他们进行转置卷积的逻辑。
  2. 现在深呼吸,通读这是理解计算输出如何随过滤器和 x 变化的直觉的最重要的一个粘贴上面文章的结论。JFYI,不要被全卷积弄糊涂了,它只不过是转置卷积(你刚刚在上面理解的)。

来源

最后,我们可以像这样减小滤波器和 w 值。

作者图片

场景 2–2 个卷积层+ 1 个全连接层

作者图片

现在,添加尽可能多的卷积层,我们的方法将保持不变。像往常一样,目标是:

作者图片

前面两项我们已经计算过了。让我们看看最后一个学期的公式是什么。

作者图片

以防你需要深入研究这个。我推荐这篇文章。并相应地计算新的 F1、F2 和 w。

场景 3—最大池层如何??

最大池是 CNN 的一个重要概念,反向传播是如何实现的?

作者图片

仔细想想,max pooling layer 中没有像 filters 这样的变量。所以,我们不需要在这里调整任何值。

但是,它影响了我以前的层,对不对?!它通过将矩阵中的几个元素合并成一个数字来减小矩阵的大小。基本上,它确实会影响反向传播。它说有非最大值的值不会有任何梯度。

所以,我们在这里说的是,所有没有最大值的值都是 0。更有深度

作者图片

已经尝试把所有好的相关文章放在一个地方,并帮助你看到卷积的全貌。请仔细阅读以上内容,如果在整个流程中仍然缺少一些东西,请告诉我——我很乐意编辑它以适应相同的内容。

卷积神经网络

原文:https://towardsdatascience.com/convolutional-neural-network-1368ee2998d3?source=collection_archive---------36-----------------------

理解层背后的直觉

1950 年,艾伦·图灵提交了一篇名为 的论文图灵测试, 其中他为机器被称为智能机器奠定了基础。尽管在人工智能领域取得了突破,但即使在今天,机器也不能被视为智能的。神经网络是人工智能的一个领域,旨在模仿人体的大脑结构。人工神经网络(ANN)是神经网络的一种基本类型,它能有效地发现数据中的隐藏模式并给出结果。

注意:本文假设读者对神经网络有基本的了解

一个问题仍然存在,即使机器可以处理和理解给它们的数据,但它们有能力像人类一样看东西吗?

是的!为机器提供视觉似乎是一件荒谬的事情,但一种叫做 卷积神经网络 的神经网络赋予了机器部分视觉。

既然一个图像只是数值像素值的集合,ANN 的就不能处理吗?这个问题的答案是不!虽然人工神经网络对数值数据分类很好,但在处理图像时缺乏对空间关系的考虑。我来简化一下。在处理图像列表时,如果 ANN 发现一只猫出现在一幅图像的右上角,那么它将假设它将一直出现在那里。因此,无论你的猫在图像的哪个位置,如果它不能在右上角找到它,那么它将给出一个否定的结果。

另一方面,卷积神经网络,也称为 ConvNet 在图像中的任何地方寻找物体时表现都异常出色。还有,如果你的猫脾气暴躁也不用担心,它还是会识别的。

图片来源:Adesh desh pande viaGitHub(麻省理工)

上图展示了 ConvNet 的基本架构,其中包含池化、FC 层、卷积等术语,乍一看似乎令人不知所措。本文旨在揭开这些术语的神秘面纱,并获得使用它们背后的直觉。

入门,先来了解一下我们在给网络喂什么!

安德烈·迈克在 Unsplash 上的照片

我们看到的图像看起来很迷人。但机器不是这么看的。它将其视为代表颜色通道强度值的数字像素值的集合。这张图片的尺寸是 5999 x 4000 x 3;其中 3 表示颜色通道的数量,即 RGB。其他颜色通道可以是 HSV、灰度等等。

机器如何从像素值中提取特征?

在数学中,一个称为卷积的概念将两个函数考虑在内,并产生第三个函数来表达一个函数的形状如何受另一个函数的影响。想象一下将滤镜应用到照片上。这里发生的是,它采取你的照片,并应用过滤器的功能,这可能是为了突出阴影。滤镜激活图像的某些功能,并生成输出图像。

那么问题来了,这些滤镜是什么? 滤镜只不过是具有特定值的 3D 矩阵,当它们在附近看到想要的图案时会变得兴奋。它们比在图像的宽度和高度上滑动的输入图像小得多。

用 3×3 滤波器对 5×5 图像进行卷积运算。摄影:Rob Robinson on MLNoteBook

当滤镜滑过图像时,它会聚焦在图像的某个邻域。它执行过滤器和图像部分的算术运算,并将结果存储在单个单元格中。在技术术语中,细胞被视为神经元。多个这样的神经元,当组合在一起时,形成了一个 2D 矩阵,称为激活图/特征图,或者更确切地说,我会说是来自图像的过滤器的喜好的集合单个神经元指向的邻域称为局部感受野。

算术运算和局部感受野。Rob Robinson 在 MLNoteBook 上拍摄的照片

这个特征图是一个过滤器提取特征的结果。对于卷积图层,会使用多个要素,进而生成多个要素地图。要素地图堆叠在一起,作为输入传递给下一个图层。

过滤器的数量越多,特征图的数量就越多,特征的提取就越深入。

输出图像的大小会发生什么变化?

卷积运算。图片作者: GitHub 上的 vdumoulin (麻省理工学院)

卷积运算后,输出图像的尺寸必然会减小。控制输出音量大小的参数是步幅、滤波器大小和填充。

  1. 步幅:步幅是我们滑动滤镜时移动的像素数。当步幅为 2 时,我们将过滤器移动 2 个像素。步幅越高,输出音量越小。通常,我们将步幅设置为 1 或 2。
  2. 过滤器大小:当我们增加过滤器大小时,我们间接增加了单个神经元中存储的信息量。在这种情况下,滤镜在图像上移动的次数会减少。这将最终导致输出体积的空间尺寸的减小。

填充 1

3.填充:顾名思义,它在原始图像周围添加一个无关紧要的覆盖物,以保持输出图像的大小不变。使用公式 计算要添加的层数 P=(((O-1)S)+F-W)/2* 其中 O 是输出图像的大小,W 是输入图像的大小,F 是滤波器大小,P 是要作为填充添加的层像素的数量,S 是跨距。例如,如果输入图像的大小是 5×5,过滤器的大小是 3×3,步幅是 1,并且我们希望输出图像的大小与输入图像的大小相同,则有效填充将是 1。

现在我们已经完成了图片的大部分工作,是时候考虑下一步了。

我们渴望让我们的神经网络变得灵活,也就是说,无论数据是什么,它都应该足够有效地从数据中进行识别。由于我们拥有的特征地图可以用一些线性函数来表示,不确定性因素似乎消失了。我们需要函数将不确定性,或者我应该说是非线性引入我们的神经网络。

有许多函数能够执行此任务,但这两个函数被广泛使用。

Sigmoid :它使用 g(z)=1/1+e⁻ᶻ函数引入非线性,该函数将数字转换为 0-1 之间的范围。Sigmoid 函数的主要问题之一是 消失梯度问题 。如果你不熟悉这个术语,不要担心。由奇-汪锋撰写的这篇文章解释了渐变消失的现象。

Sigmoid 函数图

ReLU: ReLU 代表整流线性单元。它使用函数 g(w)=max(0,w)将输入阈值设为 0。ReLU 的性能也优于 Sigmoid 函数,它部分解决了消失梯度问题。虽然 ReLU 所遭受的一个问题是 垂死的 ReLU问题,但它的变体 泄漏的 ReLU 解决了这个问题。

ReLU 函数的一个图

既然我们已经使我们的网络强大到足以适应变化,我们可以把注意力集中在计算时间的另一个问题上。如果你还记得,我们的图像的尺寸是 5999 x 4000 x 3,对于一个单独的图像来说有 71,988,000 个像素值,我们有很多这样的图像。虽然机器的速度非常快,但处理这些数量庞大的像素值需要相当长的时间。

一个基本的本能是在群体中选择一个主导价值。这是通过机器使用称为池的操作来实现的。

图像的缩减采样。图片来自 Github (麻省理工学院)

我们定义一个池窗口,比如说 2 x 2。类似于过滤器,该窗口在图像上滑动,并从窗口中选择一个主导值。主导的定义随着方法而变化。

其中一种方法是 Max Pooling ,这是一种广泛流行的方法,从窗口内的图像中选择最大值。这将尺寸减小到 25%。其他汇集方法包括平均汇集矩形邻域的 L2 范数,其不同之处在于选取主导值的方法。

最大池化。图片来自 Github (麻省理工学院)

因此,拥有 池层 的主要动机是为了降维。虽然,已经有关于移除池层并用卷积层代替它的讨论。力求简单:全卷积网提出了一个这样的架构,他们建议偶尔使用更大的步幅来减少初始表示的维数。

人工神经网络和 CNN 之间的关键区别是 CNN 处理图像中空间关系的能力,除此之外,两者的计算能力是相同的。既然我们已经提供了一个使用卷积、激活和汇集来处理空间关系的平台,我们现在可以利用 ANN 的能力。

全连接层 是常规神经网络或多层 Perceptron (MLP)的代表。

多层感知器

使用这些层的主要思想是通过卷积层和池层提取的高级特征的非线性组合进行学习。在训练网络时,神经元之间的权重作为一个参数,在训练时进行调整。由于这一层接受 1D 矢量形式的输入,我们需要 展平 来自先前层的输出,以馈送到 FC 层。

在分类多个类别的情况下,该层的输出是每个类别的真实值。为了从这些值中获得一些洞察力,使用了 Softmax 函数 。更多关于 Softmax 功能的信息可以在这里找到。它将这些真实值转换成类别概率。然后提取概率最高的类别作为预测类别。

虽然这些不是构建 CNN 时使用的唯一层,但它们是它的基本构件。根据问题的性质,可以添加多种其他类型的图层,例如缺失图层和归一化图层。

有许多 CNN 架构已经被证明在图像分类上表现得非常好。其中几个是:

  1. AlexNet
  2. VGGNet
  3. 雷斯内特
  4. 开始
  5. DenseNet

* [## AlexNet、VGGNet、ResNet、Inception、DenseNet 的架构比较

ILSVRC 挑战结果中具有超参数和准确性的图层描述

towardsdatascience.com](/architecture-comparison-of-alexnet-vggnet-resnet-inception-densenet-beb8b116866d)

虽然这些架构已经可以使用了,但是我强烈建议您尝试一下这些架构,并构建一个您自己的架构。*

感谢阅读!希望这篇文章有助于获得关于卷积神经网络的基本直觉。如有任何反馈或建议,可通过我的 邮箱LinkedIn联系我。我很想听听!**

下一篇文章将关注 CNN 的一个端到端例子!

快乐学习!

卷积神经网络冠军第 1 部分:LeNet-5 (TensorFlow 2.x)

原文:https://towardsdatascience.com/convolutional-neural-network-champions-part-1-lenet-5-7a8d6eb98df6?source=collection_archive---------30-----------------------

关于最流行的卷积神经网络(CNN)架构的多部分系列的第 1 部分,包含可复制的 Python 笔记本。

查尔斯·德鲁维奥在 Unsplash 上拍摄的照片

卷积神经网络是一种特殊类型的神经网络,用于对具有强空间相关性的数据进行建模,例如图像、多元时间序列、地球科学研究(地震分类和回归)以及许多其他应用。自 1998 年以来,卷积网络经历了重大变化,在这一系列文章中,我旨在再现著名的模型架构冠军,即 LeNet、AlexNet、Resnet。我的目标是与更广泛的受众分享我的发现和研究,并提供可复制的 Python 笔记本。

第二部分:ImageNet 和 Tensorflow 上的 AlexNet 分类:

[## 卷积神经网络冠军第 2 部分:AlexNet (TensorFlow 2.x)

关于最流行的卷积神经网络(CNN)架构的多部分系列的第 2 部分…

towardsdatascience.com](/convolutional-neural-network-champions-part-2-alexnet-tensorflow-2-x-de7e0076f3ff)

第三部分:ImageNet 和 Tensorflow 上的 VGGnet 分类:

[## 卷积神经网络冠军第 3 部分:VGGNet (TensorFlow 2.x)

这个多部分系列的第 3 部分介绍了最流行的卷积神经网络(CNN)架构,包括…

towardsdatascience.com](/convolutional-neural-network-champions-part-3-vggnet-tensorflow-2-x-ddad77492d96)

用于这项研究的 Python 笔记本位于我的Github页面。

本研究使用的 Tensorflow 版本为 1.15.0。

本研究中使用的机器采用英特尔酷睿 I7 处理器,1.8 GHZ,16 GB 内存。

对图像应用卷积层(也称为“ConvNet”)并提取图像的关键特征进行分析是 conv net 的主要前提。每次将“Conv 层”应用于图像并将该图像分成称为感受野的小片,从而从图像中提取重要特征并忽略不太重要的特征。内核通过将其元素与感受野的相应元素相乘,使用一组特定的权重与图像进行卷积。通常将“合并图层”与 Conv 图层结合使用,以对卷积后的要素进行缩减采样,并降低模型对输入中要素位置的敏感度。

最后,向模型中添加密集块并公式化问题(分类和/或回归),可以使用典型的梯度下降算法(如 SGD、ADAM 和 RMSprop)来训练这种模型。

当然,在 1998 年之前,卷积神经网络的使用是有限的,通常支持向量机是图像分类领域的首选方法。然而,当乐纯等人[98]发表了他们关于使用基于梯度的学习进行手写数字识别的工作后,这种说法发生了变化。

数据

LeNet 模型是基于 MNIST 数据开发的。该数据集由手写数字 0-9 组成;六万幅图像用于模型的训练/验证,然后一千幅图像用于测试模型。该数据集中的图像大小为 28×28 像素。下图中可以看到一个例子。使用 MNIST 数据集的挑战在于,数字在形状和外观上经常会有细微的变化(例如,数字 7 的写法不同)。

MNIST 数据示例

查看 MNIST 数据集中的标签,我们可以看到标签的数量是平衡的,这意味着没有太大的差异。

MNIST 数据集中的标签计数

网络结构

LeCun 等人[98],LeNet5 网络的建议结构

LeNet-5 的建议模型结构有 7 层,不包括输入层。如数据部分所述,该模型中使用的图像是 MNIST 手写图像。提议的结构可以在上面的图片中看到,取自乐纯等人[98]的论文。每层的详细信息如下:

  1. 图层 C1 是第一个 Conv 图层,有 6 个特征地图,跨度为 1。使用附录中给出的公式,可以用 156 个可训练参数计算该层 28×28 的输出尺寸(详情请参考附录 1)。该层的激活功能为tanh (详见附录 2)。
  2. 层 S2 是一个平均汇集层。该图层将上一个 Conv 图层的平均值映射到下一个 Conv 图层。汇集层用于降低模型对要素位置的依赖性,而不是对要素形状的依赖性。LeNet 模型中的池层大小为 2,跨度为 2。
  3. 层 C3 是第二组卷积层,有 16 个特征图。该层的输出维数是 10,有 2416 个参数。这一层的激活功能是tanh
  4. 层 S4 是另一个平均池层,维度为 2,步长为 2。
  5. 下一层负责将前一层的输出展平为一维数组。该层的输出尺寸为 400 (5×5×16)。
  6. 层 C5 是一个密集块(全连通层),有 120 个连接,48120 个参数(400×120)。这一层的激活功能是tanh
  7. 层 F6 是另一个 84 参数,10164 参数(84×120+84)的致密区块。这一层的激活功能是tanh
  8. 输出层有 10 个维度(等于数据库中的类别数),850 个参数(10×84+10)。输出层的激活函数是sigmoid (详见附录 2)。

以下代码片段演示了如何使用 Tensorflow/Keras 库在 Python 中构建 LeNet 模型。Keras sequential 模型是层的线性堆叠。然后,我们需要定义每一层,如下所示。最后,需要编译模型,并且需要明确定义优化器、损失函数和指标的选择。这项工作中使用的优化器是sgd 或随机梯度下降。损失函数被优化以训练机器学习模型。这里使用的损失函数是交叉熵或对数损失,用于测量分类模型的性能,其输出是 0 到 1 之间的概率值。准确性度量用于评估培训的表现。损失函数是一个连续的概率函数,而准确度是正确预测的标签数除以预测总数的离散函数(参见附录 3)。

LeNet-5 层结构

请注意,在上面的代码片段中,我们没有指定任何关于如何初始化神经网络权重的内容。默认情况下,Keras 使用一个glorot_uniform初始化器。权重值是随机选择的,以确保通过网络传递的信息可以被处理和提取。如果权重太小,信息会因此缩小。如果权重太大,信息就会增长,变得太大而无法处理。Glorot 统一算法(也称为 Xavier 算法)从多元随机正态分布中选择适当的随机权重值,该随机正态分布根据神经网络的大小进行缩放[参见 Glorot 2010]。

用 Tensorflow 构建的 LeNet-5 网络总结如下(使用model.summary()):

Model: "sequential"
_________________________________________________________________
**Layer (type)                 Output Shape              Param #** 
=================================================================
conv2d (Conv2D)              (None, 28, 28, 6)         156       
_________________________________________________________________
average_pooling2d (AveragePo (None, 14, 14, 6)         0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 10, 10, 16)        2416      
_________________________________________________________________
average_pooling2d_1 (Average (None, 5, 5, 16)          0         
_________________________________________________________________
flatten (Flatten)            (None, 400)               0         
_________________________________________________________________
dense (Dense)                (None, 120)               48120     
_________________________________________________________________
dense_1 (Dense)              (None, 84)                10164     
_________________________________________________________________
dense_2 (Dense)              (None, 10)                850       
=================================================================
Total params: 61,706
Trainable params: 61,706
Non-trainable params: 0
_________________________________________________________________

现在我们已经使用 Tensorflow 和 Keras 构建了 LeNet 模型,我们需要训练该模型。使用model.fit()和 feeding 训练和验证集,对模型进行训练。训练所需的附加参数是时期数、批量大小和详细信息:

  • 一个时期是训练数据的一个完整呈现。从训练数据集中随机选择样本,并呈现给模型进行学习。因此,一个时期代表整个训练数据集的一个周期。
  • 如前所述,一个时期指的是将数据完整地呈现给模型。训练数据是随机选择的,并输入到模型中。随机选择的数据中样本的数量称为批量。与较大的批量相比,较小的批量会产生噪声,但它们可能会很好地概括。较大的批处理大小用于避免内存限制问题,尤其是在使用图形处理单元(GPU)时。
  • Verbose 指定输出日志记录的频率。如果设置为 1,将打印每个迭代模型损失。

培训代码片段。注意**to_categorical** 命令用于将一个类向量转换成二进制类矩阵。

一旦模型被训练,我们就可以使用我们已经准备好的测试集,通过使用model.evaluate()命令来评估模型训练的性能:

测试代码片段

下图显示了 10 个时期的模型训练结果。最初,随机选择神经网络的权重,但是在向模型呈现 48,000 张图片的 2 个时期之后,模型损失从 0.38 减少到 0.1。经过 10 个周期的模型训练,模型在测试集上的准确率超过了 95%。与当时以前的模型(主要是支持向量机)相比,这是一个大幅提高的准确性,因此 LeNet-5 巩固了其作为计算机视觉最早冠军之一的遗产。

LeNet-5 训练结果(10 个时期)

使用model.optimizer.get_config(),我们可以询问优化器参数。注意,我们只指定了优化器的类型、损失函数和准确性指标。从下面的代码片段可以看出,用于训练 LeNet 模型的优化器是一个随机梯度下降(SGD)优化器。learning rate默认设置为 0.01。学习率响应于由损失函数测量的观测误差来控制模型参数的变化。想象模型训练过程是从一座山到一座谷,学习率定义步长。步长越大,遍历解的速度越快,但可能导致跳过解。另一方面,步长越小,收敛时间越长。在比较复杂的问题中,步长常用decay。然而,在这个问题中,没有衰变足以得到好的结果。使用 SGD 的另一个参数是momentum。动量不是只使用当前步骤的梯度来引导搜索,而是累积过去步骤的梯度来确定前进的方向。因此,动量可以用来提高 SGD 的收敛速度。另一个参数是nesterov。如果设置为 true(布尔值),SGD 将启用内斯特罗夫加速梯度(NAG)算法。NAG 也是一种与动量密切相关的算法,其中步长使用学习率变化的速度进行修改(参见内斯特罗夫[1983])。

model.optimizer.get_config():
{'name': 'SGD',
 'learning_rate': 0.01,
 'decay': 0.0,
 'momentum': 0.0,
 'nesterov': False}

模型询问

有多种方法可以评估分类器的性能。从任何模型开发任务中获得的测试数据集的准确性性能是显而易见的选择。然而,混淆矩阵可以提供分类器的详细报告,并更好地评估分类性能。此外,如果每个类别中存在不相等数量的观察值,分类精度可能会产生误导。

混淆矩阵是正确/错误分类的样本数量的详细报告。沿着混淆矩阵对角线的样本数是正确预测的样本。所有其他样本都被误分类了。对角线上的样本数量越多,模型精度越高。从 MNIST 数据集上 LeNet-5 的混淆矩阵可以看出,大部分类别被正确分类。然而,在少数情况下,分类器很难正确地对标签进行分类,例如标签 5、4 和 8。例如,在 16 种情况下,分类器错误地将数字 2 分类为数字 7。下图描述了上述情况。

LeNet-5 混淆矩阵

误分类标签示例

优化器的选择

在前面的部分中,提到了 SGD 优化器用于这个优化的神经网络模型。然而,由于 SGD 的收敛速度慢和陷入局部极小值的问题,这种方法并不流行。自推出以来,自适应矩估计 aka Adam(有关更多详细信息,请参考 Kingma 等人[2014])在深度学习领域非常受欢迎。Adam 优化算法是随机梯度下降的扩展,其中动量默认应用于梯度计算,并为每个参数提供单独的学习速率。使用 Adam optimizer 并从头开始重新训练 LeNet-5,模型准确性可以提高到 98%,如以下学习曲线所示:

使用 Adam 优化器的 LeNet-5 训练结果(10 个时期)。

批量大小的影响

批量是神经网络训练中最重要的超参数之一。如前一节所述,神经网络优化器在每个训练时期随机选择数据并将其提供给优化器。所选数据的大小称为批量大小。将批量大小设置为训练数据的整个大小可能会导致模型无法对之前没有见过的数据进行很好的概括(参考 Takase 等人[2018])。另一方面,将批处理大小设置为 1 会导致更长的计算训练时间。批量大小的正确选择特别重要,因为它导致模型的稳定性和准确性的提高。以下两个条形图展示了从 4 到 2,048 的各种批量的测试精度和训练时间。该模型对批量 4-512 的测试准确率在 98%以上。然而,批量大小 4 的训练时间是批量大小 512 的训练时间的四倍以上。对于具有大量类和大量训练样本的更复杂的问题,这种影响可能更严重。

批量大小对模型准确性(上图)和训练时间(下图)的影响

汇集层的影响

如前所述,需要池层对要素地图中的要素检测进行下采样。有两个最常用的池操作符:平均池和最大池层。平均池层通过计算要素图中所选修补的平均值来运行,而最大池层计算要素图的最大值。

最大池操作如下图所示,通过从特征映射中选择最大特征值来工作。最大池化图层会歧视激活函数不太重要的要素,并且仅选择最高值。这样,只有最重要的功能才通过池层提供。最大池化的主要缺点是池化算子在具有高量值特征的区域中,仅选择最高值特征,而忽略其余特征;执行最大池化操作后,明显的特征消失,导致信息丢失(下图中的紫色区域)。

最大池操作

另一方面,平均池的工作方式是计算要素地图所选区域中要素的平均值。特征图中所选区域的所有部分都使用平均池来馈通。如果所有激活的幅度都很低,则计算出的平均值也会很低,并且由于对比度降低而上升。当池区域中的大多数激活都带有零值时,情况会变得更糟。在这种情况下,特征映射特征将大量减少。

平均联营业务

如前所述,最初的 LeNet-5 模型使用平均池策略。将平均池策略改为最大池策略在 MNIST 数据集上产生了大致相同的测试准确度。人们可以争论不同的池层的观点。但是,应该注意的是,与其他复杂的数据集(如 CIFAR-10 或 Imagenet)相比,MNIST 数据集相当简单,因此最大池化在此类数据集中的性能优势要大得多。

平均池策略和最大池策略的比较

特征旋转和翻转的效果

到目前为止,我们已经探索了 LeNet-5 模型的不同方面,包括优化器的选择、批量大小的影响和池层的选择。LeNet-5 模型是根据 MNIST 数据设计的。正如我们到目前为止所看到的,数字在每个图像中居中。然而,在现实生活中,数字在图像中的位置经常会发生移动、旋转,有时还会发生翻转。在接下来的几节中,我们将探讨 LeNet-5 模型对图像翻转、旋转和移动的图像增强和灵敏度的影响。图像增强是在 Tensorflow 图像处理模块[tf.keras.preprocessing](https://keras.io/api/preprocessing/image/).的帮助下完成的

翻动的效果

在本练习中,使用ImageDataGenerator (horizontal_flip=True)沿水平轴翻转图像。应用ImageDataGenerator测试新数据集中的图像结果,图像水平翻转,如下图所示。可以看出,预期该模型在翻转图像数据集上具有低精度。从测试准确率表可以看出,LeNet-5 模型的准确率从 98%下降到 70%。

测试翻转图像的准确性

仔细观察翻转图像数据集的混淆矩阵,可以发现一些有趣的东西。最高精度的标签是 0、1、8 和 4。前三个标签是对称的(0,1,8 ),因此模型对此类具有良好的预测准确性。但有趣的是,LeNet-5 模型在标签 4 上有很好的分类精度。这项测试的另一个有趣的方面是模型如何识别数字。例如,在翻转的数据集中,模型遭受准确性的标签之一是 3。该模型几乎有一半的时间将它误归类为数字 8。理解模型如何识别每个数字对于建立一个健壮的分类器是非常有用的。像 SHAP 这样的包可以提供理解任何深度神经网络模型的输入输出映射的手段(在 SHAP 库中找 DeepExplainer 模块)。

翻转图像预测的混淆矩阵

图像旋转

图像旋转是现实生活中另一个可能的场景。数字可以以相对于图像边界的角度书写。使用 Tensorflow 图像增强模块,可以使用下面的代码行生成随机旋转的图像:ImageDataGenerator(rotation_range=angle)。下图是 LeNet-5 模型在各种随机旋转图像下的测试结果。旋转越多,模型的预测越差。有趣的是,模型预测对于高达 20 度的旋转是相当令人满意的,然后预测迅速退化。

LeNet-5 在随机旋转图像上的预测

换挡的效果

一个最终的图像增强效果是沿着图像内的水平或垂直轴移动手指。使用ImageDataGenerator(width_shift_range=shift),这种效果可以很容易地应用于 MNIST 测试数据集。请注意,在本节中,我将演示width_shift 生成器的结果。LeNet-5 网络对宽度偏移的敏感度远高于图像翻转和图像旋转。从下图中可以看出,精度下降的速度比其他讨论过的图像增强过程要快得多。仅仅 10 度的宽度偏移就导致准确度从超过 95%下降到大约 48%。这种影响可能归因于模型的过滤器大小和核维数。

LeNet-5 在随机移位图像上的预测

在 CIFAR-10 数据集上的性能

正如我们从前面所有章节中看到的,LeNet-5 模型在手写数字识别中实现了一个重要的里程碑。由于其在分类问题上的优越性能,LeNet-5 模型在 20 世纪 90 年代中期被用于银行和 ATM 机的自动数字分类。然而,该模型的下一个前沿是解决图像识别问题,以识别图像中的各种对象。

在这最后一部分,我们的目标是在 CIFAR-10 数据集上训练 LeNet-5。CIFAR-10(加拿大高级研究所)是一个已建立的计算机视觉数据集,包含 60,000 幅彩色图像,大小为 32×32,包含 10 个对象类,如下图所示。这 10 个不同的类别代表飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车。从下面的图片可以看出,图片的复杂程度远远高于 MNIST。

CIFAR-10 数据集

将 LeNet-5 结构应用于该数据集并训练该模型 10 个时期,得到 73%的准确度。该模型的测试准确率为 66%。考虑到人类在该数据集上的准确率约为 94%(根据 Ho-Phuoc [2018]),LeNet-5 类型结构的效率不足以实现高识别能力。

LeNet-5 结构在 CIFAR-10 数据集上的性能

摘要

LeNet-5 为训练和分类手写数字提供了重要的框架。正如我们在前面的章节中所看到的,LeNet-5 结构尽管在光学字符识别任务中取得了许多成功的里程碑,但在图像识别任务中表现不佳。然而,**Yann andréle Cun和许多同时代的人为更复杂的神经网络模型结构和优化技术铺平了道路。在下一篇文章中,我将探讨和讨论另一个卷积神经网络结构冠军, ALexNet。**

感谢阅读!我叫 阿米尔·内贾德博士。 我是一名数据科学家和QuantJam的编辑,我喜欢分享我的想法并与其他数据科学家合作。可以在GithubTwitterLinkedIn上和我联系。******

QuantJam:

**** [## QuantJam

Quantjam 是一个媒体发布平台,提供金融、算法交易和…

medium.com](https://medium.com/quantjam)

你可以在以下网址看到我的其他作品:

[## 阿米尔·内贾德-中等

Python 在金融数据集中的多部分时间序列分析时间序列是一系列数据…

amirnejad.medium.com](http://amirnejad.medium.com/)

附录(1)层尺寸

计算卷积神经网络输出维数的公式:

计算参数数量的公式:

使用上面的两个公式,可以计算 LeNet5 模型的输出维数和参数数目如下:

LeNet 尺寸和参数

附录(2)激活功能

tanh 激活函数

sigmoid 激活函数

附录(3)损失和精度函数

损失函数:

交叉熵函数

精度函数:

准确度函数

参考

  • 勒昆,y .,博图,l .,本吉奥,y .,哈夫纳,P. (1998d)。基于梯度的学习在文档识别中的应用。IEEE 会议录,86(11),2278–2324。
  • 神经网络的历史:https://dataconomy.com/2017/04/history-neural-networks/
  • Khan,Asifullah,等人“深度卷积神经网络的最新架构综述”arXiv 预印本 arXiv:1901.06032 (2019)。

优化器:

批量大小:

  • T. TAKASE、S. OYAMA 和 M. KURIHARA。“为什么大批量训练会导致泛化能力差?一个全面的解释和一个更好的策略。载于:神经计算 30.7 (2018),第 2005–2023 页

联营策略:

  • 夏尔马、沙鲁和拉杰什·梅赫拉。"卷积神经网络中汇集策略的含义:深刻的见解."计算与决策科学基础 44.3(2019):303–330。
  • 布鲁,Y-Lan,等人《问本地人:图像识别的多向本地汇集》2011 计算机视觉国际会议。IEEE,2011 年。

初始化:

混淆矩阵:

MNIST:

西法尔-10:

  • https://www.cs.toronto.edu/~kriz/cifar.html
  • 克里日夫斯基、亚历克斯和杰弗里·辛顿。"从微小的图像中学习多层特征."(2009): 7.
  • 和珅,天。“CIFAR10 比较深度神经网络和人类之间的视觉识别性能。”arXiv 预印本 arXiv:1811.07270 (2018)。

张量流图像增强:

SHAP

卷积神经网络冠军第 2 部分:AlexNet (TensorFlow 2.x)

原文:https://towardsdatascience.com/convolutional-neural-network-champions-part-2-alexnet-tensorflow-2-x-de7e0076f3ff?source=collection_archive---------34-----------------------

关于最流行的卷积神经网络(CNN)架构的多部分系列的第 2 部分,包含可复制的 Python 笔记本

卷积神经网络是一种特殊类型的神经网络,用于对具有强空间相关性的数据进行建模,例如图像、多元时间序列、地球科学研究(地震分类和回归)以及许多其他应用。自 1998 年以来,卷积网络经历了重大变化,在这一系列文章中,我的目标是再现著名的模型架构冠军,如 LeNet、AlexNet、ResNet 等。我的目标是与更广泛的受众分享我的发现和研究,并提供可复制的 Python 笔记本。

信用:https://unsplash.com/@cbarbalis

第一部分:tensor flow 中的 Lenet-5 和 MNIST 分类:

[## 卷积神经网络冠军第 1 部分:LeNet-5

关于最流行的卷积神经网络(CNN)架构的多部分系列,具有可再现的 Python…

towardsdatascience.com](/convolutional-neural-network-champions-part-1-lenet-5-7a8d6eb98df6)

第三部分:ImageNet 和 Tensorflow 上的 VGGnet 分类;

[## 卷积神经网络冠军第 3 部分:VGGNet (TensorFlow 2.x)

这个多部分系列的第 3 部分介绍了最流行的卷积神经网络(CNN)架构,包括…

towardsdatascience.com](/convolutional-neural-network-champions-part-3-vggnet-tensorflow-2-x-ddad77492d96)

用于这项研究的 Python 笔记本位于我的 Github 页面中。

本研究中使用的 Tensorflow 版本为 2.3。

LeNet-5 模型展示了阅读和分类手写数字的卓越能力。尽管 LeNet-5 网络结构在 MNIST 数据集上表现良好,但对 CIFAR-10 等更复杂图像进行分类的实际测试表明,该模型学习如此复杂模式的能力太低。因此,更强大的架构的开发进入了休眠状态,直到 2012 年 AlexNet 诞生。AlexNet 被认为是第一个深度 CNN 模型,由 Krizhevesky 等人提出。在此期间,有几项发展抑制了神经网络分类准确性的提高,即:

  1. Max pooling : Pooling 层用于降低神经网络模型对图像中特征位置的敏感性。在最初的 LeNet-5 模型中,使用了平均池层。然而,Ranzato 等人[2007]通过使用最大池层学习不变特征展示了良好的结果。最大池化图层会歧视激活函数不太重要的要素,并且仅选择最高值。这样,只有最重要的特性才会通过池层提供。更多信息请参考本系列的第 1 部分(链接)。
  2. GPU/CUDA 编程:在神经网络的早期发展中,模型训练过程中的一个主要瓶颈是计算机的计算能力,因为它们主要使用 CPU 来训练模型。2007 年,NVIDIA 公司推出了 CUDA(计算统一设备架构)编程平台,以促进 GPU(图形处理单元)上的并行处理。CUDA 支持在 GPU 上进行模型训练,与 CPU 相比,训练时间要短得多。因此,培训更大的网络成为可能。
  3. ReLU 激活函数 : Nair 和 hint on【2010】展示了修正线性单元(ReLU)提高受限玻尔兹曼机器分类精度的能力。ReLU 单元只是让任何大于零的值通过过滤器,并抑制任何小于零的值。ReLU 函数是不饱和的,这意味着当输入增加时函数的极限接近无穷大,因此它可以缓解消失梯度问题。
  4. ImageNet:深度学习领域取得成功的另一个催化剂是费-李非教授的团队在斯坦福大学建立的 ImageNet 数据库。ImageNet 包含来自数千个类别的数百万张带注释的图像。一年一度的 ImageNet 大规模视觉识别挑战赛(ILSVRC)见证了包括 AlexNet 在内的卷积神经网络结构的许多进步。训练数据是 2012 年发布的 ImageNet 的子集,具有属于 1,000 个类的 120 万个图像。验证数据集由属于 1,000 个类的 50,000 个图像组成(每个类 50 个图像)。在下面的示例中可以看到 ImageNet 图像的示例:

ImageNet 图片示例(l .飞飞,《ImageNet:众包、基准和其他很酷的东西》, CMU·VASC 研讨会,2010 年 3 月)

下载资料注意事项:ImageNet 官网( 链接 )可向个人提供图片。但是,提交请求后,我没有收到任何下载链接。下载图像最简单的方法是通过 ImageNet 对象本地化挑战( 链接 )。

AlexNet 模型结构

克里日夫斯基、亚历克斯、伊利亚·苏茨基弗和杰弗里·e·辛顿。"使用深度卷积神经网络的图像网络分类."神经信息处理系统进展。2012.

AlexNet 在 ILSVRC-2012 比赛中取得了 15.3%的前 5 名测试错误率(之前的模型错误率为 26%)的胜利。网络架构类似于 LeNet-5 模型(阅读更多关于 LeNet-5: Link 的内容),但具有更多卷积层,因此模型更深入。

模型中使用的主要激活函数是非饱和整流线性单元(ReLU)函数。该模型主要由 8 层组成:5 个卷积层和 3 个密集层。内核大小从 11×11 减小到 3×3。每个卷积层后面都有一个最大池层。该模型在前两个完全连接的层中使用 dropout 以避免过度拟合。下面给出了 AlexNet 在 Tensorflow 中的实现。

使用随机梯度下降(SGD)优化算法训练该模型。学习率初始化为 0.01,动量为 0.9,权重衰减为 0.0005。在 Tensorflow 中构建 AlexNet 模型的代码片段如下所示:

注意,模型中使用的优化器是带动量的梯度下降。这个优化器位于一个名为tensorflow_addons的独立包中(更多信息可以在这里看到)。

2 节课的 AlexNet 演示

在整个 ImageNet 数据集上训练 AlexNet 非常耗时,并且需要 GPU 计算能力。因此,在本节中,我将在 ImageNet 数据集上演示 AlexNet 类型结构的训练,该数据集由两个类组成:

  • 类别*n03792782*:山地车、全地形车、越野车
  • *n03095699*级:集装箱船,集装箱船

训练数据集由属于两类的 2,600 幅图像组成。调用AlexNet 函数会产生一个超过 6200 万可训练参数的网络,如下图所示:

Model: "AlexNet"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 55, 55, 96)        34944     
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 27, 27, 96)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 27, 27, 256)       614656    
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 13, 13, 256)       0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 13, 13, 384)       885120    
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 13, 13, 384)       1327488   
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 13, 13, 256)       884992    
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 6, 6, 256)         0         
_________________________________________________________________
flatten (Flatten)            (None, 9216)              0         
_________________________________________________________________
dense (Dense)                (None, 4096)              37752832  
_________________________________________________________________
dropout (Dropout)            (None, 4096)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 4096)              16781312  
_________________________________________________________________
dropout_1 (Dropout)          (None, 4096)              0         
_________________________________________________________________
dense_2 (Dense)              (None, 1000)              4097000   
_________________________________________________________________
dense_3 (Dense)              (None, 2)                 2002      
=================================================================
Total params: 62,380,346
Trainable params: 62,380,346
Non-trainable params: 0
_________________________________________________________________

模型训练和评估

AlexNet 模型在整个训练数据上训练 90 个时期,并在来自验证数据集的 50K 个图像上验证。CPU 上的训练模型示例如下所示(要在 GPU 上训练,使用tf.distribute.MirroredStrategy):

经过充分训练的 AlexNet 模型在 2 个类上可以达到 95%的准确率。下图显示了学习曲线以及训练集和验证集的损失。可以看出,验证集上的训练损失在 20 个时期后保持不变,并且模型学习不能被改进。

学习曲线(作者图片)

评估模型性能的另一种方法是使用一种叫做混淆矩阵的方法。混淆矩阵是表格布局,由数据类别和使用训练好的分类器得到的预测组成。这里可以看到一个混淆矩阵的例子。这个混淆矩阵是通过在 100 个验证图像(每个类别 50 个图像)上运行训练好的神经网络分类器而获得的。可以看出,该模型在 bikes 类别中只错误分类了 1 个图像(用 0 表示)。然而,该模型将 3 幅图像错误分类到船只类别(用 1 表示)。

困惑矩阵(图片由作者提供)

4 个错误分类的图像如下图所示。在以下情况下,模型似乎无法完全识别图像中的对象:

  • 图像中的对象被裁剪(部分可见的对象)
  • 对象在背景中或被周围环境覆盖

错误分类的图片(作者图片,修改后的 ImageNet)

查看上面的图像并将它们与训练图像进行比较,很难看出这些图像分类错误背后的原因。使 CNN 模型更加透明的一种方法是可视化对预测“重要”的输入区域。有许多方法可以完成这项任务,如GradCAMGradCAM++ScoreCAM等。我使用 tf-keras-vis库中的GradCAM(更多信息:https://pypi.org/project/tf-keras-vis/)来检查错误分类图像上的模型行为。结果可以在下面看到。可以看出,模型很难聚焦于导入区域(用红色表示)。

分类错误的例子(作者图片,修改后的 ImageNet)

以下图像展示了正确分类的图像示例。可以看出,该模型关注图像中的重要特征,并且正确地预测图像的类别。有趣的是,经过训练的模型似乎能够识别自行车和骑自行车的人。一种不仅检测物体而且检测物体在图像中的位置的物体识别模型可以适当地解决这个问题。AlexNet 只能检测对象,但不能识别图像中的对象。物体识别的主题将在本系列的后续章节中讨论。

正确分类的图片示例(作者图片,修改后的 ImageNet)

摘要

AlexNet 开启了计算机视觉和深度学习的新时代。AlexNet 引入(或在某些情况下推广)了许多今天使用的相关计算机视觉方法,如 conv+池设计、dropout、GPU、并行计算和 ReLU。因此,作为这些发明的结果,AlexNet 能够减少 ImageNet 数据集上的分类错误。然而,AlexNet 模型需要提高分类精度。因此,许多模型都建立在 AlexNet 的成功之上,比如 VGGNet、,我将在下一篇文章中探讨和讨论这些模型。敬请关注,并在下面告诉我你的看法。

感谢阅读!我叫 阿米尔·内贾德博士。 我是一名数据科学家,也是QuantJam的编辑,我喜欢分享我的想法,并与其他数据科学家合作。可以在GithubTwitterLinkedIn上和我联系。****

QuantJam:

** [## QuantJam

Quantjam 是一个媒体发布平台,提供金融、算法交易和…

medium.com](https://medium.com/quantjam)

你可以在以下网址看到我的其他作品:

[## 阿米尔·内贾德-中等

Python 在金融数据集中的多部分时间序列分析时间序列是一系列数据…

amirnejad.medium.com](http://amirnejad.medium.com/)

所有图片均由作者制作,除非另有说明。

附录

Relu 激活功能:

Relu 激活功能(图片由作者提供)

参考

  • 克里日夫斯基、亚历克斯、伊利亚·苏茨基弗和杰弗里·e·辛顿。"使用深度卷积神经网络的图像网络分类."神经信息处理系统进展。2012.
  • 第九讲,CNN 建筑,费-李非&杨小琳,2017 ( Youtube )

最大池:

  • 不变特征层次的无监督学习及其在物体识别中的应用。2007 年 IEEE 计算机视觉和模式识别会议。IEEE,2007 年。

ReLU:

  • 奈尔、维诺德和杰弗里·e·辛顿。"校正的线性单位改进了受限的玻尔兹曼机器."ICML。2010.

CUDA:

  • E. Lindholm、J. Nickolls、s .奥伯曼和 J. Montrym,“NVIDIA Tesla:统一的图形和计算架构”,IEEE Micro,第 28 卷,第 2 期,第 39–55 页,2008 年 3 月。

ImageNet:

卷积神经网络:特征映射和滤波器可视化

原文:https://towardsdatascience.com/convolutional-neural-network-feature-map-and-filter-visualization-f75012a5a49c?source=collection_archive---------0-----------------------

了解卷积神经网络如何理解图像。

在本文中,我们将可视化不同 CNN 层的中间特征表示,以了解 CNN 内部发生了什么来对图像进行分类。

先决条件:

卷积神经网络基础知识

使用 Keras 构建强大的图像分类卷积神经网络

使用 Keras 构建强大的图像分类 CNN

CNN 的快速概览

有监督的深度学习和机器学习在训练期间将数据和结果作为输入,以生成规则或数据模式。理解模型生成的数据模式或规则有助于我们理解结果是如何从输入数据中得出的。

训练:卷积神经网络以一幅二维图像和该图像的类别,如猫或狗作为输入。作为训练的结果,我们得到训练的权重,这是从图像中提取的数据模式或规则。

推理或预测:图像将是传递给训练好的模型的唯一输入,训练好的模型将输出图像的类别。图像的类别将基于训练期间学习的数据模式。

CNN 架构

将过滤器特征检测器应用于输入图像以使用 Relu 激活功能生成特征图或激活图。特征检测器或过滤器有助于识别图像中的不同特征,如边缘、垂直线、水平线、弯曲等。

然后,为了平移不变性,在特征图上应用池化汇集是基于这样一个概念:当我们少量改变输入时,汇集的输出不会改变。我们可以使用最小池、平均池或最大池。与最小或平均池相比,最大池提供了更好的性能。

展平所有输入,并将这些展平的输入传递给深度神经网络,该网络输出对象的类别

图像的类别可以是二进制的,如猫或狗,或者可以是多类别的分类,如识别数字或对不同的服装项目进行分类。

神经网络就像一个黑匣子,神经网络中学习到的特征是不可解释的。您传递一个输入图像,模型返回结果。

如果你得到了一个不正确的预测,并想弄清楚为什么 CNN 会做出这样的决定,该怎么办?

如果您能在 CNN 中可视化应用于不同卷积层的中间表示,以了解模型如何学习,那该多好。了解模型的工作将有助于了解错误预测的原因,从而更好地微调模型并解释决策

这里使用的例子是一个深度 CNN 模型,用于对猫狗进行分类。在开始学习可视化 CNN 生成的过滤器和要素地图之前,您需要了解卷积层和应用于它们的过滤器的一些关键点。

关于卷积层和过滤器的要点

  • CNN 中滤镜的深度必须与输入图像的深度相匹配。滤镜中颜色通道的数量必须与输入图像保持一致。
  • 为彩色图像的三个通道创建不同的 Conv2D 滤镜。
  • 基于正态或高斯分布随机初始化每层的过滤器。
  • 卷积网络的初始层从图像中提取高级特征,因此使用较少的滤波器。随着我们构建更深的层,我们将过滤器的数量增加到前一层过滤器大小的两倍或三倍。
  • 更深层的过滤器学习更多的特征,但是计算非常密集

构建卷积神经网络

我们建立一个 CNN 来对狗和猫进行分类,然后将特征图或激活图以及用于在输入图像上生成它们的过滤器可视化

导入所需的库

**import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D
from tensorflow.keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img****import os
import numpy as np
import matplotlib.pyplot as plt**

为图像处理创建数据

数据集可以从这里下载

我们将解压文件并创建如下所示的文件夹,然后将数据分成包含 10,000 只猫和 10,000 只狗图像的训练数据集以及包含 2500 只猫和 2500 只狗图像的验证数据集

设置关键参数

**batch_size = 64 
epochs = 50
IMG_HEIGHT = 150
IMG_WIDTH = 150**

重新缩放并对训练图像应用不同的增强

**train_image_generator = ImageDataGenerator(                                                rescale=1./255,                                              rotation_range=45,                                                width_shift_range=.15,                                                height_shift_range=.15,                                                horizontal_flip=True,                                                zoom_range=0.3)**

重新调整验证数据

**validation_image_generator = ImageDataGenerator(rescale=1./255)**

为训练和验证数据集生成批量归一化数据

您的数据存储在目录中,因此使用 flow_from_directory() 方法。flow_from_directory()将从指定的路径获取数据,并生成批量的扩充规范化数据。

**train_data_gen = train_image_generator.flow_from_directory(batch_size=batch_size,                                                     directory=TRAIN_PATH,                                                     shuffle=True,                                                     target_size=(IMG_HEIGHT, IMG_WIDTH),                                                     class_mode='binary')****val_data_gen = validation_image_generator.flow_from_directory(batch_size=batch_size,                                                              directory=VAL_PATH,                                                              target_size=(IMG_HEIGHT, IMG_WIDTH),                                                              class_mode='binary')**

创建深度卷积神经网络模型

*#Build the model***model = Sequential([
    Conv2D(16, 3, padding='same', activation='relu', 
           input_shape=(IMG_HEIGHT, IMG_WIDTH ,3)),
    MaxPooling2D(),
    Dropout(0.2),
    Conv2D(32, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Conv2D(64, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Dropout(0.2),
    Flatten(),
    Dense(512, activation='relu'),
    Dense(1)
])***# Compile the model*
**model.compile(optimizer='adam',              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),              metrics=['accuracy'])***# print the model architecture*
**model.summary(*)***

训练模特

我们训练模型 50 个时期

***history = model.fit_generator(
    train_data_gen,
    steps_per_epoch=1000,
    epochs=epochs,
    validation_data=val_data_gen,
    validation_steps=1000
)***

特征可视化

特征可视化将图像中存在的内部特征转化为视觉上可感知或可识别的图像模式。特征可视化将帮助我们明确地理解所学的特征。

首先,您将可视化应用于输入图像的不同过滤器或特征检测器,并在下一步中可视化生成的特征映射或激活映射。

CNN 中的可视化过滤器或特征检测器

CNN 使用学习过的过滤器来卷积来自前一层的特征地图。过滤器是二维权重,并且这些权重彼此具有空间关系。

可视化过滤器的步骤。

  1. 使用 model.layers 遍历模型的所有层
  2. 如果该层是卷积层,则使用get _ weights()提取该层的权重和偏差值。
  3. 将过滤器的权重归一化到 0 和 1 之间
  4. 画出每个卷积层和所有通道的滤波器。对于彩色图像,RGB 有三个通道。对于灰度图像,通道数为 1
*#Iterate thru all the layers of the model*
**for layer in model.layers:
    if 'conv' in layer.name:
        weights, bias= layer.get_weights()
        print(layer.name, filters.shape)**

        *#normalize filter values between  0 and 1 for visualization*
        **f_min, f_max = weights.min(), weights.max()
        filters = (weights - f_min) / (f_max - f_min)  
        print(filters.shape[3])
        filter_cnt=1**

       * #plotting all the filters*
       ** for i in range(filters.shape[3]):**
            *#get the filters*
           ** filt=filters[:,:,:, i]**
            *#plotting each of the channel, color image RGB channels*
            **for j in range(filters.shape[0]):
                ax= plt.subplot(filters.shape[3], filters.shape[0], filter_cnt  )
                ax.set_xticks([])
                ax.set_yticks([])
                plt.imshow(filt[:,:, j])
                filter_cnt+=1
        plt.show()**

应用于猫和狗的 CNN 模型的过滤器。

可视化 CNN 中生成的特征图或激活图

通过将过滤器或特征检测器应用于输入图像或先前层的特征图输出来生成特征图。要素图可视化将提供对模型中每个卷积层的特定输入的内部表示的深入了解。

可视化特征地图的步骤。

  1. 定义一个新的模型,visualization _ model,该模型将图像作为输入。模型的输出将是要素地图,它是第一个图层之后所有图层的中间表示。这是基于我们用于培训的模型。
  2. 加载我们想要查看其特征地图的输入图像,以了解哪些特征对于图像分类是显著的。
  3. 将图像转换为 NumPy 数组
  4. 通过重新调整数组的大小来规范化数组
  5. 通过可视化模型运行输入图像,以获得输入图像的所有
    中间表示。
  6. 为所有卷积层和最大池层创建图,但不为全连接层创建图。要打印要素地图,请检索模型中每个图层的图层名称。
**img_path='\\dogs-vs-cats\\test1\\137.jpg' #dog**
*# Define a new Model, Input= image 
# Output= intermediate representations for all layers in the  
# previous model after the first.*
**successive_outputs = [layer.output for layer in model.layers[1:]]***#visualization_model = Model(img_input, successive_outputs)*
**visualization_model = tf.keras.models.Model(inputs = model.input, outputs = successive_outputs)***#Load the input image*
**img = load_img(img_path, target_size=(150, 150))***# Convert ht image to Array of dimension (150,150,3)* **x   = img_to_array(img)                           
x   = x.reshape((1,) + x.shape)***# Rescale by 1/255*
**x /= 255.0**# Let's run input image through our vislauization network
# to obtain all intermediate representations for the image.
**successive_feature_maps = visualization_model.predict(x)**# Retrieve are the names of the layers, so can have them as part of our plot
**layer_names = [layer.name for layer in model.layers]
for layer_name, feature_map in zip(layer_names, successive_feature_maps):
  print(feature_map.shape)
  if len(feature_map.shape) == 4:**

    *# Plot Feature maps for the conv / maxpool layers, not the fully-connected layers*

    **n_features = feature_map.shape[-1]**  *# number of features in the feature map*
    **size       = feature_map.shape[ 1]**  *# feature map shape (1, size, size, n_features)*

    *# We will tile our images in this matrix*
    **display_grid = np.zeros((size, size * n_features))**

    # Postprocess the feature to be visually palatable
    **for i in range(n_features):
      x  = feature_map[0, :, :, i]
      x -= x.mean()
      x /= x.std ()
      x *=  64
      x += 128
      x  = np.clip(x, 0, 255).astype('uint8')** # Tile each filter into a horizontal grid
 **display_grid[:, i * size : (i + 1) * size] = x***# Display the grid*
    **scale = 20\. / n_features
    plt.figure( figsize=(scale * n_features, scale) )
    plt.title ( layer_name )
    plt.grid  ( False )
    plt.imshow( display_grid, aspect='auto', cmap='viridis' )**

狗图像的特征图

猫图像的特征图

我们可以看到,对于狗的图像,鼻子和舌头是非常突出的特征,而对于猫的图像,耳朵和尾巴在特征图中非常突出。

代码可用此处

结论:

可视化 CNN 如何学习识别图像中存在的不同特征的内部故事,提供了对该模型如何工作的更深入的了解。这也将有助于理解为什么模型可能无法正确地对一些图像进行分类,从而微调模型以获得更好的准确性和精确度。

参考资料:

[## Keras 文档:Keras 层 API

层是 Keras 中神经网络的基本构建块。一个层包括一个张量输入张量输出…

keras.io](https://keras.io/api/layers/) [## 卷积滤波器可视化— Keras 文档

future import print_function 导入时间将 numpy 作为 np 从 PIL 导入图像作为 pil_image 从…

keras.io](https://keras.io/examples/conv_filter_visualization/)

卷积神经网络如何看待世界——卷积神经网络可视化方法综述

可视化和理解卷积网络

特征可视化——谷歌人工智能博客

https://cs.nyu.edu/~fergus/papers/zeilerECCV2014.pdf

自然语言处理中的卷积神经网络

原文:https://towardsdatascience.com/convolutional-neural-network-in-natural-language-processing-96d67f91275c?source=collection_archive---------12-----------------------

什么是卷积神经网络,如何利用它进行情感分析?

什么是卷积神经网络?

神经网络是一套用于识别模式的算法。这些模式是包含在向量中的数字,这些向量是从现实世界的数据(如图像、声音、文本或时间序列)转换而来的。卷积神经网络是将卷积层应用于局部特征的神经网络。

要理解一个小内核如何转换大量的输入数据,请看下面的 gif。

堆栈交换中检索

正如我们所看到的,每个内核在空间上都很小(沿宽度和高度),但会延伸到输入体积的整个深度,并在滑动时转换输入数据。

但是如果我们想要不同的输出呢?没问题。我们只需要应用不同的过滤器。

Setosa.io 中探索 CNN

这些过滤器也可以应用于多维输出。下面的图像以 3D 方式输入,图像大小为 7x7,最后一个维度表示 3 个颜色通道(红、蓝、绿)。这使得输入大小为 7x7x3。然后我们应用 2 个滤波器w0w1,,每个滤波器的大小为 3x3x3,以匹配输入大小。对于输出的维度,我们应该期待什么?3x3x2 与2滤镜的数量。

gitbook 中检索

自然语言处理中的卷积神经网络

因此,我们了解了什么是卷积神经网络,并了解了 CNN 如何应用于图像。但是 CNN 在 NLP 中到底是怎么运作的呢?例如,如果我们有一个句子“我爱我的新 iphone ”,我们如何使用 CNN 来分类这个句子是负面的,正面的,还是中性的?

堆栈交换中检索到的图像

上图从左至右的简短说明:

  • 输入是单词。每个单词由一个大小为 7 的向量表示。
  • 对单词向量应用 4 种不同的过滤器来创建卷积特征图
  • 为合并表示选择每个过滤器向量的最大结果值
  • 应用 softmax 将大小为 1x4 的向量转换为大小为 1x3 的向量以进行分类

通过实例学习:使用 PyTorch 进行情感分析

PyTorch 是一个 Python 程序库,有助于构建深度学习项目。如果你不知道 PyTorch,可以看看我的文章:

[## PyTorch 是什么?

想想 Numpy,但是有强大的 GPU 加速

towardsdatascience.com](/what-is-pytorch-a84e4559f0e3)

如果你的机器没有 GPU,我鼓励你使用 Google Colab 来尝试代码。我们将使用这个库对 Kera 的 IMDb 电影评论数据集进行情感分析。我们的任务是分类评论是正面的还是负面的。

为了建立模型,我们用nn.Conv2d(in_channels, out_channels, kernel_size)做 2D 卷积,用nn.Linear(in_channels, out_channels).做一层线性神经网络进行分类

培训步骤

想象我们的损失函数

import matplotlib.pyplot as pltplt.plot(LOSS)

print("F1_test: %.5f"%(get_f1(X_test, y_test)))

厉害!我们的 CNN 模型给了我们 0.87 的 F1 分!

结论

恭喜你!你已经学习了什么是卷积神经网络,如何用 PyTorch 申请自然语言处理。我希望这能让你对 CNN 有一个大致的了解,并有动力在你的深度学习项目中利用这种方法。如果你想更好地了解 CNN,维克多·鲍威尔的网站提供了一个很酷的互动视觉效果,展示了当使用 CNN 的滤镜时,图像是如何变化的。你可以在这里试用一下这篇文章的代码。

这个 Github repo 中,您可以随意使用本文的代码。

我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 Twitter 上与我联系。

如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:

[## 什么是卓越的图形以及如何创建它

作为一名数据科学家,了解如何制作重要的图表至关重要

towardsdatascience.com](/what-graphical-excellence-is-and-how-to-create-it-db02043e0b37) [## 如何用图论可视化社交网络

找出《权力的游戏》中的影响者

towardsdatascience.com](/how-to-visualize-social-network-with-graph-theory-4b2dc0c8a99f) [## 凸包:包装数据的创新方法

如何利用包装算法实现数据可视化

towardsdatascience.com](/convex-hull-an-innovative-approach-to-gift-wrap-your-data-899992881efc) [## 恐龙和圆圈的数据集可以有相同的统计数据吗?

它们有相同的中位数和标准差,但它们是两个明显不同的数据集!

towardsdatascience.com](/how-to-turn-a-dinosaur-dataset-into-a-circle-dataset-with-the-same-statistics-64136c2e2ca0) [## 用美丽的声音抓取维基百科

关于如何使用 Beautiful Soup 的分步教程,这是一个用于 web 抓取的简单易用的 Python 库

towardsdatascience.com](/step-by-step-tutorial-web-scraping-wikipedia-with-beautifulsoup-48d7f2dfa52d)

卷积神经网络

原文:https://towardsdatascience.com/convolutional-neural-networks-357b9b2d75bd?source=collection_archive---------13-----------------------

简介和卷积

图片来自 Unsplash

本文的目标是探索以下概念:

  • 卷积神经网络导论。用例及例子。
  • 回旋。Python 中的示例
  • CNN。
  • 局部连接的层

卷积神经网络简介

你可以在这里找到,神经网络是一个通用的函数逼近器。这意味着,从本质上讲,神经网络通过试图找到一个函数的最佳近似来解决问题,该函数允许我们解决我们的问题。

为此,我们有一系列参数(权重和偏差),我们使用基于下降梯度的反向传播算法来更新这些参数。

多亏了我们的标签,我们可以在每次迭代中计算误差,并修改权重以逐步减少误差。

什么是卷积神经网络?或者更重要的是,它解决了什么问题?

简而言之,卷积神经网络可以解决所有可以用图像形式表达的问题。

例如,当你试图在你的脸书照片中给某人贴标签时,就要考虑到这一点。你有没有注意到它暗示了这个人的侧面?那是一个 convnet!

或者你可能听说过自动驾驶汽车,它可以“阅读”交通标志,识别其他汽车,甚至检测一个人是否正在过马路。功能也是基于 convnets 的!

CNN 是解决医学成像问题的最新技术。这些只是几个例子,但还有更多。

它们在最近几年变得如此受欢迎的原因是因为它们可以自己找到正确的特征,以便以后正确地对图像进行分类。他们以一种非常有效的方式做到这一点。

但是 CNN 到底是什么?

CNN 是一种神经网络,其中引入了新类型的层,其中最重要的是卷积层。

什么是卷积?

盘旋

严格来说,卷积主要用于信号处理,是一种允许两个信号合并的数学运算。

在数字信号处理中,卷积是用来知道一个信号“通过”某个设备后会发生什么。

例如,要了解我们的声音通过手机麦克风后的变化,我们可以计算我们的声音与麦克风脉冲响应的卷积。

卷积神经网络因其检测模式并进行分类的能力而闻名。那些模式检测器是卷积。

让我们看看计算机是如何理解图像的:

http://cs231n.github.io/classification/

https://data science-发烧级. com/DL/Convolution _ model _ Step _ by _ Step v2 . html

正如你所看到的,彩色图像被表示为一个三维矩阵:宽 x 高 x 通道。

有几种方法来表示图像,但最常用的是使用 RGB 颜色空间。这意味着计算机最终会看到 3 个重量 x 高度的矩阵,其中第一个告诉你图像中红色的数量,第二个告诉你绿色的数量,第三个告诉你蓝色的数量。

如果图像是灰度的,计算机会将其视为一个二维的重量 x 高度矩阵。

最后,矩阵元素的取值取决于所用变量的类型。最常见的有:

  • 如果我们使用 8 位整数:它们可以从 0 到 255
  • 如果我们使用浮点数:0 到 1

知道了图像是一个矩阵,卷积所做的就是定义一个滤波器或内核,通过它来乘以图像矩阵。如果我们看下一张图片:

https://developer . apple . com/documentation/accelerate/blurring _ an _ image

你定义一个内核,3x3 像素,然后乘以 input_image。会发生什么?内核比图像小得多,所以要乘以整个图像,首先我们将内核放在第一个 3x3 像素上,然后向右移动一个,再一个,再一个…然后我们计算内核的每个元素乘以图像的每个对应像素的乘积之和。如您所见,该操作的结果存储在输出图像中。

在这里你可以看得更清楚:

https://www . research gate . net/publication/334974839 _ 毕业论文 _ 实现 _ 优化 _ 神经网络 _ 使用 _ 提拉米苏/figures?lo=1

Python 中的示例

让我们看一些例子,看看当我们做这些乘法和加法时会发生什么,以及它们如何帮助检测模式和做出预测。

import numpy as np
from scipy import signal
from scipy import misc
ascent = misc.ascent()
kernel = np.array([[-1, 0, +1],
                   [-1, 0, +1],
                   [-1, 0, +1]])
grad = signal.convolve2d(ascent, kernel, boundary='symm', mode='same')import matplotlib.pyplot as plt# function to show two pictures together
def plot_two(img_orig, img_conv):
  fig, (ax_orig, ax_mag) = plt.subplots(1, 2, figsize=(20, 50))
  ax_orig.imshow(img_orig, cmap='gray')
  ax_orig.set_title('Original')
  ax_orig.set_axis_off()
  ax_mag.imshow((img_conv), cmap='gray')
  ax_mag.set_title('Gradient')
  ax_mag.set_axis_off()plot_two(ascent, grad)

这是一个垂直线检测器。让我们定义并使用水平线检测器。

kernel = np.array([[-1, -1, -1],
                   [ 0,  0,  0],
                   [+1, +1, +1]])
grad_v = signal.convolve2d(ascent, kernel, boundary='symm', mode='same')
plot_two(ascent, grad_v)

让我们看看传统卷积中最常用的一些内核

让我们先打印一张未经修改的图片:

# load and show the original picture
url_img = '[https://upload.wikimedia.org/wikipedia/commons/5/50/Vd-Orig.png'](https://upload.wikimedia.org/wikipedia/commons/5/50/Vd-Orig.png')
from urllib.request import urlopen 
from io import BytesIO
from PIL import Image
file = BytesIO(urlopen(url_img).read()) 
img = np.asarray(Image.open(file), dtype='uint8')
plt.imshow(img)
plt.axis('off')

def convolve3d(img, kernel):
  img_out = np.zeros(img.shape)
  for i in range(img.shape[-1]):
     img_out[:,:,i] = signal.convolve2d(img[:,:,i], kernel, boundary='symm', mode='same')
  return img_out.astype('uint8')

身份内核

# Let's try with the Identity Kernel
kernel = [[0, 0, 0],
         [0, 1, 0],
         [0, 0, 0]]
img_ki = convolve3d(img, kernel)
plot_two(img, img_ki)

其他最常用的内核(及其输出)有:

所有这些都非常有用…但是卷积是如何检测模式的呢?

模式检测示例

假设我们有这样一个过滤器:

https://adeshpande 3 . github . io/A-初学者% 27s-理解指南-卷积神经网络/

和下面的图像

https://adeshpande 3 . github . io/A-初学者% 27s-理解指南-卷积神经网络/

如果过滤器放在老鼠的背上会发生什么?

https://adeshpande 3 . github . io/A-初学者% 27s-理解指南-卷积神经网络/

结果将是:

30·0 + 30·50 + 30·20 + 30·50 + 30·50 + 30·50=6600

这是一个很高的数字,表明我们已经找到了一条曲线。

如果过滤器放在老鼠的头上会发生什么?

https://adeshpande 3 . github . io/A-初学者% 27s-理解指南-卷积神经网络/

结果将是:

30·0 + 30·0 + 30·0 + 30·0 + 30·0 + 30·0=0

CNN

现在我们已经介绍了卷积的概念,让我们来研究什么是卷积神经网络以及它们是如何工作的。

https://adeshpande 3 . github . io/A-初学者% 27s-理解指南-卷积神经网络/

在这些图像中,我们可以看到卷积神经网络的典型架构。这无非就是一个 W x H x 3 的矩阵(因为是 RGB)。然后“卷积块”开始。

这些块通常由以下部分组成:

  • 卷积层
  • 汇集层,抽取卷积层输出的内容

在我们已经知道卷积是如何工作的之前:我们定义一个内核或过滤器,用来突出图像中的某些结构。

但是我如何定义一个允许我发现输入图像中有一只黑猫的过滤器呢?

那是 CNN 魔术!我们不需要定义任何过滤器,由于反向传播,网络会自动学习它们!

我们的细胞神经网络有两个阶段:特征提取器和分类器。

特征提取阶段从一般的模式或结构到细节:

  • 第一卷积层检测不同方向的线
  • 下一组检测形状和颜色
  • 下一个更复杂的模式

所以最后,我们拥有的是一个可以自己学习的网络,所以我们不必担心我们选择哪些特征进行分类,因为它是自己选择的。

它是如何学习的?和传统的神经网络一样。

https://www . science direct . com/science/article/ABS/pii/s 0893608015001896

第二阶段,即分类器,由密集层组成,这是传统神经网络中使用的层。

因此,CNN 最终可以理解为一组耦合到传统神经网络的卷积级,传统神经网络对卷积提取的模式进行分类,并返回每个类别的一些概率。

CNN 中的层类型

卷积

这些层负责将卷积应用于我们的输入图像,以找到稍后允许我们对其进行分类的模式:

  • 应用于图像的过滤器/内核的数量:输入图像将通过其进行卷积的矩阵的数量
  • 这些滤镜的大小:99%的时候都是正方形,3×3,5×5 等等。

这里你可以看到一般的方案,其中你可以看到一个给定的输入图像是如何被每个滤波器卷积,输出是 2D 激活图。这意味着,如果输入图像是 RGB,它将有 3 个通道。因此,我们将对每个通道的每个滤波器进行卷积,然后将结果相加,以将 3 个通道减少到仅 1:

由于输入有 3 个通道,R、G 和 B,这意味着我们的输入图像被定义为 3 个二维数组,每个通道一个。

因此,卷积层所做的是将卷积分别应用于每个通道,获得每个通道的结果,然后将它们相加以获得单个 2D 矩阵,称为激活图。

在此链接中,您可以看到更多详细信息:

http://cs231n.github.io/assets/conv-demo/index.html

除了滤波器的数量和尺寸之外,卷积层还有一个我们应该考虑的重要参数:步幅。

这是一个单位步幅的例子:

https://arxiv.org/abs/1603.07285

这是一个 2 单位步幅卷积的例子:

https://arxiv.org/abs/1603.07285

您可以看出差别在于内核在每次迭代中的步长。

感受野

https://www . slide share . net/ssuser 06 e0c 5/convolutionary-neural-networks-135496264

在卷积层的情况下,输出神经元只连接到输入图像的一个局部区域。

可以理解为“网络所见”。对于致密层,情况正好相反,所有的神经元都与所有先前的元素相连。然而,神经元的功能仍然相同,唯一的事情是在入口处它们“看到”整个图像,而不是图像的一个区域。

正如你可以在这篇伟大的文章中发现的:

感受野决定了原始输入在整个网络中的哪个区域能被输出看到。

统筹

池层用于减少我们的激活图的大小,否则,在许多 GPU 上运行它们是不可能的。两种最常见的池类型是:

  • 最大池:计算元素的最大值
  • 平均池:计算要素的平均值

https://www . quora . com/What-is-max-pooling-in-convolutionary-neural-networks

必须考虑到,这是针对我们的体积的每个激活图进行的,也就是说,深度维度根本不介入计算。

让我们看一个不同步长的最大池的例子:

局部连接的层

假设我们有一个 32x32 的输入图像,我们的网络有 5 个卷积层,每个卷积层有 5 个大小为 3x3 的滤波器。这是因为过滤器贯穿图像。

这是基于这样的假设:如果某个滤波器擅长检测图像的位置(x,y)中的某个东西,那么它也应该适合位置(x2,y2)。

这个假设几乎总是有效的,因为通常我们不知道我们的特征在图像中的位置,但是例如,如果我们有一个数据集,其中人脸出现在图像的中心,我们可能希望眼睛区域的过滤器与鼻子或嘴的过滤器不同,对吗?

在这种情况下,如果我们知道要素的位置,那么为每个区域设置一个过滤器会更有意义。

之前,我们必须学习每层 5 个 3×3 的过滤器,这给了我们总共:5⋅3⋅3=45 参数,现在我们必须学习:32⋅32⋅5⋅3=46080 参数。

这是一个巨大的差异。因此,除非我们知道我们要在哪里寻找模式,它们将是不同的,并且总是在相同的位置,否则值得使用卷积层,而不是局部连接层。

对了,看下图:参数最多的层就是密层!这是有意义的,在它们中,所有的神经元都与下一层的所有神经元相互连接。

https://Leonardo araujosantos . git books . io/artificial-intelligence/content/convolatile _ neural _ networks . html

最后的话

一如既往,我希望你喜欢这篇文章,并获得了关于卷积神经网络的直觉!

如果你喜欢这篇帖子,那么你可以看看我在数据科学和机器学习方面的其他帖子

如果你想了解更多关于机器学习、数据科学和人工智能的知识 在 Medium 上关注我 ,敬请关注我的下一篇帖子!

卷积神经网络(CNN)——实用的观点

原文:https://towardsdatascience.com/convolutional-neural-networks-cnns-a-practical-perspective-c7b3b2091aa8?source=collection_archive---------22-----------------------

深入了解卷积神经网络的主要操作,并使用 Mel 光谱图和迁移学习对心跳进行分类。

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

大家好,

希望每个人都平安无事。在这篇博客中,我们将探讨 CNN 的一些图像分类概念,这些概念经常被初学者(包括我在内)忽略或误解。这个博客要求读者对 CNN 的工作有一些基本的了解。然而,我们将涵盖 CNN 的重要方面,然后再深入到高级主题。

在这之后,我们将研究一种称为迁移学习的机器学习技术,以及它如何在深度学习框架上用较少的数据训练模型。我们将在 Resnet34 架构之上训练一个图像分类模型,使用包含以音频形式数字记录的人类心跳的数据。wav)文件。在这个过程中,我们将使用一个流行的 python 音频库 Librosa 将这些音频文件转换成光谱图,从而将它们转换成图像。最后,我们将使用流行的误差度量来检验该模型,并检查其性能。

CNN 的图像分类:

具有 1 次以上卷积运算的神经网络称为卷积神经网络(CNN)。CNN 的输入包含图像,每个像素中的数值沿着宽度、高度和深度(通道)在空间上排列。总体架构的目标是通过从这些空间排列的数值中学习来获得属于某一类的图像的概率分数。在这个过程中,我们对这些数值执行诸如汇集和卷积之类的操作,以沿着深度挤压和拉伸它们。

图像通常包含三层,即 RGB(红、绿、蓝)。

图片由 Purit Punyawiwat 提供,来源: Datawow

CNN 的主要操作

卷积运算

卷积运算( w.x+b) 应用于输入体积中所有不同的空间位置。使用更多数量的卷积运算有助于学习特定的形状,即使它在图像中的位置发生了变化。

例子:通常云出现在风景图片的顶部。如果一个反转的图像被输入 CNN,更多的卷积运算可以确保模型识别云的部分,即使它是反转的。

数学表达式:x _ new = w . x+b其中 w 是滤波器/内核, b 是偏差, x 是隐藏层输出的一部分。对于应用于不同隐藏层的每个卷积运算,w和 b都是不同的。

卷积运算(来源:第 22 讲-EECS251,inst.eecs.berkley.edu)

联营

汇集减少了每个激活图(卷积运算后的输出)的空间维度,同时聚集了局部化的空间信息。池化有助于沿着高度和宽度挤压隐藏层的输出。如果我们考虑非重叠子区域内的最大值,那么它被称为最大池。最大池也增加了模型的非线性。

激活功能

对于 CNN 而言,ReLU 是优选的激活函数,因为与其他激活函数如 tanh 和 sigmoid 相比,它具有简单的可微性和快速性。ReLU 通常跟在卷积运算之后。

让我们检查一下计算每个激活函数的梯度所用的时间:

每个模型生成其导数所用的时间

从上表可以看出,与其他激活函数相比,ReLU 计算其导数所需的时间要少得多。

有时,当图像的边缘构成可能有助于训练模型的重要方面时,填充也用于这些操作之间。它还可以用于抑制由于汇集等操作而导致的高度和宽度方向的收缩。

一般来说,隐藏层的深度,因为卷积运算中使用的数量的滤波器数量。随着每个过滤器学习新的特征或新的形状,过滤器的数量保持较高。

示例:

多滤镜卷积运算,源码: Indoml

这里,我们使用了两个滤波器来执行卷积运算,并且输出的深度也是 2。假设,如果我们使用 3 个过滤器/内核,一个内核可能会学习识别垂直边缘,因为初始层不能学习大于过滤器大小(此处为 33)的特征。第二滤波器可以学习识别水平边缘,第三滤波器可以学习识别图像中的弯曲边缘。*

反向传播

使用反向传播来更新每个卷积运算的权重(w)。反向传播涉及梯度的计算,这反过来帮助 w 达到错误率(或任何其他损失度量)非常小的理想状态。在 Pytorch 中,使用 torch.backward 函数执行反向传播。从数学上来说,我们可以说这个函数类似于 J.v 操作,其中 J 是雅可比矩阵,v 是损耗 w.r.t 下一层的梯度。雅可比矩阵由偏导数组成,可以认为是局部梯度。

对于一个函数,y = f(x)其中 y 和 x 是向量,J.v 是

图片来源:Pytorch.org

其中 l 为损失函数。

批量归一化

执行批量标准化(BN)是为了解决内部协变量移位(ICF)的问题。由于每次操作中权重的分布不同,隐藏层需要更多的时间来适应这些变化。批量标准化技术使得由神经网络学习的较深层的权重较少依赖于在较浅层学习的权重,从而避免 ICF。

它在隐藏层输出的像素级执行。下图是批量大小= 3,隐藏层大小为 44 的示例。最初,批处理规范化据说是在应用 ReLU(激活函数)之前执行的,但是后来的结果发现,当它在激活步骤之后执行时,模型执行得更好。*

图片由 Aqeel Anwar 提供,来源:走向数据科学

Pytorch,在训练期间,一批隐藏层保持运行其计算的平均值和方差的估计,这些估计稍后在该特定层中的评估/测试期间用于归一化。

批量标准化,来源: Pytorch 文档

默认情况下,γ 的元素设置为 1,β的元素设置为 0

正规化

引入正则化是为了检查权重矩阵(w)中的元素,并避免 过拟合。通常,我们在 CNN 中执行 L2 正则化。丢弃也有助于正则化隐藏层的输出,只需以一定的概率 p 丢弃一些完全连接的层连接。Pytorch 通过在一个隐藏层中批量随机分配零到整个通道来实现这一点。

小批量

一组图像(批次)(通常是 2 的幂,如 8、16、32)通过使用 GPU 的能力在这些图像上独立但并行地运行模型而被传递到架构中。小批量有助于我们最大限度地减少更新权重向量的次数,而不会影响结果。微型批处理有助于实现更快的收敛。

小批量梯度下降

使用小批量梯度下降在每次批量后更新重量向量。我们取像素级的所有梯度的平均值,并将其从权重向量中减去,以在每个时期后得到更新的权重向量。

也有一些梯度优化技术,使这一进程更快。 ADAM 就是一种常用的梯度下降优化技术。这里,我们将使用 ADAM 优化技术(尽管在下面的代码中没有具体提到)。

迁移学习

迁移学习是一种机器学习技术,其中模型使用在大型数据集上训练的预训练参数/权重。迁移学习减少了收集更多数据的需求,有助于在小数据集上运行深度学习模型。

如前所述,CNN 的初始层擅长捕捉简单和通用的特征(如边缘、曲线等)。)而更深层次的则擅长复杂特征。因此,只训练较深层的参数(权重)而不更新其他层的参数更有意义。我们将在 ResNet-34 模型上使用这种技术,并检查其性能。

ResNet-34 架构:

图片来自euler.stat.yale.edu

了解数据:

给定的数据包含 313 个音频文件的数字记录的人类心跳。wav 格式。set_b.csv 文件中提供了这些音频文件的标签。为了使用 CNN 的,我们必须将这些音频文件转换成图像格式。

应用于音频信号的傅立叶变换将信号从时域转换到频域。频谱图是应用傅立叶变换后信号的直观表示。Mel 光谱图是以 Mel 标度为 y 轴的光谱图。

音频文件:

以上音频文件的 Mel 声谱图表示:

梅尔光谱图

代码:

为此任务导入必要的模块

创建一个 python 函数,该函数创建每个音频文件的 mel-spectrogram,并将其保存在一个目录中

查看标签数据

准备用于分类的数据,并将每个图像转换为 512512。数据以 70:30 的比例分为训练和验证。批处理大小 4 用于在 GPU 中并行化任务。*

选择要使用的架构

定义模型并将“错误率”设置为错误度量。'误差 _ 率'是(1-精度)**

为我们的模型选择正确的学习率

在选择了正确的学习速率后,我们可以选择使用 learn.freeze()命令使用预训练的参数/权重来训练模型

使用循环学习率更新模型 5 次(即,5 个时期)

一批已验证集合的结果。在这一批中,我们所有的预测都是正确的。

绘制混淆矩阵

最终预测的混淆矩阵

我们的模型在识别杂音和正常心跳方面表现非常好。模型的最终精度大约为 70% (对角线元素的总和/混淆矩阵中所有元素的总和),这在这种情况下非常好,因为给定的数据在某些情况下是不平衡的和有噪声的。你可以在这里找到完整的代码。

结论:

在这篇博客中,我们已经学习了卷积神经网络(CNN)的构建模块的实际方面以及为什么使用它们。我们使用这些概念并建立了一个图像分类模型,将 Mel 频谱图分为 3 类(杂音、期前收缩和正常)。最后,我们用混淆矩阵对性能进行了分析。

如果你发现这个博客有任何帮助,请分享并在这里鼓掌。它鼓励我写更多这样的博客。

谢谢大家!!!

卷积神经网络(CNN)在 5 分钟内

原文:https://towardsdatascience.com/convolutional-neural-networks-cnns-in-5-minutes-dc86d0e27e1e?source=collection_archive---------60-----------------------

任务,CNN 如何工作,学习,AUROC

卷积神经网络(CNN)是用于图像和视频分析的最流行的机器学习模型。

示例任务

以下是可以使用 CNN 执行的一些任务示例:

  • 二元分类:给定来自医学扫描的输入图像,确定患者是否有肺结节(1)或没有(0)
  • 多标记分类:给定来自医学扫描的输入图像,确定患者是否没有、部分或全部以下症状:肺部阴影、结节、肿块、肺不张、心脏扩大、气胸

CNN 如何工作

在 CNN 中,卷积滤波器滑过图像以产生特征图(下图中标为“卷积特征”):

卷积滤镜(黄色)滑过图像(绿色)产生特征图(粉红色,标记为“卷积特征”)的动画。来源: giphy

过滤器检测模式。

当过滤器经过包含图案的图像区域时,输出特征图中会产生高值。

不同的过滤器检测不同的模式。

滤镜检测到的模式类型由滤镜的权重决定,在上面的动画中显示为红色数字。

滤波器权重与相应的像素值相乘,然后将这些相乘的结果相加,以产生进入特征图的输出值。

卷积神经网络包括用许多不同的滤波器多次应用这种卷积运算。

该图显示了 CNN 的第一层:

图片由作者提供(带 CT 切片源无线媒体

在上图中,CT 扫描切片是 CNN 的输入。标有“滤波器 1”的卷积滤波器以红色显示。该过滤器在输入 CT 切片上滑动以产生特征图,显示为红色的“图 1”

然后,检测不同模式的称为“滤波器 2”(未明确示出)的不同滤波器滑过输入 CT 切片,以产生特征图 2,以紫色示出为“图 2”

对过滤器 3(产生黄色的地图 3)、过滤器 4(产生蓝色的地图 4)等等重复该过程,直到过滤器 8(产生红色的地图 8)。

这是 CNN 的“第一层”。因此,第一层的输出是一个 3D 数字块,在这个例子中由 8 个不同的 2D 特征地图组成。

作者图片

接下来我们进入 CNN 的第二层,如上图所示。我们采用我们的 3D 表示(8 个特征图),并对此应用一个称为“过滤器 a”的过滤器。“过滤器 a”(灰色)是 CNN 第二层的一部分。请注意,“过滤器 a”实际上是三维的,因为它在 8 个不同的特征图上各有一个 2×2 平方的权重。因此“过滤器 a”的大小是 8×2×2。一般来说,“2D”CNN 中的滤波器是 3D 的,而“3D”CNN 中的滤波器是 4D 的。

我们在表示中滑动过滤器 a 以产生地图 a,以灰色显示。然后,我们滑动过滤器 b 得到地图 b,滑动过滤器 c 得到地图 c,以此类推。这就完成了 CNN 的第二层。

然后我们可以继续到第三层、第四层等等。然而,需要多层 CNN。CNN 可以有很多层。例如,ResNet-18 CNN 架构有 18 层。

下图,来自krijevsky 等人。,显示了 CNN 早期各层的示例过滤器。CNN 早期的过滤器检测简单的图案,如边缘和特定方向的线条,或简单的颜色组合。

下图来自 Siegel et al. 改编自 Lee et al. ,显示了底部的早期层过滤器、中间的中间层过滤器和顶部的后期层过滤器的示例。

早期层过滤器再次检测简单的图案,如沿特定方向的线条,而中间层过滤器检测更复杂的图案,如面部、汽车、大象和椅子的部分。后面的图层过滤器检测更复杂的图案,如整张脸、整辆车等。在这种可视化中,每个后面的层过滤器被可视化为前一层过滤器的加权线性组合。

如何学习滤镜

我们如何知道在每个滤波器中使用什么特征值?我们从数据中学习特征值。这是“机器学习”或“深度学习”的“学习”部分。

步骤:

  1. 随机初始化特征值(权重)。在这个阶段,模型产生了垃圾——它的预测完全是随机的,与输入无关。
  2. 对一堆训练示例重复以下步骤:(a)向模型输入一个训练示例(b)使用损失函数计算模型的错误程度(c)使用反向传播算法对特征值(权重)进行微小调整,以便下次模型的错误程度会更小。随着模型在每个训练示例中的错误越来越少,它将在训练结束时学习如何很好地执行任务。
  3. 在从未见过的测试示例上评估模型。测试示例是被搁置在一边并且没有在训练中使用的图像。如果模型在测试例子中表现良好,那么它学习了可概括的原则,是一个有用的模型。如果模型在测试示例中表现不佳,那么它记住了训练数据,是一个无用的模型。

下面这个由塔玛斯·齐拉吉创作的动画展示了一个神经网络模型学习。动画显示的是前馈神经网络,而不是卷积神经网络,但学习原理是相同的。在这个动画中,每条线代表一个重量。线旁边显示的数字是重量值。权重值随着模型的学习而变化。

测量性能:AUROC

作者图片

CNN 的一个流行性能指标是 AUROC,即接收机工作特性下的面积。此性能指标指示模型是否能正确地对示例进行排序。AUROC 是随机选择的正面例子比随机选择的负面例子具有更高的正面预测概率的概率。0.5 的 AUROC 对应于抛硬币或无用模型,而 1.0 的 AUROC 对应于完美模型。

补充阅读

有关 CNN 的更多详细信息,请参阅:

有关神经网络如何学习的更多细节,请参见神经网络介绍

最后,有关 AUROC 的更多详细信息,请参见:

原载于 2020 年 8 月 3 日 http://glassboxmedicine.com

卷积神经网络,解释

原文:https://towardsdatascience.com/convolutional-neural-networks-explained-9cc5188c4939?source=collection_archive---------0-----------------------

克里斯托夫·高尔在 Unsplash 上拍摄的照片

卷积神经网络,也称为 CNN 或 ConvNet,是一类神经网络,专门处理具有网格状拓扑结构的数据,如图像。数字图像是视觉数据的二进制表示。它包含一系列以类似网格的方式排列的像素,这些像素包含表示每个像素的亮度和颜色的像素值。

图 1:以像素网格表示的图像( 来源 )

当我们看到一幅图像时,人类的大脑会处理大量的信息。每个神经元都在自己的感受野中工作,并以覆盖整个视野的方式与其他神经元相连。正如在生物视觉系统中,每个神经元只对视野中称为感受野的有限区域的刺激做出反应,CNN 中的每个神经元也只在其感受野中处理数据。这些层以这样的方式排列,使得它们首先检测较简单的图案(直线、曲线等)。)和更复杂的图案(人脸、物体等)。)再往前。通过使用美国有线电视新闻网,人们可以让视觉进入电脑

卷积神经网络体系结构

CNN 通常有三层:卷积层、池层和全连接层。

图 2:一个 CNN 的架构( 来源 )

卷积层

卷积层是 CNN 的核心构件。它承担了网络计算负载的主要部分。

这一层执行两个矩阵之间的点积,其中一个矩阵是一组可学习的参数,也称为核,另一个矩阵是感受野的受限部分。内核在空间上比图像小,但更有深度。这意味着,如果图像由三个(RGB)通道组成,则内核的高度和宽度在空间上很小,但深度会延伸到所有三个通道。

卷积运算图解(来源

在向前传递的过程中,内核在图像的高度和宽度上滑动,产生该接收区域的图像表示。这产生了被称为激活图的图像的二维表示,该激活图给出了图像的每个空间位置处的内核的响应。内核的滑动大小称为步幅。

如果我们有一个大小为 W x W x D 的输入,空间大小为 F 的 Dout 个核,步长为 S,填充量为 P,则输出音量的大小可由以下公式确定:

卷积层公式

这将产生大小为WoutxWout xDout的输出量。

图 3:卷积运算(来源:伊恩·古德菲勒、约舒阿·本吉奥和亚伦·库维尔的深度学习)

卷积背后的动机

卷积利用了激励计算机视觉研究人员的三个重要思想:稀疏交互、参数共享和等变表示。让我们详细描述一下它们中的每一个。

普通的神经网络层使用描述输入和输出单元之间交互的参数矩阵的矩阵乘法。这意味着每个输出单元都与每个输入单元相互作用。但是卷积神经网络有稀疏交互。这是通过使内核小于输入实现的,例如,一幅图像可能有数百万或数千个像素,但在使用内核处理它时,我们可以检测到数十或数百个像素的有意义信息。这意味着我们需要存储更少的参数,这不仅降低了模型的内存需求,而且提高了模型的统计效率。

如果在空间点(x1,y1)计算一个特征是有用的,那么它在其他空间点(比如说(x2,y2))也应该是有用的。这意味着对于单个二维切片,即,为了创建一个激活图,神经元被约束为使用相同的一组权重。在传统的神经网络中,权重矩阵的每个元素都被使用一次,然后就不再被重新访问,而卷积网络有个共享参数,即,为了获得输出,应用于一个输入的权重与应用于其他地方的权重相同。

由于参数共享,卷积神经网络的层将具有与平移等变的特性。它说如果我们以某种方式改变输入,输出也会以同样的方式改变。

汇集层

汇集层通过导出附近输出的汇总统计来替换特定位置的网络输出。这有助于减少表示的空间大小,从而减少所需的计算量和权重。在表示的每个切片上单独处理池化操作。

有几种汇集函数,如矩形邻域的平均值、矩形邻域的 L2 范数以及基于与中心像素的距离的加权平均值。然而,最流行的过程是最大池化,它报告邻域的最大输出。

图 4:汇集操作(来源:奥莱利媒体)

如果我们有一个大小为 W x W x D 的激活图,一个空间大小为 F 的池化内核,以及步长 S ,那么输出量的大小可以由以下公式确定:

填充层的配方

这将产生大小为WoutxWoutxD的输出量。

在所有情况下,池提供了一些平移不变性,这意味着无论对象出现在帧的什么位置,它都是可识别的。

全连接层

这一层中的神经元与前一层和后一层中的所有神经元完全连接,如在常规 FCNN 中所见。这就是为什么它可以像往常一样通过矩阵乘法后跟一个偏置效应来计算。

FC 层有助于映射输入和输出之间的表示。

非线性层

由于卷积是线性操作,并且图像远不是线性的,所以非线性层通常直接放置在卷积层之后,以将非线性引入激活图。

非线性操作有几种类型,常见的有:

1。乙状结肠

sigmoid 非线性的数学形式为σ(κ) = 1/(1+e κ)。它接受一个实数值,并将其“压缩”到 0 到 1 之间的范围内。

然而,sigmoid 的一个非常不理想的性质是,当激活在任一尾部时,梯度几乎变为零。如果局部梯度变得非常小,那么在反向传播中,它将有效地“杀死”梯度。此外,如果进入神经元的数据总是正的,那么 sigmoid 的输出将要么全是正的,要么全是负的,导致权重梯度更新的之字形动态。

2。坦恩

Tanh 将一个实数值压缩到[-1,1]范围内。像乙状结肠一样,激活会饱和,但与乙状结肠神经元不同,它的输出以零为中心。

3。ReLU

整流线性单元(ReLU)在最近几年变得非常流行。它计算函数ф(κ)= max(0,κ)。换句话说,激活只是阈值为零。

与 sigmoid 和 tanh 相比,ReLU 更可靠,收敛速度提高了 6 倍。

不幸的是,ReLU 在训练中很脆弱。流经它的大梯度可以以这样的方式更新它,即神经元永远不会进一步更新。然而,我们可以通过设定适当的学习速度来解决这个问题。

设计卷积神经网络

现在,我们已经了解了各种组件,我们可以构建一个卷积神经网络。我们将使用时尚 MNIST,这是 Zalando 文章图像的数据集,由 60,000 个样本的训练集和 10,000 个样本的测试集组成。每个示例都是 28x28 灰度图像,与 10 个类别的标签相关联。数据集可以从这里下载。

我们的卷积神经网络具有如下架构:

[输入]

→[conv 1]→[批次定额]→[ReLU]→[池 1]

→[conv 2]→[批次定额]→[ReLU]→[池 2]

→ [FC 层]→[结果]

对于两个 conv 层,我们将使用空间大小为 5 x 5 的核,步长为 1,填充为 2。对于这两个池层,我们将使用最大池操作,内核大小为 2,步幅为 2,填充为零。

Conv 1 层的计算(图片由作者提供)

Pool1 图层的计算(图片由作者提供)

Conv 2 层的计算(图片由作者提供)

Pool2 层的计算(图片由作者提供)

完全连接层的大小(图片由作者提供)

为定义 convnet 而截取的代码

**class** **convnet1**(nn.Module):
    **def** __init__(self):
        super(convnet1, self).__init__()

        *# Constraints for layer 1*
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=5, stride = 1, padding=2)
        self.batch1 = nn.BatchNorm2d(16)
        self.relu1 = nn.ReLU()
        self.pool1 = nn.MaxPool2d(kernel_size=2) *#default stride is equivalent to the kernel_size*

        *# Constraints for layer 2*
        self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=5, stride = 1, padding=2)
        self.batch2 = nn.BatchNorm2d(32)
        self.relu2 = nn.ReLU()
        self.pool2 = nn.MaxPool2d(kernel_size=2)

        *# Defining the Linear layer*
        self.fc = nn.Linear(32*7*7, 10)

    *# defining the network flow*
    **def** forward(self, x):
        *# Conv 1*
        out = self.conv1(x)
        out = self.batch1(out)
        out = self.relu1(out)

        *# Max Pool 1*
        out = self.pool1(out)

        *# Conv 2*
        out = self.conv2(out)
        out = self.batch2(out)
        out = self.relu2(out)

        *# Max Pool 2*
        out = self.pool2(out)

        out = out.view(out.size(0), -1)
        *# Linear Layer*
        out = self.fc(out)

        **return** out

我们还在我们的网络中使用了批量归一化,通过明确地强制网络采用单位高斯分布,避免了权重矩阵的不正确初始化。上述定义的网络代码可在这里获得。我们已经使用交叉熵作为我们的损失函数和 Adam 优化器进行了训练,学习率为 0.001。在训练模型之后,我们在测试数据集上实现了 90%的准确率。

应用程序

以下是目前使用的卷积神经网络的一些应用:

1.对象检测:有了 CNN,我们现在有了复杂的模型,如 R-CNNFast R-CNNFast R-CNN,它们是许多部署在自动驾驶汽车、面部检测等中的对象检测模型的主要渠道。

2.语义分割:2015 年,一群来自香港的研究人员开发了一个基于 CNN 的深度解析网络,将丰富的信息纳入图像分割模型。来自加州大学伯克利分校的研究人员还建立了全卷积网络,改进了最先进的语义分割。

3.图像字幕:CNN 与递归神经网络一起使用,为图像和视频编写字幕。这可以用于许多应用,例如活动识别或为视觉障碍者描述视频和图像。YouTube 已经大量部署了这种技术,以便对定期上传到该平台的大量视频进行分析。

参考文献

1.伊恩·古德菲勒、约舒阿·本吉奥和亚伦·库维尔的深度学习由麻省理工学院出版社于 2016 年出版

2.斯坦福大学的课程— CS231n:视觉识别的卷积神经网络费、、杨小琳教授

3.https://data science . stack exchange . com/questions/14349/difference-of-activation-functions-in-neural-networks-in-general

4.https://www . code mentor . io/James _ aka _ Yale/convolutionary-neural-networks-the-biological-inspired-model-iq6s 48 zms

5.https://search enterprise ai . tech target . com/definition/卷积神经网络

卷积神经网络

原文:https://towardsdatascience.com/convolutional-neural-networks-f62dd896a856?source=collection_archive---------16-----------------------

CNN 的基本原理

CNN 是一种特殊类型的人工神经网络,它接受图像作为输入。以下是人工神经网络的基本神经元的表示,它将 X 向量作为输入。然后,X 向量中的值乘以相应的权重,以形成线性组合。因此,施加非线性函数或激活函数,以便获得最终输出。

神经元表示,图片由作者提供

为什么是 CNN?

谈到灰度图像,它们的像素范围从 0 到 255,即 8 位像素值。如果图像的大小是 NxM,那么输入向量的大小将是 NM。对于 RGB 图像,它将是 NM*3。考虑一个大小为 30x30 的 RGB 图像。这将需要 2700 个神经元。一幅 256x256 大小的 RGB 图像需要超过 100000 个神经元。ANN 采用输入向量,并给出一个乘积,作为与输入完全关联的另一个隐藏层的向量。224x224x3 的权重、参数数量非常大。输出层中的单个神经元将有 224x224x3 个权重进入其中。这将需要更多的计算、内存和数据。CNN 利用图像的结构导致输入和输出神经元之间的稀疏连接。每一层在 CNN 上执行卷积。CNN 将输入作为 RGB 图像的图像体积。基本上,一幅图像作为输入,我们对图像应用内核/过滤器来获得输出。CNN 还支持输出神经元之间的参数共享,这意味着在图像的一部分有用的特征检测器(例如水平边缘检测器)可能在图像的另一部分有用。

回旋

每个输出神经元通过权重矩阵(也称为核或权重矩阵)连接到输入中的小邻域。我们可以为每个卷积层定义多个内核,每个内核产生一个输出。每个滤波器围绕输入图像移动,产生第二输出。对应于每个滤波器的输出被叠加,产生输出量。

卷积运算,通过 indoml 成像

这里,矩阵值与核滤波器的相应值相乘,然后执行求和操作以获得最终输出。核滤波器在输入矩阵上滑动,以获得输出向量。如果输入矩阵的维数为 Nx 和 Ny,而核矩阵的维数为 Fx 和 Fy,那么最终输出的维数将为 Nx-Fx+1 和 Ny-Fy+1。在 CNN 中,权重代表一个内核过滤器。k 内核图会提供 k 内核特性。

填料

填充卷积用于保留对我们很重要的输入矩阵的维度,它帮助我们保留图像边界的更多信息。我们已经看到卷积减少了特征图的大小。为了将特征映射的维度保持为输入映射的维度,我们用零填充或附加行和列。

填充,作者图像

在上图中,填充为 1,我们能够保留 3x3 输入的维度。输出特征图的大小是维数 N-F+2P+1。其中 N 是输入映射的大小,F 是内核矩阵的大小,P 是填充的值。为了保持维数,N-F+2P+1 应该等于 N。因此,

按作者保留尺寸、图像的条件

进展

步幅指的是内核过滤器将跳过的像素数,即像素/时间。步幅为 2 意味着内核在执行卷积运算之前将跳过 2 个像素。

步幅演示,由 indoml 制作图像

在上图中,内核过滤器通过一次跳过一个像素在输入矩阵上滑动。步幅为 2 将在执行卷积之前执行两次此跳跃操作,如下图所示。

步幅演示,由 indoml 制作图像

这里要观察的是,当步幅从 1 增加到 2 时,输出特征图减小(4 倍)。输出特征图的维数是(N-F+2P)/S + 1。

联营

池通过子采样提供平移不变性:减小特征图的大小。两种常用的池技术是最大池和平均池。

最大池操作,图像由 indoml

在上面的操作中,池化操作将 4x4 矩阵分为 4 个 2x2 矩阵,并选取四个矩阵中最大的值(最大池化)和四个矩阵的平均值(平均池化)。这减小了特征图的大小,从而在不丢失重要信息的情况下减少了参数的数量。这里需要注意的一点是,池化操作会减少输入特征图的 Nx 和 Ny 值,但不会减少 Nc(通道数)的值。此外,池操作中涉及的超参数是过滤器维度、步幅和池类型(最大或平均)。梯度下降没有要学习的参数。

输出特征地图

输出特征图或体积的大小取决于:

  1. 输入要素地图的大小
  2. 内核大小(千瓦,Kh)
  3. 零填充
  4. 步幅(Sw,Sh)

朴素卷积

这些是卷积神经网络的构建模块,并且依赖于上述参数。输出特征地图的维度可表示为:

o/p 特征图的尺寸,图片由作者提供

扩张卷积

这有一个额外的参数,称为膨胀率。这种技术用于增加卷积中的感受野。这个卷积也称为 atrous 卷积。膨胀率为 2 的 3×3 卷积与简单的 5×5 卷积显示相同的面积,而只有 9 个参数。它可以在相同的计算成本下提供更宽的视野。只有在需要宽视野以及无法承受多重卷积或更大内核的情况下,才应该使用它们。下图描绘了一个扩张的卷积的可接受范围。

放大卷积,图像由Paul-Louis prve

转置卷积

用于增加输出要素地图的大小。它被用在编码器-解码器网络中以增加空间维度。在卷积运算之前,输入图像被适当地填充。

转置卷积,图像由 Divyanshu Mishra

结束了

谢谢,请继续关注更多关于人工智能的博客。

初学者使用 Keras & TensorFlow 2 的卷积神经网络

原文:https://towardsdatascience.com/convolutional-neural-networks-for-beginners-using-keras-and-tensorflow-2-c578f7b3bf25?source=collection_archive---------7-----------------------

边做边学:包含 GitHub 代码的实用指南

来源: https://torres.ai

这是我在两年前写的介绍卷积神经网络的前一篇文章的更新版本。在这篇文章中,我更新了我们用来解释概念的 Kera 代码。自此,Keras 成为 TensorFlow 构建和训练深度学习模型的高级 API 。我会用这个更新来改进内容。

选择性神经元网络广泛应用于计算机视觉任务中。这些网络由一个输入层、一个输出层和几个隐藏层组成,其中一些是卷积的,因此得名。

在本帖中,我们将展示一个具体案例,我们将一步一步地了解这种类型网络的基本概念。具体来说,我们将与读者一起编写一个卷积神经网络来解决上面看到的相同的 MNIST 数字识别问题。

卷积神经网络简介

卷积神经网络(缩写为 CNNs 或 ConvNets)是深度学习神经网络的一个具体例子,它在 90 年代末就已经使用,但近年来在图像识别方面取得了非常令人印象深刻的结果,从而极大地影响了计算机视觉领域。

卷积神经网络与本系列前几篇文章中的神经网络非常相似:它们由神经元组成,神经元具有可以学习的权重和偏差形式的参数。但是 CNN 的一个与众不同的特点是,他们明确假设条目是图像,这允许我们在架构中对某些属性进行编码,以识别图像中的特定元素。

为了直观地了解这些神经网络是如何工作的,让我们想想我们是如何识别事物的。例如,如果我们看到一张脸,我们会认出它,因为它有耳朵、眼睛、鼻子、头发等等。然后,为了确定某样东西是不是一张脸,我们就像有一些验证我们正在标记的特征的心理盒子一样去做。有时候一张脸可能因为被毛发覆盖而没有耳朵,但是我们也有一定概率把它归类为脸,因为我们看到了眼睛,鼻子和嘴巴。实际上,我们可以将其视为与帖子“神经网络的基本概念”中介绍的分类器等效的分类器,它预测输入图像是人脸还是没有人脸的概率。

但在现实中,我们必须先知道一只耳朵或一个鼻子是什么样子,才能知道它们是否在一个图像中;也就是说,我们必须事先识别与我们之前见过的包含耳朵或鼻子的线条、边缘、纹理或形状相似的线条、边缘、纹理或形状。这就是卷积神经网络的各层被委托去做的事情。

但是识别这些元素并不足以说某样东西是一张脸。我们还必须能够识别一张脸的各个部分是如何相遇的,相对大小等等。;否则,这张脸就不像我们习惯的样子了。从视觉上看,吴恩达团队的一篇文章中的这个例子通常能让我们直观地了解分层学习的内容。

(来源

我们想通过这个视觉例子给出的想法是,在现实中,在卷积神经网络中,每一层都在学习不同的抽象层次。读者可以想象,有了多层网络,就有可能识别输入数据中更复杂的结构。

卷积神经网络神经元的基本组件

现在,我们对卷积神经网络如何对图像进行分类有了直观的了解,我们将给出一个识别 MNIST 数字的例子,从中我们将介绍定义卷积网络的两个层,卷积网络可以表示为两个操作中的特定神经元组:卷积和汇集。

卷积运算

在卷积运算中,密集连接层和专用层(我们称之为卷积层)的根本区别在于,密集层在其全局输入空间中学习全局模式,而卷积层在二维小窗口中学习局部模式。

以直观的方式,我们可以说卷积层的主要目的是检测图像中的特征或视觉特征,如边缘、线条、颜色下降等。这是一个非常有趣的特性,因为一旦它学习了图像中某个特定点的特征,它就可以在以后的任何部分识别它。相反,在密集连接的神经网络中,如果它出现在图像的新位置,它必须再次学习模式。

另一个重要特征是,卷积层可以通过保留空间关系来学习模式的空间层次。例如,第一卷积层可以学习诸如边的基本元素,第二卷积层可以学习由在前一层中学习的基本元素组成的模式。以此类推,直到它学会非常复杂的模式。这使得卷积神经网络能够有效地学习日益复杂和抽象的视觉概念。

一般来说,卷积层在称为特征图的 3D 张量上操作,具有高度和宽度的两个空间轴,以及也称为深度的通道轴。对于 RGB 彩色图像,深度轴的维度是 3,因为图像具有三个通道:红色、绿色和蓝色。对于黑白图像,例如 MNIST 数字,深度轴维度是 1(灰度级)。

在 MNIST 的例子中,作为我们神经网络的输入,我们可以想象一个 28×28(高= 28,宽= 28,深= 1)的二维神经元空间。连接到我们已经讨论的输入层神经元的第一层隐藏神经元将执行我们刚刚描述的卷积运算。但是正如我们已经解释过的,并不是所有的输入神经元都与这个第一级隐藏神经元的所有神经元相连接,就像密集连接的神经网络的情况一样;这仅仅是通过存储图像像素的输入神经元空间的小的局部区域来完成的。

直观地解释,可以表示为:

(来源)

在我们前面的例子中,隐藏层的每个神经元将连接到输入层(28×28)的 5×5 个神经元(即 25 个神经元)的小区域。直观上,我们可以想象一个 5×5 大小的窗口,它沿着包含图像的整个 28×28 神经元层滑动。对于窗口的每个位置,隐藏层中都有一个神经元处理这些信息。

视觉上,我们从图像左上角的窗口开始,这为隐藏层的第一个神经元提供了必要的信息。然后,我们将窗口向右滑动一个位置,将此窗口中包含的输入层的 5×5 神经元与隐藏层的第二个神经元“连接”。因此,我们从左到右,从上到下,依次遍历输入层的整个空间。

稍微分析一下我们提出的具体情况,我们注意到,如果我们有 28×28 像素的输入和 5×5 的窗口,这在第一隐藏层中定义了 24×24 个神经元的空间,因为在碰到输入图像的右(或下)边界之前,我们只能将窗口向右移动 23 个神经元,向下移动 23 个神经元。

(来源

我们希望向读者指出,我们所做的假设是,当新的一行开始时,窗口水平和垂直地向前移动 1 个像素。因此,在每一步中,除了我们已经前进的这一行像素之外,新窗口与前一个窗口重叠。但是,正如我们将在下一节中看到的,在卷积神经网络中,可以使用不同长度的前进步长(称为步幅的参数)。在卷积神经网络中,你也可以应用在图像边缘填充零的技术来改善滑动窗口的扫描。定义这种技术的参数称为“填充”,我们也将在下一节更详细地介绍它,使用它可以指定填充的大小。

在我们的研究案例中,并遵循之前提出的形式,为了将隐藏层的每个神经元与输入层的 25 个相应神经元“连接”,我们将使用一个偏差值 b 和一个W-大小为 5×5 的权重矩阵,我们称之为过滤器(或内核)。隐藏层的每个点的值对应于滤波器和输入层的少数 25 个神经元(5×5)之间的标量积。

然而,关于卷积网络的特别和非常重要的事情是,我们对隐藏层中的所有神经元使用相同的滤波器(相同的 W 权重矩阵和相同的 b 偏差):在我们的例子中,对第一层的 24×24 个神经元(总共 576 个神经元)。读者可以在这个特定的例子中看到,这种共享大大减少了如果我们不这样做时神经网络将拥有的参数数量:它从 14,400 个必须调整的参数(5×5 × 24×24)增加到 25 个(5×5)参数加上偏差 b

这个共享的 W 矩阵和 b 偏差,我们已经说过我们在卷积网络的上下文中称之为过滤器,类似于我们用来修饰图像的过滤器,在我们的情况下,过滤器用于在小的条目组中寻找局部特征。我建议查看在 GIMP 图像编辑器手册中找到的例子,以获得卷积过程如何工作的视觉和非常直观的想法。

但是由矩阵 W 和偏差 b 定义的滤波器仅允许检测图像中的特定特征;因此,为了执行图像识别,建议同时使用几个滤波器,每个滤波器用于我们想要检测的一个特征。这就是为什么卷积神经网络中的完整卷积层包括几个滤波器。

下图显示了直观表示该卷积层的一种常用方法,其中隐藏层由几个过滤器组成。在我们的示例中,我们提出了 32 个滤波器,其中每个滤波器都由一个 5×5 的 W 矩阵和一个偏差 b 定义。

(来源)

在该示例中,第一卷积层接收尺寸输入张量(28,28,1)并生成尺寸输出(24,24,32),该尺寸输出是包含对输入计算 32 个滤波器的 32 个 24×24 像素输出的 3D 张量。

联营业务

除了我们刚刚描述的卷积层之外,卷积神经网络还伴随着卷积层和池层,池层通常在卷积层之后立即应用。理解这些层的用途的第一种方法是看到汇集层简化了卷积层收集的信息,并创建了其中包含的信息的压缩版本。

在我们的 MNIST 示例中,我们将选择卷积层的一个 2×2 窗口,并在汇集层的一个点上合成信息。视觉上,可以表达如下:

(来源)

有几种方法来压缩信息,但我们将在示例中使用的一种常用方法称为 max-pooling,它作为一个值保留了我们示例中 2×2 输入窗口中的最大值。在这种情况下,我们将池层的输出大小除以 4,得到一个 12×12 的图像。

平均池也可以用来代替最大池,其中每组入口点被转换成该组点的平均值而不是其最大值。但总的来说,最大池往往比其他解决方案更好。

有趣的是,随着合用的转变,我们保持了空间关系。为了直观地看到它,以下面一个 12×12 的矩阵为例,其中我们表示了一个“7”(假设我们经过的像素包含 1,其余的为 0;我们没有将其添加到绘图中以简化它)。如果我们应用具有 2×2 窗口的最大池操作(我们在中心矩阵中表示它,该中心矩阵在具有窗口大小的区域的马赛克中划分空间),我们获得 6×6 矩阵,其中保持了 7 的等价表示(在右图中,0 标记为白色,值为 1 的点标记为黑色):

(来源)

如上所述,卷积层托管多个过滤器,因此,当我们将最大池分别应用于每个过滤器时,池层将包含与卷积过滤器一样多的池过滤器:

(来源)

结果是,因为我们在每个卷积滤波器中有 24×24 个神经元的空间,所以在进行汇集之后,我们有 12×12 个神经元,这对应于划分滤波器空间时出现的 12×12 个区域(每个区域的大小为 2×2)。

合作环境

在这篇文章中,我们建议使用 Google 提供的 合作实验室 ,我将在这篇文章中使用的代码可以在我的 GitHub 这里 中以 Jupyter 笔记本的形式获得,并使用 colab 执行 这里

在开始定义我们的神经网络之前,我们需要加载所需的 Python 库:

%tensorflow_version 2.x
**import** **tensorflow** **as** **tf**
**from** **tensorflow** **import** keras

**import** **numpy** **as** **np**
**import** **matplotlib.pyplot** **as** **plt** 

在 Keras 中实现一个基本模型

让我们看看这个卷积神经网络的例子是如何使用 Keras 编程的。正如我们已经说过的,为了参数化卷积和汇集阶段,需要指定几个值。在我们的例子中,我们将使用一个简化的模型,每个维度上的步幅为 1(窗口滑动的步长),填充为 0(在图像周围填充零)。这两个超参数将在下面介绍。该池将是如上所述的具有 2×2 窗口的最大池。卷积神经网络的基本结构

让我们继续实现我们的第一个卷积神经网络,它将由一个卷积和一个最大池组成。

在我们的例子中,我们将有 32 个滤波器,卷积层使用 5×5 窗口,池层使用 2×2 窗口。我们将使用 ReLU 激活功能。在这种情况下,我们配置卷积神经网络来处理大小为(28,28,1)的输入张量,这是 MNIST 图像的大小(第三个参数是颜色通道,在我们的情况下是深度 1),我们通过第一层中的参数 input_shape = (28,28,1) 的值来指定它:

**from** **tensorflow.keras** **import** Sequential
**from** **tensorflow.keras.layers** **import** Conv2D
**from** **tensorflow.keras.layers** **import** MaxPooling2D

model = Sequential()
model.add(Conv2D(32, (5, 5), 
          activation='relu', input_shape=(28, 28, 1)))
model.add(MaxPooling2D((2, 2))) 

通过方法 summary() 我们可以获得关于我们模型的细节:

model.summary()Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 24, 24, 32)        832       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 12, 12, 32)        0         
=================================================================
Total params: 832
Trainable params: 832
Non-trainable params: 0
_________________________________________________________________

conv2D 层的参数数量对应于 5×5 的权重矩阵 W,并且每个滤波器的 a b 偏差是 832 个参数(32 × (25 + 1))。Max-pooling 不需要参数,因为它是一个寻找最大值的数学运算。

简单的模型

为了建立一个“深度”神经网络,我们可以像上一节一样堆叠几层。为了向读者展示如何在我们的示例中做到这一点,我们将创建第二组层,其中有 64 个滤波器,卷积层中有一个 5×5 窗口,池层中有一个 2×2 窗口。在这种情况下,输入通道的数量将采用我们从上一层获得的 32 个特征的值,尽管如我们之前所见,没有必要指定它,因为 Keras 推导出了它:

model = models.Sequential()
model.add(layers.Conv2D(32,(5,5),activation=’relu’,
                                input_shape=(28,28,1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (5, 5), activation=’relu’))
model.add(layers.MaxPooling2D((2, 2)))

如果用 summary() 方法显示模型的架构,我们可以看到:

_________________________________________________________________
Layer (type)                 Output Shape Param    #
=================================================================
conv2d_1 (Conv2D)            (None, 24, 24, 32)    832
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 12, 12, 32)    0
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 8, 8, 64)      51264
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 4, 4, 64)      0
=================================================================
Total params: 52,096
Trainable params: 52,096
Non-trainable params: 0
_________________________________________________________________

在这种情况下,产生的第二卷积层的大小为 8×8,因为我们现在从 12×12×32 的输入空间和 5×5 的滑动窗口开始,考虑到它的步幅为 1。参数 51,264 的数量对应于第二层将具有 64 个滤波器(如我们在论证中所指定的)的事实,每个滤波器具有 801 个参数(1 对应于偏差,并且 32 个条目中的每一个具有 5×5 的 W 矩阵)。也就是说((5 × 5×32) +1) ×64 = 51264。

读者可以看到, Conv2DMaxPooling2D 层的输出是一个 3D 形式张量(高度、宽度、通道)。当我们进入神经网络的隐藏层时,宽度和高度维度往往会减小。内核的数量通过传递给 Conv2D 层的第一个参数来控制(通常大小为 32 或 64)。

现在我们有 64 个 4x4 过滤器,下一步是添加一个密集连接的层,这将用于填充 softmax 的最后一层,就像在以前的文章中介绍的那样,以进行分类:

model.add(layers.Dense(10, activation=’softmax’))

在这个例子中,我们必须调整张量以适应密集层的输入,如 softmax,它是一个 1D 张量,而前一个张量的输出是一个 3D 张量。这就是为什么我们必须首先将 3D 张量展平为 1D 之一。在应用 Softmax 之前,我们的输出(4,4,64)必须展平为向量(1024)。

在这种情况下,softmax 层的参数数量为 10 × 1024 + 10,向量的输出为 10,如前一篇文章中的示例所示:

model = models.Sequential()model.add(layers.Conv2D(32,(5,5),activation=’relu’, 
                                 input_shape=(28,28,1)))
model.add(layers.MaxPooling2D((2, 2)))model.add(layers.Conv2D(64, (5, 5), activation=’relu’))
model.add(layers.MaxPooling2D((2, 2)))model.add(layers.Flatten())
model.add(layers.Dense(10, activation=’softmax’))

使用 summary() 方法,我们可以看到关于每一层的参数和每一层的输出张量的形状的信息:

_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 24, 24, 32) 832
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 12, 12, 32) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 8, 8, 64) 51264
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 4, 4, 64) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 1024) 0
_________________________________________________________________
dense_1 (Dense) (None, 10) 10250
=================================================================
Total params: 62,346
Trainable params: 62,346
Non-trainable params: 0
_________________________________________________________________

观察该概述,很容易理解,在卷积层中需要更多的存储器,因此需要更多的计算来存储数据。相比之下,在 softmax 的密集连接层中,需要很少的存储空间,但是相比之下,该模型需要必须学习的大量参数。了解数据和参数的大小很重要,因为当我们有基于卷积神经网络的模型时,它们有许多层,正如我们将在后面看到的那样,这些值可能会呈指数增长。

下图更直观地展示了上述信息,其中我们看到了在各层及其连接之间传递的张量形状的图形表示:

(来源)

模型的训练和评估

一旦定义了神经网络模型,我们就准备训练模型,也就是调整所有卷积层的参数。从这里开始,为了知道我们的模型做得有多好,我们必须像我们在以前的帖子“初学者的深度学习:Python 和 Keras 的实用指南”中的 Keras 例子一样做。出于这个原因,并且为了避免重复,我们将重用上面已经给出的代码:

**from** **tensorflow.keras.utils** **import** to_categorical

mnist = tf.keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

print (train_images.shape)
print (train_labels.shape)
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255

train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)model.compile(loss='categorical_crossentropy',
              optimizer='sgd',
              metrics=['accuracy'])

model.fit(train_images, train_labels,
          batch_size=100,
          epochs=5,
          verbose=1)

test_loss, test_acc = model.evaluate(test_images, test_labels)

print('Test accuracy:', test_acc)

该代码的结果将是:

Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 4s 59us/sample - loss: 0.9310 - accuracy: 0.7577
Epoch 2/5
60000/60000 [==============================] - 2s 34us/sample - loss: 0.2706 - accuracy: 0.9194
Epoch 3/5
60000/60000 [==============================] - 2s 34us/sample - loss: 0.1943 - accuracy: 0.9421
Epoch 4/5
60000/60000 [==============================] - 2s 34us/sample - loss: 0.1529 - accuracy: 0.9553
Epoch 5/5
60000/60000 [==============================] - 2s 34us/sample - loss: 0.1284 - accuracy: 0.9626
10000/10000 [==============================] - 1s 76us/sample - loss: 0.1070 - accuracy: 0.9700 Test accuracy: 0.9704

请记住,代码可以在我的 GitHub 中找到,读者可以验证这个代码提供了大约 97%的准确性。

卷积层的超参数

目前尚未见到的卷积神经网络的主要超参数是:滤波器窗口的大小、滤波器的数量、步长和填充。

过滤器的尺寸和数量

窗口(window _ height×window _ width)的大小通常为 3×3 或 5×5,用于保存空间上接近的像素的信息。告诉我们想要处理的特征数量(output_depth)的过滤器数量通常是 32 或 64。在 Keras 的 Conv2D 层中,这些超参数是我们按以下顺序传递的参数:

Conv2D(输出深度,(窗口高度,窗口宽度))

填料

为了解释填充的概念,让我们用一个例子。让我们假设一个 5×5 像素的图像。如果我们选择一个 3×3 的窗口来执行卷积,我们会看到运算产生的张量大小为 3×3。也就是说,它缩小了一点:在本例中,每个维度正好缩小了两个像素。下图直观地显示了这一点。假设左边的图形是 5×5 的图像。在其中,我们对像素进行了编号,以便更容易地看到 3×3 液滴如何移动来计算过滤器的元素。在中间,表示 3×3 窗口如何在图像中移动,向右移动两个位置,向下移动两个位置。应用卷积运算的结果返回我们在左边表示的过滤器。该过滤器的每个元素都标有一个字母,该字母将其与用来计算其值的滑动窗口的内容相关联。

(来源)

在本帖中我们创建的卷积神经网络的例子中可以观察到同样的效果。我们从 28×28 像素的输入图像开始,并且在第一卷积层之后得到的滤波器是 24×24。在第二个卷积层中,我们从 12×12 张紧器变为 8×8 张紧器。

但有时我们希望获得与输入尺寸相同的输出图像,我们可以在卷积层中使用超参数填充。通过填充,我们可以在滑动窗口之前在输入图像周围添加零。在上图的例子中,为了使输出滤波器与输入图像具有相同的大小,我们可以在零输入图像的右边添加一列,左边添加一列,上面一行,下面一行。从下图中可以看出:

(来源

如果我们现在滑动 3×3 窗口,我们会看到它可以向右移动 4 个位置,向下移动 4 个位置,产生 25 个窗口,从而产生 5×5 的滤波器大小。

(来源)

在 Keras 中,Conv2D 层中的填充是用 padding 参数配置的,它可以有两个值:“same”,表示根据需要添加尽可能多的零的行和列,以使输出与条目具有相同的维数;以及“valid”,表示没有填充(这是 Keras 中该参数的默认值)。

进展

我们可以在卷积层中指定的另一个超参数是步幅,它表示滤波器窗口移动的步数(在上例中,步幅为 1)。

大跨距值会减小将传递给下一层的信息的大小。在下图中,我们可以看到与前面相同的示例,但现在跨距值为 2:

(来源)

正如我们所看到的,5×5 图像变成了一个较小的 2×2 过滤器。但在现实中,减少尺寸的卷积步长在实践中很少使用;为此,使用了我们之前介绍过的池操作。在 Keras 中,Conv2D 层中的步距由步距参数配置,默认为步距=(1,1) 值,分别表示两个维度中的进度。

奖金模式:时尚-MNIST

现在你可以把这篇文章中学到的层用到另一个例子中。你准备好了吗?让我向你推荐另一个数据集,你可以在上面练习并直接应用学到的 CNN 概念。

为此,我们将使用[Fashion-MNIST](https://github.com/zalandoresearch/fashion-mnist) 数据集,该数据集由 Zalando research 发布,包含 10 种不同类型的时尚产品。该数据集由 60,000 个示例的训练集和 10,000 个示例的测试集组成。每个示例都是 28x28 灰度图像,与 10 个类别的标签相关联。它与前一个示例共享图像大小、颜色和项目数量。然后,我们可以开始应用我们在前面的例子中使用的相同的模型。

首先,我建议应用之前数据集使用的相同模型。我们将观察到获得的准确度是 85.93%。转到 colab 并执行下面的代码来验证它:

fashion_mnist = keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data() class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255 model = Sequential()
model.add(Conv2D(32, (5, 5), activation='relu', 
          input_shape=(28, 28, 1)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (5, 5), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(10, activation='softmax')) model.compile(optimizer='sgd',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(train_images, train_labels, epochs=5)
test_loss, test_acc = model.evaluate(test_images,  test_labels)print('Test accuracy:', test_acc)

我们能提高精确度吗?当然,我们仍然可以改进我们的模型。然而,改进一个模型意味着什么呢?正如我们在上一篇文章中了解到的,这意味着尝试应用不同的(更好的)超参数。例如,我们可以在我们的模型中增加更多的神经元,增加更多的层。让我们试试:

model = Sequential()
model.add(Conv2D(64, (7, 7), activation="relu", padding="same",
          input_shape=(28, 28, 1))
model.add(MaxPooling2D(2, 2))
model.add(Conv2D(128, (3, 3), activation="relu", padding="same"))
model.add(MaxPooling2D(2, 2))
model.add(Flatten())
model.add(Dense(64, activation="relu"))
model.add(Dense(10, activation="softmax"))

如你所见,如果我们遵循 colab 代码,我们可以获得 86.28%的准确率。看来我们需要做更多的改进。我建议更换优化器,例如adam:

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

如果我们用这个新的 optimizar 再次训练以前的网络(遵循 colab 代码),获得的准确度是 90.99%。还不错!

我们能改进它吗?是啊!。正如你在建议的 colab 代码中看到的,我们可以获得 92.56%的精确度,增加一种之前没有引入的新型层:BathNormalizatonDropout

最后,我们可以在 colab 代码中看到,我们可以增加epochs的数量,或者使用 Keras 的高级功能作为回调,以达到 94.54%的准确率。

这是一个介绍性的帖子,我希望在未来的帖子中解释更多类型的层或 Keras 的额外功能,这些在这里没有介绍,也没有在之前的帖子中介绍(关于学习过程)。与你分享这个例子的目的是为了表明有许多(和许多)人认为我们仍然需要学习。我鼓励你继续学习深度学习,这当然是一个令人兴奋的话题,有着美好的未来。

实践中的卷积神经网络

原文:https://towardsdatascience.com/convolutional-neural-networks-in-practice-406426c6c19a?source=collection_archive---------14-----------------------

用 Keras 开发和实现你的第一个 CNN!

作者图片

介绍

本文的目标是成为如何开发卷积神经网络模型的教程。如果你想探索它们的理论基础,我鼓励你去看看这篇文章。

CIFAR-10 数据集

在第一个例子中,我们将实现一个可以区分 10 种对象的网络。为此,我们将使用 CIFAR-10 数据集。该数据集由 60,000 张彩色图片组成,分辨率为 32x32 像素,分为 10 个不同的类别,可在下图中查看。数据集被分成 50.000 个训练图片和 10.000 个用于测试的图片。

为了开发这个实现,我们将不使用 TensorFlow,而是使用 Keras。Keras 是一个工作在 TF 之上的框架,它带来了灵活性、快速性和易用性。这些是它最近在深度学习开发者中受欢迎程度上升的主要原因。

**# Original Dataset:** [**https://www.cs.toronto.edu/~kriz/cifar.html**](https://www.cs.toronto.edu/~kriz/cifar.html) **for more information****# Load of necessary libraries**
import numpy as np
from keras.datasets import cifar10
from keras.models import Sequential
from keras.layers.core import Dense, Flatten
from keras.layers.convolutional import Conv2D
from keras.optimizers import Adam
from keras.layers.pooling import MaxPooling2D
from keras.utils import to_categorical**# to make the example replicable**
np.random.seed(42)**# Load of the dataset**
(X_train, Y_train), (X_test, Y_test) = cifar10.load_data()

**i**
import matplotlib.pyplot as plt
class_names = ['airplane','automobile','bird','cat','deer',
               'dog','frog','horse','ship','truck']
fig = plt.figure(figsize=(8,3))
for i in range(len(class_names)):
  ax = fig.add_subplot(2, 5, 1 + i, xticks=[], yticks=[])
  idx = np.where(Y_train[:]==i)[0]
  features_idx = X_train[idx,::]
  img_num = np.random.randint(features_idx.shape[0])
  im = features_idx[img_num,::]
  ax.set_title(class_names[i])
  #im = np.transpose(features_idx[img_num,::], (1, 2, 0))
  plt.imshow(im)
plt.show()

**# Initializing the model**
model = Sequential()**# Defining a convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu', input_shape=(32, 32, 3)))**# Defining a second convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))**# Defining a third convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))**# We add our classificator**
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dense(10, activation='softmax'))**# Compiling the model**
model.compile(loss='categorical_crossentropy',
              optimizer=Adam(lr=0.0001, decay=1e-6),
              metrics=['accuracy'])**# Training of the model**
model.fit(X_train, to_categorical(Y_train),
          batch_size=128,
          shuffle=True,
          epochs=10,
          validation_data=(X_test, to_categorical(Y_test)))**# Evaluation of the model**
scores = model.evaluate(X_test, to_categorical(Y_test))print('Loss: %.3f' % scores[0])
print('Accuracy: %.3f' % scores[1])

这是怎么回事?只有 10%的准确率?似乎我们的网络预测所有样本的类别相同。意味着某些东西正在失败。这肯定与我们的数据有关。在将它输入模型之前,我们没有对它进行预处理。

数据预处理

第一件事是预处理数据,使我们的网络任务尽可能简单。如果我们做不到这一点,因为我们有从 0 到 255 的数据,网络将永远学不到任何东西。

为了进行这种预处理,通常要做两件事:

  • 数据居中:计算数据集的平均值并减去。处理图像时,您可以计算数据集的整个平均值并直接减去它,也可以计算图像每个通道的平均值并从每个通道中减去它。
  • 标准化数据:这样做是为了让所有的数据具有大致相同的比例。两种最常见的方法是:

1)在数据居中(减去平均值)后,将每个维度除以其标准偏差

2)归一化,使每个维度的最小值和最大值分别为-1 和 1。只有当我们从不同尺度的数据开始,但我们知道它们应该是相似的,也就是说,它们对算法具有相似的重要性时,这才有意义。在图像的情况下,我们知道可以取的值是从 0 到 255,因此没有必要进行严格的归一化,因为这些值已经处于类似的范围内。

重要提示!

必须只对训练集进行规范化。换句话说,我们应该计算训练集的平均值和标准偏差,并将这些值用于验证集和测试集。

**# Cenetering the data**
X_train_mean = np.mean(X_train, axis = 0)
X_train_cent = X_train - X_train_mean**# Normalization**
X_train_std = np.std(X_train, axis = 0)
X_train_norm = X_train_cent / X_train_std

现在,我们使用训练集的平均值和标准差来准备验证和测试数据。

等等,但是我们没有验证数据!我们将以这种方式实现这个示例,但非常重要的是,当我们进行真正的开发时,我们有三个集合:

  1. 训练集:更新每批的权重
  2. 验证集:检查网络在各个时期的泛化能力。它使用在训练期间未见过的样本来测试模型,它用于监控网络的训练以供参考,但是它不干预任何计算!它通常在您想要调整参数时使用,该设置是指示哪些参数最适合使用的设置。验证越准确,我们拥有的参数集就越好。由于这个原因,我们不能依靠这个结果来给出网络泛化能力的概念,因为我们选择了网络配置来给出更高的精度。因此,我们必须有一个额外的集合,让我们现在可以说,我们的网络是否适合我从未见过的样本:测试样本。
  3. 测试集:它通过对一个从未见过的集(比验证集大)进行归纳,给我们一种我们的网络有多好的直觉。

好了,让我们准备好测试设备:

X_test_norm = (X_test - X_train_mean) / X_train_std

现在我们准备用标准化数据再次测试我们的网络:

**# Initializing the model**
model = Sequential()**# Defining a convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu', input_shape=(32, 32, 3)))**# Defining a second convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))**# Defining a third convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))**# We add our classificator**
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dense(10, activation='softmax'))**# Compiling the model**
model.compile(loss='categorical_crossentropy',
              optimizer=Adam(lr=0.0001, decay=1e-6),
              metrics=['accuracy'])**# Training of the model**
model.fit(X_train, to_categorical(Y_train),
          batch_size=128,
          shuffle=True,
          epochs=10,
          validation_data=(X_test, to_categorical(Y_test)))**# Evaluation of the model**
scores = model.evaluate(X_test, to_categorical(Y_test))print('Loss: %.3f' % scores[0])
print('Accuracy: %.3f' % scores[1])

众所周知,这个结果比前一个好。因此,我们可以自豪地说,我们已经训练了第一个 CNN,训练精度约为 0.99,测试精度约为 0.7。

下一个合乎逻辑的问题应该是:

培训和测试怎么会有这么大的区别?

正如你们可能已经想到的,深度学习也存在过度拟合,事实上,比其他技术更加明显。

对于那些不记得什么是过度适配的人来说,想想这个:

你有一个网络可以在任何给定的时间检测到哪个角色出现在老友记第 4x08 章。它的工作非常完美,它可以以 99.3%的准确率分辨出哪些角色在舞台上。它非常好用,你可以用 5x01 试试。结果是只有 71.2%的准确率。

嗯,这种现象被称为过度拟合,包括创建一个在我们的数据集中工作得很好的算法,但在推广方面非常糟糕。

在本文中,您可以找到对过度拟合的更深入的探索以及最小化过度拟合的技术。

请看代表基于时间的精度的图表:

看看这个例子:

你会选哪一个?

20 层的比 3 层的好用吧?然而,我们通常寻求的是它具有良好的泛化能力(当发现新数据时,它工作得很好)。如果看到新的数据,你觉得哪个效果会更好?

令人惊讶的是,左边的那个。

让我们回到我们的例子。在我们的例子中,我肯定我们都更喜欢 99 对 70,而不是 90 对 85,对吗?

如何才能实现这一点?标准化和规范化的技术。

重要提示:实际上,通常对图像进行的唯一预处理是将它们的所有值除以 255。这通常足以使网络正常工作,因此我们不依赖于与我们的训练集相关的任何参数。

处理过度拟合

有几种方法可以尽可能地减少过拟合,从而使算法能够更一般化。

批量标准化

称为批量标准化的技术是由 Ioffe 和 Szegedy 开发的技术,旨在减少内部协变量的变化或内部协变量移位,这使得网络对不良初始化更加鲁棒。

内部协变量偏移被定义为由于小批量之间输入数据的不同分布而导致的网络激活分布的变化。小批量之间的这种差异越小,到达网络过滤器的数据就越相似,激活图就越相似,网络训练的效果就越好。

这是通过在训练开始时强制网络激活具有单一高斯分布的选定值来实现的。这个过程是可能的,因为规范化是一个可区分的操作。

它通常在激活功能执行之前插入:

model.add(Conv2D(128, kernel_size=(3, 3), input_shape=(32, 32, 3))model.add(BatchNormalization())model.add(Activation('relu'))

用数学术语来说,我们所做的是用小批量计算的平均值和标准偏差对进入我们网络的每个小批量进行居中和标准化,然后用网络通过训练学习的参数重新调整和偏移数据。

此外,由于我们计算的是每个小批量的平均值和标准偏差,而不是整个数据集的平均值和标准偏差,因此批量定额还会引入一些噪声,这些噪声起到调节器的作用,有助于减少过度拟合。

事实证明,这种技术对于更快地训练网络非常有效。

**# We Import Batch Normalizarion layer**
from keras.layers import BatchNormalization, Activation**# Inizializting the model**
model = Sequential()**# Defining a convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), input_shape=(32, 32, 3)))
model.add(BatchNormalization())
model.add(Activation('relu'))**# Defining a second convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(Activation('relu'))**# Defining a thirdd convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(Activation('relu'))**# We include our classifier**
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dense(10, activation='softmax'))**# Compiling the model**
model.compile(loss='categorical_crossentropy',
              optimizer=Adam(lr=0.0001, decay=1e-6),
              metrics=['accuracy'])**# Training the model**
model.fit(X_train_norm, to_categorical(Y_train),
          batch_size=128,
          shuffle=True,
          epochs=10,
          validation_data=(X_test_norm, to_categorical(Y_test))) # aquí deberíamos usar un conjunto distinto al de test!!!**# Evaluating the model**
scores = model.evaluate(X_test_norm, to_categorical(Y_test))print('Loss: %.3f' % scores[0])
print('Accuracy: %.3f' % scores[1])

我们可以看到,精度提高了 2%,一旦我们达到高数值,这是一个巨大的进步。但仍有改进的余地。

我们来探讨一下正规化。

正规化

正则化包括以某种方式惩罚我们的网络在训练期间做出的预测,以便它不认为训练集是绝对真实的,从而知道当它看到其他数据集时如何更好地进行概括。

看一下这张图表:

https://commons.wikimedia.org/wiki/File:75hwQ.jpg

在这个图表中,我们可以看到一个过度拟合的例子,另一个欠拟合的例子,以及另一个可以正确概括的例子。

哪个是哪个?

  • 蓝色:过度合身
  • 绿色:具有概括能力的好模型
  • 橙色:不合身

现在,看看这个例子,在这个例子之后,有三个神经元数目不同的网络。我们现在看到的是 20 个神经元组成的网络,具有不同的正则化水平。

您可以在这里使用这些参数:

https://cs . Stanford . edu/people/kar pathy/convnetjs/demo/classify 2d . html

这里有一个更完整的:

https://playground.tensorflow.org/

最后,有许多层的网并应用正则化比有一个小的网以避免过度拟合要好得多。这是因为小网络是更简单的函数,具有更少的局部最小值,所以梯度下降达到一个或另一个很大程度上取决于初始化,所以实现的损耗通常具有很大的方差,这取决于初始化。

然而,具有许多层的网络是更复杂的函数,具有更多的局部最小值,尽管它们更难达到,但通常具有所有相似的和更好的损耗。

如果你对这个话题感兴趣:【http://cs231n.github.io/neural-networks-1/#arch】T4。

正则化的方法有很多。以下是最常见的几种:

L2 正则化(拉索正则化)

L2 正则化可能是最常见的。

它包括通过为每个权重添加 1/2 * λ* W**2 项来惩罚损失函数,这导致:

当计算导数时,1/2 只是为了方便,因为这留下了λ* W 而不是 2λ W

这意味着我们惩罚非常高或不同的权重,并希望它们都是相似的量级。如果你还记得,权重意味着每个神经元在预测的最终计算中的重要性。因此,通过这样做,我们使所有的神经元或多或少地同等重要,也就是说,网络将使用其所有的神经元来进行预测。

相反,如果某些神经元有非常高的权重,预测的计算就会更多地考虑它们,所以我们最终会得到一个没有用的死神经元网络。

此外,在我们的损失函数中引入 1/2 * λ* W**2 项使得我们的权重在梯度下降期间接近于零。随着 W+=-λ⋅W.的线性衰减

让我们看看是否可以通过应用 L2 正则化来改进我们的网络:

**# L2 Regularization****# Regularizer layer import**
from keras.regularizers import l2**# Inizializing the model**
model = Sequential()**# Defining a convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu', input_shape=(32, 32, 3)))**# Defining a second convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))**# Defining a third convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))**# Classifier inclusion**
model.add(Flatten())
model.add(Dense(1024, activation='relu', kernel_regularizer=l2(0.01)))
model.add(Dense(10, activation='softmax'))**# Compiling the model**
model.compile(loss='categorical_crossentropy',
              optimizer=Adam(lr=0.0001, decay=1e-6),
              metrics=['accuracy'])**# Traning the model**
model.fit(X_train_norm, to_categorical(Y_train),
          batch_size=128,
          shuffle=True,
          epochs=10,
          validation_data=(X_test_norm, to_categorical(Y_test)))**# Evaluating the model**
scores = model.evaluate(X_test_norm, to_categorical(Y_test))print('Loss: %.3f' % scores[0])
print('Accuracy: %.3f' % scores[1])

L1 正则化(脊正则化)

L1 也很常见。这一次,我们在损失函数中加入了λ|w|项。

我们还可以在所谓的弹性网正则化中将 L1 正则化与 L2 结合起来:

L1 正则化设法将 W 权重矩阵转换成稀疏权重矩阵(非常接近零,除了少数元素)。

这意味着,与 L2 不同,它给予一些神经元比其他神经元更大的重要性,使得网络对可能的噪声更具鲁棒性。

一般来说,L2 通常会给出更好的结果。如果您知道图像中有一定数量的特征可以很好地进行分类,并且您不希望网络被噪声扭曲,则可以使用 L1。

我们试试 L1,然后是 L1+L2:

**# L1 Regularization****# Regularizer layer import**
from keras.regularizers import l1**# Inizializing the model**
model = Sequential()**# Defining a convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu', input_shape=(32, 32, 3)))**# Defining a second convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))**# Defining a third convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))**# Classifier inclusion**
model.add(Flatten())
model.add(Dense(1024, activation='relu', kernel_regularizer=l1(0.01)))
model.add(Dense(10, activation='softmax'))**# Compiling the model**
model.compile(loss='categorical_crossentropy',
              optimizer=Adam(lr=0.0001, decay=1e-6),
              metrics=['accuracy'])**# Traning the model**
model.fit(X_train_norm, to_categorical(Y_train),
          batch_size=128,
          shuffle=True,
          epochs=10,
          validation_data=(X_test_norm, to_categorical(Y_test)))**# Evaluating the model**
scores = model.evaluate(X_test_norm, to_categorical(Y_test))print('Loss: %.3f' % scores[0])
print('Accuracy: %.3f' % scores[1])

**# Elastic Net Regularization (L1 + L2)****# Regularizer layer import**
from keras.regularizers import l1_l2**# Inizializing the model**
model = Sequential()**# Defining a convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu', input_shape=(32, 32, 3)))**# Defining a second convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))**# Defining a third convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))**# Classifier inclusion**
model.add(Flatten())
model.add(Dense(1024, activation='relu', kernel_regularizer=l1_l2(0.01, 0.01)))
model.add(Dense(10, activation='softmax'))**# Compiling the model**
model.compile(loss='categorical_crossentropy',
              optimizer=Adam(lr=0.0001, decay=1e-6),
              metrics=['accuracy'])**# Traning the model**
model.fit(X_train_norm, to_categorical(Y_train),
          batch_size=128,
          shuffle=True,
          epochs=10,
          validation_data=(X_test_norm, to_categorical(Y_test)))**# Evaluating the model**
scores = model.evaluate(X_test_norm, to_categorical(Y_test))print('Loss: %.3f' % scores[0])
print('Accuracy: %.3f' % scores[1])

最大范数约束

另一种正规化是基于限制的正规化。例如,我们可以设置权重不能超过的最大阈值。

在实践中,这是通过使用下降梯度来计算新的权重值来实现的,正如我们通常所做的那样,但是然后为每个神经元计算每个权重向量的范数 2,并将其作为不能超过 C 的条件,即:

正常情况下, C 等于 3 或 4。

我们通过这种标准化实现的是网络不会“爆炸”,也就是说,权重不会过度增长。

让我们看看这种正规化是如何进行的:

**# Elastic Net Regularization (L1 + L2)****# Regularizer layer import**
from keras.constraints import max_norm**# Inizializing the model**
model = Sequential()**# Defining a convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu', input_shape=(32, 32, 3)))**# Defining a second convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))**# Defining a third convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))**# Classifier inclusion**
model.add(Flatten())
model.add(Dense(1024, activation='relu', kernel_costraint=max_norm(3.)))
model.add(Dense(10, activation='softmax'))**# Compiling the model**
model.compile(loss='categorical_crossentropy',
              optimizer=Adam(lr=0.0001, decay=1e-6),
              metrics=['accuracy'])**# Traning the model**
model.fit(X_train_norm, to_categorical(Y_train),
          batch_size=128,
          shuffle=True,
          epochs=10,
          validation_data=(X_test_norm, to_categorical(Y_test)))**# Evaluating the model**
scores = model.evaluate(X_test_norm, to_categorical(Y_test))print('Loss: %.3f' % scores[0])
print('Accuracy: %.3f' % scores[1])

辍学正规化

退出正则化是 Srivastava 等人在他们的文章“退出:防止神经网络过度拟合的简单方法”中开发的一种技术,补充了其他类型的标准化(L1、L2、maxnorm)。

这是一种非常有效和简单的技术,它包括在训练期间以概率 p 保持神经元活跃或将其设置为 0。

我们实现的是在训练时改变网络的架构,这意味着将不会有单个神经元负责被激活到某个模式,但我们将有多个冗余神经元能够对该模式做出反应。

让我们看看应用辍学如何影响我们的结果:

**# Dropout****# Dropout layer import**
from keras.layers import Dropout**# Inizializing the model**
model = Sequential()**# Defining a convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(Dropout(0.25))**# Defining a second convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
model.add(Dropout(0.25))**# Defining a third convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
model.add(Dropout(0.25))**# Classifier inclusion**
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))**# Compiling the model**
model.compile(loss='categorical_crossentropy',
              optimizer=Adam(lr=0.0001, decay=1e-6),
              metrics=['accuracy'])**# Traning the model**
model.fit(X_train_norm, to_categorical(Y_train),
          batch_size=128,
          shuffle=True,
          epochs=10,
          validation_data=(X_test_norm, to_categorical(Y_test)))**# Evaluating the model**
scores = model.evaluate(X_test_norm, to_categorical(Y_test))print('Loss: %.3f' % scores[0])
print('Accuracy: %.3f' % scores[1])

现在,让我们看看 Max norm + Dropout 的影响:

**# Dropout & Max Norm****# Dropout & Max Norm layers import**
from keras.layers import Dropout
from keras.constraints import max_norm**# Inizializing the model**
model = Sequential()**# Defining a convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(Dropout(0.25))**# Defining a second convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
model.add(Dropout(0.25))**# Defining a third convolutional layer**
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
model.add(Dropout(0.25))**# Classifier inclusion**
model.add(Flatten())
model.add(Dense(1024, activation='relu', kernel_constraint=max_norm(3.)))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))**# Compiling the model**
model.compile(loss='categorical_crossentropy',
              optimizer=Adam(lr=0.0001, decay=1e-6),
              metrics=['accuracy'])**# Traning the model**
model.fit(X_train_norm, to_categorical(Y_train),
          batch_size=128,
          shuffle=True,
          epochs=10,
          validation_data=(X_test_norm, to_categorical(Y_test)))**# Evaluating the model**
scores = model.evaluate(X_test_norm, to_categorical(Y_test))print('Loss: %.3f' % scores[0])
print('Accuracy: %.3f' % scores[1])

有更多的技术来处理过度拟合,如最大池,改变步幅…等等。在实践中,最好的方法是应用其中的几种,并根据所面临的问题测试哪种组合能提供最好的结果。

最后的话

一如既往,我希望你喜欢这篇文章,并且获得了关于如何实现和开发卷积神经网络的直觉!

如果你喜欢这篇文章,那么你可以看看我关于数据科学和机器学习的其他文章 这里

如果你想了解更多关于机器学习、数据科学和人工智能的知识 请在 Medium 上关注我,敬请关注我的下一篇帖子!

卷积神经网络的数学

原文:https://towardsdatascience.com/convolutional-neural-networks-mathematics-1beb3e6447c0?source=collection_archive---------3-----------------------

米盖尔·Á的照片。帕德里纳来自派克斯

卷积神经网络-第 1 部分:深入探究 CNN 的基本原理。

计算机视觉是深度学习的一个子领域,它处理所有尺度的图像。它允许计算机通过自动过程处理和理解大量图片的内容。
计算机视觉背后的主要架构是卷积神经网络,它是前馈神经网络的衍生物。它的应用非常广泛,例如图像分类、物体检测、神经类型转移、人脸识别……如果你没有深度学习的一般背景,我建议你先阅读我关于前馈神经网络的帖子

注意:因为 Medium 不支持 LaTeX,所以数学表达式是作为图像插入的。因此,为了更好的阅读体验,我建议你关闭黑暗模式。

目录

1。过滤处理
2。定义
3。基础
4。训练 CNN
5。常见架构

1-过滤处理

图像的第一次处理是基于过滤器,例如,使用垂直边缘和水平边缘过滤器的组合来获得图像中对象的边缘。
从数学上讲,垂直边缘滤波器,VEF,如果定义如下:

其中 HEF 代表水平边缘滤波器。

为了简单起见,我们考虑灰度 6×6 图像 A,这是一个 2D 矩阵,其中每个元素的值表示相应像素中的光量。
为了从该图像中提取垂直边缘,我们执行一个卷积乘积(⋆) ,它基本上是每个块中元素乘积的总和:

我们对图像的第一个 3x3 块执行元素乘法,然后我们考虑右边的下一个块,并做同样的事情,直到我们覆盖了所有潜在的块。

我们可以把以下过程归纳为:

给定这个例子,我们可以考虑对any objective使用相同的过程,其中filter is learnedneural network执行,如下所示:

主要的直觉是设置一个神经网络,将图像作为输入,输出一个定义好的目标。使用反向传播学习参数。

2-定义

卷积神经网络是一系列卷积和汇集层,允许从图像中提取最符合最终目标的主要特征。

在下一节中,我们将详细介绍每一块砖及其数学方程。

卷积乘积

在我们明确定义卷积积之前,我们将首先定义一些基本操作,如填充和步长。

填充

正如我们在使用垂直边缘滤波器的卷积产品中看到的那样,图像角落的像素(2D 矩阵)比图像中间的像素使用得少,这意味着边缘的信息被丢弃了。
为了解决这个问题,我们经常在图像周围添加填充,以便考虑边缘上的像素。按照惯例,我们用zeros表示padde,用p表示填充参数,该参数表示添加到图像四个边中的每一个边上的元素数量。
下图说明了灰度图像(2D 矩阵)的填充,其中p=1:

跨步

跨距是卷积乘积中的步长。大的步幅允许缩小输出的大小,反之亦然。我们称步幅参数为s
下图显示了带有s=1的卷积乘积(每个块的逐元素总和):

卷积

一旦我们定义了步幅和填充,我们就可以定义张量和滤波器之间的卷积积。
在先前定义了 2D 矩阵上的卷积积(是element-wise product的和)之后,我们现在可以正式定义体积上的卷积积。
一般来说,图像在数学上可以表示为具有以下维度的张量:

例如,在 RGB 图像的情况下,n_C=3,我们有红色、绿色和蓝色。按照惯例,我们认为滤波器 Ksquared并且具有表示为 f,odd dimension,这允许每个像素在滤波器中居中,从而考虑其周围的所有元素。
当操作卷积乘积时,滤波器/内核 K 必须将same number of channels作为图像,这样我们对每个通道应用不同的滤波器。因此,过滤器的尺寸如下:

图像和过滤器之间的convolutional product是一个2D matrix,其中每个元素是立方体(过滤器)和给定图像的子立方体的元素乘法的和,如下图所示:

从数学上来说,对于给定的图像和滤波器,我们有:

保持与之前相同的符号,我们有:

统筹

它是通过总结信息对图像的特征进行下采样的步骤。该操作通过每个通道执行,因此它只影响尺寸(n_H,n_W ),并保持 n_C 不变。
给定一幅图像,我们滑动一个过滤器,用no parameters来学习,按照一定的步幅,我们对选定的元素应用一个函数。我们有:

按照惯例,我们考虑大小为 f 的平方滤波器,我们通常设置 f =2,并考虑 s =2。

我们经常应用:

  • Average pooling:我们对过滤器上的元素进行平均
  • Max pooling:给定过滤器中的所有元素,我们返回最大值

下面是一个平均池的例子:

3-基础

在这一节中,我们将结合上面定义的所有操作,逐层构建一个卷积神经网络。

CNN 的一层

卷积神经网络的每一层可以是:

  • Convolutional layer -CONV-后面跟着一个activation function
  • Pooling layer -POOL-如上详述
  • Fully connected layer -FC-基本上类似于前馈神经网络的层,

你可以在我之前的帖子中看到更多关于激活功能和完全连接层的细节。

卷积层

正如我们之前看到的,在卷积层,我们对输入应用卷积乘积 s ,这次使用了许多滤波器,然后是激活函数ψ。

我们可以在下图中总结卷积层:

汇集层

如前所述,池图层旨在对输入要素进行缩减采样,而不会影响通道的数量。
我们考虑以下符号:

我们可以断言:

池层有no parameters要学习。

我们在下图中总结了前面的操作:

全连接层

全连接层是有限数量的神经元,它接受一个向量的输入,并返回另一个向量。

我们在下图中总结了完全连接的层:

更多细节,你可以访问我的关于前馈神经网络的 p 上一篇文章

CNN 总的来说

一般来说,卷积神经网络是上述所有操作的系列,如下所示:

在激活函数之后重复一系列卷积之后,我们应用一个池并重复这个过程一定次数。这些操作允许从将被fed的图像extract features到由完全连接的层描述的neural network,该完全连接的层也有规律地被激活功能跟随。
大意是通过网络更深入时decrease n_H & n_W 和increase n_C。
在 3D 中,卷积神经网络具有以下形状:

CNN 为什么工作效率高?

卷积神经网络能够实现图像处理的最新成果有两个主要原因:

  • 参数共享:卷积层中的特征检测器在图像的一部分有用,在其他部分可能有用
  • 连接的稀疏性:在每一层中,每个输出值只依赖于少量的输入

4-培训 CNN

卷积神经网络是在一组标记图像上训练的。从给定的图像开始,我们通过 CNN 的不同层传播它,并返回所寻找的输出。
在本章中,我们将介绍学习算法以及数据扩充中使用的不同技术。

数据预处理

数据扩充是增加给定数据集中图像数量的步骤。数据扩充中使用了许多技术,例如:

  • Crooping
  • Rotation
  • Flipping
  • Noise injection
  • Color space transformation

由于训练集的规模较大,它启用了better learning,并允许算法从所讨论的对象的不同conditions中学习。
一旦数据集准备好了,我们就像任何机器学习项目一样把它分成三个部分:

  • 训练集:用于训练算法和构造批次
  • Dev set :用于微调算法,评估偏差和方差
  • 测试集:用于概括最终算法的误差/精度

学习算法

卷积神经网络是一种专门用于图像的特殊类型的神经网络。一般来说,神经网络中的学习是在几个层中计算上面定义的参数的权重的步骤。
换句话说,我们的目标是从输入图像开始,找到给出真实值的最佳预测/近似的最佳参数。
为此,我们定义了一个目标函数,称为loss function,记为J,它量化了整个训练集的实际值和预测值之间的距离。
我们通过以下两个主要步骤最小化 J:

  • **Forward Propagation**:我们通过网络整体或分批传播数据,并计算这批数据的损失函数,该函数只不过是不同行的预测输出中的误差之和。
  • **Backpropagation**:包括计算成本函数相对于不同参数的梯度,然后应用下降算法更新它们。

我们多次重复相同的过程,称为epoch number。定义架构后,学习算法编写如下:

(*)成本函数评估单点的实际值和预测值之间的距离。

更多的细节,你可以访问我的 p 上一篇关于前馈神经网络的文章

5-通用架构

雷斯内特

Resnet、捷径或跳过连接是一个卷积层,它在层 n 处考虑了层 n-2 。直觉来自于这样一个事实:当神经网络变得非常深入时,输出端的精度变得非常稳定,不会增加。注入前一层的残差有助于解决这个问题。
让我们考虑一个残差块,当skip connectionoff时,我们有以下等式:

我们可以在下图中对残差块进行求和:

初始网络

在设计卷积神经网络时,我们经常要选择层的类型:CONVPOOLFC。初始层完成了所有的工作。所有操作的结果然后是单个块中的concatenated,其将是下一层的输入,如下:

需要注意的是,初始层提出了computational cost的问题。供参考,名字inception来源于电影!

结论

在本文的第一部分中,我们已经看到了从卷积产品、池化/全连接层到训练算法的 CNN 基础。

第二部分中,我们将讨论图像处理中使用的一些最著名的架构。

不要犹豫,检查我以前的文章处理:

参考

原载于 2020 年 2 月 24 日https://www.ismailmebsout.com

卷积神经网络从零开始建模和冻结

原文:https://towardsdatascience.com/convolutional-neural-networks-model-from-scratch-for-object-detection-820893610919?source=collection_archive---------46-----------------------

如果你不能简单地解释它,你就理解得不够好- 爱因斯坦,这个人和他的成就g . j .惠特罗著,多佛出版社 1973 年。

CNN 模型从零开始,使用最流行的 Kaggle 数据集 Fruits-360 ,获得 98%的准确率。

第一步——将数据集从 Kaggle 导入 Google Colab

登录你的 Kaggle 账户,进入我的账户,点击创建新 API 下载 Kaggle.json 文件。然后在 Google colab 上按照下面的代码要点上传相同的 API

  • 直接将整个数据集导入到 google colab 并解压缩

步骤 2-准备训练和测试数据

  • 数据已经包含了训练和测试文件夹,里面有水果和蔬菜的图片。我们只需要定义文件夹的路径,

  • 现在我们必须将图像的尺寸定义到 NumPy-array 中,这样我们可以在接下来的步骤中进一步将图像缩小到 32x32

  • 让我们找出,在训练数据中有多少种水果和蔬菜

在这里,我创建了一个流程来缩小图片的尺寸,并放大一点以获得更好的效果

  • 这段代码将显示缩小、缩放图像的最终结果

步骤 3 CNN 构建和模型调整

请对像素矩阵、RGB 通道、颜色矩阵和人工神经网络有一个基本的了解,以便进一步阅读

在初学者的术语中,使用 CNN 我们所做的是,在我们的密集层之间添加额外的层,或者换句话说,将我们在 CNN 中定义的矩阵与密集层创建的矩阵相乘,移动到每个像素并填充输出矩阵,因此输出矩阵将具有 Ai 记录图像中一些变化的所有值,如形状或轮廓的变化。这种在每个像素上的乘法和加法被称为卷积,以记录图像中的边缘或形状。

这里实际发生的是,我们使用滤镜矩阵定义了某些颜色像素,它与图像像素中的所有其他颜色进行“卷积”,从而找到图案,想象滤镜是黑色的,我们在一幅画上加阴影,我们在输出中得到的是全黑,但一些深色在黑色上突出显示,给我们提供了形状,这些形状在输出矩阵中注册。

source—https://stack overflow . com/questions/52067833/how-to-plot-a-animated-matplotlib 中的 matrix

直观地说,当我们继续将我们的 CNN 滤波器矩阵与图像像素上的密集层矩阵进行卷积时,我们将在曲线、点或一些不同于图像其余部分的形状处获得许多不同的结果/数字,这反过来将帮助 AI 或 ANN 找到形状、边缘、轮廓。
随着我们深入到网络中,添加更多 CNN 层矩阵,做矩阵产品越做越深,

查尔斯·德鲁维奥在 Unsplash 上的照片

结果/数字将发生更大的变化,或者你可以说形状,曲线对人工智能来说将变得更加清晰,人工智能将能够学习苹果和菠萝之间的区别。通俗地说,我们可以说人工智能是通过描摹一幅真实的画来绘制图像,而 CNN 是描摹者或荧光笔。在下面的代码中,32 和 64 是过滤器,CNN 的矩阵大小是 3x3

为 CNN 选择网络架构

你可以在已经建立的各种网络架构之间进行交叉验证,并通过数学证明进行研究,如 AlexNet、LeNet-5、VGG,或者尝试创建自己的网络架构,既不会扩大梯度,也不会过度拟合数据。这里我使用了一个基本的 CNN 架构,对于更高级的模型,我建议学习网络架构和过滤器/内核构建,具有像角度旋转、水平/垂直过滤器等功能。

填充

填充是向像素矩阵添加额外边界的过程,因此在卷积过程中,角上的信息不会丢失,例如在矩阵周围添加 0 的边界。正如您在图像中看到的,如果没有填充,我们将只使用一次带信息的角,但现在有了填充,原始角将在卷积过程中多次使用。

联营

在从卷积中获得输出后,我们使用了一层 max pool,max pool 的作用是简单地降低矩阵的维数,或者换句话说,降低卷积输出的输出图像的大小,以实现更快、更精确的过程。

为了对池中发生的事情有一个基本的直觉,我们定义了一个矩阵,例如 2x2 矩阵,它会将输出矩阵划分为 2x2 多个矩阵,并通过计算出特定 2x2 矩阵中的最大值,仅保留看起来有一些形状或对象的点,然后这将进一步帮助减少输出图像的维度,以便更快地处理深入网络

来源-https://www.youtube.com/watch?v=ZjM_XQa5s6s,深渊蜥蜴

请参考 AndrewNg 的视频,了解 CNN 在添加图层后图像尺寸的变化

  • 现在是时候添加输入和输出层,并调整人工神经网络模型

  • 保存模型,在互联网上的随机图像上进行测试,看看您训练的模型是否可以识别水果和蔬菜

model.save_weights(“cnn_fruit.h5”)

结果

通过将 CNN 添加到我们的模型中,我能够达到 98%的准确性,在使这成为您的第一个项目后,我认为您将对 CNN 有一个基本的直观了解,并可以更深入地研究数学部分、基本原理以及网络选择和构建。

cnn_fruit.h5 结果

CNN 定制架构结果

冻结用于集成到 web 应用程序中的定制 CNN 模型,

这段代码将把你定制的模型冻结成 Keras 检查点格式,然后你可以为应用程序集成制作推断图

对于完整的 jupyter 笔记本和代码,你可以通过github.com——https://github.com/Alexamannn/CNN_from_scratch查看我的知识库

最流行的卷积神经网络架构

原文:https://towardsdatascience.com/convolutional-neural-networks-most-common-architectures-6a2b5d22479d?source=collection_archive---------5-----------------------

了解它们的结构以及如何实现它们!

图片来自 Unsplash

介绍

本文的目的是深入探讨以下概念:

  • 最流行的 CNN 架构
  • 如何用 Keras 实现它们来进行图像分类

最常见的架构

有研究团队完全致力于为 CNN 开发深度学习架构,并在庞大的数据集中训练它们,所以我们将利用这一点,并使用它们,而不是每次面临新问题时都创建新的架构。

这将为我们提供稳定性和精确性。

目前 CNN 最常见的深度学习架构有:

  • VGG
  • 雷斯内特
  • 开始
  • 例外

让我们来探索它们。

VGG16 和 VGG19

这种架构是最早出现的架构之一,由 Simonyan 和 Zisserman 在 2014 年发表的题为“用于大规模图像识别的非常深的卷积网络”的论文中介绍。本文可从这里获得:【https://arxiv.org/abs/1409.1556】T2。

按作者分列的数字

这是一种简单的架构,仅使用由递增数量的卷积层组成的块,具有 3×3 大小的滤波器。此外,为了减少获得的激活图的大小,最大池块被散布在卷积块之间,从而将这些激活图的大小减少一半。最后,使用一个分类块,由两个各有 4096 个神经元的密集层和最后一层(1000 个神经元的输出层)组成。

16 和 19 是指每个网络拥有的加权层数(卷积层和密集层,池层不计算在内)。它们对应于下表中的 D 列和 E 列。

截图来自 [wiki.math](http://very Deep Convoloutional Networks for Large-Scale Image Recognition)

表中的其余架构都在那里,因为当时 Simonyan 和 Zisserman 很难训练他们的架构进行融合。由于他们无法做到这一点,他们想出的是先用更简单的架构训练网络,一旦这些网络收敛并被训练,他们就利用自己的权重来初始化下一个稍微复杂一点的网络,以此类推,直到他们到达 VGG19。这个过程被称为“预训练”。

然而,这是在那些时候,现在它不再做,因为它需要太多的时间。现在我们可以使用 Xavier/Glorot 或 he 等人的初始化来实现同样的事情。

然而,这个网络有几个缺点:

  • 训练时间太长了
  • 它有非常多的参数

雷斯内特

由何等人在 2015 年开发的 ResNet 架构(你可以在这里看到他们名为“图像识别的深度剩余学习”的论文:)是引入基于“模块”的奇异类型架构的里程碑,或者正如现在所知的,“网络中的网络”。

这些网络引入了“剩余连接”的概念,如下图所示:

按作者分列的数字

这些块允许到达先前激活图的层 l+1l+1 部分而无需修改,并且被属于层 L1 的块部分修改,正如你在上面的图像中所看到的。

2016 年,他们改进了这种架构,在这些残余块中加入了更多层,如下图所示:

按作者分列的数字

ResNet 有各种不同的层数,但使用最多的是 ResNet50,它由 50 个带权重的层组成。

值得注意的是,虽然它的图层比 VGG 多得多,但它需要的内存却少得多,几乎只有原来的五分之一。这是因为该网络不是在分类阶段使用密集层,而是使用一种称为 GlobalAveragePooling 的层,它将特征提取阶段最后一层的 2D 活动图转换为 class 向量,用于计算属于每个类的概率。

盗梦空间 V3

这种类型的架构是 2014 年由 Szegedy 等人在他们的论文“用卷积走得更深”(【https://arxiv.org/abs/1409.4842】)中介绍的,它使用带有不同大小滤波器的块,然后将这些块连接起来,以提取不同尺度的特征。看图片:

按作者分列的数字

为了帮助您理解这一点,inception 块的目标是使用 1x1、3x3 和 5x5 卷积计算激活图,以提取不同比例的特征。然后,您只需将所有这些激活映射连接成一个。

这种体系结构需要的内存甚至比 VGG 和 ResNet 还要少。

例外

这种架构是由 Fran ois Chollet(Keras 的创造者)提出的,他给《盗梦空间》带来的唯一东西是他优化了回旋,使它们花费更少的时间。这是通过将 2D 卷积分成两个 1D 卷积来实现的。如果你有兴趣了解更多,这里有论文:《异常:深度学习与深度可分卷积》,【https://arxiv.org/abs/1610.02357】T4。

在内存方面,它与 Xception 非常相似,这是其架构的轮廓:

来自exception-Open Access Paper的截图

挤压网

这个网络非常轻(例如,与 VGG 的 500MB 或 Inception 的 100MB 相比,它的重量是 5MB ),并且使用 ImageNet 实现了大约 57%的 rank-1 或大约 80%的 rank-5 的准确性。

rank-1 和 rank-5 或者 top-1 和 top-5 是什么意思?

  • 等级 1 精度:我们比较根据我们的网络具有最高概率的类是否匹配真实的标签
  • 等级-5 准确度:我们比较根据我们的网络具有较高试用的 5 个类别中的一个是否与真实标签匹配

这个网络是如何做到占用空间如此之小却又如此精确的呢?它通过使用“压缩”数据然后扩展数据的体系结构来实现这一点,如下图所示:

按作者分列的数字

按作者分列的数字

按作者分列的数字

有无限的架构,但这些是目前使用最多的。通常,当我们遇到问题时,我们不会定义我们的架构,但我们会使用之前的一个架构。

好了,现在您已经看到了它们,让我们看看如何在 Keras 中实现它们

VGG,ResNet,Inception & Xception Keras 实现

像往常一样,我们会打开一个谷歌合作笔记本。选择在 GPU 上运行的代码,提高速度,执行下面的代码。

!pip install imageio

**# Import the necessary libraries**
from keras.applications import ResNet50
from keras.applications import InceptionV3
from keras.applications import Xception # solo con el backend de TensorFlow
from keras.applications import VGG16
from keras.applications import VGG19
from keras.applications import imagenet_utils
from keras.applications.inception_v3 import preprocess_input
from keras.preprocessing.image import img_to_array
from keras.preprocessing.image import load_img
import numpy as np
import urllib
import cv2
import matplotlib.pyplot as plt
import imageio as iodef predict_image(model_name, image_source):

 **# We define a dictionary that maps the network name with the Keras imported model** MODELS = {
    "vgg16": VGG16,
    "vgg19": VGG19,
    "inception": InceptionV3,
    "xception": Xception, # TensorFlow solo!
    "resnet": ResNet50
  }# **We stablish the input size and image preprocessing function**
  input_shape = (224, 224)
  preprocess = imagenet_utils.preprocess_input# **If we use InceptionV3 or Xception, we need to stablish a different input image size (299x299) and use a different preprocessing function**
  if model_name in ("inception", "xception"):
    input_shape = (299, 299)
    preprocess = preprocess_inputprint("[INFO] loading {}...".format(model_name))
  Network = MODELS[model_name]
  model = Network(weights="imagenet") **# We load the network with the weights already trained with the ImageNet, the first time we execute keras it will lead the weights, which size is about 500MB, so it will last a bit** # **We load the image and make sure it is in the appropiate size**
  print("[INFO] loading and pre-processing image...")
  if type(image_source) == str:
    image = load_img(image_source, target_size=input_shape)
    image = np.resize(image, (input_shape[0], input_shape[1], 3))
    image = img_to_array(image)
  else:
    image = np.resize(image_source, (input_shape[0], input_shape[1], 3))
    image = img_to_array(image)# **The image is represented as an array of size: (inputShape[0], inputShape[1], 3) and we need: (1, inputShape[0]. inputShape[1], 3), so we expand the dimensions**
  image = np.expand_dims(image, axis=0)**# we preprocess the image**
  image = preprocess(image)**# We predict the class of the image**
  print("[INFO] classifying image with '{}'...".format(model_name))
  preds = model.predict(image)
  P = imagenet_utils.decode_predictions(preds)**# We show the predictions rank-5 and their likelihood**
  for (i, (imagenetID, label, prob)) in enumerate(P[0]):
    print("{}. {}: {:.2f}%".format(i + 1, label, prob * 100))img = io.imread(image_source)
  (imagenetID, label, prob) = P[0][0]
  cv2.putText(img, "Label: {}, {:.2f}%".format(label, prob * 100), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2)
  plt.imshow(img)
  plt.axis('off')

  return model

# download images
!wget [https://image.ibb.co/cuw6pd/soccer_ball.jpg](https://image.ibb.co/cuw6pd/soccer_ball.jpg)
!wget [https://image.ibb.co/hdoVFJ/bmw.png](https://image.ibb.co/hdoVFJ/bmw.png)
!wget [https://image.ibb.co/h0B6pd/boat.png](https://image.ibb.co/h0B6pd/boat.png)
!wget [https://image.ibb.co/eCyVFJ/clint_eastwood.jpg](https://image.ibb.co/eCyVFJ/clint_eastwood.jpg)

!ls -la *.*

model = predict_image('resnet', 'soccer_ball.jpg')

model = predict_image('vgg16', 'bmw.png')

model.summary()

model = predidct_image('inception', 'clint_eastwood.jpg')

model.summary()

网络架构的结果太大了,这里不适合:

最后的话

一如既往,我希望你喜欢这篇文章,并且获得了关于如何实现和开发卷积神经网络的直觉!

如果你喜欢这篇帖子,那么你可以看看我在数据科学和机器学习方面的其他帖子 这里

如果你想了解更多关于机器学习、数据科学和人工智能的知识 请在 Medium 上关注我,敬请关注我的下一篇帖子!

CNN 简介(第一部分):理解和组织图像数据集

原文:https://towardsdatascience.com/convolutional-neural-networks-understanding-and-organizing-your-data-set-ba3e8b4086cb?source=collection_archive---------47-----------------------

了解机器如何学习第一部分

使用 Python、Keras 和 PlaidML 或 TensorFlow 的卷积神经网络实用介绍

Pixabaymohamed_hassan 拍摄的照片

介绍

现代技术已经使卷积神经网络(CNN)成为一系列问题的可行解决方案,包括从识别和定位营销材料中的品牌位置到诊断肺部 CT 中的癌症等等。如果你喜欢,你甚至可以用 CNN 来分类乐高积木。尽管越来越受欢迎,但许多第一次了解 CNN 的开发人员很难超越对该主题的表面介绍。

在这一系列文章中,我将以一种易于理解和实用的方式介绍卷积神经网络:通过创建一个可以在肺部 X 射线中检测肺炎的 CNN。 *******

这四篇文章系列包括以下部分,每一部分都致力于开发过程的一个逻辑块:

第一部分:问题介绍+理解和组织你的数据集(你在这里)

第二部分:用相关扰动塑造和扩充您的数据集(即将推出)

第三部分:调整神经网络超参数(即将推出)

第四部分:训练神经网络并解释结果(即将推出)

虽然本系列讨论的是与医学成像相关的主题,但这些技术实际上可以应用于任何 2D 卷积神经网络。虽然本系列不可能涵盖为每个可能的问题实现 CNN 的每一个细微差别,但是作为读者,我们的目标是让您在完成本系列时,具备从头开始实现、排除故障和调整您自己的 2D CNN 的整体能力。我打算讨论构建神经网络的许多基本细微差别,这些差别是大多数介绍性文章或操作指南往往会忽略的。重要的时候,我会关注为什么如何,而不仅仅是如何。我也尽量避免那些会让神经网络新手感到困惑的术语。

本系列的第一篇文章将花时间介绍关于主题和底层数据集的关键概念,这些概念是本系列其余部分的基础。建议您仔细阅读第一篇文章,因为它提供了我们在第二部分开始编码时需要的大量信息。

先决条件: 本系列面向至少对 Python 有所了解并对 CNN 有所了解的读者,但您无需成为专家也能理解。你至少应该知道如何设置 Python 环境,导入 Python 库,并编写一些基本代码。

如果你是一个绝对的初学者(也就是说,不知道 CNN 是什么),我建议你在开始这个项目之前阅读这篇文章:

[## 卷积神经网络的直观解释

什么是卷积神经网络,为什么它们很重要?卷积神经网络是…

ujjwalkarn.me](https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/)

*免责声明: 这不是医疗器械,不是 FDA 许可或批准的,你不应该使用这些文章中的代码来诊断真实的患者——我不希望 FDA 给我写信!

这个人得了肺炎——你能看出来吗?来源:胸部 x 光图像(肺炎)

让我们(简单地)谈谈肺炎

我们不再讨论一个已经被讨论了一百万次的话题(比如臭名昭著的 MNIST 问题),而是解决一个更实质性但更容易解决的问题:检测肺炎。在开始任何项目之前,对该主题有一些领域知识是至关重要的。虽然您可以开发一个具有一些表面功能的神经网络,而无需真正理解手头的问题,但创建功能性的、生产就绪的神经网络的关键是理解问题域和环境。

肺炎是一种每年影响 300 多万人并可能危及生命的疾病,尤其是对年轻人和老年人。世界卫生组织一直将肺炎列为“全球儿童死亡的最大传染性原因”。 [ 1]肺炎通常部分通过分析胸部 X 射线图像来诊断。这种 X 射线图像是用主观的和不一致的标准来解释的,而且“在肺炎患者中,对胸部 X 射线的解释,尤其是最小的细节,完全取决于读者。” [ 2】随着现代计算能力的发展,神经网络已经变得更容易使用,也更吸引研究人员去解决这类问题。

分析 X 射线是卷积神经网络非常适合解决的一类问题:主观性和不确定性是重要因素的模式识别问题。

现在我们已经对问题域有了一些的了解,让我们开始吧。我们将在工作中增加我们的领域知识。

了解数据集

我们在本文中使用的数据集可在这里获得。[3]数据集的原始发布是这里的【4】出于好奇,数据的官方存储库是这里的。[5]

该数据集包含 5,863 幅图像,分为三大块:训练、验证和测试。每个块被进一步分成“正常”图像(没有肺炎的图像)和“肺炎”图像(被分类为患有细菌性或病毒性肺炎的图像)。数据集中的图像细分如下:

正常图像与肺炎图像的分布以及细菌性与病毒性肺炎的分布来源:作者提供的图像

注意肺炎与正常图像的不平衡。对于每一个正常图像,该数据集包含大约三个肺炎图像。这对于医学图像数据是典型的;因为患者每次接受 X 射线检查时都暴露在可能危险的电离辐射中,所以医生只有在怀疑有问题时才会让患者接受 X 射线检查(通常情况下,他们是对的)。当我们在项目的后期增加数据集时,我们将通过增加正常 X 射线的数量来解决这个问题。

识别图像特征和变化

下面是数据集内的两个图像示例:一个被分类为具有细菌性肺炎迹象,另一个被分类为正常。

包含细菌性肺炎感染肺(左)和正常肺(未感染,右)的放射照片示例。来源:胸部 x 光图像(肺炎)

虽然您可能无法确定哪张 x 光片包含肺炎,但您应该能够在 x 光片中寻找其他差异。它们具有不同的曝光水平、不同的对比度水平、解剖结构的不同部分在视图中居中、分辨率和尺寸不同、噪声水平不同等等。这是一个关键概念。

除了分类目标(即“肺炎”或“非肺炎”)之外,查看您的数据集和图像变化也至关重要,因为它会告诉您在生产环境中可以预期的变化种类。这种多样性表明了我们稍后需要应用的扰动的类型,以 扩充 数据集。扰动是我们对集合中的许多图像进行的轻微改变,以便使数据集更大并模拟真实世界的条件,例如添加人工噪声或稍微旋转一些图像。一般来说,数据集扩充是机器学习的一个关键方面,尤其是当您处理相对较小的数据集时,比如这个数据集。

识别数据集偏差和假设

你也应该在你的数据集中寻找偏差。在这种特殊情况下,该数据集中的所有图像都是的子图像。这意味着数据集不适用于大部分人群:成年人!如果我没有指出这个关键的细节,你可能会认为我们在处理成人的图像。在选择或创建训练数据集时,要非常小心地理解所做的假设。那些潜在的假设应该反映你试图用你的神经网络模型解决的用例。在这种情况下,我们不能用这个数据集来训练一个神经网络模型来检测成人肺部的 x 光片中的肺炎,因为它不包含成人肺部的 x 光片!

偏见的另一个更明显的例子是经典的“校车”识别问题。如果你正在编写一个将检测美国校车的神经网络,数据集需要包括什么?默认的假设可能类似于“它需要包括校车和城市公交车,可能还包括包租的公交车。”真正的答案是:它可能需要包括几乎所有品牌和型号的许多类型车辆的代表性样本,因为它需要明确了解什么不是校车。**始终考虑你的神经网络将分析哪些可能的图像,而不仅仅是神经网络的预期目标。**

在这种情况下,假设我们的神经网络将分析肺部 x 光片是公平的,但什么是肺部 x 光片?肺部 x 光片可能还包括哪些内容?

有许多肺部疾病,很有可能有些会表现出肺炎的迹象,但实际上是其他疾病。不要认为真实世界的数据会像“肺炎”和“非肺炎”一样枯燥无味。例如,肺不张、浸润和某些类型的肿块可能会依靠未经训练的神经网络将其识别为肺炎,只是因为它们不正常!**

八肺病。请注意,如果没有上下文,像肺不张和浸润这样的情况可能会混淆只在分类为“肺炎”和“正常”的图像上训练的神经网络。来源:NIH 胸部 x 光数据集

假设“肺炎”和“非肺炎”数据集就足够了,可能会阻碍现实生活中的项目。学会识别和思考你的数据集假设是一项重要的技能。

考虑到我们在这里处理的数据集是有缺陷的,如果我们的目标是检测肺炎,我们将继续前进。在现实生活中,您需要识别这种困境,并在您的数据集中解决它。

标签的重要性

最后,你应该在你的数据集中寻找高质量的标签。在这个项目中,我们将假设基础数据标签是好的,但是如果您正在构建一个将投入生产的神经网络模型,坏的标签会对您的精度上限产生重大影响。例如,在这种情况下,我们正在执行二元分类,因为 x 光片要么包含肺炎* (1),要么是正常 (0)。如果其数据被用于数据集中的医生没有验证他们对这些患者的诊断(例如,用血液测试、痰测试等再次检查他们的诊断)。),那么我们可能有潜在的标签问题。也有可能是医生诊断病人的时间太早,以致于痰检呈阳性,但是肺部 x 光检查并没有显示出肺炎的迹象,仍然被标记为阳性。这可能会影响训练。理解问题域将引导你寻找标签的问题。如果你不了解问题域,找一个了解的人来帮助你建立数据集。*

在这种情况下,我们将(可能没有足够的理由)假设标签是好的。您可以阅读与数据集相关的出版物,以了解更多关于其标注过程的信息(链接在本节的顶部),并自行决定这一假设是否合理。

注:也可以使用更多的海量数据集,如美国国家卫生研究院的 胸部 X 射线数据集 ,它包含 112,000 多张 X 射线,代表许多不同的肺部疾病,但对于本简介,我们应该使用更易于管理的大小和范围的数据集。训练和操作一个巨大的数据集对于入门来说太复杂了,而且由于需要的处理能力,可能需要很长时间来调整和训练。

组织您的数据集

在组织你的数据集时没有硬性的规则——这取决于个人偏好。但是,有些事情您可能需要考虑:

  1. 在扩充和训练神经网络模型时,您打算如何读取数据集?

这一点很重要,因为如果您的数据以一种有助于您以后如何读取和使用数据的方式进行组织,您将最终编写更少的代码,并最终获得更干净的解决方案。例如,如果您打算将 Keras 的内置image _ dataset _ from _ directory()方法与 ImageDataGenerator 一起使用,那么您希望以一种更容易的方式组织数据。恰好这个特定的数据集已经以这样的方式建立:

这个数据集的组织

在肺炎文件夹中,图像标记如下:

{随机患者 id } _ {细菌或病毒} _ {序列编号}。jpeg

举个例子,

肺炎图像如何标记的示例

正常图像标记如下:

normal 2-{ random _ patient _ id }-{ image _ number _ by _ patient }。联合图象专家组

例如:

如何标记普通图像的示例

当我们在下一篇文章中开始塑造、读取和扩充数据时,我们将更多地讨论 image_dataset_from_directory()和 ImageDataGenerator。现在,只需要知道这种结构使得使用 Keras 内置的特性变得容易。

2。每张图片需要多少标签?

另一个考虑是你需要记录多少标签。如果可能的话,我更喜欢在文件名中保留标签。在许多情况下,这是不可能的(例如,如果您正在处理分割,并且需要读取每个图像的几个坐标和相关标签,我将在将来的某个时候写一篇关于分割的类似文章)。

那么当你有很多标签的时候你会怎么做呢?大多数人使用 CSV 文件,或者对于非常大或复杂的数据集,使用数据库来跟踪它们的标签。

对于这个问题,所有必要的标签都包含在文件名中。

3。你将如何划分你的数据?

每个数据集都应该分为三类:训练、测试和验证。

训练:

训练数据集用来训练模型。这是神经网络看到并从中学习的数据。这个数据集应该理想地代表神经网络在生产环境中可能遇到的每个类别和特征。

验证:

验证数据集用于在每个训练时期检查您的训练进度。它将通过神经网络模型重复运行,并用于调整您的神经网络超参数。说该数据集不影响您的模型是不正确的,因为它不用于训练-在其超参数由验证集调整的任何模型中都存在隐式偏差。作为神经网络开发人员,您本质上是在精心制作一个可以在这个集合中很好执行的模型。因此,验证集也应该代表神经网络在生产环境中可能遇到的每个类别和特征。如果它是而不是代表,那么你的神经网络在验证集上的表现将无法与其现实世界的表现相提并论。

测试:

该数据集用于测试最终的神经网络模型,并评估其功能,就像您在现实生活中一样。由于验证数据集的隐含偏差,使用该数据集来评估最终的神经网络模型是一种不好的做法。该数据集可以小于其他两个数据集,但仍必须具有统计显著性(即:它应该充分代表神经网络在生产环境中可能遇到的每个类别和特征——您注意到这里的趋势了吗?).

现在我们知道了每一套是用来做什么的,让我们来谈谈数字。理想情况下,所有这些集合都将尽可能大。对于每个数据集应该有多大,没有硬性规定。话虽如此,我有一个经验法则,我喜欢用于这样的数据集,它至少有几千个样本,并且很简单(即二进制分类):70%训练,20%验证,10%测试。如果遇到训练集太小的问题,可以根据需要进行调整以优化性能。

在你有一个更复杂的问题的情况下(例如,有许多类的分类),那么问题变得更加微妙。你需要设计你的数据集来反映你的目标。在这种情况下,我的经验法则是每个类应该分成 70%用于训练,20%用于验证,10%用于测试,并根据需要进行进一步的调整。

同样,这些是松散的指导方针,以我的经验来看,它们是起始值,并不是真正的规则。在许多情况下,如果不是大多数情况,您将需要重新平衡您的数据集分布几次,以真正优化结果。

在这种情况下,X 射线数据集被分割成 Kaggle 的原始形式的差配置,具有:

  • 测试集中 10.6%的数据
  • 验证集中的 0.3%
  • 90%在训练集中

因此,我们将根据我上面的规则随机分割数据集来处理这个问题,在训练集中留下 4,104 张图像,在验证集中留下 1,172 张图像,在测试集中留下 587 张图像。

第一部分结论

在本文中,我们讨论了理解问题域的重要性,如何识别数据集中的内部偏差和与数据集相关的假设,以及如何将数据集组织成训练、验证和测试组。既然我们对数据集及其局限性有了明确的理解,并且已经组织好了数据集,我们就可以开始编码了。

在下一篇文章中,我们将讨论:

  1. 在训练神经网络之前,使用带有 image_dataset_from_directory()的 Keras ImageDataGenerator 来形成、加载和扩充我们的数据集
  2. 解释为什么这可能不是最佳解决方案(尽管它易于实现并被广泛使用)
  3. 展示一种更强大、更可定制的数据整形和扩充方法
  4. 向您展示一个优秀、简单的技巧,让快速加速您的超参数调整和训练过程

本系列的下一篇文章将于 2020 年 6 月 14 日发布。

参考资料:

[1]世界卫生组织, P neumonia (2019),https://www.who.int/news-room/fact-sheets/detail/pneumonia

[2] D. Moncada 等人,社区获得性肺炎成人胸部 X 线片的解读(2011),https://pubmed.ncbi.nlm.nih.gov/22218512/

[3] P. Mooney 等人,胸部 x 光数据集(肺炎)(2017 年),https://www . ka ggle . com/paultimothymiooney/胸部 x 光-肺炎

[4] D. Kermany 等人,通过基于图像的深度学习识别医学诊断和可治疗疾病(2018),https://www . cell . com/cell/full text/s 0092-8674(18)30154-5

[5] D. Kermany 等人,标记光学相干断层扫描(OCT)和胸部 X 射线图像的大数据集(2018),https://data.mendeley.com/datasets/rscbjbr9sj/3

卷积神经网络:为什么它们对图像相关学习如此有用?

原文:https://towardsdatascience.com/convolutional-neural-networks-why-are-they-so-good-for-image-related-learning-2b202a25d757?source=collection_archive---------15-----------------------

(权利:自己的形象)

快速解释为什么 CNN 现在几乎总是被用于计算机视觉任务。

在其发展几年后,CNN 已经赢得了它的第一个图像识别竞赛(2011 年),第二年,在 2012 年,四个图像识别竞赛的获胜者正在使用 CNN 作为基础架构!即使是现在,有线电视新闻网仍然是计算机视觉的女王!

让我们从以下内容开始解释:

我们在计算机视觉中做什么?

我们在这里处理的是图像,而不是表格数据和编码文本数据中的矢量特征。图像不一定有标签,子标签为区域,因此,特征应该被提取,或智能地减少。为了说明以下内容,让我们举一个简单的例子:假设任务是根据一幅图像来决定某人的年龄,那么我们应该提取正确的特征用于推断。这些特征可以是皱纹、白发等的存在。作为本部分的结尾词:特征提取!

如何从图像中提取特征?

假设您想要提取皱纹,我们应该如何在图像中找到皱纹(显然不是手动的)?嗯,皱纹(图 1)或多或少看起来像这样(图 2)

图 1、图 2(权利:来源)

为了从图像中捕捉这些线,一个直观的解决方案是使用矩阵滤波。参见以下示例(图 3):

图 3(权利:来源

这里,滤波器是一个 3×3 矩阵,其对角线上的值为 1,其他地方为 0。因此,此滤镜将用作十字形区域或全暗区域的遮罩。在逐条目矩阵乘法之后输出高值意味着滤波器形状和所分析的区域匹配。请注意,用于过滤的矩阵不必总是取值为 0 和 1,它也可以有-1,以便进行严格的形状搜索。对皱纹进行同样的处理,我们可以使用以下过滤器(图 4)。

图 4(权利:自己的形象)

我们可以将这些过滤器应用于原始图像,并简单地保持较高的值,以显示形状已被检测到。这样我们就可以知道从原始图像中提取的特征在哪里以及是什么。(注:这一步被称为卷积层步骤,但我们将避免过多窥探,因为将会有另一篇文章详细解释 CNN 的层)

过滤器?但是我通常应该使用哪种过滤器呢?

与我们之前所做的不同,对于一般的任务特征提取,过滤器可以具有不同的大小,当达到太大的大小时,枚举它们或猜测这些不同的过滤器变得太困难。另外,大多数时候我们自己忽略了我们应该为分类提取什么特征。你猜怎么着?CNN 不要求我们猜测应该使用什么样的过滤器。实际上,CNN 的训练就是对这些过滤器的训练,这些过滤器是网络的权重。因此,CNN 可以完全揭示人类永远不会注意到的细节,例如确定照片上某人的年龄。这就是 CNN 的优势。(到目前为止,我们只使用了几个在同一步骤中应用的滤波器,但是通常会使用更多不同大小的滤波器,并且具有时间延迟。

非常感谢您的阅读!请继续关注我的下一篇文章,在那里我将正式阐述这里解释的概念。

[## 一步一步实现:Keras 中的 3D 卷积神经网络

了解如何实现您自己的 3D CNN

towardsdatascience.com](/step-by-step-implementation-3d-convolutional-neural-network-in-keras-12efbdd7b130)

具有异构元数据的卷积神经网络

原文:https://towardsdatascience.com/convolutional-neural-networks-with-heterogeneous-metadata-2af9241218a9?source=collection_archive---------10-----------------------

更新:

  • 2020/02/21:为图形添加像素

在自动驾驶中,卷积神经网络是各种感知任务的首选工具。尽管 CNN 擅长从相机图像(或以视频剪辑形式出现的一系列图像)中提取信息,但我经常会遇到各种不适合卷积神经网络的元数据。

直接在元数据上使用 CNN 可能是个坏主意(改编自来源

根据传统定义,元数据是指用于描述其他数据的一组数据。在这篇文章中,通过元数据,我们的意思是

  • 异构的、非结构化的或无序的数据伴随摄像机图像数据作为辅助信息。在传统定义的意义上,这些数据“描述”了摄像机数据。
  • 元数据的大小通常比摄像机图像数据小得多,从每幅图像几个数字到最多几百个数字不等。
  • 并且与图像数据不同,元数据 无法用规则网格表示,每张图像的元数据长度可能不是常数

所有这些属性使得 CNN 很难直接消费元数据,因为 CNN 假设数据表示在规则间隔的网格上,并且网格上的相邻数据也具有更紧密的空间或语义关系。

我遇到的元数据类型可以分为以下几组:

  • 可能影响传感器观察的传感器参数:摄像机内部/外部
  • 不同类型的传感器数据:雷达针或激光雷达点云
  • 两组数据之间的对应/关联

一个特例是激光雷达点云数据。激光雷达点云的一个典型帧通常具有成千上万个点,伴随着一帧或几帧相机图像。激光雷达点云信息丰富,它们本身可以形成与相机感知并行的独立感知管道的基础。因此,很少将它视为相机数据的辅助信息,也不是这里考虑的典型元数据类型。对于点云数据,人们已经开发了特定的神经网络架构,如 PointNet,或图形神经网络(GNN) 来直接消费点云数据,不在本帖讨论范围之内。

下面我们回顾最近文献中提出的使用卷积神经网络消费元数据的不同方法。

相机参数

深度学习在 SLAM 的很多方面都取得了重大进展,其中之一就是单目深度估计。单目深度估计本质上是不适定的,并且由于单目图像中缺乏尺度,在一个数据集上训练的模型通常不能很好地推广到其他数据集。这与一般的对象检测形成了鲜明的对比,在一般的对象检测中,对象检测器的性能不依赖于特定的相机型号(需要知道哪些相机型号拍摄了 COCO 数据集中成千上万的图像将是一场噩梦)。

不同焦距的镜头拍摄同一场景

相机的内在特性,尤其是镜头的焦距决定了单目图像所缺乏的比例因子。一般来说,无法分辨一幅图像是用焦距更长的相机从同一位置拍摄的,还是用同一台相机在更靠近物体的位置拍摄的。

单目图像中的尺度模糊(来源

由于这个原因,深度估计训练和推断通常是在用相同相机(或者至少用相同传感器和镜头规格的相机)收集的一个数据集上进行的。如果您更改相机模型,您必须收集一个全新的数据集,并标注距离以再次训练您的模型。

幸运的是,在自动驾驶和其他工业应用中,内部电路很容易从相机制造商处获得,并且在相机的整个生命周期中相对固定。我们能把这种内在机制运用到单目深度预测网络中吗?

Camera intrinsics 有四个自由度(不包括镜头失真——参见这个简明的 openCV 文档),其特征在于由像素大小归一化的行和列方向上的焦距 fx 和 fy,以及主点的像素位置 cx 和 cy。我能想到的一个简单的解决方案是将深度解码器的这四个数字融合在一个特征图的顶部,并且可能添加一个全连接层来将这四个数字融合到深度中。 CAM-Convs :针对单视图深度的相机感知多尺度卷积 (CVPR 2019)通过将内部函数工作到伪图像中,提出了一个更加聪明的解决方案。

CAM-Convs :摄像头感知多尺度卷积

卡姆-Conv 从优步的 CoordConv 中获得了很多灵感(卷积神经网络和 CoordConv 解决方案的一个有趣的失败, NeurIPS 2018 )。CoordConv 将两个网格通道连接到原始图像和/或中间特征图,以编码位置信息。在坐标转换的基础上,卡姆-Conv 首先将坐标转换的原点从左上角移动到主点,创建两个居中坐标 (cc)地图。这两个通道编码主要点信息。然后视场 (fov)图通过将 cc 通道除以相机焦距 f 并取反正切来计算,这基本上计算每个像素的方位角和仰角。这两个通道编码焦距信息。最后,归一化坐标 (nc)图也连接到特征图(本质上是一个归一化坐标)。

图像中像素的方位角和仰角(改编自 src

实际上 CoordConv 本身可以看作是将坐标信息编码到卷积神经网络的一种情况。它为卷积神经网络提供了具有平移方差的选项,并有助于学习位置敏感数据分布。

另一种方法:归一化焦距和归一化像面

在坎-Conv 论文中还有一点值得一提。如上所述,无法判断图像是用较长焦距的相机拍摄的还是近距离拍摄的。从另一个角度来看,由两个不同焦距的相机从同一相机位置成像的同一物体将呈现不同的外观,即使它们具有相同的 3D 距离。

Cam-Conv 的一个替代方案是使用标称焦距。所有地面真实距离根据标称焦距进行缩放,并用于训练模型。然后,在推断过程中,通过考虑相机的实际焦距,将预测距离按比例调整回实际距离。当然,以上讨论是基于同一图像传感器的假设。如果传感器的物理像素尺寸也发生变化,我们可以使用相同的想法,采用标称像素尺寸,假设窄视场(图像尺寸< <焦距)。相比之下,凸轮 Conv 是一个更有原则的方式,以适应各种相机型号。

这与mono loco(ICCV 2019)用于行人距离估算的方法密切相关。在找到图像上的关键点之后,在馈入 MLP 之前,图像坐标被投影到单位深度 Z=1 处的归一化图像平面。这有助于防止模型过度适应任何特定的相机。这基本上考虑了焦距和传感器像素大小对表观物体大小的影响。

非相机传感器数据

在自动驾驶中,除了相机图像之外的传感器数据通常可用于增加传感器冗余和系统鲁棒性。在当今的 ADAS 传感器套件中,一种无处不在的传感器(除了无处不在的摄像机之外)是雷达。

迄今为止,大多数商用雷达产生的雷达点极其稀少(每帧数量不同,根据不同的雷达型号,每帧最多 32 到 128 个点)。这比激光雷达传感器每次扫描数十万个点要小三到四个数量级。因此,将雷达数据(或雷达图钉)视为补充和描述相机图像的一种元数据是很自然的。下面是同一场景下雷达和激光雷达数据典型密度的直观对比,在自动驾驶中颇具代表性。

相同场景的雷达和激光雷达点云的比较(来自 nuScenes 数据集

注意:有更先进的雷达系统,每帧输出数百或数千个点,但这些所谓的高分辨率“成像雷达”(如 Astyx 的这一个)的商业可用性有限,成本比传统雷达高得多。

关于单独对激光雷达数据或融合激光雷达和相机数据进行三维目标检测的文献有很多(如平截头体点网AVODMV3D 等)。基于稀疏雷达针和相机的早期融合的文献很少。这部分是因为缺少雷达数据的公共数据集,部分是因为雷达数据的噪声性质和缺少高程信息。因此,我希望 nuScenes 数据集的发布能够为这一关键但研究不足的领域带来更多的关注。

融合雷达和图像数据的主流方法是想办法将雷达数据“加密”成图像。在远程检测 : 使用雷达和视觉的远程车辆检测 (ICRA 2019)中,每帧不同数量的雷达引脚被编码成具有相同相机图像空间大小的双通道图像,一个通道编码距离(距离测量),另一个编码距离变化率(径向速度)。每个雷达针被标记为一个而不是一个像素,以增加训练过程中每个点的影响,并反映雷达测量在方位和高度上的噪声性质。使用从雷达到摄像机的外部校准和摄像机的内部校准将雷达引脚投影到摄像机图像上。融合网络相对简单,我将跳过这里,因为我们的重点是 CNN 的雷达数据表示。

远距离探测使用双通道伪图像对雷达信息进行编码

在 RVNet : 用于挑战性环境中基于图像的障碍物检测的单目摄像机和雷达的深度传感器融合 (PSIVT 2019),雷达 pin 也被投影到摄像机图像平面并形成稀疏的雷达图像。这次它有三个通道,深度、横向速度和纵向速度。注意,这里的速度由自我车辆的速度补偿,因此不能由单一通道的距离变化率来表示。(作者还提出了一种密集雷达图像编码方法,这种方法对我来说没有意义,因此在此省略。)

RVNet 使用自我运动补偿速度

在上述两种方法中,雷达销被投影到摄像机图像上。投影点或者用作单个像素,或者给定一个恒定的空间范围。一种可能的改进方法是根据距离使用各种大小的磁盘,如 RRPN ( 雷达区域提议网络,ICIP 2019)使用的磁盘。这更好地反映了雷达针的空间不确定性,因为理论上,近距离雷达针的投影比远距离雷达针的投影具有更大的横向空间不确定性。

CRF-Net : 一种基于深度学习的雷达和相机传感器融合架构用于物体检测 (SDF 2019)将雷达点绘制成一条垂直线。这些线条从地面开始,延伸 3 米,因此不是均匀地垂直绘制的。从线解析几何 (ICRA,2017 年)也使用类似的技术将单线激光雷达测量结果增密为密集参考深度框架。这个雷达图像实际上与这个演示中显示的非常相似。

用垂直线加密雷达针( CRF-Net ,2019)

ADAS 的演示:Tram Radar Western

增密单线激光雷达测量(从一条线解析几何,ICRA 2017 年)

此外,上述 RRPN(雷达区域提议网络)还提出了一种使用雷达生成区域提议的有趣方式。这是基于这样的观察,即 nuScenes 数据集中的几乎每个对象都具有相应的雷达 pin,因此雷达数据可以用作稳健的区域提议方法。为了适应雷达测量的空间不确定性,锚不总是居中。

RRPN 使用噪声雷达数据和移动锚进行目标探测

综上所述,以上所有方法(RRPN 除外)都是将雷达 pin 转换成一个伪图像,用 CNN 提取更高层的信息。

激光雷达点云

如上所述,由于点云的密集特性,可以在激光雷达数据之上直接执行对象检测。因此,将激光雷达数据视为相机图像的元数据可能不合适。然而,从点云数据具有变化数量无序而不是均匀分布在规则网格上的意义上来说,激光雷达数据就像雷达数据一样是非结构化的。

在将激光雷达数据和图像数据输入神经网络之前,人们已经做出了许多努力来执行激光雷达数据和图像数据的早期融合。 MV3D : 用于自动驾驶的多视角 3D 物体检测网络 (CVPR 2017)将激光雷达点转换为两种类型的伪图像,鸟瞰视图(BEV)和前视图(FV)。BEV 贴图是 0.1 m 分辨率的离散化网格,有多个高度贴图和一个密度贴图和一个强度贴图。FV 遵循 VeloFCN : 使用全卷积网络从 3D 激光雷达检测车辆 (RSS 2016)的约定,注意这不同于将激光雷达的点投影到摄像机图像。然后,三个不同的网络从 BEV 图像、FV 图像和 RGB 图像中提取特征,然后将这些特征连接起来进行融合。

MV3D 中激光雷达点的输入表示

LaserNet : 一种用于自动驾驶的高效概率 3D 物体探测器 (Arxiv,2019)提出了一种不同的方法来编码激光雷达点。RV(范围视图)通过将激光器 id 直接映射到行并将方位角离散化为列来生成。这种表示的一个优点是它本身是紧凑的。它有五个通道:范围(距离)、高度、方位角、强度和一个指示单元格是否包含点的标志。

激光雷达点的 LaserNet 表示

总之,尽管密度比雷达针高,激光雷达点也可以打包成伪图像供 CNN 使用。类似于使用全连接图层消费稀疏元数据的替代方法,我们也可以使用点网 (CVPR 2017)直接消费无序的点云数据。

通信/关联数据

另一种类型的元数据是关联数据,例如交通灯到车道的关联。元数据融合: 交通灯到车道分配的深度元数据融合 (IEEE RA-L 2019)提出了一种数据融合方法,融合来自交通灯、车道箭头和车道标线检测结果的异构元数据。元数据以元数据特征图(MFM) 的形式编码,并与来自相机图像的中间特征图融合。mfm 本质上是二元注意力地图。关联基础事实和预测也被编码成表示横向空间位置的一维向量。

元数据特征地图(MFM) 将元数据与相机图像融合

在此工作中,元数据要素地图(MFM)按元素乘以第一个 F=12 层。事实证明,这比直接将 MFM 与影像特征地图连接在一起要好一些。

示例元数据特征地图(MFM) 带 IPM 摄像机图像

先前对象检测结果

有时,将对象检测边界框提供给其他学习管道是有用的。然而,边界框的数量不是恒定的-从这个角度来看,它们也可以被视为元数据。一种方法是将边界框转换为热图。在:用于视觉对象跟踪的空间监督递归卷积神经网络中,对象检测结果被转换为热图,以指导学习在空间和时间上一致的特征,用于视频对象检测和跟踪。

ROLO 将物体检测结果(只有一个物体)转换为热图

在通过关联嵌入将 像素转换为图形(NIPS 2017)中,可通过将对象检测格式化为双通道输入来合并先前检测,其中一个通道由边界框中心的一键激活组成,另一个通道提供框的二进制掩码。可以在这两个通道上显示多个框,第二个表示它们的掩码的联合。如果有太多的边界框,遮罩通道变得太拥挤,那么通过边界框锚点分离遮罩,并将它们放入不同的通道。

为了降低计算成本,这些额外的输入不在输入层中集成,而是在几层卷积和汇集之后合并。

外卖食品

  • 元数据通常是无序的,不在规则的网格上。每个图像的元数据的数量通常不是恒定的,这使得很难使用具有固定输入维度的固定神经网络结构。
  • 如果每个相机图像的元数据是固定长度的,则可以使用完全连接的结构来将这些元数据与相机特征地图融合。
  • 如果元数据是无序的,例如雷达或激光雷达点云数据,另一种方法是使用点网结构,它对输入顺序的排列是不变的。
  • 使用 CNN 消费元数据的最通用方法是将元数据转换成某种形式的具有规则网格间距的伪图像。伪图像应该是最好的,或者可以被变换到与图像数据相同的空间域。

参考

张量流卷积神经网络

原文:https://towardsdatascience.com/convolutional-neural-networks-with-tensorflow-2d0d41382d32?source=collection_archive---------21-----------------------

丹尼尔·库切列夫在 Unsplash 上拍摄的照片

嘿大家好!在这篇文章中,我试图总结 Deeplearning.ai 在 TensorFlow 中关于卷积神经网络的课程

C 可选神经网络(ConvNets)是一种特殊类型的神经网络,用于分析和处理图像。它的名字来源于它用作过滤器的'卷积层。这将过滤提供给它的特定特征的图像,然后被激活。因此,通过使图像通过这些过滤器来检测特定特征、其在图像中的位置以及其与类别相关的强度,从而生成特征图。

这种神经网络的创新之处在于它能够学习自动开发这些过滤器,从输入图像中捕获一组特定的特征,并根据捕获的特征对图像进行分类。

这些网络在图像分类、推荐系统、图像和视频识别等方面有着广泛的应用。

ConvNets 通常是具有非线性激活函数的卷积的交替层和最大池层的组合,之后是完全连接的密集层。

为了给这些网络的架构一个概念,这里有一张图片。

让我们通过钻研课程来理解这一点!

我们将从分类猫和狗图像的基本模型开始。

我们将数据集放在一个名为‘cats _ and _ dogs _ filtered . zip’的压缩文件夹中。为了提取它,我们必须实现下面的代码。

这将提取基础目录'/tmp/cats _ and _ dogs _ filtered'中的内容,该目录包含训练和验证子目录,这些子目录又包含 cats 和 dogs 子目录。

你会注意到,我们并没有明确地将这些图像标记为猫和狗。我们将在本文的后面讨论图像生成器ImageGenerator 可以直接从子目录中读取图像,并根据子目录的名称为您标注。

例如,您有一个“火车”目录,其中还包含“猫”和“狗”目录。图像生成器会对这些子目录中的图像进行适当的标记。

我们定义了每个目录。

我们可以使用下面的代码查看这些目录中的猫和狗的文件名。

我们得到这样的输出…

根据我们的数据集,我们总共有:

我们可以通过实现下面的代码来查看我们的图像

首先,我们配置 matplotlib 参数。

我们加载一批 8 只猫和狗的图片。

建立模型

数据集中的图像有多种形状和大小。对于要在这些图像上训练的神经网络,我们需要它们具有特定的形状。

对于灰度图像,我们有一个 1 字节的色深,即 8 位。对于我们数据集中的图像集,颜色深度为 3 字节,即 24 位,因为它们是 RGB 格式。

我们最初在模型中添加一些卷积层,然后在发送到密集连接的层之前将其展平。

由于这是一个二元分类模型,我们可以在最后一层添加一个‘Sigmoid’函数。

我们现在将配置参数来训练和编译我们的模型。我们将使用二元交叉熵损失,因为这是一个二元分类问题,并且我们在最后一层中有一个范围为 0 到 1 的 sigmoid 激活函数。

我们将使用 RMSprop 优化算法而不是随机梯度下降(SGD) ,因为 RMSprop 为我们自动调整了学习速率。

为什么要实现 Conv2D 和 MaxPooling2D?

实现卷积层的想法是减少图像,以便只考虑突出的特征和决定输出的特征。换句话说,卷积压缩图像。

池层 有效压缩图像,使其更易于管理,并选择突出的特征。

上面一行代码将训练图像重塑为一个 28x28 像素的图像60000 代表图像数量1 代表通道数量 。由于上述图像是灰度图像,因此只有 1 个通道与之相关联。

再次像前面的代码片段一样,【Conv2D】图层的 input_shape28x28 像素1 通道 与每个图像相关联,作为其灰度图像。 64 卷积存在,并且每个卷积是形状 3x3 的矩阵。

MaxPooling2D 层有一个形状为 2x2 的池矩阵。

【Conv2D】第一个参数 作为 第 64 个 来表示 滤镜 的数量。网络中的初始过滤器负责检测边缘和斑点。在初始层中使用太多的滤波器是不需要的,因为从原始输入层提取的信息只有这么多,并且大多数滤波器将是冗余的

初始层使用 16 或 32。

模型的总结给了我们这样一个输出。

上面的代码片段为我们提供了整个模型的概要。

第一个 Conv2D 层的输出形状为 26x26。 这不是一个小故障,让我们了解一下原因:-

图— 1

图-2,让我们把水平方向上的九个像素分别命名为 pix1,pix2,pix3…

Conv2D 图层的 滤镜大小为 3x3 。这意味着它需要选择具有 a(上面或下面的像素)和(左边或右边的像素)的像素。图-2 展示了满足图-1 左上角标准的第一个可能的竞争者的像素。

我们可以看到,在 pix1、pix2、pix3 之上不存在任何像素。类似地,在像素 1、像素 4、像素 7 的左边不存在任何像素。因此,我们需要选择 pix5 作为第一个像素。类似地,在左下角,我们必须相应地选择一个像素。因此我们省略了顶部的一个像素行和底部的一个像素行;左侧一个像素列和右侧一个像素列。

行方向的 2 个像素和列方向的 2 个像素被省略。因此,28x28 的图片已经减少到 26x26。

MaxPooling2D 有一个 滤镜大小为 2x2 。它将滑过 26x26 的图片选择具有最大值的像素。这有效地将图像大小减半 因此 26x26 的 pic 变成了 13x13 的 pic 大小。

同样的过程继续,直到我们到达层 max_pooling2d_1。 这里我们有一个尺寸为 5×5 的 卷积窗和一个 64 卷积 。现在,在后续层中,卷积变平。因此,我们有一个展平层的输出形状为 1600(5x5x 64 = 25x 64 = 1600)。这 1600 个要素现在以矢量的形式存在,随后可以输入到后续图层的密集网络中。**

了解图像生成器

我们将从马与人分类器的代码片段开始。

这里我们有一个' 重缩放' 参数。由参数指定的值是图像的每个像素值乘以的因子。例如- 一个像素的值为 223 。223 乘以 1/255, 原来的 223 被结果 0.87 代替(223x 1/255 = 0.87)

数据生成器然后可以与 Keras 模型一起使用接受数据生成器作为输入** : 拟合 _ 生成器评估 _ 生成器预测 _ 生成器 。**

使用验证集时,还必须指定验证集的目录。

参考上面的代码,我们可以分析模型的训练和验证趋势。

让我们对现有的“猫和狗”数据集尝试遵循相同的过程。

我们通过使用训练集中的‘fit _ generator’方法来训练我们的模型。

下面的代码允许用户在 google colab 中上传文件,然后通过模型运行它,试图预测图像是猫还是狗。

查看各层的输出

让我们试着理解我们的卷积神经网络是如何试图预测图像的类别的。要做到这一点,我们需要了解我们的 ConvNet 在图片中关注的是什么特征。

我们可以通过确定哪个特征在通过卷积层时变得突出来分析这一点。

import numpy as npimport randomfrom   tensorflow.keras.preprocessing.image import img_to_array, load_img# Let's define a new Model that will take an image as input, and will output# intermediate representations for all layers in the previous model after# the first.successive_outputs = [layer.output for layer in model.layers[1:]]#visualization_model = Model(img_input, successive_outputs)visualization_model = tf.keras.models.Model(inputs = model.input, outputs = successive_outputs)# Let's prepare a random input image of a cat or dog from the training set.cat_img_files = [os.path.join(train_cats_dir, f) for f in train_cat_fnames]dog_img_files = [os.path.join(train_dogs_dir, f) for f in train_dog_fnames]img_path = random.choice(cat_img_files + dog_img_files)img = load_img(img_path, target_size=(150, 150))  # this is a PIL imagex   = img_to_array(img)                           # Numpy array with shape (150, 150, 3)x   = x.reshape((1,) + x.shape)                   # Numpy array with shape (1, 150, 150, 3)# Rescale by 1/255x /= 255.0# Let's run our image through our network, thus obtaining all# intermediate representations for this image.successive_feature_maps = visualization_model.predict(x)# These are the names of the layers, so can have them as part of our plotlayer_names = [layer.name for layer in model.layers]# -----------------------------------------------------------------------# Now let's display our representations# -----------------------------------------------------------------------for layer_name, feature_map in zip(layer_names, successive_feature_maps):if len(feature_map.shape) == 4:#-------------------------------------------# Just do this for the conv / maxpool layers, not the fully-connected layers#-------------------------------------------n_features = feature_map.shape[-1]  # number of features in the feature mapsize       = feature_map.shape[ 1]  # feature map shape (1, size, size, n_features)# We will tile our images in this matrixdisplay_grid = np.zeros((size, size * n_features))#-------------------------------------------------# Postprocess the feature to be visually palatable#-------------------------------------------------for i in range(n_features):x  = feature_map[0, :, :, i]x -= x.mean()x /= x.std ()x *=  64x += 128x  = np.clip(x, 0, 255).astype('uint8')display_grid[:, i * size : (i + 1) * size] = x # Tile each filter into a horizontal grid#-----------------# Display the grid#-----------------scale = 20\. / n_featuresplt.figure( figsize=(scale * n_features, scale) )plt.title ( layer_name )plt.grid  ( False )plt.imshow( display_grid, aspect='auto', cmap='viridis' )

正如我们所看到的,我们从一组可以清楚地看到猫的像素转移到同一幅图像越来越紧凑和抽象的表现。当我们向下游走的时候,我们观察到网络开始突出网络所关注的内容。可以观察到图像中较少的特征被突出显示。图像中的大多数特征被设置为“零”。这被称为'稀疏性,这是深度学习的一个关键特征。

随着我们向下游发展,该表示携带的关于图像原始像素的信息越来越少,但是关于图像类别的信息越来越精确。它类似于一个蒸馏系统,在这种情况下可以称为“信息蒸馏系统”。

可视化精度趋势

蓝色线表示模型在训练数据上的表现,橙色线表示模型在验证数据上的表现。我们观察到,我们的训练准确率达到了大约 100%,而我们的验证准确率停留在 70%左右。同样,我们的培训损失稳步下降,而我们的验证损失继续稳步上升。

这是过度拟合的经典例子。当一个模型暴露于少量的例子时,过度拟合就会发生,在这个例子中只有 2000 个例子。当在小的训练数据集上训练时,模型倾向于学习不相关的特征,这些特征不概括数据。例如,当给人类一小组伐木工人和水手的照片并且假设照片中只有伐木工人戴帽子时,人类可能错误地将帽子与伐木工人联系起来,即人类现在可能开始认为所有伐木工人都戴帽子,而不是水手。

为了克服这个问题,我们可以简单地增加图像,即我们简单地调整图像来改变它一点。

图像增强

现在,除了 ImageDataGenerator 的 rescale 特性,我们还实现了图像放大。

图像增强有助于处理过度拟合。如果图像被增强,它可以创建新的图像集来训练模型,而无需显式地获得新的图像。它试图修改现有的图像,从而在其中创建更多的功能。因此,在绘制和比较训练和测试的准确性时,损失较小。

然而,在不利方面,如果测试图像集缺乏多样性,并且与训练集更相似,我们可能会遇到图像增强不能反映我们克服过拟合问题的情况。因此,我们还必须在测试集中有各种各样的图像。

可供我们选择的方案有:

rotation_range —我们可以旋转图片的度数。在 0 度到 180 度之间变化。

width_shift 和 height_shift —总宽度或高度的一部分,在此范围内随机垂直或水平平移图片。

shear_range —随机应用剪切变换。

zoom_range —随机放大图片。

horizontal_flip —随机水平翻转一半图像。与现实世界的图片相关。一幅风景,从一边看或水平翻转后,似乎仍然是一幅自然的画。

fill_mode —用于填充新创建像素的策略,可在旋转或宽度高度移动后出现。

迁移学习

迁移学习是机器学习中的一种技术,它专注于存储从解决一种类型的问题中学到的知识,并实现对一些其他相关类型的问题的解决方案。

我们可以在 Keras 中使用 API 来实现这一点,这些 API 可以帮助我们查看预训练模型的层。这有助于我们确定我们希望使用哪些层,以及我们希望重新培训哪些层。

使用预训练模型的快照。稍后可以将参数加载到预训练神经网络的这个骨架模型中,以转变成训练模型。

Keras 已经内置了初始模型的模型定义。我们可以实例化模型并指定数据的输入形状。 InceptionV3 顶部有一个全连接层。通过指定 include_top = False ,我们告诉模型忽略完全连接的层,直接进入卷积。通过将权重参数分配给,我们指定我们不需要模型的内置权重。我们可以稍后通过 load_weights 方法分配我们想要的权重,并将下载的权重加载到模型中。

我们现在已经准备好了我们的预训练模型。我们可以遍历模型层并锁定它们,换句话说,我们指定这些层是否是可训练的。

模型中的所有层都有名称,因此我们可以查看特定的层。我们可以从预先训练好的模型中抽取任何一层,并获取它的输出。

我们现在将获取该输出,并将其与密集层连接,因为我们在实例化模型时忽略了完全连接的层。然后,我们将通过创建一个模型并向其传递输入和层定义来整合所有层。然后,通过指定优化器、损失函数和我们需要的指标来编译模型

一旦完成,我们将遵循和以前一样的程序。

我们将创建一个图像数据生成器并增强我们的图像。

然后,我们可以指定包含训练图像的目录,并让它流经生成器,以便对来自训练目录的图像应用所有的增强。

然后像以前一样,通过将模型传递给 fit_generator 方法来训练模型。这里,模型被训练 100 个时期。

上图是准确度与训练和验证集的对比图。该模型开始很好,但随后开始偏离训练。因此,我们最终处于一种不同的过度拟合状态。

为了理解这一点,让我们假设下图是我们的神经网络。这种错误背后的想法是,当我们的模型试图预测导致过度拟合的数据时,神经网络中的层有时可能最终具有相似的权重,并可能相互影响。我们经常在大型复杂网络中看到这种错误。

通过实施【辍学】,我们有效地使我们的模型看起来像这样。

结果是邻居不会太多地相互影响,因此我们可以潜在地克服过度拟合。

我们可以通过添加 Dropout 层在代码中实现这一点。该参数可以是 0 到 1 之间的任何值。这里我们给定参数为 0.2,这意味着我们将丢失 20%的神经元。

当我们开始观察验证准确性偏离我们的训练准确性时,这个问题就成了实施退出的一个很好的候选对象

这是实现辍学后的图表。

多类分类

到目前为止,我们已经解决了二元分类问题,我们试图将图像分为两类。我们现在将开始“多类分类”,我们试图将图像分为两个以上的类别。

在这里,我们试图将图像分为 3 类,即石头,纸和剪刀。以上是我们需要维护的文件结构,以便实现我们所学的二进制分类,就像我们维护猫狗分类问题的文件结构一样。

与前面的问题类似,我们将创建一个图像数据生成器,而不是将类模式设置为'二进制',我们将把它设置为'交叉熵'。

接下来,我们将更改模型定义。

对于二进制分类问题,我们将在最后一层使用具有' Sigmoid '激活函数的单个神经元,因为这将是 0 或 1,取决于模型的预测。

这里,我们的输出层中有 3 个神经元,激活函数为' Softmax ' 。

在有 3 个神经元的 Softmax 函数的情况下,当给出类似下图的输入时,其中一个神经元将会点亮。请注意,所有值的总和等于 1。我们可以称这些值为每一类的概率。该图像很可能属于具有最高概率的类别,因此该神经元将被点亮。

我们还将实施一项更改。对于二进制分类问题,我们有了'二进制 _ 交叉熵 ' 损失函数。

对于多类分类问题,我们将使用'分类交叉熵'

由于在之前的“猫和狗”分类问题中,我们只有两个类别来对数据进行分类,因此我们使用了“二元 _ 交叉熵”损失函数。这次我们将数据分为三类,因此使用了'categorial _ cross entropy'函数。一般来说,所有多类分类问题,即具有两个以上类的问题,将使用该损失函数。

至此,我们结束了本课程的记录。在这篇文章中,我们学习了如何为图像分类构建卷积神经网络,实现数据扩充和迁移学习,以及如何实现多类分类器。然而,我们仅仅触及了计算机视觉所提供的大量应用的表面。这些计算机视觉应用中有几个结合了复杂的架构和策略,这些架构和策略源自我们在本课程中看到的卷积神经网络的基本结构。这个领域的可能性是无穷无尽的,探索这些可能性的追求推动了深度学习社区和研究更深入地研究这个主题。

我希望这能激励你参加这个课程,并开始自己实验、探索和实现这些错综复杂的卷积神经网络。

感谢你阅读这篇博客。我希望听到你对此的想法。

张量流卷积神经网络

原文:https://towardsdatascience.com/convolutional-neural-networks-with-tensorflow-8c980d206330?source=collection_archive---------66-----------------------

尼克·希利尔在 Unsplash 上的照片

实现 LeNet 5 架构来对 MNIST 数据集上的数字进行分类。

这个世界充满了非结构化数据,而不是结构化数据。它包括图像、文本、图表等等。这些数据很难分析,直到深度学习再次开始存在。深度学习是机器学习的一个分支,它受到大脑工作机制的启发,特别是对神经元的影响。人工神经元结合在一起形成一种叫做神经网络的东西。

深度学习取得了有影响力的进展,尤其是在图像数据上。图像数据非常复杂,因为它没有表格格式,而且有大量的参数,尤其是像素。假设当你使用 SVM 和逻辑回归等机器学习模型时,你想预测哪个图像代表猫,哪个图像代表狗,你必须自己确定猫和狗的区别。

区分猫和狗的特征是什么?嗯,你可以通过它的鼻子、眼睛、耳朵等等来说。要捕捉这些特征,您可以使用卷积运算来捕捉这些特征。但是如果要提取特征,就存在一些问题。而是这些图像彼此之间的形式不同。因此,我们应该有一种方法,可以自己学习从图像中提取特征的参数。

我们必须处理两个任务,提取特征和预测图像。我们可以使用卷积神经网络(CNN)来解决我们的问题。

与传统的机器学习相比,它的特别之处在于它可以捕捉数据的非线性。像支持向量机(SVM)和逻辑回归这样的算法仅从数据中估计线性函数来将它们分类。另一方面,由于激活函数,神经网络可以估计一个非线性函数,该函数将数据划分到它们的类别中。

神经网络如此强大的另一个原因是,该模型可以自己设计特征,并且由于反向传播的能力,它可以学习捕捉特征并正确预测数据。因此,神经网络是从非结构化数据中发现知识的完美模型。

本文将通过 Yann LeCun 的 LeNet 5 架构(第一个 CNN 架构)向您展示如何使用卷积神经网络解决图像分类问题。然后,我们将使用 Python 中的 TensorFlow 库实现它。本文的目标将是这样的,

  • 了解卷积神经网络的构建模块,
  • 了解 CNN 架构,尤其是 LeNet 5 架构,最后
  • 可以用 Python 中的 TensorFlow 实现架构

基本面

在我们开始实施之前,为了确保您不会感到困惑,我将向您展示卷积神经网络的基础知识。它由卷积层、子采样(池化)层和全连接层组成。

卷积层

摘自斯坦福 CS230 课程备忘单

卷积层是使用卷积过滤器捕捉图像特征的层。如前所述,卷积是一种用给定的过滤器计算像素的操作,通过逐元素相乘,然后将它们作为一个数字相加。

过滤器将减少数据的维度,但维度的数量会随着时间的推移而增加。如果我们想保持图像的尺寸,我们可以设置填充。填充在图像的边界添加缺失的像素。因此,它将具有与前一个相同的维度。

或者在做卷积的时候想避免像素重叠,可以用 stride。步幅是一种操作,其中卷积过程将随着其给定的数字而跳跃。利用这一点,它可以按照给定的数目跳几级。

该图层将学习适合数据的参数,因此可以准确预测图像。此外,因为它希望捕捉图像的非线性,该层包含一个名为整流线性单元(ReLU)的激活,它将负值设置为 0,否则将是值本身。因此,通过使用这一层,我们不必手动提取特征。

汇集层

来自 GeeksForGeeks

池层基本上是一个降低数据维度的层。该层的机制类似于卷积层,只是它不应用任何滤镜。池层的例子是最大池层。它将取图像对应的每个区域的最大值,正如我们可以看到上面的图像。通过获取图像每个区域的最大值,图层可用于汇总图像。

全连接层

在卷积和池层之后,现在图像进入完全连接的层。该图层将处理预测结果。它类似于人工神经网络(ANN)图层,因为它包含节点,对于预测已缩减像素采样的图像非常有用,并且其特征已经被检索。该机制也类似于人工神经网络,但它增加了卷积层,以自动进行特征提取。

LeNet 5 架构

在我们知道 CNN 的构建模块之后,我们如何实现它呢?我们可以参考现有的对它的研究,可以用它的架构作为我们的参考来构建自己的 CNN 模型。对于本文,我们将使用现有的第一个 CNN 架构。它来自 Yann LeCun 和他的团队在 1998 年发表的一篇名为“基于梯度的学习应用于文档识别”的论文。他们提出了一个名为 LeNet 5 的架构。它看起来像这样,

摘自 Yann LeCun 关于 LeNet 5 的论文

一般来说,架构由几层组成。流程看起来像这样,

Conv = >池=> Conv = >池= >全连接层= >输出

它将执行两个常规步骤。它们是特征提取(Conv = >池序列)和用于预测值的全连接层。如果我们观察细节,每一层至少重复两次。这就是为什么它被称为深度学习,因为它比现有的机器学习模型更深入地学习数据。

在我们了解架构之后,我们可以直接进入实现。为了实现这一点,我们将使用 TensorFlow 及其 Keras API 来实现。我们将使用来自 Keras 的高级 API,因此您可以更容易地实现模型,而不是使用低级 API。

行动(或活动、袭击)计划

在我们实现这一点之前,我将向您概述一下我们将如何使用 TensorFlow 实现这一架构,

  1. 准备数据
  2. 构建模型并设置优化器
  3. 拟合模型并用数据验证集进行验证

实施

准备数据

在我们实现模型之前,我们必须准备数据。首先,我们将导入数据。它的来源是 Kaggle 上的数字识别竞赛。它由 60000 行组成。然后,它分成 42000 个观察值用于训练数据,其余的用于模型的测试数据。在我们导入数据后,数据最初看起来是这样的,

数据集仍为表格格式。列表示标签和对应于图像的像素。因此,我们必须重塑数据集。但在此之前,请确保首先对图像进行归一化,然后对数据集进行整形。最后,我们将训练数据分成两部分,模型的训练和验证数据集。

这样做的代码看起来像这样,

**# Import The Libraries**
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras import layers, models
from sklearn.model_selection import train_test_split**# Import The Dataset**
train = pd.read_csv('../input/digit-recognizer/train.csv')
test = pd.read_csv('../input/digit-recognizer/test.csv')**# Prepare the training set**
train_image = train.drop('label', axis=1)
train_label = train['label']**# Normalize the data**
train_image = train_image / 255.0
test_image = test / 255.0**# Reshaping the image**
train_image = train_image.values.reshape(-1, 28, 28, 1)
test_image = test_image.values.reshape(-1, 28, 28, 1)**# Split into training and validation dataset**
X_train, X_val, y_train, y_val = train_test_split(train_image, train_label, test_size=0.1, random_state=42)

对于数据的预览,它看起来像这样,

图像的预览

建立模型

准备好数据后,我们就可以建立模型了。我们将基于架构构建模型,并使用我们的数据集进行调整,因为数据与原始纸张的维度不同,即 28 x 28 x 1。正如我们之前所说的,模型的流程看起来像这样,

Conv = >池=> Conv = >池= >完全连接

这是构建它的代码,

model = models.Sequential()
**# Feature Extraction Section (The Convolution and The Pooling Layer)**
model.add(layers.Conv2D(filters=6, kernel_size=(5, 5), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.AveragePooling2D())
model.add(layers.Conv2D(filters=16, kernel_size=(5, 5), activation='relu'))
model.add(layers.AveragePooling2D())
**# Reshape the image into one-dimensional vector**
model.add(layers.Flatten())
**# Classification Section (The Fully Connected Layer)**
model.add(layers.Dense(120, activation='relu'))
model.add(layers.Dense(84, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
**# Show summary of the model**
model.summary()

在我们建立模型之后,摘要将会是这样的,

模型的总结

正如我们所看到的,我们可以看到图像的尺寸减少了,但过滤器的数量增加了。在我们提取特征后,我们将图像整形为一维向量来预测它。此外,我们可以看到,除了池层之外,每一层都有一定数量的参数。在这种情况下,模型要学习 44426 层。该模型将学习这些参数,以实现预测图像的更高精度。

为了适应和优化这个模型,代码应该是这样的,

**# Compile The Model**
model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])**# Fit And Evaluate The Model Using Validation Dataset**
history = model.fit(X_train, y_train, epochs=10, validation_data=(X_val, y_val))**# Evaluate The Model Using Plot** plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0.95, 1])
plt.legend(loc='lower right')

之后,模型拟合数据,并根据历元数重复几次。为了评价,模型达到这样的精度,

拟合过程

带精度结果的历元线图

正如我们可以看到的,我们得出的结论是,5 的历元数比任何历元数都要稍好一些。因此,我们可以只使用 5 个时期来建立模型,并且我们可以使用它来预测值。

最终想法

我们已经使用 LeNet 5 架构在 MNIST 数据集上建立了模型。我们模型的精确度已经很高了,但我们还可以进一步改进模型。为了改进模型,我们可以增加数据,微调模型,添加更多的过滤器和模型的深度,等等。

存在许多 CNN 架构,例如 VGG-16、ResNet、AlexNet 等等。我必须告诉你这只是开始。关于计算机视觉,我们可以学到很多东西。我希望这篇文章将是你开始计算机视觉之旅的一个很好的开端,我也希望你可以使用 CNN 或其他方式开发一个很好的应用程序。

参考

[1]马丁·阿巴迪等人。艾尔。 TensorFlow:异构系统上的大规模机器学习 (2015)。tensorflow.org 提供的软件。
[2]扬·勒存等。艾尔。基于梯度的学习应用于文档识别。IEEE 会报,第 86 卷,第 11 期,第 2278-2324 页,1998 年 11 月,doi: 10.1109/5.726791。
[3] Yann LeCun 等。艾尔。深度学习 (2015)。《自然》, 521(7553),第 436-444 页。

感谢您阅读我的文章,您也可以在下面查看我以前的文章:

[## R 中 ARIMA 模型的时间序列预测

从勘探到预测 1970 年至 2015 年的二氧化碳排放数据。

towardsdatascience.com](/time-series-forecasting-with-arima-model-in-r-77f4e2ae7abb) [## R 时间序列分析导论

从探索,到预测。使用印度尼西亚 2002 年 12 月至 2020 年 4 月的消费者价格指数(CPI)数据

towardsdatascience.com](/introduction-to-time-series-analysis-with-r-a2f97650baa3) [## 数据科学和竞争性编程

他们在解决问题,但方法不同。

towardsdatascience.com](/data-science-and-competitive-programming-2887300207c0)

Cookiecutter 创建自定义可重用项目模板

原文:https://towardsdatascience.com/cookiecutter-creating-custom-reusable-project-templates-fc85c8627b07?source=collection_archive---------14-----------------------

一个简短的教程,学习如何修改现有的 cookiecutter 模板或从头创建自己的模板。

Unsplash 上由 Neven Krcmarek 拍摄的照片

你过去和未来的项目可能在某些方面都是独一无二的。也就是说,如果你是(并且你应该是)适度组织的,所有的底层结构在项目之间不会有太大的变化:一个文件夹用于原始数据,另一个用于处理过的数据;一个存放源代码的文件夹,一个存放报告的文件夹等等。拥有一个共享的结构不仅在短期内有助于找到和使用与项目相关的所有资源,而且从长远来看,有助于各个项目之间的一致性和可复制性。

如果做得好的话,良好的项目结构可以节省时间,但是如果你刚开始一个新项目的时候,还在创建自述文件和。gitignore 的而不是导入 matplotlib。人们总是可以简单地复制一个旧的项目,删除/修改旧的文件和文件夹,但这并不会比从头开始更有趣或更快。尤其是如果你必须改变每个文档中的项目标题,每个文件的每个联系人部分的作者姓名等等。这个问题真正的最佳解决方案是使用灵活的模板工具。事实上,有太多的模板工具,然而,以其简单、灵活和直观而著称的是 cookiecutter

如果你还没有听说过它,或者你还没有花时间使用它来优化你的模板,在这篇文章中,我将向你展示如何快速开始使用现有的在线 cookiecutter 模板,如何定制它们,以及如何在没有代码或复杂设置的情况下从头开始制作你自己的模板。

安装 Cookiecutter

安装 cookiecutter 就像在 python 中安装任何其他包一样简单:

pip *install* cookiecutter

或者,如果您使用的是 conda:

conda *install* -c conda-forge cookiecutter

我个人更喜欢拥有一个包含 cookiecutter(以及其他常用/快速使用的工具)的通用 conda 环境,然后为特定的项目依赖项创建一个新环境。但我把这部分留给你。

使用预定义的 Cookiecutter 模板

与开源天堂中的许多资源一样,您可以通过使用您喜欢的 maaaaaany 公共模板之一来开始使用 cookiecutter 模板。

我特别喜欢的一个是cookiecutter-data-science模板。我强烈推荐你访问这个链接,看看整个模板结构。它不仅是一个很好的文件目录树,还可以帮助您组织一般数据相关项目的概念流程。如果需要,我们将在下一节学习如何定制它。如果你想知道对于不同类型的项目还有什么其他的模板(Django 模板,数据新闻模板等等。)你应该看看官方文件上的详细列表。

不过现在,我们将使用烹饪数据科学。假设您希望将项目保存在文件夹 AllProjects 中,通常您会将所有项目保存在该文件夹中。只需进入该目录,在命令/Anaconda 提示符下激活您虚拟/conda 环境(如果您还没有进入该目录),然后键入:

cookiecutter <repo url>

如果你确实在使用cookiecutter-data-science,这就变成了:

cookiecutter https://github.com/drivendata/cookiecutter-data-science

或者,如果你想保存一些字符,你可以使用 GitHub 地址的快捷键:

cookiecutter gh:drivendata/cookiecutter-data-science

如果是第一次使用,它会先把模板下载到本地。一旦完成,cookiecutter 动作就开始了。根据您选择的模板,系统会提示您回答不同的问题,例如项目名称是什么、作者姓名、项目描述、许可证等。这些都是您可以采用的不同定制选项(或者简单地接受默认选项)。填写所需答案或从提供的选项中选择(默认值出现在方括号中)。

我将假设(如果您被询问项目的名称,这通常是应该的)您选择了名称 ElProject 作为项目的根目录。完成所有问题后,您现在应该会在 AllProjects 目录中看到新的项目文件夹,其中包含模板提供的所有内容:

AllProjects
└── ElProject
    └── <all the template's subfolders and files>

就这么简单!

根据模板的不同,您可能会看到它不仅包括一个好的目录树,还包括一些有用的文件,如。gitignore(从版本控制中排除文件),一个预先编写的自述文件,安装和需求文件以及更多好东西。

如果你想开始一个新的项目,比如说 超级机密项目 ,再次运行命令,在你的 AllProjects 目录下,回答提示,你应该会看到目录下添加的项目文件夹:

AllProjects
└── ElProject
    └── <all the project's subfolders and files>
└── super secret project
    └── <all the project's subfolders and files>

如果您需要任何额外的定制,您可以随时添加/删除/更改项目目录中的任何内容。但是,如果您一次又一次地进行相同的定制,那会怎么样呢?也许您更喜欢为您所做的每个项目创建 LaTex 报告,或者 PowerPoint 演示文稿,并且您厌倦了创建文件,从以前的项目中复制相同的结构,然后使用当前项目的信息来纠正它们。如果这是您的情况,那么请继续阅读下一节,我将介绍如何创建定制模板。

创建和自定义模板

从头开始创建模板

创建您自己的 cookiecutter 模板的第一步是用您希望我们的模板拥有的名称创建一个文件夹。您应该始终选择一个易于记忆并且能够描述使用该模板的项目类型的名称。不过对于本教程,我们将做完全相反的事情,并将我们的新模板命名为 dasTemplate

这个文件夹可以放在你电脑的任何地方,但是我建议你把所有的模板放在一起,比如放在文件夹 AllTemplates (如果你把所有的模板保存在一个容易访问的远程存储库中,比如Github,你会得到额外的分数)。现在,我们有以下目录:

AllTemplates
└── dasTemplate

现在,进入新的空文件夹 dasTemplate 开始创建你的模板。

我们希望在模板中重新创建的最基本的功能是能够创建一个以我们的项目命名的空文件夹。为此,intodas template添加下面两个完全相同的内容(包括花括号):

  1. 答。json 文件名为cooki cutter . JSON(如果第一次,只需创建一个文本文件,但另存为。json 而不是。txt)
  2. 名为{ { cookiecutter . project _ name } }的文件夹

因此我们的模板目录现在看起来像这样:

AllTemplates
└── dasTemplate
     ├── cookiecutter.json
     └── {{cookiecutter.project_name}}

在使用模板之前,您需要打开 json 文件,并在其中编写以下内容:

{
"project_name": "default_name"
}

在解释它们之前,我们可以看看使用这个模板会给我们带来什么。

为此,转到您希望创建项目的位置(例如目录 AllProjects ),并传递与我们使用cookiecutter-data-science模板时相同的命令。然而,这一次不是提供存储库的 url,而是简单地传递模板的路径(除非您也想从 GitHub 使用模板,然后传递存储库的 url…):

cookiecutter path/to/template

例如(如果你像我一样运行 windows):

cookiecutter C:\Users\USer1\Documents\AllTemplates\dasTemplate

运行此命令时,您将得到以下提示:

project_name [default_name]:

你可能会认出这是我们在。json 文件。现在,只需输入你的项目名称,例如 ElProject 。之后,您应该会看到新的项目文件夹被添加到目录中:

AllProjects
└── ElProject

那么,我们在这里做了什么?这个问题的答案最好一分为二。首先,可以将 cookiecutter.json 看作是我们希望用户在创建新模板时收到的提示文档。正如我暗示的那样。json pair 只是在您没有对提示提供任何答案时使用的默认值。反过来,可以在模板中的任何位置使用这些参数,语法为{{cookiecutter.parameter}}。从这个意义上来说,当我们创建文件夹{{cookiecutter.project_name}}时,我们告诉 cookiecutter 寻找提示 project_name 的答案,并在创建新的单个项目时使用它作为文件夹的名称。

这意味着当我早些时候告诉你你必须完美地复制基本模板时,这并不完全正确。在。json 文件,您实际上可以编写如下内容:

{
"bestCheese": "Cambozola"
}

和模板结构:

AllTemplates
└── dasTemplate
     ├── cookiecutter.json
     └── {{cookiecutter.bestCheese}}

只要您在模板中用双花括号(例如 {{cookiecutter.parameter}})写的内容与 json 文件中的参数匹配,那么 cookiecutter 就会为您完成剩下的工作。

添加到模板

我们现在可以通过选择我们希望模板在项目的文件夹中重新创建的文件来开始慢慢增加我们的模板。在 cookiecutter 中这样做是非常直观的:

您放置在模板中的任何文件和文件夹将按原样出现在使用该模板启动的单个项目中。不仅文件和文件夹会在那里,而且它们的内容也会在那里。也就是说,任何写在里面的东西,每一个图像,所有的东西!

假设您希望您的项目从根目录下的 README.md 开始,并且可能有一个 aboutme.txt 文件用于简要描述您和一些联系信息,以及一个 reports 文件夹,其中有一个 LaTex 报告的模板:

AllTemplates
└── dasTemplate
     ├── cookiecutter.json
     └── {{cookiecutter.project_name}}
          ├── README.md
          ├── aboutme.txt
          └── reports
              └── monthlyReport.tex

在您希望创建项目的目录中运行命令,您应该看到:

AllProjects
└── ElProject
    ├── README.md
    ├── aboutme.txt
    └── reports
        └── monthlyReport.tex

超级容易,但是有点无聊。让我们通过为文件名及其内容使用一些新的可变参数来使它更加个性化。让我们要求将项目的简短描述添加到不同项目的 README.md 中,aboutme.txt 以单个项目的作者命名,并显示项目的名称和描述。tex 文件。我们将首先修改。json 文件来请求所有这些新信息:

{
"project_name": "default_name",
"description": "short description",
"author": "Dr. Myfull Name",
"email": "reachme@mail.com"
}

现在让我们用花括号来修改文件和文件夹。新模板目录应该如下所示:

AllTemplates
└── dasTemplate
     ├── cookiecutter.json
     └── {{cookiecutter.project_name}}
          ├── README.md
          ├── {{cookiecutter.author}}.txt
          └── reports
              └── monthlyReport.tex

README.md 可能如下所示:

# {{cookiecutter.project_name}}
This is a great README file by {{cookiecutter.author}} ({{cookiecutter.email}})

The project is about:
{{cookiecutter.description}}

对于 latex,语法可能会有一些变化(这就是我选择它作为例子的原因),因为 LaTex 在自己的语法中使用了花括号。请注意下面的月度报告示例:

\documentclass{article}%%%%% Packages %%%%%
\usepackage{graphicx}
\usepackage{glossaries}%%%%% Graphics %%%%%
{% raw %}
\graphicspath{{../figures/}}
{% endraw %}%%%%% Glossary %%%%%
\makeglossaries
\loadglsentries{glossary}%%%%% Project details %%%%%
\title{ {{cookiecutter.project_name}} }
\author{ {{cookiecutter.author_name}} }
\date{\today}

我想让你注意的第一件事是项目细节部分。对于标题和作者,双花括号与包围它们的花括号之间用空格隔开。这不是纯粹的审美。在某些情况下,如果你写的时候没有空格,cookiecutter 将不能正确地创建你的文件夹。因此,我建议当您遇到这种情况时,无论您是在 Latex 中工作还是在其他地方工作,都要一步一步地尝试您的模板。

第二个要注意的是图形部分。也许你已经问过自己“如果我需要在文件中使用双花括号怎么办?”。如果这是您的情况,并且您要正常进行,cookiecutter(或者更恰当地说,它所基于的语言)很可能会向您抛出一个错误,认为您正在尝试使用一个很可能不存在的变量或命令。您可以简单地通过用{% raw %}和标记{% endraw %}(一个用于打开,一个用于关闭)将它包围起来,从而避开这个问题。在 raw-endraw 之间的所有文本将出现在单个项目上,就像它在模板中输入的一样;花括号什么的。

这不是我们能用 cookiecutter 开发的唯一额外功能。我们将在下一节看到更多有用的命令。

利用 Jinja 语法增强你的模板

到目前为止,我们看到了如何用我称之为“花括号”的语法创建可复制的模板。这个语法实际上属于模板语言 Jinja ,它在幕后运行 cookicutter 程序。如果你和 Django 或者 Liquid 一起工作过,你可能会熟悉这种语言的范围和应用。

一个人可以用 Jinja 做的所有事情的详细解释已经超出了这篇文章的范围。相反,我将只提到一个特别有用的基本技巧,它可以帮助提升你的模板。

假设,您通常在三个不同的团队中工作,并且您希望您的模板指定单个项目实际上属于哪个团队,以及每个团队的名称列表。您可以简单地在您的。json 调用“project_team”并在每次使用模板时填写团队名称。但是,您可能会拼错名称,这将导致意想不到的和/或恼人的错误。最重要的是,如果你每次都简单地写下团队名称,你将如何更新你的文件作为你答案的一个功能?

您可以做的是设置。json 提供了一个选项选择,而不是一个完全开放的字段,并使用良好的 ol' if 语句告诉模板根据您的答案打印哪个团队的列表。为此,首先修改。json 文件,只需简单地将所有选项添加到括号中通常会放置默认答案的位置(现在默认情况下,将采用括号中的第一个选项):

{
"project_name": "default_name",
"description": "short description",
"author": "Dr. Myfull Name",
"email": "reachme@mail.com",
"project_team": ["Great Team", "Team of Legends", "The Other Team"]
}

现在,让我们根据对提示的回答,将团队成员列表添加到 README.md 中:

# {{cookiecutter.project_name}}
This is a great README file by {{cookiecutter.author}} ({{cookiecutter.email}})

The project is about:
{{cookiecutter.description}}

## Team:
{% if cookiecutter.project_team == 'Great Team' %}
* Max E.Mumm
* Jack Pott

{% elif cookiecutter.project_team == 'Team of Legends' %}
* Armando E. Quito
* Al E.Gater

{% elif cookiecutter.project_team == 'The Other Team' %}
* May B.Dunn
* Justin Thyme
{% endif %}

如果您运行该命令来创建一个新项目,您应该会看到根据您所选择的团队,README.md 的团队成员列表会有所不同。例如,如果我与“伟大的团队”一起工作,项目文件夹中的自述文件将如下所示:

# ElProject
This is a great README file by Dr. Myfull Name (reachme@mail.com)

The project is about:
short description

## Team:

* Max E.Mumm
* Jack Pott

有了这个新增的功能,您现在应该能够创建非常灵活的模板,允许您使用相同的共享结构快速启动新项目,而无需更改所有的小细节。

如果您一直往下读,希望您现在已经对如何使用 cookiecutter 模板有了一个很好的想法。你现在可以使用预制的,根据你的需要定制或者创建你自己的。如果您希望我介绍更强大的 Jinja 命令来进一步提高您的工作效率,或者有任何评论/问题,请随时在社交媒体上留下评论或加入我。模板快乐,我现在要去吃些饼干了…

原载于https://matic derini . github . io/blog/tutorial/2020/04/13/cookiecutter . html2020 年 4 月 13 日。

面向数据科学的项目管理 Jupyter 扩展

原文:https://towardsdatascience.com/cookiecutter-plugin-for-jupyter-easily-organise-your-data-science-environment-a56f83140f72?source=collection_archive---------24-----------------------

数据科学、编程、项目管理

这是一个 Cookiecutter Jupyter 扩展,可以在没有终端的情况下轻松组织项目文件夹

格伦·卡斯滕斯-彼得斯在 Unsplash 上拍摄的照片

开始之前

在这篇博客中,我们将讨论我的一个个人资料库:

Jupyter Launcher 中的一个类似 Cookiecutter 的扩展

在博客的末尾可以找到知识库的链接。

快速演示

Cookiecutter 如何提高 Jupyter?

毫无疑问,Jupyter 是数据科学/机器学习环境的一个组成部分,无论是笔记本电脑、实验室还是中枢。它们每个都有自己的好处,笔记本是最友好的定制插件,Jupyter Lab 使多台笔记本工作变得容易,而 Jupyter Hub 支持多用户和更多。

然而,Jupyter 的一个弱点是它没有组织项目的工具。

这就是厨师的用武之地。对于以前使用过它的人,单击此处的跳过这一部分。另外, cookiecutter 是一个 python 包,它允许我们只用几行代码就创建一个标准的文件夹结构。最棒的是,你不需要遵循 cookiecutter 的标准。看看这里的其他格式的

$ pip install cookiecutter$ cd path_to_my_project_folder# pick your own flavour of cookie
$ cookiecutter https://github.com/drivendata/cookiecutter-data-science

瞧啊。你现在应该有一个标准文件夹结构准备好了。在我的例子中,目录看起来像:

├── README.md          <- Front page of the project. Let everyone 
│                         know the major points.
│
├── models             <- Trained and serialized models, model
│                         predictions, or model summaries.
│
├── notebooks          <- Jupyter notebooks. Use set naming
│                         E.g. `1.2-rd-data-exploration`.
│
├── reports            <- HTML, PDF, and LaTeX.
│   └── figures        <- Generated figures.
│
├── requirements.txt   <- File for reproducing the environment
│                         `$ pip freeze > requirements.txt`
├── data
│   ├── external       <- Third party sources.
│   ├── interim        <- In-progress intermediate data.
│   ├── processed      <- The final data sets for modelling.
│   └── raw            <- The original, immutable data.
│
└── src                <- Source code for use in this project.
    ├── __init__.py    <- Makes src a Python module. 
    │
    ├── custom_func.py <- Various custom functions to import.
    │
    ├── data           <- Scripts to download or generate data.
    │   └── make_dataset.py
    │
    ├── features       <- Scripts raw data into features for
    │   │                 modeling.
    │   └── build_features.py
    │
    ├── models         <- Scripts to train models and then use
    │   │                 trained models to make predictions.
    │   │                 
    │   ├── predict_model.py
    │   └── train_model.py
    │
    └── viz            <- Scripts to create visualizations.            
        └── viz.py

为什么我们需要一个库克式的 Jupyter 扩展?

想象一下,如果你正在 JupyterLab 做一个项目。

灵感来袭;你想开始一个新项目。你是做什么的?

A.启动一个终端;通过 Cookiecutter 创建另一个标准文件夹目录;在端口 8890 启动另一个 JupyterLab 来处理这个项目,因为您已经有 8888 和 8889 运行两个不同的 JupyterLab 会话。

B.在同一个 JupyterLab 会话中,开始处理 Untitled29.ipynb

C.算了吧;开始另一个项目太麻烦了,哼!

我们都知道答案,不是 B,就是 c。

那么 Cookiecutter 有什么问题呢?

Cookiecutter 是一个非常非常非常训练有素的数据科学家开始一个新项目的惊人的组织工具

换句话说,在你和你下一个定义良好的标准文件结构的项目之间有太多的点击。

JupyterLab 和 JupyterHub 的 Cookiecutter 插件

如果 Jupyter Launcher 中有一个神奇的按钮可以在当前文件夹中创建一个 Cookiecutter 文件结构呢?

Jupyter Cookiecutter 扩展简介:

典型的 JupyterLab / JupyterHub 发射器。信用: Ellip

一个神奇的 JupyterLab / JupyterHub 发射器!致谢:陈奕迅

首先,我们将使用官方 JupyterLab 服务示例,它已经附带了在类型脚本中定制扩展的必要组件。这个博客将关注这个插件如何改进我们的工作流程,另外,你可以访问这个库,所以我们不会深入代码。但是如果你有任何问题,请随时给我留言!

本质上,这个插件所做的就是首先跟踪你当前的文件夹。假设我们创建了一个名为example_project的新文件夹,双击进入它,你应该可以在你的启动器的笔记本部分看到example_project

一旦你点击了 Cookiecutter 模板按钮,它就会创建一个如下所示的文件夹结构。给它几秒钟,如果什么都没有出现,刷新它;魔法需要时间。

├── README.md          <- The top-level README for 
│                         developers using this project.
│
├── data
│   ├── external       <- Third party sources.
│   │   └── .gitkeep
│   ├── interim        <- In-progress intermediate data.
│   │   └── .gitkeep
│   ├── processed      <- The final data sets for modelling.
│   │   └── .gitkeep
│   └── raw            <- The original, immutable data.
│       └── .gitkeep
│
├── docs               <- A default Sphinx project; see 
│   │                     sphinx-doc.org for details
│   └── .gitkeep
│
├── environment.yml    <- Conda environment file
│
├── logs               <- Folder for storing logging outputs
│   └── .gitkeep
│
├── models             <- Trained and serialized models, model 
│   │                     predictions, or model summaries
│   └── .gitkeep
│
├── notebooks          <- Jupyter notebooks. Naming convention 
│   │                     is a number (for ordering), the
│   │                     creator's initials, and a short `-` 
│   │                     delimited description, e.g.
│   │                     `1.0-jqp-initial-data-exploration`.
│   └── .gitkeep
│
├── references         <- Data dictionaries, manuals, and all 
│   │                    other explanatory materials.
│   └── .gitkeep
│
├── reports            <- HTML, PDF, and LaTeX.
│   └── figures        <- Generated figures.
│       └── .gitkeep
│
├── requirements.txt   <- The requirements file for reproducing 
│                         the analysis environment, e.g.
│                         generated with `pip freeze > 
│                         requirements.txt` or `pipreqs src`
│
├── setup.py           <- Fill in the file to make this project 
│                         pip installable with `pip install -e`
│
├── sql                <- SQL scripts, stored procedures etc.
│   └── .gitkeep
│
├── src                <- Source code for use in this project.
│   └── __init__.py    <- Makes src a Python module
│
├── tests              <- Scripts for unit testing
│   └── .gitkeep
│
└── .gitignore

这种特定的文件夹结构有几个关键特性:

  1. 基于 Cookiecutter 数据科学模板的扩展文件结构,增加了类似tests的文件夹,用于促进测试驱动开发,sql用于鼓励在pickle上使用数据库(感谢我的同事坚持将这个sql子文件夹放在适当的位置!),logs文件夹,用于跟踪所有的日志输出等。
  2. 带有.gitkeep文件,以确保所有的文件夹都会被 git 跟踪,即使你没有任何文件在tests文件夹下(记住,默认情况下 git 不会跟踪空文件夹)
  3. 自带一个默认的 Python [.gitignore](https://github.com/github/gitignore/blob/master/Python.gitignore),所以你不需要自己去获取它

以上所有,在一个按钮内!

现在你没有任何借口不开始整理你的项目文件夹了!(至少在项目的最开始)

限制和注意事项

  1. 这个插件只在JupyterLab >= 2.0.0JupyterHub >= 1.2.0上测试过。
  2. 再说一次,魔法需要时间。因此,在所有文件和文件夹生成之前,尽量不要创建空文件。
  3. 如果文件/文件夹已经存在,将出现Invalid response: 409 Conflict错误。你最终会得到一个Untitled Folder或者Untitled.py
  4. 这个插件现在有一个硬编码的文件结构。如果你需要不同的结构,你需要在安装插件之前更新jupyter-cookiecutter-extension/src/index.ts
  5. 这是一个类似于 Cookiecutter的插件,它没有 aws、s3、许可证等其他配置。
  6. 当您在所有项目的父目录中启动 Jupyter Lab 或 Jupyter Hub 时,这个插件工作得最好。例如,我的项目文件夹的本地父目录是/projects,这意味着我应该在/projects启动 Jupyter,而不是实际的项目目录。
  7. 该存储库附带了 Docker 安装指南。如果你想把它作为你的 Docker 开发环境,Docker 文件应该会包含你!

贮藏室ˌ仓库

$ git clone https://gitlab.com/louis.chanloyuet/jupyter-cookiecutter-extension
$ cd jupyter-cookiecutter-extension
$ git fetch && git checkout 1.0.0

** [## Louis Chan / Jupyter Cookiecutter 扩展

一个最小的 JupyterLab / JupyterHub 扩展,用于从 Jupyter Launcher 创建 cookiecutter 模板。

gitlab.com](https://gitlab.com/louis.chanloyuet/jupyter-cookiecutter-extension)

你可能也喜欢这个

[## 熊猫数据帧上的高效条件逻辑

是时候停止过于依赖。iterrows()和。应用()

towardsdatascience.com](/efficient-implementation-of-conditional-logic-on-pandas-dataframes-4afa61eb7fce) [## Python 中高效的根搜索算法

在 Python 中实现高效的寻根和优化搜索算法

towardsdatascience.com](/mastering-root-searching-algorithms-in-python-7120c335a2a8)

在你走之前

感谢阅读这篇博客!成为一名训练有素的数据科学家绝非易事;我必须承认我自己从来就不是一个人( 道歉 )。希望这个插件能降低每个人养成一些好习惯的门槛,让我们的代码库更有条理,更易维护。如果你从这里学到了新的东西,请告诉我!欢迎在评论中留下你的评论和问题。直到下一次,保持安全,继续编码,并成为我的客人分叉库。

再见!

[## Louis Chan—FTI Consulting | LinkedIn 数据科学总监

雄心勃勃的,好奇的和有创造力的个人,对分支知识和知识之间的相互联系有强烈的信念

www.linkedin.com](https://www.linkedin.com/in/louis-chan-b55b9287/)**

数据科学的烹饪方法

原文:https://towardsdatascience.com/cooking-s-recipe-for-data-science-7f1ebf9828a5?source=collection_archive---------46-----------------------

马丁·范·登·霍维尔在 Unsplash 上的照片

如何将现场可靠性工程(SRE)整合到您的数据科学团队、产品和服务中

D 记者:所有表达的观点都是我个人的。为一些非常有品味的烹饪双关语做好准备!

在这篇文章中,我站点可靠性工程中提炼出关键思想:谷歌如何运行生产系统 & 站点可靠性工作手册将它们与数据科学融合。我为为什么实施站点可靠性工程(SRE)实践不仅会增强您的数据科学产品的可靠性,而且还会提高您的数据科学团队的整体效率提出了一个论点。然后,我将详细介绍如何将 SRE 集成到数据科学团队、产品和服务中。

当我鼓励你通读整篇文章的时候,你可以随意地从这个想法的拼盘取样!以下是菜单上的内容:

菜单

0.设置表:运行示例

  1. 前菜/开胃菜:起始题
    1.1SRE 是什么?
    1.2 为什么我希望 SRE 加入我的数据科学产品生命周期?
    1.3 我能在不雇佣专门的现场可靠性工程师的情况下实施 SRE 吗?
  2. 关键成分:关键成分 SRE
    2.1 服务水平目标(SLOs)
    2.2 服务水平指标(SLIs)
    2.3 错误预算
    2.4 错误预算策略
    2.5 监控
    2.6 告警
    2.7
  3. 穿上你的思维“无拘无束”:SRE 指导原则要牢记3.1有些 SRE 总比没有 SRE 好
    3.2 事情会出乱子,我们所能做的就是准备!
    3.3 SRE 指标不是玩指责游戏的工具
  4. 在没有厨师的情况下经营厨房:在没有专职现场可靠性工程师的情况下实施 SRE4.1从简单做起,从小做起
    4.2 采用分担责任模式
    4.3 从一开始就通过自动化消除辛劳
  5. 要点:一些最终想法

0.摆桌子

一个运行实例

为了说明关键思想,我将使用下面的运行示例:

由作者使用 draw.io 创建

你是一个网站的自豪的产品所有者,该网站允许用户上传食品的图像,并使用你最先进的深度学习模型来确定食品是否是三明治。您希望将 SRE 集成到三明治分类服务的产品生命周期中。对于本文,我们将忽略前端相关的 SRE,而专注于服务于机器学习模型的后端。

1.开胃菜/开胃品

T 何出题

安吉拉·贝利在 Unsplash 上拍摄的照片

1.1 什么是 SRE?

SRE 是一个相当宽泛的概念,因此,如果你尝试谷歌搜索“SRE”,你可能会失望地发现,并没有一个明确的公认的功能定义。那么,让我给你我的定义,一个我们可以马上开始工作的定义:

站点可靠性工程是指原则、实践和过程的框架,主要目标是提高(数字)产品和服务的可靠性。

1.2 为什么我希望 SRE 出现在我的数据科学产品生命周期中?

  • 为了提高数据科学产品的可靠性和稳健性 通过实施可靠的 SRE 原则和实践,您可以采取更有条理和更主动的方法来提高产品的稳健性,而不是在出现问题时采取混乱和被动的方法。
  • 在维护旧东西和开发新东西之间划分优先级 SRE 是一种非常数字化和数据驱动的软件运营方法。使用 SLO、错误预算、错误预算政策、监控和警报,您可以有非常明确的标准来确定您的团队是否应该投入更多时间来维护和改进三明治分类器,或者他们是否应该开发一种用于分类其他类型食品的新功能。
  • 为了提高产品开发过程的质量 我认为,当你将 SRE 文化灌输到你的团队中时,你的团队的开发实践和文化就会得到改善。随着开发人员变得更加“SRE 意识”,他们将倾向于围绕构建健壮可靠的数据科学产品来优化他们的开发实践,一直到编写代码、进行代码评审和提出 QA 测试案例的微观层面。

1.3 我可以在不雇佣专门的站点可靠性工程师的情况下实施 SRE 吗?

简答:有!
长回答:看第 4 节(经营没有厨师的厨房)但先通读第 2 节。

2.关键成分

SRE 的关键部件

照片由 Calum LewisUnsplash 上拍摄

以下是您需要了解的关键概念/组件

2.1 服务水平目标(SLO)

SLO 可以说是 SRE 最重要的概念。SLO 为您的服务可靠性指定了一个目标水平,通常定义了一个隐含的时间段。SLO 是以客户为中心的阈值,量化客户对您的数据科学产品满意的可靠性水平。例如,在三明治分类服务的情况下,我们可能在 1 个月的时间内有以下 2 个 SLO:

  • 可用性:99.9%的可用性
  • 延迟:99%的请求延迟 500 毫秒

2.2 服务水平指标(SLIs)

sli 是帮助量化 SLO 的特定指标。SLI 通常是两个数字的比值:

(好事发生次数)/(总件发生次数)

对于三明治分类器,我们的 sli 应该是这样的:

  • 可用性:非 5XX API 请求占总请求的比率
  • 延迟:快于 500 毫秒的请求占总请求的比率

这样的度量标准是很好的 sli,因为它们很直观——0%表示一切正常,100%表示一切正常。

2.3 误差预算

误差预算= 100%-SLO。对于三明治分类器,这意味着假定每月可用性 SLO 为 99.9%,误差预算为 0.1% (43 分 12 秒)。错误预算是我们将围绕其设置警报和错误预算策略的指标。误差预算在其他方面也很有用。例如,我们可以根据事故消耗了多少月度错误预算来量化停电事故的严重程度。

2.4 错误预算政策

根据站点可靠性工作手册,错误预算政策定义了一旦错误预算耗尽或接近耗尽时各种利益相关者将采取的具体步骤。对于我们的三明治分类器示例,误差预算策略中的一些关键动作可能包括以下内容:

  • 开发模型的数据科学家/机器学习工程师将优先修复生产错误,直到服务在预算内,而不是开发新的模型来对披萨进行分类
  • 将强制执行代码冻结,以停止对生产部署的任何进一步更改,从而最大限度地降低进一步的风险。只有当有足够的误差预算时,才允许进行更改。

2.5 监控

监控通常包括仪表板,以人类可读的时间序列形式显示关于关键指标的信息。在发生事故时,监控仪表板应该能够帮助您回答 3 个主要问题——发生了什么,什么时候发生的,为什么会发生?以下是您应该监控的指标/组件列表:

  • SLIs 和错误预算:对于我们的三明治分类器,我们应该有仪表板来显示按状态代码(2XX、4XX、5XX)、p99 延迟和当月剩余错误预算分组的请求数量。
  • 模型性能度量:对于我们的三明治分类器,我们应该监控被分类为三明治与非三明治的图像的比率。这将有助于检查模型是否过拟合/欠拟合,以及是否需要在更好的数据集上重新训练或替换模型。(对于像欺诈检测这样的用例来说,这绝对至关重要!)
  • 依赖关系:如果三明治分类器依赖于一个外部数据库,仪表板应该监控这个数据库的健康和性能。
  • 预期变化:如果三明治分类模型已经被重新训练,将热狗分类为三明治,那么我们应该通过仪表板上的图表捕获并确认这一变化的成功部署。
  • 流量&资源使用:仪表板应该捕获流量、吞吐量和资源使用,比如 CPU 和内存。这是为了确保在使用量增加的情况下(典型的新数据科学产品就是这种情况),资源能够迅速扩展以处理更大的流量。如果您想采用某种形式的自动缩放,流量仪表盘也有助于识别流量模式。

2.6 警报

事件触发警报,警报触发操作。警报的目的是在重大事件发生时通知正确的人正确的事情。例如,如果在部署一个新的三明治分类模型后,延迟突然达到峰值并持续半个小时,则需要提醒相关人员采取缓解措施。警报依赖于监控和阈值来确定何时、向谁和向什么发出警报。

2.7 支持流程

最大化其他 SRE 组件的效用产量通常需要 3 个关键过程:

  • 事故升级协议:对于如何处理生产事故,最好有一个周密的计划。该协议应该包括诸如谁(开发人员、技术负责人还是产品所有者?)应该在(10%,25% 50%的误差预算用尽时采取行动?)以及应该采取哪些具体行动。在我看来,这些信息也应该纳入错误预算策略,并且应该与警报紧密联系在一起。
  • 事后分析:无可指责的事后分析对于从事故中吸取教训至关重要,从而提高未来的可靠性和稳健性。在将 SRE 集成到您的数据科学产品生命周期的早期阶段,如何进行事后分析将在设定基调方面发挥至关重要的作用。
  • SLO & SLI 修订:根据您的项目生命周期的速度和 SRE 框架的成熟度,将需要定期修订您的 SLO 目标和 SLI,以确保 SRE 以可持续的方式实施,因为您的用户和利益相关者的要求会随着时间的推移而变化。

一旦你脱离了建立一些粗略的 SRE 实践的初始阶段,第四个隐含但关键的过程/组件是一个经过深思熟虑的随叫随到的设置。用 SRE 工作手册的话说,

…随叫随到意味着在设定的时间段内随时可用,并且在这段时间内随时准备以适当的紧急程度响应生产事故。

您可能希望一些员工在工作时间之外随叫随到,以确保您服务的可靠性。您团队中的这些随叫随到的成员应该有一个详细的分步指南,以随叫随到的行动手册的形式说明在发生事故时应该做什么,并且应该可以访问相关的技术文档、错误预算政策和上报协议。你可以在这里阅读更多相关信息

3.穿上你的思维“无沿帽”

牢记 SRE 指导原则

照片由юліядубинаUnsplash

3.1 有 SRE 总比没有 SRE 好

我认为部分实施 SRE 总比什么都没有好。例如,对于三明治分类服务,您可能没有制定出精确的错误预算政策,但通过一些基本的 SLO、监控和警报,至少您将能够在网站关闭时主动修复问题,而不是被大量用户投诉所通知。最好是定义一个理想的 SRE 实现的愿景,然后迭代地、逐步地向它前进。

3.2 事情会出错,我们能做的就是准备!

一个或多个组件在某个时间点发生故障导致可用性低于 100%的概率不为零。如果你设法为你的顾客创造了一个 100%可靠的体验,并希望保持这种可靠性水平,你就永远无法更新或改进你的服务。因此,100%的可靠性是错误的目标。另一个警告是,当你从 99%到 99.9%再到 99.99%的可靠性时,每增加 9 个可靠性就会增加成本,但是对你的客户来说边际效用稳定地趋近于零。

3.3 SRE 指标不是玩指责游戏的工具

通过将员工的绩效 KPI 与这些指标挂钩,可以很容易地利用 SRE 的数字数据驱动方法。然而,从长远来看,这确实是有害的。它会延续一种适得其反的相互指责的文化。你想要的是一种责任共担的文化,通过系统地实施 SRE 原则、实践和流程来减少和消除事故和错误。

4.经营一个没有厨师的厨房

在没有专职现场可靠性工程师的情况下实施 SRE

shruti dadwalUnsplash 上拍摄的照片

4.1 从简单开始,从小处着手

  • 从对您的客户最重要的 1 到 3 个基本 SLO 开始,如可用性和延迟。随着时间的推移,可以添加几个 SLO 来提高整个产品的健壮性。
  • 设定合理的目标,比如 90%,而不是像 99.9999%这样非常严格的目标。随着时间的推移,这些目标可以逐步细化和收紧。
  • 为您的 SLO 设置一些简单的控制面板,并提供基本的警报来捕捉事件和关键趋势。大多数云提供商都有便捷的监控和警报解决方案。如果没有,设置一个简单的 Grafana-Prometheus-alert manager 堆栈并不是一件非常繁琐的任务。随着时间的推移,可以添加更多的监控和警报。
  • 不要马上正式采用 SRE 的实践,先试运行一段时间,也许是一个季度,让你的团队尝试模仿理想的升级、事后分析和 SLO 修订。

4.2 采用分担责任模式

虽然 SLO 通常需要由产品所有者(例如:CTO 或产品经理)负责,但 SRE 不能集成到您的产品生命周期中,除非每个人都参与进来。“每个人”包括所有的利益相关者——数据科学家、机器学习工程师、DevOps、QA、产品经理、业务请求者等。让每个人都参与到理解和规划将 SRE 集成到您的数据科学产品生命周期中。分阶段推出你的 SRE。将生产系统划分为组件(例如:前端、机器学习模型、后端、基础架构),并让负责这些组件的不同人员通过事件升级协议一起工作。进行上报演习和事后分析,以加强团队中的 SRE 文化。

4.3 从一开始就通过自动化消除辛劳

SRE 的一个重要概念是消除辛劳。辛劳指的是重复的、平凡的维护类任务,很少或根本不需要创造性的解决问题。在我看来,从一开始就应该优先考虑消除劳累。在 SRE 实施流程中寻找可能实现自动化的机会。把它们写下来!虽然最初可能需要更长的时间来自动化一项任务,但这是一项可行的投资,因为随着 SRE 集成在您的团队、产品和服务中的扩展,这种辛劳可能会成为一项巨大的负债。

5.外卖食品

一些最后的想法

安布尔·恩格尔在 Unsplash 上拍摄的照片

当谈到理解和实现 SRE 时,有许多问题需要解决。在数据科学领域,深度学习模型等黑盒模型带来的不确定性增加了如何定义 SLO、警报和升级策略的复杂性。我的建议是不要焦虑,开始行动吧!就像你的机器学习模型一样,你和你的团队也会随着经验的增加而变得更好。

见见厨师!

艾西瓦娅·普拉巴特

嗨!我是艾西。我名字的前两个字母是“AI”,AI 和机器学习是我热爱的。我目前是新加坡的高级数据科学家,也是 GeorgiaTech 的硕士生。你可以通过 LinkedIn 联系我。

有 Pi 的酷项目

原文:https://towardsdatascience.com/cool-projects-with-a-pi-7bd4792c6e90?source=collection_archive---------12-----------------------

树莓派入门

Raspberry Pi 是一系列低成本的单板计算机,和你的信用卡一样小。自 2012 年第一个版本问世以来,它们在世界各地的爱好者和制造商中非常受欢迎。同年,Raspberry Pi 赢得了 T3 的年度创新奖。

截至 2019 年底,已售出约 3000 万个树莓 Pis。— 询问者

在 8 年的时间里,树莓派经历了大量的迭代和改进。下面是一个表格,显示了到今天为止已经发布的不同型号的树莓 Pi。

几代发布的树莓 Pi 模型(来源

使用 Raspberry Pi 的项目

这里列出了一些使用 Raspberry Pi 的有趣项目,让您了解人们是如何使用它的:

家庭自动化

基本物体和运动检测

仪表板摄像头

流媒体服务器

带有红外近程传感器的 WhatsApp 监控摄像机

在这篇文章中,我将向你展示如何建立你的 树莓派 3B+ 模型,这样你就可以开始使用它来创建你自己的项目。

树莓派 3B+ ( 图片来源)

树莓派 3B+规格

覆盆子 Pi 3B+是覆盆子 Pi 3 系列的最终版本。

处理器: Broadcom BCM2837B0、Cortex-A53 64 位 SoC @ 1.4 GHz
内存: 1GB LPDDR2 SDRAM
联网:千兆以太网 over USB 2.0(最大吞吐量 300 Mbps)、2.4GHz 和 5GHz IEEE 802.11.b/g/n/ac 无线局域网
蓝牙:蓝牙 4.2、蓝牙低能耗(BLE)【中 相机串行接口(CSI)、显示器串行接口(DSI)
尺寸: 82mm x 56mm x 19.5mm,50g
工作温度:0–50°C
生产寿命:将至少持续生产到 2023 年 1 月

您将需要的东西:

  1. 树莓派 3B+
  2. sd 卡
  3. SD 读卡器
  4. 以太网电缆

您需要下载的操作系统:

图像来源

  1. Raspbian Buster :这是我们将要安装在树莓派 3B+上的操作系统。请下载 Raspbian Buster 带桌面和推荐软件

您需要下载的软件:

蚀刻机软件(图像源)

  1. Etcher 是一个免费的开源工具,用于编写图像文件。iso 和。img 到存储介质上,以创建动态 SD 卡和 USB 闪存驱动器。

VNC 浏览器(图片来源)

  1. VNC 浏览器: VNC 浏览器是一款允许远程访问和控制启用了 VNC 服务器的设备的软件。

步骤:

  1. 使用 SD 读卡器将 SD 卡插入您的 PC/笔记本电脑。
  2. 格式化 SD 卡。
  3. 使用 Etcher 软件将 Raspbian buster 图像文件刻录到 SD 卡。

使用蚀刻机将 Raspbian 刻录到 SD 卡

4.通过在 SD 卡的根目录下创建一个名为 ssh 的空白文件,启用 ssh 以便您可以远程访问它。

将 ssh 文件添加到 SD 卡的根目录

5.从 PC/笔记本电脑中弹出 SD 卡,将其插入 Raspberry Pi,接通电源打开 Raspberry Pi。

6.使用以太网电缆将 Raspberry Pi 连接到 PC/笔记本电脑。

树莓派 3B+与以太网电缆和电源电缆连接

7.使用终端从您的 SSH 到 Pi。输入以下命令:

ssh pi@raspberrypi.local

8.系统将提示您输入密码。输入默认密码(raspberry)。

9.现在,使用以下命令在 Raspberry Pi 上启用 vncserver:

vncserver

10.从您的 PC 上,打开 VNC 浏览器,并添加树莓 Pi 的 ip 地址,以远程连接到它。

11.现在从远程访问,连接到 wifi,这样您就可以访问它,而不必使用以太网电缆连接到 PC。

全部完成!您的覆盆子 Pi 3B+现在可以使用了。

觉得这个帖子有帮助? 在下面留下你的想法作为评论。

最初发表于www.xailient.com/blog

希望在树莓派上实现实时人脸检测?看看这篇帖子

想在树莓派上实现实时人脸跟踪吗?看看这个帖子

更多故事:

在你的 App 上集成人脸检测

在计算能力有限的设备上运行深度学习计算机视觉的挑战

你现在需要从云计算转向边缘计算!

关于作者

Sabina Pokhrel 在 Xailient 工作,这是一家计算机视觉初创公司,已经建立了世界上最快的边缘优化对象检测器。

使用 pd-replicator 复制/粘贴数据帧

原文:https://towardsdatascience.com/copy-paste-a-dataframe-with-pd-replicator-24e625fc9d53?source=collection_archive---------87-----------------------

数据科学可能涉及在不同平台之间移动大量数据。pd-replicator 试图使(部分)操作尽可能简单!

数据科学是非常迭代的。这些迭代可能涉及不同平台之间的大量来回数据。也许你从你的 BI 工具中提取一些数据,在 Jupyter 中运行一些分析,然后将输出转移到电子表格中与你的队友分享。然后,你发现你需要修复的东西,并最终再次运行整个事情。

问题是,当你摆弄这些数据的时候,你在一些本质上无聊的事情上失去了精神能量/健康。我构建了 pd-replicator 来帮助尽可能简单地将数据从 Jupyter 转移到电子表格中,这通常是我发现数据处理中最痛苦的部分。

概观

pd-replicator在 Jupyter 的数据帧输出中添加一个复制按钮,允许你将数据帧复制到你的剪贴板中,并允许它直接粘贴到电子表格中。

这是一个简单的pip包,只需要很少的设置就可以工作。它适用于所有类型的 Jupyter,包括 classic Jupyter、JupyterLab 和 Google Colaboratory。它也适用于本地和远程托管的设置,如 AWS SageMaker 或 JupyterHub!

下面是一个实际应用的例子:

复制数据帧后,将其粘贴到电子表格中就像选择一个单元格并点击粘贴一样简单:

一旦它被安装和设置好,使用它就像用replicator()包装你选择的数据帧一样简单,向输出添加一个复制按钮。copy button 小部件还有一个下拉菜单,可让您准确选择要从数据帧中复制的内容。

我在下面提供了一些说明,但它们也可以在自述文件中找到。

装置

可以通过pip进行安装:

> pip install pd-replicator

ipywidgets必须设置,以便按钮/下拉菜单正确显示:

> pip install ipywidgets 
> jupyter nbextension enable --py widgetsnbextension

要使用 JupyterLab,还需要一个额外的步骤:

> jupyter labextension install @jupyter-widgets/jupyterlab-manager

使用

replicator()环绕任何pandas数据帧/系列,以在数据帧/系列上方显示复制器复制按钮:

from pd_replicator import replicatorreplicator(df)

对于远程托管的实例,native选项应该设置为False:

from pd_replicator import replicatorreplicator(df, native=False)

这使用 JavaScript 通过你的浏览器复制到剪贴板,而不是pandas.to_clipboard()使用的系统复制方法。

反馈

如果您对pd-replicator有任何无法解决的问题,请在这里随意在 GitHub 上创建一个问题!

珊瑚漂白分析可视化——Tableau 还是 R ggplot?

原文:https://towardsdatascience.com/coral-bleaching-analysis-visualisation-tableau-or-r-ggplot-43e657c1cdbe?source=collection_archive---------49-----------------------

比较 Tableau 和 R ggplot 在珊瑚漂白分析中传递关键信息的有效性

UnsplashBawah Reserve 拍摄的照片

Tableau 和 R 是两种常见的数据可视化工具,前者因其简单和初学者友好的功能而闻名,后者因其广泛的用户交互可能性而闻名。我们如何决定哪种可视化工具更容易实现,或者在向相关利益相关者传达关键见解时更有效?这篇文章将探讨这个问题,并希望达成一个共同的共识。

资料组

我们将使用的数据集包含 2010 年至 2017 年大堡礁珊瑚白化的百分比。总共有 5 种不同的珊瑚类型,主要是蓝珊瑚、硬珊瑚、海扇、海笔软珊瑚。提供了位于大堡礁的 8 个不同地点/位置及其纬度和经度。

按作者分类的图像-数据集中前 6 条记录的输出

关键消息

在我们构建的每一个数据可视化中,都必须有一个我们希望传递给相关利益相关者的关键信息,以便在这些数据洞察的支持下采取适当的行动。在该数据集中,我们希望解决以下问题:

1.从 2010 年到 2017 年,哪一年哪一种珊瑚漂白最严重?

2.该地点的位置如何影响不同珊瑚类型的白化现象?

画面可视化

在确定了我们希望通过数据可视化传递的关键信息后,我们可以开始尝试可用的可视化类型,看看哪一种将更有效地传递信息,或者我们可以使用更正式的方法,如我之前在这里写的五张设计表(FDS)方法,来设计更好地满足需求的可视化。我喜欢 Tableau 的一点是,只需几个拖放操作,就能轻松构建不同的视觉效果。

对于我们的第一个关键信息,由于我们试图确定一个时间段(即哪一年)和一种特定类型(即珊瑚漂白的类型),我们可以使用一个彩色条形图,其中 x 轴可以是我们的年周期,y 轴是我们的衡量标准(即漂白的百分比),第三维的颜色代表珊瑚的类型。

作者图片—第一条关键信息的可视化表格

通过这种观想,我们知道以下几点:

在 2010 年的年,蓝珊瑚的平均脱色率最差,为的 34.90%** 。**

在 2011 年的年,海笔的平均漂白度最差,为 35.733%

在 2012 年到 2013 年蓝珊瑚的平均褪色率最差,为 37.546%

在 2013 年和 2013 年中,海蓬子的平均漂白度最差,为 36.666%

2014 年,硬珊瑚的平均脱色率最差,为 43.621%

对于 2015 年的年,硬珊瑚的平均脱色率最差,为 48.030%

对于 2016 年和 2016 年硬珊瑚的平均脱色率最差,为 55.239%

对于 2017 年度,海笔的平均漂白度最差,为 62.826%

现在,让我们尝试为我们的第二个关键信息提供见解。由于我们需要确定每个珊瑚点如何影响漂白的百分比,我们可以使用地图以及提供的纬度和经度来可视化。

作者图片—第二条关键信息的可视化表格

请注意,我们只能绘制二维可视化图(即,地图上圆圈的大小代表漂白百分比,圆圈的颜色代表不同的地点),结果总共绘制了 5 幅地图来代表我们的第三维,即珊瑚类型。通过这种观想,我们可以推断出以下几点:

对于蓝珊瑚,最差的平均白化发生在01站点 54.666% ,而03站点 16.221% 受影响最小。

对于海扇,最差的平均漂白发生在站点 0354.541% ,而站点 06 处受影响最小 8.977%

对于硬珊瑚来说,最差的平均白化发生在站点 0167.533% ,而站点 04 处受影响最小 11.044%

对于软珊瑚,最差的平均白化发生在01 号站点35.377% ,而08 号站点受影响最小的 15.385%

对于海围栏,最差的平均白化出现在站点 0358.559% ,而站点 06 处受影响最小 30.493%

R 图可视化

在 R ggplot 中构建可视化不那么简单,对初学者也不太友好,因为现在涉及到了编码。然而,它允许更多的可视化可能性,因为用户可以定制他们想要的图形类型。让我们试着在 R ggplot 中建立一个可以同时回答这两个关键信息的可视化。

# load library
library (ggplot2)# read data into R
coral_data<-read.csv("data.csv")
# rename the headers in data
names(coral_data)<-c("year","type","site","bleaching","longtitude","latitude")
# change the column "bleaching" to numeric form instead of % form
coral_data$bleaching<-as.numeric(sub("%","",coral_data$bleaching))# plot the graph
p<-ggplot(coral_data,aes(year,bleaching)) +
geom_point(aes(shape=type,color=type)) +
facet_grid(type~latitude+site,labeller=label_context)# adding smoother of polynomial type
q<-p+
geom_smooth(method="lm",color="black",size=0.2,formula=y~poly(x,2),se=FALSE)# adding theme to polynomial smoother graph
r<-q+
  theme_bw()+
  ylab('% of bleaching')+
  xlab('Year')+
  theme(legend.position = "bottom", legend.direction = "horizontal")r

按作者分类的图像—两个关键信息的 R ggplot 可视化

我们绘制了一个多面板(分面网格), x 轴为一年中的两个关键维度,y 轴为漂白百分比。珊瑚色,颜色增加了立体感。多面板允许我们引入第四维度,即站点的位置。

对于我们的第一个关键信息,我们能够粗略地识别出每年漂白率最差的珊瑚类型。当然,我们无法按照我们的第一个可视化表格来描述平均漂白百分比。

对于我们的第二个关键信息,我们也能够大致确定每个地点哪种珊瑚的漂白率最差。同样,我们也无法描述第二个可视化表格中的平均漂白百分比。

最后的想法

我们用两种不同的工具绘制了两种不同的可视化。毫无疑问,使用每种工具都有利弊,如果我要选择哪种工具能够更好地向利益相关者传达关键信息,获胜者必须是 Tableau 。尽管我们不得不建立两个独立的可视化来分别传递关键信息,Tableau 能够描述百分比,我认为这在我们向利益相关者传递见解时至关重要,因为它们是由数字支持的。另一方面,R ggplot 是对两个关键信息的简单的一页概述,但不幸的是,在详细检查图表后,只能粗略地识别关键信息。当然,在 Tableau 和 R ggplot 中,这个数据集有 101 种不同的可能性,也许我的方法不是最有效的,不能发挥每个工具的最佳性能。然而,我希望这篇文章能够给你们提供另一个视角来考虑在决定使用哪种可视化工具来表达问题陈述/关键信息时,数据可视化爱好者们欢呼吧!

CORD-19:数据科学对新冠肺炎的回应

原文:https://towardsdatascience.com/cord-19-the-data-science-response-to-covid-19-46d57ab811f3?source=collection_archive---------39-----------------------

通过 CORD-19,白宫呼吁数据科学界提供来自 NLP 和其他机器学习算法的见解。

新冠肺炎病例地图[ 来源

目前,全世界团结一致,共同对抗一个共同的对手:新冠肺炎病毒,这种病毒也被简称为冠状病毒。仅仅几周时间,这种病毒就以指数级的速度在全世界传播开来(咄,这就是它的工作方式)。因为数据科学社区的许多成员现在大部分时间都呆在家里,不知道如何利用他们的技能来帮助根除病毒。有许多方法,但有一个特别有意义的方法直接来自白宫本身:CORD-19。

动机

在此之前,让我们后退一步,确保我们都熟悉病毒是如何一次又一次地传播的。

MeltingAsphalt 的凯文·西姆勒制作了一个很棒的系列互动图,展示了任何病毒是如何传播的(代码这里是)。

约翰·霍普金斯大学(JHU)已经挺身而出,在全球范围内提供对大量分析的持续跟踪。点击下面的链接,浏览他们的图表,这些图表显示了一段时间内的全球病例、死亡和恢复情况。

[## 追踪者

新冠肺炎(新型冠状病毒肺炎)

shiny.john-coene.com](https://shiny.john-coene.com/coronavirus-embed?data=jhu&chart=cases-added&cumulative=false)

他们还创建了一个令人惊叹的仪表盘,其中包括确诊病例的 ArcGIS 地图。地图两边的表格列出了按国家分列的病例和死亡情况。对于美国的读者,请注意欧洲病例的密度。专家说,美国没有做足够的工作来防止这种密度在 1-2 周内发生。点击下面的链接浏览数字。要查看这篇没有媒体编辑器的 iframe 限制的文章,请在这里查看。

[## 使用 ArcGIS 的新冠肺炎仪表盘

新冠肺炎(新型冠状病毒肺炎)

www.arcgis.com](https://www.arcgis.com/apps/opsdashboard/index.html#/bda7594740fd40299423467b48e9ecf6)

好了,回到病毒。我们都很清楚它们是如何通过指数增长传播的(学究式地说,这实际上是逻辑增长)。要想直观地了解新冠肺炎的这一过程,只需看看格兰特·桑德森精彩的 3Blue1Brown 频道:

格兰特·桑德龙对新冠肺炎突围赛的讨论

CORD-19 概述

新冠肺炎分子[ 来源

我想你现在有足够的动力了。那些没有的人可能还在玩上面的地图。不管怎样,我很高兴你有动力,因为我们现在有工作要做。

白宫向技术界发出了行动号召,从大量冠状病毒文献中获取真知灼见。数据(CORD-19)多为关于各种冠状病毒的文字文章。因此,它强烈呼吁自然语言处理(NLP)社区提供见解。各位,准备好迎接即将到来的以芝麻街为主题的模特名字:CORDBERT、BERTID19、CoronaBERT 等。

在这一点上,许多数据科学资深人士会嘲笑和抱怨他们的大部分时间是如何花费在准备数据上,而不是使用数据。我有个好消息:CORD-19 开箱即可机读。

今天,来自艾伦人工智能研究所、Chan Zuckerberg Initiative (CZI)、乔治城大学安全和新兴技术中心(CSET)、微软和美国国立卫生研究院国家医学图书馆(NLM)的研究人员和领导人发布了关于新冠肺炎、新型冠状病毒和冠状病毒群的学术文献的新冠肺炎开放研究数据集(CORD-19)

应白宫科学与技术政策办公室的要求,该数据集代表了迄今为止可用于数据和文本挖掘的最广泛的机器可读冠状病毒文献集合,包含超过 29,000 篇文章,其中超过 13,000 篇具有全文。

whitehouse.gov

加入战斗

Kaggle 是一个数据科学社区,现在在谷歌的保护伞下,已经形成了正式的挑战,从呼吁行动。下面是您的逐步启动和运行流程:

  1. 阅读主页获取 CORD-19 数据。
  2. 查看主 Kaggle 挑战的任务
  3. 查看其他用户所做的现有分析
  4. 与其他用户讨论调查结果。
  5. 参加第 1 周预测挑战。考虑使用 DeepNote 笔记本进行分析,或者使用 AutoML 自动训练模型。

保持最新状态

学术界和工业界的事情发生得非常快!通过一般的 LifeWithData 博客ML UTD 时事通讯让自己保持最新状态。

如果你不是收件箱时事通讯的粉丝,但仍然想参与其中,考虑将这个 URL 添加到一个聚合设置中。

原载于 2020 年 3 月 19 日 https://lifewithdata.org**的

CORD Crusher:将新冠肺炎数据分割成摘要

原文:https://towardsdatascience.com/cord-crusher-slicing-the-cord-19-data-into-summaries-ca5d8f95e276?source=collection_archive---------40-----------------------

我第一次使用自然语言处理深入研究文本数据

在 12 月新冠肺炎疫情爆发的早期,我和妻子在舒适的被窝里等待我们儿子的出生。在他出生后,很明显,新冠肺炎病毒的爆发控制了世界。1985 年底,也就是 1986 年 4 月切尔诺贝利灾难的前几个月,我开始更多地思考自己的出生。似乎在一个不断发展的世界里,新的生活和新的挑战总是相伴而生。所以每当儿子睡觉的时候(没有我本来想的那么多),我就悄悄拿起电脑开始涉水,然后游泳,最后一头扎进 python 中的自然语言处理(NLP)。

2020 年 3 月,白宫科技政策办公室发布了 CORD 19 数据集和行动呼吁:

“呼吁国家人工智能专家开发新的文本和数据挖掘技术,帮助科学界回答与新冠肺炎相关的高优先级科学问题”

Caleb PerezUnsplash 上拍摄的照片

CORD 19 是开发代码以找到关于新型冠状病毒的相关和及时信息的绝佳机会。可用的 NLP 包和技术的数量多得令人应接不暇(例如 RoBERTa ,这也是我岳母的名字,她向我们宣布了新病毒的消息),并且这个列表还在扩展。在本文中,我将演示如何将这些 NLP 包放在一起构建一个名为 CORD crusher 的摘要代码。我将放大我的 NLP 代码的组件,解释它们的功能,并展示它们是如何组合在一起的。五个主要步骤是:

  1. 按出版年份将数据划分为时间范围

2.根据广泛的主题提取关键词和分组论文

3.从每个主题的关键词建立主题

4.将关键词提炼为更具体的主题短语

5.搜索代码 19 文本并按相似性排序

粗略但快速提取的关键字

我发现 RAKE (快速自动关键词提取)既是一种快速的算法,也是一种直观的算法。像“新型冠状病毒”这样的关键词将包含多个单词,每个文档可能使用不同的术语:“新型冠状病毒”、“COVID 19”、“2019-nCoV”。RAKE 只考虑单个文档中的关键字,而不是所有的 CORD 19 出版物。这有助于根据单个出版物的术语查找关键字。

RAKE 关键字评分是基于词频和与其他词共现的图表。直观上,这可以理解为单词相关矩阵,其中对角线是词频,其他条目是一个单词与另一个单词相邻的概率。这种简单的方法降低了计算成本,是提高算法速度的关键(120 个单词不到 1 毫秒)。

由于关键字强烈地代表了文档的上下文,我希望出版物的标题和摘要是查找关键字的主要位置。出版物的这些部分是为了给读者提供所有内容的概要。

**Full abstract and title
Are pangolins the intermediate host of the 2019 novel coronavirus (SARS-CoV-2)?**
The outbreak of a novel corona Virus Disease 2019 (COVID-19) in the city of Wuhan, China has resulted in more than 1.7 million laboratory confirmed cases all over the world. Recent studies showed that SARS-CoV-2 was likely originated from bats, but its intermediate hosts are still largely unknown. In this study, we assembled the complete genome of a coronavirus identified in 3 sick Malayan pangolins. The molecular and phylogenetic analyses showed that this pangolin coronavirus (pangolin-CoV-2020) is genetically related to the SARS-CoV-2 as well as a group of bat coronaviruses but do not support the SARS-CoV-2 emerged directly from the pangolin-CoV-2020\. Our study suggests that pangolins are natural hosts of Betacoronaviruses. Large surveillance of coronaviruses in pangolins could improve our understanding of the spectrum of coronaviruses in pangolins. In addition to conservation of wildlife, minimizing the exposures of humans to wildlife will be important to reduce the spillover risks of coronaviruses from wild animals to humans.**Top 20 Rake keywords:** million laboratory confirmed cases novel corona virus disease sick **malayan pangolins** **novel coronavirus** unknown recent studies showed **phylogenetic analyses** showed pangolins improve emerged coronavirus identified wild animals risks natural hosts originated large surveillance **intermediate hosts** intermediate host related **complete genome**

在上面的例子中,180 个单词的全文被浓缩为 40 个单词,其中关键词包含的信息足以识别该文章是关于新冠肺炎的,关键词是“新型冠状病毒”,并且是关于“系统发育分析”中穿山甲的潜在中间宿主。算法还成功配对了“马来亚”和“穿山甲”。这 40 个单词并不概括摘要,而是标记出可以用来标记出版物主题的最多的关键词,并将其与提到相同单词的其他关键词进行分组。

上述示例还表明,许多关键词仍然过于笼统,例如“最近的研究”或“实验室确诊病例”,但这些将在稍后阶段使用术语频率逆文档频率权重 (TFIDF)进行处理,以找到更具体的罕见关键词。

几十年来的 CORD 19 数据

作为物理学家,时间维度一直是衡量系统演化的一个重要特征。此外,将 CORD-19 的元数据 csv 文件划分为时间范围是管理代码的内存和 CPU 使用的一种有用技术。选择正确的时间范围还可以根据下图中的特征对出版物进行大致分组。

(作者图片)出版年份与 CORD-19 数据集中的出版物数量。

CORD 19 的出版物可以追溯到 1870 年,但是早期的出版物通常没有机器可读的全文。到 1970 年,只有少数出版物可用于文本挖掘,其中大多数是关于动物中的冠状病毒(人畜共患冠状病毒)。关于人类冠状病毒株(如 229E 和 OC43)的出版物数量也很少,因为这些病毒导致轻微症状而不是流行病。出版物的大幅增长出现在 2002 年 SARS 流行期间,导致了 2002 年至 2005 年红线内出版物的峰值。在 2012 年中东呼吸综合征疫情期间,紫色线也出现了一个较小的峰值。正如预期的那样,数据集中的大多数出版物都是 2019 年至 2020 年新冠肺炎疫情期间的出版物。

元数据按照这些趋势分为时间范围:1970-1990 年,1990-2002 年,2002-2005 年,2005-2012 年,2012-2019 年,2019 年至今。元数据可以作为 pandas 数据帧被加载,并且“publish_time”列被转换为 datetime64:

##For a given path to the CORD 19 data and a range [startyear, endyear]
df=pd.read_csv(‘%s/metadata.csv’%PATH)
df[“publish_time”] = df[“publish_time”].astype(“datetime64”)
df=df[(df[‘publish_time’]<’%d-1–1' %endyear) & (df[‘publish_time’]>=’%d-1–1' %startyear)]

对于每个时间范围,我们预计某些关键词会更流行,如公共卫生是 2002 年 SARS 爆发后更常见的关键词。在 2002 年之前,我们预计大多数关键词都与动物冠状病毒有关,而不是人类病毒株。2019 年后,大部分出版物都以新冠肺炎术语为关键词。这种时间切片利用了 SARS、MERS 和新冠肺炎(大约相隔 10 年)等不同冠状病毒爆发之间的明显差异。

空间为我的代码提供了主干。SpaCy 提供了一个管道,可以自动将文本分解成标记,分配词性,并根据单词之间的相互依赖关系分配标签。它还将 PyTextRank 和 RAKE 等包集成到处理管道中,以提高速度和一致性。选择特定的空间模型可以改善结果,对于 CORD 19,有一个针对生物医学数据进行训练的科学空间

SpaCy 也是将关键字匹配到 CORD 19 文本的强大工具。在每个出版物的摘要中找到的匹配关键词被用于根据主题(例如,公共卫生、重症监护、诊断技术)来标记该出版物。匹配的两种主要方式是短语匹配(用于寻找更精确的术语)和基于规则的匹配(寻找更多样的术语)。短语匹配往往运行得很快,因为字符串存储为哈希值(以节省内存),并且使用词汇字典在哈希值和字符串之间进行转换。“重症监护室”下面的模式既用作分配为匹配模式的主题“ICU”的关键字:

##Simple Phrase matchingmatcher = PhraseMatcher(nlp.vocab, attr='LOWER')
patterns=[nlp.make_doc(‘intensive care unit’)]### Don't need full spacy pipeline only need the text
 matcher.add(“ICU”, None, *patterns)### store string as a hash valuefor doc in docs:#### for a list of docs
        #print(doc.text)
        matches=matcher(doc)### Return matched values
        FoundMatches=[]
        for match_id, start, end in matches:
            FoundMatches.append(nlpsci.vocab.strings[match_id])### convert hash value to string and store it in a list

基于规则的匹配依赖于知道产生给定术语的可能记号、记号的顺序或标点符号的分隔。下面的代码匹配一个术语“计算机断层扫描”(CT)。下面基于规则的模式使用带有“IN”属性的列表作为逻辑 OR,用于列表中的任何单词。逻辑运算“+”要求列表中的每个单词至少匹配一次。这就产生了一组 ct 术语,如“胸部扫描”、“ct 扫描”、“胸部发现”和“CT 发现”。也可以通过“+”操作找到类似“胸部 ct 扫描”的模式。在这种情况下,使用几个关键字来匹配主题 ct,而不是主题 ICU,在 ICU 中只有一个字符串“重症监护室”。(关于空间匹配模式和代码练习的更多信息,请查看 Ines Montani 的教程

#### Rule based matching
matcher = Matcher(nlp.vocab)
CT=[{“LOWER”:{“IN”:[“chest”,”ct”]},”OP”:”+”}
, {“LOWER”:{“IN”:[“scans”,”findings”, “ct”]}, “OP”:”+”}]
 matcher.add(“CT”,None,CT)

(作者拍摄的照片)2020 年的月份与出版物数量的对比,分为以新冠肺炎为关键词的总出版物和包括更具体关键词的出版物。(最新 CORD 19 更新于 2020 年 9 月 20 日)

在上面的图中,我只使用找到新冠肺炎匹配模式的出版物,并查看最常见的关联模式。查看出版物数量最多的 2020 年,您可以看到每月出版物主题的细分:

  • 最常发表的主题是公共卫生、识别易受感染的病人和诊断方法。
  • 新冠肺炎与 SARS 和 MERS 一起被提及,以吸取以往疫情的经验。ACE2 这个词每月都频繁出现,就像与新冠肺炎相关的 SARS 和 MERS 一样。这可能是由于 SARS 病毒和新冠肺炎病毒与相同的人类 ACE2 细胞受体结合。
  • 重症监护的主题在 3 月前爆发的早期更为罕见,但随后由于有更多的病例数据,每月都有数百篇出版物。
  • 最罕见的关键词是与新冠肺炎一起被提及的冠状病毒动物毒株。在数以千计被贴上新冠肺炎标签的出版物中,每月只有大约 10 种。

将关键字组合成二元模型和三元模型

N-gram 是 N 个单词的序列,对于将单个标记组合成更具描述性的特征非常有用。一些术语,如“计算机断层摄影”是有用的二元模型(N=2 ),用于研究诊断主题。三元模型(N=3)也经常出现在 CORD 19 数据中,如“世界卫生组织”、“重症监护病房”或“急性呼吸窘迫”。为了查看不同 N-gram 的频率,我使用了类似 CountVectorizer 的 sklearn 特征提取工具,该工具还设置了序列的最小和最大范围:

tf_vectorizer = CountVectorizer(ngram_range=(2,3)) ### Uses only bigrams up to trigrams
tf=tf_vectorizer.fit_transform(skl_texts)####transform and learn the vocab from the list of keywords in skl_texts

上面给出了二元模型和三元模型计数(tf)的矩阵,可以将其转换为一系列用于绘图:

d = pd.Series(tf.toarray().sum(axis=0),index = features).sort_values(ascending=False)
 ax = d[:no_most_frequent].plot(kind=’bar’, figsize=(8,8), width=.8, fontsize=12, rot=50,title=’Most Frequent Keywords’) #### plot the top no_most_frequent 

以新冠肺炎和公共卫生为例,我得到了下面的直方图:

(作者照片)关于新冠肺炎和公共卫生的出版物中倾斜关键词的计数(在将二元模型合并到三元模型之前)

(作者图片)基于 Levenshtein 距离将二元模型合并为三元模型后倾斜关键词的计数。

尽管一些关键词看起来很有用(如“社会距离”、“重症监护室”),但一些三元组被错误地拆分,如“世界卫生”和“卫生组织”应拼凑成“世界卫生组织”。为了进行这种关联,我使用了模糊字符串匹配,并基于 Levenshtein 距离给出了二元模型与三元模型相似程度的比率窗口。我存储了一个二元模型字典,其中三元模型的 Levenshtein 距离在 64 到 100 之间。这说明“世界卫生组织”是出现频率最高的词。像“个人防护装备”这样的三元组在从“个人防护”拼凑回来时也变得更加频繁。这种与模糊字符串匹配的合并显示了对特征的更精确的计数,这些特征可以被输入到代码的下一阶段以用于主题构建。

从主题构建主题

上述主题仅给出了一个宽泛的主题类型,将论文粗略地划分为几组特征。计数直方图已经显示了一个特征趋势:不太频繁的词往往是关于更具体的主题,如“社交距离”,而非常频繁的词过于笼统,会匹配大量的文本,如“世界卫生组织”。

说明这种趋势的一个好方法是将关键词表示为术语-频率逆文档频率 (TF-IDF)矩阵。术语频率是文档中关键字的计数除以总字数。逆文档频率是文档总数除以所有文档的特征计数。该比率的对数允许计算大量文档的 TF-IDF 分数。TF-IDF 分数是通过将两个术语相乘来计算的:术语频率和逆文档频率。对于在所选数据中频繁出现的词,如“世界卫生组织”或“公共卫生”,得分较低。与所有文档相比,在一个文档中频繁出现的单词的 TF-IDF 得分较高,如“社交距离”。特征的这种表示根据它们作为有用搜索词的相关性对它们进行适当的加权。

##### Can also use only the top TF scored features (set with max_features) and require them to have a more than 5000 for their document frequency (set with max_df)
tfidf_vectorizer = TfidfVectorizer(max_features=no_features,ngram_range=(2,3),max_df=5000)####Create the TF-IDF matrix and score the list of features in skl_texts 
tfidf = tfidf_vectorizer.fit_transform(skl_texts)

如何处理特征的 TF-IDF 值矩阵?答案是将其分解成更小的矩阵,这些矩阵的乘积近似等于原始矩阵。我们可以利用 TF-IDF 矩阵是一个非负矩形矩阵的事实(维数为 N 个文档和 M 个关键词)所以它可以近似地被两个非负矩阵分解。因子的矩形矩阵( WH )需要有一个指定的参数,即主题或聚类的数量:

V[行:列]=V [文档:术语]=W(文档:主题)H(主题:术语 )

使用成本函数找到这些因素,一个简单的成本函数如 ||V-WH|| (误差平方和)产生了K-均值聚类算法。对于我的代码,我使用了用于潜在语义分析的相同成本函数kul back-lei bler 成本函数,它基于对数似然比 P/Q 为相同的数据 X 将主题模型 P 与主题模型 Q 分开。如果 P 是比 Q 更好的模型,数据 X 将给出更大的对数似然值。这种模式的非负矩阵分解(NMF)可以使用 sklearn 来完成:

#### Specify the number of topics and the loss function, then fit to the TF-idf matrix to get the factorized model
nmf = NMF(n_components=no_topics,beta_loss=’kullback-leibler’).fit(tfidf)

主题的数量可能是一个关键参数,太少可能无法最大化分离能力,导致主题不一致。过多的主题会导致冗余的主题,每个主题包含的信息很少。如果不观察 2D 的主题群,很难理解这种分离的力量。t-SNE 是一种有用的方法,可以看到投射到 2D(甚至 3D)平面的主题群(从更高维度)。

(作者拍摄的照片)动画图,使用在受试者新冠肺炎和 ACE2 细胞受体中找到的关键字,为每一帧运行不同数量主题(2,4,8,10,15)的 NMF。基于上述 15 个主题,最大化主题分离,同时保持主题集群相当一致。

主题数量合适的 2D 投影应该看起来像是烟花爆炸的碎片。这些簇应该彼此分开,并且每个簇中的点应该靠近质心。

用 NMF 创建的主题有什么用处?

  • 每个受试者(如 COVID-19 和 ACE2)都可以分解成更具体的主题。每个主题只是一个排序的关键字列表(二元模型和三元模型),可用于在 CORD 19 数据中查找相似的文本。(接下来将对此进行描述)
  • NMF 模型还可以用于预测添加到 CORD 19 的新文档的主题,而不必再次运行该算法
  • 原始的 TFIDF 矩阵可以进行类似的转换,以找到每个主题的最典型的文档标题。
### Print keywords per topic:feature_names = tfidf_vectorizer.get_feature_names()for topic_idx, topic in enumerate(nmf.components_):
   print(", ".join([feature_names[i]for i in topic.argsort()[:-no_top_words - 1:-1]]))##### predict topic for new publicationstfidf_LatestCORDData = tfidf_vectorizer.transform(new_keywordsinAbstract)X_new = nmf.transform(tfidf_LatestCORDData)#### this makes an embeddingpredicted_topics = [np.argsort(each)[::-1][0] for each in X_new]### Most likely topic per document#### Lookup the most typical paper titles per topicnmf_embedding = nmf.transform(tfidf)### Transform original TFIDF matrix used to predict topicsnmf_embedding = (nmf_embedding - 
nmf_embedding.mean(axis=0))/nmf_embedding.std(axis=0)### see how far away the scores are from the averagetop_idx = np.argsort(nmf_embedding,axis=0)[-10:]### Top 10 document indicesfor idxs in top_idx.T:#### A loop over topics for idx in idxs:print(SelectedRows.iloc[idx]['title'])### Top 10 most common documents per topic where idx is the index in the dataframe that stored the keywords, abstract and titles for the selected papers

为了看事情如何具体地结合在一起,我用 NMF 建立了 3 个关于新冠肺炎及其动物传染病起源的话题。下面的文本框显示了每个主题的前 10 个主题关键字和前 3 个文档标题:

#####Topic Keywords#######
Topic 0:
seafood wholesale market, world health organization, major public health, huanan seafood wholesale, viral rna, public health emergency, global public health, **species transmission**, codon usage, confirmed casesTopic 1:
time evolution signal, antiviral drugs, **genomic sequences**, host taxa, feline infectious peritonitis, neuromyelitis optica, phylogenetic tree, sequence identity, length genome, animal healthTopic 2:
**spike protein** insertions, epidemic diarrhea virus, potential therapeutic options, receptor binding domain, major public health, infectious peritonitis virus, porcine epidemic diarrhea, feline infectious peritonitis, amino acid, water samples##### Top 3 Document titles from the Transform #######
Topic 0:
**Cross-species transmission** of the newly identified coronavirus 2019-nCoV
The Natural History, Pathobiology, and Clinical Manifestations of SARS-CoV-2 Infections
Global genetic patterns reveal host tropism versus cross-taxon transmission of bat BetacoronavirusesTopic 1: 
COVID-19, Companion Animals, Comparative Medicine, and One Health
**Mapping genome variation** of SARS-CoV-2 worldwide highlights the impact of COVID-19 super-spreaders
Identification and Analysis of Unstructured, Linear B-Cell Epitopes in SARS-CoV-2 Virion Proteins for Vaccine Development.Topic 2: 
Development of a TaqMan-probe-based multiplex real-time PCR for the simultaneous detection of emerging and reemerging swine coronaviruses
Genome based evolutionary lineage of SARS-CoV-2 towards the development of novel chimeric vaccine
Structural basis of SARS-CoV-2 **spike protein** induced by ACE2.

基于以上所述,主题 0 很可能带有“跨物种传播”的标签,因为该术语出现在排名关键词和最典型文档的标题中。出于类似的原因,主题 1 可能带有“基因组序列”的标签。根据标题和主题关键字,主题 2 不太清楚,因此我们将在下一节中以该主题为例。

匹配和排列文本

在实际开采的类比中,在文本开采的这一点上,我们有粗切的石头,可以进一步提炼为珍贵的宝石,以备鉴定。提炼的过程包括从主题关键词中构建短语,以便可以基于抽象的短语进行更具体的文本搜索。评估取决于给定的出版物、匹配句子的段落或单句与 CORD 19 数据中其他内容的相关程度。

为了提炼关键词,我在出版物摘要上使用 PyTextRank 来获得更具体的主题短语。主题短语包含主题单词和附加的上下文信息,以改进搜索。 PyTextRank 是 TextRank 算法的 python 实现,它根据图形中的关联对主题短语进行排序。它通常用于摘录摘要,因为它可以推断主题短语(图中的顶点)之间的链接,并根据顶点的重要性按相关性对它们进行排序。与 RAKE 相比,PyTextRank 运行速度较慢,但也能更准确地指示论文的上下文。

回到上一步的例子,关于新冠肺炎的动物传染病起源的话题 2 很难用话题词来确定。有些话题词像“氨基酸”还是很模糊的。在下面的文本框中,您可以看到主题短语如何使主题单词“氨基酸”更加具体:

Topic 2:
spike protein insertions, epidemic diarrhea virus, potential therapeutic options, receptor binding domain, major public health, infectious peritonitis virus, porcine epidemic diarrhea, feline infectious peritonitis, **amino acid**, water samplesPyTextRank Phrases:
'multiple amino acids', 'two secondary water samples', 'influent, secondary and tertiary effluent water samples', 'five amino acids', 'effluent water samples', 'feline infectious peritonitis virus', 'coronavirus spike protein receptor binding domain', 'key amino acids', '**one noncritical amino acid difference**', '**92.2% amino acid identity**', '**a double amino acid insertion**', '**these variable amino acids**', 'porcine epidemic diarrhea virus', '**a noncritical amino acid**', '**a relatively low amino acid similarity**', 'the spike surface glycoprotein receptor binding domain', 'all tertiary water samples', '**gene and amino acid sequence homologies**', '**a distinct 4 amino acid insert**', '**many amino acid changes**', 'negative all secondary and tertiary treated water samples', 'basic amino acids', 'the 2019-ncov spike protein insertions', '**the nucleocapsid protein amino acid and gene sequence**', 'the receptor binding domain', 'a feline infectious peritonitis (fip) virus', 'a major public health concern', '**22 amino acid insertions**'

类似地,其他主题词如“水样”也可以通过上面的主题短语变得更加具体。如果主题词确实代表相关的搜索词,它们应该出现在与其他短语相比 PyTextRank 得分较高的主题短语中。下图显示了这两种情况的散点图。高 PyText 等级分数(> 0.02)也导致较低的计数频率,因为与低等级分数相比,它们代表更具体的上下文。停用词的得分为 0.0(如 we、is、the)。包含主题词“冠状病毒刺突蛋白受体结合域的得分最高的短语明确了结合域在冠状病毒刺突蛋白上。基于主题短语,主题 2 可能具有标签“刺突蛋白氨基酸插入”。

(作者提供图片)主题短语计数与其 PyTextRank 得分的散点图。通过在包含主题关键词的出版物摘要上使用 PyTextRank 来找到短语。上面的点显示了所有的短语,以及包含主题词的短语。核密度估计显示所有短语倾向于大部分处于较低的等级分数,而那些包含主题关键词的短语处于较大的值。

下面的图表显示了新冠肺炎动物传染病起源的三个主题中的一些主题短语。一般来说,短语的等级越高,在出版物摘要中出现的频率就越低。这提供了更具体的搜索短语,用于搜索 CORD 19 文本以获得有价值的见解。

(作者拍摄)关于新冠肺炎动物传染病起源的 3 个主题的主题短语示例。等级分数越大(越相关),短语越不频繁(越具体)。

SpaCy 短语匹配器再次用于在出版物正文中查找匹配的文本。考虑到具有匹配文本或来自 NMF 嵌入的所有出版物,可以使用余弦相似度来比较出版物的全文:

Corpus=[]
for pub in PubPaths:### Loop over publications
    BodyText=[]
    SkimmedText=SkimallText(Filepath+p,nlpsci)#### return all lines of the paper
    BodyText.extend(SkimmedText)####Full text not just the abstract
    Doc=".".join(BodyText)
    Corpus.append(Doc)
tfidf_vectorizer = TfidfVectorizer()####Build TF-IDF matrix
tfidf = tfidf_vectorizer.fit_transform(Corpus)####Score all the text data
SimilarityArray=cosine_similarity(tfidf, tfidf)#### Make a similarity matrix from the TF-IDF matrix 
nx_graph = nx.from_numpy_array(SimilarityArray)#### Convert similarity matrix into a graph
scores = nx.pagerank(nx_graph)#### Use page rank to score graph vertices
for i,s in enumerate(Titles):##### Print out titles and their scores
        rank.append(scores[i])
        titles.append(s)

与主题 2 最相似的前 3 个文档是:

  1. 新型冠状病毒刺突蛋白的系统发育分析和结构建模揭示了一个进化独特且蛋白水解敏感的激活环
  2. 新冠肺炎疫情:分类学、遗传学、流行病学、诊断、治疗和控制的全面综述
  3. 探索新型冠状病毒刺突糖蛋白的基因组和蛋白质组变异:一种计算生物学方法

类似地,如果上面代码块中的语料库填充了文档中匹配文本的段落(而不是完整的正文文本),则可以用余弦相似度对段落进行排序。排名最高的段落是:

“在 S1 内,发现 N-末端结构域(NTD)与受体结合结构域(RBD,74%同一性)相比保守性较低(51%同一性)……然而, 暴露的环特征已经在模型和 cryo-EM CoV S 结构中得到证实,在 S1/S2 位点具有相似的氨基酸序列……系统发育分析中使用的 S 蛋白的氨基酸序列从图 4 获得……显示了 S1/S2 和 S2 位点的氨基酸序列……发现结构域(NTD)与受体结合结构域(RBD,74%同一性)相比保守性较低(51%)……然而, 在 S1/S2 作者/资助者处,已在具有相似氨基酸序列的模型化和 cryo-EM CoV S 结构中证明了暴露的环特征…获得了用于系统发育分析的 S 蛋白的氨基酸序列…S1/S2 和 S2 位点的氨基酸序列显示为“”。2019 年新型冠状病毒(nCoV)刺突蛋白的结构模型揭示了蛋白水解敏感的激活环,作为与 SARS-CoV 和相关 SARS 样冠状病毒 相比的区别特征

上面的段落仍然过于密集,无法理解是否有有用的见解,因此匹配文本的每个句子(由“…”分隔)都可以用余弦相似性对该主题进行排序。该主题的所有匹配文本中排名最大的句子是:

“此外,我们的分析表明,来自 R. malayanus 的病毒 RmYN02,其特征是在刺突蛋白的 S1 和 S2 亚基的连接位点插入多个氨基酸,与 RaTG13 和新型冠状病毒属于同一进化枝,这为新型冠状病毒在该地区的自然起源提供了进一步的支持” 起源和蝙蝠冠状病毒在中国的跨物种传播

最细粒度的信息,即所选 CORD 19 数据中的句子,用余弦相似度排序可以得出简明的结论。根据上面的论文,在新型冠状病毒的刺突蛋白中插入氨基酸,负责新冠肺炎,支持了病毒起源于马头蝠(马来菊头蝠)的证据。

我想,如果我要简要总结我的挖掘工作,我会按照上面演示的步骤对文本进行剪切、筛选和排序。这将成千上万的文档压缩成一个简短的阅读列表。公共卫生、医学或流行病学方面的专家可以浏览这些见解,找到与他们的研究相关的有趣结论,或者调查重要的公开问题。对于数据科学家来说,将这种算法扩展到无监督的学习方法可能是有用的。最后一步可以和第一步联系起来,这样阅读列表就可以用来找到更多的关键词来标注主题。以这种方式,主题和主题将更健壮地寻找相关信息。

相关文章:

参考

[1]王陆、露西等人 CORD-19:新冠肺炎开放研究数据集(2020 年 4 月 22 日) ArXiv 预印本。
(上文引用的论文)
【2】Javier a . Jaimes,Nicole M. André,Jean K. Millet,Gary r . Whittaker2019-新型冠状病毒(nCoV)刺突蛋白的结构建模揭示了一种蛋白水解敏感的激活环,作为与 SARS-CoV 和相关 SARS 样冠状病毒的区别特征(2020 年 5 月)分子生物学杂志 【3】Latinne,a .,Hu,b .,Olival,K.JNat Commun11、 4235 (2020)。

2020 年要学习的核心数据科学技能

原文:https://towardsdatascience.com/core-data-science-skills-to-learn-in-2020-f70ec6a6b59b?source=collection_archive---------27-----------------------

盲目的追逐只会走进死胡同!知道自己需要什么,2020 年的自己需要什么。

图像通过 Unsplash

数据科学是推动全球整个技术变革的核心。这是复杂的,迷人的,有益的,有趣的,是的,有趣!在…学习、试验或建立职业生涯。从美国宇航局卫星数据和全球气候系统的高端复杂性,到数据密集型应用程序(如人工智能)的日常生活可靠性,你是这个过程的一部分。

但这还不够,不是吗?一起前进。特别是如果你是许多渴望在机器学习、商业智能、图像处理或高级数据分析的广阔世界中取得成功的人之一。不,这肯定不够。数据科学需要非凡的技能、持久性和清晰性来掌握数据科学家用来通过操纵数据得出有用见解的方法。

诚然,数据科学的领域从未像今天这样光明。鉴于对数据科学专家的爆炸性需求和巨大的供应缺口,追求最受欢迎的职业之一的时机已经成熟。而且这种需求只会进一步增长,至少在十年或二十年内,数据科学将继续处于所有技术进步的中心。这就引出了今天的话题,2020 年需要学习哪些核心数据科学技能?能够保持相关性,甚至能够适当地开始。

想要在 2020 年在数据科学领域取得成功的个人应该具备什么样的技能?这是我们需要答案的大问题。是单独编程吗?是数学和编程结合吗?是统计,数学,编程统称吗?要想在众多数据科学领域中取得成功,必须具备什么样的正确组合?

这篇文章的主要目的是解决这些和许多其他类似的问题,以帮助您清除灰尘。我们将讨论使数据科学成为多学科领域的所有兴趣领域,并权衡其在未来几年的相关性。

那么,让我们开始吧!

统计

支撑数据科学成为一个包罗万象的领域的核心主题之一是统计学。数据科学用于通过不同的过程从数据中提取可读信息。这些程序被系统地应用于建模和可视化数据,以实现目标。统计学是分析模型的基础,用于汇总数据。此外,当数据被可视化用于模式发现时,它需要敏锐的统计图形和地图来将信息有效地传达给更广泛的公众。

这使得统计学成为你在未来几年超越数据科学所需要掌握的第一门学科。

编程

绝对有必要对至少一种编程语言如 Python、SQL、R、Java 等有一个无条件的命令。,甚至涉足数据科学领域。它通过结合先进的统计和现实世界的编程能力。在众多语言中,Python — 高级、多用途语言是数据相关领域中使用最多的编程语言。由于其通用性质,Python 允许将 SQL、TensorFlow 和许多其他语言、函数和库集成在一起,用于机器学习和数据科学。

数据科学项目生命周期中有多个阶段,如数据收集、功能工程、功能选择、模型创建和部署以及结果交流。Python 附带了一个数据密集型的定制库,以帮助其大量扩展(例如 NumPy、SciPy、StatsModels、Pandas 等)的每个阶段。

没有编程专业知识,你就没有成功立足的机会。如果说有什么不同的话,那就是在未来的几年里,深度技术方面将比以往任何时候都更加相关。这使得编程成为 2020 年要学习的核心数据科学技能的核心。

数据挖掘

数据挖掘的概念在商业和商业活动领域越来越受欢迎。然而,这是数据科学中被完全误解或误解的主题领域之一。数据挖掘不是数据建模、抢劫、分析或争论等。

数据挖掘是从正确的来源中选择正确数据的过程。然后采用正确的技术,如数据回归、分类、异常值或聚类分析,来帮助理解数据集以构建适当的模型。经验丰富的数据科学家或其他人花费 80%的时间处理不同的数据类型,以便能够创建分析模型并获得有价值的洞察力。

我们正在经历一个信息和数据密集型的时代。从基本任务到重要任务,每天都会产生越来越多的数据。例如,你去杂货店刷卡。刷卡启动了数据下载到数据库。在过去的两年中,我们看到了大量的数据,预计到 2020 年年底,数据量将达到 440 万亿字节。

如今,企业比以往任何时候都更需要存储、处理和分析数据,而且这一趋势还将继续。无论是在商业领域、医疗保健、娱乐、金融和银行、R&D、安全等领域,数据挖掘都是世界上所有这些庞大数据不可或缺的关键。您指定一个行业,我们将为您提供其数据驱动的物流。如今,出于各种目的,一切事物都需要战略和可操作的信息。这在没有标准的数据挖掘过程和专家的情况下是不可能的。

机器学习

在我们周围所有的技术变革中,我们是受影响最大的一代。与其他每个方面一样,我们作为一个全球社会,正生活在人工智能(AI)和机器学习(ML)的时代。很多人把人工智能和人工智能混淆为一个单独的领域,虽然它们有相似之处,但每个学科领域都致力于不同的专业知识。机器学习是一项迷人的研究,它训练机器进行自动学习和自我改进,以执行它没有被编程来执行的任务。简而言之,这就是人工智能的应用,在指定的时间内训练机器,并在一定的资源内可靠地执行,人工智能和其他认知技术在这个过程中被大量同化。

所有可用的以及即将到来的数据都需要通过不同的技术进行结构化,如特征选择和建模,以输入到机器中进行自动信息提取。机器学习的主要目的是帮助自动分析大量数据以获得关键见解。ML 是今天和我们走向的自动化之间的支点。它在未来几年的相关性至关重要。为了在数据科学革命中占有一席之地,这是你在 2020 年需要掌握的首批技能之一。

深度学习

深度学习——通常也被称为深度神经学习或深度神经网络——是人工智能应用中机器学习的子类。作为一个子类,深度学习有自己的操作形式、目的和技术。深度学习和机器学习之间的一个主要区别在于输入给机器的输入数据。它使用几个层次从原始数据输入中逐步识别、记忆和提取高度优化的信息。

机器学习可以基于包括文本、图像、音频或视频在内的任何形式的数据进行准确预测,与之相反,深度学习使用神经网络模型。这些模型通过权重接收输入以处理隐藏层中的数据,这些权重在给出所需的预测(输出)之前在计算机系统的训练期间被同步。

深度学习不像机器学习,不需要结构化数据。它有能力从非结构化和未标记的数据中学习,因为它是受人脑结构的启发。

如今,有几种深度学习架构,例如:

深度神经网络

深度信念网络

递归神经网络

卷积神经网络

这些结构已经成功地应用于众多领域,带来了令人震惊的结果,在某些特定情况下甚至超过了人类专家的表现。一些深度学习密集型领域包括:

计算机视觉

语音识别

自然语言处理

社交网络过滤

机器翻译

生物信息学—药物设计

医学图像分析

材料检验

深度学习需要更多的时间和资源来训练机器,这转化为更高的计算成本,因为它需要图形处理单元 (GPU)而不是我们常规的中央处理器(CPU)。

深度学习的范围在医学领域日益扩大,例如,神经网络正在成功检测癌细胞,并以 100%的准确性和细节分析 MRI 图像。技术是利用深度学习知识的另一个领域,例如,自动驾驶汽车现在已经成为现实。看看苹果、特斯拉和日产,它们正在迅速雇用深度学习专家,将可靠的自动驾驶汽车的梦想转化为现实。

以下是提高深度学习职业所需的一些最需要的技能:

Python、C++、R 等编程语言的实践经验

统计概念

机器学习算法

数据评估和建模技术

分布式计算

商业智能

商业智能(BI)基本上是数据分析的一个细分,它采用一套预先确定的流程、技术和战略架构,以便将原始数据转化为可操作的商业智能(信息)。 BI 采用逆向方法,通过分析过去的数据来解决当前的问题。虽然,这种方法提供了包含事实统计的战术报告,但是它们不能预测未来的事件。这就是商业智能和数据科学之间的区别。在数据科学中,你应该使用先进的方法来预测未来的结果,以做出有利可图的商业决策。

数据科学中的商业智能通过结合商业分析、数据挖掘、数据可视化、输入/输出界限工具和数据基础设施来增强企业的决策能力。集成到数据科学方法中的 BI 是通过专业工具报告和交流结果的更快方式,例如:

SAP 商业智能

Oracle BI

Microsoft Power BI

SAS 商业智能

说到底,以上提到的所有领域以及更多领域,本质上都是商业。没有出色的商业智能,你不可能成为任何特定组织的杰出数据科学家。BI 从根本上来说是将所有其他技能连接在一起的轴心。

因此,如果你想在商业智能领域出类拔萃,你必须掌握以下几项技能:

有数据分析工具和 SQL 编程的经验

数据仓库概念

解决问题的技巧

领域知识

结论

此时此刻,事实是,数据科学将继续存在并改变我们今天所知的世界。来自最可信的分析师和全球经济学家的大量类似预测和观察得出结论,未来由数据科学主导。除了成为批判性思考者和对数据充满热情的全面人才,你还需要一些严肃的技能。

所有上述主题领域共同构成了你应该学习的技能的正确组合。对所有这些的基本理解肯定会让你有一个足够好的开始,但是学习应该是一个持续的过程,你不应该停留在基本的专业水平上。

CoronAI:新冠肺炎相关文章的深度信息抽取

原文:https://towardsdatascience.com/coronai-deep-information-extraction-for-covid-19-related-articles-f7c016149586?source=collection_archive---------24-----------------------

https://alachuacounty.us/的好意,新冠肺炎

一种挖掘 CORD-19 冠状病毒文章数据集的无监督方法

介绍

我们的世界目睹了许多病毒和疫情,但就全球影响而言,它们中没有太多能与新冠肺炎相比。尽管如此,我乐观地认为,加州的“在家更安全”和“社会距离”等措施有助于彻底根除这种病毒。我们因这一疾病失去了许多伟大的人,而它似乎不愿意让我们更容易阻止这一疾病。

为了响应白宫关于使用人工智能帮助新冠肺炎研究的行动呼吁,新冠肺炎公共数据集已经由 AllenAI,微软研究院,Chan-Zuckerberg Initiative,NIH 和白宫发布。该数据集包括约 44,000 篇研究文章,涵盖了与冠状病毒(如 SARS、MERS 等)相关的各种主题。)

由于数据集没有标签,因此其上定义的主要任务都是一般性的问题,如“我们有哪些关于疫苗接种的信息?”。也有根据主题组织论文的伟大作品,如

在这篇文章中,我们将介绍一个小工具,它可以利用自然语言处理对这些文章中的主题进行无监督聚类,这样我们就可以更好地了解这些文章中发生了什么。

文本片段:该数据集的原子

每个文档都由不同的部分组成,而部分标题就在我们发布的数据集中。在每篇文章中的单词之前,保留语义的最小实体是文本片段和句子。在本帖中,展示了如何在一个桶中使用这些来帮助对这些文章中的焦点进行无监督聚类。随后,给定不同的部分和部分间或纸张间的亲和力(甚至可能使用图形卷积网络、图形注意力网络等)。)或下面提到的主题组织工作,可以应用更好的聚类技术来获得更好的结果。

我们使用自然语言处理工具包的句子标记器将每篇文章分解成这些原子片段,然后为它们生成最先进的表示,以便在我们管道的后期阶段使用。

文本表示:一种基于 BERT 的方法

使用我们的 word_embedding_warehouse 您可以轻松地获取和处理基于 BERT 的预训练表示权重,以便在 PyTorch 或 Tensorflow 中使用(文档可在这里获得)。其中的代码易于阅读,应该简单易懂。

要使用它,请使用以下方式从 github 获得该软件包:

git clone [https://github.com/shayanfazeli/word_embedding_warehouse.git](https://github.com/shayanfazeli/word_embedding_warehouse.git)

然后重定向到它的存储库并安装它:

python3 setup.py install

现在您可以运行它并获取数据。确保选择一个有大量未使用空间的文件夹,并运行以下命令:

build_word_embedding_warehouse --warehouse_folder=.../path_to_your_folder --clear_cache=0

将在其中创建表示。需要注意的一点是,注意配置中的“dropout”值,您可能需要手动将它们设置为零。

预处理、数据准备和生成表示

我们的 CoronAI 包及其应用程序可用于生成表示。目前,我只使用了大版本的 NCBI-伯特(现在在这里改名为蓝铃)来生成表示。这些权重在 PubMed archive 和 MIMIC-III 公共电子健康记录库中进行了微调,因此,假设该模型能够很好地处理医疗领域的问题是合理的。

这些权重是按照上一节中的描述生成的。现在,使用以下命令获取 CoronAI 包:

git clone [https://github.com/shayanfazeli/coronai.git](https://github.com/shayanfazeli/coronai.git)

然后继续并重定向到其文件夹,并安装软件包:

python3 setup.py install

这个库的不同部分的文档可以在这个链接中找到。

此时,您可以使用应用程序来生成制图表达并执行无监督聚类。

生成基于 BERT 的表示

您可以使用以下命令生成基于 BERT 的表示(有关更多信息,请访问用于 coronai 的github)。

*coronai_segment2vector* --gpu=2 \
--input_csv=.../text_segment_dataset.csv \
--output_pkl=.../output.pkl \
--path_to_bert_weights=.../NCBI_BERT_pubmed_mimic_uncased_L-24_H-1024_A-16 \
--batch_size=25

请注意,对于“NCBI _ BERT _ PubMed _ mimic _ un cased _ l”表示,您可以从 CoronAI 的共享驱动器下载它们(本文底部的链接)。

无监督片段组发现

为此,可以使用另一个 CoronAI 应用程序。这一部分的动机是,在这个数据集上设计的当前任务是通用任务,例如“我们对它的疫苗接种了解多少?”。但是,使用这种方法,我们可以更好地了解这个数据集中实际包含了什么。我们可以从少量集群开始,然后增加集群数量,并寻找进入稳定状态的起点。

聚类数量对基于距离的损失的影响

组:解释

作为解释组的例子,对于 296 个集群的情况,为每个集群创建单词 cloud。然后,我请我的一个行医的朋友来看看它们。下面是一个样本聚类的表示和一个可能的解释:

集群 35:该示例显示该组的语义主要围绕疫苗接种的概念

本页中的提供了更多示例。

科罗纳伊的共享驱动器

请点击查看

附:代码和这篇文章将随着时间的推移而被编辑,因为它们都是以一种仓促的方式写成的。任何贡献也是受欢迎的。谢谢你。

参考

[1] Gardner,Matt 等,“Allennlp:一个深度语义的自然语言处理平台。” arXiv 预印本 arXiv:1803.07640 (2018)。

[2] Lee,Jinhyuk,等,“BioBERT:一个用于生物医学文本挖掘的预训练生物医学语言表示模型。”生物信息学36.4(2020):1234–1240。

[3]彭,王一凡,,严,."生物医学自然语言处理中的迁移学习:在十个基准数据集上对 BERT 和 ELMo 的评估." arXiv 预印本 arXiv:1906.05474 (2019)。

[4]新冠肺炎开放研究数据集与挑战:https://www . ka ggle . com/Allen-institute-for-ai/CORD-19-Research-Challenge/kernels(2020)。

恐惧、焦虑还是信任?印度对日冕危机有什么看法?

原文:https://towardsdatascience.com/coronasentiment-india-61a03d0b0fff?source=collection_archive---------33-----------------------

阿明·莫什菲在 Unsplash 上的照片

对 2020 年 4 月 5 日至 4 月 15 日超过 150,000 条推文的情绪和情感分析

对我们所有人来说,这绝对是一个不确定的时期。我们不确定如何理解我们面临的宏观或微观经济因素。在个人层面上,人们正在处理许多问题,如裁员、减薪、停工和感染风险(特别是对那些在此期间从事医疗和其他基本服务的人,谢谢!).

与此同时,我们不禁要思考宏观因素,如政府平曲线的措施、股市的复苏(见图 1)以及最糟糕的是,在不久的将来是否会出现任何后续衰退。

图 1:描绘 2020 年 3 月股票价格和交易量下降的烛台;来源:Srinivas Vadrevu 使用雅虎财经数据进行分析

最近,有很多关于事件将如何在印度展开的预测和场景。在大多数预测和情景中,一个重要的共同点是锁定期间和锁定后的消费者情绪。虽然这些报告大多依赖于对个人特定消费选择的调查,但我想通过利用现有的最好的社交媒体平台之一——Twitter来形成对印度情绪脉动的观点

“发生什么事了?”

照片由🇨🇭·克劳迪奥·施瓦茨| @purzlbaumUnsplash 上拍摄

当我登录 Twitter 时,我看到了一个文本框,提示我“发生了什么事情”。体会到这种讽刺,我心想..

“这正是我想知道的……Twitter 上发生了什么”?

数百万印度人每天都在推特上向世界表达自己。不仅仅是个人,组织、媒体公司、政府部门和名人都在使用 Twitter 向世界表达他们的观点。只有 280 个字符,我们试图明智地使用它们来表达我们想要的。因此,来自用户的推文将清晰、准确、具体地描述他们的感受和想法。这就是我写这篇文章的动机……建立一个与 COVID 和印度相关的推特的大数据集,以了解当前的时代精神。

有什么办法?

就在我用 NLP 写了第一篇探索网飞 的 内容策略的文章之后,我决定应用另一种 NLP 技术——情绪分析来绘制当前的情绪以及最近几天它在印度是如何演变的。正如你已经猜到的那样,整个练习的繁琐部分是收集数据——它涉及到在 Twitter 开发者平台上创建一个应用程序,以请求必要的 API 令牌和提取推文的权限。使用这些 API,从 2020 年 4 月 5 日到 2020 年 4 月 15 日的过去 11 天里,我每天提取 20,000 条推文。我的搜索主要围绕两个关键词“Covid”和“India”。

在过去 11 天下载了 22 万条推文后,我删除了所有独立的转发,以避免重复计算,只使用原创推文。我剩下 35311 条原创推文,包含大约 50 万字。每条原始推文都有相应的转发总数。截至 2020 年 4 月 15 日,这 35311 条原始推文有 152756 次转发。我将分析分为两类:a)基于人们发布的内容(仅基于原始推文), b)印度普遍的整体情绪(考虑原始推文的相应转发量)。我想知道的第一件事是我们所有人在脸书上发布推文或状态后检查的同一件事…

乔治·帕甘三世在 Unsplash 上的照片

我的一条推文获得了多少转发(在数据集中)?

在删除独立的转发后,我绘制了下面的分布图,显示了原始推文及其在数据集中相应的转发数。

在过去的 11 天里,平均每条原创推文被转发 4 次。

4 月 7 日和 8 日的转发率最高——平均每个原创帖子被转发 7 次。

图 2:从 4 月 5 日到 4 月 15 日,每天的 Tweets 和 Retweet 比率分布;资料来源:Srinivas Vadrevu 的分析

在样本中,4 月 13 日的原始推文数量最高,但过去 10 天的转发率最低。4 月 13 日,与其他日子相比,人们似乎忙着发更多的帖子,转推更少。其中相当多的推文是关于猜测 14 日上午 10:00 的封锁公告。以下是 2020 年 4 月 13 日推特上的几个例子。

“据推测,该中心可能会延长计划于 4 月 14 日结束的#一级防范措施”

“@…PM 对抗#COVID2019 的下一步会是什么?”

A .追踪印度情绪的指数?

现在让我们看看人们输入的文本内容,以创建一个衡量整体情绪的指数。本着按照“ Volfefe index ”的思路创造东西的精神,我使用了包含 2477 个单词的 AFINN 词典,每个单词的情感分数在-5 到+5 的范围内。例如,“糟糕”和“糟糕”等词的得分为-3,而“有效”和“有动机”等词的得分为+2。

使用推文的文本提取单词作为标记,并从数据中清除 https 链接,我计算了情感得分的总和,以得出“OP-perspective-score”。 OP 是 Reddit 上常用的一个术语,用来指代原海报。它测量发布这些推文的人的情绪。

为了考虑 Twitter 上的整体情绪,我用(1+转发数)*对原始推文中的每个观察进行了加权。我用相应的转发计数和原始帖子本身对 OP-perspective-score 进行加权,以计算“流行情绪得分”。后者指示总体情绪,因为它测量该情绪被所有其他用户转发的程度。

图 3: OP 情绪指数和流行情绪指数;资料来源:Srinivas Vadrevu 的分析

从图 3 中的情感得分得到的有趣发现:

  • 平均来说,发微博的人每天都有积极的观点/情绪。 从 4 月 5 日到 4 月 15 日,平均 OP 情绪指数每天为正。
  • 当我用转发数来衡量时,除了 4 月 8 日和 4 月 10 日,普遍情绪变成了负面。
  • 虽然发布推文的人每天都有积极的观点/情绪,但数据表明 twitter 受众转发消极情绪推文的次数远远多于转发积极情绪推文的次数。

如果我们将 Twitter 视为一个交流情绪的市场,在过去 10 天里,市场似乎对负面情绪的回报多于正面情绪

  • 在过去的三天里,13 日至 15 日,OP 情绪指数和流行情绪指数都向 0(中性情绪)靠拢。积极和消极的情绪相互抵消,导致“推特市场”的情绪几乎是中性的。

B .印度围绕科维德的情绪暗流

如果你想知道将复杂的人类情感转换成单一的价值观是否过于简单化,那么我同意你的观点。所以我想用一个词库,把这些情绪解构为情感,看看情感每天是如何变化的。我下载了 NRC(加拿大国家研究委员会)的词典,里面有 13,901 个单词情感和单词情感关联。数据集中的情绪有恐惧、愤怒、信任、悲伤、厌恶、期待、喜悦和惊喜。一个词可以有多种情感联想。

我从 35311 条原始推文中提取了单词,并将单词-情绪关联和情绪(积极或消极)关联映射到这些推文中的每个单词。类似于指数方法,我绘制了所有原始推文的情绪,以获得 OP-情绪暗流,并通过其相应的转发计数进行加权,以获得印度流行的情绪暗流。

腾雅特Unsplash 上拍照

OP 情绪暗流

那么,在过去的 11 天里,发布这些推文的人在想些什么呢?将一种情绪在一天中所有推文中重复的次数加起来,我得出了这一天的情绪得分。下图描绘了过去 11 天所有帖子的各种情绪得分。

图 4:对发布的推文中的情绪计数- -[OP]情绪得分;资料来源:Srinivas Vadrevu 的分析

根据在推特上发布的常见情绪,出现了以下模式:信任>恐惧>期待>愤怒>悲伤>快乐>惊讶>厌恶(按降序排列)

  • 信任是从 4 月 5 日到 4 月 15 日发布推文的人最常见的情绪。但是,恐惧紧随其后。
  • 期待是排在愤怒和悲伤之后的第三种常见情绪。
  • 正如所料,快乐、惊讶和厌恶等情绪是发布推文的人最少出现的情绪
  • 在过去的 11 天里,上面的层叠顺序每天变化不大。

印度盛行的情感暗流

图 5:发布的推文中情感的加权计数- -(普遍的)情感分数;资料来源:Srinivas Vadrevu 的分析

在用 retweet count 衡量了情绪的数量之后,我计算了所有情绪的加权情绪分数。

  • 从 4 月 5 日到 4 月 7 日,恐惧和信任正在紧密地移动。从 4 月 7 日开始,包含信任词的推文被转发的次数比包含恐惧词的推文多了近 3 倍。从 4 月 5 日到 11 日,信任是最普遍的情绪。
  • 在 4 月 7 日至 4 月 11 日期间,愤怒成为了排在恐惧之后的第二大流行情绪。
  • 从 4 月 11 日到 4 月 15 日,恐惧和信任紧紧相随
  • 从 4 月 11 日到 4 月 15 日,期待是波动的,但是保持在前三种情绪中

我在附录中附上了基于 NRC 词典的 OP 和流行推文的情感和情绪得分。有兴趣的可以最后去看看。

与其他情绪——愤怒、悲伤、厌恶、快乐和惊讶——相比,与信任、恐惧和期待(按此顺序)相关的词在帖子和相应的转发中更常见

什么主题可能会导致这些情绪?

我绘制了以常用词为节点的二元模型网络图,通过将二元模型分类为几个主题来识别顶部主题。这类似于我在的上一篇文章中使用的方法。

发布的推文中有哪些热门主题?【OP】

图 5:tweet 文本中二元模型的网络可视化(n > 100)-[OP]主题;资料来源:Srinivas Vadrevu 的分析

  • 政府办公室(黄色泡泡) - 总理纳伦德拉·莫迪,印度项目管理办公室,印度健康维护组织,印度公共卫生委员会,印度政府,人力资源开发部,卫生部,最高法院,印度信息和广播部,印度公共卫生委员会,印度公共卫生委员会。
  • 政府措施(透明气泡)-行动“政府指定 10 万张医院病床”, Aarogya setu app、Namo app、PM cares
  • COVID 数字(蓝色气泡)-检测呈阳性的病例数、死亡人数、确诊病例、报告病例、疫情、死亡人数上升、总数
  • 张贴的其他突出主题是:Tablighi Jamaat 问题,印度侨民

有哪些被转发较多的热门主题? 【T21 盛行】

在这个网络图中,我用转发数来衡量二元模型的数量,以确定排名靠前的二元模型。

图 6:发布的推文文本中二元模型的网络可视化**(加权计数> 1000)-[OP]主题;资料来源:Srinivas Vadrevu 的分析

  • 政府干预(黄色泡泡)- 卫生部,当局,官员,IAS,总理纳伦德拉·莫迪。
  • 医疗机构和护理(透明泡泡)医学科学护理人员电晕战士又一家医院
  • COVID numbers (蓝色气泡)——检测阳性病例数、死亡人数、确诊病例、报告病例、疫情、死亡人数上升、总人数、检测相关人员、Covid 19 检测、疟疾药物
  • 正面底色(灰色气泡)——可观精彩,良好姿态,以色列大使馆灯火通明,齐心协力,示支持
  • 发布的其他突出主题有:T ablighi Jamaat 活动、北美查蒂斯格尔邦、Ola Cabs、IIM 研究……

结论

(1)当人们发布积极情绪的推文时,twitter 用户似乎更喜欢消极情绪,而不是积极情绪,将整体极性逆转为消极情绪。

(2)将情感分析与 bigrams 网络叠加,看起来最近 11 天发布和转发的推文主要反映了对政府和医疗机构的信任感。但是,对 COVID 和未来的恐惧和期待也很常见。

图 7:电晕病毒危机期间麦肯锡-印度消费者情绪;来源:https://www . McKinsey . com/business-functions/marketing-and-sales/our-insights/survey-Indian-consumer-sensition-in-the-coronavirus-crisis

作为发布推文或观点的个人,即使在这种可怕的情况下,我们每个人似乎都有积极的前景。麦肯锡关于冠状病毒危机期间消费者情绪的报告也表明,当被问及对经济状况的信心水平时,大多数(56%)受访成员对经济复苏持乐观态度。

如果我们发布积极的推文,并在被单独询问时报告对经济前景的乐观看法,那么为什么我们转发负面情绪的推文比积极的推文多得多?我只能猜测,带有负面情绪的推文更容易引起我们的注意,并在我们内心引起回应(转发)。

从我的观察来看,虽然我们面临着对冠状病毒和未来的恐惧和预期,但对印度政府解决冠状病毒危机的信任取代了所有这些恐惧和预期情绪。在这一点上,我希望同样程度的信任超越了对危机后经济复苏的乐观和信心。

来源和附录

  • (1)普通单词和短语引发的情感:使用机械土耳其人创建情感词典,赛义夫·穆罕默德和彼得·特尼,在NAACL-HLT 2010 年关于文本情感分析和生成的计算方法研讨会上,2010 年 6 月,加利福尼亚州洛杉矶
  • 发现下面的文章对文本挖掘和情感分析很有用。

https://www.datacamp.com/commu

[## 如何高效地对 Twitter 中的流行语进行网络分析?

数据收集、预处理、分析、可视化和交互的一站式解决方案。

towardsdatascience.com](/how-to-perform-a-network-analysis-for-buzzwords-in-twitter-efficiently-ebf8e139037d) [## NBA 领先球员推特账户的情感分析——第一部分数据收集

NBA 领先球员的推特和他们的表现有相关性吗?

towardsdatascience.com](/do-tweets-from-nba-leading-players-have-correlations-with-their-performance-7358c79aa216) [## 在 r 中为文本挖掘设置 Twitter。

关注 Twitter 作为数据挖掘的热点。

towardsdatascience.com](/setting-up-twitter-for-text-mining-in-r-bcfc5ba910f4)

图 8:2020 年 4 月 5 日至 4 月 15 日之间发布的推文中的情绪和情感计数- -[OP]情绪得分;资料来源:Srinivas Vadrevu 的分析

图 9:2020 年 4 月 5 日至 4 月 15 日之间发布的推文中情感和情绪的加权计数- -[OP]情感得分;资料来源:Srinivas Vadrevu 的分析

免责声明 : 本文中表达的所有观点均为 Srinivas Vadrevu(以下简称“作者”)的观点,不代表作者曾经、现在或将来隶属的任何实体的观点。以上所有观点都不是统计推断,而是作者根据自己的观察得出的观点。本文作者对本文内容中的任何错误或遗漏不承担任何责任或义务。你不应该依靠这篇文章来作出任何商业、法律、投资或任何其他决定。虽然作者试图保持文章中的信息准确,但作者不对本文中包含的图形、图表和数据的完整性、准确性、可靠性、适用性或可用性做出任何形式的明示或暗示的陈述或保证。作者没有任何义务更新本文的内容,并否认与本文相关的任何责任。

冠状病毒:来自韩国的大数据教训

原文:https://towardsdatascience.com/coronavirus-a-big-data-lesson-from-south-korea-5bb703b8b0ae?source=collection_archive---------24-----------------------

南韩如何用数据和人工智能对抗冠状病毒(新冠肺炎)

图片由皮克斯拜的 Gerd Altmann 提供

大多数国家仍然受到严格的检疫限制,而其他国家正在开放经济,回归正常生活。冠状病毒的影响因国家而异。一些国家正面临严峻的挑战,努力控制疫情。尽管如此,像韩国、新加坡和台湾这样的国家几乎能够立即对形势做出反应,并更快地恢复过来。

早在 2020 年 2 月,韩国报告了世界上最高的冠状病毒日传播率之一。除了 Mainland China,受感染的人数是最高的,天气预报预测了一切,但都是最坏的情况。

自己可视化,数据来源:约翰·霍普斯金大学

但正如图表所示,曲线开始变平的速度比最初预期的要快得多,这种情况得以维持。韩国怎么可能如此迅速有效地对此案做出反应?

吸取的教训

韩国已经面临类似的情况,但规模要小得多。2015 年,一名从中东地区返回首尔的韩国游客携带了一种被称为 MERS-CoV 的传染病,也是由冠状病毒引起的。由于病毒在该国的新颖性,直到疾病被正确诊断需要几天时间。在病毒被确认的时候,它已经被进一步传播,并且似乎几乎不可能追踪谁被感染。这种感染导致韩国出现 186 例 MERS-CoV 病例,并导致 16993 名韩国人被隔离 14 天,经济损失达 85 亿美元。除了沙特阿拉伯,韩国是全球感染人数最多的国家:

自己可视化,数据来源:世界卫生组织

尽管这种病毒出现得相当出人意料,但它的进一步发展被相对较快地阻止了。人们的快速测试和各种先进技术、数据分析和人口信息的使用已被证明是切实可行的措施。

31 号病人与韩国冠状病毒的传播

韩国首例病毒病例于 1 月 20 日确诊。一名来自中国武汉的受感染女士被隔离,官员们设法控制住了局势。“31 号病人”改变了一切。在测试呈阳性之前,患者 31 发生了一次小事故,在医院检查了两次,并在教堂参加了一次服务。她与数百人有过接触,并成功地将病毒传染给了其中许多人。自那以后,南韩在几天的时间里确认了数千例病毒病例,并且数字急剧增长,这次爆发是 Mainland China 以外最大的一次。

借助大数据、人工智能和智能技术,在 20 天内拉平曲线

韩国在防止病毒进一步传播方面做得很好,原因有几个。从 MERC 的经验中,他们能够应用有效的措施,例如:

  • 智能联系人跟踪
  • 积极的测试和诊断
  • 远距离医学
  • ICT 和智能技术

智能联系人跟踪

合同追踪是一个很好的例子,说明了如何让大数据大规模发挥作用,并带来可操作的见解。

图片来自 Pixabay (CC0)

当我们回到关于我们 31 号病人的故事时,官员们能够跟踪她的活动,她接触过的人,并警告每个可能处于危险中的人。

联系人追踪应用程序基于不同种类的数据:

  • 地理空间的
  • 时间序列
  • 图像和视频
  • 处理
  • 其他人

关于位置的信息可能通过几个来源被跟踪:来自智能设备的 GPS 数据、信用卡交易或其他。一旦合并,一个确诊患者的运动的全面图片被公开共享。该应用程序提供了个人访问的历史、时间线和地点的信息。餐馆和酒店的访问,他们使用的交通工具,他们乘坐的线路或公共汽车号码,甚至电影院的确切座位都被跟踪。在监测和分析病毒传播时,闭路电视摄像机也被广泛使用。韩国每天有超过 110 万个可运行的闭路电视摄像头。根据 2010 年的统计数据,每个市民平均每天被公共闭路电视系统捕捉 83.1 次,并且这一趋势逐年增长。

智能联系人追踪可缩短有关部门的反应时间,以识别潜在威胁、隔离病毒的传播源并通知所有可能处于危险中的人员。这个公共应用程序还会告诉每位用户,确诊患者去过哪些地区,哪些地方被隔离,以及谁可能受到影响。该系统还能追踪病毒的活动,帮助医院和诊所更好地准备应对下一波病毒。

基于人工智能的测试套件开发和诊断

MERC 的经历给韩国上了另一课——“激进的测试”。在超级发射机事件大规模传播之前,只有 30 例确诊病例,而中国为 75,000 例。尽管数量少,韩国开始与生物科技公司合作开发冠状病毒的测试。他们几乎立即开发出了测试套件,并分发给全国每一家医院。韩国并不像其他国家那样面临测试数量不足的问题。多亏了谨慎的人工智能规划和利用,他们才得以以超快的速度来拉平曲线。

“如果没有人工智能,在如此短的时间内开发一个测试是不可能的,”成均馆大学交互科学系教授钟泰明(Tai-myong Chung)说。

测试套件的设计是使用人工智能开发的。人工智能帮助缩短了设计和构建测试包所需的时间。病毒的基因组成通常需要 2-3 个月。这家名为 Seegene 的公司凭借自动化和人工智能,在不到三周的时间里就完成了测试开发。基于人工智能的大数据解决方案使科学家能够快速了解冠状病毒的遗传组成。

疾病预防控制中心Unsplash 上拍摄

此外,人工智能允许个人健康专家准确快速地筛选和诊断患者。人工智能的主要应用是对大规模的胸部 x 光数据进行处理,以便在几秒钟内识别冠状病毒的症状,并在危急状态下给予患者治疗。人工智能用于将患者分为四类:轻度、中度、重度和非常重度

远距离医学

除了基于人工智能的解决方案,还有远程医疗,支持社交距离,并使患者能够与医疗保健人员保持联系。远程医疗以潜在或确诊的患者为目标,以监控冠状病毒的症状和进一步发展。

国家癌症研究所Unsplash 上拍摄的照片

整个检查是通过使用智能手机的视频通话建立的。所有症状都包含在数据库中,并建议患者采取下一步措施。该解决方案使专业人员能够实时检查确诊患者的症状,并将需要医疗援助的患者转移到最近的医院。

信息共享应用

整个韩国系统对抗冠状病毒的其他关键部分是移动应用程序。有很多是在几天内开发出来的。主要目的是从不同角度让公众了解冠状病毒。他们中的一些人正在提供关于症状的一般信息。其他人会让你知道有口罩的地方或者最近的检测地点。也有人工智能应用程序使用聊天机器人给需要医疗护理的人打电话。

韩国是人工智能和大数据如何应用于社会公益的一个很好的例子——缩短反应时间,提高准确性,并在全国部署解决方案。许多事情需要解决。隐私、数据安全和信息共享不能放在一边。得益于该国透明一致的政府、文化、集体努力、技术成熟和渴望创新,韩国在面对这些挑战时成功克服了潜在风险。

在 LinkedIn 上关注我:

[## Filip Dzuroska -数据科学家- Erste Group IT | LinkedIn

在世界上最大的职业社区 LinkedIn 上查看 Filip Dzuroska 的个人资料。菲利普有一份工作列在他们的…

www.linkedin.com](https://www.linkedin.com/in/filipdzuroska/)

文章来源:

[## 韩国利用大数据和人工智能赢得了与冠状病毒的斗争

南韩依靠其技术优势对抗新型冠状病毒(新冠肺炎)。这个国家有一个…

www.thedailystar.net](https://www.thedailystar.net/online/news/south-korea-winning-the-fight-against-coronavirus-using-big-data-and-ai-1880737) [## 各国如何利用科技对抗冠状病毒

新冠肺炎的快速传播迫使各国使出浑身解数来遏制疾病。一些…

economictimes.indiatimes.com](https://economictimes.indiatimes.com/tech/software/how-countries-are-using-technology-to-fight-coronavirus/articleshow/74867177.cms?from=mdr) [## 中东呼吸综合征:我们从 2015 年大韩民国疫情中吸取的教训

中东呼吸综合征冠状病毒(MERS-CoV)首次从一名严重肺炎患者身上分离出来

www.ncbi.nlm.nih.gov](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5840604/) [## 科西斯

编辑描述

kosis.kr](http://kosis.kr/statHtml/statHtml.do?orgId=127&tblId=DT_2014_82) [## 보도자료 | 국가인권위원회

编辑描述

www.humanrights.go.kr](https://www.humanrights.go.kr/site/program/board/basicboard/view?&boardtypeid=24&menuid=001004002001&boardid=600084) [## 冠状病毒:韩国成功控制疾病是因为它接受了监测

南韩因其对冠状病毒疾病新冠肺炎的爆发和传播的管理而受到广泛赞扬…

theconversation.com](https://theconversation.com/coronavirus-south-koreas-success-in-controlling-disease-is-due-to-its-acceptance-of-surveillance-134068) [## 禽流感与新冠肺炎冠状病毒的控制

本文档也可从以下网站获得:本出版物旨在提供来自……的文章的非详尽概述

www.coe.int](https://www.coe.int/en/web/artificial-intelligence/ai-and-control-of-covid-19-coronavirus) [## 新冠肺炎:韩国如何利用创新技术和人工智能来拉平曲线

据国际电联消息,大韩民国迄今为止在不关闭其经济的情况下成功地遏制了新冠肺炎…

news.itu.int](https://news.itu.int/covid-19-how-korea-is-using-innovative-technology-and-ai-to-flatten-the-curve/) [## Lunit 在线发布人工智能,支持医疗保健专业人员管理新冠肺炎

Lunit 是一家医疗人工智能软件公司,通过胸部 x 光图像开发人工智能肺部疾病分析,今天…

lunit.prezly.com](https://lunit.prezly.com/lunit-releases-its-ai-online-to-support-healthcare-professionals-manage-covid-19)

冠状病毒:真阳性的置信区间

原文:https://towardsdatascience.com/coronavirus-a-confidence-interval-for-true-positives-444962ea2348?source=collection_archive---------36-----------------------

现实世界中的数据科学

如何利用基础统计学创造新的数学来研究重要问题

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

冠状病毒数据极其杂乱。不同地区报告数据的方式并不一致。由于这个原因,以及其他原因,包括一周中的某一天的影响,很难推断出趋势。

此外,由于假阳性和假阴性的性质,阳性检测的数量并不能告诉我们有多少人检测到了病毒。

在这篇文章中,我将在给定四条信息的情况下,为阳性测试的真实数量建立一个置信区间。首先,我们需要真阳性率和假阳性率。这些是测试本身的属性。然后,我们需要给出测试总数以及阳性总数。这些给了我们关于被研究人群的信息。

敏感性和特异性

每当你上统计学入门课程时,关于贝耶定理的部分总是有下面的例子。如果你有一项测试,在你患病的 99%的时间里呈阳性,在你没有患病的 99%的时间里呈阴性,并且这种疾病只影响 1%的人口,那么阳性测试只意味着你有 50%的机会患病。

这是经典的“抓住你了!”moments intro stats 教师喜欢使用,起初可能会觉得不直观。然而,这真的很容易理解。因为健康的人是患病的人的 99 倍,即使假阳性率很低,它也会因为所有健康的人而膨胀 99 倍。因此,假阳性非常普遍。

我上面给出的 99%的数字被称为测试的灵敏度和特异性。测试的敏感性是测试识别测试者的能力:它是以“你有疾病”为条件的阳性测试的概率。检测的特异性是检测疾病何时不存在的能力。同样,它是以‘你没有这种病’为条件的否定概率。在上面的例子中,我描述的测试具有 99%的灵敏度和特异性。

对真实阳性率的估计

现在,我们的推导只涉及几件事。首先,我们使用全概率定律。然后,我们会用到随机变量方差的性质。让我们从全概率的标准定律开始。回想一下,阳性率(或检测结果为阳性的百分比)可以细分如下:

嗯,我们想解决 P(电晕),测试的人谁实际上有病毒的百分比。这样我们就得到了表达式

注意:阳性率是阳性测试与总测试的比率。我们知道这个数字。第二,真阳性率和假阳性率是凭借知道敏感度和特异度才知道的!因此,我们可以估计我们想要的数量。

现在,如果我们认为左边和右边的量是观察到的随机变量,那么右边的量是冠状病毒受试者比例的无偏估计量。这意味着,如果我们通过采样计算右边,平均来说,我们会得到正确的答案。我们得到的答案不是偏向一个方向或另一个方向。

为什么这三条信息要足够计算 P(日冕)?让我们用一点代数来进行逻辑思考。

如果假阳性率是 5%,真阳性率是 95%,那么阳性率,即两者的凸组合,必须在 5%和 95%之间。如果阳性率接近 95%,那么我们知道大多数被测试的人实际上都患有这种疾病。如果该比率接近 5%,那么我们知道大多数接受测试的人没有患病。确切地知道两者之间的阳性率有多远,可以告诉我们真阳性和假阳性的确切混合。

第二点你可能已经用敏锐的眼睛注意到了:这只有在真阳性和假阳性率不同时才有效!否则,这两个比率之间就没有“中间值”。如果敏感性和(1-特异性)是相同的,我们根本无法进行这种分析。稍后我们将展示更糟糕的情况:随着敏感度和(1-特异性)越来越接近,我们的置信区间的质量将会下降。(幸运的是,大多数测试的灵敏度和特异性接近于 1,因此灵敏度和 1-特异性彼此相差很远)。

敏感性和特异性重要吗?

这可能会令人惊讶。只要敏感度和特异度是不同的数字,我们就会得到与实际患病人数完全相同的估计值。也就是说,当从测试人群中估计患病人群的比例时,测试的准确性并不重要。让我们通过下面的例子来了解我的意思(这也将验证我们的方法给出了 P(Corona)的正确值)!)

在这两种情况下,为了便于讨论,我们假设我们测试了 1000 人,其中 300 人生病。让我们首先假设 95%的真阳性率和 5%的假阳性率。然后,我们预计在总共 320 次阳性测试中会有 285 次真阳性和 35 次假阳性。如果你用这个 32%来代替上面公式中的阳性率,我们得到

现在以 60%的真阳性率和 40%的假阳性率重复上述实验。从表面上看,这是一个非常糟糕的冠状病毒测试。我们预计在这个设置下,总共 460 次阳性测试中,会有 180 次真阳性和 280 次假阳性。如果您使用上面的相同公式,我们将再次看到我们计算 P(电晕)=0.3。在这种情况下,灵敏度和特异性并不重要!

那么,为什么进行准确的测试是可取的呢?我在上面得出的唯一结论是,对于整个人口,我们将计算相同比例的病人。不过,准确性对个人来说很重要。

如果你测试呈阳性,那么你实际患病的概率很大程度上取决于测试的准确性和疾病的流行程度。这就是我上面讲的经典的贝叶定理问题。敏感性和特异性低的测试对个体来说是不好的。

敏感性和特异性非常重要的第二个原因是,它们极大地影响了我们估计量的方差。记住:本文的目标是开发一种方法来生成实际生病人数的置信区间。为了做到这一点,我们首先需要一个无偏估计量,我们有。然而,第二,也是非常关键的:我们需要能够计算估计量的方差。

请记住,估计量的方差告诉我们,样本与样本之间,我们对待估计参数的猜测变化有多大。一个低方差、无偏的估计量将对所讨论的数量产生一致、准确的结果。(注意:这就是为什么在本科统计课上,我们要学习最小方差无偏估计量的概念。)

在下一节中,我们将开发特定估计量的方差,并展示它如何关键地依赖于灵敏度和 1-特异性之间的距离。

我们估计量的方差

这是我们需要记住更多介绍统计资料的地方。看看我们估计阳性率的公式,我们必须问自己:哪些东西是随机的(取决于观察到的数据),哪些是已知值(常数)。事实上,唯一依赖于观察数据的是参数“阳性率”。其他的是我们正在进行的测试的已知事实。因此,稍微改写一下,我们对 P(日冕)的估计是阳性率的缩放和移动版本。让粗体 X 表示我们的阳性率估计值,使用方差的基本性质,我们得到:

此外,阳性率是通过二项式过程估计的,所以我们知道它的方差!这是构建比例置信区间时使用的标准技术。在我们的估计量的方差中代入 P(Corona ),由下式给出:

这就是我们上述观察的理由:真阳性率和假阳性率越接近,这种差异就越大。事实上,如果真阳性率和假阳性率非常接近,那么我们的估计不会比说 P(日冕)在 0 和 1 之间更好!

然而,对于合理的敏感性和特异性测试,我们可以得出有意义的区间。

结论

让我们来看看截至撰写本文之日(2020 年 7 月 20 日晚上)来自佛罗里达州的数据。我将使用 95%和 99%的特异性和敏感性值重复这一部分。使用这个来源,我们看到佛罗里达州有 360,394 个阳性测试,阳性率为 11.8%。让我们计算出 95%的置信区间,以确定接受检测的佛罗里达人中实际患病的比例。首先,我们对比例的估计。

在我们有 95%的敏感性和特异性的情况下,我们估计 7.57%的被测试者实际上患有该疾病。在准确率为 99%的情况下,我们得到 11.03%的被测试者患有这种疾病。差别很大。

现在是差异。因为我们的样本量实际上很大,所以在 95%准确率的情况下,我们的方差是 4.21e-8。在准确度为 99%的情况下,方差为 3.55e-8。

假设这些测试是一个真正的佛罗里达随机样本(不!),那么使用高斯近似法,我们对患有该疾病的受试者比例的估计是 2.1e-4,或者大约是百分之二。这使得我们在 95%灵敏度和特异性的情况下,置信区间[7.53%,7.61%]。

在 99%的情况下,同样的计算告诉我们,被测试者的比例约为[10.99%,11.07%]。无论哪种情况,我们都得到一个很紧的区间!

当我们从百分比转到疾病总数时,间隔就扩大了一点。7.53%至 7.61%的范围代表了大约 24,000 例的差异。这是一个更大的数字和更大的影响。

为了使事情不那么具体,更直观,我画了一个给定阳性率的 P(日冕)估计图。对于这个实验,我假设测试了 100 人(总体而言,样本量更小,更合理),冠状病毒测试具有 95%的特异性和敏感性,我们构建了 95%的置信区间。结果如下:

对于给定的阳性检测率,估计患有冠状病毒的受试者的比例(包括假阳性!)显示的是 95%的置信区间。图片作者。

结论

我在这里的主要观点不一定只是“如何为医学测试设定置信区间”。相反,我想展示推导新数学的过程,以回答一个问题。一个好的数据科学家不应该只是记住数百个 Python 库的语法。一个优秀的数据科学家对基本原理有很好的理解,并且应该能够改变他们已经知道如何使用的技术,以适应您可能无法在堆栈交换上找到任何东西的情况。

特别是关于冠状病毒,主要观点是报告阳性检测率和新病例数量有多么重要。否则,你只讲述了故事的一半。

冠状病毒:数据科学家的观点

原文:https://towardsdatascience.com/coronavirus-a-data-scientists-perspective-e3ac1cbe8916?source=collection_archive---------50-----------------------

冠状病毒数据的分析和可视化

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

介绍

源于中国武汉的新型冠状病毒疫情已导致数千名中国公民感染,并已蔓延至全球 20 多个国家。虽然世界卫生组织宣布这种病毒为全球紧急情况可能有点令人担忧,但我作为数据科学家对围绕这种流行病的数据以及利用这些数据可能实现的目标感到好奇。这是几个月前我在自己的网站上写的一篇文章,是关于我对冠状病毒数据的分析。

冠状病毒数据

找到一个冠状病毒数据源并没有那么难。几个新闻来源每天更新他们的网站,提供新的感染病例数、发现地点和死亡人数。然而,这些数据源通常不是可下载的文件或以任何方式结构化。

但是,善良的老卡格尔又提供了。🙌🏻

数据集包括 2020 年 1 月 22 日至 2020 年 2 月 11 日期间来自 32 个国家的确诊病例记录。在我写这篇文章的时候,数据集只落后一天——所以它是最新的!

在我做任何事情之前,对于任何数据科学项目,首先我必须观察和预处理数据。

检查数据

因为这个数据集是 CSV 格式的,所以我可以使用 Pandas 将数据读入我的 Python 脚本。Pandas 是一个我已经广泛使用了一年的库,好家伙,它把我从我曾经使用的史诗列表中拯救了出来!所以一旦它被导入,我就可以把 CSV 读入熊猫数据帧,看看里面有什么。

那么,我们知道些什么?嗯,如果我们关注确诊病例列,我们可以使用df[*column_name*].sum()函数来统计病例总数。该死,确诊病例真多!如果我们考虑到数据还显示有 22,307 起收回,这意味着收回率为 5.97%。

如果我们根据国家列对行进行分组,并对确诊病例的数量进行求和,我们就可以对输出进行排序。这表明,与任何其他国家相比,中国确实有大量确诊病例。这可能是一个显而易见的观察,因为我们从新闻来源知道它起源于中国。但是,值得查数据!

我们可以应用完全相同的代码来观察每个国家或省有多少人死亡和多少人康复。如果我们按省/州列分组,【湖北】【武汉】省记录的确诊病例数最高。同样,一个直观的观察,但值得检查。

数据预处理

仅仅通过快速浏览数据,似乎不需要极端的预处理。但是我注意到了三件事,这三件事引起了我的强迫症,在我开始着手做任何事情之前,可能需要解决这三件事,它们是:

国家栏中,报告了‘中国’‘Mainland China’,而它们应该是‘中国’‘Mainland China’

检查日期列的数据类型是否为日期时间,因为这样更容易处理。

已确认,死亡,已恢复列数据类型需要是整数,而不是浮点数。

首先,让我们把所有出现的【Mainland China】改成【中国】。我们可以通过检查国家列中所有唯一国家列表的长度来检查这是否成功。

现在来检查日期列的数据类型。我们可以使用 Pandas 的.info()函数来查看数据帧中所有列的数据类型。数据类型表明日期列是一个对象数据类型。为了方便起见,我将把它的数据类型改为日期时间。然后,我可以分别使用df['Date'].dt.timedf['Date'].dt.date来访问日期本身的日期或时间元素。让我们这样做吧——我将用 Date 元素替换 Date 列,方法是将该列重命名为它本身。

.info()结果也确认了已确认、死亡已恢复数据类型为浮点。理想情况下,你会希望这些是整数,因为你不能有一个小数人数。因此,类似于日期列,我们将更改这些数据类型。

太好了—数据现在可以使用了。在这个阶段,有些人还会使用del df[*column_name*]删除他们不需要的列。我不会删除这里的任何列,因为我可以只选择那些适用于我将要做的事情的列。实际上,我建议不要删除列,只是因为您可能最终会需要它们,并且不得不检查您的代码来找到您要删除的位置,这听起来像是一个不必要的任务——所以总是选择列,不要删除它们。💡

数据可视化

考虑到数据包括位置,显然首先要做的是使用地图可视化。我只使用 Python 通过 Matplotlib 或 Seaborn 创建过热图或条形图。由于缺乏文档,我过去一直推迟用 Python 创建地图,所以我最初使用这种类型的可视化会像 Tableau 一样。但这一次,我决定重新拾起它,看看我是否有耐心把事情搞清楚!

首先,让我们决定我们想要观想什么。鉴于数据集报告称,中国以外几乎没有死亡或康复病例,全球确诊病例的数量很少。在这种情况下,我可以使用我最初观察到的df_country,其中我根据国家列对行进行了分组,并对确诊病例的数量进行了求和。

有几个 Python 库支持创建地图。在这里,我将使用叶创建一个气泡图。对于那些不知道气泡图是什么的人来说,它是一系列圆圈,其大小代表一个区域中的一个数值。或者在这种情况下,全球不同国家报告了多少冠状病毒确诊病例。为此,叶需要标记气泡的坐标。为了找到这个数据集中的国家的纬度和经度,我很快搜索了 web,找到了一个 JSON 坐标文件,打开这个文件,遍历我的数据帧,将这些国家与它们的坐标匹配起来。

如果我照现在的样子绘制数据,气泡的半径会太大而无法进行任何形式的观察。因此,我们需要将其正常化或以某种方式处理它。在这种情况下,我决定将除中国以外的所有国家的确诊病例除以 50。为什么是 50?因为它在地图上看起来只是一个很好的比例。您可以尝试不同的标准化方法,以获得对您有用且不太需要人工的东西。为什么不把中国确诊病例按 50 分?因为中国有如此高的病例数,泡沫仍然太大,淹没了周边国家的数据。因此,为了大幅缩小规模,但仍显示它具有最高的案例数,我将其除以 25k。

接下来,我设置图表的参数,选择它作为黑暗和神秘的背景,开始缩放级别为 2。我还指定我想要一个弹出窗口,显示气泡所在国家的确诊病例数。最后,我写了一个简短的规则集,规定如果确诊病例数(非标准化版本)少于 100 例,气泡为绿色,如果在 101 到 500 例之间,气泡为黄色,如果是任何其他值,气泡为红色。

瞧,这就是输出!如果您点击气泡,您将看到该特定国家的确诊病例总数。从气泡的颜色和大小可以很快观察到,大量确诊病例主要发生在亚洲。

使用叶子的气泡图

预测未来案例

在我做任何类型的预测之前,让我们绘制数据报告期间的确诊病例、死亡和康复总数,看看我们是否有某种趋势。为了制作这个图表,我根据日期已确认、死亡已康复列组合在一起,并对这些值求和。然后,我使用 iPlotter 在 ChartJS 中生成图形。我过去使用过 chartj,我非常喜欢图表的外观和它们的交互性。

绘制原始数据

那么,从图表中我们能看出什么呢?它显示在 21 个数据点中,每个变量都有线性增长。

鉴于我们没有足够的数据点,很难使用机器学习模型或时间序列模型(如 ARIMA)来预测疫情。但我们可以使用 ARIMA 的移动平均线(MA)部分,并采用 2 或 3 个移动平均线来获得未来每日确诊病例数的粗略想法。假设每日确诊病例数将继续增长,让我们来看看一段时间内确诊病例的移动平均值。

首先,我使用 Pandas 的rolling函数计算 2 的移动平均值。这个函数的作用是计算数据帧中每 2 行的平均值。为什么是 windows 2?如果我们绘制移动平均数图,它似乎很好地遵循了与实际每日确诊病例数相同的趋势。事实上,这一趋势比原始数据稍微平稳一些,从 2020 年 2 月 4 日到 2020 年 2 月 5 日以及 2020 年 2 月 6 日和 2020 年 2 月 7 日,病例数量的增加只是轻微的。我将移动平均线添加到新列中的数据帧中, MA

假设我们想预测 6 天内确诊病例的数量。我们可以使用最后的移动平均值(43,807)作为第一个预测案例数。然后,我们可以通过计算最后一个实际案例数(44,982)与第一个预测案例数(43,807)的移动平均值来预测 2 天前的案例数。我们可以使用 for 循环迭代这个过程,直到我们预测了 6 个值。我们可以将它们放在一个列表中,准备放入 graph 函数中。

由于我对预测是否真实很感兴趣,我等了 6 天才收集到新的数据。所以,我在 2020 年 2 月 23 日写下了以下几段文字。但是通常情况下,你要做的是将你的数据帧分成一个训练集和一个测试集。然后,您可以根据定型集进行预测,并使用测试集来评估预测。

我使用与以前相同的技术处理新数据,并计算每天确诊病例的数量。然后我制作了下图。黄线代表实际每日确诊病例数,红线代表移动平均数 2,蓝线代表 2020 年 2 月 12 日至 2020 年 2 月 17 日的每日新病例数,最后,绿线代表预测病例数。

预测病例

结论

那么,我从这个分析中学到了什么?

我主要意识到一个简短的分析需要多少预处理和数据争论!我还对 follow 库的输出以及地图在可视化基于位置的数据方面的有效性印象深刻。

然而,结果表明,预测方法并不奏效。比如 2020 年 12 月 2 日,实际病例数和预测数相差 20k 左右!但是,如果我们观察 2020 年 2 月 11 日和 2020 年 2 月 12 日之间实际确诊病例数的差异,就会发现增加了大约 16k 例病例!这是我们没有预料到的……如果我们考虑到实际确诊病例的平均日增长率为 0.27%,您会预计 2020 年 12 月 2 日的病例总数将在 45k 左右,而不是 60k。但是,嘿,我想这就是数据的本质!

完整的笔记本,请查看下面我的 GitHub 回购:https://github.com/LowriWilliams/Coronavirus

如果你喜欢这篇文章,别忘了点赞和分享。

使用 Plotly 实现冠状病毒数据可视化

原文:https://towardsdatascience.com/coronavirus-data-visualizations-using-plotly-cfbdb8fcfc3d?source=collection_archive---------3-----------------------

小说《电晕病毒 2019》数据集分析附代码!

介绍

今天,我发现了一个新的数据集,名为“Novel Corona Virus 2019 Dataset”,因为人们对我之前的文章 非常感兴趣,所以我想我应该使用 Plotly 创建一些数据可视化!

Plotly 是 Python 中的一个库,用于创建交互式动态数据可视化。如果你想与这些可视化互动,我会在本文底部提供我的 Kaggle 笔记本的链接。

注:所有图片和 gif 都是我自己用 Plotly 和 Giphy 创建的。

如果这是你喜欢的那种东西,请成为第一批订阅 我的新 YouTube 频道在这里 !虽然还没有任何视频,但我会以视频的形式分享很多像这样的精彩内容。感谢大家的支持:)

目录

  1. Choropleth 地图
  2. 饼状图
  3. 条形图
  4. 线图
  5. 树形图

Choropleth 地图

冠状病毒在全球范围内的传播

由作者用 Giphy 创建

  • 这是一个动画的 choropleth,显示了冠状病毒在 2020 年 2 月传播到了哪里。如果你想看更清晰的完整版本,链接在这篇文章的底部!
fig = px.choropleth(df_countrydate, 
                    locations="Country", 
                    locationmode = "country names",
                    color="Confirmed", 
                    hover_name="Country", 
                    animation_frame="Date"
                   )

fig.update_layout(
    title_text = 'Spread of Coronavirus',
    title_x = 0.5,
    geo=dict(
        showframe = False,
        showcoastlines = False,
    ))

fig.show()

全球确诊病例热图

使用 plot.ly 创建

  • 很明显,中国的病例数是其他任何有确诊病例的国家无法相比的。因此,我在下一张图的分析中去掉了中国。
fig = go.Figure(data=go.Choropleth(
    locations = df_countries['Country'],
    locationmode = 'country names',
    z = df_countries['Confirmed'],
    colorscale = 'Reds',
    marker_line_color = 'black',
    marker_line_width = 0.5,
))

fig.update_layout(
    title_text = 'Confirmed Cases as of February 28, 2020',
    title_x = 0.5,
    geo=dict(
        showframe = False,
        showcoastlines = False,
        projection_type = 'equirectangular'
    )
)

全球确诊病例热图(不包括中国)

使用 plot.ly 创建

  • 在这里,你可以看到,除了中国之外,韩国、伊朗和意大利显然是病例数量最多的三个国家。
df_countries_no_china = df_countries[df_countries['Country'] != 'Mainland China']
fig = go.Figure(data=go.Choropleth(
    locations = df_countries_no_china['Country'],
    locationmode = 'country names',
    z = df_countries_no_china['Confirmed'],
    colorscale = 'Reds',
    marker_line_color = 'black',
    marker_line_width = 0.5
))

fig.update_layout(
    title_text = 'Confirmed Cases as of February 28, 2020 excl. China',
    title_x = 0.5,
    geo=dict(
        showframe = False,
        showcoastlines = False,
        projection_type = 'equirectangular'
    )
)

饼图

按国家分列的确诊病例比例

  • 很明显,大多数病例仍在中国,但在下一张图中,你可以看到中国以外的病例比例
fig = px.pie(df_countries, values = 'Confirmed',names='Country', height=600)
fig.update_traces(textposition='inside', textinfo='percent+label')

fig.update_layout(
    title_x = 0.5,
    geo=dict(
        showframe = False,
        showcoastlines = False,
    ))

fig.show()

按国家(不包括中国)分列的确诊病例比例

  • “其他”是指钻石公主号游轮上的案例
fig = px.pie(df_countries_no_china, values = 'Confirmed',names='Country', height=600)
fig.update_traces(textposition='inside', textinfo='percent+label')

fig.update_layout(
    title_x = 0.5,
    geo=dict(
        showframe = False,
        showcoastlines = False,
    ))

fig.show()

条形图

一段时间内确诊病例总数

  • 2 月 13 日出现了一个高峰,这是由于一种对确诊病例进行重新分类的新方法
  • 它开始趋于平稳,但由于钻石游轮上成员的释放,你可以看到越来越多的国家在 2 月底出现病例。这可能表明病毒的传播远未达到稳定状态。

一段时间内的死亡总数

一段时间内恢复的案例总数

  • 死亡和康复病例的数量是滞后指标,所以随着时间的推移,我们应该会看到其他国家的一些数字在上升。
bar_data = df.groupby(['Country', 'Date'])['Confirmed', 'Deaths', 'Recovered'].sum().reset_index().sort_values('Date', ascending=True)

fig = px.bar(bar_data, x="Date", y="Confirmed", color='Country', text = 'Confirmed', orientation='v', height=600,
             title='Cases')
fig.show()

fig = px.bar(bar_data, x="Date", y="Deaths", color='Country', text = 'Deaths', orientation='v', height=600,
             title='Deaths')
fig.show()

fig = px.bar(bar_data, x="Date", y="Recovered", color='Country', text = 'Recovered', orientation='v', height=600,
             title='Recovered')
fig.show()

线图

  • 这是上面显示的条形图的综合表示。理想情况下,我们希望看到红线和蓝线相交并相互穿过。
line_data = df.groupby('Date').sum().reset_index()

line_data = line_data.melt(id_vars='Date', 
                 value_vars=['Confirmed', 
                             'Recovered', 
                             'Deaths'], 
                 var_name='Ratio', 
                 value_name='Value')

fig = px.line(line_data, x="Date", y="Value", color='Ratio', 
              title='Confirmed cases, Recovered cases, and Death Over Time')
fig.show()

树形图

树状图是一种类似饼图的表示方式,因为它表示比例。

按国家分列的确诊病例

fig = px.treemap(df_countries, path=['Country'], values='Confirmed', height=600, width=1000)

fig.update_layout(
    title_x = 0.5,
    geo=dict(
        showframe = False,
        showcoastlines = False,
    ))

fig.show()

按国家(不包括中国)分列的确诊病例

fig = px.treemap(df_countries_no_china, path=['Country'], values='Confirmed', height=600, width=1000)

fig.update_layout(
    title_x = 0.5,
    geo=dict(
        showframe = False,
        showcoastlines = False,
    ))

fig.show()

感谢阅读!

如果你喜欢我的工作,想支持我…

  1. 支持我的最好方式就是在媒体T2 上关注我。
  2. 推特 这里成为第一批关注我的人之一。我会在这里发布很多更新和有趣的东西!
  3. 此外,成为第一批订阅我的新 YouTube 频道 这里
  4. LinkedIn 这里关注我。
  5. 在我的邮箱列表 这里报名。
  6. 查看我的网站,terenceshin.com

更多相关文章

[## 9 种有趣的新型冠状病毒统计和数据可视化

以下是你应该知道的关于冠状病毒的知识

towardsdatascience.com](/9-fascinating-novel-coronavirus-statistics-and-data-visualizations-710cfa039dfd) [## 探索性数据分析的广泛逐步指南

我对任何数据集执行 EDA 的个人指南

towardsdatascience.com](/an-extensive-guide-to-exploratory-data-analysis-ddd99a03199e)

资源

[## Choropleth 地图

如何用 Plotly 在 Python 中制作 choropleth 地图?

plot.ly](https://plot.ly/python/choropleth-maps/) [## 图形参考

Plotly 属性是如何组织的?plotly 图表是用 plotly.graph_objects 和…中的对象以声明方式描述的

plot.ly](https://plot.ly/python/reference/#scattergeo-locationmode) [## Plotly Express

每行代表一朵花。https://en.wikipedia.org/wiki/Iris_flower_data_set 回复:一个 150 元的“熊猫. DataFrame”

plot.ly](https://plot.ly/python/plotly-express/)

新闻中的冠状病毒:他们反应过度了吗?

原文:https://towardsdatascience.com/coronavirus-in-the-news-are-they-overreacting-8b88da5f4afa?source=collection_archive---------7-----------------------

我搜集了 5000 多篇新闻文章来寻找答案

伊利亚·安东内尔在 Unsplash 上的照片

[2022 年更新:亲爱的读者,请记住这篇文章最初写于 2020 年 3 月 12 日——远在我们知道我们现在对 COVID 的大部分了解之前。写这篇文章的时候,我纯粹是好奇媒体是否客观地描述了情况,我意识到疫情造成的损失比我当时想象的要大得多。阅读时,请尽量记住这个上下文。谢谢——汤姆·夏普。]

随着冠状病毒(新冠肺炎)的发作,许多人转向媒体来评估形势的严重性。一些人说媒体反应过度,描绘了一个远比现实更糟糕的情况。其他人认为,媒体是在严格地描述事实,也就是说,不是试图以这样或那样的方式说服我们。我们如何确定哪一个是真实发生的?

作为一个数据驱动型的人,我开始着手评估媒体在过去几个月的反应。一周前,我建立了几个不同的网络抓取器来收集任何引用冠状病毒的文章的链接,然后将这些文章的内容收集到一个数据库中。利用这些文章,我能够分析媒体是否对新冠肺炎反应过度,以及反应过度的程度。

在开始分析文章数据之前,我必须确定我实际上在寻找什么。你如何量化一篇文章对一种情况的反应?为此,我决定采用一种自然语言处理(NLP)技术——情感分析。情感分析可以让我们推断出一篇文章对特定情况的观点、态度或感受。

我选择的用于情感分析的 Python 库是 TextBlob。 TextBlob 是一个 NLP 包,因其简单而丰富的情感分析而备受推崇。TextBlob 分析文本主体并输出该文本的主观性和极性得分。通过评估冠状病毒文章的这些度量,我们可以确定所述文章有多主观和/或负面,这可以是作者对情况“反应过度”的指示。

说完这些,我们开始分析一些文章吧!

照片由 Unsplash 上的 Utsav Srestha 拍摄

数据

使用 Python,我能够从两个不同的新闻网站上找到冠状病毒的文章。这些文章可以追溯到 2020 年 1 月初,当时主流媒体开始讨论该病毒。

对于每篇文章,我都存储了元数据(作者、日期、链接、站点等。)以及 SQLite 数据库中的实际文本。我每天都在不断更新这个数据库,每天早上都会把最新的文章拉进来。在写这篇文章的时候,我已经从 CNN 和纽约时报获得了 5451 篇关于冠状病毒的文章。

情感分析:主观性

作为新闻的读者和观众,我们希望确保我们消费的内容更符合事实,而不是固执己见。主观性是衡量这一点的一个很好的标准——高度固执己见的文章会落在量表的高端(接近 1),而更真实、更贴近现实的文章会落在量表的低端(接近 0)。

也就是说,我想用主观性来回答以下几个问题:

  1. 这些冠状病毒新闻文章有多主观?
  2. 新闻来源不同,主观性也不同吗?
  3. 随着情况的发展(随着时间的推移),主观性会改变吗?

这些冠状病毒新闻文章有多主观?

让我们快速看一下所有 5000 篇文章的主观性:

count    5451
mean     0.393
std      0.092

上面的直方图显示了主观性在所有文章中的分布。分布中的关键指标显示在灰色框中。即平均主观性为 0.39 ,主观性的标准差(std)为 0.09 。同样,假设主观性=1 相当于一篇完全主观的文章,我们可以说这些文章平均有 40%是主观的

还不错!这意味着一般的文章是客观多于主观的。看起来我们从这些网站获得的内容是值得的。你可能想知道,“虽然文章的总体平均值是 40%,但不同新闻来源之间的平均值有所不同吗?”。

新闻来源不同,主观性也不同吗?

虽然上面的分析很好地概括了文章,但它没有区分新闻来源。显然,不同的新闻网站和电台有不同的政治倾向和风格,所以他们对冠状病毒情况的解释不同是有道理的,对吗?

让我们重新绘制情绪分布图,这次突出显示两个新闻网站,看看我们能否确定两者之间的任何差异。

site    count  mean   std 
cnn     1208  0.401  0.071
nytimes 4243  0.391  0.097

注意到什么不同了吗?可能很难说。让我们看一下有帮助的指标。

两个站点的平均值大致相同,为 40%。但是,我们可以看到标准差差别很大。这些指标似乎给了我们相互矛盾的结果。有没有另一种方法可以量化这两种分布有多相似?

Kolmogorov–Smirnov(KS)检验是一种非参数检验,用于确定抽取的两个样本的分布是否不同。对于我们的情况,这意味着:一个站点的分布与另一个站点的分布相同吗?

KS 检验的无效假设是:【H0 =一个站点的文章情感分布与另一个站点相同

使用 KS 检验,我得到了一个检验统计量 d=0.089 ,并通过排列确定 p 值为 0。因此,我们可以得出结论,我们可以拒绝零假设 : 第一个位点的分布不同于第二个位点的分布。这很可能是由于标准偏差的差异(以及分布中潜在的其他细微差别)。

虽然两个发行版不同,但还是有点难看出原因。让我们以不同的方式分割数据,看看它是否揭示了感兴趣的东西。

主观性会随着情况的发展而改变吗?

观察主观性的分布是一个很好的起点,但它未能代表我们都知道的东西:情况每天都在演变。1 月初,美国的新冠肺炎病例数为 0,并且进展迅速,尤其是在过去几天。文章的主观性是否遵循这种趋势?

为了证明这一点,让我们画出过去几个月的平均每日主观性,看看随着情况的发展是否有任何变化。日均主观就是当天发表的所有文章的平均主观。我们可以看到下面的结果:

如图所示,尽管病例数量在 2 月底开始增加,但主观性仍然相当稳定。对于这两个站点,平均每日主观性在 0.40 左右徘徊,与上述分布中发现的 40%主观性一致。不是很刺激…

让我们更细化一点。我们可以绘制每篇文章在相应日期的主观性,以查看任何给定日期的传播:

我们在这里看到的是相当惊人的。2 月 23 日之后,《纽约时报》的文章写作方式发生了巨大的转变。这也恰好对应了确诊病例曲线的一个大台阶。在 2 月 23 日之前,大多数文章的主观评分都在 0.2 到 0.6 之间。2 月 24 日,美国确诊的新冠肺炎病例从 15 例猛增至 51 例(增长了 3.4 倍!),从这一点上来说,文章的主观性是非常可变的——在某些日子里,整个范围是变化的。

对 CNN 的影响似乎更微妙,如果有的话。即使在 2 月 23 日之后,主观性也大多保持在 0.2 到 0.6 的范围内。CNN 的作者似乎保持着同样的客观水平,而《纽约时报》的作者对事态发展做出反应,在某些情况下撰写完全主观的文章。

现在,纽约时报的一些文章在 2 月 23 日之后变得更加客观,但这里的要点是,根据你阅读的文章,你将不会获得与之前相同的一致性。

情绪分析:极性(消极与积极)

现在我们对这些新闻来源的主观性有了更好的了解,让我们把注意力转向极性。极性衡量给定文本块的正负程度。TextBlob 对任何给定文本块的极性进行排序,从-1(负)到 1(正)。

在这一部分之前,我应该说,任何关于冠状病毒的文章的极性,就其本身而言,是一个见仁见智的问题。换句话说,如果你真的相信眼前的情况是值得担心的,那么一篇负面的文章似乎也是一样的。然而,如果你认为这种情况被“过度炒作”,那么一篇负面的文章可能会显得与现实脱节。因此,对结果的解释取决于你的观点。

让我们像以前一样进行同样的分析,这一次看文章的极性。

  1. 这些冠状病毒的新闻报道有多极端?
  2. 极性是否因新闻来源不同而不同?
  3. 随着情况的发展(随着时间的推移),极性会发生变化吗?

这些冠状病毒新闻文章的极性有多大?

count       5451
mean        0.071
std         0.068

平均而言,文章的极性相当中性。这是我们应该从一个声誉良好的新闻来源中期待的。标准偏差也很小,表明极性在所有文章中相当一致。它也小于主观性,这意味着极性的变化小于主观性。

极性是否因新闻来源不同而不同?

site    count  mean   std 
cnn     1208  0.072  0.061
nytimes 4243  0.070  0.070

同样,我们看到两个新闻网站的平均值大致相同,这次的标准差也有些相似。我们应该预料到两个站点之间的极性分布更有可能是相同的。让我们用另一个 KS 测试来测试这个。

这个有点接近,但是 p 值为 0.04,我们仍然拒绝零假设: 分布看起来是不同的。

极性会随着情况的发展而改变吗?

我们在这里看到了与主观性相似的行为:日平均极性随着时间的推移相当恒定,两个站点的日平均极性大多保持在 0 到 0.2 之间。因此,在任何一天,一般的文章都是相当中性的。

令人惊讶的是,同样的行为也在极性中出现。2 月 23 日之后,纽约时报的文章在任何一天都有很大的极性差异。然而,方差似乎稍微偏向范围的正端,这意味着 2 月 23 日之后发表的任何给定的纽约时报文章都有更好的机会不是中立的,但有更高的机会是积极的。同样,CNN 似乎很少表现出这种行为。

结论

通过使用网络抓取和 NLP(情绪分析),该分析显示了媒体对美国当前冠状病毒形势的反应。我们发现,平均而言,文章有 40%是主观的,而且在极性上相当中性。我们还表明,两个新闻站之间的文章实际上是不同的,纽约时报对形势变化的反应要比 CNN 大得多。

希望下次你打开一篇新闻文章时,你会对你将要阅读的内容描述冠状病毒现状的程度更有信心。

我希望你喜欢这篇文章。如果有,在下面给我留言评论吧!让我知道你喜欢它的什么,或者你是否有兴趣在这篇分析中看到任何其他新闻网站!

该项目的代码可以在 GitHub 上找到。

如果你想更新我正在写的东西、我正在构建的辅助项目或我觉得有趣的文章,请随时加入我的时事通讯— 有抱负的数据科学家

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

美国的冠状病毒——下一步是什么?

原文:https://towardsdatascience.com/coronavirus-in-the-us-whats-next-965b7bc92f39?source=collection_archive---------66-----------------------

在所有国家中,美国有可能爆发最严重的冠状病毒疫情

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

图片来自 PixabayGerd Altmann

在我们试图回答这个问题之前,让我们把事情放在背景中——美国现在是世界上新冠肺炎病例最多的国家。4 月 4 日,美国确诊病例突破 30 万,死亡人数突破 8000 大关。更令人担忧的是死亡人数的增长速度——仅在 4 月 4 日,美国就有近 1400 人死亡。那么,我们是怎么走到这一步的?

冠状病毒无国界:

德国、西班牙、意大利、英国和美国确诊病例时间序列

从 2019 年 12 月在中国的起源开始,冠状病毒现在已经传播到几乎每个国家。上图显示了德国、西班牙、意大利、英国和美国确诊病例数量的时间历程。随着时间的推移,所有国家的确诊病例呈指数增长,显示出类似的轨迹。除了中国(图中未显示)能够 拉平曲线 之外,其他国家仍处于病毒爆发的早期阶段,确诊病例数每天都在呈指数级增长。我们确实观察到不同国家爆发的潜伏期。美国和其他欧盟国家有一个多月的时间(见下表)来准备病毒的爆发,而它正在向我们的海岸前进。不幸的是,在我们对冠状病毒的防御中,我们起步较晚,从未恢复。

各月确诊病例

类似的趋势是,与新冠肺炎相关的死亡人数呈指数增长。4 月 4 日,意大利死亡人数突破 1.5 万,美国和英国分别突破 8000 和 4000 大关。世界各国政府都在努力控制病毒的传播,尽量减少生命损失。距离疫苗接种还有几个月,作为第一道防线的群体免疫的想法在英国被尝试和放弃。虽然美国部分地区已经实施就地安置,但一些州和县仍在照常营业。

德、西、意、英、美报告死亡时间序列

虽然上述图表显示了累计确诊病例和死亡人数,但观察每天报告的病例可以看出,西班牙和意大利的情况趋于平稳,而美国和英国仍呈上升趋势。

德国、西班牙、意大利、英国和美国每天报告的死亡人数

美国已经成为新冠肺炎的中心

新冠肺炎确诊病例的空间足迹(截至 2020 年 4 月 4 日)

差不多一个月前,大多数新冠肺炎确诊病例主要集中在华盛顿州和纽约州地区。说到流行病,在一个地方发生的事情不会停留在同一个地方。快进到今天(4 月 4 日),冠状病毒已经扩散到美国所有州。上面的地图显示了我们各地确诊病例的空间足迹。一些州/县在抗击冠状病毒传播的斗争中采取了积极措施,并实施了就地避难令。例如,旧金山湾区的六个县从 3 月 17 日开始实施就地安置令。因此,湾区没有出现我们在纽约和新泽西看到的那种新冠肺炎病例的爆发。

确诊病例总数——前八个州

死亡总人数——前八个州

纽约州有全美一半的新冠肺炎病例。当所有人的注意力都集中在纽约的情况时,我们看到新的冠状病毒热点正在出现。佛罗里达州、伊利诺伊州、密歇根州和路易斯安那州的确诊病例和死亡人数开始激增。纽约的疫情预示着如果这些州放松社区封锁和社会距离,将会发生什么。

下一步是什么?

鉴于冠状病毒传播的所有活动部分和遏制努力,对抗冠状病毒的战斗将如何长期进行存在许多不确定性。但是,在短期内,只有两种选择——a)要么疫情继续加速发展,超出我们医疗系统的能力;或者 b)将扩散减慢到我们可以使曲线变平的程度。在这两种选择中,意大利和西班牙对我们在不久的将来可以预期的美国的情况提出了严峻的警告。

自达到 200 例以来按国家分列的确诊病例数

上图显示了每个国家达到 200 例后确诊病例数的时间序列。有趣的是,这些轨迹看起来彼此相似,直到突破 200 例阈值 15 天后。超过 15 天后,根据人口密度和每个国家为最大限度地减少病毒传播而采取的控制措施,病例数会有所不同。

突破 200 例阈值后 5 天、10 天、15 天的确诊病例数

基于上述分析,我们可以合理地推断,所有国家的死亡轨迹将遵循类似的趋势。下图显示了自达到 200 例以来每个国家死亡人数的轨迹。在达到 200 人伤亡的两天后,德国(342 人)、美国(417 人)、英国(336 人)、意大利(463 人)和西班牙(533 人)的死亡人数范围相似。在死亡人数达到 200 人的 28 天后,意大利的总死亡人数为 15,362 人,可以用来衡量其他国家的死亡人数。 一般来说,就疫情的进程而言,西班牙比意大利落后一周。同样,美国和英国比意大利晚两周。换句话说,两周后,美国的死亡人数(按人口比例计算)将与我们今天在意大利看到的相似。

自达到 200 例以来按国家分列的死亡人数

虽然前景并不光明,但我们不得不正视事实,承认一个令人不安的现实。在所有国家中,美国有可能爆发最严重的冠状病毒疫情。在落后之后,美国要拉平曲线将很困难,但并非不可能。与此同时,让我们在对抗疫情的战斗中尽自己的一份力量,遵循社交距离,在需要的时候帮助他人。

****数据来源:https://github.com/CSSEGISandData/COVID-19

维基百科中冠状病毒的语言-可视化

原文:https://towardsdatascience.com/coronavirus-interest-inwikipedia-by-language-1b3e6562040d?source=collection_archive---------20-----------------------

按冠状病毒语言分类的维基百科页面浏览量

查看维基百科的页面浏览量,深入了解新闻在世界各地的传播和趋势。首先,我们将从维基百科的页面浏览量中提取数据来创建一个新的仪表板。坚持到最后,看看在 Data Studio 中使用 Vega 和 Vega Lite 实现高度可配置的可视化的秘密。

一些有趣的趋势你可以很快想象出来:

  • 中文的冠状病毒比其他语言早 9 天开始流行。
  • 日语和韩语是最先赶上的语言。
  • 在过去的几天里,意大利、挪威和波斯的反弹最为强劲。

一些有趣的趋势你可以很快想象出来

在开头的图表中,您可以找到每种语言的冠状病毒页面的浏览量。下一个图表显示了当前新闻之后的维基百科文章的相同情况:

主题2019–20 _ 武汉 _ 冠状病毒 _ 爆发的每种语言的维基百科浏览量。请看冠状病毒的开场图。

在 BigQuery 中从维基数据中获取所有冠状病毒页面标题:

CREATE OR REPLACE TABLE `temp.wikidata_coronavirus`
AS
SELECT REGEXP_EXTRACT(site, '(..)wiki') language, encoded value
FROM `bigquery-public-data.wikipedia.wikidata`, UNNEST(sitelinks)
WHERE numeric_id = 290805
AND LENGTH(site)=6# 1.9 sec elapsed, 9.7 MB processed

修正了西班牙语、荷兰语、斯洛伐克语页面的重命名:

INSERT INTO `temp.wikidata_coronavirus` 
SELECT 'es', 'Orthocoronavirinae';
INSERT INTO `temp.wikidata_coronavirus`
SELECT 'nl', 'Coronavirussen'
INSERT INTO `temp.wikidata_coronavirus`
SELECT 'sk', 'Coronavírus'

为 Data Studio 创建一个表:

CREATE OR REPLACE TABLE 
  `fh-bigquery.wikipedia_extracts.wikipedia_corona_views`
AS
WITH sumviews AS (
  SELECT * REPLACE(IF(date=CURRENT_DATE(), views*24/hours_day, views) AS views) # last fractional day correction
  FROM (
    SELECT SUM(views) views, SUBSTR(a.wiki, 0, 2) wiki, title,  DATE(datehour) date, COUNT(DISTINCT datehour) hours_day
    FROM `bigquery-public-data.wikipedia.pageviews_20*`  a 
    JOIN `temp.wikidata_coronavirus` b
    ON ((a.title=b.value AND SUBSTR(a.wiki, 0, 2)=b.language))
    WHERE DATE(a.datehour) > '2019-12-28'
    GROUP BY wiki, title, date
  )
)
SELECT *, (FORMAT('%s - %s', language, title)) wiki_title
FROM (
  SELECT * 
    REPLACE((SELECT STRING_AGG(DISTINCT title ORDER BY title) FROM sumviews WHERE a.wiki=wiki) AS title)
    , (views)/ (MAX(views) OVER(PARTITION BY wiki)) ratio
    , (SELECT language FROM `wikipedia_extracts.wiki_langs` WHERE a.wiki=wiki ) language
  FROM sumviews a
  WHERE wiki IN (SELECT wiki FROM (SELECT wiki, SUM(views) FROM sumviews GROUP BY 1 ORDER BY 2 DESC LIMIT 28 ))
)# (13.4 sec elapsed, 411.3 GB processed)

优化待办事项:这 411.3 GB 可以进行大量优化——尤其是如果在持续的基础上,我只是加载增量小时的视图,而不是重新处理整个事情。

玩弄结果

包含结果的整个表只有 1,239 行,您可以在 BigQuery 上找到它:

SELECT *
FROM `fh-bigquery.wikipedia_extracts.wikipedia_corona_views`

新加入 BigQuery?从这里开始

数据工作室

你见过这样的图表:

典型的数据工作室面积图

但是这有多酷?

Data Studio 中连接到 BigQuery 的 Vega Lite 可视化

秘密:我们现在可以在 Data Studio 中使用 Vega & Vega lite 图表。有了这个社区可视化,我只需要为 Vega lite 提供一个配置:

{
   "$schema":"[https://vega.github.io/schema/vega-lite/v3.json](https://vega.github.io/schema/vega-lite/v3.json)",
   "mark":"rect",
   "config":{
      "axisRight":{
         "labelFontSize":15
      }
   },
   "encoding":{
      "y":{
         "title":"",
         "field":"$dimension0",
         "type":"nominal",
         "axis":{
            "labelAlign":"left",
            "orient":"right"
         }
      },
      "x":{
         "field":"$dimension1",
         "type":"ordinal"
      },
      "color":{
         "field":"$metric0",
         "type":"quantitative",
         "legend":{
            "orient":"left"
         },
         "scale":{
            "type":"sqrt",
            "range":[
               "#fffaff",
               "blue"
            ]
         }
      }
   }
}

不同的尝试:

在 Data Studio 中使用 Vega Lite

想要更多吗?

敬请关注交互式仪表盘和更多更新。请给我留下您的意见和任何建议或更正。

感谢:Denny vrandei,感谢维基数据和对这篇文章的最后修正。马克·科恩在 BigQuery 中为维基数据和维基百科数据建立了一个可靠的管道。更多详情请见下文。

冠状病毒和 Meetup RSVPs

哦,我也在看世界各地的 Meetup RSVPs 是如何受到影响的。看看这个:

参加 Meetup.com 技术会议的回复数量下降(与去年相比)

我是 Felipe Hoffa,谷歌云的开发者倡导者。在 @felipehoffa 上关注我,在medium.com/@hoffa上找到我以前的帖子,在reddit.com/r/bigquery上找到所有关于 BigQuery 的帖子。

[## 没有信用卡的 BigQuery:发现、学习和分享

如果你在注册 BigQuery 时遇到了困难,不用担心——现在注册和开始使用比以往任何时候都容易

towardsdatascience.com](/bigquery-without-a-credit-card-discover-learn-and-share-199e08d4a064) [## 不等式:如何用 SQL、BigQuery 和 Data Studio 绘制洛伦兹曲线

所有维基百科页面中排名前 0.1%的页面获得了 25%的浏览量。最底层的 99%只获得了 42%的浏览量。还有……

towardsdatascience.com](/inequality-how-to-draw-a-lorenz-curve-with-sql-bigquery-and-data-studio-c70824b0748d) [## 互动:2019 年维基百科页面排行榜

维基媒体公布了他们 2019 年最受欢迎的页面——但我们能更深入吗?当然,这里有 BigQuery 和…

towardsdatascience.com](/interactive-the-top-2019-wikipedia-pages-d3b96335b6ae) [## 优化 BigQuery:聚集您的表

BigQuery 刚刚宣布了对表进行集群的能力——我将在这里进行描述。如果您正在寻找大量的…

medium.com](https://medium.com/google-cloud/bigquery-optimized-cluster-your-tables-65e2f684594b)

冠状病毒让远程工作成为新常态

原文:https://towardsdatascience.com/coronavirus-made-remote-work-the-new-normal-c190267074c2?source=collection_archive---------51-----------------------

在家工作时如何保持高效和精神健康

照片由 Grovemade 在 Unsplash 上拍摄

关于远程工作的争论已经酝酿了几十年。冠状病毒,以及曲线扁平化的必要性,导致了它的爆发。

21 世纪的技术工具早就让工作不受地点限制成为可能,但直到现在,员工仍然被束缚在自己的小隔间里。

人们已经清楚地认识到拉平曲线势在必行,办公室纷纷关闭,远程工作的未来已经在全球展开。社交距离揭示了一个强大的技术基础设施,使远程工作不仅可能,而且有效。

随着远程工作成为现状,学会在同一个空间生活和工作需要实践。三年来,我一直作为一名研究&分析顾问远程工作。通过许多陷阱,我学会了如何保持高效和精神健康。

虽然遥远的生活方式不是未来的灵丹妙药,但它是今天的必需品,就像照顾彼此的必要性一样,即使我们分开了。

TL;博士适应这种新的工作方式需要努力。考虑以下四种在家工作时保持高效和精神健康的基本行为:

照片由 kate.sade 在 Unsplash 上拍摄

  1. 在家中指定办公空间

当远程工作的新鲜感逐渐消失时,一个令人惊讶的认识是常见的:事实上,错过一个小隔间是可能的。

诞生于效率至上的 20 世纪哲学——泰勒主义,小隔间已经演变成了办公室工作被鄙视的象征。但是为什么呢?这个小隔间的设计是为了增强员工的注意力和生产力,它确实起作用了。

然而,20 世纪的家被设计成完全支持不同的目标:在漫长的一天工作后加油、聚会和充电。

这种差异很重要。考虑你的办公室和你的家的功能空间——并划分两者——是远程生活的第一个关键点。

在你专注于工作本身之前,先专注于在家里定义一个工作空间。

在家工作的两个方面对你的工作和幸福有着巨大的影响:物理空间中的环境因素和完成工作的工具和技术。

先说环境因素。

首先要做的是创造一个你将工作的物理空间,这个空间不同于你下班后放松的空间。无论是书桌还是茶几,最重要的不是你的工作空间的大小,而是为工作腾出空间的感觉。

越来越多的研究表明,工作场所的环境因素,如光线、空气和温度,对健康和生产力有着重大影响。2019 年由 View 进行的一项关于工作场所健康的研究发现,三分之一的人报告称,由于温度、照明、空气质量和声学等环境因素,他们每天损失超过 60 分钟的工作时间。这相当于一周损失了惊人的 8 小时工作时间。

考虑一下你家里的这些相同的环境因素,以及为了改善你的精神健康和工作效率需要做些什么。例如:

  • 把你的工作空间建在窗户附近——自然光与情绪健康密切相关
  • 打开窗户,选择新鲜空气而不是空调
  • 创造一种与自然的联系——在附近摆放植物/花卉,或者悬挂喜爱的风景照片

当你考虑了家中的环境因素并创造了工作空间后,转向你将如何工作:你有哪些工具和技术来完成对你的工作效率有积极影响的工作?

我们谈论的不仅仅是一台笔记本电脑。相反,考虑一下什么样的工具可以增强和扩展你的工作方式,使工作更加高效和舒适。例如:

  • 厨房里堆满了健康零食,可以缓解下午的疲劳
  • 扩展您工作站的外接显示器
  • 无线耳机,让您可以不受电话束缚地接听电话
  • 在 PPT 或 Excel 中处理大项目时,可以快速点击的计算机鼠标
  • 复印室里一度近在咫尺的基本办公用品

确定你工作场所需要的工具不会一蹴而就,但是投资于你自己和你的工作方式将会给你的生产力和精神健康带来好处。

2。风雨无阻,出门

根据康奈尔大学 Alan Hedge 的 2018 年研究,美国人 90%的时间都在室内度过。没有通勤,远程工作人员几乎 100%的时间都呆在室内。

意向性对于远程工作和保持理智至关重要。在街区周围进行户外散步来清理你的大脑和释放压力的好处在科学中得到很好的证明,在历史中得到很好的证明。

这是一个常识性的建议,但需要有意识的努力。让自己对白天外出负责。例如:

  • 在你的日历上划出时间,就像你开会、外出散步一样
  • 在你通常通勤的时候,早上和晚上散步

3。常规会让你保持理智

远程工作通常意味着独自工作。围绕社交互动的办公室日常事务不再打断一天的工作。

常规很难建立,但很容易停止。想想这个:一天中 40%的人的行为是习惯的结果,而不是决定,查尔斯·杜希格在他的畅销书《习惯的力量》中强调了这一事实。习惯不费吹灰之力就能形成,但常规需要训练。想想看:当一个人的日常生活被打乱时,坏习惯往往会卷土重来。从办公室转移到远程工作就是一个典型的例子。

如果没有办公室生活的外部激励因素——阻止坏习惯的日常事务很容易被转移。在家里,办公室环境特有的外在激励因素突然消失了。突然间,内在激励因素成为让你保持高效的驱动力,但更重要的是,强大的精神和身体健康。

根据西北医学的研究,当日常事务减少时,生产力和睡眠也会减少,导致压力、不良饮食和嗜睡。

在家工作时,日常事务的重要性并不是一个启示性的发现,但它值得一提,因为日常事务很容易丢失并痛苦地重新建立。

当你适应了偏远的生活,很容易沉溺于新发现的自由,导致日常事务瓦解。从关注基础开始。例如:

  • 每天在同一时间醒来
  • 在打开笔记本电脑开始工作之前,养成阅读、写作或锻炼的习惯
  • 决定什么时候关闭你的笔记本电脑,停止晚上的工作
  • 每天抽出时间给家人/朋友打电话——养成每天和某人保持私人联系的习惯

对于远程工作者来说,日常工作对心理健康至关重要,尤其是在这种长时间的社会距离中。

4。运用你的创造力将人们聚集在一起——事实上

当团队远离时,建立一种规范虚拟协作和学习的文化应该是当务之急。

当员工远离办公室时,非正式的饮水机谈话和办公室小房间里的随意交谈就消失了。清晰的沟通、协作和学习渠道,团队和组织必须保持文化的首要地位。

随着我们适应远程工作的节奏,员工有了前所未有的机会成为领导者,带领团队进行协作和学习。

考虑创造性的方法来利用现有的业务运营工具/技术,在您的团队或员工中创建连接点。例如:

  • 促成一次虚拟午餐并学习 Zoom
  • 举办一次创新挑战,邀请那些远程工作时不经常联系的同事
  • 使用 Slack 之类的交流工具来促进虚拟的、特别的学习——例如,分享一篇文章和促进讨论

创造机会,从远方一起学习,一起成长。

在这个虚拟的景观中照顾好自己和彼此。

在家工作时,锻炼“肌肉”来保持高效和精神健康需要练习。在这种新常态下的繁荣取决于你如何塑造你的习惯和环境。

在新冠肺炎危机中,我们更有理由关注自己在偏远地区的成功:当你照顾好自己,你就能更好地照顾你所在社区的人。

冠状病毒爆发—问大数据的 5 个问题

原文:https://towardsdatascience.com/coronavirus-outbreak-5-questions-to-ask-big-data-3550794d2fe9?source=collection_archive---------30-----------------------

让我们利用大数据来探索人类历史上最大的隔离规模

2020 年 2 月 18 日更新

这篇文章最初写于 1 月 31 日。自那以后,疫情的规模导致了加强措施来控制传播。比如我住的住宅小区,最近就采取了封闭式管理。我得到了下面的进入许可。任何没有登记的人都不允许进入。

我在北京居住小区的入园证背面

中国许多城市的情况都很相似。在一些地方,居民购买食品杂货有配额,例如每两天一次。在北京和许多其他城市,从外地来的人需要遵守强制性的 14 天隔离期。学校已经关闭,活动取消,大多数公司都采取在家工作的政策。

的确,我们正在经历人类历史上最大规模的隔离!如果你不相信,看看下面的图表,它显示了中国前 30 大交通枢纽(机场和火车站)的总交通流量的同比比较。红色是今年,绿色是去年。

中国前 30 大交通枢纽的交通流量指数,同比

让我们希望这些强有力的措施能有效地阻止这种高传染性疾病的传播。

当我写这篇文章时,钻石公主号游轮上的冠状病毒病例总数已跃升至 454 例,凸显了隔离的必要性。

[## 日本钻石公主号游轮确认 99 例新型冠状病毒病例

停靠在…的受灾的钻石公主号游轮上又有 99 人被检测出冠状病毒阳性

www.theguardian.com](https://www.theguardian.com/world/2020/feb/17/coronavirus-japan-braces-for-hundreds-more-cases-as-another-china-city-locked-down)

原文章发表于 2020 年 2 月 1 日

百度地图在全球每天被使用 1200 亿次。基于如此多的地理空间数据,百度推出了这个令人惊叹的数据可视化平台,叫做百度千玺(意为迁移)。再加上搜索引擎的数据,百度真的很了解正在发生的事情。

冠状病毒的爆发以及随之而来的武汉和周边城市的封锁给人们的生活带来了严重的干扰。基于大数据,百度能为我们提供哪些答案?

  1. 武汉现在的交通状况如何?

在武汉,衡量交通活动的高速公路交通堵塞距离与去年同期相比下降了 99.7%(红线对绿线)。封锁是真实存在的。

交通堵塞距离(公里)同比对比—武汉

相比之下,北京的图表“仅仅”下降了大约 50%。

北京交通堵塞距离(公里)同比对比

传统上,现在是人们回到大城市开始工作的时候了。由于我们仍处于这场大规模疫情中,交通流量有可能进一步传播病毒。

中国各地政府要么延长了公共假期,要么要求雇主安排员工在家工作。今年会是中国的“在家工作”年吗?

2。封锁前后武汉的交通怎么样?

1 月 23 日,武汉从上午 10 点开始暂停所有公共交通,包括所有公交、地铁和轮渡线路。此外,所有出境的火车和航班都停止了。

从下面的图表中我们可以看到,交通流量在 1 月 23 日宣布后急剧下降,但交通管制直到 1 月 26 日才完全有效。

武汉对外交通流量指数(黄色=今年,白色=去年)

武汉入境交通流量指数(黄色=今年,白色=去年)

同样,现在应该是春节后入境游进入武汉市的高峰时间,但今年有很大不同。

3。对于那些在封锁前离开武汉的人,他们去了哪里?

下图显示他们中的大多数去了湖北省内的其他城市。毫不奇怪,武汉地震后几天,几乎整个湖北省都被封锁了。

1 月 22 日来自武汉的出境交通流量

作为参考,这里有一张来自维基百科的关于交通禁令影响的表格:

4。从百度搜索关键词趋势可以学到什么?

蓝色:冠状病毒,绿色:武汉,橙色:口罩

“冠状病毒”(绿线)和“武汉”(绿线)的搜索量在 1 月 19 日左右开始上升。

1 月 23 日,交通禁令宣布后,“武汉”的搜索量再次大幅增加。

搜索“口罩”(橙色线)的数量增长缓慢,这是因为人们广泛宣传戴口罩是避免病毒传播的最佳措施之一。

5。“武汉”这个关键词在封锁前后的语境是怎样的?

百度“需求图”展示了相关关键词随时间的相关性。随着时间的变化,关键字的上下文也在变化。这让我们了解了当时人们的想法。

在 12 月,“武汉”往往与中国其他城市(如长沙、成都)或武汉境内最受欢迎的旅游目的地(如武汉著名的早餐巷户部巷)相关联,表明与旅游相关的兴趣。

两周后,“SARS”这个词第一次出现在图表中,可能是因为当时人们不知道如何称呼这种新病毒,怀疑 SARS 爆发了。

快进到 1 月下旬,一些最相关的关键词是“武汉封锁”、“XX肺炎”,甚至“华南海鲜市场”,这是大多数人在爆发早期接触冠状病毒的地方。

在大数据时代,我们可以使用像百度这样的数据提供商来了解人们的出行模式和搜索模式。所有这些在 2003 年 SARS 爆发时都不存在。额外的数据使人们能够在这一次做出更明智的决定,并在对抗病毒爆发的斗争中发挥关键作用。

文章中使用的工具

百度千禧是百度提供的一款大数据产品,可以让你实时监控春节期间中国各地的人口迁移情况。

[## 百度迁徙-百度地图慧眼

百度迁徙,通过将定位可视化直观呈现国内春运期间人口迁徙情况。

qianxi.baidu.com](https://qianxi.baidu.com/)

百度关键词搜索和需求图可以在百度索引中找到。

[## 百度指数

百度指数是以百度海量网民行为数据为基础的数据分享平台。在这里,你可以研究关键词搜索趋势、洞察网民兴趣和需求、监测舆情动向、定位受众特征。

index.baidu.com](https://index.baidu.com/)

这两种工具都是纯粹的点击式。只需点击链接,选择您想要监控的相关城市。遗憾的是,这些工具没有英文版。如果你需要在这方面做一些研究,但不懂中文,也许找一个懂中文的人来协助你是个好主意。

冠状病毒、心理学和数据科学

原文:https://towardsdatascience.com/coronavirus-psychology-and-data-science-7302835e1517?source=collection_archive---------34-----------------------

来源:Shutterstock

尽管这是一场全球性的灾难,但这场疫情应该是一次令人大开眼界的经历,让我们重新安排我们的优先事项。

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

作为一个年轻的成年人,我不太关心病毒会如何影响我自己的健康。然而,我非常担心我会成为图表中的另一个节点,并间接加剧处于危险中的人群的痛苦。

来源:shutterstock

作为一个商务人士,我也有点关心自己的事业。我认为,科技行业将会像其他行业一样遭受损失,但这也是在医疗保健、远程医疗、电子学习等领域创造价值的大好机会。与个人健康问题类似,我也有点担心自己(和我的企业),但非常担心全球的整体经济健康。受影响最大的领域可能是酒店业和旅游业,但许多企业将不得不创新和蓬勃发展才能生存。数百万人可能会失去工作或毕生积蓄,这对许多人来说是一个巨大的风险。

作为一名科学家,我对疫情爆发期间收集的所有数据以及所有自然发生的行为实验很感兴趣。它有巨大的成本。成千上万的生命和数百万的企业将会破产。然而,如果我们足够聪明,我们将会对疾病爆发、整个社会以及我们如何防止未来的大流行产生我们现在看到的灾难性影响有更多的了解。

作为技术建设者,我们可以一起解决我们这个时代最困难的问题。

作为一个物种,我们被赋予了我们这个时代最大的责任。我们正面临着巨大的挑战,但我们获得的见解和数据将使我们振作起来,不仅应对当前的疫情,而且应对未来的疫情。

是时候站出来了。是时候开始我们的游戏了。学习的时间到了。

心理学

本文的目标是探索在疾病爆发期间变得明显的心理状况和偏见。

先说最值得注意的问题。

卫生纸大批量购买

好吧,这是一个非常重要的项目,但大量购买是必要的吗?

资料来源:cnn.com

卫生纸的抢购超越了国界和文化。里面有东西。我们的恐慌按钮与我们储存大量卫生纸的欲望是密不可分的。

在我看来,这里有三个主要特征:

首先,我们的进化心理是由一种控制偏差的幻觉支配的。如果政府告诉我们呆在家里,洗手,这听起来并不是什么过分的要求。

但是,人们自然希望采取主动和步骤来感到更安全,因为情况正在威胁他们的生命。不幸的是,市场营销给了我们一种消费安全的错觉,从而助长了这种特质。这种感觉是与生俱来的,隐含在我们的生存中,不会轻易消失。通过储备,我们觉得我们正在采取措施做好准备。

控制偏差的错觉源于我们认为我们可以控制或影响结果。虽然这可以在大规模上进行,数百万人都采取同样的行动,但不幸的是,一个人无法影响宏观性质的结果。这种偏见已被证明会影响健康、投资、商业等。这与众所周知的“赌徒谬误”密切相关,参与者被证明当他们要求高数字时掷得更用力,当他们要求低数字时掷得更柔和。掷骰子的速度对掷出的数字没有影响,但是受试者仍然相信他们可以根据掷骰子的方式来控制结果。

与这种偏差相关,我们还可以识别出零风险偏差。通过完全消除一个风险,我们减少了我们面临的认知压力,使降低风险的选择更有吸引力。有些人会选择降低这种风险,即使讽刺的是,不消除这种风险会更大程度地降低他们面临的总风险。储存卫生纸是一种相对便宜的行为,它告诉我们的反馈机制我们正在采取行动。

第二,有证据表明,对感染的恐惧和厌恶之间有很强的相关性。卫生纸是一种消除我们不希望看到的浪费的工具。厌恶就像一个警报机制,警告你避免某种形式的污染。

最后,我们需要调查羊群行为。人类是群居动物,我们有随大流的倾向也就不足为奇了。从进化的角度来看,这通过确保数量安全来保护我们。这在许多场景中都被观察到:体育赛事、股市泡沫和宗教集会。卫生纸的有趣之处在于它又大又笨重,当其他人在买它,或者货架空了的时候,你很容易就能注意到。随着货架开始空空如也,卫生纸开始获得越来越多的人的心理价值。如果你问购物者批量购买卫生纸的动机,他们会说其他人都在这么做。

总之,大量购买卫生纸可以归因于不同偏见和行为的集合:控制的幻觉,零风险偏见,我们对恐惧和厌恶的原始反应,以及从众行为。

我们能从意大利的反应中学到什么

意大利对疫情的反应是对世界其他地区的一个警告。随着指数复利的增长,它很快失去了控制。此外,它还成为将疾病传播到欧洲和美洲的最大枢纽。

意大利公民有责任吗?意大利政府是大反派吗?号码

从生物学上讲,我们的大脑是一台模式检测机器。我们所知道的最复杂的。我们大部分时间都在探测模式。我们甚至可以发现不存在的模式(**模式识别偏差* *),就像在一片烤面包上看到基督的形象。这次疫情给我们的生活带来了前所未有的局面。

虽然社会和政府都在努力寻找最好的应对方式,但不幸的是,他们没有一个参照点。他们无法审视过去的情况,评估哪些可行,哪些不可行。新冠肺炎疫情及其影响的社会与过去的其他事件有着根本的不同,比如 1918 年的流感、艾滋病毒爆发、非典、中东呼吸综合征或鼠疫。

现实与任何已知模式都不匹配。我们的社会和政府被迫随机应变,用他们所拥有的科学知识,不幸地低估了问题。

一线希望是,通过对这次疫情的研究,我们将能够开发适当的模型和工具,为下一次疫情做好更好的准备。

平坦的曲线和超级碗休息室休息

曲线变平意味着我们试图控制传播,以避免每个人同时患病,并给我们的医疗保健系统带来无法承受的压力。不同的措施可以而且已经被采用,比如隔离和社会距离。《华盛顿邮报》为此撰写了一篇颇有见地的文章,包括下面的模拟器

来源:who.int 和华盛顿邮报(公共领域)。爆发模拟器

如果我们不采取适当的措施会发生什么,一个很好的例子就是在超级碗期间发生的现象。

在那一天,许多人喝大量的啤酒,这是一种利尿剂,会让你频繁地去洗手间。这导致大量人员在中场休息时离开,给我们城市的卫生基础设施带来巨大压力。当很多人在看下半场的时候,环卫工人正在地下工作,修复倒塌的管道、卫生下水道和其他问题。如果我们不尽一切努力使曲线变平,这种情况很有可能发生。

为了帮助集体解决这场危机,我们必须审视自己的行为。

良好的第一步是意识到这三个认知偏差。

  • 常态偏差导致我们的大脑假设事情会像以前一样“正常”进行,并根据我们的短期经验评估近期的未来。正因为如此,我们可能低估了我们的生活方式受到严重破坏的可能性和影响。
  • 计划谬误导致我们在试图提前计划时过于乐观。苏格兰议会大厦的建设就是一个很好的例子。成本估计为 4,000 万英镑,但最终成本为 4.31 亿英镑。我们自然相信未来会按计划进行。这种心理盲点导致我们没有为突发事件和问题做好准备,包括可预测的和未知的未知。
  • 双曲线贴现偏差是我们倾向于优先考虑短期,低估中长期结果的重要性。由于我们作为一个社会需要评估新冠肺炎疫情的潜在长期影响,而不仅仅是短期影响,这一点现在尤其重要。

个人主义还是集体主义

在分析人类行为时,一个好的方法是回顾进化趋势,试图解释非理性或次优行为。有时候,对我们个人来说是好的,对社会来说却不是最好的,反之亦然。我们期待政府通过制定法律、规则、界限和条例,努力公平地权衡个人愿望和集体需求。社会是博弈论最好的例子。这一理论解释了代理人的选择的相互作用是如何产生与这些代理人的偏好(或效用)相关的结果的,而这些结果可能不是这些代理人所希望的。

不同的文化有重要的差异。个人主义文化鼓励人们把自己看作独立的人。相比之下,集体主义文化认可人们彼此高度关联的思想。个人主义文化强调自我表现和对个性的追求,而不是群体目标,而集体主义文化更喜欢维护社会和谐,而不是坚持个性。

有证据表明,除了文化因素,人类的行为还受到特定基因的影响,如 5-羟色胺转运体基因(SLC6A4),它调节 5-羟色胺能神经传递(5-HTT)。

文化和基因反应都不是巧合,它们是进化的结果。历史上和当代传染病(如疟疾、斑疹伤寒和麻风病)流行较严重的国家更有可能支持集体主义文化规范,这可能是因为集体主义规范可能具有抗病原体防御功能。

在恐惧的氛围中,可以理解的是,人们会自然地倾向于忘记社会的需求,并尽一切努力来获得安全感。如果他们觉得这不是对个人的威胁(例如,年轻和健康),这可能是库存过多(导致短缺)或成为污染图中的一个节点。

我们被进化训练成更个人主义而不是集体主义。然而,我们已经进化到足以认识到我们的个人行为可能是问题的一部分,相信科学,并为了更大的利益做出明智的决定。

数据科学

我们来分析一下各国是如何备战的。

他们创造军队、武器、技术和工具。他们模拟战斗情况,紧急情况,战斗场景以及如何应对各种不同的问题。他们有庞大的预算,后备部队,在和平时期,他们一遍又一遍地训练和模拟。

在医疗保健行业,大规模的模拟无法运行,通常是由于与大型实验和大规模准备相关的成本。因此,这让我们许多人措手不及,因为我们不知道如何周到有效地应对危机的具体想法。

来源:仪表板截图,系统科学与工程中心(CSSE)。公共领域。

然而,我们可以在未来采取行动。冠状病毒是一个改变世界的问题,我们必须从这次爆发中吸取教训,以便为下一次爆发做好准备。我们必须检查相关性,假设因果推理,产生洞察力,可视化,并建立下一代工具,让我们在游戏中领先一步。

有一些与疫情相关的数据集:

就我个人而言,我有许多问题可以通过简单地看一下这些数据来问。

  • 感染率和气候有什么关联?
  • 文化是如何影响它的?文化的哪些方面更有相关性?个人空间?
  • 病毒传播的主要途径是什么?
  • 怎样才能防止下一次感染的传播?我们可以使用机器学习从现有数据中学习吗?
  • 死亡率和其他因素有什么关联?
  • 死亡率高的国家发生了什么?我们可以假设其中一些诊断不足吗?
  • 医疗保健系统容量(即医生数量)和死亡率之间有什么关系。
  • 不同的措施如何影响病毒传播的方式?什么能更有效地控制病毒?

这个列表还可以继续下去。

回答这些问题是至关重要的,并且可以带来拯救生命的突破。这需要工作、合作、资金和技能。

下一次爆发可能会让很多人大吃一惊。

但是,如果我们能够有效地分析这次疫情,我们就可以解决,或者至少最小化我们这个时代的一些最大问题。

齐心协力,我们就能确保这种规模的疫情不再发生。

参考

查尔斯·霍尔姆。25 种认知偏差。揭开理性思维的神话(2015)。

马修·塞德。黑箱思维(2015)。

克里斯·哈德菲尔德。《宇航员在地球上的生活指南——太空之旅教会了我智慧、决心和做好一切准备》(2013)。

丹尼尔·卡内曼。《思考的快慢》(2011)。

华盛顿邮报。电晕模拟器。参考日期 2020 年 3 月 16 日。

哈里·特里安迪斯,米歇尔·盖尔范德。个人主义和集体主义理论(2012)。琼·焦英和凯瑟琳·d·布利金斯基。文化——个人主义-集体主义和血清素转运蛋白基因的基因共同进化(2019)。

焦虑相关性状与血清素转运蛋白基因调控区多态性的关联(1996)。

冠状病毒、远程医疗和种族:模拟现实世界的证据

原文:https://towardsdatascience.com/coronavirus-telemedicine-and-race-part-1-simulated-real-world-evidence-9971f553194d?source=collection_archive---------52-----------------------

使用合成数据的因果推理教程(第 1 部分)

作者的玻璃板照片。

我们会夸大我们的远程医疗应用程序的有效性,声称它将新型冠状病毒感染的风险降低了 16.9%——而事实上它只会将这种风险降低 3.1%。

考虑一个关于虚假关联的经典例子的适时的假设扭曲:最近,冰淇淋的销量一直在下降——凶杀案的数量也在下降。但这并不是因为吃冰淇淋会让人去杀人。这是因为一项社区范围的就地避难的命令被颁布,以防止一种新的传染性病原体的传播。这个令人困惑的因素降低了冰淇淋的销量和凶杀案的数量;因此产生了虚假的相关性。

在这个由两部分组成的教程中,我们将研究一个合成数据集,该数据集受到最近一个涉及新冠肺炎种族差异的医疗保健案例的启发(加格等人,2020奥布里,2020 年。(合成数据是模拟的,而不是真实的,通常是为了教授或学习分析工具而创建的数据。)我们将遵循典型的数据科学分析工作流程。

我们的分析目标将是帮助我们模拟世界中的公共卫生当局减少新型冠状病毒(“冠状病毒”)感染。我们相信我们的数字健康或远程医疗应用可以帮助预防新的感染;例如,通过促进健康的生活方式选择——特别是在社交距离和就地庇护时——来降低冠状病毒感染的风险。但是要做到这一点,我们需要一个无偏的或统计上一致的(即,更大样本的无偏性)估计,来估计我们将要进行的干预的真实效果。

我们将了解混杂因素如何使我们对假设的远程医疗干预的潜在效果的估计产生偏差。从我们的合成数据中出现的偏差如下所示。

在第 1 部分中,我们将分析合成的真实世界证据(RWE)数据。我们将开始了解为什么一般来说,陈述因果机制(例如,有向无环图)和控制所有混杂因素是不够的——假设我们观察了我们数据集中的所有混杂因素。为了估计干预的真正效果大小和方向,我们必须更进一步。这一步使用了总期望法则,这是一个我们实际上一直在使用的简单直观的概念,我们将在第二部分中回顾。

我们将在第二部分中通过分析来自一项合成随机对照试验(RCT)的数据得出结论,在该试验中,我们将应用随机分配给所有试验参与者的 50%。我们将学习如何使用总期望法则,通过 RWE 数据进行因果推断。(在 RWE 和 RCT 的数据集中,无论其他原因如何,该应用对感染风险的平均影响相同;也就是说,应用程序的使用与其他原因没有相互作用。)具体来说,我们将学习如何应用 g 公式(也称为“标准化”)和倾向得分加权来估计真实的总体或平均治疗效果 (ATE)。

在第 1 部分中,我们将分析一个具有三个人级变量的合成 RWE 数据集:infection状态、app使用情况和race(为简单起见,仅黑或白)。

  • 第 1 部分目标:尝试估算应用程序在感染中的使用率,但失败了。我们将 ATE 指定为感染风险的差异,或 风险差异(RD);具体来说,用户中的风险减去非用户中的风险。
  • 我们将学习:如何识别统计对比(如研发)和因果效应之间的差异。混淆了前者和后者,从而错误地估计了 ATE,这将对公共卫生产生深远的影响。

我们将以关键的洞察力来结束第一部分,如果我们错误地从相关性中推断出因果关系:

我们会夸大我们的远程医疗应用程序的有效性,声称它将新型冠状病毒感染的风险降低了 16.9%——而事实上它只会将这种风险降低 3.1%。

数据集特征

观察到的(即非随机化的)RWE 数据在表observational_rwe中。(用附录中的 R 代码生成这个。)

glimpse(observational_rwe)## Observations: 80,000
## Variables: 3
## $ race      <chr> "White", "White", "Black", "White", "White", "White", "Whit…
## $ app       <chr> "used app", "used app", "didn't use app", "used app", "used…
## $ infection <chr> "1\. infected", "0\. uninfected", "0\. uninfected", "0\. uninfe… 

每个观察值(即行)代表最初易感和未感染的独特个体。变量及其唯一值如下:

knitr::kable(apply(observational_rwe, 2, unique)) 

让我们将数据随机分为 80%的训练集用于探索性数据分析(EDA),20%的维持集用于拟合解释模型( Shmueli,2010 )进行最终验证/确认分析。

holdout_proportion <- 0.2
observational_rwe <- observational_rwe %>% dplyr::mutate(rownum = row_number())
set.seed(2004120322)
observational_rwe_training <- observational_rwe %>% dplyr::sample_frac(1 - holdout_proportion)
observational_rwe_holdout <- observational_rwe %>% dplyr::filter(!(rownum %**in**%
  observational_rwe_training$rownum))

*# clean up: remove rownum*
observational_rwe$rownum <- NULL
observational_rwe_training$rownum <- NULL
observational_rwe_holdout$rownum <- NULL 

有 64000 个训练观察和 16000 个保持观察。

探索性数据分析

单变量关联

相关矩阵

dummy_rwe_training <- observational_rwe_training %>%
  dplyr::mutate(
    race = (race == "White"),
    app = (app == "used app"),
    infection = (infection == "1\. infected")
  )
knitr::kable(round(cor(dummy_rwe_training), 4)) 

corrplot::corrplot.mixed(cor(dummy_rwe_training))

即使在这个简单的相关矩阵中,也已经有了未来挑战的迹象。你能认出他们吗?

按应用使用分类的感染(边际模型)

让我们检查一下我们的主要利益关系。

observational_rwe_training %>%
  ggplot2::ggplot(ggplot2::aes(x = app, fill = infection)) +
  ggplot2::theme_classic() +
  ggplot2::geom_bar(position = "dodge") +
  ggplot2::ggtitle("Infections by App Usage") 

df_rwe_training <- with(
  observational_rwe_training,
  cbind(
    table(app, infection),
    prop.table(table(app, infection), margin = 1) # row proportions
  )
)
knitr::kable(df_rwe_training) # row proportions

应用程序用户的感染率(即经验或观察到的感染风险)较低:只有 9.1%的用户感染了病毒,而非用户的感染率为 27.7%。经验 RD 是 0.091 - 0.277 = -0.186,这是一个统计意义上的边际量,因为它没有考虑(即“被边缘化”)任何其他变量。除了潜在的干预(这里是应用程序使用)之外,还考虑了其他变量(这里是种族)的模型被称为条件模型。

out_fisher_rwe_training <- with(
  observational_rwe_training,
  fisher.test(app, infection)
)
out_fisher_rwe_training## 
##  Fisher's Exact Test for Count Data
## 
## data:  app and infection
## p-value < 2.2e-16
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
##  0.2493633 0.2749802
## sample estimates:
## odds ratio 
##  0.2618449 

此外,有强有力的统计证据(即,统计显著性)表明感染因应用使用而异(p_EDA << 0.001). Here, the estimated odds of infection for app users were only 0.262 (i.e., roughly a quarter) that of non-users, with an EDA 95% confidence interval (CI) of (0.249, 0.275).

  • 统计显著性并不意味着重要性:这一强有力的统计证据并不令人惊讶。RWE 数据的典型样本越大,对结果均值中逐渐变小的差异提供的估计就越好(即,对于任何给定的具有有限均值和方差的结果分布集)。这与这些差异的领域(例如,科学、临床、研究、商业)有用性无关。
  • 相关性并不意味着因果关系:这一发现并不意味着使用应用程序会降低感染风险。像这样的统计发现不能暗示因果关系。统计结果是因果关系的暗示,而不是相反。但是它应该促使我们进一步调查,并且应该与随后的发现和假说一起评估,以帮助解释这种联系是如何产生的。

按种族分列的感染情况

种族似乎在某种程度上与感染有关。

observational_rwe_training %>%
  ggplot2::ggplot(ggplot2::aes(x = race, fill = infection)) +
  ggplot2::theme_classic() +
  ggplot2::geom_bar(position = "dodge") +
  ggplot2::ggtitle("Infections by Race")

df_rwe_training_race_infection <- with(
  observational_rwe_training,
  cbind(
    table(race, infection),
    prop.table(table(race, infection), margin = 1) # row proportions
  )
)
knitr::kable(df_rwe_training_race_infection) # row proportions

out_fisher_rwe_training_race_infection <- with(
  observational_rwe_training,
  fisher.test(race, infection)
)
out_fisher_rwe_training_race_infection## 
##  Fisher's Exact Test for Count Data
## 
## data:  race and infection
## p-value < 2.2e-16
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
##  0.1147125 0.1272759
## sample estimates:
## odds ratio 
##  0.1208232 

非裔美国人比白人更有可能被感染(按种族划分的应用使用情况)

重要的是,种族似乎与应用程序的使用密切相关。

非裔美国人使用该应用的可能性低于白人(p_EDA << 0.001): Only 27.2% of African Americans used the app, compared to 88.2% of Whites. Put differently, the estimated odds of using the app for Whites were 20.001 (95% CI_EDA: 18.956, 21.108) times that of African Americans.

observational_rwe_training %>%
  ggplot2::ggplot(ggplot2::aes(x = race, fill = app)) +
  ggplot2::theme_classic() +
  ggplot2::geom_bar(position = "dodge") +
  ggplot2::ggtitle("App Usage by Race")

df_rwe_training_race_app <- with(
  observational_rwe_training,
  cbind(
    table(race, app),
    prop.table(table(race, app), margin = 1) # row proportions
  )
)
knitr::kable(df_rwe_training_race_app) # row proportions

out_fisher_rwe_training_race_app <- with(
  observational_rwe_training,
  fisher.test(race, app)
)
out_fisher_rwe_training_race_app## 
##  Fisher's Exact Test for Count Data
## 
## data:  race and app
## p-value < 2.2e-16
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
##  18.95585 21.10802
## sample estimates:
## odds ratio 
##   20.00128

This finding is plausible also due to structural inequality. For example, suppose our app was only available on iPhone. African Americans are less likely than Whites to own iPhones (e.g., page 7 of Smith,2013 ),这将限制他们对该应用的访问。一般来说,非裔美国人也更难获得远程医疗服务。

解释性建模的含义

这些发现暗示了我们应该如何估计 ATE?种族会影响应用程序的使用和感染风险吗?如果是这样的话,种族将会是一个混杂因素——这意味着我们早先的边际研发估计不足以作为 ate 的估计。(我们将在稍后的第二部分中看到如何实现,以及为什么会这样。)

变量选择

预测建模

假设我们决定拟合一个预测模型。我们认为这可能有助于我们决定是否应该在我们的最终解释模型中包括种族(除了应用程序的使用)。我们将用 logit link(即对应于逻辑回归)拟合 10 重交叉验证的岭正则化广义线性模型(GLM)。

我们将选择app而不管它的系数大小,因为它是我们潜在的干预。不过,我们注意到,自动搜索按系数大小排序的重要预测指标,会使race的排名高于app。我们想知道这样的程序怎么可能从我们所做的其他分析中排除系数较小的真正原因——这些原因对于推荐行动方案很重要。

set.seed(2004110254)
glmnet_rwe_training <- glmnet::cv.glmnet(
  x = model.matrix(
    object = infection ~ app + race,
    data = observational_rwe_training
  ),
  y = observational_rwe_training$infection,
  family = "binomial",
  type.measure = "auc",
  alpha = 0 # ridge: https://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html
)
glmnet_rwe_training$glmnet_preds <- as.numeric(
  predict(
    object = glmnet_rwe_training,
    newx = model.matrix(
      object = infection ~ app + race,
      data = observational_rwe_training
    ),
    s = glmnet_rwe_training$lambda.min,
    type = "response"
  )
)
glmnet_ROC_rwe_training <- pROC::roc(
  response = observational_rwe_training$infection,
  predictor = glmnet_rwe_training$glmnet_preds
)
coef_glmnet_rwe_training <- coef(glmnet_rwe_training)
plot(glmnet_ROC_rwe_training) 

glmnet_ROC_rwe_training$auc # training set cross-validated AUC## Area under the curve: 0.6954coef_glmnet_rwe_training## 4 x 1 sparse Matrix of class "dgCMatrix"
##                        1
## (Intercept) -1.900132655
## (Intercept)  .          
## appused app -0.001874018
## raceWhite   -0.003428336 

重要的是,请注意受试者操作特征(ROC)曲线(AUC)下的面积并不是特别大,即使存在 app 使用对感染风险的真实比率。我们使用模拟参数和模型(见附录)将 ate 计算为-0.031。(我们将在第二部分中推导出这个计算方法。)这个 ATE 的大小适中;因此 AUC 不大。

“解释还是预测?”这些发现强调了( Shmueli,2010 )中关于预测和解释的不同目标、程序和属性的要点。

解释性建模的含义

由于其相对较大的预测系数,我们决定在最终解释模型中保留race,即使在控制了app之后。

提出解释模型

解释性模型是由因果模型和统计模型组成的领域假设。

我们将使用我们的拒绝数据来验证或确认统计模型。

  • 我们无法仅使用我们的 RWE 数据(培训或抵制)来验证或确认因果模型。我们需要进行一项实验或 RCT 来做这件事,或者从科学文献中提供支持我们提出的因果模型的证据。
  • 我们可以——也应该!—清楚地陈述我们假设为真的因果模型。这是科学交流的一个关键部分:它帮助读者在采取进一步行动之前正确地解释和评估我们的发现。
  • 为了用期望的统计能力和证据水平来拟合解释性统计模型,我们还需要指定样本大小。

因果模型

根据我们的发现,我们提出以下因果模型,形式化为有向无环图(DAG) ( Pearl,2009 ):

应用使用→感染

  1. 种族→感染
  2. 比赛→应用程序使用
  3. 在这里,种族混淆了应用程序使用对感染的影响。
DiagrammeR::grViz("
digraph causal {

  # Nodes
  node [shape = plaintext]
  Z [label = 'Race']
  X [label = 'App \n Usage']
  Y [label = 'Infection']

  # Edges
  edge [color = black,
        arrowhead = vee]
  rankdir = LR
  X -> Y
  Z -> X
  Z -> Y

  # Graph
  graph [overlap = true]
}")

统计模型和样本量

根据我们的 DAG,将感染风险建模为种族和应用程序使用的函数是有意义的。我们提出以下逻辑模型。

应用程序用户的估计感染几率为非用户的 exp(-0.343)= 0.709(95% CI _ EDA:0.666,0.756)倍(不考虑种族)。按种族划分的应用程序使用的相应估计感染风险如下:

glm_rwe_training <- glm(
  data = observational_rwe_training,
  formula = as.factor(infection) ~ app + race,
  family = "binomial"
)
summary(glm_rwe_training)$coefficients##               Estimate Std. Error   z value     Pr(>|z|)
## (Intercept) -0.2280908 0.02278461 -10.01074 1.367266e-23
## appused app -0.3432987 0.03249127 -10.56588 4.289439e-26
## raceWhite   -1.9073638 0.03260492 -58.49926 0.000000e+00 

不使用该应用程序的非洲裔美国人为 0.443

risk_didnt_use_app_black_training <- plogis(coef(glm_rwe_training) %*% c(1, 0, 0))
risk_used_app_black_training <- plogis(coef(glm_rwe_training) %*% c(1, 1, 0))
risk_didnt_use_app_white_training <- plogis(coef(glm_rwe_training) %*% c(1, 0, 1))
risk_used_app_white_training <- plogis(coef(glm_rwe_training) %*% c(1, 1, 1)) 
  • 使用该应用程序的非洲裔美国人为 0.361
  • 不使用该应用程序的白人为 0.106
  • 使用该应用程序的白人为 0.077
  • 为了在α= 0.05 的总体统计证据水平下用 80%的统计功效估计非裔美国人的 RD,所需的样本量为:

每个应用使用群体中的 556 名非裔美国人(即用户或非用户)

# https://cran.r-project.org/web/packages/pwr/vignettes/pwr-vignette.html
sample_size_black <- ceiling(
  pwr::pwr.2p.test(
    h = pwr::ES.h(p1 = risk_used_app_black_training, p2 = risk_didnt_use_app_black_training),
    sig.level = 0.025,
    power = .80,
    alternative = "less"
  )$n
)
sample_size_white <- ceiling(
  pwr::pwr.2p.test(
    h = pwr::ES.h(p1 = risk_used_app_white_training, p2 = risk_didnt_use_app_white_training),
    sig.level = 0.025,
    power = .80,
    alternative = "less"
  )$n
) 
  • 每个应用程序使用组中有 1617 名白人
  • 请注意,这些数字是单边假设测试,即在每个种族群体中,应用程序用户的感染风险低于非用户。他们通过要求两个单独的统计假设检验中的每一个都满足统计证据的α= 0.025 水平来调整多重检验(即多重比较、多重性)。

解释性建模(验证/确认)

回想一下,我们的维持数据集有 16000 个观察值。

按应用使用分类的感染(边际模型)

让我们首先检查我们的主要利益关系,就像我们对训练数据所做的那样。

和以前一样,应用程序用户的感染率较低:只有 9%的用户受到感染,而非用户的感染率为 26%。维持经验 RD 为-0.169,类似于训练经验 RD 为-0.186。

observational_rwe_holdout %>%
  ggplot2::ggplot(ggplot2::aes(x = app, fill = infection)) +
  ggplot2::theme_classic() +
  ggplot2::geom_bar(position = "dodge") +
  ggplot2::ggtitle("Infections by App Usage")

df_rwe_holdout <- with(
  observational_rwe_holdout,
  cbind(
    table(app, infection),
    prop.table(table(app, infection), margin = 1) # row proportions
  )
)
knitr::kable(df_rwe_holdout) # row proportions 

解释性模型

检查样本量

对于每个应用程序的使用和种族组合,我们有足够大的样本来满足我们的统计能力和证据要求吗?

是的:每个应用程序使用群体中至少有 556 名非裔美国人,同样至少有 1617 名白人。

observational_rwe_holdout %>%
  ggplot2::ggplot(ggplot2::aes(x = race, fill = app)) +
  ggplot2::theme_classic() +
  ggplot2::geom_bar(position = "dodge") +
  ggplot2::ggtitle("App Usage by Race")

df_rwe_holdout_race_app <- with(
  observational_rwe_holdout,
  cbind(
    table(race, app),
    prop.table(table(race, app), margin = 1) # row proportions
  )
)
knitr::kable(df_rwe_holdout_race_app) # row proportions 

拟合统计模型

基于我们提出的因果和统计模型,我们符合以下逻辑模型。

在对种族进行控制后,有很好的统计证据(p < 0.001)表明应用程序使用和感染之间的关联。这证实了我们的训练数据发现。也有非常有力的统计证据(p <<< 0.001)表明种族与感染风险有关。具体来说,白人感染的估计几率是非洲裔美国人的 exp(-1.934) = 0.145 倍(95% CI: 0.127,0.165)(不考虑应用程序的使用)。

glm_rwe_holdout <- glm(
  data = observational_rwe_holdout,
  formula = as.factor(infection) ~ app + race,
  family = "binomial"
)
summary(glm_rwe_holdout)$coefficients##               Estimate Std. Error    z value      Pr(>|z|)
## (Intercept) -0.3220348 0.04608849  -6.987316  2.801938e-12
## appused app -0.2316567 0.06680031  -3.467899  5.245447e-04
## raceWhite   -1.9344662 0.06675370 -28.979159 1.204740e-184 

应用程序用户感染的估计几率为非用户(不考虑种族)的 exp(-0.232) = 0.793 倍(95% CI: 0.696,0.905)。按种族划分的应用程序使用的相应估计感染风险如下:

不使用该应用程序的非洲裔美国人为 0.42

risk_didnt_use_app_black_holdout <- plogis(coef(glm_rwe_holdout) %*% c(1, 0, 0))
risk_used_app_black_holdout <- plogis(coef(glm_rwe_holdout) %*% c(1, 1, 0))
risk_didnt_use_app_white_holdout <- plogis(coef(glm_rwe_holdout) %*% c(1, 0, 1))
risk_used_app_white_holdout <- plogis(coef(glm_rwe_holdout) %*% c(1, 1, 1)) 
  • 使用该应用程序的非洲裔美国人为 0.365
  • 不使用该应用程序的白人为 0.095
  • 使用该应用程序的白人为 0.077
  • 按种族估计的 RDs 为:

非裔美国人-0.055 (95%置信区间:-0.083,-0.025)

rwe_holdout_rd_black <- risk_used_app_black_holdout - risk_didnt_use_app_black_holdout
rwe_holdout_rd_white <- risk_used_app_white_holdout - risk_didnt_use_app_white_holdout
confint_glm_rwe_holdout <- confint(glm_rwe_holdout) # 95% CIs: odds ratios of infection
rwe_holdout_rd_ci_black <- c(
  plogis(confint_glm_rwe_holdout[, 1] %*% c(1, 1, 0)) - plogis(confint_glm_rwe_holdout[, 1] %*% c(1, 0, 0)),
  plogis(confint_glm_rwe_holdout[, 2] %*% c(1, 1, 0)) - plogis(confint_glm_rwe_holdout[, 2] %*% c(1, 0, 0))
)
rwe_holdout_rd_ci_white <- c(
  plogis(confint_glm_rwe_holdout[, 1] %*% c(1, 1, 1)) - plogis(confint_glm_rwe_holdout[, 1] %*% c(1, 0, 1)),
  plogis(confint_glm_rwe_holdout[, 2] %*% c(1, 1, 1)) - plogis(confint_glm_rwe_holdout[, 2] %*% c(1, 0, 1))
) 
  • -0.018 (95%置信区间:-0.022,-0.01)
  • 结论和公共卫生影响

我们如何估计-0.031 的真实 ate?

尝试 1:抵制经验风险差异

我们可以简单地使用-0.169(即一个边际量)的维持经验 RD 作为我们的 ATE 估计值吗?

在我们的合成数据中,种族通过设计混淆了应用程序使用对感染风险的假定影响。将维持经验 RD 误认为 ate 估计值的真实偏差正好是-0.169 - -0.031 = -0.138。

这突出了一个关键点:

假设我们把这个经验 RD 误认为是对 ate 的估计。我们不知道的是, 在我们的模拟世界中 我们会夸大我们的远程医疗应用的有效性,声称它降低了 16.9%的新型冠状病毒感染风险——而事实上它只会降低 3.1%的风险。

一些公共卫生影响包括:

卫生当局将浪费宝贵的几周时间来部署我们的应用程序并评估其有效性。在此期间,本可以实施更有希望的解决方案。更多的人将成为新感染者,否则他们可能会幸免于难。

  • 医院、政府机构和企业在制定计划时会错误地预计感染率会下降 16.9%。
  • 尝试二:(未完待续……)

我们可以用我们的解释模型来估计 ate 吗?毕竟,我们把种族作为一个混杂因素。我们的种族特异性 RDs 估计值是否为-0.031 的真实 ate 估计值?不幸的是,答案是否定的:ATE 是所有其他变量的平均风险差。(这是一个边际量,不是有条件的量。)

那么,我们能否将 ate 估计为这些估计 RDs 的加权平均值?幸运的是,是的:g 公式确实做到了这一点,我们将在第 2 部分中学习。我们将应用 g 公式来估计 ATE——以及另一种流行的方法,称为倾向得分加权。

但首先,我们将了解 RCT 如何让我们以统计一致或无偏的方式估计 ate。

参考

Aubrey A. CDC 医院的数据指出了新冠肺炎案例中的种族差异。NPR。美国东部时间 2020 年 4 月 8 日下午 2:43。NPR . org/sections/coronavirus-live-updates/2020/04/08/830030932/CDC-hospital-data-point-to-racial-disparity-in-新冠肺炎-cases

RWE 模拟参数和数据生成模型

特征分布

种族:根据美国人口普查,白人的概率被设定为 Pr(Z= 1)=π_ Z= 0.8560091。

结果模型

部分因果模型

种族和应用程序的使用都会影响感染风险。部分 DAG 是:

应用使用(X) →感染(Y)

  1. 种族(Z) →感染(Y)
  2. 这是不全面的,因为我们还没有具体说明应用程序的使用和种族是如何关联的。
DiagrammeR::grViz("
digraph causal {

  # Nodes
  node [shape = plaintext]
  X [label = 'App \n Usage \n (X)']
  Z [label = 'Race \n (Z)']
  Y [label = 'Infection \n (Y)']

  # Edges
  edge [color = black,
        arrowhead = vee]
  rankdir = LR
  X -> Y
  Z -> Y

  # Graph
  graph [overlap = true]
}") 

统计模型

应用程序用户(X=1)的感染风险低于非用户(X=0)。

  • 由于结构性不平等(例如,更好的医疗服务、更高的社会经济地位、更少的潜在健康状况),白人(Z=1)的感染风险低于非裔美国人(Z=0)。
  • 这些统计关系由逻辑模型描述

其中β_ 0 =-0.2381882,β_ X =-0.3,β_ Z =-1.9469256。因此,给定种族和应用程序使用的感染概率为

特别是,感染风险是:

对于不使用该应用程序的非裔美国人,Pr(Y=1|X=0,Z=0) = 0.441

  • 使用该应用程序的非裔美国人的 Pr(Y=1|X=1,Z=0) = 0.369
  • 对于不使用该应用程序的白人,Pr(Y=1|X=0,Z=1) = 0.101
  • 对于使用该应用程序的白人,Pr(Y=1|X=1,Z=1) = 0.077
  • 我选择这些参数值来反映截至 2020 年 4 月 10 日的已知情况,正如最近一个涉及新冠肺炎种族差异的医疗保健案例中所报告的那样( Garg 等人,2020奥布里,2020 )和这篇华盛顿邮报的文章。模拟中仿真的表是:

倾向模型:应用使用

a <- round((1 - prInfectionGivenBlack) * prBlack, 3)
b <- round(prBlackGivenInfection * prInfection, 3)
c <- round((1 - prInfectionGivenWhite) * prWhite, 3)
d <- round(prWhiteGivenInfection * prInfection, 3)
knitr::kable(
  dplyr::tribble(
    ~Race, ~Uninfected, ~Infected, ~`Row Total`,
    "Black", a, b, a + b,
    "White", c, d, c + d,
    "Column Total", a + c, b + d, a + b + c + d
  )
) 

部分因果模型

种族影响应用使用。例如,假设我们的应用程序只能在 iPhone 上使用,而非裔美国人比白人更不可能拥有 iPhone(例如, Smith,2013 第 7 页)。此外,假设非裔美国人很难获得远程医疗服务,因此往往不太了解这类应用程序。

也就是说,部分 DAG 是:

比赛(Z) →应用程序使用(X)

  1. 统计模型
DiagrammeR::grViz("
digraph causal {

  # Nodes
  node [shape = plaintext]
  Z [label = 'Race \n (Z)']
  X [label = 'App \n Usage \n (X)']

  # Edges
  edge [color = black,
        arrowhead = vee]
  rankdir = LR
  Z -> X

  # Graph
  graph [overlap = true]
}")

白人比非裔美国人更有可能使用这款应用。这种统计关系由逻辑模型描述

其中α_ 0 =-1,α_ Z = 3。因此,给定种族使用该应用的概率为

特别是:

Pr(X=1|Z=0) x 100 = 26.9%的非洲裔美国人使用该应用程序

  1. Pr(X=1|Z=1) x 100 = 88.1%的白人使用该应用程序
  2. 因果模型

完整的 DAG 是:

应用使用(X) →感染(Y)

  1. 种族(Z) →感染(Y)
  2. 比赛(Z) →应用程序使用(X)
  3. RWE 模拟 R 代码
DiagrammeR::grViz("
digraph causal {

  # Nodes
  node [shape = plaintext]
  X [label = 'App \n Usage \n (X)']
  Z [label = 'Race \n (Z)']
  Y [label = 'Infection \n (Y)']

  # Edges
  edge [color = black,
        arrowhead = vee]
  rankdir = LR
  X -> Y
  Z -> Y
  Z -> X

  # Graph
  graph [overlap = true]
}")

关于作者

##### Set simulation parameters

### Preliminaries
random_seed <- 2004101447
sample_size_observational <- 80000

### Feature distribution
piZ <- 0.755 / (0.755 + 0.127) # race (based on U.S. Census)

### Outcome model

# beta0 and betaZ are derived from:
#   https://www.cdc.gov/mmwr/volumes/69/wr/mm6915e3.htm
#   https://www.npr.org/sections/coronavirus-live-updates/2020/04/08/830030932/cdc-hospital-data-point-to-racial-disparity-in-covid-19-cases
#   https://www.washingtonpost.com/news/powerpost/paloma/the-health-202/2020/04/09/the-health-202-los-angeles-is-racing-to-discover-the-true-coronavirus-infection-rate/5e8de70588e0fa101a75e13d/

prInfection <- 0.15
prBlack <- 1 - piZ
prWhite <- piZ
prBlackGivenInfection <- 33 / (33 + 45)
prWhiteGivenInfection <- 1 - prBlackGivenInfection
prInfectionGivenBlack <- prBlackGivenInfection * prInfection / prBlack
prInfectionGivenWhite <- prWhiteGivenInfection * prInfection / prWhite

beta0 <- log(prInfectionGivenBlack / (1 - prInfectionGivenBlack)) # baseline: infection risk for African Americans who don't use app
betaX <- -0.3
betaZ <- log(prInfectionGivenWhite / (1 - prInfectionGivenWhite)) - beta0 # average influence of being White on infection risk

### Propensity model: app usage
alpha0_observational <- -1 # observational real-world evidence: baseline probability of using app for African Americans
alphaZ_observational <- 3 # observational real-world evidence: average influence of being White on probability of using app

##### Generate data.
set.seed(random_seed)
observational_rwe <- dplyr::tibble(
  race = rbinom(n = sample_size_observational, size = 1, prob = piZ),
  app = rbinom(n = sample_size_observational, size = 1, prob = plogis(alpha0_observational + alphaZ_observational * race)),
  infection = rbinom(n = sample_size_observational, size = 1, prob = plogis(beta0 + betaX * app + betaZ * race))
) %>%
  dplyr::mutate(
    race = ifelse(race == 1, "White", ifelse(race == 0, "Black", NA)),
    app = ifelse(app == 1, "used app", ifelse(app == 0, "didn't use app", NA)),
    infection = ifelse(infection == 1, "1\. infected", ifelse(infection == 0, "0\. uninfected", NA))
  )

Daza 博士是一名生物统计学家和健康数据科学家,而不是流行病学家,他为个性化(n-of-1)数字健康开发因果推断方法。| ericjdaza.com🇵🇭🇺🇸@埃里克森 linkedin.com/in/ericjdaza|statsof1.org@ stats of@ fsbiostats

版权 2020 埃里克·j·达扎和 Stats-1。保留所有权利。

职位也可在https://rpubs.com/ericjdaza/599497获得。

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

Note from the editors:Towards Data Science is a Medium publication primarily based on the study of data science and machine learning. We are not health professionals or epidemiologists, and the opinions of this article should not be interpreted as professional advice. To learn more about the coronavirus pandemic, you can click here.

冠状病毒:疾病背后的数据

原文:https://towardsdatascience.com/coronavirus-the-data-behind-the-disease-68c912f1a5e0?source=collection_archive---------21-----------------------

苹果 | 谷歌 | SPOTIFY | 其他 | 剪辑

杰瑞米·霍华德在 TDS 播客

编者按:迈向数据科学播客的“攀登数据科学阶梯”系列由 Jeremie Harris 主持。Jeremie 帮助运营一家名为sharpes minds的数据科学导师初创公司。可以听下面的播客:

1 月中旬,中国对湖北省一连串不寻常的肺炎病例展开了官方调查。不出两个月,这一系列病例将像滚雪球一样发展成一个全面的疫情,全球范围内将有数十万人——甚至数百万人——受到感染,这有可能引发一波自 1918 年西班牙流感或大萧条以来从未见过的经济损失。

指数式增长使我们从几个孤立的感染发展到今天的地步,这是完全违反直觉的。这给需要确定冠状病毒传播特征的流行病学家以及必须根据他们的建议采取行动并说服普遍自满的公众实施拯救生命的社会距离措施的政策制定者带来了许多挑战。

随着 coronas 的盛开,我认为现在是联系杰瑞米·霍华德的好时机,他是非常受欢迎的机器学习教育网站 Fast.ai 的联合创始人。杰里米和他的联合创始人雷切尔·托马斯一起撰写了一份现已流行的报告,概述了一个关于冠状病毒的数据驱动案例。我们聊了很多话题,以下是一些重要的收获:

  • 新冠肺炎病例的指数增长有许多违反直觉的后果,其中之一是很难估计可靠的死亡率。许多天真的估计要么高估了死亡率,低估了真实病例(包括无症状和有症状前的携带者)的数量,要么低估了死亡率,没有考虑到感染检测和威胁生命的症状出现之间的延迟。说到底,获得合理估计的唯一方法是依赖生存分析等技术,这些技术被设计用于处理经过审查的数据(正在进行的病例的结果尚不可知)。
  • 在处理指数级失控的问题时,贝叶斯模型非常重要:低估 10%的病毒增长系数可能意味着数百万例感染的差异,产生一个非常长的可能病例数尾巴,这对医疗系统避免崩溃的能力具有严重影响。
  • 在这种时候,学术界和政府间的清晰沟通是非常重要的。这意味着良好的数据可视化和对统计效应的清晰描述对于确保人们不会被他们所面临的威胁的性质误导是极其重要的。杰里米指出了这个问题的一个重要例子,即最近的一项研究表明冠状病毒的传播具有明显的季节性,但该研究利用了糟糕的数据可视化来表达其观点,导致了不应有的怀疑。

你可以在 Twitter 上关注杰里米,你也可以在 Twitter 上关注我

夹子

YouTube.com

我们正在寻找能与我们的观众分享有价值的东西的客人。如果你碰巧知道谁是合适的人选,请在这里告诉我们:publication@towardsdatascience.com

通过使用 Python 显示通知来跟踪您所在国家的冠状病毒

原文:https://towardsdatascience.com/coronavirus-track-coronavirus-in-your-country-by-displaying-notification-c914b5652088?source=collection_archive---------9-----------------------

为了避免关于冠状病毒的假新闻,您可以创建一个 python 脚本来更新您的信息。

到被更新关于冠状病毒(新冠肺炎)在你居住的地区的传播,我决定向你展示如何使用 python 和一些库来获取数据和显示 Windows 10 通知

背景图片由 Felicity Yick 经由thedp.com

过程设计

"计划就是把未来带入现在,这样你现在就可以做些事情了."艾伦·莱克因

medbadrcUnsplash 上拍摄的照片

首先,我们必须找到一个可靠的网站 提供我们需要的数据。我决定在这个项目中使用

截图:作者

网站给了我们一个现成的数据集,不同的数据作为列,不同的国家作为行。

因此,我们必须找到并过滤 web 元素,以获取数据,然后将其显示在通知上。****

设置环境

首先,我们需要安装Python将其添加到路径:****

截图:作者

然后我们必须安装 3 个库:

  1. win 10 toast:Python 库以 显示 Windows 10 的 Toast 通知。**
  2. bs4:Python 库用于 从 HTML 和 XML 文件中提取数据**
  3. 请求 : 一个优雅简单的 HTTP 库 为 Python

要安装,打开命令提示符 (CMD)和键入这些命令:

打开命令提示符 (CMD)并输入这些命令来安装下面的 python 包:

****pip install win10toast
pip install bs4
pip install requests****

现在我们准备好开始编码

编码

带上你的咖啡,让我们从创建一个新的 python 脚本导入所有必要的开始:

****from win10toast import ToastNotifier
from bs4 import BeautifulSoup
import requests
import time****

然后我们将创建并初始化一些变量:

变量:类型:角色
country
:str:
国家名称
notification_duration : int : 通知显示时间(秒)
*refresh_time*😗*int:两次通知之间的时间间隔(分钟)
*woldmetersLink**😗****

****country = "Tunisia"
notification_duration = 10
refresh_time = 10 #minutes
worldmetersLink = "[https://www.worldometers.info/coronavirus/](https://www.worldometers.info/coronavirus/)"****

现在让我们获取网页:

****try:
    html_page = requests.get(worldmetersLink)
except requests.exceptions.RequestException as e: 
    print(e) #ConnectionError
    continue****

现在让我们检查 网页获取数据。我们可以看到这个表在div标签中,所有的数据在tbody标签中,每个国家的信息在tr -> td中。
所以层级是:div -> tbody -> tr -> td

截图:作者

所以,我们使用 CSS 选择器来搜索匹配那些 CSS 类(div,tbody,tr,td)的标签:

****search = bs.select("div tbody tr td")****

然后我们使用[get_text](https://www.crummy.com/software/BeautifulSoup/bs4/doc/#get-text)()方法获取标签下的文本(国家名称)然后我们使用[find](https://www.crummy.com/software/BeautifulSoup/bs4/doc/#find)()来提取满足我们限制的第一个元素,即国家名称。

****start = -1
for i in range(len(search)):
    if search[i].get_text().find(country) !=-1:
        start = i
        break****

然后我们将标签之间的数据存储在一个数组中:

****data = []
for i in range(1,8):
    try:
        data += [search[start+i].get_text()]
    except:
        data += [0]****

现在我们必须生成一个 str ,其中包含通知的消息:

****message = "Total infected = {}, New Case = {}, Total Deaths = {}, New Deaths = {}, Recovred = {}, Active Case = {}, Serious Critical = {}".format(*data)****

是时候使用我们的 win10toast 模块了,我们从创建一个对象到 ToastNotifier 类开始:

****toaster = ToastNotifier()****

然后,我们使用 show_toast 函数,该函数接受以下参数:

标题 :包含通知标题。 消息 :包含通知消息。 持续时间 ”:指定通知销毁活动持续时间。 icon _ path:它包含了到的路径。ico 文件。(那是可选的)(我用了一个图标,你可以在 Github 库 上找到)。**

****#toaster.show_toast(title, notification message, duration, icon)toaster.show_toast("Coronavirus in {}".format(country) , message, duration = notification_duration , icon_path ="icon.ico")****

最后但同样重要的是,我们将代码放在一个无限循环中:

****While True :
#our code****

并将此行添加到循环的末尾以刷新软件:

****time.sleep(refresh_time * 60) #parameter in seconds****

代码清理

图片由杰马斯托克freepik.com上拍摄

让我们看看国家=“中国”的结果:

Windows 10 通知截图:作者

嗯,我们可以看到成功地抓取了数据,但是的格式不正确,我们可以看到“+”、随机空格和“,”。

让我们清理一下我们的数组。事实上,data = ['80,824 ','+11 ',' 3,189 ','+13 ',' 65,573 ',' 12,062 ',' 3,610 ']或者我们想要更干净的版本所以我们要把它改成:data = ['80.824 ',' 11 ',' 3.189 ',' 13 ',' 65.573 ',' 12.062 ',' 3.610']

从:
数据= ['80 824 ',' + 11 【T19 ',' 3 189 ',' + 13 ',' 65 573 ',' 12062 ',' 3 610 '] 【T30]到:【t3t

我们将添加一个名为 data_cleanup 的函数,该函数将一个不清理数组作为参数并清理它

让我们做一个函数 来为我们清洗数组(它的参数就是免清洗数组)。我们称之为data_cleanup函数。记住,函数定义总是以def开头,后面是函数名、括号(parameter)和冒号:

提醒:Python 字符串[strip](https://docs.python.org/2/library/string.html#string.strip)()方法:去掉字符串开头和结尾的空格:

****def data_cleanup(array):
    L = []
    for i in array:
        i = i.replace("+","") 
        i = i.replace("-","")
        i = i.replace(",",".")
        if i == "":
            i = "0"
        L.append(i.strip())
    return L****

所以结果是:

****# " +3,420   " >>> "3.420"****

现在我们只需在生成消息之前使用这个函数:

****data= data_cleanup(data)****

成品

FreepicFreepic.com上设计

让我们看看最后的结果吧:

  1. 国家=中国

截图:作者

Windows 10 通知截图:作者

2.国家=突尼斯

Windows 10 通知截图:作者

截图:作者

瞧😄

下面是 完整源代码 :

**** [## AhmedAzizKhelifi/冠状病毒追踪你的国家

显示您所在国家的冠状病毒数据的 Windows 10 通知。…

github.com](https://github.com/AhmedAzizKhelifi/coronavirusTrackYourCountry)

我将脚本打包在 EXE 文件中。你可以在git repos上找到可执行文件

更新

如果希望仅在数组值改变时显示通知我们可以添加一个新变量(列表)data_check,初始化data_check=[]并将time.sleep(最后一行)替换为:

if data_check!= data:
    data_check = data
    toaster = ToastNotifier()
    toaster.show_toast("Coronavirus {}".format(country) , message, duration = notification_duration , icon_path ="icon.ico")   
else:
    time.sleep(refresh_time*60)
    continue

所以 最后的代码添加了这个特性之后看起来是这样的:

最后一句话

最后,我会提醒你注意安全,记住预防胜于治疗。

图片来源worldindependant.com****

感谢阅读!😄

****

查看我的其他文章并关注我的 中型****

哈利菲·艾哈迈德·阿齐兹

探索冠状病毒推特趋势

原文:https://towardsdatascience.com/coronavirus-twitter-trends-d32fed5a027e?source=collection_archive---------40-----------------------

新冠肺炎·疫情改变了世界。它如何改变了我们的推文?

莎拉·谭和黛比·哈姆

来源: edar ,via: pixabay (CC0)

介绍

在过去的四个月里,疫情冠状病毒颠覆了全世界人民的生活。人们被敦促呆在家里,因为各国关闭了边境,争相减缓病毒的传播。学校已经关闭,学生已经被送回家继续虚拟学期(包括我们的留学项目 DIS Copenhagen)。

在这个前所未有的时代,人们做出了各种各样的反应。许多国家、政治领导人和世界卫生组织都因其对危机的处理而受到批评。特别是,自武汉疫情爆发以来,中国一直是仇恨的目标,因此,反亚裔种族主义有所抬头。像安东尼·福奇博士和纽约州州长安德鲁·科莫这样的人物在这场危机中脱颖而出。

我们想进一步了解冠状病毒时期是如何影响人们的观点、态度和心态的。我们将 Twitter 作为衡量这些变化的来源,Twitter 是一个微博和状态更新的社交媒体平台。

数据收集

世卫组织新冠肺炎时间轴上的第一个事件发生在 2019 年 12 月 31 日,当时武汉市报告了一系列肺炎病例,并发现了一种新型冠状病毒。因此,我们选择那一周作为“冠状病毒时期”的起点。为了挖掘推文,我们使用了在 GitHub 上找到的库,因为它允许我们通过关键词、日期和语言进行搜索。在 2019 年 12 月 29 日至 2020 年 4 月 25 日期间的每个星期,我们每个关键词收集(最多)1000 条推文,我们将搜索限制在英语热门推文。为了评估冠状病毒期间的总体趋势,我们每周额外收集 1000 条没有指定关键词的推文。

关键词:

{ '冠状','病毒','冠状病毒',' covid19' }

{ '亚洲','中国','中国','武汉' }

{ '福齐','库莫' }

我们选择了一些与病毒直接相关的关键词,以及我们预计在频率或情感方面发生了变化的关键词。例如,我们有一组与中国相关的关键词,因为疫情始于中国武汉,并导致反亚洲情绪高涨。我们还有福奇和科莫,这两个人物在疫情事件后受到了关注。

基线数据:为了更清楚地了解这段时间内推文的变化,减少偏差,我们将通过挖掘疫情之前(1 月至 11 月)2019 年每个月的 1000 条热门推文来建立基线。通过与基线进行比较,我们希望将先前存在的趋势与可归因于最近事件的趋势区分开来。

数据清理:对于词频分析,我们分割字符串,然后删除停用词(由 nltk 库定义)、标点符号和链接。对于情感分析,我们只移除了链接。

方法

为了确定推文的情绪,我们使用了 nltk 图书馆的 VADER 包。这个软件包给出了给定文本的四个不同的分数:负面、中性、正面和复合。前三个是与该类别对齐的文本比例,因此它们的总和总是 1。复合得分的不同之处在于,它是每个单词的化合价得分的标准化加权复合得分。这是一个有用的衡量标准,可以根据以下标准判断文本是负面、中性还是正面

  • 负复合分数<= -0.05
  • neutral: -0.05 < compound score < 0.05
  • positive: compound score > = 0.05

对于每个关键词类别中的所有推文,我们计算了其情感得分。然后,我们按周确定该关键词类别的平均情感得分。这样做可以让我们跟踪人们对每个关键词的感受,以及从 12 月下旬到现在,这种感受是如何随着时间的推移而变化的。

对于词频分析,我们简单地统计了几周内每个关键词类别中每个词的出现频率。在这样做的时候,我们排除了计算关键词的频率,因为这些推文是通过寻找这些关键词挖掘出来的。从每个计数器中,我们找到 100 个最常用的单词,并将它们合并成一个集合。然后,我们利用这些数据创建了一个矩阵,其中列代表一周,行代表集合中的一个词,以及该词在该周推文中的出现频率。

结果

词频分析

我们通过为每个关键词创建词频矩阵并将其上传到fluid来创建条形图比赛动画。这些动画显示了最常用的词——一般 Twitter 数据集的前 25 个词和每个关键词的前 15 个词——按周显示,显示了主题受欢迎程度的变化。这些动画中显示的一些单词是没有意义的(例如,在一般的 Twitter 动画中,“like”是该数据集中最常见的第一个单词),但我们仍然可以通过我们的数据观察到有意义的趋势。

与“fauci”连用的词频

经常与“中国”连用的词

在这两次关键词条形图竞赛中,我们看到最常用词的变化有相似的模式和时间线。在新冠肺炎时间线的早期阶段,每个关键词最常见的词都与当时其他紧迫的话题有关,与新冠肺炎无关。“福奇”一词中有流感或艾滋病毒等词,与流感季节、他作为 NIH 主任的角色以及他在艾滋病/艾滋病毒领域的突出地位有关。与此同时,“中国”的图表被政治关联的推文所主导,如伊朗、俄罗斯、美国和战争。然而,新冠肺炎开始以多种形式(如“冠状病毒”、“冠状病毒”、“病毒”等)迅速占据这两个排行榜的首位。对于“中国”,“病毒”首次进入前 15 名是在 1 月 5 日的那个星期,大约在这个时候,中国首次宣布了一种神秘的类似肺炎的疾病,我们现在知道这种疾病就是新冠肺炎。从那以后,“冠状病毒”以及与之相关的词,如“武汉”、“病例”和“爆发”,占据了图表的主导地位。同样,《福西》中“nih”、“transmission”和“director”等词的使用也在增加,因为公众被介绍给了福奇博士,他原本是一个相对不为人知的人物。

我们看到,在时间线的早期,Twitter 上的对话主要是关于病毒的信息和与病毒相关的数字。然而,我们看到从三月份开始,谈话从信息转移到更具政治微妙性的话题。“川普”迅速上升到排行榜的首位,反映了他在新冠肺炎的简报和他对新冠肺炎的观点/看法的流行。人们不是以医学或信息的方式寻找或谈论新冠肺炎;到目前为止,大多数人都非常熟悉这些信息。因此,随着政府机构和公众考虑并试图应对疫情的后果,关于这些术语的讨论范围扩大了。

经常与“电晕”一起使用的词

这个条形图比赛特别突出了人们对新冠肺炎的联想和特定主题。可以预见的是,在一开始,“电晕”推文中的热门词汇是“病毒”、“中国”、“中国人”等等。“特朗普”将在 2 月中旬进入图表,因为白宫冠状病毒特别工作组(White House Coronavirus Task Force)以及他的简报会开始认真进行。有趣的是,在此期间,“恶作剧”非常流行,这可能是由于缺乏对新冠肺炎的广泛了解以及当时新冠肺炎在美国的影响相对较小。然而,到了 3 月,“恶作剧”从排行榜的前 25 名中滑落,“停留”和“家”等词开始流行。随着各州发布居家隔离令,居家隔离成为许多人的新常态。

冠状病毒时期的常用词(2019 年 12 月 29 日至 2019 年 4 月 25 日)

与上面的关键词条形图比赛相比,我们在一般 Twitter 数据集中看到的单词更加多样,更不具体,这是可以预料的,因为这些单词来自随机的推文。从这张图表中,我们可以大致了解 Twitter 上的热门话题,以及不同话题与公众相关需要多长时间。例如,今年 2 月,“伯尼”进入了前 25 名,这与几场有争议的民主党初选的领先优势以及他的支持者对社交媒体的普遍使用相一致。

我们可能已经预料到“冠状病毒”或相关术语会在 2 月份出现得更多,因为此时世卫组织已经宣布进入全球卫生紧急状态,特朗普政府已经限制外国公民从中国旅行。相反,我们看到,“冠状病毒”在 3 月 1 日的一周首次出现在前 25 名中,在 3 月 8 日的一周达到顶峰,然后在 3 月 15 日的一周排名下降。这可能是偶然的,因为这些是随机的推文,但是也可以被解读为冠状病毒的最初恐慌,关于它的信息变得更加广泛,然后随着人们收集了足够多的关于 COVID-10 的信息,人们对它的关注度逐渐降低,他们开始适应新的“正常”。15 日的那一周,“隔离”也出现在图表上,反映了这一现象。

关键词提及增加

在数据收集过程中,我们注意到,对于几个关键词,图书馆在最初几周检索到的数量远远低于 1000 条推特的限制。换句话说,这些关键词没有被广泛讨论。然而,随着时间的推移,他们的提及率直线上升。我们在这里绘制了他们每周的推文数量:

1 月 12 日当中国宣布首例猪流感死亡时,提及“电晕”、“冠状病毒”和“武汉”的推文数量都达到峰值。这种病毒的科学术语“covid19”还需要一个月才能得到更广泛的使用。一个月后,福奇和科莫因为他们的持续努力获得了更多的关注。随着这座城市结束封锁,开始回归正常生活,提到“武汉”的次数似乎已经开始减少。

情绪分析

基线比较

作为基线,我们绘制了 2019 年 1 月至 11 月 Twitter 总体情绪的进展。首先,推特上的情绪似乎有很大的可变性。积极情绪通常在 1.00 到 0.50 之间,换句话说,陈述是 50%到 100%积极的。中性和负面情绪介于 0.0 和 0.30 之间。

在冠状病毒时期,我们预计正面情绪会减少,负面情绪会增加。然而,我们惊讶地发现的负面情绪得分更低。在 3 月的第一周,积极情绪出现了一次明显的下滑,这一周美国报告了第一例死亡病例。

通过关键字进行情感分析

来自冠状病毒相关关键词的见解:在疫情开始之前,术语“冠状病毒”大多与啤酒联系在一起。我们可以看到,“日冕”开始时的复合情绪始终高于零,或为正。然而,三月标志着意义的变化:复合情绪转化为消极情绪,消极情绪的水平呈上升趋势。

令人惊讶的是,新冠肺炎的负面情绪很低,而正面情绪很高。我们注意到“冠状病毒”也有类似趋势。复合情绪的最大跌幅出现在 3 月份,当时各国开始采取更严厉的措施。例如,欧盟禁止大多数旅行者进入欧盟之外。在美国,像加利福尼亚这样的州发布了就地安置令。查看原始数据,我们可以看到许多推文是关于病毒健康和安全更新的公告、新闻标题、筹款和推广病毒预防协议。所有这些话题都倾向于中性或积极的情绪。这里有几个例子:

“100 万美元,这是你帮助我们在@脸书网站上为#COVID19Fund 在 24 小时内筹集的金额。每一点都有助于@世卫组织对抗#COVID19 疫情。但是我们现在不能停止,我们需要更多来对付#冠状病毒。加入战斗并捐款:http://bit.ly/38Pz11xpic.twitter.com/4jwqgBWbt9"

“什么是# SocialDistancing?它意味着避免拥挤的地方和非必要的聚会。这是我们必须做的,以防止#COVID19 的传播,并帮助尽可能多的加拿大人保持健康。# cdn health pic . Twitter . com/3 O3 aw 6 vjpu "

贾斯廷·特鲁多总理与魁北克省总理@ francoislegault 讨论了#COVID19 的发展。点击此处阅读通话摘要:【http://ow.ly/1CQJ50yLXuI

最初几周的情绪看起来与其余几周明显不同。查看原始数据,我们意识到该库提取了 twitter 句柄中带有“covid19”的用户的推文。因此,在前三周,推文中没有提到病毒,这解释了情绪上的差异。

洞察中国相关关键词:“武汉”是唯一一个对这段时间有意义的洞察的词。其他三个术语(“亚洲”、“中国”和“中国”)的波动与基线数据相似。与“病毒”关键字一起,这表明在此期间更一般的术语的用法没有显著变化。我们在整个期间观察到负面复合情绪,在 2020 年 1 月 5 日和 2020 年 4 月 5 日出现两次异常峰值。这并不奇怪,因为冠状病毒是在武汉首次报道的,许多人认为那里的早期病例处理不当。

公众人物观点关键词:我们预计福奇和科莫的人气会随着时间的推移呈上升趋势。然而,我们没有发现任何重大变化,他们的情绪波动与基线相似。我们确实观察到福奇的积极情绪得分略高于基线。虽然基线推文的正面情绪得分在 1.0 到 0.50 之间,但福奇的正面情绪得分在 1.0 到 0.75 之间,特别是在他越来越受欢迎的时候,

结论

我们承认,Twitter 数据可能无法准确代表所有人口统计的情绪和前景。如果我们使用不同的数据源,比如新闻媒体,我们可以期待看到非常不同的结果。受到冠状病毒负面影响的人可能不会在 Twitter 上发布消息,或者没有时间发布关于他们不幸的消息,特别是那些社会经济地位较低的人。名人和其他处于特权地位的人面临着社交媒体帖子的反弹,这些帖子对人们因疫情而面临的挑战麻木不仁。

总的来说,我们预计冠状病毒期间 Twitter 上的负面情绪会更高。我们期望看到更多的人抱怨隔离生活和社会距离。事实上,我们看到了一些中立情绪的高涨。作为一种潜在的解释,我们发现许多与冠状病毒关键词相关的推文都是关于新闻和健康/安全更新的。我们还预计在冠状病毒期间,对亚洲人的负面情绪会减少。然而,我们惊喜地发现,总体情绪保持不变。看到大量关于筹款、促进安全指南意识和认可一线工人的推文令人振奋。

参考

[## Twitter 数据挖掘:挖掘没有 API 键的 Twitter 数据。

使用一行命令获取旧的 Twitter 大数据进行分析。

medium.com](https://medium.com/@IrekponorVictor/twitter-data-mining-mining-twitter-data-without-api-keys-a2a2bd3f11c) [## 世卫组织时间轴-新冠肺炎

2019 年 12 月 31 日中国报告了湖北省武汉市的聚集性病例。一种新型冠状病毒最终被…

www.who.int](https://www.who.int/news-room/detail/27-04-2020-who-timeline---covid-19) [## cjhutto/Vader 情操

VADER 情绪分析。VADER(价感知词典和情感推理机)是一个词典和基于规则的情感…

github.com](https://github.com/cjhutto/vaderSentiment)

冠状病毒:使用机器学习对新冠肺炎患者进行分类

原文:https://towardsdatascience.com/coronavirus-using-machine-learning-to-triage-covid-19-patients-980e62489fd4?source=collection_archive---------21-----------------------

分析和分类真实的病人咳嗽声。

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

注: 本文讨论的方法背后的方法论来源于我和来自卡迪夫大学的Irene Anthi以及来自法国 CHU Montpellier 的 Patrick Fafet 博士之间的一个合作项目。

介绍

在近 5 个月内,当前的新型冠状病毒(新冠肺炎)将爆发一年。尽管我们还远远不知道如何全面应对这种病毒,但我们已经看到了一些非常酷的社交距离技术解决方案(如点餐应用),以及医疗领域的解决方案(如自动检测肺部 x 光片中的肺炎样迹象)。

几周前,我们共同的一个朋友带着一个假设找到了我们。Patrick Fafet 博士是法国蒙彼利埃 CHU 的医学博士,他和他的团队对通过电话表达 COVID 症状的患者进行了分类。他们很快意识到,除了已知的病毒症状外,患者是否患有 COVID 的一个可能指标是他们咳嗽的区别。随着突然激增的患者打电话并要求由医生进行测试或检查,需要一种支持对可能的 COVID 患者进行分类的解决方案。

已知呼吸声具有诊断特性。也有一些初步证据表明,呼吸声,特别是咳嗽,可能是病毒的迹象。直到最近,这种信号通常是在使用听诊器进行人工听诊时收集的。研究现在已经开始使用数字技术来收集身体的声音,并对数据进行自动分析。

这篇文章讨论了我们应用机器学习来分析和分类 COVID 阳性和 COVID 阴性患者咳嗽声的初步方法。本实验中使用的数据是使用电话分诊系统从真实患者收集的,并同意用于训练学习模型。这些数据目前还不能公开。

数据分析

用于构建模型基础的初始数据集由 251 个. mp3 文件和一个. csv 电子表格组成,该电子表格详细说明了它们的 ID 和作为其标签的 COVID 测试结果。

一些患者详细信息的分布显示在下面的直方图中。这些数据包括大量阴性 COVID 患者,以及大量女性参与者和不吸烟的参与者。该数据集还包括年龄在 8 至 81 岁之间的患者,其中大部分患者年龄在 22 至 34 岁之间。

患者在数据集中的分布

Fafet 博士指出,对于人耳来说,COVID 和非 COVID 咳嗽之间的主要区别之一是患者的吸气有多不清楚。在这种情况下,我们首先分析了患者咳嗽的差异,特别是咳嗽后吸入空气的差异。

当我们谈论声音时,我们通常谈论一系列不同压力强度的振动。所以想象声音意味着以某种方式想象电波。我们可以通过将音频文件转换成频谱图来实现这一点。频谱图是信号随时间变化时频谱的直观表示。

为了将数据转换成声谱图表示,我们使用了 LibROSA ,这是一个用于音乐和音频分析的开源 Python 包。由此产生的表示可以显示为 2D 图像,并被称为短时傅立叶变换(STFT)。由于人类以对数标度感知声音,我们将 STFT 转换为梅尔标度,这是频率标度非线性转换的结果。这个 Mel 标度被构造成使得在 Mel 标度上彼此距离相等的声音对于人类来说也是“听起来”的,因为它们彼此距离相等。LibROSA 库允许我们加载一个音频文件,并使用以下代码片段将其转换为 melspectrogram:

音频到声谱图由 achillessin 提供

在对光谱图进行人工分析后,阳性和阴性患者之间的吸气差异很明显。可以看出,与阳性患者相比,阴性 COVID 患者咳嗽后的进气清晰度。在同一个光谱图中,我们用绿色标记来识别病人在哪里吸气。通过眼睛,可以看到 COVID 患者咳嗽后的吸气不清晰,并且检测到一些低频声音。

阴性(左)和阳性(右)新冠肺炎咳嗽频谱图

阴性(左)和阳性(右)新冠肺炎咳嗽谱图——分析吸入剂

特征选择

数据集预处理、特征提取和特征工程是从底层数据中提取信息的步骤。在机器学习的背景下,这些信息对于预测样本的类别应该是有用的。在音频分析中,这一过程很大程度上是基于找到音频信号中有助于将其与其他信号区分开来的成分。

我们用基于频率的变量分析了咳嗽的声音。这些指纹捕捉通用的音频信息,并对无法轻易手工制作的细微差别或模式进行编码。Joel Jogy 的名为' 的帖子我是如何理解的:在训练音频文件时需要考虑哪些特性? 概述了为音频分类任务建立模型可能需要的一些最重要的特征,并包括如何使用 LibROSA 提取这些特征。

从咳嗽样本中提取的一些特征是:

  • 基于色度的特征,计算信号中存在的每个半音音高类别(c、C♯、d、D♯、e、f、F♯、g、G♯、a、A♯、b)的数量。
  • 梅尔频率倒谱系数。Pratheeksha Nair 的帖子名为“MFCC 假人指南 ”指出,人类发出的任何声音都是由其声道的形状决定的(包括舌头、牙齿等)。如果这个形状能够被正确地确定,那么产生的任何声音都能够被准确地表现出来。
  • 过零率衡量给定时间帧内信号幅度通过零值的次数。
  • 频谱质心是给定声音的“亮度”指标,代表频谱重心。如果你要取频谱,用它做一个木块,试着在你的手指上平衡它(横过 X 轴),当它成功平衡时,频谱质心将是你的手指“接触”的频率。
  • 频谱滚降是指包含 99%频谱能量的频率。
  • 与其响度对应的波形的均方根(RMS)。

神经网络

一旦我们成功地从底层音频数据中提取了特征,我们就开始用 Keras 和 Tensorflow 后端拟合一个简单的神经网络。

Gideon Mendels 的“帖子名为“ ”如何将机器学习和深度学习方法应用于音频分析 ”介绍了如何将音频特征转换为 NumPy 数组,如何对分类标签进行编码,以及如何将数据拆分为训练集和测试集。在我们的例子中,我们将数据分成 70%的训练和 30%的测试。我们还缩放特征值。也就是说,我们转换数据,使其符合 0 和 1 的范围。

一旦设置了参数,您就可以使用类似于以下代码的内容来定义和编译一个简单的神经网络架构。由于这是一个二元分类问题,即我们试图对咳嗽声是 COVID 阳性还是 COVID 阴性进行分类,因此应该说明二元交叉熵。

关于神经网络的更多内容,我们强烈推荐杰森·布朗利(Jason Brownlee)的电子书《机器学习大师》。

一旦训练完成,就对模型进行评估。基于最初的小数据集,我们的结果表明咳嗽声可以以近 80%的准确率预测新冠肺炎。

结论

那么,我们从这个分析中学到了什么?

这些结果仅仅触及了这类数据潜力的表面;虽然我们的结果是一个积极的迹象,但它们还不足以构成一个独立的筛选工具。准确检测咳嗽声的细微差别是一项非常具有挑战性的任务。

然而,该模型被释放到野外,并集成为电话录音软件的一部分。这是为了确保从受试患者那里收集更多的数据。用新收集的数据系统地重新训练该模型,并且调整参数以实现尽可能高的精度。应答者根据他们的咳嗽得到呼叫者患 COVID 可能性的准确度分数。利用该信息以及其他症状和他们与患者的对话,应答者能够确定患者是否需要被查看和/或测试。

作为改进模型的一部分,我们的下一步是研究咳嗽声的频谱图是否也可以被纳入。声音分类的要素也可以作为使用卷积神经网络的传统图像分类任务来处理,这可以实现更高的精度。

整合到分类软件中的新冠肺炎咳嗽分析仪

冠状病毒:发展中国家面临什么威胁?

原文:https://towardsdatascience.com/coronavirus-what-does-the-data-say-for-pakistan-cacfe51b76c3?source=collection_archive---------1-----------------------

让数据科学变得有趣

初步数据分析,用于评估感染人数上升后巴基斯坦面临的风险

疾控中心Unsplash 拍摄的照片

注:本文 并不预测 巴基斯坦的冠状病毒病例数,因此,不应该成为恐慌的来源。相反,本文估计了特定情况下的病例数, 当且仅当那些情况发生** 时,以强调及时预防措施的重要性。

最近几周,由于冠状病毒,世界上发生了很多事情。随着死亡人数的上升和边境的关闭,像巴基斯坦这样的发展中国家在情况变得更糟之前能从其他国家学到什么?

考虑到巴基斯坦的动态和人口结构,我将尝试根据世界上一些遭受严重打击的国家来估计巴基斯坦的潜在风险,以努力强调开始认真对待它的重要性。以下是我在这篇文章中将要涉及的内容:

  • 世界冠状病毒病例和死亡病例概要。
  • 如果不及早遏制,巴基斯坦的情况会有多糟糕?
  • 巴基斯坦的卫生基础设施能够应对吗?
  • 【概要】是否可以避免?巴基斯坦人能做什么?

1.世界冠状病毒病例和死亡病例概要

注:文章发表后,数字可能会改变。

在撰写本文时,新冠肺炎冠状病毒已经传播到全球超过 176 个国家和地区。虽然中国和韩国等少数国家似乎已经控制住了病毒,因为新病例数量正在迅速减少,但在世界其他地区,病毒刚刚开始呈指数增长。

随着超过 221,926 例确诊病例和 8,999 例死亡,各国政府被迫关闭边境、市场、学校和机构,并采取许多其他严厉措施试图遏制病毒。

让我们首先简要地看一下与中国、韩国、欧洲和美国的病毒传播相关的一些图表。

确诊感染病例

下图显示了世界上一些受影响最严重的国家的确诊病例数。

图 1:全球冠状病毒确诊病例数

由于中国采取了严厉的措施,那里的新病例数量最终似乎有所下降,但情况正呈指数级增长,在 T2、T4、欧洲、美国和美国,情况变得更糟。让我们放大图表的这一部分。以下是除中国以外的国家的图表:

图 2:全球冠状病毒确诊病例数(不包括中国)

命运

由于许多因素的影响,不同地区和国家的死亡率确实不同,但⁴的最新研究估计全球死亡率为 1.4%,大大低于先前估计的 2-3%。

以下是不同国家的死亡人数图表:

图 3:全球冠状病毒致死病例数

放大呈指数增长的曲线,我们会看到下面的图表:

图 4:全球(不包括中国)因冠状病毒导致的死亡人数

本节中的所有图表应该为您提供足够的线索,说明该病毒如何在人群中呈指数级传播,并且对于许多国家来说,这似乎只是灾难性情况的开始。

即使整个世界立即停止,新病例仍将呈指数级出现至少再过 5-14 天,因为这是病毒的潜伏期,使医疗系统和基础设施的情况恶化。

巴基斯坦人应该期待什么?

  • 预计在接下来的几周内,即使采取了严厉的措施,病例数仍会增加。
  • 这种病毒不分国界,如果政府和人民不采取足够的预防措施,它会很快降临到你头上。
  • 如果疫情扩散到一定程度,预计贵国的经济和基础设施将受到严重影响。

2.如果不及早遏制,巴基斯坦的情况会有多糟糕?

坏消息:与许多其他国家相比,巴基斯坦主要城市的感染人数可能会高得多(非常非常高)。

好消息:巴基斯坦的死亡率(占确诊病例的百分比)可能会低得多。

根据目前有限的数据,很难预测巴基斯坦的感染和死亡人数,事实上,此时任何预测都只是猜测,可能会导致恐慌。

然而,除了预测感染人数,我们可以尝试将病毒呈指数传播的其他国家的数据和情况应用到巴基斯坦的人口统计中,并尝试估计巴基斯坦的数字,只有在情况变得更糟的情况下。

我将以德国的情况为例,因为它:

  • 不是病毒的起源。
  • 拥有良好的卫生基础设施(最大限度地减少医疗管理不善的影响)。
  • 在指数增长之前没有采取足够的预防措施。

关于巴基斯坦的一些事实

  • 世界上人口最多的五个国家之一,有几个城市人口密度很高。
  • 与意大利/欧洲相比,一天的平均社交圈和互动要高得多。(无数据,这是我个人观察)
  • 与德国/欧洲相比,国际游客的数量要少得多。另一方面,国内旅游业规模可观。
  • 拥有世界上最年轻的人口。

巴基斯坦主要城市的高人口密度和较高的平均社交圈有助于病毒的传播,而国际游客数量的减少会产生相反的效果。

2.1 病毒传播与人口密度

假设人口密度与病例增加率至少有某种联系是很直观的,但这需要根据数据进行验证。

一个技巧是预测一些国家相对于中国的人口密度的累计病例数,看看它们是否会变得相似,就像它们的人口密度一样。密度变得相似。

图 5:一些国家/地区的人口密度

左边的图表显示了武汉(中国最大的城市)、德国和意大利的人口密度。

我们想看看,如果德国和意大利的人口密度接近武汉的人口密度,它们的冠状病毒病例上升会是什么样子。

我将德国和意大利的冠状病毒病例数曲线换算成它们与武汉人口密度的比率,随着它们的人口密度接近武汉,曲线变得非常相似。

下面的图 6 解释了这种行为。为了便于比较,曲线也被时移。

注:为简单起见,并且因为每个国家的主要地区感染人数最多,所以没有使用个别地区的曲线。

图 6:基于相对人口密度的预测感染

上面的图表是什么意思?

它表明,如果不同国家的人口密度相似,那么它们的感染率会变得非常相似。但是这种只有在案例达到某个阈值后才会发生(因为曲线需要时移)。

每个国家和地区的门槛不同(见下图 7)。在本文的其余部分,我们将这个阈值称为感染阈值。

在一定数量的感染被确认后,不同国家的病例(指数)增长是相似的。

人口密度越高,病毒传播越快

重要的是要明白,实验并不一定意味着感染的增加与人口密度成正比,因为可能有太多其他因素参与其中。

任何基于两个国家相对人口密度的估计都可能只能表明,如果一个国家开始出现类似的情况,那么基于另一个国家的估计会有多少病例。

2.2 冠状病毒感染的估计数量

如前所述,预测一个国家的冠状病毒病例是不太可能的,因为有太多的未知因素,这篇文章并不打算通过猜测来煽动恐慌。

因此,我将使用德国的病毒传播率,根据巴基斯坦主要城市与德国的相对人口密度(在病例数超过阈值后),找出这些城市可能的感染人数。这实际上意味着:

如果巴基斯坦开始出现类似德国的情况,卡拉奇、拉合尔和拉瓦尔品第的病例数超过某个阈值,我们很容易接近本节估计的冠状病毒病例数,除非提前采取预防措施。

让我们从比较卡拉奇、拉合尔和拉瓦尔品第(巴基斯坦的三大城市)相对于其他地区/国家的人口密度开始。

图 7:几个地区/国家的人口密度(平方公里)

卡拉奇和拉合尔非常高的人口密度很容易成为冠状病毒的温床,可能会在很短的时间内导致非常高的感染人数。

下图显示了卡拉奇、拉合尔和拉瓦尔品第感染人数的估计增长,在每个城市超过 159 例感染(巴基斯坦三个城市的感染阈值)后,如果巴基斯坦发生类似德国的情况。

卡拉奇、拉合尔和拉瓦尔品第的相对人口密度系数取自图 7,然后乘以图 6 的德国感染上升曲线,分别估算卡拉奇、拉合尔和拉瓦尔品第的感染上升。

图 8:巴基斯坦主要城市的估计感染情况(如果每个城市超过 159 例)

上图显示,如果病毒的传播没有在早期阶段得到控制,巴基斯坦人口密集地区将面临潜在的灾难性局面。

如果没有采取预防措施,卡拉奇的病例数超过 159 例,并且病毒像在德国一样传播,那么卡拉奇可能在接下来的 14 到 16 天内有超过 50 万的感染者。

希望这永远不会发生,因为巴基斯坦政府似乎已经开始采取一些措施试图控制病毒。但是如果真的发生了,那么 T2 的前景对巴基斯坦来说将会非常黯淡。

2.3 估计死亡人数

巴基斯坦是世界上人口最年轻的国家之一,这可能会导致更低的死亡率(确诊+确诊病例的百分比)

我们还没有非常准确的冠状病毒死亡率,因为疫情仍在进行中,还有许多未解决的感染病例。这也确实取决于地区和国家,在韩国的 0.6%和伊朗的 4.4%之间,我们应该使用哪个?

对于这个案例研究,不同年龄组世界平均死亡率应该足够了。

例如,让我们比较一下巴基斯坦和 Italy⁴的人口年龄组以及全球冠状病毒死亡率。

图 9:意大利和巴基斯坦年龄组与冠状病毒死亡率的比较

图 8 显示了对巴基斯坦相对积极的画面。巴基斯坦的人口(蓝绿色条)比意大利的人口(橙红色条)年轻得多,估计表明老年人口的死亡率高得多。该年龄组的死亡率(红色条)可以在 y 轴中间显示为白色文本。

据估计,巴基斯坦的冠状病毒死亡率相对低于世界其他地区(如果患者得到适当治疗)。

例如,理论上,巴基斯坦的死亡率应该至少比意大利低 4 倍。

基于巴基斯坦的人口统计数据和各年龄组冠状病毒的死亡率,让我们根据图 8 所示的估计感染人数来估计死亡人数。

图 10:巴基斯坦主要城市的估计死亡人数(在每个城市超过 159 例感染后)

即使死亡率低得多,我们也看到了很高的死亡人数,因为感染人数要高得多。因此,在巴基斯坦的主要城市尽可能地限制感染人数是至关重要的。

3.如果情况变得非常糟糕,巴基斯坦的卫生基础设施能够应对吗?

短长回答:没有

巴基斯坦是世界上公共卫生支出占 GDP 百分比最低的国家之一,每 1000 people⁵只有 0.6 张病床。相比之下,德国每 1000 人拥有 8.5 张床位。

在卡拉奇这样的大城市,情况尤其糟糕,那里的人口达到了惊人的 1491 万。在这个城市的卫生基础设施陷入混乱之前,传染病的传播还能持续多久?让我通过一些图表再给你们展示一下。

这张图表显示了巴基斯坦各地可用的医院床位。

图 11:巴基斯坦医院床位容量

对于一个拥有 1491 万人口(即卡拉奇)的城市来说,在短短 14 天内估计有 50 万以上的感染病例,甚至巴基斯坦所有的 13 万以上的医院床位都无法处理如此大量的患者。

当然,并不是所有的病毒携带者都需要住院治疗,所以我们在评估时应该考虑到这一点。

图 12:冠状病毒轻度、重度和危重患者的百分比(图片来源)

左边的图表由 Association⁶美国医院制作,显示了需要住院治疗的冠状病毒重症和危重患者的估计百分比。

为了简单起见,我们将同样对待严重和关键的情况,因为这应该足以证明这一点。

使用图 8 中卡拉奇的估计感染人数以及所有患者中 18.5%的患者需要住院治疗的估计,我们可以得出以下图表:

图 13:巴基斯坦卡拉奇估计的冠状病毒患者给信德省医疗系统带来的负担

即使该省所有的医院床位都已经空了,估计需要住院的卡拉奇病人的数量将在不到 12 天的时间里耗尽全省的能力。

显而易见,如果本节描述的巴基斯坦主要城市的情况开始发生,巴基斯坦的医疗保健系统陷入混乱只是几个星期的事情,因此,会导致进一步的传播。

此外,估计是根据德国的情况进行的,德国甚至不是冠状病毒袭击最严重的国家。基于意大利情况的估计会更糟,那里的病毒传播速度比德国快得多。

4.是可以避免的吗?巴基斯坦人能做什么?

是的,虽然很难,但事实上是可以避免的,也是可以控制的,中国已经证明了这一点。

最新数字显示有 189 例 确诊 病例。由于缺乏卫生设施以及医生数量不足,可能少报病例数,实际情况可能已经比报告的情况更糟,只有在大量死亡开始发生时才会显现出来,但到了那个阶段,可能就太晚了。

无论如何,对巴基斯坦来说还不算太晚。如果在政府层面采取足够的措施,并且人们认真对待他们的个人和社会责任,那么这是很有可能得到控制的

如果没有,那就等着它狠狠地打击你吧。

巴基斯坦人应该担心吗?

担忧的主要原因:

  • 它可能会感染大城市的大量人口。
  • 大约%的康复病人似乎终生肺功能减退。这可能导致大约 20-30%的人口肺功能下降。
  • 它将彻底耗尽国家的医疗保健系统。
  • 经济活动将会瘫痪。

令人担忧的次要原因:

  • 会有人死亡。

一些预防措施

这篇文章的主要目的不是列出人们可以采取的所有预防措施和步骤,但这里有一个最重要的简短列表:

  • 社交距离:尽可能避免与人见面,尤其是任何形式的身体接触。
  • 在公共场所接触任何物体表面后都要洗手。
  • 当不能洗手时,使用洗手液(酒精浓度大于 60%)。
  • 如果你出现 nose⁷,高烧,咳嗽,呼吸困难,和/或从感染区回来,在家里连续隔离 14 天直到症状出现。
  • 如果症状恶化,寻求医疗帮助,但要确保通过戴口罩和保持至少 2-3 英尺的距离来保护其他人。
  • 随着大量猜测的出现,只寻找真实的信息来源,并保持更新。

常见问题

病毒是通过空气传播的吗?

大多数研究表明 no⁸.

一些新的研究说是的,但只是在很短的时间内。因此,只要你离被感染的人 2-3 英尺远,这可能不是一个问题。

——洗手液有效吗?

⁹washing·汉兹是你最好的机会。但是当没有肥皂和水的时候,酒精洗手液(酒精含量大于 60%)是一个实用的选择。

——口罩有效吗?

⁷Better 比没有任何东西,但不是很有效,因为病毒可以穿透口罩,甚至还通过眼睛传播。

—冠状病毒是否就像流感一样,只是被夸大了?

⁰Totally 不是,冠状病毒比流感致命至少 10 倍到 30 倍。

参考

[1] 世界冠状病毒病例

[2] 巴基斯坦人口统计

[3] 按国家分列的《世界人口评论》

[4] 意大利人口统计资料

[5] 巴基斯坦卫生部门的状况

冠状病毒:今天就行动,否则人们将会死亡

【7】如何保护自己免受冠状病毒

[8] 冠状病毒是空气传播的并不意味着在劫难逃

不是所有的洗手液都能抵抗冠状病毒

冠状病毒看起来没有以前那么致命,但仍然不像流感

[11] 冠状病毒数据集

[12] 巴基斯坦各省的药房和床位

【13】冠状病毒恢复损害肺功能

较低的死亡率带来了一线希望

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

冠状病毒:哪个国家做对了?

原文:https://towardsdatascience.com/coronavirus-which-country-got-it-right-b25023f52666?source=collection_archive---------49-----------------------

在世界各地,各国对冠状病毒的反应各不相同。数据能告诉我们哪种政策策略最有效吗?

尼古拉斯·霍伊泽在 Unsplash 上拍摄的照片

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

内容

在这篇文章中,你会发现:

  • 动态 choropleth 图——指示迁移率的变化
  • 线形图 —描绘了锁定在降低移动性方面的有效性
  • 散点图——比较受病毒影响国家的谷底和回升
  • 箱线图 —比较各国对冠状病毒爆发的反应范围,以相对于基线的百分比变化来衡量

什么是谷歌移动报告?

二月初,谷歌推出了新冠肺炎社区移动报告。这些报告使用从谷歌地图等应用中收集的匿名数据来衡量移动模式的百分比变化。这个数据集由谷歌自己定期更新,可以在这里找到。用于本分析的最新日期是 6 月 20 日。

目的地的特定类别已在谷歌的研究中确定,并测量了这些目的地的访客数量。例如,已经记录了去药房的次数,并将其与之前记录的基线日进行比较。

什么是基准日?

基准日可被标记为“正常日”,并已被选为 2020 年 1 月内的平均值。一月份去药店或零售店的次数提供了一个移动性的基线值,我们将在其他日子与之进行比较。例如,假设移动模式在周末和工作日之间发生变化,则给出了一周中每天的基线值。

我们来看看吧!

自疫情开始以来,零售商和娱乐中心的游客数量发生了怎样的变化?

各国的流动性差异

  • 意大利是第一个从 3 月 9 日开始实施隔离的国家,这使得意大利人的流动性减少了大约 90%。封锁于 5 月 18 日解除,持续了整整两个月零一周零两天。法国的强制隔离开始于 3 月 17 日,比意大利晚一周,并遵循了与其邻国相似的流动趋势。

  • 瑞典没有实施封锁,但从 3 月 20 日起其机动性下降了 20% 。学校、咖啡馆、餐馆和商店仍然开放,以避免经济衰退。与大多数欧洲国家不同,居家政策只是政府的一项建议。瑞典公民自愿将其流动性从基线水平降低 10%至20%。
  • 新西兰于 2020 年 3 月 19 日关闭边境,并于 3 月 25 日建立全国封锁。这可以在线图中清楚地看到,迁移率在 -90% 附近急剧下降。4 月 27 日,封锁限制被部分解除,5 月 13 日完全解除。这两个日期都标志着新西兰公民的流动性增加。然而,我们可以注意到,尽管该国没有宣布新的病例,但流动性尚未恢复正常,这表明在没有政府义务的情况下正在采取预防措施。
  • 从 3 月 22 日开始,印度至今仍处于封锁状态,自那以后已经延期两次。这应该在 6 月 30 日结束,也就是印度大部分地区封锁的预定结束日。他们的流动性从基线下降到 -70% ,并在过去两个月中设法保持在这一水平,使印度成为锁定期最长的国家。

谁答对了?

下面的散点图显示了每个国家的“从病毒中反弹”行为的水平。

x 轴 是各个国家流动性的平均变化值。美国和瑞典在最右边,因为他们的流动性平均只改变了大约 -10% 。而意大利、法国或新西兰等国家则完全停滞不前,流动性大约下降了 80%**

y 轴 是过去两周各国记录的最大移动值。各国的最新趋势是启动经济,鼓励回归日常生活,这条轴线是对由于开放而增加的流动性的衡量。例如,由于封锁还没有解除,印度和许多南美国家仍然处于下半部分。

我们希望国家在哪里…

最有可能的情况是:一个国家进入高度封锁状态,人口流动性大幅下降,但现在已经反弹,人口流动性几乎恢复正常。这些国家位于散点图的左上角,包括新西兰、法国和意大利。

W orst 案例情景:一个进入重度封锁、流动性大幅下降但仍未能减少冠状病毒病例以解除隔离的国家。这些国家包括印度,但许多拉丁美洲国家,如巴西,智利和阿根廷,今天仍然完全隔离。

E 例外:瑞典和美国以及其他北欧国家和一些非洲国家,没有对流动性施加严格的限制,因此不需要大举卷土重来……这些国家将位于散点图的右上方。其中最小移动性很低,但是最大“返回”移动性很高。

各大洲内的明显趋势

在创作这个情节时,我决定给每个大陆涂上不同的颜色。我发现了一些有趣的事情:

  • ****欧洲国家的回答范围很广,因为它们分散在 x 轴的整个长度上。然而,他们从较低的流动性中恢复得非常好,因为他们在 y 轴上始终高于其他国家,这意味着他们在过去两周内已经恢复到几乎“正常”的流动性模式。
  • ****拉丁美洲国家只能在散点图的左下方区域看到,这意味着它们的流动性大幅下降,但尚未设法弥补这一下降。
  • ****亚洲非洲覆盖了完整的散点图,没有指向特定的趋势。在本分析的下一步中,我将研究特定大陆的流动性变化,特别是覆盖大面积地理区域并因此具有不同气候、人口密度和文化的大陆。

结束语

在写这篇文章的时候,我没有研究每个国家在任何特定时刻冠状病毒病例的数量。这可能会非常有见地地解释为什么国家进入和退出封锁。各国测量每日新增病例数量和量化死亡人数的方式大相径庭,在我看来,这将掩盖谷歌移动报告提供的普遍和同质数据。

从谷歌移动性报告提供的信息中可以得出更多的见解。本文只是一个初步的评价。更多更新即将到来,请在下面评论您希望在即将到来的更新中看到您的原籍国或居住地。****

F 或者深入分析如果这个数据看看这篇文章 : 谷歌的报告能解释新西兰战胜病毒的原因吗?

** [## 谷歌的移动报告能解释新西兰战胜病毒的原因吗?

对疫情早期社会距离和锁定政策的数据驱动分析。

towardsdatascience.com](/can-googles-mobility-report-explain-new-zealand-s-win-against-the-virus-9e036ace0a2)

Github 知识库

所有代码都可以在 Github 上的 after_covid.py 文件中找到这里

非常感谢你的阅读!

如果你喜欢我的作品,我会非常感激你跟随我来到这里。

如果您对如何改进有任何问题、建议或想法,请在下面留下评论或通过 LinkedIn 这里取得联系。**

CoronaXiv:人工智能驱动的基于弹性搜索的新冠肺炎研究论文搜索引擎

原文:https://towardsdatascience.com/coronaxiv-b2b36d725e2e?source=collection_archive---------52-----------------------

变更数据

利用 NLP 和 ElasticSearch 的力量以人工智能的方式为对抗新冠肺炎疫情做出贡献!

CoronaXiv 标志。来源:作者

我们在 2020 年 HackJaipur 打造的产品 CoronaXiv 从全国 350 多个团队中脱颖而出,获得了 【最佳弹性搜索产品】 的称号。我们在这篇博文中解释了我们制作 CoronaXiv 的方法。

什么是 CoronaXiv?

CoronaXiv 是一个由 ElasticSearch 驱动的人工智能搜索引擎,它索引了 60k+的研究论文,这些论文是为了应对全球疫情的 Corona 病毒而堆积起来的,那里的研究人员每天都在发布新的论文,试图了解这种病毒的本质,并试图找到治愈它的方法。CoronaXiv 是一款 web 应用程序(即将成为 PWA ),基于以下技术架构:

  1. PyTorch(伯特模型)
  2. nltk
  3. vue . j
  4. 弹性搜索
  5. Python3
  6. 赫罗库

如您所见,CoronaXiv 融合了许多现代工具、框架和模型。这帮助我们让我们的东西快速工作,节省了我们重新发明轮子的时间!我们的项目在这里可用。要试用 CoronaXiv,请访问http://www . CoronaXiv 2 . surge . sh。(目前,由于我们用尽了 ElasticSearch 的免费限制,它已经下降,但我们很快就会恢复!)

CoronaXiv 解决什么问题?

许多研究人员在全球各地远程工作,这些地方的封锁限制各不相同。一些研究人员在实验室工作,而一些在家里工作。为了帮助他们努力击败疫情冠状病毒,任何研究人员拥有一个专门的新冠肺炎论文搜索引擎都将非常方便,并且还可以获得人工智能推荐的其他类似论文的链接,从而节省他们的时间。在这场与全球疫情的战斗中,每一秒都是宝贵的,因此,我们建立了 CoronaXiv,这是一个以弹性搜索为动力的人工智能搜索引擎,用于搜索与冠状病毒相关的研究论文。

在当前的场景中,人们会执行 Google 搜索来查找一些研究论文。然而,通常情况下,某些关键词会产生与疫情冠状病毒无关的结果,并且也缺乏 UX,因为用户每次都必须回到主屏幕,从一篇论文切换到另一篇论文。使用 CoronaXiv,人们可以轻松地直接访问论文,使用不同的聚类可视化来帮助用户理解不同论文的关系,并基于关键字识别论文,或者访问基于相似域聚类的论文。

来源: Freepik

CoronaXiv 是一个搜索平台,允许研究人员从互联网上堆积的杂乱研究论文中搜索他们希望看到的最重要的论文,因为每天都有新的新冠肺炎研究论文问世。到目前为止,CoronaXiv 已经积累了超过 6 万篇研究论文,可以根据各种标准顺利地对研究论文进行索引,还允许研究人员根据各种过滤器搜索论文,如发布日期范围、同行评审、总浏览量/引用量、H-index 等。我们目前正致力于增加更多这样的过滤器,以提高生活质量。

我们是如何构建 CoronaXiv 的?

来源: Freepik

眼前的问题不是小事。作为一项巨大的任务投入其中无异于自杀。因此,我们需要将我们的主要目标分解成几个更小的目标(模块化方法)来实现它们。我们项目开发中涉及的步骤包括:

  1. 预处理 Kaggle 上提供的 CORD-19 数据集
  2. 使用 Altmetrics & Scimago 等外部 API 获取额外的元数据
  3. 使用 CovidBERT (根据医学文献微调的预训练 BERT 模型)生成单词嵌入
  4. 使用主成分分析(PCA)和 t 分布随机邻居嵌入(tSNE)来降低嵌入维数,确保我们的搜索引擎的更快性能
  5. 从 60k+论文语料库中获取聚类信息并提取关键词
  6. 将研究论文语料库的最终 CSV 与 ElasticSearch 整合
  7. 构建 web 应用的前端,并将其与 ElasticSearch 集成

步骤 1-5 都是在 Jupyter 笔记本上执行的,该笔记本将在未来公开。第 6-7 步是真正的故事展开的地方。

构建 CoronaXiv 时面临的挑战

CORD-19 数据集的预处理阶段花费了很长时间,但我们最终提取了关于要使用和显示的每张纸的有用信息,并生成了嵌入,以帮助人工智能决策。由于多次失败的调用请求,API 非常慢,占用了我们黑客马拉松的大量时间。在由于 PCA 和运行模型的时间约束而保留的信息上进行权衡,其中时间约束被给予优先权。

来源: Freepik

对于基于关键字的索引,我们可以对每个查询使用基本的 TF-IDF,然后随时与关键字进行匹配。更重要的是,我们的服务器在处理多个请求的情况下会出现瓶颈,因为我们只有一个深度学习模型实例,因此它一次只能服务一个请求。因此,这将是一个极其缓慢的实现,并且会占用大量的资源和时间。这时我们遇到了 ElasticSearch

弹性搜索

ElasticSearch ,是一个分布式、开源的搜索和分析引擎,针对不同类型的文本数据。使用 Elastic,人们可以基于关键字执行高效且极快的全文搜索。使用我们的 CovidBERT 嵌入和弹性搜索的能力,我们可以得到最相关的论文的结果,按重要性递减的顺序排序。论文摘要或摘录总结了整篇论文并讨论了论文中所讨论的内容。因此,由于并非所有论文都有摘要,所以数据是在论文摘录的基础上进行索引的。这有助于加快检索过程,因为我们已经从一个非常压缩的论文内容表示中建立了索引。

老实说,我们以前从未使用过 ElasticSearch ,我们对此没有任何经验。所以我们从文档开始。这个包中解释得很好的文档指导我们以一种极其有效和简洁的方式使我们的服务器与 ElasticSearch 交互。由于我们的技术栈是作为后端的 Flask 和作为前端的 Vue.js ,我们决定使用 ElasticSearch 的官方 Python 包,这个包可以在这里找到,并由世界各地的开发人员不断维护。

我们用这个包创建了索引,每次前端发出请求时,服务器都会与 ElasticSearch 交互,并提供与特定标签相关的结果,然后我们将结果提供给用户。我们还创建了一个脚本,可以帮助我们在特定的索引中批量插入许多文档。该脚本基本上接受您的 ElasticSearch 帐户的凭证,创建一个索引,并一次添加多个文档。

最终产品(或者是?)

我们的最终产品在黑客马拉松的时间框架内勉强完成。感谢 2020 年 hack Jaipur 的组织者非常友好和理解,由于许多人在封锁期间面临的互联网问题,应多名参与者的请求,截止日期延长了 5 个小时。该项目的演示如下:

CoronaXiv 演示

这是我们团队的一个非常雄心勃勃的项目,我们希望我们可以通过每个版本的更新功能来不断改进我们的网站。因此,我们的团队期待着维护这个网站,至少直到世界摆脱这个疫情。我们将请求 ElasticSearch 团队帮助我们在免费层下维护这个项目,或者赞助我们雄心勃勃的项目!

来源: Freepik

我们对 ElasticSearch 和 HackJaipur 2020 的体验

一旦我们理解了文档,就很容易把它和我们的项目联系起来。ElasticSearch 帮助我们扩展了我们的产品,否则我们的产品会留在本地主机或其他地方。我们很快就掌握了使用 ElasticSearch 的诀窍,这要归功于 Elastic 的高级开发者倡导者阿拉文德·普特勒乌举办的 ElasticSearch 演示研讨会。

这是我们团队的第一次远程黑客马拉松,也是国家级的!为期一周的研讨会非常吸引人,令人兴奋。因为这是一个虚拟的黑客马拉松,我们使用 WhatsApp 和 丨t丨e丨l丨e丨g丨r丨a丨m丨s丨 进行交流。我们真的很喜欢 HackJaipur 给我们的这种独特的体验,我们想对 HackJaipur 2020 的整个组织团队和赞助商如大联盟黑客ElasticSearch 、GitHub 等表示感谢。

2020 年 HackJaipur 随机团队的成功外出!来源:剪贴画

关于开发商

我们是团队随机。我们忙着做决定。随着每个时代的到来,我们做出下一个决定。毕竟这个世界上的任何事情都是随机的!您可以通过我们会员的个人资料联系他们:

  1. Arghyadeep Das: GitHubLinkedIn
  2. 纳齐基特·布塔: GitHubLinkedIn
  3. 尼兰什·马图尔: GitHubLinkedIn
  4. 杰耶什·尼夫: GitHubLinkedIn

编码快乐!😄

冠状病毒和概率——媒体现在必须学会如何报道统计数据

原文:https://towardsdatascience.com/coronovarius-and-probability-the-media-must-learn-how-to-report-statistics-now-973ed2d52959?source=collection_archive---------5-----------------------

随着新冠肺炎的广泛恐慌,媒体必须了解两个非常不同的统计数据之间的差异。

来源:https://www.bbc.co.uk/news/uk-51759602

来源:https://www.bbc.co.uk/news/uk-51771815

“潜在症状”这个短语出现在几乎所有新闻报道中,在这些报道中,有人死于看似普通的事件。无论是过敏患者,还是冠状病毒(“covid”)的受害者,“潜在症状”短语都是用来减轻恐惧的。作为一个忧郁症患者和统计学家的不幸组合,每当我看到这样的新闻文章时,我都会立即浏览找到相关的行,并对自己说“唷,我没事了”。当然,这是难以置信的自我中心思想。但是,只要媒体报道了无条件的可能性,公众(当然也包括我)的个人危险感就会增强。

无条件概率与条件概率

为了更好地解释我正在谈论的问题,我们将不得不稍微看一下统计数据,我将在这里尽可能保持它的基本性,稍后我们将进入一点更详细的内容。

假设我们想预测投掷时骰子落在数字 6 上的概率,我们想知道:

P(Die = 6)

其读作“骰子等于 6 的概率”。现在假设我们想预测骰子落在数字 6 上的概率,因为我们知道(不管出于什么原因)它一定落在大于 3 的数字上。然后我们想知道:

P(Die = 6 | Die > 3)

其中竖线“|”表示“鉴于”。

这两个等式的区别在于,第一个等式是无条件的——我们想知道在没有其他信息的情况下某个事件发生的概率——第二个等式是有条件的——我们想知道某个事件发生的概率,并以(或“给定”)其他条件或事件为条件。

Mike Szczepanski 在 Unsplash 上拍摄的照片

贝叶斯定理

当我们开始讨论贝叶斯定理(或贝叶斯法则)时,这才是真正有所不同的地方。注意:这里有数学和统计数据,如果你不想再看到一个方程,请随意跳到“是时候改变了”。

贝叶斯定理用于根据其他可用信息计算或更新条件概率。等式是:

贝叶斯定理

换句话说:给定某个事件 B,事件 A 发生的概率,等于给定事件 A,事件 B 发生的概率,乘以事件 A 的概率,再除以事件 B 的概率,有点拗口,我们来看个例子。

我们将称事件:冠状病毒导致的死亡(明白我的意思了吗?),以及 B 事件:年龄在 65 岁以下。现在我们有:

P(因 65 岁以下死亡)= P(因 65 岁以下死亡)× P(因 65 岁以下死亡)/P(65 岁以下)

用一些代数来整理它:

P(C | A<65)= P(A<65 | C)×P(C)/P(A<65)

这里我们读到 C 是死于 covid,而 A 是某人的年龄。

因此,考虑到新闻中的统计数据,让我们看看是否能找到更相关的死亡风险。我们需要找到:

  • P(A<65 | C)—65 岁以下死于 covid 的概率。
  • P(C) —死于 covid 的(无条件)概率。
  • P(A<65)——小于 65 的(无条件)概率。

警告:我的数字在这里不会太精确。

我们从研究和报告中知道,目前估计的死亡率是 3.4 % ,所以

P(C) = 0.034

根据一项 website⁴调查,8%的人口超过 65 岁,这意味着

P(A < 65) = 0.92

现在更难的是计算出 65 岁以下的概率,因为 covid 已经死亡。此时,我们不得不求助于原始数据。数据无法告诉我们确切的死亡率,P(C | A<65), because we don’t know who does and doesn’t have the virus, i.e. there could be many unreported cases. (This is also a problem with P(C) but I’m ignoring that for the sake of this example). However, the data can tell us exactly P(A<65|C). We will use data from a recent study from the Chinese Center for Disease Control and Prevention¹. According to this study,

P(A<65 | C)= 0.19

这个数字其实是针对 P(A< 60|C), but it’s good enough for us. So putting this all together we have

P(C | A<65)= 0.19×0.034/0.92 = 0.007 = 0.7%。

因此,根据我们的计算,如果你不到 65 岁,死于新冠肺炎的概率实际上只有 0.7%左右(这与更准确的估计相符)。

是时候改变了

我已经展示了获得与读者实际相关的计算是多么容易。上面的例子只与 92%的人口相关,其他的 8%同样重要。这个例子以年龄为死亡概率的条件,但是潜在的健康可能同样重要。如果没有潜在的健康问题,死亡的概率实际上是 0.9%。当然,在理想情况下,我们应该有一个考虑到所有年龄、潜在健康状况和其他相关背景信息的大模型,但在这一点上,我们正在进入更高级的统计领域,这超出了一篇短文的范围。

我受够了,沮丧和害怕。因为尽管理解了统计数据,我还是一次又一次地看到同样刺眼的标题。是时候对统计数据进行更负责任的报道了,我对如何做到这一点有一些想法。

前进的道路…在某些条件下

  1. 给读者:学习一个无条件概率告诉你什么。当我们听到 3.4%的死亡率时,我们实际上被告知的是,在所有感染新冠肺炎的人中,3.4%的人已经死亡(过去式)。这并不意味着在一个 100 人的房间里,有 3 个人死去。无条件概率可以告诉我们过去的事情,也可以告诉我们简单的统计数据,这些数据忽略了重要的和至关重要的信息。无条件概率不应该被用来预测未来。
  2. 对于媒体:停止报道无条件概率。取而代之的是:“不到 1%的 65 岁以下的新冠肺炎感染者已经死亡”或者“不到 1%没有潜在健康问题的人已经死于新冠肺炎”。当然,这有将读者按年龄和健康状况分开的风险,但这是一个开始。
  3. 对媒体来说:好吧,所以你可能不会停止,但如果你坚持继续报道无条件概率,你必须强调它们到底代表什么,不代表什么。强调过去时,而不是未来——“3.4%已经死亡”。强调知识的缺乏——“3.4%的报告病例已经死亡,但是这个数字取决于个人情况”(好吧,这个不太吸引人,但是你已经明白了)。

继续洗手—照片由 CurologyUnsplash 上拍摄

参考

新型冠状病毒肺炎应急反应流行病学小组。2019 年新型冠状病毒疾病暴发的流行病学特征(新冠肺炎)-中国,2020[J].中国疾病预防控制中心周刊,2020,2(8):113–122。http://weekly . China CDC . cn/en/article/id/e 53946 e 2-c6c 4-41e 9-9 a9 b-FEA 8 db 1a 8 f 51
https://www . world ometers . info/coronavirus/coronavirus-age-sex-demographics/
https://www.bbc.co.uk/news/health-51674743
https://ourworldindata.org/age-structure

Corr2Vec:金融市场特征工程的 WaveNet 架构

原文:https://towardsdatascience.com/corr2vec-a-wavenet-architecture-for-feature-engineering-in-financial-market-94b4f8279ba6?source=collection_archive---------22-----------------------

学习时间序列的有价值的嵌入表示

詹娜 S 在 Unsplash 上的照片

在一个平行宇宙中,我们的愿望是只使用隐藏在过去的模式来进行投资组合管理,以预测未来的价格变化。如今,在金融市场中采用这些技术是毫无用处的。原因很简单:市场是由随机模式驱动的,这使得我们的许多预测试验都消失了。

我们能做的最好的是结合多样化的数据来源,比较股票行为,并确定相关性和群体。

在这篇文章中,我们试图为股票市场特征编码建立一个架构。它接收股票价格的时间序列,加上其他外部数据源,并返回它们的学习数字表示。获得的嵌入可以在以后用于我们感兴趣的各种任务,比如预测、聚类、图形可视化等等。使用相关指数作为我们的神经网络结构的鉴别项来计算学习过程。为此,命名为 Corr2Vec。

数据

财务数据很容易从各种来源获得。对于我们的任务,一个收集了各种股票价格的完整数据集就足够了。满足这些需求的数据集可以在 Kaggle 上找到。股票数据 2000–2018是 2000 年至 2018 年约 39 只不同股票的股票价格的清理集合。更准确地说,是每天报告的成交量、开盘价、最高价、最低价和收盘价。

模型

我们架构的训练过程遵循一种监督的方法。我们需要标签,但这些标签可以通过我们的数据结构轻松自由地检索。这是因为我们将系列之间的相关系数设置为标签。皮尔逊相关系数是统计学和机器学习中的一个众所周知的指数。在时间序列分析的背景下,它告诉我们两个序列是如何一起移动的,但没有说任何因果关系。在哲学术语中,它可以被解释为仅考虑趋势行为的时间序列的相似性度量。

我们的网络学习的是来自多个数据源的 3D 序列的扁平嵌入表示。这些嵌入是在一个网络中获得的,该网络试图再现期望股票收盘价之间的相关指数。建立网络是为了学习在给定时期负责提供相关性测量的显著特征。我们期望我们的网络可以为相同股票的序列块产生相似的表示,显示相似的相关度。当评估不同的股票时,期望相等。

对于熟悉 Word2Vec 的人来说,我们手工制作的 Corr2Vec 类似地学习了一个内部隐藏表示。Word2Vec 使用 skip-gram 方法构建和训练嵌入,以区分单词是否为“ close ”。我们使用相关指数来区分我们的时间序列块是否是“相似的”。相关性指数一次比较两个数据源(在我们的例子中是时间序列)。这就要求以智能的方式组织培训过程,以捕捉多种关系。实际上,这是通过多个独立输出来实现的。我们的结构的另一个附加价值是连接不同数据源的能力。

整个架构的引擎由类似 WaveNet 的架构组成。这种结构近年来在时序任务中取得了巨大的成功。如果你第一次遇到它,它可能看起来很复杂但不要担心,它比你想象的简单。这是一个完全的卷积神经网络,其中卷积层具有各种膨胀因子,这些膨胀因子通过残差块得到加强,并通过跳跃连接进行合并。这些最新的实现技巧允许 WaveNet 感受野随深度呈指数增长,并覆盖数千个时间戳。

我们的网络可以训练各种股票。对于所考虑的每只股票,我们都有一组输入序列和各种相关特征(包括收盘价)。输出是不同股票(同一时期)序列对之间收盘价的相关系数。换句话说,输出的数量等于可能的相关对,就像相关矩阵的上部一样。在网络内部,相同的波网结构处理来自每个输入的序列。通过全局平均池操作为每只股票构建一维表示。最后,在先前的表示上使用一系列点积来近似相关系数。

在我们的实验中,我们使用三种不同的股票。我们选择 AAPL、阿姆津和 MSFT。我们在数据集的第一部分训练我们的网络,并留下第二部分来直观地检查结果。WaveNet 编码器被提取并用于从 3D 特征序列中获得 1D 嵌入。然后,三个结果嵌入(每个股票一个)被水平连接起来,准备使用。在它们上面,我们应用 TSNE 来减少尺寸和视觉检查结果。同样在这个阶段,我们保持训练数据和看不见的数据之间的分离。

嵌入在看不见的数据上的时间函数的 2D 表示(颜色)

在上图中,每个点代表投影在 2D 空间中的嵌入要素序列。颜色用于表示时间维度,以检查空间中靠近的序列是否也在时间上接近。

进一步的检查包括绘制我们的点,考虑相关指数。下面我们报告相同的嵌入表示,但是随着可能的股票对的相关程度改变颜色。在一些领域,我们的股票往往同时高度相关,而在其他地方,它们交替相关的幅度。

在相关指数(颜色)函数中嵌入看不见的数据的 2D 表示

我们将自己限制在视觉上检查我们的嵌入,但是它们的灵活性使它们能够在不同的任务中被采用。我们可以想象在集群和预测场景或者更复杂的项目组合管理活动中应用它们。

摘要

在这篇文章中,我们介绍了在金融市场中嵌入创建时间序列的定制过程。这些表示是使用相关指数作为区别项来学习的。训练过程使用 WaveNet 结构来捕获隐藏模式并组合不同的数据源。图形结果显示了在学习的嵌入中可能存在隐藏的层次,这在其他应用中可能是有用的。

如果你对题目感兴趣,我建议:

查看我的 GITHUB 回购

保持联系: Linkedin

幸福、互联网使用和数学之间的相关性

原文:https://towardsdatascience.com/correlation-between-happiness-internet-usage-and-mathematics-3f23e539b5fb?source=collection_archive---------31-----------------------

区分虚假相关和真实相关的逐步指南

丹尼斯·琼斯在 Unsplash 拍摄的照片

一些奇怪的事情之间的关联经常会激怒我们的好奇心,让我们怀疑这背后是否有因果关系!举几个相关的例子:

  1. 海贼荒 全球变暖
  2. 美国柠檬进口增加,高速公路死亡率下降。
  3. 全球非商业航天发射和 社会学博士学位授予
  4. 良好的雨季和拖拉机公司股价的上涨。
  5. 贵金属价格的增加 利率的降低
  6. 油价上涨,旅游业下降。

乍一看,人们可以看出前三种相关性和后三种相关性之间的区别。前三种相关性被称为滑稽的相关性。这些相关性可能只是偶然发现的结果,提醒我们一句古老的谚语,“相关性并不意味着因果关系”。但是,后三者之间似乎确实有因果关系。例如,一个好的雨季意味着一个好的农业产量,这反过来意味着农业相关产品的购买增加,如拖拉机、杀虫剂、肥料等。

现在,我们如何确定这两个变量是否有一个虚假的关系,与实际的因果关系相反。这是一个经常需要人类直觉和专业知识的问题。在这篇文章中,我们试图使用 15 岁学生的幸福数据、人均互联网使用率和数学水平,将这种直观的方法形式化为几个更具体的步骤。

数据

  1. 《2020 年世界幸福报告》:这份报告由 156 个国家组成,涵盖了影响幸福的因素,如社会支持、健康的预期寿命、做出生活选择的自由等。
  2. 【2018 年互联网使用情况:216 个国家的互联网用户数据,按绝对用户数和人均用户数排名。在这里,我们使用每个人口的用户排名。
  3. Pisa 全球排名 2018 :包含 79 个国家 15 岁学生的数学学业表现数据。

数据可视化

以上数据包含了大量国家的连续变量——最少的国家有 79 个。理解这些数据最有效的方法是使用 choropleth 图,其中数据被转换成类别。这是通过 python 中的map classify包实现的。 mapclassify 能够为 choropleth 地图实现一系列分类方案。

*fig, ax = plt.subplots(1,figsize=(15, 10))
ax.axis('off')
ax.set_title('Pisa Mathematics Ranking', fontdict={'fontsize': '35', 'fontweight' : '3'}) merged.plot(column='Avg_score', cmap='RdBu', scheme="User_Defined", 
         legend=True, edgecolor='0.8',classification_kwds=dict(bins=[300,350,400,450,500,550,600]),
         ax=ax,label='Ranking')
ax.set_xlim(minx+10, maxx-10)
ax.set_ylim(miny+10, maxy-10)
leg = ax.get_legend()
plt.rc('legend', fontsize=20)
leg.set_bbox_to_anchor((0.85, 0.6, 0.2, 0.2))*

图片作者。

在这张 choropleth 地图上,不在 pisa 排名中的国家被任意打分至 300 分,仅低于最低分 325 分。很明显,大多数非洲和亚洲国家不在这个排名之内。一个可能的原因是这项测试的价格标签,每个参与国的费用为 205000 欧元。只有两个行政区,澳门和香港,从这张地图上被删除(由于绘图困难),并显示为中国本身的一部分。中国和新加坡是仅有的两个得分超过 550 的国家,而中国得分高达 591,新加坡得分为 569。总的来说,发达的亚洲、欧洲和美洲国家在这个排名中表现更好。然而,这并不表明一个国家的表现与其经济地位之间有任何关系,因为这一测试尚未渗透到非洲和亚洲的发展中国家。

同样,世界幸福指数的 choropleth 图如下所示。

图片作者。

这里的颜色模式与上面的图相比是颠倒的,以便更好地可视化。没有幸福指数的国家的幸福指数为零。显然,这是一份更广泛的报告,总共包括 156 个国家。芬兰、丹麦和瑞士分别是排名前三的国家,而前十名大多被北欧国家占据。此外,在这张地图上,经济和幸福之间有着明显的正相关关系。

类似地,一张地图显示了每个人口中互联网用户的百分比:

图片作者。

上图暗示了发达国家和每人口互联网用户百分比之间的相互关系。该图包含 216 个国家的数据,没有数据的国家以零百分比表示。在下面的部分中,我们计算这三个排名之间的皮尔逊相关性。

相互关系

皮尔逊相关系数仅显示两个变量之间的线性关系。如果两个变量只是非线性相关,例如圆、双曲线、抛物线等方程,则相关性为零。皮尔逊相关性衡量两个变量之间关系的强度和方向。它不测量关系的斜率,并将零相关归因于纯非线性关系,分别如下图中的行所示。

由 DenisBoigelot 原创上传者为 Imagecreator — CC0

相关性的优势:

  1. 两个变量之间很容易计算。
  2. 如果两个变量高度相关,这有助于减少建模所需的特征数量。
  3. 了解相关性有助于降低风险,例如,不同股票的相关性增加,而份额意味着一个股票的损失会导致其他股票的损失。导致 2007 年金融危机的场景!

相关性的缺点:

  1. 它可以给出没有任何因果关系的虚假相关性。
  2. 相关性随着数据的转换而改变。因此,在数据处理期间,需要在连续的基础上计算
  3. 使用相关性永远无法得到两个变量之间的确切关系。

幸福、互联网使用和数学之间的相关性

图 1(作者图片。)

每个人口的互联网用户百分比与幸福指数之间有着惊人的正相关关系。此外,数学学习成绩与人口中互联网用户的比例之间也存在高度的正相关关系。数学和快乐之间有一个小的正相关。

在上面的图表中,相关性是在使用国家名称合并所有三个数据框架(幸福指数、pisa 排名和互联网使用)后计算的。因此,它将合并数据框架中的国家数目最多限制在国家数目最少的数据框架,即有 79 个国家的 pisa 数据框架。因此,这里合并的数据框架有 77 个国家,除了澳门和香港两个行政区。

为了利用具有更多数据的其他两个数据帧,我们分别计算它们的相关性。

图 2(作者图片。)

显然,在添加更多数据后,幸福和互联网似乎有更多的相关性,因为在这个合并的数据框架中有 150 个国家。

同样,只有数学和互联网与 78 个国家的合并数据框架产生的相关性略低于所有三个数据框架的相关性。

图 3(作者图片。)

可以看出,相关性对数据数量非常敏感。这是因为皮尔逊相关系数的分子计算 x 和 y 与其各自平均值之差的乘积之和(咽!).那就是:

GeeksforGeeks

因此,即使是具有较大噪声的单个数据点(x,y ),即使在通过分母进行归一化之后,也会产生显著影响。

与图 1 相比,只有数学和幸福之间的相关性显示出最小的变化,并且共有 77 个国家。

图 4(作者图片。)

这是一种虚假的关联吗?

虽然,乍一看,幸福和互联网,以及数学和互联网之间似乎没有明显的关系。高正相关的两个组合分别为 0.77 和 0.51 。然而,更深入的考察可以看出:

  1. 发达国家的人均互联网用户数量更高。
  2. 这个国家的国内生产总值肯定能为人民的幸福做出贡献。
  3. 此外,这意味着数学水平与该国的 GDP 更相关。这意味着,发达国家可以腾出更多的资源用于学生的素质教育。

在这一点上,所有这些可能看起来是一个疯狂的猜想。但是,有一个简单的方法可以证明它不是伪相关,并且上面的推理是正确的。那就是把这个国家的 GDP 与幸福、互联网和数学联系起来。如果我们的推理是正确的,它应该表明幸福、互联网和数学与 GDP 的相关性远远大于它们之间的相关性!

利用我们得到的幸福数据中记录的人均 GDP

图 5(作者图片。)

图 5 显示,记录的人均国内生产总值与幸福、数学和互联网的相关性比其他相关性更大。这证明了我们的猜想,即国家的经济发展与幸福感、数学水平和互联网使用率密切相关。因此,在这些明显不同的特征之间建立了合理的因果关系。因此,这不是伪相关!

此外,如上所述,数据的转换可以改变它们之间的相关性。特别是人均 GDP 的自然对数会把幂关系变成线性关系,从而增加相关系数!因此,为了获得准确的关系,我们应该只与人均国内生产总值相关。

图 6(作者图片。)

显然,与图 5 中记录的人均国内生产总值相比,上述人均国内生产总值图显示了较小的相关性。

现在,只绘制互联网和人均国内生产总值,以利用这两个数据框架之间的更多数据,我们得到:

图 7(作者图片。)

带回家的信息

  1. 相关性在特征工程中很重要。如果特征彼此高度相关,则可以使用它来减少所使用的特征的数量。
  2. 皮尔逊相关系数不能表达纯粹的非线性关系,例如由圆的方程相关的两个变量具有零相关性。
  3. 相关性对使用的数据点数量非常敏感。即使一些数据点更加分散,也会反映在皮尔逊相关系数中。
  4. 幸福感&互联网使用率和数学&互联网使用率分别有 0.77 和 0.51 的显著正相关(见图 2 &图 3)!这种相关性和图 6 的差异是由于图 2 和图 3 中的数据较多。
  5. 这是因为互联网使用量与该国国内生产总值之间的正相关性更高,为 0.81(见图 7)。因此,GDP 在观察到的快乐相关性&互联网使用和数学&互联网使用之间建立了因果关系。

请参考此处的整个笔记本以及数据集。

相关<>因果关系

原文:https://towardsdatascience.com/correlation-causation-bb79e0f61dc?source=collection_archive---------81-----------------------

美国宇航局在 Unsplash 上拍摄的照片

什么是相关性?

凯西·科济尔科夫——5 分钟阅读

实验让你可以谈论因果。没有它们,你所拥有的只是相关性。什么是相关性?

这不是因果关系。(!!!!!)

一个示例在权重和偏差 UI 中扫描工作空间。图片作者。

迭代扫描超参数搜索

由 Stacey Svetlichnaya — 13 分钟阅读

如何在深度学习模型上运行有效的超参数搜索,使用来自 Weights & Biases 的特定可视示例

Samantha Gades 的背景图片

高增长公司的数据科学

作者:Jeremie Harris 和 Solmaz Shahalizadeh,3 分钟阅读🎧

在过去的几个月里,我看到越来越多的主题之一是数据科学中产品思维的重要性。

照片由 Fabian Blank 在 Unsplash 上拍摄

跟随我的极端预算改造(ft。Gmail API)

通过詹妮弗·金 — 7 分钟读取

2020 年是改善之年——对自己,对政府和现有机构,对消费习惯。

图片由 Luke Chesser 在 Unsplash 上提供

部署企业级 R 闪亮应用的开源解决方案

明初许 — 14 分钟读完

对于许多 R 用户来说,R Shiny 已经成为一个为数据科学构建交互式 web 应用程序的流行平台。它允许人们轻松地从 R 可视化数据分析,而不需要弄乱许多行代码。

R 中的相关系数和相关检验

原文:https://towardsdatascience.com/correlation-coefficient-and-correlation-test-in-r-2c8324860b04?source=collection_archive---------46-----------------------

学习如何计算相关系数,并在 R

照片由内森·杜姆劳

介绍

变量之间的关系在描述性分析中起着重要的作用。相关性衡量两个变量之间的关系,即它们如何相互关联。从这个意义上来说,相关性可以让我们知道哪些变量是同向发展的,哪些是反向发展的,哪些是独立的。

在本文中,我将展示如何计算相关系数,如何执行相关测试以及如何可视化 r 中变量之间的关系

相关性通常计算在两个定量变量上,但也可以计算在两个定性序数变量上。如果需要研究两个定性名义变量之间的关系,请参见独立性卡方检验

数据

在本文中,我们使用mtcars数据集(在 R 中默认加载):

# display first 5 observations
head(mtcars, 5)##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2

变量vsam是分类变量,因此在本文中它们被删除了:

# remove vs and am variables
library(tidyverse)
dat <- mtcars %>%
  select(-vs, -am)# display 5 first obs. of new dataset
head(dat, 5)##                    mpg cyl disp  hp drat    wt  qsec gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02    3    2

相关系数

两个变量之间

使用cor()函数找到两个变量之间的相关性。假设我们想要计算马力(hp)和每加仑英里数(mpg)之间的相关性:

# Pearson correlation between 2 variables
cor(dat$hp, dat$mpg)## [1] -0.7761684

请注意,变量 xy 之间的相关性等于变量 yx 之间的相关性,因此cor()函数中变量的顺序无关紧要。

默认情况下,皮尔逊相关性是用cor()函数计算的。如果您想要计算 Spearman 相关性,请将参数method = "spearman"添加到cor()函数中:

# Spearman correlation between 2 variables
cor(dat$hp, dat$mpg,
  method = "spearman"
)## [1] -0.8946646

有多种相关方法(运行?cor了解更多关于cor()功能中可用的不同方法的信息):

  • 皮尔逊相关性常用于具有线性关系的定量连续变量
  • Spearman 相关性(实际上类似于 Pearson,但基于每个变量的排名值,而不是原始数据)通常用于评估涉及定性序数变量或定量变量的关系(如果联系是部分线性的)
  • 根据和谐和不和谐对的数量计算得出的肯德尔(Kendall)常用于定性序数变量

相关矩阵:所有变量的相关性

假设现在我们想计算几对变量的相关性。我们可以很容易地对数据集中所有可能的变量对这样做,同样使用cor()函数:

# correlation for all variables
round(cor(dat),
  digits = 2 # rounded to 2 decimals
)##        mpg   cyl  disp    hp  drat    wt  qsec  gear  carb
## mpg   1.00 -0.85 -0.85 -0.78  0.68 -0.87  0.42  0.48 -0.55
## cyl  -0.85  1.00  0.90  0.83 -0.70  0.78 -0.59 -0.49  0.53
## disp -0.85  0.90  1.00  0.79 -0.71  0.89 -0.43 -0.56  0.39
## hp   -0.78  0.83  0.79  1.00 -0.45  0.66 -0.71 -0.13  0.75
## drat  0.68 -0.70 -0.71 -0.45  1.00 -0.71  0.09  0.70 -0.09
## wt   -0.87  0.78  0.89  0.66 -0.71  1.00 -0.17 -0.58  0.43
## qsec  0.42 -0.59 -0.43 -0.71  0.09 -0.17  1.00 -0.21 -0.66
## gear  0.48 -0.49 -0.56 -0.13  0.70 -0.58 -0.21  1.00  0.27
## carb -0.55  0.53  0.39  0.75 -0.09  0.43 -0.66  0.27  1.00

这个相关矩阵给出了两个变量的所有组合的相关性的概述。

相关系数的解释

首先,相关性的范围从 -1 到 1 。这给了我们两件事的提示:

  1. 2 变量之间关系的方向
  2. 2 变量之间关系的强度

关于关系的方向:一方面,负相关意味着所考虑的两个变量以相反的方向变化,也就是说,如果一个变量增加,另一个变量减少,反之亦然。另一方面,正相关意味着所考虑的两个变量在相同方向变化,即如果一个变量增加,另一个变量增加,如果一个变量减少,另一个变量也减少。

关于关系的强度:相关系数越极端(越接近-1 或 1)关系越强。这也意味着相关性接近于 0 表示两个变量独立,也就是说,当一个变量增加时,另一个变量没有减少或增加的趋势。

作为一个例子,上面找到的马力(hp)和每加仑英里数(mpg)之间的皮尔逊相关性是-0.78,这意味着这两个变量以相反的方向变化。这是有道理的,马力越大的汽车消耗的燃料越多(因此每加仑行驶里程越低)。相反,从相关矩阵中我们看到,每加仑英里数(mpg)和行驶 1/4 英里的时间(qsec)之间的相关性是 0.42,这意味着快车(低qsec)往往每加仑英里数更差(低mpg)。这也是有道理的,因为速度快的汽车往往消耗更多的燃料。

然而,相关矩阵不容易解释,尤其是当数据集由许多变量组成时。在接下来的章节中,我们将介绍相关矩阵的一些替代方案。

形象化

两个变量的散点图

可视化两个变量之间相关性的一个好方法是绘制两个感兴趣变量的散点图。假设我们想要检查马力(hp)和每加仑英里数(mpg)之间的关系:

# scatterplot
library(ggplot2)ggplot(dat) +
  aes(x = hp, y = mpg) +
  geom_point(colour = "#0c4c8a") +
  theme_minimal()

如果您不熟悉[{ggplot2}](https://www.statsandr.com/blog/graphics-in-r-with-ggplot2/) ,您可以使用 R base graphics 的plot()功能绘制散点图:

plot(dat$hp, dat$mpg)

或者使用 esquisse 插件使用{ggplot2}包轻松绘制图形。

几对变量的散点图

假设我们想可视化几对变量之间的关系,而不是只可视化两个变量之间的关系。多亏了pair()功能,这才成为可能。对于这个例子,我们只关注每加仑英里数(mpg)、马力(hp)和重量(wt):

# multiple scatterplots
pairs(dat[, c(1, 4, 6)])

该图表明,重量(wt)和马力(hp)正相关,而每加仑英里数(mpg)似乎与马力(hp)和重量(wt)负相关。

另一个简单的相关矩阵

相关矩阵的这个版本以稍微更易读的方式呈现相关系数,即,通过基于它们的符号给系数着色。应用于我们的数据集,我们有:

# improved correlation matrix
library(corrplot)corrplot(cor(dat),
  method = "number",
  type = "upper" # show only upper side
)

相关性检验

对于 2 个变量

与指示样本中某些变量对之间相关系数的相关矩阵不同,相关测试用于测试总体中两个变量之间的相关性(表示为ρ)是否显著不同于 0。

实际上,样本中的相关系数不同于 0 并不意味着总体中的相关性显著不同于 0。这需要用一个假设检验来检验——也就是所谓的相关性检验。

相关性检验的无效假设和替代假设如下:

  • H0: ρ = 0(意味着两个变量之间没有线性关系)
  • H1: ρ ≠ 0(表示两个变量之间存在线性关系)

通过这种相关性测试,我们实际测试的是:

  • 样本包含了足够的证据,可以拒绝零假设,得出相关系数不等于 0 的结论,所以总体中存在这种关系。
  • 或者相反,样本没有包含足够的证据证明相关系数不等于 0,那么在这种情况下我们不拒绝总体中变量之间没有关系的零假设。

假设我们想要测试后轮轴比率(drat)是否与行驶四分之一英里的时间(qsec)相关:

# Pearson correlation test
test <- cor.test(dat$drat, dat$qsec)
test## 
##  Pearson's product-moment correlation
## 
## data:  dat$drat and dat$qsec
## t = 0.50164, df = 30, p-value = 0.6196
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.265947  0.426340
## sample estimates:
##        cor 
## 0.09120476

这两个变量之间相关性检验的p-值为 0.62。在 5%的显著性水平上,我们不拒绝无相关性的零假设。因此,我们得出结论,我们不拒绝这两个变量之间没有线性关系的假设。 1

这个检验证明,即使相关系数不等于 0(样本中相关系数为 0.09),但在总体中实际上与 0 没有显著差异。

注意,相关性测试的p-值基于相关系数样本大小。样本量越大,相关性越极端(接近-1 或 1),无相关性的零假设被拒绝的可能性就越大。在小样本量的情况下,因此有可能在样本中获得相对大的相关性(基于相关系数),但仍然在总体中找到与 0 没有显著差异的相关性(基于相关性测试)。因此,建议在解释相关系数之前始终进行相关性测试,以避免得出有缺陷的结论。

在 R 中报告相关性测试结果的一种简单而又好的方法是使用{report}包中的report()函数:

# install.packages("remotes")
# remotes::install_github("easystats/report") # You only need to do that once
library("report") # Load the package every time you start R
report(test)## Effect sizes were labelled following Funder's (2019) recommendations.
## 
## The Pearson's product-moment correlation between dat$drat and dat$qsec is positive, not significant and very small (r = 0.09, 95% CI [-0.27, 0.43], t(30) = 0.50, p = 0.620)

如您所见,该函数为您解释了测试(以及相关系数和p-值)。

注意,report()功能可用于其他分析。在软件包的文档中查看更多示例。如果你觉得这个有用,也可以在 R 中看到更多的提示和技巧。

对于几对变量

类似于用于计算几对变量相关性的相关矩阵,rcorr()函数(来自{Hmisc}包)允许一次计算几对变量相关性测试的 p 值。应用于我们的数据集,我们有:

# correlation tests for whole dataset
library(Hmisc)
res <- rcorr(as.matrix(dat)) # rcorr() accepts matrices only# display p-values (rounded to 3 decimals)
round(res$P, 3)##        mpg   cyl  disp    hp  drat    wt  qsec  gear  carb
## mpg     NA 0.000 0.000 0.000 0.000 0.000 0.017 0.005 0.001
## cyl  0.000    NA 0.000 0.000 0.000 0.000 0.000 0.004 0.002
## disp 0.000 0.000    NA 0.000 0.000 0.000 0.013 0.001 0.025
## hp   0.000 0.000 0.000    NA 0.010 0.000 0.000 0.493 0.000
## drat 0.000 0.000 0.000 0.010    NA 0.000 0.620 0.000 0.621
## wt   0.000 0.000 0.000 0.000 0.000    NA 0.339 0.000 0.015
## qsec 0.017 0.000 0.013 0.000 0.620 0.339    NA 0.243 0.000
## gear 0.005 0.004 0.001 0.493 0.000 0.000 0.243    NA 0.129
## carb 0.001 0.002 0.025 0.000 0.621 0.015 0.000 0.129    NA

仅应解释与小于显著性水平(通常α = 0.05)的 p 值的相关性。

相关系数和相关检验的组合

既然我们已经讨论了相关系数和相关性测试的概念,那么让我们看看是否可以将这两个概念结合起来。

来自 easystats [{correlation}](https://easystats.github.io/correlation/) correlation函数允许在单个表中组合相关系数和相关测试(感谢 krzysiektr 为我指出这一点):

library(correlation)correlation::correlation(dat,
  include_factors = TRUE, method = "auto"
)## Parameter1 | Parameter2 |     r |         95% CI |     t | df |      p |  Method | n_Obs
## ----------------------------------------------------------------------------------------
## mpg        |        cyl | -0.85 | [-0.93, -0.72] | -8.92 | 30 | < .001 | Pearson |    32
## mpg        |       disp | -0.85 | [-0.92, -0.71] | -8.75 | 30 | < .001 | Pearson |    32
## mpg        |         hp | -0.78 | [-0.89, -0.59] | -6.74 | 30 | < .001 | Pearson |    32
## mpg        |       drat |  0.68 | [ 0.44,  0.83] |  5.10 | 30 | < .001 | Pearson |    32
## mpg        |         wt | -0.87 | [-0.93, -0.74] | -9.56 | 30 | < .001 | Pearson |    32
## mpg        |       qsec |  0.42 | [ 0.08,  0.67] |  2.53 | 30 | 0.137  | Pearson |    32
## mpg        |       gear |  0.48 | [ 0.16,  0.71] |  3.00 | 30 | 0.065  | Pearson |    32
## mpg        |       carb | -0.55 | [-0.75, -0.25] | -3.62 | 30 | 0.016  | Pearson |    32
## cyl        |       disp |  0.90 | [ 0.81,  0.95] | 11.45 | 30 | < .001 | Pearson |    32
## cyl        |         hp |  0.83 | [ 0.68,  0.92] |  8.23 | 30 | < .001 | Pearson |    32
## cyl        |       drat | -0.70 | [-0.84, -0.46] | -5.37 | 30 | < .001 | Pearson |    32
## cyl        |         wt |  0.78 | [ 0.60,  0.89] |  6.88 | 30 | < .001 | Pearson |    32
## cyl        |       qsec | -0.59 | [-0.78, -0.31] | -4.02 | 30 | 0.007  | Pearson |    32
## cyl        |       gear | -0.49 | [-0.72, -0.17] | -3.10 | 30 | 0.054  | Pearson |    32
## cyl        |       carb |  0.53 | [ 0.22,  0.74] |  3.40 | 30 | 0.027  | Pearson |    32
## disp       |         hp |  0.79 | [ 0.61,  0.89] |  7.08 | 30 | < .001 | Pearson |    32
## disp       |       drat | -0.71 | [-0.85, -0.48] | -5.53 | 30 | < .001 | Pearson |    32
## disp       |         wt |  0.89 | [ 0.78,  0.94] | 10.58 | 30 | < .001 | Pearson |    32
## disp       |       qsec | -0.43 | [-0.68, -0.10] | -2.64 | 30 | 0.131  | Pearson |    32
## disp       |       gear | -0.56 | [-0.76, -0.26] | -3.66 | 30 | 0.015  | Pearson |    32
## disp       |       carb |  0.39 | [ 0.05,  0.65] |  2.35 | 30 | 0.177  | Pearson |    32
## hp         |       drat | -0.45 | [-0.69, -0.12] | -2.75 | 30 | 0.110  | Pearson |    32
## hp         |         wt |  0.66 | [ 0.40,  0.82] |  4.80 | 30 | < .001 | Pearson |    32
## hp         |       qsec | -0.71 | [-0.85, -0.48] | -5.49 | 30 | < .001 | Pearson |    32
## hp         |       gear | -0.13 | [-0.45,  0.23] | -0.69 | 30 | 1.000  | Pearson |    32
## hp         |       carb |  0.75 | [ 0.54,  0.87] |  6.21 | 30 | < .001 | Pearson |    32
## drat       |         wt | -0.71 | [-0.85, -0.48] | -5.56 | 30 | < .001 | Pearson |    32
## drat       |       qsec |  0.09 | [-0.27,  0.43] |  0.50 | 30 | 1.000  | Pearson |    32
## drat       |       gear |  0.70 | [ 0.46,  0.84] |  5.36 | 30 | < .001 | Pearson |    32
## drat       |       carb | -0.09 | [-0.43,  0.27] | -0.50 | 30 | 1.000  | Pearson |    32
## wt         |       qsec | -0.17 | [-0.49,  0.19] | -0.97 | 30 | 1.000  | Pearson |    32
## wt         |       gear | -0.58 | [-0.77, -0.29] | -3.93 | 30 | 0.008  | Pearson |    32
## wt         |       carb |  0.43 | [ 0.09,  0.68] |  2.59 | 30 | 0.132  | Pearson |    32
## qsec       |       gear | -0.21 | [-0.52,  0.15] | -1.19 | 30 | 1.000  | Pearson |    32
## qsec       |       carb | -0.66 | [-0.82, -0.40] | -4.76 | 30 | < .001 | Pearson |    32
## gear       |       carb |  0.27 | [-0.08,  0.57] |  1.56 | 30 | 0.774  | Pearson |    32

如你所见,它给出了所有变量对的相关系数(列r)和相关性测试的结果(列95% CI表示置信区间,列p表示 pp 值),以及其他有用的信息。这个表非常有用,信息丰富,但是让我们看看是否有可能将相关系数和相关性测试的概念结合在一个单独的可视化中。易于阅读和解释的可视化。

理想情况下,我们希望对数据集中存在的所有可能的变量对之间的相关性有一个简明的概述,对与 0 显著不同的相关性有一个清楚的区分。

下图被称为相关图,由corrplot()函数改编而来,具体操作如下:

corrplot2 <- function(data,
                      method = "pearson",
                      sig.level = 0.05,
                      order = "original",
                      diag = FALSE,
                      type = "upper",
                      tl.srt = 90,
                      number.font = 1,
                      number.cex = 1,
                      mar = c(0, 0, 0, 0)) {
  library(corrplot)
  data_incomplete <- data
  data <- data[complete.cases(data), ]
  mat <- cor(data, method = method)
  cor.mtest <- function(mat, method) {
    mat <- as.matrix(mat)
    n <- ncol(mat)
    p.mat <- matrix(NA, n, n)
    diag(p.mat) <- 0
    for (i in 1:(n - 1)) {
      for (j in (i + 1):n) {
        tmp <- cor.test(mat[, i], mat[, j], method = method)
        p.mat[i, j] <- p.mat[j, i] <- tmp$p.value
      }
    }
    colnames(p.mat) <- rownames(p.mat) <- colnames(mat)
    p.mat
  }
  p.mat <- cor.mtest(data, method = method)
  col <- colorRampPalette(c("#BB4444", "#EE9988", "#FFFFFF", "#77AADD", "#4477AA"))
  corrplot(mat,
    method = "color", col = col(200), number.font = number.font,
    mar = mar, number.cex = number.cex,
    type = type, order = order,
    addCoef.col = "black", # add correlation coefficient
    tl.col = "black", tl.srt = tl.srt, # rotation of text labels
    # combine with significance level
    p.mat = p.mat, sig.level = sig.level, insig = "blank",
    # hide correlation coefficiens on the diagonal
    diag = diag
  )
}corrplot2(
  data = dat,
  method = "pearson",
  sig.level = 0.05,
  order = "original",
  diag = FALSE,
  type = "upper",
  tl.srt = 75
)

相关图显示了所有变量对的相关系数(更极端的相关性用更强烈的颜色表示),与 0 没有显著差异的相关性用白色方框表示。

要了解更多关于这个图和使用的代码,我邀请您阅读题为“R 中的相关图:如何突出显示数据集中最相关的变量”的文章。

对于那些仍然不完全满意的人,我最近从{GGally}包中找到了一个带有ggpairs()功能的替代品。

下面是一个带有变量mpghpwt的例子:

library(GGally)ggpairs(dat[, c("mpg", "hp", "wt")])

该图结合了相关系数、相关性测试(通过系数 2 旁边的星号)和数据集中所有可能变量对的散点图。

相关性并不意味着因果关系

我确信你已经听说过统计学中的“相关性并不意味着因果关系”这句话。如果不讨论因果关系,一篇关于相关性的文章是不完整的。

两个变量之间的非零相关不一定意味着这两个变量之间有因果关系!

事实上,两个变量之间的显著相关性意味着一个变量的变化与另一个变量的变化相关(积极或消极)。尽管如此,显著的相关性并不表明一个变量的变化导致另一个变量的变化

X 和 Y 之间的非零相关可能出现在几种情况下:

  • x 导致 Y
  • y 导致 X
  • 第三个变量导致 X 和 Y
  • 这三个原因的结合

有时,两个变量之间存在因果关系是相当清楚的。以牛奶等消费品的价格与其消费量之间的相关性为例。这两者之间的因果联系是相当明显的:如果牛奶价格上涨,预计其消费量将减少。

然而,这种因果联系并不总是存在的,即使相关性是显著的。Maurage、Heeren 和 Pesenti ( 2013 )表明,尽管巧克力消费量和诺贝尔奖获得者数量之间存在显著的正相关性,但这种相关性来自于第三个变量,即国内生产总值(GDP),导致了巧克力消费量和诺贝尔奖获得者数量。他们发现,GDP 较高的国家往往有较高的巧克力消费和科学研究水平(导致更多的诺贝尔奖获得者)。

这个例子表明,在解释相关性时必须非常谨慎,避免将相关性过度解释为因果关系。

感谢阅读。我希望这篇文章能帮助你在 r 中计算相关性和执行相关性测试。

和往常一样,如果您有与本文主题相关的问题或建议,请将其添加为评论,以便其他读者可以从讨论中受益。

参考

毛拉日、皮埃尔、亚历山大·海伦和毛罗·佩森蒂。2013.“食用巧克力真的会增加获得诺贝尔奖的机会吗?健康研究中过度解释相关性的危险。”营养杂志143(6):931–33。

  1. 重要的是要记住,我们测试了两个变量之间的线性关系,因为我们使用了皮尔逊相关性。总体中的两个变量之间可能存在关系,但这种关系可能不是线性的。 ↩︎
  2. 3 星号表示系数在 5%水平显著,2 表示在 1%显著水平,3 表示在 0.1%显著水平。 ↩︎

相关文章

原载于 2020 年 5 月 28 日https://statsandr.comT22。

R 中的相关图:如何突出显示数据集中最相关的变量

原文:https://towardsdatascience.com/correlogram-in-r-how-to-highlight-the-most-correlated-variables-in-a-dataset-a9c2e6ea8529?source=collection_archive---------16-----------------------

或者如何以更有洞察力和更吸引人的方式呈现相关矩阵

照片由普里特什·首陀罗拍摄

介绍

C 或相关性,通常作为描述性统计的一部分进行计算,是一种用于研究两个变量之间关系的统计工具,即变量对之间是否相关以及相关程度如何。

一次只能测量两个变量之间的相关性。因此,对于包含许多变量的数据集,计算相关性会变得非常麻烦和耗时。

相关矩阵

这个问题的解决方案是计算相关性并在相关矩阵中显示它们,相关矩阵显示数据集中两个变量的所有可能组合的相关系数。

例如,下面是数据集mtcars的相关矩阵(如 R 的帮助文档所述,它包括 32 辆汽车的燃料消耗和汽车设计和性能的 10 个方面)。 1 对于本文,我们只包括连续变量。

dat <- mtcars[, c(1, 3:7)]
round(cor(dat), 2)##        mpg  disp    hp  drat    wt  qsec
## mpg   1.00 -0.85 -0.78  0.68 -0.87  0.42
## disp -0.85  1.00  0.79 -0.71  0.89 -0.43
## hp   -0.78  0.79  1.00 -0.45  0.66 -0.71
## drat  0.68 -0.71 -0.45  1.00 -0.71  0.09
## wt   -0.87  0.89  0.66 -0.71  1.00 -0.17
## qsec  0.42 -0.43 -0.71  0.09 -0.17  1.00

即使将相关系数四舍五入到 2 位数,您也会认为这个相关矩阵不容易快速解释。

如果您使用的是 R Markdown ,您可以使用{pander}包中的pander()函数,使其可读性稍微好一点,但我们仍然必须承认,当涉及到可视化数据集的几个变量之间的相关性时,这个表并不是最佳的,特别是对于大型数据集。

相关图

为了解决这个问题并使其更具洞察力,让我们将相关矩阵转换成相关图。相关图(在 Friendly (2002)中也称为相关图或相关图)可以突出显示最相关(正相关和负相关)的变量。下面是一个与上述数据集相同的示例:

相关图代表所有变量对的相关性。正相关显示为蓝色,负相关显示为红色。颜色的强度与相关系数成比例,因此相关性越强(即越接近-1 或 1),方框越暗。相关图右侧的彩色图例显示了相关系数和相应的颜色。

提醒一下,负相关意味着两个变量的变化方向相反,也就是说,如果一个变量增加,另一个变量减少,反之亦然。正相关意味着所考虑的两个变量同向变化,也就是说,如果一个变量增加,另一个变量增加,如果一个变量减少,另一个变量也减少。此外,相关性越强,两个变量之间的关联就越强。

相关性检验

最后,相关图中的白色方框表示,对于变量对,在指定的显著性水平(在本例中,α = 5)下,相关性与 0 没有显著差异。与 0 没有显著差异的相关性意味着所考虑的两个变量之间没有线性关系(可能有另一种关联,但不是线性的)。

为了确定特定的相关系数是否明显不同于 0,进行了相关测试。提醒本测试的无效假设和替代假设是:

  • H0: ρ = 0
  • H1: ρ ≠ 0

其中,ρ是相关系数。相关性检验基于两个因素:观察次数和相关系数。观察越多,两个变量之间的相关性越强,就越有可能拒绝这两个变量之间没有相关性的零假设。

在我们的例子中,上面的相关图显示变量wt(重量)和hp(马力)正相关,而变量mpg(每加仑英里数)和wt(重量)负相关(如果我们仔细想想,这两种相关性都有意义)。此外,变量wtqsec不相关(由白色方框表示)。即使两个变量之间的相关系数为-0.17,相关性检验表明我们不能拒绝不相关的假设。这就是这两个变量的方框是白色的原因。

尽管该相关图呈现的信息与相关矩阵完全相同,但相关图呈现的是相关矩阵的可视化表示,允许快速浏览相关矩阵,以查看哪些变量相关,哪些变量不相关。

密码

对于那些有兴趣用自己的数据绘制相关图的人,这里是我根据{corrplot}包中的corrplot()函数改编的函数代码(再次感谢这个包的所有贡献者):

corrplot2()函数中的主要参数如下:

  • data:数据集的名称
  • method:要计算的相关方法,为“pearson”(默认)、“kendall”或“spearman”之一。根据经验,如果你的数据集包含定量连续变量,你可以保持皮尔森方法,如果你有定性序数变量,斯皮尔曼方法更合适
  • sig.level:相关性检验的显著性水平,默认为 0.05
  • order:变量的顺序,“原始”(默认)、“AOE”(特征向量的角度顺序)、“FPC”(第一主成分顺序)、“hclust”(层次聚类顺序)、“alphabet”(字母顺序)之一
  • diag:在对角线上显示相关系数?默认为FALSE
  • type:显示整个相关矩阵或简单的上/下部分,“上”(默认)、“下”、“完整”之一
  • tl.srt:变量标签的旋转
  • (请注意,数据集中缺失的值会被自动删除)

您还可以使用corrplot2函数的参数,并通过这个 R 闪亮的应用程序来查看结果。

{ggstatsplot}包装

使用{ggstatsplot}包中的ggcorrmat()功能可以替代上述相关图:

# load package
library(ggstatsplot)# correlogram
ggstatsplot::ggcorrmat(
  data = dat,
  type = "parametric", # parametric for Pearson, nonparametric for Spearman's correlation
  colors = c("darkred", "white", "steelblue") # change default colors
)

在该相关图中,相关系数上的十字显示了非显著相关性(Holm 调整方法默认为 5%显著性水平)。

{lares}包装

多亏了这篇文章,我发现了{lares}包,它在绘制相关性方面有非常好的特性。这个软件包的另一个优点是,它可以用来计算与数字,逻辑,分类和日期变量的相关性。

在这篇文章中可以看到更多关于这个包的信息。

所有可能的关联

如果您想计算所有相关性并返回图中最高和最重要的相关性,请使用corr_cross()功能:

# devtools::install_github("laresbernardo/lares")
library(lares)corr_cross(dat, # name of dataset
  max_pvalue = 0.05, # display only significant correlations (at 5% level)
  top = 10 # display top 10 couples of variables (by correlation coefficient)
)

负相关用红色表示,正相关用蓝色表示。

一个变量与所有其他变量的相关性

如果您想关注一个变量与所有其他变量的相关性,并返回图中最高的变量,请使用corr_var()函数:

corr_var(dat, # name of dataset
  mpg, # name of variable to focus on
  top = 5 # display top 5 correlations
)

感谢阅读。我希望这篇文章能帮助你可视化数据集中变量之间的相关性,并使相关矩阵更有洞察力和吸引力。如果你想了解更多关于这个话题的内容,请看如何计算 R 中的相关系数和相关测试。

和往常一样,如果您有与本文主题相关的问题或建议,请将其添加为评论,以便其他读者可以从讨论中受益。

相关文章:

参考

很友好,迈克尔。2002."相关图:相关矩阵的探索性显示."美国统计学家56④。泰勒&弗朗西斯:316–24。

原载于 2020 年 2 月 22 日 https://statsandr.com**T21

使用 R 和印度尼西亚真实数据集的对应分析介绍

原文:https://towardsdatascience.com/correspondence-analysis-using-r-cd57675ffc3a?source=collection_archive---------12-----------------------

Rachael Gorjestani 在 Unsplash 上拍摄的照片

动手教程

印度尼西亚创意经济署 2016

目录(仅适用于 web)

1 [Background](#4778)
  • [Objectives](#ce39)
  • [Benefits](#9b72)
  • [Scopes](#2b32)
2 [Methodology](#2b32)
  • [Data](#749d)
  • [The procedure of data analysis](#26d8)
3 [Result and Discussion](#f54d)
  • [Data pre-processing and integration](#016f)
  • [Data exploration](#ec9c)
  • [Profile table](#bf4e)
  • [Chi-square statistics](#b1be)
  • [Correspondence analysis](#3b4a)
4 [Interpretation](#1c91)
5 [References](#1252)

背景

根据 Pahlevi (2017)的说法,创意产业被定义为一个人类活动系统,包括与创造、生产、分配、交换和消费具有文化、艺术、美学、智力和情感价值的商品和服务相关的团体和个人。此外,创意产业是一个通过探索文化价值和生产基于科学的商品和服务,包括传统和现代产品,生产具有经济价值的有形和无形产出的产业。

现在,创意产业已被划分为 16 个子行业(游戏应用和开发、建筑和室内设计、视觉传达设计、产品设计、时尚、电影、动画视频、摄影、工艺、烹饪、音乐、出版、广告、表演艺术、美术、电视和广播),它们在这些子行业中面临着各自的挑战。这 16 个分部门各有特点,这对它们的发展有影响。发展创意经济的一个关键因素是如何将一个城市视为文化和艺术中心。

印度尼西亚的每个省都有发展创意产业的潜力,而这些潜力各不相同。从主导全省的某些分部门的创意产业中可以看出这一点。因此,有必要对印尼各省创意产业子行业的分布特征进行深入分析。可以使用的分析是对应分析。它在视觉上类似于双标图分析,但用于列联表形式的分类数据。这种分析可以通过展示更有趣、信息量更大、更具交流性和艺术性的图形来提供理解的便利。

目标

这项研究的目标是:

  • 确定印度尼西亚创意产业子行业变量之间的关系,如应用和游戏开发商、建筑和室内设计、视觉传达设计、时尚等;
  • 确定各省之间的相对位置,以便根据创意产业分部门了解印度尼西亚各省之间的相似之处;
  • 确定创意产业分行业之间的关系;和
  • 找出 2016 年印尼创意产业子行业数量较少的省份。

利益

这项研究的好处是。

  • 要了解 2016 年印度尼西亚创意产业的发展情况,
  • 了解 2016 年印度尼西亚创意产业子行业的发展趋势,以及
  • 成为政府在印尼各省发展创意产业的评估材料。

领域

研究的范围是,使用的数据是从印尼创意经济局官网下载的 2016 年印尼创意产业子行业分布的二手数据。

方法学

数据

所用数据为从印尼创意经济署官网下载的 2016 年印尼创意产业子行业分布二手数据。该数据有如下几个变量:

研究数据(图片由作者提供)

数据分析的程序

2016 年印度尼西亚创意产业子行业对应分析研究的步骤如下:

  1. 进行描述性分析,使用列联表查找印度尼西亚每个省或地区的创意产业子行业的数量
  2. 分析变量之间的关系,以查找省级变量和创意产业子行业变量之间的相关性
  3. 按照以下步骤进行省级变量和创意产业子行业变量之间的对应分析:
  • 基于以前的列联表创建基于行的概要表和基于列的概要表
  • 根据上一步中基于行的配置文件和基于列的配置文件,计算行惯性和列惯性的比例值
  • 基于之前的结果计算奇异值分解,以在二维图中显示每个省级变量和创意产业子行业变量的坐标

结果和讨论

数据预处理和集成

印度尼西亚创意经济局 2016 年数据对应分析研究的第一步是数据预处理。其执行如下:

  • 通过删除【省】**【岛】等词语,操纵 2016 年创意经济机构数据中的省或地区名称。此外,还总结了省或地区的名称
  • 使用对应分析选择要分析的变量。选取的变量有:应用和游戏开发者;电影、动画和视频;视觉传达设计;摄影;电视和广播
# Import libraries
library(factoextra)
library(FactoMineR)
library(gplots)
# Read the data
data.ca = read.csv2(file = '/Data Badan Ekonomi Kreatif.csv',
                    header = TRUE,
                    sep = ';')
# Select 5 predictor variables
data.ca = data.ca[,c(1,2,5,8,9,17)]
# Edit First Column as Rownames of Data
data.ca.rownames = data.ca[,1]
data.ca = data.ca[,-1]
row.names(data.ca) = data.ca.rownames

数据探索

数据探索用于获取 2016 年创意经济机构数据的初始信息。对应用程序和游戏开发者变量进行探索;视觉传达设计;电影、动画和视频;摄影;电视和广播。

# Convert the data into contingency table
dt = as.table(as.matrix(data.ca))
# Create a balloonplot
balloonplot(t(dt), 
            main = 'Sub-Sector of Creative Industries', 
            xlab = '',
            ylab = '',
            label = FALSE, 
            show.margins = FALSE)

图 1 2016 年印尼创意产业子行业列联表图(图片由作者提供)

根据图 1,可以得出结论,与应用程序和游戏开发商相比,摄影是最大的创意企业或公司;视觉传达设计;电影、动画和视频;电视和广播。从视觉上看,与其他省份或地区相比,苏门答腊是拥有最大摄影企业或公司的省份或地区。然而,根据省份来看,与印度尼西亚其他省份相比,西爪哇、中爪哇和东爪哇是拥有最大摄影企业或公司的省份。除了摄影之外,在每个省或地区都有许多业务的其他创意业务是应用程序和游戏开发商。与印度尼西亚其他省份相比,西爪哇和东爪哇是拥有最大的应用和游戏开发商企业或公司的省份。

简介表

对应分析从研究行和列的轮廓开始。它旨在找出 2016 年印度尼西亚各省或地区中正在发展的创意产业子行业,并找出哪些省或地区拥有最大的创意企业或公司。行剖面和列剖面如表 3 和表 4 所示。

# Create row profile
data.ca.row = data.ca/rowSums(data.ca)
View(data.ca.row)
mass.row = colMeans(data.ca.row)

表 3 2016 年印度尼西亚创意产业子行业数据的 row profile 值(图片由作者提供)

表 3 中的行轮廓显示最大质量值为 0.6413,其位于摄影子部分( X4 )。这是数据的模式。它表明,摄影子行业是一个创造性的企业或公司,与其他行业相比比例最高。所有省份或地区都存在摄影子行业,因此可以说,2016 年,摄影在印度尼西亚将趋于发展,特别是在日惹、DKI 雅加达、西爪哇、中爪哇、东爪哇、巴厘& NTT、加里曼丹、苏拉威西&巴布亚和苏门答腊。与此同时,在万丹,应用和游戏开发商( X1 )是比例最高的子行业。因此,在万丹,应用程序和游戏开发者子行业是发展迅速的创造性行业。

# Create column profile
data.ca.col = t(data.ca)/colSums(data.ca)
View(data.ca.col)
mass.col = rowMeans(t(data.ca.col))

表 4 2016 年印尼创意产业子行业数据专栏简介值(图片由作者提供)

表 4 中的柱形图显示了创意产业分部门的质量值,17.76%在东爪哇,16.76%在西爪哇,16.22%在苏门答腊。2016 年日惹最有发展趋势的子行业是视觉传达设计。对于 2016 年的西爪哇来说,倾向于发展的细分行业是应用和游戏开发者。对于 2016 年的东爪哇,倾向于发展的子行业是电视和广播。至于苏门答腊,趋向于发展的分支部门是电影、动画、电影和摄影。

卡方统计

要解释对应分析,第一步是评估行和列之间是否有显著的相关性。

假设

H0:假设两个变量之间没有关联

H1:假设两个变量之间有关联

# To evaluate whether there is a significant dependence between row and column categories
chisq = chisq.test(data.ca)

因为 P 值= 2.2e-16 小于 5% (α),所以决定拒绝零假设。因此,基于卡方检验,可以得出结论,在显著性水平为 5%的情况下,行和列之间没有关联。

对应分析

对应分析是使用主成分分析概念的多变量分析。要查方差,就要计算特征值。对应分析的特征值如表 5 所示。

# Correspondence analysis
res.ca = CA(data.ca, graph = TRUE)
print(res.ca)
# Eigenvalue
eig.val = get_eigenvalue(res.ca)

表 5 2016 年印度尼西亚创意产业子行业数据对应分析的特征值(图片由作者提供)

根据表 5,发现成分 1 和成分 2 解释了数据可变性的 87.46415%。所以对应分析得到的结果很好地解释了数据。

# Create Scree plot
fviz_screeplot(res.ca, addlabels = TRUE, ylim = c(0, 50))
# Create symmetric plot of correspondence analysis
fviz_ca_biplot(res.ca, repel = TRUE) # Make correspondence plot

图 2 (a)碎石图和(b) 对应分析的对称图(图片由作者提供)

根据图 2 (a)中的碎石图,发现在组分 2 中,可以解释的可变性百分比急剧下降。这表明添加成分 3 不影响可以解释的数据多样性。因此,选择组件 1 和 2。通过两个选择的成分可以解释的可变性的总百分比约为 87.46415%

解读

从通信图中获得的一些信息是基于 2016 年印度尼西亚创意产业子行业的一组省份。信息如下:

  • 第一组是以摄影和电视广播的创意产业子行业为特征的省份或地区。这一组包括的省份或地区有中爪哇、东爪哇、巴厘和 NTT 以及苏拉威西和巴布亚
  • 第二组是以创意电影、动画和视频行业以及应用和游戏开发商为特征的省份或地区。这组省份或地区包括万丹、DKI 雅加达和西爪哇
  • 第三组是以视觉传达设计创意产业子行业为特征的省份或地区。该组包括的省份或地区是日惹。与其他省份相比,日惹省的视觉传达设计子行业的质量值最高

请前往我的 GitHub 回购 寻找完整的代码

参考

[1] Anonim。文章—R 中的主成分方法:实用指南(2017)http://www.sthda.com/。

[2]作为。帕勒维。】( 2017),国家利益和发展研讨会:"通过利益和发展的实践促进传统创新"。

使用 Python 解释余弦相似性

原文:https://towardsdatascience.com/cosine-similarity-explained-using-python-machine-learning-pyshark-5c5d6b9c18fa?source=collection_archive---------22-----------------------

在本文中,我们将讨论余弦相似性,并举例说明它在 Python 中产品匹配的应用

目录:

  • 介绍
  • 余弦相似性(概述)
  • 使用 Python 的产品相似性(示例)
  • 结论

介绍

推荐引擎领域中许多有趣的案例和项目很大程度上依赖于正确识别项目和/或用户对之间的相似性。

有几种量化相似性的方法,它们具有相同的目标,但在方法和数学公式上有所不同。

在本文中,我们将探讨其中一种量化方法,即余弦相似度。我们将把学到的理论应用到样本数据中,尝试解决用户相似性问题。

本文中学到的概念可以应用于各种项目:文档匹配、推荐引擎等等。

余弦相似性(概述)

余弦相似性是两个非零向量之间相似性的度量。它被计算为这些向量之间的角度(也与它们的内积相同)。

这听起来像是很多新的或者对学习者来说很难的技术信息。我们将在这里通过详细的可视化和例子来分解它。

让我们考虑三个向量:

作者图片

并在笛卡尔坐标系中绘制它们:

作者图片

例如,从图中我们可以看到,矢量 A 比矢量 C 更类似于矢量 B

但是我们怎么知道呢?嗯,通过观察,我们看到它们 ABAC 彼此更靠近。从数学上讲,角度 A0B 小于 A0C

回到数学公式(让我们考虑矢量 A 和矢量 B ),两个非零矢量的余弦可以从欧几里德点积中导出:

作者图片

这解决了:

作者图片

求解组件

我们来分解一下上面的公式。

第一步:

我们将从提名者开始:

作者图片

其中 AiBi 是向量 A 和 b 的第 i 个元素。

对于我们的情况,我们有:

作者图片

很好,我们找到了矢量 A 和 b 的点积。

第二步:

下一步是研究分母:

作者图片

我们看到的是向量长度的乘积。简单来说:向量 A 的长度乘以向量 b 的长度。

向量的长度可以计算如下:

作者图片

其中 A_i 是向量 A 的第 i 个元素。

对于我们的情况,我们有:

作者图片

第三步:

至此,我们已经拥有了原始公式的所有组件。让我们把它们插上电源,看看我们得到了什么:

作者图片

这两个向量(向量 A 和向量 B)具有 0.976 的余弦相似性。注意,该算法是对称的,这意味着 A 和 B 的相似性与 B 和 A 的相似性相同。

加法
按照同样的步骤,你可以求解向量 A 和 C 之间的余弦相似度,应该得到 0.740。

这证明了我们在看图时的假设:向量 A 更类似于向量 B,而不是向量 c。在本教程创建的示例中,我们正在处理一个非常简单的二维空间,您可以很容易地看到图上的差异。然而,在真实的案例场景中,事情可能没有那么简单。在大多数情况下,您将使用具有两个以上要素的数据集来创建一个 n 维空间,如果不使用一些降维技术( PCAtSNE ),可视化将非常困难。

使用 Python 的产品相似性(示例)

向量空间的例子对于我们理解计算余弦相似性的逻辑和过程是必要的。现在,我们如何在现实世界的任务中使用它呢?

让我们把上面的向量数据放到一些现实生活的例子中。假设我们正在处理一些服装数据,我们希望找到彼此相似的产品。我们有三种类型的服装:连帽衫、毛衣和露脐上衣。可用的产品数据如下:

作者图片

请注意,我们使用的数据与理论部分完全相同。但是把它放到上下文中会使事情更容易想象。根据上面的数据,我们认为帽衫更像一件毛衣,而不是一件露脐上衣。事实上,数据告诉我们同样的事情。

为了继续学习本教程,我们需要以下 Python 库:pandas 和 sklearn。

如果您没有安装它,请打开“命令提示符”(在 Windows 上)并使用以下代码安装它:

pip install pandas
pip install sklearn

我们将采取的第一步是在 Python 中将上述数据集创建为数据框(仅包含包含我们将使用的数值的列):

我们应该得到:

作者图片

接下来,使用 sklearn 库中的 cosine_similarity() 方法,我们可以计算上述数据帧中每个元素之间的余弦相似度:

输出是数据帧的每个条目之间具有相似性的数组:

作者图片

为了更好地理解,上面的数组可以显示为:

作者图片

请注意,计算结果与理论部分的手动计算结果相同。当然,这里的数据很简单,而且只是二维的,因此结果很高。但是同样的方法可以扩展到更复杂的数据集。

结论

在本文中,我们讨论了余弦相似性,并举例说明了它在 Python 产品匹配中的应用。

上述大量材料是复杂推荐引擎和预测算法的基础。

我也鼓励你看看我在机器学习的其他帖子。

如果你有任何问题或者对编辑有任何建议,请在下面留下你的评论。

原载于 2020 年 10 月 27 日【https://pyshark.com】

余弦相似性:它是如何衡量相似性的,背后的数学原理以及在 Python 中的用法

原文:https://towardsdatascience.com/cosine-similarity-how-does-it-measure-the-similarity-maths-behind-and-usage-in-python-50ad30aad7db?source=collection_archive---------8-----------------------

Artem Kniaz 在 Unsplash 上拍摄的照片

什么是余弦相似度?

余弦相似性通过计算两个向量之间角度的余弦来度量两个向量之间的相似性。

余弦相似性是数据科学中使用最广泛、最强大的相似性度量之一。它被用于多种应用,例如在自然语言处理中寻找相似的文档,信息检索,在生物信息学中寻找与 DNA 相似的序列,检测剽窃等等。

余弦相似度计算如下:

两个二维向量 A 和 B 之间的角度(图片由作者提供)

A 和 B 之间夹角余弦的计算

为什么 A 和 B 之间的夹角余弦给了我们相似性?

如果你看看余弦函数,θ= 0°时为 1,θ= 180°时为-1,这意味着对于两个重叠的矢量,余弦将是两个完全相反的矢量的最高和最低值。你可以把 1 余弦当作距离。

余弦(作者图片)

不同角度的余弦值(图片由作者提供)

用 Python 怎么算?

公式的分子是两个向量的点积,分母是两个向量的 L2 范数的乘积。两个向量的点积是向量的元素相乘的和,L2 范数是向量的元素平方和的平方根。

我们可以使用 Numpy 库中的内置函数来计算向量的点积和 L2 范数,并将其放入公式中,或者直接使用来自 sklearn.metrics.pairwise 的余弦相似度。考虑二维中的两个向量 A 和 B,下面的代码计算余弦相似度,

import numpy as np
import matplotlib.pyplot as plt# consider two vectors A and B in 2-D
A=np.array([7,3])
B=np.array([3,7])ax = plt.axes()ax.arrow(0.0, 0.0, A[0], A[1], head_width=0.4, head_length=0.5)
plt.annotate(f"A({A[0]},{A[1]})", xy=(A[0], A[1]),xytext=(A[0]+0.5, A[1]))ax.arrow(0.0, 0.0, B[0], B[1], head_width=0.4, head_length=0.5)
plt.annotate(f"B({B[0]},{B[1]})", xy=(B[0], B[1]),xytext=(B[0]+0.5, B[1]))plt.xlim(0,10)
plt.ylim(0,10)plt.show()
plt.close()# cosine similarity between A and B
cos_sim=np.dot(A,B)/(np.linalg.norm(A)*np.linalg.norm(B))
print (f"Cosine Similarity between A and B:{cos_sim}")
print (f"Cosine Distance between A and B:{1-cos_sim}")

代码输出(图片由作者提供)

# using sklearn to calculate cosine similarity
from sklearn.metrics.pairwise import cosine_similarity,cosine_distancescos_sim=cosine_similarity(A.reshape(1,-1),B.reshape(1,-1))
print (f"Cosine Similarity between A and B:{cos_sim}")
print (f"Cosine Distance between A and B:{1-cos_sim}")

代码输出(图片由作者提供)

# using scipy, it calculates 1-cosine
from scipy.spatial import distancedistance.cosine(A.reshape(1,-1),B.reshape(1,-1))

代码输出(图片由作者提供)

公式的证明

余弦相似公式可以用余弦定律来证明,

余弦定律(图片由作者提供)

考虑二维的两个向量 A 和 B,例如,

两个二维向量(图片由作者提供)

利用余弦定律,

余弦相似性使用余弦定律(图片由作者提供)

你可以证明同样的 3 维或任何维度。它遵循与上面完全相同的步骤。

总结

我们看到了余弦相似性是如何工作的,如何使用它以及它为什么工作。我希望这篇文章有助于理解这个强大指标背后的整个概念。

机器学习中回归的代价函数及其优化技术

原文:https://towardsdatascience.com/cost-functions-of-regression-and-its-optimization-techniques-in-machine-learning-2f5931cd33f1?source=collection_archive---------13-----------------------

深入探讨回归的成本函数及其优化技术:Python 中的漫游

亚历山大·密尔斯在 Unsplash 上拍摄的照片

价值函数

成本函数用于衡量机器学习模型的性能。缺乏成本函数的机器学习模型是无用的。成本函数有助于分析机器学习模型的性能。成本函数基本上将预测值与实际值进行比较。成本函数的适当选择有助于模型的可信度和可靠性。

损失函数与成本函数

  • 定义在单个数据实例上的函数称为损失函数。

回归的绝对损失

  • 在整个数据实例上定义的函数称为成本函数。

回归的平均绝对误差

回归的成本函数

回归任务处理连续数据。可用于回归的成本函数有:

  • 绝对平均误差
  • 均方误差
  • 均方根误差
  • 均方根对数误差

绝对平均误差

平均绝对误差(MAE) 是实际值和预测值之间的平均绝对差值。

  • MAE 对异常值更稳健。对异常值不敏感是因为它不会惩罚由异常值引起的高误差。
  • MAE 的缺点是它在零点不可微,并且许多损失函数优化算法涉及微分以找到参数的最佳值。

均方误差

均方差(MSE) 是实际值和预测值之间的均方差。MSE 通过平方误差来惩罚由异常值引起的高误差。优化算法受益于惩罚,因为它有助于找到参数的最佳值。

  • MSE 的缺点是对异常值非常敏感。当高误差(由目标中的异常值引起)被平方时,它甚至变成更大的误差。
  • MSE 可用于不希望出现高误差的情况。

均方根误差

均方根误差(RMSE) 是实际值和预测值之差的均方根。RMSE 可以用在我们想要惩罚高错误的情况下,但没有 MSE 那么多。

  • RMSE 对异常值也非常敏感。RMSE 中的平方根确保误差项被罚,但不像 MSE 那么多。

均方根对数误差

均方根对数误差(RMSLE) 非常类似于 RMSE,但是在计算实际值和预测值之间的差异之前应用对数。大误差和小误差被同等对待。RMSLE 可用于目标未被标准化或缩放的情况。

  • 与 RMSE 相比,RMSLE 对异常值不太敏感。它减轻了由于日志的存在而导致的高错误的惩罚。

成本函数优化算法

成本函数优化算法试图通过找到成本函数的全局最小值来找到模型参数的最优值。可用的各种算法有,

  • 梯度下降
  • RMS Prop
  • 圣经》和《古兰经》传统中)亚当(人类第一人的名字

加载预处理的数据

你输入给人工神经网络的数据必须经过彻底的预处理,以产生可靠的结果。训练数据已经过预处理。所涉及的预处理步骤是,

  • 老鼠归罪
  • 对数变换
  • 平方根变换
  • 顺序编码
  • 目标编码
  • z 分数标准化

有关上述步骤的详细实现,请参考我的 Kaggle 笔记本上的数据预处理。笔记本链接

用人工神经网络训练模型

更多细节请参考我的 Kaggle 笔记本上关于 Tensorflow 中的 ANN 的介绍。

梯度下降

梯度下降算法利用成本函数的梯度来寻找参数的最佳值。梯度下降是一种迭代算法。它试图找到一个全局最小值。

在每次迭代测试中,

  • 找到数据的成本。
  • 计算成本函数相对于权重和偏差的偏导数。
  • 然后通过利用成本函数和学习率𝛼.的梯度来更新权重和偏差𝛼的值可以从 0.0 到 1.0。𝛼的值越大,找到成本函数的全局最小值所采取的步骤就越多。
  • 继续上述步骤,直到完成指定次数的迭代或达到全局最小值。

均方根误差

RMS Prop 是一种非常类似于梯度下降的优化算法,但是梯度被平滑和平方,然后被更新以很快获得成本函数的全局最小值。

在每次迭代测试中,

  • 找到数据的成本。
  • 计算成本函数相对于权重和偏差的偏导数。
  • 权重和偏差参数被平滑,然后通过利用成本函数和𝛼(学习率)的梯度来更新。
  • 继续上述步骤,直到完成指定次数的迭代或达到全局最小值。

Adam(自适应矩估计)

Adam(自适应矩估计)是通过将梯度下降与动量和 RMS Prop 相结合而出现的算法。

在每次迭代测试中,

  • 找到数据的成本。
  • 计算成本函数相对于权重和偏差的偏导数。
  • 使用 RMS Prop 和带动量的梯度下降中使用的技术来平滑权重和偏差,然后通过利用成本函数和𝛼(学习率)的梯度来更新权重和偏差。
  • 继续上述步骤,直到完成指定次数的迭代或达到全局最小值。

摘要

  • 平均绝对误差对异常值是稳健的,而均方误差对异常值是敏感的
  • 梯度下降算法试图找到参数的最佳值,从而找到成本函数的全局最小值。
  • RMS Prop 和 Adam 等算法可被视为梯度下降算法的变体。

在我的 Kaggle 笔记本里找到这个帖子:https://www . ka ggle . com/srivignesh/cost-functions-of-regression-its-optimizations

参考文献:

[1]吴恩达,深度学习专精

LinkedInTwitter上联系我!

快乐的机器学习!

谢谢你!

营销活动的成本预测(数据清理和特征选择——第二部分)

原文:https://towardsdatascience.com/costs-prediction-of-a-marketing-campaign-data-cleaning-feature-selection-part-ii-6aa5298909b5?source=collection_archive---------35-----------------------

预测营销活动最佳目标候选人的数据科学方法

数据清理和特征选择—gon alo GUI mares Gomes

在第一篇文章中,我进行了探索性的数据分析,这让我们可以看得更远,超越最初的数据集。

EDA 可能是一项非常耗时的任务,很少是一次性走完的,尽管我们可能会发现自己经常回到早期部分更改和尝试一些不同的方法,但详细的分析通常会有所帮助,并为我们提供大量有关数据和变量行为的信息。

本文只关注第二部分,即清洁&功能选择

你可以在这里熟悉 EDA 部分
你可以在这里
找到这个项目的代码。
可点击
此处下载“bank_marketing_campaign.csv”数据集。

布拉登·科拉姆Unsplash 上拍摄的照片

数字特征之间的相关性

在降维的背景下,特征和目标变量之间的相关性分析被证明是双变量数据分析中的基本步骤,因为它帮助我们计算特征的重要性。

让我们从指出皮尔逊和斯皮尔曼的相关系数概念开始。

根据定义,皮尔逊相关系数,通常被称为皮尔逊相关系数r,是描述两个随机变量线性相关的程度,它们的统计关系有多强,在哪个方向发生,在二元数据中是否偶然。

值的范围从-1.0 到 1.0,其中第一个值表示总的负线性相关,而第二个值表示相反的线性相关。值为 0.0 表明没有线性关系。

另一个重要的推论是,皮尔逊相关性只能评估连续变量之间的线性关系,这意味着一个变量的变化意味着另一个变量以恒定的速率成比例地变化,否则它就是非线性关系。仅当变量呈正态分布时,才建议使用这种参数测试。

其中一个输出是相关性的 p 值,粗略显示了不相关系统产生某一数量级相关值的概率。低 p 值(通常≤0.05)告诉我们,相关性很可能是显著的。具体来说,p 值将揭示特征的预测能力。

# Most correlated against the target (Pearson method)
pearson = df_num.corr()
corr_target = pearson.target
display(corr_target.sort_values(ascending=False))

print("Ordered by rank in absolute values")
display(corr_target.abs().sort_values(ascending=False))

“Nr_employed”与目标最相关,其次是“pdays”、“euribor3m”和“emp_avr_rate”,同时,它们与目标的关系强度较低。下表让我们得出结论,所有特征都具有预测能力。

# Subdivision of target
ynum = df_num.target
Xnum = df_num.drop(["target"], axis= "columns")# Identifying variables with predictive power (Pearson p-value)
pd.DataFrame(
    [scipy.stats.pearsonr(Xnum[col], ynum) for col in Xnum.columns],
    columns=["Pearson Corr.", "p-value"],
    index=Xnum.columns,
).round(2).T

所有变量都有预测能力。

另一方面,斯皮尔曼相关系数,或斯皮尔曼相关系数,是一种秩序相关性的非参数度量,用于评估两个连续或有序变量之间的单调关系。

当出现以下情况之一时,出现单调关系:

当一个变量的值增加时,其他变量的值也会增加

b) 当一个变量的值增加时,其他变量的值就会减少

但是

a)+b) 不是以恒定的速率。

这意味着所有线性变量的关系同时是单调的,但反过来并不总是正确的,因为我们可以同时具有单调的非线性相关性。

# Numeric variables with higher monotonicity (spearman)
df_spearman = df_num.copy()
df_spearman.drop(["target"], axis=1, inplace=True)spearman_rank = pg.pairwise_corr(df_spearman, method='spearman').loc[:,['X','Y','r']]
pos = spearman_rank.sort_values(kind="quicksort", by=['r'], ascending=False).iloc[:5,:]
neg = spearman_rank.sort_values(kind="quicksort", by=['r'], ascending=False).iloc[-5:,:]
con = pd.concat([pos,neg], axis=0)
display(con.reset_index(drop=True))mask = np.triu(df_spearman.corr(method='spearman'), 1)
plt.figure(figsize=(19, 9))
sns.heatmap(df_spearman.corr(method='spearman'), annot=True, vmax=1, vmin=-1, square=True, cmap='BrBG', mask=mask);

10 个最相关的数字对,Spearman 方法:

“nr_employed”与目标最相关。变量‘EMP _ var _ rate’,‘NR _ employed’和‘euribor 3m’非常多余,但我相信这并不代表什么大问题。策略:暂时保留所有特性。

分类变量

当我们想要检查两个分类变量之间是否存在关系时,使用卡方独立性检验(此外,我们正在处理一个二元分类问题,卡方检验非常适合在这里执行)。

首先,我将指定零假设和替代假设来运行测试。

替代假设总是我们试图证明的,而无效假设是我们试图证明证据反对的假设。

  • (零假设) H0:特征和目标是独立的
  • (替代假设) Ha:特征和目标不是独立的

因此,对于被认为相关的特征,我们希望拒绝具有最低 p 值(p 值≤0.05)的 H0 (零假设)。

# Create categoric subset in order to see correlations results
Xcat = df_cat.select_dtypes(exclude=['int64','float64']).copy()
ycat = df.target# Study chi² for independence:
chi2 = []
p_val = []
for feature in cat_features:
    table = pd.crosstab(df_cat[feature], ycat)
    chi2.append(round(chi2_contingency(table)[0], 2))
    p_val.append(round(chi2_contingency(table)[1], 2))pd.DataFrame([chi2,p_val], columns = cat_features, index = ['chi2', 'p_value'])

策略:去除变量‘住房’和‘贷款’(p 值≥ 0.05)。

离群值、缺失值、异常和转换

数字特征

# Removing Target and creating a copy of the dataset
df_drop = df_num.drop(["target"], axis=1).copy()# Visualization of numerical data dispersion (boxplots)
fig, axs = plt.subplots(ncols=2, nrows=4, figsize=(16, 8))
index = 0
axs = axs.flatten()
for k,v in df_drop.items():
    sns.boxplot(y=k, data=df_drop, ax=axs[index], orient="h")
    index += 1
plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=5.0)display(df_drop.describe().loc[["mean","50%","std"]])
print(f"Any missing values: {df_drop.isnull().values.any()}")
print("")

所使用的技术确定了位于中位数的+1.5 IQR 和-1.5 IQR 的值,这是一种非参数方法,可用于我们发现的分布轮廓。

来源:https://upload . wikimedia . org/Wikipedia/commons/1/1a/box plot _ vs _ pdf . SVG

for column in df_drop.columns:
    median = df_drop[column].quantile()
    iqr_1_5 = (df_drop[column].quantile(q = 0.75) - df_drop[column].quantile(q = 0.25)) * 1.5
    outliers = df_drop[(df_drop[column]< median - iqr_1_5) | (df_drop[column] > median + iqr_1_5)][column].count()
    outliers_pct = round(outliers / df_drop[column].count() * 100, 1)
    print("'{}' = {} ({}%) outliers".format(column, outliers, outliers_pct))

输出:
'age' = 910 (2.2%)异常值
'pdays' = 1515 (3.7%)异常值
'previous' = 5625 (13.7%)异常值
'emp_var_rate' = 0 (0.0%)异常值
'cons_price_idx' = 770 (1.9%)异常值
'cons_conf_idx' = 1841 (4.5%)异常值
' EUR

# Displaying visuals
fig, ax  = plt.subplots(figsize = (18,10))
ax.axis("off")
v = 1
for column in df_drop.columns:
    ax1 = fig.add_subplot(2,4,v)
    plt.hist(df_drop[column])
    ax1.set_title(column)
    v+=1
    median = df_drop[column].quantile()
    iqr_1_5 = (df_drop[column].quantile(q = 0.75) - df_drop[column].quantile(q = 0.25)) * 1.5
    outliers = df_drop[(df_drop[column]< median - iqr_1_5) | (df_drop[column] > median + iqr_1_5)][column].count()
    ax1.axvline(median - iqr_1_5, color='red', linewidth=2)
    ax1.axvline(median + iqr_1_5, color='red', linewidth=2)plt.show()

我意识到用于识别异常值的方法选择了许多记录,最严重的情况是前一列中有将近 14%的被选数据。

据我所知,我决定保留所有类别的大部分记录,因为数据似乎已经被正确地测量并反映了现实。

为了强调模型不受异常值数量扩展的影响,我们将只保证我们将使用标准化技术,该技术不会忽略中心值之间距离的细节。

从数值数据的离差分析来看,似乎没有异常值。“年龄”的绘制数据具有正常的行为,我假设变量“pdays”中的极端数据点是“超出范围”的值,至于其他的,每个变量似乎都有一个平衡的主体。

关于缺失值和其他异常,我已经分析了所有数值变量的唯一值和各自的计数,并且似乎没有缺失值

分类变量

继续讨论分类变量,检查是否有任何缺失值或其他需要处理的异常,以便通过各种技术将这些变量转换为数字特征,并根据降维和信息增益之间的最佳平衡进行逐案分析。

# Creating a copy
df_cat_t = df_cat.copy()df_cat.describe() # Describing the categorical dataframe

变量:‘作业’

print(f"Unique values: {df_cat.job.nunique()}")# Observations by class
num_obs = df_cat.job.value_counts()
num_o = pd.DataFrame(num_obs)
num_o.rename(columns={"job":"Freq abs"}, inplace=True)
num_o_pc = (df_cat.job.value_counts(normalize=True) * 100).round(decimals=2)
num_obs_pc = pd.DataFrame(num_o_pc)
num_obs_pc.rename(columns={"job":"percent %"}, inplace=True)
n_obs = pd.concat([num_o,num_obs_pc], axis=1)
display(n_obs)

在这种情况下,“未知”是我们缺少的值。这里的策略是用最常见的值——模态值来估算“未知数”。我们先把它转换成 np.nan,然后进行插补。

# Replacing 'unknown' by NaN
df_cat_t.job.replace(to_replace="unknown", value=np.nan, inplace=True)# Imputation missing values by the modal value
df_cat_t['job'] = df_cat_t.job.fillna(df_cat_t.job.value_counts().index[0])# Confirming and visualizing of "job"
df_cat_t.job.value_counts(dropna=False).plot(kind='pie', figsize=(10,6), explode=(0.02, 0.02, 0.02, 0.02, 
                 0.02, 0.02, 0.02, 0.02,
                 0.02, 0.02, 0.02));print(f"Unique values: {df_cat_t.job.nunique()}")

我还将显示在编码过程中,一个热编码和二进制编码会创建多少额外列的结果。

# Encoding 'job' OHE or BIN
df_job = df_cat_t.job
job_ohe = pd.get_dummies(df_job)
binary_encoder_job = BinaryEncoder()
job_bin = binary_encoder_job.fit_transform(df_job)print(f'''
*Results*
job OHE: {job_ohe.shape[1]} columns
job BIN: {job_bin.shape[1]} columns''')>> output:
*Results*
job OHE: 11 columns
job BIN: 5 columns <--- apply

此处要应用的二进制编码。虽然与 OHE 相比有一些信息损失,但就降维而言,这是一个更好的权衡。

# Removing attribute 'job' and concatenation job_bin to df_cat_t
df_cat_t.drop(["job"],axis=1,inplace=True)
df_cat_t = pd.concat([df_cat_t,job_bin],axis=1)
display(df_cat_t.head(2))
display(df_cat_t.shape)

变量:《婚姻大事》

“未知”被解释为缺少值。这与“工作”变量的情况相同。策略是用最常见的值来估算缺失值。

# Replacing 'unknown' by NaN
df_cat_t.marital.replace(to_replace="unknown", value=np.nan, inplace=True)# Imputation of missing values by modal value
df_cat_t['marital'] = df_cat_t.marital.fillna(df_cat_t.marital.value_counts().index[0])# Graph "pie"
df_cat_t['marital'].value_counts(dropna=False).plot(kind='pie', figsize=(10,6), explode = (0.02, 0.02, 0.02), autopct='%1.1f%%', startangle=120);print(f"Unique values: {df_cat_t.marital.nunique()}")

同样,显示一个热编码和二进制编码将使用编码过程创建多少额外列的结果。

df_marital = df_cat_t.marital
marital_ohe = pd.get_dummies(df_marital)
binary_encoder_marital = BinaryEncoder()
marital_bin = binary_encoder_marital.fit_transform(df_marital)print(f'''
*Results*
marital OHE: {marital_ohe.shape[1]} columns
marital BIN: {marital_bin.shape[1]} columns''')>> Output:
*Results*
marital OHE: 3 columns <--- apply
marital BIN: 3 columns

此处应用一种热编码,因为与二进制编码相比,它保留了更多信息。

df_cat_t.drop(["marital"],axis=1,inplace=True)
df_cat_t = pd.concat([df_cat_t,marital_ohe],axis=1)
display(df_cat_t.head(2))
display(df_cat_t.shape)

变量:“教育”

我们看的是同样的情况,其中“未知”被解释为缺少值。采用的策略是按最频繁值进行估算。

# Replacing 'unknown' by NaN
df_cat_t.education.replace(to_replace="unknown", value=np.nan, inplace=True)# Imputation of missing values by modal value
df_cat_t['education'] = df_cat_t.education.fillna(df_cat_t.education.value_counts().index[0])# Graph "pie"
df_cat_t['education'].value_counts(dropna=False).plot(kind='pie', figsize=(10,6), explode = (0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01), autopct='%1.1f%%', startangle=0);print(f"Unique values: {df_cat_t.education.nunique()}")

教育' '有 8 个服从特定顺序的类,这意味着它将根据相同的等级进行编码。升序为:'文盲','基础. 4y ',' nasic.6y ','基础. 9y ','高中','专业.课程','大学.学位'。

为此,我将应用一个地图功能。数据映射用于将一个序列中的一组特定值替换为另一组可能从一个函数、一个字典或一个序列中导出的值。

df_cat_t["education"] = df_cat_t.education.map({"university.degree":7, "professional.course":6, "high.school":5, "basic.9y":4, basic.6y":3, "basic.4y":2, "illiterate":1 })display(df_cat_t.education.value_counts())
display(df_cat_t.head(2))
display(df_cat_t.shape)>> output:
7    13899
5     9515
4     6045
6     5243
2     4176
3     2292
1       18

变量:“默认”

在这种情况下,“未知”值被解释为缺失值。“是”类是没有意义的,任何“未知”值的插补都可能严重损害所有结果。所以,还是去掉这个变量比较好。

df_cat_t.drop(["default"], axis=1, inplace=True)
display(df_cat_t.head(2))
display(df_cat_t.shape)

变量:“poutcome”

在这种情况下,“不存在”被解释为相关值。要遵循的策略是不对这个变量进行任何转换。

# Encoding 'poutcome' OHE
df_poutcome = df_cat_t.poutcome
poutcome_ohe = pd.get_dummies(df_poutcome)
binary_encoder_poutcome = BinaryEncoder()
poutcome_bin = binary_encoder_poutcome.fit_transform(df_poutcome)print(f'''
*Results*
poutcome OHE: {poutcome_ohe.shape[1]} columns
poutcome BIN: {poutcome_bin.shape[1]} columns''')>> Output:
*Results*
poutcome OHE: 3 columns <--- Apply
poutcome BIN: 3 columns# Remove 'poutcome' and concatenation poutcome_ohedf_cat_t.drop(["poutcome"],axis=1,inplace=True)
df_cat_t = pd.concat([df_cat_t,poutcome_ohe],axis=1)
display(df_cat_t.head(2))
display(df_cat_t.shape)

# Analysis of the transformed dataset
display(df_cat_t.dtypes)
print("")
print(f"df_cat (original): ........ {df_cat.shape}")
print(f"df_cat_t (transformed): ... {df_cat_t.shape}")

# Concatenation of both numeric and categorical datasets
df_numcat = pd.concat([df_cat_t,df_num], axis=1)# Removing any NaN values
df_numcat.dropna(how="any", axis=0)

在这一阶段,在处理完所有缺失值和插补并将所有分类特征转化为数字特征后,让我们检查这些特征的相关性,确定并选择没有预测能力的变量。

# Subdivision of the target
y_numcat = df_numcat.target
X_numcat = df_numcat.drop(["target"], axis= "columns")# Identifying all variables with great predictive power (Pearson Correlation p-value)
dataframe = pd.DataFrame(
      [scipy.stats.pearsonr(X_numcat[col], y_numcat) for col in X_numcat.columns],
      columns=["Pearson Corr.", "p-value"],
      index=X_numcat.columns,
).round(2).sort_values(by="p-value", ascending=False)display(dataframe)

# Identifying columns in which p-value > 0.05
column = []
for item in dataframe.index:
    if dataframe['p-value'][item] >= 0.05:
        column.append(item)# Removing statistically non significant columns
df_numcat.drop(column, axis=1, inplace=True)df_numcat

就这样。我们已经准备好进行第三部分,也是最后一部分,肯定是我们项目中最激动人心的阶段,建模部分。在那里见。感谢阅读!

[## 机器学习:营销活动的成本预测(探索性数据分析——第一部分)

预测营销活动最佳目标候选人的数据科学方法

towardsdatascience.com](/machine-learning-costs-prediction-of-a-marketing-campaign-exploratory-data-analysis-part-i-758b8f0ff5d4) [## 熊猫变得容易(指南— I)

有许多最常用的函数和方法的例子

towardsdatascience.com](/pandas-made-easy-the-guide-i-81834f075893)

如果你想回顾这个项目的第一部分,EDA 部分,点击这里
你可以在这里找到这个项目的全部代码。

联系人

好的阅读,伟大的编码!

神经网络能预测特斯拉的巨大增长吗?

原文:https://towardsdatascience.com/could-a-neural-network-predict-teslas-enormous-growth-648b13d355f9?source=collection_archive---------40-----------------------

2020 年 1 月对埃隆·马斯克和他的公司来说是一个重要的月份。

来源: Unsplash

2020 年对特斯拉来说是意义非凡的一年。今年年初,特斯拉股票的价格为 430 美元,在撰写本文时,其当前价值为 887 美元。在 5 周的时间里,这是一个 106%的增长。🤯

编辑:从那以后就跌了。我将坚持使用这些数字,因为价格不可避免地会不断变化

投资者和华尔街分析师对这种巨大的增长感到困惑。有人说,这是因为股票正在经历卖空挤压,即当股票已经处于良好的反弹时,卖空者(卖出借来的股票并以更低的价格买回的人)被迫回购股票以弥补损失。这导致了有限供给下的过度需求,从而抬高了价格。

其他人说需求增加是因为 FOMO(害怕错过)。所有的投资者都想参与这次突然的上涨。或者这仅仅是因为特斯拉在过去的 6 个月里表现非常好,连续两个季度盈利,并以高于预期的速度开设工厂,并有望成为电动汽车电池行业的重要参与者。

不管惊人增长背后的推理是什么,我认为没有人能够预测到如此巨大的增长。尽管我的一些持有特斯拉股票的朋友坚持说他们从一开始就看到了这一点…

这就引出了一个问题,如果人类不能预测这种事件的发生,那么有没有什么系统能做到呢?答案是肯定的。

交易中的机器学习

证券交易是目前机器学习最大的应用之一。机器学习就是接受数据,从中得出结论和预测。在金融领域,数据随处可得,许多交易算法都严格依赖于数据处理。事实上,超过 70%的交易是由机器人进行的。

来源: Unsplash

具体来说,ML 在金融中的用途是从证券中获取历史数据,然后预测其价格在接下来的 x 时间内将如何变化。根据这一预测,你可以决定买入、卖出或持有该证券是否是一个好的决定。

有了这个,我试图创建一个机器学习模型,可以预测特斯拉令人着迷的 1 月份增长。

解释模型

我使用的模型将历史价格和交易量(当天交易的股票数量)作为输入。这样做的目的是看股票的走势是否有规律可循。

这种类型的分析在金融学中被称为技术分析,正式定义为“根据图表上的价格趋势和模式评估投资的学科。”技术分析师认为,对股票以往走势的洞察有助于预测其未来走势。

为了预测 1 月份的价格,我使用了 Telsa 从 IPO(早在 2010 年)到 2019 年 12 月的历史价格数据作为训练数据。该模型将使用这些数据点来找到模式,然后将它们应用到测试数据,即一月价格。我从 AlphaVantage 下载了 CSV 格式的数据,然后手动将数据分割成训练和测试 CSV 文件。

两个来自 AlphaVantage 的数据集。图片我的电脑截图

浏览代码

导入数据集后,构建模型的第一个重要步骤是 规范化 数据。标准化数据意味着调整值以适应一定的范围,在我们的例子中是 0 到 1。这使得模型可以更容易地学习非异常值。

图中表示的是一个试图通过减少模型损失来达到全局最小值的模型。使用统一的比例,模型更容易做到这一点。对于这个模型的正则化,我使用了 SkiKit Learn 的 MinMaxScaler。

我的主旨截图

LSTM 建筑

LSTM(长短期记忆网络)是这种模型中使用的神经网络类型。LSTM 模型是一种 RNN(递归神经网络),rnn 有一个过去的信息向量作为输入,称为隐藏状态,这有助于它稍后进行分类。LSTMs 非常擅长存储长期信息,而 rnn 会因为消失梯度问题而忘记这些信息。

关键理解:内存流经 LSTM,允许它通过 Colah 博客使用过去的信息图像

在本文中,我不会深入研究 RNNs 或 lstm 的技术深度,您只需理解一个关键概念,即 lstm 擅长存储长期相关性,这有利于股市预测。你可以在本文中了解更多关于 LSTMs 的信息。

LSTM 的时间戳数据结构

时间戳基本上就是股票在那个价格的日期。在我们的训练数据集中,我们有超过 2000 个时间戳(每天一个),每个时间戳都有开盘价、收盘价、最高价、最低价和交易量值。我们只关心开盘价和交易量。

我们的模型主要做的是查看过去 60 个时间戳(过去 60 天)的开盘价,并预测第二天的价格。

自我创造的形象

通过查看前 60 天,重复这个过程来预测第二天的产量。在代码中构造的方式是,X_train 是所有输入数组的数组,Y_train 是所有输出正确预测的数组(模型将根据其计算损失)。

我的主旨截图

建造 RNN

构建 RNN 变得很简单,因为我们使用了一个名为 Keras 的库,这是一个非常高级的 ML 框架。我们正在使用一个名为 Sequential 的 Keras 类,以及来自 Keras 的图层:LSTM、辍学和密集图层。

我的主旨截图

为了使用 Keras 方法,我们必须对输入数据(在时间戳步骤中创建的)进行整形,以满足 Keras 要求。我们使用 NumPy reshape 方法将 X_train 数组转换为 3D 数组。

然后,我们将输入数据传递到由 LSTM 层、漏失层和致密层组成的序列模型中。LSTMs 当然是试图在以前的数据中找到模式的主要层,丢弃层基本上丢弃 20%的神经元以防止过度拟合。最后的密集层产生只有一个节点的输出。

X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))regressor = Sequential()regressor.add(LSTM(units = 50, return_sequences = True, input_shape = (X_train.shape[1], 1)))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units = 50))
regressor.add(Dropout(0.2))
regressor.add(Dense(units = 1))

最后,使用 adam 优化器和损失函数的均方误差来编译和训练模型。我用 10 个时期运行该模型,并在训练数据上得到 0.04 的最终损失。

关键时刻…

既然已经对模型进行了训练,那么是时候在测试数据上测试模型了。LSTM 模型能预测特斯拉 1 月份的增长吗?

根据我的模型…不😂。

该模型无法非常准确地预测特斯拉股票的准确走势。这可能是因为它需要更多的历元来训练,或者对超参数进行其他调整。这是一次奇妙的学习经历,我学到了很多关于特征工程和 LSTM 网络的知识。

完整代码链接:【https://github.com/lewwwis/tslastockreplicate

嘿,你们好!👋我是亚伦,一个 15 岁的孩子,对人工智能和人类长寿之间的交叉有着超级的热情。请随时在Linkedin上与我联系,或者查看我的完整 作品集

人工智能能比政治家更好地管理经济吗?

原文:https://towardsdatascience.com/could-ai-manage-the-economy-better-than-politicians-6b37c6f68190?source=collection_archive---------53-----------------------

国会的工作支持率为 18%。算法的门槛很低

Salesforces 的 AI 经济学家

大多数明智的人会认为,电脑程序可以更好地完成我们选举出来的代表的工作是荒谬的。例如,对任何政府来说,管理经济及其所有运转部分都是一项艰巨的任务。平衡新政策的实施和保持稳定的掌舵手不是一件容易的事,即使有大批公务员随时准备给决策者提供备忘录和白皮书。

另一方面,就在几年前,计算机程序(人工智能)可以写诗的想法是荒谬的。现在,AI 可以写出好到足以愚弄有声望的法官认为这一定是人类写的诗。你可以将癌症诊断理论力学职业扑克添加到 AI 性能可以超越卑微的智人的令人惊讶的领域列表中。美国软件公司 Salesforce 的一项新举措旨在将“T8”经济政策添加到该列表中。

“人工智能经济学家”研究项目的负责人张(Stephen Zhang)表示,经济学家和政治家所依赖的典型经济模型正面临严峻挑战。为了能够进行可控的数学分析,模型依赖于假设。他们可能只会孤立地关注一个政策杠杆(比如,只关注商品及服务税,而不是所有税收),并努力应对像新冠肺炎那样的大规模冲击。最重要的是,经济模型依赖于被揭穿的人类是不知疲倦的理性行为者的观念。

张和 Salesforce 认为他们可以用人工智能解决这些问题。通过“强化学习框架”,Salesforce AI 可以制定有效的经济政策,而无需求助于任何经济模型或现有理论。人工智能通过模拟不同经济政策对一个经济体的影响并观察结果来做到这一点。人工智能的任务是实现不同的社会结果,并提出平衡这些目标的最佳经济方案。

“强化学习”指的是他们的人工智能在眨眼之间运行数百万次模拟的方式,每个实例都从上次模拟中“工作”的内容中学习。人工智能没有任何关于经济理论或政策的先验知识——它在观察了一个又一个模拟后,自己想出了要实施什么样的政策。你可以认为人工智能是从一张白纸开始的,它可以只关注结果,不受几十年来通常主导政策讨论的经济理论的阻碍。

人工智能经济学家的早期迭代是为一个称为“收集和构建”的场景而构建的。这个场景反映了一个简单的 2D 经济,不同的“代理人”收集资源,赚钱,建造房屋。人工智能可以按照工人喜欢的方式征税,也可以通过福利重新分配资金。人工智能的任务是最大化代理人的生产力,同时最小化不平等(代理人有不同的技能,改变行为,并倾向于赚不同的钱)。

在无数次模拟中,人工智能经济学家尝试了税收和福利的不同组合,以找到最佳平衡。就像在现实世界中,对代理商征税过多会降低他们的生产力,但不对他们征税意味着没有钱进行再分配。

强化学习阶段的结果令人印象深刻。在结论中,Salesforces 的 AI 计算出了能产生最高生产率和平等综合得分的精确税收和福利体系。

作为与人工智能经济学家的对比,研究科学家在更正统的经济政策体系下运行了这一场景。其中包括没有税收或再分配的自由市场体系、美国税收体系以及经济学家伊曼纽尔·塞兹(Emmanuel Saez)提出的广受欢迎的税收公式。这位人工智能经济学家,尽管在开始时没有税收理论或经济学方面的现有知识,但在最大化生产率和平等方面胜过了所有其他人。

尽管这是人工智能经济政策的一个令人鼓舞的开端,但简化的 2D 情景显然是对复杂混乱的实体经济的苍白模仿。当然,政府需要平衡的目标不仅仅是生产力和平等。然而,为人工智能经济学家提供动力的强化学习技术可以为更复杂的人工智能奠定基础,以管理现实世界的所有复杂性。Salesforce 乐观地认为它可以扩大他们有前途的工作。

考虑到人工智能在设计经济政策方面优于人类的根本潜力,提前思考对政治和政府可能产生的后果是值得的。虽然担心将经济决策权交给人工智能可能会导致民主遭到侵蚀是可以理解的,但情况未必如此。请记住,人工智能并不决定什么结果(生产力、平等等)是可取的,而是决定使用哪些经济杠杆来最好地实现这些目标。可以说,选民可能会被解放出来,专注于他们关心的事情(结果),而不是需要了解经济政策的细节。

作为这种后人工智能政治的一个例子,政党可以就他们将输入人工智能超级计算机的优先事项进行竞选。民主党人可能会说,他们会让人工智能承担平衡生产率和再分配的任务。共和党人可能会承诺给予人工智能自由,尽一切努力实现经济增长最大化。绿党会将环境保护置于 GDP 之上。诸如此类。无论哪个政党在选举中获胜,都可以向 AI 提供这些优先事项,AI 将据此制定未来三年的经济政策。

这是一个完全不同的政治图景,但至少我们会在经济问题上获得更透明的政治。目前,所有的政党都致力于实现一个“强大”、“公平”以及其他平淡无奇的经济。如果政党组建政府,他们甚至不一定会将自己的竞选立场转化为政策。拥有一个将它设定的社会目标转化为经济政策的人工智能,将迫使各方更清楚地知道他们愿意在优先事项方面做出什么样的取舍。

无论我们是否最终实现该国第二重要政治职位的自动化,人工智能都将在帮助政府制定政策方面发挥越来越重要的作用。凭借设计良好的人工智能的力量和规模,这一趋势应该受到欢迎,因为它是朝着更好的政府迈出的一步。然而,对人工智能的更大依赖确实引发了一些独特的问题。

首先,人工智能框架及其数据的完整性必须是神圣不可侵犯的。特别是如果国家的经济成果处于危险之中,人工智能将不得不受到保护,免受来自外部世界的黑客攻击和内部人士的干扰。与此相关,人工智能处理的数据必须不受目前困扰太多算法的偏见的影响。人工智能工程师往往是白人和富人,应该非常小心,以确保人工智能没有无意识地倾向于那些特权群体。现有的经济政策已经足够了。

最后,人工智能必须是“可解释的”——也就是说,特定的人工智能必须能够显示其政策建议背后的工作,以便专家可以交叉检查。这不是一个简单的技术壮举,因为高级人工智能的推理有时过于复杂,甚至连人工智能的创造者都难以理解。然而,将经济交给一个神秘而不透明的人工智能是一个反乌托邦的噩梦。

部分由于这些技术上的障碍,还没有政治家面临需要使用他们自己的失业计划的风险。但 Salesforces 的人工智能经济学家为人工智能政策设计开辟了一条道路。在吸收了政府掌握的所有大量数据后,一个今天可以用 2D GIF 概括其模拟的人工智能可能在十年后能够模拟整个经济。在那之前很久,“客观”和“最佳”治理的最高准则应该引发一些受欢迎的对话,讨论我们究竟从我们的代表那里寻求什么,以及他们通过的政策。

Nim 能代替 Python 吗?

原文:https://towardsdatascience.com/could-nim-replace-python-547145afcfd5?source=collection_archive---------0-----------------------

为什么这种羽翼未丰的计算机语言可能成为新的脚本之王

(src = http://nim-lang.org)

介绍

多年以来,没有一种编程语言比 Python 更适合编写脚本。Python 是 Guido Van Rossum 在 20 世纪 80 年代后期用 c 语言编写的一种解释型语言,Van Rossum 和其他许多著名的计算机科学家一样,来自荷兰,他在那里从 Centrum Wiskunde & Informatica 内部编写 Python,或者用粗略的英文翻译,

国家数学和计算机科学研究所

P ython 拥有当时计算机中流行的传统低级语言的巨大优势,如 C、FORTRAN、BASIC、C++和 Lisp。首先,Python 的语法简单得多,也容易掌握。这使得最终用户可以很好地使用 Python 来执行他们的系统所需的任务。此外,尽管以今天的标准来看,Python 被广泛认为是“慢”的,但在 1989 年,拥有一种读起来像英语的语言,甚至远不如其竞争对手的性能包装,这是一项相当了不起的成就。

(src = 堆栈溢出)

计算机编程语言

甚至在最近,

随着 Python 变得比 Java 和 Javascript 都更受欢迎,Python 和与其受欢迎程度相应的工作已经超过了“大男孩”。Python 的生态系统绝对是与众不同的,不仅是在一般的编程方面,而且在不断扩大的

机器学习

随着 Python 的流行,这种语言的缺陷和问题变得越来越普遍。虽然 Python 确实是一门伟大的语言,但它的速度,我之前提到的速度是它的

“致命弱点”

虽然这并不是说 Python 对于机器学习来说仍然不可行,但是从地球上最流行的统计语言进行改变肯定会带来一些性能上的好处。这也不一定是 Python 的错,因为这种语言被开发用于机器学习仅仅是因为它非常受欢迎。对于大多数应用程序,Python 工作得非常出色;但是,每当加载许多观察值时,这种情况通常会发生变化。出于这个原因,Scala 通常被选为在美国企业内部推动大数据的语言。Scala 也不是没有问题,尽管 Scala 确实拥有比其他两个竞争对手更好的生态系统,

r 和朱莉娅

介绍:尼姆

尽管 Nim 和 Python 有相似之处,但 Nim 比 Python 年轻得多,12 年前的 2008 年才被呈现出来。这给尼姆带来了一些显著的好处。首先,Nim 比 Python 更快,但仍由同一种语言 c 解释。尽管从技术上讲 Nim 是用解释器运行的,但应该注意的是,Nim 也有自己的编译器。也就是说,有许多很酷的特性使 Nim 成为 Python 的潜在替代者,这可能是你没有预料到的。

编译的可执行文件

Python 的一个常见主题是需要 Python 才能运行 Python,这包括应用程序的依赖性。这是有问题的,因为这意味着 Python 应用程序以这样或那样的方式被打包成具有所述依赖性的包。最重要的是,虚拟环境很可能会经常出现。虽然这并不可怕,并且承认大多数统计语言都是这样做的,但是 Nim 通过将可执行文件与运行所需的依赖项打包在一起,在这方面做得更好。这不仅使管理系统间的依赖关系变得轻而易举,还使部署变得容易

比 Py 容易(看到我在那里做了什么吗?)

这些编译后的可执行文件还可以通用地兼容 Unix 类系统、Linux、Mac 和 Berkley 软件发行版,以及 Windows NT 内核。编译后的可执行文件解决了依赖性问题,使得发布应用程序变得非常容易,甚至可以用一个简单的“.”来部署 API 或“源”命令。

普遍的

Nim 相对于 Python 有一个很大的优势,因为 Nim 不仅可以用 C 编译,还可以用 C++编译,更令人兴奋的是:

java 描述语言

这意味着 Nim 不仅有潜力担当 Python 作为运行基于数据的 web 后端的脚本语言的角色,而且 Nim 也可以作为类似于 Javascript 的前端。这是 Python 的一大优势。虽然 Python 当然非常适合部署端点,并且通常可以很好地完成工作,但是全面使用单一语言当然有它的优势!

特征

Nim 的代码库主要是基于函数范式构建的。这意味着 Nim 可以是一种非常有表现力的语言,而且可以轻松实现比 Python 更酷的特性。其中一个特性是我一直以来最喜欢的特性之一,早在 1958 年,随着 Lisp 的发布,

宏。

(我永远不会明白为什么这是 Lisp 的吉祥物,src = Common Lisp )

宏和元编程几乎和计算本身一样早就存在了,而且非常有用,尤其是在机器学习领域。

速度

众所周知,随着规模的扩大,对所有事情都使用 Python 会很成问题。这是因为许多训练算法利用递归成本或损失函数,该函数对于任何语言都是密集运行的。有很多语言和想法都试图对抗这一点,比如 Julia、Python 中的 Python(这本身就是一个兔子洞),还有更成功的:Cython。

然而,这些解决方案也带来了自身的问题。虽然事实上,Julia 是我最喜欢的语言,也可能是最有可能取代 Python 的语言,但它没有 Python 所标榜的生态系统。虽然有 PyCall.jl,但使用它时的性能通常会低于 Python,在这种情况下,

为什么不用 Python 呢?

Python 中的 Python 是一个有趣的概念,但还没有很好的实现,因为这个概念本身相当复杂。更糟糕的是,Python 中的 Python 比 Julia 或 Nim 这样的解决方案实现起来要困难得多。至于 Cython,与普遍的看法相反,Cython 并不普遍工作,依赖它可能不是一个好主意(去过那里,做过。)

Nim 的优势是比 Python 快。对于脚本来说,Nim 增加的速度肯定会改变系统维护和各种脚本的运行方式。使用 Nim 可能没有 Julia 或 C 那么快,但由于它与 Python 和 Bash 有着简单的相似性,它肯定会容易得多。

结论

尽管 Nim 确实是一种非常酷,甚至有用的语言,但我非常怀疑“Python 接管”即将到来。与 Python 相比,Nim 只是一个生态系统的一小部分,而且还需要做更多的工作来适应 Python,这使它在其他编程语言中处于一种边缘状态。尽管 Nim 的特性确实比 Python 的强,但很难与一个大家都知道如何使用的已建立的软件包库相提并论。

我认为尼姆的故事和朱莉娅的相似。Nim 是一种漂亮的语言,既富于表现力,又简单高效,但是如果没有一个稳定的后端,我认为 Nim 不太可能成为脚本领域的佼佼者,对我来说更重要的是:统计领域。但是所有这些并不是说 Nim 不是一种值得学习的语言。Nim 是一种超级酷、易用、快速的高级函数式编程语言。任何结合了所有这些词的东西都很可能对你的编程工具箱有益。

尽管尼姆可能不会成为世界上的下一个大人物,但我确实很享受和它在一起的时光。更令我兴奋的是 Julia 展现出的潜力,而不是 Nim,再多一点开发,我想我们肯定能提高 ML 的速度。在这方面,处理器的类比当然是合适的:在过去的几年里,没有 64 位注册表的处理器,没有时钟速度超过 1 GhZ 的处理器(以今天的标准来看,这完全是一个 slug。)未来是令人兴奋的,我简直迫不及待地想看看它将包括什么技术堆栈。

冥王星有可能真正取代木星吗?

原文:https://towardsdatascience.com/could-pluto-be-a-real-jupyter-replacement-6574bfb40cc6?source=collection_archive---------15-----------------------

意见

对 Pluto.jl 笔记本和其他 Julia 编程语言开发解决方案的简要概述和比较。

(图片由作者提供)

你是一个厌倦了 Jupyter Notebook 总是妨碍你编程的 Julia 开发者吗?

我没有。

尽管我总体上不需要新的笔记本系统,因为我甚至不经常使用我现有的系统,但由于一位朋友的推荐,我决定看看 Pluto.jl。Pluto.jl 是一个功能齐全的 web/markdown/code 笔记本,以一个简单的 Julia 包的形式出现。它拥有你可能从典型的 Jupyter 笔记本电脑中期待的所有优秀功能。有一段时间,我其实是用一个用 Scala 写的笔记本来写 Scala 的,它让我怀念 Jupyter,坦白说,它的替代品,

Spylon 内核

在 Scala 的数据分析坟墓上放一个新的墓碑。所有这些都是说,虽然我是朱莉娅的大力支持者,但我不确定这是否会改变我的想法——这个主题可能会变成一个问题,

为什么不用 Jupyter?

回答我的问题

尽管我会说我认为自己对此类事情持怀疑态度,但我当然愿意给 Pluto.jl 一个机会。首先,我想看看冥王星和木星之间的一些关键区别。如果使用冥王星有什么改进的话,那么它对我来说可能是一个更好的选择——因为我写了很多 Julia。

当然,我决定检查信息的第一个地方是 Pluto.jl Github README markdown 文件。就在这时,我意识到我对 Pluto.jl 的批评是完全没有根据的。这个笔记本实际上非常智能,它会不断地分析你写的代码。例如,如果我有一个州外代码,它还没有运行过我试图在其中使用的依赖项,那么 Pluto 将自动为我运行该代码。

此外,每当变量或函数发生变化时,Pluto 会自动运行与之相关的所有其他代码单元。这很方便,而且完全省去了转到笔记本顶部和垃圾邮件 shift+enter 活动。这是一个很大的节奏变化,也不用担心我的笔记本的可复制性。Julia 有很好的方法来管理包,因此大多数时间依赖性问题不会被其他程序员感觉到。除此之外,还有让代码运行内核状态的努力。

直接引用 Pluto.jl 自述文件,

在任何瞬间,程序状态完全由你看到的代码描述。

这是我的一个大问题。使用 JIT 会使情况变得更糟,当您不需要一直重启和运行所有单元时,JIT 会工作得更好。如果你想了解更多关于可重复研究和我在 Jupyter 遇到的基本问题,这里有两篇我写的关于这个主题的文章!:

[## 数据科学家可重复研究指南

你的假设还是假设!

towardsdatascience.com](/the-data-scientists-guide-to-reproducible-research-ea1a512be3e5) [## 笔记本——投资组合的杀手

为什么不应该将笔记本电脑作为数据科学投资组合的主要特征。

towardsdatascience.com](/jupyter-notebook-the-killer-of-portfolios-8fb70638491)

这对于分析来说非常酷的一个很好的例子是,我可以主动改变一个单元格中的数据,同时在另一个单元格中可视化它。仅仅改变 Jupyter 处理内核和状态的方式实际上是令人难以置信的令人耳目一新的。另一件很棒的事情是 Pluto.jl 解释器可以读取 Julia 代码——就像在真正的 Julia 代码中一样。没有。仅 ipynbs。jl 文件。这意味着在 Pluto 中开发的任何东西都可以在 Julia 的整个范围内使用,并且任何程序员都可以在任何会话中使用相同的代码非常容易地进行工作。

尝试一下

我想如果我要给 Pluto.jl 一个体面的尝试,我也可以用它投入到一个经典的数据科学项目中。对于我的技术堆栈,我将使用 DataFrames.jl 数据框架,牛虻. jl 用于可视化,而车床. jl 用于统计分析和机器学习——令人兴奋!当然,为了测试冥王星,我们需要首先添加它:

julia>]
pkg> add Pluto

添加 Pluto 后,可以使用 Pluto.run()函数运行它。

using Pluto;Pluto.run()

(图片由作者提供)

每当您第一次启动 Pluto 时,都会看到这个页面。我认为你必须在文本框中手动输入一个路径来打开一个笔记本有点乏味。进入这些笔记本的第一件事就是运行 pwd()来查看我在文件系统中的位置。

(图片由作者提供)

有趣的是,我在我的。Julia 目录位于~/。这是不幸的,因为我希望加载一些。CSV 数据输入。让我们看看当我们保存笔记本时,这种情况是否会发生变化。

(图片作者

好消息!

因此,在这个笔记本上,我有几个关于完成项目的主要问题。首先,每当我 ctrl+enter 时,它不会创建一个新的单元格。其次,stdout 在这些笔记本上不工作。我无论如何也不明白这是为什么,但你不能打印()或 println()。我跑题了,让我们实际上得到一些数据读入。我最近挑选的另一个很酷的包(Emmett 去购物了)是 PrettyTables.jl,所以希望我的数据框至少看起来不错。

(图片由作者提供)

这需要一些时间来适应。我确实喜欢笔记本的外观,当然也有一些方面我很喜欢,比如漂亮的输出。

(图片由作者提供)

我渴望得到一个分类问题,所以在这个小小的特性列表中,“Precip Type”分类确实吸引了我的注意。然而,就我所知,这个数据框架只能是雨天的分类。幸运的是,我们可以使用 Set 类型检查给定数组中唯一值的数量。

length(Set(df[Symbol("Precip Type")]))

返回 3。当然,对于一个分类问题来说,这是大量的类别,然而,其中一个类别碰巧是空的——这意味着我们可能应该清理这些数据,而不是将我们的手伸入机器学习饼干罐。幸运的是,“Summary”特性在这个包含大约 96,000 个观察值的数据集上有大约 27 个不同的分类。

Set(df[Symbol(“Summary”)])

(图片由作者提供)

在 Julia 语言中,检查缺失观测值的一个很好的方法是收集缺失观测值,并将其与数据帧的原始长度进行比较。

testmissings = collect(skipmissing(df[:Summary]))
length(testmissings)

(图片由作者提供)

好消息——是同一个号码!我不是天文学家或天气预报员,但如果要我猜的话,我会说这些描述很有可能与湿度有关。不过,为了确保万无一失,让我们过滤数据并进行测试。

老实说,这正是我对笔记本感到恼火的地方。很多事情都是我无法习惯的。很容易,最恼人的事情是我一次删除三个单元格,试图删除一些文本。在使用了这么长时间之后,我仍然没有找到如何添加 markdown。

我也最终迷失在如何修复我不小心改变了数据框的复制错误上。笔记本不允许我重新定义变量,这使得使用这些相对基础的代码变得非常乏味。尽管如此,我还是得到了一个模型拟合——它有 40%的准确率。在那之后,我想也许这些特征并不像我之前想的那样相关…无论如何,他们的统计测试并没有显示出很大的意义。

我对 Pluto 的另一大抱怨是文档浏览器,它甚至可能不存在,至少允许一个人运行常规的帮助功能。我认为这是一个伟大的想法,但是,也许只是需要一些熨平——可能一些 NLP 提示文本。

我跑题了,总的来说我是这个项目的粉丝,但肯定不会很快使用它。总的来说,我不是笔记本的忠实粉丝,但它们确实有它们的用途!如果我必须在 Pluto.jl 和 Jupyter 之间选择,我可能会选择 Jupyter 和 IJulia。然而,我希望这种情况在未来会有所改变。再加上这里和那里的一些东西,我确信这可能是一个有前途的开发环境。然而,在这一点上,我当然不能建议这样做…奇怪的是,这令人沮丧,而且坦率地说——感觉 IDE 对我的阻碍多于它对我的帮助。

希望以后 Pluto.jl 会更好。也有可能我不是目标观众,或者其他人可能比我更喜欢他们。虽然在引擎盖下确实有一些伟大的想法和真正非常酷的东西,但我有点兴奋地想看看未来会是什么样子。不过现在,我肯定会坚持使用 Atom 和 IJulia。

咨询聊天:引导高质量的治疗数据

原文:https://towardsdatascience.com/counsel-chat-bootstrapping-high-quality-therapy-data-971b419f33da?source=collection_archive---------13-----------------------

缺乏好的心理治疗数据。让我们继续努力。

照片由来自 PexelsPolina Zimmerman 拍摄

介绍

在过去的一年里,我一直在应用 NLP 来提高心理健康护理的质量。我发现在这个领域特别困难的一件事是缺乏高质量的数据。当然,你可以去搜索 Reddit,获得一些有趣的个人之间的治疗互动,但在作者看来,这是一个糟糕的替代客户和治疗师之间的实际互动。别误会,有数据集。他们只是,往往不是,专有或付费玩。

我希望这篇文章能介绍一组高质量的治疗师对真实病人的心理健康问题的回答。我将讨论数据源,关于数据集中有什么的基本信息,并展示一些简单的模型,我们可以使用这些数据训练聊天机器人!我和 counselchat.com没有关系,但是我认为他们做得很好,你应该去看看他们。这个项目的所有代码都可以在这里获得

关于 Medium 的一个不幸的事实是,它不允许你合著作品。这是一个与格林洛德博士的联合项目,他首先提出了这个项目,并帮助进行了所有的分析。此外,还得到了 CounselChat 联合创始人 Eric Strö和 Phil Lee 的帮助。Phil 是一位专注于创新机器学习和数据的连续创业者。埃里克是一名律师和有执照的心理健康顾问。

咨询聊天

Counselchat.com 登陆页面截图。

Counselchat.com 是专家社区的一个例子。这是一个平台,帮助辅导员建立自己的声誉,并与潜在客户进行有意义的接触。在这个网站上,治疗师回答客户提出的问题,用户可以喜欢他们认为最有帮助的回答。这是一个很好的想法,并提供了一些有趣的数据。

这个数据最酷的一点是,有经验证的治疗师发布了回答。不是每个回复都是优秀的,但是我们知道它来自领域专家。如果你使用 Reddit 数据,提供建议的人可以是任何人。这里我们知道提供建议的人是合格的顾问。相当整洁!重要的是要记住,与治疗师面对面的互动通常与我们在网上公开看到的非常不同。另外,这不是治疗师和病人之间的对话。它只涉及一次谈话机会。

数据

最初,我们从 www.counselchat.com 搜集数据。但是在联系 counselchat.com 的创始人进行评论后,他们为我们提供了这篇文章的所有数据!收集的数据和真实数据的数据转储在这里以 CSV 的形式提供。特别感谢 Philip 和 Eric,他们非常友好,愿意与社区分享他们的成果。所有的分析都是用我最初收集的数据完成的。

论坛上有 31 个主题,张贴的回复数量从“抑郁症”主题的 317 个到“军事问题”的 3 个不等(图 1-3)。该网站上有 307 名治疗师投稿人,其中大多数位于美国西海岸(华盛顿、俄勒冈州、加利福尼亚州)。他们包括博士级别的心理学家、社会工作者和有执照的心理健康咨询师。

该网站有一些重复的问题和答案,似乎是由用户自己生成的(例如,治疗师将一个问题的回答复制粘贴到另一个类似的问题上);我们没有为这种重复清理数据。

数据集以 CSV 格式呈现,包含 10 列,如下所述:

  • 问题 ID —唯一的问题标识符,对于每个问题都是不同的
  • 问题标题 —咨询聊天中问题的标题
  • 问题正文 —个人向辅导员提出的问题正文
  • 问题链接 —指向该问题最后一个位置的 URL(可能不再有效)
  • 主题 —问题所在的主题
  • 治疗信息 —每个治疗师的总结,通常是姓名和专业
  • 治疗师 URL——心理咨询网站上治疗师简历的链接
  • 回答文本——治疗师对问题的回应
  • upvotes —回答文本收到的支持票数
  • 分割 —用于训练、验证和测试的数据分割。

要处理数据,您可以使用 HuggingFace 数据集库。

from datasets import load_dataset

dataset = load_dataset("nbertagnolli/counsel-chat")
df = pd.DataFrame(dataset["train"])

一般来说,大多数问题只有几个回答,75%的问题有两个或更少的总回答。然而,许多问题需要很多治疗师的参与。评论最多的问题是我是否有太多问题需要咨询?很高兴看到治疗师对这类问题的精彩参与。作为一个次要问题,我真正喜欢处理治疗数据的一点是,你可以看到人类善良和理解的能力。

图 1——可视化响应数量

我们还可以观察到题目中一些有趣的趋势。如果我们按主题划分问题的数量,我们会发现大多数问题都与抑郁、关系和亲密度有关。

图 2 —按主题可视化问题数量

但是,有趣的是,咨询基础跃升了 12 位,在回答数量上排名第三。看起来治疗师对治疗有很多看法:)。

图 3——按主题显示回复数量

一般来说,大多数问题都很简短。治疗师似乎提供了更长的回复。平均问题长度为 54 个单词,但平均回答长度为 170 个单词。

Counselchat.com,就像现在任何一个好的社交网站一样,有能力投票支持治疗师对一个问题的回答。如果我们看一下有向上投票的回复的数量,我们可以看到大约 30%的回复得到了向上投票。大多数回答都没有获得赞成票。单个辅导员对一个问题的回答的赞成票范围是从 0 到 8;中值回应获得 1 票支持。

向上投票预测

为了查看什么可能有助于向上投票,我在 n 元文法上使用 TF-IDF 训练了一个简单的分类器,一个使用 BERT 特征,一个将两者结合起来。不幸的是,预测上升的票数似乎有点困难。我们的第一关 TF-IDF 模型的性能不是很好。通过使用 BERT,我们可以获得稍微高一点的精度,但总体来说还是不太好。对于 BERT 模型,我使用 BERT 作为特征提取器,正如我在这篇的另一篇文章中所做的那样。

训练主题分类器

除了 upvotes 之外,将治疗师的回答分成不同的类别也很有趣。有时知道人们是否在谈论抑郁症或者亲密关系是很有用的。为此,我对一架 SVM 进行了 TF-IDF 功能的训练。由于 BERT 的特性似乎并没有给我们带来太多的东西,所以我选择了一个更容易理解的模型。

不幸的是,验证集的性能看起来并不太好。如果我们查看验证集中的支持,我们会发现许多主题只出现一两次,所以我们基本上没有能力预测这些也就不足为奇了。随着时间的推移,这些结果应该会随着更多的数据而改善,特别是随着更多的人使用该平台。

我用我在这篇文章的中描述的代码看了一下这个模型的主要特性。看起来像是与药物使用、责任和损失相关的词会弹出来。考虑到焦虑、抑郁、悲伤和失落都可能与“失去”有关,这似乎有点合理。“药物滥用”也是一个类别,我敢打赌“12 步”是非常密切相关的。无论如何,最好抽查一下这些模型,确保它们能产生一些直观意义的单词。

可视化主题

我想看看伯特特性如何很好地划分空间可能也很有趣,所以我创建了一些简单的 UMAP·2D 嵌入。总的来说,我们看不到这两个阶层之间有明显的区别。然而,不同的主题组在某些情况下看起来更接近,而在另一些情况下看起来更远。以职场关系(紫色)为例,它非常非常接近于关系解除(黑色),但与咨询基础(亮绿色)完全分开。

训练治疗师聊天机器人

最近出现了大量应用程序,试图利用对话代理使精神健康变得更容易获得,参见 woebot.iowysa.com了解那里有什么。既然精神健康机器人现在这么火,我想我们应该用我们的新数据训练一个。

训练相当好的聊天机器人变得出奇的容易。抱脸有这样的例外穿越我不想在这里做训练聊天机器人的教程。尽管我的一些经历值得一提。为了训练这个聊天机器人,我几乎一字不差地使用了他们的代码。我对代码做了两处小小的修改,并且必须将 counselchat.com 数据解析成基于 transformer 的模型的正确形式。最终,我不得不编写和修改不到 50 行代码。

代码修改

拥抱脸模型对于在没有太多数据的情况下启动并运行一个相当不错的聊天机器人来说是非常棒的。我不想让我的机器人有任何个性,所以我必须在 get_data_loaders 函数中注释掉第 93 行。这一行对现有的人物角色进行了一些置换,但是我没有向模型传递任何人物角色,所以这是空的,需要注释掉。

persona = [persona[-1]] + persona[:-1] # permuted personalities

我做的另一件事是放置

assert max_l <= 512

pad_dataset 函数内部。 BERT 和 GPT2 有一些输入大小限制,当超过这些限制时,您可能会在训练过程中遇到一些神秘的错误,例如:

RuntimeError: index out of range: Tried to access index 512 out of a table with 511

添加这一行帮助我在运行模型之前发现我的数据是否太大。它对模型没有任何帮助,但是在我调试的时候非常有帮助:)。

为聊天机器人训练转换数据

拥抱脸变形模型的数据格式起初看起来有点混乱,但是它很容易生成。训练数据需要是具有以下签名的 JSON 文件:

{
  "train": [
    {
      "personality": [
        "sentence",
        "sentence"
      ],
      "utterances": [
        {
          "candidates": [
            "candidate 1",
            "candidate 2",
            "true response"
          ],
          "history": [
            "response 1",
            "response 2",
            "etc..."
          ]
        }
      ]
    }
  ],
  "valid": ...
}

让我们稍微分解一下。较大的 JSON 对象有两个主键。“训练”和“有效”。训练是训练数据,并且是个性、话语对的列表。除了验证集之外,Valid 是相同的。个性是定义说话者个性的句子列表。更多细节请看拥抱脸教程。对于我的模型,我只是将它留空以表示没有个性信息。候选人部分包含候选人响应列表。此列表包含对对话历史的一些非最佳响应,其中最后一句是基本事实响应。最后,我们必须定义历史。一般来说,这是一个字符串列表,其中每个位置包含一个新的话轮。对于我们的机器人,我们只有两次谈话机会,一次是提问者,另一次是治疗师的回应。所以我们就用这个问题来填充。我们这样做是因为我们在寻找对问题的好的单一反应,而不是训练一个普通的治疗机器人。

如果你想要另一个如何格式化数据的例子,拥抱脸在知识库中有一个很好的例子,你可以在这里找到。

数据经过适当的格式化后,我们可以将它直接传递给拥抱脸模型。我按照以下说明训练我的:

python3 train.py --dataset_path counsel_chat_250-tokens.json --gradient_accumulation_steps=4 --lm_coef=2.0 --max_history=1 --n_epochs=3 --num_candidates=4 --train_batch_size=2

瞧啊。我们有一个训练有素的聊天机器人能对真正的治疗师做出反应。如果你想玩这个模型,请在这里下载。然后你需要做的就是解压文件并运行

make build
make interact CHECKPOINT_DIR=counselchat_convai

这将为 Hugging Face 的对话式 AI 构建 docker 容器,然后用我们训练好的模型运行一个交互脚本。如果在构建时出现 docker 错误,尝试在 Docker -> Preferences 中将容器的内存增加到 5GB 左右。这似乎是人们试图构建这个容器时的一个常见问题。

这里有一个对话的例子!我们可以看到,模型是一个很好的倾听者。提供建议,一些同情和怜悯。在世界末日的场景中,它似乎也很方便,提供给我工具。

一些体面的回应

结论

很难获得良好的治疗师-患者互动,但如果你四处看看,就有好的数据。咨询聊天是有限质量的治疗师互动的一个极好的来源。我希望你能在你的领域里找到一些很酷的心理治疗数据的应用。

模型解释中的反事实解释

原文:https://towardsdatascience.com/counterfactual-explanations-in-model-interpretations-a73caec5b74b?source=collection_archive---------23-----------------------

我们回顾了从模型中产生可操作的解释和见解的方法

乔尔·菲利普Unsplash 上拍摄的照片

对比涉及特征属性的模型解释方法如前一篇文章中所讨论的,反事实是解释的一个有趣部分,它允许对机器学习模型进行事后解释。

在这篇文章中,我讨论了几种反事实解释方法的一些背景,包括那些非常注重多样性的方法以及另一种由原型引导的方法。这篇文章是对我和他人参考的概念的直觉练习。

讨论的主题:

  • 反事实解释和基本形式
  • 不同的反事实解释(骰子)
  • 原型引导的反事实

反事实解释和基本形式

在它的核心,反事实允许我们采取行动,以导致某种结果。就机器学习而言,动作是模型特征的变化,而结果是期望的目标响应。数据基本上被扰乱,直到返回对应于远离原始模型的模型预测类的新实例。因为有各种方法可以达到相同的结果,所以可能有多种反事实。

一个常见的例子和用例是贷款审批。客户可能需要增加他们的收入或教育的一些数额,以批准某些类型的贷款。

来源:微软研究博客

由于反事实可能性的空间相当大,评估有效性的度量标准通常分为三个主要方面:稀疏性、多样性和接近性。

  • 稀疏性与需要更改以达到输出类的要素数量相关联
  • 多样性处理生成的反事实之间的距离,并用于确保不同的方式改变到输出类跨度很大
  • 接近度与输出和原始实例之间的相似性有关。从概念上讲,这是一个衡量做出改变有多容易的标准

基本形式

为了更好地理解这个主题,我们从一个标准的分类器及其反事实目标函数的修改开始

f 是模型。xi 是最初的例子。易是最初的目标反应。p 是在损失函数上优化的权重上的正则化。“x”是反事实的例子。y 是所需的目标类。d 是距离函数。λ是平衡/正则化参数。

后一个目标函数的第一项实质上引导对新输出的搜索。第二项是距离函数 d ,它描述了原始实例和反事实之间的差异。这包括所有要素之间的距离,其中连续和分类要素以特定方式处理。这一项由中位数绝对偏差(MAD)来衡量。正则化参数 λ 平衡了两项之间的距离。

p 是特征计数。MAD 是中位数绝对偏差。s 是特色。n 是一些数据集。

MAD 值对异常值相当稳健,但对某些数据集仍有限制。下面几节提到了处理这个问题的不同方法。一种方法使用修改的 MAD 阈值,另一种方法简单地找到在扰动技术中使用 MAD 的替代方法。

从这里开始,工作变成了寻找反事实的优化问题。作者提到了 ADAM,尽管也可以使用其他优化器。由于问题的非凸性质,不同的最小值被用作生成多种反事实的不同集合的方法。

以下章节中讨论的方法提供了一些处理目前为止所涉及的策略的替代方案,并且总体上,还提供了对反事实目标函数的一般形式的扩展和改进。

下面我们来回顾一下:

  • 多样的反事实解释(骰子)
  • 原型引导的反事实

不同的反事实解释(DiCE)

多样性是反事实的一个重要属性。毕竟,根据使用案例和业务需求,太少和太相似的选项可能会成为瓶颈。以贷款为例,拥有选择与你的位置、收入、职业或教育相关的变化的选择权,对客户和贷方都有好处。

多样化的反事实解释方法试图提供一种平衡多样性和可行性的途径。如果没有如上所述的适当考虑稀疏性和邻近性,多样性本身可能并不总是有用的。可能有这样的情况,需要改变的特性数量可能太多,或者需要的改变太大而不可行。此外,在不提供域约束的情况下,可能存在这样的场景,其中反事实接近原始实例,但是仍然在真实世界域之外。最终,理想的选择将为个人提供不仅多样而且可行的变化,这些变化是可行的并且在他们的能力范围内。

作者用来提升这一属性的策略导致了多样性度量,决定性点过程(DPP ),它考虑了邻近性和约束。

k 是核矩阵。d 是距离函数。“x”是反事实的例子。

耦合 dpp_diversity 以及调整上述反事实的基本形式,我们在所有生成的反事实上建立以下优化框架:

x 是一个反事实。x 是原始实例。k 是反事实的总数。λ1 和λ2 是平衡参数。y 是期望的目标响应。

第一项和第二项类似于在基本形式中发现的那些,其中前者涉及将搜索导向期望的结果,而后者涉及反事实和原始实例之间的距离。第三项是我们刚刚引入的 dpp_diversity 以及一个额外的平衡超参数 λ ₂.

对于连续变量,距离函数 d 由类似于基本形式的 MAD 引导;然而,对于分类变量,这种方法就不那么简单了(毕竟,我们如何定义像职业这样的特征中类别之间的距离呢?)这种方法更多地采用二进制类型的赋值:如果特征与原始实例匹配,则距离取为 1,否则取为 0。

与上一节一样,从这里开始本质上是一个优化问题,作者使用带有指定搜索参数的梯度下降。

原型引导的反事实

另一种寻找可解释的反事实解释的方法涉及到类原型的指导。这样做的一个重要目的是加速反事实搜索过程。我们可以考虑在与实时决策相关的场景中对快速计算的需求。

原型基本上是一个代表数据集的实例。作者通过使用 k-NN 实例与数据集的代表性部分耦合的编码器或者通过使用 k-dd 方法来选择原型。第 3.3 节提供了更多详细信息。

为类别 I、类别数量 K 和编码器型号 ENC 定义的类别原型

在高层次上,这种方法的主要概念包括将一个额外的损失函数项整合到第一节的基本反事实方程的修改版本中,该损失函数项说明了这些原型。这为反事实搜索过程中的原型提供了指导。

这在计算上要求较低,尤其是在我们只能访问模型预测函数的情况下。而不是传统地仅使用与预测相关联的损失函数来偏离原始类别;该方法可以避开该项,而简单地使用对应于原型的损失函数。

正如多样化的反事实方法一样,在搜索过程中处理分类特征的想法有点模糊。第一节和第二节中介绍的方法都应用了某种类型的二进制,这里的策略稍微复杂一点,使用嵌入技术将分类变量投影到数值空间中。这是通过考虑特征之间的不相似性的度量以及它们的预测概率来实现的。附录 C 对此进行了更详细的描述。

再次,从这里我们可以继续优化,以产生反事实的解释。

值得注意的是,这个方法总体上提供了几个有趣的属性,以便提供快速的结果。首先,优化使用快速迭代收缩阈值算法(FISTA)作为快速收敛到结果的手段。其次,自动微分可以利用深度学习架构和权重进行显式评估。最后,如前所述,增加原型损失项可以灵活地绕过计算瓶颈。这对于黑盒用例尤其重要。

摘要

总之,反事实解释可以通过允许我们改变个别实例作为达到预期结果的途径,从而为模型预测提供可操作的见解。

  • 我们首先回顾了模型解释中反事实背后的一般思想及其一般形式
  • 然后,我们讨论在此基础上构建的扩展、修改和优化策略,探索强调多样性的方法以及原型提供的指导

参考

[1]s .沃希特、b .米特斯塔特和 c .拉塞尔(2017)“不打开黑盒的反事实解释:自动化决策和 GDPR。”

[2] Mothilal,R. K .,Sharma A .,和 Tan,C. (2020)“通过不同的反事实解释来解释机器学习分类器。”

[3] Arnaud,V. L .和 Klaise,J. (2019)“原型指导下的可解释的反事实解释”

解释了反事实政策梯度

原文:https://towardsdatascience.com/counterfactual-policy-gradients-explained-40ac91cef6ae?source=collection_archive---------39-----------------------

多智能体强化学习中的学分分配问题

Ales NesetrilUnsplash 上拍摄的照片

在众多挑战中,多主体强化学习有一个被忽视的障碍:“学分分配”为了解释这个概念,我们先来看一个例子…

假设我们有两个机器人,机器人 A 和机器人 b。他们试图合作将一个盒子推入一个洞。此外,他们都将获得 1 英镑的奖励,如果他们按下按钮,则获得 0 英镑的奖励。在理想情况下,两个机器人会同时将盒子推向洞口,最大限度地提高任务的速度和效率。

然而,假设机器人 A 做了所有的重活,也就是说机器人 A 把箱子推进洞里,而机器人 B 在一旁无所事事。即使机器人 B 只是四处游荡,机器人 A 和机器人 B都会得到 1 的奖励。换句话说,即使机器人 B 执行了一个次优策略,同样的行为随后也会被鼓励这就是“信用转让”问题的由来。在多智能体系统中,我们需要找到一种方法,将“荣誉”或奖励给予为整体目标做出贡献的智能体,而不是那些让别人做工作的智能体。

好吧,那解决办法是什么?可能我们只给对任务本身有贡献的特工奖励。

照片由 Kira auf der HeideUnsplash 上拍摄

这比看起来要难

看起来这个简单的解决方案可能行得通,但是我们必须记住几件事。

首先,强化学习中的状态表征可能没有足够的表现力来恰当地定制这样的奖励。换句话说,我们不能总是很容易地量化一个代理人是否对给定的任务做出了贡献,并相应地给予奖励。

其次,我们不想手工制作这些奖励,因为这违背了设计多智能体算法的目的。告诉代理如何协作和鼓励他们学习如何协作之间有一条细微的界限。

一个答案

反事实的政策梯度解决了信用分配的问题,但没有明确给出代理人的答案。

这种方法背后的主要思想是什么?让我们通过将代理的操作与它可能采取的其他操作进行比较来训练代理策略。换句话说,代理会问自己:

“如果我选择了不同的行动,我们会得到更多的奖励吗?”

通过将这一思考过程纳入数学,反事实多主体(COMA)策略梯度通过量化主体对完成任务的贡献来解决信用分配问题。

布兰登·莫温克尔Unsplash 上拍摄的照片

组件

COMA 是一种演员-评论家方法,使用集中学习和分散执行。这意味着我们训练两个网络:

  • 一个 actor :给定一个状态,输出一个动作
  • 评论家:给定一个状态,估计一个价值函数

此外,critic仅在培训期间使用,在测试期间移除。我们可以把批评家看作算法的“训练轮”我们使用评论家来指导演员在整个培训过程中,并给它如何更新和学习其政策的建议。然而,当到了执行演员所学政策的时候,我们就把批评家去掉了。

关于演员-评论家方法的更多背景知识,请看 Chris Yoon 的深度文章:

[## 理解演员评论方法

预赛

towardsdatascience.com](/understanding-actor-critic-methods-931b97b6df3f)

让我们先来看看评论家。在这个算法中,我们训练一个网络来估计所有代理的联合 Q 值。我们将在本文后面讨论评论家的细微差别以及它是如何被特别设计的。然而,我们现在需要知道的是,我们有两个批评家网络的副本。一个是我们试图训练的网络,另一个是我们的目标网络,用于训练稳定性。目标网络的参数定期从训练网络中复制。

为了训练网络,我们使用策略训练。我们使用 TD(lambda)来确定我们的目标 Q 值,而不是使用一步或 n 步前瞻,TD(lambda)使用 n 步回报的混合。

使用 TD(λ)的 n 步返回和目标值

其中,γ是折扣系数,r 表示特定时间步长的奖励,f 是我们的目标价值函数,λ是超参数。这个看似无限的地平线值是由目标网络使用自举估计来计算的。

关于 TD(lambda)的更多信息, Andre Violante 的文章提供了一个奇妙的解释:

[## 简单强化学习:时间差异学习

所以最近我读了很多关于强化学习的书,还看了大卫·西尔弗的介绍…

medium.com](https://medium.com/@violante.andre/simple-reinforcement-learning-temporal-difference-learning-e883ea0d65b0)

最后,我们通过最小化该函数来更新评论家的参数:

损失函数

何塞·莫拉莱斯在 Unsplash 上的照片

问题是

现在,你可能想知道:这不是什么新鲜事!这个算法有什么特别之处?这种算法背后的美妙之处在于我们如何更新演员网络的参数。

在 COMA 中,我们训练概率策略,这意味着在给定状态下的每个动作都是以特定的概率选择的,该概率在整个训练过程中会发生变化。在典型的行动者-批评家场景中,我们通过使用策略梯度来更新策略,通常使用价值函数作为基线来创建优势行动者-批评家:

天真的优势演员评论家政策更新

然而,这里有一个问题。这没有解决我们试图解决的原始问题:“信用分配”我们不知道“任何一个个体对任务的贡献有多大”相反,考虑到我们的价值函数估计联合价值函数,所有的代理都被给予相同数量的“信用”。因此,COMA 建议使用不同的术语作为我们的基线。

为了计算每个代理的这个反事实基线我们计算代理可以采取的所有行动的期望值,同时保持所有其他代理的行动固定。

将反事实基线添加到优势函数估计中

让我们后退一步,剖析这个等式。第一项只是与联合状态和联合行动(所有代理)相关联的 Q 值。第二项是期望值。观察求和中的每一项,有两个值相乘。第一个是这个代理人选择特定行动的概率。第二个是采取行动的 Q 值,而所有其他代理保持他们的行动不变。

那么,这为什么会起作用呢?直觉上,通过使用这个基线,代理人知道这个行为相对于它可能采取的所有其他行为贡献了多少回报。这样,它可以更好地区分哪些行动将更有助于所有代理的整体奖励。

COMA 提出使用特定的网络架构有助于更有效地计算基线[1]。此外,通过使用蒙特卡罗样本估计期望值,该算法可以扩展到连续动作空间。

JESHOOTS.COMUnsplash 上拍照

结果

COMA 在星际争霸单位微观管理上进行测试,与各种中央和独立演员批评家变量进行比较,估计 Q 值和价值函数。结果表明,该方法明显优于其他方法。对于官方报道的结果和分析,查看原始论文[1]。

结论

没人喜欢懒鬼。机器人也不会。

适当地允许代理认可他们对任务的个人贡献,并优化他们的策略以最好地利用这些信息,这是使机器人协作的重要部分。在未来,可能会探索更好的分散方法,有效地成倍降低学习空间。然而,这说起来容易做起来难,所有这类问题都是如此。当然,这是一个强大的里程碑,让多智能体在更高、更复杂的层次上发挥作用。

参考

[1] J. Foerster,G. Farquhar,T. Afouras,N. Nardelli,S. Whiteson,反事实多主体政策梯度 (2017)。

从经典到最新,这里有讨论多代理和单代理强化学习的相关文章:

[## OpenAI 的 MADDPG 算法

多主体 RL 问题的行动者批评方法

towardsdatascience.com](/openais-multi-agent-deep-deterministic-policy-gradients-maddpg-9d2dad34c82) [## 分层强化学习:封建网络

让电脑看到更大的画面

towardsdatascience.com](/hierarchical-reinforcement-learning-feudal-networks-44e2657526d7)

用神经网络计算纸牌

原文:https://towardsdatascience.com/counting-cards-with-a-neural-net-ce426c2b6e57?source=collection_archive---------24-----------------------

埃斯特万·洛佩兹在 Unsplash 上的照片

机器学习能成功扳倒房子吗?

你可以在我的 Github 上找到我的代码。

这里是我以前在 21 点上的帖子的链接。我使用了我的旧 21 点模拟器的修改版本(在链接的帖子中详细讨论)。如果你想知道更多关于我是如何编码的,或者只是需要复习一下基本的 21 点策略,你可以先看看这些:

[## 让我们玩 21 点(用 Python)

我们用 Python 实现了一个 21 点模拟器,以便更好地理解去拉斯维加斯的风险

towardsdatascience.com](/lets-play-blackjack-with-python-913ec66c732f) [## 教神经网络玩 21 点

我们训练一个神经网络,看看应用深度学习是否可以改善我们的 21 点策略

towardsdatascience.com](/teaching-a-neural-net-to-play-blackjack-8ec5f39809e2)

去年,当我训练一个神经网络玩 21 点时,令我困惑的一件事是,当我向它提供算牌信息时,为什么我的神经网络没有做得更好。算牌难道不会给玩家带来显著的优势吗?

对于那些不熟悉这个概念的人来说,算牌是一种跟踪牌组中剩余大牌(10 张,杰克,皇后,国王,王牌)数量的方法。这个想法是,当一副牌中剩下很多正面牌时,这对玩家有利(因为我们更有可能拿到大牌,庄家也更有可能破产)。因此,如果我们的算牌提示我们剩下的牌更有可能是高牌,我们应该利用这一点,比正常情况下下更大的注。

当我去年试图将算牌集成到我的 21 点代码中时,它没有添加任何东西,因为我做得不对。我之前建立的模型接受玩家手中的牌和庄家正在展示的牌等信息,并决定是继续击球还是留下。

我试图通过向模型提供迄今为止作为其训练数据一部分的所有牌的详细计数来扩充我的模型(每次洗牌时计数都会刷新)。我认为,这个计数将允许神经网络预测交易商可能破产的时间——这些额外的信息将改善它的击中/停留决策。

令人惊讶的是,事实并非如此。表演居然变差了!赢的概率从没有算牌数据的 42%下降到有了算牌数据的 38%。平局概率也从 9%下降到 5%,暗示着更激进的打法。

有时候机器会学错东西

正如您在下面看到的,当给定牌数数据时,神经网络能够在庄家显示低牌时在赢或平的概率方面做得稍微好一点,但在庄家显示 10 或 a(11 表示 a)时明显不如其更简单(无牌数数据)的前身。以下图表中的概率是通过模拟大约 250,000 个 21 点游戏产生的,训练有素的神经网络决定是击中还是留下。

赢或平的概率,有和没有卡计数数据馈入神经网络(图片由作者提供)

如果我们只分离出庄家出 10、面牌或 a 的游戏,我们就能看到表现不佳的原因。我们被认为更聪明的神经网络(有卡片计数数据的那个)正在做一些非常愚蠢的事情。看下图中的蓝色条,我们可以看到,即使它已经持有 17 或更多的高手牌总数,它也选择频繁命中(它甚至在已经 20 的情况下偶尔命中)。相比之下,我们的模型更简单,它正确地知道停留在 17 手或更多。

当发牌人出示 10、脸牌或 a 时击中的概率(图片由作者提供)

也不全是坏事。前面我们已经看到,当庄家亮出低牌(6 张或更少)时,增加牌数数据可以提高获胜概率。直观地说,这样做的原因是,当发牌人亮出一张低牌时,发牌人肯定要打出一手牌,直到他的牌总数至少达到 17(或者他或她破产)。因此,在这种情况下,知道交易商何时更有可能破产应该会有所帮助。正如我们所见,我们的算牌神经网络的行为是不同的。它更有可能停留在总计为 13、14 和 15 的牌上,并且基于更高的获胜概率,在这些情况下,它似乎平均做出了正确的决定。

当庄家显示 2、3、4、5 或 6 时的命中概率(图片由作者提供)

尽管如此,获胜概率的整体下降令人失望。当我们的牌已经是 19 或 20 时,选择去打是一个大牌面。根据我们对神经网络的行为如何改变的检查,一旦我们添加了纸牌计数数据,看起来虽然额外的数据嵌入了一些信号,但它也导致了我们的模型变得过度拟合并做出了一些愚蠢的决定。所以让我们尝试解决这个问题。

试图修复我们的模型

当我回去回顾算牌实际上是如何工作的时候,我意识到我想错了。附加功能在帮助我们的模型知道是打还是留方面提供了有限的帮助。事实上,正如我们看到的,增加的特性更有可能混淆模型,而不是帮助它。但是牌数数据也许能帮助我们决定下多少注。如果我们知道一副牌中还有很多大牌,我们应该下更多的注,因为 21 点(由一张 a 和一张 10 或一张脸组成的两张牌手)的概率更高。相反,如果我们知道剩下的牌主要是低牌,我们应该只下最小注。

为了做到这一点,我们可以划分责任,而不是将所有东西都塞进一个单一的模型中。我们可以让已经运行良好的旧模型来处理“打还是留”的决定,并建立一个新模型,该模型使用纸牌计数数据来决定下注多少。它看起来会像下面的图片。关于纸牌计数功能的一个注意事项——我记录了到目前为止我看到的每种纸牌类型的数量,当庄家重新洗牌时,我将所有计数重置为 0。

两个模特各司其职(图片由作者提供)

当然,这一切都取决于纸牌计数数据是否真的有助于我们预测 21 点。让我们检查一下。我们可以使用 ROC 曲线来检查神经网络 2 的功效(如果您需要复习什么是 ROC 曲线,请查看以下链接)。

[## ROC 曲线和有效前沿

解释如何用一点金融来解释 ROC 曲线

towardsdatascience.com](/roc-curves-and-the-efficient-frontier-7bfa1daf1d9c)

根据 ROC 曲线(蓝线)下的较高区域判断,神经网络 2 似乎增加了价值(相对于随机决定):

试图预测黑杰克的神经网络 2 的 ROC 曲线(图片由作者提供)

因此,让我们用它来衡量我们的赌注,看看我们的表现是否有所改善。我模拟了 100 副 21 点纸牌(就像在赌场度过一个漫长的夜晚)100 次,比较了以下两种下注策略的平均结果和分布:

  1. 每次最小下注 10 美元。
  2. 当点数有利时,根据我们的自信程度下注更多(公式如下)。否则下注 10 美元。

以下是我如何决定下赌注的(完全公开——我并不认为这个决定规则有多难):

Using the training data, calculate the mean and standard deviation of the probabilities (of a blackjack) generated by neural net 2.Z-score neural net 2’s output prediction:
**Z_prob = (prediction - mean)/std_dev****if Z_prob > 0:
    bet = 10*(1 + Z_prob)
else:
    bet = 10**

基本上,如果得到 21 点的预测概率高于平均水平,我会下更多的注,而我下的额外赌注取决于预测概率比平均水平高多少。

酷,让我们看看我们是否能提高我们的赌博成绩。下面的情节比较了有和没有神经网络 2 的赌博表现。虽然看起来我们仍然无法持续赚钱,但动态下注规模确实提高了我们的表现。采用动态下注规模的平均期末资金比未采用时高 12%。

动态下注规模确实有帮助(图片由作者提供)

最后,让我们比较一下我们期末资金的分布,以确保我们的动态(和更大的)下注不会给我们的下注结果带来过度的波动。分布的形状看起来相当相似,动态下注大小(蓝色)稍微向右移动,这很好。

赌博结果直方图(图片由作者提供)

结论

我希望有更大的提升,但哦好吧。看起来更多的修补是必要的,但至少看起来我们正在做一些事情。它还表明,尽管深度学习模型可能很酷,也很灵活,但考虑周到并(尽可能多地)检查我们模型的工作方式仍然是值得的。最后,在不利的情况下获胜是很困难的!干杯!

数数很有趣

原文:https://towardsdatascience.com/counting-is-fun-7204fcb1f392?source=collection_archive---------20-----------------------

用数学和代码解决一些现实世界的问题

罗马法师Unsplash 上拍摄的照片

我最近开始了 MITx 的概率课程,发现它非常有助于更新我对一些基本计数原理的知识。

这些原则适用于许多现实世界的场景,例如计算出 A/B 测试的复杂性、赌博(掷硬币、掷骰子、扑克)、你为旅行打包的服装组合和座位安排难题,如下所示:

我将回顾我在课程中学到的计数原理,以及数学和 Python 代码中排列、组合和划分的应用。

还会有一些有趣的例子,希望你能像我一样喜欢学习或更新数学。

离散统一定律

我将首先在这里展示一个公式,因为在它的名字旁边没有火箭科学,我们在频率主义者的世界中知道它是:

这只是意味着,给定一个由 n 个元素组成的集合,并且事件A被定义为从 n 个元素中选择任意k个元素同等可能,那么概率就是简单的k除以n

计数有助于找出 k 和 T21 分别是多少。

基本计数原理

我经常遇到这样的问题:计算出一次旅行要带多少衣服。

是的,就像凯莉一样,via Giphy

所以我首先考虑我有多少天假期(这导致我每天想要多少种不同的风格),然后拿出几件衬衫、外套、连衣裙和牛仔裤来搭配——这是有趣的时光😳。

现在假设我不在乎衬衫和牛仔裤是否相配,但我想为两周的旅行准备足够多的不同服装,我至少需要打包多少衣服?

它可以是:

  • 👚x 7 和👖x 2 (14 种不同的组合,但可能有点单调)
  • 👚x 3 和👖x 3 和🧥x 2 (18 种组合,也许更好?)
  • 👚x 3 和👖x 3 和🧥x 2 和🥿👟👠👢x 4 (72 个选择,哇)

这个清单可以一直列下去…

所以计数原理说,如果你有r步和n步可能的选择,选择的总数可以概括为:

然而,现实从来没有这么简单,因为一些衬衫的颜色与另一种颜色不匹配,或者某些类型的鞋子在某些服装上不好看。但是是的,越多越好😏。

排列和组合

排列给出了排序 n元素的方式的数量。这里顺序很重要。n!阶乘代表可能排列的数量:

如果我们只有k的位置要填补:

相比之下,组合中的顺序并不重要。它有助于回答给定n选择和k元素子集的问题,有多少种方法可以做到这一点。

从根本上来说,这与填充上面的k 插槽是一样的。因为顺序不再重要,所以我们除以k元素的可能顺序数,即k!

n choose kC(n, k)表示:

有一天我们可能会面临另一个问题(或者如果你已经经历过,恭喜你!).

假设你想确保一对夫妇坐在一张有 6 个座位的桌子上,有多少种方法可以让他们坐在一起?

怎么安排座位???(用 Canva 制成)

由于ABBA的顺序在这里并不重要,该对可以被放置在任意两个空槽中,即6 * 2 = 12。一旦两个座位被他们占了,就剩下 4 个空位由另外 4 个客人来填补,这就是4!。因此,安排座位让这对夫妇坐在一起的方法总数是6 * 2 * 4! = 288🤯。

组合的一个扩展是找出一个集合{1, ..., n}可以有多少个可能的子集,即

这里的逻辑是,对于集合中的每个元素,有两种选择,要么将它包含在子集中,要么不包含。一个简单的例子是一个集合{1},它有两个 1 的子集和一个空集。

划分

这计算了我们将给定的一组项目划分成规定大小的子集的方法的数量:

通过 Giphy 切披萨

假设有 9 种不同口味的披萨分发给 3 个人(他们都不在乎得到哪种口味),A 得到 2 种,B 得到 3 种,C 得到 4 种。根据上面的公式,有

向 A、B 和 C 分配口味的方法!

回到 Twitter 的问题

我将尝试用分析的方式,通过 Python 代码的模拟来解决这个问题。

分析的

  1. 第一个人有 1/100 的机会获得最后一个座位
  2. 有 1/100 的机会,第一个人坐在第一个座位上,所有人都跟着坐
  3. 有 98/100 的机会坐在别人的座位上,他们坐在第一个或最后一个人的座位上的概率是 1/2

因此,最后一个人获得指定座位的概率是

模拟

或者,我们可以使用模拟来找出事件发生的概率,即最后一个人坐在最后一个座位上。

下图显示了模拟的高斯核密度,以及拟合的正态分布。它的平均值为 0.5,标准偏差为 0.01。

解决这个问题有多种方法,我在这里找到了其他解决方案以及在最初的推文中的讨论

最后的想法

组合学的概念不仅对数学和物理学的其他领域很重要,而且与我们的日常生活相关——数学无处不在!理解组合、排列和分割的一些基本概念肯定能帮助我们在现实世界中操纵无限的可能性。

如果你觉得这篇文章有帮助,请告诉我!如果您感兴趣,这里有一些关于此主题的参考资料:

帖子最初发表于此:https://www.chuxinhuang.com/blog/counting-is-fun/

数数很难,2019-nCoV 版

原文:https://towardsdatascience.com/counting-is-hard-2019-ncov-edition-94d5e502b0e3?source=collection_archive---------30-----------------------

不是每天我们都能看到专家解释数数有多难

今天,在目前以中国为中心的 2019 年新型冠状病毒爆发的全球热议中,我发现了这个关于一个数字的精彩推特帖子:R0,"R nough",基本繁殖数。这个术语来自流行病学,我肯定不是流行病学专家,所以我尽量不把这个概念理解错。

在我们进入主题之前,根据我的粗略阅读,R0 的简单要点是这样的:

  • R0 < 1, every existing infection causes less than 1 new infection, disease will eventually die out
  • R0 = 1, every existing infection causes 1 more infection, disease keeps going
  • R0 > 1,每一个现存的感染都会导致一个以上的感染,因此被感染的人数将会增加,并且存在流行病的风险
  • R0 主要是数学模型中用来理解和描述疾病传播的概念。根据所使用的具体模型,它包括各种各样的假设,这些假设将限制它在现实世界中的实用性。
  • R0 很难(如果不是不可能的话)测量。

在像 2019-nCoV 这样的情况下,政府官员、医疗工作者甚至渴求信息的民众都需要考虑干预措施并迅速采取行动,人们很容易想到:“R0 的值是多少?计算 R0 能有多难?”

很明显,从题目来看,计算 R0 很难。对于不站在数据收集和建模界面的人,以及希望学习数据科学的人来说,这实际上是一个非常好的例子。

所有这一切的好处在于,流行病学是一门“硬科学”,早在整个“数据科学”之前就存在了。聪明人有时间认真思考这个问题,并且有强烈的动机(以人类生命和痛苦为代价)去解决这个问题。

潜入水中

这个帖子总结了 R0 的两个主要模型,非常简单:*R0=1+growth rate * time between one infection to the next.*

Caroline 指出,这是一个容易低估 R0 的简单模型,因为不可靠的报告和无症状病例本质上是丢失了你保证会有的数据点。该模型也只是描述性的,没有提供任何数学工具来分析干预的假设情景。

因此,Caroline 将注意力转移到一个简单的 SEIR 模型 T2,该模型模拟了人们从易受感染、暴露、被感染、抵抗的流动。(如果你想看到更多不同种类的模型,甚至维基百科页面也有大量的模型

在非常简单的 SEIR 模型中,R0 = bkd,参数如下。

SEIR 模型更有用,因为你可以输入编码干预的参数,如接种疫苗(去除易感人群)或隔离(降低接触率和易感人群)。你可以玩假设游戏,这对决策者来说是必不可少的。

但是为了估计 R0,我们需要…估计 3 个参数,b、k 和 d。建议是在缺乏详细信息的情况下,您可以首先从类似的既往疾病(SARS)开始估计参数,然后调整参数以适应您的新数据。当你时间紧迫,没有数据来直接测量时,比如在疫情爆发的超早期,这应该会让你合理地接近。

但最终,这仍然是一个猜测,因为也许 2019-nCoV 不会真的像 SARS 一样表现,因为大自然是不可预测的。由于时间限制,我们只能满足于估算。因此,我们希望在收到数据时实际测量真实参数。

然后,在您着手真正测量参数时,这条线索会进入您将会遇到的许多许多障碍。如果要估计 k,接触率…需要猜一个典型的人接触过多少人吗?你今天联系了多少人?过去的疾病也证明了每个人的情况不一样,所以这是一种分布。随着人们可能患病和康复,易感人群的数量也是一个不断变化的参数。

值得注意的是,SEIR 通常假设所有人都有相同的感染风险,因此您可以将研究单位视为一个城市。然后你可以将这个模型扩展成城市间的流行病模型…但是你必须模拟城市间甚至国家间的传播(耶,需要估计更多的参数!),而那些地方很可能 b,k,d 的参数都不一样!

最终你读完了所有这些,你会明白:R0 的绝对估计有这么多附加说明,认为它是一个铁的事实有点傻。

模型只是交流的框架

说到底,R0 只是一个数字。人们没有计算 R0,因为这个数字本身就能说明很多关于疾病的信息,因为它没有。实际有用的理解来自计算 R0 的工作。

人们用它来制定假设,显示我们应该在哪里收集数据,我们的误差源在哪里,以及如果我们做出某些改变,最终会发生什么。

值得注意的是,这个模型本身足够简单,可以在几条推文中合理地描述一个简化的版本。艰苦的(和潜在危险的)工作是在数据收集部分。我们应该记住,在我们更安全、更驯服的日常数据科学工作中。

这篇文章最初出现在兰迪的计数材料时事通讯上。

使用 GluonCV 和 MxNet 计算网络摄像头上的人数

原文:https://towardsdatascience.com/counting-people-on-your-webcam-using-gluoncv-and-mxnet-d1a9f05c427d?source=collection_archive---------56-----------------------

现实世界中的数据科学

基于 YOLOv3 目标检测模型

斯蒂芬·伯纳德Unsplash 上拍摄的照片

简介

在图像中计数是计算机视觉最常见的任务之一,有许多用例。在本教程中,我们使用了 GluonCV 工具包来支持我们这样做。GluonCV 在计算机视觉任务中提供了深度学习模型的前沿实现。它由用于图像分类、对象检测、语义分割、实例分割、姿态估计、对象跟踪和动作识别的最先进的预训练模型组成。你可以在格鲁恩科夫模型动物园看看其他模型。

[https://gluon-cv.mxnet.io/model_zoo/index.html](https://gluon-cv.mxnet.io/model_zoo/index.html)

通常,在对象检测任务中,我们有要检测的类、每个类的置信度得分以及图像中检测到的对象的边界框。

检测

例如,考虑包含狗、自行车和类似卡车的汽车作为突出对象的给定图像。

我的 colab 笔记本截图

当我们对图像应用对象检测模型时,我们的网络检查图像中的对象,将它们与地面真实标签进行比较,并返回置信度得分。边界框坐标是元组的形式,包括边界框的左上坐标、框的高度和宽度。

我的 colab 笔记本截图

为了检测图像中的人,我们在 COCO(上下文中的公共对象)类的集合中检查 person 类。COCO 数据集是一个奇妙的对象检测数据集,有 80 个类、80,000 幅训练图像和 40,000 幅验证图像。我们的模型“yolo3_darknet53_coco”在该数据集上进行了预训练。

为了流式传输我们的网络摄像头数据,我们使用开源计算机视觉库 OpenCV

OpenCV 是一个用于计算机视觉任务的开源机器学习库,来源:“OpenCV”,via: wikipedia

先决条件

在安装以下软件之前,在 Anaconnda 中创建一个虚拟环境(首选)

  1. OpenCV

要在您的系统中安装 OpenCV,请在您的终端或命令提示符中键入pip install OpenCV-python。我已经在 Anaconda 中使用了 Spyder 来完成这个任务,所以我已经在 conda 虚拟环境中安装了依赖项。

pip install opencv-python

2.MXNet 和胶子

要安装 mxnet 和 gluon,请在您的终端或提示符中键入pip install mxnet-Cu 101 gluonvv。我在我的虚拟环境中也做了同样的事情。如果您的虚拟环境中没有 CUDA,您可以安装不基于 CUDA 的 mxnet

pip install mxnet-cu101 pip install gluoncv

开源代码库

如果您熟悉 GitHub,请查看下面的资源库。

[## sid 0312/人 _ 计数器

这个库是作为我的中型博客 git 克隆 https://github.com/sid0312/people_counter…的源代码维护的

github.com](https://github.com/sid0312/people_counter)

让我们看看我给定的对象检测任务的源代码

  • 导入我们的依赖关系

  • 定义要使用的型号

  • 添加实用功能

a)将我们的帧从一个 NumPy ndarray 转换成一个 mxnet ndarray

b)将变换应用于 mxnet 阵列,以将其提供给网络

c)通过将网络应用于数据来获得 class _ ids、置信度得分和边界框

def detect(network,data):
  prediction = network(data)
  class_ids, scores, bounding_boxes = prediction
  return class_ids, scores, bounding_boxes

count _ object 函数,其对给定对象标签中超过给定阈值的对象数量进行计数

  • 创建一个 People_Counter 类,依次使用所有的效用函数和返回预测,以及 People,在单独的函数中计数

init 方法从 GluonCV model zoo 中导入预训练为‘true’的网络,因为我们使用的是预训练模型。使用 hybridize()加快网络速度。

set_threshold 方法设置对象置信度得分的阈值。置信度低于阈值的检测将不予考虑。

count_people 方法在实用函数的帮助下计算一帧中的人数

detect_people 方法返回对帧的检测。

class_names 返回 COCO 数据集中的所有 80 个类,这些类也是网络的类,因为它是在该数据集中预先训练的。

  • 为 People_Counter 类创建一个对象,并将阈值设置为 0.5。置信度低于 0.5 的检测将被考虑。

  • 加载网络摄像头处理程序,让网络摄像头自动对焦一秒钟

  • 使用 gluoncv.utils.viz 库设置循环,对每一帧进行检测和计数,并在窗口中显示结果

video.read()返回两个值,第一个被丢弃,第二个成为我们的帧。

使用计数器对象的 count()和 detect_people()

获得预测,并在每一帧上绘制边界框。将计数文本放在框架上。使用 cv2.imshow()显示帧

如果在窗口上下文中按下“q”键,则退出循环。

  • 释放网络摄像头,销毁所有窗口

结果

检测的单个帧

在我按下“q”之前的特定时间内的一些日志

非常感谢您的耐心。快乐的计算机视觉和快乐的深度学习。

制造和交易纸张的国家

原文:https://towardsdatascience.com/countries-that-make-and-trade-paper-bfd31b809f4c?source=collection_archive---------20-----------------------

1998–2018 年全球主要行业的数据可视化发现

简单地说,纸是由纸浆制成的。纸浆是由木材生产的,其次是稻草、竹子、棉花和其他天然纤维。在大规模生产的每一步,变异和多样化都是有意创造的,因此相对无差别的原材料——木材——变成了高度专业化的产品,用于书写、运输鞋子或擦拭溢出的乳制品。

化学和材料转化的进程可以理解为一个价值链。每一步都会创造价值。纸张或中间纸浆可以交易,并与其他价值链互动,如食品或消费电子产品。

因为纸无处不在,但制造复杂,而且基于天然原材料,在我们的星球上分布不均匀,所以价值链和贸易必然是全球性的。不同国家的工业必然会对这种全球交换纸和纸浆采取不同的关系,或者更一般地说,这些产品所体现的价值。

因为造纸是一个主要的行业,并且因为它依赖于重要的自然资源,所以这个行业需要进行大量的研究。在这篇文章中,我将现代数据可视化和分析的强大工具箱部署到 1998 年至 2018 年间全球造纸和纸浆生产和贸易的数据集。纸张价值链中的关系和趋势不仅仅是一些数字的函数,可以用这个工具箱来发现。

在这篇文章中,我将说明这个可视化工具箱可以做什么,并在这个过程中使纸张价值链,纸张贸易,纸张生产更好地理解。数据和方法的细节放在最后一节,还有一些代码片段。

纸张生产差异化

首先,我采取全球观点。

在下面的堆积面积图中,我展示了 1998 年至 2018 年间全球纸张生产总量,以及总量中包含的纸张类型。

在这 20 年间,总产量在增加。2008 年和 2009 年的金融危机在图表中表现为增长曲线的轻微下降。

纸张类型的类别定义非常广泛。毕竟不是所有的书写纸或包装纸都是一样的。尽管如此,分组还是捕获了一些不同的实用程序,我将在这个细节层次上执行数据分析。

从第一次观察上图中各区域的相对大小,可以明显看出纸的生产程度。用来装东西的纸显然是一个主要的使用案例。

将全球总量分解为国家总量是有益的,从字面上讲是为分析增加了另一个层面。我选择了一个特定的年份,并对每个国家(或至少是主要生产国)的纸张产量进行了举例说明。下面的堆叠横条是 2018 年的。

左边的图表显示了绝对数量。人口众多的主要制造业国家出现在顶部,就像许多其他制造业产出一样。

右边的图表显示了任何一个国家不同种类纸张的相对数量。从这个角度来看,国内生产的比例差异更加明显。其中,芬兰因其高比例的印刷和书写纸和低比例的案件材料而突出,而加拿大因其相对较高比例的新闻纸而突出。

为了进一步挖掘数据,可以选择一种特定类型的论文,并将几个国家随时间变化的趋势放入数据可视化中,以便进行时间和空间上的比较。在下面的多线图中,已经对新闻纸进行了上述操作。

彩色线条与左边的轴相关,显示了少数几个主要生产国的趋势;灰色线与右手轴相关,显示了全球新闻纸生产总量的趋势。

20 世纪 90 年代末两个最重要的生产国是加拿大和美国。然而,他们的产量在 20 年间一直在下降,现在还不到原来的一半。最初,全球总量没有下降。产量的减少被中国产量的增加所替代。然而,在 2000 年中期左右,所有国家的趋势明显是下降的。显而易见的原因是数字新闻媒体降低了纸张的特殊价值。

全球造纸贸易

一旦在某个国家生产,纸张就会在国内消费,或者进入该国不同的价值链,比如其他制成品的包装。纸张本身也可以跨境交易,这是专业化价值链的另一个共同特征。

2018 年的出口和进口,被理解为流出和流入一个国家,如下所示。(文章末尾提供了代码片段。)

在左手边,负向流动,堆叠的虚线显示了国家出口的文件类型。在右边,正向流动,交叉的条显示了国家进口的文件类型。

对可视化的检查揭示了不同的国家与全球票据市场存在不同的关系。

  • 例如,芬兰、瑞典、加拿大、印度尼西亚相当倾向于负向流动,换句话说,它们是净出口国。
  • 中国、美国、法国,特别是德国,作为进口国和出口国,都与纸张进行大量贸易。以这种方式进行交易是有意义的,这在一定程度上反映了并非所有的纸张都是相同的,而且,比方说一个德国用例更适合来自一个精轧机而不是德国轧机的纸张。此外,这表明重商主义已经今非昔比。
  • 英国(以及图中省略的许多国家)进口他们使用的大部分纸张。

为了可视化贸易流中的趋势,在国家类别和纸张类型类别仍然完全解析的情况下,与上面相同类型的图像被动画化。图像中的每一帧都显示了 2000 年至 2018 年期间的贸易流量。

在这种数据可视化中,与之前类似的趋势是显而易见的。加拿大减少的足迹和中国增加的足迹在全球贸易中非常突出,这从以前的可视化中可以理解为与新闻纸效用的减少有关。不变的特征也很明显,比如瑞典和芬兰一直是主要的净出口国。

另一个有意义的对比是国家贸易流量相对于总产量的差异。下面的散点图可视化了 2018 年的相关数量。

国家纸张存量被定义为某一特定国家当年生产或进口的所有纸张的数量。横轴表示出口的国家储备的百分比,纵轴表示通过进口获得的国家储备的百分比。最后,圆盘的面积表示相应国家的纸张生产总量。

圆盘的位置和大小揭示了与纸张价值链及其全球贸易的多种不同关系:

  • 瑞典和芬兰(右下)主要生产出口纸张。
  • 左下角的中国和日本是主要生产国,但主要是为了满足国内对纸张的需求。
  • 左上角的英国(以及许多被忽略的国家,它们生产的纸很少)通过进口满足了大部分的国内用纸需求。
  • 对角线上的德国、法国、意大利和加拿大通过生产和进口来满足国内需求,它们将很大一部分产品出口到全球市场。

这些关系在研究的这些年里大多是稳定的。除了动画之外,说明趋势的另一种方法是将圆盘的轨迹可视化为叠加图。在 2000 年至 2018 年间,下图中的一小部分国家已经这样做了。(文章末尾提供了代码片段。)

全球纸浆贸易

到目前为止,纸被认为是。但是造纸需要纸浆作为原料。纸浆也是一种可以生产、出口和进口的物品。纸张价值链的这一部分的特征体现在以下数据可视化中。

然而,必须首先注意数据集的局限性。

有些工厂既生产纸浆又生产纸张。这种造纸厂生产的一部分纸浆可以干燥后卖给国内外的其他造纸商。纸浆的另一部分可以在工厂内输送到相邻的造纸机,并在那里转化成纸。数据集只考虑了前一部分,而忽略了后一部分。这是一个可以理解的省略,因为后一部分完全是在一个工厂内进行的。

就目前的分析而言,这一遗漏意味着无法获得某个国家生产多少纸浆的总价值,因为可能有很大一部分没有计算在内。然而,全球纸浆贸易包含在数据中,因此可以按照与上述纸张贸易相同的思路进行分析。

2018 年纸浆进出口流量的相同类型的堆积条形图如下所示。

首先要注意的是,数据中纸浆的类别较少,这反映了部分中的在价值链的这个阶段,产品的变化较少。然而,正如上面提到的纸张类型,这些类别在内部并不统一(一个缺失的区别是由针叶树或非针叶树木材制成的纸浆,前者在北方国家更常见)。

其次,出口大量纸浆的国家较少:巴西、加拿大、美国、印度尼西亚、芬兰、瑞典和俄罗斯。毫不奇怪,这些国家境内都有大量森林。树很重,不容易运输。纸浆生产供应链中的一个常见现象是,工厂中转化的木材主要是从工厂周围相对较小的地理区域收集的。

显而易见,中国进口了大量纸浆。如上所述,中国是主要供国内使用的纸张的主要生产国。然而,相当数量的纸是用进口纸浆制造的。

另一个与纸面数据分析形成对比的是巴西。在早期的散点图中,与巴西相对应的圆盘属于主要为国内使用而生产纸张,较少用于全球贸易的国家类别。然而,纸浆出口量很大。显然,与瑞典和芬兰不同,巴西选择在价值链的不同阶段参与全球贸易:将纸浆而非纸张货币化。

图表的动画版本如下所示。

应该注意的是,用于造纸的纸浆可以由部分回收或再生纸制成。尽管在过去的某个阶段,纤维必须来源于由木材(或其他天然来源)制成的纸浆,但直接来源可以是其他纸张。此处未显示的数据表明,中国造纸生产的很大一部分直接来源于回收纸。因此,进口纸浆量和生产的纸张量之间的差异不一定是来自天然来源的国产纸浆。

贸易数据可以进一步分为双边交易,即出口国和进口国的网络。使用热图可以很好地可视化与一对类别相关的数量。以下数据为 2017 年木浆全球贸易。

进口木浆的国家的子集显示为行,出口最大量木浆的国家的子集显示为列。热图中任何给定单元格的颜色饱和度显示了来自相应出口国的进口占相应进口国总进口的百分比。

换句话说,看着一排颜色,向对应于所述排的国家供应纸浆的国家变得非常清楚。将行与行之间进行比较,可以看出果肉获取方式的差异和相似之处。

一些观察结果:

  • 欧洲大陆各国的纸浆进口也有类似的相对分布,它们从巴西、瑞典和芬兰进口大量纸浆,从加拿大和美国进口一些,但从俄罗斯和印度尼西亚进口很少或没有。
  • 东亚进口商从出口国(不包括瑞典和芬兰,它们的供应量相对较少)获得的木浆分布更加均匀。
  • 加拿大和美国互相贸易木浆,也从巴西进口。
  • 巴西是全球木浆出口国。

为了向下钻取和查看趋势,一种方法是选择特定的国家并沿水平维度显示时间。以下是对意大利进口的处理。

已经讨论过的全球纸浆贸易的总体趋势是显而易见的,其中来自巴西的数量增加,来自加拿大的数量减少。更微妙的是,从印度尼西亚的进口尽管总是相当适度,却减少了。然而,从以前的图表中可以看出,印度尼西亚的出口总量有所增加。中国需求的增长很可能是因为印尼纸浆的转向。

那些树呢?

如上所述,大部分纸浆是在上述工厂附近的森林中伐木生产的。木材的全球贸易是可能的。然而,木材的不同可能用途,如家具、建筑、能源,都必须纳入分析。那超出了我在这里要做的事。

此外,砍伐和改造森林有许多原因。正如在别处所讨论的,全球森林面积正在减少。另一方面,减少并不一致,事实上,在同一时期,欧洲的森林覆盖面积比这篇文章中的要大。

可以说,纸张价值链以及造纸和纸浆的过程都很先进,对全球经济的新兴特征具有指导意义,并且丰富的数据足迹正在变得可用。生态互动网络的额外连接创造了更多的探索空间。

数据和方法说明

  • 数据来自联合国粮食及农业组织(粮农组织)。特定的数据主要基于不同国家的官方数据。粮农组织投资建立了一个易于访问的开放数据门户
  • 所有可视化都是使用 Python 库 Bokeh 完成的。这个库为可视化及其设计提供了大量的灵活性和控制,尤其是当数据处理与 Python 库 Pandas 结合时。为了指导使用散景的编码工作,使用 Microsoft Power BI 完成快速数据概述。
  • 多维数据本来就很难研究,人类的视觉感知限制了可视化所能捕捉的内容。来自数据库的概念,如 OLAP 立方体,以及切片、切块和下钻的规范操作,有助于构建数据探索。数据可视化原则也很有帮助。
  • 写在介质上的文本不能利用与图表的交互。动画图是一个相关的变体,说明了如何在可视化中分解连续变量或顺序变量,而不需要空间轴。
  • GIF 动画是用 Python 库 imageio 制作的。
  • 造纸和纸浆制造是一门复杂的工程科学,包含许多化学和机械步骤。YouTube 上有介绍这个过程的视频。同样,作为一个行业,造纸是古老的。至少有一种历史观点认为纸是最重要的 50 项创新之一——这种观点认为,如果书写的文字一直印在动物的皮肤上,而不是更便宜、更柔韧的纸张上,印刷机的革命性潜力永远不会实现。

代码片段:磁盘轨迹图 的内循环

代码片段:创建导出-导入流程图 的主要部分

使用 Spotify 的 API 和 Python 中的 Seaborn 对音乐品味进行国别可视化分析

原文:https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421?source=collection_archive---------16-----------------------

你知道哪个国家喜欢欢快的音乐,哪个国家喜欢喧闹的音乐吗?

我最近开始使用 Spotify,并对驱动 Spotify 基于协同过滤和 NLP 的推荐系统的复杂技术感到惊讶。

在这个项目中,我调查了特定国家的音乐偏好。

数据采集:

我删除了 Spotify 每周地区图表的数据。这是包括“全球”在内的 64 个国家的每周排名前 200 的热门歌曲。图表中的数据从 16 年 12 月开始。

我已经从 11286 个‘page _ URLs’中删除了这个列表,得到了一个有 210 万行和以下属性的数据集:歌曲名称,歌曲 URL,艺术家,流,歌曲位置(前 200 名之内),国家和星期。数据集中有 48261 首独特的歌曲、9805 位艺术家和 1579 种风格。与您分享样本数据的快照:

“音乐的一个好处是,当它击中你时,你不会感到痛苦。”——鲍勃·马利

我用 Spotipy 获取了报废歌曲的其他相关音乐数据。Spotipy 是 Spotify Web API 的轻量级 Python 库,它允许完全访问 Spotify 平台提供的所有音乐数据。

我从曲目 URL 中获取了详细信息,如曲目流行度(得分在 0-100 之间)、艺术家 URL、艺术家流行度(0-100)、艺术家追随者和艺术家流派。

对于每首歌,我还使用 Spotipy 提取了音频特征。

音频特性简述:

除了响度和速度之外,所有特性的值都在 0-1 的范围内。

最具特色的 25 位艺人:

  • Plot 显示了一位艺术家在所有国家数周内出现在前 200 名榜单中的次数。
  • y 轴上的特色数字以百为单位,例如艾德·希兰已经被特色了 48,000 次。
  • 在前 200 名列表和前 30 名中出现的特定艺术家的独特歌曲的数量(从歌曲位置计算)也绘制在 y 轴上。

这是对印度的独家分析,因为我是印度人。

25 大流派剧情:

  • 每首歌曲都与一个艺术家相关联,并且每个艺术家可以有多个流派。
  • 48.2k 独特歌曲中的前 25 个流派绘制如下。
  • 它显示了与特定的数据科学流派相关的歌曲和艺术家的数量。

艺人人气博闻剧情:

各流派中艺人人气得分分布的箱线图(经典箱线图的增强版)如下所示:

  • 在说唱流派中,Median artist 的受欢迎程度(由中间的黑线表示)最高。
  • 与其他流派相比,流行艺术家一开始就有很高的受欢迎程度。
  • 拉丁艺术家的受欢迎程度最高。
  • 摇滚和 EDM 艺术家不能获得 90 以上的受欢迎分数。
  • Trap 艺术家的受欢迎程度从 52-93 不等,他们中的大多数位于这个范围的高端,而在其他流派中分布更加均衡。

让我分享一些对一些最受欢迎的流派的有趣见解。

流派艺术家追随者蜂拥图:

在下面的蜂群图中,每个点代表一个艺术家。我已经标记了每个流派中最受关注的艺术家。

200 强最具特色歌曲:

按流派来看,一首歌出现在前 30 名的次数:

  • 这里每个点代表一首歌。
  • 流行歌曲名列榜首。
  • 只有几首摇滚歌曲设法长期保持在前 30 名。

我最喜欢的流派:

我在 Spotify 中保存的歌曲的前 12 种风格的饼状图如下所示。检查这个链接来分析你的。我听的大多数歌曲都是流行舞曲。

让我们探索一些主要流派的顶级艺术家,包括我最喜欢的。这些是提到的流派中最有特色的艺术家的词云。

在这个过程中,我可以在我最喜欢的流派中探索顶级艺术家最受欢迎的歌曲,并扩展我的播放列表。

音频特征相关性分析:

现在来说说我提取的音频特征。

皮尔逊相关系数(r)是衡量两个变量之间线性关联强度的指标。它的取值范围从+1 到-1。值 0 表示无关联,大于 0 的值表示正关联;也就是说,随着一个变量的值增加,另一个变量的值也增加。

这是音频特征之间的关联热图。

  • 蓝色表示正相关,红色表示负相关。
  • 联想越强,阴影越深。
  • 响度和能量有很强的正相关性,这是有道理的。
  • 与其他配对相比,声音和能量具有更强的负关联。
  • 化合价与可跳舞性、能量和响度有轻微的正相关。

音频特写联合 KDE 剧情:

我们可以进一步分析这些对,比如说能量和响度,使用如下所示的联合核密度估计图。

  • 两者都与皮尔逊 r 值 0.73 呈正相关。
  • 这两个特征的分布是左偏的,这意味着大多数歌曲具有这些特征的较高值。请注意,轴标签不是从 0 开始的。
  • 大多数歌曲的音频特征具有接近 6 的响度值和接近 0.7 的能量值,如较暗的轮廓阴影所示。

音频特色 vs 流派泡泡剧情:

这里是另一个查看数据的视图。在下面的气泡图中,我用他们的平均速度和平均语速分别在 x 轴和 y 轴上标出了这三个流派的艺术家。气泡的大小决定了他们的受欢迎程度。

  • 语速是区分拉丁歌曲和其他流派的一个很好的标准。
  • 顶级说唱艺人的人气比其他人多。
  • 大多数受欢迎的说唱艺术家在他们的歌曲中有一个非常明确的平均速度范围(大约 120 bpm)。

音频特征分布分析

几种音频特征在不同体裁中的分布分析。

  • Hip hop,rap 和 trap 在 speechiness 中排名很高。
  • 摇滚歌曲的语速最低。

  • EDM 歌曲有一个非常明确的速度范围。
  • 通常,所有流派的节奏都在 90-160 BPM 之间。

音频特色 vs 流派径向热图:

在下面的流派-特征径向热图中,我采用了标准化后每个流派所有歌曲的平均特征值。

平均特征值越绿。摇滚在工具性方面排名最高。

为了更好地理解数据,我在每个同心圆(即每个特征)中突出显示了(21 个国家中的)前 7 个国家。我将每个特性中高于 66%的值标记为 1,其他值标记为 0,然后创建了热图。

如果我们看看标有价数的同心圆,平均价数得分最高的前 7 个流派是舞蹈流行、荷兰嘻哈、雷鬼音乐、荷兰城市、拉丁流行、热带和拉丁。

我最喜欢的舞蹈流派——流行音乐并不像它的名字所暗示的那样,在可跳性方面位列前七。😅

国家级分析:

再说国家,我拿了一些顶级音乐国家的样本。

每个国家的十大流派列表:

如果我们看下面的图表(整个图表包含总共 64 个国家的 64 个条),在 48.2k 首歌曲中,34.7k 首歌曲出现在一个国家,4.3k 首歌曲出现在两个国家。

迄今为止,共有 32 首歌曲在全球 64 个国家播放。在前 30 名中,只有一首歌在所有国家都有播放。

最多国家排名前 30 的歌曲列表:

一个国家的地域歌曲比例:

如果我们再深入一点,分析这些 34.7k 只在一个国家精选的歌曲,我们就可以知道哪些国家的地域歌曲在那个国家的前 200 名榜单中占据主导地位。

意大利、印度和法国在地区歌曲占主导地位的国家名单中排名靠前。如果我们看看这些国家的顶级流派,大多数都是地区性的。

在意大利,排名前六的流派包括像意大利嘻哈和意大利流行音乐这样的地区性流派。令人惊讶的是,印度的歌曲数量明显较少,这可能是因为当我们痴迷于一首歌时,我们不允许其他歌曲长时间出现在列表中。😜

特定国家的音乐偏好:

  • 西班牙的化合价很高。拉丁和瑞格顿是西班牙最流行的两种音乐类型(见上表),这两种音乐类型的价值都很高,如风格特征热图所示。
  • 法国也是如此,法国嘻哈音乐和都市流行音乐是两种最突出的流派,在可跳舞性方面排名都很高,因此法国在可跳舞性方面排名最高。法国的声音和语音也是如此。
  • 印度在声学方面排名很高。声学音乐主要使用通过声学手段产生声音的乐器,而不是电子手段。
  • 日本人更喜欢充满活力和喧闹的音乐,因为 j-pop 和 j-rock 是突出的流派。但是他们更喜欢其他流派的充满活力的歌曲吗?

该图显示了音频特征“能量”在每个提到的流派中的分布。左侧是国家/地区被选为“全球”的分布,右侧是日本。

在上面的“分裂小提琴情节”中,与全球音乐相比,他们对活力音乐的品味在拉丁、雷鬼音乐和热带音乐等流派中非常明显。

在下面的表格中,我选取了 Spotify 上 200 位最受关注的艺术家,并根据他们在歌曲中的音频特征的平均分,对他们的每个音频特征进行了排名。正如我们在 acousticness 中看到的,Arijit Singh,Armaan Malik 和 AR Rahman 都在前 15 名。此外,来自印度的 Neha Kakkar 在响度方面排名第一。(我太骄傲了🤩)

因此,如果你想制作一个播放列表来跳舞,你可以看看上面的 danceability 顶级艺术家名单。

其他方面的顶级艺术家:

p!nk Floyd,Coldplay 和 Khalid 都是器乐方面的顶级艺术家。如果你正在寻找有积极氛围的歌曲,你可以查看价栏中的艺术家名单。

全国十大最具特色艺人名单:

Spotify 上关注最多的艺术家:

使用 t-SNE 可视化数据:

让我们检查一下某一特定流派的歌曲是否有相似之处。这是 2D 空间中 9 维数据(9 个音频特征)的 t-SNE 投影。t-分布式随机邻居嵌入(t-SNE)是一种非线性技术,它将多维数据映射到一个低维空间,并试图通过基于具有多个特征的数据点的相似性识别观察到的聚类来发现数据中的模式。

我放映了所有属于这些流派的歌曲:法国嘻哈、流行舞曲和雷鬼音乐。我将模型运行了 10000 次迭代,困惑值为 75。

正如你所注意到的,SNE 霸王龙试图将不同的点分开,并将相似的点聚集在一起。

音频特征雷达图:

这是 3 种类型的雷达图。我们可以比较它们的音频特征,例如法国 hip hop 具有最高的语音值。音频功能在绘图前已标准化。

利用逻辑回归和线性 SVM 的体裁分类:

让我们看看机器学习算法使用音频特征进行流派分类的效果如何。我选择了 3 个流派的所有歌曲(流行舞曲、法国嘻哈音乐和雷鬼音乐)。我用 OneVsRest 分类器和线性 SVM 应用了逻辑回归,两者都在 alpha 上调整了超参数。

我在随机选择的 70%数据(训练数据)上训练模型,并在剩余的 30%测试数据上用 5 重交叉验证(cv=5)测试其准确性。我在阿尔法上做了超参数调整,也应用了线性 SVM。

逻辑回归模型表现稍好,准确率为 70.1%。微观平均 F1 分数被用作性能指标。我将在下一篇博客中讨论这个话题的细节。我们在这里可以得出的结论是,音轨的音频特征是将歌曲分类到其各自流派的重要属性。

代码片段:

感谢您的阅读!我希望你喜欢这篇文章。如果你想了解我的文章,请关注我。

快乐聆听!🎧

参考文献:

[## 一个机器学习对我的 Spotify 数据的深度挖掘。-开放数据科学-人工智能的新闻来源…

这是我们关于使用无监督和有监督机器学习技术的两部分系列的第二篇文章…

opendatascience.com](https://opendatascience.com/a-machine-learning-deep-dive-into-my-spotify-data/) [## 欢迎来到 Spotipy!- spotipy 2.0 文档

编辑描述

spotipy.readthedocs.io](https://spotipy.readthedocs.io/en/2.11.2/) [## 获取音轨的音频功能|面向开发者的 Spotify

需要路径参数授权。来自 Spotify 帐户服务的有效访问令牌:参见 Web API…

developer.spotify.com](https://developer.spotify.com/documentation/web-api/reference/tracks/get-audio-features/) [## Spotify 的“这是”播放列表:50 位主流艺术家的终极歌曲分析

每个艺术家都有自己独特的音乐风格。从献身于木吉他的艾德·希兰,到德雷克…

towardsdatascience.com](/spotifys-this-is-playlists-the-ultimate-song-analysis-for-50-mainstream-artists-c569e41f8118) [## Python Seaborn 初学者教程

让别人理解你的观点的最好但也是更具挑战性的方法之一是将它们可视化:这样,你可以更多地…

www.datacamp.com](https://www.datacamp.com/community/tutorials/seaborn-python-tutorial#sm) [## Matplotlib | FC Python 中的雷达图

在足球分析和视频游戏中,雷达图已经在许多地方得到普及,从国际足联系列…

fcpython.com](https://fcpython.com/visualisation/radar-charts-matplotlib) [## Spotify 音乐分析

使用 Kaggle 笔记本探索和运行机器学习代码|使用来自 Spotify 歌曲属性的数据

www.kaggle.com](https://www.kaggle.com/aeryan/spotify-music-analysis)

基于县的新冠肺炎数据集和分析趋势

原文:https://towardsdatascience.com/county-based-covid-19-dataset-and-analytical-trends-ff1617030ba8?source=collection_archive---------69-----------------------

县级,新冠肺炎数据科学( Kabir Moghe ,2020)

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

作为一名关心学年和大学体育运动的高三学生,我很好奇新冠肺炎对特定县的影响。许多关于学年、室内运动和口罩要求的决定都是在当地做出的,但我意识到没有简单的方法来探索和分析县数据。总的来说,捕捉病毒影响的数据集和可视化数据并不缺乏,无论是来自约翰霍普金斯大学还是疾病预防控制中心。《纽约时报》也发表了令人印象深刻的分析历史数据的作品,麻省理工学院的德尔福项目构建了一个深度模型来预测未来几个月的趋势。然而,这些研究和数据集通常以国家或州为重点,对于县一级的分析来说过于粗略。

在过去的几个月里,我一直致力于在县一级汇编一个粒度数据集,它汇集了来自各种来源的不同属性。我的目标是提供有用的信息,帮助县工作人员、学校管理人员、政府官员以及家长和学生简化决策过程。虽然还有很多工作要做,但迄今为止,我已经搜集了在线资源并补充了许多新属性,以创建一个全面的县级新冠肺炎数据集,其中包含美国 3144 个县中的 3106 个县的信息。(除了少数缺乏完整信息的县,99%的县都包括在内。)

该数据集将每日新冠肺炎数据组织成每月每个县的新增病例和死亡人数,以及死亡率和死亡率,但它还包括每个县的重要属性:人口密度、教育、种族构成等。数据集是自我更新的,每天都有新的信息输入,它和代码本身都可以在这里访问。

总体而言,数据集包括以下内容:

  • FIP 代码和县
  • 每月新新冠肺炎病例
  • 新新冠肺炎每月相关死亡人数
  • 感染率
  • 致死率
  • 人口
  • 失业人口的百分比
  • 家庭收入中位数
  • 近似人口密度(根据面积和人口计算)
  • 种族人口统计
  • 教育水平
  • 社交距离政策,特别是全州范围内的面具规定(“是”、“否”或“某些部分”)

用于创建上述属性的数据来自各种来源(USAFacts、美国农业部、人口普查网站、masks4all 和 ArcGIS),所有这些都在底部链接。

分析学

用户可以多种方式利用数据集。可视化图表很简单,数据集还包括 FIP 代码,这使得在县和州级别上创建地图变得很容易。下面是一个示例,其中为数据集中包含的 3106 个县绘制了 8 月份的新病例。显示了病例的自然记录(即 48,505 个病例映射到 10.8),以强调各县之间的差异。(空白点是数据集未包括的县。)

每个县都显示了 8 月份新增病例的自然对数(0-10.9 分)。

该地图描绘了 2020 年 8 月每个县的新感染水平的彩色编码趋势。例如,洛杉矶县显示了较高的感染人数,因此我们可以进一步探索其趋势。尽管该地图仅描述了病例,但数据集也包含了死亡信息。下图显示了洛杉矶县每月的病例和死亡人数。

加利福尼亚州洛杉矶县每月案例

加利福尼亚州洛杉矶县每月死亡人数

我们可以更深入地挖掘和分析县的具体属性如何可能或可能不与新冠肺炎的影响相关。在以下各节中,研究了 2020 年 8 月的影响,但该框架可以扩展到一组特定的月份或更长的时间段(即过去 3 个月与过去 6 个月)。

新冠肺炎教对少数民族的影响

为了了解少数民族如何受到新冠肺炎的影响,我将数据集分类为本月感染率最高和最低的前 100 个县,分别用 C-max 和 C-min 表示,并绘制了新冠肺炎对这些县各种种族人口统计的影响。

(注:在本节和以下各节中,我使用了加权 平均值作为集中趋势的主要衡量指标,由下图中的水平线表示,以说明各县之间的人口差异,而不是使用常规平均值或中值,这可能会扭曲数据。对于每个属性,我将各县的单个属性乘以其各自的人口,并计算这些新的缩放数字的总和,然后除以各县的总人口,以获得加权平均值。)

C-max 和 C-min 县的非裔美国人百分比与感染率

C-max 县

C-min 县

平均而言,3106 个县平均有 13%的非裔美国人。然而,在 C-max 县,非裔美国人平均占人口的 18%,而在 C-min 县,非裔美国人仅占人口的 2.1%:相差近 9 倍。

C-max 和 C-min 县的西班牙裔百分比与感染率

C-max 县

C-min 县

在美国各地,数据集中的县平均约有 19%是拉美裔。我们在 C-max 县看到这个数字的巨大跳跃,在那里西班牙人占人口的 54%。相比之下,C-min 县的拉美裔占 4.2%,也就是说感染率最高的县的拉美裔是感染率最低的县的 13 倍。

C-max 和 C-min 县的白人百分比与感染率

C-max 县

C-min 县

另一方面,美国白人占 C-max 县人口的 78%,与 77%的全国加权平均水平相似。然而,有趣的是,C-min 县几乎全是白人,平均 91%: 与少数民族的相关性相反

简而言之,数据显示对少数民族,特别是非洲裔美国人和西班牙裔美国人高度集中的社区产生了不成比例的影响。此处也提供了其他少数族裔群体(即美洲原住民、亚裔美国人)的可视化数据,尽管它们并未显示出与感染率的显著相关性。

新冠肺炎和其他县属性

除了种族之外,该数据集还允许我们探索新冠肺炎的影响如何与其他县的属性相关联。(下面,我指的是我在上面使用的与种族相同的 C-max 和 C-min 县。)

C-max 和 C-min 县的教育与感染率

数据集中的教育启发由每年获得大学同等学力或大专文凭(在县一级)的人的大致百分比决定。下面,您可以看到 C-max 和 C-min 县各自的试探法。

C-max 县

C-min 县

在 C-max 县,教育指标平均为 6.5%,在 C-min 县,约高出 0.8%,为 7.3%。这可能意味着这种启发和感染率之间可能存在相关性,但肯定需要进一步的研究来验证这一点。

人口密度

使用 C-max 和 C-min 县作为 x 轴,我在下图的 y 轴上绘制了近似的人口密度(每平方英里的人口数)。

C-max 县

C-min 县

C-max 县的平均人口密度为每平方英里 791 人,而 C-min 县仅为 66 人,这意味着感染率和人口密度之间存在明显的相关性。

收入

作为收入的衡量标准,我使用了中等家庭收入,这是我为 C-max 和 C-min 县绘制的图表。

C-max 县

C-min 县

C-max 县的平均收入为 47 138.10 美元,而 C-min 县的收入约为 53 235.80 美元:相差 6 097.70 美元。虽然这可能表明感染率较低的县比感染率高的县收入高,但数据的差异不足以让我们确定收入是否确实在感染率中起作用。

失业

为了确定各县的失业率,我收集了最新的数据,并与 C-max 和 C-min 县进行了比较。

C-max 县

C-min 县

C-max 县和 C-min 县的平均失业率分别为 3.6%和 3.9%。尽管这可能看起来与人们的预期相反,但同样,像这样的小规模差异不能单独决定失业率和感染率之间是否存在相关性。

掩模要求

虽然目前没有关于县级口罩需求的数据,但有全州范围内的数据。在下面的表格中,我将 C-min 县和 C-max 县的感染率放在一起,为了简单起见,每个县都减少到 10 个县。

此外,对于 C-min 县,我使用了阳性感染率最低的 10 个县来关注口罩相关政策实际上可能对感染产生影响的县。

C-max 与全州面罩要求

C-min 与全州面罩要求

在 C-max 县中,4 个县有全州范围的口罩要求,其他 6 个县是仅在部分地区要求口罩的州的一部分。另一方面,10 个 C-min 县中有 8 个要求戴口罩,而包含另外 2 个县的州在某些地方要求戴口罩。虽然这似乎不是一个值得注意的差异,但我们需要在做出声明之前进一步解读一些国家的“某些部分”特征。

如果我们看看 C-max 县,根据 WBSTV密西西比州今日县口罩佛罗里达州政治的报道,在“某些部分”有全州范围口罩要求的县完全被排除在强制规定之外,所以 10 个县中有 6 个根本不需要口罩。然而,在 C-min 县,普拉特县(WY)和巴伯县(KS)都很小,不需要口罩,很可能是因为他们缺乏病例(根据 AARP县口罩)。一般来说,感染率最高的县有 60%不需要口罩,阳性率最低的县有 80%需要口罩

一般来说,教育、收入、失业和口罩需求等县属性仅表现出与感染率的名义关系,值得进一步研究。然而,人口密度似乎与感染率密切相关,这进一步证明了人与人之间的距离确实会影响新冠肺炎病毒的传播。

结论

我希望该数据集对郡工作人员、学校管理人员和公共卫生官员有用,让他们更好地了解趋势和郡属性,从而确定风险并做出与新冠肺炎相关的适当决策。数据集将每天更新,除了可视化,数据还将作为方便用户的工具发布在网站上。将来,我计划在县一级拟合一个模型来帮助预测未来的新冠肺炎数据。如果有任何想法或意见,请在 kabirmoghe@gmail.com留言给我!

参考文献:

[1]约翰·霍普金斯大学医学系,新冠肺炎美国各县病例 (2020),约翰·霍普金斯冠状病毒资源中心

[2]美国疾病控制和预防中心,美国疾病控制和预防中心 COVID 数据追踪器 (2020),美国疾病控制和预防中心

[3]《纽约时报》,冠状病毒在美国:最新地图和病例统计 (2020),纽约时报

[4]麻省理工学院, COVIDAnalytics (2020,COVIDAnalytics

[5] USAFacts 研究所,美国冠状病毒病例和死亡 (2020),USAFacts

[6]美国农业部,县级数据集 (2020),美国农业部经济研究局

[7]美国人口普查局,/programs-surveys/popest/datasets/2010–2019/counties/asrh 索引 (2020),美国商务部

[8] ArcGIS Hub, (2020),ArcGIS Hub

【9】Howard,Jeremy,et al .美国哪些州要求在公共场合戴口罩? (2020),#Masks4All

[10]WSBTV.com 新闻工作人员,完整列表:哪些城市和县要求戴口罩? (2020),北京电视台

[11] Harrison,Bobby 等人,随着病例激增,州长在 13 个县强制推行口罩 (2020),今天的密西西比州

[12]堪萨斯商会,郡面面具—堪萨斯商会 (2020),堪萨斯商会

[13]雅各布·奥格尔斯(Ogles,Jacob),面纱之后:佛罗里达州对戴口罩有什么要求? (2020),佛罗里达政治

[14]马克维茨,安迪,各州面罩要求指南 (2020),美国退休人员协会

TF 2.x 中的 Coursera DL 专业化课程

原文:https://towardsdatascience.com/coursera-dl-specialization-course-in-tf-2-x-18a1189e2a4?source=collection_archive---------24-----------------------

Coursera 课程转换为 TF 2.x

TF 2.x 是新的规范!

deeplearning.ai (可在 Coursera 上获得)的深度学习专业化非常出色,我会向任何对这一领域感兴趣的人强烈推荐它。在本课程中,首先学习如何在没有任何库的情况下从头开始编写神经网络代码,然后继续学习 TensorFlow 库的高级功能。不幸的是(在撰写本文时)所有的编码练习都是在 TF < 2.0 中实现的。在不久的将来,TF 2+将成为标准,TF 2.x 与 TF1 有很大的不同。大多数练习都需要完全重写代码。

由于本课程的编程练习非常出色,我决定将练习版本 2.x 兼容。我在下面(链接)维护练习转换后的 TF2.x 代码。这篇文章假设读者对 TF 有些了解。

在这篇博文中,我将回顾将 TF1.x 代码(尤其是本课程中的代码)转换成 TF2+代码的基础知识。我已经在 TF1=( 链接)和 TF2 =( 链接)的第 7 周练习中实现了深度神经网络。下面我将解释两种代码的一些关键区别。其他练习的 TF2+版本请访问我的 Github repo : ( 链接)

1) Session()消失=进入急切执行

让我们首先看看下面的简单代码片段,它计算 TF 1.x 中的平方误差损失,

TF2+摆脱了会话和图形构建。在 TF 1.x 中,你通常会定义变量之间的关系(创建一个图),然后一个会话执行路径。session . run()以输入为参数运行路径,并输出输出。在 TF2+中,默认情况下启用快速执行。这意味着变量是自动和并发执行/计算的,而不需要会话/图形。

转换后的 TF 2+代码为:

区别:不需要创建会话对象或者TF . GLO abal _ variable _ initializer()。解释器一点击 loss= 命令,就执行。

2)急切执行(另一个例子)

这里我将使用 TF1 和 TF2+实现两个张量(标量)的乘法。

TF 1.x 中的乘法

c 在通过 tf.session() 运行时,只会输出一个张量(20)。在 TF2+中,缺省情况下启用急切执行,下面的代码将自动输出一个张量(20)。

TF 2.x 中的乘法

3)占位符不见了

占位符是 ehh..TF <2. They are basically a container for input variables. These have been removed in TF2+. Let us first look at this example of a function that calculates the sigmoid of input variables/tensor. Here x is a placeholder variable that stores the argument of the function and then sigmoid is acted on it.

Placeholder in TF 1.x

In TF2+ placeholders are not required and sigmoid can be directly applied to the input variable.

Working without placeholder in TF2.x

4)中的井占位变量执行梯度下降

如果使用 tf.keras 建立模型,可以直接使用 tf.train() 用预定义的损失函数训练你的数据集。然而,要定制任何东西,你必须从头开始实现梯度下降。让我们首先回顾 TF < 2 中的梯度下降。

TF1.x 中的梯度下降

撇开所有的 。session() 业务梯度下降通过TF . train . adamoptimizer(learning _ rate = learning _ rate)实现。 最小化(成本)功能。 最小化 功能尝试最小化自变量,并相应地调整参数。在 TF2+最小化功能不存在,需要在低得多的水平上实现梯度下降。这给了整个过程更多的控制。

TF2.x 中的梯度下降

我们首先定义一个函数(【get _ grad())来计算参数的梯度。此功能使用tf。GradientTape() 用于梯度的自动微分和计算。关于它的更多细节可以在:链接找到。我们使用函数应用渐变:optimizer . apply _ gradients(zip(grads,list(parameters . values())))。这基本上是对 的啰嗦替换。最小化功能。

5)其他细微变化

除了下面这些,还有很多小的改变,比如重新安排库。让我列举一些简单的例子

a)所有预定义的图层都被移动到:
***TF . keras . layers . ****

b)一些数学功能移入子类:
***TF . math . ****

c)更多信息请访问:https://www.tensorflow.org/guide/migrate#top_of_page

底线

本文的目的是提供 TF <2 and TF2+ especially focusing on Coursera Deep Learning Specialization. I have converted all the exercises of the specialization into TF2+ code and have uploaded them on ( link 之间代码差异的快速总结。我希望这个博客是有用的

参考文献

  1. 关于移民的 TF 文件:【https://www.tensorflow.org/guide/migrate#top_of_page】
  2. TF2 DL 专精:
    https://drive . Google . com/drive/folders/1a 9 a9 o 04 odfyjgslybklfqr 58 gduooeyq?usp =共享

Coursera 的 GCP 专业证书数据工程:更好的内容还是更好的营销?

原文:https://towardsdatascience.com/courseras-data-engineering-with-gcp-professional-certificate-better-content-or-better-marketing-6159bc95e7f5?source=collection_archive---------31-----------------------

来自最近认证的数据学生的诚实评论

照片由米切尔罗Unsplash

(注:所有观点均为本人)

介绍

我最近参加并完成了由 GCP 在 Coursera 上提供的谷歌云专业证书 组成的 数据工程的 5 门主要课程(链接到证书这里

我一直想在 2020 年 Covid 疫情期间提升云技术技能,因此当我发现 GCP 在著名的电子学习平台上发布了一个大规模目录时,我抓住了参加这一系列课程的机会。

来源:谷歌云

总体体验

参加证书考试绝对是一次积极的经历,让我对 GCP 数据栈的一个很好的部分有了坚实的概念理解,并允许我亲自参与个人项目,我写了一篇相关的文章( 如何使用 API 和 Google Cloud 用 Python 自动收集金融数据)。

尽管如此,我觉得整个课程和课程结构的真正目的更多的是围绕向潜在的企业客户推销 GCP 套件,而不是培养学生对该工具及其潜在应用的深入理解。

我认为这对于一个组织来说是非常好的,事实上有许多软件公司利用他们的培训项目来推动采用和公司合作。我确实参加了 AWS、Tableau 和 Alteryx 等公司的课程,列举了分析领域一些非常著名的提供商,这些公司自然都在努力增加其工具的市场份额,并将培训计划和认证工作作为实现这一目标的额外途径。

然而,对于 GCP Coursera 的目录,我感到有点吃惊,因为我经常看到这种总体营销努力从后门偷偷溜进来,夺走了一门原本令人惊叹的课程的深度、内容和学习重点。

当一位同事在谷歌云平台专业化 ( 也是 GCP Coursera 目录的一部分)上使用 TensorFlow 进行 机器学习时,他对他所覆盖的课程表达了类似的抱怨,这进一步证实了这一观点。

需要强调的一个重要方面是,大多数学生对在线课程的质量和享受程度的看法主要取决于两个因素:

  1. 学生在参加课程之前在该科目上的技术能力水平
  2. 学生选修这门课程的内在动机

考虑到这一点,我也有可能不适合最适合利用学习资源并从课程中获得最大程度的知识和乐趣的学生。从这个意义上来说,我并不是一个成功的 AWS 数据工程师,我并没有试图将 GCP 加入到我可以合作的云提供商的名单中,因此,也许我没有掩盖许多其他入门级别的课程和实验,在这些课程和实验中,我发现上面提到的营销工作有点太过侵扰。

为了让你自己判断,我在下面总结了如果你决定在 Coursera 上参加 GCP 的数据工程专业证书考试将会发生什么,以使你能够决定是否继续进行时间和投资(39/月订阅直到完成-价格可能会根据你所在的位置而有所不同)

结构和课程主题

GCP 数据工程专业证书分为 6 门课程,为期 2 周(指示性期限)。课程列表如下:

  1. 谷歌云平台大数据与机器学习基础

2。 用 GCP 实现数据湖和数据仓库的现代化

3。 在 GCP 建设批量数据管道

4。 在 GCP 上构建弹性流分析系统

5。 智能分析、机器学习、AI 上 GCP

6。 备考谷歌云专业数据工程师考试

作为先决条件,谷歌的团队建议拥有“大约一(1)年以下一项或多项经验:

  • SQL 等通用查询语言
  • 提取、转换、加载活动
  • 数据建模
  • 机器学习和/或统计
  • 用 Python 编程

事后看来,可以公平地说,即使你对上述所有要点有了较高的认识,你也应该能够跟上并完成整个课程,因为你不会进行深入的机器学习或建模。了解这些概念确实有助于更好地理解 GCP 如何使您能够使用其堆栈和服务来服务于您的项目目的,并将其服务与市场上其他主要的云提供商进行比较。

总的来说,专业证书在 Coursera 上被归类为中级系列,我想大概就在这里。

赞成者

  1. 品牌名称和职业机会

在 GCP 完成认证有明显的职业好处,可以打开许多项目和就业机会。在咨询行业,随着谷歌在与 AWS 和微软 Azure 日益激烈的云市场份额争夺战中推进其在该平台的投资,客户项目越来越多地需要 GCP 技能熟练的从业者。

甚至在某些情况下,你需要获得 GCP 认证才能参与某个项目(如果你在该领域活跃的大型咨询公司工作,并且该公司可能已经制定了这样的资源政策)。在这种情况下,如果你热衷于参与其中,在谷歌云中获得认证真的可以让你与众不同。

展示您的证书表明您已经对学习该平台产生了浓厚的兴趣,以便作为云从业者迈出第一步,他们可以通过为各种公司和项目构建数据管道来增加价值。

2。动手实验

通过 Coursera 分发的这一证书和其他 GCP 证书有一个很大的好处,即通过让学生积极参与实验任务,让你学习平台的架构、用户界面和组件,学生可以通过Qwiki labs平台参与实验任务。

所有课程主题都包含在实验中,这给了你一个熟悉产品并开始构建解决方案的机会。

学习团队在为您提供有效完成实验所需的所有信息和资源方面做得很好,对我来说,这是证书最令人兴奋的方面,因为它在将理论和实践结合在一起方面使体验变得非常互动和有凝聚力。

3。足够的知识,通过 GCP 的免费等级账户开始个人项目

如果实验室仍然不能让你满意,你想直接构建自己的解决方案,那么你可以通过注册一个 GCP 免费层帐户(你可以使用你现有的谷歌帐户来注册)来立即开始,并利用大量免费资源来立即玩。

在这方面,数据工程专业证书是一个很好的方法,可以向学生灌输足够的知识,让他们直接在 GCP 控制台中从事自己的项目。

你甚至可以中途停下来,自己开发一些东西,然后回到 Coursera 的资源上,继续你的学习,推进你的个人项目。

4。GCP 专业数据工程师考试优秀备考

如果你真的想重新学习技能并获得谷歌云专业认证,那么 Coursera 的证书是成功通过谷歌云专业数据工程师考试的绝佳准备资源。该系列的课程 6 实际上完全致力于给你成功通过考试的提示。

这项考试是公认的作为数据工程师熟练使用 GCP 控制台的官方行业标准,肯定比简单地参加 Coursera 上的专业证书更能促进你的职业前景。

坏处

  1. 缺乏深度

这些课程很好地向你概述了在 GCP 成为一名有效的数据工程师所需的主要工具,但我更希望看到一些更深入的探讨和某些数据工程主题的更强的概念化。

相反,课程的一些相关部分从 GCP 工具跳到 GCP 工具,没有必要详细查看每一个工具以及它们如何在一个潜在的项目中组合在一起。

因此,肯定需要通过其他资源整合一些相关知识,因为你将从这个专业证书中对工具 X 和工具 Y 的功能有一个很好的了解,但很可能必须开始自己构建,以建立一个更好的不同部分如何适应 GCP 控制台难题的理论意识。

2。不一致的课程

作为一名数据工程证书,我原本希望材料只关注数据摄取、处理、自动化和流程等主题,而不是偶尔与处理机器学习或数据可视化的 GCP 工具(如 AutoML 和 Data Studio)一起展示。

如果我想学习这些,我会选择他们目录中提供的其他专业证书。相反,有一整个课程(课程 5)致力于不太相关的主题,以及更多的视频分钟,旨在展示谷歌在控制台中的人工智能能力。

总的来说,我真的看不出一个合适的,最重要的是,浏览那些与未来的数据工程师不太相关的材料是有好处的,这些材料从最重要的概念中带走了更多的深度。

3。偶尔不要脸的自我推销

如果你一直读到现在,你可能会发现这是对我来说最有问题的方面;偶然发现名为“为什么客户重视数据流”的讲座确实暴露了一个事实,即有些讲座并不是真正针对学生的,而是将观众视为向其销售云解决方案的潜在客户。

这一点与课程缺乏深度有很好的联系,因为重点从深入学习数据工程等转移到展示 GCP 的工具伞和它承诺为客户解决的用例,而不是只关注用户的纯学习体验。

定论

总而言之,如果您符合以下条件,我仍然建议您参加本课程:

  1. 一位有成就的云开发人员/数据工程师,有兴趣了解 GCP 数据工程堆栈能为您做些什么
  2. 希望获得认证并准备 GCP 数据工程师专业考试
  3. 从概念角度而非技术角度快速了解 GCP 数据堆栈

如果您符合以下条件,我仍然建议您参加本课程:

  • 完成 Coursera 的专业证书后,希望成为一名数据工程师或 GCP 专家
  • 寻找对 GCP 的深入了解适用于所有与数据工程相关的事情:从你自己的项目开始,深入研究 GCP 非常详细的文档可能会证明对你更有效。

访问我的免费数据科学资源清单 这里

[## 通过我的推荐链接加入 Medium-Edoardo Romani

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

edo-romani1.medium.com](https://edo-romani1.medium.com/membership)

恶意软件分类中的协变量转移

原文:https://towardsdatascience.com/covariate-shift-in-malware-classification-77a523dbd701?source=collection_archive---------60-----------------------

快速变化环境中的分类器需要超越泛化

在恶意软件分类中忽略 PE 文件的大部分就像在人脸识别中忽略主要的面部特征一样:两者都可能导致性能问题,即使模型的训练误差很小。但是,对于 PE 文件,性能差距可能在测试数据集和真实数据集之间,而不是在训练和测试数据集之间。

介绍

数据生成分布中的协变量移动降低了泛化误差作为模型性能度量的有用性。通过解包定义,前面的句子翻译成“我们从其采样训练集的文件分布的高精度(不包括训练集本身)并不总是意味着其他重要分布的高精度(即使样本与其标签之间的真实关系没有改变)。”如果一个水果分类器的训练集中只有一个香蕉的例子,那么该分类器在仅包含 10,000 个变异香蕉的样本集上可能表现不佳,即使它在从与其训练集相同的分布中采样的一个保持测试集上表现非常好(在该测试集中,香蕉可能很稀少)。这种性能差距可能是一个问题,因为用一个伸出的测试集来逼近泛化误差是衡量模型性能的标准方法。

在实际的机器学习中,快速变化的输入分布是一个共同的挑战

这一概念对于恶意软件分类至关重要,许多论文在采样偏差的背景下讨论了这一概念,其中用于训练的样本不是从与用于测试的样本相同的分布中随机采样的。有趣的是,我曾与许多恶意软件分析师合作过,包括那些几乎没有 ML 经验的分析师,他们的直觉是,具有良好泛化能力的模型在部署后可能会表现不佳——这是由于模型被训练的文件和它扫描的文件之间的差异。然而,并不总是清楚如何识别和修复与协变量移位相关的问题:当良好的泛化能力不够时,提高泛化能力的传统正则化技术可能没有帮助。在花了 5 年时间对恶意软件进行逆向工程和分类(使用传统的、非基于 ML 的技术)后,我对恶意软件分类有了很多直觉,但在我对机器学习产生热情之前,我无法表达这些直觉。我写这篇博客的目的是在机器学习的更正式的背景下解释这些观点。由于一些正式解释的尝试是不精确的(可能是不正确的),这个博客的另一个目的是征求讨论、反馈和纠正。我加入了许多不同的概念和背景,因为我觉得将概念相互关联有助于增进理解,尤其是如果它们可以与恶意软件分类等实际目标联系起来。

我希望任何对协变移位感兴趣的人都可以从这篇博客中受益,但目标受众是在机器学习方面有一些经验的人,他们希望将其应用于计算机安全相关的任务,特别是“静态”恶意软件分类(我们希望在给定文件在磁盘上的字节数的情况下对文件进行分类,而不运行它)。我希望这篇博客支持的一个关键结论是,将先验知识整合到恶意软件分类模型中的重要性。我相信在分类步骤之前,当讨论模型可能表示其输入的方式时,先验知识是特别相关的。例如,我在本文中详细介绍了一些我认为与 CNN 恶意软件分类模型相关的领域知识:https://towardsdatascience . com/malware-analysis-with-visual-pattern-recognition-5a 4d 087 c9d 26 # 35f 7-d 78 fef 5d 7d 34

我在附录中回顾了主要部分中使用的一些核心概念(如归纳偏差、一般化和协变量移位),提供了额外的背景知识

恶意软件分类中的协变量转移

我不认为在大样本集上表现出良好概括能力的模型是无用的。如果一个模型在它被训练的发行版上表现不好,那就是一个问题。安全行业中有大量的经验证据表明,一个能够很好地概括但对输入分布的变化不是非常鲁棒的模型仍然能够提供价值,特别是如果经常重新训练并针对特定的客户环境。然而,在这一点上,行业中使用的许多模型在保留的测试集上表现出高精度。我相信,提高来自重要新发行版的样本的性能,比如在模型被训练一个月后创建的文件,比在测试集准确性上做微小的边际改进具有更实际的影响。接下来的几节将介绍为什么这些新分布是必要的,以及为什么它们是“协变量转移”的一个例子。如果你不熟悉协变量移位的概念,我建议你浏览一下附录中的背景部分。

为什么 p(x)会改变

在恶意软件分类的情况下, p(x) 是模型分析的二进制文件的分布。实用的恶意软件分类器从未被应用于它们被训练的发行版;他们需要在不断发展的生产环境中的样本集上表现良好。对于许多反病毒软件供应商来说,这意味着对每台装有该反病毒软件的机器上的文件以及提交给 VirusTotal 和 antivirus review 测试等其他服务的样本都要表现良好。概化性能不能很好地预测模型在这些样本上的表现,主要有两个原因:

样本选择偏差:在安全行业中,根据模型在部署时遇到的随机选择的文件来训练模型是很少见的。这是因为准确的标签是昂贵的:它通常需要某种程度的人工分析,并且需要访问所有扫描的文件。包含分析师出于其他原因标记的文件是正常的,例如为了客户的直接利益或由第三方提供和标记的文件。如果不涉及人工分析,在多个自动化分析系统之间就有反馈循环的危险。因为我们无法在目标分布的真正随机样本上可行地训练模型,所以样本选择过程是有偏差的。从技术上来说,我们可以通过随机采样扫描仪遇到的文件,并用人类分析师标记它们来解决这个问题,但这将导致一个小样本集,其中大部分是干净的文件。我把在模型被部署后扫描程序遇到的文件的分发称为“生产中的分发”

环境变化:每次您复制、编辑、更新、下载或删除文件时,您都会修改恶意软件扫描程序遇到的分发。当在每台机器上求和时,分布的变化可能足够显著,这意味着上周表现良好的分类器可能在本周显著下降。恶意软件分类器也存在于敌对的环境中,攻击者故意修改输入以避免正面分类。缓解这个问题的一个典型策略是不断地重新训练,但是不可能对实际的生产中的发行版进行训练(即使我们有它们的标签),除非我们从不扫描在收集我们的训练集之后创建的文件。这种场景产生了一种无法克服的样本选择偏差:我们无法在未来创建的样本上进行训练。

为什么 p(y|x)不变

协变移位要求p(y =恶意| x =文件)不变,而 p(x) 变(见附录)。在恶意软件分类的情况下, p(y =恶意|x) 是给定文件 x 是恶意的概率。如果 p(y|x)p(x) 都改变,可能无法保持精度。我无法证明 p(y|x) 不会改变,但我认为,改变一般是,对于某些类别的模型,独立于 p(x) 。这里的 p 指的是真实的数据生成分布,而不是概率分类器试图逼近 p(y|x)。

p(y =恶意|x) 不是 1 或 0 有两个主要原因:

A.输入中的不确定性: y 是某个表示 x' 的确定性函数,但模型使用的输入 x 并不包含 x '的所有相关部分。这一概念在附录的“确定性分类与随机分类”一节中有所涉及,但这是一个关键案例,所以我将在下一节中详述。我使用 x' 来指代可以确定地映射到标签的输入,使用 x 来指代可以或不可以确定地映射到标签的输入。

B.标签中的不确定性: y 的定义没有完全考虑所有输入(灰色软件是恶意软件分类中的一个例子)。我将把完整的解释留到附录部分“为什么 p(y|x)不变:标签中的不确定性”

输入的不确定性

在这一部分,我认为文件中的字节对应于x’。

这里有一个简单的例子。我精确地将“八”定义为图 1 所示的特定形状

图 1:“八”的定义

而“三”是图 2 所示的形状

图 2:“三”的定义

如果我们可以访问整个输入( x' =图 1 或图 2),我们就可以非常确定地知道标签应该是什么。但是,我们可能无法访问完整的输入,如下图所示,其中一些输入用红框隐藏:

图 3:数据可以隐藏,在这个例子中是通过一个红框

图 4:隐藏数据导致的不确定性

在这种情况下,我们的输入 x (图 3)随机映射(图 4)到两个不同的 x’(图 1,2),它们确定性地映射到 y 值‘8’和‘3’。我将映射函数称为 g ,在本例中, g 添加了一个红色框,隐藏了 8 和 3 之间的区别。我将映射 x'y 的函数称为 f_true ,它是一个有效的完美分类器,通过访问所有相关信息来避免随机性。有关更多详细信息,请参见附录中的“确定性分类与随机分类”部分。

如果训练集包含标记为“3”的图 3 的 90 个副本和标记为“8”的 10 个副本,并且我们有一个统一的先验,那么p(y = 8 |图 3) = 0.1* 和p(y = 3 |图 3) = 0.9 。如果测试集是从相同的分布中抽样的,那么它很可能具有相似的 3 与 8 的比率,因此我们的模型将具有良好的泛化能力。然而,一个新分布的测试集可能 8 出现的次数平均是 3 的 9 倍。如果我们对来自该分布的样本进行测试,我们可能会得到糟糕的性能。除非我们可以取消隐藏某些数据,否则获得良好的泛化误差和新分布误差可能是不可行的。在这篇博客中,我使用新分布误差来表示当模型应用于不同于其训练集采样的分布时的泛化误差(在附录的协变量移位一节中有更多相关信息)。实际上,试图找到生产中分布的新分布误差可能是比一般化误差更好的恶意软件分类器的性能度量。图 5 展示了这个例子。一个关键要点是,当我们从总体 1 过渡到总体 2 时,在考虑我们的原始样本(两种情况下的图 2)和由 f_true 定义的 p(y|x) 时,我们会经历协变量移位。然而,当我们考虑隐藏相关信息的中间表示时,我们遇到的变化类型 ( 图 3)不是协变量变化:它比协变量变化更糟糕。这是因为p(y =标签“三”| x =图 3) 从人口 1 的 90%到人口 2 的 10%。*

图 5: p(y|x) 对于 f_true 是常数,但是在被 g 变换时发生变化。“总体”框表示我们从中取样的总体(9x[image]表示总体中有 9 个该图像),“样本”框表示我们从总体中抽取的样本(两种情况下都是“3”),而“函数”框表示我们对样本应用什么函数,p(y|x)框表示给定总体的函数输出时可能标签的条件分布。

总之:如果信息是隐藏的(输入是g(x’),那么 p(y|x) 可能随着 p(x) 而改变,因为对 p(x) 的改变是由基础分布p(x’)的改变引起的。当存在采样偏差或环境变化时,会发生这种 p(y|x) 的变化,这两种情况在恶意软件分类中很常见。

例如,假设您的数据集包含许多最近的恶意样本,以及来自不同日期的干净样本。考虑到恶意样本比干净样本变化更频繁,这是一种常见的情况。假设模型使用( PE )文件的时间戳值对文件进行分类( g 隐藏除时间戳之外的所有信息)。该特性同样适用于从同一发行版中采样的训练集和测试集,因为在这两种情况下,恶意软件往往比干净文件更新。该功能在技术上概括得很好,但是当数据集包含最近的干净文件时,例如在刚刚进行了软件更新的任何机器上,任何完全基于时间戳的分类器都不会执行得很好。将此与附录的确定性与随机分类部分联系起来, y=f_ideal(x = PE 时间戳)y = f _ true(x’=文件中的所有字节)非常不同,其中x = g(x’)g 是提取 PE 文件时间戳的特征提取器。注意,这是假设恶意样本不会故意修改 PE 时间戳,这种情况是可能发生的。

保持 p(y|x)不变所需的假设

恶意软件的定义是精确的,不变的,完全依赖于一个文件的字节数( x' ),所以 yx : p(y =恶意|x') = 1 或 0 = f_true(x' =一个文件中的所有字节)。这里有另一种方式来思考这个问题:假设实际上可以表示的文件空间是有限的(尽管大得不可思议),我们可以给这个空间中的每一个点一个标签。这种假设要求我们在依赖关系的上下文中考虑文件,因为某些类型的恶意软件有多个组件。

在下一部分中,我将讨论尝试和确定一种方法是否更容易受到输入分布变化的影响的方法。总是存在一些漏洞,因为我们的分类器需要降维,并且我们没有降维技术不会丢失至少一些与从x’y (f_true) 的确定性映射相关的信息。

减轻因协变量转移引起的问题

在做了一些假设之后,上一节确立了协变量移位是一种描述当我们考虑文件中的所有字节以及文件的分布变化时会发生什么的好方法。与 p(x)p(y|x) 都改变的场景不同,我们有一个创建有效分类器的方法:找到一个尽可能接近 f_true 的函数。这里有另一种方式来看待它:概率分类器试图找到p(y = label | x ' =文件中的字节)。*数据生成分布有一个 p(y|x') = f_true ,当 p (x ')变化时,该分布不变。如果我们发现 f_true,那么我们模型的 p(y|x' )不会随着 p(x ')的变化而变化。*

另一种选择可能是试图准确预测输入分布将在哪里变化,但我怀疑这在一个高度动态、充满敌意的环境中能起多大作用。在简介中的水果分类器示例中,尝试对 f_true 建模意味着创建一个模型,该模型理解每种水果的定义,并且能够将任何输入与该定义进行比较:当数据集转向大部分香蕉时,这种方法将会起作用。预测输入分布的变化可能意味着在训练中更加重视某个特定的类。如果我们选择了香蕉以外的类,那么在输入分布转变为主要是香蕉之后,我们的模型仍然会表现不佳。

是什么使一个模型容易受到协变量变化的影响,如何解决这个问题?

假设从部署的模型扫描的文件中随机采样的新分布数据集可以用于测量相关的新分布误差。给定测试集错误,接收比预期更多的假阳性报告也可能暗示高的新分布错误。然而,由于完美的泛化不能保证对输入分布变化的鲁棒性(参见上一部分中的 PE 时间戳示例),可用于提高泛化能力的策略(如常见的正则化技术)将不会有助于超过某一点(尽管如果我们的模型不能泛化,这对新分布性能来说是个坏消息)。一旦我们有了一个低的泛化误差,我们需要找到一个新的旋钮来改善新分布误差。我认为最好的方法之一是找到结合先验知识的方法,以获得最佳归纳偏差。有几种方法来限制我们的学习者的假设空间,以排除在新分布测试集上概括良好但表现不佳的模型。在时间戳被用作产生模型的特征的示例中,该模型是一般化的,但是对于输入分布中的变化不是鲁棒的,排除依赖于 PE 时间戳的假设可以帮助减少新分布误差。这种排除是基于先前的知识,即干净的和恶意的文件可能是新的或旧的。对于 PE 文件,可能需要排除大量的特征,并且我们想要保留的特征可能难以计算(尽管对于更复杂的函数,可以使用神经网络作为特征提取器)。

在极端情况下,如果我们事先知道函数y = f _ true(x’),该函数在x’的整个域上将x’映射到 y ,那么我们可以排除所有不是f _ true(x’)的假设。虽然该功能通常不太容易找到,但恶意软件分析师需要能够在心理上近似 f_true 才能对他们看到的所有文件进行分类,即使他们以前没有看到过类似的文件。这有助于在实践中,我们不需要考虑所有可能的文件,只需要考虑现代人和我们的工具创建的所有文件。

我们可以(或许应该)在每一步都引入归纳偏差:使用什么数据,如何预处理,使用什么模型,如何选择架构、特性、超参数、训练方法等等。每个例子都超出了本博客的范围;相反,我将重点讨论特征提取,这是引入感性偏差的最常用方法之一。

实现对输入分布变化的鲁棒性

特征工程对于许多类型的模型来说是至关重要的一步,因为特征直接导致了模型的归纳偏差:如果特征排除了部分输入数据,则模型不能将该数据用作学习假设的一部分。将数据转换为低维特征集也非常重要,因为寻找 f_true(x') 的主要挑战之一是 x' 是非常高维的:这是许多类型的分类器的主要问题。对于随机森林等一些模型来说,手工设计的特征是常见的,而卷积神经网络等其他模型会自动提取特征。对于手工设计和自动提取的特征,模型倾向于遵循图 6 所示的架构:

图 6:许多机器学习模型中的通用架构

每个盒子完全依赖于前一个盒子。前三个框包含特征组或“表示”右边的框不能比左边的框包含更多的输入信息。通常,像这样的体系结构的目标是丢弃与分类无关的信息。较少的不相关信息允许分类器处理比x’更低维度的表示,同时保持性能。具体情况取决于模型,例如,神经网络比基于决策树的模型有更多的表示层。关键的细节是,每个表示法倾向于比前一个表示法具有更少的关于输入的信息,并且如果丢失的信息与f _ true(x))相关,那么模型的所有下游部分必须处理“不确定输入”的情况,其中我认为 p(y|x) 可以随着 p(x) 而改变。因此,我们希望确保低维表示仍然包含足够的信息来计算f _ true(x’)(参见图 7),即使它包含较少的关于原始输入的信息。不幸的是,我们在实践中通常无法做到这一点,所以当考虑模型的输入的中间表示时,我们不再处理协变量移位。也就是说,我们仍然可以通过 p(x) 来减少p(y | x =中间表示)的数量变化。

图 7:先验知识告诉我们,如果我们必须隐藏信息,当分类 3 对 8 时,隐藏下半部分比左半部分更好:左边的两幅图像仍然可以被完美地分类,而右边两幅图像的分类器取决于保持恒定的 3 和 8 的比例

正如论文“为什么深度廉价学习效果好”中所讨论的,这个概念与数据处理不等式有关:

> =替换为=如果 g(x)y. 互信息( I) 是分布特定的,那么即使 g(x) 是给定p(x)*的 y 的充分统计,当分布转移到 p'(x) 时也可能不是。为了对输入分布的变化具有完美的鲁棒性,我们需要 yg(x)的确定性函数。如果是这种情况, g(x) 对于 x 上的所有分布来说都是 y 的充分统计量。我们已经确定这是数据生成分布的情况:协变量移位意味着 p(y|x') 不随 p(x ')变化。*

分类在“深度和廉价学习”论文中被讨论为基于马尔可夫链的生成过程的逆过程,这对于恶意软件分类具有直观的意义:文件的作者将知道他们编程的功能是否是恶意的,作为创建过程的早期步骤。图 8 显示了针对恶意软件的反向流程示例:

图 8:代表恶意软件生成和分类的马尔可夫链

分析师使用一些快捷方式来加快分类速度,但这个图表与恶意软件创建和人工分析的工程和逆向工程并不太遥远(如果分析师想要最准确的结果并且有很多时间)。不幸的是,这些步骤中的每一个都很复杂,创建一个健壮的函数在它们之间转换在今天可能是不切实际的——恶意软件打包程序仍然是躲避防病毒产品的默认方式。我们需要一个替代方案,但它有助于记住这个大致理想化的马尔可夫链:请注意,在分类过程中,任何一步都不会丢失与恶意功能相关的信息。在后面的博客中,我可能会讨论受恶意软件分析师用来加速分类的捷径启发的替代方案,重点是恶意软件打包程序。

关键要点是,如果模型在任何时候使用的表示不包含与文件是否恶意直接相关的信息,则模型可能更容易受到输入分布变化的影响。例如,安全行业中的一些模型主要使用从 PE 头中提取的值作为特征。然而,这种表示排除了与f _ true(x’)相关的大量信息,因为现有知识告诉我们 PE 头值并没有给出关于文件行为的太多指示,而这是确定文件是否是恶意的所必需的。更糟糕的是,躲避防病毒签名的默认方式——自定义恶意软件打包程序——可以将 PE 头设置为他们想要的任何值。完全依赖于 PE 头值的模型可能在检测其训练集中存在的恶意软件打包程序打包的文件方面做得很好,但是当出现新的恶意软件打包程序时可能会做得更差。然而,包括文件的可能行为的表示不会丢弃与f _ true(x’)相关的信息。这在静态检测(不执行文件的检测)的环境中很难做到;但是,我们仍然可以使用先验知识来尝试和提取比 PE 头数据与 f_true(x') 更密切相关的特征。这方面的一个例子是检测混淆数据的功能,因为混淆通常用于使防病毒检测更加困难:只有恶意软件才需要这样做。

丢弃与数据生成分布的p(y | x’)相关的信息的问题也在图 5 中进行了说明:通过用函数 g 隐藏重要数据,构建在 g 的表示之上的模型通常会在原始输入分布p(x’)改变时具有g(x’)和标签之间的关系。

结论/未来工作

鉴于有许多工具专注于提高泛化能力,考虑如何将泛化误差与提高输入分布变化的鲁棒性联系起来可能会有所帮助。如果我们的样本以某种方式表示,使得来自新发行版的恶意文件看起来与来自原始发行版的恶意文件相同,那么降低泛化错误可能就是所有必需的。我计划在另一篇博客中讨论一些方法来实现对输入分布变化的鲁棒性,重点是表示。一个例子是使用卷积神经网络来专门检测文件中的视觉特征,人类分析师可以在任何文件分发中立即识别这些视觉特征为恶意的,但是对于这些视觉特征,很难手动编程启发式。我还想找到测量新分布误差的好方法,以便更好地进行模型比较。在测量新分布误差方面,一些分布明显优于其他分布,而找到所有生产样本的真实标签这一实际问题仍然阻碍着该分布在实践中的应用。例如,一个替代方案可以是为一个小的子集(<1000) of samples from the in-production distribution and calculating accuracy (or precision) along with a confidence interval that accounts for the limited sample set. Precision is often easier to work within the security industry due to difficulty in finding in-production false negatives in an unbiased way (due to the number of true negatives), and the fact that false positives on average negatively impact more people than false negatives (clean files are much more likely to appear on more than one machine). I would also like to consider adversarial machine learning in the context of covariate shift.

In summary: In any situation where our data generating distribution undergoes covariate shift, we can potentially find a model that is robust to changes in the input distribution p(x’)找到真正的标签。一种方法是使用领域知识来确保我们的模型使用的每个中间表示不会丢弃与 p(y|x)=f_true 之间的真实关系相关的信息。


附录

背景

在这一部分,我回顾了一些相关的背景概念。这里有一个简短的总结:

训练误差衡量模型对其训练数据的表现有多差,样本外(泛化)误差衡量模型对来自与训练数据相同分布的样本的表现有多差。新分布误差衡量模型对来自不同分布的样本(而不是训练数据)的表现有多差。

确定性分类与随机分类

给定输入空间 X 和标签空间 Y ,分类的最理想结果通常是找到一个函数 f_ideal ,该函数完美地将输入映射到标签: y = f_ideal(x) (其中 x ∈ X,y ∈ Y )用于我们的输入分布。该函数将对应于贝叶斯误差为 0 的贝叶斯最优分类器。除非我们能以某种方式证明我们找到了 f_ideal ,否则我们只能使用一个近似它的假设函数 h 。稍后我将在测量误差的背景下详细讨论这一点。

在很多情况下, YX 之间的关系是不确定的:对于同一个 x ,可能会有不同的 y 值。在这种情况下,我们得到的概率分布不是 y = f_ideal(x) ,而是 y ~ p(y|x) 。如果这个条件分布是伯努利分布——例如对于x=输入文件,恶意( y =1)对干净(y= 0)——如果 p(y=1|x) > 0.5 则我们可以让我们的分类器输出 1,否则输出 0。这产生了贝叶斯最优分类器,但是由于不可约的不确定性,贝叶斯误差不为 0。对于为什么相同的 x 具有不同的 y 值,一个常见的解释是因为我们没有足够的信息。也就是说,x = g(x’)其中x’是我们确定性地计算 y 所需的数据。 g 是一个潜在地隐藏关于 x 的信息的函数:例如,一个有损压缩器。这个场景意味着有一个函数 f_true 使得y = f _ true(x’)f_truef_ideal 之间的主要区别在于 f_true 在整个输入域内都非常精确,而不仅仅是输入的单一分布。在这种情况下,我们有一个基础分布 p(x') ,我们从其中采样 x' ,然后使用确定性的多对一函数 g 转换为 x 。相同的 x 可能具有不同的 y 值的原因是因为 x 的单个样本代表具有不同 y 值的x’的多个样本。

一个简单的例子是,如果我们想要确定一幅图像( x' )的平均颜色( y ,但是我们只得到(与 g )像素的子集( x )。在某些情况下,我们无法访问 x' ,只能访问 x ,例如,推荐系统可能需要模拟一个人的大脑( x' )来 100%确定推荐什么,因此它们使用一组行为特征来代替( x )。然而,在其他情况下,我们确实可以访问 x' ,但是我们创建 g 作为我们模型的一部分,因为 x'太多的维度供我们的分类器处理。这个场景是我理解是什么使恶意软件分类器易受输入分布变化的影响的核心,本博客的大部分内容都在这方面展开。在我认为输入决定性地决定输出的情况下,我使用x’;否则,对于 xy 之间的关系可能确定也可能不确定的情况,我将使用 x 。注意,如果我们的归纳偏差没有将贝叶斯最优分类器从我们的假设空间中排除,我们只能学习贝叶斯最优分类器;否则,我们希望学习一个在给定限制条件下尽可能逼近它的函数。

归纳偏差研究综述

作为机器学习中最重要的主题之一,归纳偏差与大多数机器学习相关的讨论相关,但对于本博客来说是必不可少的。[归纳偏差](http://A review of generalization)指的是学习者对其输入和输出之间的关系做出的一系列假设,这些假设用来防止学习者形成一些(希望是不希望的)假设。我们今天使用的所有模型都有一定程度的感应偏差,这是有用的必要条件。但是,如果假设与问题不完全匹配,模型可能无法很好地工作。传统正则化方法的一些观点将它们框定为简单函数的归纳偏差(奥卡姆剃刀)。

例如:

  • 如果学习者在输入和输出之间假设一个简单的关系,而实际的关系是复杂的,这可能会导致拟合不足(在训练数据上表现不佳)
  • 如果一个学习者假设了一个复杂的关系,而实际的关系很简单,这可能会导致过度拟合(在保留的测试数据上表现不佳)
  • 如果学习者假设某个关系适用于分布的变化,而事实并非如此,则可能会使模型易受输入分布变化的影响(在新分布测试集上的性能很差)

在下一节中,我将回顾一般化:讨论协变量转移的最终先决条件。

概括的回顾

泛化是机器学习中的一个基本概念,但要理解模型在协变量移位下的性能,了解协变量移位与样本外测试集(估计泛化的一种常用方法)上的性能有何不同是有帮助的。

分类模型通常通过在一组标记样本上训练模型来创建。给定这些数据,创建一个对其训练数据执行完美的(非参数)模型是很容易的:对于数据集中的每个输入,返回该输入的标签(记忆)。对于不在数据集中的每个输入,返回一些任意的标签。虽然该模型在训练数据上表现得非常好,但在任何其他数据上,它可能不会比随机猜测更好。考虑到我们通常想要标记其他数据,我们需要一种方法来区分两个模型,这两个模型具有完美的训练准确性,但对看不见的数据具有不同的准确性。

通俗地说,泛化通常指的是模型对来自与训练数据相同分布的看不见的输入表现良好的能力。例如,如果我们在猫和狗的照片上训练两个模型,并且两个模型在训练数据上都有出色的表现,我们通常会希望使用在不在训练集中的猫和狗的照片上表现最好的模型。我们可以(很可能)通过比较我们从训练过程中随机选择的“样本外”测试集的性能来找到这是哪个模型。使用随机保留测试集可以确保测试集和训练集都是从同一分布中采样的。**

然而,就像具有相同训练精度的两个模型可能不相等一样,在样本外测试集上具有相同精度的两个模型也可能不相等。例如,如果其中一个模型除了照片之外还可以正确分类人类绘制的猫和狗的图像,即使我们只在照片上训练它,它也可能比只能对照片进行分类的模型更可取。该评估标准也适用于设计用于产生不正确分类(对立示例)的样本:如果模型没有在任何对立示例上训练,良好的概括并不意味着它将正确地分类已经被对立修改的新示例。

恶意软件打包程序和泛化

在某些情况下,通过对抗性机器学习绕过恶意软件分类器是矫枉过正的:创建一个新的恶意软件包装器(在模型的训练分布中以极低的概率产生样本)通常会获得与对抗性机器学习相同的结果(FN ),用于许多类型的概括良好的恶意软件分类器。攻击者多年来一直在创建新的恶意软件打包程序,以避免传统防病毒软件采用的算法检测。恶意软件打包程序将恶意有效负载隐藏在一层或多层加密/混淆之后,只留下可执行的解密存根供静态分析使用。可以使存根连同其他文件属性与以前的恶意软件打包程序几乎没有关联。结果,由打包程序隐藏任何有效载荷,按照大多数标准测量,将不同于现有模型已经利用的任何训练或测试集中的文件。因此,泛化能力良好的恶意软件分类器不需要攻击者改变他们的高级策略来避免检测:他们可以不断推出新的恶意软件打包程序来躲避传统的反病毒技术和基于 ML 的静态检测。对输入分布的变化(在这种情况下是由新的打包程序的创建引起的)具有一定鲁棒性的恶意软件分类器可能更难以绕过。请注意,恶意软件打包程序不同于 UPX 等商业打包程序,后者不是为了躲避防病毒软件的检测而设计的。

协变量移位

在泛化的情况下,我们从输入和标签上的相同数据生成分布 p(x,y)=p(y|x)p(x) 中获取训练集和样本外集。协变量移位通常被定义为输入分布 p(x) 变化,但 p(y|x) 不变的场景。 p(y|x) 发生变化,而 p(x) 没有变化的情况称为概念转换。如果生成数据的 p(y|x) 发生变化,近似原始 p(y|x) 的统计模型将不再有效。

这里有一个例子:假设我们有一个由单个例子组成的训练集, x = 5.02,对于一个回归问题,标签为 y = 10.04。如果我们的归纳偏差是 xy 之间存在线性关系,我们可能得到模型 y = 2x 。如果这是实际的关系,那么这个模型适用于整个域 x 。如果 x 的分布是具有单位方差和 5.0 均值的高斯分布,我们的测试集可能包含示例 x = 4.4, y = 8.8,我们将获得完美的测试精度。然而,即使我们将 x 的分布改为 10 亿到 20 亿之间的均匀分布,该模型仍然有效。该模型对于输入分布的变化是鲁棒的,这通过找到 y = f_true(x) 来实现。然而,如果 yx (随机情况下的 p(y|x) )之间的关系除了p(x)*之外还发生变化,比如说在一个数据集 x =5.02 中始终产生 y =10.04,而在另一个数据集 x =5.02 中产生 y,那么我们就不走运了因此, p(y|x) 不变是很重要的。*

在某些情况下,可以将“对输入分布变化的鲁棒性”视为一般化的扩展。以 3 个不同的数据集为例。第一个是训练集,第二个是来自与训练集相同分布的测试集(用于测试泛化),第三个是新分布测试集,其中成员来自与其他两个数据集相同的域,但使用不同的分布进行采样(用于测试对输入分布变化的鲁棒性)。

  • 如果一个学习者的归纳偏见导致它对训练数据进行欠拟合,它将(可能)在所有 3 个数据集上表现不佳。
  • 如果一个学习者的归纳偏差导致它过拟合训练数据,它将(可能)在测试集和新分布测试集上表现不佳。
  • 如果一个学习者的归纳偏差允许它在它的训练数据被采样的分布上表现良好,而没有其他分布,它将(可能)在新分布测试集上表现不佳。

在这里,我将尝试从数学角度将通用性和鲁棒性与输入分布的变化联系起来。我粗略地从 https://en.wikipedia.org/wiki/Generalization_error 的中提取了这里使用的概括公式

V 被定义为我们的损失函数, h_n 是我们在 n 训练样本上训练的分类器。 x 是输入,比如二进制文件, y 是标签,比如干净/恶意。

训练误差可以通过在训练样本上平均损失函数来计算:

概化误差通过对整个输入分布的损失函数取期望值来计算:

泛化差距或采样误差被计算为训练误差和泛化误差之间的差:

假设对于协变量 shift p(y|x) 为常数,并且 p(x) 变为新的分布p’(x),我们可以重写 I_G[h_n] 来创建一个“新分布误差”:

概括间隙被公式化为训练和概括误差之间的差,因此将分布间隙表达为 I_R[h_n] 和概括误差之间的差可能也是有帮助的。这种差异可以用简单的减法来计算,就像在https://arxiv.org/abs/1902.10811(但为了一致性,要反过来): I_R[h_n]-I_G[h_n] 。如果新的分布更难分类,那么差距就是正的;如果更容易,差距为负,如果同样的难度,差距为 0。分布差距和泛化差距之间的一个显著区别是泛化差距总是正的,但是对于新的分布,可能所有的样本都在分类器的“容易”区域中。因为训练误差是乐观偏向的,所以对于在其上训练的分类器来说,训练数据很可能处于“容易”区域,保持泛化差距大于或等于 0。

如果分布没有显著差异,则检查可能出现在新分布中但不太可能出现在原始分布中的样本可能会有所帮助,从而更好地测试对输入分布变化的稳健性。下一部分是非常非正式的,但是一种方法可以是改变 p'(x) 以从可能在 p(x) 下的区域中移除概率质量,以便我们只评估更可能在 p'(x) 下而不是 p(x) 下的样本。这种方法产生的误差更集中在新分布中可能性更大的样本上。这里有一个 pdf p'' ,它从 p'(x) 中减去p(x)(max 防止负概率密度,分母保持总面积为 1)

这个等式可能并不复杂,但我的假设是使用从p’(x)采样的新分布测试集会有所帮助,就像使用样本外测试集有助于测量泛化误差一样。可能需要先验知识来确认来自p’(x)的样本是否也可能在 p(x) 中。例如,为了更好地逼近 R[h_n] 而不是 I_R[h_n] ,关注被确认为在 p(x) 中概率为 0 的新恶意软件家族的样本的误差可能是值得的。在照片与手绘的情况下(来自“概括的简要回顾”部分),当对手绘图像进行采样时,应该可以安全地假设猫和狗的自然图像是罕见的(照片真实感渲染除外),因此来自p″(x)(手绘的猫和狗的图像,不包括那些相似的猫和狗的自然图像)的样本应该与来自p′(x)(手绘的猫和狗的图像)的样本相似。**

为什么 p(y|x)不变:标签中的不确定性

图 9 显示了“为什么 p(y|x)不变”一节中情况 B 的一个简单例子。在这种情况下,我们可以访问整个输入,但是我们将标签“八”定义为应用于任何看起来像八的东西,将标签“三”定义为应用于任何看起来像三的东西。

图 9:定义导致的不确定性

出现不确定性是因为图 9 左上角的输入看起来既像 8 又像 3。

通常有一个确定性的范围,靠近中间的例子可能更容易受到定义变化的影响,如图 10 所示:

图 10:从“看起来像 8”到“看起来像 3”的范围

因为恶意软件的定义并不精确,所以同样类型的不确定性也会出现。与图 10 类似的恶意软件示例如下所示:

图 11:恶意频谱

由于定义的不确定性,行为更接近中间值的文件(有时称为潜在的有害应用程序或灰色软件)可能更难分类。利用“软标签”——大于 0 小于 1 的标签——是处理标签定义不确定性的一种方法。

恶意的定义可能会改变,这意味着 p(y|x) 的改变。然而,有几个原因使我认为我们在实践中可以忽略这一点:

1.关于“为什么 p(x)变化”部分,导致 p(x) 变化的两个主要原因——样本选择偏差和环境变化——不应改变我们的定义。

2.实际上,我们最关心的是极端情况,在这种情况下,改变定义不太可能产生影响。专为在用户不知情或未经其许可的情况下窃取用户信用卡信息而设计的文件将始终被视为恶意文件,而重要的操作系统文件将始终被视为干净文件。在行业中,我们认为值得检测的变化通常是由围绕某个行为是干净的还是“潜在不需要的”的争论引起的

显然,一些未来的程序可能变得非常难以分类,可能需要伦理哲学来解决:例如p(y =恶意| x = AGI 代码)。**

墨西哥新冠肺炎概述

原文:https://towardsdatascience.com/covid-19-an-overview-of-mexico-ccf702ec80d9?source=collection_archive---------40-----------------------

墨西哥 Covid 19 的因果关系建模

墨西哥霍乱地图确诊病例密度(迭戈乌尔塔多)

自 2019 年 12 月下旬以来,一种新型冠状病毒疾病的爆发(新冠肺炎;此前被称为 2019-nCoV)在中国武汉被报道,随后影响了全球 210 个国家。截至 2022 年 11 月 10 日,墨西哥已确诊约 710 万病例,超过 33 万人死亡。

索引📖

▪️ Covid 19 — 数据分析师墨西哥概述

▪️ E 解释墨西哥死亡案例的模型

▪️墨西哥各县 Covid 病例相关性

▪️墨西哥的流动性模式行为

▪️ 墨西哥各县聚类

Covid 19 —墨西哥概述🇲🇽

我使用了确诊/死亡病例的时间序列,并结合了 covid 期间个人描述的数据集

确诊病例(迭戈·乌尔塔多)

确诊病例最多的时期。第三波(迭戈·乌尔塔多)

死亡病例墨西哥(迭戈·乌尔塔多)

死亡病例最多的时期(Diego Hurtado)

按年龄分列的死亡病例(Diego Hurtado)

按年龄确认病例范围(Diego Hurtado)

确诊病例的年龄分布(Diego Hurtado)

按性别分列的确诊病例比例(Diego Hurtado)

住院人数百分比(Diego Hurtado)

covid 19 期间的墨西哥疾病

由于大量肺泡损伤和进行性呼吸衰竭,严重疾病发作可能导致死亡。新冠肺炎疫情对长期血液透析患者来说是高风险的,因为他们处于免疫抑制状态,年龄较大,并且存在显著的共病,特别是心血管疾病、糖尿病等。同样值得注意的是,心血管风险因素在墨西哥人口中非常普遍,并以惊人的速度增长,心血管疾病是墨西哥的第一大死亡原因[2]。

确诊病例所占疾病百分比(Diego Hurtado)

确诊病例所占疾病百分比(Diego Hurtado)

墨西哥🇲🇽科维德仪表板(迭戈乌尔塔多)

墨西哥头号死亡原因🇲🇽(迭戈 Hurtado)

Covid 19 导致死亡的原因是什么?解释模型🇲🇽

为了试图解释死亡原因,我使用了流行病学总局报告的墨西哥数据集,首先我使用了 2022 年期间,然后是死亡病例最多的时期。[2020 年 11 月 2 日至 2021 年 3 月 22 日]

死亡案例 2022(迭戈·乌尔塔多)

我用随机森林来预测一个人是否会因为年龄和疾病而死亡。

2022 年期间的死亡案例树形图(Diego Hurtado)

covid 死亡病例分类器的 ROC 曲线

该模型的准确度分数是 0.999586786786

2022 年死亡案例的主要原因(Diego Hurtado)

Shap 值影响死亡案例 2022 ( Diego Hurtado)

我们可以看到,如果一个人年龄越大,死亡的概率就越大,2022 年(迭戈·乌尔塔多)

病例最多的时期【2020-11-02,2021-3-22】

死亡病例最多的时期[2020 年 11 月 2 日,2021 年 3 月 22 日] (Diego Hurtado)

我做了同样的过程,但使用的是墨西哥死亡病例最多的时期。

2022 年期间的死亡案例树形图(Diego Hurtado)

最严重死亡案例期间树形图的左部(Diego Hurtado)

最严重死亡案例期间树图的右半部分(Diego Hurtado)

covid 死亡病例分类器的 ROC 曲线

AUC:0.90083868686

该模型的准确度得分为:0.9648638686866

特征重要性(迭戈·乌尔塔多)

我们可以看到,如果一个人年龄越大,死亡的可能性就越大(迭戈·乌尔塔多)

死亡案例最多期间的死亡案例主要原因(Diego Hurtado)

Shap 值影响最多死亡案例期间的死亡案例(Diego Hurtado)

墨西哥各县 Covid 病例相关性🇲🇽

我正在将用户信息转换到县一级,以查看县信息之间是否有任何关联,从而证明高死亡人数的因果关系,揭示复杂系统中不同现象的原因和影响的能力将有助于了解卫生系统的改进领域。

首先我用的是因死亡的病例数

后来,我使用了各县的社会人口统计信息,如人口、贫困水平、健康状况

观察:

值得注意的是,墨西哥各县的医疗保险覆盖率很低

此外,在医院插管的人死亡的比例很高

墨西哥卫生部门的死亡人数

观察:

另一个重要的方面是,墨西哥的贫困水平很高,所以人们不能呆在家里,墨西哥人没有从总统那里得到任何帮助留在隔离区

观察:

我们可以看到,死亡人数最多的前 10 个县是贫困人口最多的县

墨西哥的流动性🚗 🇲🇽

尽管感染人数激增,墨西哥总统在五月开始了“新常态”来“重新激活”经济

在商店外面,顾客们在等待,没有注意到健康距离。Av。CDMX Eje Central 的华雷斯角。2020 年 5 月 21 日。图片:angélica Escobar/福布斯墨西哥。

观察:

我们可以看到,确认/死亡/流动性在 2021 年 5 月【新常态】 开始时开始增长

墨西哥死亡病例(迭戈·乌尔塔多)

确诊病例(迭戈·乌尔塔多)

我使用不同的数据集来了解 Covid 19 期间墨西哥的移动趋势

“新常态是一种幻觉,我们正处于流行病活动中,我认为在这个时候提议重新开始社会活动实际上是自杀行为,我认为这可能会以前所未有的水平重新激活患者和死者的数量”马拉奎亚斯·洛佩斯·塞万提斯****

观察:

很明显,新冠肺炎在墨西哥的传播速度更快,死亡率更高,生活在贫民窟的人可能是这种情况下的一个关键因素。也许这就是墨西哥冠状病毒病例不断增加的原因。

在墨西哥,住在房子里的平均人数是 3 到 5 人。

迭戈·奥乌尔塔多

今天,根据最保守的估计,大约有 9 亿人生活在贫民窟。据估计,到 2030 年,地球上将有 1/4 的人生活在贫民窟或其他非正规居住区。让我们参观一下世界上最大的贫民窟:

  • 开普敦的哈耶利沙(南非):40 万人
  • 内罗毕的基贝拉(肯尼亚):70 万人
  • 孟买的达拉维(印度):100 万
  • 内萨(墨西哥):120 万
  • 卡拉奇的奥兰治镇(巴基斯坦):240 万人

墨西哥城

人口:110 万

虽然有些人认为内扎华尔科约特城,也被称为内扎,已经从一个贫民窟演变成了一个郊区,但砖砌的房子散布在临时搭建的棚屋中,即使以饱受毒品战争折磨的墨西哥的标准来看,这个社区也被认为是极其危险的。社区行动促使政府将土地所有权正式化,开始垃圾收集,并建设其他一些关键的基础设施。现在,大约 70%的居民在该地区工作,这是墨西哥人口最稠密的直辖市。

2016 年 9 月 30 日,墨西哥墨西哥州内扎华科约特尔(Nezahualcóyotl)的鸟瞰图。汤森路透基金会/约翰尼·米勒

观察:

我们可以观察到,人口越多的县,死亡病例就越多

****

观察:

我们可以观察到人口较多的县也是确诊病例较多的县

墨西哥城市地区

****

墨西哥城市地区

即使我们能观察到相关性,也不能证明因果关系。

当问题脱离非常狭窄的情况时,数据无法回答问题,但无法解释它们是如何联系在一起的。

🇲🇽聚集的墨西哥郡

我正在使用聚类算法对各县的数据进行分组,以发现某些相似之处

首先,我基于坐标对各县进行聚类,以测试算法性能

****

迭戈·奥乌尔塔多

聚类算法看起来不错

质心是较大的蓝色圆圈

集群有不同的颜色

圆圈的大小基于人口数量

迭戈·奥乌尔塔多

死亡分析细分

为了对各县进行细分,我使用了死亡病例数、人口数、住院人数、医疗可及性、贫困水平、极端贫困人数和家庭内从业人数。

我正在执行的步骤如下:

相关估计

计算所选特征的相关系数

𝐒𝐭𝐚𝐧𝐝𝐚𝐫𝐝𝐢𝐳𝐚𝐭𝐢𝐨𝐧

标准化数据,使所有特征具有同等的权重

分层聚类

我用一个树状图绘制了层次聚类的结果

𝐏𝐂𝐀

使用主成分分析来找出解释数据差异的成分子集

绘制由组件总数解释的累积方差

我选择三种成分。根据上图,3 或 4 似乎是正确的选择

主要组件与原始功能的热图

迭戈·奥乌尔塔多

PCA 可视化

迭戈·奥乌尔塔多

迭戈·奥乌尔塔多

绘制 K 均值 PCA 模型的类内平方和

我选择了 4 个集群

主成分分析结果的 k-均值聚类📊

集群 1: 死亡人数非常高

聚类 2: 死亡人数最多

聚类 3: 死亡人数中等

聚类 4: 死亡人数少

****

我们可以观察到,结果与前面的分析非常相似,人口密度越大的县,死亡病例就越多。

🇲🇽概述

墨西哥州确认🇲🇽病例

墨西哥霍乱地图确诊病例密度(迭戈乌尔塔多)

墨西哥州死亡病例🇲🇽

十大死亡案例州(Diego Hurtado)

按性别分列的十大死亡案例州(Diego Hurtado)

墨西哥 Choropleth 地图死亡病例密度(Diego Hurtado)

死亡率最高的 10 个州(Diego Hurtado)

墨西哥 Choropleth 地图死亡率密度(Diego Hurtado)

每 10 万人口中的前 10 个死亡案例(Diego Hurtado)

Choropleth 地图墨西哥每 10 万人口密度死亡病例(Diego Hurtado)

墨西哥的新冠肺炎:各州确诊病例总数(迭戈·乌尔塔多)

墨西哥的新冠肺炎:各州死亡病例总数(Diego Hurtado)

死亡人数最多的州是墨西哥城

墨西哥需要采取行动

****对墨西哥新冠肺炎的预测性监控:新冠肺炎预测对于合理化规划和心态至关重要,但也具有挑战性,因为复杂、动态和全球化的新冠肺炎疫情作为一个典型的棘手问题。传统的预测或预报努力的目标是现在做出准确的预测,以便在未来实现,但在这种极端不确定的情况下,这种努力可能会产生误导

墨西哥与拉丁美洲国家的相互关系

我从约翰霍普金斯大学新冠肺炎数据库中提取了新冠肺炎每日新增病例和拉丁美洲死亡病例。我使用线性回归来分别检验墨西哥和拉丁美洲国家之间的相关性。相关性最强的国家是巴西。

墨西哥和巴西之间的数据关系(Diego Hurtado)

有趣的是,这两个国家都由一个左翼国家执政。

顺便说一句:我正在寻找新的工作机会!📊

我正在寻找一个机会,在那里我可以把这些能力投入到我热爱的任务中去!

“当有人问你是否能胜任某项工作时,告诉他们,‘我当然能!那就忙起来,搞清楚怎么做。”—西奥多·罗斯福。

坐在办公桌前的金毛猎犬贝利(knowyourmeme,2022)

****领英:https://www.linkedin.com/in/diego-gustavo-hurtado-olivares/

理学硕士。迭戈·乌尔塔多
商业分析顾问

强占

流行病学家和健康经济学家 Eric Feigl-Ding 将墨西哥的冠状病毒阳性病例与纽约、马德里和伦巴第等城市的病例进行了比较,并警告说,墨西哥将经历的新冠肺炎检测阳性百分比是前所未有的。

这是因为半数以上的检测对病毒呈阳性。

德雷克丁。(2020 年 6 月 21 日)

“我为墨西哥哭泣。超过 50%是阳性的百分比,超过一半的测试者是阳性的,”这位科学家在推特上谈到冠状病毒病例时说。

德雷克丁。(2020 年 6 月 21 日)

墨西哥人均病例和死亡率与美国的对比。在墨西哥很明显诊断不足,治疗也很差。56%的阳性率反映了这一点。所以是的,该死的,我们需要更多的测试。

催单

1918 年的疫情流感是近年来最严重的疫情。它是由带有禽类基因的 H1N1 病毒引起的。尽管对病毒的起源没有普遍的共识,但它在 1918-1919 年间在世界范围内传播。

全世界死亡人数估计至少为 5000 万,其中约 675,000 例发生在美国。

5 岁以下、20-40 岁和 65 岁及以上人群的死亡率较高。健康人群的高死亡率,包括 20-40 岁年龄组的人群,是疫情的一个独特特征。

流感疫情图表(Reeve 003143),国家健康和医学博物馆

我们到了。

流感疫情图表(Reeve 003143),国家健康和医学博物馆

结论:

本文详细分析了新冠肺炎是如何影响墨西哥的,以及由此得出的见解如何用于下游分析。这些图表还可以应用于其他场景,以推断关键的数据洞察力。

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

参考

[1]徐,郑,石,李,王,杨,张,黄,李,张,陈,… &泰,杨(2020).急性呼吸窘迫综合征相关新冠肺炎的病理表现。柳叶刀呼吸内科8 (4),420–422。

[2]加西亚-加西亚 G,阿比莱斯-戈麦斯 R,卢坎-阿雷利亚诺 VH,等.墨西哥人口中的心血管危险因素。任不倒。2006;28(8):677–687.土井:10.108008886861

[3]m .卡斯塞拉、m .拉杰尼克、m .科莫、a .杜勒博恩、S. C .、r .迪那不勒斯(2020 年)。冠状病毒的特征、评估和治疗(新冠肺炎)。在 Statpearls【互联网】。StatPearls 出版社。

[4]世界卫生组织。(2020).冠状病毒疾病 2019(新冠肺炎):情况报告,72。

[5]“世界上最大的贫民窟:达拉维、基贝拉、卡耶利沙&内扎。”人类家园 GB ,2018 年 9 月 7 日,www . habitatforhumanity . org . uk/blog/2017/12/the-worlds-larvi-kibera-khayelitsha-neza/。

[6]“拥有世界上最大贫民窟的 8 个城市。”美国新闻&世界报道,美国新闻&世界报道,www . us News . com/News/cities/articles/2019-09-04/the-worlds-largest-贫民窟。

[7]墨西哥。(未注明)。从 https://ddi.sutd.edu.sg/portfolio/items/448588取回

[8]美国和欧洲 1918-1919 年流感死亡率图表|奥的斯历史档案国家健康和医学博物馆(http://www . Flickr . com/photos/medical Museum/5857153474/in/set-72157614214049255),由 CC-BY-NC-SA(http://creativecommons.org/licenses/by-nc-sa/2.0/uk/)授权

[9]德雷克丁。(2020 年 6 月 21 日)。神圣的 moly-我为墨西哥哭泣。https://twitter.com/DrEricDing/status/1274816278197342209

[10] 坐在办公桌前的金毛猎犬贝利的原始照片。了解你的记忆。https://knowyourmeme . com/photos/1330845-我不知道我在做什么

新冠肺炎与国家卫生保健质量

原文:https://towardsdatascience.com/covid-19-and-health-care-quality-in-countries-be3855c2521f?source=collection_archive---------37-----------------------

一种无监督的 K-means 算法,用于根据不同的医疗质量、进行的新冠肺炎检测数量和确诊的新冠肺炎病例数量对国家进行分组

编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家,这篇文章的观点不应被解释为专业建议。

在本帖中,我们尝试使用 K-means 根据卫生保健质量对不同国家进行分组,如基本卫生条件、营养不良的患病率、人均卫生保健支出、医生密度、新冠肺炎确诊病例、为新冠肺炎进行的测试数量等。

我使用了来自 Kaggle 的数据,Kaggle 由来自约翰·霍普金斯大学、哈佛大学、世卫组织大学和许多其他机构的新冠肺炎相关数据集组成。

我使用了三个数据集

  • inform-COVID-indicators.csv:该文件包含不同国家的健康指标,如人口密度、使用基本卫生服务的人口、营养不良的患病率、当前人均医疗支出、获得医疗保健的机会、医生密度、城市人口、孕产妇死亡率等。,
  • total-新冠肺炎-检测-按国家执行. csv ":国家执行的新冠肺炎检测次数
  • 约翰斯-霍普金斯-新冠肺炎-每日仪表板-病例。csv:包含该国新冠肺炎确诊病例、死亡、康复病例和活跃病例的数量

加入了三个基于国家的数据集,我必须清理一些数据以匹配所有三个数据集中的国家名称。

使用 K-means 无监督学习根据健康指标、执行的测试和新冠肺炎病例特征对国家进行分组。

K-means 聚类算法将使用最佳的可能特征,对具有相同健康指标、人口密度等的相似国家进行分组。一起。

k-均值聚类是一种

  • 一种无监督的机器学习算法
  • 一种迭代算法
  • 在给定的未标记数据集中寻找组
  • 它有助于将相似的数据点归类成一个簇。
  • 除了有助于数据点聚类的输入特征外,不需要预先分类

为了选择正确的聚类数,使用了肘形法。

肘方法针对不同数量的聚类运行 K-means 算法,并找到每个数据点到聚类质心的平方距离之和,也称为类内平方和

K-Means 算法根据卫生保健质量、检测次数、确诊病例、死亡和康复病例将国家分为五个不同的组。

*# Fitting K-Means to the dataset*
**kmeans = KMeans(n_clusters = 5, init = 'k-means++', random_state = 42)
y_kmeans = kmeans.fit_predict(data_k)***#beginning of  the cluster numbering with 1 instead of 0*
**y_kmeans1=y_kmeans
y_kmeans1=y_kmeans+1***# New Dataframe called cluster*
**cluster = pd.DataFrame(y_kmeans1)**# Adding cluster to the Dataset
**data_k['cluster'] = cluster**#Mean of clusters
**kmeans_mean_cluster = pd.DataFrame(round(data_k.groupby('cluster').mean(),1))
kmeans_mean_cluster**

按 K 均值聚类的国家

按 K 均值聚类的国家

聚集在不同集团中的国家

根据卫生保健条件、进行的新冠肺炎检测和新冠肺炎病例数,将国家分为 5 组

国家的分类详细信息

第一组:印度、丹麦、加拿大、厄瓜多、巴西、南非等国家。

代表以下国家

  • 低数量的测试,
  • 确诊病例较少,
  • 死亡人数最少
  • 高人口密度
  • 营养不良率更高,基本卫生条件差

第二组:德意

代表以下国家

  • 执行的最高测试次数
  • 活动案例的最高数量
  • 大量的死亡
  • 最高人口密度
  • 更好的保健条件

第 3 组:中国、法国、伊朗、西班牙和英国
代表

  • 执行的最高测试次数
  • 相对较高数量的有效案例
  • 相对较高的死亡人数
  • 相对较高的人口密度
  • 更好的保健条件

第 4 组:澳大利亚、俄罗斯、阿联酋
代表国家

  • 执行的高测试次数
  • 活动案例的最少数量
  • 最低的死亡人数
  • 相对较低的人口密度
  • 良好的保健条件
  • 第 5 组:美国
    代表
  • 执行的高测试次数
  • 最高数量的确诊病例
  • 最高的死亡人数
  • 最低人口密度
  • 最佳保健条件

在世界地图上绘制族群

基于数据集中有限的数据点,希望了解哪些特征会影响新冠肺炎的死亡率。使用互信息分析特征重要性。

# considered heath indicators and test perfomed to understand the impact on confirmed COVID-19 cases
**names = ['total_covid_19_tests',  
       'inform_risk', 
       'inform_p2p_hazard_and_exposure_dimension',
       'population_density', 
       'population_living_in_urban_areas',    'proportion_of_population_with_basic_handwashing_facilities_on_premises',
       'people_using_at_least_basic_sanitation_services',
       'inform_vulnerability', 
       'inform_health_conditions',
       'inform_epidemic_vulnerability', 
       'mortality_rate_under_5',
       'prevalence_of_undernourishment',       
       'inform_lack_of_coping_capacity',
       'inform_access_to_healthcare',   
       'current_health_expenditure_per_capita',
       'maternal_mortality_ratio', 
       'cluster']****from sklearn.feature_selection import mutual_info_regression, mutual_info_classif
from sklearn.feature_selection import SelectKBest, SelectPercentile
mi = mutual_info_regression(data_k[names], data_k['deaths'] )
mi = pd.Series(mi)
mi.index = names
mi.sort_values(ascending=False)
mi.sort_values(ascending=False).plot.bar(figsize=(10, 4))
plt.title(" Factor impacting COVID-19 deaths")**

用于分析的数据最后一次更新是在 2020 年 4 月 11 日,美国中部时间上午 10 点,代码可在 Kaggle 获得

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

新冠肺炎和干预——简单解释

原文:https://towardsdatascience.com/covid-19-and-interventions-simple-explanation-fd7d5b89e20d?source=collection_archive---------81-----------------------

本文由哥伦比亚大学的阿迪蒂·加格、伊莎·古普塔、尼拉杰·拉姆库马尔、赛·瓦伦·查拉和萨希尔·楚塔尼撰写。

这篇文章给读者提供了 3 样东西:

  1. 根据 SIR 模型 对新冠肺炎价差的简单解释
  2. 对模型的修改和干预措施的影响
  3. Live Tableau 仪表盘和交互式展平曲线便于理解

特别感谢教授。丹尼尔·盖塔来自哥伦比亚大学,他意识到了这个话题的重要性,于是上了额外的课来教授我们同样的内容。在这里,我们分享我们知道的一切,我们都需要了解新冠肺炎!

本文通过可视化冠状病毒的传播、实施的干预措施的影响以及对改进的 SIR 模型的模拟来解释新冠肺炎。

现在,整个地球已经被封锁了将近两个月了!感觉如何?随着疫情的进程在全球移动,我们正在学习生活在这种新常态中。增长不应该停止,相反,它应该是一个更加集体和协作的努力,以掩盖积压。随着新发现的揭露、新爱好的发现和新技能的掌握,我们哥伦比亚大学的学生更深入地研究了已发表的关于新冠肺炎的文献,以探索和预测干预对病毒传播的影响。

根据我们对这篇文章的研究,我们创建并整理了一些有趣的资源,让你们以最简单的方式理解冠状病毒背后的数学原理!

图片来自 Pixabay米洛丝拉娃·克里斯诺娃

从人类生活到全球经济,一切都受到冠状病毒的影响(新冠肺炎)。它起源于 2019 年的中国武汉市,几乎没有一个国家没有它。(是的!一些国家很幸运,如汤加、帕劳共和国(截至 2020 年 4 月 26 日)。虽然整个世界被这种病毒所分隔,但这种病毒也把我们紧密地联系在一起。伟大的流行病学家、研究人员和科学家正在努力寻找解决方案。每个国家都选择了自己的方式来对抗致命的冠状病毒。无论是韩国的早期检测和接触者追踪,新西兰和印度的全国封锁,还是意大利的未受控制的传播——每一个撞击事件都有值得借鉴的地方。更深入一点,了解差异,并通过交互式图表可视化影响是令人兴奋的。参考最近发表的一些惊人的研究论文,我们试图通过任何人都可以玩的图表来解释 COVID 传播、干预的影响以及它们对治疗个体的影响。

基本 SIR 型号

SIR 模型是理解新冠肺炎对全球影响的最简单和最常用的模型之一。它把人口分成三个主要部分——

易感(还没有被感染的那部分人群)

受感染的(人口中受感染的部分)

康复的(康复或死亡的那部分人口)

根据病毒的传播速度和人口的恢复速度,人们以不同的速度从一个隔间移动到另一个隔间。这些比率还受到该国疫情的总体性质、所采取的干预措施以及这些干预措施的成功率的影响。

作者对罗纳德·罗斯爵士的爵士模型进行了注释

让我们解释一下这些著名的变量,它们被用来计算从一个车厢移动到另一个车厢的人数。

作者对罗纳德·罗斯爵士的爵士模型进行了注释

然后,可以使用这些简单的等式来评估人的运动:

SIR 模型方程

由罗纳德·罗斯爵士在爵士模型上的作者注释

很明显,从易受感染的移动到受感染的隔间的人数与β成正比,从受感染的移动到恢复的隔间的人数与γ成正比。

这让我们理解了主要干预的影响—

1.国家封锁和

2.早期发现,

减轻现成冠状病毒的影响。

干预如何影响这些运动?

作者图片

贝塔效应: 国家封锁减少了单个人类接触的平均人数。因此,导致接触率的降低。因此,单个感染者接触的平均人数也减少了。因此, 国家封锁或社会距离减少了β,即从易感人群转移到受感染人群的人数。

伽玛效应: 早期检测确保尽早检测出每一个疑似阳性病例。一旦一个人被检测为阳性,她/他就进入 100%的自我隔离状态,因此不能再感染任何其他人。由于 SIR 模型使用 I(感染病例数)作为“传染性”病例数,因此此人不再具有传染性,可以假定他已被转移到恢复室——最终要么恢复,要么死亡。因此, 早期检测增加了γ,即从受感染区室移动到恢复区室的人数。(基本上,小雅和小雅的人都在传播病毒)

让我们引入另一个重要参数 r0,它是描述传染病爆发强度的再生数。因此,R_t 是描述在时间 t 时人口中传染病强度的再生数。显然,它只不过是β和γ的比率,因此受到干预本身的影响。阻止传播的干预力度越大,人口的 R_t 下降得越快。

这是我们为你制作的一个互动图表的视频,用来检查如何改变β和γ,使曲线变平。

β、γ和δ对曲线展平的影响

请随意查看下面网站上的这张图!

**[## 破折号

编辑描述

dash-app-ba.herokuapp.com](https://dash-app-ba.herokuapp.com/)**

为什么展平曲线如此重要

正如我们在图中看到的,描绘“受感染”人员的曲线峰值越大,医院对病床和呼吸机的需求就越大。由于没有国家对这种程度的疫情做好准备,有限的资源是最大的担忧,特别是在像纽约、新泽西这样疫情最严重的地方。因此,在疫苗或真正的治疗方法被发现或发明之前,使曲线变平是控制死亡人数最简单的方法之一。

来源:健康方面

改装型号

正如我们所料,被感染的区域并不像听起来那样同质。这个 SIR 模型有几个版本,增加了各种不同假设的区间。我们的分析是通过添加两个独立的隔间进行的——暴露和死亡。最重要的是,受感染的部分根据严重程度分为 4 个部分——无症状、轻微、严重和危急。

作者图片

添加相应的移动速率后,看起来是这样的:

因此,根据疫情的强度,一部分易感人群会受到感染。暴露人群要么进入无症状状态,要么进入轻度状态,然后要么进入恢复状态,要么进入重度状态,如此等等。最终,来自危险舱人要么进入恢复舱,要么不幸进入死亡舱。

模拟

作者图片

在最近发表的大量研究论文中,参数参考了其中一个来源,引用如下。为了预测社交距离的影响,beta 来自新西兰的 COVID 数据集。同样,为了预测早期探测的影响,伽马射线是从韩国的 COVID 数据集得出的。

模拟结构|作者图片

这个最终的参数集与纽约州的 COVID 数据集一起用于绘制纽约的曲线。

纽约的模拟结果

请随意查看我们为你们制作的以下资源

注意:这个项目包括阅读大量的文献,不断更新每天发布的新研究,以及探索每小时发布的新数据集。我们探讨了更多领域,如新冠肺炎对经济的影响,特别是供应链、就业、医疗保健行业和人们的情绪。虽然这些主题在未来的探索中非常令人兴奋,但截至 2020 年 4 月,它们并没有提供可靠的资源。最受欢迎和最可靠资源的数据集最近一次更新是在一月份。我们通过用新研究中发布的影响参数外推供应链或就业的旧数据集进行了试验,但由于新冠肺炎极其动态和不稳定的局势,我们正在等待更可靠的数据集发布,而不是基于几个假设做出一个数据集。研究这个主题是令人兴奋的,虽然一个人的研究可能很早就过时了,因为有成千上万的人在流传,我们希望每个人都能够探索这个主题,并在需要的情况下随时寻求我们的帮助。 在这里 我们分享了一份我们进行的所有研究和探索的文献的简明链接列表!这个话题听起来可能有点吓人,但是这个世界需要更多的数据科学家来研究它!一定要联系我们中的任何一个人,以防有需要!

阿迪提伊莎尼拉杰萨希尔,以及瓦润

感谢以下参考资料:

MIDAS 2019 新型冠状病毒库

利用迁移学习进行新冠肺炎和肺炎检测

原文:https://towardsdatascience.com/covid-19-and-pneumonia-detection-with-transfer-learning-400a8150268?source=collection_archive---------33-----------------------

用于新冠肺炎和肺炎检测的具有网格搜索优化参数的 ResNet50 转移学习

来自 pixabay 的 Img 通过链接

在以前的帖子中,我们为商业问题创建了几个 CNN 网络,从时尚设计,癌症检测,到动物检测等等。在本帖中,我们将重温 CNN 的话题。但是,我们将使用迁移学习,并在著名的 CNN 架构 ResNet50 上构建网络,而不是从头开始创建模型。

"如果说我看得更远,那是因为我站在巨人的肩膀上."艾萨克·牛顿在 1675 年

像平常一样,拆分成如下:

  1. 背景&问题
  2. ResNet 概述
  3. 数据审核
  4. 列车型号
  5. 外卖

让我们开始旅程吧🏃‍♀️🏃‍♂️!

1。背景&问题

人工智能和人工智能已经彻底改变了医疗保健和医药行业。根据发表在《自然》杂志上的一项研究,在从乳房 x 光片中诊断乳腺癌方面,人工智能比医生更准确。最近,来自谷歌健康和伦敦帝国理工学院的研究人员根据近 29000 名女性的 x 光图像训练了一个模型。该算法在阅读乳房 x 光片方面胜过六名放射科医生👏👏。

在这里,我们的目标是自动检测和分类胸部疾病的过程,并减少检测的成本和时间。

2。ResNet 概述

ResNet50 是何等人在他们 2015 年的论文图像识别的深度残差学习中介绍的一种 50 层深度残差网络。它以剩余学习为基础,与 ResNet101 和 ResNet152 等公司使用的架构相同。

那么,什么是剩余学习呢?通常,在创建神经网络时,“越深越好”。随着图层越来越多,网络往往会学习到更多具有更好的泛化能力的要素。然而,这是有限度的。随着模型的深入,神经网络的训练变得困难,模型性能开始饱和甚至下降。这主要是由臭名昭著的消失梯度问题造成的。当梯度反向传播到更早的层时,导数的重复乘法使得梯度无限小,这使得不可能更新更早的层的权重。剩余学习是解决这一问题的突破口之一。

与学习输入图像特征的 CNN 相反,残差学习学习“残差”(这不是很明显吗?🤭🤭).好吧,如果不是,残差可以理解为从输入图像中减去特征。ResNet 通过引入所谓的“标识快捷连接来实现这一点,它跳过了一个或多个中间层。换句话说,如图 1 所示,早期层的输出被提供给更深的层,而没有任何转换

图 1 剩余框图(图片由作者提供)

使用捷径连接,期望的映射是 F(X) + X 。所以,残差块只需要专注于残差学习 F(X) ,因为它至少可以通过强制 F(X) 为零来学习 X。跳过连接背后的直觉是,它比任何其他直接映射更容易学习残差。这驱使更深层去学习不同于输入已经编码的东西。同时,它允许训练非常深的网络,而不用担心退化问题。

ResNet 架构包含两种剩余块:身份块和conv 块。图 2 示出了身份块。主分支有一个卷积层,后面是批量归一化和一个激活层,通常使用 ReLu 。在这之后,另一个单位的卷积层,批量标准化和激活层。然后,我们添加第三卷积层和批量标准化。激活前,批量定额的输出与原始输入相加。当输入 X 的形状与主分支的输出相同时,恒等块工作良好。

图 2 身份框图(图片由作者提供)

第二种类型是 Conv 块,如图 3 所示。唯一的区别是在快捷路径中添加了卷积层和批量归一化,以匹配主分支的输出形状。

图 3 Conv 框图(图片由作者提供)

总之,ResNet50 架构包括 4 个 Conv 块和 12 个身份块,以及 1 个正常卷积层和 1 个密集层。

3。数据回顾

每一类给我们 133 张图片:健康的;新冠肺炎;细菌性肺炎;病毒性肺炎。图像保存在本地驱动器中,所以我们将使用 Keras 的 flow_from_directory() 方法来读取图像。具体来说,

image_generator = ImageDataGenerator(rescale = 1./255, validation_split= 0.2)train_gen = image_generator.flow_from_directory(batch_size = 8,directory= train_data_dir,shuffle = True,target_size = (256, 256), class_mode = ‘categorical’,subset= ‘training’)validation_gen = image_generator.flow_from_directory(batch_size = 8,directory= train_data_dir,shuffle = True,target_size = (256, 256),class_mode = ‘categorical’, subset= ‘validation’)

让我们来接触一下各个班级的形象。图 4 显示了灰度图像。像我这样的人一点也看不出他们的区别😭😭。但是不用担心😎😎!这是模特的工作。

图 4 数据样本图像

4。列车型号

如前所述,我们将从预先训练的 ResNet50 模型进行迁移学习。它是在 ImageNet 数据集上训练的,该数据集包含 1100 万张图像和 11000 个类别,与我们在这里获得的数据集相比是巨大的。

4.1 负载模型

首先,让我们加载模型,并指定如何根据我们的目的使用它。

basemodel = ResNet50(weights = ‘imagenet’, include_top = False, input_tensor = Input(shape = (256, 256, 3)))

注意,我们没有包括顶级分类层,因为我们将创建自己的分类器头。我们将输入张量形状定义为与图像生成器中的相同。

一般来说,迁移学习有不同的策略。如果预训练数据集和新数据集相似,并且数据集很小,我们可以冻结早期的层并训练其余的层。如果您的任务是处理大型数据集,您可能需要使用预训练模型中初始化的权重来重新训练整个模型。

在我们的例子中,我们的数据集非常小,允许我们冻结早期的层。所以,

for layer in basemodel.layers[: -10]:
    layer.trainable = False

4.2 创建和训练模型

我认为这一节是有趣的部分,因为你将看到如何“站在巨人的肩膀上”。

仔细看下面的建筑。我们将 ResNet50 模型输出作为其后续层的输入。在为输出添加最后一个密集层之前,我们堆叠了 3 个带有 dropout 的密集层。

包括神经元数量和辍学率在内的参数在网格搜索中进行了实验,以显示最佳结果,尽管这里没有详细说明。

另请注意,我们使用两个指标来评估培训:F1 得分和准确性。根据我的大量实验,该模型在某种程度上倾向于将细菌性肺炎错误分类。因此,使用 F1 分数将使我们有一个平衡的模型性能。

headmodel = basemodel.output
headmodel = AveragePooling2D(pool_size = (4,4))(headmodel)
headmodel = Flatten(name= ‘flatten’)(headmodel)
headmodel = Dense(256, activation = “relu”)(headmodel)
headmodel = Dropout(0.4)(headmodel)
headmodel = Dense(128, activation = “relu”)(headmodel)
headmodel = Dropout(0.4)(headmodel)
headmodel = Dense(64, activation = “relu”)(headmodel)
headmodel = Dropout(0.4)(headmodel)
headmodel = Dense(4, activation = ‘softmax’)(headmodel)model = Model(inputs = basemodel.input, outputs = headmodel)model.compile(loss = ‘categorical_crossentropy’,optimizer = optimizers.RMSprop(lr = 1e-4, decay = 1e-6),metrics = [f1, ‘accuracy’])

此外,我们使用早期停止来监控进度,并使用检查点来保存权重文件。

earlystopping = EarlyStopping(monitor = ‘val_loss’, mode = ‘min’, patience = 10)
checkpointer = ModelCheckpoint(filepath = ‘weights.hdfs’, verbose = 1, save_best_only=True)

太好了。时段数(20)和批次大小(8)经过优化,可产生最佳结果。为了训练这个模型,

history = model.fit_generator(
train_generator, steps_per_epoch= train_generator.n//8, 
epochs = 20, validation_data= val_generator, 
validation_steps= val_generator.n//8, callbacks=[checkpointer, earlystopping])

4.3 评估模型

图 5 示出了模型精度逐渐增加到大约 0.75,并且损失减少到大约 0.65。还有一点就是训练过程是稳定的,没有突兀的波峰或波谷。

图 5 训练过程中的模型损失和精度曲线

图 6 显示了验证过程中的模型精度。该模型达到了大约 0.65 到 0.7 的验证精度,表明轻微的过度拟合。

图 6 验证期间的模型精度曲线

最后,让我们看看测试数据集上的模型性能。

evaluate=model.evaluate_generator(test_generator,steps=test_generator.n//4, verbose = 1)

图 7 示出了 15 幅图像的预测和实际类别。该模型对新冠肺炎的预测非常准确。如图 8 所示的分类报告表明,对于✨✨.,该模型对新冠肺炎的召回率为 100%这意味着在 10 幅新冠肺炎图像中,它成功地全部预测正确。对于肺炎,回忆并不理想,大约有 50%到 60%的预测正确。当然,这种模式还有改进的空间。

图 7 标有实际和预测类别的模型预测

图 8 模型分类报告

5。外卖

我们演示了如何使用迁移学习来创建新冠肺炎/肺炎预测的定制模型。只有大约 500 张图像,我们设法取得了不错的结果,特别是在新冠肺炎检测上。

接下来有趣的是,如果你想弄脏你的手,只在正常和新冠肺炎图像上改装模型。创造一个新冠肺炎探测模型将是一件美妙的小事,我们可以为对抗它做出贡献。

太好了!这是所有的旅程。希望你喜欢它。如果你需要代码,请访问我的 Github repos 💕💕。

新冠肺炎和数据隐私的未来

原文:https://towardsdatascience.com/covid-19-and-the-future-of-data-privacy-54c49f64387c?source=collection_archive---------47-----------------------

新冠肺炎·疫情正在证明数据对于有效应对紧急情况有多么有用,但这会对隐私产生影响吗?

3 月 28 日的西班牙官方公报(BOE 官方日报)3 月 28 日证实:西班牙政府已经委托数字化和人工智能国务秘书(SEDIA)紧急开发一种计算机应用程序,以支持对新冠肺炎病毒引起的健康危机的管理。

该应用程序的功能之一是可以对用户进行地理定位,以验证所声明的位置。由此,一场辩论开始了:像目前这样的紧急情况应该优先于公民数据的隐私权吗?

与中国监控模式的比较很快。无论是从措施的有效性来看,还是从剥夺公民自由和隐私的角度来看。其他一些国家,比如美国,以前也在敏感的国家安全争论下使用过监控和数据挖掘,比如反恐战争、将欧洲和美国的自由和隐私进行比较。像中国这样的模式在欧洲可翻译吗?在什么条件下?

欧洲数据保护委员会(EDPB)几天前已经在讨论这个话题。在题为“关于在新冠肺炎疫情背景下处理个人数据”的声明中,该机构已经承认“ GDPR (一般数据保护条例)提供了法律依据,使雇主和主管公共卫生当局能够在流行病背景下处理个人数据,而无需获得数据主体的同意”也就是说,GDPR 允许当局和雇主在流行病背景下处理个人数据,而无需主体的明确同意。该声明指出,使用与数字通信相关的数据,如移动设备的位置,只能在内容匿名的情况下使用,尽管为各州在不可能的情况下立法打开了大门并且总是受到与公共健康或安全相关的措施的限制。

西班牙数据保护局(AEPD) 也就此事发表讲话,称“数据保护不应该被用来阻碍或限制当局特别是卫生当局所采取的措施的有效性。”

一系列西班牙律师、研究人员、学者和其他专家对此问题表示关注,并在几天前向政府发出了一封信,信中他们倡导对公民数据进行合法、道德和透明的管理。

论文的作者首先强调了技术和数据使用在缓解这种紧急情况中可以发挥的相关作用,但他们警告了两个主要风险:

  1. 有些公司或个人可能会试图利用公众利益之外的数据(想象一下,如果在公共政府协议下发生类似剑桥分析公司丑闻的事情,利用苹果和谷歌的合作关系来帮助追踪使用他们手机操作系统的新冠肺炎)。
  2. 危机之外,侵犯公民隐私可能成为常态。

简而言之,技术,特别是应用于大数据和人工智能的技术,必须为人类和社会服务。为此,关键机制将是透明度及其道德使用,包括诸如偏见控制或身份保护等主题。

毫无疑问,保护我们的私人数据是一项基本权利,在这种时候,一个社会必须在这项权利和公共利益之间找到艰难的平衡。欧洲被认为在保护数据隐私方面处于领先地位,特别是在 GDPR (2018)以来的技术使用方面。然而,正如专家在上述信件中警告我们的那样,我们如何管理这场健康危机不仅会影响我们的健康或经济,而且可能还会影响政府通过使用技术能够行使的控制程度。

非常情况需要非常措施,但是,正如《EDPB 宣言》本身所表明的那样,总是在民主社会的必要和相称的条件下。

本文为原文翻译,发表于 everis 博客:https://blog . everis . com/es/blog/tecnolog % C3 %阿达/新冠肺炎-y-privacidad-de-datos

如果你喜欢阅读这篇文章,请 考虑成为会员 以便在支持我和媒体上的其他作者的同时,获得每个故事的全部信息。

如何创建一个酒吧比赛图表使用蓬勃发展的应用程序

原文:https://towardsdatascience.com/covid-19-bar-race-chart-using-flourish-89136de75db3?source=collection_archive---------50-----------------------

利用新冠肺炎数据制作条形图的简易无代码方法

竞赛条形图是一个非常简单的工具,可以用来比较随时间变化的数量。简单来说,它是一个包含时间轴的条形图。

在本文中,我将解释如何准备一个新冠肺炎可视化使用蓬勃发展的应用程序。最终产品如下所示:

第一步:在蓬勃发展应用上注册

注册“蓬勃发展”是非常简单的程序一样,注册任何其他服务。
Tableau 一样,fluore 有免费和付费两个版本,免费版本的坏处,就和 Tableau 或者 GitHub 免费版本的情况一样,就是数据需要公开。如果你有高度敏感的信息,考虑注册付费版本。
格式的文件 excelcsv 格式的文件可以上传到蓬勃发展。
注意,制作酒吧比赛图时,列标题应为时间(日期、年份、回合等。)
除了条标签之外,类别图像也可以并入到 fluore 中,这是可选的。
如果类别可用,则可以根据类别进行条形着色。
用于添加图像(国旗/球员图像、俱乐部徽章等。),需要提供图片网址。
报名蓬勃(非附属链接)。

步骤 2:数据收集

所有国家的新冠肺炎每日统计数据可在约翰·霍普斯金大学 Github repo 获得。
我们对回购中可用的每日全球时间序列数据感兴趣,如下所示。

数据来自约翰·霍普斯金大学 Repo(图片由作者提供)

第三步:数据预处理

来自 JHU 的数据有时间作为 blower 所需的列标题。但是,请注意,还有类似于 LatLong 的列,它们不是必需的。
此外,对于某些国家/地区,数据是基于省/州进行分离的,需要基于国家/地区进行汇总。
因此,需要对数据进行预处理以实现繁荣。
此外,图像 URL (国旗 URL)和地区名称也在预处理过程中被添加。

GitHub Gist 预处理

查看下面我的 Kaggle 笔记本中的另一个例子:

[## FPL 最佳射手:繁荣的比赛图表

使用 Kaggle 笔记本探索和运行机器学习代码|使用来自 Fantasy Premier League 21 Full Player 的数据…

www.kaggle.com](https://www.kaggle.com/abhijithchandradas/fpl-top-scorers-flourish-race-chart)

第四步:在花体中准备视觉化

登录蓬勃发展应用程序,点击“新可视化”。
它将带你进入所有可用模板的列表(他们有一个非常容易使用的数据可视化模板的详尽集合)。
向下滚动并点击“条形图比赛”。它将显示一个带有一些虚拟数据的示例条形图。
点击可视化左上角的数据,查看当前可视化使用的数据。
要上传数据,点击上传数据,选择要上传的文件,点击确定
将模式改为预览。瞧吧!你的视觉化准备好了!

步骤 5:自定义图表

条形图有许多方面可以定制,如条形的数量、条形的颜色、图表的布局、时间线的长度等。
这些选项在可视化右侧可用。

步骤 6:发布可视化

一旦您对可视化感到满意,只需点击导出并发布即可发布。你也可以获得嵌入链接,它可以用来在你的网站中嵌入可视化。

来自蓬勃发展应用程序的 Covid 比赛图表

Net net,这很简单!fluore 不仅仅是唯一一个可以用来制作比赛图表的应用程序,它也是我见过的最简单的一个。
Race 条形图可以用 python 或 r 编写,这涉及到大量的编码。在 Tableau 中,还可以准备比赛图表,在我看来,这对于初学者来说是非常困难的。如果你有合适格式的 excel/csv 文件,用它来制作比赛图表简直是小菜一碟。

如果你对视觉教程感兴趣,你可以看看这个 YouTube 视频,我在里面解释了如何制作比赛图表。

资源

所有代码和资源都可以在这个 GitHub repo 中访问。

成为会员

我希望你喜欢这篇文章,我强烈推荐 注册中级会员 来阅读更多我写的文章或成千上万其他作者写的各种主题的故事。
你的会员费直接支持我和你看的其他作家。你也可以在媒体上看到所有的故事。

这里有一些我写的其他故事,你可能会觉得有趣。

干杯!

[## 如何使用值从 Python 字典中提取键

从 python 字典给定值中提取键的四种方法

towardsdatascience.com](/how-to-extract-key-from-python-dictionary-using-value-2b2f8dd2a995) [## 如何在 Matplotlib/ Seaborn 中向散点图添加文本标签

使用 Seaborn 或 Matplotlib 库时,如何在 python 中向散点图添加文本标签的分步指南。

towardsdatascience.com](/how-to-add-text-labels-to-scatterplot-in-matplotlib-seaborn-ec5df6afed7a)

照片由贾科莫·卡拉Unsplash 上拍摄

新冠肺炎,贝叶斯定理和概率决策。

原文:https://towardsdatascience.com/covid-19-bayes-theorem-and-taking-data-driven-decisions-part-1-b61e2c2b3bea?source=collection_archive---------49-----------------------

来源: geralt ,via Pixabay 许可

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

没有一种测试能百分之百准确地检测出新型冠状病毒!然而,当我们被告知这些测试在检测 COVID 感染方面有 98.5%的准确性时,我们感到满意。但是这种准确性实际上意味着什么呢?

在回答这个问题之前,我们先来复习一些基本概念。

  1. 真阳性:一个人新冠肺炎检测阳性为新冠肺炎
  2. 假阳性:一个人没有新冠肺炎检测阳性为新冠肺炎
  3. 假阴性:一个人新冠肺炎检测阴性为新冠肺炎
  4. 真阴性:一个人没有新冠肺炎检测阴性为新冠肺炎

现在,让我们回顾一下准确度、精密度、灵敏度和特异性的含义。

准确度 =(真阳性+真阴性)/所有结果

精度 =真阳性/(真阳性+假阳性)

灵敏度 =真阳性/(真阳性+假阴性)

特异性 =真阴性/(真阴性+假阳性)

现在假设有 200 个病人。假设 100 名患者被感染,100 名患者未被感染。假设 100 个被感染的患者中有 99 个被检测为阳性,并且 2 个健康的患者也被检测为阳性。也就是说,99 人是真阳性,2 人是假阳性。1 名感染者假阴性,98 名未感染者真阴性。现在我们来计算一下刚刚学的内容。

**Accuracy** = (99 + 98) / 200 = 0.985**Precision** = 99 / (99 + 2) = 0.98**Sensitivity** = 99 / (99 + 1) = 0.99**Specificity** = 98 / (98 + 2) = 0.98

看起来不错,对吧?现在让我们试着了解更多关于特异性的知识。这意味着,在 100 名未感染新冠肺炎病毒的患者中,只有 98 人检测结果呈阴性。所以,假设一个人没有携带病毒,他检测结果为阴性的概率是 0.98。

现在让我们潜得更深!概率,即给定一个人已经有了 covid,测试阳性将由条件概率给出,
【p(+|c⁺)=灵敏度= 0.99。 同样,健康患者检测阴性的概率将为
【p(-|c⁻)=特异性= 0.98。

我们得到了条件概率,但这有什么用呢?现在假设我们从人群中随机挑选一个人并对他进行测试。他检测呈阳性,但他真的感染了新型冠状病毒的概率有多大。换句话说,在这里我们有兴趣找到 P(C⁺|+)

现在根据贝叶斯定理,
P(A | B)= P(A)P(B | A)/(P(A)P(B | A)+P(非 A)P(B |非 A))

因此,如果我们知道 P(C⁺) ,我们可以通过代入上式中的值来轻松计算 P(C⁺|+) 。所以,为了计算p(c⁺】,你可以用你所在国家的病例数除以总人口数。在我的例子中,它小于 0.0001,这是非常罕见的。让我们来计算一下 P(C⁺|+).

p(c⁺|+)——贝叶斯定理在起作用。

0.005!你猜到了吗?我打赌不会!这意味着,即使一个随机的人被检测为阳性,也有不到 0.5%的几率他真的感染了病毒。

现在,让我们说,你生活在一个更容易发生的地区,现在你感染冠状病毒的机会增加了 10 倍。即使这样, P(C⁺|+) = 0.047,也就是说,如果检测结果为阳性,那么你实际被感染的几率小于 5%。

这是所有罕见病的问题。

好了,我们明白了为什么随机测试新冠肺炎是个愚蠢的想法。此外,如果你生活在一个更容易感染病毒的地区,检测结果仍然呈阳性意味着你被感染的几率低于 5%。但是等等,混合测试呢?

假设住在红区的人有新冠肺炎的概率是 0.001 到 0.005。最近有消息称,在新病例开始出现后,武汉正计划对所有 1100 万居民进行检测。根据当前方案,16 次 RT-PCR 检测可检测 40 个样本(最多 3 个阳性)。这可以在 93 个 RT-PCR 测试中测试多达 961 个样本(最多 10 个阳性)。

假设我们收集了 x 个样本,一个人拥有 Covid 的概率为 p。那么,至少一个人拥有 Covid 的概率由下式给出

P =  1 - (1-p)^x 

现在,让我们制定一些规则。我们希望选择 x,这样如果一个 x 样本池被检测为阳性,我们希望至少有一个人患有新冠肺炎的概率大于 90%。我会用 R 作为编程工具。

我们应该选择多少样品进行混合测试

这里, pc 表示 x 个样本中至少一个被感染的概率。
probP(C⁺|+,利用贝叶斯定理计算得出。现在,我们绘制 x(样本数量)对 p(一个人拥有 covid 的概率)。

因此,在调查了一个地方的确诊病例数后,如果我们想测试整个人群的新冠肺炎,我们可以使用这个模型来选择样本数进行混合测试。

因此,这有助于我们采取概率决策来选择样本数量。我选择了 90%的 p 值,这可能会让医生们更有信心。另一方面,增加样本数量会引发其他问题。因此,专家在做出最终决定之前可以调整参数。感谢阅读!

.

新冠肺炎伯特文学搜索引擎

原文:https://towardsdatascience.com/covid-19-bert-literature-search-engine-4d06cdac08bd?source=collection_archive---------28-----------------------

在过去的几周内,研究工作和研究论文的数量在持续增加,以对抗这种冠状新冠肺炎邪恶病毒。组织这些海量的数据现在是最重要的,这是这项工作(代码数据)试图实现的,作为一个 Kaggle 竞赛的一部分,该竞赛试图找到智能的解决方案来组织大量不断增加的研究知识。

我们的方法是嵌入研究论文的段落,嵌入查询,然后运行余弦相似性来获得最相似的段落

我们构建了这个代码以在 google colab 上无缝运行,与 google drive 连接,并使用 kaggle api 将数据直接下载到 google colab,因此没有数据被下载到您的设备,也不需要强大的 GPU,因为所有这些都是通过 google colab 免费完成的,您可以在这里找到处理后的数据和结果嵌入

在本教程中,我们的目标是通过一种使用 BERT 构建搜索引擎的方法,您可以向它提供一个问题( query ),比如

  • 关于医疗保健已经发表了什么?
  • 在实时医疗保健服务中使用人工智能,以人工无法完成的方式评估干预措施、风险因素和结果
  • 动员增援医务人员解决不堪重负的社区的短缺问题。
  • 等问题。

我们的方法是

  1. 提取每篇研究论文的段落(处理过的数据 ) ( 代码段)
  2. 从预训练的 BERT 中获得上下文化嵌入,该 BERT 在自然语言推理(NLI)数据(代码段)上进行了微调
  3. 对查询应用上下文嵌入(代码段
  4. 对段落和查询应用余弦相似度,得到最相似的段落,然后返回这些段落的论文(代码段)

BERT 用于嵌入,然后余弦相似度得到相似段落

伯特是什么?

已经提出了多种语言建模方法,它们可以分为两大类

  • 基于递归的 seq2seq 模型
  • 基于变压器的模型(BERT)

基于递归的 seq2seq 模型

使用LSTM(RNN 的改进),用于编码器解码器架构

编码器使用双向 LSTM 构建,对输入文本进行编码,构建内部编码,

解码器接收生成的内部编码和参考字,解码器还包含 LSTM ,能够一次生成一个字的输出。

你可以在我们的系列中了解更多关于使用基于 seq2seq LSTM 的模型进行文本摘要的方法,在那里我们将详细介绍这些模型是如何构建的。

基于变压器的模型

另一项研究工作试图在不使用递归模型的情况下建立语言模型,以使系统在处理长句时更加强大,因为 LSTM 发现很难表示长序列的数据,因此很难表示长句。

变压器依赖于注意力模型,特别是自我注意力,这是一种神经网络,用于理解如何关注输入句子中的特定单词,变压器也内置于编码器/解码器结构中。

来自 http://jalammar.github.io/illustrated-transformer/

编码器和解码器各自包含一组块,

编码器:包含一个块堆栈,每个块包含(自关注,前馈网络),在这里它接收输入,并以双向方式关注来自输入的所有文本,前一个和下一个单词,然后将其传递给前馈网络,这个结构(块)根据编码器中的块数重复多次

解码器:然后在编码完成后,编码器将这个内部编码传递到解码器步骤,解码器步骤也包含多个块,其中每个块都包含相同的自关注(带有 catch)* 和一个编码器解码器关注,然后是一个前馈网络。自我关注的不同之处在于,它只关注前面的单词,而不是整个句子。因此解码器接收编码器的参考和内部编码(在概念上与 seq2seq 编码器-解码器循环模型的编码器相同)

你可以在 jalammar 的博客中了解更多关于 Transformer 架构的信息

现在伯特来了

结果是,我们不需要整个 Transformer 采用一个可微调的语言模型来完成 NLP 任务,我们可以只使用解码器,就像 OpenAI 提出的一样,然而,由于它使用解码器,模型只训练一个正向模型,而不考虑前面和后面(因此是双向的),这就是为什么引入了 BERT,我们只使用 Transformer 编码器。

BERT 是对原始转换器的修改,它只依赖于编码器结构,我们只使用编码器块来应用双向方式,这看起来很不直观,事实就是如此!!,由于双向条件反射将允许每个单词在多层上下文中间接看到自己(这里有更多关于它的信息),所以 BERT 在训练中使用了使用面具的巧妙方法。

来自 http://jalammar.github.io/illustrated-bert/

在给定大量文本的情况下训练 BERT,对 15%的单词应用掩码,然后训练它预测被掩码的单词。

我们主要使用一个预训练的 BERT 模型,然后使用它作为我们任务的基石,这些任务主要分为两种类型

  1. 任务具体任务(问答,文本摘要,分类,单句标注,……。)
  2. 构建一个语境化的单词嵌入这就是我们今天的目标

所以让我们建立一个语境化的单词嵌入

来自http://jalammar.github.io/illustrated-bert/

实际上有多种方式从 BERT 编码器块(在这个例子中是 12 个块)生成嵌入

来自http://jalammar.github.io/illustrated-bert/

在本教程中,我们将专注于使用预训练的 BERT 构建句子嵌入的任务,我们将简单地将我们的句子传递给预训练的 BERT,以生成我们自己的上下文嵌入。

B-我们的方法:

1.将冠状病毒新冠肺炎的文献数据集分成段落,数据集可以在这里找到在 kaggle 竞赛中,(代码段

处理过的数据集可以在这里找到,读取和处理 json 文件的步骤可以在这里找到,在这里我们将 json 文件转换成 csv,我们使用与 maksimeren 相同的过程

2.对句子进行编码(代码段)

我们使用由 UKPLab 提供的名为句子转换器的库,这个库使得使用 BERT 和其他架构如 ALBERT 和 XLNet 进行句子嵌入变得非常容易,它们还提供了简单的接口来查询和聚集数据。

!pip install -U sentence-transformers

然后,我们将下载预训练的 BERT 模型,该模型根据自然语言推理(NLI)数据进行了微调(代码部分)

**from** **sentence_transformers** **import** SentenceTransformer
**import** **scipy.spatial**
**import** **pickle** **as** **pkl**
embedder = SentenceTransformer('bert-base-nli-mean-tokens')

然后我们将对段落列表进行编码(处理后的数据可以在这里找到)

corpus = df_sentences_list
*corpus_embeddings = embedder.encode(corpus,show_progress_bar=True)*

3.编码查询并运行相似性(代码段)

查询是我们需要找到答案的句子,或者换句话说,在段落数据集中搜索相似的段落,从而找到相似的文献论文

*# Query sentences:*
queries = ['What has been published about medical care?', 'Knowledge of the frequency, manifestations, and course of extrapulmonary manifestations of COVID-19, including, but not limited to, possible cardiomyopathy and cardiac arrest', 'Use of AI in real-time health care delivery to evaluate interventions, risk factors, and outcomes in a way that could not be done manually', 'Resources to support skilled nursing facilities and long term care facilities.', 'Mobilization of surge medical staff to address shortages in overwhelmed communities .', 'Age-adjusted mortality data for Acute Respiratory Distress Syndrome (ARDS) with/without other organ failure – particularly for viral etiologies .']query_embeddings = embedder.encode(queries,show_progress_bar=**True**)

然后,我们将运行嵌入的查询和先前嵌入的段落之间的余弦相似性,并返回 5 个最相似的段落,以及它们的论文的细节

*# Find the closest 5 sentences of the corpus for each query sentence based on cosine similarity*
closest_n = 5
print("**\n**Top 5 most similar sentences in corpus:")
**for** query, query_embedding **in** zip(queries, query_embeddings):
    distances = scipy.spatial.distance.cdist([query_embedding], corpus_embeddings, "cosine")[0]

    results = zip(range(len(distances)), distances)
    results = sorted(results, key=**lambda** x: x[1])

    **for** idx, distance **in** results[0:closest_n]:
        print("Score:   ", "(Score: **%.4f**)" % (1-distance) , "**\n**" )
        print("Paragraph:   ", corpus[idx].strip(), "**\n**" )
        row_dict = df.loc[df.index== corpus[idx]].to_dict()
        print("paper_id:  " , row_dict["paper_id"][corpus[idx]] , "**\n**")
        print("Title:  " , row_dict["title"][corpus[idx]] , "**\n**")
        print("Abstract:  " , row_dict["abstract"][corpus[idx]] , "**\n**")
        print("Abstract_Summary:  " , row_dict["abstract_summary"][corpus[idx]] , "**\n**")

C-结果

=========================================================
==========================Query==========================
=== What has been published about medical care? =========
=========================================================
Score:    (Score: 0.8296)
Paragraph:    how may state authorities require persons to undergo medical treatment
Title:    Chapter 10 Legal Aspects of Biosecurity----------------------------------Score:    (Score: 0.8220) 
Paragraph:    to identify how one health has been used recently in the medical literature
Title:    One Health and Zoonoses: The Evolution of One<br>Health and Incorporation of Zoonoses =========================================================
==========================Query==============================
=== Knowledge of the frequency, manifestations, and course of extrapulmonary manifestations of COVID-19, including, but not limited to, possible cardiomyopathy and cardiac arrest =====
=========================================================Score:    (Score: 0.8139) 
Paragraph:    clinical signs in hcm are explained by leftsided chf complications of arterial thromboembolism ate lv outflow tract obstruction or arrhythmias capable of
Title:    Chapter 150 Cardiomyopathy------------------------------------
Score:    (Score: 0.7966) 
Paragraph:    the term arrhythmogenic cardiomyopathy is a useful expression that refers to recurrent or persistent ventricular or atrial arrhythmias in the setting of a normal echocardiogram the most commonly observed rhythm disturbances are pvcs and ventricular tachycardia vt however atrial rhythm disturbances may be recognized including atrial fibrillation paroxysmal or sustained atrial tachycardia and atrial flutter
Title:    Chapter 150 Cardiomyopathy=========================================================
==========================Query==========================
=== Use of AI in real-time health care delivery to evaluate interventions, risk factors, and outcomes in a way that could not be done manually 
=========================================================
Score:    (Score: 0.8002) 

Paragraph:    conclusion several methods and approaches could be used in the healthcare arena time series is an analytical tool to study diseases and resources management at healthcare institutions the flexibility to follow up and recognize data patterns and provide explanations must not be neglected in studies of healthcare interventions in this study the arima model was introduced without the use of mathematical details or other extensions to the model the investigator or the healthcare organization involved in disease management programs could have great advantages when using analytical methodology in several areas with the ability to perform provisions in many cases despite the analytical possibility by statistical means this approach does not replace investigators common sense and experience in disease interventionsTitle:    Disease management with ARIMA model in time<br>series -------------------------------------------
Score:    (Score: 0.7745) 
Paragraph:    whether the health sector is in fact more skillintensive than all other sectors is an empirical question as is that of whether the incidence of illness and the provision and effectiveness of health care are independent of labour type in a multisectoral model with more than two factors possibly health carespecific and other reallife complexities the foregoing predictions are unlikely to be wholly true nevertheless these effects will still operate in the background and thus give a useful guide to the interpretation of the outcomes of such a modelTitle:    A comparative analysis of some policy options<br>to reduce rationing in the UK's NHS: Lessons from a<br>general equilibrium model incorporating positive<br>health effects

有关完整结果,请参考我们的准则笔记本

D-评论

我们对两者都印象深刻,

  • 简单易用的句子转换器库,这使得应用 BERT 嵌入和提取相似性变得非常容易。
  • 结果的质量给我们留下了深刻的印象,因为 BERT 是建立在表示文本上下文的概念上的,使用它可以得到真正相关的答案
  • 我们相信,通过使用段落本身,而不仅仅是论文的摘要,我们不仅能够返回最相似的论文,而且能够返回论文中最相似的部分。
  • 我们希望通过这一点,我们正在帮助构建一个不断增加的文献研究工作的世界,以对抗这种冠状新冠肺炎病毒。

电子参考文献

  • 我们使用由 UKPLab 提供的名为句子转换器的库,这个库使得使用 BERT 和其他架构如 ALBERT、XLNet 进行句子嵌入变得非常容易,它们还提供了一个简单的接口来查询和聚集数据。
  • 我们使用了来自 maksimeren 的代码进行数据处理,我们真心感谢他。
  • 我们使用了画伯特的概念,在这里讨论 Jay Alammar 在说明我们的建筑如何工作时,我们也参考了他所做的多个插图和解释,他的博客信息量非常大,很容易理解。
  • 我们使用 Conneau 等人在 2017 年讨论的预训练模型,在 InferSent-Paper(从自然语言推理数据中监督学习通用句子表示)中显示,对自然语言推理(NLI)数据的训练可以产生通用句子嵌入。
  • 注意就是你所需要的变压器纸
  • 伯特伯特代码

本教程的代码可以在这里找到这里,代码被构建为在 google colab 上无缝运行,使用其免费使用的 GPU,我们还使用 kaggle API 将数据直接下载到 google colab,因此不需要既在本地运行代码也不需要在本地下载数据集。

我们还提供了所有经过处理的数据集和嵌入的段落(1GB),这些都需要一些时间来嵌入(所以你可以简单地使用它而无需再次运行嵌入),链接这里,这些都托管在 google drive 上,我们已经构建了代码,以无缝连接到 google drive,(了解更多有关连接 google drive 这里)

我们真的相信,通过本教程,您已经对 BERT 有了更多的了解,以及如何方便地使用它,我们也希望通过本教程,我们能够帮助研究界对抗冠状病毒(新冠肺炎)。

希望你们都平安无事。

新冠肺炎聚类分析

原文:https://towardsdatascience.com/covid-19-cluster-analysis-405ebbd10049?source=collection_archive---------14-----------------------

聚集受冠状病毒影响的世界国家

马丁·桑切斯在 Unsplash 上的照片

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

介绍

在过去的两个月里,冠状病毒疾病 2019(新冠肺炎)的新的主要流行病灶已被确定,并在全球迅速传播。到 2020 年 3 月 16 日,中国以外的新冠肺炎病例数量急剧增加,向世界卫生组织(世卫组织)报告感染的受影响国家、州或地区数量众多。

基于“令人震惊的蔓延和严重程度,以及令人震惊的不作为程度”,2020 年 3 月 11 日,世卫组织总干事将新冠肺炎局势描述为疫情[1]。这一事实和冠状病毒的快速传播导致全球许多国家采取严格措施限制公民。

另一方面,来自不同领域的许多科学家试图提供关于这种疫情水平疾病的见解。包括世卫组织和约翰·霍普斯金大学(JHU)在内的许多组织和大学向公众提供了呈现冠状病毒传播的数据和可视化结果[2,3]。JHU 系统科学与工程中心及其研究人员在 Github 中创建了一个数据仓库,提供世界各国关于冠状病毒的时间序列数据。这些数据包括每天确诊的病毒病例总数、死亡人数和从病毒中康复的人数。

本文试图利用聚类技术和可视化技术,对上述 Github 中的数据仓库提供的数据提供见解。

数据分析

首先,数据由三个数据集组成,即确诊病例、死亡病例和痊愈病例。每个数据集由数据集中每个国家从 2020 年 1 月 22 日到 2020 年 4 月 11 日的时间序列组成。每个数据集中还有一些额外的列,包括每个国家的省/州和经纬度坐标。下图提供了在任何预处理之前对其中一个数据集的一瞥。

图 1:任何预处理之前的数据集。

在执行了一些数据预处理之后,我们得到了干净的、准备好进行分析的数据集。此外,源数据是累积的时间序列,这意味着第二天的值是前一天的值加上新的案例。因此,对于该分析,时间序列被转换以表示每天的新情况。

此外,通过执行线性回归,为每个变换的时间序列计算趋势线系数。为了在 95%的显著性水平下获得具有统计显著性的结果,不具有统计显著性趋势(即趋势线系数的 p 值大于 0.05 的α水平)的国家将从分析中剔除。

此外,对相应国家的趋势线系数进行了聚类分析。关于算法部分,对标准化系数使用了 K 均值算法。该算法通过尝试将样本分成等方差的 n 组来对数据进行聚类,从而最小化被称为惯性或类内平方和的标准。使用基于惯性和平均轮廓法【4】的肘法【4】确定聚类数。

这些集群在交互式世界地图中被可视化,以便更好地了解情况。请注意,地图上未着色的国家不在本分析中,因为它们的趋势线系数在统计上不显著,或者没有它们的时间序列数据。图 1、图 3 和图 5 分别显示了基于确诊病例、死亡病例和康复人员的国家分组,而图 2、图 4 和图 6 分别显示了每个分组关于确诊病例、死亡病例和康复人员分组的百分比值的平均趋势系数。将鼠标悬停在图表 1、3、5 上,可以看到国家名称、它们所属的集群以及它们的百分比趋势线系数。此外,在图 2、4、6 中,有聚类名称、趋势平均值和属于该聚类的国家。

确诊病例

图 1:确诊病例的聚类

图 2:每个集群的平均趋势——案例

就对这些病例群的解读而言,美国的确诊病例似乎每天都在大幅增加。另一方面,第三组国家,即法国、德国、意大利和西班牙每天都有小幅增长。最后,土耳其,伊朗和英国描绘了大约一半的集群 3 的增量。这组国家中的所有其他国家显示出稳定的低增长。

确认死亡

图 3:确诊死亡病例的聚类

图 4:每组死亡人数的平均趋势

关于死亡数据集中的聚类,很明显,美国和意大利比其他国家具有最高的增长趋势。在第五组中,紧随其后的是西班牙和法国,其趋势略低于美国和意大利。第三组包括联合王国,第四组包括德国、伊朗、比利时和荷兰。这组国家中的所有其他国家都略有增加。

确认恢复

图 5:已确认恢复的集群

图 6:每个集群的平均趋势—已恢复

下面,关于从冠状病毒中康复的人的趋势的聚类可以在上面看到。包括德国和西班牙在内的第 3 组显示了最高的每日增量。第二组排在第二,包括伊朗和中国。增量等级中的第三组是组 5,包括法国、意大利和美国,其百分比增量值大约是第一组 3 的一半。此外,聚类 4 包括诸如奥地利、韩国、比利时、加拿大和瑞士之类的国家,聚类 5 包括集合中的所有其他国家,这些国家显示出较小的增量。

结果

根据上述关于冠状病毒确诊病例、死亡病例和康复人员的趋势线系数分析,在他们的日常增长中存在一些可识别的聚类。具体而言,在全世界确诊病例中,有四个不同的组群。在全球范围内确认死亡和康复人员的情况下,每组分别有五个聚类。请注意,每日新增病例数量低的国家,其死亡和康复数量也低,因此其增量也低。

结论

综上所述,本文利用 JHU 系统科学与工程中心提供的聚类技术和可视化数据,努力提供关于新冠肺炎病毒情况的见解。数据由三个数据集组成,特别是确诊病例、死亡和从病毒中康复的人。每个数据集包括世界各国的时间序列。对每个时间序列的趋势线系数使用 K-means 算法的聚类方法突出了经历某种程度上相同情况的世界国家的有意义的聚类。

参考

[1]世卫组织总干事在 2020 年 3 月 11 日新冠肺炎媒体吹风会上的开幕词。检索自:https://www . who . int/DG/speechs/detail/who-总干事-s-open-remarks-at-media-briefing-on-新冠肺炎-2020 年 3 月 11 日

[2]冠状病毒(新冠肺炎)。世界卫生组织。检索自:【https://who.sprinklr.com/

[3]冠状病毒资源中心。约翰·霍普斯金大学。检索自:【https://coronavirus.jhu.edu/

[4]袁,陈,杨,何(2019).K-Means 聚类算法中 K 值选择方法的研究。

新冠肺炎确诊病例——一个交互式网络应用程序

原文:https://towardsdatascience.com/covid-19-confirmed-cases-an-interactive-web-app-d5d6de3c0ad3?source=collection_archive---------53-----------------------

我如何使用 Dash 来制作我想看的图表

关于新冠肺炎峰值和浪涌的新闻遍布互联网,数据也很容易获得。 CDCUSAFactsWorldometer 等都有很棒的数据可视化,但有时它们没有你想要的东西。我想看到每个州的新冠肺炎案例的折线图,所以我自己用破折号做了这个图。在本文中,我将介绍构建和部署 Dash 应用程序的过程,您可以在这里查看我的应用程序。

选择各个州将其数据添加到图表中

破折号

Dash 是一个易于使用的 web 应用程序框架。它允许您用 Python 编写简单的程序,生成漂亮的交互式数据可视化。Dash 应用程序有两个主要部分:1)应用程序布局和 2)回调。首先,让我们弄些样板文件出来。

我的应用程序的#Data prep code here如下所示。数据可以在这里下载,数据被读入,一些列被删除。数据框架包含县级确诊的新冠肺炎病例,因此by_state.groupby代码将这些数据整合到州计数中。最后,状态 ID 存储在一个列表中,供以后使用。还有几个样式设置用来改变按钮的颜色,稍后会详细介绍。

布局

这是你添加应用程序所有不同部分的地方。使用dash_html_components,您可以添加 HTML 组件,如标题、段落和 div。使用dash_core_components,您可以添加下拉菜单、按钮、图表等。请务必查看 html核心组件的文档,这样您就可以准确地添加您需要的内容。对于我的应用程序,三个最重要的交互式组件是用于选择州的清单、用于选择所有州的按钮和用于选择日期范围的日期选择器。您可以在下面看到应用程序布局的代码。

dcc.Checklist组件允许用户选择他们想在图表中看到的州。它的 ID 是state-selectoptions来自上述的状态 ID 列表,而value=['NY','TX'是初始值。labelStyle将复选框和相关的状态 ID 放在一起,否则当浏览器窗口被调整时,它们会被分开。html.Button有显示文本、ID、点击次数和样式变量。dcc.DatePickerRange允许用户选择他们想要查看的日期。它有最小和最大允许日期以及初始开始和结束日期。初始可见月份决定了当您更改范围时显示的日历月份。

使用交互式日历选择日期范围

图表非常简单;它是用dcc.Graph组件声明的。它的 ID 是'lines'并且config=部分删除了一个模式栏。

复试

Dash 应用程序的第二部分包含回调函数。这是赋予应用程序交互性的部分。它有一个简单的格式:有一个 decorator 后跟一个函数。应用程序的输入和输出在@app.callback装饰器之后声明。每个输入和输出都遵循格式(component-id,component-property),其中 id 和属性引用回应用程序布局代码。

输出和输入都是列表。我的应用程序中有四个输入,每个都来自布局中描述的一个交互组件。这些输入然后被传递给update_graph回调函数。来自state-select输入的value 被传入grpnames,来自buttonn_clicks被传入clicks,以此类推。对于我的应用程序,有两个输出都是从update_graph回调函数返回的。Output('lines','figure')将绘图发送给dcc.Graph组件,而Output('button','style')组件将样式发送给html.Button组件。

update_graph功能有几个步骤。首先,按钮的点击次数用于确定是否选择了“所有状态”。如果数量是奇数,则style变量被设置为bl。接下来,来自dcc.DatePickerRange的日期被重新格式化,以符合下载的数据。

单击“所有状态”按钮以可视化每个状态的数据

plot the data段创建数据帧的副本,并使用 melt 功能将其从宽格式转换为窄格式。这使得绘图变得容易,你可以在这里了解更多关于这种转换的信息。if/else 代码确定是否选择了“所有状态”,并相应地返回数据的子集。最后,数据被剔除,以包含使用dcc.DataPickerRange选择的相关日期。

Plotly.express 用于绘制数据,x 轴为日期,y 轴为确诊病例数,并按州进行着色。注意x='variable'y='value'是指 melt 函数生成的列名。Plotstyle从回调中返回,并发送到布局组件,如输出语句中所声明的。

与 Heroku 一起部署

Heroku 是一个云平台,你可以在这里部署各种网络应用。它有很好的文档,易于使用,并支持 python 应用程序。要部署 Dash 应用程序,您可以遵循这里的简单说明。下面是我使用 WSL 在 Windows 中运行 Ubuntu 终端来部署我的应用程序的步骤。

#Step 1
mkdir covid_app
cd covid_app

现在,您已经创建了自己的目录并将其刻录到 cd 中,您需要设置一个虚拟环境并安装必要的库。

#Step 2
git init
virtualenv venv
source venv/bin/activate
pip install dash
pip install plotly
pip install gunicorn

您的目录中至少需要四个文件:1) app.py,2)。gitignore,3) Procfile,4) requirements.txt. app.py 就是你的 Dash app,里面包含了上面描述的代码。的。gitignore 文件应该如下所示:

venv
*.pyc
.DS_Store
.env

Procfile 没有文件扩展名并且包含一行简单的代码:

web: gunicorn app:server

可以用这个命令生成 requirements . txt:pip freeze > requirements.txt。现在,您可以使用 heroku 部署您的应用程序,如下所示:

heroku create my-dash-app
git add .
git commit -m 'Initial commit'
git push heroku master 
heroku ps:scale web=1

零碎东西

你可以在这里查看上述的 app。这是一个简单的交互式图表,它实现了我很想看到的可视化。我可能会扩展该项目,以包含其他可视化,并将尝试写下我所做的任何补充。也就是说,当你开始自己的 Dash 应用程序项目时,你可能需要注意一些其他的主题。其中之一是assets目录。如果您在应用程序目录中创建了其中的一个,您可以包含 css 和 JavaScript 文件来为您的应用程序设计样式和添加功能。你可以在这里了解更多关于那个的信息。甚至还有专门为生物信息学设计的 Dash Bio 套件。我目前正在攻读生物信息学博士学位,所以我一定会探索这个功能,并在未来的文章中写出来。

从数据科学的角度看新冠肺炎(新型冠状病毒冠状病毒)

原文:https://towardsdatascience.com/covid-19-coronavirus-sars-cov-2-from-a-data-science-perspective-6525f239a3a3?source=collection_archive---------24-----------------------

概述为什么新冠肺炎病例的官方统计数据不具有代表性,以及我们如何获得具有代表性的统计数据。我们还将了解如何计算致死率,有多少人死于新冠肺炎病毒,以及德国的重症监护情况。

免费牌照图片来自:https://www . pexels . com/de-de/foto/nummer n-not fall-alarm-war nung-3970330/

在接下来的文章中,我们将看看新冠肺炎官方统计的当前数据基础,主要是德国。解释了需要代表性研究的原因。讨论了“钻石公主”号游轮、“戴高乐”号和“西奥多·罗斯福”号航空母舰的调查结果、在圣克拉拉县的调查以及特别是在冈格特的调查。此外,研究表明,大约一半的新冠肺炎感染者没有症状或症状轻微。基于代表性研究,计算出新冠肺炎的可能致死率约为 0.3%,以及该值的统计不确定性有多高。计算出德国有多少人可能已经感染或已经被感染,从而表明德国有大量未报告的病例。这也说明了为什么与其他受疫情严重影响的国家相比,德国对疫情事件引起的重症监护高峰有充分的准备,以及为什么更大的高峰也可以用重症监护治疗。

作者:丹尼尔·哈克,数据科学硕士,现任数据科学家

更新:

  • 17 . 04 . 2020:Gangelt 中使用的检测的特异性和敏感性包括
  • 2020 年 4 月 23 日:RKI 公司的新声明,包括当前数据,包括对“查尔斯·德·戴高乐”号和“西奥多·罗斯福”号航空母舰的调查,包括对加利福尼亚州圣克拉拉县的调查
  • 2020 年 4 月 24 日:增加了 Drosten 教授对 Gangelt 研究的评估
  • 2020 年 4 月 30 日:包括当前数字

数据基础

对于数据科学家来说,希望尽可能完整和准确地收集数据,从而尽可能避免错误。这可以确保从数据中获得正确的信息,从而最大限度地减少误解的可能性。因此,问题是这种理想状态是否也适用于新冠肺炎的数据。

首先,人们必须考虑新冠肺炎试验进行到什么程度。在疫情开始时,德国的目标是追踪感染链以控制病毒。根据罗伯特·科赫研究所(RKI)的最初建议,符合以下标准的人应接受新冠肺炎病毒检测[1]:

  • 有感冒症状并在发病前 14 天内与新冠肺炎确诊病例有过接触的人,或
  • 任何有感冒症状并在症状出现前已在危险区域 14 天的人。

但是,这一程序能导致这样一个事实,即所有的新冠肺炎病例都被公开,因此官方的感染人数是正确的吗?

如果真的有可能找到一个感染者的所有接触者,这是可以想象的。该病毒的平均潜伏期为 5-6 天,甚至可以从 1-14 天不等[2]。因此,感染只有在几天后才变得明显。在疫情开始时,不知道自己被感染的感染者可以使用人员密集的公共交通系统,并参加允许密切个人接触的活动,如参观迪斯科舞厅或足球场。最初,即使出现症状,这些人也没有接受检测,除非他们与一个明显被感染或从危险地区回来的人接触。许多受感染的人无法用这种方法检测出来。

从 RKI 的角度来看,该建议在当时当然是可以理解的,因为检测能力有限,实验室不应负担过重。因此,有必要将注意力集中在最有可能的情况上。然而,从数据科学的角度来看,收集尽可能完整的信息并不是一种理想的状态。特别是因为这导致数据的变化,这意味着它们不能被认为是有代表性的。像“x 人感染了新冠肺炎病毒”、“x 人感染了肺炎”或“x %的感染者死于新冠肺炎”这样的精确说法是不可能的。应当使用诸如“发现 x 人感染了新冠肺炎病毒”、“发现 x 人感染了肺炎”或“发现 x %的感染者死亡”等表述。出于这个原因,代表性的研究是绝对可取的,这将在下文中讨论。

代表性研究

邮轮“钻石公主”号上的 COVID 19 案,可以算是有代表性的例子。所有的乘客和机组人员都在那里接受了测试,不管他们的症状如何,这样可以更近距离地观察。

新冠肺炎还散布在航空母舰上。在“戴高乐”号上所有的人都经过测试[19],在“西奥多·罗斯福”号上大约有 94%的机组人员[20]。然而,必须考虑到,游轮的中位年龄略低于 60 岁,因此高于人口的中位年龄。另一方面,对于航空母舰来说,机组人员平均更年轻、更健康。

为了得到更多有代表性的数据,看看冰岛也是值得的。在那里,与冰岛当局的测试平行,研究机构 deCode Genetics 也进行了测试。与冰岛当局只对有症状的人进行测试相反,deCode Genetics 选择了随机接受测试的人[5]。这样就可以获得总人口的代表性视图。

还有一项由斯坦福大学医学院在加利福尼亚州圣克拉拉县进行的研究。对 3,300 人的血样进行了检测。这些人是通过脸书的一则广告联系上的。他们还被要求有一辆车去测试站。该研究的作者写道,这导致了 19 岁至 64 岁的白人女性比例过高[21]。

最近,还提供了一份来自德国的代表性研究报告。波恩大学医院对受影响特别严重的恒河社区的约 1000 人进行了病毒和抗体检查。这项研究仍在进行中,但在对大约 500 人进行评估后,第一个中期结果已经公布。在公布中期结果后,第一个批评就出现了。有人批评说,只有一种检测方法可以可靠地检测新冠肺炎抗体,同时不会对其他无害的冠状病毒产生反应。但中期结果未提供所用试验的信息[6]。这项研究由来自病毒学、临床化学和药理学、卫生学和公共卫生以及医学生物统计学、计算机科学和流行病学研究所的教授在波恩大学医院进行。由于专家似乎正在进行研究,因此应首先假设使用了一种能够可靠地将抗体仅分配给新冠肺炎抗体的测试。如果将来确定该检验不合适,则必须更仔细地检查统计误差。

2020 年 4 月 24 日更新:dr . dro sten 教授(柏林查理特大学病毒学研究所所长)与 Dr. Streeck 教授(恒河研究主任、波恩大学医院病毒学研究所所长)联系后,他现在也期待一项“极其扎实、稳健的研究”[25]。

在本文的后续部分,将会反复引用这些测试,因为它们提供了数据情况的代表性视图。慕尼黑 LMU 克林库姆慕尼黑感染和热带医学系[7]和罗伯特科赫研究所(RKI) [8]正在进行两项进一步的研究。目前还没有结果。这种研究的表现只能受到欢迎,因为它们提供了该病毒的代表性情况。

无症状或症状轻微的感染者

一项来自中国的研究提供了第一个迹象,表明这种感染也可以在没有或只有轻微症状的情况下发生。这不是一项有代表性的人群研究,因为只调查了报告的病例。然而,它可以给人一种病毒在报告病例中如何起作用的初步印象。已经表明,大约 80%的报告病例有轻度症状,尽管也有无症状的感染[3]。

如上所述,"钻石公主"号游轮上的病例可被视为具有代表性,因为游轮上的所有人都接受了新冠肺炎检测。结果发现,大约一半的感染者在测试时没有表现出症状[4]。这与冰岛的研究机构 deCode Genetics 的样本结果一致,在那里,被测试的人是随机选择的,因此提供了一个有代表性的图片。同样,一半的感染者没有表现出任何症状[5]。类似的观察也可以在两艘航空母舰上进行。在“戴高乐”号上超过 50%的人没有表现出症状[19],在“西奥多·罗斯福”号上则是 60.7% [20]。

在所有有代表性的研究中,发现至少一半的感染者没有表现出任何症状。这说明了这种病毒在社会上的传播是多么不为人知。考虑到 RKI 的建议,即除了症状之外,一个人还必须与一个明显感染的人接触过,或者至少从一个危险地区返回过,这表明有大量未报告的病例。

Letality

看一下各个国家的官方死亡率数字,很大的偏差是显而易见的。截至 2020 年 4 月 29 日,德国的死亡率为 3.94%,全世界为 6.96%,比利时甚至为 15.67%。[9].

但是同一种病毒在不同国家会导致如此不同的致死率吗?

实际上,可以假设在类似的医疗情况下,一种病毒也是同样致命的。要做到这一点,我们必须记住致命性是如何计算的:它是通过比较被检测为感染新冠肺炎病毒的死亡人数与被检测为感染新冠肺炎病毒的人数来计算的。如上所示,在受感染人数中,有很大一部分未报告病例。但是,可以假定几乎所有的死者都被记录了下来。可以假定,这些人以前曾表现出强烈的症状,接受过强化医疗护理,并因此接受了新冠肺炎检测。RKI 说:“我们假设患者在死亡前就被诊断出来”[10]。尽管如此,当然也可能有估计数量的未报告案件,但根据前面的评论,这一数字估计要低得多。不同的致死率还表明,感染人群中未被发现的病例数量因国家而异。然而,如果感染人数高于官方已知人数,如果预计感染人数正确,则计算的致死率会降低。出于这个原因,有必要看看代表性的研究。

2020 年 4 月 23 日更新: 与此同时,RKI 做出了不同的声明:“我假设我们的死亡人数比官方统计的多”。[22]然而,没有说还会有多少人死亡。黑森州卫生部表示,到目前为止,尚未确定与冠状病毒有关的超额死亡率。柏林卫生局也表示,在过去的几周内,只能确定较低的超额死亡率。这可能主要是由于流感,而不是新冠肺炎[22]。应该注意的是,其他国家的死亡率很可能过高。与此形成对照的是,有尸检结果表明,统计数字中所列的新冠肺炎死亡并非都是由新冠肺炎造成的(见“新冠肺炎的尸检结果”一节)。从数据科学的角度来看,根据目前可用的数据,不能说死于新冠肺炎的人数是多于还是少于德国的统计数字。因此,官方数值将用于以下统计中。

要估计新冠肺炎的杀伤力,值得看一看“钻石公主号”邮轮的发现。游轮上的平均年龄高于正常人群。因此,死亡率约为 0.5%的年龄调整,两个方向的不确定性为 0.25 个百分点。尽管邮轮上的医疗服务无法像陆地上那样有重症监护床和呼吸器[11]来保证,但这一数值还是出现了。

在“戴高乐”号航空母舰上,1081 名船员的新冠肺炎检测呈阳性。其中,24 人不得不在医院接受治疗,其中 2 人在重症监护中,迄今为止没有人死亡[19]。在“T2”号航空母舰、“西奥多·罗斯福”号航空母舰(USS Theodore Roosevelt )的 660 名船员中查出了新冠肺炎[20]。一个死亡,对应的致死率为 0.15%。如果将两艘航母放在一起考虑,1741 名被感染的船员中,有 1 名被感染的船员死亡,对应的致死率为 0.06%。当然,这些值不能转移到总人口中,因为船员平均更年轻、更健康。

斯坦福大学医学院在加州圣克拉拉县进行的研究得出的致死率为 0.12%-0.2%。应该指出的是,人员的选择不是随机的。这些人是通过脸书上的一则广告联系上的。此外,他们还必须拥有一辆汽车,才能开车去试车台。这可能导致这样一个事实,即参与研究的人更年轻,流动性更强,因此比普通人群传播的病毒更远。这将导致对已经感染的人的过高假设,从而导致过低的计算致死率。研究中没有给出受检者的年龄分布。

由于在 Gangelt 的调查,来自德国的中期结果最近已经公布。据发现,Gangelt 有 15%的人口目前或过去已经携带该病毒[12]。509 人接受了检测,因此,从算术上讲,大约 76 人本身携带病毒。在介绍中期业绩时没有给出确切的数字。

下面将更详细地讨论 Gangelt 中的结果。当考虑这些数字时,必须考虑检测的特异性和敏感性。特异性是指在没有产生新冠肺炎抗体的人群中,检测结果为阴性的百分比。根据制造商的说法,特异性> 99%。如果假设在 509 名测试参与者中,大约 440 人没有产生抗体,那么大约有 4 人在统计中被夸大了。因此只有 72 人。然而,还必须考虑测试的灵敏度。

敏感度显示了实际产生新冠肺炎抗体并检测为阳性的人的百分比。根据制造商的说法,如果症状出现后至少 20 天,灵敏度为 100%,否则灵敏度可降至 87.5% [18]。如果我们现在查看 72 名被正确检测出新冠肺炎病毒的人,这将意味着 72 至 82 人实际上感染了新冠肺炎病毒。然而,令人怀疑的是,对于所有实际感染的人来说,至少所需的 20 天已经过去了,这就是为什么不能假定 100%的灵敏度。但是,如果敏感度降低,实际感染的人数就会增加。因此,继续假设先前计算的 76 名新冠肺炎感染者仍然被感染是合理的。如果该值高于 76 人,已感染人口的百分比将增加,因此计算的致死率将下降。

如果查看受感染者的β分布,可以看到百分比份额的实际值在 12%和 18%之间,准确度为 95%。因此,恒河受感染者百分比的最可能值是 14.79%。如果感染者的百分比可以从 15%确认到总共 1010 名研究参与者,则确定性增加,95%置信区间的范围减小到大约 13%到 17%。恒河受感染人口比例的最可能值是 14.98%。

Gangelt 感染人数百分比的β分布,丹尼尔·哈克

流行病学家克劳斯批评了中期结果:“人们不应该从这些家庭中获得所有结果,并将其转换为百分比,而最多是每户一人”[6]。作为一个原因,他指出,家庭内的感染风险比一般人口高许多倍,因此对所有家庭成员的完整统计是不正确的。但是这种说法站得住脚吗?在代表性研究中,如果可能的话,被调查的群体应该反映社会的代表性,以便能够代表社会。批评的是感染的风险没有可比性。但是冈格特的条件和德国其他地方一样。在德国的其他地方,未被发现的感染者仍然与住在同一家庭的人接触,并可能传染给他们,就像在 Gangelt 的情况一样。

15%的感染者的价值肯定不能转移到整个联邦领土,因为冈格特受到的影响特别强烈。但是,考虑到统计误差,致死率值可以转移到德国。因为新冠肺炎的死亡人数在德国各地都是一样的,而且必须上报给 RKI。

根据对 Gangelt 的研究的中期结果推断的感染者,丹尼尔·哈克

对于 Gangelt 调查的中期结果,给出的致死率为 0.37%。当考虑β分布时,可以以 95%的准确度假设实际致死率在 0.15%和 0.69%之间。密度函数显然是左硬/右斜的。因此,最可能的致死率值是 0.32%,低于计算的致死率 0.37%。

这里必须考虑到,0.37%的假定致死率是从 7 例已知死亡和 1879 例感染者中计算出来的,后者是从 Gangelt 研究的中期结果中推断出来的。这一推算数字来自于研究中观察到的 15%的感染者。如上所示,由于置信区间为 95%,Gangelt 的实际感染人数百分比在 12%至 18%之间。根据实际感染人数的不同,致死率也不同。如果我们现在看一下 Gangelt 12%感染者的下限,致死率是 0.47%,由此致死率的 95%置信区间在 0.19%到 0.87%之间。因此,致死率最可能的值是 0.4%。

有 12%感染者的 Gangelt 中致死率的β分布,Daniel Haake

如果考虑到 Gangelt 中感染者比例的置信区间上限为 18%,则结果是致死率为 0.31%,置信区间为 0.12%至 0.57%,最可能值为 0.26%。

有 18%感染者的 Gangelt 中致死率的β分布,Daniel Haake

总之,根据研究的中期结果,Gangelt 的感染者比例在 12%至 18%之间,平均致死率在 0.31%至 0.47%之间,最可能致死率在 0.26%至 0.4%之间,致死率范围在 0.12%至 0.87%之间。这些数字与“钻石公主号”的调查结果非常吻合,其中给出的致死率为 0.5%,致死率的可能范围为 0.25%至 0.75%。为 Gangelt 计算的致死率高于航空母舰上的致死率值(对于更年轻、更健康的船员为 0.06%),也高于为加利福尼亚州圣克拉拉县计算的致死率(通过脸书选择试验对象时为 0.12-0.2%)。通过与其他有代表性的研究进行比较,Gangelt 计算的致死率可以归类为似是而非。

通过使用确定的致死率,现在可以估计德国有多少人曾经或实际上已经感染了新冠肺炎病毒。根据约翰·霍普斯金大学的数据,截至 2020 年 4 月 30 日,在德国检测到的 161,539 名新冠肺炎感染者中,共有 6,467 人死亡[13]。以 Gangelt 计算的 0.37%的致死率,这意味着 1,747,838 人(约。总人口的 2.1%)曾经或已经感染了新冠肺炎病毒。以 0.32%的最可能致死率计算,已经有 2,020,938 名感染者(大约。占总人口的 2.4%)。致死率在 0.12%至 0.87%之间,感染人数为 743,333 至 5,389,167 人(约为 1,000 人)。占总人口的 0.9%至 6.5%)。这是对过去的回顾,因为死者是前段时间被感染的。

可见实际感染的范围还是蛮高的。因此,Gangelt 的最终结果非常有趣,可以缩小置信区间的范围,从而提高数据的可靠性。进一步的大规模代表性研究也是可取的。尽管感染人数不确定,但可以看出德国有大量未报告的病例。

分布

反复说感染人数是指数函数。但真的是这样吗?在病毒传播的初期,感染者会遇到对病毒没有免疫防御的人群。病毒可以在人群中迅速传播,导致受感染人数呈指数增长。然而,随着时间的推移,越来越多的人携带病毒或在过去已经被感染,并建立了免疫防御。一个受感染的人现在会遇到越来越多的被感染或曾经被感染的人,因此仍然会被感染的人会越来越少。

因此,传播速度在开始时增加,直到开始放缓,然后有一段时间,新感染人数比以前少。因此,新感染病例随时间的分布是一个逻辑函数。如果措施最初削弱了传播速度,这可能导致波动现象。

如果现在考虑感染者的总数,就可以得到一个 sigmoid 函数。起初,受感染人数急剧增加,直到达到高峰,受感染总人数的增加速度放缓。如果采取措施减缓传播速度,就会形成稳定期,随后受感染总人数会出现进一步的 S 曲线。

新冠肺炎造成的死亡

在约翰·霍普斯金大学和罗伯特·科赫研究所的统计数据中,已经统计了发现新冠肺炎的死亡人数。然而,这并不意味着这些人实际上死于新冠肺炎。这种事只有通过尸检才能弄清楚。但这恰恰没有发生。根据 RKI 的建议,应避免内部尸检和尸体解剖,以避免在打开尸体时产生传染性气溶胶。德国病理学家联邦协会(BDP)和德国病理学会(DGP)已经要求 RKI 撤销这一建议,并对感染新冠肺炎病毒的死者进行尽可能多的尸检[14]。目前的做法意味着官方数字没有显示实际上有多少人死于新冠肺炎。

2020 年 4 月 23 日更新: 同时,RKI 不再建议不进行尸检【24】。在日期为 2020 年 4 月 16 日的这篇文章的版本中,记载了 56 名尸检人员中有 47 名死于新冠肺炎[15]。然而,最近的数据显示 65 例尸检中有 61 例。这篇文章的作者不知道那些没有死于新冠肺炎的人是如何从 9 减少到 4 的。

在汉堡,人们偏离了推荐的做法,对证实感染新冠肺炎病毒的死者进行了尸检。据发现,在 65 人被解剖,61 新冠肺炎被发现是死因[24]。这意味着,约 93.9%的新冠肺炎尸检被发现是死因,约 6.1%不是。由于进行尸体解剖的人数仍然很少,93.9%的人仍然有一定程度的不确定性。

如果观察贝塔分布的 95%置信区间,可以看到在大约 86.9%到 98.3%的尸检电压范围内,应该发现新冠肺炎是死因。这里最可能的值是 95.2%。

如上所述,RKI 现在假定还有未列入统计数据的新冠肺炎死亡人数。因此,新冠肺炎死亡人数是多于还是少于统计数字,无法用现有数据来澄清。

但是在汉堡的尸检中有了另一个发现。每个尸检者都有一种或多种严重的先存疾病[16]。

病人的特别护理

新冠肺炎的死亡人数也取决于有多少病人可以在重症监护室接受治疗。因此,已采取措施使新感染人数的逻辑函数曲线变平。因为如果需要重症监护的病人多于有呼吸机的重症监护床位,那么很大一部分甚至全部都会死亡,因为他们无法接受所需的重症监护。因此,值得看一看每个国家每 100,000 名居民有多少重症监护病床。

每 100,000 名居民中重症监护病床的数量,丹尼尔·哈克

值得注意的是,与其他欧洲国家相比,德国处于有利地位。还值得注意的是,受新冠肺炎影响特别严重的国家每 100 000 名居民中重症监护病床的数量少得多。因此,德国每 100,000 名居民中重症监护病床的数量是比利时的两倍多,是意大利、法国和西班牙的三倍,是英国的五倍。

德国的医院向德国重症监护和急救医学跨学科协会报告可用重症监护病床的数量,其中有多少是普通病床或新冠肺炎患者病床,以及其中有多少需要转移。截至 2020 年 4 月 30 日,约有 1,256 家医院提供了这些数据[17]。根据这些数字,目前有 2,280 例经证实的新冠肺炎感染者在报告医院接受重症医学护理。共有 12,792 个免费床位。如果这一使用率也适用于未报告的医院,可以假设在所有重症监护病床被占用之前,同一时间的新冠肺炎感染者人数可能是今天的 6.6 倍。

如果考虑到在报道的 32,691 张特护病床中,有 17,619 张没有新冠肺炎保险的病床被占用,可以看出在德国对特护中未预见的高峰有可能作出良好的反应。如果我们现在再比较一下各国每 100,000 名居民中重症监护病床的数量,似乎受影响特别严重的国家,如比利时、意大利、西班牙、法国和英国,在没有疫情的情况下只能提供正常的护理。重症监护中的高峰无法被吸收,卫生系统很快达到其极限。

结论

可以说,德国在应对疫情的重症医学方面处于有利地位。例如,在目前的重症监护病床数量被完全占用之前,可能会有大约 6.6 倍的人同时感染新冠肺炎病毒。另一方面,受影响最严重的国家,如比利时、意大利、西班牙、法国和英国,似乎只能满足对重症监护病床的正常需求,而没有为疫情造成的高峰做好准备。

0.32%的可能致死率远低于官方统计数据。这一数值介于“查尔斯·德·戴高乐”号航空母舰和“西奥多·罗斯福”号航空母舰(更年轻、更健康的人群为 0.06%)或圣克拉拉县(0.12% — 0.2%)的调查结果和“钻石公主”号邮轮的调查结果(年龄调整后为 0.5%,置信区间:0.25% — 0.75%)之间。因此,用 Gangelt 计算的值似乎是合理的。由此得出的结果是,约 2,020,938 人,即约 2.4%的德国人口感染或曾经感染新冠肺炎病毒,感染人数从 725,747 人到 5,261,667 人不等(占总人口的 0.9%到 6.5%)。应该注意的是,这是对过去的回顾,因为那些死亡的人是在一段时间之前被感染的,因此死亡人数的报告有所延迟。一方面,可以看出未报告的案件数量相应较高。另一方面,它表明需要进一步的大规模研究,以尽量减少统计不确定性,并提供更准确的数字。

也可以说,大约 50%的感染者没有表现出任何症状。因此,为了有一个良好的数据基础,不仅应该检测有症状的人,还应该检测与明显感染者接触过的人。有必要进行代表性的检查,定期对社会各阶层进行新冠肺炎病毒检测。这是获得关于新出现症状、需要加强医疗护理的人员和致死率的可靠信息的唯一途径。在未来发生大流行的情况下,这应该尽早开始。

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

文献学

[1] I. Berres、K. Rydlink 和 N. Weber,“德国对新冠肺炎的测试”,《明镜周刊》,2020 年 3 月 5 日。【在线】。可用:https://www . Spiegel . de/wissenschaft/medi Zin/coronavirus-und-新冠肺炎-so-testet-德国-a-cbb 87 c 09-1804-45df-bb2b-8895 E4 da 91 e 2。[2020 年 4 月 10 日进入]。

[2] RKI,“SARS-CoV-2 冠心病 2019 年挂图”(2020 年 4 月 10 日[在线]。可用:http://www . rki . de/content/inz/n/neus _ corona virus/plug letter . html。[2020 年 4 月 10 日访问]。

[3] T. N .C. P .E. R .e .小组,《生命监测:2019 年爆发的新型冠状病毒疾病的流行病学特征》(中国疾病防治中心周报;《T3》BD)。页:1。页:1。113-122,2020 年。

[4] A .维拉和 s .L. Erdman,“几乎有一半的钻石公主巡航船乘客和船员患有冠状病毒,在测试时是无症状的,疾控中心报告,CNN,24。03.2020 .[在线]。可用: https://edition。CNN . com/2020/03/24/us/diamond princes 巡航舰-渐近测试/指标. html。[2020 年 4 月 10 日登陆]。

[5] ORF,“冰岛是一个先驱——从 2020 年 3 月 24 日开始的初步发现。可用资源:https://orf . at/stories/315908/。[访问日期:2020 年 4 月 13 日]。

[6]k . zinant,“对研究的批评和怀疑”,《德国南方报》,10。4.2020 年。[在线]。可用:https://www . sudd Deutsche . de/knowledge/heinsberg-herdenimunity aet 批评-1.4873480 。[2020 年 4 月 10 日访问]。

[7]lm 慕尼黑诊所——感染和热带病科,“联合对抗 coid:前瞻 coid-19 KOH hores 慕尼黑”(在线)。可得:T10[http://www . clinical . uni-muertes . de/department-for-infection and trom medicine/de/coid-19/koco 19/index . html]〔t11〕。[2020 年 4 月 10 日访问]。

[8]罗伯特-科赫研究所,“有多少人对新的冠状病毒免疫?— Robert Koch 研究所于 2020 年 4 月 9 日在全国范围内启动。[在线]。可用:https://www . rki . de/content/service/press/news/2020/05 _ 2020 . html。[2020 年 4 月 10 日访问]。

[9]静态数据,“2020 年 4 月 29 日受影响最严重国家的冠状病毒死亡率(coid-19)。”。可用资源:https://de . statista . com/statistics/data/study/1103785/survey/mortality rate-des-de-coronel virus-after-lauen/。[访问日期:2020 年 4 月 30 日]。

[10] ntv,“为什么死亡率这么低?2020 年 3 月 20 日[在线]。可用:https://www . n-TV . com/panorama/why-is-死亡率-so-low-article 21657232。html。[2020 年 4 月 10 日访问]。

[11]star,“隔离已有一个星期——情况越来越明显,2020 年 2 月 12 日[在线]。可用资源:https://www . stern . de/health/corona virus--交叉路口情况--钻石公主--spit-zu-9134930 . html。[2020 年 4 月 10 日访问]。

[12] H .教授。streeck 医生,g 博士,你好。哈特曼先生 Hartmann,m .博士,你好。Exner 和 m .博士,你好。施密特,波恩大学医院,09 年。2020 年 4 月。[在线]。可用: https://www。国家/地区. nrw/sites/default/files/asset/document/intermediate _ coid 19 _ case _ study _ gangelt _ 0 . pdf。[接入 10。[2020 年 4 月 4 日]。

[13]约翰-霍普金斯大学,“死亡率”2020 年 4 月 13 日。可用:t8【https://corona virus . jhu . edu/data/mortality】。[访问日期:2020 年 4 月 13 日]。

[14]德国病理学会 e.V .,“新闻稿:科罗娜死者应于 2020 年 4 月入住。[在线]。可用资源:https://www . pathology-DGP . de/der-DGP/current/message/新闻稿-an-corona-dead-should-obudad-be/。[2020 年 4 月 11 日访问]。

[15] 时间在线,“汉堡的冠状病毒:死亡人数上升”,2020 年 4 月 10 日。Available: https://www.zeit.de/hamburg/2020-03/冠状病毒-汉堡学校关闭-措施-事件-FAQ#how-许多人在汉堡-an-一个-covid-19 疾病死亡 。[访问 11.04.2020]。

[16] 世界,“在汉堡,没有人死于先前的冠状动脉疾病”。Available: https://www.welt.de/regionales/hamburg/article207086675/rightsmediziner-Pueschel-In-Hamburg-ist-none-no-no-no-no-pre-疾病-an-Corona-mort.html 。[访问 11.04.2020]。

[17] 德国重症监护和急诊医学跨学科协会,“DiVi 重症监护病房” 30.04.2020. [在线]。Available: https://www.divi.de/images/Documents/Tagesreport_IntensiveRegister_PDF/DIVI-IntensiveRegister_Tagesreport_2020_04_30.pdf 。[Access on 30.04.2020]。

[18] K. Rydlink 和 N。韦伯,“冠状病毒抗体测试 - 太早是真的,”17。可用: https://www.spiegel.de/科学/医学/冠状病毒-如-抗体检测-帮助-该-大流行-a-2258edcd-a304-4ee0-83cc-76a24f340c45 。2020 年 4 月 4 日)。

[19] 世界, “超过 1000 感染船上 — 病毒可能蔓延后停止在布雷斯特”, 20.04.19.Available: https://www.welt.de/politics/outland/article207365541/Corona-on-tracker-Charles-de-Gaulle-病毒-传播-se-on-stop.html 。[Access on 21.04.2020]。

[20]明镜政策,“美国航空母舰上三分之二的海员没有显示 2020 年 4 月 18 日。[在线]。可用:https://www . Spiegel . de/policy/foreign/coronel virus-on-USS-Theodore-Roosevelt-三分之二的美国航空母舰-无症状-a-b7d 51 ACB-9969-4262-BD 87-A0 e 93339 a1。[访问日期:2020 年 4 月 21 日]。

[21] C. Baars 先生。烤肉和 g。男性,“从死者身上验尸——NDR/wdr,21 岁。4.2020 年[在线]。可用:https://www . day chau . de/investigation/NDR-wdr/corona-autopsies-103 . html。[访问日期:2020 年 4 月 22 日]。

[22] NTV,“冠心病与 2020 年 4 月 21 日”。可用:T4〔https://www . n-TV . de/panorama/das-corona virus and-die statistics〕文章 21728569 . html?fbclid = iwar 2 ije 6 cvpliij 3 mfvfes j54 otbetmxr _ zmxx 9 hww 9 _ mqc 1 whumyi 9c _ y。[访问日期:2020 年 4 月 22 日]。

[23] E. Bendavid,b .穆拉妮,n .早,s .哦,还有。玲,r .Bromley-Dulfano,c .赖,z。魏斯贝格,r .萨维德拉沃克,j .Tedrow,d .特维尔斯基,a .波甘,t .Kupiec,d .标识符,r。Gupta 和 ioannidis,“coid-19 圣克拉拉县的抗艾滋病毒抗体阳性者”,斯坦福大学医学院,11。2004 年 4 月 20 日[在线]。可用:https://www . medr XIV . org/content/10.1101/2020。2006 年 4 月 14 日 06 463v 1 . full . pdf。[2020 年 4 月 21 日访问]。

[24] C. Baars 先生。烤肉和 g。男性,“从死者身上验尸——NDR/wdr,21 岁。4.2020 年[在线]。可用:https://www . day chau . de/investigation/NDR-wdr/corona-autopsies-103 . html。[访问日期:2020 年 4 月 22 日]。

[25] C .教授 Dr. Drosten,“Maybrit Illner Twitter”,2020 年 4 月 17 日。【在线】。可用:https://Twitter . com/maybritillner/status/1250929078930223105?ref _ src = tw src % 5 etfw % 7 ctw camp % 5 etweembed % 7 ctw term % 5e 1250929078930223105&ref _ URL = https % 3A % 2F % 2 FEM beds . br24 . de % 2 FEM bed % 3 FID % 3d 534998。【2020 年 4 月 24 日进入】。

北美新冠肺炎疫情的数据分析

原文:https://towardsdatascience.com/covid-19-coronavirus-top-ten-most-affected-countries-c165171c50d7?source=collection_archive---------54-----------------------

深入了解新冠肺炎教在北美的传播

北美的新冠肺炎(迭戈·乌尔塔多)

介绍

这篇笔记的目的是描述当前北美形势的总体全景,这可以为人们采取有益的社会和健康措施以阻止新冠肺炎的传播服务。

自 2019 年 12 月下旬以来,一种新型冠状病毒疾病的爆发(新冠肺炎;此前被称为 2019-nCoV)在中国武汉被报道,随后影响了全球 210 个国家。总的来说,新冠肺炎是一种急性疾病,但也可能是致命的。由于大量肺泡损伤和进行性呼吸衰竭,严重疾病发作可能导致死亡。截至 2022 年 12 月 3 日,已确诊约 6.45 亿例病例,超过 664 万人死亡。

美利坚合众国

该数据集是从“纽约时报”获得的。(2021).美国冠状病毒(新冠肺炎)数据[4]

加利福尼亚

得克萨斯州

佛罗里达州

纽约

Covid 19 —墨西哥概述🇲🇽

我使用了确诊/死亡病例的时间序列,并结合了 covid 期间个人描述的数据集

确诊病例(迭戈·乌尔塔多)

确诊病例最多的时期。第三波(迭戈·乌尔塔多)

死亡病例墨西哥(迭戈·乌尔塔多)

死亡病例最多的时期(Diego Hurtado)

按年龄划分的死亡病例(Diego Hurtado)

按年龄确认病例范围(Diego Hurtado)

确诊病例的年龄分布(Diego Hurtado)

按性别分列的确诊病例比例(Diego Hurtado)

住院人数百分比(Diego Hurtado)

墨西哥的流动性🚗 🇲🇽

尽管感染人数激增,墨西哥总统在五月开始了“新常态”来“重新激活”经济

在商店外面,顾客们在等待,没有注意到健康距离。Av。CDMX Eje Central 的华雷斯角。2020 年 5 月 21 日。图片:angelica Escobar/福布斯墨西哥版。

观察:

我们可以看到,确认/死亡/流动性在 2021 年 5 月【新常态】 开始时开始增长

墨西哥死亡病例(迭戈·乌尔塔多)

确诊病例(迭戈·乌尔塔多)

我使用不同的数据集来了解 Covid 19 期间墨西哥的移动趋势

“新常态是一种幻觉,我们正处于流行病活动中,我认为在这个时候提议重新开始社会活动实际上是自杀行为,我认为这会以前所未有的水平重新激活患病和死亡人数”——马拉奎亚斯·洛佩斯·塞万提斯****

加拿大

各省确诊病例

各省死亡案例

各州案件

安大略

魁北克省

艾伯塔

****

顺便说一句:我正在寻找新的工作机会!📊

我正在寻找一个机会,在那里我可以把这些能力投入到我热爱的任务中去!

“当有人问你是否能胜任某项工作时,告诉他们,‘我当然能!那就忙起来,搞清楚怎么做。”—西奥多·罗斯福。

坐在办公桌前的金毛猎犬贝利(knowyourmeme,2022)

****LinkedIn:https://www.linkedin.com/in/diego-gustavo-hurtado-olivares/

Msc。迭戈·乌尔塔多
商业分析顾问

催单

1918 年的疫情流感是近年来最严重的疫情。它是由带有禽类基因的 H1N1 病毒引起的。尽管对病毒的起源没有普遍的共识,但它在 1918-1919 年间在世界范围内传播。

全世界死亡人数估计至少为 5000 万,其中约 675,000 例发生在美国。

5 岁以下、20-40 岁和 65 岁及以上人群的死亡率较高。健康人群的高死亡率,包括 20-40 岁年龄组的人群,是疫情的一个独特特征。

流感疫情图表(Reeve 003143),国家健康和医学博物馆

疫情流感| 1918 年和 1919 年期间美洲和欧洲的死亡率。图表:“疫情流感。1918 年和 1919 年间美国和欧洲的死亡率每周因各种原因造成的死亡,以每年每 1000 人的死亡率表示。包括代表纽约、伦敦、巴黎和柏林的线条。

我们到了。

流感疫情图表(Reeve 003143),国家健康和医学博物馆

结论:

本文详细分析了新冠肺炎是如何影响世界的,以及由此得出的见解如何用于下游分析。这些图表还可以应用于其他场景,以推断关键的数据洞察力。

我希望你们都喜欢这篇文章。所有的图表都是使用 Plotly 创建的。Plotly 是一个非常棒的可视化库,用于构建交互式的图形。他们有 Python 和 JavaScript 的图形库。

领英:https://www.linkedin.com/in/diego-gustavo-hurtado-olivares/

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

参考

[1]徐,郑,石,李,王,杨,张,黄,李,张,陈,… &泰,杨(2020).急性呼吸窘迫综合征相关新冠肺炎的病理表现。柳叶刀呼吸内科8 (4),420–422。

[2]m .卡斯塞拉、m .拉杰尼克、m .科莫、a .杜勒博恩、S. C .、r .迪那不勒斯(2020 年)。冠状病毒的特征、评估和治疗(新冠肺炎)。在 Statpearls【互联网】。StatPearls 出版社。

[3]世界卫生组织。(2020).冠状病毒疾病 2019(新冠肺炎):情况报告,72。

[4]美国和欧洲 1918-1919 年流感死亡率图表|奥的斯历史档案国家健康和医学博物馆(http://www . Flickr . com/photos/medical Museum/5857153474/in/set-72157614214049255),由 CC-BY-NC-SA(http://creativecommons.org/licenses/by-nc-sa/2.0/uk/)授权

[5]《纽约时报》。(2021).美国冠状病毒(新冠肺炎)数据。从https://github.com/nytimes/covid-19-data取回【在此插入日期】。”

[6]谷歌有限责任公司《谷歌新冠肺炎社区移动报告》
https://www.google.com/covid19/mobility/接入:< fecha >。

使用深度学习的新冠肺炎 CT 分析

原文:https://towardsdatascience.com/covid-19-ct-analysis-using-deep-learning-7342a6ba5a31?source=collection_archive---------52-----------------------

我们如何在(几乎)没有数据和注释的情况下开发深度学习新冠肺炎 CT 分析工具

一月中旬,关于中国出现一种导致发烧和咳嗽的新病毒的消息开始传来。

当时,我们正在与一家中国公司合作,整合我们的胸部 CT 分析工具。该公司开发了一个云 PACS(图片存档和通信系统),使放射科医生能够远程查看病例并编辑来自多家医院的放射报告。

我们注意到胸部 CT 扫描中有肺部异常的患者,这些患者被引导到实验室检查。随着医学成像算法的研究,我们认为可以开发一种解决方案来检测这些发现。

当时我们还很天真,无法想象几个月后,全世界都会遭受冠状病毒疫情的侵袭,而我们的新冠肺炎 CT 分析工具将作为新冠肺炎检测和患者监测的工具,为全世界的放射科医生提供服务。

迪米特里·卡拉斯泰列夫在 Unsplash 上的照片

首先,我们面临两个问题(这在医学成像领域相当普遍):(1)小数据集——我们只有几个疑似新冠肺炎患者的病例;(2)完全没有注释

在接下来的章节中,我将阐述我们如何使用深度学习工具快速构建新冠肺炎解决方案。这里提出的思路和方法可以用于任何具有 CT 影像特征的新病毒或疾病,尤其是在数据几乎不可用的初期阶段。

新冠肺炎 chect CT 分析的深度学习框架[图片由作者提供]

1.基于切片的解决方案

CT 扫描包括一系列切片(对于不熟悉 CT 的人,请阅读下面的简短说明)。由于我们对新冠肺炎患者的扫描数量非常有限,我们决定使用 2D 切片代替每次扫描的 3D 体积。
这使我们能够将数据集多元化,并克服小数据集的第一个障碍。使用 2D 切片的另一个原因是对 CT 扫描的切片厚度变化(两个连续 CT 切片之间的 z 边缘)具有鲁棒性的能力。

我们收集了 50 名患者的异常胸部 CT 扫描,这些患者被放射科医生诊断为可疑新冠肺炎。

【CT】扫描是一种诊断成像程序,它使用 x 射线来构建身体的横截面图像(“切片”)。根据对所研究对象体积中 x 射线束衰减系数的测量来重建横截面。在数据显示在屏幕上之前,常规的重新标度被制成 CT 数,用 Hounsfield 单位(HU) 表示【1】。CT 切片具有高动态范围(通常为 12 位或 16 位),并以 DICOM 格式提供。

检查 ct 切片[图片由作者提供]

将 CT dicom 文件读取为 numpy 数组的代码示例:

2。肺部分割

分析的第一步是在图像中找到\分割肺部,并在肺部周围裁剪图像。这使得我们可以专注于感兴趣的区域(ROI)进行进一步分析。

用于医学成像分割任务的一种流行的深度学习架构是 U-net%e5%92%8c%5bTiramisu%5d(https://arxiv.org/abs/1611.09326.pdf) 。原始架构有许多变化,包括我们使用的包含 VGG16 预训练编码器的架构。

基于 U-net 的肺部分割架构[图片由作者提供]

为了进行训练,我们使用了 6150 个肺部异常病例的 CT 切片及其相应的肺面罩。使用表示肺组织的[-1000,0] HU 的窗口对输入切片进行剪辑(意味着所有大于 0 的值都被设置为 0,所有小于-1000 的值都被设置为-1000)。然后,我们将像素归一化到范围[0,1],并将图像大小调整为 224x224 像素。

剪切和归一化 CT 切片的代码示例:

我们使用随机裁剪、水平翻转和向肺部区域添加正态分布噪声来扩充数据,以提高对感染性肺部(这在新冠肺炎患者中很常见)的分割的鲁棒性。

将噪声添加到肺部区域作为增强(噪声标度=0.1,噪声均值=0.0,噪声标准值= 0.8)[图片由作者提供]

向图像添加正态分布噪声的代码示例:

这里我们使用了一个私有数据集,但是有几个 CT 扫描的公共数据集,都有相应的肺掩膜( LUNA16肺部 CT 分割挑战 2017StructSegMedSeg )。MedSeg 是为新冠肺炎病人准备的。

3.新冠肺炎分类器

由于我们已经决定使用 2D 切片,并且由于我们没有注释来解决分类任务,我们手动将 50 个病例的每个切片注释为正常或异常,这意味着它包含新冠肺炎感染(因为感染在连续切片中可见,这不是一个非常复杂的注释任务!).使用这种方法,我们设法收集了 1865 个 CT 切片的注释数据集:1036 个正常,829 个异常。
为了进一步丰富我们的训练集,我们采用了数据增强技术,包括图像旋转、水平翻转和裁剪。然后,我们使用上文详述的肺部分割来裁剪肺部 ROI,并将每个输入图像的大小调整为 224X224 像素,以基于在 ImageNet 数据库上预训练的 ResNet-50 架构来训练每个切片的新冠肺炎分类器。使用迁移学习通常可以提高分类性能,尤其是在训练数据有限的情况下。
由于 ImageNet 分类任务包括 1000 个类别,而我们只需要对 2 个类别进行分类,因此我们移除了预训练模型的最后几层,并添加了两个密集层,然后添加了一个 sigmoid 激活函数。

加载预训练 ResNet-50 架构并修改最后几层以适应新分类任务的代码示例(使用 Keras):

4.细粒度本地化

如何输出 汉化 地图带 无标注
Grad-CAM 技术深度学习中最常用的解释方法之一(旨在可视化“网络在看”哪里,以对特定目标进行分类)。在医学图像中,这种技术通常用于弱监督定位甚至分割,其中仅通过正常与异常的切片标签来进行监督,以生成定位热图图像。

使用 CAM 技术生成的热图图像示例,用于 X 射线图像中的病理定位。来源: Rajpurkar,Pranav 等人(2017)

在 GradCam 生成粗略定位图的同时,我们在两种图像分辨率上采用该技术,并在它们之间进行融合,以生成新冠肺炎感染区域的精细定位图。更具体地说,我们在对应于 ResNet-50 网络的大小为 14X14 和 28X28 的分辨率的激活层上使用 GradCam(在这些分辨率的最后激活层上定义 GradCam 输出)。

这两个贴图被归一化为[0,1]并调整为输入图像形状(224X224)。我们将两个图相乘以生成一个细粒度的定位图,它可以作为热图图像应用于彩色图像:

融合两种分辨率图像的 GradCam 精细定位:热图显示肺部新冠肺炎感染区域的高活性[图片由作者提供]

5.案例决策和 3D 概述

在我们为每个 2D 切片生成肺部分割和新冠肺炎定位图之后,我们可以将所有切片的这些结果组合起来,以获得该病例的完整 3D 体积概览。为了将不同切片的定位图融合成平滑的视图,我们应用阈值来获得新冠肺炎感染分割,并使用 3D 高斯模糊。

使用 matplotlibskim age . measurepython 库可以在肺部和感染部位生成三维绘图图像:

为了结束病例级分类,我们计算了新冠肺炎分类器检测为阳性的切片数量和属于肺部区域的切片数量。如果它们之间的比率超过预定义的阈值(根据最佳表现设置),则整个病例被分类为疑似新冠肺炎。

用于监测患者疾病进展的 Corona 评分。资料来源: O. Gozes 和 M . Frid-Adar 等人(2020 年)

我们还提出了一个严重性评分,允许医生随着时间的推移跟踪患者的新冠肺炎病——“电晕评分”。通过由新冠肺炎分类器对阳性检测切片的定位图上求和,并乘以切片像素间距(z 轴)来计算分数。电晕得分是以厘米为单位的体积测量。

参考文献

[1]https://radiopaedia.org/articles/computed-tomography?lang=us

[2] O .龙内贝格、p .菲舍尔和 t .布罗克斯。 U-net:用于生物医学图像分割的卷积网络%e5%92%8c%5bTiramisu%5d(https://arxiv.org/abs/1611.09326.pdf) (2015)。医学图像计算和计算机辅助介入国际会议。

[3] M. Frid-Adar 等人使用带有 imagenet 预训练编码器的 u-net 改善胸部 x 光照片中解剖结构的分割 (2018)。运动器官、乳房和胸部图像的图像分析。施普林格,查姆,2018。159–168.‏

[4] K. He 等用于图像识别的深度残差学习 (2016)。IEEE 计算机视觉和模式识别会议录。

[5] RR。Selvaraju 等人 Grad-cam:通过基于梯度的定位从深度网络进行视觉解释 (2017)。IEEE 计算机视觉国际会议论文集。

[6] O. Gozes 等人冠状病毒(新冠肺炎)疫情的快速人工智能开发周期:使用深度学习 ct 图像分析进行自动检测的初步结果&患者监测 (2020)。arXiv 预印本 arXiv:2003.05037。

提出的新冠肺炎检测和定位方法是作为我作为算法开发负责人工作的 RADLogics 的初始工具开发的。

这是我的第一个媒体博客——希望你喜欢!【maayan.frid@gmail.com】随时给我写信

揭示美国巨大鸿沟的开源新冠肺炎仪表板——第二部分

原文:https://towardsdatascience.com/covid-19-dashboard-1910df63f14e?source=collection_archive---------48-----------------------

基于约翰·霍普斯金大学的数据(最后更新于 2020 年 4 月 14 日)用新的开源代码生成了一张美国新冠肺炎互动地图

为什么基于地区、数据驱动的决策有理由开放全球最大的经济体——为什么位于的迪凯特是当前的 COVID 热点,而加州的旧金山却不是

“我们相信上帝,所有其他人都必须带来数据。”—w·爱德华兹·戴明

问当前的问题是:在数周的封锁后,我们何时以及如何开放这个国家,以减缓新冠肺炎的蔓延?缓解措施有效吗?从目前的数据中我们可以了解到什么?为了回答这个问题,可视化数据非常重要,它能让我们更好地了解我们生活的这个疫情时期的事态。约翰·霍普斯金·新冠肺炎仪表板在展示新型冠状病毒的传播方面给人留下了非常深刻的印象,但我注意到了两个大缺陷。

  • 它没有显示病例数随时间的增长
  • 一个地区的确诊病例或死亡人数与其人口规模无关

诚然,像加利福尼亚州的圣弗朗西斯科、伊利诺伊州的芝加哥和 T21 这样的大城市,由于人口众多,自然会有更多的新冠肺炎病例,而不是像阿拉巴马州的农村地区或印第安纳州的农村地区。较低的病例数或报告的死亡数是否是回答我们在个别地区很好地控制这种病毒的完整措施?答案是没有。为了看到数据所说的,人们必须在他们的仪表板中考虑当地人口。因此,我使用 python 编写了一个软件代码来分析和呈现新冠肺炎数据,并使用 GitHub 的代码库平台使其免费可用【我在本系列文章的第一部分中发布了关于该软件的所有内容】。

图 1 :交互式新冠肺炎仪表盘显示了美国各县新冠肺炎死亡人数的历史和地理增长。气泡的大小代表每百万人口的死亡人数,颜色代表新冠肺炎县的死亡率

图 1 展示了提议的新新冠肺炎仪表板的重要特征。您可以与历史上任何时间点的数据进行交互,并查看病例数在几天或几周内的增长情况。您可以将鼠标悬停在感兴趣的特定区域上,查看那里的 COVID 案例的详细统计数据。气泡的大小和颜色包含了关于病例数或死亡数(用该县的人口数标准化)以及该地区死亡率的重要信息。

那么可视化热点需要考虑哪些重要因素呢?

由于缺乏广泛的检测,确诊病例数低于受病毒影响的总人数。因此,不幸的是,死亡人数是衡量这种传染病传播的更可靠的方法。本文中考虑的数据分析的重要因素有:

  • 人均 死亡人数 全县
  • 人均 确诊 冠状病毒病例
  • 死亡率 :每 100 例确诊病例死亡人数
  • :3 天确诊病例数增长
  • 天数 自首例确诊病例

如果某个特定县的死亡率很高,这意味着要么对受病毒影响的真实人口进行了总体漏报,要么表明该县的医疗系统面临潜在的严重压力,要么该县有相当大比例的弱势人口因病毒而患重病。另一方面,一个地方最糟糕的一天还在后头,如果是确诊病例的 增长率 高于全国平均水平。自第一例病例以来的 天数 显示了一个特定的县在其独特的病毒传播轨迹中所处的位置。通常随着一个县的发展,曲线变平的时间越长,距离第一个案例的时间就越长。因此较低的死亡率、较低的增长率和自第一例病例以来比全国平均水平多的天数意味着一个社区比美国的许多其他社区做得更好 为了重开经济,一个基于区域的数据驱动的决策预计会考虑所有这些因素。**

美国的新冠肺炎热点在哪里?

本文图表最后更新于 2020 年 4 月 14 日

基于每百万人口死亡人数的美国各县排名揭示了美国在抗击疫情方面的分歧。两张图片显示了美国各县是如何应对疫情的。

图 2 :基于每百万人口死亡人数的美国新冠肺炎热点地区(截至 2020 年 4 月 14 日)

图 3 :基于每百万人口确诊病例的新冠肺炎热点(截至 2020 年 4 月 14 日)

表 1 :美国新冠肺炎热点县,按人均死亡人数排名(截至 2020 年 4 月 14 日)

图 2 ,是一个geo-scatter图,其中每个气泡代表美国的一个县。气泡的大小表示每百万人口中死亡人数,气泡的颜色表示 死亡率 死亡率。最大的泡沫遍布美国东海岸和中西部地区。令人惊讶的是,美国西海岸各县的死亡人数相对于其人口数量要少。当地各县的死亡率差异很大。****

图 3 ,也是geo-scatter,但气泡大小代表 确诊 病例相对于该县人口的数量,颜色代表*比率,即过去 3 天报告的新型冠状病毒病例的快慢。在 确诊 病例的geo-scatter中可以看到美国大分水岭,如图图 2* 所示。美国东部和中西部地区受到疫情的重创,而西海岸相对较好地遏制了疫情。基于确诊病例*南达科他州科罗拉多州俄克拉荷马州密西西比州路易斯安那州佐治亚州佛罗里达州狭长地带。分散在中西部和山区的一些地区,确诊病例的数量每 2 到 3 天翻一番。***

表 1 按百万分之死亡人数降序排列了至少有 500 人和 3 例 COVID 死亡的美国县。不足为奇的是,纽约州的 T42 是受这种病毒打击最严重的县,每百万人口中有将近 1400 人死亡。随着 死亡率 率约为 7 %(美国平均报告死亡率为 4.2%) 纽约,NY 可能仍有大量未报告的冠状病毒感染病例。随着~110k 确诊 病例于 4 月 14 日(本文日期)纽约于其第 45-日标志以来第一例 COVID 病例在那里出现。******

令人惊讶的是,像佐治亚州埃尔勒尔县这样的地方。,格里尔县,OK。路易斯安那州比恩维尔县。堪萨斯州科菲县。亚拉巴马州钱伯斯县。位于印第安纳州迪凯特县。根据每百万人口中的死亡人数,美国排名前 30 的热点城市有。令人惊讶的是,一些人口密度高的大城市地区,如伊利诺伊州的芝加哥或加利福尼亚州的旧金山,在处理这场危机中表现相对较好。这张表显示的是美国印第安纳州的迪凯特县。在这个疫情的中心,每百万人口中有 375 人死亡,自从第一个病例出现以来,在第 23-天。这一统计数字堪比在受灾严重的密歇根州韦恩县(底特律,密歇根州)每百万人中有 460 人死亡以及在其第 36-日以来的首例。****

那么到目前为止,加州和华盛顿的情况如何?

表 2 :加利福尼亚州的新冠肺炎热点县,按每 100 万人口中的死亡人数排名

因此,为了知道西海岸各州是否真的做得更好,我用类似的标准列出了*【人口】中死亡人数加州 ( 表 2 )和华盛顿州 ( 表 3 )的县。挑出这两个州背后的合理性来自于这样一个事实,即新冠肺炎在美国的爆发首先发生在华盛顿州的西雅图和加利福尼亚州的旧金山附近的县。*****

在加州,马林、洛杉机、圣克拉拉等县仍然高居加州之首,每百万人中有 27 至 38 人。自从那里出现第一例病例以来,在 85 天内,洛杉矶县每百万人口中约有 35 人 死亡。确诊病例增长率为每三天 1.12。旧金山湾区的各县在遏制疫情方面做得相对较好,在第一例病例出现后的第 75-天,每百万人中有 17 至 38 人。与美国中西部的农村地区相比,这一数据显示旧金山在减轻新冠肺炎方面做得更好。************

表 3 :佤邦的新冠肺炎热点县,按每 100 万人口的死亡人数排列

当华盛顿州金县的一家疗养院报告冠状病毒爆发时,全国首次开始关注新冠肺炎。如今,每百万人中约有 131 人死亡,死亡率约为 6%。这在华盛顿州排名第二。这里的情况可能是,大量老年人集中在一个县,导致高于平均水平的死亡率。****

【更多未来分析将基于读者的兴趣和反馈】……

用于重新生成仪表板和分析新冠肺炎数据的开源代码片段

与仪表板互动对于真实感受每个县在抗击疫情中所处的位置非常重要。下面是代码片段,让您生成相同的分析,并与图 14 中显示的仪表板进行交互。****

首先克隆 git 存储库

使用 Google 的合作实验室很容易用简单的代码片段克隆我的 GitHub 和所有的依赖项。

****# Clone repository*
!git clone https://github.com/sidbannet/COVID-19_analysis.git
%cd ./COVID-19_analysis
!git submodule init
!git submodule update --remote***

在 python 控制台中加载包和工具

克隆存储库后,使用 Jupyter Notebook 的单元:

  • 导入分析类
  • 导入绘图工具
***# Import nessesary modules*
**from** **tools** **import** collection **as** cll
**import** **plotly.tools** **as** **tls**
**from** **plotly.offline** **import** iplot
**import** **plotly.express** **as** **px****

解析数据

代码是使用面向对象的编程风格编写的。因此对象d被定义为包含分析所需的所有方法和属性。

  • 定义一个对象d(你可以在这里命名任何其他名称)作为类cll.DataClass()的实例
  • 使用d.parse()和一个受保护的方法d._parse_timeseries_()解析数据
  • df_us包含解析数据的 panda DataFrame 是否是以后用于仪表板的必要可视化数据
***# Setup data class and parse the database* 
d = cll.DataClass() 
d.parse()
d._parse_timeseries_() 
df_us = d.df_geo_us**

获取动画仪表板

由于与马萨诸塞州杜克斯和楠塔基特县人口规模相关的数据库中的错误,我们做了一个小的更正。

**df_us.Population.values[cll.np.where(df_us.Key == 'Dukes and Nantucket,Massachusetts,US')] = 17352

df_us.Number_Cases_per_1mil.values[cll.np.where(df_us.Key == 'Dukes and Nantucket,Massachusetts,US')] = \
    df_us.Confirmed.values[cll.np.where(df_us.Key == 'Dukes and Nantucket,Massachusetts,US')] \
    / df_us.Population.values[cll.np.where(df_us.Key == 'Dukes and Nantucket,Massachusetts,US')]

**for** inum, value **in** enumerate(df_us.Number_Cases_per_1mil.values):
    df_us.Number_Cases_per_1mil.values[inum] = cll.np.floor(value)# Get the time string for plotly functionality
date_time = [str(date) **for** date **in** df_us.Date]
date_str = [str.split(date, ' ')[0] **for** date **in** date_time]
df_us.Date = date_str**
  • 使用plotly获得动画仪表盘
**fig = px.scatter_geo(df_us,
                     lat="Lat", lon="Long",
                     color="Rate",
                     color_continuous_scale='jet', range_color=[1.0, 2.0],
                     hover_name="Key",
                     hover_data=['Population', 'Confirmed', 'Death'],
                     size="Number_Cases_per_1mil",
                     animation_frame="Date",
                     title='Confirmed Cases per 1 mil population',
                     size_max=int(4000000),
                     width=2000, height=1000,
                     scope = 'usa',
                     projection="albers usa")
fig.show()**

这将显示基于每个县确诊病例的交互式仪表板(图 4 )。

图 4 :交互式新冠肺炎仪表盘,显示美国各县新冠肺炎病例的历史和地理增长情况。气泡的大小代表每百万人口的确诊病例数,颜色代表新冠肺炎的本地增长率

要获得类似的仪表板(图 1 ),但报告了 COVID 的死亡,请在单元格中使用以下代码片段:

***# Doing some pre-analysis*
df_us['Norm_Death'] = (df_us.Death / (df_us.Population + 0.0001)) * 1e6fig = px.scatter_geo(df_us,
                     lat="Lat", lon="Long",
                     color="Mortality",
                     color_continuous_scale='jet', range_color=[1.0, 10.0],
                     hover_name="Key",
                     hover_data=['Population', 'Confirmed', 'Death'],
                     size="Norm_Death",
                     animation_frame="Date",
                     title='Deaths per million in county',
                     size_max=int(8000000),
                     width=2000, height=1000,
                     scope = 'usa',
                     projection="albers usa")
fig.show()**

开源新冠肺炎仪表板 GitHub 要点

**** [## 通过我的推荐链接加入 Medium 悉达多·班纳吉博士

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

medium.com](https://medium.com/@sidbannet/membership)****

新冠肺炎仪表板

原文:https://towardsdatascience.com/covid-19-dashboard-b7f8b7c59431?source=collection_archive---------16-----------------------

我使用 Dash 构建了一个基于 web 的仪表板来可视化疫情

被困在付费墙后面?点击这里阅读完整的故事和朋友链接!

我是 Greg Rafferty,湾区的数据科学家。这个项目的代码可在我的 GitHub 和仪表板在https://covid-19-raffg.herokuapp.com/现场。

我用 Python 和 Dash 构建了一个 web dashboard,图表用 Plotly 制作。数据由约翰霍普金斯系统科学与工程中心提供,并在太平洋时间每晚 5:30 自动更新到仪表板上。

焦点选择

仪表板可以在全球范围内设置在疫情上,或者通过顶部的单选按钮集中在美国或欧洲:

此按钮更改每个显示图表的基础数据,以反映选定的区域。

每天晚上大约 5 点,约翰霍普金斯大学用当天的新病例更新他们的数据源。我的仪表板自动运行一个 ETL 脚本来下载新数据,将其处理成仪表板要求的格式,并上传到 Heroku。这里的标题声明了数据最近更新的时间。

组件

仪表板有五个主要组件:指标、所选区域的感染率、按子区域的病例分析、感染图和轨迹图。

指示器

共有四个指标,每个指标都由红色的当前值和绿色的与昨天相比的百分比变化组成。

  • 累计确认是所选地区所有检测并确认病例的累计总数。
  • 当前活动仅测量今天活动的案例。它被计算为ACTIVE = CONFIRMED — DEATHS — RECOVERED
  • 迄今死亡人数衡量所有新冠肺炎相关死亡人数的累计总数
  • 痊愈病例是指患者被认为已经从疾病中康复,不再被感染或传染的病例数。

传染病

感染图表按日期显示所选地区的CONFIRMEDACTIVERECOVEREDDEATHS的总数。将鼠标悬停在图表上,将显示特定日期的每个指标的计数。使用鼠标,您可以放大和缩小,或者单击并拖动以选择要放大的框。此外,将鼠标悬停在图表(或控制面板上的任何图表)上,可以看到图表右上角的几个控制按钮。每个图表的选项略有不同,但特别有用的是将图表重置回原始缩放级别的能力。

按分区域分列的案例

病例图形按CONFIRMEDACTIVERECOVEREDDEATHS子区域显示折线图,可通过图表下方的单选按钮进行选择。如果选择的地区是WorldwideEurope,显示的子地区是国家。如果选择的区域是United Sates,则子区域是状态。悬停时,将为鼠标悬停的子区域显示所选指标的准确计数。

默认情况下,它显示创建该仪表板时特别感兴趣的子区域。底部的下拉栏允许您选择不同的子区域进行显示,可以是WorldwideEurope焦点所在的国家,也可以是United States焦点所在的州。在下拉栏中输入将允许您搜索子区域。

与此仪表板上的其他两个折线图一样,单击图例中的某个项目会暂时从图表中删除该项目。再次点击会将其添加回去。双击一个项目将删除所有其他项目,并隔离图表上的单个项目。再次双击将添加回所有项目。

感染地图

感染图在每个子区域上都有一个圆形标记。标记的大小与该子区域内CONFIRMED病例的平方根相关,颜色表示前 7 天内新确诊病例的百分比。从本质上来说,标记的大小是衡量自爆发开始以来该次区域内有多少人感染了该病毒,颜色是衡量该病毒目前的活跃程度,深红色表示该病毒正在积极传播,白色表示它已得到控制。将鼠标悬停在一个标记上,将显示国家名称和这两个度量的确切值。与其他图表一样,地图可以缩放和拖动。图表下方是控制地图显示数据的日期的滑动条。默认情况下,它被设置为最近的可用日期,但通过向左拖动,您可以看到疫情随时间的分布。

轨迹

该图表显示了疫情在子区域内的轨迹。x 轴按子区域显示累计确认数,y 轴显示上周确认的案例数。通过这种可视化,一旦某个次区域在某种程度上成功控制了疫情,该线应该会突然下降,如图中的中国(绿色)和南朝鲜(橙色)所示。虽然date不在任何一个轴上,但数据仍然按日期绘制;将鼠标悬停在任一行上将显示该数据点的记录日期。此外,底部的日期滑块也控制这个图表;因此,随着地图的出现,轨迹随时间的变化可以被观察到。

新冠肺炎数据收集:Python 和 API 的故事。

原文:https://towardsdatascience.com/covid-19-data-collection-a-python-api-story-347aafa95e69?source=collection_archive---------33-----------------------

图像来源

本文将简要讨论使用 python 从 API 收集数据。这方面的议程如下。

  1. 使用 python 连接 API
  2. 将收集的数据解析为 CSV 格式
  3. 一点点蟒蛇熊猫的味道

API-应用编程接口:

假设你想在你的程序中使用其他网站数据。你有不同的选择。你可以使用 BeautifulSoup 和 Scrapy 来抓取网站,也可以使用一个界面来帮助你和你的程序交流。那个接口就是 API。

更详细地说,如果网站有 API,你可以将你的 connect 应用程序连接到互联网,它会将数据发送到服务器。然后,服务器检索数据,并根据您的应用程序执行某些操作。这主要是通过 API 实现的

那么安全问题呢?

现代 API 具有多层安全特性。当您的应用程序向服务器发送请求时,当目标网站发送响应时,它们永远不会完全暴露在互联网上。这两种通信都是通过小数据包和按需共享的信息进行的。这是如此的可信,以至于很多大公司都是通过 API 来获得收入的。下面是关于 API 为什么有用的几点。

  1. 现代的 API 遵循 HTTP 和 REST 的标准,对开发人员友好。
  2. 这些不仅仅是一段代码,而且是为特定受众的消费而构建的。
  3. API 的构建遵循适当的安全性、治理。它在 SDLC 中开发,并受到全面监控。

这个博客致力于使用 python 连接一个 API,同时我也会让你知道熊猫库的一些技术。这里我将使用新冠肺炎 API。你可以从 rapid-api 网站得到那个 API。这些人在制作不同的 API 方面做得很好。我会推荐访问网站或者你可以做一个自己用的 API。这个网站的好处是,你可以得到不同编程语言的样本代码。

先决条件:

  1. python 3 的本地开发环境
  2. API URL 和密钥

在这里,密钥被用作第一安全措施来识别所请求的数据是真实的。它用于防止不道德地使用原料药。

让我们开始编码吧。

步骤 1-导入这些必要的库

import json 
import pandas as pd
import requests

步骤 2-获取 API URL 和密钥并发送请求

url = “[y](https://corona-virus-world-and-india-data.p.rapidapi.com/api_india)our url"headers = {
 ‘x-rapidapi-host’: “api host”,
 ‘x-rapidapi-key’: “api token”
 }response = requests.request("GET", url, headers=headers)
print(response)

如果响应为 200,则表示请求成功。

通常,API 有关于 API 细节及其用途的文档。一些 API 服务有 API 包装器,需要安装在你的电脑上才能访问 API。

API 可能包含 JSON、XML 或任何定制格式的数据。为了解析数据,你可以在 python 中使用不同的库。请求和响应头通常包括请求头和密钥。这是关于您使用 API 服务的当前信息。

瞧啊。!!你拿到结果了。

版权所有 Somesh

但是我得到的数据就像一个嵌套的 JSON 数据结构。让我们进一步处理它。

步骤 3-解析 JSON 数据

parsed_data = json.loads(response.text)
print(parsed_data)

版权所有 Somesh

JSON 数据似乎更有条理。但是这些仍然是嵌套形式。让我们来弄平这个 JSON

def flatten_json(json):
   dict1 = {} def flatten(i, name=’’): if type(i) is dict:
         for a in i:
             flatten(i[a], name + a + ‘_’)
      else:
         dict1[name[:-1]] = i flatten(json)
   return dict1df = pd.DataFrame.from_dict(flatten_json(parsed_data), orient=’index’)

flatten_json()将帮助您在单个 json 结构中制作嵌套的 json。

版权所有 Somesh

这个 JSON 很容易转换成 DataFrame。你得到的 csv 格式的数据是一列数字值。你看到的按字母顺序排列的数据实际上是索引。

让我们在数据集中应用一些熊猫技术

  1. 全州确诊病例

版权所有 Somesh

states = [‘Andhra Pradesh’,’Arunachal Pradesh’, ‘Assam’, ‘Bihar’, ‘Chhattisgarh’, ‘Goa’, ‘Gujarat’, ‘Haryana’,
 ‘Himachal Pradesh’, ‘Jharkhand’, ‘Karnataka’, ‘Kerala’, ‘Madhya Pradesh’, ‘Maharashtra’, ‘Manipur’,
 ‘Meghalaya’, ‘Mizoram’, ‘Nagaland’, ‘Odisha’, ‘Punjab’, ‘Rajasthan’, ‘Sikkim’, ‘Tamil Nadu’,
 ‘Telangana’, ‘Tripura’, ‘Uttar Pradesh’, ‘Uttarakhand’, ‘West Bengal’, ‘Andaman and Nicobar Islands’,
 ‘Chandigarh’, ‘Dadra and Nagar Haveli’, ‘Daman and Diu’, ‘Delhi’, ‘Lakshadweep’, ‘Puducherry’,
 ‘Jammu and Kashmir’, ‘Ladakh’]
list1 = []
list2 = []
for i in states:
 list1.append(df.at[‘state_wise_{}_confirmed’.format(i), 0])
 list2.append(i)
df1 = pd.DataFrame(list(zip(list2,list1)), columns=[‘state’,’state_value’])

这将有助于您根据各州获得已确认的案例详情

2 .重置 _ 索引()

df.reset_index()

版权所有 Somesh

此处索引已更改。数据帧中的前一个索引已被转换为列。

3。df.rename()-重命名列名

df = df.rename(columns={“index”: “Statewise_details”, 0 : “Values”})

版权所有 Somesh

4。在[]

print(df.at[4,’Statewise_details’],”:”,df.at[4,’Values’])

at[]可帮助您随时访问单元格值。输出如下所示

total_values_deltaconfirmed : 1370

5。根据状态为治愈、康复、死亡和确诊病例创建单独的数据帧,并将其合并

如果您扩展案例 1 的逻辑(状态确认案例,您将得到以下结果

版权所有 Somesh

你可以使用熊猫来执行不同的操作。稍后,您可以使用 matplotlib、seaborn 和许多其他库和工具来可视化数据。

这个博客是一种收集数据的方式,这些数据在服务器中不断产生。很快我将带着另一个网络抓取的故事回来。

我希望你喜欢自然语言处理第一部分 & 第二部分。在 Medium 关注我,或者订阅我的博客了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @RoutraySomesh 联系。

熊猫数据框架的新冠肺炎数据处理

原文:https://towardsdatascience.com/covid-19-data-processing-58aaa3663f6?source=collection_archive---------2-----------------------

下载、加载、合并、清理和聚合新冠肺炎时间序列数据的分步指南

安东Unsplash 上拍照

几天前我发表了一篇文章,展示了一步一步构建用于探索冠状病毒传播的交互式数据可视化的教程。一些人在上面留下了私人笔记,专门询问数据处理步骤。

今天,我张贴一步一步的教程来下载,加载,合并,清理和汇总新冠肺炎时间序列数据。数据由约翰·霍普金斯大学系统科学与工程中心(JHU·CSSE)提供,他们在 Github 的公共页面上分享了他们的数据。约翰霍普金斯 CSSE 汇总了主要来源的数据,如世界卫生组织、国家和地区公共卫生机构。这些数据免费提供,并且每天更新。

在我们进入细节之前,我想给你看一下新冠肺炎数据处理的最终结果。均为累计数据。新增病例 均为日明智数据。本数据帧按 日期国家/地区 排序。

新冠肺炎数据处理的最终输出

此外,我还要感谢以下项目提供的新冠肺炎数据处理思路:

为什么是数据处理?

数据处理背后的主要原因是数据几乎从来不会以一种对我们来说已经准备好的形式出现。以我个人的经验,花在数据科学项目上的大量时间是在操纵数据上。

让我们来看看新冠肺炎的时间序列数据,

以下是我的一些问题:

  • 确诊死亡保存在不同的 CSV 文件中。这使得我很难在相同的数据可视化中绘制它们。
  • 看一下上面的截图。日期实际上显示为列名,这是非常奇怪的数据形状。
  • 确诊死亡痊愈 因数据缺失不完全匹配,部分国家不上报 痊愈 的省/州级 stat。
  • 其他缺失值、错误数据类型和三艘游轮报告的案例。

本新冠肺炎数据处理教程运行以下步骤:

  1. 从 JHU CSSE 公共网站 Github 页面下载原始 CSV 数据集
  2. 加载原始 CSV 数据集并提取常用日期列表
  3. 将原始确认、死亡和恢复的 CSV 数据合并到一个数据框架中。
  4. 由于缺少值、错误的数据类型和来自游轮的案例,执行数据清理。
  5. 数据汇总:增加一个活动案例列 活动 ,由active_case = confirmed — deaths — recovered计算。将数据聚集到Country/Region wise 中,并按照DateCountry/Region对它们进行分组。之后,加上当日新增 病例新增死亡新增痊愈 减去前一日相应的累计数据。

在数据处理的最后,我将用 Altair 展示 2 个简单的数据可视化以供演示。

逐步下载,加载,合并,清理和汇总新冠肺炎数据

让我们导入我们需要的库

**import pandas as pd
import wget**

1.下载原始数据集

进入约翰霍普金斯 CSSE 公共 Github 页面并导航至csse _ covid _ 19 _ data/CSS _ covid _ 19 _ time _ series/****

单击全局 CSV 数据集,然后单击“原始”按钮获取数据 url。

然后,将这些 URL 保存在一个集合中,并使用wget.download()下载

**# url of the raw csv dataset
urls = [
    '[https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv'](https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv'),
    '[https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv'](https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv'),
    '[https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_recovered_global.csv'](https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_recovered_global.csv')
][wget.download(url) for url in urls]**

一旦下载完成,它应该输出如下,这 3 个文件应该出现在您的工作目录。

**['time_series_covid19_confirmed_global.csv',
 'time_series_covid19_deaths_global.csv',
 'time_series_covid19_recovered_global.csv']**

2.加载数据集并提取日期列表

**confirmed_df = pd
    .read_csv('time_series_covid19_confirmed_global.csv')deaths_df = pd
    .read_csv('time_series_covid19_deaths_global.csv')recovered_df = pd
    .read_csv('time_series_covid19_recovered_global.csv')**

让我们快速看一下数据,例如,confirmed_df.head()显示 93 列。在deaths_dfrecovered_df上应该是一样的

通过运行confirmed_df.columnsdeaths_df.columnsrecovered_df.columns,它们都应该输出如下相同的结果:

请注意,从第 4 列开始,所有列都是日期,以获取日期列表confirmed_df.columns[4:]

3.合并确认,死亡和恢复

在合并之前,我们需要使用melt()将数据帧从当前的宽格式转换为长格式。换句话说,我们把所有的日期列都转换成了值。以下是相关的主要设置:

  • 使用‘Province/State’‘Country/Region’‘Lat’‘Long’作为标识符变量。我们稍后将使用它们进行合并。
  • 用变量列‘Date’和值列 ‘Confirmed’取消透视日期列(如我们之前看到的columns[4:]
**dates = confirmed_df**.columns[4:]**confirmed_df_long = confirmed_df.melt(
    **id_vars=['Province/State', 'Country/Region', 'Lat', 'Long'],** 
    **value_vars=dates,** 
    **var_name='Date',** 
    **value_name='Confirmed'**
)deaths_df_long = deaths_df.melt(
    **id_vars=['Province/State', 'Country/Region', 'Lat', 'Long'],** 
    **value_vars=dates, 
    var_name='Date', 
    value_name='Deaths'**
)recovered_df_long = recovered_df.melt(
    **id_vars=['Province/State', 'Country/Region', 'Lat', 'Long'], 
    value_vars=dates, 
    var_name='Date', 
    value_name='Recovered'**
)**

以上应该返回新的长数据帧。它们都是按 日期国家/地区 排序的,因为原始数据已经按 国家/地区 排序,日期列已经按 ASC 排序。

这里是confirmed_df_long的例子

confirmed_df_long的例子

此外,由于不匹配问题,我们必须删除加拿大的恢复数据(🤷加拿大‍♂恢复的数据按国家统计,而不是按省/州统计)。

**recovered_df_long = recovered_df_long[**recovered_df_long['Country/Region']!='Canada'**]**

之后,我们使用merge()依次合并 3 个数据帧

**# Merging **confirmed_df_long** and **deaths_df_long**
full_table = **confirmed_df_long**.merge(
  right=**deaths_df_long**, 
  how='left',
 **on=['Province/State', 'Country/Region', 'Date', 'Lat', 'Long']** )# Merging **full_table** and **recovered_df_long**
full_table = **full_table**.merge(
  right=**recovered_df_long**, 
  how='left',
 **on=['Province/State', 'Country/Region', 'Date', 'Lat', 'Long']** )**

现在,我们应该得到一个包含ConfirmedDeathsRecovered列的完整表格

包含已确认、死亡和已恢复的 full_table 示例

4.执行数据清理

我们希望完成 3 项任务

  1. 将日期从字符串转换为日期时间
  2. 替换丢失的值NaN
  3. 3 艘邮轮报告的冠状病毒病例应区别对待

您可能已经注意到,新的 日期 列中的值都是具有 m/dd/yy 格式的字符串。要将 日期 值从字符串转换为日期时间,让我们使用DataFrame.to_datetime()

**full_table['Date'] = **pd.to_datetime(full_table['Date'])****

to_datetime()之后的输出

运行full_table.isna().sum()可以检测缺失值NaN

**full_table.isna().sum()Province/State    16198
Country/Region        0
Lat                   0
Long                  0
Date                  0
Confirmed             0
Deaths                0
Recovered          1602
dtype: int64**

我们在 省/州 中发现了很多NaN,这是有道理的,因为许多国家只报告国家级数据。但是 中有 1602 个 nan 被恢复 让我们用0来代替。

**full_table['Recovered'] = **full_table['Recovered'].fillna(0)****

除了缺失值,还有 3 艘邮轮报告的冠状病毒病例:大公主钻石公主MS Zaandam 。由于 省/州国家/地区 随着时间的推移不匹配,需要提取这些数据并区别对待。这就是我所说的:

full_ship的错配问题

这是我们如何提取船只数据。

****ship_rows** = full_table['Province/State'].str.contains('Grand Princess') | full_table['Province/State'].str.contains('Diamond Princess') | full_table['Country/Region'].str.contains('Diamond Princess') | full_table['Country/Region'].str.contains('MS Zaandam')full_ship = **full_table[ship_rows]****

并从full_table中去掉飞船数据:

**full_table = full_table[~(ship_rows)]**

5。数据汇总

到目前为止,所有的 确认死亡恢复 都是来自原始 CSV 数据集的现有数据。我们来添加一个活动案例列 活动 ,由active = confirmed — deaths — recovered计算。

**# Active Case = confirmed - deaths - recovered
full_table[**'Active'**] = **full_table['Confirmed'] - full_table['Deaths'] - full_table['Recovered']****

这里是full_table现在的样子。

接下来,让我们将数据聚集到Country/Region wise 中,并按照DateCountry/Region对它们进行分组。

**full_grouped = full_table.**groupby**(['Date', 'Country/Region'])['Confirmed', 'Deaths', 'Recovered', 'Active']**.sum().reset_index()****
  • sum()是获取给定国家/地区的“确诊”、“死亡”、“康复”、“活跃”总数。
  • reset_index()重置指标,使用默认指标,即 日期国家/地区。

这是full_grouped现在的样子

现在让我们通过扣除前一天相应的累计数据来添加当日明智 新增病例新增死亡病例** 和 新增痊愈病例 。**

**# new cases 
temp = full_grouped.groupby(['Country/Region', 'Date', ])['Confirmed', 'Deaths', 'Recovered']
temp = temp.sum().diff().reset_index()mask = temp['Country/Region'] != temp['Country/Region'].shift(1)temp.loc[mask, 'Confirmed'] = np.nan
temp.loc[mask, 'Deaths'] = np.nan
temp.loc[mask, 'Recovered'] = np.nan# renaming columns
temp.columns = ['Country/Region', 'Date', 'New cases', 'New deaths', 'New recovered']# merging new values
full_grouped = pd.merge(full_grouped, temp, on=['Country/Region', 'Date'])# filling na with 0
full_grouped = full_grouped.fillna(0)# fixing data types
cols = ['New cases', 'New deaths', 'New recovered']
full_grouped[cols] = full_grouped[cols].astype('int')# 
full_grouped['New cases'] = full_grouped['New cases'].apply(lambda x: 0 if x<0 else x)**

最后这里是full_grouped。请注意,这个最终输出是国家级数据

  • 为累计数据。
  • 新增病例新增死亡病例新增痊愈病例 均为日明智数据。
  • 本数据帧按 日期国家/地区 排序。

最后,这里是full_grouped的数据

最后,您可以将这些最终数据保存到 CSV 文件中:

**full_grouped.**to_csv**('COVID-19-time-series-clean-complete.csv')**

数据探索

为了简单起见,让我们使用 Python 数据可视化库 Altair 来创建一些简单的可视化。Altair 是 Python 的声明式统计可视化库,基于 VegaVega-Lite 。Altair 提供了强大而简洁的可视化语法,使您能够快速构建各种各样的统计可视化。

对于 Altair 安装,我强烈建议创建一个新的虚拟环境,因为 Altair 有很多依赖项。然后,激活你的虚拟环境,运行pip install altair vega_datasets来安装 Altair 以及 vega_datasets 中的示例数据集。

关于虚拟环境的教程,可以看看:

** [## 使用“virtualenv”创建虚拟环境,并将其添加到 Jupyter 笔记本中

你是机器学习工程师,正在使用 Python 和 Jupyter Notebook 吗?在这篇文章中,你会看到为什么…

towardsdatascience.com](/create-virtual-environment-using-virtualenv-and-add-it-to-jupyter-notebook-6e1bf4e03415) [## 使用“conda”创建虚拟环境,并将其添加到 Jupyter 笔记本中

你正在使用 anaconda 和使用 Jupyter Notebook 和 Python 吗?在这篇文章中,你将看到如何创建虚拟的…

medium.com](https://medium.com/analytics-vidhya/create-virtual-environment-using-conda-and-add-it-to-jupyter-notebook-d319a81dfd1)

显示总病例和每日病例

首先,让我们导入库,加载数据并选择一个国家,例如英国:

import pandas as pd
import altair as altfull_grouped = pd.read_csv('COVID-19-time-series-clean-complete.csv', **parse_dates=['Date']**)uk = full_grouped[**full_grouped['Country/Region'] == 'United Kingdom'**]

然后,让我们用公共元素创建一个基础图表

base = alt.Chart(uk).mark_bar().encode(
    **x='monthdate(Date):O',**
).properties(
    width=500
)

之后,我们可以使用|操作符水平连接

一段时间内的总确诊人数和总死亡人数

一段时间内每日新增病例和每日新增死亡人数

显示冠状病毒的传播

首先,让我们导入库,加载数据并选择一个国家列表

import pandas as pd
import altair as altfull_grouped = pd.read_csv('COVID-19-time-series-clean-complete.csv', **parse_dates=['Date']**)countries = ['US', 'Italy', 'China', 'Spain', 'Germany', 'France', 'Iran', 'United Kingdom', 'Switzerland']selected_countries = full_grouped[full_grouped['Country/Region']**.isin(countries)**]

选定 _ 国家

让我们创建一个圆形图表来显示当天明智的 新增病例

alt.Chart(selected_countries).**mark_circle()**.encode(
    **x='monthdate(Date):O',**
    **y='Country/Region',**
    **color='Country/Region',**
    size=alt.Size(**'New cases:Q'**,
        scale=alt.Scale(range=[0, 1000]),
        legend=alt.Legend(title='Daily new cases')
    ) 
).properties(
    width=800,
    height=300
)

这是输出

每日新病例圆形图

尽情享受吧!

这篇文章主要是向大家展示如何使用 Pandas 逐步处理新冠肺炎数据。在数据探索部分只有两个简单的例子来演示。

如果你有兴趣学习牛郎星,可以看看下面两篇文章。

[## 用 Altair 实现 Python 交互式数据可视化

用不到 20 行代码创建交互式图表。

towardsdatascience.com](/python-interactive-data-visualization-with-altair-b4c4664308f8) [## 探索冠状病毒传播的交互式数据可视化

使用 Altair 创建不到 30 行代码的交互式复合图表

towardsdatascience.com](/interactive-data-visualization-for-exploring-coronavirus-spreads-f33cabc64043)

大概就是这样。感谢阅读**

新冠肺炎如何改变数据科学工作流程

原文:https://towardsdatascience.com/covid-19-data-science-workflow-f8eea10c77fa?source=collection_archive---------50-----------------------

新冠肺炎正在改变很多事情。数据科学家可以做些什么来充分利用这种情况?

达格正在尽自己的力量对抗新冠肺炎

我是数据科学协作平台 DAGsHub 的创始人之一,这个平台是为不坐在一起的团队设计的。我不打算讨论新冠肺炎和在家工作的一般方面。相反,我将特别关注数据科学家需要在远程有效工作的内容。

当危机开始时,我们的假设是现有用户的使用会因新情况而激增。事情是这样的:

一个月内向 DAGsHub 推送操作的次数

这到底是怎么回事?我们认为我们的测试版有很好的口碑增长和牵引力,但自从冠状病毒以来的增长使它相形见绌,直到它看起来像是零。

我们的用户需要比他们坐在一起时更频繁的项目管理和协作工具。这证明当我们过渡到远程工作时,我们需要改变我们的工具。

远程工作最大的困难是协作和沟通。缓冲& AngelList 报道

这种使用率的上升也可能表明,现在不良实践对团队的伤害比平时更大,导致他们更多地依赖于修复这些问题的工具。

现在,你可能会说—“但这只是推送操作,也许用户只是在平台上添加实验来查看指标并在它们之间进行比较。合作是双向的。”你可能是对的。我们预计拉动行为也会显著增加,尽管这种增加会更加微妙,因为你更经常地创造一个新的实验,而不是复制一个已经完成的实验。

一个月内对 DAGsHub 的拉动操作数量—我们在 2020 年初开始衡量拉动操作

在最近三个月,我们可以看到拉动操作的数量几乎增加了两倍。

让我们深入探讨一下在我看来阻碍我们健康的数据科学合作(尤其是远程合作)的四大问题。这些问题是:

  1. 我们的实验缺乏可重复性
  2. 对我们工作的跟踪和记录不好
  3. 合作者之间难以共享工作
  4. 孤立的工作流助长了独狼心态,从长远来看会损害组织的生产力

以上各点都是相互联系的。

可重复的实验

关于这个话题已经写了很多,贾斯汀·博伊兰-图米(Justin Boylan-too mey)对可再生数据科学项目(reproducible data science project)马修·斯图尔特(Matthew Stewart),博士研究员对机器学习危机的。调试自己的代码有时可能很困难,但是当别人的代码不方便使用时,或者当一些问题可能是由您使用的环境的差异引起时,调试别人的代码是一场噩梦。我们需要以一种集成的方式管理我们的代码、数据、模型和环境的版本,以便尽可能简单地实现可再现性。这会为你自己和你的团队成员节省大量的时间和悲伤。

跟踪和记录您的工作

这是相关的,可能是实现再现性所必需的,但它的意义远不止于此。记录参数和指标可以相当容易地完成,为大多数广泛使用的数据科学库创建了自动记录功能。正确地做到这一点会让你或你的合作者专注于重要的实验,并很容易找到下一个值得尝试的伟大事物。通常,在你记录的实验数据之上会使用一个实验可视化系统。但是要做到这一点,你首先必须记录你的工作。

不是这种木头。照片由艾蒂安·吉拉代Unsplash 上拍摄

共享工作

当人们坐在一起,你在和同事讨论你的工作时,很容易指着你屏幕上的相关部分说“看这里,这就是有趣的地方”。远程工作使这个简单的任务变得更加困难,团队可能会发现自己使用几个不同的工具,它们之间需要手动同步,或者,上帝保佑,通过电子邮件发送链接到上传到 Google Drive 的项目部分。

解决共享工作的最好方法是解决前两个问题。如果我们确保我们有可重复的实验,并正确记录我们的工作,我们需要做的就是确保所有这些工件都上传到中央系统。如果是这样的话,每个实验的最后一步就是将结果发送到平台上。这样做给你一个中央网络用户界面,在那里每个人都可以谈论相同的事情,创造一种共同的语言,分享变得像告诉一个合作者git pull到他们的系统一样容易。

孤立的工作流

最后一个问题可能是最困难的,即使我们坐在一起,这个问题也会渗透到数据科学工作中——独狼心态。这个问题与其说是技术问题,不如说是心理问题。我们专注于自己的工作,以团队的生产力和解决真正困难问题的能力为代价。在许多情况下,前面提到的问题导致了一个恶性循环,其中工具阻止了协作,这反过来促进了独狼心态,导致没有开发协作工作流。

照片由塔霍Unsplash 上拍摄

没有工具来支持协作工作流的团队将会更加强烈地感受到孤狼心态的负面影响。

好消息是,如果你解决了前三个问题,你就在解决最后一个问题上取得了重大进展。您可以为每个问题分配多个人,或者分配需要互相检查工作或在问题出现时进行咨询的小组。

也就是说,上面提到的工具是必要的,尽管并不总是足够的。团队合作是困难的,有些问题需要艰难的组织文化变革,比如更加关注过程和沟通。建立支持协作工作流所需的系统使得解决这些难题变得更加容易。

用 DAGsHub 解决远程数据科学问题

您可以使用开源工具来实现可重复性,或者创建您自己的标准(尽管不推荐后者),以及用于实验跟踪的工具。但你不必。DAGsHub 使用 Git 和 DVC 进行版本控制,将可视化 UI 与实验跟踪相结合来管理数据版本。

当你创建可重复实验时,你可以比较指标,搜索超参数和更多。使用 DAGsHub 实验追踪不一定要用 DVC,它们互为补充,完全模块化。我们使用开源工具和开放格式,因此您永远不必担心黑盒解决方案和供应商锁定。

DAGsHub 对每个人完全免费,以促进科学合作和对抗冠状病毒危机。我们希望能够帮助团队轻松过渡到远程工作,并了解如何在远程数据科学环境中成功工作。

关于新冠肺炎项目的最后一句话

我们在 DAGsHub 的首要目标是支持开源数据科学社区。如果您正在从事新冠肺炎数据科学项目,我们很乐意在云基础设施或任何其他方面提供帮助。我们的能力有限,但如果这与您相关,请通过covid@dagshub.com联系我们!

感谢 盖伊·斯莫伊洛夫*阿米尔·谢瓦特 Siim 出纳员 对撰写这篇作品的帮助。*

用 Plotly 实现数据可视化:新冠肺炎数据集

原文:https://towardsdatascience.com/covid-19-data-visualisation-with-plotly-d1c96423942e?source=collection_archive---------36-----------------------

用新冠肺炎数据绘图的初学者方法。居家周末项目。

新冠肺炎传播的时间间隔为 2020 年 7 月 27 日。使用 Plotly 创建。

在数据科学和 Python 的自学之旅中,我被大量每秒都在发展的资源淹没了。这些都是非常重要的信息来源,我们很幸运能够获得如此丰富和免费的知识资源。

然而,有时你只需要后退一步,通过学习、分享和成长来关注基础。这篇文章正是关于这一点。一个非常基本和简单的使用新冠肺炎数据的可视化方法,这是我在家复活节假期项目的一部分!正如我的一位导师曾经对我说的那样:“……如果你想永不停止学习,就试着教你所知道的……”

这里我将只分享两件事,首先是用于绘图的基本编码,其次是参考文档的 T2,这样你就可以去实验了。

在我进入编码部分之前,我只想澄清一下,这篇文章只是作为一个教育项目。因此,我根本没有试图计算疫情的任何死亡率、增长率或存活率。因为我们都在一起,所以非常重要的是,这种敏感信息的计算和共享要非常谨慎,最好使用适当的领域知识来处理。关于新冠肺炎的任何观点或信息,请参考真实的信息来源。

那是关于什么的:

简单地说,“Plotly 是一个交互式的、开源的、基于浏览器的 Python 图形库”。它带有各种看起来很酷的图表类型(条形图、散点图、地理图等)。)而且我个人觉得它非常用户友好,有大量易于理解的文档。强烈建议您在https://plotly.com/python/上构建任何代码时都要仔细阅读。

首先安装相关的库:

!pip install plotly_express==0.4.1
import plotly.express as px
import plotly.graph_objects as go #for calling graph objects from plotly library.

我使用了来自 https://data.humdata.org/的新冠肺炎案例数据,并由约翰·霍普金斯大学系统科学与工程中心(JHU·CCSE)编辑。使用各种技术将数据简化为以下几列。请注意,我假设这是一个基本的 Python 技能。

转换成简单形式的数据

在上面的数据中,x =日期,y =感染,z=死亡,w=康复。现在 y-z-w 也给了我们一些活跃的案例,只是为了在本文的条形图上进行演示。

我们使用 go.figure()函数(通常作为“go”导入)来调用 Plotly 中的绘图对象。在 Plotly 图形对象中,我们可以将其分为两类:轨迹和布局。然后在轨迹和布局中有进一步的属性来定义我们的图表。请务必参考https://plotly.com/python/reference/中的所有属性列表,然后使用它们。

条形图

为了覆盖条形图,我使用了 Plotly 的 go.figure()函数来调用图表对象,然后添加了更多的条形图轨迹(针对我的数据中的每一列),并将它们层叠在图表上:

***#call Bar charts and assign to fig_t. Add traces to the same figure***
fig_t = go.Figure(go.Bar(x=x, y=y, name='Total Infected', marker_color='indianred', opacity=.8))
fig_t.add_trace(go.Bar(x=x, y=y-z-w, name='Total Active', marker_color='mediumblue', opacity=0.7))
fig_t.add_trace(go.Bar(x=x, y=w, name='Total recovered', marker_color='lightseagreen', opacity=0.8))
fig_t.add_trace(go.Bar(x=x, y=z, name='Total deaths', marker_color='gray', opacity=1))***#here we define layout of the chart***
fig_t.update_layout(barmode='overlay', xaxis={'categoryorder':'total ascending'},xaxis_type='category',
                  title={
        'text': 'Cummulative COVID-19 world trend',
        'y':0.79,
        'x':0.45,
        'xanchor': 'center',
        'yanchor': 'top'},)
fig_t.update_xaxes(title= '----->Timeline' ,showline=True)
fig_t.update_yaxes(title= '----->Number of cases', showline=True)
fig_t.show()

输出:

交互式图表。请注意,如果你改变了上面代码中的轨迹类型,你可以添加线条、散点等。在同一块土地上。

线条和标记

为了分析案例数量的每日变化,我简单地对上面的累积数据使用了 diff()函数。现在,为了以不同的方式进行演示,这里使用了“线”轨迹:

***#call Line charts and assign to fig_inc. Add traces to the same figure***
fig_inc = go.Figure(go.Line(x=df_diff['Dates'], y=df_diff['Total_infected'],name='Infected', mode='lines+markers',marker=dict(size=10,color='indianred')))
fig_inc.add_trace(go.Line(x=df_diff['Dates'], y=df_diff['Total_recovered'],name='Recovered', mode='lines+markers',marker=dict(size=10,color='lightseagreen')))
fig_inc.add_trace(go.Line(x=df_diff['Dates'], y=df_diff['Total_deaths'], name='Deaths', mode='lines+markers',marker=dict(size=10,color='gray')))
fig_inc.add_trace(go.Line(x=df_diff['Dates'], y=df_diff['Active'], name='Active', mode='lines+markers',marker=dict(size=10,color='Orange')))***#here we define layout of the chart***
fig_inc.update_layout(xaxis_showgrid=True, yaxis_showgrid=True, plot_bgcolor='whitesmoke', 
        title={
        'text': 'Incremental COVID-19 world trend',
        'y':0.75,
        'x':0.5,
        'xanchor': 'center',
        'yanchor': 'top'},xaxis_type='category')
fig_inc.update_xaxes(title= '------>Timeline' ,showline=False)
fig_inc.update_yaxes(title= '------>Number of incremental cases', showline=False)

fig_inc.show()

输出:

带有各种分析选项的交互式折线图。

动画地理散点图

让我成为 Plotly 粉丝的最酷的特性之一是它易于使用的动画。你真的不需要做很多编码来制作一个简单的地图动画,就像上面视频中分享的那样。您可以通过文档了解许多内置特性。

对于这一个,我导入了 Plotly Express(作为“px”),这是 Plotly 自带的一个接口。这适用于他们称之为“整齐”或“狭窄”的数据,适用于 pandas 数据帧、列表、numpy 数组、Pandas 系列等。

同样,图形对象和布局的基本原理是相同的。但是,在这种情况下,布局属性是在配置中详细定义的,并且可以更改。请参考https://plotly.com/python/reference/#layout-sliders和不同的属性,看看它如何改变地图。

上面分享的视频基本上是新冠肺炎传播的延时,使用了来自我上面分享的同一个 JHU CCSE 数据源的窄数据形式。

***#call scatter_mapbox function from px. Note the attributes especially normalisation of data and maximum maker size. The animation is done on Dates.***
fig_map = px.scatter_mapbox(df_map, lat="Lat", lon="Long",     color="Infected", size=df_map['Norm']**0.5*50,
                color_continuous_scale="Rainbow", size_max=50, animation_frame='Date',
                center=dict({'lat': 32, 'lon': 4}), zoom=0.7, hover_data= ['Country'])***#here on wards various layouts have been called in to bring it in the present shape***
fig_map.update_layout(mapbox_style="carto-positron",width=900,
    height=700)
fig_map.update_layout(margin={"r":0,"t":0,"l":0,"b":0})***#update frame speed***
fig_map.layout.updatemenus[0].buttons[0].args[1]["frame"]["duration"] = 200**#update different layouts**
fig_map.layout.sliders[0].currentvalue.xanchor="left"
fig_map.layout.sliders[0].currentvalue.offset=-100
fig_map.layout.sliders[0].currentvalue.prefix=""
fig_map.layout.sliders[0].len=.9
fig_map.layout.sliders[0].currentvalue.font.color="indianred"
fig_map.layout.sliders[0].currentvalue.font.size=20
fig_map.layout.sliders[0].y= 1.1
fig_map.layout.sliders[0].x= 0.15
fig_map.layout.updatemenus[0].y=1.27
fig_map.show()

输出:

正如你在上面看到的,我已经调整了滑块的 x 和 y 位置,以随机选择图表上重叠的日期(即当前值)。

希望您喜欢 Plotly 的简要概述,以及如何使用它创建一些简单但看起来很酷的图表。

新冠肺炎数据可视化:跟踪移动和人口趋势

原文:https://towardsdatascience.com/covid-19-data-visualization-tracking-movement-and-demographic-trends-de8e30aeb140?source=collection_archive---------21-----------------------

构建 D3 Chloropleth 地图,调查人口统计和社会距离如何影响各县病例数的增长。

由 Sammy Stolzenbach,Sook-Hee Evans 和 sejal Dua
T2 制作的❤点击这里来玩吧!

动机

这学期,我在塔夫茨大学上了一门叫数据可视化的课。这是我迄今为止最喜欢的课程之一,因为它教会了我如何创造一个欺骗性的形象,更重要的是,如何创造一个有效的形象。

对于我们在数据可视化方面的最终项目,我们得到了你可能想象得到的最开放的规范。本着不扼杀任何辉煌的创造性火花的精神,我们被告知要用我们希望产生的任何数据集或可视化来击倒自己。这是一个“你投入什么就得到什么”的项目。

我的团队一致认为,我们希望承担一些雄心勃勃的事情,我们也希望做一些可以为他人所用的事情。我们决定围绕新冠肺炎社交距离数据来设计我们的项目,因为,嗯,它感觉非常热门,因为它是当时每个晚餐谈话的主题,几乎是我们脑海中唯一的事情。话虽如此,我们一致同意,必须为这个世界提供一些似乎没有人在做的独特的东西。我们想做一些新奇的事情,挑战我们作为程序员和普通人试图理解这些前所未有的时代。

已经有很多很棒的网站和追踪器了。约翰·霍普金斯大学有一个很棒的新冠肺炎仪表板,它汇集了各种来源的数据,并显示了你可能感兴趣的关于全球疫情的任何统计数据。1point3acres 还有一个追踪器,提供实时更新和许多信息图表来分析病毒的增长率。虽然这些来源(以及许多其他来源)处于第一线,可靠地向人们提供重要信息,并帮助他们了解与这场危机有关的所有事情,但我们的目标略有不同,如下所述。

目标:

  1. 使用二级数据源从独特的背景中获得对疫情的洞察。
  2. 创建一个具有可链接组件的应用程序,以便一个 div 中的动作触发另一个 div 中相应的动作。
  3. 提高我们的 D3.js 技能!
  4. 弄清楚如何远程协同工作。

数据

数据来源 1: Cuebiq 移动洞察

我们决定将重点放在有关流动性在这段时间内如何变化的数据上,在这段时间里,社会距离要么受到高度鼓励,要么被州和地方法律强制规定。

Cuebiq 流动性指数

Cuebiq 是一家拥有免费仪表盘的公司,其移动洞察基于在美国各地收集的手机数据。

Cuebiq 移动指数(CMI)量化了用户每天移动的距离。它是使用一个衍生因子来计算的,该衍生因子指示围绕每天观察到的用户位置绘制的一个方框的对角之间的距离。即使用户在平常的一天里走了不同的距离,使用一个指数也可以将各县相互比较。每个县的 CMI 是一个县内所有用户的总移动量的中位数。

CMI 值可以用 1-5 的等级来解释,其值对应于以下行驶的中值距离(5 = 100 公里,4 = 10 公里,3 = 1 公里,2 = 100 米,1 = 10 米)。一个县的 CMI 为 2.5,这意味着该县的中位用户出行量为 2.5 亿。

不幸的是,这些数据无法通过 API 调用或 CSV 文件下载获得。为了争夺数据,我们实际上不得不下载 PDF 文件,然后使用 Python 和其他妙招收集数据。如果县在 PDF 中由于名称过长和间距不足而被截断,我们必须交叉引用外部数据集来填充缺失的数据。

数据来源 2:纽约时报 美国冠状病毒病例与死亡

纽约时报美国冠状病毒数据

我们使用了 NYT 开放 GitHub 存储库,其中包含美国每天的病例和死亡人数。这些数据以 CSV 文件的形式出现,名为 us-counties.csv。我们编写了 Python 脚本来按县汇总数据,并确定每天的累计病例数。由于存储库每天都在更新,我们觉得让我们的应用程序总是拥有最新的数据很重要,所以我们将更多“案例数据”拉入 Bash 脚本的过程流水线化,以便我们可以在一行命令中自动拉入和争论数据。

数据来源 3:美国人口普查局人口数据

美国人口普查局数据

最后,我们使用美国人口普查数据,根据各县的中位收入和政治联盟来可视化人口趋势。我们希望探索这些因素如何影响美国所有县的社交距离行为。项目的这一方面需要大量的数据操作,并且由于我们采用的可视化方法,它也是最具编程强度的,因此我们最终只实施了两个人口统计过滤器。然而,我们计划很快实现更多有趣的人口趋势,如教育水平或基本劳动力百分比。

我们试图谨慎地选择如何表示人口统计数据。按每个县的人口比例缩放对象是避免产生欺骗性可视化的一种方式。这一人口数据也是从最近可用的美国人口普查局数据集(2016 年)中获得的。

争论

术语说明: 争论 是将数据从一种“原始”数据形式转换和映射为另一种格式的过程,目的是使其更适合各种用途,更有价值。

从 3 个不同的来源获取数据是我们项目中最复杂的方面之一。这是那些需要白板或者频繁的 10 分钟休息来让大脑充电的任务之一。我们的任务是将来自 3 个来源的数据收集到一个主容器中(JSON 或 CSV 格式)。虽然数据是根据各种不同的方案组织的,但这项任务是通过使用唯一标识美国每个县的每个数据集中的 FIPS 代码实现的。

FIPS 电码故障

为了合并数据集,我们实际上使用 FIPS 列作为执行连接的键,对每个数据集执行了内部连接。这产生了一个数据集,我们可以用它来产生我们可视化的所有不同组件。

也就是说,数据集远非完美。一个数据集的不一致会影响 3 个来源的整体组合。例如,纽约时报存储库没有纽约市的县一级的案例数据,因为数据被划分到五个区,这五个区没有唯一的 FIPS 代码。此外,Cuebiq 没有阿拉斯加和夏威夷健全的县一级流动性数据。为了处理这些不一致,我们面临着一个决定:我们要么从可视化中完全忽略这些位置,要么接受忽略这些县的 3 个数据点中的一个。我们选择把阿拉斯加和夏威夷排除在外(很遗憾),但我们对纽约在所有 3 个来源中存在一些不一致的地方没有意见。

以下部分将包括我们的网站如何工作的教程。我们将深入研究该应用程序的来龙去脉,包括一些实现细节,这些细节可能有助于了解如何最好地使用该应用程序来回答您可能会有的关于新冠肺炎的问题。如果您对这个技术故障不感兴趣,可以直接跳到本文的“我学到了什么”部分。

组件

转到新冠肺炎追踪器应用程序本身,我们可以在下面看到,可视化的关键是用颜色编码的移动指数数据,以及随着时间的推移,查看美国不同地方如何通过社交距离来应对疫情危机的能力。

新冠肺炎跟踪器应用程序的照片

地图上的颜色有意颠覆了交通灯根深蒂固的配色方案。鉴于我们正在经历这些前所未有的情况,我们都尽自己的努力将这种病毒的影响降至最低是至关重要的,我们认为将低运动与绿色联系起来,将高运动与红色联系起来会很有趣。用户确实需要更多的时间来理解配色方案,但是由于我们可视化的信息可能会非常强大,我们认为宁可混淆,也不要随意暗示我们不打算表达的基于颜色的信息。

在 2020 年 3 月 23 日这一周,西海岸的县相对于美国所有县的移动最小。红色的县的移动指数大于 3,表明那一周人们离家的中间距离在 1 到 10 公里之间,这看起来不算多,但实际上这很说明问题,因为这是一个中间值,许多州已经在这一点上制定了留在家中的命令。

滑块

我们实现的核心是上述移动索引数据的时间推进。通过拖动屏幕左上角的滑块,用户可以查看特定一周的数据,或者控制时间快进的速度。

从 3 月 2 日到 4 月 27 日的逐周滑块过渡

在上面的 GIF 图中,我们看到了一个动画,展示了自新冠肺炎疫情爆发以来,美国不同地方或多或少的变化。绿色和黄色编码最多的一周是 3 月 23 日。有趣的是,最近的数据表明,大多数县的移动指数大于 3。人们可以推测,这是人们选择离开家时戴口罩的结果,人们去散步和跑步,更好的天气,一些州放松了社交距离措施,或者这些理由的一些组合。随着新冠肺炎地位的改变、假期的到来和夏天的临近,看看这些数据会是什么样子将会很有趣。

动画条形图

我们的应用程序最重要和最常用的特性之一是一个查询县的新冠肺炎案例的动画条形图。用户可以查询各县或在地图上单击以调用此功能,并探索移动指数与新病例增加或减少之间的任何潜在关系。

演示动画条形图功能

在上面的演示中,我们展示了触发该特性的两种方式。将鼠标悬停在地图上的县几何图形上并找到华盛顿的 King County 后,用户只需在感兴趣的县的形状内单击即可锁定该选择并启动动画条形图。

左边的灰色框中会出现一个条形图。这个图表实际上描述了两种类型的数据:在被查询的县中,新冠肺炎病例的累积数量和由新冠肺炎引起的死亡的累积数量。条形图的左上角有一个图例,说明颜色如何表示正在绘制的数据集。将鼠标悬停在条形图上可激活工具提示,该工具提示提供该条形图的所有信息—日期、总病例数、新病例数(相对于前一天)和总死亡数—全部整合在一个位置。

我们的一个实现目标是让条形图特性和 chloropleth 图可视化展示双向链接。也就是说,一个县查询触发了某个事件,并与地图上高亮显示的特定县相对应,而地图上的一个操作也触发了相同的事件。从控制流的角度来看,这是一项复杂的工作。但是,它增强了用户体验,因为它使用户能够灵活地使用应用程序。(如果他们不知道某个县在地图上的位置,这也有助于他们复习美国的地理知识!)

以 King County 为例,有一个用户在不知道具体县在地图上的确切位置的情况下如何查询该县的例子。如你所见,当圣巴巴拉被查询时,它的地理位置在地图上被高亮显示。用户还可以滑动滑块来探索所查询的县中的移动与该县中病例的上升或下降之间的相关性。

圆环图

在做了一些用户测试后,很明显,人们自然倾向于按城市或州而不是按县来探索数据。因为我们使用第三方数据,我们不能控制它是如何组织的,但是我们可以简化用户的查找过程。例如,如果用户想了解新冠肺炎如何影响洛杉矶,他们可能不知道洛杉矶所属的县的名称(顺便说一下,是洛杉矶县)。然而,他们凭直觉知道,人口最多的城市可能位于加利福尼亚州病例相对百分比最高的县。

脱离了这个逻辑,我们决定实现一个环形图,描述查询州的每个县。圆环图每个部分的大小编码了给定州内每个县的相对案例百分比。可以预料,颜色编码与前面讨论的移动索引数据一致。还有链接功能也开始发挥作用。当用户将鼠标悬停在环形图的切片上时,这些县的地理位置会在克罗珀特地图上突出显示。当用户单击切片时,会显示动画条形图,而不是圆环图。要返回到圆环图,用户只需再次单击下方的放大镜。

圆环图功能的演示

圆环图有 3 个主要使用案例值得注意:

  1. 它可用于识别每个州内最大的县(按人口计算),从而间接使用户能够按城市探索新冠肺炎趋势。在上面的示例中,当查询“马萨诸塞州”时,从圆环图切片的大小可以清楚地看出,萨福克和米德尔塞克斯可能是相对于其所在州而言人口最多的县。这些县可能值得点击来提示条形图。
  2. 圆环图可用于了解每个县在地图上的位置。如果用户没有特定的目标或问题想要通过使用应用程序来回答,他们可以使用州级链接,而不是单独查询县。
  3. 圆环图可用于探索随时间的变化,同时缩小感兴趣的特定状态。在上面的演示中,我们看到了圆环图的切片是如何随着滑块的每次转换而改变颜色的。各州的移动指数值通常不会有很大的变化。有趣的是,一个州内人口最稠密的县(本例中为 Multnomah)往往具有最低的移动指数。我不是人口学家,但也许大城市更严格地执行了呆在家里的命令,或者也许是因为公共交通的关闭而减少了流动。谁能说得准呢?但是这是一个有趣的趋势,如果视觉化图像没有在我眼前照亮它,我永远不会想到它。

人口趋势

您还可以单击“切换到人口趋势”按钮,了解移动指数和案例数据如何与人口趋势相关联。默认的人口统计是中等收入。根据美国人口普查局(United States Census)记录的每个县的收入中值,这些县保留了与每周移动指数相匹配的颜色,但在 x 轴上从最不富裕到最富裕排列。因为有了与案例数据的完整链接功能,就像有了这个地图一样,这个视图允许用户探索收入如何影响人们在哪里避难。这是一个重要的相关性,但是我们认为将它形象化会更加强大!

人口趋势视图演示

根据上面的 GIF,你可以看到随着病毒的传播,最富裕的县最早变绿(开始社会距离)。这一趋势的唯一例外是收入较低的县,如洛杉矶,那里的病例太多,除了呆在家里别无选择。

通过切换人口统计,用户还可以探索政治联盟如何影响社交距离行为。使用政治过滤器,将县(用气泡表示)放置在从 0 到 1 的 x 轴上,其中 0 表示基于 2016 年选民登记的 0% GOP 投票,1 表示 100% GOP 投票。很容易看出,在过去几周里,一个县越右倾,他们就越有可能继续前进,尽管这些地区在 3 月底和 4 月初出现了病例。即使用户对确定新冠肺炎的人口趋势不感兴趣,该视图也可以简单地用作一种教育工具:当您将鼠标悬停在圆环图的切片上时,代表该县的气泡会突出显示,从而允许用户按州浏览人口信息。

好了,这就结束了我们的应用程序的各个组件的旅程。希望使用我们的数据可视化,您可以轻松地解释大量数据并确定趋势。

我学到了什么

在你开始玩可视化之前,我想分享一些在这个项目中的思考和经验。这些收获中有许多是我想分享的极客技巧,但我也想后退一步,评论一下该项目的一些非技术方面。

渐进的进展

到目前为止,每天做一些小的改进是这个项目中最令人满意的部分。因为我们是从第一步开始的,所以我们真的必须一次考虑一个特性。项目的第一个工作组件是带有县的地图,通过移动索引数据和工具提示功能来检查特定的县。然后我们让滑块开始工作,随后很快就有了动画条形图。

应用程序的早期版本

正如你在上面看到的,即使我们的功能正常工作,它们也不一定从一开始就很流畅。我们使用的配色方案被彻底修改,条形图 x 轴被修复,看起来不那么杂乱。我们还决定将页面左侧的元素放在一个灰色框中,以便更优雅地划分它们。

概念验证:人口趋势

至于人口趋势,让他们都适合在一个屏幕上实际上是一个巨大的挑战。我们最初使用强制节点碰撞来制作上面的动画,但我们必须找到一个解决方法,以便我们可以在同一页面上包含此功能。Sammy 想出了创建一个节点模拟并保存它们最终的 x 和 y 坐标的主意,这样我们就可以将它们都固定在适当的位置。这是一个巨大的胜利,使我们能够集成所有的组件,并不断推出更多的链接功能。

Git 分支和拉请求

由于项目是在不到一个月的时间内完成的,开发通常是并行进行的。当团队成员处理不同的特性,但是在不同的地方修改同一个文件时,处理 git 分支是很重要的。我们没有很好地遵循远程开发的最佳实践。将来,我们肯定会将新特性推送到 git 分支,然后创建 pull 请求,以确保在合并期间不会覆盖彼此的工作。

沟通就是一切

…尤其是当您在全球疫情中远程工作时。我们在 3 个不同的家庭环境中工作,使用不同的电脑和无线网络,而且我们不在同一个时区。我们能够通过每隔几天召开一次 Zoom 会议来解决这个问题,以便检查、相互更新和讨论后续步骤。虽然我们也有一个处理小型技术后勤的群组短信,但虚拟联系对我们的成功至关重要。这确保了我们不会冒犯对方,并且在我们继续开发新功能之前,所有的想法都已经摆到桌面上了。

团队士气和生产力之间的相关性

人们需要的只是一点积极的反馈,让他们觉得自己的努力没有被忽视。用千禧一代的话来说,这种积极的强化可以被称为“互相打气”。

这个外卖其实只是对淑喜和萨米成为优秀搭档的颂歌。每个人都以独特的方式为项目做出贡献,这使得一起工作变得如此有趣。我们都有突破的时刻,我们都为这些时刻互相吹捧。虽然这是一个小小的举动,但是良好的团队士气会带来更好的最终产品!这不是意见。这是一个被证实的事实。

代码重构

代码重构是一个敏捷编程的概念,指的是澄清和简化现有代码的设计,而不改变其行为的过程。由于每个方法或类有太多的责任、重复的代码、糟糕的命名、糟糕的注释和普遍的混乱,未重构的代码往往会受到影响。为了说明一个流行的比喻,重构就像在你做饭的时候或者在你做完饭后不久打扫厨房。盘子、锅、食物和冰箱必须时刻保持干净整洁。没有干净的厨房,连续烹饪要么是不可行的,要么是非常不愉快的。类似地,如果代码没有被重构,开发新特性的难度大约是正常情况下的 10 倍。

正如在上面的短信对话中提到的,这是我们项目的一个方面,对我们能够向前发展至关重要。函数通常应该负责执行一个任务,但是我们的许多函数同时执行 5 个以上的任务。我们必须与代码坐在一起,思考如何最好地模块化它,使它尽可能地可重用。毫无疑问,即使在今天它也不是超级干净的。但是这里的要点是,代码重构是一个持续的过程,不应该被忽视。在这个项目中,我们确实学到了编写干净代码的价值,也许更重要的是,学会了如何处理杂乱的代码并清理它们。

Bash 脚本自动化繁琐的任务

Bash 脚本是包含一系列命令的纯文本文件,我们通常会在命令行中输入这些命令,但是我们更愿意将这些命令聚集在一个文件中,以便同时执行许多任务。当我们发现从纽约时报 GitHub 存储库中提取数据的过程需要大约 12 个命令行命令时,我们看到了编写 Bash 脚本的优势。我们现在只需要输入。命令行中的/pull_nyt.sh 获取更多数据。这是一个非常简单的技巧,可以节省我们大量的时间,并最小化文件系统组织中的错误。我们甚至可能会进一步研究自动化流程,以便每天早上 9 点提取更多数据。

我❤开源社区

我在过去的文章中讨论过这个问题,但我将在这里重复这一观点。开源社区让我相信人性的美好。能够玩演示、克隆存储库和在在线论坛上寻求帮助是如此强大,以至于我们作为一个社区可以推进到新的领域,而不必重新发明轮子。对 Stack Overflow 上帮助我们完成这个项目的匿名英雄们大声喊出来。有一天,我希望向前支付。

学术项目只是掠过你潜力的表面

很长一段时间,我有一个有限的信念,你只需要完成学术项目并达到所有要求,然后你就可以在夏天有更多空闲时间的时候继续做你真正想做的事情。然而,我错了。学术项目应该被当作一个跳跃点,让你朝着更大的目标,你所热爱的目标前进。特别是当你有选择题目的自由时,我认为你应该选择一些感觉不像工作的东西。我知道这是一个感觉不像工作的项目,我肯定希望在未来与我的队友继续下去。我很感激任务和截止日期激励我们从某个地方开始。

摘要

如果你一路走到这里,感谢你足够关心阅读这篇冗长的文章。我们希望你获得了一两件东西,并感到鼓舞去建立一些东西。

你可以在这里玩我们的网络应用。
你可以在这里查看我们的源代码

我们希望您对我们的新冠肺炎跟踪应用程序有任何反馈。如果你想提供建议、意见或批评,可以发电子邮件到 sejaldua@gmail.com 给我。

保持安全和健康!我们会一起度过难关的。

使用 Python 实现新冠肺炎数据可视化

原文:https://towardsdatascience.com/covid-19-data-visualization-using-python-3c8bcfaeff5f?source=collection_archive---------25-----------------------

马库斯·斯皮斯克在 Pexel 拍摄的照片

在每个数据科学项目中,数据可视化是深入了解大型数据集的第一步。获取并预处理数据(清理和消除重复数据)后,数据科学生命周期的下一步是探索性数据分析,从数据可视化开始。这里的目的是从数据中提取有用的信息。

我使用 Python 和它为数不多的强大库来完成这项任务。此外,我已经使用谷歌 Colab 笔记本来编写代码,以避免安装任何 IDE 或软件包的麻烦,如果你想跟进的话。

我们开始吧

第一步是打开一个新的 Google Colab ipython 笔记本,导入我们需要的库。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsimport plotly.express as px ### for plotting the data on world map

加载数据

这些可视化是基于截至 2020 年 5 月 25 日的数据。我使用了约翰·霍普斯金大学发布的 2020 年 5 月 25 日的日报数据。代码的下一部分处理加载。csv 数据到我们的项目。

path = 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/05-25-2020.csv'df = pd.read_csv(path)df.info()df.head()

只用两行代码,我们就加载了数据,并准备好用作 Pandas 数据框架。接下来的两行显示关于数据(元数据)的信息,即总共 3409 行数据和 11 列。它还为我们提供了前五行的预览。

预处理数据

既然我们的数据已经成功加载,下一步就是在使用数据进行绘图之前对其进行预处理。它将包括:

  • 删除多余的列,如‘FIPS’,‘admin 2’,‘Last _ Update’(因为所有数据都是单日的,即 5 月 25 日)。
  • 删除列‘省 _ 州’和‘组合 _ 关键字’,因为并非所有国家都有州级数据。
  • 按'国家/地区将数据分组,并将列重命名为'国家/地区
df.drop(['FIPS', 'Admin2','Last_Update','Province_State', 'Combined_Key'], axis=1, inplace=True)df.rename(columns={'Country_Region': "Country"}, inplace=True)df.head()

数据可以通过数据帧的“分组”功能进行分组。它类似于 SQL 中的 GROUPBY 语句。

world = df.groupby("Country")['Confirmed','Active','Recovered','Deaths'].sum().reset_index()world.head()

最后,我们的数据被清理并准备使用。

绘制确诊病例最多的前 20 个国家

### Find top 20 countries with maximum number of confirmed casestop_20 = world.sort_values(by=['Confirmed'], ascending=False).head(20)### Generate a Barplotplt.figure(figsize=(12,10))plot = sns.barplot(top_20['Confirmed'], top_20['Country'])for i,(value,name) in enumerate(zip(top_20['Confirmed'],top_20['Country'])): plot.text(value,i-0.05,f'{value:,.0f}',size=10)plt.show()

作者图片

绘制确认病例数最多的前 5 个国家的确认病例和活动病例

top_5 = world.sort_values(by=['Confirmed'], ascending=False).head() ### Generate a Barplotplt.figure(figsize=(15,5))confirmed = sns.barplot(top_5['Confirmed'], top_5['Country'], color = 'red', label='Confirmed')recovered = sns.barplot(top_5['Recovered'], top_5['Country'], color = 'green', label='Recovered')### Add Texts for Barplotsfor i,(value,name) in enumerate(zip(top_5['Confirmed'],top_5['Country'])): confirmed.text(value,i-0.05,f'{value:,.0f}',size=9)for i,(value,name) in enumerate(zip(top_5['Recovered'],top_5['Country'])): recovered.text(value,i-0.05,f'{value:,.0f}',size=9)plt.legend(loc=4)plt.show()

作者图片

在世界地图上绘制地图

choropleth 地图是一种专题地图,其中的区域按照代表每个区域内地理特征汇总的统计变量(如人口密度或人均收入)的比例进行阴影化或图案化。

Choropleth 图提供了一种简单的方法来可视化一个地理区域内的测量值如何变化,或者显示一个区域内的可变性水平

figure = px.choropleth(world,locations=’Country’, locationmode=’country names’, color=’Confirmed’, hover_name=’Country’, color_continuous_scale=’tealgrn’, range_color=[1,1000000],title=’Countries with Confirmed cases’)figure.show()

作者图片

我们可以放大地图,将鼠标悬停在某个特定地区,查看该国已确认的病例数

作者图片

完整代码可在我的 GitHub repo:https://GitHub . com/jaskeeratbhatia/新冠肺炎-数据-可视化/blob/master/新冠肺炎-数据-25-may-2020-revised.ipynb

参考资料:

  1. https://github.com/CSSEGISandData/COVID-19 Github 回购数据:
  2. 维基百科:https://en.wikipedia.org/wiki/Choropleth_map

新冠肺炎探测器烧瓶应用程序基于使用深度学习的胸部 x 光和 CT 扫描

原文:https://towardsdatascience.com/covid-19-detector-flask-app-based-on-chest-x-rays-and-ct-scans-using-deep-learning-a0db89e1ed2a?source=collection_archive---------24-----------------------

使用四种深度学习算法(VGG16、ResNet50、InceptionV3 和 Xception)实现基于人工智能的模型和 Flask 应用程序,以检测胸部 X 射线和 ct 扫描中的新冠肺炎

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

图 1:新型冠状病毒疾病 2019 来源

新冠肺炎,或更通常被称为新型冠状病毒疾病是一种高传染性疾病,于 2019 年底在中国出现。这种疾病是由 新型冠状病毒 引起的,一种属于冠状病毒大家族的病毒。该疾病于 2019 年 12 月首次起源于中国武汉,并很快成为全球疫情,蔓延至超过 213 个国家。

新冠肺炎最常见的症状是发烧、干咳和疲倦。人们可能经历的其他症状包括疼痛、疼痛或呼吸困难。这些症状中的大多数都显示出呼吸道感染和肺部异常的迹象,这可以由放射科医生检测出来。

因此,可以使用机器学习算法从胸部 x 光CT 扫描的图像中检测疾病。可以创建自动化应用程序来帮助支持放射科医生。本文是对四种深度学习算法的尝试,分别是: VGG16、ResNet50、InceptionV3Xception

训练和测试模型以及运行 Flask 应用程序的完整代码可在我的 Github 存储库 上获得。

数据集

该项目的数据集是从两个开源 Github 存储库中收集的:

  1. ****胸部 x 光片图像(1000 张图像)从https://github.com/ieee8023/covid-chestxray-dataset获得
  2. ****CT 扫描图像(750 张图像)从https://github . com/UCSD-AI4H/COVID-CT/tree/master/Data-split获取

四个算法:VGG16、ResNet50、InceptionV3 和 Xception 分别在胸部 x 光和 CT 扫描上进行训练,给了我们总共 8 个深度学习模型。 80% 的图像用于训练模型,剩余的 20% 用于测试模型的准确性。

构建模型

我首先向预训练模型添加了 3 个自定义层,以便它们可以在我们的数据集上进行训练。例如,添加自定义层到 ResNet50 模型的代码如下所示。其余模型的代码保持不变。只需将第一行中的 ResNet50 更改为所需模型的名称。

res = ResNet50(weights="imagenet", include_top=False, input_tensor=Input(shape=(224, 224, 3)))
outputs = res.output
outputs = Flatten(name="flatten")(outputs)
outputs = Dropout(0.5)(outputs)
outputs = Dense(2, activation="softmax")(outputs)
model = Model(inputs=res.input, outputs=outputs)
for layer in res.layers:
  layer.trainable = False
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

数据集中的图像大小不同。因此,我需要将它们调整到固定的大小,然后才能将它们提供给深度学习模型进行训练。我将图片尺寸调整为 224 x 224 像素,这被认为是 ResNet50 机型的理想尺寸。因此,我将形状 (224,224,3) 的输入张量添加到预训练的 ResNet50 模型中,3 为通道数。

接下来,我添加了一个展平层来展平我们所有的特征,并添加了一个脱落层来克服过度拟合。最后,我使用 softmax 函数作为激活函数,添加了密集输出层。由于模型的前半部分已经被预训练,先前层的可训练属性被设置为。最后,我用 adam 优化器编译模型,并使用分类交叉熵作为损失** 函数。**

训练模型

我首先定义了一个图像数据生成器来训练模型修改版本的图像,比如不同的角度、翻转、旋转或移位。

train_aug = ImageDataGenerator(rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, horizontal_flip=True)

接下来,执行模型的训练,所有需要的参数指定如下:

history = model.fit(train_aug.flow(X_train, y_train, batch_size=32),validation_data=(X_test,y_test),validation_steps=len(X_test) / 32, steps_per_epoch=len(X_train) / 32, epochs=500)

如你所见,我已经用 32 张图像的批量为 500 个纪元训练了模型。

做预测

通过在测试集的图像上运行训练的模型来生成预测。数据集前 10 幅图像的预测绘制如下:

y_pred = model.predict(X_test, batch_size=batch_size)
prediction=y_pred[0:10]
for index, probability in enumerate(prediction):
  if probability[1] > 0.5:
    plt.title('%.2f' % (probability[1]*100) + '% COVID')
  else:
    plt.title('%.2f' % ((1-probability[1])*100) + '% NonCOVID')
  plt.imshow(X_test[index])
  plt.show()

以下片段显示了胸部 X 射线的前 10 个预测图:

图 2:可视化胸部 X 射线的前 10 个预测

机器学习的评估和结果

以下是一些重要的结果和图表,有助于估计模型的准确性并了解其性能。

测试集图像的输出示例

图 3:测试集图像的样本输出

分类报告

VGG16 型胸部 X 线和 CT 扫描分类报告

******

图 VGG16 模型胸片(左)和 CT 扫描(右)分类报告**

ResNet50 型胸部 X 线和 CT 扫描分类报告

******

图 ResNet50 型号胸片(左)和 CT 扫描(右)分类报告**

胸部 X 线和 CT 扫描的 InceptionV3 模型分类报告

******

图 6:胸部 x 光(左)和 CT 扫描(右)的 InceptionV3 模型分类报告**

胸部 X 线和 CT 扫描异常模型分类报告

****

图 7:X 线胸片(左)和 CT 扫描(右)异常模型分类报告

混淆矩阵

用于胸部 X 线和 CT 扫描的 VGG16 模型的混淆矩阵

******

图 8:胸片(左)和 CT 扫描(右)的 VGG16 模型混淆矩阵**

ResNet50 胸部 X 线和 CT 扫描模型的混淆矩阵

******

图 ResNet50 模型胸部 x 光(左)和 CT 扫描(右)的混淆矩阵**

胸部 X 线和 CT 扫描的概念模型混淆矩阵

******

图 10:胸部 x 光(左)和 CT 扫描(右)的 InceptionV3 模型的混淆矩阵**

胸部 X 线和 CT 扫描异常模型的混淆矩阵

******

图 11:胸部 x 光(左)和 CT 扫描(右)的异常模型的混淆矩阵**

构建 Flask 应用程序

现在,我使用目前为止我创建的代码,通过在某些 flask 函数中粘贴特定的代码段来构建 Flask 应用程序。例如,使用四个模型来生成胸部 X 射线预测的代码如下所示:

def uploaded_chest():
   resnet_chest = load_model('models/resnet_chest.h5')
   vgg_chest = load_model('models/vgg_chest.h5')
   inception_chest = load_model('models/inceptionv3_chest.h5')
   xception_chest = load_model('models/xception_chest.h5') image = cv2.imread('./flask app/assets/images/upload_chest.jpg') 
   # read file 
   image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 
   # arrange format as per keras
   image = cv2.resize(image,(224,224))
   image = np.array(image) / 255
   image = np.expand_dims(image, axis=0)

   resnet_pred = resnet_chest.predict(image)
   probability = resnet_pred[0]
   print("Resnet Predictions:")
   if probability[0] > 0.5:
      resnet_chest_pred = str('%.2f' % (probability[0]*100) + '% COVID') 
   else:
      resnet_chest_pred = str('%.2f' % ((1-probability[0])*100) + '% NonCOVID')
   print(resnet_chest_pred) vgg_pred = vgg_chest.predict(image)
   probability = vgg_pred[0]
   print("VGG Predictions:")
   if probability[0] > 0.5:
      vgg_chest_pred = str('%.2f' % (probability[0]*100) + '% COVID') 
   else:
      vgg_chest_pred = str('%.2f' % ((1-probability[0])*100) + '% NonCOVID')
   print(vgg_chest_pred) inception_pred = inception_chest.predict(image)
   probability = inception_pred[0]
   print("Inception Predictions:")
   if probability[0] > 0.5:
      inception_chest_pred = str('%.2f' % (probability[0]*100) + '% COVID') 
   else:
      inception_chest_pred = str('%.2f' % ((1-probability[0])*100) + '% NonCOVID')
   print(inception_chest_pred)xception_pred = xception_chest.predict(image)
   probability = xception_pred[0]
   print("Xception Predictions:")
   if probability[0] > 0.5:
      xception_chest_pred = str('%.2f' % (probability[0]*100) + '% COVID') 
   else:
      xception_chest_pred = str('%.2f' % ((1-probability[0])*100) + '% NonCOVID')
   print(xception_chest_pred)
   return render_template('results_chest.html',resnet_chest_pred=resnet_chest_pred,vgg_chest_pred=vgg_chest_pred,inception_chest_pred=inception_chest_pred,xception_chest_pred=xception_chest_pred)

Flask App 截图

****

源代码

整个项目的源代码以及数据集、模型和 flask 应用程序都可以在我的 Github repo 上找到。

结论

最后,我想说明一个事实,即分析是在有限的数据集上进行的,结果是初步的。该方法尚未进行医学验证,因此结果可能与实际使用案例中观察到的结果不同。

在未来,我计划通过在更多的图像上训练模型来提高它们的性能,并可能包括其他因素,如年龄、国籍、性别等。此外,我鼓励本文的读者自己尝试代码,以提高模型的精度。

如果你觉得这篇文章有用,请随意与他人分享。非常感谢您的阅读。注意安全!

注意——我不是医学背景,这个项目是为了概念的演示而开发的。

请随时在其他平台上与我联系:

github—https://github.com/kaushikjadhav01

LinkedIn—https://www.linkedin.com/in/kaushikjadhav01/

新冠肺炎:意大利的超额死亡率

原文:https://towardsdatascience.com/covid-19-excess-mortality-figures-in-italy-d9640f411691?source=collection_archive---------1-----------------------

新冠肺炎官方死亡人数与伦巴第死亡率的比较

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

照片由 Georg EiermannUnsplash 拍摄

本周全世界有创纪录的 120 万新型冠状病毒,官方报道死亡人数超过 66000 人,意大利仍然是死亡人数最多的国家,截至 2020-04-04 为 15362 人,伦巴第的死亡人数占总死亡人数的 56%。

意大利民防部门的负责人在 3 月 23 日声称,新新型冠状病毒的致命率已经争论了很久:

截至昨天,冠状病毒的官方数字为 63000。我们认为 1:10 的比率(1 个阳性:10 个未检测的阳性)[ 1 ]是可信的

很难估计有多少人被感染,因为他们中有很多人没有表现出任何症状,而且通常对表现出新冠肺炎症状的患者进行拭子检测。这种方法(方便取样)引入了取样误差的可能性,并且产生的样本的代表性仍然值得怀疑[ 2 ]。

此外,死亡人数可能被低估。事实上,极有可能的是,过多的死亡主要是在家中或住宅设施中死亡的老年人或体弱者,他们没有被送往医院,因此没有进行新冠肺炎检测。

意大利统计研究所(ISTAT)根据最新的人口普查,公布了意大利各地选定城镇的死亡率数据,特别是 2020 年 3 月 1 日至 2020 年 3 月 21 日之间的总死亡人数。该数据包含所有城镇的子集,即 1084 个城镇/城市,可以比较 2020 年 3 月前三周与 2019 年同期相比死亡人数的增加或减少,结果如下图所示。该数据每周更新,文章基于以前发布的数据。

所有可用城镇和城市数据的互动地图可以在这里找到5】(地图加载有点重)

截至 3 月 28 日的更新地图可在此处找到[ 8 ]

放大意大利北部-艾米利亚伦巴第

令人震惊的是,与峰值超过 1000%的 2019 年相比,2020 年该镇的大多数颜色都倾向于非常高的死亡增长率。特别是,我们可以注意到紫色在伦巴第和艾米利亚地区的强烈集中,那里目前有最大的疫情,特别是在贝加莫,皮亚琴察,布雷西亚等省。如果从较大城市的数据来看,贝加莫涨幅最大 294%,其次是皮亚琴察 201%,布雷西亚 109%,帕尔马 103%,帕维亚 41%,曼图亚 22%,米兰 17%。

在发现“第一名患者”的罗提省,Codogno 今年已有 87 人死亡,而 2019 年同期只有 15 人死亡。

放大罗提和皮亚琴察之间的伦巴第

统计数据和见解摘要

如上所述,1,084 个城镇是 ISTAT 提供的一个子集。子集包含伦巴第的 434 个城镇,覆盖总人口的 56.48%(1000 万居民)。下表显示了按 12 个伦巴第省分组的死亡数据,按 2020 年死亡人数排序。贝加莫省的增幅最大,2020 年为 454%。2019 年,米兰省增幅最小,为 42%。

如果我们绘制伦巴第地区城镇子集记录的总死亡人数,我们可以看到,与 2019 年相比,2020 年 3 月 1 日至 21 日之间的死亡人数增加了 144%(2019 年 3520 人死亡,2020 年 8587 人死亡)。因此,又有 5067 人死亡。

但是官方公布的 2020 年 3 月 1 日至 21 日伦巴第新冠肺炎死亡人数是 3072 人。

这意味着,在 56.48%的人口中,数字显示有 5067 人超额死亡(即每 100 万人口中有 891.8 人死亡),高于 3072 人(每 100 万人口中有 305.4 人死亡),这是整个伦巴第的官方新冠肺炎死亡人数。

如果我们考虑同比最差情况波动高达 20%,那么超额死亡人数为每 100 万人 767.87 人,我们可以推断,2020 年 3 月 1 日至 21 日伦巴第地区可能有 7725 人超额死亡,其中 40%是由于新冠肺炎,60% (4653 人)是原因不明的死亡。于是出现了一个问题:统计误差有多大?

这表明,新冠肺炎导致的死亡人数可能是官方死亡人数的两倍半(即 767.87/305.4=2.514)。因此,伦巴第地区的 7725 例死亡可能代表了一个接近上限的数字,因为我们不知道这些城镇的子集是否是一个代表性样本,但是,潜在的,我们应该不会太远。

鉴于 3 月 1 日至 24 日期间新冠肺炎死亡总人数为 2060 人,3 月底,贝加莫市市长 Giorgio Gori [6]估计该省感染总人数为 288000 人。使用乘数 2.514 的估计值介于[258972;345256]感染,死亡率分别为 2%和 1.5%。这是贝加莫省总人口的 31%。

如果我们应用于伦巴第的 8656 例死亡的全部,估计在[1.08m;截至 2004 年 4 月 20 日,新冠肺炎感染人数为 145 万。

将相同的比率应用于意大利各地的 15362 例死亡人数(尽管南部地区可能有不同的乘数),我们得到[193 万;2.57M],所以在英国帝国大学研究人员计算的 95%可信区间内[ 7 ],接近其下限。

下图总结了意大利可能出现的情况。

全国新冠肺炎感染者的可能人数

参考文献

[1]:https://rep . repubblica . it/pwa/generale/2020/03/23/news/coronavirus _ borrelli _ I _ numeri _ sono _ altri _ l _ epidemia _ va _ piu _ veloce _ della _ no stra _ burocrazia _-252124440/?ref = RHPPTP-BH-I 252124970-C12-P8-s 1.12-T1))

[2]: Alleva,Giorgio 等人(2020 年 3 月)https://web . uniroma 1 . it/memo tef/sites/default/files/proposta . pdf?FB clid = iwar 2 tbasiaze 7m smvsj 8 hamambcwvf 86 _ pui 99 rjgminofm 2 awp zzk _ eaxn 0

[3]:https://www . Corriere . it/politica/20 _ marzo _ 26/the-real-death-toll-for-新冠肺炎-至少是官方数字的 4 倍-b5 af 0 EDC-6 eeb-11ea-925 b-a 0 C3 cdbe 1130 . shtml

[4]: ISTAT。(2020 年 4 月 3 日)。https://www.istat.it/it/archivio/240401

[5]:2020 年与 2019 年超额死亡率,Cholopetth 地图。西罗·蒙塔加诺。(2020 年 4 月 3 日)http://content.dsadserver.com/Ciro/muni.html

[6]:乔治·戈里的推特(2020 年 3 月 26 日):

乔治·戈里声明

[7]https://www . imperial . AC . uk/MRC-global-infectious-disease-analysis/新冠肺炎/report-13-Europe-NPI-impact/

[8]2020 年 3 月 1 日至 28 日与 2019 年相比的超额死亡率,Cholopetth 地图。西罗·蒙塔加诺。(2020 年 4 月 14 日)http://content.dsadserver.com/Ciro/italy_map_28Mar2020.html

其他读物

伦巴第死亡人数

世卫组织·新冠肺炎仪表板。(2020 年 4 月 4 日)。https://experience . ArcGIS . com/experience/685 d0a ce 521648 F8 a5 beeee E1 b 9125 CD

向部长致敬。(2020 年 4 月 3 日)。新冠肺炎—意大利的 Situazionehttp://www . salute . gov . it/portale/nuovocoronavirus/dettagliocontinutinuocoronavirus . JSP?lingua = italiano&id = 5351&area = nuovoCoronavirus&menu = vuoto**

https://github . com/PCM-DPC/新冠肺炎/blob/master/schede-riepilogative/regioni/DPC-covid 19-ita-scheda-regioni-2020 04 03 . pdf

https://www . epicentro . ISS . it/coronavirus/SARS-cov-2-decessi-Italia

**** [## 意大利的冠状病毒。拉马帕-德尔孔塔吉奥

意大利 29 日发生的第一起冠状病毒 2 型感染者死亡事件。到期…

www.ilfoglio.it](https://www.ilfoglio.it/salute/2020/02/24/news/il-coronavirus-in-italia-la-mappa-del-contagio-303522/) [## 冠状病毒,真正的死亡人数:贝加莫省一个月内有 4500 名受害者

这是 L'Eco di Bergamo 和 InTwig 使用当地……提供的数据进行分析的结果

www.ecodibergamo.it](https://www.ecodibergamo.it/stories/bergamo-citta/coronavirus-the-real-death-tool-4500-victims-in-one-month-in-the-province-of_1347414_11/) [## 伦巴第的冠状病毒,迪雷塔的 tutti gli aggiornamenti

关于达拉斯地区冠状病毒感染病例的确认问题。

www.lombardianotizie.online](https://www.lombardianotizie.online/coronavirus-casi-lombardia/)

https://www . ecodibergamo . it/stories/Bergamo-citta/coronavirus-the-real-death-tool-4500-victims-in-one-month-of-the-province-of _ 1347414 _ 11/****

新冠肺炎:使用 TensorFlow 和 OpenCV 的人脸面具检测

原文:https://towardsdatascience.com/covid-19-face-mask-detection-using-tensorflow-and-opencv-702dd833515b?source=collection_archive---------3-----------------------

构建一个 CNN 模型,用你的网络摄像头或手机摄像头检测一个人是否戴着口罩。

在这些艰难的时代,做一些与之相关的事情岂不是令人满足?我决定用 TensorFlow 搭配 Keras 库和 OpenCV 建立一个非常简单基本的卷积神经网络(CNN)模型,来检测你是否戴了口罩来保护自己。有意思!不是吗?

澳门图片社拍摄于 Unsplash

为了建立这个模型,我将使用由般若班达瑞提供的面具数据集。它由大约1376个图像和 690 个包含带面罩人的图像和 686 个包含不带面罩人的图像组成。

我将使用这些图像构建一个 CNN模型,使用 TensorFlow 通过使用您的 PC网络摄像头来检测您是否戴着面罩。此外,你也可以用你的手机的摄像头来做同样的事情!**

步骤 1:数据可视化

在第一步中,让我们可视化两个类别的数据集中的图像总数。我们可以看到在' yes '类中有 690 图像,在' no 类中有 686 图像。

**The number of images with facemask labelled 'yes': 690 
The number of images with facemask labelled 'no': 686**

第二步:数据扩充

在下一步中,我们 增加 我们的数据集,以包括更多数量的图像用于我们的训练。在这个数据扩充的步骤中,我们旋转翻转我们数据集中的每张图像。我们看到,在数据扩充后,我们总共有 2751 张图像,其中 1380 张 图像属于“ 类,而“ 1371 张 图像属于“ 类。

**Number of examples: 2751 
Percentage of positive examples: 50.163576881134134%, number of pos examples: 1380 
Percentage of negative examples: 49.836423118865866%, number of neg examples: 1371**

第三步:拆分数据

在这一步中,我们 将我们的数据分割成 训练集测试集 ,训练集将包含 CNN 模型将被训练的图像,测试集包含我们的模型将被测试的图像。****

在这里,我们取split _ size = 0.8,这意味着总图像的的 80%将进入训练集,剩余的 图像的 20% 将进入测试集。**

**The number of images with facemask in the training set labelled 'yes': 1104
The number of images with facemask in the test set labelled 'yes': 276
The number of images without facemask in the training set labelled 'no': 1096
The number of images without facemask in the test set labelled 'no': 275**

在分割之后,我们看到如上所述,期望百分比的图像已经被分配给训练集和测试集。

第四步:建立模型

下一步,我们构建我们的 顺序 CNN 模型 ,具有各种层,如 Conv2D、MaxPooling2D、Flatten、DropoutDense 。在最后一个密集层中,我们使用' softmax '函数来输出一个向量,该向量给出两个类中每一个的概率

人脸面具检测的序贯模型

这里,我们使用'Adam' optimizer 和'binary _ cross entropy'作为我们的损失函数,因为只有两个类。此外,您甚至可以使用 MobileNetV2 来获得更高的精确度。

口罩 CNN 模型(来源——自己)

第五步:预先训练 CNN 模型

在构建了我们的模型之后,让我们创建' train_generator 和'validation _ generator'以在下一步中使它们适合我们的模型。我们看到 训练集 中总共有 2200 张 图像,中有 551 张 图像。**

**Found 2200 images belonging to 2 classes. 
Found 551 images belonging to 2 classes.**

步骤 6:训练 CNN 模型

这一步是我们将训练集和测试集中的图像与我们使用 keras 库构建的序列模型相匹配的主要步骤。我已经为 30 历元 训练了模型(迭代)。但是,我们可以训练更多的周期数以获得更高的精度,以免出现过拟合

**history = model.fit_generator(train_generator,
                              epochs=30,
                              validation_data=validation_generator,
                              callbacks=[checkpoint])>>Epoch 30/30
220/220 [==============================] - 231s 1s/step - loss: 0.0368 - acc: 0.9886 - val_loss: 0.1072 - val_acc: 0.9619**

我们看到,在第 30 个历元之后,我们的模型对于训练集的准确度为98.86%,对于测试集的准确度为 96.19% 。这意味着它训练有素,没有任何过度配合。

第七步:标注信息

建立模型后,我们为我们的结果标注两个概率。【0】 【不带 _ 面具】 【1】** 【带 _ 面具】 。我还使用 RGB 值设置了边界矩形的颜色。 【红色】 【不带 _ 面具】 【绿色】 【带 _ 面具】**

**labels_dict={0:'without_mask',1:'with_mask'} 
color_dict={0:(0,0,255),1:(0,255,0)}**

步骤 8:导入面部检测程序

在此之后,我们打算用它来检测我们是否戴着口罩使用我们的电脑的网络摄像头。为此,首先,我们需要实现人脸检测。在这里,我使用基于 Haar 特征的级联分类器来检测面部特征。

**face_clsfr=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')**

这个级联分类器是由 OpenCV 设计的,通过训练成千上万的图像来检测正面人脸。的。xml 文件也需要下载并用于检测面部。我已经将文件上传到了我的 GitHub 存储库中。

第九步:检测戴面具和不带面具的人脸

在最后一步中,我们使用 OpenCV 库运行一个无限循环来使用我们的网络摄像头,其中我们使用级联分类器来检测人脸。代码webcam = cv2.VideoCapture(0)表示网络摄像头的使用。

该模型将预测两类([without_mask, with_mask])中每一类的可能性。基于哪个概率更高,标签将被选择并显示在我们的脸部周围。

此外,您可以下载适用于手机和 PC 的droid cam应用程序,以使用您手机的摄像头并在 *webcam= cv2.VideoCapture(1).*中将数值从 0 更改为 1**

演示

让我们看看我在自己身上试用的演示吧!

演示视频

从上面的演示视频中,我们看到模型能够正确地检测到我是否戴着面具,并在标签上显示出来。

我正在分享我的 GitHub 库的链接,在那里你可以找到详细的。ipynb 程序代码,供你试用。

** [## MK-gurucharan/面罩检测

在此,我附上我的代码,建立一个 CNN 模型,以检测一个人是否戴着口罩或不使用…

github.com](https://github.com/mk-gurucharan/Face-Mask-Detection/)

在这篇文章中,我们成功地建立了一个 CNN 模型来检测一个人是否戴着面罩。这可以用于许多应用中。考虑到新冠肺炎危机,戴口罩在不久的将来可能是必要的,这种检测人是否戴口罩的方法可能会派上用场。

我真的希望这些艰难的日子能尽快结束。让我们都保持健康和安全。到那时,快乐的机器学习!**

新冠肺炎常见问题机器人:一切你需要知道的 QnA 相似性

原文:https://towardsdatascience.com/covid-19-faq-bot-everything-you-need-to-know-about-qna-similarity-35a730f63fa1?source=collection_archive---------45-----------------------

新冠肺炎相关问题的自动问答系统

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

最近几个月,新冠肺炎已经成为全球热门话题。今天,正如新冠肺炎强烈显示的那样,预防胜于治疗。他们中的大多数人在目前的情况下都能很好地理解这句话。是的,人们正试图阻止自己和他人传播病毒。的确,社交距离和戴 N-95 口罩被人们广泛效仿。

人们对每个话题都有自己的假设和看法。许多人都有一些常见问题,这些问题被称为常见问题。在今天的情况下,新冠肺炎病例迅速增加。每个人都想知道新冠肺炎病毒的真相。此外,他们中的大多数都有如下常见问题:

  • 病毒是如何传播的?
  • 有什么症状?
  • 有疫苗吗?
  • 病毒在表面存活多久?

每个人都有自己的假设或疑问。

在这篇文章中,将讨论如何建立自动新冠肺炎常见问题机器人检索常见问题的答案。

  1. 数据收集—新冠肺炎常见问题数据
  2. 数据准备
  3. 数据预处理
  4. 问题表示技术
  5. 使用用户查询评估

1.数据收集—新冠肺炎常见问题

数据收集是从各种可用来源收集相关信息。当我在网上搜索新冠肺炎常见问题时,我找到了以下参考资料。

  1. https://www.mohfw.gov.in
  2. https://www.cdc.gov
  3. https://www.un.org

我选择了https://www.un.org网站新冠肺炎常见问题数据来建立我们的问答相似性系统。它有 39 个不同的新冠肺炎常见问题。了解可用数据的格式总是非常重要的。它是一个 PDF 非结构化文档。让我们以编程方式下载该文件,如下面的代码片段所示。

2.数据准备

下一个任务是准备所需格式的数据来解决问题。因为,我们需要从非结构化文档中提取每个问题和相应的答案,并将其存储在结构化文件中。从文本文件中提取信息的最好和最简单的方法是进行解析。解析有助于检索基于以下假设的特定信息。

假设:

  1. 它必须遵循原始文本中的一些模式。
  2. 应该从 PDF 中提取相同的结构。
  3. 文本中不应包含任何干扰。

在管道中,它涉及以下任务。

  • 它使用 R 模块将 PDF 文件转换为文本文件。这个模块在文本文件中保持相同的 PDF 结构。我发现与 python 中的其他模块相比,这个模块工作得非常好。结构的内容将帮助我们很好地解析 QA。外部执行的 PDF 到文本的转换过程。(这个过程没有包含在代码片段中)
  • 模式匹配对于从原始文本中检索结构化信息非常有效。我们将使用 python 模块解析问题和答案。(如下面的代码片段所示)
  • 存储新冠肺炎常见问题问答结构化(。csv)文件。

准备好的新冠肺炎常见问题数据如下所示:

结构化新冠肺炎常见问题数据。(前 10 行)

3。数据预处理

我们不会照原样使用数据。预处理是 NLP 中微调数据的另一个非常关键的步骤。

  1. 删除不需要的字符
  2. 删除问题编号
  3. 删除停用词
  4. 词汇化——减少单词的变形,最小化单词歧义。

我们将这些技术应用于 FAQ 问题和用户查询问题。

为什么我选择词汇化而不是词干化?

词干化和词尾化都是为了减少屈折形式。词汇化将文本最小化为适当的词汇但是,词干化减少到单词的前缀或后缀。词汇化将所有意思相同但表达不同的单词转换成它们的基本形式。

新冠肺炎文本预处理程序类。

4.问题表示技术

在本节中,我们将讨论表示常见问题的多种方式。

  1. TF-IDF
  2. 单词嵌入
  3. 伯特嵌入

TF-IDF

我们将用于语义相似性的第一种方法是利用单词包(BOW)。TF-IDF 将文本转换成有意义的数字。该技术是 NLP 应用中广泛使用的特征提取。TF(词频)衡量单词在文档中出现的次数。IDF(逆文档频率)测量在所有文档中具有高频率的词的低值。

新冠肺炎常见问题 TF-IDF 问题表示如下图所示,

TF-IDF 新冠肺炎分数表示常见问题。

用于生成 TF-IDF 表示的代码片段如下所示:

单词嵌入

GloVe 是一种无监督学习算法,用于获取单词的矢量表示。它在全局单词-单词共现矩阵上进行训练。我从 Glove 下载了一个预先训练好的单词向量用于我们的分析。用于生成文字嵌入表示的代码片段如下:

让我们来看看嵌入对于语义信息是如何相互接近的。

具有相似嵌入的“防止”的单词嵌入可视化。(二手手套-twitter-25)

伯特嵌入

BERT 是一个基于 transformer 的模型,试图利用单词的上下文来获得嵌入。伯特打破了几项 NLP 任务的记录。下面的搜索查询是理解 BERT 的一个很好的方法。“2019 年巴西旅行者去美国需要签证”。我们观察到单词“to”与句子中其他单词的关系对于语义解码是重要的。返回美国公民到巴西旅游的信息是不相关的,因为我们谈论的是巴西公民到美国旅游。伯特能处理好这件事。

5.使用用户查询评估

我们向多个代表提出了新冠肺炎常见问题。让我们评估用户新查询的每个表示。我们如何发现 FAQ 问题与新用户查询的相似之处?。寻找相似性得分的最佳技术之一是余弦相似性。我们现在将使用余弦相似度来比较每个表示。如何计算余弦相似性,如下面的代码片段所示,

我们将根据以下问题评估 FAQ 问题的相似性。

用户查询问题。

手套嵌入结果。

我们通过嵌入和 BERT 嵌入表示获得了最好的结果。TF-IDF 的缺点是不能从语义上表示这个问题。完整的代码可以在 GitHub 中找到。你可以通过 LinkedIn 联系到我。

感谢阅读。!!!

资源:

https://github . com/narendraprasath/新冠肺炎-常见问题-问答-机器人

新冠肺炎微调伯特文学搜索引擎

原文:https://towardsdatascience.com/covid-19-finetuned-bert-literature-search-engine-93ff9755a502?source=collection_archive---------35-----------------------

在过去的几周内,研究工作和研究论文的数量在持续增加,以对抗这种冠状新冠肺炎邪恶病毒。组织如此庞大的数据现在至关重要,这就是这项工作( kaggle 代码github 代码优化运行在谷歌实验室、数据)试图实现的,作为Kaggle 竞赛的一部分,该竞赛试图找到智能解决方案来组织大量不断增加的研究知识。

微调 BERT,然后嵌入研究论文来构建搜索引擎

我们的方法是

  1. 使用变压器包微调 BERT 架构
  2. 然后嵌入研究论文查询,并使用余弦相似度在它们之间进行比较,有效地构建了一个搜索引擎,这里我们将使用句子转换包

这篇教程是我们上一篇教程 ( 代码数据)的延续,在这篇教程中,我们使用了一个已经训练好的 BERT 模型,并用它来构建我们的搜索引擎,不同的是,今天我们将微调我们的 BERT 模型以适应研究论文本身,所以让我们开始吧!!

A.为什么是伯特

BERT 已经证明了它是语言建模的架构,在使用 Transformers 之前,文献使用 seq2seq 编码器-解码基于递归的模型(在我们的博客系列中阅读更多)

然而,使用 LSTM 限制了该架构处理长句的能力,所以这就是为什么在他们的论文中引入了变形金刚【注意力是你所需要的全部】,它们依赖于注意力模型,特别是自我注意力,这是一种神经网络,旨在理解如何关注输入句子中的特定单词,变形金刚也内置于编码器/解码器结构中(在贾马尔的精彩博客http://jalammar.github.io/illustrated-transformer/中了解更多信息)

来自http://jalammar.github.io/illustrated-transformer/

结果是,我们不需要整个 Transformer 采用一个可微调的语言模型来完成 NLP 任务,我们可以只使用解码器,就像 OpenAI 提出的那样,然而,由于它使用解码器,模型只训练一个正向模型,而不考虑前面和后面(因此是双向的),这就是为什么引入了 BERT,我们只使用 Transformer 编码器。

来自http://jalammar.github.io/illustrated-bert/

B.微调伯特

为了获得巨大的语言理解,BERT 在巨大的数据集上被训练,然而,我们能够进一步训练 BERT 到我们自己的数据集,(这是 covid19 研究论文)这一步被称为微调,因为你微调 BERT 以适应我们自己的数据

1-首先我们将把研究论文(处理过的数据集在这里找到)以一个大文件的形式传递,其中每一段都在它自己的一行上

2-然后我们将使用变压器包来微调 BERT

所以让我们进入细节

1-处理数据,我们采用了一些处理技术来构建一个 csv 文件,其中每一行都是一篇论文中的一个段落,我们的搜索引擎会尝试获取与查询最相似的段落,您可以从这里下载数据(了解更多关于如何将数据从 google drive 连接到 google colab 这里)

import pandas as pd
from tqdm import tqdm#read csv
df_sentences = pd.read_csv("/content/drive/My Drive/BertSentenceSimilarity/Data/covid_sentences.csv")
df_sentences = df_sentences.set_index("Unnamed: 0")#load column to list
df_sentences = df_sentences["paper_id"].to_dict()
df_sentences_list = list(df_sentences.keys())
df_sentences_list = [str(d) for d in tqdm(df_sentences_list)]#process data to file
file_content = "\n".join(df_sentences_list)
with open("input_text.txt","w") as f:
    f.write(file_content)

2-现在我们将使用变形金刚套装来微调 BERT

!pip install transformers
!git clone https://github.com/huggingface/transformers.git

然后运行微调

!python "/content/transformers/examples/run_language_modeling.py" \
--output_dir="/content/drive/My Drive/BertSentenceSimilarity/BERTfine" \
--model_type=bert \
--model_name_or_path=google/bert_uncased_L-2_H-128_A-2 \
--do_train \
--block_size=512 \
--train_data_file="/content/input_text.txt" \
--mlm

C.构建搜索引擎

既然我们已经构建了自己的微调过的 BERT,让我们将嵌入应用到我们的数据中(使用句子转换器包)

!pip install -U sentence-transformers

然后加载您微调过的 BERT 模型

#https://github.com/UKPLab/sentence-transformers/blob/master/examples/application_semantic_search.pyfrom sentence_transformers import SentenceTransformer
from sentence_transformers import models, losses
import scipy.spatial
import pickle as pklword_embedding_model = models.BERT("/content/drive/My Drive/BertSentenceSimilarity/BERTfine")# Apply mean pooling to get one fixed sized sentence vector
pooling_model = models.Pooling(word_embedding_model.get_word_embedding_dimension(),
pooling_mode_mean_tokens=True,pooling_mode_cls_token=False,pooling_mode_max_tokens=False)model = SentenceTransformer(modules=[word_embedding_model, pooling_model])

然后应用嵌入,并将结果保存到 pkl 临时文件中

使用微调的 BERT 来嵌入我们的数据集

corpus = df_sentences_list
corpus_embeddings = model.encode(corpus,show_progress_bar=True)with open("/content/drive/My Drive/BertSentenceSimilarity/Pickles/corpus_finetuned_embeddings.pkl" , "wb") as f:
    pkl.dump(corpus_embeddings,f)

现在我们即将完成,我们只需要嵌入查询本身,然后使用余弦相似度来获得研究论文中最相似的段落,有效地构建一个搜索引擎

# Query sentences:queries = ['What has been published about medical care?',
'Knowledge of the frequency, manifestations, and course of extrapulmonary manifestations of COVID-19, including, but not limited to, possible cardiomyopathy and cardiac arrest',
'Use of AI in real-time health care delivery to evaluate interventions, risk factors, and outcomes in a way that could not be done manually',
'Resources to support skilled nursing facilities and long term care facilities.',
'Mobilization of surge medical staff to address shortages in overwhelmed communities .',
'Age-adjusted mortality data for Acute Respiratory Distress Syndrome (ARDS) with/without other organ failure – particularly for viral etiologies .']query_embeddings = model.encode(queries,show_progress_bar=True)

然后我们应用余弦相似度

# Find the closest 5 sentences of the corpus for each query sentence based on cosine similarityclosest_n = 5 
print("\nTop 5 most similar sentences in corpus:")*# Find the closest 5 sentences of the corpus for each query sentence based on cosine similarity*
closest_n = 5
print("**\n**Top 5 most similar sentences in corpus:")
**for** query, query_embedding **in** zip(queries, query_embeddings):
    distances = scipy.spatial.distance.cdist([query_embedding], corpus_embeddings, "cosine")[0]

    results = zip(range(len(distances)), distances)
    results = sorted(results, key=**lambda** x: x[1])

    **for** idx, distance **in** results[0:closest_n]:
        print("Score:   ", "(Score: **%.4f**)" % (1-distance) , "**\n**" )
        print("Paragraph:   ", corpus[idx].strip(), "**\n**" )
        row_dict = df.loc[df.index== corpus[idx]].to_dict()
        print("paper_id:  " , row_dict["paper_id"][corpus[idx]] , "**\n**")
        print("Title:  " , row_dict["title"][corpus[idx]] , "**\n**")
        print("Abstract:  " , row_dict["abstract"][corpus[idx]] , "**\n**")
        print("Abstract_Summary:  " , row_dict["abstract_summary"][corpus[idx]] , "**\n**")

D.结果是

(与我们上一个教程的预训练 BERT 相比)

示例 1:

==========================Query==========================
=== What has been published about medical care? =========
===================================================================================OLD (pretrained)=======================
Score:    (Score: 0.8296)
Paragraph:    how may state authorities require persons to undergo medical treatment
Title:    Chapter 10 Legal Aspects of Biosecurity----------------------------------Score:    (Score: 0.8220) 
Paragraph:    to identify how one health has been used recently in the medical literature
Title:    One Health and Zoonoses: The Evolution of One<br>Health and Incorporation of Zoonoses==========================NEW (finetuned)=========================
---------------Score:    (Score: 0.8779)Paragraph:    what is already known about this topic what are the new findings   paper_id:   f084dcc7e442ab282deb97670e1843e347cf1fd5 Title:    Ebola Holding Units at government hospitals in<br>Sierra Leone: evidence for a flexible and effective<br>model for safe isolation, early treatment<br>initiation, hospital safety and health system functioning---------------Score:    (Score: 0.8735)
Paragraph:    to identify how one health has been used recently in the medical literatureTitle:    One Health and Zoonoses: The Evolution of One<br>Health and Incorporation of Zoonoses

示例 2:

==========================Query==============================
=== Knowledge of the frequency, manifestations, and course of extrapulmonary manifestations of COVID-19, including, but not limited to, possible cardiomyopathy and cardiac arrest =====
===================================================================================OLD (pretrained)=======================
--------------Score:    (Score: 0.8139) 
Paragraph:    clinical signs in hcm are explained by leftsided chf complications of arterial thromboembolism ate lv outflow tract obstruction or arrhythmias capable of
Title:    Chapter 150 Cardiomyopathy --------------Score:    (Score: 0.7966) 
Paragraph:    the term arrhythmogenic cardiomyopathy is a useful expression that refers to recurrent or persistent ventricular or atrial arrhythmias in the setting of a normal echocardiogram the most commonly observed rhythm disturbances are pvcs and ventricular tachycardia vt however atrial rhythm disturbances may be recognized including atrial fibrillation paroxysmal or sustained atrial tachycardia and atrial flutter
Title:    Chapter 150 Cardiomyopathy==========================NEW (finetuned)=========================
--------------Score:    (Score: 0.8942)
Paragraph:    echocardiography and cardiac catheterization are common cardiac imaging modalities both modalities have drawbacks the limitations of echocardiography include operator dependence limited acoustic shadows a small field of view and poor evaluation of pulmonary veins the limitations of cardiac .......Title:    Trends in the utilization of computed<br>tomography and cardiac catheterization among children<br>with congenital heart disease--------------Score:    (Score: 0.8937)
Paragraph:    classic physical examination features of dcm include soft heart sounds from reduced contractility or pleural effusion gallop rhythm with or without a systolic murmur hypokinetic arterial pulses dull left apical impulse and clinical signs of profound chf exceptional cases are seen prior to onset of chfTitle:    Chapter 150 Cardiomyopathy

正如我们所看到的,新的微调伯特已经获得了经验丰富的知识,特别是优化和定制的新冠肺炎研究论文

完整的结果请参考我们的代码笔记本 (kaggle)或代码 (github 优化为在 google colab 上运行)

电子评论

我们真的被深深打动了,

  • 变形金刚包的易用性使得微调 BERT 变得非常容易,只需提供一个输入文本文件,每行包含一个句子(在我们的例子中是研究论文中的段落)
  • 句子转换器库,这使得应用 BERT 嵌入和提取相似性变得极其容易。
  • 结果的质量给我们留下了深刻的印象,因为与我们上一次教程中的一般预训练的 BERT 相比,微调的 BERT 被证明更适合我们自己的数据集
  • 我们相信,通过使用段落本身,而不仅仅是论文的摘要,我们不仅能够返回最相似的论文,而且能够返回论文中最相似的部分。
  • 我们希望通过这一点,我们正在帮助构建一个不断增加的文献研究工作的世界,以对抗这种冠状新冠肺炎病毒。

电子参考文献

  • 我们使用由拥抱脸提供的叫做变形金刚的库,这个库使得微调伯特变得非常容易
  • 我们使用由 UKPLab 提供的名为句子转换器的库,这个库使得使用 BERT 和其他架构如 ALBERT、XLNet 进行句子嵌入变得非常容易,它们还提供了一个简单的接口来查询和聚集数据。
  • 我们已经使用来自 maksimeren 的代码进行数据处理,我们真心感谢他。
  • 我们使用了绘画伯特的概念,在这里讨论杰伊·阿拉姆马在说明我们的建筑如何工作时,我们还参考了他所做的多个插图和解释,他的博客信息量极大,易于理解。
  • 我们使用 Conneau 等人在 2017 年讨论的预训练模型,在 InferSent-Paper(从自然语言推理数据中监督学习通用句子表示)中显示,对自然语言推理(NLI)数据的训练可以产生通用句子嵌入。
  • 注意就是你所需要的变压器纸
  • 伯特伯特代码
  • 我们使用了一些来自 Freepic 的矢量(图像)元素

本教程的代码可以在这里找到,或者从 github 这里找到(如果你需要在 google colab 上运行它),代码被构建为在 google colab 上无缝运行,使用其免费使用的 GPU,我们也使用 kaggle API 将数据直接下载到 google colab,所以既不需要在本地运行代码,也不需要在本地下载数据集。

我们还提供了所有处理过的数据集和嵌入的段落(219MB ),这些都需要一些时间来嵌入(所以你可以简单地使用它而不需要再次运行嵌入),链接这里,这些都托管在 google drive 上,我们已经构建了代码github 代码来无缝连接到 google drive,(了解更多关于连接 google drive 的信息这里

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

我们真的相信,通过本教程,您已经对 BERT 有了更多的了解,以及如何根据您自己的数据集对其进行微调,我们也希望通过本教程,我们能够帮助研究社区对抗冠状病毒(新冠肺炎)。

希望你们都平安无事。

新冠肺炎地理信息系统资源概要

原文:https://towardsdatascience.com/covid-19-gis-resource-summary-debcba2a000b?source=collection_archive---------45-----------------------

利用数据科学帮助拉平曲线

新冠肺炎数据来源插图作者金彩云

OVID-19 是研究人员的热门话题。了解此次疫情及其与人口、基础设施和其他定位信息的关系,是做好准备、做出正确决策、让公民及其社区获得足够信息以应对危机的关键。为了支持这一点,世界上的一些公司和组织允许研究人员访问他们的软件和资源。

在我们开始之前,我想感谢徐健写的关于对新冠肺炎数据源进行审查的 文章 。如果您正在查找全球和美国数据集,则建议您这样做。

在本文中,我们将介绍更多的资源(截止到 2020 年 4 月 16 日),其中包括 GIS 项目的软件和数据源!

我们开始吧!

ESRI:新冠肺炎数据中心

如果您想要使用与新冠肺炎疫情相关的 GIS 数据集,您可以查看新冠肺炎数据中心,其中包含多个可在 GIS 分析项目中直接使用的 GIS 要素在线服务。

链接到新冠肺炎资源页面:此处

OGC 新冠肺炎资源

国际自愿共识标准组织开放地理空间联盟 ( OGC )已经收集了可信任的新冠肺炎数据集资源、相关 GIS 数据、底图以及新冠肺炎应用实例。在我看来,这是查看这里的资源的一个非常好的起点。

链接到 OGC 新冠肺炎资源页面:这里

安全软件:FME

来自 Safe 软件的 FME (特征操作引擎)是一款完美的用于 GIS 数据的 ETL(提取转换加载)软件,具有易于使用的用户界面。根据我的经验,这个软件在几个项目中帮助我做了很多数据准备和地图数据的转换,因为它支持我所知道的所有 GIS 数据格式。例如,它是唯一允许在 CityGMLEsri 地理数据库格式之间转换的工具。

用于将 CityGML 转换为 ESRI 地理数据库的 FME 工作空间示例

Safe 软件已经在他们的网站上宣布免费提供 FME 许可证,至少到 2020 年 9 月 30 日,为那些参与新冠肺炎相关项目的人,学习如何更好地支持他们的社区。

链接获取新冠肺炎期间免费 FME 牌照:此处

新冠肺炎 JSON

如果您是一名想要创建基于新冠肺炎数据的应用程序的 web 开发人员。建议您使用新冠肺炎 JSON API,它以 JSON 时间序列格式提供更新的新冠肺炎数据。这个数据集是可靠的,因为它根据约翰霍普金斯 CSSE 大学的每天更新。

链接到新冠肺炎 JSON: 这里

RKI 和 DWD(德国数据集)

由于我是德国的一名研究人员,我想分享来自罗伯特·科赫研究所(RKI)的最可靠和准确的德国新冠肺炎数据源。它是德国联邦政府机构和研究机构,负责疾病控制和预防。

数据集每天更新,并通过此链接公开提供:[此处](http://German federal government agency and research institute responsible for disease control and prevention.)其仪表板应用程序可通过此链接获得:此处

新冠肺炎开放研究数据集(CORD-19)

如果您正在研究或在学术领域对研究出版物感兴趣,请查看 CORD-19 ,这是一个开放资源,包含超过 51,000 篇关于新冠肺炎和冠状病毒家族的学术文章,供全球研究社区使用。

链接到 CORD-19: 此处

作者消息

我是一名德国地理信息学领域的研究人员,希望与大家分享我所了解的可靠的新冠肺炎资源,我也会继续更新这篇文章。如果您有任何问题或意见,请告诉我。

引用

[1]开放地理空间联盟,来自 OGC 的新冠肺炎资源 (2020),https://www.ogc.org/resources-for-COVID-19-from-ogc

宾夕法尼亚州立大学格拉斯门毕业生薪酬分析

原文:https://towardsdatascience.com/covid-19-glassdoor-penn-state-graduate-salary-analysis-7003a118c5bb?source=collection_archive---------53-----------------------

使用的数据科学工具和成果

介绍

新冠肺炎显然影响了就业市场。许多应届毕业生和即将毕业的大四学生被迫完成 2019-2020 学年,实际上在寻找工作和实习机会方面受到了严重影响,包括我和我的女朋友。

穆罕默德·沙赫侯赛尼在 Unsplash 上的照片

她和我都是宾州州立大学的高年级学生。由于新冠肺炎在就业市场造成的影响,美国许多公司已经并继续遭受大规模裁员,正因为如此,学生和新毕业生的许多机会现在都消失了。

然而,有一天,当社交距离和呆在家里,我有一个想法突然出现在我的脑海里。

如果我为我女朋友的专业做一个关于当前就业市场的项目会怎么样?

这太完美了。这不仅对我的作品集来说是一个有价值的项目,而且也是一个有意义的分析,可以帮助她和其他学生了解哪些州目前在某些工作上比其他州拥有更多的机会。

目标

我的目标是总结哪些技能是雇主最需要的,哪些州对这些技能的招聘最多。这将使我有机会向我的“利益相关者”(我的女朋友)报告这些信息,帮助她在其他人申请同样的机会时获得优势。

通过写这篇文章,我在练习我讲故事的能力,并会感谢任何有助于我提高的反馈。

开始项目

我首先要问我在这个项目中的“利益相关者”她想要的职位是什么。以下是她转述给我的一些职位名称:

  • 创意总监
  • 营销总监
  • 营销经理
  • 品牌经理
  • 营销协调员

有了一个好的开始,现在我需要得到那些要求这些工作的公司的招聘信息。

由于这是一个数据科学项目,我想自己手动收集数据。我决定跟随我的朋友 Ken Jee 的教程,他在自己的项目中讲解了如何用 Python 搜集 Glassdoor 数据,帮助我获得了大约 2000 个招聘广告。作为参考,我在这里链接了他的 YouTube 系列

沟通

在我探索如何成为一名数据科学家/分析师的过程中,我了解到沟通是一项基本技能。

我个人认为这也适用于人际关系。

进入这个项目时,我不知道在她的领域里需要什么样的技能,但是没关系。将来会有这样的情况,我将从事一个我可能没有多少背景的项目。由我来学习,找出这些信息来完成任务,找到答案。****

我决定做一个组合,问我的女朋友她从她的课程中学到了什么样的通用技能,并在谷歌上搜索这些相应职位的通用技能/先决条件。这些技能包括:

  • 微软 Word
  • 微软优越试算表
  • Adobe 创意云

然后,我在 2000 份招聘信息的数据集中设计了一些特征,看看哪些工作需要什么技能,在哪个州。

由于这篇文章主要是关于我的发现和反馈信息,我不会深入讨论该项目的数据收集、清理和探索性分析阶段,但是这些步骤的文档都可以在我的 GitHub 上获得。

我的一些发现:

在我的利益相关者给我的七个职位列表中,这是全美薪酬最高的前三个职位。

  • 创意总监:111886 美元。
  • 营销总监:99547 美元。
  • 营销经理:76266 美元。

那些有微软 Excel 工作经验的人的总工资要高出 13%。

根据 Glassdoor 的调查,前五大最佳招聘城市约占所有招聘职位的 17%。

  1. 纽约州纽约市:127 个招聘信息。
  2. 加利福尼亚州旧金山:60 份招聘启事。
  3. 伊利诺伊州芝加哥:58 个招聘广告。
  4. 华盛顿州西雅图:56 个招聘广告。
  5. 佐治亚州亚特兰大:45 个招聘广告。

所有职位平均工资中薪酬最高的 5 个州排名:

  1. 阿肯色州:89250 美元。
  2. 堪萨斯州:75750 美元。
  3. 南达科他州:7.45 万美元。
  4. 蒙大拿州:73250 美元。
  5. 爱荷华州:73071 美元。

我女朋友最感兴趣的是获得一个创意总监的职位。有了这些信息,我做了更多的分析,特别是针对这个职位。我创建了一个 Tableau 可视化,但不幸的是,互动功能无法在媒体上显示。

相反,下面是显示创意总监薪酬最高的州的地图截图。对于那些有兴趣看到地图完整交互功能的人,我将把它链接到这里。

创意总监收入最高的 5 个州。

  1. 蒙大拿州:18.4 万美元。
  2. 德克萨斯州:14.04 万美元。
  3. 爱荷华州:138250 美元。
  4. 华盛顿:138250 美元。
  5. 新泽西州:137250 美元。

根据我的分析,我最喜欢的随机事实是:

夏威夷是营销协调员薪酬最高的第五个州,平均薪酬为 80,500 美元。

包装东西

我的项目到此结束,我非常感谢我的叔叔詹姆斯帮我润色了这篇文章。我尽量让它简短,但尽可能提供更多信息。如果你对这个分析的全部内容感兴趣,我会把它链接到这里。请随时关注我,并在 LinkedIn 上与我联系,在我继续记录我的工作,朝着获得数据科学职位的目标努力的过程中,观察我的成长。我将在今年秋天回到宾夕法尼亚州立大学大四的时候开始申请全职职位。

新冠肺炎:数据科学家如何为医学界做出贡献?

原文:https://towardsdatascience.com/covid-19-how-data-scientists-can-contribute-to-the-medical-community-ad03b19d34f0?source=collection_archive---------31-----------------------

来源:https://www . pexels . com/photo/concept-of-新冠肺炎-in-red-background-4031867/

让我们来讨论一下新冠肺炎!!

H 作为数据科学社区,我们如何为新冠肺炎疫情的研究做出贡献?为了解决这些问题,我们定期发布了几个数据集。新冠肺炎开放研究数据集挑战(CORD-19) 发布于 Kaggle 是最重要的数据集之一,由大约 47K 篇关于这些冠状病毒的学术文章组成。世界各地的许多人工智能研究人员正在不断地研究它,以从这些巨大的资源中提取有用的见解,并以简单的方式向医疗界提供所需的信息。让我们看看问题陈述:-

来源:https://www . ka ggle . com/Allen-institute-for-ai/CORD-19-research-challenge

在进一步深入之前,让我们讨论一下 CORD-19 挑战中为研究人员提出的任务。作为这项挑战的一部分,总共有 10 项任务,如下所示:

来源:https://www . ka ggle . com/Allen-institute-for-ai/CORD-19-research-challenge

数据集呢?嗯,我们提供了一个 CSV 文件,其中包含大约 29k 篇研究论文的元数据信息,如标题、摘要、论文正文等。除此之外,我们还获得了几个 JSON 文件,其中包含大约 13k 篇研究论文的细节。

来源:https://www . ka ggle . com/Allen-institute-for-ai/CORD-19-research-challenge

目前,Kaggle 上有超过 600 个公开可用的内核,这些内核是由不同的研究人员发布的。这篇文章旨在讨论解决这种无监督的 ML 问题的一些最佳技术。

注:术语 【查询】【疑问】 互换使用。此外,术语 【研究论文】【研究文章】 可以互换使用,指的是同一件事。

方法一:新冠肺炎文献聚类

[## 新冠肺炎文献聚类

使用 Kaggle 笔记本探索和运行机器学习代码|使用来自多个数据源的数据

www.kaggle.com](https://www.kaggle.com/maksimeren/covid-19-literature-clustering)

当我们进入无监督任务领域时,聚类是我们脑海中出现的明显方法。给定一个查询文章,聚类可以用来创建一个识别相似文章的工具。这个笔记本使用 K-Means 对相似的研究文章进行聚类。除此之外,作者还尝试了各种降维技术,如主成分分析和 t-SNE 来绘制交互图,以更好地了解不同的聚类。

  1. 数据准备:解析每个 JSON 文件,并从元数据 CSV 文件中追加其元信息(“作者”、“标题”、“期刊”)。最终准备好的数据看起来是这样的-

2。数据预处理:进行小写转换、去除标点符号等常用文本预处理,并利用文章正文创建特征向量。

3。 特征生成:生成来自单词的 n 元语法(n=2 ),并使用哈希矢量器来创建特征向量 x。

4。使用 t-SNE 进行降维:这种高维特征向量被降维为两个特征,以观察数据中是否存在某种模式,t-SNE 能够将相似的实例保存在一起。虽然在下图中观察到几个集群,但是没有标签来区分这些集群。

5。用 K-均值聚类:聚类的初始值即 K 被选择为 10,并且 K-均值被应用于原始数据(大小为 4096 的特征向量)。现在,可以使用 K-Means 对象的预测功能来获得每个数据点的分类标签。带有聚类标签的图如下所示。从图中可以看出,来自同一个簇的文章彼此靠近。但是仍然存在重叠,可以通过 K 的超参数调整、更好的特征表示等来克服。

6。进一步的改进:首先,使用 tf-idf 来产生更好的特征表示,而不是使用哈希矢量器,然后对其应用 K-Means。然后使用 t-SNE 将维数降低到 2 用于绘图。

这一次聚类更加清晰可见,这意味着 tf-idf 的特征表现有所改善。作者进一步试验了 PCA 图并将 K 值增加到 20。此外,一个互动的 t-SNE 图显示,这是本笔记本的主要贡献之一。

总结:这款笔记本实验了聚类&降维技术。给定一个查询,可以使用 K-Means 预测函数为其分配一个包含相似文章的聚类标签。主要的挑战将是确定 K 的正确值,并得出良好的特征表示。如果一些先进的技术,如医学领域的 BERT finetuned 可以用于特征表示,我想结果可以是即兴的。除此之外,其他聚类算法,如 DBSCAN,也可以进行实验,它不需要我们初始化聚类数。

方法 2:主题建模:查找相关文章

[## 主题建模:查找相关文章

使用 Kaggle 笔记本探索和运行机器学习代码|使用来自多个数据源的数据

www.kaggle.com](https://www.kaggle.com/danielwolffram/topic-modeling-finding-related-articles)

本笔记本使用 LDA(潜在狄利克雷分配)发现了许多主题。这允许将每篇文章视为这些主题的混合。通过将一篇特定的文章映射到主题空间(每个角落都有一个主题的单纯形),我们可以找到相关的文章。

主题=单词分布,文章=主题混合

  1. 资料准备:文章正文在整个笔记本中使用。

2。数据预处理: scispaCy ,这是一个 Python 包,包含用于处理生物医学、科学或临床文本的 spaCy 模型。

3。 特征生成:使用 CountVectorizer 将每篇文章表示为一个单词包表示法。

4。潜在狄利克雷分配: LDA 用于在矢量化数据表示上生成各种主题,其中主题的数量初始化为 50。几个话题的前 25 个单词显示如下-

现在,每篇文章都表示为主题分布。

5。获取最近的论文(在主题空间中):为了获取与查询文章相似的文章,返回 k 个最近的文章的索引(如通过主题空间中的 Jensen-Shannon 散度)。作为相似性度量,使用 1-Jensen-Shannon 距离。

6。浏览任务:现在,一个任务可以映射到主题空间,可以找到相关的文章。

总结:在本笔记中,作者使用了主题建模方法将每篇文章表示为主题空间。主要挑战之一是确定主题的数量。另一个可以尝试的方法是在正文中添加标题或摘要信息。除此之外,其他语义相似度技术也可以用来推荐相似的文章。

方法 3: 线索:工具和知识图表

[## graphs🛠️ 🛠️工具与知识中心

使用 Kaggle 笔记本探索和运行机器学习代码|使用来自多个数据源的数据

www.kaggle.com](https://www.kaggle.com/shahules/cord-tools-and-knowledge-graphs)

本笔记本探索了各种方法,如主题建模、句子嵌入(使用)、DBSCAN 算法、关键词提取方法以及为相应任务创建知识图。

  1. 数据准备:本笔记本仅使用元数据 CSV 文件中的可用信息。首先,LDA 被应用于文章的标题以产生 4 个主题。

2。可视化主题:pyl Davis 库用于可视化每个单词在给定主题中的分布。

3。寻找相似的论文:这里使用了两种不同的方法来寻找相似的论文。

i) 然后,给定一个查询,它计算每篇文章之间的余弦相似度,并返回 k 篇最相似的文章。

ii) DBSCAN: 通过 spacy doc2vec 方法传递文章的标题,每篇文章由一个句子嵌入来表示。然后,DBSCAN 在这些文章的向量上运行,以生成各种聚类。然后,给定一个查询,它计算聚类标签并返回该聚类中存在的文章。

4。基于关键字提取的方法:下面描述的方法用于为给定的查询寻找相关的关键字

  • 首先附加所有来源的文章(JSON,CSV,biorxiv)
  • 从各种任务中选择一个子任务
  • 使用嵌入方法查找相关文章
  • 从这些文章中形成一个摘要列表
  • 然后做关键词抽取,从这些研究论文中得到重要的关键词。

关键词提取

关键词提取是从文本中提取最相关的单词和短语的自动化过程。关键词提取(也称为关键词检测或关键词分析)是一种文本分析技术,包括自动提取文本中最重要的单词和短语。它有助于总结一篇文章的内容,并识别正在讨论的主要话题。

这里使用了两种不同的关键字提取方法:I)使用 Rake ii)使用 PytextRank 库

Rake 库使用

5。知识图:然后从给定查询中找到的摘要列表构建知识图。创建一个数据框架,它包含这些摘要中的主题、关系和对象,以绘制知识图。

一步一步的例子-

问题:关于传播、潜伏期和环境稳定性,我们知道些什么?

  1. 获取类似文章。

2.准备摘要和标题

3.找出主语、宾语和关系,并画出 KG。

总结:这个笔记本展示了主题模型和知识图表的可视化效果。作者还使用了最先进的句子嵌入技术,如 USE,并计算了相似度。这方面的进一步工作包括如何遍历这个 KG 并从中获取有用的信息。

方法 CORD 的问答模型

[## 👑一个回答所有问题的模型

使用 Kaggle 笔记本探索和运行机器学习代码|使用来自多个数据源的数据

www.kaggle.com](https://www.kaggle.com/jonathanbesomi/question-answering-model-for-cord-19-beginner)

这款笔记本开发了一个通用的问答系统,可以回答(几乎)任何一种与冠状病毒相关的问题。作者还使用 HTML 和 CSS 以更好的方式显示结果。

问答(QA)模型:在机器学习中,一个问答模型由三个源组成:questioncontextanswer。模型输入为questioncontext,模型输出为answer。在大多数情况下,但不是所有情况下,answer包含在context中。

使用搜索引擎产生上下文:由于有超过 40k 的论文,需要通过选择所有与answer最相似的论文来减小上下文的大小。在代码中,一个非常简单的算法 Okapi BM25 被用于这个目的。

总体思路:查询- >搜索引擎- >上下文列表- >针对每个上下文和同一查询- > QA 模型- > span(部分上下文代表答案)

  1. 数据准备:本笔记本仅使用元数据 CSV 文件中的可用信息。

2。COVID 搜索引擎:BM 25 okapi 搜索引擎是在结合了整个研究文章的摘要和标题的数据上创建的。给定一个查询,它计算每篇文章的 bm25 分数,然后返回 k 分数最高的文章。这些文章将作为 QA 模型的上下文。

3。问答模型: 正在使用 Huggingface transformer 库来实现 QA 模型。这里使用的是在班数据集上预先训练的用于问题回答的 BERT 模型。从下面的代码片段可以理解整个方法。

4。CORD-19 Kaggle 问题:首先,所有的 CORD-19 任务和各自的问题都存储在一个 dictionary 对象中。然后,迭代这个字典,一个任务的所有问题被一个接一个地传递,并且为那个特定的任务附加答案。

5。显示问题、上下文和答案:使用 HTML & CSS 以格式良好的方式显示最终结果。

总结:本笔记本采用问答模式处理各自的任务。它还利用 BM25 搜索引擎来减少上下文大小。这里的另一种方法是使用一些先进的基于相似性的方法来查找相似的上下文,而不是依赖于 BM25 搜索引擎。另一件可以做的事情是在医学领域数据集而不是开放领域数据集上预先训练 QA 模型,然后将其用于问答任务。

方法 5:语义语料库搜索的 Anserini+BERT-SQuAD

https://www.kaggle.com/dirktheeng/anserini-bert-squad-for-语义语料库搜索

之前的 QA 模型借用了这个笔记本的思想,因此方法非常相似。这个笔记本还使用了开放领域问答和语义搜索引擎的概念来快速地将科学信息减少到最感兴趣的几条记录中。但是,本笔记本提供了一种方法来产生一个“最佳”答案,而不像以前的方法那样根据上下文获得多个答案。除此之外,这里作者还使用预训练的“BART”模型基于顶部结果生成了一个摘要用于“抽象摘要”。

用 BERT-SQuAD 进行语义搜索

Anserini 是一个建立在 Apache Lucene 之上的搜索引擎,它可以搜索文献并返回排名记录。作者没有在维基百科上使用 Anserini,而是使用了已经公开的 CORD-19 Lucene 数据库。

总体思路:查询- >搜索引擎- >排名细分- >针对每个细分和相同的查询- > QA 模型- >跨度集- >使用模型相似度矩阵进行跨度排名- >最高得分跨度- > BART 摘要- >抽象总结

注意:随着一个给定的查询,需要传递一组关键字来帮助驱动 Anserini 搜索引擎找到最感兴趣的结果。这是有益的,因为搜索的 Anserini 部分不是真正的上下文,不能破译的意思,所以关键字将有助于推动搜索。

定义比赛的所有问题

总结:这款笔记本还使用了搜索引擎和 QA 模式来处理各自的任务。作者还设计了一个模型来总结结果,以简单的方式给出答案。同样,这里的另一种方法可以是使用一些先进的基于相似性的方法来找到相似的上下文,而不是依赖于搜索引擎。此外,可以做的另一件事是在医学领域数据集上预先训练 QA 模型,如果可用的话,然后将其用于问答任务

方法 6: 带有句子嵌入的 CORD-19 分析

[## 具有句子嵌入的 CORD-19 分析

使用 Kaggle 笔记本探索和运行机器学习代码|使用来自多个数据源的数据

www.kaggle.com](https://www.kaggle.com/davidmezzetti/cord-19-analysis-with-sentence-embeddings)

该项目在 CORD-19 数据集上构建了一个索引,以帮助分析和数据发现。对于每个任务问题,都会构建一个亮点部分,其中包含结果摘要以及每篇匹配文章和每篇匹配文章的文本。

  1. 构建一个 SQLite 文章数据库:原始的 CORD-19 数据存储在一个 metadata.csv 文件和 JSON 文件中,并带有全文。这个项目使用 SQLite 来聚集和存储合并的内容。

2。标签:此时唯一的标签是新冠肺炎,如果文章文本包含任何建议的正则表达式,文章将使用此标签。只有这样的文章在这个项目中被考虑。

3。构建嵌入索引:使用 FastText + BM25 创建一个嵌入索引。嵌入索引获取每个新冠肺炎标记的、未标记的(不是问题/片段)部分,标记文本,并构建句子嵌入。句子嵌入是句子中每个标记的快速文本向量的 BM25 加权组合。嵌入索引采用这些嵌入的完整语料库,并构建一个 Faiss 索引来实现相似性搜索。

作者绘制了几个图,如柱状图代表按来源分类的文章、按出版物分类的文章、按研究设计分类的文章等,以便更清晰地分析数据。下面显示了一个这样的图,它代表了所提到的国家的文章:

按提到的国家分列的文章

4。测试模型:最初,模型为语料库中的每个句子构建嵌入。对于输入查询,它将每个句子与输入查询进行比较。Faiss 使得相似性搜索更快。

5。构建任务报告:任务报告是挑战任务中每个问题的集合。对于每个问题,运行一个查询并返回排名靠前的文章。对于每篇文章,文本匹配显示为带项目符号的点,这些是文章中最匹配的句子。结果句子的完整列表也通过 textrank 算法进行分析和运行。结果中的重点或热门句子也会显示在报告中。

总结:本笔记本尝试使用 FastText + BM25 嵌入组合的相似性搜索来解决给定的任务。此外,文章中具有最大相似性得分的句子显示在高亮部分,该部分充当给定查询的摘要。尽管这种方法看起来更简单,但是各种算法的结合已经产生了相当显著的结果。

方法 7:新冠肺炎:BERT + MeSH 使能知识图

[## 新冠肺炎:BERT + MeSH 支持的知识图

使用 Kaggle 笔记本探索和运行机器学习代码|使用来自多个数据源的数据

www.kaggle.com](https://www.kaggle.com/sandyvarma/covid-19-bert-mesh-enabled-knowledge-graph)

该模型使用了知识图与网格本体和 BERT 嵌入的结合。支持图形的搜索帮助用户基于非常具体的医学术语进行搜索。它还可以扩展到推断不同的文档如何相互关联(基于作者、正文、标题等)。)

方法论

1 a .从 JSON 文档中提取实体:从每个 JSON 文档的标题、作者详细信息、摘要、正文和参考文献中提取实体。然后,这些实体被用于创建知识图的三元组。三元组包含 5 种关系。实体通过以下关系映射到其各自的纸张 id:

1 b .使用网格本体的增强的实体提取:对于三元组中的每个实体,从网格本体中提取其前 5 个对应的相似实体。然后,这些实体也包括在三元组中,具有它们相应的关系。这样做是为了增加知识图的范围和能力,使得它不仅覆盖文档中存在的术语,还覆盖不存在但可能有帮助的相关实体。

2。BERT 训练和文件提取:

3 和 4。使用 BERT 和知识图提取结果:

5。提取文档中相关实体的段落提取

任务查询结果:结合使用 BERT 和知识图,涵盖了语义搜索以及一些特定关键字搜索的方面。

总结:这款笔记本最大的贡献在于,作者提出了一个非常全面的解决方案,使用了多种 ML 技术。作者使用了 SOTA 伯特嵌入,并将其与知识图相结合,进一步提高了其效率。这个笔记本也是最有条理的,所有的方法都以非常系统的顺序呈现。

结论:本博客展示了人工智能研究人员在 CORD-19 数据集上完成的一些伟大工作。我试图收集所有不同的方法,通过这些方法可以解决这种无监督的学习任务,并让自己对这一领域有更好的理解。世界各地的数据科学家正试图以他们力所能及的方式做出贡献,我们希望这些工作能为医疗团队带来成果,我们可能很快就能摆脱疫情。

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

用于注释和协作的新冠肺炎放射数据集(胸部 x 光和 CT)(第 1 部分)

原文:https://towardsdatascience.com/covid-19-imaging-dataset-chest-xray-ct-for-annotation-collaboration-5f6e076f5f22?source=collection_archive---------7-----------------------

迫切需要诊断工具来识别新冠肺炎。在疫情爆发的最初阶段,包括美国在内的所有国家都面临一个主要问题——缺乏诊断工具和适当的检测。为了能够构建诊断工具,数据科学家正在争先恐后地获取任何可用的少量数据。

鉴于对抗新冠肺炎疫情需要诊断工具,TrainingData.io 正在提供一个预先加载了开源数据集的免费协作工作空间。这个协作工作区允许数据科学家和放射学家共享训练数据的注释,这些数据用于训练新冠肺炎的机器学习模型。此数据集植入了以下数据集:

任何人都可以通过点击这个链接来创建和下载注释

机器学习的新冠肺炎训练数据

用于研究的开源数据集:我们邀请医院、诊所、研究人员、放射科医生上传更多去识别成像数据,尤其是 CT 扫描。目的是从受影响最严重的地方,如韩国、新加坡、意大利、法国、西班牙和美国,获得不同的数据集。这种对开源社区的贡献将帮助独立研究人员更快地构建诊断工具。本案涉及的产品使用将完全免费。我们的目的是在遵守所有许可法的同时,帮助全球抗击新冠肺炎病毒。

如何创建和下载新冠肺炎数据集的注记?

从这里开始:https://app.trainingdata.io/v1/td/login

https://www.trainingdata.io

使用 NVIDIA Clara train SDK 构建 ML 模型:training data . io 的团队拥有在 NVIDIA Clara 上使用 U-Net 构建细分模型的专业知识。我们愿意为社区提供构建开源模型的服务。这是一个在 NVIDIA Clara train SDK 中使用 2D U-Net 模型检测椎体的样本模型。

NVIDIA Clara 中使用 U-Net 检测椎体的样本分割模型

联系人:更多信息请联系我们: info@trainingdata.io

当前状态:工作区有来自 319 个不同患者的 429 个不同图像,369 个 ct 图像,60 个 x 光图像。

如何下载数据集?:只能从 TrainingData.io 下载由 community 创建的注释(遮罩),数据集的原始图像不能从我们的网站下载。要下载原始图像,请访问各自的来源。

成本:不考虑免费使用的限制,使用我们的产品在这个新冠肺炎数据集上工作将是零成本。

本系列第二部分: 使用 NVIDIA Clara on TrainingData 自动检测胸部 CT 中的新冠肺炎感染. io

使用机器学习分析新冠肺炎对公司收益的影响

原文:https://towardsdatascience.com/covid-19-impact-on-nasdaq-earnings-through-an-ai-lens-97f13ad60af7?source=collection_archive---------37-----------------------

图片由 Unsplash 的 Bud Helisson 提供

“我们选择的镜头改变了我们看待事物的方式”——德威特·琼斯

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

数据可用性的增加,更高的计算能力,以及易于实现的人工智能框架的可用性,开启了从大衰退到现在的人工智能复兴时代。这让我们有能力以 2008 年无法做到的方式分析新冠肺炎后的衰退。

本文通过研究新冠肺炎事件后公司收益的变化来研究新冠肺炎事件的影响。具体来说,它使用机器学习来预测纳斯达克上市公司 2010 财年第二季度收益同比下降超过 10%背后的关键因素。

本文使用来自财务报表分析和机器学习的概念来获得见解。我首先介绍我的方法和发现,然后深入研究建模。这更像是一个分析的框架,而不是一项获得具体见解的研究。喝杯咖啡,坐下来享受吧!

内容

  1. 摘要
  2. 关键驱动因素+精选深度挖掘
  3. 公司建模示例:Salesforce
  4. 模拟深潜
  5. 进一步的背景阅读
  6. 总结想法

1。总结

我比较了 2010 财年第二季度和 2019 财年第二季度的公司财务报表数据,以了解从 2019 财年第二季度到 2010 财年第二季度,净收入是否下降了 10%以上,这可能是由新冠肺炎造成的。我开发了一个基于 lightgbm 的机器学习模型,用包括 2019 财年财务在内的几个输入来预测产出(>净收入下降 10%)。

机器学习模型提供了对宏观和微观趋势进行建模的能力,这是一种识别关键影响维度的强大工具。它还可以用来分析哪些因素对公司收益下降的影响最大

该模型使用 yahooquery 从雅虎财经获取数据,并使用 T2 SHAP 对 ML 模型进行分析。除了提供 ML + SHAP 分析的发现外,我还尽可能对结果提供直观的解释。

2。关键驱动因素+精选深度挖掘

K

2010 财年第二季度和 2020 财年 Q2 净收入下降 10%的主要预测指标。图片作者。

S 行业深潜:行业对收益下降有很大影响。下图(Y 轴表示新冠肺炎影响,X 轴表示行业)中,分析的公司是单独的数据点,有力地说明了能源和消费周期是受影响最大的行业,而消费防御、技术和公用事业是受影响最小的行业。

行业(和全职员工)对>2019 财年第二季度至 2020 财年 Q2 净收入下降 10%的影响。图片作者。

直觉:新冠肺炎导致能源公司需求方面的冲击(简单地说,加油的人少了)导致收入减少,因此石油公司出现亏损。在消费品公司中,防御性消费品公司(销售主食和日常用品的公司)保持不变,因为对其产品的需求相对缺乏弹性,而周期性消费品公司(销售冲动和便利商品的公司)的收益大幅下降。需求的无弹性也解释了对公用事业公司的低影响。由于 WFH 的增加,数字化的加速推进等,科技也相对未受影响。

附加观察:观察 3 区(消费者防御)塔顶的一组红点——这可能是可口可乐、百事可乐等公司的影响。大量全职员工表示Q2 季度质量下降

C 点的颜色=关键次要因素的影响程度,即总收入)。

资本支出对收入比率(和总收入)的影响>2019 财年第二季度和 2020 财年 Q2 净收入下降 10%。图片作者。

直觉:新冠肺炎抑制了财政收入。公司本可以迅速采取行动在一定程度上控制运营支出,但是,前几年较高的资本支出(在以后几年创造潜在收入的成本)将意味着较高的损益折旧和较低的净收入。此外,观察顶部的红点,可以推断出具有较大绝对资本支出(不仅仅是资本支出与收入的比率)的公司受影响最大。

P /E 比率深度挖掘:收益下降> 10%的可能性较高的公司,其 P/E(市盈率,也就是市值与净收入的比率)比其他公司低。

市值与净收入比率对>2019 财年第二季度至 2020 财年 Q2 净收入下降 10%的影响。图片作者。

直觉:市场先生永远是对的。股票的弹性反映在其价格溢价中,即收益质量较高的公司(包括在不利的市场条件下保持不变的潜力)将比质量较低的公司定价更高。从收益角度来看,市场认为更好的股票平均来说更好地经受住了新冠肺炎风暴。

3。公司建模示例:Salesforce

Salesforce 有了一个精彩的 Q2FY20 。净收入从 9100 万美元增长至 26 亿美元。该模型正确预测这是一只收益下降> 10%概率非常小的股票。它进一步给出了关键的积极贡献因素及其影响的大小——事实上,这只具有高市盈率的科技股从总收入范围等维度做出了显著的积极贡献(蓝色)远远超过了消极贡献(红色)。

Salesforce 的公司影响建模结果。图片作者。

4.模拟深潜

(如果你对细节不太感兴趣,可以跳过这一部分)

我的模特工作流程。图片作者。

  • 我选择特征/输入时谨记两个关键原则:(1)包括具有高水平数据可用性的字段(较少 NaNs 等)。)和
    (2)避免多重共线性:例如,毛利=收入— COGS,因此不能选择所有三个,只选择最多两个等。
  • 该模型的 AUC(模型质量的量度)为> . 65
  • 如果你想看的话,我的作品在的 Kaggle 上。任何反馈都非常受欢迎。我的 Kaggle 笔记本也有一些更有潜在意义的快照,可以用来产生更多的见解。

5.进一步的背景阅读

关于财务报表分析…

这个 Investopedia 链接是财务报表分析 101 的良好起点。如果你想对财务报表中的关键术语有一个完整的解释,美世资本的这个资源是个不错的选择。

关于机器学习…

从商业角度来看,麦肯锡的这个页面是我见过的最好的资源之一。如果你想更专业一点,杰森·梅耶斯的精彩幻灯片非常适合你。

6。结论性想法

我们研究了一个分析新冠肺炎对公司收益影响的框架。我们深入研究了行业、资本支出和市盈率如何影响收益下降。下面使用 SHAP 的可视化很好地总结了我们的分析。

2010 财年第二季度和 2020 财年第二季度之间>净收入下降 10%的关键预测指标的更精细视图,包括方向性影响。图片作者。

可以利用该框架来分析宏观收益趋势,如上面的深入分析,或者执行微观分析,如上面的 Salesforce 示例。这种分析从更深的角度揭示了新冠肺炎危机对经济的影响。

后记:

  1. 对于金融类股,我在 9 月中旬左右从雅虎财经(Yahoo Finance)获取了数据快照。根据拍摄数据的时间,结果可能会有所不同。
  2. 这不是一个投资假设,也不应被视为投资建议。
  3. 本文表达的观点是我的个人观点。我们随时欢迎您的反馈。

学分:

斯科特·伦德伯格负责精彩的 SHAP 框架【https://shap.readthedocs.io/en/latest/T2
道格·格思里负责 yahooquery 我用来收集数据https://pypi.org/project/yahooquery/

posted @ 2024-10-15 13:44  绝不原创的飞龙  阅读(233)  评论(0)    收藏  举报