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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

用 Python 在云中预制人工智能

原文:https://towardsdatascience.com/premade-ai-in-the-cloud-with-python-6e02d87054b6?source=collection_archive---------18-----------------------

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

Photo by Eberhard Großgasteiger on Unsplash

使用 Azure 和 Colab 笔记本创建一个具有视觉、听觉和语音的简单机器人

这里有一队带着他们自己的思想漂浮在互联网上,试图控制风。他们一直在非常积极地向世界推出各种服务,并从每一个可能的来源吸收数据。在这个巨大的服务泡沫中,越来越多的公司和应用程序依赖预制的人工智能资源来提取见解,预测结果,并从未探索的信息中获得价值。如果您想知道如何试用它们,我想给你一个非正式的概述,告诉你通过向这些服务发送不同类型的数据可以得到什么。简而言之,我们将把图像、文本和音频文件发送到高高的云端,并探索我们得到的回报。

虽然这种使用人工智能的方式不能让你直接、完全控制正在发生的事情(就像你使用机器学习框架一样),但这是一种快速的方法,让你可以尝试几种模型,并在你的应用程序中使用它们。这也是了解已经存在的东西的好方法。

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

Photo by Franck V. on Unsplash

一般来说,在我们可以使用任何种类的云服务之前,我们必须首先:

  • 向特定的云提供商订购
  • 创建一个资源:注册我们将要使用的特定服务
  • **检索凭证:**到授权我们的应用程序访问服务。

虽然有许多云提供商可能能够满足您的需求,但我们将关注微软的Azure Cloud**。**如果你不知道从哪里开始,有大量的选项和教程可能会让你感到困惑,所以在这篇文章的第一部分,我们将从头开始,了解我们需要什么来使用以下服务:

所有资源来自 Azure 的认知服务平台,这是一个很好的服务集合,包含视觉、语音、语言、网络搜索和决策领域的用例。用他们的话说:

Azure Cognitive Services 的目标是帮助开发人员创建可以看、听、说、理解甚至开始推理的应用程序。

我们将使用 Colab 笔记本将它们付诸实施:我们将在 Azure 中设置我们需要的一切,实现调用这些服务的代码并探索结果。为了让它更有趣,我们还将利用摄像头、麦克风和扬声器来说话,看到和听到来自云的响应!

设置

你只需要订阅 Azure 就可以让笔记本焕发生机。之后,你应该可以毫无困难地运行本文中的例子了。

创建订阅

按照此链接创建 Azure 订阅。(如果你目前就读于一所大学,使用此链接)。如果这是你的第一个账户,你应该有一些试用资金,但要确保你在使用任何东西之前总是检查价格。对于本教程,我们将只使用免费服务,但这仍然是一件好事!

在您创建帐户后,您将可以访问 门户 。在这里,您可以管理有关您的订阅的一切,并配置大量的内容。

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

The Azure Portal

门户是一个非常有趣的地方,整个公司都使用这个大的工具包进行管理。为了不在森林里迷路,我在笔记本中实现了设置这篇文章所需的所有代码。但是我将在这里花点时间解释一下基本原理,并给你一个自己如何做的想法。

但是如果你已经知道如何创建组和资源,请完全跳过下面的“在 Azure 中设置”部分,直接进入笔记本

在 Azure 中设置

这些都是在笔记本中自动完成的,但是如果你想知道如何自己做,请通读一遍。

创建资源组

在创建特定资源(如计算机视觉或文本翻译)之前,您需要创建一个 group 来保存多个资源。换句话说,我们创建的每个资源必须属于一个组。这允许您将所有这些作为一个实体来管理,并更容易地跟踪事情。

一般来说,在云中完成工作有两种主要方式:你可以使用云提供商的图形用户界面(GUI )(例如 Azure 的门户网站),或者在命令行界面(CLI)中键入代码行。为了说明这一点,让我们看看如何以两种方式创建资源组:

  • 要使用门户创建资源组:

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

Making a resource group

在左侧菜单中,转到“资源组”,单击“添加”并在“资源组”和“区域”字段中填写名称和位置。

注意:在整个教程中,我们将使用MyGroup作为我们的资源组名称,西欧作为我们的地区。位置参数指定您希望数据中心/服务位于哪个区域。如果你不在西欧,除了一点延迟,对你来说应该不会有太大变化。虽然更改到另一个地区可能很简单,但是在使用资源时,参数会一遍又一遍地出现**(通常以不同的名称出现),所以如果您自己设置,请使用MyGroupWestEurope来保持简单,并允许您稍后运行代码示例而无需更改。**

  • 为了实现完全相同的目的,并且在不使用门户中的 GUI 的情况下创建myGroup,我们也可以使用命令行界面。点击门户网站顶部菜单中的>_:

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

在弹出的窗口中输入:

az group create -l westeurope -n MyGroup

和前面一样,这将在位置westeurope中创建一个名为MyGroup的资源组。

