TowardsDataScience-博客中文翻译-2016-2018-一百零二-

94 阅读1小时+

TowardsDataScience 博客中文翻译 2016~2018(一百零二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

用 Cosmo Tech 拥抱复杂性

原文:towardsdatascience.com/embracing-c…

我们被复杂的系统所包围,为了理解、管理和预测它们,我们必须拥抱复杂性并做出更准确的决策。许多人使用人工智能和大数据来简化复杂性。然而,Michel Morvan 在巴黎 Hello Tomorrow 主舞台上的主题演讲中提出,为什么我们需要拥抱复杂性,以及我们如何做到这一点。

我采访了 Michel Morvan, Cosmo Tech 的联合创始人兼执行主席,这是一家软件供应商,为复杂系统建模,以便进行预测模拟。他解释了如何使用增强智能——用人工智能增强人类的智能——使我们能够处理令人难以置信的复杂系统,这可以解决许多人工智能和大数据无法单独解决的问题。

米歇尔声称,虽然建模和模拟领域已经存在了 40 年,但 Cosmo Tech 是唯一一家能够模拟极端复杂性(如生命系统和不同的时间和空间尺度)的公司。他们的方法可以应用于几乎任何系统,例如流行病和所需的关键基础设施、智能能源规划、恐怖活动和多式联运系统。通常决策是基于系统某些方面的不同证据。元分析仅限于一个单一的现象,即使决策者正在考虑实施这一具体方面,它将如何与系统的其他部分相关的知识仍然是一种猜测。Cosmo Tech 的方法提供了所有相关组件及其交互方式的全球图景,这使得高管、政治家和决策者能够做出更准确的决策。

人工智能允许的可能性广为人知,但米歇尔鼓励我们考虑限制,以及如何克服它们。对于大数据,重点是可以在数据中发现什么,而不是理论测试和构建。这种理论上的方法,结合相关性分析(甚至包括复杂的算法,如神经网络),易于检测出虚假关系。因果关系不能从相关性分析中推断出来(很少有例外)。预测只能基于以前发生的事情,这意味着我们不能预测不寻常或罕见的事件。这些问题通过建模专家知识/理论和使用模拟的结合而减弱(但可能没有完全解决),因为这允许你改变参数并看到最有可能的结果。

在使用算法优化专家知识之前,需要对其进行建模和组合。系统可以如此之大和复杂,没有人能有一个完整的视图,即使是专家也只知道它的一部分。Cosmo Tech 首先创建单独的子模型,然后将这些子模型组合成整个复杂系统的完整模型。Cosmo Tech 的系统建模专家与客户公司的专家合作,并借鉴学术成果。模型化的知识利用了许多研究领域、理论、它们的推理和经验证据。例如,Cosmo Tech 的早期客户之一是法国电网公司 RTE ,它需要对电网本身、资产管理(如变压器、铁路线)、财务资源、人力资源以及财务投资和风险进行建模。

Cosmo Tech 流程的下一步是添加这些子模型之间的链接和交互。例如,他们添加了网格覆盖对客户满意度和收入的影响,以及这些子模型和相互关系如何随着时间的推移而发挥作用。这创造了一个巨大、复杂、多领域的模型。他们运行模拟操作所需的参数,以深入了解潜在的结果。Cosmo Tech 的软件 Studio 允许客户轻松地更改参数并直观地看到影响,如风险图、成本和风险成本。

模拟可用于创建“假设”情景,以进行预测。RTE 每年有 8 亿英镑的投资问题,所以 Cosmo Tech 用 Studio 来理解:如果 RTE 减少他们的投资,会发生什么?Studio 允许他们看到,例如,他们将无法更换导体,他们将不得不限制电网的覆盖范围,他们的碳排放量将增加,或者 10 年后将会停电。尽管预测只和模型一样准确,只和数据一样有代表性,但是这些可能的未来允许做出更明智的决策。

没有计算机的帮助,一个专家无法想象如此复杂和动态的模型,但是计算机需要理论和推理的输入。因此,人+机器是最佳组合,这就是为什么我们需要增强智能。此外,Cosmo Tech 的过程需要打破学术研究的筒仓。该公司是里昂商学院的一个学术分支,在里昂商学院,他们有一个由 200 名复杂系统专家组成的团队,他们来自生物学、物理学、数学、社会学和地理学。

客户工作室是 Cosmo Tech 的主打产品。他们与客户合作,在一个新的领域创造一个新的软件,然后与客户一起,把它卖给同一领域的其他公司。米歇尔说,他们正在努力向公司、大学和非政府组织提供软件许可证,这将允许他们自己模拟自己的复杂系统,创建自己的模拟和预测。尽管这还只是一个想法,但它将帮助米歇尔实现他最初的目标——促进基于证据的政策。预测和防止下一次经济危机是米歇尔的梦想,但如果决策是基于复杂系统如何运行的证据,他会很高兴。

米歇尔强调,我们需要改变我们使用数据和算法来洞察我们周围世界的方式。我们需要拥抱复杂性,而不是使用算法来简化。Michel 认为,对专家知识进行建模和算法优化是我们了解系统剪切复杂性的最佳方法,这是改进我们决策的核心要素。

新兴技术通过个性化为盈利的新闻业铺平了道路

原文:towardsdatascience.com/emerging-te…

Photo by Jamie Mink on Unsplash

在马克·扎克伯格看来,脸书的任务只完成了百分之一。2003 年开始作为学生平台的东西在 2006 年很快成为一个尖端的新兴平台。今天,高度个人化的数据收集使高度个性化的脸书新闻订阅源成为可能,不仅通过采用未来的新兴技术,而且通过开拓 it,这些订阅源抓住了内容消费者的心,使新闻提供商变得老派。

作为虚拟现实硬件公司 Oculus 的所有者和人工智能驱动的个性化的早期采用者,扎克伯格正在以身临其境和高度个性化的内容体验打破新闻提供商的心。他的秘诀是:不受约束地获取数百万份免费共享的个人数据,然后他将这些数据转换成充满读者想要的内容的新闻提要。脸书有能力把读者放在第一位,给他们所有的控制权,然后收获所有的参与回报。

为了竞争,三种新兴技术有潜力帮助新闻提供商将读者放在第一位,以获得高度个性化和沉浸式的体验。

虚拟现实广播让观众掌控一切。

虚拟现实(VR)讲故事公司 Greenfish Labs 与希望国际合作,讲述马拉维的故事,通过非营利组织提供的小额贷款改变了非洲人的生活。他们的伙伴关系意味着第一世界的捐助者走进第三世界非洲公民的生活,体验他们的生活转变,就好像他们就在那里一样。

“你可以看到护目镜下开始出现的泪水,顺着他们的脸颊滴落。你不会从照片或别人讲述的故事中获得那种情感体验。希望国际的首席执行官彼得·格里尔告诉 Inc 杂志的约翰·博特。

“虚拟现实和增强现实等新兴体验式技术迫使参与的观众停下手中的事情,参与到媒体片段中,创造传统媒体无法实现的对主题的更深层次的联系和理解,”GreenFish Labs 的执行制片人 Sovanna Mam 说。

VR 讲故事的开创性之处在于,它为消费者提供了所有的控制权。观众可以在体验中走来走去,选择与他们产生共鸣的部分,然后更深入地研究它们。通过虚拟现实,希望国际通过让捐赠者控制他们自己的内容体验来报道他们所服务的人的困境。

结果是:内容体验让观众感受到如此个性化的情感,让他们想要体验更多——这是记者的梦想。

区块链将更大的受众洞察转化为有利可图的内容个性化。

纳斯达克的安娜·格拉西克解释道新闻业目前陷入了一个难题。不久前,它还在蓬勃发展,每天有数百万份印刷材料分发出去。然后,万维网打乱了这一切。人们可以通过触手可及的网站免费了解最新最棒的新闻故事。此外,随着移动设备和社交媒体应用程序的结合,突发新闻可以实时获得。与此同时,尽管新闻提供商获得了数字读者,但他们却在赔钱。

然后是数字广告。人们非常兴奋,因为新闻业似乎可以恢复其收入流。问题是:消费者不再重要。“点击诱饵”标题意味着广告商得到了他们寻求的曝光率。随着新闻变成耸人听闻的标题,除了点击之外没有什么价值,读者变得越来越沮丧。

区块链可能会让读者第一的方法再次盈利。“每个人都可以为他们喜欢的每篇文章、系列照片或视频报道支付一小部分费用。我相信这将是一个时代的终结。报纸将不再依赖付费墙,甚至更糟,讨厌的广告,”区块链一家通讯公司 OST“简单令牌”的通讯主管沃特·弗胡格说。这对新闻业的未来意味着好消息:“新闻业可以再次盈利。”

好的新闻报道不仅会再次获得回报,而且随着内容消费者用他们的数字钱包投票,记者们将知道什么能与他们的观众产生共鸣,从而使更个性化的消费者体验成为可能,以迎合那些最积极参与的人的口味。

人工智能不仅能解读观众偏好趋势,还能预测它们。

人工智能(AI)提供了超越大数据能力的个性化潜力。它不仅有助于为独特的高质量内容揭露以前容易错过的故事,而且有助于揭示观众的意图和趋势,甚至预测他们。

“目前,记者文章面向消费者的大多数基于兴趣的目标是基于以前的兴趣。然而,人类的兴趣在不断变化,”英国 1plusX 的董事总经理 Fiona Salmon 说,这是一个人工智能数据创建和管理平台,由两位前谷歌董事,于尔根·加勒博士和托马斯·霍夫曼博士创建。

例如,在一个非常基础的层面上,Fiona 说,读者可能会在冬天开始阅读足球文章,但在春天会转向棒球文章。人工智能让记者不仅可以了解消费者现在可能想要什么,还可以了解他们未来的内容偏好。

“人工智能将对消费者在特定时间的特定兴趣和特征做出更详细和精确的预测。菲奥娜说:“它们将识别人们的特征和行为趋势,使出版商能够向消费者展示与每个读者在统计上相关的文章。

这是一种预测高度个性化体验的能力,然后在最能引起共鸣的时候把它们传递出去。因此,她总结道,人工智能平台对于用前瞻性的个性化策略规划编辑日程至关重要。

Photo by rawpixel on Unsplash

高度定制的新兴技术使用创造了竞争性的新闻消费体验。

鉴于个性化在新闻业未来的作用,记者们似乎应该立即开始将新兴技术应用到他们的报道中。但是,NBC 媒体实验室的副总裁 Sowmya Gottipati 提出了一些警告。在评估记者应该如何拥抱人工智能时,她说:“供应商提供的许多人工智能功能倾向于通用模型。这与成功的人工智能的一个基本方面相冲突:用例训练。”

人工智能需要培训来定制它,以满足特定用例的挑战。同样,当出于个性化目的使用区块链和虚拟现实等新兴技术时,应该根据新闻最佳实践和目标内容消费者进行高度定制。

这个难题的答案很简单,也很容易找到:“仅仅购买、采用或复制已经上市一年的东西是不够的。新闻编辑室必须与开发新技术的公司密切合作,以改善人们发现、消费和分享真正重要的故事的方式,”PressReader 首席内容官尼古拉·马尔亚罗夫说。

希望国际提供了一条前进的道路:寻求与科技公司的合作,这些公司将致力于彻底理解新闻和目标市场的用例,然后为他们定制新兴技术的新闻应用。新兴技术的定制应用将意味着针对受众需求和偏好的前沿个性化。

外卖

最终,正确的新兴技术应用将意味着有竞争力和有利可图的新闻业,为内容消费者提供会让他们再次购买的体验。

使用时间嵌入的表情预测

原文:towardsdatascience.com/emoji-predi…

表情符号的使用已经成为一种新的社交形式,这很重要,因为它可以帮助改善聊天应用程序等通信系统。本文调查表情符号的用法语义随时间的变化,分析表情符号用法的季节性变化*。此外,作者开发了一个基于时间信息的表情预测模型。*

贡献

过去已经进行了多种表情符号预测研究(参见 Felbo 等人的著名工作,2017 ),但没有考虑时间信息。探索表情符号和季节事件之间的时间相关性,并用于消除表情符号含义的歧义。

例题

考虑一下三叶草表情符号(🍀),它通常与一年四季的好运愿望有关,除了三月,在三月它主要用于表达与聚会饮酒(由于圣帕特里克节)有关的事件情况。

挑战

  • 这项研究表明,时间信息对于表情符号预测是有用的,即使对于与时间无关的表情符号(💪还有❤️).
  • 表情符号天生是主观的,这就是为什么很难分析它们的语义。

数据集

Twitter 用于收集 1 亿条美国推文,组织如下:

  • 季节性表情数据集 —数据按季节分为四个子集:春、夏、秋、冬(见下图)
  • 表情符号预测数据集——数据减少到只包含一个常用表情符号的推文(表情符号必须属于 300 个常用表情符号)

季节性表情符号语义及用法

使用季节性数据集的四个子集来训练跳格词嵌入模型。这些模型提供的信息基本上有助于根据表情符号彼此之间的语义相似性来描述表情符号。(详见论文)

通过比较与嵌入空间中的每个表情符号相关联的前 10 个表情符号,发现与音乐、动物、糖果和情绪相关的表情符号不受季节性的影响(例如,🎶,🎼,🍦,🐠,😂,🎸).这意味着这些表情符号跨季节保留了意义。

相反,与运动相关的表情符号(例如,🏀,🏆)在不同的季节有不同的意思,可能是因为运动的高峰期。另一个与学校有关的有趣表情符号(🎓),跨季节变了意思;在春季,它与派对表情符号有关,在秋季,它与学校相关的表情符号有关。查看每一季松树表情符号的 10 大相关表情符号(🌲)在下图中——非常依赖于季节,你不觉得吗?你能猜到原因吗?(提示:户外 vs 圣诞节)。(参见论文中大量有趣的发现)

表情符号预测

第二个数据集包括 300 个表情类和总共 900,000 条推文(每个类 3,000 条推文),用于表情预测。表情预测模型的架构如下:通过早期融合方法和后期融合方法来组合字符嵌入、单词嵌入和日期嵌入。这就产生了两个型号( 前期后期 )。第三个模型被训练( W/O ),其完全忽略日期嵌入。(参见论文,了解这些嵌入是如何构建的)

结果

下表中报告了所有型号的精确度、召回率和 F1 分数。我们可以观察到,通过使用早期融合来组合时间信息,早期模型优于其他模型。

F1 得分较高的表情符号(无日期对早日期)如下表所示。你肯定可以观察到许多表情符号是特定于季节的(例如,🍀,🌒)并因此受益于日期嵌入。甚至与时间无关的表情符号(例如,🖤,❤️,💪)受益于时间信息。

结论&未来工作

  • 提出了一种基于深度神经网络进行表情预测的多通道架构。
  • 对一天或一周中特定时间的表情符号语义和用法进行更多分析,可能有助于改善日期嵌入和整体预测模型。
  • 这项工作有很大的改进空间,与情绪识别、事件检测和计算健康研究相结合可能是一个非常有趣的主题。

参考文献

关于这篇论文还有其他问题吗?给我发个 DM@ Omar saro

当没有数据时,历史学家如何处理古代帝国的数据

原文:towardsdatascience.com/empires-and…

Seshat 轴向年龄数据集的探索性数据分析

Photo by Simon Matzinger from Pexels

"90% of the data ever created was created in the last two years."

这个Petter Bae brandtzg的引用,虽然令人恐惧,却暴露了一个更可怕的观察:*我们在过去 280 万年的人类历史中记录的数据比我们在 2016-2018 年记录的数据少 10 倍。*鉴于自计算机时代开始以来数据的估计指数增长率,从历史开始到柏林墙倒塌,我们拥有的 10^15 数据比我们过去 30 年所拥有的还要少。如果我们看看 17 世纪中叶现代统计学发明之前,我们能分析的数据量是微乎其微的。如果我们看看 1086 年的《末日审判书》,它会变得非常令人沮丧。

Photo by karatara from Pexels

幸运的是,没有任何东西限制现代历史学家和学者创造关于过去的新数据。从数字化的照片和文本、关于考古挖掘的文档,甚至是关于历史时期的学术共识的众包聚合,历史学家(以及像我这样的爱好者)可以创建和探索数据集,使用尖端的分析工具得出关于过去的新理解,并帮助回答以下问题:

  • 与其他社会相比,地中海和亚洲的不同社会随着时间的推移发展了什么样的社会政治规范?
  • 在相同的时间和地点,最有可能和最不可能遵守的规范是什么?
  • 有哪些相关规范的独特轨迹是某些社会群体而不是其他群体进化的轨迹?

数据

对于这个分析,我使用的是相对较小的轴向年龄数据集,由 Seshat 提供,“一个由进化科学家、历史学家、人类学家、考古学家、经济学家和其他社会科学家组成的大型国际多学科团队。”公开提供的数据集跟踪各种社会政治规范及其在非洲-欧亚大陆关键地区的发展。在 10 个 NGAs(自然地理区域)内,每个日期(在公元前 5300 年和公元 1800 年之间以 100 年为增量变化的时间跨度)的每个社会政治规范的具体得分由一组专家商定,并编入数据集。

但首先,作为使用他们数据集的回报,他们要求我包含的信息块:

 *This research employed data from the Seshat Databank (seshatdatabank.info) under Creative Commons Attribution Non-Commercial (CC By-NC SA) licensing.*[Turchin P. et al. 2015\. “Seshat: The Global History Databank.” Cliodynamics 6(1): 77–107](https://doi.org/10.21237/C7clio6127917)[Mullins, D., Hoyer, D. et al. 2018\. “A Systematic Assessment of ‘Axial Age’ Proposals Using Global Comparative Historical Evidence.” American Sociological Review 83(3): 596–626](https://doi.org/10.1177/0003122418772567)

不幸的是,数据集中每一个 NGA 所涵盖的时间段各不相同,早至公元前 5300 年,晚至公元 200 年。它们也不会同时全部结束:

此外,随着时间的推移,社会似乎会积累文化特征,而不是让属性均匀地出现和消失,这也可能使我们的分析变得复杂,因为数量上的原因,我不会在这里讨论。

尽管如此,数据中的变化足以回答我们上面的三个问题。所以事不宜迟…

Source: pixabay.com

问题 1:与其他社会相比,地中海和亚洲的不同社会随着时间的推移发展了什么样的社会政治规范?

除了柬埔寨和卡奇平原,道德惩罚和相信无所不知的超自然生物的平均分数在古典世界是一个很强的特征,但在南亚和东亚社会不是。

道德规范,在较小程度上,促进亲社会,相信统治者不是神,正式的法律法规,法律的普遍适用性,对行政部门的约束,以及全职官僚是除关西以外所有 NGA 的共同特征,这可能是因为 NGA 的数据集中有大量的空值(本质上是空单元)(我仍然不确定为什么他们包括关西 5000 年的零和空单元)。

加利利、卡奇平原、科尼亚平原、苏西亚纳、上埃及,以及在较小程度上的克里特岛,所有这些地区在现代时期都处于伊斯兰统治之下,在将统治者和平民等同于精英方面得分明显较高。

对行政和弹劾的限制似乎是显而易见的罗马特征,Latium 遥遥领先,其次是前罗马统治的克里特岛,加利利,上埃及和科尼亚平原,尽管黄河流域的弹劾事件略多于上埃及。就全职官僚而言,这是颠倒的。出于前面提到的原因,除了关西以外,每个 NGA 都有比拉丁姆更多的全职官僚。

Photo by Ken Shirakawa from Pexels

为了克服空值导致的问题,如关西的情况,我还绘制了每个 NGA 相关要素的相对剖面图:

随着时间的推移,柬埔寨盆地的特点是促进群体超越自我,以及一个正式的、普遍适用的法律结构,在这个结构中,一个先进的官僚机构在运作。不平等似乎一直很严重,对权力结构的制约有限。

克里特岛同样有着全面和正式的法律,尽管个人利益比柬埔寨更受推崇。尽管在某些情况下统治者可以被罢免,但统治者和平民的价值观存在巨大差异。有时也有一些对全知的上帝的信仰。

加利利,再次,有一个高度结构化的法律框架,普遍适用和官僚化,但更强调集体善和道德惩罚。平等得到了更高的促进,高管受到了更多的约束,统治者不太可能被视为神,因为对无所不知的超自然存在的信仰非常普遍。尽管如此,一旦掌权,统治者很少能通过制度手段被罢免。

在卡奇平原上,社会相对不太可能因为道德原因而不是法律原因惩罚你,尽管坚持社会道德规范的压力非常大。尽管法律有一点可替代性,但在社会眼中,统治者、精英和平民有着显著平等的内在价值。

在关西,融入社会的社会压力很大,再加上正式且普遍适用的法律法规和强大的官僚机构,这可能意味着人们普遍知道社会对他们的期望。虽然精英和平民相对平等,但统治者是上帝。

科尼亚平原的轮廓很像加利利,有一些法治,强调集体利益,适度的平等,一个受约束的行政部门,以及对统治者不是神的信仰和对全知的超自然存在的信仰。然而,道德惩罚不像在加利利那么普遍。

拉丁姆是法治的缩影,正式的法典比道德惩罚更受青睐,对行政部门的约束,甚至是弹劾的强大传统。统治者不是神,人们普遍相信一个无所不知的超自然存在。然而,不平等现象猖獗,社会普遍认为平民不如精英或统治者有价值。

像柬埔寨和关西一样,黄河中游地区是亲社会规范、强有力的法律框架和官僚机构的混合体。然而,统治者通常不被认为是神圣的,有时会受到制度上的约束。黄河流域的社会分层也可能比关西更高,因为精英不太等同于平民。

尽管 Susiana 有强大的亲社会和道德规范,正式的法律法规,以及一大批官僚,但法律似乎不太普遍适用。高管受到适度约束,社会分层相对较低。

在埃及,道德规范非常重要,尽管存在一个正式的一般法律框架。有一个强大的官僚机构,精英和平民之间的平等程度相对较高。尽管统治者有时被认为是神圣的,但他们可能受到高度的制度约束。

咻!既然我们已经解决了最长、最复杂的问题,让我们继续…

Source: pixabay.com

问题 2:在相同的时间和地点,最有可能和最不可能遵守这些规范中的哪一个?

为了回答这个问题,我做了一个相关特征的关联矩阵。正如可以从数据集中预期的那样,要素往往会随着时间的推移而累积,相关性会偏向正相关。

正式的法律规范、亲社会的促进和法律的普遍适用性最有可能一起被观察到,并具有很强的正相关关系。在某种程度上,普遍适用的正式法律法规是对亲社会的一种促进,也是对“遵守规则”的一种激励,所以这是有意义的。弹劾是最不可能与精英和平民等同以及统治者和平民等同共现的特征,两者都有轻微的负面关系。弹劾还与全职官僚的存在负相关,尽管这种负相关要弱得多。看起来,强大的官僚机构和相对的社会平等可能已经消除了对一位高管的一些约束,这位高管远非全能,需要合法性和他人的合作才能统治。最不相关的特征是弹劾和无所不知的超自然存在,亲社会的促进和道德惩罚,这意味着后三者与前者的存在与否没有任何有意义的联系。

这让我们想到:

Photo by Zhang Kaiyv from Pexels

问题 3:一些社会群体而不是其他群体沿着哪些不同的相关规范轨迹发展?

基于我为 Udacity 的机器学习工程师 Nanodegree 做的一个早期项目,用代码对数据运行所谓的“主成分分析”,我能够得出三个独立的文化概况,数据中的社会在不同程度上符合或不符合,或者用技术术语来说,将维度折叠成三个维度,这三个维度最好地利用了数据中的差异。第一个维度解释了数据随时间变化的 48%的差异,这是一种抛弃,实际上只是表明 nga 倾向于随着时间积累越来越多的特征。然而,更有趣的是接下来的两个维度,分别反映了数据集 14%和 10%的方差。二维社会的特点是轻度缺乏对全知存在的信仰,并强烈认为统治者不是神,可以受到制度约束。尽管有一个强有力的法律框架,但社会分层很高,官僚机构很弱。这个维度对于许多古典主义者来说可能听起来很熟悉,是一种古典的古希腊政治哲学。相比之下,维度 3 的社会以强烈的道德规范和亲社会为特征。对全知上帝的信仰很低,但对神圣统治者的信仰很高,统治者比普通人更受尊重,相对不受约束,无可指责。有一个非常强大的官僚机构和高度复杂的法律框架。作为一种儒家政治哲学,这个维度对亚洲人来说也非常熟悉。这两种哲学被指定为独立的“维度”意味着它们并不相互排斥,因此不同的社会可以表现出一个、两个或两个维度都没有的混合特征(即一个社会可以同时受到希腊和儒家政治思想的影响。或者只有一个。或者都不是!).

Photo by Diego Cano from Pexels

评估和部署

尽管这些数据在主观性、简洁性、不同的时间线以及所有那些该死的缺失值方面有些问题,但 Seshat 的轴向年龄数据集确实证明了我们创造关于过去的数据的能力,以便得出关于过去的见解,这些见解可以导致关于过去的理论,包括来自问题 2 的见解,即法律和亲社会倾向于一起出现, 虽然官僚主义和社会平等倾向于与弹劾或问题 3 的见解分开出现,但经典的希腊和儒家社会政治模式可能被认为是地中海和亚洲社会发展的独立维度,有时是同时和融合的。 数据集集合的协作性质赋予了更大的客观合法性,并且可以而且应该被复制,以围绕我们缺乏大量定量数据的其他历史主题创建更大的数据集。

至于这种分析,从关于历史的数据中收集的发现,以前不存在的数据,可以在以前探索不足的方向上指导未来的研究。我欢迎读者验证或挑战本文中的见解,并将数据科学的适用性扩展到前信息时代!

链接到 GitHub 资源库,查看该项目的代码

基于安然数据集的电子邮件分类实证分析

原文:towardsdatascience.com/empirical-a…

在本文中,我们将首先评估 3 种机器学习算法的性能,即逻辑回归、支持向量分类和随机森林分类器。在后一部分,我们将比较机器学习算法的性能与使用递归神经网络模型(LSTM)获得的结果。我们将在整个评估过程中使用安然数据集

1。关于数据集

安然数据集包括主要由安然公司高级管理层发送的电子邮件。在这个实验中,我们使用了专门为垃圾邮件和火腿分类制作的数据集的处理版本。该数据集包含 30207 封电子邮件,其中 16545 封被标记为垃圾邮件,13662 封被标记为垃圾邮件。

2。 方法论

2.1 数据预处理

2.1.1 机器学习

对于机器学习算法,我使用了单词袋方法。这是一种从文本中提取特征以用于机器学习算法的方法[1]。在这种情况下,我们首先对电子邮件进行标记,并为所有电子邮件中的所有单词创建一个字典。然后,我们从其中选取最常见的 3000 个单词作为我们的最终词典。然后我们遍历每封邮件,记录邮件中每个令牌在字典中对应的令牌的出现频率。这样,所有电子邮件的最大序列长度变为 3000。

2.1.2 递归神经网络

RNN 模型使用了一种略有不同的单词包方法来预处理电子邮件。我们首先对电子邮件进行标记,并制作所有电子邮件中所有单词的字典,就像我们对机器学习模型所做的那样。那么所有的单词将从 1 开始被索引。然后,电子邮件集合将被迭代,对于电子邮件中的每个单词,将参考字典将该单词映射到相应的索引。这种方法确保了电子邮件中单词的顺序不变。但是我们现在有一个问题,每个电子邮件有不同的序列长度。为了减轻这一点,我们将得到最长的电子邮件的长度,并将所有电子邮件填充到该长度。填充将通过在每个序列的开头添加“0”来完成,以便它不会影响训练过程。在这个场景中,所有电子邮件的序列长度是 3425。

2.2 机器学习算法

安然数据集将用于训练机器学习模型,以将电子邮件分类为垃圾邮件或 ham。所有利用的机器学习算法都取自 scikit learn 库。所有算法的参数调整都是手动完成的。这是因为数据集的大小是 30207,运行网格搜索太耗费时间了

2.2.1 拆分数据

对于所有算法,数据被分成三组作为训练集、验证集和测试集。验证集用于调整参数。在参数调整过程之后,使用测试集来获得最终结果。训练集由 80%的数据组成,20%用于验证集。然后这 20%被进一步平均分配,50%用于验证,另外 50%用于测试。

2.2.2 支持向量分类

支持向量分类算法通过创建一个特征空间来模拟这种情况,这是一个有限维的向量空间,其中的每一维都代表特定对象的一个“特征”[2]。

首先,在没有任何优化的情况下进行观察。以下是初步结果:

在使用线性核获得初始结果之后,调整 C 参数以获得最终结果。下面显示的是收到的验证和测试集的最终结果。这些是观察期间获得的最高验证分数。

2.2.3 随机森林分类器

随机森林分类器从随机选择的训练集子集创建一组决策树。然后它聚集来自不同决策树的投票来决定测试对象的最终类[3]。

最初,观测是在没有任何优化的情况下进行的,就像 SVC 算法一样。以下是初步结果:

通过改变可能对最终结果产生最大影响的不同参数来改进初始结果。探索的参数是:n_estimators、max_features 和 Max_depth。下面显示的是最终结果:

2.2.4 逻辑回归

逻辑回归用于描述数据,并解释一个因变量与一个或多个名义变量、序数变量、区间变量或比率水平自变量之间的关系[4]。

该算法使用默认设置运行,因为没有要优化的参数。下面显示的是测试集获得的结果。

2.2.5 总结

在比较这些车型时,我们将主要关注 f1 的得分。根据观察,尽管对 svc 算法进行了优化,但仍无法实现显著的改进。但是随机森林分类器在调整参数值后显示出相当显著的改进。尽管这两种算法都给出了很好的结果,但是逻辑回归算法的最终结果是最高的。如您所见,逻辑回归算法和 svc 算法的最终结果相差不远,但我们必须让逻辑回归算法胜出,因为这是我们能够获得的最高结果。

我们将进一步探讨这个主题,看看我们是否可以通过使用不同的方法来改善最终结果。即递归神经网络。我们将用于这一观察的递归神经网络的类型是 LSTM 模型。

2.3 LSTM 车型

LSTM 代表长期短期记忆网络,这是一种特殊的 RNN,能够学习长期依赖关系。这些是专门设计来避免大多数模型中存在的长期依赖问题的。LSTMs 长时间记忆信息,有助于建立长期依赖性模型[5]。

采用张量流框架建立 LSTM 模型。LSTM 模型由几层组成。当将数据输入模型时,我们将首先通过嵌入层传递数据。嵌入层的功能是将代表字典中单词的每个索引表示为一个范围内指定大小的随机数值向量。这种方法有助于对单词之间的关系进行建模。那么嵌入层的输出将通过 LSTM 层发送。我们使用 Tensorflow 提供的“基本 LSTM 池”来完成这项任务。LSTM 层将在其输出中添加一个漏失,以随机抑制神经网络中的一些神经元,从而降低过拟合的可能性[6]。然后,隐藏图层将消耗 LSTM 图层的输出,并生成最终输出。

当计算成本函数时,logit(没有通过激活函数发送的最终结果)将被传递给它。使用的成本函数是“softmax 交叉熵与 logits”。然后,优化函数将用于降低成本。所利用的优化功能是 Adam 优化器。

通过激活函数传递获得的 logit 值进行预测。为此使用了 Sigmoid 函数,因为相关的任务是二元分类。

2.3.1 拆分数据

数据被分成 3 组,作为之前在机器学习方法中提到的训练、验证和测试集。在获得初始结果后,验证集用于调整超参数以提高最终得分。然后使用测试集进行最终评估。训练、验证和测试数据的百分比与用于机器学习方法的百分比相同。

2.3.2 结果

下面显示了使用验证数据集获得的初步结果:

以下结果显示了调整超参数后的最终输出

在使用上述模型获得令人满意的结果之后。通过叠加更多的隐藏层来进行观察,以查看结果是否可以进一步改进。

下面显示的是使用两个隐藏层得到的结果。

2.3.3 总结

为了评估该模型,我们将主要考虑 f1 分数,正如我们对机器学习算法所做的那样。考虑到优化参数后获得的结果,我们可以看到分数略有提高。

当试图通过添加更多的隐藏层来进一步改善结果时,正如你所看到的,它给出了一个低得多的输出。其原因是,即使在理论上,神经网络应该对堆叠层给出更好的分数,在这种情况下,我们缺乏数据。我们拥有的数据量不足以训练多个隐藏层。

3。谁做得更好?

如上所述,逻辑回归算法给出了比其他两种机器学习算法更好的结果。所以现在我们来了个问题,考虑到逻辑回归算法和 LSTM 模型,谁做得更好。下图是逻辑回归算法和 LSTM 模型的最终结果对比。

查看表格,我们可以清楚地看到,LSTM 的f1 得分优于逻辑回归算法。基本上所有的分数 LSTM 模型都优于逻辑回归算法。这让 LSTM 模式轻而易举地胜出。

4。结论

考虑到所获得的结果,LSTM 模型优于所有其他考虑的机器学习算法。其原因是 LSTMs 模拟长期依赖性的能力。安然是一个文本数据集,因此,能够记住整个电子邮件中单词之间的依赖关系增加了更好地猜测它是垃圾邮件还是火腿电子邮件的机会。由于 LSTM 设计擅长这项任务,它能够给出比其他机器学习算法更好的结果。

总之,我们可以说,LSTM 真正能够捕捉数据中的长期依赖性,并利用其在架构中的存储方面胜过其他机器学习算法。

5。参考文献

[1]https://medium . com/grey atom/an-introduction-to-bag-of-words-in-NLP-AC 967d 43 b 428

[2]mindmajix.com/support-vec…

[3]https://medium . com/machine-learning-101/chapter-5-random-forest-classifier-56dc 7425 c3e 1

[4]http://www . statistics solutions . com/what-is-logistic-regression/

colah.github.io/posts/2015-…

[6]https://www . quora . com/How-the-dropout-method-work-in-deep-learning-And-why-it-be-a-effective-trick-to-improve-your-network

:本次评估使用的完整代码可以通过这个链接找到。请随意摆弄代码,亲自尝试一下。编码快乐!

利用 MLflow 增强 Spark

原文:towardsdatascience.com/empowering-…

这篇文章旨在讲述我们使用 MLflow 的初步经验。

我们将通过记录所有探索性迭代,开始用自己的跟踪服务器发现 MLflow。然后,我们将展示使用 UDF 链接 Spark 和 MLflow 的经验。

语境

Alpha Health 我们利用机器学习和人工智能的力量,让人们能够控制自己的健康和福祉。因此,机器学习模型是我们正在开发的数据产品的核心,这也是为什么 MLFLow,一个覆盖 ML 生命周期所有方面的开源平台吸引了我们的注意力。

MLflow

MLflow 的主要目标是在 ML 之上提供一个额外的层,允许数据科学家使用几乎任何机器学习库(keras, mleap,【py torch,sk learn&tensor flow)

MLflow 提供了三个组件:

  • 跟踪 —记录和查询实验:代码、数据、配置和结果。非常有助于跟踪你的建模进度。
  • 项目 —可在任何平台上重复运行的打包格式( Sagemaker)。
  • 模型 —将模型发送到不同部署工具的通用格式。

MLflow (目前处于 alpha 阶段)是一个管理 ML 生命周期的开源平台,包括实验、可复制性和部署。

设置 MLflow

为了使用 MLflow,我们首先需要设置所有的 Python 环境来使用 MLflow,我们将使用 PyEnv ( 来设置**→Python in Mac)。这将提供一个虚拟环境,我们可以在其中安装运行它所需的所有库。

***注意:*我们使用 PyArrow 来启动模型作为 UDF。PyArrow 和 Numpy 版本需要修复,因为最新的版本之间有一些冲突。

启动跟踪用户界面

MLflow 跟踪允许我们使用 PythonRESTAPI 来记录和查询实验。除此之外,还可以定义我们将模型工件存放在哪里( Localhost、 亚马逊 S3 Azure Blob 存储 谷歌云存储 SFTP 服务器 )。由于我们在 Alpha Health 中使用 AWS,我们将尝试用 S3 作为工件存储。

MLflow 建议使用持久文件存储file-store是服务器存储运行和实验元数据的地方。因此,在运行服务器时,要确保它指向一个持久文件系统位置。这里,我们只是使用/tmp进行实验。

请记住,如果我们想要使用 mlflow 服务器来运行旧的实验,它们必须存在于文件存储中。然而,如果没有它们,我们仍然可以在 UDF 中使用它们,因为只需要模型路径。

注意: 记住跟踪 UI 和模型客户端必须能够访问工件位置。这意味着,不管 EC2 实例上的跟踪 UI 如何,如果我们在本地运行 MLflow,我们的机器应该可以直接访问 S3 来编写工件模型。

Tracking UI storing artifacts to a S3 bucket

运行模型

一旦追踪服务器开始运行,我们就可以开始训练我们的模型了。

作为示例,我们将使用 MLflow Sklearn 示例 中提供的葡萄酒示例的修改。

*如前所述,MLflow 允许记录我们模型的参数、度量和工件,因此我们可以跟踪这些在我们不同的迭代中是如何发展的。这个特性非常有用,因为我们将能够通过检查跟踪服务器来重现我们的最佳模型,或者验证哪个代码正在执行期望的迭代,因为它记录了 *(免费)git 散列提交

Wine Iterations

为模特服务

使用“ml flow server”,启动的 MLflow 跟踪服务器也托管 REST APIs,用于跟踪运行并将数据写入本地文件系统。您可以使用"MLFLOW _ TRACKING _ URI"环境变量指定跟踪服务器 URI,ml flow 跟踪 API 会自动与该 URI 上的跟踪服务器进行通信,以创建/获取运行信息、日志度量等。

Ref:Docs//运行跟踪服务器**

为了服务一个模型,我们所需要的是一个跟踪服务器运行( 启动 UI )和一个模型运行 ID** 。**

Run ID

为了使用 MLflow serve 特性服务模型,我们需要访问跟踪 UI,因此它可以通过指定--run_id来检索模型信息。

一旦模型由跟踪服务器提供服务,我们就可以查询新的模型端点。

运行 Spark 的模型

虽然,仅仅通过训练模型和使用 serve 特性(*ref:ml flow//docs//models # local)就能够实时地为模型提供服务是非常强大的,但是使用 Spark(批处理或流)来应用模型甚至更加强大,因为它加入了分布的力量。***

想象一下,有一个离线训练,然后以一种更简单的方式将输出模型应用于所有数据。这是 Spark 和 MLflow 共同闪耀出完美光芒的地方。

安装 PySpark + Jupyter + Spark

Ref:入门 PySpark — Jupyter

展示我们如何将 MLflow 模型应用于 Spark 数据框架。我们需要在 Jupyter 笔记本上安装 PySpark。

从 PySpark 发射 Jupyter

由于我们将 Jupyter 配置为 PySpark 驱动程序 ,现在我们可以在笔记本上附加 PySpark 上下文来启动 Jupyter。

正如我们上面所展示的,MLflow 提供了一个将我们的模型工件记录到 S3 的特性。因此,一旦我们选择了一个模型,我们就可以通过使用mlflow.pyfunc模块将其作为 UDF 导入。

PySpark — Wine Quality Prediction Output

到目前为止,我们已经展示了如何将 PySpark 与 MLflow 结合使用,对所有葡萄酒数据集进行葡萄酒质量预测。但是,当您需要使用 Scala Spark 的 Python MLflow 模块时,会发生什么呢?

我们还通过在 Scala 和 Python 之间共享 Spark 上下文来测试这一点。这意味着我们在 Python 中注册了 MLflow UDF,然后在 Scala 中使用它( yeap,这不是一个好的解决方案,但至少它是个东西 🍭)。

Scala Spark + MLflow

对于这个例子,我们将把 Toree 内核 添加到现有的 Jupyter 中。

正如您在随附的笔记本中看到的,UDF 由 Spark 和 PySpark 共享。我们希望这最后一部分对那些热爱 Scala 并且必须将 ML 模型投入生产的团队有所帮助。

后续步骤

虽然 MLflow 目前在阿尔法(🥁),它看起来很有希望。凭借能够运行多个机器学习框架并从同一端点使用它们的能力,它将所有推荐系统带到了一个新的水平。

此外,MLflow 通过在数据工程师 和数据科学家之间建立一个公共层,拉近了和数据工程师的距离。

在对 MLflow 进行研究之后,我们确信我们将会更进一步,并开始在我们的 Spark 管道和推荐系统中使用它。

让文件存储与数据库同步而不是使用文件系统会更好。这应该允许多个端点使用同一个文件存储。比如让多个 PrestoAthena 实例使用同一个胶水 metastore

最后,感谢 MLflow 背后的所有社区,是他们让这一切成为可能,让我们的数据生活更加有趣。

如果您正在使用 MLflow,请随时联系我们并提供一些关于您如何使用它的反馈!甚至,如果你在生产中使用 MLflow。

赋权作为内在动力

原文:towardsdatascience.com/empowerment…

在没有目标或奖励的情况下,被授权

有钱,有影响力的朋友,或者拥有一辆车意味着你更有权力决定你想要什么样的未来。这不一定意味着你知道哪些目标是正确的,但它肯定会让你处于一个权力的位置,在那里有许多可能的未来可供选择。

这种授权的概念是由 Klyubin 等人[1]在设计适应性代理的上下文中正式提出的。它旨在作为一种独立于目标的内在行为动机,并在机器人学、强化学习和自适应系统中产生了一些有趣的结果。例如,使用授权最大化策略来控制模拟双摆,Jung 等人[4]发现了以下行为:

Maximising empowerment in a double pendulum controller. The controller finds the most unstable point of the pendulum and keeps it there, even though there is no explicitly encoded goal of reaching this state. Image taken from Jung et al. [4]

双摆被控制到最不稳定的点(垂直 90 度)并保持在那里,即使控制器中没有编程找到这种状态的明确目标——它只是最大化授权,并且恰好钟摆的顶部是最授权的位置(这是因为从这个不稳定点可以到达更多可能的未来状态)。

授权是基于一种信息理论的形式主义,它将行动和未来的感觉视为一种信息传输渠道(就像 Claude Shannon 在他关于通信工程的开创性工作中描述的那样[5])。我在这篇文章中的目标是以最简单的方式解释授权,包括如何计算它的数学,以及它对强化学习和人工智能的影响。在文章的最后,我提供了一个到我的 GitHub 库的链接,在那里你可以找到在离散世界中实现授权的代码。

奖励和强化学习

强化学习是关于在一个不确定的世界中学习一个最佳的行动策略,它在每个时间步提供一个奖励信号。DeepMind 通过训练深度网络,使用游戏分数作为奖励信号,利用强化学习技术在雅达利游戏[2]上超过人类水平的表现。

Space Invaders Atari game. DeepMind’s Q-learning network outperforms human-level game play by training deep networks using the game pixels as input, and the game score as reward signal.

虽然这令人印象深刻,但现实世界中的生物面临着更加复杂和不确定的世界——将来自你眼睛和耳朵的感官刺激与用作 DeepMind 神经网络输入的简单像素和分数信号进行比较。但更关键的是,对于生物有机体来说,根本不存在明显的回报信号。当蚂蚁、松鼠或人类做出“好”或“坏”的举动时,没有全知的守护者或“神谕”来告诉他们。

事实上,像我们这样的生命体最令人印象深刻的品质是我们继续生存的能力。我们的内部器官不仅继续做着让我们生存的事情,而且我们通常会避免可能导致我们死亡的情况。为了增加我们继续生存的机会,我们的大脑/身体有没有可以遵循的一般原则?

内在动机

卡尔·弗里斯顿提出了一个雄心勃勃的框架,认为大脑的功能是最小化一个被称为自由能的量。不仅如此,他还提出,对于任何旨在避免宇宙无序化趋势的破坏性影响的有机体来说,将这个量最小化是必须的(热力学第二定律)。不过自由能框架不是本文的主题,这里就不赘述了。

我提到这一点是为了引入*内在动机的概念。*在基地,所有生物都必须抵抗宇宙的无序趋势,才能继续存在。大部分工作是由我们的新陈代谢完成的,新陈代谢为有用的工作收集能量,并排出高熵废物。但是,在行为的更高层次上,问题是:在没有具体目标或奖励信号的情况下,有没有可以指导行为的普遍原则?

例如,假设目前我没有要完成的目标或任务,但是我知道在将来的某个时候一个任务可能会出现。与此同时,有没有什么原则性的行为方式可以让我为未来的任务做好最充分的准备?

授权

根据克柳宾的说法,在其他条件相同的情况下,代理人应该最大化他们行为的未来可能结果的数量。以这种方式“保持你的选择余地”意味着当一项任务出现时,一个人尽可能地被授权去完成它所需要做的任何事情。Klyubin 等人在两篇标题恰当的论文中很好地提出了这一概念:“在其他条件相同的情况下,被赋予权力”[1]和“保持选择的开放性:感觉运动系统的基于信息的驱动原则”[3]。从那以后,机器人和强化学习领域的许多令人兴奋的工作都使用并扩展了这个概念[8,9]。

这里的主要创新是使用信息论正式授权。要做到这一点,世界必须被认为是一个将行为转化为未来感觉状态的信息理论通道。通过将动作和随后的感觉视为通过通道相关联,我们可以将授权精确量化为传感器-致动器通道的信息论通道容量。也就是说,通过我的行动,我能向未来的感官状态注入多少信息?说的更直观一点,我的环境有多可操控

为了定义这一点,我们需要首先定义两个随机变量 XY 之间的互信息。假设 XY 通过一个通道 X→Y 相关联,由条件分布 p(y|x) 描述。也就是说,值 x 规定了在值 y 上的概率分布(记住,信道可能是有噪声的,因此 x 仅用某个概率来确定 y ,因此是概率分布,而不是与每个 x 相关联的精确值)。如果通道的输入 x 分布为 p (x),则 XY 之间的互信息由下式给出。

Mutual information between X and Y. Formally, it is the average reduction in uncertainty (entropy) in Y due to knowledge of X (and vice versa, although that may not be immediately clear).

互信息量化了已知 X 的 Y 的不确定性(熵)的减少,并且以比特来测量。事实证明,这种关系是对称的,因此I(X;Y)= I(Y;x)。

在我们的例子中,感兴趣的通道是传感器-执行器通道。让我们称 A 为致动器变量(描述动作),称 S 为定义下一时间步传感器读数的变量。给定一个主体/环境系统的状态,行动通过概率规则 p(s|a) 或渠道 A→S 导致未来的感觉,这是由世界上这个特定点的环境动态决定的。动作 p(a) 上的某个分布现在足以确定互信息I(A;S)* (与上面的 XY 完全相同)。信道容量,这里是授权,仅仅是动作分布上最大可能的互信息 p(a)。*

For a fixed channel p(s|a) empowerment is the maximum mutual information over actions distributions p(a).

类似地,我们可以将随机变量 A 视为描述 n 步动作,然后 S 在 n 个时间步之后读取传感器数据,因此定义了所谓的 n 步授权。

为了帮助思考这意味着什么,考虑一下这个。当我行动时,我改变了我的环境,并因此影响了我在下一个时间点的感知。当我所有可能的行动在下一个时间步骤导致完全相同的感官读数时,我完全没有控制,也就是说我没有权力,这反映在零的相互信息中(结果的不确定性没有减少)。当我的每一个动作都导致下一个时间步的一个明显的感官读数时,我就有了很大的控制力,所以我很有权力(体现在一个很高的互信息上)。

克柳宾的迷宫世界

如果你的眼睛刚刚变得呆滞,是时候醒来看一个启示性的例子了。如果你和我一样对这些信息论的形式主义感到兴奋,那就值得看一看 Cover & Thomas 的书[6],其中详细讨论了熵、互信息和信道容量等主题。

在 Klyubin 的论文“在其他条件相同的情况下被赋予权力”中,一个简单的迷宫世界的例子被用来说明这个概念。假设一个智能体存在于 2D 网格世界中,它可以做出向北、向南、向东、向西或停留的动作。然而,这个世界有墙,使它成为一种迷宫。命令代理进入墙壁的动作没有效果,并且世界的边缘被墙壁包围(即没有循环)。

假设代理的传感器只是报告代理在世界上的绝对位置。下图显示了世界上每个网格单元的赋权值,计算为将可能的 5 步操作与 5 步序列后的传感器读数相关联的通道的通道容量。

5-step empowerment value at each point in Klyubin’s deterministic maze world. Highly empowered positions are so because more future states are reachable from those states.

我们看到,在世界上代理更“卡住”的部分,授权更低(通道容量约为 3.5 位)。“停滞”意味着即使是最有希望的行为分布也只能导致有限数量的未来状态。高度授权的州(像地图中间附近)对应于代理人拥有许多可能性的州。

假设“一块食物”将在时间 *t,*出现在网格中的某个位置,但是在此之前,不知道关于该未来位置的信息。在此期间,一个人应该如何行动?嗯,移动到网格中心附近的位置[5,5]可能是您的最佳选择,因为从该位置可以获得更多的未来状态。

为人工智能赋能

大多数有趣的人类行为都不是基于奖励的学习的结果(尤其是不像标准的机器学习模型那样使用成千上万的例子)。心理学文献谈到“内在动机”,基本上是指为了自己内在的愉悦而做任务。这种行为是有用的,因为这些“天生令人愉快”的活动往往会教给我们有价值的、抽象的、可重复使用的概念,这些概念可以应用于大量潜在的未来任务(想象一个孩子在玩耍)。

对于任何旨在成为通用、通用或自主的人工智能来说,学习一般概念是必须的——这意味着信息具有内在价值。对于一个处于环境中的具体化代理人来说,了解环境中内在结构的唯一方式是通过与它互动— 因此授权位置,在那里行动的结果更加多样化,本质上是世界上更有趣/有趣的部分。随着我们从特定任务智能转向通用智能,授权和其他信息驱动的概念(查看预测信息和相关想法的顺势疗法)将是重要的工具。

感谢您阅读我关于授权的文章。查看 我的 GitHub 库 ,其中有实现任意离散环境授权的代码。

参考

[1] Klyubin,A.S .,Polani,d .和 Nehaniv,C.L .,2005 年 9 月。在其他条件相同的情况下,被赋予权力。在欧洲人工生命会议(第 744-753 页)。斯普林格,柏林,海德堡。

[2] Mnih,v .,Kavukcuoglu,k .,Silver,d .,鲁苏,a .,Veness,j .,Bellemare,M.G .,Graves,a .,Riedmiller,m .,Fidjeland,A.K .,Ostrovski,g .和 Petersen,s .,2015。通过深度强化学习实现人类水平的控制。性质518 (7540),第 529 页。

[3] Klyubin,A.S .,Polani,d .和 Nehaniv,C.L .,2008 年。保持选择的开放性:感觉运动系统的基于信息的驾驶原则。 PloS one3 (12),p.e4018

[4]t .荣格、d .波拉尼和斯通出版社,2011 年。连续智能体-环境系统的授权。适应行为19 (1),第 16–39 页。

[5]香农出版社,2001 年。交流的数学理论。 ACM SIGMOBILE 移动计算与通信评论5 (1),第 3–55 页。

[6]盖,T.M .和托马斯,J.A .,2012 年。信息论的要素。约翰·威利的儿子们。

[7]k .弗里斯顿,2010 年。自由能原理:统一的大脑理论?。《自然评论神经科学11 (2),第 127 页。

[8]穆罕默德和雷森德,司法部,2015 年。内在激励强化学习的变分信息最大化。在神经信息处理系统的进展(第 2125–2133 页)。

[9]g .蒙图法尔、k .加齐-扎赫迪和 n .艾,2016 年。信息理论辅助的具身智能体强化学习。 arXiv 预印本 arXiv:1605.09735

模仿世界如何创造…创造与世界的最佳互动。

原文:towardsdatascience.com/emulate-how…

如果与世界互动的最佳方式是用世界创造计算结构的方式来创造计算结构,那会怎样?

典型的人工智能和机器学习专注于有效地搜索最具预测性的“计算结构”。但是在现实世界中,我们又有多少次想要重新发明轮子呢?我们希望多长时间重复一次寻找解决方案的过程?不经常。也许包括标准化和重用的机制比快速创建预测结构更重要?

在现实世界中,创建一次并积极复制比一次又一次地创建要高效得多。然而,人工智能的叙事侧重于搜索最佳解决方案,有效地创建新的分层计算结构,而没有说太多关于标准化或重用已创建的计算结构。

Natural Creates” Structure” Efficiently Via Reuse and Reproduction

当我们积极地标准化和复制我们发现的东西时,我们与世界的互动会更有效率。同样的机制对于任何想要与世界有效互动的事物来说不也是至关重要的吗?当涉及到在现实世界中创作和与现实世界互动时,标准化、复制和重用等概念是否比最初的搜索和发现更重要?如果是这样的话,人工智能的叙述就缺少了一些重要的章节。模块化、标准化和重用难道不应该是人工智能解决方案领域的关键部分吗?

现实世界能否填补 Pedro Domingos 描述的主算法中缺失的部分?也许吧。

“计算结构”是什么意思?

结构是复杂事物的各部分或要素之间的排列和关系。

“计算结构”是一个结构化的实体,可以改变它所在的世界或环境。换句话说,这是一个与世界的某个部分进行交互、观察和修改的构件。

计算结构可以连接、分层和聚合,以创建能够以不同方式改变世界的更大的计算结构。

世界如何创造计算结构,然后作用于世界?

让我们来看一些不同规模层次的世界计算或转换结构创造的例子。下面我举几个例子。

**举例领域:**社交→生物→化学→物理

社会的

制造业

让我们以汽车、螺母和螺栓为例。

汽车是人类用来作用于世界的工具。汽车本身作用于世界,改变你的位置。工厂根据原料生产汽车。等等。换句话说,汽车只是计算结构链或层次结构中一个计算结构的例子…这些结构有助于改变世界。

汽车是如何创造出来的?汽车是由发动机、车轮、螺母和螺栓等零件组装而成的。工厂本身是一个计算或转换结构,通过聚集零件(也称为子结构)来制造汽车。像螺母和螺栓这样的材料随着能量和时间进来,汽车出来了。

螺母和螺栓是怎么来的?早在汽车发明之前,螺母和螺栓就被发明了。早期,在汽车被标准化和大规模生产之前,螺母和螺栓仅仅是因为它们在如此多不同的机器上运行良好。在制造第一辆汽车时,不需要制造螺母和螺栓。螺母和螺栓已经存在,是制造第一辆汽车时使用的逻辑和事实上的子结构。

那么有哪些可能适用于人工智能的重要概念呢?

  1. 机器(像汽车、螺母和螺栓)是计算结构的形式,以有用的方式改变世界的一部分。
  2. 机器(和计算结构)是由子结构(例如。汽车使用螺母和螺栓。)
  3. 标准化和大规模生产都使得子结构对于快速创建和大规模生产新结构很有价值。

生物的

人类、其他动物、植物甚至细菌都是不断改造世界的结构。

如果没有一个元结构积极地管理和产生它们的存在,这些生物行为者是如何在世界上出现和繁殖的?

双重协同机制(双重计算结构)

每一个行动者,换句话说,每一个人、植物、动物或其他生命形式,都在进化,以实现两个主要目标的方式改造世界。

  1. 演员成功:让演员活着,在世界上茁壮成长。
  2. 物种成功:通过繁殖和优化未来的行动者,在世界上所有可能的地方茁壮成长,从而发展和维持物种。

本质上,有两种相互作用的机制(或计算结构)同时共存。这就是“演员成功”和“物种成功”机制。

此外,“物种成功”机制是超结构,而个体行动者是在时间和空间上实现“物种成功”目标的亚结构。人、植物等。作为个体行动者对“物种成功”做出贡献,但只是随着时间的推移对许多个体行动者起作用的更大机制的一个子部分。

“行动者成功”机制在行动者内部运作,以维持其存在。人类做出选择并采取行动来维持和改善自身的生存并帮助他人。“演员成功”机制通过“物种成功”机制(繁殖、遗传、自然选择等)随着时间的推移得以维持和改进。

重要的是演员(例如人、花、草叶)在他们的一生中负责维护他们自己,他们的实例。演员之间可以有一些合作(抚养孩子等。)但个人主要负责以保持世界活力的方式改造世界。

要点:您可以为一个参与者分配多个共生目标,这些目标在同一个参与者中同时执行。例如个人和物种的成功。我们能否将多个共生目标分配给一个代表计算结构的人工角色,以控制计算结构的增殖和适应?

世界的增长和效率

是什么限制了一个物种的生长?世界上个体演员的成功。以富有成效的方式改造他们所在区域的行动者(人、植物等)茁壮成长,并产生占据世界新区域的新行动者。物种呈指数增长,直到达到极限,世界上不再有更多的参与者。

以一种草为例。这种草在土壤、光照、温度和湿度好的地方生长茂盛。种子产生并被风传播到新的地区。在新草成功的地方,草的数量将继续增长和扩大。在有阴影、土壤不好或草的密度太高的地方,新草不会成功。

那么有哪些可能适用于人工智能的重要概念呢?

  1. 生物学展示了一种健壮的机制,用于建立和维护一组成功地改变世界局部的行动者(计算结构)。潜在地,个人的人工计算结构可以通过类似的机制来建立和维护。
  2. 生物机制使演员的影响最大化,但不需要中央控制机制来编排和驱动演员的产生或优化。在大型复杂的人工计算结构中,从中央控制机制解耦通常可能是关键的。
  3. 生物机制将世界视为一个搜索空间,并且搜索新的领域,在该领域中,行动者可以有效地改变世界。潜在的相同机制可以推动对人工计算结构有用的新领域的研究。
  4. 生物机制使用遗传学、自然选择等,随着时间的推移,优化演员以最佳匹配世界。类似的需求存在于不断改进和匹配人工计算结构,以适应世界的部分或它们在其中起作用的更大的计算结构。
  5. 生物行动者需要以富有成效的方式改造世界,以获得生存和繁荣所需的资源。我们可以定义一个人工计算参与者必须做什么才能获得生存的资源。

化学的

  • 基于兴趣去做。

身体的

  • 基于兴趣去做。

我们如何实现和测试它呢?

  • 基于兴趣去做。

笔记

*关于标准化对提高一群演员的表演和效用的重要性的想法,直接来自于詹姆斯·贝森(James Bessen)与鲁斯·罗伯茨(Russ Roberts)*和詹姆斯·贝森(James Bessen)的一个经济谈话播客。在文字记录中搜索“标准化”来聚焦相关的讨论。

观察:螺母和螺栓的价值在于它们将结构锁定在一起,在使用时基本上防止了某些变形。锁定它的自我似乎是一个基本概念。在以后的文章中会有更多的介绍。

用神经网络模拟逻辑门

原文:towardsdatascience.com/emulating-l…

在本教程中,我想告诉你如何训练一个神经网络来执行逻辑门网络的功能。我将深入研究网络中每个神经元的用途,并展示没有一个是被浪费的。我们将通过使用 Tensorflow Playground 中的一个问题示例来解决这个问题,这样您就可以自己实现和试验这个想法。

逻辑门是任何现代计算机的基础。你用来阅读这篇文章的设备肯定在使用它们。关于这些门的一个伟大的事情是它们容易解释。许多这样的门是用简单的英语命名的,比如 AND,NOT and OR 门。其他人写得不太熟悉,但仍然很简单。下表总结了这些逻辑门,以便我们以后可以参考它们。

Image borrowed from medium.com/autonomous-…

另一方面,神经网络被认为是任何现代(或其他)大脑的基础,并经常被认为是无法穿透的黑匣子。通常不清楚单个神经元在做什么,然而单个逻辑门在做什么却是显而易见的。然而,神经网络的内部工作不必如此神秘,在某些情况下,神经网络结构可以简单到足以完全掌握和设计。

在本教程中,我将使用一个神经网络来模拟逻辑门网络的行为。我们将确切地观察网络中每个神经元在做什么,以及它们如何融入整体。通过这个例子,我希望你能更好地了解神经网络内部的情况。

NB。如果你想直接进入 Tensorflow 游乐场实验,那么向下滚动到本文的“轮到你了”部分。

动机——一个经过训练的神经网络什么时候可以像一个逻辑门系统一样工作?

假设你有一个只有分类变量的数据集。可能是医疗记录,其中每个患者都有一个性别类别(男性、女性)、年龄段(0–5、5–10、10–15…45–50…)、白细胞计数(高、中、低)等。你的任务可能是利用这些信息来预测今年哪些病人有感染流感的危险,因此应该注射流感疫苗。像往常一样,对于分类变量,我们将使用 one-hot-encoding ,因此每个患者的记录是一个由 1 和 0 组成的向量。

现在我们可以想象为这些数据手工编码一个逻辑网络。我们会用我们的商业规则来定义我们认为谁有流感风险,谁没有。我们可能会得出如下结论,预测值为 1 表示患者有风险,预测值为 0 表示他们没有风险。

  • 如果年龄为 25–30 白细胞计数低 那么预测 1
  • 如果年龄为 0–5那么 预测 1
  • 如果年龄为 65–70 性别为男性 预测 1
  • 否则预测 0

在 Python 中,我们的逻辑网络可能看起来像这样,编码了所有可能使你面临流感风险的情况

at_risk = ( age_is_25_30 & white_blood_cell_is_low ) or ( age_is_0_5 ) or ( age_is_65_70 & sex_is_male ) or ...

如果我们有大量的领域专业知识,或者如果我们对医疗记录进行了大量的描述性分析,我们可以对这个逻辑网络进行编程。然而,试图避免对这个网络进行硬编码,这将使用大量的专家领域知识资源、开发人员时间,并且可能引入许多偏见,这就是我们作为建模人员首先构建模型的原因。

我们不想对这个逻辑网络进行硬编码,但是如果有人或其他人能够以系统的方式为我们做这件事,那就太好了。

(进入神经网络,舞台右侧)

那么神经网络是如何变成逻辑网络的呢?

在这一节中,我将假设你至少对神经网络的概念有些熟悉。我将抛出词语偏差、重量激活功能,我不会花时间解释我在这个简单图表之外的意思。

为了使神经网络成为逻辑网络,我们需要证明单个神经元可以充当单个逻辑门。为了表明神经网络可以执行任何逻辑运算,只要表明神经元可以充当与非门(它确实可以)就足够了。然而,为了让事情变得更美好和更容易理解,让我们深入研究并展示神经元如何充当我们将需要的一组门中的任何一个——即 and 和 OR 门以及 x > 0 的比较门。

让我们用一个简单的具体例子来说明这一点。为了做到这一点,我想把你链接到 Tensorflow Playground 上的一个特定数据集。下面是从该分布中生成的一组数据的图像。橙色数据点的值为-1,蓝色数据点的值为+1。我将 x 轴坐标称为变量 x1,y 轴坐标称为变量 x2。

Example from Tensorflow playground

在上图中,您可以看到,当 x1 和 x2 都为正时,或者当 x2 和 x1 都为负时,目标变量为正。如果我们用一个逻辑网络来编码,我们可能会选择逻辑

  • 如果(x1>0) (x2 > 0) 那么预测+1
  • 如果(x1 <0) (x2 < 0) 那么预测+1
  • 否则预测-1

在 Python 中,我们可以把这个逻辑写成

expression = lambda x1,x2 : \\
    (( (x1>0) & (x2>0) ) or ( !(x1>0) & !(x2>0) ))*2 -1

如果你熟悉逻辑门,你可能会注意到,这个表达式的内部是一个 XNOR 门。

XNOR = lambda A,B : ( A & B) or ( !A & !B )

我想给大家展示的是,我们可以为这个逻辑表达式建立一个高效的神经网络。

当然,在这个例子中,最明显的是使用交叉特征 x1x2,并使用它进行预测。然而,我想展示的是,一个好的解决方案在不使用 x1x2 的情况下也是可能的,并深入研究当这一特征没有被创建时出现的网络的结构和解释。还要注意,我们要创建的逻辑神经网络可以扩展到使用 3 个或更多变量。你可以想象需要一个 3 输入 XNOR 门的变量,我们不能通过两个变量对之间的特征交叉来创建它。我们也不想做 3 个变量的所有交叉,即 x1x2x3,因为这可能会使我们的功能数量激增。

因此,让我们一项一项地通过逻辑表达式,这将为这个样本数据集做出正确的预测,并计算出我们的神经元将需要什么样的权重。记住我们想要用神经网络模拟的表达式是

(( (x1>0) & (x2>0) ) or ( !(x1>0) & !(x2>0) ))*2 -1

激活功能

我想快速说明我们将用于神经元的激活函数,Sigmoid 函数。我们这样选择的原因是因为 Sigmoid 函数的输出接近逻辑门的输出。对于 z 的所有值,逻辑门输出 1 或 0,Sigmoid 函数输出1 或0,其中 z 不接近 0。即。|z| >>0。这意味着 Sigmoid 函数将是一个很好的选择,可以帮助我们的神经元模拟我们需要的 AND 和 OR 门。

比较 x1 > 0

这是我们函数最里面的部分。我们可以使用单个神经元和 Sigmoid 激活函数很容易地计算这个表达式。在这种情况下,只有一个变量输入到神经元,x1,如果 x1 为正,我们希望神经元输出接近 1 的值,如果 x1 为负,则输出接近 0 的值。尽管这对于这个问题并不重要,但我们假设如果 x1 正好为零,那么我们希望输出为 0.5。

我们有 z = w1*x1 + b1 的激活函数的输入。查看上面的 Sigmoid 函数的图形,并考虑上面的标准,我们可以推断出我们想要 b=0,w1 应该是一个大的正数。事实上,随着 w1 趋向无穷大,该神经元的输出越来越接近逻辑比较 x1>0 的输出。然而,让我们取一个更适中的值,比如 w1=10。

在下表中,我们示出了不同 x1 值和 w1=10 时该比较神经元的输出(右手列)。您可以看到它的行为非常类似于 x1>0。

Neural comparison truth table

注意,可以应用相同的逻辑来计算比较 x2>0,并设置 w2=10 和 b2=0。

与门

现在,我们可以做更多的比较,目标逻辑表达式的下一个最内部的函数是 AND 运算符。在这种情况下,sigmoid 函数的输入将为 z=w3a1 + w4a2 + b3。这里 w3 和 w4 是权重,a1 和 a2 是第一层神经元的激活。如果 x1>0,变量 a1 非常接近 1,如果 x1 <0; the value of a2 is similar.

To emulate the AND operator we would like to set the weights and bias such that the output of the Sigmoid is very close to one if a1 and a2 are ~1 and zero otherwise. A good solution is to set b3=-3/2 * w3 and w4=w3. You can do some calculations yourself, and see how this choice in weights will fulfill our criteria (there are also some examples below). As w3 goes to infinity and w4 and b3 go to their corresponding limits, this neuron becomes more and more like a perfect AND gate. However we will choose a more moderate value of w3 = 10 and let b3 and w4 follow.

In the table below we show the output of this AND neuron (right hand column) for different values of a1 and a2 and for w1=10. You can see that it behaves very similar to an AND gate.

Neural AND gate truth table

或门,变量 a1 非常接近 0

我们逻辑表达式的下一个最内部部分是“或”门。对于或门,当一个或多个输入为~1 时,我们希望输出接近 1,否则输出为零。Sigmoid 函数的输入为 z=w7a3 + w8a4 + b5。这里 a3 表示 x1 和 x2 是否都是阳性,a4 表示 x1 和 x2 是否都是阴性。

通过与 Sigmoid 函数进行比较,并考虑上述标准,我们推断我们可以通过设置 b5=-1/2 * w7 和 w8=w7 来解决这个问题。当 w1 趋向于无穷大,b5 和 w8 趋向于它们相应的极限时,这再次接近完美的 OR 门。然而。让我们选择一个适中的值 w7=10,让 b5 和 w8 跟随。

Neural OR gate truth table

最终件-乘加

对于我们表达式的最外层部分,要么需要将神经网络的输出乘以 2,然后减去 1,要么需要一个具有线性激活函数、权重 w=2 和偏差 b=-1 的最终神经元。

把所有的放在一起

我们现在已经拥有了创建上述逻辑表达式的神经网络仿真器所需的所有部分。因此,将所有内容放在一起,网络的完整架构如下所示

Neural architecture for expression

其中权重和偏差的值是这样的

你可能会注意到非 a1 和非 a2 神经元的权重与 a1 和 a2 神经元的权重不同。这是由于“非”门,我不想陷入其中,因为再看到这个门就没意思了。然而,尝试自己解决这个问题可能会很有趣。

使用这个完整的网络,我们可以测试输入值来预测输出值。

看起来不错!它有我们想要的逻辑表达式的输出,或者至少非常接近。

培训和学习

现在我们已经证明这种神经网络是可能的,现在剩下的问题是,训练是可能的。如果我们在正确定义了层、神经元数量和激活函数之后,简单地输入从上图中提取的数据,我们能指望网络会以这种方式进行训练吗?

不,不总是,甚至不经常。像许多神经网络一样,这个问题是一个优化问题。在训练这个网络时,即使有一个近乎完美的解决方案,它也常常会陷入局部最小值。这就是你的优化算法可以发挥很大作用的地方,这是 Tensorflow Playground 不允许你改变的,可能是未来帖子的主题。

轮到你了

现在我建议你去 Tensorflow Playground 尝试自己构建这个网络,使用架构(如上图和下图所示)和上表中的权重。挑战在于仅使用 x1 和 x2 作为特征来实现,并且手动建立神经网络。请注意,由于 Tensorflow 游乐场的特性,您应该只添加前三层。发生缩放的输出层是模糊的,但是如果您构建前三层,然后在很短的时间内训练网络,您应该会得到如下结果。

在操场上,你可以通过点击连接神经元的线来编辑权重。你可以通过点击每个神经元左下角的小方块来编辑偏差值。你应该能做到亏损 0.000。记得将激活功能设置为 Sigmoid。

想法:

  • 在你通过手动输入权重建立了这个网络之后,为什么不试着从头开始训练这个网络的权重,而不是手动构建它。经过多次尝试后,我成功地做到了这一点,但我相信它对播种非常敏感,经常会陷入局部最小值。如果你找到了一个可靠的方法来训练这个网络使用这些功能和这个网络结构,请在评论中联系我们。
  • 试着用这个数量的神经元和层数来构建这个网络。在这篇文章中,我已经展示了只用这么多的神经元来做这件事是可能的。如果你引入更多的节点,那么你肯定会有一些冗余的神经元。虽然,有了更多的神经元/层,我在更持续地训练一个好模型方面有了更好的运气。
  • 我已经向您展示了两个逻辑门所需的权重和偏差以及比较,您能找到表中其他逻辑门的权重和偏差吗?特别是与非门(非与),这是一个通用门,即。如果一个神经元可以实现这个门(或一个近似值),那么这就证明了神经网络能够完成任何计算任务。

下次

我希望你喜欢阅读这篇文章,就像我喜欢发现它一样。

我想通过制作一个 Jupyter 笔记本来进一步扩展这个演示,从而在 Keras 中实现一些类似的东西。然后你可以自己玩训练神经网络逻辑门仿真器。

参考文献

如果我不提及这些以前已经触及神经网络和逻辑门主题的文章,那将是不恰当的。

[## 逻辑门的神经表示

逻辑门即“与”、“或”、“非”是过去十年中每一项技术突破的组成部分…

towardsdatascience.com](/neural-representation-of-logic-gates-df044ec922bc) [## 如何向你的#NeuralNetworks 教授逻辑?

逻辑门是电子学的基本构件。它们几乎构成了复杂的架构…

medium.com](medium.com/autonomous-…)

编码分类特征

原文:towardsdatascience.com/encoding-ca…

介绍

在机器学习项目中,一个重要的部分是特征工程。在数据集中看到分类特征是非常常见的。然而,我们的机器学习算法只能读取数值。将分类特征编码成数值是非常重要的。

在这里,我们将介绍分类特征的三种不同编码方式:

1.标签编码器和 OneHotEncoder

2.字典矢量器

3.熊猫有假人

为了您的方便,完整的代码可以在我的 github 中找到。

数据集

我们在这里使用的数据集来自 UCI 机器学习资源库。它用于以各种血液指标为特征,预测患者是否有肾脏疾病。我们用熊猫来读取数据。

# load data
df = pd.read_csv(‘datasets/chronic_kidney_disease.csv’, header=None, 
 names=[‘age’, ‘bp’, ‘sg’, ‘al’, ‘su’, ‘rbc’, ‘pc’, ‘pcc’, ‘ba’, ‘bgr’, ‘bu’, ‘sc’, ‘sod’, ‘pot’, 
 ‘hemo’, ‘pcv’, ‘wc’, ‘rc’, ‘htn’, ‘dm’, ‘cad’, ‘appet’, ‘pe’, ‘ane’, ‘class’])# head of df
df.head(10)

从表中可以看出,我们有几个分类特征,如“rbc”(红细胞)、“pc”(脓细胞)、“pcc”(脓细胞团块)等。很明显,数据集包含缺失的值,但是因为这超出了本博客的主题范围,所以我们在这里不讨论如何进行。但是填充缺失的值是必要的,并且应该在编码分类特征之前完成。您可以参考我的 github 了解如何填写缺失值。准备好分类编码的完整数据集如下所示。

标签编码器& OneHotEncoder

labelEncoder 和 OneHotEncoder 只对分类特征有效。我们首先需要使用布尔掩码提取类别特征。

# Categorical boolean mask
categorical_feature_mask = X.dtypes==object# filter categorical columns using mask and turn it into a list
categorical_cols = X.columns[categorical_feature_mask].tolist()

LabelEncoder 将指定特征下的每个类转换成一个数值。让我们一步一步来看看怎么做。

实例化标签编码器对象:

# import labelencoder
from sklearn.preprocessing import LabelEncoder# instantiate labelencoder object
le = LabelEncoder()

对每个分类列应用标签编码器:

# apply le on categorical feature columns
X[categorical_cols] = X[categorical_cols].apply(lambda col: le.fit_transform(col))X[categorical_cols].head(10)

请注意,标签编码器的输出仍然是一个数据帧。结果如下所示:

正如我们所看到的,所有的分类特征列都是二进制类。但是如果分类特征是多类的,标签编码器将为不同的类返回不同的值。参见下面的示例,“邻域”功能有多达 24 个类。

在这种情况下,只使用标签编码器不是一个好的选择,因为它为不同的类带来了自然的顺序。例如,在“邻域”功能下,a 类的值为 5,而 b 类的值为 24,那么 b 类的值是否比 a 类大?答案显然是否定的。因此,允许模型学习,这种结果将导致较差的性能。因此,对于包含多类特征的数据帧,需要 OneHotEncoder 的进一步处理。让我们看看做这件事的步骤。

实例化 OneHotEncoder 对象:

# import OneHotEncoder
from sklearn.preprocessing import OneHotEncoder# instantiate OneHotEncoder
ohe = OneHotEncoder(categorical_features = categorical_feature_mask, sparse=False ) 
# categorical_features = boolean mask for categorical columns
# sparse = False output an array not sparse matrix

我们需要使用 OneHotEncoder 中的掩码来指定分类特征。sparse=False参数输出一个非稀疏矩阵。

对数据帧应用 OneHotEncoder:

# apply OneHotEncoder on categorical feature columns
X_ohe = ohe.fit_transform(X) # It returns an numpy array

请注意,输出是 numpy 数组,而不是 dataframe。对于分类特征下的每个类,都会为其创建一个新列。例如,为十个二元类分类特征创建了 20 列。

字典矢量器

正如我们所见,LabelEncoder 和 OneHotEncoder 通常需要作为两步程序一起使用。更方便的方法是使用字典矢量器,它可以同时完成这两个步骤。

首先,我们需要将数据帧转换成字典。这可以通过熊猫[to_dict](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_dict.html)的方法来实现。

# turn X into dict
X_dict = X.to_dict(orient='records') # turn each row as key-value pairs# show X_dict
X_dict

需要orient='records'将数据帧转换成{column:value}格式。结果是一个字典列表,其中每个字典代表一个样本。注意,在这种情况下,我们不需要提取分类特征,我们可以将整个数据帧转换成字典。这是与 LabelEncoder 和 OneHotEncoder 相比的一个优势。

现在我们实例化一个字典矢量器:

# DictVectorizer
from sklearn.feature_extraction import DictVectorizer# instantiate a Dictvectorizer object for X
dv_X = DictVectorizer(sparse=False) 
# sparse = False makes the output is not a sparse matrix

sparse=False使输出成为非稀疏矩阵。

字典矢量器对转换后的字典进行拟合和转换:

# apply dv_X on X_dict
X_encoded = dv_X.fit_transform(X_dict)# show X_encoded
X_encoded

结果是一个 numpy 数组:

每行代表一个样本,每列代表一个特征。如果我们想知道每一列的特性,我们可以检查这个字典矢量器的词汇表:

# vocabulary
vocab = dv_X.vocabulary_# show vocab
vocab

拿假人

Pandas get_dummies 方法是一个非常直接的一步程序,用于获取分类特征的虚拟变量。其优势在于,您可以直接将其应用于数据帧,其中的算法将识别分类特征并对其执行获取虚拟对象操作。下面是如何做到这一点:

# Get dummies
X = pd.get_dummies(X, prefix_sep='_', drop_first=True)# X head
X.head()

prefix_sep='_'使得每个类都有一个唯一的名字,用分隔符隔开。drop_first=True从生成的虚拟特征中删除一列。目的是避免多重共线性。结果如下:

结论

LabelEncoder 和 OneHotEncoder 通常需要作为两步方法一起使用来对分类特征进行编码。LabelEncoder 输出 dataframe 类型,而 OneHotEncoder 输出 numpy 数组。OneHotEncoder 可以选择输出稀疏矩阵。DictVectorizer 是一种编码和支持稀疏矩阵输出的一步方法。熊猫得到假人的方法是迄今为止编码分类特征最直接和最简单的方法。输出将保持数据帧类型。

在我看来,第一选择是熊猫拿假人。但是如果分类特征的数量很大,DictVectorizer 将是一个很好的选择,因为它支持稀疏矩阵输出。

神经网络的编码概念、类别和分类

原文:towardsdatascience.com/encoding-co…

之前的一篇文章中,我们解释了神经网络如何从几个特征中预测一个连续值(比如房价)。我们得到的一个问题是神经网络如何对概念、类别或类进行编码。例如,无论下面的图片是否包含一只猫,神经网络如何将大量像素转换为真/假答案?

首先,这里有一些观察结果:

  • 二元分类问题是一个有“是/否”答案的问题。一些例子包括:这张图片包含一只猫吗?这是垃圾邮件吗?这个应用程序是病毒吗?这是个问题吗?
  • 多分类问题是有几个类别作为答案的问题,比如:这是什么类型的车辆(轿车/公共汽车/卡车/摩托车)?
  • 任何多分类问题都可以转化为一系列二元分类问题。(比如:这是车吗,是还是不是?这是一辆公共汽车,是还是不是?等等)

神经网络中分类的核心思想是将概念、类别和类转换成属于这些概念、类别或类的概率。

这意味着猫是 100%的猫。一只狗是 100%的狗。一辆车是 100%的车,等等。每个独立的概念本身就是概念空间中的一个维度。例如,我们可以说:

  • 一只猫是:100%的“猫”,0%的“狗”,0%的“公交车”,0%的“汽车”。[1;0;0;0]
  • 一辆车是:0%“猫”,0%“狗”,0%“公交车”,100%“车”。[0;0;0;1 ]
  • 一个是就是 100%的“是”,0%的“否”->【1;0]

类别的矢量化表示在表示该类别的维度中为 1,在其余维度中为 0。这种模式被称为 1-hot 编码。

在 mid 中有了这个想法,我们现在有了一种新的方法来将类别编码成经典的多维向量。然而,这些向量具有一些特殊性质,因为它们需要表示属于这些类别的概率或置信水平:

  • 向量长度定义了神经网络可以支持的类别数。
  • 每个维度应该限制在 0 和 1 之间。
  • 向量的和应该总是 1。
  • 所选类别是具有最高值/置信度(arg max)的类别。

因此,例如,如果我们得到[猫,狗,公共汽车,汽车]的输出[0.6,0.1,0.2,0.1],我们可以说神经网络以 60%的置信度将这张图像分类为猫。

Softmax 图层

在为分类问题设计神经网络时,为了保持最后一层概率向量的性质,有一个特殊的激活叫做“softmax”。

Softmax converts any vector into probabilities vector (that sums to 1).

softmax 所做的是,它取任意一个数字向量,对所有内容进行指数运算,然后将每个元素除以指数的和。

[2 ;1;0.1] ->指数[7.3;2.7;1.1] ->和为 11.1 ->最终向量为0.66;0.24;0.1

我们可以很容易地验证以下属性:

  • 每个分量都在 0 和 1 之间,因为指数不能为负,除以和不能超过 1。
  • 输出的总和总是等于 1。
  • 顺序维持:初始分数越高,概率越大。
  • 重要的是彼此的相对分数。例如,如果我们有这两个向量:[10;10;10]或[200;200;200],它们都将转换为相同的[1/3;1/3;1/3]概率。

最后一步是提供触发学习反向传播的损失函数。由于输出是 1-hot 编码矢量,如前所述,最合适的损失函数是对数损失函数:

The log-loss function definition

它来源于信息论香农熵。由于实际输出 y 不是 0 就是 1,这种损失正在累积 NN 对已知类别的信心不足。

  • 如果 NN 非常有信心->正确类的概率会接近 1-> log 会接近 0 ->无损失->无反向传播->无学习!
  • 如果 NN 不是很有信心->类的概率将接近 0.5(完全犹豫)->对数损失将在其最大值->大损失->使用反向传播学习的大机会。

计算指数和对数的计算开销很大。正如我们在前两部分中所看到的,softmax 层将 logit 得分提升到指数级,以获得概率向量,然后损失函数对损失进行对数运算,以计算损失的熵。

如果我们将这两个阶段结合在一层中,对数和指数会相互抵消,我们可以用更少的计算资源获得相同的最终结果。这就是为什么在许多神经网络框架和库中有一个“softmax-log-loss”函数,这比将这两个函数分开要好得多。

原载于 2018 年 7 月 30 日medium.com

使用具有交互代码的深度神经网络加密不同的医学图像

原文:towardsdatascience.com/encrypting-…

Gif from this website

因此,昨天我讨论了“ ”隐藏图像:深度隐写术 ”现在让我们将这个网络应用到医疗保健设置中。我们将利用这个网络对各种医学图像进行加密。

请注意,我们将只使用公开可用的医学图像,下面是我们将使用的数据集列表。 1。UCSB 生物分割基准数据集 2。驱动:用于血管提取的数字视网膜图像 3。超声波神经分割来自 Kaggle 4。人体模型 FDA 来自癌症影像档案 5。皮肤黑色素瘤(CPTAC-CM) 来自癌症影像档案

此外,所有的封面图像都来自这个数据集“语义图像分割的基准”。

可视化不同类型的医学图像/数据集

左图 →来自 UCSB 生物分割基准数据集 的乳腺癌细胞图像;右图 →来自 UCSB 生物分割基准数据集的 2D 细胞核图像

来自驱动器的视网膜图像:用于血管提取的数字视网膜图像

来自超声神经分割的超声图像

来自仿真模型 FDA 的拟人化胸部仿真模型图像

皮肤黑色素瘤(CPTAC-CM) 的脑部放射影像

网络架构

红框 →准备图像的神经网络(Prep Network) 黄框 →隐藏图像的神经网络(Hiding Network) 绿框 →显示图像的神经网络(Reveal Network)

主要有三个网络,一个是准备图像、隐藏图像和揭示秘密图像。我不会深入解释这个网络,因为我已经在这篇文章 中 介绍过了。

用例:通过万维网发送医学图像

男性图 →希望安全发送医学图像给爱丽丝医生的鲍勃医生 黑色圆圈 →原始医学图像 白色矩形 →准备/ 隐藏网络 红圈 →加密医学图像通过封面图像 →环球网敏感数据哪里会发生不好的事情 紫圈 →加密图像通过网络 蓝矩形 →揭露网络 天蓝色圈 →揭露医学图像 女图 →希望安全接收一些医学图像的爱丽丝博士

一个简单的用例可以是类似上面的,两个希望安全地交换医学图像的医学专家(或医生和病人)可能使用这个网络来加密和解密他们的图像。

结果

左上图 →原秘密图 右上图 →原封面图 左下图 →准备图 下中间图 →秘密+封面图 右下图 →揭露图

对于一些封面图像,网络实际上在隐藏秘密图像方面做得相当好。然而,如下图所示,在某些情况下,网络表现不佳。

左上图 →原秘密图 右上图 →原封面图 左下图 →准备图 下中间图 →秘密+封面图 右下图 →已曝光图

如上所述,隐藏秘密图像后,我们可以看到蜥蜴身上的一些文物,这可能会泄露原始图像。

左 GIF →网络如何在它的最后纪元 右 GIF →网络如何过度训练的汇编

以上是网络在最后一个时期以及随着时间的推移如何工作的汇编,随着训练的继续(通过增加时期可以看到),我们可以看到网络在隐藏图像方面做得更好。

不同类型医学图像的个体结果

乳腺癌细胞图像的加密/解密结果

细胞 2D 核图像的加密/解密结果

视网膜图像的加密/解密结果

超声图像的加密/解密结果

细胞拟人胸部模型图像的加密/解密结果

脑部放射图像的加密/解密结果

互动码

对于 Google Colab,你需要一个 Google 帐户来查看代码,而且你不能在 Google Colab 中运行只读脚本,所以在你的操场上复制一份。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

要访问 Google Colab 上的代码,请点击这里。

注意:我不想托管不属于我的医疗数据,因为我可能会违反他们的数据使用政策。所以这段代码不能直接在线运行。

透明度

为了让这个实验更加透明,我上传了我所有的命令输出到我的 github,如果你想看的话,请点击这里。

最后的话

当然,网络并没有做得足够好以至于不能在现实世界中使用,但是这是一个开始。我很高兴看到人工智能如何影响计算机/网络安全。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你希望看到我所有写作的列表,请在这里查看我的网站。

同时,在我的 twitter 上关注我这里,访问我的网站,或者我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。

参考

  1. [NIPS 2017/Google] —在众目睽睽之下隐藏图像:使用交互式代码的深度隐写术[……]。(2018).走向数据科学。检索于 2018 年 4 月 5 日,来自https://towards data science . com/nips-2017-Google-hiding-images-in-plain-sight-deep-steganography-with-interactive-code-e 5 efecae 11 ed
  2. s . balu ja(2017 年)。隐藏图像:深度隐写术。神经信息处理系统进展(第 2066-2076 页)。
  3. 生物分割|生物图像信息学中心|加州大学圣巴巴拉分校。(2018).Bioimage.ucsb.edu。于 2018 年 4 月 5 日检索,来自bioimage.ucsb.edu/research/bi…
  4. CP tac-CM——癌症影像存档(TCIA)公共访问——癌症影像存档维基。(2018).Wiki.cancerimagingarchive.net。检索于 2018 年 4 月 5 日,来自https://wiki . cancer imaging archive . net/display/Public/CP tac-CM
  5. 幻影 FDA 癌症影像存档(TCIA)公共访问-癌症影像存档维基。(2018).Wiki.cancerimagingarchive.net。检索于 2018 年 4 月 5 日,来自https://wiki . cancer imaging archive . net/display/Public/Phantom+FDA
  6. 驱动:下载。(2018).isi . uu . nl . 2018 年 4 月 5 日检索,来自www.isi.uu.nl/Research/Da…
  7. “超声波神经分割| Kaggle”。2018.Kaggle.Com。2018 年 4 月 5 日访问。www.kaggle.com/c/ultrasoun…
  8. 惠,L. (2018)。语义图像分割的基准。Ntu.edu.sg .检索 2018 年 4 月 5 日,来自http://www . NTU . edu . SG/home/asjfcai/Benchmark _ Website/Benchmark _ index . html

端到端数据科学示例:用逻辑回归预测糖尿病

原文:towardsdatascience.com/end-to-end-…

顾名思义,本教程是使用数据科学解决现实世界问题的端到端示例。我们将使用机器学习来预测一个人是否患有糖尿病,基于患者的信息,如血压、身体质量指数(身体质量指数)、年龄等。本教程介绍了数据科学工作流程的各个阶段。具体来说,本教程包含以下几个部分

  • 概观
  • 数据描述
  • 数据探索
  • 数据准备
  • 训练和评估机器学习模型
  • 解读 ML 模型
  • 保存模型
  • 用模型做预测
  • 后续步骤

概观

数据由“国家糖尿病、消化和肾脏疾病研究所”收集并提供,作为皮马印第安人糖尿病数据库的一部分。从一个较大的数据库中选择这些实例有几个限制。特别是,这里的所有患者都属于皮马印第安人(美洲土著人的一个亚群),并且都是 21 岁以上的女性。

我们将使用 Python 和一些流行的数据科学相关包。首先,我们将导入pandas从一个 CSV 文件中读取我们的数据,并操纵它以供进一步使用。我们还将使用numpy将数据转换成适合我们的分类模型的格式。我们将使用seabornmatplotlib进行可视化。然后我们将从sklearn引入逻辑回归算法。这个算法将帮助我们建立分类模型。最后,我们将使用sklearn中可用的joblib来保存我们的模型以备将来使用。

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
% matplotlib inlinefrom sklearn.linear_model import LogisticRegression
from sklearn.externals import joblib

数据描述

我们将数据保存在名为diabetes.csv的 CSV 文件中。我们首先将数据集读入名为diabetesDF的 pandas 数据帧,然后使用head()函数显示数据集中的前五条记录。

diabetesDF = pd.read_csv('diabetes.csv')
print(diabetesDF.head())

First 5 records in the Pima Indians Diabetes Database

以下特征有助于我们预测一个人是否患有糖尿病:

  • **怀孕次数:**怀孕次数
  • **葡萄糖:**口服葡萄糖耐量试验中超过 2 小时的血浆葡萄糖浓度
  • **血压:**舒张压(毫米汞柱)
  • **皮厚:**三头肌皮褶厚度(mm)
  • 胰岛素: 2 小时血清胰岛素(μU/ml)
  • **身体质量指数:**身体质量指数(体重公斤/(身高米)2)
  • **糖尿病谱系功能:**糖尿病谱系功能(根据家族史对糖尿病可能性评分的功能)
  • **年龄:**年龄(岁)
  • **结果:**类别变量(0 表示非糖尿病,1 表示糖尿病)

让我们也确保我们的数据是干净的(没有空值,等等)。

diabetesDF.info() # output shown below<class 'pandas.core.frame.DataFrame'>
RangeIndex: 768 entries, 0 to 767
Data columns (total 9 columns):
Pregnancies                 768 non-null int64
Glucose                     768 non-null int64
BloodPressure               768 non-null int64
SkinThickness               768 non-null int64
Insulin                     768 non-null int64
BMI                         768 non-null float64
DiabetesPedigreeFunction    768 non-null float64
Age                         768 non-null int64
Outcome                     768 non-null int64
dtypes: float64(2), int64(7)
memory usage: 54.1 KB

请注意,在上图的样本中,数据确实有一些缺失值(参见胰岛素= 0)。理想情况下,我们可以将这些 0 值替换为该特性的平均值,但现在我们将跳过这一步。

数据探索

现在让我们研究一下我们的数据集,感受一下它的样子,并获得一些关于它的见解。

让我们从寻找每一对特征(和结果变量)的相关性开始,并使用热图可视化相关性。

corr = diabetesDF.corr()
print(corr)
sns.heatmap(corr, 
         xticklabels=corr.columns, 
         yticklabels=corr.columns)

Output of feature (and outcome) correlations

Heatmap of feature (and outcome) correlations

在上面的热图中,颜色越亮表示相关性越强。从表格和热图中我们可以看出,血糖水平、年龄、身体质量指数和怀孕次数都与结果变量有显著相关性。还要注意特征对之间的相关性,比如年龄和怀孕,或者胰岛素和皮肤厚度。

让我们看看数据集中有多少人是糖尿病患者,有多少人不是。下面是相同的柱状图:

Barplot visualization of number of non-diabetic (0) and diabetic (1) people in the dataset

可视化单个变量和结果之间的关系也是有帮助的。下面,我们将看到年龄和结果之间的关系。您可以类似地可视化其他特征。该图是每个输出类的平均年龄图。我们可以看到,糖尿病患者的平均年龄更高。

Average age of non-diabetic and diabetic people in the dataset

顺便提一句,这个教程摘自 Commonlounge 上的数据科学课程。该课程包括许多实践作业和项目。另外,80%的课程内容都是免费的!如果你对学习数据科学感兴趣,绝对推荐去看看。

数据集准备(拆分和归一化)

当使用机器学习算法时,我们应该总是将数据分成训练集和测试集。(如果我们运行的实验数量很大,那么我们应该将数据分成 3 部分,即训练集、开发集和测试集)。在我们的例子中,我们还将分离出一些数据用于人工交叉检查。

数据集包括总共 767 名患者的记录。为了训练我们的模型,我们将使用 650 条记录。我们将使用 100 条记录进行测试,最后 17 条记录用于交叉检查我们的模型。

dfTrain = diabetesDF[:650]
dfTest = diabetesDF[650:750]
dfCheck = diabetesDF[750:]

接下来,我们分离标签和特征(对于训练和测试数据集)。除此之外,我们还会将它们转换为 NumPy 数组,因为我们的机器学习算法处理 NumPy 数组格式的数据。

trainLabel = np.asarray(dfTrain['Outcome'])
trainData = np.asarray(dfTrain.drop('Outcome',1))
testLabel = np.asarray(dfTest['Outcome'])
testData = np.asarray(dfTest.drop('Outcome',1))

作为使用机器学习之前的最后一步,我们将标准化我们的输入。机器学习模型通常从输入标准化中受益匪浅。这也使我们在以后查看模型权重时,更容易理解每个特性的重要性。我们将对数据进行标准化,使每个变量的平均值为 0,标准差为 1。

means = np.mean(trainData, axis=0)
stds = np.std(trainData, axis=0)trainData = (trainData - means)/stds
testData = (testData - means)/stds# np.mean(trainData, axis=0) => check that new means equal 0
# np.std(trainData, axis=0) => check that new stds equal 1

训练和评估机器学习模型

我们现在可以训练我们的分类模型。我们将使用一个叫做逻辑回归的机器简单学习模型。因为模型在 sklearn 中很容易获得,所以训练过程非常容易,我们可以用几行代码就可以完成。首先,我们创建一个名为 diabetesCheck 的实例,然后使用 fit 函数来训练模型。

diabetesCheck = LogisticRegression()
diabetesCheck.fit(trainData, trainLabel)

接下来,我们将使用我们的测试数据来找出模型的准确性。

accuracy = diabetesCheck.score(testData, testLabel)
print("accuracy = ", accuracy * 100, "%")

打印语句将打印accuracy = 78.0 %

解读 ML 模型

为了更好地理解逻辑回归模型内部的情况,我们可以直观地看到我们的模型如何使用不同的特性,以及哪些特性具有更大的影响。

coeff = list(diabetesCheck.coef_[0])
labels = list(trainData.columns)
features = pd.DataFrame()
features['Features'] = labels
features['importance'] = coeff
features.sort_values(by=['importance'], ascending=True, inplace=True)
features['positive'] = features['importance'] > 0
features.set_index('Features', inplace=True)
features.importance.plot(kind='barh', figsize=(11, 6),color = features.positive.map({True: 'blue', False: 'red'}))
plt.xlabel('Importance')

Visualization of the weights in the Logistic Regression model corresponding to each of the feature variables

从上图,我们可以得出以下结论。

  1. 血糖水平、身体质量指数、妊娠和糖尿病家系功能对模型有显著影响,尤其是血糖水平和身体质量指数。很高兴看到我们的机器学习模型与我们一生中从医生那里听到的相匹配!
  2. 血压对预测有负面影响,即较高的血压与没有糖尿病的人相关。(另外,注意血压作为一个特征比年龄更重要,因为血压的更高)。
  3. 虽然年龄比身体质量指数与产出变量更相关(正如我们在数据探索中看到的),但该模型更依赖于身体质量指数。发生这种情况有几个原因,包括这样一个事实,即年龄捕捉到的相关性也被一些其他变量捕捉到,而身体质量指数捕捉到的信息没有被其他变量捕捉到。

注意,上面的解释要求我们的输入数据是标准化的。没有这一点,我们就不能说的重要性的权重成正比。

保存模型

现在,我们将使用joblib保存训练好的模型以备将来使用。

joblib.dump([diabetesCheck, means, stds], 'diabeteseModel.pkl')

为了检查我们是否正确地保存了模型,我们将使用我们的测试数据来检查我们保存的模型的准确性(如果我们正确地保存了它,我们应该观察不到准确性的变化)。

diabetesLoadedModel, means, stds = joblib.load('diabeteseModel.pkl')
accuracyModel = diabetesLoadedModel.score(testData, testLabel)
print("accuracy = ",accuracyModel * 100,"%")

用模型做预测

我们现在将使用未使用的数据来看看如何进行预测。我们在 dfCheck 中有未使用的数据。

print(dfCheck.head())

我们现在将使用第一个记录来进行预测。

sampleData = dfCheck[:1]# prepare sample
sampleDataFeatures = np.asarray(sampleData.drop('Outcome',1))
sampleDataFeatures = (sampleDataFeatures - means)/stds# predict
predictionProbability = diabetesLoadedModel.predict_proba(sampleDataFeatures)
prediction = diabetesLoadedModel.predict(sampleDataFeatures)
print('Probability:', predictionProbability)
print('prediction:', prediction)

从上面的代码我们得到:

Probability: [[ 0.4385153,  0.5614847]]
prediction: [1]

数组的第一个元素预测概率 0.438 是类为 0 的概率,第二个元素 0.561 是类为 1 的概率。概率总和为 1。正如我们可以看到的, 1 是更可能的类别,我们得到**【1】**作为我们的预测,这意味着模型预测此人患有糖尿病。

后续步骤

有很多方法可以改进上述模型。这里有一些想法。

  1. 输入特征分块应该有所帮助,即创建特定范围内的血压、特定范围内的葡萄糖水平等的新变量。
  2. 您还可以通过用平均值替换 0 值来改进数据清理。
  3. 阅读一些关于医生诊断糖尿病患者最依赖的指标,并相应地创建新的功能。

看看你能否达到 85-90%的准确率。本教程可以用 jupyter 笔记本入门: pima_indians.ipynb

由 Keshav Dhandhania 和 Bishal Lakha 合著。

最初作为 的教程发表于 www.commonlounge.com作为 数据科学课程 的一部分。

使用 AWS EMR、Apache Spark (Pyspark)和 MongoDB Tutorial(包含百万首歌曲数据)的端到端分布式 ML

原文:towardsdatascience.com/end-to-end-…

在这篇文章中,我将提到如何使用 Python Spark API pyspark 以分布式方式运行 ML 算法。我们还将了解如何设置 AWS EMR 实例以在云上运行我们的应用程序,如何设置 MongoDB 服务器作为 NoSQL 数据库以存储非结构化数据(如 JSON、XML ),以及如何通过使用 pyspark 功能快速进行数据处理/分析。

要求:

  • AWS 帐户(或者您可以在本地运行)
  • Python 2.7(用于运行将要提供的脚本)

1。设置 EMR 实例

什么是亚马逊 EMR?(网址:【aws.amazon.com/emr/ )

Amazon EMR 提供了一个托管的 Hadoop 框架,可以轻松、快速且经济高效地跨可动态扩展的 Amazon EC2 实例处理大量数据。还可以在亚马逊 EMR 中运行其他流行的分布式框架如 Apache SparkHBasePresto、Flink ,与亚马逊 S3、亚马逊 DynamoDB 等其他 AWS 数据仓库中的数据进行交互。

尽管这一步是可选的,以便运行脚本并自上而下地了解正在发生的事情,但我们可能需要分布式计算的主要原因通常是我们的本地机器规格无法进行我们想要的处理、分析或建模。

我们还可以启动多个 EC2 实例并配置主节点和工作节点,但所有这些步骤实际上都由 EMR 负责。简而言之,EMR 将允许我们在主实例上运行我们想要运行的作业后,自动分发这些作业。否则,我们应该在所有节点上配置和安装 Spark。

下面你可以看到 Spark 框架是如何分配工作的。驱动程序运行主进程,将其转换为任务,并为执行者安排任务。然后工人(执行者)运行这些任务。

Driver and Executor Architecture in Spark

为了启动我们的第一个电子病历实例,我们需要登录到 aws.amazon.com,然后控制台会出现。

select “EMR” here

click “Create Cluster”

Here we should select “Spark” under Applications and define how many instances we want for our application. For example 1 for master and 2 for core nodes (executors which will run tasks). So here we will be distributing the job into 2 worker nodes.

您还应该给出一个密钥对,以便以后 ssh 进入节点并运行您的应用程序。一旦你点击创建你的集群,它将开始引导,一旦一切准备就绪,主和核心将等待。关于电子病历的一个关键点是,一旦开始就无法停止。这意味着您不能像常规 EC2 实例一样停止和启动 EMR 实例。因此,运行所有应用程序,然后终止 EMR 是一个好的做法。如果你试图在工作没有完成的情况下停止,你将需要重新开始。数据处理或分析工作的另一个常见做法是使用亚马逊 S3。EMR、S3、Spark 在一起相处得很好。您可以将数据存储在 S3,然后读取和处理数据,而无需实际存储在您的节点中,通过 spark 处理后,您可以将数据写回 S3 并终止 EMR。

EMR 实例准备就绪后,您可以使用您的 pem 密钥和主服务器的公共 DNS 进入您的终端并进行 ssh。

$ ssh -i .ssh/mykey.pem hadoop@ec2–xx–xxx–xxx-xx.us-west-2.compute.amazonaws.com

EMR terminal

2.获取数据

在本教程中,我将使用百万首歌曲数据集的子集,但是任何超过几个 GB 的数据集都会支持我们的观点。下面是多种方式获取数据的链接:https://lab Rosa . ee . Columbia . edu/million song/pages/getting-dataset。尽管他们在 EC2 映像中提供了这个数据集,但为了完整起见,我们将假设这是我们自己的数据,我们试图将其导入 AWS。我们将在这里探索的数据称为 MillionSongSubset,它随机选择了百万首歌曲的子集,即 10,000 首歌曲的集合。你可以参考“百万歌曲子集”的链接,并从那里下载 tar.gz 的文件。您可以将数据下载到您的本地,然后再下载到主节点和工作节点的 scp,但这将花费 scp 很长时间。所以我在这里推荐使用一个通过 Chrome 的 curlwget 扩展,将 tar.gz 文件直接下载到主节点和工作节点。我在 Chrome 上使用的扩展叫做 CurlWget。尝试在你的节点中存储数据/mnt/

下载完数据后,您会看到有两个主文件夹 data/A/和 data/B/这些文件夹有子目录,最终在每个. h5 层次数据文件下有单首歌曲数据,关于数据的更多信息在获取数据集 url 中提供。

3.用派斯帕克把 H5 变成 RDD

到目前为止,我们已经启动了我们的 EMR 实例,并将数据放入所有节点的相同路径中,现在我们将数据转换为 Spark RDD,以便使用 pyspark 及其分布式计算功能。RDD(弹性分布式数据集)是 spark 表示数据并将其存储在分区中的方式。数据可以来自文本、csv、json 格式或数据库。

我找不到将 H5 文件转换成 RDD 的直接方法,但这个链接https://www . hdf group . org/2015/03/from-HD F5-datasets-to-Apache-spark-rdds/启发我编写自己的脚本,使用 pyspark 并行进行这种转换。基本思想是在一个 python 列表中收集所有 h5 文件,并根据这个列表创建一个 RDD。然后,我们可以很容易地做我们想要的转换使用地图功能在这个 RDD。

# 8 is number of partitions to distribute the data
# For local applications it will be distributed to 8 threadsfile_paths = sc.parallelize(h5_file_paths, 8)# Read and convert to python dict in parallelsongs_rdd = file_paths.map(lambda x: h5todict(x))
songs = songs_rdd.collect()

在这里,我们也收集歌曲作为 python 列表,以便创建我们的 MongoDB 数据库,因为教程的一部分也要显示 MongoDB,但我们可能只坚持使用包含 python 字典的 RDD(在这种情况下,每个元素都是一个 python 字典,它在层次关系中有一个歌曲数据)。拥有 RDD 就足以通过 pyspark 继续处理、分析和建模。

边注:这里提供了转换的完整脚本:https://github . com/KeremTurgutlu/distcomputing/blob/master/million songs-Project/H5 to mongo . py。所有节点都应该安装了所需的 python 包,比如 h5py、json、numpy…

为此,您需要 ssh 到您的工作节点和主节点。要 ssh 到 worker 节点,您应该在 master 中拥有您的 pem 密钥,并通过 master 终端使用该密钥进行 ssh。之后,您需要做的就是 pip 安装尚未提供的所需软件包。

4.设置 MongoDB

在这一步中,我们将在主节点中安装和设置 mongodb。可以按照这里的步骤https://docs . MongoDB . com/manual/tutorial/install-MongoDB-on-red-hat/进行安装。安装后,您应该创建一个目录,用于存储您创建的数据库。同样,在/mnt 下将它们创建为/mnt/mongo/db 更有利于磁盘的使用。您还需要通过运行以下命令来设置对此目录的权限:

$ sudo chown -R `id -un` /mnt/mongo/db/

运行此步骤后:

$ mongod --dbpath /mnt/mongo/db

现在 MongoDB 服务器应该在监听连接。在一个单独的终端上,您可以运行 mongo 并启动 mongo shell。在 mongo shell 中,您可以使用 show dbs 查看当前数据库。

现在,与 MongoDB 建立有效连接。接下来,我们需要在所有节点上安装 pymongo 包,它是 MongoDB 的 python API。之后,我们可以在我们的主机上运行通过 github repo 提供的脚本。为了运行该脚本,我们还应该在同一路径中有https://github . com/KeremTurgutlu/dist computing/blob/master/million songs-Project/user _ definition . py。在用户定义中,我们定义了执行器驱动内存、最大结果和开销内存,以便在运行应用程序时不会遇到内存问题。

这个脚本将读取 h5 文件,并在默认情况下在名为“MillionSongs”的数据库下创建一个名为“songs”的 mongoDB 集合(当然,您可以在 user_definition.py 中为数据库和集合指定其他名称)。你可能认为数据库是一个普通的 SQL 数据库,集合是一个 SQL 表,文档(单曲的 dict)是表中的一行。

5.分布式分析和 ML

此时,我们有一个名为“MillionSongs”的 MongoDB 数据库,并位于一个名为“Songs”的集合下(或者您指定的数据库和集合)。对于您自己的数据,为了有一个数据库和集合,例如来自位于您当前目录下的 json 文件,您可以从另一个终端运行这个命令,而 mongod 在另一个终端上运行:

$ mongoimport --db dbName --collection collectionName --file fileName.json

使用 mongodb,可以像在 SQL 中一样通过查询数据来非常容易地过滤、选择、聚集和执行许多其他操作。在我们的歌曲集合中,每首歌曲都被表示为一个文档(一个 python 字典),这是由于我们通过 h5tomongo.py 脚本创建和插入它们的方式。

我们的第一个任务是预测某首歌是在哪一个年代发行的。有关数据字段的更多详细说明,您可能会发现此链接很有帮助:https://lab Rosa . ee . Columbia . edu/million song/pages/field-list。这项任务在 Kaggle 和 UCI 网站上都有推广。我们将使用 segments_timbre 来完成我们的任务,segments _ timbre 是一种类似 MFCC 主成分分析的 2d 特征,涉及歌曲的纹理、歌曲的能量、歌曲的可跳性和歌曲的年份。

2d features for 12 segments

首先,让我们从 mongodb 中收集我们想要的数据:

我们通过定义具有分层字段名的字典来定义我们想要返回的字段(例如在我们的文档中 year 具有 analysis -> songs -> year 层次结构),1 表示我们想要返回的字段,0 表示我们不想要的字段。默认情况下,还会返回文档的 _id,这就是我们明确取消选择的原因。您可以看到,我们在 find 函数中定义了一个过滤器,其中创建了 train_year_data 和 test_year_data。测试数据将是缺少年份字段的数据(在原始数据中被估算为 0)。我们的任务可能是用训练数据建立一个好的预测模型,以便进一步估算这个测试集中缺失的年份。

from pymongo import MongoClientclient = MongoClient()
db = client[dbname]
collection = db[collection_name]fields = {'musicbrainz.songs.year':1,                    'analysis.segments_timbre':1,                    'analysis.songs.energy':1,                    'analysis.songs.danceability':1,                    'metadata.songs.title':1,                    'metadata.songs.artist_name': 1,
'_id':0}train_year_data = collection.find({'musicbrainz.songs.year':{'$gte':1920}}, fields)
test_year_data = collection.find({'musicbrainz.songs.year':{'$eq':0}}, fields)

其次,让我们创建 rdd 和数据帧:

Spark SQL 支持我们将用于输入机器学习算法的数据帧,它也非常方便地支持 pandas 数据帧。从 MongoDB collection 过渡到 Spark RDD 非常简单:

# create train and test rdds
train_year_rdd = sc.parallelize(list(train_year_data))
test_year_rdd = sc.parallelize(list(test_year_data))

我们将通过取所有段的协方差和每个段的平均值,从 timbre _ segments 中创建一个 1d 特征向量。总计 12 个分段的 90 个特征。我们将通过 map 应用两个自定义函数,以获得创建 Spark SQL 数据框架所需的特性。因为 train_year_rdd 和 test_year_rdd 仍然是层次化的 python dict 格式,我们不能用它来创建数据帧以输入到 ML 算法中。你可以在这里找到这些步骤的源代码:https://github . com/KeremTurgutlu/distcomputing/blob/master/million songs-Project/predict _ year . py

# create train and test dataframestrain_full_df = train_year_rdd.map(lambda d: getYearFeatures(d)).\
                               map(lambda d: getDFeatures(d)).toDF()test_df = test_year_rdd.map(lambda d: getYearFeatures(d)).\
                        map(lambda d: getDFeatures(d, True)).toDF()

创建培训和验证集:

# split to train and validation dataframes
train_df, val_df = train_full_df.randomSplit([0.7, 0.3])

创建矢量汇编程序:

Vector assembler 获取所需列名的列表,这些列名将被输入 ML 算法,组合它们并为优化的 spark ML 做好准备。

# define vector assembler and transform dataframes into correct format
# cache train and validation dataframes for fast iterationsva = VectorAssembler(inputCols=x_cols, outputCol='features')
train_va=va.transform(train_df).select('features','decade').cache()
val_va=va.transform(val_df).select('features', 'decade').cache()
test_va=va.transform(test_df).select('features', 'decade').cache()

Pyspark ML 包提供了多种型号、变压器和许多选项。查阅文档就好:http://spark . Apache . org/docs/2 . 2 . 0/API/python/py spark . ml . html个人应用。几乎所有的分布式 ML 算法都是通过这个 API 提供的,而不是深度学习。对于深度学习,你可以检查 H20.ai 的苏打水:www.h2o.ai/sparkling-w…或者简单地使用现代的 GPU,甚至使用 Pytorch 的 nn.DataParallel 进行多次处理

既然我们有了向量组装器,现在我们可以进行实际的分布式训练。我将展示运行逻辑回归模型的代码,但是 repo 中提供的脚本同时运行逻辑回归和随机森林。

# define model and fit lr = LogisticRegression(featuresCol='features', labelCol='decade',regParam=0.01, maxIter=1000, fitIntercept=True)
lr_model = lr.fit(train_va)

或者我们可以简单地进行交叉验证的网格搜索

# create cross validation
cv = CrossValidator().setEstimator(lr).setEvaluator(evaluator).setNumFolds(5)
#ParamGridBuilder() – combinations of parameters and their values.
paramGrid = ParamGridBuilder().addGrid(lr.maxIter, [1000]).addGrid(lr.regParam, [0.0001, 0.001, 0.005, 0.01, 0.05, 0.1, 0.5]).build()
#setEstimatorParamMaps() takes ParamGridBuilder().
cv.setEstimatorParamMaps(paramGrid)
cvmodel = cv.fit(train_va)

由于准确性不够好,我们通过使用多级 F1 分数来评估模型。

运行提供的脚本:

为了通过终端运行 spark 作业,您需要使用 spark-submit 命令。在将您想要的脚本克隆或获取到一个文件夹中,并在 h5toMongo.py 中定义了正确的 file _ roots 以及在 user_definition 中定义了所需的内存分配之后,您可以运行:

$ spark-submit h5toMongo.py

$ spark-submit predict_year.py

我希望这个简短的教程对你有所帮助,有很多内容需要你通过文档和经验来学习。因此,如果您有任何建议、推荐或问题,请告诉我。

感谢阅读!

端到端—使用 Python 框架的预测模型

原文:towardsdatascience.com/end-to-end-…

预测建模总是一项有趣的任务。花费的主要时间是了解企业需要什么,然后确定您的问题。下一步是根据需求定制解决方案。当我们解决许多问题时,我们明白可以用一个框架来建立我们的第一批模型。这个框架不仅给你更快的结果,它还帮助你根据结果计划下一步。

在本文中,我们将看到如何将基于 Python 的框架应用于各种预测建模任务。这将涵盖/触及 CRISP-DM 流程中的大部分领域。那么什么是 CRISP-DM 呢?

[## 数据挖掘的跨行业标准流程-维基百科

数据挖掘的跨行业标准过程,称为 CRISP-DM,是一个数据挖掘过程模型,它描述了…

en.wikipedia.org](en.wikipedia.org/wiki/Cross-…)

下面是代码的链接。在本文中,为了简洁起见,我跳过了许多代码。阅读本文时,请遵循边上的 Github 代码。

[## sundar 0989/EndtoEnd—-使用 Python 进行预测建模

通过在 GitHub 上创建帐户,为使用 Python 的端到端预测建模开发做出贡献。

github.com](github.com/Sundar0989/…)

本文中讨论的框架分为 9 个不同的领域,我将它们与它们在 CRISP DM 过程中所处的位置联系起来。

加载数据集— 数据理解

**import** **pandas** **as** **pd**

df = pd.read_excel("bank.xlsx")

数据转换— 数据准备

现在,我们有了熊猫数据框架中的数据集。接下来,我们分别使用 df.info()和 df.head()查看变量描述和数据集内容。使用下面的代码将目标变量(' Yes'/'No ')转换为(1/0)。

df['target'] = df['y'].apply(**lambda** x: 1 **if** x == 'yes' **else** 0)

描述性统计— 数据理解

探索性统计帮助建模者更好地理解数据。在这个框架中有一些这样的统计数据。首先,我们使用下面的代码检查数据集中每一列的缺失值。

df.isnull().mean().sort_values(ascending=**False**)*100

其次,我们使用下面的代码检查变量之间的相关性。

**import** **seaborn** **as** **sns**
**import** **matplotlib.pyplot** **as** **plt**
%matplotlib inline
corr = df.corr()
sns.heatmap(corr, 
        xticklabels=corr.columns,
        yticklabels=corr.columns)

最后,在框架中,我加入了一个宁滨算法,该算法自动将输入变量纳入数据集中,并创建一个二元图(输入与目标)。

bar_color = '#058caa'
num_color = '#ed8549'

final_iv,_ = data_vars(df1,df1['target'])
final_iv = final_iv[(final_iv.VAR_NAME != 'target')]
grouped = final_iv.groupby(['VAR_NAME'])
**for** key, group **in** grouped:
    ax = group.plot('MIN_VALUE','EVENT_RATE',kind='bar',color=bar_color,linewidth=1.0,edgecolor=['black'])
    ax.set_title(str(key) + " vs " + str('target'))
    ax.set_xlabel(key)
    ax.set_ylabel(str('target') + " %")
    rects = ax.patches
    **for** rect **in** rects:
        height = rect.get_height()
        ax.text(rect.get_x()+rect.get_width()/2., 1.01*height, str(round(height*100,1)) + '%', 
                ha='center', va='bottom', color=num_color, fontweight='bold')

The values in the bottom represent the start value of the bin.

变量选择— 数据准备

请阅读我下面的文章,关于在这个框架中使用的变量选择过程。基于投票系统选择变量。我们使用不同的算法来选择特征,然后最后每个算法为他们选择的特征投票。最终投票数用于选择建模的最佳特征。

[## 使用 Python 的变量选择—基于投票的方法

变量选择是预测建模过程中的关键步骤之一。这是一门艺术。简单来说…

medium.com](medium.com/@sundarstyl…)

模型— 建模

到目前为止,80%的预测模型工作已经完成。为了完成剩下的 20%,我们将数据集分成训练/测试,并对数据尝试各种算法,然后选择最佳算法。

**from** **sklearn.cross_validation** **import** train_test_split

train, test = train_test_split(df1, test_size = 0.4)
train = train.reset_index(drop=**True**)
test = test.reset_index(drop=**True**)

features_train = train[list(vif['Features'])]
label_train = train['target']
features_test = test[list(vif['Features'])]
label_test = test['target']

我们在训练数据集上应用不同的算法,并在测试数据上评估性能,以确保模型是稳定的。该框架包括随机森林、逻辑回归、朴素贝叶斯、神经网络和梯度推进的代码。我们可以根据需要添加其他型号。下面提供了随机森林代码。

**from** **sklearn.ensemble** **import** RandomForestClassifier
clf = RandomForestClassifier()

clf.fit(features_train,label_train)

pred_train = clf.predict(features_train)
pred_test = clf.predict(features_test)

**from** **sklearn.metrics** **import** accuracy_score
accuracy_train = accuracy_score(pred_train,label_train)
accuracy_test = accuracy_score(pred_test,label_test)

**from** **sklearn** **import** metrics
fpr, tpr, _ = metrics.roc_curve(np.array(label_train), clf.predict_proba(features_train)[:,1])
auc_train = metrics.auc(fpr,tpr)

fpr, tpr, _ = metrics.roc_curve(np.array(label_test), clf.predict_proba(features_test)[:,1])
auc_test = metrics.auc(fpr,tpr)

超参数整定— 建模

此外,还可以调整模型的超参数来提高性能。下面是一段代码。

**from** **sklearn.model_selection** **import** RandomizedSearchCV
**from** **sklearn.ensemble** **import** RandomForestClassifier

n_estimators = [int(x) **for** x **in** np.linspace(start = 10, stop = 500, num = 10)]
max_features = ['auto', 'sqrt']
max_depth = [int(x) **for** x **in** np.linspace(3, 10, num = 1)]
max_depth.append(**None**)
min_samples_split = [2, 5, 10]
min_samples_leaf = [1, 2, 4]
bootstrap = [**True**, **False**]

random_grid = {'n_estimators': n_estimators,
               'max_features': max_features,
               'max_depth': max_depth,
               'min_samples_split': min_samples_split,
               'min_samples_leaf': min_samples_leaf,
               'bootstrap': bootstrap}

rf = RandomForestClassifier()

rf_random = RandomizedSearchCV(estimator = rf, param_distributions = random_grid, n_iter = 10, cv = 2, verbose=2, random_state=42, n_jobs = -1)
rf_random.fit(features_train, label_train)

最终模型和模型性能— 评估

目前,我们选择了能提供更高精度值的最终模型。然而,我们还没有完成。我们需要基于各种度量来评估模型性能。该框架包含计算实际与预测值交叉表、ROC 曲线、十分位数、KS 统计、提升图、实际与预测图、增益图的代码。我们将在下面逐一介绍。

  1. 交叉表
pd.crosstab(label_train,pd.Series(pred_train),rownames=['ACTUAL'],colnames=['PRED'])

Crosstab of Actual vs Predicted values

2。ROC/AUC 曲线或 c 统计

from bokeh.charts import Histogram
from ipywidgets import interact
from bokeh.plotting import figure
from bokeh.io import push_notebook, show, output_notebook
output_notebook()from sklearn import metrics
preds = clf.predict_proba(features_train)[:,1]fpr, tpr, _ = metrics.roc_curve(np.array(label_train), preds)
auc = metrics.auc(fpr,tpr)p = figure(title="ROC Curve - Train data")
r = p.line(fpr,tpr,color='#0077bc',legend = 'AUC = '+ str(round(auc,3)), line_width=2)
s = p.line([0,1],[0,1], color= '#d15555',line_dash='dotdash',line_width=2)
show(p)

3。十分位数图和 Kolmogorov Smirnov (KS)统计数据

在后端执行一个宏来生成下图。黄色突出显示的数字是 KS 统计值。

deciling(scores_train,['DECILE'],'TARGET','NONTARGET')

4。提升图、实际与预测图、收益图

与十分位数图类似,宏用于生成下面的图。

gains(lift_train,['DECILE'],'TARGET','SCORE')

保存模型以备将来使用— 部署

最后,我们开发了我们的模型并评估了所有不同的指标,现在我们准备在生产中部署模型。部署前的最后一步是保存我们的模型,这是使用下面的代码完成的。

**import** **pandas**
**from** **sklearn.externals** **import** joblib

filename = 'final_model.model'
i = [d,clf]
joblib.dump(i,filename)

这里,“clf”是模型分类器对象,“d”是标签编码器对象,用于将字符转换为数字变量。

评分新数据— 部署

为了评分,我们需要将模型对象(clf)和标签编码器对象加载回 python 环境。

*# Use the code to load the model*
filename = 'final_model.model'

**from** **sklearn.externals** **import** joblib
d,clf=joblib.load(filename)

然后,我们加载新的数据集并传递给评分宏。

**def** score_new(features,clf):
    score = pd.DataFrame(clf.predict_proba(features)[:,1], columns = ['SCORE'])
    score['DECILE'] = pd.qcut(score['SCORE'].rank(method = 'first'),10,labels=range(10,0,-1))
    score['DECILE'] = score['DECILE'].astype(float)
    **return**(score)

我们用下面的代码调用这个宏

scores = score_new(new_score_data,clf)

就是这样。我们已经给新数据打分了。本文提供了技术代码的高级概述。如果您需要讨论任何特别的事情,或者您对任何模块有反馈,请留下评论或通过 LinkedIn 联系我。

玩得开心!

我发布了一个 python 包,它将执行本文中提到的一些任务——WOE 和 IV,双变量图表,变量选择。如果你有兴趣使用软件包版本,请阅读下面的文章。

[## Xverse 介绍!—用于要素选择和变换的 python 包

Xverse 是 X Universe 的缩写,它是一个用于机器学习的 python 包,可以帮助数据科学家利用特性…

towardsdatascience.com](/introducing-xverse-a-python-package-for-feature-selection-and-transformation-17193cdcd067)

结束你对偏差和方差的偏见!!

原文:towardsdatascience.com/end-your-bi…

所有的机器学习模型都不正确。句号!

但是偏差和方差的“正确”权衡是你的利益相关者可以接受的(至少)。有很多关于偏差和方差的文章,它们很好地解释了这个概念。因此,我会节省一些空间和时间来再次深入研究这些概念。但是让我们先回顾一下定义。 偏差 of 估计量是我们的估计量的预期或平均预测值与我们试图预测的正确值之间的差值。Sweet- >如果我一遍又一遍地更改训练数据集,我的 fit 不会剧烈移动。 苦- >它假定了过度简化的关系,而往往错过了真正的潜在关系。 方差是如果使用不同的训练数据,目标函数的估计将改变的量。甜蜜- >抓住了真实关系中的复杂性。Bitter - >不会对看不见的数据做出准确的预测。我们发现到处都写着这两者之间必须有所取舍。 本文的主要焦点是将不同算法的偏差和方差关系并列在一起。我将从对每一个问题的理论解释开始,然后通过分析一些数字来了解每一件事情的进展。 线性回归被理解为高偏差、低方差模型。这种说法部分正确。线性回归模型可以有高偏差-低方差,也可以有低偏差-高方差。这一切都归结于你在比较什么。 **基于树的模型:**尽管决策树模型是管理层最喜欢的时髦词,但它被诽谤为具有高方差和低偏差。这通常是正确的,因为树不会对目标函数做出假设,但是很容易“追逐”训练数据点。但是,当我说一棵树可以对相同的数据集有高偏差,而线性回归会有低偏差时,不要把这当成晴天霹雳!(我们将运行这些数字,看看这是如何发生的)。 为前面提到的震惊提供一个直接的答案——想想与线性模型相比,树模型太差,MSE 高,它抛出了偏差和方差的夸大值。每当我们拟合一个模型时,我们会查看一些误差度量,并不本质上将其分解为偏差和方差(通常情况下)。这是因为很难明确找到偏差和方差,因为它们是根据 统计期望 定义的。快速参考两者的数学表达式:

Fig.2 Formula for Error term decomposed as bias, variance and irreducible error

中间项是平方(偏差),最后一项是方差。你看到那个大的 E, 在计算这两个项时造成了障碍。这是因为要计算某项的期望值,需要有总体的信息。我不能用波士顿房价数据集来做这个,因为我不知道 100%准确的潜在关系。因此,为了将我的预测误差分解为偏差和方差,我与旧的 sweet 模拟随机数据发生器握手。下面是我这样做的步骤。)自定义一个关系,即定义我们称之为真实总体的系数。 2。)用它创建一个目标变量,并给它添加一些噪声。 3。)模拟 n 个不同的此类数据集,并在其上拟合 n 个不同的线性以及决策树模型。预测测试观察的结果。 4。)利用步骤 1 中的信息计算偏差和方差。下面提到的脚本执行上述所有步骤。

