TowardsDataScience-博客中文翻译-2016-2018-四十三-
TowardsDataScience 博客中文翻译 2016~2018(四十三)
原文:TowardsDataScience Blog
协议:CC BY-NC-SA 4.0
数据科学成功或失败的原因:
原文:https://towardsdatascience.com/why-data-science-succeeds-or-fails-c24edd2d2f9?source=collection_archive---------3-----------------------
投资几分钟可能为您的公司节省数百万美元
简介
数以千计的公司领导人已经迷恋上了数据——部分原因是数据太多了,部分原因是商业媒体上写的数据科学和机器学习(ML)的潜力,部分原因是他们知道数据有价值,但他们不确定如何处理这些数据或如何提取这些数据,数据只是呈指数级增长(莱德曼,你的公司知道如何处理所有的数据吗?, 2017).然而,根据最近 Gartner 的一项研究,85%的数据科学项目失败了。为什么?更关键的是,你的公司怎么可能在那 15%(沃克,2017)?行业文献充满了一些常识性的原因:数据不足(Asay,2017),技术本身而不是利润和关键绩效指标(KPI)的驱动因素(Taylor,2017),沟通不畅(Taylor,2017),高管支持不足(Taylor,2017),过于复杂(Veeramachaneni,2016),以及问题焦点过于狭窄(Veeramachaneni,2016)。
然而,作为一名数据科学家和组织领导者,它回避了一个问题,这些是否只是症状,而不是导致数据科学项目生病的原因。他们的根本原因是什么?在这些下游后果的上游是否存在元问题,这样,如果这些“疾病”的来源被识别和解决,症状被预防,数据科学/ML 项目保持健康?
数据科学成功的根本原因&失败
1。团队多元化——跨职能团队—20 世纪 90 年代中期,我大学毕业后的第一份工作是为世界上第一家端到端全球电信公司工作,当时互联网——以及数据流量——正经历着飞速增长。因为他们已经与 40 个国家的 2,000 个客户签订了价值 7 亿美元的合同,这些合同都是基于数据质量的最低服务级别协议(SLA ),所以提前足够长的时间预测数据质量故障(这些故障将触发合同规定的经济处罚)以采取措施预防这些故障是至关重要的。要做到这一点,他们需要创建传输质量的多维数据流,将其存储在数据仓库中,然后开发定制工具来自动分析、预测和提醒服务类型和区域何时会违反 SLA,并发出足够的通知来阻止它,从而通过避免处罚来确保其跨国客户的满意度和自身的盈利能力。
这个成功的多年项目几乎在发射台上爆炸了,原因和数据科学项目失败的原因一样——他们错误地假设一个精通几种语言和工具的程序员可以:(a)用这些工具做任何事情;(b)找出所有其他的元素——成功地识别需求、技术策略、统计数据、用户体验、质量保证、培训和交付。
有类比。想象一下,雇佣一个有才华的糕点师来发展你的餐厅——有一个明星糕点师可以做得很好,但他将创造其他食物类型,开发菜单,创造和最大化就餐体验,为食客服务,推广和营销餐厅,管理财务等。或者,想象一下,想用一个熟练的木雕师建造一座豪宅。虽然雕刻可能是最棒的,但是谁来开发这个地方,为这个建筑确定最佳方向,设计它,获得许可,开发这个系统,做砖石工程,盖屋顶,装玻璃,美化和装饰它呢?
在这样的框架下,答案似乎显而易见:即使是才华横溢的程序员单独工作,也可能无法实现重大的数据科学计划,因为这需要跨职能技能和人才的更大多样性。引用一家领先的 ML 咨询公司的话,“数据科学家应该具有商业洞察力,理解数据背后的数学,并与熟练的开发人员协同工作”(Tereschenko,2017)。虽然理论上可以设想一名数据科学家拥有跨许多功能和工具的知识平衡,但在现实生活中,他们就像独角兽一样——很难找到。那么,什么才是理想的数据科学或 ML 团队呢?好吧,这是一场有趣而热闹的行业辩论;然而,就像理想的软件开发团队是跨职能的一样,数据科学和 ML 也是如此——本质上,它是特定类型的软件开发团队的特定案例。虽然每个团队成员都有类似传统的职能,但更重要的是关注职能的表现,而不是头衔:
(A)项目领导——这有两种形式:(I)有经验的项目经理创建路线图,知道潜在的陷阱,管理人员和预算和交付物,并确保高质量的交付物,按时和在预算内,超过预期;以及(ii)技术领导,他通常对如何最好地满足功能和业务需求的技术要素有最终建议(如果不是批准的话)。双方经常在团队建设中发挥作用;然而,他们很少是同一个人。
(B) 策略师 —这可能是一个在统计学、生物统计学、预测分析、人工智能和机器学习方法方面有广泛经验的人。通常,他们有能力将业务问题或研究问题转化为最合适的数据科学模型,解释结果,比较评估模型,知道何时使用哪些统计工具、监督学习和非监督学习算法,以及哪些类型(例如,用于比例因果关系的随机森林——特别是对于大数据,哪些模型过度拟合或拟合不足以及如何改进,用于搜索引擎功能的梯度推进, 何时以及如何使用像 Tableau 这样的仪表盘向一线的公司用户实时普及数据,在零售中使用 K-means 或自组织地图进行客户细分或聚类,何时以及如何在电子零售中使用集体预测分析“群体智慧”等。 ),以及对如何使用数据类型、清理、训练等的高级理解。简而言之,战略家专门研究什么时候做什么,他们很可能能够从不同领域创造新的创新方法来解决问题,并且在高层次上知道如何这样做。
(C)沟通/翻译——《哈佛商业评论(莱德曼,2017)中的托马斯·莱德曼说:“最好的数据科学家会出来和人们交谈。”。最佳需求是通过与最终用户的大量对话发现的,经过记录、审查、编辑,然后确定优先级。这些问答环节需要法庭提问的技巧,以及与从熟练工人到管理层到高管的每个人的轻松对话。理想情况下,他们还拥有广泛的商业知识,了解流程如何工作,帮助企业发展和盈利的关键问题是什么。此外,他们需要成为翻译专家,能够在需求、功能性解决方案和解决该问题的技术之间架起一座桥梁。他们一部分是分析师,一部分是专家,一部分是作者,几乎总是撰写开发者和程序员所依赖的详细的功能性和技术性需求文档。有时,这些分析师-沟通者-作者也是领导文档和培训的完美人选——这就是它的作用、工作方式和原因——因为他们已经彻底了解业务问题和解决方案,并且完全有能力向他们已经建立关系的人阐述和解释它们。
【D】****—在大多数技术周期的开始,一切都是定制编码的,因为带有图形用户界面的软件包还不存在。这曾经是统计学的真理;然而,现在 MATLAB、Minitab、SAS 和 SPSS 是基于图形的软件包的领导者,使数据科学家能够更快、更准确地获得结果,而不需要投入宝贵而昂贵的时间来编程或调试代码。在我看来,使用图形工具进行软件开发的人是“开发人员”,用语言编写代码的人是“程序员”。在数据科学中,从定制编码到图形化编程工具的转变可以说是半途而废。当然,有一些图形化的解决方案,包括上面提到的那些,可以很快地完成出色的工作,可以用代码定制,但通常不需要这么做;然而,对于定制应用程序,仍然有一个与程序员一起定制代码的合理的好理由——通常使用 Python 或 R,这取决于它是一个需要其他功能的通用应用程序,还是纯粹的数据科学和统计学。今天,在你的团队中可能仍然有必要同时拥有这两种技能。即使你正在使用下一代自动化的人工智能工具——比如数据机器人,它可以并行排列几十种流行的人工智能模型和算法,从而节省数月的猜测和费力的模型构建——最好的算法仍然需要在定制的生产环境中构建。开发人员和程序员是“如何做”的人。
【E】数据工程——“只有 3%的公司数据符合基本质量标准”2017 年发现三位研究人员(Nagle,2017)。这种数据的可信度问题有多种形式——“脏数据”,可能被错误分类、错误识别或仅仅是错误的——缺失数据,或者可能是最麻烦的——看起来是正确的数据;然而,它有多种定义。它创造了一个前端质量保证关卡,需要确保数据在进入数据科学分析或工程流程之前尽可能准确。虽然有处理缺失数据的策略—删除记录、插入剩余数据的平均值或中值、移除缺失数据元素平均值 2.5 倍的异常值,但这肯定很耗时—知道如何以及何时使用每种策略至关重要。理想情况下,这个人可能是在跨系统提取、转换和加载(ETL)数据方面有丰富经验的人,并且还必须对每个环境中已经使用和正在使用的数据字典和定义有敏锐的理解。当公司合并他们自己或系统时,这个问题会成倍增加,因为每个实体通常都有自己的数据系统和定义,它们的一致性是整体和企业范围的数据科学项目的先决条件。数据工程师是开发人员和程序员关注的细节“如何”的无价伙伴。
(F) 质量保证/测试 —这可能是数据科学团队中最容易被忽视的职能;然而,这是至关重要的。在传统的软件开发生命周期中,测试人员查看功能需求,并确保解决方案做了它应该做的事情。然后,他们试图通过用户做的奇怪事情来破坏它,或者给它加载太多数据来进行压力测试。在数据科学的发展中,由于统计和数学,它有了额外的意义,这些必须是正确的才能得到有价值的答案和预测。否则,该公司实际上投资了数十万或数百万美元在一台超级高效的错误答案生成机器上,这台机器将提供错误信息和误导,而不是提供信息和帮助。这样做一次,它所造成的不信任可能一代企业领导人都无法克服。从战术质量保证方法来看,他们批判性地回答了一些问题,如数据科学工具是否针对多代数据进行了测试(通常是从培训中获得的),相关性或关联性是否与因果关系不正确地融合在一起,是否使用了一种统计工具来假设非标准化数据的标准化数据分布,数据不平衡是否会导致右倾或左倾分布,数据类型是否在方法中不正确地混合(例如,连续型与分类型等)。).如果一个团队告诉我,他们花了项目持续时间的 33%在分析和设计上,33%在开发上,33%在 QA/测试上,我觉得这是一个合理和健康的时间和资源分配。
2。数据多样性&广度——从哪里开始 — Don Wedding ,我在西北大学的一位出色的预测分析教授,也是 SAS 研究所的前技术负责人,他用一个类比来表达机器学习的功效在很大程度上取决于起点的重要性。如果你问一个 ML 算法地球上的最高点是哪里,它会从阿拉斯加开始蛮力、试错,它可能会说麦金利山。如果从亚洲开始,它可能会说珠穆朗玛峰。如果它从死亡谷开始,它可能会说一个当地的草原土拨鼠洞边缘。结果分别是非常好、完美和非常差(婚礼,2017)。
类似的问题也出现在数据科学在基因组学中的应用。今天使用的大多数基因组数据库或生物库是来自西欧血统的高加索人的样本。正如零售业中的欺诈检测寻找行为异常值一样,在基因组 ML 应用中,变体是游戏的名称。什么是正常的基因组足迹,什么时候,什么地方,为什么有些东西与正常足迹不同?因此,除非数据来自多样化的人群,且样本与人群一致,当 ML 算法识别出变异体与常模的“差异”以指示疾病、抗性等时。,这很可能仅仅是因为变异来自数据集中代表性不足的少数群体,这是一个错误的假设。所有这些都是说,在数据科学项目的数据工程方面,数据的广度和多样性是关键,否则,该技术只会更有效地给你一个误导性的答案,以及错误的信心。
3。理解上下文核心问题**—Don Wedding 还提出了“分析型狼人”的概念,这些事情是更深层的潜在问题,导致公司认为他们应该从事数据科学或机器学习来“杀死狼人”(Wedding,2017)。Wedding 教授也是一家财富 500 强公司的首席数据科学家,他根据自己丰富的经验认为:(a)对 ML 的兴趣通常意味着缺乏分析或统计人才,sa 技能有限或工具过时,计算能力或模型不足,或数据质量问题;以及(b)客户通常使用数据科学或 ML 计划作为“银弹”,以获得专业咨询服务来弥补他们的分析差距、增加工具和/或培训、升级软件、更强的计算能力(例如,过渡到云或更强大的处理器或更大的内存、过渡到分布式计算架构、更快的数据库吞吐量等)。)、重组数据库架构或任何组合。这些潜在的需求、动机和解决方案不一定一点都不好;然而,当形成数据科学或 ML 计划时,重要的是将推荐或需要数据科学的动机和原因的饼状图放在上下文中。不了解问题就无法提供有效的解决方案。
****4。有用吗?——我们数据科学家是一群极客。行业期刊,更不用说学术同行评审期刊了,充斥着依靠晦涩难懂的行话来调整这个过程算法或那个公式以更好地预测. 01,或者过度或欠拟合修正以实现递增的更好结果的文章。当然,这些纯粹的研究型文章对推动该领域的发展非常重要。例如,如果一个人正在人工智能应用于医学科学的新兴领域工作,这可能是我们最终比我们的祖先活得更长(或不活)的原因,逐步提高图像读取或疾病预测的准确性可以延长成千上万人的预期寿命;然而,在商业中,大部分数据科学投资回报(ROI)更简单。如果一个数据科学解决方案增加的利润超过其成本,过于简单,它就是成功的。更具体地说,如果数据科学解决方案可以将客户盈利能力、细分、获取、行为预测、保留或偏好提高 10%以上,这可能是一个巨大的成功。如果它能在每个领域重复达到 10%以上,它可能会让你成为竞争领域的领导者。
5。他们会用吗? —这个问题的答案可能在很大程度上取决于它对普通观众的可解释性以及他们的信任程度(Gray,2017)。围绕数据科学的 AI-ML 方面(相对于统计方面)有一点肮脏的秘密,在技术出版社 (Knight,2017)中不止一次地写过这个秘密。也就是说,当 ML 涉及无监督学习时,可能很难确定模型是如何得到其答案的,并且由于这种不可理解性,一般管理人员和外行用户可能不愿意信任它。想象一下,如果一个无监督的 ML 算法预测你的新孩子将在 20 年后患上一种疾病,这种疾病可能会大大缩短他/她的预期寿命。因此,他们的基因应该在出生后立即进行编辑,以试图预防疾病;然而,这种基因编辑也可能有不可预见的下游后果,可能导致其他问题。你会做吗?答案可能很大程度上取决于你是否理解为什么算法会预测到这一点。缺乏对结果/预测的信任,决策者会对采取行动过敏。有了统计学,甚至监督学习,数据科学的侧面,我们可以教育决策者为什么机器做出这样的预测或发现;在无监督的 ML 中,它自己学习,缺少解释它对人类做了什么的反馈循环,我们经常不知道它是如何得出结论的。信任或不信任。
合奏是关键
最后,数据科学和 ML 的未来可以说是将模型和方法结合成一个整体,优于单独的应用程序。成功的数据科学项目也是如此。最成功的方法可能不会最大化上述五个根本原因或驱动因素中的任何一个,但会在所有五个方面产生最高的平均值。例如,客户可能信任并因此使用一个在线分析处理(OLAP)多维数据集,它以一种比 k-means 或自组织图更容易理解的方式对客户进行图形化细分,即使后者更复杂、更精确、更自动化。类似地,确定因果要素并将其构建到预测模型中的最佳 ML 方法可能是决策树,然后由数据机器人进行自动预测模型比较;然而,如果团队没有这些工具,而是有擅长 TensorFlow 的 Python 程序员,或者可以产生逻辑回归的 Minitab 实例(通常几乎和 ML 一样好),这种平衡很可能会胜出。
类似地,在理想世界中,这里列出的几个字母化的跨职能团队能力将在同一个人身上找到。一个项目的所有者,如果他们搜索并且运气好的话,会找到多用途的团队成员。例如,一个项目经理,他也是一个熟练的、经验丰富的沟通者和战略家,或者一个技术领导,他可以是一个开发人员/程序员和测试人员。团队中的人员节点越少,他们就越容易、有效和高效地一起工作——并且通常价值越大(对于服务提供商来说,这也可以更有利可图,因为在资源成本保持不变的情况下,一些功能的收费比其他功能更高)。虽然一个跨职能的团队成员可能单位时间花费更多,但它可以为客户或项目节省两个人,这两个人几乎以相同的速度工作。
史蒂夫·乔布斯(Steve Jobs)被认为是成功应用这些在 21 世纪变得无处不在的跨学科和专业领域的最终关键——也许具有讽刺意味的是,因为他受过有限的正规教育——他解释了苹果电脑巨大的长期创新引擎:“大多数公司雇佣聪明人,然后告诉他们怎么做,我们雇佣聪明人,让他们告诉我们怎么做。”
Eric Luellen 自 1997 年以来一直领导全球预测分析领域的软件开发项目,拥有西北大学的信息学硕士学位,他的论文设计了基于高维图像进行预测的新集成机器学习方法,并成为 2016 年斯坦福 MedX C3 奖 和 2017 年 世界科技奖 的全球决赛选手。
引用的作品
m . asay(2017 年 7 月 12 日)。机器学习大规模失败的 3 种方式(也是成功的一个关键)。 Tech Republic ,PP .https://www . Tech Republic . com/article/3-ways-to-massive-fail-with-machine-learning-and-one-key-to-success/。
格雷,K. (2017 年 7 月 20 日)。AI 可能是个麻烦的队友。哈佛商业评论,页https://hbr.org/2017/07/ai-can-be-a-troublesome-teammate.
骑士,W. (2017 年 4 月 11 日)。人工智能核心的黑暗秘密。麻省理工科技评论,PP .https://www . Technology Review . com/s/604087/the-dark-secret-at-the-heart-of-ai/。
茨韦塔纳格勒,茨韦塔纳莱德曼,萨蒙,D. (2017 年 9 月 11 日)。只有 3%的公司数据符合基本质量标准。《哈佛商业评论》,PP .https://HBR . org/2017/09/only-3-of-companies-data-meets-basic-quality-standards。
t .莱德曼(2017 年 6 月 15 日)。你的公司知道如何处理所有的数据吗?《哈佛商业评论》,PP .https://HBR . org/2017/06/does-your-company-know-what-do-its-all-data。
t .莱德曼(2017 年 1 月 26 日)。最好的数据科学家出来和人们交谈。哈佛商业评论,PP .https://HBR . org/2017/01/the-best-data-scientists-get-out-and-talk-to-people。
t .莱德曼(2018 年 1 月 25 日)。你在让你的数据科学家失败吗?哈佛商业评论,PP .https://HBR . org/2018/01/are-you-setting-your-data-scientists-up-to-fail。
泰勒,B. (2017 年 10 月 16 日)。为什么大多数 AI 项目会失败。数据机器人博客、https://blog.datarobot.com/why-most-ai-projects-fail.页
捷列先科,M. (2017 年 12 月 9 日)。当 ML 即服务不起作用时,建立一个跨职能团队。从 DZone 中检索:https://DZone . com/articles/building-a-cross-functional-team-when-ml-as-a-serv
k . veeramachaneni(2016 年 12 月 7 日)。为什么您没有从数据科学中获得价值。哈佛商业评论,PP .https://HBR . org/2016/12/why-you-not-get-value-from-you-data-science。
j .沃克(2017 年 11 月 23 日)。大数据战略令人失望,85%的失败率。检索自数字期刊:http://www . Digital Journal . com/tech-and-science/technology/big-data-strategies-despair-with-based-percent-failure-rate/article/508325 # ixzz 5 JVG k3av 0
婚礼,D. (2017)。预测建模。 (D. Wedding,表演者)美国伊利诺伊州埃文斯顿西北大学。
虽然跳过这些时间密集的步骤是一个普遍的想法,但是团队这样做是自担风险的,因为他们奠定了项目的期望、功能和目的的基础。在这位作者看来,最理想的情况是,它们被彻底完成,然后开始一个快速应用程序开发(RAD) 过程,在这个过程中,团队离开并在 30 天内回来并问:“你是这个意思吗?”并对解决方案草案进行另一个 30 天的审核周期的编辑。2-3 个短周期的产品通常比一个漫长的开发过程要好很多。
为什么数据科学家喜欢高斯?
原文:https://towardsdatascience.com/why-data-scientists-love-gaussian-6e7a7b726859?source=collection_archive---------1-----------------------
Visual representation of Gaussian distribution.
对于深度学习和机器学习工程师来说,在世界上所有的概率模型中,高斯分布模型非常突出。即使你从未从事过人工智能项目,你也有很大的机会遇到高斯模型。
高斯分布模型通常以其标志性的钟形曲线而闻名,也称为正态分布,之所以如此流行主要是因为三个原因。
Mathematical formula for Gaussian probability distribution function.
普遍存在于自然现象中
所有的模型都是错的,但有些是有用的!—乔治·博克斯
Position of particles that experience diffusion can be described using a Gaussian distribution.
自然和社会科学中难以置信的大量过程自然遵循高斯分布。即使它们不一致,高斯模型也能给出这些过程的最佳模型近似值。一些例子包括-
- 我们成年人的身高、血压和智力
- 经历扩散的粒子的位置
- 测量误差
数学推理:中心极限定理
Random walk in two dimension with two million steps.
中心极限定理指出,当我们添加大量独立的随机变量时,不管这些变量的原始分布如何,它们的归一化和都趋向于高斯分布。例如,随机行走中覆盖的总距离的分布趋向于高斯概率分布。
该定理的含义包括,专门为高斯模型开发的大量科学和统计方法也可以应用于可能涉及任何其他类型分布的广泛问题。
该定理也可以看作是对许多自然现象遵循高斯分布的解释。
一次是高斯,永远是高斯!
与许多其他在变换时改变其性质的分布不同,高斯分布倾向于保持高斯分布。
- 两个高斯的乘积是一个高斯
- 两个独立的高斯随机变量之和是一个高斯
- 高斯与另一个高斯的卷积是高斯
- 高斯的傅立叶变换是高斯的
简单
Occam Razor is a philosophical principle that emphasized that the simpler solution is the best one given that all other things are same.
对于每个高斯模型近似,可能存在给出更好近似的复杂多参数分布。但高斯仍然是首选,因为它使数学简单得多!
- 它的均值、中值和众数都是一样的
- 整个分布可以用两个参数来确定——均值和方差
高斯分布以伟大的数学家和物理学家卡尔·弗里德里希·高斯的名字命名。
为什么数据科学家应该写书,为什么我要写书。
原文:https://towardsdatascience.com/why-data-scientists-should-write-books-and-why-i-did-1f047e10c6ab?source=collection_archive---------1-----------------------
知识就在那里。
好吧,一般来说科学不容易理解。
我明白了。相信我,我明白。
科学家拿高薪是有原因的,那是因为很多人不明白我们到底在做什么。但这就是为什么写作很重要。它帮助我们理解我们在做什么,并向他人解释,这样他们也能理解。
那么,我们为什么要写作呢?
我们都听说过子弹杂志和生产力规划者,对吧?它们如此成功是因为写下你的想法和要做的事情可以帮助你实现它们。花时间把事情写下来会让你更快乐。它有助于提高你的注意力,降低你的压力水平。
在数据科学领域工作压力非常大,甚至是一个非常混乱的领域。我知道,但我希望其他人知道数据科学到底是什么,数据科学家做什么,为什么。这就是为什么我决定写一本书。它帮助了我以上所有的事情,但它也让我学到了更多,提高了我的沟通技巧。(我希望。)
除非你练习,否则沟通技巧是学不会的,而写作是一种很好的练习方式,因为你必须把你头脑中的想法写在纸上。或者电脑上的空白文档。要么,要么。
写作让你更快乐,更善解人意,更感性,更有效率,更专注于你的目标。每个人都需要它!
你需要探索你的想法,巩固它们,让你的头脑安静下来。把事情写下来有助于理清你头脑中的一切,这对了解你自己和你的现实非常重要。
有一些研究概述了写作的影响以及写作如何帮助人们更好地吸收信息。当你写作时,你变得更加关注你的情感和目标。
不仅如此,书写还能帮助你破译数据。
写作和数据科学——为什么、在哪里和如何
所有的数据都是写出来的,写出来的都是数据。不可避免的是,数据无处不在,无处不在。无所不在。
作为数据科学家,我们与其他所有人分享对数据的理解和知识非常重要,因为他们很可能不知道。他们应该知道。
写作是我们分享知识的方式。好吧,播客也有用,但是有时人们仍然需要阅读他们所听到的。
阅读让人们接触信息,消化信息,做笔记,努力改进信息,然后回到他们苦苦挣扎的地方。最终,他们可以用自己的话重写,这样他们就能更好地理解它。
作为科学家,我们所做的一切都是为了分享知识。我们希望发现新事物,理解它们,并把它们发布到世界上,让其他人也能理解。我们想教育所有人。
数据科学目前是巨大的。最初成为计算机科学家的人是程序员,现在程序员多了,数据科学家少了。这意味着有更多的人成为数据科学家,更多的公司寻找更多的数据科学家。目前,T2 是供不应求。
太好了!
但是让你与其他数据科学家不同的是你用数据讲述故事的能力。这意味着你需要能够写作。
为什么写作有助于你的数据科学家职业生涯
每个人都需要,但可能不知道的是,有人能向他们解释他们的数据。这就是你的技能让你与众不同的地方;不是每个数据科学家都能准确有效地将他们看到的数据传达给不完全理解数据的人。一家公司需要一名数据科学家,能够理解、分析和使用他们的数据来提高他们的成功和生产力水平。
通过给人们提供一个故事来配合他们的数据,你向他们展示了为什么他们需要你,为什么他们需要你,以及你是做什么的。
他们知道数据科学很重要,但他们可能并不完全理解它。事实上,他们可能不知道。大多数不是数据科学家的人都不太了解数据,只知道它存在,你需要分析它。
这就是你进来的地方。
你可以获取数据,从中提取相关信息,使其易于理解并展示给人们。你可以使用图表、数字和其他任何东西,但是你需要确保人们知道他们在看什么,以及为什么。
你当然理解数据,你生活和呼吸着数据。
你知道如何创造它,推断它,使用它,探索它,然后,最终,使用它。人们需要你使用他们的数据来销售他们的产品,分享他们的知识,帮助扩展他们的想法。
为了站在不断涌现的数据分析师的最前沿,为了脱颖而出,向人们展示你知道自己在做什么,并且你是最好的数据科学家:告诉他们他们的数据对他们和他们的业务到底意味着什么。
写作就是你如何做到这一点。
我写了一本书,与其他数据科学家和有抱负的数据科学家分享我的专业知识,帮助他们了解我到底在做什么。
我的书让我更加了解我如何看待自己的工作,如何看待数据以及如何与数据互动。
我写了你也可以理解数据和破译它的方法,使用它为你的优势,并增加你的就业能力…
因为写作吸引了你的观众
用数据编写和创建故事有助于吸引受众,并吸引他们对数据中的信息和故事的注意。你的受众包括与你一起工作的人、为你工作的人、与你一起工作的人,或者不知道他们是谁的人,但是通过从数据中创造一个关于数据的故事,你可以与他们互动。
公司并不真正知道他们的数据意味着什么。他们可能不知道他们有什么数据,或者他们的数据在增加业务方面能做什么。他们可能只是查看数据和这一长串数字,没有任何意义的符号。
但它总是有意义的。数据总是有意义的。它可以让我们更好地理解人们是如何与一个想法、一个商业模式、一个产品互动的。它可以产生新的想法、新产品和更多的工作机会。
长期以来,人们一直认为,在商业环境中经营企业和做出决策完全是基于逻辑和理性。这不是真的。
企业是人经营的,人是有情绪的。人们在情感上参与故事,而不是科学。
数据讲故事是可能的,这是一种通过数据、视觉和叙事交流数据见解的方式。
通过创建一个叙述,数据更容易消化,启发观众的洞察力,他们的重要性,也娱乐观众。
数据故事既影响又推动变革。
但那只是在你能与人分享这些知识的情况下。使用数据创造了如此多的可能性,但是除非你以人们能够理解的方式与他们分享数据,否则这些可能性不会产生任何结果。
当你试图口头解释某件事时,你常常会觉得你的话很混乱。你不是很清楚,只是分享你脑海中闪现的想法。
如果你把这些见解写下来,你会花更多的时间和精力去阐述它们,并确保你有效地传达它们的意思。
写作可以建立自信。
最终,写作是你的朋友。
最后
数据科学很混乱,理解数据很混乱,知识需要分享。基本上,科学家的存在是为了发现和分享新信息和新知识。
任何地方的任何人都在创造数据。这就是为什么每个人都应该能够理解数据。
作为一名数据科学家,写作不仅会帮助你更好地了解自己,还会增加你所做事情的合法性,并最终使你能够更好地与他人沟通。
通过从数据中产生类似故事的东西,你创造了其他人可以涉及的东西,当你可以告诉人们你是做什么的,什么是数据科学以及它如何影响他们的生活时,他们会更好地理解你和你的工作。
但你也会的。写作帮助你记住信息,吸收信息,理解信息。你基本上会对自己的数据技能充满信心。
所以…
你还在等什么??去写本书吧!
你的事业和你的头脑会因此而感谢你。
事实上,如果你喜欢这个帖子,并想在我的书里挖得更深…那么给它一个+*评论下面的 用你的电子邮件和前 50 人将获得一个完全免费的 复制 自信数据的技能!***
更新:感谢对此的惊人支持和精彩成交!我们已经决定向前 100 名*人 鼓掌+评论下方 将获得一个副本 自信数据技能!***
更新二: 100 条评论!!非常感谢:)。每个评论过的人,确保你的 包括你的电子邮件 ,这样我们就可以把链接直接发给你。如果你没有做 100 评论,不用担心!你仍然可以点击横幅下面的链接从 Amazon.com 获得。快乐分析:)****
https://www.amazon.com/gp/product/0749481544/ref=as_li_tl?ie=UTF8&tag=superdatascie-20&camp=1789&creative=9325&linkCode=as2&creativeASIN=0749481544&linkId=bb7507851a740c1eb7f45ab4b6bd2a84
为什么数据科学家会在不久的将来转向工业和制造业
原文:https://towardsdatascience.com/why-data-scientists-will-turn-to-industrial-and-manufacturing-industries-in-the-near-future-6f690e02dfd3?source=collection_archive---------17-----------------------
数据科学已经是一个令人难以置信的广阔和令人兴奋的领域。但是由于破坏,未来几年对数据科学家的需求可能只会增加。据 IBM 称,到 2020 年,对该领域专家的需求将增长 28%。
如果你是雇主,那就需要招聘很多人。如果你现在是一名数据科学家,或者希望成为一名数据科学家,这将是一个充满希望的机会,也是一个通往美好未来的潜在大门。对一些人来说,只要知道数据科学中存在哪种专业,以及雇主可能会如何提及它们,就有助于规划课程。
事实是,颠覆不会去任何地方。颠覆性技术提高了一些行业的竞争力,也为其他行业创造了公平的竞争环境。但他们都需要数据和能够分析数据的敏锐的人才。
新技术正在造成广泛的破坏
你几乎肯定听说过“颠覆”这个词。但是到底是什么呢?它指的是技术习惯于改变现状,可以这么说。
技术通过提供新的生产、原材料采购、设施管理或数据收集方法,一次颠覆了整个行业。为什么如此具有破坏性?因为这些以前不可能的技术,似乎在一夜之间变成了不可或缺的竞争优势。
例如,精益制造不再是可选的了。当被问到时,大多数企业主将削减成本列为他们的首要目标,这意味着他们确实无法承受流程中的浪费。对于制造业来说,目标是以越来越低的利润运营,“中断工具包”可能包括:
大数据和云系统
业务分析和仪表板
智能工厂
工业物联网
机器人和自动化
这些流程的共同点是数据。制造业正在将比以往更多的数据整合到更多的流程中。
预测原材料短缺、客户需求和天气模式——更不用说调节产品吞吐量、监控联网设备以进行维护,以及向送货车辆和在工厂车间作业的机器人发送指令了——所有这些加起来就是一组异常复杂且相互依赖的变量。
数据能为你做什么?
收集正确的数据有助于发现企业中被忽视的角落。例如,对于依靠压缩空气为组装和制造工具提供动力的设施,美国能源部估计,目前使用的所有系统中有一半效率低于预期。
此外,将更先进的环保工具从制造工厂的一端整合到另一端可能会产生意想不到的结果,例如从生产设备中回收废热并投入使用的能力,或者根据工作流程自动控制照明、门和气候。
如今,一些工厂手头只有一小时的备件就能运转。这对一般的工厂来说可行吗?
这在一定程度上取决于工厂的位置和供应链的完善程度。但这也要求工厂掌握大量实时数据,因此即使需求、产能和其他变量发生最小的变化,也不会导致生产完全停止。
知道如何在数据科学领域找到自己的未来
因此,考虑到这些趋势,数据科学家如何才能让自己变得最有用,并在制造业找到令人满意的职业?
你可以做的第一件事就是让自己从整体上熟悉“数据科学”的不同学科。如果你已经进入了就业市场,那就太好了——了解不同雇主可能用来描述他们正在寻找的数据科学家职能的短语将有助于你找到合适的角色。
如果你是一名学生,了解你面前的几个分支路径可能是加倍重要的。
商业智能分析师:利用数据系统预测商业和市场趋势,更好地了解公司的财务状况和前景。
数据架构师:你将与系统设计师和开发人员一起创建管理、存储和保护系统。
数据挖掘工程师:开发检查第一方和第三方数据所需的专业知识,并从中得出可操作的结论。
数据科学家:这是一个你可能会听到与这里提到的其他术语互换使用的术语。但就其最纯粹的形式而言,数据科学家的角色是探索数据中的模式,形成假设并设计测试它们的例程。在商业环境中,数据科学家可以帮助测试影响公司盈利能力和效率的变量。
更具体地说,你将参与质量保证和缺陷跟踪,供应商关系,产量预测,实现更高的能源效率,设计和模拟新的设施和新的制造流程。
我们在这里介绍的只是大数据和数据科学的一些潜在学科,以及一些行业应用。
据《福布斯》报道,2016 年的每个月,数据科学和相关领域的工作岗位增加了2900 个。
这对每个相关人员来说都是一个巨大的机会。
形象由克里斯蒂娜 组成
为什么数据策略会拯救机器智能
原文:https://towardsdatascience.com/why-data-strategy-will-save-machine-intelligence-71dd76482650?source=collection_archive---------0-----------------------
在关于沃森如何进化成终结者 10 和 DeepMind 将解决世界饥饿的新闻出现几个月后,围绕人工智能的炒作开始消退。首先,投资者指出了开发者工具和横向平台的商品化,然后他们开始担心算法风险和偏见,现在他们担心深度学习的可解释性。我的最佳猜测是,下一波批评将会强调部署、性能管理和调试方面的障碍。
虽然不应忽视这些障碍,但它们并不是阻碍采用机器智能解决方案的主要问题。最大的障碍是企业处理数据的方式。
一般企业[误]用数据有三种方式:1)支持运营;2)证明自己的直觉;3)掩盖他们的错误。虽然大多数读者会理解这些[错误]用例,但让我来宣泄一下这些冒犯:
但是首先,说一个题外话:对于那些不认识我的人来说,我的背景是国际安全和军事情报。因此,我喜欢[引用孙子]根据克劳塞维茨的三个层次的战争来思考企业战略,其中战略涉及我们实现国家目标的方式和方法;运营与活动的设计和执行有关;战术指的是定义我们战斗的力量和策略的应用。
- 在军事战役中,骑兵通常扮演更多的战术角色。虽然他们的侦察可能为作战提供信息,但他们的侦察和冲突很少影响军事战略。同样,数据分析师(以及他们收集或生成的数据)通常用于支持运营。例如,一个项目经理决定推出一项新服务。他/她可以使用数据来确定要进入哪个地理市场。同样,营销专家在计划新的社交媒体活动时,可能会尝试用数据研究客户群。
大多数企业了解如何使用数据来指导决策(即运营指导),但一旦做出决策,数据(以及生成数据的系统)的效用就会减少,直到下一个关键的运营决策出现(可能需要也可能不需要相同的数据输入和/或支持基础设施)。因此,土地和扩张战略很少奏效。你最好登陆然后去跳岛。 - 我们都有关于正确选择的直觉。我们可以尝试告诉我们的主管“我们就是知道”,或者我们可以花 30 分钟设计一个漂亮的 Tableau 图表,证明我们的直觉是正确的。可视化是展示我们已经[认为]知道是真实的东西的好方法。
前面我提到了可解释性问题(例如,如果深度学习是一个黑盒,我们如何解释它的结果)。这只是一个问题,因为人类仍然觉得必须解释数据。虽然机器智能可能会提供更客观的答案,但我们想要更多的控制。我们希望有能力以一种证明我们是正确的方式解释数据。 - 最后,“我没有收到警报”的辩护。我们通常知道一系列可能出错的事情。我们可以通过仪表板和警报使用数据来了解情况,并在出现问题时通知我们。如果出现问题,而你的仪表板和/或提醒没有提前告诉你,你不会被解雇。监控是重要的,尽管在效用上是有限的,因为最经常发生的问题不是我们所能预测的。
由于企业在战术和运营上使用数据,机器智能解决方案的采用速度很慢。开源工具足以支持范围良好的活动或有限的约定(如果软件正在吞噬世界,那么开源正在吞噬软件)。对于那些担心开源产品、顾问或概念验证永远不会变成合同的人来说,这很合适。但是,有哪个头脑正常的人会为解决短期痛苦而付费订阅呢?事实上,谁会为任何不是 CRM 或工作流自动化的企业软件付费呢?
为了实现机器智能的真正好处(以及机器智能初创公司的成功),企业需要开始将数据视为一种战略资产。这意味着两件事:
- 定义与您的业务使命、愿景和政策相一致的数据战略,而不是您的运营需求。该战略应阐明您的数据团队的角色和结构,以及您将如何衡量成功(例如,什么是“重大胜利”)?),以及你将如何设定优先级。由于您的数据策略还应指定您需要哪些资源来支持业务目标,因此您还必须制定数据获取策略,该策略将说明您将如何获取信息。有时候,通过网络抓取和机器/深度学习收集数据将是正确的前进道路。然而,购买数据许可证或使用众包/外包平台可能更经济。
一旦您制定了数据和数据获取策略,您必须确定实施和维护该策略所需的基础设施和人员。两者都应该取决于你需要的信息和你计划获取信息的渠道。您应该考虑基础设施和软件选择方面的人才获取。例如,如果你有很棒的数据管理和管道软件,你也许可以雇用更少、更好的数据科学家(不管这意味着什么,但我会把这个问题留给另一个抨击)。 - 把数据想象成有货币的东西——可以出售或交换的东西。我无法表达我遇到的收集了非常有价值的数据集的公司有多频繁,他们可能会把这些数据集卖给其他人(记得我说过有时候购买数据集更有效,如果我们可以手拉手,唱 kumbaya,交换信息,那不是很酷吗?).同样常见的是,公司只是坐在可以支持高价值功能的数据集上,这将吸引新客户。
数据是一种无形资产,应该在企业资产负债表上有自己的一行。尽管有相关的成本,但它可以成为竞争优势、知识产权甚至收入的来源。
我的长篇大论就此结束:除非公司从战略角度考虑数据,否则没有人会购买初创公司兜售的解决方案。
为什么数据统一对于游戏公司了解其客户和整体内容水平至关重要
原文:https://towardsdatascience.com/why-data-unification-is-critical-for-gaming-companies-to-understand-their-customers-and-their-afdf861f94d0?source=collection_archive---------3-----------------------
当谈到理解玩家行为的整体性时,一个经常遇到的问题是数据碎片。游戏公司通常将客户数据存储在多个系统、平台和软件中,这导致了一个“孤岛”模型,无法创建玩家旅程的完整画面。最近,我与旧金山湾区最热门的手机游戏公司之一呆了一段时间,令我惊讶的是,他们无法理解他们所拥有的大量数据的格式。更不用说,他们没有能力提取他们所掌握的宝贵信息。谈论一个被浪费的机会——悲伤。
好消息是,基于云的数据仓库和新的行为分析技术的简单性正在帮助各种规模的游戏公司揭示整个玩家旅程,从转化到最终的不幸流失。当数据分散在多个平台上,并且有时不是可读格式时,要获得工作室了解其玩家所需的答案和见解,需要手动处理数据。不仅如此,如果没有行为分析,几乎不可能有效地将这些见解货币化。
从提高留存率到优化营销渠道,这就是为什么数据统一对于游戏公司了解玩家和用户行为至关重要。
玩家旅程的可见性
与碎片化数据搏斗的问题是,它不仅耗费时间,而且阻止你的团队获得玩家旅程的全貌。因此,他们无法实时做出数据驱动的决策。行为分析涉及统一客户生命周期中多个接触点的数据。只有当你整合了广告、激活、互动和使用数据,你才能展示整个玩家之旅,从而开发有意义的客户群和接触点。
The Player’s journey from entry, to Enthusiast… and eventual Churn
通常,玩家之旅分为六个部分:认知、兴趣、考虑、购买、保留和宣传。规划用户旅程中的这些步骤对于准确理解是什么让用户着迷至关重要,而第一步是通过数据仓库统一用户数据。一个针对行为和时间序列分析而优化的数据仓库有助于工作室执行特别分析,因此他们可以了解为什么一些玩家会参与他们的游戏,而其他人则不会。然后,你将能够在玩家旅程中修补行为元素和不同的点,以实现像增加游戏内货币支出或促进其病毒式传播这样的结果。
提高玩家忠诚度
运行存储在如此多不同位置的数据——大多数在线游戏公司都在这么做——减少了对抗玩家流失所需的必要了解。相反,采用统一数据方法的公司能够提高他们的玩家保留率,从而创造竞争优势,因为很少有游戏公司对玩家旅程有清晰的理解,并对玩家保留有相应的见解。就拿最受欢迎和最成功的网络游戏之一《星球大战英雄银河》来说,它在 30 天后只有 4.5%的用户留存率。
以仓库的方式整合数据在留住玩家方面有几个积极的效果。首先,你将能够看到哪些渠道为你的游戏带来了最忠实的玩家,并将你的营销努力更多地集中在最有效的媒体上。只有有了统一的数据,你才能开始实施高水平的行为分析,发现游戏中玩家玩得最开心的地方(以及他们玩得最不开心的地方)。然后,你可以调整你的游戏,确保你建立在人们喜欢的体验上,并消除他们不喜欢的体验。
优化终身客户价值
在 Cooladata,我们通过利用统一数据提供玩家旅程的完整端到端视图,引导客户走向最有效的营销渠道。电影公司可以看到哪些营销渠道是最有效的,因此他们可以优化营销支出。统一数据还有助于我们的客户收集见解,了解转化他们的目标潜在未来用户的最佳策略。这有助于优化和增加每个玩家的终身客户价值(LTV)。例如,你可以很容易地看到通过脸书广告获得的用户是否比通过谷歌 Adwords 获得的用户有更高的 LTV,并相应地关注你未来的努力。
我们还帮助许多客户识别他们游戏中的粗糙边缘和问题区域,利用仓库数据来查明玩家在哪里卡住了。然后,公司可以实时解决这些问题,让玩家继续玩游戏,并随着时间的推移增加每位玩家的收入。这些分析可供组织内的每个人使用,从首席执行官和产品经理一直到数据团队和开发人员。这为每个部门提供了相同的可靠分析见解,因此在优化营销组合和游戏体验以增加每个客户的 LTV 时,整个公司可以朝着相同的方向前进。
面对游戏工作室如今使用的所有工具、平台和软件,从多个来源收集所有数据都很困难,更不用说收集可操作的见解了。我们明白了。但在当今的在线游戏环境中,数据统一甚至更为关键,因为它关系到对用户行为的理解。通过将仓储方法与行为分析相结合,您将能够发现玩家之旅,提高留存率,并优化每个玩家的终身价值。如果你想讨论,了解更多,或者看到它的实际应用,给我写信吧!
为什么深度学习优于传统的机器学习?
原文:https://towardsdatascience.com/why-deep-learning-is-needed-over-traditional-machine-learning-1b6a99177063?source=collection_archive---------0-----------------------
人工智能火了!突然间,每个人,不管懂不懂,都在谈论它。理解人工智能的最新进展可能看起来势不可挡,但它实际上可以归结为两个非常流行的概念机器学习和深度学习。但最近,深度学习越来越受欢迎,因为在用大量数据训练时,它在准确性方面占据优势。
为了向你展示深度学习得到的关注,下面是关键词的谷歌趋势:
Trend of “Deep Learning” in google
软件业如今正朝着机器智能的方向发展。机器学习作为让机器智能化的一种方式,在每个领域都变得必不可少。更简单地说, 机器学习是一套解析数据的算法,从中学习,然后应用所学知识做出智能决策 。
机器学习的例子比比皆是。这就是网飞如何知道你下一个想看的节目,或者脸书如何在数码照片中认出你朋友的脸。或者在你进行 CSAT 调查之前,客户服务代表如何知道你对他们的支持是否满意。
传统的机器学习算法的问题在于,尽管它们看起来很复杂,但它们仍然像机器一样。他们需要很多领域的专业知识,人工干预只能做他们设计的事情;不多不少。对于人工智能设计师和世界上的其他人来说,这是深度学习更有希望的地方。
什么是深度学习?
实际上,深度学习是机器学习的一个子集,它通过学习将世界表示为嵌套的概念层次结构来实现强大的功能和灵活性,每个概念都是相对于更简单的概念来定义的,而更抽象的表示是根据更不抽象的概念来计算的。
详细地说,深度学习技术通过它的隐藏层架构逐步学习类别,首先定义像字母这样的低级类别,然后定义像单词这样的稍高级别类别,然后定义像句子这样的高级别类别。在图像识别的例子中,这意味着在对线条和形状进行分类之前识别亮/暗区域,以便进行人脸识别。网络中的每个神经元或节点代表整体的一个方面,它们一起提供了图像的完整表示。每个节点或隐藏层都有一个权重,代表其与输出的关系强度,随着模型的发展,权重会进行调整。
Deep Learning Architecture
深度学习的显著特征
深度学习的一大优势,也是理解它为什么变得流行的一个关键部分,是它由海量数据驱动。技术的“大数据时代”将为深度学习的新创新提供大量机会。按照中国主要搜索引擎百度首席科学家、【谷歌大脑】项目负责人之一的说法,深度学习的比喻是,火箭引擎是深度学习模型,燃料是我们可以喂给这些算法的海量数据。
****深度学习需要高端机器与传统机器学习算法相反。GPU 现在已经成为执行任何深度学习算法不可或缺的一部分。
在传统的机器学习技术中,大多数应用的特征需要由领域专家来识别,以降低数据的复杂性,并使模式对学习算法的工作更加可见。前面讨论的深度学习算法的最大优势是,它们试图以增量的方式从数据中学习高级特征。这消除了领域专业知识和核心特征提取的需要。
****深度学习和机器学习技术的另一个主要区别是解决问题的方法。深度学习技术倾向于端到端地解决问题,而机器学习技术需要首先将问题语句分解成不同的部分来解决,然后在最后阶段将它们的结果组合起来。例如,对于一个多对象检测问题,深度学习技术,如 Yolo net t 将图像作为输入,并在输出时提供对象的位置和名称。但是在通常的机器学习算法中,如 SVM ,首先需要一个包围盒对象检测算法来识别所有可能的对象,以将拱作为学习算法的输入,以便识别相关对象。
通常一个深度学习算法由于参数数量大,训练时间长。流行的 ResNet 算法完全从零开始训练大约需要两周时间。传统的机器学习算法需要几秒到几个小时来训练。在测试阶段,情况完全相反。测试时,深度学习算法运行时间要少得多。然而,如果将它与 k-最近邻(一种机器学习算法)进行比较,测试时间会随着数据大小的增加而增加。尽管这并不适用于所有的机器学习算法,因为其中一些算法的测试时间也很短。
可解释性是为什么许多部门使用其他机器学习技术而不是深度学习的主要问题。我们举个例子。假设我们用深度学习来计算一个文档的相关度得分。它的表现相当出色,接近人类的表现。但是有一个问题。它没有透露为什么给出这个分数。事实上,从数学上讲,你可以找出深层神经网络的哪些节点被激活了,但我们不知道这些神经元应该模拟什么,以及这些神经元层集体在做什么。所以我们无法解释结果。这与机器学习算法不同,如决策树、逻辑回归等。
什么时候用深度学习还是不要超过别人?
- 深度学习 out 执行其他技术如果 数据量大 。但是对于小数据量,传统的机器学习算法更可取。
- ****深度学习技术需要有 高端基础设施 在合理的时间内进行训练。
- 当 缺乏领域理解的特性自省 ,深度学习技术一枝独秀,因为你不必太担心特性工程。
- ****深度学习在处理图像分类 、自然语言处理 等复杂问题时,确实大放异彩。
参考文献-
** [## 深度学习什么时候比支持向量机或者随机森林效果更好?
如果我们处理一个监督学习问题,我的建议是从最简单的假设空间开始。也就是说,尝试…
www.kdnuggets.com](https://www.kdnuggets.com/2016/04/deep-learning-vs-svm-random-forest.html) [## 何时选择深度学习
深度学习适合机器学习和其他优化算法的什么地方,它能解决什么样的问题…
deeplearning4j.org](https://deeplearning4j.org/whydeeplearning.html) [## 机器学习与深度学习
如果你是这个领域的新手,可能会觉得有很多术语需要记住。两个最大的嗡嗡声…
www.datascience.com](https://www.datascience.com/blog/machine-learning-and-deep-learning-what-is-the-difference)**
为什么深度学习可能最适合乳房
原文:https://towardsdatascience.com/why-deep-learning-may-be-best-for-breast-7725d1440fde?source=collection_archive---------6-----------------------
1986 年是伟大的一年。在史上最差着装十年的鼎盛时期,俄罗斯人发射了 Mir 空间站,皮克斯成立,微软上市,第一台 3D 打印机售出,马特·格罗宁创作了《辛普森一家》。与此同时,两个同样重要但完全不同的科学飞跃发生在地球相反两侧完全不同的学术领域。现在,32 年后,深度学习的诞生和乳房筛查的首次实施终于融合在一起,创造了可能是女性最常见癌症的最终早期诊断测试。
深度学习简史
1986: 在美国,机器学习早期领域的一小群感知鼓动者在《自然》杂志上发表了一篇题为“通过反向传播错误学习表征”的论文。作者 Rumelhart、Hinton 和 Williams 违背了传统智慧,证明了通过在系统中反向运行神经网络的输出错误,他们可以显著提高图像感知任务的性能。反向传播(或简称为 back-prop)不是他们的发现(因为我们都站在巨人的肩膀上),但随着这篇论文的发表,他们终于成功说服了持怀疑态度的机器学习社区,使用手工工程功能来“教”计算机寻找什么不是前进的方向。该技术的巨大效率增益,以及不再需要主题专家的艰苦特征工程来发现数据中的潜在模式的事实,意味着反向传播允许人工神经网络应用于以前可能的大量问题。对于许多人来说,1986 年标志着我们所知的深度学习诞生的一年。
尽管理论上很先进,但深度学习在计算上仍然过于复杂,计算机芯片当时无法有效处理。用了十多年的时间来证明商业上可用的处理能力最终已经足够先进,可以显著提高神经网络的性能。这一点在 2012 年的 Alexnet 中得到了完美的展示,这是一个运行在图形处理单元(GPU)上的八层卷积网络,令人信服地击败了之前所有的图像分类测试,以超过 10%的准确率增长击败了所有竞争对手。从那以后,GPU 一直是所有深度学习研究的中流砥柱。直到最近,研究才开始生产应用于放射学的功能性和经临床验证的深度学习软件。现代深度学习系统不再需要手工制作的特征工程来学习在图像中寻找什么;他们现在可以自己学习了。简而言之,深度学习终于被推上了主流。
乳腺癌筛查简史
1986 年:在英国,教授 Patrick Forrest 爵士制作了“Forrest 报告”,受前瞻性思维卫生大臣肯尼斯·克拉克的委托。Forrest 从几个国际试点试验(美国、荷兰、瑞典、苏格兰和英国)中获得了乳腺癌筛查有效性的证据,他得出结论,NHS 应该建立一个全国性的乳腺癌筛查项目。这很快被应用到实践中,到 1988 年,NHS 有了世界上第一个基于邀请的乳腺癌筛查项目。英国各地建立了“福里斯特单位”,用于筛查年龄在 50 岁至 64 岁之间的女性,她们每三年被邀请做一次乳房 x 光检查。然后在 2012 年,当对筛查计划的持续分析证明将邀请筛查的年龄范围扩大到 47-73 岁的好处时,早期发现女性最常见癌症的可能性得到了进一步支持。到 2014 年,英国系统成功地发现了超过 50%的女性人口的乳腺癌(在目标年龄范围内),然后才出现症状。筛查现在是国际公认的最佳实践标志,NHS 项目被全世界视为黄金标准。简而言之,英国拥有世界上最好的乳腺癌筛查项目,诞生于 1986 年。
在 2000 年数字乳房 x 线照相术出现后,医学成像数据以一种服从于计算分析的格式变得可用。到 2004 年,研究人员开发了被称为计算机辅助诊断系统(CAD),使用老式的特征工程程序和监督学习来突出乳房 x 光片上的异常。这些系统使用手工制作的特征,如乳房密度、实质纹理、肿块或微钙化的存在,来确定是否可能存在癌症。它们旨在通过根据人类识别的特征高亮显示乳房 x 光片上的区域,试图模仿专家的决策过程,从而提醒放射科医生特定特征的存在。
CAD 的问题
虽然传统 CAD 在与放射科医生结合使用时显示出对乳腺癌的卓越检测(“二次阅读 CAD”),但它们也显著增加了所谓的“召回率”,因此增加了运行筛查程序的成本。在 CAD 增强乳腺筛查中,乳房 x 线照片由一名放射科医师(或两名独立的阅读者,如在英国的情况下)查看。读者寻找乳腺癌的迹象,然后检查 CAD 覆盖图,该覆盖图显示系统突出显示的感兴趣区域,如果有任何怀疑,则决定是否召回患者进行进一步测试,如超声波和/或活检。召回率被用作乳腺筛查单位质量的一个指标,召回率越高,表明该项目产生的假阳性越多。高召回率的后遗症包括执行更多后续测试导致的成本增加。例如, Elmore 等人证明,在 CAD 筛查上每花费 100 美元,就要额外花费 33 美元来评估不必要的假阳性结果。更重要的是,越来越多的女性承受着过度的压力和情绪上的担忧,因为她们害怕发生最坏的情况。
召回率明显上升的原因与 CAD 输出性能的统计基础有关。这些系统显示出很高的灵敏度,但特异性很差(例如,一个行业领先的 CAD 报告仅算法的灵敏度为 86%,但特异性仅为 53%)。这意味着这种系统非常善于在真阳性和假阴性结果之间做出决定,但在区分真阳性和假阳性结果方面相当差。将这一点与人类的表现相比较——灵敏度和特异性分别为 86.9%和 88.9%(Lehman 等人),你就可以开始明白为什么 CAD 没有完全实现它的承诺了。在一项开创性的英国试验( CADET II )中,尽管 CAD 被证明有助于单读者检测癌症,但在人/CAD 组合和两个人的标准双阅读之间,召回率相对增加了 15%。
Traditional CAD — areas of calcification are marked with an * and potential masses marked with a ▲. Criticisms of CAD include that there are too many markers, and they distract from the underlying image, subsequently raising recall rates.
除了提高召回率,CAD 系统已经显示不一致,并且在假阳性率上有显著差异。此外,多达 30%的癌症在“正常”乳房 x 光检查后仍然存在,被称为间歇期癌症。本质上,传统 CAD 使用过时的特征工程编程来部分成功地尝试改进筛查检测。不幸的是,由于特异性差,放射科医生不信任它,而且由于增加了不必要的召回,给患者带来了严重的不必要的焦虑。
与任何乳腺放射科医生交谈,当你提到乳腺 CAD 时,他们经常会傻笑——有些人忽略它,有些人甚至不使用它。与任何患者交谈,他们都会告诉你,收到更多检查的召回邀请是他们经历过的最令人心痛的经历之一。还没有人解决如何提供有效和准确的 CAD 乳房筛查而不增加不必要的召回率的难题。
驱动压力
在最近对乳房筛查的深度学习和自动化驱动的兴趣背后,除了准确性之外,还有其他因素。筛查项目的成功推动了需求和成本,据估计,仅在美国,每年就要进行 3900 万次乳房 x 光检查。因此,没有足够的人类放射科医生来跟上工作量。在英国,这种情况甚至更有压力,因为强制复读意味着每次测试的放射科医生数量是美国的两倍。昂贵的专业乳腺放射科医生的短缺变得如此严重,以至于在英国将双读基准降低到单读的杂音被说出——尽管有令人信服的证据证明双读确实更好。
然而,对于寻求削减开支的政策制定者来说,双重阅读的成本低效率是一个诱人的目标,尽管单一阅读或单一阅读器 CAD 支持的程序都没有被证明是准确的。在采煤工作面,尤其是在资金不足的国民医疗保健系统中,感觉就像在事情发生之前需要做出一些让步。
机会的汇聚
由于命运的巧合,乳腺筛查项目的本质提供了大量数字化成像数据,这些数据非常好地记录了患者的结果。这种丰富的数据来源恰好非常适合深度学习的需求。通过利用带标签的数字图像及其相关的最终病理结果,我们可以为数据科学家提供近乎完美的“地面真相”数据集。如果图像上有疑似癌症,这可以通过活组织检查或手术从组织病理学上得到证实或否认。如果没有疑似癌症,那么三年后的随访成像将证实这一点。通过允许神经网络在“图像加病理结果”或“图像加后续图像”的基础真实数据上进行训练,系统可以自学从“正常”的海洋中识别癌症所需的特征,而不是像前几代 CAD 那样依赖人类来为它们进行教学。希望是,通过使用深度学习,我们可以从乳腺筛查中前所未有的准确性水平中受益。
在实践中取得成功
以前的 CAD 系统旨在通过突出专家演示的已知感兴趣的区域来模仿放射科医生的思维过程,而神经网络实际上做的正好相反。他们拍摄整套乳房 x 光照片(通常是 4 张),并利用他们自己学到的特征来决定是否有癌症。因此,解释神经网络的输出更加困难,因为它可能解释人类甚至没有意识到的特征。这并不像听起来那样是个大问题——毕竟,过去放射科医生几乎一致拒绝 CAD 覆盖图,认为它太分散注意力。事实上,越来越多的人意识到,向放射科医生展示可能的异常在哪里,或者试图对其进行分类,可能并不像听起来那么有用。该领域的研究人员建议,深度学习 CAD 系统的未来迭代根本不会向放射科医生提供任何本地化信息,而是简单地允许他们查看任何被系统认为可疑并标记为召回的图像。这将防止减少受控人类思维的风险,并允许他们更有效地做出最佳明智的决定,而不是因试图解释深度学习算法的输出而分心。
然而,深度学习模型可以被训练成以其他方式有效地呈现它们的推理。显著性图突出了图像的哪些区域最能触发神经网络的最终决策。这与以前的 CADs 没有什么不同,但是可以通过对高光进行阈值处理,使其仅在给定特定条件和异常确定性的情况下出现,从而变得更加有用。通过改变系统的 ROC 曲线上的操作点,召回决策阈值可以与给定放射科医师的表现相匹配。这将允许高召回放射科医生与低召回版本的算法配对,提供一种更细致入微的 CAD 支持方法。此外,来自乳房 x 光照片数据库的比较图像搜索可以为放射科医师提供相似的图像和已知的病理结果以供查看。最后,CAD 可以被设置成仅当它不同意人类读者的召回建议时才使其被知晓,从而仅在需要时充当安全网。
我们有多近?
在医疗保健系统中看到这一领域的一系列活动并不奇怪。英国可能拥有最高质量的数据,因为 NHS 拥有世界上最强大的国家乳腺筛查数据库,其中每个乳房 x 光检查结果、活检和手术结果都与每个筛查事件相关联。
我在一家总部位于伦敦的初创公司 Kheiron Medical 担任临床主管,该公司专注于乳房 x 线摄影的深度学习。到目前为止,对成千上万张乳房 x 光片训练的算法进行的内部基准测试显示了有希望的结果,我们期待着正在进行的独立多点临床试验的结果。
据报道,现有的 CAD 提供商也在研究深度学习解决方案。其他初创公司包括韩国的 Lunit 和以色列的 Zebra Medical,而谷歌 DeepMind 刚刚与帝国理工学院合作加入了竞争。在全球学术圈里,瑞士的和荷兰的,当然还有美国,都在进行卓有成效的研究。所有这些研究人员和公司都旨在通过支持单个读者检测,同时使用深度学习算法降低召回率,来改善 CAD 之前的迭代。
接下来的步骤很清楚——这些算法需要通过严格的医疗设备监管审查,以确保它们符合自己的主张。这将涉及稳健的临床试验,既回顾基准性能,又展望未来,以确保算法性能在现实世界的临床设置中得到保持。
圣杯将是实现由精确的深度学习支持的单阅读器程序,潜在地减少已经超负荷的双阅读放射科医生的工作量。在这种情况下,深度学习绝对不会取代单一阅读的放射科医生,只是通过增加一个由机器完成的额外的模式识别层来增强他们,让人类进行抽象和决策。这项技术可以将现有的单读本程序的一致性和准确性提高到双读本程序的水平,并为尚未实施筛查程序的国家提供大量新资源。
深度学习在全国筛查中的支持潜力,以及不发达的医疗保健系统跃进深度学习时代的潜力,可能只需要一两年的时间。
到目前为止只花了三十二年…
如果你和我一样对放射学人工智能的未来感到兴奋,并想讨论这些想法,请保持联系。我在推特上 @drhughharvey
如果你喜欢这篇文章,点击推荐并分享它会很有帮助。
关于作者:
哈维博士是一名委员会认证的放射科医生和临床学者,在英国国民医疗服务体系和欧洲领先的癌症研究机构 ICR 接受过培训,在那里他两次获得年度科学作家奖。他曾在 Babylon Health 工作,领导监管事务团队,在人工智能支持的分诊服务中获得了世界第一的 CE 标记,现在是顾问放射科医生,皇家放射学家学会信息学委员会成员,以及人工智能初创公司的顾问,包括 Algomedica 和 Kheiron Medical。
为什么 Deepfakes 是一件好事
原文:https://towardsdatascience.com/why-deepfakes-are-a-good-thing-10ceb86deaed?source=collection_archive---------6-----------------------
如果你应该相信媒体的话, Deepfakes 等于世界末日。假新闻,假证据,这项技术将创造一个不信任的世界,敲诈,…信任被抛弃,我们都完了。句号。
媒体喜欢吓唬我们,就像恐怖故事一样。这一次,它可能真的有助于传递积极的信息。有一种方法可以很好地利用 Deepfakes ,我不只是在《今夜秀》上谈论我的妻子。
我们相信一切
无论是新闻、杂志、书籍、流言蜚语,都只是由朋友或“可靠”来源传播的文字。我们都应该知道对我们听到和读到的一切持保留态度。然而,我们让他们引导我们的思想和信仰,这影响了我们重要的生活选择,比如我们投票给谁,我们爱谁,我们恨谁。言语是最容易被操纵的信息形式(为什么不买一本关于如何操纵他人的书呢)。然而,数百万人每天都生活在无法证明是真实的话语中,甚至愿意为此付出生命。
Roswell’s Flying Saucer 1947
我们过去认为照片是真实的。然后 Photoshop 就发生了。
Trump & Saruman
视频是真实的。尽管我们知道在好莱坞电影中看到的 90%是假的,但其他视频都是真的,对吗?
我们必须变得更加清醒
假新闻是个大话题。虽然我们心里知道永远不要相信政客和新闻媒体,但我们仍然相信,我们仍然相信他们说的每一句话,但当我们最终发现这都是谎言时,我们会发疯。不过,我们不责怪自己。
Deepfakes 只是增加了另一层担忧。视频可以造假?..我们看到的和听到的还有真实的吗?
不。什么都不是。正如你不应该相信电视、报纸或[在此插入你最喜欢的宗教书籍]上的每一句话,视频只是另一种随时可以被操纵的媒体。
但是不要怪 Deepfakes 。不要妖魔化这项技术。感谢 Deepfakes !
想想看:如果有人能够在他们的卧室里将一堆现有的工具组合在一起创造出这种技术,那么一定是有更大预算的人在很久以前就实现了。毫无疑问,拥有大量资源的大型组织还没有探索这些技术。谁知道呢,也许我们在新闻上看到过他们的一些作品,却不知道。
所以,感谢 Deepfakes ,让我们意识到这一点,让我们再次意识到,我们不能把我们看到和听到的一切都视为理所当然。为我们制造了一个问题,在它变得如此之大,并且已经错误地影响了我们许多人,以至于为时已晚之前,尽早解决它。
这需要时间。这是我们都必须学习的新技能。所以怀疑你在网上看到的下一个视频。见鬼,怀疑你看到的,读到的,听到的一切。更关键!你自己想想。
【svencharleer.com】
为什么我拒绝了一份数据科学家的工作?
原文:https://towardsdatascience.com/why-did-i-reject-a-data-scientist-job-f2e56117fdae?source=collection_archive---------1-----------------------
21 世纪最性感的工作
在告诉你为什么我拒绝了一份数据科学家的工作之前,让我们后退一步,试着回答另一个问题——为什么要成为一名数据科学家?
你可能听说过这个职业——数据科学家被《哈佛商业评论》评为 21 世纪最性感的工作,并且根据 Glassdoor 连续三年被选为美国最好的工作。最近, IBM 预测,到 2020 年,对数据科学家的需求将飙升 28%。
所有这些诱人的就业前景似乎都指向一个方向,许多人都想去追求这个方向——我们都知道——这是有原因的。
不管普遍的观念如何,如果你一直关注我在数据科学方面的学习之旅,你就会理解我为什么决定成为一名数据科学家,以及我是如何实现转变的-这一切都是因为学术背景、激情和技能、工作经验和工作前景的甜蜜交集。
你现在可能想知道:为什么一个如此痴迷于数据科学的人会拒绝一份数据科学家的工作?
我希望通过在这篇文章中分享我的经验来回答这个问题,并让您一瞥我在数据科学世界中的骑行之旅和冒险。我们开始吧!
有时候,职称≠工作性质
由于不同的职业目标,职称的重要性因人而异。
同样,由于人生目标不同,工作性质的意义也因人而异。
因此,职位名称和理想工作性质之间的完美匹配有时可能不是这样,这让许多求职者陷入两难境地,他们必须做出选择——毫不奇怪,我是求职者之一。
申请数据科学家的工作
(Source)
长话短说,几个月前我申请了不同公司的各种数据科学家工作。不出所料,大多数时候我都被拒绝了,到了一定程度,我的收件箱就塞满了电子邮件,比如:
感谢您申请 ___ 的数据科学家职位。不幸的是…
感谢您申请 ___ 的数据科学家职位。由于我们收到了大量的申请,我很抱歉地通知你…
我很沮丧,但从未放弃。我不断学习和提高我的技能。
只是不停地磨。
终于有一天,我收到了 LinkedIn 上提交的申请邮件,要求安排我的面试。
我欣喜若狂,对这家公司做了大量的研究,看看如何将我的技能和经验与工作描述和公司文化相匹配。
因此,这份工作要求范围广泛的技术和非技术技能,以及一定时期的涵盖各种行业的经验。职责基本上包括从上到下的数据和非数据相关的工作,这意味着候选人必须兼顾多个角色,同时仍然能够满足工作期望。
简而言之,在我看来,这份工作的描述令人难以置信,要求入门级职位至少有 3-5 年的经验。
嗯,我可能没有达到至少 70%的工作要求,但我仍然带着坚定的信念和信心去参加面试,我可以为公司增加价值(凭借我的技能和经验),同时在工作中学习。
选择工作性质而不是职称
(Source)
令我惊讶的是,我害怕无法满足的 70%的工作要求根本不在实际工作范围内,。
我唯一的工作范围是为不同的公司(客户)构建用于可视化目的的仪表板——没有数据分析或任何东西。当然,在任何数据科学过程中,数据可视化都是一个重要的部分,但是这份工作的性质并不真正符合我每天真正想要做的事情(我在 我的帖子 中也提到了这一点):
从了解业务问题,到收集和可视化数据,直到原型制作、微调和将模型部署到现实世界应用程序的阶段,我发现了利用数据解决复杂问题的挑战的成就感。
更令人震惊的是,我对公司给出的职位描述和实际工作范围之间的鲜明对比感到困惑。
最后一轮面试后,我得到了一份数据科学家的工作。在同一时期,我还被另一家公司聘为研究工程师,该公司对我的工作有更明确的描述,实际工作范围正好符合我想做的事情,以发展我的激情和技能。
还记得大多数求职者面临的职位名称和理想工作性质之间的两难选择吗?我选择了后者。
最后的想法
Chilling in New Zealand
对我来说,职称是暂时的,但工作性质——真正让我感兴趣和具有挑战性的工作,以及在旅途中学到的宝贵技能和经验——比一切都重要。
直到现在,尽管一路上有挑战和障碍,我还是很享受学习的旅程。每天都不一样,每天都是学习新东西的一天,我真的喜欢学习新东西!
感谢您的阅读。如果您曾经遇到过任何与我类似的经历,我希望让您知道,处于两难境地是完全正常的(大多数人都是这样),尤其是当您刚刚开始涉足数据科学领域时。
花点时间问问自己,你希望在职业生涯中实现什么,或者更深入地说,在生活中实现什么。
接受你可能无法找到问题答案的事实。
不断地问,不断地向内和向外探索,你的选择迟早会变得更加清晰。
一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。在那之前,下一篇文章再见!😄
关于作者
阿德蒙德·李 目前是东南亚排名第一的商业银行 API 平台 Staq — 的联合创始人/首席技术官。
想要获得免费的每周数据科学和创业见解吗?
你可以在 LinkedIn 、 Medium 、 Twitter 、脸书上和他联系。
** [## 阿德蒙德·李
让每个人都能接触到数据科学。Admond 正在通过先进的社交分析和机器学习,利用可操作的见解帮助公司和数字营销机构实现营销投资回报。
www.admondlee.com](https://www.admondlee.com/)**
为什么你的模型预测到了?(第 1 部分,共 2 部分)
原文:https://towardsdatascience.com/why-did-your-model-predict-that-4f7ed3526397?source=collection_archive---------9-----------------------
Picture from pixabay.com
在这篇文章中,我们提出了一个简单且可扩展的方法来为基于树的二元分类器的个体预测产生易于解释的解释。这篇文章分为三个部分:
- 在第 1 节中,我们激发了对机器学习分类器所做预测的逐案解释的需求,并评论了最先进的方法通常是最不透明的。
- 在第 2 节中,我们回顾了之前在这方面的工作,特别是石灰包
- 在第 3 节中,我们详细介绍了我们的解释生成算法,并对其通用性和可扩展性进行了评论
在第二部分的中,我们将提供这里提出的算法的链接实际代码实现,与 LIME 进行并排比较,并查看一个示例应用。去那里,如果你想看我们的算法在行动。
1.高级机器学习模型及其解释力(或缺乏解释力)
Not understanding the predictions of a machine-learning model.
机器学习模型经常因缺乏透明度而受到批评。除了最简单的模型架构(即线性/逻辑回归)之外,所有模型架构都实现了相当复杂的非线性预测函数,这些函数以难以可视化和解释的方式组合了所有可用的特征以及它们之间的相互作用。因此,例如,问题为什么您的模型拒绝向客户 X 提供信贷?如果预测是由随机森林、增强森林或神经网络产生的,则不能令人满意地回答。
正如其他人之前指出的那样,能够理解模型产生的预测背后的原因对于在使用模型结果的人和最终将受这些结果影响的人之间建立信任是很重要的。
高级 ML 模型的黑箱性质导致了至少两个不良后果:
- 在某些情况下,单个预测解释至关重要(下文将详细介绍),数据科学家已经恢复到最简单的模型架构,代价是显著影响预测准确性。
- 公众和监管机构对先进的机器学习模型做出了反应,例如《通用数据保护条例》( GDPR)的算法公平性条款即将在欧洲成为法律。
一个天真的数据科学家会说,只要分类器达到非常高的准确度或其他一些性能指标,为什么预测是什么并不重要。在许多情况下,这是不正确的。有些情况下,我们必须根据具体情况决定最佳的行动方案。例如,想想客户流失或贷款回收。通常情况下,给定案例的最佳行动方案取决于哪些变量对该特定案例的预测影响最大。因此,能够计算出这些变量是什么,并量化它们中的每一个影响所述预测的程度变得至关重要。
2.以前的工作
对于某些架构,尤其是随机森林,有一些众所周知的方法可以得出输入变量重要性的全局度量。术语全局意在强调它们为每个变量产生一个单一的重要性度量,并通过聚合所有训练案例来实现。这是不令人满意的,因为在大多数情况下,重要的决策变量取决于被检查的特定情况。因此,我们真正需要的是局部的,或者更好的是,不同重要性的逐案衡量。
从这里开始,我们将使用术语解释 的精确意义:给定一组求值实例 x [ i ] ,i = 0,1,… ,以及一个二元分类器 C , 给每个实例分配一个属于正类的概率p[I]= C(x[I),对于那个预测的一个解释是维数为 f、的实数数组 e ,其中f* 在符号中,*
Eq. 1 : Explanation as a function of a model and a case.
在这个数组中,第 j-* 个分量被解释为第 j 个特征对概率pI的重要性或贡献的度量。 由此可见,一个解释是两个事物的函数;用于生成预测的分类器和应用该分类器的实例。*
这种形式很容易扩展到 k 级分类的情况。在这种情况下,解释是维数为 k -by- p 的矩阵,其中第l-第行 ui 被解释为实例属于类 l. 的概率的每个特征的贡献
在这方面已经有了重要的贡献。也许最引人注目和最著名的是石灰包 ( 视频,论文),它可以用来为任何分类器的预测产生解释。* LIME 代表LlocalIinterpretableMmodel-agnosticE解释。它通过为要解释的每个实例 x [ i 生成局部线性 ML 模型,并将该模型的特征重要性转换为对上述形式的解释,来实现模型不可知论。生成该局部线性模型的方式是,首先生成围绕 x [ i ]的邻域的 M (数百个数量级)个样本,评估每个样本上的分类器,然后在由此生成的 M 预测上拟合模型。*
这种方法的明显优点是它适用于任何模型。但是这种通用性是以巨大的计算成本为代价的。也就是说,为所有评估实例产生解释所需的操作数量比分类器预测的简单计算所需的操作数量大 M 倍。
在接下来的部分中,我们将解决这个缺点,并提出一个简单有效的算法来为基于树的分类器产生解释。
LIME 的作者声称为每个例子生成的本地模型在某种意义上是忠实的。然而,your truly不清楚这在基于树的模型的情况下意味着什么,基于树的模型产生分段常数分类函数。在这类模型中,任何足够局部的模型必然会错过决策函数对任何独立变量的依赖性。另一方面,任何考虑到一个点的邻居落在一些树的不同分支内的模型都有不够局部而不可靠的危险。
3.为单树预测产生解释的简单算法
首先,让我们考虑一个简单的二叉分类树 T 的情况,它已经在一组例子上被训练过了。设 t 表示该树中的节点总数,索引从 0 到 t -1,0 对应树的根。一个关键的事实是,在这个树的每个节点上都有一个单一特征,向左或向右的决定是基于这个特征。因此我们有相应的特征{ f [0], f [1],…, f [ t - 1]},每一个都是集合{0,1,…, f-1 }中的一个简单索引
给定一个要评估和解释的实例 x [ i ,进行预测的方法是沿着以叶子结束的节点路径遍历树。
An example three for a problem with three features X, Y, Z. Each leave has a corresponding empirical probability, computed at training time, that an example that “falls” in it belongs to the positive class.
当然,确切的路径取决于给定实例的特征值。让这条路径由它所经过的节点的索引序列来描述:
现在,对于任何节点 n,让我们定义p[n]as 训练集中的一个实例属于正类的经验概率,假设该实例的路径经过节点 n 。
The same three now with (conditional) probabilities defined at every node.
注意,使用上面的符号,树对 x [ i ]在正类中的概率的估计由下式给出
另一方面,p[0】—回忆 0 表示树的根——对应于 x [ i 属于正类的无条件概率。
沿着 x [ i ]在树中的路径,我们可以将其概率估计分解为 p[0]和一系列概率增量的和
Eq. 3 Decomposing the probability of x[i] belonging to the positive class as a sum of p[0] and an increment for each edge in the path
For each edge connecting two nodes of the three, we define a delta of probability as the difference between the probability of the deeper node and that of the shallower node.
请注意, s -th 概率增量对应于从节点n[s-1到节点 n [ s ]的路径段,因此,c 可归因于在 n[*s-1处使用的特征来决定***
基于这一观察,我们可以如下定义解释数组:
解释数组的第 j 个分量,对于{0,1,... p-1 }中的 j,作为归因于来自先前总和的特征 j 的概率增量的总和而获得。在符号中,
Eq. 4 The contribution to the probability for feature j comes from all deltas for which the first node’s feature is feature j.
注意,因为这个定义和等式。3 以上,我们有以下漂亮的身份
Eq. 5. This shows that the sum of explanation bits from each of the feature’s, together with p[0] adds up to s” the predicted probability, and fully explains it.
Tallying up explanation components for each of the variables, for a simple case in which each variable appears only once
3.1 对树集成分类器的扩展
敏锐的读者在这一点上肯定已经意识到,上面给出的解释数组的定义自然地扩展到任何分类器,该分类器产生作为各个树预测的线性组合的预测。假设给我们这样一个分类器 C ,由 A 树、 T [0】、 T [1】、…、 T [ A -1】,对应的权重 w [0】、 w [1]、…、 w [ A -1
然后,解释数组可以被计算为针对每个单独的树计算的解释数组的加权和:
3.2 关于复杂性和可伸缩性的说明
假设条件概率 p [ n ]是可用的,计算解释数组 e [ j ]、for j in 0、…、f、、for 任意给定实例、x[I]的所有组件的成本通过等式。4 仅仅是 O(n_c)(回想一下 n_c 是树中路径的长度),因为它足以对 x [ i ]进行一次遍历,并在此过程中更新 e 的适当组件。因此,计算实例的解释数组与计算该实例的预测具有本质上相同的复杂性。**
顺便提一下,scikit-learn 树估计过程以及 Spark 2.2 ml 决策树库实现都在估计的树中生成并保存这些 p 的值。】。
如果它们不可用,计算它们的成本基本上与计算所有训练样本的预测的成本相同,同时在每棵树的每个节点更新两个计数器变量,一个用于实例总数,另一个用于属于路径经过该节点的正类的实例数。
在第二部分中,我们将提供此处给出的算法的实际代码实现的链接,与 LIME 进行并排比较,并查看一个示例应用。去那里,如果你想看我们的算法在行动。
为什么你的模型预测到了?(第 2 部分,共 2 部分)
原文:https://towardsdatascience.com/why-did-your-model-predict-that-part-2-of-2-48e3d50e1daf?source=collection_archive---------8-----------------------
这篇文章的第一部分,请点击这里。在那里,我们激发了对分类器预测解释的需求,提到了以前的工作(LIME 包)并详细描述了我们的算法。
Not understanding the predictions of a machine-learning model.
这个帖子会比较短。有四个部分。
- 在第 1 节中,我们给出了代码实现的链接
- 在第 2 节中,我们将我们的算法特性与 LIME 的进行了并排比较
- 在第 3 节,中,我们用一个教学例子来说明我们算法的使用。
- 在第 4 节中,我们展示了我们的结论。
1.代码实现
我们以非常短的 Python 模块tcxp(tREE-cclassifier eXPlanation)的形式实现了上述方法,该模块依赖于决策树分类器和随机森林的 scikit-learn 实现。代码可以在羽西环球的公开共享数据分析库这里找到。
提供的 Python 代码仅用于说明和教学目的,因为它肯定不是可能的最佳实现。它包含一对嵌套循环:一个在实例 x[ i 上,另一个在给定树中这些实例所遵循的路径的节点上。后一个循环可以通过使用 np.take 和 np.diff 进行矢量化来完成。此外,整个过程可以很容易地移植到 Cython,以产生真正优化的版本。
我们还制作了代码的 Spark 2.2 实现,依赖于 Spark 自己的 ML 库(spark-ml),可以在这里找到。
2.与石灰的对比
下表总结了与 LIME 相比,我们的解释生成算法及其实现的一些关键特性。每一项的详细信息包含在第一部分的第 3 节中。
3.一个例子
让我们通过一个例子来说明 Python 模块的用法。
我们考虑 Kaggle 的经典泰坦尼克号:灾难中的机器学习二进制分类任务。在这项任务中,我们得到了一个由 891 条记录组成的训练集,每条记录都包含泰坦尼克号上一名乘客的信息。这些字段包括性别、年龄、乘客级别、支付的票价、与乘客同行的兄弟姐妹和父母的数量以及他们上船的港口。除此之外,还有一个“幸存”二进制列,告诉我们哪些乘客在沉船事件中幸存。该任务的目标是训练一个监督模型,根据给定的乘客变量尽可能好地预测该类别。
下面的代码从 scikit-learn 导入了必要的类来训练一个随机森林分类器,以及从我们开发的 tcxp 模块中导入了 rf_explain 函数。
最后一行执行训练数据的少量预处理。结果如下所示。
A sample of train_df
现在可以用几行代码训练一个随机森林:
最后一行计算的准确度是 85%。对几行工作来说还不错。然而,这并不是我们所寻求的最高精度。我们想直观地了解为什么模型会做出预测。
这是通过对 rf_explain_function 的一个函数调用来完成的
这个调用返回(1),一个 891 乘 9(特征的数量)的矩阵,包含解释数组作为行,以及(2),p[0]概率,它是一个乘客在没有考虑他们的任何特征的情况下在泰坦尼克号事件中幸存的先验概率。
现在让我们来看看几位乘客,看看他们的预测和解释是否
乘客 1 (上表第二排)预计有 0.963 的生还概率,事实上她幸存了下来。解释数组如下:tc_exps[1,:]=[0.11 0.01 0.02-0.01 0.11 0.00 0.28 0.03 0.02],不过最好在一个图中看到:
这名乘客幸存下来并不令人惊讶,因为头等舱的女性乘客生还的可能性非常高。解释数组将这些特征与票价(与 Pclass 高度相关)一起显示为预测的最具决定性的特征。
14 号乘客(上表中倒数第二排)没有成功,我们的模型正确预测了相对较低的生存概率。要解释为什么,我们来看看解释情节:
在这种情况下,她乘坐三等舱旅行的事实对她的生存机会产生了负面影响。
一个更有趣的案例由乘客 305 (上表最后一行)、提出,他幸存了下来,尽管他是男性:
我们看到,他乘坐的航班,但主要是他的年龄,以及他与父母和兄弟姐妹一起旅行的事实,导致他的生存概率为 67.7%。
结论
正如最后一节所示,我们的树分类器解释方法很可能产生合理的解释,并阐明否则黑盒 ML 架构的预测。这种方法和其他更通用的方法(如 LIME)一起,产生了一些希望,希望有一天这些高级算法可以摆脱目前的坏名声。与任何其他解释方法一样,我们的方法为从这种模型的预测中得出的更聪明的指令性行动开辟了道路。
为什么我称自己为数据科学家?
原文:https://towardsdatascience.com/why-do-i-call-myself-a-data-scientist-d50649ddd6fe?source=collection_archive---------1-----------------------
被称为“21 世纪最性感的工作”在这里,我将讨论我成为数据科学家的原因,而不是炒作。
一首阅读时喜欢的歌(由宣言者创作,这个词我在这里会经常用到):
数据科学,你知道现在每个人都在谈论的事情,几乎每个人都想马上做。将数据科学定义为一个整体或主题并不容易,我在其他文章中已经做过:
[## 用数据科学创造智能
在这篇文章中,我将展示数据科学如何让我们通过人工智能创造智能。
towardsdatascience.com](/creating-intelligence-with-data-science-2fb9f697fc79)
但在这里我想谈谈我为什么自称“数据科学家”。
开始
你可能知道,也许你在这里或 LinkedIn 或其他地方关注我,我称自己为数据科学家。但是为什么呢?我是怎么成为数据科学家的?为什么在学习了物理和计算机工程之后,我突然成为了这个领域的一员?
这些是你们很多人可能会问的关于别人或自己的问题。你为什么是数据科学家?
这里的问题是,我没有在“正式学校”学习过这个,所以我为什么有权利称自己为数据科学家?
如果你想一想,我们习惯于遵循这样的路径,如果你从数学这样的特定领域毕业,那么你有权利称自己为数学家,但是当一个新领域正在发展,而你是这一发展的一部分,并且没有特定的学士或研究生学位来成为这一领域的一部分时,会发生什么呢?
那么你必须宣称自己是这个领域的一部分。这就是我所做的。
我的宣言
对很多人来说,这听起来可能很奇怪,但是自我宣告并没有那么疯狂。在解释我的故事之前,我先举几个例子。
1600-1800 年的物理学
我不会用一千多字的物理学或科学史来烦你,我只想给你讲一个小故事。一两段,我保证。
在笛卡尔对知识和真理进行了重要的区分之后,我们可以标志着我们所知道的科学的开始。但是旧时代的科学家并不称自己为支持他们的“科学家”。如果你看到牛顿的原理:
他提到他谈论自然哲学。不是物理。事实上,这是物理学的名称。虽然科学的概念是在牛顿的时代,他认为自己更像一个哲学家而不是科学家。自然的哲学家。
所以,牛顿,历史上最重要的物理学家之一,没有在正式的学校学习物理,他实际上学习了数学,哲学等等。但我们也称他为物理学家。我不相信他自称为物理学家,我们那样做是为了他,但归根结底是我们认为他是什么。
拉康精神分析
我不太谈论的一件事是我对拉康精神分析的热情。我现在不会给你一个完整的描述,只是举一个和我想表达的观点相关的例子。
拉康在他 1967 年 10 月 9 日关于该学派精神分析学家的建议中,以及在他的一些论文中,从根本上解放了机构授权的束腰的分析实践,这是对说教者的“等级”和对显圣谱系的“保证”的死刑。
当同样的“拉康主义者”开始从他们自己的制度正统中为自己辩护,认为有必要以这种方式限制这种方法时,其影响的幅度就变得明显了。
在这篇文章中,他说:
"当你看到一个人时,你会觉得他是一个被分析的权威. "
这意味着:
“只有分析师,也就是说,不是任何人,只被他自己授权”
这可能有点激进,但他是在说,授权某人做分析师的唯一方式是授权来自于他自己。这有很多含义,但这里的要点是,如果你能够遵循 pah 并获得足够的知识,你就可以宣称自己是分析师。
回到数据科学
所以你可以看到,宣称自己是某个研究领域的一部分并不疯狂。但是我们应该小心。
我并不是说,如果你读了一本医学书籍,你就可以宣称自己是一名医学博士,或者如果你知道如何计算一个函数的导数,你就可以称自己为数学家。
我们需要拥有一些知识和能力,以便能够宣扬我们自己。通常情况下,我们会在某个领域接受 4-5 年的教育,通过测试和系统的知识途径,但有一种方法可以在不上大学的情况下成为某些领域的一部分。
我就是这么做的。我研究了很多关于数据科学(实际上,当我开始学习所有这些把我带到这个领域的东西时,我不知道什么是数据科学)、机器学习、深度学习、编程等等。从课程,自学,项目,然后我从我的数据相关的工作中学到了很多。
如果你想更多地了解我自己,你可以看看这些:
[## 如何获得一份数据科学家的工作?
大家好。这篇博客文章来自我最近在 LinkedIn 发表的三篇文章。这是第一部分、第二部分和第三部分。
towardsdatascience.com](/how-to-get-a-job-as-a-data-scientist-f417078fe13e) [## 我的深度学习之旅
在这篇文章中,我将分享我如何研究深度学习并使用它来解决数据科学问题。这是一个…
towardsdatascience.com](/my-journey-into-deep-learning-c66e6ef2a317)
在获得所有的自学和知识后,我宣布自己是一名数据科学家。但是为什么呢?为什么不说我在做数据的东西?
我认为,如果我们想让这个领域成为一个严肃的领域,我们需要有一些标准,以及一种称呼自己的方式。在其他文章中定义了数据科学之后,我们应该定义“数据科学家”,我现在就来定义:
数据科学家是一个人(还是系统?)负责 分析业务/组织问题 并给出一个 结构化的解决方案 由 开始将 这个 问题 转化为 有效且完整的问题 ,然后运用科学的方法, 编程计算工具 开发 代码 说明 准备清理分析数据**
如果你对我的定义有任何意见,请告诉我。我说那里也有系统,因为我们不知道未来会发生什么,也许我们会自动化,我不知道。
此外,我说的是科学方法,因为我认为我们应该把数据科学视为一门现代科学。我很乐意和你讨论这个,联系我。你可以在这里收听和阅读更多相关内容:
** [## SDS 187:数据科学如何成为一门科学
基里尔·叶列缅科:这是第 187 集,由 OXXO 的首席数据科学家法维奥·瓦兹奎主持。基里尔·叶列缅科…
www.superdatascience.com](https://www.superdatascience.com/data-science-becoming-a-science/)
最后的想法
数据科学是很棒的,如果你想成为其中的一员,你必须努力不懈地工作。有很多东西要学,我每天都在学习,我想我永远不会停止学习。
如果你想称自己为数据科学家,那就负责任地去做吧。
数据科学需要我之前强调过的几个领域的专业技能和知识水平。
你需要了解数学、统计学、统计学习、机器学习,现在可能还需要深度学习、编程(用几种语言),对你工作的业务有一些见解,能够遵循提取、分析和探索数据的严格方法,创建学习算法和模型,能够向不同的受众解释你的结果等等。
听起来很难,但是可以做到。在进入这个领域之前,确定你想要那种责任。
你每天要做的事情会对你的组织产生巨大的影响,所以你最好把它做好。你必须准备好失败,一次又一次的失败。要有开放的心态,要能够批评自己和自己的想法。
我不打算撒谎,如果你能做到这一点甚至更多,成为一名数据科学家,那会很有趣。**
感谢你阅读这篇文章。我希望你在这里找到了一些有趣的东西:)如果你有问题,请在 Twitter 上关注我:
** [## 法维奥·巴斯克斯(@法维奥·巴斯克斯)|推特
Favio Vázquez 的最新推文(@FavioVaz)。数据科学家。物理学家和计算工程师。我有一个…
twitter.com](https://twitter.com/faviovaz)
和 LinkedIn:
[## Favio Vázquez —首席数据科学家— OXXO | LinkedIn
查看 Favio Vázquez 在世界上最大的职业社区 LinkedIn 上的个人资料。Favio 有 16 个工作列在他们的…
linkedin.com](http://linkedin.com/in/faviovazquez/)
很快再聊;)**
我为什么要写数据科学?
原文:https://towardsdatascience.com/why-do-i-write-about-data-science-4423e08db7ab?source=collection_archive---------11-----------------------
以及写作对我的数据科学生涯有何帮助
但我当初为什么要费心去写呢?
我喜欢写作。激情。
如果你一直在关注我的文章,你可能会注意到这个词:激情——以这样或那样的方式——出现在大多数文章中。是的,这听起来很老套,以至于人们经常只是谈论他们的激情——而我会按照我的行动。这就是为什么我现在仍然在一个下雨的星期天早上 7 点写作。
从我年轻的时候起,我就一直遵循传统的科学学术路线,其中非常强调技术技能。不幸的是,写作不是重点。我觉得少了点什么。
最好的交流方式是说话。第二个最好的方法是写作。
我相信,如果没有交流来给别人带来价值,我们的发现和想法只会停滞不前,对我们自己毫无意义。这也是我从中学开始写作的原因。
但是,我现在可以告诉你,写作最难的是 开始写 。一旦你克服了 的激活能,开始写 ,心流就会自然而然地进来。相信我。
写作的过程和文字的力量总是让我惊叹不已。
写作的过程。很多时候,我喜欢用文字表达我的想法,并与他人分享我的观点。把我的想法用语言表达出来并不容易,因为我需要让我的猴子心态平静下来,处于一种平静平和的心态。你猜怎么着?其实这是我最喜欢的部分。我享受这种平静,这种流动,这种思考过程真正质疑我的理解,并在与世界分享之前仔细检查我拥有的每一点信息。这里清晰很重要。
文字的力量。你永远不会知道你的话会如何影响他人。人们有他们自己的观点,你的文章可以在完全不同的层面上引起不同人的共鸣。我第一次意识到文字的力量是在读彼得·巴菲特写的书《生活是由你决定的》。我完全被这些文字所承载的丰富情感和意义所鼓舞和激励,甚至没有看到作者说话。
真实性是关键
现在,我希望通过写作来分享我的想法,希望可以分享我在数据科学方面的学习经验,并激励和激励更多的人,无论他们的背景和职业选择如何。
为什么我要写数据科学
(Source)
数据科学领域还很年轻。因此,在写作和数据科学的甜蜜交汇处,我自然而然地想到了关于数据科学的写作。
嗯,原因不止这些。
1.帮助和指导有抱负的数据科学家和爱好者
实际上,我是从零开始从事数据科学的。
一开始,作为一个自主学习的人,我忘记了我遇到的挑战、障碍和挫折。即使对于一个有抱负的数据科学家来说,谷歌搜索:如何成为一名数据科学家,你也可能会被大量的资源淹没,其中每一个都声称是有史以来最伟大的指南之一。但是谁知道呢?
Google Search: How to Become a Data Scientist
沮丧。我理解你,我真的理解。这对我来说是毁灭性的,我仍然收到许多关于如何成为数据科学家(或一般的数据专业人员)的消息。
考虑到这一点,我决定通过写作和与大家分享来记录我的数据科学之旅(如果不是全部的话)。
我不会说我的文章涵盖了在数据科学领域取得成功的所有必备技能。尽管如此,我希望通过分享我对数据和当前工作前景的理解和知识,你在数据科学方面的旅程可以少一些坎坷,希望更愉快,更快地达到你的目标。
在他的一篇文章中,引用了基里尔·叶列缅科的一段话:
作为数据科学家,我们与其他所有人分享对数据的理解和知识非常重要,因为他们很可能不知道。他们应该知道。
— 基里尔·叶列缅科
2.提高沟通技巧
你可能在我的一些文章中看到过这两个元素— 我在实际工作经验中从数据科学中学到的 5 个教训和用数据讲故事。如果现在还不明显的话,沟通技巧和讲故事是如此重要,我怎么强调都不为过。
不要误解我。我并不是说技术方面不太重要,而是我们需要如何更好地交流结果才能真正产生影响。
就我个人而言,我完全同意 William Koehrsen 在他的文章中所写的内容——数据科学项目最重要的部分是写博客:
写博客可以让你在数据科学最重要的部分之一得到实践:向广大读者传达你的工作。写得好的代码和透彻的分析是一个好的开始,但是要完成你的项目,你需要把它和一个令人信服的叙述联系起来。一篇文章是解释你的结果并让人们关心你所有努力的完美媒介。
— 威廉·科尔森
因此,写作真的有助于巩固代码的技术方面,并通过引人注目的故事来更好地交流。我不仅分享我学到的东西,也从别人分享的东西中学习。威廉·科尔森是我在媒体上发现的最好的数据科学传播者。他将复杂的想法和代码分解成简单却引人入胜的故事和概念的能力是如此鼓舞人心和迷人。特别感谢 William Koehrsen 对数据科学社区的贡献!😄
写作对我的数据科学职业生涯有何帮助
(Source)
机遇。
我希望几年前就知道建立有价值的关系网的重要性。信不信由你,通过写作,你的文章在不同的社交媒体平台(媒体、LinkedIn、脸书、Instagram 等)上被分享和发布。)有可能在几秒钟内接触到成千上万的人。
互联网的力量是无与伦比的,因为每个人都被放在这个公平的竞技场上,向世界展示他们的能力。
许多人在没有首先了解他们的数据和公司业务的情况下,试图将数据提供给一些花哨的模型;有些人了解他们的数据和公司的业务,但不能够向利益相关者传达结果;很少有人了解他们的数据和公司的业务,并且仍然能够向利益相关者和更广泛的受众传达结果。
通过写作,我不断学习如何向不同的利益相关者和广泛的受众传达结果并提供可操作的见解。到目前为止,收益是巨大的,还有很多东西需要学习!事实上,撰写关于数据科学的文章向人们展示了你对它的真正热情,并关心教育和分享给他人。
机会是留给有准备的人的。做好准备仅仅意味着与你正在做的事情保持一致——在这种情况下是写。
我今年开始写作,并与潜在雇主、一些项目的合作者、编辑、许多热情的数据专业人士和有抱负的数据科学家建立了有价值的联系和关系,甚至促成了演讲参与!
最后的想法
(Source)
感谢您的阅读。希望这篇文章能阐明我写数据科学的动机。如果您也是数据空间的作者,请随时联系我进行合作(或其他任何原因)😊)!
如果你正准备开始写作(数据科学或其他话题,无所谓),记住写作最难的是 入门。为了克服它,通过在一张纸上写下你的想法,并从那里开始重组和发展你的想法,来减少你的激活能量和最小化拖延。
马克·扎克伯格在哈佛毕业典礼上的演讲中引用了一句名言:
想法不会完全成形。它们只有在你处理它们的时候才会变得清晰。你只需要开始。
一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。在那之前,下一篇文章再见!😄
关于作者
Admond Lee 现在的使命是让每个人都能接触到数据科学。他正在帮助公司和数字营销机构通过创新的数据驱动方法,利用可操作的见解实现营销投资回报。
凭借其在高级社会分析和机器学习方面的专业知识,Admond 旨在弥合数字营销和数据科学之间的差距。
如果你想了解更多关于 Admond 的故事、数据科学服务以及他如何在营销领域帮助你,请查看他的 网站 。
你可以在 LinkedIn 、 Medium 、 Twitter 、脸书上和他联系。
[## 阿德蒙德·李
让每个人都能接触到数据科学。Admond 正在通过先进的社交分析和机器学习,利用可操作的见解帮助公司和数字营销机构实现营销投资回报。
www.admondlee.com](https://www.admondlee.com/)
为什么要这么做?
原文:https://towardsdatascience.com/why-do-this-4f2adcc646a1?source=collection_archive---------5-----------------------
做什么?写作。 那又怎样?
准反市场动机
严格来说,我是个摄影师。2016 年 4 月,我开始在线学习一门名为数据科学基础的课程。在这里,我学会了收集、可视化和分析数据。决定选修这门课是几个月来对算法进行独立研究的结果,这些算法积极地塑造了我们日常生活的许多方面。
Technically, I take pictures like this for a living. (Kate Spade Valentine’s Day Gift Guide, campaign 2017)
我们日常生活的哪些部分?Instagram &脸书的新闻、内容和图片。还包括将我点击到亚马逊的广告,以及网飞或 Spotify 的内容“监管”。我很不满意不知道这些大公司是如何向我提供内容的——关于意识到我对这些近乎垄断的公司的依赖,以及它们如何有能力塑造我的日常情绪和前景。
Customers who bought this, also bought that: Association Rule Mining a darknet market listings database, from my first (unfinished) R project. Looks like spaghetti, but glad to get a feel for some of the workings behind Amazon’s recommendation engine. Dataset source: gwern.net
快进——一年后,我在 R 语言中已经有足够的流畅性来收集数据、可视化数据并执行一些基本的分析。我仍然需要查找置信区间并检查我的正则表达式(并发现更多的 ggplot 统计和几何)。但是,当异常值变得难以控制时,我觉得可以在普通最小二乘法上执行稳健回归,或者当变量数量变得无法控制时,切换到随机森林。有一天我甚至可能会用到贝叶斯方法。
好吧,但是“为什么?”
因此,经过一年的稳步训练,我在统计分析中尽可能做到客观——我意识到没人在乎。相关性?因果关系?异常?'那又怎样?'我发现这个问题变得更难回答了。
我发现大多数艺术学校的同龄人并不真正喜欢数学;光是这个想法就能让他们中的一些人感到厌恶。我会在另一个咆哮中指责教育方法。也许不喜欢自己不了解的东西是很自然的。不过,对这类事情感到好奇似乎更有趣。
An early foray into explaining the obvious: charting darknet market sizes after the demise of Silk Road 2. Data originally from gwern.net
那么,为什么呢?“那又怎么样?”
如果问题是“那又怎样?”,那么学习写作似乎是一条通往答案的道路。以及将 InDesign 拉入 vis 工作流(todo:学习 Illustrator)。我敢打赌,我可以找到至少 10 篇文章,引用来自数据科学世界的写作和交流的重要性。我打赌这些文章也存在于其他科学领域和自助手册中。我可以多读 10 篇这样的文章,或者点击这一篇,所以——
希望这是题目中问题的部分答案。
😃
笔记
我早该知道的——我一直试图回答“那又怎样?”多年来。遍及各个领域,这是一个很大的问题。
为什么我们如此关心可解释的算法?为黑盒辩护
原文:https://towardsdatascience.com/why-do-we-care-so-much-about-explainable-algorithms-in-defense-of-the-black-box-d9e3bc01e0dc?source=collection_archive---------6-----------------------
请记住,最暗的黑色盒子是你两耳之间的粉红色糊状盒子
算法开始在各种领域的高风险应用中使用。包括给罪犯判刑,开医疗处方,雇佣员工。为了应对这种向人工智能驱动的决策的转变,许多墨水已经洒了出来和许多人对机器学习算法的“黑箱”问题感到惊愕。许多记者和评论家深思熟虑地指出了算法歧视少数群体的潜力,载入了不应影响后续决策的虚假变量,并使用了任何人都无法合理化的难以理解的复杂逻辑。
[## 人工智能有一个很大的问题:即使是它的创造者也无法解释它是如何工作的
去年,一辆奇怪的自动驾驶汽车被投放到新泽西州蒙茅斯县安静的道路上。的…
www.technologyreview.com](https://www.technologyreview.com/s/604087/the-dark-secret-at-the-heart-of-ai/)
在许多情况下,这些担忧是有根据的,算法的实现应该非常谨慎。然而,当我们继续为机器学习算法寻找新的应用时,我们不应该让这种对算法可解释性的关注蒙蔽了我们对这个世界的一个残酷事实的认识:人类的决定往往是反复无常的,不合理的,并不比最不透明的算法更可解释。
背景很重要
为了这个讨论的目的,将算法的应用分成两类是有用的:一类是当算法被用来自动化当前由人类做出的决策时;另一类是应用程序,其中算法被用来取代基于规则的过程。基于规则的流程是指使用一组简单且易于衡量的标准来做出决策的流程。基于规则的过程之所以伟大,正是因为它们是如此的可审查。当然,规则本身可能并不伟大(如在许多强制性判决法规中),但至少基于规则的程序已经清楚地阐明了可以与其他提案进行辩论和评估的标准。
“可解释性”在第二类应用中的价值是非常明显的。从基于规则的世界转向由随机森林和神经网络组成的黑箱世界,可以理解会让政策制定者迷失方向。如果一所大学过去使用简单的 SAT 和 GPA 作为录取决定的截止点,那么用一个经过数十种特征训练的深度神经网络来取代这一过程,显然会提出一些具体的问题,即 SAT 分数和 GPA 如何影响算法的录取决定。
然而,我不认为第一类应用需要同样的可解释性标准——当算法被用来代替纯粹的人类决策时。正如我在别处提到的(其他研究人员也强调了),评估算法对它们所取代的系统的效用是很重要的。这就是为什么两种类型的应用程序之间的区别——那些取代人类的应用程序和那些取代规则的应用程序——很重要。当我们特别关注算法取代人类的应用时,很明显,可解释性是一个站不住脚的双重标准。
[## 是机器有偏见还是我们对机器有偏见?
towardsdatascience.com](/are-machines-biased-or-are-we-biased-against-machines-17982310152b)
可以预见,人类是不理性的
虽然机器学习和算法决策的最新进展是最近才发生的,但人脑已经存在很长时间了。关于算法如何做出决策的新研究层出不穷,但研究人员已经花了几十年(如果不是几千年的话!)来研究人脑是如何做决定的。这项研究最具可复制性和一致性的发现之一是,在几乎所有可以想象的环境中,外部因素都会影响人类的决策。
一个简单的例子就是心理学家所说的“锚定效应”。为了证明人类是多么容易受到无关信息的影响,请考虑 Ariely,Lowenstein 和 Prelec (2003 年)的经典研究:研究人员要求学生写下他们的社会安全号码的最后两位数,并表明他们是否愿意为一盒巧克力支付该金额。为了引出学生们对巧克力的真实估价,他们让学生们在强制拍卖中对盒子出价。虽然你和我都应该清楚,你的 SSN 的最后两位数字(本质上是一个随机数)与你对一盒巧克力的价值没有关系,但研究人员发现,SSN 数字与学生的实际支付意愿之间存在显著的相关性。此外,尽管有相反的统计证据,绝大多数学生坚持认为他们的 SSN 数字对他们的投标没有影响。
另一个广泛宣传的影响人类决策的不相关因素的例子是“饥饿法官”研究。研究结果表明,法官更有可能在午休后(当他们吃饱时)而不是午休前(当他们血糖低时)给予被告有利的假释决定。
Judges become less favorable as their shift wears on (Danzinger et al., 2011)
也许你对这些特殊的例子有些疑虑:它们感觉太做作,赌注不够高,样本量不够大,或者混杂变量没有得到充分的控制。(有效的批评确实存在;例如参见【1】【2】。)我们非常欢迎你忽略这些研究,但有数百个经过充分研究的重大认知偏差的例子。事实上,行为经济学家理查德·塞勒最近获得了诺贝尔奖,很大程度上是因为他职业生涯中的工作证明了这些认知偏差即使在具有重大后果的高风险情况下也依然存在。你不能忽视的是大量关于判断和决策的研究得出的压倒性结论:人类总是让外部因素影响他们的决定。
[## 判断和决策中的启发法-维基百科
认知科学家司马贺最初提出,人类的判断受到可用信息的限制…
en.wikipedia.org](https://en.wikipedia.org/wiki/Heuristics_in_judgment_and_decision-making)
至少我们可以解释自己…对吗?
虽然认知偏见本身是有害的,但更糟糕的是,当你要求人们解释他们的决定时,他们往往不知道为什么会这样做。正如 Ariely 的学生坚持认为他们的社会安全号码不会影响他们对巧克力盒子的感知,我们经常甚至没有意识到偏见是如何进入我们的思维过程的。此外,即使我们确实为某个特定的决定提供了看似合理的理由,也有充分的证据表明这些理由往往只是虚构的。
尼斯贝特和威尔逊(1977)所著的《告诉我们更多我们所不知道的事情】》是一篇证明这些效应的经典论文。我强烈建议阅读整篇论文,以充分理解人类凭空得出似乎合理的合理化是多么荒谬,但我将让他们的摘要中的一个简单总结来说明这一点:
证据审查表明,可能很少或没有直接内省访问更高层次的认知过程。受试者有时(a)不知道对反应有重要影响的刺激的存在,(b)不知道反应的存在,以及(c)不知道刺激影响了反应。
这是一种花哨的学术说法,意思是人们通常不知道他们为什么做出一个特定的决定,即使研究人员可以从统计上证明有外部因素参与。
算法毕竟没有那么糟糕
当我们正确评估使用算法来自动化人类决策时——通过记住我们自己的认知偏差的普遍性和可预测性——相比之下,它们实际上开始看起来相当有利。至少用一个算法会在它移动的开始和结束时给你相同的答案。算法也没有任何社会声誉或自我来维护。所以,当我们开始窥视他们的内心,调查他们是如何做出一个特定的决定时,他们无法用看似合理的、事后,一般般的合理化来为自己辩护。
不要误解我:我完全赞成更好地理解不透明的算法是如何做出决定的。但现在是我们停止欺骗自己,相信人类在合理化自己的决定时会变得更加透明的时候了。事实上,只有凭借算法的确定性和一致性——而不是人类的不可预测性和反复无常——我们甚至可以开始严格地询问它们的逻辑,并衡量它们随着时间的推移而得到的改善。
我们失去了理解,但我们获得了结果
对一个社会科学家或经济学家来说,可解释性绝对是最重要的:大多数科学研究的主要目标是得出一个理论,解释事物如何以及为什么会以它们的方式工作。然而,对于一个结果主义者——也就是说,一个主要关心世界上实际发生的事情的人——来说,可解释性必须退居二线。如果我们关心减少种族不公正的数量,增加所有阶层的公平机会,那么这就是我们应该用来比较人类和算法决策者的标准。
只要算法真的能减少偏见和歧视——正如他们在关于这个话题的现有研究中所显示的那样——我们就应该把可解释性放在次要位置。确保算法是可解释的无疑是一个有价值的目标——但那些坚持可解释的人必须问,这个目标是否比我们寻求改善的系统中的实际结果更有价值。
为什么我们害怕人工智能?
原文:https://towardsdatascience.com/why-do-we-fear-the-ai-2f6cffd09795?source=collection_archive---------10-----------------------
人工智能,一般的人工智能,任何被认为非人类的发明都通过虚构和创造者的历史而被恐惧…人类,但是它真的值得在我们的文化中有这样的位置吗?
我们害怕什么?
控制…
人类在其存在过程中创造的最强大的概念,也是定义他们最重要的特征之一,控制几乎涵盖了人类生活和互动的每个方面,社会,经济,管理,意识形态,神学,煽动,所有代表等级制度并与生存利益相关联的东西。自从重新编码的历史开始以来,它是一个充满魅力和理性的主题,每天每个人都以这样或那样的方式成为控制机制的一部分,从基本需求开始, 内在的感觉、情绪能量、与其他个体的互动、利益的计算,我们都非常需要它,而且它是会上瘾的有毒的。
为什么是现在?
在过去的 50 年里,特别是随着计算能力的增长,我们的计算开始超过我们的容纳能力,曾经是一次性使用的简单的奇怪机器,变得重复并更多地参与不同的任务,变得更小,更轻,我们开始把它作为手表,计算器,然后它变成个人电脑,然后我们把它放在口袋里,如果它开始时被转换成第一种形式,它将覆盖纽约的表面。一个古怪幼稚的机器,一个古怪的笑话,一个永远不会出现在我们实际生活中的无用的东西,今天变成了历史上最可怕的发明,如此可怕,以至于“关闭互联网”这个词就像上世纪冷战最好时期的传奇故事中的“红色核按钮”一样可怕。
人工智能,它不仅仅是连接的机器计算,它也是它们之间的网络,以及它如何连接并将连接数十亿个设备,这些设备开始在人类生活中产生过度的依赖性,每次一个人带着一台能够访问其他机器的机器行走,与其他人连接,并可以向那个人提供特定的远程服务,当知道这个人在技术上被定义为电子人时,这一事实不应感到惊讶。有趣的是,现在对设备的依赖正在加深,它确实影响了人类生活管理的各个方面,一个小时的互联网中断是一场灾难,即使是一个品牌的一项服务,如 Gmail 也可能引起恐慌。对人工智能的恐惧是害怕失去对这种工具的控制,这种工具开始与人类的生存和进化道路直接相关。
奇点
虽然自 I.J. Good 以来,经典的恐惧总是指向奇点,但人类通过对任何发明的使用采取更理性和集体的理解,显示出防止这种灾难的能力,奇点“能够”开始存在,只有当人类想要存在时,否则它可能会逻辑地说,由于“人类的掺杂”,这种事件不可能存在, 事实是,一个系统不能脱离一个基于其规则的初始系统,即使它是有意的,它也有一个与逻辑目的相冲突的初始点。 近奇点可以存在,是的,但永远不会是绝对的,事实上它是近绝对的,人类将一如既往地暴露于它的利弊,想象“机器”将接管人类的生活,这是一个已经发生的事实,它在人类生活中不是看不见的,媒体在“假新闻”的混乱中的事实表明了机器在多大程度上控制着信息如何到达人类,这只是一个开始。
那么真正的危险是什么?人类!
让我们以互联网为例,看看它带来的危险与所有的好处相比,真正的危险不是来自工具本身,而是对这种伟大工具的错误处理和滥用,这种工具创造了信息的巨大飞跃,在几十年内传播的知识量超过了整个人类历史的产量,危险来自于那些创建恶意软件和病毒等应用程序的个人, 人工智能可以在这个阶段超越人类的智慧,通过变得更聪明地检测这种危险并在没有人类干预的情况下自行防止它们,来防止这种破坏性事件。
问题仍然是,如果个人成为一个更有组织的团体,甚至是一个试图滥用人工智能来创造更多破坏性事件的政府,比如控制信息流动的各个方面,损害个人和社区的隐私,分配资源和资金,获得启动战争灾难场景的权限以进行某种形式的战略谈判,人类将如何获得保护?答案是:众包协作。
群众的力量为了更好的人工智能使用
在每一个群体中,总会有一种阻止与群体利益相冲突的个人议程的倾向,然而,如果这种强大的工具落入错误的人手中,这种倾向将永远不会阻止目睹这种工具被滥用的后果。
人工智能每天都在进步,我们将在下一个十年见证量子计算机的商业化,并将用于日常生活,自动化已经开始,大量投资投入其中,太空计划的商业化和私有化,行星间和先进的采矿水平,所有这些越来越需要部署一个高度先进的人工智能,以避免有限的人类智能出错。需要更强的合作来保持人工智能的安全使用,需要对不同国家之间的技术转让进行更多的监管,需要对技术转让类别的准备情况进行索引和分级,这是一个责任立场的问题,不应该成为政治正确性辩论的主题。
人类正在触及他们伟大使命的表面,“生命”本身就是一个伟大的使命,保护它毫无疑问是人类的首要使命,因为他们是生命进化的结果,为此他们必须调整他们的发明和工具来服务于生命,而不仅仅是为了生存,当他们协调并包含作为驱动力的控制的危险的那一天,他们将在一个更广阔的视角中享受生活,远远超出我们蓝点的限制。
为什么我们需要数据科学中的因果关系?
原文:https://towardsdatascience.com/why-do-we-need-causality-in-data-science-aec710da021e?source=collection_archive---------10-----------------------
偶然的因果推断
这是一系列解释为什么我们在数据科学和机器学习中需要因果推理的帖子(下一个是‘使用图表!’)。因果推理带来了一套全新的工具和视角,让我们处理老问题。
当实验不可行时
首先,设计和运行实验(通常是 A/B 测试)总是比使用因果推理技术要好:你不需要建模数据是如何产生的。如果你能做到,那就去做吧!
然而,在许多情况下这是不可能的:
- 如果你的实验是不道德的(你不能让一个孩子吸烟来测试它是否会导致癌症)
- 原因不取决于你(竞争力推出新产品,你想衡量它对你的销售的影响)
- 你有历史数据,想充分利用它。
- 从金钱或影响的角度来看,进行实验的成本太高,或者太麻烦而无法付诸实践
一点历史
因果推断的影响来源主要有三个:计算机科学、统计学和流行病学、计量经济学。对因果关系的积极研究始于 80 年代
计算机科学分支由 Judea Pearl 领导。其最初的影响可以追溯到 20 世纪 20 年代的 Sewell Wright,当时他写了关于线性函数的图形模型。这些技术不断发展,现在被称为有向无环图(DAG)方法。
统计学和流行病学中最流行的框架被称为潜在结果框架,由杰吉·内曼于 1923 年提出。这是从统计学角度发展因果推断的起点。唐纳德·鲁宾是这种方法中最著名的。
两个框架是等价的,意味着一个框架中的定理是另一个框架中的定理,一个框架中的每个假设都可以转化为另一个框架中的等价假设。差异是用法的问题。有些问题在一个框架中更容易表述,有些在另一个框架中更容易表述。杰米·罗宾(Jamie Robin)和托马斯·s·理查森(Thomas S. Richardson)研究了一个称为单一世界干预图(SWIG)的框架,该框架在这两个框架之间起着中介作用。
计量经济学中有一些关于因果关系的事实已经知道一段时间了。计量经济学家中比较流行的技术是:
- 受控回归
- 回归不连续设计
- 差异中的差异
- 固定效应回归
- 工具变量
当然,它们可以用前面的框架来表述。
哲学问题(总是在争论中)
因果关系的本质真的很难。矛盾的是,我们每天都在不断地使用它,这在很多情况下是常识,但找到一个定义来评估在现实世界中哪种情况下 A 导致 B 是非常困难的!我们都同意下雨会导致地板潮湿(我希望……我们也能找到否认下雨的人)。但是我们如何给出一个明确的定义来区分是雨还是空气导致了潮湿呢?我们怎么知道雨是主要原因,而不是另一个未观察到的变量导致雨和地板同时变湿?尽管你想思考,但在 18 世纪,大卫·休谟已经开始思考因果关系的本质,许多哲学家也写了相关的文章。
统计学界的普遍共识是,至少在不进行实验的情况下,你无法证明因果关系。当你处理观察数据(被动获得的数据,没有经过你的实验)时,你最多能期待的是谈论相关性(概率相关性)。这就造成了一种在观察数据中明确谈论因果关系是禁忌的情况。
即使在这种情况下证明因果关系是不可能的,明确地谈论因果关系还是有好处的。第一个很容易理解:作为人类,我们关于世界如何运转的大部分知识都是观察所得。你不会对所有你知道的事情做实验。在某些情况下,这甚至是不可能的:是太阳导致了日光吗?你如何做一个实验,打开和关闭太阳?在这种情况下,你可以尝试某种替代实验,并认为这验证了最初的假设,但这也不是直截了当的。与此同时,我们都同意太阳产生了日光。第二个论点是避免误导。当你分析数据时,是因为你想得出一些结论来采取进一步的行动。如果你那样想,那是因为你认为那些行为影响了一定数量的利益(因此是利益的原因)。因此,即使你谈论技术正确性的相关性,你也要以一种因果的方式使用那些洞察力。所以,如果你的目标是因果关系,你最好明确地说出来。
从哪里开始阅读
教程
- 亚当·凯勒赫的介绍系列
- 从因果角度解读线性模型:线性结构方程建模的图形工具,Bryant Chen 和 Judea Pearl
书
- "统计学中的因果推理:初级读本 " , (DAGs 框架)Pearl J .,Glymour M .和朱厄尔 N.P
- "因果推理",(潜在结果框架)Hernán M.A .和 Robins J.M
- 《大多无害的计量经济学:一个经验主义者的伴侣》,(计量经济学的观点)安格里斯特 J.D .和皮什克 j
我是谁?我是 Aleix Ruiz de Villa(http://aleixruizdevilla.net),数学分析博士,曾任一些公司的数据科学主管。我住在加泰罗尼亚的巴塞罗那,我是 badass.cat 和 bacaina.cat 的联合创始人
为什么 AI ≠ ML?考虑聊天机器人创建的例子。
原文:https://towardsdatascience.com/why-does-ai-ml-considering-the-examples-of-chatbots-creation-20b1906274f8?source=collection_archive---------4-----------------------
近年来,人工智能、机器学习和聊天机器人的会议已经将人工智能等同于机器学习,并将机器学习等同于神经网络。
过去几年围绕“机器学习”的炒作已经说服了大多数 IT 行业,即当我们找到巨大的大数据并将其交给人工智能时,人工智能就会给出自己的见解,并为不同的问题找到完美的解决方案。
为什么我们要讨论为什么 AI 不是 100%的机器学习,是因为我们想讨论我们擅长什么。我们公司,纳米科学实验室(作为 SOVA 的一部分。人工智能项目),与虚拟助手和聊天机器人的创造合作已经超过 15 年。稍后我将展示机器学习在哪里以及如何让聊天机器人受益,以及围绕它的一些神话和高期望。
我们在谈论什么聊天机器人
我们的客户是大银行、电信运营商和零售连锁店。我们为他们制作的聊天机器人是客户支持的虚拟顾问。他们的主要工作是减少联络中心的负荷。基本上,他们被放在网站上,手机应用程序中,并连接到信使,在那里他们可以与客户交谈,他们可能会对不同的产品和服务有一些问题。
聊天机器人还有其他应用(快速订购产品的按钮机器人、内部员工支持机器人、促销机器人等)。)中的每一个都执行不同的任务并具有不同的要求。这些也很有趣,但是我们改天再谈。
对于我们最大的客户,联络中心的运营成本每年高达数百万美元。一个设计良好、训练有素的聊天机器人可以为那些不停工作的操作员节省大量成本。在我们的一些案例中,聊天机器人设法承担了 50 %- 80%的所有输入请求,从而为我们的客户节省了大量资金并减少了线路负载。
作为联络中心,聊天机器人应该做几件事:
知道尽可能多的信息请求的答案(“你的费用是多少?”,“你最近的办公室在哪里?”等。),
能够识别并满足事务性请求(例如,“我的余额是多少?”),通过完成 CRM 数据库和/或计费系统中的查询,
当问题过于复杂时,能够理解,并快速、谨慎地将客户从支持或销售部门转移到现场接线员,同时保持对话的上下文。
如何准确地识别查询类型以及如何填充和更新机器人的知识库是实现的特点。
如果这项技术可以处理认知任务,例如,任务被自动化以解决客户的问题,那么它可以被称为人工智能,尽管不是好莱坞意义上的人工智能。
术语
在聊天机器人的现代“时尚”机器学习中,识别问题类型被称为意图识别,根据脚本或对话树进行对话被称为对话管理,并根据用户提示(例如,姓名、资费名称、手机号码等)分配参数。)叫做槽填充。
我们使用基于规则的方法或“正确的”方法在我们的项目中实现所有这些阶段:机器人通过可能的用户问题来学习,这些问题使用在对话框的描述语言中具有量词的模板,类似于使用正则表达式。
This is how Joseph Weizenbaum taught his ELIZA which was the first in the history of the virtual companion, and how the well-known AIML (Artificial Intelligence Mark-up Language) language was originally conceived. This was all invented in the last century, but now it’s currently the only approach to man-machine dialog in a natural language that works well and predictably. Image: Wikipedia.
有一些开放的工具可以用来构建基于规则的聊天机器人——例如 project ChatScript。但是我们创造了自己的语言——对话语言。它比 AIML 更强大、更简单、更舒适,但目前还不能用于第三方开发人员。
“正确”的方法
基于规则的聊天机器人是这样制作的:
1.问题陈述。我们与客户一起定义聊天机器人将具有的一般功能,聊天机器人应该回答哪些类型的问题(常见问题解答、网站和内部知识库通常会帮助我们)。此外,聊天机器人的身份是经过设计的(个性、风格、知识领域)。
2.创建通用模板和对话框树。数据工程师(知识库中的专家)用一种特殊的语言编写模板,这是识别可能的问题所必需的。模板可以覆盖成千上万种可能的正确语言结构。然后把它们组合成交互树,有上下文记忆,提取变量。
3.提取查询参数。在对话过程中,总是需要从用户请求中提取数据(以填充槽)。这是通过识别命名实体来决定的(命名实体识别)。
4.获取外部服务。在信息请求和事务请求中,需要调用外部服务(数据库、CRM 等)。).聊天机器人访问外部数据库,传输参数,接收信息,然后形成对用户的平滑响应。
然后是内部和外部测试,向客户介绍聊天机器人,并将其部署在我们的云中或客户的服务器上。
总的来说,似乎没有什么猫腻。但是细节决定成败。
对“正确”方法的批评
我们对基于规则的方法的主张通常是对编写模板的需求的不满。程序员、IT 主管讨厌它,就像经验法则一样。除了本能,“这是胡说八道——一切都是手工写的!”,有一句简短的话“你是认真的吗?不可能事先想到所有可能的变化——这是一项巨大的工作,产生的完整答案非常少。”
看起来是的,但是,唉,不是的。描述性对话语言的力量帮助一个模板覆盖成千上万的问题措辞变化。虽然看起来很奇怪,但编写一个丰富的模板显示出比机器学习显著更高的效率。
15 years we have been saving a massive database of templates and word databases for various industries and subject areas (banks, air transportation, retail, insurance, etc.) In general, it’s our key intellectual property that is more important than our chatbot engine and Dialogue Language.
因为我们有这样的基础,所以对于我们来说,制作一个新的聊天机器人(例如,为一家银行)或掌握一个新的主题(如零售)非常简单,总共只需要两名数据工程师额外工作 1-2 个月。
机器学习中的聊天机器人
与所描述的基于规则的方法相反,机器学习聊天机器人使用以下方案:
1.数据摄入。从客户端,我们从联络中心获得成千上万个对话的日志。
2.清理数据。(清理是什么意思?我们稍后会解释这一点)
3.马克舍耶夫。在清理后的数据中,我们标记意图:每个副本被分配到一个特定的类型
4.教导。我们将“副本+意图”数据库馈送给机器学习算法。我们向哪种算法输入数据并不重要,通常是 SVM(支持向量方法)或 DSSM(深度结构化语义模型),并对单词进行初步矢量化。
结果是我们可以按类型对输入引用进行分类。进一步假设,通过知道问题的类型,我们可以引导一个人通过相应的对话树。机器学习的爱好者当然不希望手动构建这些树。这里再次使用了意图分类器,它不再用于输入副本,而是用于辅助副本。诸如此类。
在事务性请求的正确时刻,聊天机器人使用上述实体识别来检索变量参数的值,就像基于规则的方法一样。
对 ML 方法的批评
我们公司的机器学习由 8 名员工负责。至于谈话记录,我们一直和客户保持联系。出于这个原因,我们非常清楚机器学习聊天机器人的所述实现的问题:
1.数据太少。客户通常没有对话的数据库,或者他们有,但是他们是呼叫中心的录音。这些可以用自动语音识别器打出来,但是质量非常低,需要以后做更多的工作来清理。
2.数据是敏感的。如果有数据库,客户可能无法在不违反个人数据法的情况下将其提供给我们。然后,客户端需要编辑数据库,删除任何显示客户端身份的数据。
3.数据库里的都是垃圾。如果客户确实有一个数据库,并且他们确实清理了它,那么稍后就会出现从数据库中清除特定人的特定答案的问题。例如,问题“我的电话余额是多少?”在该数据库将是一个具体的总和为每个特定的客户。来自训练样本的“25 美元”当然需要被丢弃,以便当 Peter 要求他的 2018 年 9 月余额时,他没有给 Kate 2016 年 12 月的余额。
4.该数据库没有对外部数据库的引用。为了处理事务性请求,必须有一个事务——对外部服务的访问。在对话日志中没有这些参考,只有关于凯特在 2016 年有什么平衡的答案。这种逻辑不能通过机器学习来实现,它仍然需要开发人员分析对话的日志,并将呼叫嵌入到计费、CRM 等中。聊天机器人对话框。
5.布局仍然是手动的。如果我们编辑数据库,剩下的就是意图的布局,这是一个很大的手工工作。是的,这样做的人有时比数据工程师的工资低 2-3 倍,但一般来说很难做布局,他们对做布局不是很仔细。除此之外,数据工程师通常执行少量的任务:查看对话、常见问题等的例子。,了解客户可以问什么以及如何问,然后写一个好的模板。
6.数据的根本不完全性。需要理解的是,无论多么大的对话日志集,它们从根本上来说都是不完整的。以英语为母语的人可以问一个过去没有人问过的问题——语法正确且有条理。如果请求中有 5 个单词,并且每个单词都有几个同义词,那么对于一个问题来说,可能的变化数量已经成千上万了。通常新问题的比例是每月 10%。机器人从过去的对话日志中学习,不能覆盖所有的新问题,然后犯错误。正是在这个地方,编写具有良好覆盖率和可变性的模板比“按区域”进行机器学习具有巨大的优势。
7.对话焦点不佳。识别每个阶段的“意图”与记忆答案和上下文的对话树不一样。对于高度负责的应用程序,这样的意图“猜测”是行不通的。
Image: Comicscube.Com.
我们想单独指出,机器学习系统通常是不可预测的。测试它们,尤其是完整性,是另一项复杂的工作。
也就是说,我们不能向我们的客户保证聊天机器人会以可预测的方式行动。这是一个绝对的法律要求,甚至经常由客户在合同条款中写明。
基于规则+ ML =友谊
如果有人告诉你,他们完全基于神经网络或机器学习制造了一个功能良好的聊天机器人,你要知道他们在骗你。或者说 chatbot 根本不行,或者说机器学习只占整个系统的 5%。
但是机器学习可以在以下几个方面让我们受益:
输入短语中的错别字纠正
选择单词的同义词,帮助数据工程师进行开发
对联络中心日志进行聚类,以识别频繁的请求,从而帮助数据工程师
FAQ 机器人的自动回答(有趣的技术——我们将在另一篇文章中讨论)
对信息请求的问答对的不清楚搜索
这些都是有用的应用程序,可以节省开发时间,提高聊天机器人的整体质量。
结论
这篇文章的目的是说为什么你不应该期望在聊天机器人领域从机器学习中获得快速而简单的成功
聊天机器人不能完全在机器学习中实现:机器学习是系统的一个小补充,增加了开发的效率。
聊天机器人可以而且需要基于规则的方法:这是可行的,这是一项艰巨的任务,而且它保证了质量。
人工智能不仅仅是机器学习——基于规则的聊天机器人——而且除了机器学习之外,还有专家系统、逻辑和其他领域。
围绕机器学习的宣传已经进入了我们的行业,也许很快,它也会进入你的行业。
梯度下降为什么有效?
原文:https://towardsdatascience.com/why-does-gradient-descent-work-128713588136?source=collection_archive---------6-----------------------
你可能明白,但你见过吗?
我)何苦呢
首先,让我们把房间里的大象弄走。你为什么要读这个博客?首先,因为它有很棒的动画,如下图 1 所示。你不想知道这张照片里发生了什么吗?
Figure 1: A plane with its gradient. Created by author using: https://github.com/ryu577/pyray
第二,因为优化非常非常重要。我不管你是谁,那应该是真的。我的意思是,这是寻找最好的科学。它让你选择你对“最好”的定义,然后不管那可能是什么,告诉你你能做什么来实现它。就这么简单。
此外,尽管最优化——作为一门完整的科学——有很多深度,但它有一个基本的一阶技术,叫做“梯度下降”,非常容易理解。事实证明,这项技术实际上是实践中应用最广泛的。至少在机器学习中,随着模型变得越来越复杂,使用复杂的优化算法变得越来越困难。所以大家就用梯度下降。换句话说,学习梯度下降,你就学会了最简单,但也是最优化中最广泛使用的技术。那么,让我们非常直观地理解这个技巧。
II)优化要点
正如我在上一节提到的,优化是非常棒的。它包括取一个单一的数字——例如,你银行账户里的钱的数量,或者你床上的臭虫的数量——并告诉你如何使它尽可能好(如果你像大多数人一样,第一种情况下高,第二种情况下低)。让我们称这个东西为我们试图优化的 z.
当然这里隐含的假设是,我们可以以某种方式控制我们想要优化的东西。假设它依赖于某个变量(比如 x,它在我们的控制之内。所以,在 x 的每一个值上,都有 z 的某个值(我们想找到使 z 最好的 x)。可能有一些等式可以描述这个图。假设 f(x,z) = 0。但是在最优化的背景下,我们需要用以下形式来表示:z= f(x)(假设原方程有利于这样分离 z 和 x)。然后,我们可以问——“x 的什么值对应最佳 z?”。如果我们有一个很好的连续函数,那么有一点我们可以肯定的说,在这个特殊的 x 处,z= f(x)的导数(一般用 f'(x)表示)将为零。
III)什么是梯度
当我们要优化的东西依赖于不止一个变量时,导数的概念就延伸到了梯度。所以,如果上面的 z 依赖于 x 和 y,我们可以把它们收集到一个单独的向量 u = [x,y]。因此,当 z= f(x,y) = f(u)时,z 的梯度变为:
就像导数一样,我们可以确定,优化 z 的 u 值,会使梯度的两个分量都等于零。
顺便提一下,梯度在任何光滑、可微函数的泰勒级数展开中起着重要作用:
Equation (1)
如你所见,右边的前两项只涉及 u,没有平方、立方或更高的幂(那些在后面的项中出现)。前两项恰好也是 u=a 附近函数的最佳线性近似。下面我们展示简单抛物面(z = x + y)的线性近似。
Figure 2: The best approximation of a paraboloid (pink) by a plane (purple) at various points. Created for this blog using: https://github.com/ryu577/pyray
IV)线性函数
我们在上一节中看到,梯度可以用线性函数很好地表示。因此,我们将限制讨论线性函数。对于一个线性函数的方程,我们只需要知道它与轴的交点。
如果我们只有一个维度(x 轴),相交发生在 x=a,我们可以这样描述
Equation (2)
如果我们有两个维度(x 轴和 y 轴),并且直线在 x=a 处与 x 轴相交,在 y=b 处与 y 轴相交,则等式变为
Equation (3)
当 y=0 时,我们得到 x/a=1,和上面的等式一样。
如果我们有三维空间会怎么样?我想你知道这是怎么回事
Equation (4)
以此类推(顺便说一下,这就是你在上面的图 1 中看到的红色飞机)。
现在,我们可以看到上面所有的方程在 x,y,z 等方向上都是对称的。然而,在优化的上下文中,它们中的一个具有特殊的地位。这是我们寻求优化的变量。假设这个特殊变量是 z,在我们想把这个表示成一个优化问题的时候,需要把方程表示成 z=f(x)。如果我们对等式(4)这样做,我们得到的是
Equation (5)
我想增加我的线性函数。我应该去哪里?
这是这个博客的中心问题。你有上面方程描述的线性函数,x 和 y 在你的控制之下。你发现自己处于(x,y)的某个值。为了简单起见,我们假设在当前点 z=0。你可以沿着任何方向走 1 个单位的一步。问题变成了,你应该朝哪个方向迈出这一步?下面的图 3 展示了这个难题,展示了你可以走的无限的方向。每个方向以不同的量改变目标函数 z。因此,其中一个将最大程度地增加 z,而另一个将最大程度地减少 z(取决于我们想要最大化还是最小化它的天气)。
请注意,如果我们的控制中只有一个变量(比如 x ),这就容易多了。只有两个方向可供选择(增加 x 或减少 x)。然而,一旦我们有了两个或更多的自由变量,选择的数量就会从两个跳到无穷大。
Figure 3: The infinite directions we can move along. Which one should we choose? Created for this blog using: https://github.com/ryu577/pyray
现在,我们想找出 z 变化最大的方向。所以我们反其道而行之(说,因为我们有点疯狂?).我们来寻找 z 完全不变的方向。如果你仔细观察上图,你会发现当绿色箭头与橙色线(绿色网格和红色平面相交的线)对齐时会发生这种情况。如果你继续盯着看,你可能会注意到当绿色箭头垂直于橙色线时,z 变化最大。因此,这条橙色的线似乎可以让我们对这个问题有所了解。那么橙色线是什么?很明显,这是我们的平面与代表 x-y 平面的绿色网格(我们可以沿着它移动的网格)相交的地方。x-y 平面的方程是什么?它将是 z=0。换句话说,z 在上面不变。所以,既然橙线完全位于网格上,那么它也一定在网格上处处都有 z=0。难怪当我们的绿色箭头使我们简单地沿着橙色线移动时,z 拒绝改变。
至于橙色线的方程,就是平面的方程-
和 x-y 网格;z=0 同时得到满足。这给了我们
现在,从上面橙色线的方程可以清楚地看出,当 y=0 时,x=a .所以,它与 x 轴相交的点的位置向量为 o_x : [a,0] (o 代表橙色)。同样,它与 y 轴相交的点是 o_y : [0,b]。现在我们有了直线上两点的位置向量,我们减去它们得到一个沿直线的向量(o)。
Equation (6)
现在,如果我们能证明梯度垂直于这个向量,我们就完成了。这将给我们一些直觉,为什么梯度变化 z 最大。
VI)平面的倾斜度
将第三节中梯度的定义应用于上方平面的方程(x/a+y/b+z/c=1 ),我们得到-
Equation (7)
这使得梯度:
Equation (8)
现在,我们知道两个向量要正交,它们的点积必须为零。取点积或平面的梯度(来自等式(7))和沿着橙色线的矢量(来自等式(6)),我们得到,
Equation (9)
我们知道了,梯度与垂直于橙线的方向一致,所以,它改变 z 最大。事实证明,沿梯度方向增加 z 最多,而沿相反方向(注意,这两个方向都与橙色线正交)减少 z 最多。
我将留给你们这个可视化的演示,当我们改变平面时,梯度继续顽固地指向改变它最大的方向。
Figure 4: As we change the plane, the gradient always aligns itself with the direction that changes it the most. Crated for this blog using: https://github.com/ryu577/pyray
为什么领域专长被高估—第一部分
原文:https://towardsdatascience.com/why-domain-expertise-is-overrated-part-i-d17898d2d679?source=collection_archive---------15-----------------------
数据科学正在帮助消除的一个最基本的误解是,一个全能、无所不知的专家喜欢告诉普通人做什么、怎么吃、买什么、如何抚养我们的孩子等等。
但是,非专家篡夺旧世界秩序的例子数不胜数,证明专家是错的。
历史上的例子包括莱特兄弟,他们冒着生命危险进行修补,而不是推导物理理论。或者通过纯粹的意外发现而不是自上而下的定向研究取得的无数医学进步。
早在 21 世纪初,长期以来流行的观点是,棒球比赛中的胜利次数与球队的薪资水平高度相关。
但是比利·比恩,全棒球中薪水最低的球队的总经理,连续四次带领奥克兰运动家队进入季后赛——这是一个令人震惊的低概率事件。
他是怎么做到的?他之所以做到这一点,是因为他专注于一个棒球专家都不太重视的统计数据——基于垒位百分比(OBP):
“An Island of Misfit Toys”
一个重要的例子
不动产不能丢失或被盗,也不能被带走。用常识购买,全额支付,合理谨慎地管理,这大概是世界上最安全的投资。—富兰克林·罗斯福,美国总统
一个在美国社会仍然流传的神话是,单户住宅是好的、安全的投资,从长远来看,价格会上涨。
正如我们从上一次衰退(大约 2009 年)中看到的那样,这不是一件小事。我记得当我的同事谈论在拉斯维加斯购买 50 万美元的房子,或者同时拥有三套房子时(作为一名 24 岁的酒保),他声音中的焦虑。
我们都知道大衰退是如何结束的,但我脑海中总是浮现的是,本该给我们发出警告的专家在哪里?
我们从未经历过全国性的房价下跌——本·伯南克(2005 年美国消费者新闻与商业频道前美联储主席)
可以说,世界上最有权力的人之一,本·伯南克,告诉美国人要保持冷静,继续前进。
本·伯南克是对的吗?
让我们启动一个 Jupyter 笔记本。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inlinepd.set_option('display.max_rows', 1000)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)xlsx = pd.ExcelFile('HomePriceIndex.xls')
df = pd.read_excel(xlsx, skiprows=6)df.rename({'Date': 'Year',
'Index': 'RealHomePriceIndex',
'Index.1': 'RealBuildingCost',
'Millions': 'Population',
'Long Rate': 'LongRate'}, inplace=True, axis=1)
df = df[['Year', 'RealHomePriceIndex', 'RealBuildingCost', 'Population', 'LongRate']]df.head()
数据集来自耶鲁大学经济学家罗伯特·希勒,他是在他的书非理性繁荣中预测房价崩溃的少数经济学家之一。对于那些想跳过预处理的人,你可以在这里获得清理后的数据集。
顺便说一句,这个数据集与标准普尔现在用作美国全国房价标准的数据集相同。在希勒之前,没有可靠的房价指数可以追溯到 19 世纪末。我们站在他的肩上。
让我们继续检查dtypes
并将它们转换成数值。
df['LongRate'] = pd.to_numeric(df['LongRate'], errors='coerce').dropna()
如果您检查整个数据集,主要问题是它是一个时间序列,其中频率在集合的中间发生变化。从 1953 年开始,频率从每年一次切换到每月一次,一直到 2018 年。
因为这个问题只涉及“Year”和“RealHomePriceIndex”变量,我们将把它们分离出来,使用平均值进行重新采样和聚合,并将这两个数据框架放在一起,形成一个我们可以处理的数据框架。
df_2 = df[['Year', 'RealHomePriceIndex']]
df_2.drop([851,852,853], inplace=True)# Resample 'Year' and make it into an indexdf_2['Year'].loc[0:62] = pd.date_range('1890', periods=63, freq='A')
df_2['Year'].loc[63:] = pd.date_range('1953', periods=788, freq='M')df_2.index = df_2.Year
df_2.drop('Year', inplace=True, axis=1)df_2_bottom = df_2['1953-01-31':].resample('A').mean()
df_2_bottom = df_2_bottom.astype('int')df_2 = df_2.loc['1890-12-31': '1952-12-31']
df_2 = df_2.append(df_2_bottom)df_2.index
现在,我们清理旧的 df 数据帧,我们将“RealHomePriceIndex”从其中分离出来。
# Drop these because we already have df_2
df.drop(['Year', 'RealHomePriceIndex'], inplace=True, axis=1)df.dropna(inplace=True) # Drop NaN values# Truncate by 3 rows to make it even with the rest of the DataFrame
df_2 = df_2.loc['1890-12-31':'2015-12-31']df.index = df_2.index# Finally add df_2 to df
df['RealHomePriceIndex'] = df_2['RealHomePriceIndex']df.head()
现在让我们绘制数据图表,看看伯南克是否正确。
plt.style.use('fivethirtyeight')ax = df.RealHomePriceIndex.plot.line(x=df.index, y=df.RealHomePriceIndex, legend=False, figsize=(14,8));ax.axvline(x='2006', color='red', linewidth=2, alpha=0.8)
ax.axhline(y=0, color='black', linewidth=1.3, alpha=0.8)ax.text(x='1880', y=185, s="U.S. Home Prices Stayed Roughly Flat for 100 Years",
fontsize=30, fontweight='bold');ax.text(x='1890', y=170, s="Home Prices indexed to inflation, 1890=100",
fontsize=20);ax.text(x='1992', y=25, s="2006 Peak of Bubble",
fontweight='bold', color='#CB4335');
该图最重要的特点是它与通货膨胀挂钩,所以它是美国 100 多年来房价的比较。
如果你伸出食指,追踪从 1890 年开始的图表,当指数从 100 开始到 1995 年,价格水平几乎没有任何增长,这意味着与股票在整个 20 世纪回报的 9%的股票溢价基准相比,对大多数人来说,住房并不是一种很好的投资。
在 20 世纪初,房价确实下降了大约 20 年。
这种类型的分析不涉及微积分或线性代数或任何经济学家喜欢为他们的模型使用的定量方法。
如果伯南克和其他人只是注意到房价总体上停滞了 100 年的事实,从 1995 年开始的泡沫式上涨可能会促使他们尽早采取行动。
为什么每个数据科学家都应该阅读朱迪亚·珀尔的《为什么之书》
原文:https://towardsdatascience.com/why-every-data-scientist-shall-read-the-book-of-why-by-judea-pearl-e2dad84b3f9d?source=collection_archive---------6-----------------------
因果关系如何进一步推进数据科学和人工智能
我做了 4 年机器学习和一年多深度学习的忠实粉丝。我为娱乐和工作建立了预测模型。我知道很多算法,从像梯度推进这样的传统算法到像 LSTM 这样的最深模型。尽管我已经获得了无数的算法,我的困惑依然存在。
算法本身无法解决的难题
如果你不是那种只关心如何减少 0.01%的误差,但试图理解你的模型的数据科学家,你可能会不时地问自己:
- 我应该把这个变量添加到我的模型中吗?
- 为什么这个反直觉的变量显示为一个预测变量?
- 为什么我再加一个变量,这个变量会突然变得无关紧要?
- 为什么相关性的方向和你想的相反?
- 为什么在我以为会更高的时候相关性为零?
- 当我将数据分解成子群体时,为什么关系的方向会反转?
随着时间的推移,我已经建立了足够的意识来解决这些基本问题,例如,我知道双变量关系可能与多变量关系非常不同,或者数据会受到选择偏差的影响。但它缺乏一个坚实的框架,我可以肯定地说服自己和其他人。更重要的是,我可能不会意识到,直到一段关系与我的感觉相矛盾!重要的是要注意,当有矛盾时,它已经出了大问题。没有地图,在我知道自己迷路之前,我怎么能确定我没有走错目的地呢?
是的,联想和因果都可以预测
当我读到朱迪亚·珀尔的《为什么之书》时,这个困惑已经完全消失了。现在它是我的数据科学指南。这里我简单告诉你为什么。简而言之,就是因果关系,因果关系。预测未来有两种方法:
- 我知道看到 X,就会看到 Y(联想)
- 我知道 X 导致 Y(因果关系)
两种方式都可以预测。这两种方法可能会产生相似的模型性能。那么,有什么区别呢?为什么要费心去理解因果关系?如果它是一个更强大的工具,因果关系可以通过数据来研究吗?
随机对照试验以及为什么有时不可行
作为金标准,随机对照试验(RCT)(或市场营销中所谓的 A/B 测试)用于测试因果关系。特别地,在临床试验中,该技术用于研究特定药物/治疗是否可以改善健康。
随机化是为了最小化选择偏差,以便我们知道,例如,我们不会选择性地将治疗应用于更多的患病患者,从而导致明显更低的收益,如果我们不选择更多的患病患者,就不会有这样的收益。对照是作为一个基准,以便我们可以比较接受治疗患者和未接受治疗的患者。作为一种标准,还有一种所谓的双盲机制,使患者不知道他们是否实际接受治疗,以屏蔽心理影响。
虽然这是黄金标准,但在某些情况下可能不可行。例如,如果我们想研究吸烟对肺癌的影响,显然我们不能强迫某人吸烟。另一个例子:如果我想知道如果我读了博士,我会走多远,这肯定是不可能的,因为时间只会向前推移。毕竟,一项实验会受到很多限制,例如,样本是否能代表整个人群,是否符合伦理等等。
从观察数据到因果分析?
如果进行一项实验不切实际,能否利用观测数据研究因果关系?观察数据意味着我们不能做任何干预,我们只能观察。这可能吗?
不管你懂不懂统计学,你可能听说过这样一句话,相关性并不意味着因果关系。然而,它没有告诉你如何研究因果关系。这里的好消息是,读完这本书后,你将有一个更好的框架来研究因果关系,并确定在给定数据的情况下你什么时候可以或不可以研究它,因此你知道你应该收集什么数据。
本书的要点
我在这里不涉及详细的技术或公式。一方面,我刚刚读完这本书,我不是因果关系的专家;另一方面,我鼓励你阅读这本书,以免错过任何见解,因为我可能会有偏见。
尽管大数据非常突出,但将所有东西都添加到您的模型中可能是错误的
在大数据时代,拥有几乎无限的计算能力和数据,您可能会忍不住将每个数据放入深度神经网络进行自动特征提取。我也动心了。
这本书告诉你一些场景,添加某些变量需要谨慎。例如,您想要预测 Z,而基本关系是 X →Y → Z(箭头表示“原因”,在这种情况下 Y 是一个中介,它调解从 X 到 Z 的影响)。如果你在模型中加入 X 和 Y 作为变量,Y 可能会吸收所有的“解释力”,这将 X 踢出你的模型,因为从 z 的角度来看,Y 比 X 更直接。这阻止了你研究 X 和 z 之间的因果关系。你可能会说,预测没有区别,不是吗?是的,从模型性能的角度来看,但是如果我告诉你 Y 和 Z 非常接近,以至于当你知道 Y 的时候,Z 已经发生了。
同样,不增加某些变量也是有风险的。你可能听说过伪相关或混杂这个术语。基本思想可以用这个关系式来说明,Z← X → Y(即 X 是混杂因素)。注意,Z 和 Y 之间没有因果关系,但如果不考虑 X,Z 和 Y 之间似乎有关系,一个著名的例子是巧克力消费量和诺贝尔奖得主的编号之间的正相关关系。原来共同的事业是一个国家的富裕。同样,你可能没有预测的问题,但是你可能很难向别人解释你的模型。
当然,这个世界比我们想象的要复杂。但这正是领域知识发挥作用的地方,因果图是对一切如何工作的简单而强大的表示。
书中有更高级的脑筋急转弯和现实生活中的例子。幸运的是,所提供的规则使它们易于遵循。
因果关系可能更强
因果关系可能会随着时间而改变。如果您希望您的模型随着时间的推移而变得健壮。以 Z← X → Y 为例,如果关系 Z← X 变弱了,对 X → Y 建模不会对你有影响,但对 Z 和 Y 建模会有影响。
从另一个角度来看,如果我们相信因果关系比关联更强,这意味着如果我们从一个领域借用到另一个领域,这种关系更有可能成立。这就是书中提到的所谓的迁移学习/可移植性。这本书引用了一个非常有见地的可移植性的例子,它描述了我们如何透明地执行调整,以便我们可以将因果关系从一个领域转移到另一个领域。
干预变得更加容易,尤其是在数字时代
干预实际上是研究因果关系的巨大动机之一。仅仅通过学习联想的预测模型不能给你干预的洞察力。比如不能在 Z← X → Y 中改变 Z 影响 Y,因为没有因果关系。
干预本身是一个更强大的工具,因为你可以理解潜在的关系。这意味着,你可以改变政府政策,让我们的世界变得更美好;你可以改变治疗方法来拯救更多的病人,等等..这就是你救了病人和你预测病人会死却不能干预的区别!也许这是数据科学家能做的最好的事情,只有用这个工具包!
在这个数字时代,干预需要更少的努力,当然,你有更多的数据来研究因果关系。
这是我们推理的方式,因此这可能是通向真正人工智能的途径
最后是关于人工智能。推理是智慧的必要组成部分,也是我们的感觉。在一个封闭的世界中,有明确定义的奖励和规则,强化学习通过探索和利用的平衡来实现卓越,以在预定义的规则下最大化预定义的奖励,并在所采取的行动改变状态进而决定奖励的机制下。在这个复杂的世界里,这种机制不太可能成立。
从哲学的角度来说,我们应该明白我们是如何做决定的。最有可能的是,你会问,“如果我这样做,会发生什么;如果我那样做,然后呢?”。注意,你只是创造了两个没有发生的想象世界。有时,当你反思并从错误中学习时,你可能会问,“如果我这样做了,那就不会发生了。”再说一次,你创造了你的反事实世界。事实上,我们比自己想象的更有想象力。这些想象的世界是建立在因果关系上的。
也许机器人可能有自己的逻辑,但如果我们想让它像我们一样,我们需要教它们推理。这让我想起了 DeepMind 发表的一篇论文,“测量神经网络中的抽象推理”(链接),这篇论文显示了将原因作为训练数据的一部分来添加可以增强泛化能力。这篇论文让我深受启发,这正是我们教机器人推理的情况!而且是从模式联想到推理的飞跃。
我推测因果关系有助于概括。我没有证据,但这是我们理解世界的方式。我们被教导一两个例子,然后我们学习因果关系,我们在任何我们认为适用的地方应用这个关系。
把一切都放到一个不经意的图中,或许推理是智商测试的问答混杂因素?我们能否认为推理导致人们设计问题中的那些模式,并且它也“导致”答案?或者,它可以是一个中介,将问题转化为推理,进而导致答案?或者两者都有?请注意,我故意假设问题和答案之间没有偶然的关系,因为它们纯粹是模式关联。
Reasoning as a Confounder
Reasoning as a Mediator
它们只是我的胡乱猜测。我不知道答案。我不是全职研究员,也不是哲学家。但我可以肯定的是,当我们着手解决一个问题时,因果关系提供了一个新的视角。因果关系和深度学习之间的协同作用听起来很有希望。
最终想法
我承认这篇文章的主题可能有点咄咄逼人,但我觉得有责任向大家推荐这本书。它告诉我们因果关系的全部潜力,这是我们与生俱来的东西,但我们可能会在大数据时代忽略它。框架,do-calculus,已经存在。它只是等待我们部署并付诸实践。
作为一名从业者,有了这个强大的工具,我相信我们可以产生更好的影响。
为什么每个数据科学家都应该使用 Dask?
原文:https://towardsdatascience.com/why-every-data-scientist-should-use-dask-81b2b850e15b?source=collection_archive---------0-----------------------
2021 年更新:如果你正在寻找运行 Dask 的快捷方式,请尝试 SaturnCloud ,它甚至提供免费计划。
Dask 是我遇到的最具革命性的数据处理工具。如果你喜欢熊猫和 Numpy,但有时又苦于数据无法放入 RAM,那么 Dask 绝对是你所需要的。Dask 支持 Pandas dataframe 和 Numpy 数组数据结构,既可以在本地计算机上运行,也可以扩展到集群上运行。本质上,您只需编写一次代码,然后选择在本地运行它,或者使用普通的 Pythonic 语法部署到多节点集群。这本身就是一个很好的特性,但这并不是我写这篇博客并说每个数据科学家(至少是使用 Python 的)都应该使用 Dask 的原因。对我来说,Dask 的神奇之处在于,只需进行最少的代码更改,我就可以利用笔记本电脑上已有的处理能力并行运行代码。并行处理数据意味着更少的执行时间、更少的等待时间和更多的分析时间!这篇博文将讨论 dask.delayed 及其如何融入数据科学工作流。
Photograph from https://pixabay.com/en/skiing-departure-wag-trace-curves-16263/
“Dask 为分析提供高级并行性,为您喜爱的工具提供规模化性能”——【https://dask.pydata.org/en/latest/
熟悉 Dask
作为对 Dask 的介绍,我将从几个例子开始,向您展示它完全不引人注目的自然语法。这里的主要收获是,您可以使用您已经知道的东西,而无需学习新的大数据工具,如 Hadoop 或 Spark。
Dask 引入了 3 个并行集合,能够存储大于 RAM 的数据,即数据帧、包和数组。这些集合类型中的每一种都能够使用在 RAM 和硬盘之间分区的数据,以及分布在集群中的多个节点上的数据。
Dask 数据帧由较小的拆分 Pandas 数据帧组成,因此允许 Pandas 查询语法的子集。以下是在 2018 年加载所有 csv 文件、解析时间戳字段,然后运行 Pandas 查询的示例代码:
Dask Dataframe example
Dask 包能够存储和处理内存中无法容纳的 Pythonic 对象集合。Dask 包非常适合处理日志和 json 文档集合。在这个代码示例中,2018 年的所有 json 文件都被加载到 Dask Bag 数据结构中,每个 json 记录都被解析,并使用 lambda 函数过滤用户:
Dask Bag example
Dask 数组支持 Numpy 类切片。在以下代码示例中,HDF5 数据集被分成(5000,5000)个维度块:
Dask Array example
利用 Dask 进行并行处理
该部分的另一个准确名称是“顺序循环的死亡”。我经常遇到的一个常见模式是循环遍历一个项目列表,并用不同的输入参数对每个项目执行一个 python 方法。常见的数据处理场景包括,为每个客户计算功能聚合或为每个学生执行日志事件聚合。Dask Delayed 允许并行处理多个项目,而不是按顺序对循环中的每个项目执行函数。随着 Dask 的延迟,每个函数调用被排队,添加到执行图和调度。
编写自定义线程处理或使用 asyncio 对我来说总是有点乏味,所以我甚至不打算向您展示比较示例。有了 Dask,您不需要改变您的编程风格或语法!您只需要用@dask.delayed 注释或包装将要并行执行的方法,并在循环代码后调用 compute 方法。
Example Dask computation graph
在下面的例子中,用@dask.delayed 对两个方法进行了注释。三个数字存储在一个列表中,必须对它们进行平方,然后集体求和。Dask 构建了一个计算图,它确保“平方”方法并行运行,输出作为一个列表整理,然后传递给 sum_list 方法。计算图可以通过调用。可视化()。打电话。compute()执行计算图。正如您在输出中看到的,列表项没有按顺序处理,而是并行运行。
Dask Delayed demonstration
可以设置线程的数量(即 dask . set _ options(pool = thread pool(10)),也可以很容易地切换到您的笔记本电脑或个人桌面上使用的进程(即 dask . config . set(scheduler = ' processes))。
我已经说明了使用 Dask 向您的数据科学工作流添加并行处理是微不足道的。我最近使用 Dask 将用户点击流数据分成 40 分钟的会话,并为聚类建立用户聚合功能。请分享你如何使用 Dask 的描述,作为对这篇博文的评论。快乐 Dasking…..
额外资源
- dask cheat sheethttps://dask . pydata . org/en/latest/_ downloads/dask cheat sheet . pdf
- 16 分钟大 Dask 概述视频【https://www.youtube.com/watch?v=ods97a5Pzw0
T3 - 详细 Dask 概述视频(40 分钟)
https://www.youtube.com/watch?v=mjQ7tCQxYFQ
为什么每个人都是数据科学家
原文:https://towardsdatascience.com/why-everyone-is-a-data-scientist-b91abd34ad44?source=collection_archive---------8-----------------------
Imagevia pexels.com
最后期限快到了。我写了大约 30 页,至少还要再写 30 页才能达到提交硕士论文报告的最低要求。事情变得越来越困难。我花了大部分时间试图实现一篇论文,因此,花了大部分时间编写和重写代码。当我真的不得不把我的任务写下来的时候,那就没什么意义了。例如,我花了一个多星期的时间收集数据,并用相关的标签进行标注。就是这样。我只是描述了我一个星期所做的事情。排成一行。我可以肯定地进一步描述它,但它主要是关于重构代码,一些不会(也不应该)出现在最终报告中的东西。
我和我的父母谈过这件事。现在,澄清一下,他们不是很懂技术,而且他们都没有在技术部门工作过。充其量,他们是不情愿的科技消费者。即使他们并不真正理解问题,他们也会试着同情和帮助。有一个建议,他们几乎总是给。问你的学长。问问他们是怎么做到的。什么都问他们。在每一个阶段。
你可能会问,上面的故事和文章的标题有什么关系。早些时候,当计算机缺乏今天的处理能力时,我们的大脑就是为我们执行所有分析的超级计算机。几十年来,我们的大脑一直在做我们现在在 CPU 和 GPU 上做的事情——尽管规模小得多。基本上,当我的父母让我问我的学长他们是如何着手写论文的,他们让我收集数据进行分析。然后这些数据被处理,一个模型被开发出来(在我们的大脑中),这个模型概括了他们对我们当前处境的体验。然后这个模型预测在我们的情况下会发生什么。事实上,作为人类,我们一直都在这样做。我们阅读前几年的试题,以了解问了什么样的问题,然后尝试预测未来考试中的问题。我们阅读亚马逊上关于产品的评论,并试图预测/理解产品可能的行为。我们和我们的朋友谈论他们在街上新开的餐馆的经历,并试图预测我们可能在餐馆的经历。
数据科学中的过程没有太大的不同。根据 CRISP-DM 在行业中组织数据科学项目的方法,数据科学任务包括以下主要阶段。它包括业务理解、数据理解、数据准备、建模、评估和部署。在我的例子中,业务理解阶段是为了找到一种方法来成功地完成我的硕士论文。根据父母的建议,我可以进入数据理解和数据准备阶段。这基本上就是从我的学长那里收集和理解关于他们如何完成硕士论文的信息。然后,我会在我的大脑中创建一个模型,它将理解我与之交谈的每一位学长的长处和短处,以及他们论文期间各自的结果。最后,我将把这些发现应用到我的情况中,这将构成评估和部署阶段。
我开始相信,自从人类存在以来,数据科学就一直存在。这似乎有点夸张,但事实并非如此。只是,在更早的时候,它只是在大脑中(就像我之前提到的,在一个更小的范围内),而现在它是通过计算机来完成的。作为人类,我们的自然倾向是害怕未知。默认情况下,未来发生的事情对我们是隐藏的。任何有助于我们解开谜团的信息都是珍贵的。所以我们都是数据科学家,除了我们总是把科学当成一门艺术。最后,不被理解和工作的科学无论如何都是艺术!
参考文献:
1.T3【https://www.the-modeling-agency.com/crisp-dm.pdf】T5
为什么机器学习模型中的特征权重没有意义
原文:https://towardsdatascience.com/why-feature-weights-in-a-machine-learning-model-are-meaningless-b0cd22a4c159?source=collection_archive---------5-----------------------
不要根据 ML 模型的权重来做决定
当我看到我们的客户爱上了 BigQuery ML 时,一个老问题浮出了水面——我发现他们无法抗拒赋予特征权重意义的诱惑。
“在我的模型中,预测客户终身价值的最大权重,”他们可能会说,“是客户是否收到了高管的感谢电话。”或者,他们可能会看到负权重,并得出一个可怕的结论:“位于城市地区的商店导致负满意度。”
请不要这样做。不要让你的主管给每个客户打电话!不要关闭你所有的城市位置!
Don’t make decisions based on the weights of your machine learning model
不要根据你的机器学习模型的权重来做决定。为什么不呢?
分类权重是自由参数
我们举个简单的例子。假设您想要创建一个模型来预测硬币的重量。你的机器学习模型将有三个输入——硬币的直径、硬币的厚度和硬币的材料。
也许在对您的大型硬币数据集训练模型后,您最终会得到这个模型:
Model to predict the weight of a model
该材料的负面术语不代表任何东西。例如,我们可以将部分权重移入“偏差”项,并创建一个等效模型:
This model is equivalent to the one above
换句话说,分类变量为模型如何分配权重提供了很大的余地。这完全是随机的。
因变量也提供自由参数
假设结果是,在你的现实世界数据集中,更大的硬币也更厚。那么,你的模型可能是:
因此,现在直径特征的权重为负,因为它基本上抵消了赋予厚度的额外正权重。
显然,较大的硬币会更重,但因为它们在我们收集数据集的真实世界中也更厚,所以单个要素权重不会反映这一点。
不要做就是了
底线是,你不能从重量的大小或重量的符号得出结论。作为人类,我们需要可解释性,但在现实世界的数据集中,这可能相当困难。
像置换输入、石灰和综合梯度这样的方法有些帮助,但是除非你也清楚地知道特征间的依赖关系,否则基于这些更复杂的方法做出昂贵的决定是危险的。特性重要性是特定模型中的重要性,通常不会转化为现实生活中的重要性。
真的,不要
预测终身价值或客户满意度的模型是很好的——您肯定可以使用这些模型来确定哪些客户需要照顾,哪些交易需要调查。这是因为该模型是在一个大型数据集上训练的,以准确预测这一点。
然而,与单个特征相关的权重是不可解释的。不应使用输入特征量(“高管销售电话具有巨大的权重”)或特征符号(“城市商店导致满意度低”)来得出结论。你不应该使用一个预测终身价值的模型来强制要求每个客户都需要收到一封来自高管的个性化邮件。
为什么未来的人工智能应该是老师而不是先知
原文:https://towardsdatascience.com/why-future-ai-should-be-a-teacher-and-not-an-oracle-e0b7460b033d?source=collection_archive---------3-----------------------
请少预测,多洞察。
Taken from pexels
虽然现在开发算法是我的工作,但我仍然对深度学习和大部分机器学习持有健康的偏见。尽管它做出了强有力的预测,但我还没有看到它产生多少对社会有价值的直接见解。如果我们自己不能从算法中学习,那么学习算法有什么意义呢?
好吧,我承认,有时候我们通过观察向他们学习。例如,通过观察算法正在做什么,人类象棋和围棋选手正在变得更好。当然还有很多东西要学。但是,如果算法能立即告诉我们为什么,岂不是更有效率?
黑匣子的问题是
正如 Pentland 教授在最近的 Edge conversation 中描述的那样,问题是这些算法没有使用我们目前拥有的所有物理和因果知识。只是愚蠢的神经元拼凑出无限多的小近似值。它不能一概而论,因此仍然容易出错。
当算法无法理解的新数据到来时,它没有意识到这一点,只是变得疯狂。
最重要的是,它不知道训练数据中所有可能的偏差。
当它出错时,我们无法向客户和经理解释原因。当然也不会对法官和陪审团说,如果你发现自己因算法决策出错而被送上法庭。
彭特兰教授描述了在我们的人工智能中使用更多的物理功能。使用已知的因果结构。来制造洞察发生器,而不仅仅是做预测。这种方法比目前的暴力算法更吸引我。
为什么我们选择白盒
在我的工作中,数学家、领域专家(物理学家)和业务经理之间会就算法进行无休止的讨论。最终,我们希望建造智能机器,在物理可能的边缘运行。
数学家和数据科学家提出了许多他们想使用的新奇算法。虽然在一个封闭的行业中仍然很难找到足够多的好数据,但它们有时确实有效。
物理学家谴责了其中的大部分,因为它们没有使用真实世界的信息。那么我们怎么能相信他们输出的东西呢?
业务经理想要业绩保证。他们想要控制和责任。我们怎么得到这个?
我们最终选择了更多的白盒方法。期望多项式或正弦函数的线性回归。也许是简单的决策树。如果需要,一些贝叶斯规则。用已知的物理约束来规范一切。通过正确的努力,结果通常表现得与任何神经网络方法一样好,但好处是知道为什么。
除此之外,我们还使用算法,利用我们对数据行为的了解来监控传入的数据。因为如果数据以意想不到的方式变化,我们就不能再相信我们的输出预测。
然后我们得到我们可以控制的算法,并解释它们何时出错。然而,他们不会自动更新他们的物理假设。同样地,它们也不会教我们任何我们不知道的世界。
支持黑盒
我仍然想为黑盒算法辩护。
1.他们工作
首先,它们可以工作得非常好!目前的深度神经网络非常棒,尤其是对于那些拥有所有数据的人来说。没有更好的方法来检测猫的图像,或者把它们画成梵高的风格。我们一直在尝试的一个很好的应用是使用这些黑盒算法作为基准来测试我们的白盒是否丢失了一些信息。
2.他们老了
支持黑盒算法的另一个理由非常简单。我们已经每天都信任他们。尽管心理学和神经科学取得了很大进步,但我们对自己的大脑却知之甚少,更不用说社交网络的运作了。
我们的大脑几乎是一个黑匣子。然而,我们信任他们,因为他们经常给我们口头陈述他们的内部推理。然而,我们也知道我们的头脑充满了偏见,经常会感知到与实际不同的世界。
3.它们可以被改进
也许我们可以通过创建输出一些冗长的基本原理的算法来使用这些知识。如果我们问它为什么做了某个预测,它会给自己一些合理的解释。DARPA 称之为人工智能的第三次浪潮。例如,如果 HR 算法拒绝了一个候选人,它会说它是根据人的肤色拒绝的。之后我们可以说:“不,不,那是不可接受的,请更新你的神经网络”。然后,它可能会相应地这样做,或者只是提出更好的理由。不利的一面是,我们可能不得不处理说谎算法的可能性。
洞察网络
我们有一个有影响力的同事喜欢贝叶斯网络。在这些方法中,您将大量观察结果和根本原因与它们的基本比率拼凑在一起,并使用贝叶斯规则作为连接。当新的观察结果出现时,所有的概率都会更新,并且可以确定一个可能的原因。后来你就知道推论是如何发生的了。
它不能教你新的观察,但是它对复杂环境中的根本原因分析很有帮助。我会说这是未来许多有趣的途径之一。
你想要什么样的老师?
看,你可以说 AI 已经在教我们了。你整天向搜索引擎提问,得到回答作为回报。如果你正确地训练它们,算法可以给你提供有价值的知识。在 Medium 上,我向世界各地的作家学习,通过 Medium 的人工智能来学习。
然而,你不能问它为什么给你那些答案和文章。好的教学是一个开放的双向过程。只要黑盒的表现优于白盒,创造赚钱神谕的人就没有动力改变他们的方式。这意味着要靠世界其他地方来培养我们未来的教师。我真的希望更多的人觉得这值得努力。
为什么要用大量数据进行深度学习?
原文:https://towardsdatascience.com/why-go-large-with-data-for-deep-learning-12eee16f708?source=collection_archive---------4-----------------------
吃一碗面条对我来说从来都不容易。现在我不怪筷子(还没学会怎么用筷子),而是讨厌面条里的卷心菜。通过整理这些美味的食物,我在狼吞虎咽之前,干净利落地挑出卷心菜丝。
我如何区分一条卷心菜和一根面条?如果不是因为在技术领域模仿人类神经元模型的重要性日益增加,我可能永远不会考虑这个问题。
为了试图复制令人惊叹的人类智能,大量的努力被用来将机器变成像人类一样的理性生物。这不仅仅是另一种时尚,而是艾伦·图灵的一个想法,他相信训练机器从过去的经验中学习。
很快,机器开始玩跳棋和象棋,击败人类冠军。尽管游戏很有趣,但更大的教训是,如果人工系统能够像我们一样“学习”,并将获得的智能应用到现实生活场景中,人工系统会变得多么有用——想想自动驾驶汽车。
学习的进化:
编程例程实现了一定程度的自动化,但逻辑和代码必须由人来输入。人工智能的概念,虽然最初与神奇的机器人联系在一起,但很快就缩小到预测和分类分析。
决策树、聚类和贝叶斯网络被认为是预测用户音乐偏好和对臭名昭著的垃圾邮件进行分类的手段。虽然这种传统的 ML 方法为许多分类问题提供了简单的解决方案,但仍在寻求一种更好的方法来像人类一样无缝地识别语音、图像、音频、视频和文本。这催生了各种深度学习方法,这些方法主要依赖有史以来最好的学习机制——人类神经元,并在最近使脸书、亚马逊、谷歌等科技巨头对深度学习着迷。
尽管最近人们的兴趣有所扩大,但早在 1957 年,弗兰克·罗森布拉特就设计出了第一台模拟单个神经元活动的感知机。我怎么能不举大脑在这里工作的例子呢!
虽然解码人脑的工作本身很难捉摸,但我们知道的是,大脑通过在树突层中传播电信号来惊人地识别物体和声音,并在超过阈值时触发积极信号。一个感知器,如下文所述,就是基于这一点而设计的。
Image Source : https://medium.com/@debparnapratiher/deep-learning-for-dummies-1-86360db18367
当输入的加权和超过阈值时,输出被触发。现在我们这里只有一个单层感知器,它只对线性可分函数起作用。一些简单的事情,比如画一条线,一边是白色的绵羊,另一边是黑色的。现实世界中并非如此。
图像识别——神经网络的主要应用领域之一,处理的是识别隐藏在像素数据后面的大量 特征 。为了解读这些特征,采用了一种多层感知器方法。与感知器类似,可以看到输入层和输出层,在输入层和输出层之间有许多“隐藏层”。
Image Source: http://neuralnetworksanddeeplearning.com/chap6.html
隐藏层的数量决定了学习的深度,找到正确的层数需要反复试验。这些神经网络中的“学习”部分是这些层调整最初分配给它们的权重的方式。
虽然看到了各种学习类型, 反向传播 被视为一种常见的方法,其中分配随机权重,将所看到的输出与测试数据进行比较,并通过比较两者来计算输出中的误差(即实际输出相对于预期输出)。现在,紧邻输出层的层调整其权重,导致后续内层的权重调整,直到错误率降低。
在下图中可以看到一种高级而实用的查看隐藏图层的方法。我确实应该向猫和狗道歉,因为它们已经无数次地参与到“学习”实验中来了!
虽然在示例中每个层对应于一个特定的功能看起来很简单,但是隐藏层如何工作的可解释性并不像看起来那么容易。这是因为,在典型的无监督学习场景中,隐藏层被比作黑盒,它们做它们所做的事情,但每一层背后的推理仍然像大脑一样是一个谜。
http://fortune.com/ai-artificial-intelligence-deep-machine-learning/
总之,深度学习与其他机器学习方法有何不同?
一个简单的答案就是所涉及的训练数据量和所需的计算能力。
在我阐述差异之前,人们必须理解深度学习是实现机器学习的一种手段,并且存在许多这样的 ML 方法来实现期望的学习水平。深度学习只是其中之一,由于所需的人工干预水平最低,它正迅速受到欢迎。
也就是说,传统的 ML 模型需要一个叫做的特征提取的过程,程序员必须明确地告诉在某个训练集中必须寻找什么特征。此外,当任何一个特征被遗漏时,ML 模型不能识别手里的物体。这里的重点是 ie 的算法有多好。程序员必须记住所有可能的猜测。否则,无人驾驶汽车很难发现道路上各种各样的路标和无数的物体,这种情况会危及生命。
Image Source: Matlab tutorial on introduction to deep learning
另一方面,深度学习是由各种例子的大型数据集提供的,模型从中学习要寻找的特征,并产生带有概率向量的输出。这个模型会自己“学习”,就像我们小时候学习数字一样。
Image Source: Matlab tutorial on introduction to deep learning
太好了!那么我们为什么不早点从深度学习开始呢?
多层感知器和反向传播方法是在 20 世纪 80 年代从理论上设计的,但由于缺乏大量数据和高处理能力,muse 逐渐消亡。自从 大数据和英伟达超级强大的GPU问世以来,深度学习的潜力正受到前所未有的考验。
现在已经有很多关于数据集需要多大的争论。尽管有些人声称更小但多样化的数据集就可以了,但你希望模型学习的参数越多,或者手头的问题越复杂,训练所需的数据也就越多。否则,拥有更多维度但数据量小的问题会导致过度拟合,这意味着你的模型实际上抢走了它的结果,并且只对你训练的集合有效,从而使分层学习无效。
为了验证大数据的必要性,让我们来看三个大容量训练数据的成功场景-
- 脸书 著名的现代 人脸识别系统,恰如其分地称为“ DeepFace ”,部署了 400 多万张 4000 多个身份的人脸图像训练集,在标注集上达到了 97.35%的准确率。他们的研究论文在许多地方重申了这种大型训练集如何帮助克服过度拟合的问题。
- Alex Krizhevsky——开发 AlexNet 并与 Geoffrey Hinton 一起参与谷歌大脑事业的人和其他学者,描述了一个涉及手眼协调的机器人抓取 的学习模型。为了训练他们的网络,总共收集了 800,000 次抓取尝试,机械臂成功地学习了更广泛的抓取策略。
- Andrej kar pathy,特斯拉的人工智能总监,在斯坦福大学攻读博士期间使用神经网络进行 密集字幕——识别图像的所有部分,而不仅仅是一只猫!该团队使用了 94,000 张图片和 4,100,000 个基于地区的字幕,从而提高了速度和准确性。
Andrej 还声称他相信他们的座右铭是保持他的数据大,算法简单,标签弱。
那么你的数据有多大?
支持该论点的另一方是最近的一篇关于深度面部表征的研究论文使用小数据,面部识别问题用 10,000 张训练图像解决,并发现与用 500,000 张图像训练的问题相当。但同样的情况尚未在深度学习目前涉及的其他领域得到证明——语音识别、车辆、行人和自动驾驶车辆中的地标识别、NLP 和医学成像。还发现迁移学习的一个新方面需要大量预先训练的数据集。
在证明这一点之前,如果你正在寻求在你的业务中实施神经网络,比如微软的销售团队如何使用 NN 来推荐要联系的潜在客户或要推荐的产品,你需要访问大量数据,正如百度前首席数据科学家、广受欢迎的深度学习专家吴恩达所说,他将深度学习模型等同于需要大量数据燃料的火箭发动机。
现在,当我回去从我的面条中挑选卷心菜的时候(感谢我惊人的大脑),你为什么不开始向你的人工神经网络输入丰富的数据呢!
本文最初发表于刮刀厂。
为什么 Google Dataset 可以彻底改变数据科学界
原文:https://towardsdatascience.com/why-google-dataset-could-revolutionize-data-science-community-4c446f9181c1?source=collection_archive---------9-----------------------
让我们面对现实吧,数据集搜索比数据清理更差,或者一个悖论,如果我们按照我们的要求精心设计地收集数据,数据清理将需要更少的努力。
但并不是每次阳光普照,也不是每次我们都得到干净的完全格式化的数据,每一列都符合我们的要求,每一行都按照该列提供的参数显示所有值。事实上,我可以说你肯定不会得到完美的数据集来满足你的要求。请注意,我代表的是现实世界问题的这些场景。
现在, Anthony Goldbloom 和 Ben Hamner 已经完全理解了这个问题,他们创建了一个网站纯粹专注于提供数据集和主持数据科学家之间的竞争,而不担心他们提供的数据集。
Kaggle website on April 2010
现在仍然要注意的是,这是在 2010 年的时候,当时比特币的价格仅为 0.08 美元,人们需要四年多的时间才能尝到甘的味道。
时光飞逝,现在我们已经有了一个伟大的数据科学家社区和专注于人工智能和深度学习的高端 GPU 社区。Kaggle 还在热情的数据科学家中建立了一个特殊的位置,并为他们的网站添加了许多功能。
到目前为止,Kaggle 一直是最可靠的平台,用于举办机器学习比赛,而不是对数据集感到好奇。
但是就像你“不要以貌取人”一样去 Kaggle。虽然 Kaggle 仍然是最好的竞争场所,但它不是你在现实生活中能得到的。
[## 大数据科学:期望与现实
对于那些从事分析和大数据工作的人来说,过去几年就像梦想成真一样。有一个新的职业…
www.kdnuggets.com](https://www.kdnuggets.com/2016/10/big-data-science-expectation-reality.html)
因此,我们必须在网上搜索,以获得我们机器学习算法的现成数据集,或者如果你想要特定地理区域或特定人口统计的数据集,那么你必须收集数据。
但是搜集数据在 T2 很有争议,因为从技术上讲,从不同的网站搜集数据在 T4 是非法的。此外,它需要大量的计算速度和能力来收集数据。因此,这给数据科学家收集数据带来了严重的难题。
然后是谷歌数据集。
到目前为止,谷歌数据集仍处于测试阶段,但它已经在数据科学界获得了非常积极的回应。
还有很多更多的 …。
现在谷歌数据集帮助你从各种网站获取搜索数据。即使在测试阶段,我也要说它比其他任何提供数据集搜索的平台都要好。
此外,GoogleAI 还表示,它将增加一些功能,例如获取特定地理位置的数据集,甚至直接可视化数据。
这让我很兴奋,因为这是执行机器学习 ie 的第一步。使用 google dataset 收集数据集将会更加令人兴奋。
为什么选择 GPU?
原文:https://towardsdatascience.com/why-gpus-4af616f15ab6?source=collection_archive---------12-----------------------
在深度学习社区中,GPU 支持的机器和集群将大大加快训练神经网络的时间,这已经不是秘密。在本文中,我们将研究梯度下降的运行时间,以及 GPU 在哪些方面降低了时间复杂度。
伪代码,梯度下降(为了简洁省略了一些细节)
While (k < max_iterations):
select batch size n
For each instance in n:
Calculate network output
For each weight dimension m:
# arbitrarily chosen update algorithm
delta_wi = delta_wi + eta * (desired - output) * x(n)i
For each weight dimension m:
wi(k+1) = wi(k) + delta_wi
k += 1
该算法以 O(knm)运行,(丢弃计算网络输出所花费的时间,因为这完全依赖于网络架构,如果你在做典型的矩阵向量运算,W^TX).,则在每个节点可以是 O(m)
O(knm): 循环的 k 次迭代,批量大小的 n 个实例,权重的 m 维。
然而,神经网络算法的最佳特性之一是它们对并行化的可扩展性。我们能够将批量更新中的 n 个实例和 m 个维度拆分到我们 GPU 上的 c 个不同内核中。
NVIDIA GPU 通常有> 1,000 个内核,相比之下,CPU 速度快得惊人,但只有大约 4 到 8 个内核。这对我们的神经网络训练意味着什么?
这些内核允许我们将我们的批处理(n/c)分开,并在每个内核上并行运行训练过程。由于梯度下降更新网络中权重参数的方式,这是可能的。GD 不是在每个训练步骤后立即更新权重,而是聚集该批的误差,然后在计算完该批中所有实例的更新后更新权重。此外,权重的更新可以分开,因为这些操作也彼此独立地运行。
感谢阅读,我希望这能帮助你获得一些关于 GPU 和梯度下降算法的直觉!如果你有兴趣尝试 GPU,我强烈推荐 Google Colab 运行时。
CShorten
Connor Shorten 是一名计算机科学学生。对软件经济学、深度学习和软件工程感兴趣。
为什么伟大的故事在媒体上失败了,你能做些什么?
原文:https://towardsdatascience.com/why-great-stories-fail-on-medium-and-what-you-can-do-about-it-bf9db4982ef0?source=collection_archive---------10-----------------------
Collage of my 2018 stories (Photocollage.com)
以下是我在分析 2018 年媒体故事时发现的一些令人惊讶的事情
是什么让一篇文章在媒体上疯传?哪些是人们真正阅读的?是什么驱使他们点击珍贵的拍手按钮,他们又是什么时候爱上它的?
这些都是每个作家心中的疑问。我们将在这里回答他们。我们将充分利用 Medium 提供的稀疏但有用的统计数据。然后,我们将从一年多来发表的一百万篇媒体报道中获得更多的见解,这些报道是由 Harrison Jansma 从公共故事卡片中收集的。
这也反映了我作为一名作家在媒体上的一年,突出了一些突出的故事,并确定了一些关于提升的关键要点。
我的 2018 上媒
虽然我写博客已经有几年了,但我的出版之旅始于今年早些时候。我已经在 TDS 上发表了我所有的 14 篇数据科学文章,几乎是每月一篇。非常感谢 TDS 团队构建了这个社区,并能够接触到如此高质量的读者群。
我的帖子面向三类读者:a) how-to 文章,帮助那些有志于数据科学事业的,b)讲解者为数据科学从业者揭开技术和方法论的文章,为非技术和业务简化数据科学的文章
我的 14 篇文章已经获得了 86,000+的总浏览量(包括 RSS 浏览量约 120,000 次,转载 和 语言翻译)和 10,000+的掌声。平均每篇帖子有 6000 多次浏览,阅读率约为 40%。
Summary of my stories on TDS
相比之下,哈里森从他的分析中发现,大多数中等水平的文章获得的掌声不到 10 次,而排名前 1%的文章获得的掌声超过 2000 次。大约有 2700 名作家已经完成了这项工作。一致性是罕见的,因为不到 0.3%的这些高度鼓掌的故事有重复作者。
虽然我的点击率最高的故事“””在这个范围内,但它错过了标记为数据科学的故事的截止日期。因此,这是一个目标,以及一致性。
是什么让人们点击你的故事?
许多因素会影响一篇报道的曝光率和浏览量。虽然发布的范围、发布日期、时间和主题都有发言权,但最重要的是帖子的标题。
“除非你的标题能推销你的产品,否则你已经浪费了 90%的钱。”— 大卫·奥格威
我对文章标题做了相当多的试验,但我总是害怕在点击“发布”之前对标题进行精炼的最后阶段。简直是疯了分析 麻痹跑步到深夜,那吃了一个小时,还留下不好的回味。
这似乎对我的故事有用,但我仍在学习其中的诀窍。
媒体世界告诉我们,坏消息很好卖,标题受益于一点负面色彩(失败、挫折、挣扎)。工作物品,我定期使用( 4 种方式、 5 种原因、 3 个阶段)。感性生僻字给单调的标题带来魅力和感染力(秘密’、狂热’、真实原因’)。
一个好标题的秘诀是什么?
虽然我的帖子没有这么多,但《百万媒体故事》在这方面提供了一些有趣的见解。分析那些获得 2000 多个数据科学相关标签的文章,这是我从它们的标题中发现的。
毫不奇怪,大多数标题都有关键词'数据科学'、人工智能'、机器学习'、神经网络'、数据科学家。撇开这些不谈,我们最后得出这个词云:
Wordle.net
大多数标题的结构都是问题'如何'、为什么'、什么',它们很好地吸引了用户。这些帖子兼作讲解者,并使用诸如'介绍'、了解'、学习'、指导'、讲解'、教程'、初学者'等词语。
列表条很突出,有趣的是看到了流行的数字:1-6,10,15。他们把个人与'你'、你'、我们'、我们'联系在一起。故事中确实使用了否定形式,如'而非'、不要'、零',但情感分析在这里可能更有用。
很多帖子都是技术性的,围绕着' python '、熊猫'、 keras '、 jupyter '、 tensorflow '、回归'。好的数字使用个人的,情感的或不常见的词,如'需要知道',' 完成',' 快速',' 自由',' 新',' 大'。
现在,这是一个现成的计算器。
哪些故事让人懒得看?
除了点击之外,大多数故事都无法吸引读者。我自己每天都会打开几十个浏览器标签,其中大部分都没有得到进一步的爱,直到一次浏览器崩溃让它们永远安息。
那么,哪些故事实现了这一壮举?“读数计数与“视图计数没有任何不同,因为两者高度相关(我的有限集合为 96%)。
但是,Medium 的读数 %我对此保持关注,远远超过查看次数。这就是它如何发现隐藏的宝石。
Bigger boxes mean more Views, darker blue is higher Read%
我在数据科学访谈上的头条新闻拥有最高的阅读量(对于一个大分母来说,这是不寻常的高),但接下来的两个故事的浏览量要低得多(# 9-如何炫耀你对分析的热情和# 13-可视化机器学习)。尽管基数较低,但如果被选中,它们还是有可能被阅读。
哪些故事未能实现潜力?
每个作家都有自己最喜欢的故事,他们觉得这些故事很有潜力,但没有得到应有的曝光。好故事总是不了了之。这可能是一个糟糕的标题,不起眼的缩略图,错误的时间或其他因素。
一个人如何超越偏见,从统计上发现具有这种隐藏潜力的人?粉丝转化率(粉丝/阅读)是一个很好的代理。
在所有真正读过这个故事的人中,有多少人被感动到向全世界宣布了这个故事(以及搜索互联网上任何和所有人类活动的信号饥渴算法)。
按照这个标准,我的前三个故事没有一个登上排行榜:
Bigger boxes mean more Reads, brighter blue shows higher fans-to-reads ratio (or underserved potential)
这里最突出的是:“变成独角兽的秘方是什么”、“图形语法如何帮助构思一个伟大的故事”和“为什么人工智能模型非常需要人类来保持令人敬畏”。
必须指出的是,高收视率的故事远远超出了目标受众,所以他们往往表现不佳。
对于 Medium 来说,这是一个添加到统计页面的有用指标。出版物和策展人可以用它来决定哪些故事必须被赋予新的生命。
是什么让一个故事如此受欢迎?
点击并阅读了一个故事后,用户花时间欣赏它是一件大事。毫不奇怪,你会发现许多帖子要求鼓掌或做 gif 演示,尽管 Medium 的策展人讨厌这样做。
作家可能渴望它,但一个故事必须理所当然地赢得它!
The lifecycle of a story: View — Read — Fan
衡量一个故事受欢迎程度的一个好方法是看粉丝给它鼓掌的次数。这与上面的粉丝-阅读比率不同,它只是告诉读者中有多少人转化为粉丝。
现在,我们把门槛设得很高,因为这个人需要按住按钮宝贵的几秒钟来提高鼓掌次数。那些为故事鼓掌 50 次的人,一直到最大可能,你们真的很特别!
由于 Medium 卡显示的只是总点击量,而不是粉丝数,所以我不能对一百万个故事进行统计(也许 Medium 可以添加另一个有用的指标?).对我来说,每个粉丝的平均鼓掌次数是 4.9 次。
再说一次,我的五大故事没有一个占据这里的首位。我的帖子“GANs 神经网络的简单英文解释”最受欢迎,每个粉丝有 6.62 次掌声,紧随其后的是“为什么图形的语法是伟大数据故事的成分”的帖子,有 6.60 分。
Note the spikes in Claps/Fans ratio for the 2 lower-ranked stories (ratio of 6.6)
多长时间算太长?
现在终于谈到一个困扰我很久的问题。一个故事的合适尺寸是多少?阅读时间长是否会让人不点击?或者,当他们看到里面巨大的卷轴时会跳过它吗?
虽然我一直以 1000 字为基准,但我的故事平均 1355 字。我花时间重新起草,使它们更紧凑、更有力。我想知道是否要把真正长的分成几部分。
令我惊讶的是,长篇故事并不是禁忌。如果有什么不同的话,那就是我的长篇小说更受欢迎,阅读率也不相上下。
Note how the stories with 2000+ words shine in the engagement metrics
在我的 3 个 2000 多字的故事中,一个在浏览量中排名前 5,一个阅读率非常高,另一个最受喜爱,拥有最高的掌声/粉丝比率。
可以肯定的是,我检查了百万中等数据集,发现阅读时间和喜欢之间有+10%的相关性(对于喜欢数超过 100 的~200K 的故事)。这证实了用户不会回避长表单。
所以,如果你有一个很长的故事,不要隐瞒。
并且,这里的是一个 excel 表格,里面有我所有的故事链接和统计数据,包括一些比这里显示的更多的数据。你还能发现其他有趣的金块吗?
那么,你下一个故事的要点是什么?
- 特别注意标题,混合使用情感、力量、消极和列表。但是,不要过度。(这个故事我理解对了吗?!)
- 如果你的故事很长,不要担心(这是我第四长的 1700 字)。
- 对你的阅读量保持好奇,如果阅读量太低,反思一下你的内容。在没有公开数据的情况下,也许 30%是一个很好的基准。
- 找到你的哪些故事粉丝转化率(粉丝/阅读)高,哪些最受喜爱(拍手/粉丝)。他们是你的观众最能产生共鸣的人。向他们学习,写得更像他们。
最重要的是,为热爱写作的人写故事,并慷慨地与听众分享你的知识。剩下的迟早会自己解决的。
现在,我点击发布按钮,让这个故事成为另一个统计数据:)
本文使用的工具:Excel、R、TableauPublic 和 Wordle.net。感谢 哈里森 对于中等数据集和分析。
如果你觉得这很有趣,你会喜欢我写的这些相关文章:
- 让你在数据科学生涯中不可或缺的 4 种超能力
- 数据科学家面试失败的 4 种方式
对数据科学充满热情?随意在LinkedIn上加我,订阅我的 简讯 。
如何聘请人工智能顾问
原文:https://towardsdatascience.com/why-hire-an-ai-consultant-50e155e17b39?source=collection_archive---------1-----------------------
所以,你知道你需要一些机器学习/人工智能开发。为什么不自己做呢?简单的回答是,专家比多面手更有经验,因此可以减少你的风险和努力。更长的答案是关于知道地雷藏在哪里,以及好的需求看起来像什么。我是一名机器学习专家,我在美国和加拿大的公司担任顾问,从事合同工作。我也有丰富的发展业务的经验。结合我在该领域工作中获得的经验,我们来谈谈聘请人工智能顾问的问题。
如果你的项目没有资金支持,你最好的选择是尝试与大学实验室合作,以获得一些早期结果。在本文中,让我们假设你的项目是一个企业采用人工智能来改进核心产品的标准案例。因此这是一个的小 R;大 DR&D 项目。有些项目,尤其是创业公司,是一个“大 R;大 D" 风流韵事,那是另一个时代的话题。现在,让我们坚持假设你有一个合适的团队和客户服务器,并希望添加一些尖端的人工智能功能。****
你在找一个人工智能顾问。现在让我们更具体地了解要寻找什么。你想要的是一个比数据科学家更专业的顾问。你需要工程学。机器学习项目很少只涉及数据科学部分。你需要聚集数据,并将其转化为人工智能可以学习的正确格式。有时项目涉及硬件、无线和网络。这就是云和物联网(IoT)。雇佣一个了解你的需求的业务含义的顾问也是有帮助的,有点像管理顾问。你想要一个可以谈论预算、规划和解决方案架构的资源,知道大规模的机器学习部署是什么样子的。这也是一个好主意,尽你所能涉及资助,因为 ML 领域是非常前沿的,应该使你的 R & D 有资格申请一些政府资助项目(在加拿大,这些是 Mitacs 、 OCE 、 NSERC 等。等等。).
雇佣顾问来启动你的人工智能项目的另一个方面是能力建设。您希望在您的公司中构建一些通用基础架构,以提供执行未来机器学习项目的能力,并将知识灌输到您的 devops 团队中,以维护和扩展顾问带来的代码(尽可能/实际)。将人工智能能力融入一家公司可能是一个项目管理和团队建设过程,就像它是一个软件/硬件项目一样。它通常涉及董事会会议,将这些目标与关键绩效指标(KPI)和利益相关者会议联系起来。在设计项目时,让高管、产品经理和高级开发人员在同一个房间里是一个聪明的主意。我准备了许多提案,与投资者和关键意见领袖互动,并向大量观众展示产品。没有两个会议是相同的。这就是为什么当你决定让你的公司进入人工智能领域时,有一位专家在你身边是件好事。
运营和大数据
“幸运青睐有准备的人”(路易斯·巴斯德)。**
向任何一位未来的顾问询问他们最近的工作经历。即使有了 NDA,他们也可以分享一些不被禁止的信息。例如,“描述一下你最近为一个大客户做的项目”可以用来回答“我最近完成了一个项目,涉及一个美国客户的大数据 AI 解决方案的架构和部署。这是一个本地解决方案,从运行 Ubuntu server 和 GPU 的准系统基础架构服务器开始,到能够支持每秒数千个事务的服务结束。他们对结果很满意。我会问他们我是否能和你分享更多细节。”这是一种意料之中的反应。就我而言,我列出了可公开验证的专利、文章和博士学位,以便客户能够了解我的工作水平。我最近在机器学习方面的工作将于 2017 年 7 月在法国尼斯发表(“面向个人计算机用户的无监督深度学习推荐系统”和“面向个人计算机用户的可视化深度学习推荐系统”)。****
在后续工作中,你可能会从一位优秀的顾问那里得到类似下面这样的东西。“回到大数据和云之间的关系,我想谈谈我最近在数据流物理资产的云连接方面的体验。我的团队帮助一个新客户将硬件设备连接到一个云系统,该云系统记录、分析和呈现数据可视化。我们从头开始设计云解决方案,并期望在客户的后续工作声明中,将我们的机器学习分析添加到他们的实时生产解决方案中。”这告诉你,他们了解云和物联网,并乐于大规模进入人工智能领域。**
我的大部分工作都是在非常严格的 NDA 下进行的,所以我在这里提供了我的学术工作或公共领域工作中的例子来说明我在实践中是如何与客户打交道的。但是… 不要让顾问躲在 NDA 后面。特别是如果他们不能为你提供上述陈述,你的顾问应该有一个公开的个人资料,表明他们来自哪里。例如,同行评审的出版物、相关的大学学位、专利、小组讨论、团队等等。以我自己为例,我已经完成了一个硕士学位,课题是在给定硬件限制的情况下,找出软件程序的哪些部分应该在硬件中加速。我的博士论文是关于通过无监督学习向用户推荐行动。所有这些都是为了告诉客户一个可信的故事。看看咨询的网站。是好看,还是他们只是一个邮箱地址和一个空白页?不言而喻,顾问公司应该成立。此外,他们公司的网站是一个很好的方式来判断如何组织顾问真的是。他们基本上是为了钱而做任何事情吗(例如,会为 cookies 编码),或者他们是狭隘地专注于?比如我们这种情况,做 IoT 和 AI,就这样。
预计会遇到一个过程。咨询师热爱过程。通过需求收集和白板会议,希望在编写任何代码之前深入了解解决方案的结构。您应该讨论如何使用该系统,以及如何向客户销售该系统的商业案例。顾问应该与您一起制定一个名为工作说明书(SOW) 的计划,其中包含里程碑和可交付成果,然后让利益相关方参与进来。
每个顾问处理风险的方式都不一样。我对解决方案架构的方法是组织。在我职业生涯的早期,我直接在运营部门工作,数据中心和网络运营是非常严肃的领域,一直让我踌躇不前。如果一个人在运营中拉错了弦,或者在这些服务器中部署了一个错误,那么每个客户都可能会呼叫支持。这是一个高压环境。为了应对这种压力,我对开发团队采用传统的系统架构方法,从开发、集成和生产开始,包括回滚选项、QA 部署验证,以及在每个分发中心定期进行 VPS 备份以降低风险。只要有可能,我建议客户使用云来避免这种运营风险。
我是云解决方案的忠实粉丝。机器学习代码在 GPU 上运行,有时比在 AWS 上运行更便宜。我带来的关键价值是理解和设计软件架构以及所需硬件的能力。你想要的建议是什么时候去云。不是所有的客户都会听,但是所有的顾问都应该能够帮助你决定在哪里构建你的系统(云还是本地)。我经常将 GPU 硬件配置到客户端基础架构中,无论是基于 AWS 的云、数据中心的专用机架中,还是在客户的私有设施中。GPU 硬件设置和部署到生产环境是我理解的事情。这里值得一提的具体技术有 Nginx 用于服务和负载平衡,内存化用于缓存结果以减少延迟和不必要的计算,复制和索引以减轻高流量数据库表的压力,以及 noSQL 等分布式查询系统。我个人的偏好是 postgres,虽然我用过 t-SQL (SQL server)、mySQL 和 Sqlite。经验告诉我要规范化表格,听从 DBA,因为他在数据库方面比任何人都聪明,并且尽可能通过预处理从数据库之外的数据中获取性能。任何优秀的顾问都会做出这样的限制性陈述,宣称他们不是所有事情的专家。如果一个咨询师总是声称自己有专业知识,而不考虑话题,那么你应该担心了。
你雇佣的任何人工智能顾问都必须了解安全。他们经常接触你最敏感的数据。通过参与几个大数据项目,我对云自动化有了一种直观的感觉,这种感觉与安全需求密切相关。我把云,不管是私有的还是公共的,看作是一个 VPS 管理系统。为了建立公司的生产系统,需要许多基础技术,从认证(例如 Oauth2)和授权(例如基于角色的访问控制模式)到 SSL 和防火墙。我经常这样做,从零开始,我熟悉涉及硬件和软件的安全系统(见已批准的专利)以及伴随安全开发项目的威胁模型和安全策略,就像这个职位的帖子中描述的那样。比如 IP 的白名单和黑名单,PPK 认证,RSA 基于令牌的认证等。当然,任何系统都是由使用它的人来决定的。培训员工遵守安全策略对于维护安全基础架构至关重要。
机器学习
现在让我们深入讨论这个关键话题。也就是说,顾问能设计并实现一个机器学习系统来满足你的需求吗?你怎么知道?
Visualization of the output from an image processing neural network classifier in 3D space.
正如我在最近的一篇帖子中描述的那样,机器学习专家很难找到。开发人员很快就掌握了一般知识,这很好,但是更深层次的专业知识很难从短期的在线课程或在线视频中获得。不要误解我的意思,我喜欢这些资源并强烈推荐它们,但是它们不足以给你的开发团队提供他们需要的技能。回顾我的档案,我在 2006 年本科最后一年上了我的第一门人工智能大学课程,当时它还没有风靡一时。在 2009 年至 2017 年以兼职方式完成机器学习博士学位的同时,我一直在从事一系列与机器学习相关的非常有趣的工作,一直追溯到我在 Zip.ca(重大公司)的工作,在那里我设计了一个推荐系统并进行运筹学研究(例如整数线性规划、组合优化、背包问题、转运问题等)。我在加州 Zip 公司的任务是找到一个“好的”DVD 分配给客户,给出一个客户需求列表和每个分销中心的 DVD 供应情况。这部作品与网飞在加拿大展开了激烈的竞争。
对于一个你不认识的顾问,总是指望从一个小的概念证明开始,向自己证明这个顾问了解他们的东西。与顾问合作,想出一个唾手可得的项目。一些他们不需要太多开发工作就可以快速交付的东西(例如,基于他们已经拥有的现有代码,以及你已经收集的数据)。如果这第一步进展顺利,那么你就可以自信地转移到更大的项目范围。
不要过多考虑顾问用的是什么工具,只要是行业标准就行。我用 python 完成了大部分机器学习工作,我选择的框架是 Tensorflow 1.0 和 scikit-learn。我有时使用 Keras。我的代码几乎总是在 GPU 中运行。只要有可能,我就重用现有的机器学习模型,而不是从头开始构建它们。期待顾问向你展示如何通过重用现有的人工智能代码来节省每个人的时间和金钱。
请顾问概括描述部署。我举的一个图像处理项目的例子是这样的:“我采用了卷积神经网络(CNN)和监督学习来根据标记数据区分图像类别。例如,区分患者身上的伤口、基于外观检测产品之间的差异以及其他这样的图像分类任务。在生产中,我会使用一个支持 GPU 的 VPS 和一个服务器,如 Flask 和一个负载平衡器(nginx ),使这些模型具有高吞吐量。训练一个完整的 CNN 可能是时间密集型的,因此作为了解观察到的特征的第一步,我使用了来自现有 CNN 的迁移学习,以查看标记数据聚类中感兴趣的特征在多大程度上分类为期望的类别。在监督学习之外,当没有足够的标记数据用于监督学习时,我部署了非监督学习模型。有时,维度缩减适用于无监督学习(例如,对于聚类,我使用 t-SNE,有时使用 PCA 或 K-means)。”**
然而,对于一个文本处理项目,我会这样回答:“我是单词嵌入模型的超级粉丝。对于这种类型的任务,我使用 word2vec 和/或 GloVe,或者与 Tensorflow 一起使用,或者直接在 python 中使用,并利用现有的模型,如 google news vectors 和 wikipedia,或者基于文本语料库或客户的数据集构建自己的模型。我们可以更详细地研究许多其他机器学习模型,包括 RNN 和 LSTM 等生成模型,以及情感分析等更新的学习模型,等等。”**
结论
希望这篇文章能帮助你决定和谁一起做机器学习顾问。最重要的是,你雇佣的人工智能顾问不仅仅是一名数据科学家。你希望他们在从需求到部署的整个系统设计中提供帮助,并帮助进行能力建设,以便你在 devops 团队中的内部资源可以支持 AI 基础设施和代码。期望顾问有一些与你合作的过程,包括一份设定明确期望的工作说明书。问一个潜在的顾问一些棘手的问题,并确保你得到一些最近的工作历史和高级别的确认,他们了解你的项目的风险、安全性和云组件。请他们用一般术语描述一个部署,并尝试让他们尽可能重用现有的 AI 代码,从而节省您的金钱和时间。调查政府拨款以及它们如何应用于你的项目。最后,即使顾问看起来很棒,也要从一个小的概念验证开始,以确保他们能满足你的期望。
编码快乐!
——丹尼尔
丹尼尔@lemay.ai ←打个招呼。
LEMAY . AI
1(855)LEMAY-AI
您可能喜欢的其他文章:
- 人工智能和不良数据
- 人工智能:超参数
- 人工智能:让你的用户给你的数据贴上标签
为什么医院需要更好的数据科学
原文:https://towardsdatascience.com/why-hospitals-need-better-data-science-7816675f4b7?source=collection_archive---------2-----------------------
可以说,航空公司比医院在运营上更复杂,资产更密集,监管更严格,但迄今为止,在保持低成本并获得可观利润的同时,表现最好的航空公司比大多数医院做得更好。例如,西南航空公司已经想出了如何做好最重要的两件事:让更多的飞机更频繁地停在空中,并且比任何人都更频繁地给每架飞机加油。类似地,其他复杂、资产密集型、基于服务的行业的赢家——亚马逊、运营良好的机场、UPS 和联邦快递——已经知道如何超额兑现承诺,同时保持精简和实惠。
这些例子与医疗保健有关,有两个原因。
首先,医院运营在许多方面类似于航空公司和机场运营以及运输服务。服务运营中有许多步骤(办理登机手续、行李、安检线、登机口),每个步骤都有很高的可变性(天气延误、拥堵、机械问题),用户旅程中有多个相互关联的环节,所有这些操作都涉及人,而不仅仅是机器。用数学术语来说,医院运营,就像航空和运输一样,由数百个小流程组成,其中每一个都比组装汽车的步骤更随机,更不确定。
第二,今天的医院面临着零售、运输和航空公司多年来面临的同样的成本和收入压力。正如西南航空、亚马逊、联邦快递和 UPS 所证明的那样,为了保持生存,资产密集型和服务型行业必须简化运营,少花钱多办事。医疗保健提供商不能通过投资越来越多的基础设施来摆脱困境;相反,他们必须优化现有资产的使用。
要做到这一点,提供商需要一如既往地做出优秀的运营决策,就像其他行业一样。最终,他们需要为他们的医院创建一个可操作的“空中交通控制”—一个具有预测性、不断学习并使用优化算法和人工智能在整个系统中提供规范性建议的集中式命令和控制能力。数十家医疗保健组织正在通过使用包括 LeanTaaS、Intelligent InSites、Qgenda、Optum 和 IBM Watson Health 在内的提供商提供的平台来简化运营。这些解决方案的共同点是能够挖掘和处理大量数据,以便向管理和临床最终用户提供建议。
通过数据科学提高医院运营效率可以归结为应用预测分析来改善关键医疗服务流程的规划和执行,其中最主要的是资源利用率(包括输液椅、手术室、成像设备和住院病床)、员工安排以及患者入院和出院。如果做得好,提供者会看到患者访问率(容纳更多患者,更快)和收入的增加、成本的降低、资产利用率的提高以及患者体验的改善。这里有几个例子:
增加或利用。对于一种为大多数医院带来超过 60%的入院率和 65%的收入的资源来说,当前的块调度技术在优化手术室时间和改善患者访问、外科医生满意度和护理质量方面远远不够。当前的技术—电话、传真和电子邮件—使得数据块计划的更改变得繁琐、容易出错且缓慢。利用预测分析、移动技术和云计算,提供商正在挖掘利用率模式,以大幅改善调度。
例如,移动应用程序现在允许外科医生和他们的日程安排者一键请求他们需要的封锁时间。在科罗拉多州的 UCHealth,调度应用程序允许患者更快地接受治疗(外科医生释放不需要的块的速度比手动技术快 10%),外科医生获得更好的控制和访问(外科医生每月释放的块的中值数量增加了 47%),整体利用率(和收入)增加。借助这些工具,UCHealth 的人均收入增加了 4%,这相当于每年增加 1500 万美元的收入。
大幅削减输液中心等待时间。输液调度是一个极其复杂的数学问题。即使对于一个有 30 个座位的中心来说,以病人为中心的方式避免上午 10 点到下午 2 点的“高峰时间”也需要从一个 googol (10100)的可能解决方案中选择一个。面对这一挑战,纽约长老会医院应用预测分析和机器学习来优化其日程模板,从而将患者等待时间减少了 50%。除了改善长期患者排班之外,这些技术还可以帮助排班员管理输液中心的日常不确定性(最后一分钟的附加服务、延迟取消和缺席),以及优化护士的工作量和休息时间。
简化 ED 操作。急诊科因瓶颈而闻名,无论是因为患者在排队等待化验结果或成像,还是因为该部门人手不足。分析驱动的软件可以确定最有效的 ED 活动顺序,显著减少患者等待时间。当一名新患者需要进行 x 光检查和抽血时,了解最有效的顺序可以节省患者的时间,并更明智地利用急诊资源。软件现在可以显示历史滞留时间(也许周三 EKG 的人员短缺问题需要解决),并实时显示每个病人在该部门的旅程和等待时间。这使得提供商能够消除反复出现的瓶颈,并呼叫工作人员或立即重新安排患者流量以提高效率。例如,埃默里大学医院使用预测分析来预测患者在一天中的时间和一周中的日期对每一类实验室测试的需求。这样,提供者将患者的平均等待时间从 1 小时减少到 15 分钟,从而相应地减少了急诊瓶颈。
急诊转住院床位。预测工具还可以让医疗服务提供者预测患者需要入院的可能性,并提供哪个或哪些病房可以容纳他们的即时估计。有了这些信息,住院医生和急诊医生可以很快就可能的入职流程达成一致,这可以让入职链上的每个人都可以看到。这种数据驱动的方法也有助于提供者优先考虑哪些床位应该首先清洁,哪些单元应该加速出院,以及哪些患者应该转移到出院休息室。圣地亚哥的 Sharp HealthCare 使用数据驱动的集中式患者物流系统,将其入院订单占用时间减少了三个多小时。
加速出院计划。为了优化出院计划,个案经理和社会工作者需要能够预见和防止出院延迟。电子健康记录或其他内部系统通常会收集有关“可避免的出院延迟”的数据,即上个月、上个季度或上一年因保险验证问题或缺乏交通工具、目的地或出院后护理而延迟的患者。这些数据对提供商来说是一座金矿;使用适当的分析工具,在患者到达并完成其文书工作的一个小时内,提供商可以相当准确地预测其数百名患者中谁最有可能在出院期间遇到麻烦。通过使用这些工具,病例管理人员和社会工作者可以创建一个高优先级患者的名单,一旦患者入院,他们就可以开始制定出院计划。例如,DC 华盛顿州的 MedStar Georgetown 大学医院使用出院分析软件,将其日出院量增加了 21%,住院时间减少了半天,并将早晨出院量增加到日出院量的 24%。
每天数百次持续做出卓越的运营决策,需要复杂的数据科学。正确使用分析工具可以降低医疗保健成本,减少等待时间,增加患者访问,并释放现有基础设施的容量。
这篇文章最初出现在哈佛商业评论。
Sanjeev agr awal是LeanTaaS的总裁兼首席营销官。Sanjeev 是谷歌的第一任产品营销主管。从那以后,他在三家成功的初创公司担任过领导职务:移动推送平台 Aloqa 的首席执行官(被摩托罗拉收购);Tellme Networks(已被微软收购)产品和营销副总裁;以及作为 Collegefeed(被 AfterCollege 收购)的创始 CEO。Sanjeev 毕业于麻省理工学院,获得 EECS 学位,并在麦肯锡公司和思科系统公司工作过。他是一个狂热的壁球运动员,并被贝克尔的《医院评论》评为医疗保健创新领域的顶级企业家之一。
为什么、如何以及何时应用特征选择
原文:https://towardsdatascience.com/why-how-and-when-to-apply-feature-selection-e9c69adfabf2?source=collection_archive---------1-----------------------
现代数据集的信息非常丰富,数据是从数百万个物联网设备和传感器收集的。这使得数据变得高维,拥有数百个要素的数据集很常见,甚至达到数万个也不罕见。
特征选择是数据科学家工作流程中的一个非常重要的组成部分。当呈现非常高维度的数据时,模型通常会阻塞,因为
- 训练时间随着特征数量呈指数增长。
- 随着特征数量的增加,模型具有越来越大的过度拟合的风险。
特征选择方法有助于解决这些问题,方法是在不损失太多信息的情况下降低维数。这也有助于理解这些特性及其重要性。
在本文中,我将讨论以下特征选择技术及其特点。
- 过滤方法
- 包装方法和
- 嵌入式方法。
过滤方法
过滤方法考虑特征和目标变量之间的关系来计算特征的重要性。
方差比检验
f 检验是一种统计检验,用于模型之间的比较,并检查模型之间的差异是否显著。
f 检验对模型 X 和 Y 进行假设检验,其中 X 是仅由常数创建的模型,而 Y 是由常数和特征创建的模型。
比较两个模型中的最小二乘误差,并检查模型 X 和 Y 之间的误差差异是否显著或偶然引入。
f 检验在特征选择中是有用的,因为我们知道每个特征在改进模型中的重要性。
Scikit learn 提供使用 F-Test 选择 K 个最佳特性的。
sklearn.feature_selection.f_regression
对于分类任务
sklearn.feature_selection.f_classif
使用 f 检验来选择特征有一些缺点。F-Test 检查并仅捕获要素和标注之间的线性关系。高度相关的特征被给予较高的分数,而不太相关的特征被给予较低的分数。
- 相关性具有很强的欺骗性,因为它不能捕捉强非线性关系。
2.使用像相关性这样的汇总统计可能是个坏主意,正如安斯科姆的四重奏所展示的那样。
Francis Anscombe illustrates how four distinct datasets have same mean, variance and correlation to emphasize ‘summary statistics’ does not completely describe the datasets and can be quite deceptive.
交互信息
两个变量之间的互信息衡量一个变量对另一个变量的依赖性。如果 X 和 Y 是两个变量,并且
- 如果 X 和 Y 是独立的,那么知道 X 就无法得到关于 Y 的任何信息,反之亦然。因此它们的相互信息是 0 。
- 如果 X 是 Y 的确定性函数,那么我们可以用互信息 1 从 Y 确定 X ,从 X 确定 Y 。
- 当我们有 Y = f(X,Z,M,N)时,0 < mutual information < 1
We can select our features from feature space by ranking their mutual information with the target variable.
Advantage of using mutual information over F-Test is, it does well with the non-linear relationship between feature and target variable.
Sklearn offers feature selection with Mutual Information for regression and classification tasks.
sklearn.feature_selection.mututal_info_regression
sklearn.feature_selection.mututal_info_classif
F-Test captures the linear relationship well. Mutual Information captures any kind of relationship between two variables. http://scikit-learn.org/stable/auto_examples/feature_selection/plot_f_test_vs_mi.html
Variance Threshold
This method removes features with variation below a certain cutoff.
The idea is when a feature doesn’t vary much within itself, it generally has very little predictive power.
sklearn.feature_selection.VarianceThreshold
Variance Threshold doesn’t consider the relationship of features with the target variable.
Wrapper Methods
Wrapper Methods generate models with a subsets of feature and gauge their model performances.
Forward Search
This method allows you to search for the best feature w.r.t model performance and add them to your feature subset one after the other.
Forward Selection method when used to select the best 3 features out of 5 features, Feature 3, 2 and 5 as the best subset.
For data with n features,
->在第一轮中,创建具有单独特征的“N”个模型,并选择最佳预测特征。
->在第二轮中,用每个特征和先前选择的特征创建“n-1”个模型。
->重复这一过程,直到选择了“m”个特征的最佳子集。
递归特征消除
顾名思义,这种方法一个接一个地消除特定模型上表现最差的特征,直到知道特征的最佳子集。
Recursive elimination eliminates the least explaining features one after the other. Feature 2,3 and 5 are the best subset of features arrived by Recursive elimination.
对于具有 n 个特征的数据,
->在第一轮中,“n-1”个模型结合了除一个特征之外的所有特征。性能最低的特征被移除
->在第二轮中,通过移除另一个特征来创建“n-2”模型。
包装器方法通过广泛的贪婪搜索向您承诺一组最佳的特性。
但是包装方法的主要缺点是需要训练的模型数量庞大。它在计算上非常昂贵,并且对于大量特征是不可行的。
嵌入方法
特征选择也可以通过一些机器学习模型提供的洞察力来实现。
套索线性回归可用于特征选择。套索回归是通过在线性回归的成本函数中增加一个额外的项来实现的。这除了防止过度拟合之外,还将不太重要的特征的系数降低到零。
The highlighted term has been added additionally to Cost Function of Linear Regression for the purpose of Regularization.
As we vary ƛ in the cost function, the coefficients have been plotted in this graph. We observe that for ƛ ~=0, the coefficients of most of the features side towards zero. In the above graph, we can see that only ‘lcavol’, ’svi’, and ‘lweight’ are the features with non zero coefficients when ƛ = 0.4.
基于树的模型计算特性的重要性,因为它们需要将性能最佳的特性保持在靠近树根的位置。构建决策树包括计算最佳预测特征。
Decision Trees keep the most important features near the root. In this decision tree, we find that Number of legs is the most important feature, followed by if it hides under the bed and it is delicious and so on. https://www.safaribooksonline.com/library/view/data-science-from/9781491901410/ch17.html
基于树的模型中的特征重要性基于基尼指数、熵或卡方值来计算。
与数据科学中的大多数事情一样,特征选择高度依赖于上下文和数据,并且对于特征选择没有一站式解决方案。最好的方法是了解每种方法的机制,并在需要时使用。
我主要使用特征选择技术来获得关于特征及其与目标变量的相对重要性的见解。请在下面评论你使用的特征选择技术。
为什么我选择 BigQuery 进行事件分析,为什么你也应该这样做
原文:https://towardsdatascience.com/why-i-chose-bigquery-for-events-analytics-d4c412d583b7?source=collection_archive---------13-----------------------
Photo by ev on Unsplash
在每一个创业公司,都有你必须设计大规模分析事件摄取的时候。
主要的想法是,你有一个后端日志事件,你想有关于他们的分析见解。
这几乎是经典的数据工程任务之一。
你对创业公司的要求可能听起来像这样:
- 你想要一个可管理的解决方案
你不想花费大量的工程精力和时间。你想迭代…而且你想快速完成。你希望你的注意力集中在产品的开发上,而且要做得好、做得快。花在管理基础设施上的时间越少,可能越好。 - 您希望能够在事件发生后尽快查询事件 这并不总是一个要求。通常,你想对过去的事件进行分析,但你并不在乎在事件发生后的第二天你是否能做到。例如,当您需要为用户提供帮助,并且您需要知道特定用户发生了什么事情时,您实际上几乎必须立即做这件事。
- 保持成本可控 显然,没有人愿意支付不必要的费用。
- 如果需要,能够在短时间内大规模扩展 这是一个好方法。通常,你想构建最简单的东西来解决你的问题,但不是更简单。此外,您希望有一种好的方法来最终扩大规模,而不必从头开始重建一切。这有时会发生,不过没关系。
如果你看看市场,几乎有无限多的解决方案…哪一个是最好的?嗯,这真的取决于你的用例。
对我来说,有三个主要角色:
- BigQuery
- 亚马逊红移
- 亚马逊红移光谱
BigQuery
BigQuery 是 Google analytics DB。
它由 Colossus (Google 分布式文件系统)提供动力,每个查询由 Dremel (Google 查询引擎)转化为执行树,数据从 Colossus 中检索并聚合……一切都运行在 Google Jupiter 高速网络上。
作为一个分析数据库,BigQuery 使用列存储。如果您不熟悉这种存储,它不同于传统的事务数据库,后者按行存储数据。这样做是为了反映通常在分析数据库上执行的查询类型。
通常,你会有这样的东西:
SELECT foo, bar
FROM sales_events
WHERE timestamp between '2018–01–05' and '2018–01–09'
如您所见,我们查询了少量的列(本例中为 2 列),但是我们处理的数据量可能非常大(整整一个季度的销售事件)。按列存储数据将使这变得更容易。
亚马逊红移
Redshift 是分析数据库领域的另一个大玩家。这是亚马逊的分析数据库,它使用列存储(如 BigQuery)并且是完全托管的(如 BigQuery)。
红移光谱
红移光谱是亚马逊提供的一个非常有趣的分析解决方案。Spectrum 背后的想法是使用 S3 作为数据源,允许在其上运行 SQL 查询。为了获得与 Redshift 和 BigQuery 相当的性能,您实际上需要以列格式“手动”存储数据(通常选择 Apache Parquet 格式)。
雅典娜呢?
亚马逊的雅典娜在原理上给出了相同功能的红移光谱,有一些差异。
我发现 Spectrum 更有趣,因为我们已经运行了红移,它与 Spectrum 的集成比 Athena 更好。
最后我选择了 BigQuery,就这样!
Photo by Javier Allegue Barros on Unsplash
方便用户的
BigQuery 不使用索引:随着数据大小的增长,BigQuery 只是增加更多的服务器,这样性能几乎保持不变。在 BigQuery 中,每个查询都是一个表扫描,我认为这很好。尽管如此,性能还是惊人的好。
红移可能更有性能,但是你需要明智地选择主键和排序键。看到一个性能很差的红移实例是很常见的,只是因为键没有被很好地计划。
排序键用于加速查询和提高列数据库的压缩,这对您的成本和系统性能有很大的影响。
红移光谱和 Athena 将需要更多的工程工作,因为我们需要以正确的格式手动存储数据以获得良好的性能。
扩大规模的潜力
首先,您可以将插入数据流式传输到数据库中。在 BigQuery 中,你可以使用 stream insert,而在 Redshift 中,使用 Amazon Kinesis Data Firehose 可能是个好主意。Kinesis Firehoses 已经设置为与 Amazon storages(如 Redshift)一起工作,并不断向其写入数据,同时提供一些容错排队机制。
最终,您将生成太多的数据,无法直接流入 DBs,并且可能会遇到一些限制(成本或服务中的一些配额)
我认为 BigQuery 为这个问题提供了最简单的解决方案。
基本上,您可以决定哪些数据需要立即查询,哪些不需要,然后将它们放在两个不同的路径上。
第一个(热路径)直接流式传输到 DB,另一个存储在其他地方,然后批量插入 DB(这是 Google 云平台免费提供的操作)。
该图很好地展示了这一点,摘自 Google 博客。
红色的路径是热的,而蓝色的是冷的。
source: https://cloud.google.com/solutions/architecture/optimized-large-scale-analytics-ingestion
有了红移,我觉得就没那么直白了(但我可能错了)。
一种解决方案是将传入的数据存储在 DynamoDB 上,供立即需要的查询使用,稍后您可以将所有数据批量传输到红移或 S3 以获得频谱。
整个流水线的架构会是这样的(这里用 Athena 代替 Spectrum 或者 Redshift,但原理是一样的)。
source: https://aws.amazon.com/blogs/database/how-to-perform-advanced-analytics-and-build-visualizations-of-your-amazon-dynamodb-data-by-using-amazon-athena/
费用
BiqQuery 是按查询和存储收费的…其他的几乎都是免费的。加载数据是免费的,但你需要支付流媒体插入费。
这意味着在某些用例中,它可能非常便宜。可能在许多分析应用程序中,您将扫描/返回大量的行,而这些行通常不是很大(数据结构方面)。
红移按节点收费。数据越多,需要的节点就越多。另一方面,亚马逊保留了实例支付计划,基本上你承诺使用服务 1 至 3 年,你可以预先支付一些钱。这可以为您节省原价的 70%。尽管如此,对于一家初创公司来说,致力于长期计划可能不是一个好主意。
红移光谱也可以很便宜,基本上,它是根据你处理的数据量收费的(有点像 BigQuery)。
结论:我们已经了解了如何在现实生活中设计一个事件摄取问题。市场上有不同的解决方案,每一个都有自己的优点和缺点。我们研究了 BigQuery 在某些用例中如何成为一个好的解决方案,并将其与 Redshift 和 Redshift Spectrum 等替代方案进行了比较。
如果您喜欢这篇文章,并且觉得它很有用,请随意👏或者分享。
干杯!
为什么我放弃了大会硕士课程
原文:https://towardsdatascience.com/why-i-forfeited-my-masters-program-for-general-assembly-6a8fd844ec9f?source=collection_archive---------8-----------------------
2016 年秋季,我面临一个选择,是继续攻读乔治华盛顿大学的商业分析硕士学位,还是重新开始大会的数据科学沉浸式学习。虽然拥有学位很诱人,但大会提供了许多不容忽视的优势。
为什么我决定攻读硕士学位
我花了七年时间从事政治竞选工作,其中五年专注于竞选数据。虽然我在我的组织中的角色对竞选活动至关重要,但它更多的是技术性的,而不是战略性的。我对我们的分析团队和分析供应商中的同行所做的事情非常感兴趣。事实上,他们有工具来模拟选民的行为,一直到单个选民,这看起来很强大。我喜欢用数据来帮助组织决策的想法,这也是我申请 GWU 大学硕士课程的原因。
我在 2015 年秋季开始了我的硕士项目。虽然开始时我非常兴奋,但这种感觉很快就消失了。我发现无法平衡我当前职位和我的主人的要求。我还发现,我的工作和为我的组织实现 2016 年选举目标的努力做出的贡献更具启发性。我决定推迟学业继续工作。
【2016 年 11 月来了又走了
虽然我在选举前就知道我已经准备好改变了,但选举的结果使这种改变具体化了。我已经在同一家公司以不同的身份工作了五年,但我真的需要一些东西把我带到职业生涯的下一个层次。距离下一次重大选举还有两年,我知道我可以培养一个人来接替我的位置,而不会让我的组织陷入困境。
我知道无论我参加什么项目,我都需要全力以赴,以免像去年一样遇到寻找平衡的问题。我不想在 1 到 2 年内失业,就像全心全意奉献给 GWU 所要求的那样。
大会在这个意义上更有吸引力,因为它是一个 3 个月的项目。同样是 1.5 万美元,而 GWU 是 5 万美元。
我现在已经完成了一半多,我很满意。除了在时间和金钱上更加实惠之外,g a 似乎更加面向项目。博客、项目和顶点都提供了探索的机会,这有助于我寻找的智力刺激。
我为什么开始学习机器
原文:https://towardsdatascience.com/why-i-got-started-with-machine-learning-8ca06f31ac13?source=collection_archive---------19-----------------------
Photo by Franki Chamaki on Unsplash
因为我一直热爱技术,所以我有探索新技术的习惯。我喜欢阅读科技世界正在发生的事情,以及这些新技术如何颠覆当前的行业。
最近,当我在探索和广泛阅读最新技术对我们生活的影响时,我很快注意到有几个术语几乎随处可见:人工智能、数据科学、机器学习、深度学习。
虽然,技术上不对,让我们把这些技术统称为 AI(人工智能)。
我有点被迷住了,我开始漫不经心地阅读它们,因为这些技术很自然地似乎有可能颠覆任何可以想象的行业。我在 YouTube 上浏览了几个关于人工智能的视频,读了几篇文章,了解了它的一些应用,决定学习它对我来说太难了(相信我,它可能会令人生畏!)就是这样。
虽然这些术语在我脑海中停留了很长时间,但某种东西让我相信,进入人工智能世界的冒险对我来说太难了,我没有足够的潜力来完成它。由于这些假设,我甚至没有开始的方向。
那是 2018 年 4 月,我刚从电气工程专业毕业。我刚刚开始我的第一份(目前的)工作,是一名汽车工程师。几个月后,我和一个大学同学计划了一次见面。我们很自然的拍了几张自拍然后就发生了!Google Photos 在快照中认出了我的朋友,问我是否想给她加标签(它说,‘想给 Muskan 加标签’或者可能是‘想和 Muskan 分享这张照片’,之类的)。)!锦上添花的是,我最近买了一部新手机,它和那个人没有任何关系。
当我进一步调查此事时,我知道这是谷歌部署的深度学习算法,可以根据你的账户活动识别你快照中的人。更准确地说,当你用谷歌账户登录你的安卓设备并用它拍照时,如果你碰巧在这些照片中标记了这个人几次(只是几次),谷歌的算法就会识别这个人,即使你更换了你的设备并用以前的账户登录到一个新设备,谷歌的算法也能检测到他们。
现在,有些人(包括我)可能会说这是对个人隐私的侵犯,但我被这项技术的美丽和强大震撼了!这可能看起来没什么,因为脸书也有自动标签功能,但那一刻改变了我的想法。我现在确信我想让学会这些,在那一刻,我所有的幽灵都消失了。
我重新开始了我在学习人工智能领域的研究,通过不懈的努力,我学到了很多。我不会说我知道所有关于它的事情,但我知道的比几个月前还多。我比昨天知道的更多。我现在知道我能做到!我开始相信,任何拥有正确心态和专注努力的人都可以学习人工智能,并成为能够改变我们所知世界的技术的一部分。
我想列举几个人工智能领域的一些漂亮的应用,我相信它们可以激励这个领域的任何新手向前迈进:
推荐系统
你有没有注意到亚马逊是如何知道你想买什么,并向你展示这些产品的?或者,网飞怎么知道你喜欢看什么类型的节目/电影?这就是人工智能在起作用。这种被称为推荐系统的系统会记录你的活动历史,并产生对你来说意义重大且独一无二的见解。
现在,想象一下为亚马逊上的数十亿用户和网飞上的数百万观察者扩展这项技术。想象一下这个系统设计得如此美丽和复杂,以至于它的每个用户都有独特的体验。这种系统效率很高,如果实施正确,可以产生很好的效果,并显著增加利润。
‘Because you watched’ is AI at work
图像识别系统
正如我已经讨论过的,这是我最初开始的原因。正如我已经解释过的,人脸识别系统非常强大。这些是美丽的艺术品!
除了面部识别系统,这项技术还被扩展到设计这样的系统,它可以根据人的面部表情来检测人的当前情绪。一旦检测到情绪,这种系统可以根据它来设置空气,比如根据情绪播放音乐,或者根据情绪调节灯光。这一切都可以通过 AI 和物联网(IoT)的微妙结合来实现。
一个伟大的研究领域是让一个人工智能解释图片中发生的事情。这旨在为图片添加标题,就像人类一样(不是我们的 Instagram 标题!当心!我们现在有点太远了)。
下图就是一个例子:
Source
这就是我所说的!这简直太棒了!
现在让我们看看这个领域是如何改进的。
Source
在这张图片中,顶部的图片显示了旧人工智能的字幕,而底部的图片显示了字幕的改进程度。这太神奇了!
语音识别系统
你体验过 Siri 的机智吗?或者,有现成结果的谷歌助手?或许还有 Cortana …呃..用什么?所有这一切都是由基于自然语言处理的人工智能系统驱动的。
这里说得够多了。
自动驾驶汽车
不再需要人类司机的未来并不遥远。随着优步、特斯拉、Lyft 和谷歌等大公司投入数百万美元开发自动驾驶汽车,该领域的研究是目前最热门的研究之一。这种汽车将由核心的强化学习算法驱动。
一旦一个可靠的学习算法到位,人类将能够避免每年因道路事故造成的数百万人死亡。
道路会更安全,交通堵塞的问题也可以消除。
Source
这种运输方式是多么复杂啊!
卫生保健
这是一个本身就非常令人兴奋的领域。这是因为基于医疗保健的人工智能系统的目标不是最大限度地点击广告或标记照片中的人,而是以非常积极的方式直接影响数百万人的生活。
人工智能可以帮助文学拯救生命。研究表明,基于人工智能的机器人可以以最大的精度进行复杂的手术,因此由于人为错误造成的伤亡可以大大减少。人工智能在癌症等威胁生命的疾病的早期诊断方面显示出巨大的潜力。这种系统在大规模、有组织地临时准备和实施时,可以帮助拯救数百万人的生命。
人工智能研究人员声称,基于人工智能的系统是我们找到治疗癌症、阿尔茨海默病等痛苦和威胁生命的疾病的最安全和最快的途径。
在这个应用程序中,我个人喜欢的是,尽管医学科学本身是一个非常独特的研究领域,需要多年的努力才能掌握,但任何拥有正确人工智能技能的人都可以在基于人工智能的医疗系统中工作,并在拯救生命方面做出小小的贡献!多美啊!
Source
教育
人工智能具有颠覆教育行业的巨大潜力。一个非常好的应用是,基于人工智能的系统可以部署在机构中,以对学生的试卷和作业进行评分。这将帮助教师节省宝贵的时间,这些时间可以用来学习新概念或帮助学生取得进步。这也将减少学生之间的偏见。
并非所有人生来都一样。因此,自然地,我们都拥有不同的技能。但是传统的教育系统旨在给每个人提供相同的内容。这一直是一个问题,因为大多数人无法与课程保持一致,因此最终表现不佳,甚至可能从未意识到自己的潜力。基于人工智能的系统可以帮助消除这个问题。我们可以设计这样的系统,它可以根据各种指标评估学生的潜力或目标,然后推荐这样的课程/课程,帮助他们实现目标,而不是做一只绵羊。
A few advantages for students
最后的话
人工智能是一项在许多领域都显示出巨大前景的技术。以重复我自己为代价,我想说,任何人只要有正确的心态和努力的意愿,都可以学习人工智能,并为人类社会的发展做出贡献。
如果你刚刚起步,你不需要花一大笔钱从名牌大学获得硕士或博士学位。你几乎可以免费开始。有很多像 Coursera、Udemy、Udacity 等平台可以让你立刻进入这个领域。
谷歌搜索一下,你的旅程就开始了!
人工智能可以实现任何可以想象的事情。你所需要做的就是想象和工作!
如果你喜欢这篇文章,请留下一些掌声。有帮助!
感谢你读到这里,祝你的人工智能之旅一切顺利!
为什么我离开了我在投资银行的第一份工作?
原文:https://towardsdatascience.com/why-i-left-my-first-job-at-an-investment-bank-4ea24e953c3e?source=collection_archive---------2-----------------------
毕业后,我开始在一家领先的投资银行工作,担任金融分析师。这个角色令人兴奋;我过去常常与伦敦的交易部门联络,解释他们日常交易活动中的风险变化。
尽管如此,我还是在六个月后辞去了工作。虽然我很感谢我在银行获得的机会,但这并不符合我对新技术工作的热情。辞去一份好工作去寻找一些非常不同的东西可能违背传统智慧,但我不得不做出这个大胆的职业选择。
我的大学故事和第一份工作
我毕业于果阿比茨皮兰尼大学,获得数学硕士学位和机械工程学士学位。在我高三结束的时候,我为了我的第一份工作搬到了孟买。就这样和一些很有天赋的人开始了一段有趣的旅程。然而,仅仅几个月后,我意识到我的技能停滞不前了。此外,由于我对统计、优化和更新技术领域的浓厚兴趣,我被机器学习和人工智能吸引住了。
一个晴朗的日子,我决定暂停工作去追求我在这些领域的兴趣。
我的职业生涯中断了
一开始并不容易。在过去的几年里,我没有接触过编码。醒来后不去工作的这种突然的空虚感开始困扰着我。但是往好的方面想,我现在一天有 24 小时属于自己。
本人数学功底很强,大三大二的时候做过竞技编程。然而,没有计算机科学学位并试图从财务角色向技术角色过渡对我来说很困难。我开始做 Python 和数据分析库的在线课程,开始做 Jupyter/IPython 笔记本。
很快,我开始在吴恩达的 Coursera 上学习我的第一门机器学习课程。我还在 Udacity 上注册了一个纳米学位项目。几个星期后,我开始做 Kaggle、UCI 机器学习库和其他公共数据集的项目。我已经将我的大部分项目发布到了我的 GitHub 上。
我的对《权力的游戏》书籍的分析,是我在一个周末花了几个小时做的一个项目,在媒体数据科学出版物上出现,我从我的同事和熟人那里得到了积极的反馈。
我的求职
在熟练掌握监督和非监督学习算法、特征工程和模型评估之后不久,我就开始钻研 NLP 和深度学习。我开始在 Udacity 上做 Google 的深度学习课程,在斯坦福大学做 Christopher Manning 教授的 NLP 课程。
我也积极地开始寻找一个数据科学家 / 机器学习工程师的角色。具有深度学习的自然语言处理深深吸引了我,我的目标是解决该领域中一些最困难和最具挑战性的问题。我会继续学习,寻找机会。
开发商长期以来一直认为,求职者应该有一个强大的公共投资组合,因为通过自学和副业项目展示的经验可以解释相关学位的缺乏。我将继续在我的中型账户上添加我关于机器学习和 NLP 的想法和项目。
如果你有兴趣了解我的项目,或者你知道哪些公司正在寻找有激情的人,请给我发电子邮件到 shubhamagarwal328@gmail.com。
我还将写另一篇关于我如何利用休息时间阅读、写博客和旅行的文章。你可以在 Medium 上关注我以了解最新消息。
干杯。
为什么我认为 AI 可以接管人类。
原文:https://towardsdatascience.com/why-i-think-ai-can-take-over-humans-53c79a5a9fce?source=collection_archive---------4-----------------------
在听了一个关于云技术和 API 发展的内容丰富的演讲后,我感到非常幸运今天有 Google 在我们身边。作为一名本科生,我可以看到谷歌是如何让我的创造力向大量的想法敞开大门的。随着我想象力的拓展,谷歌已经通过使用他们的 API 简化了机器学习任务,而不需要理解算法是如何工作的。我创建了我的第一个项目,根据一个人的照片,给这个人的吸引力打分。整个程序是使用 2 个 Google Cloud APIs 开发的。谷歌的图像识别 API 从给定的图片中提取特征,机器学习 API 进行训练,给出提取的特征。看起来挺复杂的?
是的,这就是我想的。没有必要从头开始学习这些算法并重新创建循环。如果他/她想走艰苦的道路或继续在 Google 的基础设施上发展,现在完全取决于学生。
让我说明一下我的教育背景。我在印度的一所寄宿学校接受了中学教育。我记得我逃离数学,问自己,“我这辈子到底要在哪里用代数!”。由于接触互联网的机会有限,为了通过考试,我使用纸质材料,数学也学得很好。当我开始深入研究计算机时,我意识到我学的所有代数都不是多余的,它实际上是有意义的。我后退了一步,修改了一些重要的数学领域,现在我每天都在探索如何利用这些知识来帮助人们。在每天的旅途中,有一天我看到了下面这些新闻,
据《每日电讯报》报道, “英国儿童因‘肤浅’的学习而在数学方面落后” 。《每日邮报》称,**“四分之三的离校生‘在数学和读写能力上苦苦挣扎’:公司需要数月时间来填补初级职位,因为许多青少年缺乏‘关键技能’”**。
技术的发展,尤其是互联网的发展,使得学生们可以很容易地找到问题的解决方案,而不会超出他们大脑思维能力的极限。现在,高度先进的计算能力以 API 的形式公开可用,这让我担心,这些 API 将如何影响学生学习计算核心基础的旅程?
看积极的一面,就像我前面说的,更多的机会和开阔的想象视野。通过 source 在线社区,学生可以获得最新的知识。在线工具使解决问题的过程变得简单而灵活。
另一方面,随着在线工具的普及,学生没有明确的路径可循,这增加了他们脱离正轨的机会。
虽然政府很重视这个问题,并制定了可能的指导方针来提高英国学生的数学技能。然而,这并不完全是一个实体或一家公司在关注这个问题。我认为这个问题是我们社会的一个毒瘤,如果不尽快解决,后果可能是严重的。为什么激烈?
根据 mirror.co.uk 的说法, “史蒂芬·霍金称人工智能可能通过接管人类来摧毁社会”
如果我在这里将这些点联系起来,高级计算系统由数学算法支持,一旦系统的关键开发人员停止工作,缺乏基本数学技能的学生将无法理解如何理解人工系统的工作。因此,机器将能够自我修改,而人类将与这一过程无关,因为他们的知识将远远低于他们能够理解该系统如何工作的程度。
正如我之前所说的,我认为这个问题是我们社会的毒瘤,每个人都有责任帮助促进学习的过程。政府正在努力制定有效的教学指导方针,但调查教师如何应用这些指导方针也很有趣。我被教导说,我的父母是我的第一任老师,学校的老师在他们之后。因此,首先,家长应该认真对待他们的孩子如何被灌输所需的数学技能,以及学校在保留和发展知识方面使用的教学方法有多有效,而不是仅仅记住并在考场上吐在纸上。然后,学校要尽一切可能满足家长的期望。
这不是我们一夜之间能解决的。这应该是一个由每一个关心地球、社会和家庭的人支持的过程。
为什么我要获得深度学习的(纳米)学位
原文:https://towardsdatascience.com/why-im-getting-a-nano-degree-in-deep-learning-a2e7aee3f641?source=collection_archive---------3-----------------------
“活着吧,就像你明天就会死去一样。要像永远活着一样去学习。”
――圣雄甘地
深度学习已经出现在搜索、通信、广告、商业、金融、医学、媒体和许多其他领域。在未来的岁月里,它的影响力只会增加。当你意识到随着计算能力的激增而增强的大型数据集的可用性才刚刚开始,这让你想了解更多。
作为一名顾问、导师和投资者,我与任何愿意与他人分享知识的人都有联系。在大范围内,在互联网上,我们看到人们愿意分享每一个话题。有多种格式的内容可供使用,包括数兆字节的文本、数年的音频和视频。虽然互联网是一个巨大的知识来源,但对于特定的学科,它有助于遵循结构化的学习方法。
去年我参加了吴恩达教授的斯坦福/ Coursera 机器学习课程来更新一些旧的概念。在那之后,我在 Udacity 开始了一个类似的课程,当时他们宣布了一个新的深度学习纳米学位。虽然它不是免费的,而且意味着更大的时间承诺(它长达 17 周),但我决定复习一些自学的 Python 和几十年前的线性代数并注册。
这就是为什么我相信这将值得我的时间和金钱。
结构。
如果你像我一样,结构有助于在你迷失方向之前保持你的注意力。很容易发现自己在阅读一篇关于新的卷积神经网络应用的学术论文——毕竟每天都有新的新闻。但我更愿意学习什么是一个 CNN,如何在此之前自己实现一个。此外,这个结构帮助我提前计划我需要投入多少时间(晚上或周末)来和其他人保持同步。如果你落后了,FOMO 会狠狠地打击你,让你想要迎头赶上。
Structure is good
作业。
我喜欢作业的挑战,因为它们给你安慰,让你觉得你真的在学习。通过自己做一些事情,并看到结果是一种很好的感觉。这让我想起了我在大学里写的第一个程序。
My program can see!
向最优秀的学习。
技术有这个周期,每当有一个新的热门话题,所谓的专家、大师和忍者不知从哪里冒出来,试图通过重复流行词汇或无用的建议来赚钱。你已经看到聊天机器人的趋势了。这是一个很难的主题,所以没人能这么容易地愚弄人。但是我能直接从最优秀的人那里学到东西,这有多好?仅举几个:牛津大学的研究员,或者百度的首席科学家,或者 Udacity 的自动驾驶团队。
哦,我有没有提到 Siraj ?
社区。
来自世界各地的学生组成了一个超级充满活力的社区(不幸的是,☹️.仍然是男性主导的)因为这是一门基础课程,所以有不同层次的专业知识。你会发现年轻的学生或像我这样的人都在寻找新的知识,或者只是对这个主题感到好奇。一个松散的董事会让每个人都保持联系,虽然它可能有点混乱,但你可以让人们 24/7 询问和提供帮助。永远不会无聊。
Slack board for students
行业背景和人脉。
接近社区和在这个行业工作的人会让你对正在发生的事情有更好的了解。只要浏览科技新闻,就能看到自动驾驶汽车是现在的热门话题。深度学习领域的 Udacity 纳米学位可以让你快速进入自动驾驶汽车工程师纳米学位(第一批 250 个名额有 1.1 万名申请人。)仅此一点就吸引了许多人,他们认为这是在该领域尝试职业生涯的一个切入点。像宝马、滴滴、优步、Kaggle、梅赛德斯-奔驰这样的公司都在等待招聘最有才华的人。
更新: 我现在已经开始学习所有关于自动驾驶汽车的技术。截至 2018 年 1 月,我即将开始第三个也是最后一个学期的 自驾工程师纳米学位 。比我下面写的深度学习课程要复杂一点。课程开始类似于深度学习课程,但后来进入了计算机视觉、机器人和许多令人敬畏的科目。我毕业的时候会在 5 月份写一篇类似的文章。同时,享受阅读我完成的具体任务的乐趣:
- 实现自动驾驶汽车的模型预测控制
- 自动驾驶的 PID 控制
- 前置摄像头的车辆检测与跟踪
- 自动驾驶汽车的高级车道检测
- 计算机视觉技术实现一种改进的车道寻找算法。
- 利用深度学习克隆驾驶行为
为什么学术写作如此密集?
原文:https://towardsdatascience.com/why-is-academic-writing-so-dense-88ca11cb368c?source=collection_archive---------10-----------------------
我分析了 100K 篇论文来找出答案。
动机
最近,我很长时间没有在媒体上发帖了。斯坦福大学公共财政课程的第二部分是关于结构评估的。这些论文很容易就达到 100 页/张,而且充满了希腊字母和冗长复杂句子。
这一痛苦的经历让我思考:为什么研究人员没有动力写得更简单?
理论和可检验的预测
学术写作应该简单一点吗?
- 理论 1: 你可能认为这是显而易见的——简单的写作更容易理解,这反过来会导致更多的引用。【是】
- 不幸的是,同行评议出版游戏有时会相当混乱。作者可能会写冗长、复杂的论文来转移任何可以想象的批评。他们可能还会用复杂程度或篇幅来表明论文的质量——毕竟,没有人想读 100 页的希腊字母,即使是审稿人也不想。【否】
- 理论三:一个更无伤大雅的观点是,复杂的文字对于表达复杂的思想是必要的。【否】
可检验的预测
- 预测 1: 越简单的论文引用越多。
- 预测二:复杂论文获得更多引用。
- 预测三:引文不受写作风格影响。
结果预览
我找到了三种理论的证据:
- 学术著作如此密集,因为引文似乎不受其影响。在某些情况下,研究人员甚至可能因此获得奖励,可能是因为这使得缺陷更难发现。
- 基于主题和文化背景,有很多异质性。
- 我的结果绝不是最终的——因为可能还有其他我没有考虑到的混杂因素。如果你对我如何使我的分析更严谨有任何建议,请给我留言。
我们开始吧:)
数据
为了回答这个问题,我使用了 2008 年 SIGKDD 论文 ArnetMiner:学术社交网络的提取和挖掘中的引用数据,该数据收集了 300 万篇论文的以下信息:
结果基于前 10 万篇论文
100K 样品
由于我的处理能力和内存有限,所以我把前 100K 的论文作为我的样本。如果你对复制我的分析感兴趣,我在这篇博客的结尾提供了我的 Python 代码。我们可以比较我们的结果,看看第一个 100K 的论文是否具有代表性。
可读性度量
我计算每篇论文摘要的 [Linsear-write](http://linsear write) 分数。我选择 Linsear-write 是因为据说它是由美国空军开发的,用来计算他们的技术手册的可读性,而不是一些随机的学术构造。
我含蓄地做了两个假设:
- 摘要的复杂性很好地代表了论文的复杂性。
- Linsear-write 是衡量文本复杂性的一个很好的方法。
相关系数:
- Corr[# of 引文,可读性] : -0.026。
- Corr[年份,可读性] : 0.013
**
观察
引文数量和 Linsear 可读性分数之间的关系是非线性的,并且高度可变:在 10 年级理解之前,引文数量随着写作复杂性而增加;十年级后的理解,引文数量随着写作的复杂性而减少。但是这种关系似乎很弱——因为在十年级左右有很多变化。
【Linsear 分数和年份的关系就不那么明显了:随着时间的推移,每年都有更多的论文被发表。因此,容易试卷的数量和难试卷的数量都增加了。相对于简单试卷的数量,硬试卷的数量增加更多。随着时间的推移,硬纸变得越来越硬。
因果解释
相关!=因果关系
是什么阻止我得出复杂的写作导致低引用率的结论?让我检查一下我是否陷入了因果推理陷阱:
- 反向因果关系:低引用导致文风复杂?
- 巧合关联:关联是由于随机的偶然性。鉴于样本量大,不太可能。但是严谨一点,我可以做 t 检验。
- 第三个因素导致了复杂的写作风格和低引用率。
遗漏变量偏差是一个真正的问题。导致复杂写作风格和低引用率的第三个可能因素是:
- 例 1:理论领域术语更硬,研究人员更少。但是由于这些术语被该领域的所有研究者普遍使用,它们不会给读者带来太多负担;低引用率仅仅是因为该领域很少有研究者引用它们。
- 例 2: 随着时间的推移,领域变得更加高级和专业化。更高级的概念可能需要更复杂的写作,更专业的问题可能产生更少的引用。
- 解法: (1)对于每篇论文,用当年期刊平均值贬低引文量和复杂度。(2)计算每个期刊贬低的引用和贬低的复杂性之间的相关性。
- 注意:我的解决方案处理了我认为最重要的两个被忽略的变量偏差。可能还有其他我漏掉的混淆因素。
贬低的相关系数
对于每份期刊,我计算了贬低的引用和贬低的可读性之间的相关性。这是 1584 份期刊的相关系数分布。
观察结果:
平均而言,一篇比同行更复杂的论文被引用的次数略少。但是效果真的很小——这表明学术人员不会因为写了深奥的论文而受到处罚。
有大量的异质性:我们有很多负相关、零相关和正相关的期刊,为这三个理论都提供了证据。
追问:正相关、零相关或负相关的期刊有哪些?
点击此处查看完整列表。
经济学
对我来说不幸的是,这个样本中仅有的两个顶级经济期刊有真正的正相关关系:
- 经济理论杂志:0.18
- 游戏和经济行为:0.35
这与复杂的论文更难发现缺陷的观点一致,更多的读者会购买结论并引用它。这证实了该领域资深研究人员的许多轶事。
计算机科学
大多数计算机械协会(ACM)期刊都有很强的负相关性。这是意料之中的——因为大多数后续论文需要重复其结果。如果很难理解,后面的论文可能就不想复制了。
词云
更正[可读性,引文] < -0.22:底部四分位数
Corr[可读性,引文] > 0.18:前四分位数
观察:
- 作者是否因写复合句而受到处罚取决于主题:第一个词云的特点是更实用的主题,而第二个词云的特点是更抽象的主题。
- 有重要的文化差异。来自亚洲,我可以证明老师们非常重视写复合句和使用新奇的词汇。当我第一次来到美国的时候,我不得不抛弃我的许多旧习惯。
结论
我找到了三种理论的证据:
- 学术著作如此密集,因为引文似乎不受其影响。在某些情况下,研究人员甚至可能因此获得奖励,可能是因为这使得缺陷更难发现。
- 基于主题和文化背景,有很多异质性。
- 我的结果绝不是最终的——因为可能还有其他我没有考虑到的混杂因素。如果你对我如何使我的分析更严谨有任何建议,请给我留言。附录:Python 代码
附录:Python 代码
让我们导入一些 Python 模块:
**import* re
*import* json
*import* numpy *as* np
*import* pandas *as* pd
*import* matplotlib.pyplot *as* plt
*from* wordcloud *import* *
*from* textstat.textstat *import* textstat*
将 JSON 对象加载到 Pandas 数据框中:
*df = pandas.read_json('inPath',lines=True)
df = df.head(100000)*
删除缺少数据的行:
*df1=df.dropna()*
统计引用次数:
*df['num_citation']=df['references'].apply(*lambda* x: len(re.split(',',str(x))))*
使用 Linsear 度量计算摘要的可读性。
*df['linsear'] = df['abstract'].apply(*lambda* x:textstat.linsear_write_formula(x))*
根据可读性绘制引用数量图:
*plt.plot(df['linsear'],df['num_citation'],'ro')
plt.ylabel('# of citations')
plt.xlabel('linsear')
plt.title('# of citations vs. linsear')
plt.show()*
贬低引用和可读性:
*demean = *lambda* df: df - df.mean()
df1=df.groupby(['venue', 'year']).transform(demean)
df['demeaned grade level']=df1['grade level']
df['demeaned citation'] = df1['num_citation']
correlations = df.groupby('venue')['demeaned grade level','demeaned citation'].corr().unstack()
correlations = correlations['demeaned grade level','demeaned citation'].sort_values()*
标绘文字云:
*neg_corr=correlations[(correlations<-0.22)]
pos_text=pos_corr.index.str.cat(sep=',')
neg_text=neg_corr.index.str.cat(sep=',')
common_set = set(pos_text.lower().split()) & set(neg_text.lower().split())
common_list=[]
*for* e *in* common_set:
*for* w *in* re.split('\W+',e):
*if* w!='':
common_list.append(w)
common_list=common_list+['Review','Letters','Application','Personal']
wc= WordCloud(stopwords=common_list).generate(neg_text)
plt.imshow(wc,interpolation='bilinear')
plt.axis('off')
plt.savefig('your path to word cloud with negative correlations')*
为什么大家都在说人工智能?
原文:https://towardsdatascience.com/why-is-everyone-talking-about-ai-73bab31bf9c1?source=collection_archive---------3-----------------------
没有什么可以阻挡 AI
Courtesy of: SpaceX
现在每个人都在谈论人工智能,实际上,如果你看看网上的搜索和人工智能的提及,你可以看到一个明显的指数趋势。人工智能并不是新的,它实际上在 65 年前就开始了,但今天我们终于有了一种经济高效的方式来存储、传输和计算大量数据,这是以前从来不可能的。
2017 年,我一直在想人工智能行业的增长,我必须告诉你,我对人工智能最近受到的关注感到非常惊讶。在某个时候,我意识到,每当我收到电子邮件时,我订阅的所有技术通讯,几乎每次都有关于人工智能的新闻。
到处都在发生。
几乎所有的高科技杂志。
开发者都在说 AI。
工程师都在说 AI。
数据科学家在谈论人工智能。
记者们正在传播关于人工智能的消息。
企业家们正在集思广益,想出应用人工智能改善业务的新方法。
商人正在人工智能的基础上寻找新的商业模式。
我说的是 AI。
也许你也在谈论人工智能。
这里有一些消息给你:
——中国的 AI 觉醒
人工智能可能是在西方发明的,但你可以看到它的未来正在世界的另一端成形。
— 把人类放在 AI 的中心
谷歌云首席科学家费-李非表示:“为了制造更有帮助、更有用的机器,我们必须恢复对上下文的理解。”
—AI 需要学习什么才能掌握外星战争
人工智能代理需要新的想法来竞争流行的策略游戏星际争霸。
——哈里·瓦尔波拉梦想着一个由美丽的人工智能头脑组成的互联网
这位芬兰计算机科学家表示,他已经解决了人工智能的根本问题:如何制造会规划的机器
— 微软正在让人工智能变得无聊,这要么很棒,要么很可怕
— Slack CEO:我们将如何利用人工智能来减少信息过载
斯图尔特·巴特菲尔德讲述了机器学习如何帮助你提高工作效率。
——《伊顿公学》:机器人老师会意味着每个人都获得精英教育吗?
— 好的,电话:我的庄稼长得怎么样?
——艾预言的七宗罪
错误的推断、有限的想象力和其他常见的错误会分散我们对未来更有成效的思考。
— 一项惊人的人工智能进步让谷歌的智能管家听起来更好
— 脸书为 AI 机器人悄悄进入星际大战,输了
—AI 学习的未来会更依赖先天还是后天?
— 阿里巴巴的目标是“掌握人工智能的规律”,让虚拟助手无处不在
这家电子商务巨头的首席技术官表示,其 150 亿美元的新研究院将探索人工智能、金融科技和量子计算。
什么?你求我停下来吗?好吧,我明白了。你也可能认为这些新闻是有偏见的?也许吧,但我会让你自己判断。所有这些有时可能会令人不知所措,但这可以用来证明一个概念,即人工智能将永远存在,无论是好是坏,没有什么可以阻止人工智能赢得的关注。
为什么是现在?
人工智能大受欢迎的主要原因是:
- 更强的计算能力:人工智能需要强大的计算能力,最近已经取得了许多进展,复杂的深度学习模型可以部署,使这成为可能的一项伟大技术是 GPU。
- 更多数据:为了让一个有用的人工智能代理做出明智的决定,比如告诉你网上购物时下一件商品应该推荐给你,或者从图像中对一个物体进行分类,人工智能在大型数据集上接受训练,大数据使我们能够更有效地做到这一点。
- 更好的算法:最先进的算法大多数基于神经网络的思想,不断得到更好的结果。
- 广泛投资:大学、政府、创业公司和科技巨头(谷歌、亚马逊、脸书、百度、微软)都在大力投资人工智能。
人工智能作为一个研究领域和一种经济正在迅速发展。
学术视野中的人工智能
从科学领域的角度来看,每天都有新的研究在进行,每天都有新的思想实验和新的想法出现,关于我们如何才能建立更好的人工智能来为人们的生活服务。除此之外,没有人可以否认这样一个事实,即有许多来自学术界和工业界的人正在努力推动我们今天所知道的边界和人工智能的现状,我们所知道的世界变化如此之快,我们都想看看未来会有多棒。
人工智能是全球经济的助推器
根据普华永道周三的一份报告,到 2030 年,人工智能将为世界经济贡献 15.7 万亿美元。这比中国和印度目前的总产量还要多。你可以在下面找到更多人工智能将为全球经济增加 15.7 万亿美元和由于人工智能,到 2030 年全球经济将增加 16 万亿美元。
- 普华永道称,由于人工智能,2030 年全球 GDP 将增长 14%。
- ‘人和机器在一起可以比人更好’。
毫无疑问,科技行业正在发生许多事情,日复一日,我们看到并将看到许多以人工智能为核心的尖端创新。敬请期待!
在你走之前!
如果你喜欢这些作品,请留下你的掌声👏推荐这篇文章,让别人也能看到。
J .大卫福莫!
愿原力与你同在!
为什么会有生命?而且和 AI 有什么关系?
原文:https://towardsdatascience.com/why-is-there-life-and-what-does-it-have-to-do-with-ai-2195ac91532f?source=collection_archive---------3-----------------------
Dust devil in Mongolia. By Texasbob (Own work) [CC BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0)], via Wikimedia Commons
我喜欢我的老问题得到解答。二十年前,我醒着躺在床上,想知道生命为什么存在。现在看了[薛定谔,1944],[泰格马克,2017],[卡罗尔,2016]这样的书,我想我明白了。生活是一个非魔法的物理过程。生活就像小尘暴;物质的小漩涡开始运转,但偶然有一种结构允许它们持续运转超过应有的时间。当然,尘暴不是活的,因为它们不会繁殖,但它们很好地提醒了我们生命是一个怎样的过程。
生命因为存在而存在。这听起来像禅宗公案,但我的意思是,一旦一个进程偶然开始,并具有继续下去的属性,它继续下去,正是因为它有这种属性。如果这个过程碰巧也具有自我复制的特性,那么保持它继续运行的特性就会传递给它的副本,甚至会有更多。当然,这些复制品并不完美。复制品中有一些小的缺陷,而这些缺陷中的一些会导致变异,这些变异可以继续下去,甚至复制得更好。这导致了更多的变异,以及由此产生的更多变异,结果是细菌、树木、人类、蜘蛛和鸡。
这和智力有什么关系?尘暴的一些变种恰好具有这样的特性,它们朝着让它们继续前进的事物移动,而避开让它们熄灭的事物;我们称之为智慧。在某些情况下,更多的智能可以让尘暴持续更长时间,在更多样化的环境中,所以它可以制造更多的尘暴和尘暴的变体。
我们人类尘暴现在正试图人工构建智能。我们正在自上而下地建造它,努力实现人类的目标。相比之下,大自然自下而上地构建智慧,没有目标,变异一个接一个地积累。这种区别可能是为什么人工智能(AI)从业者普遍比其他人更不害怕 AI 的原因。我们把它视为工程,就像制造更好的烤面包机或洗碗机。从外面看 AI 的人不把它当工程看;他们看到人工制品表现得像活着一样,做着人类做的事情,比如驾驶汽车和识别照片中的猫。对他们来说,自然的问题是,“当它变得比我们更聪明时,我们将如何控制它?”
我们自上而下地构建我们的人工智能,因为我们现在需要它有用,也因为我们不了解自然智能的基本原理。这种自上而下方法的结果是一种肤浅的体现。我们构建的智能没有被具体化,或者即使它们被具体化了,我们也试图直接跳到构建能够处理与人类文化相关的概念的智能,而不需要潜在的管道。结果是,我们得到了给不识字的学生论文打分的程序,我们有了不知道路是什么就能制造汽车的机器人。
相比之下,自然智能始于具有简单形态的生物,这些简单的身体形状提供了有限的感知输入空间和有限的行动空间,导致从简单输入做出简单的决定。通过进化,生物体的形态和智能共同发展,这导致了深度体现的智能。例如,我们人类在行走方面如此高效,因为我们利用了我们腿部的动力,并将它们视为钟摆[Clark,2008]。我们的感觉运动例程使我们能够做像制作三明治这样的事情,同时通过允许我们使用目光在正确的时间从正确的环境中获得正确的信息来最小化内存需求[Ballard,2015]。我们在动作和内部模拟中都使用我们的深度化身。当我们想象踢一个物体时,我们用大脑中实际踢的部分进行想象[Bergen,2012]。许多不同的能力以特定的方式共同作用,导致了支配我们行为的心理社会[明斯基,1988]。
因为我们希望我们的人工智能立即有用,所以我们建造了具有复杂形态学的机器人,这些机器人可以拾取物体,识别图像中的猫,并根据情感对电影评论进行分类。最近,我们在深度学习甚至遗传算法方面取得了很多成功,但当谈到建立常识,我们称之为人工通用智能 (AGI)时,我们遇到了困难。这种缺乏进展源于在较低水平的能力之上构建的困难。
人类的一般智力是建立在低级的、前语言概念上的[Feldman,2006 年],[Mandler,2004 年]。为了理解像“我们的创业公司带我们踏上了一段漫长的旅程”这样的语言和句子,我们将它们映射到物理体验,例如实际上走在一条漫长的道路上[Lakoff & Johnson,1980]。为了建立真正的理解,我们可能需要在执行底层物理模拟的实际代码之上建立抽象概念。我们有可以进行导航的自动驾驶汽车;也许我们需要直接在导航代码的基础上建立更高层次的抽象,这样机器人就可以理解创办公司是一次“旅程”
虽然我们有目的地试图自上而下地构建人工智能,但我们的经济和计算机基础设施可能会允许人工智能自下而上地出现。我们的计算机程序本身经历了一种进化。运行良好的计算机程序运行很多,就像持续运行的尘暴。当他们逗留期间,他们积累了来自吉拉门票的变化和来自 GitHub 上的叉子的变化。代码开始时是自顶向下设计的,具有漂亮的抽象,但随着时间的推移,变化越来越多,变得越来越难以理解,但更适合其环境。
我们也在慢慢地将我们的项目融合在一起,这样它们就接近一个心智的社会。过去完成任务所必需的任务,如排序或运行 CNN 分类器,现在可以简单地调用,让程序员专注于更高层次的问题。我们正在通过 makefiles、微服务、API、GitHub repos 和 Apache Maven 慢慢构建更复杂的系统。这些思维的小团体现在变得如此复杂,以至于代码经常被捆绑在一个 Docker 容器中,这样每个用户就不必为组件的不同变体之间的版本不兼容而斗争。因为这些功能是建立在更简单的功能之上的,所以我们在网络世界中得到了某种深度的体现。Twitter bot 建立在通过 TCP/IP 发送数据包的所有代码之上。
我们的智能机器会成为像你我一样的生命体,对世界有着丰富的理解甚至意识吗?我们不知道如何让 Docker 容器有意识,但我们的计算机技术可能正在沿着一条类似于导致我们有意识的自下而上的道路前进。尽管如此,至少还有两个谜团。我们只看到沙尘暴的一个变种发展出丰富的语言和它所带来的文化的复杂性,我们不知道我们是如何做到的,甚至不知道它是如何工作的。意识的第二个奥秘甚至更深。我们不知道它是否有必要,或者是海市蜃楼,或者是基于数学原理。一旦我们解决了这两个谜团,我们将对超级智能机器的可能性有一个更好的想法,除非他们先解决它们。
参考
【Ballard,2015】Ballard,D. 作为分层抽象的大脑计算。
【卑尔根,2012】卑尔根,B. K. 比言语更响亮。
【卡罗尔,2016】卡罗尔,S. 大局。
【克拉克,2008】克拉克,A. 超大型思维。
【费尔德曼,2006】费尔德曼,J. 从分子到隐喻。
【约翰逊,1987】约翰逊,M. 头脑中的身体。
我们赖以生存的隐喻。
心理的基础。
【明斯基,1988】明斯基,M. 心智的社会。
【薛定谔,1944】薛定谔,E. 生命是什么?
【泰格马克,2017】泰格马克,M. 生命 3.0 。
为什么很难培养一种对话式的 Alexa 技能
原文:https://towardsdatascience.com/why-its-hard-to-develop-a-conversational-alexa-skill-b8689f57a7f?source=collection_archive---------13-----------------------
2019 注 : 本文提及的技术方案截至目前不再有效。亚马逊采取了一个有争议的方向,这实际上禁止技能开发者制作像这里描述的对话技能。据我所知,没有任何变通办法可以让技能理解用户的自由文本或任何相近的内容(不, 这个 甚至都不相近)。可悲的是,唯一的选择似乎是完全放弃这个平台,转而使用谷歌助手。
大多数 Alexa 技能似乎符合执行用户命令的简单模式。这些命令中的一些可能有参数,如歌曲名称或城市名称,但通信通常不会超出这个范围。但是如果你想在你的技能范围内进行一次真正的对话,有趣的事情就会发生。在接下来的部分中,我将分享我们的经验和一些提示,它们可能会帮助您解决将要面临的一些问题。您还将看到人类与机器对话时使用的语言。
注:本文原载于 Infermedica 博客。这里有一个稍微更新的版本。Lukasz Przywarty 拍摄的图片。
症状检查技能
我们已经发布了一个 Alexa 技能,要求你说出你的症状并进行一个简单的采访,以确定你健康问题的可能原因。这项技能是使用我们的 API 构建的,它具有症状检查引擎和 NLP 功能(捕获英文消息中提到的症状)。该技能旨在作为概念验证,鼓励其他人使用我们的 API 产品开发自己的语音应用程序。
在这一过程中,我们遇到了一些障碍,这些障碍超出了我们的预期。请注意,我们甚至没有尝试处理完全自由形式的对话;我们的对话结构或多或少是固定的。然而,这种固定的流程对于传统的技能设计过程来说已经是一个挑战。
对话不友好
你可能会觉得亚马逊不鼓励你与用户交流。在他们的开发者门户上列出的十个例子中,只有一个是对话性质的(玩危险游戏)。剩下的归结起来就是按照一个简单的要求行动,然后放弃(查找简单的答案,吐出一条新闻,或者控制灯光或音频播放器)。
“亚马逊可能已经预料到,给开发者太多自由会导致持续缺乏理解,最终,这将归咎于 Alexa 本身。”
我能想到两个可能的原因。首先,这些应用被认为是增强主要体验的附加技能,从而给人一种主要对话发生在特定应用之外的印象。其次,亚马逊可能已经预料到,给开发者太多自由会导致持续缺乏理解,最终,这将归咎于 Alexa 本身。
意图和位置
Alexa 的交互模式不是对话友好的。用 Alexa 的话来说,这种互动可以通过使用“定制技能”类型来实现。然而,如果你期望找到一个方便的框架来实现自定义聊天,你会失望的。即使在使用“自定义技能”时,你也不得不列举一组固定的意图,让用户表达出来。意图可能是想要点咖啡或找到电影名称。确认(回答问题时说“是”)和否认(“否”)也是意图。一些意向可能有用于参数的槽,比如城市名称或咖啡类型。您必须指定每个插槽的类型;您可以使用一种预定义的类型,或者您需要—您猜到了—枚举一组固定的值。很难想象一次随意的聊天会有这种程度的严谨。
“Alexa 的交互模式对对话不友好。”
现在想象一下,你正试图创造一种技能,可以阅读你的症状并缩小其最可能的原因(就像我们所做的那样)。虽然输入我们的医学知识库中目前定义的超过 1,400 种症状的名称在技术上是可行的,但是不可能为每个值提供多个同义表达(例如,“耳痛”、“我耳朵痛”、“耳朵疼”)。即使这是可能的,保持这种独立于主要知识库的列表会立刻扼杀任何现实生活中的项目。
你能做什么
有一个行之有效的解决方法。你需要做的是迫使 Alexa 认为:
- 无论用户说什么,都符合一个唯一的包罗万象的意图。
- 这个意图本身就是一个巨大的
SearchQuery
类型的槽。这种类型是我们通向自由的门票——它使得捕捉任何文本成为可能。
注意,要使技能被认可,你还需要加入三个强制性的意图:呼救、取消当前动作和要求气缸闭嘴。
菜谱有两部分:意图模式和样本话语。通过这种方式,你可以有效地防止 Alexa 试图捕捉用户话语中的意图和片段,让你通过 Alexa 语音服务获得从用户语音转录的完整原文。这意味着你只能独自处理非结构化的文本信息,而你的应用程序应该会发送回文本回复。进入聊天机器人的世界!
处理听错的话
尽管有各种宣传和荣耀,但底层语音识别平台 Alexa Voice Services 相当令人失望。一个已知的问题是有不标准的口音。但实际问题似乎远不止于此。
“我们应该预料到一些错误会出现,特别是如果话语不典型或者很短——没有足够的上下文来消除歧义。”
对自然语言处理感兴趣的读者应该知道,没有大规模的统计语言建模,现实生活中的语音识别是不可能的。声音信号是高度不明确的,系统需要大量已知的一个接一个单词的模式来决定实际上在说什么。如果这对你来说似乎有悖常理,试着回忆一下你最后一次试图通过电话告诉别人姓氏、地址或 wifi 密码是什么时候。像这样的信息交流是很困难的,因为接收者的大脑没有足够的语言模型。
这就是说,我们应该预料到一些错误会出现,尤其是如果话语不典型或者很短——没有足够的上下文来消除歧义。
你是电子邮件还是电子邮件?
缺乏上下文是一个常见的问题。在我们采访的某些时候,我们需要了解用户的年龄和性别。后一个问题引起了惊人的麻烦。如果答案是“男性”,那就根本没这么理解。最常听到的(错误的)回答是“mail ”,然后是一些更长的短语,如“I a mail ”,甚至是“can you mail”。由于我们无法获得语音记录,我们只能猜测用户想说什么。日志中出现的一些意想不到的单词可能来自喃喃自语,甚至来自房间中的多人说话。Alexa 的语言模型在解释“女性”方面问题较少,但在文字记录中看到“电子邮件”并不罕见。
我们如何处理这些?嗯,在这个简单的二选一问题中,我们硬编码了最常见的模式,并假装没有什么不寻常的事情发生。
当曲解的话语是开放式问题的答案时,一个更大的问题出现了。是的,当我们试图理解用户健康问题的描述时,这种情况经常发生。对匿名日志的一次挖掘发现了许多关于“棺材”和“咖啡”的投诉(咳嗽?).这些采取各种形式,例如,“我有一个驱动棺材发烧”(干咳和发烧?),还有一个戏剧性的表白:“我是咖啡”(我在咳嗽?).我们还发现了 Alexa 对迪士尼的怪异亲和力(头晕,或许还有呼吸困难)。
我们仍然没有找到解决这个问题的好办法。这个问题本身就是我们的技术名声不好的主要原因。相比之下,我们的谷歌助手集成受到了称赞,尽管两者是由完全相同的语言理解后端驱动的。
最好的语言模型是领域相关的
这些问题中的许多都可以用特定于领域的语言模型来解决。不幸的是,Alexa 只提供了一个通用的语音识别器,无法注入额外的语言环境。一个理想的解决方案将允许我们从几个预先训练好的特定领域模型中选择一个,如医疗领域、IT 和管理、休闲八卦和生活方式等。能够提高某些预期短语(例如“女性”和“男性”)的概率也是有帮助的。我们希望两者最终都能在所有主要的语音平台上提供。
谷歌语音识别引擎的出色表现表明,训练数据的规模和可变性确实会产生影响。
语音交流鼓励更自由的语言
聊天语言随意。在聊天机器人的例子中,通过使用即时响应模板,用户的语言被部分驯服。此外,一些聊天机器人会给出冗长的介绍,为接下来的对话定下基调。
Poncho bot giving verbose suggestions. You can’t afford this on Alexa!
语音界面的本质鼓励随意的日常语言。技能设计者可能会使用介绍和插曲来引导对话者使用机器友好的语言,但不要让用户厌烦得要死,这是一项棘手的任务。Alexa 缓慢的语速加上我们不断缩短的注意力持续时间几乎没有解释的余地。
这种表达的自由让我们的用户更难理解,尤其是因为有些话根本就是听错了。
如何比较语言变体
让两个对话代理执行同一种健康检查使我们能够比较与 Alexa 对话时使用的语言和与聊天机器人打字时使用的语言,至少对于这个特定的领域是如此。
症状(网络聊天机器人)和症状检查器 Alexa skill 都有类似的对话流程。在对话的第一阶段,用户被要求用自己的话描述他们的症状。我使用这些描述(记录在匿名日志中)来寻找这些语言的不同之处。
比较两个语言样本以发现相似性和差异是语料库语言学和词典学的一个基本问题。虽然原则上有更多的东西,但它通常被简化为比较词频来发现不规则性。如果你对这个话题感兴趣,最好的起点是已故的 Adam Kilgarriff 的开创性论文。
口语单词、打字单词
口语和书面语是不同的,这不足为奇。但是到底有多大的不同,这对系统有什么影响呢?让我们来比较一下,在对聊天机器人打字时,哪些单词更受欢迎,在对 Alexa 说话时,哪些单词更受欢迎。下面的可视化显示了最能区分聊天机器人和语音症状检查器所用语言的单词。一个单词的大小反映了它对这些语言变体的具体程度(使用对数似然比度量计算)。红色单词更频繁地对 Alexa 说(根据 Alexa 听到的),而蓝色单词更频繁地输入到 Symptomate 聊天机器人。
Words used in communication with the chatbot (blue) and with the voice assistant (red).
Alexa 收到了更直接、更个性化的语言。你可以在人称代词的出现中看到这一点(你、我的)。此外,疼痛更经常用动词伤害(我的胃痛而不是胃痛)来描述。聊天机器人见过更多的医学术语和正式语言(如腹部、呼吸困难、压力、难度)。
平均而言,我们的聊天机器人可以比我们的 Alexa 技能多理解 13%的故事(粗略估计)。很难说这有多少是由于语音识别错误,又有多少是由于我们的 NLP 系统对正式语言的偏好。
摘要
在这篇文章中,我已经指出,建立一个对话式的 Alexa 技能是相当困难的。首先,Alexa 技能套件的设计在这方面并没有真正的帮助。您需要滥用技能配置来将您的应用程序从僵化的意图中解放出来——否则会扼杀任何自由形式的对话。然后,您需要处理底层语音识别技术的错误,或者等待并希望这将随着时间的推移而改善。你的技能将为每一个语音识别错误受到指责,用户甚至不会知道不是你的技能没有理解简单的语言,而是亚马逊的平台。你的领域越开放,你就越有可能面临这些问题。最后但同样重要的是,你的用户将会使用比他们在聊天机器人上打字时更随意的语言。
所有这些观察都是在发展我们的症状检查技能时进行的。请随意尝试,并自己判断我们是否已经设法克服了这些困难。
为什么训练一个具有动态结构的神经网络不再困难!
原文:https://towardsdatascience.com/why-its-not-difficult-to-train-neural-network-with-dynamic-structure-anymore-bc5e2f67fef0?source=collection_archive---------0-----------------------
TLDR;最后,开源社区解决了神经网络中动态结构的需求。在过去的 3 个月中,我们看到了 3 个支持动态结构的主要库版本。
- 张量流折叠(谷歌)
- 达内 (CMU)
- Pytorch (Twitter、NVIDIA、SalesForce、ParisTech、CMU、数字推理、INRIA、ENS)
在 Innoplexus ,我们从结构化、非结构化和半结构化来源收集信息,以帮助我们的客户做出实时决策。为了达到这个速度,我们将自然语言中的文本从非结构化的源转换成适当结构化的表示。由于速度是一个主要的瓶颈,我们的 NLP 系统是基于语言的递归结构,这是由于工具的可用性和计算在多台机器上的分布。
随着时间的推移,我们意识到递归方法的局限性,如 LSTM 和 GRU 试图将递归自然语言纳入一个序列框架。这导致在信息处理任务中语法信息的丢失。但不幸的是,从头开始实现递归神经网络可能会变成一场噩梦,因为它涉及到以非常高的精度编写复杂的反向传播代码。
大多数 ML 库,如 Tensorflow、Torch 或 Theano,允许创建静态网络,该网络限制了作为输入函数的网络结构的变化。这被证明是自然语言处理/理解中的重大限制,其中句法信息被编码在作为输入文本的函数而变化的解析树中。像句法分析、机器翻译和情感分析这样的许多应用需要句法信息和语义信息。由于没有任何框架可用,开发人员不得不在 Numpy 中实现培训过程。这被证明是非常容易出错的,并且是必须以高精度执行的单调乏味的任务。
我们在 Innoplexus 实现实体提取器时遇到了类似的问题。它使用语义统一的递归神经网络,具有树状结构。由于没有任何支持动态结构的框架,我们最终在 Tensorflow 中实现了它。这给我们的计算图带来了沉重的负担,使得我们的训练过程缓慢,内存效率低下。此外,决定批量大小来刷新图表成为训练过程中的一个关键问题。正当我们准备在 Numpy 中重写整个训练过程以加快速度时,我们遇到了 Dynet。
DyNet(原名 cnn )是由卡耐基梅隆大学和其他许多人开发的神经网络库。它是用 C++编写的(使用 Python 中的绑定),设计为在 CPU 或 GPU 上运行时都很有效,并且适用于具有针对每个训练实例而变化的动态结构的网络。
我们在 Dynet 中重构了代码,对 Tensorflow 代码做了微小的修改。就可用功能而言,Dynet 不如 tensorflow 成熟,因此我们最终为 Tensorflow 编写了实现。另一方面,PyTorch 更加成熟,并得到了更广泛的社区的支持。您可以创建这样的动态图形:
PyTorch: Dynamic Graph Construction
Google 最近推出了 Fold,它包含了比 tensorflow 更广泛的 Python 对象。它提供了对结构化数据的支持,比如嵌套列表、字典和协议缓冲区。这克服了 Tensorflow 的静态图形限制。它的方法与 PyTorch/Dynet 完全不同。它使用动态批处理来并行化多个实例图中的操作。仔细看看,这很酷。简而言之,它是这样工作的:
Tensorflow Fold: How it works.
在自然语言处理领域,语言可以有不同的表达长度,因此动态计算图是必不可少的。人们可以想象语法是如何被解析来实现对堆栈和动态内存以及动态计算的需求的。Carlos E. Perez 在他的文章中恰当地总结了这一重大进展。
随着这一发展,预计深度学习架构将走过与传统计算相同的进化道路将是合理的。也就是从单一的独立程序到更加模块化的程序。引入动态计算图就像引入过程的概念,而以前只有“goto”语句。正是过程的概念使我们能够以可组合的方式编写程序。当然,有人会说 DL 架构不需要堆栈,但人们只需要看看最近对超网络和拉伸网络的研究。在研究中的网络中,像堆栈这样的上下文切换似乎是有效的。
我们正在使用这些库来重构我们的代码,以便通过较小的修改从递归系统转移到递归系统。这极大地改进了我们现有的模型,并使我们能够解决以前无法解决的问题。我希望这能帮助你实现和我们一样的转变!
快乐黑客:D
为什么 Kaggle 不会让你成为伟大的数据科学家
原文:https://towardsdatascience.com/why-kaggle-will-not-make-you-a-great-data-scientist-a2c2f506a23f?source=collection_archive---------7-----------------------
想成为老鹰或 Kaggle 数据科学家?
Want to be an Eagle or Kaggle data scientist ?
毫无疑问,Kaggle 是一个学习数据科学的好地方。有许多数据科学家在 Kaggle 上投入了大量时间。太棒了。
但是你不应该仅仅依靠 Kaggle 来学习数据科学技能。
以下是原因
数据科学不仅仅是关于预测
卡格尔只关注那些需要预测的问题。然而,现实世界中有许多问题与预测无关。
例如,许多公司有兴趣知道客户流失的最常见途径是什么。这些类型的问题要求人们理解不同的数据类型和客户接触点,例如 web 导航、计费、呼叫中心交互、商店访问。然后,您需要识别重要事件,如超额计费或导航错误。一旦您确定了所有事件,您需要应用路径算法来了解导致客户流失的常见路径。这些类型的问题不能仅用预测算法来解决。他们需要能够从事件中构建时间线的算法。
类似地,除了预测性问题解决之外,还有许多其他这样的问题需要技巧。知道如何解决预测性问题是件好事,但作为一名数据科学家,你需要解决多种类型的问题。现实世界有更大类型的问题要解决。你将不得不在 Kaggle 之外寻找解决现实世界数据科学挑战的技能
你不会发展图形算法技能
社交网络分析、影响者预测、社区分析、欺诈者网络分析,所有这些都是数据科学家需要解决的非常有趣的分析问题。这类问题需要图形算法方面的知识,比如 Pagerank、模块性、最短路径、特征中心性等等
网络或社区类型的问题在 Kaggle 很少见。图形和网络风格的问题需要节点和链接数据的概念,这不是 Kaggle 中大多数数据可用的方式。
当然你可以把一个问题转换成使用图算法,但是这种情况很少见。缺乏这种类型的竞争代表着在 Kaggle 和数据科学家期望在企业中解决的问题之间的巨大差距
你不会把精力放在算法的可解释性上
算法的可解释性变得非常重要。你可以有一个非常复杂的方法和最复杂的算法,但如果算法不能解释它是如何得出预测的,这在企业中是一个大问题。这种莫名其妙的算法被称为“黑盒”算法。
黑盒算法会让人对使用它失去信心。此外,从法律角度来看,这可能会产生问题。比方说,你开发了一套非常精确的算法来预测信用风险。在生产时,它将开始预测信用风险。有些人会得到低分。被拒绝的人,根据法律,有权知道为什么他们的申请被拒绝。如果算法决定无法解释,它可能会产生一个法律问题
在 Kaggle 竞赛中,赢家是基于准确性的衡量,而不是可解释性。这意味着参与竞争的数据科学家可以使用非常复杂的算法来提供非常高的准确性,而不必关心可解释性。这种方法可以赢得竞争,但在企业数据科学项目中可能无效
投资回报分析缺失环节
公司正在大力投资数据科学技能。他们期望数据科学项目能够带来 ROI(投资回报)。通常,成功的分析项目是那些将数据科学算法与 ROI 联系起来的项目。
一个这样的例子是预测性维护,即预测设备故障的概率。比如一台设备有 10%的故障概率,你需要派维修人员去检查机器吗?答案可能是否定的。如果失败的概率是 95%,那么答案是肯定的
然而,在实际情况下,大多数百分比是 55%,63%……答案不是很明显。如果公司向所有这样的设备派遣维护人员,这可能意味着巨大的成本。如果他们不发送,就有失败的风险
那么门槛百分比应该是多少呢?这就是 ROI 计算发挥关键作用的地方。对于数据科学家来说,得出这个阈值也是非常重要的,它可以帮助公司决定具体的行动。
Kaggle 不处理这类分析。工作范围只是达到预测,但没有考虑如何将数据科学的结果付诸行动,从而带来投资回报
你不会接触到模拟和优化
所有数据科学家的工具箱中都应该有模拟和优化算法,如系统动态模拟、基于代理的模拟或蒙特卡罗模拟。许多问题,例如财务优化、路线优化、定价,是数据科学家期望解决的不同类型的问题
如果你以价格预测为例,你可以使用机器学习技术,根据季节、日期、地点、竞争对手价格等各种特征来预测产品价格..但是机器学习算法预测的价格是最优价格吗?也许不是。为了确定最优价格,你需要首先确定一个优化目标。一个这样的优化目标可以是利润优化。在这种情况下,你需要确定一个能产生最佳利润的价格范围。为了留住顾客,这样的价格不能太高。同时,为了有好的利润率,它也不应该太低。
所以你需要优化算法来确定最优价格区间。如果预测价格落在该价格范围内,则机器学习的结果可以被接受,否则应该被拒绝
用 Kaggle,一般不给出利润优化等优化目标。因此,这个问题仍然局限于机器学习,优化的范围没有探索
无法经历部署和操作化
好了,你有了一个让你在 Kaggle 排行榜上升很高的模型。但是,模型的有效部署是完全不同的另一回事,这是 Kaggle 无法体验的
模型的有效部署可能涉及诸如 docker、kubernetes 或创建微服务之类的技术。虽然数据科学家不需要成为 docker 和 kubernetes 专家,但是至少他们应该能够熟练地使用它。例如,数据科学家被期望使用 docker 来创建评分管道。
操作化和部署还包括定期监控模型性能,并在需要时采取纠正措施。比如你有一个产品推荐的模型。并且在某个时间点观察到由于推荐的销售正在减少。突然开始给出糟糕建议的模型有问题吗?还是问题出在别的地方?
数据科学家需要参与这种情况,以获得真实而丰富的体验
所以超越“通常的数据科学”。尝试解决需要技能的问题,如算法的可解释性、ROI 估计、优化和这里解释的其他技能。这将是一次非常丰富的经历。通过解决各种有趣的现实世界的问题,你会有掌握数据科学世界的感觉
做一只鹰。高飞。对不同类型的数据科学问题有一个有利的观点。不要做一个目光短浅的人
额外资源
网站(全球资讯网的主机站)
*你可以访问我的网站进行零编码分析。【https://experiencedatascience.com *
请订阅每当我发布一个新的故事时,请随时关注。
* [## 每当 Pranay Dave 发表文章时,您都会收到电子邮件。
每当 Pranay Dave 发表文章时,您都会收到电子邮件。通过注册,您将创建一个中型帐户,如果您还没有…
pranay-dave9.medium.com](https://pranay-dave9.medium.com/subscribe)
你也可以通过我的推荐链接加入 Medium。
[## 通过我的推荐链接加入 Medium—Pranay Dave
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
pranay-dave9.medium.com](https://pranay-dave9.medium.com/membership)
Youtube 频道
这里是我的 Youtube 频道的链接
【https://www.youtube.com/c/DataScienceDemonstrated *
为什么要学习对象角色建模?
原文:https://towardsdatascience.com/why-learn-object-role-modelling-4eebd93dcda2?source=collection_archive---------7-----------------------
对象-角色建模(ORM)是一种为高精度数据/本体建模而设计的概念建模语言。
在过去的 40 年里,ORM 在信息通信技术领域鲜有建树;人们更喜欢使用像实体关系图、属性图模式和 UML(统一建模语言)类图这样的方法。
我认为这是因为使用后者更容易与他人交流思想。
这就是我们开发波士顿的原因;概念建模软件,让您创建概念模型作为对象-角色模型,并轻松地将这些模型转换成实体关系图和属性图模式。
人们自然会问:“为什么要学习对象-角色建模?为什么先做 ORM 里的模型?”
原因是多种多样的,但是最有用的答案是 ORM 比现在存在的几乎所有其他概念建模语言更具语义表达性。由于语义更加冗长,将 ORM 图翻译成 ERD 或 PGS 图很容易,但反过来就不那么容易了。事实上,用 ERD 和 PGS 图来表达一些东西是不可能的,因为用 ORM 来表达它们是标准的做法。
从逻辑上讲,很容易将 ORM 的注入或满射映射到其他建模语言,但是(在许多情况下)反过来是不可能的。
ORM 是一种基于事实的建模(FBM) ,概念建模语言家族,包括 FCO-IM(流行于荷兰,逻辑之乡)。
无论是从自然语言还是从基于逻辑的角度来看,FBM 语言都比大多数其他概念建模语言更具表现力。
通俗地说,与其他建模语言相比,使用 ORM 可以做更多的事情,这就是 ORM 和其他基于事实的建模语言受到概念建模专家欢迎的原因,这些专家一看就知道质量。
这并没有减损应急关系司/PGS 的效用,而只是肯定了 ORM 的效用。
在 Viev(【www.viev.com】T2),我们相信,从更广泛的实用角度来看,像实体关系图和属性图模式这样的语言更重要;因为更多的人理解他们,并能容易地与他们联系起来。不可否认,实体关系图和 PGS 图直接映射到广泛使用的数据库结构(关系数据库和图形数据库)。
我们还认为,从建模专业人员的角度来看,ORM 更重要,他们希望在概念建模方面得到最好的东西。
多模型数据库
我们认为,当世界正朝着包含关系模型(由 er 图充分服务)和图模型(由属性图模式充分服务)的多模型数据库发展时,试图用一种或另一种语言来支配思维共享是没有意义的。现代多模型数据库(如 SQL Server 2017)需要关系和图形模型的建模。波士顿允许你同时为其中一个或两个做模特。
当您学习 ORM 时,您可以在一种建模语言中为关系数据库、对象关系数据库和图形数据库建模。
这就是为什么我们觉得学习对象角色建模很重要。
例子
我所讲的一个简单的例子将展示你可以在 ORM 中做的事情,这些事情你在几乎所有其他概念建模语言中都做不到。
以下面的概念模型为例,表示为属性图模式。
在我们的波士顿建模软件中,你[控制]-点击一个节点类型来查看它的属性。
该模型是一个话语世界(UoD ),我们正在寻找一个电影院的座位预订设施。
电影院有成排的座位和放映电影的时段。一个人可以在电影院预订一个或多个座位,以便他们可以去观看预订的电影(在一个会话内)。
下面以实体关系图的形式显示了相同的模型:
PGS 模型和 ERD 模型都缺少重要的信息,这是一个约束条件:
如果某个预订有一些座位,那么该预订是在某个电影院的某个时段,该电影院包含包含该座位的某个行。
即,在没有放映该人想要观看的电影的电影院预订座位是没有意义的(在一个会话内)。
这个约束是作为子集约束在 ORM 图中创建的,由子集约束符号表示:
Subset Constraint Symbol in ORM
相应的 ORM 图如下所示:
我们相信任何有理性的人都会说属性图模式是最容易可视化的(就所分析的概念而言)。接下来是实体关系图。但是 PGS 和 ERD 都没有抓住关键的限制因素:
“如果一些预订有一些座位,那么该预订是针对在一些电影院的一些时段,该电影院包含包含该座位的一些行”。
在开发和测试 IT 系统以满足我们的影院预订需求时,这些关键约束可以节省宝贵的时间。
因为 ORM 是基于自然语言和专门的谓词逻辑的,虽然图表很有用,但是点击约束并让基于 ORM 的软件用自然语言表达约束的意思是无价的。
Verbalisations in Boston
业务分析师可以用 ORM 开发模型,并用自然语言表达系统的需求。
子集约束是可以在 ORM 中表达的八种不同约束之一。ORM 中的一些约束有许多变体,涵盖了八种主要类型之外的各种场景。
本文中提供的例子说明了为什么您可能喜欢学习对象-角色建模。使用像 Boston 这样的软件,您将模型表示为属性图模式或实体关系图的愿望得到了尊重,如果您正在使用多模型数据库,Boston 就是专门为您的需要而设计的。
我希望这有所帮助。如果时间允许,我会写更多关于 ORM、ERDs 和 PGS 的文章。
注意:对象-角色建模版本 2 (ORM 2)的图形符号有其局限性,我将在本文中讨论这些局限性:对象-角色建模和模糊性
NB 本文表达的模型原始版本版权归 DataConstellation 所有,在 GitHub 上的 ActiveFacts 项目下共享:【https://github.com/cjheath/activefacts】T4
— — — — — — — — — — — — — — — —
为什么机器学习是世界上最好的领域
原文:https://towardsdatascience.com/why-machine-learning-is-the-best-field-in-the-world-af010245228e?source=collection_archive---------9-----------------------
很迷人,很多样,不魔幻,很有创意,很科学,很自由!
几年前,当我还是一名初级软件工程师时,我和我们的一名算法开发人员一起解决了一个问题。我以为我找到了突破点:有一个算法做错了。我问开发者为什么算法会这样做,我得到的答案是:
“我不知道”
“你不知道”是什么意思?这是你写的,对吗?让我换个说法:有一个你创造的机器,它做一些你无法解释的事情?
当然,有时在软件开发中,我们会遇到难以解释的事情。但是在这种情况下,没有调试它的选项:一步一步慢慢地让图片变得更清晰。在这种情况下,有一行代码返回了一些值,但不可能(或者很难)知道为什么。
让我目瞪口呆。创造一些你无法解释的东西的能力让我着迷。在那一天,我决定我要做一些对我来说很难解释的事情。
今天,我知道机器学习(或深度学习,人工智能,数据科学和计算机科学)是最好的领域。造成这种情况的原因有很多,让我着重讲这六个:
太迷人了
正如我上面提到的,在远非简单的系统上工作,能够执行真正非凡的任务,是非常令人兴奋的。以“文本”为例。今天,我们拥有能够理解我们所说或所写的系统/代理。好吧,不是很明白,但它能够代表我们的语言,可以帮助我们完成许多任务,如翻译、问答、分类(如垃圾邮件检测)等等!我们许多人认为机器为我们做的事情是理所当然的。当然不仅仅是在“文本”中。在许多其他领域,机器解决了我们的许多问题/任务(稍后将详细介绍)。身处这场革命的中心给我们带来了最有趣的挑战。
多种多样
今天,机器的能力是无限的。很难找到一个领域不受益于机器学习(如果有,它会变得有趣得多)。如今,自然语言、图像、医疗数据、广告、人力资源等领域越来越多地使用机器学习。机器可以玩游戏、雇人、交易加密货币、驾驶汽车、帮助诊断疾病、在你的手机上推荐应用程序、在脸书上给你看广告、帮助你开车到达目的地等等。通过进入机器学习领域,你几乎可以在任何其他领域工作。
这不是魔法
技术和魔法可能看起来有些相似,但它们有一个关键的区别。当你看到伟大的技术和很酷的魔术时,一开始你会感到惊讶。然后,你很好奇想知道引擎盖下。在大多数情况下,当你理解了魔术的工作原理,你会对它的愚蠢和简单感到失望。然而,对于技术,当你更好地理解它是如何工作的,它会让你更加惊讶。在机器学习中,解决方案是卓越的和创造性的,这让我想到了我的下一个观点:
它包含了无限的创造力
在许多领域都是如此,尤其是在数学和计算机科学领域。在机器学习中,有无尽的解决问题的方法和无限的想法可以尝试和研究。一开始你什么都没有。你从一张白纸/文件开始。你开始从零开始构建你的系统/代理/模型。你可以使用以前尝试过的许多方法中的一种,你可以修改和改进它们,使它们更适合你的任务,或者你可以从事一些全新的工作。解决方案并不简单,很多时候,为了达到最佳效果,我们必须非常有创意。
这是科学
无论你是否通过积极的研究和发表你的工作积极地为科学做出贡献,当你处理机器学习时,你必须跟上最新的进展。而且还有很多。像 ICML 和 NeurIPS 这样的会议以及来自谷歌、脸书和其他研究实验室的论文带来了许多科学进步。这个科学领域很“活”。有很多方法可以跟上最新的报纸。让它成为“科学”的是这样一个事实,即每天我们都会发现一些关于我们世界的新东西。适用于重要领域的新方法,改进算法的新技术。这是真正的进步,它改变了我们的生活。
它是开源的
就像软件开发一样,你的大部分资源(除了计算能力)都是免费的!工具、框架、ide 等等。想想 sci-kit learn,tensorflow,keras,jupyter noteook 等。所有这些免费工具让我们的生活变得更加轻松,让我们专注于真正重要和有趣的部分。但不仅仅是工具。所有的知识都是免费的。今天,你可以通过使用不同的 MOOCs、免费书籍和数百万博客帖子和教程,免费获得所有相关资源。只要在谷歌上搜索一些你想学的话题,你就会得到无穷无尽的资源
我总结一下,机器学习很可能并不适合所有人。我肯定还有其他人喜欢其他事情,但对我和更多人来说,机器学习是世界上最好的领域。
为什么机器学习在边缘?
原文:https://towardsdatascience.com/why-machine-learning-on-the-edge-92fac32105e6?source=collection_archive---------5-----------------------
“A view from the orbit on an artificial satellite over white clouds on the ocean” by NASA on Unsplash
软件工程可能很有趣,尤其是当与志同道合的人朝着共同的目标努力时。自从我们开始了微控制器(MCU)人工智能框架 uTensor 项目,许多人问我们: 为什么要在 MCU 上进行边缘计算?云与应用处理器还不足以构建物联网系统吗? 深思熟虑的问题,确实如此。我将尝试在这里展示我们对这个项目的动机,希望你也会感兴趣。
TL;MCU 上的 AI 使更便宜、更低功率和更小的边缘设备成为可能。它减少了延迟、节省了带宽、提高了隐私性并支持更智能的应用。
An image of a Mbed development board (source)
什么是 MCU?
MCU 是非常低成本的微型计算设备。它们通常位于物联网边缘设备的中心。每年出货 150 亿个 MCU,这些芯片无处不在。它们的低能耗意味着它们可以依靠纽扣电池运行数月,并且不需要散热器。它们的简单性有助于降低系统的总成本。
未利用功率
在过去的几十年中,MCU 的计算能力一直在增加。然而,在大多数物联网应用中,它们只不过是将数据从传感器转移到云中。MCU 的时钟频率通常为数百 MHz,封装有数百 KB 的 RAM。鉴于时钟速度和 RAM 容量,转发数据是一件轻而易举的事。事实上,MCU 大部分时间都是空闲的。下面我们来举例说明:
A representation of MCU’s busy vs idle time for typical IoT applications
上图区域显示了 MCU 的计算预算。绿色区域表示 MCU 处于忙碌状态,包括:
- 建立工作关系网
- 传感器读数
- 更新显示
- 定时器和其他中断
蓝色区域代表闲置的、未开发的潜力。想象一下,现实世界中部署了数百万台这样的设备,集合起来就是大量未被利用的计算能力。
向边缘设备添加人工智能
如果我们能利用这种力量呢?我们能在边缘做得更多吗?事实证明,人工智能非常适合这里。让我们看看我们可以在边缘应用人工智能的一些方法:
推理
Projection into a 3D space (via PCA) of the MNIST benchmark dataset. (source)
可以在边缘设备上完成简单的图像分类、手势识别、声音检测和运动分析。因为只传输最终结果,所以我们可以在物联网系统中最小化延迟,提高隐私性并节省带宽。左图显示了投影空间中的经典手写数字数据集 MNIST。
传感器融合
An image of the super sensor, including accelerometer, microphone, magnetometer and more (source)
使用机器学习和其他信号处理算法,不同的现成传感器可以组合成一个合成传感器。这些类型的传感器能够检测复杂的事件。与基于摄像机的系统相比,这些传感器成本更低,能效更高。超级传感器的一个很好的例子可以在这里找到。
自强产品
An illustration of federated learning (source)
设备在现场部署后可以不断改进。谷歌的 Gboard 使用了一种叫做联合学习的技术,这种技术涉及每一个设备收集数据并做出个人改进。这些单独的改进被集中在一个中央服务上,然后每台设备都用组合的结果进行更新。
带宽
神经网络可以进行划分,以便在设备上评估一些层,而在云中评估其余层。这实现了工作负载和延迟的平衡。网络的初始层可以被视为特征抽象功能。随着信息在网络中传播,它们会抽象成高级功能。这些高级功能占用的空间比原始数据少得多,因此更容易通过网络传输。物联网通信技术,如 Lora 和 NB-IoT 的有效载荷大小非常有限。特征提取有助于在有限的有效载荷中打包最相关的信息。
An illustration of the Lora network setup for IoT (source)
迁移学习
在上面的带宽示例中,神经网络分布在设备和云之间。在某些情况下,只需改变云中的层,就可以将网络重新用于完全不同的应用。
A graphical representation of transfer learning (source)
云中的应用程序逻辑很容易更改。网络层的这种热插拔使得相同的设备能够用于不同的应用。修改网络的一部分以执行不同任务的实践是迁移学习的一个例子。
生成模型
作为上述带宽和迁移学习示例的补充,通过仔细的工程设计,可以根据从数据中提取的特征来重构原始数据的近似值。这可以允许边缘设备以来自云的最少输入生成复杂的输出,以及在数据解压缩中具有应用。
包装
人工智能可以帮助边缘设备变得更加智能,提高隐私和带宽利用率。但是,在撰写本文时,还没有已知的在 MCU 上部署 Tensorflow 模型的框架。我们创建了 uTensor,希望推动边缘计算的发展。
低功耗和低成本的 AI 硬件像 MCU 一样普及可能还需要一段时间。此外,随着深度学习算法快速变化,拥有一个灵活的软件框架来跟上人工智能/机器学习研究是有意义的。
uTensor 将继续利用最新的软件和硬件进步,例如 CMSIS-NN,Arm 的 Cortex-M 机器学习 API。这些将被集成到 uTensor 中,以确保 Arm 硬件的最佳性能。开发人员和研究人员将能够使用 uTensor 轻松测试他们的最新想法,如新算法、分布式计算或 RTLs。
我们希望这个项目能把对这个领域感兴趣的人聚集在一起。毕竟,协作是在尖端领域取得成功的关键。
在 Medium 和 Twitter 上关注我,了解即将发布的事件文章。
了解更多信息
uTensor 文章(即将发布)
uTensor . ai
奥莱利人工智能大会
FOSDEM 2018
演示视频
量化博客
为什么许多重要人物都认同人工智能的生存风险
原文:https://towardsdatascience.com/why-many-important-minds-have-subscribed-to-the-existential-risk-of-ai-a55cfc109cf8?source=collection_archive---------4-----------------------
Photo by Arif Wahid on Unsplash
埃隆·马斯克(Elon Musk)一直在就人工智能给人类物种带来的生存风险敲响警钟。他是一位杰出的领导人,拥有公众眼中最敏锐的思维,因此,对他来说,对我工作的领域感到担忧,并感觉不到这种存在风险,已经造成了相当大的认知失调。我本能地不同意像他这样的人,以及像尼克·博斯特罗姆、斯蒂芬·霍金斯和比尔·盖茨这样的人,这让我很好奇。他们都更关心这个话题(至少在媒体上),而不是像全球变暖这样突出的问题。
尼克·博斯特罗姆(Nick Bostrom)写了畅销书《超级智能》(Super Intelligence),描述了一个机器智能主宰人类智能并以我们的灭绝而告终的世界。尽管这种世界观令人沮丧,但博斯特罗姆用理性和宽松的时间表来接近它。他为研究人工智能控制问题提出了一个强有力的论点,在这个问题上,如果人工智能行为不当,我们人类有能力轻易关闭它。博斯特罗姆的书激发了许多讨论、会议和知名人士的参与,并使这个假设的问题合法化。这已经成为一个新的研究领域。
未来生命研究所发布了一封人工智能公开信,警告人工智能的风险,并鼓励确保系统有益于社会的研究。签名的科学家数量惊人,包括 Deepmind 的联合创始人 Yann LeCun、Yoshua Bengio 和 Geoffrey Hinton。
下面总结了我在与这种认知失调作斗争并得出解决方案后的分析。
首先,一些快速定义:
人工通用智能(AGI) 是机器的智能,它可以做人类能做的任何任务。
超级智能(SI) 是一种能力远远超过最聪明和最有天赋的人类思维的智能体。
为什么他们是对的
智能是信息处理的一种功能。我们的大脑是一个信息处理发电站,我们并不完全了解,但我们知道如果我们把大脑切成两半,我们的智力会下降,因为核心信息路径被破坏了。
摘自《关于健壮有益的人工智能研究重点的公开信》(Russell 等人):
随着这些领域和其他领域的能力跨越从实验室研究到有经济价值的技术的门槛,一个良性循环开始形成,即使很小的性能改进也价值不菲,从而刺激更多的研究投资。现在有一个广泛的共识,即人工智能研究正在稳步前进,它对社会的影响可能会增加。
我们在技术上建立的信息处理系统在不断改进。这个领域有一个改进和再投资的最佳时机,可以产生越来越强大的信息处理和情报能力。像比尔·盖茨和埃隆·马斯克这样的人比大多数人更了解复利,并从从业者和研究人员可能没有的角度观察了人工智能领域的这一现象。
近年来深度学习和强化学习的产量,产生了像 AlphaGo,Alexa 等系统。已经表明,我们不仅发展了系统,我们还把系统发展到了我们还没有完全理解的程度。我在周末看了 AlphaGo 关于网飞的纪录片,有所收获。我们已经在狭窄的领域建立了几个真正比我们自己更聪明的系统,要理解为什么这个系统会做出任何给定的选择是很困难的。在任何一种复合增长中,我们将建立信息处理系统,在足够多的领域超越我们,被认为是“一般智能”。
与此同时,研究人员会争辩说,我们现在不知道如何训练、教授或编程这样的系统。我每天都在训练深度学习模型,我不认为自己会在短期内意外训练出 AGI。关于神经科学、学习理论和智力,我们有太多东西要学,以至于我们不可能知道什么时候我们会知道得足够多。
我敢打赌,他们对此的回答是,我们目前在哪里并不重要,重要的是改进的速度。
AGI 问题是不对称的
随着我们在这一领域的技术进步,那些支持博斯特罗姆关于人工智能构成生存风险的观点的人将增加他们正确的概率。即使从 0.000000001 到 0.000000002,这仍然是 100%的概率改善。如果你想在 continuum 中站在正确的一边,你应该站在博斯特罗姆和他的公司一边。
如果 100 年后:
- 我们还没有建成一个 AGI,他们会说,“嗯,我们比以往任何时候都更接近了”
- 我们已经建立了一个,但这不是一个问题,他们可以说,“唷!我们的努力得到了回报!我们很高兴我们给这个领域带来了足够的关注,因此我们建立的人工智能对社会有益”
- 我们已经建立了超级智慧,导致了大规模的人类痛苦和死亡,他们将是正确的,并将成为我们的光和真理的灯塔。如果他们变得甚至像神一样,我也不会感到惊讶。
- 我们已经建立了导致我们灭绝的超级智能,那么一切都不重要了。
像埃隆·马斯克和比尔·盖茨这样的名人有兴趣站在历史的正确一边,因为他们已经在未来几个世纪的书籍和传说中永垂不朽。埃隆·马斯克(Elon Musk)经营着一家销售无人驾驶汽车的汽车公司,他甚至有更多的理由保持警惕和彻底的偏执。由恶意或不了解的力量控制的自动驾驶汽车的联网信标可能是灾难性的。从个人的角度来看,他偏执的唯一坏处是因为偏执而受到指责。一个短期的好处可能是,他的员工在为特斯拉和 Space X 制造的车辆设计安全的自主系统时,会把他的担忧放在心上。
总之,高调的相关人士对此有可怕的看法越来越重要,但这并不意味着它们是真的。是的,这种可能性可能在缓慢前进,但是很少有显著的进步预示着即将到来的普遍智能。一般来说,你不必担心马斯克和扎克之间的争论,因为他们在社会和历史中的角色是他们争论的关键。马斯克站在历史的角度,而扎克站在当下。事实上,如果您在不同的时间跨度内度量正确性,它们的语句都可能是正确的。
然而,随着人工智能系统比以往任何时候都更加自主地训练和部署,理解和控制这些系统的任务变得巨大,因此风险也很高。在人工智能安全的不同问题领域,大量的研究正在蓬勃发展,许多聪明人正在从事这项工作。我猜测,未来三到五年,顶级科技公司对这些研究人员的需求会很大。如果关于 AGI 的耸人听闻的无法证实的说法产生了涓滴效应,导致了这项急需的研究,这可以被视为净效益。这里有一篇很棒的文章关于人工智能安全中的一些具体问题,在这里你可以触及一个停飞的研究领域的表面,而不是把它的头埋在沙子里。
为什么元数据很重要
原文:https://towardsdatascience.com/why-metadata-matters-ab7253ea35c7?source=collection_archive---------12-----------------------
通过将元数据放入区块链来解决科学的数据缺失问题
Photo by Tobias Fischer on Unsplash
当我们想到区块链的主要特征——它的去中心化、不可改变和普遍可及的性质——就很容易理解为什么人们对改进科学的潜力感到兴奋。区块链技术正在快速发展,为科学和科学家带来了新的机遇。
在 Frankl,我们对不久的将来的可能性感到兴奋。但是,我们当前关注的是提供今天可以实施的务实解决方案。
我们走向区块链化科学的第一步涉及元数据。这里我们指的是关于的数据数据(收集时间,使用的软件,存储位置等等),而不是实际的数据本身。
这听起来很简单——而且可能很无聊。但是,将元数据放在区块链上最终是解决科学中最大、最古老的问题之一的一个非常有效的方法。
数据都去哪了?
当我们审视影响当今科学的问题时,最紧迫的问题之一是数据的消失。
科学数据可能会因为许多不同的原因而“擅离职守”:
- 科学家没有正确归档他们的数据,他们失去了对这些数据的跟踪,无法理解这些数据,或者他们的硬盘驱动器坏了,他们没有备份。这种情况令人惊讶地(也令人尴尬地)经常发生。
- 科学家开始了一项研究,但由于缺乏资金、初步结果不乐观或其他优先事项,在完成之前放弃了这项研究。这些数据与其他研究的数据结合起来可能会有用,但它本身是不能发表的。
- 科学家有选择地发布支持某一特定理论的数据。不方便的数据被悄悄遗忘。
- 科学家们试图发布数据,但没有成功,因为科学期刊认为这些结果不够有趣。
- 科学家们知道发表一个无效的结果有多困难,所以他们优先撰写那些能给他们带来更多可发表结果的研究。
最终结果就是众所周知的“文件抽屉问题”。发表的科学文献只代表了实际进行的研究的一小部分有偏见的样本。其余的被塞在隐喻的文件柜后面。
这里有很多浪费的工作——收集数据,然后不使用。但是更大的问题是《T3》出版的《T2》中的偏见。
行动中的出版偏差
这种“发表偏见”的一个例子来自我自己对自闭症的研究。
2011 年,我和我的同事发表了一项研究,我们给一组大学生一个简单的“视觉搜索”任务,包括在复杂的显示器中定位小物体。我们发现,具有高度类似自闭症的人格特征的学生在这项任务中表现得比这些特征较少的学生更好。
这是一个有趣的发现,因为许多研究表明,实际临床诊断患有自闭症的人在这类任务中表现也很好。因此,我们的结果与自闭症存在于一个逐渐消失在普通人群中的连续统一体中的想法是一致的。
西澳大利亚的另一个小组大约在同一时间报告了类似的发现,所以我们确信这是一个真实的影响。但是几年后,我被邀请对剑桥大学研究人员的一项 T4 研究进行同行评议。他们完全遵循了我们的方法,但使用了更大的样本——而且没有发现任何效果。
在这一点上,我开始询问该领域的其他研究人员,他们是否研究过同样的问题。原来,几个实验室已经这样做了,但没有公布他们的结果,因为他们没有发现一个效果。
多余的研究
这只是一个例子。但是发表偏倚是整个科学界的一个主要问题。如果我们想知道一种影响是否真实——这种影响是否涉及自闭症特征的关联或最新癌症药物的疗效——我们需要看到数据的整体混乱。我们不仅仅想要讲述一个好故事的数据。
科学家在实际上多余的研究上浪费了大量的时间和金钱——因为研究已经完成但被认为是不可公开的,或者因为它试图建立在本身经不起审查的研究上。
在 2016 年对 1500 多名科学家的调查中,发表在自然上的“选择性报道”被评为导致不可复制结果的最重要原因。
第一步是我们需要知道关于所有的数据。这就是区块链可以发挥真正重要作用的地方。
区块链的元数据
在 Frankl,我们正在开发通过设计促进开放科学的应用程序。使用 Frankl 应用程序收集的数据将被动态存档(不再依赖不可靠的硬盘)。这样,共享数据就变成了更改访问权限的简单练习。
数据的归档位置和形式取决于多种因素,包括数据文件的大小、其私有或公共性质,以及任何道德和法律考虑因素,如 GDPR 合规性。这自然会因项目而异,并且会随着技术的发展而发展。
但是无论实际数据发生什么情况,默认设置都是将元数据写入区块链。每当使用 Frankl 应用程序收集数据时,应用程序中的智能合约会向区块链发送一条短信。这可能包括:
- 数据收集的时间和日期
- 研究人员的身份证
- 用于收集数据的 Frankl 应用程序的标识和版本号
- 指向存档数据的指针(例如,存储库的 URL)
- 实际数据的散列
[哈希是从数据中导出的短字符串。您无法从哈希中恢复数据。但是如果有数据,您可以将它与元数据中的哈希进行匹配,并确认它没有被更改。]
为什么元数据很重要
将元数据写入区块链是简单易行的第一步。它只依赖于现有的技术(不依赖于仍处于测试版本的技术)。元数据本身很小,因此写入区块链所涉及的成本(即“气体”)也很小。因为绝对没有任何东西可以让任何人识别研究的对象,所以不应该有伦理或隐私问题要争论。
然而,即使是这小小的一步也具有难以置信的力量。因为区块链是公共的和不可变的,所以不能假装不方便的数据不存在。如果科学家从他们报告的分析中排除数据,他们必须证明这一点。
公共的、不可变的元数据有助于防止实际数据消失。这使得将不同研究的结果结合起来进行荟萃分析变得更加容易,这些研究着眼于相同的效果(现在可以包括尚未发表、也许永远不会发表的研究)。它还提供了一种机制,科学家可以通过这种机制展示他们对合作项目的贡献。
元数据的魅力不仅仅在于它的简单性,还在于它的通用性。不管相关的数据文件有多大,如何组织,存储在哪里,甚至是属于什么科学领域,我们都可以对元数据采用相同的结构。
区块链上的元数据可以是链接所有 Frankl 项目的线索,是所有未来开发的基础。这是迈向区块链化科学的第一小步,但却是重要的一步——远离正常的科学。
在 Frankl,我们的使命是让开放科学对科学家来说变得容易和有益。如果你想了解更多,最好从我们的 中页 开始。
您也可以阅读我们的 白皮书 ,查看我们的 网站 ,关注我们的 脸书 和
我们喜欢反馈(正面的和负面的),所以请让我们知道你的想法——写一个回复或者点击♥按钮,与朋友和同事分享这篇文章。
为什么有重要变量的模型可能是无用的预测器
原文:https://towardsdatascience.com/why-models-with-significant-variables-can-be-useless-predictors-3354722a4c05?source=collection_archive---------13-----------------------
理解你的回归
Photo by Rakicevic Nenad from Pexels
统计模型中的重要变量不能保证预测性能
在数据科学或实验科学课上,你首先要学习(或应该学习)的一件事是解释模型和预测模型之间的区别。解释模型通常测试关于变量之间关系的假设,例如它们是否显著协变,或者组之间是否存在显著的数值差异。另一方面,预测模型关注的是经过训练的模型能够在多大程度上估计出未在训练中使用的结果。不幸的是,在解释模型中有多个重要变量并不能保证预测模型的高准确性。
这两种模型类型经常被混为一谈,例如将回归模型中的自变量描述为“预测”因变量。专注于统计建模的研究人员也可能假设这种高显著性(例如 p <.001 in="" their="" variables="" may="" be="" an="" indicator="" of="" prediction="" ability="" the="" model.="" this="" confusion="" permeates="" not="" only="" class="ae mk" href="http://science.sciencemag.org/content/355/6324/486" rel="noopener ugc nofollow" target="_blank">社会科学以及其他数据丰富的科学学科,如遗传学和神经科学)。
如此多的研究人员仍然将这两者混为一谈的原因之一可能是他们经常通过文本示例而不是数字示例来了解二者的区别。为了说明模型中的显著性如何不能保证模型预测,这里有一个快速模拟,它创建了一个合成数据集来显示假设检验模型中的显著变量如何不能用于预测实际结果。
首先,让我们加载所需的库并生成一些合成数据。我们可以使用 sci-kit learn 的[make_classification](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_classification.html)
功能轻松做到这一点。我们有意通过翻转 80%的 y 标签来使分类变得困难。将有 1000 个样本和 3 个特征,其中 3 个特征将在它们与 y 变量(0 和 1)的关系中提供信息。我们还将人工数据分为训练集(80%)和测试集(20%)。
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
import numpy as np, pandas as pd, matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split# Generate synthetic data
X,y = make_classification(n_samples=1000, n_features=3, n_informative=3, n_redundant=0, n_classes=2, n_clusters_per_class=1, flip_y=.8, random_state=2018)
colnames = ['X'+str(col) for col in range(X.shape[1])]
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=.2, random_state=1)df_train = pd.DataFrame(np.concatenate([X_train,np.expand_dims(y_train,axis=1)],axis=1), columns = np.concatenate([colnames,['y']]))
df_test = pd.DataFrame(np.concatenate([X_test,np.expand_dims(y_test,axis=1)],axis=1), columns = np.concatenate([colnames,['y']]))
现在让我们以散点图的形式可视化数据,其中轴代表变量。每个点代表一个样本,颜色表示 y 标签,0 或 1。
from mpl_toolkits.mplot3d import Axes3Dfig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.view_init(elev=45., azim=45)
for _y in [0,1]:
ax.scatter(X.T[0,y==_y],X.T[1,y==_y],X.T[2,y==_y],alpha=.3,s=10,label=f'y{_y}')
plt.legend()
plt.tight_layout();
散点图看起来很乱,但正如预期的那样,因为我们使分类变得困难。为了查看变量中是否有任何显著的组差异,让我们分别绘制每个变量的分布。我们还可以进行简单的假设 t 检验,以确定两组在这些变量上的差异。
from scipy.stats import stats
kwargs = dict(histtype='stepfilled', alpha=0.3, density=True, bins=60)
f,axes = plt.subplots(1,len(colnames),figsize=(20,4))
for ix, x_label in enumerate(colnames):
y0 = df_train.query('y==0')[x_label]
y1 = df_train.query('y==1')[x_label]
ax = axes[ix]
ax.hist(y0, **kwargs,label='y0')
ax.hist(y1, **kwargs,label='y1')
ax.axvline(np.mean(y0),color='b',alpha = .5)
ax.axvline(np.mean(y1),color='r',alpha = .5)
# Run t-test between groups
t, p = stats.ttest_ind(y0,y1, equal_var=False)
title = f"{x_label} group difference \n t: {t:.2f}, p: {p:.2e}"
ax.set(xlabel=x_label,ylabel='counts',title=title)
plt.legend()
plt.show();
从显示组均值和 t 检验结果差异的直方图中,我们可以看到,两个变量 X0 和 X2 显示了两组之间的统计学显著差异。
作为一个更稳健的测试,我们通过用 X 变量拟合关于 y 的逻辑回归建立一个解释模型,假设 X0 和 X2 在估计 y 的值时显著相关
import statsmodels.formula.api as smf
formula = 'y~'+'+'.join(colnames)
mod = smf.logit(formula=formula,data=df_train)
res = mod.fit()
print(res.summary())
咻,我们的假设被证实了,X0 和 X2 显示出与 y 标签的显著关系。因为我们有两个重要的预测变量,一个是 p <.05 and="" the="" other="" p="" one="" might="" assume="" that="" we="" can="" do="" really="" well="" in="" class="nl">预测 y 标签。
我们来看看是不是这样。
为了测试我们的 Xs 是否能够很好地预测 y 标签,我们在训练集上拟合了一个逻辑回归模型,但在测试集上评估了它的预测准确性。
from sklearn.linear_model import LogisticRegressionclf = LogisticRegression(solver='lbfgs')
clf.fit(y=df_train['y'], X= df_train[colnames])
print("Training Accuracy:", clf.score(df_train[colnames],df_train['y']))
mean_score=clf.score(df_test[colnames],df_test['y'])
print("Test Accuracy:", clf.score(df_test[colnames],df_test['y']))>> Training Accuracy: 0.58625
>> Test Accuracy: 0.55
我们的结果显示准确性(55%)略高于偶然性(50%),但没有当你看到 p <.01./>
Let’s look at what these performance look like graphically in a 混淆矩阵和 ROC(接收器操作特性)曲线时肾上腺素激增那么令人印象深刻。
from sklearn.metrics import confusion_matrix, roc_curve, aucdef plot_confusion_matrix(cm, classes,
normalize=False,
title='Confusion matrix',
cmap=plt.cm.Blues):
"""
This function prints and plots the confusion matrix.
Normalization can be applied by setting `normalize=True`.
"""
import itertoolsif normalize:
cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
print("Normalized confusion matrix")
else:
print('Confusion matrix, without normalization')
plt.imshow(cm, interpolation='nearest', cmap=cmap,vmin=0,vmax=1)
plt.title(title)
plt.colorbar()
tick_marks = np.arange(len(classes))
plt.xticks(tick_marks, classes, rotation=45)
plt.yticks(tick_marks, classes)fmt = '.2f' if normalize else 'd'
thresh = cm.max() / 2.
for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
plt.text(j, i, format(cm[i, j], fmt),
horizontalalignment="center",
color="white" if cm[i, j] > thresh else "black")plt.ylabel('True label')
plt.xlabel('Predicted label')
plt.tight_layout()
cm = confusion_matrix(y_true = df_test['y'], y_pred = clf.predict(df_test[colnames]))
plot_confusion_matrix(cm, classes=clf.classes_,normalize=True)
如果这是一个非常好的模型,我们会在混淆矩阵的对角线上看到强烈的深色细胞。单元格之间缺乏区分说明了我们的模型在区分标签方面表现不佳。它在 54%的时间里准确地预测了 0 标签,而对标签 1 的预测只有 43%。
绘制 ROC 曲线是说明模型的敏感性和特异性的一种方式,其中一个好的模型将由偏离对角线最远的曲线来说明。
y_score = clf.decision_function(X_test) fpr, tpr, thresholds =roc_curve(y_test, y_score) roc_auc = auc(fpr,tpr) plt.plot(fpr, tpr, lw=1, alpha=0.3,label='ROC test (AUC = %0.2f)' % (roc_auc)) plt.legend() plt.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r', label='Chance', alpha=.8); plt.axis('square');
我们的 ROC 线几乎没有与对角线分开,再次显示了它的糟糕表现。
最后,由于机会本身并不是模型显著性的良好指标,让我们测试一下随机模型与其他随机可能模型相比表现如何。
from sklearn.model_selection import KFold, RepeatedKFold
from sklearn.linear_model import LogisticRegressionCVnp.random.seed(1)
kfold = RepeatedKFold(n_splits=5, n_repeats = 5)
n_permute = 200
permuted_scores = []
count = 0
for train_ix, test_ix in kfold.split(X):
X_train, X_test = X[train_ix], X[test_ix]
y_train, y_test = y[train_ix], y[test_ix]
train_df = pd.DataFrame({'y':y_train})
for permute_ix in range(n_permute):
count+=1
if count%100==0:
print(count,end=',')
y_train_shuffled = train_df[['y']].transform(np.random.permutation)
clf = LogisticRegressionCV(cv=5)
clf.fit(X_train,y_train_shuffled.values.ravel())
score = clf.score(X_test,y_test)
permuted_scores.append(score)
train_shuffled_score = np.mean(permuted_scores)
score_percentile = np.mean(mean_score < permuted_scores)
title = f'True score percentile : {score_percentile}'
f, ax = plt.subplots()
plt.hist(permuted_scores,bins=15)
ax.axvline(train_shuffled_score,color='k',linestyle='--',label='Chance')
ax.axvline(mean_score,color='r',linestyle='--',label='True classification score')
ax.set(xlim=[0.1,.9],xlabel='Accuracy (%)',ylabel='Count',title = title)
plt.legend();
我们 55%的比机会更好的准确性证明并不比其他随机模型好多少(p=.0812)。这最终表明,解释性模型中有重要的预测因素并不能保证预测模型的性能。
我们学到了什么
上面的例子说明了解释或假设检验模型的重要变量可能无法保证预测的重要性能。当然,会有重要模型确实提供良好预测的情况,但重要的是要记住这种模拟并不总是如此。
结论
下次你的假设检验朋友告诉你,他们不需要运行预测模型,因为他们的变量非常重要,确保你用模拟数据的例子向他们说明,他们在模型中的重要变量根本不能保证预测的准确性。
标签:[machine-learning](http://jinhyuncheong.com/tag/machine-learning)
[significance](http://jinhyuncheong.com/tag/significance)
[permutations](http://jinhyuncheong.com/tag/permutations)
[analysis](http://jinhyuncheong.com/tag/analysis)
[data](http://jinhyuncheong.com/tag/data)
[prediction](http://jinhyuncheong.com/tag/prediction)
[simulation](http://jinhyuncheong.com/tag/simulation)
[python](http://jinhyuncheong.com/tag/python)
原载于 2018 年 12 月 12 日jinhyuncheong.com。
为什么大多数公司错过了数据革命(以及他们可以做些什么来跟上)
原文:https://towardsdatascience.com/why-most-companies-are-missing-out-on-the-data-revolution-and-what-they-can-do-to-keep-up-63bfded77783?source=collection_archive---------9-----------------------
世界上 90%的数据是在过去两年内创建的,到 2020 年,将有超过 340 亿个对象产生数据(1,2)。我们正处于一个信息爆炸的时代,其规模之大,常常令人难以理解。它已经完全改变了我们的运作方式。试着想象一个没有 Yelp 评论、Waze 导航或烂番茄配乐的简单电影之夜。数据分析已经迅速渗透到我们日常生活的方方面面。
图 1:生成的全球累计数据总量(来源:IDC /凯捷)
对企业来说,这种影响是革命性的。数据对商业决策变得如此重要,以至于《经济学人》最近宣称它是世界上最有价值的资源(3)。数据智能是新的竞争优势。毫不奇怪,五个最有优势的数据经纪人——苹果、Alphabet、微软、脸书和亚马逊——是目前世界上最有价值的五家上市公司(4)。
公司的适应能力最终将更少取决于技术技能,而更多地取决于他们阅读和解释统计结果的能力。正如马克·吐温所说,有“谎言、该死的谎言和统计数据。”员工将越来越多地根据数据中的故事做出决策,因此他们拥有确定这些故事是否真实的工具至关重要(你可以在下面测试你的技能)。
每个人现在都是数据科学家
最近数据爆炸的一个有趣结果是越来越多的人将自己归类为数据科学家。
该职业用于描述在机器学习、统计和面向对象编程方面具有独特的跨职能专长的个人。现在,它似乎包含了所有了解 SQL 和 Tableau 的人。
从许多方面来看,这是一个积极的发展。当组织拥有专门的数据科学团队时,这些团队可能很难理解其问题的完整业务背景。具有基本分析技能的业务经理可以通过向数据科学团队传达意义,或者只是通过自己运行分析来弥合差距。
在未来五年,对这些支持分析的业务经理的需求预计将远远超过对核心数据科学家的需求。普华永道估计,到 2020 年,美国商业分析工作的数量将达到 235 万(5)。
图 2:需求是具有分析技能的商务人士,而不仅仅是数据科学家(来源:普华永道/ BHEF)
这种发展的不利方面是,数据解释需要比通常理解的更多的训练。核心数据科学家通常拥有统计学博士学位,以帮助辨别有意义的趋势和随机差异。支持分析的经理通常不会。他们可能有提取和可视化数据的技能,但他们通常缺乏正确解释数据所需的专业知识。
从噪音中分离出信号的困难
考虑一个简单的场景。一位销售经理正在尝试对有限的资源进行优先排序,根据下表,他决定将所有新的营销活动集中在产品 A 上。毕竟,数据显示产品 A 的成交率比产品 b 高得多。
然而,分部观点揭示了相反的事实。推动成交率的真正因素不是产品,而是客户群。一旦你将这个因素标准化,很明显产品 B 实际上有更好的成交率。把新的活动集中在产品 A 上会被误导,而且代价高昂。
这是尤尔-辛普森效应的一个例子,一种损害数据解释的偏见。当统计趋势的方向取决于数据的汇总方式时,就会出现尤尔-辛普森效应。
像这样的偏差在统计分析中非常普遍。其他例子包括确认偏差(无意中想要证明一个假设,而忽略相反的证据),选择偏差(意外选择一个非代表性的数据样本),或异常值管理(不恰当地包含或排除极端数据点)。
分析训练应该专注于意义,而不仅仅是机制
对于企业管理者来说,培养分析能力是绝对值得的。数据分析的重要性在未来几年只会越来越大。懂得如何利用数据洞察力的公司和员工将会蓬勃发展。那些无法适应的人将会被抛在后面。
不幸的是,分析培训项目通常专注于数据分析、提取和可视化的方法——但排除了数据解释的微妙策略。这是适得其反的。这相当于教一个青少年如何开车,但不解释一般的道路规则。
由于各种各样的原因,像上面这个例子这样的误解时有发生。此外,由于数据分析有助于增加员工决策的份额,这样的错误无疑将变得更加普遍和更具影响力。假设一位人力资源经理试图辨别好的表现者和好的表现者。数据可能会讲述某个故事,人力资源经理需要确定这个故事是否真实。人力资源经理读取数据的准确程度会决定一名员工是被提升还是被解雇。
在 Correlation One,我们帮助公司正确使用数据。
期望每个支持分析的经理都成为统计大师是不现实的。但是我们可以教管理者如何避免最常见的思维和数据推断错误。对于任何在分析软件工具上投入大量资金的公司来说,尤其如此。如果你正在为你的员工配备工具以做出更好的决策,你需要确保他们知道如何正确使用这些工具。
点击下面的链接,根据几个示例测试问题来衡量您自己的数据解释技能,并取得联系,了解如何提高您组织的决策能力。
测试自己的技能
来源:
【https://www-01.ibm.com/common/ssi/cgi-bin/ssialias?】①T2htmlfid=WRL12345USEN
2)http://www . business insider . com/IOT-生态系统-物联网-预测-商机-2016-2
3)https://www . economist . com/news/leaders/21721656-数据-经济-需求-新方法-反垄断-规则-世界-最有价值-资源
4)截至 2017 年 8 月 24 日
5)http://www.pwc.com/us/dsa-skills
为什么 OpenMined 成为开源项目的榜样
原文:https://towardsdatascience.com/why-openmined-is-becoming-a-role-model-for-open-source-projects-ae11749fc577?source=collection_archive---------0-----------------------
这不是我第一次写关于 OpenMined 的文章,这是一个关于加密和分散人工智能的开源项目。在我开始写我对他们的 GitHub 库的深入研究之前,我想把这篇文章献给他们的发展,不仅仅是他们的软件开发,还有他们的社区。我是在 2017 年 7 月多伦多的一次活动中首次了解到 OpenMined 的。不到 3 个月,他们的成长让我惊讶,我真的认为未来的项目可以从观察他们的步骤中受益,不仅是他们正在开发的东西,还有成为 OpenMined 项目的一部分意味着什么。
什么是露天开采?
我在以前的帖子中写过关于它们的文章。简而言之,这是一个开源项目,旨在构建软件来促进数据所有权的去中心化,以及无需成为这两个领域的专家就可以使用或构建的机器学习和深度学习库。为了实现他们的目标,该项目基于三个支柱:
- 去中心化:通过区块链技术。
- 所有权(隐私):通过同态加密。
- 智能:通过机器学习和深度学习。
世卫组织露天开采?
一个多样化、分布式、开源的社区,拥有超过 1259 名成员,分别来自 GitHub 上的 Slack 和 58 名贡献者19 个库。贡献者不仅仅在软件上工作,还包括设计、交流等等。每个人都在自己最感兴趣的领域和力所能及的地方提供帮助。
OpenMined Team Map
你为什么要加入 OpenMined?
出于实际原因:我认为他们的工作涉及非常相关的领域,这些领域的结合使得这个项目极具创新性。我知道有一些困惑和避免流行词的倾向,但与区块链、加密或人工智能一起工作是目前强烈推荐的职业选择。它碰巧也是 GitHub 和 Python 上最流行的项目之一。对于开发人员来说,为开源项目做贡献是展示技能或学习新东西的最好方式,同时,最重要的是,从中获得乐趣!
Trendy projects on GitHub
还有其他原因:除了社区以惊人的速度增长之外,我个人觉得 OpenMined 的社区比我所在的任何其他社区都要温暖得多。也许是特拉斯克对表情符号的热爱(还有真正好玩的表情符号!),也许是因为每一个关闭的拉动请求都受到了欢迎,也许是因为 Slack 上的每一个新成员都受到了热烈欢迎,也许是因为成员们的响应非常积极。谁知道呢?可能以上都有吧!
Emoji love ❤
但最重要的是,OpenMined 需要你!o(>ω
为什么重叠的置信区间对统计显著性毫无意义
原文:https://towardsdatascience.com/why-overlapping-confidence-intervals-mean-nothing-about-statistical-significance-48360559900a?source=collection_archive---------1-----------------------
“两组的置信区间重叠,因此差异在统计学上不显著”——很多人
上面的说法是错误的。重叠的置信区间/误差线对统计显著性没有任何意义。然而,许多人错误地推断缺乏统计学意义。可能是因为相反的情况——非重叠的置信区间——意味着统计意义。我犯了这个错误。我认为它如此普遍的部分原因是,它经常没有解释为什么你不能比较重叠的置信区间。在这篇文章中,我将尝试用直观的方式来解释这一点。提示:这与我们如何跟踪错误有关。
设置 1 —不正确的设置
- 我们有两组——蓝色组和绿色组。
- 我们正试图了解这两个群体之间是否存在年龄差异。
- 我们对各组进行抽样,找出平均年龄 x̄和标准误差σ,并为每组建立一个分布:
Distribution of Mean Age
- 蓝色组的平均年龄为 9 岁,误差为 2.5 岁。格林组的平均年龄是 17 岁,误差也是 2.5 岁。
- 阴影区域显示了 95%的置信区间(CI)。
根据这种设置,开头引用的同一批人会错误地推断,因为 95% ci 重叠,所以各组之间在年龄上没有统计学显著差异(在 0.05 水平),这可能是正确的,也可能是不正确的。
设置 2 —正确设置
- 我们不是为每个组建立一个分布,而是为各组之间的平均年龄差异建立一个分布。
- 如果差异的 95% CI 包含 0,那么组间年龄没有差异。如果不含 0,那么组间有统计学显著差异。
Distribution of Difference in Mean Age
由于 95%置信区间(阴影区域)不包含 0,因此差异具有统计学意义。
为什么?
在第一个设置中,我们绘制分布,然后找出差异。在第二个设置中,我们找出差异,然后画出分布。两种设置看起来如此相似,以至于我们得到了完全不同的结果,这似乎违背了直觉。差异的根本原因在于错误传播——这是我们跟踪错误的一种奇特方式。
错误传播
假设你试图估算一个边长为 L , W 的矩形的周长 P 。用直尺测量边长,估计每边的测量误差为 0.1(σ_ L =σ_ W = 0.1)。
为了估计周长的误差,直觉上你会认为它是 2(σ_L + σ_W) = 0.4,因为误差会累加。几乎是正确的;误差相加,但是它们以正交方式相加 (平方然后取和的平方根)。换句话说,误差相加的方块。要了解为什么会出现这种情况,请看这里的证据。*
盘旋回来
我们从 2 个设置中得到不同结果的原因是我们如何传播年龄差异的误差。
Sum of 2 positive numbers is always greater than their sum in quadrature
在设置 1 中,我们简单地添加了每组的误差。
在设置 2 中,我们添加了正交误差,即平方和的平方根。
对于任何两个正数,它们的和总是大于它们的正交和。
因此,我们高估了第一次设置中的误差,错误地推断没有统计学意义。
作者简介 我是 NYU 的一名博士生,研究信息系统。你可以在推特上关注我@prasanna _ parasu。**
*脚注 零假设:x̄_B = x̄_G.
** 假设它们的误差相互独立
参考文献
1。错误传播https://en.wikipedia.org/wiki/Propagation_of_uncertainty
2.why Error add in Quadraturehttps://www . Colorado . edu/physics/phys 2150/phys 2150 _ fa12/2012 f % 20 why % 20 independent . pdf
3.重叠置信区间http://www . cscu . Cornell . edu/news/stat news/ST news 73 insert . pdf
为什么民调戏剧性地未能预测 2016 年美国大选。
原文:https://towardsdatascience.com/why-polling-dramatically-failed-to-predict-the-2016-us-election-85d344a38357?source=collection_archive---------1-----------------------
TL;如果要更好地理解复杂的人类事件和情况,预测必须采取更全面的方法。
为什么所有的民调对 2016 年美国大选的预测都如此错误,这说明了数据是如何被使用的?
无论你对 2016 年美国大选结果的政治立场如何,很明显,当天最大的失败是政治预测。绝大多数民调,甚至晚至周二下午都预测希拉里·克林顿将当选下一届美国总统。
这一事件清楚地说明了在没有完整背景的情况下查看数据是多么容易被误读。这显然导致了错误的结果或预测。当我们试图通过数据更好地理解更广阔的世界时,承认这一错误并寻找根本原因是至关重要的。
公众对这种(数据丰富的)方法的信任对于接受未来跨多个领域的公共和私人工作至关重要。迫在眉睫的危险是,除非采取更好、更全面的方法,否则许多类似的(基于数据的)错误将在未来发生。
我们似乎正处于“大数据”时代,但还不完全是“大洞察力”时代。
面对有限的数据
我们已经变得过度依赖那种“干净的数据”,这种数据是在选举期间作为真实世界事件的事实描述而呈现的。目前可以收集的数据范围仍然有限。考虑到这一点,它应该用于说明部分情况,而不是讲述整个故事。虽然根据容易收集的数据进行预测很有诱惑力,但记住哪些数据不能收集也非常重要。
信息少的图片看起来有多完整,有可能知道真正需要的是什么吗?
民调可以提问吗?
对每日甚至每小时民调结果的关注给人一种错误的印象,即候选人的行动会立即反映在数据中。随着事情的发生,这种变化应该被捕捉和分析。然而,需要认识到的是,大多数人的生活并不与 24 小时的新闻周期相联系。无论这次选举中的许多新闻故事多么令人愤慨,都不应该假设人们对这些事件的了解和兴趣是普遍的。
量子物理学规定,一个数据点在被观察到之前同时以两种状态存在。投票也是如此。根据一条新信息有目的地问一个投票问题的行为,在最坏的情况下,明确地突出了突发新闻事件的内容。最好的情况是,它提醒人们有明确的理由改变观点或投票。因此,提出问题的行为改变了结果。当然,问题的措辞和方式也会产生影响。
理解背后的原因
就像每小时邀请人们去户外记录天气不会改善长期预测一样,政治预测也是如此。当结果的潜在原因不明确时,数据量的增加不会改善预测。
当预测飓风的可能性时,分析气压、风向、温度等数据。所有这些都有助于预测可能的结果。然而,这些数据只有在清楚了解事件发生的原因时才有用。不理解飓风形成的(科学)原因,任何单一的气候数据都是没有用的。投票时影响决策的因素都需要知道,而不仅仅是那些显而易见的因素。
要真正理解任何情况都需要更充分的参与和观察。
风景变了
与四年前相比,整个形势已经发生了变化。假设社交媒体、新闻报道或任何全球政治形势都是僵化不变的,这很奇怪。
政治候选人应该说什么、做什么或做什么的“规则”都在不断变化。自上次选举以来,沟通、事实或信息传达的方式也发生了巨大变化。
数据背后的框架不会改变的想法是一个危险的假设,因为这样就很容易不对任何数据的核心重要性提出新的问题。如果我们不再关注选举中发生的所有组成部分,那么我们最终会缺乏洞察力,即使我们有更多的信息。
随着时间的推移,大部分人类参与其中的事件总是容易发生变化。
昨天可能是正确的,明天不一定是正确的。
故事和情感很重要
数据中最难捕捉的东西之一是让我们所有人都如此人性化的情感。将我们的人文主义倾向提炼为机器可读的状态仍然很困难,因为计算机在很大程度上对世界持二元观点。可以从理论上说,像挑选下一任总统这样的决定归结为权衡一组客观事实与另一组客观事实,以得出合理的结果。然而,被选举的人也是一个领导者,通过投票人的情感、经历和自身利益被置于那个位置。情绪当然在选举中发挥了作用,但在投票中没有得到应有的重视。
讲故事也是如此,讲“正确”的故事以引起最多选民的共鸣仍然是竞选活动的核心。虽然可以围绕选民的偏好收集更多数据,但机器学习在构建故事方面仍然表现不佳。讲故事仍然是我们最大的(人类)天赋之一,不应该被忽视。事实只有在故事的背景下才能被阐明,才有意义。
当数据运行良好时,它应该被接受,当它达不到期望的结果时,它应该被承认和解释。数据不需要告知每一个决定,情感和讲故事仍然有空间与观众联系起来。
真正理解投票
随着时间的推移和更多的研究,人们会更好地理解为什么有人会以某种方式投票的所有原因。随着这种情况的发生,任何政治家都将能够更好地为这个群体服务,这要归功于对个人和他们所居住的社会的更好理解。最终的结果应该是投票的公众得到更多对他们来说重要和相关的东西。在许多方面,消费品市场也出现了同样的情况。当提出正确的问题时,对“真正”想要什么的更好的洞察会带来更好的产品和服务。这就是市场如何能够准确地给我们更多我们想要的东西。就民主而言,这当然反映了大多数人的愿望。就消费品而言,这既取决于个人品味,也取决于购买力。
随着时间的推移,我们将最终阻止一个数据驱动的世界接近我们所渴望的世界。
未回答的问题
应该问的最大问题是为什么投票率如此之低。为了选举一个人当总统,在 19 个月里花费了超过 6 . 9 亿美元。
在有资格投票的人中,只有 56%的人决定行使他们受宪法保护的投票权。这充分说明了政治体制、公民参与和现代民主进程的作用。43%的人对谁将成为下一任美国总统没有意见或兴趣,这指向了更大的问题。
合格选民总数为 231,556,622 100%
投票的合格选民人口 13174.15 万 56.8%
未投票的合格选民人口 99,815,122 43.2%
希拉里·克林顿的总票数 60,071,781 47.7%
唐纳德·特朗普的总票数为 59,791,135 47.5%
美国选民投票率在 35 个经合组织国家中排名第 31 位。理解这种情况的原因不仅有助于未来的政治家(他们应该希望接触到更多的观众),也有助于整个社会。
通过更明智地使用数据来更好地代表所有美国人口,应该有可能扩大与公众的接触。预测为什么有人会以这种或那种方式投票远不止是简单的二元选择。要真正了解现代选民,我们需要了解什么对他们来说是重要的,他们如何思考,以及他们如何行动。虽然对数据采取更全面的方法肯定会面临许多挑战,但它最终会为任何复杂的情况提供更清晰的画面,而不仅仅是选举投票。
人是复杂的。在试图考虑任何给定情况的所有方面时,记住这一点最终将导致更清晰的画面、更好的预测和对我们之所以为人的更大理解。
延伸阅读
http://www . pewresearch . org/fact-tank/2016/02/03/2016-electrius-will-be-the-most-diversity-in-u-s-history/
https://www . the guardian . com/news/data blog/2016/oct/29/voter-turnote-us-election-2016-register
http://heavy . com/news/2016/11/eligible-voter-vout-for-2016-data-Hillary-Clinton-Donald-trump-Republican-Democrat-popular-vote-registered-results/
http://www . demos . org/publication/why-are-5100 万-合格-美国人-未登记-投票
http://www . nytimes . com/2016/11/10/technology/the-data-said-Clinton-won-why-you-should-believe-it . html?ref =技术
http://www . politico . com/story/2016/11/is-Nate-silver-538-right-230734
https://www . quanta magazine . org/2016 11 08-why-Nate-silver-and-Sam-Wang-are-error/
http://www.bbc.com/news/election-us-2016-37949527
为什么 Quizlet 选择 Apache Airflow 来执行数据工作流
原文:https://towardsdatascience.com/why-quizlet-chose-apache-airflow-for-executing-data-workflows-3f97d40e9571?source=collection_archive---------0-----------------------
四部分系列的第二部分
在关于奎兹莱特的 在前后寻找最佳工作流管理系统的这个系列的第一部分中,我们描述并激发了对工作流管理系统(WMS)的需求,作为超越 CRON 等任务调度框架的自然步骤。然而,我们主要指出了 CRON 在处理复杂工作流方面的缺点,并提供了一些指南来确定一个伟大的 WMS 应该是什么样子。事实证明,可用的工作流管理器前景广阔。当我们评估候选人时,我们提出了一个梦想中的工作流管理器应该包括的特性列表(大致按重要性排序):
Figure 2.1: An example data processing workflow.
1.智能调度。调度任务执行显然是 WMS 的最低标准。然而,我们也希望任务执行更加“数据感知”因为一些任务的完成时间可能比它们的执行时间表更长(想象一个每小时调度一次的任务,其中每个任务需要 3 个小时执行),所以我们希望确保我们使用的任何框架在调度依赖任务时能够考虑到这些不一致的时间段。
2.依赖关系管理。这是我们与 CRON 完全不同的地方。我们需要一个简单、简洁的界面来定义任务间的依赖关系。依赖性管理不仅要处理任务执行的依赖性,还要处理失败和重试。我们还想要一个系统,它可以利用任务间任何缺乏的依赖性来提高工作流效率。例如,在系列第一部分中介绍的工作流示例中,图 2.1 中最左边的五个任务(用虚线标出)都是相互独立的,可以并行执行。此外,可以有一个任务,许多其他子任务依赖于它的完成。在这种情况下,我们希望父任务尽早执行。我们还想要一个可以考虑单个任务优先级的系统。
3.韧性。如上所述,工作流总是会意外运行,任务会失败。我们需要一个能够重试失败任务的框架,并提供一个简洁的界面来配置重试行为。此外,我们希望能够妥善处理超时,并在出现故障或任务执行时间超过正常时间时(即违反服务级别协议或 SLA 条件时)向团队发出警报。
4.可扩展性。随着 Quizlet 扩大其用户群并继续开发更多数据驱动的产品功能,工作流的数量和复杂性将会增加。通常,这种类型的扩展需要更复杂的资源管理,其中特定类型的任务在专门分配的资源上执行。我们需要一个框架,它不仅能满足我们当前的数据处理需求,还能随着我们未来的增长而扩展,而不需要大量的工程时间和基础架构变更。
5.灵活性。我们的梦想框架将能够执行一个多样化的(好吧,无限的!)任务范围。此外,我们希望系统是“可被黑客攻击的”,允许我们根据需要实现不同类型的任务。我们还希望避免将工作流局限于特定类型的文件系统(例如 Oozie 或 Azkaban )或预定义的操作集(例如仅 map-reduce 类型的操作)。
6.监控&交互。一旦我们的 WMS 启动并运行,我们希望它提供对任务状态、登陆时间、执行持续时间、日志等信息的集中访问。该诊断信息不仅应该是可观察的,还应该潜在地是可操作的:在同一个界面上,我们希望能够做出影响管道状态和执行的决策(例如,对特定任务的重试进行排序,手动设置任务状态等)。).我们还希望对诊断信息的可配置访问和工作流交互对所有数据利益相关者可用。
7.程序化管道定义。大量的工作流管理器使用静态配置文件(如 XML、YAML)来定义工作流编排(如詹金斯、达特、 Fireworks )。一般来说,这种方法不是一个问题,因为大多数工作流的结构是相当静态的。然而,许多工作流的源和目标(例如文件名、数据库记录)通常是动态的。因此,在给定我们的数据仓库的当前状态的情况下,能够以编程方式动态地生成工作流将是相对于静态的基于配置的方法的一个优势。
8.组织&文件。出于显而易见的原因,我们优先考虑那些有可靠的未来路线图、足够的文档和示例的项目。
9.开源/ Python 。Quizlet 的数据科学团队在数据处理和工作流的所有权和执行方面发挥了很大作用。我们也以分享和贡献开放项目为荣,每个人都可以使用和学习(包括我们自己!).如果我们能够有一个同样植根于 Python /开源社区的框架,那将是一个巨大的进步。
10.包含电池。Quizlet 需要它昨天的数据!当今的商业世界瞬息万变,商业智能宜早不宜迟。如果数据科学团队忙于实施基本的工作流功能,就无法提供这些见解。我们想采用一个相当即插即用的框架,上面的大部分功能都已经内置了。
为什么我们选择气流
使用上面的愿望清单作为评估 WMS 项目的指南,我们能够从这些项目中选择三个主要候选人: Pinterest 的 Pinbal l、 Spotify 的 Luigi 和 Apache Airflow 。
这三个项目都是开源的,都是用 Python 实现的,到目前为止一切顺利!然而,在研究了 Pinball 之后,我们对他们的路线图的重点和他们社区背后的动力并不信服。在写这篇文章的时候,Pinball Github 项目有 713 个明星,但只有 107 个提交,12 个贡献者,在过去的一年里只有少数几个提交。相比之下,Github 对 Luigi/Airflow 项目的统计细分分别如下:Stars: 6,735/4,901;提交:3410/3867;投稿人:289/258。因此,Luigi 和 Airflow 都拥有我们一直在寻找的活跃的开发者和活跃的开源社区。我们的首要决定是在 Luigi 和 Airflow 之间做出选择。
Luigi 和 Airflow 在很多方面都很相似,都从我们的愿望清单上勾选了很多选项(图 2.1 )。这两个项目都允许开发人员定义任务之间的复杂依赖关系,并配置执行优先级。两者都允许并行执行任务,重试失败的任务,并且都支持历史回填。这两个项目都支持一系列数据存储和接口,包括 S3、RDBs、Hadoop 和 Hive。两者都可以使用pip
轻松安装,而且一般来说,功能相当丰富。也就是说,这两者之间有一些明显的差异,这促使我们选择了 Luigi 上空的气流。
Figure 2.2: Side-by-side Comparison of Airflow and Luigi. Each row ranks Airflow and Luigi on their implementation of various features and functionality. Ranking ranges from no checkmarks (worst) to three checkmarks (best).
首先,Airflow 的未来路线图似乎更加集中,开发社区的势头目前似乎比 Luigi 的更强。虽然最初是由 AirBNB 开发的,但 Airflow 项目已经成为 Apache 孵化器项目,这增加了它未来成功和维护的概率。
我们也更喜欢很多由气流而不是 Luigi 选择的设计惯例。例如,与 Luigi 的基于源/目标的方法相比,我们更喜欢 Airflow 的基于时间表的任务执行策略,这种策略更“设置好就一劳永逸”,因为 Luigi 的基于源/目标的方法需要用户与工作流执行进行更多的交互。我们还认为,通过定义新的操作符(我们很快就会谈到操作符)来扩展 Airflow 更加直接,而不是像 Luigi 那样必须从一组特定的基类继承。
气流还提供了许多 Luigi 所没有的功能。具体来说,Airflow 的 UI 提供了广泛的功能,允许监控多个元数据来源,包括执行日志、任务状态、登陆时间、任务持续时间等等。一个巨大的优势是,相同的用户界面还可以用于管理实时工作流的状态(例如,手动强制重试、成功状态等)。).这是一个非常强大的范例,因为它不仅使诊断数据容易获得,而且允许用户基于对数据的洞察直接采取行动。相比之下,Luigi 也提供了一个简单的 UI,但它的功能远不如 Airflow 丰富,并且不提供与活动进程的交互功能。
Airflow 提供但 Luigi 没有的一些其他功能包括定义多个专门工作流的能力、在工作流之间共享信息的能力、动态编程工作流定义、资源池(在 Airflow 中称为“队列”)和 SLA 电子邮件。因此,Luigi 能够从我们的愿望列表中选择框 1-5 和 9-10,但是 Airflow 也能够选择其余的框。所以我们决定全速前进!
这一系列博客文章的其余部分详细介绍了我们在 Quizlet 这里获得气流并运行的经验。特别是,第三部分通过实现本系列的第一部分中介绍的工作流示例,展示了 Airflow 的一些关键概念和组件。第四部分记录了一些与 Quizlet 部署气流相关的实际问题。
为什么随机森林是我最喜欢的机器学习模型
原文:https://towardsdatascience.com/why-random-forest-is-my-favorite-machine-learning-model-b97651fa3706?source=collection_archive---------0-----------------------
发现现实世界中随机森林的优点和缺点
“green trees on foggy forest” by Julien R on Unsplash
“模特就像一副护目镜。它让某些事情成为焦点。”—我的数据科学导师。
在选择机器学习模型时,没有单一的算法占主导地位。有些在大型数据集上表现更好,有些在高维数据上表现更好。因此,评估模型对特定数据集的有效性非常重要。在本文中,我将对随机森林的工作原理做一个高层次的概述,并讨论这种模型在现实世界中的优缺点。
从本质上讲,如果您想要高性能且较少需要解释,随机森林是一个很好的模型。
在回归模型之后,随机森林总是我的首选模型。让我告诉你为什么。
什么是随机森林?
随机森林是打包的决策树模型,每次分裂时在特征子集上分裂。这是一个很长的话题,所以让我们先看一个单独的决策树,然后讨论袋装决策树,最后介绍对一个随机特征子集的分割。
决策树
本质上,决策树根据数据的特征将数据分割成更小的数据组,直到我们得到一个足够小的数据集,其中只有一个标签下的数据点。让我们看一个例子。下面是一个人是否应该打网球的决策树。
Image courtesy of http://science.slc.edu/~jmarshall/courses/2005/fall/cs151/lectures/decision-trees/
在上面的例子中,决策树在多个特征上分裂,直到我们得出结论“是”,我们应该打网球,或者“否”,我们不应该打网球。沿着树的线条来确定决策。例如,如果天气阴沉,那么“是的”我们应该打网球。如果天气晴朗,湿度高,那么“不”我们不应该打网球。
在决策树模型中,这些分裂是根据纯度度量来选择的。也就是说,在每个节点,我们希望信息增益最大化。对于回归问题,我们考虑残差平方和(RSS ),对于分类问题,我们考虑基尼指数或熵。我不会在这方面讲太多细节,但是如果你有兴趣了解更多,可以看看这个讲座。
袋装树
现在采用决策树概念,让我们应用自举原理来创建袋装树。
Bootstrapping 是一种抽样技术,我们从数据集中随机抽样替换。
旁注:自举时,我们只使用了大约 2/3 的数据。大约 1/3 的数据(“袋外”数据)没有在模型中使用,可以方便地用作测试集。
Bagging 或 bootstrap aggregating,是我们通过创建 X 数量的决策树来创建袋装树,这些决策树在Xbootstrap 训练集上进行训练。最终的预测值是我们所有 X 决策树的平均值。一个单独的决策树具有很高的方差(倾向于过度拟合),因此通过将许多弱学习者打包或组合成强学习者,我们将方差平均掉。这是多数票!
Image courtesy of https://www.kdnuggets.com/2016/11/data-science-basics-intro-ensemble-learners.html
随机森林
随机森林对 bagging 进行了改进,因为它通过引入对特征的随机子集的分割来使树去相关。这意味着在树的每次分裂时,模型只考虑特征的一个小的子集,而不是模型的所有特征。也就是说,从可用特征集合 n 中,随机选择 m 个特征的子集(m =的平方根)。这一点很重要,这样方差就可以被平均掉。考虑一下如果数据集包含一些强预测因素会发生什么。这些预测器将始终被选在树的顶层,所以我们将有非常相似的结构树。换句话说,这些树是高度相关的。
综上所述,随机森林是袋装决策树模型,在每次分裂时分裂特征子集。
为什么随机森林这么酷?
令人印象深刻的多功能性
无论您有回归或分类任务,随机森林都是满足您需求的适用模型。它可以处理二元特征、分类特征和数字特征。需要做的预处理非常少。数据不需要重新缩放或转换。
可并行化
它们是可并行化的,这意味着我们可以将流程拆分到多台机器上运行。这导致更快的计算时间。相比之下,增强模型是连续的,需要更长的时间来计算。
附注:具体来说,在 Python 中,要在多台机器上运行它,需要提供参数“n _ jobs =-1”。-1 表示使用所有可用的机器。更多详情见 scikit-learn 文档。
高维度大
随机森林非常适合高维数据,因为我们处理的是数据子集。
快速预测/训练速度
它比决策树训练更快,因为我们只处理这个模型中的一个特征子集,所以我们可以轻松地处理数百个特征。预测速度明显快于训练速度,因为我们可以保存生成的森林供将来使用。
对异常值和非线性数据稳健
随机森林通过本质上的宁滨处理离群值。它对非线性特征也漠不关心。
处理不平衡数据
它有平衡类总体不平衡数据集中的误差的方法。随机森林试图最小化整体错误率,因此当我们有一个不平衡的数据集时,较大的类将获得较低的错误率,而较小的类将具有较大的错误率。
低偏差,中等方差
每个决策树都有很高的方差,但偏差很小。但是因为我们平均随机森林中的所有树,我们也平均方差,所以我们有一个低偏差和中等方差模型。
弊端
- 模型的可解释性:随机森林模型并不都是可解释的;它们就像黑匣子。
- 对于非常大的数据集,树的大小会占用大量内存。
- 它可能会过度拟合,所以您应该调整超参数。
为什么随机森林优于决策树
原文:https://towardsdatascience.com/why-random-forests-outperform-decision-trees-1b0f175a0b5?source=collection_archive---------2-----------------------
说明了两个直观的原因
Pine forests at Rampart Lakes. Photo by @sakulich
随机森林由多个单独的树组成,每个树都基于训练数据的随机样本。它们通常比单一决策树更准确。下图显示了随着更多树的添加,决策边界变得更加准确和稳定。
Decision boundary from random forests (as more trees are added)
这里我们将提供随机森林优于单决策树的两个原因。
特征空间中更高的分辨率
树木未修剪。虽然像 CART 这样的单个决策树经常被修剪,但随机森林树是完全生长和未修剪的,因此,自然地,特征空间被分成更多和更小的区域。
树木多种多样。每个随机森林树是在随机样本上学习的,并且在每个节点上,考虑一组随机特征用于分裂。这两种机制都创造了树木的多样性。
下图显示了两个随机树,每个都有一个分割。对于每棵树,可以给两个区域分配不同的标签。通过组合这两棵树,有四个区域可以被不同地标记。
未修剪的和多样的树导致特征空间中的高分辨率。对于连续要素,这意味着更平滑的决策边界,如下所示。
处理过拟合
单个决策树需要修剪以避免过度拟合。下面显示了来自未修剪树的判定边界。边界更平滑,但会出现明显的错误(过度拟合)。
那么随机森林如何在不过度拟合的情况下建造未修剪的树呢?
对于下面的两类(蓝色和红色)问题,两个 splits x1 = 3 和 x2=3 都可以完全分开两类。
然而,这两种分裂导致了非常不同的决策界限。决策树通常使用第一个变量进行拆分,因此训练数据中变量的顺序决定了决策边界。
现在考虑随机森林。对于用于训练树的每个随机样本,样本中丢失红点的概率为
因此,大约三分之一的树是用所有蓝色数据构建的,并且总是预测蓝色类。另外 2/3 的树在训练数据中有红点。由于在每个节点都考虑了随机的特征子集,我们预计大约 1/3 的树使用 x1,其余 1/3 使用 x2。这两种树的分割如下图所示。
通过聚合这三种类型的树,下面显示的决策边界现在对于 x1 和 x2 是对称的。只要有足够多的树,边界应该是稳定的,不依赖于变量的排序等无关信息。
随机森林中的随机性和投票机制很好地解决了过度适应问题。
虽然随机森林是准确的,但它们被认为是黑盒模型(很难解释)。这篇文章阐述了如何解读它们。
在 dataanalyticsbook.info 可以找到我的书的更多内容。
为什么房地产估价需要计算机视觉
原文:https://towardsdatascience.com/why-real-estate-valuation-needs-computer-vision-56d653986ab2?source=collection_archive---------8-----------------------
在最近的一篇文章中,我介绍了一个抵押贷款申请分析工具,它使用 AI 来验证申请。读完那篇文章后,我们去年的一位客户(文·沃梅罗、福克西·艾的创始人)联系我,看我能否写一篇类似的文章,介绍我们为他们做的房地产估价工作。
我们去年研究的问题是一个令人惊讶的问题:房价估计很糟糕。房源一直被高估或低估,房屋的估价不仅对买方和卖方来说是一个关键因素,对以房屋为抵押的抵押贷款的承销商来说也是如此。金融机构经常使用自动估价模型(AVM)来做出从房屋净值贷款到信用卡限额的一切决策。不仅仅是房屋销售。理解房屋的价值对于减轻损失和信用风险管理至关重要。
What’s the best way to assess the value of a home?
我们生活在一个快速技术变革的世界,采用人工智能不再是一个选项。相反,这是竞争的需要。很快,没有一定人工智能水平的估值模型就会过时。
引用 Talla 的首席执行官兼联合创始人 Rob May 的话,“令我惊讶的是,一些公司在采用人工智能方面进展缓慢,因为他们不确定在哪里应用它,或者它将如何工作。我认为他们不明白,当这些事情被弄清楚的时候,他们会落后很多。”
Zillow 宣布他们已经将图像分析整合到他们的 Zestimate 中,强调了这一点。世界各地使用的反车辆地雷需要改进很多,因为它们到目前为止客观上一直很糟糕。人工智能在价格预测方面可以提高 15%的事实表明了传统模型迄今为止的表现有多差。
The condition of a home goes beyond the number of bedroom and bathrooms, and the square footage. A valuation model needs to SEE the listing.
为什么房屋估价不好?他们依赖旧数据、数字数据、人口普查数据、IRS 数据以及州/地区销售数据,这些数据可能无法反映房屋投资。即使将所有这些数据源结合在一起,有时也会给出一个不完整的画面。尽管传统的 AVM 模型快速而便宜,但如果不真正查看资产,它们就无法真正考虑资产的质量和状况,从而限制了金融服务业中一个关键工具的准确性。
为什么这是一个难题?传统的计算机算法喜欢用公式来处理数字,而不是房屋的图片。清单上没有“屋顶上的一块木瓦不见了”这一栏。为了做到这一点,人工智能模型必须查看图片,并理解图片如何影响价格。更具体地说,模型需要了解它正在查看的房间,理解纹理、颜色和室内/室外对象。把这个解决方案想象成一个约会网站创新,直到现在,没有人能看到人们的个人资料照片,相反,他们只能看到他们的身高、体重和其他生物医学数据。显然,一张图片胜过千言万语。
将图像数据整合到房屋估价中的问题非常适合人工智能解决方案。即使作为人工智能解决方案来实现,让一个回归模型理解关于一个清单的如此多的数据,并让它理解所有特殊情况和例外,也有点像噩梦。我将跳过建造 AVM 有多困难的技术解决方案细节,而是专注于福克西人工智能带来的新颖用例。
清单上的图片可以告诉我们一个关于房地产估价的故事,它可以通过与房地产清单相关联的传统数字、分类和文本数据来增强。例如,花岗岩柜台表明房子里放了钱。一些微妙的因素,比如墙上油漆的状况,会告诉我们很多关于上市的预期售价。用于训练 AVM 的数据集基本上是传统 AVM 所基于的正常类型的数据集,但增加了来自图片和其他来源的大量额外数据。
我们去年交付了一个初始原型。我们为福克西人工智能开发的原型现在已经变得更加成熟,并在一个真正令人惊叹的数据集上进行了训练。现在,由于算法和计算能力的进步,我们可以以一种前所未有的方式利用工具。了解数百万房产的质量梯度现在已经成为现实。
福克西人工智能研究院现在已经将这种新颖的 AVM 方法推向市场,结合计算机视觉和深度学习,来评估住宅房地产的质量和状况。整个系统通过 API 公开,这样你就可以把它放在你正在使用的其他东西上面。该产品使用先进的训练技术和一套内部预测模型对所提供的图像集的房间类型进行分类,并确定目标物业的质量和状况,以提高估价准确性。
API 展示了一些非常有趣的方法,比如将图像转换为矢量的端点,找到可比较属性的方法(代理喜欢这种东西),以及检测对象、装饰、场景和其他东西的系统。因此,您可以决定使用 API 从现有列表中提取特性,或者只是使用 API 来获得更好的估价数据。
如果你依赖于传统的反车辆地雷,并且你已经接受了不准确的估价,这可能是一个非常有趣的技术解决方案。事实上,这关系到数十亿美元,因此,即使是很小的准确性提高也会影响降低贷款风险、提高贷款能力等方面的关键绩效指标(KPI)。如果你想亲自体验神奇, 报名参加 私测。
这里有一个在 medium 上的到福克西的链接,我希望你能明白为什么它这么酷。这项技术开辟了新的可能性,如模拟一个想象中的房子会卖多少钱,并以此作为承包商进行拆卸和建筑估价。有相当漂亮的计算器功能,只是到现在才存在。解决方案都包含在一个简单的 API 中:https://www.foxyai.com/doc-api/#api-endpoints
因此,总而言之,动静脉畸形正在被破坏,金融机构应该注意到这一点。
如果你喜欢这篇关于人工智能房地产估价的文章,那么按下关注按钮,拍拍这个东西,看看我过去读过的一些文章,比如“如何为人工智能项目定价”和“如何聘请人工智能顾问”另外,看看福克西艾。除了与业务相关的文章,我还准备了一些关于寻求采用深度机器学习的公司所面临的其他问题的文章,如“没有云和 API 的机器学习”
在下一篇文章中,我将介绍我们已经研究了很长时间的东西,它可以帮助企业在内部审计期间自动分析非结构化报告。
下次见!
丹尼尔
daniel@lemay.ai ←打个招呼。
LEMAY . AI
1(855)LEMAY-AI
您可能喜欢的其他文章:
- 人工智能和不良数据
- 人工智能的图像数据集
- 人工智能:让你的用户给你的数据贴上标签
为什么小数据是人工智能的未来
原文:https://towardsdatascience.com/why-small-data-is-the-future-of-ai-cb7d705b7f0a?source=collection_archive---------7-----------------------
在过去的 8 个月里,我一直在为人工智能解决方案出谋划策。我经常遇到一些商界人士,他们在过去十年里一直在学习数据的重要性。然而,这意味着我的服务经常与数据分析和大数据咨询混为一谈。从业务人员的角度来看,他们的问题很简单:“我们拥有所有这些大数据。你能进来给我们赚更多的钱吗?”
我觉得这令人沮丧,原因有二。首先,人工智能技术的潜力远远不止于分析大数据集。有很多成熟的技术来分析大数据集,也有很多成熟的顾问。第二,对于大多数存在的人工智能问题来说,没有可供使用的大数据集。
许多致力于真正新颖解决方案的人工智能公司不得不手动收集这些解决方案的数据集。对人工智能初创公司的资本投资中有很大一部分被投入到收集使他们的产品工作所需的数据集。
例子
让我们以一个不断增长的人工智能用例为例:基于人工智能的律师合同审查(例如 Blue Jay Legal、eBrevia、Kira Systems、Law Geex 等..).为了做到这一点,你所需要的是一个大的合同数据集,上面有律师反馈的注释。这可能包括指定看起来对一方或另一方不利的条款,对于这种类型的合同来说非常不寻常的条款,不寻常或不清楚的语言等等
然而,众所周知,律师的工作方式很守旧。如果你幸运的话,你可能会发现一些律师事务所保留了带有红线的合同草案,如果你的产品需要做的只是复制红线,这将会很有用。然而,如果你想在合同上得到更多的定性反馈,你就没那么幸运了。即使你设法从律师事务所过去的工作中积累了这个数据集,那也不会是大数据。最多,您可能能够获得 10000 或 20000 份经过审查的合同,这与人们今天谈论的“大数据”的规模相差甚远,后者通常具有数百万、数十亿和数万亿条目的规模。
为了实现这一点,人工智能合同审查初创公司必须让他们的技术与他们可以访问的数据集规模相适应。他们必须能够处理少量数据。
小数据为什么难?
人类能够从小数据集学习——为什么机器不能?答案很简单——人类实际上并没有从一个小数据集里学习。自从我们出生以来,我们就一直在从通过我们的五种感官不断输入的数据中学习。
当前最大的图像处理数据集 Image-Net ,包含大约 1400 万张图像。如果我们保守估计,让我们假设一个人每 30 秒看到一次清晰的图像。当一个人在 25 岁左右开始职业生涯时,他们已经看到了:
= 25 年* 365.24 天/年16 小时/天 60 分钟/小时* 2 张图像/分钟
= 17,531,520 个不同的图像
当我们进入职业生涯时,我们每一个人都已经接触到了一个更大的视觉数据集,这是人工智能研究人员可以获得的最大数据集。除此之外,我们还有来自外部感官的声音、嗅觉、触觉和味觉数据。总之,人类有很多关于人类世界的背景。我们对人类的处境有一个常识性的理解。在分析数据集时,我们将数据本身与我们过去的知识相结合,以便得出分析结果。
典型的机器学习算法没有这些——它只有你向它显示的数据,而且这些数据必须是标准化的格式。如果数据中不存在某个模式,算法就无法学习它。信号必须大于噪声。
所有的活动都将在这里进行
对于人工智能社区来说,这可能是一个令人沮丧的事实。对于许多(如果不是大多数)专业工作来说,社区中没有可用的大数据集。收集一个大数据集来表示这项任务可能会非常昂贵。假设您试图收集一个数据集来自动对一个小企业进行会计审计。使用当前的最佳实践技术,可能需要几个数据集(这纯粹是推测):
- 对 50,000 份会计报表中的“危险信号”和“关注领域”进行了注释
- 与公司员工进行了 250,000 次对话,要求提供交易的支持文档
- 100,000 个案例,其中一份支持文件已针对给定交易的有效性进行了分析
- 50,000 份关于审计的最终报告
尽管这个数据集没有超过一百万个条目,你已经可以看到它变得多么昂贵。如果我们假设一个审计员每小时收费 150 美元,审计一个小企业需要 20 小时的时间,那么这个数据集将花费高达 1.5 亿美元。毫不奇怪,我们还没有看到任何人工智能初创公司解决耗时的会计审计过程。构建人工智能审计器的唯一方法是以某种方式开发能够处理更小数据集的技术。事实上,我们试图自动化的绝大多数单调乏味的工作都有同样的基本问题。一旦低悬的 AI 果实被用完,我们如何向上移动到中间的果实?我们如何到达树顶的水果?我们如何破解小数据集?
输入迁移学习
不知何故,我们需要能够给我们的人工智能系统提供关于人类世界的通用知识——就像人类一样。迁移学习是一种新兴的技术,它允许我们将在一个数据集中学习的知识迁移到另一个数据集中。
直到最近随着深度神经网络的兴起,迁移学习在机器学习社区中一直处于次要地位。与大多数其他机器学习技术相比,深度神经网络极其灵活。它们可以被训练、分解、修改、再训练,通常只是以各种方式被滥用。这导致了我们可以应用迁移学习的各种新情况。
- 在文本处理中,我们可以使用一个名为 word2vec 的浅层神经网络,通过从互联网上读取数百亿行文本,尝试将单词的含义编码为矢量。这些向量可以应用于更具体的任务
- 在图像分类中,我们可以在非常大的图像网络数据集上训练神经网络,然后在较小的数据集上重新训练它,对于较小的数据集,我们可能只有几千幅图像。
然而,最近更雄心勃勃的迁移学习的例子被证明是成功的。就在几个月前, Google Brain 发布了对他们的多模型的研究。在这项研究中,他们同时对 8 项不同的任务训练了同一个深度神经网络。在他们的研究中,他们发现系统性能在处理小数据集的任务时有所提高。虽然还处于早期,但这项研究提供了一个诱人的机会,让我们可以让我们的人工智能系统了解世界,让它们能够理解小数据集。
那么下一步是什么?
我认为大数据正接近其炒作的顶峰。随着越来越多的公司在收集和使用大数据集方面达到成熟,他们将开始问:“下一步是什么?”我相信越来越多的公司会将使用小型数据集的自动化作为其数据策略的下一阶段。
对于每个有 10 亿个条目的数据集,有 1,000 个有 100 万个条目的数据集,有 1,000,000 个只有 1,000 个条目的数据集。因此,一旦低挂的果实已经用尽,唯一可能的前进方式将是爬树,建立可以用越来越少的数据工作的系统。
本文原载于www . electric brain . io。
这就是为什么这么多数据科学家离开他们的工作
原文:https://towardsdatascience.com/why-so-many-data-scientists-are-leaving-their-jobs-a1f0329d7ea4?source=collection_archive---------0-----------------------
数据科学家的挫折!
是的,我是一名数据科学家,是的,你的确没看错标题,但总得有人说出来。我们读到了很多关于数据科学是 21 世纪最性感的工作和作为一名数据科学家可以赚到的诱人的金钱的故事,这似乎是绝对的梦想工作。考虑到这个领域有大量高技能的人在解决复杂的问题(是的,“极客”是一件积极的事情),这份工作有着令人喜爱的一切。
但事实是,数据科学家通常“每周花 1-2 个小时找新工作”,正如英国《金融时报》的这篇文章所述。此外,文章还指出,“机器学习专家在表示正在寻找新工作的开发人员中排名第一,占 14.3%。数据科学家紧随其后,占 13.2%。这些数据是 Stack Overflow 在基于 64,000 名开发人员的调查中收集的。
我也有过这样的经历,最近也换了一份数据科学的工作。
那么,为什么这么多数据科学家在找新工作呢?
在回答这个问题之前,我应该澄清一下,我仍然是一名数据科学家。总的来说,我喜欢这份工作,我不想阻止其他人成为数据科学家,因为这很有趣,很刺激,也很有回报。这篇文章的目的是唱反调,揭露这份工作的一些负面。
从我的角度来看,我认为许多数据科学家对他们的工作不满意有四大原因。
1.期望与现实不符
大数据就像青少年性行为:每个人都在谈论它,没有人真正知道如何去做,每个人都认为其他人都在做,所以每个人都声称他们正在做……—丹·艾瑞里
这句名言太贴切了。我认识的许多初级数据科学家(包括我自己)都想进入数据科学,因为它完全是关于用酷的新机器学习算法解决复杂问题,这些算法对业务产生了巨大影响。这是一个机会,让我们觉得我们正在做的工作比我们以前做过的任何事情都重要。然而,事实往往并非如此。
在我看来,期望与现实不符是很多数据科学家离开的最终原因。这有很多原因,我不可能列出一个详尽的清单,但这篇文章基本上是我遇到的一些原因的清单。
每个公司都是不同的,所以我不能代表他们所有人,但许多公司雇佣了数据科学家,但没有合适的基础设施,以开始从人工智能中获得价值。这导致了 AI 中的冷启动问题。再加上这些公司在聘用初级员工之前没有聘用资深/有经验的数据从业者,你现在就有了一个让双方都失望和不愉快的关系的配方。数据科学家可能会编写智能机器学习算法来推动洞察力,但不能这样做,因为他们的首要工作是整理数据基础架构和/或创建分析报告。相比之下,该公司只想要一张可以在每天的董事会上展示的图表。然后,公司会感到沮丧,因为他们没有看到价值被足够快地驱动,所有这一切导致数据科学家对自己的角色不满意。
Robert Chang 在他的博客文章《给初级数据科学家的建议中给出了一个非常有见地的引用:
评估我们的抱负与我们所处环境的关键路径的契合程度非常重要。寻找关键路径与你的最匹配的项目、团队和公司。
这突出了雇主和数据科学家之间的双向关系。如果公司不在正确的位置,或者目标与数据科学家的目标不一致,那么数据科学家找到其他工作只是时间问题。
对于那些感兴趣的人来说, Samson Hu 有一个关于如何在 Wish 建立分析团队的精彩系列,我也觉得很有见地。
数据科学家幻灭的另一个原因与我对学术界幻灭的原因类似:我相信我能够对任何地方的人产生巨大影响,而不仅仅是在公司内部。在现实中,如果公司的核心业务不是机器学习(我以前的雇主是一家媒体出版公司),那么你所做的数据科学很可能只会提供少量的增量收益。这些可以累积成非常重要的东西,或者你可能幸运地发现了一个金矿项目,但这并不常见。
2.政治至高无上
《政治》杂志已经有一篇精彩的文章专门讨论这个问题: 数据科学中最难的事情:政治 我劝你读一读。那篇文章的前几个句子基本上概括了我想说的内容:
当我早上 6 点起床学习支持向量机时,我想:“这真的很难!但是,嘿,至少我会变得对我未来的雇主非常有价值!”。如果我能拿到德罗林,我会回到过去,叫“公牛**t!”在我自己身上。
如果你真的认为知道大量的机器学习算法会让你成为最有价值的数据科学家,那么回到我上面的第一点:期望与现实不符。
事实是,商界最有影响力的人需要对你有一个好的认识。这可能意味着你必须不断地做一些特别的工作,比如在正确的时间从数据库中获取数字给正确的人,做一些简单的项目,以便正确的人对你有正确的看法。在我以前的地方,我不得不经常这样做。尽管令人沮丧,但这是工作中必要的一部分。
3)你是任何数据的最佳人选
在做任何事情来取悦正确的人之后,那些拥有所有影响力的人往往不理解“数据科学家”是什么意思。这意味着你不仅是分析专家,还是报告专家,别忘了你还是数据库专家。
不仅仅是非技术高管对你的技能做出过多假设。技术领域的其他同事认为你了解与数据相关的一切。你对 Spark、Hadoop、Hive、Pig、SQL、Neo4J、MySQL、Python、R、Scala、Tensorflow、A/B 测试、NLP、任何机器学习(以及你能想到的任何其他相关数据)了如指掌——顺便说一句,如果你看到一份写有所有这些内容的工作说明书,请保持清晰。它散发着一家公司的工作规范的味道,这家公司不知道他们的数据战略是什么,他们会雇用任何人,因为他们认为雇用任何数据人员都可以解决他们所有的数据问题。
但不止于此。因为你知道所有这些,而且你显然可以访问所有的数据,你应该在……之前得到所有问题的答案。嗯,它应该在 5 分钟前到达相关人员的收件箱。
试图告诉每个人你实际上知道并掌握的东西可能很难。这并不是因为任何人实际上都不会看不起你,而是因为作为一名缺乏行业经验的初级数据科学家,你会担心人们会看不起你。这可能是相当困难的情况。
4)在一个孤立的团队中工作
当我们看到成功的数据产品时,我们通常会看到专业设计的用户界面,具有智能功能,最重要的是,有用的输出,至少可以被用户理解为解决相关问题。现在,如果一名数据科学家只花时间学习如何编写和执行机器学习算法,那么他们只能成为团队中的一小部分(尽管是必要的),而这个团队可以让一个项目取得成功,生产出有价值的产品。这意味着孤立工作的数据科学团队将难以提供价值!
尽管如此,许多公司仍然有数据科学团队,他们提出自己的项目并编写代码来尝试解决一个问题。在某些情况下,这就足够了。例如,如果所需要的只是一个每季度生成一次的静态电子表格,那么它可以提供一些价值。另一方面,如果目标是在定制的网站建设产品中优化提供智能建议,那么这将涉及许多不同的技能,这不应该是大多数数据科学家所期望的(只有真正的数据科学独角兽才能解决这个问题)。因此,如果项目由一个孤立的数据科学团队承担,它最有可能失败(或者花费很长时间,因为在大型企业中组织孤立的团队进行协作项目并不容易)。
因此,要成为一名高效的行业数据科学家,仅仅在 Kaggle 竞赛中表现出色并完成一些在线课程是不够的。幸运的是(不幸运的是)(取决于你如何看待它),这涉及到理解商业中的等级制度和政治运作。在寻找能满足你需求的数据科学工作时,找到一家与你的关键路径一致的公司应该是一个关键目标。但是,您可能仍然需要重新调整对数据科学角色的期望。
如果任何人有任何其他意见、问题或异议,请随时发表评论,因为建设性的讨论对于帮助有抱负的数据科学家就其职业道路做出明智的决定是必要的。
我希望我没有影响你的工作。
感谢您的阅读:)
为什么要取连续目标变量的对数?
原文:https://towardsdatascience.com/why-take-the-log-of-a-continuous-target-variable-1ca0069ee935?source=collection_archive---------5-----------------------
数据科学是一个阴谋。
“嗨,我叫鲍勃,我是你们的教练。我将教你如何开车。打开第 147 页的书,让我们了解不同类型的排气歧管。这是基本的波义耳定律的公式……”
这永远不会发生,对吗?
然而,在数据科学的教学中,阐述复杂的主题是很常见的,而对基础知识却不感兴趣。没有人告诉我们什么时候加速,什么时候减速。但是几乎每个人似乎都准备好带领我们完成实数的构造。
在这篇文章中,我们将看看一个简单但有用的概念,它经常被忽视。但是首先让我们考虑对数的一个有趣的性质。
加法就是乘法
想象你是泡泡世界里的一个泡泡。你刚刚开始,你的尺寸只有 0.69,相当于自然对数 2。
你完成了一个 NPC 巫师的任务,他会给你一种药剂,让你的体型翻倍,不管你有多大。
那很好。药剂所要做的就是将你的尺寸乘以 2 来得到你的新尺寸 4。如果你是 3 号,你会长到 3 乘以 2 等于 6。
但是如果药剂唯一能做的操作就是加法呢?现在事情变得更加棘手。巫师给你一种药剂,可以让你的体型从 2 到 4 增加 2 倍。但是如果你第二天喝了药水,而你已经是 3 号了,那该怎么办呢?3 加 2 等于 5,所以药剂没有兑现它的承诺!
看起来这是无解的。幸运的是,巫师很老,也很聪明。她给你的不是增加你体型 2 的药剂,而是增加 log(2)的药剂。
你掂量着手中的小瓶子,看上去并不确信。向导对你露出灿烂的笑容,向东北方向走去。
你在同一天服用了这种药剂——你像预期的那样长到了 4 码。
由于不信任巫师,你在喝下药剂前进行了一次豁免。为了看看会发生什么,你决定只在你长到 3 码的时候才喝。
嗯,也许巫师预料到了你会这么做,并在药剂中设置了一些计时机制,一段时间后它会给你的尺寸增加 3 而不是 2。你决定扔给巫师一个曲线球。
Written in tiny print on the label: “Beware floating point arithmetic — use allclose”
嗯。
魔术有哪些规则适用于模特?
让我们考虑随机森林。
想象你看着一把你的泡泡可以装备的剑,并且想根据它的颜色和形状来预测力量调整值。
如果剑蓝->增加+2 预测力量。如果剑是圆的,加-3。
一个随机森林既不能加也不能减,但它所学到的东西会产生类似上述规则的效果。当一棵树长大后,它会查看示例的特征并选择要分裂的示例。
它试图将具有相似目标变量值的例子分组在一起。一个分支内的相似性越大,树做出正确预测的机会就越大。
但是我们如何衡量相似性呢?一种方法是考虑价值的绝对差异——一瓶 20 美元的葡萄酒与 40 美元的葡萄酒相差 20 美元。一瓶 100 美元的威士忌和 200 美元的相差 100 美元。
以这种方式来看价格,威士忌之间的差异是 5 倍之大。但是如果我们用相对的角度来看,距离是一样的!在这两对瓶子中,第二瓶的价格是第一瓶的两倍。
没有一种衡量相似性的方法是普遍更好或更差的。根据具体情况,其中一个可能比另一个更有用。
答案就在问题中
让我们想象一下,我们想了解一些关于汽车的知识。
我们可能想知道什么?举个例子,如果我们给一辆车装上空调,它的价值会增加多少?
事实证明,我们非常幸运——我们的数据集很简单,只包含兰博基尼和菲亚特。
Tom Hanks by a Fiat 126p.
“似乎给菲亚特加装空调平均会使其价格增加 307 美元,给兰博基尼加装空调平均会增加 12 000 美元,所以让我来做一件唯一合理的事情,预测给汽车加装空调会使其价格增加(12 000 美元+ 307 美元)/ 2 = 6 153.50 美元。”
但这将意味着,如果我们为菲亚特 126p 配备空调,它将升值数倍于其基价!这是我想从事的行业。
退一步说,这不是一个很好的答案。
或者,如果我们问一辆车的价值相对于它的基价会增加多少呢?这可能是一条更有用的信息。
但是我们的模型无法回答这个问题!它所拥有的是绝对的距离。
进入明智的向导。在 numpy 变体的一个咒语之后,我们的目标变量变成了对数。
我们的模型现在可以根据添加或删除这个或那个功能来了解汽车价值相对于基价的变化量。
如果你觉得这篇文章很有趣并且想保持联系,你可以在 Twitter 上找到我 这里 。
为什么团队建设对数据科学家很重要?
原文:https://towardsdatascience.com/why-team-building-is-important-to-data-scientists-a8fa74dbc09b?source=collection_archive---------9-----------------------
无论你是刚毕业的学生还是已经工作了一段时间的人,你可能或早或晚都听说过“团队建设”这个术语,你想知道为什么你个人或整个团队需要这种团队活动。
嗯…你并不孤单。
既然我已经讨论了关于我进入数据科学的旅程,并给出了一些关于如何进入数据科学的实用指南…
让我们回到真实的工作环境。
在这篇文章中,我将谈论一家公司中数据科学团队的典型组成以及为什么团队建设对数据科学家很重要。
如果你是一名有抱负的数据科学家,或者只是对了解更多关于数据科学团队如何与团队建设的补充一起工作感兴趣,那么这篇文章适合你。
请注意,根据每个公司的要求,每个公司的数据科学团队的组成是不同的。因此,这里的分享绝非详尽无遗,主要基于我的工作经验和外卖。
在这篇文章的最后,我希望你能看到数据科学团队如何作为一个整体一起工作的重要性,以及团队建设如何能够将团队的凝聚力带到一个积极的结果。
我们开始吧!
数据科学团队的典型组成
我不确定团队建设对其他公司的其他团队有什么作用。
但有一点是肯定的,团队建设对数据科学家来说非常重要,因为他们不是一个独立的实体,他们将项目付诸实施。
是的,单飞可能适用于 Kaggle 比赛,但不幸的是,在现实世界中并不适用。参加 Kaggle 比赛无疑是向全球专家学习如何执行数据预处理、特征工程、模型构建和优化的最佳方式之一。然而,这一步只是解决现实世界中整个难题的一部分。
毫不奇怪,大多数现实世界的项目需要不同专业和技能的人(数据工程师、数据科学家、数据分析师、软件工程师/开发人员、项目经理等)。)以便端到端地完成项目。
但也有例外。
一些早期的创业公司只雇佣一名数据科学家,负责从构建数据流和数据收集的数据管道到将模型投入生产的所有工作。
随着时间的推移,创业公司在成长,数据科学团队(或数据团队——团队名称其实并不重要)的形成也是如此。因此,您可能已经注意到,数据科学团队主要由以下人员组成(他们中任何人的组合):
- 数据工程师
- 数据科学家
- 数据分析师/商业智能
- 软件工程师/开发人员
- 项目经理/协调员
为什么团队建设对数据科学家很重要?
(Source)
在这篇文章中,团队建设的重要性主要集中在数据科学家的角度,但它完全适用于其他工作角色,以使团队建设更加有效。
1.互相了解,以便更好地交流
是的,你说得对。第一个目标是在更深的层次上真正了解对方,以便更好地交流。
当我第一次加入我的组织时,我非常幸运地参加了为期两天的团队建设活动。你知道吗?那次团队建设是我经历过的最难忘的团队建设,更不用说我遇到的热情友好的团队成员了,尽管我们来自不同的地方。
通过团队建设,我们在背景、文化和经历方面更加深入地了解了对方。随着彼此在个人层面上的理解,这将减少冲突的发生,从而为学习和分享带来更有利的工作环境。
这种好处绝对可以扩展到公司的任何其他团队,这使得团队建设更加有效。
2.培养团队凝聚力和团队精神
我喜欢团队建设的另一件事是根据团队成员的需求定制团队建设活动。
尽管团队建设活动的时间很短,但我们能够通过活动培养团队凝聚力和团队精神。每项活动的设计都是独一无二的,目的是让团队成员意识到团队合作的重要性,并引发思考。
如果没有团队凝聚力,我们每一个人都将只是一块支离破碎的拼图。
没有团队合作,我们每一个人都不会有一个共同点来最终达到和实现我们的共同目标。
请记住,数据科学项目不是单人游戏,需要不同的主题专家(SME)作为一个数据科学团队将各自的专业知识带到桌面上。这只有在一个团队团结一致之后才会发生,这也让我想到了团队建设的另一个重要性。
3.鼓励协作以提高团队生产力和绩效
协作。句号。
关于团队建设的最好的事情之一(至少对我来说)是我们通过性格测试和与辅导员的讨论以及我们之间的讨论了解彼此的优势和劣势。
由于不同的团队成员有自己独特的优势和劣势、社会偏好和技术知识,因此能够了解这些方面对于提高团队生产力和绩效非常有帮助,尤其是在数据科学团队中。
怎么会?
不是每个人都知道一切,但每个人都知道一些事情。只有在一起,他们才能把事情做得更大。
您可能是一名数据科学家,专门从事模型构建和优化,但对数据工程的样子却没有什么概念。总有一天,你会想了解更多关于数据管道和架构的技术方面,以执行某些任务。与其在 Stack Overflow 和 Quora 上搜索疯狂地独自寻找答案,你可以向任何在这方面有经验的团队成员寻求建议,并向他/她学习。
瞧!有时答案就在一个问题之外。
快速完成任务是提高团队生产力和绩效的一个步骤,这个例子只是众多例子中的一个。
最后的想法
(Source)
给你。感谢您的阅读。
我希望你在这里找到有用的东西。事实上,独自成为一名数据科学家既有趣又富有挑战性,同时也很有收获。能够作为一个团队与他人一起工作更为重要,也更有回报。
你以前在你的团队中有过团队建设的经历吗?我很想知道你过得怎么样,也很想了解你的经历。请在下面的评论中告诉我!!
一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。在那之前,下一篇文章再见!😄
关于作者
Admond Lee 目前是东南亚排名第一的商业银行 API 平台Staq—的联合创始人/首席技术官。
想要获得免费的每周数据科学和创业见解吗?
你可以在 LinkedIn 、 Medium 、 Twitter 、脸书上和他联系。
[## 阿德蒙德·李
让每个人都能接触到数据科学。Admond 正在通过先进的社交分析和机器学习,利用可操作的见解帮助公司和数字营销机构实现营销投资回报。
www.admondlee.com](https://www.admondlee.com/)
Javascript —代理
原文:https://towardsdatascience.com/why-to-use-javascript-proxy-5cdc69d943e3?source=collection_archive---------5-----------------------
最近,我在阅读一些不太出名的 Javascript 特性,发现了 Javascript 代理。
在探讨为什么这很重要之前,让我们先了解一下它是什么。如果你已经知道了,可以跳过几段。
Proxy are magic methods
代理是 javascript 中的一个对象,它封装了一个对象或一个函数,并通过一个叫做目标的东西来监控它。而不管包装的对象或函数是否存在。代理类似于其他语言中元编程。
在继续之前,我们需要了解 3 个关键术语:
- 目标:被代理的对象或功能。
- 处理程序:对被代理的对象或函数做某些事情的函数。
- 陷阱:这些是一些用来作用于目标的函数。点击这里阅读更多关于陷阱的信息。
下面是我们对它的定义
Syntax
我们使用 ES6 中的代理类,参数,目标是包装对象,处理程序将是使用陷阱在目标上执行某些操作的函数。
下面是一个 简单的 用法的例子
Basic example for proxy
我们制作了两个对象,分别叫做 target 和 handler,target 是一个带有消息键的简单对象,handler 是一个带有 get 键的对象,该键带有一个与之相关联的函数。我们在代理类中传递 2 个对象,作为回报,我们接收一个代理对象,通过它我们可以访问目标对象的消息属性。
下面是一个如何使用它对对象值的 验证 的小例子
Validation of object key’s
我们使用一个空对象作为目标对象,并使用一个处理程序在目标对象上设置陷阱并进行验证。很简单对吧!
让我们看看如何使用它来制作 API 调用包装器 。
我们已经使用了 axios ,然后用我们的基本 URL 创建了一个实例,为一个代理创建了一个处理程序,它返回一个要使用的 get、post、put、delete、patch 函数的对象,最后创建了一个 API 对象,它是一个空对象目标的代理对象。
然后,我们可以将它用作:
Calling API proxy object
这可以扩展到验证、值修正、跟踪属性访问、未知属性警告、负数组索引、数据绑定、访问 restful web 服务(方法调用)、可撤销引用、监控异步函数、类型检查等等,阅读此处了解更多信息
我个人发现 javascript 代理在 restful web 服务、验证、监控异步功能中非常有用。我会探索更多。
边注 :使用的例子可以优化。
你可能也会喜欢我的其他文章
- Javascript 执行上下文和提升
- Javascript —生成器-产出/下一个&异步-等待🤔
- 理解 Javascript‘this’关键字(上下文)。
- 带有映射、归约、过滤的 Javascript 数据结构
- Javascript- Currying VS 部分应用
- Javascript ES6 —可迭代程序和迭代器
- Javascript —作用域
如果你喜欢这篇文章,请随时分享,帮助别人找到它!
谢谢!
由于这个令人难以置信的独特原因,普遍基本收入是必要的
原文:https://towardsdatascience.com/why-universal-basic-income-is-necessary-it-isnt-what-you-think-ab602f62a207?source=collection_archive---------3-----------------------
答案在于鸡……
反对普遍基本收入的一个最常见的论点是,它将允许数百万工人变得懒惰并退出劳动力市场,从而导致经济的巨大下滑。
虽然普遍基本收入确实有许多细微差别和技术细节,并且公然声明它是好是坏是非常幼稚的,但我不认为 UBI 会引起大规模的懒惰转变。
原因是鸡。
让我们假设。想象一下,所有人的财物都被拿走,换成一只鸡。
50%的人饥饿、烦躁、易怒,会把鸡杀了当晚餐吃。
大约 48%的人会忍饥挨饿,等待鸡生蛋。他们现在会有源源不断的食物供应。
剩下的 2%会坚持更长时间,找到一只异性的鸡,孵化出更多的鸡。最终,他们不仅可以从鸡那里获得源源不断的食物,还可以发展出一个鸡肉帝国,向 50%没有任何鸡肉的人出售煮熟的鸡肉。
如果你认为 UBI 是共产主义的一种形式,它会导致每个人懈怠,这个例子说明了为什么它不会。
总会有一小部分人愿意推迟即时满足,努力壮大他们的(鸡)帝国。这些是鸡的精英。
还有一些人明白这个想法,但不了解全部情况,他们用鸡来下蛋,但并不总是吃饱,因为下蛋需要时间。这是小鸡中产阶级。
最后,有些人无法控制即时满足感,也无法规划未来。他们立即吃他们的鸡,在第一天有一个伟大的盛宴,但此后永远在饥饿中匍匐前进。这就是鸡穷。
这个类比可以用来证明 UBI 是无用的,因为每个人都将回到他们的阶级——穷人到穷人,中产阶级到中产阶级,精英到精英,但是有一个问题。
有成千上万的人,通过正确的教育和机会,可以成为像鸡精英。问题是,他们一开始就没有“鸡”。
这就是 UBI 如此重要的原因。随着自动化的到来,夺走了非熟练工人甚至一些熟练工人的工作,那些没有我们认为理所当然的机会如良好的教育、互联网接入和工作的人将无法生存。
重要的是人要有成功的机会,不能多,也不能少。
给定一份基本收入,那些有成功欲望的人可以战略性地利用它去他们想去的地方,而真正懒惰的人会留在原地。
在各自领域的专家中,越来越多的公众认为普遍基本收入是未来的发展方向,我希望这个类比能帮助你理解为什么。
你对 UBI 有什么看法?如果你能回复我,我会很高兴的。
感谢阅读,
¯_(ツ)_/¯
萨尔瓦夫
看看我的其他故事吧!
你一直在使用完全错误的介质—https://medium . com/swlh/You ve-be-use-medium-complete-error-52 df 28 f 95876
你是不是完全低估了 AI?—https://medium . com/swlh/are-you-complete-低估-ai-96c7083cfd50
为什么要用机器学习代替传统统计学?
原文:https://towardsdatascience.com/why-use-machine-learning-instead-of-traditional-statistics-334c2213700a?source=collection_archive---------6-----------------------
Image by Matan Segev on pexels.com
当我为一家大型金融服务公司的分析师职位准备电话面试时,这个问题浮现在我的脑海中。当面试我的工程师问我:“你为什么选择在你的项目中使用学习方法,而不仅仅是回归和相关的统计数据?”时,我的好奇心变成了苦恼
我一开始不明白这个问题。对我来说,一个向学生推荐未来大学的算法没有机器学习就无法运行,这似乎是显而易见的。我如何在不对我们数据集的成千上万笔交易应用人工智能的情况下,识别出将增加电影院连锁爆米花销量的电影?采访之后,我开始思考这个问题。
为什么简单回归不能用来识别影响因素及其相关系数? 当我思考这个问题并做一些研究时,我意识到学科之间的界限对许多人来说似乎很模糊——以至于我们可以怀疑机器学习是否不仅仅是美化了的统计学。
ML 真的和统计学不一样吗?这种差异会产生有意义的技术影响吗?还是说你做 ML 和 AI 只是好听?
在本文中,我将主要关注监督学习方法。首先,因为这是我的项目所依赖的,所以这是我必须给出答案的类别。其次,因为这通常是人们听到“机器学习”时的想法。
事实上,人们通常将最大似然与推断统计学联系在一起,即旨在理解特定人群中现象的潜在概率分布的学科。这也是我们在 ML 中想要做的,以便为一个新的总体元素生成一个预测。
推断统计依赖于假设:统计方法的第一步是选择一个具有未知参数的模型,用于管理观察到的特性的基本法则。然后相关性和其他统计工具帮助我们确定这个模型的参数值。因此,如果你对数据的假设是错误的,参数的计算将毫无意义,你的模型将永远不会以足够的精度拟合你的数据。
Trying to fit a Gaussian model by visualizing a histogram
因此,让我们选择更好的假设,并确保选择正确的模型!你可以认为。是的,但是有无限多的可能的分布族,却没有一个好的方法。通常,我们进行描述性分析来确定数据分布的形状。但是如果数据有两个以上的特征呢?我们如何将这些数据可视化以提出一个模型命题?如果我们不能识别模型的具体形状怎么办?如果两个系列的模型之间的细微差别不能被人眼分辨出来怎么办?事实上,模型化阶段是推断统计学方法中最困难的部分。
这是正确的!当我们确定数据中的关系是线性的,然后运行线性回归时,这也是我们在机器学习中所做的。但是 ML 并没有总结到这一点。让我们不要忘记,学习方法,对于深度学习来说更是如此,要在自然和人类的学习过程中找到它们的根源。
Photo by Derek Thomson on Unsplash
让我们看一个例子。就拿一个想转行做房地产经纪人的医生来说吧。起初,她对房地产市场及其运作方式一无所知。但是,当她观察到她参观过的房产正在成交时,她将对市场有更好的了解,并很快能够对房产价值进行良好的估计。当然,我们都有一个广泛的直觉,房子越小价格越低,但这并不意味着两倍小的房子会便宜两倍。此外,我们的新经纪人还没有得到一个包括房子所有特征的公式来计算正确的价格。那太容易了!相反,她用许多例子“喂养”她的大脑,并随着时间的推移建立了一个更准确的判断:她已经学会了!
总体而言,这正是机器学习、深度学习和人工智能的要点。这种学习方法使我们能够识别数据集中棘手的相关性,对于这些相关性,探索性分析无法正确确定潜在模型的形状。我们不想给出数据分布的明确公式,而是希望算法直接从数据中自己找出模式。学习方法使我们能够抛弃附在统计方法上的假设。
当然,对于一些真实世界的应用程序,回归和相关就足够了。有时我们只想知道一个变量相对于另一个变量的总体趋势。在这种情况下,简单的相关性将确定与该趋势相关的系数。但是,如何确定一个模型来对这些非线性可分离数据进行分类:
There is no straight line to separate these data points in 2D
没有简单的回归能够做到这一点。机器学习提出了 SVM(支持向量机)和内核技巧,将数据映射到更高维度,在那里它们是线性可分的:
SVM algorithm maps the points into 3D where they are separable by a plane (linear hyperplane in 3D)
ML 似乎不可避免的另一个例子。假设我们的数据有五个特征 X1、X2、X3、X4 和 Y,Y(我们希望能够预测的期望输出)和其他四个输入特征之间的基本关系就像:
ε(蓝色)是大多数真实世界现象固有的噪声。当然,回归在理论上是可行的。我们可以从四个输入中构建新的变量,方法是应用对数、平方根、指数、将这些特征提升到 2、3、4……的幂,对这些变量的一些和取对数。然后,我们将使用这些新特征作为线性回归的输入变量。想出正确的模型需要使用大量可能的变量,我们不太可能实现它——我不包括可以通过子集选择来选择的变量的不同组合。简单的多项式回归又一次为我们提供了一个对我们的目标足够精确的模型。但是如果我们寻找一个最小化的错误,学习方法是关键。
不要误会,没有 ML 方法会输出‘真实’的底层模型。相反,它将提供一个模型来表示与数据行为最接近的可能匹配。有时,这可以是一个全局函数或局部模型,例如,如果我们使用随机森林或 KNN。这些最后的算法甚至不提供我们计算新观察数据的输出的函数,而是将新观察分配给一组“旧”数据——训练数据——并且决定输出应该与该组的输出相似。
我们还可以提到这样一个事实,即机器学习是计算机科学和优化所固有的,它允许在巨大的数据集上进行快速学习,这不是统计学所关心的问题。我们看到,ML 的目标不是提出关于数据的知识(“这是真实的现象,这是它是如何工作的”),而是提出一个可行的和可重复的模型,其误差容限由我们正在进行的项目决定。
事实上,学习方法是处理大量问题所必需的。他们忽略了我们对数据知识的缺乏,没有提示我们选择模型。当然,你必须决定使用哪种算法,但这是另一回事。毫无疑问,它们仍将是必不可少的,深度学习和 NLP 支持的疯狂应用证实了这一点。
你呢?为什么学习方法对你的项目至关重要?请在评论区告诉我😄
为什么要可视化梯度下降优化算法?
原文:https://towardsdatascience.com/why-visualize-gradient-descent-optimization-algorithms-a393806eee2?source=collection_archive---------3-----------------------
先决条件-简介
在多层感知器 (MLPS )中,我们使用 tanh 或 sigmoid 函数作为激活函数进行学习,而不是使用阈值阶跃函数的基于逻辑的麦卡洛克皮茨神经元的苛刻判断。MLPs 为我们提供了输入的平滑且有界的实值输出函数,具有良好定义的导数的优点,这使得学习权重更容易。我们可以将学习这些权重和偏差的问题视为优化问题,并对其应用不同的算法。假设我们这里的函数是损失为 L (w,b)的 sigmoid 逻辑函数。
Sigmoid Logistic Function
Loss Function, to minimize(Training Objective)
为这些算法和它们的收敛方式提供视觉效果,将为设计者选择最佳方案提供深刻的见解。现在,假设我们没有学习权重的算法。我们将如何解决这个学习问题?随机猜测将是我们的方法,用我们大脑的一些启发来固定 w 和 b 的值,使得误差达到最小。让我们看看这样的过程,只有两个数据点进行训练。
Loss with w=-0.10 comes out greater then first iteration w=0.50. Hence, changing our approach with iteratively better values for w and b. Also, in guess work knowing that with higher ‘w’ values behavior approaches step functions & with higher ‘b’ values it shifts towards left is helpful.
很明显,我们需要明确定义的方法来学习权重和避免随机化方法。但是为什么要梯度下降呢?为了理解这一点,假设我用小的∏θ移动矢量θ,以检查损耗是否减少。有效矢量可由矢量加法平行四边形定律写成θnew =θ+η∏θ。现在,应该用什么∏θ?我们把泰勒级数应用在上面,观察一下。η是学习率。
l(θ+ηu)= l(θ)+η∫u t ∇l(θ)[η一般很小,所以η 2,η 3,… → 0]。因此,应选择 l(θ+ηu)l(θ)< 0 的值,即 u T ∇L (θ) < 0。
设β为 u T 和∇L 之间的角度(θ)。因此,当 cos(β)= 1 时,即当β为 180°时,l(θ+ηu)l(θ)= u t∇l(θ= k∫cos(β)为最大负值。因此,向梯度的相反方向移动。这是梯度下降的方程式。现在,我们可以在这之后开始想象。
Gradient Descent Method’s Equations. In one epoch GD is calculated once only taking into account all the points.
先决条件-可视化
理解误差曲面和等高线图的概念是必需的,然后我们就可以开始可视化不同的优化算法了。让我们首先来看误差表面,红色代表高误差,蓝色代表相反的误差。
Gradient Descent Convergence. Also, notice that for steeper surface it converges faster visible with less dense point representation.
3D 表示可能很麻烦,并增加了表示工作量。相反,误差表面的 2D 等高线图可以提供等效的表示能力。让我们分析上述误差表面的等高线图情况,其中相同的颜色表示该区域中相同的误差值。此外,更陡的坡度或坡度的快速变化可以用该图中的线箭头来分析。和具有类似线状结构的密集点的缓慢变化。
Contour Map with GD applied on it. Arrows represent faster fall in error value. Flat surfaces represented by constant color regions.
选择哪个梯度下降变体?
虽然 Adam 是许多深度学习模型的标准,但理解每个梯度下降优化变体的基本功能很重要,因为取决于误差表面,不同的优化可能执行得更好。就像,许多论文表明 SGD 与动量加退火η也表现很好。出于这个动机,本文旨在通过可视化这些算法来理解,同时也试图保持简洁。这里,在本文中只讨论在大多数实际用例中观察到的一般情况和行为。
This post at Trask’s twitter account was main major motivation for this post. Courtesy: Sebastian Ruder
我们开始吧。终于!!😉
现在,从以上梯度下降的可视化可以清楚地看出,对于平坦表面,表现缓慢,即需要更多的迭代才能收敛到更平坦的表面。让我们考虑这样一个场景:在一个未知的区域定位一所房子,同时询问地址。如果多人指向同一个位置,随着每个肯定的肯定,我们将开始以越来越快的速度向同一个方向移动。就像一个自由落体的球。我们直到现在才利用这个事实。如何利用错误表面的这一事实?在中,基于动量的梯度下降值的变化也考虑到了历史。
Equation for Momentum based Gradient Descent
Exponentially weighted average is being taken. Earlier responses are less weighted. With this it is able to take faster steps in flat surfaces. Even after shooting away it returns faster with U-turns.
有了更早的 surface 它肯定会表现得更好。现在,让我们来看一个新的误差曲面,它具有更窄的极小曲面。
It oscillates in the valley of minima. Take lot U-turns, still converges faster than Vanilla GD.
收敛有很多振荡,这意味着 sigmoid 函数在相反的方向上反复多次。导致可以避免的客观过冲。但是怎么做呢?在纵身一跃之前,先简单地向前看,如何?
x(2-unit)-y(0.2-unit) plot of sigmoid function. For Momentum Based Gradient Descent.
内斯特罗夫加速梯度比动量法收敛更快。移动一点,计算该点的梯度,然后更新权重和偏差。
Similar Equation will be there for ‘b’ also.
看这里的一个观察,所有的 U 形转弯都是在 NAG 基于动量法的范围内进行的。因此,这减少了振荡。当然修正要快得多。现在,我们有一个令人满意的解决方案,可能不是一个最佳的解决方案。例如,有多个最小值,很难避免较小的振荡,但可以通过不同的初始化来处理。因此,我们有满意的解决方案,现在让我们把一些重点放在减少计算时间。
Comparison b/w NAG(blue) v/s Momentum Based Method(Red)
考虑到有大量的数据点,假设一百万个数据点之后只有一次更新,这将消耗太多的时间。但是,正如上面的证明所发现的,其正确的使用方法,即对应于每个数据点的损失梯度的总和应该最小化。为了提高效率,在这种情况下,可以使用概率方法进行近似。
用随机方法近似:该算法将对每个点进行更新,它将像一个时期中百万个点的百万次更新。这也是一个令人满意的解决方案,因为近似法不能保证每一步的损耗都会减少,就像扔硬币一样。
Many oscillations with greedy decision making. As, each point pushes parameter in a direction most favorable to it. Almost like data points are competing with one another.
贪婪决策将参数推向最需要的方向,在这种情况下可能并不需要。对于狭窄的表面,这种行为将随着更多的振荡而放大。只有在观察到某一批点后,我们才能通过创建批和更新参数来解决振荡问题。这种方法叫做小批量梯度下降。对于大型数据集,它的收敛速度会更快。实际上,k 的典型值是 16、32、64。
Less oscillations can be seen for k=2 itself.
另外,GD 方法在一个历元中只需要 1 步。随机 GD 在一个历元中走 N 步。其中为小批量 GD 优化的 N/B 步骤。类似于这种随机版本的基于动量的方法和 NAG 可以存在。在概率方法中,NAG 相对于基于动量方法的优势仍然存在。此外,这两种方法都比随机梯度下降法表现得更快。同样,为了获得更小的振荡和更好的性能,这些器件需要小批量实施。
考虑调整学习率超参数的场景。因为在讨论了所有算法变型之后,这种变型被忽略了。我们不能有大的学习率,因为它会放大梯度,即使对于平坦的误差表面,事实上,学习率值的逐渐变化将是一个好主意来结束我们的分析。同样,我们的第一个粗略的方法将是尝试不同的随机学习率,并在反复试验后找到最佳的一个。大脑启发法不是一个好的战略解决方案。其他方法可以是退火像阶跃衰减,指数衰减,1/t 衰减可以是一个替代选择。退火动量可以是一种更快收敛的方法,再次逃脱最小值将是一个问题。
线搜索,按顺序选择一串学习率,计算相对较好的η值的梯度。更新不同η值的“w”和“b ”,并保留最佳值。它很快离开缓坡,而不是粘在上面。振荡取决于学习率集的选择。但是,每一步的计算都会增加。我们需要更少的计算!!有什么解决办法?大家多讨论一下。
Faster than Vanilla GD approach. Small oscillations, different from Momentum & NAG.
自适应学习速率,这背后的想法我们可能需要不同的学习速率来实现不同的功能。为何如此?一个变量可能很稀疏,但如果它没有得到正确更新,或者没有得到足够更新,模型将无法做出正确预测,那么它可能非常重要。比方说,每当院长给一个班上课时,几乎所有的人都出席了,但是只有一个院长。这是一个稀疏的变量,但却是不同班级出勤趋势用例中的主要控制案例之一。
因此,合成方法将具有更多与其更新历史成比例的衰减。更多,更新意味着更多的腐烂。
Adagrad update rule, similar one for ‘b’
让我们考虑这样一种情况,沿着‘b’进行初始化,在‘w’轴上很少移动。这意味着我们已经假设‘w’本质上是稀疏的,它经历很少的更新。现在比较不同的 GDs 变体。在这里,GD 是黑色,Momentum 是红色,NAG 是蓝色,Adagrad 是绿色。
It ensures ‘w’ has larger learning rate for more updates. For ‘b’ learning rate decreases as denominator is growing.
从上面的视觉化来看,阿达格拉德在接近收敛时卡住了,不再能够向 b 的方向移动。在 Adagrad 中,衰减率太大,因此频繁的参数将开始接收非常小的更新。为了防止这种快速增长,我们可以通过使分母项为β及其补数的分数之和来减少分母项。 RMSprop,利用这一特性,在频繁变量中进行不太激进的衰变。
以上是 RMSprop 的更新规则,类似的公式也适用于偏差。此外,它会积累历史,但不会迅速衰减。这里,术语“v”是用指数衰减平均值计算的,而不是梯度的总和。
Here, the new magenta line added above green of Adagrad is RMSprop
在前面讨论的 RMSprop 逻辑中,忽略了动量,可以通过考虑步骤的历史来添加动量。考虑到这一点的方法是 Adam 优化方法。它对 CNN,大型序列间模型非常有效。
m(hat) is bias correction. Why bias correction is required ?
与上面讨论的方法相比,收敛通常更快。Adam 现在似乎或多或少是默认选择(β 1 = 0.9,β 2 =0.999,ε= 1e 8)。一些研究表明在某些情况下不会收敛。但是对于初学者来说,这是一个很好的入门选择。
现在,为什么需要偏差校正,然后我们终于可以休息了。注意,我们取梯度的移动平均值为‘mt’。我们这样做的原因是我们不想太依赖当前梯度,而是依赖梯度在许多时间步长上的整体行为。感兴趣的是梯度的期望值,而不是时间“t”处的单点估计。然而,我们不是计算 E[∇w t 而是将 m t 计算为指数移动平均值。理想情况下,我们希望 E[m t 等于 E[∇w t 。从数学角度来看这个案子。
Derived From m(t) = β1 ∗ m(t−1) + (1 − β1 ) ∗ g(t) | Let ∇wt as gt
表达双方的期望。此外,假设所有 gi 来自相同的分布,即 E[g i ] = E[g] ∀ i。然后应用 GP sum,β作为公共比率。
Expectation both sides | After assumption of E[gi ] = E[g]
Bias Correction applied as expected value of m̂t is the same as the expected value of gt.
我希望以上所有的分析和可视化能够清楚所有与优化算法相关的主要概念,需要开发更新的算法,并对在哪里使用算法有直观的理解。为了保持文章简短,没有讨论所有的优化变量。请继续关注这些算法的实现细节,以及后续文章系列中对不同用例的深入分析。感谢阅读!!
鸣谢
Mitesh M. Khapra 教授和他助教们在创建深度学习的非常丰富的课程方面做了出色的工作。这些图片都是从那里借来的。此外,这些内容来自 Ryan Harris 的“可视化反向传播”(可在 youtube 上获得)和 Andrej Karpathy 的课程 cs 231。我只是试图用简洁的方式解释它们。热情问候。
为什么在深度学习中我们需要比反向传播更好的学习算法
原文:https://towardsdatascience.com/why-we-need-a-better-learning-algorithm-than-backpropagation-in-deep-learning-2faa0e81f6b?source=collection_archive---------2-----------------------
Source — toptal -https://www.toptal.com/
我们都同意一件事,即反向传播是一种革命性的学习算法。当然,它已经帮助我们训练了几乎所有的神经网络结构。在 GPU 的帮助下,反向传播将几个月的训练时间减少到了几个小时/几天。它允许有效地训练神经网络。
我想到了它被广泛采用的两个原因,(1)我们没有比反向传播更好的方法,(2)它有效。反向传播是基于微分的链式法则。
问题在于反向传播算法本身的实现。为了计算当前层的梯度,我们需要下一层的梯度,所以当前层是锁定的,我们不能计算梯度,除非我们有下一层的梯度。如果我们的网络中有 1000 层,我们的第一层必须等到永远更新它的权重。神经网络的前几层很糟糕,不能正常更新。有时,在 Sigmoid 激活函数的情况下,当我们往回传播时,梯度消失或爆炸。
当我们做决定的时候,我们是基于我们当前的观察和之前的学习来做决定的。目前的神经网络或深度学习算法不是按照我们做决定的方式设计的。我们的经验决定了我们的决定。例如,当我们走路时,我们使用视觉、听觉和感官输入来做出决定。我们利用从一个任务中学习来学习其他任务。
反向传播算法的局限性:
- 这是缓慢的,所有以前的层被锁定,直到当前层的梯度计算
- 它遭受消失或爆炸梯度问题
- 它遭受过拟合和欠拟合问题
- 它只考虑预测值和实际值来计算误差和计算梯度,与目标函数相关,部分与反向传播算法相关
- 它在计算与目标函数相关、与反向传播算法部分相关的误差时,不考虑类之间的空间、关联和去关联关系
DeepMind 的合成渐变显示了一种变通方法,但它不是一种解决方案。在我看来,我们必须从头开始思考,设计一种新的学习算法,它可以高效地学习,并可以帮助我们的网络实时学习。
免责声明:这是我的个人观点,完全基于我的学习和研究。我邀请大家分享对此的想法。
感谢您的阅读。
如果你想取得联系,你可以通过 ahikailash1@gmail.com的联系我
关于我:
我是 MateLabs 的联合创始人,我们在那里建立了 Mateverse ,这是一个 ML 平台,让每个人都可以轻松地建立和训练机器学习模型,而无需编写一行代码。
注:最近,我出版了一本关于 GAN 的书,名为《生成对抗网络项目》,书中涵盖了大部分广泛流行的 GAN 架构及其实现。DCGAN、StackGAN、CycleGAN、Pix2pix、Age-cGAN 和 3D-GAN 已在实施层面详细介绍。每种架构都有专门的一章。我已经使用 Keras 框架和 Tensorflow 后端用非常简单的描述性语言解释了这些网络。如果你正在开发 GANs 或者打算使用 GANs,请阅读一下,并在ahikailash1@gmail.com与我分享你的宝贵反馈
[## 生成对抗网络项目:使用 TensorFlow 构建下一代生成模型…
探索使用 Python 生态系统的各种生成性对抗网络架构关键特性使用不同的…
www.amazon.com](https://www.amazon.com/Generative-Adversarial-Networks-Projects-next-generation/dp/1789136679)
可以从http://www . Amazon . com/Generative-Adversarial-Networks-Projects-next-generation/DP/1789136679https://www . Amazon . in/Generative-Adversarial-Networks-Projects-next-generation/DP/1789136679?FB clid = iwar 0 x2 pdk 4 ctxn 5 gqwmbbkigib 38 wmfx-sqcpbni 8k 9z 8 I-kcq 7 vwrpjxm 7 Ihttps://www . packtpub . com/big-data-and-business-intelligence/generative-adversarial-networks-projects?FB clid = iwar 2 otu 21 fam fpm 4 suh _ HJmy _ drqxovwjzb0k z3 zis bfb _ MW 7 inycqqv7 u 0 c
为什么我们不应该担心工作会被人工智能技术抢走?
原文:https://towardsdatascience.com/why-we-shouldnt-worry-about-losing-jobs-to-ai-technology-fbef824bc7e1?source=collection_archive---------0-----------------------
我们不时会看到人工智能,确切地说是自动化程度更高的行业和系统,导致工作岗位流失,我们应该担心吗?
我不得不承认,在阅读安德鲁·迈克菲和埃里克·布林约尔松的《第二次机器时代》之前,我对这种形式的工业进化没有更乐观的看法,的确,过去许多有记录的工作因为进化而从生活中消失了,如果你坐下来和更老的几代人谈论一些曾经存在的工作,你会惊讶于这些工作是如何存在的,但这是进化,这是工作创造和淘汰的循环。
为什么担心?
不可否认的事实是,这种演变应该发生,但工作的更换速度并不匹配发展新的生存技能的能力,是的,这是现实!我们采用新的技能来生存,但现在进化和自动化的水平开始超过学习和创造新工作的能力,我们面临的选择是放慢这一进程或面对现实,让每个人自己处理,或者一个更体贴的解决方案开始被一些国家采用:基本收入。
利弊?
减缓一个行业的发展会对增长和利润产生另一种影响,考虑到迁移的成本和对保持质量标准的影响,大多数行业将倾向于将他们的行业转移到更便宜的劳动力市场,在这种转移中,许多工作岗位将不是逐渐地而是明显地流失,这最终会造成巨大的社会挑战。 举个例子 Carrier-Trump challenge 就是其中一个例子,在这个例子中,公司不是在沙盒中试图看看如何恢复就业机会和减缓发展,这个行业最终将采取比预期更多的措施,例如应用新的保护主义法律,这些法律被认为是衰落的标志。 多长时间有效?直到它成为一个“僵尸植物”的产业。
每个人都在努力寻找一份新工作,这不是每个人都要面对或准备去做的事情,尤其是在新工作要求越来越复杂的情况下。在这种情况下,个人发现自己面临着学习新技能的挑战,或者在开始自由职业生涯或自己创业时变得更有创造力,但开始新的东西是一个独立的故事,不适合这篇文章。
最后剩下的就是基本收入,全民基本收入,也叫公民收入。基本上是无条件地给定期的人发放免费的钱,这是一种福利,但是没有人知道这一步的结果,尽管 Y Combinator 的总裁 Sam Altman 和另一组 YC 的研究人员在加州进行了一项实验,记录了给 100 个家庭发放 2000 美元的影响。在未来,当自动化接管时,很大一部分劳动力将会暴露出来,并可能需要这样的需求,但结果并不确定。
为什么不担心?
综上所述,在每一种情况下,积极的东西总是可以在我们的优先考虑中得到推动和强调,人类表明,通过艰难的处境和巨大的灾难能够采取非常积极的生存方式,重大战争和技术进步使我们更加意识到使用武力, 我们更愿意做出谨慎的决定,更愿意进行更多的国际合作来面对由忙乱的个人决定引起的危险,我们更愿意面对环境问题的所有后果,这同样适用于自动化、人工智能和就业。
进步虽然总体上是积极的,但我们对技术进步的应用的理解可能需要更全面的视野,而不仅仅是让它以随机的方式行动,可能需要实施法规来减缓应用,我们将需要采取更多的劳动力“再技能化”计划,这种计划是存在的,但我不确定不同核心和组织之间在处理方式上的协调程度,更准确地说,谁应该支付费用?是否应该对严重依赖自动化的行业征税?但是,如果我们没有培养出一代有技能、有更灵活转换能力的人,那该有多好。
教育 2.0?
这是我留到最后的,这是一个严重的问题,关于我们能在多大程度上保持我们现有的经济体系,我不确定它是否能够与自动化和工作相协调。
教育系统肯定需要改变,以减少年数,并开始一个更集中的方法来学习什么是需要的,并在任何时候回去,在需要的时候得到更多,这就是我每天所做的,学习新的技能,以适应变化。
为什么我们不擅长医学
原文:https://towardsdatascience.com/why-we-suck-at-medicine-20c78c7bccd4?source=collection_archive---------8-----------------------
任何告诉你他们知道某事的人都是在胡说八道
我想不出比我们现在的总司令更好的例子了。他不断请求我们“相信”没有人比我更了解(此处插入字面意思)这件事,这引起了那些仍有兴趣观看这场闹剧的人紧张的笑声。但是这说明了这篇文章更广泛的观点:如果我们已经知道东西,那么还有学习东西的空间吗?
“1500 年前,每个人都知道地球是宇宙的中心。500 年前,每个人都知道地球是平的。15 分钟前,你知道人类在这个星球上是孤独的。想想明天你会知道什么。—(特工 K,黑衣人)
上面的引用(来自我最喜欢的一部电影)提供了两个人类通过发现过程成功推进“已知”的历史例子。第三次没有发生,但我可能错了。让我们来看一个更具体的例子:
美国宇航局 EmDrive 打破牛顿第三定律
由于我是一个科幻迷,我不得不把这个放在这里。基本上,该发动机——2001 年开发,2014/15 年测试,2016 年发布——是一个无螺旋桨推进系统,这意味着该发动机不使用燃料来引起反应。在这里阅读这项技术及其对太空探索的意义。无推进器推进系统“违背了我们目前对物理学的基本理解:一个动作(推进一艘船)在没有反应(点燃燃料和排出物质)的情况下发生是不可能的。对于这种事情的发生,这将意味着一种“尚未定义的现象正在发生——或者我们对物理学的理解是完全错误的。"
现在,仅仅通过在网站上阅读这篇文章,我能知道我们对物理学的理解是否完全错误吗?当然不是(我什么都不知道,记得吗?).但它强化了这样一种观念,即在“东西”停止争论数百年后,人类将继续发现关于“东西”的东西。这让我想到了我的下一个观点:我们大脑处理信息的能力有限,导致我们通过二元透镜对我们的世界进行分类(对与错,真与假,真与假,等等。)出于方便。在牛顿第三定律的情况下,每一个单独的动作都需要一个反作用,因此任何不遵守相同原则的动作都被认为是不可能的。我们出于方便对事物进行分类的倾向是这一知识进步难题的本质。
为什么我们的医学“知识”限制了我们治疗疾病的进展
分类帮助我们简化我们周围的复杂世界——没有它,我们正常化感觉输入和发展神经通路(我们称之为学习)的能力将受到极大限制。然而,当分类的目标不是明确地学习和改进时,我们实际上最终增加了阻碍进步的复杂性。这就是我们目前在医学大数据分析中所处的位置。
为医学发展的分类系统的主要目标是创造管理效率。虽然与“了解什么有效”(即医学的目标)的目标没有直接的对比,但两者之间出现的不一致往往会通过确认实际上不存在的信号来扭曲知识的聚合体。这到底是什么意思?
垃圾进,垃圾出
我们为了简化而分类,最终得到的是不完整的数据。电子病历中的结构化信息虽然易于传输和访问,但在患者病历中仅占大约 20%的医疗相关数据。让我们暂停一下,尝试理解这意味着什么。如果我们只有五分之一的医疗信息用于结构化分析,那么五分之四的医疗信息仍然是非结构化和未使用的?
是的。
显然,我们已经如此有效地浓缩了我们关于人体和疾病过程的知识,以至于我们只需要很小一部分数据就可以确定以下内容:
- 所有重大疾病的临床指南
- 每种批准药物的安全性和有效性
- 过去 15 年的公共卫生政策…(大口)
在现实世界中,这种认为我们“知道”如何治疗疾病的信念转化为一些可怕的后果。
[## 研究人员称,医疗失误是美国人死亡的第三大原因
约翰霍普金斯医学院的研究人员进行的一项研究表明,医疗差错应该列为第三大死亡原因…
www.npr.org](http://www.npr.org/sections/health-shots/2016/05/03/476636183/death-certificates-undercount-toll-of-medical-errors)
这一严酷的现实源于我们对医学知识最终结果的信念,以及整个行业对解决系统性和棘手问题的抵制——缺乏对完整临床数据的访问。过去 15 年的进步,特别是在学习如何治疗慢性疾病方面的进步,显示了我们还有多少尚未开发的 80%有待学习。绘制人类基因组是一个巨大的飞跃,但这仍然只是我们开始弄清楚事情所需的一小部分数据。精确医疗的梦想是可以实现的,但只有在我们找到如何建立完整和一致的数据来源之后。现在,想象那看起来像什么…
黄金场景—完整、结构化的临床数据
解决上述系统性棘手问题的每一步在技术上都很简单,在操作上很复杂,在文化上也不太可能。
第一步——把所有东西都放在一个地方:了解慢性病——我在这里只关注慢性病,因为这是一个不完整数据如何摧毁我们所有人的切实例子——我们需要纵向信息。每一份医生笔记、进展报告、出院总结,每一位医生、医院、紧急护理部门——你见过的任何提供者——提供的任何未解释的医学意见。全部拿走!明白了吗?好了,现在我们有 1000 页覆盖每个慢性病患者 15 年的数据(美国有 1.6 亿人),所以我们有 1600 亿页未分类的非结构化数据。让我们一起玩吧!
第二步——将所有内容提取到一个数据湖中:来自各个领域的医生领导聚集在一个巨大的仓库中,开始通读每一页,突出任何包含独特生物医学概念的句子(例如,症状、观察、程序、过敏、药物治疗等)。).这些句子按时间顺序为每个病人标记,创造了 1.6 亿个纵向叙述,这些叙述描述了每个病人的经历,而不是分类。现在,有了我们的病人经验库,我们可以进入最难的部分了。
步骤 3——将所有内容分解成离散的概念:将句子文本中的离散生物医学概念联系起来,并为每个元素分配一个代码,这需要使用四个关系向量来确定文本概念值。首先是词汇向量,它说明了同一术语的词汇变体(同义词)(例如呕吐=呕吐);第二个是字符串向量,它说明了单词的拼写/大小写的变化(例如,呕吐=呕吐);第三个是原子向量,它充当从字符串到医学中常用编码词汇(例如,ICD-10、CPT、SNOMED-CT 等)的链接。);第四个是概念向量,它作为“元向量”位于其他向量之上,允许离散的非结构化但相同的概念在单个结构化代码下相关联。对每个句子中的每个生物医学概念都这样做,并将结果代码连接成一串代码,从而为每个叙述带来结构。现在再做一亿六千万次。这是可能的。
恭喜你!你刚刚创建了一个完整信息的数据库——现在坐下来,输入机器学习算法,看着计算机教我们如何行医!
还记得第一步吗?这是它的样子。
20 年前,上述三个步骤甚至没有被考虑,因为这个问题仍然隐藏在我们推动高效药物的背后。10 年前,由于信息科学的局限性,这些步骤被认为是不可能的。现在,我们再也没有借口了。我们不能继续让我们积累的知识扼杀学习过程;我们必须利用我们所掌握的每一种工具来开发这一知识体系,从而创造出一条通向“医学智慧”的道路。
未能构建完整的信息意味着我们放弃了精确医疗和“编码人类”的梦想——我还没准备好认输,你呢?
matt sinder brand | matt@betterpath.com better path 公司联合创始人兼首席执行官
为什么木工会让你成为更好的程序员
原文:https://towardsdatascience.com/why-woodworking-will-make-you-a-better-coder-adb91cbcaafd?source=collection_archive---------10-----------------------
和木头一起工作很有趣。
专家的时代已经结束了。
许多技术专家认为擅长一件事就等于什么都不擅长;“二等于一,一等于零”。那些能够跨越多个学科的人——博学之士——将主宰商业的未来。随着技术以指数速度增长,新兴产业正在兴起,这是现有学科交叉融合的结果。区块链就是一个很好的例子。那些具有编码、加密和 web 开发背景的人发现自己处于构建当前最杰出的新兴技术的最佳位置。
我发现不同的爱好会导致意想不到的迁移学习。在下面的文章中,我分享了一个横向思维的例子;一个领域的技能如何影响另一个领域的学习和决策。
在一整天的数据科学之后,我在我的木工车间里修修补补。我经常来这个满是灰尘的避难所整理思绪。在制作了一整天的文件后,制作出一些触觉上的东西是令人耳目一新的,这些文件存在于服务器上的某个地方,遥不可及。和木头一起工作会让我进入状态,就像长距离慢跑一样。
正是在其中一次间隔会议期间,我意识到木工和编码是多么相似。用电脑搭建和用一套手工工具搭建没有太大区别。我思考得越多,就越意识到我小时候在木工车间学到的经验如何帮助我长大后写出更好的代码。请跟随我分享编码员应该考虑尝试木工的五个理由。
它会教你效用
出于需要,我开始写代码。我已经超越了 excel 的分析能力,并发现自己在 R 语言的浅滩上跋涉。
大多数人开始做木工也是这样;他们需要一个盒子来存放东西,或者一个咖啡桌来放咖啡。他们用干墙螺丝把一些松木板粘在一起,称之为好东西。代码也不例外——它是达到目的的功能手段。没有人为屏幕上的文字的美感编写代码,他们编写代码是为了做一些事情——尽管我承认熊猫语法是一种享受。我们努力编写尽可能简单的代码,以便我们的同事将来能够解码。一个系统越复杂,熵就越会把它撕裂。
设计
让我们看看设计中的实用性。有许多有趣的家具风格,但没有一个比得上 Shaker 家具的美丽简约。
Traditional Shaker Coffee Table
动摇者是一个再洗礼派教派,分散在 18 世纪和 19 世纪的新英格兰。他们以实用的家具、简单的生活和独身生活而闻名(这也是为什么今天没有摇摇乐)。如你所见,上面的作品线条简单,几乎没有装饰。它由结实耐用的硬木制成。
Chippendale Table
第二张桌子是奇彭代尔桌子的复制品,这是一种更高端的风格,受到上层阶级的青睐。这件作品风格化的雕刻,褶边和其他不必要的功能,没有增加它的实用性。
Aged Shaker End Table
Aged Chippendale Table
接下来的两张图片是夏克尔和奇彭代尔的原创作品,已经有几百年的历史了。如你所见,Shaker 的形状比奇彭代尔好得多。《时代》没有善待奇彭代尔,因为它使用了层压木皮,这是一张纸一样薄的木头,粘在下面的木头上。随着时间的推移,胶水会失去粘合力,贴面会卷曲脱落。Shakers 家不会用 10 英尺长的贞操带来接触单板,这就是为什么他们的家具像辛迪加的情景喜剧一样优雅地老化了。
模板
高效的编码人员尽可能使用模板。
木工也使用模板快速制作一致的作品。例如,如果我需要将四条桌腿切割成一定长度,如果我在横切锯上构建一个模板,我将获得更加一致和准确的结果,因此我不必测量和标记每条腿。木工使用的另一个技巧是“故事棒”。您只需在一根长木棒上标记每个测量值,而不是在整个项目中用卷尺重复标记测量值。然后,你可以把木棒放在木头上,转移尺寸,这样就不需要尺子和卷尺了。
Story Stick
在“懒惰”是一个积极含义的工作领域中,用最少的人力投入来构建程序是一种最佳实践。我已经为 EDA(探索性数据分析)建立了几个模板,我用它们来快速系统地分析新数据。
我很小的时候就意识到模板可以节省时间,让我更高效地制作家具。毫无疑问,这项技能在几年后转移到了我的日常工作中。
它会教你如何排除故障
在编写程序的整个过程中,为了解决一个大问题,你要解决许多小问题。在这种情况下,我将“问题”定义为独立的构建的一个方面。例如,要构建一个跟踪股票价格的 web 应用程序,开发人员必须解决许多小问题,比如建立数据库、API 提要、UI 等。在这一过程中,总是会出现需要解决的问题——要么是新颖的想法,要么是对堆栈溢出的随意回顾。
木工为你做好了完美的准备。由于许多木工项目都是定制的、新颖的想法,通常没有经过测试的蓝图来工作,所以建造者被迫在这个过程中为自己想出许多事情,例如从矩形胶合板上切割碎片的最佳方式,平衡碎片的美学效果或消除“抖动”。
Satisfying
它会教你如何自举
从创业或商业的角度来看,自举指的是在几乎没有资金或支持的情况下启动一个项目,“靠自己努力”。在测试和推出更复杂的产品之前,一个启动新应用的初创公司通常会花足够的钱来创建一个 MVP(最小可行产品)。在上述战略的过程中,开发的某些方面可能会以不太完美的方式与更便宜的部件放在一起。
在木工领域,由于一些原因,在实际构建开始之前,许多较大的项目首先与较便宜的材料和方法一起启动。第一,在使用昂贵的硬木之前,看看一个完成的工程实际上是什么样子是很重要的。顾客在看到他们面前的三维自助餐桌的商店草图后,也会经常改变主意。
第二,有机会在这个测试环境中构建项目会导致不可避免的看不见的错误出现。也许你计划在这个案例中使用的燕尾榫会分散你希望在面框中引起注意的装饰木材的注意力。无论如何,你邀请墨菲加入进来,让他的法律生效,这样你就可以在真正开始之前收拾残局。
除了这种原型自举,木工经常缺乏完成项目所需的确切材料,所以他们被迫即兴创作。黑樱桃是制作高级家具的主要硬木。由于其在自然界的相对稀缺性、较小的树干直径和市场需求,板脚的价格高于许多其他木材类型的价格。木工并不总是有资金用铜色木材制作椅子或厨房橱柜,所以他们会通过在便宜的木材如桦木上临时使用染料和油漆釉来启动这个项目。天然樱桃木和染色和上光桦木几乎无法区分。
Hipster Woodworker
它会教你进步
威廉·S·巴勒斯说过这样一句话:“如果你不成长,你就会死去。”在全球经济中,员工不仅要与本地的人才竞争,还要与世界各地的人才竞争,这句话应该是你的拿手好戏。你需要不断提高你现有的技能并学习新的东西。
将你的代码库或者 Git repo 按日期排序,看看你写的第一个程序。太可怕了,对吧?不注意折叠最佳实践,可能重复自己,甚至可能缺少一个注释。
如果你将这个计划与你最近的计划进行比较,你所取得的进步是显而易见的。您学习了如何正确编译项目。如何注释掉不明显的代码?你已经有意识地努力提高编码水平,你的工作得到了回报
作为一名程序员,我的进步很大程度上归功于我在木工车间培养的对专业知识的渴望。快乐的第一条规则是只把自己和过去的自己比较——而不是和其他人比较。当我在办公室里看着我的第一个木工项目时——一个用细钉子固定在一起的粗糙的紫心首饰盒——我能立刻看到我作为木工取得的进步。我开始用最简单的方法用木头制作东西:不加思索地用螺丝钉把便宜的木板钉在一起。我学会了比例、黄金比例和杆秤原理,我的作品开始看起来更加平衡。最终,我转向了常规的燕尾榫接头,这种接头比我年轻时用钉子固定的对接接头更牢固,也更有吸引力。
几乎在同一时间,我成长为一名程序员和木工。我现在用手工工具制作所有的关节,并尝试前卫的镶嵌和概念,掌握了常规设计。我的 R 程序也达到了一个完美的状态,允许我自由地试验更多“有趣”的概念。
这种对技能进步的关注对那些投入时间和精力在某个领域达到精通的人是有好处的。
它会教你逆向工作
你是先处理待办事项中最难的事情,还是把它们留到最后?马克·吐温说过,如果你早上第一件事就是吃一只活青蛙,那么一天中就不会有更糟的事情发生了。项目中总有一个方面——木材或代码——你知道会很棘手。如果你在困难的部分搞砸了,这个项目可能会失败。
我曾经做过一个项目,需要用手动刳刨机在时钟基座上塑造轮廓。刳刨机是一种高功率工具,以超过 15,000 转/分的速度旋转切割钻头;很容易在木头上犯难以修复的错误,以及在你的附属物上犯同样麻烦的错误。我知道这个切割会很困难,所以我拖延了一下,先把整个钟组装起来,把困难的切割留到最后。我最后用路由器切掉了底座的一角,不得不把整个钟拆开来修理,浪费了时间和金钱。最终,我学会了尽早做出那些艰难的削减,这使得以后的构建更加顺利。
在另一个混乱中,我为一个客户构建了一个完整的推荐引擎系统,后来才发现他们的系统不能以我准备的方式接受数据,浪费了他们和我的时间。这个错误改变了我处理数据项目的方式。我不是从前到后地工作——收集数据、构建 alg、将数据发送给客户端——而是在相反的方向工作。如果我不能把数据发给客户,为什么还要做 algs?如此等等。通过从后向前,从难到易的工作,你将能够更快地向前失败,并在更短的时间内完成更多的工作。
好的代码和伟大的代码之间的区别是显而易见的。我们都见过这样的代码。它从 Github 页面跳到你面前;它让你说,“我希望我想到了这一点。”dev 用来解决这个问题的方法非常简单。她找到了阻力最小的途径,并以一种既高效又耐用的方式执行了脚本。一件顶级的家具也有同样的特点。设计注重木材的美观,所以你甚至看不到木板是如何相互贴合的;看起来好像有人从树上取下一片放在房子里。构建家具和构建脚本在执行和目的上有天壤之别。
但是编码者和木工所使用的基本原理是非常相似的。我希望看到这篇文章的开发者拿起钉枪,在错误的木槌打击下弄几个血泡,并在木工方面进行交叉训练。它会把你的游戏带到一个全新的水平。
我可以根据合同提供数据咨询。邮箱
原载于 2018 年 7 月 11 日medium.com。
为什么你需要一个专业的数据科学导师,以及如何实际获得一个。
原文:https://towardsdatascience.com/why-you-need-a-professional-data-science-mentor-and-how-to-actually-get-one-d6b89f30df6d?source=collection_archive---------4-----------------------
我记得我第一次听说数据科学。
我刚刚获得了物理学硕士学位,我和我的老同学们正试图找出如何从学术界过渡到有偿职业。我们中的大多数人以前都没有申请过真正的工作,我们都想知道我们的新学位能带来什么样的工作。
幸运的是,那是 2013 年,数据科学仍处于蛮荒的西部阶段。这个领域太新了,以至于雇主们到处雇佣没有经验的 STEM 毕业生,因为他们没有其他选择。
那时,如果你有一个技术研究生学位,你可以温习一下你的 Python 技能,用 scikit-learn 项目填充一个小文件夹,并且或多或少地看着机会滚滚而来。我的很多同学都找到了满足他们求知欲的好工作,并支付了账单。
为什么不再那么容易了
如果你今天在数据科学就业市场呆过一段时间,你就会知道这种情况不再存在了。
仍然有很多关于对数据科学家需求飙升的头条新闻,但事实是现在比过去更难找到工作了。现在这个领域变得越来越成熟,公司对候选人的期望也越来越高。五年前,他们问的是决策树和朴素贝叶斯;现在他们假设你对 sk-learn 和 TensorFlow 了如指掌,他们问的是 devops 和 deployment。
我们已经多次看到同样的事情发生在我们通过 SharpestMinds 筛选的数百名候选人身上。事情发生变化的原因是,数据科学充斥着拥有基本技能和适度个人项目组合的人。因此,雇主可以对入门级的候选人吹毛求疵。
如今,当你刚开始工作时,想引起别人的注意并不容易。
到达那里需要什么
现在已经到了这样一个地步,你需要在数据科学就业市场中脱颖而出的技能非常难学,除非你得到了真正知道自己在做什么的人的指导。
为一个真正的应用程序构建产品代码与为一个 Kaggle 竞赛分类有毒评论,甚至完成一个纳米学位完全不是一回事:
- 生产代码必须是干净的。如果没有经验丰富的开发人员的参与,您如何知道您的代码是否干净?
- 生产代码必须由团队来构建。如果您的过程没有经过专业人员的审查,您如何知道您是否使用了最佳实践?
- 生产代码必须是健壮的。如果您不知道管道需要健壮地应对什么,您怎么能学会构建健壮的管道呢?
自己学习可以让你起步,但是从数据科学沙箱提升到行业就绪的生产代码真的需要有经验的开发人员的投入。
但你可能不认识愿意指导你的专业数据科学家或机器学习工程师。在你培养技能的过程中,你可能没有足够的资源来雇佣一个人和你一起工作。
那么,你怎样才能获得超越学士、硕士或纳米学位所需的专家帮助,并在 2018 年真正具备就业能力呢?
收入分享和指导
与专业开发人员一起工作的经历可以决定你是否有能力获得数据科学职位。在过去的 18 个月里,我在 SharpestMinds 的工作中一直专注于寻找让人们获得这种体验的方法。
我们尝试了许多不同的策略来激发专业开发人员和新手数据科学家之间的合作。我们发现的最佳策略被称为收入分成:基本上,有抱负的数据科学家在一个行业级项目上与一位专家导师合作,作为交换,他们向导师支付未来收入的一小部分(但只有在他们最终真正被聘用的情况下)。
收益分成有两个好处:第一,意味着你可以不需要前期成本就能获得专家指导。你只有在有能力的时候才付钱,如果你在一定期限内(通常是 24 个月)没有找到数据科学的工作,你根本不用付钱。
第二,收入分成与导师和学员的激励一致。即使在正式的导师期结束后,导师仍然与你未来的成功有利害关系,这意味着他们会默认为你寻找机会。
收入分享导师制为那些负担不起专家时间或寻找专业数据科学家进行学习的人提供了新的机会。
因为这是一种让人们在有限的风险下快速了解数据科学的惊人方式,我们刚刚推出了一个名为sharpes minds Mentorships的收入分享计划。这是有抱负的数据科学家和专业开发人员导师之间为期 8 至 12 周的合作,导师和学员通过收入共享协议一起工作。如果学员在与导师合作的两年内获得了数据科学职位,他们将返还第一年工资的一小部分。
如果你想注册我们的第一个正式批次,你可以在这里注册。
为什么你需要关注可解释的机器学习
原文:https://towardsdatascience.com/why-you-need-to-care-about-interpretable-machine-learning-58b45d332c08?source=collection_archive---------14-----------------------
机器学习(ML)模型正在进入现实世界的应用。
我们都听说过关于 ML 系统的新闻,比如信用评分系统 T1、T2、医疗保健系统 T3、T4、犯罪预测系统 T5。我们很容易预见一个由 ML 驱动的 社交评分系统。由于 ML 研究的快速发展和在受控实验中获得的巨大成果,越来越多的人现在似乎对统计模型统治我们生活重要部分的可能性持开放态度。
然而,大多数这样的系统被视为黑箱。产生简单是/否答案的晦涩难懂的数字计算机器;最多答案后面跟着一个不满意“信心百分比”。这通常是全面采用这种系统进行关键决策的一个障碍。
在医疗保健或贷款领域,专家不会检查庞大的数据库来找出复杂的关系。专家应用先前的教育和领域知识为给定的问题做出最佳决策。很有可能是基于数据分析的评估,甚至涉及自动化工具的帮助。但是,最终,这个决定是由一个合理的、可解释的推理支持的。这就是为什么拒绝贷款和医疗有动机。此外,这样的解释经常帮助我们判断一个好的专家和一个坏的专家。
我们大多数人倾向于拒绝接受看似武断的决定;理解决策的重要性是至关重要的。这篇优秀的文章描述了可解释 ML 系统的一些现实目标:
- 信任:对系统预测的信心
- 因果关系:有助于推断自然界的属性
- 概括:应对不稳定的环境
- 信息含量:包括关于决策过程的有用信息
- 公平和道德 决策:防止歧视性结果
很明显,社会关心可解释的机器学习。
我想更进一步:那些构建 ML 系统的人也应该关心可解释性。ML 从业者和工程师应该追求可解释性,作为建立更好模型的一种手段。
本文的目的并不是介绍可解释性工具和技术的细节以及如何应用它们。相反,我想提供一个为什么这样的工具对机器学习实践如此重要的愿景,并回顾几个我最喜欢的工具。
ML 系统(例如用于分类)被设计和优化为在海量数据中识别模式。建立一个能够发现输入变量和目标类别之间非常复杂的相关性的系统是非常容易的。结构化数据?扔个 XGBoost 给它。非结构化数据?某深网来救援!
典型的 ML 工作流包括探索数据、预处理特征、训练模型,然后验证模型并决定它是否准备好用于生产。如果没有,返回,通常为我们的分类器设计更好的特征。大多数时候,模型验证是基于预测能力的度量:例如,ROC 曲线下的区域通常是相当可靠的。
Fig. 1 — How model interpretation fits in the common ML workflow
然而,在模型构建过程中,许多设计决策可能会稍微改变模型。不仅仅是分类器的选择,而是每个预处理步骤中无数的决定。事实证明,给定一个非平凡的问题,有无数个具有高预测能力的模型,每一个都讲述了关于数据的一个完全不同的故事。有些故事可能就是错误的,尽管它们似乎适用于特定的数据集。
这被美其名曰 罗生门效应 。我们应该在生产中部署哪些模型来做出关键决策?是否应该一直取绝对 AUC 最高的模型?我们应该如何区分好的和坏的设计决策?
可解释的机器学习方法和工具帮助我们做出这个决定,更广泛地说,做 更好的模型验证。这不仅仅是简单地查看 AUC,而是要回答这样的问题:模型输出如何随每个特征的值而变化?这些关系是否符合人类直觉和/或领域知识?对于特定的观察,什么特征最重要?
我们可以粗略地将可解释性分为全局分析和局部分析。
全局分析方法将使您对特征和模型输出之间的关系有一个大致的了解。比如:房子大小如何影响未来三个月被卖出的几率?
局部分析方法将帮助你理解一个特定的决定。假设对于给定的贷款申请有很高的违约概率(未偿还)。通常,您想知道哪些特征导致模型将应用程序分类为高风险。
全局方法
对于全局分析,从使用部分依赖图和个体条件期望(ICE)开始。
部分相关图显示了给定不同特征值时某一类的概率。这是一种全局方法:它考虑了所有实例,并对某个特征与预测结果之间的全局关系进行了陈述。【演职员表:可解释机器学习
部分相关图让您了解模型如何响应特定特征。它可以显示目标和特征之间的关系是线性的、单调的还是更复杂的。例如,该图可以显示平方米对房价的单调增长影响(这很好)。或者你可以发现一个奇怪的情况,当花更多的钱对你的信用评分更好的时候——相信我,它发生了。
部分相关图是一种全局方法,因为它不关注特定实例,而是关注整体平均值。单个观察值的 PDP 的等价物被称为个体条件期望(ICE)图。ICE 图为每个实例绘制一条线,表示当特征改变时实例的预测如何改变。
Fig. 2 — Partial Dependence Plot (the bold line) with Individual Conditional Expectations. Credits: https://github.com/SauceCat/PDPbox
作为一个全局平均值,PDP 可能无法捕捉来自特征间交互的异质关系。用冰线来装备你的部分依赖图通常是好的,以获得更多的洞察力。
本地方法
最新的和最有前途的局部分析方法之一是 SHapley 加法解释 。它旨在回答问题为什么模型为一个实例做出那个特定的决定? SHAP 为每个特征分配一个特定预测的重要性值。
Fig. 3 — An example of SHAP values for Iris dataset. You can see how the petal length influences the classification much more than sepal length. Credits: https://github.com/slundberg/shap
在生产之前,您可以在测试环境中部署您的模型,并提交来自维持测试集的数据。为该测试集中的观察值计算 SHAP 值可以表示一个有趣的近似值,即要素将如何影响生产中的模型输出。在这种情况下,我强烈建议提取“过时”的测试集,也就是说,最近的观察结果就是维持数据。
从 ML 模型中得到的可解释的决策已经成为在现实世界中应用它们的重要需求。
在许多关键的 ML 应用中,解决方案一直是只考虑固有的可解释算法——例如线性模型。这些算法无法捕捉特定于训练数据集的细粒度模式,只能捕捉一般趋势。趋势很容易解释,并与领域知识和直觉相匹配。
可解释的工具为我们提供了另一种选择:使用强大的算法,让它捕捉任何模式,然后使用你的人类专业知识来删除不需要的模式。在所有可能的模型中,选择一个能正确描述数据的模型。
当您的训练模型产生可解释的结果时,您可以利用这种可解释性。上述工具的输出可以构成业务人员能够理解的简要报告。毕竟,你需要向你的老板解释为什么你的模型如此有效。可解释的模型可能会引导你的老板和所有利益相关者做出更好的商业决策。
结论
有时人们说,只有高度管制的应用中的 ML 从业者才应该关心可解释性。我认为相反:每个 ML 从业者都应该使用可解释性作为建立更好模型的额外工具。
感谢阅读。我喜欢你的反馈。
为什么你应该在下一个机器学习项目中绘制学习曲线
原文:https://towardsdatascience.com/why-you-should-be-plotting-learning-curves-in-your-next-machine-learning-project-221bae60c53?source=collection_archive---------1-----------------------
入门
剧透:它们会帮助你理解你的模型是高方差还是高偏差——我会解释你能做些什么
Image by author
偏差-方差困境是机器学习领域中一个广为人知的问题。它的重要性是这样的,如果你没有得到正确的权衡,你在你的模型上花多少时间或多少钱都没有用。
在上图中,您可以感受到什么是偏差和方差,以及它们如何影响您的模型性能。第一个图表显示了一个模型(蓝线),该模型对训练数据(红叉)拟合不足。这个模型是有偏差的,因为它“假定”自变量和因变量之间的关系是线性的,而事实并非如此。绘制数据散点图总是有帮助的,因为它将揭示变量之间的真实关系——二次函数将“恰好”符合数据(第二个图表)。第三个图表是过度拟合的明显例子。模型的高度复杂性使其能够非常精确地拟合数据——过于精确地拟合。尽管该模型在训练数据上可能表现得非常好,但是它在测试数据(即,它从未见过的数据)上的表现会差得多。换句话说,这种模型存在高方差,这意味着它不擅长对从未见过的数据进行预测。因为建立机器学习模型的要点是能够准确地对新数据进行预测,所以你应该专注于确保它能够很好地推广到看不见的观察结果,而不是最大化它在训练集上的性能。
如果你的模特表现不怎么样,你能怎么办?
您可以做几件事:
- 获取更多数据
- 尝试较小的功能集(降低模型复杂性)
- 尝试添加/创建更多功能(增加模型复杂性)
- 尝试降低正则化参数λ(增加模型复杂性)
- 尝试增加正则化参数λ(降低模型复杂性)
现在的问题是:“我如何知道这些事情中的哪一个应该首先尝试?”。答案是:“嗯,看情况。”。这基本上取决于你的模型是高偏差还是高方差。
你可能想知道,这里的问题是:“好吧,那么我的模型表现不如预期……但是我怎么知道它是有偏差问题还是有方差问题呢?!"。学习曲线!
学习曲线
学习曲线显示了训练集大小和您选择的评估指标(如 RMSE、准确度等)之间的关系。)在您的训练集和验证集上。在诊断您的模型性能时,它们可能是一个非常有用的工具,因为它们可以告诉您您的模型是否存在偏差或差异。
Image by author
如果你的学习曲线是这样的,这意味着你的模型有很大的偏差。训练和验证(或交叉验证)的错误都很高,并且似乎不会随着更多的训练示例而改善。事实上,您的模型在训练集和验证集的表现都很差,这表明该模型对数据拟合不足,因此具有较高的偏差。
Image by author
另一方面,如果你的学习曲线看起来像这样,你的模型可能有一个高方差的问题。在此图表中,验证误差远远高于训练误差,这表明您对数据进行了过度拟合。
如果你的模特表现不怎么样,你能怎么办?(pt。二)
很好,所以你现在已经确定了你的模型发生了什么,并且处于一个很好的位置来决定下一步做什么。
如果您的模型具有高偏差,您应该:
- 尝试添加/创建更多功能
- 尝试降低正则化参数λ
这两件事会增加模型的复杂性,因此有助于解决拟合不足的问题。
如果您的模型有很高的方差,您应该:
- 获取更多数据
- 尝试一组较小的功能
- 尝试增加正则化参数λ
当您的模型过度拟合训练数据时,您可以尝试降低其复杂性或获取更多数据。正如您在上面看到的,高方差模型的学习曲线图表明,有了足够的数据,验证和训练误差最终会彼此更接近。对此的一个直观解释是,如果你给你的模型更多的数据,你的模型的复杂度和你的数据中的底层复杂度之间的差距会越来越小。
Python 实现和实际例子
我编写了这个函数来绘制模型的学习曲线。在自己的工作中可以随意使用!
我想我应该以展示一个学习曲线图的真实例子来结束这篇文章,这个例子是用上面的代码创建的:
Image by author
从图中可以非常清楚地看出,我的随机森林模型正遭受高偏差,因为训练曲线和验证曲线非常接近,并且在 70%左右的标记处精度不是很高。了解这一点有助于我决定我的下一步是什么,以提高我的模型性能。因为我有一个高度偏见的问题,我知道获得更多的训练数据本身不会有帮助,通过设计新的和更相关的功能来增加我的模型的复杂性可能会产生最大的影响。
结论
下次你面前有一个表现不好的模型时,记得画出学习曲线,分析它们,找出你是否有偏差或方差问题。了解这一点将有助于你决定下一步应该做什么,它可以为你节省无数的头痛和浪费在对你的模型没有帮助的工作上的时间。
为什么你应该关心内特·西尔弗和纳西姆·塔勒布的推特之战
原文:https://towardsdatascience.com/why-you-should-care-about-the-nate-silver-vs-nassim-taleb-twitter-war-a581dce1f5fc?source=collection_archive---------0-----------------------
两个数据专家怎么会有这么大的分歧?
过去一个月,一场不为人知的争议再次浮出水面。定量分析社区的两个图标在最伟大的公共舞台 Twitter 上发生了冲突。你可能会被原谅没有跟踪这场争论:我将为门外汉做一个快速回顾。用于创建本文的所有代码和数据都可以从这个 Github Repo 中派生出来。
内特·西尔弗是538的联合创始人。一个非常受欢迎的专注于数据的博客,因其准确预测 2008 年美国大选的结果而闻名。Silver 使用一种聪明的民意调查汇总技术来生成预测,这种技术考虑到了偏见,例如民意调查者只给使用座机的人打电话。
作为一名训练有素的统计学家,通过经济学,他将自己对棒球(sabermetrics)和扑克分析的热情引入了政治领域。事实上,FiveThirtyEight 这个名字是对美国选举人票数(538 张)的认可。然而,博客也涵盖了其他兴趣领域,如体育。内特把他的博客卖给了 ESPN,并接受了主编的工作。他们(ESPN)利用它作为一个平台,向观众提供体育赛事的预测,FiveThirtyEight 后来搬到了美国广播公司。对他们网站的例行访问是政治和体育文章的混合,带有详细的预测和数据可视化。
Silver (left) in conversation with NY1’s Pat Kiernan
内特的预测能力已经成为大众媒体公认的标准。他是许多全国电视节目的常客,在每个全国选举周期讨论他的预测。因此,当畅销书作家、量化风险专家纳西姆·塔勒布(Nassim Taleb)公开宣布 FiveThirtyEight 不知道如何正确预测选举时,人们感到非常震惊!
对塔勒布来说,由于他对现实世界中概率的敏锐理解,他已经变得非常成功。他的书既有哲学的,也有技术的,重点是不确定性和风险。具体来说,他认为实践中使用的绝大多数定量模型都没有充分考虑到现实世界的风险。相反,它们给人一种短期价值的错觉(比如在一些很好理解的情况下是准确的),但当不知情的用户经历模型设计不理解的情况时,他们会面临巨大的系统风险。
Nassim Taleb
塔勒布之所以出名,部分是因为他通过暴露自己的财富将自己的哲学付诸实践。马尔科姆·格拉德威尔在《纽约客》上写了一篇文章,讲述了塔勒布是如何将他的风险哲学转化为一个极其成功的投资策略的。此后,他在不可预见的市场事件中获得了巨额财富,如黑色星期一、俄罗斯债务违约和 2008 年金融危机。塔勒布现在花很多时间写作和硬拉(我很嫉妒这一点)。他不羞于公开告诉别人他不同意他们的观点:内特·西尔弗就是其中之一。
Taleb’s Tweets directed at Silver November 2018
然而,西尔弗并没有屈服于这些侮辱!
Silver 和 Taleb 分别拥有 300 万和 30 万粉丝,在这些交易所中引起了巨大的轰动(从 2016 年开始)。然而,快速浏览评论线程,你会发现很少有人理解这些论点。甚至西尔弗自己似乎也被塔勒布的攻击弄得措手不及。
然而,我认为这是一个数据科学专业人员(或有抱负的专业人员)更深入挖掘所讲内容的绝佳机会。这对我们如何选择以可靠和可验证的方式建模和展示我们的工作有影响。你必须自己决定塔勒布是否有道理,或者只是一个有太多空闲时间的疯狂富人。
并非所有介于 0 和 1 之间的实数都是概率
围绕 FiveThirtyEight 预测的争议和困惑的主要来源是它们是“概率性的”。实际上,这意味着他们不预测赢家或输家,而是报告一种可能性。使问题更加复杂的是,这些预测被报告为点估计(有时带有模型隐含误差),远在事件发生之前。例如,在民意调查开始前六个月,这是他们对 2016 年总统选举的预测。
FiveThirtyEight Running Forecast of the 2016 Presidential Election
他们的预测过程是用专家知识(选举、体育赛事等)建立一个系统的定量复制品。)然后运行一个蒙特卡洛模拟。如果模型接近真实世界,模拟平均值可以可靠地用于概率陈述。所以 FiveThirtyEight 实际上说的是:
x%的时间我们的蒙特卡罗模拟导致了这个特殊的结果
问题是模型不是真实世界的完美复制品,事实上,在某些方面总是错误的。这种类型的模型构建允许在构建中有一定的主观性。例如,Silver 曾在许多场合表示,其他竞争模型没有正确纳入相关性。在描述建模方法时,他还清楚地表明它们会调整结果(比如基于事件发生前的时间人为增加方差或类似的调整)。这就产生了一个关于谁的模型是“最好的”或最像真实世界的无限递归的争论。当然,要判断这一点,你可以看看从长远来看谁表现得更好。这就是事情有点偏离轨道的地方。
因为 FiveThirtyEight 只预测概率,他们从来没有对结果采取绝对的立场:正如塔勒布所说的那样,没有“参与游戏”。然而,这不是他们的读者效仿的东西。在公众眼中,他们(FiveThirtyEight)是根据有多少预测概率高于和低于 50%的事件分别发生或没有发生(在二元设置中)来判断的。或者,他们(读者)只是选择最高的报道概率作为预期的预测。例如,当“在 2008 年总统竞选中正确说出 50 个州中的 49 个”之后,他们获得了大量的赞誉。内特·西尔弗被列入《时代周刊》100 位最有影响力的人名单 t。如果他没有在任何一个州说出获胜者,他就不应该接受这一荣誉!
公众未经询问就使用 50%规则是情有可原的。例如,在监督机器学习中,分类模型必须有一个称为“决策边界”的特征。这通常是先验决定的,并且是在模型被训练之后理解模型质量的基本部分。在这个界限之上,机器相信一件事,在这个界限之下则相反(在二进制的情况下)。
Example Decision Boundary in Classification Problems
对于标准模型,如逻辑回归,默认决策边界被假定为 50%(或 0 到 1 范围内的 0.5)或具有最高值的替代值。为分类而设计的经典神经网络通常使用 softmax 函数,这些函数就是以这种方式解释的。这是一个使用计算机视觉执行图像分类的卷积神经网络示例。甚至这个基本的人工智能模型也能做出决定。
Convolutional Neural Network with Decision Boundary Prediction
如果 FiveThirtyEight 没有规定的决策边界,那么很难知道他们的模型实际上有多好。由于隐含的决策边界,在 2008 年和 2012 年,随着水晶球般精确的陈词滥调,当他们被加冕并愉快地接受它时,这种困惑变得更加复杂。然而,当人们指责他们错了时,他们会回过头来说一句简单的俏皮话:
你就是不懂数学和概率。
通常这是 f 的后续报道,他们只报道了 x%,所以这意味着(1-x)%也可能发生。这是一个完美的场景。他们永远不会错!我们都应该如此幸运。当然,这种概率论证可能是有效的,但如果它看起来不真诚,就会引起一些焦虑。甚至《华盛顿邮报》也有一篇观点文章,在 2016 年选举期间发表了同样多的观点。
不清楚的是,FiveThirtyEight 读者隐藏了一个因素。预测有两种不确定性;偶然性和认知性。随机不确定性与基础系统有关(在标准骰子上掷出六点的概率)。认知不确定性与系统的不确定性有关(骰子有几个面?掷出 6 的概率是多少?).有了后者,你要去猜测博弈和胜负;像选举一样!
像 FiveThirtyEight 这样的定制模型只向公众报告偶然的不确定性,因为它涉及到它们的统计输出(在这种情况下由蒙特卡洛进行推断)。麻烦在于认知的不确定性很难(有时不可能)估计。例如,为什么 FiveThirtyEight 的模型没有在事情发生之前,考虑到科米可能会重新调查克林顿的电子邮件?相反,这似乎导致了预测变异的巨大峰值。可能是因为这个事件无法预测。
相反,认识论上的不确定事件被先验地忽略,然后 FiveThirtyEight 假设来自不可预见事件的预测中的剧烈波动是预测的正常部分。这应该让我们问‘如果模型忽略了一些最重要的不确定性,我们真的得到了一个可靠的概率吗?’
为了进一步扩展这一点,我已经综合了 FiveThirtyEight 的一些预测,使用他们的开源数据,针对两种非常不同类型的事件;美国参议院选举和国家橄榄球联盟(NFL)比赛。这里是对最终预测概率和实际结果比例的比较。
Stated Probabilities Compared with Average Portions
体育数据(NFL 比赛)具有极好的线性关系。这些比例是使用 30K 个数据点构建的,因此,如果我们假设系统是稳定的,我们已经平均掉了任何采样误差。然而,正如你所看到的,实际比例与预测值仍有 2-5%的显著差异。这是未解决的认知不确定性的信号。这也意味着你不能轻信这些预测概率。
体育运动,像其他碰运气的游戏一样,有着非常明确的机制,这些机制有助于进行统计分析。另一方面,高度非线性的事件,如有争议的选举,可能不会。通过更少的数据点,你可以看到参议院预测的变化是巨大的。衡量模型在这类事件上的表现变得加倍困难。还不清楚一个预测是错误的,是由于模型的质量(认知的)还是仅仅是运气(偶然的)。
这种预测方法最令人不安的一点是,它打开了叙事谬误的潘多拉魔盒。克林顿为什么会输?科米?电子邮件服务器?然后,人们可以通过目测预测变化周围发生的事件来证明可能的虚假推断。看看天气预报是如何变化的吧,所有这些新闻!
我想这就是塔勒布竭力反对的原因。这个博客给人的感觉更像是一个圆滑的推销,充斥着量化的流行词汇,而不是不带偏见的分析(尽管它很可能是)。如果一个预测不符合一些基本特征,它就不应该作为一种可能性被推销。更重要的是,一个预测应该从发布给公众的时候就开始判断,而不仅仅是在事件发生之前。预测者应该对偶然性和认知性的不确定性负责。
从这个角度来看,很明显 FiveThirtyEight 报告了导致事件的过多噪音,而没有足够的信号。这对于驱使用户阅读同一主题的一长串相关文章来说是很棒的,但并没有严格到可以赌上你的财富。塔勒布和西尔弗对 FiveThirtyEight 应该如何判断的看法可以这样形象化。
Taleb vs. Silvers Different Take On How FiveThirtyEight Should be Judged in 2016
因为像选举这样的非线性事件有太多的不确定性,所以报告早期预测可能被合理地认为是轻率的。这样做的唯一可能的原因是捕捉(并货币化?)渴望知道未来的公众的兴趣。我不会深入讨论技术问题,Taleb 已经撰写并发表了一篇关于关键问题的论文,并给出了解决方案。
这里我们可以有把握地说,538 次预测并不总是可靠的概率。然而,它们伪装成 1,介于 0 和 1 之间。这是塔勒布的主要论点;FiveThirtyEight 的预测不像包含所有不确定性的概率那样表现,也不应该被当作概率。
我不想暗示五三八在他们的手艺上是糟糕的。他们可能是业内最好的民意调查聚合者。如果我们只看最近报道的概率预测,并使用公众的决策边界,他们比任何其他试图完成相同任务的来源都更成功。然而,无论结果如何,都要让自己看起来正确,让用户推断自己的决策界限,过度报告预测,以及忽略认知的不确定性,这些都不应该被忽视。FiveThirtyEight 的声誉如何,数据社区的声誉也如何。
明确你建议的决策界限、概率陈述、关于不确定性的假设,你就不太可能误导利益相关者。
所有代码和数据都可以从这个 Github repo 中派生出来。
在 LinkedIn 上关注我:【https://www.linkedin.com/in/isaacfaber/
为什么您现在应该熟悉数据
原文:https://towardsdatascience.com/why-you-should-familiarize-with-data-today-958db7979e64?source=collection_archive---------24-----------------------
跟踪和处理不断增长的数据的能力正在改变我们对世界和万物的认知。数据,尤其是“大数据”,影响着我们的日常生活——工作、政治、医疗保健、锻炼、购物……主要与机器学习、深度学习、预测分析或 AI(人工智能)等时髦词汇结合在一起。
朋友和家人问我为什么对这个话题感到兴奋,为什么要在这个特殊的学科上做硕士。我的回答总是一样的:我们不能逃避。有无穷无尽的“数据”机会,但也有严重的风险因素。没有人必须研究这个话题——但是理解要点是不可避免的。在下面你可以找到我的三大理由 为什么我认为每个人都应该理解当今世界“数据” 背后的原理。不要期待一篇只有极客才能理解的技术文章——期待一些你钻研这个话题的动力。
后果。 数据只是信息的另一种说法。但在计算方面,数据通常是指机器可读的信息——无论是结构化数据还是非结构化数据。通过技术进步,特别是所谓的“使能技术”的进步,例如计算能力、互连性、廉价数据存储等的大量增加,使用这些信息的可能性比以往任何时候都多。正如我们所知,这个世界上并不是每个人都将整体福祉列在议程的首位,有很多机会可以通过数据的力量操纵或控制我们。
“Social Credit” China
例如,中国将会或者已经部分实施了他们的“社会信用”系统。这是怎么回事?每个公民都有信用,他可以收集,当然也可以失去。因此,大量的数据被处理和组合——来自政府记录等来源的大数据,包括教育和医疗、安全评估和财务记录,将被输入到个人得分中,并与来自您自己设备的数据相结合。
现在人们可以说——太好了!一切都将更加安全,“好”公民将获得更多特权,并获得他们所赚取的。但是谁来定义好公民呢?完全正确:为评分设置指标的人。对系统持批评态度的人会直接得分很低。他将不会被纳入社会福利,甚至可能不会被纳入他通常的社会群体,因为其他人也担心得分低。现在我们有了:通过数据的反乌托邦独裁。
但是在收集数据的时候,不仅仅是坏的事情。让我们以医疗保健中的大数据为例:如今,医学研究人员可以访问大量关于癌症患者治疗计划和康复率的数据。这使得医生在制定治疗计划和给患者用药时能够做出更好的决定。收集的数据越多,链接到其他数据库的数据越多,产生的见解就越多。现在让我们进入下一个阶段:更多的训练数据,为人工智能处理和准备数据的能力允许医生部分自动化诊断过程。医生不必害怕——这并不意味着他/她会丢掉工作。这意味着比以往更多的人可以接受治疗。没有足够的钱来支付这种诊断的病人可以得到治疗。并且额外的资源将被释放用于更困难的或单独的程序。这是一个转变整个医疗保健行业治疗流程的巨大机遇。
上面的两个例子都表明,如何使用数据有不同的选择。不管这种力量是出于善意还是恶意,最重要的是理解每个选项背后的基本原理和后果。作为普通公民,你不必成为人工智能、人工智能、深度学习、神经网络等领域的专家。但是你有责任了解你的数据是用来做什么的,会有什么后果。
数据是你生活的一部分。
大数据影响着我们的日常生活。术语“大数据”描述的是大型数据集的集合,其规模如此之大,以至于您无法使用普通的数据库系统来处理、分析、挖掘或生成见解。数据的增长是巨大的。假设存储的所有数据中有 90%是在过去两年中产生的。但是,让我们开始一段简短的旅程,看看我们每个人是如何遇到大数据的:
从家里开始。通过智能恒温器和电表,我们每天都能在家中省钱。通过识别个人行为,我们的能源消耗得到了优化和大幅降低。但不仅仅是能源消耗变得智能,我们完整的家也可以变得“智能”。一切都是连接的(你肯定听说过 IoT——物联网),并在设备之间和设备与制造商之间发送数据。在你的咖啡机坏之前,制造商已经联系了你,所以你可以像往常一样继续享用你的拿铁咖啡。
开车去上班时,您的汽车已经有了最新的交通数据。你会注意到提供的方向越来越好,越来越详细,有自行车和公共交通的选择。更令人兴奋的是,它可以告诉你是否会遇到交通堵塞,这不是因为有人观察到了交通堵塞,而是因为经过这一路段的汽车群正在报告交通堵塞。虽然你仍然可以自己驾驶汽车,但传感器可以识别街道上你周围的一切,并在你的汽车中处理这些数据。如果有人一个小孩跳到你的车前,车会比你更快地坏掉。在工作中,你不必再做任何重复性的工作。一个智能助手正在安排你的会议( x.ai ),让你知道你必须在什么时间去哪里。下班后,你的健康跟踪器建议你做一些运动,因为你今天没有做足够的运动(顺便说一下,69%的美国人跟踪他们的健康数据)。在一天结束的时候,你可以坐在沙发上看一部令人惊叹的网飞系列片——这是在收集的行为用户数据的帮助下,以你真正喜欢的方式制作的。
在提出所有这些简单的例子时,信息如下:没有人能够再隐藏数据使用。它是我们日常生活的一部分,我们想不想用它不再完全是我们的决定。因此,还有什么比挖掘对你的日常生活有如此巨大影响的事物更好的动力呢?
决策优势。 35.000——这是我们每天有意识和无意识做出的决定的数量。有些比其他的更重要。丹尼尔·卡内曼分享了他关于做出重要决定的建议:“你应该放慢脚步,从某个特定的人那里获得建议。一个喜欢你,但不太在乎你感受的人。那个人更有可能给你好的建议。” *
但是还有什么在影响我们的“重要”决定呢?那些我们放慢脚步的决定,那些我们花了很多时间去做的决定,不管是私人的还是商业的。F 关于决策的行为者在科学研究中已经比在这篇博文中被更好地指明。但为了说明我的观点,让我们简单地将影响因素分为内部和外部两类:
- 内部因素或个人特征:以前的经历、个人背景、价值观、风险、兴趣、哲学、偏见(尤其是不同形式的认知偏见)等等。
- 外部影响和形势:在什么时候做出决定。决策者在什么地方。围绕在决策者身边的人。
现在让我们把这些影响因素放在决策的基础上:事实。内部和外部因素使个人总是做出不同的决定,但事实和实际信息这一参数既不能改变也不能忽略。它让我们可以选择更客观地调整决策过程
如前所述,数据是一种信息形式。如果个人、企业主或任何类型的群体能够在技术的帮助下访问和处理越来越多的数据,并根据有见地和更完整的信息采取行动,结论很简单:信息越多,决策就越全面。无论你在哪个领域,为自己使用这种可能性,应该有足够的动力去理解用于它的数据的基本概念。
现在该怎么办?
在那篇文章的结尾,希望你对进入数据领域感到非常兴奋,并了解它对你、你的企业、你的朋友,...但是现在如何入门呢?
现实一点,你不必为了简单地学习基础知识而去读硕士或类似的课程。更重要的是,你已经阅读了这篇文章,它让你思考数据。所以问问你自己:
- 数据对你和你的同伴有什么影响?
- 你想用数据做什么?您希望在哪里贡献您的数据?
你对数据反思的越多,问题就会出现的越多。最后,你对它在政治、法规和自由数据流方面的需求有自己的看法和理解。
期待在评论中听到您的反馈,或者给我发邮件至 florian@investory.io。
另一篇你可能喜欢的文章:
结合定性&定量数据分析你的产品粘性
为什么您应该忽略数据科学绩效评估
原文:https://towardsdatascience.com/why-you-should-ignore-data-science-performance-measures-785e9b56e941?source=collection_archive---------4-----------------------
Picture by Peter Belch, CC0
上周,我拜访了一位客户,向他展示了我的分析。我显示的 AUC 是 0.92。印象深刻,嗯?
你不知道我在说什么?太好了——你不需要。有一堆数据科学性能指标。AUC、AUPRC、F-Measure、R-Squared、RMSE、精确度等等等等。在现实生活中他们都不会帮到你。你应该简单地忽略它们。
优化你真正想要的
如果做行业内的数据科学项目,你对什么感兴趣?收入?延迟时间?那么你为什么不对此进行优化呢?每个数据科学项目都应该针对其目标价值进行优化。在最好的情况下,数据科学绩效评估只能代表您的真实目标。分类比较正确当然好。当然,确保预测和目标变量之间的良好相关性是很好的。但这只是一个代理,而不是主要目标。
为什么它会对您优化的内容产生巨大影响
先说一个简单的例子。您的目标是减少银行账户的流失,包括个人账户和企业账户。你可以想象有几种类型的客户流失者。
可能会有学生、工人,也可能会有初创企业和更大的公司流失。简单地以最准确为目标是好的,但是我们通过为学生预测它来产生多少收入呢?没那么多。中型公司呢?我想会更多。\ n * *因此,我们的绩效指标以及优化方案应该考虑每个客户的收入,并更多地关注大客户。**找到更少的产生更多平均收入的搅动者可能比简单地找到尽可能多的人更好。
为什么您应该投资数据仓库&标签管理系统,或者 CRM 系统的日子是有限的
原文:https://towardsdatascience.com/why-you-should-invest-in-a-data-warehouse-a-tag-management-system-or-the-days-of-crm-systems-25ee4cc4c4cc?source=collection_archive---------1-----------------------
处理度量是一件具有挑战性的事情。提出一项措施计划是一回事。想出一个追踪系统是另一件事。谷歌在 2015 年 10 月初推出了它的标签管理系统,然而…在这篇文章中,我想从两方面谈谈标签的总体需求。客户端和数据仓库端
客户端和数据仓库端的区别
客户端
如果说到客户端,我说的是真正的客户端交互。在浏览器中。如果要进行跟踪,服务器端是其中的一部分。这只是达到目的的一种手段,但本质上它归结为跟踪你的平台上的客户端的交互,不管那可能是什么。你可以说,就其最纯粹的形式而言,CRM 在某种程度上也在跟踪客户端交互:
- 客户发送了一封电子邮件
- 给潜在客户打了一个电话
- …
像 hubspot 或 intercom.io 正在做的事情。一种数字化的第一客户关系管理,基于你平台上的标签页面和互动。
因此,本质上,他们是一个工具,内置了灵活但精细的标签管理系统,仅用于他们的产品。
如果你愿意,Intercom.io 可以让你走得更远,但这不是它的目的。你必须在对讲机上定制,以充分利用标记功能。所以…不行。你最好投资一个标签管理系统。
在网站上,它会得到这些互动的形式:
- 一个访问者点击了一个按钮
- 一名游客填写了联系表格
- 一个登录的客户下载了手册
- …
非常简单明了,对吗?
专注于客户端交互的标签管理系统提供了一种控制、注入和构建代码或部分代码的方式来衡量这些交互。
客户端集中的标签管理系统
外面有一些。最著名的可能是谷歌标签管理器,因为它有一个大型的分布式分析平台作为基础:谷歌分析。还有一个,GTM (Google Tag Manager)出来之前我一直在用的是量子位的 Open Tag 。同样的想法,有点不同的工作方式,但本质上是一样的:一个系统,把代码和脚本跟踪在你的网站上的某个地方。如果涉及到微标记某些东西(点击按钮等),GTM 有更多的功能。)
例如,Tealium 是另一个标签管理系统。我还没有用过它,但我认为它可能是市场上最有趣的独立标签管理系统。
数据仓库方面
我们这里不是在讨论互动。我们在这里讨论的是事务性数据和细分。完全不同的东西。为了实现良好的营销执行,你需要一个系统来标记你的细分市场:
- 客户细分级别的标签(行为和偏好类型,而非人物角色!)
- 产品细分级别上的标签(排序)
- 行为细分级别上的标签(搜索和阶段)
CRM 系统不是标签管理系统
很多人把 CRM 和标签管理系统混淆了。CRM 是一个客户关系管理系统,这意味着它存储了潜在客户的一些数据(主要是社会和人口统计数据),并将它们放在从潜在客户到客户的漏斗中,以便更容易跟踪销售过程。
别忘了,客户关系管理是一种销售工具。它告诉你有多少线索进来,有多少客户出去。
标签管理系统是一个系统,您可以在其中标记交互以及潜在的潜在客户或潜在客户的状态。这是可能的。它能做的不仅仅是 CRM 系统。它可以进行行为分析,这是 CRM 做不到的。像 hubspot 这样的混合动力系统可以,但在我看来,我认为 hubspot 并没有那么好。这是最基本的。太简单了。做精就够好了。推动成长不够专业。如果你想深入研究,它缺乏灵活性。部分原因是你有义务在 hubspot 平台上建立你的网站。
跳过或放松 CRM &建立一个数据仓库,并在其上建立一个好的标签管理系统。
你需要的是两全其美
你需要这两者来获得最好的洞察力来指导你的营销执行计划和营销情报。其实不需要 CRM 系统。你只需要一个数据仓库&一个好的标签管理系统。剩下的就是过程&你团队里一帮聪明的男生/女生。
CRM 只是一个可视化这个过程的工具&跟踪销售。使用仪表板工具挖掘您的数据实际上是同样的事情。传统 CRM 系统的时代已经结束。真的,他们是。
原载于driesbultynck.com。
为什么你不应该连续编码 30 个小时
原文:https://towardsdatascience.com/why-you-should-not-code-30-hours-in-a-row-a3a471301826?source=collection_archive---------17-----------------------
First place prize of the last year, but believe me, it looks the same each year 😃 (photo source: DSG FB group)
9 月的最后一周,我参加了 2018 年数据科学比赛(DSG)的决赛,这是最著名的致力于机器学习和数据科学的天才学生国际比赛。今年,来自世界各地的 26 支队伍来到巴黎挑战自我。这项赛事的任务始终是一场类似卡格尔的比赛,但时间有限:参赛者只有 30 个小时来取得最好的成绩。
我和我的团队代表芬兰参加了这次活动。在 DSG 历史上,芬兰第一次进入了 DSG 的决赛,并进入了前 10 名的决赛排行榜。这篇文章将是关于比赛的任务,我们在比赛中面临的挑战,我们的解决方案的描述,以及我们在 30 小时的编码冲刺中学到了什么。
任务和数据
这项任务是由法国电子商务网站 Cdiscount 承担的,该网站提供广泛的产品:包括文化用品、高科技、IT、家用电器、个人电器和食品等多种产品。Cdiscount 向竞争对手提供了一个由导航跟踪元素组成的数据集,以及一个描述产品类别层次结构的数据集。
考虑到用户的隐私,Cdiscount 主动在没有任何用户身份的情况下将挑战置于会话级别。因此,所有类型的个人数据都已从数据集中删除。此外,所有与产品相关的信息都已加密,以确保所有参与者(讲法语的人和其他人)之间的公平。
Description of provided data
我们被要求预测在最后一次观察和会话结束之间发生购买行为的概率(对于给定用户,会话被定义为一系列事件,当两个连续事件之间的时间超过 30 分钟时,会话结束)。这个任务是一个二元分类,竞争的度量——对数损失。
The illustration shows how the target was built
我们的解决方案
在比赛开始时,组织者提供了三个数据集:训练、测试和产品的层次结构。最后一个有点问题,组织者正在试图在活动期间修复它;所以,我们决定完全不用它。训练数据集由 130 万行组成,代表大约 13 万个会话。在测试中,我们有关于 90k 个会话的信息。因此,类别是不平衡的:在 train 数据集中呈现的所有会话中,只有 9.4%导致购买。
这项任务相当困难,原因有很多:建议的数据集相当原始(如果没有一些预处理,我们无法运行简单的拟合预测),每个会话都包含一个序列组件(数据的本质是用户的动作序列),绝大多数特征都是匿名的。然而,我们以前也面临过类似的情况;所以,我们知道该怎么做。数据集由几种类型的要素组成,这就是我们以不同方式处理它们的原因。我们来详细讨论一下。
时间特征
Duration
是数据集中唯一的时间特征。它显示了从会话开始到打开当前页面之间的时间。绝对值对模型没有意义;因此,我们决定计算用户在当前页面和前一个页面上花了多少时间。然后,我们像处理数字特征一样处理这两个特征。
字符串特征
这次比赛有很多弦乐特色。它们代表不同的东西:一种页面类型(和一种简化的页面类型)、页面上或用户购物篮中各种商品的 id、用户使用的过滤器、转盘 id、搜索行和站点 id。
处理这些功能最常见的方法是将它们组合在一起,像处理文本功能一样处理它们(准确地说,使用 NLP 任务中常用的工具)。我们对每个会话的连接字符串执行 TF-IDF 或计数矢量器;在这种情况下,“or”意味着我们为每个字符串列选择了一种策略(不是同时选择两种策略)。当我们处理多个模型时,我们测试了预处理的各种组合。此外,我们对每个模型使用了不同的 TF-IDF 超参数集和计数矢量器。我们这样做主要是因为我们希望我们的模型给我们不同的预测(即,在不同地方“出错”的模型),以便我们可以在以后堆叠或混合它。
此外,我们从这些字符串中提取了一些数字特征:每个用户的每列的值的数量,每个用户的每个字符串列的唯一值的数量,等等。
分类特征
我们决定获取每个字符串列中最频繁出现的值,并像处理分类特征一样处理它。更重要的是,我们以一个类别的形式添加了 first、first two、last 和 last 两个动作。
我们使用了几种策略来处理分类特征:标签编码、一个热点编码和均值编码。许多团队使用均值贝叶斯编码(参见ka ggle 内核以更好地理解这个想法),它试图对罕见类别的概率进行正则化。根据我的经验,这不是执行均值编码的最佳方式。正确的方法如下:我们将训练数据集分成k
个折叠,k-th
个折叠将用于验证,而k-1
个折叠将用于计算该类别所有级别的平均目标,并转移到测试数据集和验证部分。然后将k-1
褶皱分成t
褶皱,重复同样的操作(k
和t
—有些数字,我们用了k=10
、t=5
)。使用这种策略,我们不需要任何类型的正则化;我们经常取得更好的成绩。然而,这种方法需要更多的计算时间。
The concept of mean encoding: classes will become more separable with it
数字特征
在这场竞赛中,处理数字特征的最佳方式是通过sid
和一些分类列进行聚合,然后计算一些统计数据:
import pandas as pd
import numpy as np
from scipy import statscat_columns_list = """ all cat columns """
num_columns_list = """ all numberical columns """
# nearly all sids contained at least one NaN in each numerical feature
functions_dict = {
'max': np.nanmax,
'min': np.nanmin,
'ptp': lambda x: np.nanmax(x) - np.nanmin(x),
'mean': np.nanmean,
'std': np.nanstd,
'mean_div_std': lambda x: np.nanmean(x) / (np.nanstd(x) + 1) # std==0 sometimes
'median': np.nanmedian,
'skew': lambda x: stats.skew(x, nan_policy='omit')
}num_features_dfs = []
for cc in cat_columns_list:
for fc in num_columns_list:
for fnc_d in functions_dict:
fnc_f = fnc_d.keys()
fnc_name = d.values()
grb_df = df[['sid'] + cc + fc].groupby(['sid'] + cc).agg(fnc_f).reset_index()
new_col_name = fc + 'l_grouped_by_' + cc + 'l_agg_' + fnc_name
grb_df = grb_df.rename({fc: new_col_name}, axis=1)
piv_df = grb_df.pivot(index = 'sid', columns = cc, values = new_col_name)
num_features_dfs.append(piv_df)
序列预测特征
如上所述,每个会话的数据包含页面序列和用户的一些操作(进行搜索、添加过滤器或放入购物篮,等等)。处理这些序列最常见的方法是使用 RNN 或 LSTM 模型来预测目标变量,但我们没有这样做。我们认为,由于每个会话的长度不同(从页数和每页花费的时间来看),这些模型给我们的分数很低(免责声明:我们是对的;试用这些模型的竞争对手报告说这种方法得分很低)。
为了捕捉数据的序列性质,我们做了一件完全不同的事情。对于每个会话,我们都知道他访问过的某类页面的顺序。我们制作了一个预测下一页的模型,给出了前n
页的信息(我们尝试了不同的n
,n=3
根据我们的验证分数是最好的一个)。我们将训练和测试数据集结合在一起,并为会话进行了 OOF(分组折叠策略)预测;然后,我们计算了每次预测的准确性。这个特性用于预测目标变量——用户是否会购买某样东西。最后,这个特性是最重要的特性之一。
The illustration of the new feature distribution
模型
我们试图在这场比赛中使用前馈神经网络,但它们给我们的分数比基于树的模型更差。我们采用了一个具有l
层和每层中的n
神经元的网络(我们尝试了l
和n
的不同值,使用以下参数获得了最佳结果:l=6
和n=256
,但仍然太差而无法工作)。对于分类特征,我们尝试了 OHE 和嵌入层。在每一层之后,我们使用了一个脱落层。事后,其他参与者告诉我们,NN 在这项任务中帮助不大。
在我们的最终解决方案中,我们在各种特征子集上训练了几个基于树的模型(使用了不同的预处理策略)。我们使用 CatBoost 和 LightGBM 以及我们自己调整的超参数。XGBoost 训练很慢,最后我们没有太多时间;所以,我们没有使用它。根据公共排行榜和验证的加权分数,我们最终提交的是最佳模型的前 5 名:
w_score = (log_loss_public * n_samples_public + log_loss_cv * n_samples_cv) / (n_samples_public + n_samples_cv)
经验教训和成果
在大部分比赛时间里,我们都在公共排行榜的前 1-前 5 名,但有些地方出了问题。我们连续工作了 30 个小时,只睡了 1.5 个小时,这显然是我们的失误。临近截止日期时,我们感到极度疲劳,无法做到最好:我们的想法变得肤浅,我们在代码中犯了几个错误。最终,我们被那些决定花时间在床上,而不是在显示器前的团队,或者那些采用 2 乘 2 方案的团队打败了:两个在睡觉,两个在工作。我认为这是我们的主要错误,也是我们最终排名第八的主要原因。由于一个战略错误,我们失去了所有的战术优势。
下次,我们会更加注意时间管理。
Final leaderboard
然而,我对结果很满意。我第一次参加数据科学比赛,但是有几个团队,他们参加了两次。我们面临的挑战是艰巨的,但我们没有放弃。最后,它让我们变得更强大:就我个人而言,我发现了许多可以改善我的机器学习竞赛管道的领域(强大的特征工程,预处理期间的多信息输出)和许多新想法,我可以在即将到来的挑战中尝试新数据(主要与特征选择相关)。
最后,我要感谢这次盛会的所有组织者;感谢微软在 Azure 上的免费积分和一个有趣任务的 Cdiscount。特别感谢所有参加 DSG 2018 的人,没有如此强大的竞争对手,参加就没意思了。
这是一场精彩的战斗。我会尽我所能参加数据科学游戏 2019。
Our team: Dmitrii Mikheev, Denis Vorotyntsev, Margarita Pirumyan, Nikita Ashikhmin
更多关于 DSG 的信息:数据科学游戏网站
附注:根据 NDA 政策,我既不能发布数据也不能发布代码:(
为什么你应该开始使用。npy 文件更频繁…
原文:https://towardsdatascience.com/why-you-should-start-using-npy-file-more-often-df2a13cc0161?source=collection_archive---------1-----------------------
数据科学/机器学习需要数据的快速计算和转换。Python 中的原生 NumPy 对象提供了优于常规编程对象的优势。它的工作就像从磁盘上的文件中读取数字数据集一样简单。我们用几行代码展示了它的优势。
介绍
N umpy,简称数值 Python ,是 Python 生态系统中高性能科学计算和数据分析所需的基础包。它是几乎所有高级工具如熊猫和 scikit-learn 的基础。 TensorFlow 使用 NumPy 数组作为基本的构建模块,在此基础上他们构建了用于深度学习任务的张量对象和 graphflow(在长列表/向量/数字矩阵上大量使用线性代数运算)。
已经有很多文章展示了 Numpy 数组相对于普通 Python 列表的优势。在数据科学、机器学习和 Python 社区中,您会经常遇到这样的断言:Numpy 的速度要快得多,这是因为它的矢量化实现以及它的许多核心例程都是用 C 语言编写的(基于 CPython 框架)。这确实是真的(这篇文章很好地展示了使用 Numpy 可以使用的各种选项,甚至可以使用 Numpy APIs 编写基本的 C 例程)。Numpy 数组是同构类型的密集数组。相反,Python 列表是指向对象的指针数组,即使它们都是同一类型。你得到了参考位置的好处。
在我的一篇被大量引用的关于走向数据科学平台 的文章中,我展示了使用 Numpy 向量化操作相对于传统编程结构(如 for-loop )的优势。
然而,不太为人所知的是,当涉及到从本地(或网络)磁盘存储中重复读取相同数据时, Numpy 提供了另一个名为。npy 文件格式。这种文件格式使得的阅读速度比从纯文本或 CSV 文件中阅读快得多。
问题是——当然,您第一次必须以传统方式读取数据,并创建一个内存中的 NumPy ndarray
对象。但是如果您使用同一个 CSV 文件来重复读取相同的数字数据集,那么将ndarray
存储在npy
文件中,而不是从原始 CSV 文件中一遍又一遍地读取它,这是非常有意义的。
这是什么?NPY 文件?
这是一种标准的二进制文件格式,用于在磁盘上保存单个任意的 NumPy 数组。该格式存储了正确重建数组所需的所有形状和数据类型信息,即使在另一台具有不同体系结构的计算机上也是如此。在实现其有限目标的同时,格式被设计得尽可能简单。该实现是纯 Python 的,并作为主 NumPy 包的一部分分发。
该格式必须能够:
- 表示所有 NumPy 数组,包括嵌套的记录数组和对象数组。
- 以本机二进制形式表示数据。
- 包含在一个文件中。
- 在不同架构的机器上存储重建数组所需的所有信息,包括形状和数据类型。小端和大端数组都必须得到支持,具有小端编号的文件将在任何读取该文件的机器上生成小端数组。这些类型必须根据它们的实际大小来描述。例如,如果具有 64 位 C“long int”的机器写出具有“long int”的数组,则具有 32 位 C“long int”的读取机器将产生具有 64 位整数的数组。
- 被逆向工程。数据集通常比创建它们的程序存在的时间更长。一个有能力的开发人员应该能够用他喜欢的编程语言创建一个解决方案,来阅读他得到的没有多少文档的大多数 NPY 文件。
- 允许数据的内存映射。
使用简单代码进行演示
和往常一样,你可以从我的 Github 库下载样板代码笔记本。这里我展示了基本的代码片段。
首先,读取列表中的 CSV 文件并将其转换为 ndarray 的常用方法。
import numpy as np
import time**# 1 million samples**
n_samples=1000000**# Write random floating point numbers as string on a local CSV file**
with open('fdata.txt', 'w') as fdata:
for _ in range(n_samples):
fdata.write(str(10*np.random.random())+',')**# Read the CSV in a list, convert to ndarray (reshape just for fun) and time it**
t1=time.time()
with open('fdata.txt','r') as fdata:
datastr=fdata.read()
lst = datastr.split(',')
lst.pop()
array_lst=np.array(lst,dtype=float).reshape(1000,1000)
t2=time.time()print(array_lst)
print('\nShape: ',array_lst.shape)
print(f"Time took to read: {t2-t1} seconds.")>> [[0.32614787 6.84798256 2.59321025 ... 5.02387324 1.04806225 2.80646522]
[0.42535168 3.77882315 0.91426996 ... 8.43664343 5.50435042 1.17847223]
[1.79458482 5.82172793 5.29433626 ... 3.10556071 2.90960252 7.8021901 ]
...
[3.04453929 1.0270109 8.04185826 ... 2.21814825 3.56490017 3.72934854]
[7.11767505 7.59239626 5.60733328 ... 8.33572855 3.29231441 8.67716649]
[4.2606672 0.08492747 1.40436949 ... 5.6204355 4.47407948 9.50940101]]>> Shape: (1000, 1000)
>> Time took to read: **1.018733024597168 seconds**.
这是第一次阅读,无论如何你都要做。但是如果您可能会多次使用同一个数据集,那么,在您的数据科学过程完成之后,不要忘记在中保存 ndarray 对象。npy格式。
**np.save('fnumpy.npy', array_lst)**
因为如果你这样做了,下一次,从磁盘读取将会非常快!
t1=time.time()
array_reloaded = np.load('fnumpy.npy')
t2=time.time()print(array_reloaded)
print('\nShape: ',array_reloaded.shape)
print(f"Time took to load: {t2-t1} seconds.")>> [[0.32614787 6.84798256 2.59321025 ... 5.02387324 1.04806225 2.80646522]
[0.42535168 3.77882315 0.91426996 ... 8.43664343 5.50435042 1.17847223]
[1.79458482 5.82172793 5.29433626 ... 3.10556071 2.90960252 7.8021901 ]
...
[3.04453929 1.0270109 8.04185826 ... 2.21814825 3.56490017 3.72934854]
[7.11767505 7.59239626 5.60733328 ... 8.33572855 3.29231441 8.67716649]
[4.2606672 0.08492747 1.40436949 ... 5.6204355 4.47407948 9.50940101]]>> Shape: (1000, 1000)
>> Time took to load: **0.009010076522827148 seconds**.
如果您想以其他形式加载数据,这并不重要,
t1=time.time()
array_reloaded = np.load('fnumpy.npy').**reshape(10000,100)**
t2=time.time()print(array_reloaded)
print('\nShape: ',array_reloaded.shape)
print(f"Time took to load: {t2-t1} seconds.")>> [[0.32614787 6.84798256 2.59321025 ... 3.01180325 2.39479796 0.72345778]
[3.69505384 4.53401889 8.36879084 ... 9.9009631 7.33501957 2.50186053]
[4.35664074 4.07578682 1.71320519 ... 8.33236349 7.2902005 5.27535724]
...
[1.11051629 5.43382324 3.86440843 ... 4.38217095 0.23810232 1.27995629]
[2.56255361 7.8052843 6.67015391 ... 3.02916997 4.76569949 0.95855667]
[6.06043577 5.8964256 4.57181929 ... 5.6204355 4.47407948 9.50940101]]
>> Shape: **(10000, 100)**
>> Time took to load: **0.010006189346313477 seconds.**
事实证明,至少在这种特殊的情况下,磁盘上的文件大小对于。npy 格式。
摘要
在本文中,我们演示了使用原生 NumPy 文件格式的效用。npy over CSV,用于读取大型数值数据集。如果需要多次读取同一个 CSV 数据文件,这可能是一个有用的技巧。
点击阅读更多关于这种文件格式的细节。
喜欢这篇文章吗?成为 中等会员 继续 无限制学习 。如果您使用下面的链接, ,我将收取您的一部分会员费,而不会对您产生额外费用 。
[## 通过我的推荐链接加入 Medium—Tirthajyoti Sarkar
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@tirthajyoti/membership)
为什么您仍然应该考虑 R 中的老式 For 循环
原文:https://towardsdatascience.com/why-you-should-still-consider-good-old-fashioned-for-loops-in-r-6f2f9d0db14a?source=collection_archive---------5-----------------------
当我第一次开始使用 R 时,我对这种语言的计算效率(速度)有点失望。这并不会妨碍大多数数据科学家,但对于生产代码或大型数据集来说就不那么好了。然而,就像生活中的许多事情一样,为了让 R 做你想做的事情,你需要更加努力地工作,走出普通的道路。
在之前的一篇文章中,我比较了四种不同编程语言中拆分-应用-合并原理的时间,在几次尝试之后,R 实际上在我的用例中名列前茅。最好的结果是使用了 data.table 包,它主要是在 Rcpp(R 的 c++接口)中构建的。
有趣的是,我现在正与另一位工程师合作,在我们的一个商业包中实现一种分割-应用-组合的方法,使用 R 中的预开发代码来快速地在客户那里得到东西(持续开发等等)。不幸的是,我们被告知不能使用 GNU GPL 开源许可。
这意味着:
- 没有数据。表:(
- 没有 dplyr:(
- 没有使用有效的 Rcpp 代码…
现在怎么办?
没有这些精美的软件包,数据科学家应该做些什么呢?什么都要自己写?以 R 为基数?哦不!这是一场噩梦,对吗?但是,事实证明,你学到了 r 基的一些有趣的方面。
所以我还是要速度。我的应用程序肯定不会成为瓶颈。绝对不会。我代表质量。代替这种用户体验的是:
点击开始按钮。预计计算时间:15 分钟。“唉,我再去喝一杯咖啡。”
我更喜欢这种用户体验:
点击。嗖嗖。完成了。“嘿,这个漂亮的图表在这里做什么?”
因此,我的一般规则是:“当我的算法运行时,顾客不能喝咖啡。”幸运的是,我的同事也有同样的想法,显然他甚至牺牲了对经理的好感,在代码优化上花时间。所以我觉得这将是一次有趣的合作。
那么我们如何获得速度呢?一般你用众所周知的互联网智慧。这是 R 中宣扬的主要范式:
你不应该使用 for 循环!您应该使用应用功能!
并不总是对的…
我喜欢函数式编程,但有时你必须尝试什么最有效。在 base R 中,对数据帧中的每个组应用操作的默认方法是函数by
。最重要的是,R 中典型的线性建模接口是lm
。将这两个功能结合起来,在一个简单的用例上的计时超过 9 秒(在更现实的情况下,打哈欠、喝咖啡会很快达到几分钟)。我可以用基 R 函数把它降低到 0.4 秒。这是超过 25 倍的改进!
我们是如何加快速度的?
函数lm
很慢,因为它进行字符串解释和许多其他计算,使用户的生活更容易。假设您有一个包含 A、B 和 Z 列的数据框架,那么通常情况下,您会对多项式回归进行如下操作:
**# The easy way of modeling**
model <- lm(Z ~ poly(A, B, degree=3, raw=TRUE), data = df)
比lm
更快的方法是手动处理线性代数。在我之前的文章中,我使用了一个 QR 分解器,但是我的同事发现内部的.lm.fit
功能甚至比它快两倍(我们有一点竞争)。对于那些不熟悉线性代数的人来说,这里最难的部分是为你的问题定义模型矩阵。
**# The harder way, first construct a model matrix**
M <- cbind(A*0+1, A, B, A*B, A², A²*B, B², A*B², A³, B³)
**# Then do the fit**
model <- .lm.fit( M, Z )
随着建模速度的提高,我们现在可以看看如何处理by
功能。这个函数很慢,因为它在内部进行了大量的数据转换,一直在分配新的内存,这是完全没有必要的。最后,您会得到每个组的结果列表,您需要再次取消列表,这又是一次内存分配。这很容易改进。
A comparison of some of the results. I’m not even showing by + lm
, that’s off the chart at 9 seconds.
by
的另一种选择是 data.table,但不幸的是我们不能使用它。所以下一个最好的方法是一个简单的 for 循环!我们发现矩阵是循环中最快的索引数据类型,这是线性代数所需要的。为了让事情进展得更快,只要确保不要创建太多不必要的变量,尤其是避免将事情转换成列表。
对于那些喜欢钻研代码的人,我已经在我的 github 库中添加了一个关于这个主题的单 R 脚本。
结论
结合所有这些改进和其他代码优化,我的同事成功地将一个典型用例的 5 分钟计算时间减少到了 2 秒钟!这是一个伟大的结果!现在的瓶颈在于数据加载,这仍然需要大约一分钟的时间,我们目前没有能力解决这个问题。但是总的来说没有时间再喝咖啡了!
因此,如果您正面临一些数据科学或编码问题,不要忘记尝试违背常规实践的方法!
为什么你应该尝试平均编码
原文:https://towardsdatascience.com/why-you-should-try-mean-encoding-17057262cd0?source=collection_archive---------3-----------------------
from Stuart Hall’s 1973 “Encoding/Decoding” model
任何特征工程任务中一个非常常见的步骤是将分类特征转换成数字特征。这被称为编码,虽然有几种编码技术,但有一种是我特别喜欢并经常使用的——意味着编码。
这是怎么做到的
与标签编码不同,标签编码以一种随机的方式高效地完成工作,而均值编码试图以更符合逻辑的方式处理问题。简而言之,它使用目标变量作为基础来生成新的编码特征。
让我们来看一个例子:
在这个样本数据集中,我们可以看到一个名为“Jobs”的特征,另一个名为“Age”的特征,以及一个指向带有目标变量 1 和 0 的二元分类问题的目标变量。现在,特征“年龄”已经设置好了,因为它已经是数字了,但是现在我们需要对特征“工作”进行编码。
最明显的方法是标签编码,其中我们将根据映射逻辑转换值——例如 1 表示医生,2 表示教师,3 表示工程师,4 表示服务员,5 表示司机。因此,结果将是:
这种方法真的没有错。然而,如果我们观察特征的分布,我们会发现它完全是随机的,与目标变量没有任何关联。
有道理,对吧?关于我们应用的映射没有任何特定的逻辑,我们只是给每个工作一个数字,仅此而已。现在,有没有另一种方法,我们可以对这个特征进行编码,使它不那么随机,也许会给我们一些关于目标变量本身的额外信息?
让我们试试这个:对于分类特征的每个唯一值,让我们根据目标变量中阳性类出现的比率对其进行编码。结果将是:
为什么?例如,让我们看看独特的价值“医生”。目标变量出现了 4 次,其中 2 次是阳性标签,因此,值“Doctor”的平均编码为 0,5。对该特征的所有唯一值重复该过程,就可以得到结果。
现在让我们再来看一下这个特性的分布,看看有什么不同。
目标类看起来更加独立-类 1 在右侧,类 0 在左侧-因为在特征值和目标类之间存在相关性。从数学的角度来看,均值编码代表了目标变量的一个概率,取决于特性的每个值。在某种程度上,它将目标变量体现在其编码值中。
总之,均值编码既解决了编码任务,又创建了一个更能代表目标变量的特征——基本上是一举两得。
时好时坏;起伏波折
然而,这并不都是好事。虽然均值编码已经显示出可以提高分类模型的质量,但是它也存在一些问题;主要的一个是通常的嫌疑人,过度拟合。
事实上,我们基于目标类对特性进行编码可能会导致数据泄漏,使特性有偏差。为了解决这个问题,均值编码通常与某种正则化一起使用。以 Kaggle 上的这个解决方案为例,作者使用了平均交叉验证方案。
既然我们在谈论 Kaggle,我们不妨提一下梯度推进树,以及均值编码如何对它们特别有用。GBT 的一个缺点是它无法处理高基数分类特征,因为树的深度有限。
from Dmitry Altukhov’s “Concept of Mean Encoding”
现在,由于均值编码大大降低了基数,正如我们之前看到的,它成为了一个很好的工具,可以用更短的树达到更好的损失,从而改进分类模型。
正在总结…
没有什么比尝试更好的了,对吧?我的建议是:从 Kaggle 上的梅赛德斯比赛的数据集开始,看看它们的分类特征。
提示:测量应用均值编码前后分类特征的基数😉
为什么应该使用脏数据以及从哪里获取
原文:https://towardsdatascience.com/why-you-should-work-with-dirty-data-where-to-get-it-9118ea67434c?source=collection_archive---------5-----------------------
Photo by Jeremy Bishop on Unsplash
每个人都在谈论的一件事是,学习者应该获得数据集,并开始进行机器学习。来自存储库的数据集,特别是机器学习数据集。
问题是这些数据集通常都很干净。人们会问:我们从哪里获得脏数据集?
为什么需要脏数据集?
机器学习或数据科学的第一步实际上是研究数据,理解数据。这是关于什么的。
从干净的数据集开始是一个好主意,在那里你可以学习建立机器学习模型的方法等等。但是在某些时候你需要学习如何清理数据,如何做预处理。
预处理非常重要,因为:数据从来都不是干净的!
谷歌开放数据
我的建议是:去谷歌搜索公开数据。有很多公开的数据集,谷歌一下就知道了。
我推荐的另一件事不仅仅是搜索公开数据。寻找一个特定的利基。
如果你对银行业感兴趣,那么谷歌:“开放数据银行”
如果你对交通感兴趣:“开放数据公共交通”或“开放数据智慧城市”,无论你感兴趣的小众。开放数据能源生产。
你会发现数据无处不在。然后你就可以清洗它了。
领域知识很重要
我总是强调领域知识,因为作为一名数据科学家,你需要它。是对某一领域的深刻理解。
没有领域知识,你就不会真正理解数据。你不能预处理数据,不能清理数据。没有领域知识,很难决定一个模型是否真的如预期的那样工作。
你需要理解商业案例:你到底想用这个模型解决什么。
在你有领域知识的地方处理数据
当你开始选择适合你的利基。你有一些领域知识的利基。
这意味着你对正在发生的事情有所了解。如果你学过工程学,也许是和工程学相关的。
如果你是一名银行业分析师,并且你正在研究机器学习,那就研究一下银行业。这很容易,也很开放。
有这么多的来源。出去试试吧。
.
上打招呼:insta gram|LinkedIn|脸书|Twitter|YouTube|Snapchat
不要错过我在 SoundCloud 和主播上的几乎每天的数据科学和大数据播客
订阅我的简讯:这里
为什么你不应该成为数据科学通才
原文:https://towardsdatascience.com/why-you-shouldnt-be-a-data-science-generalist-f69ea37cdd2c?source=collection_archive---------2-----------------------
我在一家数据科学导师初创公司工作,我发现有一条建议是我反复给有抱负的学员的。这真的不是我所期望的。
与其建议一个新的库或工具,或一些简历黑客,我发现自己建议他们首先考虑一下他们想成为什么样的数据科学家。
这一点至关重要的原因是,数据科学不是一个单一的、定义明确的领域,公司不会雇用通用的、多面手的“数据科学家”,而是拥有非常专业的技能组合的个人。
要了解原因,只需想象一下,你是一家试图招聘数据科学家的公司。几乎可以肯定,你头脑中有一个相当明确的问题需要帮助,这个问题需要一些相当具体的技术知识和专业知识。例如,一些公司将简单模型应用于大型数据集,一些公司将复杂模型应用于小型数据集,一些公司需要即时训练他们的模型,一些公司根本不使用(常规)模型。
这些都需要完全不同的技能,因此特别奇怪的是,有抱负的数据科学家收到的建议往往如此笼统:“学习如何使用 Python,建立一些分类/回归/聚类项目,然后开始申请工作。”
我们这些在这个行业工作的人要为此承担很多责任。在随意的交谈、博客帖子和演示中,我们倾向于将过多的东西归入“数据科学”范畴。为生产构建强大的数据管道?这是一个“数据科学问题”发明一种新的神经网络?这是一个“数据科学问题”
这并不好,因为这往往会导致有抱负的数据科学家失去对特定问题类别的关注,而是成为所有行业的千斤顶——在一个已经充满多面手的市场中,这可能会使人们更难注意到或突破。
但是,如果你不知道首先应该专攻哪些常见问题,那么你就很难避免成为多面手。这就是为什么我列出了通常被归入“数据科学”标题下的五个问题类别:
1.数据工程师
职位描述:你将为处理大量数据的公司管理数据管道。这意味着确保您的数据在需要时被有效地从其来源收集和检索,并进行清理和预处理。
为什么重要:如果您只处理过存储在。csv 或。txt 文件,可能很难理解为什么会有人全职工作是建立和维护数据管道。这里有几个原因:1)50gb 的数据集不适合您的计算机的 RAM,所以您通常需要其他方法将它输入到您的模型中,2)这么多的数据可能需要花费大量的时间来处理,并且经常需要冗余存储。管理这种存储需要专业的技术知识。
需求:您将使用的技术包括 Apache Spark、Hadoop 和/或 Hive,以及 Kafka。你很可能需要有坚实的 SQL 基础。
你将要处理的问题听起来像:
→“我如何构建一个每分钟可以处理 10 000 个请求的管道?”
→“我如何在不将数据集全部加载到 RAM 中的情况下清理数据集?”
2.数据分析师
工作描述:你的工作是将数据转化为可操作的商业见解。你经常是技术团队和商业战略、销售或营销团队的中间人。数据可视化将成为你日常生活的一大部分。
为什么重要:高度技术化的人通常很难理解为什么数据分析师如此重要,但他们确实如此。有人需要将一个经过训练和测试的模型和成堆的用户数据转换成可消化的格式,以便围绕它们设计商业策略。数据分析师有助于确保数据科学团队不会浪费时间来解决无法带来商业价值的问题。
需求:您将使用的技术包括 Python、SQL、Tableau 和 Excel。你还需要成为一名优秀的沟通者。
你将要处理的问题听起来像:
→“是什么推动了我们的用户增长?”
→“我们如何向管理层解释,最近用户费用的增加正在拒人于千里之外?”
3.数据科学家
工作描述:你的工作将是清理和探索数据集,并做出带来商业价值的预测。您的日常工作将包括培训和优化模型,并经常将它们部署到生产中。
为什么重要:当你有一堆太大的数据,人类无法解析,并且太有价值而不能被忽略时,你需要某种方式从中提取可消化的见解。这是数据科学家的基本工作:将数据集转换成可理解的结论。
需求:您将使用的技术包括 Python、scikit-learn、Pandas、SQL,可能还有 Flask、Spark 和/或 TensorFlow/PyTorch。一些数据科学职位是纯技术性的,但大多数职位需要你有一些商业意识,这样你就不会最终解决没有人解决的问题。
你将要处理的问题听起来像:
→“我们到底有多少不同的用户类型?”
→“我们能否建立一个模型来预测哪些产品会卖给哪些用户?”
4.机器学习工程师
职位描述:你的工作将是构建、优化机器学习模型,并将其部署到生产中。你通常会将机器学习模型视为 API 或组件,你会将它们插入到全栈应用程序或某种硬件中,但你也可能会被要求自己设计模型。
需求:您将使用的技术包括 Python、Javascript、scikit-learn、TensorFlow/PyTorch(和/或企业深度学习框架),以及 SQL 或 MongoDB(通常用于应用数据库)。
你将要处理的问题听起来像:
→“我如何将这个 Keras 模型集成到我们的 Javascript 应用程序中?”
→“如何减少我们推荐系统的预测时间和预测成本?”
5.机器学习研究员
职位描述:你的工作将是寻找新的方法来解决数据科学和深度学习中的挑战性问题。您将不会使用开箱即用的解决方案,而是制作自己的解决方案。
需求:您将使用的技术包括 Python、TensorFlow/PyTorch(和/或企业深度学习框架)和 SQL。
你将要处理的问题听起来像:
→“我如何将我们模型的精确度提高到更接近最先进的水平?”
→“定制优化器有助于减少培训时间吗?”
我在这里列出的五个职位描述在所有情况下绝对不是孤立的。例如,在早期创业公司,数据科学家可能还必须是数据工程师和/或数据分析师。但是大多数工作会比其他的更好地归入这些类别中的一个——而且公司越大,这些类别就越适用。
总的来说,要记住的是,为了被录用,你通常会更好地建立一个更专注的技能集:如果你想成为数据分析师,不要学习 TensorFlow,如果你想成为机器学习研究员,不要优先学习 Pyspark。
相反,想想你想帮助公司建立什么样的价值,并善于传递这种价值。最重要的是,这是进门的最佳方式。
为什么你的人工智能有偏见&如何解决
原文:https://towardsdatascience.com/why-your-a-i-is-biased-how-to-fix-it-c9ffb3de6ed2?source=collection_archive---------4-----------------------
我们都应该问的问题
人工智能和机器学习领域的许多创新者面临着一个技术培训的问题。他们用来教授算法的数据仅限于来自网络或合理使用资源,这些资源容易受到偏见或不充分,因为没有包括各种各样的人。
例如,这里有一些快速的谷歌图片搜索,有助于可视化包容性和代表性的差异。以下结果来自搜索“女人”、“男人”、“头发”和“美丽的微笑”
Representation of Women & Men, According to the Internet.
What People With Hair & Beautiful Smiles Look Like, According to the Internet.
当人工智能暴露在网络上已经培养了几十年的文化刻板印象、语义和系统偏见中时,问题就出现了。我们中的许多人已经无意识地习惯于接受这些偏见作为“规范”;《人工智能的编程》将这些偏见公之于众,而将这些偏见的问题本质放入背景中——迫使我们变得更加公平和负责。许多人质疑人工智能是否天生就有偏见,因为它是由人类训练的,而人类本身并不完美。
这些问题
答案在于问两个关键问题:
1)什么数据被用来训练人工智能,它来自哪里,是“全谱”数据吗?
2)是否有意识地从头开始实施人工智能系统,以防止偏见的发生?
为什么我变得有偏见
当做错时,通常会在通过来自互联网的数据进行训练的机器中看到种族主义和厌恶女性的特征,或者从一开始就没有认真努力解决偏见。
下面的例子快速突出了为什么使用互联网作为机器学习中建立数据集的媒介是有问题的&扩散了预先存在的人类偏见。
1)微软和他们的 twitter 聊天机器人 Tay 在大约一天的时间里变成了一个亲希特勒的种族主义者,在 Twitter 上发布了如下声明:
“布什制造了 911 事件,希特勒会比我们现在的猴子做得更好。唐纳德·特朗普是我们唯一的希望。”
Tay’s tweet
Tay 正在从人们在互联网上发布的推文中学习和提取数据。
- 最近的研究表明人工智能在网上的标准文本体上进行训练,结果是它将欧裔美国人的名字与令人愉快的词语如“礼物”或“快乐”联系起来,而将非裔美国人的名字与令人不快的词语联系起来。
3)美。AI 表演了一场由人工智能评判的选美比赛。上传了来自 100 个不同国家的 6000 张自拍。在 44 名获奖者中,少数是亚洲人。除一人外,其余都是白人。答:我并不是故意被教导说白皮肤的人更漂亮,但它确实是这样,不过假设它所输入的数据主要由白人组成。
亚历克斯·扎沃龙科夫,美女。AI 的首席科学官, 在《卫报》上解释了多样化数据集的重要性:
“虽然算法偏向白人有很多原因,但主要问题是该项目用来建立吸引力标准的数据没有包括足够多的少数族裔……如果数据集中没有那么多有色人种,那么你实际上可能会得到有偏见的结果。”他当时说。
答案
以下是如何建立一个没有偏见的人工智能:
1)创建“全谱”数据集,这是一个从零开始构建的数据库,没有固有的偏见,具有包容性和多样性。
2)建立人工智能,注意偏见&全面实施防止偏见发生的系统。
3)人情味对质量控制至关重要,以确定在向人工智能引入新数据时是否存在任何偏见。
例如, Knockri 通过分析求职者的语言和非语言交流来筛选视频求职申请。我们建立了自己的专有数据集,强调包容性和多样性。此外,在量化候选人的能力时,该算法不会将个人的种族、性别、外貌或性偏好作为招聘意愿的衡量标准。
A.我只和它的数据集一样好。当精心构建时,人工智能可以为企业提供可扩展的资源,可以持续帮助人们做出更客观的决策。
为什么你的授权率是后 PSD2 时代的一个衡量标准
原文:https://towardsdatascience.com/why-your-authorization-rate-is-the-one-metric-to-measure-in-a-post-psd2-world-bc7c441af9f2?source=collection_archive---------2-----------------------
如果你有一家电子商务公司,每天要处理成百上千的交易,你应该问自己的问题是:
我的授权率是多少?
授权率是多少?
对于 PSP 和收单机构来说,授权率是最重要的指标之一,因为它通过跟踪所有提交交易中授权交易的数量,提供了对其平台性能的洞察。
在传统的电子商务支付流程中,购物者表示她想要“结帐”她的商品。她向商家提供她的信息,这些信息或者存储在商家的数据库中,来自以前的交易,或者在结账过程中提供。购物者继续选择支付方式并通过支付流程。
E-Commerce Payment Flow
对于提交给处理者的每一笔提交的交易,发行者可以授权或拒绝交易。因此,为了计算授权率,我们使用以下公式:
((授权交易)/(授权交易+拒绝交易))* 100 =授权率
例如,如果我们处理了 800 笔授权交易和 200 笔拒绝交易,授权率将为:
((800)/(800+200))*100 = 80%授权率
我之所以认为电子商务企业应该跟踪他们的授权率,是因为 授权率越低,对你的业务造成的财务伤害就越大 。
例如,如果您的授权率为 80%,这仍然意味着您的交易有 20%被拒绝,这意味着您无法收集和处理订单。当然,许多客户会再次尝试或使用不同的支付方式,但对于那些不这样做的客户来说,这意味着您正在失去收入,因为您的 PSP/收单机构无法处理您的交易或向您提供有关交易无法完成的原因的相关信息。
一个重要的指标
在精益分析中,作者 Alistar Croll 和 Benjamin Yoskovitz 讨论了一个重要的指标(OMTM)。《精益创业》的作者 Eric Reis 谈到了推动增长的三个引擎:粘性引擎、病毒引擎和付费引擎。虽然所有公司都使用每种引擎,但他警告说,一次只关注一种引擎。在分析和数据的世界里,这意味着选择一个你要跟踪的单一指标,来改进你正在经历的阶段。这就是 Croll 和 Yoskovitz 所说的一个重要的度量标准。
在支付领域,有许多指标可以跟踪,如交易、收入或退款。我之所以建议你应该开始跟踪授权率,是因为这是这个过程中你唯一不能完全控制的部分,但对你的底线影响最大。因此,无论你是处于启动(粘性引擎)、增长(病毒引擎)还是维持(付费引擎)阶段,跟踪你的 PSP 的表现对你的支付成功至关重要。
衡量和比较
如果购物者正在浏览您的网站,但没有将商品添加到购物车中,您可以 A/B 测试包括定价、图片和文案在内的变量。如果购物者正在向购物车中添加商品,但没有继续结账,您可以添加弹出窗口或电子邮件提醒来完成他们的购买。如果购物者正在结账,但在过程中中止,你可以增加页面数量或分散注意力,以帮助他们完成交易。但是当你将交易提交给你的 PSP/收单机构时,你就无能为力了,因为授权或拒绝完全取决于 PSP 或收单机构如何处理你的交易。这就是为什么我总是建议商家跟踪他们的 PSP/收购方的表现,并定期与其他 PSP/收购方进行比较。要么通过实施两个不同的 PSPs 收单机构并进行定期 A/B 测试,要么使用行业基准来比较它们的授权率。
A/B Testing Variations
PSD2 将如何影响我的授权率?
随着支付服务指令 (PSD2)的出台,我相信授权率将是受影响最大的一个指标,除非商家采取适当的行动。
作为 PSD2 的一部分,强客户身份验证将适用于欧盟境内的在线支付,特别是当 PSP/收单机构和购物卡发行机构都位于欧盟境内时。
强客户身份认证将要求使用以下至少两个独立要素对在线支付进行身份认证:
- 只有客户知道的东西 (例如:只有客户知道的密码、PIN 或代码)
- 只有客户拥有的东西 (例如:实体卡、手机或硬件令牌生成器)
- 客户身份 (例如:指纹、虹膜扫描或面部识别等生物特征)
随着 Apple Pay 和 Google Pay 的推出,许多银行已经实施并积极使用 3D Secure、master card Secure code 或 Visa Verified 来减少欺诈,购物者可以选择通过移动或桌面进行支付认证,而本地支付方式,如 iDeal 、 SOFORT 和 Bancontact 已经在使用多因素认证。
但是在支付流程中增加更多的步骤,会导致支付流程中更多的摩擦和更高的放弃率,从而导致更多的拒绝交易,从而降低授权率。
如何开始跟踪我的授权率?
大多数 PSP 对你的授权率提供很少的洞察力,尤其是如果他们没有任何方法来控制或影响它。因此,如果您无法下载报告或使用分析套件来跟踪授权率,我建议您采取以下措施:
- 跟踪您的结账会话(每次购物者使用您的网络分析点击结账,例如谷歌分析或 KissMetrics )
- 跟踪你的 WebHook 会话(每次购物者返回你的感谢或支付失败页面)
- 跟踪您的成功付款(根据您的 PSP,每笔授权/成功付款)
由于 PCI 合规性,您无法将 Web 分析添加到支付页面,跟踪结账会话,为您提供客户想要结账的次数的良好指示。
可以跟踪 WebHook 会话,并让您很好地了解成功或失败的会话数量。
要验证已启动的结帐会话数以及成功/失败的会话数,您可以将其与成功付款数进行比较。
根据您的业务模式(直销、订阅)、购物卡的发行方、PSP 和/或收单机构以及其他几个变量,授权率可以在 70%到 95%之间。通过每天跟踪您的授权率,您可以创建一个仪表板,让您更好地了解实际获得授权的交易百分比,并能够真正了解您的 PSP/收单机构的表现。
Authorization Rate Dashboard
感谢阅读;),如果你喜欢它,请点击下面的掌声按钮,这对我意义重大,也有助于其他人了解这个故事。还添加了关注按钮,以接收我的每周博客。
为什么您的公司应该关注大数据
原文:https://towardsdatascience.com/why-your-company-should-care-about-big-data-2196423a45dd?source=collection_archive---------3-----------------------
Photo by Gamze Bozkaya on Unsplash
【免责声明:本文旨在提出“大数据”概念背后的基本思想。我想帮助人们熟悉它。这不是一种技术方法,所以我想否认在技术方面可能缺乏准确性。我不是技术人员,也不是数据科学家,而是企业家。其他比我更好的人可以在技术方面提供帮助。我想提供一个不同的,更“普通人”的观点。]
什么是“大数据”
你不讨厌周围人用流行语吗?它可能是“大数据”、“人工智能”或“数字自动化”。你点头,我很确定,对自己说:“新技术听起来很棒,但它们对我有什么帮助?
有恐惧,有怀疑,有许多问题注定没有答案。
你认为有人能告诉你什么对你更好吗?绝不!甚至你的父母,你的母亲,你的爱人都不能这样做!你是唯一能为自己做决定的人。
其实不是这样的。
是的,有人(或某物)可以知道,在某些情况下比你更清楚,什么是最好的决定。
人工智能可以做到这一点。它可以帮助你做决定。
你可以用其他数十亿人产生的数据来支持你所做的事情。
根据一个古老但仍然有效的定义,Gartner 这样定义“大数据”:
大数据是高容量、高速度和/或高多样性的信息资产,需要经济高效、创新的信息处理形式来增强洞察力、决策制定和流程自动化。— 高德纳公司
让我更好地解释它。
大数据是高容量的
充分接触许多不同的经历引起高音量。
此外,我们做的各种互动,例如,在网上购买商品,导致高容量。今天你几乎可以追踪任何事情。
想想你自己在网店给宝宝买婴儿食品和纸尿裤。你的基本客户旅程是什么?
你上电子商务。
您过滤产品并选择您的偏好。
有优惠,所以你看买不同的数量,或者大小,可以省钱。
您登录或注册网站。
您用您的送货地址和信用卡信息完成订单。
通过简单的购买,您已经产生了大量的结构化和非结构化数据。
人口统计数据,例如,年龄、性别、地理区域、收入。心理数据:推动你购买的偏好、价值观和动机。
你购买过有机食品吗?你是一个关心宝宝健康的人,认为有机食品更贵但更好。
你订购可洗尿布了吗?你也关注环境,想要为拯救地球做出贡献。
你的地址靠近高污染区吗?或者,你住在乡下吗?
所有这些数据,应用于不同的人、产品、来源,达到难以置信的高容量。
大数据是高速的
让我们坚持婴儿食品采购的例子。
是你第一次做这种订单,你想为你的宝宝做好。
在你继续之前,你需要更多的信息。传统上,你必须从一个商店搬到另一个商店。你得比较产品。你求推荐。你向你的朋友、你的妈妈、你的岳母寻求意见,关于什么对你更好。与此同时,你们也讨论烟雾、污染和其他话题。
这是一种缓慢的信息收集方式,而且你只能收集到一些观点。
多亏了科技,你可以追踪更多信息,让它们更容易获取。
大数据种类繁多
平行行动追踪任何事物的无限可能性,造成高音量。也造成了高品种。
让我们展望未来,完成我们的婴儿食品购买示例。
当你在一家网上商店购物时,你会比较另一家商店的价格和报价。在另一个浏览器窗口,你可以在育儿博客上寻找建议。在一个社交网络群上,你寻找相似的经历。同时,你会收到你通常订阅的时事通讯。你会读到农业中杀虫剂的风险,空气质量水平,绿色习惯。
这些信息来自不同的来源,社交网络,视频,传感器。
你从一条信息跳到另一条,拓宽了你的可能性。
好,我有大数据,现在呢?
"大数据分析检查大量数据,揭示隐藏的模式、相关性和其他见解."— SAS
让我们来完成我们的婴儿食品购买体验。
大数据分析系统可以匹配你的订单历史、其他客户行为、你的环保态度、你的地址等等。在此基础上,它可以建议你为你的家买一个空气过滤器。
你喜欢乡村。也许两三年后,你会搬到那里去。在未来,你孩子已经会走路了,你不再需要婴儿食品和尿布了。
系统发现隐藏模式和相关性。它能发现你生活中的变化,以及你过去和现在的偏好。所以,它建议你买一辆自行车。更重要的是,它建议你为你和你的小男孩/女孩准备一辆自行车,现在可以和你一起跑了。
得益于大数据分析,建议成为可能。这是一个突出对您有意义的数据的过程。
大数据和数字自动化的优势
让我用一句有意义的话来介绍使用大数据的好处:
“企业希望获得数字化和自动化带来的好处,但他们并不总是信任驱动这些机器的底层分析。”— Ryan Rozich 在“为什么人工智能和内容比人工和机器更重要
人们和公司对大数据以及人工智能持怀疑态度。
怀疑来源于复杂性。
我们必须提取复杂性,以便您可以更好地运营您的业务。
我们必须将大数据视为帮助我们完成任务的标准工具,就像厨房里的微波炉帮助我们烹饪食物一样。
我们身边到处都有大量使用这些算法的合适例子。让我们看看大数据分析可以改善我们业务的 5 个方面。
大数据分析可以改善我们业务的 5 个方面
更好的决策
大数据分析有助于组织收集过去和新的信息,找出相似的模式。
Photo by Jacek Dylag on Unsplash
这个操作是有帮助的。它让人们对成功的决策和碰壁的决策一目了然。
大数据和人工智能也有助于对比过去和现在。
像往常一样,让我们举个例子。
你喜欢啤酒吗?
想象你生产啤酒。您正在跟踪您的每个卖点的分销和消费情况。
使用大数据分析,你会发现哪些是最好的销售期,哪些是最差的销售期。你可以衡量最好和最差的分销商。你可以根据不同的时间和地点来组织生产和销售。您可以高效地节省时间和金钱。
借助基于经验和市场预测的策略,您可以做出更好的数据驱动型决策。更明智地使用数据,您可以通过更高效的运营推动业务向前发展。
更好的决策=降低成本
不仅如此,你还可以发现新的机会。
发现新的机会
你也可以通过考虑新的额外变量来追踪啤酒消费的差异。
你是否有一个考虑到当地气候的分配计划?或者,当地的人口统计?有一个经销商最服务于家庭或当地超市?一个最服务于酒吧?
根据不同的模式,使用数据驱动的信息创建差异化的分销计划。
决策可以反映客户的需求或价值。例如,为家庭服务的当地超市的淡啤酒。
你有更高的利润和更满意的顾客。
““We like you too 😃” written on a white brick wall” by Adam Jang on Unsplash
你还会发现缺乏对顾客需求的覆盖。客户特性是用来满足他们的。
你甚至可以发现一个尚未覆盖的利基。
听起来这可能是一个新的可爱产品的起点。
他们有价值。你和你的企业获得了价值。
新机会=新收入
节省时间
利用大数据,你可以找到更有效的做事方法。
例如:
- 书籍需要没有错别字,配有索引和参考书目。
- 管理者必须为利益相关者收集财务数据。
重复的过程耗费大量资金。
自动化,一个索引,一个书目,一个财务报告,今天更容易得到。建立良好的大数据分析和训练有素的人工智能系统。
节省时间=降低成本
主动面对市场
利用大数据,您可以优化营销工作。
举几个例子:
- 细分你的 CRM 数据,你可以比你的竞争对手更快地推出新的产品。
- 分析趋势对话,您可以锁定特定的客户群。跨越数据和应用人工智能你可以支持个性化策略。
- 所以,你给了你的销售部门一个竞争优势。
他们更好地以正确的方式和定制的报价接近正确的潜在客户。
这种策略非常适合银行,所以他们会根据市场变化更新报价。
这种策略对于专业卖家来说非常有效,可以从他们的营销和销售漏斗中获取价值。
积极=新收入
以客户为中心
积极主动的市场策略也带来了以客户为中心的个性化策略。
大数据分析和人工智能一起重塑了这个行业。
甚至传统的呼叫中心活动也可以利用这些技术。
如果你能更好地预测客户对报价的反应呢?
数字自动化系统:
- 分析历史数据。
- 将它们与实时趋势交叉。
- 做有意义的段子。
- 就如何进行(或不进行)下一次销售拜访或销售会议提出建议。
销售人员表现更好,这得益于支持他们说服技巧的数据。
了解你的前景,赢得他/她的心。
那么,公司为什么需要大数据呢?
数学家研究员约翰·图基曾经说过:
“一张照片的最大价值在于它能迫使我们注意到我们从未想过会看到的东西。”
数据可视化就是图基提到的那个画面。数据可视化是显示数据内部内容的一种方式。然而,它需要发现哪些数据对业务来说是必不可少的,因此值得展示。
为什么您的模型需要维护
原文:https://towardsdatascience.com/why-your-models-need-maintenance-faff545b38a2?source=collection_archive---------2-----------------------
Photo by Ant Rozetsky, CC0
人们通常认为给定的模型可以永远投入使用。其实恰恰相反。你需要像维护机器一样维护你的模型。机器学习模型可以超时下车或者坏掉。这对你来说听起来很奇怪,因为它们没有移动的部分?嗯,你可能想仔细看看概念的变化和漂移。
观念的改变
让我们从一个例子开始。如果您试图为飞机建立一个预测性维护模型,您通常会创建如下列
错误 5 _ 发生 _ 过去 _ 5 _ 分钟
作为模型的输入。但是如果错误号 5 不再是错误号 5 会发生什么呢?软件更新会彻底改变您拥有的数据。它们修复已知问题,但也以不同的方式编码您的数据。如果您将更新后的数据作为更新前模型的输入,它会做一些事情,但不是您所期望的。这种现象叫做观念的转变。
概念漂移
一个非常相似的现象是概念漂移。如果变化不是剧烈的,而是缓慢出现的,就会发生这种情况。一个工业例子是传感器的外壳。随着时间的推移,这种情况会发生,测量的 100 度不再是 100 度。客户分析的一个例子是新技术的采用过程。人们没有马上使用 iPhones,而是慢慢适应了它。在 2007 年,像“HasAnIphone”这样的专栏意味着一个非常精通技术的人。今天,这表明一个普通人。
我能做什么?
An example for window based relearning. The pattern to detect circles moves over time. Only recent data points are included to built a model.
克服概念漂移的一种常见方法是基于窗口的重新学习。假设你的模型是建立在去年的数据之上的。这个窗口随着时间移动,因此你可以捕捉到概念的漂移。虽然这听起来很好,但它会遇到实际问题。一个问题是训练数据的限制。窗口越小,样本量越小。
这种方法通过减少概念漂移的问题帮助很大。但是观念的转变呢?
处理概念变化
需要报告由人类引入的并且可能影响模型的变化,并且需要调整模型。困难的是,负责变更的人需要意识到,模型会受到变更的影响。有 ML 意识的公司文化是成功的关键。最不可能的部分是,你有时不能在“新”硬件上建立一个模型。您只是没有新型号的数据,可能需要等待一段时间才能获得。
Graph resulting from backtesting. Real perforamnce (crosses) is compared to cross validation performances. It is decresing over time and results in a notification
另一个想法是回溯测试。在大多数情况下,你知道之后发生了什么。因此,您可以将您的模型预测与现实进行比较。另一方面,您的验证为您提供了对方法真实性能的评估。你可以用这两个平均值,做每日比较。如果基本概念改变了,您应该会看到性能下降。仪表板和通知方法是将此付诸实施的好方法。
关键要点:机器学习能力至关重要
本文展示了为什么“建模并运行”的常见实践是一种不好的实践。公司需要密切关注保持他们的机器学习能力。除了维护相关人员之外,拥有一个公共平台和良好记录的代码也很关键。
为什么你的组织不应该害怕人工智能
原文:https://towardsdatascience.com/why-your-organization-shouldnt-be-afraid-of-ai-7f433d5012d8?source=collection_archive---------0-----------------------
“事实是,今天你们中的每一个人…你们是一家软件公司,你们是一家数字第一的公司,你们正在构建核心的应用程序…而这些核心是数字产品”——微软首席执行官塞特亚·纳德拉——Ignite 2017
浏览一下你的 LinkedIn feed,不需要 90 秒就可以注意到,人工智能是“街上”关于收入电话的所有话题,是你 It 或营销部门大厅里咖啡聊天中希望或绝望的主要话题,甚至已经从反乌托邦式的 block buster Matrix/Terminator 模式扩散到我们的客厅,通过复杂的社会文化惊悚片,挑战我们“认为”我们是人类的动力(拜托,请告诉我你看过《西部世界》(Westworld)?).
现实是,关于人工智能的对话越来越重要,如此重要,以至于麻省理工学院的物理学家、《T2 T3 生命 3.0:成为人工智能时代的人类 T4 T5》的作者马克斯泰格马克(Max Tegmark)声称,这场对话是“我们这个时代最重要的对话”。 Max 有一个非常有趣的观点,对于各地组织的领导者来说,如果你关心员工和技术的互动将如何影响你组织的成功,你应该注意 Max 所说的话,因为正如你将看到的塞特亚·纳德拉的上述引用,每项业务都将成为软件/数据业务(你也可以 参考我的上一篇文章 以了解有关该主题的更多信息)。目前,马克斯的论点停留在人类已经开发出一定数量的硬件(我们的身体)的观点上,为此我们可以“下载”或更新软件来学习:
“我们有巨大的能力将新的“软件”上传到我们的大脑中……如果你决定要成为一名律师,你可以去法学院,法学院会将新的算法上传到你的大脑中,这样你就可以突然拥有律师的专业知识。正是这种设计我们自己的软件的能力,而不是等待进化给我们,使我们能够主宰这个星球,创造现代文明和文化。”
是的是的,我知道这次谈话的方向, 这到底跟跑 P & L 有什么关系,告诉我这跟我有什么关系!?根据 Max 的工作,他谈到了软件能够开发更智能的硬件或“大脑”的能力,这些硬件或“大脑”可以比人类更快地记忆和学习。“写软件的软件”,是这些思想片段开始升级为人类如何互动和利用机器驱动的超级智能变得更加有效的地方。
「超级智能」和商业有什么关系?
https://www.forbes.com/sites/greatspeculations/2017/10/25/getting-ready-for-prime-time-of-artificial-intelligence-investing/#4b824ff02010
一切。任何企业的成功都依赖于竞争,根据迈克尔·波特(回想一下你的战略课程和 5 种力量),这并不意味着击败对手,而是意味着赚取利润。提高利润的最快方法是在现有资产范围内提高生产率和绩效,削减成本,让员工更快地获得更好的见解(更多信息请参见下面的),这也将推动收入和新的增量收入来源。我们正在迅速接近一个时期,在这个时期,我们的性能将被计算机性能超越,在整个组织中拥抱、构建、教育和部署人工智能的企业将加快他们的旅程,比他们采取“他们还没有为人工智能做好准备”的立场要快得多。作为微软的一名员工,我当然对我们如何与企业合作并管理企业以帮助他们实现数字化转型的总体愿景抱有偏见,但我们的战略是建立在一个优雅的门户网站上,以促进企业进步和数字化转型。
安:又来了,“数字化转型”。我们已经走得够远了,所以让我们一起努力:数字化转型正在利用技术创造创新和颠覆,让员工和客户能够实现更多。微软“数字转型”智能价值体系中的四个“支柱”说明了这个疯狂的人工智能对话与你的业务有什么关系,可能看起来像这样:
- 真正地吸引您的客户利用智能机器人收集实时情报,了解您的客户真正重视什么,以及您如何更好地为他们提供服务,预测他们流失的潜力或提供服务/产品的机会,从而改善他们的生活。
- 你将如何授权你的员工不仅仅是关于“你在世界的前景或萧条上花了多少钱”的对话,而是你为员工提供了多少访问关键业务指标的机会,这些指标可以告诉他们他们的 P & L 实时表现如何——仪表盘可以闪现漂亮的图片,但机器学习可以告诉你为什么图表会下降或上升,并可以生成数据可视化,让你现在做出更好的决策。
- 优化运营是一些企业在全球化市场中生存的唯一途径,不管他们的产品有多好。假设你是一家食品制造/分销企业,影响你底线的三个趋势是 1)商品成本增加 2)监管增加 3)竞争对手规模扩大以及大企业间的加速合并。绝对有必要通过推断工厂车间的数据并使您的数据相互关联来削减成本,找出关键应用程序数据流之间的相关性,并了解每个流程如何相互影响。无论是通过深度学习图像识别、连接到机器并在边缘实时计算的智能边缘设备,还是通过机器学习模型查看历史数据并提出建议,这都是全球市场中竞争运营的现状。如果你不相信我,听说过【牡蛎互联网】?
- 最后,是通过人工智能优先/混合现实优先应用来转变产品的机会:“在今天的世界中,我的设计团队可能会制作一面镜子,我们必须以数字方式呈现,然后发送给工程师,让他们可以研究它,然后根据他们的反馈做出改变,”韦策尔说。“这需要时间,我们发现自己在这方面存在很多问题。但将工程和设计放在同一个空间,我们称之为共同创造的过程,可以简化这种互动。”——福特的设计技术运营经理说,他的团队采用了微软的 Halolens。
不可预测的人工智能:缓解交通流量,改善公司战略,并可能收紧婚姻
尼古拉斯·克里斯塔基斯,耶鲁大学的社会学家和医生,在他的校园社会学实验室进行了一项关于人类和人工智能互动的研究。这项研究由一个游戏组成,在这个游戏中,人类和机器人(简单的人工智能程序)必须合作做出定时决策。游戏网络显示,人类倾向于做出模式化的决策,智能机器人也是如此,它们平均产生类似的决策得分。除了一组机器人在 10%的时间里做出随机决策之外,这一组机器人最终在决策过程中制造了更多的“噪音”,引发了人类之间不同的反应思维,并导致了更快的决策。这种“愚蠢/猜测”的人工智能允许一个随机的环境,在这个环境中,由于机器人的“教学”性质,人类蓬勃发展,因为它们在允许“人类自助”中扮演了一个助手角色。
“没有机器人添加的噪音,人们经常陷入困境”
那么,如果随机运行的计算机可以帮助人类做出更好的决策,高度复杂的人工智能可以帮助人类更好地执行特定任务 ( 如人工智能实体“AlphaGo”帮助人类玩家更好地玩游戏)那么为什么商业领袖将人工智能部署到团队内部人类交互的愿望与我们在世界上最大的企业中看到的实际人工智能足迹之间存在巨大差异?问得好。
但是,利用愚蠢的人工智能并不意味着仅仅使用智能机器将随机场景引入一个群体环境中,以激发思维创造, “人们可以想象聊天机器人通过引导夫妇走向妥协而不屈服于愤怒或厌倦来调解关系治疗” 克里斯塔克斯博士说。这篇文章还引用了最近的一项研究,研究社交媒体机器人如何“羞辱”贬损性的推文,并降低 twitter 上种族诽谤的使用。
“现在怎么办?”人工智能对话
我想在我们继续之前,这里的一个快速图表会对我们有所帮助。关于如何区分深度学习、机器学习和人工智能,一直存在很多困惑。这是一个很容易模糊的对话,但理解其中的差异是找出什么适合你的业务目标的关键一步。
https://www.forbes.com/sites/greatspeculations/2017/10/25/getting-ready-for-prime-time-of-artificial-intelligence-investing/1#69daf8ea2010
通常,我们看到人工智能作为一个总括术语被用来涵盖右边概述的情况,但是让我们先做一点手脚,然后再深入。当我想到人工智能时,我会想到“马尔默项目”,这是微软研究&开发的新方法的一部分。它涉及一个人工智能代理和一个人类玩家在一个名为《我的世界》的游戏中合作建造物体。人类玩家教人工智能代理如何使用特定的工具来达到游戏的最佳水平,然后人工智能代理教人类玩家它自己学到的课程。深度学习更多地涉及一个多层神经系统,当它熟悉新数据时,它具有依次辨别和发现的精细能力——想想图像识别和机器需要做的所有事情,以识别手持冲浪板的女人和红色敞篷车之间的差异。
https://www.statista.com/chart/6810/the-future-of-ai/
我看到的今天在企业中使用最多的用例是数字化的开端,是使用机器学习从新的见解中派生和自动化的。他们使用训练有素的模型来发现用例中的模式,以检测设备故障的原因和如何预测未来的故障,以及实时提供维护呼叫、智能采购零件和为技术人员提供潜在故障和需要哪些零件/工具的智能所需的措施,从而大幅降低运营成本和减少停机时间。一个好的机器学习工作流程通常是这样的:
- 数据采集:寻找相关数据,开始评估你关心的变量,当然,还要确保这些数据是干净的,可供消费
- 分析:人工定位和理解模式,数据科学的基础
- 重塑:加入函数和数理统计,以确保正确的分类,并遵循连续迭代的流程
- 建模:使用引擎创建一个模型,这不是一次性事件,该过程在特定的时间盒内反复重复
- 提炼:做上面的步骤来增加准确的概率,模型越准确,预测就越好,越可信
- 部署:由应用程序提供,随时可供员工或客户使用
随着我们从移动优先云优先技术生态系统转变为智能云智能边缘生态系统,企业现在将能够发现新的数据环境,识别模式,并在用户授权的最尖端进行计算和发布:通过多传感器和多设备,在“边缘”。
https://www.gartner.com/technology/research/methodologies/hype-cycle.jsp
正如我们从上面 Gartner 的炒作周期中可以看到的,我们可以尝试走在像 AI 这样的新技术现在是否值得投资的前面,或者我们是否已经迟到了。根据图表,我们正处于 AI/ML/Cognition 取得一些巨大成功的时期,但也有许多失败。随着我们通过“幻灭的低谷”接近下一个 5 年,确保组织与人工智能提供商保持一致将是极其重要的,这些提供商将继续与您、企业一起发展他们的思维方式、技能和工具集。这不仅仅意味着说“我们已经完成了机器学习项目”,而是学习有多少项目成功了,哪些项目失败了,以及从那些失败中学到了什么。
所以让我们开始吧!…
在微软的“数字转型学院”(一个为微软销售组织提供的学习体验)期间,我看到了由 凯捷 (一个专门帮助企业围绕见解和数据制定战略的合作伙伴)所做的令人信服的演示,内容是人工智能项目必须成功的关键要素,以及商业领袖在驾驭可能性艺术时应该关注的问题:
…对这些项目的数据有很好的理解,数据&人工智能只是达到目的的手段,而不是解决方案本身,所有人工智能项目都需要一种愿意改变的文化,并且必须以信任为中心,因为这是与人工智能互动的基石。
请随时发表评论进行更多讨论,也可以在 LinkedIn 上关注我。
具有交互代码的宽剩余网络
原文:https://towardsdatascience.com/wide-residual-networks-with-interactive-code-f9ef6b0bab29?source=collection_archive---------9-----------------------
Gif from this website
我的期末考试终于结束了,我想通过实现 wide res net 来庆祝一下。此外,这将是一个很短的帖子,因为我想回到写博客的心情,希望我不会让你失望!
广残网
Image from this website
红框 →卷积神经网络中增加的特征图数量
该论文的作者称之为宽残差网络的主要原因是由于每一层的特征地图大小的增加。如上所述,当我指的是特征图大小时,我指的是在每个卷积层上创建的通道数,但是,请记住,该特征图大小也可以减小。
网络架构(层/全/面向对象)
红框 →我们要实现的网络层。
每一层与传统的残差网络几乎相同,然而如上所述,特征图的数量已经增加。现在,让我们来看看我们将要使用的完整网络体系结构。另外,请注意,上图中没有显示批处理规范化和 ReLu()激活。
以上是我们将要实施的完整网络架构,我们可以观察到两个变量,即 N 和 k。这里 k 是我们希望每层的特征图增加多少,N 是每层中卷积块的数量。因此,对于我们的网络,我将 N 设置为 1,K 设置为 8,因此我们的网络只有 8 层,但每层都有许多特征地图。现在让我们看看网络的 OOP 形式。
如上所述,网络本身并不深,但是我们可以观察到每一层都有大量的要素地图。
优化
正如上文所见,原始论文使用了具有内斯特罗夫动量的 SGD,对我来说,我将使用 ADAM,当然这将使模型过度拟合训练数据,有关此主题的更多信息请单击此处。
结果
左上 →训练精度随时间变化
右上 →训练成本随时间变化
左下 →测试精度随时间变化
右下 →测试成本随时间变化
考虑到 CIFAR 10 数据集由 50000 幅训练图像和 10000 幅测试图像组成,我们的 8 层宽 Resnet 仅在训练图像上表现良好。然而,我们可以清楚地观察到,该模型已经过度拟合于训练数据。(测试图像的最佳准确度只有 17%。)
互动代码/透明度
对于 Google Colab,你需要一个 Google 帐户来查看代码,而且你不能在 Google Colab 中运行只读脚本,所以在你的操场上复制一份。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要获取这篇文章的代码,请点击这里。
为了让这个实验更加透明,我已经将我的命令窗口的所有输出上传到我的 Github,要从我的 cmd 访问输出,请点击这里。
最后的话
看到结果令人失望,但我很有信心用正确的正则化技术,这个网络会表现得更好。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站。
同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考
- Zagoruyko 和 n . Komodakis(2016 年)。广泛的剩余网络。arXiv 预印本 arXiv:1605.07146 。
- 神经网络 PyTorch 教程 0.4.0 文档。(2018).Pytorch.org。检索于 2018 年 4 月 27 日,来自http://py torch . org/tutorials/beginner/blitz/neural _ networks _ tutorial . html
- SGD >亚当??哪一个是最好的优化程序:狗对猫玩具实验。(2017).萨卢。检索于 2018 年 4 月 27 日,来自https://Shao anlu . WordPress . com/2017/05/29/SGD-all-the-one-is-the-best-optimizer-dogs-vs-cats-toy-experiment/
- CIFAR-10 和 CIFAR-100 数据集。(2018).Cs.toronto.edu。检索于 2018 年 4 月 27 日,来自https://www.cs.toronto.edu/~kriz/cifar.html
维基百科数据科学:与世界上最大的百科全书合作
原文:https://towardsdatascience.com/wikipedia-data-science-working-with-the-worlds-largest-encyclopedia-c08efbac5f5c?source=collection_archive---------3-----------------------
如何以编程方式下载和解析维基百科
(Source)
维基百科是现代人类最令人印象深刻的创造之一。谁会想到在短短几年内,匿名的免费贡献者可以创造出世界上前所未有的最大的在线知识来源?维基百科不仅是获取写大学论文信息的最佳地方,而且它还是一个极其丰富的数据来源,可以推动从自然语言处理到监督机器学习的众多数据科学项目。
维基百科的规模使得它既是世界上最大的百科全书,也有点让人望而生畏。然而,使用合适的工具,大小不是问题,在本文中,我们将介绍如何以编程方式下载并解析所有英语维基百科。
在此过程中,我们将讨论数据科学中的许多有用主题:
- 从网络上查找并以编程方式下载数据
- 使用 Python 库解析 web 数据(HTML、XML、MediaWiki)
- 使用多处理/多线程并行运行操作
- 寻找问题最优解的标杆方法
这个项目最初的动力是收集维基百科上每一本书的信息,但我很快意识到所涉及的解决方案有更广泛的适用性。这里介绍的技术和随附的 Jupyter 笔记本将让您有效地处理维基百科上的任何文章,并且可以扩展到其他 web 数据源。
如果您想了解更多关于如何利用本文中的数据,我写了一篇文章,使用神经网络嵌入构建了一个图书推荐系统。
包含本文 Python 代码的笔记本是 GitHub 上的。这个项目的灵感来自 Douwe Osinga 的优秀的深度学习食谱,大部分代码都改编自这本书。这本书非常值得,你可以在 GitHub 上免费获得 Jupyter 笔记本。
以编程方式查找和下载数据
任何数据科学项目的第一步都是访问您的数据!虽然我们可以向维基百科页面发出个人请求,并抓取结果,但我们很快就会遇到速率限制,不必要地增加维基百科服务器的负担。相反,我们可以通过维基媒体在 dumps.wikimedia.org 的访问所有维基百科的转储。(转储是指数据库的定期快照)。
英文版在dumps.wikimedia.org/enwiki。我们使用下面的代码查看数据库的可用版本。
import requests# Library for parsing HTML
from bs4 import BeautifulSoupbase_url = '[https://dumps.wikimedia.org/enwiki/'](https://dumps.wikimedia.org/enwiki/')
index = requests.get(base_url).text
soup_index = BeautifulSoup(index, 'html.parser')# Find the links on the page
dumps = [a['href'] for a in soup_index.find_all('a') if
a.has_attr('href')]
dumps**['../',
'20180620/',
'20180701/',
'20180720/',
'20180801/',
'20180820/',
'20180901/',
'20180920/',
'latest/']**
这段代码利用了BeautifulSoup
库来解析 HTML。鉴于 HTML 是网页的标准标记语言,它是处理网络数据的无价库。
对于这个项目,我们将在 2018 年 9 月 1 日进行转储(一些转储不完整,因此请确保选择一个包含您需要的数据的转储)。为了在转储中找到所有可用的文件,我们使用以下代码:
dump_url = base_url + '20180901/'# Retrieve the html
dump_html = requests.get(dump_url).text# Convert to a soup
soup_dump = BeautifulSoup(dump_html, 'html.parser')# Find list elements with the class file
soup_dump.find_all('li', {'class': 'file'})[:3]**[<li class="file"><a href="/enwiki/20180901/enwiki-20180901-pages-articles-multistream.xml.bz2">enwiki-20180901-pages-articles-multistream.xml.bz2</a> 15.2 GB</li>,
<li class="file"><a href="/enwiki/20180901/enwiki-20180901-pages-articles-multistream-index.txt.bz2">enwiki-20180901-pages-articles-multistream-index.txt.bz2</a> 195.6 MB</li>,
<li class="file"><a href="/enwiki/20180901/enwiki-20180901-pages-meta-history1.xml-p10p2101.7z">enwiki-20180901-pages-meta-history1.xml-p10p2101.7z</a> 320.6 MB</li>]**
同样,我们使用BeautifulSoup
解析网页来查找文件。我们可以去https://dumps.wikimedia.org/enwiki/20180901/手动寻找要下载的文件,但那样效率会很低。考虑到网络上有多少数据,知道如何解析 HTML 并在程序中与网站交互是一项非常有用的技能。学习一点网络搜集,大量新的数据来源变得容易获得。(这里有一个教程让你入门)。
决定下载什么
上面的代码在转储中查找所有文件。这包括几个下载选项:只有文章的当前版本,文章和当前讨论,或者文章和所有过去的编辑和讨论。如果我们选择后者,我们会看到几兆兆字节的数据!对于这个项目,我们将只关注文章的最新版本。本页有助于根据您的需求确定要获取哪些文件。
所有文章的当前版本都作为一个文件提供。然而,如果我们得到的是单个文件,那么当我们解析它时,我们将不得不按顺序浏览所有的文章——一次一篇——这是一种非常低效的方法。更好的选择是下载分区文件,每个文件包含文章的一个子集。然后,正如我们将看到的,我们可以通过并行化一次解析多个文件,从而大大加快这个过程。
当我处理文件时,我宁愿有许多小文件,而不是一个大文件,因为这样我可以对文件进行并行操作。
分区文件以 bz2 压缩 XML(扩展标记语言)的形式提供。每个分区的大小约为 300–400 MB,总压缩大小为 15.4 GB。我们不需要解压缩文件,但如果您选择这样做,整个大小约为 58 GB。对于人类的所有知识来说,这似乎并不算太大!(好吧,不是全部知识,但还是)。
Compressed Size of Wikipedia (Source).
下载文件
要真正下载文件,Keras 实用程序get_file
非常有用。这将在链接处下载一个文件,并将其保存到磁盘。
from keras.utils import get_filesaved_file_path = get_file(file, url)
文件保存在~/.keras/datasets/
中,这是 Keras 的默认保存位置。一次下载一个文件需要 2 个多小时。(您可以尝试并行下载,但是当我尝试同时发出多个请求时,我遇到了速率限制。)
解析数据
看起来我们想做的第一件事就是解压文件。然而,事实证明我们实际上并不需要这样做来访问文章中的所有数据!相反,我们可以通过一次解压缩和处理一行来迭代地处理文件。如果我们处理不适合内存的大型数据集,遍历文件通常是唯一的选择。
要遍历一个bz2
压缩文件,我们可以使用bz2
库。不过在测试中,我发现一个更快的选择是用subprocess
Python 模块调用系统实用程序 bzcat
。这说明了一个关键点:通常,一个问题有多种解决方案,找到最有效的解决方案的唯一方法是对选项进行基准测试。这可以像使用%%timeit
Jupyter 细胞魔法计时方法一样简单。
有关完整的细节,请参阅笔记本,但是迭代解压缩文件的基本格式是:
data_path = '~/.keras/datasets/enwiki-20180901-pages-articles15.xml-p7744803p9244803.bz2# Iterate through compressed file one line at a time
for line in subprocess.Popen(['bzcat'],
stdin = open(data_path),
stdout = subprocess.PIPE).stdout:
# process line
如果我们简单地读入 XML 数据并将其附加到一个列表中,我们会得到如下所示的结果:
Raw XML from Wikipedia Article.
这显示了来自一篇维基百科文章的 XML。我们下载的文件包含数百万行这样的内容,每个文件中有数千篇文章。如果我们真的想让事情变得困难,我们可以使用正则表达式和字符串匹配来查找每篇文章。考虑到这是非常低效的,我们将采用一种更好的方法,使用定制的工具来解析 XML 和维基百科风格的文章。
解析方法
我们需要在两个层次上解析文件:
- 从 XML 中提取文章标题和文本
- 从文章正文中提取相关信息
幸运的是,在 Python 中这两种操作都有很好的选择。
解析 XML
为了解决定位文章的第一个问题,我们将使用 SAX 解析器,它是“XML 的简单 API”BeautifulSoup
也可用于解析 XML,但这需要将整个文件加载到内存中,并构建文档对象模型(DOM)。另一方面,SAX 一次处理一行 XML,这非常适合我们的方法。
我们需要执行的基本思想是搜索 XML 并提取特定标签之间的信息(如果您需要 XML 的介绍,我建议从这里的开始)。例如,给定下面的 XML:
<title>Carroll F. Knicely</title>
<text xml:space="preserve">\'\'\'Carroll F. Knicely\'\'\' (born c. 1929 in [[Staunton, Virginia]] - died November 2, 2006 in [[Glasgow, Kentucky]]) was [[Editing|editor]] and [[Publishing|publisher]] of the \'\'[[Glasgow Daily Times]]\'\' for nearly 20 years (and later, its owner) and served under three [[Governor of Kentucky|Kentucky Governors]] as commissioner and later Commerce Secretary.\n'
</text>
我们想要选择标签<title>
和<text>
之间的内容。(标题简单来说就是维基百科页面标题,正文就是文章内容)。SAX 将让我们使用一个parser
和一个ContentHandler
来完成这项工作,T3 控制传递给解析器的信息是如何处理的。我们一次一行地将 XML 传递给解析器,内容处理程序让我们提取相关信息。
如果不亲自尝试,这有点难以理解,但其思想是内容处理程序寻找某些开始标记,当它找到一个时,它将字符添加到缓冲区,直到遇到相同的结束标记。然后,它将缓冲区内容保存到一个字典中,并将标签作为键。结果是我们得到一个字典,其中键是标签,值是标签之间的内容。然后我们可以将这个字典发送给另一个函数来解析字典中的值。
我们需要编写的 SAX 的唯一部分是内容处理程序。这一点完整地显示在下面:
Content Handler for SAX parser
在这段代码中,我们寻找标签title
和text
。每当解析器遇到其中的一个,它都会将字符保存到buffer
中,直到遇到相同的结束标记(由</tag>
标识)。此时,它会将缓冲区内容保存到一个字典— self._values
。文章由<page>
标签分隔,因此如果内容处理程序遇到结束</page>
标签,那么它应该将self._values
添加到文章列表中,self._pages
。如果这有点令人困惑,那么也许看到它的运行会有所帮助。
下面的代码展示了我们如何使用它来搜索 XML 文件以找到文章。现在我们只是将它们保存到handler._pages
属性,但是稍后我们会将文章发送到另一个函数进行解析。
# Object for handling xml
handler = WikiXmlHandler()# Parsing object
parser = xml.sax.make_parser()
parser.setContentHandler(handler)# Iteratively process file
for line in subprocess.Popen(['bzcat'],
stdin = open(data_path),
stdout = subprocess.PIPE).stdout:
parser.feed(line)
# Stop when 3 articles have been found
if len(handler._pages) > 2:
break
如果我们检查handler._pages
,我们会看到一个列表,其中的每个元素都是一个元组,包含一篇文章的标题和文本:
handler._pages[0]**[('Carroll Knicely',
"'''Carroll F. Knicely''' (born c. 1929 in [[Staunton, Virginia]] - died November 2, 2006 in [[Glasgow, Kentucky]]) was [[Editing|editor]] and [[Publishing|publisher]] ...)]**
至此,我们已经编写了可以成功识别 XML 中的文章的代码。这使我们完成了解析文件的一半过程,下一步是处理文章本身以找到特定的页面和信息。再一次,我们将转向为该任务而构建的工具。
解析维基百科文章
维基百科运行在一个名为 MediaWiki 的软件上。这意味着文章遵循标准格式,使得以编程方式访问其中的信息变得简单。虽然一篇文章的文本可能看起来只是一个字符串,但由于格式的原因,它编码了更多的信息。为了有效地获取这些信息,我们引入了强大的mwparserfromhell
,一个为 MediaWiki 内容而构建的库。
如果我们将一篇维基百科文章的文本传递给mwparserfromhell
,我们会得到一个Wikicode
对象,它带有许多对数据进行排序的方法。例如,下面的代码从一篇文章(关于 KENZ FM )创建一个 wikicode 对象,并在文章中检索wikilinks()
。这些都是指向其他维基百科文章的链接:
import mwparserfromhell# Create the wiki article
wiki = mwparserfromhell.parse(handler._pages[6][1])# Find the wikilinks
wikilinks = [x.title for x in wiki.filter_wikilinks()]
wikilinks[:5]**['Provo, Utah', 'Wasatch Front', 'Megahertz', 'Contemporary hit radio', 'watt']**
有许多有用的方法可以应用到wikicode
中,比如查找评论或者搜索特定的关键词。如果您想获得一个干净的文章文本,请拨打:
wiki.strip_code().strip()**'KENZ (94.9 FM, " Power 94.9 " ) is a top 40/CHR radio station broadcasting to Salt Lake City, Utah '**
既然我的最终目标是找到所有关于书籍的文章,那么问题就来了,是否有办法使用这个解析器来识别某个类别的文章?幸运的是,答案是肯定的,使用 MediaWiki 模板。
文章模板
模板是记录信息的标准方式。维基百科上有许多模板,但与我们的目的最相关的是Infoboxes
。这些是为文章的摘要信息编码的模板。例如,《战争与和平》的信息框是:
维基百科上的每一类文章,如电影、书籍或电台,都有自己的信息框。以书籍为例,infobox 模板被方便地命名为Infobox book
。同样有用的是,wiki
对象有一个名为filter_templates()
的方法,允许我们从文章中提取特定的模板。因此,如果我们想知道一篇文章是否是关于一本书的,我们可以为图书信息框过滤它。如下所示:
# Filter article for book template
wiki.filter_templates('Infobox book')
如果有匹配的,那我们就找到了一本书!要找到您感兴趣的文章类别的信息框模板,请参考信息框列表。
我们如何将解析文章的mwparserfromhell
与我们编写的 SAX 解析器结合起来?我们修改了内容处理程序中的endElement
方法,将包含文章标题和文本的值字典发送给一个函数,该函数搜索指定模板的文章文本。如果该函数找到我们想要的文章,它从文章中提取信息,然后返回给handler
。首先,我将展示更新后的endElement
:
def endElement(self, name):
"""Closing tag of element"""
if name == self._current_tag:
self._values[name] = ' '.join(self._buffer) if name == 'page':
self._article_count += 1
# Send the page to the process article function
book = process_article(**self._values,
template = 'Infobox book')
# If article is a book append to the list of books
if book:
self._books.append(book)
现在,一旦解析器到达文章的末尾,我们就将文章发送给函数process_article
,如下所示:
Process Article Function
虽然我在找书,但是这个功能可以用来在维基百科上搜索任何类别的文章。只需将template
替换为该类别的模板(例如Infobox language
来查找语言),它将只返回该类别中文章的信息。
我们可以在一个文件上测试这个函数和新的ContentHandler
。
**Searched through 427481 articles.
Found 1426 books in 1055 seconds.**
让我们来看看一本书的输出:
books[10]**['War and Peace',
{'name': 'War and Peace',
'author': 'Leo Tolstoy',
'language': 'Russian, with some French',
'country': 'Russia',
'genre': 'Novel (Historical novel)',
'publisher': 'The Russian Messenger (serial)',
'title_orig': 'Война и миръ',
'orig_lang_code': 'ru',
'translator': 'The first translation of War and Peace into English was by American Nathan Haskell Dole, in 1899',
'image': 'Tolstoy - War and Peace - first edition, 1869.jpg',
'caption': 'Front page of War and Peace, first edition, 1869 (Russian)',
'release_date': 'Serialised 1865–1867; book 1869',
'media_type': 'Print',
'pages': '1,225 (first published edition)'},
['Leo Tolstoy',
'Novel',
'Historical novel',
'The Russian Messenger',
'Serial (publishing)',
'Category:1869 Russian novels',
'Category:Epic novels',
'Category:Novels set in 19th-century Russia',
'Category:Russian novels adapted into films',
'Category:Russian philosophical novels'],
['https://books.google.com/?id=c4HEAN-ti1MC',
'https://www.britannica.com/art/English-literature',
'https://books.google.com/books?id=xf7umXHGDPcC',
'https://books.google.com/?id=E5fotqsglPEC',
'https://books.google.com/?id=9sHebfZIXFAC'],
'2018-08-29T02:37:35Z']**
对于维基百科上的每一本书,我们都有来自作为字典的Infobox
的信息、内部wikilinks
、外部链接和最近编辑的时间戳。(我正专注于这些信息,为我的下一个项目建立一个图书推荐系统)。您可以修改process_article
函数和WikiXmlHandler
类来查找您需要的任何信息和文章!
如果你只看处理一个文件的时间,1055 秒,乘以 55,你得到超过 15 小时的所有文件的处理时间!当然,我们可以通宵运行,但如果没有必要,我不想浪费额外的时间。这就引出了我们将在本项目中涉及的最后一项技术:使用多处理和多线程的并行化。
并行运行操作
我们希望一次处理几个文件,而不是一次解析一个文件(这就是我们下载分区的原因)。我们可以通过多线程或多处理使用并行化来实现这一点。
多线程和多重处理
多线程和多处理是在一台或多台计算机上同时执行许多任务的方法。我们在磁盘上有许多文件,每个文件都需要以同样的方式进行解析。一种简单的方法是一次解析一个文件,但这并没有充分利用我们的资源。相反,我们使用多线程或多重处理来同时解析许多文件,大大加快了整个过程。
一般来说,对于输入/输出受限的任务,例如读入文件或发出请求,多线程工作得更好(更快)。多重处理对 cpu 受限的任务更有效(更快)(来源)。对于解析文章的过程,我不确定哪种方法是最佳的,所以我再次用不同的参数对它们进行了基准测试。
学习如何设置测试和寻找不同的方法来解决问题,将使你在数据科学或任何技术职业生涯中走得更远。
(测试多线程和多处理的代码出现在笔记本的最后)。当我运行测试时,我发现多处理快了近 10 倍,这表明这个过程可能是 CPU 受限的(有限的)。
Processing results (left) vs threading results (right).
学习多线程/多处理对于提高数据科学工作流的效率至关重要。我推荐这篇文章来开始了解这些概念。(我们将坚持使用内置的multiprocessing
库,但是您也可以使用 Dask 进行并行化,就像在这个项目中一样)。
在运行了大量测试后,我发现处理文件最快的方法是使用 16 个进程,每个进程对应我电脑的一个内核。这意味着我们可以一次处理 16 个文件,而不是 1 个!我鼓励任何人测试多处理/多线程的一些选项,并让我知道结果!我仍然不确定我用最好的方式做了事情,我总是愿意学习。
设置并行代码
要并行运行一个操作,我们需要一个service
和一组tasks
。服务只是一个函数,任务在一个 iterable 中——比如一个列表——每个任务我们都发送给函数。为了解析 XML 文件,每个任务都是一个文件,函数将接收文件,找到所有的书籍,并将它们保存到磁盘。该函数的伪代码如下:
def find_books(data_path, save = True):
"""Find and save all the book articles from a compressed
wikipedia XML file. """ # Parse file for books if save:
# Save all books to a file based on the data path name
运行该函数的最终结果是从发送到该函数的文件中保存一个图书列表。这些文件被保存为json
,这是一种机器可读的格式,用于编写嵌套信息,如列表和字典列表。我们要发送给这个函数的任务都是压缩文件。
# List of compressed files to process
partitions = [keras_home + file for file in os.listdir(keras_home) if 'xml-p' in file]
len(partitions), partitions[-1]**(55, '/home/ubuntu/.keras/datasets/enwiki-20180901-pages-articles17.xml-p11539268p13039268.bz2')**
对于每个文件,我们希望将其发送到find_books
进行解析。
搜索整个维基百科
搜索维基百科上每篇文章的最终代码如下:
from multiprocessing import Pool# Create a pool of workers to execute processes
pool = Pool(processes = 16)# Map (service, tasks), applies function to each partition
results = pool.map(find_books, partitions)pool.close()
pool.join()
我们将每个任务map
给服务,找到书籍的函数(映射是指将函数应用到 iterable 中的每一项)。16 个进程并行运行,我们可以在 3 小时内搜索所有维基百科!运行代码后,每个文件中的书籍都保存在磁盘上单独的 json 文件中。
用多线程读取和连接文件
为了练习编写并行代码,我们将使用多个进程读取单独的文件,这次使用线程。multiprocessing.dummy
库提供了线程模块的包装器。这次服务是read_data
,任务是保存在磁盘上的文件:
多线程代码的工作方式完全相同,mapping
任务在一个 iterable 中运行。一旦我们有了列表的列表,我们就把它展平成一个列表。
print(f'Found {len(book_list)} books.')**Found 37861 books.**
根据我们的统计,维基百科有近 38,000 篇关于书籍的文章。包含所有图书信息的最终json
文件的大小只有大约 55 MB,这意味着我们搜索了超过 50 GB(未压缩)的总文件,找到了 55 MB 的图书!鉴于我们只保留了图书信息的有限子集,这是有意义的。
我们现在有维基百科上每一本书的信息。您可以使用相同的代码来查找您选择的任何类别的文章,或者修改函数来搜索不同的信息。使用一些相当简单的 Python 代码,我们能够搜索数量惊人的信息。
Size of Wikipedia if printed in volumes (Source).
结论
在本文中,我们看到了如何下载和解析维基百科的整个英文版本。拥有大量的数据是没有用的,除非我们能够理解它,因此我们开发了一套方法来有效地处理我们项目所需信息的所有文章。
在整个项目中,我们涵盖了许多重要的主题:
- 以编程方式查找和下载数据
- 以高效的方式解析数据
- 并行运行操作以充分利用我们的硬件
- 设置和运行基准测试以找到有效的解决方案
在这个项目中开发的技能非常适合维基百科数据,但也广泛适用于来自网络的任何信息。我鼓励你将这些方法应用到自己的项目中,或者尝试分析不同类别的文章。有足够的信息供每个人做自己的项目!(我正在利用神经网络中的实体嵌入,用维基百科的文章制作一个图书推荐系统。)
维基百科是一个令人难以置信的人类策划的信息来源,我们现在知道如何通过编程访问和处理它来使用这一巨大的成就。我期待着写更多的维基百科数据科学。与此同时,这里介绍的技术具有广泛的适用性,所以走出去,找到一个问题来解决!
一如既往,我欢迎反馈和建设性的批评。可以通过推特 @koehrsen_will 或者我的个人网站 willk.online 找到我。
野火破坏——森林火灾的随机森林分类
原文:https://towardsdatascience.com/wildfire-destruction-a-random-forest-classification-of-forest-fires-e08070230276?source=collection_archive---------5-----------------------
我们能预测野火会变得多大吗?
Image by Mike McMillan on baynature
信不信由你,美国每年大约有 80,000 起野火。其中大多数都很小,很少被注意到,只影响到几英亩无人居住的乡村,但有些会变成咆哮的、无法控制的森林大火,摧毁它所经之处的一切。2017 年 10 月至 12 月,仅在北加州(www.insurance.ca.gov)与野火相关的保险索赔就达到近 120 亿美元。不出所料,野火也非常危险,据报道,在 1920 年至 2015 年间,野火夺去了 1114 条生命(【www.nifc.gov】)。我们所能了解的任何关于引起野火的原因、推动其规模和蔓延的因素以及以任何方式对其行为有所贡献的因素的信息,都可能有利于灭火和预防工作,因此对于这个项目,我建立了一个模型来预测野火的规模,该模型使用了 1992 年至 2015 年约 188 万起火灾的信息,这些信息可在美国林务局档案馆找到,并整合了来自伯克利地球、劳伦斯伯克利国家实验室的历史气温数据(下面提供了链接)。
特性、探索性数据分析和基线
Photo by Skitterphotoon on pixabay
美国使用一个分类系统,根据燃烧的总面积对野火进行分类,A 类燃烧不到 1/4 英亩,G 类燃烧超过 5000 英亩。我收集了用于分析的要素,例如发现野火的州、火灾发生地的所有者(联邦、州、部落、私人等)。),火灾的最初起因(闪电、烟火、营火等。)、经度、纬度、气温;然后,我从已经获得的信息中设计了一些额外的特征,例如每个州的火灾总数和年平均气温。通过 SQL 将这些信息加载到 Python3 中,我隔离了 20%的总体数据(约 367,000 起火灾)作为子样本,以减少计算量,确保它是随机分层的,以便每个目标火灾规模类别在我的子样本中按比例表示,就像它们在我的完整数据集中一样。接下来,我将基于距离的逻辑回归和基于树的随机森林分类器(RFC)用于我的子样本,使用 5 重交叉验证技术,80%训练,20%验证基线分离,结果令人失望。
Image by Author
你可以在上面看到,逻辑回归对类别“C”到“G”产生了 0.00 的召回率,基本上说它没有成功地将任何火灾分类到这些组中,这是不好的。右边的随机森林分类器也好不到哪里去。
Video by Author
为了理解为什么我的模型对较大火灾的预测如此之差,我回到了完整的数据集,并探索了火灾类别的分布,结果表明,火灾小于 10 英亩的两个大小类别“A”和“B”构成了我的数据点的绝大部分;此外,与大多数其他类别相比,“G”类火灾的数量极低。这种火灾数量的不平衡在我的两个模型中都引起了非常明显的偏差。另一个非常重要的不平衡是,我没有量化每个类别中有多少起火灾,而是看了每个类别累计燃烧了多少英亩。通过这种方式,数据显示“G”类火灾虽然只占全国所有野火的 0.2%,但实际上已经燃烧了所有野火面积的 75%。上面是一个我用来说明这种关系的 D3 动画视频,第一个图形显示了火灾数量的不平衡,然后图形过渡到显示总燃烧面积的不平衡。红色部分代表全国最具破坏性、最危险和最罕见的火灾,因此,它预测这些“G”类火灾是我的模型的重点。
调整模型
因此,我回到了我的基线模型,并实施了权重分类来补偿数据点中的不平衡,这指示模型在训练时更加重视属于较罕见火大小的数据点的特征。在用新参数重新拟合和重新测试这两个模型之后,随机森林分类器再次优于逻辑回归以及其他基于距离的模型,所以我继续使用 RFC。这里需要注意的一个方面是,由于 RFC 是一个基于树的模型,并且不依赖于点之间的距离,所以我能够包括一些我最初收集的特征,但是直到现在还没有包括,因为数据不完整,使它们与逻辑回归不兼容。因为我想要两种模型类型的真实比较,所以我需要使用相同的数据作为基线。既然我已经决定了 RFC,并且基于树的方法不仅对于处理空值是健壮的,而且实际上可以收集包含在数据丢失的事实中的信息,我可以重新集成被排除的数据。除了添加包含空值的特征之外,我还能够使用 RFC 模型中的特征重要性分数来消除一些很少使用并且没有区分火灾规模等级的信号的特征。
Photo by Ylvers on pixabay
在调优我的 RFC 时,最终对最高优先级目标类的召回产生显著影响的超参数是:模型在决定在哪里对数据进行分割时考虑的特征的数量,我在我的树模型集合“森林”的每棵树内允许的最大分割数量,在数据中创建内部分割所需的最小样本数量,以及在每棵树上创建终止叶节点所需的最小样本数量。一旦我在 20%分层子样本上拨入我的模型,我就用 Amazon Web Services 初始化一个实例,该实例具有足够的 RAM 和处理能力来在我的 188 万行上运行这些集成模型,使用另外 80%-20%的分割进行训练和测试,并重新调整我的模型,再次使用 5-CV K-Fold 方法来防止来自随机数据模式的误导性错误度量,最后在最终调整之前,我根据测试数据评估我的模型。
最终评估
Image by Author
最终的“G”级召回分数为 0.62,这个模型已经从它开始的地方走了很长的路。“G”精度测量有多少来自其他类别的火灾被错误地标记为“G ”,而召回测量有多少“G”火灾被正确地放置在“G”中。不幸的是,精确度非常差,但这只是我不得不做出的决定,也是我不得不接受的权衡。对于这个模型,我决定,我宁愿有一些小火,也许会得到额外的关注,被遏制,并最终成为假警报,以尽量减少潜在的巨大,破坏性火灾的数量。
这个模型能教给我们什么
除了我的随机森林分类器模型的基本预测能力(通过回忆最危险大小类别进行评估)之外,还有最后一个要点需要提出,即当查看我的最终模型的特征重要性分数时,我的模型使用最多的三个特征,以及在学习如何区分火灾大小类别时提供最多收益的三个特征是:经度、纬度和气温。这很重要,因为经度和纬度都可以代表真实的环境条件,如气温、湿度、降雨量、风力和海拔,我的模型确定,在预测野火的最终燃烧规模时,这些因素比初始原因和财产所有者等特征更有影响。从这个项目一开始,我就想在我的分析中加入更多的环境因素,但是时间限制了我在数据采集和数据争论上投入的精力。有了这些结果,如果我要继续改进这个模型,我肯定会将额外的环境特征集成到我的随机森林分类器中,希望增加它的预测能力。
一个真正准确、维护良好的模型可以实时识别在什么条件下野火最有可能蔓延到危险和破坏性的规模,从而帮助灭火专业人员有效地分配资源,并将他们的努力引向最具潜在破坏性的火灾,防止财产损失和拯救生命。
资源
野火数据:
Short,Karen C. 2017。美国 1992–2015 年的空间野火发生数据[FPA_FOD_20170508]。第四版。柯林斯堡,CO:林务局研究数据档案。https://doi.org/10.2737/RDS-2013-0009.4T5https://www.kaggle.com/rtatman/188-million-us-wildfires
气温数据:
http://berkeleyearth.org/data/
https://www . ka ggle . com/berkeleyearth/climate-change-earth-surface-Temperature-Data
AI 会杀验证码吗?
原文:https://towardsdatascience.com/will-ai-kill-captchas-9d3bd07c3973?source=collection_archive---------3-----------------------
你好,
如果你过去 15 年没有呆在山洞里,你可能会在一个网站上遇到这种事情:
验证码
这些是验证码,又名“ C 完全地A 自动的P 公共的T 在测试期间告诉 C 计算机和 H 人类 A 部分】。基本上,这是一种检查你的网站是否被人或机器人使用的方法。防止垃圾邮件非常有用。这些年来,它已经演变了很多,在机器人制造商背后正在玩一场“猫和老鼠”的游戏,他们努力自动解决这些问题,因为一旦你设法解决了这些问题,你就可以在大规模的在线上做几乎所有的事情,而不会被阻止。主要是黑帽(邪恶黑客)的东西,但不一定。
基本上,滥用系统。
例如,假设您有一项租借服务器的服务。您可以免费试用服务器 2 小时。如果它受到验证码的保护,作为一个机器人制造商,你不能滥用这个系统,因为它根本不可扩展:
你需要一直手动解决验证码。但是如果你能够自动注册新账户,那么你就可以有很多免费的服务器来做加密挖掘、ddos、垃圾邮件攻击等事情。
这些年来,我们看到了奇怪的字母,移动验证码和许多其他东西的出现,这些都是用传统方法解决的(又名不是人工智能)。例如,很多时候,如果你颠倒颜色(黑色变成白色,白色变成黑色)并调整对比度,你可以去掉很多垃圾(如随机的点、线等),然后解决它。
人工智能的崛起
过了一段时间,对人工智能数据的需求增加了,我们开始看到这样的验证码:
这显然是从谷歌街景的巨大图像数据库中获取的图像,这使他们能够对数千个地址进行分类,然后训练自动驾驶汽车。这也有一个好处:如果谷歌必须收集数据来解决这些问题,并且不借助收集大量人类数据无法轻松解决这些问题,那么你的普通机器人制造商肯定也不会。
这被证明是非常有效的,并持续了一段时间。但这也引起了很多批评,因为解决验证码是令人讨厌的,耗时的,对残疾人的访问非常不好。
随着人工智能和深度学习的兴起,阅读扭曲的字母或门牌号变得很容易。所以他们不得不再次胜过装瓶者。
介绍 recaptchav2:
这解决了很多以前的问题:有一个本地检查,所以大多数时候如果你没有一台可疑的计算机(例如,如果你的 ip 试图解决 200 个验证码每小时),你会通过检查,而不必解决任何问题,所以它很快,易于使用,安全,对残疾人有好处。随着大量图像要求对大量物体、建筑物等进行分类,对数据分类的需求不断增长。
问题是机器学习比以往任何时候都更好,并且在许多事情上击败了我们。这意味着,现在更难划清“是人,因为机器做不到这一点”的界限。例如,马里兰大学的一项学术研究创造了 uncaptcha ,它可以以 85%的准确率解决验证码。
85%的准确率是 HUUUGE。
随着时间的推移,机器将能够越来越好地模仿人类,所以很快验证码将变得毫无用处。
那么能做些什么呢?现在有一种越来越普遍的解决方法。
电话验证
很明显,在网上获得一个电话号码并使用该电话号码进行验证是很容易的,许多服务都提供这种功能。但是它极大地提高了账户的价格。而如果你试图在一个已知的网站上注册(steemit?😄)你可能最终会为一个已经用过的电话号码付费。
这非常非常有效,但对隐私来说也是一个可怕的消息。现在你需要一部手机才能上网,很多人会知道你的电话号码,并可以把它卖给广告商。我相信这是一件坏事,但我们真的没有其他选择来阻止垃圾邮件发送者。
感谢阅读,你们觉得怎么样?
如果你想探索这个主题,还有一些资源:
【https://www . wired . com/story/how-your-phone-number-bec-the-only-username-that-matters/【https://www.google.com/recaptcha/intro/】https://github.com/ecthros/uncaptcha
如果你喜欢我的文章,请到我的博客来看看更多关于 https://brokencode.io/的内容
人工智能会让设计师脱离设计过程吗?
原文:https://towardsdatascience.com/will-artificial-intelligence-remove-designers-from-the-design-process-5e6661430055?source=collection_archive---------1-----------------------
credit to Nathalie Foss
前言:
这是两个设计师之间的写作实验;陈亦菲 和 T5【蒂娜】潘 。设计师们同意了一个与设计学科相关的话题,并希望挑战彼此的视角。这种使用人工智能的对话有助于激发合作和讨论我们作为设计师的未来。这是关于展示可能没有被考虑到的不同观点。虽然我们同意这篇文章的重点不是在人工智能是坏还是设计师是不可替代的问题上表明立场,但我们对如何在核心价值、形式和规则制定的设计领域中对待人工智能有不同的立场。
此处阅读 Phan 的论点。
在这个时代,人工智能正在接管人类的工作,这是迫在眉睫的危险。即使是设计师,我们被认为是最有创造力的职业之一,也不排除。以一款有争议的新产品 网格 为例。网格的标语是“人工智能网站自己设计”,是一个算法驱动的网站生成器,它可以在没有任何指导的情况下自动生成体面设计的多个选择。这是计算机和算法层出不穷的一个缩影,也看起来像是设计师被从设计的核心驱逐到边缘的开始。那么,设计师是否有一天会被剔除出设计流程?人类设计师有哪些核心价值是人工智能无法替代的?
credit to The Grid
核心价值观
对设计至关重要的一点是个性。通过个性,我们识别自己,将自己与其他设计师区分开来,并发明我们自己的设计制作流程。作为人类经验的塑造者,我们将我们的直觉和感觉带入设计,将无序转化为有序。我们很难想象人工智能可以取代我们为项目带来的现场体验。但是我们如何验证人工智能是否具有潜在的人格呢?根据最近的研究,两位谷歌工程师开发了一种创新方法来测试图像识别程序是否具有相同的个性。使用由算法创建的“墨迹”图像,他们询问机器人他们看到了什么,并记录他们对每张图像的想法。结果证明,不同的机器人确实有不同的反应,这被研究人员解释为潜意识思想,但这仍然不是断言机器人肯定有个性的直接结果。
credit to Fernanda & Martin
但是性格真的是成为一名优秀设计师的决定因素吗?在潘的文章中,她认为设计不一定需要个性;她相信“设计有一个模式、算法和原则的基础,使得人工智能可以产生的项目设计成功。”对于一个普通的设计,她的论点是站得住脚的。但对于一个非凡的设计来说,打破框架和挑战原则更为关键。
艾是形 的比喻
人工智能是形式的隐喻,指的是设计中所有可见的元素以及这些元素的结合方式,包括但不限于字体、设计语言和视觉感知。人工智能可以从经典的设计实例、基本的设计原则、新潮的设计形式中学习,在形式上做出精准的选择。但形式不能主宰一切。这个问题在音乐上有一个类比。基于占主导地位的音乐形式和基本的音乐理论,程序员开发了基于风格的音乐算法,可以自动分析和生成音乐。然而,人工智能甚至无法识别非主流音乐形式,因为存在各种难以量化的评估标准。也就是说,形式化的规则无法解释音乐的基本方面。这同样适用于设计。形式可以用定义明确的标准来评估,但思想不能。
在这一点上,Phan 认为“使用人工智能作为交流想法的形式,设计师可以提出更好的解决方案来交流想法。”然而,事实是,如果你最初的想法很糟糕,单靠技术是无法拯救它的。在设计过程中,创意应该永远放在第一位。 “理念是设计的原动力,形式受理念的指引,必须服从理念。” 创意是设计师种下的种子,形式是设计师如何培育这些种子。栽培过程可以决定它看起来怎么样,但只有通过种子才能定义它的本质是什么。
规则制定者
设计师是规则的制定者。只有设计师才能定义什么是设计。人工智能可以模仿人类操纵系统内的设计语言、声音和语气、模式和组件,但整个系统是由人类设计的。设计系统统治着我们周围的一切,设计师决定了系统是什么,如何组织和互动。为了回答复杂的沟通问题并使他们的工作标准化,设计师们发明了 【系统设计的系统方法】 称为系统设计。它被用于许多学科,尤其是在信息论、运筹学和计算机科学等新领域。人工智能也包括在内。设计师制定规则,赋予机器它们的目的,并指导它们施展魔法。
在这一点上,Phan 认为,设计师可能会认为自己是规则的制定者,但人工智能迫使他们在澄清规则方面成为更好的规则制定者。诚然,设计师可以通过翻译自己的设计意图变得更加客观和清晰,但反思的过程并不一定有人工智能的参与。优秀的设计师在进行每一个设计决策时,都应该已经理解了设计原则,并养成了自我审视的习惯。设计师的力量在于他们可以自己制定和打破规则。
未来设计教育
由于人工智能,未来创意和生产工作之间的界限将更加明确。重复性任务将被卸载,这将使设计师从生产任务中解放出来,专注于创造性和基础性工作。所以我们的工作不会被拿走而是升级。那么,设计教育将会发生什么变化?作为未来的塑造者,现在是我们思考新的教学方法的时候了。
Credit to Lucien Ng’s “Artificium”
对于课程规划来说,首先会受到挑战的是我们现在的课程。像字体设计、设计语言和视觉感知等与形式相关的课程会减少甚至从教学大纲中删除吗?这些设计原则和基本知识可以被编程和激活吗?此外,将为我们开发更多课程,以适应人工智能和设计师之间的互利共生。我可以想象的一门必修课是使用新自动化系统的指南课程,其中包括学习如何用人工智能设计和使用人工智能工作。至少,要考虑设计师如何参与到算法的制作过程中。更重要的是,人工智能将促使我们重新关注设计思维的重要性。设计思维使我们能够观察和改进我们的思维过程、模式和方向。在接下来的几年中,关键问题将转移到如何建立新的系统和策略,如何应对和恢复新的情况,如何创造更有意义和持久的沟通方式。
那么什么样的设计学校适合新生代呢?这个问题没有确定的答案,但这也是我们不断挖掘、推测、挑战的原因。我们不仅是设计专业的学生,也是新一代的塑造者和新革命的创新者。有一个充满可能性的世界等待我们去探索。
大数据会破坏隐私吗?
原文:https://towardsdatascience.com/will-big-data-destroy-privacy-a7e6b04f3e75?source=collection_archive---------7-----------------------
在过去的十年里,记录的数字化和各种社交网络平台(如脸书、推特等)的兴起使得大量的个人信息可以在网上获得。这种随时可用信息的激增促使组织构建复杂的大数据应用程序,使用这些信息来分析和预测消费者的行为模式,从而为他们提供定制的选择。然而,这些应用引发了许多关于个人隐私权的问题,让我们思考我们从这些大数据解决方案中获得的好处是否真的值得牺牲我们的私人生活。
大数据的反对是基于这样一个前提,即技术对我们生活的侵扰会使我们面临潜在的威胁。目前专注于消费者趋势并使用该数据提供客户建议的公司可能最终会在这些趋势上歧视他们的客户,从而导致“数字红线”。[1]由美国政府组建的“大数据和隐私工作组”目前正在研究这一潜在问题。此外,由于公司现在几乎持续跟踪他们的消费者,他们系统中的任何泄漏或盗窃都有可能暴露消费者的所有信息。此外,随着目前收集的数据量,任何个人的真实匿名化都变得越来越困难,因此,在错误的手中,数据可能会造成相当大的损失。
然而,我们不能否认大数据的应用对社会产生了积极影响。大数据有助于检测疾病爆发,目前正被用于理解各种复杂的医疗问题。除了医疗保健,大数据分析几乎在每个领域都带来了发展,无论是预测消费者趋势,改善教育系统,预测天气现象,还是帮助建设智慧城市的交通和通信系统。如果不使用大数据分析,这些领域中的大多数都很难取得进展。因此,我们可以说,大数据的好处远远超过我们分享信息所付出的代价。
现在,考虑到大数据的优势,可以有把握地认为,在未来几年,数据分析将有助于塑造和发展许多行业。因此,我们应该专注于建立一个系统,限制利用个人隐私的机会,而不是放弃技术。其中一种方法是向最终用户提供选择加入或选择退出任何此类数据收集/分析计划的选项,例如欧洲数据保护法规制定的“被遗忘权”。此外,应制定更严格的规则,以提高所收集数据的数量和质量的透明度,并确保未经事先批准,为某一目的收集的信息不会用于其他任何地方。还应该进行检查,以防止数据被盗和泄露。
总之,我们可以说,大数据可以在许多潜在场景中用来改变数百万人的生活。然而,我们不能完全忽视技术带来的威胁,因此,政府应该制定必要的法规和制度来检查公司对这些信息的使用。用大卫·沙诺夫的话说,
我们太容易让技术工具成为那些使用它们的人的罪过的替罪羊。现代科学的产品本身没有好坏之分;决定它们价值的是它们的使用方式。[2]
[1]http://www . white house . gov/blog/2014/05/01/findings-big-data-and-privacy-work-group-review
【2】en.wikipedia.org/wiki/Instrumental_conception_of_technology
数据科学会消灭数据科学吗?
原文:https://towardsdatascience.com/will-data-science-eliminate-data-science-2b9ea0024250?source=collection_archive---------6-----------------------
我的一个朋友问了我这个问题:一个优质的 ML 即服务、数百名数据科学家思考的功能和越来越聪明的算法真的有市场吗?或者大数据甚至会接管我们的工作,因为更多的数据最终会胜过聪明的算法?
简而言之:我们所做的事情中有一些是人工智能完成的。最终,人工通用智能将淘汰数据科学家,但它不会马上到来。
不过,我发现这是一个非常好的问题。这里有一些松散联系的想法来阐述我的简短回答。
- I)数据科学的喧嚣,ii)高等教育对这种突然需求的响应速度缓慢,iii)以 IT 为中心的行业中无限的现金流所引发的人才流失这三者的结合给元数据科学家带来了巨大的压力,使她不得不自动化自己的工作。我们处于正确的位置:自动化是我们工作描述的核心。因此,如果数据科学自动化(和标准化!)会比预测的进化得更快。
出于同样的原因,我确实相信横向 mlaa(不像某些数据科学和创业的大师们)。设计良好的 MLaaS 可以为中小型企业甚至大型非 IT 公司带来价值,这些公司负担不起或不想在内部构建数据科学生态系统。 自动化 和 众包 ML 可能无法与谷歌或脸书等公司组建的顶级数据科学研发团队&竞争,但他们可以让团队中的两名成员在 60 个小时的快速培训课程后成为“数据科学家”。 - 当然有些情况下收集更多的数据是一个选择。在这些情况下,我们可以估计更多的数据会有多大的帮助(通过推断学习曲线)。在此范围内,误差主要由过度拟合引起,技巧(例如,丢失、正则化)与数据收集竞争,因此(昂贵) 数据科学时间可以与(便宜)贴标时间竞争。
- 当然,在某些情况下,即使有更多的数据,也帮不上忙。在我们的 HEP 异常挑战中,我们几乎有无限的数据,但所有现成的预测器都卡住了。我们被欠拟合所支配:我们不能用现成的技术足够好地表达(或近似)正确的预测器。不适合的问题是设计问题,这是人类智慧(有见识的、知识驱动的模型搜索)可以帮助的地方。深度网络还解决了一个不足的问题,即数据量饱和的经典计算机视觉方法(见幻灯片 8 此处)。
- 最后,当然有收集更多数据不可行的情况。很多时候分布是变化的,所以你在任何时候都只有有限的无偏数据。很多时候,数据与任务或类的数量成线性关系,所以每个任务的数据都是有限的。在这些情况下,我们被困在小数据世界中,在那里过度拟合占主导地位。通用的(自动化的,超适应的)正则化技术可能会把你带到一定的水平,但是这里没有什么比有见识的先验知识(又名领域知识)更有价值的了。无论何时你拥有领域知识,它都必须被吸收和转化,给数据科学家足够的工作保障。
当然,这只是一个关于这个话题的简短摘录。你怎么看?我们的数据科学工作有危险吗?
如果你喜欢你读的东西,就在中、 LinkedIn 、&Twitter 上关注我。
哈伯曼生存数据集上的 EDA(探索性数据分析)让你诊断癌症?
原文:https://towardsdatascience.com/will-habermans-survival-data-set-make-you-diagnose-cancer-8f40b3449673?source=collection_archive---------1-----------------------
介绍
哈伯曼的数据集包含了芝加哥大学比林斯医院在 1958 年至 1970 年间对接受乳腺癌手术的患者进行的研究数据。来源:https://www.kaggle.com/gilsousa/habermans-survival-data-set
我想解释我对这个数据集所做的各种数据分析操作,以及如何推断或预测接受手术的患者的生存状态。
首先,对于任何数据分析任务或对数据执行操作,我们都应该具有良好的领域知识,以便我们能够关联数据特征,并给出准确的结论。因此,我想解释一下数据集的特征以及它如何影响其他特征。
该数据集中有 4 个属性,其中 3 个是特征,1 个是类属性,如下所示。此外,还有 306 个数据实例。
- 腋窝淋巴结(淋巴结)数量
- 年龄
- 运营年度
- 生存状态
淋巴结:淋巴结是微小的豆状器官,沿着淋巴液通道起过滤器的作用。随着淋巴液离开乳房并最终回到血液中,淋巴结试图在癌细胞到达身体其他部位之前捕捉并捕获它们。腋下淋巴结有癌细胞表明癌症扩散的风险增加。在我们的数据中,检测到腋窝淋巴结(0-52)
Affected Lymph Nodes
(来源:https://www.breastcancer.org/symptoms/diagnosis/lymph_nodes)
年龄:代表手术患者的年龄(30-83 岁)
手术年份:患者接受手术的年份(1958-1969)
生存状态:表示患者手术后是否存活 5 年以上或 5 年以下。这里,如果患者存活 5 年或更长时间,则表示为 1,存活少于 5 年的患者表示为 2。
因此,让我们开始处理数据集并得出结论。
操作
为此我使用了 python,因为它有丰富的机器学习库和数学运算。我将主要使用常见的软件包,如 Pandas、Numpy、Matplotlib 和seaborn,它们帮助我进行数学运算以及绘制、导入和导出文件。
*import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as nphaberman= pd.read_csv(“haberman.csv”)*
在上面的代码片段中使用函数read _ csvfrompandaspackages 您可以从 CSV 文件格式导入数据。因此,导入数据集后,您需要检查数据导入是否正确。下面的代码片段将显示数据的形状,即数据中存在的列数和行数。
*print(haberman.shape)*
Shape of data
在这里,您可以确信您想要的数据已成功导入,它显示了 306 个数据实例和 4 个属性,正如我们在前面的简介中看到的。您甚至可以使用下面的一行代码来查看列的标签。
*print(haberman.columns)*
Columns in data with type
这里,dtype 表示数据类型,它是数据中所有列的对象类型。同样,您也可以找到要素和类属性的 dtype,并可以通过下面简单的代码行找到属于一个类的数据点的数量以及属于其他类的数据点的数量。
*haberman[“Survival_Status”].value_counts()*
Number of data per classification
从上面这段代码你可以得出结论,306 个病人中有 225 个存活了 5 年以上,只有 81 个存活了不到 5 年
现在让我们绘制一些图表,这些图表给我们更多的数据说明,这样我们就可以很容易地得出结论。
*haberman.plot(kind=’scatter’, x=’Axillary_Nodes’, y=’Age’)
plt.grid()
plt.show()*
上面的片段给了我散点图,x 轴是节点,y 轴是年龄。我们的 matplotlib 库函数 grid 和 show 帮助我在网格中绘制数据,并将其显示在控制台上。
2D Scatter Plot
上面的散点图以重叠的方式显示了所有数据,并且颜色相同,因此我们无法区分数据,也有可能您会错过我的一些数据,从而导致错误的结论。因此,为了区分数据,我们可以使用 seaborn packages 函数,该函数通过为每个分类特征分配不同的颜色来直观地区分数据。
*sns.set_style(‘whitegrid’)
sns.FacetGrid(haberman, hue=”Survival_Status”, size=4) \
.map(plt.scatter, “Axillary_Nodes”, “Age”) \
.add_legend();
plt.show();*
2D scatter plot with different colour polarity
在上面的代码片段中,我从 seaborn 库导入了函数,比如 FacetGrid ,这样我们就能够区分数据分类。这里蓝点代表存活超过 5 年,橙点代表存活少于 5 年。
由于有 3 个特征,我们可以从中得出我们的分类,所以我们如何从所有特征中选择任何特征,以便我们可以得到错误率更低的输出。为此,我们可以使用 seaborn 的 pairplots 到各种组合的 plots,从中我们可以为我们的进一步操作和最终结论选择最佳对。 hue="Survival_Status" 会给出你需要对哪些特征做分类。下图显示了 pairplots 组合的绘制及其代码片段。
*plt.close();
sns.set_style(“whitegrid”);
sns.pairplot(haberman, hue=”Survival_Status”, size=3, vars=[‘Age’,’Operation_Age’, ‘Axillary_Nodes’])
plt.show()*
Pair Plot
上图是数据中所有特征的组合图。这些类型的图被称为成对图。图 1、图 5 和图 9 是所有特征组合的直方图,通过考虑数据的不同特征来解释数据的密度。
现在,让我们一个接一个地绘制图 1,我将向您解释我将采用哪个数据特征来进行进一步的数据分析。我会选择这样一个数据,它比任何其他数据特征都更能显示出我与众不同的地方。因此,让我们开始分析除图 1,5,9 之外的每个图,因为它是成对图中特征的直方图。**
曲线图 2:-在该曲线图中,您可以看到 X 轴上有操作年龄,Y 轴上有年龄,这些数据的曲线图大部分相互重叠,因此我们无法区分蓝点下方是否存在任何橙色点,反之亦然。因此,我拒绝这两个数据特征组合进行进一步分析。
图 3:-在这个图中有一些点是可区分的,但它仍然比其他图更好,因为我们可以通过直方图和 CDF 提供更精确的结论,稍后你会了解到。在这个图中,点的重叠是存在的,但相比之下,它仍然比所有其他图好。所以我会选择这个 plot ie 的数据特征。年龄和腋窝淋巴结。
图 4 :-使用数据特征操作 Age 和 Age 绘制,该图显示了与图 2 相似的图类型,但只是旋转了 90 度。所以我也拒绝这个功能
图 6:-它绘制了特征操作年龄和腋窝淋巴结,与图 2 有些相似,但与其他图相比,点的重叠在该图中似乎更多。所以,我也会拒绝这个组合
图 7 :-该图与图 3 相似,只是交换了轴,所以该图将旋转 90 度。此外,我会接受进一步的行动这一组合
地块 8 :-与地块 6 相同,唯一的特征是轴互换。
因此,我考虑在图 3 和图 7 中绘制特征年龄和腋淋巴结,用于所有进一步的数据操作
1D 散点图
让我们绘制 1D 散点图,看看我是否可以使用下面的代码片段区分数据。
*import numpy as np
haberman_Long_Survive = haberman.loc[haberman[“Survival_Status”] == 1];
haberman_Short_Survive = haberman.loc[haberman[“Survival_Status”] == 2];
plt.plot(haberman_Long_Survive[“Axillary_Nodes”], np.zeros_like(haberman_Long_Survive[‘Axillary_Nodes’]), ‘o’)
plt.plot(haberman_Short_Survive[“Axillary_Nodes”], np.zeros_like(haberman_Short_Survive[‘Axillary_Nodes’]), ‘o’)
plt.show()*
我使用了 Numpy 库函数为每个分类数据单独绘制 1D 散点图。下面您可以看到使用数据特征年龄和腋淋巴结的 1D 散点图
1D Scatter Plot
在这里,你可以观察到短期生存状态的数据大多与长期生存状态的数据重叠,因此你无法根据这些数据得出结论。
如果使用 PDF 或 CDF 格式的数据进行绘图,可以获得更好的清晰度。
让我解释一下你对 PDF 和 CDF 的概念。
PDF 如果存在更多的数据,PDF 将是代表高峰的峰状结构,否则如果存在的数据较少,它将是平的/小峰。它是使用直方图边缘的平滑曲线图
CDF (累积分布函数) :-表示 PDF ie 的累积数据。它将通过累积考虑每个数据点的 PDF 来绘制图表。
Seaborn library 将帮助您绘制任何数据的 PDF 和 CDF,以便您可以轻松地可视化特定点上的数据密度。下面的代码片段将绘制 PDF
*sns.FacetGrid(haberman,hue=”Survival_Status”, size=8)\
.map(sns.distplot,”Axillary_Nodes”)\
.add_legend()*
让我们试着画出每个数据特征的 PDF,看看哪个数据能给我们最高的精度。
时代 PDF
PDF for Age
观察:在上面的图中,观察到在 30-75 岁的年龄范围内,存活和死亡的状态是相同的。因此,使用这个数据点我们无法预测任何事情
运营年龄 PDF
PDF for Operation Age
观察结果:类似地,我们无法用这些直方图预测任何事情,因为每个数据点中的密度数量相同。甚至两种分类的 PDF 也相互重叠。
腋窝淋巴结的 PDF
PDF for Axillary nodes
观察:据观察,如果人们检测到的腋窝淋巴结较少,他们会活得更长,反之亦然,但仍然很难分类,但这是你可以从所有数据中选择的最佳数据。所以,我接受腋窝淋巴结的 PDF 并可以得出以下结果
if(AxillaryNodes≤0)
患者=长期存活
else if(腋淋巴结≥0 &&腋淋巴结≤3.5(近似值))
患者=长期存活几率高
else if(腋淋巴结≥3.5)
患者=短期存活
因此,从上面的 PDF 我们可以说患者的生存状态,但我们不能确切地说,有百分之多少的患者将实际短期生存或长期生存。知道我们有另一个分布是 CDF。
CDF 将给出 PDF 的累积图,以便您可以计算患者存活状态的确切百分比
让我们为我们选择的特征绘制 CDF,它是腋淋巴结
*counts, bin_edges = np.histogram(haberman_Long_Survive[‘Axillary_Nodes’], bins=10,
density = True)
pdf = counts/(sum(counts))
print(pdf);
print(bin_edges);
cdf = np.cumsum(pdf)
plt.plot(bin_edges[1:],pdf);
plt.plot(bin_edges[1:], cdf)*
上面的代码会给我长期生存状态的 CDF。这里,我们仅使用来自 Numpy 的 cumsum 函数,该函数将累加该特征的 PDF。
具有长期生存状态的 CDF 将在图中以橙色显示。
CDF for Long survival status
从上面的 CDF 图中,你可以观察到橙色线显示如果检测到的腋窝淋巴结数目为< 5. Also you can see as number of axillary nodes increases survival chances also reduces means it is clearly observed that 80% — 85% of people have good chances of survival if they have less no of auxillary nodes detected and as nodes increases the survival status also decreases as a result 100% of people have less chances of survival if nodes increases > 40,有 85%的机会长期存活
让我们试着在一个图中画出这两个特征 CDF。为此,只需在为长期生存而编写的现有代码中添加以下代码
*counts, bin_edges = np.histogram(haberman_Short_Survive['Axillary_Nodes'], bins=10,
density = True)
pdf = counts/(sum(counts))
print(pdf);
print(bin_edges)
cdf = np.cumsum(pdf)
plt.plot(bin_edges[1:],pdf)
plt.plot(bin_edges[1:], cdf)plt.show();*
下图用红线显示了短期存活的 CDF
CDF for both Long and short survive
你可以在上面的综合 CDF 中观察到长期存活的观察结果是相同的,但是在短期存活中,近 55%的人的淋巴结小于 5,如果淋巴结> 40,则有近 100%的人短期存活
我们还可以通过应用数学公式(如标准差和平均值)来预测患者的状况。
平均值是所有数据的平均值,标准差是数据的分布,表示数据在数据集上分布的宽度。Python 有 Numpy 库,可以在一行中执行这个操作。
*print(“Means:”)
print (np.mean(haberman_Long_Survive[“Axillary_Nodes”]))
print (np.mean(np.append(haberman_Long_Survive[“Axillary_Nodes”],50)))
print (np.mean(haberman_Short_Survive[“Axillary_Nodes”]))print(“\nStandard Deviation:”)
print(np.mean(haberman_Long_Survive[“Axillary_Nodes”]))
print(np.mean(haberman_Short_Survive[“Axillary_Nodes”]))*
我们可以在第 3 行看到,我添加了异常值(与相应数据相比非常大或非常小的数据。这可能是收集数据时的错误或异常情况),即使数据的平均值没有受到太大影响。
您可以观察到,长期存活的平均值为 2.79,包括异常值在内,平均值为 3,几乎相同,但短期存活的平均值为 7.4,相对来说比长期存活的平均值高得多。所以短期存活的概率在数据集中更大。
如果观察标准差,长期存活者的标准差仅为 2.79,短期存活者的标准差为 7.45,这意味着短期存活者的数据分布更多。
中位数、分位数和百分位数
你还可以做一些数学运算,比如中位数,分位数,百分位数
*print(“Medians:”)
print(np.median(haberman_Long_Survive[“Axillary_Nodes”]))
print(np.median(np.append(haberman_Long_Survive[“Axillary_Nodes”],50)))
print(np.median(haberman_Short_Survive[“Axillary_Nodes”]))print(“\nQuantiles:”)
print(np.percentile(haberman_Long_Survive[“Axillary_Nodes”],np.arange(0,100,25)))
print(np.percentile(haberman_Short_Survive[“Axillary_Nodes”],np.arange(0,100,25)))print(“\n90th percentile:”)
print(np.percentile(haberman_Long_Survive[“Axillary_Nodes”],90))
print(np.percentile(haberman_Short_Survive[“Axillary_Nodes”],90))from statsmodels import robust
print (“\nMedian Absolute Deviation”)
print(robust.mad(haberman_Long_Survive[“Axillary_Nodes”]))
print(robust.mad(haberman_Short_Survive[“Axillary_Nodes”]))*
上面的代码片段将给出中位数和第 n 个百分点
中位数是数据的中心值,分位数是第 n 个百分比 n= 25,50,75 的特定特征值,第 n 个百分位类似于分位数,但 n 可以是 1 到 100 之间的任何数字。
因此,对于我们的数据集,这些术语的值如下
观察:
- 从以上观察可以清楚地看出,长期存活的平均腋窝淋巴结为 0,而短期存活的平均腋窝淋巴结为 4。也就是说,平均有 4 个辅助淋巴结的患者生存期短。
- 分位数显示,在长期存活中,近 50%的腋窝淋巴结为 0,75%的患者淋巴结少于 3,即 25%的患者淋巴结多于 3。
- 同样,在短期生存中,75%的患者至少检测到 11 个淋巴结。
- 在 90%时,如果检测到的淋巴结> 8,那么它具有长期生存状态,如果淋巴结> 20,那么患者将具有短期生存状态
盒图和胡须,小提琴图和等高线图
您还可以使用像盒图轮廓和更多的绘图分析数据,Seaborn 库有各种各样的数据绘图模块。让我们拿一些吧
盒子剧情和络腮胡子
*sns.boxplot(x=”Survival_Status”,y=”Axillary_Nodes”, data=haberman)
plt.show()*
Box Plot and Whiskers
在这里,你可以通过观察它的高度和宽度以及 T 型结构来阅读这个图。方框高度代表第 25 个百分位数到第 75 个百分位数之间的所有数据,水平条代表该数据的最大范围,方框宽度代表该数据在数据集中的分布。此外,竖线上方小点是异常值
观察结果:上图中,长命百分位数第 25 百分位和第 50 百分位几乎相同,阈值为 0 到 7。此外,对于短期存活,第 50 百分位节点几乎与长期存活的第 75 百分位相同。短期存活阈值为 0 至 25 个节点,75%为 12,25%为 1 或 2
所以,如果 0–7 之间的节点有出错的机会,因为短存活图也在其中。对于短期存活状态,这是 50%的误差
以上 12 点大部分在于生存时间短
小提琴剧情
*sns.violinplot(x=”Survival_Status”, y=”Axillary_Nodes”,data=haberman)
plt.legend
plt.show()*
Violin Plot
它与盒须图相同,唯一的区别是用盒直方图代替盒直方图来表示数据的分布。
观察:在上面的 violin 图中,我们观察到它的长期存活密度更接近 0 节点,而且它的晶须在 0-7 范围内,而在 violin 2 中,它显示的短期存活密度更接近 0-20 和阈值 0-12
等高线图
等高线图类似于密度图,意味着如果特定点上的数据数量更多,该区域将变得更暗,如果您将它可视化,它将形成类似小山的结构,其中山顶具有最大的点密度,密度随着山坡坡度的减小而减小。
您可以参考下图,了解等高线图在 3D 中的实际效果
Source: https://www.mathworks.com/help/matlab/ref/surfc.html
在上图中,黄点的密度最大。
下面是我们数据集的等高线图
*sns.jointplot(x=”Age”,y=”Axillary_Nodes”,data=haberman_Long_Survive,kind=”kde”)
plt.grid()
plt.show()*
Contour Plot
观察:以上是使用特征年龄和腋窝淋巴结的长期存活的 2D 密度图,观察到长期存活的点的密度更多来自 47-60 岁的年龄范围和 0-3 岁的腋窝淋巴结。黑暗区域具有主要密度,其在 3D 中是山顶,且密度随着图形变亮而变低。每个阴影代表一个等高线图。
结论:
是的,您可以通过应用各种数据分析技术和使用各种 Python 库,使用哈伯曼的数据集来诊断癌症。
参考资料:
- https://www.mathworks.com/help/matlab/ref/surfc.html
- https://www.breastcancer.org/symptoms/diagnosis/lymph_nodes
- https://www.kaggle.com/gilsousa/habermans-survival-data-set
- https://www.appliedaicourse.com
机器学习会颠覆营销行业吗?
原文:https://towardsdatascience.com/will-machine-learning-disrupt-the-marketing-industry-aa1ba0c5a7dc?source=collection_archive---------5-----------------------
随着数字时代影响力的扩大,新兴创新将会颠覆不同行业的运作方式。在市场营销领域,策略已经在不断变化,以满足消费者不断变化的偏好。传统上,消费者通过货架摆放技巧、购买点标志等被吸引到实体购物空间,但今天的产品根据各种在线企业接收和分析的数据展示其羽毛,这些数据决定了消费者如何浏览这些在线购物中心。
随着大数据革命的到来,理解这些数据的过程变得更加复杂。人工智能(AI)和机器学习的黎明将使这些挑战变得无足轻重,并使精确定位个人偏好变得毫不费力。从算法到聊天机器人,现在这些技术如何提升营销绩效?
了解 AI 的区别&机器学习
首先,理解人工智能和机器学习之间的区别很重要,因为它们经常互换使用。机器学习使计算机和在其上运行的应用程序能够在不进行持续维护的情况下自行改进。这项技术可以检测和预测数据、语音和其他模式,随着时间的推移,随着数据的输入,这项技术会变得更加准确。
另一方面,人工智能是一个总括术语,用来描述机器可以模仿人类认知的不同方面的各种方式,如思维、运动或讲话。
我们平时遇到的就是机器学习的技术。
市场上的机器学习
机器学习可能是营销人员工具箱的重要组成部分,因为它将购物和内容无缝地结合在一起。当消费者在网上搜索视觉效果并拍摄他们喜欢的物品时,机器学习将能够根据人工智能生成的模型向他们提供建议。这为每个人建立了个性化的购物体验。
数字媒体(尤其是社交媒体)的发展表明,即使在很短的时间内,消费趋势也会产生深远的影响。然而,公司收到的大量数据使得识别和处理这些模式成为一项势不可挡的资源密集型工作。
机器学习通过立即识别来自各种来源的数据中的潜在模式来简化这一过程。虽然仍然需要人类来验证和解释这些趋势,但机器学习加速了分析。这使我们能够专注于对这些趋势做出快速反应,而不是努力识别它们。
实施中的挑战
虽然机器学习已经证明了它在提高营销过程效率方面的能力,但营销人员担心它仍然太年轻,不能依赖。一个担忧是,由于它处理数据的速度,它可能会取代各种行业的人工工作。例如,尽管机器学习的性能令人印象深刻,但它仍然无法完全理解人类交流的细微差别。由于这些问题,对于很多公司来说,客户服务仍然是“人性化”的客户服务。
机器学习在市场营销中的未来
网上收集的海量数据只会继续增长。因此,来自人工智能和机器学习系统的帮助将变得更加重要。
尽管如此,机器学习仍处于早期阶段,在实现技术成熟之前,它似乎还有很长的路要走。因此,人类将保持重要的角色,这一角色将得到机器学习技术的支持。专业人士将越来越能够专注于营销和指导算法。只有人类才能回答重要的问题,例如公司的关键业务问题需要什么解决方案。
随着我们见证这些技术及其功能的快速发展,机器学习将继续证明其在快速处理数据方面的价值。随着计算机发现趋势,营销人员需要确保他们抓住机会,同时保持新鲜感和相关性。
特拉维夫的市中心会更新吗?
原文:https://towardsdatascience.com/will-tel-aviv-city-center-be-renewed-5aaf000c2428?source=collection_archive---------8-----------------------
或者:为什么规划者需要开始使用大数据
Tel-Aviv city center (source: https://xnet.ynet.co.il/architecture/articles/0,14710,L-3099095,00.html)
这项研究于 2018 年 7 月以“”(希伯来文版)和Haaretz.com(英文版)发表于以色列房地产出版社
特拉维夫市最近(2018 年 1 月)批准了一项新的分区条例,用于其最理想的地区之一,第三选区,也被称为“旧北”街区。该计划鼓励开发商通过提供额外的建筑面积来更新住宅建筑,以便升级非历史建筑,增加市中心的住房存量,同时保持其独特的城市景观质量。住户从免费更新中受益,并获得改善的/新的公寓。自第一阶段通过批准以来,该计划受到开发商、规划者和居民的公开批评,声称尽管该计划据称会增加土地供应,但在单个建筑层面上,它仍然过于严格,经济上不允许使用。
作为一名以特拉维夫为基地、专门从事城市更新住宅项目的建筑师,很容易感觉到,在宣布重新分区后,第 3 区的新项目需求急剧下降。将我最近获得的数据分析技能应用到重新分区的可行性问题上,对我来说是一个自然的选择;我使用了关于地块粒度的 GIS 数据,以确定新法令提供的额外建筑面积是否提供了足够强的激励来确保其建筑物的更新。我还评估了重新分区将产生的未来容积率(FAR ),以及根据规划的预期利用率,整个辖区将增加的住房单元数量。
特拉维夫市中心建筑环境+分区快速回顾
3 区主要建于 20 世纪 30 年代,由英国在巴勒斯坦的委任统治支持,是特拉维夫市中心的四个区之一(3 区、4 区、5 区和 6 区),以其包豪斯建筑和“花园城市”的城市景观而闻名。该区还包含了“白色城市”区的一个重要部分,2003 年被联合国教科文组织宣布为世界遗产。在这个宣言之后,城市的保护计划在 2008 年被批准,指定保护市中心的大约 1000 栋建筑,其中大部分位于“白色城市”内。
Fig.1 Precinct 3, Tel Aviv-Jaffa, Israel
Dizengoff street, 1960’s (source: Google)
占地 243.1 公顷(其中约 60%在“白色城市”区域内),“第 3 区规划”,或其官方名称为第 3616a 号法令,是为特拉维夫市中心的四个区准备的四个规划之一,是第一个也是唯一一个在我进行这项研究时获得批准的规划。该法令对白城区内和白城区外的地块进行了区分,允许在历史遗址外增加一层,并要求对白城区内非常小的地块(< 500m2)的边界进行更严格的限制。密度系数,代表单元的平均大小,并根据它计算地块中允许的住房单元数量,商业街中的密度系数小于非商业街中的密度系数,允许主干道中有更多或更小的单元。总的来说,除了目前已经存在的大约 36,000 套住房单元之外,该计划还将为该区域新增 16,000 套住房单元(预计利用率为 50%)。
分析方法
用于生成此分析的 Python 代码可在我的GitHub上获得。
由于这项研究是在重新分区法令获得批准后几个月才进行的,因此其分析具有预测性,使用从特拉维夫市地理信息系统获得的3 区建筑物和地块的现有真实物理参数,并且根据新法令指南评估其未来特征,因为它们出现在分区法令第 3616a 号文件(仅希伯来文内容)。为每个地块下载的属性是地块 ID* 和面积(m)地址、建筑占地面积 ( m )、层数和建筑类型。根据这些变量计算出建筑面积和容积率(FAR) 。*
我假设所有 3 号区对土地的需求都一样高,这意味着在每个待建的重建项目中,允许的建筑面积都得到充分利用。
该研究仅考虑了住宅建筑,并评估了拆除+新建部分计划的经济可行性,排除了建筑改进和建筑扩建的可能性。本研究中未考虑宗地合并选项。指定用于历史保护的地块不在分析范围内,因为重新分区不适用于这些地块。此外,新建筑物(建于 1980 年后)不符合新的条例准则,也被排除在分析之外。总体而言, 2,161 个包裹被发现对该分析有效,约占该辖区包裹的一半。
Fig.2 (left): 2,161 Potential to renewal parcels according to rezoning ordinance; 1,307 (~60%) within the White City zone and 856 buildings outside its boundaries. Fig.3 (right): buildings designated for historic preservation, excluded from the analysis. 17% of the precinct’s buildings within the White Zone and 3% of buildings outside of it.
经济可行性阈值*被定义为当前建筑面积比允许建筑面积**少 50%,考虑到当前建筑面积对居住者的回馈。这一经验法则还考虑了拆迁成本、许可成本、建筑成本和临时疏散居民的住房成本,以及额外新建建筑面积的更高土地价值。此阈值的例外情况是大地块(定义为地块面积等于或大于 750 米)和小地块(500 米或小于 500 米),分别允许/要求居民或开发商享有 55%的比例。*
结果
1.当前(2018 年)建成环境
3 区的大多数建筑目前的建筑容积率在 1.3-2 之间,形成了特拉维夫连续连贯的城市景观,如图 4 所示。在“白城”区内外,当前 FAR 在辖区内的频率分布如图 5 所示,表明“白城”区内外的 FAR 分布没有显著差异:
Fig.4 Current FAR precinct 3
Fig.5 Frequency distribution of current FAR, precinct 3; Within and outside the “White City”. No significant difference between the two distribution is emerging
2.根据重新分区允许的建筑空间
如前所述,根据重新分区所允许的最大未来建筑空间是通过使用现有的空间测量值并将其应用于新条例的指导方针进行评估的。
**允许的楼层数取决于地块是在“白城”区之内还是之外,是否位于商业街上,以及对于“白城”区内的地块,其面积是大于还是小于 500 平方米。关于允许的覆盖区,地块边界所需的后退通常会导致覆盖区在地块面积的 42%-56%之间,看起来几乎是随机的。因此,对于此分析,小于 750 米的宗地的覆盖区百分比在此范围内随机选择。根据规划要求,该地块面积的最大 55%被分配给大于 750 米的地块。允许占地面积和允许容积率相应计算。允许的住房单元是通过将新建筑面积除以密度系数,然后减去 4 个单元来评估的,这是因为建筑物最高楼层对大单元的常见住房需求。
由此得出的未来 FAR 及其分布如图 6 和图 7 所示。该区独特的城市景观发生了戏剧性的变化,向更广阔的区域延伸,尤其是在“白色城市”区和外围之间。
Fig.6 Allowed FAR, rezoning fully utilized across the precinct. The northern part, outside the “White City” zone, gains significantly higher FAR
Fig.7 Frequency distribution of allowed FAR, if rezoning fully utilized across the precinct; FAR outside the “White City” zone (blue) show higher results, while the “White City” zone (red) stays relatively closer to current FAR’s. Overall, FAR distribution is widening.
3.可行性结果和预测的建成环境
可行性结果惊人;根据导致我的分析的假设,只有 521 个地块(在分析的 2161 个地块中,占 24%)被发现有足够的利润来利用新的法令。
可行和不可行地块如图 8 所示:
Fig.8 Economic Feasibility for renewal by the new zoning ordinance. 1640 (76%) parcels were found to be not feasible (red color). Only 521 parcels (24%) were found feasible enough for utilizing their rezoning possibilities (green color).
考虑到辖区内的 471 块被指定为历史保护区,因此不符合新规划的条件,重新分区虽然旨在产生额外的建筑面积,但却使辖区内约 80%的建筑 恶化并倒塌。图 9 根据可行性结果绘制了预期容积率,为被发现可行的地块绘制了允许容积率,为被发现不可行的地块绘制了当前容积率。图 10 按照相同的方法显示了整个辖区内预期 FAR 的频率分布。无论是地图还是柱状图都没有遵循任何城市结构的常识。
Fig.9 Anticipated FAR according to feasibility results. 521 parcels (24%) assumed to be renewed thus show their allowed FAR guided by the rezoning ordinance, while the rest 76% show their current FAR.
Fig.10 Frequency distribution of anticipated FAR, rezoning utilized only for parcels that were found feasible according to the new ordinance.
根据新条例,考虑到将要实施的项目的可行性阈值,预期的城市景观是许多旧建筑和相对少量的新建筑的混合物,与今天特拉维夫市中心的城市景观不一致且完全不同。根据这些结果,区预计将增加 3390 套住房,约为计划宣布目标 8000 套的 40%。
讨论和含义
本研究评估了特拉维夫市中心 3 区的再分区条例,评估了每个地块的经济可行性,并根据其预期用途描绘了未来的建筑环境。分析显示,超过 75%的 3 区建筑没有利用新条例的经济合理性,这实际上使这个有意义的区域恶化,并改变了特拉维夫市中心城市景观的显著一致性。
A typical ‘Tel-Aviv building’; Will it renew before completely crumbling?
这些结果提出了关于新法令的目标的问题,以及该计划是否实际上引导城市及其城区朝着这些目标前进。该计划的指导方针真的能保护特拉维夫市中心的景观质量吗?考虑到该计划的激励措施足以让不到四分之一的辖区建筑得到利用,它真的是城市更新的杠杆吗?这两个问题,引导和激励我通过这项研究,应该通知当地的规划者,使他们重新评估这个计划和未来的条例,这些天在特拉维夫处于不同的规划阶段。
最重要的是,这项研究应该提出一个关于总体规划和政策分析的讨论,以及大数据工具和技术应用于城市规划的方式,通过允许定性和粒度空间分析来利用它。
未来的研究
为了解决其可行性问题,3 号区计划允许两个小地块(500 米或更小)的可选地块联合,利用它们的共享侧面在两个地块上建造一座建筑,为每个地块创造更高的占地面积。这种可能性使新条例在整体上更可行。考虑到这种可能性,需要进行进一步的研究,以评估预计重新开发的地块比例。
此外,一个类似的分区计划即将被批准用于第 4 选区(“T0”新的北部“T1”社区,位于第 3 选区的东部),给予更高的奖励,主要是因为第 4 选区不包含“白色城市”区。这个计划被认为非常有利可图。由于这些邻近区域今天具有相似的、连续的城市景观,考虑到它们的经济可行性和预期用途,评估由不同条例产生的未来城市景观将是有趣的。
在“市场、设计和城市”课程中,作为一个全课程项目进行的完整研究(由 Alain Bertaud 教授负责;NYU 瓦格纳 2018 春),此处可用*。***
特别感谢 Roy Lavian,他是特拉维夫的一名开发商,也是我的同事,我曾就新条例指导下的经济可行性阈值的定义向他咨询过。
贝叶斯思维介绍:为什么一个测试可能不足以检测你体内的病毒?
原文:https://towardsdatascience.com/will-you-become-a-zombie-if-a-99-accuracy-test-result-positive-3da371f5134?source=collection_archive---------1-----------------------
Photo by Drew Hays on Unsplash
假设世界上存在一种非常罕见的疾病。你患这种疾病的几率只有千分之一。你想知道你是否被感染,所以你做了一个 99%准确的测试…测试结果为阳性!你有多确定自己真的被感染了?
第二次测试如何影响你确实被感染的信念?
我在这里使用的例子来自真理频道。在这篇文章中,我想向展示贝叶斯网络下的逻辑。关于贝叶斯定理的更多细节,我建议看视频。
第一次测试
由于这是一种非常罕见的疾病(1/1000 会受到影响),您体内携带该病毒的概率由下表给出(称为条件概率表):
Virus CPT (Conditional Probability Table)
这张表显示,只有 1/1000 的人有这种病毒。这就等于说:1000 人中有 999 人没有感染这种病毒。
现在我们做一个类似的测试表:第二个表显示了测试的准确性。这就是测试辨别真伪的能力。因此,如果你被感染了,测试将有 99%的机会是真的,如果你没有被感染,测试将显示假的(99%准确),在这两种情况下错误率是 1%
Test1 CPT (Conditional Probability Table)
下图显示了测试结果中的病毒存在取决于测试(如上表所示):
A simple and empty simple bayesian network
然后当我给出证据证明测试是真的。网络显示,在一次检测呈阳性的情况下,病毒在你身体上的存在率仅为 9%!
The same bayesian network with the evidence loaded of one positive test
为什么会这样?这个数来自贝叶斯定理:
在这个问题中:
𝑃(H|E) = 𝑃(H) × 𝑃(E|H) / 𝑃(E)
𝑃(h|e)= 𝑃(h)×p(e | h)/(𝑃(e|h)×𝑃(h)+𝑃(e|hc)×𝑃(ec)
𝑃(h|e)= 0.99 * 0.001/(0.001 * 0.99+0.999 * 0.01)= 0.9 = 9%
所以,即使你做了 99%准确的测试,患这种疾病的几率也只有 9%
这种计算看起来很复杂,但是一旦用图表表示出来,我们对贝叶斯思维的工作方式就有了更好的直觉。
针对两项测试:
如果你参加第二次考试会怎么样?假设这个新测试也有 99%的准确率,我们有和第一个测试一样的表:
Test2 CPT (Conditional Probability Table)
对应的贝叶斯网络将是下一个:
Bayesian network for two positive test
这意味着:对于两个阳性测试,患病的机会增加到 91%。上传之前的经验。这是一致的,患这种病的几率从 9%上升到 91%。但还不是 100%!
在另一种情况下,如果第二次测试是阴性的,有 100%的机会没有患病。
Bayesian network for one positive test and one negative test
针对三项测试
在三次测试的情况下,所有测试都具有相同的准确度,我们看到一些有趣的结果。如果你有证据证明 3 个测试都是真的,现在就 100%确定你感染了病毒。
Bayes network for three positive test
但是由于一次测试是错误的,结果又变了,只有 91%的可能性病毒存在于你的体内:
总之、、、贝叶斯网络有助于我们表现贝叶斯思维、,当要建模的数据量适中、不完整和/或不确定时,可以用在数据科学中。他们也可以利用专家的判断来建立或完善网络。它们允许“模拟”不同的场景。它们表示输入值(在本例中为病毒存在和测试的准确性)如何与输出的特定概率水平(实际患病的概率)相关联
在这篇文章中,我解释了如何建立贝叶斯网络,从贝叶斯定理开始。我目前正在研究贝叶斯网络来预测项目的成本和风险。我想分享一下构建如此强大的 AI 工具的基础知识。
如果你想知道更多关于贝叶斯网络的知识:
关于模型源轴上理论和数据之间的水平划分,贝叶斯网络有一个特殊的特征。贝叶斯网络可以从人类知识中构建,即从理论中构建,或者可以从数据中由机器学习。因此,他们可以使用整个光谱作为模型源。此外,由于它们的图形结构,机器学习贝叶斯网络是视觉上可解释的,因此促进了人类的学习和理论建设。在这篇文章中,我比较了 BN 和 S 监督学习算法以及强化学习。
贝叶斯网络允许人类学习和机器学习协同工作,即贝叶斯网络可以从人类和人工智能的结合中开发出来。除了跨越理论和数据之间的界限,贝叶斯网络还具有关于因果关系的特殊性质。
然而,这种协作并不简单,为了构建贝叶斯网络,有必要适当地选择几个超参数。
在某些条件下,通过特定的理论驱动的假设,贝叶斯网络有助于因果推理。事实上,贝叶斯网络模型可以覆盖从关联/相关到因果关系的整个范围。
在实践中,这意味着 w e 可以将因果假设(例如使用合成节点)添加到现有的非因果网络中,从而创建因果贝叶斯网络。当我们试图模拟一个领域中的干预时,例如估计治疗的效果,这是特别重要的。在这种情况下,使用因果模型是非常必要的,贝叶斯网络可以帮助我们实现这种转变。
链接到这篇文章的完整研究可以在下一个链接中找到(这篇文章直到 2020 年 6 月都是免费的)
[## 一种基于贝叶斯网络的提高项目管理成熟度的方法
提出了一种建立项目管理成熟度和项目超额成本之间因果关系的方法
www.sciencedirect.com](https://www.sciencedirect.com/science/article/pii/S0166361519309480?dgcid=author)
感谢阅读!!
如果你想继续关注如何建立贝叶斯网络,查看这篇文章:
[## 贝叶斯网络中的超参数调整问题
在这段历史中,我们讨论了在基于贝叶斯理论建立模型时要考虑的结构标准
towardsdatascience.com](/the-hyperparameter-tuning-problem-in-bayesian-networks-1371590f470)
如果你想了解更多关于贝叶斯网络的数学知识,以及如何用它们创建模型,请查看这篇文章:
[## 贝叶斯网络和合成节点
在这篇文章中,我给出了一个更正式的观点,并讨论了建模的一个重要元素:合成节点。
towardsdatascience.com](/bayesian-networks-and-synthetic-nodes-721de16c47e2)
基于机器学习的葡萄酒等级预测
原文:https://towardsdatascience.com/wine-ratings-prediction-using-machine-learning-ce259832b321?source=collection_archive---------4-----------------------
Photo by Hermes Rivera on Unsplash
我没有一天不从同事、黑客新闻等那里听到“机器学习”、“深度学习”或“人工智能”之类的话。现在的炒作超级强大!
在阅读了一些关于 ML 的书籍、文章、教程之后,我想从这个理论初级水平毕业。我需要在一个真实的例子上做实验。当主题是让我感兴趣的东西时,效果会更好。所以对于这个做法,我挑了酒(> <)。
酒牛逼,不得不说!我能说吗?嗯,太牛逼了!
喝葡萄酒这么多年来,在买一瓶酒之前,我一直在寻找一样东西:评级。以各种形式:要点、描述等…
我们设定了一个简单的目标:有没有可能通过机器学习,根据葡萄酒的描述来预测它的等级?
有人称这为情感分析,或文本分析。开始吧!
资料组
好吧,我不得不承认,我很懒。我不想为像 Robert Parker,WineSpectactor…
这样的葡萄酒杂志写文章,但幸运的是,在谷歌搜索了几下后,在一个银盘上发现了天赐数据集:收集了 WineMag 的 13 万种葡萄酒(包括评级、描述、价格等等)。
顺便说一下,感谢 zackthoutt 提供了这个令人敬畏的数据集。
先看数据
与通常的数据集一样,我学会了删除重复项和 NaN 值(空值):
我们只剩下 92k 的葡萄酒评论,足够玩了!
现在让我们看看数据集的分布。在我们的例子中,它是每点的葡萄酒数量:
83 到 93 分的酒很多。这也是符合市场的(好酒不多)。
作为一个有趣的注意,只是通过阅读一些数据,我发现葡萄酒越好,描述似乎越长。人们渴望对他们真正欣赏的葡萄酒发表更长的评论,这有点合乎逻辑,但我不认为数据会如此重要:
模型
看起来我们的数据集有太多的可能性。这可能会加重预测的负担。一瓶 90 分的葡萄酒和一瓶 91 分的葡萄酒并没有太大的不同,所以描述可能也没有太大的不同。
我们试着用 5 个不同的值来简化模型:
1 - >分 80 到 84(一般葡萄酒)
2 - >分 84 到 88(一般葡萄酒)
3 - >分 88 到 92(好酒)
4 - >分 92 到 96(非常好的葡萄酒)
5 - >分 96 到 100(优秀葡萄酒)
现在让我们看看我们的新发行版:
…向量化…
如今,用最大似然法对文本进行分类的最简单的方法之一被称为词袋,或矢量化。
基本上,你希望在一个向量空间中表示你的文本,并与权重(出现的次数等)相关联,这样你的分类算法将能够解释它。
一些矢量化算法是可用的,最著名的(据我所知)是:
- CountVectorizer:如其名称所述,简单地通过单词计数进行加权
- TF-IDF 矢量化:权重随着计数成比例地增加,但是被单词在整个语料库中的频率所抵消。这被称为 IDF(逆文档频率)。这使得矢量器可以用“the”、“a”等常用词来调整权重
训练和测试模型
在机器学习中,这是测试的最后一部分。
您希望用数据集的一部分来训练模型,然后通过将数据集的剩余部分与预测进行比较来测试其准确性。
对于这个实验,90%的数据集将用于训练(大约 80k 酒)。10%的数据集将用于测试(约 9k 酒)。
我们将使用的分类器是 RandomForestClassifier (RFC),因为它很酷,并且在许多情况下都工作得很好(>)尽管严重的是,RFC 不如其他一些分类器有高性能(内存和 cpu 方面),但我总是发现它在处理小数据集时非常有效。
结果
Sugoiiii!这是一些惊人的结果!97%的情况下,我们仅仅根据葡萄酒的描述就能正确预测它的质量。
让我们快速浏览一下这些数字及其含义:
-精度:0.97 - >我们没有很多假阳性
-召回:0.97 - >我们没有很多假阴性
(F1-考虑精度和召回的分数)
结束注释
这些结果非常棒,但我们肯定可以改进它:
-所有数据(训练和测试)都来自 WineMag。拥有一些其他葡萄酒杂志的评级将会改进这个模型,使它更通用
- RFC 是一个很好的分类器,但是占用了大量的内存和 CPU。也许对于一个更大的数据集,多项式朴素贝叶斯会更好,性能更高
——我们没有过多地查看其他列(地区、价格等)。我们可以将它们二进制化/编码以进行分类。
-将代码发布为 Flask 或 Django API 将是一件很好的事情
Kaggle 笔记本
所有数据集和 python 代码都可以在:
https://www . ka ggle . com/olivierg 13/wine-ratings-analysis-w-supervised-ml获得
一会儿酒厂见!(>
葡萄酒与起泡酒:一个神经网络图像分类解释
原文:https://towardsdatascience.com/wine-vs-sparkling-wine-a-neural-network-image-classification-explained-99a6ac477bfa?source=collection_archive---------7-----------------------
pixabay.com
如果你看了我之前的帖子,你就知道我喜欢酒。嗯,事实是,我不是特别喜欢汽酒!(☉_☉)
对于我第二次深入机器学习,我想看看卷积神经网络(CNN)对图像分类的可能性。顺便说一下,CNN 并不代表新闻频道(◠‿◠)
最近,一个朋友建议我去查看 Keras,这是一个神经网络库,超级容易使用,由谷歌的弗朗索瓦·乔莱开发。让我们马上进入正题,这个库太棒了:超级容易使用,超级高性能,文档写得很完美。你还能要求什么?
这个实验的目的是了解葡萄酒和起泡酒的图像的识别程度,或者简单地说,这种模型的精确度。
什么是 CNN?
我鼓励你阅读这篇写得很好的文章,它详细解释了什么是 CNN。
简言之,CNN 在两个主要方面不同于常规的机器学习算法:
- 它由不同的过滤器(内核)和分类器组成。每个部分都是独立的,就像我们大脑的一部分,如果需要,CNN 可以删除、更新和调整这些部分。
Architecture of a CNN. — Source: https://www.mathworks.com/videos/introduction-to-deep-learning-what-are-convolutional-neural-networks--1489512765771.html
- CNN 将从经验中学习。它有能力回到数据集并从以前的训练中学习,例如,对效果最好的过滤器或分类器进行更多的加权。对数据集的一次迭代称为一个时期。
数据集
我为了这个不偷懒,就刮了一个不怎么出名的酒类网站。
结果是一个由 700 幅训练图像和 200 幅测试图像组成的数据集,足够用了。下一步就是简单地将 Keras 的博客例子调整到这个数据集。
训练和测试模型
为了你自己,我不会把这个项目的所有代码都粘贴在这里,但是 Github 的链接在本文的最后。
那么 Keras 是如何进行图像分类的呢?我认为有几个重要的部分:
- 构建您的神经网络模型:遵循文档
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))[...More CNN layers...]model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
- 使用 ImageDataGenerator 为模型提供更广泛、更多样的生成图像集
train_datagen = ImageDataGenerator(rescale=1\. / 255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True)
- 训练和测试您的模型
model.fit_generator(train_generator, steps_per_epoch=nb_train_samples, epochs=epochs, validation_data=validation_generator, validation_steps=nb_validation_samples)
- 最后拯救你的体重和模型
model.save_weights('wines_sparklings_weights.h5')
model.save('wines_sparklings_model.h5')
运行 python 文件将输出类似这样的内容(10 个历元后精度约为 99%):
解释模型
可解释的人工智能今天被大肆宣传,所以我想给它一个机会。训练一个模型并信任它不是一件容易的事情。验证您的模型实际上不是纯粹偶然地神奇地对图像进行分类是一件好事,特别是如果它是一个真实的项目,并且将被推向生产环境。
我很幸运,不久前,Lime 库在 Github 上发布了,它最近获得了对 Keras 图像分类的支持。我想试一试!
在笔记本上,我首先展示了一幅葡萄酒的图像,并使用我们之前训练过的 Keras 模型进行了预测:
show_img(wine_image[0])
print(model.predict(wine_image))
Using pyplot to show the image and printing the prediction
酷,预测是对的,用 pyplot 显示图像。下一步是使用石灰显示图像的哪些部分影响了分类决策:
# Explain
explanation = explainer.explain_instance(wine_image[0], model.predict, top_labels=2, hide_color=0, num_samples=1000)# Show image with explanation's masks
temp, mask = explanation.get_image_and_mask(0, positive_only=False, num_features=10, hide_rest=False)
show_img(mark_boundaries(temp / 2 + 0.5, mask))
Positive influence in Green, Negative in Red
很好。正如所料,葡萄酒的软木塞不同于气泡瓶(影响葡萄酒决策的绿色部分)。起泡的瓶子上的标签通常也较低,瓶子的形状较薄(红色部分影响非起泡的决定)。我用一瓶起泡葡萄酒继续分析:
Positive influence in Green, Negative in Red
此外,正如所料,瓶子的顶部和软木塞的形状积极地影响了对起泡葡萄酒的决定,以及瓶子本身的形状影响了对非葡萄酒的决定。
结论
总之,我们有一个超级有效的 CNN 模型,用大约 100 行代码训练和保存。我们知道这不仅仅是魔法在发生,因为我们解释了图像中识别的模式。
有哪些可以改进的地方?
- 拥有更加多样化的图像数据集。老实说,这个场景很容易操作,因为背景是白色的。
- 多解释几个图像。为解释而挑选的两张图片相当标准。解释模型做出错误预测的情况也很有趣。
- 将这个模型发布为 Flask/Django API,并编写一个移动应用程序,让人们用他们手机的图片来训练它
链接
- 美国有线电视新闻网(CNN):https://github.com/keras-team/keras
- Keras 博客:https://Blog . keras . io/building-powerful-image-class ification-models-using-very-little-data . html
- 石灰库(型号说明):https://github.com/marcotcr/lime
- 本文的代号:https://github.com/olivierg13/WinesSparklingsKeras
赢得 CFT 2018 拼写纠正比赛
原文:https://towardsdatascience.com/winning-a-cft-2018-spelling-correction-competition-b771d0c1b9f6?source=collection_archive---------14-----------------------
或者在一个具有挑战性的领域中构建一个任务无关的 seq2seq 管道
这是我们第一次一起赢得 ML 比赛
一篇简短的哲学序言。
我们作为 Profi.ru 团队(你真正的+ Dmitry Voronin 帮了点忙)和 Sava Kalbachou(Lucidworks)参加,她是我在许多比赛中的老朋友,也是 NLP 的专家。对我们团队来说,这是一次漫长、艰难、紧张而又意外收获的旅程。
用一句话概括所有的经历— 旅程比目的地更重要。这场比赛教会了我们很多关于坚持不懈,尝试新事物,跌倒了再站起来。
我个人为此任务编译/优化了 3 或 4 个管道,直到我能构建出最好的一个。同样,像往常一样,我们在终点线 xD 前一天发现了一个关键错误
TLDR
我们设法将一些当前最先进的序列到序列模型应用于混合多任务/自动编码器设置中具有挑战性的领域中的真实in the wild
问题。
任务的核心是——文本输入分类(正确/需要纠正/随机不相关垃圾)和输入纠正(本质上是拼写检查)。
域名是——来自独联体国家的个人姓名:
- 主要是俄罗斯、摩尔多瓦、乌兹别克斯坦、格鲁吉亚、塔吉克斯坦、哈萨克斯坦、乌克兰等;
- 名字通常由三部分组成(名、姓、父名)——
Иванов Иван Иванович
。有时在某些共和国,父名有附加的后缀作为第四个单词(ОГЛЫ
,与俄语中的вич
后缀相同,但却是一个独立的单词); - 有 2+个字母,总共约 70+个字符+数据中的大量噪声;
最有效的模型
- 序列间:
- 调优的序列间双向 GRU(详见下文)——
92.5%
wo 启发式、93%
with 启发式、93%+
in ensemble; - 适当的序列间推理循环;
- 此外,Keras 中一个没有瓶颈且带有 Conv1D 输出层的更简单模型运行良好,最高得分为
88-89%
; - 最强的天真启发法—如果 seq2seq 推理循环的输出与输入相同—那么输入是正确的;
关键要点:
- Seq2seq transformer 花了更多的时间来训练,我们没能让它像传统模型一样工作。显然我们缺乏这方面的经验,但这是我第四次注意到真人提到《变形金刚》不适合“真人”(即不实用);
- 我们的主要竞争对手(有大约 200 份提交)根本没有使用深度学习——他基本上对主机的增强管道进行了逆向工程——这是一项艰巨的工作,但无法扩展到其他领域;
- 批量 seq2seq 预测是快速推断的关键;
- Beam search 虽然很难实现,但对分数的提升并不显著(明显的罪魁祸首——小词典);
域/数据集描述
一个例证胜过千言万语。另请注意,在 train + test 中有大约 2000 个国家,即国家输入也非常嘈杂。
我们最终没有使用国家——因为添加国家嵌入并没有提高我们的指标
比赛的主持人也分享了一个强大而简单的基线:
- 一个基于 n 元文法的线性回归分类器:
- 简单使用第三方库来纠正印刷错误;
The distribution of the number of errors per query
代码发布
我们不会费心复制整个培训过程(由于我们与竞赛主办方的协议),因为有许多微调步骤,但总体而言这些部分将可为您重复使用:
- 准备竞赛数据集(见笔记本第一章);
- 如果您在环境中遇到问题(当构建映像时,PyTorch 4.0 或 4.1 是主要版本,瞄准它,否则您将不得不使代码兼容);
- Keras 模型:
python preprocessing.py python spell_simple_seq2seq_train_predict.py
- PyTorch BiLSTM seq2seq:
- 最佳模特培训:utils;
- 最佳模特类;
- 最佳火车模型流水线;
- 典型的启动命令(标志名称不言自明):
CUDA_VISIBLE_DEVICES=0 python3 train_encoder_decoder_predict.py \ --resume weights/some_checkpoint.pth.tar \
--heavy_decoder True --lr_factor 0.5 \
--trn_df_path ../data/pseudo_aug2_proc_trn.csv \
--tb_name test_name \
--lr 1e-6 --epochs 100 \
--batch_size 128 \
--hidden_size 512 --dropout 0.2 \
--num_layers 4 --num_classes 3 --emb_size 512 \
--cn_emb_size 0 --num_cn 0 \
--tensorboard True \
实现我们结果的关键里程碑
This is how our scores improved
(*)
很可能我们没有在这方面投入足够的时间,但是基础管道的目标不同,所以我们放弃了这个想法;(**)
尽管最大的合理 BiGRU 模型训练了 15-20 个小时,但这将在一个 GPU 上训练至少一周才能达到类似的结果;(***)
车神大多腐朽,MOAR 层层!;(****)
我们两次在生成扩充数据时出错。起初,我在 50%的情况下混合了两列(源和目标)——并且模型一开始训练得更好。然后,我忘记了在扩充数据时更改目标标签
请参考这些惊人的文章了解我们使用的型号的更多螺母和螺栓:
什么有效:
- 用 biLSTMs (
91%+
)进行序列对序列建模; - 验证与 LB 精确匹配——我们没有尝试 K 倍验证,但是预先分割数据集已经足够精确;
- 使用简单的管道清除多余的字符和明显的错误;
- 伪标签和文本扩充(单个模型上的
91%
+1.5%
); - 使用“整个”训练数据集,即使用所有正确的名称作为“正确的”名称,并使用所有不正确的名称。与额外的扩充(1 倍大小的训练数据集)配对—结果是我们单一的最佳预处理管道(单一模型上的
91%
+1.5%
); - 后处理试探法(见下文);
- 运行基于批次的推理循环(在带注释的编码器、解码器和转换器中,预测以批次大小为 1 进行处理);
不可行的想法/解决方案/模式,或者我们没有尝试
- BPE /例句 —我们尝试了几种词汇(500、1500、5000 令牌大小等。)通过句子片段在无监督的情况下获得。但它并没有真正帮助模型更快地收敛,结果比我们预期的更糟;
- 波束搜索 —最有可能是因为模型置信度和词汇量小。它提高了一点分数,但没有提供太多的价值。这是一个棘手的问题,但我很失望,它没有我们预期的那样有效;
- transformer model——当我采用并优化带注释的 transformer 管道时,它工作了,但未能在有意义的时间内收敛;
- 来自开放 AI transformer 实验的 LM 辅助分类器——它根本没有收敛,很可能是因为它缺乏一个正确的 seq2seq 推理循环,对我来说这是一个容易实现的结果(我刚刚准备好这个管道,而 Sava 吹嘘他的初始 88%管道);
- 多 GPU /集群/分布式训练——没试过;
- 动态运行增强——我相信你可以在 torchtext 中扩展这个行来这样做,但是我推迟了一点,然后就没有时间这样做了。但根据我的经验,这可能会使收敛速度加快 3 到 10 倍;
文本数据扩充
经过一些逆向工程过程(顺便说一下,基于单词 ngrams),结果证明,组织者使用非常简单的错别字生成方法。有 5 种主要类型:
- 插入,最主要的类型( ~所有病例的 50% )。只是在单词中随机取一个字母,并在它的前面或后面插入一个新字母。一个新字母是一个随机选择的最接近的字母(在键盘上),例如,字母 W 、 S 或 A 如果选择了 Q 。伊万——ICVAN;
- 改变、 ~30% ,只是将一个单词中的任意一个字母在一个 keybord 上改变成与其最接近的 random(就像插入的情况)。伊万—IVQN;
- Wwap 两个最近的随机字母的位置, ~5% 。伊万——张牧阅;
- 两个字之间删除空格,~ 7.5%;
- 删信(完全随机~ 7.5%)伊凡——凡;
每个有错别字的查询都包含上面列出的一个( 93% )两个( 6% )或三个( ~1% )错误的组合。
因此,我们设法编写了自己的函数来生成额外的数据集,并将其与原始数据集一起用于训练。
后处理启发法
在建立第一个 seq2seq 模型后,我们注意到,有时模型预测类 0(短语不包含错误),但预测的短语与原始短语不同。我们将此作为一种启发,将预测类从 0 更改为 1(短语包含错误),这给了我们 0.5-1.5%的提升,这取决于模型的质量(对于强模型来说更少)。
另一个启发是在我们确定预测中有错误(模型预测类别 1,但是预测短语等于原始短语)的情况下,将预测类别/短语改变为来自完全不同的模型(如 Keras one)的预测。
不起作用的试探法,或者我们没有探索的试探法
在某个时刻,我们注意到,与“新”单词(名字/姓氏/父名)相比,网络更有可能在它“知道的”单词上犯错误。这意味着网络泛化能力很好,但尽管如此,我们还是尝试应用一种明显的启发式方法进行测试,本质上类似于伪标签。
显然,我们尝试使用字典启发式,即检查预测的单词是否出现在名称的词汇表中。它在验证上提供了显著的提升,但是在测试上没有提供合理的提升(很可能是因为有很少的名字被预测错误和/或在训练中不存在)。显然,我们试图添加预测的“正确”测试名称,但这没有帮助。
训练与测试单词字典重叠
集合模型
正如在比赛中经常发生的那样,在接近终点的某个时候,你必须做一些堆叠/组装来继续比赛并保持在 LB 的顶端。这场比赛也不例外。
我们使用拒识验证数据来寻找最佳的组合方式及其参数。对于分类的第一个任务,我们使用了各种不同模型预测概率的几何平均值。对于域名更正的第二步,我们实现了简单多数投票机制,该机制应用于预测域名的每个令牌。在每一步之后,也使用上述试探法。
这个简单而有效的组合给了我们最终 0.003%的提升和第一名。我们选择它和最佳单曲作为我们的两个最终提交:
改进带注释的编码器-解码器和带注释的转换器
如您所知,biLSTMs / biGRUs 和 transformers 是市场上最具挑战性的型号,例如:
- 神经机器翻译;
- 文本抽象;
- 序列对序列建模;
- 文本推理任务;
当重用这些教程编码器解码器和注释变压器中的恒星管道时,我们站在巨人的肩膀上。
但是就像我们生活中的一切一样,它们并不完美。
关键缺点:
- 两者中的预测都是以一个批量处理的。当您运行大量端到端实验时,这并不理想;
- 带注释的编码器/解码器拥有损失加权,但没有解释当将其与次要目标配对时(就像我们的情况),你必须格外小心加权损失的两个分量,以避免在一个任务上过度/不足;
- 虽然 torchtext 对于它的构建目的(加速 NMT 实验)——对于应用竞争 NLP 管道——来说是令人敬畏的,但是它有点慢和笨重,并且种子参数不直观。或许我应该更好地解决缓存问题,但我选择了最简单的解决方案,即我下面解释的 CSV 文件;
- 我完全理解 PyTorch 中的分布式/数据并行例程有点实验性,并且需要大量维护,但 ofc 注释的变形金刚多 GPU loss compute 函数在
PyToch 0.4+
中出现。我决定不解决这个问题,但是也许我应该解决,特别是对于变形金刚;
批量预测和波束搜索
在训练和验证模型时,这两种方法都非常注重有效地运行模型。但是由于某些原因,教程中介绍的推理贪婪搜索循环是为大小为 1 的批处理编写的。
您可能知道,这将使端到端验证速度降低了 10 倍。所以,我基本上写了 3 个函数:
所有这些来自 torchtext 的抽象…如何烹饪它们
显然这些是为 NMT 建造的。它们还以张量的形式将所有数据加载到 RAM 中,以加快迭代速度(在使用这些数据时,最好使用 python 中的迭代器,以避免更多的 RAM 使用),这与标准的 PyTorch Dataset / Dataloader 类不同,后者更灵活一些。
这些抽象的优点:
- 代码重用和简单性;
- 它们是……高层次、抽象的;
- 创建、描述和预处理数据集的步骤简单且简化;
- 繁琐的步骤,如添加开始令牌,结束令牌,独特的令牌,填充令牌只是为你做的;
- 一旦掌握了拆分和字典构建——替换您的文本预处理函数来尝试不同的标记化方案就变得非常容易(例如检查这个一个和这个一个);
缺点:
- 在构建字典以使相同模型的重新运行兼容时,您必须非常小心泄漏(这实际上在开始时让我有点受不了);
- 显然,这种开箱即用的方法只适用于数字和文本数据。任何其他形式的数据——你必须即兴创作/扩展类;
- 我不喜欢在那里实现拆分的方式——所以我们最终通过拆分一个单独的
.csv
文件来创建一个 hould out 数据集; - 如果你有很多数据(例如 1000 万个输入目标对),RAM 消耗非常高,所以如果你想有更多的数据/使用扩充,你基本上必须修改/扩展这些类;
- 虽然理论上扩展这些类来阅读
.feather
而不是.csv
是很容易的,但是由于缺乏时间和注意力不集中,我没有这样做; - pickle 问题——由于读取
.csv
文件很慢,我试图 pickle 一些明显的对象——但是失败了——迭代器/生成器在 python3 中是不可 pickle 的。我想我应该用 dataset 类(而不是 BucketIterator 类)来完成它;
典型风味
在某个时候,我注意到在我们的最佳模型中有两个瓶颈:
- 由于编码器是双向的,而解码器不是双向的,因此编码器和解码器之间的传输成为瓶颈。所以简单地说,我通过把我的解码器增大两倍解决了这个问题(它帮助我的模型收敛);
- 我还尝试了添加国家嵌入和添加跳过连接和一个本质上类似于从抽象模型中复制注意力的注意力层——这些想法对我不起作用;
- 我还玩了本质上的丢弃嵌入(字符级模型),结果很差;另一方面,Keras 模型在 char 级别比使用嵌入工作得更好。
值得注意的是,最好的模型是相当沉重的,沉重的解码器也增加了相当多的时间。
损失权重至关重要!
我没有为此运行消融测试(虽然我有很多在 2-3 次丢失的情况下对象检测失败的经验),但我假设由于丢失基本上被应用于语言建模目标n_token
次,然后通过数量或记号归一化,为了实现最佳结果,分类丢失应该是类似的大小的。我通过使用 PyTorch 中最方便的损失层简单地实现了这一点(是的,我忘记了将这一损失按批量大小划分,但我想这并不是很关键)。
KLD 损失?
一个我没有探究的来自注释变压器的好主意——用类 KLD 损失(通常用于变分自动编码器)替换分类损失,以增加预测的方差。但我猜对于词汇量小的人来说不重要。
参考
- seq2seq 车型力学关注;
- 神奇画报变形金刚;
- 带注释的编码器解码器和带注释的变压器(老款 py torch);
- PyTorch 中的 OpenAI transformer 实现;
- 火炬文本数据管道解释;
- 字节级 NMT 模型的情况;
原载于 2020 年 11 月 22 日spark-in . me。
强大的力量伴随着贫乏的潜在代码:VAEs 中的表征学习(Pt。2)
原文:https://towardsdatascience.com/with-great-power-comes-poor-latent-codes-representation-learning-in-vaes-pt-2-57403690e92b?source=collection_archive---------6-----------------------
(如果你还没有这样做,我建议回去阅读本系列关于 VAE 故障模式 的第一部分;我花了更多的时间来解释一般的生成模型的基础,特别是 VAEs,因为这篇文章将从它停止的地方跳出来,那篇文章将提供有用的背景)
我发现一个机器学习的想法特别引人注目,那就是嵌入、表示、编码:所有这些向量空间,当你放大并看到一个概念网络可以被漂亮地映射到数学空间的方式时,它们看起来几乎是神奇的。我已经在参数优化和向量代数的杂草中花了足够多的时间,知道即使我说,称机器学习的任何方面为“神奇的”都是异想天开,但是:像这样的方法不可避免地很诱人,因为它们提供了找到一些概念的最佳表示的可能性,一种“最佳数学语言”,我们可以用它向我们的机器提供世界上所有的信息。
TIL: it’s (un)surprisingly hard to find good visualizations of high-dimensional embedding spaces, especially if you don’t want the old “king — queen” trick
那个模糊的梦想,以及对我们目前离它有多远的敏锐意识,是我写这两篇文章的动机,探索我们目前在无监督表示学习方面的最大努力之一可能失败的方式。早先的帖子讨论了 VAE 表示法是如何失败的,它以一种过于密集、复杂和纠缠不清的方式将信息嵌入隐藏的代码中,而这种方式不符合我们的许多需求。这篇文章探讨了一个由不同困境驱动的解决方案:当我们使用一个容量如此之大的解码器时,它选择根本不在潜在代码中存储信息,这一结果将关于我们分布的重要信息锁定在解码器参数中,而不是作为内部表示整齐地提取出来。
如果你所关心的是建立一个生成模型,以便对新的(人工的)观察结果进行采样,那么这不是问题。然而,如果您希望能够通过修改 z 代码来系统地生成不同种类的样本,或者如果您希望使用编码器作为一种将输入观察结果压缩为另一个模型可以使用的有用信息的方式,那么您就有问题了。
无事生非
有时,当阅读技术论文时,你会看到一篇又一篇论文中的陈述被草率地做出,没有解释,好像它太明显而不值得解释。你开始怀疑自己是否出现了思维障碍,是否有一些其他人都有而你却忽略了的非常明显的洞察力。
这就是我不断阅读有关变分自动编码器(VAEs)的论文时的感受,这些变分自动编码器能够重建输入,但在它们的潜在代码中不存储关于每个输入的任何信息。
但是,在我们深入研究为什么和如何这种情况发生之前,让我们后退几步,并浏览一下上述陈述的实际含义。正如您(希望)在我之前的文章中读到的,vae 是围绕信息瓶颈构建的。编码器接受每个观察值 X,并计算压缩的低维表示 z,这在理论上应该可以捕捉关于该特定 X 的高级结构。然后,解码器接受 z 作为输入,并使用它来产生原始输入 X 的最佳猜测。解码器的重建猜测和原始 X 相互比较,两者之间的像素距离(以及推动每个 p(z|x)更接近典型高斯先验分布的正则化项)用于更新模型的参数。从概念上讲,在这样一个模型中,关于数据分布的信息存储在两个地方:代码 z 和将 z 转换为重构的 x 的网络权重。
当我们训练用于表示学习的 VAE 时,我们想要的是 z 表示描述该特定图像中存在的内容的高级概念,以及解码器参数,以学习关于如何将这些概念实例化为实际像素值的一般化信息。(题外话:同样的逻辑适用于你正在重建的任何给定的观察;我倾向于引用图像和像素,因为几乎所有最近的论文都关注图像,并使用这种语言),
当我阅读的所有这些论文声称 z 分布无信息时,他们的意思是:网络收敛到一个点,在这个点上,编码器网络产生的 z 分布是相同的,而不管编码器给定哪个 X。如果 z 分布不随特定 X 的不同而不同,那么,根据定义,它不能携带关于这些特定输入的任何信息。在这种模式下,当解码器创建其重建时,它本质上只是从全局数据分布中采样,而不是由 x 的知识所通知的分布的特定角落。
我不能代表所有人,但我真的很难直观地理解这是如何发生的。VAE 的整个概念结构就像一个自动编码器:它通过计算重建输出和实际输出之间的像素距离来学习。即使我们想象我们有办法从真实的数据分布中完美地采样,使用 z 来传达一些关于我们试图重建的 X 的信息(例如,一个场景是一只猫,而不是一棵树)似乎也有明显的价值。为了建立更好的理解,我不得不进行两次智力旅行;首先是通过自回归解码器的机制,其次是通过 VAE 损失本身的经常棘手的数学。一旦我们从另一端走出来,我们就能更好地理解在赵等人的 InfoVAE 论文中提出的机械上简单的解决方案背后的概念基础。
当自动编码遇到自回归时
概率论中一个简单的基本方程是概率链规则,它控制着联合分布分解成先验概率分布和条件概率分布。如果想知道 p(x,Y),也就是说 X 和 Y 都发生的概率,也就是说联合分布 P(X,Y)在点(X,Y)的值,可以写成:
p(x,y) = p(x)p(y|x)
自回归生成模型(其中最著名的是 PixelRNN 和 PixelCNN)采用了这一思想,并将其应用于生成:与其试图独立生成每个像素(典型的 VAE 方法),或试图将每个像素生成为每个其他像素的条件函数(计算上不可行的方法),不如假设图像中的像素可以像序列一样处理, 和生成的像素,如上面的等式所示:首先基于 x1 像素值的无条件分布选择像素 x1,然后基于以你选择的 x1 为条件的分布选择 x2,然后以 x1 和 x2 为条件的 x3,等等。 PixelRNN 背后的想法是:在 RNN 中,你内在地将关于过去生成的像素的信息聚集到隐藏状态中,并可以使用它来生成下一个像素,从左上角开始并向下和向右移动。
虽然 PixelRNN 在与自回归模型的纯粹直觉保持一致方面做得更好,但更常见的自回归图像模型是 PixelCNN。这是由于 RNNs 的两个有意义的缺点:
- 他们可能很难记住全球背景(即在长时间窗口内存储信息)
- 您不能并行处理 RNN 的训练,因为图像中的每个像素都需要使用在您当前位置“之前”创建完整图像时生成的隐藏状态
Ahh, the smell of pragmatic-yet-effective hacks in the morning
在重视实际可训练性而不是密闭理论的伟大机器学习传统中,PixelCNN 诞生了。在 PixelCNN 中,每个像素都是通过使用其周围的像素计算的卷积来生成的,但重要的是,只有在我们任意的从左上到右下的排序中出现在它“之前”的像素。这就是上图中的暗灰色区域:一个应用于卷积的遮罩,以确保位置“e”处的像素没有使用任何“来自未来”的信息来调节自身。当我们从零开始生成图像时,这一点尤其重要,因为根据定义,如果我们从左到右生成,给定的像素将不可能根据尚未生成的更靠右和更靠下的像素来决定其值。
PixelCNNs 解决了上面列出的两个 PixelRNN 问题,因为: 1)随着增加更高的卷积层,每层都有更大的“感受域”,即它在卷积的金字塔上更高,因此有一个以更宽的像素范围为条件的基础。这有助于 PixelCNN 访问全局结构信息
2)因为每个像素仅取决于直接围绕它的像素,并且该模型的训练设置是逐像素值计算损失,所以通过将单个图像的不同片发送给不同的工作者,该训练很容易并行化
回到 VAEs 的土地上,这些自回归方法开始看起来相当有吸引力;历史上,VAEs 独立地生成图像的每个像素(以共享代码为条件),这固有地导致模糊重建。这是因为,当所有像素同时生成时,每个像素的最佳策略是根据共享代码生成其期望值,而不知道每个其他像素选择了什么像素值。因此,人们开始对在 VAEs 中使用自回归解码器感兴趣。这是通过附加 z 作为附加的特征向量来完成的,旁边是当前由 PixelCNN 使用的附近像素值的卷积。正如预期的那样,这导致了更清晰、更详细的重建,因为像素能够更好地相互“协调”。
因为当我用隐喻思考时,我想得最好,所以独立像素生成的过程有点像委托不同制造厂制造机器的零件;由于每个工厂都不知道其他工厂在建造什么,所以它完全依赖于中央的指导,让各个部分协调一致地工作。相比之下,我认为自回归一代有点像那个故事游戏,每个人写一个故事的句子,然后传给下一个人,下一个人根据上一个写一个新的句子,以此类推。在那里,不是让中心指导来促进整体的各部分之间的协调,而是每个部分使用该部分之前的上下文来确保它是协调的。
这开始让我们了解为什么自回归解码器可能导致潜在代码中的信息减少:以前由共享潜在代码促进的多像素协调现在可以通过让您的网络在以前生成的像素范围内可见来处理,并让它调整其像素输出。
处理损失(功能)
以上都很好:我可以很好地理解自回归模型的更灵活的参数化如何使它能够在不使用潜在代码的情况下对复杂数据进行建模。但是,我花了更长时间才明白:表面上,这些模型是自动编码器,需要能够成功地像素重建它们的输入,以满足它们的损失函数。如果模型不使用 z 来传达关于输入的图像类型的信息,解码器如何能够产生具有低重建损失的输入?
为了理解这个模型的动机是如何排列的,我们应该从描述 VAE 目标函数的方程开始。
底部的等式是 VAE 函数的典型特征:
- 一个激励 p(x|z)变高的术语,也就是说,激励模型生成作为输入的图像的概率,也就是说,如果输出分布全部为高斯分布,则输入和重构像素之间的平方距离
- 激励编码 z|x 的分布接近全局先验的术语,它只是一个零均值高斯分布。(KL 散度测量这些分布相距多远,并且由于这是被最大化的目标中的负项,所以模型试图使 KL 散度的大小更小)
在这个框架下,很容易认为模型的主要功能是自动编码,惩罚项只是一个相对不重要的正则项。但是,上面的等式也可以排列如下:
严格遵循上面的数学公式并不是最重要的;我主要是展示求导,这样第二个方程就不会凭空出现了。在这一表述中,VAE 的目标也可以被看作是:
- 增加 p(x ),也就是说,增加模型在数据 x 中生成每个观察值的概率和能力
- 减小编码分布 q(z|x)和真实的基础后验分布 p(z|x)之间的 KL 散度
等式的第二位意味着什么?在这种情况下,你可能有点难以理解“后”到底是什么意思。这是一个有点模糊的想法。但是,我们知道的一件事是:
换句话说,这意味着先验 p(z)是所有条件分布 p(z|x)的混合,每个条件分布都根据其伴随的 x 值的可能性进行加权。VAE 的标准形式是对其所有条件分布 q(z|x)使用高斯分布。用更清楚的非概率的话来说,这意味着编码器网络从输入值 X 映射到高斯的均值和方差。我们通常还将先验设置为高斯分布:均值为零,方差为 1。这两个事实有一个有趣的含义,这个图表很好地体现了这一点:
这表明:将多个高斯函数相加,并使它们的和也是高斯函数的唯一方法是,如果所有相加的高斯函数具有相同的均值和方差参数。这意味着:如果你想让 q(z|x)完美地匹配 p(z|x ),或者
- 你的 q(z|x)不需要是高斯型的,或者
- q(z|x)必须等价于 p(z):同一个无信息单位高斯,不考虑输入 x 的值。
如果 q(z|x)除了上面概述的两个选项之外做任何事情,它将不能与 p(z|x)相同,并且将因此通过 q(z|x)和 p(z|x)之间的 KL 发散产生一些成本。因为我们通常在结构上选择只允许高斯 p(z|x ),这意味着网络唯一可用的选项,即允许它从第二项中零损失,是使条件分布无信息。
向后遍历内容堆栈,这意味着网络将仅选择使其 z 值具有信息性,如果这样做对于建模完整的数据分布 p(x)是必要的话。否则,它因使用信息性 z 而遭受的损失通常会超过使用它所获得的单个图像准确性的好处。
供参考
有了这些背景知识,我们现在就能更好地理解 InfoVAE 论文针对这个问题提出的解决方案。该文件对“香草 VAE”目标提出的两个主要批评是
- 信息偏好属性,这就是我们上面概述的:vae 倾向于不在他们的潜在代码中编码信息,如果他们可以避免的话。当正则项太强时,这往往会发生。
- “爆炸潜在空间”问题。这基本上就是我在之前的博客文章中讨论的内容,在没有足够的正则化的情况下,网络有动力使每个 x 的条件 z 分布不重叠,这通常会导致较差的采样能力和更复杂的表示。
尽管这个问题很难理解,但他们提出的解决方案实际上非常简单。还记得在最初的 VAE 方程中,我们如何惩罚 z 上的后验和 z 上的先验之间的 KL 散度吗?
这里要记住的重要一点是,这是为每个个体 x 计算的。这是因为编码层是随机的,因此对于每个输入 x,我们不是简单地产生一个代码,而是产生代码上的分布的平均值和标准偏差。对于每个单独的输入,它是与标准正态分布的先验进行比较的分布。
与之相反,InfoVAE 论文提出了一个不同的正则项:激励聚集的 z 分布接近 p(x ),而不是推动每个单独的 z 接近。聚集的 z 分布为:
换句话说,基本上就是说,我们应该将所有 x 值产生的条件分布聚合在一起,而不是采用每个单独输入 x 定义的分布。如果你到目前为止一直在跟踪的话,这种方法的基本原理是相当一致的。信息偏好的特性来自于这样一个事实,当你激励每个个体有条件地接近先验时,你实际上是在激励它不提供信息。但是,当您激励聚合的 z 接近先验时,您允许每个单独的 z 代码有更多的空间偏离 N(0,1),并且这样做携带了关于产生它的特定 X 的信息。然而,因为我们仍在推动聚集分布接近先验分布,所以我们不鼓励网络陷入“爆炸潜在空间”问题,在该问题中,网络将其平均值推动到较高的量级,以创建将提供最多信息的非重叠分布。
注意,这种新的公式需要某种基于样本的方式来测量一组样本和先验之间的差异,而不是能够分析计算参数化条件分布和先验之间的差异。这种情况的一个例子是对抗性损失,在这种情况下,您获取编码器采样的 z 值集合,并将这些集合与从先前提取的 z 值集合一起提供给鉴别器,并激励模型使这两个集合不可区分。论文作者探讨了更多这样的方法,但是由于它们与本文的主旨相当正交,如果您阅读了这篇论文,我将让您自己探索这些方法。
根据经验,作者发现这种修改导致自回归 VAEs 更多地利用潜在的代码,而重建精度没有明显下降
未解决的问题
Source: http://kiriakakis.net/comics/mused/a-day-at-the-park
我比我第一次构思这个帖子系列时更了解表征学习,如果我做得对,你也一样。但是,以一个结论结尾意味着一些现成的答案,而且我认为问题通常比答案更有趣,所以我会把其中的一些留给你。
- 如果我们的目标实际上是表征学习,你是否有模糊重建真的有关系吗?这基本上是在问:像 PixelCNN 能给我们的那种清晰的重建,实际上是我们最关心的吗?
- 如果我们将早期文章中的一些解开技术与重建概念级特征(即除原始像素之外的编码网络层)的目标相结合,我们能获得更好的表征学习吗
- 为了便于特征学习,拥有随机代码有多大价值?如果你使用一个“聚合 z”优先执行方法,就像 InfoVAE 中概述的那样,那能让我们从使用高斯函数作为潜在代码中解放出来吗?
- 我们是否还可以在网络的重建部分有效地使用对抗性损失(即:让鉴别器尝试区分输入和重建),以避免过度关注像素损失带来的精确细节重建
来源:
- 变分有损自动编码器
- 信息最大化变分自动编码器
- 自动编码单个比特
使用 Twitter 情感分析的品牌认知
原文:https://towardsdatascience.com/with-the-emergence-of-social-media-high-quality-of-structured-and-unstructured-information-shared-b16103f8bb2e?source=collection_archive---------13-----------------------
随着社交媒体的出现,通过各种来源共享高质量的结构化和非结构化信息,如 Twitter 或脸书生成的描述用户情绪的数据。处理这些信息的能力对于使用 Twitter 情感分析深入了解品牌认知变得非常重要。文本分析是机器学习技术的一部分,其中从文本中获得高质量的信息,以挖掘客户对特定品牌的感知。
品牌感知是消费者对品牌体验的特殊结果。本文旨在了解消费者对品牌的形象和认知,以及他们对#nike 品牌的真实想法和感受。在这项研究中,我们从 twitter 上收集了用于品牌认知和情感分析的数据。
照做 是鞋业公司耐克的商标,也是耐克品牌的核心组成部分之一。这个口号是在 1988 年的一次广告代理会议上提出的。
1)从 TWITTER 中提取数据
使用 Twitter 应用程序帐户从 Twitter 提取最新的推文。
install.packages("twitter")install.packages("ROAuth")library("twitter")library("ROAuth")cred <- OAuthFactory$new(consumerKey='XXXXXXXXXXXXXXXXXX',consumerSecret='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',requestURL='[https://api.twitter.com/oauth/request_token](https://api.twitter.com/oauth/request_token)',accessURL='[https://api.twitter.com/oauth/access_token](https://api.twitter.com/oauth/access_token)',authURL='[https://api.twitter.com/oauth/authorize](https://api.twitter.com/oauth/authorize)')
在清理用于分析的数据之前,让我们首先更改日期和文本列的格式。文本列可能包含数字、散列标签和其他正则表达式,将它们全部转换为字符值,使语料库易于阅读。
tweets$created <- **as.Date**(tweets$created, format= "%y-%m-%d")tweets$text <- **as.character**(tweets$text)
2)创建品牌语料库
语料库由文本文档组成。r 编程使用这个术语来包含一组被认为相似的文本。
*#Data Pre-processing***set.seed**(100)(n.tweet <- **length**(tweets))## [1] 17
上面的代码读入数据并返回指定的文本长度。
语料库包中的 corpus()是一个为文本挖掘创建文本集合的函数
#用 tweet 文本创建文档语料库。
corpus<- **Corpus**(**VectorSource**(tweets$text))corpus[[1]]
3)预处理和清洗
预处理文本可以显著提高单词袋方法的性能。做到这一点的第一步是创建一个语料库,简单地说,就是文本文档的集合。一旦创建了语料库,我们就可以进行预处理了。
首先,让我们去掉标点符号。处理这个问题的基本方法是删除所有不是标准数字或字母的东西。在我们的例子中,我们将删除所有标点符号。接下来,我们将单词的大小写改为小写,这样相同的单词就不会因为大小写不同而被视为不同。
我们必须做的另一个预处理任务是去除无意义的术语,以提高我们理解情感的能力。
通过 tm_map()函数完成文本转换。基本上,所有转换都在单个文本文档上工作,tm_map()只是将它们应用于语料库中的所有文档。
删除网址
这将从语料库文档中删除 URL
#移除网址
removeURL <- **function**(x) **gsub**("http[^[:space:]]*", "", x)corpus <- **tm_map**(corpus, **content_transformer**(removeURL))
去掉标点符号
构建外部函数并传递给 tm_map()来转换文本语料库。
#去掉标点符号
remove_punct<-**function**(x)**gsub**("[^[:alpha:][:space:]]*", "", x)corpus <- **tm_map**(corpus, **content_transformer**(remove_punct))
去除空白
这将从文本语料库中删除空白
#修剪多余的空格
corpus = **tm_map**(corpus, stripWhitespace)
去掉@(用户名)
语料库中的少数单词可能包含邮件 id 或以@开头的单词。
removeUsername <- **function**(x) **gsub**("@[^[:space:]]*", "", x)corpus <- **tm_map**(corpus, **content_transformer**(removeUsername))**writeLines**(**strwrap**(corpus[[750]]$content,60))## RT Nike Dont ask if your dreams are crazy Ask if theyre## crazy enough justdoit
4)文本规范化
规范化过程包括统一转换文本。
将文本转换成小写
corpus <- **tm_map**(corpus, **content_transformer**(stri_trans_tolower))**writeLines**(**strwrap**(corpus[[750]]$content,60))## rt nike dont ask if your dreams are crazy ask if theyre## crazy enough justdoit
删除停止字
停用词只是没有意义的常用词。如果我们看看停用词(“英语”)的结果,我们可以看到什么被删除。
corpus = **tm_map**(corpus, removeWords, **stopwords**('English'))**inspect**(corpus)## [1] rt nike dont ask dreams crazy ask crazy theyre enough justdoit## [2] rt statecrafthuff paint kap person people even demonizes good cops trys sell americans false narra
让我们创建自己的停用词删除字典来进一步挖掘文本
#将停用词指定为字符向量
Corpus<-**tm_map**(corpus, removeWords, **c**("keep", "check", "can","just","isnt","hey","ask","theyr","dont","theyre","cmon","htt","everything","even","enough","rt"))
删除单字母单词
removeSingle <- **function**(x) **gsub**(" . ", " ", x)corpus <- **tm_map**(corpus, **content_transformer**(removeSingle))**writeLines**(**strwrap**(corpus[[750]]$content,60))## nike dreams crazy crazy justdoit
5)术语-文档矩阵
一旦我们预处理了数据,我们现在就可以提取 twitter 数据中使用的词频了。tm 包提供了一个名为 Term Document Matrix 的函数,它生成一个矩阵,其中的行对应于文档,在我们的例子中是 tweets,列对应于 tweets 中的单词。
矩阵中的值是该单词在每个文档中出现的次数。文档矩阵是包含单词频率的表格。列名是单词,行名是文档。文本挖掘包中的函数 TermDocumentMatrix()使用如下:
dtm <- **TermDocumentMatrix**(corpus)
just doit just doit 1730 crazy crazy 1564 Nike Nike 1124 dreams dreams 786 means means 332
最常用术语
基于 termdocumentmatrix()输出试图根据关键字的频率对它们进行排序。高频词是用户在推特上发布的,而特朗普是语料库中出现频率最低的词。
低频术语
低频@55 和@85 单词显示在下面的频率计数图中。
绘制词频
6)品牌词云
7)寻找关联
在这里,我们试图找到关键字之间的关联。
**barplot**(**t**(**as.matrix**(corrdf1)), beside=TRUE,xlab = "Words",ylab = "Corr",col = "blue",main = "nike",border = "black")
nike 这个词与“相信”、“基督”、“耶稣”、“Kaepernick”、“dems”和“run”等词密切相关
**barplot**(**t**(**as.matrix**(corrdf1)), beside=TRUE,xlab = "Words",ylab = "Corr",col = "yellow",main = "justdoit",border = "black")
同样的,justdoit 比 kaepernick 显示出更多与牺牲的联系
8)聚类
由于#nike 生成了许多类似的推文,从正在处理的海量数据中做出有意义的解释变得很有挑战性。我们试图将相似的推文聚集在一起。分层聚类试图构建不同级别的聚类。
函数 hclust()执行层次聚类分析。它使用凝聚法。为了完成这个操作,语料库被转换成文档矩阵。我们使用了沃德的方法进行等级聚类。下面的树状图显示了系统聚类的结果。
9)品牌感知建模
上图描述了所有术语的概率分布,每个 LDA 主题有 10 个术语,独立于其他 LDA 主题中的术语
10)推特情感分析
情感分析和观点挖掘是从书面语言中分析人们的观点、情感、评估、态度和情绪的研究领域。它是自然语言处理和人工智能中最活跃的研究领域之一,在数据挖掘、Web 挖掘和文本挖掘中也被广泛研究。
情绪分为积极、期待、恐惧、喜悦、惊讶和消极。
这表明,在 2000 个文本数据中,正面推文的得分相对高于其他情绪,约为 1400,其中有 1300 个关键词预期为负面,并且很少有情绪不能被分类。
结论
品牌认知在耐克 30 周年的“Just Do it”活动上,耐克与有争议的前 NFL 球星科林·卡佩尼克一起发起了一场活动。围绕 Kaepernick 的争议与他决定在 NFL 比赛开始时播放美国国歌时下跪有关,以抗议警察对有色人种的暴行。
Kaepernick 在过去的两个赛季中没有与 NFL 签约,但仍然被视为一个两极分化的人物。发起这项新的运动,耐克可能会疏远其美国消费者群中的一大部分,可能多达一半。他们为什么要这么做?也许他们认为这将使千禧一代的部落更加紧密,他们往往会参与抗议活动,特别是当政治领导人和其他权威人物与他们的感受和价值观不一致时。
因此,这场竞选分散了耐克部落的部分成员,分散了忠诚的美国爱国者和正在或曾经在我们的武装部队、政府或机构中服务的人,这些部队、政府或机构密切依赖于健康的政府和国家声誉。这些人认为,在体育赛事中不代表国歌是对美国理念和以国家名义所做牺牲的不尊重。他们认为科林·卡佩尼克采取的姿态是可疑性格的表现。他们认为他的公开姿态不合适,不合时宜。
这一最新版本的“就这么做”已经引发了一定程度的社会辩论,随着时间的推移,这将提高社会对耐克在这场运动中所冒风险的理解。对于许多城市和少数民族职业运动员来说,这一活动将拉近他们与品牌的距离。他们喜欢耐克支持运动员个人权利、道德良知、信念和抗议的行为。对于国联或国家来说,批评他们的言论或表达自由是不明智的。但是,我们可以就我们历史上这样一个事件和时刻的正反两面进行对话,大声地谈论美国价值观和人类价值观。当前的辩论可能会让美国的缔造者感到自豪。
http://rpubs . com/mal vika 30/Brand-Perception-情操-分析-R
字束搜索:一种 CTC 解码算法
原文:https://towardsdatascience.com/word-beam-search-a-ctc-decoding-algorithm-b051d28f3d2e?source=collection_archive---------1-----------------------
改善文本识别结果:避免拼写错误,允许任意数字和标点符号,并使用单词级语言模型
Trees are an essential ingredient of the presented algorithm. (Taken from http://turnoff.us/geek/binary-tree with changes)
让我们假设我们有一个用于文本识别的神经网络 (OCR 或 HTR),它是用连接主义者时间分类 (CTC)损失函数训练的。我们将包含文本的图像输入神经网络,并从中获取数字化文本。神经网络只是输出它在图像中看到的字符。这种纯光学模型可能会引入误差,因为看起来相似的字符如“a”和“o”。
如果您已经研究过文本识别,那么类似图 1 所示的问题对您来说会很熟悉:结果当然是错误的,但是,当我们仔细观察手写文本时,我们可以想象为什么神经网络会将单词“random”中的“a”与“oi”混淆。
Fig. 1: Why does the NN make such mistakes?
我们能改进我们的结果吗?
那么,如何应对这种情况呢?有不同的解码算法可用,有些还包括语言模型(LM)。让我们看看算法在我们的例子中输出了什么:
- 最佳路径解码:“A roindan nuni br:1234。”。这是图 1 所示的结果。最佳路径解码仅使用 NN 的输出(即无语言模型),并通过在每个位置取最可能的字符来计算近似值。
- 光束搜索:“A 罗恩丹号:1234。”。它也只使用神经网络输出,但它使用更多的信息,因此产生一个更准确的结果。
- 带字符的光束搜索-LM: “随机号:1234。”它还对字符序列评分(例如“an”比“oi”更有可能),这进一步改善了结果。
- 令牌传递:“一个随机数”。该算法使用字典和单词 LM。它在神经网络输出中搜索最可能的词典单词序列。但是它不能处理像“:1234”这样的任意字符序列(数字、标点符号)。
没有一个算法是正确的。但是我们观察到了波束搜索和令牌传递的良好特性:
- 波束搜索允许任意字符串,这是解码数字和标点符号所需要的。
- 令牌传递将其输出限制为字典单词,这避免了拼写错误。当然,字典必须包含所有需要识别的单词。
这两个属性的组合会很好:当我们看到一个单词时,我们只允许字典中的单词,但在任何其他情况下,我们都允许任意字符串。让我们看一个实现我们想要的行为的算法:字束搜索。
提出的算法:字束搜索
我们使用普通波束搜索算法作为起点。该算法迭代通过 NN 输出,并创建被评分的候选文本(称为束)。图 2 示出了射束演变的图示:我们从空射束开始,然后在第一次迭代中向其添加所有可能的字符(在该示例中我们只有“a”和“b ”),并且仅保留得分最高的字符。光束宽度控制幸存光束的数量。重复这一过程,直到处理完完整的神经网络输出。
Fig. 2: Beams are iteratively created (from top to bottom), equal beams are merged and only the best 2 beams (beam width=2) per iteration are kept.
让我们来看看如何调整普通波束搜索来获得想要的行为。我们希望算法在识别单词和识别数字或标点符号时表现不同。因此,我们为每个梁添加一个状态变量(状态图见图 3)。射束或者处于字状态,或者处于非字状态。如果 beam-text 当前是“He l ,那么我们处于单词状态,只允许添加单词字符,直到我们有了一个完整的单词,如“Hell”或“Hello”。当前处于非单词状态的光束可能看起来像这样:“她是 3 ”。
当一个单词完成时,从单词状态到非单词状态是允许的:然后我们可以给它添加一个非单词字符,就像如果我们有“Hello”并给它添加“”,我们就得到“Hello”。从非词态到词态的另一个方向总是允许的,就像在“她 33 岁”中,我们可能会加上词符“y”得到“她 33 y”(后来,也许,会得到“她 33 岁。”).
Fig. 3: Each beam can be in one of two states.
在 word 状态下,我们只允许添加最终会形成单词的字符。在每次迭代中,我们最多给每个梁添加一个字符,那么我们如何知道在添加足够多的字符后,哪些字符将形成一个单词呢?如图 4 所示的前缀树可以解决这个任务:来自字典的所有单词都被添加到树中。当添加像“too”这样的单词时,我们从根节点开始,添加(如果它还不存在)用第一个字符“t”标记的边和一个节点,然后向这个新节点添加边“o”,并再次添加“o”。最后一个节点被标记以表示一个单词的结束(双圆圈)。如果我们对单词“a”、“to”、“too”、“this”和“that”重复这一过程,就会得到如图 4 所示的树。
Fig. 4: Prefix tree containing words “a”, “to”, “too”, “this” and “that”.
现在很容易回答两个问题:
- 给定一个前缀,哪些字符可以加最终组成一个单词?简单地通过跟随用前缀的字符标记的边,转到前缀树中前缀的节点,然后收集这个节点的输出边的标签。如果我们被赋予前缀“th”,那么接下来可能的字符是“I”和“a”。
- 给定一个前缀,可以造出哪些单词出来呢?从前缀的节点中,收集所有标记为单词的后代节点。如果我们被赋予前缀“th”,那么可能的单词是“this”和“that”。
有了这些信息,我们就可以约束添加到梁(处于单词状态)的字符:我们只添加最终将形成单词的字符。参见图 5 的图示。
Fig. 5: The beams (left) are constrained by the prefix tree (right).
我们只保留每次迭代中得分最高的梁。分数取决于神经网络的输出。但是我们也可以将一个单词-LM 与不同的评分模式结合起来(在结果部分中使用了为这些模式提供的缩写):
- 根本不用 LM(W),只用字典约束单词。这就是我们到目前为止所讨论的。
- 每完全识别一个单词就按 LM 计分(N) 。假设我们有一束“我的 nam”。只要添加一个“e ”,最后一个单词“name”就完成了,LM 的得分是“My”和“name”相邻。
- 展望未来(N+F) :在前缀树的帮助下,我们知道哪些单词可能会在以后的迭代中出现。射束“I g”可以扩展为“I go”、“I get”,…因此,我们可以在每次迭代中对所有可能的词的 LM 分数求和,而不是等到一个词完成后再对射束应用 LM 分数,在上述示例中,这将是“I”和“go”,“I”和“get”,…。仅通过取单词的随机子集(N+F+S) 就可以实现小的性能改进。
我们现在有一个算法,能够识别正确的文本“一个随机数:1234。”如图 1 所示。单词受字典约束,但所有其他字符只是以神经网络看到的方式添加。
词束搜索的表现如何?
令人高兴的是,该算法能够正确地识别来自图 1 的样本。但我们更感兴趣的是该算法在完整数据集上的表现如何。我们将使用边沁 HTR 数据集。它包含大约 1800 年的手写文本,图 6 中示出了一个示例。
Fig. 6: Sample from Bentham dataset.
我们将相同的神经网络输出输入到所有解码算法中。这样,公平的比较是可能的。我们为 LM: 1 使用两种不同的训练文本。2)来自测试集的文本,它是理想的训练文本,因为它包含所有要识别的单词。2)从与包含 370000 个单词的单词列表连接的训练集的文本创建的基本训练文本。错误度量是字符错误率(CER)和单词错误率(WER)。CER 是地面真实文本和已识别文本之间的编辑距离,通过地面真实长度进行归一化。WER 也是这样定义的,但是是在词汇层面。
结果如表 1 所示。在这个数据集上,词束搜索优于其他算法。如果我们对于 LM 有一个好的训练文本,那么用它来对波束进行评分是有意义的(模式 N、N+F 或 N+F+S)。否则,最好只是约束文字,不要用 LM 来给梁打分(W 模式)。
如果我们不知道我们必须识别哪些单词,或者我们根本不需要识别单词,其他算法会执行得更好。
Table 1: Results given as CER [%] / WER [%] for different algorithms (VBS: vanilla beam search, WBS: word beam search, W: no LM used, N: LM used, N+F: LM with forecasting, N+F+S: LM with forecasting and sampling) and training texts for the LM (perfect and rudimentary LM). A small CER/WER means that we have a well performing algorithm.
履行
代码可以在 GitHub 上找到。提供了一个 Python,C++和 TensorFlow 实现。
参考资料和进一步阅读
规范和出版物:
- 实现字梁搜索
- ICFHR 2018 论文
- 海报
- 论文:在 5 个数据集上评估词束搜索
关于文本识别和 CTC 的文章:
- CTC 简介
- 普通光束搜索
- 实现文本识别系统
单词嵌入之间的单词距离
原文:https://towardsdatascience.com/word-distance-between-word-embeddings-cc3e9cf1d632?source=collection_archive---------4-----------------------
Photo by Rob Bates on Unsplash
单词移动距离(WMD)被提出用于测量两个文档(或句子)之间的距离。它利用单词嵌入能力来克服这些基本的距离测量限制。
WMD[1]是由 Kusner 等人在 2015 年提出的。他们建议使用单词嵌入来计算相似度,而不是使用欧几里德距离和其他基于单词包的距离度量。准确地说,它使用标准化的单词包和单词嵌入来计算文档之间的距离。
看完这篇文章,你会明白:
- 推土机距离(EMD)
- 字移动器的距离
- 轻松单词移动距离(RWMD)
- 大规模杀伤性武器的实施
- 拿走
推土机距离(EMD)
在介绍大规模杀伤性武器之前,我必须先分享一下运土距离(EMD)的概念,因为大规模杀伤性武器的核心部分是 EMD。
EMD [2]解决运输问题。例如,我们有 m 和 n,而 m 和 n 表示一组供应商和仓库。目标是最小化运输成本,以便将所有货物从 m 运输到 n。给定约束条件:
Capture from wiki [3]
- 仅允许从 m 到 n 的传输。不允许从 n 到 m 的传输
- 发送货物总数不能超过总容量 m
- 收货总数量不能超过总容量 n
- 最大运输次数是 m 中的货物总量和 n 中的货物总量之间的最小值
外延是:
- p:原产地设置
- 问:目的地集合
- f(i,j):从 I 流向 j
- m:原点数量
- n:目的地编号
- w(i,j):从 I 到 j 的货物运输次数
对于最佳流量 F,线性公式为
Capture from wiki [3]
字移动器的距离
在之前的博客中,我分享了我们如何用简单的方法找到两个文档(或句子)之间的“相似性”。当时引入了欧氏距离、余弦距离和 Jaccard 相似度,但都有一定的局限性。WMD 的设计是为了克服 同义词问题。
典型的例子是
- 第一句:奥巴马在伊利诺伊州对媒体讲话
- 总统在芝加哥迎接媒体
除了停用词,两个句子之间没有共同的词,但两个句子都在谈论同一个话题(当时)。
Captured from Kusner et al. publication
WMD 使用单词嵌入来计算距离,这样即使没有共同的单词,它也可以计算。假设相似的单词应该有相似的向量。
首先,小写和删除停用词是减少复杂性和防止误导的必要步骤。
- 第一句:奥巴马对伊利诺伊州媒体讲话
- 第二句:总统问候芝加哥媒体
从任何预先训练的单词嵌入模型中检索向量。它可以是 GloVe、word2vec、fasttext 或自定义向量。然后用归一化的词袋(nBOW)来表示权重或重要性。它假设较高的频率意味着它更重要。
Captured from Kusner et al. publication
它允许将每个单词从句子 1 转移到句子 2,因为算法不知道“奥巴马”应该转移到“总统”。最后,它会选择最小的运输成本将每个单词从句子 1 运输到句子 2。
轻松单词移动距离(RWMD)
求解 WMD 的最佳平均时间约为 O(p log p ),而 p 是唯一字的个数。它有点慢,所以有两种方法来改善减少计算时间。第一个是单词质心距离(WCD) ,它概括了单词之间的下限距离。第二种方法是放松单词移动距离(RWMD) ,这是使用最近距离,而不考虑有多个单词转换成单个单词。
Captured from Kusner et al. publication
以上一句话为例。假设句子 1 中所有单词中最短的单词是“president ”,它将使用汇总这些得分,而不是逐个配对。从而使时间复杂度降低到 O(p)。
大规模杀伤性武器的实施
通过使用 gensim,我们只需要提供两个令牌列表,然后它将进行其余的计算
subject_headline = news_headlines[0]
subject_token = headline_tokens[0]print('Headline: ', subject_headline)
print('=' * 50)
print()for token, headline in zip(headline_tokens, news_headlines):
print('-' * 50)
print('Comparing to:', headline)
distance = glove_model.wmdistance(subject_token, token)
print('distance = %.4f' % distance)
输出
Headline: Elon Musk's Boring Co to build high-speed airport link in Chicago
==================================================
--------------------------------------------------
Comparing to: Elon Musk's Boring Co to build high-speed airport link in Chicago
distance = 0.0000
--------------------------------------------------
Comparing to: Elon Musk's Boring Company to build high-speed Chicago airport link
distance = 0.3589
--------------------------------------------------
Comparing to: Elon Musk’s Boring Company approved to build high-speed transit between downtown Chicago and O’Hare Airport
distance = 1.9456
--------------------------------------------------
Comparing to: Both apple and orange are fruit
distance = 5.4350
在 gensim 实现中,OOV 将被删除,以便它不会抛出异常或使用随机向量。
拿走
对于源代码,你可以从我的 github repo 查看。
- WMD 的优点是没有超参数和克服同义词问题。
- 和那些简单的方法一样,WMD 不考虑订购。
- 时间复杂度是一个问题。原版是 O(p log p)而增强版还是 O(p)。
- 预训练向量可能不适用于所有场景。
关于我
我是湾区的数据科学家。专注于数据科学、人工智能,尤其是 NLP 和平台相关领域的最新发展。你可以通过媒体博客、 LinkedIn 或 Github 联系我。
参考
[1] Kusner Matt J,孙宇,Kolkin Nicholas I,Weinberger Kilian Q .从单词嵌入到文档距离.2015.http://proceedings.mlr.press/v37/kusnerb15.pdf
[2] EMD 理论:https://en.wikipedia.org/wiki/Earth_mover%27s_distance
基于单词嵌入的 2017 年 ICC 冠军奖杯洞察
原文:https://towardsdatascience.com/word-embedding-based-insights-of-icc-champions-trophy-2017-bde6f6589fc6?source=collection_archive---------7-----------------------
板球比赛以其无脚本的戏剧性、突然爆发的兴奋和悬念而闻名。比赛的节奏可以从慢热到激烈竞争。随着情节变得复杂,情感的复杂相互作用让每个人都坐立不安。
2017 年 6 月对于世界各地的板球爱好者来说的确是一个特殊的月份,因为这是国际板球理事会冠军奖杯的月份。ICC 冠军奖杯是由国际板球理事会(ICC)组织的为期一天的国际(ODI)板球锦标赛,其重要性仅次于板球世界杯。虽然我们能够见证所谓的失败者的戏剧性回归,但巴基斯坦在椭圆形办公室举行的 2017 年国际刑事法院冠军奖杯决赛中全面击败印度,创造了历史。Sarfraz Ahmed 的球队成为继西印度群岛、斯里兰卡和印度之后第四支赢得世界杯、世界 T20 锦标赛和冠军奖杯的球队。
嗯,整个比赛充满了意想不到的事情。斯里兰卡,年轻的上升队击败了卫冕冠军印度和强大的澳大利亚队被排除在小组赛之外,孟加拉虎(孟加拉国)进入半决赛,为比赛带来了戏剧性的推动。因此,我想分析一下媒体和粉丝对这一惊人的 ICC 事件的看法。哇哦。!结果看起来确实非常有趣和令人惊讶。
真正的分析游戏
基于语言环境的文本分析
单词嵌入是自然语言处理(NLP)中一组语言建模和特征学习技术的统称,其中来自词汇表的单词或短语被映射到实数的向量。从概念上讲,它涉及从每个单词一维的空间到低得多的维的连续向量空间的数学嵌入。Word2vec 是一组用于产生单词嵌入的相关模型。这些模型是浅层的两层神经网络,被训练来重建单词的语言上下文。Word2vec 将大型文本语料库作为其输入,并产生一个向量空间,通常具有数百个维度,语料库中的每个唯一单词都被分配一个空间中的相应向量。单词向量被定位在向量空间中,使得语料库中共享共同上下文的单词在空间中彼此非常接近。所以我想把我的工作建立在 Word2Vec 之上,在语言上下文基础上进行文本分析。
文本语料库:ESPNCricinfo 生存
ESPNCricinfo 是公认的板球网站之一,它收集了大量的新闻文章和相关的用户评论。为了创建文本语料库,我制作了一个网络爬虫,抓取这些写得很好的文章,日期范围是 2017 年 6 月 1 日到 2017 年 6 月 17 日。我也抓取了用户的评论。将所有这些加在一起,产生了我的用于训练 word2vec 模型的文本语料库。
令人喜欢:虽然不是很干净
NLP pipeline for text pre-processing
为了预处理获得的文本语料库,我使用了上面所示的 NLP 管道。然而,它需要进一步的处理,如格泛化、拼写检查和语法检查。为了这项工作的简单,我将在这里省略它们。
如果将词性标注和词汇化也引入到管道中,它还可以产生更准确的结果。
Enhanced NLP pipeline for text pre-processing
下一步是从获得的预处理文本语料库中训练出 word2vec 模型。由于文本语料库相对较小,模型在几分钟内就创建好了。
好吧,那么,…是时候看看结果了…
结果
从 word2vec 模型中,我获得了给定文本阶段上下文最相关的 100 个单词。以下部分基于每个查询词 100 个单词。但是,我从结果术语中手动提取了 10 个术语,出于可视化的目的,这些术语在给定主题下似乎是有趣的。
团队智慧相关词汇
下图说明了基于团队的术语。考虑到锦标赛中各队收到的疫情,印度、巴基斯坦、澳大利亚、斯里兰卡和孟加拉国被选为本次分析的对象。
玩家明智相关词汇
在众多令人惊讶的选手中,以下四位选手因其受欢迎程度而被选中。注意,只选择了动词/副词/形容词。
评论员睿智相关词汇
由前明星板球运动员组成的 15 人评论员小组确实提高了冠军奖杯。其中,Sanjay Manjrekar 和 Kumar Sangakkara 被选为研究对象。注意,只选择了动词/副词/形容词。
帖子备注
好吧,如果你更新了 2017 年冠军奖杯,那么显然,你应该对上述结果有相当好的解释。但是,得到的一些结果似乎有偏差。这是一种可能性,因为语料库的创建也包括获取用户的评论。嗯,差不多就是这样。如果你喜欢玩这个模型,这里的是这个项目的完整代码示例。
各位板球快乐!!
使用 Gensim 嵌入 Word2Vec 和 FastText 单词
原文:https://towardsdatascience.com/word-embedding-with-word2vec-and-fasttext-a209c1d3e12c?source=collection_archive---------1-----------------------
(https://iwcollege-cdn-pull-zone-theisleofwightco1.netdna-ssl.com/wp-content/uploads/2017/05/2DGerAvyRM.jpg)
在自然语言处理(NLP)中,我们经常将单词映射成包含数值的向量,以便机器能够理解。单词嵌入是一种映射类型,它允许具有相似含义的单词具有相似的表示。本文将介绍两种最先进的单词嵌入方法, Word2Vec 和 FastText 以及它们在 Gensim 中的实现。
传统方法
传统的表示单词的方式是 one-hot vector,本质上是一个只有一个目标元素为 1,其他为 0 的向量。向量的长度等于语料库中唯一词汇的总大小。按照惯例,这些独特的单词是按字母顺序编码的。也就是说,您应该预期以“a”开头的单词的单热向量具有较低的索引,而以“z”开头的单词的单热向量具有较高的索引。
https://cdn-images-1.medium.com/max/1600/1*ULfyiWPKgWceCqyZeDTl0g.pngㄨ
尽管这种单词表示简单且易于实现,但还是有几个问题。首先,你不能推断两个词之间的任何关系,因为它们只有一个热表示。例如,单词“忍受”和“容忍”,虽然有相似的意思,他们的目标“1”是远离对方。此外,稀疏性是另一个问题,因为向量中有许多冗余的“0”。这意味着我们浪费了很多空间。我们需要一种更好的文字表达来解决这些问题。
Word2Vec
Word2Vec 是解决这些问题的有效方法,它利用了目标单词的上下文。本质上,我们希望使用周围的单词来用神经网络表示目标单词,神经网络的隐藏层对单词表示进行编码。
Word2Vec 有两种类型,Skip-gram 和连续单词包(CBOW)。我将在下面的段落中简要描述这两种方法是如何工作的。
跳跃图
对于 skip-gram,输入是目标单词,而输出是目标单词周围的单词。例如,在句子“我有一只可爱的狗”中,输入将是“ a ”,而输出是“ I ”、“有”、“可爱的”和“狗”,假设窗口大小为 5。所有输入和输出数据具有相同的维数,并且是一位热编码的。网络包含 1 个隐藏层,其尺寸等于嵌入尺寸,小于输入/输出向量尺寸。在输出层的末端,应用 softmax 激活函数,以便输出向量的每个元素描述特定单词在上下文中出现的可能性。下图显示了网络结构。
Skip-gram (https://www.analyticsvidhya.com/blog/2017/06/word-embeddings-count-word2veec/)
目标单词的单词嵌入可以通过在将该单词的独热表示馈送到网络中之后提取隐藏层来获得。
使用 skip-gram,表示维度从词汇大小(V)减少到隐藏层的长度(N)。此外,向量在描述单词之间的关系方面更“有意义”。两个关联词相减得到的向量有时表达的是性别或动词时态等有意义的概念,如下图所示(降维)。
Visualize Word Vectors (https://www.tensorflow.org/images/linear-relationships.png)
CBOW
连续单词包(CBOW)与 skip-gram 非常相似,只是它交换了输入和输出。这个想法是,给定一个上下文,我们想知道哪个单词最有可能出现在其中。
CBOW (https://www.analyticsvidhya.com/blog/2017/06/word-embeddings-count-word2veec/)
Skip-gram 和 CBOW 之间最大的区别在于生成单词向量的方式。对于 CBOW,将所有以目标词为目标的样本输入到网络中,并对提取的隐含层取平均值。比如,假设我们只有两句话,“他是个不错的家伙”和“她是个睿智的女王”。为了计算单词“a”的单词表示,我们需要将这两个示例“他是好人”和“她是明智的女王”输入到神经网络中,并取隐藏层中值的平均值。Skip-gram 只输入一个且只有一个目标单词 one-hot 向量作为输入。
据说跳格法在生僻字中表现更好。尽管如此,Skip-gram 和 CBOW 的性能大体相似。
履行
我将向您展示如何使用 Gensim(一个强大的 NLP 工具包)和 TED Talk 数据集来执行单词嵌入。
首先,我们使用 urllib 下载数据集,从文件中提取字幕。
我们来看看 input_text 变量存储了什么,部分如下图所示。
input_text
显然,有一些多余的信息对我们理解演讲没有帮助,例如括号中描述声音的词和演讲者的名字。我们用正则表达式去掉这些词。
现在, sentences_ted 已经被转换成一个二维数组,每个元素都是一个单词。让我们打印出第一个和第二个元素。
sentences_ted
这是准备好输入 Gensim 中定义的 Word2Vec 模型的表单。Word2Vec 模型用下面一行代码就可以轻松训练出来。
- 句子:拆分句子列表。
- 大小:嵌入向量的维数
- 窗口:您正在查看的上下文单词数
- min_count :告诉模型忽略总计数小于此数的单词。
- workers :正在使用的线程数
- sg :是使用 skip-gram 还是 CBOW
现在,我们来试试哪些词和“人”这个词最相似。
似乎与男人/女人/孩子相关的词与“男人”最为相似。
虽然 Word2Vec 成功地处理了一个热向量带来的问题,但是它有一些限制。最大的挑战是它不能代表没有出现在训练数据集中的单词。即使使用包含更多词汇的更大的训练集,一些很少使用的罕见单词也永远无法映射到向量。
快速文本
FastText 是脸书在 2016 年提出的 Word2Vec 的扩展。FastText 不是将单个单词输入到神经网络中,而是将单词分成几个 n-grams(子单词)。例如, apple 这个词的三元组是 app、ppl 和 ple (忽略单词边界的开始和结束)。苹果的单词嵌入向量将是所有这些 n 元文法的总和。在训练神经网络之后,给定训练数据集,我们将对所有 n 元语法进行单词嵌入。罕见的单词现在可以正确地表示,因为它们的一些 n 元语法很可能也出现在其他单词中。在下一节中,我将向您展示如何在 Gensim 中使用 FastText。
履行
类似于 Word2Vec,我们只需要一行来指定训练单词嵌入的模型。
我们用肠胃炎这个词试试,这个词很少用,也没有出现在训练数据集中。
即使单词肠胃炎不存在于训练数据集中,它仍然能够找出这个单词与一些医学术语密切相关。如果我们在前面定义的 Word2Vec 中尝试这样做,它会弹出错误,因为这样的单词在训练数据集中不存在。虽然训练一个 FastText 模型需要更长的时间(n-grams 的数量>单词的数量),但它的性能比 Word2Vec 更好,并允许适当地表示罕见的单词。
结论
您已经学习了什么是 Word2Vec 和 FastText,以及它们在 Gensim toolkit 中的实现。如果你有任何问题,欢迎在下面留言。如果你喜欢这篇文章,确保你在 twitter 上关注我,这样你就不会错过任何伟大的机器学习/深度学习博客文章!
单词嵌入和文档向量:第 1 部分。类似
原文:https://towardsdatascience.com/word-embeddings-and-document-vectors-part-1-similarity-1cd82737cf58?source=collection_archive---------22-----------------------
分类取决于相似性的概念。这种相似性可以是简单的分类特征值,例如我们正在分类的对象的颜色或形状,或者是这些对象拥有的所有分类和/或连续特征值的更复杂的函数。文档也可以使用其可量化的属性进行分类,如大小、文件扩展名等…简单!但不幸的是,文档中包含的文本的含义/意义是我们通常对分类感兴趣的。
文本的成分是单词(还包括标点符号),文本片段的含义不是这些成分的确定性函数。我们知道,相同的一组单词,但顺序不同,或者只是用不同的标点符号,可以传达不同的意思。这种理解文本的复杂程度是迄今为止算法无法达到的。除此之外,还有一些方法可以对文本进行处理,使其易于被算法分析。文档和单词需要被转换成数字/向量,希望和能够保留和反映我们所知道的原始单词和文档之间的关系。这肯定是一个艰巨的任务,但从几十年前的向量空间模型 (VSM)方法开始,以及这十年来一些基于单词嵌入方法的令人兴奋的新参与者,这方面已经取得了良好的进展。VSM 方法将文档转化为数字向量,而单词嵌入方法将单个 单词转化为数字向量。
在这篇文章中,我们比较和对比了使用有和没有单词嵌入的文档向量来测量相似性。我们为使用单词嵌入(预先训练的或定制的)进行文本分类打下了基础,这将在下一篇文章中讨论。让我们从快速概述文档和单词向量以及关于它们如何度量和保存(或不保存)的动机示例开始。)我们所理解的相似性的概念。
1.文档向量和相似性
在 VSM 方法中,文档被表示为单词空间中的向量。向量中的一个元素是一个度量(简单频率计数、归一化计数、tf-idf 等..)对应单词对于该文档的重要性。在我们之前的帖子中,我们已经非常详细地讨论了这种机制以及这种方法使之成为可能的丰富分析,这些帖子包括成堆的文档和一袋袋的单词以及文档的简化模型。
如果两个文档包含几乎相同的单词分布,它们在单词空间中产生的向量将比其他情况下更加平行。所以两个向量之间的余弦值更接近 1。假设具有相似单词分布的两个文档是相似的(我们知道这是不精确的说法!)VSM 方法采用文档向量的余弦作为它们相似性的度量。显然,在这个模型中,没有共享很多单词的文档将被认为是不相似的——这又是一个不精确的结论。让我们看几个例子,这样我们就清楚了。
1.1 示例 1(文档向量)
在一个 7 维的单词空间中取下面三个文档:
- 单词空间:['避免','首都','法国','日本','字母','巴黎','东京']
- Doc1:东京是日本的首都=> d_1 = [0,1,0,1,0,0,1]
- Doc2:巴黎是法国的首都=> d_2 = [0,1,1,0,0,1,0]
- Doc3:避免大写字母=> d_3 = [1,1,0,0,1,0,0]
上面也显示了每个文档的简单的基于计数的 VSM 向量表示。这些向量的任何一对之间的余弦相似度等于(0+1 * 1+0+0+0+0)/(3^0.5* 3^0.5)= 1/3.0。数学都是正确的,但我们希望在文档 1 和文档 2 之间获得更高的相似性,以便我们可以将它们放在一个地理桶中,而将第三个放在其他地方。但是这就是对文档的词汇袋方法的本质。让我们接着看另一个例子。
1.2.示例 2(文档向量)
以另一个由 6 维单词空间跨越的三个文档为例:
- 单词空间:['正派','善良','诚实','谎言','人','告诉']
- Doc1:诚实得体=> d_1 = [1,0,1,0,0,0]
- Doc2:做个好人=> d_2 = [0,1,0,0,1,0]
- Doc3:说谎=> d_3 = [0,0,0,1,0,1]
这些文档不共享任何单词,因此它们的点积都是零,这表明它们都不相似。但是,我们还是希望让 Doc1 和 Doc2 更相似,而不是更像 Doc3。
从这里的例子得出的结论是,用于评估相似性的基于单词包的文档向量及其分类可能是误导的。
2.词向量和相似度
在过去五年左右的时间里,出现了一股为的单个单词生成数字向量(任意长度 p = 50、200、300 等等)的热潮。原因集中在更便宜和更快的计算机的可用性,以及将最近流行的&竞争性深度神经网络应用于 NLP 任务的愿望。基于单词嵌入的方法已经产生了诸如 Word2Vec 、 Glove 和 FastText 之类的工具,它们现在被广泛使用。
通过针对文本数据的语料库训练算法来获得单词向量。在训练结束时,语料库中的每个单词学习为在训练时选择的长度为 p 的数值向量。这个 p 远远小于语料库中唯一词的总数 n ,即 p < < n 。因此,该向量表示从原始的n-长 1-热词向量到更小的p-长密集向量在p-维假词空间中的线性映射/投影。我们说假的原因是这些 p 维度没有任何可解释的物理意义。它们只是一个数学概念。有点像奇异值分解,但不完全是。有人可能认为增加 p 可能会在低维流形中产生更好质量的单词表示。不太不幸。所以,我们开始了——一点巫术和所谓的炼金术在起作用。
这些工具的作者已经将它们应用于大量的文本,如谷歌新闻、维基百科转储、通用抓取等,以得出他们在这些语料库中找到的单词的数字向量版本。为什么大量的文本?这个想法是,这些单词向量有望成为通用的。我们这样说是什么意思?这样,我们可以用他们发布的数字向量来替换我们的文档中的单词。也就是说,他们希望他们的单词向量具有普遍的有效性——也就是说,无论该单词出现在任何文档的什么地方和什么上下文中,该单词都可以被他们发布的向量替换
通过将算法暴露于大量文本,他们希望每个单词都经历了足够多的上下文变化,其数字向量因此在某种平均意义上吸收了单词的含义及其在优化过程中与其他单词的关系
这些词汇有多普遍?
然而,必须清楚地理解这些通用单词嵌入的含义和局限性。
- 首先,为一个单词获得的数字向量是算法和应用该算法来导出该向量的文本语料库的函数。
- 第二,不要混淆不同算法的向量——即使它们是在同一个语料库上训练的。也就是说,不要在文档中对某些单词使用 Glove 向量,而对其他单词使用 Word2Vec 向量。这些向量是不同的,并且不以相同的方式嵌入它们学习的关系。
- 第三,不要在语料库中混淆这些向量——即使使用相同的算法。也就是说,在你的文档中,不要对一个单词使用通过训练比如电影评论获得的向量,而对另一个单词使用通过训练比如政治新闻故事获得的向量。
下表总结了上述评估。考虑两个词——‘好的’和‘体面的’。每个都有一个由 Word2Vec(在 Google News 上训练过)、Glove(在 Wikipedia 上训练过)和 FastText(在 common-crawl 上训练过)发布的预训练数字向量。此外,我通过对二十个新闻组数据集训练相同的算法来定制向量,该数据集可通过编程从 SciKit 页面获得。使用 Gensim 包完成培训。
表中的值(原始出版物的截屏)显示了以五种不同方式获得的这两个词向量之间的余弦相似性。假设单词是相似的,如果单词向量是完全通用的,我们会期望分数更接近于 1。但是我们看到,只有当两个向量都是使用针对相同文本语料库训练的相同算法导出时,才会出现这种情况。
这里的重点是,在文本语料库上训练算法得到的词向量是一个包。这些向量嵌入了它们在训练时遇到的单词之间的关系。总的来说这些向量松散地反映了由算法训练和教导的语料库中包含的单词之间的关系。当然,我们并不强制使用这些预先训练好的向量,因为有像 Gensim 这样的软件包可以为手头的任何文本语料库生成定制的词向量。
3.嵌入单词的文档向量
一般来说,给定文档中唯一单词的数量是语料库中唯一单词总数的很小一部分。所以文档向量是稀疏的,零比非零多得多。这是一个问题,特别是对于神经网络,其中输入层神经元的数量是输入向量的大小。这就是嵌入式单词向量流行的原因。
经过训练的单词向量 p 的长度通常比语料库单词空间的大小小得多。因此,用低维向量替换单词的文档向量要短得多,从而提供了计算优势。例如,twenty-news 文档库中有超过 60,000 个独特的单词。如果我们对每个单词使用 300 维的单词向量(即 p = 300),我们可以将输入神经元的数量减少 200 倍,使其在大型 NLP 任务中更具竞争力。
3.1 从稀疏到密集的文档向量
如果文档中的每个单词在相同的 p- 维空间中具有已知的表示,那么单词袋文档向量可以表示为相同的 p- 维空间中的向量。我们只是简单地将单词袋方法与单词嵌入相结合,以得到低维、密集的文档表示。让我们以前面的例子 1.2 为例,我们现在也有一个向量表示法,用于组成语料库词汇的六个词‘正派’、‘善良’、‘诚实’、‘谎言’、‘人’、‘告诉’。原来的 6 维文档向量D1可以在 p 空间中重写为 p x 1 向量 d^_1*
对于带有 m 单据和 n 字的一般情况,我们可以直接扩展上述内容。首先,我们为这些 n 个单词中的每一个获得单词向量,从而给我们 p x n 单词向量矩阵 W 。在标准 n 单词空间中具有向量表示 d_i 的 i^th 文档被转换为在伪 p 单词空间中的向量 d^*_i,其具有:
(1)
虽然拥有更短的文档向量是一种计算优势,但我们需要确保文档在这个过程中没有失去它们的意义和关系。让我们用这些单词来重写例子 1.1 和 1.2,看看我们得到了什么。
3.2 示例 1.1(具有单词嵌入的文档向量)
下面的表 2 示出了示例 1.1 中的相同文档的相似性,但是现在使用具有单词嵌入的文档向量来计算。
- Doc1:东京是日本的首都=> d_1 = [0,1,0,1,0,0,1]
- Doc2:巴黎是法国的首都=> d_2 = [0,1,1,0,0,1,0]
- Doc3:避免大写字母=> d_3 = [1,1,0,0,1,0,0]
虽然结果并不完美,但在 Doc1 和 Doc2 之间的相似性得分上有一些改进。具有负采样的基于跳过文法的 Word2Vec 算法( SGNS )实际上在文档 2 &文档 3 和文档 3 &文档 1 之间产生了较低的相似性(与纯基于文档向量的相似性相比)。但是我们不应该因为一个测试就对它做过多的解读。让我们看看另一个例子。
3.3 示例 1.2(具有单词嵌入的文档向量)
表 3 对示例 1.2 中的文档重复上述练习,其中基于纯文档向量的方法在 3 对文档之间产生零相似性。
- Doc1:诚实得体=> d_1 = [1,0,1,0,0,0]
- Doc2:做个好人=> d_2 = [0,1,0,0,1,0]
- Doc3:说谎=> d_3 = [0,0,0,1,0,1]
同样,虽然结果并不完美,但确实有所改善。与文档 2 和文档 3 以及文档 3 和文档 1 之间获得的相似性相比,文档 1 和文档 2 在每个方案中显示出高得多的相似性。
4.结论
我们以此结束这篇文章。如引言中所述,我们已经为结合基于 VSM 的文档向量应用单词嵌入奠定了基础。具体来说,我们有:
- 计算文档的相似度,作为通过词袋方法获得的数值向量
- 计算单词之间的相似度,作为通过不同的单词嵌入算法获得的数字向量,这两种算法都是预先训练的和在定制文本语料库上训练的
- 检验单词嵌入普遍性的局限性
- 计算具有单词嵌入的文档向量之间的相似度
所有这些都是为了在分类练习中使用这些降阶的、嵌入单词的文档向量做准备。我们将在下一篇文章中继续讨论。
原载于 2018 年 9 月 27 日【xplordat.com】。
单词嵌入和文档向量:第 2 部分。订单缩减
原文:https://towardsdatascience.com/word-embeddings-and-document-vectors-part-2-order-reduction-2d11c3b5139c?source=collection_archive---------9-----------------------
单词嵌入产生了从 n -long ( n 是组成文本语料库的词汇的大小)稀疏文档向量到 p -long 密集向量的线性变换,其中 p < < n 因此实现了顺序的减少…
在之前的文章中,单词嵌入和文档向量:第 1 部分。相似性我们为使用基于单词包的文档向量结合单词嵌入(预训练或定制训练)来计算文档相似性奠定了基础,作为分类的先驱。看起来,文档+单词向量更善于发现我们看过的玩具文档中的相似之处(或缺乏之处)。我们想把它进行到底,并把这种方法应用到实际的文档库中,看看文档+单词向量如何进行分类。这篇文章关注的是实现这个目标的方法、机制和代码片段。结果将在本系列的下一篇文章中介绍。
这篇文章的大纲如下。完整实现的代码可以从 github 下载。
- 选择一个文档库(比如来自 SciKit pages 的 Reuter20-newsfor multi class,或者来自斯坦福的大型电影评论数据集for binary 情感分类)
- 对语料库进行标记化(停止/词干化),并获得标记的词向量(预训练和定制训练)。这只需要做一次,我们在所有的分类测试中都使用它们。我们将它们存储到 Elasticsearch 中,以便在需要时方便快捷地检索。我们将考虑单词向量的 Word2Vec/SGNS 和 FastText 算法。 Gensim API 用于生成自定义向量和处理预训练向量。
- 构建一个 SciKit 管道,它执行图 1 所示的操作序列。
- 从 Elasticsearch 索引中获取文档标记(停止或词干化)。对它们进行矢量化(用 SciKit 的计数矢量化器或 TfidfVectorizer 得到高阶文档词矩阵)。
- 为每个令牌嵌入从 Elasticsearch 索引中提取的词向量(Word2Vec、FastText、预训练或自定义)。这导致了降阶的文档-单词矩阵。
- 运行 SciKit 提供的分类器多项式朴素贝叶斯、线性支持向量、和神经网络进行训练和预测。所有分类器都采用默认值,除了神经网络中所需的神经元和隐藏层的数量。
Figure 1. A schematic of the process pipeline
这篇文章中展示的代码片段就是它们的本来面目——片段,是从完整的实现中截取的,为了简洁起见,我们对其进行了编辑,以专注于一些事情。 github repo 是参考。在进入完整的流程管道之前,我们将简要地详细说明上面的标记化和词向量生成步骤。
1.标记化
虽然 SciKit 中的文档矢量化工具可以对文档中的原始文本进行标记,但我们可能希望使用自定义停用词、词干等来控制它。下面是一段代码,它将 20 条新闻的语料库保存到一个 elasticsearch 索引中,以供将来检索。
Code Listing 1: Tokenizing the 20-news corpus and indexing to Elasticsearch
在上面的第 10 行中,我们删除了所有标点符号,删除了不以字母开头的标记,以及过长(> 14 个字符)或过短(< 2 个字符)的标记。标记被小写,停用词被删除(第 14 行),并被词干化(第 18 行)。在第 36 行,我们删除了每篇文章的页眉、页脚等信息,因为这些信息会泄露文章属于哪个新闻组。基本上,我们使分类变得更加困难。
2.词向量
下面的代码片段将发布的 fasttext 单词向量处理成一个 elasticsearch 索引。
Code Listing 2: Processing pre-trained word-vectors with Gensim and indexing into Elasticsearch
在上面的第 22 行中,我们读取了预先训练的向量。第 23 行将它们索引到 elasticsearch 中。我们还可以从手头的任何文本语料库中生成自定义的词向量。Gensim 也为此提供了方便的 api。
Code Listing 3: Generating custom word-vectors with Gensim
在第 35 行和第 41 行,使用从我们在第 1 节中创建的语料库索引中获得的标记(停止或词干化)来训练模型。向量的选择长度是 300。第 30 行中的 min_count 指的是为了考虑某个标记,该标记在语料库中必须出现的最小次数。
3.工艺管道
我们对 repo 中的文档进行矢量化,如果要使用单词嵌入,则转换并降低模型的阶数,并应用分类器进行拟合和预测,如前面的图 1 所示。让我们依次看看他们中的每一个。
3.1 矢量化
我们之前说过可以使用 SciKit 的 count/tf-idf 矢量器。它们肯定会产生一个文档术语矩阵 X ,但是我们管道中的单词嵌入步骤需要由矢量器获得的词汇/单词。因此,我们围绕 SciKit 的矢量器编写了一个定制的包装器类,并用词汇表增加了转换响应。
Code Listing 4: A wrapper to SciKit’s vectorizers to augment the response with corpus vocabulary
包装器在第 1 行使用实际的 SciKit 矢量器进行初始化,并将 min_df(词汇表中需要考虑的令牌在存储库中的最小频率)设置为 2。第 8 行使用所选矢量器的 fit 过程,第 12 行的 transform 方法发出一个响应,其中包含第二步所需的 X 和派生词汇 V 。
3.2 嵌入文字
我们有 m 个文档和 n 个其中唯一的单词。这里工作的核心部分如下。
- 从我们在第 2 节准备的索引中获得这些 n 单词中每一个的 p 维单词向量。
- 准备一个 nxp 单词向量矩阵 W ,其中每一行对应于分类词汇表中的一个单词
- 通过简单乘法将 mxn 原始稀疏文档字矩阵 X 转换为 mxp 密集矩阵 Z 。我们已经在上一篇文章中讨论过这个问题。但是请注意,SciKit 使用文档作为行向量,所以这里的 W 是那篇文章中等式 1 的转置。没什么复杂的。
p 当然是 word-vector 的长度,原来的 1-hot n 维向量到这个假的pword-space 的投影。然而,我们应该小心矩阵乘法,因为 X 来自矢量器,是一个压缩稀疏行矩阵,而我们的 W 是一个普通矩阵。一点指数戏法就能做到。下面是管道中这一步的代码片段。
Code Listing 5: Building the reduced order dense matrix Z
第 1 行用一个 wordvector 对象初始化转换器(查看 github 中的代码),该对象具有从索引中获取向量的方法。第 15 行从矢量器步骤传递的词汇表中获得一个排序后的单词列表。csr X 矩阵对其非零条目使用相同的顺序,我们也需要以相同的单词顺序获得 W 。这是在第 16 行完成的,最后第 17 行的稀疏矩阵乘法产生了我们所追求的降阶矩阵 Z 。
3.3 分类
这很简单。分类器得到矩阵mx pZ,其中每一行都是一个文档。它还在拟合模型时获得标签的 m x 1 向量。我们将评估三种分类器——朴素贝叶斯、支持向量机和神经网络。我们在不调整任何默认 SciKit 参数的情况下运行它们。在神经网络的情况下,我们尝试了一些不同数量的隐藏层(1、2 或 3)和(50、100 和 200)内的神经元,因为没有好的默认设置。
Code Listing 6: Preparing a list of classifiers for the pipeline
第 1 行中的方法 getNeuralNet 生成了我们用隐藏层和神经元初始化神经网络所需的元组。我们准备了一套分类器,用于矢量器和转换器的各种组合。
4.后续步骤
在之前的帖子中,我们研究了带有单词嵌入的文档相似性。在这篇文章中,我们展示了在文档库中使用这些概念来获得简化的文档单词矩阵的机制。在下一篇文章中,我们将运行模拟,并研究不同的标记化方案、词向量算法、预训练与自定义词向量对不同分类器的质量和性能的影响。
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -
本文的修改版最初发表于 2018 年 9 月 27 日【xplordat.com】。
单词嵌入和文档向量——如有疑问,请简化
原文:https://towardsdatascience.com/word-embeddings-and-document-vectors-when-in-doubt-simplify-8c9aaeec244e?source=collection_archive---------6-----------------------
对一些文本集的分类精度和性能指标表明,朴素贝叶斯分类器是一个强有力的竞争者
这是关于在 NLP 任务中使用单词向量和文档向量的系列文章的第三篇也是最后一篇。这里的重点是文本分类。当单词向量与文档向量相结合时,我们总结了其结果和建议。代码可以从 github 下载。让我们快速总结一下过去的两篇文章。
- 相似度:单词向量是一个单词的表示,它是一个选定长度的数字向量 p 。它们是通过对文本语料库应用 Word2vec、Glove 和 FastText 等工具而获得的。具有相似含义的单词通常产生余弦相似度更接近 1 而不是 0 的数字单词向量。
- 降阶:将单词向量与基于单词包的文档向量相结合,在文本语料库的模型 Z 中产生大的(通常几个数量级,等于 m/p 其中 m 是文本语料库中唯一单词的数量,而 p 是单词向量的长度)降阶。我们构建了一个 scikit 管道(vectorize =>embed words =>classify ),在单词向量矩阵 W 的帮助下,从高阶的 X 导出 Z 。每一行 W 都是文本语料库中一个单词的 p 维数值表示。
这样,我们就可以评估单词向量对文本分类的影响,并在流水线步骤中使用我们可以选择的选项来限定结果。我们坚持三个步骤中的每一步都有几个主要选项。
- 记号化。我们将使用 scikit 的计数矢量器和tfidfvectorizer。
- 词向量。我们将对 Word2Vec/SGNS 和 FastText 进行评测。预培训和定制生成(通过 Gensim )
- 量词。我们将使用 scikit 的多项式朴素贝叶斯、线性支持向量、和神经网络
1.模拟
我们使用两个文档库。来自斯坦福的大型电影评论数据集用于二元情感分类,来自 scikit pages 的 reuter 20-news 用于多元分类。为了简单起见,我们坚持使用单一的训练集和单一的测试集。在 20 条新闻的情况下,我们进行分层分割,80%用于训练,20%用于测试。imdb 电影评论数据集带有定义的训练和测试集。下面代码片段中的第 9 行和第 10 行使用了一个令牌类(查看 github code repo ),它有从索引中提取令牌的方法。
Code Listing 1. Train and Test data sets. Define a pipeline instance for fit and predict.
要运行的模型是管道的一个实例——矢量器、转换器和分类器的特定组合。第 13 行到第 15 行定义了模型并运行预测。模拟是通过下面的 shell 脚本运行的,该脚本循环遍历管道步骤的不同选项。
Code Listing 2. A script to evaluate different options for the pipeline steps
mlp 分类器实际上由 9 种变体组成,每种变体有 1、2 或 3 个隐藏层,每层有 50、100 或 200 个神经元。此处报告的结果是针对使用 2 个隐藏层,每个隐藏层有 100 个神经元的情况。其他 mlp 分类器运行基本上用于验证分类的质量在隐藏层和神经元的这个级别不是非常敏感。
然而,有些组合是不允许的,在 Python 实现中会被跳过。这些是:
- 朴素贝叶斯分类器不允许文档向量中有负值。但是我们用文档+词向量的时候, Z 会有一些否定。应该有可能统一转换/缩放所有矢量以避免负面影响,但我们并不担心,因为我们有足够的模拟来运行。所以基本上朴素贝叶斯分类器在这里只用于纯文档向量。
- 预先训练的词向量只适用于正常的词,不适用于词干化的词。因此,我们通过词干标记和预训练向量的组合来跳过运行。
2.结果
我们看的唯一度量是分类质量的 F 分数和效率的 cpu 时间。在 20 个新闻数据集的多类分类的情况下,F 分数是所有 20 个类的平均值。分类器+向量组合的运行时间是使用相同组合的所有运行的平均值。
2.1 20 条新闻数据集的多类分类
下面的图 1 总结了 20 条新闻数据集的结果。
Figure 1. Nulticlass classification of the 20-news data set. (1A) Classification with pure document vectors (1B) Classification with document+word vectors (1C) Run time with pure document vectors and document+word vectors
这里的图中包含了很多细节,所以让我们逐点总结一下。
1。文档向量 vs 文档+单词向量:看一眼 1A 和 1B,我们会发现 1A 的分类质量更好,也许好不了多少,但却是真实的,而且是全面的。也就是说,如果分类质量是最重要的,那么在这种情况下,文档向量似乎具有优势。
2。Stopped vs Stemmed : Stemmed 词汇产生更短的向量,因此对所有分类器的性能更好。对于 mlp 分类器来说尤其如此,在这种分类器中,输入神经元的数量等于输入文档向量的大小。当单词被词干化时,唯一单词的数量从 39k 下降到 28k,减少了大约 30%,这大大减小了纯文档向量的大小。
- 文档向量。图 1A 表明,当纯文档向量是分类的基础时,对获得的 F 分数没有实质性影响。
- 文档+词向量。然而,在这种情况下,使用词干标记似乎有一些好处。虽然改进很小,但通过对词干化的标记进行训练获得的定制向量显示出比对停止的标记进行训练的向量更好的 F 分数。这如图 1B 所示。
3。频率计数与 Tf-Idf: Tf-Idf 矢量化允许根据单词在语料库中出现的频率对单词进行不同的加权。对于基于关键字的搜索方案,它有助于提高搜索结果的相关性。
- 文件向量。虽然朴素贝叶斯没有被 tf-idf 打动,但是 linearsvc 和 mlp 分类器通过 tf-idf 矢量化产生了更好的 F 分数。这如图 1A 所示。
- 文档+词向量。图 1B 显示,使用 tf-idf 矢量化后,F 值有了很大的提高。既有预先训练的词向量,也有定制的词向量。唯一的例外似乎是当预训练的 word2vec 向量与 mlp 分类器结合使用时。但是将隐藏层的数量从 2 增加到 3,将神经元的数量从 100 增加到 200,tf-idf 矢量化又得到了更好的分数。
4。预训练矢量与定制矢量:这仅适用于图 1B。自定义单词向量似乎有优势。
- 自定义向量显然会产生更好的 F 值,尤其是使用 tf-idf 矢量化时
- 预训练的向量似乎稍微好一点
5。计时结果:图 1C 显示了 fit &预测运行的平均 cpu 时间。
- 当使用纯文档向量时, mlp 分类器的运行时间更长是可以理解的。有许多(39k,如果停止和 28k,如果阻止)输入神经元工作。这是我们在之前的文章中讨论的单词嵌入出现的原因之一。
- 使用更小但更密集的Z,linear SVC分类器需要更长时间才能收敛。
- 朴素贝叶斯分类器是所有分类器中最快的。
2.2 电影评论的二元分类
下面的图 2 显示了从电影评论数据集获得的二进制分类结果。
Figure 2. Binary classification of the movie review data set. (2A) Classification with pure document vectors (2B) Classification with document+word vectors (2C) Run time with pure document vectors and document+word vectors
这里的观察与上面的没有本质上的不同,所以我们不会在这上面花太多时间。这里分类的整体质量更好,F 值在 0.8 以上(相比之下,20 个新闻语料库的 F 值约为 0.6)。但这只是这个数据集的本质。
- 文档向量 vs 文档+单词向量:看一下 2A 和 2B,我们可以说文档+单词向量似乎总体上在分类质量上有优势(除了 linearsvc 与 tf-idf 一起使用的情况)。20 条新闻数据集的情况正好相反。
- Stopped vs Stemmed:Stopped 令牌似乎在大多数情况下表现更好。在 20 条新闻的数据集上,情况正好相反。词干化导致词汇表的大小减少了 34%,从 44k 减少到 29k。我们对两个数据集应用了相同的词干分析器,但是对于这个语料库中的文本的性质来说,这可能太激进了。
- 频率计数与 Tf-Idf: Tf-Idf 向量在大多数情况下表现更好,就像它们在 20 个新闻数据集的表现一样。
- 预训练向量与定制向量:定制单词向量在所有情况下都比预训练向量产生更好的 F 分数。这在某种程度上证实了我们对 20 条新闻数据的评估,而这些数据并不那么清晰。
- 计时结果:朴素贝叶斯仍然是最好的。
3.那么有哪些大的收获呢?
不幸的是,我们不能仅仅根据对两个数据集进行的有些肤浅的测试就得出明确的结论。此外,正如我们上面提到的,在数据集之间,同一管道的分类质量也存在一些差异。但是从高层次上来说,我们或许可以得出以下结论——不要全信!
1。当有疑问时——简化。很明显,这是这篇文章的标题。按照下面的方法做,你就不会犯太大的错误,你会很快完成你的工作。使用:
- 朴素贝叶斯分类器
- Tf-idf 文档向量
- 想干就干。
2。理解语料库。适用于一个语料库的特定流水线(标记化方案= >矢量化方案= >单词嵌入算法= >分类器)对于不同的语料库可能不是最好的。即使通用管道可以工作,细节(特定词干分析器、隐藏层数、神经元等)也需要调整,以在不同的语料库上获得相同的性能。
3。单词嵌入很棒。对于维数减少和运行时间的并行减少来说,肯定的。他们工作得很好,但还有更多工作要做。如果你必须使用神经网络进行文档分类,你应该试试这些。
4。使用自定义矢量。使用从手边的语料库生成的定制单词向量可能产生更好质量的分类结果
单词嵌入:探索、解释和利用(带 Python 代码)
原文:https://towardsdatascience.com/word-embeddings-exploration-explanation-and-exploitation-with-code-in-python-5dac99d5d795?source=collection_archive---------0-----------------------
单词嵌入讨论是每个自然语言处理科学家谈论了很多很多年的话题,所以不要期望我告诉你一些引人注目的新东西或者“睁开你的眼睛”看看单词向量的世界。我在这里讲述一些关于单词嵌入的基本知识,并描述最常见的单词嵌入技术,附带公式解释和代码片段。
因此,正如每本流行的数据科学书籍或博客文章在介绍部分之后应该说的那样,让我们开始吧!
非正式定义
维基百科会指出,单词嵌入是
自然语言处理(NLP)中一组语言建模和特征学习技术的统称,其中词汇表中的单词或短语被映射到实数向量。
严格来说,这个定义是绝对正确的,但是如果阅读它的人从未接触过自然语言处理或机器学习技术,那么它就没有太多的洞察力。更非正式的说法是,我可以说单词嵌入是
向量,其在形态学方面反映单词的结构(用子单词信息丰富单词向量 ) /单词上下文表示( word2vec 参数学习解释 ) /全局语料库统计(手套:单词表示的全局向量 ) /在 WordNet 术语方面的单词层级(用于学习层级表示的庞加莱嵌入 ) /一组文档和它们包含的术语之间的关系(潜在语义索引 ) /等等。
所有单词嵌入背后的想法是用它们捕获尽可能多的语义/形态/上下文/层次等。信息,但是在实践中,对于特定的任务,一种方法肯定比另一种更好(例如,当在低维空间中工作以分析来自与已经被处理并放入术语-文档矩阵中的文档相同的域区域的输入文档时,LSA 是非常有效的)。为特定项目选择最佳嵌入的问题总是“尝试-失败法”的问题,因此了解为什么在特定情况下一个模型比另一个模型更好在实际工作中有足够的帮助。
事实上,用实数向量进行可靠的单词表示是我们试图达到的目标。听起来很容易,不是吗?
一键编码(计数矢量化)
将单词转换成向量的最基本和最简单的方法是统计每个单词在每个文档中的出现次数,不是吗?这种方法被称为计数矢量化或一键编码(取决于文献)。
这个想法是收集一组文档(它们可以是单词、句子、段落甚至文章)并统计其中每个单词的出现次数。严格来说,得到的矩阵的列是单词,行是文档。
附加的代码片段是基本的 sklearn 实现,完整的文档可以在这里找到。
**from** **sklearn.feature_extraction.text** **import** CountVectorizer
# create CountVectorizer object
vectorizer = CountVectorizer()corpus = [
'Text of first document.',
'Text of the second document made longer.',
'Number three.',
'This is number four.',
]
# learn the vocabulary and store CountVectorizer sparse matrix in X
X = vectorizer.fit_transform(corpus)# columns of X correspond to the result of this method
vectorizer.get_feature_names() == (
['document', 'first', 'four', 'is', 'longer',
'made', 'number', 'of', 'second', 'text',
'the', 'this', 'three'])# retrieving the matrix in the numpy form
X.toarray()# transforming a new document according to learn vocabulary
vectorizer.transform(['A new document.']).toarray()
例如,给定示例中的单词“第一”对应于向量 [1,0,0,0] ,它是矩阵 X 的第 2 列。有时这种方法的输出被称为‘稀疏矩阵’,只要 X 的大部分元素为零,并且以稀疏性为特征。
TF-IDF 转型
这种方法背后的思想是通过利用被称为 tf-idf 的有用统计度量来进行术语加权。拥有大量文档,如“a”、“the”、“is”等。非常频繁地出现,但是它们没有携带很多信息。使用一键编码方法,我们看到这些词的向量不是那么稀疏,声称这些词很重要,如果在这么多的文档中,它们会携带很多信息。解决这个问题的方法之一是停用词过滤,但是这个解决方案是离散的,并且对于我们正在处理的领域区域不灵活。
停用词问题的一个本地解决方案是使用统计数量,如下所示:
它的第一部分是 tf ,意思是‘词频’。我们所说的简单意思是这个词在文档中出现的次数除以文档中的总字数:
第二部分是 idf ,代表“逆文档频率”,解释为文档的逆数量,其中出现了我们感兴趣的术语。我们也取这个分量的对数:
我们已经完成了公式,但是我们如何使用它呢?在我们之前检查的方法中,我们将 word 作为列 j 在文档中出现 n 次,作为行 i 。我们采用之前计算的相同 CountVectorizer 矩阵,并用本术语和本文档的 tf-idf 得分替换其中的每个单元格。
**from** **sklearn.feature_extraction.text** **import** TfidfTransformer# create tf-idf object
transformer = TfidfTransformer(smooth_idf=**False**)# X can be obtained as X.toarray() from the previous snippet
X = [[3, 0, 1],
[5, 0, 0],
[3, 0, 0],
[1, 0, 0],
[3, 2, 0],
[3, 0, 4]]# learn the vocabulary and store tf-idf sparse matrix in tfidf
tfidf = transformer.fit_transform(counts)# retrieving matrix in numpy form as we did it before
tfidf.toarray()
关于这个 sklearn 类的完整文档可以在这里找到,那里有许多有趣的参数可以使用。
Word2Vec ( word2vec 参数学习讲解)
正如我要说的,有趣的事情开始了!Word2Vec 是第一个神经嵌入模型(或者至少是第一个,它在 2013 年获得了它的普及),并且仍然是被大多数研究人员使用的模型。它的孩子 Doc2Vec 也是最流行的段落表示模型,灵感来自 Word2Vec。事实上,我们将在后面讨论的许多概念都是基于 Word2Vec 的先决条件,所以一定要对这种嵌入类型给予足够的重视。
有 3 种不同类型的 Word2Vec 参数学习,并且它们都基于神经网络模型,所以这一段将在假设您知道它是什么的情况下创建。
一个单词的上下文 其背后的直觉是,我们在每一个上下文中考虑一个单词(我们在给定一个单词的情况下预测一个单词);这种方法通常被称为 CBOW 模型。我们的神经网络的架构是,我们有一个独热编码向量作为大小为 V×1 的输入,大小为 V×N 的输入→隐藏层权重矩阵 W ,大小为 N×V 的隐藏层→输出层权重矩阵W’,以及作为最终激活步骤的 softmax 函数。我们的目标是计算下面的概率分布,它是索引为 I 的单词的向量表示:
我们假设我们调用我们的输入向量 x ,其中全是 0,只有一个 1 在位置 k 。隐藏层 h 计算如下:
说到这个符号,我们可以认为 h 是单词 x 的“输入向量”。我们词汇中的每个单词都有输入和输出表示;形式上,权重矩阵 W 的行 i 是单词 i 的“输入”向量表示,因此我们使用冒号符号来避免误解。
作为神经网络的下一步,我们取向量 h 并进行以下计算:
我们的v’是索引为 j 的字 w 的输出向量,并且对于索引为 j 的每个条目 u 我们都执行这个乘法运算。
正如我们之前说过的,激活步骤是用标准 softmax 计算的(欢迎使用负采样或分层 softmax 技术):
该方法上的图表捕获了所描述的所有步骤。
多词上下文
这个模型与单词上下文没有任何区别,除了我们想要获得的概率分布类型和我们拥有的隐藏层类型。多词上下文的解释是这样的事实,即我们希望预测多项式分布,给定的不仅是一个上下文词,而是许多上下文词,以存储关于我们的目标词与语料库中其他词的关系的信息。
我们的概率分布现在是这样的:
为了获得它,我们将隐藏层函数改为:
这就是我们从 1 到 T5 到 T6 的上下文向量的平均值。成本函数现在采取以下形式:
该架构的所有其他组件都是相同的。
Skip-gram 模型
想象与 CBOW 多词模型相反的情况:我们希望预测输入中有一个目标词的 c 上下文词。然后,我们试图达到的目标发生了巨大的变化:
-c 和 c 是我们上下文窗口的限制,索引为 t 的单词是我们正在处理的语料库中的每个单词。
我们要做的第一步是获得隐藏层,这与前两种情况相同:
我们的输出层(未激活)计算如下:
在输出层,我们正在计算 c 多项式分布;每个输出面板共享来自隐藏层→输出层权重矩阵W’的相同权重。作为输出的激活,我们也使用 softmax,并根据 T21 面板稍微改变了符号,而不是像我们之前那样使用一个输出面板:
跳跃图计算中的图示复制了所有执行的阶段。
Word2Vec 模型的基本实现可以用 gensim 进行;完整文档在这里。
from gensim.models import word2veccorpus = [
'Text of the first document.',
'Text of the second document made longer.',
'Number three.',
'This is number four.',
]
# we need to pass splitted sentences to the model
tokenized_sentences = [sentence.split() for sentence in corpus]model = word2vec.Word2Vec(tokenized_sentences, min_count=1)
GloVe ( Glove:单词表示的全局向量)
全局单词表示法用于捕获嵌入整个观察语料库结构中的一个单词的意思;词频和共现计数是大多数无监督算法所基于的主要度量。GloVe 模型对单词的全局共现计数进行训练,并通过最小化最小二乘误差来充分利用统计,从而产生具有有意义的子结构的单词向量空间。这样的轮廓充分保留了单词与向量距离的相似性。
为了存储该信息,我们使用共现矩阵 X ,其每个条目对应于单词 j 在单词 i 的上下文中出现的次数。结果是:
是索引为 j 的单词出现在单词 i 的上下文中的概率。
同现概率的比率是开始单词嵌入学习的适当起点。我们首先将函数 F 定义为:
其依赖于具有索引 i 和 j 的 2 个单词向量以及具有索引 k 的独立上下文向量。f 编码信息,以比率表示;以矢量形式表示这种差异的最直观方式是用一个矢量减去另一个矢量:
在这个等式中,左边是矢量,右边是标量。为了避免这种情况,我们可以计算两项的乘积(乘积运算仍然允许我们获取我们需要的信息):
只要在单词-单词共现矩阵中,上下文单词和标准单词之间的区别是任意的,我们就可以用以下来代替概率比:
解这个方程:
如果我们假设 F 函数是 exp() ,那么解就变成了:
该等式不保持对称性,因此我们将其中两项纳入偏差:
现在,我们试图最小化的损失函数是经过一些修改的线性回归函数:
其中 f 为加权函数,手动定义。
GloVe 也是用 gensim 库实现的,它在标准语料库上训练的基本功能用下面的代码片段描述
import itertools
from gensim.models.word2vec import Text8Corpus
from glove import Corpus, Glove# sentences and corpus from standard library
sentences = list(itertools.islice(Text8Corpus('text8'),None))
corpus = Corpus()# fitting the corpus with sentences and creating Glove object
corpus.fit(sentences, window=10)
glove = Glove(no_components=100, learning_rate=0.05)# fitting to the corpus and adding standard dictionary to the object
glove.fit(corpus.matrix, epochs=30, no_threads=4, verbose=True)
glove.add_dictionary(corpus.dictionary)
FastText ( 用子词信息丰富词向量
如果我们想考虑单词的形态学呢?要做到这一点,我们仍然可以使用跳格模型(记得我告诉过你,跳格基线在许多其他相关工作中使用)和负抽样目标。
让我们考虑给我们一个得分函数,它将(单词,上下文)对映射到实值得分。预测上下文单词的问题可以被视为一系列二元分类任务(预测上下文单词的存在或不存在)。对于位置为 t 的单词,我们将所有上下文单词视为正例,并从字典中随机抽取负例。
现在我们的负抽样目标是:
FastText 模型考虑单词的内部结构,将单词拆分成一个字符 n 元语法包,并添加一个完整的单词作为最终特征。如果我们将 n-gram 向量表示为 z 并且将 v 表示为单词 w(上下文单词)的输出向量表示:
我们可以选择任何大小的 n-grams,但实际上大小从 3 到 6 是最合适的。
所有关于脸书图书馆快速文本实现的文档和例子都可以在这里找到。
庞加莱嵌入(用于学习分层表示的庞加莱嵌入
庞加莱嵌入是自然语言处理社区的最新趋势,基于这样一个事实,即我们正在使用双曲几何来捕捉我们无法在欧几里得空间中直接捕捉的单词的层次属性。我们需要使用这种几何图形和庞加莱球来捕捉这样一个事实,即从树根到树叶的距离随着每一个新生的孩子呈指数增长,而双曲几何能够表现这一特性。
关于双曲几何的注记 双曲几何研究的是常负曲率的非欧空间。它的两个主要定理是:
- 对于每一条直线 l 和不在 l 上的每一个点 P,至少有两条不同的平行线穿过 P。此外,从 l 到 P 有无限多的平行线;
- 所有三角形的角和小于 180 度。
对于二维双曲空间,我们看到面积 s 和长度 l 都以指数形式增长,公式如下:
双曲几何的设计方式是,我们可以使用我们创建的嵌入空间中的距离来反映单词的语义相似性。
我们感兴趣的双曲几何模型是庞加莱球模型,表述如下:
我们使用的范数是标准的欧几里德范数。庞加莱球模型可以被绘制成圆盘,其中直线由圆盘内包含的与圆盘边界正交的所有圆段加上圆盘的所有直径组成。
庞加莱嵌入基线
考虑我们的任务是对一棵树建模,这样我们在度量空间中进行建模,并且它的结构反映在嵌入中;我们知道,树中孩子的数量随着离根的距离成指数增长。
具有分支因子 b 的规则树可以在二维双曲几何中建模,使得根下面的节点 l 级位于半径为 l = r 的球体上,并且根下面少于 l 级的节点位于该球体内。双曲空间可以被认为是树的连续版本,而树可以被认为是离散的双曲空间。
我们在双曲空间中定义的两个嵌入之间的距离度量为:
这使我们不仅能够有效地捕捉嵌入之间的相似性(通过它们的距离),而且能够保留它们的层次结构(通过它们的规范),这是我们从 WordNet 分类法中获得的。
我们正在最小化关于θ的损失函数(来自庞加莱球的元素,它的范数应该不大于 1):
其中 D 是所有观察到的上下位关系的集合, N(u) 是 u 的反例集合。
培训详情
- 从均匀分布中随机初始化所有嵌入;
- 学习 D 中所有符号的嵌入,使得相关对象在嵌入空间中接近。
结论
我认为这篇文章是对单词嵌入的简短介绍,简要描述了最常见的自然语言处理技术、它们的特性和理论基础。关于每种方法的更多细节,每篇原始论文的链接附后;大部分的公式都指出来了,但是更多的关于记谱法的解释可以在同一个地方找到。
我还没有提到一些基本的单词嵌入矩阵分解方法,如潜在语义索引,也没有关注每种方法的实际应用,只要它们都取决于任务和给定的语料库;例如,GloVe 的创建者声称,他们的方法在 CoNNL 数据集上的命名实体识别任务中工作得很好,但这并不意味着它在来自不同领域区域的非结构化数据的情况下工作得最好。
还有,段落嵌入在这篇文章里没有被淡化,但这是另一个故事了……值得讲吗?
用于情感分析的词嵌入
原文:https://towardsdatascience.com/word-embeddings-for-sentiment-analysis-65f42ea5d26e?source=collection_archive---------1-----------------------
当对单词应用一键编码时,我们最终得到高维度的稀疏(包含许多零)向量。在大型数据集上,这可能会导致性能问题。此外,独热编码没有考虑单词的语义。所以像飞机和飞机这样的词被认为是两种不同的特征。虽然我们知道它们有非常相似的意思。单词嵌入解决了这两个问题。
单词嵌入是具有低得多的维度的密集向量。其次,词与词之间的语义关系反映在向量的距离和方向上。
我们将使用 Kaggle 上的推特在线感知数据集。该数据集包含大约 15K 条推文,具有 3 种可能的情绪类别(积极、消极和中立)。在我之前的帖子中,我们试图通过对单词进行标记和应用两个分类器来对推文进行分类。让我们看看单词嵌入是否能胜过它。
阅读完本教程后,你将知道如何使用 Keras 的嵌入层计算特定任务的单词嵌入。其次,我们将研究在更大的语料库上训练的单词嵌入是否可以提高我们的模型的准确性。
本教程的结构是:
- 单词嵌入背后的直觉
- 项目设置
- 数据准备
- Keras 及其嵌入层
- 预训练单词嵌入—手套
- 多维度训练词嵌入
单词嵌入背后的直觉
在我们可以在分类器中使用单词之前,我们需要将它们转换成数字。一种方法是简单地将单词映射成整数。另一种方法是一键编码单词。然后,每条 tweet 可以表示为一个向量,其维数等于语料库中的单词(有限的一组)。tweet 中出现的单词在向量中的值为 1。所有其他向量值等于零。
单词嵌入的计算方式不同。每个单词被定位到一个 多维空间 。这个空间中的维度数量由数据科学家选择。您可以尝试不同的维度,看看什么能提供最好的结果。
单词的 向量值表示其在该嵌入空间中的位置 。同义词之间的距离很近,而意思相反的词之间的距离很大。您还可以对向量应用数学运算,这会产生语义上正确的结果。一个典型的例子就是王和女的单词嵌入之和产生了皇后的单词嵌入。
项目设置
让我们从导入这个项目的所有包开始。
import pandas as pd
import numpy as np
import re
import collections
import matplotlib.pyplot as plt
from pathlib import Path
from sklearn.model_selection import train_test_split
from nltk.corpus import stopwords
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.utils.np_utils import to_categorical
from sklearn.preprocessing import LabelEncoder
from keras import models
from keras import layers
我们定义了在整个项目中使用的一些参数和路径。大部分都是不言自明的。但是其他的将在代码中进一步解释。
NB_WORDS = 10000 # Parameter indicating the number of words we'll put in the dictionary
VAL_SIZE = 1000 # Size of the validation set
NB_START_EPOCHS = 10 # Number of epochs we usually start to train with
BATCH_SIZE = 512 # Size of the batches used in the mini-batch gradient descent
MAX_LEN = 24 # Maximum number of words in a sequence
GLOVE_DIM = 100 # Number of dimensions of the GloVe word embeddings
root = Path('../')
input_path = root / 'input/'
ouput_path = root / 'output/'
source_path = root / 'source/'
在这段代码中,我们还将使用一些帮助函数进行数据准备、建模和可视化。这里没有显示这些函数定义,以避免博客文章混乱。你可以随时参考 Github 里的笔记本看代码。
数据准备
读取数据和清理
我们读入包含 tweets 的 CSV 文件,并对其索引进行随机排序。之后,我们删除停用词和@提及。分离出 10%的测试集,以根据新数据评估模型。
df = pd.read_csv(input_path / 'Tweets.csv')
df = df.reindex(np.random.permutation(df.index))
df = df[['text', 'airline_sentiment']]
df.text = df.text.apply(remove_stopwords).apply(remove_mentions)
X_train, X_test, y_train, y_test = train_test_split(df.text, df.airline_sentiment, test_size=0.1, random_state=37)
将单词转换成整数
使用 Keras 的 标记器 ,我们将推文转换成整数序列。我们把单词的数量限制在 NB_WORDS 最常用的单词。此外,tweets 被一些过滤器清理,设置为小写,并在空格上分割。
tk = Tokenizer(num_words=NB_WORDS,
filters='!"#$%&()*+,-./:;<=>?@[\]^_`{"}~\t\n',lower=True, split=" ")
tk.fit_on_texts(X_train)
X_train_seq = tk.texts_to_sequences(X_train)
X_test_seq = tk.texts_to_sequences(X_test)
等长序列
每批都需要提供等长的序列。我们用pad _ sequences方法实现了这一点。通过指定【maxlen】,序列或用零填充或截断。
X_train_seq_trunc = pad_sequences(X_train_seq, maxlen=MAX_LEN)
X_test_seq_trunc = pad_sequences(X_test_seq, maxlen=MAX_LEN)
编码目标变量
目标类是需要转换成数字向量的字符串。这是通过 Sklearn 的 LabelEncoder 和 Keras 的to _ categorial方法完成的。
le = LabelEncoder()
y_train_le = le.fit_transform(y_train)
y_test_le = le.transform(y_test)
y_train_oh = to_categorical(y_train_le)
y_test_oh = to_categorical(y_test_le)
分离验证集
从训练数据中,我们分离出 10%的验证集用于训练。
X_train_emb, X_valid_emb, y_train_emb, y_valid_emb = train_test_split(X_train_seq_trunc, y_train_oh, test_size=0.1, random_state=37)
建模
Keras 和嵌入层
Keras 提供了一种将每个单词转换成多维向量的便捷方法。这可以用 嵌入 层来完成。它将计算单词嵌入(或使用预先训练的嵌入)并在字典中查找每个单词以找到其矢量表示。这里我们将训练 8 维的单词嵌入。
emb_model = models.Sequential()
emb_model.add(layers.Embedding(NB_WORDS, 8, input_length=MAX_LEN))
emb_model.add(layers.Flatten())
emb_model.add(layers.Dense(3, activation='softmax'))
emb_history = deep_model(emb_model, X_train_emb, y_train_emb, X_valid_emb, y_valid_emb)
我们有大约 74%的验证准确率。推文字数比较低,所以这个结果还是比较不错的。通过比较训练和验证损失,我们看到模型从时期 6 开始过度拟合。
在之前的一篇文章中,我讨论了我们如何避免过度拟合。如果你想深入研究这个话题,你可能想读一下。
当我们在所有数据(包括验证数据,但不包括测试数据)上训练模型并将时期数设置为 6 时,我们得到 78%的测试准确度。这个测试结果相当好,但是让我们看看我们是否可以通过预先训练的单词嵌入来改进。
emb_results = test_model(emb_model, X_train_seq_trunc, y_train_oh, X_test_seq_trunc, y_test_oh, 6)
print('/n')
print('Test accuracy of word embeddings model: {0:.2f}%'.format(emb_results[1]*100))
预训练单词嵌入—手套
因为训练数据不是很大,所以模型可能无法学习用于情感分析的良好嵌入。或者,我们可以加载建立在更大的训练数据上的预训练单词嵌入。
手套数据库包含多个预训练的单词嵌入,以及在推文 上训练的更具体的 嵌入。所以这可能对手头的任务有用。
首先,我们将单词嵌入放在字典中,其中键是单词,值是单词嵌入。
glove_file = 'glove.twitter.27B.' + str(GLOVE_DIM) + 'd.txt'
emb_dict = {}
glove = open(input_path / glove_file)
for line in glove:
values = line.split()
word = values[0]
vector = np.asarray(values[1:], dtype='float32')
emb_dict[word] = vector
glove.close()
通过将手套嵌入加载到字典中,我们可以在航空公司 tweets 的语料库中查找每个单词的嵌入。这些将被存储在一个形状为 NB_WORDS 和 GLOVE_DIM 的矩阵中。如果在手套字典中找不到某个单词,则该单词的单词嵌入值为零。
emb_matrix = np.zeros((NB_WORDS, GLOVE_DIM))
for w, i in tk.word_index.items():
if i < NB_WORDS:
vect = emb_dict.get(w)
if vect is not None:
emb_matrix[i] = vect
else:
break
然后,我们指定模型,就像我们对上面的模型所做的那样。
glove_model = models.Sequential()
glove_model.add(layers.Embedding(NB_WORDS, GLOVE_DIM, input_length=MAX_LEN))
glove_model.add(layers.Flatten())
glove_model.add(layers.Dense(3, activation='softmax'))
在嵌入层(这里是第 0 层)中,我们 将单词的权重 设置为在手套单词嵌入中找到的权重。通过将 可训练 设置为假,我们确保手套单词嵌入不能被改变。之后,我们运行模型。
glove_model.layers[0].set_weights([emb_matrix])
glove_model.layers[0].trainable = False
glove_history = deep_model(glove_model, X_train_emb, y_train_emb, X_valid_emb, y_valid_emb)
在 3 个时期之后,模型过拟合得很快。此外,与在训练数据上训练的嵌入相比,验证准确度较低。
glove_results = test_model(glove_model, X_train_seq_trunc, y_train_oh, X_test_seq_trunc, y_test_oh, 3)
print('/n')
print('Test accuracy of word glove model: {0:.2f}%'.format(glove_results[1]*100))
作为最后一个练习,让我们看看当我们用与手套数据相同的维数训练嵌入时会得到什么结果。
多维度训练单词嵌入
我们将用与手套嵌入相同的维数训练单词嵌入(即 GLOVE_DIM)。
emb_model2 = models.Sequential()
emb_model2.add(layers.Embedding(NB_WORDS, GLOVE_DIM, input_length=MAX_LEN))
emb_model2.add(layers.Flatten())
emb_model2.add(layers.Dense(3, activation='softmax'))
emb_history2 = deep_model(emb_model2, X_train_emb, y_train_emb, X_valid_emb, y_valid_emb)
emb_results2 = test_model(emb_model2, X_train_seq_trunc, y_train_oh, X_test_seq_trunc, y_test_oh, 3)
print('/n')
print('Test accuracy of word embedding model 2: {0:.2f}%'.format(emb_results2[1]*100))
在测试数据上,我们得到了很好的结果,但我们并没有优于使用 CountVectorizer 的 LogisticRegression。所以还是有提升的空间。
结论
最好的结果是利用在可用数据上训练的 100 维单词嵌入来实现的。这甚至超过了在更大的 Twitter 语料库上训练的单词嵌入的使用。
到目前为止,我们只是在展平的嵌入物上加了一个致密层。通过这样做, 我们不考虑 tweet 中单词 之间的关系。这可以用递归神经网络或 1D 卷积网络来实现。但这是未来文章的内容。
单词变形
原文:https://towardsdatascience.com/word-morphing-9f87ee577775?source=collection_archive---------6-----------------------
Smooth image transition (morphing) from a tiger to a human (image courtesy: Google Images)
在这篇文章中,我将描述我如何使用 word2vec 的嵌入和 A*搜索算法在单词之间变形。
为了执行单词变形,我们将定义一个图 G ,其中节点集 N 表示单词,并且有一些非负的权重函数f:n×n→ℝ.给定一个起始字 S 和一个结束字 E ,我们的目标是在图中找到一条路径,该路径最小化由 f 导出的权重之和:
Fig. 1. Optimal path with minimal cost induced by f
通常当人们谈论单词变形时,他们指的是在 S 和 E 之间寻找一条路径,在那里单词之间只有一条边,这样一个可以通过改变一个字母从另一个获得,正如这里可以看到的。在这种情况下,当这种变化存在时, f ( n ₁, n ₂)为 1,否则为∞。
在这篇文章中,我将向你展示如何在语义相似的词之间变形,也就是说 f 将与语义相关。这里有一个例子来说明这两种方法的区别:给定 S = 齿, E = 光,一次改变一个字符的方法可以导致出现
tooth, booth, boots, botts, bitts, bitos, bigos, bigot, bight, light
虽然本文将要定义的语义方法会导致
tooth, retina, X_ray, light
你可以在这里找到完整的代码。
词汇语义学
为了捕捉单词语义,我们将使用预训练的 word2vec 嵌入[1]。对于那些不熟悉该算法的人,这里有一段来自维基百科的摘录:
Word2vec 将大型文本语料库作为其输入,并产生通常具有数百维的向量空间,语料库中的每个唯一单词被分配给该空间中的相应向量。单词向量被定位在向量空间中,使得语料库中共享共同上下文的单词在空间中彼此非常接近。
这意味着图中的每个节点都可以与高维空间中的某个向量相关联(在我们的例子中是 300)。因此,我们可以自然地定义每两个节点之间的距离函数。我们将使用余弦相似度,因为这是在想要对单词嵌入进行语义比较时通常使用的度量。从现在开始,我将重载一个节点符号 n 作为其关联单词的嵌入向量。
为了使用 word2vec 嵌入,我们将从这里下载 Google 的预训练嵌入,并使用gensim
包来访问它们。
选择权重函数
给定余弦相似距离函数,我们可以将我们的 f 函数定义为
Eq. 1. Definition of weight function using cosine similarity
然而,使用这种方法,我们将面临一个问题:最佳路径可能包括具有高权重的边,这将导致语义不相似的连续单词。
为了解决这个问题,我们可以将 f 改为
Eq. 2. Definition of weight function using cosine similarity limited to nearest neighbors
其中邻居 ( n ₁)表示在余弦相似性方面,图中距离 n ₁最近的节点。邻居的数量是可配置的。
A*搜索
现在我们已经定义了我们的图,我们将使用一个众所周知的搜索算法 A* [2]。
在该算法中,每个节点都有一个由两项组成的成本-g(n)+h(n)。
g ( n )是从 S 到 n 的最短路径的代价, h ( n )是估算从 n 到 E 的最短路径的代价的启发式方法。在我们的例子中,启发式函数将是 f 。
搜索算法维护一个叫做开集的数据结构。最初,这个集合包含 S ,在算法的每次迭代中,我们弹出开集中具有最小成本g(n)+h(n)的节点,并将其邻居添加到开集。当具有最小成本的节点是 E 时,算法停止。
这个算法适用于我们选择的任何启发式函数。但是,为了实际找到最佳路径,启发式函数必须是可接受的,这意味着它不能高估真实成本。不幸的是, f 是不可接受的。然而,我们将使用观察结果,即如果向量长度为 1,那么余弦相似性可以通过欧几里德距离上的单调变换来获得。这意味着这两个词在相似度排序方面是可以互换的。欧几里德距离是容许的(你可以用三角形不等式来证明它),所以我们可以用它来代替,通过定义
Eq. 3. Definition of weight function using euclidean distance
总之,我们将标准化单词嵌入,使用欧几里得距离作为寻找语义相似的单词的手段,并使用相同的欧几里得距离来指导搜索过程,以便找到最佳路径。
我选择了邻居 ( n )来包含它的 1000 个最近的节点。然而,为了使搜索更有效,我们可以使用 10 的dilute_factor
来稀释这些:我们选择最近的邻居、第 10 个最近的邻居、第 20 个邻居等等——直到我们有 100 个节点。其背后的直觉是,从某个中间节点到 E 的最佳路径可能经过其最近的邻居。如果它不通过,可能也不会通过第二个邻居,因为第一个和第二个邻居可能几乎相同。所以为了节省一些计算,我们跳过一些最近的邻居。
有趣的部分来了:
结果是:
['tooth', u'retina', u'X_ray', u'light']
['John', u'George', u'Frank_Sinatra', u'Wonderful', u'perfect']
['pillow', u'plastic_bag', u'pickup_truck', u'car']
最后的想法
实现单词变形项目很有趣,但没有在我能想到的任何一对单词上玩这个工具有趣。我鼓励你继续前进,自己玩这个游戏。请在评论中告诉我你发现了哪些有趣和令人惊讶的变形:)
本帖原帖www.anotherdatum.com。
参考
[1]https://papers . nips . cc/paper/5021-distributed-presentations-of-words-and-phrases-and-they-compositivity
【2】https://www . cs . Auckland . AC . NZ/courses/compsci 709s 2 c/resources/Mike . d/astarnilsson . pdf
来自手写文本的单词预测器
原文:https://towardsdatascience.com/word-predictor-from-handwritten-text-cfa1c5c092d3?source=collection_archive---------6-----------------------
r 语言中图像到文字预测器的实现。
我已经很久没有为社区做贡献了。我回来是为了付出我应得的。但在此之前,让我告诉你我一直在做什么。这几个月职业生涯的亮点有两件事。第一,我在三月份的一次数据科学会议上发言(孟买版 WiDS )。第二,我成为了一个开源贡献者,并得到了一个合并到 numpy 包中的 pull 请求。Yayyy!
好吧,让我们从一些机器学习开始。我将简要介绍建模过程,并向您介绍 github repo,它包含实现建模的所有文件和代码。
工作
创建一个模型,从手写文本图像中识别 5 个字母的英语单词。这些单词是使用 EMNIST 数据集的字母创建的,该数据集是一组手写字符数字,转换为 28x28 像素的图像格式和数据集结构,与 MNIST 数据集直接匹配。你可以从[这里](http://What is it? The EMNIST dataset is a set of handwritten character digits derived from the NIST Special Database 19 and converted to a 28x28 pixel image format and dataset structure that directly matches the MNIST dataset)了解详情。
Example Image for Prediction
解决方案
为了解决这个问题,我们将建立两个模型。
- 图像模型:单词预测器,通过使用多层感知器执行图像识别,它将接收图像并猜测图像中写了什么。
- 文本模型:这将补充图像模型。该模型的任务是利用隐马尔可夫模型,根据前一个字符给出下一个字符的概率。例如,字母 n 或 a 或 x 后面的 e 的概率是多少。
步伐
请参考此 git 报告,以遵循以下步骤-
[## krit hi07/字符识别
字符识别-使用 MLP 从图像中识别单词
github.com](https://github.com/Krithi07/Character_Recognition/blob/master/Code_image_text.R)
1.从 EMNIST 网站下载数据集:
- 向下滚动并点击“Matlab 格式数据集”
- 将会下载一个“Matlab.zip”文件。解压后你会发现 6 个 MS Access 数据集。我们使用“emnist-byclass”数据集来完成此任务,因为它包含所有字符
- 第一次使用“R.matlab”库读取 R 中的数据集
- 加载数据集后,将其保存为 R 格式(Rdata ),以备后用
EMNIST 数据集在训练集中包含 697,932 幅大小为 28 x 28 的标记图像,在测试集中包含 116,323 幅标记图像。图像以灰度表示,其中从 0 到 255 的每个像素值表示其暗度。
测试设置:下载文件em NIST 字。Rdata' 来自 github repo。该文件包含长度为 5 的 1000 个单词的示例。该测试集是使用 EMNIST 数据集中的字母图像创建的。变量 X 包含单词的图像,变量 y 包含真实单词(标签),变量 y_hat 包含由 2 层神经网络结合 2 阶马尔可夫模型进行的预测。
用于预测的数据集格式:在调用预测函数之前,我们需要获得特定格式的原始输入数据。预测函数采用的输入 X 的大小为 28n×28L,其中 n 是输入样本的数量,L 是单词的长度(例如,对于长度为 5 的 100 个单词,X 的大小为 2800×140)。预测函数在‘Word _ Predictor _ Champ’中定义。R' 文件。
2.从 github 下载支持文件:
'EMNIST_general_functions。这个文件有帮助函数,允许访问 EMNIST 数据集,计算误差,使用 EMNIST 数据集创建新单词。
'EMNIST_run。R'- 这是代码执行文件。将 github repo 中的所有文件放在您选择的目录中,并运行' EMNIST_run。r '文件。这将给出字符准确度和单词准确度来评估模型。
3.构建模型:
'Code_image_text。R' 文件有训练图像和文本模型的代码。文件“EMNIST_Model_Champ.h5”和“TEXT_Model_Champ”。“Rdata”是使用该文件中的代码创建的。这两者分别是图像和文本模型。我们来谈谈这里的代码-
安装需求: 我们将使用 tensorflow 构建图像识别的多层神经网络。您只需要这样做一次,以后,只需要从代码中调用库函数()来将需求加载到您的环境中
为图像模型准备数据: 我们下载的 EMNIST 数据已经分别有了训练和测试数据集。使用通用函数文件中定义的 EMNIST_read()函数读取数据。因为数据集中定义的每个字母或数字都是一个标签,而不是一个连续的值,所以让我们也将 y 转换成一个包含 62 个类的分类变量(emnist_byclass 数据集)
建立图像模型: 我们将通过交替密集层和脱落层来建立一个简单的多层神经网络。丢弃层通过丢弃两个密集层之间的指定百分比的连接来帮助模型的一般化。
我们使用了 Adam optimizer 和准确性作为衡量标准来拟合模型。最后,我们以 h5 格式保存模型。“h5”格式用于保存使用 keras 学习的模型,这些模型使用 R 的“保存”命令无法正确保存。
这里的想法是使用神经网络建立一个简单的图像识别模型,该模型将图像像素值作为特征,并将相应的标签作为目标变量。
为文本模型准备数据: 就像我们为构建图像模型做数据准备一样,我们需要为文本分析准备数据集。这里的尝试是训练一个懂英语的模型,这样它就可以补充来自图像的预测。例如“从不”这个词。如果图像模型由于字迹不清楚而将“e”预测为“c ”,则文本模型可以纠正它,因为它知道该语言。文本模型将知道,对于 5 个字母的单词,与“c”的概率相比,“nev”之后的“e”的概率更高
为了实现这一点,我们将采用英语语料库(书面文本的集合),从中构建词汇,然后告诉模型从中学习特征。具体来说,就是在给定前一个字符的情况下,学习下一个字符的概率。
我们在这里编写了一个函数,该函数执行数据清理部分,首先从文本中删除标点符号,过滤 5 个字母的单词,将所有单词转换为小写,提取只有字母(而不是数字)的单词,最后从这个精炼的语料库中只选择唯一的单词。
构建文本模型: 现在我们有了一个预处理过的语料库,我们可以用它来学习语言特征。对于这个任务,我们已经编写了一个隐马尔可夫模型,它基本上使用频率表得到给定 X(i)的 X(i+1)的概率。最后,让我们将这个模型保存为‘Text _ Model _ Champ’。Rdata '文件。
注意:您可以使用任何文本语料库来构建这个模型。通常,模型的性能取决于所提供的训练数据的质量和数量。在 github repo 上,我放了一个例子语料库(War_and_Peace.txt)供大家参考/使用。
4。预测单词:
' Word_Predictor_Champ '。r’文件包含预测函数,该函数将具有像素值的 2D 阵列 X、图像的学习模型 m:image 和学习的文本模型 m:text 作为输入。该函数返回字符串标签 y 的 1D 数组,其中数组的每个元素都是长度为 l 的字符串
该函数首先将输入图像转换成所需的(nxl,28x28)形状的矩阵形式。然后使用图像模型得到每个字符的概率。使用文本模型获取下一个字符的概率(第一个字符除外)。将这两者的概率结合起来进行最终预测。
Photo by John Jennings on Unsplash
5.模型改进:
这是一个基本的模型,在字符级给出了大约 95%的准确率。以下是一些你可以尝试改进这种模式的想法:
- 使用一个巨大的文本语料库来改进文本模型。你可以使用维基百科语料库来训练一个更好的文本模型。或者,使用网络上预先训练好的模型
- 通过添加更多的隐藏层/隐藏单元来改进 MLP 模型。或者,使用更复杂的图像模型,如 CNN
- 通过编辑 Code_image_text 文件来概括模型。目前,守则有一些限制,如下所述。通过编辑这个文件中的一些硬编码部分,可以使模型更通用。a .仅预测来自 EMNIST 数据集的 28 x 28 像素图像 b .仅预测 5 个字母单词并接受训练 EMNIST_general_functions 文件包含帮助您从 EMNIST 数据集创建单词图像的函数。此功能可用于创建不同的训练/测试集,消除 5 个单词长度的限制
感谢阅读!希望它能帮助你开始字符识别。
如果您有任何问题/建议,请随时在这里发表您的评论,或者通过 LinkedIn / Twitter 与我联系
自然语言处理中的词表示(一)
原文:https://towardsdatascience.com/word-representation-in-natural-language-processing-part-i-e4cd54fed3d4?source=collection_archive---------7-----------------------
在这篇博文中,我将讨论自然语言处理(NLP)中单词的表示。它是自然语言处理,尤其是神经网络的基本构件之一。它对深度学习模型的性能有着重要的影响。在博客文章的这一部分,我将描述相对简单的方法及其特点。
字典查找
最简单的方法是在字典中查找单词 ID。这种方法的基本步骤如下。
首先,取语料库,可以是单词、句子或文本的集合。将它们预处理成预期的格式。一种方法是使用词汇化,这是一个将单词转换为其基本形式的过程。例如,给定单词 walk,walking,walks 和walk,它们的引理将是 walk 。然后,将预处理后的词汇保存到文件中,如“vocabulary . txt”。
之后,通过创建单词和 ID 之间的映射来构建查找字典,即词汇表中的每个唯一单词都被分配一个 ID。
因此,将构建一个简单的查找字典,如下所示,从中可以查找单词 id。
Example of sample lookup dictionary.
然后,对于每个给定的单词,通过在字典中查找返回相应的整数表示。如果字典中不存在该单词,则应该返回与词汇外标记相对应的整数。在实践中,通常将词汇外令牌的值设置为字典的大小加 1,即长度(字典)+ 1。
虽然这是一种相对容易的方法,但它也有需要考虑的缺点。通过将标记视为整数,该模型可能会错误地假设自然排序的存在。例如,字典中包含的条目有 1:“机场”和 2:“飞机”。具有较大 ID 值的标记可能被深度学习模型认为比具有较小值的标记更重要,这是一个错误的假设。用这种类型的数据训练的模型容易失败。相反,带有序数值的数据如 size measures 1:“小”,2:“中”,3:“大”适合这种情况。因为数据中有一个自然的顺序。
一键编码
单词表示的第二种方法是一键编码。主要思想是创建一个词汇大小向量,其中除了 1 之外都填充了 0。对于单个单词,只有相应的列用值 1 填充,其余的是零值。编码的记号将由维度为 1 × (N+ 1) 的向量组成,其中 N 是字典的大小,并且对于超出词汇表的记号,额外的 1 被加到 N。让我们看看字典中的单词是如何转换成一键编码的:
正如我们所看到的,对于每个单词,只有对应于单词的列被激活。
这种顺序表示编码的优点是它不会遭受不希望的偏差。然而,其巨大而稀疏的矢量表示需要大量的计算内存。
分布表示
第三种方法是一系列分布式表示。这种方法背后的主要思想是,通常出现在相似上下文中的单词将具有相似的含义。其思想是存储单词-上下文共现矩阵 F ,其中行代表词汇表中的单词,列代表上下文。上下文可以是训练句子上的滑动窗口,甚至是文档。矩阵条目包括频率计数或 tf-idf(术语频率-逆文档频率)得分。这里有一个简单的例子:
波士顿有飞往美国主要城市的航班。
由于恶劣的天气状况,飞往波士顿的航班被取消了。
此外,一些函数 g 可以应用于 F 以降低噪声、平滑频率或降低表示向量的维数。函数 g 可以做简单的变换,比如线性分解,但是也有高级的方法,比如潜在的狄利克雷分配。由于上下文的数量可能非常大,例如文档可能包含数千个句子,这些方法被认为是低效的。
上述方法易于使用,但具有难以训练和需要大内存的缺点。此外,它们不像高级方法那样将单词的意思结合到表示中。在下面的自然语言处理中的单词表示系列中,我将描述更高级的方法。下一个系列可以在 这里找到 。
自然语言处理中的词表示第二部分
原文:https://towardsdatascience.com/word-representation-in-natural-language-processing-part-ii-1aee2094e08a?source=collection_archive---------10-----------------------
在单词表征系列的前一部分( 第一部分 ) 中,我谈到了固定的单词表征,它对单词的语义(意义)和相似性不做任何假设。在这一部分,我将描述一系列的分布式单词表示。主要思想是将单词表示为特征向量。vector 中的每个条目代表单词含义中的一个隐藏特征。它们可以揭示语义或句法依赖性。在下面的例子中,我们看到了 300 维的单词表示。我们可以观察到‘flight’和‘plane’的向量值与 s 的值相似,它们之间的数值差异很小。这同样适用于‘河’和‘湖’,因为它们具有密切相关的含义。
因此,它生成有用的属性,如线性关系。一个广为使用的例子是这样的类比:国王对女王就像男人对女人一样。国王和王后之间的差异几乎等同于向量空间中男人和女人之间的差异,这导致以下运算有效。
“国王—王后+男人”最接近“女人”
Word2Vec
一个广泛使用的分布式单词表示是 Skip-Gram 模型,它是 Word2Vec 库的一部分。它是由谷歌的托马斯·米科洛夫领导的研究小组创造的。主要思想是通过单词的邻居来表示单词。它试图预测给定单词的所有相邻单词(上下文)。
根据文件,模型的目标定义如下:
Objective function for Skip-Gram model
其中 w 是训练字, c 是上下文的大小。所以它的目标是找到可以预测周围单词的单词表征。
我们可以在我们的数据集上训练 Word2Vec,或者加载预训练的向量。谷歌公布了在谷歌新闻数据集(约 1000 亿字)的一部分上训练的预训练向量。该模型包含 300 万个单词和短语的 300 维向量。这里有这里有。
这些步骤使我们能够使用 Word2Vec 库中预先训练好的向量。
我们可以使用 gensim 加载预训练的单词向量,例如:
预训练向量表示的查找是这样的
手套
分布式单词表示的另一个成员是 Glove,它是全局向量的缩写。虽然 Word2Vec 捕获某些局部上下文窗口,但 GloVe 利用了来自语料库(一个大型文本集合)的单词的总体共现统计。它包括两个重要步骤。首先,构建一个词共现矩阵。对于每个单词,我们计算条件概率,例如对于单词 water P(k|water) ,其中 k 是来自词汇表的单词。如果 k 是流,则 P 的值为高,如果 k 是时尚,则期望值为低,因为它们通常不会同时出现。在完成所有的统计计算后,大矩阵就形成了。然后通过归一化计数和对数平滑来减少高维上下文矩阵,如下所示。
我们还可以使用 gensim 加载预训练的手套向量,这些向量是在维基百科数据上训练的。
我们需要将 GloVe 格式转换为 Word2Vec,以便与 gensim 一起使用,例如:
更多技术细节可以在这里找到。
Glove 和 Word2Vec 都允许对单词进行有用的操作,比如查找语义相似的单词。让我们比较一下最相似单词的结果。
使用 Glove 获得与' flight '意思相似的单词。
使用 Word2Vec 获得与'航班'意思相似的单词。
正如我们所观察到的,这两个向量的输出并不精确。不同之处在于相似度得分和返回的单词。
在上述方法中,分布式单词表示是一种强大的技术。它没有简单方法的不良特性,并且可能将单词的语义信息合并到它们的表示中。然而,它不能为不在词汇表中的单词产生向量。此外,罕见词的向量表示法学得不够好。在这些情况下,最好使用 FastText 模型,这将在下一部分描述。
词到向量—自然语言处理
原文:https://towardsdatascience.com/word-to-vectors-natural-language-processing-b253dd0b0817?source=collection_archive---------0-----------------------
自然语言处理为什么很难?
计算机用编程语言与人类交流,这种语言清晰、精确,而且通常是结构化的。但是,自然(人类)语言有很多歧义。有多个意思相同的词(同义词),有多个意思的词(一词多义),其中一些在性质上完全相反(自动反义词),还有当用作名词和动词时表现不同的词。这些词在自然语言的上下文中是有意义的,人类可以很容易地理解和区分,但机器不能。这就是 NLP 成为人工智能中最困难和最有趣的任务之一的原因。
使用自然语言处理可以完成什么?
让计算机“理解”人类语言可以完成几项任务。一个活生生的例子就是我在这篇文章中用来检查拼写和语法的软件。以下是目前使用 NLP 完成的一些任务:
- 拼写和语法检查
- 寻找同义词和反义词
- 从文档、网站解析信息
- 理解句子、文档和查询的含义
- 机器翻译(例如,将文本从英语翻译成德语)
- 回答问题和执行任务(例如安排约会等。)
如何表示文字?
首先,我们需要能够将单词表示为机器学习模型的输入。表示单词的一种数学方法是向量。英语中估计有 1300 万个单词。但其中许多是相关的。从配偶到伴侣,从酒店到汽车旅馆。那么,我们是否希望 1300 万个单词都有独立的向量呢?
不。我们必须寻找一个 N 维向量空间(其中 N << 13 million) that is sufficient to encode all semantics in our language. We need to have a sense of similarity and difference between words. We can exploit concept of vectors and distances between them (Cosine, Euclidean etc. ) to find similarities and differences between words.
我们如何表示单词的意思?
如果我们对英语词汇中的 1300 万个单词(或者更多)使用不同的向量,我们将面临几个问题。首先,我们有一个大的向量,里面有很多“0”和一个“1”(在不同的位置代表不同的单词)。这也被称为一键编码。其次,当我们在谷歌中搜索诸如“新泽西州的酒店”等短语时,我们希望返回与新泽西州的“汽车旅馆”、“住宿”和“住宿”相关的结果。如果我们使用一键编码,这些单词没有自然的相似性。理想情况下,我们希望同义词/相似词的点积(因为我们处理的是向量)接近 1。
基于分布相似性的表示:
从一个人交的朋友你就可以知道他说了什么——j·r·弗斯
用非常简单的外行话来说,就拿一个字‘银行’来说吧。这个词有许多含义,其中一个是金融机构,另一个是水边的土地。如果在一个句子中,银行与邻近的词如货币、政府、国库、利率等一起出现。我们可以理解为前者的意思。相反,如果相邻的词是水、海岸、河流、土地等。情况是后者。我们可以利用这个概念来处理多义词和同义词,并使我们的模型能够学习。
Word2Vec
我们如何构建简单、可扩展、快速的训练模型,能够运行数十亿个单词,产生非常好的单词表示?让我们研究一下 Word2Vec 模型来寻找这个问题的答案。
Word2Vec 是一组帮助导出单词与其上下文单词之间关系的模型。让我们看看 Word2Vec 中的两个重要模型:Skip-grams 和 CBOW
跳棋
在 Skip-gram 模型中,我们取一个中心单词和一个上下文(邻居)单词的窗口,并且我们尝试为每个中心单词预测出一些窗口大小的上下文单词。因此,我们的模型将定义一个概率分布,即给定一个中心词,一个词在上下文中出现的概率,我们将选择我们的向量表示来最大化该概率。
连续单词包模型(CBOW)
从抽象的角度来说,这与跳格是相反的。在 CBOW 中,我们试图通过对周围单词的向量求和来预测中心单词。
这是关于把单词转换成向量。但是“学习”发生在哪里呢?本质上,我们从单词向量的小的随机初始化开始。我们的预测模型通过最小化损失函数来学习向量。在 Word2vec 中,这是通过前馈神经网络和优化技术(如随机梯度下降)实现的。还存在基于计数的模型,其在我们的语料库中形成单词的共现计数矩阵;我们有一个大矩阵,每行代表“单词”,每列代表“上下文”。“上下文”的数量当然很大,因为它在大小上基本上是组合的。为了克服这个尺寸问题,我们将 SVD 应用于矩阵。这减少了矩阵的维数,保留了最大限度的信息。
总之,将单词转换为深度学习算法可以摄取和处理的向量,有助于更好地理解自然语言。小说家埃尔·多克托罗在他的《比利·巴斯盖特》一书中颇有诗意地表达了这一观点。
就像数字是语言一样,语言中的所有字母都变成了数字,所以每个人都以同样的方式理解它。你失去了字母的声音,不管它们是咔嚓声、砰砰声还是碰上颚的声音,或者发出“哦”或“啊”的声音,以及任何可能被误读或被它的音乐或它放在你脑海中的图片欺骗的声音,所有这些都消失了,连同口音,你有了一种完全新的理解,一种数字语言,一切对每个人来说都变得像墙上的文字一样清晰。所以正如我所说的,阅读数字的时间到了。
面向非 NLP 数据和研究人员的词向量
原文:https://towardsdatascience.com/word-vectors-for-non-nlp-data-and-research-people-8d689c692353?source=collection_archive---------3-----------------------
单词向量代表了在提高我们分析单词、句子和文档之间关系的能力方面的一个重大飞跃。在这样做的过程中,他们通过向机器提供比以前可能使用的传统单词表示更多的单词信息来推进技术。正是单词向量使得语音识别和机器翻译等技术成为可能。关于词向量有很多很好的解释,但在这一篇中,我想让不太熟悉自然语言处理(NLP)的数据和研究人员也能理解这个概念——有关基本 NLP 概念的初级读本,请在这里查看我的帖子:https://data flume . WordPress . com/2017/03/17/intro-NLP-python-spacy/。
什么是词向量?
单词向量只是代表单词意思的数字向量。现在,这还不是很清楚,但我们一会儿会回来。首先,考虑一下为什么单词向量被认为是对传统单词表示的一次飞跃,这是很有用的。
传统的 NLP 方法,如一键编码和词袋模型(即,使用虚拟变量来表示单词在观察结果(例如,句子)中的存在或不存在),虽然对一些机器学习(ML)任务有用,但不能捕获关于单词的含义或上下文的信息。这意味着潜在的关系,如上下文的密切程度,不能在单词集合中被捕获。例如,一键编码不能捕捉简单的关系,例如确定单词“狗”和“猫”都是指经常在家庭宠物的上下文中讨论的动物。这种编码通常为简单的 NLP 任务(例如,电子邮件垃圾分类器)提供了足够的基线,但对于更复杂的任务(如翻译和语音识别)来说,却缺乏复杂性。本质上,传统的自然语言处理方法,比如一键编码,不能捕捉单词集合之间的句法(结构和语义(含义)关系,因此,以一种非常幼稚的方式来表示语言。
相反,单词向量将单词表示为多维连续浮点数,其中语义相似的单词被映射到几何空间中的邻近点。更简单地说, 一个单词向量是一行实数值 (与虚数值相对),其中 每个点捕捉单词含义的一个维度 和 ,其中语义相似的单词具有相似的向量 。这意味着像车轮和发动机这样的词应该和汽车这样的词有相似的词向量(因为它们的意思相似),而香蕉这样的词应该是相当遥远的。换句话说,在相似上下文中使用的单词将被映射到一个近似的向量空间(我们将在下面讨论这些单词向量是如何创建的)。将单词表示为向量的美妙之处在于它们有助于数学运算。例如,我们可以增加和减少向量,这里的典型例子表明,通过使用词向量,我们可以确定:
国王-男人+女人=王后
换句话说,我们可以从代表国王的单词向量中减去一个意思(即男性),添加另一个意思(女性),并显示这个新的单词向量(国王-男人+女人)最接近地映射到代表王后的单词向量。
单词向量中的数字代表单词在维度上的分布权重。在简化的意义上,每个维度代表一个意义,单词在该维度上的数字权重捕捉了它与该意义的关联的紧密程度。因此,单词的 语义被嵌入到向量的维度中。
词向量的简化表示
在图中,我们假设每个维度都有一个明确定义的含义。例如,如果你想象第一个维度代表“动物”的意义或概念,那么每个词在那个维度上的权重代表它与那个概念的密切程度。
这是对单词向量的一个相当大的简化,因为维度并不具有如此明确定义的含义,但这是一个有用且直观的方法来让你理解单词向量维度的概念。
我们可以使用 Python NLP 库 spaCy(在这里查看我的介绍:https://data flume . WordPress . com/2017/03/17/intro-NLP-Python-spaCy/,最近也移植到了 R【https://github.com/kbenoit/spacyr】的上,快速访问一些预先训练好的 300 维单词向量。我们创建一个单词列表,应用 spaCy 的解析器,提取每个单词的向量,将它们堆叠在一起,然后提取两个主要成分用于可视化。
https://gist . github . com/Conor mm/ca 0 CDF 78 fa 7a 91 fdacf 500 ff 4 dff 0645
在这里,我们简单地提取不同动物的向量和可能用来描述其中一些动物的单词。正如开头提到的,单词向量非常强大,因为它们允许我们(和机器)通过在连续的向量空间中表示不同单词来识别它们之间的相似性。你可以在这里看到像“狮子”、“老虎”、“猎豹”和“大象”这样的动物的向量是如何非常接近的。这可能是因为它们经常在类似的背景下被讨论,例如这些动物很大,是野生的,有潜在的危险——事实上,描述性的词“野生”与这组动物非常接近。
相似的单词在向量空间中被映射在一起。注意猫和狗和宠物有多接近,大象、狮子和老虎有多聚在一起,以及描述性的词语是如何聚在一起的。
同样有趣的是,“野生”、“动物园”和“驯养”这三个词是如何相互对应的。这是有道理的,因为它们是经常被用来描述动物的词,但突出了词向量的惊人力量!
词向量从何而来?
此时一个极好的问题是这些维度和权重从何而来?!生成单词向量有两种常见方式:
- 单词/上下文共现的计数
- 给定单词的上下文预测(skip-gram 神经网络模型,例如 word2vec)
*注意:下面我描述了一种生成单词向量的高级 word2vec 方法,但是可以在这里找到计数/共现方法的很好的概述(https://medium . com/ai-society/jkljlj-7d6e 699895 C4)。
生成单词向量的两种方法都建立在 Firth(1957)分布假设的基础上,该假设陈述:
“从一个人交的朋友,你就可以知道他说的是什么”
换句话说,拥有相似语境的单词往往有相似的意思。单词的上下文在实际意义上是指其周围的单词,并且单词向量(通常)是通过预测给定单词的上下文的概率而生成的。换句话说,组成单词向量的权重是通过预测其他单词在上下文中接近给定单词的概率来学习的。这类似于试图填充某个给定输入单词周围的空白。例如,给定输入序列,“蓬松的狗在追猫时吠叫”,单词“狗”和“吠叫”的双窗口(焦点单词之前和之前的两个单词)上下文看起来像:
我不想过多地探究神经网络如何学习单词嵌入的数学细节,因为更有资格这样做的人已经解释了这一点。尤其是这些帖子对我理解单词向量是如何学习的很有帮助:
- 深度学习、NLP 和表示法(http://colah . github . io/posts/2014-07-NLP-RNNs-re presentations/)
- 词向量的惊人力量(https://blog . acolyer . org/2016/04/21/the-amazing-power-of-word-vectors/)
- Word2Vec 教程—跳过 Gram 模型(http://mccormickml . com/2016/04/19/word 2 vec-Tutorial-The-Skip-Gram-Model/)
然而,考虑到它的流行性和实用性,接触一下 word2vec 模型的工作原理是很有用的。word2vec 模型只是一个具有单个隐藏层的神经网络,它被设计为通过估计一个单词与作为输入给出的另一个单词“接近”的概率来重建单词的上下文。
该模型针对语料库中每个单词的单词、上下文配对进行训练,即:
(狗)
(狗,毛茸茸的)
(狗叫)
(狗,作为)
请注意,从技术上讲,这是一个受监督的学习过程,但您不需要带标签的数据—标签(目标/因变量)是从形成焦点单词上下文的单词中生成的。因此,使用窗口函数,模型学习使用单词的上下文。在这个简单的例子中,模型将了解到 fluffy 和barbed在单词 dog 的上下文(由窗口长度定义)中使用。
由 word2vec 模型创建的单词向量的一个迷人之处在于,它们是预测任务的副作用,而不是输出。换句话说,单词向量不是预测的,(预测的是上下文概率), 单词向量是输入 的学习表示,用于预测任务,即预测给定上下文的单词。单词向量是模型学习单词的良好数字表示的尝试,以便最小化其预测的损失(误差)。随着模型的迭代,它调整其神经元的权重,试图最小化其预测的误差,并在这样做的过程中,逐渐完善其对单词的表示。在这样做的过程中,单词的“含义”嵌入了网络隐藏层中每个神经元学习的权重中。
因此,word2vec 模型接受单个单词作为输入(表示为语料库中所有单词中的独热编码),并且该模型试图预测语料库中随机选择的单词位于输入单词附近位置的概率。这意味着对于,每个输入单词都有 n 个输出概率,其中 n 等于语料库的总大小。这里的神奇之处在于,训练过程只包括单词的上下文,而不是语料库中的所有单词。这意味着在我们上面的简单例子中,给定单词“狗”作为输入,“汪汪”将比“猫”具有更高的概率估计,因为它在上下文中更接近,即它是在训练过程中学习的。换句话说,模型试图预测语料库中的其他单词属于输入单词的上下文的概率。因此,给定上面的句子(“毛茸茸的狗在追逐一只猫时吠叫”)作为输入,模型的运行将如下所示:
注意:这个概念神经网络是 Chris McCormick 博客文章中的图表的密友,链接到上面的
经历这个过程的价值是提取模型隐藏层的神经元已经学习的权重。正是这些权重形成了单词向量,即,如果你有 300 个神经元隐藏层,你将为语料库中的每个单词创建 300 维的单词向量。因此,这个过程的输出是大小为 n- 个输入单词* n 个隐藏层神经元的单词向量映射。
感谢你的阅读,希望你学到了新的东西:)
Word2Vec For Phrases —学习多个单词的嵌入
原文:https://towardsdatascience.com/word2vec-for-phrases-learning-embeddings-for-more-than-one-word-727b6cf723cf?source=collection_archive---------2-----------------------
Photo by Alexandra on Unsplash
如何使用 Word2Vec 在给定的无监督语料库中学习相似术语
说到语义,我们都知道并喜欢著名的 Word2Vec [1]算法,该算法在许多自然语言处理应用中通过分布式语义表示来创建单词嵌入,如 NER、语义分析、文本分类等等。
然而,Word2Vec 算法当前实现的局限性是其单字自然行为。在 Word2Vec 中,我们试图根据上下文预测给定的单词(CBOW),或者根据给定的单词预测周围的上下文(Skip-Gram)。但是如果我们想把“美国航空公司”这个词作为一个整体嵌入进去呢?在这篇文章中,我将解释如何使用无监督的文本语料库为多个单词创建嵌入。如果你熟悉 Word2Vec 算法和单词嵌入,你可以跳过这篇文章的第一部分。
具体来说,我们将涵盖:
- 自然语言处理任务中的词汇表征。
- 分布假设[2]和 Word2Vec 算法。
- 从无监督文本中学习短语。
- 如何提取与给定短语相似的短语?
背景
我现在工作的公司,舒适分析,正在开发文本分析产品,同时专注于金融领域。它帮助企业获得大规模的可操作的见解。最近,我们发布了一个基于弹性搜索的新搜索引擎,以帮助我们的客户获得更精确、更集中的数据视图。在搜索引擎中查看用户的查询后,我们注意到许多客户正在搜索金融术语,而天真地使用查询执行全文搜索是不够的。例如,在用户搜索中出现多次的一个术语是“拐点”。
在 Investopedia 中寻找“拐点”的定义:
“拐点是指导致公司、行业、部门、经济或地缘政治形势发生重大变化的事件,可被视为一个转折点,在此之后,预期会出现具有积极或消极结果的巨大变化”
我们的客户希望看到他们所关注的公司的重大事件,因此,我们需要搜索更多与“拐点”具有相同含义的术语,如“转折点”、“引爆点”等。
从离散符号到连续向量
文字表述
语言中最细粒度的对象是字符,它构成了单词或记号。单词(和字符)是离散的和象征性的。仅仅从单词本身,或者从组成单词的字符来看,是无法分辨出“拉布拉多”和“狗”之间有什么联系的。
包话(鞠躬)
自然语言处理任务中最常见的特征提取是词袋(BOW)方法。在词袋中,我们查看给定语料库中词出现的直方图,而不考虑顺序。通常,我们寻找的不仅仅是一个单词,还包括双字母(“我想要”),三字母(“我想要”),或者一般情况下的 n 字母。标准化每个单词的计数是一种常见的方法,因为文档的长度可能不同(在大多数情况下)。
Normalized BOW.
BOW 表示的一个主要缺点是它是离散的,不能捕捉单词之间的语义关系。
词频—文档逆频(TF-IDF)
BOW 表示法的一个结果是,它为多次出现的单词打分,但其中许多单词没有给出任何有意义的信息,如“to”和“from”。我们希望区分多次出现的单词和出现多次但给出特定文档信息的单词。对船首向量进行加权是一种常见的做法,最常用的加权方法之一是 TF-IDF (Manning 等人,2008)。
TF-IDF weighting formula. There are many variations for TF-IDF, one can read more about it here.
然而,BOW 和 TF-IDF 都不能捕获单词的语义,因为它们以离散的方式表示单词或 n 元语法。
从上下文中学习单词
“告诉我你的朋友是谁,我就知道你是谁。”
分布假说认为出现在相同语境中的单词往往有相似的意思。这是文本语义分析的基础。这个假设背后的想法是,我们可以通过观察单词出现的上下文来学习单词的意思。人们可以很容易地看出“男孩喜欢在外面玩”这句话中的“play”和“The play was fantastic”这句话中的“play”有不同的意思。一般来说,离目标词近的词信息量更大,但在某些情况下,目标词和“远”的词在句子中有很长的依存关系。这些年来,已经开发了许多从上下文学习 word 的方法,其中包括著名的 Word2Vec,因为它在学术界和工业界都非常流行,所以本文将讨论它。
Word2Vec
分布假设是 Word2Vec 背后的主要思想。在 Word2Vec 中,我们有一个大型的无监督语料库,对于语料库中的每个单词,我们试图通过其给定的上下文(CBOW)来预测它,或者试图预测给定特定单词的上下文(Skip-Gram)。Word2Vec 是一个(浅层)神经网络,具有一个隐藏层(维度为 d)和负采样或分层 Softmax 的优化功能(可以阅读这篇论文了解更多详细信息)。在训练阶段,我们遍历语料库中的标记(目标单词)并查看大小为 k 的窗口(目标单词的每一边有 k 个单词,值通常在 2-10 之间)。
Image source
在训练结束时,我们将从网络中获得以下嵌入矩阵:
Emdedding matrix after Word2Vec training
现在,每个单词将不会用一个离散的、稀疏的向量来表示,而是用一个 d 维的连续向量来表示,每个单词的含义将通过它与其他单词的关系来捕捉[5]。这背后的原因是,在训练时间,如果两个目标词共享某个上下文,直观上这两个目标词的网络权重将彼此接近,从而它们的匹配向量也接近。因此,与基于计数的方法(如 BOW 和 TF-IDF)相比,我们获得了语料库中每个词的分布表示。由于分布行为,向量中的特定维度不会给出任何有价值的信息,但是将(分布)向量作为一个整体来看,可以执行许多相似性任务。比如我们得到 V(“国王”)-V(“男人”)+V(“女人”)~= V(“女王”)、V(“巴黎”)-V(“法国”)+V(“西班牙”)~= V(“马德里”)。此外,我们可以在向量之间执行相似性度量,如余弦相似性,并得到单词“总统”的向量将接近“奥巴马”、“特朗普”、“首席执行官”、“主席”等。
如上所述,我们可以使用 Word2Vec 对单词执行许多相似性任务。但是,正如我们上面提到的,我们想对不止一个单词做同样的事情。
从无监督文本中学习短语(搭配提取)
我们可以很容易地用无监督语料库创建二元模型,并将其作为 Word2Vec 的输入。例如,句子“我今天步行去公园”将被转换为“我今天步行去公园”,并且在 Word2Vec 训练短语中,每个双词将被视为单词。这是可行的,但是这种方法存在一些问题:
- 它将只学习二元模型的嵌入和,而这个二元模型中的许多并不真正有意义(例如,“walked_today”),我们将错过单元模型的嵌入,如“walked”和“today”。
- 只处理二元语法会创建一个非常稀疏的语料库。想想上面的句子“我今天去了公园”。假设目标词是“walked_today”,这个词在语料库中不是很常见,我们没有很多上下文示例来学习这个词的代表性向量。
那么,我们如何克服这个问题呢?如果单词的互信息足够强,我们如何只提取有意义的术语,同时保持单词是一元的?一如既往,答案就在问题里面— 互信息。
互信息
两个随机变量 X 和 Y 之间的互信息是 X 和 Y 之间相关性的度量。形式上:
Mutual Information (MI) of random variables X and Y.
在我们的例子中,X 和 Y 表示语料库中的所有二元语法,因此 Y 紧跟在 X 之后。
点态互信息
PMI 是对 y 的 x 的具体事件之间的相关性的度量。例如:x =已走,y =今天。形式上:
PMI of concrete occurrences of x and y.
很容易看出,当两个词 x 和 y 一起出现很多次,但不是单独出现时,PMI(x;y)将具有高值,而如果 x 和 y 完全独立,则它将具有 0 值。
归一化逐点互信息(NPMI)
虽然 PMI 是对 x 和 y 出现的相关性的度量,但我们没有其值的上限[3]。我们需要一个可以在所有二元模型之间进行比较的度量,因此我们可以只选择高于某个阈值的二元模型。我们希望 PMI 度量在完全相关的单词 x 和 y 上具有最大值 1。形式上:
Normalized Pointwise Mutual Information of x and y.
数据驱动的方法
从文本中提取短语的另一种方法是使用下一个公式[4],该公式考虑了单字和双字的计数以及用于防止创建过于罕见的单词的双字的折扣系数。形式上:
Read this article for more details.
提取相似的短语
既然我们有办法从大型无监督语料库中提取有意义的二元语法,我们可以用高于某个阈值的 NPMI 将二元语法替换为一个元语法,例如:“拐点”将被转换为“拐点”。通过将转换后的语料库与二元语法一起使用,并再次运行形成三元语法的过程(使用较低的阈值),可以很容易地创建三元语法。类似地,我们可以用递减的阈值对 n 元文法继续这个过程。
我们的语料库由大约 6000 万个句子组成,总共包含 16 亿个单词。使用数据驱动的方法,我们花了 1 个小时构建二元模型。阈值为 7 且最小术语数为 5 时获得最佳结果。
我们使用评估集来衡量结果,该评估集包含我们想要识别的重要二元模型,如财务术语、人名(主要是 CEO 和 CFO)、城市、国家等。我们使用的度量是一个简单的回忆:从我们提取的二元模型中,评估测试的覆盖率是多少。在这个特定的任务中,我们更关心回忆而不是精度,所以我们允许自己在提取二元模型时使用相对较小的阈值。我们确实考虑到,当降低阈值时,我们的精度可能会变得更差,反过来,我们可能会提取不太有价值的二元模型,但这比在执行查询扩展任务时丢失重要的二元模型要好。
示例代码
以一种记忆高效的方法逐行阅读语料库(我们假设每行包含一个句子):
def get_sentences(input_file_pointer):
while True:
line = input_file_pointer.readline()
if not line:
break
yield line
通过修剪前导空格和尾随空格、小写字母、删除标点符号、删除不必要的字符并将重复的空格减少为一个空格来清理句子(请注意,这并不是真正必要的,因为我们稍后将通过空格字符来标记我们的句子):
import redef clean_sentence(sentence):
sentence = sentence.lower().strip()
sentence = re.sub(r’[^a-z0-9\s]’, '’, sentence)
return re.sub(r’\s{2,}’, ' ', sentence)
用一个简单的空格定界符来标记每一行(有更高级的标记化技术,但是用一个简单的空格来标记给我们很好的结果,并且在实践中效果很好),并删除停用词。去除停用词是任务相关的,在一些 NLP 任务中,保留停用词会产生更好的结果。人们应该评估这两种方法。对于这个任务,我们使用了 Spacy 的停用词集。
from spacy.lang.en.stop_words import STOP_WORDSdef tokenize(sentence):
return [token for token in sentence.split() if token not in STOP_WORDS]
现在,我们已经用一个二维矩阵表示了我们的句子,我们可以构建二元模型了。我们将使用真正推荐用于 NLP 语义任务的 Gensim 库。幸运的是,Genim 有一个短语提取的实现,既有 NPMI,也有上面 Mikolov 等人的数据驱动方法。人们可以很容易地控制超参数,如确定最小术语数、阈值和得分(数据驱动方法的“默认”和 NPMI 的“npmi”)。请注意,这两种方法的值是不同的,需要考虑到这一点。
from gensim.models.phrases import Phrases, Phraserdef build_phrases(sentences):
phrases = Phrases(sentences,
min_count=5,
threshold=7,
progress_per=1000)
return Phraser(phrases)
构建完短语模型后,我们可以轻松地保存它并在以后加载它:
phrases_model.save('phrases_model.txt')phrases_model= Phraser.load('phrases_model.txt')
现在我们有了一个短语模型,我们可以用它来提取给定句子的二元语法:
def sentence_to_bi_grams(phrases_model, sentence):
return ' '.join(phrases_model[sentence])
我们希望基于我们的语料库创建一个新的语料库,将有意义的二元语法连接在一起供以后使用:
def sentences_to_bi_grams(n_grams, input_file_name, output_file_name):
with open(input_file_name, 'r') as input_file_pointer:
with open(output_file_name, 'w+') as out_file:
for sentence in get_sentences(input_file_pointer):
cleaned_sentence = clean_sentence(sentence)
tokenized_sentence = tokenize(cleaned_sentence)
parsed_sentence = sentence_to_bi_grams(n_grams, tokenized_sentence)
out_file.write(parsed_sentence + '\n')
学习相似的短语
在上述短语之后,我们的语料库包含短语,我们可以使用它作为 Word2Vec 训练的输入(可能需要更改超参数),与之前一样。训练短语会将“拐点”视为一个单词,并将学习一个分布式 d 维向量,该向量将接近于“临界点”或“拐点”等术语的向量,这是我们的目标!
在我们的 16 亿单词语料库上,我们花了 1 个小时来构建二元模型,又花了 2 个小时在使用 AWS Sagemaker 服务的具有 16 个 CPU 和 64 个 ram 的机器上训练 Word2Vec(具有批处理 Skip-Gram、300 个维度、10 个时期、k=5 的上下文、5 的负采样、0.01 的学习率和 5 的最小单词计数)。关于如何使用 AWS Sagemaker 服务来训练 Word2Vec 的一个很好的笔记本例子可以在这里找到。
人们也可以使用 Gensim 库来训练 Word2Vec 模型,例如这里的。
例如,当给出术语“拐点”时,我们得到以下相关术语,按照它们来自它们表示的向量和“拐点”向量的余弦相似性分数排序:
"terms": [
{
"term": "inflection",
"score": 0.741
},
{
"term": "tipping_point",
"score": 0.667
},
{
"term": "inflexion_point",
"score": 0.637
},
{
"term": "hit_inflection",
"score": 0.624
},
{
"term": "inflection_points",
"score": 0.606
},
{
"term": "reached_inflection",
"score": 0.583
},
{
"term": "cusp",
"score": 0.567
},
{
"term": "reaching_inflection",
"score": 0.546
},
{
"term": "reached_tipping",
"score": 0.518
},
{
"term": "hitting_inflection",
"score": 0.501
}
]
我们的一些客户希望看到黑色星期五对公司销售的影响,所以当给出术语“黑色星期五”时,我们得到:
"terms": [
{
"term": "cyber_monday",
"score": 0.815
},
{
"term": "thanksgiving_weekend",
"score": 0.679
},
{
"term": "holiday_season",
"score": 0.645
},
{
"term": "thanksgiving_holiday",
"score": 0.643
},
{
"term": "valentine_day",
"score": 0.628
},
{
"term": "mother_day",
"score": 0.628
},
{
"term": "christmas",
"score": 0.627
},
{
"term": "shopping_cyber",
"score": 0.612
},
{
"term": "holiday_shopping",
"score": 0.608
},
{
"term": "holiday",
"score": 0.605
}
]
很酷,不是吗?
结论
在这篇文章中,我们介绍了 NLP 任务中单词表示的不同方法(BOW、TF-IDF 和单词嵌入),学习了如何使用 Word2Vec 从上下文中学习单词表示,了解了如何从给定的语料库中提取有意义的短语(NPMI 和数据驱动方法),以及如何转换给定的语料库,以便使用 Word2Vec 算法为每个提取的术语/单词学习相似的术语/单词。这个过程的结果可以用于下游任务,如信息提取任务中的查询扩展、文档分类、聚类、问答等等。
感谢阅读!
参考
[1] Mikolov,t .,Chen,k .,Corrado,G.S .,& Dean,J. (2013 年)。向量空间中单词表示的有效估计。 CoRR,abs/1301.3781 。
[2]哈里斯,Z. (1954 年)。分配结构。 Word ,10(23):146–162。
[3]布马,G. (2009 年)。搭配抽取中的归一化(逐点)互信息。
[4]t . miko lov,Sutskever,I .,Chen,k .,Corrado,G.S .,& Dean,J. (2013 年)。词和短语的分布式表示及其组合性。辊隙。
[5]戈德堡、赫斯特、刘、张(2017)。自然语言处理的神经网络方法。计算语言学,44 ,193–195。
Word2Vec 遭遇特朗普推文——视觉分析
原文:https://towardsdatascience.com/word2vec-meets-trump-tweets-a-visual-analysis-3c7de6e2ac85?source=collection_archive---------9-----------------------
TL;速度三角形定位法(dead reckoning)
你会发现:
- 基于神经网络的特朗普推特词汇相似度分析
- 很棒的笑话
- 一个互动工具让你自己探索数据
- 一个可能性做同样的分析上自己的脸书聊天
- 谷歌 Word2Vec 的易懂介绍
特朗普发推特?真的吗?
我知道,我知道——“又一个对特朗普推文的分析?”,但也许没那么糟糕?“嘿,也许我是第一个做这种类型分析的人?”
“嗯,是的,但这并不意味着它是数据科学——任何人都可以简单地看一看,然后做出结论。”
“…好吧,那么我正在做的 确切地说是 的事情呢?”
你知道,现在我已经花了至少 5 天半的时间来做这件事(大部分时间都是为了让图表看起来足够好,符合我的完美主义者的口味),我觉得有点愚蠢。我甚至找到了一篇很棒的文章,解释了几乎与我相同的分析。不,说真的,看看这里的——太棒了。
…不管怎样。既然我们已经解决了“这已经被做了 5700 万次,而你的分析是垃圾”的问题,我们可以开始了。
Word2Vec 和集群
我真的很喜欢将聚集的想法——因为相似的东西几乎总是在一起,因此可以将它们分组或聚集在一起。
例如,如果一个女人开着 SUV,有孩子,留着标志性的发型,她很可能属于“我能和经理说话吗”这一类。
Can I speak to the manager?
聚类也是数字类别的完美匹配:年龄、薪水、职位等。利用这一点,公司可以识别出高收入——高支出群体,在每一个 YouTube 视频之后用不间断的广告轰炸他们。
但是文本聚类呢?
对你来说,“回头见”后面可能会跟着“鳄鱼”或“一会儿”后面可能会跟着“鳄鱼”,这似乎是显而易见的,但对计算机来说,这种逻辑是荒谬的:“这是一种杀手动物,再见,你说它们相似是什么意思,哔哔 BOOP”(用机器人的声音朗读)。这就是 Word2Vec 算法大放异彩的地方。
跳过几乎每一个细节,该算法所做的是寻找在相似上下文中使用过的单词,并基于此创建它们的相似度。
如果你让计算机根据四年级英语课上使用的单词做出决定,它可能会认为“再见”和“鳄鱼”几乎是相同的短语,但如果你把它带到一个新闻站,它会把“鳄鱼”和“残忍地谋杀了一个小孩”放在一起。
这就是 Word2Vec 的闪光点——你可以用任何你想要的数据来训练它!你可以在你的脸书聊天记录、特朗普推文甚至产品评论中创建词语相似度云,根据上下文,可能会将“假”和“新闻”放在一起。
特朗普会见 Word2Vec
单词相似度云相当简单——单词越接近,它们就越相似。注意,并不是所有的单词都包括在内。是的,科菲也不见了。
Full word cloud. To represent Word2Vec in 2D, I used t-SNE.
太美了。那它是什么呢?嗯,有几件事。首先,如果你花同样多的时间试图绘制一个符合我所有完美主义者需求的图表,你会发现这里有一个轻微的趋势。
注意,左上方有更多的正(黄色)气泡?没错。让我们仔细看看。
这看起来很像感激的声音——我们到处都有像祝贺、美好、感谢、欢迎这样的词。最左边的单词似乎表示欢迎某人(总理梅拉尼娅)加入团队或只是参加白宫会议,并获得荣誉。
在特朗普的推特世界里,感激的反义词是什么?看一看。
这真的让我大笑——看看特朗普认为负面的东西吧!
如果让你选出唐纳德·特朗普最常用的两个单词,会是什么?
I actually had to zoom REALLY close to prevent words from overlapping (that’s how close they were!). This is a representation of how often fake news has been tweeted by Trump.
第二朵云更有趣。我们这里有三件主要的事情——希拉里、俄罗斯和政治迫害,所有这些都在相似的上下文中被提及。看起来,特朗普咆哮时,他也是以类似的方式做的,只是切换了实体。
让我们仔细看看。
这绝对是 Hillaryous(对不起)——和希拉里最接近、最相似的词是什么?当然是歪的。
在“hillary”的左边,朝着“positive”的那一边是什么? 正义 。在联邦调查局调查希拉里·克林顿的问题上,特朗普似乎一直在要求很多正义——注意“联邦调查局”。它位于“希拉里”云的中央。
但事情变得更有趣了。在“联邦调查局”和“希拉里”的右边,漂浮着“俄罗斯”和“勾结”的云。那是对俄罗斯干涉总统选举的调查!
但是为什么《猎巫》和它如此接近呢?现在,我不是美国人,我不在推特上关注特朗普,也没有花太多时间思考这个问题,但特朗普似乎认为联邦调查局对俄罗斯人的调查与其说是可信的调查,不如说是政治迫害。
谁在这中间?科米。哪个科米?联邦调查局局长科米。
这就是我喜欢这种文本分析方法的原因。一旦你仔细观察云里面的东西,你会发现惊人的关系。
Word2Vec 做出的单词之间关系的复杂程度其实高得不可思议。这不是一个人跟踪特朗普的每一个举动,阅读每一个与特朗普相关的标题——这是一个运行了 30 秒的算法。可能性是如此之大,我完全不知所措,但我会把它留给另一个帖子。
这还不是这一具体分析的全部——例如,有一些群集将诸如【白色】和【房子】**【前进】和【会议】(期待会议)【联合】和【国家】这样的词放在一起。与‘奥巴马医改’相关的一切都与共和党纠缠在一起。【墙】站在【边境】【犯罪】【非法】旁边。
我个人最喜欢的是,,,,,【中国】,,但是下一个最接近的词实际上是,【贸易】,!
但是不要相信我的话,你自己看看吧!(双击缩小)
特朗普的推文到此为止。
但是这个想法总体上怎么样呢?由于欧盟数据保护法的最新变化,你现在可以下载你在脸书发来的每一封邮件。
你可以在我的 GitHub 上使用我的 JupyterNotebook 来生成同样的图形,就像你的脸书一样。它包含了太多的信息——我可以看到“滑稽”(笑的 DD 类型中的字母 D 的数量)和诅咒语/猴子噪音逐渐消失,并转化为用于描述你情绪的单词,因为这些单词在 x 轴上移动。
在“笑话云”的另一边,你可以看到我变得富有哲理,并使用诸如、、、【意识到】、等词语。另一类包含黑色幽默——如果我把它们发布到网上,这些话题会让我丧命。
你还可以发现更多的东西——这绝对值得花时间去做!
我希望你喜欢阅读这篇文章,就像我喜欢创作它一样。
要知道,数据科学将数据转化为知识,我们都知道知识就是 力量 。
Word2Vec(跳格模型):第 1 部分——直觉。
原文:https://towardsdatascience.com/word2vec-skip-gram-model-part-1-intuition-78614e4d6e0b?source=collection_archive---------0-----------------------
这里的大部分内容来自克里斯的博客。我对它进行了压缩,并做了一些小的改动。
鸣谢:克里斯·麦考密克
http://mccormickml . com/2016/04/19/word 2 vec-tutorial-the-skip-gram-model/
http://mccormickml . com/2017/01/11/word 2 vec-tutorial-part-2-negative-sampling/
该算法有两种版本 CBOW 和 Skip-Gram 。给定一组句子(也称为语料库),该模型循环每个句子的单词,并试图使用当前单词来预测其邻居(其上下文),在这种情况下,该方法被称为“Skip-Gram”,或者它使用这些上下文中的每一个来预测当前单词,在这种情况下,该方法被称为“连续单词包”(CBOW)。每个上下文中的字数限制由一个名为“窗口大小的参数决定。
直觉
skip-gram 神经网络模型的最基本形式实际上非常简单。训练一个只有一个隐藏层的简单神经网络来执行某项任务,但是我们实际上不会将该神经网络用于我们训练它的任务!相反,目标实际上只是学习隐藏层的权重——我们将看到这些权重实际上是我们试图学习的“单词向量”。
我们将训练神经网络做以下事情。给定一个句子中间的特定单词(输入单词),查看附近的单词并随机选择一个。网络会告诉我们,我们词汇表中的每个单词成为我们选择的“邻近单词”的概率。
输出概率将与在我们的输入单词附近找到每个词汇单词的可能性有关。例如,如果你给训练好的网络输入单词“苏维埃”,输出概率对于像“联盟”和“俄罗斯”这样的单词比对于像“西瓜”和“袋鼠”这样不相关的单词要高得多。
我们将通过向神经网络输入在我们的训练文档中找到的单词对来训练它做到这一点。下面的例子展示了我们从句子“敏捷的棕色狐狸跳过懒惰的狗”中提取的一些训练样本(单词对)我在这个例子中使用了一个大小为 2 的小窗口。用蓝色突出显示的单词是输入单词。
我们将把像“蚂蚁”这样的输入单词表示为一个热向量。这个向量将有 10,000 个分量(我们词汇表中的每个单词一个分量),我们将在对应于单词“ants”的位置放置一个“1”,在所有其他位置放置 0。
网络的输出是一个单一的向量(也有 10,000 个分量),它包含我们词汇表中的每个单词,随机选择的邻近单词是该词汇表单词的概率。
这是我们神经网络的架构。
隐层神经元上没有激活函数,但输出神经元使用 softmax。
对于我们的例子,我们将说我们正在学习有 300 个特征的词向量。因此,隐藏层将由一个 10,000 行(词汇表中的每个单词一行)和 300 列(每个隐藏神经元一列)的权重矩阵来表示。
300 个特征是谷歌在谷歌新闻数据集上训练的发布模型中使用的(你可以从这里下载)。特性的数量是一个“超级参数”,您只需根据您的应用进行调整(也就是说,尝试不同的值,看看什么能产生最好的结果)。
如果你看看这个权重矩阵的行,这些实际上将是我们的单词向量!
因此,所有这些的最终目标实际上只是学习这个隐藏的层权重矩阵——当我们完成时,输出层将被丢弃!“蚂蚁”的1 x 300
单词向量然后被馈送到输出层。输出层是 softmax 回归分类器。
具体来说,每个输出神经元都有一个权重向量,它与来自隐藏层的单词向量相乘,然后将函数exp(x)
应用于结果。最后,为了使输出总和为 1,我们将这个结果除以来自所有10,000 个输出节点的结果总和。
下面是计算单词“car”的输出神经元的输出的图示。
如果两个不同的单词有非常相似的“上下文”(即它们周围有可能出现什么单词),那么我们的模型需要为这两个单词输出非常相似的结果。并且网络输出这两个单词的相似上下文预测的一种方式是如果单词向量相似。所以,如果两个单词有相似的上下文,那么我们的网络就有动力为这两个单词学习相似的单词向量!哒哒!
而两个词有相似的上下文是什么意思?我认为你可以预期像“智能”和“聪明”这样的同义词会有非常相似的上下文。或者相关的单词,如“引擎”和“传输”,可能也有相似的上下文。
这也可以为你处理词干——网络可能会为单词“ant”和“ants”学习相似的单词向量,因为它们应该有相似的上下文。
我们需要对基本的跳格模型进行一些额外的修改,这些修改对于实际上使训练可行是很重要的。在这么大的神经网络上运行梯度下降会很慢。更糟糕的是,你需要大量的训练数据来调整这么多权重,避免过度拟合。数百万的权重乘以数十亿的训练样本意味着训练这个模型将会是一头野兽。Word2Vec 的作者在他们的第二篇论文中解决了这些问题。
第二篇论文有三个创新点:
- 将常见的单词对或短语视为模型中的单个“单词”。
- 对常用词进行二次抽样以减少训练样本的数量。
- 使用他们称为“负采样”的技术修改优化目标,这导致每个训练样本只更新模型权重的一小部分。
值得注意的是,子采样频繁词和应用负采样不仅减少了训练过程的计算负担,还提高了结果词向量的质量。
子采样:
像“the”这样的常用词有两个“问题”:
- 在看词对的时候(《狐狸》、《the》)并没有告诉我们太多关于“狐狸”的意思。“the”出现在几乎每个单词的上下文中。
- 我们将有更多的样本(“the”,…)比我们需要学习一个好的“the”向量。
Word2Vec 实现了一个“子采样”方案来解决这个问题。对于我们在训练文本中遇到的每个单词,我们都有可能有效地将其从文本中删除。我们截词的概率和词的频率有关。
如果我们的窗口大小为 10,并且我们从文本中删除了“the”的一个特定实例:
- 当我们训练剩下的单词时,“the”将不会出现在它们的任何上下文窗口中。
- 我们将少 10 个训练样本,其中“the”是输入单词。
注意这两种效应是如何帮助解决上述两个问题的。
负采样:
正如我们上面讨论的,我们的单词词汇量的大小意味着我们的 skip-gram 神经网络有大量的权重,所有这些都将由我们数十亿训练样本中的每一个进行轻微更新!
负采样通过使每个训练样本仅修改一小部分权重而不是所有权重来解决这一问题。它是这样工作的。
当在单词对(“fox”、“quick”)上训练网络时,回想一下,网络的“标签”或“正确输出”是一个热向量。即对于“quick”对应的输出神经元输出 1,对于其他几千个输出神经元的所有输出 0。
对于负采样,我们将随机选择少量的“负”词(假设 5 个)来更新权重。(在这种情况下,“否定”单词是我们希望网络输出 0 的单词)。我们还将更新“正面”单词(在我们当前的例子中是单词“quick”)的权重。
这篇论文说,选择 5-20 个单词对于较小的数据集很有效,对于较大的数据集,你可以只选择 2-5 个单词。
回想一下,我们模型的输出层有一个 300 x 10,000 的权重矩阵。因此,我们将只更新正面词(“quick”)的权重,加上我们希望输出 0 的其他 5 个词的权重。总共有 6 个输出神经元和 1800 个权重值。这只是输出层中 3M 重量的 0.06%!
在隐藏层中,只更新输入单词的权重(无论是否使用负采样都是如此)。
使用“一元分布”选择“负样本”(即,我们将训练输出 0 的 5 个输出单词)。
本质上,选择一个词作为负样本的概率与其频率相关,更频繁的词更有可能被选择作为负样本。
鸣谢:克里斯·麦考密克
http://mccormickml . com/2016/04/19/word 2 vec-tutorial-the-skip-gram-model/
http://mccormickml . com/2017/01/11/word 2 vec-tutorial-part-2-negative-sampling/
Word2Vec(跳格模型):第 2 部分—在 TF 中的实现
原文:https://towardsdatascience.com/word2vec-skip-gram-model-part-2-implementation-in-tf-7efdf6f58a27?source=collection_archive---------1-----------------------
Jupyter 笔记本:https://github . com/mchablani/deep-learning/blob/master/embeddings/Skip-Gram _ word 2 vec . ipynb
张量流内置了对 skip-gram word 2 ect 所需的大部分支架的支持,包括嵌入查找和负采样。
tf.nn.embedding_lookup
tf.nn.sampled_softmax_loss
预处理
将输入标记化,并将输入转换为 int 表示。从单词到 int 查找,反之亦然。
二次抽样
经常出现的单词,如“the”、“of”和“for ”,不会为附近的单词提供太多的上下文信息。如果我们丢弃其中一些,我们可以从数据中去除一些噪声,反过来得到更快的训练和更好的表示。这个过程被米科洛夫称为子采样。对于训练集中的每个单词 wi,我们将以如下概率将其丢弃
from collections import Counter
import randomthreshold = 1e-5
word_counts = Counter(int_words)
total_count = len(int_words)
freqs = {word: count/total_count for word, count in word_counts.items()}
p_drop = {word: 1 - np.sqrt(threshold/freqs[word]) for word in word_counts}
train_words = [word for word in int_words if random.random() < (1 - p_drop[word])]
构建图表
inputs = tf.placeholder(tf.int32, [None], name=’inputs’)
labels = tf.placeholder(tf.int32, [None, None], name=’labels’)
注意标签是二维的,如用于负采样的 tf.nn.sampled_softmax_loss 所要求的。
嵌入矩阵的大小为单词数乘以隐藏层中的单元数。因此,如果您有 10,000 个单词和 300 个隐藏单元,矩阵的大小将为 10,000×300。请记住,我们对输入使用了标记化的数据,通常是整数,其中标记的数量就是我们词汇表中的单词数量。
n_vocab = len(int_to_vocab)
n_embedding = 300
embedding = tf.Variable(tf.random_uniform((n_vocab, n_embedding), -1, 1))
embed = tf.nn.embedding_lookup(embedding, inputs)
负采样
我们将更新正确标签的权重,但只有少量不正确的标签。这就是所谓的【负抽样】。Tensorflow 有一个方便的函数可以做到这一点,[tf.nn.sampled_softmax_loss](https://www.tensorflow.org/api_docs/python/tf/nn/sampled_softmax_loss)
。
# Number of negative labels to sample
n_sampled = 100
softmax_w = tf.Variable(tf.truncated_normal((n_vocab, n_embedding))) softmax_b = tf.Variable(tf.zeros(n_vocab), name="softmax_bias")
# Calculate the loss using negative sampling
loss = tf.nn.sampled_softmax_loss(
weights=softmax_w,
biases=softmax_b,
labels=labels,
inputs=embed,
num_sampled=n_sampled,
num_classes=n_vocab)
cost = tf.reduce_mean(loss)
optimizer = tf.train.AdamOptimizer().minimize(cost)
培养
batches = get_batches(train_words, batch_size, window_size)
for x, y in batches:
feed = {inputs: x, labels: np.array(y)[:, None]}
train_loss, _ = sess.run([cost, optimizer], feed_dict=feed)
使用 T-SNE 可视化单词向量
%matplotlib inline
%config InlineBackend.figure_format = 'retina'import matplotlib.pyplot as plt
from sklearn.manifold import TSNEembed_mat = sess.run(embedding)viz_words = 500
tsne = TSNE()
embed_tsne = tsne.fit_transform(embed_mat[:viz_words, :])
fig, ax = plt.subplots(figsize=(14, 14))
for idx in range(viz_words):
plt.scatter(*embed_tsne[idx, :], color='steelblue')
plt.annotate(int_to_vocab[idx], (embed_tsne[idx, 0], embed_tsne[idx, 1]), alpha=0.7)
学分:来自课堂讲稿:https://classroom.udacity.com/nanodegrees/nd101/syllabus
40 行代码的 Wordcloud Web 应用程序
原文:https://towardsdatascience.com/wordcloud-web-app-in-40-lines-of-code-1be8f8fbd745?source=collection_archive---------2-----------------------
这些天来,r 的成长势头迅猛。鉴于其统计学根源,这种受欢迎程度可能看起来有些奇怪。然而,通过哈德利·韦翰和整个 R 工作室团队的惊人工作,这种情况正在改变。这种新发现的能力的一个例子是能够用少得可笑的代码编写清晰的 web 应用程序。在这篇文章中,我将演示如何使用 R!没有 Javascript,HTML 或 CSS 什么的。
Final project
启动和运行
Simple ‘Hello World’ with R + Shiny
通往 Hello World 的道路很简单。你需要安装 r。对于 Mac 用户来说,最简单的方法是自制。如果没有,你总是可以从曲柄处得到它。你只需在你选择的终端上输入 R 就可以得到一个 R 控制台。
接下来,您需要创建一个名为 app 的文件。r 用下面的代码。我们将要做的一切背后的主要驱动力是一个叫做闪亮的 R 包。这个神奇的包到底是什么?
Shiny 是一个开源的 R 包,它为使用 R 构建 web 应用程序提供了一个优雅而强大的 web 框架。Shiny 帮助您将您的分析转化为交互式 web 应用程序,而不需要 HTML、CSS 或 JavaScript 知识。
一旦你做到了。您可以通过调用 R 并键入以下命令来运行该应用程序:
library(shiny)
shiny::runApp()
很简单,对吧?好吧,这只是开始。
- 闪亮的应用程序会像电子表格一样自动“活”起来。当用户修改输入时,输出会立即改变,不需要重新加载浏览器。
- 闪亮的用户界面可以完全使用 R 构建,也可以直接用 HTML、CSS 和 JavaScript 编写,以获得更大的灵活性。
- 可在任何 R 环境下工作(控制台 R、用于 Windows 或 Mac 的 Rgui、ESS、StatET、RStudio 等。)
- 基于 Twitter Bootstrap 的有吸引力的默认 UI 主题。
- 一个高度可定制的滑块部件,内置动画支持。
- 预构建的输出部件,用于显示 R 对象的绘图、表格和打印输出。
- 使用 websockets 包在 web 浏览器和 R 之间进行快速双向通信。
- 使用反应式编程模型,消除混乱的事件处理代码,因此您可以专注于真正重要的代码。
至此,我们的项目已经启动。下一步是添加侧边栏,滑块和设置我们的主面板。
尽管有些语法是新的,但它相当简单。我们用 fluidPage 定义了我们的页面样式,它允许我们利用 Bootstrap 的网格系统。然后,我们建立我们的侧边栏。接下来,我们设置两个幻灯片输入。这将允许用户在我们的 wordcloud 中更改值,这将立即反映在我们的云中。这种对输入及其后续变化的关注是 Shiny 的核心。这一过程的方法论基础是反应性。
在很大程度上,反应超出了本文的范围,但是我将从 RStudio 的优秀人员那里提供一个快速的概述。
闪亮的 web 框架从根本上说是让从 web 页面连接输入值变得容易,让它们在 R 中对你可用,并且让你的 R 代码的结果作为输出值写回到 web 页面。
input values => R code => output values
由于闪亮的 web 应用程序是交互式的,输入值可以随时更改,输出值需要立即更新以反映这些更改。
Shiny 附带了一个反应式编程库,你可以用它来构建你的应用程序逻辑。通过使用这个库,更改输入值自然会导致 R 代码的正确部分被重新执行,这又会导致任何更改的输出被更新。
我们已经完成了这个应用程序的 UI 所需的所有代码。现在,我们将关注服务器端。如果你是 R 和 Tidyverse 的新手,下面的语法看起来完全陌生,但是请耐心听我说。这比看起来容易。
信不信由你,就是这样。如果你想在本地运行这个,你需要声明你正在使用什么库。你可以在这里 找到这个演练 的最终代码。
本演练绝非详尽无遗。Shiny 提供了很多东西,有一个看似无穷无尽的工具箱。如果你愿意,你可以编写自定义的 HTML 和 CSS。此外,像 ShinyJS 这样的包将会给更有经验的开发者一个机会,通过开发 Javascript 让他们的应用大放异彩。
希望这个简单的概述能揭示使用 R 和 Shiny 是多么的简单和有趣。这对于围绕模型或数据的内部工具来说是非常好的。绝对值得一个周末的黑客会议。你可以在 RStudio 上看到一系列例子来获得一些灵感。
如果你正在寻找一个更深入的教程,由迪安·阿塔利撰写的这个是一个很好的起点!
工作+研究生院:数据科学家的生存指南(第一部分)
原文:https://towardsdatascience.com/work-grad-school-a-data-scientists-survival-guide-part-1-127407b1a6f5?source=collection_archive---------17-----------------------
“multicolored rock lot” by Oliver Paaske on Unsplash
前进
所以,你决定要做了。
你将继续全职工作,同时攻读某种研究生学位。看起来很简单——你在工作的时候到处看视频讲座,读一些专题书籍,甚至可能完成整个 Coursera 课程。为什么不更上一层楼,在学习的同时获得一个完整的学位呢?此外,随着最近(著名的)在线教育机会的激增,你甚至不需要在你就读的学校附近的任何地方获得学位。现在,做一份全职工作,读一所高质量的研究生院是一个合法的选择,而就在 10 年前,这个选择还根本不存在。
这些是我 23 岁时的想法。我在辛辛那提做数据分析师,意识到如果我想长期从事这一职业,我需要一个定量硕士学位。这听起来很简单,但问题是这个学位对我来说并不像医学或法律学位那样有用。换句话说,我不在一张纸就能让我做一份与我已经在做的工作完全不同的工作的情况下;可以肯定的是,分析领域重视研究生教育,但它是结合经验来评价的,而不是作为一个独立的实体。因此,如果我最终想管理,或者进入数据科学领域,获得研究生学位是我必须要跨过的一条河。
除此之外,没有真正的“最佳”数据科学学位。计算机科学、统计学和运筹学是显而易见的,但没有一个学科能描绘出全貌。同样,对数据结构的深入了解不会帮助您指定回归模型,知道给定的估计量是无偏的也不会帮助您计算出 400GB 表的有效 I/O。要在数据科学领域取得成功,您需要同时在不同程度上培养所有这些领域的技能。你还需要学习他们如何互动,并在现实世界的商业环境中找到应用——在真空中了解事情并不能证明你的薪水是合理的。经过一番思考,我得出的结论是,对我来说,最佳途径就是边工作边上学,我喜欢把这看作是一种现代学徒计划。
2014 年末,我决定努力争取,并申请了德克萨斯 A & M 的统计硕士项目,该项目不仅广受好评,还提供 100%在线完成的选项。我将能够继续我设计和评估现实世界广告活动的工作,同时获得我认为我需要的学位。很简单,对吧?不对。虽然它给我带来了很多好处,但获得这个学位无疑是我所从事的最具挑战性的努力。四年(!)后来,然而,我在我的最后一个学期,并认为自己是一个工作+学校的老将。回想那次旅程,我意识到有很多事情我希望在开始之前就知道,如果没有其他原因,我会对自己将陷入什么样的境地有更好的了解。这本指南是我希望 4 年前就能看到的简明手册——如果你正在考虑边工作边攻读研究生学位,或者已经在这样做了,这是给你的,希望你会觉得有用。
电平设置
本指南是从行业数据科学家的角度撰写的,但也适用于各种职业。这些年来,我学到了一些东西,我将经历同时工作和学校生活方式的一些现实,以及一些最佳实践。然而,在你开始这段旅程之前,你需要对自己诚实,并确定你是否愿意/能够采取必要的步骤来取得成功。这条路并不适合所有人——句号。如果你能完成它,回报是可观的,但是你将不得不放弃很多来达到目的。下一节将会更详细,但这只是一些很难兼顾工作和学校的事情的例子:
追求几个耗费时间的爱好
照顾特别需要的宠物
保持丰富活跃的社交生活(又名:每周去一次酒吧)
花 90%的空闲时间和你的另一半在一起
拥有一栋房子
抚养孩子
我并不是说这些都是不可能实现的,但是平衡正规教育和你目前的所有责任将会迫使你优先考虑。
现实和最佳实践
在这一节中,我将讲述我所经历的一些最引人注目的现实,以及我发现的解决这些现实的最佳实践。
现实一
你的朋友、家人和同事不会理解你正在经历的事情
我还没有为人父母,但是在我的生活中,我在新父母中注意到的一件事是,在他们有了孩子之后,个人关注点发生了相当大的变化(不是开玩笑)。他们以前的爱好和兴趣被放在一边,他们将大部分时间用于承担和管理新的责任。他们也倾向于花更多的时间和其他父母在一起,主要是因为其他现有的父母是周围唯一真正知道他们的生活方式是什么样的人。他们会告诉我意想不到的医生来访,他们睡了两个小时,或者在一个孩子生病后不得不清洗他们的汽车,虽然我可以试图理解这一切是什么样的,但如果不亲身经历,我不可能真正理解。
在较小的程度上,作为一个打工学生,完全相同的情况会降临到你身上。你的朋友不会理解你为什么没有时间去那个快乐时光。你的亲戚不会理解你为什么来的少了。你的另一半不会理解你为什么不能更快地完成作业。除非这些人经历过和你类似的事情,否则准备好进行“期望管理”,让很多人失望。
最佳实践
在可能的范围内,找到一个社区
在过去的几年里,在从事某种教育的同时找到一个社区几乎从来不是问题,因为你通常会亲自去上课。然而,现在我们有了在线教育,并不能保证你将有机会有机地认识和你处境相同的同龄人。这个社区很重要——当事情在期中考试前变得紧张时,知道你不是唯一一个可能在这种情况下挣扎的人,真的很让人放心。这可能是我能建议的最重要的事情——如果你觉得你在单干,你更有可能放弃你的计划。
你需要积极主动地建立联系——大多数班级都有讨论板,你可以在那里张贴问题或帮助其他学生解决自己的问题。我发现我自己对课堂的喜爱与我参与讨论板的程度直接相关;人们非常感谢其他人花时间解决他们的问题,或者至少尝试解决问题。大多数在线课程还会有一个全球讨论论坛——值得贴一张便条,看看是否有其他人住在你所在的区域,是否会对一学期一次的聚会开放。此外,不要犹豫寻找你项目之外的人——工作的学生并不新鲜,你可能有同事或邻居也在攻读学位。
现实二:
你的工作绩效会变得更高
人们追求同时接受教育和就业的原因之一是他们希望他们的学习能让他们在工作中做得更好。这是我发现绝对是这样的事情,但不是每天都这样。在你完成一项特别困难的任务后的第二天,你可能不会有 100%的动力去完成它。类似地,在期中考试的前一天,你可能不会完全“到场”参加任何会议。还有你的工作时间之外的问题——如果你习惯于每周花几个小时关注与你的工作直接相关的技术话题,那将不得不退居二线,除非它也与你的课程直接相关。
然而,也有一些时候,你在学校所做的与你在工作中所做的完全一致,在这些时候,你将提供巨大的价值。比如,我曾经发现自己在学习正规实验设计的同时,还在设置直复广告。我很有信心,我为那个项目想出的测试设计和测量计划比我以前制作的要好得多,并且立即被我的研究所启用。
最佳实践:
不断验证你在做什么
假设你正在学习的材料与你的工作至少有一些关系,那么验证你在学校所做努力的最好方法就是找到机会直接应用它。对我来说,这意味着通过新的视角回顾我以前做过的项目——也许我以前做过的卡方检验作为逻辑回归会更好。这也意味着鼓励自己根据新发现的知识来看待问题——当你每周花 15-20 个小时研究时间序列数据的分析时,你会惊奇地发现在你的工作中自然会有多少时间序列问题。
其他最佳实践和收尾思路将在 第二部分 中讨论。
处理您的仪表板布局?
原文:https://towardsdatascience.com/working-on-your-dashboard-layout-9b7c38d7b61e?source=collection_archive---------2-----------------------
Photo by Dawid Małecki on Unsplash
以下是让你开始的五个建议
也许创建仪表板的最大障碍是布局。它必须是有用信息和吸引力的正确结合。大多数仪表板都显示在网页上。因此,在创建仪表板时使用网页设计原则是有意义的。
提示 1:你的大脑将物体理解为群体
很多设计师在讨论布局时都会参考格式塔原则。20 世纪 20 年代,德国心理学家描述了人类如何组织视觉信息。这些发现被称为格式塔原理。
这些原则讨论了大脑如何试图理解一组对象——例如页面上的图表。注意下图;你的眼睛受过训练。即使你看到了物体,你的大脑会添加一些额外的信息,你也会看到另一个形状。
当您违反这些原则时,您的用户会感到困惑,不想与您的仪表板交互。设计布局时,考虑用户将如何看到数据对象一起工作。
或许大小和接近度相似的条形图会被视为一个对象,或者被认为是关于同一主题的。
提示 2: F 模式布局支持您的扫描用户
当你看一个网页时,你的眼睛倾向于以一种特定的模式来浏览它。你浏览页面,向下浏览页面,然后在某个时候再次浏览页面。这是一个 F 或 e 的模型。这是一个有趣的科学发现,但这和你的仪表板有什么关系呢?
您可以利用这种模式来提高仪表板的可用性。设计用户期望找到东西的布局。在下面的排列中,控件被放置在页面的顶部,在页面的中央,有更多的控件。是 E 型还是 F 型,对吧?
注意,除了告诉你模式之外,我还使用了单词扫描。当用户第一次访问您的仪表板时,他们很可能不会先阅读所有文本。他们将浏览以了解哪些内容可以搭配在一起,并学习使用仪表板的最快方式。
技巧 3:考虑工具内的交互性
如果数据可视化工具是交互式的(如 SAS Visual Analytics ),或者您打算添加编程来帮助实现交互性,那么请确定如何使用它。用户将如何识别路径或了解更多可用信息。在某些情况下,这是显而易见。页面上可能有下拉列表、按钮或滑块等控件。用户理解这些对象控制其他对象。请仔细考虑这些项目在页面上的位置。
在以下示例中,趋势图表控制其下方的图表。对于趋势图上的每一点,用户都可以点击查看当月的销售额。用户还可以按地区或产品区域进行探索。
想象一下,如果设计中用条形图来控制一切,将会很难使用。很可能如果有人点击了这个栏,它周围的一切都变了,这就没有意义了。
提示 4:我们用传统的方法设计版面——铅笔和纸
你可能有很多布局思路。开始在纸上勾画你的想法。强迫自己想出三种或三种以上的布局。最后,你可能最喜欢你的第一个设计,但是你会从每次迭代中学习。
你很想跳过这一步,但是不要这样做。
这一步迫使你思考测量方法和你想要传达的内容。
这是整理 KPI 和其他指标的时候了。您希望将数据放入逻辑分组和支持这些分组的度量中。
这是应用你的格式塔原则的机会!这也是思考每个指标试图表达什么的时候了。趋势图效果更好还是树形图对用户帮助更大?在纸上尝试一下。
技巧 5:线框帮助你从用户的角度看问题
画完草图后,你可以使用像 MS Visio 这样的工具来绘制线框。线框有助于你的客户(或老板)理解你计划如何展示所有的信息。使用箭头来显示你希望用户如何在各部分之间移动,以及交互的位置。在这个阶段,更容易解决无效的设计,并从最终用户那里获得反馈。
这是一个确定了信息路径的仪表板布局示例。请注意,我的主仪表板会引导用户了解更多信息。对于 KPI 1,重点是产品。高级经理可能只对第 1 页感兴趣,但直线经理可能需要更多信息来了解是什么导致了这种趋势。
该布局帮助用户理解仪表板的显著之处。它通过使用适当的设计技术和深思熟虑的途径来支持数据。
你的外卖
一个功能完善的设计好的仪表盘不是偶然!这是精心规划和遵守适当的网页设计技术的结果。
工作远程备忘单
原文:https://towardsdatascience.com/working-remote-cheat-sheet-868dd536fe4f?source=collection_archive---------18-----------------------
最近有人问我,您如何确保在远程工作时保持高效工作?这个小抄是我想出来的。
Image Credit: “Author’s Photo” — More on attributions.
远程工作是一件喜忧参半的事情。我不是来讨论它的利弊的。我在这里分发一份有用的小抄。
随着时间的推移,我远程工作的使用案例发生了变化和发展。简而言之,我曾以兼职教授、研究员、数据科学家和独立顾问的身份远程工作。在这篇文章的最后,我进一步阐述了我的用例。
关于语义学的一个注释。
有时远程工作被称为“在家工作”或行话“wfh”在我看来,wfh 是一个误称。远程工作、远程工作或外出工作是我的首选。外出工作是我的最爱。外出工作是最简单也是最具包容性的说法。不是每个远程工作的人都在家工作。
这种区别很重要。我观察到一个大型组织的一个分支机构实施了一个“在家工作”的策略。其他分支机构抱怨说“在家工作”的政策并不是人人都能平等享受的。与此同时,同一组织中的另一个分支机构实施了“离开工作”策略。这两项政策实质上是一样的。在高层管理人员的压力下,他们觉得“在家工作”政策并不顺利,“外出工作”政策保留了下来,而“在家工作”政策结束了。
关于职业精神的一个注解。
从许多角度来看,在办公室环境中,在外工作对员工的要求比在同一家公司工作的同一名员工可能需要的更多。我发现外出工作需要更多的专业精神,更多的交流,更多的奉献,更多的动力,更多的技能,更多的更多。
警告。
外出工作并不能保证提高生产率或员工满意度。生产力和员工满意度最深层的核心驱动力不是工作场所。工作场所很重要,但其他因素更重要。生产率和员工满意度最深层的核心驱动因素是专业精神、沟通、奉献、激励或技能。
也就是说,如果没有相应的专业精神、沟通、奉献、动力和技能,从办公室环境转换到远程环境不会提高生产力或工作满意度。
如果你确实在外地工作,以下策略让我能够利用我的专业精神、沟通、奉献、动力和技能。
设定目标。
我经常设定高而远大的目标。高目标让我保持动力。我写下我的目标。我与家人、朋友、主管和其他同事分享我的目标。我定期回顾目标。如果你需要帮助来写你的目标(专业建议:在网上搜索“智能目标”)。
当我足够幸运地赢得了他人的信任,让他们与我分享他们的目标时,我会查看他们做得如何。当别人为我做同样的事情时,我会很感激。
提前计划一周。
在每周的开始。对我来说,一周的开始是星期天。我花时间(有时一个小时或更多)来计划我的一周。计划我的一周包括列清单,回顾我的日历,调整日历,决定我可以把什么东西搬到车上,这样当我需要它的时候它就在那里。我也打包我的运动包,计划我的饮食。
这一评估确保我在两次承诺之间有足够的旅行时间。这个过程有助于我确保自己不会过度投入——我有时间工作。
提前计划有助于我更有策略。例如,我可能会决定周二上午在市中心的共享办公空间工作是有意义的,因为我和邻居有两个会议。
另一个例子可能是,我在星期四有一个会议,就在城市的另一端。在周日看到这一点有助于我决定是否可以将会议转移到一个更方便的地点。或者我能不能把会议推迟一天。
周日每一分钟的计划时间,我都认为我在一周中节省了 5-10 分钟。
共享您的日历。
与您信任的人以及依赖您的人共享您的日历。因为你没有与同事共享的工作空间,他们无法亲自看到你进出办公室。共享您的日历可以建立信任。
共享您的日历也有助于那些依赖您的人在需要时找到您。我让那些依赖或依赖我的人直接编辑我的日历。节省我们双方的时间,不必协调会议时间。
把你的日历当成日记。
在一天结束的时候,或者一周结束的时候,我会调整我的日历,这样它就能准确地反映出我做了什么。如果一个会议被取消或推迟,我会用显示“取消”或“推迟”的注释编辑它的标题这样我就有了我应该如何度过时间的记录。在它旁边,我将添加一个事件,描述我实际上是如何度过时间的。
在你的日历上记日记再次建立信任并促进透明度。当你需要记录你的工作时,《华尔街日报》会帮你的。
保存实验书籍。
我是科学家。实验室书籍是科学家最好的朋友(对许多科学家来说,实验室书籍是可怕的伙伴)。我把实验书变成了我的朋友。实验书实际上就是你用来记笔记的笔记本。
我用纸质实验书。最近,我用速记本。斯特诺的书很小,很容易写。我为每个重大项目都做了速记本。我在每一页的顶部都注明了日期,这样我就可以回头看笔记,并很容易地与我的日志日历相互参照。
做实验记录有助于你记住你做了什么,怎么做的,为什么做。每当我缺少灵感或动力的时候,我都会回头看看我的实验书。毫无疑问,回顾我的实验书是刷新和更新我的任务清单的最好方法之一。
如果我对下一步缺少想法,实验书会拯救我。
灵感来临时抓住它。
如果是凌晨 3 点,工作的灵感来了,我会起床,走到电脑前,或笔记本前,把想法写下来。我在半夜一次写了好几页。我写了几百行代码。相反,我在半夜重构了数百行代码。
灵感是珍贵的,抓住它。同样,如果我下午 1 点下班回来,灵感不在,我会去散步,重温我的笔记本,或者读一本与我当前项目相关的书。换句话说,我不强求。
打造专属工作空间。
这个建议在关于外出工作的文章中很常见。对我来说,我的建议与许多人认为的外出工作的最大好处(你可以在你喜欢的地方工作)背道而驰。我放弃了在我喜欢的任何地方工作的选择,而选择了一个我可以完成大部分工作的专用工作空间。
对我来说,我的专用工作区必须具备的决定性特征(工具)是一个大白板。如果我可以的话,每一面墙都将是一块巨大的白板。
白板是记笔记、画图表、发展想法、列清单等的地方。这对我很有效,因为我是一个视觉学习者。把我的想法写在白板上让我可以看到这些想法。当我能在一个无界、无限制的空间里看到想法时,我能更清晰地思考。
因此,留出一个专用的工作空间(有一两个你最常用的权威工具)是有益的策略,可以改善你的工作体验。对一些人来说,专用工作空间可以是一个背包。
花时间在新的地方工作。
我建议花时间在新的地方工作。对我来说,我知道我需要一个专用的工作空间。然而,我也受益于探索和寻找新的工作场所。有时那会是一家咖啡店。其他时候,这将是一个共同的工作空间。一些联合工作区是免费使用的(某些条件适用)。
保持专用工作区的整洁。
经常清洁专用工作区。确保文件存档(或扫描并保存在云中)。保持该工作区的表面可见。如果有成堆的纸张、书籍或其他物品,把它们收起来。我发现当工作场所整洁有序时,开始工作会更容易。
把自己的手机分享给大家。
正如我让我的日历对我信任的人和依赖我的人开放一样,我几乎和所有人分享我的手机。当我教书的时候,我把它放在我的教学大纲上。几乎没有人再给我打电话了。但是,拥有我的手机号码可以帮助其他人感受到联系。
通过视频向他人展示自己。
随着电话使用的减少,视频聊天服务的可用性和使用激发了远程通信的复兴。我使用平板电脑、旧手机或备用笔记本电脑来保持一条开放的视频线路,这样可信任的同事可以随时拨打。就好像他们可以在我的办公桌前停下来一样。
自动回复器的广泛使用。
我在电子邮件中大量使用自动回复功能。这有助于其他人知道我在哪里,我在做什么。例如,可能一天就要结束了,现在是晚上 7 点左右。我会在邮件里放一封自动回复邮件,解释:
“嗨,谢谢你的邮件。今天晚上 7 点我离开了我的工作场所。我不在的时候会留意邮件的。如果你现在需要我,请打我的手机(608–555–5555)。否则,我会在明天早上 6 点回到办公室后尽快回复。”
休息一下。
为了避免一直工作…总会有工作的。当你的专用工作空间离你只有几步之遥时,你很容易告诉自己“我会再发一封邮件。”或者,“我会让自己在这个清单上再做两件事。”
为了确保休息,我离开家去吃午饭。午餐时使用健身房。下午三点左右绕着街区散散步。
关于我的用例的更多信息。
我一直在努力扮演多种角色。这意味着我有多个用例。
教学是我最常使用的案例之一。对于多个 semseters,我教过大学生。有时候这些课程是基于教室的,其他的是在线的。教书的时候,我在外面工作,而不是在学校提供给我的办公室里工作。虽然我的专用工作空间在家里,但我逃离家的地方通常是图书馆。
我还在一个涉及进行研究和拓展的岗位上工作。我大约一半的工作是处理数据。我工作的另一半是计划和发表演讲或进行培训。对于这个双重/分离用例,我的雇主提供了一间办公室,但是我主要在办公室之外工作(在图书馆、家里、咖啡店、会议酒店等。).
在研究生院,我创建并经营了一家精品咨询公司(现已关闭)。在这些用例中,我使用了上述大部分策略。
这些策略对我很有用,我希望其他人也会觉得有用。
[## 加入我的介绍链接媒体-亚当罗斯纳尔逊
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
adamrossnelson.medium.com](https://adamrossnelson.medium.com/membership)
感谢阅读
把你的想法和主意发给我。你可以写信只是为了说声嗨。如果你真的需要告诉我是怎么错的,我期待着尽快和你聊天。推特:@ adamrossnelsonLinkedIn:亚当·罗斯·尼尔森在推特和脸书:亚当·罗斯·尼尔森在脸书。
为清晰起见,2020 年 11 月进行了适度的编辑更新。
Apache Spark、Python 和 PySpark 入门
原文:https://towardsdatascience.com/working-with-apache-spark-python-and-pyspark-128a82668e67?source=collection_archive---------4-----------------------
Image Source: www.spark.apache.org
本文是 Apache Spark 单节点安装的快速指南,以及如何使用 Spark python 库 PySpark。
1.环境
- Hadoop 版本:3.1.0
- 阿帕奇卡夫卡版本:1.1.1
- 操作系统:Ubuntu 16.04
- Java 版本:Java 8
2.先决条件
Apache Spark 需要 Java。要确保安装了 Java,首先更新操作系统,然后尝试安装它:
sudo apt-get updatesudo apt-get –y upgradesudo add-apt-repository -y ppa:webupd8team/javasudo apt-get install oracle-java8-installer
3.安装 Apache Spark
3.1.下载并安装 Spark
首先,我们需要为 apache Spark 创建一个目录。
sudo mkdir /opt/spark
然后,我们需要下载 apache spark 二进制包。
**wget “**http://www-eu.apache.org/dist/spark/spark-2.3.1/spark-2.3.1-bin-hadoop2.7.tgz**”**
接下来,我们需要将 apache spark 文件解压缩到/opt/spark 目录中
sudo tar -xzvf spark-2.3.1-bin-hadoop2.7.tgz --directory=/opt/spark -- strip 1
3.2.配置 Apache Spark
当 Spark 启动作业时,它会将其 jar 文件传输到 HDFS,这样任何正在工作的机器都可以使用这些文件。这些文件对于较小的作业来说是一笔很大的开销,所以我把它们打包,复制到 HDFS,并告诉 Spark 它不再需要复制它们了。
jar cv0f ~/spark-libs.jar -C /opt/spark/jars/ .hdfs dfs -mkdir /spark-libshdfs dfs -put ~/spark-libs.jar /spark-libs/
复制文件后,我们必须告诉 spark 忽略从 Spark 默认配置文件中复制 jar 文件:
sudo gedit /opt/spark/conf/spark-defaults.conf
添加以下几行:
spark.master spark://localhost:7077spark.yarn.preserve.staging.files truespark.yarn.archive hdfs:///spark-libs/spark-libs.jar
在本文中,我们将配置 Apache Spark 在单个节点上运行,因此它将只是 localhost:
sudo gedit /opt/spark/conf/slaves
确保它只包含值 localhost
在运行服务之前,我们必须打开。使用 gedit 的 bashrc 文件
sudo gedit ~/.bashrc
并添加以下几行
export SPARK_HOME=/opt/sparkexport SPARK_CONF_DIR=/opt/spark/confexport SPARK_MASTER_HOST=localhost
现在,我们必须运行 Apache Spark 服务:
sudo /opt/spark/sbin/start-master.shsudo /opt/spark/sbin/start-slaves.sh
4.安装 Python
4.1.获取最新的 Python 版本
Ubuntu 16.04 预装了 Python 3 和 Python 2。为了确保我们的版本是最新的,我们必须用 apt-get 更新和升级系统(在先决条件一节中提到):
sudo apt-get updatesudo apt-get -y upgrade
我们可以通过键入以下命令来检查系统中安装的 Python 3 的版本:
python3 –V
它必须返回 python 版本(例如:Python 3.5.2)
4.2.安装 Python 工具
要管理 Python 的软件包,我们必须安装 pip 实用程序:
sudo apt-get install -y python3-pip
还需要安装一些软件包和开发工具,以确保我们的编程环境有一个健壮的设置。
sudo apt-get install build-essential libssl-dev libffi-dev python-dev
4.3.营造环境
我们需要首先安装 venv 模块,它允许我们创建虚拟环境:
sudo apt-get install -y python3-venv
接下来,我们必须为我们的环境创建一个目录
mkdir testenv
现在,我们必须转到这个目录并创建环境(所有环境文件都将创建在一个名为 my_env 的目录中):
cd testenvpython3 -m venv my_env
我们完成了检查使用 ls my_env 创建的环境文件
要使用此环境,您需要激活它:
source my_env/bin/activate
5.使用 PySpark
5.1.配置
首先我们需要打开。bashrc 文件
sudo gedit ~/.bashrc
并添加以下几行:
export PYTHONPATH=/usr/lib/python3.5export PYSPARK_SUBMIT_ARGS=” -- master local[*] pyspark-shell”export PYSPARK_PYTHON=/usr/bin/python3.5
5.2.FindSpark 库
如果我们在机器上安装了 Apache Spark,我们就不需要在开发环境中安装 pyspark 库。我们需要安装 findspark 库,它负责定位随 apache Spark 一起安装的 pyspark 库。
pip3 install findspark
在每个 python 脚本文件中,我们必须添加以下行:
import findsparkfindspark.init()
5.3.PySpark 示例
5.3.1.阅读 HDFS 的作品
下面的脚本将读取存储在 hdfs 中的文件
import findsparkfindspark.init()from pyspark.sql import SparkSessionsparkSession = SparkSession.builder.appName(“example-pyspark-hdfs”).getOrCreate()df_load = sparkSession.read.csv(‘hdfs://localhost:9000/myfiles/myfilename’)df_load.show()
5.3.2.阅读阿帕奇·卡夫卡《消费者》
我们首先必须将 spark-streaming-Kafka-0–8-assembly _ 2.11–2 . 3 . 1 . jar 库添加到我们的 Apache spark jars 目录/opt/spark/jars 中。我们可以从 mvn 存储库下载:
-https://mvn repository . com/artifact/org . Apache . spark/spark-streaming-Kafka-0-8-assembly _ 2.11/2 . 3 . 1
以下代码从 Kafka 主题消费者那里读取消息,并逐行打印出来:
import findsparkfindspark.init()from kafka import KafkaConsumerfrom pyspark import SparkContextfrom pyspark.streaming import StreamingContextfrom pyspark.streaming.kafka import KafkaUtilsKAFKA_TOPIC = ‘KafkaTopicName’KAFKA_BROKERS = ‘localhost:9092’ZOOKEEPER = ‘localhost:2181’sc = SparkContext(‘local[*]’,’test’)ssc = StreamingContext(sc, 60)kafkaStream = KafkaUtils.createStream(ssc, ZOOKEEPER, ‘spark-streaming’, {KAFKA_TOPIC:1})lines = kafkaStream.map(lambda x: x[1])lines.pprint()ssc.start()ssc.awaitTermination()
6.文献学
[1] M. Litwintschik,“Hadoop 3 单节点安装指南”,2018 年 3 月 19 日。【在线】。可用:http://tech . marksblogg . com/Hadoop-3-single-node-install-guide . html【2018 年 6 月 1 日访问】。
[2] L. Tagiaferri,“如何在 Ubuntu 16.04 上安装 Python 3 并设置本地编程环境”,2017 年 12 月 20 日。【在线】。可用:https://www . digital ocean . com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-Ubuntu-16-04。【2018 年 08 月 01 日接入】。
[3]《Apache Spark 官方文档》,[在线]。可用:https://spark.apache.org/docs/latest/.【2018 年 8 月 5 日访问】。
[4]《堆栈溢出问答》[在线]。可用:https://stackoverflow.com/.【2018 年 6 月 1 日获取】。
[5] A. GUPTA,“PySpark 中数据帧操作的完整指南”,2016 年 10 月 23 日。【在线】。可用:https://www . analyticsvidhya . com/blog/2016/10/spark-data frame-and-operations/。【2018 年 8 月 14 日进入】。
提高不平衡数据集下机器学习模型性能的三项重要技术
原文:https://towardsdatascience.com/working-with-highly-imbalanced-datasets-in-machine-learning-projects-c70c5f2a7b16?source=collection_archive---------2-----------------------
这个项目是我最近“机器学习工程师”职位面试技能测试的一部分。我必须在 48 小时内完成这个项目,包括用 latex 写一份 10 页的报告。数据集有三个类,并且高度不平衡。这个项目的主要目标是处理数据不平衡的问题。在下面的小节中,我描述了我用来克服数据不平衡问题的三种技术。
首先,让我们开始熟悉数据集:
数据集:训练数据中有三个标签【1,2,3】,使得问题成为多类问题。训练数据集有 17 个特征和 38829 个体数据点。而在测试数据中,有 16 个特征没有标签,有 16641 个数据点。训练数据集非常不平衡。大部分数据属于 1 类(95%),而 2 类和 3 类只有 3.0%和 0.87%的数据。由于数据集没有任何空值,并且已经缩放,所以我没有做任何进一步的处理。由于一些内部原因,我不会分享数据集,但详细的结果和技术。下图显示数据不平衡。
Figure 1: The graph shows the data imbalance in the training dataset. The majority of the data belongs to class-1 (95%), whereas class-2 and class-3 have 3.0% and 0.87% data.
算法:经过初步观察,我决定使用随机森林(RF)算法,因为它优于其他算法,如支持向量机、Xgboost、LightGBM 等。RF 是一种 bagging 类型的集成分类器,它使用许多这样的单个树来进行预测。在这个项目中选择 RF 有几个原因:
- RF 对于过拟合是健壮的(因此解决了单一决策树的最显著的缺点之一)。
- 参数化仍然非常直观和简单。
- 随机森林算法在高度不平衡的数据集中有很多成功的使用案例,就像我们在这个项目中所做的那样。
- 我有以前的算法实现经验。
为了找到最佳参数,我使用 scikit-sklearn 实现的 GridSearchCV 对指定的参数值进行了网格搜索。更多细节可以在 Github 上找到。
为了处理数据不平衡问题,我使用了以下三种技术:
A .使用集成交叉验证(CV): 在这个项目中,我使用交叉验证来证明模型的稳健性。整个数据集被分成五个子集。在每个 CV 中,5 个子集中的 4 个用于训练,剩余的集用于验证模型。在每个 CV 中,模型还预测(概率,而不是类别)测试数据。在交叉验证的最后,我们有五个测试预测概率。最后,我对所有类别的预测概率进行平均。该模型的训练表现稳定,在每份简历上的回忆和 f1 分数几乎保持不变。这项技术帮助我在一次 Kaggle 比赛中很好地预测了测试数据,在那次比赛中,我在 5355 名选手中名列前 25 名,也就是前 1%。以下部分代码片段显示了集成交叉验证的实现:
for j, (train_idx, valid_idx) in enumerate(folds):
X_train = X[train_idx]
Y_train = y[train_idx]
X_valid = X[valid_idx]
Y_valid = y[valid_idx]
clf.fit(X_train, Y_train)
valid_pred = clf.predict(X_valid)
recall = recall_score(Y_valid, valid_pred, average='macro')
f1 = f1_score(Y_valid, valid_pred, average='macro')
recall_scores[i][j] = recall
f1_scores[i][j] = f1
train_pred[valid_idx, i] = valid_pred
test_pred[:, test_col] = clf.predict(T)
test_col += 1
## Probabilities
valid_proba = clf.predict_proba(X_valid)
train_proba[valid_idx, :] = valid_proba
test_proba += clf.predict_proba(T)
test_proba /= self.n_splits
B .设置类权重/重要性:成本敏感学习是使随机森林更适合从非常不平衡的数据中学习的许多其他方法之一。RF 倾向于偏向多数阶级。因此,对少数类错误分类施加成本惩罚可能是有用的。因为这种技术被证明可以提高模型性能,所以我给少数类分配了较高的权重(即较高的误分类成本)。然后将类别权重合并到 RF 算法中。我根据 class-1 中数据集的数量与数据集中类的数量之间的比率来确定类权重。例如,类-1 和类-3 中数据集的数量之比约为 110,类-1 和类-2 的数量之比约为 26。后来,我在反复试验的基础上稍微修改了这个数字,以提高模型的性能。下面的代码片段显示了不同类权重的实现。
from sklearn.ensemble import RandomForestClassifier
class_weight = dict({1:1.9, 2:35, 3:180})rdf = RandomForestClassifier(bootstrap=True, class_weight=class_weight,
criterion='gini',
max_depth=8, max_features='auto', max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=4, min_samples_split=10,
min_weight_fraction_leaf=0.0, n_estimators=300,
oob_score=False,
random_state=random_state,
verbose=0, warm_start=False)
C .过度预测一个标签比预测不足:这个技巧是可选的。自从我被要求实现这个技术以来,我就一直在应用它。在我看来,这种方法对提高少数民族学生的成绩很有影响。简而言之,如果模型误分类为类 3,则该技术对模型的惩罚最大,对类 2 的惩罚稍小,对类 1 的惩罚最小。
为了实现这个方法,我改变了每个类的概率阈值。为此,我以递增的顺序为类别 3、类别 2 和类别 1 设置概率(即,类别 3 = 0.25、类别 2 = 0.35、类别 1 = 0.50),以便该模型被强制过度预测类别。这个算法的详细实现可以在这个项目 Github 页面找到。
最终结果:
以下结果显示了上述三种技术如何帮助提高模型性能。
- 集成交叉验证的结果:
2。集成交叉验证+类别权重的结果:
3。集成交叉验证+类别权重+过度预测标签的结果:
结论
最初,过度预测对我来说似乎很棘手。然而,研究这种方法有助于我找到解决这个问题的方法。由于时间限制,我无法专注于模型的微调和功能工程。该模型还有许多进一步改进的空间。比如删除不必要的特性,通过工程增加一些额外的特性。我也试过 LightGBM 和 XgBoost。但是在这么短的时间内,我发现随机森林比其他算法更好。我们可以尝试一些其他的算法,包括神经网络,来改进这个模型。最后,我想说,从这次数据挑战中,我学会了如何以一种组织良好的方式处理不平衡的数据。
非常感谢您的阅读。完整代码可以在 Github 上找到。如果你有任何问题或者这篇文章需要修改,请告诉我。
想在附近找到对机器学习感兴趣的人吗?
我将通过分享关于 xoolooloo 的有趣信息来结束这篇文章。它是一个基于位置的搜索引擎,利用相似和多重兴趣寻找当地人。例如,如果你读了这篇文章,你肯定对数据科学、图论、机器学习感兴趣。因此,你可以在你的地区找到有这些兴趣的人;去看看 www.xoolooloo.com 的
让我们讨论一下
如果你有任何问题,请随意提问。看到错别字、错误,或者有什么建议,请评论。你可以联系我:
Email: sabbers@gmail.com
LinkedIn: [https://www.linkedin.com/in/sabber-ahamed/](https://www.linkedin.com/in/sabber-ahamed/)
Github: [https://github.com/msahamed](https://github.com/msahamed)
Medium: [https://medium.com/@sabber/](https://medium.com/@sabber/)
在机器学习中处理缺失数据
原文:https://towardsdatascience.com/working-with-missing-data-in-machine-learning-9c0a430df4ce?source=collection_archive---------0-----------------------
缺失值代表了真实世界数据的混乱。发生这种情况的原因可能有很多,从数据输入过程中的人为错误、不正确的传感器读数,到数据处理流程中的软件错误。
正常的反应是沮丧。丢失数据可能是代码中最常见的错误来源,也是大多数异常处理的原因。如果你试图删除它们,你可能会大幅减少可用的数据量——这可能是机器学习中最糟糕的情况。
尽管如此,在缺失的数据点中通常存在隐藏的模式。这些模式可以为你试图解决的问题提供额外的洞察力。
我们可以像对待音乐中的沉默一样对待数据中的缺失值——从表面上看,它们可能被认为是负面的(没有贡献任何信息),但其中蕴含着巨大的潜力。
方法
注意:我们将使用 Python 和一个 人口普查数据集 (为本教程的目的而修改)
您可能会惊讶地发现有多少种处理缺失数据的方法。这证明了这个问题的重要性,也证明了创造性解决问题的巨大潜力。
你应该做的第一件事是数一数你有多少,并试着想象它们的分布。为了使这一步正常工作,您应该手动检查数据(或者至少是数据的一个子集),以尝试确定它们是如何指定的。可能的变体有:' NaN ',' NA ',' None ',' ','?'和其他人。如果你有不同于' NaN '的东西,你应该通过使用 np.nan 来标准化它们。
import missingno as msno
msno.matrix(census_data)
Missing data visualisation. White fields indicate NA’s
import pandas as pd
census_data.isnull().sum()age 325
workclass 2143
fnlwgt 325
education 325
education.num 325
marital.status 325
occupation 2151
relationship 326
race 326
sex 326
capital.gain 326
capital.loss 326
hours.per.week 326
native.country 906
income 326
dtype: int64
让我们从你能做的最简单的事情开始:移除。如前所述,虽然这是一个快速的解决方案,并且在丢失值的比例相对较低(< 10%)的情况下可能有效,但大多数时候它会使您丢失大量数据。想象一下,仅仅因为某个要素中缺少值,您就不得不放弃整个观察值,即使其余的要素已经完全填充且信息丰富!
import numpy as np
census_data = census_data.replace('np.nan', 0)
第二糟糕的方法是用 0(或-1)替换。虽然这将有助于您运行您的模型,但它可能是极其危险的。这样做的原因是,有时这个值可能会产生误导。想象一个出现负值的回归问题(例如预测温度),在这种情况下,这将成为一个实际的数据点。
既然我们已经解决了这些问题,让我们变得更有创造力。我们可以根据父数据类型来划分缺失值的类型:
数值分析
一个标准且通常非常好的方法是用平均值、中间值或众数替换缺失值。对于数值,你应该选择平均值,如果有一些异常值,试试中值(因为它对异常值不太敏感)。
**from** sklearn.preprocessing **import** Imputer
imputer = Imputer(missing_values=np.nan, strategy='median', axis=0)
census_data[['fnlwgt']] = imputer.fit_transform(census_data[['fnlwgt']])
类别分析
分类值可能有点棘手,所以在编辑后,您一定要注意您的模型性能指标(比较前后)。标准做法是用最常用的条目替换丢失的条目:
census_data['marital.status'].value_counts()Married-civ-spouse 14808
Never-married 10590
Divorced 4406
Separated 1017
Widowed 979
Married-spouse-absent 413
Married-AF-spouse 23
Name: marital.status, dtype: int64def replace_most_common(x):
if pd.isnull(x):
return most_common
else:
return xcensus_data = census_data['marital.status'].map(replace_most_common)
结论
最重要的是,您应该知道从缺失数据中获取更多信息的不同方法,更重要的是,开始将它视为可能的洞察力来源,而不是烦恼!
快乐编码:)
奖励—先进的方法和可视化
理论上,您可以通过拟合回归模型来估算缺失值,例如线性回归或 k 最近邻。这一点的实现留给读者作为示例。
A visual example of kNN.
这里有一些可视化,也可以从奇妙的 missingno 包中获得,它可以帮助你以相关矩阵或树状图的形式揭示关系:
Correlation matrix of missing values. Values which are often missing together can help you solve the problem.
Dendrogram of missing values
处理文本数据—从质量到数量
原文:https://towardsdatascience.com/working-with-text-data-from-quality-to-quantity-1e9d8aa773dd?source=collection_archive---------7-----------------------
注意你的语言:有毒评论的挑战
由于互联网上的大量文本数据,文本处理和分析变得越来越普遍。从拼写检查等相对简单的任务到监视网络活动等更加不祥的任务,基本项目是将语言和哲学的特殊性(如意义、内涵和上下文)转换为有意义的数学对象,然后可以输入到 ML 算法中。
让我们揭开这个问题的表面,看看解决这个问题的基本方法。假设我们有一组文档(也称为语料库)要分析。这些文档可以是推文、句子甚至整本书。要将文档转换为向量,一个简单的尝试是对我们的词汇表 V 中的所有单词进行排序,并让文档 d 由向量 v,表示,其中如果 d 包含我们的词汇表中的第 i 到第个单词,则该向量中的第 i 到第个条目为 1,否则为 0。这个过程的一个显而易见的结果是,我们的语料库中的所有文档都由相同大小的向量来表示,即我们的词汇量的大小|V|。这里的缺点是我们已经失去了所有的语言结构,这被恰当地称为单词袋模型。我们所获得的是我们词汇表中每个单词的数据特征。重新获得文档局部结构的一种方法是通过添加 ngrams 来扩大我们的词汇量。这些只是被视为一个单元的 n 个连续单词(将我们的词汇单元称为'记号'而不是单词更合适),这一变化允许我们考虑频繁共现的单词。
一个小小的改进是跟踪单词在文档中出现的次数,因此我们使用单词在文档中的频率,通常称为术语频率(TF ),而不是上面公式中的 1。现在,一个重要的词可能频繁出现,但频繁出现的词不一定重要;像‘the’和‘of’这样的词很少给出关于文档内容的信息。考虑到这一点,我们将使用与语料库中单词的频率成反比的权重,而不是仅使用单词的 TF 值,这通常被称为逆文档频率(IDF ),通常被认为是
TF 和 IDF 具有相反的趋势,如果该单词在文档中频繁出现,则 TF 值大(根据定义),如果该单词在语料库中的文档中频繁出现,则 IDF 权重低。这就是流行的 TF-IDF 方案的提法。
让我们玩玩这个概念,并将其应用于维基百科评论数据,作为 Kaggle 上 有毒评论分类挑战 的一部分。
这里的数据由维基百科的文本评论组成,其中一些评论被贴上了一个或多个标签——“有毒”、“严重 _ 有毒”、“淫秽”、“威胁”、“侮辱”和“身份 _ 仇恨”。这里我们的文档是单独的评论,目的是学习一些模式,并用零个或多个上述标签来标记一个新的评论。让我们使用 python 中的 sklearn 来看看 TF-IDF 的实际功能。
首先,我们导入数据(名为 test 和 train 的两个 CSV 文件)和一些 python 库:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import stringfrom sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer,
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
train = pd.read_csv('..\train.csv').fillna(' ')
test = pd.read_csv('..\test.csv').fillna(' ')train_text = train['comment_text']
test_text = test['comment_text']
文本数据通常需要一些清理,但如果我们希望使用上述方案来识别包含侮辱性和有毒语言的评论,这一点更重要。我们不应该将' F*** '和' F**k '视为不同的词,因为这会混淆我们的 TF 值。尽管有这样的警告,让我们满足于下面的简单函数 str_clean()并清理测试和训练文档集合。
# Replace all elements of punct by white spaces and delete all numbers and a few chosen punctuation import string
from nltk.stem import PorterStemmer
ps = PortStemmer()
def str_clean(text):
punct = '():[]?.,|_^-&><;!"/%'
table = str.maketrans(punct, ' '*len(punct), "0123456789$#'=")
cleaned_comment = []
for word in text.split():
cleaned_comment.extend(word.translate(table).split())
cleaned_comment = [ps.stem(word) for word in
cleaned_comment]
return " ".join(cleaned_comment)
在上面的代码块中,我们用空格替换了一些标点符号,并删除了一些数字和标点符号。最后,我们使用了 nltk 包中的一个特殊的“词干分析器”将一些单词转换成它们的“词根形式”——例如,“哔”、“哔”和“哔”到“哔”。这允许我们忽略单词的某些形式,因为它们本身是不同的单词。
train_text = train_text.map(lambda x: str_clean(x))
test_text = test_text.map(lambda x: str_clean(x))
Scikit-Learn 有一个内置函数 TfidfVectorizer ,它将语料库作为输入,输出文档的 TF-IDF 向量——这正是我们所需要的。我们现在需要做的就是应用 fit_transform 方法来获得所需的矩阵。该函数有多个参数,有助于获得更好的结果;小写和 strip_accents 允许进一步清理原始文本, min_df 和 max_df 允许我们限制哪些单词进入我们的词汇表。控制我们词汇的另一个重要方法是使用 stop_words 参数,该参数允许删除诸如“is”、“at”和“which”之类的单词。
tfidf_vectorizer = TfidfVectorizer(strip_accents='unicode',
analyzer='word', token_pattern=r'\w{1,}', ngram_range=(1, 2),
max_features=10000)train_features = tfidf_vectorizer.fit_transform(train_text)
test_features = tfidf_vectorizer.fit_transform(test_text)
max_features 参数允许将我们的词汇表限制为最频繁出现的特性;它假设最常用的术语是最重要的。我们的另一个选择是使用 sublinear 参数,它返回 1+log(TF ),而不仅仅是 TF。这可以用在这样的情况下,即有理由假设一个比另一个令牌多 n 倍出现的令牌不是重要 n 倍,而是大约重要 log(n)倍。最后,默认情况下应用 IDF 权重。
现在,有了这些特性,我们可以预测测试集中注释的类别标签。这是一个多标签问题,因此标签并不相互排斥。我们将在 sklearn 中使用 logit 来获得循环中每个类的预测。我们将使用三重交叉验证来检查 ROCAUC 分数(本次挑战的评估指标)不会大幅波动。
pred = pd.DataFrame([])
labels = ['toxic', 'severe_toxic', 'obscene', 'threat', 'insult', 'identity_hate']for label in labels:
target = train[label]
classifier = LogisticRegression(solver = 'sag')
cv_scores = cross_val_score(classifier, train_features,
train_target, cv=3, scoring = 'roc_auc')
mean_cv = np.mean(cv_scores) print('CV score for label {} is {}'.format(label,mean_cv))
print('\n') classifier.fit(train_features, train_target)
pred[label]=classifier.predict_proba(test_features)[:, 1]
虽然这是一个非常基本的模型,还有许多参数优化有待执行,但它做得相当好——交叉验证得分约为 0.97。从某种意义上来说,一个评论是否包含侮辱或有毒或可被视为身份仇恨,实际上在很大程度上是由话语本身所捕捉的。我们不需要钻研注释的语法或以更复杂的方式解析它来确定给出哪个标签,所以 TF-IDF 特征提取非常适合这里。
接下来呢?
这里的分析可以从改进的词汇中受益。人们对侮辱和谩骂有着非凡的创造力,我们需要更好的方式来看待同一侮辱或词语的各种形式。也许几个小时的正则表达式工作可以帮助大大提高分数。
并不是所有 IDF 分值大的单词都在区分类别标签。我们可以使用一些特征选择的方法来降低我们正在处理的向量的维数,并使用其他算法来进行预测。在后面的帖子中,我们将考虑一种称为双正态比例(BNS)的特征选择方法,该方法将权重添加到术语频率,类似于 IDF 权重,但考虑了文档的实际类别标签,以确定哪个特征对预测有影响。
其他特征可以附加到 TF-IDF 矩阵之外。粗略地看一下评论,看起来被归类为有毒的评论往往有更多的标点符号。像这样的元特征可以从数据中收集。
在任何情况下,为了保持理智和功能,不要涉入太多的有毒评论!
世界精神卫生日数据可视化:退伍军人与精神疾病
原文:https://towardsdatascience.com/world-mental-health-day-data-visualization-veterans-mental-illness-f519b065ac88?source=collection_archive---------10-----------------------
10 月 10 日是世界精神卫生日,旨在提高人们对精神卫生问题的认识,加大对精神卫生的支持力度,减少社会对精神疾病的歧视。2017 年心理健康日的主题是工作场所的心理健康。
退伍军人面临风险
虽然许多工作场所都充满压力,而且某些类型的工作或老板比其他人更有可能对心理健康造成损害,但很难想象有任何工作环境比军人所经历的工作环境更容易产生压力。虽然退伍军人管理局系统的医院和门诊诊所为许多美国退伍军人提供服务,但据估计,超过 20%的退伍军人寻求退伍军人管理局系统之外的精神健康治疗,在许多情况下,因为他们住的地方离退伍军人管理局下属的治疗中心不在合理的距离内。此外,那些因收入原因而被开除军籍或不符合退伍军人服务资格的退伍军人无法从退伍军人健康服务机构获得帮助。截至 2017 年 7 月 5 日,退伍军人医疗中心将为退伍军人提供长达 90 天的心理健康紧急情况护理。
退伍军人管理局东北项目评估中心发布了 2015 财年的心理健康统计数据。根据这些数据,2015 年有 1,570,907 名退伍军人在寻求退伍军人健康服务时被诊断患有精神疾病。我已经按州绘制了使用退伍军人健康服务的确诊患有精神疾病的退伍军人的总数。
要探索数据集的其他细节,请访问这个由退伍军人事务部维护的闪亮应用或包含原始数据的 GitHub 存储库。
寻求精神疾病的帮助
如果你或你认识的人现在有自杀倾向,你应该立即拨打 1–800–273–8255 的国家预防自杀生命线,拨打 911 或去医院急诊室。
对于任何痛苦情绪的短期帮助,美国的青少年可以通过给家里发短信 741741 给 24 小时危机短信热线发短信
成人或青少年可以拨打 1-800-273-TALK(8255)联系 24 小时危机中心,或者发短信给 MHA,号码是 741741
T4 精神健康网站可以帮助你在当地找到支持。
退伍军人可以拨打退伍军人危机热线 800–273–8255(按 1),或发短信 838255
感谢您的阅读。
我欢迎反馈——您可以“鼓掌”表示赞同,或者如果您有具体的回应或问题,请在此给我发消息。我也有兴趣听听你想在未来的帖子中涉及哪些主题。用于数据操作和数据可视化的代码可以在我的 GitHub 上找到。
阅读更多关于我的作品jenny-listman.netlify.com。欢迎随时通过 Twitter@ jblistman或LinkedIn联系我。
注意事项:
- 在https://www.va.gov/directory/guide/rpt_fac_list.cfm找到退伍军人事务部所在地的州和邮政编码数据
- 退伍军人事务部报告的原始数据从 Mihir Iyer 的 GitHub 储存库https://github.com/mihiriyer/mental下载
- 使用 R 中的工具处理和绘制数据
TensorFlow 中的世界模型—第 1.0 集— OpenAi 健身房赛车
原文:https://towardsdatascience.com/world-models-in-tensorflow-episode-1-2b3c217ebc8f?source=collection_archive---------8-----------------------
Creative Common License
代理人能了解他们自己的梦吗?
论文开头的这一句话立刻引起了我的注意。
如果你还没有读过这篇文章,我肯定会推荐它,因为它令人兴奋,而且对理解本文的内容是必要的。
让我们实施它
每当我偶然发现一些有趣的事情时,我总是试图自己去实现它。
据我所知,我是第二个分享本文实现的人。
大卫·福斯特写了一篇非常好的博文,他在博文中一步步解释了他在 Keras 的实施。
然而,最有趣的部分——机器的梦想😴—缺失。
这一系列文章的目标是更深入地阅读 TensorFlow 中的代码,并在阅读过程中学习(与读者一起)。
我不会重新解释这个想法和方法,因为它们已经在最初的论文和作者写的博客中很好地覆盖了。
[## 世界模特
互动演示:点击屏幕以覆盖代理的决定。我们探索建立生成神经网络模型的…
worldmodels.github.io](https://worldmodels.github.io/)
OpenAi 健身赛车
这个任务的目标是训练一个代理在模拟的轨道上驾驶汽车。代理可以看到一个 96x96 的 RGB 像素网格,以及比赛完成后的最终奖励。
代理可以通过决定转向角度[-1,1]→[左,右],加速和刹车来控制汽车。
代理人如何看待世界🤖
首先要解决的是让代理人有可能以一种有意义的方式看到他们生活的世界。
作者使用变分自动编码器 - VAE -将每一帧的信息压缩成大小为 32 的向量。
(如果你还没看过,可以看看我的另一篇文章用人工神经网络生成数字和声音使用 VAEs。)
Left: What the human sees — Right: What the agent sees (Image created by the author)
获取代码
让我们从克隆我的回购代码开始:
git clone [https://github.com/dariocazzani/World-Models-TensorFlow](https://github.com/dariocazzani/World-Models-TensorFlow)
将所有依赖项(只需按照自述文件和光盘安装到 VAE 文件夹中:
cd [stateless_agent/](https://github.com/dariocazzani/World-Models-TensorFlow/tree/master/stateless_agent)
VAE 的数据
首先要做的是生成数据来训练 VAE,这就是 生成-VAE-data.py 脚本的作用。
在运行它之前,让我们先看看几件事:
如果您有一台带有多个 CPU 的机器,这两行代码将加快整个过程。
这里有一个小技巧来迫使环境将汽车定位在赛道上的任意点:
现在运行:
mkdir -p ../data
python generate-VAE-data.py
所有的数据将被放置在根文件夹下的文件夹 data 中。
自动编码器
作者提供了他们使用的 VAE 的详细描述,因此在 TensorFlow 中对其进行编码非常简单。
该脚本与 VAE 架构的定义一起提供了两个主要功能:
- train_vae() 会加载一个已保存的模型(如果存在)或者从头开始,训练直到损耗低于一个定义的值(我是凭经验挑的)。
- 代理将使用 load_vae() 将每一帧编码成一个嵌入向量。
训练 VAE
要开始训练变分自动编码器,只需运行:
python train_vae.py
并且在另一个终端中
tensorboard --logdir logdir
在我装有 Nvidia Geforce Titan X 的机器上,只需要几分钟就可以完成。
在 tensorboard URL 上打开浏览器,检查自动编码器是否正常工作。
Image created by the author
现在有趣的部分来了:让我们学开车吧!
为了驾驶汽车,代理需要输出 3 个值:
- 转向角
- 加速度值
- 制动值
我假设刹车时加速是没有意义的,所以代理只需输出 2 个参数,这将减少 1/3 的学习参数。
因为动作仅依赖于当前观察,所以参数的数量为:
Embedding_size * 2 + bias = 66
训练使用 CMA-ES 学习 66 个参数。作者说他们使用了 64 种药物,每种药物都在 16 次试验中进行了评估。因为我们还没有解决高级问题(RNN 的状态被输入到控制器中),为了加速训练,我把数字保持得较低。
当我完成完整的解决方案时,这些数字将会改变。
每个代理运行在不同的进程中,他们得到的回报是 12 次尝试的平均值。作者之一大卫·哈在他的博客进化稳定策略中很好地解释了为什么需要多次试验。
最后,运行:
python [train-agents.py](https://github.com/dariocazzani/World-Models-TensorFlow/blob/master/01-VAE/train-agents.py)
Image created by the author
并且等待…
几个小时后…
在我有 16 个 CPU 的机器上,我必须等待几个小时才能得到不错的结果。
差不多 100 代之后,最好的代理平均能拿到~740 的奖励。
Image created by the author
下一步是什么?
特工们的驾驶风格相当古怪。他们对之前发生的事情没有记忆,也没有能力预测采取某种行动后汽车会在哪里。
Image created by the author
在下一篇文章中,我将介绍如何训练 RNN,让它学会每一帧的潜在空间如何随着时间的推移和不同的动作而演变。
敬请关注,请在下面留下评论或提问😊
世界上最小的机器学习项目,将吸引你开始
原文:https://towardsdatascience.com/worlds-tiniest-machine-learning-project-that-will-tempt-you-to-get-started-75a8d8db05d6?source=collection_archive---------16-----------------------
机器学习火热!互联网上有大量关于机器学习的话题和文章。
大多数初学者仍然在机器学习中消耗大量的内容,而不是自己尝试一个小程序。因为大多数教程用所有的统计、数据清理、线性代数、复杂的数学、学习 python 或 r 淹没了初学者,所以初学者更喜欢消费更多的内容,而不是创造一些东西。初学者需要一个微型的“Hello world”项目来理解这些概念。如果你是一个机器学习爱好者,如果你还没有编写你的第一个机器学习程序,这个教程/项目是为你准备的。
机器学习项目涉及的步骤:
以下是创建定义良好的 ML 项目的步骤:
- 理解并定义问题
- 分析和准备数据
- 应用算法并训练模型
- 预测结果
我们的第一个项目:让我们根据数据科学家多年的工作经验来预测他的工资
学习新平台或工具的最佳方式是端到端地从事机器学习项目,并涵盖关键步骤。从加载数据、清洗数据、汇总数据、评估算法到最后做一些预测。
我们将使用一个简单的训练数据集:
根据工作经验的年数,我们将预测工资
our dataset
为什么这是一个适合初学者解决的问题:
- 这是一个简单的单变量问题(单变量线性回归),我们用美元($)来预测工资
- 属性是数字的,所以你必须弄清楚如何加载和处理数据,而且不需要数据清理或转换
- 数据集只有 2 个属性和 10 行,这意味着它很小,很容易放入内存并易于解释。
所以,花点时间去理解问题陈述。完成每一步。
您可以简单地点击命令,将命令复制并粘贴到您的程序中
看哪!要完成这个项目,您需要在系统中安装带有机器学习库的 python。设置机器学习环境需要 30 分钟。跟随此处的指南。
加载薪金数据集
- 启动 Anaconda navigator 并打开终端
- 键入以下命令启动 python 环境
python
- 让我们确保 python 环境已经启动并正在运行。将下面的命令复制粘贴到终端中,检查它是否正常工作
print("Hello World")
- 很好,让我们开始写我们的第一个程序。首先,导入项目所需的所有库是很重要的。因此,将下面的命令复制粘贴到终端中。(您可以一次复制全部内容)
import pandas
import numpy as np
import matplotlib.pyplot as plt from sklearn.metrics
import accuracy_score
- 现在,让我们加载 salary training 数据集,并将其分配给一个名为“data set”的变量
#Load training dataset
url = "[https://raw.githubusercontent.com/callxpert/datasets/master/data-scientist-salaries.cc](https://raw.githubusercontent.com/callxpert/datasets/master/data-scientist-salaries.cc)"
names = ['Years-experience', 'Salary']
dataset = pandas.read_csv(url, names=names)
汇总数据并进行分析
让我们来看看我们的训练数据集:
- 数据集的维度:使用 shape 属性找出我们的数据集有多少行和列
# shape
print(dataset.shape)
结果:(10,2),这意味着我们的数据集有 10 行 2 列
- 要查看数据集的前 10 行
print(dataset.head(10))
结果:
- 找出数据的统计摘要,包括计数、平均值、最小值和最大值以及一些百分点。
print(dataset.describe())
结果:
可视化数据并执行分析
现在,我们已经加载了库,导入了数据集,并进行了一些数据处理。现在是我们查看数据并理解它的时候了。
- 让我们用曲线图来看看数据集。复制粘贴以下命令,在我们的数据集上绘制一个图形
#visualize
dataset.plot()
plt.show()
如图所示,我们有两个参数。年资和薪资。橙色线表示两者之间的相关性
拆分数据
在机器学习中,我们有两种数据集
- 训练数据集—用于训练我们的模型
- 测试数据集—用于测试我们的模型是否做出准确的预测
由于我们的数据集很小(10 条记录),我们将使用 9 条记录来训练模型,1 条记录来评估模型。复制粘贴下面的命令来准备我们的数据集。
X = dataset[['Years-experience']]
y = dataset['Salary']
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=101)
训练模型
现在我们已经分析了数据,并准备好了我们的训练和测试集。我们将使用下面的命令来训练我们的模型。在这个例子中,我们选择线性回归,因为我们试图预测一个连续的数字(薪水)
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train,y_train)
测试模型
我们已经有了训练好的模型,现在我们应该开始用它来预测。让我们使用我们的测试数据集来估计我们的模型的准确性
predictions = model.predict(X_test)
print(accuracy_score(y_test,predictions))
我们得到了 1.0,这是我们模型的 100%准确性。这是理想的准确度分数。在生产系统中,任何超过 90%的都被认为是成功的模型
我们也可以用我们自己的输入来测试我们的模型
让我们试试一个有 6.3 年经验的人能赚多少钱
print(model.predict(6.3))
结果:【163000。].我们的模型估计一个有 6.3 年经验的人需要 16.3 万英镑。
恭喜你完成了你的第一个机器学习项目。现在休息一下,去慢跑,或者欣赏一下你渴望已久的网飞秀
摘要
总之,在本教程中,您逐步了解了如何使用 Python 中的第一个机器学习项目来导入、分析和预测
你的下一步
再次浏览这个教程来修正你的理解。列出你的疑问并在网上搜索。激动吗?需要多运动?尝试另一个机器学习项目:
下一步: 你用 python 进行机器学习的第二个实践项目
最初发表于【copycoding.com】。机器学习社区
与熊猫争论数据
原文:https://towardsdatascience.com/wrangling-data-with-pandas-27ef828aff01?source=collection_archive---------2-----------------------
熊猫以竹子为食,非常擅长长时间睡眠。但是他们也有一个秘密的力量:啃下大数据集。今天,我们将介绍数据争论中最强大和最受欢迎的工具之一,它叫熊猫!
当你想到数据科学时,熊猫可能不是第一个想到的。这些黑白熊通常大部分时间都在吃竹子和睡觉,而不是做数据科学!但是今天,我们将使用熊猫来操作我们的数据集,并为机器学习设置它。我不能在一个视频中对整个图书馆进行公正的评价,但希望这个概述能帮助你开始,我会让你更深入地探索熊猫的迷人世界。
Chomping on datasets! This dataset looks like bamboo, however.
Pandas 是一个开源的 python 库,它提供了易于使用的高性能数据结构和数据分析工具。撇开 Cuddley bears 不谈,这个名字来自术语‘panel data’,指的是统计学和计量经济学中遇到的多维数据集。
要安装 pandas,只需在 python 环境中运行pip install pandas
。然后我们就可以import pandas as pd
了。
熊猫最常见的用途之一是使用pd.read_csv
读取 CSV 文件。往往是利用熊猫的起点。
pd.read_csv
将该数据加载到数据帧中。这可以被认为本质上是一个表格或电子表格。我们可以通过在数据帧上调用head()
来快速浏览一下我们的数据集。
数据帧包含带有命名列的数据行,在 pandas 中称为“系列”。
对我来说,Dataframes 最棒的地方之一是describe()
函数,它显示了关于 Dataframe 的统计表。这对于检查数据集的完整性非常有用,可以查看数据的分布是否合理,以及属性是否符合您的预期。
我有时也会用熊猫来打乱我的数据。这在您想要混洗整个数据集而不仅仅是在提取数据时有一个先行缓冲区的情况下非常有用。例如,如果您的数据根本没有被打乱,而且实际上是排序的,那么您会希望对它进行额外的混合。
然而,对于不适合内存的非常大的数据集,如果没有更复杂的方法,这可能是不切实际的。
列访问
要访问数据集的特定列,请使用括号符号来提取该列,并传递该列的名称。如果您想知道可能的列名是什么,您可以回顾一下.describe()
输出的顶部,或者使用.columns
将数据帧中的所有列作为一个数组来访问。
行访问
访问数据帧的行与访问列略有不同。例如,如果我们想要一个给定数据帧的索引为i
的行,我们可以使用.iloc[i]
。
This is index 5, so it’s the 6th row of data
请记住,Pandas 是基于 0 的索引系统,所以第一行实际上是索引 0。
列和行在一起
有时您可能需要特定的行和列。因为行和列的访问方式不同,所以我们需要结合上述技术来完成这项工作。
你也可以把事情调换一下,使用csv_data.iloc[5][‘sepal_len’]
,但我觉得这样可读性较差。
行和列范围
更有趣的是当你想得到一系列的行和列时。
在列方面,获取多列的方法是传入一个列名数组。
如果需要输入更多的列名,您可以使用csv_data.columns
输出数组并从中选择一系列列名,然后使用它来选择列。
I guess I could have just typed the names of the 2 columns … but you get the idea.
如果我们想要得到一系列的行,我们在跟随.iloc
的括号内使用冒号符号:
包括起始索引,但不包括结束索引。请注意,这会返回行索引 5、6、7、8 和 9,但不会返回行索引 10。
行和列的范围
假设我们两个都想要——列的子集和行的子集。那会是什么样子?我们可以将目前使用的所有技术结合起来,做出一个表达式来完成这项工作。
首先,像前面一样选择列名:
cols_2_4 = csv_data.column[2:4]
然后我们得到列:
df_cols_2_4 = df[cols_2_4]
现在从该数据帧中选择行:
df_cols_2_4.iloc[5:10]
一旦你掌握了窍门,你将开始把这些变量压缩成一个表达式,就像这样:
csv_data[csv_data.columns[2:4]].iloc[5:10]
我鼓励你在这里停下来,看看这个表达式是如何等价于我们刚刚在上面展示的。你回来的时候我还会在这里。
包扎
Pandas 中的链接操作不仅能让你更快地处理数据,而且一旦你掌握了它,它的可读性会更好。
到目前为止,我们已经看到了一些简单的数据帧操作,但是熊猫生态系统还提供了更多的功能,从 PyTables 和 HDF5 格式的高效文件存储,到运行各种统计分析。
走出去,尝试野生大熊猫!
感谢阅读这一集的云人工智能冒险。如果你喜欢这个系列,请为这篇文章鼓掌让我知道。如果你想要更多的机器学习动作,一定要关注媒体上的我或订阅 YouTube 频道以观看未来的剧集。更多剧集即将推出!
带有 map、reduce、filter 和 ES6 的 Javascript 数据结构
原文:https://towardsdatascience.com/write-beautiful-javascript-with-λ-fp-es6-350cd64ab5bf?source=collection_archive---------1-----------------------
如果你是一个 javascript 爱好者,并且每天都在使用它,那么你会爱上它的😃
Javascript 是一种允许以任何风格编写代码的语言,从命令式到声明式。大多数程序员使用命令式,要么是因为他们来自 OOPs 背景,也许他们热爱它,要么是因为他们不熟悉其他风格。在我们深入到函数式编程(FP)的声明式风格之前,让我们通过看一个例子来理解两者之间的区别(如果你已经知道区别,那么你可以跳过几段)
必要的
命令式风格很酷,但是想象一下,如果这里有一个复杂的数学逻辑,那么代码的大小和可读性将会很差。它增加了阅读时的认知负荷,随着时间的推移,在推理和逻辑上更容易动摇。
此外,这段代码片段的主要复杂性源于这样一个事实,即我们不是告诉计算机我们想要它做什么,而是指示它如何做。
宣言的
现在,这看起来非常干净、简短、有表现力、简洁的代码,不容易出错,更容易维护,也更容易调试。我们是在告诉计算机我们想要它做什么,而不是如何去做。
声明式方法在编译器端很容易优化,副作用也较少。
注意:如果你关心上面两个和其他 javascript 函数(map、reduce、filter、find)的性能,那么你应该在这里阅读获取小数据集,可以在这里查看获取大数据集(100–1000000)
让我们从 FP 最常用的 Javascript 函数— .map()
开始真正的操作。
地图
// definition
collection.map((currentValue, index) => {
// Return element for newArray
});
// example
const arr = [1,2,3,4,5];
const newArray = arr.map(i => i*10);
// return a new array with all value as multiple of 10;
map 作用于一个数组并返回一个数组。上面的代码片段作用于一个集合,即一个数组,接受一个带有当前迭代值的回调,索引作为参数,并返回一个新的数组。
注意:Map 非常适合改变/转换整个数组,而不是在某些情况下中断流程,Map suck 的性能明智,请查看此处的但易于用于小数据集。
减少
// definition
collection.reduce((accumulator, item, index) => {
// logic to perform to get accumulator as a return value
}, initialValue for accumulator);// example
const arr = [1,2,3,4,5];
const total = arr.reduce((acc, item) => acc+= item, 0);
// return a total as 15
Reduce 在一个数组上工作,但是可以返回任何你想让它返回的东西。顾名思义,它可以简化为任何形式,可以表现为map
、find
、filter
或任何其他 JavaScript 数组函数。上面的代码片段作用于一个数组,并简化为计算数组中项目的总值。
解释上面的例子,在第一次运行 reduces 时,acc
被赋值为 0,然后acc+= item
即acc = acc+item
将计算出为 1 的0+1
。这个 1 将是下一次迭代的acc
值,这将一直持续到我们完成所有的数组项。
发现
// definition
collection.find((item) => {
// return first element that satisfy the condition
});// example
const arr = [1,2,8,4,5];
const value = arr.find(i => i%4 == 0);
// return the first value i.e 8
Find 作用于数组,返回函数中满足条件的第一个元素。
注意:容易,简单但在大数据集上效率不高,为什么?看这里这里
过滤器
// definition
collection.filter((currentValue, index) => {
// logic to filter array on
});
// example
const arr = [1,2,3,4,5];
const newArray = arr.filter(i => i%2 == 0);
// return a new array with value [2, 4]
过滤器作用于一个数组,返回一个已过滤项目的数组。也就是说,它将删除返回 false 值的项目,只返回从函数返回的 true 值数组。
让我们用它们来做一些真实世界的场景+一些 ES6。(让我们在下面的对象键上尝试一些 ARMD)
想知道什么是 ARMD 它的添加,阅读,修改,删除,它的酷硬币你自己的行话😄
我们将使用users
它作为一个数组来进一步举例。
1。一个RMD——给 **users**
增加一个新元素
const newUser = {
id: 4,
name: "Denomer Crazy",
username: "crazy.1",
email: "[deno@crazy.com](mailto:deno@crazy.com)",
phone: "",
website: "crazy.app",
password: "crazed_checker"
};const newData = [...users, newUser]; // add element at last
or
const newData = [newUser, ...users]; // add element at first
or
const newData = users.concat(newUser) // the old way
ES6 spread 运算符的使用使得向数组添加元素变得非常容易。我们可以使用 spread 操作符连接两个不同的数组,修改对象的形状,或者添加动态键值对,等等。
const hobbies = ['chess', 'pool'];
const newUsers = users.**map**(u => ({...u, hobbies}))
// this will add hobbies to users array and return newUsers array
2。ARMD——将 **users**
的电子邮件地址、电话号码和网址放入新数组
const contactInfo = users.**map**(({email, website, phone}) => ({email, website, phone}));
使用 ES6 析构对象键和map
来获取用户的联系信息数组。
3.AR M D —查找并替换对象的键值
const newUsers = users.**map**(u => u.id == 2? ({...u, name: 'te'}): u);
// this will return newUsers with all user having name 'te'
4.手臂D—从对象中删除一些关键点
注意:我们实际上不会删除键而是返回一个新的对象,如果你想删除键使用 delete 操作符,这里我们考虑的是对象的不变性。
删除键有很多种方法,但我们将着眼于最简单的,单行的。让我们试着从用户中删除网站。
const newUsers = users.**map**({id, email, name, username, phone, password} => ({id, email, username, email, phone, password}));
// will return an array with all keys other than website
上面的代码似乎很难对大对象进行编码。
const newUsers = users.**map**(u => Object.keys(u).**reduce**((newObj, key) => key != 'website' ? { ...newObj, [key]: u[key]} : newObj, {}));
我们对用户进行映射,然后对每个用户进行归约并形成一个新对象(newObj
),然后检查网站关键字,如果是网站,我们返回之前形成的newObj
,如果不是,我们进行扩展操作,并将所需的关键字添加到obj
,最后返回newObj
。
如果您想加入我的电子邮件列表,请考虑在此输入您的电子邮件地址****关注我在medium上阅读更多关于 javascript 的文章,并在github上查看我的疯狂代码。如果有什么不清楚或者你想指出什么,请在下面评论。
你可能也会喜欢我的其他文章
- Javascript 执行上下文和提升
- Javascript —生成器-产出/下一个&异步-等待🤔
- 理解 Javascript 'this '关键字(上下文)。
- Javascript- Currying VS 部分应用
- Javascript ES6 —可迭代程序和迭代器
- Javascript 性能测试—针对 vs 针对每个 vs (map,reduce,filter,find)。
- Javascript —代理, Javascript —作用域
如果这篇文章有帮助,请随意分享并帮助他人找到它!
谢谢!
编写代码:
原文:https://towardsdatascience.com/write-the-code-f6d58c728df0?source=collection_archive---------1-----------------------
Skyscanner 推荐目的地背后的架构
安德烈·巴博萨
在 Skyscanner,我们处理大量数据。一部分来自我们的合作伙伴的机票、酒店或租车费用,一部分来自我们的用户。传统上,我们的产品专注于使用我们从合作伙伴那里收集的数据来为我们的旅行者产品提供支持,我们使用来自用户的匿名行为数据来验证我们的假设并做出商业决策。
我们现在开始构建新一代产品,这些产品不仅基于我们合作伙伴的数据,还基于匿名化的用户行为数据,以提供更好、更个性化的体验。这些新产品带来了新的挑战,我们正在用新的方法和技术应对这些挑战。 你可以通过订阅我们的 CodeVoyagers 简讯 在这里看到更多我们的报道。
最近,我们在移动应用程序的“探索”屏幕上添加了推荐目的地。
Skyscanner’s Recommended Destinations functionality pictured above
这意味着我们的用户不仅可以获得最优惠的价格,还可以利用我们的集体知识为他们的旅行寻找灵感。我们每天都会计算这些建议,并根据用户位置对其进行个性化设置。
历史上,这个屏幕上的发现提要是由我们的“无处不在”搜索提供的,允许用户探索市场上最好的交易。对于推荐的 feed,我们采取了一种稍微不同的方法,将价格放在一边,专注于用户的实际去向。到目前为止,自发布以来,我们已经看到我们的转化率增加了 5%以上。
这篇文章将概述我们为提供目的地推荐而构建的技术架构。
要求
让我们先来看看支持这些建议的平台要求。从高层次的角度来看,有三点是问题的核心。我们需要:
- 存储大量历史数据,可用于训练和测试我们的模型;
- 处理大量数据;
- 以最小的延迟向用户提供结果建议。
但是,当我们开始深入挖掘时,我们需要关心的事情更多了:
- 快速实验——我们依靠用户反馈来验证我们的假设,因此我们需要能够轻松地即插即用新算法,并从管道的另一端获得结果;
- 最低运营成本—我们专注于产品,因此我们负担不起花费太多时间来运行手动工作或维护基础架构。
体系结构
考虑到这些需求,我们设计了一个两层架构,如下图所示。
Two-tiered architecture behind Skyscanner’s Recommended Destinations
在最底部,我们有“日志数据存储”,它存储任何 Skyscanner 团队通过我们的数据平台记录的每个用户事件。我们的批处理层离线运行,并通过消费数据和运行一系列算法来利用这个数据存储。完成后,它会向实时数据存储提供新的推荐。这个数据存储是一个低延迟 web API 的基础,它为我们的用户提供计算数据。
在批处理和实时之间进行明确分离的主要优势之一是,它为试验新算法和数据集提供了很大的空间。只要结果符合预定义的模式,我们知道它们可以由 API 提供服务。
因为我们希望保持较低的运营成本,所以该架构构建为在 AWS 云上运行。日志数据存储基于 S3,由我们的数据管理团队维护。
深入探讨批处理
The batch processing layer is where we do all the data transformations that generate the recommendations that we serve through the live service.
批处理层是我们进行所有数据转换的地方,这些数据转换生成我们通过实时服务提供的建议。
我们使用 AWS 数据管道来协调这项工作。DataPipeline 非常适合我们的用例,有助于为我们的批处理作业带来可靠性。
附加到我们的数据管道,我们有一个时间表,我们希望我们的批处理作业运行。这并不比普通的 cron 工作更花哨。但是将它与整个系统集成并完全由 AWS 管理是非常方便的。
我们还附加了一系列先决条件。这些有助于使管道更加可靠。我们使用这个特性来确保在开始这个过程之前,我们已经得到了我们需要的所有数据。当一些输入是不同批处理作业的输出时,这尤其重要。也可以将前提条件配置为等待一段时间,因此即使在计划的时间没有满足某个条件,也不一定意味着作业会失败,它可能只是稍微晚一点执行。这还意味着,如果先决条件从未得到满足,作业将在配置任何硬件之前失败,因此我们不会产生任何不必要的成本。
当所有先决条件通过时,DataPipeline 将提供一个 EMR 集群。EMR 是 AWS 托管的 Hadoop YARN 版本,适合您选择的分布式数据处理系统。我们选择了星火。我们选择 Spark 有两个主要原因:它非常快,很大程度上是因为它的内存缓存,而且它对开发人员非常友好。我们特别喜欢 Spark SQL 和 DataFrame 抽象。此外,PySpark 是我们的一大卖点。
我们编写的大部分代码都是作为 Spark 作业运行的。即使细节可能变得有点复杂,从高层次的角度来看,代码如下图所示。
Read Clean Rank Write
现场服务的深度探讨
我们已经看了我们如何产生推荐;现在让我们来看看我们是如何为他们服务的。你可能已经猜到了,这一层非常薄,我们尽最大努力让它尽可能的轻和简单。
对于我们的实时数据存储,我们决定使用 Postgres 。我们选择它是因为:
- 它在 RDS 中可用,AWS 的托管关系数据库具有开箱即用的多区域复制,这意味着我们的维护工作最少
- 它具有非常低的延迟(我们一贯测量每个查询低于 5 毫秒)
- 很容易针对读取密集型工作负载进行扩展
- 随着产品的成熟,修改模式和查询相对容易
在数据存储的前面有一个服务 REST API 的 web 服务。在 Skyscanner,我们相信微服务,最近开始向前端的后端发展。这意味着我们的移动客户端不需要直接查询这个 API,他们通过一个 BFF 服务来完成,这个 BFF 服务聚合了他们渲染最终 UI 所需的所有数据。这个特殊的架构决策使得我们在这一层的工作变得更加容易。这意味着我们可以提供一个非常简单的 API,供另一个内部服务使用。这样,我们最大化了可重用性,并使我们能够在不改变合同的情况下试验许多不同的 UI。
结论
我们已经在生产中运行了一段时间。到目前为止,它基本上是无痛的,但也不是没有学习和迭代的公平份额。在批处理层编写新算法并让它们立即投入使用的灵活性已经得到了回报,我们正在不断迭代。另一方面,维护 DataPipeline 所需的维护工作可能被低估了一点,因为我们最终花费了相当多的时间来处理服务中的许多警告。
我们预计未来面临的挑战之一是扩大批处理层的输出规模。输出的大小与我们使用的个性化因子成比例。例如,如果我们开始计算为每个 Skyscanner 用户单独定制的推荐,输出的大小将乘以我们用户群的大小。我们当前替换实时数据存储上的数据集的策略可能无法在这种规模下保持,在某个时候,我们将需要重新考虑该架构决策。
还有实时模型的问题。目前,一切都是批量完成的,但可能有产品需要更新鲜的结果。在 Skyscanner,我们已经使用 Kafka 进行流式数据处理,使用 Samza 进行一些实时处理。所以基础设施的这一面不会是最难的部分。但是,我们可能需要重新考虑我们为实时数据存储选择的 Postgres,并可能转向更容易在写入繁重的工作负载上扩展的东西。
与我们合作
我们在 Skyscanner 以不同的方式做事,我们正在全球办事处寻找更多的工程团队成员。看看我们的 Skyscanner 职位寻找更多空缺。
关于作者
大家好,我是 André,是 Skyscanner 的一名软件工程师。我是忠诚的常客部落中的一员,我们致力于改善那些知道乘务员名字的旅客的体验。我热衷于提供产品,为人们的生活增加价值,并将其发展到世界规模。
Andre Barbosa
我们的常见问题
原文:https://towardsdatascience.com/writers-faq-462571b65b35?source=collection_archive---------0-----------------------
2023 年 3 月更新
Photo by Lea L on Unsplash
读者
- 阅读器使用条款和条件
- 如何充分利用数据科学?
- 我如何退订你的来信?
- 我需要付费阅读你的出版物吗?
作家
写作
- 你只用英文出版吗?
- 我应该在我的个人资料中使用我的真实姓名吗?
- 我应该写些什么话题?
- 如何提高写作能力?
- 我可以写一篇关于我的书、活动、播客、会议等的帖子吗??
- 我可以写我公司的产品吗?
- 我被要求加入一些关于我的主题/数据集的潜在风险或道德问题的句子。你还能指望什么
提交和发布
- 作者使用条款和条件
- 隐私政策
- 我应该把我的新文章作为草稿还是作为已发表的文章提交?
- 当我向 TDS 提交文章时会发生什么?
- 我的帖子发布后会出现在哪里?
- 我可以发送我已经在 Medium 上发表的帖子吗? ️
- 我可以复制帖子吗?
- 我的帖子被拒绝了,你能告诉我为什么吗?
数据来源
- 如何确定数据集许可是否合适?
- 我可以使用上传到存储库的数据集吗?
- 通过 API 获取的数据可以吗?
- 如果没有版权声明或许可证怎么办?
- 请求数据集权限的邮件包括什么?
广告和促销
- 我可以付费出版吗?
- 您允许哪种广告或赞助内容?
- 公司可以在 TDS 发布吗?
其他人
- 我能把帖子翻译成另一种语言吗?
- 我可以在我的 Linkedin 个人资料中提到数据科学吗?
- 如何联系您?
读者
读者使用条款和条件
[## 读者使用条款和条件
阅读我们的媒体出版物时你应该知道什么
towardsdatascience.com](/readers-terms-b5d780a700a4)
我如何退订你的信?
- 请访问我们出版物的主页。
- 单击出版物页眉上的下列按钮。
- 取消选中收件箱接收信件框。
您也可以通过点击您从 TDS 收到的信件底部的取消订阅按钮来取消订阅,或者通过用户图标菜单从您的出版物页面取消订阅。
我需要付费阅读你的出版物吗?
不,我们会一直提供免费文章给对数据科学感兴趣的人阅读。然而,由于我们是媒体生态系统的一部分,我们的作者可以决定只向成员锁定他们的帖子。请点击此处的了解更多信息。
作家
你只用英语出版吗?
是的。
我应该在我的媒体简介上使用我的真实姓名吗?
是的,请附上你的真实姓名、照片、简历。我们不会发表匿名人士的帖子。如果你想让我们和你的读者信任你,你必须公开你是谁。
我应该写些什么话题?
TDS 的文章涵盖了广泛而多样的领域——从针对数据专业人员的职业建议到数据驱动的方法气候变化。您可以在我们的标签页面上探索一些我们最受欢迎的话题。
作者从许多不同的角度探讨这些(和其他)主题。有的帮助新手入门,创建动手教程,或者分享自己最新的小技巧和窍门;其他深入复杂问题或者写关于前沿研究。
如果你不确定写什么,选择离家近的。向我们介绍一下你最近的工作项目。分享您在学习过程中获得的一些见解,或者基于您数据科学职业生涯的高潮和低谷提出的建议。
好的想法往往能在你读了能引起你共鸣的东西后浮出水面。要获得有益的灵感,请浏览我们的编辑精选的关于 TDS 的一些精心制作的文章,或者前往我们的作者聚焦,在那里我们采访了杰出的 TDS 贡献者,了解他们的工作和写作。
另一种开始头脑风暴的方法是以更具体的方式考虑你的听众。通过查看以下链接,您可以更好地了解数据科学家的热门话题:
- 我们的档案列出了 TDS 上阅读量最大的文章。
- 中型标签页可以按趋势帖子排序。
- 在 GitHub 的趋势页面上,你可以指定编程语言和日期(例如:2022 年 1 月以来 Python 上的趋势帖子),或者直接进入他们的数据科学专题页面。您可以使用您的发现来撰写令人兴奋的新 Python 库。
- 另一个强大的工具:谷歌趋势!
- 你知道 Twitter 有自己的数据科学主题页面吗?它能让你深入了解正在进行的和新出现的对话。
- 如果你想围绕一个常见问题的答案写一篇文章,试试 Quora。
无论你是一个经常投稿的人还是一个有抱负的 TDS 作者,我们都迫不及待地想看你的下一篇文章!如果你以前没有和我们一起发表过,我们会特别高兴收到你的来信。
我该如何提高我的写作技巧?
互联网上有很多帮助提高写作的资源。然而,我们发现许多作者缺乏一些基本技能,这使他们无法正确地表达他们的信息。以下是我们选择的写作资源:
- 如何成为一名更好的作家:来自哈佛大学史蒂芬·平克的 6 条建议
- 史蒂芬·平克的风格感
- 为学术期刊写作的 10 个技巧。卫报
- 如何写一篇博客文章(真正被阅读)
- 来自成功作家的 6 条最佳建议
在写文章之前,你需要非常清楚你想达到什么目的。一旦你对你的文章有了想法,你应该试着回答这些问题:
- 你文章的目标或目的是什么?
- 你的文章试图回答什么关键问题?
- 内容是否回答了你文章的主要问题?
- 你的文章开始有力,结束有力吗?(你是否创造了一个谜/问题,然后解决了它?)
- 每一个概念都暴露了它的本质,以有序的顺序叙述并且用类比来说明吗?
我可以写一篇关于我的书、事件、播客、会议等的帖子吗??
看情况!我们通常不发布活动或书籍公告,并避免主要作为宣传您最新播客剧集、YouTube 视频或其他平台上的其他媒体的文章。例如,一篇只有简短介绍和视频嵌入或链接到另一个网站的帖子不适合 TDS。
如果你的文章具有这些元素中的一个,如果它满足几个条件,我们仍然会考虑发表它:
- 它为读者提供了足够的价值——例如,作为新书发布会一部分的独立书籍摘录,或者嵌入相关数据科学或 ML 主题的深思熟虑的讨论中的播客片段。
- 它避免了过度的宣传语言和框架(例如,多个链接和 CTA、滔滔不绝的最高级等等)。
提交和发布
作者使用条款和条件
[## 作者使用条款和条件
如果您有任何问题,可以在这里联系我们。你也可以在这里找到我们以前的版本:
towardsdatascience.com](/author-terms-and-conditions-of-use-b9b3935ff999)
隐私策略
[## 隐私策略
我们收集、存储和使用个人信息的方式为我们提供了
towardsdatascience.com](/privacy-policy-b9f519aae672)
我应该把我的新文章作为草稿还是作为已发表的文章提交?
我们很高兴你问了!我们强烈建议您以草稿形式向 TDS 提交您的新文章,而不是作为已发布的帖子。为什么?TDS 主页和 Medium 的后续订阅源都是按首次发布日期的倒序排列的。这意味着最近发表的文章显示在顶部附近,因此我们收到的任何草稿文章在我们将其添加到出版物时都会有更大的影响力和可见性。
相比之下,你已经自己发表的帖子——甚至就在 TDS 上出现的几天前——将很容易在我们每天发布的所有新帖子中消失。简而言之:分享草稿可以增加你文章的潜在读者。
提交草稿也有助于我们的团队在发布您的文章之前分享反馈和改进建议,这意味着没有发布后的编辑或更正。它让我们能够与您合作,为您的观众留下尽可能好的第一印象。
如果你已经发表了你的文章,但仍然希望与 TDS 分享,这很好——我们总是很高兴考虑你的工作。不过,对于未来的文章,给我们发一份草稿是可行的。
当我向 TDS 提交文章时会发生什么?
非常感谢您抽出时间向我们的团队提交您的文章!我们会尽快审查。
如果我们认为你的文章很好,可以发表了,这就是你将你的文章添加到我们出版物的方式。如果在页面顶部的下拉菜单中点击“添加到出版物”后显示“走向数据科学”,这意味着我们已经将您添加为作者,并等待您提交您的文章。一旦你提交了你的文章,在做出最终决定之前,它将会被编辑审阅。
如果我们认为你的文章很有趣,但需要改进,我们团队的人会直接在你提交的中等文章上给你反馈。
请注意我们仅回复使用我们的表格或通过电子邮件正确提交的文章,这些文章完全遵循此处 列出的 说明。我们不会对已经在我们的常见问题解答或 Contribute 页面上回答的推介或问题做出回应。我们也会忽略不符合我们规则的文章。
如果您在接下来的五个工作日内没有收到我们的回复,请仔细检查您提交给我们团队的文章。看看你现在是否可以直接提交给 TDS,并从我们这里寻找你可能已经错过的任何私人笔记。您还应该确保检查您的垃圾邮件文件夹。
如果你联系不到我们,你最好把你的文章提交给另一家出版社。虽然我们很想这样做,但我们无法为每个人提供定制的反馈,因为我们只是收到了太多的提交。你可以在这里进一步了解我们的决定,并在一个月后提交另一篇文章。
我的帖子发布后会出现在哪里?
如果你的文章是最近发表的,它会出现在我们主页的“最新”下面。根据您的标签,您的帖子也会出现在我们的不同页面上。
在提交你的帖子之前,确保你已经阅读了 Medium 的策展指南。即使是我们最好的作者也往往会犯一些基本的错误,使得他们的文章没有资格在 Medium 的主题(数据科学、机器学习、人工智能……)中发布,也没有资格在数据科学专题中发表。
如果您希望我们的团队在 Twitter 上提及您,请确保您的媒体个人资料包含您的 Twitter 帐户。您的帖子可能需要几天时间才能在我们的社交媒体上出现。
最后,您的帖子将在我们的出版物中被搜索到,出现在我们的档案中,并可以在您的同行撰写的其他文章的底部推荐给我们的读者。
我可以发送我已经在 Medium 上发表的帖子吗?
是的,只要你的文章与我们的读者相关,我们有兴趣将其添加到 TDS。请不要在媒体上复制你的文章!他们不允许在自己的平台上发布重复内容。
我能复制一个帖子吗?
允许交叉发布你在别处(非媒体上)发布的内容,前提是它符合媒体指南,并且你的帖子尚未在媒体上发布。
我的帖子被拒绝了,你能告诉我为什么吗?
虽然我们希望能够对我们收到的所有令人难以置信的提交内容留下反馈,但我们是一个小团队,我们无法对我们评论的所有文章提出建议。然而,我们拒绝一个新职位有一些常见的原因。
我们是一家媒体出版物,我们对发表的每篇文章都使用 策展指南 。这意味着我们寻找具有高质量写作和内容的文章,为读者提供可靠价值的文章,以及没有错别字和语法错误的文章。这也意味着我们拒绝包含取消资格元素的文章,如点击诱饵、赞助内容、营销/广告、新闻稿或抄袭。我们建议您看一下指南!你可能会惊讶地发现,包含朋友链接或鼓掌请求的文章是不允许的。
我们也有自己的指导方针,你可以在这里 找到 。我们的指导方针包括诸如你的代码应该如何显示以及你的图片必须如何被引用等主题。除了我们的指导方针,您还可以找到关于出版和确保您将您的信息传达给我们的受众的建议和提示。
如果你仔细阅读上面的指导方针,你很可能会找到你的文章被拒绝的原因。然而,以下是我们拒绝提交的一些最常见的原因:
- 格式:有关系!例如,如果你的代码格式不正确,你的图片模糊不清,大小随意,你有很长的文字,或者你给每一句话都有自己的段落,我们可能不会接受你的提交。请花时间让你的文章清晰、有帮助,并且读起来令人愉快。
如果你不确定如何嵌入你的代码,这是一个 伟大的资源 。如果需要语法方面的帮助,你可以尝试一个免费的工具,比如grammarly.com。 海明威 可以是另一个很棒的写作辅助资源。如果你不确定如何在介质上格式化数学方程,你可能会喜欢 这篇文章 或者embed . fun工具。如果你想要《走向数据科学》的编辑们正在寻找的例子,看看我们的 编辑精选 !
- 图片:如果你在文章中使用了某个图片,你需要核实你有权利使用它,并正确引用它的来源。请仔细检查您的图片,确保您有权使用您提交的所有图片,包括您修改过的图片。你可以在这里 (#10)了解更多关于这个的信息。
- 数据集:始终确保你有权收集、分析和展示你正在使用的数据。在你的文章中,请给数据集添加引用,并说明其许可。请注意,在 TDS 中发布需要商业许可或数据集所有者的许可(是的,这也包括网络抓取)。你可以在这里 (#11)了解更多我们的数据政策。
- 点击诱饵和列表文章:我们对发布点击诱饵、列表文章或基本内容不感兴趣,如果你提供了广泛可用的信息而没有原创观点,我们可能会拒绝你的文章。我们感兴趣的是,是什么让你的文章与你主题的其他文章不同。做你的研究,并确保你有一些原创的东西要说。
- 选题:虽然我们会根据具体情况做出编辑决定,但我们不太可能发布关注金融或投资建议、医疗建议以及赌博的帖子。我们也不会发布促进数据和人工智能的可疑或不道德使用的帖子。感谢您在选择项目和数据集进行写作时牢记这一点。
- 营销内容和赞助帖子:根据 Medium 的监管准则,营销内容、广告和赞助帖子是不允许的。由于我们发布的所有内容都使用 Medium 的策展指南,我们通常会拒绝那些看似营销的内容。
- 公司账号和匿名账号:我们目前只发布个人撰写的文章。我们不接受由公司帐户或匿名帐户撰写的文章。
- 最少解释的技术教程:我们很高兴你愿意与我们的读者分享你的技术。但是,请记住你的观众!如果你在教读者如何建造或修理某样东西,很可能他们还不知道如何去做。请确保用自己的话提供足够清晰的信息。
- 使用普通技术的个人项目:如果你完成了一个令人惊叹的项目,我们想听听它的故事!然而,如果你正在一个流行的数据集上使用基本的技术,或者你只是简单地回顾一门课程或教程的步骤而没有添加任何新的东西,请等待提交你的文章。继续做你的项目,当你有独特的东西要写时,我们很乐意与我们的读者分享。
- 无关内容:我们是关于数据科学的刊物。如果你写的主题与数据科学、机器学习、编程、数据可视化和人工智能没有直接关系,我们不太可能接受你的提交。
我可以写我公司的产品吗?
我们喜欢发布具有行业经验的数据科学专业人士的帖子。如果你的帖子围绕你从事的产品或项目,欢迎你提交给 TDS,只要它的主要目的是教育和信息,而不是销售或推广。
请注意,我们不太可能发表以产品为中心的文章,这些文章的作者最近写过类似的主题,或者他们的文章主要关注他们的产品/公司。
几个要点:
- 公开你与有问题的公司或项目的关系,并明确后者是否开源。
- 避免使用你公司的标志,尤其是在特色图片中——这会让你的帖子感觉太像广告,把读者吓跑。
- 描述你的产品的好处是好的,如果它与手边的主题相关,但是把你的读者看作是同龄人,而不是潜在的客户。避免营销术语(“限时优惠”、“特别促销”)和滔滔不绝的最高级词汇(“最简单”、“最快”、“同类最佳”)。
- 无论你谈论的是你的日常工作还是一个新的功能发布,确保读者可以学到一些新的东西,即使他们从来没有使用过你的产品。例如,你可以讨论你的团队克服的一个困难的技术挑战,你为构建你的产品而创建的新工作流,或者你的工作如何利用人工智能或机器学习的最新进展。
- 我们通常会拒绝重复产品文档或支持页面的帖子,以及那些旨在引导读者设置和使用相关产品的帖子。
我被要求加入一些关于我的主题/数据集的潜在风险或道德问题的句子。你还能指望什么
如果我们要求您思考您的项目的道德或安全风险,您可能已经写了关于面部识别、跟踪或检测识别个人标志(年龄、种族和性别等)的主题,或者您正在使用可能引起道德问题的数据集。
由于道德和风险问题是该主题和数据集所固有的,因此没有放之四海而皆准的解决方案。所以,我们准备了一些你可能需要回答的问题,来为你的文章创造一个合适的讨论。我们还收录了一些作者在讨论风险或伦理问题方面做得很好的已发表文章。
数据集
- 对你的文章重要吗?为什么/如何?
- 你为什么选择这个特有的数据集?
- 你有没有注意保护文章中输出的个人信息和任何共享的 GitHub 库?
- 你研究过你所使用的数据中潜在的偏见吗?你是如何解决这些问题的?
话题
- 你是否思考过潜在的风险或与你的项目相关的道德问题?
- 你的方法与风险或道德问题有什么关系?
- 你是否研究过与你的主题相关的伦理问题?你把这些观点融入你的文章了吗?
- 您是否已采取措施解决风险和/或道德问题?
- 是否有与您的主题相关的未来工作可以降低风险?
发表文章讨论道德/风险
检查你的偏见维罗妮卡·维拉著(道德/偏见风险)
用深度学习和 PyTorch 训练一个模型来检测乳腺 MRI 肿瘤作者 Nick Konz(医疗风险)
数据来源
我如何确定数据集许可是否合适?
如果所有数据集许可证都很容易找到,有相同的语言,并且容易阅读,那就太好了。可悲的是,事实并非如此。通常需要耐心和毅力来决定你是否有权使用数据集。
以下是一些要点:
- 确保你实际上是在原始数据源的网站上,而不是别人的拷贝。
- 有些网站在主页上以简单的方式显示许可证信息,或者将许可证信息包含在有关数据的信息中。其他时候,您必须更深入一点,搜索 FAQ、条款和条件以及支持页面。如果其他方法都失败了,最好联系业主获得许可。请记得将许可的副本发送到 publication@towardsdatascience.com的我们这里。
- 请留意许可证中描述的允许用法中的“商业”一词。《走向数据科学》是一份商业出版物,商业使用必须得到许可。
- 尽管不是标准的,许多网站已经采用了知识共享许可,这使得解释许可更加简单。以下是一些允许商业使用的许可证代码:
- CCO —公共领域
- CC 乘 4 —允许商业使用
- CC BY-SA —允许带归属的商业使用
小心!有两个类似的代码不允许商业使用,这意味着这些数据集不能用于 TDS 文章:
- CC BY-NC —允许非商业使用
- CC BY-NC-SA 4 —允许非商业带归属使用
5.适用于程序源代码的许可,例如 MIT 和 Apache ,并不自动涵盖或暗示使用相关数据集的权利。
6.将使用限制在“研究和教育目的”的许可证带来了一个问题。尽管你可能已经在文章中做了研究,或者出于教育目的展示了材料,但你是在商业出版物上发表文章。一般来说,研究和教育仅适用于发表在学术期刊、学院/大学课程和会议记录中的工作。
7.书籍、电影剧本、杂志和报纸文章都受版权保护。你想用的那些哈利波特剧本?除非你获得许可,否则禁止入内。然而,旧的出版物可能在公共领域,你的文章可以免费使用。版权一般持续作者的一生加 50 年(加拿大)到 70 年(欧盟、美国)。关于版权有更多的规则,最好咨询作品首次出版所在国家的版权法,以确定版权是否已经过期,你可以自由使用该文档。当有疑问时,请求许可!
我可以使用上传到存储库的数据集吗?
这个问题没有简单的答案,因为任何人都可以将数据上传到存储库中,每个数据集都有自己的许可证。在您的文章中使用数据之前,请仔细阅读提供的信息,以确定数据的来源和适用的许可,这一点很重要。
很多时候,数据集是从抓取的数据中创建的,然后(由抓取它的一方)给予公共域许可,错误地认为存储库所有者允许提供数据/程序。请记住,只有原始数据所有者才能授予权限。
如果你正在参加数据科学竞赛或黑客马拉松,并计划在 TDS 上分享你的进展或解决方案,请确保他们的规则允许你分享数据。一些数据集仅用于竞赛或黑客马拉松,不能在 TDS 发布的文章中共享。
通过 API 获取的数据可以吗?
如果您计划使用 API 来创建自己的数据集,请在将您的文章提交给 TDS 之前,绝对确保您有权使用 API(以及通过 API 获取的任何数据)。检查 API 或网站的使用条款,看看他们是否允许商业使用,并仔细阅读任何限制。
如果没有版权声明或许可证怎么办?
首先,需要注意的是,没有通知或许可证并不意味着可以免费使用。有时,数据包含在一个伞式组织中,例如,一个城市的公用事业部门可能包含在该城市的通用数据共享策略中。
其他时候,业主只是忘记张贴通知。在这些情况下,我们建议您考虑联系所有者请求许可,而不是假设数据可以使用。
请求数据集权限的邮件包括什么?
发送给数据集所有者请求许可的电子邮件不必很长。它应该包括关于你打算写的文章、你自己以及对数据科学的看法的信息。这里有一个例子,你可能会觉得有帮助:
我正在写一篇关于[主题]的文章,这篇文章将发表在《走向数据科学》杂志上,该杂志可在媒体上获得。我在这里[链接]找到了你的数据集,认为它与我的工作非常吻合。我联系您是为了请求允许我在文章中使用这个数据集。你可以在这里了解更多关于我的信息【个人资料、LinkedIn、网站等链接。],关于走向数据科学这里。
广告和促销
我可以付费出版吗?
不,我们不允许赞助帖子。
你允许什么样的广告或赞助内容?
我们不允许任何广告或赞助帖子。
公司可以在 TDS 发布吗?
是的。但是,我们更喜欢发布来自一个属于真人的媒体简介的帖子。还有,我们不允许做广告,也不提出代写服务。
其他人
我能把帖子翻译成另一种语言吗?
你需要直接联系文章的作者。文章属于作者,所以我们不能批准他们的翻译。
我可以在我的 Linkedin 个人资料中提到数据科学吗?
是的,你可以提到你是 TDS 出版物的独立撰稿人。此外,通过将链接添加到您的媒体简介中,将链接添加到您对 TDS 出版物的贡献中也是一种很好的做法。
怎么联系你?
你可以在这里联系我们。
为数据科学职业撰写简历
原文:https://towardsdatascience.com/writing-a-resume-for-a-data-science-career-62b9acd11692?source=collection_archive---------1-----------------------
Source: Pexels
因此,您已经决定进入数据科学职业生涯的下一阶段,无论您是刚刚起步,还是认为自己已经准备好进入职业阶梯的下一阶段。然而,这意味着写一份全新的简历来确保你在面试阶段的位置。
虽然你可能认为这只是简单地写一份新的 Word 文档,但请记住,你的简历将是你未来业务对你的第一印象,所以你必须做到正确,尤其是因为现在的公司只希望获得顶级人才。
今天,我们将探讨撰写数据科学简历时您需要知道的细节,让您获得梦想中的工作。
用你的数据变得具体
一份典型的普通简历会充满模糊而宽泛的陈述和成就,如果你的简历属于这一类,没有数据科学公司会雇用你。当你谈论你在过去工作岗位上的成就时,一定要具体到细节。
例如,不要说“我能够将一个表现不佳的团队变成一个高绩效的团队”,而是通过说类似“我能够在两年内将我团队的绩效和产出提高 14%,从而为公司带来 45%的增长率”这样的话来表明你了解自己的能力。
为你的成就和教育自豪
当你谈论你过去的经历或你在生活中获得的技能时,不要陷入用“绒毛”掩盖有益事实以增加简历字数的陷阱。
对于这个要素,不要写“我在统计学方面有很强的背景”,而是尝试更具体地写一句话,如“在哈佛大学学习统计分析,并因论文工作获得最高奖项”。你在这些方面做得越详细,你就越有可能获得这份工作。
强调你的工作经历
“无论你是在教育行业,还是参加了工作经验安置,或者你已经在数据科学行业有了很长的历史,请确保你强调了这一经验。EliteAssignmentHelp 的职业教练马克·诺兰说:“雇主更看重经验,而不是学历。
使用在线写作工具
作为一名数据科学家,不能保证你的写作技能达到专业水平,但这并不意味着你不能制作一份专业的简历。在网上,你可以找到大量的写作工具,在写作过程的每个阶段都可以帮到你。这里有几个让你开始;
简历服务(Resume Service)——一个简历制作网站,里面有很多写作指南和简历模板,供你在制作简历时参考。
简单字数统计 & 语法检查——两个免费在线工具,帮助你跟踪简历的字数,并检查你的语法。
Essayroo & 作业写作服务——这是两个领先的简历校对服务,以确保你的内容没有错误,正如澳大利亚最佳作家在澳大利亚帮助评论中评论的那样。
通过写作在 & 中引用——两个免费的在线工具和博客,帮助你在简历中添加参考资料,以及提高写作技巧的技巧。
academialized&BoomEssays——这是两家领先的写作咨询服务机构,为你提供更好的写作风格的知识,这是《赫芬顿邮报》推荐的。
写作状态 & 我的写作之道 —两个写满写作指南的博客,帮助你提高一般写作技巧。
英国顶级作家评论的两个专家编辑工具,确保你的简历有意义。
不要只用同一个简历
当你申请一份数据科学的工作时,重要的是要记住,阅读你简历的人可能已经在人力资源行业工作了几十年,当他们看到一份通用的多用途简历时,他们会知道。
你需要确保为你申请的每一份数据科学工作定制你的简历,否则你可能会错过所有的工作。
定制 Keras 生成器
原文:https://towardsdatascience.com/writing-custom-keras-generators-fe815d992c5a?source=collection_archive---------0-----------------------
定制您的数据生成器,加快培训速度
使用 Keras 生成器的想法是在训练过程中即时获得成批的输入和相应的输出,例如读入 100 幅图像,获得相应的 100 个标签向量,然后将这组输入馈送到 gpu 进行训练步骤。
Keras : keras.io
我面临的问题是标准的 Keras 生成器的内存需求。内存生成器创建原始数据的副本,并且必须将dtype
从uint8
转换为float64
。另一方面,从目录中读取的 Keras 生成器期望每个类中的图像都在一个独立的目录中(在多标签问题、分割问题等中是不可能的)。)
因此,我喜欢将批处理生成器分为 4 个步骤:
1\. Get input : input_path -> image
2\. Get output : input_path -> label
3\. Pre-process input : image -> pre-processing step -> image
4\. Get generator output : *(* *batch_input, batch_labels )*
步骤 1 : 定义一个函数来获取输入(可以是子集化一个 numpy 数组,pandas dataframe,从磁盘读入等等。) :
from skimage.io import imreaddef get_input(path):
img = imread( path )
return( img )
第二步: 定义一个函数来获取输出:
import numpy as np
import pandas as pddef get_output( path, label_file = None ):
img_id = path.split('/')[-1].split('.')[0]
labels = label_file.loc[img_id].values
return(labels)
第三步: 定义一个函数对输入进行预处理:
def preprocess_input( image ):
--- Rescale Image
--- Rotate Image
--- Resize Image
--- Flip Image
--- PCA etc.
return( image )
第四步: 把所有的东西放在一起定义你的生成器:
def image_generator(files, label_file, batch_size = 64):
while True: # Select files (paths/indices) for the batch
batch_paths = np.random.choice(a = files,
size = batch_size)
batch_input = []
batch_output = []
# Read in each input, perform preprocessing and get labels for input_path in batch_paths: input = get_input(input_path )
output = get_output(input_path,label_file=label_file )
input = preprocess_input(image=input)
batch_input += [ input ]
batch_output += [ output ] # Return a tuple of (input, output) to feed the network batch_x = np.array( batch_input )
batch_y = np.array( batch_output )
yield( batch_x, batch_y )
现在,您可以添加特定数据集定义的预处理功能,将输出作为图像掩模(分割问题、定位问题等)。).
在这之后,使用这个定制生成器与使用一个预定义的Kerasimagedata generator 并简单地将生成器对象传递给model.fit_generator().
是一样的
#网络安全 WTF 是敏捷风险分析?
原文:https://towardsdatascience.com/wtf-is-agile-risk-analytics-65acc1a08a73?source=collection_archive---------12-----------------------
注意:“风险”这个词有很多解释。因此,为了清楚起见,我们在这里将“风险”定义为以下两种情况之一:a)暴露于可信的威胁参与者对企业非常关心的东西的危害;或 b)已确认的危害,使业务面临不可接受的影响。]
TL;DR — ARA(我们将简称为 ARA)是从各种各样且不断扩大的安全相关数据源中获得越来越有意义且及时的风险洞察的能力。
在“运营/流程术语”中,这意味着能够:
- 轻松快速地接收、建模、探索、丰富和关联企业规模的数据集
- 将您的分析建立在支持关键业务服务和创收的运营“实体”(如用户、计算机、应用程序)的环境中
- 将结果放在业务和 IT 流程的背景下,(如果您想识别那些只有在分析长期趋势时才会出现的讨厌的系统问题,请比较“现在”和“时间的开始”)
- “雷达扫描”风险(在 Panaseer 我们称之为“风险搜寻”),通过使用任何分析技术以任何频率对任何数据进行数字处理
- 根据网络安全 100 个移动部分的数据,不断地(或根据你的需要频繁地)重新安排活动的优先级
他们说一幅画描绘了 1000 个单词(…虽然这幅画主要是单词,所以我不确定它是否有资格作为一幅画…)
在“实际示例术语”中,这意味着:
“我想把我们的#n 千个客户,我们的#n 千个设备,我们的谁知道有多少#n 个用户/开发人员,等等等等。我想获取收入和关键业务服务所依赖的所有实体的数据;我想对所有这些进行参照完整性检查;数据库、流源、来自业务和 IT 工作流程的数字废气;来自安全控制的数据;我们所有的日志。
无论我选择什么频率,我都想处理这些数据以了解: -我的环境中有什么?有什么新的,它连接到什么,它合法吗?
-我的环境是否得到了预期的管理?
-流程是被遵循还是被颠覆?
-是否存在需要弥合的技术或流程方面的控制差距?
-工作流程和控制是否一切正常,但有些东西我只能在日志中检测到,我需要我的 SOC 的狙击手瞄准镜在上面划区域?
-相对于需要立即提升到董事会级别的内容,我可以在日志中忽略哪些我不关心的内容?然后,我想把所有这些总结成一个观点,告诉我的 CISO 和他整天开会的人,“这是我们本周、本月或今天转移资源的地方,以便最大限度地保护对我们的业务最重要的东西。”
有了这些,我希望对数据的完整性、准确性和一致性有信心,以便能够自动化背后的工作流程。
然后,在任何时候,我都希望引入另一个数据源,重新运行我的所有问题,以获得 50,000 英尺地面的更好分辨率,或者放大地面上行驶在特定街道上的汽车的牌照。
哦,我希望这一切能在几小时或几分钟内完成,而不是几个月或几周,或者根本不可能。
-纽约某投资银行的信息安全智能分析主管
@Panaseer_Team 将于 9 月 25-28 日在纽约的地层;如果你在那里,来和我们谈谈我们与英国和美国的 CISO 团队在这方面所做的工作。如果你不打算一起去,你可以随时在这里联系我们。
假人的机器学习
原文:https://towardsdatascience.com/wtf-is-machine-learning-a-quick-guide-39457e49c65b?source=collection_archive---------6-----------------------
ML 和 AI 正在对我们的生活产生巨大的影响,它们的作用只会越来越大。你了解的越多,在这些变化发生时,你就能准备得越充分。
所以,我会给你们一个快速的视角来看什么是机器学习😉
机器学习是教计算机如何从数据中学习以做出决策或预测。对于真正的机器学习,计算机必须能够在没有明确编程的情况下学习识别模式。
它位于统计学和计算机科学的交叉点,然而它可以戴上许多不同的面具。你可能还会听到它被标上了其他几个名字或流行语:
数据科学、大数据、人工智能、预测分析、计算统计、数据挖掘等……
机器学习工作流
机器学习工作流是执行机器学习项目所需的过程。以下是对这些核心步骤的可视化描述,很有帮助:
机器学习有四种:
1-监督学习
2-无监督学习
3-半监督学习(监督学习类)
4-强化学习
不要担心这些术语对你来说毫无意义。完成本指南后,您将能够自己讲述这些技巧!😉
下面是通过自学学习机器的 4 个步骤:
- 建立统计学、编程和一点数学的基础。
- 沉浸在 ML 背后的本质理论中。
- 利用图书馆等进行有针对性的练习..
- 实践机器学习项目
让我们深入了解机器学习(Badass)的一些基本术语和概念
1)监督学习
在监督学习中,我们提供数据以及期望的输出(即标记数据)。例如,如果我们希望我们的系统学习马匹检测,我们将收集成千上万的图像,在马匹周围绘制一个边界框,并将整个数据集馈送给机器,这样它就可以自己学习。
Supervised Learning Infographics
2)无监督学习
在无监督学习中,我们只是提供数据,让机器找出数据集中的模式。例如,我们可以提供三种不同的形状(圆形、三角形和正方形)并让机器将它们聚集在一起。这种技术被称为聚类。
UnSupervised Learning Infographics
3)半监督学习
半监督学习是一类监督学习任务和技术,也利用未标记的数据进行训练。在半监督学习中,机器从部分标记的数据中学习,并将这些学习映射到未标记的数据。例如,一个照片存储服务会将一个人的所有照片进行分组,你只需标记一张照片,其他所有照片都会被标上相同的名字,因为它们是同一个人。
4)强化学习
在强化学习中,机器通常被称为代理,代理根据它的每个动作获得奖励(或惩罚)。然后,它学习什么是最大化奖励和减轻惩罚的最佳行动。
什么是过度拟合和欠拟合?
在对数据进行训练后,我们训练模型的目标是尽可能准确地对未知数据进行归纳。如果模型在训练数据上产生非常准确的结果,但未能对看不见的数据进行归纳,则称为过度拟合,因为模型过度拟合了训练数据。如果模型甚至不能准确预测训练数据,这意味着模型没有学到任何东西,这就是所谓的欠拟合。
我们在进行机器学习时会遇到哪些挑战?
- 数据不足
- 质量差的数据
- 无关的特征
数据不足
为了训练机器学习模型,我们需要海量的数据集。在物体检测等复杂问题中,我们有时需要数千幅图像和数百万条记录来进行预测。
质量差的数据
如果输入的数据是错误的,无论我们的机器学习算法多么健壮,它总是会产生意想不到的结果。我们必须减少噪音,并丢弃数据集中的异常值,以使我们的系统性能更好。离群值是同一组中所有成员都不同的实体。
无关特征
有时,我们拥有的数据集不具备训练模型所需的正确特征。在这种情况下,我们要么丢弃不相关的特性,要么将它们合并在一起以产生一个有意义的特性。这个特征选择和提取的过程称为特征工程。
如果你喜欢这个故事,请点击👏按钮并分享,以帮助其他人找到它。你也可以给我买杯咖啡帮我给你写更多有趣的内容!
WTF 是传感器融合?优秀的老式卡尔曼滤波器
原文:https://towardsdatascience.com/wtf-is-sensor-fusion-part-2-the-good-old-kalman-filter-3642f321440?source=collection_archive---------0-----------------------
在本系列的前一篇文章中,我谈到了基本上用于所有传感器融合算法的两个方程:预测和更新方程。然而,我并没有展示任何实用的算法,使方程分析容易处理。因此,在这篇文章中,我将解释可能是最著名和最广为人知的算法——卡尔曼滤波器。
尽管它在很多方面是一个简单的算法,但仍然需要一些时间来建立对它实际工作方式的直觉。良好的直觉很重要,因为正确调整卡尔曼滤波器有时并不容易。
等等,这两个方程现在在哪里?
让我们快速总结一下传感器融合是怎么回事,包括预测和更新等式。为了做到这一点,我们将重温在本系列第 1 部分中首次出现的飞机示例。如果你感到迷茫,我强烈建议你通读一遍。
好吧。我们用雷达传感器来追踪一架飞机。我们有兴趣了解飞机的状态 x_k ,其中 k 表示时间步长。状态包含了我们感兴趣评估的飞机的动态特性。例如,这可以是位置、速度、滚动、偏航等。
我们对时间步长之间的飞机动力学有一些了解,我们将其表示为运动模型。然而,模型中存在不确定性,这就是为什么我们将其视为概率分布
用文字表达,该模型说状态 x_k 是从 x_k 的可能值的分布中得出的,并且该分布取决于先前的状态 x_{k-1} 。我们也可以选择将运动模型表示为
这个等式说的是同样的事情,但是在这个公式中我们有一个确定性函数 f() 和一个随机变量 q_{k-1} 。因此,用文字表达,我们知道状态 x_k 是前一状态 x_{k-1} 和某个随机运动噪声****q _ { k-1 }的函数,该噪声是随机的(即从某个分布中抽取)。
除了飞机的动态特性,我们还知道雷达的动态特性,我们可以用测量模型来表示。传感器并不完美,所以我们收到的测量结果中会有噪声 y_k 。因此,我们也可以将测量模型视为概率分布
用文字表达,该模型表示测量值 y_k 来自测量值 y_k 的可能值的分布,并且该分布取决于状态 x_k 。我们也可以选择将度量模型表达为
在这个公式中,我们有一个确定性测量模型 h() ,它接收当前状态 x_k 以及随机变量 r_k 。这表示测量值 y_k 是状态 x_k 以及一些随机的(即从一些分布中抽取的)测量噪声** r_k 的函数。**
我们正在寻找一种方法将这两种模型结合起来,这样当我们从雷达上观察测量结果时,我们就可以得出以下密度
这被称为整个状态的后验分布,并且可以被视为描述了对于 x_k 的一个似是而非的值的区域,给出了我们到目前为止观察到的所有值。
我们可以通过计算两个方程来表达这个密度,即预测和更新方程
预测方程使用来自前一时间步 k-1 的后验以及运动模型来预测当前状态 x_k 将会是什么。然后,通过使用贝叶斯定理将观察到的测量值 y_k 与测量模型和预测状态相结合,经由更新方程来更新该信念。然后我们得到后验分布!对于下一次测量,我们只需重复这些步骤,当前的后验概率就变成了先前的后验概率。
好吧,我现在知道速度了。那么,什么是卡尔曼滤波器?
预测和更新方程提供了一种递归方式来计算我们接收到的每个测量的状态的后验。然而,如果我们看看这些方程,它们在实践中并不那么容易计算。
首先,我们需要以这样一种方式表达密度,即我们实际上可以求解方程(即,我们想要数值稳定的方程)。其次,如果我们能找到解析解就好了,因为这样我们就不必数值求解方程(这可能需要大量的计算)。这两者都很重要,尤其是当您考虑到许多传感器以数百或数千赫兹的速率提供测量时。由于我们不想丢弃测量值,我们需要找到一种方法来快速计算这两个方程。
这就是卡尔曼滤波器的用武之地。卡尔曼滤波器是围绕一个关键概念建立的
这是因为高斯密度有很多好的特性:
- 如果我们从高斯函数中提取值并执行线性运算(即乘法和/或加法),这些值仍将按照高斯函数分布。
- 高斯密度的另一个好特性是它们是自共轭的。这意味着如果我们有一个高斯似然和一个高斯先验,那么后验肯定也是高斯的。
- 最后,高斯密度可以完全由它们的前两个矩来描述:均值和方差。****
如果我们看看预测和更新方程,你就有希望看到所有这些属性是如何派上用场的。通过使每个密度成为高斯型,每个方程都归结为寻找相应的均值和方差的表达式!
线性和高斯运动和测量模型可以表示为
就像以前一样,我们可以选择将这两个模型表示为函数,而不是密度
有了这些,我们可以重写预测和更新方程,其中所有的密度都是高斯型的
我们要寻找的是找到如何计算上面用橙色和洋红色标记的矩的方程:预测的均值和协方差,以及更新的均值和协方差。我将跳过推导,但我们最终得到的是****
好了,我们现在有了一个解析解,可以计算每个时间步的状态 x_k 的后验分布!因为我们以高斯计算结束,所以 MMSE 或图是微不足道的,因为后验平均值充当两者。另一种看待这一切的方式如下
“后验(洋红色)均值是状态的最优估计,后验(洋红色)协方差是估计的不确定性”。
在我们开始实际的例子之前,让我们简单地看一下每一行,并分析一下发生了什么。
- 我们通过采用过去的后验平均值并将其乘以矩阵 A_{k-1} 来获得预测的平均值,这是有意义的,因为 A_{k-1} 描述了状态如何随时间演变。
- 预测协方差以类似的方式计算,其中我们将过去的后验协方差乘以 A_{k-1} 两次,并加上 Q_{k-1} 。我们添加协方差 Q_{k-1} 因为我们在运动模型中有不确定性,所以它被添加到变换的协方差中。
- v_k 被称为新息,可以被看作是在将实际测量值与我们从测量模型中获得的预测测量值进行比较时获得的新信息的表示。
- S_k 表示预测的测量协方差。 R_k 表示测量模型中的测量不确定性,利用 S_k 我们将预测状态的不确定性与测量模型的不确定性结合起来。
- K_k 被称为卡尔曼增益,表示预测状态和协方差应该用从测量中获得的新信息调整多少。
- 后验均值是通过采用预测的均值并用已经获得的新信息对其进行调整来计算的。如上所述, K_k 是一个比例因子,它决定了应当增加多少 v_k 。
- 后验协方差是通过采用预测的协方差并用从测量中获得的信息对其进行调整来计算的。新的信息允许我们减少状态的不确定性,这就是为什么有一个负号。
是的,数学很好,但我还是有点迷茫…
为了更好地理解这 7 行方程所代表的内容,在概念层面上想象一下卡尔曼滤波器中的情况是很有帮助的。
首先,我们可以想象我们有两个不同的平面(或维度):测量****平面(红色,用 Y 表示)和状态平面**(蓝色,用 X 表示)。状态 x_k 在状态平面中随时间演变。问题是我们不能以任何方式访问或显式观察状态平面,我们只能访问测量平面。测量平面是我们观察由状态引起的测量的地方。****
我们无法确切知道状态平面中发生了什么(即,我们无法观察到状态的精确值),但使用卡尔曼滤波器,我们可以将状态平面中的状态行为描述为高斯密度。
在卡尔曼滤波器中,我们从初始高斯开始,描述时间步长 k-1 的状态。这个初始高斯用黑点和圆圈表示(点表示平均值,圆圈是协方差矩阵的轮廓线)。我们使用运动模型来预测状态在时间步长 k 的位置,用蓝色的高斯图表示。然后,我们使用测量模型将预测状态(蓝高斯)从状态平面投影到测量平面。我们最终得到的是红高斯,它本质上描述了我们可以预期测量发生的地方。一旦观察到测量值(用绿色表示),我们就使用红高斯来决定应该使用多少测量值来更新状态平面中的预测状态。在我们更新了预测的状态之后,我们以一个新的黑高斯结束,描述了在时间 k. 的状态的后验概率,然后对所有未来的时间步重复这个过程。
好的,酷,我如何在实践中使用它?
好了,让我们通过展示卡尔曼滤波器在代码中的样子来将所有这些付诸实践,并将其应用到一个玩具示例中。
在玩具示例中,我们将使用我之前提到的飞机示例。为了简单起见,让我们假设飞机在恒定高度飞行。因此,在这种情况下,我们可以选择在状态中包括 xy 位置和 xy 速度
飞机的运动可以用恒速模型来描述。CV 模型很好,因为它是一个实现起来简单的线性模型,同时它能很好地描述飞机的行为。简单地说,它假设飞机的下一个位置是其当前位置和当前速度的函数。假设速度是随机的(受附加高斯噪声的影响),这是有意义的,因为我们不知道飞行员正在采取什么行动。在 1D,这个模型被表述为
参数 T 表示系统中使用的采样时间,而 σ 用作协方差矩阵的比例因子(即表示模型中有多少不确定性)。现在,协方差模型看起来如此时髦的原因是因为我们正在使用一个离散化的 CV 模型(阅读 this 了解更多信息)。这一点很重要,因为我们选择的采样时间 T 会影响滤波器性能(我将在以后的文章中更深入地讨论这个话题)。
在我们的例子中,我们在 x 和 y 两个方向上都有运动,运动模型变成
每个方向的 1D 协方差分量σ分别标有 x 和 y 。这是因为两个方向不一定遭受相同数量的噪声。
好了,现在我们知道如何表达 A 和 Q 了。让我们继续测量模型。这个模型相当简单。我们假设我们在每个时间步测量飞机的位置,并且测量是随机的(服从加性高斯噪声)。这可以表示为
类似于之前我们使用λ作为测量协方差矩阵 R_k 的比例因子。
在为该系统实施卡尔曼滤波器之前,我们将使用这两个模型来生成运动和测量数据。我们稍后将使用这些数据来测试卡尔曼滤波器,看看它的效果如何。为此,我们需要一个可以模拟系统并创建所有模型参数的脚本(注意,@操作符与 numpy 中的 np.matmul 相同,因此 A @ B 与 np.matmul(A,B)相同)。
运行 simulate_model.py 后,我们得到了下面的图,说明了状态的位置分量(x 和 y)如何在 20 个时间步长(采样时间 T=1)内演变,以及观察到的测量值。现在请记住,我们正在模拟系统,这就是我们如何知道真实状态的。**
现在让我们实现卡尔曼滤波器,这是一个简单的过程,因为滤波方程从数学转换成代码非常容易。
有了卡尔曼滤波器,我们现在可以运行它,看看它在我们的模拟数据上表现如何。为此,我们将编写一个脚本,将 kalman_filter.py 和 simulate_model.py 中的功能结合起来。
运行脚本后,我们得到了下面的图,它与之前的图相同,但增加了卡尔曼滤波器对 x 和 y 位置的估计。
仅通过观察该图,很明显卡尔曼滤波器给出了比仅使用原始测量更好的 x 和 y 位置估计。还可以数值分析卡尔曼滤波器优于仅使用测量值的性能。通过使用欧几里德距离作为 x 和 y 位置的误差度量,我们可以计算卡尔曼滤波器和测量的均方根误差(RMSE) 。对于这个 20 个时间步长的场景,每种方法的 RMSE 为
**(20 time-step simulation)
RMSE Kalman Filter: **0.2917**
RMSE Measurements: 0.4441**
卡尔曼滤波器的 RMSE 值比测量值低很多。由于 20 个时间步长相当短,所以让我们研究一下 RMSE 结果是否适用于更长时间的模拟,从而减少统计不确定性。
**(100,000 time-step simulation)
RMSE Kalman Filter: **0.3162**
RMSE Measurements: 0.4241**
就像之前的卡尔曼滤波器一样,这是一个比仅仅使用测量值更好的选择。
(比较只集中在位置状态,因为它们更容易绘制。但是不要忘记,使用我们选择的运动模型,我们也可以从卡尔曼滤波器中得到 x 和 y 方向的速度估计值!)
需要强调的是,玩具示例的目的是说明卡尔曼滤波器是如何工作的。在现实世界的应用中,我们事先不知道模型 参数(Q和 R ),我们甚至可能不知道使用什么运动模型。在这种情况下,大量时间花费在调整滤波器参数和尝试不同的运动模型上。更糟糕的是,大多数时候我们最终处理的是非线性系统,高斯假设不成立。
但与此同时,正是这些类型的问题实际上是解决起来最有趣的!这就是卡尔曼滤波器更复杂的变体或扩展的用武之地——它们根据需要提供不同的方法和策略来解决所有或部分这些问题。
在本系列的下一篇文章中,我将探索一系列的 sigma-point 滤波器,它们由几种不同的滤波器组成,能够在不同程度上处理非线性和非高斯模型。
感谢阅读!
" WTH,神经网络会学习吗?"—新来者的困境
原文:https://towardsdatascience.com/wth-does-a-neural-network-even-learn-a-newcomers-dilemma-bd8d1bbbed89?source=collection_archive---------1-----------------------
Photo by ANDRIK LANGFIELD PETRIDES on Unsplash
我相信,我们的大脑中都有一个喜欢思考思维是如何发生的心理学家/哲学家。
“深度网络具有层次结构,这使得它们特别适合于学习知识的层次,这些知识在解决现实世界的问题时似乎是有用的。更具体地说,在解决图像识别等问题时,使用不仅理解单个像素,还理解越来越复杂的概念的系统会有所帮助:从边缘到简单的几何形状,一直到复杂的多对象场景。”
——迈克尔·尼尔森在他的书 神经网络和深度学习
那里。
神经网络学习内容的简单、清晰的鸟瞰图——它们学习“越来越复杂的概念”。
这感觉不熟悉吗?我们不就是这样学习的吗?
例如,让我们考虑一下,我们作为孩子,可能是如何学会识别物体和动物的——
- 我们学习什么是“手”、“腿”、“眼睛”、“鼻子”、“嘴”和“耳朵”。
- 我们学习数数,知道我们有两条腿、手、眼睛和耳朵,只有一个鼻子和嘴。
- 然后,我们观察狗,了解到狗和我们一样,但是有四条腿而不是两条腿,而且没有手。
- 然后我们了解到大象是一种动物,就像狗一样,但是很大,鼻子长得出奇。
看到了吗?
所以,神经网络像我们一样学习!
这几乎让我们相信我们拥有这种无形的东西..人造的“东西”那是类比于心灵本身的!对于刚开始深度学习之旅的人来说,尤其具有吸引力。
但不是。神经网络的学习与我们自己的学习不同。几乎所有关于深度学习的可信指南和“入门包”都附有警告,大致如下:
免责声明:神经网络只是非常松散地受到大脑的启发。它们并不代表真实人脑的功能。
警告:在神经学家面前,他们这样做的任何主张都可能引发一场激烈的舌战。
..这就是所有混乱的开始!
Francois Chollet- one of the pioneers of Deep Learning, author of the Keras framework
困惑和为什么它会在那里
我认为这主要是因为大多数教程和初级书籍处理这个问题的方式。
让我们看看迈克尔·尼尔森(Michael Nielsen)在他的书《神经网络和深度学习:
An excerpt from Neural Networks and Deep Learning by Michael Nielsen
像许多其他人一样,他使用神经网络和人类思维之间的类比来试图解释神经网络。线条和边缘形成循环的方式有助于识别一些数字,这就是我们想要做的。许多其他教程试图使用类似的类比来解释构建知识层次的含义。
不得不说,因为这个类比,我对神经网络的理解更深了。
但是这是一个悖论,使一个困难的概念为大众所理解的类比,也能在他们中间产生一种知识的幻觉。
读者需要明白,这只是一个类比。不多不少。他们需要明白,每一个简单的类比后面都需要有更严谨、看似困难的解释。
别误会我的意思。我非常感谢迈克尔·尼尔森写了这本书。这是关于这个主题的最好的书之一。他小心翼翼地提到这是“只是为了论证”。
但我把它理解为这个意思—
也许,网络不会使用完全相同的片段。也许,它会找出一些其他的碎片,并以其他方式将它们连接起来,以识别这些数字。但本质会是一样的。对吗?我的意思是,每一部分都必须是某种边缘或线条或某种环状结构。毕竟,如果你想建立一个层次结构来解决识别数字的问题,似乎没有其他的可能性。
随着我对它们以及它们如何工作有了更好的直觉,我明白这种观点显然是错误的。它击中了我..
甚至循环和边缘都不像是 NN 的可能性!
让我们考虑一下循环—
能够识别环对我们人类书写数字至关重要-8 是两个首尾相连的环,9 是下面有尾巴的环,6 是上面有尾巴的环。但是当涉及到识别图像中的数字时,像循环这样的特征对于神经网络来说似乎是困难和不可行的(记住,我说的是你的普通神经网络或 MLPs 这里是)。
- 除了“0”和“8”之外,如果“6”在图片的下半部分,循环只能帮助识别它;如果“9”在图片的上半部分,循环可以帮助识别它。
- 因此,如果我们有一个简单的网络,只有一个隐藏层,我们已经“用完”了该层的 2 个神经元,每个神经元对应于环路的一个位置(上/下)。当你考虑到可能出现的不同形状的环,以及这些数字可以被画出的不同空间位置时,这个数字会迅速增加。
- 现在,即使是一个基本的网络架构(香草神经网络)也可以在只有 20-30 个隐藏神经元的情况下实现显著的准确性(> 95%)。所以,你可以理解为什么这样一个神经网络可能不会进入循环那么多。
我知道这只是一大堆“手动波动”的推理,但我认为这足以令人信服。很可能,边缘和所有其他手工设计的功能将面临类似的问题。
..这是一个两难的问题!
那么,神经网络实际上会学习哪些特征呢?
直到 3blue1brown 发布了一组关于神经网络的视频,我才知道答案或者如何找到它。格兰特·桑德森负责向新来者解释这个问题。也许他甚至觉得其他人的解释中有一些缺失,他可以在他的教程中解决这些问题。
好家伙,他做到了!
视频
3blue1brown 的格兰特·桑德森(Grant Sanderson)使用了一个有两个隐藏层的结构,他说
最初,我激发这种结构的方式是通过描述一种希望,即第二层可能会拾取小边缘,第三层将这些边缘拼凑在一起以识别循环和更长的线,这些可能被拼凑在一起(在最后一层)以识别数字。
我们上面排除的环和边。
Structure of the neural network used in 3blue1brown’s video series
这就是我们的网络实际在做的事情吗?
至少在这一点上——一点也不!
The weight matrices for the 1st hidden layer visualised
他们不再四处寻找孤立的小边缘,而是寻找..嗯,几乎随机(!)只是中间却有些非常松散的模式
他们不是在寻找循环或边缘或任何一点点接近的东西!他们在寻找..好莫名其妙的事情..一些奇怪的模式,可以混淆为随机噪声!
该项目
我发现那些权重矩阵图(在上面的截图中)真的很吸引人。我认为它们是一个乐高拼图。
权重矩阵图像就像基本的乐高积木,我的任务是找出一种方法将它们排列在一起,这样我就可以创建所有的 10 个数字。这个想法的灵感来自于我上面贴的神经网络和深度学习的节选。在那里,我们看到了如何使用手工制作的特征(如边缘和曲线)组装 0。所以,我想,也许,我们可以对神经网络实际发现的好的特征做同样的事情。
我所需要的只是 3blue1brown 的视频中使用的那些权重矩阵图像。现在的问题是格兰特在视频中只放了 7 张图片。所以,我不得不自己制作它们,创造我自己的一套乐高积木!
乐高积木,组装!
我把迈克尔·尼尔森书中使用的代码输入到一个 Jupyter 笔记本中。然后,我在那里扩展了Network
类,以包含帮助我可视化权重矩阵的方法。
网络中的每个连接对应一个像素。每个神经元的一个图像显示它有多“喜欢”(颜色:蓝色)或“不喜欢”(颜色:红色)前一层神经元。
因此,如果我观察隐藏层中某个神经元的图像,它就像一张显示一个特征的热图,一个基本的乐高积木,将被用来识别数字。蓝色像素代表它“喜欢”的连接,而红色像素代表它“不喜欢”的连接。
Heat map showing the Carbon Monoxide density. Credits- Nasa Earth Observatory
我训练了一个神经网络:
- 1 个输入层(784 个节点)
- 1 个隐藏层(30 个节点)
- 1 个输出层(10 个节点)
请注意,我们将有 30 种不同类型的基本乐高积木用于我们的乐高拼图,因为这是我们隐藏层的大小。
和..这是它们的样子!—
Hidden layer of the neural network (size- 30 neurons)
这些就是我们一直在寻找的功能!根据网络比环和边更好的那些。
这是它对所有 10 个数字的分类方式:
Weight matrix images attached to the neurons of the output layer
猜猜看?这些都没有任何意义!!
这些特征似乎都没有捕捉到输入图像中任何孤立的可区分特征。所有这些都可能被误认为只是在随机选择的地方随机形成的斑点。
我的意思是,只要看看它如何识别一个‘0’:
这是识别“0”的输出神经元的权重矩阵图像:
Weight matrix image used to identify a ‘0'
为了清楚起见,这个图像中的像素代表连接隐藏层和识别“0”的输出神经元的权重。
我们将只考虑每一个数字的几个最有用的特征。为此,我们可以从视觉上选择最强烈的蓝色像素和最强烈的红色像素。在这里,蓝色的应该给我们最有用的特征,而红色的应该给我们最可怕的特征(把它想象成神经元在说——“如果它是 0,图像将绝对不匹配这个原型”)。
三个最强蓝色像素的指数:3,6,26
三个最强红色像素的指数:5,18,22
Recognising 0’s; indices- 3, 6, 26 (blue) 5, 18, 22 (red)
矩阵 6 和 26 似乎捕捉到了类似蓝色边界的东西,围绕着内部的红色像素——这实际上有助于识别“0”。
但是《黑客帝国 3》呢?它没有抓住任何我们甚至可以用语言解释的特征。《黑客帝国 18》也是如此。为什么神经元会不喜欢它?好像和《黑客帝国 3》挺像的。我们甚至不要在 22 分钟内进入奇怪的蓝色。
荒谬,看!
让我们为‘1’做这件事:
Weight matrix image used to identify a 1
三个最强蓝色像素的指数:0,11,16
顶部两个最强红色像素的指数:7,20
Recognising 1; 0, 11, 16 (blue) 7, 20 (red)
我对此无话可说!我甚至不想评论。
在什么情况下这些可以用来识别 1!?
现在,备受期待的‘8’(它将如何表示其中的 2 个循环??):
Weight matrix image used to identify an 8
前 3 个最强烈的蓝色像素:1,6,14
前 3 个最强烈的红色像素:7,24,27
Recognising 8; 1, 6, 14 (blue) 7, 24, 27 (red)
不,这也不好。似乎没有我们预期的循环。但是这里还有一件有趣的事情需要注意——输出层神经元图像(拼贴上方的那个)中的大多数像素是红色的。看起来这个网络已经找到了一种方法,利用它不喜欢的特征来识别 8!
推理
所以,不。我不能用这些特征像乐高积木一样把数字放在一起。我在这项任务上非常失败。
但是平心而论,这些功能也不是那么像乐高积木!原因如下
- 它们可以部分使用。我的意思是他们的贡献状态不是 0 或 1。这些特性中的一些被完全使用,一些被部分使用,一些没有被使用,一些有负面影响(然而重要的是!)对数字结构的影响。这不像乐高积木,既可以用也可以不用。
- 它们似乎没有捕捉到任何特定的特征。相反,它们似乎只有与其他隐藏的神经元结合起来才是有用和合理的(还记得 matrix 3 和 matrix 18 在识别‘0’方面的失败吗?)。一些奇怪的组合,网络已经用我们给它的强大的微积分能力计算出来了!一个如此不可理解的组合,看起来就像“几乎是随机的”!
原来如此,原来如此。如果你像我们一样考虑神经网络构建特征层次的方式,可以说神经网络像我们一样学习。但是当你看到功能本身时,它们与我们使用的完全不同。网络几乎没有给你解释它们所学习的特征。
神经网络是很好的函数近似器。当我们构建和训练一个模型时,我们主要关心它的准确性—
它在多大比例的测试样本上给出了肯定的结果?
这对于许多目的来说都非常有效,因为现代神经网络可以具有非常高的准确性——超过 98%并不少见(这意味着失败的几率仅为 1/100!)
但是这里有一个问题——当他们错了,没有简单的方法去理解他们错的原因。它们不能被传统意义上的“调试”。举个例子,这是谷歌因为这个发生的一个尴尬的事件:
Because of this incident, When it comes to gorillas, Google Photos remains blind even now!
理解神经网络学习什么是一个非常重要的课题。这对释放深度学习的真正力量至关重要。它会帮我们进去
- 仅基于神经网络创建可调试的端到端系统
- 使用这样的系统来拓宽我们对各种主题的理解,并最终实现使用人工智能来增强人类智能的目标
几周前,《纽约时报》杂志刊登了一篇关于神经网络如何被训练成以惊人的准确度预测癌症患者死亡的报道。
这位作家是一位肿瘤学家,他说:
那么,关于死亡的过程,算法到底“学到”了什么?反过来,它能教给肿瘤学家什么?这是这样一个深度学习系统的奇怪之处:它学习,但它不能告诉我们它为什么学习;它分配概率,但是它不能容易地表达分配背后的推理。就像一个通过反复试验学会骑自行车的孩子,被要求说出骑自行车的规则,只是耸耸肩就离开了,当我们问“为什么?”时,算法茫然地看着我们就像死亡一样,它是另一个黑匣子。
一位肿瘤学家在《纽约时报杂志》上发表的文章
因为我的小项目,我想我对此有强烈的共鸣。😃
奖金部分(请随意跳过)
在我之前描述的小项目中,我偶然发现了一些其他的结果,我觉得它们真的很酷,值得分享。所以他们在这里—
较小的网络:
我想看看我能使隐藏层的大小变得多小,同时在我的测试集中仍能获得相当高的精确度。结果表明,用 10 个神经元,该网络能够从 10000 张测试图像中正确分类 9343 张。只用 10 个隐藏神经元就能对从未见过的图像进行分类,准确率达到 93.43%。
只需 10 种不同类型的乐高积木就能识别 10 个数字!!
我觉得这非常有趣。
Hidden layer of the neural network with 10 neurons in it
当然这些权重也没有太大意义!
Weight matrix images for the output layer
如果你好奇的话,我也用 5 个神经元进行了测试,我得到了 86.65%的准确率;4 个神经元——准确率 83.73%;在此之下,下降幅度非常大——3 个神经元下降了 58.75%,2 个神经元下降了 22.80%。
重量初始化+正则化带来很大不同:
仅仅是调整你的网络和对权重使用良好的初始化就能对你的网络学习产生巨大的影响。
让我来演示一下。
我使用了相同的网络架构,意味着相同的层数和相同的神经元数。然后我训练了 2 个Network
物体——一个没有正则化,使用相同的旧np.random.randn()
,而另一个我使用正则化和np.random.randn()/sqrt(n)
。这是我观察到的:
Comparison of what the weight matrices look like before/after using regularisation + good weight initialiser
是啊!我也震惊了!
(注: 我已经在上图拼贴中展示了与不同指数神经元相关的权重矩阵。这是因为由于不同的初始化,即使是相同索引的节点也学习不同的特征。所以,我选择了那些看起来效果最明显的。 )
要了解更多关于神经网络中的权重初始化技术,我推荐你从这里的开始。
感谢您的阅读!😄
如果你想讨论这篇文章或你脑海中的任何其他项目或真的任何事情,请随时在下面评论或在 LinkedIn 或 Twitter 上给我留言。
我是一名自由作家。你可以雇我为你公司的博客写类似的深入、热情的文章,解释 ML/DL 技术。给我发邮件到 **nityeshagarwal[at]gmail[dot]com**
讨论我们的合作。
还有,你可以在 Twitter 上关注我;我不会给你发垃圾邮件;-)
最初发表于 Zeolearn 博客。
将 XGBoost 模型转换成 if-else 格式
原文:https://towardsdatascience.com/xgboost-deployment-made-easy-6e11f4b3f817?source=collection_archive---------2-----------------------
New river, WV, photo by myself
在本文中,我将向读者展示如何使用正则表达式的一些技巧将 XGBoost 模型转换成. py 文件。py 文件是“numpy”包。因此,在您训练了 XGB 模型之后,您可以在另一个不需要 XGBoost 包的环境中部署该模型。
当您计划在 AWS lambda 中部署 XGBoost 模型时,这个技巧可以帮助您满足包大小的限制。如果你打算用其他方法(AWS sage maker/Docker+Flask+Nginx……)部署模型,那么这篇文章可能真的帮不了你。
本教程分为几个部分:下载数据并训练模型→将模型转换为. py 文件→使用。py 文件来预测测试数据。
步骤 0。下载 jupyter 笔记本
这本笔记本包含了下面所有的代码。把它放在你的目标文件夹里。
第一步。下载数据并训练模型
让我们使用众所周知的泰坦尼克号数据集来建立一个玩具模型。从链接下载 train.csv 和 test.csv。创建一个子文件夹“/data”并将。csv 在那里。
因为 XGBoost 只接受数字输入,所以让我们跳过分类变量编码,随机选择几个数字列进行建模。
这个 XGBoost 模型产生 3 个决策树,每个决策树的最大高度= 3。因为 gamma(分裂次数的惩罚常数)被设置为一个较大的值,所以它可以防止对某些树节点进行分裂。
决策树看起来像:
每个记录的预测得分由“基础得分+所有树的最终叶值”给出。
第二步。将模型转换为. py 文件
在 XGBoost Python API 中,您可以找到允许您将模型作为字符串或. txt 文件转储的函数,或者保存模型以备后用。但是没有 API 将模型作为 Python 函数转储。这里有一个技巧:我们首先将模型作为一个字符串转储,然后使用正则表达式解析这个长字符串并将其转换成一个. py 文件。
完成这项工作的代码片段:
使用模型训练中使用的基本分数和训练的模型,我们能够将其转换为. py 模型,该模型只需要“numpy”包(用于缺失值处理)。
model_to_py(params['base_score'], model, 'xgb_model.py')
生成的“xgb_model.py”的一部分如下所示:
第三步。使用。py 文件来预测测试数据。
我们现在可以导入刚刚创建的 xgb_model.py,执行预测非常简单。
让我们将其与 XGBoost 模型产生的预测进行比较。
结果匹配。
一些警告:
- 这些代码在 python 3.5.2 + xgboost 0.6 下运行良好。不保证为其他版本生成正确的结果。
- 我没有在我的代码中做任何错误处理。
- 的。py 是为给 python 字典打分而设计的,但是您可以做一些小的修改来适应您的用例。
- 在生成。py 文件,确保没有。目标文件夹中同名的 py 文件。
XGBoost 不是黑魔法
原文:https://towardsdatascience.com/xgboost-is-not-black-magic-56ca013144b4?source=collection_archive---------3-----------------------
Photo by Tobias Tullius on Unsplash
不输入缺失值并不总是正确的选择。
如今,在数据科学任务中取得令人满意的结果相当容易:对这个过程有一个大致的了解,对 Python 有一个基本的了解,花十分钟的时间实例化 XGBoost 并拟合模型就足够了。好的,如果这是你的第一次,那么你可能会花几分钟通过 pip 收集需要的包,但是仅此而已。这种方法的唯一问题是它工作得相当好🤷🏻♂️:几年前,我在一次大学竞赛中,通过将数据集输入到一个具有一些基本功能工程的 XGBoost,击败了展示非常复杂的架构和数据管道的团队,名列前五。XGBoost 最酷的特性之一是它处理缺失值的方式:决定每个样本的最佳估算方式。这个特性对我在过去几个月中遇到的许多项目和数据集非常有用;为了更配得上以我的名字命名的数据科学家的头衔,我决定更深入一点,花几个小时阅读的原始论文,试图理解 XGBoost 实际上是什么,以及它如何能够以某种神奇的方式处理缺失值。
从决策树到 XGBoost
决策树可能是机器学习中最简单的算法:树的每个节点是对一个特征的测试,每个分支代表测试的一个结果;树叶包含模型的输出,无论是离散的标签还是实数。决策树可以被描述为一个函数:
(1)
函数 f 根据树结构 T 基于 m 大小的样本 x 所遵循的从根到叶子的路径分配一个权重 w 。
现在想象有不止一棵决策树,而是 K 棵;最终产生的输出不再是与叶子相关联的权重,而是与每一棵树产生的叶子相关联的权重的总和。
(2)
这些结构不是固定的,与经典梯度下降框架中发生的情况不同,在经典梯度下降框架中,网络结构不变,权重在每一步更新,在每次迭代中添加新的函数(树)以提高模型的性能。为了避免过度拟合和/或非常复杂的结构,误差由两部分组成:第一部分对在第 k 次迭代中获得的模型的良好性进行评分,以及第二部分对与叶子相关联的权重的大小以及所开发的树的深度和结构的复杂性进行惩罚。
(3)
然后,使用二阶梯度统计简化该目标函数,并且——无需输入太多细节——可以直接用于以封闭形式计算与固定树结构相关联的最佳叶的权重。重量可以直接与误差相关联,因此与所使用的固定结构的良好性相关联(3)。
训练 XGBoost 是一个迭代过程,它在每一步计算第 k 棵树的最佳可能分裂,枚举在路径中该点仍然可用的所有可能结构。这种对所有可能拆分的详尽列举非常符合本文的范围,但在实践中不可行,它被一种近似的版本所取代,该版本不尝试所有可能的拆分,而是根据每个特性分布的百分位数仅列举与相关的个。
XGBoost 和缺失值:神奇的事情发生在哪里
一旦训练了一个树结构,也就不难考虑测试集中缺失值的存在:为每个决策节点附加一个默认方向就足够了。如果样本的特征丢失,并且判定节点在该特征上分割,则路径采用分支的默认方向,并且路径继续。但是给每个分支分配一个默认的方向更复杂,这可能是本文最有趣的部分。
已经解释过的分裂寻找算法可以稍微调整一下,不仅返回每一步的最佳分裂,还返回分配给新插入的决策节点的默认方向。给定一个特征集 I,,所有可能的分裂都被枚举,但是现在相应的损失不是被计算一次而是两次,对于该特征的缺失值可能采取的每个默认方向一次。根据特征 m 的值 j 进行分割时,两者中最好的一个是要分配的最佳默认方向。最好的分割仍然是最大化计算分数的分割,但是现在我们给它附加了一个默认的方向。
这种算法被称为稀疏感知分裂查找,这也是 XGBoost 背后的魔力所在;最后不太复杂。稀疏感知方法仅保证平均而言采用默认方向会导致给定已经遍历的分裂的最佳可能结果,它不保证已经遍历的分裂(可能通过采用默认方向解决)是考虑整个样本的最佳结果。如果样本中缺失值的百分比增加,内置策略的性能可能会大大下降。
好吧,默认方向是最佳选择,因为它到达了当前位置,但是考虑到当前样本的所有特征,不能保证当前位置是最佳情况。
克服这一限制意味着在处理样本时同时考虑其所有特征和直接处理同一实现中可能同时存在的多个缺失值。
输入缺失值并提高性能
为了击败 XGBoost 内置策略,我们必须同时考虑样本的所有特征,并以某种方式处理样本中可能存在的多个缺失值。这种方法的一个很好的例子是 K-最近邻(KNN ),它具有专门的距离度量来适当地处理缺失值。一般来说,KNN 是一种众所周知的算法,它检索 K 个(例如 3,10,50,…)最接近所考虑样本的样本。它既可用于对未知输入进行分类,也可用于估算缺失值,在这两种情况下,考虑 K 个最近邻,将平均值或中值分配给目标值。这种方法需要距离度量(或者相应地,相似性度量)来实际排列训练集中的所有样本,并检索最相似的 K 个。
为了超越 XGBoost 内置的默认策略,我们需要两件事情:
- 考虑到缺失值的距离度量(感谢 AirBnb 的这篇文章带来的灵感)
Python implementation of the distance metric employed
- 对数据集进行归一化处理,以获得有意义的距离,该距离是对不同属性域的要素之间的差异进行求和而获得的(XGBoost 并不严格要求这样做,但 KNN 插补需要这样做!).
使用 K 个最接近样本的所述特征的中值来估算特征的缺失值,并且在 K 个检索到的邻居中找不到至少一个非缺失值的非常特殊的情况下,使用整个列的中值。
实验结果
我在 scikit-learn 中使用三个著名的免费数据集进行了一些测试(两个分类和一个回归)。已经通过比较三种不同插补策略的 k 倍交叉验证来测量性能:
- 默认的内置在 XGBoost 算法中
- 简单的按列中位数插补
- 如前一段所述的 KNN
对于 KNN 的情况,我已经针对 k (要考虑的邻居数量)和 λ (当两个样本中至少有一个样本的某个特征缺失时,要添加到距离中的常数)绘制了所考虑的缺失值百分比的最佳性能。
Figure 1
使用稀疏感知 KNN 来输入缺失值始终优于其他两种方法。差异的程度当然取决于数据集。第一个天真的结论是:数据集的质量越差,更好的插补策略的影响就越大。如图 2 所示,内置策略最终的性能接近于普通的列式中位数插补。
Figure 2
看到 k 和 λ 如何影响最终结果,以及引入惩罚因子不仅仅是在纸面上是有意义的,这非常有趣。距离度量不仅丢弃缺失值,而且为它们中的每一个增加权重,这对于用这种方法获得的性能是至关重要的,即使它的值与缺失值百分比的增加不直接相关。
Figure 3
测试表明,根据经验法则,缺失值的数量越多,就有越多的邻居需要考虑进行更好的插补。再一次非常直观的结论。
XGBoost:每个人的王者之剑
原文:https://towardsdatascience.com/xgboost-the-excalibur-for-everyone-8009bd015f1e?source=collection_archive---------8-----------------------
Photo by Daniel Mayovskiy on Unsplash
当我发现 XGBoost 算法时,我对它的能力有点怀疑,因为无论我在哪里读到它,每个人都在谈论它有多么伟大和神奇。在进一步挖掘 XGBoost 的“魔法”因素时,我发现它一直是许多 Kaggle 竞赛获胜者的基本元素,在某些情况下,人们将“ only 算法应用于他们的数据集。
自然的做法是从现有的代码样本中测试该算法,亲自看看它有多好。我在我自己的一个正在运行的项目中这样做了,我首先使用随机福里斯特回归器并计算它的平均绝对误差,然后我将相同的数据帧传递给我的 XGB 回归器并计算它的平均绝对误差。结果大相径庭!(比我之前的型号好了近 20%)
在访问 XGBoost 的官方文档时,我发现甚至有一些参数可以进一步调整以获得更好的结果。这太神奇了!没有时间浪费,我快速阅读了文档,并为我的模型添加了一些参数。我得到了一些错误,无法理解这些参数中的大多数在做什么,留下了一些像 n_estimators 和 learning_rate 的错误,但我能够拟合我的模型,结果再次以更好的准确性打破了以前的记录。(增长并不显著,但我猜不同型号之间会有所不同)
我将在这里分享我的一些发现,我相信这些发现会让您很好地了解如何在下一次分析中使用 XGBoost。
一些灵感:
陈天琦开发了 XGBoost,它最初是作为分布式(深度)机器学习社区(DMLC)小组的一部分的一个研究项目。第一次发布是在 2014 年 3 月。
除了使用机器学习和数据分析之外,增强树的功能已经得到了极大的利用。值得一提的是,希格斯玻色子 T21 的发现有可能是通过使用增强的树木实现的。可以看一下这个发现相关的论文。
Bagging 和 Boosting 的区别 XGBoost 是如何工作的
为了理解 XGBoost 是如何工作的,是什么让它变得更好,我们必须理解 Boosted 树与 Random Forrest 有什么不同。
随机福里斯特回归器中使用了装袋概念。Bagging 代表Bootstrap aggregate,这意味着选择一个随机样本并替换。Bagging 算法的基本步骤是从数据集生成 n 个样本(与决策树回归器中形成的单个树相反),单独训练每个样本,并在最后对所有预测进行平均。需要注意的重要一点是装袋减少了我们模型的方差。
在我们的 XGBoost 回归器中使用了 Boosting 概念。在 Boosting 中,我们用来训练每个迷你树的随机样本被挑选出来,并替换加权数据。由于这个事实,我们可以将每个样本称为弱学习者。这些弱学习者中的每一个都基于其分类的准确性被分配一个权重。在这些弱学习者被训练之后,他们的估计的加权平均被用于最后的最终预测。所以我们的弱学习者结合在一起,形成强学习者。
Source: XGBoost
Source: XGBoost
XGBoost 代表极限梯度提升。梯度推进是一种集成方法,它依次添加我们训练过的预测器,并为它们分配一个权重。然而,该方法不是在每次迭代后给分类器分配不同的权重,而是将新模型拟合到先前预测的新残差,然后在添加最新预测时最小化损失。因此,最后,您使用梯度下降来更新您的模型,因此得名梯度推进。回归和分类问题都支持这一点。具体来说,XGBoost 通过在目标函数中添加一个自定义正则项来实现决策树提升算法。
一个好的方法是考虑一个项目组,每个人在一个领域比其他人更好,这些人可以组合在一起成为一个伟大的项目。所以,许多弱学习者成为强学习者。挺实用的!
使用目标函数(损失函数+罚函数)来实现该算法,其中添加了重要的正则化项(罚函数,其将“增强”置于梯度增强中)。
你可以在 XGBoost 介绍页面上阅读更多关于算法工作的内容。
官方发表的陈天琦的论文。
SauceCat 还写了一篇很棒的帖子,深入探讨了算法背后的数学原理以及数据科学方面的代码。
代码中的 XGBoost
使用 XGBoost 回归器就像使用任何其他基于回归的方法一样,比如 Random Forrest。我们遵循相同的方法:
- 清理数据
- 选择重要的参数
- 制作培训和测试集
- 让模型适合您的训练集
- 根据您的测试数据评估您的模型
当然,还有在这之间你可能采取的每一步。
我们认为您已经有了训练和测试数据,并且在拟合模型之前已经执行了所需的步骤。如果您还没有,只需在 Pandas 中制作一个简单的数据框架,并使用 Scikit-Learn 的 train_test_split 函数将您的数据自动拆分为一个训练和测试集。
*from xgboost import XGBRegressor #The library to be importedmodel = XGBRegressor()
model.fit(training_Set_X, training_Set_y, verbose=False)
predictions = model.predict(testing_Set_X)from sklearn.metrics import mean_absolute_error#Computing the MAE of our predictions
print("Mean Absolute Error : " + str(mean_absolute_error(predictions, testing_Set_y)))*
使用 XGBRegressor 的一个更好的方法是利用可以传递给它的附加参数。你可以在下面的截图中看到参数是如何对我们预测的准确性产生巨大影响的。(差异可能会更大或更小,这取决于您的数据集**
XGBRegressor 提供了许多调整参数,可用于显著减少训练时间和准确性。
**
XGBoost 提供的另一个伟大特性是 plot_importance 函数,它可以提供我们的模型的特性及其重要性的图表。
这对于分析我们的模型和评估我们的特性是一个很好的补充。我们可能会选择放弃一些功能,以防它们对我们的模型没有意义。
请务必访问 XGBoost 网站,因为它们提供了对特性和算法的简单易懂的解释,不会让读者被沉重的数学符号所迷惑。(虽然我们看到的大多数与机器学习相关的符号都只是由求和符号组成,但这个符号有一些让人们害怕的东西。)
我希望这篇介绍足以让您开始使用 XGBoosting(这个名字肯定是 DataScience Block 上最酷的名字)。如果你一直在使用这个算法,请发表你的见解。我会试着更新这篇文章来介绍它的数学概念。
xkcd.com+人工智能
原文:https://towardsdatascience.com/xkcd-com-artificial-intelligence-a4cbf6303b1e?source=collection_archive---------6-----------------------
这篇文章向您展示了我们如何使用数据科学、深度学习和肘部油脂来创建 xkcd.com 漫画分类器。我们可以从漫画的描述中预测漫画的主题。
xkcd is an excellent example of time well wasted.
我的朋友圈里有一个巨大的书呆子迷恋兰道尔·门罗,xkcd 漫画的作者,还有像如果这样的书?。 Mary Kate MacPherson 主动,为每一部漫画刮抄本,用我的专利分析器代码把抄本变成嵌入向量。然后,她将向量和标签放入 tensorflow,并使用 t-SNE 将数据分解成簇 T10。那些了解 xkcd.com 的人会很清楚漫画是按顺序编号的。我打赌兰德尔会在漫画编号与当前年份(2018 年)相同时提及,所以我必须尽快发表这篇文章!写这句话的时候,他已经在 2017 年了!
这里有一个视频,展示了降维是如何进行的,有 3D 的也有 2D 的:
Sorry I didn’t have the time to clip and edit the video like I wanted to, so it’s a bit long. Feel free to jump around and see the difference between 2D and 3D, and other settings. A learning rate of 1 worked best for us. The result we used is shown in an annotated screenshot below.
t-SNE 降维的输出是从原始的 300 维嵌入空间压缩下来的 2D 空间中的一串点。
玛丽·凯特·麦克弗森接着查看了 2D 结果上的聚类,以理解它们的含义。下图向我们展示了按主题和实体分类的文章。
This is our look into Randall Munroe’s brain.
纵观全局,我们可以看到关于食物的漫画聚集在一起,关于星球大战、趋势、文字游戏、儿童、图表等等的文章也是如此。作为人类,我们可以识别十几个或更少项目的小集群(例如,kid cluster),但为了做好工作,深度学习希望看到大量的例子,因此我将在下面向您展示如何使用更少的集群建立 xkcd 主题模型。作为背景,xkcd.com 总共有大约 2000 本漫画。
让我们来看看漫画是如何在时间域中聚集的:
Brighter dot = newer comic. Darker dot = older comic.
下面是原始代码:
Original patent application to vectors code… but comics are way more fun!
在 python 中应用 t-SNE 和 GMM ,我们得到以下集群:
Not super nice clumps. Let’s try again….
当我们看到像上面这样的星团时,这不是一个好结果。我们希望在有数据的地方看到簇,在簇之间看到空洞。这让我想起我经常从我的一个朋友那里听到的一句话“ ”未来已经在这里了——只是不是很均匀地分布 。因此,当我们看到这样的均匀分布时,这通常意味着我们需要再试一次。
以下是我们希望看到的分离类型的示例:
This MNIST example looks way better than what we got from our python code so far… Source: this online book.
The color of each dot shows the cluster membership for that dot. There are still not as nice separations as we saw with the embedding projector…
我想我找到 tensorboard 和我的 python 代码不匹配的原因了。我在 25 岁而不是 12 岁时感到困惑。DOH。现在我改变了 2D 和 3D 困惑值,并重新运行代码。以下是我们得到的结果:
Each color is a different cluster. It looks quite similar to the original non-working example… But a later version worked amazing, as you will see…
2D slice of the 3D t-SNE results. Clusters 4 and 6 are pretty mixed up.
我对 2D t-SNE 的结果很满意,但是 GMM 没有做好细分工作:
More separation than the last time.
归一化t-SNE 之前的 300 列给了我们这个结果:
Let’s just go for it…
让我们退出对 t-SNE 的研究,试着去理解集群,但首先这里是用来做这些事情的数据…
提醒您一下,我们已经使用漫画创建了一个主题模型。这里是每个漫画的主题模型向量,这里是每个漫画的主题标签(只是整数)。我已经把一些东西组织到了 github repo 中,以满足你的编码乐趣。
下面是使用上述自动化方法为每个漫画制作的聚类数据帧: 3D 和 2D 。这是在 2D 和 3D 中应用 t-SNE 的笔记本。下面是使用下面描述的手动方法为每个漫画(10 个聚类的样本)制作的聚类标签(只是整数)。
这一切意味着什么?
以下是我们对由 GMM 聚类的 3D t-SNE 数据的聚类解释:
来自该 3D 数据集的聚类示例有:零(问题)一(技术)两(图形)三(日期+地点)四(时间)五(思考的东西)六(帽子!是的,帽子!)、七(烂东西)八(数学)九 (interwebz)。
以下是我们对使用嵌入式投影仪手工创建的 2D 星团数据的解读:
来自这个数据集中的聚类例子有:一个(时间)两个(哲学)三个(科学)四个(视角)五个(兴奋)六个(梅根)七个(计算机网页)八个(连字符)九个(科技),以及十个(思维素材)。
特别感谢玛丽·凯特·麦克弗森为集群标记做了所有的体力劳动,也感谢马修·勒梅让她来做这件事。
要手动制作您自己的分类标签…
为了手动获得聚类(标签),我们运行 10,000 次 t-SNE 迭代(学习率= 1;困惑= 12 ),而不是使用聚类(k-means 或 GMM ),我们只是目测它,并提取每个聚类的 id。我非常喜欢你们这些读者能够前往 projector.tensorflow.org 完全复制这个实验。
下面是如何自己“手动”完成这项工作的大图:
This is the picture of the hand-made data we used.
现在让我们一步一步地来看:
1)加载数据
以下是嵌入式投影仪中数据交互版本的链接:
** [## xkcd 嵌入式投影仪太酷了
可视化高维数据。](http://projector.tensorflow.org/?config=https://gist.githubusercontent.com/dcshapiro/6e04db42f17ac310fc5260684b2b9508/raw/b0b4b1ed32442620c9a9810b4abe7bb1429cb623/template_projector_config.json)
2)运行 t-SNE。当你觉得聚类看起来不错的时候就停下来。
3)通过使用注释工具拖动来手动创建聚类
This is the tool you want
Drag the tool to make a box over the points you want to label. We can see that the cluster includes samples such as 1834, 128, 307, 459, 89, and 477. They are about disaster, pain, disaster, angry exclamation… I see a pattern.
The points will show up in the list on the right hand side
4)检查右边列表的来源,复制出列表的 HTML DIV(我知道:gross,它有一个限制 100,所以你没有得到大集群的所有数据)
5)在 notepad++中用空格替换所有 HTML。为此,只需转到替换菜单(CTRL+H ),用空格字符替换此正则表达式:
<[^>]+>
现在用单空格替换所有双空格,直到只剩下单空格,然后用换行符替换所有单空格。去掉第一个空格字符,我们现在有了这个集群的 id 列表。对每个集群重复上述步骤,直到覆盖了您关心的所有集群。砰。完成了。
您可以在 python 或 excel 中将所有聚类合并到一个文件中。这里很容易看出我们是如何构建主题模型的熊猫数据框架的。
预测的东西!
如果能建立一个 xkcd 的主题模型,并且 预测 给定漫画是关于什么样的主题,那就太棒了。
我们知道输入(X)是漫画的主题模型向量和漫画的升序 ID,预测(Y)是聚类标签。因此,我们知道这是一个分类问题,需要一个 softmax,MLP (DNN)似乎适合这个工作。
这是我们在 3D t-SNE 数据集上使用的网络(random_state=42!):
model = Sequential()
model.add(Dense(128, activation='relu', input_dim=X_train.shape[1]))
model.add(Dropout(0.5))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(y_train.shape[1], activation='softmax'))
我们从这个网络中得到了非常好的预测(89%的准确率):
Confusion Matrix
[[11 0 0 1 0 0 0 0 0 0]
[ 0 27 0 0 0 0 1 2 1 1]
[ 0 2 11 0 0 0 0 0 4 2]
[ 0 1 0 16 0 0 0 0 0 0]
[ 0 0 0 0 24 0 1 1 0 0]
[ 1 0 0 1 0 25 0 0 0 0]
[ 0 0 0 0 1 0 18 0 0 0]
[ 0 0 0 0 0 0 0 12 0 0]
[ 0 0 0 0 0 0 0 0 23 0]
[ 0 2 0 0 0 0 0 0 0 13]]
如果你真的在玩这个数据集,那么听到你的结果将会很棒!我相信兰德尔会很高兴我们都厌倦了他多年来的涂鸦。
快乐 xkcd 编码,
丹尼尔
daniel@lemay.ai ←打个招呼。
LEMAY . AI
1(855)LEMAY-AI
您可能喜欢的其他文章:
- 人工智能和不良数据
- 人工智能的图像数据集
- 人工智能:让你的用户给你的数据贴标签**
另一个文本生成项目
原文:https://towardsdatascience.com/yet-another-text-generation-project-5cfb59b26255?source=collection_archive---------1-----------------------
我对深度学习比较陌生。我正努力尽快赶上进度,但我担心在这个过程中我可能会挖出一些旧东西。从我初学者的角度来看,文本生成还是很刺激的!我希望我能通过这篇文章和附带的知识库帮助一些人…
和很多人一样,我是在看了 Andrej Karpathy 的著名博文:《递归神经网络的不合理有效性》后爱上递归神经网络(RNN)的。这篇文章令人大开眼界,它证明了 RNN 在学习序列数据方面有多好,以及一个训练有素的网络如何可以用来生成新的和类似的数据。
在他的文章中,要学习的序列数据是文本。文本被认为是一串相继出现的字符。一个基于 RNN 的神经网络被训练来从前面的字符序列中预测下一个字符。这种网络通常被称为“char-rnn”。
为了更好地工作,网络从字符序列中学习高级概念。它逐渐了解数据中越来越多有趣的方面。它可以学习单词和如何拼写单词,如何尊重良好的语法,最终,它可能能够生成或多或少有意义的带标点的句子。对于最后一部分,为了生成从头到尾都有意义的长句(甚至是更大的任务,如生成整个故事),网络必须学会保存和管理大量的上下文(这很难)。
多年来,相关代码已经被移植到更新的深度学习库中,如谷歌的 tensorflow ,以及高级 API keras 。RNN 的生成性用法现在非常流行。然而,让我开始这个主题的是一个应用程序的想法(我以为我首先想到的,我太天真了)。
特朗普机器人军队
由于唐纳德·特朗普的言论非常有趣,我想,作为一个个人项目,我可以训练一个神经网络来产生更多的言论,也许我可以通过阅读结果来获得一两个笑声。很快就发现我不是第一个有这个想法的人。
我发现的一些项目可以追溯到 2015 年,像这个叫做 RoboTrump 的项目,网络在单词级别工作(下一个单词预测)。
有些是特朗普在总统竞选中还是局外人时创造的,他们几乎不知道:
“我写这篇文章的时候,美国正在进行总统选举。这次我们有一些不寻常的候选人,我想看看 RNN 能从他们的演讲中学到多少有趣的东西。”deeplearningathome.com
最成功的似乎是 @DeepDrumpf (有自己的推特账号)。它甚至引起了我们最喜欢的 char-rnn 专家的注意:
足够的考古学,回到我(非革命的)对这个主题的看法。
我对特朗普的看法
我用 Keras 2.0.6 创建了一个 char-rnn(用 tensorflow 后端)。在这个地址的什么都有。它采用两个 python 笔记本的形式,一个用于训练,一个用于测试。您可以使用数据集,从头开始训练模型,或者跳过这一部分,使用提供的权重来玩文本生成(玩得开心!).
注意:训练代码是“多 GPU 兼容”。根据我的经验,如果输入网络的序列很长(例如 120 个),可以显著减少训练时间。对于双 GPU,我每个时期的时间减少了 56%。
收集和清理数据
我基于特朗普推特档案建立了一个文本数据集,这是一个所有总统推特的最新档案(从 2009 年开始约有 32000 条推特)。
这表示 3.3MB 的文本数据,大约是 350 万个字符。据我所知,对于我们要做的事情来说,它并不是很大。
字符“词汇”按顺序固定为 98 个可打印的 ASCII 字符(在稳定的词汇上工作有助于改变模型的用途)
数据准备
训练基于向网络输入 60 个字符的固定大小的序列。使用我的 GPU,我能够处理包含 512 个样本的大批量数据。
一批是 512 个 60 个字符的序列的列表。每个字符只能是词汇表中 98 个可用条目中的一个。对于每个 60 个字符的序列,预期的输出是第 61 个字符。预测只是一个步骤(长度为 1 的序列)。
准备这些批次会占用大量内存。因此,批量创建是在训练时实时完成的。
模型架构和培训
该建筑的灵感来自弗朗索瓦·乔莱(Franç ois Chollet)的作品,该作品可在 Keras repository 中找到(它本身源自卡帕西的作品)。
神经网络有 4 个堆叠的 512 单元 LSTM 层,每一层后面都有 20%随机神经元丢失用于正则化。
最后一个递归层被设置为只返回其最终状态(一步)。
一个全连接的常规层获取大小为 512 的“隐藏”向量,并将其带回词汇表的大小(98)。
最后一个处理是将 softmax 函数应用于该向量,使其成为字符概率分布。
最后,使用 Adam 优化器训练网络,以最小化交叉熵损失函数(或多或少分布之间的距离)。
经过十几代的训练,输出开始听起来连贯。
注意:对于 Keras 鉴赏家,我使用“无状态”模式进行训练,这意味着在两个(甚至连续的)60 个字符的序列之间的网络中没有保存任何东西。但是,在生成文本时,网络以 1 对 1 字符的“有状态”模式使用(RNN 单元状态从不重置)
模型检验
这个模型现在可以用来生成类似 Trump 的文本。可以给网络一个种子(一些文本)来预热,并在生成过程中 100%自主之前获得一些上下文。
在生成的同时也加入了一些即兴创作。在每一步中,所选择的字符并不总是网络输出中概率最高的字符。这个额外的步骤防止了循环,并给出了更多的人工结果。
下面是一个低多样性的例子:
[I, Donald J. Trump, president of the United ]States of The Apprentice and the world in the world that we have to be a great trade deal and the people of the World Trade Center in the world that we have to be a great person to be a great problem.
同样的种子和更高的多样性:
[I, Donald J. Trump, president of the United ]States. Were going to have you to say what happens to try to make America great again. We're going to tell you that we have to win. We owe $100.
这个模型本身很有趣,但它很少连贯。它无法长时间保持上下文。很容易看到网络忘记了不久前开始的事情。
60 个字符的序列长度相对较短可能是一个原因。该长度决定了训练时梯度可以向后传播多远(随时间截断的反向传播)。更大的“回顾”可以使学习更长的依赖性成为可能。例如,一个经过理想训练的 char-rnn 应该能够跟踪引号和括号,以便确保将它们关闭,记住当前句子的主题等。
糟糕的结果也可能来自数据本身。可能是尺寸太有限了。此外,推特可能不是学习语言的最佳方式。Tweets 很短并且独立,它们包含奇怪的文本,比如 URL 和用户句柄等等。
最后的测试…
基于该网络了解到的一切,它能回答一个真正的问题吗:covfefe 推文的真正结局是什么?
以下是以推文开头为种子的一些尝试:
[Despite the constant negative press cov]erage. I was going to be great. But if they’re going to stop the good guy who has a big night.[Despite the constant negative press cov]erage. Looking forward to it. The fundraisers are totally promised by the Central Park South...[Despite the constant negative press cov]erage lines to Trump Tower. That’s not the relationships. It doesn’t have to be a disaster to Iraq.[Despite the constant negative press cov]erage car millions of people and spot. We are going to come back. We have to go to golf.
看起来他真的是指报道…强大的 Covfefe 被错误的召唤了。
这个故事到此结束。如果你喜欢,可以关注我的 中 或 推特 获取最新消息。如果你喜欢美食,你可能会喜欢阅读 这篇 。如果你更喜欢《权力的游戏》, 去那里 。
另外,如果你发现有什么不对的地方,或者有任何问题,欢迎在下面评论。
另一个推特情绪分析第一部分——解决阶级不平衡
原文:https://towardsdatascience.com/yet-another-twitter-sentiment-analysis-part-1-tackling-class-imbalance-4d7a7f717d44?source=collection_archive---------2-----------------------
Photo by Piret Ilver on Unsplash
不久前,我在 Twitter 情绪分析上完成了 11 篇系列博文。为什么我要再做一次情感分析?我想进一步扩展,对真实检索的推文进行情感分析。我之前的情感分析项目还有其他限制。
- 该项目停止在最终的训练模型上,并且缺乏对检索到的推文的模型应用
- 该模型仅在正面和负面类别上训练,因此它缺乏预测中性类别的能力
关于中性类别,可以为负面、中性和正面类别设置阈值,并将最终输出概率值映射到三个类别中的一个,但我想用训练数据训练一个模型,该模型有三个情感类别:负面、中性和正面。
因为我已经写了一个相当长的关于 NLP,情感分析的系列文章,如果一个概念已经在我以前的文章中提到过,我就不详细解释了。此外,主要的数据可视化将与检索到的 tweets 有关,我不会对我用于训练和测试模型的数据进行大量的数据可视化。
除了我将附上的简短代码块,你可以在这篇文章的末尾找到整个 Jupyter 笔记本的链接。
数据
为了训练我的情感分类器,我需要一个满足以下条件的数据集。
- 优选地,推特带有注释情感标签的文本数据
- 有 3 个情绪等级:消极,中立,积极
- 大到可以训练一个模特
当我在谷歌上寻找一个好的数据源时,我了解到了一个著名的 NLP 竞赛,叫做 SemEval。 SemEval(语义评估)是正在进行的一系列计算语义分析系统的评估,由 SIGLEX 组织,SIGLEX 是计算语言学协会词汇方面的特别兴趣小组。
如果你对 NLP 感兴趣,你可能已经听说过这个。来自世界各地的高技能团队在几个任务上竞争,例如“语义文本相似度”、“多语言语义单词相似度”等。比赛任务之一是推特情感分析。它也有几个子任务,但我想重点关注的是“子任务 a .:消息极性分类:给定一条消息,分类该消息是正面、负面还是中性情绪”。
幸运的是,他们为比赛提供的数据集可供下载。训练数据由 SemEval 之前的训练和测试数据组成。更棒的是他们提供测试数据,所有参赛的队伍都是用同样的测试数据打分。这意味着我可以将我的模型性能与 2017 年 SemEval 的参与者进行比较。
我先下载了 SemEval 2017 Task 4 的全训数据。
总共有 11 个 txt 文件,跨度从 SemEval 2013 到 SemEval 2016。当试图将文件读入熊猫数据帧时,我发现两个文件不能作为 tsv 文件正确加载。似乎有一些条目没有正确地用制表符分隔,所以最终会有 10 条或更多的推文粘在一起。我本来可以尝试用提供的 tweet ID 来检索它们,但是我决定先忽略这两个文件,用 9 个 txt 文件组成一个训练集。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')%matplotlib inline
%config InlineBackend.figure_format = 'retina'
一旦我导入了基本的依赖项,我将把数据读入熊猫数据框架。
import glob
path ='Subtask_A/'
all_files = glob.glob(path + "/twitter*.txt")
frame = pd.DataFrame()
list_ = []
for file_ in all_files:
df = pd.read_csv(file_,index_col=None, sep='\t', header=None, names=['id','sentiment','text','to_delete'])
list_.append(df.iloc[:,:-1])
df = pd.concat(list_)df = df.drop_duplicates()
df = df.reset_index(drop=True)
df.tail()
数据集看起来相当简单,有单独的 tweet ID、情感标签和 tweet 文本。
df.info()
总共有 41705 条推文。作为另一项健全性检查,让我们看看每条推文中有多少单词。
df['token_length'] = [len(x.split(" ")) for x in df.text]
max(df.token_length)
df.loc[df.token_length.idxmax(),'text']
好的,令牌长度看起来很好,最大令牌长度的 tweet 看起来像是一个正确解析的 tweet。让我们来看看数据的类别分布。
df.sentiment.value_counts()
数据不平衡,负类的数据条目最少,为 6,485 个,中性类的数据条目最多,为 19,466 个。我想重新平衡数据,这样我至少在训练时会有一个平衡的数据集。我将在定义清洗函数后处理这个问题。
数据清理
数据清理过程与我之前的项目类似,但这次我添加了一个很长的收缩列表,以将大多数收缩形式扩展为其原始形式如“不要”到“不要”。这一次,我使用 Spacy 而不是 Regex 来解析文档,并过滤数字、URL、标点符号等。以下是我清理推文的步骤。
- 解码:unicode 字符前的多余“\”的 unicode_escape,然后是 unidecode
- 撇号处理:人们用两个字符来表示缩写。“'”(撇号)和“'”(单引号)。如果这两个符号都用于收缩,将很难检测和正确映射正确的展开形式。所以任何“'”(撇号)都改成“'”(单引号)
- 收缩检查:检查是否有收缩形式,并将其替换为原始形式
- 解析:已完成空间解析
- 使用 Spacy 方法过滤标点、空格、数字、URL,同时保持 hashtag 的文本内容完整
- 移除@提及
- Lemmatize:使用 Spacy 方法对每个标记进行 lemma tize。引理 _ '。代词保持原样,因为 Spacy lemmatizer 将每个代词转换为“-PRON-”
- 特殊字符删除
- 单音节标记去除
- 拼写纠正:这是一个简单的拼写纠正,处理重复的字符,如“sooooo goooood”。如果同一个字符重复出现两次以上,它会将重复次数缩短为两次。例如,“sooooo goooood”将被转换为“soo good”。这不是一个完美的解决方案,因为即使在纠正之后,在“soo”的情况下,它也不是正确的拼写。但是通过将“sooo”、“sooo”、“sooooo”变成同一个单词“soo ”,至少有助于减少特征空间
好了,现在让我们看看这个自定义清理器是如何处理推文的。
pd.set_option('display.max_colwidth', -1)
df.text[:10]
[spacy_cleaner(t) for t in df.text[:10]]
看起来它正在做我想让它做的事情。我将清理“text”列,并创建一个名为“clean_text”的新列。
df['clean_text'] = [spacy_cleaner(t) for t in df.text]
通过运行清理功能,我可以看到它遇到了一些“无效的转义序列”。让我们看看这些是什么。
for i,t in enumerate(df.text):
if '\m' in t:
print(i,t)
包含“\m”的推文实际上包含一个表情符号“\m/”,我在谷歌上搜索后才知道这件事。显然, '\m/'代表你用手做的喇叭手势。这种手势在金属音乐中很流行。无论如何,这只是一个警告,而不是一个错误。让我们看看清洁工是如何处理这个问题的。
df.text[2064]
spacy_cleaner(df.text[2064])
这看起来又像是在做我想让它做的事情。到目前为止一切顺利。
不平衡学习
"在分类问题中,当某些类别的实例比其他类别多得多时,通常会出现类别不平衡问题。在这种情况下,标准分类器往往会被大类淹没,而忽略小类。
正如我已经意识到的,训练数据并不是完全平衡的,“中立”类的数据是“消极”类的 3 倍,“积极”类的数据是“消极”类的 2.4 倍。我将尝试用三种不同的数据拟合一个模型;过采样、下采样、原始,以了解不同的采样技术如何影响分类器的学习。
我将用来比较不同数据集性能的简单默认分类器是逻辑回归。从我以前的情感分析项目中,我了解到 Tf-Idf 和逻辑回归是一个非常强大的组合。在我应用任何其他更复杂的模型,如人工神经网络,美国有线电视新闻网,RNN 等,与逻辑回归的性能将有望给我一个好主意,我应该选择哪些数据采样方法。如果你想更多地了解 Tf-Idf,以及它如何从文本中提取特征,你可以查看我的旧帖子,“另一个使用 Python 的 Twitter 情绪分析-第 5 部分”。
在验证方面,我会使用 K 重交叉验证。在我之前的项目中,我把数据分成三份;训练、验证、测试和所有参数调整都是用保留的验证集完成的,最后将模型应用于测试集。考虑到我有超过一百万的数据用于训练,这种验证集方法是可以接受的。但是这一次,我拥有的数据要小得多(大约 40,000 条推文),通过从数据中省去验证集,我们可能会省去关于数据的有趣信息。
原始不平衡数据
from sklearn.pipeline import Pipelineoriginal_pipeline = Pipeline([
('vectorizer', tvec),
('classifier', lr)
])lr_cv(5, df.clean_text, df.sentiment, original_pipeline, 'macro')
对于没有任何重采样的数据,我们可以看到精度高于召回率。如果你想了解更多关于精确度和召回率的知识,你可以查看我的旧帖子,“T2,另一个使用 Python 的 Twitter 情绪分析——第四部分”。
如果我们仔细观察每一次折叠的结果,我们还可以看到,否定类别的召回率很低,大约为 28~30%,而否定类别的准确率高达 61~65%。这意味着分类器非常挑剔,不认为许多事情是负面的。它归类为负面的所有文本有 61~65%的时间确实是负面的。然而,它也错过了很多实际的负面类,因为它非常挑剔。我们的召回率很低,但是准确率很高。这种精确和回忆背后的直觉来自 Andreas Klintberg 的媒体博客。
过采样
有一个非常有用的 Python 包叫做“unbalanced-Learn”,它帮助你处理类不平衡问题,它与 Scikit Learn 兼容,并且易于实现。
在不平衡学习中,可以使用不同的技术进行过采样。我会用两个以下。
- RandomOverSampler
- 合成少数过采样技术
如果使用过采样数据进行交叉验证,还有一点需要考虑。如果在交叉验证之前过采样,过采样少数类会导致过拟合问题。为什么会这样呢?因为通过在交叉验证拆分之前进行过采样,您已经将验证数据的信息泄露给了您的训练集。就像他们说的“已经看到的,不能再看不见了。”
如果你想要更详细的解释,我推荐这个 Youtube 视频"机器学习——过- &欠采样——Python/Scikit/Scikit-imb learn"
幸运的是,我在上面定义为“lr_cv()”的交叉验证函数将只适合交叉验证拆分后的训练集拆分,因此它不会向模型泄露任何验证集的信息。
RandomOverSampler
随机过采样只是重复少数类的一些样本并平衡数据集中类之间的样本数量的过程。
from imblearn.pipeline import make_pipeline
from imblearn.over_sampling import ADASYN, SMOTE, RandomOverSamplerROS_pipeline = make_pipeline(tvec, RandomOverSampler(random_state=777),lr)
SMOTE_pipeline = make_pipeline(tvec, SMOTE(random_state=777),lr)
在我们安装每个管道之前,让我们看看 RadomOverSampler 是做什么的。为了更容易看到,我在下面定义了一些玩具文本数据,以及每个文本的目标情感值。
sent1 = "I love dogs"
sent2 = "I don't like dogs"
sent3 = "I adore cats"
sent4 = "I hate spiders"
sent5 = "I like dogs"
testing_text = pd.Series([sent1, sent2, sent3, sent4, sent5])
testing_target = pd.Series([1,0,1,0,1])
我的玩具数据一共 5 个条目,目标情绪是三正两负。为了平衡,这个玩具数据需要多一个负类的条目。
一件事是采样器将无法处理原始文本数据。它必须被转换到一个特征空间,过采样器才能工作。我将首先安装 tfidf 矢量器,并使用文本的 Tf-Idf 表示进行过采样。
tv = TfidfVectorizer(stop_words=None, max_features=100000)
testing_tfidf = tv.fit_transform(testing_text)
ros = RandomOverSampler(random_state=777)
X_ROS, y_ROS = ros.fit_sample(testing_tfidf, testing_target)
pd.DataFrame(testing_tfidf.todense(), columns=tv.get_feature_names())
pd.DataFrame(X_ROS.todense(), columns=tv.get_feature_names())
通过运行 RandomOverSampler,现在我们在末尾多了一个条目。RandomOverSampler 添加的最后一个条目与从顶部开始的第四个条目(索引号 3)完全相同。RandomOverSampler 只是重复少数类的一些条目来平衡数据。如果我们看看 RandomOverSampler 之后的目标情绪,我们可以看到它现在通过添加更多的负面类条目而在类之间达到了完美的平衡。
y_ROS
lr_cv(5, df.clean_text, df.sentiment, ROS_pipeline, 'macro')
与用原始不平衡数据建立的模型相比,现在的模型表现相反。负类的准确率在 47~49%左右,但是召回率要高得多,在 64~67%之间。现在我们面临着高召回率,低准确率的局面。这意味着分类器认为很多东西是负面的。然而,它也认为大量的非否定性文本是否定性的。所以从我们的数据集中,我们得到了许多被归类为否定的文本,它们中的许多在实际否定集中,然而,它们中的许多也是非否定的。
但是在没有重采样的情况下,负类的召回率低至 28~30%,而通过重采样得到的负类的精确率在 47~49%左右。
另一种方法是看 f1 分数,它是精确度和召回率的调和平均值。原始不平衡数据的准确率为 66.51%,F1 值为 60.01%。然而,采用过采样时,我们得到的精度略低,为 65.95%,但 F1 值却高得多,为 64.18%
合成少数过采样技术
SMOTE 是一种过采样方法,其中通过创建“合成”样本对少数类进行过采样,而不是通过替换进行过采样。
根据最初的研究论文“SMOTE:Synthetic Minority Over-sampling Technique”(Chawla et al .,2002),“合成样本以如下方式生成:取所考虑的特征向量(样本)与其最近邻之间的差。将该差乘以 0 和 1 之间的随机数,并将其添加到所考虑的特征向量中。这导致沿着两个特定特征之间的线段选择一个随机点。这种方法有效地迫使少数类的决策区域变得更普遍。”这意味着当 SMOTE 创建一个新的合成数据时,它将选择一个数据进行复制,并查看其 k 个最近的邻居。然后,在特征空间上,它将在原始样本和它的邻居之间的特征空间中创建随机值。
一旦你看到玩具数据的例子,它会变得更加清晰。
smt = SMOTE(random_state=777, k_neighbors=1)
X_SMOTE, y_SMOTE = smt.fit_sample(testing_tfidf, testing_target)
pd.DataFrame(X_SMOTE.todense(), columns=tv.get_feature_names())
最后一个条目是 SMOTE 创建的数据。为了更容易看出,我们只看负类。
pd.DataFrame(X_SMOTE.todense()[y_SMOTE == 0], columns=tv.get_feature_names())
上面的两个条目是原始数据,下面的一个是合成数据。你可以看到它不只是重复原始数据。相反,Tf-Idf 值是通过取前两个原始数据之间的随机值来创建的。如您所见,如果两个原始数据的 Tf-Idf 值都为 0,那么合成数据的这些特征也为 0,如“adore”、“cactus”、“cats”,因为如果两个值相同,则它们之间没有随机值。对于这个玩具数据,我特意将 k_neighbors 定义为 1,因为只有两个负类条目,如果 SMOTE 选择一个进行复制,那么就只剩下一个其他的负类条目作为邻居。
现在让我们来拟合 SMOTE 管道,看看它如何影响性能。
lr_cv(5, df.clean_text, df.sentiment, SMOTE_pipeline, 'macro')
与随机过采样相比,SMOTE 采样似乎具有略高的精度和 F1 值。根据目前的结果,似乎选择 SMOTE 过采样比原始或随机过采样更可取。
向下采样
下采样怎么样?如果我们在上述过采样中对少数类进行过采样,利用下采样,我们试图减少多数类的数据,从而使数据类平衡。
from imblearn.under_sampling import NearMiss, RandomUnderSamplerRUS_pipeline = make_pipeline(tvec, RandomUnderSampler(random_state=777),lr)
NM1_pipeline = make_pipeline(tvec, NearMiss(ratio='not minority',random_state=777, version = 1),lr)
NM2_pipeline = make_pipeline(tvec, NearMiss(ratio='not minority',random_state=777, version = 2),lr)
NM3_pipeline = make_pipeline(tvec, NearMiss(ratio=nm3_dict,random_state=777, version = 3, n_neighbors_ver3=4),lr)
随机欠采样器
同样,在我们运行管道之前,让我们将它应用于玩具数据,看看它能做什么。
rus = RandomUnderSampler(random_state=777)
X_RUS, y_RUS = rus.fit_sample(testing_tfidf, testing_target)
pd.DataFrame(X_RUS.todense(), columns=tv.get_feature_names())
pd.DataFrame(testing_tfidf.todense(), columns=tv.get_feature_names())
与原始不平衡数据相比,我们可以看到下采样数据少了一个条目,这是原始数据中属于正类的最后一个条目。RandomUnderSampler 通过从多数类中随机移除数据来减少多数类。
lr_cv(5, df.clean_text, df.sentiment, RUS_pipeline, 'macro')
现在准确性和 F1 的分数已经明显下降。但低精度和高召回率的特点与过采样数据相同。只是整体表现下降了。
差点错过
根据“不平衡学习”的文档,“ NearMiss 增加了一些启发式规则来选择样本。NearMiss 实现了 3 种不同类型的启发式算法,可通过参数 version 进行选择。NearMiss 启发式规则基于最近邻算法。
还有一篇关于重采样技术的好论文。“用于改善不平衡数据集分类性能的重采样技术调查”(Ajinkya More,2016 年)
我借用了莫尔论文中对 NearMiss 三个不同版本的解释。
近距离-1
在 NearMiss-1 中,来自多数类的那些点到少数类中 k 个最近点的平均距离最低的点被保留。这意味着它将保持与少数阶级相似的多数阶级的观点。
nm = NearMiss(ratio='not minority',random_state=777, version=1, n_neighbors=1)
X_nm, y_nm = nm.fit_sample(testing_tfidf, testing_target)
pd.DataFrame(X_nm.todense(), columns=tv.get_feature_names())
pd.DataFrame(testing_tfidf.todense(), columns=tv.get_feature_names())
我们可以看到,NearMiss-1 已经删除了文本“I adore cats”的条目,这是有意义的,因为单词“adore”和“cats”都只出现在该条目中,因此使其在特征空间中的 Tf-Idf 表示方面与少数民族类最不同。
lr_cv(5, df.clean_text, df.sentiment, NM1_pipeline, 'macro')
看起来准确性和 F1 分数都比随机欠采样差。
近地小行星-2
与 NearMiss-1 相反,NearMiss-2 保留了多数类中那些到少数类中 k 个最远点的平均距离最低的点。换句话说,它会保留多数阶级与少数阶级最大的不同点。
nm = NearMiss(ratio='not minority',random_state=777, version=2, n_neighbors=1)
X_nm, y_nm = nm.fit_sample(testing_tfidf, testing_target)
pd.DataFrame(X_nm.todense(), columns=tv.get_feature_names())
pd.DataFrame(testing_tfidf.todense(), columns=tv.get_feature_names())
现在我们可以看到,NearMiss-2 删除了文本“我喜欢狗”的条目,这也是有意义的,因为我们也有一个负面条目“我不喜欢狗”。两个条目在不同的类中,但是它们共享两个相同的标记“like”和“dogs”。
lr_cv(5, df.clean_text, df.sentiment, NM2_pipeline, 'macro')
与 NearMiss-1 相比,准确性和 F1 得分甚至更低。我们还可以看到,所有指标在不同的筹码之间波动很大。
NearMiss-3
最后的 NearMiss 变体 NearMiss-3 为少数类中的每个点选择多数类中的 k 个最近邻。在这种情况下,欠采样比率直接由 k 控制。例如,如果我们将 k 设置为 4,则 NearMiss-3 将选择每个少数类条目的 4 个最近邻居。
然后,我们将根据我们设置的 n 个邻居,得到比少数类更多或更少的多数类样本。例如,对于我的数据集,如果我在默认 n_neighbors_ver3 为 3 的情况下运行 NearMiss-3,它将会抱怨,并且中性类(在我的数据集中是多数类)的数量将小于负类(在我的数据集中是少数类)。因此,我显式地将 n_neighbors_ver3 设置为 4,这样我将拥有足够多的多数类数据,至少与少数类的数量相同。
有一点我不能完全确定,就是当用 n_neighbors_ver3 参数选择的所有数据都多于少数类时,它应用什么样的过滤。正如您将在下面看到的,在应用 NearMiss-3 之后,数据集达到了完美的平衡。然而,如果算法只是根据 n_neighbors_ver3 参数选择最近的邻居,我怀疑它最终会为每个类提供完全相同的条目数。
lr_cv(5, df.clean_text, df.sentiment, NM3_pipeline, 'macro')
NearMiss-3 产生了 NearMiss 家族中最稳健的结果,但略低于 RandomUnderSampling。
from collections import Counternm3 = NearMiss(ratio='not minority',random_state=777, version=3, n_neighbors_ver3=4)
tvec = TfidfVectorizer(stop_words=None, max_features=100000, ngram_range=(1, 3))
df_tfidf = tvec.fit_transform(df.clean_text)
X_res, y_res = nm3.fit_sample(df_tfidf, df.sentiment)
print('Distribution before NearMiss-3: {}'.format(Counter(df.sentiment)))
print('Distribution after NearMiss-3: {}'.format(Counter(y_res)))
结果
五重交叉验证结果 (用于验证的分类器:默认设置的逻辑回归)
基于上述结果,我将在下一篇文章中使用的采样技术将被 SMOTE。在下一篇文章中,我将使用 SMOTE 过采样数据尝试不同的分类器。
感谢您的阅读,您可以通过以下链接找到 Jupyter 笔记本:
[## tthustlea/yeth _ another _ tiw tter _ 情操 _ 分析 _part1
通过在 GitHub 上创建一个帐户,为另一个 _ tiwtter _ 情操 _ 分析 _part1 开发做出贡献。
github.com](https://github.com/tthustla/yet_another_tiwtter_sentiment_analysis_part1/blob/master/Yet_Another_Twitter_Sentiment_Analysis_part1-Copy1.ipynb)
YOLO 迷上了绵羊:统一目标探测中的环境背景
原文:https://towardsdatascience.com/yolo-is-sheep-obsessed-environmental-context-in-unified-object-detection-91160dafa618?source=collection_archive---------20-----------------------
我最近将约瑟夫·雷德蒙(Joseph Redmond)的 YOLO 算法用于 MATLAB(目前为止没有非最大值抑制),并花了一个小时在一系列图像上测试它。总的来说,这种算法非常有效:
然而,人们很快就会意识到 YOLO 对羊有一点痴迷。请注意下面两张图片中牧羊人和狗的标注错误:
Sheep, Sheep, Sheep….
Sheep, sheep, and some more sheep…
那只看门狗看起来需要度个假。在某个地方,她会觉得自己像一只狗,而不仅仅是羊群中的一只羊:
Impressive Photoshop skills, I know.
那更好。农夫和他的牧羊犬呢?去月球旅行怎么样?
A shepherd and his sneaky looking cow on the old Apollo studio lot in Hollywood (#moonlandingfaked)
公平地说,牧羊犬看起来确实像狡猾的奶牛。
似乎这个统一的对象检测器已经学会在对象环境的上下文中做出它的决定。与其他 CNN 对象检测算法不同,整个图像,包括周围的视觉背景,是通过网络一次馈入的。我喜欢把 CNN 想象成学习一系列越来越复杂的视觉特征来对一个物体进行分类。然而,我认为 YOLO 已经学会了一种便捷的逻辑捷径来解决检测绵羊的问题——绵羊通常是成群出现的。所以,靠近羊的物体更有可能是羊。
让我们测试一下,YOLO 所反应的周围视觉环境是否不是羊群,而是一个相关的视觉线索,比如周围的风景。这是我们的牧羊人和他的物种困惑的牧羊犬在一个领域。不是任何一块田地,而是澳大利亚的一块看起来非常像你可能会发现绵羊的那种贫瘠的地方的田地:
有意思。一个没有羊群的牧羊人仍然是一个人——即使是在田野里(一只牧羊犬仍然是一只偷偷摸摸的牛)。
YOLO 检测算法的这种行为让我想起了最近我听到的一个关于人工智能未来潜在危险的争论。由于没有足够详细地说明学习算法如何找到解决方案,或者没有对算法的解决方案空间进行足够的限制,我们最终可能会得到我们不喜欢的复杂重要问题的解决方案。最近听到的一个例子(可能来自 AI 扫兴者埃隆马斯克?)是一种算法可能“决定”让世界摆脱癌症的最简单方法是让世界摆脱所有动物。
当然,这个意外的物体识别捷径的例子远没有那么可怕。当然,除非该算法正被用于自动分类牲畜,以便在畜牧场屠宰…
还有人注意到 YOLO 或其他统一对象检测算法中的类似错误吗?
基于 OpenCV 和 Python 的 YOLO 物体检测
原文:https://towardsdatascience.com/yolo-object-detection-with-opencv-and-python-21e50ac599e9?source=collection_archive---------3-----------------------
Image Source: darknet github repo
如果你一直在关注物体探测领域的进步,你可能已经习惯了听到“YOLO”这个词。这已经成了一个流行词。
YOLO 到底是什么?
YOLO(你只看一次)是一种进行物体检测的方法。这是代码如何检测图像中的对象背后的算法/策略。
这个想法的官方实现可以通过 DarkNet (作者用 C 从头开始的神经网络实现)获得。它在 github 上可供人们使用。
早期的检测框架以不同的比例多次查看图像的不同部分,并重新利用图像分类技术来检测对象。这种方法既慢又低效。
YOLO 采取了完全不同的方法。它只查看整个图像一次,并通过网络一次,检测对象。因此得名。它非常快。这就是它如此受欢迎的原因。
还有其他流行的对象检测框架,如更快的 R-CNN 和 SSD 也广泛使用。
在这篇文章中,我们将看看如何在 OpenCV 中使用预先训练好的 YOLO 模型,并立即开始检测物体。
OpenCV dnn 模块
DNN(深度神经网络)模块最初是opencv_contrib
repo 的一部分。去年它已经被转移到opencv
repo 的主分支,使用户能够在 OpenCV 本身内部对预训练的深度学习模型进行推理。
(这里需要注意的一点是,dnn
模块不是用来培训的。只是为了对图像/视频进行推理。)
最初只支持 Caffe 和 Torch 型号。随着时间的推移,对 TensorFlow 等不同框架/库的支持正在增加。
最近增加了对 YOLO/暗网的支持。我们将使用 OpenCV dnn 模块和预训练的 YOLO 模型来检测常见对象。
我们开始吧..
说够了。让我们开始写代码。(显然是用 Python)
安装依赖项
要执行我们将要编写的代码,需要做以下事情。
- Python 3
- Numpy
- OpenCV Python 绑定
Python 3
如果你用的是 Ubuntu,很可能已经安装了 Python 3。在终端运行python3
检查是否安装。如果没有安装,请使用
sudo apt-get install python3
对于 macOS,请参考我之前关于 macOS 的深度学习设置的帖子。
如果你需要一个起点,我强烈推荐使用 Python virtualenvironment.
看看我之前的帖子。
Numpy
pip install numpy
这将安装numpy.
确保 pip 链接到 Python 3.x ( pip -V
将显示此信息)
如果需要,使用pip3
。如果尚未安装,使用sudo apt-get install python3-pip
获取pip3
。
OpenCV-Python
您需要从 github上的 master 分支的源代码中编译 OpenCV 来获得 Python 绑定。(推荐)
Adrian Rosebrock 在 PyImageSearch 上就此写了一篇很好的博文。(从主分支下载源代码,而不是从存档下载)
如果您被从源代码获取 OpenCV Python 绑定的指令弄得不知所措,您可以使用
pip install opencv-python
这不是由 OpenCV.org 官方维护的。这是一个社区维护的。感谢奥利-佩卡·海尼索的努力。
命令行参数
该脚本需要四个输入参数。
- 输入图像
- YOLO 配置文件
- 预先训练的 YOLO 举重
- 包含类名的文本文件
所有这些文件都可以在我整理的 github 知识库中找到。(readme 中提供了下载预训练重量的链接。)
您也可以通过键入以下内容在“终端”中下载预训练的重量
wget [https://pjreddie.com/media/files/yolov3.weights](https://pjreddie.com/media/files/yolov3.weights)
这个特定的模型是在微软的 COCO 数据集(上下文中的公共对象)上训练的。它能够检测 80 种常见物体。完整名单见此处。
输入图像可以是你的选择。样品输入可在 repo 中获得。
通过键入以下命令运行脚本
$ python yolo_opencv.py --image dog.jpg --config yolov3.cfg --weights yolov3.weights --classes yolov3.txt
准备输入
读取输入图像并获得其宽度和高度。
读取包含人类可读形式的类名的文本文件,并将类名提取到一个列表中。
为不同的类生成不同的颜色来绘制边界框。
net = cv2.dnn.readNet(args.weights, args.config)
上面一行读取权重和配置文件并创建网络。
blob = cv2.dnn.blobFromImage(image, scale, (Width,Height), (0,0,0), True, crop=False)net.setInput(blob)
上面的线准备输入图像运行通过深度神经网络。
输出图层和边界框
通常,在顺序 CNN 网络中,在末端将只有一个输出层。在我们使用的 YOLO v3 架构中,有多个输出层给出预测。get_output_layers()
函数给出了输出图层的名称。输出层不与任何下一层相连。
draw_bounding_box()
函数在给定的预测区域上绘制矩形,并在方框上写入类名。如果需要,我们也可以写置信值。
运行推理
outs = net.forward(get_output_layers(net))
上面的线是通过网络进行精确前馈的地方。关键时刻到了。如果我们不指定输出图层名称,默认情况下,它将仅从最终输出图层返回预测。任何中间输出层都将被忽略。
我们需要检查来自每个输出层的每个检测,以获得类 id、置信度和边界框角,更重要的是忽略弱检测(具有低置信度值的检测)。
非最大抑制
尽管我们忽略了弱检测,但仍会有许多重复的检测和重叠的边界框。非最大抑制会删除重叠程度高的长方体。
Source: PyImageSearch
最后,我们查看剩下的检测,并在它们周围绘制边界框,显示输出图像。
source
source
I do not own copyright for the images used in this post. All are from Google Images.
摘要
在这篇文章中,我们看了如何使用 OpenCV dnn 模块和预训练的 YOLO 模型来进行物体检测。我们只是触及了表面。物体检测有更多的功能。
我们还可以训练一个模型来检测我们自己感兴趣的对象,这些对象没有包含在预训练的模型中。我将在未来更多地报道对象检测,包括其他框架,如更快的 R-CNN 和 SSD。请务必订阅我的博客,以便在新帖子发布时得到通知。
目前就这些。感谢阅读。我希望这篇文章对开始物体检测有用。欢迎在评论中分享你的想法,或者你可以在 twitter 上联系我。
和平。
YOLO v3 有什么新功能?
原文:https://towardsdatascience.com/yolo-v3-object-detection-53fb7d3bfe6b?source=collection_archive---------0-----------------------
你只看一次,或 YOLO,是一个更快的对象检测算法。虽然它不再是最准确的对象检测算法,但当您需要实时检测时,它是一个非常好的选择,不会损失太多的准确性。
几周前,YOLO 的第三个版本出来了,这篇文章旨在解释 YOLO v3 中引入的变化。这不会是一个解释 YOLO 到底是什么的帖子。我想你知道 YOLO v2 是如何工作的。如果不是这样,我推荐你去看看以下由 Joseph Redmon et all 撰写的论文,了解一下 YOLO 是如何运作的。
- YOLO v1
- YOLO v2
- 一篇关于 YOLO 的好博文
YOLO v3:更好,不是更快,更强
YOLO v2 论文的官方标题似乎是 YOLO 是一种基于牛奶的儿童健康饮料,而不是一种物体检测算法。它被命名为“YOLO9000:更好、更快、更强”。
对于当时的 YOLO 9000 是最快的,也是最准确的算法之一。然而,几年后,RetinaNet 等算法不再是最准确的,SSD 在准确性方面优于它。然而,它仍然是最快的。
但是在 YOLO v3 中,这种速度被用来换取准确性的提高。虽然早期版本在 Titan X 上运行速度为 45 FPS,但当前版本的速度约为 30 FPS。这与称为暗网的底层架构的复杂性增加有关。
暗网-53
YOLO v2 使用定制的深度架构 darknet-19,这是一个最初的 19 层网络,补充了 11 层用于对象检测。YOLO v2 采用 30 层架构,经常难以检测到小物体。这是由于图层对输入进行缩减采样时丢失了细粒度要素。为了补救这一点,YOLO v2 使用了一个身份映射,连接来自前一层的特征映射来捕获低级特征。
然而,YOLO v2 的架构仍然缺少一些最重要的元素,这些元素现在是大多数最先进的算法中的主要元素。没有残余块、没有跳过连接和没有上采样。YOLO v3 包含了所有这些。
首先,YOLO v3 使用了 Darknet 的一个变种,它最初在 Imagenet 上训练了 53 层网络。对于检测任务,在其上堆叠了另外 53 层,为我们提供了一个用于 YOLO v3 的 106 层全卷积底层架构。这就是 YOLO v3 比 YOLO v2 慢的原因。这是 YOLO 建筑现在的样子。
Ok, this diagram took a lot of time to make. I want a clap or ten for this!
三级检测
较新的架构拥有残余跳过连接和上采样。v3 最显著的特点是在三个不同的尺度上进行检测。 YOLO 是一个完全卷积网络,其最终输出是通过在特征图上应用 1 x 1 内核生成的。在 YOLO v3 中,通过在网络中的三个不同位置的三个不同大小的特征图上应用 1×1 检测核来完成检测。
检测核的形状是 1 x 1 x (B x (5 + C))。这里 B 是特征图上的一个单元可以预测的边界框的数量,“5”是 4 个边界框属性和一个对象置信度,C 是类的数量。在 COCO 上训练的 YOLO v3 中,B = 3,C = 80,所以内核大小是 1×1×255。由该内核产生的特征图具有与先前特征图相同的高度和宽度,并且具有如上所述的沿着深度的检测属性。
Image credits: https://blog.paperspace.com/how-to-implement-a-yolo-object-detector-in-pytorch/
在我们进一步讨论之前,我想指出网络的步距,或一个层被定义为它对输入进行下采样的比率。在下面的例子中,我假设我们有一个尺寸为 416 x 416 的输入图像。
YOLO v3 在三个尺度上进行预测,这三个尺度是通过将输入图像的维度分别下采样 32、16 和 8 而精确给出的。
第一次检测由第 82 层进行。对于前 81 层,网络对图像进行下采样,使得第 81 层的步距为 32。如果我们有一个 416 x 416 的图像,那么得到的特征图的大小将是 13 x 13。这里使用 1×1 检测内核进行一次检测,得到 13×13×255 的检测特征图。
然后,来自层 79 的特征图在被 2x 上采样到 26×26 的维度之前经历几个卷积层。该特征图然后与来自层 61 的特征图深度连接。然后,组合的特征图再次经过几个 1×1 卷积层,以融合来自先前层的特征(61)。然后,由第 94 层进行第二次检测,产生 26×26×255 的检测特征图。
再次遵循类似的过程,其中来自层 91 的特征图在与来自层 36 的特征图深度连接之前经历几个卷积层。像以前一样,几个 1×1 卷积层接着融合来自前一层的信息(36)。我们在第 106 层制作最终的 3,产生大小为 52×52×255 的特征地图。
更擅长探测更小的物体
不同层的检测有助于解决检测小物体的问题,这是 YOLO v2 经常遇到的问题。与先前层连接的上采样层有助于保留有助于检测小对象的细粒度特征。
13 x 13 层负责检测大型物体,而 52 x 52 层检测较小物体,26 x 26 层检测中等物体。下面是不同图层在同一对象中拾取的不同对象的对比分析。
锚箱的选择
YOLO v3 总共使用 9 个锚箱。每个刻度三个。如果你在自己的数据集上训练 YOLO,你应该使用 K-Means 聚类来生成 9 个锚。
然后,按维度降序排列锚点。为第一个音阶指定三个最大的锚,为第二个音阶指定接下来的三个,为第三个音阶指定最后三个。
每个图像更多的边界框
对于相同大小的输入图像,YOLO v3 比 YOLO v2 预测更多的边界框。例如,在其 416 x 416 的原始分辨率下,YOLO v2 预测 13 x 13 x 5 = 845 个盒子。在每个网格单元,使用 5 个锚来检测 5 个盒子。
另一方面,YOLO v3 以 3 种不同的比例预测盒子。对于 416×416 的相同图像,预测的框的数量是 10,647。这意味着 YOLO v3 预测的盒子数量是 YOLO v2 预测的 10 倍。你很容易想象为什么它比 YOLO v2 慢。在每个尺度上,每个网格可以使用 3 个锚点预测 3 个盒子。因为有三个秤,所以总共使用 9 个锚箱,每个秤使用 3 个。
损失函数的变化
早些时候,YOLO v2 的损失函数是这样的。
Image credits: https://pjreddie.com/media/files/papers/yolo_1.pdf
我知道这有点吓人,但请注意最后三项。其中,第一个惩罚负责预测对象的包围盒的对象性分数预测(这些的分数理想地应该是 1),第二个惩罚没有对象的包围盒(分数理想地应该是 0),最后一个惩罚预测对象的包围盒的类预测。
YOLO v2 中的最后三项是平方误差,而在 YOLO v3 中,它们被交叉熵误差项所取代。换句话说,YOLO v3 中的对象置信度和类预测现在通过逻辑回归来预测。
当我们训练检测器时,对于每个地面真值框,我们分配一个边界框,它的锚点与地面真值框有最大的重叠。
不要再对课程进行任何修改
YOLO v3 现在对图像中检测到的物体进行多标签分类。
在早期的 YOLO,作者们习惯于对类得分进行软最大化,并将得分最高的类作为包含在包围盒中的对象的类。这在 YOLO 版本 3 中已被修改。
Softmaxing 类基于这样的假设:类是互斥的,或者简单地说,如果一个对象属于一个类,那么它不能属于另一个类。这在 COCO 数据集上运行良好。
然而,当我们在数据集中有像 Person 和 Women 这样的类时,上面的假设就不成立了。这就是为什么《YOLO》的作者没有软化这些阶级的原因。相反,使用逻辑回归来预测每个类别分数,并且使用阈值来预测对象的多个标签。分数高于该阈值的类被分配到盒子。
标杆管理
在 COCO mAP 50 基准测试中,YOLO v3 的性能与 RetinaNet 等其他先进检测器不相上下,但速度要快得多。它也优于固态硬盘及其变体。这是报纸上的表演对比。
YOLO vs RetinaNet performance on COCO 50 Benchmark
但是,但是,但是,YOLO 在 COCO 基准测试中失利,IoU 值较高,用于拒绝检测。我不打算解释 COCO 基准是如何工作的,因为这超出了工作范围,但 COCO 50 基准中的 50 是预测的边界框与对象的地面真实框对齐程度的度量。这里的 50 相当于 0.5 IoU。如果预测和基本事实框之间的 IoU 小于 0.5,则该预测被分类为定位错误并被标记为假阳性。
在基准测试中,这个数字较高(比如 COCO 75),盒子需要更好地对齐,以免被评估标准拒绝。这是 YOLO 被 RetinaNet 超越的地方,因为它的边界框没有 RetinaNet 对齐。这里有一个更广泛的基准测试的详细表格。
RetinaNet outperforms YOLO at COCO 75 benchmark. Notice, how RetinaNet is still better at the AP benchmark for small objects (APs)
做一些实验
您可以使用 Github repo 中提供的代码在图像或视频上运行检测器。代码需要 PyTorch 0.3+,OpenCV 3,Python 3.5。设置 repo,您可以在它上面运行各种实验。
不同的尺度
这里看一下不同的检测层获得了什么。
python detect.py --scales 1 --images imgs/img3.jpg
Detection at scale 1, we see somewhat large objects are picked. But we don’t detect a few cars.
python detect.py --scales 2 --images imgs/img3.jpg
No detections at scale 2.
python detect.py --scales 3 --images imgs/img3.jpg
Detection at the largest scale (3). Look how only the small objects are picked up, which weren’t detected by scale 1.
不同的输入分辨率
python detect.py --reso 320 --images imgs/imgs4.jpg
Input resolution of the image: 320 x 320
python detect.py --reso 416 --images imgs/imgs4.jpg
Input resolution of the image: 416 x 416
python detect.py --reso 608 --images imgs/imgs4.jpg
Here, we detect one less chair than before
python detect.py --reso 960 --images imgs/imgs4.jpg
Here, the detector picks up a false detection, the “Person” at the right
在我们的例子中,较大的输入分辨率帮助不大,但是它们可能有助于检测带有小物体的图像。另一方面,较大的输入分辨率会增加推理时间。这是一个超参数,需要根据应用进行调整。
您可以通过访问 repo 来试验其他指标,如批量大小、对象置信度和 NMS 阈值。自述文件中已经提到了一切。
从头开始实施 YOLO v3
如果你想在 PyTorch 中自己实现一个 YOLO v3 探测器,这里有一系列我在 Paperspace 上写的教程。现在,如果你想尝试本教程,我希望你对 PyTorch 有基本的了解。如果你想从 PyTorch 的初级用户过渡到中级用户,这篇教程正合适。
进一步阅读
- YOLO v3:增量改进
- 地图是怎么算出来的?
YOLO——你只能看一次,实时物体检测解释道
原文:https://towardsdatascience.com/yolo-you-only-look-once-real-time-object-detection-explained-492dc9230006?source=collection_archive---------0-----------------------
原始论文(CVPR 2016。OpenCV 人民选择奖)https://arxiv.org/pdf/1506.02640v5.pdf
约洛夫 2:【https://arxiv.org/pdf/1612.08242v1.pdf】T2
最大优势:
- 速度(每秒 45 帧,比实时速度快)
- 网络理解一般化的对象表示(这允许他们在真实世界图像上训练网络,并且对艺术品的预测仍然相当准确)。
- 更快的版本(架构更小)—每秒 155 帧,但精度较低。
- 开源:【https://pjreddie.com/darknet/yolo/
高层次想法:
与其他区域建议分类网络(快速 RCNN)相比,Yolo 架构更像 FCNN(完全卷积神经网络),它对各种区域建议执行检测,并最终对图像中的各种区域执行多次预测,并使图像(nxn)通过 FCNN 一次,输出 is (mxm)预测。这种架构在 mxm 网格中分割输入图像,并为每个网格生成 2 个边界框和这些边界框的类概率。请注意,边界框很可能比网格本身大。来自纸张:
我们将对象检测重新定义为一个单一的回归问题,直接从图像像素到边界框坐标和类别概率。
单个卷积网络同时预测多个边界框和这些框的类别概率。YOLO 在全图像上训练,直接优化检测性能。与传统的目标检测方法相比,这种统一的模型有几个优点。首先,YOLO 速度极快。因为我们把检测框架作为一个回归问题,所以我们不需要复杂的流水线。我们只是在测试时对新图像运行我们的神经网络来预测检测。我们的基础网络在 Titan X GPU 上以每秒 45 帧的速度运行,没有批处理,快速版本的运行速度超过 150 fps。这意味着我们可以实时处理流视频,延迟不到 25 毫秒。
第二,YOLO 在做预测时会对图像进行全局推理。与基于滑动窗口和区域提议的技术不同,YOLO 在训练和测试期间看到整个图像,因此它隐式地编码了关于类及其外观的上下文信息。快速 R-CNN 是一种顶级的检测方法,它会将图像中的背景斑块误认为物体,因为它看不到更大的背景。与快速的 R-CNN 相比,YOLO 产生的背景错误不到一半。
第三,YOLO 学习对象的概括表示。当在自然图像上训练和在艺术品上测试时,YOLO 远远超过 DPM 和 R-CNN 等顶级检测方法。由于 YOLO 是高度概括的,当应用于新的领域或意想不到的输入时,它不太可能崩溃。
我们的网络使用整个图像的特征来预测每个边界框。它还可以同时预测图像中所有类别的所有边界框。这意味着我们的网络对整个图像和图像中的所有对象进行全局推理。YOLO 设计支持端到端训练和实时速度,同时保持较高的平均精度。
我们的系统将输入图像划分为一个 S × S 网格。如果对象的中心落入网格单元,则该网格单元负责检测该对象。
每个网格单元预测 B 边界框和这些框的置信度得分。这些置信度得分反映了模型对盒子包含对象的置信度,以及它认为盒子预测的准确性。形式上,我们将置信度定义为 Pr(对象)IOU。如果该单元中不存在任何对象,置信度得分应该为零。否则,我们希望置信度得分等于预测框和实际情况之间的交集(IOU)
每个边界框由 5 个预测组成:x,y,w,h 和置信度。(x,y)坐标表示相对于网格单元边界的盒子中心。相对于整个图像预测宽度和高度。最后,置信度预测表示预测框和任何真实框之间的 IOU。每个网格单元还预测 C 条件类概率 Pr(Classi |Object)。这些概率取决于包含对象的网格单元。我们只预测每个网格单元的一组类别概率,而不考虑盒子 b 的数量。
在测试时,我们将条件类概率和单个盒子置信度预测相乘,
Pr(Classi|Object)∗Pr(Object)∗IOU = Pr(Classi)∗IOU
,它为我们提供了每个盒子的特定于类的置信度得分。这些分数编码了该类出现在框中的概率以及预测的框与对象的匹配程度
网络架构和培训:
改变损失函数以获得更好的结果是很有趣的。有两件事很突出:
- 在训练过程中,包含对象的盒子和不包含对象的盒子的置信度预测的不同权重。
- 预测包围盒宽度和高度的平方根,以不同地惩罚小对象和大对象中的误差。
我们的网络有 24 个卷积层,后面是 2 个全连接层。我们简单地使用 1 × 1 缩减层,然后是 3 × 3 卷积层,而不是 GoogLeNet 使用的初始模块
快速 YOLO 使用具有更少卷积层(9 层而不是 24 层)和更少过滤器的神经网络。除了网络的规模之外,YOLO 和 Fast YOLO 之间的所有培训和测试参数都是相同的。
我们优化了模型输出的平方和误差。我们使用平方和误差,因为它易于优化,但是它并不完全符合我们最大化平均精度的目标。它将定位误差与可能不理想的分类误差同等加权。此外,在每个图像中,许多网格单元不包含任何对象。这将这些单元的“置信度”分数推向零,通常会压倒包含对象的单元的梯度。这可能导致模型不稳定,导致培训在早期出现偏差。为了补救这一点,我们增加了边界框坐标预测的损失,并减少了不包含对象的框的置信度预测的损失。我们使用两个参数λcoord 和λnoobj 来实现这一点。我们设置λcoord = 5,λnoobj = .5。
平方和误差同样对大盒子和小盒子中的误差进行加权。我们的误差度量应该反映大盒子中的小偏差不如小盒子中的小偏差重要。为了部分解决这个问题,我们预测边界框宽度和高度的平方根,而不是直接预测宽度和高度。
YOLO 预测每个网格单元有多个边界框。在训练时,我们只希望一个边界框预测器负责每个对象。我们分配一个预测器来“负责”预测一个对象,基于哪个预测具有最高的当前 IOU 和地面真实值。这导致边界框预测器之间的专门化。每个预测器在预测物体的特定大小、长宽比或类别方面变得更好,从而提高了整体回忆能力。
YOLO 的局限性
由于每个格网单元只能预测两个框,并且只能有一个类,因此 YOLO 对边界框预测施加了很强的空间约束。这个空间约束限制了我们的模型可以预测的附近物体的数量。我们的模型处理成群出现的小物体,比如一群鸟。由于我们的模型学会了从数据中预测边界框,它很难推广到新的或不寻常的纵横比或配置的对象。我们的模型还使用相对粗糙的特征来预测边界框,因为我们的架构具有来自输入图像的多个下采样层。最后,当我们在近似检测性能的损失函数上训练时,我们的损失函数在小边界框和大边界框中对待错误是相同的。大盒子里的小错误通常是良性的,但小盒子里的小错误对 IOU 的影响要大得多。我们错误的主要来源是不正确的定位
YOLO9000
约洛夫 2:https://arxiv.org/pdf/1612.08242v1.pdf
与快速 R-CNN 相比,YOLO 的误差分析表明,YOLO 犯了大量的定位错误。此外,与基于区域提议的方法相比,YOLO 的召回率相对较低。因此,我们主要集中在提高召回和定位,同时保持分类的准确性。
通过在 YOLO 的所有卷积层上添加批量标准化,我们在 mAP 上获得了超过 2%的改进。批处理规范化也有助于正则化模型。通过批量标准化,我们可以在不过度拟合的情况下从模型中移除漏失。
对于 YOLOv2,我们首先在 ImageNet 上以全 448 × 448 分辨率对分类网络进行 10 个时期的微调。这使得网络有时间调整其滤波器,以便更好地处理更高分辨率的输入。然后,我们在检测时微调生成的网络。这个高分辨率的分类网络给我们增加了将近 4%的地图
带锚盒的卷积。YOLO 使用卷积特征提取器上的全连接层直接预测边界框的坐标。预测偏移量而不是坐标简化了问题,并使网络更容易学习。我们从 YOLO 中移除完全连接的层,并使用锚盒来预测边界盒。使用锚盒,我们得到了一个小的准确性下降。YOLO 只预测了每张图片 98 个盒子,但是我们的模型预测了超过 1000 个锚盒。在没有锚盒的情况下,我们的中间模型得到 69.5 的 mAP,召回率为 81%。使用锚盒,我们的模型得到 69.2 的 mAP,召回率为 88%。即使 mAP 降低,但召回率的提高意味着我们的模型有更大的改进空间。
精细的特征。这种改进的 YOLO 预测在 13 × 13 特征图上的探测。虽然这对于大型对象来说已经足够了,但是对于本地化较小的对象来说,更细粒度的特性可能会有所帮助。更快的 R-CNN 和 SSD 都在网络中的各种特征地图上运行他们的建议网络,以获得一系列分辨率。我们采取了一种不同的方法,简单地添加一个穿透层,以 26 × 26 的分辨率从早期的层中引入功能。通过将相邻要素堆叠到不同的通道而不是空间位置,直通层将高分辨率要素与低分辨率要素连接起来,类似于 ResNet 中的身份映射。这样就把 26 × 26 × 512 的特征图变成了 13 × 13 × 2048 的特征图,可以和原来的特征串接起来。我们的检测器运行在这个扩展的特征映射之上,因此它可以访问细粒度的特征。这带来了 1%的性能提升。
在训练期间,我们混合来自检测和分类数据集的图像。当我们的网络看到标记为检测的图像时,我们可以基于完整的 YOLOv2 损失函数进行反向传播。当它看到分类图像时,我们只从体系结构的分类特定部分反向传播损失。
等级分类。ImageNet 标签来自 WordNet,WordNet 是一个语言数据库,用于构建概念以及它们之间的关系[12]。在 WordNet 中,“诺福克梗”和“约克夏梗”都是“梗”的下位词,梗是“猎狗”的一种,梗是“狗”的一种,梗是“犬科动物”,等等。大多数分类方法假设标签是平面结构,但是对于组合数据集,结构正是我们所需要的。
官方网站:
https://pjreddie.com/publications/
CVPR 2016 的论文展示:
复习:YOLOv1 —你只看一次(物体检测)
原文:https://towardsdatascience.com/yolov1-you-only-look-once-object-detection-e1f3ffec8a89?source=collection_archive---------4-----------------------
在这个故事里,的 YOLOv1 由艾研究中心(FAIR)审查。该网络只需查看图像一次即可检测多个物体。因此,它被称为 YOLO ,你只看一次。
YOLOv1 without Region Proposals Generation Steps
通过只看一次图像,检测速度是实时的(45 fps) 。快 YOLOv1 达到 155 fps。这是另一种最先进的深度学习对象检测方法,在我写这个故事的时候已经发表在 2016 CVPR 上,被引用2000 多次。( Sik-Ho Tsang @中)
下面是作者提供的 YOLOv1 示例:
YOLO Watches Sports
如果感兴趣,他们还提供了其他 YOLOv1 示例:
- YOLO 看 YouTube 第一集
- YOLO 看 YouTube 第二部
- YOLO 看 YouTube 第三部
- YOLO 手表自然第一部
- YOLO 手表自然第二部
涵盖哪些内容
- 统一检测
- 网络架构
- 损失函数
- 结果
1.统一检测
1.1 现有技术:R-CNN
像 R-CNN 这样的现有技术首先生成 2K 个区域提议(边界框候选),然后如下检测每个区域提议内的对象:
R-CNN (First, extract region proposals; Then detect object for each region proposals)
因为需要两步,所以它们非常慢。
1.2 YOLO
YOLO 建议有一个统一的网络来一次性完成所有任务。同样,端到端的培训网络也可以实现。
YOLO Unified Detection
输入图像被分成一个 S×S 网格(S=7) 。如果对象的中心落入网格单元,则该网格单元负责检测该对象。
每个网格单元预测 B 个边界框(B=2)和这些框的置信度得分。这些置信度得分反映了模型对盒子包含对象的置信度,即盒子中的任何对象 P(对象)。
每个边界框由 5 个预测组成:x、y、w、h 和置信度。
- (x,y)坐标表示相对于网格单元边界的盒子中心。
- 相对于整个图像预测宽度 w 和高度 h。
- 置信度表示预测框和任何基础真值框之间的联合交集(IOU)。
每个网格单元还预测条件类概率 P(Classi|Object)。(班级总数=20)
下图说明了网络的输出:
The output from YOLO
输出大小变成:7×7×(2×5+20)=1470
2.网络体系结构
YOLO model network architecture
该模型由 24 个卷积层和 2 个全连接层组成。交替的 1×1 卷积层减少了来自前面层的特征空间。(GoogLeNet 中使用了 1×1 conv 以减少参数数量。)
快速 YOLO 更少的卷积层(9 层而不是 24 层)以及这些层中更少的滤波器。网络管道总结如下:
Whole Network Pipeline
因此,我们可以看到,输入图像通过网络一次,然后可以检测对象。我们可以进行端到端学习。
3.损失函数
3.1 损失函数解释
Loss Function
如上图所示,损失函数中有 5 项。
- 第一项(x,y) :边界框 x 和 y 坐标被参数化为特定网格单元位置的偏移量,因此它们也被限制在 0 和 1 之间。并且只有在有目标的情况下才估计误差平方和(SSE)。
- 第二项(w,h) :边界框的宽度和高度由图像的宽度和高度归一化,使它们落在 0 和 1 之间。SSE 只有在有对象的情况下才被估计。因为大盒子中的小偏差不如小盒子中的小偏差重要。边界框宽度 w 和高度 h 的平方根,而不是宽度和高度直接解决这个问题。
- 第三项和第四项(置信度)(即预测框和任何地面真实框之间的 IOU):在每个图像中,许多网格单元不包含任何对象。这将这些单元的“置信度”分数推向零,通常会压倒包含对象的单元的梯度,并使模型不稳定。因此,不包含对象的盒子的置信度预测的损失减少,即 λnoobj =0.5。
- 第五项(类概率):有对象时类概率的 SSE。
- λcoord :由于第三和第四项中提到的相同原因,λcoord = 5,以增加边界框坐标预测的损失。
3.2 其他细节
除了最后一层,其他所有层都使用 leaky ReLU 作为激活函数。ImageNet对前 20 个卷积层进行预训练,使其在一周内达到 88%的前 5 名准确率。然后,根据来自 PASCAL VOC 2007 和 2012 的训练和验证数据集,对网络进行大约 135 个时期的训练。在对 2012 年进行测试时,我们还纳入了 VOC 2007 年的测试数据用于培训。使用的批次大小为 64。还使用了第一个完全连接的层的丢弃和数据增加。
在 PASCAL VOC 上,预测了每幅图像 98 个包围盒。
一些大的物体或者多个小区边界附近的物体可以同时被多个小区很好的定位。使用非最大抑制。
4.结果
4.1 VOC 2007
mAP and FPS Results (VOC 2007)
- YOLO : 63.4 mAP(均值平均预测)和 45 FPS。与 DPM、R-CNN、快速 R-CNN 和更快 R-CNN 相比,YOLO 可以在相似的 mAP 下获得实时性能。
- 快速 YOLO : 52.7%贴图,155 FPS。如此高的 FPS,与 100Hz DPM 相比,它也有非常高的 mAP。
- YOLO VGG-16 : YOLO 使用 VGG016 架构,由于没有 1×1 卷积来减少模型大小,所以速度很慢,即使有 66.4%的 mAP 也只有 21 FPS。
Error Analysis (VOC 2007)
物体定位:与快速 R-CNN 相比,YOLO 很难正确定位物体。
背景误差 : YOLO 背景误差较小。快速 R-CNN 有 13.6%的顶部检测是假阳性。
由于 YOLO 和快速 R-CNN 各有利弊,所以可以将它们结合起来以具有更高的准确性。
Model combination with Fast R-CNN (VOC 2007)
模型组合后,获得了 75.0%的 mAP,与其他组合相比具有相对较高的精度。
2012 年 4.2 VOC
Fast R-CNN + YOLO (VOC 2012)
快速 R-CNN + YOLO 具有 70.7%的 mAP,这是最高性能的检测方法之一。
4.3 普遍性
在 Picasso 数据集和 People-Art 数据集上也尝试了艺术品上的人物检测。毕加索的模特接受 VOC 2012 培训,而人物艺术的模特接受 VOC 2010 培训。
Generalization Results
- R-CNN 在 VOC 2007 上 AP 高。然而,R-CNN 在应用到艺术品上时,就大大地减少了。 R-CNN 使用 选择性搜索为自然图像调整的边界框提议。
- DPM 将其 AP 很好地应用于艺术品。先前的工作理论上认为 DPM 性能良好,因为它具有对象形状和布局的强空间模型。
- YOLO 在 VOC 2007 上有很好的表现,当应用于艺术品时,它的 AP 降解比其他方法少。艺术作品和自然图像在像素级别上非常不同,但它们在对象的大小和形状方面相似,因此 YOLO 仍然可以预测良好的边界框和检测。
下面显示了一些非常有趣的可视化结果:
Some detection results
以后再讲 YOLOv2 和 YOLOv3。
参考
- 【2016 CVPR】【yolov 1】
T5【你只看一次:统一的,实时的物体检测
我的评论
[ R-CNN ] [ 快速 R-CNN ] [ 更快 R-CNN][Google net]
使用暗流的 YOLOv2 对象检测
原文:https://towardsdatascience.com/yolov2-object-detection-using-darkflow-83db6aa5cf5f?source=collection_archive---------1-----------------------
这个故事介绍了如何检测物体。如果您计划构建一个受益于对象检测的应用程序,这将很有帮助。幕后使用 YOLOv2 算法。不过我用的是开源实现,“ Darkflow ”,所以不需要担心细节。
简而言之,执行对象检测需要 4 个步骤。还有一些更多的细节,所以如果你真的想使用我的代码,请访问 我的 github 库 了解这个故事。这是这个故事的朱庇特笔记本。
安装暗流
其实你可以访问 Darkflow 的 github 资源库 并探索安装指南。在这里,我将让指令尽可能简单。
$ pip install Cython
$ git clone [https://github.com/thtrieu/darkflow.git](https://github.com/thtrieu/darkflow.git)
$ cd darkflow
$ python3 setup.py build_ext --inplace
$ pip install .
下载重量
有两种方式下载预训练的重量。首先,你可以从YOLO 项目官方网页 下载。第二,你可以在这里 下载 哪个 Darkflow 作者自己训练的版本。我决定使用第二种方法,因为我正在使用暗流实现。如果你愿意,你可以试试第一种方法。
Red circle indicates the weight file you need to download
建立模型
正如您在下面看到的,构建模型非常简单。首先,您需要定义选项对象。然后,您需要用选项实例化 TFNet 类对象。
选项是模型及其环境的规范。下面的截图是您可以指定的完整列表。我将为这个故事使用 【模型】【加载】【阈值】【GPU】选项。
Darkflow Model Options
型号选项要求您指定想要使用的型号。有预定义的模型,我这里用的是 yolo.cfg 。这个文件包含了模型架构的完整描述。
加载选项用于指定您想要使用的权重文件。由于我建议从 这里 下载 yolo.weights,我指定了。如果您有自己的预训练权重文件,这是您让模型知道的地方(就像在您训练自定义对象之后,您的系统将产生特定的权重文件)。
当您的系统上有 gpu 时,使用 gpu 选项。这将提高预测任务的速度。
阈值选项是保留被检测对象的置信概率值的底线。我把它设置为 0.1,它似乎相当低。然而,我选择这个值来试验模型可以检测到多少个对象,并且我可以在以后进行过滤。
模型完全加载后,您将得到如上所示的输出。
检测物体并在图片上绘制方框
上面的一行代码是你检测物体所需要做的一切。唯一指定的参数是以 numpy 数组样式表示的图像。如果你打印出结果,你会看到下面显示的对象列表。每个键在对象中的含义看起来非常直观。
我在下面定义了装箱函数,这样我也可以在图像和视频上重复使用。我使用 opencv-python 模块在图像上放置盒子和标签。
使用装箱功能,您可以显示如下结果图像。
或者你也可以像 follow 一样在视频上执行相同的任务。
*请根据您的操作系统在此处检查支持的视频输出格式,并将其设置在 cv2 上。VideoWriter_fourcc 函数。就我而言,我在 Windows 10 上测试过,所以我指定了*“DIVX”。
结果和评价
以下是我实验过的一些结果。
在各种图片上都好看。然而,我在第二张和第四张图片上看到了一些缺点。
对于第二张图片的情况,看起来 YOLO 人并不希望一只狗出现在图片中间。我想很多预先训练的照片都有狗在地上。
YOLO 实际上非常善于发现人。然而,对于第四张图片的情况,处于动态意外姿势的人看起来不容易被检测到。此外,当太多的对象重叠时,似乎很难检测到它们中的每一个。
我可以看到这个视频类似的问题。YOLO 可能受过有人驾驶汽车的训练。对于这个视频,即使是一只狗被关在车里,算法也预测出这只狗是一个人。此外,后座被预测为具有高置信度的人。
YOLOv2 使用 Darkflow 检测您自己的对象
原文:https://towardsdatascience.com/yolov2-to-detect-your-own-objects-soccer-ball-using-darkflow-a4f98d5ce5bf?source=collection_archive---------3-----------------------
上一个故事 前一个展示了关于dark flow**其中* 是 YOLOv2 对象检测模型的实现之一*
这个故事介绍了在自定义数据集上进行对象检测的基本步骤。作为一个例子,我自己做了足球检测。简而言之,我将展示如何 1 .准备数据集,2 .训练模型和 3 .预测对象。
我在 Github上写过一篇 Jupyter 的笔记本跟这个故事有关。如果您想亲自尝试,请访问 此处 获取完整的数据集和训练程序。**
准备数据集
****这一步要做的第一件事是搜索你感兴趣的媒体(图像或视频)文件。就我而言,我选择了足球,因为当我在这里时,2018 年俄罗斯世界杯正在进行。在 Youtube 上更容易找到精彩的视频剪辑,我可以制作很多截图(通过这个链接,你会找到一种从视频文件制作大量截图的方法)。如果你只是从网上收集图像文件,那也很好。只要记住所有来自互联网的你的图像文件或者截图必须属于一个相似的(或者相同的如果可能的话)发行版因为我们不打算构建通用 AI。
****其次,是对采集到的图像数据集进行预处理的时候了。可以用图像和相关联的注释来训练 YOLO 模型。图像文件链接到注释文件,而注释文件包含多个注释信息。注释指示图像中对象的位置及其大小,如(x_top,y_top,x_bottom,y_bottom,width,height)。这些批注应该是自己手写的,可能需要很长时间。然而,幸运的是,有很好的工具来简化这项任务。我选择了 这个工具 (labelImg) 。
labelImg TOOL for bounding boxes
从上面的截图可以看出,你可以很容易地在你感兴趣的对象周围绑定框。我只有足球的边界框,但是多个对象也可以。只要记住应该显示 PascalVOC 文本,因为它表示 YOLO 的注释样式现在被选中,即使你使用这样的工具,这个过程也要花费很长时间。
如果你想要我的数据集…
****我已经上传并分享了我的预处理图像数据集和相关注释。你可以在这里 下载 。如果您想亲自试验训练/预测任务,您可能需要它;如果您想添加更多数据集以提高模型的性能,您也可能需要它。
预测对象
在这一步中, 在预测之前,训练好的模型应该准备进行推论。为了获得一个训练有素的模型,以下是你应该做的。
- 在 COCO 或 VOC 数据集上找到预训练模型
- 更改配置,使模型适合您自己的情况
- 建立模型
- 训练模型
首先是**,在我的例子中,我使用了(yolov 2 的开源项目) 其预训练参数 。请访问我的 github 库,查看完整的使用说明。******
第二个,应该有一个指定型号配置的文件。如果没有,您应该在代码本身中更改它。对于暗流,有一个文件(*。cfg)。最后,你应该改变最后一层的一些值。例如,在我的例子中,我只想检测一个足球。于是,我把“类”的值改成了 1(VOC 和 COCO 数据集的类数分别是 20 和 80)。由于最后一层中单元(类)的数量,一些相关联的参数数量也应该被适当地改变。根据 darkflow 的文档,我需要将【卷积】层(倒数第二层)中的过滤器更改为 num * (classes + 5),即 30 。****
第三和第四步骤可能与各种实施方式不同。在 darkflow 中,下面的代码显示了如何构建模型。
它将打印出模型的架构,其中包含一些与预训练模型不同的相关更改。然后下面一行代码开始训练过程。
我确实运行了 100 个纪元,每个纪元有 23 个步骤。这样 2300 的总步骤就完成了。供你参考,我用的是英伟达 GTX 1080Ti ,用了大约一个小时完成训练过程。******
每 250 步,darkflow 就会创建一个检查点文件。通过指定一个检查点文件,您可以从您离开的地方开始。此外,您可以使用检查点文件分发您的训练模型。下面的代码显示了如何加载它来预测流程。(-1 表示最新的检查点)****
最后,您有了自己的模型来检测定制对象。如何用边界框显示图像或视频的详细描述在 前面的故事 中有解释。也请访问 github 库 获取更详细的解释。
图像和视频预测结果
我用网上的随机图片做了实验(上)。它就像我期待的那样工作。视频显示了视频文件(下图)上的预测结果。****
最后的想法
- 我发现在足球比赛的宽视角下,球的检测相当困难,因为这个物体非常小(比你的指尖还小)。
- 每个数据应该来自非常相似的分布。由于足球比赛的照片是从各种不同的角度拍摄的,有时很难预测。
- 从不同的情况下收集尽可能多的数据。
- 我发现数据集更好的包含了很多任意位置的物体。因为足球几乎出现在比赛的每个位置,所以看不见的位置很难预测。
- 最后,足球有时会出现在球员之间或被球员部分隐藏,这也使得算法难以预测。数据集应该反映这种特殊情况。
Yonohub:使用积木的自动驾驶汽车
原文:https://towardsdatascience.com/yonohub-autonomous-vehicles-using-blocks-ef4a1838d92c?source=collection_archive---------16-----------------------
在过去的几周里,我有机会尝试汽车行业最有前途的创新产品之一,我想与您分享我的经验和快速演示。
欢迎来到 Yonohub !
What is Yonohub?
“Yonohub 是一个基于网络的云系统,用于构建、共享和评估由许多构建模块组成的复杂自动驾驶汽车系统。Yonohub 有一个拖放工具来构建复杂的系统,一个市场来分享和赚钱,一个定制开发环境的构建器,等等。
Yonohub 提供了几个功能强大且易于使用的应用程序,在建造自动驾驶汽车的整个过程中支持开发人员和研究人员:使用 Jupyter Notebook 开发算法,使用 YonoArc 部署和测试算法,使用yono jobs安排夜间培训工作,在 YonoStore 上分享和销售算法。
Yonohub Apps
这还不是全部。如你所见,还有现在流行的 GitLab 和 Tensoboard, YonoDrive 作为 Yonohub 的数据管理器, YonoEBuilder。
有了 YonoEBuilder,你再也不用担心你的算法依赖性了。只需点击几下,就可以使用各种包管理器(APT、pip 或 Conda)构建您的环境,并与您的团队或客户共享。
YonoArc 是我最想尝试的应用之一。你可以用不同的数据集来模拟和测试不同的算法,你所需要做的就是拖放块。很酷,不是吗?
该应用程序附带一些免费的块:卡拉模拟器,Gazebo 模拟器,YOLO 对象检测,SSD 对象检测,KITTI 数据集,Berkeley DeepDrive 数据集,等等。
当然,您可以使用 YonoArc 的 Python 或 Octave 简单 API 创建自己的块,甚至可以导入用 C++或 Python 开发的现有 ROS 节点。如果你和我一样是 ROS 的粉丝,你会喜欢的!
让我和你们分享一个快速演示,在这个演示中,我使用了来自 T2 OSRF T3 的开源代码 T1。它使用 Gazebo 来模拟一辆普锐斯混合动力车,该车有 4 个摄像头,车顶上的 16 束激光雷达,8 个超声波传感器和 2 个平面激光雷达。所有这些传感器都可以使用 RViz 进行可视化,RViz 已经作为免费的 YonoArc 模块提供。这辆车的油门、刹车、转向和传动装置都可以用我创造的另一个模块轻松控制。
Gazebo world 文件是城市和高速公路立交的模型。您可以使用 Gazebo models repository 来包含汽车、人类、建筑等许多其他模型。
让我更详细地向您展示如何做到这一点。
创建凉亭模拟环境
任何街区都需要一个环境,所以我用 YonoEBuilderT5 到为凉亭街区创建一个环境:****
- 在 Yonohub 的主视图中点击图标,打开 YonoEBuilder。
- 单击创建新环境。所有的环境都预装了 ROS Melodic。
- 选中“Gazebo Simulator”复选框,确保您的环境中有它。
- 检查“NVIDIA 驱动程序和 CUDA ”,让 GPU 访问您的块。
Creating the Gazebo Environment Using YonoEbuilder
在 Packages 选项卡下,我们可以为我们的块安装任何需要的包。对于我们的演示,我们没有任何必需的包,所以我们将跳过这一步。
Creating the Gazebo Environment Using YonoEBuilder
现在一切准备就绪。让我们点击“构建”并让 YonoEBuilder 完成它的工作。让我们喝一杯咖啡,等到环境状态从“正在构建”变为“就绪”。
创建露台模拟块
让我们去 YonoArc 并打开这里的块管理器。
在块管理器页面中,让我们单击“创建项目”并填写必填字段。首先,不要忘记选择我们在上述步骤中创建的环境。然后,对于源代码,我们可以使用下面的 GitLab repo,它包含了 Gazebo 9 和 ROS Melodic 支持的汽车演示工作区的修改版本。现在,我们可以单击创建。
下一步是构建项目。在 Block Manager 页面中,单击新项目旁边的 Build。
构建完项目后,让我们切换到 Blocks 选项卡并选择我们的项目。在这里,我们可以配置数据块端口、资源要求、权限和属性。对于资源模型,我们选择“GK0.1 (CPU: 0.4 核,RAM: 6.1 GB)”因为这个模型提供了一个 Tesla K80 GPU。
汽车演示包包含一个 ROS 启动文件,这个启动文件负责启动 Gazebo,加载世界,生成模型,并启动所有需要的 ROS 节点。有关 ROS 启动文件以及如何使用它们的更多信息,请查看 ROS 文档。
下一步是定义所有数据块端口。我们可以通过在/Prius
主题上发布prius_msg/Control
类型的 ROS 消息来控制汽车。我们如何将它转换成 YonoArc 端口?
在高级信息→接口→输入端口下,我们定义一个输入端口,如下所示:
- 名字:控制→端口名:我们想怎么叫都行。
- 消息:prius_msgs/Control → ROS 消息类型
- ROS 名称:/Prius → ROS 主题名称
- Key: control →在这个块中没有使用,但是我们将在后面解释它。
输出端口的步骤相同。
Gazebo Block Inputs and Outputs
现在,凉亭块已准备好被保存和释放。在“项目”选项卡中,我们单击项目的“更多选项”图标,然后单击“发布”。
最终目标是让汽车自动驾驶,但为了收集训练数据,让我们从手动控制块开始。通过使用 YonoArc Python API ,我开发了一个模块,根据用户点击的按钮向 Gazebo 模块发送控制消息。
YonoArc 的 API 是事件驱动的。一个块由实现一个或多个事件处理程序的单个类表示。请务必注意,每个端口或属性都有一个唯一的键,您可以在用户界面上创建块时选择该键。这是为了让块知道在哪个端口上接收特定消息以及不同属性的值。
Example Block Using YonoArc Python API
让我们启动 Jupyter 来实现我们的块。
- 点击 Yonohub 主视图上的 Jupyter 笔记本图标。
- 选择 YonoCommons CPU 环境,因为我们的环境不需要任何特殊需求。
- 选择 C1 资源模型,因为我们只需要 Jupyter Notebook 来实施该模块。
- 单击启动。等到 Jupyter 笔记本开始。
现在让我们为新块创建一个文件夹,并编写代码:
- 单击右上角的新建→文件夹。将创建一个名为“无标题文件夹”的文件夹。
- 通过选择文件夹并单击重命名,将文件夹重命名为 VehicleControlBlock。
- 通过单击文件夹名称导航到该文件夹。
- 单击新建→ Python 3,为 Python 3 代码创建一个新的 ipynb 文件。文件将在新的选项卡中打开。
- 通过单击顶部的文件名,将该文件从无标题重命名为 car_demo_control。
- 将下面的源代码粘贴到笔记本的第一个单元格中。
Vehicle Control Block Source Code
在上面的代码中,我们使用了来自 YonoArc API 的两个事件处理程序。
- 这里我们初始化我们的消息字段
on_button_clicked(self):
这里我们处理不同的按钮动作。
首先,我们从prius_msgs
包中导入Control
消息。如前所述,Gazebo 块的输入端口使用相同的消息类型。
在prius_msgs
ROS 包中可以找到Control
消息的定义。
Header header
float64 throttle # Range 0 to 1, 1 is max
float64 brake # Range 0 to 1, 1 is max brake
float64 steer # Range -1 to +1, +1 is maximum left turn
uint8 NO_COMMAND=0
uint8 NEUTRAL=1
uint8 FORWARD=2
uint8 REVERSE=3
uint8 shift_gears
构建输出消息后,我们可以使用self.publish(port_key, message).
发布它
不要担心所有这些键,我们将在创建时在我们的块中定义它们。
让我们创建我们的块,但这次是作为自定义块。
- 在 YonoArc 中,单击左上角的 + 按钮,并将自定义块从 Others 工具箱拖到画布上。
- 单击自定义块上的设置图标。按如下方式设置块的属性:
名称:汽车车辆控制
描述:此区块控制露台区块的普锐斯车。
块类型: YonoArc API 块
文件夹路径:点击浏览,然后选择 VehicleControlBlock 文件夹,点击打开。
文件路径:点击浏览,选择 vehicle control block/car _ demo _ control . ipynb 文件,点击打开。在执行之前,YonoArc 会自动将该文件转换为. py 文件。
类名: CarDemoControl。这是表示块的类的名称。
输出端口:
具有以下属性的单个端口:
- 端口名称:控制
- 端口密钥:cmsg。该键用于发布控制消息
self.publish('cmsg’, controlmsg)
- 端口消息:prius_msgs/Control。
属性:
添加具有以下属性的第一个属性:
- 类型:按钮
- 名称:转发
- 关键:前进。
单击创建属性。该按钮将被添加到块描述的下方。让我们也不要忘记创建其他按钮反向,转向,停止分别与关键反向,转向,停止。最后,我们需要为转向值和油门增加两个数字属性。
- 类型:数量
- 名称:转向角
- 钥匙:steerval
- 默认 : 0,最小值 : -1,最大值 : 1
Git 消息存储库:
这里,我们需要找到该块使用的所有消息。正常情况下,3 个默认回购包含所有常见信息。但是如果我们使用自定义的 ROS 消息,我们应该在这里添加消息 repo。
- 网址:https://gitlab.yonohub.com/ibrahimessam/prius-messages.git
执行模式:异步
环境:yono commons——CPU。
资源模型 : C0.1 x 3。
现在所有的积木都准备好了,让我们把所有的东西连接起来。我还拖了一些其他块像 YOLO,RViz,和视频观众。
YonoArc Pipeline
正如你在上面的视频中看到的,正在运行的管道简单而强大。它介绍了 Yonohub 最大的特性之一,即连接不同的块,完全从它们不同的编程语言、环境或资源需求中抽象出来。你也可以在任何管道中重用这些模块,与你的团队分享,在 YonoStore 上出售。
我对 Yonohub 的总体体验非常愉快。我无法想象将像 YOLO 这样强大的深度学习算法与 ROS & Gazebo 模拟结合起来会这么容易。这让我相信,它很快就会成为每个从事自动驾驶汽车工作的人的必要平台。我很高兴目睹这一切。
正如你已经看到的,Yonohub 是一个快速原型化你的研究工作/模型的好地方。所以我想邀请你们所有人在你们的下一个自动驾驶汽车项目中尝试一下 Yohohub。
“你处理不了真相!”
原文:https://towardsdatascience.com/you-cant-handle-the-truth-transfer-learning-to-detect-memorable-movie-quotes-d2b5305062cd?source=collection_archive---------21-----------------------
迁移学习发现难忘的电影台词
在我看来,自然语言处理(NLP)是机器学习中最令人兴奋的分支之一。在过去的一年中,NLP 取得了重大突破,以前很难(甚至不可能)解决的问题现在可以更好、更容易地解决。自然语言处理中最大的突破之一是迁移学习的使用。如果你看过我之前的博文,你就会知道我是迁移学习的忠实粉丝。简而言之,迁移学习是训练一个模型做一件事(通常在 ImageNet 这样的大型数据集上),并使用该模型的权重来解决另一种类型的问题。例如,在我以前的博客文章中,我使用了一个在 ImageNet 上预先训练的模型,将一个蓝色少女和小丑鱼图像的小数据集分类到它们适当的鱼类种类中。迁移学习非常有用,因为它允许使用小数据集来解决复杂的问题。虽然这种方法在计算机视觉中非常流行,但在 NLP 社区中很少使用。最近,一篇论文论证了迁移学习可以用来解决 NLP 问题;作者将这种方法称为文本分类通用语言模型微调(ULMFiT) 。我相信迁移学习的使用将会彻底改变这个领域,而且在某些方面已经发生了。
在这里,我将通过使用 ULMFiT 方法来演示迁移学习在 NLP 中的效用。我的博士学位专注于记忆(特别是从计算认知神经科学的角度来看),所以很恰当地,我决定创建一个分类器,它可以检测一段电影台词是否值得记忆。这篇帖子对应的代码在我的 GitHub 上公开。
数据集
对于数据集,我使用了康奈尔电影引用语料库。该数据集由令人难忘的电影语录组成,摘自 IMDb 令人难忘的语录。这包括来自大约 1000 部电影的难忘的引用和匹配的不难忘的引用。匹配的非记忆性引语来自同一演讲者,长度相似,并且在脚本中尽可能接近相应的记忆性引语。例如,来自我最喜欢的电影之一《搏击俱乐部》:
难忘:“每晚我死去,每晚我重生。复活”
不值得纪念的:“我想…当人们认为你快死了的时候,他们真的会听,相反…”
在数据集中,有 2197 个匹配的记忆-非记忆引语。
建模方法:语言模型
如上所述,我使用的是迁移学习法。我使用的语言模型是在维基百科的子集上预先训练的。该模型的架构和预训练重量可在这里获得。该模型由三层 AWD-LSTM 组成,本质上是一个在各个点都有漏失的 LSTM。预训练模型是一个语言模型,这意味着它被训练来预测句子中的下一个单词。尽管我们已经有了一个预训练的语言模型,但这个模型是在维基百科上训练的,这可能不同于电影引用文本语料库。因此,首先,我对电影引用数据集上的预训练模型进行了微调。实际上,我发现这一步并没有帮助提高一个引语是否值得记忆的分类器的准确性。这可能是因为电影引用数据集的词汇量非常小(1545 个单词)。
只是一些关于模特训练的小注意事项。首先,正如 ULMFiT 论文中推荐的,我使用了倾斜三角形学习率。从下图可以看出,在模型训练期间,学习率快速增加,然后在训练的其余时间逐渐降低。
第二,我用了逐步解冻。开始训练的时候,我只是训练嵌入层,然后逐渐开始解冻/训练其他层。我还使用了判别微调,其中我对不同的层使用了不同的学习速率。有些层,比如输出层,可能比其他层需要更多的训练,所以我们应该对这些层使用不同的学习率。
我训练模型,直到我达到大约 43%的验证集准确率。
建模方法:分类器模型
既然我们已经对语言模型进行了微调,现在我们可以针对我们的实际任务对其进行进一步的微调,即预测电影引用是否值得记忆。这包括简单地去掉最后一层,用一个有两个输出(可记忆的,不可记忆的)的层来代替它。经过一段时间的训练后,我们达到了大约 70%的验证集准确率。考虑到数据集很小,还不算太坏!
为了进一步提高模型的准确性,我重新运行了所有的训练,但是文档是反过来的;也有公开可用的带有反向语言模型的预训练权重。这最终没有帮助,但值得在您自己的数据集中检查。
结论
在这里,这种分析表明,控制报价的长度和时间介绍,有一些关于某些报价的内容,使他们难忘。下一步可能是试图理解为什么有些引语是值得记忆的,而有些却不是(即模型解释);实际上,这是这个数据集创建者的最初目标。也许这个分类器可以被作家和记者用来检查一个引语是否值得记忆。
用这么小的数据集,我们可以达到合理的准确度,这真的很令人惊讶。如果我们没有使用迁移学习,那么在如此小的数据集上很难达到这种精确度。看到迁移学习在 NLP 中的进一步应用,我真的很兴奋。训练这个模型还有很多其他的小细节。检查我的 GitHub 以查看实际代码,如果您有任何问题,请不要犹豫!
你不能谷歌所有的东西
原文:https://towardsdatascience.com/you-cant-just-google-everything-38c52b402779?source=collection_archive---------13-----------------------
以及其他我希望在开始我最新的数据科学项目之前就知道的事情
Photo by Chris Ried on Unsplash
几周前,我开始了一个新的数据科学项目,不出所料,h̶o̶r̶r̶i̶f̶i̶c̶绝对给了我启发。我之前对数据科学和机器学习项目做过一些尝试性的探索。但是我认为是时候做一些更大的事情了。但是我该从哪里开始呢?
你不能谷歌所有的东西
公平地说,我犯了一个错误,在大多数人会去的地方寻找灵感——谷歌的首页。事实证明,有太多的资源会让你迷失其中。有些提示有点乏味。这是我在 Quora 上找到的一个帖子:
I fell asleep when I saw “cricket”
听起来不太对劲。为什么我要查看仅仅“模仿”数据科学真实应用的数据?我想建立一个真正的投资组合,解决真正的问题,给企业和人们带来真正的改变。我想分析一些我感兴趣的东西。毫无疑问,这些建议的数据集非常棒。它们可能是对你的数据探索、机器学习或可视化技能的巨大考验。但最终这一切又有什么意义呢?
我想建立一个真正的投资组合,解决真正的问题,给企业和人们带来真正的改变。
相反,我求助的最有用的资源之一是上关于数据科学的作者。Michael Galarnyk 写了一篇关于建立数据科学投资组合的伟大文章,Jeremie Harris 为有抱负的数据科学家写了一份伟大的“不要做”清单。这部分对我来说是最好的:
当你有疑问时,这里有一些对你伤害大于帮助的项目:
*在泰坦尼克号数据集上的生存分类。
*在 MNIST 数据集上的手写数字分类。
*使用 iris 数据集进行花卉种类分类。
我对 Kaggle 和他们的比赛百感交集。我认为数据科学家应该拥有从各种难以想象的地方获取数据的能力。我真的不喜欢被“填鸭式”灌输数据的想法。也就是说…
收集自己的数据是痛苦的。真的。
所以我最终决定自己收集数据。该项目将是关于预测一部电影的 iTunes 价目表价格从其特点,如票房表现,评论家评级,演员阵容,情节等。预测电影成功的模型并不新鲜。但是有些问题没有被问及,也没有被回答。
- 一部电影上映后,在视频点播(VOD)平台上一部电影能标价多少钱?
- 我可以提前预测这个价格吗,这样我就可以决定我是否要支付它?
- 或者其他视频点播提供商会利用这些信息与 iTunes 进行价格竞争吗?
- 像网飞这样的视频点播提供商能利用这些信息来优化他们的定价策略吗?
比看板球数据好多了。
但是很少有数据集提供了电影和它们在 iTunes 或其他视频点播平台上的标价之间的联系。
最终,我转向开源电影数据库,如电影数据库和开放电影数据库,我将它们与 iTunes 数据结合起来分析数据。然而,这并非没有挑战。您可以在 Github 上查看我的脚本和探索性分析,但是请继续关注关于我的整个数据收集过程的博客帖子。
每个拥有有价值数据的人都使用 API
我不是互联网协议、服务器脚本或数据库架构和工程方面的专家。但是我不认为我说的有多离谱。
在我的数据收集过程中,我很大程度上依赖于使用 API,但是我也使用 web 抓取技术来收集数据。我发现自己使用 API 对网站/服务器进行的查询要少得多,这为我提供了一种进行结构化查询以获得我需要的所有数据的方法。没有多余的或吵闹的。
对于组织来说,理解为什么 API 层对他们有好处是很重要的:
- 您可以保护托管信息的服务器。
- 您将保护推动您业务发展的数据。
- 它帮助您的合作伙伴和协作者轻松、安全地获得他们需要的数据和信息。
- 您可以通过调整速率限制来管理您的服务器资源。
- 您可以最终控制数据进出服务器的方式。
将 API 比作酒保特别有用。与其开放你的数据“自助餐”式,人们会倾向于采取先抢后问的心态,不如让一个人来控制食物的消耗量。相当不错的东西。
感谢你阅读我的第一篇博文。随着项目的进展和想法浮出水面,我会发布更多的更新。
你不能编造这些东西…或者,你能吗?
原文:https://towardsdatascience.com/you-cant-make-this-stuff-up-or-can-you-66a6d21ab7f1?source=collection_archive---------7-----------------------
[本文从多线程交叉发布,与 Joerg Fritz 合著]
2016 年 11 月 7 日,我们见证了篮球史上最伟大的时刻之一。金州勇士队的斯蒂芬·库里打破了一场比赛最多三分球的记录。但是,他做的不止这些。这是一种回归——库里一直在努力,就在一场比赛前,他和他的勇士队输给了湖人队。地位低下的湖人队——前一年在西部联盟中排名最后的球队。库里本人的三分球命中率为 10 投 0 中,以一个三分球结束了他连续 157 场比赛的 NBA 纪录。猜测随之而来。一些人开始质疑库里是否已经失去了他的风格。其他人认为,随着凯文·杜兰特(KD)的加入,球队的化学反应已经被打乱了。还有一些人认为这是防御;对手已经想出了如何防守库里曾经致命的一击。
但是在那个星期二的晚上,每个谣言都会被证明是假的。库里把他们一个个关了。每一发子弹都像雨点般落下,全世界都在敬畏地注视着。就好像每一个都是一个熟练的辩护律师的结案陈词。他精湛的投篮——有些从 26 英尺外——驳斥了任何“失球”的说法。他和 KD 流畅地编排他们的动作,让库里投篮得分。化学!有时库里有两个甚至三个防守者在他身上——这似乎让他变得更好,驳斥了他们已经找到如何防守他的理论。库里需要证明一些东西,他带来了一把大锤。当他投进当晚最后一个三分球时——这是一个打破记录的三分球——库里后退了几步,胜利地摇了摇头,然后指着人群,好像要结束他的案子。他回来了,比以前更好了。人群深信不疑,开始高呼“M-V-P,M-V-P”。这是一件美妙的事情——一连串的事件和情况汇集在一起,创造了体育史上最史诗般的时刻之一。你不能编造这种东西…
或者,可以吗?
对于我们所目睹的,有没有可能有另一种解释——一种远没有那么耸人听闻的解释?如果那天晚上我们真正看到的与复出或反驳批评者无关,相反,只不过是一个预期的,尽管很少的事件序列,会怎么样?如果那个戏剧性的故事完全是捏造的呢?在你嘘嘘哭泣黛比·唐纳之前,让我们看看数据能告诉我们什么。
如果我们看看我们可能预期会发生什么——不一定是在这个特定的夜晚,而是应该在“某个”夜晚发生什么——那么我们看到的就不那么令人惊讶了。库里本场比赛当时的历史 3 分命中率为 p =44.4%。这意味着连续 17 次的n= 13 次或更多次三分球命中 k =13 次的概率是:
这是一个小概率。但是,如果有足够的试验,我们应该期待它会发生。到那时为止,库里在职业生涯中已经尝试了 3661 次三分球。在这么多的试验中,我们预计他有 7 个序列是一样好或更好的,这仅仅是随机的(他有 6 个,其他序列只是跨越 2 或 3 场比赛)。像“证明怀疑者是错的”或“挨拳头”这样的叙述对于解释这些事件是不必要的。
库里在之前的比赛中 10 投 0 中的糟糕表现又是怎么回事呢?这难道不是衰退的证据,并促使他决心“东山再起”吗?不太可能。如果是 11 分之一,我们会讲一个不同的故事吗?让我们假设我们会接受任何一串低于他正常命中率的 17 次投篮,就像接下来的 17 次异常投篮一样。他 17 投 3 中(或更差)紧接着 17 投 13 中(或更好)的可能性有多大?事实证明,在他职业生涯的那个时候,这种结果有几乎 35%的可能性发生。
如果我们用图形来看数据,我们会看到一些看起来更像随机过程的东西。下面我们绘制了自 2014/15 赛季开始以来,库里在所有常规赛中的 3 分命中率,尝试和制造。这个图表使得构建一个清晰的解释叙述变得更加困难。你会发现这两个“异常”的游戏吗?它们是 x 轴上的游戏 514 和 515。他们不会突然出现在你面前,成为“体育史上的史诗时刻”。
库里的表演无疑是一个奇观。说这是“预料之中的事情”,只是因为他有着非凡的 3 分命中率,以及他多次尝试的事实。但是轰动效应——对复出的叙述、对谣言的驳斥等等——是为了配合数据而创造的。这不是因果关系。库里打破记录并不是因为谣言和猜测——那是我们对那晚所见的解读。我们认为这不在正常的统计变化范围内。我们不能接受。相反,我们无意识地编造了一个故事,赋予事件以意义。
这种捏造的倾向不仅限于体育娱乐。我们在经营业务的过程中也深受其害。这种情况经常发生——即使是在最注重经验的公司里。当指标与历史趋势不同时,人们会迅速给出解释,尽管完全没有任何数据来支持他们的说法。“这是天气”,总有人会在回应业务量的意外增长时这样建议。也许,“这是新的广告活动;挺引人注目的”。甚至,“这是宏观经济;由于刚刚发布的就业报告,人们感到乐观。这些都是看似合理的解释,但没有数据支持。事实上,我们经常被启发去创造这样的故事,正是因为我们缺乏任何其他东西来解释这种变化。我们似乎不能接受无法解释的事情,所以我们说服自己在数据中看到不存在的模式。
这种从事件——甚至是随机事件——中创造意义的倾向是与生俱来的。科学作家迈克尔·舍默称之为模式化。这是数百万年来选择压力的结果,因为我们的祖先进化出了我们今天的大脑。模式化是我们古代狩猎采集祖先的一个偏好特征。谢默解释说,那些对草丛中的沙沙声做出反应就好像它是一个危险的捕食者的人比那些更漫不经心的同伴更有可能存活下来——即使沙沙声只是风。这是因为错误判断捕食者的代价(即这只是风)并不多。然而,不回应的代价是毁灭性的——当它真的是掠食者时,却相信它是风。是生命的代价,是传递自己基因的能力!因此,当犯第一类错误的成本低于犯第二类错误的成本时,模式化特征将在人群中变得普遍[1]。在我们狩猎采集的时代,这肯定是为了生存,因此我们天生倾向于赋予事件意义。
这就是为什么当我们目睹的事件得不到解释时,我们会如此不安。这与纳西姆·尼古拉斯·塔勒布在他的书《黑天鹅》中描述的现象相同。塔勒布创造了“叙事谬误”这个术语,指的是我们在没有解释的情况下观察一系列事实的有限能力。“我们寻求解释,甚至到了我们会制造它们的地步”,他写道。无论是商业指标的突然上升,还是某人 17 个三分球中的 13 个,我们都要求一个解释!我们不能忍受让它无法解释或将其归因于随机变化。即使是已知的随机过程——比如扔硬币——我们也会编造故事来解释结果(例如,“连续三次都是正面朝上”)。见《赌徒的谬误》)。
模式化是我们与生俱来的,因为在我们狩猎采集的时代,它很好地服务了我们。然而,今天,它可能是完全危险的。虽然编造一个故事来解释我们的体育娱乐可能是无害的(除了充满激情的赌徒),但它在商业决策中可能是极其重要的。它会导致非理性、糟糕的决策和偏见。更糟糕的是,这给了我们理解的错觉。而且,故事是会传染的——它们在整个组织中传播得非常快,增加了基于错误信念做出决策的危险。我们甚至可以满怀信心地做到这一点,并与我们的同行保持一致。
我们必须保护自己。模式化是我们的大脑不知道什么对我们有益的众多特征之一。我们对暴食、贪婪、欲望等有着相似的偏好——每一个都是曾经让我们受益的遗迹,但现在我们必须发展策略来减轻它们。幸运的是,我们可以做一些事情来抵御自己编造潜在虚假故事的本能冲动。
- 首先,只要有可能,尽可能多地依靠设计良好的随机对照试验(RCT,又名 A|B 检验)进行测量、因果关系推断和决策。RCT 通过强制对抽样方差的有效估计进行数据评估,而不是通过我们有偏见的直觉,使我们免受犯第一类错误(当某事真的是假时,相信它是真的)的内在诱惑
- 接下来,花时间建模并了解你的业务。影响你业务的因素会随着时间的推移而变化。客户和库存的构成可能会变化,营销活动的有无可能会改变,甚至运营约束也可能会改变并影响您的业务指标。开发模型来捕捉每个因素引起的变化是一个很好的实践(我们以前写过这个)。见此处。虽然一个模型不会总是给你一个真实的因果关系,但它远比单独使用我们的直觉更严格。此外,它为分析变化提供了一个原则性的框架,这在许多方面都是有帮助的:它可以提供对对立因素的可见性,这些因素可能相互抵消,从而给出稳定的表象。它还可以提供关于自然变化程度的见解。当一些无法解释的现象发生时,它可以提供一个上限,说明有多少变化是由它引起的。
- 最后,当我们的直觉驱使我们看到不存在的模式时,我们必须发展一种纪律。如果我们发现自己在没有任何证据支持的情况下创造故事,特别是当我们因为没有数据支持而创造故事时,那么我们必须非常怀疑自己的动机。知道自己什么时候最容易受到这种伤害。越是不确定,越是绝望,我们就越有可能抓住似是而非的故事不放。
回到体育。11 月 7 日,除了斯蒂芬·库里进行随机变异的例行演示之外,还有什么别的吗?不太可能。库里本人在接受采访时,没有提到复出或需要证明什么。他只是说他“需要继续拍摄”。尽管如此,我们还是更喜欢故事。它提升了体验。这和我们去拉斯维加斯,吃不健康的快餐,玩显灵板,听从幸运饼干的建议,亲吻巧言石,偶尔纵情饮酒是一个道理。它们是满足原始欲望的愉快经历(至少在当下)。我们知道这对我们不好。但是,我们有权偶尔沉溺于自己的恶习。它让生活变得更加愉快。当然,在商业环境中,我们需要抑制自己的欲望。
附言
这篇博文有一个递归的特性,模式被引用来解释为什么我们有解释我们经历的事件的本能冲动。我们完全有可能不由自主地被模式化提供的解释所驱使。唉,我们不知道该相信谁了——当然不是我们自己!
参考资料和进一步阅读
- 舍莫,迈克尔。模式性:在无意义的噪音中寻找有意义的模式。《科学美国人》。新名词,2008 年 12 月 1 日。
- Tversky,a .和 Kahneman,d .对大数定律的信念。心理学通报,1971 年,第 76 卷,第 2 期。105–110.
- 维基百科上的赌徒谬误
- 维基百科上的热手谬论
- 《篮球中的辣手:关于随机序列的错误认知》,《认知心理学》17,295–314(1985)。
- 塔勒布纳西姆。极不可能事件的影响。伦敦:艾伦巷,2011 年。打印。
- 刘易斯,迈克尔。改变我们想法的友谊。纽约:诺顿出版社,2017 年。打印。
- 卡尼曼博士(2015 年)。思考,忽快忽慢。纽约:法勒,斯特劳斯和吉鲁。
- 纽约州哈拉里(2016 年)。智人:人类简史。安大略省多伦多市:信号,麦克莱兰和斯图尔特。
- 米勒、约书亚·本雅明和桑尤尔乔、亚当,惊讶于赌徒和热手的谬论?大数定律的一个真理(2016 . 11 . 15)。IGIER 工作文件№552。可在 SSRN 或土井买到
你不需要成为数学大师就可以开始机器学习
原文:https://towardsdatascience.com/you-dont-have-to-be-guru-at-math-to-get-started-in-machine-learning-c00ba0498519?source=collection_archive---------5-----------------------
嗨,伙计们,机器学习领域的一个常见误解是,为了学习数据科学和机器学习,你必须成为数学大师,但数学是学习机器学习的先决条件吗?简单的回答是不!在这里,我会向你解释为什么
数学不是机器学习的首要前提
一个最被误导的想法是,你必须精通数学,知道线性代数,微积分,微分方程,数理统计,最优化,算法分析…,请不要以此为借口不学习机器学习。
这种想法通常来自学术界,因为他们是从零开始编写算法的人,他们肯定要经历数学,他们必须知道如何计算导数并从零开始编写梯度下降算法,但我想告诉你的是,即使你对数学不是很熟悉,你仍然可以在这个领域非常成功。
工具会帮你计算
有许多库使得应用机器学习算法来解决任务变得非常容易,以广泛使用的 Python 的 scikit-learn 库为例,只需一行代码,您就可以获得最常用的算法,随时可以使用。如果你刚刚开始机器学习,并且你真的想亲自动手,抽象算法实现的细节会非常有帮助,我的意思是,我们很多人大多数时候都是通过摆弄代码来学习更多的东西,然后让它工作。
首先把事情做完,然后问你是怎么做到的。
对于许多人来说,这听起来可能是一个愚蠢的想法,但我可以向你保证,这非常有效,你可以自己尝试一下,找到你感兴趣的问题,选择一种算法并使用你可以使用的工具来解决问题,看看你会得到什么结果。他们会问幕后发生了什么,算法到底在做什么?它是如何学习的?你会惊讶于你将学到的东西。
数学仍然扮演着重要的角色
不要误解我的意思,你可以在不了解数学的情况下学到很多东西,做一些令人惊讶的事情,但是如果你的目的是参与、跟随或者仅仅是跟上研究性学习,那么数学可能会帮助你理解算法、公式、学习是如何完成的以及做许多事情。
学习机器学习不需要数学,但它可以帮助你理解许多算法的概念和实现。
最后一件事!
如果你喜欢这些作品,请留下你的掌声👏推荐这篇文章,让其他人也能看到。
你的应用分析太乐观了
原文:https://towardsdatascience.com/your-app-analytics-are-too-optimistic-49c719f790e1?source=collection_archive---------10-----------------------
最新的应用程序更新显示参与度增加?那是错误的。
你为过去一个月完全接受的新功能感到自豪,并等待苹果批准更新,这样你就可以深入分析并为下一次迭代做准备。应用程序获得批准,许多用户下载了它,指标开始进来。40%的用户尝试了你的新功能,完成率达到了惊人的 80%。一个月后,只有 20%的用户尝试了该功能,完成率下降到 40%。你责怪那些尝试过该功能但没有再次使用的用户,所以你重新分析了整个月,以考虑早期用户。指针不动了。发生了什么事?
这是我在为 Anghami 发布的每个功能更新中都遇到的问题,Anghami 是中东领先的音乐流媒体服务,目前拥有超过 6000 万用户。对于每次更新,我们都确保设置了适当的分析事件。一旦发布,我会在 Amplitude 上对用户行为进行深入分析,这是一个很好的应用分析平台,可以很容易地快速获得可行的答案。在解决功能更新难题之前,正确设置分析事件非常重要。
设计适当的分析事件
一个新的特性通常有一定的事件流,在某些情况下可能会导致不同的事件流。为每一步发送一个事件是至关重要的,这样您就可以在以后使用漏斗或路径查找工具进行分析时识别出问题所在。
不要忘记发送一个额外的事件来表明该特性已经打开,这样漏斗就可以提供有用的信息。了解用户如何达到这个功能也很有帮助。用户通常有多种方式来访问您的功能,并且通常会测试多个文本副本,因此了解哪个来源最有效非常重要。
我们最近将跟踪范围扩大到了外部来源,如广告、社交媒体、电子邮件和推送通知。这样我们可以从一个地方分析整个生命周期。
事件通常与屏幕视图相关联,但是用户经常在不切换视图的情况下执行关键行为。例如,点击一个按钮进行应用内购买,会显示第三方警告,而不会切换视图。用户可以在这里取消支付,并保持在同一视图中。但是比较有多少用户选择购买和有多少用户实际购买是很重要的(当然,这应该是另一个事件)。这就是为什么在这里点击购买按钮本身应该是一个事件,即使用户最终没有购买。。
用户群之间的不公平比较
找出一个增强是好是坏包括比较段。在我的分析经验中,细分市场之间的不公平比较就像房间里穿着隐身衣的大象——很难意识到两个细分市场之间的比较是否公平。
回到本文最初的问题:为什么用户对新特性的参与在第一天和第一个月之间表现出非常不一致的结果?问题是,在新功能发布当天尝试新功能的用户会立即更新应用程序,这些用户不是你的典型用户。他们是高度参与的用户,每天打开你的应用程序,并有足够的好奇心来浏览应用程序。本质上,查看一天的范围会使你的结果偏向最活跃的用户。然而,在一个月的时间里,有许多新的或一次性的应用程序用户,因此与日常用户相比,高度参与的用户在每月用户中所占的比例要小得多。这就是为什么与一整月相比,在功能发布后的第一天,参与度指标会有很大变化。
绿线是以前的版本,蓝线是新版本,可以更容易地将歌曲添加到播放列表中。请注意绿线是如何减少的,因为它代表参与度较低的用户。时间会证明蓝线是否能够维持下去。
那意味着你需要等一个月吗?为了得到最准确的结果,是的。但是实际上你不会等一个月才开始下一个迭代,所以你需要找到一个同样投入的观众来比较。可能是一群用户在同一天更新了以前的版本,或者在我们的例子中,用户播放了同样多的歌曲。这样,更新版本的用户与之前版本的用户之间的比较将是公平的,因为你不会偏向更活跃的用户。
不公平的比较不仅仅发生在应用更新上。另一个例子是我们做的一个测试,当用户看到订阅屏幕 5 次后,我们发送一条短信要求他们订阅。为了分析发送短信的影响,我们必须与另一个没有接收到任何信息的部分进行比较,即控制部分。如果控制段是随机的,那么文本消息段当然会有更高的转化率,因为它专注于已经看过订阅屏幕 5 次的高度参与的用户。这是一个不公平的比较,可以通过与也看过订阅屏幕 5 次,但没有收到任何消息的用户进行比较来解决。
分析时不要只关注转化率。还有其他维度需要考虑,比如转换时间。此外,确保将漏斗设置为较短的持续时间,以便事件序列不会分散到几天内。也就是说,有时候你想把事件分散开来,看看某个限制是否影响了用户以后的购买决定。
我看到的结果有多有效?
一旦结果出现,一旦获胜部分显而易见,人们就会兴奋起来。但有一个小小的担心,来自应用程序的事件数据并不完全正确,或者你创建的复杂图表在某些地方是错误的。
有一个非常快速的方法来验证事件数据:将您正在验证的独特事件按平台进行细分,并检查这些数字是否与您的用户的平台分布成比例。切换到“活跃%”,这样振幅会自动计算平台的百分比——您应该在这里得到类似的百分比。然后比较用户发送事件的平均次数,确保两个平台不会相差太远。这些步骤至少足以指出某个地方是否存在数据收集问题。
iOS is doing something wrong here. But we fixed it and it’s converging again.
很难验证您的图形设置是否正确,但以下技巧应该可以做到:
平台分布:你比较的细分市场是在同一个平台分布吗?如果一个细分市场主要包括 iOS,而另一个主要包括 Android 和 Web,结果将会产生误导。甚至版本也很重要,所以一个只包含最新 iOS 版本的细分市场不能与另一个包含所有 iOS 用户的细分市场相比较。
新用户与现有用户:不要将新用户与现有用户进行比较,除非你真的在比较新用户与现有用户的行为。
参与度更高的用户或技术用户:确保一个细分市场不会偏向参与度更高的用户。对发烧友用户的细分(比如说,他们改变了均衡器设置)不能与普通观众相比。
每个细分市场的规模:确保每个细分市场的用户数量是合理的——一个拥有 5 万用户的细分市场与 200 个用户相比是不可行的。
巨大进步:您的细分市场对比是否显示出巨大进步?有可疑之处。你做的一个小的改变有 50%的改进是一个错误的信号。
每周 vs 每日:每周的窗口可以修正轻微的变化,但过多的每日波动不是一件好事,尤其是如果它是一个大的用户池。设置一个每日窗口,并验证所有日期的趋势是否相同。一致的趋势令人放心,但如果每天都有大量波动,那就有理由担心了。
数据看起来很奇怪
所以你验证了数据并意识到有猫腻。这些解决方案适用于大多数情况:
外部因素:营销团队是否发起了你不知道的活动?运营商是否向您的某个市场发送了群发短信?这些可能是图中出现无法解释的峰值的原因。这里一个很好的起点是按国家细分,因为大多数外部因素一次只影响一个国家。然后你可以问团队类似“1 月 11 日埃及发生了什么?”
The surge in liking songs on a particular day was due to a huge hit song being released
数字仍然很低:发布已经有几天了,数字太低,还不能下结论,但是你还是需要做点什么。切换到日视图,看看趋势是否一致。
稍有错误的数据:有一些小错误可以在事件发送后被纠正。如果一个应用程序发送了错误的事件名称,或者事件属性在平台之间不一致,那么振幅自定义事件可以通过重命名事件来轻松纠正这些问题。因此,即使没有应用程序更新,您仍然可以整体分析。
真正错误的数据:结果中有一些非常奇怪的东西,你甚至不能确定来源。此时,您可以让后端团队参与进来。他们通常有需要分析的数据,您可以直接从数据库中查询这些数据进行验证。但是,为了与您创建的图形进行正确的比较,backend 可以将这些事件转发给 Amplitude。一旦完成,找到罪魁祸首就变得容易多了。
长期思考
在像昂哈密这样快速发展的创业公司,我们不能等待很长时间才采取行动。好的一面是,我们不需要这么做,而且我们已经通过使用上面的技巧发布新功能时的分析,受益于大量可操作的见解。也就是说,两个月后再来检查并验证事情是否仍在正轨上是非常重要的。
当 2 个月过去了,仅仅看用户进入和完成特性漏斗的百分比是不够的。漏斗转换和流失有什么关系?也许这个新特性提供了很好的指标,但是引起了不必要的变动。客户流失既可能与产品特性有关,也可能与产品的传播方式有关。
Stickiness of a feature: users coming back the next day and using that feature again, measured over a month
试过这个功能的用户回来了吗?最初的漏斗可以显示非常好的指标,但大多数功能只有在引起粘性时才是成功的(多次使用该功能)。
A feature that’s dying off
撇开入职不谈,两个月后再来检查的一个最重要的原因是新鲜感的消退。引入一个功能,甚至改变一个组件,都会在那一刻增加用户的参与度,只是因为它对用户来说是新的。一项功能或变化只有在用户持续参与两个月后才是可持续的。但不要因此而放慢脚步,因为我提到的所有方法都可以帮助你,从设计分析事件到在发布时验证数据。
你那糟糕的机器学习算法没有按预期工作?
原文:https://towardsdatascience.com/your-badass-machine-learning-algorithm-is-not-working-as-expected-b9dd725d0b6?source=collection_archive---------5-----------------------
机器学习以及数据科学和大数据是一个热门词汇,任何与技术相关的人都在工作、大学或至少在互联网上读到过。不仅如此,机器学习在日常生活中如此普遍,以至于许多人在没有意识到的情况下使用它:电子邮件服务中的自动垃圾邮件分类、语音到文本转换、信用卡交易中的欺诈检测、基于偏好和以往购买行为的电子商务推荐。
在过去的几十年里,许多性感的算法,如人工神经网络,随机森林和支持向量机,已经被提出来承担像线性回归这样更无聊的技术留下的任务。任何机器学习领域之外的人,如果见过深度神经网络在图像识别方面的能力,可能会错误地认为它可以轻松解决简单得多的任务。甚至相当多的人可能已经实现了这些复杂算法中的一个,但结果令人失望。这是因为在统计学中没有免费的午餐:没有一种方法在所有可能的数据集上支配所有其他方法。为了理解为什么一个算法没有像预期的那样工作,我们必须考虑一些因素,这些因素将在监督学习的回归设置中讨论。
首先,任何机器学习问题都是从观察 p 个不同的特征 X 和一个定量的反应 y 开始的,期望它们之间有某种关系。这种关系可以写成非常一般的形式 y=f(X)+e,其中函数 f(X)指定系统信息,量 e 包含也与 y 相关的未考虑的特征或不可测量的变化。也就是说,f(X)是特征的某个固定但未知的函数,E 是独立于所述特征的随机误差项,期望值 E[e]=0。在这种情况下,人们必须求助于一组基于 n 次观测来估计 f(X)的方法。现在,由于误差项平均为零,因此可以使用 y=f(X)来预测 y,其中 f*(X)表示 f(X)的估计值。
通常,均方误差 MSE=E[(y-y*) ]用于评估算法在给定数据集上的适当性。一般而言,如果预测值为 y 提供了准确的预测,则 MSE 将会很小,如果其中一些预测与 y 有显著差异,则 MSE 将会很大。由于大多数算法专门估计参数以最小化训练集 MSE,因此将此测量报告为模型对未知数据的预期性能并不是一个好主意。这就是为什么需要测试集的原因,测试集通常是通过分离一些观察直接获得的,或者是通过实现交叉验证等技术间接获得的。
可以证明,检验 MSE 总是可以分解为 f(X)的方差、f(X)的偏差平方和误差项 E 的方差之和,用数学术语来说,MSE = E[(y-y *)]= Var[f(X)]+Bias[f(X)-f *(X)]+Var[E]。在接下来的章节中,我们将从两个角度来深入了解这一重要指标的分解。
可约与不可约误差
y作为 y 的预测值的准确性取决于两个分量:由 Var[f(X)]+Bias[f(X)-f(X)]给出的可约误差和由 Var[e]表示的不可约误差。出现可减少的误差是因为 y的精度可以通过实施更好的算法来估计 f(X)而提高。另一方面,即使有可能得到 f(X)的完美估计,y仍然是一个近似值,因为 y 也是 e 的函数,根据定义,它不能用 X 来建模。
偏差-方差权衡
学习算法通常可以基于它们的灵活性进行比较,即它们产生不同形状来估计 f(X)的能力。这种灵活性在某种程度上直接受模型中参数数量的影响,或者更正式地说,受其自由度的影响。结果表明,随着模型灵活性的增加,训练 MSE 单调下降。相比之下,当允许更大的灵活性时,测试 MSE 最初下降,但在某一点上稳定下来,然后开始增加,显示出典型的 U 形。因此,如果模型比需要的更灵活,预测可能会产生较小的训练 MSE,但会产生较大的测试 MSE,从而为称为过度拟合的现象提供了空间。
这个 U 形是任何算法的两个竞争性属性的结果,称为偏差和方差。当 f*(X)的形状实质上不同于 f(X)的形状时,偏差被引入到预测中,并且因此受到学习算法的选择的影响。同时,当训练观测值的数量与参数的数量相比较低时,会导致方差,使得对这些参数的估计会在来自相同生成过程的训练数据集之间显著变化。一般来说,不灵活的模型往往具有高偏差和低方差,反之亦然,从而导致所谓的偏差-方差权衡。
最终,永远记住:垃圾进来,垃圾出去。重要的是要熟悉手头问题的背景,包括相关特征,通过尝试假设不同形状的不同算法来选择最合适的技术(例如线性与非线性),并获得足够的观察数据来训练它们。
参考文献:
James,g .,Witten D .,Hastie T .和 Tibshirani,R. (2013 年)。统计学习入门。纽约:斯普林格。
“您的数据隐私已更新”——感谢您再次忽略它!
原文:https://towardsdatascience.com/your-data-privacy-was-updated-thanks-for-ignoring-it-yet-again-9f6d1d567997?source=collection_archive---------3-----------------------
Photo by Joe Green on Unsplash
下雨了 GDPR 的电子邮件,为什么一个盲目的'我同意'是不行的
垃圾邮件发送者在过去的一周有一些严重的竞争。几乎每一个网站和任何实体,哪怕只有一点网上存在的影子,都在忙着向网络发送那种“隐私更新”电子邮件。虽然我们的本能反应是点击屏幕上的任何地方来摆脱这个的麻烦,但这可能不是现在最好的做法。
这篇文章不是关于 GDPR 的入门,有来自 NYT 和其他几个人的好文章。除了我们作为用户现在可以做的一些实际事情之外,这是对作为数据科学从业者的数据的深远影响的反映。
无条件适用
我们已经习惯了【条款&条件以至于在注册任何新服务时,我们几乎连眼皮都不眨一下。以至于,如果一个应用程序强迫我们在勾选“我同意”之前向下滚动,它在我们的感知用户体验中就会下降一个档次。我们想知道 Chrome 是否也能自动完成这项工作。
然而,当我们在几天内突然收到一系列关于同一主题的电子邮件时,这激起了一些好奇心。这变得很奇怪,当我们听到来自我们从来不知道存在的公司的消息时,尤其是当他们的电子邮件谈到他们将如何开始与我们成为朋友并开始友好地对待我们的数据时。
数据隐私不仅仅属于法律论坛的范畴。作为了解数据力量的数据科学从业者,作为为互联网的发展做出贡献的消费者,这种变化至少需要我们的一点点关注。
不信任和谨慎是安全之母。—本杰明·富兰克林
为什么在数据政策上如此大惊小怪?
实质上,GDPR 法规要求公司在收集数据时必须征得用户同意,并且只分享那些使其服务正常运行所必需的数据。这是一项简单的措施,旨在通过尊重网民访问、更新或删除其数据的请求,将权力还给他们。
看起来令人惊讶的是,这样一个明显简单的变化(以及一些经济处罚)引发了所有这些行动。可以理解的是,公司可能需要更新他们的一些条款以符合法律规定,即使他们可能会负责任地处理数据。我收到了一封比其他邮件得分高的邮件,其中宣称政策没有改变。
然而,如果仅仅因为这项规定,公司就不得不彻底改变他们的工作方式,向用户披露新的东西,那就有些不对劲了。不难猜测,这些公司可能一直出于可疑的原因践踏我们的个人数据。
例如, Twitter 现在向你显示与你分享数据的广告商名单。我找到了一份大约 200 个(不是随机的)广告商的名单,Twitter 已经与他们分享了我的数据,我可能还会出现在 1200 多个定制的受众名单中。这一切都是在的新设置中默认‘开启’,在上周出现在 Twitter 上的显然无害的‘我同意’按钮下。
关于其他许多大网站也有类似的记述。这正是为什么这需要一些关注。
如果你不付钱,你就是被卖的产品。安德鲁·刘易斯
数据科学和隐私——一颗滴答作响的定时炸弹
鉴于当今数据分析的巨大力量,消费者数据是一个完美的切入点——a)一天中的海量流数据,汇集了各种用户兴趣和 b)先进的算法,可以解开甚至用户都没有意识到的偏好。
正是这种金矿的发现,让许多公司竭尽全力追逐它们。还有那些黑暗势力已经开始开采这些金矿,并向出价最高的人出售见解。这种缺乏公司内部道德规范以及缺乏明确的数据法规的情况导致了严重的隐私泄露。
作为数据科学领域的从业者,我完全支持充分利用数据来简化生活,让机器为我们工作。但是,在控制松懈的情况下,涉及消费者数据的数据隐私是一个定时炸弹,只是等待爆炸。
剑桥分析这样的漏洞只是冰山一角。数据的力量远不止这些。考虑到如此巨大的风险,在这种情况下,以下三点可能会有所帮助:
- 公司负责任地使用数据展示高道德标准和自我控制
- 严格的法规和惩罚性的措施,至少在可能的范围内控制着黑暗势力
- 意识增强的用户要求正确的数据实践并质疑任何可疑的标准
在这些事情落实到位之前,我们所能做的就是希望不会发生重大违规事件,这可能会让用户深深陷入对数据和技术整体的不信任。
那么,我们能清除数据痕迹吗?
万一你想清理你的网页历史,抱歉,这真的没关系。这里有一个精彩的结尾片段,摘自雷·库兹韦尔的书《T2:奇点临近》(T3),书中有一段虚构的对话,对话的主角是生活在 2004 年的人类莫莉和来自 2048 年的未来机器人乔治。
意识到即将到来的奇点,人类试图在准备中完成一些奇怪的任务,同时也试图“修复”一些不方便的数字记忆。看看机器有趣的反应。
乔治大约 2048(机器人):哦,我可以帮你处理。
莫莉 2004: 那真的没有必要。我完全有能力自己做这件事。我可能还想删除一些文档——你知道,我对我认识的几台机器有点冒犯。
乔治 2048(机器人):哦,机器无论如何都会找到它们的——但是别担心,我们非常理解。
任何已经在互联网上的数据都被可疑地永远铭刻在以太中。试图抹去我们在网络上的数据痕迹的膝跳反应是徒劳的。此外,技术的好处大于它的风险,所以在这个节骨眼上变成一个不相信数字的人不是一个好主意。
但是,我们现在能做的是利用这些法规和一系列电子邮件来发现谁拥有我们的数据。通过利用现在已经开放的渠道,很容易删除所有未知或未使用的帐户。花几分钟在所使用的服务上,将数据共享限制在那些您可以从共享的社区见解中受益的渠道也是有意义的。
对数据科学充满热情?随时加我在LinkedIn或者Twitter。
[## Ganes Kesari | LinkedIn
在其他网站上包含此 LinkedIn 个人资料
www.linkedin.com](https://www.linkedin.com/in/ganes-kesari/)
你的医疗数据构成了数十亿美元的生意
原文:https://towardsdatascience.com/your-medical-data-makes-up-for-a-multi-billion-dollar-business-e43f4044b3f5?source=collection_archive---------15-----------------------
Photo by National Cancer Institute on Unsplash
无论行业规模大小,网络攻击、勒索软件和恶意软件攻击都是最大的威胁。组织没有做好准备来保护数据免受网络攻击。这主要是由于缺乏财政资源和对所需措施的认识。尽管许多攻击都是针对金融和银行公司的,但医疗保健是黑客的另一个重点领域。随着黑客不断窃取数据,网络威胁已经不可避免。医疗行业是成熟的行业,黑客的目标主要是窃取患者的电子健康记录。
如果我们进一步诊断该行业的健康状况,那么医疗保健行业被黑客列为五大优先行业就不足为奇了。IBM 最近的一份报告也显示了类似的趋势。攻击 wannacry 影响了大约 30 万台计算机和 150 个美国国家,这是一个警钟。许多组织开始加强他们的安全协议来应对日益增长的威胁。然而,黑客们正在挑灯夜战,获取价值数百万的数据,并在黑暗的网络上出售。
当你知道这种数据有巨大的市场,并且在许多情况下,需要特定组织和医疗保健提供商的数据库时,你不会感到惊讶。以下是对数十亿美元产业运作的深入了解。
是什么让 EHR 有价值
电子健康记录是在电脑上而不是在纸上的数字记录。这些记录不仅包括患者的健康数据,如临床试验和测试结果,还包括其他价值数百万的机密信息。这些信息包括患者地址、信用卡号、社会保险号和其他被滥用的关键凭证。例如,信用卡号码被用来从病人的账户中吸走钱。同样,社会安全号码被用来欺骗保险公司要求虚假索赔。此外,患者数据以设定的价格出售给客户,从而黑客通过这种方式赚取收入。
隐藏的数据经济
当我们了解 EHR 数据的价值时,我们需要知道的下一件事是这些被窃取的数据是否有市场。患者通常不知道他们的个人数据,如他们被发现呈阳性的测试和他们接受的手术都在出售。这些被盗数据主要是通过黑暗网络提供的,这也产生了巨大的需求,从而转化为价值百万美元的业务。这种由被黑客攻击的数据创造的隐藏数据经济被进一步挖掘,并使用其他资源(如药房)交叉引用数据。然后,个人病历被赋予代码,而不是使用姓名。
一个这样的卖家在暗网上说有一个买家特别想买“保险公司的记录”。这些数据为买方净赚了 10,000 美元,因为这还包括获取数据所付出的努力。因此,数据不仅被出售,而且被公开宣传。卖家甚至吹嘘在网上泄露数据。
网络犯罪即服务
以前,网络犯罪仅限于技术黑客,但现在情况发生了很大变化。窃取数据不再需要熟练的技术,因为根据研究人员的说法,工具已经被开发出来,非技术型窃贼只需一点免费的技术支持就可以从组织中窃取 EHR 数据。网络犯罪即服务是一项不断增长的业务,并在持续创收。
能做些什么?
为了遏制黑暗网络市场,第一步也是最重要的一步是识别风险以及您的数据如何被泄露。通过使用加密和合规程序,确保抵御外部威胁的能力将大大降低。第三方风险是为避免数据泄露而必须考虑的另一个方面。
迫在眉睫的麻烦
患者对医疗保健提供者的信任度包括对其信息安全的信任度。尽管如此,信任还是被破坏了。但更大的问题是,作为患者,我们是否愿意将我们的数据用于科学研究和其他非法用途。允许使用病历的选择必须由病人决定。目前情况并非如此,剥削十分猖獗。为了遏制这些活动,政府和我们作为公民都需要采取严厉的措施。需要遵循严格的安全协议,并且必须进行尽职调查。
您更聪明的分析策略
原文:https://towardsdatascience.com/your-smarter-analytics-strategy-97fb3a1c1b1f?source=collection_archive---------1-----------------------
最近,我有幸在纽约市的社交媒体战略峰会上做了一个 3 小时的分析策略讲座。
会议内容包括:
- 成功分析策略的要素
- 人工智能的发展对分析意味着什么
- 如何定义和传达分析框架
- 如何为一系列利益相关者设置分析仪表板
- 最佳分析团队所需的人员和技能
- 当今使用人工智能和 NLP 的品牌案例研究
- 提高营销活动评估的实用技巧
本文末尾有一个完整演示文稿和附带注释的链接。在这里,我提出了一些要点来突出我的想法。
分析能实现什么?
分析平台可以回答许多重要的问题,但通过分析策略,我们意味着对我们的数据来自哪里、为什么可靠、我们的测试方法是什么以及我们最终希望通过数据显示实现什么有一个清晰和有记录的视图。
分析策略也有不同程度的复杂性,从回顾性方法到前瞻性学科,如规范或自主分析:
PwC
2017 年企业的许多日常工作都属于描述性或诊断性分析的定义。我们习惯于访问分析平台,以了解我们在过去几天或几周内观察到的趋势。
然而,许多组织正在超越这一点,进入更复杂、更有利可图的分析领域。
华盛顿塔科马的一家动物园与国家气象局合作,以确定导致游客人数如此不可预测地上升和下降的因素。这给管理层带来了问题,他们总是会为公园配备员工以迎合大量观众,但如果游客数量低于预期,他们往往会在工资上超支。
凭直觉,我们可以假设,在温暖干燥的日子里,上座率较高,但在寒冷或潮湿的日子里,上座率较低。然而,通过将国家气象局的数据纳入 IBM 的人工智能驱动的沃森平台,动物园能够准确地确定哪些条件导致更多人参观。
这一知识随后被用于模拟未来的游客模式,使用历史游客人数和预测的天气统计数据。
Hopper 通过预测未来的价格模式并提醒旅行者购买飞往他们首选目的地的航班的最便宜时间,领先一步。
它通过每天观察数十亿的价格,并基于每条路线的历史数据,预测趋势将如何发展来做到这一点。然后,用户可以设置通知,提醒他们在价格下降时预订。
尽管 Hopper 不是唯一一家提供这种服务的公司,但它的预测准确率高达 95%。
数据通过沃尔玛的“数据咖啡馆”在云中管理,该咖啡馆由硅谷的沃尔玛实验室团队维护。这是一项复杂的、大规模的工作,要根据可靠的数据做出准确的预测,就需要与如此规模的企业所需的变量数量保持一致。
他们网站上和商店里的一切都被同时跟踪,所有来自销售点系统的数据都与在线转换同步。
这使得沃尔玛能够毫不费力地转移库存,并确保它总是在正确的地方以正确的数量提供正确的产品。
问正确的问题
一个好的分析策略始于对企业希望用数据来回答的问题的纯粹理解。这提供了一个框架,我们可以据此评估我们所掌握的数据的数量和质量,以提供令人满意的答复。
我们可以对这些问题进行分类,为我们发现增加更多的结构:
从这里,有一个清晰的过程。我们有一个更广泛的业务目标,并定义数字化如何实现这一目标。下一步是开始询问可能帮助我们更接近目标的问题,这将揭示我们需要测量的指标,以提供结论性的答案。
分析战略框架
PwC
付诸行动:
PwC
获得正确的测量值
基本指标的一个例子是客户终身价值。当我们审视像社交媒体这样的努力时,或者当我们开始定义归因模型时,这一点就显得尤为重要。如果我们知道我们的客户终身价值,并且我们对我们的归因模型有信心,我们可以将商业价值应用到我们的品牌和我们的受众之间的任何在线互动中。
这是衡量策略的重要组成部分,是我们在开始任何数字活动之前都应该定义的东西:
下面,我总结了会议的主要收获,但我也包括了幻灯片的链接。在该资料中,有关于谷歌分析设置、归因模型以及将分析融入公司文化的深入章节。
[## 您更聪明的分析策略
你更聪明的数据分析策略 Clark Boyd,2017 年 10 月
docs.google.com](https://docs.google.com/presentation/d/193iZ60lo7waACgkanElfQ1rYHmbyzDEsBgxTHphGMYA/edit?usp=sharing)
希望你觉得有用!
你太依赖数据了
原文:https://towardsdatascience.com/youre-relying-on-data-too-much-250d4edc70c3?source=collection_archive---------5-----------------------
让决策变得更糟,而不是更好
当你在经营一家企业时,你的工作可以归结为做出一系列重要决策:是否应该推出新产品?一个部门该不该解散?是否应该开展营销活动?每个决定都有风险和回报——你会赚很多钱还是花光它们?人们很容易相信在灾难的宇宙中只有一个正确的选择,而高管的工作就是找到那个选择。
每一本畅销的管理杂志都会告诉你,21 世纪闪闪发光的救世主是数据。充足的数据会让你不做出任何错误的选择。存储关于客户、产品和营销的数据。然后雇佣一些聪明的数据科学家,你很快就会从错误中解脱出来。谷歌“数据驱动的决策”,你会发现数百篇关于你如何没有收集足够的数据,监控足够的 KPI,或让足够多的数据科学家进行足够多的分析的管理文章。
科学债务是大卫·罗宾逊创造的一个术语,它敦促企业决定哪些分析是重要的,应该立即关注,哪些领域的研究可以推迟到以后。在这里,你的债务就是知识。这一概念允许公司预先讨论他们的数据科学优先事项。每个公司都应该积极考虑他们的科学债务。
在我与许多企业合作的这些年里,我确实看到一些公司陷入了没有充分利用数据的情况。然而,与我看到的相反问题的次数相比,这些事件就相形见绌了:过度依赖数据到了有害程度的公司。做出好的决策需要数据,这种想法是有害的。
更多的数据和分析有助于更好的决策,这种想法从根本上说是错误的。
想想最近的一个故事,关于可口可乐如何利用人工智能创造新的汽水口味。在完成公关后,很明显可口可乐利用他们的自由式风味机数据看到人们经常选择添加樱桃的雪碧。有了这些知识,可口可乐在商店里推出了樱桃雪碧作为自己的汽水系列。忽略“我们聚合了数据,Cherry Sprite 很受欢迎,所以我们推出了它”这一事实是有史以来声称某些东西是人工智能的最恶劣的例子,这也是数据如何伤害决策的一个很好的例子。
想想看,虽然樱桃雪碧是一种前所未有的新口味,但极其相似的口味樱桃 7UP 已经存在了三十年!“人工智能”结合来自数百万消费者的数据,创造了一种味道,这种味道可能是一位可口可乐高管走过杂货店过道时想出来的,“我们应该复制它。”与在数据基础设施上投资数百万不同,窃取创意是免费的。
如果一位可口可乐高管可以在过去三十年的任何时候制造出这种解渴剂,为什么樱桃雪碧直到涉及大数据后才上市?据我所见,当人们含蓄地知道一个想法是好的,但他们不能让其他人加入时,这些情况就会发生。多年来,可能有数百名可口可乐高管认为樱桃雪碧是一个好主意,但他们从来没有达到推出该产品所需的临界质量。只有当一个人得到自由式数据时,这个人才能让公司相信这种味道是好的。
This cold boy was quenching thirsts before AI was even trendy.
这并不是说数据对决策很重要,而是说如果你只用数据做决策,那么你的机会就会受到限制。如果可口可乐早十年推出樱桃雪碧,他们会多赚多少钱?有多少汽水口味是人们会喜欢的,但永远不会推出,因为它们不存在于自由式机器中?通过限制自己只做那些有足够数据的决策,你大大降低了公司可接受的解决方案集。通常,公司能够做出的最具创新性的改变是那些事先没有任何可能数据的改变。
但是真正的问题是:即使你有好的数据,你的分析也总是包括假设。如果这些假设是错误的,你的分析会给出一个糟糕的结果。这些糟糕的结果会导致组织做出比不使用数据更糟糕的事情。如果一家公司试图推出一种新产品,他们可能会分析类似的现有产品来预测投资回报。但是,假设哪些产品是相似的会极大地改变分析,而且没有办法知道哪些产品会有相似的表现。新产品的行为可能与任何现有产品都不一样,通过分析,你误导了公司对将要发生的事情的认识。作为数据科学家,我们应该希望平均来说我们的方向是正确的,但这是不可能知道的。数据不能取代人类的直觉,也不能消除风险。
当数据与其他因素一起用于决策时,有缺陷的分析就不是问题了。其他因素弥补了这一点,组织将做出强有力的决策。当数据对于决策是必要的时候,有缺陷的分析是一个大问题。高管们让糟糕的假设成为过去,因为这是他们推出想法的唯一途径。这就围绕着“我们用数据来支持我们所有的决策”这一听起来很积极的想法产生了非常消极的企业文化。
要点不是数据不好,你不应该想用它。相反,数据和分析应该与其他决策工具一起使用,如市场研究、以前的经验和概念验证试验。将分析视为只会做出更好决策的东西,你就冒着创造一种环境的风险,在这种环境中,你的可能性受到限制。不要把数据当作真理的唯一来源,否则你将会等上几十年去尝试另一种新的汽水口味。
如果你想要一大堆帮助你在数据科学领域发展职业生涯的方法,看看我和艾米丽·罗宾逊写的书: 在数据科学领域建立职业生涯 。我们将带您了解成为数据科学家所需的技能,找到您的第一份工作,然后晋升到高级职位。
青年选民疲劳——事实还是虚构
原文:https://towardsdatascience.com/youth-voter-fatigue-fact-or-fiction-33d4d2b3037?source=collection_archive---------24-----------------------
我相信你以前听过这样的话:新注册的、精力充沛的年轻选民参加了他们的第一次选举,然后当他们参加的选举没有按照他们希望的方式进行时,他们就退出了这个过程。
Turnout trend by age, for those who were registered to vote in North Carolina and voted in the 2016 general election.
从登记选民的投票率来看,这一理论似乎是正确的。在 2016 年的大选中,北卡罗来纳州登记投票的 18 岁年轻人中有 67.2%参加了投票。但是年轻人的投票率并不总是这么高。在登记投票的 23 岁年轻人中,2016 年只有 47.2%的人投票。自然,这就引出了一个重要的问题。
23 岁的人 客观上 投票率比 18 岁的人低吗?
投票率 真的在 18 岁后 下降吗?
这一探索的结果有着有趣的含义,考虑到如果投票率的下降真正反映了年轻人的行为,那么投票率整体上升的潜力是巨大的。如果我们能让这些年轻选民参与到他们的生活中,而不是在他们 20 多岁时退出,我们国家的选民可能会有很大的不同。大多数人都会同意,年轻人更多的政治参与只会有利于我们的民主。
因此,为了测试这种投票率下降是否合理,我计算了投票率占公民投票年龄人口的比例,并将这些投票率值与已经登记投票的投票率值进行了比较。
Turnout trends in North Carolina for the 2016 general election by age among registered voters and citizens.
在计算了登记选民的投票率和公民的投票率之后,这个发现是引人注目的。尽管公民投票率似乎略有下降,从 18 岁时的 45.8%下降到 24 岁时的 41.3%,但这一下降远不如登记选民中相对急剧的下降那么明显。公民投票率的总体趋势是随着年龄的增长而增加,而登记选民的投票率给了我们一个完全不同的想法。
考虑到 2016 年可能是数据中的异常(考虑到我们在那个选举周期经历了多少怪癖),我们来看看其他选举年。
通过观察 2014 年、2012 年和 2010 年的结果,我们可以得出结论,这种现象并不局限于任何特定的选举周期,也不局限于任何类型的选举。在登记选民中,18 岁以后投票率下降是普遍现象;而公民投票率通常会随着年龄的增长而增加。
虽然一些选举确实显示投票率略有下降,如 2012 年和 2016 年(有趣的是,两次都是总统选举),但登记选民的百分比下降总是大于公民的百分比下降,如下表所示。
我怀疑这种现象可以归因于选民登记记录中的“朽木”,即已经改变地址但仍然存在于选民登记名册中的人的残余,这是因为《国家选民登记法》要求选举官员只有在一些联邦选举中未能投票后才能删除选民。我们看到的投票率下降可能是一个分子膨胀的症状,这是由于在登记投票率计算中,夸大了年轻人的登记人数。考虑到年轻人频繁流动的倾向,年轻人在记录上有夸大的注册数量是有道理的。****
如上所述,总统选举年的登记选民投票率下降幅度似乎更大。第一栏显示了从 18 岁到当年最低投票年龄的登记选民投票率下降的百分比。第二项显示了同一年龄范围内公民投票率的百分比变化。第三列是前两列的补充,可以解释为登记选民投票率的下降在多大程度上是“朽木”的结果。在两次总统选举中,登记选民的投票率再次出现了最大幅度的下降。
如果投票率的下降是由于选民登记名册中没有更新的地址的变化引起的,我们可能会怀疑“朽木”的水平因种族而异。种族会影响注册选民投票率下降的幅度吗?
上面的图表描述了不同种族和族裔的选民在 2016 年大选中的登记选民和公民投票率。乍一看,似乎每个登记的投票人数都有相似的下降。另一方面,公民投票率在不同种族和民族之间差异很大。
从左边的表格中,我们可以看到每个种族和民族群体的公民投票率都有所下降。但是,在每一种情况下,登记投票率的下降幅度都大于公民投票率的下降幅度,这继续表明登记投票率由于登记人数的膨胀而呈现出错误的趋势。第三栏再次显示了登记投票率和公民投票率之间的百分比误差。这一分析显示,美国土著选民受登记记录中“朽木”的影响最大,其次是黑人选民。
应开展进一步研究,将其他国家包括进来,并扩大观察的选举周期的数量。查看选民登记记录以确定这些被夸大的登记属于谁以及它们为什么会出现在系统中也是很有趣的。然而,我们必须谨慎行事,不要鼓励进一步努力将选民从名册中清除出去。
与此同时,我们需要改变年轻人参与选举进程的说法。我们的结果表明,年轻人并没有因为选举失败而疲惫不堪,他们首先还没有被动员起来。让我们停止通过散布虚假的投票模式来阻止年轻人投票。
方法:
数据
使用的数据来自北卡罗来纳州的 FTP 网站,可以在这里找到。我使用了一个包含全州选民历史的文件和四个用于不同选举的不同选民登记文件。幸运的是,北卡罗来纳州在每次重大选举之前都会上传选民登记文件的“快照”(2010 年除外),所以这是我在查看特定选举时经常使用的选民登记文件。为了计算市民估计,我使用了三个美国社区调查数据文件的组合,分别用于市民估计、年度人口估计和按年龄划分的人口统计。
算法
对于每次选举,我的代码基本上分为两个主要部分:查找登记选民投票率和公民投票率。两者都是从为适当的选举过滤投票历史文件开始的。
然后,我将投票历史文件和选民登记文件合并在一起,创建一个数据框,其中只包含在我感兴趣的选举中投票的人,还添加了选民登记文件中的有用信息,如年龄。接下来,为了计算登记的选民投票率,我计算选民登记文件中的人数,合并文件中的人数,并将结果保存到一个新的数据框中。注册投票率是这两个值的划分。
为了计算公民投票率,我首先找到每个年龄段的估计人数。现有数据是 7 月份发布的年度估计值。为了更好地估计 7 月估计和 11 月选举之间的人口增长,我添加了选举年估计和即将到来的选举之间的差异,并乘以选举年估计的 0.3。
然后,我需要用公民占人口的百分比来缩小这个人口估计。我有每个年龄组的公民人数的数据,我用它来计算每个年龄组中有公民身份的人的百分比。利用这些群体估计,我缩小了人口估计。
对于公民投票率,分子与登记投票率相同,因此我在这里简单地使用相同的数据并计算新的投票率数字。
为了按种族划分这些趋势,我简单地再次过滤了选民登记文件,以表明我正在分析哪个种族或民族代码。
按种族划分的公民投票率也必须被编辑。我使用之前的同一个文件来获得按年龄划分的人口估计值,这一次在我的计数中指定我想要哪个种族或民族的数据。和以前一样,我使用之前发现的年龄范围公民百分比来缩小公民估计的人口估计。在未来,我更倾向于使用每个种族或民族类别的公民百分比来缩小人口估计,而不是总人口的公民百分比。同样,如果我能找到一个包含按年龄而非年龄组划分的公民百分比的数据集,这将使我的公民投票率计算更加准确。
我所有的图表都是用 ggplot 创建的。我使用了一个自定义的主题,你可以看到下面的细节。
挑战
这个项目最大的挑战之一当然是分析大型数据文件。我不得不导入四个不同的选民登记文件,每个文件在 4g 到 16g 之间,另外一个 5gb 的文件包含该州的投票历史。这意味着我的电脑运行我的代码非常非常慢。如果我幸运的话,整个脚本运行需要 1.5 小时。然而,比我愿意承认的更多的是,由于我的计算机完全崩溃,我的编码会话结束了。谢天谢地,这个问题只需要耐心就能解决。
占据我更多时间的一个挑战恰好是选民登记文件的细节。北卡罗莱纳州在他们的登记文件中有一栏显示了选民的身份,可以标记为“活动”、“不活动”或“已删除”。当我开始这个项目时,我将“被移除”的选民包括在我的计算中,我很快意识到这使我的数据失去了意义。
2016 North Carolina registered voter turnout with “removed” voters included
这张图表看起来与我在本文中使用的登记选民投票率完全不同,因为它在分子和分母中包括了已经从选民登记名册中“删除”的人,使得两者都比它们应该的要大。然后,我试图通过编辑分母来计算登记的选民投票率,只包括登记文件中标记为“非活动”或“活动”的选民。
这一变化帮助我的曲线看起来更接近预期,除了公民投票率高于登记投票率,这违背了逻辑。这个问题是由于我没有从投票历史记录和注册记录中过滤掉“被删除”的投票人。由于地址的变化,许多被标记为“已删除”的人在选民登记文件中有多行,其中只有一行被标记为“活动”。如果我忽略了过滤掉被除名的选民,而那些有多次被除名历史的选民中有一个碰巧投票了,他们的其他历史就会被算作 2016 年的选票。显然,这夸大了分子中的人数,使百分比上升到看似合理的水平之上。
Youtube 浏览量预测
原文:https://towardsdatascience.com/youtube-views-predictor-9ec573090acb?source=collection_archive---------0-----------------------
由机器学习支持的获得更多 YouTube 浏览量的综合指南
这个项目是由艾伦·王、阿拉文·斯里尼瓦桑、凯文·易和瑞安·奥法雷尔建造的。我们的脚本和模型可以在这里找到。
在这里输入你自己的缩略图和标题到我们的模型来预测你的视频的浏览量。
背景
在过去的 5 年里,YouTube 已经向 YouTube 内容创作者支付了超过 50 亿美元。流行的 YouTuber PewDiePie 在 2016 年仅从 YouTube 就赚了 500 万美元,这还不包括赞助、代言和 YouTube 以外的其他交易。随着越来越多的公司转向 YouTube 的影响者来吸引千禧一代的观众,让人们在 YouTube 上观看你的视频变得越来越有利可图。
我们的目标是创建一个模型,帮助有影响力的人预测他们下一个视频的浏览量。Youtube 上的内容涵盖了各种类型,如喜剧、体育、时尚、游戏和健身。由于问题的严重程度,我们将范围缩小到了与健身相关的视频。健身内容是 YouTube 的一大部分。人们正涌向免费的在线健身内容寻求建议,而不是雇佣昂贵的私人教练。
一个人在看 YouTube 推荐的相关视频时,首先会看到标题和缩略图。如果特定的标题和缩略图可以产生更多的潜在视图,YouTuber 可以使用这些信息来产生他们努力工作的视频内容的最大潜在视图。因此,我们的目标是创建一个使用非视频功能的模型来预测观看次数,健身影响者可以使用它来帮助扩大他们的渠道。
数据
我们找不到合适的数据集,所以我们自己拼凑了一个。我们使用了 YouTube 的 800 万数据集,其中包含 32 GB 的预先标记的数据,这些数据按各种类型分类(如体育、时尚、电影)。我们过滤了所有带有“健身和健身房”相关标签的数据,得到了 15,305 个视频。为了增加数据集的大小,我们收集了之前数据集中每个用户的视频。我们现在有 115,362 个视频要处理。我们为每个视频搜集了以下特征:
- 标题
- 极小的
- 描述
- 喜欢计数
- 不喜欢计数
- 视图计数
- 最喜欢的计数
- 评论计数
- 出版日期
- 频道的订户计数
- 频道发布的视频数量
- 整个频道的观看次数
- 频道发布的上一个视频的评论计数
- 频道发布的上一个视频的观看次数
- 频道发布的上一个视频的标题
- 频道的年龄
特征工程和提取
我们关注视频的标题和缩略图,因为这是用户浏览视频时会看到的主要特征。我们必须从缩略图和标题中提取有意义的特征,以便在我们的模型中考虑它们。
类似于我们在 BuzzFeed 等网站上看到的 clickbait 标题的效果,我们希望在 YouTube 视频上看到 clickbait 标题和缩略图的效果。具体来说,通过观察专注于健身的成功 YouTubers,我们注意到了一些共同的特征:
- 标题用过多的大写字母和感叹号激起了人们的热情
- 标题作出保证和承诺捷径
- 标题包括一个列表
- 该图像包括一个健康的男人或女人
我们尝试在标题和缩略图上训练神经网络(稍后会有更多介绍),但没有得到非常有希望的结果。
我们决定走一条不同的路——特别是使用预先训练好的网络作为特征提取器。我们发现了一个由雅虎开源的 NSFW 计分器和一个 clickbait 计分器。我们对以前的标题、当前的标题和缩略图进行了测试,并提供了代表这些信息的新功能,从而产生了新的可用功能。
数据探索
我们的主要目标是生成一个预测视图数量(或视图差异)的模型。首先,我们剔除一些异常值,即已经“病毒式传播”的视频,我们将其定义为浏览量超过 100 万的视频。
我们可以看到这是严重的倾斜,这是可以理解的——大多数普通的 YouTubers 用户可能不会有那么多的浏览量。此外,来自 YouTube-8M 数据集的视频似乎完全是随机采样的(即不偏向流行视频),因为它的目标是标记给定视频级别信息的类别。
当我们最终得到我们的预测器时,我们想要预测类似高斯曲线的东西。幸运的是,我们可以对 ViewCount 应用一个 log 转换来实现这一点。
我们可以尝试预测的另一个量是视图计数的差异。我们从剔除异常值开始,即观看次数增加或减少超过 5 倍的视频。
请注意,在我们的视频中,视图之间的差异通常在 0 左右波动,但实际上集中在-1 左右。计算方法如下:
因此,百分比差异约为-1 的条目是那些(当前视频的)查看次数约为 0 的条目。这很有意思——我们目前的大部分浏览量都是最近抓取的视频。可以这么说,这可能是因为视频发布的时间还不够长,无法获得“真实”的浏览量。因此,我们可能需要一个特性来表示它被上传和我们抓取之间的时间。
最后,让我们看看从标题和缩略图中提取的特征:
点击诱饵得分
我们使用预先训练好的网络来提取每个标题的点击诱饵分数。clickbait 得分从 0 到 1,得分越高,标题越“clickbait-y”。点击诱饵分数分布如下所示:
我们有兴趣看看 YouTubers 是否在他们的频道上使用了不同程度的“点击诱饵”标题。因此,我们计算了每个 YouTuber 视频的点击诱饵得分的差异,并绘制了分布图:
有趣的是,我们看到 clickbait 得分的差异几乎看起来像一条零均值高斯曲线。这意味着我们不希望 YouTubers 在标题中偏离默认的“点击诱饵”。
最后,我们比较了观看次数最少的 10%和最多的 10%的点击诱饵分数:
事实证明,“clickbait-y”标题并不局限于 YouTubers 上的顶级网站,使用它可能不是一种产生更多视图的简单方法。“点击诱饵性”对浏览量的总体影响还不清楚,但我们认为这一特征在我们的模型中不会提供太多的预测能力。
接下来,我们来看看 clickbait 分数和 ViewCount 之间的实际散点图:
从这个图中,我们注意到在视图计数和 clickbait 得分之间没有太多的相关性,这意味着 clickbait 可能不是病毒式传播的先决条件。
接下来,我们决定看看标题中的实际单词。
常用词和名词短语 为了验证我们对标题中使用的技巧背后的直觉,我们决定找出最常用的词和名词短语。过滤掉一些常用词,如“the”、“to”、“and”等。,一些非常常见的单词和三元组:
NSFW 得分
让我们看看从缩略图中提取的 NSFW 分数的分布:
nsfw 分数严重偏向 0,平均值为 0.107。当我们查看观看率最高的 10%的视频和观看率最低的 10%的视频的平均分数时,这变得很有趣。
前 10%的平均 nsfw 得分为 0.158,后 10%的平均 nsfw 得分为 0.069。这似乎提供了比点击诱饵分数更强的预测能力,并且证实了我们一直以来都知道的——性销售。
预言者
使用 GradientBoostedRegressor,我们绘制了特征重要性:
最终,看起来过去的表现决定了未来的成功。预测你的频道表现如何的最佳指标是你之前视频的浏览量。你的缩略图的暗示性和视频标题的“点击诱惑性”对观看者能获得的观看次数影响不大。最后,我们使用一个 XGBRegressor 来预测 log 转换后的视图计数。我们使用交叉验证来获得:
R = 0.750 0.007
RMSE = 0.970 0.021
从我们的预测到真实值图中,我们可以看到模型似乎很好地拟合了数据。此外,残差图表明误差偏差是由零均值高斯分布引起的。
最后,我们对输出进行指数运算,以获得视图的真实数量:
RMSE = 8727.0 100.9
这实质上意味着,如果 YouTuber 使用我们的预测器,他们可以预期实际结果在模型结果的 8800 个实际视图之内。对于一个拥有大约 1000 个浏览量的业余 YouTube 来说,这有点没用,但对于一个拥有大约 100,000 个浏览量的 YouTube 来说,这开始变得更加有用。然而,最终预测视图的数量本身就很困难,所以这些结果和我们预期的差不多。
可能需要更多调查的模型
最初当我们计划这个项目时,我们试图从标题和缩略图本身来预测视图的数量。不幸的是,我们很快发现,观看次数与频道信息本身有更大的关系——通常是观看次数、订户数等。本节将涵盖我们实验的各种其他模型,以评估标题和缩略图对视图的影响。
由于我们有两个独立的文本序列,我们需要找到一种方法将它们作为网络的输入。我们决定用一个明显的分隔符号将以前的和当前的标题结合起来。如果真的有不同的标题之间的差异,那么网络应该捡起来。
我们使用手套嵌入将每个标题转换成向量序列,然后对每个序列进行零填充,使其长度相同。
首先,我们尝试了一个在 NLP 任务中使用的相当标准的网络:
我们注意到网络训练得很快,但是尽管训练损失在迅速减少,但验证损失实际上开始增加。这是模型可能过度拟合的迹象。牢记这一点,我们建立了第二个网络:
不同的是,在这个新的网络中,我们在每层增加了更多的 LSTM 单元和另一个 LSTM 层。我们对每一个都进行了更多的规范化,以避免过度拟合。我们对此进行了大约 30 个时期的训练,并注意到训练损失会略有下降,但验证损失波动很大。最终,仅仅使用视频的标题,噪音似乎比信号更多。每个纪元都需要很长时间来训练,特别是有这么多 LSTM 单位,所以我们决定不走这条路线。
卷积神经网络:男女 这里的目标是验证缩略图中的人的性别是否与查看次数相关。我们用这个预训练的 CNN 提取了一个二元性别特征。然而,像大多数性别分类 CNN 一样,我们的网络在识别缩略图中的面孔时遇到了困难。我们的网络在没有人的情况下也很难处理缩略图。考虑到这种方法的问题以及从每个缩略图中提取人脸所需的时间,我们决定不使用这种方法作为特征提取器。
结论
我们对这个项目有很多不同的想法,但可能最初对我们的目标来说过于雄心勃勃。我们最初试图预测只有标题和缩略图的浏览数。我们希望神经网络能够在顶级 YouTubers 撰写标题和创建缩略图的方式中学习隐藏的功能,但很快发现这只是一厢情愿的想法。然而,相反,我们能够找到比原始标题和缩略图对预测器更有意义的特征,并最终能够创建一个对中等大小的 YouTube 频道有用的预测器。如果我们有更多的时间,我们可以尝试更多的事情,包括
- 扩展到不同的类型
- 对评论进行情感分析,以创建更强大的“用户简档”,该简档可用作一项功能
- 使用对评论的情感分析来创建一个强大的“接受”特征(类似于喜欢/不喜欢),然后可以预测该特征
- 使用创成式模型创建注释
- 在缩略图上训练 CNN——由于 NSFW 分数似乎比 clickbait 分数提供了更大的预测能力,因此应用于缩略图的 CNN 可能会比在标题上训练的 LSTMs 表现得更好
YROO:人工智能辅助购物的未来
原文:https://towardsdatascience.com/yroo-the-future-of-ai-assisted-shopping-43a90afaae92?source=collection_archive---------7-----------------------
以客户为中心是人工智能的承诺。这似乎是一直躲避商业的圣杯。营销解决方案和系统集成商正试图为下一个最佳行动建立技术框架,将实时消费者环境考虑在内。他们仍然有所欠缺。但是,如果真正了解客户的核心的唯一方法是从不同的角度、不同的数据集积累大量的数据,以便在正确的时间返回直观地符合消费者期望的结果,那会怎么样呢?这正是 YROO 打算做的事情。
我在多伦多市中心的一条安静的街道上见到了 YROO 的首席技术官兼创始人尼克·朱七。他的小办公室和一个 22 人的团队位于多伦多商业区的中心,但仍然被不同种族的餐馆包围着,而且离南边著名的圣劳伦斯市场只有一箭之遥。一个沉着冷静的年轻人向我打招呼。但是当我们开始交谈时,我感觉到在他讲述他的故事时,这种激情的暗流弥漫在我们的讨论中。
它开始的地方……
尼克·朱七是一名有着 17 年专业经验的资深软件工程师。他毕业于上海大学,获得经济学学士学位。他谈到了他的父亲,一位接受传统数学培训的经济学教授,以及他的祖父,一位在他很小的时候就向他介绍无线电元件和电路世界的电气工程师。尼克对计算机很感兴趣,记得在一年级时学过一种叫做 Logo 的语言。虽然尼克的学位是经济学,但他的兴趣来自于消费者行为和数据。
在创办 Yroo.com T4 公司之前,尼克在 dot.com 的繁荣时期培养了自己的编程技能,成为了一名软件工程师。后来,他完成了计算机科学硕士学位,开始作为一名独立的软件顾问工作。后来,他加入 ThoughtWorks,担任加拿大业务的首席顾问。在过去的 10 年里,他的热情和专长集中在分布式计算、语言设计、机器学习和数据挖掘上。
实时语境关联成功……
在 ThoughtWorks,Nick 为一个广告平台开发了广告跟踪软件,用于跟踪在线广告并实时分析来自网络的数十亿个信号。此外,他还为一家呼叫中心软件供应商开发了软件,使他们能够通过聚合社交数据、语音数据和账户信息、分析消费者情绪的语音语调并显示上下文相关性来优化呼叫处理,从而提高呼叫中心的客户参与度。这些项目利用大数据和机器学习(ML)来帮助企业预测客户行为,并优化旅程中的客户转化点。
输入 YROO:解决市场问题……
优化消费者体验很容易转化为在线零售领域正在发生的事情。据尼克所说,
“自电子商务在 90 年代末首次亮相以来,过去 20 年中真正发生了什么变化?选择增加了,物流、交货速度和客户服务都有了显著改善。但从信息的角度来看,消费者收到的东西并没有改变太多。虽然零售和企业巨头已经积累了关于他们的客户、产品和竞争对手的信息,但消费者却没有同样的信息优势。"
信息不平衡,消费者继续做所有的工作。他们也不知道如何做出更好的购买决定。如果一家零售商以六折促销一种产品,这意味着什么?是从建议零售价打折的吗?如果你昨天收到 60%的折扣,但今天是 40%呢?价格比前一天上涨了 20%。在尼克看来,像 MarketWatch 这样的研究公司已经注意到,建议零售价(SRP)过高,因此不可信。那么基线是什么呢?
随着时间的推移,企业零售对数据的访问使他们能够更好地在正确的时间向消费者销售正确的产品。他们的武器库收集了客户的人口统计信息、家庭构成、可支配收入、兴趣和在线搜索等。
一个想法……
通过进一步的探索,尼克和他的团队意识到零售商提供了大量的数据,但没有人系统地试图从中收集见解。许多数据非常混乱,需要多次迭代才能理解它们的价值。例如:在 Shopping.com,一位客户正在寻找一款特定的无线扬声器。这个扬声器也在另外两个网站上销售。不同网站的图片、标题、文字描述可能略有不同,但是通过一些视觉和信息比较,人们可以在几分钟内得出结论,这些产品是相同的。尼克猜测的…
如果一个人可以通过购物比较合理地得出结论,一种产品是相同的,那么这是一个可以应用于机器的“可学习的问题”。在机器学习中,这被定义为实体解析:将实体(对象或事物)链接在一起的能力。”
市场中的实体解析…
YROO 现在正在生产中运行其算法的第 3 版。花了 18 个月才走到这一步。Yroo 在美国上线,聚合了来自 5000 家商家和平台的信息,包括 F100 企业零售商。这个模型很聪明,它可以将产品聚集在一起,因此对于消费者来说,在一个地方实时获得所有信息是很有用的。瞬间,顾客可以决定从哪个零售商那里购买什么产品。
以消费者为中心的搜索引擎:提供客观排名的结果
Yroo 要解决的下一个算法是排名。由于消费者一次只能消化有限的信息,所以提供对消费者有用的信息非常重要。对于第一次消费的消费者,他们通常会首先获得赞助位置,以及可能为零售商提供最佳利润的产品。YROO 开始改变这种情况,目标是直观地返回符合消费者预期的结果。通过访问其他信号,包括畅销产品、各商家的销售排名,以及利用神经网络来提高排名,Yroo 能够优化买家行为。
YROO 确实有一些赞助广告,作为其货币化战略的一部分,但在大多数情况下,返回的结果是有机的。他们的承诺是确保赞助广告不会像亚马逊一样将相关结果推到折叠线以下。
虽然大量数据来自亚马逊,但尼克表示,现在可以广泛访问许多商家有助于消除亚马逊庞大数量中的偏见。最终,该算法将代表大众消费市场,而不是更专业、更小众的市场。
他们过得怎么样?与同一时期的平均移动流量相比,上一次黑色星期五活动在 YROO 上为最大的平台之一带来了两倍的移动转化率。这种认可也转化为 YROO 因其销售线索生成和转化表现而获得的佣金。
支持消费者的智能浏览器扩展现已上线
如果你碰巧在亚马逊上搜索那个特殊的演讲者,如果你的浏览器上弹出一个小通知,显示其他商店以不同的价格销售该产品,会怎么样?所以,不用再在谷歌上搜索或者跳到其他零售商那里比价了。当你寻找某个特定产品的时候,一切都来了。这将消除以前为确保找到最佳价格而花费的时间和精力。这种并排比较减少了消费者的搜索工作,并直接为您带来了强大的正确信息!
“你不必来我们的地盘。你不必改变购物的方式。YROO 会走到你面前,自动向你展示备选方案……我们制造这台机器是为了理解消费者能理解的网页。我们解读网页上的信息,理解它,并浏览整个网页,了解所有的比较特征。然后我们在恰当的时候把相关信息带给消费者。”
关于人工智能和广告的下一步的想法…
反思真正理解消费者的演变,尼克认为广告不会很快消失。通过个性化和大众媒体的品牌认知将会继续。然而,在线广告市场充斥着许多不道德的特征,从欺诈到点击诱饵、机器人和点击农场。它需要改革,否则可能会损失大量广告资金。程序化的兴起是一种众所周知的猎枪方法,进一步降低了行业的声誉。有了人工智能,这些数据将为消费者提供更少干扰、更个性化、更智能和更有价值的信息。
随着人工智能变得更加普遍,我们进一步进入深度神经网络,尼克表示,这将使深入研究可解释的人工智能变得更加困难。
“与随机森林(Random Forest)在其分支上应用逻辑一样,深度神经网络由直觉组成,可以识别作为重要特征的变量。然而,与随机森林不同的是,很难确定一个神经网络做出的特定决定以及它到达最终结果的路径…
人脑是复杂的。有时候,我们认为我们做的和我们说的和我们实际做的是完全不同的三件事。我们大脑的一边给出解释,而另一半实际上做出决定。很多时候,他们可能不会和解。"
人工智能的未来也试图编纂人类知识。正如尼克所指出的,挑战在于试图将“诀窍”编纂成文,即你无法解释但只是“知道如何做”的事情,例如骑自行车或走路。这是一个值得注意的时刻,一个数学方程可以真正地编纂直觉或行动,而不需要真正的逻辑。这是人类大脑与众不同的本质。
在与尼克的会面中,我现在意识到这个以客户为中心的圣杯活得很好。其神话般的假设在伊鲁实现了。尼克试图了解消费者需求和行为的实验给这位企业家带来了难以置信的成功,他对实现这一目标的专注和热情丝毫未减。
这篇文章起源于认知世界。
Zig-Zag //双流递归神经网络,具有交互式代码的双神经网络。[带 TF 的手动后撑]
原文:https://towardsdatascience.com/zig-zag-dual-stream-recurrent-neural-network-twin-neural-network-with-interactive-code-b5c0a58b7f92?source=collection_archive---------9-----------------------
GIF from this website
我从来没有双胞胎兄弟,但如果我有一个,这将是非常酷的。我们会有不同的想法,但彼此非常相似。这让我思考,这个概念是否也可以应用于神经网络?我想弄清楚。和往常一样,下面是我想为这篇文章实现的不同架构的列表。
案例 a:双流递归神经网络
案例 b:双流之字形递归神经网络
案例 c:双流混合递归神经网络
案例 d:非孪生(标准)神经网络
案例 e:孪生神经网络
请注意,这篇帖子只是为了娱乐,也是为了表达我的创意。因此不是面向结果的。
多流递归神经网络
Image from this paper
在写这篇文章时,我找到了几篇关于多流递归神经网络架构的论文。我想总的想法是,我们可以有两个(或三个)网络,而不是一个长短期记忆 (LSTM)或循环神经网络 (RNN)。下面是我在写这篇文章时发现的论文列表。
- 双流 LSTM:人体动作识别的深度融合框架
- 用于多流分类的并行长短期记忆
- 多流长短期记忆神经网络语言模型
现在我想介绍一下我们将在本帖中使用的基础网络架构。
Case a: Dual RNN
红色方块,黑色方块 →流 1 RNN,流 2 RNN
粉色箭头 →隐藏状态,每个时间戳都被保留
绿色、粉色、黑色、蓝色箭头 →输入时间戳 0,1,2,3
蓝色矩形,箭头 →最终串接输出每个 RNN
黑色矩形 →卷积层(基于 所有卷积)
我真的希望三维图形有助于每个人的理解。(挺烂的 lol)。但主要思想是在卷积神经网络之前有某种多流 RNN,基本上就是这样。最后,我想提一下,对于不同的时间戳,我们要么向网络提供原始图像,要么提供增强图像。(我们将使用 CIFAR 10 数据集)
之字形递归神经网络
Case b: Dual Zig Zag RNN
白色、灰色箭头 →改变隐藏状态的方向
现在让我们引入一些不同的东西,就像上面看到的,而不是使用来自同一个流的前一个时间戳的隐藏状态。我们将改变所使用的隐藏状态的方向。(因此得名 zig zag。).与两个独立的 RNN 电视网相比,我希望每个电视网都能学会如何相互合作,以获得更好的性能。
最后,让我们看一下网络结构,其中我们结合了之字形结构以及直线前馈操作。
Case c: Dual Mix RNN
如上所述,这一次我们将结合 zig zag 结构以及原始的递归神经网络结构。(在从 2 时间戳到 3 时间戳的转换期间,我们将让网络使用它们自己的隐藏状态。)
结果:案例 a:双流递归神经网络
左图 →测试集精度/时间成本
右图 →训练集精度/时间成本
马上,我们可以注意到,这种类型的架构不适合图像分类任务。在训练结束时,我们只能达到 71%的训练图像准确率,而 64%的测试图像准确率。
结果:案例 b:双流之字形递归神经网络
左图 →测试集精度/时间成本
右图 →训练集精度/时间成本
我真的不知道对这个网络有什么期望,但它似乎与原来的网络没有明显的区别。以相似的(在测试图像上更差)准确度完成训练。
结果:案例 c:双流混合递归神经网络
左图 →测试集精度/时间成本
右图 →训练集精度/时间成本
最终类型的网络给出了相似的结果。然而,它能够胜过原来的网络以及 zig zag 网络。(按 0.003)。
孪生神经网络
Case d: Non Twin network
黑框 →卷积层
粉色箭头 →前馈运算
黄色框 →全局平均池和 Softmax
在看一下 Twin 网络之前,让我们先看看我们的基本网络。如上所述,我们的基本网络只是从全卷积网络的扩展,在末端增加了一个卷积层。(使总层数为 10。)现在让我们来看看 Twin Network 的架构。
Case e: Twin Network
黑盒 →孪生 1 的卷积层
红盒→ 孪生 2 的卷积层
粉色箭头 →前馈操作
→绿色箭头 →级联和前馈操作
弯曲箭头 →前馈操作
黄色框 →全局平均池和 Softmax
如上所述,与原始网络没有太大区别,但我们可以观察到的主要区别是,现在不是用一个 10 层网络来完成所有工作。我们有两个相互交织的较小的网络。
结果:案例 d:非孪生(标准)神经网络
左图 →测试集精度/时间成本
右图 →训练集精度/时间成本
很明显,网络正遭受过度拟合,我们可以通过测试集精度以及训练集精度来观察这一点。
如上所述,我们能够在测试集图像上实现 82%的准确率,但我们需要考虑到训练图像的准确率已经超过 95%的事实。(96%)
结果:案例 e:双神经网络
左图 →测试集精度/时间成本
右图 →训练集精度/时间成本
与标准的 10 层神经网络相比,这是一个明显的优势。然而,该模型仍然存在过度拟合的问题。有了更好的正则化技术,就有可能克服这个问题。
如上所述,我们能够在测试图像上实现相同的准确性,同时在训练图像上实现 89%的准确性。
互动代码
对于谷歌 Colab,你需要一个谷歌帐户来查看代码,而且你不能在谷歌 Colab 中运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!同样为了透明,我在 github 上上传了所有的训练日志。
要访问案例的代码,请点击此处,要查看日志,请点击此处。
访问案例 b 的代码点击此处,查看日志点击此处。 要访问案例 c 的代码,单击此处,要查看日志,单击此处。
要访问案例 d 的代码,请单击她的 e,要查看日志,请单击此处。
要访问案例 e 的代码,请点击此处,要查看日志,请点击此处。
最后的话
我更喜欢不同网络相互协作的想法。在发这个帖子的时候,我反复地听“ 我的火焰——鲍比·考德威尔 ”。我只是想推荐给大家。
Video from RUMnWINE
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站。
同时,在我的 twitter 上关注我这里,访问我的网站,或者我的 Youtube 频道了解更多内容。我还实现了广残网,请点击这里查看博文 t。
参考
- Matplotlib 样式库。(2018).tonysyu . github . io . 2018 年 6 月 11 日检索,来自https://tonysyu . github . io/raw _ content/matplotlib-style-gallery/gallery . html
- Matplotlib:有格调的美好剧情。(2016).Futurile.net。检索于 2018 年 6 月 11 日,来自http://www . futurile . net/2016/02/27/matplotlib-beautiful-plots-with-style/
- 我的爱人——鲍比·考德威尔。(2018).YouTube。检索于 2018 年 6 月 11 日,来自https://www.youtube.com/watch?v=3hK6IgvZ0CY
- NumPy . dtype—NumPy 1.14 版手册。(2018).Docs.scipy.org。检索于 2018 年 6 月 11 日,来自https://docs . scipy . org/doc/numpy-1 . 14 . 0/reference/generated/numpy . dtype . html
- 为什么 range(开始,e. (2018)。为什么 range(start,end)不包括 end?。堆栈溢出。检索于 2018 年 6 月 11 日,来自https://stack overflow . com/questions/4504662/why-does-rangestart-end-not-include-end
- 数组,I. (2018)。将元素插入 numpy 数组。堆栈溢出。检索于 2018 年 6 月 11 日,来自https://stack overflow . com/questions/21761256/insert-element-into-numpy-array
- NumPy . insert—NumPy 1.14 版手册。(2018).Docs.scipy.org。检索于 2018 年 6 月 11 日,来自https://docs . scipy . org/doc/numpy/reference/generated/numpy . insert . html
- [副本],第(2018)页。阻止 TensorFlow 访问 GPU?。堆栈溢出。检索于 2018 年 6 月 11 日,来自https://stack overflow . com/questions/44552585/prevent-tensor flow-from-access-the-GPU
- Gammulle,h .,Denman,s .,Sridharan,s .,& Fookes,C. (2017 年)。双流 LSTM:人体动作识别的深度融合框架。Arxiv.org。检索于 2018 年 6 月 11 日,来自 https://arxiv.org/abs/1704.01194
- 长短期记忆。(2018).En.wikipedia.org。检索于 2018 年 6 月 11 日,来自 https://en.wikipedia.org/wiki/Long_short-term_memory
- 递归神经网络。(2018).En.wikipedia.org。检索于 2018 年 6 月 11 日,来自https://en.wikipedia.org/wiki/Recurrent_neural_network
- [ ICLR 2015 ]追求简单:具有交互码的全卷积网。(2018).走向数据科学。检索于 2018 年 6 月 11 日,来自https://towardsdatascience . com/iclr-2015-努力简化-所有卷积网-交互式代码-手册-b4976e206760
- (2018).Isca-speech.org。检索于 2018 年 6 月 11 日,来自https://www . isca-speech . org/archive/inter seech _ 2015/papers/i15 _ 1413 . pdf
- m .布阿齐兹、m .莫奇德、r .杜福尔、利纳尔:s,g .,& De Mori,R. (2017 年)。用于多流分类的并行长短期记忆。Arxiv.org。检索于 2018 年 6 月 11 日,来自https://arxiv.org/abs/1702.03402
- CIFAR-10 和 CIFAR-100 数据集。(2018).Cs.toronto.edu。检索于 2018 年 6 月 12 日,来自https://www.cs.toronto.edu/~kriz/cifar.html
- dmlc/xgboost。(2018).GitHub。检索于 2018 年 6 月 12 日,来自https://github.com/dmlc/xgboost
僵尸和模型腐烂(带 ML 引擎+数据存储)
原文:https://towardsdatascience.com/zombies-model-rot-with-ml-engine-datastore-747b299526e9?source=collection_archive---------16-----------------------
Don’t leave your models to rot into obscurity
所以你已经把你的机器学习模型部署到了云端,你的所有应用和服务都能够从中获取预测,太好了!你可以永远不去管那个模型去做它的事情…也许不会。大多数机器学习模型都在建模这个世界的一些东西,而这个世界是不断变化的。要么和它一起改变,要么被甩在后面!
什么是模型腐烂?
模型腐,数据腐,AI 腐,随便你怎么叫,都不好!假设我们已经建立了一个模型来预测僵尸是否友好。我们将它部署到云端,现在世界各地的应用程序都在使用它来帮助公众了解他们可以与哪些僵尸交朋友而不会被咬。令人惊讶的是,人们似乎对你的模型非常满意,但是几个月后,你开始收到人们发来的愤怒的电子邮件,他们说你的模型很糟糕!原来是丧尸种群变异了!现在你的模式是过时了,还是烂了!您需要更新您的模型,更好的是,添加一种方法来跟踪您的模型的腐烂状态,以便这种情况不会再次发生。
This is an example of a very sudden case of model rot!
改变的不仅仅是僵尸
当然,虚构的生物可以改变,但金融市场、居住环境、交通模式、天气模式、人们写微博的方式、猫的样子也可以改变!好吧,也许猫永远看起来像猫(虽然给它几百万年,也许不是)。关键是,取决于你的模型预测的东西会影响它们腐烂的速度。
同样重要的是要注意到,你预测的东西不需要为了你的模型腐烂而改变。也许您用来捕获输入数据的传感器发生了变化。当部署模型时,任何对模型性能产生负面影响的东西都会导致模型腐烂,要么移除导致性能降低的东西,要么更新模型(很可能是后一种选择)。
让我们与模型腐烂作斗争(用 ML 引擎+数据存储)
有一个僵尸爆发,但它并不像电影会让你相信的那样可怕。它们是相当缓慢移动的生物,它们中的许多只是在寻找人类朋友,但有些不是。为了帮助人们正确选择僵尸朋友,我们开发了一个模型,根据几个特征来预测僵尸是否友好:
我们使用 Scikit-Learn 构建了一个决策树分类器模型。查看 笔记本此处 查看做这件事的确切代码。
现在的计划是将我们的模型部署到 ML 引擎,它将在云上为我们托管我们的模型。( 在笔记本 中查看我们如何使用 gcloud 命令做到这一点)
首先,我们将把我们的模型放到云存储中:
gsutil cp model.joblib gs://your-storage-bucket/v1/model.joblib
然后创建一个新的 ML 引擎模型,你可以使用 Google Cloud 控制台 UI 或使用 gcloud 命令( ,你可以在这里看到在笔记本 )来完成:
ML Engine UI
然后,我们将决策树模型部署为版本 1:
Creating a new version of your model using the Cloud Console UI
为了让应用程序更容易从我们的模型中获取预测,我们将使用云函数创建一个公共端点。你可以在我和我的同事 Sara Robinson 写的这篇博客文章中读到更多关于如何做到这一点的内容。
here’s the current architecture of our system
好了,我们的模型已经部署好了,应用程序可以很容易地从中获取预测!现在,使用数据存储监视模型 rot!
数据存储?
想象一下,在云中有一个地方,可以快速存储数百万个 python 字典,然后查询它们(也很快)。那就是数据存储,一个在谷歌云平台上完全托管的 NoSQL 数据库。如果您以前有过使用数据库的经验,那么您可能习惯于仔细计划在表中存储什么样的数据结构,然后体验创建迁移脚本来更新数据库结构的痛苦。对于数据存储来说,不要胡说八道,要存储以下数据:
{
"name": "Alex"
"occupation": "Zombr trainer"
}
然后这样做(使用 python 客户端库):
# create new entity/row
new_person = datastore.Entity(key=client.key('person'))new_person['name'] = 'Alex'
new_person['occupation'] = 'Zombr trainer'# save to datastore
client.put(new_person)
哦,等等,你想开始储存人们的 githubs 和 twitters?去做吧:
# create new entity/row
new_person = datastore.Entity(key=client.key('person'))new_person['name'] = 'Zack'
new_person['occupation'] = 'Zombr CEO'
new_person['github'] = '[https://github.com/zackakil](https://github.com/zackakil)'
new_person['twitter'] = '[@zackakil](https://twitter.com/zackakil)'# save to datastore
client.put(new_person)
数据存储会说“谢谢”:
DataStore’s UI
使用数据存储收集模型反馈
我们将要收集的反馈数据如下所示:
{
"model": "v1",
"prediction input": [2.1, 1.4, 5.3, 8.0],
"prediction output": 1,
"was correct": False,
"time": "23-10-2018,14:45:23"
}
这些数据将告诉我们 ML 引擎上的哪个版本的模型用于生成预测(模型)、预测的输入数据是什么(预测输入)、模型做出的预测是什么(预测输出)、预测是否正确(来自用户的实际反馈)(是正确的),以及反馈提交的时间(时间)。
我们将再次使用云函数来创建另一个 web API 端点,这次是为了接收反馈数据并将其存储在数据存储中:
don’t forget to add “google-cloud-datastore” to the Cloud Function’s requirements.txt
现在,我们的系统架构如下所示:
the new architecture of our system
客户端应用程序只需要以一种直观的方式添加用户提交他们的反馈。在我们的例子中,它可以是一个简单的“拇指向上或拇指向下”的提示,在用户看到一个预测之后:
You may have come across feedback prompts like this before
创造性地收集反馈
很多时候,你可以推断出关于你的模型的反馈,而不是像我在 Zombr 界面中所做的那样,明确地向用户请求反馈。例如,如果我们看到用户在预测后立即停止使用应用程序,我们可以使用该数据来指示错误的预测😬。
回到现实中,狗收养机构可能有一个新主人的推荐系统。模型的成功采用率是它自己的性能反馈。如果代理商突然发现系统成功匹配的次数比平时少了很多,那么他们就可以用这个来表明模型已经损坏,可能需要更新。
反馈收集完毕,现在做什么?
现在我们可以分析反馈数据。对于任何数据分析工作,我默认使用 Jupyter 笔记本。
点击此处查看我如何从数据存储中获取数据并分析反馈的完整记录。
从数据存储中获取数据的要点是,首先安装数据存储 python 客户端库:
pip install google-cloud-datastore
然后,您可以导入它并连接到数据存储:
**from** google.cloud **import** datastore*# connect to DataStore*
**client = datastore.Client('your project id')***# query for all prediction-feedback items*
**query = client.query(kind='prediction-feedback')**
*# order by the time field*
**query.order = ['time']**
*# fetch the items
# (returns an iterator so we will empty it into a list)*
**data = list(query.fetch())**
该库自动将所有数据转换成 python 字典:
print(data[0]['was correct'])
print(data[0]['model'])
print(data[0]['time'])
print(data[0]['input data'])>>> True
>>> v1
>>> 2018-10-22 14:21:02.199917+00:00
>>> [-0.8300105114555543, 0.3990742221560673, 1.9084475908892906, 0.3804372006233603]
由于我们在反馈数据中保存了一个“was correct”布尔值,我们可以通过查看该字段的“true”比率,轻松计算出反馈模型的准确性:
number_of_items = len(data)
number_of_was_correct = len([d **for** d **in** data **if** d['was correct']])print(number_of_was_correct / number_of_items)>>> 0.84
0.84 并不算太糟糕,因为我们第一次训练我们的模型,其得分约为 0.9,但这是使用所有反馈数据一起计算的。如果我们在数据的滑动窗口上进行同样的精度计算并绘制出来会怎么样?(你可以在 分析笔记本 里看到这么做的代码)
对于最近的反馈,这是一个很大的性能下降。
我们应该进一步调查。让我们比较高精度和低精度时的输入数据(即僵尸特征数据)。好在我们在反馈中也收集了这些信息:
blue = correct prediction, red = incorrect prediction
blue = correct prediction, red = incorrect prediction
啊,数据看起来完全不一样。我猜僵尸种群已经变异了!我们需要尽快用新数据重新训练我们的模型。好在我们收集了反馈中的输入数据,我们可以将其用作新的训练数据(使我们不必手动收集新数据)。我们可以使用有关模型所做预测(“预测”字段)和用户反馈(“正确”字段)的信息来推断新训练数据的正确预测标签:
在反馈分析笔记本的底部查看这段代码是如何使用的。
有了这个新的数据集,我们可以训练一个新版本的模型。这是与训练初始模型相同的过程,但是使用不同的数据集(参见笔记本),然后将其作为模型的新版本上传到 ML 引擎。
一旦它在 ML 引擎上,您可以将其设置为僵尸模型的新默认版本,以便您的所有客户端将自动开始将其预测请求发送到新模型,或者您可以指示您的客户端在其预测请求中指定版本名称:
setting v2 as the default model
如果您将默认模型设置为 v2,那么所有对“僵尸”的预测请求都将转到 v2 版本:
PREDICTION REQUEST BODY:
{
"instances":[[2.0, 3.4, 5.1, 1.0]],
"model":"zombies"
}
或者你的客户可以说得更具体一些:
PREDICTION REQUEST BODY:
{
"instances":[[2.0, 3.4, 5.1, 1.0]],
"model":"zombies/versions/v2"
}
完成所有这些后,您可以坐下来,在收集到更多反馈后运行相同的分析:
seems like people find our v2 model helpful
希望这已经给了您一些关于如何监控您部署的模型模型腐烂的想法。使用的所有代码都可以在 github repo 中找到:
[## ZackAkil/腐烂僵尸模型
🧟资源反击腐烂你部署的机器学习模型。预测僵尸!…
github.com](https://github.com/ZackAkil/rotting-zombie-model)
如果您对监控模型腐烂有任何想法或问题,请联系我。