TowardsDataScience 博客中文翻译 2016~2018(十六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

经理的日常工作不是在屏幕前…

原文:https://towardsdatascience.com/a-managers-day-job-isn-t-in-front-of-a-screen-e9af6c216f24?source=collection_archive---------4-----------------------

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

但是是和同事和顾客一起。

在每天钻研数据之前,我们最好从办公桌前退一步,回顾一下我们的组织试图解决的问题的性质。数据的无处不在并没有让我们的客户、团队或市场份额的管理变得更容易,因为每个数据源都构成了日益复杂的业务难题中的又一部分。要解开这个谜,需要弄清楚数据是如何反映人性、你的业务和你的市场的更大图景的。我们试图解决什么类型的问题,这些问题与过去管理者面临的问题有本质的不同吗,分析在今天能发挥什么作用?

如果这些数据告诉了我们什么,那就是泰勒的“一个最佳方式”的观点早已过时。因为业务本质上是“混乱的”,运营管理主要是解决没有按计划运行的流程、政策和决策。出现这些挑战的部分原因是,如今消费者对价值的认知更多地基于他们的体验,而不是公司产品或服务的特性。这种复杂性还源于这样一个事实,即基于每个利益相关者的精神状态、认知偏差和背景,对这些经历的评估是不同的。这也是信息经济发展的结果:数据的数量、速度和多样性影响了我们所掌握的数据的准确性和可见性。【我】

大卫·斯诺登和玛丽·布恩提醒我们,这些年来,我们今天面临的问题的性质已经发生了很大的变化。【ii】他们谈到了复杂程度,这决定了管理者如何评估他们的业务环境,以及他们在哪里寻找数据。他们认为,第一级问题涉及线性事件链,其中过程优化提供了相关的和可复制的解决方案。第二层业务挑战是由流程故障引起的,其答案可以从管理层以前的经验中推断出来。第三级挑战要求重新表述问题,因为无论是过程还是先前的经验都没有提供足够的数据来处理问题。斯诺登和布恩认为,多年来,市场和组织已经在很大程度上解决了第一和第二层次的问题,今天留给我们的是第三层次的挑战,即客户满意度、员工参与度和组织效率,这些挑战错综复杂地交织在我们设想的工作方式中。

应对业务挑战与手头数据的数量关系不大,而与我们利用数据来激发集体行动的能力关系更大。好的、更好的和伟大的决策取决于我们所处的决策环境。【iii】在确定性决策环境中,好的决策是可能的,在这种环境中,答案可以从手头的数据中确定。不幸的是,大多数业务决策都是在随机环境中做出的,在这种环境中,无法从可用数据中找到正确的决策,但在减少不确定性的原因方面,更好的决策是可能的。最后,伟大的决策是那些背景、挑战和解决方案允许我们重新审视决策过程本身的本质的决策。在查看数据之前,首先关注问题出现的背景,这是决策科学的主要收获之一。

如果测量是为了减少不确定性,那么管理就是为了阐明复杂性【iv】我们的业务挑战源自我们对结构良好的组织和有序市场的幻想,并以对业务“应该”如何运营的理想简化为基础。今天的组织和市场是相互依赖的开放和相互依赖的,消费者和商业逻辑往往是自生的。“涌现”描述了违背经过时间考验的业务实践的结果行为,并提出了预测性和规范性分析的困难。如果数据科学的作用是降低风险、不确定性和模糊性,那么我们必须在衡量消费者、员工和管理层的动机、目标和行动之前,仔细研究他们是如何理解这些问题的。底线是,在回到工作之前,和你屏幕后面的数据,好好看看你周围的世界。

*希望提高您的数据科学技能?*在巴约纳的暑期学校,以及在欧洲的大师班,我们让分析为您和您的组织服务。该研究所专注于管理者数据科学的五个应用:数字经济学、数据驱动的决策、机器学习、社区管理和视觉通信。改善管理决策会对你未来的工作和职业生涯产生影响。

Lee Schlenker 是 Pau 商学院的教授,也是 http://baieurope.com 商业分析研究所的负责人。他的 LinkedIn 个人资料可以在 www.linkedin.com/in/leeschlenker.查看你可以在 https://twitter.com/DSign4Analytics的 Twitter 上关注我们

【I】Marr,B. (2014),大数据:每个人都应该知道的 5v,LinkedIn

【I】d . snow don 和 m . Boone(2007),一个领导者的决策框架,HBR

【ii】sch lenker,L. (2017),衡量你的决策质量而不仅仅是你的数据,中

【iii】r .施特劳布(2013),为什么管理者还没有拥抱复杂性,HBR

MapReduce 概述

原文:https://towardsdatascience.com/a-mapreduce-overview-6f2d64d8d0e6?source=collection_archive---------2-----------------------

针对高级编码人员的介绍说明,试图应对您可能也遇到过的任何劝阻。

当我第一次开始阅读 MapReduce 时,几乎每个教程都有 Java 或 C++先决条件的提示。然而,在科技界还有一种过时(而且越来越少)的思维模式,即成为程序员需要 CS 学位。我发现这是非常令人惊讶的,有多少教程有这种前兆,只是让他们通过完全可复制的进出反正。

说到而不是重新发明轮子,抽象就是一切。我们发现自己越少需要记住每个算法的二进制执行,我们就越接近实现它。开发的目的是让 进化 ,如果我们不使用这种技术,我们还不如回到勒德派时代,在工会组织的恐龙牧场用套索套住迅猛龙,只为了赚一些诚实的郁金香球茎。

“跳进来”的想法听起来很忌讳,但不要误解。这并不是说应该忽视整体的理解。了解你的方法的功能和相关的依赖关系对于避免不可逆转的错误是至关重要的。但是要达到这个目标并不需要回到学校或者学习一门新的语言。

也就是说,我将引用这篇文章,来自《并行编程和 MapReduce 入门》课程。现在让我们开始

历史

回到计算的初期,程序是串行的,即由一系列指令组成,每个指令被一个接一个地执行,就像一个人乘坐爱情船的队列。

开发并行化是为了提高性能和效率。它将进程原子化,并同时执行它们。这些碎片化的指令在不同的 CPU 上同时运行,要么来自一台机器,要么来自clouuddd中的。**

除了加速这个过程,它还创造了一个解决方案,当你在本地资源上受到限制时,可以处理大量的数据集。然而,一个实际的先决条件是您拥有对所有数据的同一个存储系统的块级(物理层)访问权,即

集群文件系统

一个共享磁盘文件系统。最常见的 CFS 类型使用一个存储区域网络 (SAN)来允许多台计算机在块级别获得直接的磁盘访问。这由您的数据库管理系统(DBMS)进一步提取。或者,分布式文件系统不这样做,而是使用网络发送数据。

操作它的系统增加了并发控制和串行化的机制,将数据结构编译成可存储的格式,用于网络传输、内存缓冲等。

此外,CFS 使用隔离,在级联故障的预防性情况下隔离集群中的单个节点(稍后将更详细地讨论)。

一旦确定了这一点,您就可以继续

考虑到你的计划

创建并行程序的第一步是确定一组可以并发运行的任务和/或数据分区。

有时,一个进程根本不能同时运行,就像在斐波那契函数中一样:

Fk = Fk-2 + Fk-1

这不能并行化,因为每个计算值都依赖于它前面的值。

更常见的情况是,您将处理大量一致的数据,这些数据必须进行处理,但也可以进行分区。考虑一个字符串数组:

[‘暴躁’,‘傀儡’,‘蜡笔’]

可以分成大小相等的子阵列:

[‘暴躁’] [‘傀儡’] [‘蜡笔’]

如果每个子阵列都没有计算依赖性,没有互通需求,并且可以遵循相同的迭代过程,那么它就是并行计算的理想候选!有一种常见的实现技术叫做master/worker:

主人:

—初始化数组,并根据可用的工作线程将其拆分

—给每个工人发送他们的子阵列

—接收来自每个工作者的响应

工人:

—从主机接收子阵列

—对子阵列执行处理

—将结果返回给主机

如果我们使用以前的子阵列,工人们将完成同样多的工作。该模型将实现静态负载平衡*。*

负载平衡指的是在并行系统中的处理器之间分配任务的技术,以避免一些工作人员重复排队,而其他工作人员则处于空闲状态。为了激起一些想象,把它想象成共产主义的理想实现。

虽然静态平衡器允许更少的开销,但它们没有考虑当前的网络负载。

相反,dynamicbalancer 在考虑网络的同时,提供了更灵活、但计算成本更高的分配。

主/工人示例:

让我们以勾股定理为例来实现

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

这说明斜边(直角的对边)的平方等于其他两条边的平方之和,

a + b = c

虽然这本身是一个非常简单的算法,但它还可以进一步分解:

a_sq = a ^ 2

b_sq = b^ 2

sum_ab =a_sq + b_sq

c = sqrt(sum_ab)

这可以用 Python 重写:

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

cool cool. so at this point you are probably wondering

什么是 MapReduce rly

在查看了一些并行编程示例之后,我们可以对 MapReduce 的实际功能有更多的了解。

MapReduce 是从像 Lisp 这样的函数式语言的 mapreduce 组合子中派生出来的。

在 Lisp 中,映射函数值序列的形式接受输入。然后,它迭代地将该函数应用于序列中的每个值。

一个归约使用一个二元运算组合一个序列的所有元素。例如,它可以使用“+”将一个序列中的所有元素相加。

谷歌利用这一基础作为灵感,因此恰当的标题。与此一起使用的预期数据集非常庞大,通常需要存储在多台服务器上。因此,假定了并行化的必要性。

MapReduce 为 Google 工程师提供了一个抽象概念来执行基本计算,同时隐藏并行化、负载平衡和容错的细节。

MAP: 由 MapReduce 库的用户编写,接受输入对并生成一组中间键/值对。MapReduce 库将与同一个中间键 I 相关联的所有中间值组合在一起,并将它们传递给 Reduce 函数。

***化简:*也由用户编写,接受中间密钥 I 和以及该密钥的一组值。它将这些值合并在一起,形成一个可能更小的值集。

例如,考虑对大量文档中每个单词的出现次数进行计数的问题:

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

map 函数发出每个单词以及相关出现次数的计数。然后 reduce 函数将特定单词发出的所有计数加在一起。

MapReduce 执行概述

通过将输入数据自动划分为一组 M 分割或碎片*,映射调用被分布在多台机器上,这些将在多台机器上被处理。*

Reduce 调用是通过使用用户指定的分区函数将中间密钥空间划分为 R 个片段来分发的。

下图描述了 MapReduce 操作的整个流程序列:

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

  1. 用户程序中的 MapReduce 库首先将输入文件分成 M 段,通常为 16MB-64MB/段。然后,它在一组机器上启动程序的许多副本。
  2. 该程序的副本之一是特殊的:主程序。其余的是由主人分配工作的工人。有 M 个映射任务和 R 个归约任务要分配。主设备挑选空闲的工人,给每个工人分配 M 或 R 任务。
  3. 被分配了地图任务的工作者读取相应输入碎片的内容。它从输入数据中解析出键/值对,并将每一对传递给用户定义的映射函数。产生的中间 K/V 对在存储器中缓冲。
  4. 周期性地,缓冲对被写入本地磁盘,由分区函数划分成 R 个区域。这些缓冲对在本地磁盘上的位置被传递回 master,master 负责将这些位置转发给 reduce workers。
  5. 当 reduce worker 从 master 获得位置时,它使用远程调用从磁盘读取缓冲的数据。当 reduce worker 读取了所有中间数据后,它会按照中间键对数据进行排序,这样所有相同的事件就会被分组在一起。(注意:如果中间数据量太大而不适合内存,则使用外部排序)
  6. reduce 工作器遍历排序后的中间数据,对于遇到的每个唯一的中间键,它会将该键和相应的一组中间值传递给用户的 Reduce 函数。reduce 函数的输出被附加到这个 Reduce 分区的最终输出文件中。
  7. 当所有的 map 任务和 reduce 任务完成后,主机唤醒用户程序。此时,用户程序中的 MapReduce 调用返回到用户代码。

执行注意事项:

  • 成功完成后,MapReduce 执行的输出可以在 R 输出文件中获得。
  • 为了检测故障,主服务器会定期 pings 每个工作线程。如果在某个点之后没有工作者响应,则该工作者被标记为“失败”,并且该工作者的所有先前任务工作被重置,以变得有资格在其他工作者上重新调度。
  • 发生故障时,会重新执行已完成的映射任务,因为它们的输出存储在故障机器的本地磁盘上,因此无法访问。完成的 reduce 任务不需要重新执行,因为它们的输出存储在全局文件系统中。

MapReduce 示例

我将用几个程序示例来结束本文,这些程序可以很容易地表示为 MapReduce 计算,并有助于描绘 M/R worker 进程的画面:

Distributed Grep — 如果匹配到一个模式,Map 函数会发出一条线。reduce 函数是一个恒等函数,它只是将提供的中间数据复制到输出中。

***URL 访问频率统计—*map 函数处理网页请求日志,输出 < URL,1 > 。reduce 函数将同一 URL 的所有值加在一起,并发出一个 < URL,total count > 对。

反向网络链接图— 映射函数为每个链接输出 <目标、源> 对,这些链接指向在名为“源”的页面中找到的目标 URL。reduce 函数连接与给定目标 URL 相关联的所有源 URL 的列表,并发出一对: < target,list(source) >

每台主机的术语向量— 术语向量将文档中出现的最重要的单词概括为一列 <单词、频率> 对。map 函数为每个输入文档发出一个 <主机名,术语向量> 对(其中主机名是从文档的 URL 中提取的)。reduce 函数被传递给给定主机的所有每个文档的术语向量。它将这些术语向量加在一起,丢弃不常用的术语,并发出最终的 <主机名、术语向量> 对。

倒排索引—**map 函数解析每个文档,发出一个序列的 < word,document ID > 对。reduce 函数接受给定单词的所有对,对相应的文档 ID 进行排序,并发出一个 <单词,列表(文档 ID > 对。所有输出对的集合形成了一个简单的倒排索引。也很容易增加这个计算来跟踪单词的位置

冶金学家预测 NBA 球队成功的方法

原文:https://towardsdatascience.com/a-metallurgical-scientists-approach-to-predicting-nba-team-success-4bfa7b2bd6a7?source=collection_archive---------5-----------------------

彼得·蔡博士

由于我是博客社区的新手,请允许我介绍一下我自己。我是一名训练有素的冶金科学家,很难认为自己是一名专业的体育分析师。然而,在我内心的书呆子成长为完全成熟之前,我已经是一个忠实的篮球爱好者(包括打球和观看),并且作为一个技术领域的积极研究者,我通常倾向于通过创造性思维和定量分析从可用数据中发现新的见解。因此,下面的故事详细介绍了几个月的随机研究结果,试图回答我脑海中一个简单但反复出现的问题:篮球队的胜率在多大程度上反映了其球员的表现统计数据和比赛风格?

冶金研究界的一个普遍观点是,合金的性能与其化学组成或成分密切相关。例如,两种合金可能包含完全相同的类型的原子种类,但是由于它们的化学成分的平衡不同,它们的测量属性有很大不同。打个篮球的比方,我的假设的基本假设是,所有活跃在 NBA 的球员都可以根据他们在场上活动的共同相似性被分成有限数量的不同类别。如果大体上是真的,那么每支球队的名单就可以根据组成球队的球员类型来明确地描述。就像工程合金的化学成分决定了它的结构属性一样,我假设一个团队的球员构成应该反映它的获胜成功率。

眼前的挑战是找出如何具体定义这些“所谓的”玩家类别。最明显的分组就是篮球中的五个位置: PGSGSFPFC 。通常,一个球队的质量是通过一个球员名单的“深度”来评估的,这个“深度”是指占据每个位置的球员数量。不幸的是,传统的位置缺乏特异性,因为它们不能充分描述现代游戏中球员的进攻风格,在现代游戏中,角色可能有很大的重叠。例如,勒布朗詹姆斯正式成为一名小前锋,但像一名控球后卫一样,比传统的中锋更好地控制局面。另一方面,凯里·欧文是得分后卫,但打得更像得分后卫。最近几年,我们也引进了所谓的“延伸 5”,像布鲁克·洛佩斯这样的中锋,他们可以在内线投球,也可以游走到外线,以意想不到的效率投篮。让我们不要忘记凯文·杜兰特,一个 7 英尺高的小前锋,但拥有令人印象深刻的后卫般的技能。

对比赛风格更准确的描述是累积击球图表,这是一个赛季中在球场上尝试击球的所有位置的 x-y 图。利用各种 Python 库中的工具,我能够从网上抓取 2010 年至 2016 年间所有 NBA 球员的投篮数据。虽然数据的原始来源是 stats.nba.com,但因为包含拍摄图表信息的 API 最近变得无法访问,所以我从可靠的第三方网站www.nbasavant.com 间接获得了相关数据。为了说明投篮图表中包含的其他见解,请参见下面提供的勒布朗·詹姆斯和扎克·兰多夫过去一个赛季的图表。

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

显然,勒布朗·詹姆斯似乎更喜欢从篮筐的左侧(从球员的角度来看)投篮,而扎克·兰多夫更喜欢从另一侧投篮。这个观察相当有趣,因为伦道夫是左撇子,而詹姆斯是右撇子,这使得他们的倾向有些反常。由于球员之间的射门量不同,为了根据相似的射门图表模式有效地比较球员,我通过将数据的二维直方图与尝试的投篮总数归一化,将每个射门图表转换为热图。请看下面的例子,在过去的一个赛季中,联盟中几位杰出球员的 25 x 47 热图。

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

接下来是机器学习的魔力。我首先将每个玩家的 25 x 47 热图展开成 1 x 1175 个特征向量,然后将它们堆叠起来,创建一个数据矩阵,每行数据代表一个特定的玩家。平均每场比赛投篮不到一次的球员被排除在外,因为他们的累积投篮量不足以产生一个准确描绘他们投篮倾向的地图。然后,我继续应用一种经过试验但真正无监督的学习算法,K-means 聚类,将数据矩阵中相似的行/玩家分组在一起。使用“肘技术”,决定了球员可以根据他们的拍摄模式分为 7 类。7 个组的代表性质心是通过平均属于一个组的所有球员的击球图表创建的,如下所示。

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

看着这些图片,可以说有些群体并没有太大的不同。例如,组 2、组 3 和组 7 都由主要在内线活动的玩家组成,属于组 2 的玩家是否真正不同于组 3 的玩家是值得怀疑的。作为健全性检查,我根据组标签重新组织了累积数据矩阵中的所有行,并可视化了它的图像表示,如下所示。为了视觉上的清晰,超出半场线的不必要的数据被剪掉,因为“空白”背景对所有球员来说几乎是一样的。

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

盯着数据矩阵足够长的时间,你可以说服自己,聚类算法识别的 7 组球员实际上是彼此不同的。在成功地对球员进行分类之后,每支球队的组成可以通过 7 维“组成”向量来具体描述,属于一个组的球员人数作为向量的相应特征。例如,勇士队的组成向量为[4,3,1,1,3,2,0],这意味着其 2016-2017 年的球员名单由 4 名属于第 1 组的球员,3 名属于第 2 组的球员,1 名属于第 3 组的球员组成,…你明白了。再次提醒,平均每场比赛投篮次数少于一次的球员被排除在分析之外,所以名册的实际大小可能略大于组合向量的总和。然后,通过将 30 支球队中的每支球队的组合向量一个接一个地堆叠起来,来编译 30×7 的球队组合训练集,并且使用简单的线性回归模型来评估每一类球员相对于其对球队胜率的贡献所承担的“权重”:

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

通常,将一组训练示例(在我们的例子中是团队组成向量)分成训练集、交叉验证集和测试集被认为是一种良好的做法,以便确保模型的泛化,防止过度拟合,并避免潜在离群值的不良影响。由于团队组成数据集相对较小,仅包含 30 个训练示例,因此我使用了不同的方法来优化模型。对 24 个小组的随机子集进行线性回归,记录得到的拟合系数,包括截距值。这个过程重复了很多次,直到所有试验的平均拟合系数收敛到“最佳”值。

奇怪的是,简单的回归分析表明,第 2 组和第 6 组(最大的正系数)的球员对球队的成功贡献最大,而第 4 组和第 7 组(负系数)的球员对球队获胜的机会没有任何帮助。下面是回归模型的预测胜率图,通过团队组成矩阵和拟合系数之间的内积计算得出,与所有 30 个团队的实际胜率相比。

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

红线表示完美的可预测性,点的显著分散表明模型远非理想。然而,预测胜率和实际胜率之间的 R 平方值 0.49 并不是微不足道的,这证实了射击模式至少是团队成功的一个重要因素。

也许上述预测模型最明显的不足是完全没有考虑到玩家的表现指标。毕竟,获胜只需要一支球队比他们的对手得分更多,不需要火箭科学家告诉你,最好的球队也会有最好的得分手和防守者。类似于上面描述的分析方法,我再次应用 K-means 算法来识别独特的球员群体,这一次是基于从 stats.nba.com 获得的 16 类传统球员统计数据而不是射门图。这些包括比赛次数、上场时间、得分、投篮次数、投篮次数、三分球次数、三分球次数、罚球次数、罚球次数、进攻篮板、防守篮板、助攻、失误、抢断、盖帽和个人犯规。该算法成功识别了 8 个不同的玩家组,下面显示的是 jet 配色方案中 16 x 486 累积数据矩阵的彩色表示,根据组标签排序。深蓝色表示统计类别中的最低值,深红色表示最高值。

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

从图像中可以立即注意到几个有趣的细节。第二组包括大量几乎在每个统计类别都很低的玩家;这些多是被贬到替补席的“默默无闻”的球员,希望能被插入轮换阵容。与之形成鲜明对比的是,第 5 组的球员代表了目前超级巨星的上层梯队:拉塞尔·维斯特布鲁克、詹姆斯·哈登、伊塞亚·托马斯、德玛尔·德罗赞、达米恩·利拉德、德马库斯·考辛斯、勒布朗·詹姆斯、科怀·伦纳德、斯蒂芬·库里、凯文·杜兰特、吉米·巴特勒、约翰·沃尔、凯尔·洛瑞、埃里克·布莱索。有趣的是,这一组包括了过去一个赛季所有提议的和官方的 MVP 候选人,证明了该算法客观地识别联盟最佳球员的能力,其中一些球员,如埃里克·布莱索,由于球队表现不佳或赛季结束受伤而被忽视。第七组包括联盟中著名的大个子:安东尼·戴维斯、卡尔-安东尼·唐斯、扬尼斯·阿德托昆博、乔尔·恩比德、克里斯塔普斯·波尔津吉斯、拉马库斯·阿尔德里奇、哈桑·怀特塞德、尼古拉·约基奇、尼古拉·武切维奇、迈尔斯·特纳、鲁迪·戈贝尔、安德烈·德拉蒙德、德怀特·霍华德和迪安卓·乔丹。同样,有趣的是,根据流行的看法,名单中的一些球员并不被认为是全明星级别的,即使他们的表现数据表明并非如此。

像以前一样,我继续对基于统计的团队组成矩阵的随机子集应用迭代线性回归。不出所料,拟合系数的值显示,上一段中讨论的第 5 组和第 7 组对团队的成功贡献最大。下面显示的是预测胜率与实际胜率的散点图,预测值由基于统计的回归模型的拟合系数计算得出。

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

关于这些结果没有太多可说的,只是第二个回归模型的可预测性与第一个模型不相上下。为了改进模型,我尝试了一个“愚蠢”的简单方法,将第一个合成矩阵与第二个合成矩阵合并成一个 30×15 的矩阵;简单的理由是,由于投篮命中率和表现统计都是球队成功的重要因素,也许结合两者的回归模型会导致预测准确性的提高。

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

事实上,混合回归模型的预测胜率之间的相关性明显好于前两个模型,其 R 平方值为 0.71,RMSE 误差为 0.07。

进一步改进该模型的一个可能的方法是通过合并说明一个组中每个玩家的独特性的信息。回想一下,在团队组成向量的创建中,特定组中的玩家被认为是彼此无法区分的;勒布朗·詹姆斯对一支球队的价值被认为和德马库斯·考辛斯一样。换句话说,即使在一个给定的组中的玩家之间有轻微的差异,这些差异也被分析方法忽略了。

我得出的解决方案是用一个给定玩家到群体质心的相对“距离”来评估这个玩家对所有群体的贡献。也就是说,如果将组形心想象成不同的颜色,每个玩家将被表征为所有颜色的部分混合,而不是采用最近形心的绝对颜色。玩家的数据表示越像特定的质心,它对该组的贡献就越大;相反,远离质心的玩家对相应组的贡献很小。由此可见,玩家到质心的距离 d 的倒数可以作为接近度的定量度量,并且玩家对组 i 的分数贡献可以由以下表达式给出:**

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

使用该策略,构建了新的 30×15 团队组成矩阵,并再次应用线性回归来计算模型的新拟合系数。令人惊讶的是,新模型的预测结果乍一看并没有显示出明显的改善(R 平方= 0.71,RMSE 误差为 0.07),即使每个队的组成向量现在更准确地描述了其组成球员的个性。为了比较,下面是两个混合回归模型的“预测与实际”图。

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

尽管为两个模型计算的 R 平方值几乎相同,但对图的进一步观察表明,新模型中绘制的数据点的分布更加结构化。例如,右边图中的淡蓝色线是“完美可预测性”趋势线的变化版本。注意它们与数据点的重叠程度;本质上,这表明了超额预测的胜率都偏离了实际胜率几乎相同的量(~ +0.10),对于预测不足的胜率团队也是如此(~ -0.07)。对这些观察结果的合理解释是,也许所有被高估或低估的球队都有不可忽视的相似之处(例如,球员受伤、赛季中期名单变化、教练、团队化学等)。)是新模型没有考虑到的。然而,确认是否如此需要进一步的分析,这超出了本初步研究的范围。

因为本研究中的回归模型是建立在团队组成决定成功的基本概念之上的,所以它有可能被用作建立成功 NBA 球队的指导工具。假设一名球员的表现统计数据和特征投篮图表可以从一个球队转移到另一个球队,该模型可以提供一个相当不错的潜在收购对球队获胜机会的直接影响的定量估计。据我所知,我可能是错的,整个联盟管理层的团队重组决策仍然主要植根于人类的直觉和传统智慧。我并不是建议球探和人类的直觉应该被计算模型所取代,但我个人认为,NBA 的名册建设工作肯定可以受益于比现在更受数据驱动。

一个没有时间的头脑:对向阿尔茨海默病转化的分类

原文:https://towardsdatascience.com/a-mind-without-time-classifying-the-conversion-to-alzheimers-disease-1a5c6079bb91?source=collection_archive---------12-----------------------

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

这是我在跳板数据科学职业生涯的第一个顶点项目的总结。

由于我的背景是脑科学,我想从事与我的专业领域相关的机器学习工程。令人欣慰的是,许多伟大的科学家和医生已经投入了大量的工作,使大量关于阿尔茨海默病(AD)的数据公开和可访问。我在这个项目中使用的数据集来自阿尔茨海默病神经成像倡议(ADNI),主要由南加州大学神经成像实验室(LONI)管理。这不是唯一一个公开的关于 AD 的数据集,但它似乎包含了我认为与识别有患 AD 风险的人相关的最多样化的变量集。

我从 ADNI 检索到的数据集包括已知在某些方面与 AD 相关的变量。其中包括:

  • 年龄和性别等人口统计信息
  • 相关认知评估的分数
  • 大脑区域体积和皮质厚度的估计
  • 脑功能活动的测量
  • APOE4 等位基因的存在

研究的基本原理

我查阅了已发表的关于 AD 分类的文献,发现大多数研究都专注于使用特定的数据类型,无论是认知评估还是基于 MRI 的测量。很好,最近对这些研究的综述是 多变量数据分析和阿尔茨海默病的机器学习,重点是结构磁共振成像

虽然确切的指标和评分标准因研究而异,但使用 MRI 特征的方法通常以 68-75%的准确度将转换器与非转换器进行分类。使用多模态特征集的性能更好,以 68–82%的准确度分数将转化者与非转化者进行分类,我观察到的最高准确度分数是 91.5% 在专门对转化为 AD 的 MCI 患者进行分类时。考虑到一些基准,我接下来概述了我的研究用例。

目标受众和使用案例

这项研究的主要目标受众是医疗保健提供者。结构和静息态功能磁共振成像是最简单和最快的大脑成像方法之一。使用它们对处于危险中或患有 AD 的人进行分类将有助于提供早期干预和针对性治疗。重要的是,能够准确地对有转化为阿尔茨海默病风险的人进行分类也将允许医院在资源稀缺时优先考虑用于预防的资源。

作为科学家,另一个目标受众是学术界。这是我写这些论文和博客的很大一部分原因。正如牛顿的名言

如果说我看得更远,那是因为我站在巨人的肩膀上

我能在这么短的时间内,只用我的笔记本电脑完成这项研究的原因是因为研究社区的存在,他们推动数据和数据分析向所有人开放和开放。如果没有 ADNI 或 Sci-Kit Learn 的开发人员,将会有一个人无法合理完成的大量工作。我坚信科学最好是在开放的环境中进行,方法、代码和数据都可以向其他人公开。在我看来,这大大加快了集体知识和对世界以及我们在其中的位置的理解的速度。

在接下来的部分中,我将概述我在这项研究中采取的具体步骤,如果您想自己运行它(我强烈建议这样做),可以链接到代码和数据。如果你只对研究结果感兴趣,直接进入第三步。

第一步:数据争论

无论好坏,数据争论是数据科学的核心,通常需要大量的时间投入。当数据集对您来说很陌生时尤其如此,因为您需要了解您正在处理的变量、它们之间的潜在关系、它们与您正在解决的特定问题的关系,以及需要对它们做些什么才能使模型构建成为可能。

我采取的所有数据争论步骤都包含在这个 Jupyter 笔记本中。注意,所有的编码都是用 Python 完成的。简而言之,我采取的步骤是:

  • 重命名列,使它们更容易理解和理解
  • 从主数据帧中提取感兴趣的列
  • 将主数据框与包含 fMRI 测量的数据框合并
  • 记录缺失值
  • 删除或估算缺失值
  • 将时间序列列减少到具有感兴趣的测量的患者就诊
  • 处理诊断变更栏中的缺失值
  • 识别并清除诊断更改列中的重复条目

清理后的数据帧在这里可用。

步骤 2:探索性数据分析

像数据争论一样,一个好的 EDA 是数据科学工作流程的重要组成部分。这是你开始理解其中的数据和模式的机会,也是你开始讲述背后的故事的机会。我们通常带着特定的假设/问题来处理数据集,一个有洞察力的 EDA 将显示为什么该假设是重要的,但也可能揭示与假设/问题相关的有趣方面,这些方面可能无法从我们的直觉和领域专业知识中获得。

这方面的一个例子是我在 EDA 期间做的一些功能工程。当观察不同诊断组(即 AD、认知正常、早期轻度认知障碍、晚期轻度认知障碍、显著记忆问题)的认知评估得分之间的关系时,我注意到两种易于使用的认知评估之间的相关性随着认知障碍的严重程度而变化。

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

Correlation matrices showing the relationship between scores on different cognitive assessments broken down by diagnosis type

这些图中有两个要点需要注意。首先,如果我们只看整个组内的关系,数据中有趣的模式会被掩盖。第二,测试分数之间的相关性随着诊断类型的不同而变化。在 AD 患者中,CDRSB 和 ADAS13,以及 MMSE 和 MOCA 之间存在高度正相关。这些相关性在晚期 MCI 患者中有些明显,在 CDRSB/ADAS13 相关的情况下,在认知正常的人群中呈负相关。为了进一步研究这一点,我创建了一个新的特征向量,它采用了 CDRSB 和 ADAS13 之间的得分差异。这只是特征工程捕捉这方面数据的一种方法,但正如我们稍后将看到的,这是将转化为 AD 的患者与未转化为 AD 的患者进行分类的一个重要特征。

完整的 EDA 在这个 Jupyter 笔记本中可用,用于建模的最终数据帧是这里的。请注意,我使用这个 EDA 作为学习伟大的 plotly 可视化库的机会。虽然我没有在离线模式下编码所有的情节,所以笔记本没有渲染所有的情节。你可以下载相关的eda.html文件,看看他们辉煌的剧情。

老年痴呆症患者的画像

虽然没有大量的人口统计信息,但观察典型的 AD 患者是什么样子还是很有趣的。

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

Demographic information for patients with Alzheimer’s Disease at baseline

正如我们在图中看到的,基线时 AD 患者的平均年龄大于其他诊断组,男性,受教育程度较低且已婚。

皈依者与非皈依者

虽然注意到典型的 ad 患者是什么样子是很有趣的,但我的目标是对有转化为 AD 风险的人进行分类,而不是对那些在基线访问时患有 AD 的人进行分类。下图显示了在研究的某个时间点转化为 AD 的患者的人口统计学信息。

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

Demographic information for patients that convert to Alzheimer’s Disease during the study

不足为奇的是,典型的转化者被诊断为晚期轻度认知障碍而进入研究。这是因为轻度认知障碍,尤其是晚期轻度认知障碍,被认为是功能正常的人和被诊断为 AD 的人之间的中间步骤。此外,他们通常是男性,平均年龄较大,有大学学位,已婚,不是西班牙裔/拉丁裔。

EDA 包含大量信息,因为数据集非常大,并且包含许多不同的要素和要素类别。我通过它们找出了认知正常、轻度认知障碍和 AD 之间的区别。这是通过将数据中的趋势可视化,以及主要使用事后检验的 ANOVAs 进行一些统计推断来完成的。

步骤 3:模型评估和优化

在 EDA 之后,我决定在训练模型时使用一组精简的特征,以便最大化训练/测试集中的数据点。显示诊断类型之间差异并记录大多数患者就诊的主要特征类别是人口统计学信息、认知评估得分(不包括 MOCA)、海马和内嗅皮层的体积估计以及 APOE 突变的存在。其他特征记录得更少,将它们包含在训练集中意味着要处理大量缺失数据或丢弃大量观察值。参见下一步的最后一节,了解我打算如何处理这里没有包括的特性。

用于模型评估和优化的 Jupyter 笔记本可在这里获得。请注意,笔记本中有两个主要功能,您可以在自己的工作流程中复制和使用。这些功能允许您训练、优化和评估不同的分类器。

我的基本管道是这样的:

  1. 提取特征值和目标标签
  2. 将数据集分为训练集(75%)和测试集(25%)。请注意,这是一个分层的分离,以保持训练/测试集中转换者与非转换者的比例。这在这样的情况下是很重要的,因为这里有不止一个目标类(这里是非皈依者)。
  3. 缩放非二进制数据
  4. 使用网格搜索交叉验证优化超参数
  5. 评估模型

为了评估这个模型,我考察了三个指标。

  1. 测试集的准确度分数
  2. ROC 曲线下面积
  3. 平均精度

我还绘制了 ROC 和 precision-recall 曲线,以便更好地了解性能。

笔记本显示了四个模型的结果:逻辑回归、随机森林、XGBoost 和支持向量机。我建议把它们都记下来,看看它们的表现有什么不同。现在,我将关注 XGBoost 模型,因为它在三个评估指标中表现最好。

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

Performance of XGBoost model on classifying coverts from non-converts

如果你以前看过这些图,你会发现这个模型在对转化为 AD 的人进行分类方面做得非常好。ROC 曲线绘制了真阳性率(被归类为转化为 AD 的患者,他们在研究期间确实转化为 AD)与假阳性率(被归类为转化为 AD 的患者,他们实际上并未转化为 AD)的对比图。精确回忆曲线的工作原理略有不同。精度是真阳性率除以真阳性率加上假阳性率。这告诉你分类器在标记真正皈依者时有多精确。召回率是真阳性率除以真阳性率加上假阴性率,假阴性率表示被归类为非皈依者的患者实际上皈依了。这是这项研究的一个重要指标,因为分类器的用例是帮助识别应该接受早期干预和预防性护理的患者。在这个用例中,向不太可能转化的人提供这些资源(误报)比不向可能转化的人提供这些资源(误报)要好。

总的来说,模型表现得非常好。请记住,它所做的是将一个人分类为在未来某个时间转换为 AD 或不转换。评估指标包括:

  • 测试数据的准确率为 92.1%
  • 测试数据的 ROC 曲线下面积:0.975
  • 平均精度:0.787

准确性分数比我在《将皈依者与非皈依者进行分类》中看到的有了很大的提高,并且在将 AD 患者与认知正常的个体进行分类的更简单的任务上也有相似的准确性分数。但是,该模型也过度拟合了训练数据,准确率为 100%。

为了了解不同的特性是如何对模型产生影响的,我根据它们的重要性分别绘制了图表。

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

Feature importance in final model

虽然这只是评估特征如何影响分类模型的一种方式,但它提供了模型如何区分转换者和非转换者的初步观察。主要特征是年龄,ADAS13 和 CDRSB,海马和内嗅皮层的体积估计,以及 APOE4 等位基因。有趣的是,基线诊断并不重要。

后续步骤

首先,我只评估了一组精简的特性。数据集中有更多的可用数据,但这是以丢失数据增加为代价的。合乎逻辑的下一步将是训练包括其他特征类别的新模型,并观察它们与基线模型相比如何。

第二,为了处理过度拟合,我正在考虑做一些功能工程,以包括更多的功能(一个例子是在基线模型中包括功能之间的交互),并调整交叉验证用于优化模型的得分度量。

第三,该模型目前表明一个人是否在某个时候有转化为 AD 的风险。预测转换的时间框架是可能的。这不会影响评估和转化为 AD 之间的时间,但会提示对资源有限的医院或护理人员有用的预防性治疗的紧迫性。

还有其他潜在的下一步,虽然这些对我来说是唾手可得的。我希望你喜欢这个概述,并学到了一些新的东西。如果您对研究有任何疑问,请联系我。

德鲁·康威数据科学维恩图的一个修正

原文:https://towardsdatascience.com/a-modification-of-drew-conways-data-science-venn-diagram-d5ba93037e1a?source=collection_archive---------5-----------------------

在大会上我们的数据科学沉浸式项目的第一周,我们的一位讲师马特·布雷姆斯展示了德鲁·康威著名的维恩图

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

Drew Conway’s Data Science Venn Diagram

Brems 解释了每个圆圈以及交叉点,并强调了危险区域。以下是他对那个十字路口的人的体验:

我亲眼看到人们处于“危险地带”。“这些人对他们应用数据科学的现实世界问题有着非常扎实的理解,并且拥有出色的编程技能——甚至使用涉及统计的库或函数。因为这些人所拥有的技能,他们知道一种特定的建模技术可能被设计来解决现实世界的问题,并且可以利用他们的 Python(或 R,等等)。)实现它的技巧。但是,不会弹出错误消息警告用户建模技术的假设不合理或者数据没有正确缩放。在许多情况下,所发生的是正在建立的模型类型依赖于不满足的假设。因此,这些模型可能无法准确反映真实发生的情况,因此使用这些模型来更好地了解世界或解释一些现实世界的现象可能是不合适的。虽然分析通常是出于好意,但是仅仅因为 Python 能够给你一个结果并不意味着它是有意义的。当有人对一个可能误导的结果采取行动时……嗯,这就是为什么“危险区”——不理解建模背后的统计数据——会如此危险。”