获得的结果总结如下:

Fig 3: Calculation of Bias, Variance and MSE for different models

你看 1 号模型是线性回归,恰好给出了最好的结果。然而,决策树通过模型编号 3 得到的最佳结果的特征是 max_depth=4。所以,我在这里的观点很清楚,与线性模型相比,我们的树模型偏差较低(预期)。与线性模型相比,我们也有偏差较高的模型(惊喜)。要注意的是,两个模型提供的最佳拟合确实遵循线性回归的高偏差-低方差和树的低偏差-高方差的一般惯例。我在这里的关键点是,一个人不应该有偏见,并持有关于这些算法的意见,这是上面反驳。基本事实:这是应该遵循的最佳匹配的权衡。选择一个特定的算法将永远不会保证两个讨论项的高/低值。 上面公布的代码是完全可复制的,人们可以尝试看看他们的“信念”是如何被其他算法揭穿的,如 KNN、逻辑回归、支持向量机在偏差-方差方面。需要记住的一点是,如果你碰巧在分类问题上尝试了这种方法,那么偏差和方差的公式将会改变,因为上面显示的公式对于最小二乘估计是有效的。如果 y'=y else 0,您可能会想到设计像 L(y ',y)= 1 这样得分度量。 PS: 1。)这篇文章将展示如何在给定模型的情况下计算预测误差并将其分解为偏差和方差。 2。)这篇文章旨在揭穿关于不同 ML 算法的偏差-方差的典型惯例的神话。 3。)这篇文章不是要解释机器学习中偏差-方差权衡的本质。

