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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

何时应该使用约束求解器而不是机器学习

原文:https://towardsdatascience.com/where-you-should-drop-deep-learning-in-favor-of-constraint-solvers-eaab9f11ef45?source=collection_archive---------16-----------------------

约束求解器的实际应用。学习其他技术可以为您节省几天的数据清理和模型训练时间。

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

*魔方可以被建模为约束满足问题【1】,*图片由 NeONBRANDUnsplash 上发布

Machine Learning 和 Deep Learning 是业界正在流行的词汇。品牌领先于功能导致深度学习在许多人工智能应用中被过度使用。

这篇文章将提供对约束满足的快速理解,这是一种强大但未被充分利用的方法,可以解决人工智能和计算机科学其他领域的大量问题,从物流和调度到时间推理和图形问题。

解决现实世界的问题

让我们考虑一个事实性和高度话题性的问题。

一个疫情正在崛起。医院必须迅速组织起来治疗病人。

这个世界需要一种算法,在给定多种标准的情况下,如疾病的严重程度、患者年龄和位置、医院容量和设备等,该算法将感染者和医院匹配在一起。

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

图 1:疫情地图,简化为 3 个参数:患者和医院的位置,患者的严重程度

许多人会说,神经网络将是最适合它的:不同的配置,从广泛的参数范围,需要减少到一个独特的解决方案。

然而,有一些不利因素会破坏这种方法:

  • 模型需要训练,因此需要以前案例的历史数据,
  • 清理和整合数据集会浪费大量时间,
  • 各种各样的架构都需要通过长时间的培训来测试。

另一方面,如果用布尔可满足性问题来表述,这种情况不会有任何上述缺点,同时仍然在不确定的多项式时间内给出次优解(NP-完全问题),并且不需要任何历史数据。

免责声明:这篇文章的目的是快速浏览 CSP。理论和问题公式将被忽视。对于更严格的方法,请参考[2][3][4]。

抽象问题

这篇文章将为约束编程提供一个温和的介绍,旨在解决这个案例研究。这张疫情地图(1)展示了我们算法的输出结果,它将感染者与医院进行匹配。约束求解有几种框架。谷歌优化工具(又名,或-Tools) 是一个解决组合优化问题的开源软件套件。我们的问题将使用 Python 中的这个框架来建模。

from ortools.sat.python import cp_model