康威对处于危险地带的人也有类似的看法,但他也认为恶意可能是这个十字路口的一些人的动机:

“在这个领域,完全有能力提取和构建数据的人,可能与他们相当了解的领域有关,甚至可能知道足够的 R 来运行线性回归并报告系数;但是他们对这些系数的含义缺乏理解。“谎言、该死的谎言和统计数据”这句话就是从图表的这一部分发出的,因为不管是出于无知还是恶意,这种技能的重叠让人们有能力做出看似合理的分析,而不知道他们是如何做到这一点的,也不知道他们创造了什么。”

我理解 Brems 和 Conway 的想法,但是危险区域不应该成为那些拥有编程技能和领域知识但缺乏数学技能的人的默认标签。是的——这个地区的人们有可能遇到危险,但前提是他们在没有适当的数学或统计学知识的情况下试图做出统计推断。然而,处于危险区域的人可以为分析/数据科学团队做出巨大贡献。我这样说是因为这是我过去几年工作的领域。

数据项目管理

我以前的工作是管理劳联-产联的会员数据。AFL-CIO 是一个工会联合会,每个工会都有一份成员名单。我们的分析团队需要一份准确的成员名单,以便他们可以创建各种模型,并根据该名单进行投票。

这项任务要求我作为项目经理与客户组织的 IT 部门合作,以确保他们及时提交成员文件。美国劳联-产联有数百万成员,我不仅需要了解数据应该是什么样子,还需要有黑客技能,能够对数据进行适当的探索性分析。

这是至关重要的,因为如果客户联盟在他们的数据上犯了一个错误,例如丢失了三分之一的文件,丢失了一个字段,或者交换了名字和姓氏等字段,这可能会对我们的程序产生负面影响。尽管这些错误不一定是我的错,但我要对它们负责——责任在我。我需要保持警觉,准备好抓住这些错误,并为客户提出解决方案。

尽可能提高这一过程的效率也很重要。许多客户希望在文件从他们的数据库中出来时就交付文件。我必须指导许多客户以标准格式提交数据,以简化流程,这需要与这些 it 部门建立关系。

他们说数据科学 80%是清洗数据,只有 20%是分析。向我们的分析团队交付我们的会员文件是我热衷的事情,因为这使他们能够进行他们拥有技能的更高层次的分析。

描述性分析

除了每个客户的 IT 部门,我还与每个组织的政治主管建立了关系。劳联-产联提供的一项关键服务是为劳工运动共享政治资源,这就是为什么政治指导者是重要的利益相关者。

尽管一些政治指导者可能对进入模型构建的杂草感兴趣,但许多人想要他们的数据的肉和土豆。我管理的成员更新过程的一部分是向他们的成员添加政治数据字段。

我开发了可复制的报告,这些报告将在会员更新周期结束时为每个会员生成,这些报告将告诉政治主管他们的工会成员中有多少人是注册选民,他们注册了哪个政党,他们在哪些选举中投票,等等。

这些报告对数学的要求都不比计算或生成百分比的能力更高。然而,这些报告得到了广泛的赞赏,因为我用我的领域知识和黑客技能创造了一个这些关键利益相关者想要的产品。

我并不是说我们的分析团队不能做同样的工作,但这项工作会有机会成本。由于我负责数据采集、增强和向附属机构报告关于其会员资格的描述性统计数据,我们的分析团队可以更加专注于分析会员和投票者数据,以帮助推动我们组织的战略。

数据支持:黑客和领域知识的交集

事实是,任何一个极端的十字路口都可能是危险地带。处于领域知识和数学技能的交叉点,但不会编程的人将总是被 Excel 电子表格提供的百万记录限制所限制。如果有人处于黑客技术和数学技能的交叉点,但不具备他们行业的领域知识,他们可能会提出一个理论上很好的建议,但由于他们行业的现实,这个建议是站不住脚的。

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

Data Support: The Intersection of Hacking Skills and Substantive Expertise

尽管我不是我们分析团队的成员,但以上是我为支持他们的工作所做贡献的例子。这种关系之所以有效,是因为我没有试图扮演数据科学家。我没有尝试运行回归、神经网络或决策树,并以某种方式、形状或形式使用它来影响我们组织的战略。然而,我总是钦佩他们的工作,因此我现在在大会上提高我的数学技能。

分析和数据科学团队应该寻找符合这些技能的人。站在这些人的肩膀上,他们可以专注于分析,以帮助他们的组织取得成功。

一种求解聚类问题的改进人工蜂群算法

原文:https://towardsdatascience.com/a-modified-artificial-bee-colony-algorithm-to-solve-clustering-problems-fc0b69bd0788?source=collection_archive---------6-----------------------

Python 中的分步实现。

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

Image credit: https://www.wikipedia.org/

在我的上一篇文章中,我已经介绍了我们如何通过实现一个叫做人工蜂群(ABC)群体智能(SI) 算法来解决现实世界的优化问题。

现在是我们接触一些真实数据并解释如何使用 ABC 算法的 Python 实现来执行聚类任务的时候了。但在此之前,让我们更深入地了解一下集群问题

聚类问题

聚类问题是一个非明确定义的 NP-hard 问题,其基本思想是在我们的数据中发现隐藏的模式。对于什么是集群并没有正式的定义,但是它与以这样一种方式对元素进行分组的想法相关联,即我们可以区分不同组中的元素。

有不同系列的算法以不同的方式定义聚类问题。在文献中经常看到的定义聚类问题的经典方法是将其简化为一个数学问题,称为寻找原始数据的 k 划分

寻找集合 Sk-划分 ,被定义为寻找 Sk 子集,它遵循两条规则:

  • 这些子集的任何不同子集的交集等于空集。
  • 所有 k 子集的并集等于 S.

基本上,在这个划分聚类过程的最后,我们希望找到原始数据集的不同子集,这样,没有一个实例属于一个以上的组。下图说明了这一点:

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

On the left the original data, on the right the partitioned data with k=2.

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

An example of how centroids can be used to perform a data partition with k=2.

我们如何分割数据来执行上图所示的分区?嗯,聚类过程的输出是一组质心。质心基本上是每个组的代表实体,所以如果我们想要我们的数据的一个*,那么我们将有 k 质心。*

质心也是由我们的数据定义的搜索空间上的点,由于每个质心定义一个组,每个数据点将被分配到离它最近的质心。

修改人工蜂群进行聚类

好了,现在我们知道什么是聚类问题,我们如何修改原始的 ABC 算法来执行这样的任务?你猜怎么着,我们没有!是的,这就是你刚刚读到的,我们根本不需要修改我们的 ABC 实现。我们唯一要做的就是关注集群问题,并将其转化为优化任务!但是我们怎么做呢?

正如我们在上一篇文章中看到的,一个定义良好的优化问题需要一个搜索空间,一组 d 维输入决策变量和一个**目标函数。如果我们将人工蜂群中的每只蜜蜂视为聚类问题的整体解决方案,那么每只蜜蜂可以代表一组完整的候选质心!如果我们在一个 d 维空间上工作,并且我们想要在我们的数据集上执行一个 k 分区,那么每只蜜蜂将是一个kd 维向量!****

厉害!既然我们已经定义了如何表示我们的输入决策变量,我们只需要弄清楚如何定义我们的搜索空间的边界以及什么将是我们的目标函数。

我们的搜索空间的边界很容易,我们可以用[0,1]区间归一化我们的整个数据集,并将我们的目标函数定义为具有从 0 到 1 的边界。搞定,就这样。现在让我们进入更复杂的部分:如何定义我们的目标函数?

划分聚类方法中,我们希望最大化两个不同组之间的距离,最小化一个组内的内部距离。文献中使用了几个目标函数,但最广为人知和使用的是**【SSE】****。**

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

Formula for the Sum of Squared Errors. Don’t be afraid, is not that scary.

这个公式是什么意思?嗯, 误差平方和(SSE) 是一个聚类度量,背后的思想很简单。它基本上是一个数值,计算数据中每个实例到其最近质心的平方距离。我们优化任务的目标是最小化这个函数。

我们可以使用我们之前的目标函数框架来实现如下的 误差平方和 :

用真实的数据动手

是时候用一些真实的数据来测试我们的 ABC 聚类算法的性能了。对于这个研究案例,我们将使用众所周知的 虹膜数据集

这是一个原始的 4 维数据集,包括三种植物的特征。出于可视化的目的,我们将只使用这个数据集的两个维度。让我们检查该数据集的第二维度和第四维度之间的关系:

上面代码的输出如下所示:

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

The original data distribution.

由于我们将使用该数据作为基准测试,我们已经知道它的最优分割是什么,以及它由三种类型的花的原始分布给出。我们可以用下面的 Python 代码来可视化 虹膜数据集 的原始最优分区:

其中绘制了以下分布:

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

The original groups within our dataset

既然我们已经知道了这个样本数据的原始最优分区是什么,那么是时候看看我们的 ABC 算法是否能够找到这个问题的非常接近的解决方案了。我们将使用我们的 误差平方和 目标函数,并将分区数量设置为三。

由于初始化是随机的,很可能生成的质心的顺序与类的顺序不匹配。因此,当绘制 ABC 算法的输出时,各组的颜色可能不匹配。这并不重要,我们真正要看的是对应的分区组看起来有多好。

我们的 Python 代码的输出如下所示:

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

The partition of our dataset found by the ABC algorithm.

哇,太棒了!如果我们看一下原始分区和由我们的 ABC 算法生成的分区,我们可以看到它能够找到一个真正接近最优的分区。这证明了“改进的”ABC 聚类算法是多么强大。我们还可以通过查看 ABC 算法的optimality _ tracking属性来了解优化过程是如何进行的:

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

正如所料,ABC 算法在最小化 SSE 目标函数方面非常有效。我们可以看到群体智能拥有一些解决优化问题的强大机器,将这些算法用于解决现实世界的问题只是我们如何将这些问题转化为优化任务的问题。

参考

  • 一种新颖的聚类方法:人工蜂群算法——德尔维斯·卡拉博加,塞拉尔·厄兹图尔克
  • 一种采用协同人工蜂群算法的聚类方法 —邹文平、、陈汉宁、
  • 人工蜂群算法及其在数据聚类中的应用综述 — Ajit Kumar,Dharmender Kumar,S. K. Jarial
  • 一种用于聚类的两步人工蜂群算法 — Yugal Kumar,G. Sahoo