工程无摩擦注册体验

原文:towardsdatascience.com/engineering…

原载于 段的博客 并转载于此。我现在是 荣誉 的工程师。我们在招人!如果你有兴趣和我们一起工作, 在 Twitter 上 DM 我

像我们在 SaaS 领域的许多同行一样,Segment 的增长团队坚定不移地致力于提高我们销售团队的销售线索数量和质量。对我们来说,这意味着更多的公司完成我们的注册表格。但我们不仅仅希望有更多的公司签约,我们还希望我们的销售团队对我们的客户有更全面的了解。

为了提高转化率,缩短这些表格是有意义的。然而,这有丢失注册信息的风险,而这些信息在销售漏斗中至关重要。经过深思熟虑后,我们决定进行一项实验,我们称之为“无摩擦注册”。在这个实验中,我们使用 Segment 的数据丰富产品来预填充注册表单。

经过一个月的测试,结果出来了:在我们的主页上添加一个电子邮件捕获表单将转化率提高了 5.45%,在注册表单中预先填入 Clearbit 丰富的数据将转化率提高了 23.76%。

在不影响数据的情况下减少摩擦

无摩擦注册是使用公司数据(即公司名称、公司员工人数、公司资金总额等)预先填写注册表格或任何潜在客户生成表格的过程。当用户键入他们的电子邮件地址时,我们点击 Clearbit 的 Enrichment API,并使用返回的数据来完成表单的剩余部分。

