部署的痛苦
部署焦虑的可能原因
本文与帕特里克·斯拉文伯格合著
The data science cycle in magnets: data access, data processing, model training, and deployment
2017 年 10 月,我在 ODSC 伦敦会议上经营 KNIME 展台。在展位上,我们有通常的会议材料要分发:信息丰富的文件,各种小工具,甚至瑞士巧克力。在这些小工具中,我们有磁铁,更具体地说,四种类型的磁铁代表数据分析抽象工作流中的抽象节点:读取、转换、分析,以及部署。这些磁铁很受欢迎。与会者会来玩它们,把它们组装成工作流程,或者把一些带回家放在冰箱里。
我记得大多数人被磁瓦吸引去分析,而同样的大多数人在部署前皱着眉头耸耸肩。我甚至清楚地记得一个与会者,当被提供展开瓷砖时,他退缩了,并开玩笑地(?)语气声明:“我不希望部署。身体上很痛”。我非常惊讶(我甚至发了一条关于这件事的微博)。一个据称花了相当多时间来构建和完善机器学习模型的数据科学家,怎么可能不想部署它们,将它们发布到现实世界中呢?那是因为部署确实是一件痛苦的事情!
The pain of deployment is all in this tweet
为什么部署这么难?这仅仅是对一些数据科学项目自然消亡的失望吗?还是真的有一些数据科学家无法克服的额外障碍?当然,我对这个话题有自己的看法,但我可能会因自己的态度和过去的经历而有所偏颇。因此,我和 Patrick Slavenburgh 在 LinkedIn 上询问了我们的同事关于数据科学项目中部署失败的最常见原因。本文旨在总结答案。
- 婴儿死亡率
众所周知,一个数据科学项目包括几个主要的标准阶段,例如在 CRISP-DM 循环中总结的:业务案例理解;数据探索;数据清理和数据准备;模型训练、模型优化和模型测试;最后,如果前几个阶段一切顺利,就部署。“如果一切顺利”的意思是:
- 如果我们清楚地理解了业务规范
- 如果数据质量对于我们的任务来说足够好
- 如果我们能够正确地清理和准备数据
- 如果我们训练、优化并测试了一个足够好的模型
如果所有这些都成功了,我们就可以开始部署了。
部署阶段位于食物链的末端。它收集该过程的前几个阶段产生的所有垃圾。也就是说,在部署阶段,所有先前创建的和未检测到的问题都可能出现,从而扼杀整个项目。这是部署失败的首要原因:婴儿死亡率。婴儿死亡是由于在之前的任何阶段中未被发现的深层问题。
例如,Kenneth Longo 报告称,对原始业务问题的误解是数据科学项目在部署过程中失败的最常见原因之一。肯尼斯这样描述这个问题:“机器学习模型最终回答的问题与最初的业务问题不一致,或者业务问题在开发过程中发生了变化。”
有时候,尽管尽了最大努力,模特的表现还是低于预期。在这种情况下,要么期望值太高(数据科学被当作魔术出售),要么用于训练模型的数据质量不够好(训练集可能太小和/或没有覆盖所有可能的事件)。有时在数据探索阶段可能会发现这个数据质量问题,例如一些统计数据探索,但有时这个问题会被忽略,直到部署前才变得清晰。
由于婴儿死亡率而导致的项目部署失败令人失望,但实际上这本身并不是部署失败。它只是发生在部署阶段。我不认为这是部署痛苦的原因,而是部署阶段令人失望的后期发现。
2。缺少 IT 技能
部署需要一些 IT 技能。无论您需要将最终结果写入数据库、计划每 X 小时执行一次作业、使用不同的连接参数从远程服务器运行应用程序,还是作为 REST 服务运行应用程序,您都需要 it 部门的帮助,至少需要获得服务器 URI 和访问资源的正确凭证。根据我的经验,这是部署的第二个阻碍因素:数据科学团队和 IT 部门之间缺少协作。
IT 部门的任务是保护数据。数据科学组的任务是访问相同的数据。这两个相反的任务可能不会促成最好的合作。
在这种情况下,如果数据科学团队中的一个团队获得了必要的 it 技能来与 IT 部门沟通,并负责来自该团队并进入生产的所有(部分)应用程序,例如在专用服务器上,这可能会有所帮助。
在需要极度保护原始数据的情况下,专用服务器可以托管数据科学应用程序的所有中间和最终结果,甚至可能是原始数据的副本。通过这种方式,一般 IT 和数据科学 IT 几乎完全分离,数据科学组的 IT 团队可以全面负责机器和应用程序。
当然,选择正确的工具在远程服务器上部署、调度和执行您的应用程序可能会节省您大量的时间、精力和与 IT 部门无休止的讨论。有许多工具,允许服务器部署、REST 服务部署、调度和最终在 web 浏览器上显示仪表板。选一个,最符合你需求和群体技能的,但是认真选一个!把一个机器学习模型训练到 99.99%的准确率,这是一个很大的学术成就。然而,将同样的模型投入到现实生活中才能让它达到目的。这是一个不容低估的挑战。因此,从合适的工具中获得所有可能的帮助!
3。真实世界的生活比实验室的生活更加复杂
现实生活是一片丛林,把你的预测器扔在那里意味着要面对治理规则和数据隐私问题的丛林,而这些在模型训练中是没有考虑到的。
您的预测器应用程序必须随时对所做的决策负责。这意味着现实世界中的所有预测都必须在规定的时间内(通常是法律规定的时间内)进行存储、可追踪和存档。
许多国家,尤其是欧洲,都有关于数据隐私的严格法律。通常,在最初的头脑风暴中看起来不错的想法与你可以用单个人的数据做什么的法律现实相冲突。基于大量数据训练的模型通常不会显示可以追溯到原始数据所有者的信息。然而,如果训练集太小,或者如果应用程序被设计为跟踪每个人,这可能会变成一个法律问题。
Lakshmi Krishnamurthy 指出“在实验室约束条件下,使用训练数据进行构建、调优和性能测试是可管理的;但是,集成“实时”数据和质量、治理、企业架构约束的人员问题,以及最后但同样重要的是,让客户接受您的模型是/应该做什么并不总是“可预测的”。这就是挑战所在!!"
同样, Sam Taha 认为,与公司内部现有数据管道的整合可能会比最初想象的更加困难。从具有理想输入和管道的 POC 到在整个解决方案空间中工作的解决方案,需要与业务和上游系统紧密配合,以便模型成为生产“产品”的一部分。
Paige Roberts 也同意这一观点,并表示“未能考虑到为模型创建生产数据管道所涉及的数据工程工作是导致部署失误的另一个原因”。
4。数据泄漏
Ruben Ten Cate 将数据泄露列为部署的另一大障碍。数据泄漏确实是一个严重的问题,在训练期间并不总是容易检测到。当训练集中的数据包含现实世界中不可用的特征时,例如在要分类的事件之后或之后收集的特征,就会发生这种情况。
引用鲁本的话:“再加上一个部署失误的原因:一个‘数据泄露’。不是隐私泄露意义上的泄漏,而是数据泄漏到训练数据中,这在操作环境中是不存在的。例如:通常客户服务互动越多,客户流失的机会就越大。这是一个有效的相关性,并且是不满意的客户经常打电话给客户服务来投诉或实际停止他们的合同(流失)的事实的结果。基于这一特征的模型的问题是,在现实生活中,我们希望在客户变得不高兴并呼叫客户支持(以流失)之前预测流失的客户,因此更高的交互率尚未发生,也不存在于运营环境中。因此,该模型表现不佳,并在生产中增加价值之前被丢弃。”
数据泄漏的一个经典例子是当我们试图预测旅行延迟(包括到达目的地的延迟)时。当然,如果交通工具延迟了 x 分钟,这就被定义为行程延迟。但是我们怎么能在到达之前知道到达延迟呢?还有更多这样的例子,随着事后知识变得不言而喻,但在培训期间却不那么清晰。清楚地命名和描述数据列可能有助于防止这种问题。
5。设计思维、精益创业和敏捷(或缺乏)
帕特里克·斯拉文伯格(Patrick slaven burg):软件开发——以及越来越多的其他团队营销&销售——转向了像设计冲刺或 Scrum 这样的迭代过程。数据科学中的敏捷过程仍然是相当新的,但越来越受欢迎。
然而,用户故事不是静态的。更有问题的是,企业通常很难明确表达他们希望从人工智能中获得哪些商业价值。并且哪个具有最高优先级。常年产品经理的困境:“我们应该构建这个吗?”以及“为什么?”。
敏捷和设计思维可能不是典型的数据科学家的背景——相反,他们使用更长期的“科学方法”。最终,他们可能解决了这个问题。但是这个问题不再符合业务需求。或者根本就不存在。
6。公司政治
最后, Patrick Slavenburg 报告了“组织问题——以及部落主义——作为部署的一个问题”。这不仅仅是我们在呆伯特的漫画中常见的办公室政治,不幸的是,在现实生活中也是如此。
也是 OT 和 It 之间常年的中国墙。无论是业务部门还是运营中的主题专家:都将 IT 视为满足其需求的促成因素。这也意味着,如果通过它引入数据科学,它将停留在其中,永远不会被广泛采用。而我们需要的是公民数据科学家来推动这种适应。
另一个例子是 IT 部门和数据科学组之间缺乏协作,如本文前面所述(在关于缺少 IT 技能的部分)。在最糟糕的情况下,这甚至可能演变成一场丑陋而不愉快的战争。
管理层的支持也很难赢得。这有时与管理层对数据科学应用的期望过高有关。或者相反:那台机器永远代替不了人类。有时很难找到中间立场。
结论
没错,部署伤人。我在这里列出了一些最常见的导致部署困难的原因。不要低估这些问题中的任何一个,选择一个简化您生活的工具,并从项目开始就投入足够的时间、资源、技能、预算和早期规划,就可以治愈痛苦。
如果你想阅读 LinkedIn 讨论中的原始评论,你可以在这两个部分找到它们:
https://www . LinkedIn . com/feed/update/activity:6499327120198627329/
【https://www . LinkedIn . com/feed/update/urn:李:活动:6499534506897211392
我希望我没有扼杀实施和部署数据科学解决方案的热情。我的目标实际上是让你意识到陷阱,而不是吓你。我希望你们能珍惜我们的经验,继续部署更多的数据科学应用。
魔鬼的音乐
数字音乐
Pitchfork 真的是互联网最苛刻的乐评人吗?
Music fans celebrating an above-average Pitchfork review (image: Pitchfork)
“音乐经历了令人筋疲力尽的 7,000 年,被太多的中速音乐所拖累,最著名的是弗朗茨·李斯特的《降 A 大调第三乐章》和 90 年代另类摇滚组合 Semisonic 的《关门时间》……最终,尽管音乐有时会很精彩,但整个媒体都成了人行道的衍生物……”
Pitchfork 对音乐(正如《洋葱》所想象的)的评论如是说,该评论给“通过时间表达的由声音和沉默组成的创造性表达模式”打了一个普通的 6.8 分(满分 10 分)。
Pitchfork 成立于 21 世纪中期,专门报道美国中西部的独立音乐和地下音乐。从卑微的开始,它发展了重要的文化资本。它现在拥有近 25 万的每日读者,并在许多乐队成为家喻户晓的名字的早期成功中发挥了不小的作用(Arcade Fire 的首张 LP“葬礼”在 Pitchfork 的热情洋溢的评论之后短暂绝版)。
然而,正如《洋葱》的恶搞所暗示的那样,这种毫无保留的赞美被认为是反常的。这位自称“音乐界最值得信赖的声音”的人一方面给予了什么,另一方面肯定也能得到什么(我的自己的 最喜欢的 乐队中的许多乐队这些年来都受到了猛烈抨击)。
Pitchfork 经常被指责为为了吸引注意力而故意挑衅和逆势评论。Pitchfork 的十进制评分系统进一步推动了对自命不凡的指责(由该网站通常冗长、离题的风格引发),这意味着它在 0-100 的范围内给专辑评分,而不是大多数传统评论家部署的简单的 5 星评级。人们常常会觉得,这仅仅是为了更精确地记录下你最喜欢的专辑。
当然,要找出这些指控是否合理,看一下数据是有意义的。
正在引入数据…
我们将用于此分析的数据集是通过抓取评论聚合网站 Metacritic 生成的(这一过程在之前的博客中有所介绍)。
完成此操作后,我们获得了大约 202,000 个专辑评论的以下信息:
- **艺术家:**我们的数据集中有 8415 位独特的艺术家
- **专辑名称:**共有 17727 张独特的专辑(注意——只有至少有四个评论的专辑才会被包括在内,以确保更公平的跨出版物比较)
- 这张专辑的发行日期:这些数据涵盖了从 1999 年 2 月到 2019 年 7 月二十年的在线评论
- **专辑的风格:**共有 689 种独特的风格,有些专辑的标签多达 5 或 6 种
- **撰写评论的出版物:**数据集中有 131 种不同的出版物
- **出版物的审查分数:**标准化为满分为 100 分的整数分
- 该专辑的‘Metascore’
“ Metascore ”是一张专辑的不同评论家评论的加权平均。虽然 Metacritic 用来创建 Metascore 的确切方法尚不清楚,但 Metacritic 建议“根据[出版物的]质量和整体地位”给予额外的权重。然后将这些分数标准化(类似于大学里的“曲线评分”),以防止分数聚集在一起。无论如何,Metascore 是衡量任何一张专辑“真实”质量的最佳标准。
乍一看…
Pitchfork 是过去二十年中最多产的音乐出版物之一。只有另外两个在数据集中有更多的评论,自 2018 年以来,Pitchfork 每月发布的评论比任何人都多,除了 AllMusic。
The trends here are interesting in and of themselves — what causes this jump around 2011, and the fall in the following years? This is something we will investigate in a future blog. Note — we use a rolling average here since album releases are highly seasonal, with very few albums being released in December.
有一个非常简单的方法来衡量一个出版物的苛刻程度——取每个出版物的评论分数的平均值,并对它们进行排名。这样做,我们看到有许多比 Pitchfork 更严厉的批评,Pitchfork 只是刮到顶部(或底部?)三十种出版物。
当然,这种分析是有缺陷的。我们已经看到出版物评论了不同数量的专辑——考虑到其目录的广度,Pitchfork 可能只是评论了更多好的专辑。因此,我们需要引入一个更强有力的衡量标准。
与 Metascore 的差异
我们已经说过 Metascore 可能是衡量一张专辑真实质量的最好方法。因此,我们可以通过比较 Metascore 和个人评审分数来识别苛刻的评审。
我们来孤立一下 Pitchfork 的评论。我们可以根据相应的 Metascore 绘制每个评论的 Pitchfork 分数。Pitchfork 评论为“苛刻”的专辑因此低于紫色的“ x=y ”线。我们可以看到许多点落在这条线以下——事实上超过三分之二。
67% of Pitchfork’s scores are below the Metarating. 28% are above, and 5% are exactly the same.
我们可以将这个“苛刻”的概念归结为一个单一的 KPI——一个评审的“与 Metascore 的区别”。这很容易计算为两个数字之间的差异。在上面的图表中,它将作为点和紫色线之间的垂直距离给出。
因此,对于 Pitchfork 对小马驹乐队最新专辑的评论,与 Metascore 的差异将是 60 减去 78,即-18(看起来相当苛刻!)
The album’s metacritic summary, with Metascore
The same album’s Pitchfork review…
因此,出版物的“与 Metascores 的差异”越负面,我们就越能判断它的苛刻程度。如果我们绘制 Pitchfork 得分差异的直方图,我们会看到大多数差异都是负的(我们从上面的散点图中知道)。
平均而言,Pitchfork 的得分比我们预期的低了将近半颗星,考虑到它已经评论过的专辑的 Metascores。
如果你想知道哪些专辑可以在左边的长尾中找到,那么我们只能希望你不是北方州的粉丝
出版物之间的比较
“与 Metacritic 不同”KPI 的一个优点是,我们可以公平地比较不同的出版物。
如果我们将每个出版物的平均得分差异绘制到 Metascore 上,我们实际上看到 Pitchfork 看起来并不特别显著——特别是相对于具有类似数量的已发表评论的其他出版物。
许多处于苛刻和慷慨极端的出版物(即,在上述散布图的最左边和最右边)是小得多的关注点。最苛刻的三家(抽屉 B、精选、秃鹫)之间只发表了 318 条评论。最慷慨的往往是“一周记录”风格的专栏,从中我们可以期待高分。
如果我们分离出排名前三十的出版物(每个出版物在数据集中有超过 2000 条评论),我们会看到只有六分之一的出版物的评论比 Metascores 建议的更慷慨——其中唯一特别慷慨的评论家是《娱乐周刊》(随你怎么说)。无论如何,根据这一标准,Pitchfork 的评论得分看起来并不特别显著。
这是峰度,笨蛋…
然而,如果我们超越每个出版物的平均分数差异,而是查看这些差异的分布,就会发现一些有趣的事情。如果我们要为一个出版物做直方图(就像我们在几段前为 Pitchfork 做的那样),但是要并排比较多个分布,我们可以使用 Seaborn 的 violinplot 函数。下面,我们绘制了数据集中十个最多产出版物的分布图。
Each violin should be read like a ‘vertical’ distribution curve — the wider the violin is at a given point, the more reviews we have clustered at that point.
如果我们比较这些出版物的分数差异分布,Pitchfork 有一些突出的东西——分布的峰度。
峰度是一种对分布“尾部”的度量,它告诉我们异常值有多极端。峰度公式的构建使得分布均值的一个标准差内的任何数据点贡献都非常小。因此,同时具有低标准差和长尾的分布可能具有高峰度。
事实上,在上面的图中查看 Pitchfork 的“小提琴”,我们看到它紧紧围绕着平均值(导致一个宽的小提琴,在波峰的两侧都有陡峭的斜坡)。它也有一个很长的负尾巴。
只有在雷达下,其分布范围内有更负的分数差异(他们给狼眼的“燃烧的头脑”打了一个大大的零分,对此,永远迟钝的 Pitchfork 给了高度值得称赞的 8.0),然而他们的分数差异更加松散。
如果我们将所有出版物绘制成散点图,我们会看到 Pitchfork 在数据集中的所有评论家中拥有最高的峰度分数之一——当然是所有大标题中最高的。
那么,Pitchfork 是互联网上最苛刻的乐评人吗?
根据我们所看到的,似乎不是这样。在数据集中的主要出版物中,这个奖项可能会授予 Under The Radar,他在近 5000 篇评论中,平均得分低近 7 个百分点。
然而,关于 Pitchfork,我们所能说的是,它实际上是相当一致的。它倾向于降低专辑的评分,但相对于其他类似规模的出版物来说,并没有高得离谱。事实上,在排名前三十的出版物中,Pitchfork 在 Metascore 的“半星”范围内拥有最高的评论分数。换句话说,它似乎很擅长判断一张专辑的“真实质量”。
然而,Pitchfork 的评论评分包含少量重要的异常值(如’死于立体声’、纽约鬼&花’和’两个违背自然’),其峰度评分表明这些异常值比我们预期的更极端(当然也比大多数其他出版物更极端)。
所有这些都支持这样一种观点,即 Pitchfork 通常是一个值得信赖的音乐评论来源,但它有一种不必要的逆势行为来引起注意的习惯。
总而言之,我给 Pitchfork 打了 6.8 分。
这是我新的“数字音乐”专栏的第一篇博客,它将利用数据讲述现代音乐产业的故事。流派品味的变化如何影响节日?音乐新闻业的未来如何?制作《困难的第三张专辑》有人们想象的那么难吗?我很乐意听到对上述分析的任何评论,或者对数据集本身的任何想法。欢迎在下面留言,或者通过 LinkedIn 联系我。
“可用”数据和“可访问”数据之间的区别
一点历史
几个月前,我们公司在离城市北部几小时路程的地方享受了一次休假。我们团结一致,集思广益,为公司和产品的发展设定愿景和目标。
我们也有篝火晚会,这比你想象的更有意义。
回到城市后,我们得到了剩余的棉花糖——大约多了 4 袋。它们整整一周没有被碰过,放在咖啡旁边的抽屉里,这意味着它们肯定被人知道,因为在我们办公室里,咖啡一次最多只能被描述为“没有碰过”30 分钟。
但后来,我们的一名员工将一袋棉花糖倒在一个透明的容器里,就像我们在这里得到的其他一些零食一样。
一天结束时,还剩四个。
A before and after photo. The container on the right started that day full to the brim.
你为什么要告诉我这些?
不要误会我,我知道这听起来很糟糕,到目前为止充满了打字错误的 clickbait:
我们把一些棉花糖放进一个透明的容器里,你不会相信接下来会发生什么!
但它们一直在稳步下降。如果你认为这不值得你花时间去任何地方,系好安全带,因为我绝对要把它和数据联系起来。
通过移动它们,展示它们,并解决一些后勤问题,棉花糖从可获得到可获得,这两者之间有着天壤之别。
好吧,我开始明白了
有大量的数据可用超过任何人可以感知。它是通过无数的智能手机、计算机、传感器、物联网设备以及基本上任何可以插入的东西产生的。除了调查、人口普查、自然事件、市场事件……事实上,我认为是时候更新牛顿第三定律了:
对于每一个动作,都有一个大小相等、方向相反的反作用力,并收集两者的数据。
For example, if you defenestrateyour computer in frustration, the window will be replaced with a similar, unbroken window, probably at your expense. (photo from Pixabay)
但是这些数据很少被访问。它隐藏在门户中,以晦涩的格式出现,标题错误,列类型错误,字符编码不是您所习惯的——有各种各样的障碍。
利用替代数据意味着将其可用性转化为可访问性。通过搜索引擎不容易找到有用的数据。从笨重的 web 门户下载一次数据与管理脚本以定期执行计划收集不同。一旦你把所有这些都整理好了,你就不只是神奇地拥有了你想要的数据,它还需要被重新格式化、清理和标准化,以便与你的组织中现有的数据和基础设施集成。
能做些什么?
幸运的是,数据是可变的。有一些过程可以对其进行转换、规范化,并将其打包到一个优化的模式中,这将使数据更容易访问,从而更有价值。
然而,当涉及到用人力解决问题时,这并不合适。无论您的组织规模有多大,总有一天有用但无用的数据会超过您的数据科学团队的能力。事实上,从概率上来说,那个时间已经到了;由于 每天产生的数据量巨大且深不可测 ,我们无法掌握市场的每一个来源、更新和细分市场,而且很有可能有一些你没有利用的数据可以增强你的解决方案并深化你的分析能力。
我如何管理大规模的数据变化?
我们已经写了如果你的公司想要成为数据驱动的,一个 数据运营策略 是多么重要。如果没有自动化,数据科学团队停滞不前只是时间问题。您的团队需要能够卸载“脏活”,以确保他们的时间在数据科学、数据工程和数据分析的所有移动部分之间均匀分配。
随着数据科学成为目前世界上最受欢迎的专业之一,数据的价值显而易见。然而,投资 DataOps 不仅可以缓解数据来源、准备和处理阶段的瓶颈,还可以解放您的数据科学家,让他们寻找新数据、发现新见解、更快地提供更有意义的分析,如果一切按计划进行,还可以创造新的收入。
焦点的转移
人们很容易将数据科学的困境归咎于人才短缺,但培养一支数据团队只能到此为止。无论人才库有多深,在数据产品和数据专业人员上一对一的增长都没有商业意义。
对于任何希望利用可用数据世界的公司来说,首要任务必须是创建最简单的工作流,以便将数据从任何地方输入到您的组织中,自动执行妨碍工作效率的重复且耗时的任务。
这就是如何将大量可用数据转化为可访问的数据。
数字幸存者——大屠杀的分析视角
“很快,将没有幸存者讲述他们的故事,你的孩子将只能通过书籍和视频了解大屠杀”
大约 18 年前,我的老师在给我们班放映了一部关于大屠杀幸存者的纪录片后说了这句话。
Photo by Alessio Maffeis on Unsplash
大屠杀,也被称为“Shoah”(希伯来语:השואה),是第二次世界大战期间的一场种族灭绝,在这场种族灭绝中,纳粹德国在当地合作者的帮助下,有计划地屠杀了大约 600 万犹太人。
作为一个大屠杀幸存者的孙子和一个狂热的数据研究者,我对自己说,在当今的“数据科学”时代——大数据可以通过小努力找到——我可以通过简短的谷歌搜索找到一些关于大屠杀受害者的原始数据。
令人惊讶的是——我的谷歌搜索几乎一无所获。
我能找到的唯一重要的“大屠杀数据库”是“Yad Vashem”——世界大屠杀纪念中心,它包含数百万份记录,其中有大屠杀受害者的传记细节,这些记录是从 2004 年至今精心收集的。
尽管这个数据库是公众可访问的,但访问是通过在线(和有限的)查询形式,这使得不可能用更合适的分析工具来操纵数据。
难道世界历史上最重要的事件之一的数据不能以原始形式用于非营利研究?
所以我决定调查“犹太大屠杀纪念馆”网站(技术说明:通过 chrome DevTools 过滤 XHR 和获取请求来了解“隐藏的 API”),并能够创建一个 Python 脚本来自动查询和存储约 750 万个大屠杀受害者条目的数据(注意:这一切都是根据“犹太大屠杀纪念馆”网站的“正确使用”和“隐私”条款完成的)。
尽管“亚德韦谢姆”的信息远非完整(重复条目、缺失条目、来源不明等。)——它仍然是最好的,有了这个独家数据,我现在可以从一个方便但令人不安的角度来看待大屠杀:
Europe heat map — victims per country of death (note: borders are not accurate as I used a modern geocoding engine instead of a 1938 one)
Reason of death — per country of residence
Number of victims between 1938–145 — colored by documented fate
Top originating cities of the victims — colored by country of death
Main traffic routes of victims between 1938–1945
不用说,这只是冰山一角;这些只是我用“Tableau”和“Python”做的一些总结,它们并不声称是准确的,而是强调如何利用这些数据。
想象一下,我们会考虑受害者的姓氏和地理位置之间的关系,或者我们会根据受害者在特定日期的位置相似性对他们进行分组。
人们可以想象,一项全面的研究可能会提供有益于国际社会的新见解,从关于战争的历史见解到发现关于一个人家庭命运的进一步信息。
不幸的是,几乎没有大屠杀幸存者了,时间并没有让它变得更好。但是在人类幸存者消失的现实中,让我们至少利用“数字幸存者”来讲述他们的故事。
由犹太大屠杀幸存者的孙子 Yoav Tepper 撰写。
我联系了“犹太大屠杀纪念馆”,询问他们是否允许我发布他们的数据库。我真的相信,如果世界上有任何人可以获得这个独家的重要信息,它可能会启动/鼓励新的研究,而这些研究从来没有为纪念这些受害者而进行过。我仍在等待“亚德韦谢姆”的官方回应,但如果他们批准我的请求,我会在评论区发布更新。
================
根据“犹太大屠杀纪念馆”网站的条款和条件,我声明我对这些数据不拥有任何权利。“Yad Vashem”数据仅用于个人和教育目的。该数据属于“亚德韦谢姆”,唯一有效的数据是 “亚德韦谢姆”网站 中呈现的数据。在这篇文章中,我使用了国家名称、年份和死亡原因。没有使用与受害者身份相关的个人信息。
===============
伦理人工智能的维度改变了医疗保健的面貌
—我们当前的人工智能医疗保健反面乌托邦
尽管许多人可能认为… “人工智能将会接管一切!偷走我们所有的工作,并打算取代我们所有人!”
不打算粉饰这一点。这在一定程度上可能是真的,当在医疗领域讨论它的含义时,仍然有大量的伦理上的缺陷需要首先考虑。
“人工智能很可能会导致世界末日,但与此同时,也会有伟大的公司出现。”—山姆·奥特曼
趁我们还在食物链的顶端,充分利用我们的时间怎么样😉
医疗人工智能——为什么和为什么不
人工智能(AI)包括深度学习、机器学习、自然语言处理等领域,几乎可以应用于医学的任何领域,它对生物医学研究、医学教育和医疗保健的潜在贡献似乎是无限的。
凭借整合和学习大型患者数据集和临床数据的能力,人工智能可以在诊断、临床决策和个性化医疗过程中发挥重要作用。在许多情况下,这些形式的人工智能可以用来优化整个治疗过程,更好地帮助和康复病人。例如,应用于乳房 x 光片的基于人工智能的诊断算法正在帮助检测乳腺癌,为放射科医生提供“第二意见”。
此外,先进的虚拟人化身能够参与有意义的对话,这对于精神疾病的诊断和治疗具有意义。人工智能应用还扩展到物理领域,包括机器人假肢、物理任务支持系统和移动机械手,以帮助提供远程医疗。
随着这些进步为医疗保健领域带来了更强的整合和贡献,仍然有一个伦理层面需要考虑解决隐私、安全和特殊监管规定的问题。随着这项技术的不断进步,许多人都专注于强调医疗保健领域的未来会是什么样子,让医疗界对新兴人工智能技术可能带来的道德复杂性知之甚少。
忽视其有害影响。
Ignoring the ethical complexities of AI
人工智能的反乌托邦未来——伦理人工智能的挑战
对人工智能对全球更广泛经济的影响的估计大相径庭,最近的一份报告表明,到 2030 年,人工智能将对全球国内生产总值产生 14%的影响,其中一半来自生产率的提高。这些预测为人工智能行业的快速发展创造了政治胃口
有偏见的人工智能从错误的数据集开始
多样性不仅有助于解决平等的原因,也有助于抵消数据和人类判断中的潜在偏见。
众所周知,临床医生会受到潜意识偏见的影响。通常这些偏见是如此根深蒂固,以至于我们对它们视而不见。健康数据中的偏差也很常见,如果处理不当,可能会危及生命。
例如,心脏病在男性中更常见,但也是女性死亡的主要原因——至少在西方社会如此。尽管如此,女性心脏病更容易被医生忽视,不被认识,因此得不到治疗。这不仅仅是因为它被认为不太可能,还因为它在女性身上的症状表现与男性不同。
同样,人工智能在医疗保健领域的表现取决于它从中学习的人和数据。这意味着在人工智能模型的开发中缺乏多样性会极大地降低其有效性。根据有偏见的数据训练的人工智能只会放大这种偏见。例如,IBM Watson 对癌症治疗的建议是基于一家医疗机构的少数医生的培训。这就产生了有偏见的建议,这些建议不是基于官方的指导方针,而是基于少数人的经验和观点,这些人可能非常相似。
Figure 1
—图 1 总结了医学中 ML 研究的预期趋势,从短期到长期,侧重于反应性系统的进一步发展,经过培训,以可测量的准确度和前瞻性系统对患者进行分类。由于这些形式的最大似然算法将处理、诊断和治疗医学领域内的大范围流行领域,因此必须使用无偏见决策功能来确保安全性。
到底是谁的错?
在治疗方法、诊断和/或患者疾病分类过程中的并发症,强调了人工智能伦理方面讨论最多的话题之一。
总的来说,人工智能(在高层次上)只是计算统计学的一种形式。它在医疗保健领域的应用侧重于提供给定数据集的输出,做出最佳建议/决策。我们在医疗行业内测量准确度的过程将受试者操作曲线(ROC 曲线)置于焦点。这些 ROC 曲线主要由比较数据集组成,这些数据集展示了在特定任务中表现最佳的系统。
The better a system performs, the further up and towards the left the curve goes. A perfect 100% accurate system would not even be a curve, it would be a right angle in the top left-hand corner of the graph.
随着这些人工智能系统对病人的诊断和治疗具有更高的准确率,我们必须考虑到利用人工智能系统在病人护理方面有更高的表现率。
但是我们如何确保我们做出最好的决定,把我们的生命放在这些算法的功能上。
努力确保和概述这些 ML 算法的最佳决策模型在很大程度上依赖于两个强大的假设: AI 必须能够访问全人口的电子健康记录(EHR)并且这些 EHR 必须能够被 AI 解释。
或者我们可以停止生病。
但那是另一天的话题😉。
所以你的意思是…“我们完蛋了”
不完全是。
有许多人实际上意识到了解决这个问题的重要性,并且目前正在致力于专注于伦理人工智能维度的解决方案。
像多伦多创业公司 Winterlights Labs 这样的公司正在研究实际解决有偏见的数据集的方法,为阿尔茨海默病、帕金森病和多发性硬化症等神经系统疾病建立听觉测试。
努力消除所有形式的诊断中的偏见,避免根据性别或种族进行定性,但有时会根据其他特征进行定性,如语言、皮肤类型、谱系或来自有缺陷的数据集的生活方式。
收集大量以前患者的数据集,输入到他们的人工智能算法中,以获得患者的最佳特征,并帮助康复过程。但是这个过程最独特的地方在于,Winterlight 实验室非常注重收集以英语为母语的人的数据,以进行有针对性的治疗。
这不仅仅是 Winterlight Labs 试图解决医疗保健中道德人工智能的复杂性,而是致力于解决一个严重的问题,并为其他公司继续创新和寻找新的方法来彻底改革医疗保健领域树立先例。
正在消失的穷人
探索令人难以置信的全球繁荣收益:现实项目第 1 集
25 年来的每一天,报纸都可以正确地刊登“昨天 13 万人摆脱极端贫困”的标题(来源)。相反,据我所知,这已经出现在一个主要报纸的头版整整 0 次。也许这解释了人们在这个简单问题上记录的令人难以置信的可怕结果(来自 Gapminder ):
Question 1. of the Gapminder test
在美国问这个问题的时候, 5%的人类得到了正确答案, C:几乎减半。而动物回答这个问题有 33%的准确率(因为是随机猜的)。
在像美国这样一个理应有文化的社会里,人们怎么可能对现实如此误解?我不喜欢指责,但在这种情况下,这可能是合理的:媒体成功地向我们提供了关于世界的错误信息。他们没有报道事实,而是选择激发我们天生的仇外心理(害怕外来者),让我们相信有一个富裕的“发达世界”,然后是其他所有人,一群永远无法摆脱贫困的穷人。
幸运的是,有了正确的数据,我们可以纠正对贫困的错误看法。在这样做的时候,我们发现了一个显著的事实:在过去的几十年里,世界各地的人们都经历了显著的繁荣,导致数十亿人的生活水平明显提高。
这是现实项目的第一集,致力于用数据减少对世界的误解的每周系列。
关于全球贫困和收入的事实
首先,我们需要看看统计数据。关于这个主题的最佳资源是我们的世界数据“全球极端贫困”页面。你可以在那里看到所有的数字,但有一张图表足以显示贫困人口的急剧下降:
Global share of the world population in extreme poverty.
我们可以看到,贫困的定义因机构而异,但无论我们使用哪种定义,比率都急剧上升。当然,率在下降,但是因为人多了,不就意味着还有更多的人穷吗?
晚间新闻是个不错的尝试,但是 T2 生活在贫困中的人口数量也急剧下降,自 1990 年以来已经减少了超过 12 亿。
Number of people living in extreme poverty.
这些人从极端贫困中崛起后会走向何方?简单:融入全球中产阶级。在撰写本文时,世界上大约 85%的人(70 亿人中的 60 亿人)处于或超过全球收入水平的中间部分。区分“发达”和“发展中”是看待世界的错误方式:不存在两种收入水平,而是一个平稳的标尺,世界各地的人们都在快速攀升。
我们可以从数字上观察到全球财富的急剧增长。随着全球贫困人口的减少,收入会随着时间的推移而增加,如人均国内生产总值所示(摘自《我们的世界》数据“经济增长”第页):
Gross Domestic Product Per Capita around the world.
因此,事实是,贫困在减少,收入在以极快的速度增加,但这真的重要吗?有可能人们赚了更多的钱,却没有过上更好的生活?
为什么财富很重要:富裕国家是更好的居住地
所有这些看起来都不错,但你可能会想,财富的增加是否真的意味着人们过得更好。嗯,根据下面这张显示生活不满意度与人均 GDP 的图表,答案是响亮的“是”。
Dissatisfaction in Living vs GDP (Source)
随着财富的增加,人们对生活越来越满意。金钱不是治疗所有疾病的灵丹妙药,其影响只持续到一定的收入水平,但财富是积极的,因为它带来了副作用:婴儿死亡率更低,受教育机会更多,工作时间更少。
人们很容易在所有的数字中忽略人类,所以记住每个数据点的背后都有一个人是很重要的。数十亿人摆脱了贫困,这意味着母亲们不必埋葬她们的孩子,因为随着财富的增加,护理质量会提高,女孩们能够上高中,家庭生活更加健康、幸福。我不太擅长谈论个人,但是汉斯·罗斯林在他的优秀著作《真实》中提供了故事(除了事实之外)。
对我来说,我将用《我们的世界》中的另一张数据图表来结束这一部分,这张图表展示了为什么减少贫困是积极的:
Average Number of Years of Schooling vs Poverty Levels
数据再清楚不过了:在世界各地,人们正在摆脱贫困,步入中产阶级。因此,他们活得更长,上学更多,工作更少,生活更愉快。
全球贫困减少的原因
这种下降背后可能有许多因素在起作用(就像任何人类现象一样),但我将集中讨论最令人信服的论点:商业。(关于这个主题的完整论述,请参见马特·里德利的《理性乐观主义者》。
几十万年来,人类从事零和互动:一个人偷了或杀了另一个人,所以有人的收获被另一个人的损失抵消了。在这个系统中,人类的整体状态只能得到冰山般的改善(当交流仅限于步行速度时,提高生活水平的新工具传播非常缓慢)。
然而,大约从公元 1000 年的欧洲开始,一种新的互动形式出现了:经济交流,双方都从中受益。这项被称为商业的发明完全改变了游戏规则:人们现在能够进行正和交易,双方都获利。这是文明的一个基本组成部分:在商业中,卖商品的人和买商品的人都会胜出。
在历史的大部分时间里,人类拥有恒定数量的物质财富,这些财富可以转手,但总体上不会增加。随着商业的发明,随着人们进行商品交易和专业化分工,经济蛋糕本身的规模也在扩大。国家内部和国家之间的交流导致了劳动分工,人们或国家专门扮演一个角色,导致效率的大幅度提高。人类花了很长时间才弄明白,但一旦我们创造了交易所和市场经济,我们就开始了持续至今的不可思议的财富上升之旅。
我们可以从下面的图表中看到近年来贸易的有利影响。随着国家贸易的增加,它们变得更加富有:
Change in trade 1945–2014 versus change in wealth
不要把我误认为自由市场的传道者。在我开始努力通过数据减少对世界的误解之前,我是一个公开的社会主义者,支持北欧国家作为效仿的典范。然而,我对这些数字的研究得出了一个结论:自由市场及其促成的交换是摆脱贫困的驱动力。我仍然相信政府的作用:政府在环境保护和工人权利等领域的严格控制对于确保财富的增加不以环境破坏为代价是至关重要的。
商业让人们摆脱贫困的非凡能力在中国可见一斑,在过去 40 年里,中国经历了历史上最令人难以置信的财富增长。正如《中国如何摆脱贫困陷阱》 中所描述的,随着共产党领导人逐渐开放中国的商业,尤其是与其他国家的贸易,中国摆脱贫困的过程非同寻常。1978 年,中国允许对外贸易,40 年后,中国再次成为世界强国。一路走来,数亿人的生活水平得到了提高。
China’s incredible rise in GDP per capita
(商业不仅导致收入增加,还导致国家内部和国家之间的暴力发生率下降。正如史蒂芬·平克在《我们本性中的善良天使》一书中所记载的,当从别人那里买东西比偷东西便宜时,经济学就赢了。我们的邻居活着比死了对我们更有价值,这意味着更少的杀戮和更多的交易。这就是所谓的温和商业理论。)
警告
虽然长期前景非常乐观,但关注仍需改善的现实也很重要。目前,全球仍有数亿人处于极端贫困之中,这些人中的每一个人都应该成为中产阶级。不幸的现实是,世界上绝大部分的穷人在非洲,像联合国这样的组织正在通过有针对性的支出项目和社会安全网制度来努力消除贫困。
Where extreme poverty still exists (source)
今天,大约有 7.5 亿人仍然处于极端贫困之中。尽管如此,考虑到 1990-2015 年间有 12 亿人脱离了极端贫困,所有迹象表明极端贫困可以终结。
此外,任何时候提到收入问题,我们都必须提到收入不平等。如果国家变得越来越富裕,但财富却流向了更少的人,那么人类真的过得更好吗?
再一次,值得看看数据,这次是关于国家内部和国家之间的不平等。我们将转向数据文章“收入不平等”和“全球经济不平等”中的“我们的世界”来了解事实。幸运的是,数字再次提供了一个乐观的答案。虽然一些国家的国内不平等现象有所增加,但总体而言全球不平等现象有所减少,并且预计将继续减少。
从下面的图中,我们可以看到,如果我们将不平等定义为收入最高的 1%的人占总收入的比例,一些国家的不平等程度有所增加。(这个定义可能有一些问题)。
Share of income going to top 1% in selected nations.
另一方面,全球经济不平等有所下降:
Global income distribution showing decline in Gini coefficient.
总的来说,从不平等的角度来看,一些国家的财富分配可能越来越不平衡,但总的来说,由于最贫穷国家的总体财富水平增长最快,即使是收入水平最低的国家也变得更富裕。我不会就不平等是否是负面的展开辩论,但是,从长期的全球视角来看,现在似乎并没有变得更糟。
结论
新闻不仅误导了你对这个世界的认识,而且通过宣传一幅虚假的画面,它偷走了一些有价值的东西:随着看到这个世界变得更好而带来的快乐。虽然对我们短期内面临的挑战持现实态度很重要,但放眼全局并认识到我们所有的集体努力都在发挥作用也很重要。
世界各地的人们正在脱离贫困,步入中产阶级,因此,他们的寿命更长,更健康,生活更愉快。
我想用最后一张图表来结束我的演讲,这张图表强调了现实项目最重要的部分:当我们意识到世界范围内的贫困正在减少时,它应该给我们信心,消除贫困的努力并不是愚蠢的。虽然减少贫困的最大贡献者(很可能)是商业,但像联合国倡导的那样的减贫努力也是至关重要的。如果你认为贫困率在上升,那么你唯一的结论就是这些项目不起作用。另一方面,如果你像我们一样挖掘数据,发现了世界的真实状况,你会意识到这些努力已经产生了影响。
Effectiveness of anti-poverty programs (source)
减贫计划给受益者带来的好处远远超过成本(详见“一个多层面的计划为非常贫困的人带来持久的进步:来自六个国家的证据”)。下一次有人声称总会有穷人,帮助他们没有用,温和地纠正他们,不是用观点,而是用数据。
来源
除了整篇文章中列出的资源,这里还有一些供你自己研究的资源。我欢迎任何讨论。
- 数据中的世界:极度贫困
- 我们的数据世界:经济增长
- 原始数据:世界银行
- “透视极端贫困的减少”
- 真实性:我们看错世界的十个理由——以及为什么事情比你想象的好 作者汉斯·罗斯林
- *《理性的乐观主义者:繁荣如何演变》*作者马特·里德利
一如既往,我欢迎反馈、对话和建设性的不同意见。可以在 Twitter @koehrsen_will 上找到我。
设计人工智能的人和受其影响最大的人之间的脱节
Photo by Katarzyna Pe on Unsplash
人工智能和自动化正在继续深入我们的社会。
- 在商业行业,公司现在利用智能个人助理(如 Alexa、Cortana 和 Siri)提供的语音识别来加快他们的任务。
- 在**交通行业,**人工智能为即将到来的无人驾驶汽车提供动力,并帮助管理交通流量。
- 在教育部门,人工智能被用于支持个性化学习系统。
- 在医疗保健领域,人工智能正在推动新的诊断工具和决策支持技术。
- 在零售部门,人工智能正在改进仓库设施的设计,使流程更加高效。
- 在电影业,人工智能正被用于创作管弦乐和制作电影短片
- 在人道主义领域,人工智能正被用于支持可持续发展目标的实现。
然而,在设计和实施这些系统的人和那些受结果影响最大的人之间似乎存在脱节。
据报道,2019 年英国人工智能程序员的平均年薪目前约为 6 万英镑。与此同时,据报道,英国所有工人的平均年薪约为 36611 英镑。
广泛自动化的结果
自动化日常操作有很多好处。它为人们提供了从重复性任务转向更有益、更具挑战性的工作的机会,让他们能够发挥自己的情商。
但目前,情况远非如此:
相反,低技能工人发现自己不断被降级为越来越不安全、收入越来越低的角色。
对于一些人来说,他们的工作已经完全被取代了。
2013 年,牛津大学的研究人员研究了 702 个职业群体。他们发现,47%的美国工人很有可能在未来 20 年内看到自己的工作自动化。最近在 2017 年,麦肯锡的一份报告预测,到 2030 年,30%的“工作活动”将实现自动化——这一变化将影响全球多达 3.75 亿工人。这是相当多的人。
纵观历史,新的技术创新浪潮总是会导致关于自动化的公共辩论激增。这场运动可与整个工业革命中脱离农业社会的转变相提并论。这方面的证据可以给我们一些启示,为今天的政策辩论提供信息。
早在 20 世纪,人们就一直担心自动化会让人类失业。1950 年,约翰·肯尼迪将自动化描述为一个会给人类带来“困难”的“问题”。
15 年后的 1965 年,IBM 的一位经济学家说,自动化将导致每周工作 20 小时。考虑到普通美国人仍然平均每周工作 34.4 小时(T4 时间为 T5),这个预测显然还很遥远。
但是,解决工业革命的不公正用了几十年的时间。这一次,我们等不起那么久。
如果就业水平大幅下降,人们担心西方民主国家可能会诉诸威权主义,这种情况早在上世纪 30 年代大萧条之后就在一些国家蔓延开来,如今许多经历了高度收入不平等的国家也是如此。
真正的挑战是管理过渡
西方政治已经变得越来越动荡。收入不平等正慢慢开始进一步扩大,加剧了本已岌岌可危的政治不稳定。很大一部分人将需要为新职业接受再培训。他们不再年轻,而是中年专业人士。发达经济体可能会受到转型的最大冲击,因为平均工资的提高会进一步刺激自动化。
自动化会有很大的不同,取决于工业部门。医疗保健等行业的工作岗位将会增加,以应对人口老龄化,而涉及体力劳动和数据处理的工作岗位将会减少。
不可能确切知道有多少工作将受到人工智能的影响,因为根据对输入数据的处理,研究给出了非常不同的估计。
普华永道的一份报告表明将会有三次主要的自动化浪潮。
第一波将发生在 21 世纪 20 年代初,预计将取代很低比例的工作岗位——约 3%。
第二波浪潮预计将在 21 世纪 20 年代末到来,预计将取代文书和行政部门的许多工作岗位。
第三次浪潮预计将在 21 世纪 30 年代中期到来,可能会导致今天 30%的工作自动化——特别是那些涉及汽车设备和机器的工作。
受教育程度较低的工人更容易被机器取代:
我们如何解决这个问题?
麦肯锡在的报告中以美国在工业革命期间从农业转型为例。随着农业就业机会的减少,中等教育的支出大幅增加,新的法律规定必须上学。
1910 年,14 至 17 岁的孩子中有 18%上了高中。
到 1940 年,73%的 14 到 17 岁的孩子上了高中。
教育水平的提高有助于创造一个繁荣的制造业。
如果我们希望自动化的未来取得成功,显然今天也需要类似的推动。越来越清楚的是,人工智能不会导致“工作的终结”。它可以创造尽可能多的工作岗位。相反,未来的工作只需要不同的技能组合。
政府建议网络需要支持更多的企业使用机器学习。我们需要培养各个层次的技能——从学校到行业专业人士,到本科生和研究生。
遗憾的是,事实似乎并非如此。事实上,在过去几十年中,用于培训和支持劳动力的支出一直在下降。此外,许多学校仍未能向学生传授技术的关键概念。
自动化不一定是一场灾难——但如果政治家们不理解我们对变革的需求并对此做出反应,它将是一场灾难
如果我们希望技术让每个人受益,而不是进一步扩大不平等,我们需要立即开始为未来培训我们的劳动力。无所作为将导致社区之间更大的分裂和两极分化。
如果政治家、工会和商界领袖想要确保技术变革的结果是好的,他们现在就需要行动起来。
美国分裂的州——历史透视
这个国家在现代史上从未像今天这样两极分化。据说,在过去的总统选举中,民主党和共和党候选人之间的差距要大得多。下面的地图描绘了过去五次总统选举的趋势,你可以发现更多的白人县在 2000 年比 2016 年差距缩小。随着时间的推移,一些明显的变化包括中西部的红色加深,而沿海的加利福尼亚则相反。
Darker colors indicate wider margins (blue: Democrats, red: Republican)
Voting share margin between Republican and Democratic candidates
在许多县,共和党和民主党候选人的投票份额差距已经扩大。过去几年,利润率的标准差一直在不断增加:2000 年为 0.26,2008 年为 0.29,2016 年为 0.35。在此期间,分布尾部,即无竞争力的县大幅增加。
在我之前的文章中,我发现人口和社会概况数据有很强的力量来讲述 2016 年县级总统选举结果。这篇文章提出的问题是人口的变化是否导致了美国政治的两极分化。例如,如果城市有价值观与民主党一致的人流入,它们可能会变得更蓝。与此同时,如果与共和党有密切关系的人留在农村,这些县会变得更红。
然而,我发现,至少在 2010-2017 年期间,人口的变化并没有推动国家的两极分化,而选举的特征(如候选人、问题)更能解释两极分化的趋势。
在这项分析中,我使用了 2010 年至 2017 年美国人口普查美国社区调查(五年数据)的数据概况表,选择了 292 个在县一级一贯可用的变量。缺失值由 XGBoost 回归器估算。在此期间,举行了两次总统选举。我构建了回归模型,自变量来自美国人口普查 ACS,因变量来自总统选举中共和党和民主党候选人之间的投票份额差额。
XGBoost Regressor 还被选为其他机器学习回归模型中得分最高的基础模型。样本按县总投票数加权。如左图所示,施加重量会增加标称误差。
然而,加权样本在投票计数方面导致更小的误差。该模型提高了较大县市的准确性,但代价是较小县市的准确性。因此,在这个分析中,我将根据各县的总票数使用一个具有样本(县)权重的模型。
首先,我将 2016 年的人口普查数据和同年的选举结果拟合到模型中,并用不同年份的人口普查数据进行预测。这样,我们可以想象 2016 年选举在不同年份的人群中发生的假设情况。如果县一级人口结构的变化导致了两极分化,那么 2010 年人口普查数据中的红色县在以后几年的人口普查数据中会更红。
结果并不令人信服。在下面的图表中,您可以看到 x 轴上有 2010 年人口普查数据的模型的预测利润,以及 2010 年和 2016 年数据的模型预测之间的差异。如果有一个向上的斜坡,我们可以说 2010 年红色县在 2016 年有更大的优势支持共和党候选人,反之亦然。相反,我们看到的是下面的平面图;这意味着由人口变化引起的投票份额差额的变化与初始条件没有明显的相关性,总体而言,人口不是两极分化的明确驱动因素。
Voting share margin between Republican and Democratic candidates. Source: US Census
话虽如此,了解摇摆州各县市的人口结构和社会状况的变化可能是有用的。以下图表描述了 2016 年模型预测的民主党和共和党候选人的投票份额,以及 2017 年之前不同年份的人口数据。在佛罗里达州,特朗普以 1.2%的微弱优势赢得了 29 张选举人票,2016 年至 2017 年的人口结构变化有利于共和党,而我们看到的情况相反,这有利于宾夕法尼亚州的民主党人,他们在 2016 年以 0.7%的优势赢得了 20 张选举人票。2018 年美国人口普查 ACS 数据将于 12 月 19 日公布,看看最新数据的预测会很有趣。
Voting share of Democratic (blue) and Republican (red) candidates. Source: US Census
其次,我比较了用 2012 年和 2016 年数据集构建的两个模型,并检查了每个模型的重要特征和错误。
我发现 2012 款和 2016 款有很多共同点,如下图。乘坐公共交通工具或自己开车上下班很重要,因为城市(有公共交通的地方)往往比农村更蓝。结构单元(即居住在独立房屋或多单元公寓)和卧室数量也与城乡差别相关。这些变量在 2016 年比 2012 年更重要;在过去的四年里,城市和农村之间的差异加深了。人们还注意到,种族(包括“西班牙裔和拉丁裔以及种族”)在 2016 年拥有更大的权力,因为共和党在白人县加强了支持,而民主党在种族更加多样化的县市增加了支持。驱动 2016 年选举结果的特征的详细分析可以在我之前的文章中找到。
Feature importances in 2012 and 2016 models. Source: US Census
Root Mean Square Error of 100 trials of both models. Source: US Census
不出所料,2016 年的模型误差在统计上明显小于 2012 年,如左图所示。县一级的人口和社会概况比上次更能说明 2016 年总统选举的结果。这一事实是该国社会分裂加深的证据之一。
最后,我将 2012 年和 2016 年模型的预测利润率与 2016 年的人口数据进行了比较。2012 年-2016 年数据的模型将告诉我们,如果奥巴马和罗姆尼在 2016 年参加总统竞选,会发生什么。
很明显,2016 年的模型结果(y 轴)比假设的 2012 年选举结果(x 轴)更加两极化。在人口不变的情况下,2016 年的选举导致共和党候选人在红色县更强大,民主党候选人在蓝色城市获得更多支持。
Voting share margin between Republican and Democratic candidates. Source: US Census
如上所述,我没有发现任何证据支持县人口结构的变化导致了美国的政治两极分化,尽管监测摇摆州的人口和社会概况的变化可能是有用的。两极分化的原因是总统候选人、问题和选举本身的特点发生了变化。2020 大选在即,至今我们还没有看到任何两极化缓解的线索。
客户服务自动化的注意事项
权威指南
在这个快速发展的数字时代,人们几乎没有时间去杂货店购物或去 10 英里外的办公室工作。随着世界继续变得更加数字化,21 世纪的人类变得比以往任何时候都更加懒惰。这种数字化不仅影响了普通人;它还为公司提供了尽可能高效地服务客户的机会。只需点击一下鼠标,任何事情都需要一个即时的解决方案,这种需求导致更多的公司选择自动化,并尽可能多地用人工智能取代人类与客户的互动,来为他们做这项工作。
“信息技术和商业正变得密不可分。我不认为任何人可以有意义地谈论一个而不谈论另一个”——比尔·盖茨。
因此,当我们谈论出色的客户互动时,我们谈论的是基于清晰沟通、短响应时间和跨渠道一致性的客户体验。客户体验对客户来说必须是非凡的,任何客户参与的行为必须总是感觉良好。对于组织而言,与客户接触应该是一个平稳且经济高效的过程。
75% and 55% of customers prefer short response times and cross-channel consistency, respectively. Automation has enabled companies to become fast, efficient, and accessible to their customers.
在这个时代,公司必须时刻保持警觉,以适应快速变化的客户需求和市场趋势。如今,一家企业必须提供卓越的客户体验,才能在全球市场中保持竞争力。幸运的是,人工智能的智能功能使公司能够通过每次客户互动了解客户的需求,同时牢记组织的业务目标。因此,现在,企业将人工智能视为向客户提供难忘体验的重要因素。
然而,许多人仍然害怕自动化。有一种观点认为,有了那些花哨的机器人之类的东西,工作场所的事情可能会变得疯狂。然而,以下是所有害怕自动化的人不喜欢做的事情:等待电话接通客服代表,在车管所排队等候几个小时,没有人帮助他们网上购物。
答根据埃森哲战略公司的调查,61%的客户去年因为糟糕的客户体验而停止了与至少一家公司的业务往来。
在提供无缝客户体验方面,效率太低了,因此现在企业向人工智能寻求帮助至关重要。尽管雇用人工智能来做这项工作是明智的,但公司必须在使用人工智能和人类互动之间找到正确的平衡,以服务于他们的客户。不是所有的问题都可以通过自动化服务解决,因为它有一系列的限制。埃森哲战略的研究显示,大约 60%的顾客由于糟糕的客户服务而没有购买他们想要的东西。
因此,当务之急是要有一个清晰的“客户服务自动化的注意事项”列表,以了解企业如何使用自动化客户服务来增强客户体验。
当自动化客户服务时,这是企业应该做的
- 有一个自动处理常见问题的系统:
常见问题是客户在联系企业客户代表时最常问的问题。理想情况下,人工智能应该处理常见问题。拥有一个自动的 FAQ 部分(或聊天机器人)可以有效地回答这些问题,这为客户和公司带来了巨大的好处,因为它可以快速解决客户的疑问,并减轻客户服务团队的负担。 - 确保自动跟进将潜在客户转化为付费客户往往需要不止一次的接触。因此,跟进技巧对成功销售至关重要。然而,跟进的艺术并不适合所有人。许多人觉得无聊乏味。此外,跟进越快越有效,因为线索可能在几小时内枯竭,如果不是几分钟的话。自动跟进系统通过自动跟进潜在客户和付费客户来解决这个问题,而您只需做很少或根本不做任何工作。他们还在提高 CX 方面发挥着关键作用,在每次客户互动后都会发送客户服务调查,以揭示服务中的差距。
- 预测客户的行为
系统应该包含根据客户的行为预测代理所需的下一步行动的技术。它应该能够从每次交互中收集数据,并准备好处理预期的问题。然后,收集的信息可用于预测未来的客户问题、代理的响应和后续问题,从而通过采用预先计划的方法来增强客户体验。 - 拥有一个在自动代理和人工代理之间无缝传输的系统
实时聊天和自动支持之间应该有一个联盟。标准化的回答不能解决每个客户的问题。人类输入的整合对系统的成功至关重要。
Seamless transfer between the automated and human agent is essential to address all types of customer concerns
- 开发信心评分机制 该机制可以评估客户对自动化系统的感受和信心。人工智能系统应该知道顾客什么时候不高兴和不满意,这样就可以把行动转向人类。
- 为每个客户准备一个可更新的知识库
应该有一个知识库,它可以在每次客户互动后自我更新。更新的信息理想地包括顾客的位置、身份、过去的购买和偏好,这使得系统更擅长迎合顾客的特定需求,并且帮助管理员组织和管理内容以及控制用户的访问。 - 征求反馈
自动化不是一件容易的事情。它需要定期测试并根据反馈进行改进。寻求反馈会让顾客感到受到重视,并帮助企业想出更好的方法来服务顾客。
虽然客户服务自动化承诺了高利润、增加的客户满意度和最大的生产率,但是它仍然不能用于处理特定和复杂的情况。尽管人工智能是一项超级智能的技术,但如果处理不当,它可能会导致客户不满。因此,企业家应该能够区分自动化可以胜任的任务和需要人工协助的任务。
自动化客户服务时,企业不应
- 更换一个系统;相反,自动化系统应该与客户服务代表合作。它不可能回答客户的所有问题。因此,系统应该知道什么时候需要人工输入,什么时候不需要。
- 依靠一个渠道 客户通过各种渠道联系公司客服。这是他们的选择,给他们这样做的自由。一个公司的自动化系统应该能够从多个渠道而不是一个渠道提取重要的客户信息,所有的自动化渠道应该相互连接,并与销售代表连接。
- 使用自动化解决复杂的支持问题 自动化系统可用于解决简单的客户问题,如账单、采购和产品查询。有时问题过于复杂,人类的参与对于理解、协商和解决问题变得至关重要。
- 接受过时的系统
系统应定期更新和维护,以避免对客户作出多余和不相关的回应。如果客户服务成功实现自动化,经理们就可以把时间花在企业的其他核心活动上。
一锤定音
客户服务自动化(CSA)是一个不可思议的工具,它保证了高利润、增加的客户满意度和最大的生产力。遵循上面提到的原则,它可以发挥最大的潜力。然而,如果管理不当,CSA 会给企业带来弊大于利的影响。自动化最有益的用途是在人工智能和客户服务中的人工支持之间取得平衡。
使用 Mongoose 处理大数据的严重错误
介绍
在 NPM 宇宙中,mongose 是一个非常受欢迎且做得非常好的库。基于其模型-模式结构,它被许多优秀的程序员广泛使用。事实上,在 Google 中粗略地查看许多使用包含 MongoDB 的数据模型创建任何类型的堆栈的示例,您会发现作者在他们的开发结构中大多包含 Mongoose。这是一个受人尊敬、保存良好、非常受欢迎的图书馆。以上所述都是事实,作者的高超技巧和对社区需求的理解值得称赞。
以上不是免责声明,也不是愤世嫉俗的说法。事实上,我已经推迟了这篇文章的发布很长时间,因为我认为它可能不会被 MongoDB 社区很好地接受。然而,Mongoose 的本质,它迫使人们对数据做什么,以及它如何迫使程序员思考,才是本文的重点。 我充分意识到,在这里写的东西可能会在当前的 NodeJS — NPM 社区中非常不受欢迎。然而,根据我自己职业生涯中最近发生的事件,是时候解释为什么在几乎所有真正的大数据场景中都应该避免使用 Mongoose 了。让我把这个说法说得更严厉些。这也是我真正鄙视在 NodeJS 中使用 Typescript 的原因。这也迫使变量在进入系统之前被输入。
NoSQL 数据库背后的想法
对 NoSQL 应该做什么的任何简单理解是,它是以这样一种方式构造的,即获取少量或大量数据并将它们存储在集合或数据存储中。无论您希望如何称呼您的数据库,事实仍然是数据本身在存储时就是“数据”。现在还没有,将来也不应该在数据存储中局限于这样的想法,即数据的每个方面都必须符合预定义的结构。当然,对许多人来说,当存储诸如名称之类的东西时,确保名称是一个“字符串”似乎是完全有意义的。或者,当我存储一个数量时,确保该数量存储为“数字”是完全有意义的。
然而,大数据系统不仅仅是存储姓名、地址和选择。它们是关于获取一个人可能获得的关于手边物品的每一条信息,并且能够以你希望的任何方式储存这些信息以备后用。的确,在这里需要注意的是,获取数据的整个理念已经发生了变化。没有任何模式或一致性过滤的数据本身不再是目标。我们的目标是获取数据并应用于您正在使用的任何引擎或代码库,以这样一种方式对其进行过滤,使其可行,并可能成为您公司感知财富中最重要的武器库之一。
NoSQL 从传统的 SQL 数据库发展而来,以避免对触发器、传统关系甚至主键的需求。它之所以发展,是因为数据变得如此庞大,而且在传统格式中没有定义,以至于人们需要一种不同的方法来将数据视为一个整体,并将各种数据连接起来。
简而言之,NoSQL 是非线性思维的一种形式,注入和取出数据。**NoSQL 的要点是,在信息进入数据库之前,你不应该“键入”信息。**当你拿出它来获取信息时,你就可以输入信息了。这是通过智能聚合、算法、理论构造来实现的,所有这些都基于你所寻找的模式和信息。
线性思维
为了保护 Mongoose 用户,他们通常在 SQL 世界中接受训练,在 SQL 世界中,每一项都有一个特定的结构,一个系统是相关的(关系数据库),基于主键、关系和触发器。这是典型的线性思维。它对诸如姓名地址之类的小事情非常有用。数据库、博客帖子、书评等。我相信这里可以举出数百万个例子。我自己,使用 MySQL 和 PHP 已经很多很多年了。它过去是,现在仍然是一个优秀的系统。事实上,您将在任何搜索中找到的大多数示例,甚至是 NodeJS & MongoDB 的完整系统都会利用这样的场景,包括 Mongoose。
然而,它迫使人们以线性方式思考。它强制线性规划。它从步骤 1 到步骤 2 到步骤 3 等等。当然,在 MySQL 系统中有 blob 或巨大的文本字段,但是这些需要大量的编码和准备工作,以便提取准确的所需信息。如今,传统的 MySQL 系统不是为大量实时数据需求而构建的。
MySQL 的本质就是反对使用大量“非类型化”数据。
毫无疑问,今天它提供了允许非结构化数据的能力,但是表、触发器和关系的本质是建立在结构之上的。
更有甚者,MySQL 结构会变得异常复杂。表 A 转到表 B,然后触发表 C 中的关系,然后从表 D 中获取信息,然后表 D 必须对表 E 进行排序以检索信息。这个链条实际上可以有 20-30 张桌子。它不仅混乱,而且对于不经常在结构顶部的任何人(DBA)来说,保持它的正确性几乎是不可能的。
然而,即使在这种情况下,主要原因是它们根本不是为这些天来出现的非结构化数据而构建的。
猫鼬结构
因此,这是有道理的,人们会被 Mongoose 所吸引,以便对正在收集的数据应用某种结构。更重要的是,因为 Mongoose 作为一个中间件与 Express、Passport 等配合得非常好。并且它以正常的方式提供了到 MongoDB 所需的连接,在没有清楚地考虑整个系统应该做什么的情况下,人们自然不应该忽略它。在模式模型系统中,人们可以传递几乎任何类型的函数来实现真正的 CRUD。它还允许回调、承诺和 ES6。以上都很棒。
然而,有一个警告。按照 Mongoose 的工作方式,您必须以典型的 JSON 格式定义(键入)信息的性质。在实际情况下,尤其是对于大量数据,任何有经验的数据分析师都会告诉你,这样的模型不仅对数据本身非常不利,而且几乎不可能实现。
在数据进入数据库之前输入数据
在数据最终进入您的集合之前对其应用类型的本质,意味着您确切地知道什么类型的数据正在进入,什么类型的数据正在进入。无论是任何类型的字符串、数字或任何状态。同样,这也适用于小型系统的简单解决方案,在这些解决方案中,您专注于您 100%确定将获得的特定数据。但是在实时实例中或者在接收 JSON 包中的数据时,有时信息不在那里或者突然出现一个额外的键值,会发生什么呢?或者,当您在处理医疗或保险信息时,必须从不同类型的数据中提取大量不同的数据,会发生什么情况呢?
当然,您可以争辩说,您可以返回并更改该集合的模式模型以包含这些更改。这使得一切都很好地包装在模型中,当然也很容易阅读。然而,它并不反映真实世界的场景,一个真正的大数据系统的模式模型将会非常复杂,同样,不仅需要 MongoDB 及其所有可能性的知识,而且可能还需要一个 DBA 来处理 Mongoose 设置。
再次出于错误的目的扩展中间件
任何 NodeJS 程序员都会告诉你,如果被问到中间件,Express 通常会在栈顶。路由,JWT,护照,头盔和许多其他人将继续堆栈。无论你设计得多好,都很容易迷失在这样的堆栈中。我见过 package.json 文件,其中使用的 NPM 模块数量之多令人震惊。也许所有这些都是需要的,老实说,我是一个真正的 NPM 信徒。但是,栈就是栈。中间件没有被正确引入,或者引入的顺序不对,会严重降低系统的运行速度,或者使系统无法运行。除了在数据上强制输入类型之外,您正在处理的系统可能反应更快,延迟更少,最重要的是对非格式化数据的拒绝更少。
结论
我想重申,猫鼬的创造者们做了一件令人难以置信的工作。他们还允许 SQL 程序员加入 NoSQL 的世界,而不需要对他们思考数据的方法进行重大改变。此外,对于小型系统,Mongoose 可能是个不错的选择。
然而,如果您真正在处理复杂的大数据场景,或者来自各地的实时数据包,其中值、类型和信息可能会随着数据包的不同而变化,那么 Mongoose 应该被排除在您的等式之外。您必须掌握 MongoDB 的所有细微差别,包括 MapReduce、aggregation 等。CRUD 不再仅仅是 CRUD。在大数据系统中,它远远超出了典型的 SQL CRUD 类型的操作。这需要对大数据的真正本质有更多的了解,而不仅仅是旧的名称-地址-电话;登录并接受某种类型的书面数据。当您超出这个范围进行开发时,我的建议是将 Mongoose 放在一边,使用 MongoDB 原生构造创建一个函数库。避免使用 Mongoose 的中间件,不管你对它有多了解。最终,这样的系统 Mongoose 会拒绝没有输入的信息,你会丢失它。这在大数据场景中可能是灾难性的。
选择权在你,显然这是一篇观点文章。如果您正在开发真正的大数据系统,我简单的拙见是,不要考虑 Mongoose。不要“键入”(阅读:预定义)你的信息。不要对进入你系统的东西设限。获取您可能获得的所有数据,然后通过正确的算法和对原生 MongoDB 命令的操作,您将能够实现不仅收集数据而且通过任何可能的方式找到模式和连接的目标。这允许灵活性和非线性思维过程。这就是 NoSQL 被创造出来的原因。
关于作者:Ted Gross 担任 CTO 多年,擅长数据库技术、NodeJS、MongoDB、加密、PHP 和 OOP。他擅长虚拟世界技术和增强现实。他还发表了许多关于技术主题的文章,特别是关于大数据和混沌理论的文章(在专业期刊和在线@ Medium & LinkedIn 上)。他也是文学小说、儿童书籍和各种非小说文章的作者 。他的短篇小说集 【古代故事、现代传说】 获得了极好的评价。
可以通过电子邮件联系到泰德:tedwgross@gmail.com;推特(@ tedw gross);LinkedIn;中等
有史以来最简单的 GitHub 教程
对于那些对 Git 和 GitHub 不放心的人,我制作了这个超级简单的教程来入门并了解 Git 和 GitHub 的优势可以是什么。
通过这五个超级简单的步骤,你将对 GitHub 有一个非常基本但非常重要的理解。
这是一个实用教程。如果你想更深入地了解 GitHub,可以在这里查看我的另一篇文章: 在开始使用 GitHub 之前你需要知道的一切 。
1.在 GitHub 上创建一个资源库
转到 GitHub.com,点击“创建存储库”。
给你的存储库一个名称和描述。
选中用自述文件初始化此存储库复选框(自述文件是一个简单的文本文件,您可以在其中放置有关当前项目的信息)
然后单击“创建存储库”。
2.将存储库克隆到您的本地 pc 上
我处理你的代码,你需要把这个库放到你的电脑上。这是通过克隆它来实现的。
最简单的方法是通过 GitHub 桌面。
Cloning a repository through GitHub Desktop
当你这样做的时候(当然你应该已经安装了 GitHub 桌面),你会看到下面的屏幕:
选择正确的位置并克隆您的存储库。
你现在可以在你的电脑上找到它。
3.将代码文件添加到您的存储库中
对于这一步,忽略 GitHub。只需在您的 pc 上浏览到您克隆存储库的位置,并创建一个测试文件:
将文件命名为“testfile”:
在其中输入一些文本并保存文件:
4.提交并推送代码
我们的库现在已经改变了,我们应该把新版本更新到 GitHub。
回到 GitHub 桌面,看到它已经注意到你改变了一些东西:
上传代码需要采取两个步骤:
首先,键入一个类似“Create testfile.txt”的小注释,然后单击“Commit to master”。
其次,点击“推送原点”:
5.验证 GitHub 上的代码是否已更改
已经完成了!为了验证它是否真的有效,您现在可以在 GitHub 上看到您的更改。只要进入你的库的 GitHub 页面,你就会看到代码已经改变了!
您刚刚迈出了 GitHub 世界的第一步。当然,还有更多需要了解的,敬请关注。感谢阅读!
有史以来最简单的 Python Numpy 教程
馅饼很好吃!
Pie
想获得灵感?快来加入我的 超级行情快讯 。😎
Python 是迄今为止最容易使用的编程语言之一。编写程序是直观的,阅读代码本身也是如此——这几乎就像简单的英语!
Python 最大的优势之一是它源源不断地提供强大的库。为了提高速度,这些库至少有一部分是用 C / C++编写的,而且为了方便使用,还在上面加了一个 Python 包装器!
Numpy 就是这样一个 Python 库。
Numpy 主要用于数组形式的数据操作和处理。它的高速加上易于使用的功能使其成为数据科学和机器学习从业者的最爱。
这篇文章将成为学习如何使用 Numpy 的代码教程——有史以来最简单的一篇!
创建数组
Numpy 提供了几种创建数字数组的方法。如果您有一些自定义数据,可以通过numpy.array()
函数手动完成,或者使用一个内置的 Python 函数来创建更标准的东西。
获取数组信息
一旦创建了数组,就可以检索它的一些基本信息。因为数组已经作为 Numpy 数组加载,所以可以直接使用数组的属性。
基本算术
每当您希望对您的数据执行任何种类的数学运算时,Numpy 将是一个极好的选择。Numpy 可以执行几乎所有的基本数学运算,这些运算通常应用于其他 Python 对象(列表、集合等)——但是速度更快!
Numpy 的许多数学函数都是用优化的 C 代码编写的,这比你在那里找到的任何其他 Python 实现都要快得多。
数组切片和整形
切片是一种非常常见的 Python 操作,对于 Python 列表来说相对容易。但是当你试图在大的多维物体上做切片时,事情就变得混乱了。
Numpy 为所有 Numpy 阵列提供了非常简单直观的切片功能,从而扭转了局面。
更多有趣的提示和技巧
一旦掌握了 Numpy 的窍门,就可以开始探索它的一些更高级的功能了。这将使您能够完全控制您的阵列,从而轻松处理它们。
我在下面展示了其中的一小部分。更多内容可以在 Numpy 写得很漂亮的参考页中找到。
喜欢学习?
在 twitter 上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!也在 LinkedIn 上和我联系吧!
评估 Python 中交易策略性能的最简单方法
Source: unsplash
了解如何用一行 Python 代码生成全面的性能报告!
这是 Python 中回溯测试交易策略系列文章的第三部分。之前的文章描述了以下主题:
这一次,本文的目标是展示如何使用名为pyfolio
(由zipline
的创造者 Quantopian 开发)的库快速有效地评估我们的策略的性能。pyfolio
可以作为一个独立的库使用,只根据一系列的回报提供性能结果。然而,它与zipline
一起有效地工作,我在本文中介绍了这种组合。
简单移动平均策略
在本文中,我只展示了一个基本策略,因为主要重点是评估性能。为此,我选择了基于简单移动平均线(SMA)的策略。该战略的逻辑可以总结如下:
- 当价格向上穿过 20 日均线时,买入 20 股
- 当价格向下穿过 20 日均线时,卖出所有股票
- 我们在任何时候最多只能有 20 股
- 策略中没有卖空
我使用 IBM 2016 年至 2017 年的股票对该策略进行了回溯测试。关于如何创建这样一个策略以及特定组件实际上做什么的细节,请参考我的上一篇文章。
我首先加载所需的库:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import zipline
import warnings
import pyfolio as pf
然后,我运行策略:
zipline
自动创建一个性能数据帧,您也可以在代码的输出中看到。为了方便起见,我将输出存储在一个名为simple_moving_average.pkl
的 pickle 文件中。为了尽可能平滑地进行分析,我们可以使用pyfolio
提供的效用函数,加载业绩数据框架中最重要的 3 个元素——回报、头寸和交易。为此,我使用了pf.utils.extract_rets_pos_txn_from_zipline
。
sma_results = pd.read_pickle('simple_moving_average.pkl')
returns, positions, transactions = pf.utils.extract_rets_pos_txn_from_zipline(sma_results)
我们现在可以检查提取的元素:
returns.head()
2016 年的前 20 个交易日可能不会有回报,因为目前仍是均线的预热期。
positions.head()
positions
数据框架包含我们在考虑的资产中有头寸的每一天的条目,并显示股票和现金之间的资本分割。我们可以看到,通过购买 20 股 IBM 股票,我们仍然以现金形式持有大部分资本。对于更高级的策略,我们可以通过使用order_percent
为每个订单分配一定比例的资金。
transactions.head()
transactions
数据框架包含交易策略执行的所有交易——我们看到买卖订单。
简单撕纸
为了评估策略、投资组合甚至单个资产的表现,我们使用pyfolio
来创建一个模板。样张是一种简洁的文档(通常是单页的),包含关于上市公司的最重要的信息,如财务指标。pyfolio
提供的功能比一张纸所能包含的要多得多,但为了简单起见,我们从一张简单的便笺开始,它只包含最重要的信息。
为了创建它,我们运行以下命令:
pf.create_simple_tear_sheet(returns)
``pyfolio`'真正了不起的地方在于它只用一行代码就产生了如此多的信息!
我们看到的第一个表格显示了测试的日期、持续了几个月以及许多财务指标,例如:
- 年回报率/标准差
- 偏斜度-第三个矩描述了分布的偏斜程度
- 峰度——第四个矩表示分布的尾部是否有更多的质量
- 夏普比率——一个非常受欢迎的风险指标。它表示每单位风险(用标准差衡量)的超额收益(超过无风险利率)。
- Sortino 比率——夏普比率的修改版本,其中标准差被下行偏差取代。下跌背离只衡量系列的负波动性,严格来说,低于一个预定义的水平,称为最小可接受回报。
- ω比率——另一种风险回报绩效指标。与夏普比率相比,它最大的优势在于——从结构上来说——它考虑了所有的统计矩,而夏普比率只考虑了前两个。
- 最大压降—表示波峰和波谷之间的最大压降(以百分比表示)
- 每日风险值——另一个非常流行的风险指标。在这种情况下,它表明在 95%的情况下,我们将头寸/投资组合多保留 1 天,损失不会超过 0.5%。
前 3 个要点与资产回报的程式化事实有关,我在之前的一篇文章中描述过。
下一张图展示了我们策略的累积回报——我们可以观察我们的投资组合在实施这一策略的两年中的价值演变。平稳期代表我们不持有资产的时期。
我们还可以看到滚动夏普比率,这为我们的战略稳定性提供了更多的见解。我们看到报告的总体夏普比率为 0.84,但是,当我们查看滚动比率时,我们会看到它随时间的波动性(使用滚动 6 个月的数据计算,而不是整个样本!).
最后一张图表——水下图——从悲观的角度展示了这项投资。我所说的悲观,是指它专注于亏损。它描述了提款,并显示了投资组合的价值在遭受损失后恢复到之前的峰值需要多长时间。这个图表很容易区分正常和长期的损失。
我们通过只将returns
对象传递给函数来创建所有这些图。我们还可以通过之前提取的头寸和交易,在简单的撕单上自动接收更多信息!此外,我们还可以指定一个live_start_date
,它将时段分为回溯测试时段和实时交易时段(zipline
提供了这种可能性)。为此,我们只需运行:
pf.create_simple_tear_sheet(returns, positions, transactions, live_start_date='2017-01-01')
在下表中,我们可以立即看到变化:
- 有两个独立的分析阶段
- 提供头寸和交易相关数据会产生额外的指标,如总杠杆和额外营业额
简单的撕页还包含更多与头寸和交易相关的图,但是,为了简洁起见,我没有显示它们。
全撕裂片
在上一部分中,我们只创建了一个简单的模板,它给出了策略性能的简明概述。通过创建完整的样张,可以轻松获得更多信息(样张的详细程度也取决于所提供的信息,此处我们仅使用退货)。
pf.create_full_tear_sheet(returns)
我在完整的样张中展示了一些新的表格/图表:
- 一个表格,列出了 5 个最严重的亏损,以及峰谷日期和持续时间等信息
- 累积回报之上的前 5 个提款期。在我们的案例中,提款期几乎涵盖了整个投资期。其中一个原因是,在很长一段时间内,我们没有未平仓头寸,因此累计回报没有变化,从而延长了恢复时间。
- 一个简单的图表显示了一段时间内的每日回报。平坦期反映了我们在标的资产中没有头寸的时期。
- 通过将策略回报细分为:月度回报(每年分别计算)、年度回报(每年),一个呈现月度回报分布的直方图,以及以不同频率表示的最终回报分位数,对策略回报进行了汇总。
结论
在本文中,我展示了如何使用pyfolio
轻松获得大量描述资产/战略/投资组合表现的财务指标和图表。这篇文章给出了一个高层次的介绍,但仍然有许多方面要涉及。
pyfolio
的其他一些功能包括:
- 无需创建简单/完整的分析表,即可手动访问图表——例如,我们可以通过运行
pf.plot_drawdown_periods(returns, top=5)
来创建一个“前 5 名最差提款图表” - 我们可以在创建样张时考虑滑动
- 创建贝叶斯活页(基于 PyMC3,需要安装独立的依赖项)
Quantopian 还发布了一个名为empyrical
的库,用于计算pyfolio
中使用的所有风险指标。使用它的一个可能的好处是当我们纯粹对计算一个度量感兴趣时,比如欧米伽比率或索提诺比率。如果是这样的话,我当然推荐empyrical
做这个任务。
Quantopian 创建了zipline
、pyfolio
和empyrical
这样的综合库,值得称赞!
一如既往,我们欢迎任何建设性的反馈。你可以在推特上或者评论里联系我。您可以在我的 GitHub 上找到本文使用的代码。
以下是该系列的其他文章:
我最近出版了一本关于使用 Python 解决金融领域实际任务的书。如果你有兴趣,我贴了一篇文章介绍这本书的内容。你可以在亚马逊或者 T21 的网站上买到这本书。
参考
- https://github.com/quantopian
- 【https://www.youtube.com/watch?v=BCLgXjxYONg 号
使用 MLRun 跟踪数据科学实验的最简单方法
我遇到的几乎每个客户都处于开发基于 ML 的应用程序的某个阶段。有些才刚刚起步,有些已经投入巨资。看到数据科学这个曾经常用的时髦词汇如何成为几乎所有公司的真正战略,真是令人着迷。
在下面的文章中,我将解决客户一再提出的挑战之一——运行和调优实验跟踪。通过一步一步的教程,我将涵盖复杂性问题,并展示如何用 MLRun 解决它们,ml run 是一个新的开源框架,它优化了机器学习操作的管理。
MLRun 是一个开源框架,它为数据科学家和开发人员/工程师提供了一个通用且易于使用的机制,用于描述和跟踪机器学习相关任务(执行)的代码、元数据、输入和输出。
MLRun 跟踪各种元素,将它们存储在数据库中,并在单个报告中显示所有正在运行的作业以及历史作业。
数据库位置是可配置的,用户可以根据标准运行查询来搜索特定的作业。用户在本地 IDE 或笔记本上运行 MLRun,然后使用横向扩展容器或函数在更大的集群上运行相同的代码。
安装 MLRun
安装 MLRun 库,运行 import 命令并设置 MLRun 数据库的路径:
!pip install git+https://github.com/mlrun/mlrun.gitfrom mlrun import new_function, RunTemplate, NewRun, get_run_db
import yaml
import pandas as pd
# set mlrun db path (can also be specified in run_start command)
%env MLRUN_DBPATH=./
关键要素
- 任务(运行)-使您能够定义运行所需的参数、输入、输出和跟踪。可以从模板创建运行,并在不同的运行时或函数上运行。
- 功能—特定于运行时的软件包和属性(例如,映像、命令、参数、环境等)。).一个函数可以运行一个或多个运行/任务,并且可以从模板中创建。
- 运行时——一个计算框架。MLRun 支持多种运行时,如本地 Kubernetes 作业、DASK、Nuclio、Spark 和 mpijob (Horovod)。运行时可以支持并行和集群(即在进程/容器之间分配工作)。
在代码中添加 MLRun 钩子
为了捕获上面提到的数据,在作业本身中添加钩子。您可以跟踪作业的结果、模型文件或 csv 文件之类的工件、源代码、标签等等。
MLRun 引入了 ML 上下文的概念。检测代码以从上下文中获取参数和输入,以及日志输出、工件、标签和时序度量。
from mlrun.artifacts import ChartArtifact, TableArtifact, PlotArtifact
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd# define a function with spec as parameter
import time
def handler(context, p1=1, p2='xx'):
# access input metadata, values, and inputs
print(f'Run: {context.name} (uid={context.uid})')
print(f'Params: p1={p1}, p2={p2}')
time.sleep(1)
# log the run results (scalar values)
context.log_result('accuracy', p1 * 2)
context.log_result('loss', p1 * 3)
# add a lable/tag to this run
context.set_label('category', 'tests')
# log a simple artifact + label the artifact
context.log_artifact('model.txt', body=b'abc is 123', labels={'framework': 'xgboost'})
# create a matplot figure and store as artifact
fig, ax = plt.subplots()
np.random.seed(0)
x, y = np.random.normal(size=(2, 200))
color, size = np.random.random((2, 200))
ax.scatter(x, y, c=color, s=500 * size, alpha=0.3)
ax.grid(color='lightgray', alpha=0.7)
context.log_artifact(PlotArtifact('myfig', body=fig))
# create a dataframe artifact
df = pd.DataFrame([{'A':10, 'B':100}, {'A':11,'B':110}, {'A':12,'B':120}])
context.log_artifact(TableArtifact('mydf.csv', df=df, visible=True)) return 'my resp'
运行作业
具体到这个例子,我们在 Jupyter 中使用了一个内联代码。但是请注意,您也可以将其保存为 python 文件并运行。
接下来,定义任务及其参数,例如任务名称、输入参数、秘密文件(如果需要)和标签。
创建一个函数,指定命令(即我们的 Python 脚本)并将其分配给之前定义的任务。
作业完成后,它将显示作业运行时在 MLRun 跟踪数据库中捕获的信息。
task = NewRun(handler=handler,name='demo', params={'p1': 5}).with_secrets('file', 'secrets.txt').set_label('type', 'demo')
run = new_function().run
作业被捕获到 MLRun 数据库中。
使用超级参数运行作业
超参数非常重要,因为它们直接控制训练算法的行为,并对被训练模型的性能有重大影响。数据科学家通常希望用不同的参数运行同一个模型,以找出最适合的配置。
首先,创建一个模板(见下文),然后用 hyper_params 标志运行它。
在这种情况下,MLRun 跟踪每个正在运行的实例的信息,从而便于在不同的运行之间进行比较。
基于下面的示例,运行训练作业的三次迭代,每次使用不同的参数,并查看作业如何确定损失最低的迭代。
task = NewRun(handler=handler).with_hyper_params({'p1': [5, 2, 3]}, 'min.loss')
run = new_function().run(task)
查看作业结果
一旦工作完成,结果就会显示出来。单击“iteration_results”工件,打开一个包含详细信息的窗口。在我们的例子中,第二次迭代具有最低的损失分数,这被定义为我们的最佳拟合函数,因此显示为“最佳迭代”。
显示迭代结果
使用分布式框架(即 DASK)运行作业
现在,让我们在集群上运行相同的作业,作为大规模运行的分布式进程。你需要做的只是改变框架,而不需要改变任何代码。
在下面的例子中,我使用了 DASK 框架,它与 Iguazio 数据科学平台相集成,因此不需要 DevOps。
%%timeit -n 1 -r 1
run = new_function(command='dask://').run(task, handler=handler)
总结
如果您试图独自完成所有工作,运行和跟踪数据科学工作可能需要大量开发工作和劳动密集型任务。MLRun 提供了在您的笔记本电脑上本地运行任何作业的灵活性,或者以更简单的方式在大规模的分布式集群上运行任何作业。用户可以轻松运行报告来获得每个作业的详细信息,如果需要,可以使用所有工件和元数据重新生成和运行任何以前的作业。
欲了解更多关于 MLRun 的详情,请访问 MLRun 回购https://github.com/mlrun/mlrun
https://github.com/mlrun/demos
接下来的步骤
在 Iguazio 的数据科学平台上运行,可以挑选各种内置框架并大规模运行作业,从而在整个机器学习管道中提高性能并消除基础设施开销。
数据科学家实现高级数据可视化的简单方法
Show off your data’s true colors!
想获得灵感?快来加入我的 超级行情快讯 。😎
创建有效的数据可视化是数据科学家能够拥有的最有价值的技能之一。
可视化不仅仅是制作精美的图表,它还是一种以人们易于理解的方式交流数据集信息的方式。有了良好的可视化,人们可以最清楚地看到隐藏在数据中的模式和信息。
在项目的早期阶段,您通常会进行探索性数据分析(EDA ),以获得对数据的一些见解。创建可视化将有助于您加快分析速度。
在项目接近尾声时,能够以一种清晰、简洁、有说服力的方式呈现最终结果是很重要的,这样观众(通常是非技术风险承担者)才能理解。
毫无疑问:将你的可视化提升到一个新的水平将会增强你的分析——并帮助你在下一次演讲中脱颖而出。
这篇文章将是一篇关于如何轻松创建高级数据可视化的教程!我们将使用 plotly ,一个用于创建交互式可视化的 Python 库!
介绍 plotly
Plotly 是一个交互式的、开源的、基于浏览器的 Python 图形库!它构建在 D3.js 之上,使得它的可视化能力比标准的 Matplotlib 更加广泛和灵活。
与其他能够绘图的 Python 库(如 Matplotlib、Seaborn 和 Pandas)相比,使用 Plotly 有两个主要优势。这些是:
(1)易用性 —创建交互式绘图、3D 绘图和其他复杂图形只需几行代码。在其他绘图库中做同样的事情需要更多的工作。
(2)更多功能 —由于 Plotly 是基于 D3.js 构建的,所以它的绘图功能比其他绘图库要大得多。旭日图、烛台图、地图等等都可以用 Plotly 实现。点击查看完整列表。
我们可以用一个 pip 命令安装 Plotly:
pip install plotly==4.0.0
在本教程的剩余部分,我们将创建房价数据集的可视化,你可以从 Kaggle 中获取。
用 Plotly 制造奇特的情节
我们可以用 Plotly 创造一些非常奇特的情节!
首先,让我们导入plotly
及其内部图形对象组件。我们还将导入熊猫来加载我们的数据集
*import* plotly
*import* plotly.graph_objs *as* goimport pandas as pd
在我们的数据集中阅读当然只是熊猫的一行程序:
data = pd.read_csv('train.csv')
散点图
在本练习中,我们将在散点图中绘制销售价格与年度生产的对比图。为此,我们将创建一个 plotly Scatter
图形对象,并将其放入一个trace
。
trace = go.Scatter(
x = data['YearBuilt'],
y = data['SalePrice'],
mode = 'markers',
showlegend = *True* )
plot_data = [trace]
然后,绘图只是一行之遥!
plotly.offline.plot(plot_data, filename='basic-scatter')
上述命令将在您的浏览器中打开一个新的选项卡,其中包含该图。
还没有什么新奇的东西…但是你等着吧!
Plotly 自动内置了图形交互性。看看下面的 gif,看看它能做什么!所有命令都在浏览器的右上角:
- 悬停在每个点上会显示该点的 x-y 坐标
- 你可以放大某个数据框
- 您可以使用框或套索选择并高亮显示某些点
- 您可以平移整个地块以更好地查看事物
- 你可以下载一个图片文件!
箱线图
这次我们要做一个方框图。
过程也差不多。我们将创建一个 graph 对象,将其放入跟踪中,然后在浏览器中绘制它:
*import* plotly
*import* plotly.graph_objs *as* go
*import* pandas *as* pd
data = pd.read_csv('train.csv')
trace = go.Box(
x = data['YearBuilt'],
y = data['SalePrice'],
marker = {'color': 'green'},
showlegend = *True*,
)
plot_data = [trace]
plotly.offline.plot(plot_data, filename='basic-box')
看看下面的 gif 图,看看盒子图的一些奇特的 Plotly 特性!
默认情况下,我们获得相同的平移、缩放和点选择。由于我们现在有一个方框图,将鼠标悬停在每个方框上会显示:
- 中位数
- 第一和第三四分位数
- 数据范围的最小值和最大值
- 存在异常值时的上限和/或下限
热图
热图是任何伟大的数据科学家工具箱中的另一个强大工具。它们对于在一个图中显示多个特征变量之间的关系以及每个关系的相对重要性特别有效。
为了真正展示如何使用 Plotly 增强您的热图,我们将把房价数据集的相关矩阵绘制为热图。绘制数据集的相关矩阵是了解要素变量如何影响目标的一种快速简便的方法。
对于 plotly,我们将 x 和 y 设置为列名,将 z 设置为矩阵中的值。
在我们的浏览器中绘制这一切又是一件轻而易举的事情。
*import* plotly
*import* plotly.graph_objs *as* go
*import* pandas *as* pd
data = pd.read_csv('train.csv')
corrmat = data.corr()
trace = go.Heatmap(z=corrmat, x=corrmat.columns.tolist(), y=corrmat.columns.tolist())
plot_data = [trace]
plotly.offline.plot(plot_data, filename='basic-heatmap')
Matplotlib 中的热图可能有点棘手,因为您无法看到每个单元格的确切值——您只能从颜色中看出一点。您可以编写代码使其具有交互性,但这在 Matplotlib 中相当麻烦。
Plotly 为我们提供了开箱即用的交互性,因此当我们绘制热图时,我们可以获得直观的概览,但如果需要,还可以选择检查确切的值。Plotly 的平移和缩放功能也非常简洁,允许从视觉角度进行更详细的探索!
喜欢学习?
在 twitter 上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!也在 LinkedIn 上和我联系吧!
将 MaxMind GeoIP 与 Redshift 结合使用的简单方法
Photo by Westley Ferguson on Unsplash
它总是从一个无辜的观察开始。*“我们有很多来自波斯顿的流量,”*你的老板说。你自然会抛出一两个猜测,并讨论为什么会这样。直到你的老板扔下炸弹—
“你能深究一下吗?”
该死的。你直接走进了那个房间。
现在你陷入了困境。你知道谷歌分析有地理位置的流量,但这不会削减它。如果您想按地区报告这些保留率、生命周期值或重复行为,您需要可以用 SQL 查询的东西,即存储在您的数据仓库中的东西。但是你没有那样的东西。你知道在你的日志数据中有用户 IP 地址,你只需要把它们转换成位置。但是红移没有办法做到这一点。
你需要的是地理定位使用 IPs,又名 GeoIP。人们通常从 MaxMind 开始,主要是因为这是“GeoIP”的第一个谷歌搜索结果。我们将一起使用他们的 IP-to-City 数据集来丰富我们的日志数据,并确定我们的用户来自哪个城市和国家。我们将使用 MaxMind 数据,因为它可靠且稳健。而且是免费的。少了一件麻烦你老板的事。
所以我们去下载 MaxMind 的 GeoLite2 城市数据。打开 zip 文件后,我们发现了许多 CSV 文件,其中最重要的是GeoLite2-City-Blocks-IPv4.csv
。如果我们往里面看,这是我们看到的:
我们马上注意到一个问题——这个数据看起来像一个 IP,但在末尾有一个斜杠和一个额外的数字。这是一个用 CIDR 符号表示的 IP 网络,它表示一系列 IP。它由一个 IP、一条斜线和斜线后的一个数字组成,称为子网掩码。这就像你可以说“西 23 街 500 号街区”来描述纽约市的一条街道一样。
如果我们有网络1.2.3.0/24
,那就意味着“每个 IP 都以1.2.3.
开头,结尾是 0 到 255 之间的任何数字。换句话说,1.2.3.0
和1.2.3.255
之间的任何 IP。因此,如果我们观察到一个 IP 为1.2.3.95
的用户,它将属于网络1.2.3.0/24
,因此位于6252001
的geoname_id
。子网掩码可以是 1 到 32 之间的任意数字,数字越小,网络越宽。
如果这个 MaxMind 表是红移的,我们怎么加入它?红移不包括任何方便的 网络地址类型 喜欢现代 Postgres 或者 INET 函数 喜欢 MySQL。相反,我们将使用 IPs 背后的数学知识来自己完成这项工作。
你可以把一个 IP 看作是一个非常大的数字的一种奇特的表现。IP 1.2.3.4
其实只是引擎盖下的16,909,060
。类似地,IP 网络只是一系列非常大的数字。网络1.2.3.0/24
是从16,909,056
开始到16,909,311
结束的范围。我们将利用这一点。为此,我们需要一种将 IP 和 IP 网络转换为数字的方法。
使用 MaxMind 提供的 geoip2-csv-converter 工具,我们将把每个网络的整数范围表示添加到 csv 中。
注意,我用的是 20190108
版本。MaxMind 每周更新此数据集,因此您的版本可能会有所不同。
上传我们修改后的 CSV 到 S3,我们可以COPY
它变成红移。
现在让我们写一个函数把 IPs 转换成真正的大数字。这里有一个用 SQL 写的简单的。我们将根据做同样事情的 Linux 实用程序把它叫做inet_aton
。“inet”代表“互联网”,“aton”表示“ A 地址到tN号”。Linux 的人喜欢让事情简单明了。
我们需要做的最后一件事是加载 MaxMind CSV,它包含从geoname_id
到地球上实际位置的查找。为了加快速度,我们将 gzip 它,上传GeoLite2-City-Locations-en.csv.gz
文件到 S3,COPY
它到一个表。
红移优化的一些快速指针。对于像这样的小型、常见的连接维度表,我推荐使用DISTSTYLE ALL
。这将在集群中的每个节点上创建一个表的副本,从而消除了连接过程中的数据传输步骤。为了加快速度,我还将我们的连接列定义为一个SORTKEY
。
现在,我们拥有了使用 GeoIP 使用位置数据丰富日志所需的一切。几乎一切。
红移很难
如果我们将新的 MaxMind GeoIP 表加入我们的日志数据,我们将立即遇到问题。假设我有一些基本的访问日志,并尝试按流量计算前 50 个地区。
如果您运行了这个查询,您将会有一个糟糕的时间。你的查询将运行几分钟,你会开始出汗。与此同时,你的红移管理员将会寻找那个破坏她的星团的人。不要成为那样的人。
这个查询有什么问题?快速浏览一下EXPLAIN
计划,红移执行查询所采取的步骤列表,就知道了一切。
假设你经营一家冰激凌店,有数百万种美味的口味。如果排队的每个顾客都必须品尝每一种口味,然后才能选择一种,那会怎么样?如果我们试图使用我们的BETWEEN
join (taste-test)直接将我们的日志数据(客户)与 MaxMind 数据(口味)结合起来,就会发生这种情况。这导致了一个 嵌套循环连接这是让数据库哭泣的最快方法之一。
为了加快冰淇淋店的速度,我们将把它分成不同的区域——巧克力在这里,香草在那里,薄荷口味放在一个特别的地方。通过这种方式,顾客会前往符合他们偏好的区域。一旦到了那里,与之前相比,他们会品尝少量的味道。
创建优化的 GeoIP 查找表
我们将在 Redshift 中构建一个新表,它将取代针对 GeoIP 查找而优化的maxmind_ipv4_to_geo
。我们将使用 IPs 的前半部分将其组织成不同的部分,并将每个网络放入相应的部分。一些网络足够宽,以至于它们可以进入多个部分。这些部分的作用几乎就像一个数据库索引,允许 Redshift 缩小每个 IP 要检查的网络。使用一点小魔法,我们把我们的表转换成一个快速优化的表。
创建了查找表后,我们可以再进行一次分析。在我们的查询中,我们用maxmind_ipv4_to_geo
替换了maxmind_ipv4_lookup
,并添加了一个新的连接条件。我们将使用正则表达式REGEXP_SUBSTR(log.ip_address, '\\d+\.\\d+')
提取每个 IP 的前半部分,并将其匹配到表mm_geo.first_16_bits
中相应的部分。然后我们使用 IP 和网络的整数表示来检查它属于哪个网络。通过这种优化,我们的查询很快返回,看不到嵌套循环连接!
这样,你就可以开始分析了。您可以使用此查找表来连接到任何其他具有 IP 的红移。只要记住总是包括到first_16_bits
的连接,因为这是方法背后的魔力。
这种方法的灵感来自于我读过的一篇关于在网络设备中优化 IP 查找的论文。不幸的是,我再也找不到报纸了。这篇文章是将该解决方案移植到红移并迭代以简化它的结果。
感谢 Slack 激发了这篇文章,感谢 Julian Ganguli 编写了一些早期代码,感谢 Nick James 阅读了早期草稿。
在 Python 中使用 CSV、JSON 和 XML 的简单方法
想获得灵感?快来加入我的 超级行情快讯 。😎
Python 卓越的灵活性和易用性使其成为最受欢迎的编程语言之一,尤其是对数据科学家而言。其中很大一部分是因为处理大型数据集是多么简单。
如今,每家科技公司都在构建数据战略。他们都意识到,拥有正确的数据:有洞察力的、干净的、尽可能多的数据,会给他们带来关键的竞争优势。数据如果得到有效利用,可以提供在其他任何地方都无法发现的深层洞察。
这些年来,可以用来存储数据的可能格式的列表显著增加。但是,有 3 种在日常使用中占主导地位:CSV、JSON 和 XML。在本文中,我将与您分享在 Python 中使用这 3 种流行数据格式的最简单方法!
CSV 数据
CSV 文件是存储数据的最常见方式。你会发现大部分来自 Kaggle 比赛的数据都是这样存储的。我们可以使用内置的 Python csv 库读写 CSV。通常,我们会将数据读入一系列列表中。
查看下面的代码。当我们运行csv.reader()
时,我们所有的 CSV 数据都变得可访问。csvreader.next()
函数从 CSV 中读取一行;每次你调用它,它就移动到下一行。我们也可以像使用for row in csvreader
一样使用 for 循环遍历 csv 的每一行。请确保每行中的列数相同,否则,在处理列表时可能会遇到一些错误。
用 Python 写 CSV 也一样简单。在单个列表中设置域名,在列表列表中设置数据。这一次我们将创建一个writer()
对象,并使用它将我们的数据写入文件,与我们读取数据的方式非常相似。
当然,一旦你将数据读入一个变量,安装奇妙的 Pandas 库将使你的数据处理变得容易得多。从 CSV 文件中读取只是一行,将它写回文件也是一行!
我们甚至可以使用 Pandas 通过一个快速的命令行程序将 CSV 转换成字典列表。一旦您将数据格式化为字典列表,我们将使用dicttoxml
库将其转换为 XML 格式。我们还会将它作为 JSON 保存到文件中!
JSON 数据
JSON 提供了一种清晰易读的格式,因为它维护了一种字典式的结构。就像 CSV 一样,Python 有一个内置的 JSON 模块,让读写变得超级简单!当我们在 CSV 中阅读时,它会变成一本字典。然后我们把字典归档。
正如我们之前看到的,一旦我们有了数据,您可以通过 pandas 或使用内置的 Python CSV 模块轻松转换为 CSV。当转换成 XML 时,dicttoxml
库总是我们的朋友。
XML 数据
XML 与 CSV 和 JSON 有点不同。一般来说,CSV 和 JSON 由于简单而被广泛使用。作为一个人,它们读、写和解释起来既简单又快速。不需要额外的工作,解析 JSON 或 CSV 是非常轻量级的。
另一方面,XML 往往有点重。您正在发送更多的数据,这意味着您需要更多的带宽、更多的存储空间和更多的运行时间。但是 XML 确实比 JSON 和 CSV 多了一些特性:您可以使用名称空间来构建和共享标准结构、更好的继承表示,以及用 XML schema、DTD 等表示数据的行业标准化方法。
为了读入 XML 数据,我们将使用 Python 的内置 XML 模块和子模块 ElementTree。从那里,我们可以使用xmltodict
库将 ElementTree 对象转换成一个字典。一旦我们有了字典,我们就可以像上面看到的那样转换成 CSV、JSON 或 Pandas 数据帧!
喜欢学习?
在推特上关注我,我会在那里发布所有最新最棒的人工智能、技术和科学!也在 LinkedIn 上和我联系吧!
人工智能的经济和商业影响:现实,而不是炒作
Image by Michael Gaida from Pixabay
关于人工智能(AI)的辩论的特点是夸张和歇斯底里。
这种夸张是由于两种影响:首先,自利投资者对人工智能的推动。它可以被称为“谷歌效应”,以其首席执行官桑德尔·皮帅的名字命名,他宣称人工智能“可能是人类有史以来最重要的东西”。他会这么说。第二,技术传播者将人工智能作为解决人类根本问题甚至死亡的方法。它可以被称为“奇点效应,以雷·库兹韦尔命名,他认为人工智能将在 2045 年导致“奇点”。
这种歇斯底里同样源于两种影响:首先,来自 AI 构成现实威胁的警告。这可以被称为“埃隆-马斯克效应”,这是在一位亿万富翁企业家发推文称“国家层面的人工智能优势竞争最有可能导致 WW3 imo”之后。第二,来自人工智能可能通过工作自动化导致大规模失业的警告。这可以被称为“机器人效应”,源自马丁·福特的畅销书《机器人的崛起:技术和大规模失业的威胁》。
The Immediate and Imagined Impacts of AI © Wim Naudé
在最近的讨论论文中,我对谷歌-奇点-埃隆-马斯克-和- 机器人-效应进行了批判性调查,并认为缺乏支持夸张和歇斯底里的确凿证据。
早在 2013 年,据估计在 10-20 年内,美国 47%的工作可以自动化,在欧盟和发展中国家甚至更多。六年后,发达经济体的失业率事实上处于历史低位,而不是大规模失业。表明用于计算人工智能导致的潜在失业的方法对假设很敏感。此外,证据表明自动化在 1999 年到 2010 年间在欧洲创造了 150 万个新的工作岗位。
与此同时,我们看到劳动生产率增长持续下降。英国自 2007 年以来的十年平均劳动生产率增长是自 1761 年以来的最低水平。即使是从人工智能中受益最大的全球超级公司,也没有变得更有生产力。这让人对人工智能已经并将会显著提高生产力的说法产生了怀疑。
为什么机器人和谷歌效果没有实现?至少有三个原因:
首先,人工智能在经济中的扩散速度比大多数人想象的要慢。对 T2 的小公司来说,经济地实施人工智能尤其困难。成长中的伪 AI 就是这样的结果。《卫报》指出“很难建立一个由人工智能驱动的服务。事实上,这太难了,以至于一些初创公司已经发现,让人类像机器人一样行动比让机器像人类一样行动更便宜、更容易。
第二,AI 创新越来越难;它主要用于微调和瓦解现有产品,而不是推出全新的产品。玩谷歌的巴赫涂鸦可能很有趣,但它几乎不会提高生产率。应用机器学习(ML)的唾手可得的果实可能已经收获,收益递减似乎已经开始,最重要的是,ML 正面临可复制性危机。摩尔定律的终结可能就在眼前。
第三,鉴于大多数西方国家的消费者需求增长缓慢,企业投资人工智能无利可图。大多数人工智能创新都是在自动驾驶汽车的视觉系统中。尽管如此,自动驾驶汽车最引人注目的是它们没有出现在我们的道路上。这种情况可能会在持续很长一段时间,由于的技术原因,以及由于的沉没投资。
有人可能会说,仅仅因为人工智能的影响在过去很小,这并不排除大规模的影响在未来仍然会发生。也许机器人大战是不可避免的,因为人工智能的进步。这样的论调是基于对 AI 的误解。“人工智能”这个词本身就有误导性。现在的 AI,用 ML,并不智能。关于人工智能的一个笑话是:“当你筹款时,它就是人工智能。当你在招人的时候,就是 ML。当你实施时,这是逻辑回归”。有各种各样的理由怀疑非人工智能研究是否会很快产生超级智能,而不仅仅是目前人工智能应用的一招小马。
由于大肆宣传和歇斯底里,许多政府都在争先恐后地制定国家“人工智能战略”。全球治理组织争相采取行动。举行会议并发布关于“工作未来”的旗舰报告已经成为一种时尚。
联合国秘书长有史以来第一次发布了“新技术战略”,挑出包括人工智能在内的某些技术给予特别关注,其依据是“自动化、人工智能和机器人有望促进经济增长,但它们也可能加剧国家内部和国家之间的不平等,并可能导致失业”。受这一战略的启发,联合国大学政策研究中心( CPR )更进一步为联合国在人工智能领域的计划干预辩护,声称人工智能正在“改变地缘政治秩序”,更令人难以置信的是“智能机器和人类之间的力量平衡已经明显转变。其博客称为“政府间人工智能小组”,为“联合国领导的多利益相关方全球治理机制”。是的,它认为人工智能与气候变化具有同样的复杂性和重要性。还有许多其他人工智能夸张和歇斯底里导致疯狂提议的例子。
挑出人工智能由联合国、各国政府,甚至一个政府间人工智能小组来控制和监管,无助于将焦点转移到技术而不是真正的问题上。技术是一个“移动的目标”:想象一下,如果在第二次工业革命期间,一个政府间小组被召集起来“全球治理”电力会怎样?19 世纪晚期的电力案例实际上提供了相关的历史警示。正如卡洛琳·托马斯·德拉佩纳所述(第 113 页),某些地方爆发了歇斯底里:“末日预言是由那些害怕电力偏离他们感知的自然秩序的人做出的。牧师们特别倾向于这种观点……根据特纳主教的说法……从‘白人控制电力的发明’中有很多东西是令人恐惧的”。
政府对技术和创新的监管在最好的时候也充满了困难和意想不到的后果。当它建立在歇斯底里和夸张的基础上时,任务可能会特别成问题。当这样一个有问题的任务由全球政治机构承担时,他们的决定通常是在一个“无证据区”做出的,建议谨慎行事。
结果是,对人工智能的大肆宣传和歇斯底里导致了一场关于人工智能的“精神错乱的”辩论,现在正在鼓励令人窒息的法规以及人工智能“军备竞赛”。
这些后果可能会通过不适当的控制和公众信任的丧失来加速过早的人工智能冬天,不幸的是,此时世界需要更多而不是更少的技术创新,并需要这种技术更快地传播。
这篇文章的早期版本以全球商学院网络(GBSN)博客的形式发布,基于我在 GBSN 的同名网络研讨会。
延伸阅读:
瑙代,W. (2019)。与机器人的竞赛和巨型奶酪蛋糕的谬误:人工智能的直接和想象的影响, IZA 讨论文件第 12218 号。波恩:IZA 劳动经济研究所
设备故障的经济学
理解问题的经济学与理解数据科学一样重要
Image by Author
我职业生涯的大部分时间都在处理与销售和营销相关的问题。这意味着我大部分时间都在关注人类。有一件事我可以肯定地说。有时候人是完全理性和逻辑的。有时候人是完全完全完全完全不可理解的。
在过去五年左右的时间里,我有机会进入工业部门。在工业领域,主要关注的是优化机器,而不是人类。这肯定很有趣。
在工业领域,机器资产健康是一个持续上升的焦点领域。换句话说,我的资产或资产群有多健康?
资产的健康可以采取多种形式。有时它被表示为故障时间(离机器损坏还有多长时间)。其他时候,它表示为健康得分。例如,即将发生故障的机器的健康得分可能为 5,而不太可能发生故障的机器的健康得分可能为 100。
故障时间和健康得分通常来自预测故障或预期寿命的统计模型。显然这两者是有联系的。当然,它可以变化,但故障时间的估计通常是基于生存模型。资产健康得分通常基于逻辑回归或某种决策树模型(GBT 或随机森林)。
当谈到机器资产和机器资产健康时,我听到的主要问题是,“它什么时候会出故障”?由此,对话几乎总是转移到,“好吧,数据科学家先生,你能多准确地预测我的资产的失败?”有时候,这绝对是一个正确的问题。有时候不是。也就是说,有时你的主要精力应该放在故障预测上。有时候,应该是在“别的东西”上。
这个“别的东西”就是本文的重点。
线性规划绝对不是什么新鲜事。它和它的近亲非线性编程已经存在很长时间了。最近,我听说这两个概念被称为决策优化或规定性分析。说明性分析允许您根据某些标准优化资源。当我说优化时,我指的是最纯粹意义上的优化。我的意思是做出优化目标的决定。在商业世界中,这通常意味着做出一个能使收入最大化、成本最小化或利润最大化的决策。
规定性分析的经典例子是航空公司的机组人员排班。你如何将飞行员分配到路线上,以使你将乘客从 a 点运送到 b 点的成本最小化?再比如定价优化。比如一个公司可以收任何想要的价格,但是什么价格保证利润最大?
当我几分钟前提到“其他东西”时,我指的是决策优化或规定性分析。也就是说,在许多情况下,围绕管理机器资产的数据科学问题不是“我能多准确地预测故障?”相反,它应该是“我应该什么时候维护我的资产以最大化我的业务的整体盈利能力?”
我提到的另一个“别的事情”是“什么都不做”或“走向失败”。在这种情况下,事后描述故障的描述性解决方案或报告集可能就足够了。换句话说,有时你真的不需要担心预测性分析或规定性分析。你只需要让东西坏掉,然后修复它。
那么,你如何知道你应该更担心预测性、规范性还是描述性分析呢?当然,这取决于经济状况。
为了进一步探讨这个问题,让我首先定义两个与设备故障和维护相关的成本。
首先是存货成本。顾名思义,库存成本是保存机器替换零件的总成本。这显然包括物理存储项目的成本,但也包括存储项目的机会成本。例如,如果你为电视遥控器购买了额外的电池,并把它们放在一边,知道你最终会需要它们,那么机会成本就是如果你决定手头没有额外的电池,你可能会购买的糖果。当你做一个具体的消费决定时,它是你放弃的东西。
经理们的想法和行为会因手头上保留一个替换零件的成本而大相径庭。根据器件的不同,这一成本可能会有很大差异。如果一个替换零件的价格是 1 美元,那么在一个方便的抽屉里放几十个零件是有意义的。如果一个替换零件是危险的,可能真的会杀了你,大多数人都不希望它无限期地挂着。我是说,谁会想要一加仑危险化学品无限期地存放在休息室里呢?稍微不那么引人注目的是,如果一个零件价值 10 亿美元,让一群人无所事事可能没有经济意义。至少你可以把你的十亿美元存入储蓄账户并获得利息,对吗?
第二个成本是失败成本。故障成本是机器发生故障时的成本。这包括生产损失、诉讼费用、财产损失,甚至人员伤亡。
同样,故障成本会有很大差异。如果我的遥控器没电了,那就太烦人了。如果喷气式飞机的引擎失灵,人们就会死亡。
因此,库存成本和故障成本决定了管理机器资产的最佳分析方法。它们回答了你是否应该使用一种说明性的、预测性的或描述性的方法。
机器资产健康决策(MAWD)图表以非常简单的方式详细说明了从业者如何有效地平衡故障和库存成本。MAWD 图表清楚地表明了你的问题的经济学建议是描述性的、预测性的还是规定性的分析方法。请看下面的 MAWD 图表。
MAWD 图表的纵轴是库存成本的连续统一体。横轴是故障成本的连续体。
让我们从西南象限开始,我把它标为“1 区”。在这个象限中,故障成本和库存成本都很低。这是你的“运行到故障”区域,因为存储替换零件和故障是一个相对“哼哼”的经历。
西北象限是第二区。在这里,故障成本很低,但库存成本很高。在这个区域,重点应该是预测和预测分析。因为保持备用零件的成本很高,所以一个好的预测模型将让您知道资产零件何时可能出现故障。了解零件何时会出现故障,可以最大限度地减少更换零件在库存中的时间。
因为故障成本低,维护不是一个大问题。目标应该是运行到失败,但是使用预测模型来最小化库存成本。
第三区是东北象限。这里的库存和故障成本很高。这一领域的重点应该是预测性和规范性分析。您将需要预测分析来衡量您资产的健康状况并最大限度地降低库存成本,但这还不够。
在区域 3 中,由于故障成本很高,您将需要在更大的规范分析解决方案中使用故障预测,以确保您的资产永远不会出现故障。失败的成本越高,公司就越需要确保失败永远不会发生。当故障成本很高时,重点应该放在优化维护计划上,而不仅仅是预测故障。优化维护计划可让您以尽可能低的成本将故障降至最低。它确保一切都以利润最大化的方式完美运行。
例如,如果您当前每六个月维护一组资产,说明性分析可能会强调 10%的资产需要每五个月维护一次,而其他资产可以等待六个月或七个月。
更智能的维护意味着更少的故障和更高的利润。
同样,预测分析更有可能成为说明性解决方案的一部分。例如,维护决策将基于许多因素,包括对故障时间或资产健康状况的预测。
第四区是东南象限。这里的库存成本很低,但故障成本很高。在这种情况下,您可能再次需要预测性和规范性的解决方案。评估资产健康状况或故障时间的预测性解决方案。一种规范性解决方案,采用预测指标,并将其与其他因素相结合,以优化维护计划。与 3 区一样,4 区的重点应该是优化维护计划,而不仅仅是预测故障。
如果有人对你说,“嘿,数据科学家先生。你能多准确地预测失败?”你应该说,“你好,客户先生。在此之前,让我们先来探索一下您的机器资产的经济性。”
在进入预测模型之前,就问题的经济性进行对话,这将极大地提高客户参与的成功率。
数据科学的“教育冲击”
Credit — AZQuotes.com
让我们面对事实:数据科学的奇妙世界既可怕又令人敬畏。人们可能很容易陷入拟合同一模型的常规,而不是开发新模型,因为庞大的数据和统计世界缺乏舒适感。他们对一般的软件开发人员,甚至是全栈开发人员也有类似的说法。坐在大椅子上的男人称之为
“努力冲击”vs“回报冲击”
好吧,当你进入 DS 世界的深处时,准备好迎接大量的震惊吧。当你试图执行一项超出你能力范围的任务,并很快发现你在一艘正在下沉的船上,船上有充气救生筏时,不仅会出现标准的震惊,而且会对你的情绪健康产生额外的影响,比如我喜欢称之为:
“教育冲击”
数据科学最大也是最痛苦的特征之一就是它作为职业、学科和科学的扩张性。不需要太长时间,不管你的经验如何,找到一个你一窍不通的东西,学习一个新的东西。尽管这令人生畏,但对某些口味的人来说,这是他们的最佳选择。不仅是创业教育和努力的冲击非常强烈,而且很多财产会伴随你一生。但是我认为告诉你们这个故事,让我开始谈论它,是一个更有意义的写作方式。
我的故事
很多研究必须深入到不同机器学习方法的用例、优点、缺点和特性。因此,我经常在维基百科上寻找生活中最大问题的答案。你看,在我说我对某件事有深刻的理解之前,我喜欢至少对它背后的数学有一个宽泛的理解。
模型的有趣之处在于,总有一些细微的变化,这些变化有着超越其他模型的用例,并且这些模型之间存在着巨大的差异,这些差异在纸面上看起来非常简单。
回归在数据科学家中是一个家喻户晓的术语,从我们开始使用的调制线性函数到基于概率的分类回归器。嗯,在搜索回归信息的时候,我不得不承认无法学习数学回归的每一种数学方法。就在你去查看更多关于不同回归量的信息时,另一个你从未听说过的回归量不知从哪里冒了出来!随着围绕数据科学和机器学习的每一个方面的算法数量不断增加,任何人都不可能知道每一个回归变量、每一个分类器、每一个无监督模型,坦率地说…
这是不可能的
这实际上会让我感到沮丧,在这个知识每天都在变化的世界里,这不是一个好的做法。
个人成长
不管你在旅途中可能遇到什么样的“教育冲击”,你要带走的一件重要的东西是你自己的成长。就我上面的例子而言,我决定只研究几个算法,也许会考虑回来研究更多。我最大的收获是一个可能取代我最喜欢的模型的模型,随机森林分类器(多么伟大的模型,)保序回归。它背后的数学让我想起加权最小二乘法,只是更有趣,也更复杂。太牛逼了!
当一手拿着 Postgres 登录,一手拿着空白文本文件处理复杂问题时,发展你的知识库对于保持强大的精神状态是绝对必要的。了解您的数据和模型对于为您的用例找到准确的算法也是至关重要的。
快速变化
很多时候这可能是压倒性的,但我从来不喜欢以负面的内涵来思考快速变化。有时,整个语言从我们的生态系统中被弃用,因为一种新的语言对于数据科学来说更理想。执行新任务和解决每天快速产生的新问题的完整算法是以小时为基础开发的。这常常会让你感到失落。甚至对你三年来每天使用的软件包的更新也会让你感到有点失落,就像最近对 Tensorflow 的更新。
你认为未来二十年通用技术将走向何方?你认为今天的产品是如何实现这一目标的?
感觉一切都在慢慢变异成机器学习。现代正在开发一种机器学习算法,让你像开车一样开车,甚至不用动一下肌肉。谷歌正在使用机器学习在他们的 pixel 设备上使用较低百万像素的摄像头制作美丽的照片。这个世纪的话题是一个机器学习面部识别算法,只需看一眼就可以解锁你的手机!我的观点是,整个技术世界发展如此之快,因此,为了跟上,这就是速度。
“显著的相关性”
当我们谈论数据科学时,另一个问题是我们的好朋友“冒名顶替综合症”,用数据科学家书呆子的话说:“冒名顶替综合症和教育冲击之间的相关性的 P 值是 0.003。”冒名顶替综合症是不应该存在的事情之一。关于这种内部斗争的真相是,每个在任何领域从事数据科学的人都目睹了这种斗争。
没有什么好的理由让你觉得有义务不诚实地说出自己在哪里,从而阻碍自己的成长。事实是,我们都在那里,或者我们至少去过那里。要学的东西太多了,一百年的时间是不够的。埃德温·哈勃在证明他的宇宙膨胀理论之前就去世了,阿尔伯特·爱因斯坦去世时认为他在意外发现“重力波”时犯了一个数学错误,所以我想这个故事的寓意是
没有人是完美的,也没有人能做到。
接受现实吧
当你做我们做的事情时,适应性学习是关键。我已经成为对所有事情都使用相同模式的陈旧偏见的受害者,这真的阻碍了我的个人发展。重要的是不要给自己太大压力,也不要为小事而自责。数据很复杂,统计很难。他们不会无缘无故地把机器学习标榜为时髦词汇。数据科学是未来,通过了解这些技能并每天利用它们,我们就是未来。
计划性广告活动的有效性
Image by the author
在本系列的第一部分中,我们比较了在有限的时间范围内针对两种不同受众的活动的效果,以确定表现是否不同。
我们正在关注 10 月 10 日推出的横幅广告。这是通过针对不同目标群体的“程序化广告”(https://en.wikipedia.org/wiki/Real-time_bidding)开始的。
例如,在“金融”环境中:
Image by the author
或者在“职业”环境中:
Image by the author
蓝色是投放广告的数量,绿色是点击的数量。
在月底,我们将评估这两个目标群体中的哪一个在决定进一步的预算分配方面更有效。
哪个更成功?
过了那个时期,我们能有多确定我们的决定是正确的?
作为评估标准,我们采用每条广告的点击率(CTR)。
“金融”职位的 CTR 为 0.19%,“职业”职位的 CTR 为 0.17%。这可能表明在金融环境中投放广告更有效。然而,这两个图表还显示,这两个比率每天都有很大波动,这可能意味着这种差异是由于随机波动造成的,因此做出决定还为时过早。
我们能确定在“金融”环境中投放广告更好吗?有多确定?
为了回答这两个问题,我们必须对数据进行精确的统计分析。
我们用的软件“贾莫维”(www.jamovi.org),我已经报过。
我们有以下详细数据:
Datatable for the ads
仅仅看原始数据并不能让我们更接近问题的答案。统计有助于关键数字的计算、图形的创建和概率的计算。
使用“jamovi ”,我们可以一步完成示例中所需的所有计算:
T-test in jamovi / Image by the author
我们用 T 检验来检查我们的成对(每天)数据。同时,我们有描述性的数字,如平均值和标准差和一些图形。是否给出了数据正态分布的 T 检验的必要条件,我们也要检查。这是通过“夏皮罗-威尔克斯”测试和分位数图来完成的。
这给出了以下结果:
Results of T-test
以及以下情节:
Plots of the data / Image by the author
在我们的例子中如何解释这些结果?
第一个图显示,尽管两组的平均值略有偏移,但两个标准差范围明显重叠。这表明我们不能确定两个观众有不同的表现。
这可以通过计算 T 检验的“p 值”来证实。解释如下就是 0.227。目前的数据(它们的差异)纯属巧合的概率是 0.227。这并不意味着可能性很小。这向我们表明,我们不能肯定有不同的表现。只有在概率低于 0.05 时,人们才会谈论显著性,并拒绝一切都是偶然创造的观点。在这种情况下,人们会谈到目标群体的不同表现。
T 检验中“p 值”的计算是否基于正确的假设,即正态分布基本数据,还有待考虑。我们用两种方法做到了这一点,在第二张图中用图形表示,并通过计算“夏皮罗-威尔克斯”检验的 p 值。两者都表明假设得到了很好的满足,分位数图显示了近似在一条直线上的点,并且 p 值不是太小。
考虑另一个有两个观众的例子。
我们将广告放在“体育”环境中,与“金融”环境进行比较。
Image by the author
这种情况的平均点击率为 0.11%,因此低于“金融”环境。在这里,你能说有什么显著不同的表现吗?
让我们用同样的方式来检查一下:
Results second example
有了情节:
Plots second example / Image by the author
这些图显示了平均值的明显差异,从而显示了运动的有效性。这也用低于 0.001 的“p 值”来表示。这些数据极不可能只是偶然的产物。因此,在线广告在“金融”环境中的投放明显比在“体育”环境中更有效。
这里比第一个例子更好地满足了正态分布的基本要求。
在以后的文章中,我们将关注如何使用方差分析来同时分析多个受众,以及如何创建广告未来表现的预测(使用线性回归)。
计划性广告活动的有效性——第二部分
Image by the author
在系列文章的第一部分,我展示了如何使用统计测试来调查两个“程序化广告”(【https://en.wikipedia.org/wiki/Real-time_bidding】)活动的绩效数据是否有显著差异。用两个例子说明了程序,并讨论了结果。两个目标组的数据成对比较。
如果你想一次考察一些甚至很多目标群体,你需要另一种方法,即**方差分析【ANOVA】。与名字可能暗示的相反,主要不是比较单个数据序列的方差,而是平均值。**
在分析的起点,让我们看看几个目标群体的数据(每日点击数、每日广告数、点击率)。我将看一个有 5 个不同观众的例子。环境中的位置:
-金融(id 1)
-职业(id 2)
-体育(id 3)
-艺术(id 4)
-新闻(id 5)
软件“贾莫维”(www.jamovi.org)再次被使用。下表显示了不同目标群体的 CTR 数据。
CTRs for different audiences / Image by the author
第一列是所有日期和目标群体的 CTR,第二列是区分各个目标群体的因素。
这些问题是:
对所有目标群体来说,安置是同样成功的,还是个别群体更成功?
这些差异显著还是只是随机波动?
在" jamovi "中再次对所有设置进行分析,以检查数据分布的先决条件,并且重要的绘图可以在单个掩膜中进行。
ANOVA in jamovi / Image by the author
选择要检查的值(本例中为 CTR)和分组变量(此处为目标组),并检查数据的正态分布和单个目标组中方差的相等性。这里使用的是不等方差的 ANOVA。
Results from ANOVA
****结果表明,必须放弃目标群体中所有绩效平均值相等的假设。这具有很高的意义。这些数据纯属偶然产生的概率小于 0.001。
对于各组,还显示了平均值和标准偏差。
计算结果也得到曲线图的支持,曲线图显示了 CTR 的显著偏差,尤其是对于第 3 组(“运动”)和第 4 组(“艺术”)。在环境“运动”中的位置带来了较低的点击率,在环境“艺术”中的所有组中最好,但在数据中也具有高得多的分散性。
Plots for different audiences / Image by the author
对分析先决条件的检查产生了正态分布的正结果。方差相等的检验证实了存在不同方差的图的印象。因此,相应的设置用于分析。
Check of assumptions
因此,我们能够使用该分析来确定广告在不同放置环境中的不同表现,并确保显著性,还能够识别哪些组表现良好,哪些组表现不佳。在本系列的下一部分,我将介绍使用线性回归预测未来活动绩效的简单模型。
获得授权的数据驱动型组织
组织如何释放数据和分析的力量以获得竞争优势。
🔥在你继续阅读这篇文章之前,我想让你知道,几天前,我发布了一个完整的课程,帮助你提高你的决策技能,并在竞争中领先。
这是多年研究的成果,在有限的时间内可以免费获得。
👉如果你想用科学的方法做出更好的决定,这里有一个链接:https://smart-decision-makers.streamlit.app/
[/Announcement]🔥
为了从他们的数据中获得更多价值,除了雇佣新的人才来管理和利用这些新的资产之外,公司今天还参与了捕获大量内部和外部数据的过程。然而,很少有组织能够实现其数据和分析能力的全部潜力。一个主要原因是,数字化转型首先是人的转型,进行文化变革比获得新资产和新能力要难得多。
改变你的组织文化
组织文化塑造了人们如何协作和互动,如何决策,以及如何经营企业的方方面面。在数据驱动型组织中,数据和分析被视为从竞争对手中脱颖而出的机会。要做到这一点,组织中的每个人都应该能够利用他/她自己环境中的数据和分析。这需要获得相关数据,并让非专家也能使用人工智能算法。
在您的组织中民主化数据科学
然后,获得授权的员工可以通过几种可能的方式,利用可用的数据和算法进行协作和轻松试验,为组织创造价值:创造新的见解,促进数据驱动的决策,测试新的业务模式或优化现有流程。
例如,优步已经通过开发自己的数据科学平台走上了这条道路,该平台为公司的任何人提供经过验证的预测算法,只需按一下按钮(不需要预测专业知识)。https://eng.uber.com/building-ubers-data-science-platforms/
Data-science platform at Uber
数据科学平台的格局正在快速变化,Gartner(一家 IT 咨询公司)每年都会更新对大型参与者的全球看法,该公司沿着两个轴对数据科学和机器学习平台进行排名:愿景的完整性和执行能力。
The arrows illustrate shifts in major players’ positions in the Gartner Magic quadrant between 2018 and 2019.
即使许多平台仍然试图通过在其平台中推出更多更适合专家用户的高级功能来脱颖而出,您也可以注意到一种趋势,即向非专家数据科学家(也称为**“公民数据科学家】**)普及这些平台的使用。例如,DataRobot 作为一个有远见的人在 2019 年的 Gartner 魔力象限中出现,部分原因是它能够通过利用自动化机器学习领域的最新进展,简化公民数据科学家对机器学习算法的使用。
“让用户能够快速轻松地构建完全透明的高度准确的预测模型的能力,可能是任何成功的机器学习平台最重要的元素。唯一需要的成分是好奇心和数据——编码和机器学习技能完全是可选的!”数据机器人
改变您与数据的关系
很少有组织能够充分利用人工智能的第二个主要原因与整个组织如何管理数据有关。事实上,尽管现代数据科学平台使测试和比较数百种机器学习算法变得很容易,但对于许多组织来说,收集和准备正确的训练数据集来支持这些算法仍然是一个挑战。
Data preparation with Dataiku’s Studio
数据准备部分可能很耗时,但绝对不是拦路虎。数据科学家报告称,数据准备可能会占用一个项目 80%的时间。然而,数据科学平台正在提供越来越多用户友好的数据辩论能力。
另一方面,在整个组织中以一致的方式收集相关数据可能是一个真正的问题。在许多情况下,人工智能计划被停止,因为重要数据不可用或不可用。
为了说明这最后一点,让我们看看组织为他们的客户创造价值的方式。这通常通过几个相互关联的过程来实现(营销、财务、研发、制造、采购、供应链……)。当你从信息系统的角度来看这些过程时,我们通常会发现不同软件、数据库和 Excel 文件的拼凑,它们并不总是一致的,至少在数据的结构和存储方式上是如此。
组织试图解决这个问题的经典方法是启动大型数字化项目,部署新的信息系统并重组现有系统。这类项目通常风险很大,需要几年时间才能实现目标,而且非常昂贵,因此从数据和分析中获得任何竞争优势的机会被进一步推迟。
贝佐斯 API 指令
亚马逊在这一领域的做法值得一提:2002 年,亚马逊创始人兼首席执行官杰夫·贝索斯向他的员工发布了以下备忘录(后来称为“贝佐斯 API 指令”):
- 所有团队将从此通过服务接口公开他们的数据和功能。
- 团队必须通过这些接口相互交流。
- 不允许其他形式的进程间通信:不允许直接链接,不允许直接读取另一个团队的数据存储,不允许共享内存模型,不允许任何后门。唯一允许的通信是通过网络上的服务接口调用。
- 他们用什么技术并不重要。
备忘录以“任何不这样做的人都将被解雇”结尾。谢谢大家;祝你愉快!”。
如果我们抛开这份说明的专制方式,看看这种导向的后果,这意味着如果公司中有人需要从营销或组织中的任何其他团队获得信息,而不是通过电子邮件/电话联系他/她的同事并从数据库或简单的 Excel 文件中获得摘录。他/她现在可以使用编码的服务接口来获取数据。无论营销团队使用何种技术来管理和处理这些数据(从高级商业软件到简单的电子表格),他们都需要通过公司中任何人都可以使用的应用程序编程接口来公开他们的数据。
从人际关系的角度来看,这可能听起来很奇怪,但它有一个很大的优势,那就是无论组织中的信息系统有多成熟,都可以标准化数据的构造和共享方式。
根据亚马逊在 2019 年 Q2 的报告,亚马逊的子公司、提供按需云计算的 AWS(亚马逊网络服务)已经创造了高达 84 亿美元的销售额,占亚马逊总收入的 13%。
下一代平台
在我的研究中,我没有发现任何超出数据准备/数据建模阶段的数据科学平台。他们中的大多数人完全忽略了数据管理部分,并假设用户能够带来自己的一致数据集或连接到现有的数据库,同时管理所有的协作和安全方面。在本节中,让我们想象一种下一代平台,在这种平台上,用户可以无缝体验从管理数据源到利用人工智能算法为组织创造价值的过程。
为此,我们将讲述 Barbara 的虚构故事,她作为产品负责人在市场部工作。芭芭拉刚刚完成了一项客户满意度调查,她收集了数千名客户对公司正在开发的各种产品的反馈。然后,她想到将这些数据与每种产品的广告活动预算以及研发部门提供的一组产品特征进行合并,以找出哪些参数组合与客户满意度相关。
浏览数据目录
为了测试她的想法,Barbara 兴奋地连接到她公司刚刚部署的数据科学平台。她现在可以浏览组织中所有可用数据源的目录。这一次,Barbara 更喜欢询问集成聊天机器人她正在寻找什么类型的信息,然后机器人将她快速导向一个简短的有趣数据源列表。她浏览了列表,阅读了每个数据源的描述,并很快确定了她需要在分析中使用的数据源。
创建新的数据源
现在是芭芭拉将自己的数据集上传到平台上的时候了。一旦她上传了文件并为她的同事创建了内容的简短描述,系统就会自动识别出用于在调查中识别客户的列也是在其他数据源中使用的参考列。它建议芭芭拉将她的数据集与客户的参考数据联系起来。系统还建议 Barbara 删除已经在引用中的其他客户特定列,因为它们可能被视为重复。芭芭拉对所有这些建议都很满意;她得到保证,她的数据集将始终是最新的,并直接连接到组织中的其他数据源。
不要忽视大局
第二天,芭芭拉接到该部门数据架构师吉姆的电话。吉姆想确保芭芭拉在站台上找到路。Jim 的职责是确保组织的全球数据模型定义明确、一致,并被不同的用户充分理解。在谈到新平台时,吉姆经常说:“自从这个平台部署以来,我感觉自己就像是成长花园中的园丁。我们的全球数据模型每天都在变得越来越丰富,我们大大提高了数据质量和从所有正在进行的实验中学习的能力。”
安全性和协作
Barbara 已经将新的数据源设置为公共的,这样组织中的每个人都可以使用它。但是,如果有任何敏感数据,她可以只授予特定用户或组访问权限。
该平台还提供了多种协作功能,如开始讨论或为数据集中的特定元素添加评论的可能性。平台上的每个数据源,无论是手动加载的还是表示现有信息系统的,都可以使用标准化编程接口(API)来请求。
最终
- Barbara 能够测试她的想法,并确定用户满意度的一些关键驱动因素,这导致与产品开发团队进行了非常丰富的讨论。
- 由于 Jim 的参与,该组织的数据模型每天都在变得越来越丰富,同时保持了一个连贯的全局。
- 员工正逐步放弃 Excel 文件,转而寻求在线协作体验,这种体验放大了该平台的积极网络效应。
结论
总之,一个愿意利用人工智能的可持续竞争优势的组织需要:
- 成功创造数据驱动的文化,这将促进实验和数据驱动的决策。
- 利用数据科学平台的力量来普及机器学习算法和数据准备工具的使用。
- 通过促进数据访问和协作,同时确保数据的安全性和组织全球数据模型的一致性,使员工能够采取行动。
锚点的终结——改进对象检测模型和注释
入门
问题是
如果你曾经需要修补锚盒,你可能会感到沮丧、困惑,并对自己说:“一定有别的办法!”现在看来,是的另一种方式。
当我第一次写锚框的时候,我就有了绕过锚框,把对象检测问题变成语义分割问题的想法。我试着预测每个像素的每个类有多少个对象边界框*。由于几个问题,这给出了相当差的结果:*
1.我无法将分割遮罩还原成边界框。这意味着我不能隔离或计数对象。
2.神经网络努力学习对象周围的哪些像素属于边界框。这可以在训练中看到,其中模型首先分割对象,然后才开始围绕它形成矩形。
Examples from the Common Objects in Context (COCO) dataset¹
几个月过去了,已经有几款车型以更具创新性的方式抛弃了锚盒。
无锚点对象检测
CornerNet 预测每个像素的边界框的左上角和右下角以及嵌入。每个角的嵌入相匹配,以确定它们属于哪个对象。一旦你匹配了所有的角,恢复包围盒是很容易的。这解决了我所面临的问题:去掉锚框,同时能够从输出中恢复边界框。
然而,CornerNet 并没有解决我所面临的第二个问题,即网络必须知道在哪里定位一个甚至不包含对象的像素。这就是 ExtremeNet 的用武之地。这种方法是基于 CornerNet 的,但是它不是预测角,而是预测对象的中心以及最远的左、右、上、下点。然后,这些“极值点”根据它们的几何形状进行匹配,从而产生出色的结果:
释文
但是我怎么找到极值点标注呢?不幸的是,作者从分割遮罩中提取了极值点,如果您只能访问边界框,则该选项不可用。然而,极值点注释有几个优点:
1.标注对象的极值点比标注边界框要容易得多。要标记一个边界框,您必须目测与两个最极端点对齐的角的位置。通常,注释者必须在事后调整边界框,以便与极值点对齐。ExtremeNet 的论文估计,标注极值点所花费的时间几乎是标注边界框所花费时间的五分之一。
2.出于同样的原因,人类注释者更容易标记极值点,神经网络也应该更容易准确地指出它们的位置。目前,ExtremeNet 似乎优于其他单次检测器。
3.给定对象的极值点,生成边界框是很简单的。如果图像也包括在内,则可以使用右旋 ⁴算法来生成分割掩模。这使得极值点比边界框更加通用。
没那么快
在您将所有的对象检测系统迁移到 ExtremeNet 之前,请记住当前的实现既庞大又缓慢。预训练模型达到了最先进的结果,有近 2 亿个参数,占用 800mb。当我在 Tesla K80 GPU (p2.xlarge EC2 实例)上测试一批单个图像时,使用来自 GitHub 页面的 demo.py 脚本,每张图像需要大约 8 秒*。使用 DEXTR 创建分段屏蔽会增加 2-12 秒,具体取决于检测次数。如果您想要对来自多个图像比例的检测进行分组,则数量会进一步增加。在单幅图像上运行多尺度分割总共需要一分钟,尽管我认为这些数字可以通过优化代码来提高。CornerNet 声称在 Titan X (Pascal) GPU 上运行速度约为 4 fps,这也比现有的单次检测器慢得多。在我考虑将 ExtremeNet 作为大多数应用程序的可行选项之前,需要有一个既快速又准确的版本。*
结论
ExtremeNet 的论文声称,与所有其他单次检测器相比,其性能更为优越,同时无需仔细调整锚盒,然后对输出进行解码。即使没有这样的模型,注释方法本身也提供了显著的好处。该模型仍然没有像神经网络一样完全端到端地学习,并且包括多种算法来生成边界框或分割掩模。尽管如此,我非常希望在未来,极值点注释和模型成为对象检测的规范。
参考
[1]林,宗毅等.《微软 COCO:情境中的公共对象》计算机科学课堂讲稿(2014):740–755。交叉引用。网络。
[2]法、黑、加登。"角网:将物体检测为成对的关键点."计算机科学课堂讲稿(2018):765–781。交叉引用。网络。
[3]周、邢毅、卓家成和菲利普·克雷恩布尔。“通过组合极值点和中心点的自下而上的物体检测.” arXiv 预印本 arXiv:1901.08043 (2019)。
[4]马尼尼斯,K.-K .等人,“深度极限切割:从极限点到物体分割”2018 年 IEEE/CVF 计算机视觉与模式识别大会(2018): n. pag。交叉引用。网络。
所有模糊图片的终结
使用 GANs 的图像超分辨率综述和解释。
你能数一数这张图片里有多少只企鹅吗?
现在呢?
嗯,我把它放大了,但是还是很模糊…
那么,现在呢?
啊!我们来数数企鹅和它的一个完美的例子 图像超分辨率 在行动!
图像超分辨率是从低分辨率图片创建更好看、更高分辨率的图像。任何在 Powerpoint 演示文稿中放入图像的人都知道,缩小图像实际上会让它看起来更糟*。这是因为双三次插值用于放大图像:一种采用像素平均值来填充图像放大时产生的间隙的技术。*
How interpolation-based resizing/enlargement works. Source.
这样做的问题是没有新的数据被创建——这意味着你的图像在分辨率上没有变好,只是变大了。
无论你只是创建一个 powerpoint,分析乳房 x 光片,还是进行远程面部识别 — 超分辨率超都很重要。
那么我们如何做到超分辨率?好吧,我们转向——人工智能!我们已经看到了大量使用卷积神经网络的图像超分辨率的最新进展(点击查看我关于它们的文章,如果你想了解它们是如何用于超分辨率的,请点击查看)。但是,这仍然存在一些问题——图像看起来不如我们喜欢的清晰和详细,为了解决这个问题,制作了 SRGANs (超分辨率生成对抗网络——试着说一口气*)。*
Comparison of different SR methods. Zoom in to notice how crisp SRGAN is!
在进入超分辨率方面之前,这里有一个 GANs 的快速概述
生成对抗网络概述
“给定一个输入数据集,我们能生成看起来应该在该数据集中的新数据吗?”
想想一个伪造者在博物馆用赝品调换真画,而馆长的工作就是辨别真品和赝品。当它们都刚刚开始时,伪造者会犯很多错误,而馆长也不善于辨别真伪。
随着时间的推移,伪造者可以尝试不同的技术,并在制造假货方面变得更好,而馆长也找到了帮助他辨别假货的策略;他们都在通过彼此提高。
伪造者的目标是创造出看起来真实的艺术品,而策展人的目标是能够始终发现假画。
这两个角色相互竞争,代表了一个 GAN 中的两个网络。作为生成网络的伪造者创建新图像,而作为辨别网络的策展人评估来自生成器的图像看起来是否真实。
Outline of a traditional GAN being trained to generate handwritten digits. Source.
发生器接收随机像素数据(噪声),将其转换为假输出,在超分辨率的情况下,它会将随机噪声转换为更高分辨率的图像。
鉴别器在训练集和发生器图像上接受训练,学习区分它们。
那么为什么用 GAN 更好呢?
有很多其他方法可以实现超分辨率,例如 SRResNet 和 SRCNN,但是,这些方法都有一个问题:视觉质量差,即使网络看起来运行良好。
当我们使用传统的损失函数来衡量我们的鉴别器有多准确时,它衡量的是在数学上有多接近(欧几里德距离),而不是在视觉上生成的图像与真实图像有多接近,这导致了一个区域中颜色的平滑平均,正如您在下面的 SRResNet 图像中所看到的。
***
SRGAN (left), SRResNet (right) — Notice the smoothness and lack of details in the SRResNet image.*
为了抵消这一点,创造了一个感知损失函数——来测量视觉清晰度。这个损失是两个不同损失的总和→ 内容损失和对抗损失。
对抗性损失
使用 GAN 的一个巨大好处是,你可以利用对抗性损失来激励输出看起来自然。发生这种情况是因为 GANs 的基本性质:寻找看起来不属于的数据。
对抗性损失是鉴别器网络评估发电机运行情况的一部分。如果鉴别器认为图像使我的发生器看起来合法,它将返回一个比它认为图像看起来完全是假的更低的损失。
内容损失
内容损失通过将生成的图像和原始图像通过 CNN 特征图并计算输出的损失来比较图像中的细微细节。
让我们来分解一下。
当我们训练一个卷积神经网络时——它的层执行 特征提取——这是一种奇特的说法,它在图像中寻找模式和形状。随着我们越来越深入地研究网络,我们会发现越来越复杂的特征。
Visualization of feature maps.
好的,酷—让我们分析一下这些特征地图中到底发生了什么。在 Conv1 层中,保存了大量来自图像的原始信息。这是因为 CNN 中的初始(conv)层通常充当边缘检测器。
后来在网络中,更高层次的信息被编码,我们在 conv 2-4 中看到,图像开始变得更加抽象。即使看起来更深的层比初始层编码的信息更少(因为它们看起来模糊),但它们实际上只是改变了它们包含的信息类型——从几何信息到语义信息。
为了更好地理解这一点:这里有一些在 VGG16 网络中通过图像的实际过滤器的可视化效果。(更具体地说,滤镜激活最多的图像,* 代码执行此操作 )*
第 7 层
第 14 层
第 20 层
第 30 层
第 40 层
哇哦。
这些不仅绝对令人着迷,而且当我们深入网络时,它们还能给我们一种直觉,告诉我们过滤器在寻找什么。在最后一行图像中,我们可以很容易地将拱门、鸟和链条识别为每个过滤器正在寻找的对象。
回到内容损失,我们通过特征图传递从生成器和参考(原始)图像重建的图像,并比较两个图像中的细微纹理差异,惩罚纹理看起来平滑的图像。
知觉损失的概念也用在了神经风格转移中,你可以在我关于它的文章中了解更多!
…就是这样!这是一个感知损失函数的基本思想。
随着这项技术的进步和不断完善,我们可以从这样的酷结果开始:
对此:
这项技术的进步可能会导致超远距离航空/卫星成像、医学图像增强、数字全息摄影,以及更多真正具有高影响力的应用,更不用说让企鹅看起来清晰明了。
关键要点:
- GANs 有两个神经网络相互竞争来完全生成新 图像 看起来 真实。
- *SRGAN 图像比 SRCNN 图像看起来更好,因为它们包含了**更多的细节:*使用感知损失函数的副产品。
- 感知损失的计算方法是将内容损失(结构相似性)与对抗性损失(该图像看起来有多合法)相加
如果你喜欢我的文章或者学到了新东西,请务必:
- 在 LinkedIn 上与我联系。
- 给我发一些反馈和评论(aryanmisra4@gmail.com)。
- 检查一下 SRGAN 纸。
- 此外,请查看 SRGAN 的 Tensorflow 2.0 实现的代码,它在#PoweredByTF2.0 devpost 挑战赛中获得了两项大奖!( github , devpost )
协整时间序列的误差修正模型(及参数稳定性检验)
L is the number of lags in the model, rho hat is our estimated long-run relationship coefficient, and eta hat is the deviation of from our long-run relationship in the previous period.
将股票与市场的关系纳入预测模型
仅仅根据过去的价格来预测一只股票的未来价格是非常困难的。您需要将其他数据合并到您的模型中,通过考虑股票价格的冲击来获得更好的预测准确性。一个显而易见的数据是市场走势。如果市场下跌,你的股票也有下跌的风险。您可以包括市场价格数据的滞后,以捕捉市场和您感兴趣的证券之间的短期关系。但是他们的长期关系呢?这就是误差修正模型(ECM) 有用的地方。它包括一个偏离长期关系的术语,用于估计在下一个预测期有多少不平衡会消失。
注意:我建议在阅读这篇和这篇之前先阅读这篇文章,这两篇文章将纠错范例应用于联立方程建模(预测更成功)。这些文章旨在作为独立的部分,但都是处理协整的时间序列,并相互补充。
调查时间序列属性
我不想让反复讨论确定整合度和格兰杰因果关系的读者感到厌烦,所以请在此处阅读的平稳性测试和格兰杰因果关系 部分。
用恩格尔-格兰杰方法建立协整关系
在估计 ECM 之前建立协整是很重要的。协整本质上意味着两个时间序列具有长期的关系。如果没有长期关系,ECM 是不合适的。为了检验协整性,我们对自变量执行目标变量的线性回归,并检验残差的平稳性。在我们的例子中,我们的模型是:
在对我们的样本周期估计这个模型之后,我们必须使用增强的 Dickey-Fuller 测试来测试残差的平稳性。如果我们有协整,我们就可以继续了。如果不是,我们要问自己一个棘手的问题。 长期关系的存在是否有强有力的理论依据。 如果不是,ECM 就不是一个适合我们的问题。如果有,测试断点。也许我们的样本有一段时间,在此之前,我们的长期关系可能是不同的或不存在的,但之后的话会像我们预期的那样。使用周波测试,查看是否有差异,并重复测试进行协整。如果你不确定这种关系何时会改变,使用累计图进行调查。如果我们发现了协整,我们就为下一步做好了准备。
估计误差修正模型
现在我们有了残差,并对数据进行了差分(假设它是积分 I(1)),我们可以将残差附加到我们的数据集,并使它们滞后一个周期,以估计我们的 ECM 为:
L is the number of lags in the model, rho hat is our estimated long-run relationship coefficient, and eta hat is the deviation of from our long-run relationship in the previous period.
**务必注意,如果 ECM 合适,rho hat 为负值。线性回归的滞后残差代表与前期长期关系的偏差。**直觉告诉我们,如果我们的股价高于其与市场的长期均衡水平,负系数会将其拉回来。如果它低于长期均衡,负面因素将抵消,成为正面因素,将股价拉回来。这就是 ECM 的魔力。这个系数可以被解释为不平衡的比例,这个比例在下一个周期消失。
链接到 Python 中的 ECM 实现
我将 ECM 技术应用于 JP 摩根过去 15 年的月度股价和标准普尔 500 指数,保留了最近 50 个月作为测试数据集。我选择了摩根大通,因为在我过去 15 年来尝试的十几只股票中,它是第一只通过恩格尔-格兰杰协整检验的。你可以在这里看到那个的笔记本。TL;该项目的 DR 是误差校正方法似乎很适合我的训练数据,但在我的测试数据集上的表现与简单的 3 滞后自回归模型大致相同。我通过检查我的误差修正系数的参数稳定性来研究为什么会这样。这表明,在过去 15 年的某个时候,摩根大通的股价和标准普尔 500 指数之间出现了结构性断裂。
Plot of my unstable error-correction coefficient on the models estimated during the testing period
虽然 ECM 在这种情况下表现不佳,但当有协整的证据时,应该包括误差修正项。只是要小心观察协整关系正在破裂的证据。这是时间序列建模有趣又令人恼火的部分。一个好的模型最终会随着底层系统的改变而崩溃。
机器学习中特征值和特征向量的本质
了解实际应用
单词 Eigen 可能最有用的翻译是德语,意思是**特性。**所以当我们谈论矩阵的特征值和特征向量时,我们谈论的是寻找矩阵的特征。
在深入研究特征向量之前,让我们先了解什么是矩阵除了是一个数字的矩形阵列,它还代表什么?
所以矩阵只是应用于向量的线性变换。可以有不同类型的变换应用于向量,例如-
让我们来看一些矩阵变换
img = cv2.imread(path_to_image,flags=cv2.IMREAD_UNCHANGED)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
rows,cols,_ = img.shape
M = np.float32([[1, -np.sin(.1), 0],[0, np.cos(.1), 0]])
out = cv2.warpAffine(img,M,(cols,rows))
这个矩阵 M 和图像有什么关系?它给图像中的每个矢量引入了水平剪切。
#Let's try this one
M = cv2.getRotationMatrix2D((cols/2,rows/2),45,1)
out = cv2.warpAffine(img,M,(cols,rows))
print(M)
=> [[ 0.70710678 0.70710678 -124.36235483]
[ -0.70710678 0.70710678 501.76271632]]
那么矩阵 M 对图像做了什么?所以这个线性变换 M 将图像中的每个向量旋转了 45 度。
M = [[ 1\. 0\. 100.]
[ 0\. 1\. 100.]]
out = cv2.warpAffine(img,M,(cols,rows))
它在水平和垂直方向上平移图像。
旋转没有本征矢[180 度旋转的情况除外]。对于纯剪切,水平向量是一个特征向量。向量长度改变的因子叫做特征值。
应用程序
特征值和特征向量的概念在很多实际应用中使用。我将只讨论其中的几个。
主成分分析
PCA 是一种非常流行的经典降维技术,它使用这一概念通过降低数据的维数来压缩数据,因为维数灾难一直是经典计算机视觉处理图像甚至机器学习中非常关键的问题,具有高维数的特征增加了模型容量,这反过来需要大量的数据来训练。
这是一种使用简单的矩阵运算和统计来计算原始数据在相同或更少维度上的投影的方法。
设数据矩阵 𝐗 为𝑛×𝑝大小,其中 n 为样本数,p 为每个样本的维数。在 PCA 中,本质上我们通过特征值分解对角化 X 的协方差矩阵,因为协方差矩阵是对称的
***C = VLVᵀ******In Python-***from numpy import cov
from numpy.linalg import eigX = array([[-2, -2], [0, 0], [2, 2]])
C = cov(X)
#To do eigendecomposition of C
values, vectors = eig(C)
#Project data into pricipal directions
P = vectors.T.dot(X.T)
print(P.T)Output-
[[-2.82842712 0\. ]
[ 0\. 0\. ]
[ 2.82842712 0\. ]]
其中 𝐕 是一个由个特征向量组成的矩阵(每一列都是一个特征向量),而 𝐋 是一个对角矩阵,其中个特征值 𝜆𝑖在对角线上按降序排列。
对称矩阵的特征向量,这里是协方差矩阵,是实的和正交的。
数据的特征向量称为主轴或主方向。数据在主轴上的投影称为主分量。
我们通过在比原始维度更少的主方向上投影来降低数据的维度。
谱聚类
K-Means 是最流行的聚类算法,但它有几个相关的问题,如依赖于聚类初始化和特征的维数。同样,如果你的星团不是球形的,它也会面临问题,如下图所示
from sklearn.datasets import make_moons
X_mn, y_mn = make_moons(150, noise=.07, random_state=21)
fig, ax = plt.subplots(figsize=(9,7))
ax.set_title('Data with ground truth labels ', fontsize=18, fontweight='demi')
ax.scatter(X_mn[:, 0], X_mn[:, 1],c=y_mn,s=50, cmap='viridis')
谱聚类是使用矩阵的特征向量来寻找 K 个聚类的一系列方法。它可以处理这些问题,并轻松胜过其他聚类算法。
这里数据以图表的形式表示。现在,聚类可以被认为是生成图割,其中两个聚类 A 和 B 之间的割(A,B)被定义为两个聚类之间的权重连接的总和。比如说-
为了找到最佳聚类,我们需要最小割,最小割方法的目标是找到具有最小权重和连接的两个聚类 A 和 B。
在谱聚类中,使用从图的邻接矩阵和度矩阵计算的图拉普拉斯矩阵来近似这个最小割目标。证据见本
算法
给定:一个有𝑛顶点和边权重𝑊𝑖𝑗的图,期望聚类数𝑘
- 构建(标准化)图拉普拉斯𝐿 𝐺 𝑉,𝐸=𝐷𝑊
- 求𝐿的𝑘最小特征值对应的𝑘特征向量
- 设 u 是特征向量的 n × 𝑘矩阵
- 用𝑘-means 找出𝑘簇𝐶′让𝑥𝑖’是 U 5 的行。如果𝑥𝑖’被分配到聚类 j,则将数据点𝑥𝑖分配到𝑗’th 聚类
from sklearn.neighbors import radius_neighbors_graph
from scipy.sparse import csgraph
from sklearn.cluster import KMeans#Create adjacency matrix from the dataset
A = radius_neighbors_graph(X_mn,0.4,mode='distance', metric='minkowski', p=2, metric_params=**None**, include_self=**False**)
A = A.toarray()'''Next find out graph Laplacian matrix, which is defined as the L=D-A where A is our adjecency matrix we just saw and D is a diagonal degree matrix, every cell in the diagonal is the sum of the weights for that point'''L = csgraph.laplacian(A, normed=**False**)
eigval, eigvec = np.linalg.eig(L)
现在,使用𝑘-means 找到𝑘群集𝐶让𝑥𝑖是 eigvec 的行。最后,为了将数据点分配到聚类中,如果𝑥𝑖被分配到聚类 j,则将𝑥𝑖分配到𝑗’th 聚类
第二小特征向量,也称为 Fiedler 向量,用于通过寻找最佳分裂点来递归地二分图。
参见完整示例代码 此处
谱聚类的变体用于计算机视觉中基于区域提议的对象检测和语义分割。
计算机视觉中的兴趣点检测
最后我来讨论一下 AI 下我最喜欢的领域,就是计算机视觉。在计算机视觉中,图像中的兴趣点是在其邻域中唯一的点。这些点在经典的计算机视觉中起着重要的作用,它们被用作特征。
角点是有用的兴趣点,以及其他更复杂的图像特征,如 SIFT、SURF 和 HOG 等。我将讨论一种这样的角点检测方法。
http://www.cs.cmu.edu/~16385/s17/Slides/6.2_Harris_Corner_Detector.pdf
透过一个小窗口很容易认出角落。
如果窗口内部有一个角,移动窗口应该会在强度 E 上产生很大的变化。
哈里斯角探测器
这个算法-
- 计算小区域上的图像梯度
imggray = cv2.imread('checkerboard.png',0)
i_x = cv2.Sobel(imggray,cv2.CV_64F,1,0,ksize=5)
i_y = cv2.Sobel(imggray,cv2.CV_64F,0,1,ksize=5)
- 计算协方差矩阵
# Calculate the product of derivates in each direction
i_xx, i_xy, i_yy = multiply(i_x, i_x), multiply(i_x, i_y), multiply(i_y, i_y)# Calculate the sum of product of derivates
s_xx, s_xy, s_yy = cv2.GaussianBlur(i_xx, (5,5), 0), cv2.GaussianBlur(i_xy, (5,5), 0), cv2.GaussianBlur(i_yy, (5,5), 0)
- 计算特征向量和特征值。
Harris 描述了一种更快的近似方法**——避免计算特征值,只需计算迹和行列式。结合这两个属性,我们计算出一个度量值角度 -R**
矩阵的行列式=特征值的乘积
矩阵的迹=特征值之和
# Compute the response of the detector at each point
k = .04 # Recommended value between .04 and .06
det_h = multiply(s_xx, s_yy) - multiply(s_xy, s_xy)
trace_h = s_xx + s_yy
R = det_h - k*multiply(trace_h, trace_h)
- 使用特征值上的阈值来检测角点
ratio = .2 # Number to tweak
thresh = abs(R) > ratio * abs(R).max()
如果任一个特征值接近 0,那么这不是一个角点,所以寻找两者都大的位置。e 在所有方向上几乎都是常数。
λ2 >> λ1 或λ1 >> λ2 描绘了一条边
λ1 和λ2 较大,λ1 ~ λ2 E 在各个方向都增大
参见完整示例代码 此处
参考
归一化切割和图像分割。史和马利克,2000 年
一个组合的组合和边缘检测器,克里斯哈里斯和迈克斯蒂芬斯,1988 年
图的代数连通性 M. Fiedler,1973