下一步是什么?

我们已经通过实现人工蜂群算法简单介绍了群体智能,以及如何用它来解决一些有趣的问题比如优化实函数,如何“修改”ABC 算法来解决聚类问题。

这些算法有大量的应用,如图像分割、人工神经网络的训练、数字图像处理和模式识别、蛋白质结构预测等等。还有一些其他强大的群体智能(SI) 算法,如粒子群优化(PSO)鱼群搜索(FSS) ,它们也是非常众所周知的技术,并有一些有趣的应用。

敬请期待下一章!

一种新的深度神经网络

原文:https://towardsdatascience.com/a-new-kind-of-deep-neural-networks-749bcde19108?source=collection_archive---------2-----------------------

作者阿尔弗雷多·坎齐阿尼、阿比舍克·乔拉西亚和尤金尼奥·库勒西略

又有新一波深度神经网络来了。它们是前馈模型的演变,我们之前详细分析过。

这种新型神经网络是最初的前馈模型lenet 5/Alex net及其衍生模型的进化,包括比ResNet/Inception更复杂的旁路方案。这些前馈神经网络也被称为编码器、,因为它们将图像压缩和编码成更小的表示向量。

新一波神经网络有两个重要的新特征:

  • 生成分支:也称为解码器,因为它们将一个表示向量投射回输入空间
  • 重现层:将先前时间步的表示与当前时间步的输入和表示相结合

太好了!但是这种增加的复杂性能为我们做什么呢?

原来传统的前馈神经网络有很多局限性:

1- 无法精确定位:由于较高层中的下采样和空间分辨率损失,特征/对象/类别的定位受损

2- 无法对场景进行推理:因为他们将图像压缩成一个简短的表示代码,他们丢失了关于图像如何构成以及图像或场景的部分如何在空间上排列的信息

2-具有时间不稳定性:由于他们是在静止图像上接受训练的,他们没有学会物体在空间中运动的平滑时空变换。它们可以识别某些图像中的物体类别,但不能识别其他图像,并且对敌对噪声扰动非常敏感

3- 无法预测:由于不使用时间信息,前馈神经网络仅基于当前输入在每一帧提供新的表示代码,但无法预测接下来几帧会发生什么(注意:除了例外,未在视频上训练)

为了超越这些限制,我们需要一种新的网络,它可以将学习到的表达投射回输入图像空间,并且可以对时间上连贯的图像序列进行训练:我们需要对视频进行训练

这是这些新网络可以提供的高级功能列表:

  • 无监督学习:它们可以在视频上进行预训练,以预测未来的帧或表示,从而需要少得多的标记数据(在视频上很昂贵!)来训练执行一些任务
  • 分割 : 分割图像中的不同对象
  • 场景解析:如果数据集具有逐像素对象标签,则遵循分割,用于自动驾驶和增强现实
  • 定位:遵循分割和完美的对象边界,所有的场景解析和分割网络都可以做到这一点!
  • 时空表示:使用视频进行训练,而不仅仅是静止图像,了解时间概念和时间关系
  • 视频预测:一些网络被设计成预测视频中未来帧
  • 表示预测:某网络可以预测视频中未来帧的表示
  • 通过监控预测和实际未来帧或表示之间的误差信号来执行在线学习的能力

现在让我们检查这些新网络的细节和实现,如下所示。

生成梯形网络

这些模型使用编码器和解码器对来将图像分割成部分和对象。例子有: ENetSegNetUnetDenseNets梯形网络等等。

下面是一个典型的三层模型:

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

D 模块是标准的前馈层。 G 模块是生成模块,类似于标准前馈层,但具有去卷积和上采样功能。它们还使用类似残差的连接*“RES”将每个编码器层的表示连接到其中一个解码器层。这迫使生成层的表示由前馈表示来调制,从而具有更强的将场景定位和解析为对象和部分的能力。【x】是输入图像,【y】*是输出分割的同时步。

这些网络可以执行分割、场景解析和精确定位,但是不在时间域中操作,并且没有过去帧的记忆。

最近,每层的编码器到解码器旁路帮助这些网络实现了最先进的性能。

递归和生成梯形网络

最新的深度神经网络架构之一将递归添加到生成梯形网络中。这些是递归和生成式梯形网络(REGEL,我们称之为 CortexNet 模型),它们是迄今为止最复杂的深度神经网络模型之一,至少对于图像分析来说是如此。

这是我们目前使用的一个网络的三层模型:

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

DG 模块实际上与上述生成梯形网络中的模块相同。这些网络增加了从每个 G 模块到同一层中相应的 D 模块的循环路径*“t-1”*。

这些网络将视频中的一系列帧作为输入 x[t] ,并在每个时间步预测视频中的下一帧 y[t+1] ,如果预测准确的话,该帧接近 x[t+1]

由于该网络可以测量预测和实际下一帧之间的误差,它知道何时能够预测输入或不能够预测输入。如果没有,它可以激活增量学习,这是前馈网络所不能做到的。因此,它能够执行固有的在线学习

我们认为这是机器学习的一个非常重要的特征,是预测神经网络的特权。没有这个特征,网络就不能提供真正的预测置信度信号,也不能进行有效的增量学习。

这些网络仍在研究中。我们的建议是:保持警惕!

预测编码网络—第 1 部分

递归生成网络是一种可能的预测模型。或者,预测编码计算神经科学模型可以提供预测能力,并被安排为分层深度神经网络。

下面是一个两层模型的示例:

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

Rao 和 Ballard 模型和 Friston 实现计算*“A”模块(类似于梯形网络上的 D 模块)和R/Ay】模块(类似于梯形网络上的 G 模块)之间每一层的误差“e”。这个误差“e”表示在每一层,网络预测表示的能力。错误“e”然后作为输入被转发到下一层。“R”是卷积 RNN/LST 模块,“Ay”类似于“A”模块。【R】【Ay】*也可以组合成一个单独的循环模块。在第一层 “x” 是输入帧。

这个模型的问题是,这个网络与标准的前馈神经网络非常不同。它不在创建较低层特征组合的较高层创建分层表示,而是这些预测网络计算先前层的残差的表示。

因此,它们有点让人想起残差前馈网络,但在实践中,迫使这些网络转发错误并不会导致它们在更高层学习有效的分层表示。因此,它们不能有效地执行基于上层表示的其他任务,例如分类、分割、动作识别。需要更多的实验来证明这些局限性。

这个模型已经由 Bill Lotter 和 David Cox 在 PredNet 中实现。类似的型号也来自大脑公司

预测编码网络—第二部分

Spratling 预测编码模型将表示 y 投射到上层,而不是误差*“e”*,如在上面的 Friston 模型中所执行的。这使得该网络模型与分层前馈深度神经网络更兼容,并避免了上层中的学习误差时刻。

下面是一个两层模型的示例:

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

这个模型可以基本上重写并简化为我们上面看到的递归生成阶梯模型。这是因为*“R”“Ay”*可以组合成一个单独的循环模块。

与生成性对抗网络的关系

生成对抗网络(GAN)是一种非常流行的模型,它能够学习从数据分布中生成样本。这里介绍的新网络模型优于 GAN,因为:

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

Example of CortexNet predictive capabilities — Left: current frame, Center: next frame ground truth, Right: predicted next frame

其他型号的注意事项

像 CortexNet 这样的模型让人联想到像素递归网络及其各种实现( PixelCNNPixel CNN++WaveNet)。这些模型旨在对输入数据的分布进行建模:(“我们的目标是估计自然图像上的分布,该分布可用于计算[数据]的可能性并生成新的数据。”).他们只专注于生成新的现实数据样本,但没有显示出学习现实生活任务的表示。这些模型的推理速度也非常慢。

结论

关于这个话题的一篇论文是这里。CortexNet 仍在研究和评估中。例如,最近的 PredNet 论文对预测编码和梯形网络进行了比较,PredNet 在某些任务上胜出。PredNet 用于执行方向不变的人脸分类,使用较高层表示。它还可以预测数据集中的转向角,但主要是使用网络第一层的简单运动滤波器。这项任务不需要对特征进行层次分解。

关于作者

我在硬件和软件方面都有将近 20 年的神经网络经验(一个罕见的组合)。在这里看关于我:媒介网页学者LinkedIn 等等…

Matplotlib 的新情节主题——牛虻

原文:https://towardsdatascience.com/a-new-plot-theme-for-matplotlib-gadfly-2cffc745ff84?source=collection_archive---------6-----------------------

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

Sample plots from the new plotting theme inspired by the Gadfly plotting package for the Julia programming language

介绍

我为 Matplotlib 制作了一个绘图主题,灵感来自于牛虻中为 Julia 编程语言使用的默认绘图主题。通常我会用 Julia 写代码,这也是我在以前的博客文章中所做的。然而,自从升级到朱莉娅 1.0 版,我已经无法导入牛虻,这意味着没有更多漂亮的牛虻情节。所以我对自己说“ Jonny,是时候自己创造主题了”。我做到了!

(如果您想了解如何使用该主题,请跳到最后一节)

更多(漂亮的)情节

KDE 地块

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

Left: Two 1-dimensional kernel density estimate (KDE) plots. Right: A 2D KDE plot.

线形图

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

All the lines. Code to generate the data shamelessly stolen from Jake VanderPlas’s article on how to create Simple line plots in Python.

散点图

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

Scatter plot. Code to generate the plot shamelessly stolen from this article on how to create scatter plots in Python.

与 Seaborn 一起策划

当使用 Seaborn 绘图时,默认的美学会有一点改变。我还没有想出如何改变这一点,但我不会对此大惊小怪。例如,箱线图非常不同(见下文)

Code for creating the boxplots below

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

Left: Standard matplotlib boxplot function. Right: Boxplot using Seaborn

使用sns.lmplot绘图时,图例绘制在轴外,没有边框(如下)。默认情况下,它还会绘制左侧和底部的脊线。

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

Scatter plot made with maplotlib’s scatterplot function

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

Scatter plot made with seaborn’s lmplot function

如何获得主题

这个主题没有安装在 matplotlib 附带的主题集中。因此,如果你想使用这个主题,你有几个选择。我将在这里列出几个选项,但是你可以通过阅读 matplotlib 文档中的使用样式表和 rcParams 定制 Matplotlib 来了解所有的方法。

选项 1

复制这篇博文末尾的 matplotlibrc 样式表内容,并将其保存在与您想要绘制的脚本相同的目录中。用matplotlibrc这个名字保存。那应该就行了。

选项 2

同样,在这篇博文的末尾复制 matplotlibrc 样式表的内容,但是这次在mpl_configdir/stylelib中另存为<style-name>.mplstyle。你可以用matplotlib.get_configdir()找到mpl_configdir在哪里。我必须创建stylelib目录,因为它还不在mpl_configdir目录中。

一旦你把文件保存在正确的目录下,你就可以用

import matplotlib.pyplot as plt
plt.style.use(<style-name>)

所以我把文件保存为gadfly.mplstyle,我可以用plt.style.use('gadfly')设置主题

牛虻主题 matplotlibrc 文件

深度学习和新的编程范式

原文:https://towardsdatascience.com/a-new-programming-paradigm-for-deep-learning-8ce53b5b6345?source=collection_archive---------8-----------------------

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

An engraving of the Turk from Karl Gottlieb von Windisch’s 1784 book Inanimate Reason (wiki)

在我之前的帖子中,当讨论 DSL 在 ML 和 AI 中的重要性时,我们提到了软件 2.0 的想法,由安德烈·卡帕西提出:

软件 2.0 是用神经网络权重写的。没有人参与编写这段代码,因为有很多权重(典型的网络可能有几百万),直接用权重编码有点困难(我试过)。相反,我们对期望的程序的行为指定一些约束(例如,示例的输入输出对的数据集),并使用由我们支配的计算资源在程序空间中搜索满足约束的程序。在神经网络的情况下,我们将搜索限制在程序空间的一个连续子集,在这个子集上,搜索过程可以通过反向传播和随机梯度下降*【19】变得(有点令人惊讶地)高效*

深度学习就是吃软件【13】。在本帖中,我们将对此进行更深入的探讨。

自动微分

什么是自动微分(AD)?网上有无数关于这个主题的资源。

Ryan Adams, You Should Be Using Automatic Differentiation, 2016