正如您从下面的 GIF 中看到的,客户输入了他们的电子邮件地址,表单会自动预填充剩余的字段:

Notice how with a simple email address, we can prefill the name, company size, and role form fields

为什么效果这么好?

无摩擦注册和个人资料丰富为标准表单增加了四项主要改进:

**1。表单预填充:**我们正在减少用户在任何表单上遇到的麻烦。通过减少注册页面上的表单字段数量,我们使访问者更容易注册。

**2。丰富的用户资料:**当你点击 Clearbit 的 API,特别是通过细分市场的丰富集成,你会获得数百个关于你注册的额外数据点。例如,以下是我们的内部增长专家 Guillaume Cabane 返回的数据:

Response object from Clearbit’s API

**3。数据验证:**冗长的注册表单通常会产生虚假数据,因为用户在必填字段中填入任何内容以通过注册过程。预填充、丰富的数据允许用户查看、更正和验证,而不是从头开始输入数据。除此之外,如果用户更改表单中的任何字段,您可以自动丢弃 Clearbit 数据(因为这将表明 Clearbit 数据无效)。这是巨大的,因为我们不再冒假阳性匹配的风险。

**4。动态内容:**因为我们将 Clearbit 数据传回客户端(即浏览器),所以我们可以选择使用针对该用户的独特内容来定制入职流程。在上面的例子中,我们以引用我们一位亲爱的客户的话的形式展示社会证明。报价是特定于角色的,因此营销人员看到的是营销人员报价等等。

