TowardsDataScience 博客中文翻译 2020(五百八十八)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

在现实世界的 ML 应用中利用可解释性

原文:https://towardsdatascience.com/leveraging-explainability-in-real-world-ml-applications-part-1-3be567c00594?source=collection_archive---------49-----------------------

利用可解释性优化 ML 模型

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

来源:https://we present . we transfer . com/story/yes-but-why-yayoi-ku sama/

为什么是 XAI?

如今,现实世界的机器学习应用受《通用数据保护条例(GDPR)》法律的管辖,当自动决策发生时,该法律赋予“所有个人获得有关逻辑的有意义解释的解释权”。

传统的机器学习模型(如神经网络)很复杂,缺乏透明度,它们实际上被认为是黑盒模型,数据进来,预测出来,而不知道导致这些预测的内部逻辑。

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

在医疗或军事应用等许多安全关键环境中,了解内部机制并获得用户的信任是 ML 应用的关键要素。

数据偏差

在使用大量数据的数据驱动应用程序中,解释的需求也是至关重要的,因为我们收集的数据可能包含人类的偏见和成见。

其中一个例子是 COMPASS,这是美国法院用来评估被告成为惯犯的可能性的软件。2016 年,《propublica.org 》(一份在线报纸)显示,根据该软件提供的特征分析分数,没有再次犯罪的黑人被归类为高风险的两倍于没有再次犯罪的白人,白人惯犯被归类为低风险的两倍于黑人惯犯。

根据 Lipton Zachary C. [1]的说法,当使用 ML 应用程序进行犯罪率预测来分配警察时,训练数据集中的种族偏见可能会导致预测,从而通过过度监管某些街区来延续监禁循环。

理解 ML 算法的预测是如何产生的,为什么在某些情况下模型会失败,以及它何时能正确工作,这些都是当今 ML 模型中更透明、可信和稳健的基本要素。

XAI 的目标

  1. 提供预测的解释
  2. 了解整体优势和劣势
  3. 对系统未来行为的理解。

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

来源: Broad Agency 公告可解释人工智能(XAI)DARPA-BAA-16–53

如何在 ML 应用中集成 XAI?

为了获得一个可解释的 ML 模型,有必要考虑下面的需求列表:

  • 复杂性人类能够理解输入和预测之间关系的程度。衡量可解释性通常与模型的大小有关,如决策树的深度、树的深度、规则的数量等。
  • 准确性可解释的 ML 模型准确预测未知实例的程度。
  • 保真度可解释模型能够模仿黑盒行为的程度。它被定义为可解释模型相对于黑盒模型预测的准确性。

全球和局部可解释模型

全局可解释模型包括提供模型的整体逻辑和模式,并遵循导致所有不同结果的整体推理。换句话说,它解释了因变量(预测)和自变量(解释变量)之间的条件交互作用。

一个局部可解释的模型反而为单个实例的预测提供了解释。它解释了关于单个实例的因变量(预测)和自变量(解释变量)之间的条件交互作用。

XAI 在现实生活中的应用

使用 XAI 模型提出了许多解决可信性、公平性和健壮性的方法,我在这里引用一些例子:

在[2]中,作者提出了一个解释模型来提高系统的可信度。解释模型包括解释任何 ML 文本分类器的预测,这是通过在预测周围局部地学习可解释模型并提供对该模型的洞察来实现的,该洞察可用于将不可信的模型或预测转换成可信的模型或预测。

在[3]中,作者提出了一种方法,该方法包括利用基于树的集成分类器的路径,以在调整特征值时产生关于将真正的负样本转换为正预测样本的建议。这种方法被应用于在线广告的环境中,因为它可以通过移动它们在广告质量特征空间中的位置,将低质量广告(真正的负面实例)转换成一组新的“提议的”高质量广告(正面实例)。

在人脸识别系统领域,[4]的作者提出了一种方法,该方法提供了失败中的模式,例如测试图像的模糊性,并用人类可以理解的语义特征来概括它们。ML 工程师可以在训练时使用这些故障模式来设计更好的功能或收集更集中的训练数据。它还可以在测试时使用,以了解何时忽略系统的输出,从而使其更加可靠。

摘要

大多数部署的真实 ML 应用程序都被构造成不透明的黑盒。能够理解 ML 模型的结果在许多领域变得至关重要。在我的下一篇文章中,我将更详细地描述 XAI 的技术和实现的工具,它允许一个 ML 工程师容易地集成一个 XAI 模型。敬请期待!!

参考文献

克里斯托弗·莫尔纳尔。可解释的机器学习:使黑盒模型可解释的指南,2018 年

国防高级研究计划局。可解释的人工智能(XAI),2016

Guidotti Riccardo、Monreale Anna、Ruggieri Salvatore、Turini Franco、Giannotti Fosca 和 Pedreschi Dino。"解释黑盒模型的方法综述。"美国计算机学会计算调查(CSUR)51.5(2018):1–42。

[1] Lipton Zachary C .,“模型可解释性的神话”队列16.3(2018):31–57。

[2]里贝罗·马尔科·图利奥、萨梅尔·辛格和卡洛斯·盖斯特林。“我为什么要相信你?”解释任何分类器的预测。第 22 届 ACM SIGKDD 知识发现和数据挖掘国际会议论文集。2016.

[3] Tolomei Gabriele、Silvestri Fabrizio、Haines Andrew 和 Lalmas Mounia。“通过可操作的特征调整对基于树的集合进行可解释的预测。”第 23 届 ACM SIGKDD 知识发现和数据挖掘国际会议论文集。2017.

[4]班萨尔·阿尤什、阿里·法尔哈迪和德维·帕里克。"走向透明系统:故障模式的语义表征."欧洲计算机视觉会议。施普林格,查姆,2014 年。

利用 ML 和社交媒体数据,根据当前市场情绪改进投资策略

原文:https://towardsdatascience.com/leveraging-ml-and-social-media-to-improve-investing-strategies-based-on-the-current-market-f00d2c6e528a?source=collection_archive---------15-----------------------

数据科学

为可视化最新推文的情感分析结果创建管道

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

图片由开工作室来自土坯库存

机器学习和投资是与计算机科学实际应用相关的最常搜索的主题。不幸的是,它们也经常被自称为数据科学家的人滥用,这些人只在 YouTube 上看过几个教程,并声称通过对给定股票的先前价值应用线性回归,你很有可能预测其未来价格。

然而,事实远非如此。投资任何金融工具都是一件非常复杂的事情。教计算机如何模仿明智的商业决策是极具挑战性的——例如,什么是购买特定股票的最佳时机。这样的决定应该基于广泛的专业知识和严谨的研究——没有人能比你自己更好地决定如何使用你的钱。然而,我确实相信机器学习可以为你买到当今世界最珍贵的商品之一:时间。

如果你是一个积极的投资者,你很可能会定期浏览新闻网站,看看一些新的政府法规或另一个全球事件是否会拉低你刚刚购买的股票的价格。如果是这样的话,系好安全带,让我向你展示如何利用你选择的金融工具的最新推文建立你自己的情绪分析管道。

旁注

请记住,本文的目的不是成为一个全面的 Python 教程——它展示了一个特定的 Python 应用程序。如果你是一个完全的初学者,我建议看看下面这篇关于学习 Python 的最佳资源的文章:

[## 如何学习 Python:顶级网站和课程,从初学者到专业人士

2.证明自己是 Codewars 方面的 Python 专家如果你正在寻找一个有益的学习经历,你不能去…

www.stxnext.com](https://www.stxnext.com/blog/learn-python-top-sites-courses/)

或者,如果您对使用 Python 学习机器学习的基础知识特别感兴趣,请随时查看我的同事写的文章:

[## 教程:Python 机器学习入门

每隔一段时间,我都会很高兴在这个博客上发表一篇真正震撼我的世界的文章。这是其中之一…

www.stxnext.com](https://www.stxnext.com/blog/getting-started-machine-learning-python/)

入门

开始做的第一件事是获得使用官方 Twitter API(应用程序编程接口)的凭证。你可以在这里找到一个关于如何做到这一点的优秀教程:点击

要继续,您需要:

  • 一个 API 密钥,
  • 一个 API 密钥,
  • 一个访问令牌,
  • 访问令牌机密。

有几种方法可以使用 API 凭证,最简单的方法是直接在程序中包含 API 键和令牌。然而,这不是一个好主意:如果你的程序因为某种原因被发布到网上,你的证书将会被公开。相反,我建议使用凭证作为 conda 环境变量。为此,你需要借助官方教程下载 Anaconda 或 Miniconda 发行版:https://docs . conda . io/projects/conda/en/latest/user-guide/install/Linux . html)。.) Conda 主要是一个包和一个环境管理系统,默认情况下以 Python 及其最流行的数据分析库为特色。我们以后会用到它们。

一旦安装了 Conda,您应该为您的项目创建并激活一个单独的环境。您可以通过键入以下命令来完成此操作:

conda create --name twitter_sentiment python=3.7
conda activate twitter_sentiment

如果您使用 Linux 发行版或 Mac,请在终端中键入它。如果您使用 Windows,请在 Anaconda 提示符下键入它。接下来,我们将继续设置环境变量。

设置环境变量— Linux/Mac

接下来,让我们将 Twitter API 键作为您的环境特有的变量。在终端中写入:

cd $CONDA_PREFIX

然后,您需要创建一个新的“etc”目录,在这个目录中,您应该还有两个目录:“activate.d”和“deactivate.d”。

mkdir ./etc
mkdir ./etc/conda/activate.d
mkdir ./etc/conda/deactivate.d

这是在文件中包含凭据的步骤。将目录更改为./etc/activate.d,然后用您最喜欢的文本编辑器(我喜欢用 vi 来编辑一个名为env_vars.sh的文件)和您的 Twitter API 凭证:

cd ./etc/conda/activate.d
vim env_vars.sh

env_vars.sh文件的内容应该如下:

#!/bin/sh
export consumer_key='your_consumer_key'
export consumer_secret='your_consumer_secret'
export access_token_key='your_acess_token_key'
export access_token_secret='your_acess_token_secret'

接下来,将目录更改为../deactivate.d,然后创建另一个env_cars.sh文件:

cd ../deactivate.d
vim env_vars.sh

用以下内容填充env_vars.sh文件:

#!/bin/sh
unset consumer_key
unset consumer_secret
unset access_token_key
unset access_token_secret

你的证件现在都准备好了。现在,您可以暂时停用您的环境(必须这样做才能正确设置环境变量),将您当前的工作目录切换到您想要的位置(让我们假设这是$HOME/twitter_sentiment)并重新激活 Conda 环境,以便您:

conda deactivate
mkdir $HOME/twitter_sentiment
cd $HOME/twitter_sentiment
conda activate twitter_sentiment

设置环境变量—窗口

这个过程与 Linux 或 Mac 的过程非常相似,但是有一些微小的变化,因为 Windows 不支持 Bash shell。一旦您的新环境被激活,您可以随意将目录更改为环境的主目录,并创建必要的目录和env_vars.bat文件——在 Anaconda 提示符下键入以下命令:

cd %CONDA_PREFIX%
mkdir .\etc\conda\activate.d
mkdir .\etc\conda\deactivate.d
type NUL > .\etc\conda\activate.d\env_vars.bat
type NUL > .\etc\conda\deactivate.d\env_vars.bat

然后,用任何文本编辑器(可以使用记事本)打开文件.\etc\conda\activate.d\env_vars.bat:

cd ./etc/conda/activate.d
notepad env_vars.bat

并将您的 Twitter API 凭证插入到env_vars.bat文件中:

set consumer_key='your_consumer_key'
set consumer_secret='your_consumer_secret'
set access_token_key='your_acess_token_key'
set access_token_secret='your_acess_token_secret'

接下来,将目录更改为../deactivate.d,然后编辑位于那里的env_vars.bat文件:

cd ../deactivate.d
notepad env_vars.sh

包含以下内容:

set consumer_key=
set consumer_secret=
set access_token_key=
set access_token_secret=

你的证件现在都准备好了。现在,您应该暂时停用您的环境(为了正确设置环境变量,必须这样做),将您当前的工作目录切换到您想要的位置(让我们假设这是%HOME%/twitter_sentiment)并重新激活 Conda 环境,以便您:

conda deactivate
mkdir %HOME%/twitter_sentiment
cd %HOME%/twitter_sentiment
conda activate twitter_sentiment

安装 NLTK 和 python-tweeter 包

在编写一些代码之前,我们需要安装一些包,让我们能够完成我们打算做的工作——即与 Tweeter API 进行通信,然后对获得的 Tweets 文本进行情感分析。对于前者,我建议使用 python-twitter 模块。对于后者,有许多优秀的选择,其中最受欢迎的是 VADER。它已经被集成到 Python 所提供的最强大的自然语言处理引擎中——NLTK(自然语言工具包)。只需键入以下命令:

pip install python-twitter
pip install nltk
python -m nltk.downloader vader_lexicon

这将安装 python-twitter 和 NLTK 包以及 NLTK 库的 VADER 扩展。现在,让我们继续实际的代码本身。

旁注

如果您不使用 Python 的 conda 发行版,您还需要安装 matplotlib 和 seaborn 包—您可以通过在控制台中键入:

pip install matplotlib
pip install seaborn

编码—与 Twitter API 通信

为了方便起见,我在这里使用的代码也可以在我的 Github 页面上找到:https://github.com/szymonzaczek/towards-data-science/

让我们从导入必要的包开始。

“Twitter”包是 Twitter API Python 模块;“os”允许我们与操作系统进行交互;` datetime '用于处理日期(我们将需要它,因为我们将试图获得最近的推文);“re”包允许使用正则表达式。我们将使用“pandas”来方便地处理数据,并使用“matplotlib.pyplot”和“seaborn”来创建信息丰富且精美的图表。“SentimentIntensityAnalyzer”将是我们的主力——这是一个用于评估给定推文情绪的类。

下一步是设置我们的 API 访问。因为我们使用 conda 环境,所以我们可以通过调用“os.environ.get()”方法轻松访问我们的凭证,并使用这些调用的结果作为实际 Twitter 的参数。API 对象。请记住,我们将利用“tweet_mode="extended " ”,因为我们不想截断 tweet,我们希望对它们进行整体分析。

接下来,我们需要选择关键词,作为我们搜索相关推文的基础。应该明智地选择它们——例如,如果你选择“苹果”作为关键词,大多数搜索结果可能会涉及科技公司,但其中一些也可能与我们喜爱的水果有关。理想情况下,这些关键字不应该有多重含义。我们将搜索包含所有指定关键词的 Twitter 帖子。为了程序正常运行,选择一到三个关键词。我选择了“原油”和“石油”,并将这些关键词组合成一个列表。

现在,让我们确定今天是星期几。Python 有一个非常简洁明了的方法:因为我们已经导入了“datetime”模块,所以只需调用“datetime.date.today()”方法并将其值赋给一个变量:

在这一点上,我们需要在“while”循环中包含我们的代码。为什么?稍后我会讲到这一点,但现在,我们将开始循环:

从现在开始,任何代码都应该缩进(Python 中的缩进默认被视为四个空格或一个制表符);直到我们离开这个圈子。然后,我们继续为 Twitter 搜索构建一个查询。有几种方法可以做到这一点,我选择用“raw_query”方法搜索 Twitter。这意味着将使用模拟浏览器中使用的查询搜索的查询直接调用 API(有关更多信息,请参见https://python-Twitter . readthe docs . io/en/latest/searching . html)。.)这提供了一种处理搜索时间框架的简洁方法。但是,它要求您非常严格地遵守格式规则,但是一旦查询完成,您就可以忘记这些规则。因为我们想要使用时间框架来搜索 Twitter,所以我们必须根据“raw_query”的要求来格式化“date_for_query ”(顺便说一下,这是格式化日期的一种非常标准的方式):

然后,使用字符串连接构造查询,如下所示:

如果您是 Python 的初学者,这可能看起来很可怕,但是请记住,它拥有您需要的一切,并且会自动适应您的用例。“查询”变量将包含所有先前指定的关键字(通过使用“%20”)。join(keywords) command)、right day (date_formatted )以及 raw_query ()(例如%20 %3A `标签、过滤掉链接、仅保留回复而不引用原始帖子等)所需的一些其他内容。).之后,我们需要调用实际的搜索方法,同时将其结果赋给一个变量:

就像这样,我们已经有了 Twitter 的搜索结果。然而,我们仍然不知道里面到底有什么。如果对任何社交媒体内容的分析是为了指导投资策略,我们应该确保这种分析不是使用排除的例子,而是一批帖子。让我们假设,出于我们的目的,我们将需要至少 30 条推文。这就是为什么我们将代码封装在“while”循环中:现在我们可以指定,如果我们的搜索结果超过 30 条 Tweets,我们将退出循环:

棘手的部分来了。如果我们没有足够的推文,我们该怎么办?当然,我们可以将搜索范围扩大到更早的日期。为此,我们只需将“查询日期”变量的值更改为当前“查询日期”的前一天。由于代码现在处于循环中,这将很容易。但是,在这样做之前,让我们检查“date_for_query”变量中的当前日期是否不早于七天。这很重要,原因有二。首先,超过那个时间的推文不应该真正影响当前关于你的目标关键词的情绪。其次,Twitter 的基本 API 不允许搜索超过七天的推文。可以使用“datetime.timedelta()”方法对“datetime”对象进行数学运算。此外,如果我们的搜索已经达到极限,我们可以用一个优雅的错误消息抛出 ValueError。这并不是真正的 Pythonic,但是在这里我们宁愿过于急切,也不愿给用户留下几乎没有信息的消息(由于字符串非常长,这里的格式并不完美)。

如果我们还没有达到极限,我们可以将搜索范围扩大到前一天。这很容易做到:

就像这样,我们完成了与 Twitter API 的直接交互。以下代码总结了整个“while”循环:

使用这段代码,我们要么会收到至少 30 个“twitter.models.Status”对象(包含在“search_results”列表中),要么会收到一条错误消息,提示我们没有为给定关键字找到足够的 Tweets。在这种情况下,你应该修改你的关键字。要么少用一些,要么用更通用的,因为“关键词”列表中的每个关键词都必须在你搜索的每条推文中找到。

数据处理

下一步是从“search_results”列表中包含的“twitter.models.Status”对象列表中提取各个 Tweets 的文本。请记住,我们的目标是对推文进行情感分析,并了解人们对我们选择的关键词的当前感受。在我的情况下,它将是“原油”和“石油”。为了让这种分析尽可能公正,我们应该确保每条推文都是由不同的用户发布的。因此,我们将从初始化两个列表开始:

现在,我们可以开始填充这些列表。为此,我们需要一个循环,在这个循环中,我们将迭代“search_results”。对于每次迭代,我们将检查给定的 Tweet 是否是由唯一的用户发布的。如果同一个用户发布了多条推文,我们将只使用找到的第一条。为此,我们可以使用嵌入在“if/else”子句中的“not in”成员运算符。如果在我们的搜索结果中有同一作者的多个帖子,我们将使用“继续”语句转到下一个帖子。如果我们有一个作者的帖子,而这个作者以前没有出现在我们的搜索中,让我们从 Tweet 中提取“full_text”属性(当然,这是 Tweet 的文本):

Twitter 用户经常过度使用各种标签并提到其他人。我看不出有什么理由要把它们包含在情感分析中,所以让我们把它们去掉吧。这可以使用正则表达式来完成,这是一种在字符串中查找字符串的强大工具。重要的是,正则表达式是编程语言不可知的,因此,它们是一个可以放在口袋里的伟大的通用工具。在 Python 中,“re”模块负责处理它们,它的“re.sub()”方法允许用另一个字符串替换一个字符串。在这种情况下,我们寻找以 @ '或#`开头的单词,我们简单地通过用空字符串替换它们来删除这些单词。

此外,非常短的帖子往往会给情感评估带来挑战,所以我们可能希望确保将要分析的帖子至少有 20 个字符长。此外,如果在推文的开头有任何标签或提及,这些帖子前面会有空白。让我们通过使用’ lstrip()'方法来消除它:

总而言之,从 Tweets 中提取实际的文本,这是填充“tweets_text”列表的整个循环:

获取的推文的情感分析

因此,到目前为止,我们一直在 Twitter 上搜索包含特定关键字的推文,并从中提取文本。情绪分析,这是激动人心的部分,现在开始。说实话,这一部分不需要很多代码,因为我们只需要将文本输入到“SentimentIntensityAnalyzer”对象中,然后提取出想要的输出。在这种情况下,将是从“polarity_scores”方法获得的“复合”分数,该“复合”分数由“SentimentIntensityAnalyzer”类提供。“复合”值描述了所提供文本的总体情感。如果文本的情感是积极的,它的“复合”分数是积极的。如果情绪是负面的,它的“复合”分数是负面的。当文本相当中性时,“复合”分数非常接近 0。“复合”分数的值作为来自字典的关键字被访问,该字典是运行“polarity_scores”方法的结果。此外,“复合”分数是用四个十进制数字格式化的浮点值。因为这样的精度对于我们的目的来说并不是真正必要的,所以让我们把它减少到两位小数。最后但同样重要的是:让我们使用“SentimentIntensityAnalyzer”类(基本上是我们的情感分析引擎)嵌入一个函数,并用类型提示来修饰它,对于输入(tweet_text: str)和输出(-> float ):

总结这一部分,‘Vader _ perspective _ score’函数将单个 tweet 的文本作为参数,并返回一个描述情绪本身的 float。