简而言之:

  1. 向前模式计算方向导数,也称为切线。无需明确计算雅可比矩阵【4】即可计算方向导数。换句话说,前向模式的一次扫描可以计算雅可比矩阵的一个列向量, Jẋ ,其中 是种子的一个列向量【7】
  2. 反向模式计算方向梯度,即反向模式的一次扫描可以计算雅可比矩阵的一个行向量, ŷJ ,其中 ŷ 是种子【7】的一个行向量
  3. 一次向前或向后扫描的计算成本大致相当,但反向模式需要访问中间变量,需要更多内存。
  4. 倒车模式 AD 最适合F: R^n -> R,前进模式 AD 最适合G: R -> R^m。对于使用n > 1m > 1的其他情况,选择是很重要的。
  5. 反向传播仅仅是自动微分的一个特殊版本 [ 2 ]:反向传播有时也被称为反向模式自动微分。查看[ 3 了解一些历史背景。

实现自动微分

自动微分的实现是一个有趣的软件工程课题。【15】确定了实现自动微分的两种主要方法:

  1. 运算符重载[…]可以用包含额外导数信息的新类型替换浮点变量的类型,并重载该新类型的算术运算,以便沿传播该导数信息
  2. 程序转换人们可以决定显式地构建一个计算导数的新源代码。这非常类似于编译器,除了它产生源代码。这种方法比操作符重载更需要开发,这也是为什么操作符重载 AD 工具出现得更早、数量更多的原因之一。【15】

亲笔签名的可能是最常用的自动分化文库之一:

*[## 臀部/亲笔签名

自动签名-有效地计算 numpy 代码的衍生物。

github.com](https://github.com/HIPS/autograd)*

亲笔签名是开始学习如何实现自动差异化的好地方:

要计算梯度,Autograd 首先必须记录应用于输入的每个变换,因为它被转换为函数的输出。为此,自动签名包装函数(使用函数*primitive* ) ,以便当它们被调用时,它们将自己添加到执行的操作列表中。Autograd 的核心有一个表,将这些包装的图元映射到它们相应的梯度函数(或者更准确地说,它们的向量雅可比乘积函数)。为了标记我们要获取梯度的变量,我们使用Box类包装它们。您不应该考虑 Box 类,但是您可能会在打印调试信息时注意到它。

在函数求值之后,Autograd 有一个图形,指定对我们想要区分的输入执行的所有操作。这是函数求值的计算图。为了计算导数,我们简单地将微分规则应用于图中的每个节点。【亲笔签名】

这种“装箱”是操作符重载的好味道。另一个基于 F#的选择是 DiffSharp:

* [## DiffSharp:可微分函数编程

DiffSharp 是一个自动微分(AD)库,由 atlm günebaydin 和 Barak 用 F#语言实现…

diffsharp.github.io](http://diffsharp.github.io/DiffSharp/)

DiffSharp 展示了如何用合适的类型构建 AD。其他资源,对于熟悉 Haskell 的人来说,包括【24】【25】。我觉得重载在函数静态类型的设置中大放异彩:

An Haskell implementation of AD [24]

未决问题:控制流、就地操作和别名

注意到自动区分适用于包含控制流(分支,循环,…).拥有控制流的可能性是具有动态计算图的深度学习框架的关键卖点(例如:PyTorch、Chainer)——这种能力也被称为“定义并运行”【18】:

[## 皮托赫/皮托赫

Python 中 pytorch - Tensors 和动态神经网络的 GPU 加速能力

github.com](https://github.com/pytorch/pytorch) [## 链条链/链条链

chainer——一种用于深度学习的灵活神经网络框架

github.com](https://github.com/chainer/chainer)

然而,控制流可能导致代码只能分段可微,这是一个巨大的复杂性开销【4】

如果机器学习模型变得更像程序,那么它们将基本上不再是可微分的——当然,这些程序仍将利用连续的几何层作为子例程,这将是可微分的,但模型作为一个整体将不是可微分的。因此,在固定、硬编码的网络中使用反向传播来调整权重值,不可能是未来训练模型的选择方法——至少不可能是全部。【21】

我们需要找出有效训练不可微系统的方法。目前的方法包括遗传算法,“进化策略”,某些强化学习方法,和 ADMM(交替方向乘数法)。自然,梯度下降不会有任何进展——梯度信息对于优化可微参数函数总是有用的。但我们的模型肯定会变得越来越雄心勃勃,而不仅仅是可微的参数函数,因此它们的自动开发(“机器学习”中的“学习”)需要的不仅仅是反向传播。【21】

注意:有趣的是,正如我们将看到的,处理控制流的问题与一个机会密切相关:解耦深度学习模块的想法(与端到端深度学习整体相反)。

就地操作

就地操作是算法设计中不可避免的弊端,但也带来了额外的危险:

就地操作会对自动区分造成危害,因为就地操作会使区分阶段所需的数据无效。此外,它们需要执行重要的磁带转换。【16】**

【16】直观地展示了 PyTorch 如何处理就地操作:失效。

变量的每一个底层存储都与一个版本计数器相关联,该计数器跟踪已经对该存储应用了多少就地操作。当一个变量被保存时,我们记录当时的版本计数器。当试图使用保存的变量时,如果保存的值与当前值不匹配,就会引发错误。16】

错认假频伪信号

让我们看看 PyTorch 如何看待混叠:

x 的原地加法也导致 y 的一些元素被更新;因此,y 的计算历史也发生了变化。支持这种情况相当不容易,所以 PyTorch 拒绝了这个程序,在版本计数器中使用一个额外的字段(参见无效段)来确定数据是共享的【16】

可微分规划

一种看待深度学习系统的方式是“可微分函数式编程”【8】。深度学习有一个功能解释:

  1. 同一个神经元(如 ConvNets 和 RNNs)的权重绑定或多个应用类似于功能抽象【8】
  2. 构图的结构模式类似于高阶功能(例如,地图、折叠、展开、压缩)【8】【12】

探索作为深度学习网络训练的功能结构的最自然的操场将是一种可以直接在功能程序上运行反向传播的新语言。【14】

更高层次抽象的好处之一是可以更容易地设计基础设施,调整模型参数和模型【10】的超参数,利用超梯度:

超梯度的可用性允许您对基于梯度的优化进行基于梯度的优化,这意味着您可以优化学习率和动量计划、权重初始化参数或哈密顿蒙特卡罗模型中的步长和质量矩阵。【11】**

获得超参数的梯度打开了一个快乐的花园。我们可以拥抱它们,并丰富地超参数化我们的模型,而不是努力从我们的模型中消除超参数。正如高维基本参数化提供了灵活的模型一样,高维超参数化提供了模型类、正则化和训练方法的灵活性。【10】

然而,还有更深层的含义:

这感觉就像一种全新的编程,一种可微分的函数式编程。一个人用这些灵活的、可学习的片段编写一个非常粗糙的函数式程序,并用大量数据定义程序的正确行为。然后应用梯度下降或其他优化算法。结果是一个程序能够做一些我们不知道如何直接创建的非凡的事情,比如生成描述图像的标题。【9】

我喜欢这种思路:函数式编程意味着函数的可组合性。

我们今天通常发现的端到端训练的整体深度学习网络本质上非常复杂,以至于我们无法解释它的推理或行为。最近的研究表明,增量训练方法是可行的。通过用较小的单元进行训练,然后将它们组合起来执行更复杂的行为,网络已经被证明工作得很好。【20】**

解耦深度学习模块是一个令人兴奋的研究领域:使用合成梯度的解耦神经接口已经显示出,例如,非常有前景的结果【22】

我们面前的路

我不确定可微规划这个术语是否还会存在。与差动动态编程混淆的风险很高。

另一方面,这个想法很有趣。非常有意思,我很高兴看到像tensor lang【17】这样的项目越来越受欢迎。

《连线》杂志认为,很快我们就不会给计算机编程了。我们会像训练狗一样训练他们。T10【23】。让我们看看会发生什么。

资源

[0]格里万克、安德烈亚斯和安德里亚·瓦尔特。“评估衍生物:算法微分的原理和技术”。第 105 卷。暹罗,2008 年。

[1]乌烈芝、卡伦、爱德华·密德斯和马克斯·韦林。"用于神经网络压缩的软加权共享."arXiv 预印本 arXiv:1702.04008 (2017)

[2] Dominic,Steinitz,反向传播只是自动微分的最速下降,链接

[3]罗杰·格罗斯,《神经网络和机器学习导论讲义》,链接

【4】什么是自动微分?环

[5]梯度和方向导数,链接

[6]阿列克谢·拉杜尔,《自动微分导论》,链接

[7]哈佛·伯兰,自动微分,链接

[8]atlm gne Baydin,可微分编程,链接

[9] Christopher Olah,神经网络,类型和函数式编程,链接

[10]马克劳林、杜格尔、戴维·杜文瑙德和瑞恩·亚当斯。"通过可逆学习的基于梯度的超参数优化."机器学习国际会议。2015.

[11]炒作:组合机器学习和超参数优化,链接

[12] Christopher Olah,神经网络,类型和函数式编程,链接

[13]皮特·沃登,深度学习就是吃软件,链接

[14]大卫·达尔林普尔,可微分编程,链接

[15] Hascoet、Laurent 和 Valérie Pascual。“Tapenade 自动区分工具:原则、模型和规范。”美国计算机学会数学软件汇刊(TOMS) 39.3 (2013): 20

[16] Paszke,Adam,et al .“py torch 中的自动微分”2017 年

[17] Max Bendick,为深度学习设计一种可区分的语言,链接

[18] Carlos Perez,PyTorch,动态计算图和模块化深度学习,链接

[19]安德烈·卡帕西,软件 2.0,链接

[20]卡洛斯·佩雷斯,《深度教学:未来最性感的工作》,链接

[21]弗朗索瓦·乔莱,深度学习的未来,链接

[22] Jaderberg,Max,et al. “使用合成梯度的去耦神经接口” arXiv 预印本 arXiv:1608.05343 (2016)。

[23]杰森·坦兹,《代码的终结》,连线杂志,2016 年,链接

[24] Conal Elliott,什么是自动微分,它为什么起作用?,链接

[25]丹尼尔·布里斯,自动微分在哈斯克尔中是微不足道的,链接*

Word2Vec 的非自然语言处理应用

原文:https://towardsdatascience.com/a-non-nlp-application-of-word2vec-c637e35d3668?source=collection_archive---------1-----------------------

当使用机器学习解决问题时,拥有正确的数据至关重要。不幸的是,原始数据通常是“不干净的”和非结构化的自然语言处理 ( NLP ) 从业者对这个问题很熟悉,因为他们所有的数据都是文本的。因为大多数机器学习算法不能接受原始的字符串作为输入,所以在将数据馈送给学习算法之前,使用单词嵌入方法来转换数据。但这并不是文本数据出现的唯一场景,它还可以在标准的非 NLP 任务中以分类特征的形式出现。事实上,我们中的许多人都在努力处理这些类型的特征,那么在这种情况下,单词嵌入有任何用处吗?

本文旨在展示我们如何能够使用 Word2Vec ( 2013,Mikolov et al. ),一种单词嵌入技术,将具有大量模态分类特征转换为更小的一组更易于使用的数字特征。这些功能不仅更容易使用,而且成功地学习了几种模态之间的关系,类似于经典的单词嵌入对语言的影响。

Word2Vec

你可以通过一个人所交往的公司来了解这个人所说的话

以上正是 Word2Vec 试图做的事情:它试图通过分析一个单词的相邻单词来确定该单词的含义(也称为上下文)。该算法有两种版本 CBOWSkip-Gram 。给定一组句子(也称为语料库),该模型循环每个句子的单词,并试图使用当前单词来预测其邻居(其上下文),在这种情况下,该方法被称为“Skip-Gram”,或者它使用这些上下文中的每一个来预测当前单词,在这种情况下,该方法被称为“连续单词包”(CBOW)。每个上下文中的字数限制由一个名为“窗口大小的参数决定。

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

Both Word2Vec architectures. The current word is w(t) and w(t-2)…w(t+2) are context words. (Mikolov et al. 2013)

因此,如果我们选择例如 Skip-Gram 方法,Word2Vec 则包括使用浅层神经网络,即只有一个隐藏层的神经网络,来学习单词嵌入。网络首先随机初始化其权重,然后在训练过程中反复调整这些权重,以最小化使用单词预测其上下文时产生的错误。在一次有希望成功的训练之后,通过将网络的权重矩阵乘以单词的独热向量来获得每个单词的单词嵌入。

注意:除了允许文本数据的数字表示之外,由此产生的嵌入还学习单词之间有趣的关系,并可用于回答如下问题:国王对王后就像父亲对…?

关于 Word2Vec 的更多细节,你可以看看这个斯坦福讲座或者这个tensor flow 的教程

应用

我们提供在线数学练习。老师给学生布置家庭作业,每次做完一个练习,一些数据就会被储存起来。然后,我们使用收集到的数据评估学生的水平,并给他们量身定制的复习练习,帮助他们进步。对于每个回答的练习,我们存储一个标识符列表,帮助我们判断:回答的练习是什么?学生是谁?,是哪一章? …除此之外,我们还存储了一个分数值,该值根据学生的成绩为(0)或(1)。为了评估学生的水平,我们只需预测这个分值,并从我们的分类器中获得成功概率。

如你所见,我们的许多特征都是绝对的。通常,当模态的数量足够小时,可以简单地将具有(n)个模态的分类特征转换成(n-1)个虚拟变量,然后将其用于训练。但是当模态的数量成千上万时——就像我们的一些特征的情况一样——依赖虚拟变量变得低效和不切实际。

为了解决这个问题,我们的想法是使用 Word2Vec 来将分类特征转换成相对少量的可用的连续特征。为了说明这一点,让我们考虑“exercise_id”,这是一个分类特征,它告诉我们哪个练习得到了回答。为了能够使用 Word2Vec,我们必须提供一个语料库,一组输入算法的句子。但是原始特征——id 列表——本身并不是一个文集:顺序完全是随机的并且较近的 id 不携带任何关于它们邻居的信息我们的技巧包括把老师给的每一个作业都看作一个“句子”,一个连贯的练习 id 列表。因此,id 是按级别、章节自然地收集的,Word2Vec 可以直接在上面嵌入学习练习。****

事实上,多亏了这些人造句子,我们才能够使用 Word2Vec 并获得漂亮的结果:

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

Exercise embedding (3 main components of PCA) colored by level. 6e, 5e, 4e, 3e, 2e, 1e and tm are the french equivalents of the 6th, 7th, 8th, 9th, 10th, 11th and 12th grades in the US.

正如我们所看到的,最终的嵌入有一个结构。事实上,3d 投影的练习云是螺旋形的,更高级别的练习直接跟随前一级别的练习。这意味着嵌入成功学会了区分不同学校级别的练习,并将相似的练习重新组合在一起。但这还不是全部,使用一种 非线性降维 技术,我们能够将整个嵌入减少到具有相同特征的单个实值变量中。换句话说,我们获得了一个练习复杂性特征,其对于 6 年级练习是最小的,并且随着练习的增加而增加,并且变得更加复杂,直到其对于 12 年级练习是最大的。

此外,嵌入还学习了练习之间的关系,就像米科洛夫学习英语单词一样:

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

上图显示了我们的嵌入能够学习的一些关系的例子。那么如果我们问这个问题“一个 数字加法的练习 是为了一个 数字减法的练习 作为一个 时间加法的练习 是为了…?”嵌入给了我们答案“一个 时间减法 ”。具体来说,这意味着如果我们采用差值嵌入[subtract(Numbers)]-嵌入[Add(Numbers)]并将其添加到要求学生添加时间值(小时、分钟……)的练习的嵌入中,那么最接近的嵌入是由减去时间值组成的练习之一。

结论

总之,单词嵌入技术有助于将文本数据转换成实值向量,然后可以轻松地插入到机器学习算法中。尽管这些技术主要用于自然语言处理应用,如机器翻译,我们通过给出我们在 Kwyk 使用的一个特定特征的例子,展示了这些技术在分类特征处理中的地位。但是,为了能够应用 Word2Vec 这样的技术,人们必须建立一个语料库——即一组句子,其中的标签被排列,以便隐式地创建上下文。在我们的例子中,我们使用网站上的家庭作业来创建练习的“句子”并学习练习嵌入。因此,我们能够获得新的数字特征,这些数字特征成功地学习了练习之间的关系,并且比它们所源自的一堆标签更有用。

Kwyk 的一名开发人员 Christophe Gabard 提出了用 Word2Vec 处理分类特征的想法,这应该归功于他。

**作者:

每天用四个小时学习数据科学的非革命性技术

原文:https://towardsdatascience.com/a-non-revolutionary-technique-for-learning-data-science-in-four-hours-per-day-68da3199fd64?source=collection_archive---------9-----------------------

(或者其他什么……)

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

Man sitting at computer desk whilst looking intently at a monitor— @mrdbourke on Instagram

大学里临时抱佛脚应付考试对我来说从来都不起作用。我记得考试那天,我走进校园,直奔食堂。

请来两杯红牛。

然后,我的膝盖会在接下来的两个小时里不停地敲打,但我的大脑却无法将这些点联系起来。当我 4 个小时前读到的东西没有出现在页面上时,我会感到不安。

三年制的学位五年后,我毕业了。但是我从大学带走的最有价值的东西不是那张纸。它是学习如何学习。

我没有在考试前几天死记硬背,而是把整个学期的工作量分成 25 分钟的小块。没有任何革命性的东西。但对我来说是。

现在我也一样。

当我想学东西的时候,我试着每天做一点。

如果你想学点什么,最好的方法就是和做任何事情一样,一点一点来。

对于数据科学和编程,我的大脑在大约四个小时的集中注意力时达到极限。之后,工作开始遵循收益递减规律。

作为一名机器学习工程师,我花了很多时间在马克斯·凯尔森(Max Kelsen)清理数据,在互联网上研究解决问题的新方法,并编写数据科学和机器学习管道的代码,以投入生产。

所以当我完成工作时,我不可能有效地学习新的东西。我不再死记硬背更多的信息,而是用运动、创造和休息来填满时间。让潜意识做它该做的事。

在我不在 MK 的日子里,如果我想提高我的技能,我会使用番茄工作法。还记得之前的 25 分钟吗?

还是那句话,没什么革命性的。但我是那种对什么都兴奋的人。因此,如果像设置计时器这样简单的事情能让我集中注意力,我完全赞同。

在重要的日子里,我会瞄准 10 个。

其他日子我会瞄准 8。有时更少。

很简单。你设定了一个 25 分钟的计时器,在这 25 分钟里,除了你在一天开始时为自己设定的单一任务之外,什么也不做。你想重复多少次就重复多少次。

假设你做了 10 次,你的一天可能是这样的:

早上 7 点 45 分

抽屉里有电话。

上午 8 点

打开关注 Mac 并设置定时器。或者你可以使用任何其他计时设备(除了你的手机,太多分散注意力的东西)。

番茄 1 号

5 分钟休息

番茄 2 号

5 分钟休息

番茄 3 号

5 分钟休息

番茄 4 号

30 分钟休息

上午 10 点 25 分

番茄 5 号

5 分钟休息

番茄 6 号

5 分钟休息

番茄 7 号

5 分钟休息

番茄 8 号

60 分钟休息

下午 1 点 20 分

番茄 9 号

5 分钟休息

番茄 10 号

5 分钟休息

下午 2 点 20 分

现在还不到下午 2:30,如果你做对了,你已经完成了一些不可思议的工作。你现在可以检查你的手机了。

你可以用下午剩下的时间补上那些你需要补上的东西。

你不认为 10 次 25 分钟(4 小时多一点)的时间足够做你需要做的事情吗?

试试看。你会惊讶于你在 4 小时的专注工作中所能完成的事情。

上面的时间表类似于我在找到工作之前花了九个月时间攻读我自己的人工智能硕士学位

前几天也是一样。除了我在中午的时候挤出一点时间去训练和小睡。

我在 Coursera 上学习密歇根大学的 Python 应用数据科学专业

前几课都是关于操作数据的不同方法。我发现这是解决机器学习问题时最重要的步骤之一。课程项目与我在 Max Kelsen 做机器学习工程师时的日常工作非常接近。

因此,如果你想提高你的数据科学技能,特别是预处理步骤,我建议试试免费的 7 天试用期,看看专业化是否适合你

如果你不能在一天之内完成 10 件值得专注的工作。从 1 开始。然后 2。然后 3。有时你甚至会决定超过 25 分钟。最终,你会想知道你是如何以其他方式工作的。

PS 你不用把手机放在抽屉里。如果你白天需要它,你需要它。

本文首发于【mrdbourke.com】(每天还有更)。

关于发现异常的一个注记

原文:https://towardsdatascience.com/a-note-about-finding-anomalies-f9cedee38f0b?source=collection_archive---------0-----------------------

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

序言

这篇文章的灵感来自于在大学期间所做的研究。本文的目标是提醒人们发现异常并不是一项简单的任务(目前)。

介绍

异常检测是指发现不符合正常预期行为的观察结果的任务。在不同的应用领域中,这些观察结果可以被命名为异常、离群、新奇、例外、惊喜。文献中最常见的术语是异常值和异常值。异常检测是各种领域中的实际问题,例如:

  • 入侵检测
  • 欺诈检测
  • 工业损伤检测
  • 医疗和公共卫生
  • 图像处理
  • 文本数据中的异常检测
  • 传感器网络和其他领域

什么是异常

不幸的是,异常没有明确的定义,这就是为什么我选择了下面这个——异常是数据中不符合正常行为的明确定义的模式[1]。我们可以用一个简单的二维空间来说明异常(图 1)。

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

Figure 1. Illustration of simple anomalies in two-dimensional space

N₁和 N₂是有正常数据的地区,因为大多数观测值都在这些地区。远离正常区域的点,如 O₁点、O₂点和 O₃地区点是异常点。数据中的异常可能由于不同的原因而出现。恶意活动、信用卡欺诈、入侵、系统故障等。这些异常对数据分析师很有吸引力。因此,异常检测是一个重要的过程,并被认为是各种决策系统的优势。

异常类型

异常可分为以下三类:

  • 点异常。如果一个对象可以相对于其他对象被观察为异常,则它是点异常。这是最简单的异常类别,许多研究都包括它们。考虑图 1 所示的例子,O₁和 O₂是异常点
  • 语境异常。如果对象在某个定义的上下文中是异常的。只有在这种情况下才是语境异常(也称条件异常[2])。在图 2 中可以看到周期性的背景。在这种情况下,点 O₁是异常的,因为它不同于周期性的背景
  • 集体异常。如果一些链接的对象可以相对于其他对象被观察为异常。在这种情况下,单个物体不可能是异常的,只有物体的集合才是异常的。

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

Figure 2. Contextual anomaly example

我们需要明白,这些异常是有联系的。如果我们对它应用上下文,点异常可以变成上下文。或者点异常可以变成集体异常,如果我们把多个点异常连接在一起。

在抽象层面上,异常检测似乎是一项简单的任务。但是这项任务非常具有挑战性。以下是一些挑战:

  • 定义正常区域是非常困难的。在许多情况下,异常数据和正常数据之间的界限并不精确。在这种情况下,正常的观察可以被认为是异常,反之亦然
  • 如果行为是恶意的,如欺诈,它被认为是异常的。攻击者经常试图使他们的行为适应正常行为。同样,在这种情况下,识别异常任务并不简单
  • 今天被认为是正常的,将来可能就不正常了。在各种因素的影响下,大多数业务系统都会及时发生变化
  • 一个领域中的异常检测方法通常不能用于另一个领域。它们在大多数情况下是无效的
  • 模型训练的训练和验证数据可用性是一个大问题

让我们来玩吧!

下面我将给出一些数据集的例子。你的目标是慢慢滚动(一个例子接一个例子)并尝试用眼睛确定异常。

Figure 3. Little game

正如您所看到的,在某些情况下“通过眼睛”来确定异常并不简单。即使你会应用一些统计技术,它仍然不是微不足道的。那么,去哪里找,做什么呢?

异常检测方法概述

可用于发现异常的方法分为以下几类[4]:

*监督异常检测。*在训练和测试数据集中标记数据的设置;当简单的分类器可以被训练和应用时。这种情况类似于传统的模式识别,只是类别在大多数情况下非常不平衡。并非所有的分类方法都适合这项任务。例如,某些类型的决策树不能很好地处理不平衡的数据。支持向量机【SVM】或者人工神经网络应该表现更好。然而,这种设置是不相关的,因为我们需要知道所有的异常并正确标记数据。在许多情况下,异常是事先不知道的,或者可能在测试阶段以新奇的方式出现。

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

Figure 4. Supervised anomaly detection

*半监督异常检测。最初,*当我们没有任何知识时,我们从训练结果中收集。该设置还使用训练和测试数据集,其中只有训练数据由没有任何异常的正常数据组成。其思想是,正常类的模型已经被教导,并且异常可以通过偏离学习的模型来检测。这种方法也被称为“一类”分类。众所周知的方法是一类支持向量机和自动编码器。一般来说,任何密度估计方法都可以用于建模正态类的概率密度函数,例如高斯混合方法或核密度估计

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

Figure 5. Semi-Supervised anomaly detection

*无监督异常检测。*一种设置,当我们不知道数据中哪些是正常的,哪些是不正常的。这是最灵活的配置,不需要任何标签。训练数据集和测试数据集之间也没有区别。其概念是无监督异常检测方法仅基于数据集的自然特征对数据进行评分。通常,距离或密度用于评估什么是正常的,什么是异常值。可视化表示可以在图 6 中找到。

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

Figure 6. Unsupervised anomaly detection

大多数方法作为输出会给出分数或标签。评分和贴标签的区别在于灵活性。使用评分技术,分析师可以选择更适合问题领域的值。之后,他可以使用阈值来选择异常或只选择顶部的异常。标签是一种分类。如果不对领域和特征提取进行研究,到目前为止还没有一种方法可以在所有领域都获得同样的成功。大多数无监督的异常检测方法如图 7 所示。

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

Figure 7. Unsupervised anomaly detection approaches classification diagram

现实生活是动态的

如果定义的环境中的可观察对象的行为随时间改变,则该环境可以被认为是动态环境。

动态环境,如生产过程、通信网络、公路交通等。,可能包含大量随时间变化的信息,这对于理解环境的一般行为、发现环境中当前发生的规律和异常、控制进化过程以及智能建模或管理环境来说是宝贵的资源[3]。

例如:一个正在成长的网上商店。交通和交易量的变化。以前正常的事情现在不会了,这种转变只能被认为是一种异常。这是之前确定的挑战之一。另一个例子是分析客户行为的系统。最初可以对客户进行分类。但是顾客也可以因为某种原因及时从一个等级转移到另一个等级。随着软件的更新或行为的改变,系统会随着时间而发展。首先,为了有效地检测异常,需要持续学习的系统。其次,要在早期阶段检测异常,不能等到指标明显超出界限。早期检测需要能够检测到模式中不明显的细微变化。此外,由于异常本质上是不可预料的,有效的检测系统应该能够确定异常事件是否是新的,而不依赖于预编程的阈值。

检测动态环境中的异常似乎是一项艰巨的任务。可以面临的最大问题是,在大多数公司里,不会有可供学习的数据。在这种情况下使用的大多数方法应该是无人监管的。

可能的解决方案

目前进步并给人希望的解决方案包括神经网络(NN),其中一些与统计方法相结合。

现在用于时间序列的流行神经网络是长短期记忆(LSTM)——它在深度学习领域受到欢迎,因为它们有可能记住长期运行的依赖关系。

另一种有趣的网络是新的,没有提到很多,是分层时间记忆(HTM)——这是一种基于神经科学研究的神经网络,它也有能力学习和记忆长期运行的依赖关系。会告诉你更多。

分级时间记忆(HTM)

HTM 是由 Numenta 公司的 Jeff Hawkins 和 Dileep George 开发的一种无监督到半监督的在线机器学习方法,它是一种旨在捕捉新大脑皮层的结构和算法属性的技术。HTM 是新大脑皮层的理论,几乎没有类似的大脑结构。新大脑皮层约占人脑体积的 75%,它是我们所认为的大部分智力的核心。HTM 是一个生物理论,这意味着它来自神经解剖学和神经生理学,并解释了生物新皮层如何工作。他们说,HTM 理论是“生物约束的”,与机器学习中使用的术语“生物激励的”相反。

HTM 学习方法设计用于动态环境,如传感器和电机数据。传感器输入可以根据来自服务器的不同障碍而改变。相反,输入数据可能会发生变化,因为传感器的移动与人眼观看静态图像的移动相同。

HTM 系统在线学习。当输入数据有任何变化时,HTM 系统的存储器被更新。有一种标准的机器学习方法,如在测试和训练数据集中拆分数据,并学习网络以达到定义的准确性水平。问题来了:“如果没有标签,它怎么知道,它工作正常?它如何纠正自己的行为?”。在每一个时间点,HTM 都会预测下一步会发生什么。换句话说,HTM 建立了一个预测世界的模型。然后,将预测与发生的事情进行比较,这个结果是学习的基础。作为一种经典的机器学习方法,它试图最小化预测的误差。HTM 不断学习。这是生物有机体生存的基本素质。HTM 是围绕这一理念建立的,即智能系统需要像生物有机体一样不断学习。将会有系统不需要在线学习的应用,但是这些不是标准,而是例外。HTM 假装是一种通用的学习方法,适用于任何具有时间行为的任务。更多细节可以在他们的网站上找到,参考以下来源[4]。

发明了新方法!如何证明有效?

好吧,你发明了新方法来解决这个问题。如何证明你的方法有效并且比别人更好?

许多研究人员在研究无监督异常检测方法时遇到了一个问题——没有一个定义好的框架来评估它们的性能。许多科学家只做理论上的假设。目前,出现了一些创建这种框架的尝试。

Markus Goldstein 和 Seiichi Uchida 在他们的工作[5]中提出了如何对异常检测方法进行评估。但是他们的评估方法是基于处理表格数据的方法。

在 2015 年第 14 届机器学习和应用国际会议(IEEE ICMLA)上,Alexander Lavin 和 Subutai Ahmad 提出了他们的实时异常检测程序评估方法 Numenta 异常基准(NAB)[6]。

抓捕

这是时间序列中异常检测程序的第一个基准。 NAB 是一个开源框架,旨在通过可控和可重复的环境来评估实时异常检测程序。NAB 数据语料库由 58 个真实数据集组成,其中异常窗口被标记。每个文件包含 2,000 到 22,000 个时间戳,数据以 5 分钟为间隔聚合。它的总分是 365,551 分。这些数据集是合成的和真实的:

  • IT 指标
  • 社交媒体聊天
  • 工业机器传感器

评分机制定义了异常检测窗口来衡量早期检测。它奖励算法:

  • 检测所有存在的异常
  • 尽快发现他们
  • 触发很少的误报
  • 处理实时数据
  • 在所有数据集中都是自动的

它使用应用程序配置文件来衡量不同场景的性能。“开始吧”一节中的所有数据集示例都来自该基准测试。

结论

许多主要产品是某种数据库的公司会在会议上提出这个话题,并向你展示如何用他们的工具发现异常。但问题是,所示方法仅适用于特定数据集和用例。永远记住这一点。

请记住,发现异常需要分析师给出适当的定义。有不同类型的异常。有不同的方法可以找到特定类型的异常。总是试图缩小你的问题。并针对您的问题使用可用的基准或一些数据集(如果可用)来测试您的方法。

要阅读更多关于这个主题的内容,你可以参考下面的不同文章。

愿原力与你同在。

参考文献

[1]chan dola v .,Banerjee,a .和 Kumar v .,2009 年。异常检测:综述。美国计算机学会计算调查,7 月。41(3).

[2]宋,谢,吴,米&杰梅因,2007 .条件异常检测。IEEE 知识与数据工程汇刊,3 月 26 日,19(5),第 631–645 页。

[3]川野,h,西尾,s,韩,j 和长谷川,t,1994。知识发现如何与主动数据库技术合作控制动态环境?。希腊雅典,柏林海德堡施普林格出版社。

[4]霍金斯,j .,艾哈迈德,s .和拉文,a .,2016 年。生物和机器智能。地点:【http://bit.ly/2qJzvjO

[5] Goldstein,m .和 Uchida,s .,2016 年。多元数据无监督异常检测算法的比较评估。PLoS ONE,11(4),第 31 页。

[6]拉文和艾哈迈德,2015 年。评估实时异常检测算法 Numenta 异常基准。迈阿密 IEEE。

置信区间:参数和非参数重采样

原文:https://towardsdatascience.com/a-note-on-parametric-and-non-parametric-bootstrap-resampling-72069b2be228?source=collection_archive---------14-----------------------

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

Image by Author

机器学习工程师一生中很重要的一部分时间都花在制作一个好的模型上。泪水和汗水被投入到这个艰苦的过程中。但是,一旦基于防弹理论(当然)的模型存在,一个狡猾的问题就潜伏在其中:“它能告诉我们什么?”。

置信区间

置信区间的概念通常用对称高斯分布来解释。然而,它们不一定是对称的,并且根据具体情况,推导起来可能非常繁琐。总的想法基于下面的公式:

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

其中***【⍬】为固定且未知的参数真值,【⍬】****【hat】为其“最大似然估计( MLE) 来自数据(为随机变量) deltas 为置信区间的界限,其在术语中取决于与常见的误解相反,置信区间并不给出预测的置信度,而是给出参数的真实值属于由边界定义的范围的概率。类似地,它可以被解释为误差概率,即参数的真实值超出界限的概率。*

如果再次运行该路径,我会看到什么结果?

这个问题是频率主义者分析的核心。模型依赖于数据,数据越大、越清晰、越通用,就能获得更好的参数估计。在给定数据的情况下,可以使用参数的置信区间并通过提出以下问题来估计模型的良好性:“如果略有不同,参数和预测将会是什么,但仍然使用看似合理的数据来生成它们。”获取置信区间的步骤如下:

  1. 写出一个概率模型。
  2. 在给定数据的情况下,用最大似然估计替换任何参数。用重采样版本替换任何随机变量。
  3. 使用蒙特卡罗方法来估计第 2 步中的概率。

步骤 2 中的重采样版本可以通过多种方式获得,即参数化和非参数化。

非参数重采样

如果假设我们可能看到的所有数据都来自与手头数据相同的分布是安全的,那么,我们能做的最好的事情就是从数据集本身进行替换采样(以保持概率密度函数)。

参数重采样

**然而,在某些情况下,从数据集进行采样并不是一个很好的主意,例如当数据稀缺时。然后,我们可以直接从最佳拟合( MLE)、中生成新样本,并对噪声进行一些假设。

把所有的放在一起

考虑两种情况:当数据充足时和当数据有限时。在这两种情况下,数据的基本分布都被假定为未知。

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

Image by Author.**

检查散点图(图 1)后,假设最能描述数据的模型是三次多项式。

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

此外,假设数据中的噪声是具有零均值和未知标准差的高斯噪声是安全的。

这两个过程都遵循上一节中的步骤。对于参数重采样,样本从具有附加高斯噪声的模型中生成,该噪声具有从 MLE 拟合的残差中获得的方差。对于非参数重采样,样本从数据的原始分布中生成。

要获得响应的置信区间:首先,对于每个预测值,从所有 bootstrap 运行中对模型的预测进行排序,然后找出 MLE 和期望区间的界限之间的差异(在这种情况下为 95%)。上限和下限之间的差异是置信区间的上限和下限的增量。

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

95% confidence intervals for response, non-parametric (left), parametric (Right), 10 points. Image by Author.** **外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传****外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

95% confidence intervals for response, non-parametric (left), parametric (Right), 100 points. Image by Author.**

类似于预测的置信区间,我们保存来自 bootstrap 的所有拟合模型。

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

95% confidence intervals for coefficients, non-parametric (left), parametric (Right), 10 points. Image by Author.** **外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传****外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

95% confidence intervals for coefficients, non-parametric (left), parametric (Right), 100 points. Image by Author.**

何时使用

何时需要使用参数和非参数重采样?两者都有论据支持。使用非参数重采样,我们无法生成超出经验分布的样本,而使用参数重采样,可以生成超出我们目前所见的数据。但是,如果对模型没有太大的信心,或者数据丰富,那么非参数重采样是更可取的。如果数据不足,那么从参数模型中取样可以使其平滑(从图中可以看出)。

进一步阅读和链接

有很多方法可以获得置信区间,例如估计后验分布(贝叶斯主义),应用中心极限定理(在正态假设下),使用威尔克斯定理,或者如果使用高斯随机变量,使用海森的逆作为协方差矩阵等。

我推荐阅读这篇关于置信区间的文章,它从实践的角度给出了一个概述。另外,这篇论文对基于 bootstrap 的置信区间方法进行了很好的概述。

本文的 jupyter 笔记本可从这里获得。

喜欢作者?保持联系!

我错过了什么吗?请不要犹豫,直接在 LinkedInTwitter 上给我留言、评论或发消息吧!

** [## 你能做得更好吗?抽样策略,重点是吉布斯抽样,实践和代码

提供了通用采样策略的概述,重点是 Gibbs 采样、示例和 python 代码。

towardsdatascience.com](/can-you-do-better-sampling-strategies-with-an-emphasis-on-gibbs-sampling-practicals-and-code-c97730d54ebc) [## 贝叶斯优化的超参数调整或者我如何用木头雕刻船

超参数调整通常是不可避免的。对于一个参数,网格搜索可能就足够了,但如何处理…

towardsdatascience.com](/bayesian-optimization-or-how-i-carved-boats-from-wood-examples-and-code-78b9c79b31e5) [## 成对比较的主动采样

如何配对玩家,以便在尽可能少的游戏中知道排名,同时游戏体验质量…

towardsdatascience.com](/active-sampling-for-pairwise-comparisons-476c2dc18231)**

主成分分析的一站式商店

原文:https://towardsdatascience.com/a-one-stop-shop-for-principal-component-analysis-5582fb7e0a9c?source=collection_archive---------0-----------------------

在我为研究生统计理论课程使用的教材的开头,作者(乔治·卡塞拉和罗杰·伯杰)在序言中解释了他们为什么选择编写一本教材:

W 当有人发现你在写教科书时,他们会问你两个问题中的一个或两个。第一个是“你为什么要写书?第二个问题是“你的书和外面的有什么不同?“第一个问题相当容易回答。你正在写一本书,因为你对现有的文本不完全满意。”

我在这里应用作者的逻辑。主成分分析(PCA)是统计学和数据科学领域中需要理解的一项重要技术……但是,当我为我的大会的学生们组织课程时,我发现网上的资源过于专业,没有完全满足我们的需求,并且/或者提供了相互矛盾的信息。可以肯定地说,我对现有的文本并不完全满意。

因此,我想把 PCA 的“什么”、“何时”、“如何”和“为什么”以及一些有助于进一步解释这个主题的资源链接放在一起。具体来说,我想介绍这种方法的基本原理、幕后的数学、一些最佳实践以及这种方法的潜在缺点。

虽然我想让 PCA 尽可能容易理解,但是我们将要讨论的算法是非常技术性的。熟悉以下部分或全部内容会使本文和 PCA 作为一种方法更容易理解:矩阵运算/线性代数(矩阵乘法、矩阵转置、矩阵求逆、矩阵分解、特征向量/特征值)和统计学/机器学习(标准化、方差、协方差、独立性、线性回归、特征选择)。我在整篇文章中嵌入了这些主题的插图的链接,但希望这些是一个提醒,而不是通读文章的必读内容。

什么是 PCA?

假设你想预测美国 2017 年的国内生产总值(GDP)是多少。你有很多可用的信息:2017 年第一季度的美国 GDP,2016 年全年的美国 GDP,2015 年等等。你有任何公开的经济指标,如失业率、通货膨胀率等等。你有 2010 年的美国人口普查数据,估计每个行业中有多少美国人工作,以及在每次人口普查之间更新这些估计的美国社区调查数据。你知道每个政党有多少名众议员和参议员。你可以收集股票价格数据,一年中发生的首次公开募股的数量,以及有多少 CEO似乎正在准备竞选公职。尽管有大量的变量需要考虑,但这个只是触及了表面

TL;DR——你有很多变量要考虑。

如果你以前处理过很多变量,你就会知道这会带来问题。你了解每个变量之间的关系吗?您是否有太多的变量,以至于您的模型可能会过度适应您的数据,或者您可能会违反您正在使用的任何建模策略的假设?

你可能会问这样一个问题,“我如何把我收集的所有变量集中在其中的几个上?”用专业术语来说,你想要“减少你的特征空间的维数”通过减少特征空间的维度,您需要考虑的变量之间的关系更少,并且您不太可能过度拟合您的模型。(注意:这并不立即意味着过度拟合等。不再令人担忧,但我们正朝着正确的方向前进!)

不出所料, 降维 特征空间的 维度 称为 降维 。”有许多方法可以实现降维,但这些技术大多属于以下两类之一:

  • 特征消除
  • 特征抽出

特征消除顾名思义:我们通过消除特征来减少特征空间。在上面的 GDP 例子中,除了我们认为最能预测美国国内生产总值的三个变量之外,我们可能会放弃所有变量,而不是考虑每一个变量。特征消除方法的优点包括简单性和维护变量的可解释性。

然而,作为一个缺点,你不能从你丢弃的变量中获得任何信息。如果我们只使用去年的国内生产总值、根据最新的美国社区调查数据,制造业就业人口的比例以及失业率来预测今年的国内生产总值,我们就错过了任何可能对我们的模型有所贡献的变量。通过消除功能,我们也完全消除了这些变量可能带来的任何好处。

特征提取,不过,不会碰到这个问题。假设我们有十个独立变量。在特征提取中,我们创建十个“新”独立变量,其中每个“新”独立变量是十个“旧”独立变量的组合。然而,我们以特定的方式创建这些新的自变量,并根据它们预测因变量的程度对这些新变量进行排序。

你可能会说,“降维在哪里发挥作用?”好吧,我们保留尽可能多的新的独立变量,但我们放弃了“最不重要的”因为我们根据新变量对因变量的预测程度对它们进行了排序,所以我们知道哪个变量最重要,哪个最不重要。但是——这就是问题所在——因为这些新的独立变量是旧变量的组合,所以我们仍然保留旧变量中最有价值的部分,即使我们放弃了一个或多个“新”变量!

主成分分析是一种用于特征提取的技术——因此它以一种特定的方式组合我们的输入变量,然后我们可以丢弃“最不重要”的变量,同时仍然保留所有变量中最有价值的部分!*作为一个额外的好处,PCA 后的每个“新”变量都是相互独立的。*这是一个好处,因为线性模型的假设要求我们的独立变量彼此独立。如果我们决定用这些“新”变量拟合一个线性回归模型(见下面的“主成分回归”),这个假设必然会得到满足。

什么时候应该使用 PCA?

  1. 您是否希望减少变量的数量,但却无法确定可以完全不考虑的变量?
  2. 你想确保你的变量是相互独立的吗?
  3. 你愿意让你的自变量变得更难解释吗?

如果你对这三个问题的回答都是肯定的,那么 PCA 是一个很好的方法。如果你对问题 3 的回答是“否”,你不应该使用五氯苯甲醚。

PCA 是如何工作的?

之后的部分讨论了为什么 PCA 有效,但是在进入算法之前提供一个简短的总结可能对上下文有帮助:

  • 我们要计算一个矩阵,这个矩阵总结了变量之间的关系。
  • 然后我们将这个矩阵分解成两个独立的部分:方向和大小。然后,我们可以了解数据的“方向”及其“大小”(或者每个方向有多“重要”)。下面的截图,来自 setosa.io applet ,显示了该数据中的两个主要方向:“红色方向”和“绿色方向”在这种情况下,“红色方向”是更重要的一个。我们稍后会讨论为什么会出现这种情况,但是考虑到这些点是如何排列的,你能看出为什么“红色方向”看起来比“绿色方向”更重要吗?(提示:拟合该数据的最佳拟合线会是什么样子?)

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

Our original data in the xy-plane. (Source.)

  • 我们将转换我们的原始数据,以符合这些重要的方向(这是我们的原始变量的组合)。下面的截图(同样来自 setosa.io )是与上面相同的精确数据,但是进行了转换,使得 x -和y-轴现在是“红色方向”和“绿色方向”。这里的最佳拟合线是什么样的?

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

Our original data transformed by PCA. (Source.)

  • 虽然这里的可视化示例是二维的(因此我们有两个“方向”),但请考虑我们的数据有更多维的情况。通过识别哪些“方向”是最“重要”的,我们可以通过丢弃“最不重要”的“方向”来压缩或投影我们的数据到一个更小的空间通过将我们的数据投影到一个更小的空间,我们减少了特征空间的维度…但是因为我们已经在这些不同的“方向”上转换了我们的数据,我们已经确保在我们的模型中保留所有原始变量!

在这里,我通过一个算法进行主成分分析。我尽量避免太专业,但是不可能忽略这里的细节,所以我的目标是尽可能清晰地介绍事情。在下一节中,我们将更深入地了解该算法为什么会起作用。

在开始之前,您应该用 n 行和可能的 p+1 列来组织表格数据,其中一列对应于您的因变量(通常表示为 Y )和 p 列,其中每一列对应于一个自变量(其矩阵通常表示为 X )。

  1. 如果一个 Y 变量存在,并且是你的数据的一部分,那么把你的数据分成X ,如上定义——我们将主要使用 X 。(注意:如果没有 Y 的列,没关系——跳到下一点!)
  2. 取独立变量矩阵 X ,对于每一列,从每一项中减去该列的平均值。(这确保了每一列的平均值为零。)
  3. 决定是否标准化。给定 X 的列,是方差较高的特征比方差较低的特征更重要,还是特征的重要性与方差无关?(在这种情况下,重要性意味着该特征预测 Y 的好坏。)如果特征的重要性独立于特征的方差,那么将一列中的每个观察值除以该列的标准差。(这与步骤 2 相结合,标准化 X 的每一列,以确保每一列都有平均值 0 和标准偏差 1。)调用居中的(也可能是标准化的)矩阵 Z
  4. 取矩阵 Z转置它,将转置后的矩阵乘以 Z 。(从数学上来说,我们将把它写成zz*。)得到的矩阵就是 Z协方差矩阵,最多一个常数。*
  5. (这可能是最难的一步——请继续关注我。)计算zz的特征向量及其对应的特征值。这在大多数计算包中都很容易做到——事实上,我们将zz特征分解zz分解为 PDP ⁻,其中 P D 对角线上的特征值会关联到 P 中对应的列——即 D 的第一个元素是λ₁,对应的特征向量是 P 的第一列。这适用于中的所有元素以及 P 中它们对应的特征向量。我们总是能够以这种方式计算出 PDP ⁻。(额外收获:对于感兴趣的人,我们总是可以用这种方式计算 PDP ⁻,因为zz是一个对称半正定矩阵。)**
  6. 取特征值λ₁,λ₂,…,λ p ,从大到小排序。这样做,相应地对 P 中的特征向量进行排序。(例如,如果λ₂是最大特征值,则取第二列 P 放在第一列位置。)取决于计算包,这可以自动完成。把这个特征向量排序后的矩阵叫做 P 。( P 的列应该与 P 的列相同,但顺序可能不同。注意,这些特征向量是相互独立的。**
  7. 计算*Z ****=***ZP 。这个新矩阵, Z ,是 X 的中心化/标准化版本,但是现在每个观察是原始变量的组合,其中权重由特征向量确定。另外,因为我们在 P 中的特征向量是彼此独立的,所以 Z 的每一列也是彼此独立的!

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

An example from setosa.io where we transform five data points using PCA. The left graph is our original data X; the right graph would be our transformed data Z**.***

请注意此图中的两点:

  • 这两个图表显示了完全相同的数据,但右边的图表反映了原始数据的转换,因此我们的轴现在是主要组成部分。
  • 在这两幅图中,主成分相互垂直。事实上,每一个主成分总是与每一个其他主成分****(也就是官方的数学术语,表示垂直)(不信我?尝试破解小程序!)****

因为我们的主成分彼此正交,所以它们在统计上彼此线性无关…这就是为什么我们的 Z 列彼此线性无关!*

8.最后,我们需要决定保留多少特性,放弃多少特性。有三种常见的方法来确定这一点,下面讨论并给出一个明确的示例:

  • 方法一:我们任意选择想要保留多少维度。也许我想用二维来直观地表现事物,所以我可能只保留两个特征。这取决于用例,对于我应该选择多少特性没有硬性规定。
  • 方法 2 :计算每个特性的方差比例(下面简要说明),选择一个阈值,并添加特性,直到达到该阈值。(例如,如果您想要解释您的模型可能解释的 80%的总可变性,则添加具有最大解释方差比例的要素,直到您的解释方差比例达到或超过 80%。)
  • 方法三:这个和方法二密切相关。计算每个特征的解释方差比例,根据解释方差比例对特征进行排序,并绘制保留更多特征时解释方差的累积比例。(该图被称为碎石图,如下所示。)通过识别添加新特征相对于先前特征具有显著差异下降的点,并选择直到该点的特征,可以挑选包括多少特征。(我称之为“找到肘部”方法,因为查看碎石图中的“弯曲”或“肘部”可以确定所解释的方差比例中出现最大下降的位置。)

因为每个特征值大致就是它对应的特征向量的重要性,所以解释的方差比例就是你保留的特征的特征值之和除以所有特征的特征值之和。

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

Scree Plot for Genetic Data. (Source.)

考虑一下这个基因数据的 scree 图。(来源:此处。)红线表示由每个特征解释的方差的比例,其计算方法是将该主成分的特征值除以所有特征值的总和。仅包含主成分 1 解释的方差比例为λ₁/(λ₁ + λ₂ + … + λ p ),约为 23%。仅包含主成分 2 解释的方差比例为λ₂/(λ₁ + λ₂ + … + λ p ),约为 19%。

同时包含主成分 1 和主成分 2 解释的方差比例为(λ₁ + λ₂)/(λ₁ + λ₂ + … + λ p ),约为 42%。这就是黄线出现的地方;黄线表示方差的累积比例,如果您包括到该点为止的所有主成分。例如,PC2 上方的黄点表示包含主成分 1 和 2 将解释模型中总方差的约 42%。

现在我们来看一些例子:

  • 方法 1:我们任意选择一些主要成分。假设我想在我的模型中保留五个主要组件。在上面的遗传数据案例中,这五个主成分解释了通过包括所有 13 个主成分可以解释的总可变性的大约 66%。
  • 方法 2:假设我想包含足够的主成分来解释全部 13 个主成分所解释的 90%的总可变性。在上面的遗传数据案例中,我将包括前 10 个主成分,并从中去掉最后三个变量。**
  • 方法 3:在这里,我们要“找到肘部”在上面的碎石图中,我们看到主成分 2 和主成分 3 之间解释的可变性比例有很大下降。在这种情况下,我们可能会包括前两个特性,并放弃其余的特性。正如你所看到的,这种方法有点主观,因为“肘”没有数学上精确的定义,在这种情况下,我们将包括一个模型,它只能解释大约 42%的总可变性。

(注意:一些 scree 图将在 Y 轴上具有特征向量的大小,而不是方差的比例。这导致等效的结果,但是需要用户手动计算方差的比例。 这里可以看到 的例子。)

一旦我们删除了我们想要删除的转换变量,我们就完成了!那是 PCA。

但是,就像,为什么 PCA 会起作用?

虽然 PCA 是一种非常技术性的方法,依赖于深入的线性代数算法,但当你考虑它时,它是一种相对直观的方法。

  • 首先,协方差矩阵zz是一个矩阵,包含对 Z 中的每个变量如何与 Z 中的每个其他变量相关的估计。理解一个变量如何与另一个变量相关联是非常重要的。******
  • 第二,特征值和特征向量很重要。特征向量代表方向。想象一下在多维散点图上绘制数据。那么你可以把一个单独的特征向量想象成你的散点图中的一个特定的“方向”。特征值代表数量或重要性。更大的特征值与更重要的方向相关。
  • 最后,我们假设特定方向上更多的可变性与解释因变量的行为相关。大量可变性通常表示信号,而少量可变性通常表示噪声。因此,在一个特定的方向上有越多的可变性,从理论上来说,表明我们想要检测一些重要的东西。( setosa.io PCA applet 是处理数据并说服自己为什么有意义的好方法。)

因此,PCA 是一种集合了以下内容的方法:

  1. 衡量每个变量如何相互关联。(协方差矩阵。)
  2. 我们的数据分散的方向。(特征向量。)
  3. 这些不同方向的相对重要性。(特征值。)

主成分分析结合了我们的预测,并允许我们放弃相对不重要的特征向量。

PCA 有扩展吗?

是的,在有限的篇幅内我无法一一讲述。我最常看到的一个是主成分回归,我们将未变换的 Y 回归到我们没有丢弃的的子集上。(这就是 Z 列独立性的来源;通过 YZ 的回归,我们知道自变量所要求的独立性必然会得到满足。然而,我们仍然需要检查我们的其他假设。)****

我见过的另一个常见变体是内核 PCA

结论

我希望这篇文章对你有帮助!查看下面的一些资源,以获得关于 PCA 的更深入的讨论。让我知道你的想法,尤其是如果有改进的建议。

我听说这篇文章的中文翻译已经在这里提供了。(谢谢, Jakukyo 弗列尔!)

我非常感谢我的朋友里蒂卡·巴斯克尔约瑟夫·尼尔森科里·史密斯的建议和编辑。你应该看看媒体上的 Ritika 和 Joseph 他们的帖子比我的有趣多了。(科里太专注于不让自己的博士研究被抢先发表,以至于没有媒体报道。)

我还想给 setosa.io 小程序一个巨大的 h/t,为其直观形象的展示 PCA。****

*编辑:感谢迈克尔·马修斯注意到上面第 7 步中的公式中的一个错别字。他正确地指出了z =ZP ,而不是zp 。也感谢 Chienlung Cheung 注意到上面步骤 8 中的另一个错别字,并注意到我在一行中将“特征向量”和“特征值”混为一谈。

你应该查看的资源:

这是我用来编译这篇 PCA 文章的资源列表,也是我通常认为有助于理解 PCA 的其他资源。如果你知道有什么资源可以加入到这个列表中,请留下你的评论,我会添加进去的。

非学术文章和资源

编码资源

学术教科书和文章

  • 统计学习导论,第 6 版,作者:詹姆斯、威滕、哈斯蒂和蒂布希拉尼。(第 6.3、6.7 和 10.2 章详细介绍了五氯苯甲醚。这本书假设了线性回归的知识,但总的来说还是很容易理解的。)
  • 宾州州立大学 STAT 505 (应用多元统计分析)课程笔记。(我发现宾夕法尼亚州立大学的在线统计课程笔记令人难以置信,这里的 PCA 部分特别有帮助。)
  • 线性代数及其应用,第四版,作者 David Lay。(第 7.5 章介绍了五氯苯甲醚。)
  • 谷歌研究院的黄邦贤·施伦斯教授的主成分分析教程。
  • 卡耐基梅隆大学的科斯马·沙立兹撰写的关于主成分分析的章节草稿。
  • 来自 g 应用预测模型中关于数据预处理的一章包括对主成分分析的介绍性讨论(带视觉效果!)第 3.3 节。(h/t to Jay Lucas 求推荐!)
  • 统计学习的要素,第 10 版,作者 Hastie、Tibshirani 和 Friedman。(第 3.5、14.5 和 18.6 章详细介绍了五氯苯甲醚。这本书假设了线性回归、矩阵代数和微积分的知识,比统计学习介绍更具技术性,但这两本书遵循相同作者的相似结构。)**

次要资源

Matt Brems 是一名数据科学家,经营着数据科学咨询公司 BetaVector。他还是 DataRobot 数据科学产品&战略的高级经理。他解决了计算机视觉、金融、教育、消费品和政治领域的问题。他获得了大会颁发的 2019 年度‘杰出教师’奖。他在俄亥俄州获得了统计学硕士学位。Brems 是无国界统计组织的志愿者,目前在他们的执行委员会担任副主席。

你可以通过电子邮件推特联系他。

好奇如何成为一名数据科学家?聆听网飞数据科学家的观点

原文:https://towardsdatascience.com/a-peek-into-a-netflix-data-scientists-day-66bf3dacabb9?source=collection_archive---------5-----------------------

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

Photo by Franki Chamaki on Unsplash

数据科学是一个如此模糊的术语。对一些人来说,这意味着数据分析;对一些人来说,它是机器学习的同义词;其他人认为它有数据工程的味道。可能的职责范围很广,不同公司甚至同一公司的团队之间存在细微的差异,这使得身份难以确定。实际上,你必须与 X 公司的数据科学家交谈,才能了解 X 公司如何看待数据科学。网飞组织的第三次 WiBD 研讨会的重点是数据科学,这是我们所有人了解网飞方面的故事的绝佳机会。感谢 Becky 领导本次研讨会,感谢网飞的 WiBD 团队使本次系列研讨会成为可能。

对于那些读过我之前关于第一期第二期的故事的人来说,你可能知道我写这篇文章是为了向全世界分享来自硅谷的知识和见解。信息的不对称是一个不幸的现实,阻碍了许多人对数据科学和数据工程职业的追求。越多的人着手解决这个棘手的问题,我们就能越快解决它!这促使我加入了 HasBrain,这是一家教育社会企业,致力于弥合这一信息鸿沟,并帮助所有有意愿学习的人找到一条通往数据科学和数据工程的道路。

数据科学项目

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

“A group of people brainstorming over a laptop and sheets of paper” by Štefan Štefančík on Unsplash

当我在麻省理工学院上分析边缘课程时(你可以在 edX 上找到在线等效内容),我一直在想真实世界的数据科学项目会有什么不同。我希望当时有人给我看 Becky 的数据科学项目 Arc。这是一个美丽的总结。

第一步:从理解业务问题开始

Becky 在下面的幻灯片中分享了问题清单。她就如何定义成功发出号召。当你问关于一个好的概念证明的问题时,你需要从一个简单的模型作为基准开始,并且从增量改进的角度来看你的模型的价值。否则,您将陷入不得不解释 75%的准确率是否足够好的境地。拥有物理学博士学位的贝基还提到,学者们总是要检查最后 20%以确保它是防水的;但是在这个行业中,你很少在获得大部分价值后去走最后一英里。对于正在考虑转型成为数据科学家的博士生来说,这可能是值得注意的事情。

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

第二步:制定技术方案

除了下面幻灯片中介绍的细节,Becky 还强调了沟通和站在利益相关者的角度考虑问题的重要性。机器学习误差指标可能不是你的利益相关者最关心的事情。将业务目标转化为优化问题能力至关重要。

找出别人用过的技术可以节省一次时间,因为不用重新发明轮子。现有的监督学习技术,如预测建模或分类,都有很好的记录。然而,在相对更高级和专业的机器学习领域,如 NLP 和图像分类,不断有新的论文发表,提供新的技术。因此,这些领域的数据科学家的黄金标准行为将包括及时了解最新和最好的研究论文。

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

第三步:创建一个概念证明- >重复/验证,直到你成功或决定不能完成- >将结果反馈给利益相关者

如果您对数据科学家使用的工作流和工具/库有任何疑问,Becky 对她在项目 arc 中“做项目”部分的详细描述会非常有帮助。

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

第四步:生产模型

如果你听说过某些数据科学家谈论需要学习编写生产级代码,他们可能是需要独立生产模型而不是交给机器学习工程师或软件工程师的人。

模型的生产化本质上意味着你不能停留在获取和展示模型输出上。你的输出是产品的一部分,将改变实际的用户体验。您的代码将成为更大的产品代码库的一部分。例如,如果您正在对用户是否会在未来两周内流失进行分类。标签搅动的预测类中的用户可能会看到与预测类标签不搅动的组不同的 UI。实际上,您为其他团队创建了一个 API 来调用您的模型并获得模型输出。您可能需要重构代码;只要 API 不中断,终端用户体验无缝,您就可以不断升级模型。

Becky 自学了她工作中的软件工程方面:模块化她的代码以获得可重复性并提高算法效率。有时,她可能涉及软件工程师/数据工程团队。除了工作的复杂性之外,这个决定还取决于服务级别协议。例如,如果您的 API 需要一直运行,可能需要更广泛的代码审查或软件工程团队的直接参与。

沟通和解决问题

在经历了数据科学课程之后,Becky 分享了更多关于有效沟通和解决问题技巧的重要性。向非技术利益相关者解释复杂的数据科学概念的能力对于让他们接受你的项目至关重要。她物理学博士的背景帮助她发展了将复杂问题分解成小块并用一个解决方案解决每个问题的能力。同样,她分解了利益相关者的高层次问题,并确定了数据科学项目可以提供价值的地方。

在获得作为数据科学家的直接工作经验之前,任何人都不容易接触到这部分工作;包括 Kaggle 项目在内的大多数实践项目都是从一个明确定义的数据科学问题开始的。Becky 提到,这些软技能来自经验,可以从建设性的反馈中学习。她还阅读创业书籍,以熟悉常见的商业概念和行话。此外,许多其他经验丰富的数据科学家建议我,如果你想进一步发展商业敏锐性,可以阅读产品管理方面的书籍和文章。

动手练习

与之前的研讨会类似,我们以动手练习结束了会议。这是一个非常初学者友好的项目,使用 WDI 数据预测创业成本。如果你是机器学习的新手,或者刚刚完成一些关于监督学习的基础在线课程,这将是一个很好的额外练习。

回到前面的问题解决和沟通,Becky 提出了一个商业问题“在不同的国家创业有多难?”并为她的项目定义了一个目标——预测在不同国家创业的成本。如果这是一个真正的工作项目,我想她需要与她的利益相关者就创业的预测成本如何成为创业难易程度整体评估决策的一部分达成一致。

希望这个总结对你有所帮助。祝所有数据科学爱好者好运!再次感谢网飞团队的慷慨分享!演示幻灯片视频录像也可供感兴趣的人使用。

我们的团队已经走访了硅谷顶级科技公司的 30 多名数据科学家。我计划继续分享这些对话中的宝贵见解。同时,如果你有任何问题,请随时给我发电子邮件。敬请期待!

如果你正在考虑建立你的作品集数据项目,并希望与有相似目标的学习伙伴虚拟联系以保持动力,请点击这里查看我们的新计划:www.boringppl.com

使用时尚 MNIST 的谷歌汽车视觉的性能基准

原文:https://towardsdatascience.com/a-performance-benchmark-of-google-automl-vision-using-fashion-mnist-a9bf8fc1c74f?source=collection_archive---------11-----------------------

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

Actual footage of Google AutoML Vision at work.

Google AutoML Vision 是谷歌最先进的云服务,能够完全自动地从零开始构建图像识别的深度学习模型。在这篇文章中,Google AutoML Vision 用于在 Zalando Fashion-MNIST 数据集上建立图像分类模型,这是经典 MNIST 数据集的最新变体,与数字 MNIST 相比,它被认为更难学习 ML 模型。

在基准测试期间,AutoML Vision 训练模式包括“免费”(0 美元,计算时间限制为 1 小时)和“付费”(大约。480 美元,24 小时计算时间)并进行评估:

因此,free AutoML 模型在计算时间约为 100 秒的测试集上获得了 96.4%的宏 AUC 和 88.9%的准确度分数。30 分钟(提前停止)。付费 AutoML 模型在测试集上实现了 98.5%的宏观 AUC,准确率为 93.9%。

介绍

最近,人们对自动机器学习解决方案的兴趣越来越大。像 H2O 无人驾驶 AI数据机器人这样的产品,仅举几个例子,其目标是企业客户,并继续进入专业数据科学团队和环境。对于许多用例来说,AutoML 解决方案可以显著地加快时间-2 模型周期,因此允许更快的模型迭代和部署(并且实际上开始在生产中节省/赚钱)。

自动化机器学习解决方案将在未来 3-5 年内彻底改变数据科学和 ML 领域。因此,如今许多需要相应的人工输入或专业知识的人工智能模型或应用将可能由人工智能/人工智能模型本身部分或完全自动化。很可能,这也将导致对“经典”数据科学概况的总体需求下降,而更有利于将模型投入生产的与工程和运营相关的数据科学角色。

自动机器学习快速进步的一个最近的例子是深度学习图像识别模型的开发。不久前,建立一个图像分类器是一个非常具有挑战性的任务,只有少数人能够做到。由于计算、方法和软件的进步,障碍已经大大降低,以至于你可以用 10 行 Python 代码用 Keras 建立你的第一个深度学习模型,并获得“okayish”结果。

毫无疑问,在不久的将来,仍然会有许多 ML 应用和案例不能(完全)自动化。这些情况可能会更复杂,因为基本的 ML 任务,如将分类器拟合到简单的数据集,可以并将很容易地由机器自动化。

在这一点上,第一次尝试进入机器学习自动化的方向。谷歌和其他公司正在投资汽车研究和产品开发。市场上最早的专业自动化 ML 产品之一是 Google AutoML Vision。

谷歌自动视觉

Google AutoML Vision(目前处于测试阶段)是 Google 的云服务,用于图像分类任务的自动化机器学习。使用 AutoML Vision,您可以在没有任何编码、神经网络或任何知识的情况下训练和评估深度学习模型。

AutoML Vision 在 Google Cloud 中运行,可以基于图形用户界面使用,也可以通过 REST、命令行或 Python 使用。AutoML Vision 实现了来自神经架构搜索(NAS)的策略,这是当前深度学习研究中备受关注的科学领域。NAS 基于另一个模型,通常是神经网络或强化学习模型,正在设计旨在解决机器学习任务的神经网络的架构的思想。NAS 研究的基石是 Zoph 等人的论文。(2017) 以及 Pham 等人(2018) 。后者也已经在 Python 包 autokeras (目前处于预发布阶段)中实现,并使神经架构搜索在具有单个 GPU 的桌面计算机上变得可行,而不是在 Zoph 等人使用的 500 个 GPU 上。

算法能够发现神经网络架构的想法似乎非常有前途,但是由于计算约束,这仍然是一种限制(我希望你不介意我将 500–1000 GPU 集群视为计算约束)。但是,神经架构搜索在上市前的产品中究竟有多好呢?

基准

在下面的部分中,Google AutoML vision 用于基于时尚 MNIST 数据集构建图像识别模型。

资料组

时尚-MNIST 数据集被认为是传统 MNIST 数据集的“替代物”,已经被欧洲在线时尚巨头 Zalando 的研究部门开源(查看时尚-MNIST GitHub repoZalando research 网站)。它包含 10 个不同服装类别(上衣、裤子、鞋子等)的 60,000 个训练图像和 10,000 个测试图像。).就像在 MNIST 一样,每个图像都是 28×28 的灰度图像。它与训练图像和测试图像具有相同的图像大小和结构。以下是数据集中的一些示例:

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

时尚 MNIST 的制作者认为,如今传统的 MNIST 数据集是一个太简单的任务,无法解决——即使简单的卷积神经网络在测试集上也能达到 99%以上的准确率,而经典的 ML 算法很容易达到 97%以上。出于这样或那样的原因,时尚 MNIST 诞生了。

Fashion-MNIST repo 包含加载数据的帮助函数以及一些用于基准测试和测试模型的脚本。此外,回购协议上的数据有一个清晰的可视化效果。克隆完成后,您可以使用一个简单的 Python 函数(查看下一节中的代码)导入时尚 MNIST 数据,并开始构建您的模型。

使用谷歌自动视觉

准备数据

AutoML 提供了两种数据摄取方式:(1)上传包含不同文件夹中的训练图像的 zip 文件,对应于各自的标签,或者(2)上传包含 Goolge 云存储(GS)文件路径、标签和可选的用于训练、验证和测试集的数据分区的 CSV 文件。我决定使用 CSV 文件,因为您可以定义数据分区(标记名为 TRAIN、VALIDATION 和 TEST ),以便保持对实验的控制。下面是需要上传到 AutoML Vision 的 CSV 文件的所需结构(没有标题!).

+------------+------------------------------------+---------------+
| partition  | filepath                           | label         |
+------------+------------------------------------+---------------+
| TRAIN      | gs://bucket/folder/image_0.jpg     | 0             |
| TRAIN      | gs://bucket/folder/image_1.jpg     | 2             |
| ...        | ...                                | ...           |
| VALIDATION | gs://bucket/folder/image_50001.jpg | 3             |
| VALIDATION | gs://bucket/folder/image_50002.jpg | 4             |
| ...        | ...                                | ...           |
| TEST       | gs://bucket/folder/image_60001.jpg | 7             |
| TEST       | gs://bucket/folder/image_60002.jpg | 1             |
| ...        | ...                                | ...           |
+------------+------------------------------------+---------------+

就像 MNIST 一样,时尚 MNIST 数据包含各个图像的像素值。为了实际上传图像文件,我开发了一个简短的 python 脚本,负责图像的创建、导出和上传到 GCP。该脚本遍历时尚 MNIST 数据集的每一行,导出图像并上传到 Google 云存储桶中。

import os
import gzip
import numpy as np
import pandas as pd
from google.cloud import storage
from keras.preprocessing.image import array_to_imgdef load_mnist(path, kind='train'):
    """Load MNIST data from `path`"""
    labels_path = os.path.join(path,
                               '%s-labels-idx1-ubyte.gz'
                               % kind)
    images_path = os.path.join(path,
                               '%s-images-idx3-ubyte.gz'
                               % kind)with gzip.open(labels_path, 'rb') as lbpath:
        labels = np.frombuffer(lbpath.read(), dtype=np.uint8,
                               offset=8)with gzip.open(images_path, 'rb') as imgpath:
        images = np.frombuffer(imgpath.read(), dtype=np.uint8,
                               offset=16).reshape(len(labels), 784)return images, labels# Import training data
X_train, y_train = load_mnist(path='data', kind='train')
X_test, y_test = load_mnist(path='data', kind='t10k')# Split validation data
from sklearn.model_selection import train_test_split
X_train, X_valid, y_train, y_valid = train_test_split(X_train, y_train, test_size=10000)# Dataset placeholder
files = pd.DataFrame({'part': np.concatenate([
                                   np.repeat('TRAIN', 50000),
                                   np.repeat('VALIDATION', 10000),
                                   np.repeat('TEST', 10000)
                              ]),
                      'file': np.repeat('file', 70000),
                      'label': np.repeat('label', 70000)})# Stack training and test data into single arrays
X_data = np.vstack([X_train, X_valid, X_test])
y_data = np.concatenate([y_train, y_valid, y_test])# GS path
gs_path = 'gs://secret/fashionmnist'# Storgae client
storage_client = storage.Client.from_service_account_json(json_credentials_path='secret.json')
bucket = storage_client.get_bucket('secret-bucket')# Fill matrix
for i, x in enumerate(X_data):
    # Console print
    if i % 1000 == 0:
        print('Uploading image {image}'.format(image=i))
    # Reshape and export image
    img = array_to_img(x=x.reshape(28, 28, 1))
    img.save(fp='fashionmnist' + '/' + 'image_' + str(i) + '.jpg')
    # Add info to data frame
    files.iloc[i, 1] = gs_path + '/' + 'image_' + str(i) + '.jpg'
    files.iloc[i, 2] = y_data[i]
    # Upload to GCP
    blob = bucket.blob('fashionmnist/' + 'image_' + str(i) + '.jpg')
    blob.upload_from_filename('fashionmnist/' + 'image_' + str(i) + '.jpg')
    # Delete image file
    os.remove('fashionmnist/' + 'image_' + str(i) + '.jpg')# Export CSV file
files.to_csv(path_or_buf='fashionmnist.csv', header=False, index=False)

函数load_mnist来自时尚 MNIST 知识库,将训练和测试数组导入 Python。导入训练集后,使用来自sklean.model_selectiontrain_test_split对 10,000 个样本进行采样和存储,作为验证数据。然后,训练、验证和测试数组被堆叠到X_data中,以便有一个对象进行迭代。占位符DataFrame被初始化以存储 AutoML Vision 所需的信息(分区、文件路径和标签)。storage from google.cloud使用一个服务帐户 json 文件连接到 GCP(当然,我不会在这里分享)。最后,主流程开始,遍历X_data,为每一行生成一个图像,保存到磁盘,上传到 GCP,删除不再需要的图像。最后,我将导出的 CSV 文件上传到项目的 Google 云存储桶中。

进入 AutoML

AutoML Vision 目前处于测试阶段,这意味着您必须在试用之前申请。由于我和我的同事目前正在为我们的一个客户探索自动机器学习在计算机视觉项目中的使用,我已经可以通过 GCP 控制台访问 AutoML Vision。

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

此时,开始屏幕看起来相当不起眼。你可以通过点击“开始使用 AutoML”或阅读文档开始,这是目前为止非常基本但信息丰富的,特别是当你不熟悉基本的机器学习概念时,如训练-测试-分割、过拟合、精确/召回等。

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

开始后,Google AutoML 会将您带到数据集对话框,这是通向最终 AutoML 模型的第一步。到目前为止,这里没有报告。稍后,您将在这里找到所有导入的数据集。

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

生成数据集

点击“+新建数据集”后,AutoML 会将您带到“创建数据集”对话框。如前所述,可以使用两种不同的方法添加新数据集,如下图所示。

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

我已经从我的计算机上传了图像,以及包含 GS 文件路径、分区信息以及相应标签的 CSV 文件到 GS bucket 中。为了将数据集添加到 AutoML Vision,您必须指定包含图像 GS-filepaths 等的 CSV 文件的文件路径。

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

在“创建数据集”对话框中,如果每个图像有多个标签,您还可以启用多标签分类,这也是一个非常有用的功能。点击“创建数据集”后,AutoML 遍历提供的文件名,并为建模构建数据集。到底是做什么的,既不可见也没有记录。这个导入过程可能需要一段时间,所以它向你展示了时髦的“霹雳游侠”进度条。

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

导入完成后,您将收到一封来自 GCP 的电子邮件,通知您数据集的导入已完成。我发现这很有帮助,因为你不必一直开着浏览器窗口盯着进度条。

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

这封邮件看起来有点奇怪,但嘿,它仍然是测试版…

训练模型

回到 AutoML。构建数据集后,首先看到的是导入的图像。在这个例子中,图像有点像素化,因为它们的分辨率只有 28×28。您可以使用左侧的导航栏浏览不同的标签,也可以手动添加标签到目前为止尚未标记的图像。此外,如果你的图片没有附带任何标签,你可以申请人工标签服务。此外,如果您需要添加类别等,您可以创建新的标签。

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

现在让我们严肃起来。进入“训练”对话框后,AutoML 会通知您标签的频率分布。它建议每个类的最小数量为 n = 100 n=100 n=100标签(我觉得这个数量很低)。此外,它似乎向您显示了整个数据集的频率(一起训练、验证和测试)。我认为,在这一点上,按数据划分的分组频率图会提供更多信息。

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

单击“开始培训”会将您带到一个弹出窗口,您可以在其中定义模型名称并分配您愿意投资的培训预算(计算时间/金钱)。您可以选择“1 计算小时”,whis 每月免费提供 10 个型号,或者“24 计算小时(更高质量)”,价格大约为。480 美元(1 小时的自动计算需要 20 美元。然而,如果架构搜索收敛于更早的点,你将只支付到目前为止所消耗的计算时间,我认为这是合理和公平的。最后,还可以选择自定义培训时间,例如 5 小时。

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

在这个实验中,我尝试了两个版本,AutoML 的“免费”版本,但我也“全押”并选择了 24 小时选项,以实现可能的最佳模式(“付费模式”)。让我们看看,您可以从 480 美元的尖端 AutoML 解决方案中获得什么。点击“开始训练”后,熟悉的骑士屏幕出现,告诉你,你可以关闭浏览器窗口,让 AutoML 做剩下的事情。奈斯。

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

结果和评价

首先,我们从免费模式开始。大约花了。30 分钟的训练,似乎很快就找到了解决方案。我不确定 AutoML 在评估收敛标准时到底做了什么,但免费和付费模型之间似乎有所不同,因为免费模型已经收敛了大约 30 分钟的计算,而付费模型没有。

免费模型的整体模型指标看起来相当不错。在宏类 1 精度为 90.9%和召回率为 87.7%的测试集上,平均精度为 96.4%。时尚-MNIST 数据集上的当前精度基准为 96.7%(wrn 40–4 8.9M 参数),其次为 96.3%(WRN-28–10+随机擦除),而低预算模型的精度仅为 89.0%。因此,免费的 AutoML 模式与当前的时尚 MNIST 基准相去甚远。下面,你会发现免费模型的指标截图。

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

付费模型的模型度量看起来要好得多。该方法在测试集上的平均准确率为 98.5%,一级精度为 95.0%,召回率为 92.8%,准确率为 93.9%。这些结果接近当前的基准,但是,没有我希望的那么接近。下面,你会发现付费模型的指标截图。

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

“评估”选项卡还显示了更详细的指标,如精度/召回曲线以及分别影响模型指标的分类临界值滑块。在这一页的底部,你会发现混淆矩阵,以及正确和错误分类的例子的相对频率。此外,您可以检查每个类的假阳性和假阴性的图像(如果您想了解您的模型为什么以及何时出错,这非常有帮助)。总体而言,模型评估功能有限,但用户友好。作为一个更深入的用户,当然,我希望看到更多的先进功能,但考虑到目标群体和发展状况,我认为这是相当不错的。

预言;预测;预告

拟合和评估模型后,您可以使用几种方法来预测新图像。首先,您可以使用 AutoML 用户界面从本地机器上传新图像。对于没有经验的用户来说,这是一个将他们的模型应用到新图像并获得预测的好方法。对于高级用户和开发人员,AutoML vision 通过 GCP 上的 API 公开模型,同时负责后台的所有技术基础设施。一个简单的 Python 脚本展示了 API 的基本用法:

import sys
from google.cloud import automl_v1beta1# Define client from service account json
client = automl_v1beta1.PredictionServiceClient.from_service_account_json(filename='secret.json')# Endpoint
name = 'projects/automl-XXX/locations/us-central1/models/ICNXXXXXXX'# Import a single image
with open('image_10.jpg', 'rb') as ff:
    img = ff.read()# Define payload
payload = {'image': {'image_bytes': img}}# Prediction
request = client.predict(name=name, payload=payload, params={})
print(request)# Console output
payload {
  classification {
    score: 0.9356002807617188
  }
  display_name: "a_0"
}

作为第三种方法,如果您想使用完整的 nerdcore,也可以将 API 放在命令行中。我认为,自动化的 API 公开是一个很好的特性,因为它让你可以将你的模型集成到各种脚本和应用程序中。此外,当您想要在生产环境中同时将模型扩展到数百或数千个 API 请求时,Google 会处理所有的细节问题。

结论和展望

简而言之,即使免费模型在测试集上也取得了相当好的结果,因为投入到模型中的实际时间只是手动构建模型所需时间的一小部分。付费模式取得了明显更好的结果,但是成本为 480 美元。显然,付费服务的目标是数据科学专业人士和公司。

AutoML Vision 只是来到谷歌云的一系列新 AutoML 应用的一部分(查看这些来自谷歌 Next 18 的公告),进一步塑造了该平台在机器学习和人工智能方向的定位。

就我个人而言,我相信自动化机器学习解决方案将继续进入专业数据科学项目和应用。借助自动化机器学习,您可以(1)为您的定制解决方案建立基准模型,(2)更快地迭代使用案例和数据产品,以及(3)更快地到达您实际开始在生产中利用数据赚钱的时间点。

结束语

如果你对我的故事有任何意见或问题,欢迎在下面评论!我将尝试回答这些问题。此外,请随意使用我的代码或在您选择的社交平台上与您的同行分享这个故事。如果你想保持联系,请在 LinkedInTwitter 上关注我。

请确保您也查看了棒极了的 STATWORX 博客,了解更多有趣的数据科学、ML 和 AI 内容,这些内容直接来自我们在德国法兰克福的办公室!

如果你对更多像这样的优质内容感兴趣,请加入我的邮件列表,不断为你带来新的数据科学、机器学习和人工智能阅读,并把我和我的团队发送到你的收件箱!

我希望你喜欢我的故事,我真的很喜欢写它。感谢您的宝贵时间!

原载于 2018 年 8 月 20 日www.statworx.com

数据分析的哲学视角:探索对错问题

原文:https://towardsdatascience.com/a-philosophical-look-at-data-analytics-exploring-questions-of-right-and-wrong-42c78d2ba3cb?source=collection_archive---------11-----------------------

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

“通过收集和出售私人生活的详细记录来赚钱的企业曾被直白地描述为‘监控公司’。他们将品牌重塑为‘社交媒体’,这是自美国陆军部成为国防部以来最成功的一次欺骗。”

最近,我偶然看到了爱德华·斯诺登的上述引文,这让我不禁思考,尤其是在围绕剑桥分析——脸书争议以及如何使用个人数据的对错展开激烈辩论的背景下。作为一名从业者,我想到的问题本质上是非常现实的,它们可以归结为一件事——当涉及到个人数据的使用时,我们如何开始划清界限?有许多相互关联的方面需要结合起来看,所以让我稍微分解一下。

(1)房间里的大肥象:数据隐私

首先,“数据隐私”与“数据分析/使用”有很大不同。进行这种区分是至关重要的,特别是因为当前关于使用数据的许多讨论几乎总是交替使用它们。

那么区别在哪里呢?

  • 数据隐私特指不同类型数据的所有权和控制权,尤其是个人的个人数据。您可以将您的数据视为您的财产。因此,您将面临数据或财产被窃取或通过其他强制手段(如监控)窃取的风险。
  • 另一方面,数据分析只处理数据可用后发生的事情——谁在使用数据,他们如何使用数据,他们使用数据的目的是什么?它不关心这些数据是通过正当手段还是不正当手段获得的。

显然,假设这两者没有联系是过于简单的。但我想说的是,他们周围的不良行为是相互独立的。例如,您可以通过公平的方式(不违反数据隐私协议)获得数据,然后将它用于可疑的目的。类似地,你可以偷偷摸摸地获取数据,不理会数据隐私,但将它用于完全无害的分析。

回到最近的争论,我认为最大的错误发生在数据隐私本身。关于个人、他们的偏好和行为的敏感数据没有受到像脸书这样的人的保护,而这种脆弱性被挖掘这些数据的人所利用。这是一个非常黑白分明的犯罪,没有太多灰色,不像数据使用的许多其他方面。这里有几点需要注意:

  • 仅仅因为像脸书这样的公司发布数据隐私条款,就期望数据得到保护,这是天真的。公司有责任确保有严密的控制措施,不允许未经授权访问这些数据。
  • 此外,在我看来,围绕像脸书这样的平台上的数据漏洞的愤怒有点过分了。几乎每个人都知道风险,包括把数据放在那里的人,即使他们没有完全理解可能的后果。我确信剑桥分析公司的违规事件不是唯一发生过的!

有什么解决办法?像大多数其他法律问题一样,这可能需要结合更严格、更明确和更好理解的法律,以及消费者对风险的更好理解。人们会对他们放在那里的东西变得更聪明。就像即使法律禁止入室盗窃,人们仍然锁着他们的房子。

这个数据激增的世界仍然太新了。事情还在发展。控件也会。

**(2)【暗示】【影响】&【操纵】**之间界限模糊

对我来说,这是一个需要更多自省的方面,并引发了一些关于什么是可接受的,什么是不可接受的问题。数据可以用来建立许多推论。这些推论反过来可以用来确定什么是真正触动任何特定人心弦的最佳方式。

几个世纪以来,广告商一直在这样做——当然,他们是为群体而不是个人做的,但他们确实试图按下正确的按钮,让这些目标个人沿着他们自己可能选择或可能没有选择的道路前进。

换句话说,当一个有大众吸引力的名人代言一个可乐品牌,让我选择这个品牌而不是另一个时,我是不是被操纵了?直到现在还没有人认真提出这个问题。那么,为什么会突然出现一股利用数据分析操纵人们的需求和选择的热潮呢?

当然,如果想要的结果是通过歪曲或谎言来实现的,那就大错特错了。然而,如果数据只是用来确定哪条信息最能引起谁的共鸣,那么为什么这就应该被认为是错误的呢?

(3)领域的问题——一些比另一些更神圣吗?

另一件我一直难以接受的事情是剑桥分析公司的工作影响了政治结果这一事实引发的愤怒。这当然是真的,但我不明白的是,为什么它会变得如此重要。

多年来,公司一直在分析数据(包括个人数据),并利用它做出许多商业决策,包括客户定位,但直到现在,没有人提出质疑。相反,有一场比赛,看谁做得更好,更便宜,更有效。现在,突然之间,因为客户定位是围绕政治候选人进行的,而不是品牌 A 对品牌 B,为什么同样的数据分析,使用同样的方法,变成了每个人都害怕的怪物?

你可能会说,政治选择不应该基于数据驱动的针对个人的目标,而应该仅仅基于候选人的选举平台。当然可以。但同样的推理可以扩展到任何事情——个人应该根据银行的产品和服务选择 A 银行还是 B 银行,而不是根据银行的定向广告。为什么它在政治上是错误的,而在银行、零售品牌、航空公司、保险公司和电信公司上却不是呢?

不要误解我——我并不想评论在政治中使用有针对性的数据分析是对还是错。我只是说规则至少需要有一定的一致性。

我很难在这里下结论,因为我仍在试图对这些方面做出决定,即使我继续在影响客户反应以最大化业务影响的领域工作,我从未认为这在道德上是错误的。

也许我们正处于十字路口,我们必须确定如何从这里前进。数据分析和人工智能等事物的力量毋庸置疑,但也许是时候建立一些边界和划定一些界限了——作为个人、企业、政治和监管者。

对错问题几乎总是个人理解和选择的问题。因此,我很想听听那些读到这篇文章的人,他们认为什么是可以接受的,他们认为界限应该划在哪里。

(注意:脸书和加州的争议还有很多其他方面,比如俄罗斯的影响、对广告商的控制、假新闻等等。—但上述文章仅涉及数据隐私和目标问题)

一种带张量流的拾波线发生器

原文:https://towardsdatascience.com/a-pickup-line-generator-with-tensorflow-7e1f9eee8516?source=collection_archive---------3-----------------------

生成、保存和部署基于 Tensorflow 的拾音线生成器。你可以在这里看到演示 这里看到代码

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

A pickup line from the pickup line generator

几个月前我看到一篇文章,说有人创造了一个搭讪生成器。由于我刚刚开始进入深度学习的世界,我一直在考虑一些有趣的项目,这些项目至少可以在我学习的时候为我提供娱乐。一个可怕的搭讪发电机听起来像魔术。

  1. 数据

这些数据是从一些网站上手工收集的,这些网站看起来从 90 年代以来就没有更新过。我搜了大约 20 个这样的网站,你可以想象,搭讪的质量很低,而且大多数都很下流。

我必须清理一些奇怪的字符,重复的,并删除新的行,因为每个搭讪行的长度大约是一个四年级学生的句子。我把所有的行都放到一个文件中,瞧,训练数据!

4。型号

现在困难的部分总是以少于 100 行的完全陌生的代码结束,这些代码在被充分哄骗时会产生魔力。我发现点蜡烛和重复咒语很有帮助。

我找到了谷歌的马丁·戈纳的一个讲座,他在没有博士学位的情况下做了一个关于深度学习的演讲。那里有一部分他训练一个 RNN 人创作莎士比亚戏剧。这听起来像是一个把美好的东西变得粗糙的黄金机会。

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

Model structure

3。训练

我开始在莎士比亚数据集上训练,最初几个纪元(20-40)进行得很好,之后准确率停滞在 50%左右,输出很好,但不是很好。

在确保模型输出是合理的之后,我接着在我自己的数据集上进行训练。起初,我训练了 10 个时期,以了解在给定小数据集的情况下,模型会落在哪里。同样,结果是好的,但不是伟大的。作为一项实验,我训练了 200 个奇怪的纪元,直到精确度非常高,但模型开始输出它以前见过的线条。经典的过度合身。

我把结果给我的一个朋友看,他建议我先在一个更大的英语会话数据集上训练它,然后再在搭讪数据上重新训练顶层。他的说法是,“在学会如何搭讪之前,它必须学会如何说英语”。很自然地,我开始寻找一种方法来清理 Twitter。

Twitter 数据的预处理包括提取“@提及”和链接。每条推文都在文件中的一行,我把它分成几十个更小的文件,以便于检查。

有了大约 1 GB 的 tweets,我再次开始重新训练,结果发现迭代次数达到了 3.5 亿次。

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

An explosion and a lesson on learning rates.

究竟是什么?我向我的朋友(在这一点上,我应该承认他是卡内基梅隆大学的博士)展示了新的结果,他说我的学习速度需要在训练过程中改变。这将防止精确度突然下降,甚至可能有助于提高精确度。

每 10 个时期,我将学习率乘以 0.1。最初的学习率是标准的 0.001。在第 10 个时期下降到 0.0001,等等。

虽然这确实有所帮助,但它仍然徘徊在 60%左右,但没有大幅下降。很明显,网络可能不够大,无法获得更高的准确性,但使用 Twitter 数据上训练的模型的权重,开始对搭讪数据进行第二轮训练似乎足够合理。

仅仅 10 个时期后,模型的准确性突然增加到大约 70%,并且结果中拼写错误的单词少得多。拾取线的质量类似于拾取线数据的结构,但是不经常重复来自数据本身的片段。厉害!

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

The accuracy does not crash. Notice at ~18M steps, the slightly steeper drop in loss. That’s the learning rate decrement!

4。保存和部署

保存和部署一个用于生产的模型是这个项目的主要焦点。在 Tensorflow Serving 上已经做了大量的工作,但如果我能弄清楚如何将它用于这个特定的模型,我会被诅咒的。为模型提供服务要求您以特定的方式保存它,包括您将如何查询它以及它应该基于该查询输出什么。网站上有一些简单的教程,展示了如何部署 MNIST 模型,介绍了如何部署基于图像的预测器。我想很快做一个对象检测项目,所以教程会有所帮助,但对于这个模型,拾取线是通过向网络输入一个字符串并让它预测下一个字符来创建的。这可能会永远持续下去,并且必须做一些工作来创建一条单独的搭讪线。经过几个小时的挣扎,我暂时屈服了。

就部署 Tensorflow 模型的简单工具而言,仍有许多需要改进的地方,但 Tensorflow 团队似乎已经解决了困难的部分。

我决定采用简单的方法,生成数千条搭讪语句,并把它们存入数据库。这不是一个优雅的解决方案,但它确实有效,并且有 30,000 个左右使你不太可能看到同一行两次。有时候简单的方法就足够了。如果有一个简单的解决方案,只需要 1/10 的时间,就没有必要过度设计。

机器学习的实用开端

原文:https://towardsdatascience.com/a-practical-start-to-machine-learning-421b0e8d5b2a?source=collection_archive---------10-----------------------

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

Photo by João Silveira on Unsplash

入门

在企业创新实验室工作教会了我很多东西,其中最值得一提的是每四个月教一次新学生应用机器学习的基础知识。最重要的是教没有机器学习(ML)经验的学生如何将这项技术应用到他们工作的各个方面。虽然我不会说我已经完善了这一技能,但我已经参加了三个学期的这个周期,我对在 1-2 周内教授学生应用机器学习的原则有了更好的理解。

有趣的是,我发现许多完成在线课程或学习神经网络数学的学生仍然会在特征工程、数据挖掘甚至加载通用数据方面苦苦挣扎。通过在我们的空间里教一些学生,我发现下面的资源是我最想推荐的,我觉得值得分享。

端到端的例子

虽然机器学习目前是一个热门话题,但许多开发人员不知道如何实际使用它。我发现最好通过一个简单的端到端机器学习示例,让学生对预处理、特征工程、训练和评估有基本的了解。

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

Painting by Willy Stöwer

我最喜欢的机器学习“Hello World”教程是泰坦尼克号数据集(尽管有点病态)。从这个数据集中,你可以学习训练一个模型来预测一名乘客是否会在泰坦尼克号的事故中幸存。我用来指导学生的文件可以在这里找到。我发现最好用 Jupyter 笔记本、熊猫、Scikit-Learn 和 Numpy 进行一些练习。

我喜欢这个数据集作为介绍的原因是因为您将学习重要的 ML 基础知识,例如读取 CSV 文件,删除包含空条目和不相关列的行,将性别字段从文本转换为二进制,以及对分类字段执行一次性编码。通过一步一步地看这个例子,你可以用一个容易理解的问题来涵盖许多不同的特性工程实践。

看书

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

一旦你体验了简单的机器学习管道是什么样子,我建议你读一点书,学习一些基础知识。 Aurélien Géron 的书, 用 Scikit-Learn 和 TensorFlow 动手进行机器学习,在我看来是开始了解应用机器学习的最好方式。我通常让学生阅读前几章,或者一直读到张量流部分。这本书最棒的地方在于,它附带了 Jupyter 笔记本,里面有所有的例子,所以你可以在阅读过程中调整和使用它们的代码。我还喜欢他们在第 2 章中直接切入端到端解决方案解决方案,这让工程师们可以非常轻松地快速上手。

摆弄一些代码

既然您已经了解了机器学习背后的一些理论,那么是时候探索不同类型的实现和用例了。然而,我们中的一些只关注阅读的人可能很难跳到代码中并用不同的数据实现解决方案。

为了找到数千个不同数据集、方法、实现和机器学习解决方案的例子,我求助于 Kaggle 。它拥有大量无价的知识,包括各个领域数百个高质量的数据集。可能 Kaggle 最大的部分是内核。内核是其他用户解决问题的端到端代码,包括从读取数据集和清理到功能工程、培训和优化的一切。你甚至可以派生出其他用户的内核,并在他们的云上运行,给你一个探索真正解决方案的机会。

Kaggle 很棒,因为它给了你一个脱离玩具问题和简单数据的机会。它允许您处理更具挑战性和真实性的数据集,包括图像、原始和无组织的文本以及数字要素。休息一下,探索 Kaggle(甚至可能参加一些比赛)让你有机会学习其他 Kaggler 的应用解决方案,扩展你对机器学习解决方案背后的理论和数学的理解。

更深入

在探索了 Kaggle 上的一些内核之后,学习一些深度学习的基础和应用是至关重要的。我之所以建议跳过 Géron 书中的张量流部分,是因为我发现 Keras 更容易快速建立神经网络。Keras 是一个高级深度学习库,它依赖于 TensorFlowTheano 作为后端来执行其计算。

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

幸运的是,我找到的关于学习应用深度学习的最好的书也是 Keras 的创始人,Fran ois Chollet!在他令人惊叹的书中, 用 Python 进行深度学习 *,*他涵盖了深度学习概念、计算机视觉、自然语言处理以及问答等领域更高级的神经网络架构等等。这本书的另一个亮点是,因为 Chollet 自己写的,所以它教授了最佳实践、内置 API 和可以在 Keras 中使用的函数。这本书包含了许多我从未在在线课程或其他书中看到过的东西,我肯定会认为它是我查找 Keras 实现技巧的最佳资源之一。

包装东西

采取这些步骤只是更深入理解机器学习的开始,应该会给你信心和足够的背景来开始处理不同来源的数据。通过关注不同算法、资源和库的实现,更容易兴奋和学习并想继续学习。

只关注数学的选择可能很难转化为工作环境。我学到的一些最有用的东西是 Keras、Scikit-Learn 和 Pandas 内置的微妙功能,它们让我工作得更快。我学到的一些最酷的特征工程管道是从我通过 Kaggle 涉猎的竞赛解决方案中得到启发的。

有如此多的机器学习资源,这可能是压倒性的。我希望这个列表可以作为你深入机器学习的一个很好的起点。

自然语言处理实践指南(第一部分)——处理和理解文本

原文:https://towardsdatascience.com/a-practitioners-guide-to-natural-language-processing-part-i-processing-understanding-text-9f4abfd13e72?source=collection_archive---------0-----------------------

经过验证和测试的解决 NLP 任务的实践策略

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

介绍

非结构化数据,尤其是文本、图像和视频包含了丰富的信息。然而,由于处理和分析这些数据的固有复杂性,人们通常不会花费额外的时间和精力从结构化数据集冒险出来分析这些非结构化数据源,这可能是一座潜在的金矿。

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

自然语言处理(NLP)就是利用工具、技术和算法来处理和理解基于自然语言的数据,这些数据通常是非结构化的,如文本、语音等。在这一系列文章中,我们将探讨实践者和数据科学家可以用来从文本数据中提取有用见解的久经考验的策略、技术和工作流。我们还将讨论 NLP 的一些有用和有趣的用例。本文将通过教程和实践例子来介绍如何处理和理解文本数据。

本系列的大纲

这个系列的本质将是理论概念的混合,但重点是涵盖各种 NLP 问题的实践技术和策略。我们将在这一系列文章中涉及的一些主要领域包括。

  1. 处理&理解文本
  2. 特征工程&文本表示
  3. 文本数据的监督学习模型
  4. 文本数据的无监督学习模型
  5. 高级主题

随着本系列的进展,您可以随时提出更多的想法,我将很高兴涵盖我可能错过的一些内容。这些文章中有很多将展示在现实世界中行之有效的技巧和策略。

本文涵盖的内容

本文将通过实际例子详细介绍 NLP 的以下方面。

  1. 通过网络抓取进行数据检索
  2. 文本争论和预处理
  3. 词性标注
  4. 浅层解析
  5. 选区和依存解析
  6. 命名实体识别
  7. 情感和情绪分析

这应该给你一个如何开始分析文本语料库中的语法和语义的好主意。

动机

从形式上看,NLP 是计算机科学和人工智能的一个专门领域,其根源是计算语言学。它主要关注设计和构建应用程序和系统,使机器和人类使用的自然语言之间能够进行交互。因此,它往往被视为一个利基领域的工作。而人们通常更倾向于关注机器学习或统计学习。

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

当我开始钻研数据科学领域时,甚至连我都被对文本数据进行分析和建模的挑战所淹没。然而,作为一名数据科学家,多年来我一直在研究 NLP 的一些挑战性问题,我注意到了一些有趣的方面,包括可以用来解决各种问题的技术、策略和工作流。我在我的书 【用 Python 进行文本分析】 (我正在写这个的修订版)和 【用 Python 进行实用的机器学习】 中涉及了几个关于 NLP 的主题。

然而,基于我从我所有的读者那里收到的所有优秀的反馈(是的,你们都是了不起的人!),创作这一系列文章的主要目的和动机是与更多的人分享我的学习,这些人不能总是找到时间坐下来通读一本书,甚至可以在旅途中参考这些文章!因此,没有必要购买这些书籍来学习 NLP。

入门指南

在为本文构建内容和示例时,我在想,我是应该关注一个玩具数据集来更好地解释事情,还是应该关注数据科学数据集的主要来源之一的现有数据集。然后我想,为什么不建立一个端到端的教程,在那里我们抓取 web 来获得一些文本数据,并展示基于这些数据的示例!

我们将处理的源数据将是新闻文章,这些文章是我们从 shorts **,**中检索到的,该网站为我们提供 60 字的简短新闻文章,涉及各种各样的主题,他们甚至有一个应用程序!

[## 体育新闻,60 个单词!

编辑描述

inshorts.com](https://inshorts.com/)

在本文中,我们将使用来自科技、体育和世界新闻的文本数据。我将在下一节讲述如何从他们的网站上抓取和检索这些新闻文章的一些基础知识。

标准 NLP 工作流

我假设您知道 CRISP-DM 模型,这是执行任何数据科学项目的典型行业标准。通常,任何基于 NLP 的问题都可以通过一个有条理的工作流来解决,这个工作流有一系列的步骤。下图描述了主要步骤。

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

A high-level standard workflow for any NLP project

我们通常从文本文档的语料库开始,并遵循文本争论和预处理、解析和基本探索性数据分析的标准流程。基于最初的见解,我们通常使用相关的特征工程技术来表示文本。根据手头的问题,我们要么专注于建立预测的监督模型,要么专注于无监督模型,后者通常更专注于模式挖掘和分组。最后,我们与相关利益相关者或客户一起评估模型和整体成功标准,并部署最终模型以供将来使用。

抓取新闻文章进行数据检索

我们将通过利用 python 来检索新闻文章,来抓取网站。我们将关注科技、体育和世界事务方面的文章。我们将为每个类别检索一页的文章。下图描述了一个典型的新闻类别登录页面,该页面还突出显示了每篇文章文本内容的 HTML 部分。

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

The landing page for technology news articles and its corresponding HTML structure

因此,我们可以在上面提到的登录页面中看到包含每篇新闻文章的文本内容的特定 HTML 标签。我们将利用这些信息通过利用**BeautifulSoup****requests**库来提取新闻文章。让我们首先加载下列依赖项。

****import requests
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import os****%matplotlib inline****

我们现在将构建一个功能,该功能将利用**requests**从三个新闻类别的登录页面访问并获取 HTML 内容。然后,我们将使用**BeautifulSoup**来解析和提取每个类别中所有新闻文章的新闻标题和文章文本内容。我们通过访问特定的 HTML 标签和类来找到内容,它们就在那里(我在前面的图中描述了一个例子)。

很明显,我们提取新闻标题、文章文本和类别,并构建一个数据框架,其中每一行对应一篇特定的新闻文章。我们现在将调用这个函数并构建我们的数据集。

****news_df = build_dataset(seed_urls)
news_df.head(10)****

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

Our news dataset

现在,我们有了一个格式整齐的新闻文章数据集,您可以使用下面的代码快速检查新闻文章的总数。

****news_df.news_category.value_counts()****Output:
-------
world         25
sports        25
technology    24
Name: news_category, dtype: int64****

文本争论和预处理

清理和预处理文本数据通常涉及多个步骤。我已经在“用 Python 进行文本分析”的第三章 中详细介绍了文本预处理 (代码是开源的)。然而,在这一节中,我将强调一些在自然语言处理(NLP)管道中大量使用的最重要的步骤,我经常在我的 NLP 项目中使用它们。我们将利用相当多的**nltk****spacy**,它们都是 NLP 中最先进的库。通常一辆pip install <library>或者一辆conda install <library>就足够了。但是,如果您在加载spacy’s语言模型时遇到问题,请按照下面强调的步骤来解决这个问题(我在我的一个系统中遇到过这个问题)。

****# OPTIONAL: ONLY USE IF SPACY FAILS TO LOAD LANGUAGE MODEL**
# Use the following command to install spaCy> pip install -U spacyOR> conda install -c conda-forge spacy# Download the following language model and store it in disk
[https://github.com/explosion/spacy-models/releases/tag/en_core_web_md-2.0.0](https://github.com/explosion/spacy-models/releases/tag/en_core_web_md-2.0.0)# Link the same to spacy 
> python -m spacy link ./spacymodels/en_core_web_md-2.0.0/en_core_web_md en_coreLinking successful
    ./spacymodels/en_core_web_md-2.0.0/en_core_web_md --> ./Anaconda3/lib/site-packages/spacy/data/en_coreYou can now load the model via spacy.load('en_core')**

现在让我们加载文本预处理所需的依赖项。我们将从停用词中移除否定词,因为我们希望保留它们,因为它们可能有用,尤其是在情感分析期间****

****❗ 重要提示:很多人给我发消息说无法加载收缩模块。它不是一个标准的 python 模块。我们利用了我的存储库中的[*contractions.py*](https://github.com/dipanjanS/practical-machine-learning-with-python/blob/master/bonus%20content/nlp%20proven%20approach/contractions.py)文件中的一组标准缩写。请将它添加到运行代码的同一个目录中,否则它将不起作用。

******import spacy
import pandas as pd
import numpy as np
import nltk
from nltk.tokenize.toktok import ToktokTokenizer
import re
from bs4 import BeautifulSoup
from contractions import CONTRACTION_MAP
import unicodedata****nlp = spacy.load('en_core', parse=True, tag=True, entity=True)**
#nlp_vec = spacy.load('en_vecs', parse = True, tag=True, #entity=True)
**tokenizer = ToktokTokenizer()
stopword_list = nltk.corpus.stopwords.words('english')
stopword_list.remove('no')
stopword_list.remove('not')******

删除 HTML 标签

通常,非结构化的文本包含许多噪音,尤其是当您使用 web 或屏幕抓取等技术时。HTML 标签通常是对理解和分析文本没有多大价值的组件之一。

******'Some important text'******

从上面的输出可以明显看出,我们可以删除不必要的 HTML 标签,保留任何文档中有用的文本信息。

删除重音字符

通常,在任何文本语料库中,您可能会处理带重音的字符/字母,尤其是当您只想分析英语时。因此,我们需要确保这些字符被转换并标准化为 ASCII 字符。一个简单的例子——将转换成的**。******

****'Some Accented text'****

前面的函数向我们展示了如何轻松地将重音字符转换为正常的英语字符,这有助于标准化我们语料库中的单词。

扩张收缩

缩写是单词或音节的缩写。在英语中,它们通常以书面或口头的形式存在。这些单词的缩短版本或缩写是通过删除特定的字母和声音来创建的。在英语缩写的情况下,它们通常是通过从单词中去掉一个元音而产生的。例如, 不要不要我要我要 。将每个缩写转换为其扩展的原始形式有助于文本标准化。

我们利用了我的库 的 中的[contractions.py](https://github.com/dipanjanS/practical-machine-learning-with-python/blob/master/bonus%20content/nlp%20proven%20approach/contractions.py)文件中的一组标准缩写。

****'You all cannot expand contractions I would think'****

我们可以从前面的输出中看到我们的函数是如何帮助扩展收缩的。有更好的方法吗?肯定!如果我们有足够多的例子,我们甚至可以训练一个深度学习模型,以获得更好的性能。

删除特殊字符

特殊字符和符号通常是非字母数字字符,甚至偶尔是数字字符(取决于问题),这增加了非结构化文本中的额外噪声。通常,可以使用简单的正则表达式(regexes)来删除它们。

****'Well this was fun What do you think '****

我一直在删除可选的数字,因为我们经常需要在预处理的文本中保留它们。

堵塞物

要理解词干,你需要了解词干代表什么。词干也被称为一个单词的 基本形式 ,我们可以通过在词干上附加词缀来创造新单词,这一过程称为词尾变化。考虑**字。可以在上面加上词缀,组成类似 的新词。在这种情况下,基字 就是词干。****

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

Word stem and its inflections (Source: Text Analytics with Python, Apress/Springer 2016)

该图显示了词干是如何出现在所有词形变化中的,因为词干构成了词缀构成每个词形变化的基础。从一个单词的屈折形式获得其基本形式的反向过程被称为。词干分析帮助我们将单词标准化为词根或词根,而不管它们的词形变化,这有助于许多应用,如分类或聚类文本,甚至在信息检索中。现在让我们来看看流行的波特梗!**

***'My system keep crash hi crash yesterday, our crash daili'***

波特词干分析器基于其发明者马丁·波特博士开发的算法。最初,据说该算法总共有五个不同的阶段来减少词干的屈折,每个阶段都有自己的一套规则。

***请注意,词干通常有一套固定的规则,因此,词根可能在词典上不正确。这意味着,*词干单词可能在语义上不正确,可能不在字典中(从前面的输出中可以明显看出)。

词汇化

词汇化与词干化非常相似,我们移除词缀以获得单词的基本形式。然而,这种情况下的基本形式被称为词根,而不是词干。区别在于, 词根总是字典上正确的词 (存在于字典中),但是词根可能不是这样。因此,词根,也被称为 词条 ,将一直存在于字典中。**nltk****spacy**都有优秀的旅鼠。我们将在这里使用**spacy**

***'My system keep crash ! his crash yesterday , ours crash daily'***

你可以看到单词的语义并没有受到影响,然而我们的文本仍然是标准化的。

一定要注意,词干化过程比词干化慢得多,因为当且仅当词条存在于词典中时,词根形式或词条是通过从单词中移除词缀而形成的。

删除停用词

意义不大或没有意义的词,尤其是当从文本构建有意义的特征时,被称为停用词或停用词。如果你在语料库中做一个简单的术语或词频,这些通常是出现频率最高的词。通常,这些可以是冠词、连词、介词等等。停用词的一些例子是an*** 等。*****

****', , stopwords , computer not'****

没有通用的停用词表,但是我们使用来自**nltk**的标准英语停用词表。您还可以根据需要添加自己的特定于领域的停用词。

将所有这些放在一起——构建一个文本规范化器

虽然我们肯定可以继续使用更多的技术,如纠正拼写、语法等,但现在让我们将我们所学的一切集中在一起,并将这些操作链接起来,以构建一个文本规范化器来预处理文本数据。

现在让我们将这个功能付诸实践吧!我们首先将新闻标题和新闻文章文本组合在一起,为每条新闻形成一个文档。然后,我们将对它们进行预处理。

****{'clean_text': 'us unveils world powerful supercomputer beat china us unveil world powerful supercomputer call summit beat previous record holder china sunway taihulight peak performance trillion calculation per second twice fast sunway taihulight capable trillion calculation per second summit server reportedly take size two tennis court',** **'full_text': "US unveils world's most powerful supercomputer, beats China. The US has unveiled the world's most powerful supercomputer called 'Summit', beating the previous record-holder China's Sunway TaihuLight. With a peak performance of 200,000 trillion calculations per second, it is over twice as fast as Sunway TaihuLight, which is capable of 93,000 trillion calculations per second. Summit has 4,608 servers, which reportedly take up the size of two tennis courts."}****

因此,您可以看到我们的文本预处理程序如何帮助我们预处理新闻文章!之后,如果需要,您可以将该数据集保存到磁盘,这样您就可以随时加载它以供将来分析。

****news_df.to_csv('news.csv', index=False, encoding='utf-8')****

理解语言语法和结构

对于任何语言来说,句法和结构通常是密切相关的,其中一套特定的规则、惯例和原则支配着单词组合成短语的方式;短语被组合成从句;从句被组合成句子。在这一部分,我们将专门讨论英语的语法和结构。在英语中,单词通常组合在一起形成其他组成单位。这些成分包括单词、短语、从句和句子。考虑到一个句子, “棕色的狐狸很快,他跳过了懒惰的狗” ,它是由一堆单词组成的,只看单词本身并不能告诉我们太多。

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

A bunch of unordered words don’t convey much information

关于语言的结构和语法的知识在许多领域都是有帮助的,例如文本处理、注释和进一步操作的解析,例如文本分类或摘要。下面提到了理解文本语法的典型解析技术。

  • 词性标注
  • 浅层解析或组块
  • 选区解析
  • 依存解析

我们将在随后的章节中研究所有这些技术。考虑到我们之前的例句 “棕色的狐狸很快,他跳过了懒惰的狗” ,如果我们使用基本的 POS 标签来注释它,它将看起来像下图。

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

POS tagging for a sentence

因此,一个句子通常遵循由以下部分组成的层次结构,

句子→从句→短语→单词

标注词性

词类(POS)是特定的词汇类别,单词根据它们的句法环境和角色被分配到这些词汇类别中。通常,单词可以归入以下主要类别之一。

  • N(oun): 通常指描绘某种物体或实体的词语,可能是有生命的,也可能是无生命的。一些例子是狐狸、狗、书等等。名词的词性标签符号是 N
  • V(erb) :动词是用来描述某些动作、状态或事件的词语。还有各种各样的子类,如助动词、自反动词和及物动词(等等)。一些典型的动词例子有跑、跳、读和写。动词的位置标记符号是 V
  • 形容词 :形容词是用来描述或修饰其他词的词,通常是名词和名词短语。短语“美丽的花”有名词“花”,它是用形容词“美丽的”( ADJ)来描述或限定的。形容词的位置标记符号是 ADJ
  • Adv(erb): 副词通常充当其他词的修饰语,包括名词、形容词、动词或其他副词。非常美丽的花这个短语有副词(ADV)非常,它修饰形容词(ADJ)美丽,表示花美丽的程度。副词的词性标签符号是 ADV

除了这四大类词类之外,在英语中还有其他频繁出现的词类。这些包括代词、介词、感叹词、连词、限定词等等。此外,每个像名词 ( N )这样的词性标签还可以进一步细分为像单数名词(NN)单数专有名词(NNP)复数名词 ( NNS )这样的类别。****

对词性标注进行分类和标注的过程称为词性标注词性标注。词性标签用于注释单词和描述它们的词性,这对于执行特定的分析非常有帮助,例如缩小名词的范围并查看哪些是最突出的,词义消歧和语法分析。我们将利用**nltk****spacy**,它们通常使用 Penn Treebank 符号 进行词性标注。****

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

POS tagging a news headline

我们可以看到,每个库都以自己的方式对待令牌,并为它们分配特定的标签。根据我们所看到的,**spacy**似乎比**nltk**做得稍好。

浅层解析或分块

根据我们前面描述的层次结构,词组构成短语。有五大类短语:

  • 名词短语(NP): 名词充当中心词的短语。名词短语充当动词的主语或宾语。
  • 动词短语(VP): 这些短语是以动词为中心词的词汇单位。通常,动词短语有两种形式。一种形式有动词成分以及其他实体,如名词、形容词或副词,作为宾语的一部分。
  • 形容词短语(ADJP):这些是以形容词为中心词的短语。它们的主要作用是描述或修饰句子中的名词和代词,它们可以放在名词或代词的前面或后面。
  • 副词短语(ADVP): 这些短语的作用像副词,因为副词在短语中充当中心词。副词短语用作名词、动词或副词本身的修饰语,提供进一步的细节来描述或限定它们。
  • 介词短语(PP): 这些短语通常包含一个介词作为中心词,以及其他词汇成分,如名词、代词等。这些就像形容词或副词描述其他单词或短语。

浅层解析,也称为轻型解析或组块,是一种流行的自然语言处理技术,它分析句子的结构,将其分解为最小的成分(即单词等标记),并将它们组合成更高级别的短语。这包括词性标签以及句子中的短语。

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

An example of shallow parsing depicting higher level phrase annotations

我们将利用**conll2000**语料库来训练我们的浅层解析器模型。这个语料库在**nltk**中提供了组块注释,我们将使用 10K 记录来训练我们的模型。一个带注释的句子示例描述如下。

****10900 48
(S
  Chancellor/NNP
  (PP of/IN)
  (NP the/DT Exchequer/NNP)
  (NP Nigel/NNP Lawson/NNP)
  (NP 's/POS restated/VBN commitment/NN)
  (PP to/TO)
  (NP a/DT firm/NN monetary/JJ policy/NN)
  (VP has/VBZ helped/VBN to/TO prevent/VB)
  (NP a/DT freefall/NN)
  (PP in/IN)
  (NP sterling/NN)
  (PP over/IN)
  (NP the/DT past/JJ week/NN)
  ./.)****

从前面的输出中,您可以看到我们的数据点是已经用短语和 POS 标签元数据进行了注释的句子,这将有助于训练我们的浅层解析器模型。我们将利用两个分块实用函数 tree2conlltags 来获取每个标记的单词、标记和块标记三元组,并利用 conlltags2tree 从这些标记三元组生成一个解析树。我们将使用这些函数来训练我们的解析器。下面是一个例子。

****[('Chancellor', 'NNP', 'O'),
 ('of', 'IN', 'B-PP'),
 ('the', 'DT', 'B-NP'),
 ('Exchequer', 'NNP', 'I-NP'),
 ('Nigel', 'NNP', 'B-NP'),
 ('Lawson', 'NNP', 'I-NP'),
 ("'s", 'POS', 'B-NP'),
 ('restated', 'VBN', 'I-NP'),
 ('commitment', 'NN', 'I-NP'),
 ('to', 'TO', 'B-PP'),
 ('a', 'DT', 'B-NP'),
 ('firm', 'NN', 'I-NP'),
 ('monetary', 'JJ', 'I-NP'),
 ('policy', 'NN', 'I-NP'),
 ('has', 'VBZ', 'B-VP'),
 ('helped', 'VBN', 'I-VP'),
 ('to', 'TO', 'I-VP'),
 ('prevent', 'VB', 'I-VP'),
 ('a', 'DT', 'B-NP'),
 ('freefall', 'NN', 'I-NP'),
 ('in', 'IN', 'B-PP'),
 ('sterling', 'NN', 'B-NP'),
 ('over', 'IN', 'B-PP'),
 ('the', 'DT', 'B-NP'),
 ('past', 'JJ', 'I-NP'),
 ('week', 'NN', 'I-NP'),
 ('.', '.', 'O')]****

块标签使用 IOB 格式。这个符号代表内部、外部和开始。标签前的 B 前缀表示它是块的开始,I 前缀表示它在块内。O 标记表示该令牌不属于任何块。如果后面有相同类型的后续标签,并且它们之间没有 O 标签,则总是使用 B 标签。

我们现在将定义一个函数**conll_tag_ chunks()**来从带有分块注释的句子中提取词性和分块标签,以及一个名为**combined_taggers()**的函数来训练多个带有后退标签的标签(例如,一元和二元标签)

我们现在将定义一个类**NGramTagChunker**,它将接受带标签的句子作为训练输入,获取它们的 (单词、词性标签、组块标签) WTC 三元组,并训练一个带有**UnigramTagger****BigramTagger**作为补偿标签。我们还将定义一个**parse()**函数来对新句子进行浅层解析

**UnigramTagger****BigramTagger****TrigramTagger**是继承自基类**NGramTagger**的类,基类本身继承自**ContextTagger**类,而**ContextTagger**类继承自**SequentialBackoffTagger**类。

我们将使用这个类在**conll2000**分块**train_data**上训练,并在**test_data**上评估模型性能

****ChunkParse score:
    IOB Accuracy:  90.0%%
    Precision:     82.1%%
    Recall:        86.3%%
    F-Measure:     84.1%%****

我们的分块模型获得了大约 90%的准确率,这是非常好的!现在让我们利用这个模型来浅层解析和分块我们之前使用的样本新闻标题, “美国推出世界上最强大的超级计算机,击败中国”。

****chunk_tree = ntc.parse(nltk_pos_tagged)
print(chunk_tree)****Output:
-------
(S
  (NP US/NNP)
  (VP unveils/VBZ world's/VBZ)
  (NP most/RBS powerful/JJ supercomputer,/JJ beats/NNS China/NNP))****

因此,您可以看到它在新闻文章中识别了两个名词短语(NP)和一个动词短语(VP)。每个单词的词性标签也是可见的。我们也可以用如下的树形图来形象化这一点。你可能需要安装ghostscript,以防**nltk**抛出错误。

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

Shallow parsed news headline

在对新闻标题进行浅层解析后,前面的输出给出了很好的结构感。

选区分析

基于成分的语法用于分析和确定句子的成分。这些语法可以用来根据句子成分的层次有序结构来模拟或表示句子的内部结构。每个词通常都属于特定的词汇范畴,并构成不同短语的中心词。这些短语是基于称为短语结构规则的规则形成的。**

短语结构规则 构成了选区语法的核心,因为它们讲述了支配句子中各种成分的层次和顺序的语法和规则。这些规则主要迎合两件事。

  • 他们决定用什么词来构成短语或成分。
  • 它们决定了我们需要如何排列这些成分。

短语结构规则的通称是 S → AB ,描绘出结构 S 由成分B 组成,排序为 A 后接 B 。虽然有几个规则(参考第 1 章,第 19 页:使用 Python 的文本分析,如果你想更深入地研究),但最重要的规则描述了如何划分一个句子或从句。短语结构规则将一个句子或从句的二元划分表示为 S → NP VP 其中 S 是句子或从句,它分为主语,由名词短语( NP 表示)和谓语,由动词短语( VP 表示)。**

可以基于这样的语法/规则来构建选区分析器,这些语法/规则通常作为上下文无关语法(CFG)或短语结构语法来共同使用。解析器将根据这些规则处理输入的句子,并帮助构建解析树。

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

An example of constituency parsing showing a nested hierarchical structure

我们将在这里使用**nltk****StanfordParser**来生成解析树。

先决条件:这里 下载斯坦福官方解析器,貌似效果还不错。你可以通过访问 这个网站 并查看发布历史部分来试用更高版本。下载后,将其解压缩到文件系统中的一个已知位置。一旦完成,您现在就可以使用来自**nltk**的解析器了,我们将很快对此进行探讨。

斯坦福解析器一般使用 PCFG(概率上下文无关语法)解析器 。PCFG 是一种上下文无关的语法,它将概率与其每个产生式规则相关联。从 PCFG 生成解析树的概率就是用来生成解析树的各个产品的概率的乘积。

******(ROOT
  (SINV
    (S
      (NP (NNP US))
      (VP
        (VBZ unveils)
        (NP
          (NP (NN world) (POS 's))
          (ADJP (RBS most) (JJ powerful))
          (NN supercomputer))))
    (, ,)
    (VP (VBZ beats))
    (NP (NNP China))))******

我们可以看到新闻标题的选区解析树。让我们把它形象化,以便更好地理解结构。

******from IPython.display import display
display(result[0])******

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

Constituency parsed news headline

与浅层解析中的平面结构相比,我们可以看到前面输出中成分的嵌套层次结构。如果你想知道 SINV 是什么意思,它代表一个倒置的陈述句,即主语跟随时态动词或情态动词的句子。根据需要参考 Penn Treebank 参考 查找其他标签。**

依存句法分析

在依存分析中,我们尝试使用基于依存的语法来分析和推断结构和语义依存关系以及句子中标记之间的关系。依存语法背后的基本原理是,在语言的任何句子中,除了一个词之外,所有的词都与句子中的其他词有某种关系或依存关系。没有依存关系的词叫做句根。在大多数情况下,动词被当作句子的词根。所有其他的单词都使用连接直接或间接地连接到词根动词,这就是依存关系。**

考虑到我们的句子 “棕色的狐狸很快,他跳过了懒惰的狗” ,如果我们想为此绘制依存句法树,我们将有这样的结构

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

A dependency parse tree for a sentence

这些依赖关系都有自己的含义,是通用依赖类型列表的一部分。这在一篇原创论文中讨论过, 德马尔内菲等人 2014 年 的《普遍斯坦福依赖:跨语言类型学》。你可以在这里 查看依赖类型及其含义的详尽列表

如果我们观察其中的一些依赖关系,就不难理解它们。

  • 依存标签det非常直观——它表示名词中心语和限定词之间的限定词关系。通常,带有 POS 标签 DET 的单词也会有 det 依存标签关系。例子有**fox → the****dog → the********
  • 依存标签 amod 代表形容词修饰语,代表任何修饰名词意思的形容词。例子有**fox → brown****dog → lazy**
  • 依存标签 nsubj 代表在从句中充当主语或施事的实体。例子包括**is → fox****jumping → he**
  • 依存关系 ccconj 更多的是与并列连词连接的词语相关的联系。例子包括**is → and****is → jumping**
  • 依存标记 aux 表示从句中的助动词或次要动词。例子:**jumping → is**
  • 依存标签 acomp 代表形容词补语,在句子中充当动词的补语或宾语。例子:**is → quick**
  • 依存标签 prep 表示介词修饰语,通常修饰名词、动词、形容词或介词的意思。通常,这种表示法用于带有名词或名词短语补语的介词。举例:**jumping → over**
  • 依存标记 pobj 用来表示介词的宾语。这通常是句子中介词后面的名词短语的中心。例子:**over → dog**

Spacy 根据你使用的语言模型有两种类型的英语依存解析器,你可以在这里 找到更多细节 。基于语言模型,可以使用 通用依赖方案 或者 清晰样式依赖方案 现在 NLP4J 中也有了。我们现在将利用**spacy**并打印出新闻标题中每个标记的依赖关系。

***[]<---US[compound]--->[]
--------
['US']<---unveils[nsubj]--->['supercomputer', ',']
--------
[]<---world[poss]--->["'s"]
--------
[]<---'s[case]--->[]
--------
[]<---most[amod]--->[]
--------
[]<---powerful[compound]--->[]
--------
['world', 'most', 'powerful']<---supercomputer[appos]--->[]
--------
[]<---,[punct]--->[]
--------
['unveils']<---beats[ROOT]--->['China']
--------
[]<---China[dobj]--->[]
--------***

很明显,动词 beats 是词根,因为与其他标记相比,它没有任何其他依赖性。要了解每个注释的更多信息,您可以随时参考 清除依赖方案 。我们也可以用更好的方式来可视化上面的依赖关系。

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

News Headline dependency tree from SpaCy

您还可以利用**nltk****StanfordDependencyParser**来可视化和构建依赖树。我们展示了依赖树的原始形式和注释形式,如下所示。

***(beats (unveils US (supercomputer (world 's) (powerful most)))  
 China)***

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

Dependency Tree visualizations using nltk’s Stanford dependency parser

您可以注意到与我们之前获得的树的相似之处。注释有助于理解不同令牌之间的依赖类型。

命名实体识别

在任何文本文档中,都有代表特定实体的特定术语,这些术语提供更多信息,并具有独特的上下文。这些实体被称为命名实体,更具体地说,命名实体是指表示真实世界对象的术语,如人、地点、组织等,它们通常由专有名称表示。一种简单的方法是通过查看文本文档中的名词短语来找到它们。命名实体识别(NER),也称为实体分块/提取,是一种在信息提取中使用的流行技术,用于识别和分割命名实体,并根据各种预定义的类别对它们进行分类或归类。

SpaCy 拥有一些优秀的命名实体识别能力。让我们试着在我们的一篇样本新闻文章中使用它。

***[(US, 'GPE'), (China, 'GPE'), (US, 'GPE'), (China, 'GPE'), 
 (Sunway, 'ORG'), (TaihuLight, 'ORG'), (200,000, 'CARDINAL'), 
 (second, 'ORDINAL'), (Sunway, 'ORG'), (TaihuLight, 'ORG'), 
 (93,000, 'CARDINAL'), (4,608, 'CARDINAL'), (two, 'CARDINAL')]***

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

Visualizing named entities in a news article with spaCy

我们可以清楚地看到主要的命名实体已经被**spacy**识别。要更详细地了解每个命名实体的含义,您可以参考文档或查看下表。

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

Named entity types

现在让我们找出新闻语料库中最常见的命名实体!为此,我们将使用以下代码构建一个包含所有命名实体及其类型的数据框架。

现在,我们可以转换和聚合该数据框,以找到出现次数最多的实体和类型。

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

Top named entities and types in our news corpus

你注意到什么有趣的事情了吗? ( 提示: 也许是川普和金仲翀之间所谓的峰会吧!)。我们还看到它正确地将“Messenger”识别为一种产品(来自脸书)。

我们还可以根据实体类型进行分组,以了解什么类型的实体在我们的新闻语料库中出现得最多。

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

Top named entity types in our news corpus

我们可以看到,人、地点和组织是提到最多的实体,但有趣的是,我们还有许多其他实体。

另一个不错的 NER 标签是可从**nltk**界面获得的**StanfordNERTagger**。为此,您需要安装 Java,然后下载斯坦福 NER 资源。将它们解压缩到您选择的位置(我在系统中使用了E:/stanford)。**

斯坦福的命名实体识别器 基于线性链条件随机场(CRF)序列模型的一种实现。遗憾的是这个模型只在 组织* 和 位置 类型的实例上训练。下面的代码可以作为一个标准的工作流程,帮助我们使用这个标签提取命名实体,并显示顶级命名实体及其类型(提取与**spacy**略有不同)。*****

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

Top named entities and types from Stanford NER on our news corpus

我们注意到非常相似的结果,尽管仅限于三种类型的命名实体。有趣的是,我们在各种运动中看到许多提到的几个人。

情感和情绪分析

情感分析可能是 NLP 最受欢迎的应用之一,有大量的教程、课程和应用程序专注于分析从公司调查到电影评论等不同数据集的情感。情感分析的关键方面是分析一个文本体,以理解它所表达的观点。通常,我们用一个正值或负值来量化这种情绪,称为总体情绪 往往从极性得分的符号推断为中性负*。*****

通常,情感分析对有主观背景的文本比对只有客观背景的文本效果更好。客观文本通常描述一些正常的陈述或事实,而不表达任何情绪、感受或心情。主观文本包含通常由具有典型情绪、情感和感觉的人表达的文本。情绪分析被广泛使用,尤其是作为社交媒体分析的一部分,用于任何领域,无论是商业、最近的电影还是产品发布,以了解人们对它的接受程度,以及他们根据自己的意见或,你猜对了,情绪对它的看法!

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

通常,对文本数据的情感分析可以在几个级别上进行计算,包括在单个句子级别、段落级别或者作为整体的整个文档。通常,情感是作为一个整体在文档上计算的,或者在计算了单个句子的情感之后进行一些聚合。有两种主要的情感分析方法。

  • 监督机器学习或深度学习方法
  • 无监督的基于词典的方法

对于第一种方法,我们通常需要预先标记的数据。因此,我们将关注第二种方法。关于情感分析的全面覆盖,请参考 第七章:分析影评情感 用 Python 进行实用机器学习,Springer\Apress,2018 。在这种情况下,我们没有标记良好的训练数据集的便利。因此,我们将需要使用无监督的技术来预测情感,通过使用知识库、本体、数据库和词典,它们具有详细的信息,专门为情感分析而策划和准备。词典是字典、词汇或一本单词书。在我们的例子中,词典是为分析情感而创建的特殊词典或词汇。这些词典中的大多数都有一个正负极性单词的列表,这些单词都有一些与之相关的分数,并且使用各种技术,如单词的位置、周围的单词、上下文、词性、短语等等,分数被分配给我们想要计算情感的文本文档。汇总这些分数后,我们得到最终的情感。

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

各种流行的词汇被用于情感分析,包括如下。

这不是可以用于情感分析的词汇的详尽列表,还有几个其他的词汇可以很容易地从互联网上获得。请随意查看这些链接并探索它们。我们将在这一部分讨论两种技术。

基于 AFINN 词典的情感分析

AFINN 词典 也许是最简单和最流行的词典之一,可以广泛用于情感分析。由 Finn RUP Nielsen 开发和策划,你可以在论文“一个新的新的:评估用于微博情感分析的单词列表”,ESWC 2011 研讨会的会议录中找到关于这个词汇的更多细节。词典的当前版本是 AFINN-en-165。txt 你可以在作者的 官方 GitHub 知识库 中找到这本词典,以及它以前的版本,包括AFINN-111。作者还在此基础上用 Python 创建了一个很好的包装器库,名为**afinn**,我们将使用它进行分析。******

下面的代码计算所有新闻文章的情绪,并显示每个新闻类别的一般情绪的汇总统计。

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

我们可以很好地了解不同新闻类别的总体情绪统计。貌似一般人气在 体育 很正,在 科技 相当负!现在让我们来看一些可视化。

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

Visualizing news sentiment polarity

我们可以看到,与相比,在 体育世界 中,情绪极性的传播要高得多,在那里,许多文章似乎都具有负极性。我们也可以将情感标签的频率可视化。**

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

Visualizing sentiment categories per news category

毫无疑问, 技术 的负面文章最多,而 世界 的正面文章最多。 体育 可能会有更多中性的文章,这是因为存在本质上更客观的文章(谈论体育赛事而不存在任何情绪或感觉)。下面就让我们深入探讨一下 科技 新闻最正反的情绪新闻文章。

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

看起来最负面的文章是关于最近在印度的智能手机骗局,最正面的文章是关于在自动驾驶班车上结婚的比赛。有意思!让我们对 世界 新闻做一个类似的分析。

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

有趣的是,特朗普同时出现在最积极和最消极的 世界 新闻文章中。请务必阅读这些文章,从更多的角度了解为什么模型选择了其中一个作为最负面的,而另一个作为最正面的(这并不奇怪!).

使用 TextBlob 进行情感分析

text blob是另一个用于轻松执行 NLP 任务的优秀开源库,包括 情感分析 。它也是一个 情感词典 (以 XML 文件的形式),它利用它来给出极性和主观性分数。通常,与 Afinn 相比,分数具有标准化的标度。 极性 分数在**[-1.0, 1.0]**范围内浮动。 主观**[0.0, 1.0]**范围内浮动,其中**0.0**非常客观**1.0**非常主观。现在让我们使用它来获取每篇新闻文章的情感极性和标签,并汇总每个新闻类别的汇总统计数据。****

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

貌似平均人气在 世界 最正,在 科技 最不正!然而,这些指标可能表明模型预测更多的文章是正面的。我们来看每个新闻类别的情绪频率分布。

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

Visualizing sentiment categories per news category

与我们之前的模型相比,这里的新闻类别中肯定有更多积极的文章。然而,看起来科技仍然有最多的负面文章和世界上最多的正面文章,这与我们之前的分析相似。让我们现在做一个对比分析,看看我们是否还能在 世界 新闻的最正面和最负面类别中获得类似的文章。

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

嗯,看来这里最负面的 世界 新闻文章比我们上次看到的还要压抑!最积极的文章仍然与我们在上一个模型中获得的相同。

最后,我们甚至可以在这两个模型之间评估和比较有多少预测是匹配的,有多少是不匹配的(通过利用分类中经常使用的混淆矩阵)。为此,我们利用我们漂亮的**model_evaluation_utils**模块。

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

Comparing sentiment predictions across models

在上表中, 【实际】 标签是来自 Afinn 情感分析器的预测,而 【预测】 标签是来自**TextBlob**的预测。看来我们之前的假设是正确的。**TextBlob**明确预测几篇中性阴性的文章为阳性。总的来说,大多数情绪预测似乎是匹配的,这很好!****

结论

这绝对是我的长篇文章之一!如果你正在读这篇文章,我真的很感谢你一直陪我读到这篇文章的结尾。这些例子应该让你很好地了解如何开始使用文本文档的语料库,以及用于文本检索、预处理、解析、理解结构、实体和情感的流行策略。在本系列的下一篇文章中,我们将通过实际例子介绍特征工程和表示技术。敬请期待!

本文使用的所有代码和数据集都可以从我的 GitHub 中访问

该代码也可作为 Jupyter 笔记本

我经常指导和帮助 跳板 的学生学习数据科学方面的基本技能。感谢 他们 帮我开发这个内容。如果你对学习数据科学的职业结构化道路感兴趣,一定要去看看 Springboard 的 DSC 训练营

**** [## 数据科学职业轨迹|跳板

数据科学职业跟踪是您进入数据科学职业的跳板。在线导师指导训练营,旨在获得…

www.springboard.com](https://www.springboard.com/workshops/data-science-career-track)

这些代码中有很多来自我在写书 “用 Python 进行文本分析” 期间所做的研究和工作。代码在 GitHub 上开源。 (Python 3.x 版将于今年年底推出!)

[## 使用 Python 进行文本分析——一种实用的现实方法,可以从以下方面获得可操作的见解…

使用 Python 从数据中获得有用的见解。您将学习基本和高级概念,包括文本和…

www.springer.com](https://www.springer.com/us/book/9781484223871)

《用 Python 进行实用的机器学习》 ,我的另一本书也详细涉及了文本分类和情感分析。为了您的方便,代码在 GitHub 上开源。

[## 使用 Python 的实用机器学习–构建真实世界的问题解决者指南…

掌握识别和解决复杂问题所需的基本技能与机器学习和深度学习在…

www.springer.com](https://www.springer.com/us/book/9781484232064)

如果你对我的文章或数据科学有任何反馈、评论或有趣的见解要分享,请随时通过我的 LinkedIn 社交媒体频道联系我。

[## Dipanjan Sarkar -数据科学家-英特尔公司| LinkedIn

查看 Dipanjan Sarkar 在世界最大的职业社区 LinkedIn 上的个人资料。Dipanjan 有 6 份工作列在…

www.linkedin.com](https://www.linkedin.com/in/dipanzan/)

感谢 杜巴 编辑本文。****

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值