例如,这是我们默认的注册表单页面:

The box at the bottom is dynamic — it changes based on the info returned from the enrichment APIs

当我们根据 Clearbit 呼叫返回的数据对注册进行资格预审时,我们可以添加一个额外的表单字段,询问他们是否需要帮助:

The question at the bottom is dynamic — only highly qualified leads see this box

我们是如何做到的

为了帮助其他人达到同样的目标,我们开源了代码,并编写了这个如何在 Segment 使用它的分步指南。

在深入了解细节之前,这里有一个流程的高级概述:

  1. 客户输入他们的电子邮件地址
  2. 电子邮件地址随后被发送到 Clearbit 的 Enrichment API
  3. 表单域预先填充了从 Clearbit 返回的信息
  4. 通过细分市场识别和跟踪电话,丰富了客户档案,为您的销售和营销团队提供了更好的数据

如果以上听起来很新鲜或者很吓人,不要担心。我会带你走过每一步。

第一步:接受电子邮件地址

为了预填我们的表单,我们需要首先收集一个电子邮件地址。这就是 Clearbit 的 Enrichment API 所需要的,以便返回用户的特征,如名字、姓氏和公司角色。我们将电子邮件地址作为演示表单的第一个输入框,因为我们需要一些时间(几百毫秒)来点击 Clearbit 的 API 并预填充表单的其余部分。

