男人与男人:麻省理工学院深度技术训练营的经验
Bootcamp Developer Kit
从实践中学习,永远不要害怕失败。
这个短语可以概括我在麻省理工学院深度技术训练营的所有经历,此外,紧张也很好地描述了教室里的每一天。虽然这篇文章的目的不是描述经验,但我想在解释定义、主题和趋势时给出一些想法。最后,分享这一点的想法是为了给一些灵感,解释一个深入技术的大画面,在那里可能会走得更远,特别是如果你是从数据科学或人工智能世界开始的话。
第一课:深度技术
那到底是什么呢?嗯,我发现我自己在第一天也遇到了同样的情况,谢天谢地我们的第一堂课由约书亚·西格尔带来,他帮助我们澄清了 Quora 和风险投资的一些定义:
- 一套基于科学发现、工程、数学、物理和医学的尖端和颠覆性技术
- “深度技术是工程与科学发现的结合点”
- “具有改变世界影响潜力的有形发现或商业化”
对我来说,在度过了那些不眠之夜后,定义深层技术,如**“使用尖端和颠覆性技术解决重大问题的切实可行的解决方案”**,并且像所有由技术引发的解决方案一样,遵循“炒作周期”[1]有一天成为“高科技”,最终只是“技术”,以及解决方案需要跨越“鸿沟”才能获得成功的采用生命周期。
[1] The “Hype Cycle” (HC) and the “Technology Adoption Lifecycle” (TALC) models plotted together [Hype Cycle, 2012]
在训练营期间,我们发现并实践了一些深层技术促成因素,以构建具有社会或业务影响的最终项目:
- 物联网
- 人工智能
- 机器人自动化
- 虚拟和增强现实
- 大数据
- 区块链
第二课:物联网
我们生活在第五个互联网时代,机器对机器的交流已经成为现实,但这并不意味着高科技。另一方面,物联网是 m2m 的发展,是一项示范性的深度技术,因为它生成和传输要在本地或远程处理的数据,具有全球影响,最初也很难扩展,但经过努力,它将成为无缝的基本需求[麻省理工学院训练营]。
Evolution of Internet [Nokia Insight]
示例:
- 信号动力学:我们有非常难得的机会去了解更多法德尔·阿迪布的工作,用几句话来概括就是物联网作为大影响推动者的最好例子。首先,我们深入了解了他在的论文关于使用 wifi 看穿墙壁,以及关于数字医疗的研究,他们试图建立一个无电池微型植入物用于药物输送。我强烈推荐去访问和检查他们的作品寻找灵感。
Wireless System for drug delivery
- 自动驾驶汽车:如今是一个热门话题,在那里我们可以与专家 Sertac Karaman 交谈。他向我们展示了一个简短的时间表,在这个时间表中,我们了解了自动驾驶汽车的真实状态、背后的技术(传感器)、接下来的挑战(交通、 trolly 问题)以及我们有时间与一个 Turtlebot (一个低成本、带有开源软件的个人机器人套件)互动,编写一些代码/算法来让它移动。
We could make the Turttlebot move by itself!
第三课:虚拟和增强现实
因 Pokemon Go 等视频游戏或 Occulus 等设备而闻名,使人们开始谈论 AR 和 VR,因此在训练营期间,我们有机会知道背后的事情,这要感谢圣乔治·帕帕斯。
谈论现实——虚拟光谱可能会令人困惑,所以为了让它容易理解,我要感谢 Hackernoon 分享一个简短的想法。
“如果体验需要特殊的硬件来观看(比如耳机),那就是 VR。如果它使用计算机视觉来读取真实世界的信息,那它就是 AR。如果它既涉及扫描环境以获取数据,又涉及通过耳机进行显示以获得更深的沉浸感,那么它就是 AR 和 VR。”
Reality — Virtuality Spectrum [Hacker Noon]
在有了一个清晰的概念之后,认识到这些技术的用途是很重要的,感谢我们的讲师,我们发现了 ar 和 VR 作为与客户或用户交互的媒介,换句话说,一种传达丰富信息/环境的使能技术。例如,一些有趣的用途是:
- 边缘型人格障碍虚拟现实
- 增强博物馆体验的 AR
- 用于培训人员的虚拟现实
- AR 家具应用
- 对我来说,最神奇的是使用虚拟现实模拟汽车驾驶,然后使用这些数据来训练自动驾驶模型!
考虑到应用程序的想法,现实情况是,如今要构建 VR 或 AR 的体验,存在一些平台或 SDK:Unity+Vuforia、 ARCore (Google)、 ARKit (Apple)和 STEAM VR 。我们有机会用 Unity+Vuforia 开发一些基本的 AR 示例,我不得不承认,它的工作给我留下了深刻的印象!
AR Example
第四课:区块链
在所有与比特币相关的炒作中,我对区块链背后的技术感兴趣它是如何工作的?有哪些挑战?所以作为客座讲师,我们被介绍给布莱恩·苏比纳拉。他友好地向我们解释了实际情况和未来。我对类似 智能契约 以及如何将事物之间的‘交流’使用 令牌 这样的概念很着迷。
例如,想象一个世界,我的自动驾驶汽车想要充电,所以首先我向汽车转账 50 美元,这是第一个合同,然后我的汽车向加油站付款是第二个合同,每个合同是一个由足够长的散列标识的块,以避免重复,所有交易块都加入到一个链中, 很明显,这看起来并不太复杂,尽管交易中还有其他一些因素需要考虑,比如支撑链条的基础设施、避免假货的交易完整性、监管等。
实际上,存在一些倡议和文件(在特定部门)以及与区块链发展事物的平台。
第五课:创新和设计
多亏了玛丽亚·杨和桑杰·萨尔马,这些话题对我来说是最有趣的话题之一。
首先,我们讨论创新的理论。我想到的第一个例子是自行车。试着记住这些年来所有的模型,它们看起来几乎一样,这意味着创新的主导模型。但是像所有的创新一样,它在产品的生命周期中有一些阶段,例如,想象 2006 年的手机世界,主导设计是一个小屏幕和按钮,每个时期都发生了增量变化,突然 iPhone 作为破坏设备推出,所有这一切又重新开始。
Evolution of mobile phone [easytechnow]
有时存在 有意的创造性破坏 为了推出一项创新,还记得 2012 年苹果把接头换成实际的 lightning 端口或者被指责让老款 iPhones 变慢的时候吗?
当我们思考创新时,有时我们称之为颠覆所以在这里给出一些概念是有好处的“颠覆性创新,顾名思义,指的是一个概念,产品或服务,它通过颠覆现有市场或创造一个全新的市场来创造一个新的价值网络
[ 维玛 ]
因此,持续中断的一些示例如下:
- MOOCs
- 支付(微信支付、支付宝)
- 实时视频
概念测试
在这堂课上,我们被要求思考不同的形式来测试产品,以获得用户反馈。这很有用,因为当我们开始开发一个产品或服务时,这对于了解我们用户的体验很重要例如,我们如何在没有开发无人驾驶汽车的情况下测试一个人的反应?还是来自某个服务的手机 app?或者超越我们如何测试人类去火星旅行?
这是在 Vimeo 上由 Wendy Ju 制作的“汽车-在路上-四轴视图”,这是高质量视频和热爱…
vimeo.com](https://vimeo.com/140935829)
如果你对这个话题感兴趣,我推荐你访问麻省理工学院设计实验室页面
第 6 课:构建我们的项目
每天课后,我们都努力构建功能原型和发布计划。我们的想法是在最后一天像初创公司一样向评委“推销”我们的产品/服务。在这里,我们面临许多挑战,第一个挑战是与我从未见过的全新的人一起工作(我们来自 4 个大洲!),我们每个人都有不同的技能或背景,第二步是选择一个真正有重大影响的想法(这是最难的),最后构建解决方案并进行推介。
Smart belt project
我们的想法
我们决定为老年人打造智能腰带,我们的重点是让他们有信心在不需要拐杖的情况下行走,因此原型有传感器来检测前方的物体,并在人摔倒时触发或检查温度和脉搏,为此我们使用了:
- 两个超声波传感器
- 一个蜂鸣器
- 一个陀螺仪
- 温度和心跳传感器
- 全球(卫星)定位系统
- 充电宝
我们的想法需要完整,所以它包括市场研究,财务预测,盈利能力分析,以及后端(NodeJS)和分析服务(Databricks)。
Backend and Analytics diagram
结论
这段经历完全值得,每天都在发现或深入一些东西,扩展我的知识,实践麻省理工学院的座右铭 ’ 头脑和手**'****(Mens et Manus)**因为不仅仅是听或参加一个班,做出改变的最好方式是,我们需要用我们的头脑和手来构建实际的解决方案,以产生更大的影响,而一种方法就是使用深层技术。
PS 如果有任何问题可以在 Twitter 和 LinkedIn 上找我。
个人和集体的心智模型
在 迈向超级智慧理论 中,我描述了一种基于卡尔·弗里斯顿首创的主动推理框架的集体智慧理论。正如主动推理所要求的那样,该理论意味着所有的集体(如团队和组织)都在一个隐含的世界集体模型的基础上运作——这为他们提供了理解观察结果和预测替代行动过程结果的能力(弗里斯兰语中的“政策”)。
如果我们接受定理的观点,即任何马尔科夫毯(因果原子子系统)总是可以被描述为执行某种形式的近似主动推理,这根本不是有争议的。然而,随着我逐渐理解,结论中有一些非常违反直觉的东西。需要解释的事实是,与人、动物、单细胞生物甚至人工智能体不同,集体由明显不同的自主成分组成— 但能够作为集体行动。这种集体行动可以像一群鸟的一致行动一样简单,也可以像金融市场将关于未来预期的复杂信息纳入资产价格一样复杂(或者就此而言,一家公司采取复杂的商业战略和生产结构);最突出的一点是,成员是自主的(至少在涉及人类的例子中,会告诉你他们遵循自己的自由意志),然而集体可以非常准确地被描述为一个独立的主体。
事实证明,完全解决这个明显的矛盾需要彻底了解这些模型是什么,这是我在这篇文章中试图做的。在这样做的过程中,我将揭示一些深层的方式,在这些方式中,共性为我们作为个体和作为成员的所有能力提供了基础,而我们大肆吹嘘的差异扮演着关键但次要的角色。
这一员额的结构
在第一部分中,我提出了内部模型的统一理论(通常被称为个体代理的“心智模型”)。我总结了几个领域的发现,并在主动推理的背景下将它们形式化。我明确了 Friston 和其他在此框架内工作的人在许多论文中提出的各种代理实现之间的共性,以及与其他推理和通信理论的等价性。作为一个简短的题外话,我表明这个理论允许我们以一种一致且(理性地)令人满意的方式对认识论及其悖论进行推理。
在第二部分,我将这一理论应用于代理人的集体,这些代理人对他们自己、其他代理人以及集体本身进行推理,从而获得了一个社会系统和符号学的理论。它的要点包含在下面的引理中:
- 集体智慧是集体认知加上集体行动。
- 集体认知是个体认知加上个体之间的沟通。
- 选择性和交流(以及由此产生的集体认知)必然出现在一群兼容的智能体(即不同但共享功能相似性)中,每个智能体都具有一定水平的个体认知*。*
然后,我简要地讨论了这个理论是如何通过上面的相同的构件为决策理论、经济学和伦理学提供基础的。
最后,在第三部分中,我通过代理结盟的概念,将这一点与同样基于共享模型的集体行动理论联系起来。我表明,至少在高层次上,由此产生的对集体智慧的描述令人满意地解决了上述个人和集体代理之间的紧张关系。
我强调这是一个从头开始的理论,完全基于主动推理和自然选择的假设。因此,它适用于任意系统的代理人和他们的环境(某些附带条件涉及他们的维度和动态特性)。特别是,除了作为例子,我没有提到人类或其他自然发生的因素的特征。
第一部分:什么是模型?
为了解决我们理解集体中的模型的主要程序,我们首先需要理解对于自然的或人工的智能体的典型例子来说什么是模型。然后我们将把这种理解移植到集体中。
概括一下:在主动推理中,一个主体 A 根据感官证据不断更新它的信念(示意性地表示为 s → b ,然后使用这些更新的信念来判断要遵循的“最佳”行动方案( b → 𝜋).)“意义构建”的第一步被解释为(近似)贝叶斯推理: A 选择使“统计惊奇”最小化(下限)的信念-ln *p(s | b,m)。*这里假设 m 是世界的“固定”模型,捕捉 A 关于其环境的“知识”或“理解”。
所以我们想回答:代理的模型 m 实际上是从哪里来的?它看起来像什么?它是如何更新的?为什么具有不同信仰的代理人能够相互理解和理解?
以上是关于这个话题的一些想法。我并不声称对其中任何一个拥有所有权,因为我主要是从信息论、认识论、决策论、统计学、神经科学和计算机科学中重新包装其他人的想法。但是我以前从未见过它们以一种全面和可理解的形式组合在一起,所以这篇文章可能有助于推动这个领域的发展。
什么是模型?
就其核心而言,模型是一种工具,让代理人可以管理其内部状态,并使其感觉有用。这在过去是非常抽象的,但现在我们被内置模型的人工智能体所包围。它们存在于我们的手机、电脑和其他地方:神经网络。因此,让我们从“传统”机器学习的角度出发,这非常简单,也很容易推理,看看这会把我们带到哪里。
神经网络是一种软件系统,设计用于“行动”或解决问题(通常是模式匹配问题,如输入分类),使用“神经启发”方法,其中输出基于输入的加权和: out = F(w,in) 。这种情况下的“模型”只是一组权重 *w,*它在逻辑上不同于“架构”(F 的函数形式,通常非常精细,在层的数量和形状上有无限的可能性,以及连接它们的不同方式)。使用优化算法“训练”该模型,以使最佳权重适合输入的样本集。
现在,任何非平凡(即,足够大以学习有用的推理)的神经网络的参数空间将具有大量的自由度。用未经过滤、未经标记的自然输入来喂养无本金代理的白板方法将导致过度拟合、虚假关联和其他故障模式,从而导致数据无法用于行动——除非在极少数情况下,当实际环境足够简单(例如,非常清晰的奖励函数、非常干净的动态)且数据足够丰富时。这不仅使得设置权重的成本非常高(需要加载数据,因此训练算法的运行成本非常高),还意味着如果没有外部设计,这种形式的通用系统无法可靠地训练自身。
在“传统的”机器学习中,这个问题是通过在概念上将解决方案分成三个逻辑上独立的步骤来解决的:
- **设计:**设计者(通常是人,但见下文)定义神经网络架构,并设置一些架构参数,如大小和层数。这通常只在设计代理(或产品功能)时进行一次。
- **训练:**执行上面提到的权重优化,输入数据,直到代理可以在“测试集”中执行足够正确的推理(或者直到设计者用完训练数据)。这仅在数据“本质上”改变时才进行(例如,对于宏观经济模型,一年一次,或者当新用户使用预测键盘时)。
- **动作:**当模型被认为是“训练好的”时,针对它的模式匹配只是矩阵乘法,可以安全地安装到芯片中,根据需要经常运行。
相比之下,在主动推理中,智能体没有为给定的训练数据集预先优化的奢侈:他们必须同时行动和学习,在进行过程中不断引导他们的内部状态。这种代理可能不是非常“科学”(因为它的行为不能被已知精度的模型所证明),但实际上非常有效,因为它可以校准其行为,以收集更多的数据,这种数据是它提高对世界的知识(认知价值)所需要的。但是这种代理如何克服上面提到的建模问题呢?
答案是代理人可以利用一个自然发生的事实:世界的不同方面以非常不同的速度变化。例如,“我附近是否有掠食者”的事实可能会因瞬间或地点而异,而“什么样的东西是掠食者”的事实很少改变(即,只有当代理发现新的掠食者,或移动到有不同种类掠食者的环境中时)。还有一些,如“天空是什么颜色”,变化更少,可能比代理本身的生命周期长得多。也就是说,存在动力学的自然层级:大部分相空间由“慢”(高度对称、缓慢变化、低复杂度)状态主导,但少数低维子区域“更快”,即呈现较低的对称性(随时间或位置的变化率更高);反过来,这些社区也有自己更快的口袋,等等。
注意这里有一点骗术:回答“我附近有捕食者吗?”取决于回答“什么样的东西是捕食者?”。一般来说,子区域具有形状:一个国家是否处于“快速”子区域取决于不同维度的值的组合,反映了世界的因果结构,因为它与代理相关。这就引入了相关性的概念。如你所料,这个概念是主观的,在某种意义上,与一个代理相关的东西可能与另一个代理不相关。
(作为题外话,有人可能会问这种等级制度的来源是什么。尽管所有非平凡的动力学都会有某种程度的这种现象,但在我看来,生命系统会产生自我维持的低对称性动力学,一直到生态系统水平,再到其组成部分最基本的特征尺度。[实际上,弗里斯顿建议我们可以 T10 将生命现象定义为这种自我维持的快速系统。]因此,在这样一个生态系统中存在一个主体的事实导致 它经历生命共同创造和维持的动态。)
因此,代理可以只考虑状态的投影到“相关”子区域的区域,而不必整体理解每个状态。余数被忽略,被认为是常数,或其他条件不变。
(注意,“慢”自由度的任何变化都被视为“噪声”,而“快”自由度的任何变化都被视为“信号”。这在我们后面讨论模型选择时会很重要。)
上述情况意味着代理学习两者:
- 给定全相位空间中的状态,应用哪个投影(“经验法则”);
- 给定一个预测状态,如何解释它(“信念更新”),这可能包括要应用的进一步预测。
这两个一起就是我们所认为的代理的全局模型:状态空间上的一组嵌套等价类,其中每个等价类定义一个本地模型或“上下文”,其中状态可以用少量上下文相关的参数来描述。然后,意义构建是将感官状态 s 转化为等价类 m 和参数 b 的“宁滨”行为;贝叶斯推理是挑选“最佳”箱+参数组合,近似贝叶斯推理只是评估箱+参数的一种计算成本低廉的方式。
因此,模型是“符号”和“非符号”世界之间的罗塞塔石碑:它们解释了神经元激活(或比特)及其相关性的“平面”数值状态空间如何映射到解释和信念的层次空间,这在某种程度上准确地反映了环境的因果结构。
在这一框架下,洞察力或“尤里卡时刻”的概念可以被描述为模型简化步骤,在这一步骤中,代理人找到了宁滨的改进,使他们能够以更简洁的方式理解一组观察结果。类似地,重新解释、范式转换或认知失调的概念被解释为在一种间断的平衡中,从模型树的一片叶子到另一片叶子进行观察。事实上,“在头脑中容纳两种对立观点的能力”可以从字面上理解为具体化、参数化和控制这种重新解释过程的能力。请注意,在不同模型的光照下,“回放”和重新评估历史感观的能力极大地帮助了重新解释。
一个例子:弗里斯顿规则学习者
考虑一下 Friston 在这篇论文中描述的游戏(我推荐改为看的对话)。在这个(略显做作的)设置中,以“找到正确的颜色”的任务形式给代理一个谜题,其中决定答案的线索位置由一个抽象的“规则”给出,如*“如果中间圆圈的颜色是红色,那么答案由左边的圆圈给出”*。Friston 的文章没有探索可以解决的结构最简单的代理设计(这可能是 ML 从业者所假设的)。该代理将可能的观察配置(或序列)集合作为其状态空间,并且给定足够的数据,将缓慢但肯定地耗尽该(非常大的)空间,并且在其内部参数空间中将规则重新创建为列联表。这当然是可行的,但是不太节约或者在概念上不现实——它没有解释我们认为真正有思维的生物解决这个难题的方式。
相反,代理被“告知”有一个规则,并且该规则由中心圆的颜色决定。也就是说,给它一个具体化的分类参数,或“bin”,代表三个可能的规则(与可能的颜色数量相同);它在重复试验中的学习任务是学习 3×3 关联矩阵,该矩阵给出正确颜色(根据反馈)和在每个位置看到的颜色之间的映射,并从那里回溯到每个试验中的活动规则。这些额外的假设允许代理可靠地学习规则,并且平均仅在 12 次尝试后就正确地解决任务。
然后,Friston 允许它的代理“睡眠”,他的意思是模型简化通过。代理“意识到”映射第一和第三规则的关联矩阵实际上是单位矩阵,并且指定那些相关性的参数可以被设置为常数(相应地为 1 或 0)。扁平化模型同时更简单(即存储和计算更便宜)并且更有效。
值得注意的是,所有这些都源于最小化自由能——首先相对于参数值,然后相对于模型空间本身。
模型的结构
如上图所示,模型是嵌套上下文的有向无环图。每个上下文(或框架,跟随 Bacharach )是一个提供稳定的对象、事实和关系的背景结构(本体论/分类学)的空间,在此基础上发生实例化(一组表示在给定推理时刻实际被认为是真实/相关的事件的激活)。每个实例化提供了一个选项“菜单”,必须从中挑选下一级实例化;按照同样的标准,每个实例化只有在它上面的所有级别的上下文中才有意义。
我们可以列出模型上的一些自然操作:
- *细化:*将一个叶节点展开成一个子图。之前被解释为离散事件的内容将被重新解释为上下文,以了解更多细节。
- *折叠/识别:*将一个子图概括成单个节点。
- 横向/对角线连接:从先前不相关的子图中访问参数。
这些操作在模型的贝叶斯表示中是很自然的。在本文中,我们只能推测它们也以自然的方式映射到人脑中突触连接的变化。关于这方面的一些推测,见弗里斯顿的文章。
另外,这些嵌套模型形成了一个代数。进一步的工作应该允许我们使用代数拓扑和其他数学领域的工具来更深入地了解模型的结构。
关于信念的信念:认识论的基础
这种持续的、间断的平衡信念更新导致了记忆和信念的混乱结构,破坏了感官和事件输入流的简单性。理解“为什么 A 相信 P”需要凌乱的回溯,即使给出完整无损的历史数据;根据所有的证据重新评估这一信念甚至更加昂贵,而且在大多数现实环境中,可能是不可能的。
尽管如此,在许多情况下,对一个代理人来说,拥有关于其信念及其原因的信念似乎是有用的。“我相信我附近有一只食肉动物*,因为我正在观察远处一个危险的形状,[在一个隐含的背景下,我知道某些形状是狮子]”。这种具体化*简单地重复使用上面开发的机制来实现关于世界的信念,适应于关于代理人自己头脑的信念。
这可以被形式化为认识论的定量理论——为什么我们思考我们的信仰,并以我们的方式对证据做出反应。在这种叙事中,“知识”不同于“纯粹的真实信念”,是一种有用的虚构,代理人告诉自己,以便思考他们来之不易的信念。
有趣的是,这一理论正确地预测了这样的“二阶”信念或元信念通常被体验为事实(具有单位概率的断言),与“一阶信念”相反:你可能不确定附近有捕食者,但如果你认为有一个,那么你确定你是这样认为的。事实上,如上所述,主体几乎总是在给定的环境/框架内运作:一阶信念只在相应的框架内才有意义。由于元信念是指上下文/框架的谓词,它们只需要在重构的罕见时刻被允许是不确定的。否则,代理人会将那些最简单的描述作为纯粹的绝对事实。(元信念似乎甚至对反事实推理免疫——如果不认为你正在读这篇文章,那会是什么样?—这引出了一些关于大脑如何实现它们的有趣问题。)
顺便提一下,哲学的“特质”是这种元信念的一种形式。你和我可能(相当肯定地)看到了某种波长的颜色,这种颜色被普遍认为是“红色”,但第二个事实是,你和我在精神上用“我看到红色”的形式描述我们自己的经历,这是一个独立的信念,我们每个人都独立地经历,与第一个不同,这是“私人的和直接可理解的”(用丹尼特的描述)。
The “redness of red” quale, a common example of meta-belief.
因此,这个理论允许我们用机械论的理由来化解关于感受性的长期争论和悖论,比如“你和我看到的颜色一样吗?”作为对世界的信念和对心灵的信念之间的简单分类混淆,它们确实具有不同的属性,因为它们指的是本质上不同的领域。
这并不是一个新的结论——相反,古代和当代的冥想练习,以及认知行为心理治疗,都将此作为一种戒律来教导,但现在我们确切地看到了为什么会出现这种情况。当然,你可能会怀疑那些倾向于此的人会继续要求非机械论的解释来解释感受性(关于经验的信念)和关于经验的信念之间的二元性。但是稍后,当我们讨论经验主义的道德含义时。
第二部分:集体如何才能有模式?
最后,让我们回到我最初的动机,这是关于集体智慧,或社会系统中超越其部分总和的智慧。我们如何在一个集体中做出有意义的事情?
(初步注释 1: 我不会花费太多精力试图说服你集体在明确定义的意义上确实是聪明的——参见我以前的文章中一些令人信服的论点。或者,你可以暂停怀疑,把下面的论点看作是解释一个论点的操作理论,不管这个论点是否成立。)
(初步注释 2: 在缺乏说明相关现象的具体模拟的情况下,下面的一些可能看起来像是未经证实的挥舞。我正在努力。与此同时,Friston 在过去几年中实施的模拟实例的广泛收集,其中一些非常复杂,应该表明这种操作描述也可以模拟,只要付出一些努力。)
可变性和相互可理解性
关键假设是:
- **(公共物理环境)**多个代理在共享环境下运行。
- **(共同的社会背景)**每个代理作为与其自身兼容的其他代理的群体的一部分而存在(在某种意义上,将在下面阐明)。
在上一篇文章中,我们讨论了假设#2 如何暗示当且仅当代理人能够“模拟他人”时,他们将有效地与他们的社会环境进行交互,这就是我们之前所说的替代性,也可以称为心理理论(一个相当混乱的术语,但显然是心理学文献中的标准),或人际推理(技术上准确,但有点拗口)。我们也概述了一个理论,关于假设#1 加上自由能原理是如何一起实现成功的替代性,以及由此产生的广泛的社会现象。
(顺便说一句,自从写了那篇文章,我发现了弗里斯顿及其合作者以前的一些论文——从 2008 、 2014 、2015——这些论文必须归功于以类似方式描述模拟另一个的代理的现有技术。我在这里描述的方法更深入一些,但我并不认为这是一种洞察力——它是主动推理框架的直接应用。)
该理论的要点是:
- 代理持有他人的模型,形式为“他人=自我+差异”。这种表示在代理彼此确实相似的程度上是极其有效和准确的。校准这个模型(估计“差异”参数)只需要一些反事实推理的能力(类似于评估替代政策所需要的)。
- 这种模拟其他代理的能力导致代理喜欢与相似的代理交互,这加强了相似性的感知——这创造了自我加强的键。
- 代理不仅相互作用,而且与环境。在非常一般的情况下,一对结合的智能体在与环境交互时会比两个单独的智能体有更好的 T10 个体 T11 表现,因为每个智能体的行为都会向它们的同伴透露关于环境的信息。(这可以是关于世界当前状态的非常简单的信息,如在单细胞生物之间观察到的化学信号,或非常复杂的规则学习,如在鸟类和灵长类动物中发生的模仿学习。)在这种情况下,对代理之间的可变性的测量是有用的:代理将根据其位置、形状、内部参数等以稍微不同的方式运用环境。这导致了更丰富的结果。
- 这对结合的代理满足在主动推理框架下被操作性地认为是自身代理的所有条件;这对“一起工作”的人被称为是一个复合代理*。*
- 此外,具有足够能力的代理人可以将配对本身视为“他者”;在某些条件下,这一对也可以说是把它的组成代理人设想为“其他人”。这为代理对齐创造了条件(见下文)。
- 这种结构可以从成对扩展到多个代理和键的集合(网络)。这就是我们所定义的集体智慧(又名超级智慧):一个由单个智能主体通过纽带连接而成的复合物,它将自己的集体视为一个实体。根据弗里斯顿的定理,超神总是可以被说成是行动的,至少在某种程度上是如此(即,它有一点“意图”);我们将在下面描述代理结盟的机制,它允许集体的意图与个人的一致。这种调和反过来允许超神成为一个拥有可靠意图的真正稳定的代理人。
兼容性:这是个程度问题
从上面可以清楚地看到,兼容性不是二元的。根据可计算性理论,如果一对智能体的差异没有压倒任何一方的认知能力,则可以认为它们是兼容的。也就是说,即使是同卵双胞胎的连线也略有不同,即使是同一个人也会随着时间的推移改变连线,这并不是一个大问题——这种差异可以被表示为几个调整。但是当你考虑越来越多不同的代理时,你需要考虑到每个代理能够计算越来越复杂的反事实(“如果我是那样的话,我会怎么想?”).
似乎有理由假设,一个群体的代理人具有反事实模拟的内置机制,这种机制对于群体内代理人之间的典型差异范围可能是足够的。只有当一个主体能够接触到一个更通用的系统时,它才能将自己调谐到一个远在那个范围之外的“他者”,无论这个系统是内部的(例如,从其大脑皮层的其他用途中劫持来的符号系统)还是外部的(例如,像语言或计算机这样的符号系统)。
旁白:“过去和未来的自己”作为“他者”
软件开发人员长期以来一直在谈论“善待未来的自己”,例如,通过编写带有文档、注释和高测试覆盖率的高质量代码。后来我了解到,Bacharach 和其他人,如 Dyson ,至少在不同时间点的自我和他人之间看到了部分形式上的等价。毫无疑问,我们一直在和未来的自己交流,例如,通过留下提醒,我们不断试图解释我们过去和未来的自己的状态——“我在想什么?”、“一个月后我会后悔吗?”这是反事实模拟的又一次扭曲。有些人甚至认为记忆和交流在字面上是等同的。我不会走那么远——如果仅仅是因为跨时间的交流是单向的。但是对称性绝对值得更详细地探索。
世界中的知识:符号与交流
关于主动推理框架的一个值得注意的事实是,它对生物学是不可知的:一个代理的操作定义可以很容易地被理解为包括生物学上不属于它的系统组件,只要那些组件满足马尔可夫毯的因果条件。事实上,经常会发现复杂的代理人将其操作范围扩展到其生物学范围之外,特别是使用生物学外部状态作为其内部状态的扩展:“世界上的知识”与“头脑中的知识”。
这对于复合代理特别有用,因为两个代理运行的共享物理空间为*符号提供了一个稳定的画布。*我们将这些定义为物理状态,在状态空间的一个区域中,该区域是相互可访问的,并且与“重要”的环境动态解耦,并且因此被复合代理内在化。通过使用一组共享的符号,代理(a)可靠地提高彼此的性能,以及(b)通过持续观察每个对等体在给定符号的情况下“如预期”地行为来加强他们的联系。事实上,这个定义满足了所有常见的给定的符号要求;例如,它们显然是任意的,它们的物理表现除了信息容量之外没有任何要求(即,你需要至少一位的物理状态,如由两个代理的感知所分析的,来存储一位的符号)。
因此,我们有了一个从头开始的交流理论的轮廓:通过被制成媒介(可以像声波一样短暂,也可以像标记一样持久)的物理空间的内在化部分,代理人生产和消费符号;这些符号的进化与获得合适的媒介和上述效果(a)和(b)的相对进化益处成比例。
注意与奎因的语言理论的等价性。沟通不是建立在绝对客观事实之上的逻辑认知结构,而是随着时间的推移,由效用和重用驱动的近似模型的分层。与客观世界的对应是不稳定的、统计的和偶然的。此外,由于众所周知的可计算性结果(参见 Yudkowsky 的Map and Territoryfor a equivalent perspective ),即使对于任意强大的代理,这也是唯一可行的方法。
传播的货币:认知经济学和伦理学
我故意在上面用了“生产”和“消费”这两个词。综上所述,上述交流活动构成了认知经济。这种经济建立在共享模式的公地之上,被编码为知识(在头脑中和在世界中),作为允许交换发生的制度基础设施。所有抽象层次的语言,从低级的身体语言到专门的、高上下文的行话,都是这个基础设施中的层。
在这个共享环境的媒介中,代理人的交换产生了相互价值,但它们也是有代价的:不仅是用完带宽的运营成本,还有通过保持(或者更好的是增加)相互可理解性来维护公共资源的资本成本。忽视对认知共有物的维护会导致快速的、灾难性的交流中断,或者更确切地说,是语义分裂。
这让我们想到了*认知伦理的概念。*代理人有一个私人动机,在认知公共领域搭便车,或者视情况而定,甚至破坏交流以达到利己的目标。然而,该系统的长期繁荣需要负责任地维护公共资源。自从亚当·斯密(但直到几十年前才被人们认识到)以来,人类通常能够通过使用我们内置的道德协议来保护他们的公地免受这种破坏,这种道德协议由长期的、不对称的承诺、礼仪和赢得信任的概念组成。
据此,我假设认知承诺是将世界维系在一起的粘合剂。随着每一次交流——问候、交易、辩论、艺术表达——我们加强了一种隐性的信任,即我们是相似的实体,以相似的方式思考相同的外部现实。这种信任往往没有任何合理的理由(考虑到我们有限的带宽,经常混乱的信号,以及前面提到的私人激励)——日常信仰的跳跃,由我们天生的假设共性的倾向驱动。我们用这个认知承诺的网络作为合作和交流的基础,也就是说,生产对我们任何人都有价值的东西。
第三部分,结束游戏:集体中的主动推理
意义创造的全部意义在于对世界做出最佳反应——“没有体现就没有智慧”可能是主动推理运动的口头禅,如果它有的话。那么我们如何为集体拼凑这些呢?
关键的概念是我所谓的代理对齐。其核心是,每个代理人都认识到这个群体拥有共同的目标或共同的命运(参见 Bacharach 对这一概念的良好回顾,这一概念通常隐含在群体的社会科学讨论中)。这种对共同利益的共同认识可以是交易性的(每个代理人的私人利益由群体目标推动)目的性的(代理人分享超越严格私人利益的共同目标)或者两者兼而有之。对于这个讨论来说,重要的是 agentic alignment 允许 agent“作为一个群体行动”,在严格意义上是指(a)拥有一个作为包括他们在内的“超级 agent”的群体心智模型,(b)理解群体的目标是什么,以及©根据他们的心智模型选择推进群体目标的个体策略。
这是一个有趣的问题,上面的©是指“自己决定什么对集体有利”,还是“默默地服从命令,因为我被告知那是对集体有利”。本着本文的精神,我们假设,在某种程度上,代理共享一个共同的群体和世界的心理模型,这两个定义应该是相同的给定理想的代理。尽管如此,也可能是决策和遵循规则的不同心理机制导致了实践中不同的结果。
拼凑起来,我们对集体代理有了一个吸引人的描述,并看到它如何与自由意志不冲突。理论上:有认知能力的主体(我们赋予个体主体或“自由意志”的主体)之间的集体主体在一定程度上发生:( a)主体共享包括彼此和集体在内的共同世界模型,以及(b)主体拥有共同利益的共同知识,允许它们自愿地联合行动。
最后,我再一次指出,这一领域有深度的思考者以前曾涉足过这里。特别是受东方哲学启发的关于组织和社会制度的书籍,比如考夫曼的意义革命 *,*绝对有它的要旨。这篇文章的原创性贡献,如果有的话,在于提供了一个从信息论到考夫曼和其他人已经掌握的一些基本真理的明确的、可形式化的和先验的逻辑结构。这给了我希望,这种特殊的结构将对其他人有用,无论是在证明关于社会系统的定理方面,还是在帮助社会系统——由人、人工代理或混合组成——通过严格的、理论上知情的干预变得更加集体智能。
如前所述,我并不认为这些想法有什么特别的价值。尽管如此,我还是喜欢认为,这种构建、综合和形式化它们的特殊方式将对其他人有用。非常感谢 Ananya Sheth、Pranav Gupta、Hannu Rajaniemi 和 Gianni 贾科姆利在过去几个月的讨论、反馈和鼓励!
使用 Python 合并电子表格–追加
将多个电子表格合并在一起是一项常见的任务。合并有两种方式:
- 追加 —电子表格层叠在一起
Three spreadsheets are appended into one based on column names
2.联接 —基于所选列的相同值水平联接电子表格列
Two spreadsheets are joined into one based on the same Name values
在本教程中,我们将侧重于追加。我将会写另一篇关于加入的教程。
放弃
我建立了一个工具mergespreadsheets.com可以很容易地附加文件。如果您需要快速追加,请随意尝试
先决条件
如果您不知道如何使用终端和 Python,或者如何使用 Python 和 Pandas 读写文件,那么请先阅读并浏览本教程:https://medium . com/@ love spreadsheets/intro-to-handling-spreadsheets-with-Python-c 6 a 35 E0 D8 de 8
文件
在本教程中,我们将使用三个文件。可以点击链接下载:marketing analyst names . xlsx, SalesRepNames.xlsx ,senior leadershipnames . xlsx
完整代码
这是追加三个文件的完整代码
Full Code for this tutorial
I .阅读所有三个电子表格
在与三个电子表格相同的文件夹中创建一个 python 文件,并将其命名为 append.py
首先我们要导入我们的 pandas 库,并给它一个缩写 pd 。 pd 缩写是约定俗成的,从技术上来说你可以使用 import pandas 照原样,将代码中的所有 pd 替换为 pandas
import pandas as pd
我们将在没有任何额外参数的情况下读取第一个表,因为我们只有文本数据,第一行是列名,所以我们可以使用 pandas read_excel 命令读取所有三个文件,而没有任何参数
marketing_analyst_names = pd.read_excel("MarketingAnalystNames.xlsx")sales_rep_names = pd.read_excel("SalesRepNames.xlsx")senior_leadership_names = pd.read_excel("SeniorLeadershipNames.xlsx")
现在我们有了三个变量,它们包含了包含 excel 文件中所有行列格式的值的数据框
二。合并所有三个数据框
现在,我们将合并所有三个数据框
- 我们将创建一个包含所有三个数据框的列表。列表中数据框的顺序将决定文件的追加方式
all_df_list = [marketing_analyst_names, sales_rep_names, senior_leadership_names]
2.追加所有三个数据帧的命令是一个单行函数。我们将使用我们的列表调用 pd.concat 函数,它将按照这个顺序追加我们的所有数据帧,并将追加的数据帧赋给变量 appended_df
appended_df = pd.concat(all_df_list)
追加是通过匹配相似的列名来完成的。如果列名不同,则追加不会将值堆叠在彼此之上。
我鼓励你们用不同的列名创建虚拟电子表格,看看追加是如何被影响的
三。写入 Excel 文件
既然我们已经有了追加的数据框,我们可以将其写入 Excel 文件。我们在附加的数据框上使用 to_excel 函数来实现这一点。我们还将添加参数 index=False ,它不会输出任何行号。(摆弄参数,看看哪个对你有意义)
appended_df.to_excel("AllCompanyNames.xlsx", index=False)
现在我们已经完成了代码,我们需要打开我们的终端并转到保存所有三个文件和我们的 append.py 文件的文件夹
如果你跟终端走散了,请先过一遍本教程:https://medium . com/@ love spreadsheets/intro-to-handling-spreadsheets-with-python-c 6 a 35 e 0d 8 de 8
我们将从我们的终端运行这个脚本
$ python append.py
瞧啊。我们现在应该有一个名为 AllCompanyNames.xlsx 的文件,与我们的三个电子表格和包含所有三个附加文件的 Python 脚本在同一个文件夹中!
与人工智能融合:如何使用 Keras 和 OpenBCI 制作脑机接口与 Google 通信
E lon Musk 和 Neuralink 希望建立一个可以充当大脑第三层的脑机接口,让人类与人工智能形成共生关系。
但是如果你已经可以做到了呢?
在(非常)有限的形式下,你确实可以。
背景
脑机接口(Brain-Computer Interface,BCI)泛指在神经系统和电子设备之间建立直接连接的任何系统。这些装置可以通过手术植入大脑,也可以在体外。典型的范例包括允许用户控制致动器或键盘,允许设备向用户发送传感数据,或涉及传感数据和电机控制的双向通信(即接收电机控制输入并发送压力或温度传感数据的假肢)
历史上,神经假体一直是 BCI 研究的主要动机。这些技术包括为截肢者安装假肢、为聋人安装人工耳蜗,以及为癫痫患者提供深部脑刺激。这些设备已经改善了数百万人的生活,它们的广泛使用证明了大脑和电子设备之间实现直接双向通信的好处。然而,该技术的可能应用远远超出了医疗保健。即使在神经假体领域,我们也可以想象超越修复,考虑增强我们的能力,使之超过正常人的水平。总有一天,假肢会发展到以任何客观标准来衡量都比自然假肢优越的地步。这些肢体可能看起来和感觉起来就像正常的肢体,但会更加强壮和灵活。另一个例子是人造眼睛,其分辨率远高于人眼,能够放大或缩小,并能看到紫外线或红外线光谱。
当考虑认知和技能形成时,可能性变得更加有趣。最近的一项研究表明,刺激大脑的某些部分可以改善记忆的形成和回忆。其他的实验已经成功地将记忆人工植入动物体内。举个例子,也许可以应用这些研究的方法来提高你快速学习一种乐器的能力。或者,也许有可能将各种神经刺激器和传感器结合起来,开发一种“算术处理单元”,它可以检测大脑中与数学或逻辑推理相关的特定区域何时被激活,并与它们通信以增强能力。
埃隆·马斯克和 Neuralink 想要追求的正是这种认知增强的延伸。根据马斯克和许多领先的人工智能理论家的说法,人类相对于人工智能的智力进步的一个关键障碍是带宽问题:尽管计算机和人工智能变得越来越快,处理和生成知识的能力越来越强,但我们在做同样事情的能力方面面临着直接和根本的限制。我们主要通过我们的感官和解释语言的能力来获取信息。在你的眼睛和视觉皮层阅读和理解一个句子的时间里,计算机可以扫描成千上万页的文本。可以想象,在几十年的时间里,我们可能会有运行在专门的神经形态硬件上的高级人工智能,这些硬件具有世界如何工作的令人难以置信的精确模型,以及在几分钟内分析和理解数百万份文件的能力,做出远超人类理解的决策和推断。在一个越来越依赖人工智能驱动决策的世界,人类可能会发现自己在商业、科学和政治决策过程的所有部分都过时了。我们的大脑并没有进化到用数万亿颗棋子来下一盘棋,也没有进化到理解预先计划了数百万步棋的战略。正是对这个超级智能黑匣子的恐惧,激发了 Neuralink 、 Kernel 和其他几个相关组织目前的大部分工作。
BCI 技术的大多数前沿研究都试图最大限度地提高信息带宽,通常是通过将电极直接植入大脑或神经的侵入式方法。然而,非侵入性方法,特别是脑电图(EEG)和肌电图(EMG)被常规使用,并取得了相当大的成功。这些包括将电极放置在你的头部表面(EEG)或肌肉上方的皮肤上(EMG ),以测量下面累积的电活动。这些数据的粒度很低,与最终实现 BCI 研究更宏伟目标所需的精度和带宽水平相去甚远。尽管如此,EEG/EMG 支持的 BCI 已经取得了令人难以置信的成就,如用思想控制无人机、视频游戏和键盘,并且它们提供了进一步研究可能解开的可能性的一瞥。此外,像 Cognixion 和 Neurable 这样的几家公司正在探索基于 EEG 的脑机接口的真实世界应用,并且已经获得了大量的资金和支持,许多令人兴奋的项目正在进行中。
概述
在这个项目中,我们在你的神经系统和外部人工智能代理之间建立了一个直接的连接。这个代理可能是任何你能得到的 API:谷歌助手,Siri,Alexa,Watson 等。像 Dictionary 或 YouTube 这样的服务也符合条件,但这些服务会将应用程序局限于内容查询,而不是通用请求。
为了这个项目的目的,我们将直接查询谷歌搜索,因为它提供了最大的灵活性,也是最容易设置的。完成后,你应该能够简单地通过思考在谷歌上查询一些术语。
我们使用的技术利用了你的大脑在默念过程中产生的神经信号。这是当你慢慢地、有意识地阅读或思考时,发生在你大脑内部的“内心独白”。你可能已经注意到自己在默读的时候会这样做,有时你会在不知不觉中微妙地移动你的下巴和舌头。当你收到 SAT、MCAT、GRE 或其他标准化考试准备的提示时,你可能也遇到过这个概念。考生被建议避免默读,因为这是一个降低阅读速度的坏习惯。
我们能够利用默念,因为大脑向你的喉头发送与你想说的话相对应的信号,即使你并不打算大声说出来。通过将电极放置在你面部的喉部和下颌神经上,我们可以记录与特定单词对应的信号,并使用它们来训练深度学习模型,以辨别不同的单词。换句话说(没有双关语的意思),我们可以从你思考某个单词的行为中辨别出你在思考这个单词。
Brain and Laryngeal Nerves
这种技术有其局限性,它绝不是完美的,也不适合实际应用。然而,自从两年前由麻省理工学院媒体实验室首次在现实世界中演示以来,它已经被成功地用于允许用户做数学、打电话、订披萨,甚至在下棋时接受帮助的设备中。
MIT Media Lab AlterEgo Headset
设置&材料
所需的主要硬件工具是 OpenBCI 神经节板。有各种各样的其他硬件可供选择,但是我发现 OpenBCI 有一个最大的开发人员社区来提供支持。它花了你大约 200 美元,但是考虑到你可以用它建造难以置信的东西,它是非常值得的。
OpenBCI Board and Electrodes
除了电路板,你还需要电极和电线。一套金杯电极和电极凝胶应该花费 50 美元,应该工作正常。
或者,你可以获得一个完整的 OpenBCI 入门套件,包括电路板和多种类型的干电极,以及一个电极头带,价格为 465 美元。有点贵,所以金杯设置完全没问题。不过,如果你打算尝试 BCI 的其他应用,比如虚拟现实(Unity VR 教程即将推出!),头带和干电极带来更好的体验。
OpenBCI 还提供 8 和 16 通道板。这些将提供优越的数据质量,但 4 通道神经节将足以为这个项目。
配置
在 Linux 机器上,检查是否有 Python 3.4 或更高版本。打开您的终端并键入以下命令:
python3 --version
如果您没有 Python,或者您有旧版本,请输入:
$ sudo apt-get update
$ sudo apt-get install python3.6
现在,下载或克隆 pyOpenBCI 目录。
将目录更改为存储库,并运行以下命令来安装必备软件包:
$ pip install numpy pyserial bitstring xmltodict requests bluepy
您现在可以安装 pyOpenBCI 了
$ pip install pyOpenBCI
要查看一些操作,请将目录更改为pyOpenBCI/Examples并找到 print_raw_example.py 。用您最喜欢的代码编辑器打开这个文件,并在第 7 行进行如下修改:**
*board = OpenBCICyton(daisy = False)*
应改为:
*board = OpenBCIGanglion(mac=’*’)*
这使得 pyOpenBCI 能够为我们正在使用的特定电路板采用适当的模块。
现在,打开你的主板。
在您的计算机上,从示例 目录中键入以下命令:**
*$ sudo python print_raw_example*
嘣!!你的终端现在应该充满了来自电路板的原始输入数据流。
记录信号
既然我们可以获得原始信号,我们就可以开始设计和构建数据管道。首先,我们必须首先将原始数据转换成 LSL 流。LSL 指的是实验室流层,是由加州大学圣地亚哥分校斯沃茨计算神经科学中心开发的一种协议,旨在促进实时数据流的记录和分析。LSL 将我们的脑电图数据传输到本地主机,从那里它可以被其他应用程序或脚本拾取。
修改pyOpenBCI/Examples*中的 lsl_example.py 文件,删除我们不需要的 AUX 流,增加一个标记流:*****
我们现在必须定义一个实验设置,以我们想要的形式记录数据,并将其存储以备将来使用。我们希望该实验生成一个时间序列 EEG 数据的数据集,这些数据被分成多个区间,每个区间对应于一个单词的无声化。为了实现这一点,我们可以执行一个实验,开始 N 个间隔的记录会话,每个间隔持续 T 秒。给定区间内的所有样本都用区间索引和指示用户默写的特定单词来标注。
来自神经科技伯克利分校的 lsl-record.py 文件是一个很好的起点。根据我们定义的设置修改文件:
您可以调整术语库(第 64 行),在不同的上下文中尝试不同的单词组合。您也可以在每次会话前调整默认持续时间(第 12 行)。
现在是有趣的部分了!将电极插入电路板:
Left 4 channels are EEG in, right 2 channels are ground
按照以下配置将它们贴在脸上:
找一个安静的地方坐下,在不同的终端中输入以下行:
***// Terminal 1: converts raw data to LSL and streams it
$ sudo python lsl_example// Terminal 2: reads LSL data stream and executes experiment
$ sudo python lsl_record***
注意:我们作为 sudo 运行,以允许脚本检测板的 MAC 地址
这将启动指定持续时间的记录会话。你将被提示从你的词库中随机抽取一个单词,间隔 2 秒钟默读。录制过程可能会让人不舒服,容易入睡,所以最好在中间休息一下,进行多次小范围的录制。此外,如果频繁出现干扰(即突然移动或使不正确的单词不发音),我们的实验设置可能会导致数据质量差。
您可以设计和实现一个更灵活的设置,可以选择在注意到干扰时击一个键来删除当前和以前的间隔。另一个解决方法是进行多个小的会话,并在最后合并数据,丢弃干扰过大的会话。一些噪声是不可避免的,你不必太挑剔,因为随着样本数量的增加,模型变得更有弹性。
为了获得最佳结果,你的词库中的每个词至少要有 1000 个高质量的样本。
过程信号
一旦你有了足够的数据,就该为机器学习做准备了。
对数据进行适当的组合和预处理,使其具有以下格式:
Example Data Table
- ****单词是从 1 到 NumIntervals,的索引,T5 是总会话数中 SessionDuration/2 的总和
- 术语对应于每个时间间隔显示的单词
- [A,B,C,D]是脑电图通道
- 每个单词、术语组合对应于大约 800 行数据
使用 numpy 将您的 CSV 文件导入 python。您应该将所有数据加载到脚本中的 NumLines x 6n array 中。
第一步是过滤数据,去除我们感兴趣的频率之外的噪声。信息 EEG 频率对应于以下频段:
EEG Wave Frequencies
对 4 Hz 至 100 Hz 之间的频率进行滤波似乎是合理的,但会失败,因为 60 Hz 是电网的频率(可能因国家而异),这必然是一个重要的噪声源。为了获得最佳结果,我们应该在 4 Hz 和 50 Hz 之间进行滤波。
我们可以使用 Scipy 的巴特沃兹滤波器来选择我们想要保持的频率范围。用下面的代码定义一个过滤器:
然后,生成一个时间戳列(因为我们合并了多个数据集,并使原始时间戳无效),并将过滤器应用于每个通道:
过滤后,使用下面的代码将数据重组为一个三维的 ndarrray 数组,其维度为IntervalLength x channel count x interval count。****
我们用上面的代码有效地将时间序列数据转换成图像数据。这听起来可能有点不可思议,但是你可以把每两秒钟的间隔想象成一幅图像,每一个像素对应于在一个特定的(通道号、线路号)坐标上获取的信号值。换句话说,我们有一堆间隔计数图像,每个图像的大小都是间隔长度* x 通道计数。*****
First 120 data points of an EEG interval
这项技术由 Justin Alvey 在一个类似的项目中演示,非常强大,因为它允许我们将时间序列数据视为图像数据,允许我们利用计算机视觉和卷积神经网络(CNN)的力量。您甚至可以通过将特定的默写绘制成图像来将其可视化
此外,使用 CNN 允许我们跳过傅立叶变换,因为神经网络可以学习各种频率(在每个图像上以模式出现),而无需明确指定它应该寻找什么频率。
现在我们准备开始建设 CNN。由于我们只有 1 个颜色维度,我们可以使用输入维度为 IntervalLength 和 ChannelCount 的 1D CNN。您可以尝试不同的超参数和架构。我选定了一个卷积层、两个完全连接层和两个合并层。
有关一维 CNN 以及它们如何应用于时间序列数据的更详细分析,请参考 Nils Ackermann 的这篇文章。
我们现在有了一个模型,它应该能够将一段时间的脑电图数据与你的词库中的一个特定单词进行匹配。
让我们看看它做得有多好。将模型应用于测试数据,并将预测结果与实际结果进行比较。
***# Test Model
y_predicted = model.predict(X_test)***
用银行这两个词,我可以达到 90%的准确率。不出所料,随着单词的增加,准确率略有下降,三向准确率为 86%,四向准确率为 81%。
Sample truth chart from two word classification. Left is Actual, Right is Predicted
一种在不影响准确性的情况下增加术语库大小的可能方法是创建具有多词查询的分层“术语树”。然后,您可以在树上执行深度优先搜索——每一层的单词只与同一子树的同一层中的其他单词进行比较——以找到最佳匹配。
谷歌搜索
我们现在已经有了使用 BCI 查询谷歌的所有必要信息。定义特定子可视化和查询之间的映射,并进行适当的调用:
还有…
要想进行实时查询,请修改 lsl_record.py 脚本并将其作为一个模块导入。然后,您可以调用它来读取 LSL 流,以 2 秒的时间间隔响应用户输入。
就是这样!你现在不用说或输入一个字就可以搜索谷歌。
结论
你不能用一个三四个单词的术语库做太多事情(除非实现前面提到的术语树)。经历所有这些步骤来搜索到你最近的加油站的方向比正常的谷歌搜索稍微复杂一些。然而,重要的是要考虑这项技术的进一步发展可能会导致什么。我们可以想象这种设备的改进版和不太显眼的版本,与麻省理工学院团队已经拥有的版本没有太大区别,用于导航、网络查询、短信、智能家居管理或任何数量的日常任务。当与不断改进的人工智能助手的能力相结合时,这种可能性会进一步扩大。
基于脑电图的脑机接口的应用是世界各地公司和大学实验室的尖端研究最终可能实现的一小部分。心灵感应交流、超人智能、附加感官、模拟体验、人类意识数字化、与人工智能融合等都值得考虑。如果这些可能性得以实现,它们将不仅仅重新定义我们与技术的关系:它们还将重新定义对人类意味着什么。
参考文献
以下是我发现有助于完成这个项目和了解 BCIs 的资源和组织列表。我要特别感谢麻省理工学院媒体实验室的 AlterEgo 团队,他们是这个项目的最初灵感来源,也感谢 Alvey 先生和 NeuroTech Berkeley,感谢他们之前对 BCI 社区的代码和教程贡献。此外,我要感谢加州大学戴维斯分校的教职员工,特别是伊利亚斯·塔格科普洛斯、卡伦·莫克森和埃尔金·谢克尔博士,感谢他们一直以来的帮助和支持。
最后,我想对不断成长的 BCI/神经技术社区大声疾呼,他们为未来提供了无尽的支持、资源和热情。
- NeuroTechX
- BCI 红迪网
- Reddit Neuralink
- OpenBCI
如果您想进一步讨论或联系,请随时联系LinkedIn
更迷人的颗粒物天气
两周前,我解释了看不见的颗粒物质——PM10 和 pm 2.5——是如何穿越欧洲的。(https://towards data science . com/invisible-clouds-of-particular-matter-move-cross-Europe-6b 39 e2d 57511)
在将近两周的时间里捕捉更多的数据,并稍微加快视频速度,你会对下午的天气有更好的了解。
大规模的运动显然比 PM 浓度的局部波动更重要。
仍然存在的问题是:项目经理从哪里来?是烧柴的炉子、交通、工业的结合,被天气收集并席卷了整个欧洲?
Photo by Alex Gindin on Unsplash
因果推理中估计治疗效果的元学习器
揭开因果 ML 中 T-学习者、S-学习者和 X-学习者的神秘面纱
https://eng.uber.com/causal-inference-at-uber/
最近我看到优步在 github 上发布了caus AMLpython 库。它包括基于树的算法和在因果推理中估计治疗效果的元算法。我对这一努力感到非常兴奋——将最先进的机器学习技术与因果分析相结合。
知识库中有一个关于如何使用所有这些算法的很好的例子,在 Jupyter 笔记本上。对于没有听说过元学习者的人来说,这可能有点令人困惑。这篇文章我会试着解释代码中提到的一些元学习者,所有这些 T-学习者,S-学习者,X-学习者等等…
首先,我假设你已经知道什么是因果分析,以及它试图推断什么。如果不是,简要总结——因果关系试图回答‘如果’的问题。统计推断和机器学习技术关注 X 的变化如何与 Y 的变化相关联;然而,因果推理的重点是了解 X 对 Y 是否有因果影响,即 X 的变化是否会引起 Y 的变化——如果 X 不变,Y 还会变吗?
传统上,人们用平均治疗效果(ATE= E(Y=1)-E(Y=0)) 来衡量随机治疗组和对照组的差异。例如,兴趣的因果效应是使用优步的人们乘坐价格变化(降低价格)的影响:平均来说,如果我们降低价格,我们会获得多少次以上的乘坐。 吃了 ,在这种情况下,就是治疗组和对照组乘坐次数的期望值之差。
在这个例子中,一个正的 吃了 ,表明降低价格会增加使用优步的人数。负的 表示 表示价格变化降低了需求。一个等于零的估计值表明在乘坐次数方面提供治疗没有优势或劣势。确定一个 ATE 估计值是否可与零区分开(正的或负的)需要使用 p 值进行统计推断。
因为是对治疗的平均效果的估计,正的或负的并不表示任何特定的个体将受益于或受到治疗的伤害。**
随着包含个性化治疗的大型数据集的增加,我们希望超越平均治疗效果,了解治疗效果如何因人而异。一个替代是条件平均治疗效果(CATE,τ(X)= E[D | X = X]= E[Y(1)-Y(0)| X = X])它是以观察到的协变量为条件的治疗效果。
元算法用于计算 、美食 。最常见的元算法采取两个步骤:
- 它使用基础学习者分别为控制组和治疗组估计结果的条件期望。
- 它取这些估计值之间的差值。
更具体地说,这里是回购中使用的几个元学习者。
- 网络学习者:
当基础学习器是基于树的方法时,我们称之为“T-学习器”,因为我们使用“二叉树”基础学习器来估计治疗组和对照组的两个响应。
步骤 1:我们使用任何监督学习来估计μ0(x) = E[Y(0)|X=x]和μ1(x) = E[Y(1)|X=x],我们将两个分类器表示为\hat{μ0}。和\hat{μ1(x)}。
步骤 2: T-learner 是{τ_ T(x)} = \ hat {μ1(x)}—\ hat {μ0(x)}
https://arxiv.org/pdf/1706.03461.pdf
2.s-学习者
“S-学习者”类似于“T-学习者”,只是当我们估计结果时,我们使用所有的预测值,而不赋予治疗变量特殊的作用,因此我们只需要一个“单一”估计值作为基础学习者。
治疗指示符作为类似于所有其他特征的特征被包括在内,而该指示符没有被赋予任何特殊的作用。
我们使用整个数据集上的任何基础学习器来测量预期结果μ(x,w) = E[Y_{obs}|X=x,W=w],将估计量表示为\hat{μ}
CATE 由下式给出:\hat{τ_s(x)}=\hat{μ(x,1)}-\hat{μ(x,0)}
https://arxiv.org/pdf/1706.03461.pdf
3.X-Learner
实际上,我们在对照组的数据往往比治疗组多。在我们在治疗组中只有非常少的数据点的情况下,使用 T-learner 会有问题,我们希望确保在数据非常小的情况下,我们不会对治疗组进行过度拟合。为了避免这个问题,一个需要思考的问题是——我们能利用来自对照组的信息来评估治疗组吗?这就是 X-learner 试图做的事情:使用来自控制组的信息为治疗组导出更好的估计值,反之亦然。它建立在 T-learner 的基础上,以类似“X”的形状使用训练集中的每个观察。这就是反事实发挥作用的地方。
第一步,我们使用任何基本学习器估计响应函数μ0(x)=E[Y(0)|X=x]和μ1(x)=E[Y(1)|X=x],将估计量表示为{μ0}和{μ1}
在第二步中,我们估算反事实,即基于控制结果估计值的治疗组中个体的治疗效果,以及基于治疗结果估计值的对照组中个体的治疗效果。方法是 Di1=Yi-\hat{\mu0(Xi)}和 Di0=\hat{\mu1(Xi)}-Yi0
第三步,我们使用估算信息估计τ1 和τ0。
最后,我们使用两个估计量{τ0}和{τ1}的加权平均值
https://arxiv.org/pdf/1706.03461.pdf
这是一个非常简短的 T 学习者、S 学习者和 X 学习者介绍。当我们进行在线实验或个性化推荐,想要衡量政策对个人的影响时,我们需要看到对个人层面的影响,而不是平均影响,或者当我们进行预测时,我们需要看到为什么会出现某种结果——无论是由于对该个人的政策变化。
使用元学习者可以帮助我们将机器学习算法与因果分析联系起来,并帮助我们理解结果发生变化的原因。他们可以将监督学习算法转化为 CATE 估计,帮助我们更好地理解预测结果。
参考:
Künzel,Sö ren R .等,“使用机器学习估计异质性治疗效果的金属载体。”美国国家科学院院刊 116.10(2019):4156-4165。交叉引用。网络。
该项目是稳定的,正在酝酿长期支持。它可能包含新的实验代码,对于这些代码,APIs
github.com](https://github.com/uber/causalml)
https://eng.uber.com/causal-inference-at-uber/**
元学习——人工智能一般化。
人工智能学会学习,帮助从几个“镜头”中学习。
深度学习已经在各个领域取得了巨大的成功,并且正在继续展开它的翅膀。但是,训练任何传统神经网络模型的一个主要问题是需要大量的数据,并使用这些数据对许多标记的例子进行多次迭代更新。
我们来看一个猫 vs 狗分类的经典例子。虽然在过去的二十年里,我们已经使我们的模型越来越好,以增加准确性,但上述基本问题仍然存在。我们仍然需要大量贴有标签的狗和猫来获得相当的准确性。
人类如何用少得多的例子对它们进行分类。比方说,突然向你展示了两种新的动物,它们在视觉上就像猫和狗一样容易区分。我很确定任何正常人都可以在不到 100 个例子中获得相当的准确性。怎么会??多年来,我们已经了解了动物的基本结构。我们知道如何提取特征,如脸型、头发、尾巴、身体结构等…简而言之,我们已经掌握了学会学习的艺术。
元学习的目标基本上是**学会学习,用最少的数据将人工智能推广到许多不同的场景。**你可以说,迁移学习不也是这样吗?嗯,是的,这是朝着正确的方向发展,但还不够远。已经观察到,随着网络被训练的任务偏离目标任务,预训练网络的益处大大降低。元学习建议在两个层次上构建学习问题。第一个是在每个单独的任务中快速获取知识。这个过程是由第二个引导的,第二个过程是从所有的任务中慢慢提取信息。
元学习算法可以大致分为三类—
经典的基于梯度下降的方法
这类方法背后的直觉是再次使用标准梯度下降更新来使神经网络一般化到各种各样的数据集。
在这种方法中,我们使用一组数据集,每个数据集有几个例子,假设每个数据集有 k 个例子,用于“ k-shot 学习”。设数据集的集合为 p(T)。假设我们的模型是一个参数化的函数ₜₕₑₜₐ.如果我们从参数 *θ、*开始,我们知道模型随着每个单独数据集的标准梯度下降更新而更新。
我们希望我们的模型能够适用于大范围的数据集。因此,我们需要 p(T)中所有数据集的误差总和以及更新后的参数。这可以用数学方法表达如下—
对于 p(T)中的一批数据集,我们用一个标准 SGD 更新来更新 θ w.r. t .上面提到的元目标
我们可以看到,通过模型的梯度反向传播元损失包括计算导数的导数。这可以使用 TensorFlow 支持的 **Hessian-vector products,**来完成。
最近邻方法
这组方法的指导思想是最近邻算法不需要任何训练,但是性能取决于所选择的度量。
它们包括一个将输入域映射到特征空间的嵌入模型和一个将特征空间映射到任务变量的基本学习器。元学习的目标是学习一个嵌入模型,使得基础学习者能够很好地跨任务进行概括。这里是嵌入的基于距离的预测规则。我们将看一个具体的例子,匹配网络来理解工作原理。
匹配网络支持一组 k 个图像标签对的例子 S={(xᵢ ,yᵢ)}到分类器 cₛ(x’,该分类器在给定测试例子 x’的情况下定义了输出 y’上的概率分布。S → cₛ(x’)定义为 P(y’|x ',s),其中 p 由神经网络参数化。因此,给定一个新的示例 S’的支持集,我们简单地使用由 P 定义的参数神经网络来为每个测试示例 x’😛(y ’ | x ',S’)预测适当的标签 y’。简单地说,我们可以说—
y cap and x cap — new example
the attention mechanism
上述方法让人想起 KDE 和 kNN 算法。
f 和 g 是适合 x cap 和 xᵢ的嵌入式神经网络,这取决于任务。它们是用于图像任务(如 Inception)的深度 CNN 或用于语言任务的简单形式单词嵌入。
使用辅助空间的基于模型的方法
我们人类在处理东西的同时,也储存了表示以备将来使用。所以这些算法试图通过一些辅助内存块来模拟它。基本的策略是学习它应该放入记忆中的表示类型,以及它以后应该如何使用这些表示进行预测。
在这些方法中,输入序列和输出标签是按顺序给出的。一个数据集 d yₜ)}={dₜ}={(xₜ,其中 t 表示时间步长。xₜ.之后没有给出输出标签 yₜ对于每个数据集,输入和输入理想标签是混乱的。期望模型在给定的时间步输出 yₜxₜ(i.e.的适当标签。因此,它被迫将数据样本存储在内存中,直到找到合适的标签,之后可以绑定并存储样本类信息以备后用。
我们要讲的这个具体实现中的记忆模块是神经图灵机(NTM) 。它基本上是一个图灵机(读写头在一个内存块上)和一个 LSTM ( )或者有时是简单的基于神经网络 ) 的控制器。NTM 外部存储器模块中的存储器编码和检索是快速的,每个时间步都有可能将向量表示放入或取出存储器。这种能力使得 NTM 成为元学习和低射预测的完美候选,因为它既能够通过缓慢更新其权重进行长期存储,又能够通过其外部存储模块进行短期存储。
在某个时间步骤 t,给定 xₜ ,LSTM 控制器给出一个密钥 kₜ 用于访问存储器矩阵 Mₜ 。
Softmax 用于产生读写向量。
这是 rₜ.用来获取记忆的
这被用作下一个控制器状态的输入以及基于软最大值的分类器的输入。
少镜头学习的元迁移学习
摘要
元学习被提出作为一个框架来解决具有挑战性的少数镜头学习设置。关键的想法是利用大量类似的少量任务,以便学习如何使基础学习者适应只有少量标记样本可用的新任务。由于深度神经网络(DNNs)倾向于仅使用少数样本进行过度拟合,元学习通常使用浅层神经网络(SNNs),从而限制了其有效性。在本文中,我们提出了一种新的少镜头学习方法,称为***【MTL】***,它学习将一个 深度 NN 用于 少镜头学习任务 。具体来说,元指的是训练多个任务,迁移是通过学习每个任务的 DNN 权重的缩放和移位函数来实现的。此外,我们引入了 硬任务(HT)元批量 方案作为 MTL 的有效学习课程。我们使用(5 类,1 次)和(5 类,5 次)识别任务在两个具有挑战性的少数镜头学习基准上进行实验:miniImageNet 和 Fewshot-CIFAR100。与相关工作的广泛比较验证了用提出的 HT 元批量 方案训练的我们的 元迁移学习 方法达到最佳性能。消融研究还表明,这两种成分都有助于快速收敛和高精度。
贡献
- 一种新的 MTL 方法,学习转移大规模预训练的 DNN 权重,以解决少数镜头学习任务。
- 一种新颖的 HT 元批量学习策略,强制元迁移“在艰难中更快更强地成长”。
- 在 mini ImageNet 和 Fewshot-CIFAR100 上进行了大量的实验,取得了最先进的性能。
管道
我们提出的少镜头学习方法的流水线包括三个阶段:(a)在大规模数据上的 DNN 训练,即使用所有训练数据点;(b)基于预训练的特征提取器,元转移学习(MTL)学习缩放和移位(SS)的参数。学习由提议的 HT 元批处理来调度;元测试是对一个看不见的任务进行的,它包括一个基础学习者微调阶段和一个最终评估阶段。输入数据沿箭头排列。名称以粗体显示的模块在相应的阶段得到更新。具体来说,SS 参数是通过元训练学习的,但在元测试期间是固定的。基础学习者参数针对每个任务进行了优化。
元迁移学习
(a)参数级微调(FT)是一种常规的元训练操作,例如在 MAML【1】。它的更新适用于所有神经元参数,𝑊和𝑏.(b)我们在元迁移学习中的神经元级缩放和移位(SS)操作。它们减少了学习参数的数量,避免了过拟合问题。此外,他们保持大规模训练参数(黄色)冻结,防止“灾难性遗忘”。
硬任务元批处理
在我们的元训练管道中,我们有意识地在每个任务中挑选失败案例,并将它们的数据重新组合成更难的任务,以便进行不利的重新训练。我们的目标是迫使我们的元学习者“在艰难中成长”。
该图显示了有和没有硬任务元批处理在准确性和收敛速度方面的性能差距。(a)(b)在 mini ImageNet 上 1 拍和 5 拍;(d)(e)few shot-cifar 100 上的 1 发、5 发和 10 发。
实验
迷你图像网
Fewshot-CIFAR100
参考
[1] Chelsea 等人,“用于深度网络快速适应的模型不可知元学习”在ICML 2017;
[2] Oreshkin 等人,“TADAM:改进的少镜头学习的任务相关自适应度量”在 NeurIPS 2018 。
链接
代码:https://github.com/y2l/meta-transfer-learning
幻灯片:https://yyliu.net/files/meta-transfer-learning-slides.pdf
方法选择提示
我经常从寻求方法选择建议的同事那里听到两个问题的快速解答
我准备研究 X,你觉得研究 X 的时候用哪种方法最好?
我不确定。我自己不研究 X。有没有看别人研究 X 用过的方法?我研究 Y,这里是我如何选择我的方法。我跟踪研究 y 的其他人,我跟踪他们用过的方法和他们还没用过的方法。我使用这些信息来通知(证明)我的方法选择。
Photo by Markus Winkler on Unsplash — “Searching” for methods. — More on attributions.
所以我给你的建议是找到 x 最近的出版物或研究,搞清楚他们用了什么方法,为什么。看看他们是否推荐其他人使用相同的方法或不同的方法。然后找到第二个最近的 x 的出版物或研究,重复这个过程。几轮之后,你会有一个方法列表,当你试图研究 x 时,这些方法可能会对你有所帮助。
好吧,我接受了你的建议。现在我有这三种方法可以选择。你认为我应该选哪一个?
你不是第一个经历这种情况的人。另外,我不确定我知道你问题的答案。但是我有一些建议。在这种情况下,许多人会使用这三种方法来实现分析。如果结果一致,太好了!听起来你有强有力的证据支持这个发现。这意味着您的结果对于多种方法和/或规格都是稳定的。
如果你的结果不一致,也很好!意味着你有强有力的证据支持需要进一步研究 X。这意味着对可用数据应用最广为人知的方法会返回不确定的结果。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
adamrossnelson.medium.com](https://adamrossnelson.medium.com/membership)
感谢阅读
把你的想法和主意发给我。你可以写信只是为了说声嗨。如果你真的需要告诉我是怎么错的,我期待着尽快和你聊天。推特:@ adamrossnelson| LinkedIn:亚当·罗斯·纳尔逊 |脸书:亚当·罗斯·纳尔逊。
处理不平衡数据
Python 中有效处理不平衡数据集的指南
Photo by Ales Nesetril on Unsplash
不平衡类是机器学习分类中的一个常见问题,其中每个类中的观察值比例不成比例。在包括医疗诊断、垃圾邮件过滤和欺诈检测在内的许多不同领域中都可以发现类别不平衡。
在本指南中,我们将看看处理不平衡的班级问题的五种可能的方法。
重要说明:本指南将只关注解决不平衡类,而不会解决其他重要的机器学习步骤,包括但不限于特征选择或超参数调整。
数据
我们将使用 Kaggle 上提供的信用卡欺诈检测数据集。数据集高度不平衡,只有 0.17%的交易被归类为欺诈。完整的笔记本可以在这里找到。
我们的目标是正确分类欺诈交易的少数类别。
不平衡班级的问题
大多数机器学习算法在每个类别的样本数量大致相等时效果最佳。这是因为大多数算法都是为了最大限度地提高精度和减少误差而设计的。
准确性的问题
在这里,我们可以使用 DummyClassifier 来总是预测“不欺诈”,这只是为了说明准确性会有多么令人误解。
我们得到了 99.8%的准确率——甚至没有训练一个模型!让我们将其与逻辑回归进行比较,逻辑回归是一种经过实际训练的分类器。
也许并不奇怪,与上面的虚拟分类器相比,我们的准确度分数下降了。这告诉我们,要么我们在逻辑回归模型中做错了什么,要么准确性可能不是我们衡量绩效的最佳选择。
让我们来看看一些流行的处理阶级不平衡的方法。
1.更改绩效指标
正如我们在上面看到的,当评估不平衡的数据集时,准确性不是最好的衡量标准,因为它可能会产生误导。可以提供更好洞察力的指标包括:
- **混淆矩阵:**显示正确预测和错误预测类型的表格。
- **精度:**真阳性数除以所有阳性预测数。精度也叫阳性预测值。它是对分类器准确性的一种度量。低精度表示大量的误报。
- **召回:**测试数据中真阳性数除以阳性值数。回忆也称为敏感度或真实阳性率。它是对分类器完整性的一种度量。低召回率表示大量的假阴性。
- **F1:得分:**准确率和召回率的加权平均值。
让我们看看当我们将这些 F1 和回忆分数应用到上面的逻辑回归时会发生什么。
这些分数看起来并不令人印象深刻。让我们看看我们可以尝试哪些其他方法来改进我们的新指标。
2.改变算法
虽然在每个机器学习问题中,尝试各种算法是一个很好的经验法则,但它对不平衡的数据集尤其有益。决策树通常在不平衡数据上表现良好。他们通过学习 if/else 问题的层次结构来工作,这可以迫使这两类问题都得到解决。
虽然我们的准确度分数略低,但 F1 和召回率都比逻辑回归有所增加!看来对于这个特定的问题,随机森林可能是一个更好的选择模型。
3.重采样技术-过采样少数类
我们的下一个方法开始我们的重采样技术。
过采样可以定义为添加少数类的更多副本。当您没有大量数据要处理时,过采样可能是一个不错的选择。
我们将使用 Scikit-Learn 中的重采样模块从少数类中随机复制样本。
重要提示
在尝试过采样技术之前,一定要分成测试集和训练集!在分割数据之前进行过采样可以允许在测试集和训练集中出现完全相同的观察结果。这可能会使我们的模型简单地记住特定的数据点,并导致对测试数据的过度拟合和不良概括。
重采样后,我们每个类的数据点比例相等!让我们用平衡的训练数据再次尝试我们的逻辑回归。
我们的回忆分数增加了,但 F1 比我们的基线逻辑回归或上面的随机森林低得多。让我们看看欠采样是否会有更好的表现。
4.重采样技术-欠采样多数类
欠采样可以定义为去除多数类的一些观察值。当你有大量数据时,欠采样可能是一个不错的选择——想想数百万行。但缺点是我们删除了可能有价值的信息。这可能导致对测试集的欠拟合和不良概括。
我们将再次使用 Scikit-Learn 中的重采样模块从多数类中随机移除样本。
同样,我们有相同比例的欺诈和非欺诈数据点,但在这种情况下,用于训练模型的数据量要小得多。让我们再次应用我们的逻辑回归。
在这种情况下,欠采样的表现不如过采样。让我们尝试另一种处理不平衡数据的方法。
5.生成合成样本
一种类似于上采样的技术是创建合成样本。这里我们将使用 imblearn 的 SMOTE 或合成少数过采样技术。SMOTE 使用最近邻算法来生成新的合成数据,我们可以使用这些数据来训练我们的模型。
同样,只在训练集中生成新样本很重要,以确保我们的模型能够很好地推广到看不见的数据。
在生成我们的合成数据点之后,让我们看看我们的逻辑回归是如何执行的。
我们的 F1 分数提高了,召回率与上面的上采样模型相似,对于我们的数据,这里优于欠采样。
结论
我们探讨了处理不平衡数据集的 5 种不同方法:
- 更改绩效指标
- 改变算法
- 过采样少数类
- 欠采样多数类
- 生成合成样本
对于这个特定的数据集,随机森林和 SMOTE 似乎是我们在这里尝试的最佳选项之一。
这些只是处理不平衡数据集时可以尝试的许多方法中的一部分,并不是一个详尽的列表。其他一些可以考虑的方法是收集更多的数据或选择不同的重采样比率——您不需要 1:1 的比率!
您应该总是尝试几种方法,然后决定哪种方法最适合您的问题。
利用损失函数深入挖掘度量学习
撰稿人:杰克·巴格利昂,塞图·哈里什·科勒鲁
深度学习中的最新进展使得使用深度度量学习网络来学习一组图像的相似性度量成为可能,该网络将视觉上相似的图像映射到嵌入流形中的附近位置,并将视觉上不相似的图像彼此分开。使用这种方法学习的深度特征导致具有紧凑的产品内差异和良好分离的产品间差异的良好区分的特征,这是具有更好的视觉搜索引擎的关键。此外,学习这种区别性特征使得网络能够很好地对看不见的产品图像进行归纳,最终在嵌入空间中形成新的聚类。
(a) Separable Features (b) Discriminative Features
我们训练这些网络类似于其他深度学习网络,但具有不同的损失函数,在训练期间,这些网络在嵌入空间中明确地将相似的图像推到一起,并将不同的图像彼此拉开。在任何情况下, t 在训练期间,我们将训练数据集中的图像输入到网络,并将它们映射到嵌入空间。我们使用损失函数计算这些映射的惩罚,并使用适当的优化技术调整网络权重。在执行推理时,我们从嵌入层提取特征,并执行最近邻搜索来识别相似图像。
一种使用卷积神经网络训练用于物体识别的可扩展深度学习模型的方法。
towardsdatascience.com](/deep-metric-learning-76fa0a5a415f)
在这篇文章中,我们将概述一些广泛使用的损失函数,用于学习度量学习嵌入。
Training and inference routine for Metric Learning Models. Note that, although there are various effective training routines available to achieve the same objective, here we are only concerned about the most basic and well-generalized training framework, shown in the picture.
对比损失
为了最小化两个相似图像的特征之间的距离并迫使不相似的图像特征彼此分开,对比损失函数在损失函数中独立地编码相似性和不相似性这两个度量。它直接处理两个相似图像的图像特征之间的距离,并且如果两个不同的图像特征没有被距离余量 α 分开,则它们之间的距离被包括在损失中。在这个意义上,损失函数定义如下。
这里, m 是在小批量中可用的锚阳性示例产品对的数量。Dᵢⱼ = ||f(xᵢ) — f(xⱼ)||是深层特征之间的距离 f(xᵢ)和 f(xⱼ)分别对应于图像 xᵢ和 xⱼ。yᵢⱼ= +/-1 是一对(xᵢ,xⱼ)是否共享相似标签的指示符。[.]⁺是铰链损失函数 max(0,.).每对特征向量独立生成一个损失项,如下图所示。
Edges colored red represent example pairs sharing similar labels and contributes to a loss term via Dᵢⱼ. This term addresses intra-class variance. On the other hand, blue represents example pairs with different product labels and uses α — Dᵢⱼ to generate a loss number. This term addresses inter-class separation among the feature clusters.
为了计算大小为 N 的数据集在每一步的损失,我们必须执行 O(N)成对距离计算。如果我们采用与随机梯度下降相似的方法,使用大小为 B 的小批量,则计算量为 O(B)量级。然而,如果我们从原始数据集中随机选择小批量,我们很可能会在小批量中没有任何正配对,因此我们不会在此设置中优化类内方差。因此,需要明确地为每个小批量选择相当数量的阳性对,优选接近小批量大小的约 50%,以获得紧凑的类内方差和大的类间分离。举个例子,比如说,我们设置小批量为 B=32 ,那么,
-我们将随机选择 16 产品。
-接下来,我们将从每个 16 产品中挑选 2 张随机图片。
-现在,在尺寸为 32 的小批量中,我们有 16 正对和 15 * 16 负对。
这个额外的手工挑选小批量的步骤将确保损失项也捕获类内方差,而没有任何额外的计算成本。
尽管对比损失函数很容易理解,但是当我们设置恒定的裕量 α 时,它并没有说明所有负面例子的视觉差异的程度。这将嵌入空间限制为仅具有所有可能失真的子集,同时将视觉上不同的产品训练和排列为视觉上相似的相似距离。例如,有三个图像,产品 A、产品 B 和产品 C 如下所示。直观上,产品 A 和产品 B 在视觉上比产品 A 和产品 C 更相似。然而,当我们设置$\ alpha$的恒定边距时,我们将产品 B 和产品 C 的特征向量从产品 A 的特征推开$\ alpha$的边距,假设它们具有相似的视觉相异度。
Product A and B are visually similar, with different product labels. Product C is visually different from the other two products. Despite having a different scale of visual similarity, margin α is constant for all three products.
三重损失
三重损失可能是度量学习中最流行的损失函数。三重损失接受三重深度特征(xᵢₐ、xᵢₚ、xᵢₙ),其中(xᵢₐ、xᵢₚ)具有相似的产品标签,而(xᵢₐ、xᵢₙ)具有不同的产品标签,并且调整网络,使得锚(xᵢₐ)和正(x)、d 之间的距离小于锚(x)和负(x)、d 之间的距离
这里,Dᵢₐ,ᵢₚ = ||f(xᵢₐ) — f(xᵢₚ)||₂,Dᵢₐ,ᵢₙ = ||f(xᵢₐ) — f(xᵢₙ)||₂.每个损失项独立考虑与预定义锚例相关的三元组来计算损失,如下图所示。
In a triplet (X1, X2, X3) red-colored line connects an anchor example X1 and positive example X2. Solid blue line connects anchor X1 and negative example X3, that shares different product labels. Unlike contrastive loss, each loss term addresses intra-class variance and inter-class separability together.
由于损失裕度不是直接基于两个嵌入之间的距离,而是基于三元组中的对之间相对于锚的相对距离,因此与对比损失相比,它考虑了任意嵌入空间失真。
虽然三重损失可以解决对比损失函数的这个问题,但是它在计算上是昂贵的。在用 B 三元组的小批量训练期间,我们将需要计算小批量中所有可能的三元组之间的距离,这导致超过 O(N ) 个可能的(不一定有效的)三元组,当训练大型数据集时,这在计算上是不可行的。例如,在一个简单的场景中,一个数据集有 20 个不同的产品类,每个包含 15 个图像,可以有 2 个来自 15 个图像的 20 个组合= 2100 个有效三元组( 2100 个可能的锚正示例对,每个从数据集中选择一个负产品示例)。为了得到所有可能对的总损失,需要 2100 / m 次小批量(大小为 m )迭代。此外,随着训练收敛,大多数三元组满足正对和负对距离之间的余量约束。它导致大多数三元组的少量贡献。这导致学习缓慢,从而收敛缓慢。
为了解决这种较慢的训练收敛,在大多数训练例程中,基于负面挖掘的方法是常见的。
提升结构损失
当训练具有三重损失目标的 CNN 时,它在产生损失时未能利用完整的小批量信息,这主要是因为正和负产品示例仅针对给定的锚示例被预定义。提升结构损失的想法是使用批次中可用的所有 O(B ) 对,而不是 O (B) 个单独的对,来改进小批次优化。下图显示了如何通过成对距离的距离矩阵扩展此功能以充分利用小批量。
An anchor and positive example pair, (X1, X2) and their interaction with remaining pairs in a mini-batch.
请注意,一对节点中的两个节点都独立地与微型批次中所有可用的负节点进行交互。在某种意义上,它不同于三重损失项,它不定义仅考虑预定义锚的负点,忽略小批量中可用的所有其他负点。它还将正面例子视为找到其负面例子并促成损失项的锚。有助于 CNN 训练有更快更好的收敛。
需要注意的是,如上图所示,对于给定的 X1 和 X2 对,随机从小批量的例子中选择否定乘积的例子,并不能像“硬否定那样促进更快的网络收敛。为了提高收敛速度,作者建议对给定对中的每个示例单独挖掘’'硬’否定,如下图所示。
Hard negatives with respect to X1 and X2 are shown in solid blue line. Although X1 considers X6 as a negative it interacts with all the available negatives in a mini-batch.
提升结构损失函数最小化稳定网络训练的平滑上限。具体而言,给定小批量图像的提升结构化损失函数可以写成如下。
其中,Dᵢⱼ = ||f(xᵢ) — f(xⱼ)||₂. P 和 N 分别是小批量生产的所有正负线对。
n 对损耗
多类 N 对损耗类似于提升结构损耗,因为它在给定的小批量中生成损耗项的同时补充了多个负乘积样本,并且不会像三重损耗和对比损耗那样遭受较慢的收敛。
For each loss term L, an anchor example (X1) of a given pair (X1, X2)
utilizes N-1 negative product examples available in a mini-batch (that is X4 and X6 here), when N is the number of pairs available in a mini-batch.
使用 N 对示例,按照下面的等式生成损失。
其中 N 是具有相似产品标签的图像对的总数。如果我们将 f 视为特征向量, f+ 视为权重向量,右手边的分母视为似然函数 P(y=y+) ,则上述等式类似于多类逻辑损失(即 softmax 损失)。此外,当训练数据集包含大量产品类时,此损失函数的性能会更好。 N (不同对的数量)的值越大,近似越精确。
使用 N 对损失超过提升结构损失的一个好处是,它试图以概率方式优化正锚点和负乘积样本之间的余弦相似性。换句话说,它计算一对特征之间的余弦相似性,并尝试在小批量中使用成对比较来增加这些特征在同一产品类中的概率。由于余弦相似性度量(以及概率)是比例不变的(如下图所示),N 对损失往往对训练期间的特征变化具有鲁棒性。
N-Pair loss directly addresses the cosine similarity between an anchor(x1) and positive example(x2), and compare it to the similarity between positive example and other negative examples in a probabilistic manner.
角度损失
与上面讨论的度量学习方法相反,其更集中于优化绝对距离(对比损失)或相对距离(三重损失、提升结构损失、N 对损失),角度损失提出根据负边缘的角度对三重三角形内部的三阶关系进行编码。
与 N 对损耗类似,它通过定义考虑角距离(余弦)的损耗函数,受益于比例不变性。它促使负特征向量远离正聚类,并拖动正点彼此靠近,如下图所示。
使用下面陈述的损失函数有几个优点:
-与欧几里德距离不同,角(余弦)距离是相似性变换不变的度量。当考虑角度几何时,它不仅受益于尺度不变性,而且还引入了旋转不变性。尽管图像特征在训练时经常被重新缩放,但对于固定的α裕量,∠n ≤ α总是成立。简而言之,损失项中的角度几何视图对特征图的局部变化更鲁棒。
——余弦法则解释 ∠n 的计算需要三角形的所有三条边。相比之下,原来的三联体只考虑到了两个方面。增加的约束鼓励优化的鲁棒性和有效性。
-当欧几里德被用作距离度量时,为损失项选择损失余量 m 不是一件简单的任务。这主要是因为随着数据集规模的增长,目标产品类之间的类内差异变化很大。在没有有意义的参考的情况下,调整这样的超参数是至关重要的。相比之下, α 设置起来更简单,因为它具有比例不变的特性。
此外,角度损失可以很容易地与传统的度量学习损失函数相结合,以提高整体性能。下面给出了它与 N 对损耗函数结合使用的一个例子。
λ 是 N 对和角度损耗之间的权衡权重。 λ 的默认值始终设置为 2。 α 可在 35 和 60 度之间设定。
发散损失
尽管上面解释的所有度量学习目标函数都将给定图像嵌入到嵌入流形中,但是它们不一定明确地查看同一图像的各个方面。发散损失通过不同的系综模块探索这一观点。发散损失是一个正则化的术语,我们可以将它添加到联合监管的度量学习损失函数中。它增加了由不同集成模块学习的图像特征之间的距离。换句话说,它鼓励每个学习者关注输入图像的不同属性,如下图所示。
这里, (xᵢ,yᵢ) 是所有训练样本和标签的集合。 L₁ 是针对 mᵗʰ 学习者的度量学习损失函数 L₂ 是用于使每个学习者的特征嵌入多样化的正则化项 m 。 λ 是控制正则化子强度的加权参数。
其中 xᵢ 是对应于图像 x 的特征向量。Dᵢₐ,ᵢₚ表示由两个不同的学习者 a 和 p 嵌入的图像的特征嵌入之间的距离度量。 m 是发散损失的余量,通常设置为 1。【]⁺表示铰链功能 max(0,)。
Divergence loss pulls apart the feature embeddings of different learners. In other words, it encourages feature instances, learned via different ensemble module, to attend different parts of an imaged object (X6 here). It results in diverse embedding space for all learners. Each learner individually satisfies the similarity constraint of projecting similar product labels nearby.
发散损失拉开了不同学习者的特征嵌入。换句话说,它鼓励通过不同集成模块学习的特征实例参与成像对象的不同部分(这里是 X6)。它为所有学习者带来了不同的嵌入空间。每个学习者单独满足附近投影相似产品标签的相似性约束。
结论
在本文中,我们讨论了一族度量学习损失函数,它在训练基于距离度量学习的卷积神经网络结构中起着至关重要的作用。这些损失函数使得网络能够解决传统对象识别例程的一些限制,因为它们可以用较少的可用图像实例来处理产品类别,并且使得灵活的系统可以容易地扩展到新产品类别。
尽管基于这些损失函数的度量学习网络在为我们的客户构建有效的视觉搜索解决方案方面已经显示出巨大的成功,但是这种系统的训练在计算上是昂贵且耗时的。在大小为 N 的数据集上计算损失并采取梯度步骤的顺序为 O(N ) 或 O(N ) ,这限制了我们在梯度下降方法中使用小批量(大小为 B )。这可能会将计算减少到 O(B ) 或 O(B ) ,但是我们如何构造迷你批处理变得极其重要。
在随机梯度下降中,我们通过随机抽样数据集和合理的批量大小来构建迷你批量。然而,例如,如果我们在三联体损失函数中使用随机抽样构建小批量,我们很可能不会得到任何违反裕度的正对甚至负对。在这种情况下,迷你批次的损耗贡献将非常小,因此是训练中的梯度步长。因此,通过采用小批量梯度方法,我们可能会减少小批量的计算量,但如果小批量没有足够的损失贡献,我们可能会进行更多的计算来达到最佳点。因此,对训练数据集进行采样并构建小批量的方法对于加快度量学习训练是至关重要的,以便它能够提供关于损失的足够信息,同时不会太大。
参考
[1]哈德塞尔,r .,乔普拉,s .,&勒昆,Y. (2006 年 6 月)。通过学习不变映射进行降维。2006 年 IEEE 计算机学会计算机视觉和模式识别会议(CVPR’06)(第 2 卷,第 1735-1742 页)。IEEE。
[2]文,杨,张,王,李,乔,(2016 年 10 月).一种用于深度人脸识别的鉴别特征学习方法。在欧洲计算机视觉会议上(第 499-515 页)。斯普林格,查姆。
[3]f .施罗夫、d .卡列尼琴科和 j .菲尔宾(2015 年)。Facenet:人脸识别和聚类的统一嵌入。IEEE 计算机视觉和模式识别会议论文集(第 815-823 页)。
[4] Oh Song,h .,Xiang,y .,Jegelka,s .,& Savarese,S. (2016 年)。基于提升结构特征嵌入的深度度量学习。IEEE 计算机视觉和模式识别会议论文集(第 4004-4012 页)。
[5]索恩·k .(2016 年)。具有多类 n 对损失目标的改进深度度量学习。神经信息处理系统的进展(第 1857-1865 页)。
[6]王军,周,方,文,刘,林,于(2017)。带有角度损失的深度度量学习。IEEE 计算机视觉国际会议论文集(第 2593–2601 页)。
[7] Kim,w .,Goyal,b .,Chawla,k .,Lee,j .,& Kwon,K. (2018 年)。用于深度度量学习的基于注意力的集成。《欧洲计算机视觉会议论文集》(ECCV)(第 736–751 页)。
度量和 Python
在三篇系列文章中,我们将描述一组基本的统计概念和用于回归和分类的度量标准
Photo by Isabella Christina on Unsplash
作为一名程序员,我缺乏对数学和统计概念的研究。现在有了更多的经验,我决定汇编并分享一些我遇到的不同问题的度量标准和概念。
在这一系列文章中,我们将简要回顾它们的用法、公式、示例以及在 Python 中的实现,这样我们就可以一起看到它们,并且在必要时手头有这个图表。
这里是第一部分,指的是回归案例中最常用的指标。
数据集和模型
在本文中,我们使用了关于房价的 Kaggle 数据集,因为这是一个我们许多人都熟悉的回归的典型例子。
基本的工程特征已经完成,能够呈现一个最低限度的合理模型,作为度量标准开发的范例。
from scipy.stats import boxcox_normmax
from scipy.special import boxcox1p
from sklearn.linear_model import LinearRegressiontrain = pd.read_csv('../input/home-data-for-ml-course/train.csv')
y = train.SalePrice.reset_index(drop=True)features = train
end_features = ['OverallQual','GrLivArea','GarageCars','GarageArea','TotalBsmtSF','1stFlrSF','FullBath','TotRmsAbvGrd','MSSubClass','MSZoning']
features = features[end_features]features['MSSubClass'] = features['MSSubClass'].apply(str)
features['MSZoning'] = features.groupby('MSSubClass')['MSZoning'].transform(lambda x: x.fillna(x.mode()[0]))objects = [col for col in features.columns if features[col].dtype == "object"]
features.update(features[objects].fillna('None'))numeric_dtypes = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
numerics = [col for col in features.columns if features[col].dtype in numeric_dtypes]
features.update(features[numerics].fillna(0))for i in numerics:
features[i] = boxcox1p(features[i], boxcox_normmax(features[i] + 1))X = pd.get_dummies(features).reset_index(drop=True)#----------------- The model
reg = LinearRegression().fit(X, y)
y_pred = reg.predict(X)
回归度量摘要
这是一个简单的表格,包含了我们将要描述的指标,表格的最后一列是我们模型的结果。
平均绝对误差
MAE 测量一组预测中误差的平均大小,不考虑它们的方向。它是预测和实际观察之间的绝对差异的测试样本的平均值,其中所有个体差异都具有相同的权重。
https://www.dataquest.io/blog/understanding-regression-error-metrics/
平均绝对误差使用与数据相同的标度。这被称为依赖于尺度的精度度量,因此不能用于使用不同尺度的系列之间的比较。
https://www.dataquest.io/blog/understanding-regression-error-metrics/
from sklearn.metrics import mean_absolute_error
print ('Sk MAE: ' + str(mean_absolute_error(y,y_pred)) )def MAE(predict,target):
return (abs(predict-target)).mean()print ('My MAE: ' + str(MAE(y_pred,y)))
MSE:均方差
MSE 是一个风险函数,对应于平方误差损失的期望值。MSE 几乎总是严格为正(且不为零)的事实是因为随机性或者因为估计器没有考虑到能够产生更精确估计的信息。MSE 是对估计量质量的一种度量,它总是非负的,值越接近零越好。
https://www.geeksforgeeks.org/ml-mathematical-explanation-of-rmse-and-r-squared-error/
“最小化 MSE 是选择估值器的关键标准:见最小均方误差。在无偏估计量中,最小化 MSE 等价于最小化方差,而做这件事的估计量就是最小方差无偏估计量。然而,有偏估计量可能具有较低的 MSE 参见估计器偏差。
在统计建模中,MSE 可以表示实际观测值和模型预测的观测值之间的差异。在这种情况下,它用于确定模型与数据的吻合程度,以及是否可以在不明显损害模型预测能力的情况下删除一些解释变量。"
https://www.geeksforgeeks.org/ml-mathematical-explanation-of-rmse-and-r-squared-error/
from sklearn.metrics import mean_squared_error
print ('Sk MSE: ' + str(mean_squared_error(y,y_pred)) )def MSE(predict,target):
return ((predict-target)**2).mean()
print ('My MSE: ' + str(MSE(y_pred,y)) )
RMSE:均方根误差
RMSE 是一个二次评分规则,也衡量误差的平均幅度。它是预测值和实际观测值之间的平均平方差的平方根。
https://www.includehelp.com/ml-ai/root-mean-square%20error-rmse.aspx
RMSE 和梅的比较
相似之处:
- 用感兴趣变量的相同单位表示平均模型预测误差。
- 范围从 0 到∞并且与误差方向无关。
- 值越低越好。
差异:
- 在求平均值之前求平方根,RMSE 给大误差一个相对较高的权重,所以当不希望有大误差时,RMSE 应该有用。
def RMSE(predict, target):
return np.sqrt(((predict - target) ** 2).mean())
print ('My RMSE: ' + str(RMSE(y_pred,y)) )
MAPE:平均绝对百分比误差
虽然 MAPE 的概念听起来非常简单和令人信服,但它在实际应用中有重大缺陷 [*] ,并且有许多来自 MAPE 的关于缺陷和误导性结果的研究
https://www.dataquest.io/blog/understanding-regression-error-metrics/
def MAPE(predict,target):
return ( abs((target - predict) / target).mean()) * 100print ('My MAPE: ' + str(MAPE(y_pred,y)) )
RMSLE:均方根对数误差
在 RMSLE 的情况下,你取预测值和实际值的对数。所以基本上,改变的是你测量的方差。我相信,当预测值和真实值都是巨大的数字时,如果不想惩罚预测值和实际值之间的巨大差异,通常会使用 RMSLE。
RMSLE 衡量实际和预测之间的比率。
对数(pi+1)对数(ai+1)对数(pi+1)对数(ai+1)
可以写成 log((pi+1)/(ai+1))log((pi+1)/(ai+1))
当值是巨大的数字时,如果不想惩罚巨大的差异,可以使用它。
此外,当您希望对低估的惩罚比对高估的惩罚更多时,也可以使用这种方法。
让我们看看下面的例子
情况 a) : Pi = 600,Ai = 1000 — RMSE = 400,RMSLE = 0.5108
情况 b) : Pi = 1400,Ai = 1000 — RMSE = 400,RMSLE = 0.3365
import mathdef RMSLE(predict, target):
total = 0
for k in range(len(predict)):
LPred= np.log1p(predict[k]+1)
LTarg = np.log1p(target[k] + 1)
if not (math.isnan(LPred)) and not (math.isnan(LTarg)):
total = total + ((LPred-LTarg) **2)
total = total / len(predict)
return np.sqrt(total)print ('My RMSLE: ' + str(RMSLE(y_pred,y)) )
R and R 平方:决定系数
R and R 平方帮助我们了解我们的回归模型与一个非常简单的模型相比有多好,该模型仅预测来自作为预测的训练集的目标的平均值。
https://www.datasciencecentral.com/profiles/blogs/r-squared-in-one-picture
def R2(predict, target):
return 1 - (MAE(predict,target) / MAE(target.mean(),target))def R_SQR(predict, target):
r2 = R2(predict,target)
return np.sqrt(r2)print ('My R2 : ' + str(R2(y_pred,y)) )
print ('My R : ' + str(R_SQR(y_pred,y)) )
调整后 R
表现等同于基线的模型会将 R 平方值设为 0。模型越好,r2 值越高。具有所有正确预测的最佳模型会给出 R 平方为 1。但是,在向模型中添加新要素时,R 平方值要么增加,要么保持不变。R-Squared 不会因添加对模型没有任何价值的要素而受到惩罚。因此,R 平方的改进版本是调整后的 R 平方
http://www.haghish.com/statistics/stata-blog/stata-programming/adjusted_R_squared.php
def R2_ADJ(predict, target, k):
r2 = R2(predict,target)
n = len(target)
return (1 - ( (1-r2) * ( (n-1) / (n-(k+1)) ) ) )k= len(features.columns)
print ('My R2 adjusted: ' + str(R2_ADJ(y_pred,y,k)) )
摘要
将主要的回归度量放在一个表中,并为它们中的每一个编写函数,这是一种极好的个人体验。在同一个练习中使用它们,因为这让我能够比较它们的用途,理解它们的公式,并在撰写文章时有一个完整的画面。
希望这篇文章是有用的,欢迎任何评论或更正。
下周我们将发表这个系列的第二部分,一篇关于分类度量的文章……
来源
在统计学中,平均绝对误差(MAE)是两个连续变量之间差异的度量。假设 X 和是…
en.wikipedia.org](https://en.wikipedia.org/wiki/Mean_absolute_error) [## 梅和 RMSE——哪个指标更好?
平均绝对误差与均方根误差
medium.com](https://medium.com/human-in-a-machine-world/mae-and-rmse-which-metric-is-better-e60ac3bde13d) [## 教程:了解线性回归和回归误差度量
人类大脑的构造是为了识别我们周围世界的模式。例如,我们观察到如果我们练习…
www.dataquest.io](https://www.dataquest.io/blog/understanding-regression-error-metrics/) [## RMSE 和 R 平方误差的数学解释
RMSE:均方根误差是回归线与数据点拟合程度的量度。RMSE 也可以是…
www.geeksforgeeks.org](https://www.geeksforgeeks.org/ml-mathematical-explanation-of-rmse-and-r-squared-error/) [## 均方误差
在统计学中,估计量的均方误差(MSE)或均方偏差(MSD)
en.wikipedia.org](https://en.wikipedia.org/wiki/Mean_squared_error) [## 均方根误差(RMSE) |机器学习
首页“机器学习/人工智能均方根误差(RMSE):在这篇文章中,我们将学习…
www.includehelp.com](https://www.includehelp.com/ml-ai/root-mean-square%20error-rmse.aspx) [## 均方根偏差
均方根偏差(RMSD)或均方根误差(RMSE)(有时也称为均方根误差)是一个…
en.wikipedia.org](https://en.wikipedia.org/wiki/Root-mean-square_deviation) [## 欢迎使用销售预测、库存计划、需求计划、销售和运营预测软件
预测 101:预测误差测量统计和如何使用它们的指南误差测量统计发挥…
www.forecastpro.com](https://www.forecastpro.com/Trends/forecasting101August2011.html) [## 平均绝对百分比误差
平均绝对百分比误差(MAPE),也称为平均绝对百分比偏差(MAPD),是衡量…
en.wikipedia.org](https://en.wikipedia.org/wiki/Mean_absolute_percentage_error) [## RMSE 和 RMSLE(对数误差)之间有什么区别,高 RMSE 是否意味着…
回答(第 1 题,共 2 题):均方根误差(RMSE)和均方根对数误差(RMSLE)都是技术…
www.quora.com](https://www.quora.com/What-is-the-difference-between-an-RMSE-and-RMSLE-logarithmic-error-and-does-a-high-RMSE-imply-low-RMSLE)
https://en.wikipedia.org/wiki/Coefficient_of_determination
[## 每个人都应该知道的机器学习的 11 个重要模型评估指标
概述评估模型是构建有效机器学习模型的核心部分,有几种评估方法…
www.analyticsvidhya.com](https://www.analyticsvidhya.com/blog/2019/08/11-important-model-evaluation-error-metrics/?utm_source=twitter.com&utm_medium=social) [## 在 Stata 中计算调整后的 R 平方
2014 年 11 月 23 日更新|快速提示| |简介| |算法| | r2_a 程序| |分析| |练习|…
www.haghish.com](http://www.haghish.com/statistics/stata-blog/stata-programming/adjusted_R_squared.php) [## 决定系数
在统计学中,决定系数,表示为 R 2 或 r 2,读作“R 的平方”,是…
en.wikipedia.org](https://en.wikipedia.org/wiki/Coefficient_of_determination)
度量和 Python II
在之前的文章中,我们采用了回归问题的度量指南。现在我们来看看分类问题中最常用的指标
Photo by Miguel A. Amutio on Unsplash
数据集
我们创建一个包含三个数组的数据集:真实值、预测值和似然值。
real _ values:0 到 1 之间有 1000 个元素的数据集。
pred_values :真实数据集的变体,模拟预测,只改变前 150 个值。
【prob _ values】:pred _ values 数组,但包含概率为 0 或 1 的百分比,而不是实际值 0 或 1。它将用于 ROC 图表和召回与精确对比。
real_values = []
prob_values = []
pred_values = []for k in range(0,1000):
value = random.uniform(0, 1)
real_values.append(int(round(value,0))) if k < 150:
value2 = random.uniform(0, 1)
prob_values.append(value2)
pred_values.append(int(round(value2,0)))
else:
prob_values.append(value)
pred_values.append(int(round(value,0)))
混淆矩阵
混淆矩阵本身不是一个指标,但它是对真实数据和预测进行分类的重要工具,因此它的组成部分是第一组指标的触发器。
from sklearn.metrics import confusion_matrix
import scikitplot as skplt
print(confusion_matrix(real_values, pred_values))
skplt.metrics.plot_confusion_matrix(real_values, pred_values,figsize=(8,8))
二元分类—表 2.1
https://kreilabs.com/wp-content/uploads/2019/12/Metrics_table.pdf
您可以在https://kreilabs . com/WP-content/uploads/2019/12/Metrics _ table . pdf中下载完整文件
在这里,我们可以看到 matrix_metrix 例程中表指标的 pyhton 实现:
import sklearn.metrics
import mathdef matrix_metrix(real_values,pred_values,beta):
CM = confusion_matrix(real_values,pred_values)
TN = CM[0][0]
FN = CM[1][0]
TP = CM[1][1]
FP = CM[0][1]
Population = TN+FN+TP+FP
Prevalence = round( (TP+FP) / Population,2)
Accuracy = round( (TP+TN) / Population,4)
Precision = round( TP / (TP+FP),4 )
NPV = round( TN / (TN+FN),4 )
FDR = round( FP / (TP+FP),4 )
FOR = round( FN / (TN+FN),4 )
check_Pos = Precision + FDR
check_Neg = NPV + FOR
Recall = round( TP / (TP+FN),4 )
FPR = round( FP / (TN+FP),4 )
FNR = round( FN / (TP+FN),4 )
TNR = round( TN / (TN+FP),4 )
check_Pos2 = Recall + FNR
check_Neg2 = FPR + TNR
LRPos = round( Recall/FPR,4 )
LRNeg = round( FNR / TNR ,4 )
DOR = round( LRPos/LRNeg)
F1 = round ( 2 * ((Precision*Recall)/(Precision+Recall)),4)
FBeta = round ( (1+beta**2)*((Precision*Recall)/((beta**2 * Precision)+ Recall)) ,4)
MCC = round ( ((TP*TN)-(FP*FN))/math.sqrt((TP+FP)*(TP+FN)*(TN+FP)*(TN+FN)) ,4)
BM = Recall+TNR-1
MK = Precision+NPV-1 mat_met = pd.DataFrame({
'Metric':['TP','TN','FP','FN','Prevalence','Accuracy','Precision','NPV','FDR','FOR','check_Pos','check_Neg','Recall','FPR','FNR','TNR','check_Pos2','check_Neg2','LR+','LR-','DOR','F1','FBeta','MCC','BM','MK'], 'Value':[TP,TN,FP,FN,Prevalence,Accuracy,Precision,NPV,FDR,FOR,check_Pos,check_Neg,Recall,FPR,FNR,TNR,check_Pos2,check_Neg2,LRPos,LRNeg,DOR,F1,FBeta,MCC,BM,MK]}) return (mat_met)
当我们调用 matrix_metrix 函数时:
beta = 0.4
mat_met = matrix_metrix(real_values,pred_values,beta)
print (mat_met)
Note: Prevalence is 0.505, code has a mistake at first version
预测值和实际值
https://en.wikipedia.org/wiki/Confusion_matrix
TP =真阳性
TN =真阴性
FP =假阳性 —相当于假警报或 I 类错误
FN =假阴性— 相当于遗漏或II 型错误
总费率*
https://en.wikipedia.org/wiki/Confusion_matrix
**患病率:**用于衡量总人口中数据的平衡。
可以测量阳性或阴性的发生率,并且两个商数之和= 1,一个平衡的数据集将给出接近 0.5 的系数
如果相反,其中一个因素接近 1,另一个接近 0,我们将得到一个不平衡的数据集。
**精度:**它是系统成功的度量,正面和负面成果的总和超过总人口,表明模型的成功程度。根据案例研究的灵敏度的成本,以及数据的平衡(患病率)。
预测利率*
https://en.wikipedia.org/wiki/Confusion_matrix
PPV——精确度的阳性预测值
NPV —负面预测值
PPV 和 NPV 描述了诊断测试或其他统计测量的性能。高结果可以被解释为表明这种统计的准确性。PPV 和 NPV 不是测试固有的;它们还取决于流行率。⁴
FDR —错误发现率(第一类)【四】
为——漏报率
check_Pos: PPV + FDR = 1
check_Neg: FOR + NPV = 1
条件利率*
https://en.wikipedia.org/wiki/Confusion_matrix
回忆、灵敏度、检测概率和功效是相同的度量,根据研究领域的不同,它们采用不同的名称和应用。
在涉及二元分类问题的文献中,召回一词的使用更为频繁。
“敏感性和特异性是二元分类测试性能的统计测量,在统计学中也称为分类函数,广泛用于医学:
灵敏度测量被正确识别的实际阳性的比例。
特异性(也称为真阴性率)衡量被正确识别为真阴性的比例(例如,被正确识别为没有患病的健康人的百分比)。⁵
FPR — 假阳性率(或误报率)是某一特定检验错误拒绝零假设的概率。
FNR —假阴性率是指在测试中产生阴性测试结果的阳性比例,即,假设正在寻找的条件存在,阴性测试结果的条件概率。
在统计假设检验中,这个分数用字母β表示。测试的“功率”(或“灵敏度”)等于 1β。
组合费率*
https://en.wikipedia.org/wiki/Confusion_matrix
不要与似然比测试混淆。
LR (+ -) 似然比:用于评估执行诊断测试的价值。⁶
or—诊断优势比是对诊断测试⁷有效性的一种衡量
二元分类—表 2.2
https://kreilabs.com/wp-content/uploads/2019/12/Metrics_table.pdf
从用于表 1 的 matrix_metrix 函数中,我们还获得了该表 2 的值:
F1 分数
在二进制分类的统计分析中, F1 得分(也称为 F 得分或 F 度量)是测试准确度的度量。它同时考虑了测试的精度 p 和召回率 r 来计算分数: p 是正确阳性结果的数量除以分类器返回的所有阳性结果的数量, r 是正确阳性结果的数量除以所有相关样本(所有本应被识别为阳性的样本)的数量。F1 分数是精确度和召回率的调和平均值,其中 F1 分数在 1 时达到其最佳值(完美的精确度和召回率),在 0 时最差。⁸
f-贝塔 Score⁹
β是用于分数分析的参数,如果我们使用β等于 1,我们就有调和平均值;然后我们有了 F1 的分数 :
我们可以采取一些经验法则:
- 为了给精度更多的权重,我们必须在 0–10<Beta<1之间选择一个 Beta 值
- 为了给回忆更多的权重,我们在区间1<Beta<+无穷大* 中挑选一个 Beta 值*
ROC 对比精确召回和 AUC ⁰
我们可以在中找到一篇关于这些工具的概念和实现的优秀且非常完整的文章。
ROC —接收操作特性
它是针对 0.0 和 1.0 之间的多个不同候选阈值的假阳性率(x 轴)与真阳性率(y 轴)的关系图。换句话说,它绘制了虚警率与命中率的关系图。
精确召回曲线
精确度-召回率曲线是不同阈值的精确度(y 轴)和召回率(x 轴)的曲线图,很像 ROC 曲线。无技能分类器是一种不能区分类别的分类器,它在所有情况下都会预测随机类别或恒定类别。无技能线的变化是基于积极类和消极类的分布。它是一条水平线,带有数据集中阳性案例的比率值。对于平衡数据集,这是 0.5。
AUC —曲线下面积
曲线下面积(AUC)可用作模型技巧的总结。
我们基于上述文章编写了以下代码
*#ROC Implementation
from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score
from matplotlib import pyplotfpr, tpr, thresholds = roc_curve(real_values, prob_values)
auc = roc_auc_score(real_values, prob_values)
print('AUC: %.3f' % auc)pyplot.plot(fpr, tpr, linestyle='--', label='Roc curve')
pyplot.xlabel('False Positive Rate')
pyplot.ylabel('True Positive Rate')
pyplot.legend()pyplot.show()*
*#Precision-recall implementationprecision, recall, thresholds = sklearn.metrics.precision_recall_curve(real_values,prob_values)pyplot.plot(recall, precision, linestyle='--', label='Precision versus Recall')
pyplot.xlabel('Recall')
pyplot.ylabel('Precision')
pyplot.legend()pyplot.show()*
Sklearn 的其他实现和指标
这里有一个简单快速的关于二元分类值的报告
这里有一个直接从 sklearn 获取许多指标函数:
*def sk_metrix(real_values,pred_values,beta):
Accuracy = round( sklearn.metrics.accuracy_score(real_values,pred_values) ,4)
Precision = round( sklearn.metrics.precision_score(real_values,pred_values),4 )
Recall = round( sklearn.metrics.recall_score(real_values,pred_values),4 ) F1 = round ( sklearn.metrics.f1_score(real_values,pred_values),4)
FBeta = round ( sklearn.metrics.fbeta_score(real_values,pred_values,beta) ,4) MCC = round ( sklearn.metrics.matthews_corrcoef(real_values,pred_values) ,4) Hamming = round ( sklearn.metrics.hamming_loss(real_values,pred_values) ,4) Jaccard = round ( sklearn.metrics.jaccard_score(real_values,pred_values) ,4) Prec_Avg = round ( sklearn.metrics.average_precision_score(real_values,pred_values) ,4) Accu_Avg = round ( sklearn.metrics.balanced_accuracy_score(real_values,pred_values) ,4) mat_met = pd.DataFrame({
'Metric': ['Accuracy','Precision','Recall','F1','FBeta','MCC','Hamming','Jaccard','Precision_Avg','Accuracy_Avg'],
'Value': [Accuracy,Precision,Recall,F1,FBeta,MCC,Hamming,Jaccard,Prec_Avg,Accu_Avg]}) return (mat_met)*
调用 sk_metrix 函数
*sk_met = sk_metrix(real_values,pred_values,beta)*
摘要
混淆矩阵中产生的指标数量非常大,根据用例来细化每个指标的使用可能很难涵盖。最常见的指标可能是 F1 评分、ROC、精确回忆 AUC、患病率和敏感性。
这一系列文章旨在创建一个表格,在该表格中可以快速找到每个案例研究中使用的大多数指标的指南;掌握它们的应用超出了我们的范围,似乎也相当困难。
记住表格可以下载成 pdf 格式。
在下一篇文章中,我们将在表 2.3 中看到更多的分类指标和推荐系统的具体指标
参考
https://en.wikipedia.org/wiki/Confusion_matrix
[1]第一类错误
[2]第二类错误
[3]https://medium . com/Mercado libre-datablog/cost-sensitive-class-in-fraud-prevention-263170 D8 fcfe
【4】阳性和阴性预测值(分别为 PPV 和 NPV )分别为统计和诊断测试中阳性和阴性结果的比例,分别为真阳性和真阴性结果。【1】“PPV 和 NPV 描述了诊断测试或其他统计测量的性能。高结果可以被解释为表明这种统计的准确性。PPV 和 NPV 不是测试固有的;它们也取决于流行程度。【2】使用贝叶斯定理可以推导出 PPV。虽然有时用作同义词,但是阳性预测值通常是指由对照组建立的,而测试后概率是指个体的概率。然而,如果个体的目标状况的预测试概率与用于建立阳性预测值的对照组中的患病率相同,则两者在数值上相等。
(https://en . Wikipedia . org/wiki/Positive _ and _ negative _ predictive _ values)
https://en.wikipedia.org/wiki/Sensitivity_and_specificity
[7]https://en.wikipedia.org/wiki/Diagnostic_odds_ratio
[8]https://en.wikipedia.org/wiki/F1_score
[9]http://www . marcelonet . com/snippets/machine-learning/evaluation-metrix/f-beta-score
用于评估机器学习分类模型的度量
Photo by Chris Liverani on Unsplash
在机器学习领域,有三种主要的问题:回归、分类和聚类。根据您正在处理的问题的类型,您将希望使用一组特定的指标来衡量您的模型的性能。这可以用一个例子来很好地说明。假设一家公司声称已经开发出面部检测算法,可以以 99.9%的准确率识别恐怖分子。抛开道德影响不谈,这应该会立即引发一个危险信号。恐怖分子只占人口的很小一部分(我找不到实际的统计数据,但我们假设是 0.001%)。因此,通过假设没有人是恐怖分子(即编写一个始终返回 false 的程序),我们可以达到 99.9%以上的准确率。因此,准确性不是评估模型性能的好指标,因为它错误地将每个恐怖分子分类,但仍然获得了很高的分数。
混淆矩阵
另一方面,混淆矩阵将区分被正确分类为非恐怖分子的样本数量和被正确分类为恐怖分子的样本数量。混淆矩阵被分成 4 个象限。
https://commons.wikimedia.org/wiki/File:Binary_confusion_matrix.jpg
真阳性:
解读:你预测的是正的,这是真的。
你预测那个人是恐怖分子,他们确实是。
真阴性:
解读:你预测的是负数,这是真的。
你预测那个人不是恐怖分子,而他们实际上不是。
假阳性:(1 型错误)
解读:你预测的是正的,是假的。
你预测那个人是恐怖分子,但他们实际上不是。
假阴性:(2 型错误)
解读:你预测的是负数,这是假的。
你预测那个人不是恐怖分子,但他们确实是。
精确度/召回率
有时,使用数字来评估模型的性能比依赖库来可视化混乱矩阵更容易。
在现实世界中,你会遇到分类问题,分界线迫使你在高精度和高召回率之间做出选择。在某些情况下,精度越高越好。例如,诊断中出现一些假阳性可能会更好,而不是让任何真正患有疾病的人从裂缝中溜走,逃避治疗。其他时候,最好有更高的召回率,就像垃圾邮件过滤器一样。在用户的收件箱里放几封垃圾邮件比把重要的邮件归类为垃圾邮件更容易被接受。为了形成更好的判断,我们可以用图形来表示精确度和召回率之间的权衡。
https://commons.wikimedia.org/wiki/File:ROCCurve.png
如果我们可以使用一个单一的分数,而不是每次都测量召回率和精确度,这将会更容易。首先,我们可以试着取两个结果的平均值。例如,假设一个垃圾邮件检测器的准确率为 80%,召回率为 37%,那么平均准确率为 58.5%。现在,假设我们构建了垃圾邮件检测器,它不会将任何电子邮件视为垃圾邮件(类似于恐怖分子的例子)。如果非垃圾邮件明显多于垃圾邮件,我们的模型将被解释为性能良好。具体来说,如果 300,000 封电子邮件是垃圾邮件(不是垃圾邮件), 500 封是垃圾邮件,那么将所有电子邮件分类为垃圾邮件的模型将获得 100%的精确度,因为它正确地分类了所有垃圾邮件,并且召回率为 0%,因为它错误地分类了所有垃圾邮件。如果我们取平均值,我们仍然会得到 50%,这有点误导,因为垃圾邮件检测器的整个目的是检测垃圾邮件。
正是由于上述原因,我们使用调和平均值而不是算术平均值来计算平均值。调和平均值总是更接近较小的数,而不是较大的数。
回到我们的垃圾邮件检测器的例子。如果精度等于 100%,召回率等于 0%,则调和平均值等于 0%。我们把这个值叫做 F1 分数。
ROC / AUC
类似于精确度/召回率曲线,接收器操作者特征(ROC)图提供了一种优雅的方式来呈现在不同阈值下产生的多个混淆矩阵。ROC 绘制了真阳性率和假阳性率之间的关系。
- 真阳性率=召回率=灵敏度=真阳性/(真阳性+假阴性)
- 假阳性率= 1–特异性=假阳性/(假阳性+真阴性)
https://en.wikipedia.org/wiki/File:Basic_AUC_annotated.png
值得注意的是,假阳性率是 1 减去特异性,这意味着假阳性率越接近 0,特异性就越高(回忆)。因此,为了获得特异性和敏感性的最佳值,我们需要选择左上角的一个点。
另一方面,曲线下面积(AUC)使得将一条 ROC 曲线与另一条进行比较变得容易。例如,红色 ROC 曲线的 AUC 大于蓝色 ROC 曲线的 AUC。因此,对于相同量的特异性,与红色曲线相关的模型实现了更高的灵敏度。
https://commons.wikimedia.org/wiki/File:ROC_curve.svg
密码
在前面的例子中,我们将看一下前面所有正在运行的指标。
import pandas as pd
from matplotlib import pyplot as plt
plt.style.use('dark_background')
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import roc_curve
from sklearn.metrics import auc
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score
from sklearn.metrics import average_precision_score
from inspect import signature
为简单起见,我们将使用 sklearn 提供的一个数据集。
breast_cancer = load_breast_cancer()X = pd.DataFrame(breast_cancer.data, columns=breast_cancer.feature_names)y = pd.Categorical.from_codes(breast_cancer.target, breast_cancer.target_names)encoder = LabelEncoder()y = pd.Series(encoder.fit_transform(y))
这些指标将用于衡量我们的模型做出的预测与测试集中包含的样本之间的差异。
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
我们将使用随机森林分类器,但任何分类算法都可以。
rf = RandomForestClassifier()rf.fit(X_train, y_train)
我们称 predict_proba 方法 r 而不是 predict 以获得一个概率列表,该列表表示样本属于给定类别的可能性。这类似于深度学习中常用的 softmax 激活函数。
probs = rf.predict_proba(X_test)
roc_curve
方法需要一个单一的特征。因此,我们采用肿瘤是恶性的预测概率。
malignant_probs = probs[:,1]fpr, tpr, thresholds = roc_curve(y_test, malignant_probs)roc_auc = auc(fpr, tpr)
在这个例子中很难看到,但我们通常会选择左上角的一个点,它将产生最佳的灵敏度和特异性。AUC 为 0.98 意味着在特异性和敏感性之间几乎没有权衡。
plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, 'y', label = 'AUC = %0.2f' % roc_auc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()
接下来,让我们看看其他一些指标来评估我们模型的性能。首先,我们使用我们的模型根据上一步的概率对数据进行分类。
y_pred = rf.predict(X_test)
快速提醒一下,precision 测量的是真阳性,而不是真阳性加上假阳性。
precision_score(y_test, y_pred)
召回衡量的是真阳性与真阳性和假阴性之比。
recall_score(y_test, y_pred)
F1 分数使用调和平均值结合了精确度和召回率。
f1_score(y_test, y_pred)
选择对应于右上角的阈值数量将导致精确度和召回率的最佳组合。
precision, recall, threshold = precision_recall_curve(y_test, y_pred)
average_precision = average_precision_score(y_test, y_pred)step_kwargs = ({'step': 'post'} if 'step' in signature(plt.fill_between).parameters else {})
plt.step(recall, precision, color='r', alpha=0.2, where='post')
plt.fill_between(recall, precision, alpha=0.2, color='r', **step_kwargs)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.ylim([0.0, 1.0])
plt.xlim([0.0, 1.0])
plt.title('2-class Precision-Recall curve: AP={0:0.2f}'.format(average_precision))
最后的想法
我们用来评估模型性能的度量标准的选择取决于问题的性质。对于分类模型,我们可以使用精度、召回率、f1 得分或 ROC 曲线来衡量性能。
不平衡分类的度量
数据科学中的指标概念极其重要。如果你不知道如何正确评估当前的结果,你也无法提高它们。对度量的错误理解也会导致对模型容量的错误估计和对问题状态的错误理解。当前的故事将揭示分类问题的流行度量的本质。所有讨论的指标都将在 NumPy 中实现,以满足他们的需求。讨论的指标列表包括:精确度、召回率、F1、MCC 和 ROC-AUC
问题定式化
分类问题将是两个 MNIST 数字 0 和 6 之间的二进制分类,因为它们非常相似,很难区分它们本身。考虑到 metrics 的目的是深入了解不平衡分类问题,让阳性类别(6 位数)占少数,更具体地说,阳性样本总数将是阴性样本的 30%左右。我们正在使用的模型是基本的逻辑回归。以下代码片段的完整源代码可以在 github 找到。
流行指标
衡量分类的一个非常简单的标准是基本准确性,即正确预测与数据集中样本总数的比率。然而,在不平衡类的情况下,这种度量可能是误导性的,因为高度量不能显示少数类的预测能力。您可能有 99%的准确率,但对您真正感兴趣的类的预测能力仍然很差(即异常检测,其中异常是数据集中罕见的类)。为了更好地理解当前模型的预测能力,让我们从待分类样本的四种可能情况开始
- 真阳性(TP)—样本的标签为阳性,且被归类为阳性
- 真阴性(TN) —样本的标签为阴性,且被归类为阴性
- 假阳性(FP)—样本标签为阴性。,但它被归类为阳性
- 假阴性(FN)—样本标签已贴上。,但它被归类为否定的
基于这四个量,我们可以导出不平衡类的以下度量
真阳性率(也有灵敏度或召回)
召回指标显示了选择了多少相关样本,这意味着我们的模型可以预测我们数据集中所有感兴趣的样本。
假阳性率(也称脱落)
精度
精度指标告诉我们有多少预测样本是相关的,即如果样本不正确,我们将样本分类为正确样本的错误。
真阴性率(也称特异性)
F1-得分
F1 指标是精度和召回率的调和平均值,计算如下
对于不平衡的分类场景,这个度量是一个很好的选择。F1 的取值范围在[0,1]内,其中 1 为完美分类,0 为完全失败。
MCC (马修斯相关系数)
对于不平衡分类,mcc 是非常好的度量,即使类的大小相差很大,也可以安全地使用
其范围在 1 和 1 之间,其中 1 分表示完美预测,0 分表示随机预测,1 分表示预测分数和真实标签值之间完全不一致。
ROC-AUC 为二元分类
ROC 指标的性质和上面列出的简化形式将在下一节详细介绍。
尽管很难一下子快速理解上述公式。让我们先在 NumPy 中实现它们。 y_true 会是一个带有二进制真标签的 numpy 数组, y_score 也是带有二进制标签的 numpy 数组,但是预测的。
现在让我们实现一些基本的模型,例如逻辑回归(我将使用 PyTorch 中实现的一个)并在不平衡数据集上训练它(正类占少数)。将对来自 MNIST 数据集的 0 和 6 位数字进行训练(0 是负类,6 是正类,即“1”,与负类相比,仅由 30%的正类样本组成)。
我故意选择了导致不完美训练结果的参数,得到了 77%的准确率
77%的单一值是一个相当模糊的结果,所以让我们对计算的分数运行 show_metrics 函数
现在,我们有了更多关于获得的性能的信息。真正例子的数量相当少,因为它们是少数,模型很难识别它们。假阳性的数量等于 0,这意味着如果单个负类不是正类,则该模型不将其分类为正类,因此我们可以说,如果该模型预测属于正类,则它是完全确定的。真阴性的数量很大,因此假阴性的数量也很大,这意味着大多数看到的样本被预测为阴性样本。原因是我们的数据集主要由阴性样本组成,评估阶段相应的阳性/阴性标签比例也是如此。召回我们的预测是 0.02,这意味着模型选择阳性类别非常糟糕(大多数真正的阳性类别没有被正确预测)。另一方面,精度等于 1.0,这意味着被分类为阳性的所有样本确实是阳性的。 F1 指标很低,这意味着模型对阳性和阴性样本的区分很差, mcc 也是如此。
ROC-AUC
ROC 代表接收器工作特性,最初被设计为区分噪声和非噪声的度量。ROC 是通过绘制真阳性率(在 y 轴上)对假阳性率(在 x 轴上)的分数来创建的。ROC-AUC 度量显示由 ROC 曲线获得的曲线下面积。我们如何准确地获得 ROC 曲线?让我们假设二进制分类模型输出范围为[0,1]的真实值,其可以被解释为样本为正的概率。我们可以说,如果模型的输出大于 0.5,那么样本就是正的,但是 0.5 并不是类阈值的唯一选择。例如,如果大部分样本是负的,那么模型将倾向于预测比正样本更多的负样本,并且输出将偏向左侧。因此,我们可以将阈值向左移动,并获得少数类预测的正确估计值(假设如果模型输出得分≥ 0.4,则已经令人印象深刻,并且样本可以被视为阳性)。ROC 曲线是通过将阈值从 0 移动到 1 来获得的,并且用于获取 TPR 和 FPR,考虑到所有预测≥阈值被视为阳性样本。阈值通常等于预测中的唯一值。让我们用 numpy 手工实现这个简单的算法
结果曲线为
来自上述实施例的 ROC-AUC 度量是 0.979。ROC-AUC 度量可以在[0,1]的范围内变化,其中 1 分表示分类器具有完美的预测能力并且从不出错,0.5 分完全是随机猜测,低于 0.5 分意味着如果我们颠倒结果(将 0 的预测变为 1,反之亦然),我们实际上得到比现在更好的模型。在输出 0 和 1 标签而不是连续分数的二元分类器的情况下,我们不能移动我们的阈值,因此在图上只有一个点(单对获得的值 TFR 和 FPR)。在这种情况下,ROC-AUC 可以直接计算为两个三角形的面积,这样的公式我们在上一节已经看到过。
结论
作为结论,我建议只有在职业完全平衡的情况下才使用准确度,否则使用 F1 和 MCC。通过精确度和召回率来查看正面和负面评估比率也是有用的。
机器学习中的性能度量
在本文中,我提供了几个用于评估模拟某些行为的模型性能的指标的简要概述。这些指标将模拟输出与一些实际情况进行比较。
分布比较
詹森-香农散度
詹森-香农散度(JSD)测量两个分布(即地面真实和模拟)之间的相似性。描述这一指标的另一种方式是两个分布之间的差异量。
JSD 是库勒贝克-利布勒散度的对称化和平滑版本,或 D(p,q) ,它描述了概率分布 p 和 q 之间的散度。需要注意的一点是 D 并不是对称的,因为 D(p,q) 不等于 D(q,p) 。
假设我们有一个样本 x ,我们想要测量 x 出现在真实分布 p 而不是模拟分布 q 中的可能性。似然比(LR)将对此进行测量:
LR>1 表示 p(x) 更有可能,LR < 1 表示 q(x) 更有可能。现在,为了获得数据集 *x,*的总体比率,我们取每个样本的乘积:
我们采用对数比来改进计算:
其中 log(LR) 值> 0 表示 p(x) 更好地拟合,而值> 0 表示 q(x) 更好地拟合数据。使用该值,我们可以更好地量化一个模型优于另一个模型的程度,方法是回答如果从 *p(x)进行采样,每个样本平均会在多大程度上表明 p(x) 比 q(x) 更好地描述数据。*这也叫它的预测能力。
如果假设 N 接近无穷大,那么我们得到期望值:
JSD 通过以下方式对此进行对称和平滑处理:
科尔莫戈罗夫-斯米尔诺夫试验
Kolmogorov-Smirnov 检验(KS 检验)是两个连续的一维概率分布相等的非参数检验,其检验统计量量化了两个分布之间的距离。如果 KS 统计值高或 p 值低,则支持两个分布相同的假设。
第一步是对样本中的测量值进行排序,然后计算累积概率 S(x) ,即所有测量值小于 x 的分数。在这种情况下,S(x1 )= 0,S(xn ) = 1。给定累积分布函数 S(x) 的 Kolmogorov–Smirnov 统计量是两个累积概率之间的最大绝对差值:
如果样本来自 S(x) ,那么当 n 趋于无穷大时 Dn 收敛到 0。计算出统计数据后,您可以参考适当的 Kolmogorov-Smirnov 表,并根据您的样本大小找到临界值,其中如果 D 大于临界值,则零假设被拒绝。
非参数检验与参数检验
非参数测试不假设数据集遵循特定的分布,而参数测试需要某些假设。然而,非参数检验要求数据集中的不同组具有相同的可变性/分散性。参数测试在以下方面表现良好:
- 当分布是偏斜的和非正态的。
- 当每个组的传播不同时。
- 当您需要更强大的统计能力时。
当您想要评估中位数超过平均值时,非参数检验表现良好。参数检验可以检测出由于尾部变化而引起的偏态分布均值的变化。非参数分析关注的是相对不受尾部变化影响的中位数。
一对一的比较
均方根误差
均方根误差(RMSE)是模拟预测值与地面真实值之间差异的测量值。主要用于回归,标量值。计算 RMSE 的第一步是通过实际值减去预测值来计算残差。
下一步是对这些残差的平方求平均值,然后对该平均值求平方根。平方然后平方根的目的是去除负值。
决定系数(R 平方)
决定系数(R 平方)量化了与没有独立变量的基线模型相比,模拟的好坏程度,基线模型总是预测 y 的期望值。主要用于回归,即预测值与实际值之间的一对一比较。
R-squared 是介于 0 和 1 之间的任何值,其中越接近 1 的值表示模型所占的方差比例越大。对于不包含常数项的方程,有可能得到负的$R $表示拟合实际上比仅拟合一条水平线更差。如果该值低于 0,则不能解释为相关的平方,这很好地表明应该将常数项添加到模型中。
应用中的一个例子是,让我们假设 R 平方=93%,那么地面真实数据中 93%的变化可以通过我们的模拟来解释。
序列比较
动态时间扭曲
动态时间弯曲(DTW) [2]是时间序列分析中两个时间序列相似程度的度量。DTW 寻找两个序列之间的最佳对齐,而不是查看每个时间序列上两点之间的欧几里德距离。
我们首先计算时间序列 1 (A)和时间序列 2 (B)之间的距离矩阵。该矩阵在纵轴上为一个时间序列绘制了点,在横轴上为另一个时间序列绘制了点。然后,我们基于这些值和选定的距离度量 D(通常为欧几里德距离)来计算距离:
Distance matrrix( from Regina J. Meszlnyi, Petra Hermann, Krisztian Buza, Viktor G and Zoltn Vidnynszky 2017) [1]
在计算出距离矩阵之后,你通过回溯和贪婪搜索来构造弯曲路径,或者弯曲路径 W=(w_1,w_2,…,w_n)以最小化距离。使用扭曲路径,您可以通过对路径内的距离求和来获得距离值:
距离越小,时间序列越相似。
秩偏重叠
分级偏置重叠(RBO) [3]通过计算不同深度的重叠来测量可能包含或不包含相同项目的无限分级列表之间的相似性,通过使用几何级数(一种收敛级数)来界定这些深度的平均重叠。RBO 在 0 到 1 的范围内,其中 0 表示最大不相交,1 表示相同。
可以证明几何级数的不定和是有限的,由下式给出:
几何级数是一组项,其中连续项之间有一个恒定的比率。一个例子是:
几何级数的使用允许我们明确地模拟用户的行为,因为几何级数中的值随着深度的增加而减少,允许你模拟从给定的排名位置 i 到 i +1 的可能性。
参考
[1]里贾纳·梅兹莱尼、佩特拉·赫尔曼、克里斯提安·布扎、维克托·加尔和 Zoltan·维德尼扬斯基。使用动态时间弯曲的静息态 fMRI 功能连接性分析。神经科学前沿,11(2 月):1{17,2017。
[2]斯坦萨尔瓦多和陈欣健。FastDTW:在线性时间和空间中实现精确的动态时间扭曲。智能数据分析,11:561{580,2007。
[3]威廉·韦伯、阿利斯泰尔·莫阿特和贾斯汀·佐贝尔。不确定排序的相似性度量。美国计算机学会信息系统汇刊,28(4):1{38,2010。
评估您的语义细分模型的指标
您如何知道您的细分模型表现良好?在这里找到答案。
Illustration of IoU and Dice Coefficient.
放射分割。我最喜欢的任务。我会做一个深度学习模型,让它变得更好,更训练有素…但是等等。我如何知道我的模型表现良好?换句话说,语义分割最常见的度量标准是什么?这里有一个关于基本指标的简明指南,你需要知道这些指标以确保你的模型表现良好。我还在下面包含了 Keras 实现。
如果你想了解更多关于深度学习的语义分割,请查看 George Seif 的这篇中型文章。
指南和代码
towardsdatascience.com](/semantic-segmentation-with-deep-learning-a-guide-and-code-e52fc8958823)
内容:
- 像素精度
- 并集上的交集(雅克卡指数)
- 骰子系数(F1 分数)
- 结论、注释、总结
1.像素精度
像素精度也许是概念上最容易理解的。它是图像中被正确分类的像素的百分比。
虽然很容易理解,但这绝不是最好的指标。
乍一看,可能很难看出这个指标的问题。为了揭示这个指标的真实情况,这里有一个场景:假设您通过您的分割模型运行了下面的图像(左)。右边的图像是基础事实,或注释(模型应该分割的内容)。在这种情况下,我们的模型试图在卫星图像中分割船只。
Image from Vlad Shmyhlo in article: Image Segmentation: Kaggle experience (Part 1 of 2) in TDS
你看你的分割准确率 95% 。太棒了。让我们看看你的分段是什么样子的!
不完全是你所希望的,嗯。我们的计算有问题吗?没有。完全正确。只是有一节课是原图的 95%。因此,如果模型将所有像素分类为该类别,则 95%的像素被准确分类,而另外 5%的像素没有被准确分类。因此,尽管你的准确率高达 95%,但你的模型返回的是一个完全无用的预测。这是为了说明高像素精度并不总是意味着优越的分割能力。
这个问题叫做阶层失衡。当我们的类极度不平衡时,意味着一个类或一些类在图像中占主导地位,而其他一些类只占图像的一小部分。不幸的是,类不平衡在许多真实世界的数据集中普遍存在,因此它不能被忽略。因此,我向您展示了两个更好地处理这个问题的替代指标:
2.并集交(IoU,Jaccard 索引)
交集-并集(IoU),也称为 Jaccard 指数,是语义分割中最常用的指标之一,这是有充分理由的。欠条是一个非常简单的指标,非常有效。
IoU calculation visualized. Source: Wikipedia
在阅读下面的陈述之前,先看看左边的图片。简单地说, IoU 是预测分割和实际情况之间的重叠面积除以预测分割和实际情况之间的联合面积,如左图所示。该指标的范围为 0–1(0–100%),0 表示没有重叠,1 表示完全重叠的分段。
对于二值化(两类)或多类分割,图像的平均 IoU 是通过取每一类的 IoU 并对它们进行平均来计算的。(在代码中实现略有不同)。
现在,让我们通过使用与第 1 节相同的场景来尝试理解为什么这个度量比像素精度更好。为了简单起见,让我们假设所有的船(彩色盒子)都属于同一个类。
但是等等,在我们的语境中重叠和联合到底是什么?上图展示了一幅非常清晰的画面,但我发现在预测与事实的背景下有点难以理解,因为它们不一定像上图描绘的那样重叠。让我们一起来看看预测的分割和地面的真相。
Predicted segmentation (Left) Ground truth annotation (Right)
先算船欠条吧。我们假设图像的总面积是 100 (100 像素)。首先,让我们考虑一下船只的重叠部分。我们可以假设我们将预测的分割(左)直接移动到地面真实(右)的上方,并查看是否有任何船像素重叠。因为没有像素被模型分类为船只,所以有 0 个重叠的船只像素。
Union 包括从两幅图像中被分类为船只的所有像素,减去重叠/交叉。在这种情况下,有 5 个像素(这是一个任意的数字选择)被分类为船只总数。减去为 0 的重叠/相交,得到 5 作为并集的面积。经过计算,我们得知欠条仅仅是 47.5%!参见下面的计算。
详细计算如下:
船只:重叠面积= 0,联合面积= (5+0)-0 =5
重叠面积/联合面积= 0%
现在对于黑色背景,我们做同样的事情。
背景:重叠面积= 95,联合面积=(95+100)-95 = 100
重叠面积/联合面积=95%
*均值 IoU =(船只+背景)/2 =(0%+95%)/2 =*47.5%
哇哦。这比我们计算的 95%的像素精度低了很多。很明显,47.5 是我们细分成功的更好的指标,或者更恰当地说,是缺乏成功的指标。
下面是我在自己的项目中使用的一个很好的 Keras 实现:
from keras import backend as Kdef iou_coef(y_true, y_pred, smooth=1):
intersection = K.sum(K.abs(y_true * y_pred), axis=[1,2,3])
union = K.sum(y_true,[1,2,3])+K.sum(y_pred,[1,2,3])-intersection
iou = K.mean((intersection + smooth) / (union + smooth), axis=0)
return iou
y_true 和 y_pred 都是mxrxcxn其中 m 是图像的数量,r 是行数,c 是列数,n 是类数。
3.骰子系数(F1 分数)
简单地说,骰子系数是 2 *重叠面积除以两幅图像中的总像素数。(参见第 2 节中对联合区域的解释)。
Illustration of Dice Coefficient. 2xOverlap/Total number of pixels
因此,对于 1 和 2 中使用的相同场景,我们将执行以下计算:
两幅图像的总像素数合计= 200
船舶:重叠面积= 0
*(2 重叠面积)/(总像素组合)= 0/200 = 0
背景:重叠面积= 95
(2 重叠面积)/(总像素组合)= 952/200 = 0.95
*骰子=(船只+背景)/2 =(0%+95%)/2 =*47.5%
在这种情况下,我们得到了与借据相同的值,但情况不会总是这样。
骰子系数与借据非常相似。它们是正相关的,这意味着如果一个人说模型 A 在分割图像方面比模型 B 好,那么另一个人也会这么说。像欠条一样,它们的范围都是从 0 到 1,1 表示预测和真实之间的最大相似度。
为了更好的理解它们之间的区别,我推荐阅读下面的栈交换答案:
[## f1/骰子得分与借据
begingroup $你的思路是正确的。有几件事很快就发生了。根据这两个指标的定义,我们…
stats.stackexchange.com](https://stats.stackexchange.com/a/276144)
下面是 Dice 系数的一个实现,输入条件与第 2 节中指定的相同:
def dice_coef(y_true, y_pred, smooth=1):
intersection = K.sum(y_true * y_pred, axis=[1,2,3])
union = K.sum(y_true, axis=[1,2,3]) + K.sum(y_pred, axis=[1,2,3])
dice = K.mean((2\. * intersection + smooth)/(union + smooth), axis=0)
return dice
4.结论、注释、总结
总之,语义分割最常用的指标是 IoU 和 Dice 系数。我已经在 Keras 中包含了代码实现,并将在下一篇文章中更深入地解释它们。
正如你们中的一些人可能已经注意到的,我故意排除了关于真阳性、真阴性、假阳性和假阴性的讨论和解释。虽然很重要,但我认为它们混淆了我在本文中试图强调的对这些指标的清晰概念理解。
我希望这篇文章能让你对每个指标有更深入的了解,这样你就可以在实现过程中或阅读文献时有更深的理解。
用简单的英语理解回归模型的基本度量
ML 概念解释
数据科学访谈期望对这些指标有直观的理解
Photo by Volkan Olmez on Unsplash
很容易记住这样的规则,比如 RMSE 和梅的值应该低,R 的平方和其他味道的 R 的平方值应该高。但是,数据科学面试对候选人的期望并不高。他们不会问你 R 平方值是 0.6 还是 0.7 更好。人们可能会问这样的问题,比如您将使用哪些指标来评估回归模型,以及为什么要使用那个指标?此外,如果你的角色就像公司里的分析翻译,你可能需要用简单的方式向企业解释复杂的概念。所以,这篇文章是关于直观地解释它们,而不是提供代码。很容易从 sci-kit 学习文档或 Stackoverflow 中找到关于如何计算这些分数的代码块。
让我们考虑一个由 11 个观测值(n)创建的简单线性回归模型,这是一个非常少的例子,但应该足以证明这一点。这些观察值用橙色点表示,线性回归方程或最佳拟合线用绿色表示。
Fig 1. Simple Linear Regression Example
从图 1 我们可以说,线性回归模型并不完美。直线上有四个点,其他点在任一方向上远离直线。橙色点是 y 的实际值,而蓝色箭头在回归线上的起点是预测ŷ.
平均绝对误差
如果我们考虑所有的橙色点,并计算预测与实际相差多少,我们会得到该点的误差值。这就是 y 和ŷ.的区别为了计算 MAE,
- 取 11 个可用观测值中每一个的 y 和ŷ的绝对差值:⎮yᵢ-ŷᵢ⎮其中 i ϵ [1,数据集中的总点数]。
- 对每个绝对差值求和,得到总误差:σ⎮yᵢ-ŷᵢ⎮
- 将总和除以观察总数,得到平均误差值:σ⎮yᵢ-ŷᵢ⎮/n
梅=σ⎮yᵢ-ŷᵢ⎮/n
每次观察都会产生误差值,误差值可以是任意整数。它可以是零、负数或正数。如果我们简单地将这些误差值相加,得出总误差,我们可能会得到一个不能给出真实性能的数字。
很少的正值会导致误差增大,而很少的负值会导致误差减小,最终导致统计数据不能指示模型性能。所以,我们只考虑实际值和预测值的差异。
注:还有 平均偏差误差 是将所有误差值相加,不取绝对值。我个人没用过,所以我在跳绳。
均方误差
如何计算 MSE?
- 取 11 个可用观测值中 y 和ŷ的差值:yᵢ-ŷᵢ
- 平方每个差值:(yᵢ-ŷᵢ)
- 平方和值:σ(yᵢ-ŷᵢ)其中 i ϵ [1,数据集中的总点数]
- 除以观察总数:σ(yᵢ-ŷᵢ)/n
MSE =σ(yᵢ-ŷᵢ)/n
这四个步骤应该会给出该模型的 MSE。但是,我们为什么要消除差异呢?
假设你有两个基于 1000 个例子创建的模型。对于这两个模型,您计算了 MAE,发现完全相同。但是模型之间有一个很明显的差异。一个模型的每个观测值都有一个微小的误差值,而另一个模型有一个极端的误差情况,误差值要么非常高,要么非常低。现在哪款比较好?
如果你是房地产经纪人,想提供房子的估价,你可能希望你的估价有一点偏差,而不是非常准确或不准确。在这种情况下,惩罚较大幅度误差的模型将有助于我们选择合适的模型。我们可以通过计算 MSE 来实现。
通过对实际值和预测值之间的差值求平方,我们能够只考虑负的误差值并惩罚更高的误差值。假设有两个回归模型,误差值分别为-1,- 2,3,2(模型 A)和 1,-5,1.5,0.5(模型 B)。这两种模型的 MAE 都是 2。但是,MSE 将是 3.5 和 7.125。因为模型 B 有一个很大的误差(-5),它受到 MSE 的严重影响。
另一种解释 MSE 的方法是,误差值的方差(误差分布有多广)!
均方根误差
这基本上是 MSE 的平方根。继续使用上面的相同例子,3.5 和 7.125 MSE 将是 1.87 和 2.67 RMSE。唯一的区别是,RMSE 将与目标变量有相同的单位,而 MSE 有平方单位。因为 MSE 是误差值的方差,所以 RMSE 是误差的标准差。
均方根对数误差
在参加 Kaggle 比赛之前,我没有用过这个。当实际值和预测值的观测值都很大时,与其他较小的观测值相比,这对观测值的误差会很大。例如,你可能会遇到一个房地产数据集,其中有很好的组合,包括昂贵的豪宅、普通的房子和超便宜的快要散架的房子,比如这些房子。如果一个模型预测价值 100,000 美元的小公寓为 50,000 美元,那么它就差了很多,但如果同一模型预测豪宅的价格为 900,000 美元,而不是 850,000 美元,我们可以认为它很接近。相同的错误值$50k 在相同的数据集中既巨大又微不足道。因此,在这种情况下,为了避免造成误差的实际值和预测值之间相对较大的差异,我们使用 RMSLE
对数通常是用小得多的数量表示大数的一种方便方法。检查这个,10000 的对数值是 4,而 5000 的对数值是 3.6989。当回归模型的 y 和ŷ值变化很大时,较高的数量级会显著增加 RMSE、MSE 和 MAE 的误差。
计算 RMSLE :
- 获取预测+ 1 和实际+ 1 的对数值,并取二者之差,或者获取预测+ 1 和实际+ 1 之比的对数值:(log(yᵢ+ 1)—log(ŷᵢ+1))或 log((yᵢ+1)/(ŷᵢ+1))*(*注: 对于预测和实际,如果预测或实际为零,则加+1 以避免未定义的错误)
- 将每个值平方并求和:σ(log(yᵢ+1)-log(ŷᵢ+1))
- 取和的平方根得到 rmsle:√σ(log(yᵢ+1)-log(ŷᵢ+1))
它也可以被认为是考虑预测和实际之间的比例而不是差异的指标。如果 pred₁= 5 万美元,actual₁= 8 万美元,pred₂= 50 万美元,actual₂= 80 万美元。那么在这两种情况下,log ((P+1)/ (A+1))将是相同的。
这里我不打算用房地产的例子来简化计算。假设我们在同一个数据集上有两个不同回归模型的 y(实际值)和 Y^(Predicted 值,如下所示:
型号 A:
10,14,18,120,140,1,2
Y^: 十,十三,十八,一百,一百三十,一,二
型号 B:
Y : 10,14,18,120,140,1,2
Y^: 6,9,7,119,130,1.1,1
对于 y 和 Y^的这些值,模型 a 的 RMSE 是 10.217,而 RMSLE 是 0.0938,而模型 b 的 RMSE 是 7.25,而 RMSLE 是 0.4737。如果我们只拿 RMSE 来说,B 型可能看起来更好。但是,如果你只是浏览一下结果,很明显模型 A 表现得更好,RMSE 得分更高只是因为一个预测偏离了很多,这也是更高的量级。
考虑 RMSLE 的另一种方式是,当人们想要惩罚低估多于高估时,RMSLE 工作得很好。例如,模型 A 预测价值 80 万美元的房子为 60 万美元,而模型 B 预测同样的房价为 100 万美元。尽管这两个预测相差 20 万美元,但模型 A 的 RMSLE 值(0.2876)高于模型 B(0.2231),而 RMSE 值保持不变。
决定系数或 R 的平方
我们有 RMSE、MSE、MAE 等指标。通过比较几个模型或同一模型的几个不同版本的这些值,我们可以选择最佳模型。但是,在我们完成一个模型之后呢?所选择的模型适合数据吗?有改进的余地吗?我们可以用 R 平方值来回答这个问题。
回到房地产的例子,假设你有 1,000 行数据,这些数据具有不同的特征来决定一个地区的房价。你只有 10 秒钟来评估该地区一栋新房子的价值。最好的选择是什么?就拿那 1000 套房子的均价报出来,作为新房的估价。尽管这不是一个很好的预测,但很有可能它肯定比随机猜测的错误要少。这被称为基线模型或均值模型或与 x 轴平行的无关系线。因此,我们可以将其与我们更好的线性回归模型进行比较,看看这个模型有多好。这是 R 平方值给我们的。
因此,如果我们取用平均线计算的误差平方和(SSEM) 和用回归线计算的误差平方和(SSER)之间的差,我们就可以得到由于使用回归线而不是平均线而减少的误差量。该差值除以平均线的误差平方和给出了与平均线相比回归线减少的误差比例,基本上是 R 平方值!
R**=(SSEM—SSER)/(SSEM)= 1—(SSER/SSEM)**
该值始终在[0,1]之间。它也被解释为由模型解释的方差,因为 SSE 基本上是误差的方差,并且通过使用回归模型而不是均值模型,方差减少了一定的量,并且这种误差的减少是由模型“解释”或由模型解释的。
在下一篇文章中,我将谈论 调整的 R 平方,预测的 R 平方,残差图,变量的 P 值,回归系数。 敬请期待!
注:
您可能会看到一些等式的分母是 n-p,而不是 n,其中 p 是用于创建模型的独立变量的数量。根据我在在线零售行业的工作经验,这并不重要,因为通常 n >>> p,因此 n-p 倾向于 n。但是在遇到小样本的经典统计中,n 与 n-p 会产生显著的差异。但是为什么在经典统计中要用 n-p 或者自由度呢?这可能是一个潜在的博客帖子!
我喜欢用简单的方式解释复杂的概念。如果你有任何问题或者只是想联系,你可以在 Linkedin 上找到我或者发电子邮件到 manojraj.dobbali@gmail.com 找我。
另外,我推荐阅读 neptune.ai 的另一篇博文:https://Neptune . ai/blog/performance-metrics-in-machine-learning-complete-guide