[## 查看这篇文章的互动笔记本

在一片混乱中把病人和医院联系起来

colab.research.google.com](https://colab.research.google.com/drive/1vFkt5yIQtyelqvCh2TsJ9UDeM5miXqui)

因素

现在,让我们将问题简化为 4 个参数(1):

  • 受感染者的位置
  • 感染者的严重程度
  • 医院的位置
  • 每所医院的床位数

让我们用 python 来定义这些参数:

# Number of hospitals
n_hospitals = 3
# Number of infected people
n_patients = 200
# Number of beds in every hospital
n_beds_in_hospitals = [30,50,20]
# Location of infected people -- random integer tuple (x,y)
patients_loc = [(randint(0, 100), randint(0, 100)) **for** _ **in** range(n_patients)]
# Location of hospitals -- random integer tuple (x,y)
hospitals_loc = [(randint(0, 100), randint(0, 100)) **for** _ **in** range(n_hospitals)]  
# Illness severity -- 1 = mild -> 5 = severe
patients_severity = [randint(1, 5) **for** _ **in** range(n_patients)]

变量

约束满足问题由一组变量组成,这些变量必须以满足一组约束的方式赋值。

  • I 为医院集合
  • Jᵢ 成为医院 i 的床位集合
  • K 为患者集合。

让我们将变量的索引族定义为:

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

如果在医院里,床 j 被人 k 那么 xᵢⱼₖ = 1 。为了将医院的每张病床与一个病人相关联,目标是找到一组满足所有约束的变量。

我们可以将这些变量添加到我们的模型中:

model = cp_model.CpModel()
x = {}
**for** i **in** range(n_hospitals):
  **for** j **in** range(n_beds_in_hospitals[i]):
    **for** k **in** range(n_patients):
      x[(i,j,k)] = model.NewBoolVar("x(%d,%d,%d)" % (i,j,k))

硬约束

硬约束定义了我们模型的目标。这些问题至关重要,如果不解决,问题就无法解决:

  • 每张床上最多只能有一个人,
  • 每个人最多只能有一张单人床。

让我们关注第一个硬约束。每个医院的每个床位jI:

  • 要么有一个独特的病人,
  • 要么床是空的。

因此,它可以用以下方式表示:

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

我们的求解器是一个组合优化求解器,它只能处理整数约束。因此,必须变成一个整数方程:

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

这个不等式可以添加到我们的模型中。

# Each bed must host at most one person
**for** i **in** range(n_hospitals):
  **for** j **in** range(n_beds_in_hospitals[i]):
    model.Add(sum(x[(i,j,k)] **for** k **in** range(n_patients)) <= 1)

接下来,第二个硬约束:对于每个患者 k :

  • 要么他在一个独特的医院的独特的病床上,
  • 要么他在家。

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

同样,可以转化为一个整数不等式:

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

最后,这个约束可以添加到模型中。

# Each person must be placed in at most one bed
**for** k **in** range(n_patients):
  inner_sum = []
  **for** i **in** range(n_hospitals):
    inner_sum.append(sum(x[(i,j,k)] **for** j **in** range(n_beds_in_hospitals[i]))) 
  model.Add(sum(inner_sum) <= 1)

软约束

接下来,还有软约束。这些都是非常需要的:我们的解决方案必须尽可能地满足它们,但是它们对于找到解决方案并不是必不可少的:

  • 每个病人都应该被放在床上,
  • 每个人都应该由最近的医院处理,
  • 在没有足够床位的情况下,病情严重的病人应优先处理。

当硬约束被建模为等式或不等式时,软约束是最小化或最大化的表达式。

ω为满足硬约束的所有解的集合。

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

每个病人都应该被安排到一张病床上的意思是最大限度地增加被占用的病床数量。

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

每个人都应由最近的医院处理是指尽量缩短每个病人与其指定医院之间的距离。

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

当没有足够的床位时,应首先处理病情严重的病人是指最大化所有处理病人的总严重程度。通过表示 sev(k) 患者的严重程度 k :

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

然后,我们可以将所有软约束简化为一个目标:

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

人们需要小心:这些软约束没有相同的域。

  • 患者最大化约束范围从 0n ,其中 n 为患者人数,
  • 严重性约束范围从 05n
  • 距离约束范围从 0 到所有 ik 的最大欧几里德距离。

假设所有这些约束共享相同的优先级,我们必须定义惩罚因子来平衡不同的约束。

下面是相应的代码:

# Integer distance function
idist = **lambda** xy1, xy2: **int**(((xy1[0]-xy2[0])**2 + (xy1[1]-xy2[1])**2)**0.5)# Gain factors (1/penalty factors)
gain_max_patients = 140
gain_severity = **int**(140/5)
gain_distance = -1# Maximization objective
soft_csts = []
**for** i **in** range(n_hospitals):
  **for** j **in** range(n_beds_in_hospitals[i]):
    **for** k **in** range(n_patients):
      factor = \
        gain_max_patients \
        + gain_distance * idist(hospitals_loc[i], patients_loc[k]) \
        + gain_severity * patients_severity[k]
      soft_csts.append(factor * x[(i,j,k)])model.Maximize(sum(soft_csts))

解决者

现在我们可以启动求解器了。它会尝试在指定的时间限制内找到最优解。如果它无法找到最优解,它将返回最接近的次优解。

solver = cp_model.CpSolver()
solver.parameters.max_time_in_seconds = 60.0
status = solver.Solve(model)

在我们的例子中,求解器在 2.5 秒内返回一个最优解** (2)。**

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

图 2:求解器返回的解

结论

要创建这个解决方案,只需要 1 小时的研究和 30 分钟的编程

对于深度学习的对手,人们可以预测几天的数据清洗,至少一天的时间来测试不同的架构,另一天用于训练。

此外,如果模型化良好,CP-SAT 模型是非常稳健的。以下是不同模拟参数的结果(3)。在许多不同的情况下,结果仍然是一致的,随着模拟参数的增加(3000 名患者,1000 张病床),解决方案推断只需不到 3 分钟。

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

图 3:不同的模拟参数

当然,CSP 几乎不适用于计算机视觉和 NLP 等主题,在这些主题中,深度学习有时是最好的方法。然而,在物流,调度和计划,它往往是要走的路。

深度学习炒作激发了一些人尝试一些疯狂的举动来获得认可。有时,最好是通过阅读几篇关于你正在研究的问题的调查论文来回归基础。

安托万冠军 2020 年 4 月 1 日

参考

[1]陈景超,利用 SAT 求解器求解魔方,arXiv:1105.1436,2011 .

[2] Biere,a .,Heule,m .,和 van Maaren,H. 可满足性手册,第 185 卷。IOS 出版社,2009 年 a

[3] Knuth,D. E .,计算机编程的艺术,第 4 卷,分册 6:可满足性。艾迪森-韦斯利专业公司,2015 年

[4] Vipin Kumar,约束满足问题的算法:一项调查,AI 杂志第 13 卷,第 1 期,1992 年。

我需要放在哪个垃圾桶里?用 Python 和 Selenium 抓取网站

原文:https://towardsdatascience.com/which-bin-do-i-need-to-put-out-scraping-websites-with-python-and-selenium-c59738cdb88?source=collection_archive---------39-----------------------

我如何使用 Selenium 来自动化 web 页面交互并从这些页面中抓取信息

在之前的一篇文章中,我展示了一个在英国议会议事录网站上搜集信息的例子。这是一个相对简单的例子,因为一旦网页被加载,议会议事录就提供网页提供的所有数据。所有可以出现在页面上的文本,无论是立即出现在段落中,还是隐藏起来只在按下按钮时才显示出来——所有这些都已经存在于页面源代码中,随时可以被像 BeautifulSoup 这样的包获取。

在我将要向您展示的示例中,我们需要的数据在页面的源代码中并不容易获得。一旦我在表单中输入了一些信息,它就会在服务器端动态加载。在这种情况下,我们不能只使用 BeautifulSoup (BS4 ),因为那里没有可供 BS4 抓取的内容。在信息出现供我们抓取之前,我们首先需要以某种方式与页面进行交互

这就是硒元素发挥作用的地方。Selenium 是一个 Python 包,可以在浏览器中自动执行操作。Selenium 将打开一个浏览器窗口,可以导航到一个网站,点击页面上的元素,并在输入元素中输入文本。它甚至可以与 iframes 中页面上的元素进行交互,这也是 BeautifulSoup 一直在努力解决的问题。我们可以使用 Selenium 在网页上执行操作,让新信息出现在页面上,然后抓取新信息。

对于这个例子,我将找到所有信息中最重要的信息——在给定的一周内哪个垃圾箱需要被放出来。在我的镇上,我们在一般废物和回收之间交替,我忘记了每周我需要把哪一个放出去。当银行放假时,我也完全失去了记忆。

需要的包

这些是我用过的包

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

我还必须下载一个网络驱动程序。这是一个适用于 Firefox 或 Google Chrome 的可执行文件,Selenium 可以访问并打开它。Selenium 使用 webdriver 作为浏览器来控制。我下载了谷歌 Chrome 的 webdriver,可以在这里找到

driver = webdriver.Chrome('C:\\Users\\gormanp\\chromedriver.exe')
driver.get('[https://my.gravesham.gov.uk/en/AchieveForms/?form_uri=sandbox-publish://AF-Process-22218d5c-c6d6-492f-b627-c713771126be/AF-Stage-905e87c1-144b-4a72-8932-5518ddd3e618/definition.json&redirectlink=%2Fen&cancelRedirectLink=%2Fen&consentMessage=yes#_ga=2.209993814.256753923.1580820371-471535357.1579531399'](https://my.gravesham.gov.uk/en/AchieveForms/?form_uri=sandbox-publish://AF-Process-22218d5c-c6d6-492f-b627-c713771126be/AF-Stage-905e87c1-144b-4a72-8932-5518ddd3e618/definition.json&redirectlink=%2Fen&cancelRedirectLink=%2Fen&consentMessage=yes#_ga=2.209993814.256753923.1580820371-471535357.1579531399')) 

在上面的代码中,我将 webdriver 的文件位置传递给 Selenium,这样它就可以打开一个浏览器窗口。然后,我将我想访问的网站的 URL 传递给它——在本例中,这是我的理事会的 bin 收藏网页的一个可怕的 URL。

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

格雷夫舍姆委员会的网页,找出斌天。

正如你从上面的图片中看到的,我们有一个带有表单字段的页面,要求输入我的地址或邮政编码。Selenium 能够点击页面上的元素,并在输入字段中输入文本。

我在使用 Selenium 抓取这个页面时遇到了一个障碍,它让我困惑了一段时间——我正在选择我想要与之交互的元素的 id,但是我得到一个错误,说找不到它。这是因为页面上的表单不是页面本身的一部分,它是作为 iframe 嵌入的。幸运的是,Selenium 可以使用“switch_to.frame()”函数与嵌入式 iframes 进行交互。

#this tripped me up a lot - the form is loaded in an iframe, so we need to tell selenium to switch to looking
#at the iframe rather than the elements that make up the main page. driver.switch_to.frame("fillform-frame-1")

现在我已经选择了页面的右框架,我需要单击文本框并键入我的地址。

#create a variable for the address I want to searchaddress = "22 Burch Road"#find the postcode search input box, using the id of that box, then wait to ensure the focus is on the boxdriver.find_element_by_id("postcode_search").click()#type the address into the box, then wait, as the form has to load its resultsdriver.find_element_by_id("postcode_search").send_keys(address)time.sleep(5)

我首先创建一个变量来保存我的地址,因为我以后还需要用到它。然后我用 Selenium 函数“find_element_by_id”找到页面上的文本输入框,点击它将光标放入框中。之后,我再次使用“find_element_by_id ”,但是我没有使用 click,而是使用“send_keys”在框中键入地址。

我已经事先手动查看了我的 bin day,我知道一旦框中有了有效的地址,地址选择器下拉框就会自动出现,所以此时我不需要再单击或与页面交互。然而,我确实需要告诉脚本在下拉框加载时等待几秒钟。

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

在选择下拉框中加载地址的页面

下拉框加载后,我需要从列表中选择地址。这个下拉列表中只有两个项目—我要选择的地址和默认的“选择…”值。对网页抓取没有帮助,但是很容易解决。

addresslist = driver.find_element_by_id('YourAddress')#look through the options and find the one that starts with the right address. There will be at least two options
#as there is a default "select" option, followed by actual addressesfor option in addresslist.find_elements_by_tag_name('option'):
    x = option.text
    if x.startswith(address):
        option.click() # select() in earlier versions of webdriver
        break#long wait here, because it takes a while for the form to load the bin day information 

time.sleep(10)

首先,我给下拉框列表分配一个变量名 addresslist。然后,我使用 for 循环来查看列表中每个选项的文本,并确定它是否以我在上面的框中键入的地址文本(“Burch Road 22”)开头。我使用 startswith,因为下拉列表中的地址在道路名称后面还有城镇和县。如果找到了地址,Selenium 使用“click()”命令选择地址。

然后,我使用另一个等待周期,这个时间甚至更长,因为 bin 收集表需要很长时间来加载。

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

慢慢来…

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

终于!

我们终于加载了我们的结果,所以现在我们可以用这个表来找出一周中的每一天,以及在这些天哪些箱子会被放出来。

timings = driver.find_element_by_id("table2")#we need to say .text to output the table as text, otherwise we just get an element id number and session. print(timings.text)

我找到表的元素 id,然后将该元素的文本打印到终端。

在以后的文章中,我将展示如何将从网站上收集的这类信息输出到电子邮件或电报消息中,但现在,我将把它留在这里。

这是如何使用 Selenium 的一个非常简单的例子,但是它可以很容易地扩展到抓取多个页面,抓取需要多次点击才能找到所需信息的页面,或者从由多个 iframes 组成的页面中获取信息。

一如既往,如果你认为有一种方法可以更好地执行,请在评论中告诉我。我还在学习,所以欢迎任何反馈。

你是哪位名人?使用深度学习的人脸识别

原文:https://towardsdatascience.com/which-celebrity-are-you-d8c6507f21c9?source=collection_archive---------18-----------------------

使用 ResNet-50 卷积神经网络架构在 Python 中构建影像分类模型的简单指南

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

图像分类器以 95.9 %的概率检测到该图像中的查宁·塔图姆( img 源

简介

T4:你有没有想过哪个名人和你长得很像?如果你在想“是的,我愿意”,那么这篇文章就是给你的。

由于机器学习,你可以扫描你的面部特征,并将其与超过 3000 名名人的 260 万张面孔的数据库进行比较。

阅读本指南后,您将了解以下内容:

  • 深度学习卷积神经网络过程背后的直觉是什么
  • 如何安装 keras_vggface 库并在实际项目中使用这些模型
  • 你如何让模型预测哪个名人与你最相似

概观

要知道哪个名人和自己最像,我们得执行以下步骤。这些步骤将在整篇文章中详细解释:

  1. 载入图像(你自己的图像或随机图像)
  2. 从图像中提取人脸
  3. 进行预处理,使人脸图像能够被识别。
  4. 将图像加载到深度神经网络“ResNet-50”中。
  5. 提取结果

人脸识别

在我们进入编码之前,我们需要对一些概念有一个高层次的介绍。
人脸识别是从图像中识别人的过程。由于机器学习领域的最新发展,我们现在能够让模型本身学习应该从图像中提取哪些特征。

卷积神经网络

深度卷积神经网络目前主导着图像分类领域。近年来的趋势是建立更深层次的神经网络来解决越来越复杂的图像分类任务。由于本文的范围相当有限,我们将只解释其背后的直觉。

过程如下,我们给网络输入一张人脸图像。这张人脸图像将被传送到多层(卷积基底)。在第一层中,检测基本特征:边缘、角、…中间层检测物体的一部分。在我们的例子中,他们可能会学会察觉:眼睛、鼻子、耳朵……在最后一层,他们学习识别不同形状和位置的完整物体。然后,基于所有这些检测到的特征,分类器进行预测。

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

卷积神经网络的过程

Resnet50

Resnet50 是一个深度学习卷积神经网络,在标准人脸识别数据集上取得了最先进的结果。它使用了 VGGFace2 数据集,这是一个大规模的人脸数据集,包含 9.9131 名受试者的超过 331 万张图像。与标准卷积神经网络的主要区别在于它使用残差学习。这意味着它不是试图学习特征,而是试图学习残差。更详细的解释可以在这里找到。

我们开始吧!

步骤 0:安装并加载必要的包

首先,我们需要安装必要的软件包。为了确保得到和我一样的结果,我建议你在谷歌合作环境上运行这段代码。协作笔记本在谷歌的云服务器上执行代码,这意味着无论你的机器功率如何,你都可以利用谷歌硬件的能力。最棒的是,它完全免费

!pip install mtcnn!pip install keras_vggface!pip install tensorflow!pip install keras!pip install opencv!pip install PIL

按如下方式导入已安装的软件包:

import mtcnnfrom mtcnn.mtcnn import MTCNNfrom keras_vggface.vggface import VGGFacefrom keras_vggface.utils import preprocess_inputfrom keras_vggface.utils import decode_predictionsimport PILimport osfrom urllib import requestimport numpy as npimport cv2# Import this one if you are working in the google colab environmentfrom google.colab.patches import cv2_imshow

步骤 1:图像加载

为了这个练习,我们导入一张查宁·塔图姆的图片。这使得每个人都可以很容易地复制它,也证明了模型的准确性。用你自己的图片链接更改 url 链接(提示:你可以使用你的 linkedin 账户的图片 url)。

# Give the image linkurl = "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/Channing_Tatum_by_Gage_Skidmore_3.jpg/330px-Channing_Tatum_by_Gage_Skidmore_3.jpg"# Open the link and save the image to resres = request.urlopen(url)# Read the res object and convert it to an arrayimg = np.asarray(bytearray(res.read()), dtype='uint8')# Add the color variableimg = cv2.imdecode(img, cv2.IMREAD_COLOR)# Show the imagecv2_imshow(img)

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

步骤 1 的期望输出( img 源)

第二步:人脸检测

图像现在已载入。因为我们的模型只需要人脸,所以我们需要从图像中提取人脸。为此,我们使用 mtcnn 包。MTCNN 实现了最先进的结果,并且能够检测各种面部特征(眼睛、嘴等等)。更多关于 MTCNN 的信息可以在这里找到。

# Initialize mtcnn detectordetector = MTCNN()

然后,我们确定一些面部提取参数:

  • 目标尺寸:人脸图像应该有多大?对于 ResNet50 图像,要求大小为(224,224)
  • Border_rel:这个参数决定了我们希望人脸图像放大到什么程度。我们现在把它设置为零。
# set face extraction parameterstarget_size = (224,224) # output image size
border_rel = 0 # increase or decrease zoom on image

我们调用检测器来检测给定图像中的人脸。我们看到人脸被检测到的概率为 99.8%。关键点被分配了坐标。

# detect faces in the imagedetections = detector.detect_faces(img)print(detections)

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

MTCNN 检测输出

通过使用 box 变量,我们可以确定面部的坐标。

x1, y1, width, height = detections[0]['box']dw = round(width * border_rel)dh = round(height * border_rel)x2, y2 = x1 + width + dw, y1 + height + dhface = img[y1:y2, x1:x2]

选择图像中的人脸后,我们将人脸的大小调整为 ResNet-50: 224,224 所需的格式。

# resize pixels to the model sizeface = PIL.Image.fromarray(face)
face = face.resize((224, 224))
face = np.asarray(face)# show facecv2_imshow(face)

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

查宁·塔图姆的脸( img 来源)

第三步:预处理

ResNet-50 模型期望有多个图像作为输入。目前,我们只有一个图像。为了解决这种差异,我们扩展了一维,因此我们有一个 1 x 224 x 224 x 3 的形状,而不是 224 x 224 x 3 的形状。

# convert to float32
face_pp = face.astype('float32')
face_pp = np.expand_dims(face_pp, axis = 0)

机器学习模型需要得到一致的数据。为了确保我们所有的图像是一致的,我们必须应用一个归一化函数。幸运的是,我们可以使用 Keras 的 preprocess_input 函数来归一化我们的人脸图像。该函数将对 0 到 255 范围内的像素值进行归一化,使其适合深度学习。不要忘记将 version 参数设置为“2 ”,以便对 ResNet-50 进行专门的预处理。

face_pp = preprocess_input(face_pp, version = 2)

第四步:预测

所有的准备工作现在都完成了。干得好!

这里,我们通过调用 VGGFace 实例来初始化 ResNet50 模型。我们仔细检查模型期望的输入和模型将给出的输出。

# Create the resnet50 Modelmodel = VGGFace(model= 'resnet50')# Check what the required input of the model is & outputprint('Inputs: {input}'.format(input = model.inputs))print('Output: {output}'.format(output = model.outputs))

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

ResNet-50 型号的输入和输出

接下来,我们让我们的模型预测预处理后的人脸。

# predict the face with the inputprediction = model.predict(face_pp)

第五步:提取结果

这张脸现在已经被预测到了。我们只需要解码我们的预测,并以可读的方式打印出来。

# convert predictions into names & probabilitiesresults = decode_predictions(prediction)# Display resultscv2_imshow(img)
for result in results[0]:
print ('%s: %.3f%%' % (result[0], result[1]*100))

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

查宁·塔图姆的预测结果( img 来源

这就对了。
你刚刚在卷积神经网络的帮助下进行了一次预测。如果你用查宁·塔图姆的照片做了这个,别忘了用你自己的照片试试,看看你和哪个名人有最大的相似之处。

后续步骤

下一步,我们可以应用迁移学习。迁移学习指的是重用一个问题的预训练模型,并将其应用于另一个问题的过程。我们可以使用这种最先进的 ResNet-50 模型,并在不同的人群中重新训练分类层。

来源

ResNet50 论文

keras 中的卷积神经网络

开源代码库

完整的代码可以在我的 github 上找到。我建议在执行代码时使用 google collab。

需要哪家云服务商 ML 平台?

原文:https://towardsdatascience.com/which-cloud-servicer-provider-ml-platform-do-you-need-69ff5d96b7db?source=collection_archive---------28-----------------------

入门

AWS Sagemaker,Azure ML 平台还是 GCP AI 平台?其实无所谓。不是为了工业化。

首先,我假设你已经选择了一个云服务提供商(CSP ),或者有能力为你的组织选择一个。其次,我还假设你需要能够构建、训练、调整、评估和部署机器学习模型,那么你最有可能做的第一件事就是检查你选择的 CSP 的 ML 平台。还是应该看看那些第三方厂商?怎么比较?

让我们看看什么才是真正重要的,也就是更大的图景。

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

改编自 https://www.cartoonstock.com/cartoonview.asp?的漫画 catref=CC123672 ,经作者许可编辑。

实验 vs 工业化

在每个 ML 甚至数据科学项目中,都有两个目标完全不同的阶段。在实验过程中,目标是找到一个能尽快回答(业务)问题的模型。而在工业化过程中,目标是可靠和自动运行。

让我们假设一个组织将卓越运营优先于商业价值。也许两年后,他们有了一个生产中的模型,这个模型带来了价值,但是运行起来却很有魅力。大多数(创新)项目在很久以前就被扼杀了,因为没有展示价值。

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

首先证明实验,然后工业化。(图片由作者提供)

所以有意义的轨迹就是你在上图中看到的绿色。首先使用非常基本的服务,这些服务可能不适合生产使用,但是至少已经显示了价值。这一领域的前四个项目很可能会失败,但第五个项目会大获成功。

典型挑战

ML 平台喜欢吹嘘他们如何提供与不使用这些工具相关的典型问题的解决方案。我认为他们确实有。尽管如此,他们无法解决的挑战仍然很大。

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

实验的典型挑战取决于组织规模。(图片由作者提供)

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

工业化的典型挑战取决于组织规模。(图片由作者提供)

隐性技术债务和 MLOps

当更深入地谈论 ML 项目的工业化时,有两个术语你应该记住。

第一个术语与谷歌前一段时间发表的一篇关于机器学习系统中隐藏的技术债务的论文有关。ML 模型的构建只是将模型投入生产的全部工作的一小部分。把它做好是一个复杂的过程。

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

改编自https://papers . nips . cc/paper/5656-hidden-technical-debt-in-machine-learning-systems . pdf

谷歌还发表了一篇关于 MLOps 应该看起来像的文章。他们定义了三个成熟度等级。这将导致生产中更高的可靠性和可观察性。

  1. m lops 0 级🐣:模型的手工构建和部署。
  2. MLOps 一级🤓:部署管道,不部署模型。
  3. MLOps 二级 😎 : CICD 整合,自动再训练,概念漂移检测。

通过查看他们对这一过程的示意图(见下图),您会立即发现这可能会变得复杂。组织需要一个坚实的战略来达到这个成熟度水平。为了长期成功,决策者需要看到价值。

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

改编自https://cloud . Google . com/solutions/machine-learning/mlops-continuous-delivery-and-automation-pipelines-in-machine-learning

从小处着手,专注于实验

我们提出以下采用演进。这是有意义的。

如果您的组织没有云、ML 或 Python 方面的经验,请从以下方面入手:

它们是基本的,用于实验,但可以显示业务的快速价值。这使得企业对 IT 有了更多的认同和信心,去关注那些可以增加你的工业化模型的稳定性和可追溯性的特性。

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

(图片由作者提供)

一旦你准备好进一步走向工业化,你想看的第一个特性是一个注册模型。这是一个跟踪已训练模型并可用于部署的地方。它可以帮助你追踪哪个表现好,或者不好。此外,如果您想了解两个月前的 one good model 是如何实现的,那么这将非常有帮助。

其次,你通常不想只训练和部署一个模型。典型的管道包括

  1. 数据预处理,
  2. 模型调整,
  3. 模特培训,
  4. 模型评估(使用更难计算的指标),
  5. 所有数据的最终模型训练,
  6. 模型部署步骤。

从这一点开始,你不想再在笔记本上玩了,而是创建一个 Python 模块,例如 Git。

第三,到目前为止,我假设您只进行了批量推理(针对吞吐量进行了优化)。例如,每天凌晨 2 点运行批处理管道,对前一天收集的一组数据执行预测。会有那么一个时刻,你也希望能够一直这样做*,以一种所谓的在线方式(也称为请求-回复)。为了实现这种能力,可以使用 API 端点。它从一个已部署的模型中返回一个对它收到的每条消息的预测。然后,针对延迟对该流进行优化。您最小化了消息发送者从 API 端点接收有效响应的时间。*

最后,将您的 ML 管道集成到 CICD 流中。为再培训设置触发器。这是最后一步。根据组织在为常规 IT 系统建立流程方面的经验,采用速度可能会有所不同。建立这样的流程可以被视为经历地狱。你只希望少数人经历地狱。推动他们制作令人信服的模板,供其他经验不足的数据科学家或工程师使用。

很酷,但是我应该选择什么 ML 平台呢?

答案是:看情况。

GCP AI 平台,Azure ML 和 AWS Sagemaker 有很多共同的服务。它们都提供了下面摘要中所示的功能。

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

(图片由作者提供)

他们之间的差异是显著的。不采用特定平台不应该成为交易障碍。尽管我很难搞清楚👍s 或👎我总结了下面几个清晰的例子。

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

免责声明,这是我在使用 3 个不同平台的基础上得出的个人观点。(图片由作者提供)

该不该换 ML 平台?

如果你是一家初创公司,想要一个 ML 平台,并且你仍然有选择云提供商的奢侈,从你的需求开始。做你的研究,并以此为基础做出选择。您不需要在 Kubernetes 集群上部署昂贵的 Kubeflow 平台来部署一些模型。

如果您是一个较大的组织,并且已经选择了云提供商,我们建议继续选择。不要为了几个额外的铃铛和哨子而改变。就像社交媒体平台一样,最终它们看起来和做的都一样。谷歌可能有更好的 AutoML 工具,但我很确定他们会 Azure,AWS 会赶上来(如果他们还没有的话)。

请注意,在这些平台上部署超过 5–10 个型号会变得非常昂贵。

一般性建议

1.用于实验

关注快速迭代⚡,自助服务💁并且易于调试🐛。

选择你最擅长的工具。AWS Sagemaker、GCP AI 平台或 Azure ML 肯定有助于加速

  • 探索,
  • 模型调整,
  • 培训,
  • 树立标杆。

2.为了的工业化

关注可靠性🧘‍♂️和可追溯性🔍和避免技术碎片化🧩.

如果你是一个大型组织,可以考虑将模型工业化与云中现有的稳定数据工程链相集成(例如在 Kubernetes 上)。
如果你是一家初创公司,使用这些 ML 平台的部署选项。这对你来说是一个明显的加速器。当然,如果部署的型号数量很少(<5-10 个型号)。如果过了一段时间你注意到

  • 成本很高,
  • 数据访问问题或
  • 不稳定持续存在,

那么是时候远离那些 ML 平台了。走向稳定的数据工程链(像大公司一样)。

最后,你也可以查看我们关于这个主题的网上研讨会。

额外收获:从实验到工业化平稳过渡的技巧

科学与工程代码解耦 机器学习往往有很多样板代码需要添加。想想训练循环、数据加载、日志记录……如果你用 Pytorch,一定要看看 Pytorch Lightning

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

来自:https://github . com/PyTorchLightning/pytorch-lightning/blob/master/docs/source/_ images/general/fast _ 2 . gif

采用项目编码模板

组织内部的每个项目都需要一些代码来

  • 与 CICD 系统集成,
  • 与选择的 ML 平台集成,
  • 设置数据访问,
  • 设置日志记录等。

使用一种叫做 cookiecutter 的东西,在 git repo 中生成项目结构,这将使新项目摆脱所有这些麻烦。看看 https://github.com/drivendata/cookiecutter-data-science 的,这是一个很好的起点。

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

来自 https://github.com/drivendata/cookiecutter-data-science

标准化

简而言之,限制使用的技术堆栈的数量。你用得越多,你需要维护的就越多。当数据科学将他或她的模型留给数据工程师时,这也简化了转换。

承认

我要感谢 Kristof Martens、Gergely Soti、Pascal Knapen 以及来自 Data Minded 的 Kris Peeters,感谢他们的意见和反馈。而且我们的客户能够使用如此多的不同技术堆栈。

新冠肺炎:官方数字背后隐藏着什么?

原文:https://towardsdatascience.com/which-countries-are-affected-the-most-by-covid-19-4d4570852e31?source=collection_archive---------29-----------------------

变更数据

机器学习揭示洞察力:时间序列聚类分析。

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

engin akyurtUnsplash 上拍摄的照片

概观

2020 年初,一种新型病毒开始在 Mainland China 传播。事实证明,这是一个影响深远、改变世界的事件的开始。

在第一波病毒席卷全球之后,我想提出两个问题:

  • 哪些国家受新冠肺炎的影响最大?
  • 哪些政府采取了正确的措施来阻止病毒的传播?

要回答,我们首先要了解官方确诊病例数字背后隐藏的是什么。

然后,我们将机器学习算法应用于新冠肺炎数据。这将各国组织成具有相似流行病学行为的群体。令人惊讶的是,这些群体在世界地图上形成了局部集群。这个意外的发现帮助我们回答了上面的问题。

如何决定哪些国家最痛苦?

当我第一次接触新冠肺炎的数据时,我自然检查了确诊的新冠肺炎病例的数量。该数据由约翰·霍普斯金大学提供。

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

全球前 15 名新冠肺炎感染病例。所有图表均由作者创作。(数据来自 2020 年 9 月)

这个排名告诉我们什么有意义的事情吗?显然,美国的感染人数比西班牙多得多,而西班牙是一个小得多的国家。然而,这并不意味着美国比西班牙受影响更大。

因此,感染人数需要根据每个国家的人口进行标准化。现在,这将允许独立于国家大小的更公平的比较。

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

全球标准化新冠肺炎病例。

卡塔尔、巴林、巴拿马、智利和科威特的感染密度最高。你知道吗?

但是等一下……各国有不同的检测政策:
更多的新冠肺炎检测会产生更多的确诊病例——而完全不检测意味着零病例。 所以,我们需要一个与测试量无关的量。

新冠肺炎的死亡人数是由测试率无偏估计的。

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

每个国家的标准化总死亡人数。

我们将使用标准化的死亡人数来比较国家!秘鲁、比利时和安道尔是死亡人数最多的国家(按人口标准化)。你听说过这个事实吗?此外,上述前 15 个国家中有 7 个属于欧洲大陆

让我们更深入地研究一下隐藏在数据背后的东西。

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

照片由 Unsplash 上的九个 koepfer 拍摄

分析每天的死亡人数

太好了,我们找到了一个合适的衡量标准来判断各国在病毒下遭受了多大的痛苦。现在我们将分析这个量随时间的发展,看看我们还能从中学到什么。

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

意大利、德国、美国和巴西的标准化每日死亡人数(7 天平均值)。

通过检查上面的每日死亡曲线,人们可以提取 **不同的流行病学行为。**例如,红色曲线显示意大利 4 月份有许多人死亡。然而,他们设法阻止了病毒的传播。意大利通过几个月完全关闭社交生活达到了这个目的。

绿色曲线的德国没有受到第一波新冠肺炎浪潮的重创。国家反应迅速,从一开始就减缓了社会生活。结果,死亡人数几乎回到零。

另一方面,从四月到现在,巴西和美国不断有人死亡。他们还没有设法控制住病毒。

我们能通过观察其他国家学到一些东西吗:

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

所有 188 个国家的每日死亡曲线。你能认出任何模式吗?

好吧,这看起来有点乱。有 188 个国家。但是我们能找到多少不同的特征曲线呢?

为了清理混乱并找到模式,我们将应用聚类算法。这种无监督学习技术将相似的数据曲线分组在一起。

寻找跨国集群——收拾残局。

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

汉斯-彼得·高斯特在 Unsplash 上拍摄的照片

python 包ts learn【2】为时间序列提供机器学习算法。我们将 k 均值聚类方法应用于标准化的每日死亡曲线。

该算法将行为相似的国家分组。结果是以下三个集群:

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

对国家进行聚类,绿色、红色和蓝色线条给出了每个聚类的均值曲线。图表显示了一段时间内标准化的每日死亡人数。

绿色组(158 个国家)显示每日死亡人数很少,接近于零。那些国家受到新冠肺炎的轻微影响。

另一方面,红色集群(9 个国家)在第一波(4 月/5 月)中有巨大的死亡人数。但是,设法控制住了局面,死亡率几乎回到了零。

相比之下,蓝色集群包含 16 个国家,这些国家不断遭受新冠肺炎死亡。随着时间的推移,情况似乎越来越糟。

集群在世界各地是如何分布的?

快速浏览下面的地图,可以看到红色星团位于欧洲大陆。此外,蓝色集群的国家集中在北美和南美。

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

红色、绿色和蓝色星团在世界地图上的分布。

红色区域包括西班牙、法国、英国、意大利、比利时、瑞典、荷兰、爱尔兰和安道尔。在新冠肺炎的第一波浪潮中,这些国家经历了一段艰难的时期。但是,通过对日常生活施加限制,他们减缓了死亡的速度。现在,这些国家几乎恢复了常态。

美国、巴西、秘鲁、哥伦比亚、墨西哥、阿根廷、智利、玻利维亚、厄瓜多尔和巴拿马还没有设法阻止死亡。那些国家可能会尽快采取适当的行动

结论

我们已经讨论了新冠肺炎影响的一个合适的度量标准,它允许在不同的国家之间进行比较。

关注标准化死亡人数抵消了检测率偏差。此外,我们要注意的是,还有社会经济因素。例如获得保健系统或其质量。我们在这里没有考虑这些影响。

一种聚类算法帮助我们将国家分为三个主要的特征群。国家、

  • 只受到病毒的轻微影响,
  • 仅在 2020 年 4 月的第一次新冠肺炎浪潮中遭受了艰难的时期,
  • 和不断遭受死亡的国家。

严格的社会限制帮助大多数欧洲国家控制住了病毒。但是,在一些 北美和南美国家,人们仍然奄奄一息。 不幸!

所有的数据可视化都是用 Python、Pandas 和 leav 完成的。Github 上 完整代码的链接可以在这里 找到。数据来自 2020 年 9 月 13 日。

[1]JHU·CSSE 提供的“新型冠状病毒(新冠肺炎)病例”数据可在此下载:
https://github . com/CSSEGISandData/新冠肺炎/tree/master/csse _ covid _ 19 _ Data/csse _ covid _ 19 _ time _ series

[2] Tslearn,时间序列数据的机器学习工具包。
塔维纳德、法乌齐、范德维勒、迪沃、安德罗兹、霍尔茨、佩恩、尤尔查克、鲁尔姆、科拉尔和伍兹。
机器学习研究杂志21(2020)1–6。https://tslearn.readthedocs.io/en/stable/index.html

哪些国家关注气候变化?

原文:https://towardsdatascience.com/which-countries-are-concerned-about-climate-change-mining-bittorrent-5114edd7aeb5?source=collection_archive---------55-----------------------

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

尼克·邦达列夫摄于佩克斯

激流科学

分析环境和气候相关纪录片的收视率,以量化世界各国对气候变化的关注。

澳大利亚目前高度关注气候变化。

在澳大利亚野火和 2019 年亚马逊森林夷为平地之间,极地冰的持续融化,日益肆虐的全球天气,南极上空被遗忘的欧洲大小的臭氧洞和当前的百年疫情;关键问题是***——我们世界的国家对气候变化有多关心?***

在这篇文章中,我展示了我的实验,通过将数据科学应用于 BitTorrent 网络的挖掘来寻找这个重要问题的答案。如果你像我一样没有耐心,关键见解会在底部呈现,供你快速阅读。下面的歌词是一个很好的总结。

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

深色意味着对气候的高度关注。没有颜色意味着缺乏足够的数据。

所以让我们开始吧!

概观

要回答题目中的问题,我们需要数据。这个实验中使用的数据是全球气候变化和环境相关纪录片的代表性观众人数。

基本的假设是,如果我关心气候,那么我会通过观看与气候变化相关的纪录片来寻找相关信息。因此,如果一个国家的居民比其他人看更多这样的纪录片,那么我们可以推断他们的关注度更高。

但是,事情没那么简单。并非所有国家都以同样的身份使用非法下载。例如,菲律宾是一个在 torrent 网络中显示出极高流量的国家,而英国公民似乎更喜欢合法地消费越来越实惠的内容。自然,菲律宾环境相关纪录片的下载量会高得多。这样的变异需要 归一化

为了进行这种标准化,通过挖掘关于一组在世界范围内流行的商业电影的数据,例如泰坦尼克号或更近的名为 1917 的战争电影,来捕获洪流观众的一般特征。

筛选出那些数据太少的国家也很重要。这可能是由于多种原因造成的,例如,饱受战争蹂躏的阿富汗几乎没有洪流流量,可能是由于缺乏互联网连接。

更重要的是,这项调查是基于这样一个假设,即人们喜欢看英语纪录片,这并没有错,考虑到英语是一种全球语言,一个国家的人们对气候等问题表示关注,通常会拥有学习这种语言的必要手段。但是,由于这个原因,一些非洲国家甚至欧洲国家应该被排除在这个分析之外。

本质上,这个想法很简单,但很有趣。可视化工具有助于理解分析的结果。现在让我们看看我在阅读代码时用来执行这些分析的过程。

第一项任务是数据工程。我不会重复使用分布式哈希表挖掘 BitTorrent 网络的部分以及与之相关的其他任务,这在之前的一篇文章中已经介绍过了。

[## 走向激流科学:数据工程

挖掘 BitTorrent 网络

towardsdatascience.com](/towards-torrent-science-data-engineering-d79e774886cb)

数据工程

thepiratebay.org这样的 BitTorrent 网站包含大量文件,主要是盗版电影和视频。通过抓取此类网站,收集与气候变化和环境相关的种子。这些种子然后被用于挖掘 BitTorrent 网络,以提取具有它们在世界上的位置的对等体(下载者)。这样就建立了一个数据集。这个数据集代表了这些纪录片在多个国家的观众特征。

但首先,我们需要选择一套流行的气候和环境的纪录片,这些纪录片可以在种子网站上找到,并被同行们寻找。在花了一些时间在互联网上回顾这些纪录片后,以下一组纪录片最终定稿。

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

被考虑的气候变化纪录片列表

为了进行上述动机的标准化,考虑了以下好莱坞电影的集合。它们仍然很受欢迎,并且已经遍及全球。

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

被考虑的商业好莱坞电影列表

第一步是提取数据,但我跳过了关于从 BitTorrent 中提取数据的部分,因为它在我以前的文章中有所涉及。

下一步是使用 Pandas 库创建数据框,以便进行进一步的分析。实现的函数(代码如下所示)返回一个字典,其中包含与上面列出的每个视频相对应的种子集的 IP、国家和城市。这被转换成表格数据并存储在 Pandas 数据框中。

示例输出如图 1 所示。这显示了按字母顺序排列的前五个国家的 10 部好莱坞电影的同行人数。

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

图 1-示例输出:电影数据帧

如前所述,由于缺乏数据,阿富汗必须排除在这一分析之外。同样的逻辑适用于许多国家,例如,阿尔巴尼亚人似乎对使用 BitTorrents 观看这些好莱坞电影并不特别感兴趣。

事实上,通过过滤掉至少有十个国家的环境纪录片总同行,只有三十个国家有资格进行进一步的分析。大多数非洲国家和许多欧洲国家不得不被过滤掉。**

使用 Pandas 数据框时,代码非常简单。所以没有在这个空间展示。

现在让我们继续分析部分。

分析学

在数据工程的过程之后,我们只剩下两个表格(数据帧),分别是好莱坞电影和关注气候的纪录片的收视率数据。

为了量化对气候的关注,我们将使用一个简单的方法。一个国家的气候纪录片和好莱坞电影的观众比例应该表明它的关注。这在下面的等式中表示。

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

但在此之前,正如概述中所提到的,我们需要执行标准化步骤,以便进行分析。

正常化

下面来自维基百科的规范化定义适合于我们案例中的分析目的。

归一化是指创建统计数据的移位和缩放版本,其目的是这些归一化值允许以消除某些总体影响的方式比较不同数据集的相应归一化值。—维基百科

首先,针对每个数据集,分别对各个国家的每个视频的对等计数(收视率)进行归一化。然后,对视频中每个国家的结果数据进行归一化处理。必须按此顺序进行,否则,上述所需的比率将不起作用。

这在下面的代码中有解释。第 2 行和第 3 行用于沿列标准化,第 4 行和第 5 行用于跨行标准化。

上述代码的输出如下图所示。它显示了前五个国家的标准化值。请注意,之前图像中出现的阿富汗、阿尔及利亚、阿尔巴尼亚和安哥拉现在都被过滤掉了。

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

归一化后,对每行的值求和,然后确定两个数据集的比值。这在 Python 中也很简单,代码如下所示。

从前五个国家的产出可以推断,澳大利亚似乎比其他国家更关心气候。

现在,让我们通过图和地图将输出可视化,并得出见解。

形象化

让我们先来看看简单的条形图。这里不分享代码,因为它很简单。根据我们的分析,从这个图表中可以明显看出,澳大利亚人是世界上最有气候意识的公民。加拿大人美国人荷兰人也非常关注气候变化。

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

柱状图——气候问题。澳洲人还挺在意的!

根据我们的分析,印度尼西亚人、南非人、西班牙人和保加利亚人属于第二类。

现在让我们用色彩图在地图上标出这些发现。

Choropleth 图提供了一种简单的方法来可视化一个地理区域内的测量值如何变化,或显示一个区域内的可变性水平。— 维基百科

在世界地图上,每个国家都根据其与气候相关的价值进行了着色。下图是使用 geopandas 库生成的。此外,代码如下所示。

阴影越深,对该国气候的关注就越高。同样显而易见的是,由于缺乏数据,许多国家都是白色的。这项分析主要限于英语盛行的三十个国家。

似乎只有当我们的家园被摧毁时,我们才意识到气候变化,就像澳大利亚发生的那样。亚马逊也发生了大规模火灾。但是巴西人似乎对此并不关心,至少从我们的分析中可以看出。也许,因为火灾只是在经济上帮助了巴西人——不像澳大利亚。

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

**使用开源 Python 库生成的绘图。**较暗的色调意味着对气候的高度关注。白色显示的国家表示缺乏足够的数据。

虽然新西兰没有出现在地图或分析中,这是因为 BitTorrent 在那里并不流行。尽管粗略地看了一下他们有限的观众群,表明他们对这类纪录片感兴趣。

让我们讨论一下在这一分析中必须考虑的潜在警告。

警告

  1. 第一个潜在的问题是电影和视频的选择。如果不同的一组视频给出不同的结果呢?就纪录片而言,激流世界里几乎没有其他受欢迎的纪录片。但是电影的选择是可以进一步探讨的。
  2. 如果有与气候相关的地区语言的视频,没有英文版的怎么办?这当然是可能的。尽管一部好的纪录片应该被翻译成英语以吸引更多的观众,但最受欢迎的还是英语。
  3. 数据可靠吗?有大量的 VPN 服务器,很多时候地理定位是误导。这是一个问题,但我们可以预期噪声会降低,因为商业电影流和纪录片流都会导致这种系统误差,我们实际上是在取一个比率。事实上,我们观察到了一些与乌克兰有关的异常现象——也许它值得单独写一篇文章。

洞察力

  1. 澳大利亚、加拿大、荷兰和美国是对气候表现出最大关注的国家。紧随其后的是南非、西班牙、保加利亚和印度尼西亚。不幸的是,巴西似乎还没有达到这一水平,至少根据这一分析。英国的情况类似。
  2. 总的来说,发达国家对气候更加关注。英国是个例外,这有点令人惊讶,也是一种反常现象。这可能是一个错误的结论,需要调查。或许通过其他来源的数据——比如 Twitter。
  3. 虽然之前没有提到,但《甜蜜之地》是目前全世界最受欢迎的纪录片,在各大洲都有很高的收视率。这是一部关于蜜蜂的纪录片,可以在亚马逊 Prime 上看到。如果你还没有看过这部纪录片,并且希望更多地了解环境,这部纪录片可能是一个好的开始。****

代码的 Github 链接是:https://github.com/deepakkarunakaran/torrent-analytics

期待在未来进行更多的分析,可能会有更多的数据和一些更酷的 ML/DL 算法。观察电影类型偏好的分布可能会产生有趣的结果,值得深思。

你可以在 Linkedin 上联系我@https://www.linkedin.com/in/deepak-karunakaran/

哪些国家的反应与新冠肺炎相似?机器学习提供了答案

原文:https://towardsdatascience.com/which-countries-react-similar-to-covid-19-machine-learning-provides-the-answer-5971ec2f6f31?source=collection_archive---------12-----------------------

看看你的国家(或美国的州)和它的同行相比表现如何。了解聚类分析的实际应用——使用 UMAP 投影和 HDBSCAN。

【2020-2019-04 更新:添加 GitHub 库,见故事底部】

我经常想知道不同国家在冠状病毒病例统计方面有什么不同。往往只考虑绝对数字。因此,较小的国家(如瑞士、比利时)被忽略了。在这个故事中,我主要分析与人口规模相关的案例。截至今天(2020-04-16,来源 JHU)的铁的事实是:

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

每百万居民死于新冠肺炎的人数。人口规模至少为 100 万的所有国家、美国各州和中国各省的前 25 名。红色代表国家,灰色代表州和省。

纽约州在这份令人悲伤的名单中遥遥领先,紧随其后的是欧洲国家西班牙、比利时和意大利。在前 25 名中,中国只有一个省份。湖北(第 23 位)每百万死亡 56 人,约为纽约的十分之一。

提醒一下——将国家分成更小的区域总是会导致更多的极端值。对意大利来说,这将揭示出每百万人中有 1055 人死亡的伦巴第大区

但是动力呢?是不是有些国家反应比较早,有些国家比较晚?有没有一些模式?我们可以向其他国家学习吗?

为了回答这些问题,我采用了数据驱动的方法。 无监督学习 技术应该有助于获得一些新的洞察力。

这个故事分为以下四个部分:

  1. 数据源
    所用数据源的描述。
  2. 疫情爆发后的病例数发展
    众所周知的情节——更新并包括美国各州&中国各省。
  3. 特性工程
    关于最终分析中要使用的特性的细节。
  4. 聚类分析
    通过无监督学习进行国家间的比较。

1.数据源

案例统计

像许多其他人一样,我;)),对于案例统计,我依靠的是约翰·霍普斯金大学的 GitHub 知识库的数据。他们按国家和日期发布包括确诊病例、康复和死亡的时间序列。对于一些国家,如美国、加拿大、中国、澳大利亚,他们甚至更进一步,增加了地区甚至直辖市。

在这篇报道中,我们坚持使用国家数据。仅对于美国和中国,我还加载了单个州和省。

人口

人口规模取自三个不同的来源。国家一级的数字取自世界银行公开数据 API。还有一个 Python 包适合这个工作。

对于中国的省份,我找不到任何方便的 API。因此,我将维基百科上的表复制到一个制表符分隔的文本文件中。一个定制的导入器脚本将这些乱七八糟的东西转换成了一个漂亮的熊猫数据帧。

美国各州的人口规模已经包含在死亡人口的美国时间序列文件中(time _ series _ covid 19 _ deaths _ US . CSV’)。这个文件是 JHU 数据库的一部分。

在连接了所有这些数据集之后,我得到了一个熊猫数据框架,包括了我需要的所有数据。以下命令提取 4 月 11 日的随机样本,排除非常小的国家(< 1 million):

data[(data.date == '2020-04-11') & (data.Population >= 1000000)] \
    .sample(15)

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

Random sample of the imported data. 每行代表一个国家在给定日期的州(列‘date’)。对于美国和中国,也包括州/省级别的数据。彩色框代表国家数据(=红色)和地区数据(=灰色)。

2.爆发后的病例数发展

下面的图表是众所周知的。我添加这些图的主要原因是我对爆发日期的定义略有不同。在下一节描述“机器学习”特性时,我也会用到这个定义。看:

  • x 轴表示病毒爆发以来的天数。然而,我们没有将疫情定义为病例数超过 100 的那一天,而是将其定义为病例数超过每百万居民 5 例的日**。统计数据表明人口为 2000 万。**
  • y 轴显示累计的确诊病例数,相对于对数轴上的人口规模

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

自新冠肺炎疫情爆发以来累计确诊病例数(百万分之五以上的一天)。仅显示人口规模至少为 1500 万的国家。

在欧洲国家中,西班牙领先。然而,所有这些国家在过去几周都放缓了脚步。就这些数字而言,美国作为一个整体,可以与欧洲相媲美。

中国和韩国在 3-4 周前拉平了曲线。与这些国家相比,日本的病例数稳步缓慢增长。

接下来,美国各州的情况完全相同。我将 x 轴的下限限定为 10,以使图的右上部分清晰:

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

自新冠肺炎疫情爆发以来累计确诊病例数(百万分之五以上的一天)。仅显示人口至少为 500 万的美国各州。

虽然一些州远低于全国平均水平(每百万 2000 例,如明尼苏达州为 300 例),但纽约和新泽西已经达到每百万 8000-9000 例。所有的曲线都降低了对数轴上的速度,但在这个已经很高的水平上加倍数字是不同的…

3.特征工程

考虑到有限的数量和数据的异构性,在新冠肺炎数据集上应用机器学习方法并不简单:

  • 首先,每个国家收集数据的方式非常不同。对病例有不同的定义,数据收集滞后,一些国家测试更多,等等。此外,死亡的原因也不尽相同。
  • 第二,全球只有大约 200 个国家。此外,为了执行数据驱动的方法,没有确诊病例或确诊病例很少的国家不会增加这一分析的价值。

自疫情爆发以来,我们总共有大约 60 个国家有超过 3 周的数据。因此,我不得不把更多的精力放在手工制作有用的功能上,而不是完全自动化的方法。让我先解释两个术语,然后是特性本身:

定义

  • 疫情 :
    如上所述,我将疫情定义为病例数超过每百万居民 5 例的那一天。
  • 峰值 :
    峰值定义为最近 7 天的平滑平均值达到最高值的那一天。关于平滑的更多信息。

特征

我计算并用于以下聚类分析的特征是:

  1. 早期死亡率 :
    疫情发生 14 天后每周死亡人数除以
    疫情发生一周内确诊病例数。
  2. 10x:
    从疫情爆发到确诊病例数乘以 10 所需的天数。实际上,这是从百万分之五到百万分之五十的时间段。
  3. 高峰死亡率 :
    高峰周死亡人数除以前 14 天的周确诊人数。
  4. 早期加速度 :
    如果 deltaW0W1 确诊病例从疫情爆发一周至之后一周的百分比增量,以及 deltaW1W2 疫情爆发后第 1 周至第 2 周的百分比增量,则加速度为:
    Early Accel = deltaw1w 2/deltaw0w 1。
  5. 电流加速度 :
    类似。如果 deltaWt-2Wt 从上周到本周确诊病例增加的百分比, deltaWt-4Wt-2 从当前前第 4 周到第 2 周确诊病例增加的百分比,则加速度为:
    current Accel = deltaWt-2Wt/deltaWt-4Wt-2。

加速度的定义听起来可能很复杂,但实际上它只是速度的变化。如果我们看到案例增加了 20%,然后又增加了 10%,那么加速度就是 1.10 / 1.20 = 0.92。因此,小于 1.0 的值是可以的。

为什么我用一个几何平均数来得到平滑的星期

我们的病例统计数据具有很强的周季节性,这是由周末较少进行测试这一事实造成的。因此,我们需要一个像移动平均线这样的平滑器来解释这个事实。我用的是几何平均。这背后的基本原理是,我们处理一个指数序列。每个周期都加倍的数列,例如:

[25,50, 100 ,200,400]

得出的算术平均值是 155。相反,几何平均值是 100。正是我们想要的。下面是计算的代码片段:

def geometric_mean(values):
    return np.exp(np.mean(np.log(values)))def geometric_simple_moving_average(df, len=7):
    return df.apply(np.log).rolling(len).mean().apply(np.exp)

4.聚类分析

方法

我选择 HDBSCAN 的 UMAP 投影进行聚类分析有几个原因。首先,数据不是对称的,所以基于对称距离的线性方法宁愿失败。

就非线性聚类分析而言,如今 t-SNE 非常普遍。然而,SNE 霸王龙只保留了局部结构,而不是全局结构。相反,对 UMAP 来说,全球距离也是有意义的。这使得可视化对解释更有价值。

最后,但同样重要的是,我想表演一些新的东西。不是旧的 k-means,或者标准的层次结构等等。😃

UMAP 本身并不直接生成星团。它对新空间进行非线性投影。在这个新的投影中, HDBSCAN 可以用来提取集群。

使用 UMAP 和 HDBSCAN 进行聚类分析的详细信息和 Python 代码可以在UMAP-学习页面上找到。我计算了两个不同的投影。一个用于可视化( embedding_for_plot ),另一个( embedding_for_hdbscan )作为 hdbscan 聚类的预处理器:

import umap.umap_ as umap   # !pip install 'umap-learn==0.3.10'
import hdbscanembedding_for_plot = umap.UMAP(random_state=random_state) \
    .fit_transform(features)embedding_for_hdbscan = umap.UMAP( \
    random_state=random_state, min_dist=0.0, n_neighbors=10) \
    .fit_transform(features)cluster = hdbscan.HDBSCAN(min_samples=2, min_cluster_size=5) \
    .fit_predict(embedding_for_hdbscan)

为什么要进行两次分析?

我进行了两种不同的分析。第一个聚类分析只包括三个特征,对于疫情爆发后只有 2.5 周数据的国家来说效果很好。

第二个分析也使用曲线峰值的特征。对于每日病例仍在增加的国家,高峰将会移动。因此,结果也会改变。

1.爆发相似性和聚类分析

在第一次分析中,我使用了以下三个特征:

  • DaysTo10X
  • 早期死亡率
  • 早期加速

该算法将数据集分成大小相似的四个不同的簇。使用 UMAP 嵌入,数据可以很容易地在两个轴上可视化:

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

请记住,对于这种聚类,仅使用爆发后 2-3 周的数据。值得注意的是,西班牙在这里并不属于橙色组,该组包括意大利、比利时、纽约、德国、加拿大等。

为了深入挖掘,我创建了小提琴图(类似于盒子图)。红色和橙色集群的早期死亡率都很高。然而,红色集群在爆发后达到快 10 倍(小“DaysTo10X”)。

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

2.总体相似性和聚类分析

在第二次分析中,我增加了两个特性,即:

  • 峰值死亡率
  • 电流传感器

现在 HDBSCAN 确定了 5 个集群:

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

在这些星团中,蓝色的那个鹤立鸡群。“蓝色等级”的国家在疫情爆发后花了更长时间才实现病例数 10 倍的增长,但它们现在在确诊病例中分享了相当高的增长速度(见“当前加速”)。

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

慢慢来,确定你的国家,做你自己的解释。聚类分析总是关于发现新的关系和见解

大多数方法也有随机成分。这意味着,如果我们用不同的随机种子数进行相同的分析,结果可能会有所不同。通常不是很多,但也可能不是五个,而是四个或六个。

关于预测和预报的一点注记

这个故事不是直接关于预测和未来的场景。然而,识别相似的国家或州,以及它们的集群,可以帮助应用监督学习

如果我们知道纽约和新泽西的表现与意大利和西班牙相似,但它们滞后 2 周,我们可以使用欧洲国家的最新历史来预测美国这些州的未来。

就机器学习术语而言,欧洲国家的最新数据起到了“标签”的作用。

贮藏室ˌ仓库

这个故事的所有代码都可以在 GitHub 上找到,参见:

[## ploner/冠状病毒-聚集

该资料库包括一个 Jupyter 笔记本,用于对冠状病毒病例进行聚类分析。结果和情节…

github.com](https://github.com/ploner/coronavirus-clustering)

最后的想法

除了识别一些众所周知的集群,我还能够发现一些新的、意想不到的关系。此外,特别是使用 Violin Plots 的聚类分布可视化对从提取的聚类中获得更多信息有很大帮助。

最后,我会一直建议基于周【几何】平均值而不是每日病例统计数据做出关于冠状病毒的决定。这消除了周末效应,使每一个分析和解释更加稳定。

如果你喜欢这个故事,你可能也会喜欢我在《走向数据科学》上发表的这两个中型故事中的一个。它们是关于新冠肺炎、分析数据驱动的 Web 应用开发**😗*

[## 厌倦了被告知新冠肺炎方向每两天改变?

忘记每日统计,遵循正确的 KPI!

towardsdatascience.com](/forget-daily-statistics-of-the-coronavirus-7e9bbb7349bd) [## 使用 Python、Dash 和 Plotly 可视化新冠肺炎案例数据

立即创建您自己的仪表板 Web 应用程序!

towardsdatascience.com](/visualise-covid-19-case-data-using-python-dash-and-plotly-e58feb34f70f)

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

在机器学习回归问题中,应该使用哪种评估指标?

原文:https://towardsdatascience.com/which-evaluation-metric-should-you-use-in-machine-learning-regression-problems-20cdaef258e?source=collection_archive---------1-----------------------

r,RMSE 和梅

如果你像我一样,你可能在回归问题中使用了 R 平方®、均方根误差(RMSE)和平均绝对误差(MAE)评估指标,而没有仔细考虑它们。🤔

尽管它们都是通用的度量标准,但是在什么时候使用哪一个并不明显。写完这篇文章后,我有了一个新的最爱和一个新的计划来报道它们。😀

过一会儿我会和你分享这些结论。首先,我们将深入了解每个指标。您将了解每种方法在模型选择和报告方面的优缺点。我们开始吧!🚀

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

评估指标就像理解的桥梁。😀资料来源:pixabay.com

R 平方

r 代表你的模型解释的方差比例。

r 是一个相对指标,因此您可以使用它来与基于相同数据训练的其他模型进行比较。你可以用它来大致了解一个模型的表现。

免责声明:本文不是对机器学习方法的回顾,但请确保您使用不同的数据进行训练、验证和测试。你总是想拿出一些你的模型没见过的数据来评估它的性能。此外,查看模型预测值与实际值的对比图,以了解模型与数据的吻合程度也是一个好主意。

让我们看看 R 是如何计算的。前进!➡️

公式和代码

这里有一种表达 R 的方法。

1 - (SSE/SST)

SSE 是误差平方和;实际值和预测值之差的平方和。

SST 是平方和的总和(有时显示为 TSS);实际值和实际值平均值之间的平方差之和。

更多数学符号:

1-(∑(y-ŷ)/∑(y-y̅))

下面是代码的样子——改编自主要的 Python 机器学习库 scikit-learn

numerator = ((y_true - y_pred) ** 2).sum()
denominator = ((y_true - np.average(y_true)) ** 2).sum()r2_score = 1 - (numerator / denominator)

用语言

  1. 从实际 y 值中减去预测值
  2. 计算结果的平方
  3. 合计它们

这是分子。

  1. 从每个实际 y 值中减去实际 y 值的平均值
  2. 计算结果的平方
  3. 合计它们

这是分母。

1 -分子/分母是 R。🎉

r 是 scikit-learn 回归问题的默认度量。如果您想显式地使用它,您可以导入它,然后像这样使用它:

from sklearn.metrics import r2_scorer2_score(y_true, y_pred)

解释

一个解释不存在方差的模型的 R 为 0。R 为 1 的模型可以解释所有的差异。分数越高越好。

然而,如果你的 R 在你的测试集上是 1,你可能在泄露信息,或者这个问题对你的模型来说很简单。👍

在某些领域,如社会科学,有许多因素影响人类行为。假设你有一个只有几个自变量的模型,它的 R 接近于 0.5。你的模型能够解释数据中一半的差异,这很好。😀

有可能 R 为负。当模型对数据的预测比输出值的平均值差时,就会出现负分。每次预测平均值都是无效模型。更多见这里

例子

假设您有以下小型玩具测试数据集:

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

这个 Jupyter 笔记本的 GitHub 上可以获得所有代码。

这是实际和预测的 y 值的曲线图。

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

模型的 R 为 0.71。模型解释了数据中 71%的差异。这还不算太糟糕,尽管我们想要更多的测试数据。😀

再举一个例子,假设 y 的真值是*【55,2,3】*。平均数是 20。对每个 y 值预测 20 会导致 R 为 0。

预测上述真实值*【1,2,2】*的模型得出 R 为-0.59。底线是,你可以做得比空模型差得多!事实上,你可以预测无限差,导致无限低的 R。😲

作为一个简短的旁白,让我们看看调整后的 R 和机器学习与统计。

调整后 R

调整后的 R 考虑了更多预测变量(特征)的增加。

只有当新的预测变量对模型性能的改善程度超过偶然情况下的预期时,调整后的 R 才会随着新的预测变量而增加。调整后的 R 有助于您专注于使用尽可能最节省的模型。😉

调整后的 R 在统计推断中比在机器学习中更常见。机器学习的主要 Python 库 Scikit-learn 甚至没有调整过的 R 度量。 Statsmodels ,Python 的主统计库。如果你想了解更多关于何时使用哪个 Python 库进行数据科学,我在这里写了一个指南

知道特征列数( p )和观测数( n )就可以计算出调整后的 R2。代码如下:

adjusted_r2 = 1 — ((1 — r2) * (n — 1)) / ( n — p — 1)

n-1自由度。每当你听到这个词,你就知道你在统计领域。在机器学习中,我们通常最关心预测能力,因此 R 比调整后的 R 更受青睐。

关于统计学与机器学习的另一个注意事项:我们的重点是机器学习,所以预测而不是因果关系。r——以及我们将看到的其他指标,本身并没有说明任何因果关系。

结果

r 告诉你你的模型解释了多少方差。这很方便,因为任何回归问题的 R 将立即提供对模型执行情况的一些(有限的)理解。😀

r 是一个相对度量。现在让我们来看几个绝对指标。

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

资料来源:pixabay.com

均方根误差(RMSE)

RMSE 是一个非常常见的评估指标。它的范围可以是 0 到无穷大。值越低越好。为了简单起见,请记住它的名称中有 error 并且您希望错误很少。☝️

公式和代码

RMSE 可以这样表述:

平均值的平方根 SSE

我们看到了上证 中的 R 评分指标。它是误差平方和。实际值和预测值之差的平方和。

更多数学公式:

(1/n *(∑(y-))**)

在 Python 代码中:

np.sqrt(np.mean((y_true - y_pred) ** 2))

用语言

  1. 从实际 y 值中减去预测值
  2. 计算结果的平方
  3. 合计它们
  4. 取平均值
  5. 求平方根

以下是如何使用 scikit-learn 中的函数获取 RMSE 的方法:

from sklearn.model_selection import mean_squared_errormean_squared_error(y_true, y_pred, squared=False)

从 scikit-learn 版本 0.22.0 开始,您可以使用squared=False参数。在此之前,你必须像这样自己求平方根:np.sqrt(mean_squared_error(y_actual, y_predicted)。☝️

解释

如果您想要,请使用 RMSE:

  • 惩罚大错误
  • 让结果与结果变量使用相同的单位
  • 使用可以快速计算的损失函数进行验证

您可以使用没有的均方误差(MSE ),但是单位不容易理解。只要取 MSE 的平方根,你就得到 RMSE。👍

的这篇优秀文章中,JJ 指出了 RMSE 的一些问题。即“”RMSE 不一定随误差的方差而增加。RMSE 随着误差幅度的频率分布的变化而增加

同样,RMSE 也不是那么容易解释的。这些单位可能看起来很熟悉,但是您正在消除差异。你不能说 RMSE 值为 10 就意味着你平均差了 10 个单位,尽管大多数人都是这么想的。至少,我以前是这样的。😉

例子

再次回到我们的示例数据集:

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

RMSE 是 0.48。实际 y 值的平均值为 2.2。总之,这些信息告诉我们,这个模型可能介于伟大和可怕之间。在没有更多背景的情况下,很难对这个 RMSE 统计做太多。😐

结果

对于评估来说,RMSE 是一个不完美的统计,但它非常普遍。如果你很在意惩罚大的错误,这是一个不错的选择。当超参数调整或批量训练深度神经网络时,这是一个很好的损失度量选择。

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

资料来源:pixabay.com

绝对平均误差

平均绝对误差(MAE)是误差绝对值的平均值。

公式和代码

让我们直接进入数学方程式:

(1 / n) * (∑ |y - ŷ|)

在代码中:

np.average(np.abs(y_true - y_pred))

用语言

  1. 从实际 y 值中减去预测值
  2. 取每个误差的绝对值
  3. 合计它们
  4. 取平均值

以下是如何使用 scikit-learn 函数获得 MAE:

from sklearn.model_selection import mean_absolute_errormean_absolute_error(y_actual, y_predicted, squared=False)

解释

MAE 在概念上是回归问题最简单的评估标准。它回答了这样一个问题,“你的预测平均偏差了多少?”

这些单位有直观的意义。是啊!🎉

例如,假设您正在预测房屋销售价格,而测试集中的平均实际销售价格是$500,000。10,000 美元的平均误差意味着该模型的预测误差平均为 10,000 美元。那还不错!😀

与 RMSE 分数不同,糟糕的预测不会导致不成比例的高 MAE 分数。

MAE 将总是比 RMSE 更接近于 0(或相同)。

请注意,计算 RMSE 作为具有训练循环的模型的优化度量比计算 MAE 更快。

例子

最后一次转向我们的示例数据集:

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

平均汇率为 0.37。这些预测与平均值 2.2 相差 0.37。我能很快理解这句话。😀

RMSE 是 0.48,而 R 是 0.71。

结果

MAE 是最简单的评估指标,也最容易解释。如果你不想让一些遥远的预测压倒许多接近的预测,这是一个很好的度量标准。如果你想惩罚那些离目标很远的预测,这不是一个好的选择。

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

资料来源:pixabay.com

包装

那么,您应该使用哪个指标呢?总的来说,建议你三个都报!🚀

r 让评估性能的人对您的模型的性能有一目了然的了解。这绝对值得报道。

RMSE 不太直观理解,但非常普遍。它惩罚了非常糟糕的预测。它也是优化模型一个很好的损失度量,因为它可以快速计算。这值得报道。

这篇文章让我对梅产生了新的敬意。理解并按比例对待所有预测误差是很简单的。我会在大多数回归问题评估中强调这一点。

不同意?在推特上告诉我。👍

如果您想了解分类问题的度量标准,我在这里写了相关内容。

我希望你喜欢这篇流行的 Python 数据科学包指南。如果你有,请在你最喜欢的社交媒体上分享,这样其他人也可以找到它。😀

我撰写关于 PythonSQLDocker 以及其他技术主题的文章。如果你对这些感兴趣,请注册我的邮件列表,那里有很棒的数据科学资源,点击这里阅读更多帮助你提高技能的内容。👍

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

资料来源:pixabay.com

报道愉快!⚖️

哪张脸是真的?应用 StyleGAN 来创造假的人

原文:https://towardsdatascience.com/which-face-is-real-c63ce568efd5?source=collection_archive---------60-----------------------

生成模型旨在学习和理解数据集的真实分布,并使用无监督学习从中创建新数据。这些模型(如 StyleGAN)有好有坏,因为很难理解某些概率分布的复杂性。

为了绕过这些路障,对抗性网络框架被创建,由此生成模型与对手对抗:一个学习确定样本是来自模型分布还是数据分布的判别模型。

生成模型通过使随机噪声通过多层感知器来生成样本,而判别模型也是多层感知器。我们把这种情况称为对抗性网络。

介绍这个对抗性框架的论文可以在这里找到,还有用于框架的代码。

哪张脸是真的?

哪张脸是真实的?是由华盛顿大学杰文·韦斯特卡尔·博格斯特伦开发的,作为呼叫扯淡项目的一部分。

“电脑不错,但你的视觉处理系统更好。如果你知道要找什么,你一眼就能认出这些假货——至少目前是这样。用于生成它们的硬件和软件将不断改进,人类在伪造和检测的军备竞赛中落后可能只需要几年时间。”—杰文·韦斯特和卡尔·博格斯特伦

你如何区分这些图像?

差异主要体现在 6 个方面:

水渍

  • 该算法产生的闪亮斑点看起来有点像旧照片上的水斑。

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

水渍

头发

  • 不连续的发束、太直的头发或太多条纹将是生成头发时的常见问题。

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

不对称

  • 一个常见的问题是不对称。通常框架会在左边采用一种风格,在右边采用另一种风格,或者在一边有一个旅行者风格的装饰,而在另一边没有。其他时候,框架会弯曲或参差不齐。此外,面部毛发不对称、左耳和右耳不同的耳环以及左右两侧不同形式的衣领或织物也可能存在。

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

不对称

背景问题

  • 图像的背景可能表现为奇怪的状态,如模糊或畸形的物体。这是因为神经网络是在人脸上训练的,对图像的背景给予的强调较少。

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

背景问题

荧光渗色

  • 荧光色有时会从背景渗入头发或面部。观察者可能会误认为这是有色头发。

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

荧光出血

牙齿(tooth 的复数)

  • 牙齿也很难渲染,可能会呈现出奇怪的形状,不对称,或者对于那些可以识别牙齿的人来说,有时图像中会出现三颗门牙。

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

牙齿

测试 StyleGAN 算法

StyleGAN 的所有代码都在 stylegan 库中开源。它给出了如何自己运行 styleGAN 算法的细节。因此,让我们开始分享一些基本的系统要求。

系统需求

  • Linux 和 Windows 都受支持,但是出于性能和兼容性的原因,我们强烈推荐 Linux。
  • 64 位 Python 3.6 安装。我们建议使用 numpy 1.14.3 或更新版本的 Anaconda3。
  • 支持 GPU 的 TensorFlow 1.10.0 或更新版本。
  • 一个或多个至少 11GB DRAM 的高端 NVIDIA GPUs。我们推荐 8 特斯拉 V100 GPUs 的英伟达 DGX-1。
  • NVIDIA 驱动 391.35 或更新,CUDA 工具包 9.0 或更新,cuDNN 7.3.1 或更新。

pretrained_example.py 中给出了一个尝试 styleGAN 预训练示例的最小示例。它按如下方式执行:

> python pretrained_example.py

Downloading https://drive.google.com/uc?id=1MEGjdvVpUsu1jB4zrXZN7Y4kBBOzizDQ .... done

Gs                              Params OutputShape WeightShape

---                             --- --- ---

latents_in                      - (?, 512) -

...

images_out                      - (?, 3, 1024, 1024) -

---                             --- --- ---

Total                           26219627

Once you execute ‘python pretrained_example.py’, type in ‘ls results’ to see the results.

> ls results

example.png # https://drive.google.com/uc?id=1UDLT_zb-rof9kKH0GwiJW_bS9MoZi8oP

准备用于训练的数据集

训练和评估脚本对存储为多分辨率 TFRecords 的数据集进行操作。每个数据集由一个目录表示,该目录包含不同分辨率的相同图像数据,以实现高效的流式传输。有一个单独的*。tfrecords 文件,如果数据集包含标签,它们也存储在一个单独的文件中。默认情况下,脚本期望在数据集/ / - 找到数据集。tfrecords *。*目录可以通过编辑 config.py 来改变:

result_dir = 'results'

data_dir = 'datasets'

cache_dir = 'cache'

要获取 FFHQ 数据集(datasets/ffhq),请参考 Flickr-Faces-HQ 库

要获取 CelebA-HQ 数据集(datasets/celebahq),请参考渐进式 GAN 库

要获得其他数据集,包括 LSUN,请查阅相应的项目页面。可以使用提供的 dataset_tool.py 将数据集转换为多分辨率 TFRecords:

> python dataset_tool.py create_lsun datasets/lsun-bedroom-full ~/lsun/bedroom_lmdb --resolution 256

> python dataset_tool.py create_lsun_wide datasets/lsun-car-512x384 ~/lsun/car_lmdb --width 512 --height 384

> python dataset_tool.py create_lsun datasets/lsun-cat-full ~/lsun/cat_lmdb --resolution 256

> python dataset_tool.py create_cifar10 datasets/cifar10 ~/cifar10

> python dataset_tool.py create_from_images datasets/custom-dataset ~/custom-images

训练 StyleGAN 网络

建立数据集后,您可以按如下方式训练自己的 StyleGAN 网络:

  1. 编辑 train.py 通过取消注释或编辑特定行来指定数据集和训练配置。
  2. 使用 python train.py 运行训练脚本。
  3. 结果被写入一个新创建的目录 results/ - 。
  4. 培训可能需要几天(或几周)才能完成,具体取决于配置。

默认情况下,train.py 配置为使用 8 个 GPU以 1024×1024 分辨率为 FFHQ 数据集训练最高质量的 StyleGAN(表 1 中的配置 F)。

预期 StyleGAN 培训时间

下面你会发现 NVIDIA 报告的 train.py 脚本(在 stylegan 存储库中可用)在 Tesla V100 GPU 上针对 FFHQ 数据集(在 stylegan 存储库中可用)的默认配置的预期训练时间。

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

斯泰勒根训练时间

StyleGAN:将所有这些结合在一起

这款令人惊叹的应用背后的算法是英伟达的 Tero Karras、Samuli Laine 和 Timo Aila 的创意,并将其命名为 StyleGAN 。该算法是基于 Ian Goodfellow 及其同事对一般敌对网络(GAN)的早期研究。

创成式模型有一个局限性,就是很难从照片上控制面部特征等特征。NVIDIA 的 StyleGAN 是对这一限制的修复。该模型允许用户调整可以控制照片差异的超参数。

StyleGAN 通过在每个卷积层向图像添加样式来解决照片的可变性。这些风格代表一个人的照片的不同特征,例如面部特征、背景颜色、头发、皱纹等。该模型生成两个图像 A 和 B,然后通过从 A 中提取低级特征并从 B 中提取其余特征来组合它们。在每个级别,使用不同的特征(样式)来生成图像:

  • 粗略风格(分辨率在 4 到 8 之间)——姿势、头发、脸、形状
  • 中等风格(分辨率在 16 到 32 之间)——五官、眼睛
  • 精细样式(分辨率在 64 到 1024 之间)- 颜色方案

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

英伟达的神经网络

你以前测试过 StyleGAN 吗?还是你第一次?请在下面的评论区告诉我们。对于任何技术或框架,我们总是从社区中寻找新的和创造性的方法。

GANs 和 StyleGAN 的其他有用资源

你应该使用哪种版本的 BERT 来完成你的 QA 任务?

原文:https://towardsdatascience.com/which-flavor-of-bert-should-you-use-for-your-qa-task-6d6a0897fb24?source=collection_archive---------27-----------------------

问答用 BERT 模型的选择和基准测试指南

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

埃文·丹尼斯在 Unsplash 上的照片

由于大量的开源自然语言处理库、精选数据集和迁移学习的力量,制作智能聊天机器人从未如此简单。用 Transformers 库构建一个基本的问答功能可以像这样简单:

from transformers import pipeline# Context: a snippet from a Wikipedia article about Stan Lee
context = """
    Stan Lee[1] (born Stanley Martin Lieber /ˈliːbər/; December 28, 1922 - November 12, 2018) was an American comic book 
    writer, editor, publisher, and producer. He rose through the ranks of a family-run business to become Marvel Comics' 
    primary creative leader for two decades, leading its expansion from a small division of a publishing house to
    multimedia corporation that dominated the comics industry.
    """nlp = pipeline('question-answering')
result = nlp(context=context, question="Who is Stan Lee?")

这是输出结果:

{'score': 0.2854291316652837,
 'start': 95,
 'end': 159,
 'answer': 'an American comic book writer, editor, publisher, and producer.'}

嘣!有用!

然而,如此低的信心分数有点令人担忧。稍后,当我们谈到 BERT 检测不可能的问题和不相关的上下文的能力时,您会看到这是如何发挥作用的。

但是,花一些时间为您的任务选择正确的模型将确保您从对话代理那里获得尽可能好的开箱即用性能。您对语言模型和基准数据集的选择将决定您的聊天机器人的性能。

BERT(变压器的双向编码表示)模型在复杂的信息提取任务中表现非常好。他们不仅能捕捉单词的意思,还能捕捉上下文。在选择模型(或满足于默认选项)之前,您可能希望评估候选模型的准确性和资源(RAM 和 CPU 周期),以确保它确实符合您的预期。在本文中,您将看到我们如何使用斯坦福问答数据集(SQuAD) 对我们的 QA 模型进行基准测试。你可能想使用许多其他好的问答数据集,包括微软的 NewsQACommonsenseQAComplexWebQA 以及许多其他数据集。为了最大限度地提高应用程序的准确性,您需要选择一个基准数据集来代表您在应用程序中预期的问题、答案和上下文。

拥抱脸变形金刚库有一个庞大的预训练模型目录,用于各种任务:情感分析、文本摘要、释义,当然还有问题回答。我们从可用的模型库中选择了几个候选问答模型。你瞧,他们中的许多人已经在阵容数据集中进行了微调。厉害!以下是我们将要评估的几个小队微调模型:

  • 蒸馏车间
  • Bert-large-uncased-whole-word-masking-fine tuned-squad
  • ktrapeznikov/Albert-xlarge-v2-squad-v2
  • MRM 8488/Bert-tiny-5-fine tuned-squad v2
  • twmkn 9/艾伯特基地 v2 小队 2

我们用我们选择的模型对两个版本的 SQuAD(版本 1 和版本 2)进行了预测。它们之间的区别在于,SQuAD-v1 只包含可回答的问题,而 SQuAD-v2 也包含不可回答的问题。为了说明这一点,让我们看看下面来自 SQuAD-v2 数据集的示例。问题 2 的答案不可能从维基百科给出的上下文中得出:

问题 1: “诺曼底位于哪个国家?”

问题 2: “谁在 1000 年和 1100 年给诺曼底命名”

上下文: 《诺曼人(Norman:Nourmands;法语:诺曼第人;拉丁语:Normanni)是在 10 世纪和 11 世纪把他们的名字给法国的诺曼底地区的人。他们是北欧海盗的后裔(“Norman”来源于“Norseman”),这些来自丹麦、冰岛和挪威的袭击者和海盗在他们的首领罗洛的带领下,同意宣誓效忠西法兰克王国国王查理三世。通过几代人的同化和与本地法兰克人和罗马-高卢人的混合,他们的后代逐渐与西法兰克王国以加洛林文化为基础的文化融合。诺曼人独特的文化和种族身份最初出现在 10 世纪上半叶,并在随后的几个世纪中继续发展

我们的理想模型应该能够很好地理解上下文,从而得出答案。

让我们开始吧!

要在 Transformers 中定义模型和标记器,我们可以使用自动类。在大多数情况下,Automodels 可以从模型名称中自动派生设置。我们只需要几行代码来设置它:

from tqdm import tqdm
from transformers import AutoTokenizer, AutoModelForQuestionAnsweringmodelname = 'bert-large-uncased-whole-word-masking-finetuned-squad'tokenizer = AutoTokenizer.from_pretrained(modelname)
model = AutoModelForQuestionAnswering.from_pretrained(modelname)

我们将使用人类水平的性能作为我们的准确性目标。小组排行榜为这项任务提供了人类水平的表现,即找到准确答案的准确率为 87%,f1 分数为 89%。

你可能会问,“他们怎么知道人类的表现是什么?”以及“他们在谈论什么人类?”那些斯坦福的研究人员很聪明。他们只是使用了标记小队数据集的相同众包人类。对于测试集中的每个问题,他们让多个人提供备选答案。对于人类评分,他们只留下其中一个答案,并使用他们用来评估机器模型的相同文本比较算法,检查它是否与其他任何答案匹配。这个“漏掉一个人”数据集的平均准确度决定了机器要争取的人类水平分数。

为了在我们的数据集上运行预测,首先我们必须将小队下载的文件转换成计算机可解释的特征。幸运的是,Transformers 库已经有了一套方便的函数来做这件事:

from transformers import squad_convert_examples_to_features
from transformers.data.processors.squad import SquadV2Processorprocessor = SquadV2Processor()
examples = processor.get_dev_examples(path)
features, dataset = squad_convert_examples_to_features(
    examples=examples,
    tokenizer=tokenizer,
    max_seq_length=512,
    doc_stride = 128,
    max_query_length=256,
    is_training=False,
    return_dataset='pt',
    threads=4, # number of CPU cores to use
)

我们将使用 PyTorch 及其 GPU 功能(可选)进行预测:

import torch
from torch.utils.data import DataLoader, SequentialSamplereval_sampler = SequentialSampler(dataset)
eval_dataloader = DataLoader(dataset, sampler=eval_sampler, batch_size=10)all_results = [] def to_list(tensor):
    return tensor.detach().cpu().tolist()for batch in tqdm(eval_dataloader):
    model.eval()
    batch = tuple(t.to(device) for t in batch) with torch.no_grad():
        inputs = {
            "input_ids": batch[0],
            "attention_mask": batch[1],
            "token_type_ids": batch[2]
        } example_indices = batch[3] outputs = model(**inputs)  # this is where the magic happens for i, example_index in enumerate(example_indices):
            eval_feature = features[example_index.item()]
            unique_id = int(eval_feature.unique_id)

重要的是,模型输入应该针对 DistilBERT 模型(如distilbert-base-cased-distilled-squad)进行调整。我们应该排除“token_type_ids”字段,因为与 BERT 或 ALBERT 相比,DistilBERT 实现有所不同,以避免脚本出错。其他一切都将保持不变。

最后,为了评估结果,我们可以应用 Transformers 库中的squad_evaluate()函数:

from transformers.data.metrics.squad_metrics import squad_evaluateresults = squad_evaluate(examples, 
                         predictions,
                         no_answer_probs=null_odds)

以下是由 squad_evaluate 生成的示例报告:

OrderedDict([('exact', 65.69527499368314),
             ('f1', 67.12954950681876),
             ('total', 11873),
             ('HasAns_exact', 62.48313090418353),
             ('HasAns_f1', 65.35579306586668),
             ('HasAns_total', 5928),
             ('NoAns_exact', 68.8982338099243),
             ('NoAns_f1', 68.8982338099243),
             ('NoAns_total', 5945),
             ('best_exact', 65.83003453213173),
             ('best_exact_thresh', -21.529870867729187),
             ('best_f1', 67.12954950681889),
             ('best_f1_thresh', -21.030719757080078)])

现在,让我们比较两个基准数据集(SQuAD-v1 和 SQuAD-v2)生成的预测的精确答案准确度分数(“精确”)和 f1 分数。所有模型在没有否定的数据集(SQuAD-v1)上都表现得更好,但我们确实有一个明显的赢家(ktrapeznikov/albert-xlarge-v2-squad-v2)。总的来说,它在两个数据集上都表现得更好。另一个好消息是,我们为这个模型生成的报告与作者发布的报告完全匹配。精确度和 f1 与人类水平的性能稍有差距,但对于像 SQuAD 这样具有挑战性的数据集来说,这仍然是一个很好的结果。

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

表 1:v1 和 v2 组 5 个模型的准确度分数

我们将在下表中比较 SQuAD-v2 预测的完整报告。看起来ktrapeznikov/albert-xlarge-v2-squad-v2在两个任务上做得几乎一样好:(1)识别可回答问题的正确答案,以及(2)剔除可回答问题。有趣的是,bert-large-uncased-whole-word-masking-finetuned-squad在第一项任务(可回答的问题)中提供了一个显著(大约 5%)的预测准确性提升,但在第二项任务中完全失败。

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

表 2:不可能的问题的单独准确度分数

我们可以通过调整最佳 f1 分数的零阈值来优化模型,以更好地识别无法回答的问题。记住,最佳 f1 阈值是由 squad_evaluate 函数(best_f1_thresh)计算的输出之一。下面是当我们应用来自 SQuAD-v2 报告的best_f1_thresh时,SQuAD-v2 的预测指标是如何变化的:

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

表 3:调整后的准确度分数

虽然这种调整有助于模型更准确地识别无法回答的问题,但这是以牺牲已回答问题的准确性为代价的。这种权衡应该在您的应用程序环境中仔细考虑。

让我们用变形金刚 QA 管道,带着自己的几个问题,试驾三款最好的车型。我们从维基百科一篇关于计算语言学的文章中挑选了下面这段话作为一个看不见的例子:

context = '''
Computational linguistics is often grouped within the field of artificial intelligence 
but was present before the development of artificial intelligence.
Computational linguistics originated with efforts in the United States in the 1950s to use computers to automatically translate texts from foreign languages, particularly Russian scientific journals, into English.[3] Since computers can make arithmetic (systematic) calculations much faster and more accurately than humans, it was thought to be only a short matter of time before they could also begin to process language.[4] Computational and quantitative methods are also used historically in the attempted reconstruction of earlier forms of modern languages and sub-grouping modern languages into language families.
Earlier methods, such as lexicostatistics and glottochronology, have been proven to be premature and inaccurate. 
However, recent interdisciplinary studies that borrow concepts from biological studies, especially gene mapping, have proved to produce more sophisticated analytical tools and more reliable results.[5]
'''
questions=['When was computational linguistics invented?',
          'Which problems computational linguistics is trying to solve?',
          'Which methods existed before the emergence of computational linguistics ?',
          'Who invented computational linguistics?',
          'Who invented gene mapping?']

请注意,根据给定的上下文,最后两个问题是不可能回答的。以下是我们从测试的每个模型中获得的结果:

Model: bert-large-uncased-whole-word-masking-finetuned-squad
-----------------
Question: When was computational linguistics invented?
Answer: 1950s (confidence score 0.7105585285134239)

Question: Which problems computational linguistics is trying to solve?
Answer: earlier forms of modern languages and sub-grouping modern languages into language families. (confidence score 0.034796690637104444)

Question: What methods existed before the emergence of computational linguistics?
Answer: lexicostatistics and glottochronology, (confidence score 0.8949566496998465)

Question: Who invented computational linguistics?
Answer: United States (confidence score 0.5333964470000865)

Question: Who invented gene mapping?
Answer: biological studies, (confidence score 0.02638426599066701)

Model: ktrapeznikov/albert-xlarge-v2-squad-v2
-----------------
Question: When was computational linguistics invented?
Answer: 1950s (confidence score 0.6412413898187204)

Question: Which problems computational linguistics is trying to solve?
Answer: translate texts from foreign languages, (confidence score 0.1307672173261354)

Question: What methods existed before the emergence of computational linguistics?
Answer:  (confidence score 0.6308010582306451)

Question: Who invented computational linguistics?
Answer:  (confidence score 0.9748902345310917)

Question: Who invented gene mapping?
Answer:  (confidence score 0.9988990117797236)

Model: mrm8488/bert-tiny-5-finetuned-squadv2
-----------------
Question: When was computational linguistics invented?
Answer: 1950s (confidence score 0.5100432430158293)

Question: Which problems computational linguistics is trying to solve?
Answer: artificial intelligence. (confidence score 0.03275686739784334)

Question: What methods existed before the emergence of computational linguistics?
Answer:  (confidence score 0.06689302592967117)

Question: Who invented computational linguistics?
Answer:  (confidence score 0.05630986208743849)

Question: Who invented gene mapping?
Answer:  (confidence score 0.8440988190788303)

Model: twmkn9/albert-base-v2-squad2
-----------------
Question: When was computational linguistics invented?
Answer: 1950s (confidence score 0.630521506320747)

Question: Which problems computational linguistics is trying to solve?
Answer:  (confidence score 0.5901262729978356)

Question: What methods existed before the emergence of computational linguistics?
Answer:  (confidence score 0.2787252009804586)

Question: Who invented computational linguistics?
Answer:  (confidence score 0.9395531361082305)

Question: Who invented gene mapping?
Answer:  (confidence score 0.9998772777192002)

Model: distilbert-base-cased-distilled-squad
-----------------
Question: When was computational linguistics invented?
Answer: 1950s (confidence score 0.7759537003546768)

Question: Which problems computational linguistics is trying to solve?
Answer: gene mapping, (confidence score 0.4235580072416312)

Question: What methods existed before the emergence of computational linguistics?
Answer: lexicostatistics and glottochronology, (confidence score 0.8573431178602817)

Question: Who invented computational linguistics?
Answer: computers (confidence score 0.7313878935375229)

Question: Who invented gene mapping?
Answer: biological studies, (confidence score 0.4788379586462099)

如您所见,很难根据单个数据点来评估模型,因为结果遍布整个地图。虽然每个模型都给出了第一个问题的正确答案(“计算语言学是什么时候发明的?”),其他问题被证明更难。这意味着,即使我们最好的模型也可能需要在自定义数据集上再次微调,以进一步改进。

带走:

  • 开源预训练(和微调!)模型可以启动你的自然语言处理项目。
  • 在做任何事情之前,如果可能的话,试着复制作者报告的原始结果。
  • 对你的模型进行准确性基准测试。即使是在完全相同的数据集上进行微调的模型,其性能也可能大不相同。

哪个是最好的 NLP 库?

原文:https://towardsdatascience.com/which-is-the-best-nlp-d7965c71ec5f?source=collection_archive---------27-----------------------

通用 NLP 库的实时评估(带代码片段)

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

艾拉·迪恩在 Unsplash 上的照片

自从我开始从事 NLP(自然语言处理)工作以来,我一直想知道哪一个是最好的 NLP 库,可以满足我们大多数常见的 NLP 需求。虽然确实不存在一刀切的做法,库的选择将取决于手头的任务,但我仍然很好奇,如果不同的库针对一个非常简单的任务进行基准测试,它们会如何进行比较。

考虑到这一点,我戴上开发人员的帽子,开始使用各种库编写 python 代码,并针对一个非常常见的任务对它们进行评估。为了简单起见,我决定使用 Twitter 文本分类问题进行评估。今天最常见的 NLP 库是 NLTK、Spacy、WordBlob、Gensim,当然还有使用 LSTM(长短期记忆)或 GRU(门控循环单元)细胞的深度神经网络架构。

问题陈述

我使用的数据集由一组 Twitter 消息组成。一些推文被贴上了种族主义的标签,而另一些则没有。这是一个经典的基于监督学习的二分类问题。我们的工作是基于不同的库创建模型,并使用它们将以前未见过的文本分类为种族主义或非种族主义。

以下是一些可用的推文:

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

标签 1 表示该推文是种族主义的,标签 0 表示不是。

为了简洁起见,我将只关注代码的关键部分。完整代码,请随意访问我的 GitHub 机器学习库。因为我已经清理了数据集并执行了 EDA(探索性数据分析),所以我也不会在这里讨论这些细节。

这里我将重点介绍五个不同的库— NLTKWordBlob 、CNN 的 Spacy、document vectorsSpacy,以及最后一个具有双向 LSTM 单元的深度神经网络模型。**

我将使用 ROC-AUC 得分和F1-得分作为我的评估指标。

所以让我们开始吧。

NLTK

让我们从 NLTK 包开始。在这里,我们使用 NLTK 库对 tweets 进行标记化和词条化,使用 Gensim 的 Word2Vec 模型创建单词向量。最后使用 XGBoost 分类器模型进行训练和推理。下面是包含代码相关部分的代码片段

使用这种技术,我能够获得 ROC-AUC 分数为 0.8 和 F1 分数为 0.68

文本 Blob

TextBlob 是一个初学者友好的 NLP 库,提供了很多很酷的特性。它还提供了内置的文本分类器。然而,我发现 TextBlob 比我用过的其他库要慢很多。

出于我们的目的,我们将使用 TextBlob 的内置 DecisionTreeClassifier 。下面是代码片段:

使用这种技术,我能够得到 ROC-AUC 分数为 0.68 和 F1 分数为 0.46

CNN 的空间

Spacy 是 NLP 最受欢迎和使用最广泛的库之一,提供了非常强大的特性。它提供了一个名为 textcat 的内置文本分类器,可以作为默认的管道组件使用。 textcat 组件支持 BOW (文字袋)、S imple-CNN (卷积神经网络)和 Ensemble 架构。

在我们的例子中,我们将使用简单 cnn 架构。

在这种情况下,我的 ROC-AUC 得分为 0.78 ,F1 得分为 0.66

文档向量空间

在这个例子中,我们将继续使用 Spacy,但不是使用它的内置文本分类器,而是使用 Spacy 来生成文档向量,然后将这些向量提供给 XGBoost 分类器。让我们看看这是否能提高我们的分数。

这里我们得到的 ROC-AUC 分数为 0.8 和 F1-分数为 0.64

具有 LSTM 细胞的深度神经网络

最后,我们将使用双向 LSTM 细胞创建一个神经网络模型。我们将使用 TensorFlow 的 Keras 库,并使用它的特性,如标记化和序列填充

这里我们得到 ROC-AUC 分数为 0.82 和 F1 分数为 0.41

结论

现在让我们来比较一下分数

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

模型的 ROC_AUC 得分非常相似。看看 F1 的分数,似乎 NLTK 和 Spacy 最适合这份工作。然而,使用各种优化技术和超参数调整,尤其是基于 LSTM 的模型,绝对有可能进一步改进模型。

以上所有例子的完整代码都可以在我的 GitHub 机器学习库中找到。

经过预先训练的模特最近引起了很大的轰动。随着最近 OpenAI 的 GPT3 的发布,兴奋程度达到了历史最高水平。我很好奇他们会如何执行我们简单的文本分类任务。

这就是我接下来要尝试的。请继续关注这个空间,了解更多信息。

我应该为我的 Python 仪表板使用哪个库?

原文:https://towardsdatascience.com/which-library-should-i-use-for-my-dashboard-c432726a52bf?source=collection_archive---------11-----------------------

从笔记本中的早期原型,到生产

谈到数据可视化,有许多可能的工具 Matplotlib、Plotly、Bokeh…哪一个适合我在笔记本电脑中的短期目标,哪一个是长期生产中的好选择?生产是什么意思?

现在你已经有了一个很好的机器学习模型,或者你已经完成了一些数据挖掘或分析,你需要呈现和推广这个惊人的工作。最初,您可能会重复使用一些笔记本来制作一些图表……但很快,同事或客户就会要求访问数据,或者要求其他视图或参数。你该怎么办?应该使用哪些工具和库?对于我工作的所有阶段,有没有一个适合所有人的解决方案?

数据可视化的范围非常广泛,从用简单的图表显示数据到包含在报告中,再到复杂的交互式仪表板。第一个是任何了解 Excel 的人都可以接触到的,而后者更像是一个软件产品,可能需要完整的软件开发周期和方法。

在这两种极端情况之间,数据科学家面临许多并非微不足道的选择。这篇文章提供了这个过程中会遇到的一些问题,以及一些提示和答案。选择的起点是 Jupiter 笔记本中的 Python,目标是生产中的 Web 仪表板。

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

到目标 Pixabax

我需要哪个图表类型的库?

获得正确的图表类型始终是我们考虑的第一个问题。

你对数据可视化有一个很棒的新想法,你的老板喜欢旭日图,但是这对于你正在使用的图表库可行吗?

Python 中的主流开源图表库 MatplotlibSeabornPlotlyBokeh ,或多或少支持同一组图表类型。它们还支持像素矩阵,允许像显示单词云这样的扩展。

以下是从 word cloud Python 库文档中绘制 Word Cloud 的示例:

import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud
​
text = "square"
x, y = np.ogrid[:300, :300]
​
mask = (x - 150) ** 2 + (y - 150) ** 2 > 130 ** 2
mask = 255 * mask.astype(int)
​
wc = WordCloud(background_color="white", repeat=True, mask=mask)
wc.generate(text)
​
plt.axis("off")
plt.imshow(wc, interpolation="bilinear")
plt.show()

网络图

网络图是一个特定的类别,上面列出的库本身并不处理它。用于网络的主要 Python 库是 NetworkX) 。默认情况下,NetworkX 使用 Matplotlib 作为绘图的后端。Graphviz (Pygraphviz)是事实上的标准图形绘制库,可以与 NetworkX 耦合。用相当多的几行代码,你也可以用 Plotly 来画 graph⁴.NetworkX 和散景的整合也是 documented⁵.

地理图

地理位置信息和地图也是数据可视化的一个特定子领域。绘制地图面临许多挑战,其中包括:

  • 处理大而复杂的轮廓(例如国家边界)
  • 根据缩放显示更多或更少的信息,这也称为细节层次。这种影响同时也影响了图形的可读性,以及转化为加载延迟和内存占用的复杂性
  • 地理坐标的处理,即从非欧几里得空间到 2D 欧几里得空间的单个或多个投影(例如,具有给定 UTM 区的 UTM 的经纬度)
  • 多种文件格式的信息可用性,即使存在事实上的标准,如 GeoJSON 和 Shape-file

根据所选的绘图库,您可能需要做少量或大量的预处理。处理地理坐标的常见开源库是 Proj ,以及 GDAL ,用于处理文件格式以及从格式或坐标到其他上下文的转换。

Matplotlib 不直接支持绘制地图,它依赖于像素矩阵(光栅图像),如 gallery⁶.中所述但这是一个 pis-aller ,你不希望这样做,但如果你的唯一目标是一个静态图像。

Plotly 正在演示基于 Mapbox 的 plots⁷地图。许多功能是可用的,但至少有一个功能是缺失的,即散点图中细节层次的管理。

Bokeh 对地图有一些支持,包括谷歌 maps⁸的集成,但它似乎很粗糙。

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

带有区域(等高线)、标记簇、悬停信息的地图,由作者用 leav 创建

leaf是包装leafJavascript 库的 Python 库。传单用于许多合作和商业网站,例如开放街道地图。Folium 在开放数据上绘制地图非常有效。

地理数据操作的开源参考是来自 OSGeo 的 QGIS 。这是一个桌面应用程序,但它包括一个 Python 控制台,也可以直接使用 Pyqgis API⁹.

数据帧

Pandas 及其数据框架是 Python 中数据科学的必备工具。对图表创建和仪表板有什么影响?

一方面,熊猫数据帧和系列有一个情节 API。默认情况下,它依赖 Matplotlib 作为后端。然而,Plotly 作为熊猫的图形后端是可用的⁰.Github 项目也支持散景。

另一方面,熊猫图可能不符合您的要求,您想知道除了使用列和系列作为向量之外,如何在图中使用数据框架。Plotly Express 具有这种支持面向列的数据的能力。

最后一招,d3.js

如果这些库和它们的扩展都不能处理你正在寻找的图表,那么你可以切换到 d3.js ,它是浏览器的基本图表库。这意味着你将离开 Python 的世界,进入 Javascript 的领域。可能性和定制是巨大的,如示例图库所示。然而,您将需要处理其他库中提供的图形的许多方面:轴、图例、交互性…

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

用 Matplotly 和 Seaborn 设计的散布矩阵

如何构建包含多个图表的视图?

在 dataviz 的设计中,图表的布局或组成需要多个图表来显示一些特性。你可能已经喜欢上了 Matplotlib 的支线剧情的优缺点,从奇怪的命令开始,比如“ plt.subplot(1,2,1)”或者更奇怪的等价命令“ plt.subplot(121)”。如果这足以实现您的目标,我还是建议使用替代的、更简洁的“PLT . subplots()”API,它返回一个数字和一个轴数组。无论如何,你可能会感到不仅交互性受到限制(这将在下一节中讨论),而且布局功能也受到限制。

布局的增强

Matplotlib 允许不均匀的宽度和高度,使用调用 Figure.add_subplots 方法,如"fig.add_subplot(3, 1, (1, 2))"制作一个跨越图形⁴.上 2/3 的子图 Seaborn 引入了一个增强功能,即散射矩阵⁵.

Plotly 允许类似的能力,包括不均匀的子图。然而,我发现 API 相当有限。例如,不能设置子图标题的字体大小或共享图例。Bokeh 在⁶.也有类似能力

Plotly,Express API,更进一步,用边缘概率图作为直方图或⁷,还有一个同步的概览-详细图表,称为“范围滑块⁸".”这将我们引向图形的交互性,这将在下一节中详细介绍。

前进的道路

但是如果这些布局助手不足以达到我的目的呢?可能的答案有很多,从 Plotly Dash 解决方案到完整的 HTML 布局或使用 d3.js 的 SVG 定制设计。

Plotly Dash 提出了一个中间解决方案,在这个方案中,你可以坚持使用 Python,但是可以生成一些比绘图库更复杂、更具交互性的仪表板。尽管如此,它要求你有一些基本的 HTML 知识,并且迟早会深入到层叠样式表(CSS)中。

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

使用 Dash、Plotly 和 Dash-Bootstrap-Components 的仪表板布局和几个绘图和 HTML 元素

我如何与我的图表互动?

你对图表非常满意,但它看起来非常静态,甚至没有缩放!

交互性是如此多不同的东西。它从缩放和平移等常见操作开始。下一步是同步图表:在共享一个轴的几个图表上同时应用缩放和平移。你也可能对两幅图上的同步选择感兴趣,也称为刷图(例如在散景⁹).)Matplolib 对所有的渲染引擎都有这样的交互性,但是在笔记本⁰.中然而,有一个基于 Matplotlib 的解决方案, mpld3 正在处理这个问题,并可能提供您需要的一切。然而,趋势是使用更新的库,如 Plotly 或 Bokeh,它们在笔记本中“开箱即用”。

然后是动态注释。它们包括从鼠标位于标记上时的悬停信息到线条图高亮显示。关于 hover,无论使用什么库(带 Mpld3 和插件的 Matplotlib,Plotly,Bokeh ),都意味着在每个标记上附加一个 HTML 文档 div,可能还有一些 CSS。

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

2D 特征平面图中 MNIST 数字(784 像素)的 UMAP 投影散景图,带有包含原始图像作者的悬停信息

更复杂的交互与过滤或查询数据有关。当过滤器修改范围时,它可以接近缩放功能(例如:时间序列的每日/每周/每月选择器),或者一系列方面的选择器,或者甚至更复杂的关联。选择器在 Plotly 中作为自定义控件提供,在 Bokeh 中作为小部件提供。

常见的绘图库提供了基本的交互功能,直到创建一些小部件,但是,对于高级布局,我建议直接切换到 Plotly Dash,它更加通用。

我的 dataviz 仪表盘渲染流畅吗?

仪表板越复杂或数据越大,处理的时间就越长,因此呈现的时间也就越长。等待几秒钟来查看静态图可能没问题。当图形与小部件和控件交互时,等待超过 1 秒是不允许的。

如果流动性消失了,你有四个主要的解决方案,并且越来越复杂:

  • 用更少的绘图和控件简化仪表板。这可能没问题,但是你应该首先考虑为什么需要这样的复杂性?
  • 简化数据,即显示更少的数据或更小的粒度。这可以在特征和准确性之间提供良好的折衷。这将导致下一个解决方案…
  • 离线预处理数据,以预组装仪表板中显示的数据。这可能意味着存储新的序列或新的表,最终导致与数据管理相关的其他问题。最后,您将进行更多的数据工程,并且可能会因为两个数据、太多的表而陷入死胡同。这个死胡同的解决方案是更多的数据工程和…
  • 专用服务器中的在线处理和 API 的设计。

一个带有 API 的服务器不是你首先想到的,但是你最终会比你想象的更快地处理这个软件项目。预测比拖延更好,直到没有其他解决方案,项目的最后期限快到了。

定义 API 通常涉及几个团队和技能:数据科学家定义为什么,数据工程师定义什么,基础设施工程师定义如何,包括性能、安全性、持久性和完整性。

Plotly Dash 允许初始 API,因为它是基于 Flask 框架的。参见 Dash 文档,了解与 Flask 应用程序的集成,Flask 应用程序定义了自定义 Flask 路由,可提供数据,即 API。仍然没有适当的 API 访问管理,包括身份验证。在后一方面,Dash 是非常有限的⁴.

在开发 dataviz 的过程中,我感觉自己很快/很慢/不知道

开发和发布需要你付出多少努力?

一些工具是有效的,它们提供了预期的结果,但是效率不高,要得到结果需要花费大量的时间。例如,d3.js 被认为是一个非常强大和完整的数据可视化和图表库,但同时,它需要处理许多在更高抽象的库中默认可用的东西。

生产力不仅来自于使用正确的抽象级别,还来自于一个易于使用且有良好文档记录的 API。我想说,调查的 Python 图表库没有一个是容易掌握的。

Matplotlib 的 API 在处理轴、格式(标签)时相当复杂,它并不总是一致的,而且相当多余。例如,参见上面关于“ plt.subplot()”的注释。这不是唯一的例子,例如,有一个子例程“ plt.xlabel()”相当于 Axes 对象上的方法“ ax.set_xlabel()”。

Plotly 的 API 并不是更好,首先,您必须在两个 API 集之间进行选择:Express 集,它非常简单但有限,主要针对数据帧;以及图形对象集,它更完整,是 Express 集的补充,但没有 Express 中的一些高级功能。然后你将不得不处理那些对我来说很难理解的文件。使用 Plotly 网站内部或网络搜索引擎进行搜索很少会找到您要找的 API。您可能必须处理 JSON 中底层数据模型的文档。

Bokeh API 可能更精简,文档也更好,但是有一些奇怪的东西,比如绘制折线图和相关标记的两个单独的指令。

我真的需要一个漂亮的 web 应用程序,我应该害怕它吗?

您的仪表板是成功的,将作为产品在您的组织内部部署,供客户使用,甚至直接在互联网上公开。

作为一名数据科学家,您缺少处理这些问题和获得软件专家帮助的技能。然而,你会被问到这个开发的努力和范围是什么。这在很大程度上取决于产品化的途径、在那里使用的框架,以及到目前为止您一直使用的框架。

使用(部分)当前框架投入生产

Plotly 独立图形可以导出为静态 HTML。散景提供了一些嵌入⁵.的方案带有 Mpld3 的 Matplotlib 有一个 HTML 输出⁷.然而,这个解决方案是针对插图而不是仪表板的。

Plotly Dash 在某些情况下可能会作为主要的 Web 应用程序或嵌入式小工具投入生产。如前所述,在进入在线生产之前,您需要检查系统的安全性。关于安全性,作为一名数据设计人员,您主要需要检查您只公开了想要的数据,而不是更多。

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

显示巴黎地铁交通的网络和地理互动图 Data-Publica

使用单页应用程序投入生产

今天,我们使用的大多数 Web 应用程序都基于一种称为单页应用程序(SPA)的模式:应用程序在 Web 浏览器中加载一次,然后通过一些异步 API 与服务器进行交互,而无需重新加载网页。这就是我们所有人现在对一个好的 Web 应用程序的期望。

SPA 有两个独立的组件:浏览器端的 Javascript 应用程序,带有 Angular 或 React.js 之类的框架;服务器端的应用程序或服务,可以用许多框架和语言编写:Java、C#、PHP、Javascript……甚至 Python。

Dash 已经做了一部分。事实上,Dash 正在使用领先的浏览器端框架 React.js,并且在服务器端基于 Flask 和 Python。但是如上所述,你可能会达到一些极限。

除了通过 Dash 的转换,Plotly 和 Bokeh 还有另一个优势:它们在 Javascript 中也可以作为 Plotly JS (和一个 React.js 包装器包装器⁶), Bokeh JS 。事实上,Python 版本的 Plotly 是 Javascript 的包装器。这意味着给定 Python 中基于 Plotly、Dash 或 Bokeh 的一些绘图或仪表板,大多数概念和图表属性可以在等效的 Javascript 实现中重用。

结论

在这篇文章中,我们已经为数据可视化仪表板铺平了道路,从笔记本中的实验,一直到生产。我们已经看到,传统的绘图库 Matplotlib 仍然具有强大的功能,并且通常是 NetworkX 和 Pandas Dataframe 等专用库的默认后端。但 Matplolib 在集成和交互性等方面也有所落后。学习另一个框架可能是一个很好的投资,会帮助你走向生产。

提出了两种可选的框架:Plotly 和 Bokeh。两者都带来了价值,因为它们比 Matplotlib 更现代。在将仪表板投入生产时,它们都有一个领先的优势:它们基于 Javascript 绘图框架,并且大部分绘图 Python 代码可以直接翻译成 Javascript 等价物。

在走向生产的道路上,Plotly 还有另一个优势:它与 Dash 集成,Dash 是一个框架,用于在坚持使用 Python 的同时将简单的仪表板开发为单页应用程序。所需的 Javascript,包括 React 组件,以及服务器 API 都由 Dash 平滑生成。

我们还看到,作为一名数据科学家或数据可视化设计者,您应该预见诸如交互性之类的需求,以及它们可能导致开发 API 来提供数据的含义。

在“ Plotly Dash 或 React.js + Plotly.js ”中,并排比较显示了将 Dash 应用程序移植到 React.js 中的 Javascript 应用程序所需的内容,其中 Plotly.js 用于 dataviz,并由 Python 中的 Web API 提供服务。

参考

你是哪个机器学习模型?

原文:https://towardsdatascience.com/which-machine-learning-model-are-you-7ac635101d3b?source=collection_archive---------24-----------------------

对一些经典模型如何工作的轻松、诙谐、非科学的描述

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

也许你已经(违背了你更好的判断)在网上做了一个测试,关于你最喜欢的电视节目角色中哪一个像根据你的早餐习惯你看起来有多大,或者我个人最喜欢的你是哪种类型的鸡块。这些测验可能很有趣,但可能会让你觉得自己不是一个严肃的科学专业人士。好吧。这里有一个适合数据科学学习者的有趣的中间物:一个 ML 模型类型的目录,我将其拟人化并描述为娱乐的个性类型,这在理想情况下也可以帮助您理解每种类型的优缺点。抱歉,我是说优势和需要改进的地方。

你可能是线性回归,如果…

你有一种经典的风格(也许 BuzzFeed 说,如果你是一种字体,你就会是 Times New Roman)。你是那种老师喜欢用来做榜样的人,你可能会为此感到自豪。每当工作中的人问你问题时,你总是擅长给出详细且易于理解的答案,但有时你并不正确。你会发现人们通常很善于读懂你,并弄清楚你是如何工作的——你并不复杂,但你的简单中也有美。

不幸的是,人们可能会虐待你,不给你应得的时间和关注。而你,就你而言,倾向于对别人做很多假设。

如果…你们可能是 K 个最近的邻居

你是一个自我诊断的人。你喜欢联系他人以及牵线搭桥,当你把一个新人介绍到你的社交团体中,而他们正好融入其中时,你会很开心。你在这方面很棒,但是如果你不小心的话,平衡你所有不同的社交圈子会变得很麻烦。你的另一个优势是建立和平——如果有冲突,你会采取民主的方式,并且允许每个人投票决定团队应该做什么。

有时候,你取悦他人的倾向会让你瘫痪:不断计算和挣扎以达成一个好的决定。此外,你讨厌承认这一点,但你的一些朋友会形容你懒惰。

你可能是一个随机森林,如果…

你被选为返校节国王/王后,你是一个高成就者,并且/或者你为自己总是正确的而自豪。各种各样的人都喜欢你,你经常是聚会上的焦点。人们总是钦佩你的一点是你的灵活性——你可以迅速适应几乎任何情况,甚至在艰难的环境中表现出色。你也倾向于盖过你的弟弟妹妹

有时你的朋友抱怨他们不能完全理解你,但是在亲密的关系中,你在很大程度上能够解释你自己。然而,你高度复杂的天性迫使你有时会回避他人,并且花很多时间给自己充电、计划和做出正确的决定。

你可能是 K 意思是如果…

有时候你的生活有点混乱。你快速地从一个任务转移到另一个任务。由于你的速度,你更喜欢工作或家庭中的请求以简单易懂、标准化的格式向你提出,你可以轻松地接受。像你的好友 K 最近的邻居一样,你也喜欢能够联系朋友并将他们放在合适的社交团体中。然而,你在这方面甚至比他更好,因为你通常需要更少的信息,你可能会得到更好的结果。你的终极优势:能够在混乱中创造秩序。

你最大的弱点:与非常复杂的人打交道

总之…

我写这篇文章的目的是得到这样一个问题:“如果你是一个机器学习模型,你会是哪一个?”进行趋势分析,并最终将其列入众多顶级数据科学面试问题列表之一。此外,如果你能从中学到哪怕一点有用的东西,那也是非常棒的。

如果你认真地评论一下你认为自己低于哪个模特,我会很开心的。

你戴的是哪个面具?基于张量流和树莓 Pi 的人脸类型检测

原文:https://towardsdatascience.com/which-mask-are-you-wearing-face-mask-type-detection-with-tensorflow-and-raspberry-pi-1c7004641f1?source=collection_archive---------23-----------------------

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

使用右下角显示的 Raspberry Pi 4 进行实时人脸检测。(图片由作者提供)

我如何使用 TensorFlow 和 Raspberry Pi 构建一个实时面罩类型检测器来判断一个人是否戴着面罩以及他们戴的是什么类型的面罩

我使用的代码和 Google Colab 笔记本在 GitHub 上有

动机

强制戴口罩的规定在世界各地的公共场合变得越来越普遍。越来越多的科学证据支持戴口罩对减少病毒传播的有效性[ 23 ]。然而,我们也看到了一些对口罩的反弹,给执行规则的人带来了危险。在美国的一些地方,他们经常是商店的雇员,和其他人一样容易受到伤害。那么我们能让 AI 派上用场吗?

这激发了这项工作,以开发一个深度学习模型,该模型可以检测一个人是否戴着面罩,以及这个人戴着什么类型的面罩。口罩的类型与口罩的有效性有关[ 4 ]。该模型有可能被部署在当地超市或学校建筑中,以控制自动门,该自动门只对戴口罩的人开放。

当我完成 Coursera 上的深度学习专业时,我认为这是一个获得一些深度学习项目实践经验的绝佳机会,人脸面具检测是一个非常相关的话题。这篇文章主要关注从数据收集到建模训练(使用 TensorFlow 对象检测 API 和 Google Colab)以及在移动设备上部署(一个 Raspberry Pi 4)的开发流程。这不是一个循序渐进的教程,但我可以给你指出有用的资源,并提供一些设计自己的项目的技巧。

数据收集

这是一个重要但经常被忽视的步骤。俗话说“垃圾进,垃圾出”,用于训练的数据应该与目标具有相似的分布,即网络摄像头捕捉到的真实生活中带面具和不带面具的人脸。来自视频源的图像通常受相机质量和不同光线设置的影响。因此,我们的数据集不仅在不同性别、年龄组、种族、戴眼镜和不戴眼镜的人脸方面,而且在图像背景方面都应该是多样化的。

我决定用自制布套、外科口罩、n95 口罩和无口罩 4 个类(口罩类型)来训练模型。相应的标签有:

  • 自制的
  • 外科的
  • n95
  • 空的

这些图片是从 Google images 和 Upslash 上收集的。我发现批量下载图片的 chrome 插件 Fatkun 非常有用。但是,应该仔细选择图像,以确保数据集的质量和多样性。对于多少张图片才算足够,没有很好答案。对于一个小模型,我试着为每个类保存大约 200 张图片,它们应该代表模型可能遇到的子类。示例如下所示:

  • 自制的

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

自制面具,包括布面具或覆盖物。请注意,有些口罩覆盖整个颈部。(图片来自 Upslash。从左至右依次为莎朗·麦卡琴来源洛根·韦弗来源札克血管来源

  • 外科的

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

不同颜色的外科口罩。(图片来自 Upslash。从左至右依次为 H 肖来源engin akyurt来源朱里安万来源

  • n95

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

不同形状和颜色的 N95 口罩。肖像和侧面都包括在内。(图片来自 Upslash。从左至右依次为汉德罗沙曼来源Hiep Duong来源阿什坎·弗鲁扎尼来源

  • 空的

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

不同性别,不同年龄段,不同种族,不同背景的裸照。(图片来自 Upslash。从左至右由大卫托德麦卡蒂来源约瑟夫·冈萨雷斯来源蒂姆·莫斯霍尔德来源

每节课我分别收集了 247,197,184,255 张图片,总共用了~5 个小时,期间我见过那么多带面具的脸。不幸的是,戴着外科口罩和 n95 口罩的人的照片很难找到,尤其是在 3 月(疫情早期),我在搜索他们的时候。这些图像大多来自东亚国家或卫生工作者的库存照片。

建模培训

我用我的 Windows 10 笔记本电脑进行了数据预处理、测试,并将模型转换为 TensorFlow lite 版本。对于模型训练,我用的是 Google Colab 配合 Google 提供的免费 GPU。

使用 TensorFlow 对象检测 API 训练对象检测模型可分为以下主要步骤:

  1. 设置 TensorFlow 环境和工作空间

这一步可能很棘手,因为对象检测 API 还不可用于最新的 TensorFlow 版本 2.x,因此需要 TensorFlow 1.x。如果您想在本地 PC 上利用 CUDA 内核进行加速,可以使用 TensorFlow 的 GPU 版本。我发现这两个教程非常有用:

[## TensorFlow 对象检测 API 教程- TensorFlow 对象检测 API 教程文档

重要说明:本教程适用于 TensorFlow 1.14,它(在撰写本教程时)是最新的…

tensor flow-object-detection-API-tutorial . readthedocs . io](https://tensorflow-object-detection-api-tutorial.readthedocs.io/en/latest/index.html) [## Python 编程教程

大家好,欢迎收看关于 TensorFlow 对象检测 API 的迷你系列和介绍。该 API 可用于…

pythonprogramming.net](https://pythonprogramming.net/introduction-use-tensorflow-object-detection-api-tutorial/)

Stackoverflow 上的一些搜索可以修复 bug,帮助你让 TensorFlow 运行起来。在 conda 环境中工作可以节省很多管理混乱的依赖关系的工作。另外,在安装特定版本的 Python、TensorFlow 或 CUDA 之前,不要忘记检查配置兼容性

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

TensorFlow GPU、Python 和 CUDA 的兼容配置(图片来自 TensorFlow )

我的笔记本电脑和 Google Drive 上的工作区都有以下目录结构:

TensorFlow
├─ models
│   ├─ official
│   ├─ research
│   ├─ samples
│   └─ tutorials
└─ workspace
    ├─ preprocessing
    ├─ annotations
    ├─ images
    │   ├─ test
    │   └─ train
    ├─ pre-trained-model
    ├─ training
    └─ trained-inference-graphs
       ├─ output_inference_graph_mobile.pb
       └─ TFLite_model

2.预处理用于训练的图像

首先,图像需要标注标签。你可能会注意到,上面的一些图像有不止一个人戴着口罩,一些图像有复杂的背景。在这些面具周围放置锚框有助于模型通过关注框内的局部区域并提取特定特征来更快地学习。这个过程相当乏味,我花了大约 4 个小时来标记大约 800 张图片,并且我使用了一个叫做 LabelImg 的 Python 包。本质上,我所做的是在人们的面具周围画出方框(如果他们没有戴面具,在他们眼睛下方和脖子上方的区域),并将每个方框与一个标签相关联。

接下来,数据集以 9 比 1 的比例分成训练集和测试集。我没有设置验证集,因为这只是一个原型模型,但在机器学习中这样做总是一个好的做法。

3.创建标注图和张量流记录

TensorFlow 读入保存在label_map.pbtxt中的标签映射,这是类标签到整数值的映射。在这种情况下,该文件类似于:

item {
    id: 1
    name: 'homemade'
}item {
    id: 2
    name: 'surgical'
}item {
    id: 3
    name: 'n95'
}item {
    id: 4
    name: 'bare'
}

注释需要转换为 TFRecord 文件,如test.recordtrain.record

4.选择模型并开始训练

深度学习模型有数百万个参数,从头开始训练它们通常需要大量数据,而我们这里没有这些数据。一种有用的技术是转移学习,它采用在其他图像集上训练的预训练模型,并在新的任务中重用它(这里显示的一个例子)。大多数参数是固定的,而顶层中的一些参数针对新任务进行了微调。

因为我想在计算能力有限的移动设备上使用该模型,所以速度是重中之重。在 TensorFlow 的检测模型 zoo 的表格中可以找到一组预先训练好的模型。我选择了一个轻量级的型号,ssd_mobilenet_v2_coco [ 5 ],来平衡速度和精度之间的权衡。

我试着在我的笔记本电脑和谷歌实验室上训练这个模型。如果你没有超快的 GPU,我肯定会推荐你使用 Colab。在我的笔记本电脑上用 GeForce MX250 GPU 训练这样一个小模型大约 20K 步需要大约 10 个小时,在 Colab 上需要大约 2 个小时。速度提高了 5 倍,同时我可以在笔记本电脑上做其他事情。用于培训的 Colab 笔记本可以在这个 GitHub 库上找到。

关于 TensorFlow 的一个很酷的事情是,你可以在训练期间使用 TensorBoard 监控指标(损失和准确性)。正如你所看到的,损失逐渐减少并趋于平稳,我决定不再等待,并在 20K 步后停止训练。另一个很酷的特点是你可以随时从你停止的地方继续训练。

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

TensorBoard 示例。(图片由作者提供)

5.导出模型并测试它

该模型被导出到冻结的推理图中。可以通过运行model_test_webcam.py来测试。

最初,我没有包括无面具(裸露)脸的类,因为我认为模型不会在脸上画锚框,这表明这个人没有戴面具。结果证明我错了。它没有学习裸露面部的任何特征,并将一张脸识别为自制的面具。因此,我用一个新的类和裸面数据集重新训练了模型。我从这个过程中学到的是数据集设计的重要性,模型只能学习你让它学习的东西。最初快速建立模型,然后迭代也是明智的。

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

没有“裸”类的初始模型的分类结果。(图片由作者提供)

我在来自互联网(不在训练/测试集中)和一个朋友的更多图片上验证了新模型。现在它可以识别裸露的面孔了!

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

来自 Upslash 的用于模型验证的图像。(在最上面一行,从左至右,图片由娜塔莉亚·巴罗斯来源 按下特征来源杰克逊煨来源。在最下面一行,从左到右,图片由 H Shawsource 内森·杜姆劳出处布莱恩·万根海姆来源

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

和一个朋友在弱光下测试。所有口罩都贴上了正确的标签!(图片由作者提供)

6.将模型导出到 Raspberry Pi

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

Raspberry Pi 4 和一个摄像头模块(图片由 Raspberrypi 拍摄,来源: pi 4摄像头模块 v2

Raspberry Pi 是一款信用卡大小的迷你电脑,价格非常实惠(第四代售价约 35 美元)。有了 TensorFlow 的支持,它是部署模型的完美移动设备。除了树莓派,相机模块(约 30 美元)需要单独购买。

出于计算速度和隐私的原因, TensorFlow Lite 模型需要用于移动设备,如 Raspberry Pi。本教程介绍了如何在 Window PC 上将经过训练的张量流推理图转换为精简模型,并在 Raspberry Pi 上运行:

[## edjee electronics/tensor flow-Lite-Android-and-Raspberry-Pi 上的对象检测

本指南展示了如何训练 TensorFlow Lite 对象检测模型,并在 Android、Raspberry Pi 和

github.com](https://github.com/EdjeElectronics/TensorFlow-Lite-Object-Detection-on-Android-and-Raspberry-Pi)

最后,是玩模型的时候了!

最后的结果显示在开始的 GIF 和下面的图片中。整体模型性能似乎很好。然而,即使我选择了轻型 SSD Mobilenet,每秒 2.5 帧(FPS)也不算太差,但也不是很快。通过选择固态硬盘或量化模型,可以进一步加速。

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

树莓派相机的测试图像。(图片由作者提供)

结论和要点

在我自己建立了一个对象检测模型之后,我发现构建一个深度学习项目绝对不仅仅是参数调整和设计神经网络架构。

最乏味和耗时的部分是收集和预处理数据。设置 TensorFlow 环境也很棘手,随着 TensorFlow 变得更加自动化,这一问题有望在不久的将来得到解决。主要要点是:

  • 现实生活中的数据是复杂的。我们应该选择每个班级的代表形象
  • 当我们有一个小的数据集时,迁移学习是有用的
  • 我们应该坚持快速原型化和迭代改进模型的指导方针
  • 最后,毫无疑问,在公共场所戴口罩,不管是哪种口罩

感谢阅读,保持健康!

参考

[1] 沙佩尔,B. (2020 年 5 月 28 日)。“不戴口罩——禁止入内,”科莫说,他允许商家坚持戴口罩。NPR

[2] Prather,A. K .等人(2020 年 5 月 27 日)。减少新型冠状病毒的传播。理科

[3]霍华德,j;黄;李;Tufekci,z;兹迪马尔诉;范德韦斯特休伊曾;冯·代尔夫特;价格,A 弗里德曼;唐;唐五世;沃森;Bax,C.E 谢赫河;Questier,f;埃尔南德斯博士;褚来福;拉米雷斯;《反对新冠肺炎的面具:证据回顾》。预印本 2020 ,202004 02 03(doi:10.20944/Preprints 202004.0203 . v1)。

[4] 帕克-波普等人(2020 年 4 月 17 日)。冠状病毒:你应该戴哪种口罩?。《纽约时报》

[5] 刘,w,安盖洛夫,d,尔汉,d,塞格迪,c,里德,s,傅,C. Y,&伯格,A. C. SSD:单次多盒探测器。arXiv 2016。 arXiv 预印本 arXiv:1512.02325

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值