因此,无摩擦注册的第一步是:你必须要求你的用户提供一个电子邮件地址,这样你就可以查询 Clearbit 的 API。

步骤 2:编写简单的 JavaScript 来监听电子邮件字段的变化

我们编写了几行 JavaScript 来监听电子邮件表单字段的变化,并捕捉用户的输入。这一步非常重要,因为当用户输入完他们的电子邮件地址时,我们需要立即点击 Clearbit 的 API。

在下面的代码中,我们获得了名为“email”的 HTML 元素,并向其中添加了一个“change”事件侦听器。这意味着无论何时用户离开电子邮件表单域,JavaScript 都会监听:

document.getElementById("email").addEventListener('change', () => {
  // keep reading for the code that belongs here
});

完成这些后,现在您就可以查询 Clearbit API 并开始填充表单的其余部分了。

步骤 3:查询 Clearbit API

一旦我们捕获了潜在客户的电子邮件地址,我们就可以使用它来查询 Clearbit API,以获取该电子邮件地址的相关信息。我们只需用该电子邮件地址向 Clearbit 的 Enrichment API 端点发出一个 HTTP 请求。响应可以包括个人和公司信息,我们可以使用这些信息来填充所有表单字段。下面是您的客户端 JavaScript 代码的样子:

const request = require('visionmedia/superagent');