现在,我们终于可以开始分析我们的推文了。让我们创建另一个列表,我们将在其中存储结果,并通过迭代推文执行一些机器学习,并将它们提供给执行情感分析的函数:

瞧啊。您刚刚对推文进行了情感分析。没那么难吧。您已经正式将机器学习应用于现实世界的数据,并且您已经通过世界上最受欢迎的网站之一的 API 访问了它。我得说,相当令人印象深刻。但是请注意,我们还远未接近终点。即使我们有数据,我们甚至还没有看到我们努力的结果。显然,如果您愿意,您可以只打印数值,但这不会提供太多信息。因此,让我们生成一个简洁、高质量的条形图,总结所有的发现。为此,让我们使用简单的“if `/“elif”语句将在前面步骤中获得的浮点数分配到它们的类别(负、中性和正),同时创建一个“情绪列表”来存储该操作的结果:

可视化结果

现在,我们来看看如何创建条形图。有几个方法可以做到这一点,但我更喜欢的是使用伟大的和多才多艺的’ seaborn '模块。出于我们的目的,我们可以只创建两个列表,其中包含绘图的 x 轴和 y 轴的数据。让我们方便地称它们为‘x 轴’和‘y 轴’。第一个将只包含我们的类别,而第二个将包含每个类别的计数。它们的创建方式如下:

如果你迫不及待地想看到结果,你可以通过调用 sns.barplot(x=x_axis,y=y_axis)来可视化你自己的情绪分析结果。然而,有一些额外的东西可能会使我们的情节看起来更加流畅。我非常喜欢尽可能方便地传达发现的可视化效果。这可以通过恰当而周到地使用颜色来实现。例如,让我们把负面的推文变成红色,中性的推文变成蓝色,正面的推文变成绿色。我们可以通过改变 seaborn 模块的调色板来做到这一点:

colors = [“firebrick”, “dodgerblue”, “limegreen”]
sns.set_palette(sns.color_palette(colors))

我们没有使用这些颜色的标准色调——我真的更喜欢红色的耐火砖变化,而不是标准的红色,等等。

我们还可以在图上包含一个网格,这样就可以更容易地比较条形的高度:

现在我们可以初始化“figure”对象,它就像是绘图的画布。让我们调整它的大小和分辨率:

给轴加标签总是个好主意。因此,让我们将“Amount”标签放在 y 轴上(粗体大字体),同时创建一个“ax”变量,该变量指向绘图中的一个轴实例:

现在,我们有了创建地块本身的所有基本组件:

不过,我们不要就此打住。根据我们使用的关键字自动生成一个情节标题会很酷。我们也可以在标题中加入日期。然后,您将在单个图中获得分析的所有细节。不过有一个小小的警告——起初,我们试图寻找当天的推文。如果失败了,我们就试着寻找前几天的帖子,直到七天前。因此,如果我们的自动生成能够适应这些细节并有效地处理这两个例子,那将会很酷。为此,我们可以检查“date_for_query”变量是否与“datetime.date.today()”相同,然后使用自定义的绘图名称:

在这一点上,我们有了一个非常整洁的条形图,并根据我们的用例完全定制了标题。但是说实话:我们,人,是懒的。我们很少想要过度伸展我们的大脑。因此,如果图中的任何条形具有非常相似的高度,我们可能会搞不清楚我们是有更多负面还是正面的推文。我们可能会通过将分配给每个类别的推文的实际数量放在图上来更清楚地理解这一切。为此,我们可以使用“ax.annotate()”方法。为了正确地使用它,我们需要找出放置注释的确切位置。这可以通过从迭代可能从“ax”对象访问的补丁开始来完成。然后,对于每个面片,获取每个条的边界框坐标。最好的选择是将实际金额放在条形的正上方,这样注释就应该出现在条形的正上方。我们还想确保在地块中有足够的空间来容纳我们想要在那里找到的所有东西。因此,我们将 y 轴的端点设置为 seaborn 自动分配的值的 110%。我们还希望确保这些数字在条形上方非常居中,这就是我们检查“val”是大于还是小于 10 的原因。如果它更大,为了完全居中,我们添加两倍的偏移量(因为我们有两位数而不是一位):

对情节做的最后一件事就是把它保存在磁盘上。理想情况下,保存的图应有一个完整的描述性名称,包含分析的每个细节,类似于图标题中的内容。这可以使用以下代码来完成:

在这里,您可以找到创建和保存绘图的完整代码:

现在,看看我的图,它展示了我从 6 月 19 日开始对“原油”和“石油”的搜索:

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

作者创作的情节

总结

现在你知道了!旅途并不艰难,对吧?尽管我们生成的代码并不复杂,但我们确实在这里使用了一些很酷的东西。事实上,你不仅使用官方 Twitter API 对你直接下载的推文进行了情感分析,而且还准备了 100%定制以适应你的用例的令人敬畏的可视化作品。简而言之:我们刚刚开发了一个通用管道,用于对包含您指定的关键词的推文进行情感分析,并创建了一个自动生成的令人敬畏和信息丰富的情节。有了这个管道,你所需要做的就是每天早上执行你的代码,然后你马上就会收到一个全新的图表,它会告诉你 Twitter 用户对你感兴趣的关键词的看法。这肯定会让你作为一个投资者的生活更方便,节省你的时间来处理更紧迫的事情,这肯定会帮助你的决策过程。当然,如果你愿意,你可以根据自己的喜好扩展代码。例如,您可以在云服务中设置这个脚本,让它在每天的固定时间运行,它甚至可以自动向您发送一封包含创建的绘图的电子邮件。不过这超出了本文的范围,也许我会在将来再次讨论它。尽管如此,如果你和我一起编码,你就已经创建了一个基于机器学习的分析管道,可以分析关于你选择的主题的最新推文。是不是很酷?

如果你想直接从有经验的程序员那里学习更多关于软件开发过程的知识,欢迎访问 STX Next 的博客:

[## Python,软件开发,UX 和产品设计-博客- STX 接下来

阅读我们,了解 Python web 开发、技术新趋势和外包软件开发的正确方法。

www.stxnext.com](https://www.stxnext.com/blog)

利用 NLP 获得社交媒体、新闻和广播方面的见解

原文:https://towardsdatascience.com/leveraging-on-nlp-to-gain-insights-in-social-media-news-broadcasting-ca89752ef638?source=collection_archive---------15-----------------------

为政府实体和私人组织定义社交媒体分析的结构化用例路线图

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

自然语言处理(NLP)是认知科学和人工智能的一个分支,涉及计算机和人类自然语言之间的交互。它专注于处理和分析自然语言数据。主要目标是让机器学习在理解语言方面像人类一样智能。这里的目标是展示各种 NLP 功能,如情感分析、语音识别和关系提取。自然语言处理中的挑战包括主题识别、自然语言理解和自然语言生成。

社交媒体分析利用从社交渠道收集数据并从中发现意义的能力来支持业务决策,并通过社交媒体根据这些决策衡量行动的绩效。例如,中东和北非的消费者是社交媒体平台最活跃的用户。该地区大量的青年人口和高移动渗透率使其成为公司的理想市场

在本文中,我们展示了私人和政府实体如何利用结构化的用例路线图,在社交媒体、新闻订阅、用户评论和广播领域等自然语言处理技术上产生见解。

社交媒体分析中的 IBM 方法

IBM 强调,随着社交媒体的流行,“一个伟大产品的消息可以像野火一样传播。关于劣质产品的新闻——或者客户服务代表的不愉快经历——也能迅速传播。消费者现在要求组织对他们的品牌承诺负责,并与朋友、同事和公众分享他们的体验。”

社交媒体分析帮助政府实体和公司处理这些体验,并利用它们来:

  1. 发现与产品和品牌相关的趋势
  2. 理解对话——说了什么以及如何被接受
  3. 获取客户对产品和服务的情感
  4. 衡量对社交媒体和其他交流方式的反应
  5. 识别产品或服务的高价值特征
  6. 发现竞争对手的说法及其有效性
  7. 描绘第三方合作伙伴和渠道如何影响绩效

社交媒体中的 IBM 数据科学能力

有效的社交媒体分析的第一步是制定目标。目标可以从增加收入到确定服务问题。在那里,可以选择主题或关键字,并设置日期范围等参数。来源也需要具体说明——对 YouTube 视频、脸书对话、Twitter 争论、亚马逊产品评论、新闻网站评论的回应。

  • 自然语言处理和机器学习技术识别非结构化数据中的实体和关系,非结构化数据是指没有预先格式化以用于数据分析的信息。几乎所有的社交媒体内容都是非结构化的。这些技术对于获得有意义的见解至关重要。
  • 细分是社交媒体分析的基本需求。它根据地理位置、年龄、性别、婚姻状况、父母身份和其他人口统计数据对社交媒体参与者进行分类。它可以帮助识别这些类别中的影响者。通过了解谁在关键主题上进行互动,可以更好地调整信息、计划和响应,并使其更有针对性。
  • 行为分析 s 用于通过分配用户、推荐者、潜在用户和诋毁者等行为类型来了解社交媒体参与者的关注点。了解这些角色有助于开发有针对性的信息和回应,以满足、改变或转移他们的看法。
  • 情绪分析测量社交媒体评论的语气和意图。它通常涉及自然语言处理技术,以帮助理解实体和关系,揭示积极、消极、中立或矛盾的属性。
  • 声音份额分析关于品牌、产品、服务、声誉等话题的流行程度和激烈程度。它有助于确定关键问题和重要主题。它也有助于将讨论分为积极、消极、中立或矛盾。
  • 聚类分析可以发现隐藏的对话和意想不到的见解。它将频繁出现的关键词或短语联系起来,并衍生出新的主题、问题和机会。例如,制作小苏打的人利用聚类分析发现了新的用途和机会
  • 仪表盘和可视化图表、图形、表格和其他演示工具总结和分享社交媒体分析结果,这是交流和运用所学知识的重要能力。它们还使用户能够更快地掌握意义和见解,并在没有高级技术技能的情况下更深入地研究具体的发现。

自然语言处理建模的文本预处理活动

在文本预处理期间,执行以下阶段:

  • 分词是我们 s 把文本拆分成句子,再把句子拆分成单词的过程。我们把单词小写,去掉标点符号。
  • 词干提取是对相关单词进行编目的一种粗略方法;它基本上是从字母的末端开始,直到到达词干。例如,在英语中,有很多例外。
  • 词汇化超越了单词缩减,考虑语言的全部词汇,对单词进行形态分析。比如第三人称的单词改成第一人称,过去时态和将来时态的动词改成现在时态。单词被词干化——单词被还原成它们的词根形式。

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

NLP 模型的文本预处理活动

  • 规范化是一个将单词列表转换成更加统一的序列的过程。这有助于为以后的处理准备文本。通过将单词转换为标准格式,其他操作就能够处理数据,而不必处理可能会影响该过程的问题。例如,将所有单词转换为小写将简化搜索过程。
  • 单词嵌入矢量化是 NLP 中的一种方法,用于将词汇中的单词或短语映射到相应的实数向量,该向量用于查找单词预测、单词相似性和语义。将文字转换成数字的过程称为矢量化。

自然语言处理中的文本表示模型

在本节中,我们将概述单词和句子矢量化中使用的最著名的文本表示模型,但我们不会深入研究技术细节。目前使用文本数据的特征提取的简单方法是:

1。词汇袋

单词袋模型易于理解和实现,在语言建模和文档分类等问题上取得了巨大成功。

它是自然语言处理和信息检索(IR)中使用的一种简化表示。在这个模型中,一个文本被表示为它的单词的包(多重集),不考虑语法甚至词序,但保持多样性。

单词袋模型通常用于文档分类的方法中,其中每个单词的(出现频率)被用作训练分类器的特征。

单词袋模型易于理解和实现,并在诸如语言建模和文档分类等问题上取得了巨大成功。

我们将展示单词袋模型如何在文本矢量化空间中工作。让我们考虑一下,我们有以下 3 篇来自中东新闻的文章。

  1. 沙特阿拉伯首次向外国人颁发永久居留权
  2. [沙特首次向外国游客敞开大门](http://Saudi Arabia Is Opening Its Doors to Foreign Tourists for the First Time)
  3. 透露利雅得季节对沙特旅游的影响

然后,对于每个单词,插入该单词在相应文档中的频率

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

文章中的术语频率表

上表描述了包含每个文档中每个单词的词频的训练特征。这被称为单词袋方法,因为在这种方法中出现的次数而不是单词的顺序或次序是重要的。

2。TF-IDF

**TF:术语频率,**度量术语在文档中出现的频率。因为每个文档的长度不同,所以一个术语在长文档中出现的次数可能比短文档多得多。因此,术语频率通常除以文档长度(又名。文档中的术语总数)作为标准化的一种方式:

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

TF 数学公式

TF-IDF 权重是一种统计度量,用于评估一个单词对集合或语料库中的文档有多重要。重要性与单词在文档中出现的次数成比例增加,但是被单词在语料库中的频率抵消。

IDF:逆文档频率,衡量一个术语的重要程度。在计算 TF 时,所有项都被认为是同等重要的。然而,众所周知,某些术语,如“是”、“的”和“那个”,可能会出现很多次,但并不重要。因此,我们需要通过计算以下各项来降低频繁项的权重,同时提高罕见项的权重

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

IDF 数学公式

3。Word2Vec 的单词嵌入

Word2Vec 模型用于学习单词的向量表示,称为“单词嵌入”。这通常是作为预处理步骤完成的,在此之后,学习到的向量被输入到判别模型中,以生成预测并执行各种有趣的事情。它需要单词的语义。我会在我的下一篇博客中详尽地分析 Word2Vec trin。

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

来源:https://www.infoq.com/presentations/nlp-practitioners/?ITM _ source = presentations _ about _ Natural-Language-Processing&ITM _ medium = link&ITM _ campaign = Natural-Language-Processing

指示性数据和人工智能用例路线图

下面您可以看到一个结构化用例路线图的轮廓,该路线图可以为政府实体和私人组织定制,利用自然语言处理和人工智能从社交媒体、新闻源和广播内容中获得重要的见解。

1.主题建模和文本分类

在自然语言处理中,有一个透镜层次,通过它我们可以提取意义——从单词到句子到段落到文档。在文档级别,理解文本的最有用的方法之一是分析其主题。在一系列文档中学习、识别和提取这些主题的过程被称为主题建模

有几种现有的算法可以用来执行主题建模。最常见的是 潜在语义分析【LSA】潜在狄利克雷分配(LDA) 非负矩阵分解**【NMF】**在这一节中,我给出了这些技术的概述,但不涉及技术细节。

***潜在语义分析,*或 LSA,是主题建模的基础技术之一。核心思想是利用我们所拥有的矩阵——文档和术语——并将其分解为一个单独的文档-主题矩阵和一个主题-术语矩阵。第一步是生成我们的文档术语矩阵。

作为主题建模中常用的方法,潜在狄利克雷分配 (LDA)是一种生成统计模型,它允许通过未观察到的组来解释观察集,从而解释为什么数据的某些部分是相似的。例如,如果观察是收集到文档中的单词,那么它假设每个文档是少量主题的混合物,并且每个单词的出现都归因于文档的一个主题。LDA 是主题模型的一个例子,并且属于机器学习工具箱,并且在更广泛的意义上属于人工智能工具箱。

非负矩阵分解 (NMF)可以应用于主题建模,其中输入是术语-文档矩阵,通常是 TF-IDF 归一化。它来源于多元分析和线性代数,其中一个矩阵被分解成(通常)两个矩阵 W 和 H,并且这三个矩阵都没有负元素。

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

来源:https://www . researchgate . net/figure/Conceptual-illustration-of-non-negative-matrix-factorization-NMF 分解-of-a_fig1_312157184

识别主题有益于各种目的,例如用于聚类文档、组织用于信息检索和推荐的在线可用内容。多个内容提供商和新闻机构正在使用主题模型向读者推荐文章。类似地,招聘公司也在提取职位描述,并将它们与候选人的技能组合对应起来。

媒体公司和媒体监管机构可以利用主题建模功能对新闻媒体中的主题和内容进行分类,并识别具有相关性的主题、当前流行的主题或垃圾新闻。在下面的图表中,IBM 团队执行了一个自然语言分类模型来识别相关、不相关和垃圾新闻。

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

基于与特定主题相关和不相关的文档聚类来源:IBM Data Science Elite

主题建模有助于探索大量的文本数据、发现单词簇、文档间的相似性以及发现抽象主题。似乎这些理由还不够令人信服,主题建模也被用在搜索引擎中,其中搜索字符串与结果相匹配。

2.情感分析

情感分析是指识别书面或口头语言中的情感倾向(积极、中立和消极)。情感分析的另一种方法包括更细粒度的情感分析,其在极性分析的水平上给出更高的精度,该极性分析旨在识别表情中的情感(例如,快乐、悲伤、沮丧、惊讶)。该用例旨在开发一种情感分析方法和可视化,该方法和可视化可以提供关于各种源类型和特征的情感水平的重要见解。

如今,企业希望了解买家对其品牌的评价,以及他们对产品的感受。然而,随着所有的“噪音”充斥着我们的电子邮件、社交和其他沟通渠道,倾听客户已经成为一项艰巨的任务。在这份情感分析指南中,您将了解基于机器学习的方法如何大规模地提供客户洞察,并确保您不会错过任何一次对话。

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

情绪分析仪表板。来源 IBM Watson Analytics

3.命名实体识别

命名整体识别是一个从非结构化文本中识别信息单元的过程,这些信息单元如名称,包括个人、组织和位置名称,以及数字表达式,包括时间、日期、金钱和百分比表达式。目标是开发实用的和独立于领域的技术,以自动检测高精度的命名实体。

命名实体识别 (NER)可能是信息提取的第一步,它试图定位文本中的命名实体并将其分类成预定义的类别,如人名、组织、位置、时间表达式、数量、货币值、百分比等。NER 在自然语言处理(NLP)的许多领域都有应用,它可以帮助回答许多现实世界的问题,例如:

  • 新闻中提到了哪个公众人物、政府、国家或私人组织?
  • 投诉或评论中是否提到了特定产品?
  • 推文包含人名吗?推文包含这个人的位置吗?

下面的例子说明了命名实体识别在文章主题中是如何工作的。

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

新闻文章:来源:https://gulf news . com/world/gulf/Saudi/Saudi-Arabia-issues-first-permanent-residence-to-foreign-1.1573622585766

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

节选自《海湾新闻》关于沙特阿拉伯永久居留权的文章

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

海湾新闻文章中的实体名称识别

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

海湾新闻文章中的命名实体分类

4。词性标注

在语料库语言学中,词性标注(POS tagging)也称为语法标注或词类消歧,是根据其定义和上下文(即,其与短语、句子或段落中相邻和相关单词的关系)将文本(语料库)中的单词标记为对应于特定词性的过程。这种方法的一种简化形式通常是教学龄儿童识别名词、动词、形容词、副词等。

下面的例子展示了如何在一个特定的句子中应用词性标注,并提取词类来识别代词、动词、名词、形容词等。

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

词性识别和关系提取

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

新闻文章中的词性标注

5.关系抽取和文本相似性

文本挖掘收集和分析文档、社交媒体、评论、新闻源、数据库和存储库中的结构化和非结构化内容。该用例可以利用文本分析解决方案来抓取和导入内容、解析和分析内容以及创建可搜索的索引。语义分析描述了基于意义和上下文理解自然语言(人类交流的方式)的过程。它分析周围文本中的上下文,并分析文本结构,以准确消除具有多个定义的单词的含义。

这种技术识别先前在给定文本中识别的命名实体对之间存在的关系。语义文本相似性处理确定两个文本有多相似。例如,这可以采取分配分数或分类(相似与不同)的形式

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

文本关系示例:年龄查询来源:IBM

6.视频广播的内容分析

内容分析是一种 NLP 驱动的方法,根据用户评论将视频(如 youTube)聚类到相关主题中。最常用的技术是使用单词包的主题建模 LDA,如上所述,它实际上是一种无监督的学习技术,将文档记录为单词包。

  • 该文档是通过选择一组主题,然后为每个主题选择一组单词而生成的。随后,它试图以一种主动的方式识别哪个单词属于哪个话题。
  • 它假设文档中的每个单词的主题都是错误的,但其他每个单词的主题都是正确的。最终的输出是对特定主题的分类和排序。

处理这个用例的另一种方法是使用一种叫做奇异值分解 SVD 的技术。奇异值分解(SVD)是实矩阵或复矩阵的因式分解,其通过极坐标分解的扩展将标准方阵的特征分解推广到任何 m×n 矩阵。SVD 方法包括如上所述的文本预处理阶段和术语频率矩阵。

在下面的典型模型输出中,我们可以看到对视频评论应用聚类后最主要的主题是什么,以及这些主题如何在主题间距离图中相互关联。右侧的水平条形图根据出现频率显示特定主题类别中最相关的术语。

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

主题聚类结果-主题间距离源 IBM

7.话题趋势检测和根本原因分析

文本分析的异常或异常检测可以被认为是异常帖子、不规则评论甚至是垃圾新闻,它们似乎与其余数据无关。

根本原因分析 (RCA)是识别导致制造产品缺陷或质量偏差的因素的过程。制造业中根本原因分析的常见例子包括鱼骨图等方法。为了使用机器学习来执行 RCA,我们需要能够检测出一些不寻常的东西,或者换句话说,异常或异常值的存在。下图概述了根本原因分析过程。

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

来源:https://medium . com/ocean ize-geeks/root-cause-analysis-a992b 01685 b 2

机器学习模型经过训练,可以分析常规社交媒体订阅源、帖子和评论下的话题。与正常的馈入行为相比,异常值可以表现为信号的振幅、周期或同步相位的任何偏差模式。

该算法基于异常的当前行为模式形成预测。如果预测值超过在训练阶段确认的阈值,则发送警报。

使用机器学习执行根本原因分析时,我们需要能够检测出趋势。文本挖掘中机器学习的趋势分析是从非结构化、半结构化和结构化的文本数据中定义创新的、未知的知识的方法。它旨在根据事件和主题在特定源或领域中出现的频率来检测事件和主题的峰值。这为垃圾邮件和欺诈性新闻和帖子检测提供了重要的洞察力。

目标是分析新闻订阅源、评论和/或社交媒体帖子,并尝试识别事件流、社交媒体和新闻订阅源中出现频率高或似乎不符合其余内容或一般背景的趋势,例如垃圾邮件、欺诈性或趋势性帖子或主题趋势的变化。

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

自动编码器源的基本结构:https://www.compthree.com/blog/autoencoder/

这个领域中最成功的技术之一是使用自动编码器进行异常主题检测。自动编码器是一个无监督的人工神经网络,它的主要用途之一是它能够检测异常值。请注意,离群值是从数据集的规范中“脱颖而出”的观察值。然后,如果模型用给定的数据集训练,离群点将是较高的重建误差,因此离群点将很容易通过使用该神经网络来检测。

8.NLP 模型洞察和可视化

可视化表示自然语言处理模型或文本探索性分析的内容是文本挖掘领域最重要的任务之一。从数据科学和 NLP 的角度来看,我们不仅从不同的方面和不同的细节级别探索文档的内容,而且我们还总结单个文档,显示单词和主题,检测事件,并创建故事情节。在许多情况下,可视化非结构化(文本)数据和结构化数据之间存在一些差距。例如,许多文本可视化不直接表示文本,它们表示自然语言处理模型的输出,例如字数、字符长度、单词序列。

单变量或单变量可视化是最简单的可视化类型,它仅由对单个特征或属性的观察组成。单变量可视化包括直方图、条形图和折线图。

在下面的图表中,我们可以看到基于建议的客户评价的极性分布,等级为 1 到 1。

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

影评推荐上的情感极性分布来源:https://towards data science . com/a-complete-explorative-data-analysis-and-visualization-for-text-data-29 fb1 b 96 FB 6a

文字云是一种显示文字在文本集合中有多重要的流行方式。基本上,使用频率越高的单词在图像中占据的空间越大。词云的用途之一是帮助我们对文本集的内容有一个直觉。

假设你想建立一个文本分类系统。如果你想知道不同类别中有哪些不同的常用词,你可以为每个类别建立一个词云,看看每个类别中最流行的词是什么。

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

Worldcloud 显示文本中每个单词的含义来源:IBM

查看每个主题中最常用的单词,我们有一种感觉,我们可能无法在主题类别之间达到任何程度的分离。换句话说,我们不能使用主题建模技术按部门分离评论文本。

作为总结,本文的目的是概述 NLP 可以提供独特优势和可操作性的潜在领域。该列表将在未来随着更多用例的出现而增强。

免责声明: 此处表达的部分观点仅代表本文作者的观点,不一定代表 IBM 公司的观点。博客上的部分内容是版权所有,除非在 IBM Corporation 下另有说明,否则保留所有权利(例如照片、图像)。

利用公共数据增强您的分析

原文:https://towardsdatascience.com/leveraging-public-data-to-enhance-your-analysis-3b2db70eac43?source=collection_archive---------34-----------------------

在公共领域有更多的数据

本文介绍了联邦、州、县和地方级别的各种公共数据源,它们可以帮助增强典型的数据分析任务。

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

亚历山大·哈弗曼在 Unsplash 上拍摄的照片

一.导言

不同级别(联邦、州、县和地方)的美国政府的各种机构收集了大量数据,并将这些数据提供给公众。挑战在于将数据合并在一起以生成有意义的信息。在这份简短的说明中,我们将讨论如何使用公开可用的数据来增强典型的数据分析项目。

对于下面显示的分析,我们使用 R 软件平台,尽管分析可以通过许多软件平台和/或编程语言选项来完成。我们认识到,有许多商业和开源工具对于特定的分析(尤其是在处理、操作、分析和显示地理数据时)要强大得多,但是对于本文的目的,我们将只使用一个软件平台。

我们将回顾常用数据和不常用数据。我们从一张普通的地图开始,看看可以在地图上添加什么来创造一些东西,希望不仅仅是它各部分的总和。我们将使用马里兰州和马里兰州蒙哥马利县的数据进行本文讨论的所有分析。

二。常用数据

2.1 州和县地图

美国人口普查局提供不同地理级别的地图边界文件(国家、县、国会选区、部门、大都市地区、市区、邮政编码列表区等)。)的 shapefile 和 KML 格式[1]。这些文件可用于不同的年份,在某些情况下,不同的准确性水平,是人口普查局的 MAF/老虎地理数据库的一部分。使用人口普查 shapefile 创建的地图示例如图 1 所示,显示了马里兰州的县边界。

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

图 1:使用美国人口普查形状文件的马里兰州县界地图

2.2 人口数据

人口数据通常包括人口、就业、收入、住房单元等。以及他们在各种变量中的分布,如年龄、性别、教育程度、家庭规模等。美国人口普查局通过其优秀的 API 向公众提供非常详细的人口统计数据[2];这些数据构成了一些最常见的数据分析项目的基础。例如,图 2 显示了马里兰州的人口和住房特征。

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

图 2:2010 年马里兰州各县的人口和住房单元

三。不常用的数据

3.1 包裹数据

宗地数据通常会提供县内物业的宗地边界信息。这些数据集通常伴随着财产税数据,这些数据在几种不同的分析中非常有用。

数据在县一级进行管理,因此在美国各县之间,数据格式、使用的字段名称和更新周期存在一定程度的不一致。即使有这个缺点,这也是一个非常有用的数据源,因为大多数县都以 shapefile 格式提供数据,并且数据属性非常相似,合并来自不同县的数据也相对容易。请注意,这些数据集非常大,因此数据处理时间可能因计算设备而异。

马里兰州蒙哥马利县的宗地数据示例如图 3 所示。使用的数据从县规划部门下载[3],具体数据集包含在 property.zip 文件中[4]。该数据集附带的相关数据包括:所有者姓名、地址、财产税详细信息(如评估日期、评估值)、财产详细信息(如地址、分区类别、住宅类型等)。、销售详情,如转让日期、销售价格等。

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

图 3:马里兰州蒙哥马利县邮政编码的包裹边界

要了解这些数据的用处,请看图 4,它显示了马里兰州蒙哥马利县一条街道上的地块边界;总评估值(土地评估值、改善评估值和优惠土地评估值之和)和物业的土地使用类型显示在图的两个面板中。

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

图 4:马里兰州蒙哥马利县街道上的地产的地块边界

3.2 警方数据

全国各地的警察部门提供有价值的犯罪事件数据,这些数据可用于各种目的。数据元素通常包括事故信息,如地址、派遣日期和时间、事故类型、警察局信息等。马里兰州蒙哥马利县[5]的此类数据示例如图 5 所示,该图按调度时间显示了 2020 年的事故。

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

图 5:2020 年 1 月马里兰州蒙哥马利县的警察事件报告

3.3 施工数据

各县提供了大量与施工相关的数据。图 6 显示了马里兰州蒙哥马利县 2020 年颁发的商业建筑许可证的位置[6]。其他数据元素包括工作地点的街道地址、许可日期、建筑面积、申报估价、工作描述、工作类型、结构类型等。

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

图 6:马里兰州蒙哥马利县发放的商业建筑许可——2020 年

3.4 其他数据

还有几个其他数据元素我们没有在本文中探讨。这些包括结构数据、气象和天气数据、运输数据、金融和保险数据等。根据不同的目标,人们可以将这些数据添加到他们的方法中,并创建更强大和完整的分析。

四。关闭

本文介绍了联邦、州、县和地方级别的各种公共数据源,它们有助于增强您的数据分析。数据的格式通常有些不同,并且必须执行额外的步骤,以便数据可以被组合;分析师需要特别注意地理空间数据,以确保使用相同的参考系统。有时,需要进行一些地理编码来将地址数据转换为地理坐标。

参考

  1. 美国人口调查局。制图边界文件— Shapefilehttps://www . census . gov/geographies/mapping-files/time-series/geo/carto-boundary-file . html
  2. 蒙哥马利郡规划局。 GIS 和制图—数据下载https://Montgomery planning . org/tools/GIS-and-mapping/data-downloads/。
  3. 蒙哥马利郡规划局。蒙哥马利县房产数据文件https://mcatlas.org/tiles/00_Shapefiles/property.zip.数据下载于 2020 年 10 月 24 日。
  4. 美国人口调查局。十年一次的人口普查。https://www . census . gov/data/developers/data-sets/decennial-census . html
  5. 蒙哥马利郡政府。案发地图https://data . montgomerycountymd . gov/Public-Safety/Crime-Incident-Map/df95-9nn 9?referrer =嵌入。2020 年 10 月 25 日下载的数据。
  6. 蒙哥马利郡政府。自 2000 年以来颁发的所有商业建筑许可的数据,包括状态和完成的工作。https://data . montgomerycountymd . gov/Property/commercial permits-API/98z 8-bqz 4。2020 年 10 月 25 日下载的数据。

利用 Jupyter 笔记本电脑的强大功能

原文:https://towardsdatascience.com/leveraging-the-power-of-jupyter-notebooks-26b4b8d7c622?source=collection_archive---------14-----------------------

数据科学工具

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

作者图片

Jupyter notebook 是执行数据分析或执行数据科学(密集型数据预处理、EDA 和数据可视化)的最佳平台。尽管 Jupyter 笔记本中出现了很多很酷的东西,但仍有可能是你没有充分利用你的机器的能力。即使有了高端配置的笔记本电脑,无论是 MacBook Pro 还是基于 Windows/Linux 的高端 GPU,它仍然没有发挥出全部潜力。

来源: giphy

是的,那是真的。这是我最近在一个项目中的经历,我的数据集和所有文件总共大约有 37gb。每当我试图创建 spark 数据帧并在其上执行数据处理时,我的 RAM 就会崩溃,而在我的活动监视器中,我的 RAM 使用并不是问题。事实上,我的内存只有不到四分之一被使用。

这时我意识到问题可能出在 Jupyter 笔记本上。事实证明,Jupyter 达到了内存上限。现在,这是我觉得非常重要的事情,因为我以前在处理较小的数据集时没有遇到过这样的问题。

即使在拥有一台高端机器后,我也没有充分利用我的机器

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

来源: dataquest

内存不足:

我是这样解决这个问题的:

我在 Mac 上做这个,但是这个过程对于 Windows 或者 linux 机器来说是非常相似的。

  1. 打开你的终端,把目录改成**。jupyter** 并键入以下命令

光盘。朱皮特

jupyter 笔记本-生成-配置

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

这将在中生成一个jupyter _ notebook _ config . py文件。jupyter 文件夹。

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

2.打开 jupyter_notebook_config.py 文件并编辑以下属性:

NotebookApp.max_buffer_size = your desired value

您需要取消对该属性的注释,并根据您机器上的 RAM 数量添加您想要的值。这是我的样子:

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

在 Mac 中,属性以 c 为前缀:

c.NotebookApp.max_buffer_size = your desired value

请记住,所需的值是在**字节中。**例如,在我的例子中,我希望 Jupyter 的容量大约为 12g,所以我放了 12000000000 字节。

3.另一种更简单的方法是在终端中键入以下命令:

jupyter notebook --NotebookApp.max_buffer_size=your_value

瞧啊。你都准备好了。这将提高您的处理任务,并利用您的机器的高端配置。

IOPub 数据速率:

使用 Jupyter 环境时可能遇到的另一个常见问题是 **IOPub 数据速率。**错误如下所示:

IOPub data rate exceeded.
The notebook server will temporarily stop sending output
to the client in order to avoid crashing it.
To change this limit, set the config variable
`--NotebookApp.iopub_data_rate_limit`.

Current values:
NotebookApp.iopub_data_rate_limit=1000000.0 (bytes/sec)
NotebookApp.rate_limit_window=3.0 (secs)

当您想要使用 python 可视化库(如 Plotly、matplotlib、seaborn 等)可视化大量数据时,通常会出现这种情况。jupyter 的默认配置未设置为处理过量的数据,因此出现此错误消息。我曾经在使用可视化库可视化大型数据集时遇到过这种错误,但是当您使用 Jupyter 处理大量数据或有大量数据交换时,您可能会遇到这种数据。

这里有一个简单的方法来解决这个问题:

jupyter notebook --NotebookApp.iopub_data_rate_limit=your_value

请记住,所需的值是以字节表示的。例如,在我的例子中,我希望 Jupyter 处理数据的上限达到 10g,所以我将设为 10000000000 字节。

jupyter notebook --NotebookApp.iopub_data_rate_limit=10000000000

你都准备好了!

编码快乐!😃

来源:吉菲

在机器学习模型中利用邮政编码、NAICS 编码、区号和其他古怪的分类变量的价值

原文:https://towardsdatascience.com/leveraging-value-from-postal-codes-naics-codes-area-codes-and-other-funky-arse-categorical-be9ce75b6d5a?source=collection_archive---------28-----------------------

利用均值/目标编码提升结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 [## shad Griffin/邮政编码

permalink dissolve GitHub 是超过 5000 万开发人员的家园,他们一起工作来托管和审查代码,管理…

github.com](https://github.com/shadgriffin/zip_code/blob/master/Leveraging%20Mean/Target%20Encoding.ipynb)

你居住的邮政编码透露了你大量的信息。(至少在北美)。你住在哪里表明:你的年收入,你是否有孩子,你看的电视节目和你的政治倾向。

在美国,有超过 41,000 个唯一的邮政编码。邮政编码很大程度上是绝对的。邮政编码的前两位数字有一些宽泛的含义。例如,夏威夷的邮政编码以 9 开头,缅因州的邮政编码以 0 开头。除了非常普通的地理信息之外,代码本身真的没有什么价值。

如果我说乔住在 76092 号呢?这真的能让你了解他吗?

不完全是。

如果我谷歌一下那个邮政编码。我会发现 76092 是德克萨斯州的南湖。南湖是德克萨斯州最富裕的地区之一。住在 76092 意味着乔可能一年挣 10 万多,并且受过大学教育。

我的观点是代码本身并没有告诉我们太多。我们必须找到创造性的方法从邮政编码中提取价值。

因此,鉴于邮政编码可以告诉我们许多关于居住在其中的人的信息,我们如何提取这些信息并在机器学习模型中利用它们呢?

处理邮政编码之类的分类变量的一种方法是将它们分成虚拟变量。这就是“一个热编码器”的作用。不幸的是,当一个分类变量有 41,000 个唯一值时,虚拟变量真的帮不上什么忙。在邮政编码上使用“一个热编码器”意味着你将创建 40,999 个新的独立变量。呀,真是一团糟!

另一种方法叫做均值/目标编码。坦白地说,我使用这种技术已经超过 20 年了,直到最近我才听到它被这样称呼。不过这并不重要。不管你想叫它什么,它对分类变量都很适用,比如邮政编码、NAICS、人口普查区或任何其他有意义的分类变量,这些变量有许多不同的值。

在这个例子中,我浏览了一个客户创造用例。该公司希望扩大客户群,但营销/销售资源有限。因为他们没有足够的钱联系数据库中的每个人,所以他们将使用预测模型来预测那些最有可能购买他们产品的潜在客户。我不会在本笔记本中构建模型。相反,我将展示您可以利用您的历史数据和邮政编码来创建功能,从而构建更具预测性的机器学习模型。

当我写这篇文章的时候,是 2020 年 2 月。所以,我们的目标是建立一个能预测 2020 年的模型。为此,我们将使用 2019 年的数据。当我们进行特征工程时,最好不要使用与模型相同的数据。这样做会导致一些主要的因果问题和过度拟合。我将使用 2018 年的数据来构建我的特征,而不是 2019 年。所以,只是为了重新封顶。我将使用 2018 年的数据来构建我的功能。使用 2019 年的数据建立一个模型,并将该模型应用于 2020 年的当前潜在客户。

没有多年的数据怎么办?在这种情况下,我建议创建一个单独的数据集样本来构建您的要素。因此,在构建模型时,您会将数据分成四组。这将包括培训、测试、验证和特征构建数据集。

最后,我将创建针对客户获取问题的摘要,但这种技术几乎适用于所有情况。例如,您可以为医疗保健行业的供应商代码创建平均成本。或者,某些 NAICS 代码的商务费率。理解这一过程并认识到这一技术可以应用于许多不同的情况是很重要的。

第一步是导入 python 库。

import numpy as np
import numpy.dual as dual
import pandas as pd

正如我前面提到的,我们希望在 2019 年的数据上建立一个模型,来预测 2020 年的客户获取。为了构建我们的功能,我们将使用 2018 年的数据。

从 Github 拉入 2018 年的数据。

!rm YEAR_2018_1.csv
!wget [https://raw.githubusercontent.com/shadgriffin/zip_code/master/YEAR_2018_1.csv](https://raw.githubusercontent.com/shadgriffin/zip_code/master/YEAR_2018_1.csv)!rm YEAR_2018_2.csv
!wget [https://raw.githubusercontent.com/shadgriffin/zip_code/master/YEAR_2018_2.csv](https://raw.githubusercontent.com/shadgriffin/zip_code/master/YEAR_2018_2.csv)pd_datax = pd.read_csv("YEAR_2018_1.csv")
pd_datay = pd.read_csv("YEAR_2018_2.csv")df_data_1 = pd.concat([pd_datax,pd_datay])

探索数据。

df_data_1.head()

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

这是一个相当简单的数据集。以下是这些字段的描述。

ZIP5 —个人的邮政编码。

HAS_CHILDREN — 1 表示个人有孩子。0 表示没有。

PRIMARY_LANGUAGE —个人的主要语言。

收入——个人收入。

年龄-个人的年龄。

居住时间长度—个人在当前地址居住的时间长度。

HOME_OWNER_RENTER — O 表示个人拥有自己的家。

客户—指明记录是否属于客户。1 是客户,0 是非客户。

流失-1 表示个人在 2018 年取消了他们的产品。0 表示他们没有取消。

ACQ-1 表示个人在 2018 年获得该产品。

收入——个人 2018 年的总收入。

年份—个人记录的年份。

这可能是显而易见的,但是从特性工程的角度来看,最后五个领域是非常重要的。在接下来的几行代码中,对于每个邮政编码,我们将得到以下内容。

ZIP _ PENETRATION _ RATE——在一个邮政编码区内,消费者所占的百分比。

邮政编码流失率—特定邮政编码的流失率

ZIP_AQC_RATE —邮政编码的客户获取率。

ZIP _ AVG _ REV-特定邮政编码的客户的平均收入。

ZIP _ MEDIAN _ REV 特定邮政编码的客户的收入中值

ZIP_CUSTOMERS —特定邮政编码的客户总数。

ZIP_POPULATION —特定邮政编码中的总人数。

ZIP_CHURNERS —特定邮政编码中的 CHURNERS 总数。

ZIP _REVENUE —特定邮政编码的总收入。

通过创建这些新的字段,我们可以提取嵌入在邮政编码中的值。

dfx=df_data_1# Create churn features
zip_churn = pd.DataFrame(dfx.groupby(['ZIP5'])['CHURN'].agg(['sum']))
zip_churn['TOTAL']=dfx.CHURN.sum()zip_churn.columns = ['ZIP_CHURNERS','TOTAL_CHURNERS']#Create customer and popluation features
zip_cust = pd.DataFrame(dfx.groupby(['ZIP5'])['CUSTOMER'].agg(['sum','count']))
zip_cust['TOTAL_CUSTOMERS']=dfx.CUSTOMER.sum()
zip_cust['TOTAL_POPULATION']=dfx.CUSTOMER.count()zip_cust.columns = ['ZIP_CUSTOMERS','ZIP_POPULATION','TOTAL_CUSTOMERS','TOTAL_POPULATION']#create acquisition features
zip_acq = pd.DataFrame(dfx.groupby(['ZIP5'])['ACQ'].agg(['sum']))zip_acq['TOTAL']=dfx.ACQ.sum()zip_acq.columns = ['ZIP_ACQUISITIONS','TOTAL_ACQUISITIONS']#Create Total Revenue Features
zip_rev = pd.DataFrame(dfx.groupby(['ZIP5'])['REVENUE'].agg(['sum']))
zip_rev['TOTAL']=dfx.REVENUE.sum()zip_rev.columns = ['ZIP_REVENUE','TOTAL_REVENUE']#create median revenue features.
df_cust=dfx[dfx['CUSTOMER']==1]zip_med_rev = pd.DataFrame(df_cust.groupby(['ZIP5'])['REVENUE'].agg(['median']))
zip_med_rev['TOTAL']=df_cust.REVENUE.median()zip_med_rev.columns = ['MED_REVENUE','TOTAL_MED_REVENUE']

将要素追加到单个数据框中。

df_18 = pd.concat([zip_cust,zip_acq, zip_churn, zip_rev,zip_med_rev], axis=1)
df_18.reset_index(level=0, inplace=True)

请注意,在计算平均值和比率时,您必须小心小样本量。在这个例子中,如果一个邮政编码中有超过 100 人,我只计算这个邮政编码的比率或平均值。您希望避免仅仅因为样本少而导致指标高或低的情况。例如,如果在一个邮政编码区有两个人,其中一个是客户,渗透率将会非常高(50%)。这个高数字并不意味着邮政编码是潜在客户的沃土。也许是吧。也许不是。如果你的样本中只有两个人,那么这个统计数据就没有任何价值。

就像我前面提到的,我只在超过 100 人的情况下使用统计数据或比率。如果少于 100 人,我使用全球平均值或比率。注意,100 没什么神奇的。您应该使用一个符合逻辑并满足您的业务案例需求的数字。我也见过这样的例子,如果某个特定群体的样本量很小,人们会使用加权指标。也就是说,他们将采用邮政编码中的案例,并以加权方式与全球平均值/比率相结合。我认为这有点过分了,但是如果它能让你高兴,那就去做吧。

df_18[‘ZIP_PENETRATION_RATE’] = np.where(((df_18[‘ZIP_CUSTOMERS’] <100 )), (df_18[‘TOTAL_CUSTOMERS’])/(df_18[‘TOTAL_POPULATION’]), (df_18[‘ZIP_CUSTOMERS’])/(df_18[‘ZIP_POPULATION’]))
df_18[‘ZIP_ACQ_RATE’] = np.where(((df_18[‘ZIP_CUSTOMERS’] <100 )), (df_18[‘TOTAL_ACQUISITIONS’])/(df_18[‘TOTAL_POPULATION’]), (df_18[‘ZIP_ACQUISITIONS’])/(df_18[‘ZIP_POPULATION’]))
df_18[‘ZIP_CHURN_RATE’] = np.where(((df_18[‘ZIP_CUSTOMERS’] <100 )), (df_18[‘TOTAL_CHURNERS’])/(df_18[‘TOTAL_CUSTOMERS’]), (df_18[‘ZIP_CHURNERS’])/(df_18[‘ZIP_CUSTOMERS’]))
df_18[‘ZIP_AVG_REV’] = np.where(((df_18[‘ZIP_CUSTOMERS’] <100 )), (df_18[‘TOTAL_REVENUE’])/(df_18[‘TOTAL_CUSTOMERS’]), (df_18[‘ZIP_REVENUE’])/(df_18[‘ZIP_CUSTOMERS’]))
df_18[‘ZIP_MED_REV’] = np.where(((df_18[‘ZIP_CUSTOMERS’] <100 )), (df_18[‘TOTAL_MED_REVENUE’]), (df_18[‘MED_REVENUE’]))df_18=df_18[[‘ZIP5’, ‘ZIP_CUSTOMERS’, ‘ZIP_POPULATION’, ‘ZIP_ACQUISITIONS’, 
 ‘ZIP_CHURNERS’, ‘ZIP_REVENUE’,’ZIP_PENETRATION_RATE’,
 ‘ZIP_ACQ_RATE’, ‘ZIP_CHURN_RATE’, ‘ZIP_AVG_REV’, ‘ZIP_MED_REV’]]df_18.head()

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

很容易迷失在 python 代码中,但是让我们后退一步,记住我们的目标。我们的目标是提取包含 41000 个唯一值的分类变量中的隐藏值。也就是说,当变量的实际值没有用时,让变量变得有用。这就是我们所做的。比如值 75001 就不是很有用。然而,知道邮政编码 75001 的产品渗透率为. 260722 是非常有用的。

既然我们已经创建了邮政编码级别的要素,我们可以将它们追加到我们的建模数据集 2019 数据中。

从 GitHub 收集数据。并将特征附加到 2019 年的数据中。

!rm YEAR_2019.csv
!wget [https://raw.githubusercontent.com/shadgriffin/zip_code/master/YEAR_2019.csv](https://raw.githubusercontent.com/shadgriffin/zip_code/master/YEAR_2019.csv)
df_2019 = pd.read_csv("YEAR_2019.csv")df_2019 = pd.merge(df_2019, df_18, how='inner', on=['ZIP5'])df_2019.head()

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

现在,我们可以使用我们的功能,以 ACQ 为因变量建立一个收购模型。这些功能应该允许我们从邮政编码字段中提取完整的预测值。

最后一点。当您实际将模型部署到我们 2020 年的数据时,请使用 2019 年的数据来创建您的邮政编码特征变量,而不是 2018 年。这有道理吧?这些特征是从上一年的数据中提取的。当我们为 2019 年建立模型时,这是 2018 年。当我们为 2020 年部署模型时,这将是 2019 年。

我希望这有所帮助。

自然语言处理—从初级到高级(下)

原文:https://towardsdatascience.com/lexical-processing-for-nlp-basic-9fd9b7529d06?source=collection_archive---------26-----------------------

NLP 项目

基本的词汇处理——在进行任何类型的文本分析之前,对文本数据必须进行的预处理步骤。

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

安妮·斯普拉特在 Unsplash 上的照片

在“NLP 项目”系列的这一部分中,我们将了解在进行任何类型的文本分析之前必须应用的各种预处理步骤,例如将机器学习应用于文本、构建语言模型、聊天机器人、情感分析系统等。几乎所有处理文本数据的应用程序都会用到这些步骤。

停止言语

现在,一篇文章由字母、单词、句子和段落组成。你能做的最基本的统计分析就是看词频分布,也就是把一个给定的文本数据的词频分布可视化。

概括地说,在任何文本数据中有三种类型的词—

  • 出现频率最高的词称为停用词,例如“in”、“and”、“The”、“a”等。
  • 最能解释数据的“重要”词有一个平均频率。
  • 以及不常用或罕见的单词,这些单词也没有多大帮助。

通常,删除停用词有两个原因—

  • 首先,它们没有为垃圾邮件检测器或搜索引擎等应用程序提供任何有用的信息。
  • 第二,停用词的频率如此之高,以至于将它们从数据集中移除会导致文本数据的计算快得多。

然而,在某些情况下,这些停用词提供了有意义的(语法)信息,例如在词性标注、语法分析等概念中。因此不能被移除。但总的来说,它们并没有提供多少信息。

标记化

为了建立任何机器学习模型,人们需要为它提供算法可以接受并建立模型的特征/属性。但是,通用文本没有任何预先存在的特征,它只是单词、字母、句子等的组合。

因此,为了从文本中提取特征,我们需要标记化。

记号化是一种将给定文本分成更小部分的技术,比如字符、单词、句子,甚至段落,这取决于您正在使用的应用程序。

不同类型的记号化技术可以用来分解一个给定的文本,每一种都有它的用例。自然语言工具包(NLTK)为您提供了以下内容

  • 分词器将文本拆分成单词,并将每个单词视为一个特征。
  • 句子分词器将文本拆分成句子,并将每个句子视为一个特征。
  • Tweet tokenizer 甚至从社交媒体文本中提取表情符号和标签作为特征。
  • 正则表达式记号赋予器让你使用你选择的正则表达式模式构建你自己的定制记号赋予器。

词干化和词汇化

现在,如果你使用单词标记器,你会得到每个单词作为一个特征用于模型的建立。因此,你会得到许多多余的特征,如“得到”和“得到”,“去”和“去”,“看到”和“看到”,以及许多其他重复的特征。它们当然不是重复的,但是它们是不必要的,因为它们没有给你关于消息的额外信息。

因此,将两者分开会妨碍机器学习算法的性能,因为它是不必要的信息。此外,这种重复增加了特征的数量,使得分类可以面对“维数灾难”。为了克服这个问题,我们有两种方法,词干化和词汇化。

词干化是一种基于规则的技术,它只是砍掉一个单词的后缀来获得它的词根形式,它被称为‘词干’。例如,如果您使用词干分析器来对字符串中的单词进行词干分析,例如“司机正开着他老板的车参加比赛”,那么只需去掉后缀“er”和“ing”,单词“driver”和“racing”就会转换为它们的词根形式。所以,‘driver’会转换成‘driv’,‘racing’会转换成‘RAC’。

你可能认为词根形式(或词干)不像词根——“drive”和“race”。你不必担心这一点,因为词干分析器会将“drive”和“racing”的所有变体只转换成那些根形式。所以,它会转换‘drive’,‘driving’等。到“驾驶”、“比赛”、“赛车”等。到“rac”。在大多数情况下,这给了我们满意的结果。

有两种流行的词干分析器:

  • 波特词干分析器:这是 1980 年开发的,只对英语单词有效。你可以在这里找到这个词干分析器的所有详细规则。
  • 这是一个更加通用的词干分析器,它不仅可以处理英语单词,还可以处理其他语言的单词,比如法语、德语、意大利语、芬兰语、俄语以及更多的语言。你可以在这里了解更多关于这个词干分析器的信息。

词汇化是一种更复杂的技术,它不会删除单词的后缀。取而代之的是,它接受输入的单词,遍历字典中单词的所有变体,并搜索它的源单词。在这种情况下,词根叫做引理。使用词干分析器无法将术语“英尺”、“驱动”、“向上”、“向上”和“购买”简化为它们正确的基本形式。但是 lemmatizer 可以将它们简化为正确的基本形式。最流行的词汇分类器是由普林斯顿大学的一组研究人员创建的 Wordnet 词汇分类器。你可以在这里了解更多关于的信息。

但是,您有时可能会对是使用词干分析器还是词汇分析器感到困惑。以下因素可以帮助您做出决定:

  • 斯特梅尔是一种基于规则的技术,因此它比词条解释器(它在字典中搜索以找到单词词条)快得多。另一方面,词干分析器通常比词汇分析器给出更准确的结果。
  • 由于字典搜索,lemmatizer 速度较慢,但比词干分析器提供更好的结果。现在,作为旁注,要正确处理 lemmatizer,您需要输入输入单词的语音部分(名称、功能、形容词等。).我们还没有达到词性标注,但知道在文本中经常有词性标注不正确的情况就足够了,这也会影响 lemmatizer 的性能。简而言之,如果你注意到词性标注不合适,你可能要考虑一个 steamer 而不是 lemmatizer。

一般来说,您可以尝试这两种方法,看看是否值得在词干分析器上使用 lemmatizer。

今天就到这里了,伙计们。感谢反馈。此外,如果你想让我详细介绍以上任何话题,请在回复中留下。我将在下一篇文章中讨论词汇处理的高级主题。敬请关注。

LexNLP —自动文本提取和 NER 库

原文:https://towardsdatascience.com/lexnlp-library-for-automated-text-extraction-ner-with-bafd0014a3f8?source=collection_archive---------16-----------------------

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

使用 LexPredict,即将推出的命名实体识别高级库(NER)来提取姓名、地址、日期等。

介绍

几周前,我不得不从一组文档中提取某些类型的数据,并想知道最好的方法是什么。这些文件都是租赁表格,上面有实体名称、地址、日期、金额、条件等数据。

我以传统的方式开始,使用正则表达式在每个文档中用它们各自的同义词来标识某些字段。我不得不手动设置提取每种类型字段的规则。

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

米卡·博斯韦尔在 Unsplash 上的照片

然而,我后来发现了 LexNLP 及其功能。我需要的所有数据都是用 LexNLP 提取的,无需编写任何规则。我对这个库感到非常惊讶,但是除了文档之外,我没有找到任何教程。因此,我在这里为其他数据专业人员创建了一个通向 LexNLP 的网关,他们可以从它的特性中受益。

下面是 LexNLP 的概述,它是由 ContraxSuite 制作的。我提供了提取某些类型数据的例子,比如日期、实体名称、金钱和地址。该图书馆目前有英文、西班牙文和德文版本。

LexNLP 可以从文本数据中提取以下所有信息:

要求

LexNLP 需要 python 3.6!所以建议你用 python 3.6 创建一个全新的虚拟环境,并从下面的 github 链接下载 LexNLP 库的所有需求。

[## LexPredict/lexpredict-lexnlp

LexNLP 是一个用于处理真实的、非结构化的法律文本的库,包括合同、计划、政策、程序…

github.com](https://github.com/LexPredict/lexpredict-lexnlp)

一旦你安装好了所有的东西,试试import LexNLP。如果它工作了,那么你就可以继续了,但是如果你遇到了一个错误,再次检查需求,确保你有正确的版本。如果你需要任何帮助,请在下面评论。

我们将从导入以下每个库开始。确保安装以下每个库:

from tika import parser
import glob, os
import pandas as pd
from bs4 import BeautifulSoup
import codecs
import re
import numpy as np

从 PDF/Word 文档中阅读文本。

因为我所有的文件都是 PDF/Doc 格式的,所以我只需要从每个文档中提取文本作为字符串。为此,我将使用图书馆 Tika。我下面写的函数给了我一个数据框,其中包含每个文件的信息,包括提取所需的文本。

def multipdftotxt(path): df = pd.DataFrame(columns = ['S.No', 'File_Name', 'Author', 'Creation_Date', 'Title','Content'])
    pdfs = []
    i=0
    os.chdir(path)
    types = ['*.pdf', '*.doc', '*.docx']
    textfiles = []

    for typ in types:
        textfiles.append(glob.glob(typ))
    flat_list = []
    for sublist in textfiles:
        for item in sublist:
            flat_list.append(item)
    textfiles = flat_list

    for file in textfiles:
        print(file)
        raw = parser.from_file(file)

        text = raw['content']
        dict2 = raw['metadata']
        Author = dict2.get('Author')
        Creation_Date = dict2.get('Creation-Date')
        title = dict2.get('title') i = i+1
        df1 = {'S.No': i,'File_Name': file,'Author': Author,'Creation_Date': Creation_Date, 'Title': title,'Content': text}
        df = df.append(df1, ignore_index=True)
    df = df.replace('\n', ' \n ', regex=True, ) 
    df = df.replace('\t', ' ', regex=True)
    df = df.dropna(subset=['Content'])

    return df

上图向我们展示了数据框的样子。我从这个数据框中需要的只是“文本”和“文件名”两列,因此我将使用另一个函数在字典中提取这两列。

def dftod(df): l = []
    for i in df['Content']:
        l.append(i)
    emailname = []
    for i in df['File_Name']:
        emailname.append(i) d = dict(zip(emailname, l))

    k = [v.strip() for k,v in d.items()]
    k = [re.sub(' +', ' ', temp) for temp in k]
    k = [re.sub('\n +', '\n', temp) for temp in k]
    k = [re.sub('\n+', '\n', temp) for temp in k]    d = dict(zip(emailname, k))
    return d

现在,我已经提取了字典中的文本,并准备使用 LexNLP 的提取特性。

提取,血统

从 LexNLP 导入正确的函数是正确使用这个库的关键。下面,我将向您展示如何提取特定类型的数据:实体名称、地址、日期和货币。

实体名称

import lexnlp.extract.en.entities.nltk_re*#Remember d is our dictionary containing filenames and text.
#For entity names, use* lexnlp.extract.en.entities.nltk_re.**get_companies**(text)for filename,text in d.items():
print(list(lexnlp.extract.en.entities.nltk_re.get_entities.nltk_re.get_companies(text)))***Output:*** ['Target Inc', 
'Hawthorne LLC', 
'Willburne & Co.']

地址

from lexnlp.extract.en.addresses import address_features#You want to use lexnlp.extract.en.addresses.address_features.**get_word_features**(text)for filename,text in d.items():
print(list(lexnlp.extract.en.addresses.address_features.**get_word_features**(text)))#Check for DateTime/Zip-code/Email-Address/URL:
lexnlp.extract.en.addresses.address_features.**is_datetime**(text)
lexnlp.extract.en.addresses.address_features.**is_zip_code**(text)
lexnlp.extract.en.addresses.address_features.**is_email**(text)
lexnlp.extract.en.addresses.address_features.**is_url**(text)

日期

可以按以下格式提取日期:

  • 1998 年 2 月 1 日
  • 2017–06–01
  • 2017 年 6 月 1 日
  • 2016 年 10 月 31 日
  • 2000 年 3 月 15 日
import lexnlp.extract.en.datesfor filename,text in d.items():
print(list(lexnlp.extract.en.dates.get_dates(text)))***Output:***
[[datetime.date(1998, 2, 1)],
[datetime.date(2017, 6, 1)],
[datetime.date(2016, 10, 31)],
[datetime.date(2000, 3, 15)]]

金钱

可以通过以下方式提取资金:

  • 五美元
  • 5 美元
  • 5 美元
  • $5

到目前为止,只有以下货币可以通过 LexNLP 进行检测:

  • 美元/$:美元
  • 欧洲/€:欧元
  • GBP/:英镑
  • JPY/:日元
  • CNY/RMB/元/¥: Chinese Yuan/Renminbi
  • INR/₨/₹:印度卢比
import lexnlp.extract.en.moneyfor filename,text in d.items():
print(list(lexnlp.extract.en.money.get_money(text)))**Output:** [(5000000.00, 'GBP'),
(100000.00, 'INR')]

有关更多信息和资源,请访问官方文档:

https://lex predict-lex NLP . readthedocs . io

当 LexNLP 进行挖掘的时候,享受你的咖啡,等待那些结果展现出来!

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

内森·杜姆劳在 Unsplash 上的照片

继续跟着!我感谢你的爱。
在过去的几个月里,我没有写那么多,但我很高兴地说,我又回到了游戏中。

政治、Python 和维基百科

原文:https://towardsdatascience.com/liberating-knowledge-from-the-free-encyclopedia-af8c8dbdb751?source=collection_archive---------39-----------------------

使用 Python 和 MediaWiki Action API 来查看维基百科修订版是否表明 2020 年民主党副总统提名人。

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

台虎钳照片。Gabriel Manlake 在 Unsplash 上拍摄的照片

上个月, The Intercept 发表了一篇文章声称,“在最近的总统选举周期中,对维基百科页面进行编辑的速度与副总统竞选伙伴的选择相关联。”这篇文章关注的是卡玛拉·哈里斯,以及 6 月份她维基百科页面上出现的越来越多的编辑。

这篇文章认为,编辑的速度可以被解释为她被提名为副总统候选人的潜力的信号。有意思。但是有效吗?

现在一个月过去了,仍然没有做出选择,我决定亲自看看这些变化。我想看看她的编辑率与其他潜在候选人相比如何。我也很好奇,想看看我们是否可以从这些结果中得出任何其他的关联,以加深我们对其意义的理解。所以,我转向 Python。

没有单一的 2020 年潜在民主党副总统候选人的确定名单,所以因为我们正在与维基百科合作,我将通过收集维基百科文章“ 2020 年民主党副总统候选人选择”的列表来保持真实的来源以下是被提名者。

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

截图来自维基百科。

获取修订时间戳

为了实现我的目标,我需要从维基百科中检索每个潜在候选人的数据。为此,我们可以使用 MediaWiki 操作 API 。我们开始吧!

取一些名字

我先准备一份名单。我们将使用这个名称列表来查找它们各自的维基百科文章的修订时间戳:

nominees = ['Karen Bass', 'Keisha Lance Bottoms', 'Val Demings', 'Tammy Duckworth', 'Kamala Harris', 'Michelle Lujan Grisham', 'Susan Rice', 'Elizabeth Warren', 'Gretchen Whitmer']

获取一些时间戳

现在我将部署一个函数,允许我们对 Wikipedia 进行 API 调用,并返回给定文章的修订时间戳列表。为此,我们将使用请求库:

因此,如果我在谭美·达克沃斯的维基百科文章上运行这个函数,它的用法如下:

get_revision_timestamps('Tammy Duckworth')

它会返回一个如下所示的列表:

print(get_revision_timestamps('Tammy Duckworth'))['2020-08-06T18:19:43Z', '2020-08-06T18:18:43Z', '2020-08-06T18:16:01Z', '2020-08-06T18:15:00Z', '2020-08-06T18:13:51Z', ...]

如您所见,我们已经返回了一个时间戳列表,按照从最新到最早的顺序存储为字符串。这只是完整列表的一部分,在编写本文时包含 2484 个时间戳。修改的真多啊!

绘制时间戳

既然我们知道了如何获得时间戳,我们就可以为我们的完整提名列表这样做了。但在此之前,让我们弄清楚如何将它们转换成图形。为此,我们将求助于 matplotlib 的 pyplot 模块。虽然 pyplot 可以方便地管理日期,但我们首先必须以 Python 可以正确解释的方式准备数据。

反转我们的时间戳列表

因为我们的修订时间戳列表是从最新到最老生成的,所以我们也应该反转它,以便及时向前绘制。

timestamps = get_revision_timestamps('Tammy Duckworth')
timestamps.reverse()print(timestamps)['2006-01-11T23:50:14Z', '2006-01-11T23:50:48Z', '2006-01-12T00:04:03Z', '2006-01-12T00:04:45Z', '2006-01-12T00:06:14Z', ...]

现在它们按时间顺序排列。太好了!

将时间戳列表从字符串转换为日期时间对象

不幸的是,我们的时间戳仍然只是字符串。为了将它们转换成可解释的日期格式,我们必须将它们转换成日期时间对象。为此,我们可以使用 Python 内置的 datetime 库。注意,我在日期时间库中使用了日期时间模块*。*

from datetime import datetimedates = []    
for stamp in timestamps:        
    d = datetime.strptime(stamp, '%Y-%m-%dT%H:%M:%SZ')        
    dates.append(d)

好吧!我们已经成功地将时间戳转换为日期时间对象:

print(dates)[datetime.datetime(2006, 1, 11, 23, 50, 14), datetime.datetime(2006, 1, 11, 23, 50, 48), datetime.datetime(2006, 1, 12, 0, 4, 3), ...]

绘制日期时间对象

既然我们的日期可以被 Python 解释,我们就可以继续绘制它们了。对于这一步,我们将使用 pyplot 的“plot_date”函数。这个函数有两个参数:x 值和 y 值。对于 x 值,我们使用日期时间对象列表。对于 y 值,我使用了一个与我的 datetime 对象列表长度相同的数字范围。这将允许我为绘制的每个日期(沿 x 轴)将计数(y 轴)增加 1。

import matplotlib.pyplot as pltplt.plot_date(dates, range(len(dates)))

“plot_date”函数查看我们的日期列表,并找到最大值和最小值。然后,它创建一个等间距的日期序列作为我们的 x 轴,并相应地绘制日期。它还检测我们的 x 或 y 值是否包含日期,并强制这些值沿着 x 轴移动。

与任何 matplotlib 图形一样,我们可以调整标签和格式。我将保持它的最小化,这样我们就可以切到一些结果。我添加了一个标题,并在坐标轴上贴了标签:

plt.title('Tammy Duckworth Wikipedia Revisions')
plt.xlabel('Time')
plt.ylabel('Revisions count')
plt.show()

结果是:

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

谭美·达克沃斯维基百科页面的修订计数。图片作者。

瞧啊。有趣的是,这是同样的图表,但是是乔·拜登的维基百科页面。我认为这是这种绘图方法叙事能力的一个很好的例子:

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

乔拜登维基百科页面的修订计数。图片作者。

比较页面修订

所以就眼前的事情来说。现在我们可以获得时间戳,将它们转换为日期时间对象,并绘制它们,让我们为潜在的民主党副总统提名人的完整列表做这件事。注意,我从导入“GetRevisionTimestamps”开始,这是包含我的时间戳检索函数“get_revision_timestamps”的模块。如果您想避免这种导入,只需将定义的函数复制/粘贴到这个块上面的某个地方。

结果:

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

正如我们所见,并非所有曲线都是相同的。这些曲线在所表示的数据量以及比例上有所不同。它们在时间跨度上也各不相同。

尽管如此,我们已经可以看到一些有趣的趋势。有些曲线呈线性,有些呈阶梯状,有些接近二次曲线。有些人两者都有。当我们在一些图中看到中断时,我们可以推断没有提交修订。然而,我们仍然可以绘制出上升的轨迹。

现在,上面的图像代表了每篇文章的所有修订。但是,如果我想过滤所有的图,只反映一个特定的日期范围,就像在截距的片段中那样,该怎么办呢?我可以编写一个函数,将开始和结束日期作为可选参数,并且只绘制在所述范围内的日期:

过滤和缩放后的结果:

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

现在一些结果开始显现。我们可以看到在 The Intercept 的文章中确定的趋势确实仍然适用于卡玛拉·哈里斯。虽然还不太容易说出这意味着什么,但我们也可以注意到凯伦·巴斯、谭美·达克沃斯和苏珊·赖斯的一些新兴增长。让我们再放大一点。我只看过去三周,就像 The Intercept 的文章所做的那样:

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

好吧。现在出现了一种模式。让我们关注最近编辑次数最多的四个候选人:

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

好吧。这无疑使故事变得复杂了。如果这一标准可信,那么卡玛拉·哈里斯似乎有了新的竞争对手。但是,现在我们应该问自己,我们能在多大程度上信任这一措施?

《截击》的文章详细描述了哈里斯维基百科页面被修改的本质,这无疑为控制她在平台上的公众形象的动机提供了令人信服的论据。然而,这一批评与最初的主张截然不同。最初的说法是,副总统候选人的选择与维基百科页面的修改速度相关。虽然考虑所做修改的性质可能是值得的,但现在我想把重点放在这个最初的声明上。如果这种说法是真的,这将表明衡量修正可以为理解拜登竞选策略提供一个有用的指标。但是,至少在目前,这一措施提供了一个不确定的结果。

与谷歌趋势形成对比

出于好玩和好奇,我从 Google Trends 上抓取了一些数据,看看他们在相同的三周内是如何报告对相同的四个候选人的兴趣的。然后我用 pyplot 绘制数据:

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

潜在的 2020 年民主党副总统候选人的谷歌趋势数据(非累积),2020 年 7 月 17 日-2020 年 8 月 6 日。图片作者。

结果和我们在维基百科上看到的相似。请记住,维基百科的结果是累积的,因此显示的加速度不同,我们必须小心进行直接比较。让我们继续修正谷歌的结果,以反映一个累积的措施:

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

潜在的 2020 年民主党副总统候选人的谷歌趋势数据(累积),2020 年 7 月 17 日-2020 年 8 月 6 日。图片作者。

我们又开始看到一幅熟悉的画面。看来,至少对这些候选人来说,维基百科的修改次数似乎与整体兴趣水平一致。那么,这真的是一个可能选择的指标吗?

附加注释

改进的余地

这种情节比较当然可以改进。作为一个例子,我要提到的是,虽然 The Intercept piece 的声明处理的是编辑的速度,但他们的分析内容实际上只处理了编辑的原始数量。如果我们真的想探索编辑速度的变化,一个可能的方法是将最近每天的平均编辑次数标准化为文章生命周期中每天的平均编辑次数。

我没有把这个分析进行到底,但也许有人会!下面是一系列函数,将返回给定文章在给定时间单位内的平均编辑次数:

为了快速获得结果,我编写了一个脚本,修改“avg_wiki_edits”函数来生成给定时间段和时间单位的平均最近编辑,然后使用“avg_wiki_edits”来生成给定时间单位的平均生命周期编辑。有了这两个结果,它计算出一个比率,然后把结果以句子的形式表达出来:

标准化结果:

凯伦·巴斯:

Average number of edits per day over article lifetime:    1.94
Average number of edits per day between 2020-07-17 and 2020-08-07:     8.53
Between 2020-07-17 and 2020-08-07, Karen Bass's Wikipedia page has received 4.396907216494845 times more edits per day than average.

谭美·达克沃斯:

Average number of edits per day over article lifetime:    2.96
Average number of edits per day between 2020-07-17 and 2020-08-07:     4.67
Between 2020-07-17 and 2020-08-07, Tammy Duckworth's Wikipedia page has received 1.5777027027027026 times more edits per day than average.

卡玛拉·哈里斯:

Average number of edits per day over article lifetime:    3.81
Average number of edits per day between 2020-07-17 and 2020-08-07:     7.0
Between 2020-07-17 and 2020-08-07, Kamala Harris's Wikipedia page has received 1.837270341207349 times more edits per day than average.

苏珊·赖斯:

Average number of edits per day over article lifetime:    2.79
Average number of edits per day between 2020-07-17 and 2020-08-07:     6.06
Between 2020-07-17 and 2020-08-07, Susan Rice's Wikipedia page has received 2.172043010752688 times more edits per day than average.

当我们将活动正常化时,凯伦·拜斯就走到了最前面。有意思。但这会转化为副总裁的选择吗?只有时间能证明一切。

你对如何改进这些图表有什么想法吗?你从结果中获得了什么见解吗?有改进流程的想法,或者进一步推动分析?如果有,请在评论中分享!

车牌图像增强

原文:https://towardsdatascience.com/license-plate-image-enhancement-5a170475bec1?source=collection_archive---------21-----------------------

从银幕到现实

在好莱坞的犯罪电影中,我们经常看到侦探在一个电脑高手的帮助下突破一个难题,这个电脑高手可以从模糊的低质量图像中揭示隐藏的信息。用专业术语来说,电影中的黑魔法叫做单幅图像超分辨率(SISR)

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

https://www.youtube.com/watch?v=Vxq9yj2pVWk

在各种 SISR 应用中,汽车牌照的超分辨率无疑是潜力最大的。例如,它可以用于执法。它还可用于提高车牌识别和街道名称识别的准确性(地图服务)。在本文中,我将向您介绍我用 Python 实现的图版增强。Jupyter 笔记本教程可以在这里找到。

走廊

在深入模型架构和培训策略的本质细节之前,我想向您展示该模型的能力:

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

我们在失控事故案例中看到的一个问题是,车牌通常是在黑暗条件下由低质量相机拍摄的。因此,我们的模型被训练成不仅增加分辨率,而且通过对图像去噪并调整其亮度和对比度来增强车牌号码的易读性。

系统结构

预处理

我们在这个项目中使用的数据集叫做中国城市停车数据集,它包含了各种条件下汽车的 200k+图像。然而,原始数据不能被我们的模型消耗,它只想要车牌的图像而不是街景和汽车。因此,第一步是使用数据集提供的注释从图像中裁剪出板。

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

剪下车牌

我们还想过滤掉亮度和对比度不好的图像,只保留好的部分作为标签。我们人工生成(输入,标签)对,其中输入被下采样,被噪声和随机亮度和对比度破坏,而标签处于良好状态。

模型细节

我们的模型灵感来自于 ESRGAN 模型。顾名思义,我们的模型是以对抗的方式训练的——在一个极小极大的游戏中,生成器对鉴别器。

发电机

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

我们的发电机建立在两个最先进的模型之上——ESR gan中的 RRDB 网剩余密集网络。发生器使用子像素卷积(在 tensorflow 中也称为深度到空间,在 pyTorch 中称为像素混洗)将低分辨率图像向上采样 8 倍。本质上,子像素卷积所做的是将一个大小为 10×10×64 的特征图挤压成另一个更大的浅深度特征图(如果上采样率为 8,则为 80×80×1)。

鉴别器

鉴别器是一个简单的 VGG 式网络,输出 0(假)或 1(真)。理想情况下,鉴别器应该能够区分图像重建和地面真实图像。

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

增加一个鉴别器而不是三角化一个最小化均方误差的生成器的好处是,后者往往会产生过度平滑的伪像,一点也不像合法的字母。使用鉴别器来约束输出空间有助于创建类似字母的重建。

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

损失函数和评估

板重建的一个问题是,像均方误差或峰值信噪比这样的常用指标在描述高水平特征方面不是特别好。例如,与具有偏离亮度和高对比度的良好重建相比,模糊重建可以实现更高的 PSNR。

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

因此,关注边缘和字母方向等高级特征至关重要。在 SRGAN 的论文中,研究人员发现了一种新的内容损失函数,它在 VGG 网络的特征空间中计算 MSE,突出图像特征,而不是在图像空间中。他们将 VGG 损失定义为

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

SRGAN ,在麻省理工学院许可下复制

我们的模型被优化以最小化被称为内容损失的 VGG 损失和 MSE 的混合:

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

内容损失迫使模型注意重建中的边缘,确保高级骨架与地面真相相匹配。

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

内容丢失的好处

结束了

就是这样!如你所见,重建车牌并不难!如果您对模型的详细实现感兴趣,请查看我们在 Github 上的回购!

https://github.com/zzxvictor/License-super-resolution

感谢您阅读我的文章,并保持安全!

激光雷达三维目标检测方法

原文:https://towardsdatascience.com/lidar-3d-object-detection-methods-f34cf3227aea?source=collection_archive---------1-----------------------

这篇博文最适合那些对基于图像的 2d 物体检测网络有基本了解,并且有兴趣了解如何使用 2d 物体检测网络中使用的标准方法并针对点云 3d 物体检测任务进行调整的人。

在这篇博客文章中,首先,我们回顾了 KITTI 数据集中表示的激光雷达点云的数据格式。然后,我们正式定义了三维目标检测任务,并提出了常用的回归和分类损失来衡量模型处理三维目标检测任务的性能。接下来,我们将激光雷达 3d 对象检测网络分为两类,一类是具有输入排列不变性的网络,其展示了直接处理原始点云的对称性,另一类是具有依赖于点云的有序结构化表示的点云网格表示的网络。我们将详细讨论这两类网络的优缺点。

关于这篇博文的更详细的概要,请阅读下面的介绍部分。

介绍

这篇博客分为三个主要部分:激光雷达点云,三维物体检测背景和三维物体检测神经网络。

在激光雷达点云部分,首先,我们回顾一下已经成为自动驾驶感知任务标准基准的 KITTI 数据集。然后,我们正式定义激光雷达坐标框架,该坐标框架用作表示返回的激光雷达点的坐标以及检测网络输出处的预测定向 3d 框的坐标框架。接下来,描述返回的激光雷达点的数据格式。

我们从 3d 对象检测背景部分开始,正式定义 3d 对象检测任务,以及回顾编码每个预测的定向 3d 框的 6 个自由度。然后,我们提出焦点损失和硬负挖掘作为解决三维目标检测网络分类损失中背景类别不平衡的常用方法,以及平滑 L1 作为针对离群点的稳健回归损失。此外,我们比较了具有和不具有锚盒的 3d 对象检测网络的回归目标。此外,讨论了数据扩充作为 3d 对象检测网络的训练管道的必要部分,以确保更好的推广,并且提供了两种基于搜索的方法,其使用 RL 和进化算法来解决寻找最优数据扩充策略。

在 3d 对象检测神经网络部分,首先,我们讨论由点云作为无序点集的排列不变性引起的通过神经网络处理激光雷达点的挑战。然后,我们将三维目标检测网络分为两类:具有输入排列不变性的网络和具有点云有序网格表示的网络。关于具有输入方式排列不变性的 3d 对象检测网络,讨论了用于基于 lidar 的分类和分割的排列不变性架构点网。此外,我们回顾了平截头体点网,其依赖于基于图像的 2d 对象检测网络来扩充点网以用于 3d 对象检测任务。

然后,我们切换我们的齿轮集中在三维物体检测网络与点云有序网格表示。由于这些网络属于 CNN 目标检测网络的范畴,我们首先回顾 CNN 目标检测网络的两种主要类型:单镜头和基于区域提议的。此外,包括 FPNPANet 的骨干网络和特征金字塔网络被讨论为 CNN 对象检测网络的主要构建块。此外,非最大值抑制作为后处理步骤被提出,以过滤由密集对象检测网络做出的预测。接下来,我们解释距离图像表示的优缺点,距离图像表示将点云解释为由激光雷达传感器拍摄的 3d 环境中的 360 度照片。引入 3d 体素化表示作为围绕激光雷达传感器的 3d 立方体子空间的量化。讨论了 3d 体素化表示的存储和计算效率低的问题。此外,3d 卷积被呈现为自然卷积层,以处理 3d 体素化张量。

最后,我们关注 2d 体素化表示作为 3d 体素化表示的替代,其通过使用 2d 卷积层而不是 3d 卷积层展示了更好的计算效率。此外,我们比较了作为 3d 对象检测网络一部分的手工设计和机器学习的特征编码器,3d 对象检测网络依赖于 2d 体素化表示作为其输入。

激光雷达点云

在本节中,首先,我们回顾作为激光雷达 3d 对象检测任务的最流行基准的 KITTI 数据集。然后,我们解释了 KITTI 数据集中使用的激光雷达坐标框架。最后,讨论了返回激光雷达点的数据格式。

Kitti 数据集

**KITTI**数据集已经成为自动驾驶感知任务的标准基准数据集,包括基于图像的单目和立体深度估计、光流、语义和实例分割以及 2d 和 3d 对象检测。该数据集由所示的多传感器记录平台(一辆配备有激光雷达传感器和两个前向摄像头的汽车)通过在德国卡尔斯鲁厄街道上衍生生成。

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

KITTI 多模态传感器套件。

****KITTI 数据集是一个多模态数据集,每个训练示例都是通过两个前置摄像头生成的两个摄像头图像和安装在车顶的威力登 HDL-64E 激光雷达传感器生成的点云捕获的带标签的 3d 场景。在 KITTI 数据集中存在 7481 个训练场景和 7581 个测试场景。由于激光雷达传感器的 100 毫秒 360 度扫描时间,该多模式传感器套件从外部 3d 世界的采样频率为 10HZ。

****因此,每个训练示例都是汽车周围 3d 世界的 100 毫秒快照,并由激光雷达点云(您可以将激光雷达点云视为在 100 毫秒内捕获的 360 度照片)和与扫描激光雷达传感器同步的两个相机图像形成。对于依赖于相机图像和激光雷达点云融合的感知方法,两个相机与激光雷达传感器的同步是必不可少的。这种同步要求相机在激光雷达扫描处于其视野中心时捕捉图像。

**KITTI 多模态传感器套件中的激光雷达传感器是威力登 HDL-64E,如下所示。**该激光雷达传感器提供 3d 场景的时空离散化扫描,其中其空间离散化由仰角(垂直)和方位角分辨率表征,其时间离散化过程由 100 毫秒的扫描时间表征。它的仰角分辨率为 0.4 度,根据它的 64 个激光束转换成 26.9 度的垂直视场。此外,它的方位分辨率等于 0.08 度。因此,给定 64 个通道(64 个激光束)和 0.08 度的方位分辨率,由威力登 HDL-64E 生成的 3d 点云照片是具有 64 行和 4500 列的图像。

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

威力登 HDL-64E

激光雷达坐标框架

****在 KITTI 传感器套件中,安装在车顶顶部的激光雷达传感器的坐标框架的重要性在于,不仅返回的激光雷达点会显示在激光雷达坐标框架中,预测的 3d 边界框也会显示在该坐标框架中。换句话说,3d 物体检测模型的输入和输出都呈现在激光雷达坐标框架中。在下图中,您可以看到激光雷达坐标框架,其中汽车被描绘为灰色框。特别地,这个坐标框架的原点是激光雷达传感器的中心;它的 x 轴指向车头;它的 y 轴指向驾驶座的左侧,z 轴指向天空。

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

激光雷达坐标框架:笛卡尔坐标和球面坐标。

所描述的激光雷达坐标框架中的点可以用其笛卡尔坐标(x,y,z)或球坐标(θ,ϕ,r)来表示。在球坐标中,θ称为仰角,是相对于 z 轴正方向的角度,ϕ称为方位角,是在 x-y 平面中相对于 x 轴正方向的角度,r 是该点到原点的距离。笛卡尔坐标和球坐标之间存在如下一对一映射:

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

点云数据格式

每个点云都是返回的激光雷达点的无序集合。每个返回的激光雷达点的数据格式是由其相对于激光雷达坐标框架的坐标及其强度ρ形成的 4 元组。在 KITTI 数据集中,ρ是介于 0 和 1 之间的归一化值,它取决于激光雷达光束反射的表面特征。返回的激光雷达点可由其笛卡尔坐标(x,y,z)或球面坐标(θ,ϕ,r)表示。KITTI 数据集使用激光雷达坐标系中的笛卡尔坐标及其强度来表示返回的激光雷达点,如下所示:(x,y,z,ρ)。下面,你可以看到一个点云的插图。KITTI 数据集中的每个场景点云平均有大约 100K 个点。请注意,每个场景返回的激光雷达点的数量根据场景的特征(如场景中行人或汽车的数量)而有所不同。

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

旁边儿的云

3d 对象检测背景

在本节中,我们将重点介绍制定 3d 对象检测任务所需的背景。我们首先从正式定义点云三维物体检测任务开始。然后,我们介绍了如何使用回归和分类损失来测量这项任务的性能。最后,我们回顾了数据扩充作为一种基本方法,以提高处理三维物体检测任务的 ML 模型的泛化能力。

3d 对象检测任务

****这里,我们将基于 lidar 的 3d 对象检测任务正式定义如下:给定由返回的 lidar 点(在 lidar 坐标框架中表示)形成的场景的点云,预测与场景中的目标演员相对应的定向 3d 边界框(在 lidar 坐标框架中表示)。对于自动驾驶应用,你可以假设最本质的这类目标行为者是汽车、自行车和行人。此外,定向 3d 框是相对于 3d 框的主体坐标框架增加了航向角的 3d 框。

务必充分理解在激光雷达坐标框架中表示定向 3d 边界框的含义。通常用由盒子尺寸、盒子中心坐标和航向角组成的 6 个自由度来编码定向的 3d 边界盒子。注意,仅编码航向角而不编码俯仰角和横滚角的原因是航向角对自动驾驶系统的跟踪、预测和规划堆栈的逻辑的影响,而俯仰角和横滚角在这些堆栈中做出的决策中不起主要作用。

盒子的尺寸仅仅是它的宽度、长度和高度(w,l,h ),同时考虑到长度总是大于宽度的不变性。盒子中心的坐标(x,y,z)相对于激光雷达坐标框架来表示。盒子的航向角ϕ在盒子的主体坐标系中测量,该坐标系是激光雷达坐标系到盒子中心的平移版本。特别地,盒子的航向角θ指的是其长度尺寸(x-y 平面上的较长边)平行于其主体坐标框架的 x 轴的情况。

分类损失和回归损失

无论使用什么 ML 模型来实现 3d 对象检测任务,我们都期望模型输出对每个预测框的 6 个自由度及其类别进行编码。这些分类和回归预测分别被合并到分类和回归损失中,以便为 3d 对象检测模型提供训练信号。

分类损失

**目标检测网络的默认分类损失是交叉熵,其等于地面真实类的负对数似然。目标检测网络的分类损失的主要复杂性是解决背景(负面)类别和正面类别之间的类别不平衡。可以观察到,对于给定的图像或场景,大多数潜在的 2d 和 3d 边界框候选包含背景场景,而不是目标演员和对象。因此,在目标检测训练数据集中存在显著的类别不平衡。解决这种等级不平衡的两种标准方法是硬负开采和/或焦损。**在硬否定挖掘方法中,目标是对每个图像/场景的否定边界框进行子采样,使得否定框的数量最多是肯定框数量的 3 倍,同时为每个图像/场景选择最硬的否定框。用于量化负盒硬度的度量是其交叉熵损失,其中较大的交叉熵损失指定较难的示例。

另一方面, 焦点损失 通过在训练过程中自适应地调整每个样本在分类损失中的贡献权重来解决背景类和正面类的类不平衡,而不是显式地对负面样本进行子采样。焦点损失主要基于这样的想法,即大多数背景框对于网络来说非常容易识别,使得它们的基础真实类概率(背景类概率)在训练过程的早期变得非常接近 1.0。因此,自适应地调整样本的贡献权重,使其与它们的当前基本真实概率和实数 1.0 之间的绝对差成比例,导致大多数负样本对分类损失的贡献可以忽略,这减轻了背景类和正类之间的类不平衡。

回归目标和损失

回归损失根据对应于盒子的 6 个自由度的回归目标来定义。通常的做法是预测这 6 个自由度的转换版本(称为回归目标),而不是直接预测它们,以增加模型预测的动态范围,并通过提供具有潜在更高熵的梯度来帮助训练过程。

带有定位框的回归目标

**首先,我们回顾依赖于锚盒的对象检测网络的回归目标。**如果输入遭受像自然图像那样的比例模糊,其中图像中出现的对象的尺寸取决于它们到摄像机的距离,或者如果网络需要检测具有不同典型尺寸的不同类别对象,如旨在检测汽车、自行车和行人的激光雷达 3d 对象检测网络,则使用锚定框变得至关重要。在这种情况下,锚框允许网络学习关于一组具有不同比例和纵横比的预定义锚框的回归偏移,这些锚框被设计为模型的超参数,以最佳匹配具有不同维度的类对象。设计锚定框的目标是,在训练过程结束时,每种类型的锚定框都将专用于一个与锚定框的比例和纵横比最匹配的类对象。

**下面,你可以看到带有定位框的回归目标。在这些公式中,下标 gt 指地面真相箱,下标 a 指锚箱。**标准做法是使用 log 刻度来表示盒子的宽度、长度和高度,以增加预测尺寸的动态范围。此外,根据锚盒的尺寸的划分确保预测目标是相对于匹配的锚盒的偏移校正的形式。中心框坐标是根据它们相对于锚框中心坐标的偏移来预测的,并通过它们相应的锚框尺寸来进一步归一化。最后,航向角目标被编码为地面真实航向角和锚箱航向角之差的 sincos 。这种编码方案消除了明确实现预测角度必须在 0 和 2π范围内的约束的要求。

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

没有定位框的回归目标

在没有锚盒的对象检测模型的情况下,回归目标如下。

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

注意,对于中心框坐标目标,我们仍然将它们预测为相对于参考点的偏移,这取决于用于该预测的特征地图条目的空间坐标。不需要锚定框的对象检测任务的一个例子是 3d lidar 对象检测任务,其仅关注于检测汽车并且不会遭受比例模糊。

回归损失

平滑 L1 损失已经成为目标检测回归目标的标准损失,可以写成

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

其中 x 表示网络预测值和回归目标值之间的差值。因此,我们将有 6 个平滑 L1 项,对应于每个盒子的 6 个自由度。平滑 L1 损失优于 L2 损失,主要是因为它对异常值更稳健。离群值导致具有大绝对值的误差,而与误差幅度成比例的 L2 损失导数导致 SGD 训练过程变得不稳定并被离群值支配。另一方面,对于 |x| > 1 的平滑 L1 损失的导数是常数,并且与误差幅度不成比例,这使得它对于异常值是鲁棒的。

数据扩充

数据扩充是每个对象分类和检测模型的训练管道的基本部分。数据增强的目标是提高泛化能力,使分类和检测网络相对于图像像素值和点云激光雷达点的旋转、平移和自然变化保持不变。在本节中,我们首先回顾图像的数据扩充技术,因为它们将为讨论点云的数据扩充方法提供相关背景。

图像数据增强

**展示数据增强对于感知任务的重要性的突出作品是 AlexNet 。在 AlexNet 之后,用于图像分类和检测模型的数据扩充方法成为训练管道的标准步骤。这种增强技术的例子是随机裁剪、缩放、旋转、水平翻转和光度变换。**注意,这些数据扩充方法的随机性对提高网络的泛化能力起着重要作用。特别地,对于训练的每个时期和对于每个图像,除了是否应用给定的数据扩充方法之外,这些数据扩充方法的参数(像旋转数据扩充的旋转角度)在训练期间被随机绘制。另一种最近流行的数据扩充方法是 Cutout ,它在训练过程中随机屏蔽图像的正方形区域。

**所有上述数据扩充方法都是图像级数据扩充方法,并且最初是针对图像分类任务提出的,但是已经显示出对于对象检测任务也是有用的。**最近,将这些数据增强方法单独应用于对象的边界框也变得很常见,这被称为对象级数据增强方法。换句话说,除了影响整个图像的图像级变换之外,我们还可以将这些变换分别应用于每个对象的边界框。例如,通过旋转单个对象的相应边界框并用值 0 填充堤岸区域,可以将随机旋转应用于单个对象。

与为每个输入图像即时随机创建数据增强方法的组合相反,有理由假设存在数据增强方法的特定组合,其更好地模拟图像和我们周围世界中自然发生的变换。因此,学习这样的作文将潜在地导致更好的概括。遵循这一思想,自动增强将数据增强方法的哪些组合应用于图像以用于图像分类任务的顺序离散决策问题公式化为增强学习(RL)问题,奖励信号是测试数据集上训练模型的准确性。

**在 学习用于对象检测的数据增强策略 中,将上述策略梯度 RL 方法进一步应用于对象检测任务。 **在提议的 RL 框架中,RL 代理被建模为 RNN 网络,其中在每个时间步,它通过其输出 softmax 层做出离散决策,以选择数据扩充方法或为已经选择的数据扩充方法选择超参数值。RL 代理被要求生成五个数据增强子策略,其中每个子策略是两种数据增强方法的组合。在训练期间,对于每个输入图像,随机选择五个子策略中的一个并应用于该图像。结果表明,使用 RL 代理生成的数据扩充策略优于随机数据扩充方法。

点云数据扩充

**应用于激光雷达点云的数据增强方法主要受最初为图像设计的增强方法的启发。**点云数据扩充方法必须符合控制激光束传播的物理定律。例如,我们希望点云随着远离激光雷达传感器而变得越来越稀疏。因此,如果数据扩充方法不符合此约束,则不应在训练期间使用,因为它不模拟任何真实世界的场景。

一些常见的点云数据增强是围绕激光雷达坐标框架的 z 轴的旋转、相对于激光雷达坐标框架的 x-z 和 y-z 平面的翻转、激光雷达点的稀疏化、应用于激光雷达点的加性高斯噪声、平截头体缺失和具有对象点云的场景增强。这些数据扩充方法中的大多数既可以应用于场景级,也可以应用于对象级。在实时训练期间,对于每个给定的点云场景,我们做出是否应用每个场景级数据扩充方法的随机二元决策,以及场景中每个对象的随机二元决策,以便确定是否应用每个对象级数据扩充方法。下面,您可以看到应用于点云的潜在数据增强方法的示例,这些示例来自论文通过基于渐进人群的增强改进 3D 对象检测

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

应用于点云的数据增强方法。

**受为图像开发的 自动增强 框架的启发,开发了用于点云的类似的 框架 **,其将寻找点云数据增强方法的最基本组合的问题公式化为搜索问题,其中搜索空间跨越所有潜在的这种组合。所采用的搜索方法是一种进化算法,称为基于渐进人群的增强(PPBA)。有人认为,选择这种进化搜索方法而不是基于 RL 的搜索方法是因为其效率更高,这一点至关重要,因为点云数据增强方法的搜索空间大于其图像对应物。

三维物体检测神经网络

在本节中,我们将重点关注 3d 对象检测神经网络及其挑战。在回顾了 3d 对象检测神经网络所面临的挑战之后,我们将点云 3d 对象检测网络分为两个主要类别:具有输入方式排列不变性的网络和具有点云有序网格表示的网络。

点云的主要特征阻止我们容易地采用 CNN 对象检测神经网络,这是因为它们的排列不变性,而 CNN 对象检测网络假定它们的输入是以网格形式表示的有序数据结构。网格有序数据结构的例子是图像,这意味着改变图像的像素顺序会修改图像的内容。

点云是无序的点集,意味着改变点的顺序不会改变由点云表示的 3d 对象。这一特性要求处理点云的神经网络相对于它们的输入是置换不变性的,如果它们打算直接消耗点云的话。特别是,神经网络预测的 3d 盒子不应受到输入激光雷达点顺序变化的影响。存在一类激光雷达 3d 物体检测神经网络,其是输入方式排列不变性的,并且直接消耗点云作为其输入,而不依赖于点云的任何中间表示形式。

此外,存在另一类点云 3d 对象检测神经网络,其依赖于将点云变换为类似于图像的有序网格表示,使得它们不再受点云的排列不变性的限制,并且结果,它们可以将 CNN 对象检测网络开箱即用地应用于点云的网格表示。

具有输入方式排列不变性的 3d 对象检测网络

输入方式排列不变性神经网络通过直接处理原始点云来执行点云 3d 对象检测任务,而不依赖于它们的有序网格表示。因此,为了尊重点云是激光雷达点的无序集合的属性,要求它们是输入方式的置换不变性。考虑到这一特性,更改网络输入处激光雷达点的顺序不会更改网络的输出预测。

PointNet 是一种输入方式排列不变性神经网络,设计用于点云分类和语义分割任务(不用于 3d 对象检测任务)。point net 背后的主要思想是以下通用近似定理:任何连续的输入方式排列不变性函数 f 可以通过两个函数 hg 的组合来近似,其中 g 必须是对称函数,以确保f的排列不变性。特别地,首先,函数 h 被单独地(逐点地)应用于每个激光雷达点,该函数将每个激光雷达点变换为然后,函数 g 获取由函数 h 生成的 lidar 点嵌入,并生成对应于输入点云的维度 d 的单个全局特征嵌入。这种对称函数 g 的例子是基于元素的最大池和平均池。如果嵌入维数 d 足够大,以保证函数 f 通过函数 h 和 g 的合成相对于给定的逼近边界误差的逼近,则通用逼近定理是有效的。下图显示了对应于四个激光雷达点的函数 h 和对称函数 g 的组成。

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

通过将点网络应用于 4 个激光雷达点来说明建议的架构。首先,函数 h 分别应用于每个激光雷达点,并将它们转换为维数为 d 的嵌入。然后,对称函数 g 采用这 4 个嵌入,并输出单个全局特征向量。

下图显示了为点云分类和语义分割任务提议的点网络架构。顶部的蓝色路径指定分类网络,而底部的黄色路径是语义分割网络。在分类网络中,从输入层到最大池层的层形成函数 h ,而最大池层被选为对称函数 g 。嵌入维数 d 选择为 1024。在 PointNet 中,以逐点方式应用于每个激光雷达点的函数 h 由全连接层(MLP)和空间变换网络形成。PointNet 中有两个空间转换器网络,在下图中称为 T-Net。空间变换网络在其输入点上执行数据相关的仿射变换。依赖于数据导致应用于输入点的仿射变换被即时确定为输入点本身的函数。空间变换网络的主要目标是确保分类网络对于应用于点云的仿射变换的不变性。

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

点网

如上图所示,虽然 PoinNet 分类网络的最终输出代表输入点云的单个分类决策(k 个输出得分),但语义分割网络依赖于点云的全局特征(维度为 1024)和局部特征(维度为 64)的串联,以针对每个点云做出单独的分类决策(m 个输出得分)。

**点网无法执行 3d 对象检测任务,因为点网的分类网络假设输入点云的所有激光雷达点都属于单个对象。平截头体点网 **用 3d 区域提议网络来扩充点网,以便将 3d 输入场景划分为子空间,使得每个子空间潜在地仅包含单个对象的 lidar 点。作为这种划分的结果,类似点网的网络可以用于聚焦于对应于特定 3d 提议区域的子空间的 3d 对象检测任务。下图显示了平截头体点网的建议架构。3d 区域提议网络是左边的块,它被称为平截头体提议。该建议网络基于由基于 2d 图像的对象检测网络预测的 2d 边界框的 3d 投影。因此,平截头体点网络是一个多模态(图像和激光雷达)3d 物体检测网络。中间的块被称为 3d 实例分割,其获取 3D 提议区域内的激光雷达点,并执行逐点二元分类以确定每个给定的激光雷达点是否属于感兴趣的对象。最后的块是模型 3d 框估计,其将通过 3d 实例分割预测的那些 lidar 点视为属于感兴趣的对象,并输出对应于 3D 提议区域的 3D 定向框的尺寸、中心坐标和航向角。

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

锥台点网

具有点云有序网格表示的 3d 对象检测网络

在本节中,我们关注一类 3d 对象检测网络,其依赖于有序网格张量来表示点云,以便去除它们的置换不变性约束。特别地,这些检测网络不是直接消耗原始点云,而是以类似图像的有序网格的形式获取点云的中间表示作为它们的输入。这类 3d 物体检测网络的主要特点是将类似于图像的点云表示为结构化网格,以便它们可以受益于现有的基于图像的 CNN 物体检测网络。

通过将点云表示为有序网格,这些有序网格表示可以直接传递给 CNN 对象检测网络,如fast-RCNNSSD 。也就是说,这些网络的回归头需要进行一些改变,以适应 3d 对象检测任务的回归目标。例如,需要在激光雷达坐标框架中而不是在 2d 图像平面坐标框架中进行盒子尺寸和坐标的预测。此外,回归头需要预测箱子的航向角。具有有序网格表示输入的点云 3d 对象检测网络主要采用了 2d 对象检测网络的现有架构,并进行了较小的修改。因此,我们首先回顾 2d 对象检测网络的两个主要类别:单触发和基于区域提议的网络,以及作为这些 2d 对象检测网络的主要构建块的骨干网络和特征金字塔网络。

单发探测网络

**单发探测网络通常被称为实时目标探测网络。**这些检测网络的快速响应时间是基于它们预测箱子的单阶段过程。通过由卷积层作为回归和分类头实现的密集预测范例,这种单级预测机制是可能的。该密集预测过程为每个输入图像生成大约 100K 个盒子,这些盒子需要通过非最大抑制( NMS )后处理步骤进行滤波。这些 100K 预测框中的大多数是背景框,因此容易过滤掉。另一方面,具有不同于背景类别的类别的预测的盒子需要被传递到 NMS,从而在重叠的盒子中仅选择具有最高置信度得分的盒子。NMS 将在下面的章节中详细讨论。

下图展示了名为 RetinaNet 的单次检测网络的架构。每个单镜头检测网络由以下三个主要的构建模块组成:(1)主干网络(2)特征金字塔网络(3)分类和回归头。在接下来的章节中,我们将详细介绍主干网络和特征金字塔网络。

分类和回归头负责单发检测网络的密集预测。他们将特征图作为输入,并对特征图的每个条目预测一个盒子,这实现了单触发网络的密集预测范式。分类和回归头是完全卷积网络,以便执行高分辨率密集预测。这些全卷积网络将特征图作为它们的输入,并为每个特征图条目生成表示类逻辑和回归目标的输出特征图。

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

视网膜网

基于区域提议的检测网络

****基于区域提议的检测网络是两级检测网络,其不依赖于在单次检测网络中使用的密集预测范例,而是采用显式区域提议网络,该网络输出将被传递到分类和回归头的区域候选。基于区域提议的检测网络的代表网络是更快的 R-CNN ,如下图所示。与针对特征图的每个条目预测一个框的单次检测网络不同,在基于区域提议的检测网络中,区域提议网络生成大约 2000 个区域候选,其中,首先,它们的特征图使用 ROI(感兴趣区域)汇集层来汇集。然后,候选区域的汇集特征图被分别传递到分类和回归头,以便对每个候选区域预测一个盒子。显式区域提议网络和单独处理区域候选使得基于区域提议的检测网络不如单次检测网络那样快。然而,类似于单次检测网络,基于区域提议的检测网络依赖于主干网络和特征金字塔网络作为特征编码器和特征地图增强模块。

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

更快的 R-CNN

主干网络

主干网络是输入图像或输入点云有序网格表示的特征生成器(编码器)。通常使用为 ImageNet 分类任务(具有 1000 个类别和大约 1M 训练图像的图像分类任务)设计的 CNN 网络作为对象检测网络的骨干网络。特别是,ImageNet 分类网络在其最终的 1000 路 softmax 层之前被切割,并用作主干网络。最知名和常用的骨干网有: AlexNetVGGInceptionResNetDenseNetMobileNetV2NasNetAmoebaNetMnasNetefficent net。对于检测网络,骨干网络的选择取决于感知系统的延迟要求以及可用的存储器和计算资源。高效的骨干网有 Inception、MobileNetV2、MnasNet、EfficientNet。

**当使用骨干网络作为对象检测网络的特征生成器时,另一个设计选择是选择由骨干网络生成的哪些特征图将被传递到检测网络内的下游模块。**不仅处理主干网络的最终特征图,而是传递在主干网络的不同阶段生成的若干特征图背后的主要动机是处理输入传感器模态(如自然图像)的比例模糊问题,或/和检测具有不同类别的对象,这些对象表现出显著不同的维度。后一种情况的一个例子是自动驾驶应用,其中 3d 对象检测网络旨在检测具有不同尺寸的汽车、卡车、自行车和行人。

特别是,主干网络不同阶段的特征地图具有不同的空间感受域,这使它们成为解决传感器模态(如图像或不同维度对象的检测)的尺度模糊性的自然解决方案。这种方法在感知系统中被称为多尺度特征地图。要了解更多关于多尺度特征图的特征以及不同类型的卷积层如何影响特征图的感受野,可以回顾我们以前的博客文章,名为多尺度 CNN 特征图的分析和应用

特征金字塔网络

****特征金字塔网络用于主干网络之上,以丰富和扩充主干网络生成的特征地图。该增强过程的主要目标是增强特征图的表示能力,针对 2d 和 3d 对象检测回归和分类任务而定制。特征金字塔网络采用在骨干网络的 C 不同阶段(可能具有 C 不同的空间分辨率)生成的 C 特征地图,并输出通常具有与输入特征地图空间分辨率相同的空间分辨率的 C 增强特征地图。

提出的突出特征金字塔网络是下图所示的 FPN 。左边的路径是自下而上的路径,是主干网络的一部分。在主干网络的不同阶段,具有不同空间分辨率的三个特征地图被选择并传递到特征金字塔网络,该网络由右侧自上而下的路径示出。通常选择空间分辨率为 H/4 x W/4,H/8 x W/8H/16 x W/16 的骨干特征图作为特征金字塔网络的输入,其中 HW 表示输入图像的高度和宽度。

更深的特征地图在语义上更强,FPN 的目标是使具有更高空间分辨率的更浅的特征地图在语义上与更深的特征地图一样强。这是通过 FPN 自上而下的上采样路径将编码的语义信息从较深的特征图转移到较浅的特征图来实现的。然而,FPN 自上而下的上采样路径缺乏对目标定位至关重要的粒度空间信息。通过使用横向连接将自顶向下路径中的上采样特征图与自底向上路径中的特征图融合,这种空间信息的缺乏得以缓解。

在特征金字塔网络的设计过程中,存在着如何对自顶向下路径中的特征地图进行上采样以及如何将自底向上路径的特征地图与自顶向下路径的特征地图相结合的自由度。虽然 FPN 使用最近邻插值作为上采样方法,但上采样的其他选项有钉床、双线性插值、最大解卷积和转置卷积(解卷积)在这些上采样方法中,唯一依靠训练数据来学习定制的上采样操作的方法是转置卷积。因此,它是最有前途的上采样层类型,并在最近的神经网络架构中受到欢迎。然而,由于其可学参数,如果模型大小是一个问题,应避免。

另一个自由度是如何将由横向逐像素卷积层从自底向上路径转换的特征图与自顶向下路径的上采样特征图融合。两种常见的方法是:(1)元素相加,它要求特征映射具有相同数量的通道(2)通道相连接。逐通道连接方法具有更高的表示能力,但计算成本更高。FPN 使用元素相加作为融合方法,并进一步依靠 3×3 卷积层来平滑融合的特征图,以减轻混叠效应。

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

FPN

另一个最近提出的特征金字塔网络是下图所示的面板。它是作为 FPN 的延伸而建造的。特别是,它为 FPN 增加了一条新的自下而上的道路。在 PANet 框图中,块 a 是原来的 FPN,块 b 是新增加的自底向上路径。这个新的自下而上的路径以 FPN 自上而下的路径生成的特征地图(P2,P3,P4,P5)作为输入,并生成一组新的特征地图(N2,N3,N4,N5)作为输出。这种新的自下而上路径背后的动机是确保具有较低空间分辨率的较深特征地图包含基本语义信息,例如由较浅特征地图编码的边缘、拐角和斑点。在主干网络中,从较浅的层到较深的层获取此类基本信息的可能性较小,因为它必须经过许多层,而在 PANet 的自下而上路径中,它只需要经过 3 层,如下图中绿色定向路径所示。

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

面板

另外 NAS-FPN 将寻找最佳特征金字塔网络公式化为神经架构搜索问题。所发现的架构由自顶向下和自底向上的连接组合而成。最近, BiFPN 提出了一种加权双向(自顶向下和自底向上路径)特征金字塔网络块,该网络块可以根据计算资源和所需精度重复。

非最大抑制

**非极大值抑制 (NMS)是大多数目标检测网络的后处理步骤。对象检测网络为场景中的每个对象生成几个肯定的预测。**因此,要求 NMS 只选择重叠边界框中具有最高置信度得分的那些肯定预测边界框。对象检测网络为每个对象生成若干预测的这一特征源于训练范例,该范例为每个对象分配若干肯定目标。例如,在具有锚框的对象检测网络的情况下,与基础事实边界框具有大于 0.5 的交集(IOU)的每个锚框与该基础事实边界框匹配,并被认为是正面示例。因此,在这个过程的最后,每个基础事实框潜在地存在几个正锚框。此外,在没有锚框对象检测网络的情况下,地面真实边界框内的每个参考特征地图条目被认为是旨在预测对应于目标对象的边界框的正面示例。

距离图像表示

在回顾了单镜头和基于区域提议的目标检测网络类别及其主干和特征金字塔网络形式的构建块之后,我们将注意力转向点云的网格表示。在本节中,我们重点关注点云的距离图像表示,它将点云解释为激光雷达传感器拍摄的 3d 环境的 360 度照片。

在下图所示的网格表示中,点云被转换为一个图像张量,其中行维度表示激光束的仰角θ,列维度表示激光雷达传感器的方位角ϕ。对于威力登 HDL-64E,由于其 64 个激光束,其相应的距离图像具有 64 行,由于其 0.08 度的方位分辨率,其相应的距离图像具有 4500 列。此影像的每个条目的像素值等于其对应的返回激光雷达点的范围。然而,对于此图像中的大量条目,没有返回的激光雷达点,这主要是因为激光束射向天空,没有击中任何障碍物。此外,标准做法是为没有返回激光雷达点的条目分配零值来表示缺失的观测值。

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

距离图像表示,其中行表示仰角θ,列表示方位角ϕ.

距离图像表示的主要优点有两个:(1)距离图像可以直接馈入 CNN 目标检测网络(2)距离图像导致在将点云转换为网格表示时添加最少的冗余信息。特别地,添加的冗余信息是指没有返回的激光雷达点的距离图像表示的那些条目。这种信息冗余是最小的,因为距离图像的大小至多与发射的激光束的数量一样大。另一方面,原始点云表示是最有效的表示,因为它只对返回的激光雷达点进行编码。

****深度图像表示的主要缺点是自然图像普遍存在的尺度模糊和遮挡。比例模糊问题源于这样一个事实,即距离激光雷达传感器较近的物体在距离图像中比距离较远的物体显得更大。这使得检测网络很难在不同距离图像上以不同尺寸出现的一类物体之间进行归纳。此外,比例模糊增加了 3d 盒的尺寸推断的复杂性。理论上,人们可能会认为使用距离图像预测盒子尺寸应该是简单明了的,因为每个像素的深度都可以作为距离信息。然而,即使对象检测网络可以访问像素深度,卷积层也没有被设计成明确地使用该深度信息来消除比例模糊。特别地,CNN 对象检测网络将深度图像的深度信息视为特征通道。

距离图像也会受到遮挡的影响。通常,遮挡降低了 CNN 目标检测网络的性能,主要是因为卷积滤波器的矩形结构。卷积滤波器的矩形结构允许信息从遮挡物体泄漏到将用于检测其他物体的特征图条目中。

在使用全卷积网络的 3D 激光雷达的车辆检测中,提出了基于距离图像表示的检测网络。如下图所示,该网络将点云的距离图像表示作为输入,由左上角的点地图表示。然后,它通过将输入的距离图像通过主干网络进行处理。最后,由主干网络生成的特征图被分类和回归头使用。

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

使用全卷积网络从 3D 激光雷达检测车辆

3d 体素化网格表示

**点云的另一种网格表示形式是 3d 体素化,通过量化激光雷达传感器周围的 3d 长方体 子空间来实现。选择 3d 长方体是因为它们的几何形状与张量的立方体形状兼容。为了实现 3d 体素化,首先,对于给定的 lidar 传感器,根据 lidar 传感器的范围以及给定应用的目标范围,选择围绕 lidar 传感器的 3d 长方体 **。激光雷达传感器范围的含义是避免激光雷达超范围空间的量化,以便节省存储器和计算。特别地,沿着激光雷达坐标框架的 x 和 y 轴的 3d 立方体的尺寸主要根据激光雷达传感器的范围来选择。例如,假设威力登 HDL-64E 的范围是 120 米,假设激光雷达传感器在立方体的中心,则其相应的 3d 立方体体素化的 x 和 y 维度不应大于 240 米。

此外,影响 3d 长方体尺寸的另一个因素是 3d 对象检测网络所设计的应用的目标范围。例如,在自动驾驶应用的情况下,高度大于激光雷达传感器(安装在自动驾驶汽车车顶上的激光雷达传感器)高度 2 米的子空间并不重要,因为自动驾驶汽车路径的规划是在激光雷达坐标系的 x-y 平面中执行的,并且在我们发明飞行自动驾驶汽车之前,自动驾驶汽车不会沿着激光雷达坐标系的 z 轴移动:)。在激光雷达坐标系中,3d 长方体的 z 尺寸的典型范围是从-2.5 米到 1.5 米,其中考虑到激光雷达传感器安装在自动驾驶汽车的车顶上,并且需要对地面上的物体进行检测,因此选择了-2.5 米的较低范围。

在选择围绕激光雷达传感器的 3d 立方体子空间的尺寸之后,下一步是量化 3d 立方体,以便将它们转换成张量,用作 3d 对象检测网络的输入。下图说明了这种量化过程,其中 3d 立方体在 x、y 和 z 维度上被量化。每个量化的子立方体称为一个体素单元。量化分辨率通常在三个维度上是相同的。这种分辨率的一个典型值是 0.1 米,这导致每个体素单元是一个 0.1 米×0.1 米×0.1 米的立方体。

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

3d 体素化。

****量化后的最后一步是为每个体素单元选择一个表示。最常见的表示形式是给每个体素单元分配一个二进制值,如果体素单元包含至少一个激光雷达点,则分配值为 1,否则为 0。这种表示将把每个场景转换成 3d 张量。体素细胞的另一类表示是特征向量,其可以是手工设计的特征或机器学习的特征。为体素单元选择特征向量表示导致场景被编码为 4d 张量。

3d 体素化表示的主要优点如下。(1)因为 3d 体素化表示将原始点云转换成结构化网格表示,所以它们可以直接用作 CNN 对象检测网络的输入。这将允许 3d 体素化表示方法受益于 CNN 对象检测网络的最新进展。(2)与距离图像表示不同,3d 体素化表示不会遭受比例模糊和遮挡,因为它们不将激光雷达点投影到 2d 视点平面上。

**另一方面,这种表示法的主要缺点是量化误差以及计算和存储效率低。 3d 体素化表示是一种类似于任何其他量化方法的有损变换。具体而言,给定体素单元内的所有激光雷达点将由标量或固定大小的矢量表示,该矢量可能不传达体素单元激光雷达点中编码的所有信息。**此外,3d 体素化生成的张量大小比原始点云表示大几个数量级。例如,在 KITTI 数据集中,每个点云场景平均包含 100k 个激光雷达点,而其对应的具有 80m×80m×3m 尺寸的立方体和 0.1m 量化分辨率的 3d 体素化表示将是大小为 800x800x30 的 3d 张量,其具有大约 19M 个条目,比原点云表示大约大 200 倍。这种表示的计算和存储效率低下是由于这些体素单元的大部分(97%)是空的,这消耗了存储器并将被卷积滤波器处理。

****与 3d 体素化表示相关联的额外计算成本的另一个来源是在 3d 对象检测网络中使用 3d 卷积层,3d 对象检测网络将这些表示作为输入。下图显示了一个 3d 3x3x3 卷积滤波器。类似于依赖于 x-y 平面中局部邻域的空间相关性的沿 x 和 y 轴的 2d 卷积运算,这种局部邻域相关性也存在于 3d 体素化表示的 z 维中,这证明了沿所有 x、y 和 z 维使用 3d 卷积的合理性。尽管事实上 3d 卷积是 3d 体素化表示的自然选择,但是与 2d 卷积相比,3d 卷积的问题在于其额外的计算成本以及比 2d 卷积更多的参数。

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

3d 卷积。

2d 体素化网格表示

2d 体素化网格表示类似于 3d 体素化网格表示,主要区别在于,在基于传感器的范围和目标范围选择围绕激光雷达传感器的 3d 立方体子空间之后,我们仅沿着 3d 立方体的 x 和 y 轴而不是 z 轴对其进行体素化。下图显示了这样的 2d 体素化过程。作为 2d 体素化的结果,立方体子空间被分割成 x-y 平面中的 2d 体素单元。请注意,这些 2d 体素单元实际上是跨越立方体子空间的高度维度的高 3d 体素单元,并且被称为 2d 体素单元仅仅是因为在 2d x-y 平面上执行的量化过程。

这些 2d 体素单元的大部分是空的,这使得 2d 体素化的计算和存储效率低于原始的原始点云表示。标准做法是用固定大小的特征向量来表示每个 2d 体素单元。这样做从 2d 体素化过程得到的张量将是 3d 张量。量化误差是 2d 体素化的另一个问题,它是通过固定大小的特征向量来表示 2d 体素单元内的点云的预期结果。

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

二维体素化。

**类似于 3d 体素化的 2d 体素化是将由 CNN 对象检测网络处理的结构化网格形式的自然表示。**处理 2d 体素化网格的 CNN 对象检测网络比那些将 3d 体素化网格作为输入的检测网络在计算上更高效。是因为依赖 2d 卷积层而不是检测网络处理 3d 体素化网格所使用的 3d 卷积层。另一方面,类似于 3d 体素化,2d 体素化表示不会遭受尺度模糊和遮挡。

**每个 2d 体素单元被称为柱,其是与 3d 立方体体素表示具有相同高度的体素单元。**与对应于 2d 体素化表示的最终 3d 张量中的每个支柱相关联的表示是固定大小的向量,其可以由手工设计的支柱编码器或机器学习的支柱编码器生成。在接下来的章节中,我们将提供手工设计和机器学习的特征向量的优缺点。

柱式编码器

柱子编码器是映射,其获取给定柱子内部的激光雷达点,并生成对应于柱子的固定大小的特征向量。由柱子编码器生成的柱子特征向量形成点云的 3d 张量网格表示。下图显示了一个带有相关激光雷达点的柱子。请注意,与每个矿柱相关联的激光雷达点的数量不是固定的,而是因矿柱而异。柱子编码器必须具有输入排列不变性,因为改变柱子内激光雷达点的顺序不会影响这些激光雷达点所代表的几何形状和语义类别。

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

标有紫色点的柱子及其关联的激光雷达点。

支柱编码器的两个类别是手工设计的和机器学习的编码器,这将在下面的章节中进一步讨论。

手工设计的柱式编码器

****手工设计的柱子编码器是由实践者和研究人员设计的输入方式排列不变性编码器,并且不是从数据中学习的,以便表示柱子的激光雷达点的统计。手工设计的支柱编码器的设计需要专家的工程努力,并不保证能产生支柱的最佳表现。依赖手工设计的编码器的另一个挑战是,它们可能无法在不同的数据集和任务之间转移。这意味着切换到新的数据集将需要全新的编码器,这需要额外的工程努力。

下图所示的 PIXOR 是一个带有手工设计的柱状编码器的著名激光雷达 3d 物体探测网络。该网络依赖于具有 x = [0,70],y = [-40,40]和 z = [-2.5,1]的尺寸(以米为单位)的 3d 立方体的 2d 体素化,量化分辨率为 0.1m。柱特征向量的尺寸为 38,其转化为对应于 800×700×38 的 2d 体素化表示的 3d 张量的尺寸。首先,这个 3d 张量表示由残余块形成的主干网络处理。然后,由该主干网络生成的特征地图被特征金字塔网络扩充。具有 200×175×96 尺寸的特征金字塔网络的最终特征地图输出将被传递到分类和回归头。

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

PIXOR 。注意输入张量 36 的 z 维不正确,应该是 38。

**现在,我们把重点放在 PIXOR 手工设计的立柱编码器上。PIXOR 柱子编码器是输入方式置换不变性映射,其将柱子的 lidar 点变换为具有维度 38 的固定大小的特征向量。**这些特征向量中的大多数条目编码了在不同高度的柱子上的激光雷达点的存在。具体来说,每个支柱沿 z 轴被分割成高度为 0.1 米的分段。因此,假设每个支柱的高度为 3.5 米,则每个支柱将有 35 个这样的分段。每个线段都表示为一个二元变量,如果线段中至少存在一个激光雷达点,则该变量的值为 1,否则为 0。除了这 35 个与高度相关的特征之外,另一个特征条目被设置为等于矿柱中激光雷达点的平均强度。此外,还有两个特征条目,它们表示与沿 z 轴的每个支柱相对应的越界点。如果在其 x-y 边界内的支柱上方(下方)至少存在一个激光雷达点,则顶部(底部)超出范围要素条目将设置为 1,否则设置为 0。

机器学习支柱编码器

****机器学习支柱编码器是以端到端的方式学习的,作为激光雷达 3d 对象检测网络的一部分,依赖于标记的训练数据。机器学习的支柱编码器必须具有输入排列不变性,因此类似于已经讨论过的点网架构。机器学习的立柱编码器相对于手工设计的立柱编码器的优势有两方面,如下所述。(1) 机器学习的支柱编码器映射作为 3d 对象检测网络的一部分直接从数据中学习,它们表示针对 3d 对象检测网络的回归和分类任务精确定制的特征。 (2)改变训练数据和目标任务不需要额外的工程努力来重新设计支柱特征向量,因为支柱特征编码器是以自动方式从数据中学习的。

PointPillars 是机器学习支柱编码器中的一个突出模型,如下图所示。机器学习的柱子编码器(简称柱子特征网)是点网的简化版本,其中点态函数 h 是一个 64 个神经元的全连接层,后面是 BatchNorm 和 ReLU。此外,在这个类似 PointNet 的结构中,对称函数 g 是一个基于元素的 max-pooling 层。首先,映射 h 被单独应用于给定支柱中的每个激光雷达点,这为每个激光雷达点生成维度 64 的嵌入。然后,基于元素的最大池层 g 获取矿柱的所有激光雷达点的嵌入,并生成维数为 64 的单个矿柱特征向量。基于 2d 体素化和所描述的柱编码生成的 3d 张量被传递到 3d 对象检测网络的主干网络。

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

点柱

用 colab 实现基于激光雷达点云的三维目标检测(第 1 部分,共 2 部分)

原文:https://towardsdatascience.com/lidar-point-cloud-based-3d-object-detection-implementation-with-colab-part-1-of-2-e3999ea8fdd4?source=collection_archive---------6-----------------------

我们将了解使用 KITTI 激光雷达点云数据实现 3D 车辆检测的体素网算法所需的概念

环境感知在构建自主车辆、自主导航机器人和其他现实世界应用中扮演着不可或缺的角色。相机、雷达和激光雷达等传感器用于感知环境的 360 度视图。从传感器获得的数据被解释为检测静态和动态物体,如车辆、树木和行人等。

3D 物体检测的需要

计算机视觉中最先进的技术在 2D 数据如图像、视频(图像帧序列)上实时高精度地检测物体。但是使用相机传感器进行诸如定位、测量物体之间的距离以及计算深度信息之类的活动可能不是有效的,并且在计算上是昂贵的。

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

图片来源: engin Bozkurt 带 KITTI 点云浏览器

激光雷达是一种主要的传感器,它根据点云提供物体的 3D 信息,以定位物体并表征形状。

最近,许多先进的 3D 对象检测器,如 VeloFCN、3DOP、3D YOLO、PointNet、PointNet++等,被提出用于 3D 对象检测。但在本文中,我们将讨论体素网这是一种 3D 物体检测算法,其性能超过了上述所有最先进的模型*。

体素网:基于点云的三维物体检测的端到端学习。

作者:尹舟,Oncel Tuzel - Apple Inc

论文的 DF 可以在这里下载,发表日期:2017 年 11 月 17 日

体素网应对的挑战

  • 代替手动特征提取:在手动特征提取中,将点云投影到俯视图中,然后应用基于图像的特征提取方法进行检测。但是这些技术造成了信息瓶颈,并且不能提取检测任务所需的 3D 信息。

为了有效地提取三维形状信息,本文引入了机器学习特征提取器——特征学习网络。

  • 减少计算并关注存储器限制:体素分组和随机采样技术用于处理体素中包含多于 T 个点的体素。
  • 端到端 3D 检测架构:同时从原始点云数据中学习特征表示,并以端到端的方式预测精确的 3D 边界框。

体素网简而言之是“将点云划分为等距的 3D 体素,通过堆叠的 VFE 层将每个体素编码为矢量,然后使用 3D 卷积层聚集(组合)局部体素特征,将点云转换为高维体积表示。最后,修改的 RPN 网络引入体积表示并提供检测结果”。

体素网架构

体素网架构主要包含三个模块

  1. 特征学习网络
  2. 卷积中间层
  3. 区域提案网络

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

体素网架构。a)输入细分成等间距体素的点云数据 b)特征学习网络,将体素中的一组点转换成作为 3D 张量的新特征表示 c) 3D 卷积 d) RPN 网络以绘制 3D 边界框。 P ic 学分:【https://arxiv.org/abs/1711.06396 T3

特征学习网络:

特征学习网络用于通过处理体素中的单个点云来从体素网格中提取描述性特征,以获得逐点特征,然后将这些逐点特征与局部聚集特征聚集。特征学习网络被应用于包含多于 T 个数目的点的所有体素。

体素分割:将 3D 空间细分成等间距的体素

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

体素分割:用体素分割 3D 空间。作者图片

以下是体素分区的代码片段:

注意:为体素网格定义的测量将根据对象的类别而变化

  • cfg。MAX_POINT_NUMBER 表示点云阈值,该阈值用于处理包含超过 35 个点云的选择性体素网格
  • x,Y,Z 最小值,最大值以米为单位定义 3D 空间
  • 体素 X 尺寸表示体素网格尺寸(固定)

体素分割

随机抽样

点云被划分到体素网格中。因为处理所有点在计算上是昂贵的,并且增加了存储器的使用,这又增加了计算设备的负荷。为了应对这一挑战,对包含“T”个以上点云的体素网格进行采样。

有了这个策略,我们可以实现

  1. 计算节省
  2. 减少体素之间点的不平衡,从而减少采样偏差,并为训练增加更多变化。

堆叠体素特征编码

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

应用于单个体素的特征学习网络。 pic 积分

**全连接神经网络的逐点输入:**我们考虑包含多于 T 个数目的点的体素网格。体素中的每个点云用 4 个坐标[x,y,z,r]表示;其中 x、y、z 表示坐标,r 表示反射率。我们计算局部平均值作为体素网格内所有点的质心( **V)。**然后,我们用局部均值的偏移来增加体素中的每个点,以获得逐点输入特征集。

**全连接神经网络(FCN 网)😗*逐点输入特征集被馈送到全连接神经网络,以聚集所有逐点特征,从而对体素所包含的表面形状进行编码。

FCN 网络由线性层、批量归一化和递归组成。

**基于元素的最大池:**基于元素的最大池用于从基于点的输入特征中获取局部聚集的特征

最后,逐点连接用于聚合逐点特征和局部聚合特征。

使用批量标准化和最大池定义逐点输入、聚合要素的 VFE 图层代码片段:

卷积中间层

该层将体素特征转换为密集的 4D 特征图,并使用卷积、批量归一化、ReLU 将特征图的大小减少到原始的四分之一。

ConvMD(cin,cout,k,s,p)表示 M 维卷积运算符,其中 cin 和 cout 表示输入和输出通道的数量,k、s 和 p 分别表示内核大小、步长和填充大小。

显示 3D 卷积层的代码片段:

区域提案网络

改进的区域提议网络具有三个完全卷积层的块。每个块的第一层通过步长为 2 的卷积对特征图进行减半下采样,之后是步长为 1 的卷积序列(×q 表示滤波器的 q 次应用)。在每个卷积层之后,应用 BN 和 ReLU 操作。然后,我们将每个块的输出上采样到固定大小,并连接以构建高分辨率特征图。

最后,该特征图被映射到期望的学习目标:

(1)概率得分图和

(2)回归图。

定义卷积和反卷积层的代码片段:

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

修改后的 RPN 架构 pic 信用

感谢阅读!!!

在下一篇文章中,我们将实现三维物体检测的体素网代码

以下是在 colab 中实现该模型所获得的一些结果

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

KITTI 验证数据集上的预测结果

特别感谢:

Uma K Mudenagudi 博士,KLE 理工大学,项目导师。

参考

  1. 体素网:基于点云的三维物体检测的端到端学习
  2. PointNet:用于三维分类和分割的点集深度学习
  3. 基于深度学习的物体检测综述
  4. KITTI 原始数据集:@ARTICLE{ Geiger2013IJRR ,作者= { Andreas GeigerPhilip LenzChristoph StillerRaquel Urtasun },标题= {视觉与机器人:KITTI 数据集},期刊= {国际机器人研究期刊(IJRR)},年份= {2013}

用 colab 实现基于激光雷达点云的三维目标检测(第 2 部分,共 2 部分)

原文:https://towardsdatascience.com/lidar-point-cloud-based-3d-object-detection-implementation-with-colab-part-2-of-2-f3ad55c3f38c?source=collection_archive---------16-----------------------

使用 google colab 实现了基于点云的三维物体检测算法。

在我以前的文章中,我解释了实现体素网所需的关键概念,体素网是一种端到端的 3d 对象检测学习模型,您可以在这里找到

延续上一篇文章,我们将使用 KITTI 点云数据实现三维物体检测的体素网算法

第一步:处理 KITTI 数据集训练模型【详细步骤】

以下步骤对于准备数据来训练模型至关重要。KITTI 数据集需要下载、裁剪、处理并保存在驱动器中。

登录 google colab ,打开笔记本,暂时不需要 GPU。

注意:如果选择了 GPU,请注意,每个用户都有大约 30GB 的虚拟空间,整个数据集的大小为大约 40+ GB,然后解压缩数据集的内存将耗尽。在接下来的步骤中,我们将下载 KITTI 数据集、处理、裁剪和创建。压缩并移动到驱动器,以便将来使用这些数据

  • 必需的数据集
  1. 威力登点云(29 GB):将数据输入到体素网

2.对象数据集的训练标签(5 MB):体素网的输入标签

3.目标数据集的摄像机校准矩阵(16 MB):用于预测的可视化

4.对象数据集的左侧彩色图像(12 GB):用于预测的可视化

#clone the voxelnet git repo
!git clone [https://github.com/gkadusumilli/Voxelnet.git](https://github.com/gkadusumilli/Voxelnet.git)
#change the cwd
%cd /content/drive/My Drive/Voxelnet/crop_data
  • 下载数据集(。zip)直接加载到 colab 虚拟机[~ 15–20 分钟]
#Data label file
!wget (enter the link)#Calib file
!wget (enter the link )#Velodyne file
!wget (enter the link)# Image file
!wget (enter the link)
  • 解压缩数据集(。zip)到文件夹中(大约 20- 30 分钟)
#Unzip the velodyne training folder
!unzip /content/Voxelnet/crop_data/data_object_velodyne.zip 'training/*' -d /content/Voxelnet/crop_data#Unzip the image training folder
!unzip /content/Voxelnet/crop_data/data_object_image_2.zip 'training/*' -d /content/Voxelnet/crop_data#unzip the object label
!unzip /content/Voxelnet/crop_data/data_object_label_2.zip#unzip the data object calib
!unzip /content/Voxelnet/crop_data/data_object_calib.zip 'training/*' -d /content/Voxelnet/crop_data
  • 用于训练和验证的裁剪点云数据。图像坐标外的点云被移除。裁剪的点云将覆盖现有的原始点云[40–45 分钟]
#to run the 'crop.py' lower version of scipy is needed
!pip install scipy==1.1.0#run crop.py
!python crop.py
  • 创建验证数据以评估模型[~ 10–15 分钟]
#create a folder 'validation' and copy the content in training #folder!mkdir /content/Voxelnet/crop_data/validation%cp -av /content/Voxelnet/crop_data/training /content/Voxelnet/crop_data/validation/
  • 我们将根据协议在这里【2-3 分钟】分开训练

最后一步…

  • 创造。压缩已处理、裁剪数据的文件夹[30–40 分钟]
!zip -r /content/VoxelNet/data/data_lidar.zip /content/VoxelNet/crop_data
  • 移动。压缩文件夹到驱动器[~5 分钟]
#rename the folder as you need in the drive, I've stored in dtive with the folder named 'AI'!mv "/content/VoxelNet/data/data_lidar.zip" "/content/gdrive/My Drive/AI"

下面是链接到 colab jupyter 笔记本的所有上述步骤。

步骤 2:训练模型

  • 登录 google colab ,创建一个新的笔记本
  • 要访问 GPU:点击运行时>更改运行时类型> GPU

注意:colab GPU 运行时间大约在 12 小时后,运行时间将被断开,存储的数据将会丢失。因为在我们的情况下,每个历元将花费大约 2 小时,并且需要训练超过 20 个历元来观察初步结果。所以将使用 google drive 作为存储代码、检查点、预测结果等的路径

  • 将当前工作目录(CWD)更改为 drive
#voxelnet is the folder name, you can rename as you need
%cd /content/drive/My Drive/Voxelnet
  • 体素网的实现需要几个依赖项。因此,我们将克隆整个存储库。
!git clone [https://github.com/gkadusumilli/Voxelnet.git](https://github.com/gkadusumilli/Voxelnet.git)
  • 建立档案
%cd /content/drive/My Drive/Voxelnet!python setup.py build_ext --inplace
  • 将处理后的数据集解压缩到 crop_data 文件夹中[35–40 分钟]
%cd /content/drive/My Drive/Voxelnet/crop_data#Locate the zip folder in the drive and unzip using !unzip command
!unzip "/content/drive/My Drive/AI/data_lidar.zip"

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

数据文件夹结构

  • 训练模型
%cd /content/drive/My Drive/Voxelnet/

重要参数解析

!python train.py \--strategy="all" \--n_epochs=16 \--batch_size=2 \--learning_rate=0.001 \--small_addon_for_BCE=1e-6 \--max_gradient_norm=5 \--alpha_bce=1.5 \--beta_bce=1 \--huber_delta=3 \#if dump_vis == yes, boolean to save visualization results
--dump_vis="no" \--data_root_dir="/content/drive/My Drive/Voxelnet/crop_data" \--model_dir="model" \--model_name="model6" \--dump_test_interval=3 \--summary_interval=2 \--summary_val_interval=40 \--summary_flush_interval=20 \--ckpt_max_keep=10 \

用张量板可视化测井方向

%load_ext tensorboard#summary_logdir is the logdir name
%tensorboard --logdir summary_logdir

下面的快照是日志目录结果@ epoch6

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

张量板-logdir

评估模型

!python predict.py \
--strategy="all" \
--batch_size=2 \
--dump_vis="yes" \
--data_root_dir="../DATA_DIR/T_DATA/" \
--dataset_to_test="validation" \
--model_dir="model" \
--model_name="model6" \
--ckpt_name="" \
  • 下载、裁剪和处理 KITTI 数据集的代码可以在这里找到
  • 从第 2 步开始执行的代码可以在这里找到

以下是对模型进行 30 个时期的训练后获得的一些结果。

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

所有车辆都被检测到

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

检测到两辆车

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

一辆车不见了

特别感谢清华机器人学习实验室黄千贵大卫·夏羽为实现体素网做出的宝贵贡献

特别感谢:

Uma K Mudenagudi 博士,KLE 理工大学,项目导师。

参考资料:

KITTI 原始数据集:@ ARTICLE {Geiger 2013 jrr,作者= { Andreas GeigerPhilip LenzChristoph StillerRaquel Urtasun },标题= {视觉与机器人:KITTI 数据集},期刊= {国际机器人研究期刊(IJRR)},年份= {2013}

数据可视化中的测谎仪技术

原文:https://towardsdatascience.com/lie-detector-techniques-in-data-visualizations-b2838651a946?source=collection_archive---------40-----------------------

深思熟虑地查看数据的艺术…

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

马库斯·温克勒在 Unsplash 上的照片

人类大脑处理视觉数据的速度非常快。它的大量能量用于视觉处理。这可能是一种进化特征,帮助人类在早期充满敌意的环境中生存下来。在那些时候,迅速注意到甚至一个很小的动作,识别动物的脚印,并正确解释危险信号往往在挽救一个人的生命方面发挥着至关重要的作用。

这解释了为什么当数据以视觉形式(图表、图形等)呈现时,我们比以原始格式(表格)呈现时更容易理解。我们倾向于更好地识别图片或图像中的模式或趋势。 “一图胜千言” 这句古老的格言有很大的道理

然而,正确解释数据可视化是一门艺术。图表和图形经常会误导人们,有时是由于错误的解释,有时是由于创作者的错误意图。许多政治和营销活动旨在通过故意提供可疑信息来诱惑和误导人们。

本文试图解释常用数据可视化背后的思想,以及如何有效地解释它们。

尺度和比例

时间 内发生的变化可以被认为是一种趋势。例如,股票价格在一周/一月/一年内的变化、一个国家多年来的 GDP 增长、一个月内气温的上升和下降等。可视化趋势的最佳图表是折线图。考虑以下 6 个月产品销售的虚拟数据:

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

这些数据可以通过以下两种方式可视化:

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

左边的图表显示几个月来销售额增加了,而右边的图表显示销售额大致保持不变。这是怎么回事?

提示 1:始终检查两个轴上的刻度。

在左图中,垂直轴从 3 开始,而在右图中,垂直轴从 0 开始。从技术上来说,两个图表显示的是相同的数据,但由于在轴上的缩放方式不同,解释可能会有很大的不同。

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

如果我们在左图中保持起点为 3,但将数据放大到 10,那么也会出现更真实的画面

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

让我们看看下面显示印度两个邦识字率的数据

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

现在,如果我们将这些数据表示如下:

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

这给人一种感觉,果阿的识字率比 Kerela 低得多,但这不是事实。也许正确的表述应该是这样的,果阿的气泡仅比 Kerela 略小。

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

提示 2:在进行比较时,一定要检查数据的比例

现在,它正确地表明,与 Kerela 相比,果阿的识字率并没有很低,但差别并不明显。

我们的下一个建议来了

提示 3:当跨类别比较数据时,条形图几乎总是更好

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

频率与百分比

让我们看看下面的数据。它的虚假数据显示了各种职业中被报告为抑郁症的人的百分比和数量。

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

如果我们绘制各职业中抑郁者的百分比,图表如下所示:

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

这给我们的印象是,医疗行业和电影行业的%的人都差不多。它掩盖了一个重要的事实,即不同职业中接受采访或分析的人数有显著差异。这是显示数据不足的典型例子。如果我们把某一特定职业的受访人数包括在内,这张图表会更有用,更真实地反映出潜在的数据。下图描绘了这一指标

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

现在,解释完全不同了。

提示 4:如果你看到的是百分比,而不是频率,那就要持怀疑态度,反之亦然。查看百分比和频率 总是一个好主意

数据不足

可能会有这样的情况,某些数据点是精心挑选的,以推动叙述朝着特定的方向发展。检查下面的数据

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

数据绘制如下:

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

在左边,图表显示上升趋势,而在右边,它显示下降趋势。图表的读者可能会被欺骗,认为随着时间的推移,销售会增加,如果他不注意左边的图表只绘制了 2018 年的情况。如果跨年度分析销售趋势(右图),销售额实际上是下降的。

提示 5:经常检查数据的完整性。不要仅凭图表的外观就做出判断。检查已经包含(或省略)的数据点。

我们很多人都有一个根本性的缺陷。我们患有 确认偏差 ,这是一种倾向于相信和回忆那些确认或支持我们先前信念或价值观的信息。

我们往往只看到那些我们想看到的东西!

因此,我们的数据可视化可能会遭受同样的缺陷,有时是无意的,有时是故意的。让我们试着不要用数据可视化来欺骗自己或他人!

数据科学的生命周期

原文:https://towardsdatascience.com/life-cycle-of-data-science-1601b2580a9c?source=collection_archive---------47-----------------------

数据科学项目各个阶段的概述

当今世界不可避免的一部分是提升自己的技能,以便启动他们的职业生涯或前进到另一个阶段。精心计划的技能提升总是有回报的。在进入任何技术或研究领域之前,有必要做一些基础工作来了解我们的未来。最好的方法之一是掌握端到端流程。关于我们从哪里开始,在哪里结束的坚定想法为我们的旅程设定了道路。它创造了一条顺畅的学习之路,也提供了一个设定短期目标和里程碑的机会。数据科学作为一个研究领域也不例外。

数据科学的项目生命周期包括六个主要阶段。各有各的意义。

  1. 理解问题陈述

第一步,也可能是最重要的一步,是理解业务问题。这包括不断的沟通和倾听技巧,以便理解手头的问题。如果你是这个领域的新手,问题陈述显然不会像我们在学习概念时遇到的那样简单。在现实世界中,问题陈述的复杂性会成倍增加。理解问题陈述以满足业务需求以及数据科学家理解最终目标是非常必要的。通常,数据科学/分析领域存在三种类型的公司

  • **Captive Analytics 公司:**没有实际的客户,但问题陈述已经形成。该公司的目标是不断努力,不断改进
  • **非专属分析公司:**这些公司寻找客户提供他们的分析服务。客户需要很好地制定问题陈述。
  • **基于产品的分析公司:**这些公司没有客户,也没有问题陈述。他们专注于构建将出售给所需客户的分析工具。主要焦点是建立一个广泛的产品/工具来满足多个客户。

2。数据收集

下一步是数据采集或数据收集。数据是问题的起点。数据是信息和噪音的结合。感兴趣的点是在否定噪音的同时处理信息。基本上,有两种数据

  • **原始数据:**原始数据,通常通过调查或问卷获得。我们可以利用的第一手资料。
  • **二次数据:**已经收集发布但还没有准备好的数据。

3。理解数据

这一点更多的是第一点的结果。为了很好地理解数据,人们需要全神贯注于问题陈述。数据点为解决问题构筑了一条坦途。这包括熟悉数据集中的不同变量、性质及其对最终结果的影响。通过这样做,设置了优先级,并且使用相关数据使工作变得容易得多。

4。数据准备

数据准备是一个可以理解实际发生了什么的阶段。从技术上讲,这里是进行 探索性数据分析的地方。 顾名思义,我们的目的是在给定的数据上进行探索。理解数据也意味着我们以一种可理解的方式表示给定的数据。一种有效的方法是用图表的形式绘制数据,以便直观地理解。对给定数据的分析大致有两种类型。

  • **单变量分析:**是分析单个变量的过程。此方法确定特定变量的行为和属性。
  • **多变量分析:**另一个术语是双变量分析,通常用于确定变量之间的关系以及因果关系。

5。数据建模

这是倒数第二步,可能也是耗时较少的一步。由于 60–70%的工作是通过理解和准备数据完成的,所以工作是将数据放入各种算法中,这些算法最适合问题陈述。这一步的主要分裂包括两种方式—

  • **监督学习:**使用包含自变量(输入)和因变量(输出)的数据的学习模型。这个模型确保有东西可以对照结果进行交叉检查。监督学习的常用方法有 回归分类
  • 无监督学习:和有监督的完全相反。使用只有自变量(输入)而没有因变量(输出)的数据的模型。这主要是为了对数据进行分组以找到模式。无监督学习的常用方法有 聚类降维** 和 关联规则挖掘。

这些模型是时间不变的,即它们不依赖于时间因素。然而,有一套不同的依赖于时间的模型建立/预测方法,称为时间序列分析。

6。模型评估

生命周期的最后一个重要步骤是模型评估。一旦建立了模型,就可以通过基于不同技术的评估来衡量模型的质量。模型的质量通常是通过对其进行定量测量来确定的。诸如混淆矩阵、分类报告、损失函数、误差等技术是评估模型的一些度量。模型的基准取决于利益相关者。如果模型不够好,可以通过追溯到前面的阶段来进行返工。一个没有错误的,良好加权的模型是那些有资格进一步移动的模型。

上述六个阶段是重要的阶段,但是还有其他阶段也是生命周期的一部分。

  • 输出解释
  • 模型部署
  • 监视
  • 维护和优化(如有必要)

我们已经走到了尽头。这是对数据科学生命周期的高度解释。

请随时在 LinkedIn 上与我联系、讨论、交流知识。

使用数据分析对比预期寿命和国内生产总值!

原文:https://towardsdatascience.com/life-expectancy-vs-gross-domestic-product-using-data-analytics-bc0d5c78043f?source=collection_archive---------42-----------------------

数据分析

一个数据分析练习,看看我们能否找到这两个术语之间的关系。

数据分析是指提高生产力和商业效益的数据处理方法。数据来自各种来源,并被清理和分类以解释不同的行为模式。在这里,国内生产总值和出生年份预期寿命之间的关系是借助于六个不同国家过去 20 年的数据来分析的。

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

艾萨克·史密斯在 Unsplash 上拍摄的照片

使用的术语:

  1. GDP: 国内生产总值(GDP)是一个国家在一定时期内生产的所有成品和服务的总体货币或消费者价值。它是衡量国内总产出的一个重要指标,是一个国家经济健康状况的详细记分卡。GDP 以美元计算。
  2. 出生时的预期寿命(LEABY): “预期寿命”这个词指的是一个人预期能活多少年。根据定义,预期寿命是基于对特定人口群体成员死亡时的平均年龄的估计。

本项目中使用的数据来自世界银行。该项目旨在借助数据可视化,尝试确定澳大利亚、中国、德国、印度、美国和津巴布韦这六个国家的国内生产总值与预期寿命之间的关系。

在这里找到这个项目的代码,在 LinkedIn 上和我联系。让我们进入编码部分。

1.可视化过去 20 年(1999 年至 2018 年)每个国家的 LEABY

Violin 图帮助我们一次可视化和比较多个分布。沿着中线有两个对称的“KDE —核密度估计—图”。中间的“黑色粗线”表示四分位数范围,而从四分位数延伸到两端的线表示 95%的置信区间。中间的白点表示分布的中间值。点击了解更多关于小提琴的剧情

下面是创建六个国家的小提琴情节的代码。

from matplotlib import pyplot as plt
import pandas as pd
import seaborn as snsdf = pd.read_csv("final.csv")fig = plt.subplots(figsize=(12, 7))
sns.violinplot(data=df, x='Country', y='LEABY', fontsize='large', fontweight='bold')
plt.savefig("violin.png",bbox_inches='tight')

输出:

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

小提琴情节:出生年份的预期寿命(利比)与国家

我们可以看到方差在津巴布韦国家的数据中最高,在美国最低。此外,澳大利亚的平均预期寿命最高,津巴布韦最低。

2.可视化 GDP 和 LEABY 之间的相关性

一个 FacetGrid 接受一个函数并创建您指定参数的独立图形。

接下来,为了了解 GDP 和 LEABY 之间的相关性,让我们看看散点图的分面网格,将 GDP 映射为各个国家预期寿命的函数。以下是 matplotlib 散点图(LEABY vs GDP)。

g = sns.FacetGrid(df, col='Year', hue='Country', col_wrap=4, size=2)
g = (g.map(plt.scatter, 'GDP', 'LEABY', edgecolor="w").add_legend())

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

预期寿命与国内生产总值

散点图很容易解释。从上面的图表中,我们可以注意到这些国家在过去 20 年中发生的变化。中国和美国是沿 x 轴移动最多的国家,即国内生产总值多年来一直在增长,而津巴布韦是沿 y 轴移动最多的国家,即预期寿命随着时间的推移而增加。此外,澳大利亚和美国的预期寿命在过去 20 年中似乎保持不变。

此外,可视化变量随时间变化的一个很好的方法是使用折线图。现在,如果我们分别用线形图来表示 GDP 和预期寿命,而不是散点图,我们可以更容易地看到随着时间的变化。下面是按国家绘制的 GDP 线图。

g3 = sns.FacetGrid(df, col="Country", col_wrap=3, size=4)
g3 = (g3.map(plt.plot, "Year", "GDP").add_legend())

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

按国家绘制 GDP 的折线图

在这些国家中,美国的国内生产总值最高,而且这一数字逐年稳步上升。正如我们所看到的,中国的 GDP 在过去的 10 年里急剧增长,我们很想知道中国发生了什么事情导致了这种突然的变化?这背后有很多原因,你可以在下面的文章中找到。

[## 这就是中国经济在过去 10 年中的变化

即使国内生产总值的增长率有所下降,普通中国人现在的富裕程度是 2006 年的两倍多…

www.weforum.org](https://www.weforum.org/agenda/2016/06/how-has-china-s-economy-changed-in-the-last-10-years/)

现在让我们来看一个类似上面 LEABY 的图。下面是按国家划分的预期寿命曲线图。

g3 = sns.FacetGrid(df, col="Country", col_wrap=3, size=4)
g3 = (g3.map(plt.plot, "Year", "LEABY").add_legend())

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

FacetGrid 绘制各国预期寿命的线图

从 2010 年到 2015 年,这六个国家的预期寿命发生了巨大变化。随着时间的推移,美国的预期寿命变化最小,这可能是高 GDP 的结果吗?但是澳大利亚的情况是,与其他国家相比,它的国内生产总值较低,但是预期寿命仍然几乎与美国相当。GDP 和预期寿命之间的关系似乎不是那么简单。

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

马克·弗莱彻·布朗在 Unsplash 上的照片

“这非常令人惊讶,”加州洛杉矶大学经济学教授阿德里亚娜·勒拉斯-穆尼说。“我们知道,富裕国家的人比贫穷国家的人寿命长。国内生产总值和预期寿命之间有很强的关系,这表明收入越高越好。然而,当经济表现良好时,当经济增长高于正常水平时,我们发现更多的人正在死亡。”也就是说,致富有很大的好处。但是致富的方法,听起来很冒险。

总之,经济学家们一致认为,当一个国家的经济表现——其国内生产总值——高于预期时,死亡率往往高于预期。这种关系很明显,但影响程度很小。当国内生产总值比平均水平高出 5%时,成年人的死亡率可能会增加 1 %,这是一个不错的增长。阅读下面的文章,更好地理解国内生产总值和预期寿命之间的关系。

[## GDP 和预期寿命之间的关系并不像你想象的那么简单

每个人都希望经济增长,对吗?这是每个政治家一揽子承诺的一部分。扩张的经济使…

www.weforum.org](https://www.weforum.org/agenda/2016/10/the-relationship-between-gdp-and-life-expectancy-isnt-as-simple-as-you-might-think)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值