糖、花、鱼还是沙砾——现在是一场混战
我非常高兴地宣布我们的 Kaggle 竞赛“从卫星图像中了解云”开始了。这场比赛是几十名科学家数百个小时的辛勤劳动的结晶。挑战在于将卫星图像分成四类。通常,当我们想到不同类型的云时,我们会想到积云、层云和卷云。然而,这个挑战中的四个类别被称为糖、花、鱼和砾石。那么,这些到底是什么?
这一切都始于大约两年前的一个研讨会,12 名云专家聚在一起讨论海洋上空的浅云。与大雷暴相比,这些云看起来是良性的,但事实上,它们对地球的气候起着巨大的作用。原因是它们将大量的阳光反射回太空,从而使我们的星球变冷,同时对温室效应的影响很小。这意味着弄清楚这些云将如何随着我们的星球变暖而变化非常重要。然而,目前的气候模型却难以应对。他们甚至不同意这些浅云是多还是少。
部分原因是浅云不仅仅是全球大气环流的结果。相反,他们有自己的生活,并以各种方式安排自己。对于其中的许多模式,其背后的基本机制知之甚少。这让我们回到我们的科学家小组。当他们浏览数百张类似本页所示的卫星图像时,他们注意到一些结构比其他结构出现得更频繁。经过一番讨论,他们商定了四种常见的图案,并分别命名为糖、花、鱼和砾石。
为了找到更多关于这四种模式的信息,我们需要更多的数据。为了获得这些数据,我们在 Zooniverse 上建立了一个众包项目,科学家可以在这个平台上创建自己的标签界面。为了我们的项目,我们去了 NASA Worldview ,下载了来自大西洋和太平洋三个地区的 10,000 幅卫星图像,这些地区的云型经常出现。在 Zooniverse 界面上,用户会看到一幅随机图像,并被要求在云结构周围画出方框。
2018 年 11 月,我们在汉堡的马克斯·普朗克气象学研究所和巴黎的气象动态实验室组织了云标签日。在那里,整个部门,总共大约 70 名科学家,花了一整天的时间标记总共超过 30,000 张图片。这意味着,对于每张图片,我们都有来自三个人的标签。
这个项目有趣的部分原因是标签是主观的。一个人的糖可能是另一个人的沙砾。换句话说,不存在客观真实。我们可以问的第一个问题是,人们在多大程度上同意这些课程。事实证明,人们对大约 40%的标签表示赞同。乍一看,这似乎并不多,但是请记住,这是一个非常主观的任务。从另一个角度来看,有 80%的可能性,至少有三分之一的人同意你的判断。
现在我们有了这个大的手绘数据集,我们可以用它做什么呢?首先,我们可以通过检查它们的出现如何与大规模流动相关联来分析云模式背后的物理机制。但是,尽管累计花费了 250 个小时进行标记,这些数据只覆盖了全球一小部分时间的一小部分。我们希望扩大我们的分析规模,深度学习是实现这一目标的完美工具。
出于这个原因,我们现在向 Kaggle 社区提出挑战,要求建立一个基于人类标签的机器学习模型。有了这样的算法,我们就能够将我们的分析扩展到世界的不同地方。我们真的很期待看到 Kagglers 会选择什么样的预处理和模型构建方法。
除了获得一个好的预测模型,我们还希望提高对气候科学家日常处理的问题类型的认识。最后,我们希望做出更好的预测,但首先需要更好地理解地球系统的物理过程。理解云是如何组织的就是这样一个例子。我们希望现代机器学习技术能够以前所未有的方式加速我们的研究。
最后,我要感谢让这一切成为可能的每一个人:Hauke Schulz,Sandrine Bony,Bjorn Stevens,当然还有所有的云贴标机!
要获得描述众包活动的论文预印本和更多关于科学背景的信息,请点击 此处 。
众包平台仍在运行。所以如果你想自己尝试给一些云贴标签,点击 这里 。
最后, 这个 就是 Kaggle 比赛了。
糖滑翔机,自闭症,枪支暴力和牙膏
为什么每个作家都需要对统计学有一个基本的了解
统计数据讲故事。人们喜欢故事。
这就是为什么作家喜欢在他们的作品中加入统计数据——统计数据可以用一种可量化的、可捕捉的、有感染力的方式捕捉有趣的事实。就像我告诉你的,在 2014 年的一项研究中,11%的人认为网络语言 HTML 是一种性病。
添加到你工作中的天赋和可信度的因素可能是好的也可能是坏的。这完全取决于你的统计数据有多准确。
如果您不正确地使用统计数据,或者如果统计数据一开始就是错误的,您可能会误导读者。当涉及到引用统计数据时,我也有过自己的混乱——对此我已经得到了纠正。我希望保持这种状态。
但对于作家来说,驾驭统计语言并非易事。我在大学里上过统计学课,真是太幸运了:)。这里有一些在引用统计数据时需要注意的事情,这样你就不会把键盘放在嘴里。
1.知道你的百分比
我已经纠正了百分比变化和百分点变化之间令人困惑的区别。你可能犯了同样的错误。让我们考虑一个假设的研究来梳理我们的错误。
假设科学家们正试图确定在项链袋中携带一架糖滑翔机是否有益于心理健康。我们想象中的科学家发现,82%的玩了一天糖滑翔机的人认为自己是快乐的,相比之下,50%的人没有在脖子上挂着可爱的哺乳动物闲逛。(让我们假设研究人员完成了所有关于统计意义的花哨计算,一切都一清二楚)。
在这种情况下,说有人拥有一架糖滑翔机会快乐 32%准确吗?
不。这些百分比是概率的指示。本质上,科学家们说,基于这个实验,携带糖滑翔机的人有更高的概率认为自己快乐(82%的概率对 50%)。
所以因为我们在谈论概率,我们可以说如果一个人随身携带一架糖滑翔机,他快乐的可能性会增加 32%?
也没有。
“什么?!"让我解释一下。
百分比增长和百分比*点的增长是有区别的。*百分点的增加更直观,在这种情况下,我们看到了 32 个百分点的增加。
另一方面,百分比增长指的是从原始状态的度量(在本例中是一个比例,50%)到一个新值(82%)的变化。假设我们说快乐的原始可能性是 50%(对于那些没有糖滑翔机的悲伤的人来说),32 个百分点点的增加实际上是 64%的增加,因为 32%是 50%的 64%。
很多官样文章,我知道。有一种更好的方式来思考这个问题——不是从比例的变化来看(例如,50%的人说他们很快乐),而是从数量变量的变化来看(例如,每个人在 1-10 的范围内给自己的快乐评分)。
如果在携带糖滑翔机时,平均幸福指数(从 1 到 10)从 6 到 9,3 的变化将增加 3 个评价点,代表幸福指数增加 50%(变化/原始测量值 3/6 = 0.5 或 50%)。
在这种情况下,可以准确地说,平均而言,带着糖滑翔机的人要快乐 50%,因为测量结果量化了快乐。在这种情况下,50%的增长更直观。
这是我最近在的一份销售支持报告中遇到的一个极好的例子:
2.不要引用引用者
统计数据很有趣,所以我们喜欢在写作中加入它们。所以我们跳到谷歌上,搜索“ x 统计”,试图找到关于 x 话题的有趣信息。这是一个完全合法的做法,但有一些事情你需要注意。
我称之为:引用引语。
其他像你一样的作家在他们的作品中引用统计数据。当你在谷歌上搜索的时候,你可能会找到他们的一些作品,并在这里或那里微妙地加入一些统计数据。虽然作者的统计数据可能是准确的,但你应该避免直接引用它们。这里有几个原因。
1.电话效应
统计数据在上下文中是强大的,但是当你把它们从上下文中移走时,它们就会失去一些意义。想想我们在小学玩的电话游戏:当一个基本短语被传来传去时,它会被无意地(或者有时是有意地)改变,最终产生一个有趣的新短语。
有了统计数据,这种变化就没那么有趣了。
就像电话游戏一样,你离原始来源越远,就越有可能得到原始统计数据的错误版本。
2.统计数据可能已经过时了
很少看到日期贴在统计数据旁边。因此,如果你引用报价者,你就冒着处于报价者引用报价者的菊花链末端的风险。因此,您可能会引用已经过时并且已经被揭穿的统计数据。2018 年发表的文章不代表其统计数据来自同一年。
这里有一个例子《福布斯》2018 年的一篇文章引用了他们说是 2017 年的一项统计数据,但他们链接的文章是 2015 年的。
如果一定要引用报价者,尽量离数据源只有一步之遥。这可能是你的最佳选择,因为实际的研究可能只是原始数据,然后其他人会获取数据并使用它。因为你是作家,不是统计学家,这可能是你最好的事实来源。
3.正偏压
疫苗会导致自闭症吗?有人说是,有人说不是,科学家怎么说?没有。
但是,尽管自 2010 年撤回伪造的 1998 年研究表明 MMR 疫苗和自闭症之间的联系已经过去了几年,但并不是每个父母都相信。
为什么?因为正偏。
积极偏见指的是“对发表有积极(重大)结果的研究的偏好,而不是平淡或消极的结果。”出版商和读者希望分享看似多事之秋的事情。由于这种偏好,积极的偏见可以创造一个分享循环,在这个循环中,重要的信息——尽管可能不是真的——可以迅速获得大量的宣传。
所以作家需要小心。特别是在为有议程的客户写作时,很容易只找到与我们的信息相匹配的统计数据(这正是前任——强调“前任”——研究员安德鲁·韦克菲尔德在他的自闭症研究中所做的)。
这是一个危险的游戏。每个人都有权利提出论点,但是一个有道德的作者会考虑各种各样的研究,或者至少在做出一个有潜在严重后果的大胆断言之前限定他们的陈述。
4.统计数据可能会误导人
拷问数据,它会告诉你任何你想要的东西。作者需要警惕潜在的数据滥用,统计数据可能是真实的,但结果可能完全是误导。这里有一些例子。
抽样误差
统计学的美妙之处在于,你不需要从一个群体中的每个个体那里获得信息,就能知道一个群体的特征。相反,您可以提取一个样本,并基于该样本对总体进行推断。
这里的技巧是,为了具有代表性,样本应该相对较大并且是随机选择的。下面是一些你应该注意的错误的采样方法。
错误的采样方式
**方便取样。**使用公司的电子邮件列表进行调查是一个便利示例。这并不意味着你不能使用电子邮件列表来了解消费者的偏好。但是如果你打算公布这些信息,你需要明确研究的范围。
例如,如果你的公司调查中有 51%的受访者说他们更喜欢巧克力冰淇淋,你不能说所有人中有 51%喜欢巧克力。只有你的观众。
**配额抽样。**像便利抽样一样,配额抽样发生在研究者不随机选择受试者的时候。相反,研究人员选择第一个进门的,并(错误地)假设这将产生一个有代表性的样本。
志愿者取样。当人们自愿参加一项研究时,你需要对结果保持警惕。自愿提供信息的人可能与不提供信息的人有很大不同,所以你的样本可能不具有代表性。
如果你曾经遇到过任何关于抽样的问题,请忽略这些信息。
平均值与中间值
均值和中位数是小学的话题。然而,这些简单的概念是误导读者的最佳方式,并且经常被故意用来误导读者。
简单回顾一下,均值和中位数表示数据集的中心。A 平均值是平均值:将一组中每个个体的某个特定特性的所有值相加,然后除以个体数量。中值是中间值:根据一个定量变量将每个人排序,然后找到正好在中间的人。
数据的分布方式将决定是平均值还是中间值更适合测量中心。
分布:正态、右偏、左偏
一个正态分布是你的标准钟形曲线,其中大多数数据点聚集在平均值周围,然后它们随着远离平均值而减弱。
Courtesy of Data Science Central
当数据呈正态分布时,平均值或中值将是中心的良好度量(因为它们应该大致相同)。但是当数据不是正态分布时(意味着它是右偏或左偏的),你就需要小心了。
Courtesy of Data Science Central
右偏数据集是指其大部分数据聚集在左侧的数据集,其中一些数据偏右,使平均值向更高的值倾斜。
右偏数据的一个好例子是美国的收入。大多数人挣不到 10 万美元,但有些人挣得更多,少数人挣得更多。由于存在异常值,使用平均值无法精确测量中心值,因此中值更可取。在收入报告中,美国人口普查局甚至没有提供平均值,只有中位数(2016 年为 59039 美元)。在这种情况下,平均收入会产生误导。
一个左偏数据集是一个其大部分数据聚集在右侧的数据集,其中一些数据远离左侧,使平均值向较低值倾斜。
左偏数据的一个例子是退休年龄。随着年龄的增长,人们越来越倾向于退休,但也有少数幸运者早早地发了财,早早地退休到他们在加勒比海的私人岛屿上。在美国,平均退休年龄和中位退休年龄之间的差别并不大:平均退休年龄是 59.88 岁,中位退休年龄是 62 岁。很接近,但仍然是不同的故事。
(注意:以上是引用者的一级引用示例,其中我依赖其他人查看原始数据并进行他们自己的评估;)).
5.研究与实验
你可能听说过“相关性并不意味着因果关系”的说法(也许是在政治舞台上)这到底是什么意思?
当研究人员得出结论,两个定量变量往往一起波动,这种关系被认为是一种相关性。例如,冰淇淋销售往往与温度成正相关——温度越高,冰淇淋销售越多。
这个简单的例子可能意味着更高的温度会导致更高的冰淇淋销量(事实很可能如此)。但是一个统计学家不能仅凭数据研究就这么说。仅仅因为两个变量相关,并不意味着一个导致另一个。
例如,掉进游泳池淹死的人数与尼古拉斯·凯奇每年出演的电影数量相关:
Courtesy of Spurious Correlations
你认为你能证明是一个导致了另一个吗?大概不会。
但是还有不太明显的例子。一篇文章(错误地)引用了一项研究,该研究发现教师工资和学生表现之间存在关联,认为提高工资会导致教师表现的提高。
虽然这可能是真的,但也可能不是——因为相关性并不意味着因果关系。有没有可能存在一些未知的变量——也许收入更高的教师生活在更先进的国家,因此更有可能教出更好的学生?一些值得思考的事情。(更不用说这篇文章是引用引用者的教科书式的例子了。随便说说。)
6.错误的调查结构
糟糕的调查结构也会产生误导性的统计数据。一个众所周知的罪魁祸首是高露洁。
一则高露洁广告称 80%的牙医推荐高露洁。这是一个相当可观的数字——所以只有 20%的牙医推荐高露洁以外的牙膏?
没有。调查的方式是,牙医被允许选择他们推荐的多种牙膏。因此,推荐高露洁的牙医也可以推荐佳洁士、Aquafresh、Pepsodent、Aim 和其他产品。
80%的牙医可能会推荐任何对你有益的产品,所以这不是一个很有帮助的数字。完全准确,只是没什么帮助。如果可能的话,对调查是如何进行的保持警惕。
7.误导性措辞
一项统计数据的措辞方式可能会使其误导,但不会是虚假的。
一个例子是联邦调查局的尼克·施罗尔在引用的话,他说 2016 年联邦调查局制服犯罪报告显示,“被刺死的人数是被任何类型的步枪杀死的人数的四倍多。”我不确定这里的数字(因为我引用了引用者的话),但不管怎样,措辞值得一看。
第一印象?除非你意识到“任何种类的步枪”和“枪支”之间的微妙区别,否则你可能会将这些说法解读为人们死于枪支暴力的可能性低于死于刺伤的可能性。推而广之,你可能会得出这样的结论:我们应该把精力重新放在遏制持刀暴力上,而不是枪支暴力上,如果你只看数字,这不是一个合理的决定。
把你的数据弄清楚
这可能比你作为一个作家所希望看到的更多的统计信息。但是我希望这个信息能被理解:数据是强大的,不管是好的还是不好的。
好好使用它们,不仅仅是因为你想让你的内容看起来更好或者表达一个观点。
用错了,可能会适得其反。
如果你看过任何糟糕的统计数据,请在下面评论。我很想看看他们!
暗示性计算机辅助设计
通过机器学习辅助设计
斯塔尼斯拉斯 ChaillouT4T8 |哈佛设计研究院| 2018 年春季
协同 托马斯·特雷诺
T **基于机器的推荐已经在无数行业得到了应用,从网络上的暗示性搜索到图片股票图像推荐。**作为推荐引擎的核心,它可以在海量数据库中查询相关信息文本、图像等*,并在用户与给定界面交互时呈现给用户。随着当今大型 3D 数据仓库的聚合,架构&设计可以从类似实践中受益。*
实际上,我们专业的设计过程大多是通过 3D 软件rhino 3D、Maya、3DSmax、AutoCAD* 等进行的。建筑师无论是通过 CAD 软件计算机辅助设计还是如今的 BIM 引擎建筑信息建模不断地将自己的意图转化为三维空间中的线和面。建议相关的 3D 对象,取自外部数据源,可能是一种方式,以加强他们的设计过程。*
这就是本文的目的:**研究并提出一种辅助设计师的方法,通过暗示造型*。*随着建筑师在 3D 空间中作画,一系列基于机器学习的分类器将能够搜索相关建议并提出替代、相似或互补的设计选项。
为此,我们从 3D 形状识别与分类领域的先例中汲取灵感,建立了一套能够在设计者绘图时向他们推荐模型的方法和工具集。实际上,我们的目标有两个: (1)利用预先建模的建议加快 3D 建模过程,而则通过替代或互补的设计选项激励设计师。
卷积神经网络
Figure 1: Convolutional Neural Network Architecture | Source: 3b1b
能够查询与用户绘制的设计特征相匹配的 3D 对象依赖于特征比较。远离标准的几何描述性度量,卷积神经网络(CNN)提供了一种简化且更全面的比较形状的选项。
CNN 不是匹配简单的指标——也称为特征提取*——而是将图像作为输入,将像素表示传递给一连串的“神经元”(图 1 )。CNN 模型调整每个神经元的权重,同时在其最后一层输出预测。通过训练和验证的连续阶段,我们能够估计模型的准确性,并进一步调整权重以最大化准确性。一旦充分训练,CNN 模型将预测给定对象图像表示的“类”或类别。*
这种类型的网络是机器学习的标准实践,本身并不代表突破或复杂的架构。然而,它仅基于空间特征建立一定数量的直觉的能力比我们的应用更相关:公开可用的 3D 对象的格式异构性使得特征提取和元数据比较成为一个具有挑战性的过程。能够使用图像简单地从它们的拓扑特征来考虑对象,为我们提供了一个用于 3D 形状比较和检索的健壮的统一框架。
一.先例
***我们的工作建立在 3 个主要研究项目之上,这些项目最近构建了 3D 对象识别和分类领域。*这些论文揭示了卷积作为理解&描述 3D 形状的理想工具的相关性。
【1】用于 3D 形状识别的多视角卷积神经网络
*这第一篇论文**【1】*提出了一个标准的 CNN 架构,该架构被训练来识别彼此独立的形状的渲染视图,并表明甚至可以以远高于使用最先进的 3D 形状描述符的准确度从单个视图识别 3D 形状。当提供形状的多个视图时,识别率进一步增加。
Figure 2: Multi-view CNN for 3D shape recognition | Source: link
此外,还引入了一种新颖的 CNN 架构,它将来自 3D 形状的多个视图的信息组合到一个紧凑的形状描述符中,提供了更好的识别性能。
【2】vox net:用于实时物体识别的 3D 卷积神经网络
Figure 3: The VoxNet Architecture | Source: link
*为了利用因激光雷达和 RGBD 扫描仪的可用性增加而导致的点云数据库数量的增长,本文**【2】*提出了一个“VoxNet”。该模型的架构旨在通过将体积占用网格表示与受监督的 3D 卷积神经网络(3D CNN)集成来解决海量点云处理和标记的问题。
使用 LiDAR、RGBD 和 CAD 数据在公开可用的基准上评估结果。VoxNet 最终实现了超越现有技术水平的准确性,同时每秒标记数百个实例。
【3】设计中的体积表示和机器学习
*这最后一篇论文**【3】*探讨了体素建模与机器学习的机会。
Figure 4: Summary of Work Flow | Source: link
首先介绍了体素建模的概念,并与传统建模技术进行了比较。解释了像像素图和图形表示这样的概念,以最终检查基于从空间和几何光栅化到机器学习的过程的拟议设计系统或工作流的原型实现。
二。模型定义
在这个项目中,我们的方法是识别用户正在绘制的对象,并通过简单地使用对象的形状作为代理来提供相似的对象。
简而言之,我们在这里设计的模型处理两个主要任务:
- **(1)分类:**识别用户正在绘制的对象的类型,即找到合适的标签(“椅子”、“长凳”、“床”等)。)对于任何给定的图像输入,结合预测置信度得分。
- ***(2)匹配:*在 3D 对象的数据库中查询与用户的模型化输入的方面最匹配的一些形状,即返回在我们的数据库中找到的对象列表,从最相似到最不相似排序。
Figure 5: Typical Pipeline | Source: Author
如图图 5* 所示,通过嵌套两个不同层次的模型(一个分类器和一个匹配器),我们也许能够执行这个两步过程。每个模型将在 3D 对象的图像上被训练,然后将在由用户建模的对象的图像上被测试。*
A.数据来源和生成
第一步是生成一个数据库来训练我们的模型。由于我们的方法是为了共享,我们想在此详述这一关键步骤,并分享我们为实现这一目标而使用和构建的资源。
我们首先从现有的公共 3D 对象仓库中提取信息,例如:
从 ShapeNet 数据库中,我们可以下载多达 2.330 个带标签的 3D 模型,分为 14 个特定类别(图 6 )。
Figure 6: Training Set Classes | Source: Author
*使用犀牛 和 蚱蜢 **,我们然后编写一个工具来创建我们的训练集和验证集。*在这个脚本中,围绕每个连续对象旋转的照相机以特定的角度拍摄对象,并将 JPG 图像保存在给定的目录中。
图 7 显示了典型的摄像机路径(左图)和拍摄的最终图像(右图)。
Figure 7: Image Capture Path, and Resulting Images | Source: Author
对于每个对象,我们拍摄 30 幅图像用于训练,10 幅用于验证,同时保持白色背景/中性背景。
***我们最终获得一个标记图像库,每类 10 个对象,总共有 14 个不同的类。*图 8 中显示了一个子集。
Figure 8: Subset of Training Set | Source: Author
B.分类
一旦我们的数据集准备就绪,我们的目标是在大量的 3D 对象图像上训练我们的第一个模型,即分类器,同时在属于类似类别的其他对象图像集上验证其性能。
迭代次数
几个参数严重影响训练好的分类器的准确性:
- 训练和验证集的大小
- 班级人数
- 每类对象的数量
- 每个对象的图像数量
- 两组中图像的尺寸 s
- 物体周围摄像机的拍摄路径
在这一点上,我们在不同的选项之间迭代,目的是增加模型在验证集上的整体准确性。由于资源有限,我们负担不起从头开始培训的费用。使用一些迁移学习很方便,因为它提供了提高我们模型准确性的可能性,同时绕过了数天的培训。我们添加了一个 VGG16 预训练模型作为模型的第一层,这反过来提高了我们 32%的准确度。
这个训练过程的一个重要收获是,摄像机路径实际上会显著影响最终的精度。**在我们尝试过的许多版本中,我们在下面的图 9 中展示了两种不同摄像机路径的性能对比:圆形和球形*。*
Figure 9: Training Performance Under Different Image Capture Technics | Source: Author
结果
最终,我们满足于使用 200200 px 图像的分类器,具有球形相机路径,每个对象 30 个图像用于训练,10 个用于验证。在 30 个时期之后,**我们最终在验证集上获得了 93%的准确度。*现在似乎很清楚,以下参数对整个模型的性能有很大影响:
- ***增加图像尺寸可以提高精确度。*在我们的机器上,速度和精度之间的平衡在 200x200 px 左右找到了平衡点。
- ***摄像机捕捉路径也直接影响精度。*通过使用球形捕获路径,而不是圆形路径(见图 9 ),我们显著提高了模型性能:在更少的历元之后,精确度更高。使用球形路径似乎是一种更全面的捕捉给定形状的方式。
图 10 显示了分类器对四种不同用户输入的典型结果。
Figure 10: Results of Classifier Model, User Input (left) to Predicted Class (right) | Source: Author
- 更有趣的是在给定用户的 3D 建模过程中运行的相同模型的性能。当一个对象被建模时,少到几个表面就足以将分类器推向正确的方向。因此,在建模过程的早期,我们能够识别建模对象的类。作为回报,我们可以从我们的数据库向用户建议模型,如果用户在建议中找到匹配,可能会减少 3D 建模时间。图 11 显示了在建模过程的五个不同步骤中分类器的结果。
Figure 11: Classification During Modeling Process | Source: Author
C.相称的
Figure 12: Matching: Finding Best Matches Among Database Through a Convolutional Model | Source: Author
第二步,我们的模型试图在庞大的 3D 模型数据库中寻找理想的匹配。如果分类模型有助于缩小搜索范围,则匹配模型将给定类别的所有 3D 模型从“最相似”到“最不相似”进行排序。
我们的匹配模型是另一个卷积神经网络,根据给定类别的对象的图像进行训练,并根据从不同角度拍摄的视图对相同的对象进行验证。对于测试,我们的输入将是一个用户建模的 3D 对象的图像,输出将是我们的数据库中所有对象的列表,按照相似性的顺序排列。
结果
*当我们为每个单独的类训练匹配模型时,我们现在能够将分类模型和匹配模型嵌套为一个单独的管道。**我们现在可以处理输入图像,首先对其进行分类,最后与数据库中的相似对象进行匹配。*同时,我们的模型输出一些预测置信度,帮助我们衡量原始模型和实际匹配之间的相似程度。
已经对不同类别的 7 个对象进行了测试,如图 13 所示。
Figure 13: Full Pipeline With Functional Classifying & Matching Model | Source: Author
三。结论
首先,我们鼓励在我们的行业内进一步发展和改进上述理念。在这方面已经做了很多工作,并为邻近领域带来了解决方案。让这些技术渗透到我们的学科中,将会真正有益于我们日常的建筑实践。此外,像我们这样嵌套 CNN 模型只是一个更大概念的一个可能版本: 3D 形状识别和建议。可以部署其他方法和模型,将公开可用数据的广度&丰富性带到架构师&设计者的能力范围内。
事实上,除了本文开发的简单管道,还有一个更基本的想法 : 架构形式的资格。正如在之前的一篇文章中所描述的,能够构建框架,包括现有形状的异质性和复杂性,将很快对我们的学科至关重要。随着数字数据量的增加,并汇集在大型公共存储库中,我们对这些共享知识的访问将与我们的查询智能一样好。正如我们在这里展示的,我们可以依靠在某种程度上依靠机器学习来找到一种共同语言,从而能够比较不同的&复杂形状。
在一个更基本的层面上,这项工作只是显示了暗示性设计的潜力。通过在创意过程中为设计师带来相关的选择,我们有机会拓宽他们的工作范围。随着这种方法扩展到比简单的离散对象更大的分类法,它最终会将被动的集体知识转化为主动的灵感来源。
文献学
***【1】*用于 3D 形状识别的多视角卷积神经网络,苏航、苏卜兰苏·马吉、伊万杰洛斯·卡罗格拉基斯、埃里克·博学-米勒、马萨诸塞大学阿姆赫斯特分校| 链接
***【2】*vox net:用于实时物体识别的 3D 卷积神经网络,丹尼尔·马图拉纳和塞巴斯蒂安·舍雷尔| 链接
***【3】*三维对象的再混合和重采样在设计中使用体积表示和机器学习,NJ Namju Lee,哈佛 GSD,2017 | 链接
21 世纪的自杀(上)
自杀是英国 20-34 岁年轻人的主要死因,自杀的男性是女性的三倍。令人担忧的是,在这成千上万的男性和女性中,最近的统计数据显示,在 2005 年至 2015 年期间,只有 27%的自杀受害者被归类为患者自杀,即个人在去世前一年曾接触过心理健康服务。
在这篇文章的第一部分,我们将对世界各地的自杀率进行一些基本分析,在第二部分,我们将更深入地研究一些机器学习,特别是 K-means。
我们开始吧!
本项目使用的数据集取自 Kaggle ,以大型表格的形式发布为“1985 年至 2016 年自杀率概览”。csv 文件。该数据集包含 27820 行,分为 12 列:“国家”、“年份”、“性别”、“年龄”、“自杀人数”、“人口”、“自杀人数/10 万人口”、“国家-年份”、“人类发展指数代表年份”、“gdp 代表年份( ) ”、“人均 G D P ( )”、“人均 GDP( )”、“人均GDP()”、“世代”。
数据预处理
数据预处理是数据挖掘过程中最关键的步骤之一,处理初始数据集的准备和转换。尽管数据集本身相对干净,但仍有必要删除此分析不需要的任何冗余数据。
在我的项目的 Github 资源库中可以获得数据预处理的所有步骤,但是,我们将讨论几个最重要的步骤。
首先,检查是否有丢失的数据是有用的,因为对丢失数据的帧进行分析很可能会导致错误。正如我们在下面看到的,HDIForYear 列有许多空条目。填充缺失数据的方法有很多,但是,大多数方法都假设该列的大多数行都被填充。但是,在这种情况下,总共 27820 行中有 19456 行缺少该属性的数据,因此最好将该列完全删除。
df.isnull().sum()
Missing values in HDIForYear
df.drop('HDIForYear', axis=1, inplace = True)
开始分析之前,务必确保数据框仅包含与其相关的数据。由于该分析将关注 21 世纪年轻男性自杀,我们希望删除性别= '女性’的任何行、年份不> = 2000 的任何行以及不在我们希望分析的年龄范围内的任何行。这些过滤器可以很简单地在熊猫身上实现,概述如下。
df = df[df.Year >= 2000]
df = df[df.Gender =='male']criteria_1 = df['Age'] == '15-24 years'
criteria_2 = df['Age'] == '25-34 years'
criteria_all = criteria_1 | criteria_2
df= df[criteria_all]
既然数据集更像我们分析所需要的,数据框可以按年份和总和分组,以显示每年的自杀人数。运行该图可以看出,2016 年的数据非常少,因为数据比往年低 10 倍以上,这是不正确的。所以,为了准确起见,有必要去掉 2016 年的数据。
#create new data frame grouped by year to check
yearlyStats = df.groupby('Year').sum()
yearlyStats
Suicide statistics by year
df = df[df.Year != 2016]
删除这个数据只删除了 32 行,可见 2016 年的数据是多么的不完整。使用相同的 groupby 方法,很容易按年份显示数据,因此我们可以了解哪些国家报告的数据很少。以下国家被删除,因为对它们的任何分析都是不准确的:安提瓜、巴巴多斯、格林纳达、马尔代夫、黑山和圣文森特。
数据聚合
我们知道数据集有一个 Country 列,但是如果我们希望对更大的组(如大洲)进行分析,该怎么办呢?在 Python/Pandas 中,这同样可以通过三个相当简单的步骤来完成。
- 根据联合国统计司的数据,创建大陆阵列并给它们分配国家
- 把这些移到字典里
- 使用 Pandas 中的 Map 函数将各大洲映射到各个国家。请注意,可以跳过步骤 1,直接将国家放入字典中,但是首先将它们移动到一个数组中,这样在将来会更容易,例如,如果要将一个国家添加到数据集中。
#create lists of countries per continenteurope = ['Albania', 'Austria', 'Azerbaijan', 'Belarus', 'Belgium', 'Bosnia and Herzegovina', 'Bulgaria', 'Croatia', 'Cyprus', 'Czech Republic', 'Denmark', 'Estonia', 'Finland', 'France', 'Georgia', 'Germany', 'Greece', 'Hungary', 'Iceland', 'Ireland', 'Italy', 'Latvia', 'Lithuania', 'Luxembourg', 'Malta', 'Montenegro', 'Netherlands', 'Norway', 'Poland', 'Portugal', 'Romania', 'Russian Federation', 'San Marino', 'Serbia', 'Slovakia', 'Slovenia', 'Spain', 'Sweden', 'Switzerland', 'Ukraine', 'United Kingdom']asia = ['Armenia', 'Bahrain', 'Israel', 'Japan', 'Kazakhstan', 'Kuwait', 'Kyrgyzstan', 'Macau', 'Maldives', 'Mongolia', 'Oman', 'Philippines', 'Qatar', 'Republic of Korea', 'Singapore', 'Sri Lanka', 'Thailand', 'Turkey', 'Turkmenistan', 'United Arab Emirates', 'Uzbekistan']northamerica = ['Antigua and Barbuda', 'Bahamas', 'Barbados', 'Belize', 'Canada', 'Costa Rica', 'Cuba', 'Dominica', 'El Salvador', 'Grenada', 'Guatemala', 'Jamaica', 'Mexico', 'Nicaragua', 'Panama', 'Puerto Rico', 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Vincent and Grenadines', 'United States']southamerica = ['Argentina', 'Aruba', 'Brazil', 'Chile', 'Colombia', 'Ecuador', 'Guyana', 'Paraguay', 'Suriname', 'Trinidad and Tobago', 'Uruguay']africa = ['Cabo Verde', 'Mauritius', 'Seychelles', 'South Africa'] australiaoceania = ['Australia', 'Fiji', 'Kiribati', 'New Zealand']#move these to a dictionary of continentscontinents = {country: 'Asia' for country in asia}
continents.update({country: 'Europe' for country in europe})
continents.update({country: 'Africa' for country in africa})
continents.update({country: 'North_America' for country in northamerica})
continents.update({country: 'South_America' for country in southamerica})
continents.update({country: 'Australia_Oceania' for country in australiaoceania})
然后,我们可以简单地将各大洲映射到我们的国家
df['Continent'] = df['Country'].map(continents)
既然数据已经过预处理,数据框已经从 27820 行 12 列变成了 2668 行 10 列,现在可以进行分析了。
探索性数据分析
首先,让我们为我们的绘图定义一个好的调色板。
flatui = ["#6cdae7", "#fd3a4a", "#ffaa1d", "#ff23e5", "#34495e", "#2ecc71"]
sns.set_palette(flatui)
sns.palplot(sns.color_palette())
Seaborn Colour Palette
首先,我们将展示一些以图形形式显示有趣数据的基本图表。通过按年份对数据进行分组并执行. sum(),我们能够创建一个包含全球每年自杀总人数的临时数据框架。采用这个框架,应用 Matplotlib 代码和 Seaborn 美学,我们可以显示全球自杀率,同时还可以绘制一条平均线。
data_per_year['SuicidesNo'].plot()
plt.title('Total No. of Suicides per Year: 2000 To 2015', fontsize = 22)
plt.axhline(y=52720, color='black', linestyle='--')
plt.ylabel('No. Suicides', fontsize = 20)
plt.xlabel('Year', fontsize = 20)
Global suicides (2000–2015)
这里我们可以看到有下降的趋势,全球自杀率在逐年下降。可以推测,这是因为意识的提高或资金等原因。,但这是以后可以深入探讨的事情。
接下来,我们可以使用 Matplotlib 中的条形图来显示各大洲每年每 10 万人口的平均自杀人数。使用按洲分组创建新的数据框。意思是()这次。该数据框表示如下:
data_per_continent = df.groupby('Continent').mean()
data_per_continentax = data_per_continent['Suicides/100kPop'].plot(kind='bar', figsize=(15, 10), fontsize=14)
plt.title('Mean Suicides/Year by Continent', fontsize = 22)
ax.set_xlabel("Continent", fontsize=20)
ax.set_ylabel("Suicides/100k Population", fontsize=20)
plt.show()
Suicides by Continent
有趣的是,我们可以看到南美洲是年轻男性自杀率最高的大陆,其次是欧洲。虽然有用,但它并没有显示这些大陆的自杀率随时间的变化。使用“洲”和“年”对数据进行分组,并执行以下代码后,我们能够绘制出各洲每 10 万人口的自杀率变化率:
dfAgg = dftesting.groupby(['Continent','Year'],sort=True,as_index=False)['Suicides/100kPop'].mean()by_cont = dfAgg.groupby('Continent')for name, group in by_cont:
plt.plot(group['Year'], group['Suicides/100kPop'], label=name, linewidth=6.0)plt.title('Mean Suicide/100k, Year by Year, per Continent', fontsize = 22)
plt.ylabel('Suicides/100k', fontsize = 20)
plt.xlabel('Year', fontsize = 20)
leg = plt.legend(fontsize = 12)
for line in leg.get_lines():
line.set_linewidth(10)
plt.show
Suicide rate by Continent over the years
可以看出,该图显示了总体下降趋势,但也显示了南美和非洲等大陆的恶性飙升(后者可能是由于报告数据的不一致)。接下来,我们希望找出哪些国家的自杀率最高。我们也可以找出最低的。然而,由于报告发生率低的国家等原因,这可能会有所偏差。(主要是非洲国家)。在 Python 中,我们能够通过创建数据框来创建可视化绘图,该数据框根据每个国家的平均自杀人数对数据进行分组,通过降序对值进行排序并绘制。数据帧的 head()作为条形图。
data_suicide_mean = df['Suicides/100kPop'].groupby(df.Country).mean().sort_values(ascending=False)
f,ax = plt.subplots(1,1,figsize=(15,4))
ax = sns.barplot(data_suicide_mean.head(10).index,data_suicide_mean.head(10))
plt.ylabel('Suicides/100k', fontsize = 20)
plt.xlabel('Country', fontsize = 20)
Countries with the highest suicide rates
多年来,立陶宛的自杀率最高,紧随其后的是俄罗斯和哈萨克斯坦,这三个国家的平均自杀率都超过了每 10 万人中 50 人。有趣的是,立陶宛和哈萨克斯坦都与俄罗斯接壤。
由于 2016 年的数据因不完整而被删除,我们可以运行分析的最近年份是 2015 年。Matplotlib 允许使用散点图,能够绘制自杀率与 GDP 的关系,以国家为单位。同样,准备数据框架很重要,例如排除任何非 2015 年的数据和不相关的列。按洲和国家分组,同时包括自杀率和 GDP.sum()给出了所需数据框架的正确形状。为该数据框绘制自杀率与 GDP 的关系图会将数据分散到各个国家,显示该数据框中每个国家的 GDP 与自杀率的关系。此外,将 hue =“Continent”添加到散点图参数中会显示根据国家所在的洲进行着色的数据。
#plot suicide rate vs gdp
plt.figure(figsize=(20,16))
sns.scatterplot(x='GdpPerCapital($)',s=300, y='Suicides/100kPop',data=dfcont, hue='Continent')
plt.title('Suicide Rates: 2015', fontsize= 30)
plt.ylabel('Suicide Rate /100k Population', fontsize = 22)
plt.xlabel('GDP ($)', fontsize = 22)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.legend(loc=1, prop={'size': 30})plt.show()
Suicide rates vs GDP, coloured by Continent
有趣的是,似乎有很多国家的 GDP 很低,自杀率也很低,这有点出乎意料。然而,这可能是因为较贫穷国家报告的自杀率较低,而实际上自杀率可能要高得多。尽管如此,GDP 似乎对自杀率有着有趣的影响。
观察一个国家的总体幸福感是否会影响其年轻男性的自杀率也是一件有趣的事情。以 2015 年世界幸福报告 10]为例,可以为数据框中的国家创建一个所有幸福得分的列表;这可以简单地读入一个新列“HappinessScore ”,并将值转换为 Float。在这张图中,幸福指数低于或等于 5.5 的国家被移除了——这是因为许多得分低的国家自杀率低,这可能是由于数据不完整、没有报告自杀或自杀分类不同。然后可以使用 Matplotlib/Seaborn 中的散点图绘制该数据,以给出以下可视化效果,同样使用 hue =“continental”:
#plot suicide rates vs happiness score
plt.figure(figsize=(20,16))
sns.scatterplot(x='HappinessScore',s=300, y='Suicides/100kPop',data=dfcont, hue='Continent')
plt.title('Suicide Rates: 2015', fontsize= 30)
plt.ylabel('Suicide Rate /100k Population', fontsize = 22)
plt.xlabel('HappinessScore', fontsize = 22)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.legend(loc=1, prop={'size': 30})plt.show()
Suicide rates vs HappinessScore, coloured by Continent
同样,很难判断一个国家的自杀率和它的幸福指数之间是否有真正的关系;因此,将进一步探讨这种关系。我们可以通过应用双变量分析来做到这一点,在 Pandas 中绘制一个相关矩阵,它计算列的成对相关。
dfcont.corr(method = 'pearson')
Pearson correlation matrix
可以观察到,在该数据帧中,使用皮尔逊方法,GdpPerCapita($)和硅化物/100kPop 之间存在-0.175131 的相关性,这意味着两者之间存在关系,但不是很强的关系,负值表示相关关系成反比,即一个增加,另一个减少。这也可以用 Seaborn 可视化为热图,给出一个更令人愉快的相关矩阵视图。
sns.heatmap(dfcont.corr(method = 'pearson'),cmap='YlGnBu',annot=True)
Seaborn heatmap matrix
感谢阅读!
请继续关注将于下周发布的第二部分。我们将坚持使用这个数据集,并进入一些机器学习。
21 世纪的自杀(下)
Photo by Paola Chaaya on Unsplash
欢迎回来!如果您没有了解第 1 部分,可以在下面找到:
自杀不会传染,我们需要谈论它。
towardsdatascience.com](/suicide-in-the-21st-century-part-1-904abe8e1f5c)
如前所述,第 2 部分将包含机器学习,或者更具体地说,使用 python 中的 K-Means 进行机器学习。
在我们开始之前,如果您错过了第 1 部分,这里有一个快速回顾。
概述
在第一部分中,我们主要做了数据预处理和一些 EDA(探索性数据分析)。使用的数据是来自 Kaggle 的全球自杀率数据集。我们清理了数据,然后增加了一个额外的栏目,快乐得分,摘自联合国每年发布的《世界快乐报告》。然后,我们以图表的形式进行了一些基本的视觉数据分析,其中一些可以在下面看到:
Plots taken from Part 1
现在我们已经概括了,我们可以继续进行一些机器学习!
k 均值
K-Means 是一种广泛使用且相对简单的无监督聚类机器学习技术。该算法迭代地工作,并试图将数据集划分为 K 个预定义的子组(或聚类),由此每个数据点属于一个组。它旨在使聚类间的数据点尽可能相似,同时也试图使聚类尽可能远离。该算法的工作原理如下:
- 初始化——首先,K-Means 从数据集中随机选择 K 个数据点作为初始质心(质心是一个聚类的中心)。注意,该算法还不知道聚类的正确位置。
- 聚类分配-计算每个数据点和聚类中心之间的欧几里德距离,然后将数据点分配给与聚类中心的距离最小的聚类。
- 移动质心——使用以下公式重新计算新的聚类中心,其中 Ci 代表第和第个聚类中的数据点数量。
Recalculating Cluster Centres
准备
在实现任何类型的机器学习之前,确保数据准备正确是至关重要的。否则,算法极有可能会出错。
作为准备工作的第一步,在先前使用的数据框架中增加了一个额外的列:基尼系数。基尼指数是由科拉多·基尼在 1912 年发展起来的一种衡量收入分配的方法;该指数(或系数)被用作衡量经济不平等的标准。系数用 0 到 1 之间的值来度量,其中 0 表示完全相等,1 表示完全不相等。基尼指数的数据是从中央情报局公共图书馆中提取的,并以与之前用于幸福指数相同的方式添加;创建一个所有基尼指数值的列表,然后读入新列,再次转换为浮点值。
如前所述,K-Means 使用欧几里德距离,当面对比例/单位非常不同的要素时,这可能会成为问题。例如,GDP 通常是几万,而幸福指数通常是一个小于 10 的浮动值,这意味着 K 均值将是非常次优的。为了避免这一障碍,将最小-最大缩放器应用于数据帧。在此缩放中,从所有值中减去最小值。然后,将这些值除以最小值和最大值之间的差值,得到值在 0 和 1 之间的完整数据集。两个字符串列(国家和大陆)被删除,因为 MinMaxScaling 不能应用于字符串。然后应用定标器,产生一个新的数据帧— dfscaled —包含 sizes/100k pop、GdpPerCapita($)、HappinessScore 和 GiniIndex。
from sklearn import preprocessing
dfcontpre = dfcont.drop('Country', axis=1)
dfcontpre = dfcontpre.drop('Continent', axis=1)
minmax_processed = preprocessing.MinMaxScaler().fit_transform(dfcontpre)
dfscaled = pd.DataFrame(minmax_processed, index=dfcontpre.index, columns=dfcontpre.columns)
在实现该算法之前,选择最佳数量的 K 个簇是很重要的。这在理论上可以通过反复试验来实现;然而,绘制肘形曲线更有效。这种方法的思想是对一系列值 k (在这种情况下,1–20)的数据集运行 K 均值,并对每 K 次迭代计算和绘制误差平方和(SSE)。理想情况下,这个线图看起来像一只手臂,肘部显示了数据集中聚类的最佳数量 k 。
首先,让我们定义一个好的调色板
flatui = ["#6cdae7", "#fd3a4a", "#ffaa1d", "#ff23e5", "#34495e", "#2ecc71"]
sns.set_palette(flatui)
sns.palplot(sns.color_palette()
Our Palette for future plots
现在我们可以绘制肘部曲线:
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA#plotting elbow curve for ideal number of clusters
Nc = range(1, 20)
kmeans = [KMeans(n_clusters=i) for i in Nc]
score = [kmeans[i].fit(Y).score(Y) for i in range(len(kmeans))]
pl.plot(Nc,score)
plt.xlabel('Number of Clusters')
plt.ylabel('Score')
plt.title('Elbow Curve')
plt.show()
Plotted elbow curve
从肘图中可以看出,3 将是最优的聚类数,虽然肘图并没有过分的与众不同,但足以决定最优的 k 个聚类。
现在我们已经决定了要使用的最佳聚类数,我们可以开始实现 K-Means 了。
履行
自杀率/100k pop vs GdpPerCapita($)
首先,将两列的数据放入 1D NumPy 数组中。然后将这些数组压缩在一起,形成一个 2D NumPy 数组,其示例如下所示:
print X[0:5]
A sample of the scaled 2D NumPy array (Note that all values are between 0 and 1)
然后,使用前面提到的三个集群,在 2D 阵列 X 上运行 K-Means。然后创建一个散点图,X 轴和 Y 轴分别为硅化物/100kPop 和 GdpPerCapita($)。然后使用 kmeans.labels_,通过颜色将这些分散的数据分开,这意味着它们是根据 kmeans 分配的聚类进行分离的。然后使用 cmap 选择“viridus”配色方案绘制颜色(颜色对比比我们自定义的调色板更好)。最后,使用 kmeans.cluster_centres_ 绘制聚类中心,生成以下图:
#k-means plot suicide rate vs gdp, 3 clusters
kmeans = KMeans(n_clusters = 3, random_state = 0)
kmeans.fit(X)
plt.figure(figsize=(20,16))
plt.scatter(X[:, 0], X[:, 1],c = kmeans.labels_,cmap='viridis', s = 300)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 300, c = 'red')
GDP vs Suicide Rates using K-Means
这个图显示了一个有趣的结果。可以看出,不存在 x 和 y 都为高的数据,当回头参考图 14 时,这是有意义的。因此,我们可以将这些集群分类如下:
- 深紫色:高 GDP 低自杀风险国家
- 黄色:低 GDP 低自杀风险国家
- 提尔:低 GDP 高自杀风险国家
- 相当令人惊讶的是,K-Means 成功地将这些群体有效地聚类,主要是因为当看起来人均 GDP 和每 10 万人口自杀率之间的相关性相当低。
如果我们希望看到哪个国家被分配到哪个集群,我们也可以运行下面的代码:
cluster_map = pd.DataFrame()
cluster_map['data_index'] = dfscaled.index.values
cluster_map['cluster'] = kmeans.labels_
cluster_map.head(50)
自杀/100kPop vs .快乐得分
将 K-Means 应用于自杀/100kPop 和快乐核心的管理方式大致相同;两个一维 NumPy 数组被压缩成一个二维数组,然后 K-Means 对其进行处理以创建必要的聚类。然后绘制颜色并添加聚类质心。
#1d numpy arrays zipped to 2d
f1 = dfscaled['Suicides/100kPop'].values
f2 = dfscaled['HappinessScore'].values
X = np.array(list(zip(f1, f2)))
#k-means suicide rate vs happiness score
kmeans = KMeans(n_clusters = 3, random_state = 0)
kmeans.fit(X)
plt.figure(figsize=(20,16))
plt.scatter(X[:, 0], X[:, 1],c = kmeans.labels_,cmap='viridis', s = 300)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 300, c = 'red')
HappinessScore vs Suicide Rates using K-Means
同样,从算法中可以看到三个相当不同的集群,它们可以分类如下:
- 黄色:低风险的“快乐”国家
- 深紫色:低风险的“幸福”国家
- 缇尔:高风险“不快乐”国家
同样,当看到低相关性(-0.24)(来自第 1 部分)时,数据被有效地聚类是令人惊讶的
自杀率/100kPop vs .基尼指数
将 K-Means 应用于自杀率/100kPop 和基尼系数的方法与之前相同。
#1d numpy arrays zipped to 2d
f1 = dfscaled['Suicides/100kPop'].values
f2 = dfscaled['GiniIndex'].values
X = np.array(list(zip(f1, f2)))
#plot k-means suicide rate vs gini index
kmeans = KMeans(n_clusters = 3, random_state = 0)
kmeans.fit(X)
plt.figure(figsize=(20,16))
plt.scatter(X[:, 0], X[:, 1],c = kmeans.labels_,cmap='viridis', s = 300)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 300, c = 'red')
GiniIndex vs Suicide Rates using K-Means
此外,该算法显示了三个不同的聚类,与之前的结果非常相似,右上角没有数据点(高 X 值和高 Y 值)。这些数据可以分类如下:
- 深紫色:低风险的“不平等”国家
- 缇尔:低风险的“平等”国家
- 黄色:高风险“平等”国家
这是一个非常令人惊讶的结果,因为高基尼指数意味着更高的财富不平等,而且没有一个国家既有非常高的基尼指数,又有非常高的自杀率。这可以用多种因素来解释,例如财富不平等的国家的自杀率可能比报道的数字高得多。虽然这个数据的含义的表述本身就令人惊讶,但可以通过数据相关性来解释。
在纳入新栏的同时再次关联数据显示,自杀率/100 千人口与基尼系数之间的相关性为-0.17,这意味着存在轻微的反比关系,即随着基尼系数的增加,自杀率/100 千人口下降。为了显示这些特征对自杀/100kPop 结果的重要性,可以应用通过随机森林的排列重要性。
排列重要性
要素重要性是一种计算哪些要素对预测影响最大的方法。有许多方法可以实现这一点;然而,排列的重要性是最快的和广泛使用的。
排列重要性的工作原理是,当一个特性变得不可用时,可以通过观察分数或准确度降低多少来测量特性的重要性。理论上,这可以通过删除一个特性,重新训练估计器,然后检查结果得分,并对每个特性重复进行测试。这将花费大量时间,并且计算量相当大。相反,从数据集的测试部分“移除”了一个特征。估计者会期望该特征存在,因此完全移除该特征会导致误差;因此,特征值被混洗所有特征值产生的噪声所取代。
还应该注意的是,排列重要性与大量的列进行斗争,因为它会变得非常耗费资源。然而,对于本文中使用的数据集来说,这不是问题,因为列很少。
因此,项目中引入了必要的模块——排列重要性和随机森林回归量。移除索引列时,从 dfscaled 创建了一个新的数据框 dfrfr。目标变量(自杀/100kPop)存储在 y 中,而其余的列存储在 x 中。然后实施使用随机森林的排列重要性,并显示结果权重和特征。
#import modules for permutation importance, and show output
import eli5
from eli5.sklearn import PermutationImportance
from sklearn.ensemble import RandomForestRegressordfrfr = dfscaled.drop("index", axis = 1)
rfr = RandomForestRegressor(random_state=42)y = dfrfr[['Suicides/100kPop']].values
X = dfrfr.drop('Suicides/100kPop',axis=1).valuesperm = PermutationImportance(rfr.fit(X,y), random_state=42).fit(X, y)
eli5.show_weights(perm, feature_names = dfrfr.drop('Suicides/100kPop',axis=1).columns.tolist())
Permutation Importance using Random Forest
当回头参考特征相关性并看到 HappinessScore 与自杀/100kPop 的相关性最高时,这个结果是有意义的,其次是 GdpPerCapita($),最后是 GiniIndex。
结论
总体而言,尽管数据没有显示预期的某些特征的影响,但它仍然显示了这些影响的一个非常有趣的结论,例如收入不平等对各国自杀率的影响似乎无关紧要——这是以前被认为有显著影响的。
由于缺乏预期紧密相关的特征之间的相关性,该数据受到限制,例如,幸福感得分和自杀率/100k,因为普遍不幸福被认为会增加自杀率。它还受到缺乏某些国家和某些年份的数据的限制,这意味着必须对 2015 年而不是 2018/19 年的数据进行主要分析。
在未来的分析中,最好有一个特征被证实对各国的自杀率有很大影响。这将允许更精确的图,也允许更有意义的 K-均值聚类。
这篇文章的完整代码可以在下面的我的 github 上找到:
通过在 GitHub 上创建一个帐户,为 Harry bitten/自杀率分析开发做出贡献。
github.com](https://github.com/HarryBitten/Suicide-Rates-Analysis)
感谢阅读!我对这一切都很陌生,但我打算继续发布许多有趣的项目,主要是在数据科学/机器学习方面
用数据科学洞察自杀预防
宗教是一种强有力的抗抑郁药
我相信我第一次经历强烈的情感冲击是在大约 11 岁的时候,当时我发现我认识的、钦佩的、被认为成功和幸福的人突然决定以自杀来结束自己的生命。短短几年内,我的两个童年好友的爸爸就发生了这样的事情。这两个人看起来都像慈爱的父母和模范公民,所以这个消息对我和他们各自的社区来说都是一个巨大的冲击。同样的悲剧故事在我青少年时期的三个主要英雄身上重演——柯特·科本、罗宾·威廉姆斯和安东尼·鲍代恩。这些年来,我度过了无数个不眠之夜,试图找出是什么可能将我所热爱和钦佩的人推向如此极端,这些人乍一看似乎拥有成功和幸福的生活。受所有这些未解问题的驱使,我决定与我的同学 Brian Srebrenik 合作,尝试用数据科学来研究自杀之谜,这些问题可能折磨过任何一个近距离接触过亲密朋友、家庭成员或明星偶像令人震惊的自杀事件的人。
这个项目的目标是利用 200 个国家的一些社会经济和心理健康指标建立一个机器学习监督的回归模型,并试图确定哪些因素可能与国家自杀率有统计上的显著相关性。
在对之前在这个问题上所做的工作做了一些研究后,我们收集了以下自变量的数据,我们认为这些数据将有助于建立我们的模型。我们使用了 2016 年的数据。
- 抑郁率
- 精神分裂症发病率
- 焦虑率
- 躁郁症
- 饮食失调
- 酒精使用障碍
- 药物使用障碍
- GDP
- 人均医疗支出
- 失业率
- 居住在拥有> 10 万人口的城市的人口比例
- 上网人口的百分比
- 信教人口百分比的分类数据
**注:如果您对我们如何构建和优化模型的技术细节不感兴趣,请跳至“模型总结和最终见解及结论”**部分,了解我们研究结果的详细总结。
P 修复数据并检查多重共线性
首先,我们从世界卫生组织 API 和其他几个网站收集了 2016 年的年度社会经济数据。在清理所有数据并将其合并到一个 pd 中之后。数据框架我们使用 SeaBorn 关联热图检查了独立变量多重共线性:
Colinearity Heatmap using sns.heatmap(final_table.corr(), center = 0)
热图告诉我们,双相情感障碍%与其他三种精神健康问题有很高的相关性,因此我们决定在运行模型之前删除该变量,以避免由严重的多重共线性引起的额外噪声。
检查每个独立变量和自杀率之间的线性关系
接下来,我们创建了每个自变量与因变量自杀率相关性的成对散点图:
Scatter pair-plots using seaborn.pairplot()
从上面的图表中我们可以看到,在抑郁、焦虑、精神分裂症、酗酒的比率和一个国家的宗教程度之间存在某种程度上的线性关系。所以,我们最初的期望是,我们的机器学习模型应该给这些类别分配更多的权重。
缩放我们的独立变量,并在模型中引入变量组合和多项式
由于我们的一些自变量以千为单位,而另一些以百分比为单位,因此我们决定调整所有自变量,以确保我们的模型不会为某些变量分配过大的系数。
Scaling variables using sklearn.preprocessing.scale
下一步是通过二次多项式函数引入交互项,以帮助我们的模型进行特征选择,提高其最终预测精度,并降低其均方根误差。下面的关联热图有助于我们识别所有相关的新变量:
对每个回归模型应用 RFE 和交叉验证,以选择最小化 RMSE 的最佳模型
既然我们的数据已经清理、缩放和预处理,现在是最后一步的时候了——根据我们的训练数据训练我们的机器学习模型,以提高其对测试数据的预测准确性。我们使用三个模型优化子步骤来创建我们自己的定制 GridSearch 函数:
- 我们使用下面的函数运行线性、套索和岭回归,以确定哪一个生成的模型误差最小。对于这个特定的数据集,我们发现岭回归有最好的结果。我们对训练数据-测试数据比率采用了 80–20 的比例。
- 我们使用 **RFE(递归特征消除)**将所有独立变量逐个输入每个模型,并选择最小化 RMSE 的变量数量和组合。
- 我们使用 K-Fold 交叉验证来优化每个模型在测试数据上准确预测的能力,这是它以前从未见过的。(代码如下)
Our custom GridSearch algorithm
下图显示了我们的 RMSE 函数,以及我们如何训练我们的模型来挑选产生最低误差的独立变量的数量:
22 Variables were chosen with an RMSE = 3.54
模型总结和最终见解和结论
现在大部分繁重的工作已经完成,是时候分析我们的结果了。首先,我们用训练数据与测试数据的模型统计绘制散点图,以确保没有太多的训练数据偏差或过度拟合。正如我们从下图中看到的,测试和训练样本的 RMSE、z 分数和 R 平方非常相似,这正是我们所希望的。0.66 的 R_squared 分数并不惊人,但是考虑到我们只有大约 150-200 个例子(国家),我们对模型的表现相当满意。我们相信,如果我们能够将 500 多个观察值输入到我们的训练集中,模型的预测准确性将会显著提高。
Model performance on test_data versus train_data
我们还想看看实际的独立变量及其系数,并试图从它们的分布中得出一些见解和结论。以下是最终模型方程和每个独立变量的条形图及其在最终模型中的权重:
**Suicide_Rate** = 10.28 + 3.58***Depression** + 2.74***Alcohol_use** - 1.87***Rel_High ** - 2.24***Schizophrenia Depression** + 0.65***Schizophrenia health_spend_perca** + 1.23***Schizophrenia Rel_Low** - 1.56***Eating_disorders Drug_use** + 1.04***Eating_disorders Depression** - 2.05***Eating_disorders Alcohol_use** + 1.49***Eating_disorders urban_population** + 0.72***Anxiety^2** - 1.17***Anxiety Depression** - 1.37***Anxiety GDP** - 2.89***Anxiety Rel_High** + 1.67***Drug_use** **Unem_rate** + 1.58***Drug_use GDP ** - 2.48***Depression Rel_High** - 1.76***Depression Rel_Low** - 0.92***Alcohol_use^2** + 0.71***Alcohol_use GDP** + 2.16***Alcohol_use urban_population** - 1.42***Alcohol_use Rel_High** - 2.23***Unem_rate GDP** + 0.91***Unem_rate health_spend_perca** - 0.45***Unem_rate Internet_access_percap** - 0.82***GDP urban_population** + 1.02***GDP Rel_High** + 2.14***urban_population Rel_Low**
结论:
根据下面的方程系数和柱状图,我们可以假设以下假设,并可以进一步检验:
- 倾向于增加一个国家自杀率的变量:
- 抑郁率
- 酒精使用障碍率
- 城市人口比例结合与低水平的宗教信仰
- 城市人口% 结合与高酒精使用
- 精神分裂症的比率结合了低宗教信仰的比率
- 吸毒紊乱与高失业率结合在一起
- 与国内生产总值水平相结合的药物使用
2。倾向于降低一个国家自杀率的变量:
- 人口的高度宗教性
- 抑郁率结合与高宗教信仰
- 焦虑率结合与高度宗教性
- 酒精使用障碍率结合与高度宗教性
- 药物使用率结合高宗教性
- 饮食失调率结合与酒精使用率
- 进食障碍率结合与药物使用率
调查一个国家的宗教信仰和自杀率之间的反比关系
当谈到对自杀率的影响时,我很好奇也很惊讶地发现我们的模型很重视一个国家的宗教程度。如果我们仔细观察上面的系数图,我们可以看到,大多数似乎对高自杀率有很强直接影响的特征,如抑郁症、酗酒和精神分裂症,在宗教人口高度密集的国家往往会失去它们的负面影响**。这一有趣的现象在下面的两个图表中得到了证明:**
Most High suicide rates fall inside the range of countries where less than 50% of the population is religious
Countries with the lowest level of religiousness have a much higher AVG Suicide Rate
最后的个人想法
尽管我们没有分析足够的数据来得出任何有力的结论,但我们的发现促使我进一步思考这个话题,并试图提出有效的解释,说明宗教如何能够否定一些似乎导致高自杀率的因素的影响,如抑郁、焦虑和吸毒。我对患有抑郁症和自杀想法的人的主要症状做了一些研究,如下所列:
- 对未来有一种深深的绝望感,对情况会有所改善不抱太大希望
- 孤独感和逃避朋友或社交活动的倾向
- 一种的感觉情感空虚、缺乏爱或人际关系
- 增加使用药物和/或酒精
- 经历了最近的创伤或生活危机
宗教是如何对抗这些症状,成为精神上的抗抑郁药物的?
- 宗教经常围绕着信仰和希望
- 宗教经常试图赋予苦难以意义,并试图教导人们如何克服个人创伤(解决创伤的痛苦)
- 宗教机构倾向于提供一个支持系统和一种社区感(解决孤独感和反社会行为)
- 许多宗教对毒品和酒精持保守观点(解决高毒品/酒精使用障碍)
- 许多宗教教导说上帝是爱和上帝无条件地爱所有的生命(解决爱的缺乏和填补情感的空虚)
因此,有意或无意地,宗教似乎充当了一种强效抗抑郁药物,它可以填补许多患有抑郁症和有自杀想法的人似乎会经历的情感和社会空白。对我个人来说,这是我们项目中最有趣的发现,我可以有把握地说,我将带着在这次调查中学到的许多其他宝贵经验,并试图在未来用它们来帮助有需要的人。我真诚地希望这篇文章也能让世界各地的许多人受益,他们能以这样或那样的方式从我们的发现中受益!和平和爱给所有的生命❤
指数随机变量的和
推导埃尔兰分布的概率密度函数
X1 和 X2 是独立的指数随机变量,速率为 λ 。
X1~EXP(λ)
X2~EXP(λ)让 Y=X1+X2
问题: Y 的 PDF 是什么?
我们在哪里使用Y 的分布?
要找到任何发行版的 PDF,我们使用什么技术?
👉我们找到 CDF 并对其进行微分。
(我们在之前的帖子中已经多次使用过这种技巧。)
好,那我们来找 (X1 + X2) 的 CDF。
但是我们不知道 (X1+X2) 的 PDF。事实上,这正是我们想要计算的东西。
嗯…我们可以说…
**∫ PDF(X1+ X2) = ∫ PDF(X1) + ∫ PDF(X2) ???!?!?**
不,当然不是。
如果这样做的话, (X1+X2) 的 PDF 总和将为 2。(任何 PDF 的积分总和应始终为 1。)
我如何在不知道 PDF 的情况下找到任何发行版的 CDF?
我们可以用于概率计算的技术:边缘化和独立性。
在上面的 CDF 推导中使用了两个主要技巧。
一种是将 X1 边缘化(这样我们就可以将其整合到 𝒙1 )另一种是利用独立的定义,即p(𝐗1+𝐗2≤𝒙|𝐗1)= p(𝐗1+𝐗2≤𝒙)。这些技巧简化了推导过程,并根据 𝒙 得出结果。
𝐗和𝒙有什么不同?
这些是数学惯例。 𝐗 是随机的,𝒙是确定性的。例如,让我们说 𝐗 是我们从掷骰子中得到的数字。所以 𝐗 可以取{1,2,3,4,5,6}中的任意一个数。但是一旦我们滚动骰子,𝐗的值就确定了。符号 𝐗 = 𝒙 表示随机变量 𝐗 取特定值 𝒙 。
- 𝐗是一个随机变量和大写字母被使用。
- 𝒙是随机变量可以取的某个固定值。例如, 𝒙1,𝒙2,…,𝒙n 可能是随机变量 x 对应的一个样本。
- 因此,一个累积概率 P(𝐗 ≤ 𝒙) 是指函数 𝐗 的值域t5】小于某个值 𝒙 的概率。 𝒙 可以是任意标量,如 𝐗 ≤ 1 、 𝐗 ≤ 2.5 、 𝐗 ≤ 888 、、等。
- 波浪号(~)表示“具有的概率分布”,例如 X1~EXP(λ) 。
现在,让我们区分 CDF 得到 PDF。
这是一个 Erlang (2,λ)分布。
Erlang 分布用在哪里?
在速率为 λ 的泊松过程中, X1+X2 将代表第二个事件发生的时间。
在我们的博客鼓掌👏例,如果你在单位时间内以 λ 的速率获得鼓掌,那么你等到看到第一个鼓掌粉丝的时间就以 λ 的速率呈指数分布。
如果你等待其他粉丝鼓掌更多的时间单位,那么你可以看到 0,1,2,…个粉丝。
然后使用 Erlang 分布来回答这个问题:
“我还要等多久才能看到 n 粉丝为我鼓掌?”
答案是独立指数分布随机变量的和,是一个 Erlang(n,λ) 分布。Erlang 分布是 Gamma 分布的一个特例。Erlang 和 Gamma 的区别在于,在 Gamma 分布中, n 可以是非整数。
锻炼🔥
a)什么分布等价于 Erlang(1,λ)?
简单。指数增长。
b)【排队论】你去了 Chipotle,和排在你前面的两个人一起排队。一个在被服务,另一个在等待。他们的服务时间 S1 和 S2 是独立的指数随机变量,平均值为 2 分钟。(因此,平均服务速率为**. 5/分钟**。如果这个“速率对时间”的概念让你感到困惑,阅读这个来澄清。)
你在队列中的条件时间是 **T = S1 + S2,**给定系统状态 N = 2 。T是二郎配。
你排队等 5 分钟以上的概率有多大?
让我们把 λ = 0.5 代入我们已经导出的 CDF。
我在 Chipotle 等待超过 5 分钟的几率不到 30%,听起来不错!
爱荷华大学的博格纳博士建造了这个尔朗(伽马)分布计算器,我觉得它很有用,也很漂亮:
See the numbers are matching with our derivation!
用自然语言处理技术总结《了不起的盖茨比》
使用自然语言处理、马尔可夫链、邻接矩阵和机器学习的自动摘要介绍
如果在ᵗʰ10 个年级的英语课上有一个一致的任务,那就是写一篇《了不起的盖茨比》(TGG)的摘要(T3)。《TGG》是一部引人入胜、激动人心的文学作品。它有贯穿整部小说的中心主题——社会和阶级、财富和地位、现在和过去的主题。对于 10ᵗʰ的评分者来说,一个有说服力的简明摘要不是一件容易的事情。
在本文中,我们将使用自然语言处理(NLP)中的一些方法来总结 TGG。 NLP 是人工智能和机器学习的一个子领域,分析计算机如何处理和理解有机的交流方法(如书面语言)。虽然这些流行语可能令人生畏,但其背后的概念却并非如此。
清理和聚集 TGG
在我们做任何总结之前,我们需要实际得到这本书。我们从澳大利亚古登堡计划提供的副本开始。首先,我们需要删除停用词。停用词是像 the,and,in,for,an 等这样的词。这些单词对于创建结构良好的句子是必要的,但它们不会添加容易辨别的含义,并且会扭曲词频分析。我们将在这里使用停用词列表。其次,我们将把 TGG 分解成(键,值)对的映射。我们地图中的关键字将是完整的句子(包含停用词和所有内容)。这些值将是表示句子的干净版本的数组。
余弦相似马氏链
对于那些不熟悉图论的人来说,这非常简单。基本图有两部分:节点和边。一个节点代表一个真实世界的概念,比如人、电话号码或城市。一条边是两个节点之间的连接。图形的一个常见例子是脸书。这些节点将是脸书用户。如果这两个脸书用户是朋友,则两个节点之间会有边。这里有更多关于图论的内容。
出于我们的目的,我们将把 TGG 表示为一个图形。我们每个句子都会有一个节点。两个节点之间有一条边,这条边等于它们的句子相似度(我们一会儿会讲到)。但是,在此之前,为什么这种表示是有帮助的呢?
这允许我们将 TGG 表示为一个马尔可夫链。马尔可夫链是一种概率模型,通过定义从一种状态转移到另一种状态的概率来描述一系列状态。
假设我想把我开车去的地方表示成马尔可夫链。假设我只开车往返于 4 个地方:家、工作单位、商店和健身房。对于每个可能的地点,我都有可能开车去不同的地点。下图对此进行了说明。如果节点没有连接,有 0%的概率。在下面的图表中,我从来没有在没有先回家的情况下在商店和健身房之间开车。
我们可以用这个马尔可夫链找到我在任何给定位置的平稳概率。在上图中,我很可能在任何给定的时间都在家,这很直观。这是因为有很多节点大概率指向 home。
现在,回到盖茨比身上!让我们将两个句子之间的转移概率定义为等于两个句子之间的余弦相似度。然后我们会找到马尔可夫链的平稳概率分布。具有最高固定概率的句子是在我们的图中连接得最好的节点。在下面的例子中,节点 A 可能具有最高的稳定概率。
高度连接的节点将具有高的稳定概率。这些节点应该代表一个关键主题的摘要,因为这些节点与许多其他句子最相关。但是,在我们走得太远之前,我们需要定义余弦相似度。
假设我们有两个句子——“杰克和吉尔上山了”和“吉尔和杰克跑下山了”。余弦相似度将这些句子视为词的向量,并使用下面的公式测量它们的重叠。余弦相似度计算两个单词向量的点积,并将其除以每个向量的幅度的的乘积。
现在我们都准备好了。我们将用矩阵来表示我们的图形。索引 (X,Y) 处的值将是句子 X 和*句子Y *之间的余弦相似度。该值是句子 X 和句子 Y 之间的转移概率。我们将使用这些转移概率来找到每个节点的稳定概率。
在马尔可夫链中,寻找平稳概率是相对简单的。我们可以重复地将转移概率矩阵乘以自身,直到我们达到一个稳定状态——此时所有的转移概率都收敛到一个单一值。更有效的解决方案是使用左特征向量。对这个方法感兴趣的,看这里。
现在我们有了一个稳态,我们可以寻找最高的概率。稳态概率最高的句子如下。
**"I'm Gatsby," he said suddenly.**
--------------------------------------------------------------------
**"You two start on home, Daisy," said Tom. "In Mr. Gatsby's car."**
--------------------------------------------------------------------
**"I told you I went there," said Gatsby.**
--------------------------------------------------------------------
**"I want you and Daisy to come over to my house," he said, "I'd like to show her around."**
--------------------------------------------------------------------
**She had told him that she loved him, and Tom Buchanan saw. He was astounded. His mouth opened a little and he looked at Gatsby and then back at Daisy as if he had just recognized her as some one he knew a long time ago.**
现在,数据科学最有趣的部分来了——得出我们的数据不不支持的结论。下面来评价一下我们的总结。
在我们的最后一句话中,黛西告诉盖茨比她爱他,她丈夫汤姆·布坎南看到了。这句话抓住了盖茨比、黛西和汤姆之间的复杂关系。在第四句中,我们看到盖茨比想带黛西参观他的房子。他确信,如果黛西看到他现在富有而成功,她会想和他在一起。这抓住了盖茨比努力用他目前的成功掩盖他的过去,这是小说的中心主题。我们的第一句话抓住了盖茨比自我介绍的标志性时刻。我们的模特做到了!我们已经总结了了不起的盖茨比!
Credit: The Great Gatsby, Warner Brothers, 2013
从我们的分析中有一个简单的方法可以得出上面的段落。它只需要一跳,一跳,一跳。我们的数据绝不意味着上述情况。我们的方法是强有力的,我们的分析是周到的。但是我引入了很多外界的知识来得出上面的结论。
我们强调这一点并不是要减少这种方法,而是要认识到我们方法的局限性。我们可以合理地推断出盖茨比、黛西和汤姆是相关的角色,并且盖茨比和黛西之间存在某种关系。我们当然已经找到了一些关键的想法,但我们还远远没有形成一个完整而全面的总结。
展望未来
当然,我们可以做一些事情来改进我们的方法,主要围绕句子相似性的确定。我们可以使用 TF*IDF 来查看哪些单词在一个句子中最相关,并相应地对它们进行加权。当测量余弦相似性时,我们不需要只考虑严格相等。我们可以考虑词义相近但拼写不相似的词(如 happy 和 ealthed)。如果我们想变得更强烈,我们可以使用高级主题模型,如潜在狄利克雷分配(LDA) 。
自动摘要被分为两个主要的领域— 提取方法和抽象方法。我们在这里谈论的一切都是一种提取方法。我们正试图从文本本身提取相关信息。但是没有人会写这样的摘要。人类接受概念,概括它们,考虑模式,并产生一个结果。这是一个抽象的方法。为此,我们需要计算机科学中最热门的三个词:深度神经网络。
我们很快就会使用这种方法,所以请留意那篇文章。
密码
对于那些感兴趣的人来说,运行它所需的所有代码都可以在 Github repo 这里找到。有 Python 代码和 Jupyter 笔记本。清理数据和计算邻接矩阵确实需要一点时间。使用 Jupyter Notebook,您只需运行这些方法一次。方法定义和代码结构与本文类似,因此很容易理解。
感谢阅读!
疑问?评论?在andrew.oliver.medium@gmail.com给我发邮件。我很想收到你的来信!
“阳光是最好的数据消毒剂”
人在回路中的机器学习专家轶事
我正在分享我的书《人在回路中的机器学习》中的第二个专家轶事。我有幸与机器学习社区的许多领导者聊过他们的经历。许多人和我分享了值得更多人关注的个人趣闻。
对于书中提到的每个领导者,有两个选择标准:
- 他们早期的职业是工程师或科学家。书中所有的专家都是软件工程师、物理学家、语言学家或类似的人,在他们职业生涯的早期阶段。因此,他们知道注释数据和/或构建机器学习模型是什么样的。
- **他们成立了一家使用机器学习的公司。**因此,专家们也知道考虑推出能够影响现实世界的机器学习产品意味着什么。
对于想在数据科学领域发展的人来说,所有的领导者都是很好的榜样。
这个轶事伴随着本书的第二章,在那里,读者建立了他们的第一个人在回路系统,我强调了查看你试图建立一个机器学习模型来处理的数据的重要性。
这位专家是 SkipFlag(已被 WorkDay 收购)的前首席执行官彼得·斯科莫罗奇(Peter Skomoroch),他曾在 LinkedIn 的团队中担任首席数据科学家,发明了这个“数据科学家”的头衔:
“并非所有数据都是平等的”
你需要深入查看真实数据,才能准确知道要建立什么模型。除了高级图表和聚合统计数据,我建议数据科学家定期检查大量随机选择的粒度数据,让这些示例“冲刷你”。就像高管每周查看公司层面的图表,网络工程师查看系统日志中的统计数据一样,数据科学家应该对他们的数据及其变化有一种直觉。
当我构建 LinkedIn 的技能推荐功能时,我构建了一个简单的 web 界面,其中有一个“随机”按钮,可以显示个人推荐示例以及相应的模型输入,这样我就可以快速查看数据,并直观地了解可能最成功的算法和注释策略。这是确保您发现潜在问题并获得高质量输入数据的最佳方式,这是至关重要的:您正在照亮您的数据,阳光是最好的消毒剂。
彼得·斯科莫洛赫,《人在回路中的机器学习》,罗伯特·芒罗,曼宁出版社
The best way to explore a forest is to take as much time as possible, with sunlight shining on it. The same is true for your data.
我非常感谢 Peter 与我以及我的书和这篇文章的读者分享她的专业知识!
另一个专家摘录,见第一个,“不是所有的数据都是平等的”,作者 Jennifer Prendki:
Jennifer Prendki 的《人在回路中的机器学习专家轶事》
towardsdatascience.com](/not-all-data-is-equal-63ad1b53b086)
总是注释你自己的数据
太多的数据科学家把数据标注当成别人的问题。他们在大学里只学到了机器学习算法,当他们开始构建现实世界的机器学习系统时,他们会感到震惊,他们会发现他们将花更多的时间来管理数据,而不是构建算法。
继续类比,如果你把数据当成别人的问题,你会被蒙在鼓里。除了定期查看随机数据之外,您还应该查看那些让您当前的模型感到困惑并且与您过去所见不同的项目。
如果您担心您的模型中的真实世界偏差(您可能应该担心),那么您还应该查看根据可能有偏差的人口统计数据分层的数据样本。您可能会注意到您的模型遗漏了数据中的一些差异,因为您的模型没有优化人口统计的公平性。
我建议尽可能在您的组织中运行常规注释系统。这是一个很好的均衡器:组织中的每个人都可以参与,因为您不需要技术知识来注释数据。然后每个人都可以说他们为提高你的组织的机器学习准确性做出了贡献!
罗伯特·芒罗
2019 年 11 月
超级碗预测模型
根据 1966 年至 2019 年的常规赛数据预测 2019 年超级碗的冠军
NFL Super Bowl Trophy (Lombardi Trophy) image source: Wikipedia
作者:
Matthew Littman 商业分析硕士
UCI 艾迪·达姆商业分析硕士
*撰稿人:*韦丹克希尔萨加尔,UCI 商业分析硕士
介绍
超级碗是一项非常受欢迎的体育赛事,每年举行一次,以确定国家橄榄球联盟(NFL)的冠军球队。在二月的一个星期天,数百万球迷聚集在电视机前,庆祝这个事实上的全国性节日。超级碗在 170 多个国家播出,是世界上最受关注的体育赛事之一。以精心制作的中场表演、名人亮相和令人捧腹的商业广告为特色,增加了吸引力。经过 50 多年的存在,超级碗已经成为美国文化的传奇象征。
随着常规赛在九月开始,超级碗结束了赛季。去年 LIII 超级碗的电视转播吸引了全球约 9820 万电视观众。这使得它成为今年最流行的话题之一。出于这个原因,我们的团队决定建立一个预测模型,利用国家足球联盟官方网站 nfl.com 和其他几个网站上发布的数据来预测超级碗 LIV (54 岁)的冠军。
超级碗对美国人来说是一场盛大的庆祝派对。全球有 9820 万观众,这使得超级碗成为美国最受关注的体育赛事。各大商家为一个 30 秒的广告支付了 500 万到 550 万美元,而且价格还在竞相上涨。这些巨大的数字和对游戏的热情吸引了我们对这个项目的关注。今年也是这项美国最受欢迎的运动的 100 周年纪念。
NFL 100 year anniversary logo. image source: Wikipedia
数据汇总
我们使用了 3 个不同的网站来收集我们所有的数据:NFL.com,pro-football-reference.com 和 topendsports.com。利用 Python 中漂亮的汤包,我们开始刮。我们希望收集过去的所有数据,从 1966 年的第一届超级碗开始,一直到现在(NFL 的第 13 周)。从 NFL.com 开始,统计数据分为进攻和防守两类,进攻有 11 张表,防守有 8 张表。NFL.com,NFL 的官方网站,是我们收集历史数据的主要资源,因为他们有着广泛的数据记录和整洁。该网站的一个缺点是,它不包含每个团队的赢、输和平局记录。我们的项目需要这些重要的指标,所以我们包含了来自一个名为“职业足球参考”的网站的数据。在搜集了 1966 年以来每支球队的记录后,我们最不需要的就是知道哪些球队在过去赢得了超级碗。在收集了所有这些数据之后,我们合并了基于球队和年份的信息,以便让每一行都成为一个球队和他们所有相应的统计数据。按照年份升序排序后,我们的数据集包含 1579 行、242 列和近 40 万个数据点。它已经准备好清洗了。
Figure 1. Scraped data sources
清洁
- 列名不直观,需要反映信息的来源。
- 需要将包含多条信息的列分成多列。
- 许多数据类型不正确,需要调整。
- 重新排列各列以确保可读性。
- 需要手动更改与其他表同名的列,以避免混淆。
- 同时,我们用“-99999”替换了缺失的值或 NAs
- 最重要的问题是许多列包含缺失的数据。
经过进一步的探索,很明显,某些统计数据直到某些年份才被记录下来。例如,大多数防守和踢腿的数据直到 1991 年才被记录下来。进攻线的数据直到 2009 年才被记录下来。在我们的 242 列中,有 89 列包含所有不同年份的缺失数据。
每个团队的统计数据都是特定年份中与该团队相关的独立事件。这意味着所有的计算或比较都必须在按年份分组后进行。我们还没有删除任何列,因为我们计划构建模型来只选择最重要的变量。
探索性分析
我们首先关注的是从 1966 年到 2018 年这 53 年间的超级碗冠军。图 2 显示匹兹堡钢人队和新英格兰爱国者队各以 6 胜领先,其次是旧金山 49 人队和达拉斯牛仔队,各以 5 胜领先;纽约巨人队和绿湾包装工队以 4 胜紧随其后。华盛顿红人队和丹佛野马队各有 3 胜,其次是奥克兰突击者队、迈阿密海豚队和巴尔的摩乌鸦队,各有 2 胜,排名最后的 11 支球队各有 1 胜。
Figure 2. Ranking of Super Bowl winners from 1966 to 2018
下面的图 3 显示了过去 53 年中所有球队的输赢分布。每个红圈代表一个球队的常规赛记录,没有超级碗冠军,而绿圈代表超级碗冠军。请注意,其中一些是堆叠的,因为团队可以有相同的记录。请注意,除了 1982 年的红人队,没有哪支球队赢得超级碗的胜场数少于 9 场,但由于罢工,那个赛季只有 9 场比赛。图 3 中标出了两个关键点;1972 年迈阿密海豚队和 2007 年新英格兰爱国者队。1972 年,迈阿密海豚队在常规赛中保持不败,赢得了超级碗。在令人印象深刻的赛季之后,海豚队想出了一个传统,当所有球队在整个赛季中至少输了一次时,就庆祝一下,这意味着他们将成为唯一一支不败的球队。2007 年,新英格兰爱国者队几乎打破了 35 年的传统,他们赢得了所有 16 场比赛,但不幸的是输掉了超级碗。需要注意的是,以前常规赛只有 14 场,1978 年这改成了 16 场。
Figure 3. Super Bowl wins and losses from 1966 to 2018
看触地得分统计,足球比赛中有 8 种方式可以触地得分;4 个来自进攻,4 个来自防守。如图 4 所示,在 NFL 的整个历史中,接发球和抢攻触地得分占所有触地得分的大部分,分别占总数的 55%和 36%。这是所有球队的平均值,不管超级碗的赢家还是输家。有趣的是,当看具体的超级碗冠军球队和他们的平均水平时,中心趋势是 55%和 36%左右,但范围变化很大。这让我们相信,在那些年获胜的球队正在做一些与其他人不同的事情,根据年份的不同,他们要么跑得更多,要么扔得更多。这一探索向我们表明,一个球队抢断或接球的达阵率将是超级碗冠军的重要预测因素。
Figure 4. Distribution of 8 types of touchdowns
我们看了几个区分超级碗赢家和其他人的统计数据。很自然,常规赛的胜利数是决定谁将赢得超级碗的一个重要因素。历史上,超级碗冠军平均每场比赛多 3.18 次进攻冲刺。这表明球队应该尝试更多的跑动进攻。超级碗赢家的平均传球距离也比非赢家高 0.75 码。建议球队应该把球扔得更远,以增加获胜的机会。
赢家和输家在进攻比赛数据失误方面的明显差异表明,失误是谁赢得超级碗的一个巨大差异。最后,超级碗冠军的防守传球比其他人高出 7.15 分。强大的防守导致更多的盖帽,这可能会导致更多的失误!
Table 1. Comparison of key statistics between Super Bowl winners and losers
在研究了所有数据后,由于数量庞大,很难找到所有变量之间的趋势或相关性。拥有超过 240 个统计数据,可以获得的洞察力大多是基于这项运动的先验知识。这种游戏意识有助于将我们的注意力引向这些领域。
建模
我们的数据集中需要解决的第一个问题是缺失数据。删除那些包含缺失值的列的问题是,它们中的许多捕获了游戏的非常重要的方面,这否定了我们有价值的年份的信息。用各自列的平均值填充这些值没有意义,因为有些列包含大约一半缺失值和一半现有值。这取决于 NFL 何时开始记录它们。使用平均值会严重扭曲这些列的结果,但最重要的是,团队绩效在这些年中变化很大,平均值不能反映这种变化。缺失的统计数据应该反映出团队当年的表现,这使得我们使用更先进的预测技术来填补缺失的数据。
数据插补
线性回归
第一种技术使用线性回归,其中因变量是包含缺失数据的列之一,自变量是其他列。该模型基于这些列的现有数据进行训练,因此,将根据该团队和该年的其他列来预测每个缺失的观察值。应该指出的是,对于所有的预测插补方法,数据都在每年内进行了标准化,以便在预测时调整比例问题。为了进一步提高预测准确性,对每一列都执行了一种称为递归特征消除的技术。递归特征消除(或 RFE)是一种将列数减少到仅相关列的方法。它通过获取所有列的子集来做到这一点,然后允许您分配一个决策函数来决定该子集中的哪些列是最重要的列。在我们的案例中,我们使用了逻辑回归,它基于返回那些具有最高系数的变量。这些系数衡量该变量对因变量的总体影响。在删除该子集中影响最小的列之后,通过选取不同的子集来重复该过程。它重复这个过程,直到剩下的重要列数等于用户指定的列数,在我们的例子中是 20。这意味着要预测的丢失数据的每一列都使用特定于该列的一组不同的列来进行线性预测。在预测了所有缺失的数据点之后,这些点必须与以前的数据框架重新聚合。不幸的是,在将现有值与预测值进行比较后,很明显预测结果与现有值不符,因此无法使用。
k-最近邻
在咨询了之前的统计学教授 Mohamed Abdelhamid 之后,有人建议使用K-最近邻(或 KNN)技术。这种技术将每个观察值视为其所有属性的集合,并在 n 维空间中绘制每个观察值,其中 n 是列数。对于缺失值,KNN 试图通过查找缺失值的当前观测值与其 K 个最近邻点之间的最小距离来解决这一问题,其中 K 是要查找的相邻点的数量。图 5 显示了一个例子,其中黑色值是我们希望估算的观察值。
Figure 5. KNN visual for classification in order to impute missing values.
一旦设置了相邻要素的数量,该算法会将所有相邻要素值的平均值作为您尝试替换的值。在我们的例子中,我们使用了 5 个最近的邻居。如果多个列需要估算值,就像我们的例子一样,该算法将需要替换的列从最少的值到最多的值进行排序。这种算法只有在列缺少的值越少时才会越好,因此这种排序通过首先进行最佳预测来提供帮助。这种方法在理论上非常有效,但同样不能使用,因为预测值与已经存在的值不一致。
链式方程的多重插补
之前的两种插补方法都不起作用,最后尝试了名为多重插补的链式方程(或 MICE)法。这种方法也被称为“完全条件说明”或“序贯回归多重插补”。在 Azur Melissa 关于老鼠的文章(2011)中,她解释说这种技术已经用于随机缺失的数据。我们的数据不是随机缺失的(MNAR),但是进一步的研究表明它依赖于数据集,并且其他人已经将它用于 MNAR 的数据。python 包“fancyimpute”被用于这个项目的 MICE 算法。
MICE 可以被认为是我们之前提出的线性回归方法和 KNN 算法的结合。它将每一列作为因变量,并运行回归,在这种情况下,贝叶斯岭回归。这样做是为了使用与该行相关的其他属性来预测该值。用户指定他们希望算法循环多少次,然后每个循环创建一个数据帧。具体来说,该算法工作如下:
- 取每一列缺失的数据(89 列中的一列),对每一列运行 MICE 算法。
- 首先用中位数填充该列的缺失数据。
- 对第一列中缺少值每一行运行回归。
- 使用 4 个(用户指定的数量)最近邻回归值的平均值作为该行的缺失值。
- 填充完所有值后,检查用户指定的最大循环次数(在我们的例子中是 1000)。
- 每个周期产生 1 个数据帧,包含该列的填充值。
- 根据以下两个选项中先出现的一个,算法停止处理它正在处理的列:
- 如果值已经收敛,并且没有根据用户指定的停止容差从一个周期到另一个周期发生变化,则使用该收敛值作为该行的缺失值。
- 否则重复前面的过程,直到创建了 1000 个数据帧。
- 如果这些值没有收敛,该算法将汇集/收集该特定行中已创建的所有 1000 个数据框的结果。
- 基于这些值创建分布。
- 最可能的值(分布的最高峰)用作该行的缺失值。
- 该列的所有值现在都应该被填充,并对其余的列重复
图 6 直观地展示了该算法的工作原理。循环的数量被设置为 3,从而创建了 3 个数据帧,而不是我们示例中的最大值 1000。
Figure 6. Visual representation of MICE algorithm with cycles = 3 for one column (Stef Van Buuren, 2011)
评估这种方法的结果证明是非常有希望的。大多数值在其各自的行中都是有意义的,因为数据在输入到算法之前是标准化的,所以结果输出遵循基本的正态分布。预测值大多落在平均值左右 1 个标准偏差内或在 0.3 和 0.7 之间。
Figure 7. Shows the normal distribution of the output prediction imputations. image source: statisticshowto.datasciencecentral.com
处理不平衡数据
既然丢失的数据已经得到处理,现在是处理不平衡数据问题的时候了。过去的超级碗冠军只有 53 支,每个赛季有 32 支球队(早些年的球队更少),这导致了 1525 支球队“非冠军”和 53 支球队冠军的不平衡。由于我们总人口中只有大约 3%的人是赢家,很难有一个模型在没有干预的情况下预测这些值。这类似于将交易标记为欺诈的问题,其中大多数交易是真实的,只有少数是欺诈的。当然,预测一个超级碗冠军作为一个非超级碗冠军不会有巨大的成本,就像交易一样。这种不平衡使得建模困难。以下是处理不平衡数据的一些方法及其功效:
Table 2. Summary table of sampling methods described in original SMOTE research paper (Chawla,Bowyer,Hall,Kegelmeyer, 2002)
在研究了可能的采样方法后,无论是对少数进行过采样(不会导致更好的少数检测)还是对多数进行欠采样,或者是两者的某种组合,合成少数过采样技术(或 SMOTE)被证明是最佳选择。
SMOTE 如何工作
除了(Chawla 等人,2002)中提到的对多数采样不足之外,少数过采样方法是这种采样方法背后的真正天才之处。第一项是决定需要进行多少过采样。在我们的案例中,我们希望“赢家”和“非赢家”各占一半。SMOTE 是用 Python 中的“imblearn”包实现的。
出于示例目的,我们将对少数部分进行 200%的过采样。这意味着每个少数民族点将负责创建 2 个额外的合成点,以便将我们的少数民族数据点计数增加三倍。接下来,用户必须决定使用多少个最近邻进行生成,在(Chawla 等人,2002 年)中,他们使用了 5 个。做出这些决定后,算法会执行以下操作:
- 选择要使用的第一个少数点。
- 找到用户指定的 K 个最近邻(在我们的例子中是 5 个)。
(注意,这些最近的邻居只是少数邻居,而不是所有的点)
- 在这 5 个点之间画边。
- 检查需要执行的过采样量(如果是 500%,您将为所有 5 条边的每条边创建一个新点)
- 因为我们的例子百分比是 200%,随机选择 5 个创建的边中的 2 个来创建新点。
- 随机选择一个介于 0 和 1 之间的数字,该数字将确定沿已创建的边的距离。(其中 1 将位于相邻点的正上方)。
- 对所有少数点数重复该过程,以获得开始时的三倍金额。
Figure 8. Synthetic samples visual from Kaggle sampling technique article (Rafjaa, 2017)
Table 3. SMOTE results before and after
特征选择
如上文数据插补-线性回归部分所述,递归特征消除(RFE)是一种将列数减少到最重要的列数的便捷方法。现在,缺失的数据已经被填充,不平衡的少数已经被平衡,我们进行了 RFE 筛选出谁将赢得超级碗的前 20 个最有影响力的专栏。它们如下:
Figure 9. Top 20 most impactful columns after using RFE
选择了 20 个最有影响力的专栏,所有的系数都有意义,除了进攻线统计。这些数据在 2009 年才开始被记录,因此缺少的数据最多。当这些柱子被取出时;然而,其他列的系数不再有意义。胜率变成了负数,正如我们之前在探索性分析中提到的,考虑到胜率越多,进入超级碗的可能性就越大,这显然应该是一个正系数。我们的假设是,这 3 列被用作添加的噪声,以便其他列做得更好并避免过度拟合,因此我们将它们留在我们的模型中。为了验证,我们检查了相关表,以确保变量之间没有多重共线性。虽然赢和输之间有很强的负相关性,但我们决定将这两者作为我们的模型正确运行的指标。这个相关表可以在下面找到。
Figure 10. Correlation table with 20 columns used for model
使用 RFE 后,我们回过头来在超级碗赢家和非赢家之间进行了两个样本的独立 T 检验,并选择了它标记为重要的列。我们只在模型中运行这些选定的列,并通过这些列过滤数据集,然后对 T-test 过滤结果执行 RFE。总的来说,就准确性和召回率而言,最好的方法是使用 RFE。
预测算法
我们已经修复了所有缺失的数据,我们不平衡的少数,并选择了 20 个最有影响的列,我们希望输入到预测算法中。我们选择使用逻辑回归,因为它的可解释性和易用性,尽管神经网络可能有潜力给定我们拥有的数字数据量。这有可能在未来进行探索。
我们使用了 20-80%的训练验证分割,其中我们在 1966-2018 年的 80%随机样本上进行训练,然后在另外 20%上验证我们的模型。这产生了 95%的测试准确度。
Table 4. Confusion Matrix from Logistic Regression showing actual versus predicted results
Table 5. Classification report from Logistic Regression validating accuracy, recall, and precision
非赢家的召回率为 89%,赢家的召回率为 100%,总体准确率为 95%,当赢家实际上不是赢家时,我们的模型在预测赢家方面的误差更大。它还预测 0 非赢家为赢家,这意味着我们的模型实际上更有可能说某人是赢家,而他们不是。这实际上是有利的,当考虑到一个球队在赛季中的实际预测。我们宁愿让我们的模式给更多的人一个“潜在”机会,而不是把每个人都贴上非赢家的标签。利用一个非常有前途的混淆矩阵,我们绘制了我们的 ROC 曲线,显示曲线下的面积为 95%。
Figure 11. ROC curve shows an AUC of .95
结果
预测赢家
在训练和验证之后,是时候通过尝试预测当前的 2019 赛季来测试我们的模型了。如图 12 所示,我们的模型能够根据获胜的机会对每支球队赢得超级碗的机会进行排名,最高百分比的球队位于顶部。预计旧金山 49 人队和新英格兰爱国者队分别有 96%和 76%的机会赢得超级碗。在当前的 2019 年 NFL 季后赛中,49 人队将被列入外卡名单,战绩为 10 胜 2 负。爱国者队是分区领先者之一,也有 10 胜 2 负的记录。此外,所有我们的模型给了百分之十机会的球队,都是预定进入季后赛的球队,或者有很大机会进入季后赛的球队。唯一的例外是卡罗莱纳黑豹队。
Figure 12. Winners that our model predicts vs. current NFL results
预测失败者
我们的模型不仅以惊人的准确性预测了球队成为冠军的可能性,还预测了赢得超级碗的可能性低到零的球队。如图 13 所示,我们的模型预测狮子队、红雀队、猎鹰队、巨人队、海豚队和孟加拉队没有机会赢得超级碗,考虑到他们甚至已经被淘汰出季后赛,这是有道理的。我们的模型还预测其他几个团队的机会为零,这些团队被称为“在狩猎中”。这意味着如果他们能在赛季的最后 4 场比赛中提高他们的记录,他们仍然有机会进入季后赛。我们的模型认为这些团队做不到。在图 12 中,底部的团队被剪掉以提高可视性,而在图 13 中,中间的团队被剪掉。这解释了每个图中列出的不同团队名称。
Figure 13. Losers that our model predicts vs. current eliminated NFL teams
结论
总之,为我们的模型提供最高预测准确性的最佳方法是使用 MICE、SMOTE、RFE 和逻辑回归的顺序技术。这种方法给我们的曲线下面积为 0.95,非获胜者的召回率为 0.89,获胜者的召回率为 1.00。此外,F1 的非获胜者分数为 0.94,获胜者分数为 0.95。这个统计数据代表了精确度和召回率的调和平均值
预测 2019 年超级碗冠军的一些最重要的属性是:
- 接受触地得分的进攻百分比
- 每场比赛进攻抢攻次数
- 每场比赛平均进攻传球码数
- 平均防守传球码数
- 周转差额
- 防御袋
- 防守触地得分总数
对于未来的项目,我们希望探索利用我们的数据使用神经网络的可行性,以及利用球员统计数据、天气数据、主场比赛还是客场比赛以及球队比赛历史来预测比赛水平的比赛。
此外,我们认为受伤预测的定量方法,使预防措施成为可能,对球员和球队管理都是有益的。考虑到许多伤害是作为事故而不是退化发生的,这将是具有挑战性的,并且可能是不可能的。
使用相同的数据集,发现好的防守和好的进攻哪个对赢得超级碗更重要会很有趣。
最后,我们认为为购买/交易球员或建立梦幻足球队建立一个推荐系统,类似于网飞的高级推荐系统可能是非常有价值的。像这样的模型必须捕捉团队动态,以及什么标准构成好的团队,然后评估当前的团队,并根据团队的弱点推荐球员。
我们所有的代码都可以在
github:https://github.com/kelandrin/NFL-Superbowl-Prediction
(目前正在制作一个可以使用该代码的 web 应用程序)
相关作品/参考文献
超级碗历史
History.com 编辑。"超级碗历史"History.com,A&E 电视网,2018 年 5 月 11 日,https://www.history.com/topics/sports/super-bowl-history.
超级碗收视率
佩雷斯莎拉。"超级碗 LIII 创下流媒体记录,而电视收视率大幅下降."TechCrunch,TechCrunch,2019 年 2 月 5 日,https://TechCrunch . com/2019/02/05/super-bowl-liii-set-streaming-records-while-TV-viewership-saw-massive-drop/。
通过链式方程进行多重插补
圣乔治的德拉科斯。"处理机器学习中的缺失值:第 2 部分."中,走向数据科学 2018 年 10 月 5 日https://Towards Data Science . com/handling-missing-values-in-machine-learning-part-2-222154 B4 b 58 e
《链式方程的多重插补:它是什么?它是如何工作的?》国际精神病学研究方法杂志,美国国家医学图书馆,2011 年 3 月,https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3074241/#R8.
Buuren、S. van 和 K. Groothuis-Oudshoorn。“小鼠:r .Stef Van Buuren,2011 年 12 月 1 日,https://stefvanbuuren . name/publication/2011-01-01 _ vanbuuren 2011 a/。
合成少数过采样技术
《SMOTE:合成少数过采样技术》对 SMOTE 的看法:合成少数过采样技术,人工智能研究杂志,2002 年 6 月,https://www . Jair . org/index . PHP/Jair/article/view/10302/24590。
拉夫贾。"不平衡数据集的重采样策略."Kaggle,Kaggle,2017 年 11 月 15 日,https://www . ka ggle . com/RAF jaa/重采样-不平衡数据集策略。
递归特征消除
李,苏珊。"用 Python 一步一步地构建逻辑回归."中,走向数据科学,2019 年 2 月 27 日,https://Towards Data Science . com/building-a-logistic-regression-in-python-step-by-step-becd 4d 56 c 9 c 8
Keng,Brian 等人,深入研究数据,2014 年 12 月 20 日,https://blog . Data dive . net/selecting-good-features-part-iv-stability-selection-rfe-and-everything-side-by-side/
超级计算
随着我们文明的进步,对越来越强大的计算机的需求与日俱增。科技进步越来越快。计算能力的提高使这成为可能。超级计算机的功能和计算机一样强大。
什么是超级计算机?
超级计算机是高功率和高性能的计算机,用于执行非常特殊的任务,需要大量的计算。这种计算由强大的 CPU 提供,但大部分来自称为 GPU 的特殊处理设备,与 CPU 中的 4、8 或 16 个核心相比,GPU 可能由数千个核心组成。
GPU 是图形处理单元,顾名思义,它们是用来渲染图形和其他图像处理任务的。这需要大量的计算,但是大部分计算可能是重复的。GPU 广泛用于 3D 图形渲染、游戏、模拟等。
GPU 和我们正常的 CPU 有什么不同。他们在核心上是一样的(懂了!)但它们仍然非常不同。CPU 和 GPU 都旨在执行数学计算,但有些任务 GPU 比 CPU 做得更有效。
如果你有一个顺序计算,也就是说,每一步都依赖于前一步,那么 GPU 就不行,你需要一个 CPU。但是,如果你有相互独立或重复的计算,那么 GPU 会做得更好,因为 GPU 只是为了做这些而优化。
GPU 非常适合机器学习任务,因为大多数神经网络架构都是令人尴尬的并行。这意味着它们可以彼此独立运行,最终结果不会受到影响。这是 GPU 肯定能打败 CPU 的一件事。
下面是来自维基百科的 GPU 的正式定义:
一个图形处理单元 ( GPU )是一个专门的电子电路,设计用于快速操作和改变存储器,以加速帧缓冲器中图像的创建,用于输出到显示设备。GPU 用于嵌入式系统、手机、个人电脑、工作站、游戏机。现代图形处理器在处理计算机图形和图像处理方面效率很高。
如果您曾经玩过高端游戏或执行过任何计算密集型任务,如运行繁重的软件,您可能会注意到您的系统变热,并且您会听到风扇的声音变快,但为什么会这样呢?
当处理器进行计算时,它需要能量,这种能量可能会以热量的形式消耗掉,我们需要移除这些热量,否则它会损坏我们的处理器。为此,我们需要风扇和/或散热器来散热。一些游戏电脑更进一步,还包括水/油冷却系统,在冷却处理器方面效率更高。
这个问题在超级计算机上更加突出。超级计算机需要大量的能量,因此会消耗大量的热量。为了冷却这种热度,我们需要做大量的安排,这使得安装超级计算机相当困难和昂贵。
他们能做什么?
但是,当我们可以在 1000 美元的机器上同样良好地浏览时,我们为什么要使用超级计算机呢?答案很简单——它们不适合日常使用。它们的主要目的是执行我们的普通计算机甚至大型计算机组无法执行的计算。
超级计算机最重要的用途之一是为事物提供模拟模型,如根据天气数据进行天气预测或模拟药物、分子等。更多地了解它们的内部结构。
在计算机环境中,模拟可以被认为是真实世界的数学模型。但是模拟的理解和定义要复杂得多。如此复杂,以至于有些人甚至无法区分模拟和现实,因为这两个术语似乎都没有非常明确的定义。因此,许多人认为我们可能生活在一个模拟世界中,很可能是由某个高级文明所运行的。一些人还认为,如果有足够的计算能力,你可以模拟整个宇宙。
模拟非常有用,因为我们可以在模拟中做一些在现实生活中可能做不到的事情,比如改变一些条件/变量,并测量它们的影响。例如,爱德华·洛伦茨发现,即使是自然条件的微小变化也可能对天气产生巨大影响。这种现象被称为蝴蝶效应。他的理论为“混沌理论奠定了基础。
模拟分子需要大量的计算能力,因为粒子之间的相互作用数量巨大,数学建模相当费力。但是,如果我们能做到这一点,我们应该能够模拟分子的组合,并找出它们是否对某些疾病有效。这可以彻底改变医疗行业和药物的生产方式。尽管超级计算机功能强大,但这仍然是不可能的。我们需要被称为量子计算机的不同种类的计算机来做这件事。
我们还可以使用超级计算机进行流体模拟,模拟宇宙中的一些事件,或者根据从遥远的星系获得的数据重建一幅可能发生的画面。
超级计算机今天被广泛应用,如模拟量子计算机以检查量子计算机给出的答案是否正确,预测地震,模拟黑洞,模拟蛋白质折叠,模拟人脑等。
这场比赛
但是,我们如何比较哪台超级计算机更好,即哪台具有更高的计算能力?为了测量超级计算机的能力,我们使用 FLOPS 或每秒浮点运算。
例如,现代超级计算机的性能是以 petaflops 来衡量的,我们普通的计算机可以执行 gigaflops。超级计算机在 80 年代也是这个速度。因此,超级计算机不是用绝对术语定义的,而是用相对术语定义的,即当时最强大的计算机。
计算能力越来越成为权力的象征。例如,挖掘比特币等加密货币需要巨大的计算能力。如果你有这种能力,你可能什么都不做就能赚几百万。如果有足够的计算能力,你也许能够破解加密或者攻击另一个国家的军队。因此,计算能力在现实世界中变得越来越强大,谁拥有大量的计算能力,谁就一定有优势。
这导致各国建造自己的越来越强大的超级计算机(当然是为了有用的目的),人们不断比较它们,看看哪个国家在这场竞赛中领先。Top500 是一个列出并排列世界上 500 个最强大的非分布式计算机系统的项目。
超级计算机也可能表明一个国家实力的增强。例如,在 2005 年,中国没有超级计算机进入 500 强,但今天他们有一些最快的超级计算机,不仅如此,他们有 200 多台超级计算机进入 500 强,这也是任何国家拥有的最高水平。
摘要
计算机从机械计算器到机电设备再到我们今天知道的电子计算机的发展方式令我着迷。这些不可思议的机器背后的进化和丰富的历史令人着迷,并促使我们相信看似未来和不可能的事情可能是可能的。超级计算机是计算机能力的一个极端例子。
在这篇博客中,我们深入研究了超级计算机。我们看了超级计算机的构建模块,GPU 以及超级计算机可以用来做什么,特别是模拟。然后,我们看到了如何进行一场竞赛,以积聚尽可能多的计算能力。
计算的未来看起来令人兴奋,不同种类的材料,从水到碳到用于计算的 DNA,以及应用于计算的各种方法,如量子力学的使用。不同研究和计算分支的结合似乎为各种令人兴奋的应用铺平了道路。
使用 Python 中的 fastText 实现句子嵌入的超级简单的方法
Photo by Patrick Tomasso on Unsplash
通过 tofunlp/sister 获得单词嵌入的超级简单的方法。
当您在使用包含一些 NLP 技术的应用程序时,通常会希望文本数据中嵌入单词。这样你就可以做各种各样的事情,比如计算句子的距离,分类或者很酷的可视化。
但是下载预先训练好的单词嵌入(例如, word2vec , fastText )并以某种方式加载它们通常需要一些时间。而且这些过程不是很有趣(至少对我来说),也不容易管理和保持这些代码的整洁。
所以在本文中,我要介绍一个小 python 库,命名为姐姐(简单句嵌入器)。(是的,我喜欢给我的项目取奇怪的名字)。这个 pip 可安装的库允许你做两件事,1)下载预先训练的单词嵌入,2)提供一个简单的界面来使用它嵌入你的文本。作为一个额外的功能,因为我写这个库是为了易于扩展,所以支持新的语言或算法来嵌入文本应该是简单和容易的。
现在,让我告诉你它有多容易使用。只需 4 行代码就可以完成。
看到了吗?非常容易。
你不需要做任何下载或构建,当你第一次使用 MeanEmbedding 时,它会自动下载预先训练好的Facebook research/fast textvector。
目前,该库仅支持英语和日语。不过,由于实现是可扩展的,只需在这里的给预先训练好的向量添加 URL,就可以轻松添加自己喜欢的语言。或者您可以为请求创建一个问题,以便我可以添加它。
下面展示了 MeanEmbedding 创建句子向量的方式,这是一个非常简单但也非常有效的方法(参考:我最喜欢的论文之一)。
How it gets sentence vector from sequence of words.
正如您在上图中看到的,它首先将所有给定的单词转换成单词嵌入,然后获取它们在元素方面的含义。因此,句子向量的大小与每个单词嵌入的大小相同(在前面的示例代码中为 300-dim)。
在本文中,我们介绍了如何使用单词嵌入来获得句子嵌入。希望你喜欢,自己嵌入一堆句子!
Pytorch 闪电的 36 种方式可以增强你的人工智能研究
Come at me AGI
AGI 不会自己解决问题(在内心深处你知道我们是另一个人工智能的 AGI🤯).
但是让我们假设它做到了…
想象一下,翻开你的笔记本电脑,你会发现一个为你编写的这样的算法。
def AGI(data):
data = clean(data)
agi = magic(data)
return agi
嗯好的🤔。让我们看看这是怎么回事。你说服你的研究小组你需要对此进行一些试验。
但是 obvs 这不会像写的那样运行。首先,我们需要一个训练循环:
for epoch in range(10):
for batch in data:
agi = AGI(batch)
agi.backward()
...
好了,现在我们算是训练了。但是我们仍然需要添加一个验证循环…
def validate(dataset):
# more magic
毒品。但是 LOL AGI 在一个 CPU 上?
你想得美。
让我们在多个 GPU 上运行这个…但是等等,你也已经读到过16 位可以加速你的训练。天哪,但是有 3 种方法可以进行 GPU 分布式训练。
所以你花了一周的时间编写代码。但是仍然很慢,所以您决定使用计算集群。现在事情变得有点复杂了。
Sad times
与此同时,你的 AGI 有一个 bug,但你不确定这是你的 GPU 分配代码,还是你如何加载你的数据,或者其他任何你可能编码错误的事情。
你决定你不太想处理所有的训练细节,你尝试 Keras,但是它不能让你很好地实现 AGI 函数,因为你需要对训练有更多的控制。Fast.ai 也是不可能的,因为这不是现成的算法。
好吧,那太糟糕了,现在你已经自己编码了…
没有。
Pytorch 闪电
How you feel when running a single model on 200 GPUs
Pytorch Lightning 已经为你编写了所有这些代码,包括测试到保证程序的那部分没有错误。
这意味着你可以专注于研究的核心,而不必担心所有繁琐的工程细节,如果你不必专注于核心研究理念,处理这些细节会很有趣。
这里有一个清晰的图表,显示了什么是自动化的。灰色部分是自动化的,通过教练旗控制。你可以使用你想要的任何底层模型(你自己的、预训练的东西、fast.ai 架构等等),将蓝色部分定义为你想要的任意复杂。
You own the blue. Lightning owns the rest.
闪电模型
Lightning 的核心是两件事,一个 LightningModel,一个 Trainer。LightningModel 是你 90%的时间花在这里的地方。
Lightning Module Template
请注意,您正在定义培训循环中发生的事情
for epoch in range(10):
for batch in data:
# training_step above is what happens here
# lightning handles the rest (backward, gradient clip, etc...)
验证也是一样
for val_batch in data:
# validation_step above is what happens here
# with no grad, eval, etc... all handled for you automatically
上面这两个函数会变得非常复杂。事实上,您可以在这两个函数中定义一个完整的 transformer,seq-2-seq,fairseq 模型。
培训师
培训师处理您不想编码的东西的所有核心逻辑,但是您需要保证它被正确地完成并且使用最新的最佳实践。
只需设置几个标志,你就可以在 CPU、多 GPU或多节点集群上训练你的 AGI。不仅如此,您还可以启用渐变裁剪、累积渐变、 16 位精度、自动聚类保存、超参数快照、张量板可视化等
你明白了。
你不仅可以获得训练人工智能系统的最新和最棒的技巧,还可以保证它们能够正常工作并且经过正确的测试。
这意味着你只需要担心你的部分——新算法——是否正确。如何加载数据以及在培训的核心部分做些什么由你决定。
那么,Pytorch 闪电的 36 种帮助方式呢?大约有 36 个你通常自己实现的东西可能会有 bug。Lightning 会做并测试它,所以您不必这样做!
点击这里查看完整列表
恭喜你。你可以利用刚刚回来的所有空闲时间来完成你正在做的兼职项目(可能是你小狗的聊天机器人,或者是优步的瑜伽裤)。
利用 PowerBI 为创业分析提供超强的 Excel
如何将 Excel 用作数据分析师而不是数据猴子
Excel 似乎是我遇到过的最讨厌的工具。这是一个遗憾,因为如果你忽略这个坏名声,它是你腰带上最好的分析工具之一。
根据我的经验,Excel 有两个用途:高级报告和数据分析。
高层次的报告正在把握你的业务脉搏。您可以在文章【insight 的启动报告模板中查看更多详细信息。它不是那种有数百个 KPI(关键绩效指标)和多达一百页、只有少数人阅读、没有人采取行动的每日报告。对于这些,任何商业智能报告都可以。高水平的报告是你想看的那种报告,因为它讲述了一个重要的故事(企业如何运作,为什么会这样,你应该另找工作吗?).即使大多数网飞的决定是基于分析,它有助于增加一点工艺。对于这样的报告,可能只是在图表中添加一个标签,以记住某个特定产品由于库存问题正在下降,或者通知下降位于特定区域。数字很好,但有一点解释会有所帮助。
对于高级报告来说,Excel 很好,因为它让您自动完成大部分工作,同时让您添加最后的润色。
数据分析使商业人士能够理解高层报告下发生的事情。它在构建一个你是英雄的故事。销售数字下降,没有人知道为什么,找到罪魁祸首夏洛克。
Excel 给你提供了很棒的数据透视表,到处添加了一些公式,很好的单元格条件格式。您可能更喜欢使用代码(SQL、Python 或其他什么)进行干净的处理,但要突出显示数据中的内容,Excel 是最好的。
1-将数据、计算和呈现分开,以保持理智
你的 Excel 表格反映了你的精神状态。可以干净,也可以混乱。不要让它是后者。
受 webapps 的模型-视图-控制器的启发,我把我的电子表格分成三种标签。
第一类是演示表,它将仪表板和分析表重新组合在一起。仪表板显然是整洁的部分(你在启动报告文章中看到的部分)。我还添加了一个分析表,在那里我放了一个大的动态交叉表,如果仪表板部件中的某些东西需要更仔细的检查,用户可以在那里更深入地挖掘。
第二种是数据层。在这些表中(每个数据源一个表),有数据并且只有原始数据。没有公式。我给它们贴上数据标签,并总是把它们标为黄色。
最后一种表是计算表。这是我放置业务逻辑(以及所有那些 Excel 公式)的地方。这些被标记为隐藏和灰色,因为没有用户应该去那里(他们大部分时间是隐藏的)。
这种简单的关注点分离会让你内心平静。如果有问题,你知道你应该首先检查相关的数据表,然后,如果错误不存在,相关的隐藏表。你应该有一个简单的数据血统。
在下一步中,我们将看到如何自动更新数据层。
2 —数据连接是自动化的关键—停止复制/粘贴
人们讨厌 Excel 的一个原因是,大多数人最终会花费数小时复制/粘贴。事实上,没有一个 Excel 报表需要点击一次才能刷新。
让我们假设您有一个 Postgresql 作为数据集市,它每天晚上都会转储一些生产数据(可以是一个共享目录,但数据库更有效)。使用右 ODBC 驱动(Excel 理解的常用中间件),可以直接从 Excel 中读取数据库。您可以选择一个表,甚至可以编写一个合适的 SQL 查询。这个不错的工具在 Get Data->From Other Sources->From ODBC(From Database 应该是从微软数据库中读取的)。
只需按下 Load,数据将从数据库中加载。好的方面是它将打开一个查询面板,您可以在其中随意刷新数据(注意:数据面板中的 Refresh All 按钮也可以工作)。
因此,我们只需点击几下鼠标,就能看到带有条件格式的数据透视表,在那里,您可以很容易地发现 2 月份存在季节性效应,2013 年 7 月开始会有大幅提升。
使用这样的工具,您可以轻松创建一个高级报告,就像我们为 Brewnation 所做的那样。请记住为每个数据连接创建一张表,一张或多张用于计算,一张用于演示。
说到计算,使用 Excel 公式会很痛苦并且容易出错。好消息,有了 PowerBI 有了更好的方法。
3 — PowerBI for Excel 是获得超能力的关键
Excel 的超能力还有一层。被微软巧妙隐藏。我称之为 PowerBI for Excel,但 PowerBI 现在是一个独立的产品线,采用不同的方法(但核心是相同的)。在过去,它被称为权力中枢和权力查询,但它早已不复存在。在那些日子里,这只是 Excel 很少有人知道一个功能。
在上一节中,我们建立了 Excel 和数据源之间的链接。让我们将这些数据加载到 PowerBI 引擎中,而不是加载到工作表中。使用“加载到”打开“导入数据”对话框,而不是“加载”按钮。在这里,我们将创建连接并将数据添加到数据模型中。
数据模型是 PowerBI 的存储部分。您不再受限于 Excel 的一百万行。这种列压缩存储也非常擅长于只占用很小的空间。
要显示此数据模型中的内容,请使用数据功能区中的“管理数据模型”按钮。
可以通过添加新的计算列和聚合度量来增强整个模型。事实上,您的大部分计算层都可以放入 PowerBI 引擎。
如你所见,一旦你知道如何使用它,Excel 真的很强大。它是主流的分析工具。
原载于 2019 年 5 月 10 日【https://dataintoresults.com。
超级 Jupyter 笔记本
Jupyter 笔记本目前是全世界 Pythonistas 最热门的编程环境,尤其是那些对机器学习和数据科学感兴趣的人。几个月前,当我开始认真研究机器学习时,我发现了 Jupyter 笔记本。最初,我只是惊讶,喜欢我的浏览器里面的一切。然而,我很快就失望了,发现 stock Jupyter 笔记本界面非常简单,缺少几个有用的功能。那时,我决定去寻找一些 Jupyter 笔记本电脑黑客。
在这篇文章中,我介绍了几个 jupyter 笔记本插件/扩展和几个 Jupyter 命令,它们将增强您的 Jupyter 笔记本并提高您的工作效率。简而言之,为你的 Jupyter 笔记本充能。
一旦您按照下面的说明操作,您的 Jupyter 笔记本将拥有以下出色的功能(如果您愿意,还可以有更多功能):
- 能够在多个 Conda 环境之间动态切换,无需重启 Jupyter 笔记本。
- 1-click 可点击目录代(你会喜欢这个的!)
- 一个超级有用的弹出便笺本(我最喜欢的功能!),您可以在那里试验和测试您的代码,而无需更改主笔记本中的任何内容。
- 代码单元内的代码折叠。我想知道为什么 Jupyter 笔记本没有这个功能。
- 1-click 代码单元格隐藏,这是您通过可视化讲述数据故事时的一个重要功能…人们通常对你的图表感兴趣,而不是代码!
- 一个超级酷的变量检查员!
- 用于降价单元格的拼写检查器。
- 那些深夜的编码会议。
- 一个代码片段菜单,用于添加常用的 python 构造,比如动态的列表理解。
- 最后,绝对最棒的功能, 舒缓美丽的午夜蓝配色拯救你的眼睛 !
是时候充能了!
首先,我们将确保我们的笔记本有一个很好的黑色主题,可以舒缓眼睛。如果你每天长时间工作,白色的背景会让你的眼睛出血。无论如何,一旦你陷入黑暗,你就再也无法切换回来😉
使用以下命令安装黑暗主题,
# Kill and exit the Notebook server
# Make sure you are in the base conda environment
conda activate base# install jupyterthemes
pip install jupyterthemes# upgrade to latest version
pip install --upgrade jupyterthemes
一旦软件包被安装和升级,运行下面的命令,把你的股票白色主题 Jupyter 笔记本变成可爱的深蓝色午夜主题。你的眼睛会因此爱上你的。
# Enable Dark Mode
jt -t onedork -fs 95 -altp -tfs 11 -nfs 115 -cellw 88% -T
接下来,让我们看看是否可以将在 Anaconda 中创建的所有自定义环境作为内核添加到 Jupyter 笔记本中。这将确保我们可以通过简单地在内核菜单中选择它们来切换环境。切换内核时无需重启笔记本。
假设您已经在 Anaconda 中创建了两个定制环境, *my_NLP,*和 gym 。要将这些添加到您的 Jupyter 笔记本中,请按照以下步骤操作,
# Stop and exit your Jupyter Notebook server first
# Activate your environment in the terminal
conda activate my_NLP
# Install the IPython Kernel
pip install ipykernel
# Link your environment with Jupyter
python -m ipykernel install --user --name=my_NLP# Repeat steps for the other environment, gym.
conda activate gym
pip install ipykernel
python -m ipykernel install --user --name=gym
现在打开你的 Jupyter 笔记本,进入内核菜单中的改变内核选项,然后…嘣!你应该可以看到所有的内核都列在那里,你现在可以通过点击它们来激活它们。
This is where the newly added Kernels should show up. Notice the soothing midnight blue theme.
对于我上面提到的所有其他酷功能,我们需要安装一个叫做nb extensions for Jupyter Notebooks的东西。安装 nbextensions 很容易,只需按照以下步骤操作,
# Stop and exit your Jupyter Notebook server
# Make sure you are in the base environment
conda activate base# Install the nbextensions
pip install jupyter_contrib_nbextensions
# Install the necessary JS and CSS files
jupyter contrib nbextension install --system
启动 Jupyter 笔记本服务器,您应该会在开始页面看到第四个选项,名为 Nbextensions 。点击它,查看您一直想要的 Jupyter 笔记本电脑的强大功能。
The Nbextensions tab!
正如你在上面看到的,扩展列表非常庞大,甚至乍一看有点吓人。不是所有的都有用,这里是我用的一些,
- 目录(2) — 只需点击一下鼠标,即可为整个笔记本生成一个目录,其中包含指向各个部分的超链接。
- Scratchpad — 在我看来绝对是最好的扩展。一个单独的空间,让你在不干扰笔记本其他部分的情况下试验代码。
- 代码折叠— 这里不需要任何解释。
- 隐藏所有输入— 隐藏所有代码单元格,同时保持输出和降价单元格可见。如果你试图向非技术人员解释你的结果,这是一个非常有用的功能。
- 变量检查器— 将您从调试中解救出来,类似于 Spyder IDE 中的变量检查器窗口。
- 拼写检查器— 对减价单元格中的内容进行拼写检查。
- Zenmode — 去除屏幕上多余的杂乱,这样你就可以专注于重要的东西,即代码。
- 代码片段菜单— 一个很酷的常用代码片段的集合,从列表理解到熊猫以及任何介于两者之间的东西。最棒的部分?您可以修改小部件并添加您的自定义片段。
上面的列表包含了我最常用的扩展,但是我们鼓励您尝试其他的扩展。有意思的有 *ScrollDown、*table _ beautiier、腹地。
The Snippets extension in action along with the Table of Contents generation extension at work.
The Scratchpad extension
请告诉我您对 Jupyter 笔记本电脑的这些增强功能有何看法。如果您在安装扩展时遇到任何错误,请随时发表评论。
编辑:
- 如果您的系统上没有安装 Anaconda,只需忽略包含 conda 的命令。此外,忽略我们讨论将 Anaconda 环境添加到 Jupyter 笔记本的部分。
- 您可能需要管理员权限才能在您的系统上安装所有这些扩展。
- 如果你不喜欢笔记本上的午夜蓝主题,只需在终端中执行 jt -r 即可将一切恢复正常。你将不得不重启你的 Jupyter 笔记本,你也可能不得不清除你的浏览器缓存,以防重启后你仍然看到午夜蓝主题。
超创造力
Opal Butterfly VR, courtesy of Pamela Davis Kivelson
人工智能可能很快会超越人类的艺术创造力
总结。我们对艺术的体验——绘画、音乐、雕塑、诗歌——触及多种感官、联想、记忆和情感,并涉及人们可能称之为意识的部分。今天的人工智能(AI)缺乏主观经验和多模态,但开始获得艺术创造力。创造力需要意识体验的能力吗?我们断言答案是否定的。专业化的人工智能可能很快就会变得比人类更具创造力,更擅长捕捉和表现集体经验,因为多模态、监督学习和与人类的合作将显著增强今天的创意机器人。许多艺术是关于识别和操纵复杂的感觉模式和联想,这是人工智能擅长的任务;因此,超创造力——远远超过人类能力的创造性过程和结果——可能就在眼前。
“哦,这是毫无疑问的。是的,是的,一百万次是的。创意简单;意识,智力,那些都很难。”大卫·柯普
AI generated work based on Napoleon Crossing the Alps. By u/vic8760 in Reddit.
我们对艺术的体验包含多种感官、联想、记忆和情感。它利用了有意识和无意识的过程。想象一下听你最喜欢的音乐:每一个旋律主题、和声延续和节奏都与不同的情绪有微妙的联系,如兴奋、宁静、怀旧、嬉戏等等。音乐激发的图像、场景或思想流在你的脑海中跳跃。与历史事件和文化参考的关系可能跃入脑海。音乐具有很强的暗示性,并能改变伴随体验的情感诠释。电影制作人很清楚这一点,并使用合适的配乐来操纵你对每个场景的情绪反应。同样,绘画、雕塑、故事和诗歌会引发情感、记忆和其他感官联想。公平地说,不能引发多感官情感体验和丰富联想的艺术不是好艺术。
尚不清楚的是,人类水平的体验艺术的能力在多大程度上需要创造艺术。尽管缺乏像人类一样体验艺术和现实的能力,人工智能能创造出与人类作曲家或画家一样的艺术吗?越来越多的经验证据,特别是在绘画和音乐领域,表明艺术创造力可能不需要主观经验的能力,而是可以通过人工智能从人类创造的艺术和反馈中学习。我们相信,随着人工智能在模式和关联学习方面变得更好,随着它从人们那里获得更多反馈,它将创造出能够引发越来越丰富的多感官和情感人类 体验日益复杂的关联的艺术:也就是说,越来越好的艺术,可能超越人类创造的艺术。
艺术创意可能不需要主观经验的能力
科技一直使人类的创造力得以发挥:将史前洞穴中用原始工具制作的画与几个世纪后用画笔和丰富色彩制作的画进行比较,或者考虑钢琴的发明或电影的发展,被称为“第七艺术”。人类和机器之间的合作即将成为艺术领域的下一次技术飞跃,并创造出我们从未体验过的艺术品。
人工智能与今日艺术
深度学习的应用已经产生了不可否认的艺术质量的绘画,要么是模仿人类画家的风格——通过卷积神经网络的风格转移将与大师风格相关的模式编码为低级笔触,一直到空间感知和构图——要么是原创作品——其中生成对抗网络(GANs) 生成写实绘画,如肖像或抽象裸体。第一幅被拍卖的人工智能画作,使用最初由 19 岁的斯坦福大学研究员 Robbie Barrat 在佳士得拍出了 432,500 美元。Barrat 和 Mario Klingemann 这样的艺术家仍然做出大多数创造性的选择,如策展输入、训练人工智能和选择最佳结果艺术。然而,基于人工智能的艺术往往很难与人类艺术区分开来,越来越独立的人工智能画家可能即将出现。
The Butcher’s Son, winner of the Lumen Prize, 2018, Mario Klingemann
在音乐方面,作曲家、UCSC 大学音乐教授大卫·柯普的开创性工作远远早于现代深度学习。自 1981 年以来,Cope 一直致力于在算法中提取音乐作品的精髓,这些算法被输入给特定作曲家的音乐,解构它,识别模式,并在相同风格的新作品中重新组合这些模式。他的第一个重大成功是《艾美奖》(EMI,音乐智力实验,如尤瓦尔·赫拉利的《德乌斯人》中所讨论的)产生了巴赫、、维瓦尔第、肖邦等风格的令人信服的音乐,而早在 1997 年就愚弄了现场观众。最近,索尼的流动机器产生了高度可听的歌曲(例如,听听爸爸的车、影子先生或一个 Mon Sujet——你能说出它们是由人工智能产生的吗?),而初创公司 Aiva 和 Amper 开发深度学习方法来按需生成音乐,并可能很快实现个性化音乐。在不久的将来,即使人类音乐家围绕某些歌词创作主要的音乐主题和歌曲进展,伴奏的整个配器和创作也是一个充满挑战和艰巨的过程,很可能由 AI 接管。随着我们学习如何更好地设计这种人机合作,我们可能会提高人类和人工智能的创造力。
即使没有人类的经验,诗歌也是可能的:已经出现了产生巧妙俳句的机器人,因为诗歌的质量部分来自语言的美和节奏——这可能是可以学习的——部分来自读者赋予它的意义,诗歌机器人早在 2010 年就已经愚弄了文学期刊。如果你认为你能从机器人诗歌中分辨出人类,欢迎你在机器人或中挑战自己。
除了音乐、绘画和诗歌,人工智能在许多其他艺术形式和创造性任务中的应用以及用于产生艺术的人工智能工具开始出现。麻省理工学院的一个创新团队将展示人类和人工智能之间的合作可以产生新的艺术和手工艺人类独自无法想象:音乐、产品和产品设计、时尚、香水、巧克力松露、珠宝、鸡尾酒和戏剧。斯坦福大学讲师兼沃尔沃集团驻校艺术家 Pamela Davis Kivelson 创新性地将包括摄影、人工智能风格转移绘画、肖像视频甚至人工智能诗歌在内的艺术形式与硅谷正在开展的活动的技术主题相结合。她说,“人工智能艺术让我能够[[……]]创造一种基于 NLI 或‘非线性身份’的新颖视觉语言。[[……]]一个物理学家实际上可以被描述成费米液体中的一组电子,或者是量子隧道,或者是一个量子比特。我想重新设想这幅画像——挑战我们集体的无意识偏见和推论。这些隐藏的偏见影响着我们的行为。
通往超级创造力的道路
在斯坦尼斯拉夫·莱姆(Stanislav Lem)1965 年的科幻小说《赛博亚》(Cyberiad)中,“构造者”特鲁尔(Trurl)着手开发一台诗歌机器,并意识到诗人的心灵包含了诗人文明和文化的所有经验。为了将所有这些编程到机器中,Trurl 建造了一台超级计算机,可以模拟整个宇宙的进化,一直到诗人的出生和文化教养。他由此产生的人工智能诗人是天才;人类诗人首先不理会它,但最终却因为失去了生活的主要目标而集体自杀。Trurl 的人工创造的工程化道路有些不切实际;新兴的实践路径避开而不是复制人类的创造过程。
那么,假设人工通用智能还在遥远的未来,专业化的 AI 能变得有多有创造力呢?沿着三条尚未探索的道路,专业人工智能还有很大的改进空间:训练、多模态和人-人工智能合作。
“We made our own artificial intelligence art and so can you”, WIRED magazine, Tom Simonite
持续的反馈和培训。迄今为止,人工智能在绘画和音乐方面的进步还没有利用太多的人类反馈。相比之下,作为一个人类艺术家体验艺术,她是一个即时的——尽管有偏见的——对其作品的批评家。机器可能没有自己的主观经验来指导它们,但它们可以通过人类生成的训练数据和反馈来利用人类的经验——例如,随着乐谱或绘画草图的进展,通过评级或点击“心”(以潜望镜的风格)。来自许多艺术家——或艺术评论家,或普通大众——的反馈可能比一位艺术家的主观体验更好。此外,这样的反馈过程可能会产生新的艺术风格、社区和前卫作品。
多模态和联想学习。当我们听自己喜欢的音乐或沉浸在一幅画中时,我们经历的是复杂的多模态感觉和联想,这将我们提升到一个由图像、记忆、解释、分析思维、历史和文化联系以及感官运动体验组成的精神世界,我们将这些都归功于最高形式的艺术。
*“画是看到的而不是感受到的诗,诗是感受到的而不是看到的画。”*达芬奇
人工智能能创造出具有“规模和亲密度、增强的[…]色彩和感官客观性”的音乐吗?它能像音乐家、画家、雕塑家、歌词作者、诗人和作家莱拉·奥尔巴赫一样,以相互影响的方式创作音乐、绘画、诗歌和文学吗?我们如何教授人工智能协会跨越形态,艺术形式,事件和社会趋势?
大量的训练数据已经存在:有配乐的电影、有歌词的歌曲、绘画评论、音乐专辑、电影和表演。作为补充,众包活动可以设计成大规模的多模态关联标签。看书时挑选音轨,听音乐时浏览 wordnets,选择与给定曲调最匹配的图像,听音乐或观看绘画时回忆事件,将当前或过去的事件或新闻文章与特定的艺术作品相链接。由此产生的概念网络可以是高度个性化的,并且反映了具有重要历史价值的文化和世代关联——很像艺术家的作品。这种网络还将具有巨大的商业价值——例如,音乐制作人可以根据流行的网飞系列开发音乐,产品设计师可以根据热门趋势和文化开发创新。
通过大规模训练和多模态关联地图,人工智能还可以学会准确预测人类对艺术的感官和情感反应,并在创造音乐、绘画、诗歌和多模态体验的沉浸式作品方面远远超过人类的能力。
Study of Quantum Materials, artist Pamela Davis Kivelson; scientific imagery courtesy of Robert Cava
人机协作。当部署大规模培训和多模态联想学习时,迄今为止在人-AI 艺术合作方面的开创性工作将得到扩展。众包音乐可能涉及艺术家创作一个基本曲调,人工智能根据在线反馈对其进行改进和编排。同时,学习的多模态地图可以通过艺术形式和体验被例如推荐伴随图像的人遍历,并且这些图像反过来影响乐谱的发展。类似的反馈回路可以让人们与几乎任何艺术形式的人工智能进行合作——甚至是文学,因为人工智能正在迅速获得产生类似人类文本的能力。
人类和机器之间的新协作流程有望催化新人工智能能力的发展,并最终促进人类和机器的创造力。Kivelson 设想了一个未来,在这个未来中,集体创造性的人工智能扩展了我们的全球联系,重新定义了工作室实践的性质,同时挑战身份政治,并扩展了我们对新思想的自由和开放的访问。
人工智能生成的艺术可能成为社会最有效的镜子,有可能重新定义我们的身份概念
此外,就像人类艺术经常从其历史和社会背景中获得价值一样,人工智能生成的艺术可以结合来自人群、其他艺术品和背景信息的输入,并有可能成为社会最有效的镜子,捕捉我们的集体经历,并有可能重新定义我们的身份概念。
最后,人工智能可以超越人性对创造力的限制。考虑一首赋格曲。约翰·塞巴斯蒂安·巴赫的《音乐祭》中的六声部乐曲号称是有史以来最好的作品,并且是一首极其复杂的作品。为什么用六种以上的声部创作一首音乐效果很好的赋格曲很有挑战性?人类作曲家在身体上受到限制,只能用十个手指来弹奏键盘,一个工作记忆最多只能容纳四到七个独立的项目。人类画家、雕塑家和诗人同样受到限制。机器没有这样的限制,因此可能会将艺术的界限推到人类无法企及的地方。
Faceless Portrait #1, Artrendex Inc.
意识体验对模仿
当我们享受艺术时,我们参与了当今人工智能中所缺乏的神经机制:一个连接我们大脑和神经内分泌系统的复杂情感系统,该系统释放控制我们感觉和行为的激素;物理感觉绑定,如鸡皮疙瘩、欣快、心跳和呼吸的变化;对个人经历或历史事件的记忆,是感官和概念联想的桥梁。许多人认为艺术需要体现。Kivelson 说"舞者在身体的特定部位感受运动。当我们看他们跳舞时,我们感觉到他们发自内心地表达情感[[……]],随着我们集体体现的创造性智能的发展,使用人工智能艺术的新形式的创造力将会出现。
把意识的难题留到将来讨论,没有这个体现机制,今天的人工智能完全缺乏我们对艺术的主观体验,即使它获得了创造力。从本质上来说,创造力正在从为创作过程提供反馈所需的意识中分离出来 : Trurl 的人工智能诗人通过吸收人类的艺术作品和反馈,将意识体验外包给人类。它挖掘了人类的集体意识。
此外,不久的将来,计算艺术家将创造艺术,以便优化预先指定的功能,如体验者的沉浸水平,而不是为了满足表达其内心世界的(不存在的)愿望。人工智能的创作动力将与人类艺术家完全不同。这指出了有意识的经验驱动的创造力和模仿之间的明显区别。很像动物拟态,AI 将学习引发人类期望的感官-情感反应的模式,而无需获得化身和有意识的主观经验。
Inverse collage, courtesy of Mario Klingemann
我们能否设计一种测试——对抗过程——来区分人类创作的艺术和计算机创作的艺术?如果人工智能完全通过这样一个类似图灵的测试,那么无意识人工智能对人类艺术家的完美模仿是可能的,创造力不需要经验和感觉的能力。
创造性人工智能将成为一种强大的工具——一种新的显微镜——用于对人类的创造力和沉浸式体验进行定量测量
创造性人工智能将成为一种强大的工具——一种新的显微镜——用于对人类的创造力和沉浸式体验进行量化测量。它可以帮助我们回答一些难以捉摸的问题,比如什么影响人类的创造力,什么影响我们的艺术体验,以及一件创造性作品的各个方面如何改变体验者的精神和心理反应水平。随着我们更好地理解这些问题,我们也可能在今天看来是一个遥远的目标上取得进展:未来的人工智能+群体超级创造实体能够拥有自己的意识体验吗?我们如何才能设计它,并在这个过程中理解人类意识是什么?
具体来说,需要复制什么样的人类神经过程才能使计算机,尽管它们的物理组成不同,达到人类体验艺术的能力?毕竟,艺术的主观体验恰恰是艺术的目标。我们尚未理解导致意识体验的物理过程或一系列计算:理论从“意识是一种幻觉”到“一切都是有意识的”,再到介于两者之间的一切,如基于物理学的理论(“意识是一种物质状态”), “意识产生于量子波函数”)的坍缩,它区分了计算 I/O 和主观体验,也假设了潜在的 计算的物理基础 的重要性。 这是有意义的:有意识的体验比计算 I/O 更重要,一个有能力的人工智能艺术家的例子证明了这一点,他没有用于有意识体验的机器;没有证据表明计算可以独立于物质基础而有意识,就像没有证据表明灵魂独立于物质而存在一样。
创造性人工智能可能是人工通用智能的下一个里程碑,它推动了多模态和联想学习工程以及有效的人-人工智能协作流程的发展
就像国际象棋、围棋和图像识别被证明是导致专业人工智能进步的重要挑战一样,创造性人工智能可能是人工通用智能的下一个里程碑,它推动了多模态和关联学习的工程以及有效的人-人工智能协作过程的发展。正如巴斯蒂安·特龙所说,“我们甚至还没有开始理解人工智能会变得多么有创造力。如果你把世界上所有的知识和创造力都放进一个瓶子里,你会对瓶子里的东西感到惊讶。
Unnamed pastel portrait, courtesy of Mario Klingemann
承认
我们感谢凯特·巴兹、莉莉娅·叶夫根尼欧、沃洛季米尔·库里肖夫、帕特里克·西格勒·拉斯罗普、尼克·纳苏菲斯和巴斯蒂安·特龙的反馈和编辑,以及马里奥·克林格曼允许展示他的作品。我们特别感谢艺术家 Pamela Davis Kivelson 对“蛋白石蝴蝶 VR”和“量子材料研究”的评论、反馈和图像。
具有深度学习的超人“细胞视觉”
使用“电子标记”来预测未标记图像中的荧光标记以及细胞形态、成分和结构。
一篇论文的分析:在《细胞》杂志上发表的未标记图像中预测荧光标记。
Fluorescently tagged neuronal cell culture. Source
看看这张图片,告诉我你看到了什么。
Figure 1. Source: Finkbeiner lab at the Gladstone Institutes. Bottom pictures are Outset 1, 2, 3 and 4.
如果你是一个相当聪明的人,有一些生物学背景(或者没有),你可能会猜到“一些细胞?”
恭喜你。你现在是生物学家了。
开玩笑,不是相当于。更具体地说,这一个人的运动神经元培养来源于诱导多能干细胞。
如果你设法猜到了,让我再问你一些问题。
- 开头 1 的群集中有多少个单元?
- 你能清楚地识别出开头 2 和 3 中的神经突和下面的细胞吗
- 开头 4 中的细胞是活的还是死的?
如果你是一名训练有素的生物学家,你可能会回答第三个问题,也可能是第一个问题。如果你真的很努力地试了试,也许你能回答所有的问题,只是非常错误。
现在去问问你其他的生物学家朋友。他们可能同意你的第三个答案,但不同意第一个。否则他们两个都会不同意。或者三者都有。啊,人类的判断——总是主观的,有时不可靠。
事实是,与生物技术的发展速度相比,我们的显微镜技术已经落后了。
想想看,我们的智能手机上有 DSLR 质量的相机,我们的手机图像看起来仍然像…这个?
真的吗?
我们可以升级显微镜方法。
上图使用的是所谓的透射光 *显微镜,*当样品的一面被照亮时,样品被成像——非常简单的技术。它对生物体相对无害,但至少可以说,解释实际图像是相当困难的。
具体来说,图 1 来自于相衬显微镜——像素的强度(有多亮/多暗)显示了当光通过样品时有多少光发生了相移。
现在,透射光显微镜有一个巧妙的技巧,可以让我们更好地观察实际细胞,称为 Z-stack。
Z 堆栈中的 Z 代表( x,y,z )三维坐标系中的 z 。这组图像被记录在(x,y)中,因为它们是 2D,而 z 是离相机的距离。由于你(系统地)改变了与相机的距离,你得到的多幅 2D 图像会略有不同,因为不同的部分进入和离开焦点。
Z-stack of a sphere. Source
这给了我们一个 更好的 三维表示,但是它的**仍然很难理解。**科学家还是要靠目测手动分析这些图像。
Figure 2: phase contrast z-stack of Figure 1. Source
回到我之前问你的问题,看看你能否使用 z-stack回答其中的一些问题。大概现在比较容易*回答了,但是你还是没有一个明确的答案。
*(请注意,您现在可以推断出开头 4 中的突出细胞可能经历了细胞凋亡,这是一种非常酷的程序性细胞收缩死亡机制)
现在我们来介绍一下 荧光显微镜 。样本经过荧光分子处理,这使得某些细胞结构(如细胞核)的可视化变得更加容易。
This is the SAME culture of human motor neurons as above! Source. Blue fluorescent labels detect DNA, thereby highlighting cell nuclei. Green labels detect a type of protein only found in dendrites. Red labels show axons.
现在,这种形象从翻盖手机的质量变成了布兰登·沃尔费尔的 Instagram feed 真快。
虽然生动的图像看起来像是属于好莱坞科幻电影,但它确实需要像好莱坞电影一样长的准备时间(这只是稍微有点夸张)。也像好莱坞电影一样,它被许多许多问题所困扰。
-
样品制备耗时且复杂
-
您需要特殊试剂(材料),由于抗体交叉反应性,这些试剂经常产生 非特异性 信号*
-
标记协议(程序)可以 潜在地杀死细胞 !甚至活细胞协议都可以 光毒性 **!
-
不同 不同不同批次(还有人对人!)
-
不会永远 !最终,它们停止表达荧光信号。
-
不同颜色的标记可以彼此重叠 (光谱重叠),使得很难看出哪种颜色属于哪种标记(这限制了研究人员在每个样品中同时使用 3 或 4 种荧光标记)
-
测量标记(即荧光标记信号有多强)需要一个光学系统——这样它可以在样品中的和其他标记之间进行分离,并检测荧光团漂白 ***
-
抗体交叉反应是当不同的抗原出现类似于免疫系统。
当荧光标记的细胞持续暴露在激光和高强度灯的照射下时,会发生光毒性*。
*** 荧光团漂白基本上是褪色— 是指细胞因化学损伤而失去表达荧光信号的能力
更好的(深度)选择!
所以问题是,计算机能否预测和在未标记的图像中找到以前不知道的特征(例如。荧光)?
换句话说,我们能在没有标签的情况下突出显示单元格的某些部分吗?
正如你可能从我的标题中知道的——是的!
科学家们创造了一种称为 的新方法,即电子标记(ISL) ,它可以从样本的未标记 z 堆叠中推断出荧光标记。它还可以预测其他标签(例如细胞类型(神经、肝脏)和细胞状态(死亡或存活))。
它是一致的,不受光谱重叠的限制,并且不涉及改变或接触样品。它还可以产生某些生物测量值,这些测量值在以前是很难甚至不可能被 T42 获得的。
这是对电子贴标的概述。
Overview of a System to Train a Deep Neural Network to Make Predictions of Fluorescent Labels from Unlabeled Images. Source: [1]
该网络由许多 z 叠堆(图 1 左上)及其相应的荧光标签(图 1 左下)训练而成。
理想情况下,我们希望模型:
取一个看不见的 z-stack →预测不同荧光标记的归属
输出图像的每个像素在 256 个强度值(8 位像素)上有一个离散概率分布——这意味着每个像素都有可能是某个标签(例如,这个特定像素是 x% 可能是轴突)。为了制作图像,你取每个像素的预测分布的中值
在评估模型时,我们可以通过比较荧光标签与荧光样本的实际图像的相似程度来衡量性能(这是通过定性(观察)和定量(使用统计)来完成的)。
网络体系结构
该模型的网络架构类似于 Google 的 Inception 网络(通过重复模块的使用)并受到 U-Net (一种用于生物医学图像分割的卷积网络)的启发。
Each individual module. Red: expanding/reducing convolutions. Source [1].
在右侧路径上,输入通过卷积扩展特征尺寸,然后减小特征尺寸。在左侧,从输入复制特征值,形成一个*剩余连接。*下一个模块的输入是两个路径相加的和。
残余连接基本上防止了渐变消失的问题,当你添加更多的层时,渐变会逐渐变小。欲了解更多信息,请查看。
宏观架构类似于《盗梦空间》的模块。
Model Architecture. Source: [1]
如你所见,它有一个多刻度输入。z 堆栈中同一图像的多个“裁剪”(具有相同的焦点)—红框、蓝框、绿框等。计算多个特征。这允许模型学习上下文和细节!
Same center, different sizes.
最小的“裁剪”处理小规模的精细细节*(上图左侧,建筑的紫色路径),而最大的裁剪处理粗略背景和广泛特征(上图右侧,建筑的多色路径)——以及它们之间的三条中间路径。
Each color corresponds to a different computational path/tower.
与其他图像分类模型相比,这种架构的独特之处在于,这种不包含空间缩减 ,而空间缩减 会破坏精细细节,例如盗梦空间。
这是因为它部分受到了 U-Net 、的启发,其中最左边的路径保持输入的原始长度比例,因此信息可以从输入流到输出而不会模糊——允许网络学习细节!
在特征拼接之后,五条路径合并成一条路径,输出预测。
The final path splits into the separate labels. Outputs a probability distribution for the intensity values per pixel, and the median is taken to form the final image.
这是模型的整体机器学习工作流程:
Machine-Learning Workflow for Network Development. Notice how the different Towers correspond to the 5 different computational paths in the model architecture above. They all then merge into a final path (the middle Tower @ Scale 1) and then split into multiple heads. Source: [1]
有了这组特定的训练图像,模型可以
- 几乎相同地预测细胞核的位置
Input images/true labels/predicted labels. Source
- 识别细胞是死是活 98% 的时候(相比人类 80%的准确率——即使是经验丰富的生物学家也能对同一张图像给出两种不同的答案)。它甚至在大量死亡细胞中检测出一个活细胞*!*
- 生成精确的细胞大小测量值
- 能否区分某些细胞成分 与人类的准确度相匹配(如树突和轴突)
未来影响
通过这个实验,ISL 已经显示出它展示了迁移学习 —它可以将它在以前的映像上所学到的东西应用到全新的映像上!通过进一步的训练,我们可以教会这个模型分析 各种细胞 。
但是真正的问题是,我们能发现在之前我们不能发现的细胞特征吗?
机器有可能发现关于细胞的事实,从而导致下一个癌症疗法的发现吗?
这个模型已经差不多达到人类视力的水平了。
谁知道呢,它最终会被训练得足以拥有人类的超级视力。
关键要点
- 目前的显微镜方法要么难以分析要么潜在危险
- 一种标记图像的深度学习方法,“在计算机上标记的*,*”可以预测细胞的看不见的图像上的荧光标记
- 电子标记还可以预测细胞结构的位置、细胞长度和细胞是死是活
- 迁移学习允许该模型用于其他细胞并预测新特征
来源
[1] E. Christiansen,S. Yang,D. Ando,L. Rubin,P. Nelson,S. Finkbeiner, In Silico Labeling:预测未标记图像中的荧光标记(2018),
如果您有任何问题,请随时联系:
- 电子邮件:gracelyn.shi@gmail.com
- 领英:https://www.linkedin.com/in/gracelynshi/
- 推特:https://twitter.com/GracelynShi
监督学习:分类基础和主要算法
Picture from Unsplash
介绍
正如本系列第一篇文章所述,分类是监督学习的一个子类,其目标是基于过去的观察预测新实例的类别标签(离散、无序值、组成员)。
分类问题主要有两种类型:
- 二元分类:典型的例子是邮件垃圾邮件检测,其中每封邮件都是垃圾邮件→ 1 封垃圾邮件;或者不是→ 0。
- 多类分类:像手写字符识别(类从 0 到 9)。
下面的例子很有代表性地解释了二元分类法:
有两个类别,圆和十字,以及两个特征,X1 和 X2。该模型能够找到每个数据点的特征与其类别之间的关系,并在它们之间设置边界线,因此当提供新数据时,它可以估计其所属的类别,给定其特征。
Figure by Author
在这种情况下,新数据点落入圆形子空间,因此,模型将预测其类别为圆形。
不同的阶层
值得注意的是,并非每个分类模型都有助于从数据集中正确分离不同的类。一些算法,如感知器(基于基本的人工神经网络),如果类不能被线性决策边界分开,则在学习模型的权重时不会收敛。
下图展示了一些最典型的案例:
Figure by Author
因此,选择一个合适的算法的任务在分类问题中变得至关重要,这将是整篇文章中讨论的主要话题之一。
实践中的分类
在实践中,总是建议尝试和比较不同算法的性能,以便选择最合适的方法来解决问题。这种性能会受到可用数据、特征和样本数量、不同类别以及它们是否线性可分的影响。
提醒我们自己开发机器学习模型的六个主要步骤:
- 收集数据。
- 选择衡量成功的标准。
- 设置评估协议。
- 准备数据
- 开发基准模型
- 开发更好的模型并调整其超参数
接下来,我们将继续探索不同的分类算法,并了解哪种算法更适合执行每项任务。
逻辑回归
分类问题中的一个主要问题是在训练过程中,算法在权值更新时不收敛。
当类不是完全线性可分的时候就会发生这种情况。因此,为了解决二元分类问题,逻辑回归是最常用的算法之一。
逻辑回归是一个简单但强大的分类算法(尽管它的名字)。它在线性可分类上工作得非常好,并且可以通过 OvR 技术扩展到多类分类。
优势比
为了理解逻辑回归背后的思想,比值比是一个重要的概念。
比值比是某一事件发生的概率。它可以写成:
其中 P 代表积极事件(我们试图预测的事件)的概率。
由此我们可以定义 logit 函数。
Logit 功能
logit 函数就是比值比的对数(log-odds)。该函数将范围[0,1]内的值作为 am 输入值,并将其转换为整个实数范围[-∞,∞]内的值。
我们将使用它来表达特征值和对数优势之间的线性关系。
其中 P(y=1|x)是给定其特征 x,特定样本属于类别 1 的条件概率。
我们背后的真正动机是预测样本属于某一类的概率。这是 logit 函数的逆函数,通常称为 sigmoid 函数。
s 形函数
sigmoid 函数的公式为:
z 是净输入,它是权重和样本特征的线性组合,可计算如下:
当用图形表示时,它采用以下形状:
Figure by Author
我们可以看到,在等于 1 和 0 的(z)值中有两个极限。这意味着,如果 z 趋于无穷大,函数就接近 1,如果 z 趋于负无穷大,函数就接近 0。
因此,它采用实数值并将其转换到[0,1]范围,截距为(z) = 0.5。
Figure by Author
总之,这就是逻辑回归模型在被训练时所做的事情。sigmoid 函数的输出被解释为某个样本属于类别 1 的概率,假设其特征 x 由权重 w 参数化为,ψ(z)= P(y = 1 | x;w)。
预测概率可以通过单位阶跃函数(量化器)转换成二进制结果:
查看前面的 sigmoid 图,等价关系为:
这是逻辑回归算法如此受欢迎的主要原因之一,因为它返回某个样本属于某个特定类别的概率(0 到 1 之间的值)。
这在天气预报等情况下非常有用,在这种情况下,你不仅想知道是否会下雨,还想知道下雨的可能性。或者预测病人患某种疾病的几率。
支持向量机(SVM)
这个算法可以认为是感知器算法的的扩展。在 SVM 中,优化目标是通过最大化该线和最接近该超平面的样本点之间的余量来设置分隔类别的决策线。这些点被称为支持向量。
Figure by Author
最大保证金
为了设置最大边距,添加了两条平行线(边距),我们试图最大化它们到原始决策线的距离。我们将考虑错误分类的点(错误)以及页边空白和线条之间的点。
通常,具有较大边距的决策线往往具有较低的泛化误差。另一方面,利润率小的模型往往不太容易过度拟合。
最大化函数(误差余量)计算如下:
- 正负超平面可以表示为:
2.将(1)和(2)相减:
3.通过 w 向量的长度归一化前面的等式,其中:
4.我们得出边际误差方程:
哪个左侧被解释为正超平面和负超平面之间的距离,换句话说,就是我们试图最大化的边距。
在实践中,更容易最小化倒数项,这可以用二次规划来解决。
松弛变量:处理非线性可分离类
松弛变量ξ it 用于软边分类。其动机是需要放松线性约束,以便在处理非线性可分离数据时允许优化过程的收敛。
它被添加到线性约束中,新的最小化函数变成:
通过改变函数的 C 变量,我们可以控制错误分类的惩罚,并控制边缘的宽度。以这种方式调整偏差-方差权衡。
最佳的界限将取决于我们试图解决的问题。如果我们正面临一个医疗问题,我们不希望出现任何差错。而在面对其他类型的问题时,我们可以处理一些错误。
这是 C 值发挥作用的时候。
- 大的 C 值对应于大的误差损失。
- 较小的 C 值意味着我们对误分类错误不太严格。
Figure by Author
多项式核 SVM
SVM 是一个非常流行的算法分支,因为它可以用来解决非线性分类问题。这是通过一种叫做内核化的方法来实现的。
当处理原始特征的非线性组合时,使用核的基本思想是通过映射函数将它们投影到更高维的空间,因此数据变成线性可分的。
直观地说,原始数据集被转换到一个更高维的数据集,然后应用一个投影使类别可分离。
然后应用该算法,分类被分割,并应用投影函数的逆来返回数据的原始分布。
Figure by Author
RBF 内核
也用于处理非线性可分数据,如下所示:
Figure by Author
Figure by Author
这个想法是定位与每个类相一致的山脉和山谷。投影线分开两个类,也切断山谷线,原始线:
Figure by Author
投影将有效地分离原始数据集中的每个类。
为了改变山脉和山谷的宽度,我们将使用伽马参数γ。
gamma 参数是一个超参数,我们在训练期间对其进行调整,用于:
- 较大的γ值→将产生狭窄的山脉/山谷,这将倾向于过度拟合。
- 较小的值→将产生宽阔的山脉/山谷,这些山脉/山谷往往会被淹没。
此参数来自正态分布的公式:
Figure by Author
决策树算法
决策树算法通过提问来分解数据集,直到它们将数据缩小到足以做出预测。
这是一个决策树示例,用于决定是否将汽车借给某人:
Figure by Author
基于训练集的特征,决策树学习一系列问题来推断样本的类别标签。
起始节点称为树根,算法将在包含最大信息增益的要素上迭代拆分数据集,直到叶子(最终节点)是纯的。
决策树超参数
a)最大深度:
最大深度是从根部到叶子的最大长度。大深度会导致过度拟合,小深度会导致欠拟合。为了避免过度拟合,我们将通过设置具有最大深度的超参数来修剪决策树。
b)最大样本数量:
当分割一个节点时,可能会遇到这样的问题:一个分割中有 99 个样本,另一个分割中有 1 个样本。这将是一种资源浪费,为了避免这种情况,我们可以为每片叶子设置一个最大的样本数。它可以被指定为整数或浮点数。
样本数量少会导致过度拟合,而数量多则会导致欠拟合。
c)最小样本数量:
类似于前一个,但具有最小值。
d)最大特征数量:
很多时候,我们需要很多特征来构建一棵树。在每次分割中,我们必须检查每个要素的整个数据集,这可能非常昂贵。
这个问题的解决方案是限制在每次分割中寻找的特征的数量。如果这个数字足够高,我们很可能会在我们寻找的特征中找到一个好的特征(尽管它可能不是完美的)。然而,如果它没有特征的数量大,它将显著地加速计算。
随机森林
如果我们有一个包含许多特征(列)的数据集,决策树算法通常会过度拟合,使模型和学习过程变得过于复杂。
我们可以通过随机选择每个列并为每批列制作决策树来解决这个问题。
Original picture from this article
因此,我们的想法是开发一种集成学习算法,将一些较弱的模型结合起来,建立一个更健壮的模型。
该算法将执行以下步骤:
- 抽取大小为 n 的随机 bootstrap 样本
- 从 bootstrap 样本生成决策树。在每个节点:将随机选择 d 个特征而不替换,节点将被分裂以最大化信息增益。
- 前面的过程将重复 k 次。
- 同意每棵树所做的预测,通过多数投票指定类别标签。
这种方法的主要优点是,我们通常不需要修剪随机森林(因为模型对噪声相当鲁棒)。然而,它们比决策树更难理解。
我们需要调整的唯一超参数是树的数量。通常情况下, K 越大,模型的性能越好,但这会大幅增加计算成本。
k-最近邻(KNN)
k-最近邻算法或 KNN,属于一种特殊类型的机器学习模型,通常被称为“懒惰算法”。
他们之所以得到这个名字,是因为他们没有学会如何用优化函数来区分数据集,而是记住了数据集。
“懒惰算法”这个名字也指一种叫做非参数的算法。这些是基于实例的算法,它们的特点是记忆训练数据集,而懒惰学习是这些算法的一个特例,与学习期间的零计算成本相关。
算法
该算法遵循的总体过程是:
- 选择 k 的数量和距离度量。
- 找到要分类的样本的 k 个最近邻
- 通过多数投票分配类别标签
Figure by Author
该算法基于其对距离度量的预测,找到最接近要分类的点的 k 个样本。
主要的优点是,由于它是基于记忆的算法,它适应新的训练数据。不利的一面是计算成本随着训练数据的大小而线性增加。
需要考虑的事情
- 在算法面临平局的情况下,它将优先选择与分类样本距离较近的邻居。在距离相似的情况下,KNN 将选择数据集中最先出现的分类标注。
- 为了在过拟合和欠拟合之间取得良好的平衡,选择正确的 k 值是非常重要的。
- 建立适当的距离度量也很重要。通常使用“闵可夫斯基”距离,它是欧几里德距离和曼哈顿距离的推广。该距离定义如下:
结论
在本文中,我们学习了分类的基础和主要算法,以及如何根据所面临的问题来调整它们。
在下一篇文章中,我们将探索其他非常常见的分类算法,称为“朴素贝叶斯”,我们将在一个项目中执行一个实现,在这个项目中,我们将建立一个分类模型,根据它的单词正确预测电子邮件是否是垃圾邮件。
感谢阅读,敬请关注!