document.getElementById("email").addEventListener('change', () => {
  // make a GET request to a clearbit route on your server
  request.get('/contact/clearbit') // send in user’s email as a query param
  .query({ email: event.target.value })
  .end((err, res) => { // simply return if there is an error
    if (err || !res.ok) return // capture the person & company object
    const {person, company} = res.body // more code below on how to parse the response
  });
});

就这么简单。前进!

这里最棘手的部分是您的 Clearbit 调用需要在服务器端进行,以避免暴露 API 键。您必须将响应数据传递给客户端 JavaScript。不过,不要担心:Clearbit 提供了一个节点、Ruby 和 Python 库来帮助您完成这项工作。在我们的实验中,我们使用了节点库

下面是我们的节点服务器上的代码:

const clearbit = require('clearbit')('{clearbit_api_key}')// capture the email query parameter
const emailAddress = this.request.query.email;// hit clearbit enrichment API
clearbit.Enrichment.find({email: emailAddress, stream: true})
  .then(response => {
    return response
  })
  .catch(err => {
    console.error(err)
  });

Clearbit 响应对象将至少包含:

{
  "person": {
    "id": "a0dd5de3-b1ff-449d-85ab-4b2ffdfdca53",
    "name": {
      "fullName": "Alex Stein",
      "givenName": "Alex",
      "familyName": "Stein"
    },
    "email": "alex@example.com",
    "location": "San Francisco, CA, US",
    "employment": {
      "domain": "example.com",
      "name": "Example",
      "title": "Digital Brand and Content Lead",
      "role": "marketing",
      "seniority": "manager"
    },
  },
  "company": {
    "id": "3f5d6a4e-c284-4f78-bfdf-7669b45af907",
    "name": "Example",
    "legalName": "Example Technologies Inc.",
    "domain": "example.com",
    "domainAliases": ["example.org"],
  },
}

其实这只是很小比例的回应。通过这个电话,可以获得关于这个人及其公司的更多信息,例如社会概况和其他联系信息。结合上面的两个部分——点击 Clearbit 路径的客户端 JavaScript 和点击 Clearbit API 的服务器端 JavaScript——将使您完成 80%的任务。下一步是解析数据,以便预填充表单的其余部分。