点击门户中的>_图标,您看到的是他们为您提供的虚拟机的命令行。它真的很强大,并附带了非常方便的工具:它自己的 go、python 和其他语言的环境,docker、git 等。准备出发。但最重要的是,它附带了一个来自 Azure 的命令行工具[az](https://docs.microsoft.com/en-us/cli/azure/get-started-with-azure-cli?view=azure-cli-latest),它提供了一些选项,可以完成你在门户网站上看到的所有功能,甚至更多。这是我们在 笔记本 里面用来设置一切的工具。

az工具太多了,无法在这里一一介绍,但是您可以键入az并开始探索!

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

创建资源

现在让我们创建单独的资源,并将它们分配给我们创建的组MyGroup。和以前一样,我们可以使用 GUI 或 CLI。出于直觉;这是使用 GUI 的整个过程:

  • 在门户中创建资源的步骤:

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

Creating a resource

  • 在左侧菜单中,单击“创建资源”,搜索您想要的资源(如计算机视觉),并填写项目详细信息。
  • 在“位置”中,指定您希望数据中心/服务位于哪个地区。(我们将使用“西欧”)。
  • 每个资源的“定价层”定义了其成本。对于每个资源和层级,将有不同的价格和条件。对于本教程,我们总是选择自由层F0以避免任何费用。
  • 最后,我们将我们的资源分配给一个现有的资源组(MyGroup)。

在资源被创建之后,我们需要检索它的密钥以便能够使用它*。密钥是授权我们的应用程序使用服务的凭证。这是您在门户中检索密钥的方式:***

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

Finding the authentication key for some resource in the portal

  • 在左侧菜单中,转到“所有资源”并单击您的目标资源顶部。在“资源管理”下,转到“密钥”并记下凭据。

简单解释一下,但这就是您在门户中手动创建资源和检索密钥的方式。我希望这能给你一个如何做的直觉。但是对于我们需要的所有资源来说,遵循这个过程需要一段时间。所以为了减轻的痛苦,防止读者感到厌烦。我制作了一个代码片段,使用 CLI 中的az工具一次性设置好一切。该代码片段将为以下资源创建和检索密钥,(指定 free tier F0):

进入门户中的命令行(或在您的机器中安装[az](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest)):

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

然后复制、粘贴并运行以下代码片段:

To be pasted in the command line.

  • 我们用我们想要的参数的具体名称创建一个数组resources
  • 我们迭代resources并应用命令az cognitive services account create来单独创建每个服务。(在这里,我们指定位置WestEurope、空闲层F0和我们创建的资源组MyGroup)。
  • 我们再次在resources上循环,并应用命令[az cognitiveservices account keys](https://docs.microsoft.com/de-de/cli/azure/cognitiveservices/account/keys?view=azure-cli-latest)来检索每个资源的键,并将它们附加到名为keys.py的文件中。
  • 当它运行完毕后。keys.py应包含带有资源及其凭证的标准字典:
*# sample keys.py with fake credentialssubscriptions = {
  'TextAnalytics': 'ec96608413easdfe4ad681',
  'LUIS': '5d77e2d0eeef4bef8basd9985',
  'Face': '78987cff4316462sdfa8af',
  'SpeechServices': 'f1692bb6desae84d84af40',
  'ComputerVision': 'a28c6ee267884sdff889be3'
  }*

我们需要给我们的笔记本赋予生命。您可以通过键入以下命令来验证和查看我们做了什么:

*az resource list* 

好吧!如果您已经做到了,我将奖励您一组代码片段,您可以调用这些代码片段并向这些资源发送内容。

获取认知服务

既然我们已经完成了枯燥的工作,我们就准备利用这些资源,看看它们能做些什么。创建资源让我们可以使用它们各自的 REST-API。我们可以用刚刚做的东西做很多事情。

Source

简而言之,为了访问这些服务,我们将向特定的 URL 发送带有特定参数和我们内容的请求,在服务器上触发一个动作,然后得到一个响应。为了知道如何组织我们将要使用的每个服务的请求,我们需要参考 API 文档(在这里你可以真正体会到 API 的用处)。**

每个 API 都有一组现成可用的函数。例如,通过计算机视觉 API,我们可以执行 OCR(光学字符识别)并从图像中提取文本,用文字描述图像,检测物体、地标等等。

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

A glimpse into the Computer Vision API.

文档中查找我们可以访问的所有 API 可能会让人感到不知所措:**

所以让我们来看一个例子,给你一个直觉,让你知道如何开始一件事。假设您正在查找计算机视觉 API 的“分析图像”方法。

  • 转到 API docs ,选择您想要的方法(“分析图像”)并向下滚动:O!
  • 您会看到一个 URL,其中包含发送请求的地址和参数。
  • 请求的报头和正文由什么组成。
  • 来自服务器的示例响应。
  • 错误响应和解释。
  • 以及包括 Python 在内的多种语言的代码样本*。您只需要替换资源的键和要发送的数据。一旦你看到它被执行,这将变得清晰。***

发送请求

来自不同认知服务的 API 彼此非常相似!如果你仔细阅读代码样本,你会注意到它们都共享同一个主干,,但只是指向不同的 URL。这就是我们请求的基本框架:**

简而言之,我们定义headersbodyparams(请求参数),将它们发送到某个 URL 并接收响应。

  • headers中,我们指定我们想要发送的数据的类型和访问 API 的资源键*。*****
  • body中,我们包含(或指向)要发送给的数据。主体本身可以有多种形式,取决于 API。****
  • params中,我们指定(通常是可选的)参数来更具体地告诉 API 我们想要什么。
  • 然后,我们将这些变量作为标准请求发送给特定的端点,例如:westeurope.api.cognitive.microsoft.com/computervision/v2.0/describe

笔记本中,我们利用这些公共元素来实现两个实用函数:get_headers_bodysend_request,以帮助我们更快地构造请求并避免重复太多代码。

现在让我们把手弄脏吧! 跳进 Colab 笔记本 。我在这里添加了额外的代码take_pictureshow_picturerecord_audioplay_audio等等。这些将是我们笔记本中的效应器和致动器,并允许我们与云进行交互。

我们不会涵盖每个 API 的所有可能,而只是简单地看几个方法以及如何调用它们。

对于每个 API,我们将定义几个函数,并查看如何使用它们的实际示例。来自 API 的响应通常包含大量信息!我们将解析这些响应并只返回其中的一小部分(我们不会查看完整的响应)。**

计算机视觉 API

处理图像并返回各种信息。

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

Photo by Arseny Togulev on Unsplash

让我们定义一组返回图像视觉信息的函数。这些函数将根据我们想要分析的图像组成我们的请求,并将它们发送到计算机视觉 API 的特定 URL(端点)。

在这里,我们将利用函数get_headers_bodysend_request来加快速度(查看这些函数的定义和笔记本上的更多信息)。

  • [describe](https://westus.dev.cognitive.microsoft.com/docs/services/5adf991815e1060e6355ad44/operations/56f91f2e778daf14a499e1fe):返回图像的视觉描述。

让我们来看看它的实际应用:

*describe([source](https://images.unsplash.com/photo-1508175800969-525c72a047dd?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=800&q=60), number_of_descriptions=3)*

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

Source: URL of the image given as an argument.

*A yellow toy car 
A close up of a toy car 
A yellow and black toy car*

还不错!

  • classify:给图像分配一个类别,并对其进行标记。
*classify([source](https://images.unsplash.com/photo-1541673504494-8bcc1a340180?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=800&q=60))*

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

Source

*Categories in Image: outdoor_stonerock Tags found in the image:['outdoor', 'nature', 'mountain', 'man', 'water', 'waterfall', 'riding', 'going', 'hill', 'snow', 'covered', 'skiing', 'forest', 'large', 'lake', 'traveling', 'river', 'slope', 'standing', 'white', 'wave']*

[read](https://westus.dev.cognitive.microsoft.com/docs/services/5adf991815e1060e6355ad44/operations/56f91f2e778daf14a499e1fc):执行光学字符识别并提取图像中的文本。绘制文本所在的区域并显示结果。

除了检索响应和打印提取的文本,在read 内部,我们使用额外的 OCR 信息来绘制和标记图像中检测到的文本区域的边界框。让我们来看看它的实际应用:**

*text = read([source](https://www.maa.org/sites/default/files/images/upload_library/46/Swetz_2012_Math_Treasures/ColumbiaU/1502210097.png))
for line in text:
    print(line)*

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

*ANALYSIS 
Per Quantitatum 
SERIES, FLUXIONES5 
DIFFERENTIAS. 
c UM 
Enumeratione Linearum 
TERTII ORDINIS. 
LONDI,VIS 
Ex Offcina M.DCC.XL*

[see](https://westus.dev.cognitive.microsoft.com/docs/services/5adf991815e1060e6355ad44/operations/5e0cdeda77a84fcd9a6d3d0a):返回图像中识别的对象,并在图像中显示它们的边界框。

*see([source](https://images.unsplash.com/photo-1511317559916-56d5ddb62563?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=800&q=60))*

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

*In the image of size 800 by 1181 pixels, 2 objects were detected 
person detected at region {'x': 354, 'y': 535, 'w': 106, 'h': 280} 
Toy detected at region {'x': 214, 'y': 887, 'w': 186, 'h': 207}*

Face API

检测、识别和分析图像中的人脸。

为了简洁起见,我们将只看一个 API 方法:

[detect_face](https://westus.dev.cognitive.microsoft.com/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f30395236):显示图像中识别的人脸的包围盒和一些相关信息(年龄、性别和情感)。

seeread中,我们使用一个内部函数draw_show_boxes在检测到的人脸周围绘制边界框。这是结果:

*detect_face([source](https://static.artfido.com/2013/09/Danielle.jpg))*

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

Source

酷吧?

这些都是我们将尝试的关于图像的功能。但是,让我们通过使用功能take_picture用我们的设备拍摄一张照片来进一步试验它们(参见笔记本)。

捕捉并发送图片

我们来拍张照,看看云是怎么看的。在我们所有的函数中,我们可以指定参数localfile=True来允许我们以二进制图像的形式发送本地文件。

*# turns on the camera and shows button to take a picture
img = take_picture('photo.jpg')*

现在让我们通过应用describeclassify函数来看看云对它的“想法”:

*print(describe(img, localfile=True, number_of_descriptions=3))>> A man sitting in a dark room 
>> A man in a dark room 
>> A man standing in a dark roomprint(classify(img, localfile=True))>> Categories in Image:   dark_fire 
>> Tags found in the image    ['person', 'indoor', 'man', 'dark', 'sitting', 'looking', 'lit', 'laptop', 'front', 'room', 'light', 'standing', 'dog', 'watching', 'computer', 'wearing', 'mirror', 'black', 'living', 'night', 'screen', 'table', 'door', 'holding', 'television', 'red', 'cat', 'phone', 'white']*

文本分析

用于为情感分析、关键短语提取和语言检测等任务分析非结构化文本

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

Photo by Patrick Tomasso on Unsplash

  • detect_language:返回为每个给定字符串检测到的语言。
*detect_language('Was soll das?', 'No tengo ni idea', "Don't look at me!", 'ごめんなさい', 'Sacré bleu!')>> ['German', 'Spanish', 'English', 'Japanese', 'French']*

key_phrases:返回每个给定字符串的关键字列表(重要的、相关的文本点)。如果没有找到,则返回一个空列表。

*keys = key_phrases('I just spoke with the supreme leader of the galactic federation', 'I was dismissed', 'But I managed to steal the key', 'It was in his coat')for key in keys:
    print(key)>> ['supreme leader', 'galactic federation'] 
>> [] 
>> ['key'] 
>> ['coat']*

check_sentiment:对给定的字符串赋予积极、消极或中性的情感。

*print(check_sentiment('Not bad', "Not good", 'Good to know', 'Not bad to know', "I didn't eat the hot dog", 'Kill all the aliens'))>> ['positive', 'negative', 'positive', 'positive', 'negative', 'negative']*

find_entities:返回一个已识别的实体列表,分配给一个类别。如果可能的话,还有一个指向该实体的维基百科链接。

*find_entities('Lisa attended the lecture of Richard Feynmann at Cornell')>> [['Entity: Lisa, Type: Person', 
     'Entity: Richard Feynman, Type: Person,
       Link:[https://en.wikipedia.org/wiki/Richard_Feynman](https://en.wikipedia.org/wiki/Richard_Feynman)',   
     'Entity: Cornell University, Type: Organization, 
       Link [https://en.wikipedia.org/wiki/Cornell_University](https://en.wikipedia.org/wiki/Cornell_University)']]*

OCR +文本分析

让我们看看如何将一些东西组合在一起。在图像上应用read可以有效地为您生成文本数据。因此,它是应用我们的文本分析的完美匹配。让我们创建一个report函数,它提取单个文本区域,分析它们,并用我们的结果创建一个报告:

*report([source](https://i.pinimg.com/originals/5d/0c/90/5d0c90add4024dae1020e4e7fb545f7e.jpg))*

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

Source of image analyzed

*# Report ## Region 1 
> "o. 4230..." 
- Language: English 
- Sentiment: positive 
- Entities:  
    - 4230, Type: Quantity,  
- Keys: ## Region 2 
> "WASHINGTON, SATURDAY, APRIL 14, 1866..." 
- Language: English 
- Sentiment: positive 
- Entities:  
    - WASHINGTON, Type: Location,   
    - SATURDAY, APRIL 14, 1866, Type: DateTime,   
    - April 14, Type: Other, Wiki [Link]([https://en.wikipedia.org/wiki/April_14](https://en.wikipedia.org/wiki/April_14)) 
- Keys:  
    - WASHINGTON ## Region 3 
> "PRICE TEN CENTS..." 
- Language: English 
- Sentiment: positive
- Entities:  
    - Tencent, Type: Organization, Wiki [Link]([https://en.wikipedia.org/wiki/Tencent](https://en.wikipedia.org/wiki/Tencent))  
    - TEN CENTS, Type: Quantity,  
- Keys:  
    - PRICE  
    - CENTS...*

语音服务

将音频转换为文本和文本到语音

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

Photo by David Laws on Unsplash

我们将使用语音服务将声音转换成文本,反之亦然。与record_audioplay_audio(在笔记本中定义)一起,我们有一种方法来听到和与我们的笔记本交谈。但是在使用语音服务之前,我们需要获得一个 10 分钟内有效的令牌(一个秘密字符串)。我们将使用如下所示的函数get_token来实现这一点:

我们将使用它来定义我们函数内部的请求的headers,并授权它们使用我们的语音服务资源。

speech_to_text:接收音频文件的文件路径,并将识别出的给定语言的语音转换成文本。支持大量的语言。

text_to_speech:反其道而行之,将给定的文本转换成语音(一个音频文件),带有近乎人类的声音。这将为我们的笔记本提供声音。

因为speech_to_text接收音频文件并返回单词,而text_to_speech接收单词并返回音频文件,所以我们可以这样做:

*# transform words to speech
audio = text_to_speech("Hi, I'm your virtual assistant")# transcribe speech back to words
words = speech_to_text(audio)print(words)
>> Hi I am your virtual assistant*

好酷!但这似乎完全没有意义。让我们做一些更有趣的事情。我们将使用record_audio记录我们的声音,使用speech_to_text将其转换为文字,对文字做一些事情,并大声说出结果。

让我们用check_sentiment来检验一下你所说的感觉:

*# speak into the mic
my_voice = record_audio('audio.wav')# transform it into words 
text = speech_to_text(my_voice)# analyze its feeling
sentiment = check_sentiment(text)[0]# convert analysis into speech
diagnosis = text_to_speech(sentiment)# hear the results
play_audio(diagnosis)*

让我们在函数中实现这个想法,使它更有用:

试试吧!

*motivational_bot()*

把你的声音转换成语音意味着你可以把你的声音作为你功能的输入。像这样的东西,你可以尝试很多。例如,你可以把它们翻译成一堆不同的语言(参见文本翻译 API ),在网上查找一些东西(参见 Bing 搜索)或者(超越 Azure)问一些复杂的问题来回答像 Wolfram Alpha 等引擎。

路易斯—语言理解

基于机器学习的服务,将自然语言理解构建到应用程序、机器人和物联网设备中。

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

Photo by Gustavo Centurion on Unsplash

让我们让我们的笔记本更加智能,让它能够理解使用 LUIS API 的语言中的某些意图。简而言之,我们将训练一个识别语言中某些意图的语言模型。

例如,假设我们有意图take_picture。在训练我们的模型后,如果我们的笔记本“听到”类似以下的句子:**

  • 拍照
  • 用相机拍个截图
  • 拍张照

它会知道我们的意图是take_picture。我们称这些短语为话语。并且是我们需要提供来教语言模型如何识别我们的意图——我们想要执行的任务或动作。****

通过使用不同的和非冗余的语句,以及添加额外的语言组件,如实体、角色和模式,您可以创建灵活和健壮的模型来满足您的需求。良好实现的语言模型(由适当的软件支持)使得回答引擎能够回答诸如“旧金山的天气如何?”,“从华沙到普拉格有多少公里?”,“太阳有多远?”等等。

在这篇文章中,我们将保持事情的简单性,并为少数意图分配 5 种表达方式。正如您可能会想到的,这些意图将与我们已经实现的一些功能相匹配。

激活路易斯

与我们见过的所有服务相比,LUIS 是一个复杂的工具,它有自己的“门户”,在那里您可以管理 LUIS 应用程序,并创建、培训、测试和迭代改进您的模型。但是在我们使用它之前,我们需要激活一个 LUIS 账户。一旦你做到了这一点:

  • 进入 LUIS dashboard,检索您帐户的创作密钥*,如下所示,并将其粘贴到笔记本中。***

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

*AuthoringKey = '36bd10b73b144a5ba9cb4126ksdfs82ad2'*

这对我来说是一个困惑的话题。但是您的 LUIS 帐户的创作密钥与我们制作的 LUIS 资源的密钥不同。但是你可以将 Azure 资源分配给 LUIS 应用程序(例如,在不同地区开放接入点),但是更多详细信息请参考此处。**

创建 LUIS 应用程序

LUIS 门户网站使创建、删除和改进您的 LUIS 模型变得非常容易。但是在这篇文章中,我们将使用 LUIS 编程 API 来使用authoring_key在笔记本中设置东西。

让我们从创建应用开始:

*app_id, luis_config = create_luis_app('Notebot' )*

在这个实现中,我们跟踪应用 ID(由服务器返回)和我们在app_idluis_config中指定的参数,作为以后使用的全局变量。

添加意图和话语

现在让我们定义一个函数来添加意图和一个函数来添加它们各自的话语*。***

  • [create_intent](https://westus.dev.cognitive.microsoft.com/docs/services/5890b47c39e2bb17b84a55ff/operations/5890b47c39e2bb052c5b9c0c):向 LUIS 应用程序添加一个意向。哪个应用程序由变量app_idluis_config指定。

  • [add_utterances](https://westus.dev.cognitive.microsoft.com/docs/services/5890b47c39e2bb17b84a55ff/operations/5890b47c39e2bb052c5b9c09) :向 LUIS 应用程序中的现有意图添加一批示例/话语。

有了这些函数,让我们在字典中定义我们的语言模型,如下所示,并将其应用于字典。这个阶段有很大的实验空间。

这本字典的关键字将是我们应用程序的意图。让我们遍历它们并创建它们:

*intents = intentions.keys()
for intent in intents:
    create_intent(intent)*

每个意图有 4 个例子/话语,现在让我们把它们添加到各自的意图中。

*for intent, utterances in intentions.items():
    add_utterances(intent=intent, utterances=utterances)*

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

Photo by Lenin Estrada on Unsplash

训练模型

现在让我们用我们用[train_luis_app](https://westus.dev.cognitive.microsoft.com/docs/services/5890b47c39e2bb17b84a55ff/operations/5890b47c39e2bb052c5b9c45)指定的信息来训练模型。

*train_luis_app(app_id, luis_config)*

发布应用程序

我们现在准备用[publish_app](https://westus.dev.cognitive.microsoft.com/docs/services/5890b47c39e2bb17b84a55ff/operations/5890b47c39e2bb052c5b9c3b)发布应用程序。

*publish_app(app_id)*

做一个预测

让我们通过预测我们的意图来看看我们的模型是否有用。注意 LUIS 有一个单独的 API 来进行预测,即 LUIS endpoint AP。

  • [understand](https://westus.dev.cognitive.microsoft.com/docs/services/5819c76f40a6350ce09de1ac/operations/5819c77140a63516d81aee78):使用给定文本预测意图
*understand('Can you give me some descriptions about what you are seeing?')# predicted intent is:
>> `describe`understand('Any homo sapiens in the picture?')>> `detect_faces`*

酷!现在我们的笔记本可以从简单的语言中大致理解我们的意图。但是必须自己输入文本似乎没什么帮助。笔记本应该能听到我们说的话,理解我们的意图。让我们写一个使用predictrecord_audio以及speech_to_text的函数hear来解决这个问题。

我们现在可以呼叫hear对着麦克风说话,将我们的讲话转换成文字,并使用我们的 LUIS 应用程序预测我们的意图。

*intent = hear()# see the prediction
print(intent)*

使用应用程序

让我们编写一个函数,基于预测或识别的意图触发一组动作,然后映射以执行一些代码。

简而言之:当预测到某种意图时,执行所发生的事情的功能。这里有大房间做实验。**

最后,让我们召唤 Notebot 来实现我们的愿望:

Source

**根据你说的话,“note bot”可以拍照并:

  • 大声说出描述
  • 显示任何检测到的对象
  • 显示任何检测到的面孔。
  • 应用 OCR 并大声读出结果。
*# summon your creation
Notebot()*

Notebot将根据您所说的运行一系列动作。

让我们总结一下当你调用它时会发生什么。开始时,您会听到一条问候语。之后,Notebot将应用hear并开始记录你说的任何话,你的讲话(感知器)将被转录成单词并发送到 LUIS 应用程序以预测你的意图。基于这一预测,将执行一组不同的动作。如果从您的讲话中没有识别出明确的意图,则意图“无”将被预测,并且Notebot将再次调用自身。

从上面看,Notebot最终充当了一个简单的基于反射的代理,它只是找到一个条件匹配当前情况的规则并执行它。(在这种情况下,如果你说这个别的*,那么Notebot会做什么)。***

在这一点上,你可能想用额外的概念升级你的代理人,例如增加感知的记忆。但是我将把这个任务留给勤奋的读者。

清理

这篇文章比我预想的要长得多。在我们结束之前,让我们清理一下东西。要清理我们在云中创建的一切:在命令行>_中运行以下命令,删除整个资源组(以及所有资源)和keys.py文件(包含您的凭证):

*az group delete --name MyGroup 
rm keys.py*

好吧,我希望这篇教程至少给了你一些在你的项目中实现的想法。

那都是我送的!谢谢你看完整个:)

准备机器学习面试——简介

原文:https://towardsdatascience.com/preparing-for-a-machine-learning-interview-introduction-586aff3f8c4e?source=collection_archive---------11-----------------------

机器学习面试的高层次概述。

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

Photo by rawpixel on Unsplash

在过去的几年里,机器学习已经成为主要技术进步的前沿和中心。这也导致了对具有 ML 专业知识的工程师的需求上升。正如整个深度学习领域正在发展一样,面试领域也在发展。几年前,了解如何设计卷积网络就足够了。然而,现在有各种各样的期望,从算法和数据结构到概率和统计等等。挑战不在于课程、教科书或博客不能满足每个主题,而在于有太多的课程、教科书或博客了。

我在这里的尝试是给出对机器学习/深度学习面试的不同方面的见解。希望这能给你一个好的开始来组织你的面试准备。

任何面试准备的关键是确定需要阅读/修改的关键部分,不要被大量可用的信息淹没。因此,在这篇文章之后,我会在每个访谈小节中提供详细的主题/链接。

ML/DL 面试结构。

在我们深入研究面试准备之前,重要的是要认识到,根据公司和受访者的背景,ML 工程师的角色可以有很多种。在下图中,我试图捕捉 ML/DL 访谈的不同方面。

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

Different layers of a machine learning / deep learning interview.

如上图所示,面试大致有四个部分。下面让我更详细地讨论一下这些部分。

机器学习

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

Photo by Paul Schafer on Unsplash

这是任何深度学习/机器学习岗位的核心。主要涵盖了标准的机器学习技术和一堆数学东西——主要是概率和统计,线性代数。如果你自己学会了深度学习(这是对你的褒奖),那么你需要在面试中复习这方面的知识。另外,它将有助于使你在深度学习位置上的生活更容易。

存在很多数学和机器学习技术(你看到凯文·墨菲或克里斯托弗·毕晓普的书的页数了吗)。我的建议是坚持阅读以下两本书来快速复习,并保留毕晓普或墨菲的书作为参考:

拉里·乏色曼的《统计学大全》:这是一本关于统计学的非常棒的书。乏色曼教授是统计学的教学大师,他总是抓住要点,言简意赅。每次通读这本书,我都觉得它是为工程师而不是数学家写的。【链接

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

Photo from: https://images.gr-assets.com/books/1347776274l/411722.jpg

Tom Mitchell 的《机器学习》:涵盖了我认为一个人需要为面试做准备的大多数人工智能主题。它简明扼要,有很好的关于决策树和贝叶斯学习的章节。【链接

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

Photo from https://booksbeka.com/image/cache/catalog/ANI/tom-500x500.jpg

深度学习

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

Photo by Ian Stauffer on Unsplash

面试堆栈的深度学习部分主要集中在发现你是否已经弄脏了你的手。这些问题往往围绕深度学习工程师每天面临的工程挑战。面试官试图判断你是否真的实现并训练了一个模型。例如,经常会遇到这样的问题:

退学需要称体重吗?

你用的退学典型值是多少?

如果将输入缩放到 softmax 层,会发生什么情况?

能解释一下反向传播算法吗?

深度学习的大部分面试知识可以从博客、YouTube 讲座和 MOOC 课程中收集。然而,挑战在于信息过载。我的计划是创建一个带有链接的主题列表,可以帮助你复习一些关键的挑战。我会在这个主题的后续文章中这样做。

如果您一直在积极地实现模型,那么我相信您可以跳过这一步,或者在最后优先考虑这一步。

软件

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

Photo by Chris Ried on Unsplash

几乎所有的深度学习岗位都会要求你精通数据结构和算法。根据你的资历,可能还有系统设计的问题。像其他事情一样,这些需要正确的准备工具和应该覆盖的正确范围。

如果申请的是研究岗位,软件编码可能会放宽。然而,你不应该指望这个折扣。通常,您需要通过一个电话屏幕,这将要求您对给定的问题进行编码。我不认为我能做得比已经在编码面试上写的和辩论的更好。我能提供的最好的是一个书籍和链接的列表,可以帮助你准备后续的文章。在那之前,一定要去 www.leetcode.com或 www.hackerrank.com看看。一般来说,公司倾向于灵活选择 ML 面试的语言。如果这是你选择的武器,你可以坚持使用 Python。也就是说,如果你在嵌入式领域寻找一个 ML 角色,你会想到 C/C++。

领域专业知识

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

Photo by Luca Bravo on Unsplash

面试过程中的领域专长部分旨在测试你对某个领域的热情和知识。如果你申请金融行业的机器学习职位,将会有与时间序列分析和/或金融方面相关的问题。另一个例子,如果你申请一个计算机视觉的角色,期待卷积网络和图像处理的问题。同样,如果你在面试一家机器人公司或一家自动驾驶汽车公司的规划轨道,你可能会遇到关于运动和路径规划的问题。此外,如果你以深度学习硬件加速器工程师的身份出现,询问你与量化、压缩和硬件架构相关的问题是公平的。

现在,如果你申请的是接近入门级的工作,或者招聘经理认为他可以让你的技能适应这份工作,那么衡量你在某个特定领域的经验水平可能就没有问题了。除了技术问题,可能还有衡量你选择这个重点领域的兴趣、激情和动机的问题。有时面试官也会问你最喜欢的建筑或最近的论文。所以一定要复习一些最近的论文。

结论

出现在 ML/DL 面试中可能会令人生畏,因为这个领域是如此的不稳定。更复杂的是,该领域覆盖了非常广泛的领域——概率和统计、机器学习、软件开发,当然还有深度学习。知道你追求什么样的角色是很重要的。不要羞于问你的招聘人员,在面试准备中你是否应该关注一些具体的事情。记住——如果你不问,答案总是否定的。

准备数据科学面试

原文:https://towardsdatascience.com/preparing-for-data-science-interviews-49500c51fec4?source=collection_archive---------27-----------------------

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

随着我们进入熨斗学校训练营的最后几周,我们都变得有点担心面试过程。在我之前的博客文章 “为 2020 年做准备——完美的愿景” 中,我与你分享了我们在课程早期应该采取的步骤。我陈述的 3 个主题是:

  1. 更新你的 LinkedIn 个人资料
  2. 找导师
  3. 建立您的投资组合

我想继续这些话题,并分享我在研究数据科学采访时发现的一些技巧。如果你在这个行业中找到了一位导师,在进入他们公司的面试之前,接触他/她看看面试过程会是怎样的是一个很好的开始。

符合你职业道路的工作描述

弄清楚你在找什么样的工作描述,你最感兴趣的是什么。你的大部分技术性面试问题都与特定的工作描述有关,所以为特定的角色做好适当的准备是最理想的。

数据科学家的角色很难定义,但 Airbnb 在将工作描述分成 3 个不同的路径方面做得很好。

  1. **分析:**定义和监控指标,创建数据叙述并构建工具
  2. **算法:**构建并解释支持数据产品的算法
  3. **推理:**用统计数据建立因果关系

大数据工程师和数据工程师一样;负责将机器学习模型投入生产的人。他们与数据科学家一起工作,确保模型可扩展,并能按需提供洞察力和预测。通常情况下,数据工程的职位需要 SQL 和强大的数据库技能,所以在申请之前,请确保你复习一些 SQL。数据工程师的另一个常见技能是 python 熊猫库。

选择职业道路可能很难,因此为自己制定一个 3-5 年的计划可能会让你对自己想去的公司和职位有一个良好的心态。选择哪种类型的数据科学对您有吸引力非常重要。根据你选择的道路或路线,你学习的内容和被问到的问题会有所不同。

不要忘记你以前的经历,并把它们与职位描述联系起来。告诉面试官你以前的技能对你将来有什么帮助。我的想法是离开金融行业,不做任何与这个话题相关的事情。但我错了。从事金融咨询工作让我有能力理解复杂的概念,并能够与客户沟通。

行为访谈

在你选择了你要申请的工作并递交了你的简历和作品集后,你可能会被考虑参加第一轮面试。这被称为行为面试。面试官通常是公司的人力资源代表,他们将决定是否将你的简历传递给数据科学团队或招聘经理。

在这次面试前准备好你的电梯间推介。确保你陈述了你加入训练营的原因和一些过去的经历,这将使你成为这个职位的一个很好的候选人。

我通常会在面试前拿出职位描述要求清单,看看这些如何融入我以前的经历,并与人力资源代表分享。

可能会被问到的一些行为问题:

  • 告诉我关于你自己的情况——电梯推销
  • 告诉我你失败的一次经历,以及你从中学到了什么。
  • 长处和短处——确保每一个短处都有克服它的长处
  • 告诉我你在团队项目中克服的一个挑战。

在面试的这个阶段之前,记住公司的文化和价值观。我注意到大公司关注团队合作和与他人沟通的问题。对于初创科技公司,我听说过于华丽的辞藻会伤害你。它可以双向进行,所以在 Glassdoor 上做一些研究,实际上是对行为面试的评论。此外,人力资源代表很可能没有技术背景。所以沟通是关键。

统计问题

没有先进的统计学知识,很难成为一名成功的数据科学家。准备好回答一些基本的统计学问题,作为数据科学面试的一部分。

  • 收到一个关于概率的面试问题是很常见的。
  • 什么是中心极限定理为什么重要?
  • 什么是采样?你知道多少种抽样方法?
  • I 型和 II 型误差有什么区别?
  • 什么是线性回归

编程部分— Python/SQL

面试官有两种方式测试你的编程技能。第一,他们会要求你在没有代码的情况下从理论上解决编程问题;第二,他们会给你一个白板练习。

一些公司可能会让你接受一个有时间限制的编码挑战。幸运的是,在过去的 15 周里,我们每天都在做这些,所以我们知道会发生什么。编码挑战可以在像 Hackerrank 和 Codewars 这样的网站上进行,所以确保你熟悉这两个网站。

“当你面临编码挑战时,重要的是要记住,公司并不总是在寻找‘正确’的解决方案。他们可能还在寻找代码可读性、良好的设计,甚至是特定的最佳解决方案。”

其他提示

  • 关注数据科学和机器学习的最新趋势。听播客是我了解今天发生的事情的最好方式。
  • 参加会议和社交活动,结识更多的人并获得听众。
  • 继续写博客,这是分享你的工作或任何涉及数据科学主题的研究的好方法。从出版物中获得一些吸引力以获得更多的读者。
  • 不要让职位描述的位置让你失去兴趣。如果你对一家公司感兴趣,这家公司有多个办公室,但只是在一个不理想的地点招聘……联系一下这家公司的某人,看看他们是否在多个地点招聘。

按公司列出的面试主题示例

Seattle Data Guy 分享了他的一些面试研究指南问题,随后是一些基于公司的焦点问题。

Airbnb — 产品繁重、指标诊断、指标创建、A/B 测试、大量行为问题和带回家的材料。

网飞— 产品感问题、A/B 测试、实验设计、度量设计

微软 —编程繁重,二叉树遍历,SQL,机器学习

Expedia —产品、编程、SQL、产品感知、关于 SVM 的机器学习问题、回归和决策树

https://docs . Google . com/spreadsheets/d/1 djhtq 4vd 72 lzuly 2 rcmokksung 2 rrf _ C5 pwnmjciamk/edit # GID = 859146723

结论

显然,面试轮次和问题将取决于你申请的公司和职位。这篇博客分享了一些开始准备面试的技巧和建议。

总的来说,研究公司的文化和价值观,看看你是否适合这家公司。数据科学面试压力很大,做好准备将有助于你赢得面试。对于技术面试来说,需要注意的是,你的问题是否正确并不重要,更重要的是你试图解决问题的过程。我们都在这个训练营,因为我们是编程新手。我们不能指望每个问题都答对,但要为每个面试问题计划好传递信息和思考过程,不要急于回答。

为意外做准备

原文:https://towardsdatascience.com/preparing-for-the-unexpected-b8b07ac955d6?source=collection_archive---------12-----------------------

如何将您的模型应用到从未见过的输入中

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

我们使用机器学习解决的一些问题涉及代表现实世界对象的分类特征,如单词、项目和类别。那么,当我们在推理时得到从未见过的新对象值时,会发生什么呢?我们如何提前做好准备,以便仍然能够理解输入的内容?

看不见的值,也称为 OOV(不在词汇表中)值,必须正确处理。不同的算法有不同的方法来处理 OOV 值。对分类特征的不同假设也应区别对待。

在这篇文章中,我将重点关注深度学习应用于动态数据的情况,其中新的值一直在出现。我将以 Taboola 的推荐系统为例。模型在推理时获得的一些输入包含看不见的值——这在推荐系统中很常见。例子包括:

  • 项目 id:每个可推荐的项目都有一个唯一的标识符。每天都有数以千计的新项目进入系统。
  • 广告商 id:赞助内容是由广告商创建的。与新项目的数量相比,新的每日广告客户的数量要少得多。尽管如此,正确处理它们是很重要的,尤其是因为我们想要支持新的广告客户。

那么,OOV 价值观的挑战是什么?

学习处理 OOV 价值观

OOV 值与模型在训练时看不到的值相关联。因此,如果我们在推理时得到一个 OOV 值,模型不知道如何处理它。

一个简单的解决方案是在训练之前用一个特殊的 OOV 令牌替换所有罕见的值。因为从模型的角度来看,所有 OOV 值都是相同的,所以我们将在推理时用 OOV 令牌替换它们。该解决方案有两个积极的结果:

  1. 模特在训练时会接触到 OOV 令牌。在深度学习中,我们通常嵌入分类特征。训练后,模型将学习所有 OOV 值的有意义的嵌入。
  2. 将减轻过度适应稀有值的风险。这些值出现在少数示例中。如果我们学习这些值的嵌入,模型可能会学习使用它们来解释这些特定示例中的特殊性或随机噪声。学习这些嵌入可能导致的另一个灾难是没有足够的梯度更新传播给它们。因此,相对于通过训练学习的信号,随机初始化将支配结果嵌入。

问题解决了…还是?

处理 OOV 价值观很难!

该模型使用项目 id 功能来记忆每个项目的不同信息,类似于纯粹的协同过滤方法。注入了 OOV 令牌的稀有物品无法从中受益,因此模型对它们的性能更差。

有趣的是,即使我们在训练时完全不使用物品 id,模型在稀有物品上的表现仍然更差!这是因为他们来自不同于一般人群的分布。它们具有特定的特征——可能它们在网上的表现很差,这导致 Taboola 的推荐系统较少推荐它们,反过来——它们在数据集中变得罕见。那么为什么这种分布差异很重要呢?

如果我们用这个特殊分布来学习 OOV 嵌入,它不会推广到一般人群。请这样想——每个项目在某个时候都是一个新项目。在那时,它被注入了 OOV 令牌。所以 OOV 嵌入应该对所有可能的项目都执行得很好。

随机性是数据科学家最好的朋友

为了使用一般群体来学习 OOV 嵌入,我们可以在开始训练过程之前将 OOV 令牌注入到来自数据集中的随机样本集中。但是有多少例子就够了呢?

我们采样越多,OOV 嵌入就越好。但同时,该模型将暴露于更少数量的非 OOV 值,因此性能将下降。

我们如何使用大量的例子来训练 OOV 嵌入,同时使用相同的例子来训练非 OOV 嵌入?我们没有在开始训练之前随机注入 OOV 令牌,而是选择了以下方法:在每个时期,模型使用所有可用的值进行训练(不注入 OOV 令牌)。在纪元结束时,我们随机抽取一组样本,注入 OOV 令牌,并再次训练模型。这样,我们享受两个世界!

和前面的方法一样,我们也将 OOV 令牌注入稀有值,以避免过度拟合。

为了评估新的方法,我们将 OOV 令牌注入到所有的示例中,并评估了我们的离线度量(MSE)。与在模型开始训练之前随机注入 OOV 令牌相比,它提高了 15%。

最后的想法

在我们想到新方法之前,我们的模型已经在生产中使用了很长时间。很容易忽略这种潜在的性能提升,因为该模型整体性能良好。它只是强调了一个事实,你总是要寻找意想不到的!

原文由我在发表。

使用 Pix2Pix 为图像翻译准备 TIFF 图像

原文:https://towardsdatascience.com/preparing-tiff-images-for-image-translation-with-pix2pix-f56fa1e937cb?source=collection_archive---------19-----------------------

使用 tiff 图像的 pix2pix 入门指南

近年来,生成对抗网络(GANs)因其在图像生成、图像翻译、风格转换、图像着色等方面取得的令人印象深刻的成就而受到广泛关注。特别地,由 Isola 等人开发的 pix2pix 作为条件生成对抗网络(CGAN)已经变得非常流行,其允许用户基于输入图像生成图像。一些例子包括从语义标记的图像翻译成街道场景,从白天的照片翻译成夜晚的照片,从草图翻译成照片等等。

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

Image taken from https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix

所有这些都非常令人印象深刻,但目前,pix2pix 主要是迎合巴布亚新几内亚和 JPG 的图像。这是不幸的,因为一些任务,例如医学成像,使用无损的 TIFF 图像,而标准 JPEG 文件是无损的,因此捕捉更准确的细节。TIFF 图像具有浮点值,而 PNG 和 JPG 图像具有整数值,因此在实现 pix2pix 时保持这种精度非常重要。

此外,CGANs 需要将图像缩放到[-1,1]的范围,以便进行更稳定的训练。但是,标准化并不是简单地使用现成的函数就能实现的,因为 TIFF 图像与像素值为 0-255 的标准 PNG 和 JPG 图像不同,它们的值可能会有所不同。在我的例子中,我的 TIFF 图像的值范围是从 0 到 1200!

记住这几点,我将详细说明如何成功地将 pix2pix 应用于 TIFF 图像。

了解您的数据

首先,找到你的图像有多少通道。RGB 图像有 3 个通道,而灰度图像只有 1 个通道。对于 TIFF 图像,它们可以出现在不同数量的通道中,因此在使用 pix2pix 之前理解您的图像数据非常重要,因为您在对架构进行编码时做出的后续决定将取决于此。使用以下代码片段来查找您的图像拥有的通道数:

Find the number of channels in your image

准备数据集

现在您对数据集有了更好的理解,您必须准备数据集。Pix2pix 是独一无二的,因为它需要两个域中完全相同的成对图像。因此,在官方的 PyTorch 实现中,图像必须并排组合在一起,以产生宽度* 2 x 高度的合成图像。记住需要保持 TIFF 文件值的精度,我使用 PIL 库打开图像,然后使用 numpy 将两个图像连接在一起。

首先,按以下格式准备数据集:folderA 应包含包含域 A 中所有图像的子文件夹 train、validation(如果有)和 test(如果有),而 folderB 应包含包含域 b 中所有图像的子文件夹 train、validation(如果有)和 test(如果有),注意确保 folderA 和 folderB 中的图像具有相同的尺寸和名称。然后,使用下面的代码来生成连接的图像。目标路径(dest_path)是您希望保存串联图像的目录。结果名称将与 folderA 和 folderB 中的原始名称相同。

Concatenate 2 images from domain A and domain B to form a single image

规范化您的数据

Pix2pix 对生成器模型的输出层使用 tanh 激活函数,生成像素值在[-1,1]范围内的图像。因此,重要的是鉴别器也接收与发生器模型产生的范围相同的真实图像。但是,开箱即用的解决方案不起作用,因为它们假设像素值在 0-255 的范围内,就像普通的 PNG 和 JPG 图像一样。这不适用于 TIFF 图像,因为每个图像的像素值范围都不相同,所以在分割之前先找到图像的最小值和最大值非常重要。下面的代码片段允许您根据原始像素值缩放图像:

Scale any image to the pixel values of [-1, 1]

包扎

原来如此!你已经准备好了你的 tiff 数据集,并准备好实现 pix2pix 代码,无论是官方的 Torch 实现PyTorchTensorflow 等等。如果你面临任何问题,请在评论中告诉我,我会尽力帮助你。

这篇文章也发表在我的博客里。

预处理:用函数计算经纬度点之间的距离

原文:https://towardsdatascience.com/preprocessing-calculate-the-distance-between-longitude-and-latitude-points-with-a-function-8f748a2eab88?source=collection_archive---------34-----------------------

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

作为关注一些独特的预处理技术的系列文章的一部分,本系列的第一篇文章将关注处理纬度/经度信息。这种类型的数据对于绘制可视化地图和其他地理定位目的非常重要。

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

纬度是指定地球表面南北点的地理位置。经度提供了东西点。写出来的时候,先写纬度,后写逗号,再写经度。赤道代表纬度的零点,本初子午线代表经度的零点。

有时,当您有几个点的地理位置时,计算距离可能有助于要素工程数据。我将使用 2018 年奥斯汀犯罪数据集,该数据集可在https://data . Austin Texas . gov/Public-Safety/Crime-Reports-2018/vmn 9-3bvu找到。关于地理位置数据,该数据集包含纬度、经度的独立特征和名为 location 的组合纬度/经度特征。

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

这些地理位置确定了犯罪发生的地点。大多数代表地址,有些是小巷,停车场等。所以使用地理定位很重要,可以参考。

奥斯汀有四个警察局。总指挥部和三个分站(北、东、西)。奥斯汀警察局还提供了一个以这些车站的位置为特征的数据集。在该数据集中,站的名称,以及单独的经度和纬度点(分别标记为 X 和 Y)。

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

该计划旨在描绘出每个犯罪现场到每个警察局的距离。幸运的是,地理位置数据是分离的,因为它节省了分离数据的几个步骤。如果您遇到这种情况,且您有一个类似于上面位置特性的组合地理位置(例如:(30.1876534,-97.475630)),您可以很容易地分离这些数据,首先使用 python strip()方法删除括号,然后使用 split()方法分离值,因为如果列中有任何字符,它们将被视为对象。

df[‘Location] = df.Location.strip(‘()’) #will remove the parentheses (can use regex if necessary to remove additional text,etc)df[[‘Longitude’,’Latitude’]] = df.str.strip(‘,’, expand = True)

本文将不讨论计算这种转换的公式的细节,但是在运行函数时,下面的函数将以纬度和经度为起点,将距离(以英里为单位)转换为 DataFrame 列。

‘’’Distance equation for long,lat data used via stackoverflow from user Michael0x2a. Updated to a function that converts to mileage’’’# constant values, if need to change end lat, long points, change the lat2, lon2 informationlat2 = np.array(clean.Latitude) #identifies iterable latitude column
lon2 = np.array(clean.Longitude) #identifies iterable longitude columnlatr = np.array(list(map(lambda x: np.radians(x), lat2)))
lonr = np.array(list(map(lambda x: np.radians(x), lon2)))def distance(lat1,lon1):
    lat1 = np.radians(lat1)
    lon1 = np.radians(lon1)
    dlon = np.array(list(map(lambda x: (x — lon1), lonr)))
    dlat = np.array(list(map(lambda x: (x — lat1), latr)))
    a = np.sin(dlat/2)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2)**2
    c = 2 * np.arctan2(np.sqrt(a), np.sqrt(1 — a))
    # 6373.0 represents earth radius in kilometers
    kilo = 6373.0 * c
    miles = kilo * 0.62137119
    return miles

要运行该函数,请确保将新功能设置为变量:

clean[‘Main Distance’] = distance(30.267574,-97.735070)

如果你需要以公里为单位的距离,只需删除英里转换线,并确保返回千。

预处理:标准化方法的差异

原文:https://towardsdatascience.com/preprocessing-differences-in-standardization-methods-de53d2525a87?source=collection_archive---------28-----------------------

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

如果您一直在关注预处理系列,我们已经介绍了通过插补处理缺失的连续和分类数据。除此之外,我们还包括编码分类值。

接下来是拟合模型之前的下一个最重要的预处理方法:标准化。让我们来看看这在数据中代表了什么,以及为什么它如此重要。

数据集的***‘标准化*** 是 scikit-learn 中实现的许多机器学习估值器 的一个 共同要求;如果单个特征或多或少看起来不像标准的正态分布数据:具有 零均值和单位方差 的高斯数据,则它们可能表现不佳。

在实践中,我们经常忽略分布的形状,只是通过移除每个特征的平均值来转换数据以使其居中,然后通过将非恒定特征除以其标准偏差来缩放数据。

例如,学习算法的目标函数中使用的许多元素(如支持向量机的 RBF 核或线性模型的 l1 和 l2 正则化子)假设所有特征都以零为中心,并且具有相同顺序的方差。如果某个特征的方差比其他特征的方差大几个数量级,那么它可能会主导目标函数,使估计器无法像预期的那样正确地从其他特征中学习。【https://scikit-learn.org/stable/modules/preprocessing.html】()

本质上,这意味着将数据集中到相同的平均值,并将数据缩放到相同的范围。再次学会拯救。在这里,我们将涵盖一个特定的例子,与’泰坦尼克号’数据集,我们以前已经编码和估算。这篇文章的链接在下面。

[## 预处理:编码和 KNN 快速估算所有分类特征

在将我们的数据放入模型之前,需要对分类数据执行的两个步骤是编码和处理…

towardsdatascience.com](/preprocessing-encode-and-knn-impute-all-categorical-features-fast-b05f50b4dfaa)

为了展示使用标准标量和 PowerTransformer 之间的比较,我们将使用不同的 scikit-learn 包对每个标准化数据集运行一个线性回归模型。我们将把票价作为我们的目标。

所以首先,我们需要设置我们的目标和特性变量。

target = encode_data.fare
features = encode_data.drop(‘fare’, axis=1)

接下来,我们将导入我们要比较的包…所有这些包都在同一个 scikit-learn 预处理类中。

from sklearn.preprocessing import StandardScaler, RobustScaler, QuantileTransformer, PowerTransformer

接下来,我们将实例化每个转换包。

ss = StandardScaler()
rs = RobustScaler()
qt = QuantileTransformer(output_distribution='normal',n_quantiles=891)
yj = PowerTransformer(method = 'yeo-johnson')
bc = PowerTransformer(method = 'box-cox')

如果你注意到,有两种 PowerTransformer 方法,“yeo-johnson”和“box-cox”。Yeo-Johnson 可用于阳性和阴性数据,而 box-cox 只能用于阳性数据。如果存在任何否定数据,将会引发错误。现在,我们将用几行代码通过每种标准化技术运行我们的数据。

ss_data = ss.fit_transform(features)
rs_data = rs.fit_transform(features)
qt_data = qt.fit_transform(features)
yj_data = yj.fit_transform(features)
#bc_data = pd.DataFrame(bc.fit_transform(encode_data), columns = encode_data.columns)

box-cox 技术被注释掉,因为在集合中识别出了负面数据。现在,我们可以通过 scikit-learn 的现成线性回归模型对每个结果进行评分。

from sklearn.linear_model import LinearRegression
lr = LinearRegression()

以下是不同软件包的结果:

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

Original Data without standardization

我们未经标准化的原始数据得出的 r 平方值约为. 427。

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

Data with StandardScaler

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

Data with RobustScaler

如果你注意到,standardscaler 和 robustscaler 产生的 r 平方分数与我们的原始数据相同。这是因为大部分数据是分类的,使用这些标量实际上对数据的分布没有影响。鲁棒定标器被设计成对异常值更加友好。这个数据集没有异常值,所以结果是一样的。

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

Data with QuantileTransformer

quantiletransformer 实际上比原始数据得分更低(~0 . 384)。虽然 quantiletransformer 在规范化双模态和统一数据方面表现很好,但对于这个特定的数据集却不是这样。

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

Data with PowerTransformer (Yeo-Johnson)

采用 Yeo-Johnson 方法的 powertransformer 软件包将分数提高到了~.449。这比原始数据提高了 2%,仅仅是因为使用了不同的标准化包!

这个故事的寓意是,确保在清理后的数据上测试不同的规范化技术。它真的不会占用太多时间,并且当处理时间证明它是正确的时候,每一点准确性都很重要。这个过程是从上一篇文章添加到 Github 的。可从以下网址获得:

[## 贾森·M·理查兹/插补技术

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

github.com](https://github.com/Jason-M-Richards/Imputation-Techniques)

一如既往的感谢。下周再聊!

预处理:编码和 KNN 快速估算所有分类特征

原文:https://towardsdatascience.com/preprocessing-encode-and-knn-impute-all-categorical-features-fast-b05f50b4dfaa?source=collection_archive---------6-----------------------

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

在将我们的数据放入模型之前,需要对分类数据执行的两个步骤是编码和处理缺失的空值。编码是将文本或布尔值转换为数字值进行处理的过程。至于丢失的数据,有三种方法可以用来处理数据集中的空值。第一种是将它们留在数据是分类的情况下,可以被视为“缺失”或“非”类别。第二种是通过行或列删除数据。删除数据是一个危险的过程,您不希望从数据集中删除太多的数据。如果缺少值的特性与另一个特性不相关或高度相关,则可以删除该列。另一方面,行是基于具体情况的。第三种,我们将在这里讨论,是估算,或者用占位符值替换。

从 Python 3.6 开始,FancyImpute 就已推出,它是将替代插补方法应用于数据集的绝佳方式。fancyimpute 可以执行多种方法(文档在此:https://pypi.org/project/fancyimpute/,但是我们将专门针对分类特征讨论 KNN 估算器。

在我们开始之前,先简要概述一下我们将在这种特殊的预处理技术中使用的数据…非常有用的泰坦尼克号数据集,因为它可以通过 seaborn 数据集轻松获得。 我们将构建一个处理数据集中所有分类变量的流程。 这个过程将被一步一步地概述,所以除了少数例外,应该与数据集中标识的任何列列表一起工作。

首先,我们将加载我们的库。因为我们要遍历列,所以我们要对数据进行普通编码,而不是一次性编码。如果你注意到,KNN 软件包确实需要一个 tensorflow 后端,并使用 tensorflow KNN 流程。KNN 方法是一种多指数方法,这意味着数据需要全部处理,然后进行估算。

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

接下来,我们将加载并查看我们的数据。这一区有几个项目需要解决。首先,我们将最大列数设置为 none,这样我们就可以查看数据集中的每一列。其次,这个数据是直接从 seaborn 加载的,所以使用了 sns.load_dataset()。

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

接下来,看看我们在丢失值和数据类型方面正在处理什么是很好的。很快。info()将完成这个任务。

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

如您所见,有两个特性被列为类别 dtype。这会导致插补出现问题,因此我们需要将这些数据复制到新的要素中作为对象,并丢弃原始数据。如果你没有任何数据被识别为类别,你应该没事。

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

根据我们掌握的信息,我们的情况如下:

  1. 带有需要编码的文本的分类数据:性别、上船、阶级、谁、成人 _ 男性、上船 _ 城镇、活着、独自、甲板 1 和阶级 1。
  2. 具有空值的分类数据:年龄、登船、登船 _ 城镇、甲板 1

我们将确定将要编码的列,但不会涉及太多细节(因为有注释),提取非空数据、对其进行编码并将其返回到数据集的过程如下。

*#instantiate both packages to use*
encoder = OrdinalEncoder()
imputer = KNN()
*# create a list of categorical columns to iterate over*
cat_cols = ['embarked','class1','deck1','who','embark_town','sex','adult_male','alive','alone']

**def** encode(data):
    *'''function to encode non-null data and replace it in the original data'''*
    *#retains only non-null values*
    nonulls = np.array(data.dropna())
    *#reshapes the data for encoding*
    impute_reshape = nonulls.reshape(-1,1)
    *#encode date*
    impute_ordinal = encoder.fit_transform(impute_reshape)
    *#Assign back encoded values to non-null values*
    data.loc[data.notnull()] = np.squeeze(impute_ordinal)
    **return** data

*#create a for loop to iterate through each column in the data*
**for** columns **in** cat_cols:
    encode(impute_data[columns])

你可能已经注意到了,我们没有对“年龄”进行编码?我们不想给年龄重新赋值。处理相关当前数据为空的分类数据的最佳方法是将这些数据与该方法分开处理。让我们来看看我们的编码数据:

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

如您所见,我们的数据仍然是有序的,所有的文本值都已被编码。既然我们有了估算器可以计算的值,我们就可以估算空值了。我们可以输入数据,将数据转换回数据帧,并在一行代码中添加回列名。如果您喜欢使用剩余的数据作为数组,只需省去 pd。DataFrame()调用。

*# impute data and convert* 
encode_data = pd.DataFrame(np.round(imputer.fit_transform(impute_data)),columns = impute_data.columns)

有了 tensorflow 后端,这个过程很快,每迭代 100 行就会打印出结果。我们需要对值进行舍入,因为 KNN 将产生 floats。这意味着我们的 fare 列也将被四舍五入,所以请确保将您不希望四舍五入的任何功能排除在数据之外。

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

该过程确实估算所有数据(包括连续数据),因此要预先处理任何连续的空值。幸运的是,我们所有的估算数据都是分类的。嗯,也许下次再发吧。查看 GitHub 上的笔记本:https://GitHub . com/Jason-M-Richards/Encode-and-Impute-categorial-Variables

每周都会发布一个新的预处理技术(直到我再也想不出来了),所以请关注并留意!

预处理:缺失连续值的回归插补

原文:https://towardsdatascience.com/preprocessing-regression-imputation-of-missing-continuous-values-f612179bafb4?source=collection_archive---------15-----------------------

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

作为编码和输入分类值的后续,本文将介绍使用回归技术来输入连续变量的缺失值。

在决定如何处理数据中的缺失值时,有三种选择:移除带有缺失数据的观测值、将缺失值保留在原位或估算(使用占位符)值。如果决定使用占位符值,实际选择是平均值、中间值或众数。如果缺失值很少和/或数据的变化不显著,这就足够了。

如果有一个特性非常重要,需要保留,但却缺少大量的变量值,该怎么办?Sci-kit Learn 和他们的迭代输入包。

我们将使用一个随机生成的数据集,其中包含有目的地放置的空值。首先,让我们来谈谈我们将要加载的包,并深入了解一下 IterativeImputer。

import pandas as pd
import numpy as np
# explicitly require this experimental feature
from sklearn.experimental import enable_iterative_imputer
# now you can import normally from sklearn.impute
from sklearn.impute import IterativeImputer
from sklearn.ensemble import ExtraTreesRegressor
from sklearn.linear_model import BayesianRidge
import random

如您所见,迭代输入在 sci-kit learn 库中仍处于实验阶段。在某些情况下,使用这种插补技术会牺牲模型的准确性,因此一定要比较没有使用插补技术的数据集的验证结果。如果你也注意到了,我们已经加载了几个回归模型。IterativeImputer 包允许灵活地选择预加载的 sci-kit 学习模型来迭代数据以估算缺失值。这里重点介绍了三种型号,文档中提供了型号列表和更详细的说明:

[## sk learn . input . iterativeinputr-sci kit-learn 0 . 21 . 3 文档

sk learn . impute . iterative imputr(estimator = None,missing_values=nan,sample_posterior=False,max_iter=10…

scikit-learn.org](https://scikit-learn.org/stable/modules/generated/sklearn.impute.IterativeImputer.html#sklearn.impute.IterativeImputer)

还要注意,我们使用的方法都是回归模型。这是基于数据的偏好。检查数据并寻找最适合估算值的模型的线索是一种很好的做法。

现在,我们可以生成一个随机数据集,添加 10%的缺失数据,然后将它们混在一起。

data = np.random.random([1000,20])
null_data = np.empty([1000,2])
null_data[:] = np.nan
full_data = np.concatenate((data,null_data), axis=1)
full_data = np.random.permutation(full_data.flat)
full_data = full_data.reshape([1000,22])

这就是 IterativeImputer 的美妙之处,两行代码处理了所有的空值。BayesianRidge 是用于估算的默认方法,但是我们将调用它来展示一个例子,说明将所选模型实例化到代码中是多么简单。

imputer = IterativeImputer(BayesianRidge())
impute_data = pd.DataFrame(imputer.fit_transform(full_data))

我对你的挑战是创建一个目标值集,并比较可用的回归和分类模型的结果以及带有缺失值的原始数据。该笔记本包含在上周预处理文章的分类插补笔记本中(https://github . com/Jason-M-Richards/Encode-and-Impute-categorial-Variables)。感谢所有的支持,我真心希望你的感恩节过得愉快!下周见。

NLP 第 2 部分|使用 Python 预处理文本数据

原文:https://towardsdatascience.com/preprocessing-text-data-using-python-576206753c28?source=collection_archive---------5-----------------------

让我们为分析准备/清理数据,不要忘记这是一个迭代过程。

卡米尔·米西亚克

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

Photo by Dmitry Ratushny on Unsplash

我以前的 文章 探讨了使用名为 BeautifulSoup 的 python 库从网站上抓取文本信息的概念。我们很快就能从 Indeed.com 获取员工公司评级,并将数据导出到本地 CSV 文件中。抓取数据仅仅是从我们新获得的文本数据中收集有用见解的第一步。本文的目的是采取下一个步骤,应用一些标准的预处理步骤,以便为分析准备数据。

您选择执行哪种预处理方法将取决于您的数据、预期结果和/或您选择的数据分析方式。也就是说,下面列出的预处理方法是一些最常用的方法。

  1. 将库与我们的数据一起导入
  2. 扩张收缩
  3. 语言检测
  4. 标记化
  5. 将所有字符转换为小写
  6. 删除标点符号
  7. 删除停用词
  8. 词性标注
  9. 词汇化

导入必要的库

import pandas as pd
import numpy as np
import nltk
import string
import fasttext
import contractions
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords, wordnet
from nltk.stem import WordNetLemmatizerplt.xticks(rotation=70)
pd.options.mode.chained_assignment = None
pd.set_option('display.max_colwidth', 100)
%matplotlib inline

导入我们的数据

我们将导入在之前的 教程 中获得的粗略员工评估评级,并快速检查数据。

with open('indeed_scrape.csv') as f:
    df = pd.read_csv(f)
f.close()

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

我们将重点关注“评级”和“评级 _ 描述”列,因为它们包含最有价值的定性信息。尽管我们不会对“rating”列应用任何预处理步骤。

首先,让我们删除“Unnamed: 0”列,因为它只是复制了索引。

df.drop('Unnamed: 0', axis=1, inplace=True)

接下来,让我们检查是否有任何缺失的值。“评级”和“评级 _ 描述”似乎都不包含任何缺失值。

for col in df.columns:
    print(col, df[col].isnull().sum())

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

rws = df.loc[:, ['rating', 'rating_description']]

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

文本预处理

扩张收缩

缩写是我们采取的文学上的小捷径,我们更喜欢“应该”而不是“应该”,或者“不”很快变成了“不”。我们将向我们的数据框架添加一个名为“no_contract”的新列,并对“rating_description”字段应用一个 lambda 函数,这将扩展任何收缩。请注意,扩展的收缩将被有效地标记在一起。换句话说,“我有”=“我有”而不是“我”,“有”。

rws['no_contract'] = rws['rating_description'].apply(lambda x: [contractions.fix(word) for word in x.split()])
rws.head()

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

我们最终希望将扩展的缩写分别标记为“I”、“have”,因此,让我们将“no_contract”列下的列表转换回字符串。

rws['rating_description_str'] = [' '.join(map(str, l)) for l in rws['no_contract']]
rws.head()

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

英语语言检测

下一步是确定每篇评论使用的语言,然后删除任何非英语的评论。我们首先必须为我们的快速文本库下载预先训练好的语言模型(每个人都需要感谢 facebook 的这个)。TextBlob 是一个用于检测字符串语言的常用库,但是当您解析大量文本时,它会很快抛出一个错误。一旦我们下载了模型,我们将使用 for 循环来遍历我们的评论。结果是预测语言和预测概率的元组。在我们的例子中,我们只需要第一个(即。语言预测)部分。最后,我们只选择最后两个字符。

pretrained_model = "lid.176.bin" 
model = fasttext.load_model(pretrained_model)langs = []
for sent in rws['rating_description_str']:
    lang = model.predict(sent)[0]
    langs.append(str(lang)[11:13])rws['langs'] = langs

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

现在我们要做的就是删除所有非英语评论。

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

标记化

现在,我们已经删除了所有非英语评论,让我们应用我们的分词器,将每个单词拆分成一个单词。我们将对“rating_description_str”列应用 NLTK.word_tokenize()函数,并创建一个名为“tokenized”的新列。

rws['tokenized'] = rws['rating_description_str'].apply(word_tokenize)
rws.head()

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

将所有字符转换为小写

将所有单词转换成小写也是非常常见的预处理步骤。在这种情况下,我们将再次向 dataframe 追加一个名为“lower”的新列,这将把所有标记化的单词转换为小写。然而,因为我们必须迭代多个单词,所以我们将在 lambda 函数中使用一个简单的 for 循环来对每个单词应用“lower”函数。

rws['lower'] = rws['tokenized'].apply(lambda x: [word.lower() for word in x])
rws.head()

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

删除标点符号

标点符号经常从我们的语料库中删除,因为一旦我们开始分析我们的数据,它们就没有什么价值了。继续前面的模式,我们将创建一个删除了标点符号的新列。我们将再次在 lambda 函数中使用 for 循环来迭代令牌,但这次使用 IF 条件来仅输出 alpha 字符。可能看起来有点困难,但“下方”列中的符号化“句点”已被删除。

punc = string.punctuation
rws['no_punc'] = rws['lower'].apply(lambda x: [word for word in x if word not in punc])
rws.head()

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

删除停用词

停用词通常是无用的词,对句子没有多大意义。英语中常见的停用词包括“你、他、她、在、一个、有、是”等。。首先,我们需要导入 NLTK 停用词库,并将停用词设置为“english”。我们将添加一个新列“no_stopwords ”,该列将从“no_punc”列中删除停用词,因为它已被标记化,已被转换为小写,并且标点符号已被删除。lambda 函数中的 for 循环将再次遍历“no_punc”中的标记,并且只返回“stop_words”变量中不存在的标记。

stop_words = set(stopwords.words('english'))
rws['stopwords_removed'] = rws['no_punc'].apply(lambda x: [word for word in x if word not in stop_words])
rws.head()

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

词干化与词汇化

词干化的想法是将不同形式的单词用法减少到它的词根。例如,“驱动”、“被驱动”、“驾驶”、“被驱动”、“驱动者”是“驱动”一词的派生词,研究人员经常想从他们的语料库中去除这种可变性。与词干化相比,词干化当然是不太复杂的方法,但它通常不会产生特定于词典的词根。换句话说,对单词“pies”进行词干化通常会产生“pi”的词根,而词汇化会找到“pie”的词根。

让我们对我们的数据应用词汇化,而不是简单地使用词干化,但是与词干化相比,这需要一些额外的步骤。

首先,我们要应用词性标签,换句话说,确定词性(即。名词、动词、副词等。)每个单词。

rws['pos_tags'] = rws['stopwords_removed'].apply(nltk.tag.pos_tag)
rws.head()

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

我们将使用 NLTK 的 word lemmatizer,它需要将词性标签转换成 wordnet 的格式。我们将编写一个进行适当转换的函数,然后在 list comprehension 中使用该函数来应用转换。最后,我们应用 NLTK 的单词 lemmatizer。

def get_wordnet_pos(tag):
    if tag.startswith('J'):
        return wordnet.ADJ
    elif tag.startswith('V'):
        return wordnet.VERB
    elif tag.startswith('N'):
        return wordnet.NOUN
    elif tag.startswith('R'):
        return wordnet.ADV
    else:
        return wordnet.NOUNrws['wordnet_pos'] = rws['pos_tags'].apply(lambda x: [(word, get_wordnet_pos(pos_tag)) for (word, pos_tag) in x])
rws.head()

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

现在,我们可以在可靠的列表理解中应用 NLTK 的单词 lemmatizer。注意,lemmatizer 函数需要两个参数单词及其标签(以 wordnet 的形式)。

wnl = WordNetLemmatizer()
rws['lemmatized'] = rws['wordnet_pos'].apply(lambda x: [wnl.lemmatize(word, tag) for word, tag in x])
rws.head()

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

最后,我们将把这项工作保存到一个 csv 文件中,用于进一步的探索性数据分析,您可以在我的下一篇 博客 中读到所有相关内容。

rws.to_csv('indeed_scrape_clean.csv')

文本预处理可能很快成为编辑和进一步技术的兔子洞,但我们必须在某处划清界限。随着分析过程的深入,我经常会回到数据预处理阶段,因为我发现了一些需要解决的数据问题。也就是说,要学会在某处划清界限。

平稳时间序列中的记忆保持

原文:https://towardsdatascience.com/preserving-memory-in-stationary-time-series-6842f7581800?source=collection_archive---------3-----------------------

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

Songkran festivities along the Ping river in Chiang Mai, Thailand. Extracting seasonality, the water level of a river is a stationary time series

许多预测模型要求时间序列具有一定的一致性,称为平稳性。通常的转换,即整数阶差分(在金融中,例如对回报率而不是绝对价格建模),消除了数据中的记忆,因此影响了建模的预测能力。这篇文章概述了分数微积分如何允许保留更多的信息,并更好地平衡平稳性和有意义的记忆。

一般来说,我们将一个给定的时间序列理解为一个随机过程产生的样本,我们试图为预测模型推断其分布和统计数据。

建立随机过程的预测模型是为了在样本的特异性和普遍性之间找到平衡:模型在一般模式的背景下解释给定的序列。

比一般的预测回归更具体的是,时间序列由于其时间结构而具有内在的顺序——任何给定的实例都反映了过去遍历的值的历史,即其过去跟踪记录的特定记忆

平稳性

为了识别生成过程的一般模式并绘制给定的星座图,在实际建模之前,作为预处理步骤的一部分,这种系列特定的记忆通常被消除。

在监督学习的机器学习术语中,这用于发现通用结构,并将给定实例与带标签的训练集中的更多样本进行匹配。

在数学术语中,过程的统计属性以及序列的集合(如平均值、方差和协方差)应相对于时间顺序保持不变,这意味着序列不应显示出随时间变化的趋势。这个概念被称为平稳性(参见例如【1】以获得全面的解释)

有多种方法可以检查序列的平稳性:

  1. 目视检查一段时间内的线图是否有明显的趋势,参见[6]中的一些示例。
  2. 比较序列的各种(随机)分割的基本汇总统计数据(均值、方差、协方差)。
  3. 检查自相关图:随着滞后时间的增加,曲线下降得越快,序列中非平稳性的顺序就越少。
  4. 最常见的平稳性统计测试是单位根的扩展 Dickey Fuller (ADF)测试。

直观地说,单位根(形式上是位于单位圆上的过程的特征方程的解(见【2】)的含义是,初始条件或外部冲击不会随时间消散,而是通过系列传播并通知所有后续值。

对于一个给定的置信水平,ADF 测试零假设“某个顺序的单位根的存在”(意味着时间序列的非平稳性)相对于平稳性(或者,严格地说,趋势平稳性)的替代。使自己相信单位根的存在确实意味着级数的非平稳性是很直接的:

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

所以方差是依赖于时间的。

由于许多经典模型方法的一个必要假设是时间序列的平稳性:当您的数据中有明确的趋势或季节性时,您将删除它并对剩余部分进行建模。对于预测,然后将(确定性)趋势和模型输出结合起来。

使序列平稳的常用变换是某一阶的差分:一阶差分就是从每个值中减去前一个值(提取变化率)。二阶差分对结果序列重复这一过程,对高阶序列也是如此。例如,在金融时间序列中,您会考虑(对数)回报而不是绝对价格,以使模型对特定价格水平不可知(事实上,对于大多数金融序列,一阶差分足以确保平稳性——我仍然不知道为什么)。

在基于自相关的 Arima(p,d,q) 类型的模型中,差分实际上是算法的一部分:参数 p,dq 是非负的 整数 ,其中 p 表示自回归模型的阶(即时滞的数量),而 d 表示差分的阶,而 q 表示阶

这个过程通过外科手术消除了数列中的单位根。

然而,另一方面,它清除了内存,而内存是模型预测能力的基础:差异限制了过去的信息如何通过序列传播。

例如,对于金融序列,人们面临着一个没有记忆的稳定回报序列(一阶差分)和一个有记忆但不稳定的绝对价格序列(零阶差分)之间的两难选择。

但也许根本不需要这种极性?如果我们能在这两个极端之间进行插值会怎么样?

“……这将导致一个悖论,总有一天会从中得出有益的结论。”莱布尼茨,1695 年

分数微积分

其实我们可以:17 世纪牛顿和莱布尼茨发明微积分后不久,数学家们就探索了分数导数的使用,其中微分或积分的阶从自然数扩展到实数。然而,分数微积分在 20 世纪的工作应该找到它的第一个自然应用,并在 20 世纪 80 年代通过 Hosking 和 Granger 的 Arfima 模型进入金融领域(全面的历史记录见[4])。

在历史上,这种推广的第一个试探法似乎是由欧拉在 1730 年左右通过伽马函数将二项式系数推广到实数阶而给出的。这后来通过用于重复微分的柯西公式以及在黎曼和刘维尔的积分理论中变得更加严格(例如参见[3])。

这里我们只是给出我们应用于时间序列差分的形式启发:
B 表示滞后算子,即B Xt=X*{ t-1 }*对于 t > 1 和某个时间序列 X ={X_ 1 ,…}。然后,一阶元素差分可以用恒等运算符 I 表示为

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

该算子的多项式理解为重复应用,如B X{ t }=X*{ t-2 }。*我们可以用二项式系数来展开这个数列:

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

Formal power series expansion of the differencing operator (see Arfima models [5]).

虽然对于 d ∈ ℜ,情况可以变得更加严格,但是在这里,由于我们将在下面的应用中仅使用这种展开的截断版本,我们实际上不必担心这种形式推导的收敛性。

从这个推导中,我们可以读出滞后权重的迭代公式

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

其中ω_ k 是滞后算子 B ^k 的系数。
比如退货,ω_ 0 = 1,ω_ 1 = -1,ω_ k =0 对于 k > 1(一阶差分)。

让我们看看不同阶差分的系数(代码如下)。

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

我们注意到分数差分的两个重要细节:

  • 对于任何整数 d ∈ 𝒩且 d < k: 的滞后权重等于零,这意味着我们恢复了整数订单的通常推导。
  • 对于实数阶 d 和大滞后,滞后权重逐渐变小。这种现象被称为’长记忆’(或微积分语境中的’非定域性’),通常需要边界条件。这里,我们简单地选择切断超过某个窗口大小的(小)权重。

金融时间序列建模的应用

时间序列起主导作用的一个领域是金融。为了更直观地了解分数差分的特性,让我们将其应用于一些典型的金融时间序列。

我们通过将差分算子的上述形式级数展开应用于指定实数阶 d ∈ℜ和固定窗口大小的时间序列来获得变换后的序列——使用下面的代码,简单地将熊猫时间序列输入到函数ts _ difference中,带有参数 orderlag_cutoff

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

Bitcoin prices 2016–18 (in red, right axis) along with some fractional derivatives (shades of blue).

你可能已经注意到,比特币的价格在 2017 年和 2018 年经历了明显的炒作(上图中的红色曲线)。事实上,看一下一阶差异,我们会发现价格在某些日子里上涨了 2500 多美元(例如 12 月 17 日)。该图展示了一些分数阶差分的平滑函数插值。令人惊讶的是,即使对于如此强劲的趋势,大约 0.4 阶的微弱差异实际上也足以使序列平稳:给定样本的 ADF 统计量-5 已经低于 DF t 分布的临界值-2.86,因此在 95%的置信度下,可以假定序列平稳。事实上,随着财富的来来去去,很快就出现了均值回归。

对于许多其他金融时间序列来说,低阶差分足以满足平稳性的发现是相似的。

为了说明平稳性和记忆性之间的权衡,我们可以遵循[7]中的适当可视化,并绘制 ADF 测试统计数据以及与原始序列的(线性)相关性,用于以各种差分顺序转换的序列。(请注意,较低的 ADF 检验统计表明替代检验的可能性较高,即值越负,我们越有可能拒绝零假设并假设平稳性)。

对于各种典型的金融序列,如(滚动)商品期货、汇率和指数,这种比较清楚地表明,(低)分数阶差分满足金融建模的平稳性条件,同时保持特定的记忆结构,从而保持原始序列的统计动态。

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

ADF test statistics (left axis, curve in red) and linear correlation (right axis, curve in cornflower blue) with the original series for various fractional orders of differencing, applied to various Financial time series. The constant line in slate grey marks the 95% significance level of the ADF test.

结论

非常令人惊讶的是,在引入 Arfima 模型大约一代人之后,分数差分的概念似乎还没有在金融领域获得广泛的关注。在某种程度上,许多人可能归因于“市场效率”的东西可能只不过是通过不适当的数据预处理而自愿取消信息的人工制品。

我希望这篇文章能提出一个令人信服的观点,将这种有效的技术包含到您的建模工具包中。

**作者:**作为一名热情的数据科学家,我在过去四年里一直担任全球初创公司的技术主管,并实施现实生活中的人工智能解决方案。请发邮件到 simon’at’deepprojects.de 联系我。

参考文献:

[1]维基百科,平稳过程

[2]维基百科,单位根

[3]维基百科,分数微积分

[4] Grave,Gramacy,Watkins and Franzke,《长记忆简史:赫斯特、曼德尔布罗和通往阿尔菲玛之路》,1951–1980

[5]维基百科,阿尔菲玛

[6]分析 Vidhya,非平稳时间序列

[7]德普拉多,金融机器学习进展,威利 2018。

数据:

  • 以美元计价的比特币,每日收盘价,来源:公共
  • 煤炭 API 2 月期货滚动链,每日结算价格,来源:专有
  • 道琼斯指数,每日结算价格,来源:雅虎
  • SP500 指数,每日结算价格,来源:雅虎

代码:

https://gist . github . com/skuttruf/FB 82807 ab 0400 FBA 51 c 344313 EB 43466

总统魅力:你应该投票给谁?

原文:https://towardsdatascience.com/presidential-charisma-who-should-you-vote-for-2c5aabd71d8?source=collection_archive---------19-----------------------

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

Photo by Glen Carrie on Unsplash

无论是总统候选人还是电视节目主持人,有魅力的人都能传达他们的信息,更好地与他人沟通,并获得他们的信任。但是对于一个总统来说,魅力能透露出他们有可能成为多好的总统吗?

当你决定投票给一位候选人时,你是投票给体现你的政党价值观的领导人还是偏向于健谈者?

魅力型领导者迎合观众的情绪,但不仅仅如此,根据康奈尔纪事报的研究,如果人们还没有决定,投票给候选人不再是政策或经验,而是魅力。

魅力被定义为在深层情感层面影响他人、与他人有效沟通、建立强大人际关系的力量。对我们人类来说,魅力很容易被发现,但这是一种机器很难识别的特征。为了让机器理解魅力,它应该被量化。为了继续测量魅力,我将转向自然语言处理(NLP),这是人工智能与语言打交道的一部分。

总统演讲提供了一个理想的文本收集来检测模式,量化一些特征并回答我们的问题:魅力与总统在办公室的表现有任何联系吗?我们将看看数据对此有何说明。

所有数据科学发生的地方

数据收集和清理:

没有数据就无法分析,所以我开始通过寻找我能找到的所有总统演讲的文字记录来回答我的问题。幸运的是,米勒中心组织拥有美国历史上每一次总统演讲的记录,这些脚本的内容是使用 Selenium 和 BeautifulSoup 库从他们的网站上刮下来的。

现在这部分对我来说是最具挑战性的,在没有 HTML 和 CSS 经验的情况下使用 BeautifulSoup(最终我得到了一个 web-scraper 和一些 HTML 知识)。这些文字记录随后被保存到一本字典中,上面有总统的名字和相应的讲话。代码可以在这里找到,除了可视化在 Tableau 上可以在这里找到

量化魅力:

魅力是很难衡量的,但我还是打算回答如何量化它。在现代,那些利用故事和隐喻来调动情感、构建愿景并描绘愿景的领导人被认为是有魅力的。所以魅力型演讲简单地说,包含三个重要特质:

  • 使用个人观点、情感、故事和隐喻。
  • 表达情感,展示自信,传递积极的信息。
  • 简单的语言让不同的人产生共鸣。

通过使用 NLTK 库TextBlobTextstat ,这三个组件通过以下方式进行测量:

  • 可读性:Flesch 阅读难易程度基于两个因素来衡量文本难度:平均而言,一个句子中的单词更多,单词更长,或者有更多的音节。其中较高的分数表示材料更容易阅读和理解;数字越小,段落越难阅读。
  • 文本的主观性:主观句一般指个人观点、情感、故事或判断,而客观句指事实信息。主观性是一个位于[0,1]范围内的浮点数。
  • 文本的极性:这衡量文本的整体信息,它被衡量为一个位于[-1,1]范围内的浮点数,其中 1 表示肯定的陈述,而-1 表示否定的陈述。

我将魅力定义为每位总统在所有收集到的演讲中的轻松度、极性和主观性得分的平均值。

特朗普在六年级水平演讲:

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

Flesch Reading Ease Measure

从 Flesch 阅读容易度的图表来看,特朗普的阅读容易度最高,大约是六年级的水平,易于阅读(消费者的英语会话),这意味着容易被 12 岁的普通学生理解。

我们还可以看到,40 年前的大多数总统平均水平在 7 年级左右,阅读英语相当容易,除了吉米·卡特,他的英语水平在 8 到 9 年级。

对大量听众讲话意味着用我们都能理解的方式讲话,知道哪种语言能引起特定人群的共鸣能让你走得更远。我更进一步,想象了英语多年来的变化。

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

Simplicity of Language Across the Years

从上面的情节中,我们可以注意到多年来语言简化的趋势,从大学水平-难以阅读-到容易被高中生理解或在今天的政治中,被六年级学生理解。

演讲最积极的总统:

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

Presidents with Most Positive Speeches

我们可以看到,詹姆斯·a·加菲尔德、哈里·S·杜鲁门和唐纳德·川普在极性测量中得分最高。从其余的结果来看,演讲的积极性与语言的简单性不同,它更多地取决于总统的性格而不是总统任期的长短。在本分析的其余部分,我们将关注那些在办公室完成时间导致唐纳德·特朗普从最终结果中排除的总统。

谁最有魅力?

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

Charisma Measure

请记住,魅力的衡量标准取决于阅读的难易程度,也就是说,阅读的难易程度越高,你就越有魅力。很自然,杜鲁门和比尔·克林顿领先,其次是理查德·尼克松、林登·约翰逊、巴拉克·奥巴马和乔治·h·w·布什。

政治学家兼博客作者乔纳森·伯恩斯坦在《福布斯》的文章中指出,虽然像克林顿和奥巴马这样的总统仍然被认为是有魅力的,但是像尼克松、约翰逊和老布什这样的总统已经失去了他们的魅力。

办公室表现:总统历史学家调查

为了完成所需的数据,美国总统排名数据来自总统历史学家调查,该调查根据十个不同的因素对总统进行排名,如危机领导力、道德权威、与国会的关系和经济管理。

魅力和排名的相关性:

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

Correlation Between Charisma and Ranking

绩效排名和魅力是两个独立变量,我们可以在图中看到两者的散点图。它们之间的相关性等于 0.168,表明这两个变量之间的关系非常轻微。然而,假设任何一种关系都需要更全面的方法来衡量魅力,但目前我们可以得出结论,两者之间没有相关性。

“言行一致”的总统:

现在在下图中,在添加了每半个世纪的相关线后,我们可以看到一些有趣的结果;从 20 世纪 50 年代开始,总统们的得分非常接近,而之前的总统们的得分更加分散。在 20 世纪 50 年代,随着电视在美国的广泛普及,使其成为影响公众舆论的主要媒体,总统们开始更加关注他们如何向公众发表演讲。

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

Correlation Between Charisma and Ranking

看看 1850 年、1900 年和 1950 年的数据,我们可以看到魅力和排名之间的正相关,所以那个时期的总统更有可能言行一致。进入 21 世纪,我们可以看到魅力和排名之间没有相关性,几乎是一条直线。因此,在我们这个时代,总统更有可能言出必行,但这并不一定意味着他们的表现会反映出他们是多么优秀的演说家。

魅力型领导者知道什么是最好的,在某些方面表现突出,在某种意义上是当天的救星,但真正的魅力是让你能够影响别人,让你的信息被传达,不管这个信息有多有效或理智。这并不一定能让你更善于做出决定,引导一个国家朝着正确的方向前进。

这给了我们一个结论性的答案,无论一位总统或总统候选人在选举、辩论或演讲时多么有魅力,都不能说明他们当选后会有多好。所以,当你下次投票时,请记住,魅力并不能让总统成为更有效的领导者。

这个项目是作为数据艺术与科学奖学金的一部分完成的。

使用的来源:

Flesch 可读性缓解

总统历史学家调查

选民想要什么

研究人员发现,投票给候选人与政策或经验无关,而是关乎个人魅力

投票行为

2020 年初初选的新闻报道

原文:https://towardsdatascience.com/press-coverage-of-the-early-2020-primary-65695f104633?source=collection_archive---------40-----------------------

2020 年民主党总统初选早期媒体报道观察

诚然,我们仍处于 2019 年,下一届美国总统选举是在 2020 年,距离撰写本文大约 17 个月。然而,选举进程已经开始,有 20 多名个人已经宣布参选,正在争取民主党的提名。事实上,该党已经举行了第一次辩论,竞选正在进行中。

这是探究候选人投票和媒体报道之间关系的好时机。获得洞察力和建立选举状况的全面概览的一个方法是分析参与竞选活动的民调和新闻指标数据,以寻找相似性、差异和模式。通过结合这两个数据维度,我们能够更好地评估单个候选人的相对表现和定位。

以前的工作和数据

这项分析更新了之前的工作,该工作检查了 2016 年共和党总统初选的类似数据()。此外,更多信息和 2016 年和 2020 年分析的底层代码可以在我的 GitHub 网站找到。

民意调查数据来自 FiveThirtyEight ,这是一家分析服务公司,拥有一个广受欢迎的网站,提供政治、体育、科学和健康、经济和文化的定量和统计分析。新闻数据来自全球事件、语言和语调数据或 GDELT 项目。GDELT 是一个监控、存储和提供“来自几乎每个国家每个角落的世界广播、印刷和网络新闻”的项目。

辩论结果

首先要看的是上周辩论后候选人的民调表现。下图包含辩论后第一次民意调查(2019 年 6 月 28 日发布)的排名快照,以及每位候选人相对于之前民意调查平均值的变化。从这一点上,我们注意到乔·拜登领先,他的民调结果在辩论后没有太大变化,尽管人们普遍认为他在舞台上表现不佳。许多人认为卡玛拉·哈里斯和伊丽莎白·沃伦表现出色,两个国家的民调都大幅上升。其他几名候选人,特别是贝托·奥罗克,从相对较低的水平下降。

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

新闻报道

绘制民意测验排名与媒体报道量的对比图是很有帮助的。下面的图表包含平均投票表现与平均投票周期之间出现的文章的平均数量,10 个候选人具有最高的平均投票。正如所料,两者之间存在积极的关系,领先的候选人获得了最多的报道。

在这张图表中,拜登似乎是一个明显的领先者,在民意调查中大幅领先,比任何其他候选人都有更多的媒体报道。伯尼·桑德斯的新闻报道与他在民调中的第二名一致,但鉴于他 2016 年的总统竞选和长期的公共存在,人们可能会认为新闻报道的数字更接近拜登。沃伦和哈里斯的民调数字相似,但沃伦吸引了更多的媒体报道。有趣的是,奥洛克和哈里斯的文章数量相似,但在民意调查中似乎朝着相反的方向发展,看看他们各自的新闻报道指标是否有所不同将是一件有趣的事情。

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

音调

GDELT 项目追踪的一个属性是文章语气的度量。关于声调的更多信息可以在 GDELT 文档中找到,但是,总而言之,它测量的是正负词频之间的差异。虽然它的范围可以从-100 到+100,但这里检查的文档的分数集中在零附近,对于这些数据,相对较小的差异是显著的(例如,涵盖 Warren 的文章的平均色调平均值在统计上不同于 0 和-0.5)。

绘制民意测验表现与这一指标的关系图很有帮助,这些指标是引用每个候选人的文章的平均值。即使平均色调较小,也会出现明显的模式。从下图中可以看出,候选人可以分为两组,分别用矩形和椭圆形表示。与奥罗克、皮特·布蒂吉格、科里·布克和艾米·克洛布查尔相比,沃伦、哈里斯、桑德斯、柯尔斯顿·吉利布兰德和拜登在报道中都看到了更多负面论调。

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

极性

GDELT 项目还测量文档极性,并绘制候选人之间的投票结果与该值的关系图,这也产生了有趣的结果。较高的值与文档中极化语言的较高流行度相关联。

在这种情况下,我们看到一组四个领先的候选人,拜登,桑德斯,沃伦和哈里斯,都比其余的前 10 名领域获得更高的极性覆盖。在这个群体中,桑德斯的报道具有最高的极性平均值。鉴于人们认为他的政策立场偏左,这可能是意料之中的。同样有趣的是,拜登的报道没有哈里斯、沃伦和桑德斯那么两极化。

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

概括起来

虽然现在显然还处于 2020 年民主党总统初选的早期,但潜在选民已经被要求开始形成观点,并在一个大型候选人中选择领导人。收集和分析这些候选人的数据是获得这些观点的本质的一种方法。

从这项工作中,我们看到领先的候选人享有最多的新闻文件。然而,与观察到的中层参与者相比,这种报道具有更消极的基调和更高的极性。此外,在领先的种族中,这些指标明显不同,其中一些具有特别负面和两极化的报道。

Python 中柱状数据的漂亮展示技巧

原文:https://towardsdatascience.com/pretty-displaying-tricks-for-columnar-data-in-python-2fe3b3ed9b83?source=collection_archive---------2-----------------------

改进 Python 及其库显示数据的方式,并使其可读

对于以前使用 lists、Pandas 或 NumPy 广泛争论过数据的每个人来说,您可能都遇到过以正确的方式打印数据的问题。特别是如果有很多列,显示数据就变得很麻烦。本文向您展示了如何以可读的方式用 python 打印大型列数据。

为了解释清楚,我使用的是 NYC 房产销售数据,总共有 21 列。

如果您有一个包含许多列的 Pandas 数据帧,并试图用常规的 print 语句将其打印出来,就会发生这种情况:

**import** pandas **as** pdnycdata=pd.read_csv(**'nyc-rolling-sales.csv'**,index_col=0)print(nycdata.head())

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

Data is omitted from printing

发生这种情况是因为 Pandas 将检测它可以在终端窗口空间中容纳的列数,这将不会准确显示我们需要的内容。为了节省屏幕上的终端空间,打印时会忽略大部分数据。

要解决这个问题,这里有一些方法。

好的绝招

您可以增加 Pandas 允许您显示的最大列数,方法是在代码中添加以下代码行:

pd.options.display.max_columns = **None**

这将取消屏幕上显示的最大列数限制。以下是打印时的样子(现在只打印前 11 列…)

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

Print result after removing max column limit

但是,嘿,这并不完全是我们所需要的。数据被分成多行,标题由反斜杠分隔。这是可读和有用的,但仍不完美。

要克服这一点,只需在代码中使用这一行,就可以在一行中获得所有数据:

pd.options.display.width=None

这是它现在的样子(只打印了 7 列):

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

Print result after removing max width limit

注意——大多数代码编辑器不会以一种好的方式显示大块的列数据。您的输出将以一种完全不可读的方式变得混乱,并且您需要最大化您的输出窗口以便很好地查看所有的数据。PyCharm 在这种情况下做得非常好——它向您显示了一个水平滚动条,您可以在这里滚动浏览您打印的数据。标准终端或编辑器(如 VSCode)不会出现这种情况。

如果您使用终端或 VSCode,请将窗口最大化并减小字体大小,以便您可以在有限的空间中容纳最多的列,并且可以很好地查看您的数据。

这是完整数据在终端输出中的显示方式(VSCode 以同样的方式打印):

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

All columns in Terminal

这是 PyCharm 展示相同数据的方式:

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

PyCharm’s scrollbar print

如果您正在使用 PyCharm,并且希望显示与上述类似的数据,或者如果您认为最大化和缩小字体大小是可以接受的,这里有一个更好的方法来显示您的数据。

更好的绝招:

您可以使用名为“制表”的库来轻松显示列中的数据。这就像将一个简单的函数封装到数据帧上使用的打印函数中一样简单。

**from** tabulate **import** tabulate
.
.
.
print(tabulate(df,headers=**'firstrow'**))

这就是制表显示数据的方式:

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

Tabulate’s print

为了去掉 print 语句中多余的代码行,可以这样编写一个简单的 lambda 函数:

**from** tabulate **import** tabulate
pdtabulate=**lambda** df:tabulate(df,headers=**'keys'**)
.
.
.
print(pdtabulate(df))

更神奇的是,你可以从多种格式中选择打印格式。你所需要做的就是将’ tablefmt '参数添加到制表函数中,并为其分配你选择的打印格式。我最喜欢的是“ psql ,它使用 PostgreSQL 的格式来显示表格数据。

**from** tabulate **import** tabulate
pdtabulate=**lambda** df:tabulate(df,headers=**'keys'**,tablefmt=**'psql'**)
.
.
.
print(pdtabulate(df))

这是它看起来的样子:

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

Feels like SQL!

如果您有必要将数据转换成 HTML 表格,制表很容易为您做到这一点。

**from** tabulate **import** tabulate
pdtabulate=**lambda** df:tabulate(df,headers=**'keys'**,tablefmt=**'html'**)
.
.
.
print(pdtabulate(df))

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

Data printed to HTML Tables

即使对于大型列表和巨大的 NumPy 数组,制表也非常有效。

**from** tabulate **import** tabulate

pdtabulate=**lambda** df:tabulate(df,headers=**'keys'**,tablefmt=**'psql'**)#Creating a list using garbage values
list = [['a', 'b', 'c','d'], ['aaaaaaaaaa', 'b', 'c'], ['a', 'bbbbbbbbbb', 'c'], ['aaaaaaaaaa', 'b', 'c'], ['a', 'bbbbbbbbbb', 'c'], ['aaaaaaaaaa', 'b', 'c'], ['a', 'bbbbbbbbbb', 'c'], ['aaaaaaaaaa', 'b', 'c'], ['a', 'bbbbbbbbbb', 'c']]print(pdtabulate(list))

这是它看起来的样子:

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

Normal vs tabulated prints of 2D lists

下面是一个使用制表可视化的示例 NumPy 数组:

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

Normal vs tabulated prints of a simple NumPy array

更多关于这个令人惊叹的图书馆的信息和更多关于不同印刷格式的知识,请访问本页

虽然这些技巧会很有帮助,但下面的技巧尽可能以最好的方式展示了我们的数据。

最好的绝招:

忘掉 PyCharm、终端和制表软件吧——用 Jupyter 笔记本来显示你的数据。

Jupyter 笔记本显示您的数据类似于第一种开箱即用的情况——它们在显示中省略了几列。

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

Data displayed in a Jupyter Notebook — few columns are omitted

为了解决这个问题,使用打印示例中使用的同一行来显示数据的所有列:

pd.options.display.max_columns = **None**

Jupyter 向您展示了一个完美格式化的 HTML 表格:

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

Data after removing max column limit

一天的结束…

如果你习惯经常使用 Jupyter 笔记本,只需将最大列数设置为无,就可以一次显示所有数据。但是如果你是一个喜欢在编辑器中编写代码,而不是使用 Jupyter 笔记本来理解数据的人,那么使用制表库是最好的选择。

防止机器学习模型中的数据泄漏

原文:https://towardsdatascience.com/preventing-data-leakage-in-your-machine-learning-model-9ae54b3cd1fb?source=collection_archive---------5-----------------------

在建立机器学习模型时,关于防止数据泄漏,您需要知道的一切。

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

Photo by Luis Quintero from Pexels

数据泄露问题

机器学习算法制作预测和分类数据的模型。常见的最佳实践是首先将可用数据集分成两个训练和测试数据子集。之后,使用训练集对模型进行训练,并通过将其性能与测试集的性能进行比较来衡量其成功。

但是如果模型在被训练的时候暴露在测试数据中会怎么样呢?

这就是数据泄露的问题——当用于训练模型的数据恰好包含试图预测的信息时。如果一个模型暴露于测试数据,那么它当然会在预测/分类它被训练来预测/分类的测试数据方面表现得更好。

如果未被检测到,数据泄露可能会导致问题,包括:

  • 实验室中夸大的模型性能,以及
  • 与真实数据一起部署时性能较差。

使用机器学习算法来建立模型的目的是模拟现实世界中看不见的数据,并找出如何一致地预测或分类数据。但是,如果发生数据泄漏,一个模型不太可能在现实世界中用新数据很好地概括。因此,在开发模型时,必须采取措施防止数据泄漏。

帮助防止数据泄露的 6 种方法

  1. 了解数据集
  2. 清除数据集的重复项
  3. 选择关于目标变量相关性和时间排序的特征
  4. 将数据集分为训练组、验证组和测试组
  5. 在分割之后、交叉验证之前进行规范化
  6. 以健康的怀疑态度评估模型性能

1.了解数据集

不言而喻,为了能够执行有效的分析和开发合理的模型,关于您正在处理的数据集的知识是必要的。

然而,在数据泄漏方面,很少提到的是,在将数据分成训练-验证-测试组之前,您应该避免研究数据集的分布或基本统计数据(稍后将详细介绍如何分割数据集)。如果您在分割之前检查您的数据,您将获得关于可能在您的测试组中结束的数据行的见解,这实际上是数据泄漏。

2.清除数据集的重复项

数据清理是大多数(如果不是全部)数据科学项目的必要步骤。一个常见的数据清理任务是处理具有重复信息的行。在数据泄漏的情况下,重要的是删除重复的行,这样就不会在训练组和测试组中都出现重复的行。

3.选择关于目标变量相关性和时间排序的特征

防止数据泄漏的下一个重要步骤是选择与目标变量不相关且在预测时可用的特征或独立变量。

考虑目标变量相关性

如果一个变量与目标变量高度相关,无疑会增加你的模型对目标的预测能力。例如,如果您的目标变量是家庭收入,并且您将家庭支出作为一个特征包含在您的模型中,那么很有理由认为您的模型会更好地预测家庭收入,因为家庭支出是家庭收入的一个非常直接的指标。因此,为了防止数据泄漏,最好从模型中省略这些特征。

考虑时间排序

用未来数据预测过去是数据泄露的一种形式。时间序列数据、预测发生时不可用的特征或关于未来数据的分类特征都是与数据的时间顺序(顺序计时)相关的数据泄漏威胁。

当处理时间序列数据时,挑战在于确保不将关于未来的信息泄露给过去。例如,将 2019 年的数据包括在一个模型中,该模型被训练来对 2018 年进行预测。克服时间序列数据泄漏的一个选择是对每个时间段进行训练-验证-测试分割。

另一种选择是移除在预测时不可用的所有数据/ 特征。例如,关于客户是否会拖欠贷款的信息可能要到客户实际拖欠并且贷款已经被批准之后才可用。因此,如果有关延迟付款状态的信息包含在决定是否批准向该客户提供贷款的模型中,将会出现数据泄漏,从而使模型在现实环境中变得不切实际。

此外,有必要研究一下标记未来信息的分类特征。例如,基于高购买频率,客户可能被标记为“大买家”,但是如果模型试图预测哪些客户将是频繁的回头客,此信息将导致数据泄漏。

关于在使用时间序列数据检验时防止数据泄漏的更多信息 Rafael Pierre 的" 数据泄漏,第一部分:认为你有一个很棒的机器学习模型?再想想 ”并且为了更深入的解释时态排序,checkout Devin Soni 的“ 机器学习中的数据泄漏

4.将数据集分为训练组、验证组和测试组

将数据分成两组,训练组和测试组,是标准的做法。但是,我建议更进一步,将数据分成三组——训练组、验证组和测试组。有了三个组,您就有了一个验证组来帮助超调模型参数,以及一个在模型调优后使用的最终测试组。

**分割后,不要在验证和测试集上执行探索性数据分析——只对训练集执行!**通过检查验证或测试集的洞察力生成的任何附加特征或模型更新都是数据泄漏的实例。

分区是将数据集分成训练、验证和测试组时要考虑的一个重要步骤,因为有多个行来自同一个源。分区包括对该源的行进行分组,并且只将它们包含在一个分割集中,否则来自该源的数据将会在多个集中泄漏。

5.在分割之后、交叉验证之前进行规范化

很多机器学习算法都需要归一化。但是,在拆分数据后进行规范化非常重要。如果在分割前进行归一化,用于归一化数据的平均值和标准差将基于整个数据集,而不是训练子集,因此会将有关测试或验证集的信息泄漏到训练集中。

将数据拆分为训练集、验证集和测试集后,最佳方法是首先规范化训练集,然后将训练集规范化的平均值和标准差应用于验证集和测试集规范化。

但是,如果您计划使用网格搜索交叉验证来超调参数,如果在交叉验证之前进行,缩放训练集将导致数据泄漏,因为交叉验证进一步将训练集划分为附加的训练集和测试集。建议将 Pipeline 与 GridSearchCV 配合使用,以便通过标准缩放器等数据预处理程序更恰当地缩放数据。我在下面附上了一个代码截图,它使用管道在使用 GridSearchCV 时适当地缩放数据。

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

6.以健康的怀疑态度评估模型性能

最后,但同样重要的是,在评估模型性能时,保持健康的怀疑态度是很重要的。

多个来源警告数据科学家,当一个模型具有高性能分数时,要感到疲倦,因为优秀的分数可能表明数据泄漏。以下是评估模型性能时需要考虑的六点。这些问题的答案可能会暗示数据泄露是否正在发生。

考虑使用的机器学习算法

在评估你的模型的时候,先想想正在使用的机器学习算法。算法是在复杂问题上表现良好的弱算法吗?该算法过去是否用于类似的数据/问题?与您当前模型的性能相比,该算法在过去案例中的性能如何?

与基线比较

回头看看你的基线模型,寻找“好得令人难以置信”的表现

合理化功能重要性

如果你的算法返回特征重要性,试着想出一个合理的解释来解释为什么每个重要的特征是重要的。如果不存在逻辑上的原因,就有数据泄露的可能。也试着一次从你的模型中去掉一个特性,如果性能急剧下降,那么被去掉的特性有可能包含泄漏。

使用多个指标

建议在评估模型性能时使用多种方法。如果您只使用一个指标(例如准确性),该指标可能会隐藏其他指标可能会发现的数据泄漏。

检查训练集和测试集分布

在拟合模型和测量性能之后,探索训练、验证和测试组的分布以发现差异和可以解释结果的任何模式将是有益的。

使用新的验证集进行测试

最后,如果您有资源,检索更多的数据来测试模型在尽可能接近现实的新验证集上的性能总是有利的。

使用机器学习预防心脏病死亡

原文:https://towardsdatascience.com/preventing-deaths-from-heart-disease-using-machine-learning-c4f8dba250c6?source=collection_archive---------8-----------------------

心脏病正在夺去全世界数百万人的生命。而机器学习或许可以帮助解决这个问题。

世界上最主要的死亡原因是什么?

癌症?

号码

伤害/事故?

不。继续努力。

呼吸道疾病,糖尿病,老年痴呆症?

不,不,不。

导致死亡的主要原因是心脏病。

自 2000 年以来,它一直是导致死亡的主要原因。

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

Source: WHO

每年有 50 多万美国人死于心脏病,如冠状动脉疾病、心血管疾病和心绞痛。(精确到 61.3 万)。医疗保健服务和心脏病药物每年花费美国近 2000 亿美元。

因此,50 万人失去了生命,2000 亿美元花掉了

每,

单个,

用于心脏病。(仅在美国)

嗯,现在很糟糕,但是未来会是什么样子呢?

2030 年,美国心脏协会预计治疗心脏病的费用将上升到 8180 亿美元。美国将有 1.16 亿人患有某种形式的心血管疾病。

人们患心脏病有两个主要原因

问题的一半是遗传。人们生来就有基因突变,这增加了他们患心脏病的可能性。不幸的是,我们现在无法控制这一点,但通过像 CRISPR 这样的基因编辑技术,我们也许可以在未来防止这一点。

问题的另一半是糟糕的生活方式。人们每天都会做出导致心脏病的糟糕决定。

我们可以将这些因素分为四类。

  1. 缺乏运动——35%心脏病的原因。
  2. 肥胖——2700 万美国人患有由肥胖引起的心脏病
  3. 吸烟——20%的心脏病死亡与吸烟直接相关
  4. 不良饮食美国有 50 万人因为高脂肪饮食而患心脏病。高胆固醇占心脏病患者的 15%。糖尿病占心脏病患者的 11%。

所有这些因素都有一个共同点。他们都在我们的控制之下。我们可以决定是否要锻炼、吸烟和保持健康的饮食。这是一个选择。因此,如果这些人做出更明智的决定,这些因素导致的死亡是可以避免的。

为了做出明智的决定,人们需要信息。

让我们预防心脏病造成的死亡。

首先,快速回顾一下。我们知道很多人死于心脏病,如果人们选择更好的生活方式,一半的死亡是可以避免的。那么我们如何做到这一点呢?

使用一种叫做机器学习的人工智能子集,我们可以在某人死于心脏病之前预测他患心脏病的可能性。如果人们知道他们患致命疾病的可能性,这将鼓励他们做出更明智的生活方式选择。从而减少死于心脏病的人数。

这将如何工作?

我们可以使用机器学习算法来获取信息,并对一个人是否可能患有心脏病进行分类。

使用 UCI 机器学习知识库中的 Cleveland 数据集,我自己进行了试验。

该模型接受了每个人的 13 个不同的数据点。

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

13 different attributes in Cleveland Heart Disease Dataset

我实现了一个支持向量机(SVM)

下面是外行人对支持向量机的解释。

**SVM 是一种执行分类任务的监督学习算法。**简单地说,它使用带标签的数据来区分输入的类别。

这是一个关于其工作原理的类比。

你是一所中学的老师。一天,你在中学操场上巡逻,确保每个人都安然无恙。突然,六年级学生和八年级学生之间爆发了一场打斗。作为一名教师,你需要做三件事。

  1. 把八年级和六年级的学生分开
  2. 不要和任何一方有任何身体接触。
  3. 保护你的生命:)

该字段如下所示:

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

Middle school field

在你的第一次尝试中,你成功地分开了六年级和八年级的学生,但是你和他们发生了身体接触,并且冒着生命危险接触了荷尔蒙分泌旺盛的八年级学生。

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

所以你再试一次:

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

Excellent SVM

第二次尝试非常成功。你不仅救了自己的命,还提醒你,你的学校教育终于是值得的。Jk,但是你在 1 号位做得很好。把八年级和六年级的学生和 2。最大化每个中学生与自己的距离。

这是一个非常好的支持向量机算法的例子。

在这个例子中,我们的两个班级是八年级和六年级。我们正试图将这两个阶层区分开来。

老师代表一个超平面。我不打算在本文中解释什么是超平面,但它可以被认为是进行分类的直线。

SVM 的目标是找到一个最优的分离超平面。

在上面的例子中,我们正是这样做的,因为我们对两个类进行了分类,并最大化了从蓝线到每个输入的距离。这也证明了为什么我们当老师的第一次尝试不那么顺利。我们没有找到最优分离超平面。

我们老师(蓝线)可以认为是一个超平面。最佳分离超平面的作用是对班级进行分类,在这种情况下是八年级和六年级,并最大化每个输入和完成的线之间的距离。

概括地说,SVM 是一种机器学习算法,它使用超平面来划分类别。最优分离超平面是它旨在用于类别之间的分类。可以用 1 来区分。准确地分离所有的类和 2。最大化每个输入和超平面之间的距离。

使用 scikit-learn,一个机器学习包,我实现了一个 SVM 来对心脏病高概率人群和低概率人群进行分类。

[## 布里安纳戈保罗/心脏病

使用克里夫兰心脏病数据集,我实现了一个 SVM 来分类某人患心脏病的可能性…

github.com](https://github.com/BriannaGopaul/heartdisease/blob/master/Heart%20Disease%20Notebook.ipynb)

不幸的是,我得到了大约 62%的准确率,这不足以在现实世界中使用。经过更多的研究,**我了解到三件事。**首先,支持向量机并不擅长多类分类任务。其次,我需要更好地预处理更多的数据。这是我现在正在学习的东西,我重申。第三,在网上找到开源的健康数据真的很难。

尽管机器学习是一个非常新颖的领域,但如果数据科学家和机器学习专家能够获得开源的健康数据,我们将有望解决我们目前在医疗保健领域面临的许多问题。我们现在还没有达到预防心脏病死亡的阶段,但这是做类似事情的起点。

我接下来要做的:

为了继续开发人工智能知识库,我将在吴恩达的机器学习课程上取得更多进展,并致力于更多的项目来应用我的知识。

如果你想了解更多关于我参与的其他项目,请查看我的作品集 这里 和我联系linked ln

防止信贷模型中的歧视性结果

原文:https://towardsdatascience.com/preventing-discriminatory-outcomes-in-credit-models-39e1c6540353?source=collection_archive---------27-----------------------

机器学习正在被部署来进行大规模决策,这可以强烈影响个人的生活。如果不考虑和分析这种情况,我们最终可能会构建出无法平等对待社会、甚至违反反歧视法的模型。

有几种算法干预来识别不公平待遇基于什么被认为是*公平。*在本文中,我们将通过一个案例研究来探讨这些方法,并解释它们的优点和局限性。

👩🏻‍💻你可以在这个 Github 库中找到完整的 python 项目。

❗️Warning::这篇文章包含了很多关于混淆矩阵和相关指标的信息。

1)歧视的来源

尺寸

在机器学习中,我们的世界被测量并存储在数据集中。这种实践的最大挑战是它本质上是主观的。人类需要想出最佳的标签来对我们的世界进行分类,这可能会导致*选择偏差。*不仅目标变量可能对所有群体都不正确,而且收集的描述它的信息也不正确。

在技术方面,数据集也可能有不正确、不完整的 和/或 过时的 信息(阅读 美国各地的警察正在根据伪造的数据 ) 。同样重要的是要记住,随着世界的变化,描述世界的标签也在变化。这会导致对我们周围环境的过时描述。

最后,我们还有*宣扬历史偏见,*陈规定型观念和污名被保留为常态。

学问

模型从数据中学习,以检测模式并对其进行归纳,这可能包括数据差异、失真和偏差。即使我们没有明确提供敏感信息以避免偏见,也有几个代理可以近似它*(阅读* 性格测试不合格美国工人 )。

与此同时,随着更多相关信息的提供,模型工作得更好。少数群体默认处于劣势,因为他们通常没有多少数据可供模型学习*(阅读* 亚马逊废弃的秘密人工智能招聘工具,该工具显示出对女性的偏见 )

动作

一个动作是来自一个模型的一个决策,比如批准一笔贷款或者显示一个广告。当一个模型被校准时,很可能会对不同的组产生不同的误差率。在这个群体中缺乏分析会导致不公平的待遇(我们将在后面的案例研究中修改这一点,另外,请阅读 ProPublica 的 机器偏见)。

反馈

一些模型从用户交互中获得“反馈”来改进模型。在这里,我们会遇到以自我实现预测形式出现的歧视问题。当数据有偏差时,不公平的预测往往会被证实。在这种情况下,人类将受到影响,以使他们的反应验证不公平的预测*(阅读* 美国各地的警察正在训练基于伪造数据预测犯罪的人工智能 )

2)算法干预

在本节中,我们将回顾五种不同的实践,这些实践被认为是在有监督的机器学习中测量不公平性的。

无知中的公平

当我们通过简单地排除受保护的类来运行模型时,就是这种情况。这个概念在确保公平性方面非常低效,因为有大量的代理可以预测这些属性。

人口均等

人口均等要求每个群体都有资格以相同的频率获得贷款。这也意味着决策应该独立于受保护的属性 a。这可以描述为下面的等式。

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

对于信贷模型,这可以解释为合格贷款的比例在集团的所有类别中都是相同的(正利率相等)。

均等机会

机会均等意味着在“有利的”结果中,正确分类的成员的比例,即 Y=1,在所有组中应该是相同的。例如,当一个条目被认为是“没有拖欠贷款”时,我们可以考虑“有利的”结果。对于中的所有受保护类,以下条件必须成立。这可以用下面的等式来表示:

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

这一概念通常会带来更好的效用,但与人口均等一样,它会用不太准确的假阳性来惩罚某个阶层。

在实践中,这需要两组的真实阳性率 A=1 和 A=0 相同。

均等几率

与机会均等一样,均等几率也要求“优势”结果中正确分类的成员比例在组内所有级别中相同。然而,它也要求“优势”结果中错误分类成员的比例在相应组的所有类别中相同。这可以用下面的公式表示:

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

这意味着不仅每组的真阳性率应该相同,假阳性率也应该相同。

3)案例研究

在这个案例研究中,我使用了 Bondora 的一本公共贷款书,这是一个位于爱沙尼亚的 P2P 借贷平台。我观察了两个不同的保护组:性别年龄

Bondora 向信用较差的客户提供贷款,违约率比传统银行高得多。这意味着收集的利息要高得多。该数据集的贷款金额平均约为 2100€,支付期限为 38 个月,利率为 26.30%。

对于传统银行来说,假阳性(对违约贷款进行错误分类)的成本比真阳性(对非违约贷款进行正确分类)的回报高很多倍。鉴于与银行相比,Bondora 收取的利率更高,出于说明的目的,我将假设报酬与成本之比在 1 比 2 时要小得多。这将用于找到最佳阈值,以最大化利润,同时满足每个算法干预的所有要求。

然后,我开发了一个分类模型,使用梯度增强决策树技术预测贷款是否可能被偿还。根据模型预测的结果,我分析了以下场景:

  • 利润最大化对每一组采用不同的分类阈值,仅追求利润最大化。
  • 无意识公平在实现利润最大化的同时,对所有群体使用相同的分类阈值。
  • 人口统计学奇偶校验对每组应用不同的分类阈值,同时保持每组的阳性率相同。
  • 机会均等对各组使用不同的分类阈值,但各组真实阳性率保持不变。
  • 等概率对各组适用不同的分类阈值,但保持各组真阳性率和假阳性率相同。

简要数据探索

我选择了 Bondora 平台上发放给爱沙尼亚居民的所有贷款。从访问之日起,总共有 21,450 个条目。发放给女性的贷款占所有贷款的 39%,而发放给男性的贷款比例为 61%。40 岁以下的人获得贷款的比例为 63%,而 40 岁以上的人获得贷款的比例为 37%。

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

整体违约率约为 42%。如果我们按性别调查违约率,我们会发现两组的违约率几乎相同,都在 44%左右。如果我们研究一下年龄,40 岁以下的人违约率略高,约为 45%,而 40 岁以上的人违约率为 42%。

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

ROC 和 AUC

我们现在来看看每组班级的 ROC 曲线。我们将在曲线中注意到的差异(例如男性对女性)是由于真阳性率和假阳性率的差异。较低的曲线,因此具有较低的 AUC 值,表明这些类别的预测不太准确。

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

如果我们观察上图中性别的 ROC 曲线,我们可以注意到女性的曲线在大多数情况下低于男性的曲线。因此,我们可以看到女性的 AUC 值为 0.760,略低于男性的 0.767。

如果我们看同样的图表,但这次是年龄组,我们可以注意到 40 岁以上的人的线通常在 40 岁以下的人的线之上。值得注意的是,在邦多拉的贷款记录中,40 岁以下人口的比例远远高于 40 岁以上人口的比例。这意味着描述 40 岁以下人群的其他特征可能是必要的。

对于每个组中确定的差异,我们可以开始考虑所使用的特征集合可能更能代表男性和/或 40 岁以上的人。该数据集可能偏向于男性,通常是年龄较大的男性,因为从历史上看,这些数据更易于研究和使用。

算法干预(性别)

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

当查看每个性别的真阳性率和假阳性率的细分时,我们可以注意到利润水平变化很小,除了利润最大化干预。在这种情况下,我们可以看到该模型对男性(73%)的阳性分类优于女性(70%)。然而,它也向将拖欠男性(33.6%)贷款的人提供了比女性(32%)略高的贷款比例。

当看利润时,这在均等赔率算法干预下明显下降。这是因为使用了更严格的阈值。女性和男性组的阈值分别为 0.56 和 0.55,而所有干预措施使用的平均阈值女性为 0.49,男性为 0.48。

算法干预(年龄组)

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

如果我们现在看看年龄组,我们可以看到,当我们为所有群体选择一个共同的阈值时,*群体不知情,*我们倾向于更好地将贷款分类给那些能够偿还 40 岁以上的人,而不是 40 岁以下的人。假阳性率保持不变。

人口统计均等的情况下,40 岁以下的人(13%)比 40 岁以上的人(11%)收到无法偿还的贷款的风险略高。对来说,利润最大化正好相反。

另一方面,均等机会以及均等几率在组中每个类别的真阳性率和假阴性率之间的权衡方面提供了更好的平衡。

然而,由于非常严格的阈值导致较小的假阳性率,利润在均衡赔率中显著下降。女性使用的阈值为 0.83,男性为 0.81,而所有干预措施使用的平均阈值为女性 0.69,男性 0.68。

4)结论

在这篇文章中,我们修正了在监督机器学习中歧视是如何发生的。然后,我们研究了不同的算法干预,以确定受保护群体中的某些阶层是否受到了不公平的待遇。我们修正了每种干预的陷阱,并用一个具体的例子进行了评估,这个例子使用了 P2P 贷款平台 Bondora 的公共贷款书。

当使用梯度推进决策树分析基于性别和年龄的模型的结果时,我们可以立即注意到,当对每个类别(例如,女性/男性)使用不同的无限制阈值时,利润最大化。然而,各组间真阳性率的比例不同。

均等机会均等优势在保护组中每一类的真阳性率和假阴性率之间的权衡方面提供了更好的平衡。然而,在均等赔率中,我们可以看到利润受到了重大影响。

这种简单的后处理分析具有不涉及修改复杂模型的好处。它可以用来衡量不公平性,帮助利益相关者在特定阶层受到不公平待遇时采取行动。它还鼓励确保以公平的方式收集信息,并确保用于描述目标变量的特征能够代表群体中的每个类别。

最后,这种分析并没有质疑模型的因果推理。使用的标准是简单的观察性的,只取决于预测因子、保护属性、特征和结果的联合分布。

我能看看代码吗?

我已经在 Github 上公开了我的代码。我希望听到您的反馈和改进建议🙌🏼。

参考

数据

邦多拉的贷款簿。上市时间:https://www.bondora.com/en/public-reports【2018 年 8 月 18 日上市】

主要文献

巴罗卡斯,s .,哈特,M. &纳拉亚南,a .,2018。公平和机器学习。可用时间:【http://fairmlbook.org/】【2018 . 8 . 29 访问】。

Dwork,c .等人,2012 年。通过意识实现公平。在第三届理论计算机科学创新会议论文集中。12 年的 ITCS。美国纽约州纽约市:美国计算机学会,第 214-226 页。

Hardt,m .等人,2016 年。监督学习中的机会均等。在神经信息处理系统的进展。第 3315-3323 页。

彼得雷希博士,鲁杰里,南 T21【图里尼,女,2008 年。歧视感知数据挖掘。第 14 届 ACM SIGKDD 知识发现和数据挖掘国际会议论文集*。08 年的 KDD。美国纽约州纽约市:美国计算机学会,第 560-568 页。*

防止不平衡数据导致恶劣分类:卫星图像说明

原文:https://towardsdatascience.com/preventing-imbalanced-data-from-leading-to-abominable-classification-a-satellite-imagery-d2fecdac7d93?source=collection_archive---------35-----------------------

使用卫星图像识别城市区域

不平衡的数据如何在分类中造成破坏,以及用于解决这一问题的技术的发展。

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

Photo by Matthew Henry on Unsplash

不平衡数据:意味着什么?

当属于数据集的一个类的实例的出现是海量而属于其他类的实例是百万分之一的时候,我们称之为不平衡数据集。

“一个好的榜样远胜于一句好的箴言.”― 德怀特·l·穆迪

话虽如此,不平衡数据的典型例子是将电子邮件分类为垃圾邮件或垃圾邮件、欺诈检测等。你也可以在 Kaggle 上找到与之相关的数据集。

究竟是什么让我选择了卫星图像?

嗯,答案就藏在问题本身!让我引用一段话来解释一下:

“当你看到卫星的数量、它们在做什么以及它们代表什么时,这真的是一个试图将世界掌控在你手中的愿景。”

特雷弗·帕格伦

这听起来一定有些哲学意味。下面是一些实用的例子:

“卫星记录了我们看不到的光谱不同部分的数据。正是这些信息让卫星在观察植被健康等方面变得如此强大,找到可能表明石油储藏或某种可以开采的矿物储藏的不同地质类型。”

“科学家利用卫星追踪天气、绘制冰盖融化图、检测疾病、展示生态系统变化……这样的例子不胜枚举。我认为几乎每个科学领域都受益于或可能受益于卫星图像分析。”

莎拉·帕尔卡

为了更深入地挖掘这一点,维基百科在此提供帮助。

**注:**如果你是遥感新手,那么加拿大测绘与地球观测中心(或加拿大遥感中心)的遥感教程是你的绝佳资源。

好吧!现在让我们动手对卫星图像进行分类。

意图:

这里的意图很简单,但却很有效。我们感兴趣的是从卫星图像中找出城市区域(标记为建筑,搁置图像的其余部分(标记为非建筑)。通过卫星图像监测城市地区有利于城市规划、可持续发展以及在灾害发生时快速更新城市地区地图。此外,它在研究城市扩张对生态系统和环境的影响方面也很突出。

数据:

我使用2A 哨兵,1C 级数据美国地质调查局(USGS)网站下载位于印度北方邦西部的城市莫拉达巴德作为我的研究区域。首先,预处理卫星图像是必须的。然而,1C 级产品是大气顶部反射率数据,在进行正射校正的同时,还进行了辐射测量和几何校正。

**花絮:**预处理卫星图像,为机器学习估值器预处理数据(均值去除和方差缩放等。)就像粉笔和奶酪一样,也就是说,他们不一样。

四个波段【2(蓝色)、3(绿色)、4(红色)、8(近红外)】以 10m 空间分辨率合成并裁剪到研究区域。使用研究区域的 4 波段-10m 合成和组合掩膜进行分类。

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

‘Copernicus Sentinel data [2018]’ . 4-Band False Color Composite (FCC) of the Study Area. Think of it as the input variable X

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

Built-up Mask of the Study Area. Think of it as the target variable y.

一个在不平衡数据上训练的模型差一张牌就有一副牌了!

考虑二进制分类问题,如果负类的实例数量比正类的实例数量多得多,那么模型将总是试图预测负类,以便达到高精度。但这确实会产生误导。

该场景可能如下所示:

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

让我们通过数据集深入了解一下这个场景。

我使用 GDAL python 包获取复合图的栅格波段作为数组,并将数据转换为 CSV 文件格式。然而,这不是强制性的,只是为了方便起见。

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

从条形图中可以明显看出,我们的数据集是高度不平衡的,81.86%的非构建类(负类)和仅 18.14%的构建类(正类)。

如果我们试图在这种数据上训练我们的模型,它将成为所谓的准确性悖论的牺牲品。更详细地说明这一点,我们的模型将试图揭示隐藏在准确性伪装下的类分布。

寻找灵丹妙药:

有几个博客是关于对抗不平衡班级的技术的。但是,我发现这个像一个光滑的迪斯科球一样闪闪发光。

我发现下面的技巧比其他的更有吸引力。

  1. 使用流行的决策树算法,随机森林就是其中之一。
  2. 通过使用 SMOTE(合成少数过采样技术)生成合成样本,对少数类进行过采样。

这篇博客的重点将是上面列出的两种技术中的第一种。

这个问题被分解为 3 个简单的步骤:

  1. 使用 scikit-learn 的 train_test_split 辅助函数对数据分割应用随机森林分类器,并决定用于我们数据的性能指标。
  2. 通过分层 K 倍 交叉验证更进一步。
  3. 使用网格搜索交叉验证调整模型的超参数。(将在本博客的后续部分全面讨论)。

第一步

随机森林分类器:

决策树打包 (Bootstrap Aggregating)有一个概述是继续之前的先决条件。

通俗地说,随机森林是通常用于*【恰当】*对抗决策树的高方差(过拟合)的决策树集合。与 Bagging 不同,随机森林限制了在每次分裂时要评估的特征,即,在每次分裂时使用特征的随机子集,导致决策树高度不相关。由于这个原因,随机森林广泛用于分类和回归任务。

让我们跟上潮流,考虑随机森林分类器的默认参数,检查我们的模型如何执行。

等等,我们为什么要分割数据?

当一个模型在整个输入数据上被训练时,被告知预测同样的输入数据,它表现得像一个天才。但它实际上已经成为一个谎言。当被告知要预测看不见的数据时,它将很难产生预期的结果。这种情况称为“过拟合”。为了防止这种情况,我们将数据分为训练集和测试集,其中模型不包含测试集,而是在训练集上进行训练。然后在测试集上评估模型的性能。

将数据分为 80%的训练集和 20%的测试集:

train_test_split Documentation

训练随机森林分类器(默认参数)并在测试集上预测结果:

在我们在训练集上训练我们的模型之前,我们需要执行特征缩放以将我们的数据带入特定范围内,以便模型不会因其系数或权重的微小变化而偏向特定特征。值得注意的是,我们仅在训练集上安装了定标器,并使用它来转换训练集和测试集,以防止数据泄漏,即在训练模型时,测试集的信息不应泄漏。

StandardScaler Documentation

Random Forest Classifier Documentation

查看森林的平均节点数和最大深度:

对森林中某棵树的外观感到好奇?

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

测试集上的预测:

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

为了预测测试集中实例的类,我们使用 predict() 函数。

给定测试集中的一个实例,它可能落入的每个类的概率是多少,由***predict _ proba()***函数描述。

**注:**我们感兴趣的是预测正类,即累积类,因此我们将只关注先证者[:,1]部分。在博客接下来的部分,我们将用它来绘制精确召回曲线。

我们的模型达到预期了吗?

有几种方法可以评估我们的模型。在哪种情况下使用哪种评估指标确实让我们挠头!

混淆矩阵:

顾名思义,它描述了模型在预测类时所经历的混乱。

但是理解混乱矩阵本身往往是混乱的!让我们用最简单的方式来理解它。

在二进制分类问题中,混淆矩阵看起来像:

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

Confusion Matrix Documentation

真阳性(TP): 其实——造,模特说——造,我说,“牛逼!”

假阳性(FP): 其实——非杜撰,模型说——杜撰,我说“你觉得正面的,其实是负面的!”

假阴性(FN): 实际上——是捏造的,模型说——不是捏造的,我说:“唉!这是有史以来最糟糕的预测。”

真否定(TN): 实际上——非虚构,模型说——非虚构,我说:“最后,你开始知道否定也是现实的事实!”

记住这个的诀窍是:

我们已经知道了 的实际值 ,因此我们将它们归类为

我们评估由我们的模型预测的 的 结果,我们通常将“结果”分类为**

性能指标:

精度:

“不要专注于错误的预测;只专注于正确的,你就会蓬勃发展。”

这就是准确性的含义。因此,对于不平衡的数据集,这是评估模型的最差方式。

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

Accuracy Score Documentation

占据重要位置的指标,尤其是在我们的案例中:

精度:

“精确”是指非常精确的*。顾名思义,precision 描述了一个模型的*【精确】。在所有的预测阳性中,有多少是我们真正感兴趣的,这就是精度。

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

回忆:

召回描述了模型的“完整性”。它从实际阳性值中计算出真实阳性值。

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

F1-得分:

f1-得分是精确度和召回率的调和平均值。在评估一个模型时,要注意精度和召回的贡献是平衡的。

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

你可能会有问题。为什么只有“调和”的意思而没有“算术”或“几何”的意思?这里有的原因。

Classification Report Documentation

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

科恩的卡帕统计:

根据维基百科,科恩的卡帕测量了两个评分者之间的协议,他们各自将 N 个项目分类为 C 个互斥的类别。这里是对此的详细解释。它可以是介于-1 和 1 之间的值,其中-1 表示不一致*,1 表示完全一致。Kappa 统计优选地用于不平衡等级分布的情况,因为它没有考虑多数等级的支配效应。*

Kappa Statistic Documentation

在我们的案例中,kappa 统计值约为 0.74,这意味着测试集和模型预测之间存在基本一致*。这表明该模型表现非常好。*

引擎盖下是怎么回事?

再次参考此链接

在我们的例子中,混淆矩阵看起来像:

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

根据上面的混淆矩阵:

总实例数: 379080

实际:

组合实例总数: 68373,非组合实例总数: 310707

预测:

组合实例总数: 61625,非组合实例总数: 317455

观测精度:

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

在我们的例子中,观测精度= (51241 + 10384) / 379080 = 0.927

预期精度:

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

在我们的例子中,

预期精度(组合)=(68373 * 61625) / 379080 = 11115.03

同样的,

预期精度(非组合)=(310707 * 317455)/379080 = 260197.03

总预期精度:

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

在我们的例子中,总的预期精度=(11115.03+260197.03)/379080 = 0.7157

卡帕统计:

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

在我们的例子中,Kappa 统计量=(0.927–0.7157)/(1–0.7157)= 0.744

因此,在评估模型时,Kappa 统计明智地取消了非组合类的优势。

精确召回曲线:

精度-召回曲线是在 y 轴上具有精度并且在 x 轴上具有不同阈值的召回的图。曲线下面积(AUC)用于总结曲线。AUC 越大,我们的模型表现越好。这在我们的情况下非常有用,通常比 ROC 曲线更可取。在我关注的这个博客中,一切都解释得非常清楚。

PR Curve Documentation

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

AUC 是 0.865。这表明我们的模型在预测正类时表现良好。

对精度和召回的深入了解:

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

Image Source: Wikipedia

精度:

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

用 TP 除分子和分母,我们得到:

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

我们知道精度的值在范围[0,1]内。

当比率(FP / TP)趋于无穷大时,精度将为 0,为此,FP 应该趋于无穷大(实际上,应该具有非常大的值)或者 TP 应该为 0。我们显然不想这样。

当比率(FP / TP)为 0 时,精度将为 1,因此 FP 应为 0。因此,这是最好的情况,因为当假阳性的数量减少时会产生高精度值。

回忆:

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

用 TP 除分子和分母,我们得到:

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

我们知道召回值在范围[0,1]内。

当比率(FN / TP)趋于无穷大时,召回将为 0,为此 FN 应该趋于无穷大(实际上应该具有非常大的值)或者 TP 应该为 0。我们显然不想这样。

当比率(FN / TP)为 0 时,召回将为 1,此时 FN 应为 0。我们知道,FN 是最坏的预测。因此,这是最好的情况,因为当假阴性的数量减少时会产生高召回值。

总而言之,

当涉及到不平衡数据分类时,Kappa 统计和精确召回曲线价值连城。

第二步

交叉验证:

train_test_split 辅助函数不报告模型的概化能力,因为结果仅取决于一个特定的随机分割。

此外,当我们调整参数设置(超参数)直到得到好的结果时,会出现一个问题。这可能给模型一个关于测试数据的提示,并且模型可能再次过拟合。为了防止这种情况,我们需要一个“验证集”,在其上对训练好的模型进行验证,然后最终在测试数据上进行测试,以防止它被泄露。但是这将大大减少训练样本的数量。这就是交叉验证帮助我们的地方。它避免了对验证集的需要。参见 scikit-learn 文档了解这一事实。

有几种交叉验证技术,可以应用于自己的数据。

我使用了分层 K-fold 交叉验证技术,以便在每个训练和验证 fold 中近似保留相对类频率。这对于阶级不平衡的情况很重要。

分层 K 倍交叉验证是如何工作的?

在分层的 K 折叠交叉验证中,数据集被分成 K 个大小大致相等的组(折叠),每个折叠的保持原始数据集中的类别比例。在这 K 个折叠中,K-1 个折叠用于训练模型,剩余的折叠用于验证模型。

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

Image source: scikit-learn

分层五重交叉验证:

Stratified K-Fold Documentation

***注意:**StratifiedKFold()中的参数“shuffle”被设置为“True ”,因为我们的数据不是任意的,因此,在我们分割数据之前,有必要对数据进行洗牌。当 *shuffle=True 时,我们必须将“random_state”参数设置为一个随机数,这样可以防止代码执行多次时结果发生变化。

卡帕统计:

低标准偏差表明模型没有过度拟合。此外,Kappa 统计值(此处为 0.746)比之前的情况(0.744)有所改善,尽管幅度很小。

精确召回曲线:

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

在每一个折叠中,几乎相似的 kappa 统计值和几乎相似的 AUC 值证明我们的模型具有良好的泛化能力。

步骤 3(概述)

调节超参数:

超参数是其值在学习过程开始之前设置的参数,并且不由模型直接学习。

调整超参数有助于我们努力为特定模型找到理想的参数套件,从而获得最佳分数。

GridSearchCV 和 RandomizedSearchCV 最常用于调整超参数。

在接下来的部分中,我们将尝试使用 GridSearchCV 来揭示有助于进一步提高所讨论的评估指标值的最佳超参数。

在我的 GitHub 库中找到完整的代码。

希望热心的读者喜欢它,并有他们的发言权!敬请关注即将到来的部分!

参考文献:

[1] 遥感教程——加拿大自然资源部加拿大测绘和地球观测中心(或加拿大遥感中心)。

[2]‘哥白尼哨兵数据[2018]’ ( 从 USGS 网站下载)

[3] Thanh Noi,p;使用 Sentinel-2 影像进行土地覆盖分类的随机森林、k-最近邻和支持向量机分类器的比较。传感器 201818 ,18。

[4]博客:机器学习掌握你有没有问过为什么 F1-Score 是精度和召回率的调和均值(HM)?

**描述:“适用于JDK8的环境”** 本文将深入探讨Neo4j社区版3.5.6版本,这是一个基于图数据库的强大工具,特别适用于知识图谱构建和可视化。由于其运行需求,必须在Java Development Kit(JDK)8的环境下进行安装和操作。 **一、Neo4j概述** Neo4j是一款开源的图形数据库,它以节点、关系和属性的形式存储数据,这使得处理复杂网络结构的数据变得更为直观和高效。Neo4j社区版是免费的,适合开发和学习用途,而企业版则提供了更多的高级功能和服务。 **二、JDK8要求** 为了运行Neo4j 3.5.6,你需要在你的计算机上安装JDK8。JDK是Java开发工具包,包含了运行Java应用程序所需的Java虚拟机(JVM)以及一系列开发工具。确保安装的是与Neo4j版本兼容的JDK版本至关重要,因为不兼容的JDK可能会导致运行错误或性能问题。 **三、安装和配置** 1. **下载与解压**: 从官方渠道下载"neo4j-community-3.5.6.zip"压缩文件,并将其解压到你选择的目录。 2. **环境变量配置**: 配置系统环境变量,将Neo4j的bin目录添加到PATH环境变量中,以便于命令行启动和管理数据库。 3. **修改配置文件**: Neo4j的配置主要通过`conf/neo4j.conf`文件进行,如需更改默认设置,如内存分配、端口设置等,应在此文件中进行修改。 4. **启动和停止**: 使用`neo4j console`命令启动服务,`neo4j stop`命令关闭服务。 **四、知识图谱与可视化** Neo4j因其强大的图数据模型,成为构建知识图谱的理想选择。你可以使用Cypher查询语言来操作和查询图数据,它的语法简洁且直观,易于学习。 1. **Cypher语言**: Cypher是一种声明式、图形化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值