步骤 4:自动更新表单

当 Clearbit API 返回时,您可以使用 person 和 company 对象来填充表单中的必填字段。用 JavaScript 做到这一点最简单的方法是使用与响应对象中的数据字段相对应的必需字段的元素 id:

document.getElementById("email").addEventListener('change', function() {
  request.get('/contact/clearbit')
  .query({ email: event.target.value })
  .end((err, res) => {
    if (err || !res.ok) return
    ... // set (prefill) the name form field
    document.getElementById("fullName").value = person.fullName // set (prefill) the company form field
    document.getElementById("company").value = company.name
  });
});

步骤 5:将丰富的用户数据发送到下游集成

这一部分非常重要,尤其是如果你有一个 SaaS 产品,如果你已经在使用 Segment,这一部分尤其重要。对于那些不熟悉的人来说,细分市场的识别呼叫有助于将用户特征与他们在你的应用中的行为联系起来。例如,每次用户完成一个动作(称为“跟踪事件”),您可以自动将他们的个人资料附加到该事件。然后,这些数据会被发送到您在 Segment 上启用的任何其他工具,如电子邮件营销和分析。

通过将 Clearbit Enrichment 与您的细分市场账户集成,您的所有用户都将自动获得新数据。您所要做的就是在您的细分仪表板中打开 Clearbit 集成。它非常容易上手,你的营销和销售团队会喜欢你的!

高级:预测性销售线索评分

我们已经开始使用这些档案信息作为预测线索评分工具 Madkudu 的输入。这使用个人资料信息以及转化和应用内行为数据来区分高价值线索。使用来自 Madkudu 的实时结果,我们可以在注册过程的早期识别这种高接触率的线索。然后,这可以与定制结合使用,以允许客户成功团队在个人接触到产品之前进行接触,以帮助他们入职。

结果呢

在细分市场,除了预测性销售线索得分,这一技术还使我们的签约量增加了 20%以上。

不仅如此,由于无摩擦注册使我们能够验证数据,我们能够获得干净、准确的用户数据,以发送个性化的营销信息,并动态显示更多更好的页面内内容,以推动演示请求。我们还能够根据转化的可能性对销售线索进行适当的评分,然后将其传递给我们的销售人员,从而增加我们销售合格的销售线索。

我们不仅使潜在客户请求演示变得更加容易,还实现了我们的目标,即提高我们的营销网站所产生的销售线索的数量和质量。

工程意识:天堂文件

原文:towardsdatascience.com/engineering…

两周前,国际调查记者联盟发布了天堂文件,这是一份来自百慕大律师事务所艾波的文件集。这些文件由全球 380 名记者调查,揭示了精英们把钱藏在哪里。

昨天,他们发布了代表 77k 公司官员、25k 企业和他们之间 364k 连接的原始 CSV 文件。你能想到比使用图表更好的方法来分析这些数据吗?

我不想只是自己分析这些数据,而是想让世界更容易分析。

将所有的事情归档

Neo4j 通过分发官方 docker 图像使得在容器中运行图形数据库变得非常容易。虽然这些图像允许通过docker run选项传递配置和数据库,但我想让人们能够超级容易地访问天堂文件。

docker run -p 7474:7474 -p 7687:7687 ryguyrg/neo4j-paradise-papers

该图像包括 APOC 库图形算法库。它还包含一个 bash 脚本来从 ICIJ 下载最新的 csv 数据,并调用neo4j-import来创建图形数据库。然后,脚本调用neo4j-shell来执行 Cypher 语句,这些语句会创建适当的索引。

下面是完整的Dockerfile,它还设置了EXTENSION_SCRIPT环境变量,以便在 Neo4j 启动之前执行上述脚本。

FROM neo4j:3.3.0
MAINTAINER Ryan Boyd, <ryan@neo4j.com>RUN apk update
RUN apk add --quiet openssl sed wget unzip
RUN cd /var/lib/neo4j/plugins/; wget "https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases/download/3.3.0.1/apoc-3.3.0.1-all.jar"
RUN cd /var/lib/neo4j/plugins/; wget "https://github.com/neo4j-contrib/neo4j-graph-algorithms/releases/download/3.3.0.0/graph-algorithms-algo-3.3.0.0.jar"COPY download_db.sh /download_db.sh
COPY configure.cql /configure.cqlENV EXTENSION_SCRIPT /download_db.sh
ENV NEO4J_AUTH=none

创建 Neo4j 沙盒

创建新的 Neo4j 沙箱的过程与创建 Docker 映像非常相似,只是我们通常为大多数沙箱使用标准 Docker 映像。这个标准映像复制了上面创建的 Neo4j 数据库,并在每次用户启动自己的沙箱实例时使其可用。

它还提供了来自 ICIJ 的交互式指南,该指南提供了关于要执行的查询类型的逐步说明。

Interactive Guide for ICIJ Paradise Papers on Neo4j Sandbox

前往 Neo4j 沙盒亲自体验一下吧。

分析数据

我的同事威尔·里昂(Will Lyon)和迈克尔·亨格(Michael Hunger)在两篇博客文章中对这些数据做了一些精彩的分析——第一篇是搜集来的数据,第二篇是由 ICIJ 公布的最终数据。

一个例子是,他们绘制了特定国家的居民最有可能持有海外资产的地点:

Officer Residence (bolded) and Offshore location (non-bold)

在其他分析中,他们还研究了雷克斯·蒂勒森和英国女王之间的最短路径。

更多他们的分析,请阅读他们的博客文章。

我的下一步是什么?

我计划为一些即将到来的演讲做一些额外的分析,所以请留意我的 TwitterMedium 的更新。

从工程到数据科学预测的一生——我多么怀念物理

原文:towardsdatascience.com/engineering…

Finding oil is a long way from my jupyter notebook

在坚定地进入数据科学领域之前,我作为一名石油工程师在石油和天然气行业工作了 5 年。在几个国家和世界各地工作,从几内亚湾的海上平台到西非丛林中的办公室。这些经历塑造了我作为一名工程师和个人的形象,并对我的定量分析前景产生了巨大影响。

我的大部分工作是在生产优化和预测领域。本质上,我们如何利用现有资源(甚至更少)生产更多的石油,并预测未来我们将生产什么。所有这些都是为了了解油田资产的价值及其未来潜力。

我经常看到我作为一名石油工程师使用物理模型所做的事情,与我现在作为一名数据科学家预测消费者对电子商务的需求所做的事情有许多相似之处。然而,在预测模型中遇到的问题有很大的差异。最终,我意识到,即使作为一名工程师,我不得不管理所有可怕的肮脏数据,我仍然非常想念物理学的基础来帮助指导我的决策。当试图理解数据和信息告诉你什么时,工程和物理定律提供了已知的边界条件。当我们分析一个人购买消费品的理性时,这些物理定律有点难以定义。

石油和天然气行业的预测

作为一名在中非工作的工程师,我的工作本质上是获取大量实际测量的数据(特征),并将其转换为预测模型,通常是时间相关模型。这种分析以及需求预测的关键是理解数据,观察什么,如何有效地组合变量以最好地代表您的系统,以及处理不确定性的量化。然而,这两种方法有着根本的区别,一种是从使用物理模型开始的工程,另一种是使用统计模型。我个人认为,将两个阵营结合起来是行业前进的基础。

石油预测像任何其他预测一样需要数据,油井通常已经生产了许多年(0-40 年),大多数油井通常至少有一套标准数据:每天生产多少流体、地面压力和温度。有了这些要素,就可以直接进行预测了。问题是,虽然你有数据,但它在质量和数量上有很大差异。这是对工程师的真正挑战。这使它成为一项迷人的工作。

你的数据可能来自地下 3000 米深处的任何地方,每秒钟都会向你的笔记本电脑发送信号,也可能是一个人跳进一辆皮卡或一艘船去参观油井并读取一个量表——后一种情况比你想象的更常见。事实上,我一直是这样的家伙。因此,从收集数据的性质和收集的内容来看,数据是零星的,有时非常不可靠,有时甚至根本不存在。

这实际上是石油行业的症状,很少有一致性,特别是在数据方面,当你开始预测时,理解这一点是有用的。你会发现的为数不多的一致性之一是,随着油价的每一次下跌,你可能也会看到数据质量的下降。这对时间序列预测有重大影响,通常你的数据在油井寿命开始时是可靠的(这是最大的资本投资),然后随着时间的推移而退化,通过故障传感器、较差的监控和通常不再是公司投资组合中最性感的东西。

除了简单的数据可用性,实际测量还有巨大的不确定性。很难理解油藏及其产出的流体的复杂性,更不用说有时难以相信自己的测量结果了。最后,当你想到一个油藏时,你是在谈论将微小的针刺(井~12 英寸宽)放入 2-4000 米深的地球,然后使用这些作为你在可以跨越数十公里的东西中的唯一眼睛和耳朵。

因此,石油和天然气预测的困难很大程度上来自于您的数据质量和可用性。虽然我把它说得像一个可怕的问题,你会经常看到工程师们努力从他们的数据中获得意义,以表达他们对未来的看法。你也有一个物理系统!这意味着即使我花了几周/几个月的时间开发我的模型,我也可以给另一个工程师 5-10 个参数,他可以在他的计算器上检查我的预测是否在物理上合理。最后,我们试图预测的过程在宏观水平上受我们在中学物理中学到的简单压力、温度和体积关系的支配。有了物理学,你就有了一个基础真理,一根引导绳。当你告诉某人投资数千万美元时,这会给你更多的信心。

电子商务方面

现在,本周我一直在研究一个完全不同的问题,我为一家电子商务公司建立需求预测模型。本质上,我试图预测人们下周将在网站上购买什么,这样我就可以有足够的库存来满足他们的购买需求。这带来了许多限制,我不想买太多的股票(过度预测),因为这会花我的钱,我也不想低估太多,因为我会延迟履行客户订单(客户不太满意和/或失去客户)。这是一个财务权衡,我不会在这里深入讨论,但这是一个有趣的问题,研究什么是最佳库存数量。

我有一组来自销售端的简单数据(我们每天对给定产品的订单),从谷歌分析我可以得到网站的流量信息,通过结合这两个数据集,你可以得到转化率。我正在为大约 20 000 种产品这样做,所以它需要工业化。这也是一个不连续的数据集,你可能一周什么也没卖出去,突然之间就卖出了 10 件产品。

我意识到我有时会想念物理系统

因此,在我的电子商务案例中,与我在油田的生活相比,我正在处理难以想象的干净数据。我有“传感器”来测量人们在网站上做的一切,这些数据的质量很高,不仅是由谷歌收集的:-),而且最重要的是,这些数据不是由一个值夜班的人收集的,他花了 8 个小时开车或乘船到偏远的地方去读取仪表。更别说我在雨季的凌晨两点试图在笔记本上记下压力了。

所以当我最初开始解决这些问题时,我就像哇*,我沐浴在良好的数据中。但当我开始了解预测的本质时,我很快意识到我没有事实依据,也没有指南。在预测油井时,你总是有物理学的手给你信心。当我向一个朋友寻求帮助,让他给我对下周股票预测的信心时,我突然发现这是一个非常孤独的地方。*

问题是,没有物理学,很难知道你所做的是对的。明天我不知道我们会卖出更多还是更少,我可以说昨天我们卖出了 X,前天卖出了 y。但是明天我不知道任何具体的东西,我可以给你概率,告诉你我非常确定我们会卖出超过 1,但是我真的对我的系统没有什么限制。在石油预测中,我可以说“昨天我们生产了 200 桶,这意味着压力下降了 x,这意味着今天我可能会少生产 5 桶”来支持我的预测。

在油田的最后,你可以创建复杂的概率模型,但在这之后,你可以创建基于物理的确定性模型,给你信心。人口众多的购买心态,谷歌搜索算法或竞争对手广告活动的影响,以及这如何影响我的流量,我不知道。

有了需求预测,你可以而且必须继续创建更好的模型,试图捕捉更多可能的用户行为的代理。但最终,这会导致更复杂的模型,变得更难解释。尽管在历史数据上的性能可以得到很大的提高,但它永远不会给人同样的信心(至少对我来说)。我们在这里所做的在金融预测和其他概率系统中得到了广泛的应用和研究,它们可能会非常成功,但我们应该总是对你实际知道的和你的模型可能学到的东西持批评态度。因为最终至少对我来说,我担心那些大肥尾巴中的一个会打我的脸。

英语到粤语的翻译:一小时内快速破解

原文:towardsdatascience.com/english-to-…

我想每个在小学学过第二语言的同龄人都记得用谷歌翻译做作业。几乎每个人都有一个关于谷歌翻译出错的有趣故事。我的故事版本涉及到七年级法语的服装单元。我们的家庭作业是写一篇关于我们喜欢穿什么衣服的短文。当时,我真的很喜欢背心。我交了作业,写了这样一段话,“我叫杰米·波特·德·查尔兹·豪特。”谢谢,谷歌翻译。那没有意义。应该是“J'aime porter des debradeurs”实际上应该翻译成“我喜欢穿高[军]坦克。”我的法语老师没有被骗。

幸运的是,谷歌翻译这些年来已经有了很大的改进。现在,如果你输入“我喜欢穿背心”,它不再犯和我七年级时一样的错误。对于学习语言的人来说,谷歌翻译实际上是一个非常有用的工具。截至目前,谷歌翻译支持超过 100 种语言。而 Google Translate 支持 拼音 (普通话罗马化),我发现它缺少了一个贴近我内心的东西:粤语罗马化,或者说Jyutping

Google Translate does do a great job of differentiating between traditional and simplified Chinese characters (for those who are not familiar, traditional characters are used for Cantonese and Mandarin in Taiwan, while simplified characters are used for Mandarin in China). Type “horse” in English, and you’ll be given “馬” if you choose traditional characters, and “马” if you choose simplified. However, for both traditional and simplified characters, the romanization given with the character is “Mǎ”, and this is Pinyin. What we really should have is “馬, maa5” for Cantonese, and “马, mǎ” for Mandarin. Google translate incorrectly uses Pinyin for Cantonese. What we really want here is Jyutping.

Obligatory Great Wall of China pic!

谷歌翻译不支持粤语

繁体和简体汉字都使用拼音,这表明谷歌所说的“中文”是指“普通话”所以实际上,根本不支持粤语。我们不仅想添加 Jyutping,还想添加粤语作为支持的语言。遗憾的是,我在谷歌没有可以帮助我的直拨电话,所以我想出了一个变通的办法。

最棒的是:通过利用两个网站,我们不需要任何自己的数据,也不需要使用任何机器学习。这个黑客非常快,解决了我们的问题。不需要神经网络!

百度和 Chineseconverter 来救场了!

Baidu, which is pretty much China’s Google, has a great Baidu translate tool that we can take advantage of. Not only does it support English to Mandarin Chinese translations, but it supports English to Cantonese! Enter “horse” and you’ll get “馬”, but with no Jyutping to help a student actually pronounce it. We need another site to do this: Chineseconverter.com. This site allows us to enter traditional characters, and output Jyutping. Finally, what we want! Now let’s write some code to do this for us.

硒来救场了!

使用 Python 和 Selenium 包,我们可以自动将英文文本输入到百度翻译,将输出作为输入复制到 Chineseconverter.com,最后将结果作为我们的最终输出。

我们从初始化 webdriver 开始:

接下来,我们刮!这一部分涉及到进入两个网页的源代码和检索必要的元素。我发现,如果我把我的英文文本输入百度翻译后,没有让程序“休眠”3 秒,那么 Selenium 就找不到输出。除此之外,一切正常。

样品使用

让我们看看程序是如何运行的。这是从终端发出的。

Enter your input: I love eating noodles
Traditional characters: 我钟意食面
Cantonese Jyutping: ngo5 zung1 ji3 sik6 min6

If we had used Google Translate and traditional Chinese characters, we would’ve gotten “我喜歡吃麵條”, which is not Cantonese, since it gives us “吃, chī”. What we want is “食, sik6,” which is the Cantonese way of saying “to eat.” So this is great, it works!

运行时间的最终注释

因为我们只是自动化了从网页中输入和提取文本的过程,所以运行起来要花很长时间(大约 5 秒)。这种滞后给了一个粤语学生时间去思考他们的翻译应该是什么,但这肯定是太长了,以至于不能宣布它是谷歌翻译缺乏粤语的解决方案!

An interesting note- a lot of Chinese characters are actually pictograms!

结束语还有,为什么不用造字,而用造字呢?

使用 Python 和 Selenium,很快就找到了一种将英语翻译成粤语的方法。我不需要训练任何神经网络,甚至不需要获得任何训练数据——我只是使用了现有的数据。不过,你可能会问自己,为什么要这么做?为什么一个正在学习说广东话的人不能同时学习阅读呢?嗯,学习广东话和任何中文的问题是,如果你同时专注于学习读、写和说,你会不知所措。在我看来,学习这类语言的最好方法是先把注意力放在说上,阅读随后就会到来。如果你的目标是与人交流(当面!),你不需要会读会写。即使是在说中文的地区,年轻人也倾向于选择语音信息而不是短信,这更加证明了我的观点,你不需要一开始就能读或写。当然,这很好,但你必须做出选择。这是一种交换。

最初发表在我的博客 serena.mcdonnell.ca 上

用 ML、AI、IR 和 NLP 增强人类感知

原文:towardsdatascience.com/enhancing-h…

工作中的交互式文本挖掘和信息检索

文本数据仍然是大数据分析环境中最重要的来源之一。正如任何传感器都可以感知环境状态并报告收集的数据一样,人类也能够感知周围的世界,然后将他们的理解表达为文本数据。从某种意义上来说,人类实际上已经将输入数据转化为某种有价值的信息。因此,人类生成的文本内容已经超越了“原始数据”的层次。文本内容已经嵌入了对现实的阐述和感知。

我们可以挖掘这种文本信息的内容,并提取关于所观察的世界、关于观察者(人类)以及关于所使用的语言的知识。除此之外,通过预测分析,人们可以推断出现实世界的变量。此外,您还可以添加可用的全部上下文数据和元数据(例如,时间戳、地理位置等)。

然而,执行真正的 NLP (自然语言处理)是一项艰巨的任务。这里我们说的不是基本的文本处理,它已经成为一种普遍的做法。我们说的是真实文本理解。

那么,我们如何利用 不完美的 NLP 来生成 完美的应用 ?简单:让人类参与进来!

正如你需要显微镜、望远镜或宏观镜,这取决于你想分析的真实世界,你需要一个文本显微镜来研究文本。这个工具必须是一个结合了信息检索、文本挖掘、数据分析和 人在回路 技术的智能交互式工具。

可以将几种技术结合起来:例如,实体提取、单词分类、将文本挖掘与时间序列上的因果分析(也包括非文本数据)相结合,等等。

在此图中,您可以看到优化因果关系(基于时间序列分析)和一致性(基于主题分析)的试探法

不幸的是,每个应用程序都需要对这种工具进行大量的定制和培训。我们需要抽象和统一来最小化覆盖不同领域和应用的学习努力。

这与我们对社会知识提取的研究非常相关,它分析人类生成的内容,目的是生成新的形式化知识(例如,整合现有的知识库,如 DBpedia)。

这个故事的灵感来自于伊利诺伊大学香槟分校(信息科学学院基因组生物学研究所统计系)ACM 研究员翟IEEE big data Conference 2017上的主题演讲。