TowardsDataScience 博客中文翻译 2016~2018(一百七十三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

它还活着!构建通用人工智能是未来

原文:https://towardsdatascience.com/its-alive-building-general-ai-is-the-future-ddd8f75d09dc?source=collection_archive---------5-----------------------

我的朋友们一次又一次地听到我这样说。人工智能正在走向超越人类自动化的认知“生活”。计算机(真的是人工智能)将开始采取主动,有目的地行动,而不是成为那个"快速的白痴"我们在过去几十年的计算机架构中已经非常了解这一点。我将在 7 月提交两篇关于这个主题的论文。一个关于无监督学习,另一个关于计算机视觉。两者都是关于人工智能主动远离人类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是一个大的想法:我们可以使用人工智能来为我们思考,就像一个帮助我们的伙伴一样。我们正朝着一个方向前进,在这个方向上,执行任务的认知压力将被人工智能人才的不断上升所抵消。具体来说,我们可以将人工智能作为一种工具来提高我们的生产力,从自动驾驶汽车(强化学习)到寻找屏幕错误信息的解决方案(监督或无监督学习)。

后一个例子是最近这些论文的主题。我和我的合作者开发了一种只使用屏幕图像来观察计算机屏幕的人工智能,并通过观察用户的行为来学习帮助用户。帮助以可点击按钮的形式提供。单击按钮会执行广告的操作。例如,查找与屏幕上的编译器错误信息相关的堆栈交换页面。人工智能将很快从任务自动化(帮助人类)的低级角色中爬出来,直接进入自我指导的活动。乍一看,这似乎是一件坏事,但放大来看,这可能会是一件好事。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

An AI system that offers to help users perform actions with the click of a button.

一个自我激励的人工智能会是什么样子?我们来玩创世纪吧。它需要有一些像眼睛一样的感知能力。那将是一个或多个卷积神经网络(CNN)。它需要一些内部系统来根据过去预测未来。也许这将是一个 LSTM 系统。它将需要某种方法来学习基于经验的规则,比如用策略网络来指导信息系统开发的强化学习。它还可能有一个生成性对抗网络(GaN)来与自己对抗并模拟行动的结果。关系网络(RN)和视觉互动网络(VIN)也可以帮助推理。它将需要效应器和传感器与世界互动,我相信这些将是互联网接入,音频输入/输出,投影仪和/或屏幕。我不认为实际的机器人技术是人工智能的逻辑步骤。为什么要有身体?这只会让出行变得更加缓慢。我们不应该把 AI 拟人化。这是新的东西。

从这里到自我激励的人工智能的路径是模糊的,但不是不可能看到的。我不相信会是一些偶然发现的侥幸给我们带来自我激励的人工智能,就像一个股票市场机器人失控。不,这将是研究人员有意为之。在科学领域,当某件事看似可能时,书呆子们就会去工作。我们快速行动,打破常规,最终展示一个演示。

不过,这是件好事。我不是一个煽动对人工智能恐惧的人。我认为看到人类是否能接受人工智能将是令人兴奋的。到目前为止,我们的社会在接受持续自动化和语音人工智能方面做得非常好。这最后一步——产生有自我意识的生物——可能是我们做过的最伟大的事情。我是作为三个孩子的父亲说这番话的;不是为了夸张。

不是所有的反超级智能,但未来看起来是光明的。是的,我们有道德和社会问题要解决。也许我们需要一个全民基本收入。也许我们需要重新思考资本主义,转向星际迷航式的治理模式。谁知道呢。但至少现在,让我们坐下来欣赏这场表演。我们没有被卡住。进展非常快。

我很期待接下来会发生什么。

编码快乐!

-丹尼尔
丹尼尔@lemay.ai ←打个招呼。
LEMAY . AI
1(855)LEMAY-AI

您可能喜欢的其他文章:

这是魔术:M19 的趋势

原文:https://towardsdatascience.com/its-magic-data-science-lab-project-bbf73f2b6eef?source=collection_archive---------20-----------------------

分析万智牌甲板模式并根据过去的草稿预测起草顺序

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一、背景

该项目由丹尼·沃特洛伊·斯蒂德帕特里克·朱亚伦·李塞缪尔·张打造。我们项目的代码可以在这个 repo 中找到。对于我们的项目,我们选择寻找万智牌(MTG)领域的问题,因为我们的小组拥有一些领域知识,并且有可能将我们的爱好与数据探索问题/优化问题结合起来。

背景:你可以通过这个链接更正式的了解 MTG 的 Booster 草案格式。快速概述,MTG 的助推器包有 15 个独特的卡。在助推器草案期间,每个球员有 3 个助推器包。每个玩家将打开他们的第一个包,并选择一张卡片。然后他们会把剩下的牌传给下一个玩家,再选一张牌。这种情况一直持续到所有的牌都被挑完,剩下的牌包将在用完前一包中原来的 15 张牌后被打开。玩家将以 45 张牌结束选秀,他们将用这些牌组成他们的锦标赛牌组。

此外,一个重要的注意事项是,升压包来自特定的卡组。一些例子集是“终极大师”,“核心集 2019”等。升压包可能包含许多卡片。因此,在一个典型的助推器草案起草阶段,所有三个包将来自同一套。

目标:我们的目标是使用我们的数据,看看我们是否可以训练一个(些)模型来生成甲板原型,并为 MTG 的增强草案格式提出选秀建议。

二。数据

我们的数据集来自一个名为 Top8Draft 的网站,该网站使用机器学习对模拟草稿进行评分。我们联系了网站的所有者,他慷慨地给了我们 280,421 个模拟甲板的数据,用于我们的模型建筑。图 1 显示了一个样本面板(JSON 格式)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1: Each deck from Top8Draft has a set of a card IDs (which refers to a unique card from MTG) along with the frequency of the card in the specific deck.

我们使用一个名为 Scryfall 的公开可用的 MTG 卡片 API 将我们起草的卡片组分成各自的组。对于剩余的建模/数据探索,我们选择使用“核心集 2019”集(通常缩写为 M19)来限制可变性,使我们更容易生成可用的结果。

注意:我们最初试图在所有甲板上运行我们的模型(没有分成组),我们得到的原型(将在后面解释)没有意义,因为甲板原型来自各种组,而不是单个组。

三。排名卡协同

为了探索我们的数据集,我们决定处理数据,尝试排名卡协同作用。利用用户草案是合理选择的假设,我们能够为 M19 集生成顶卡协同效应。我们通过计算一张卡片与其他卡片出现的频率来对卡片进行成对排序,然后通过卡片之间各自的计数来确定它们的排序。我们的发现如图 2 所示。

观察:起初,我们注意到我们的原始协同得分严重偏向普通卡片,因为它们更经常出现在包中。为了解决这个问题,我们通过将分数除以每副牌的数量来“标准化”数据。这可能会使我们的数据偏向更稀有的卡片,但无论如何这是一个更好的解决方案,因为它们固有的卡片价值。理想情况下,如果我们有更多功能的数据,我们可以根据卡片的价值对其进行排序,但考虑到我们的数据限制,这是一个令人满意的解决方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 2: A “heatmap” representation of our synergy scores between cards. As you can probably see, there are blocks of high synergies along the main diagonal. This is expected because cards of the same color, or “card type,” are given IDs in sequential order. (made with Seaborn)

我们还以卡片形式收录了一些表现最佳的协同组合:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 3: This was our highest synergy pair with a Rare card, Sai, and a common card. It’ s interesting to note that both of their abilities result in a 1/1 Thopter artifact creature.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 4: Our next highest ranking pair has a similar construct of a Rare, Goblin Trashmaster, and a common, Goblin Instigator.

四。生成原型

方法论:我们使用了一个潜在的狄利克雷分配(LDA)模型来生成 M19 集合的“原型”。我们希望这将产生符合普通起草策略的特色套牌,并可能揭示一些关于起草的“隐藏”见解。我们这种方法的灵感来自于这款笔记本,它以前是《海岸巫师》的特色。

更多关于 LDA 的正式解释可以通过维基百科TowardsDataScience 找到(其中包括一些例子)。LDA 是自然语言处理中常用的主题建模算法。我们选择了 LDA,因为它似乎是一种有趣的方式,可能产生 MTG 原型,或共同的甲板身份,给定类似于“文件”的甲板结构。

出于我们的目的,我们将卡片视为“文档”,将卡片本身视为“单词”,希望找到我们的“主题”,也就是我们的原型。我们使用 gensim ,一个主题建模库,用于我们的 LDA 模型。

对于狄利克雷参数,我们在*【1.0/原型】原型之前设置我们的 alpha,在*【1.0/原型】* unique_cards* 之前设置我们的 beta。(我们确信我们的每个文档都包含一个原型,这就是为什么 alpha 等于 1。对于我们的测试版,我们希望测试版随着独特卡的数量而扩展)。

对于我们的 M19 草案,我们在我们想要生成的原型数量上做了大量的尝试,发现当我们生成 30 个原型,每个原型有 45 张卡时,我们的结果是最好的。

下面以卡片的形式展示了一些产生的原型。为了可读性,我们只包括了每个原型大约 10 张卡片。原型的完整 PDF 可以在报告中找到,或者通过链接找到。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 5: Archetype #1 is a white/black deck strategy built around the Uncommon card, Regal Bloodlord, which can be used as both white and black.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 6: Archetype #2 is a Artifact Deck with some red/blue cards sprinkled in.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 7: Archetype #4 appears to be a red/green deck which is built around the Legendary, Vaevictic Asmadi, and/or the Uncommon, Draconic Disciple.

注意:PDF 中的卡片是按照它们出现在每个原型中的概率排序的。

首先要注意的是,原型通常不超过两种原色(可能还有第三种或第四种第二色)。万智牌的每种颜色通常都有一些相关的属性。比如,抽牌通常和蓝色联系在一起,法术伤害通常和红色联系在一起。扩展集是为某些颜色设计的,以便与其他颜色很好地协同,因为草稿甲板通常是两种或三种颜色。

这些元素显示在上面的示例 LDA 原型中。即使有两种以上的颜色,像原型#4,第三和第四种颜色表现得很轻。

原型的另一个可能的焦点是卡片类型。如原型#2 所示,这些牌围绕着神器牌类型同生。魔法中的许多神器都是无色的,但即使是这个原型中的有色卡也会奖励玩家使用神器。

动词 (verb 的缩写)建议选秀权

起初,我们希望使用我们的原型结果来建议选秀,但是结果不会非常有用,因为原型没有明确说明卡的协同作用或卡的强度,这可能会迫使算法选择较弱的卡来尝试匹配特定的原型,而不是选择最好的。此外,该算法不需要任何机器学习,这对类本身没有太大帮助。

相反,我们尝试使用 XGBoost 多标签分类器来预测每回合使用哪张牌。我们的功能旨在存储当前棋盘和玩家手牌的“状态”。每一行都有玩家当前手里的牌(二进制—包括或不包括)以及当前牌包中的可用牌。我们基于从顶部 8 草稿刮取的 4000 份草稿日志来训练我们的模型。

注意:起初我们有 25565 个从 Top8Draft 刮来的草图日志,然而因为每个草图包含 45 个“转弯”,我们有超过 110 万个可用的特征行。我们遇到了数据帧的内存限制,因此我们必须限制用于模型训练/测试的日志数量。虽然有 4,000 个草案日志,但我们仍有近 180,000 行数据。

假设:我们假设用户选秀是最佳选择,即使一般的 MTG 球员可能并不总是最佳选择。例如,玩家经常因为个人偏好特定的牌而打草稿,或者新手玩家可能不熟悉牌之间的协同作用。我们希望草稿的数量会减少次优草稿的影响,但是我们关于最优性的假设可能会直接降低我们的准确性。

调优后,我们实现了大约 35,000 行的大约 63%的测试精度。相比之下,简单的猜测会产生大约 22%的正确率,我们的结果有非常显著的 p 值(μ:. 22;σ: .415;n: 35,532 个样本)。

我们的模型无法达到我们希望达到的 80%的正确率,但对于一个玩家来说,每 15 张牌中选择大约 9 张“最优”牌大约是一个普通 MTG 玩家的水平。随着更多的数据和可能更多的关于草稿质量的分析,该模型肯定可以改进以获得更好的准确性。

动词 (verb 的缩写)走向

将来,我们希望重新训练该模型以优化其建议,并探索其他 MTG 集。由于内存限制,我们只使用了 25,565 个草稿日志中的 4,000 个。然而,我们相信随着数据的增多,模型的准确性会显著提高。我们还希望将我们的卡片协同效应和卡片组原型发现与建议模型相结合。另一种选择是尝试神经网络方法,这也可以提高准确性或揭示关于数据集的新见解。虽然有许多路线继续这个项目,MTG 是一个复杂的游戏,我们只探讨了其中一个格式的一套。我们的技术可以重复使用,以探索游戏的其他方面,并可能向社区揭示新的、有见地的信息。

不仅仅是从事机器人工作的工程师

原文:https://towardsdatascience.com/its-not-only-engineers-who-work-in-robotics-8c65259247b5?source=collection_archive---------0-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Occupational Therapist Rosalie Wang investigates how intelligent haptic robotic systems can benefit people recovering from upper limb disability due to stroke. Photo courtesy IATSL (Intelligent Assistive Technology and Systems Lab) at Toronto Rehab, University of Toronto.

机器人技术一直是一个跨学科的领域,它整合了计算机科学、机械、电子、控制和其他工程领域的知识。但是,随着机器人走出工厂和研究实验室,进入我们的家庭和工作场所,另一种机器人专家正在出现——工程或计算机科学学位不一定是他们简历的一部分。

从职业治疗到康复机器人

Rosalie Wang 是智能辅助技术和系统实验室的助理教授,这是一个多学科研究小组,由工程师、计算机科学家、康复和医学研究人员组成,他们利用人工智能和机器人技术开发智能辅助和治疗设备。IATSL 研究涵盖所有领域,包括电动轮椅的避障和导航系统、跌倒检测解决方案、中风康复的智能触觉系统、帮助就地老龄化的个人机器人、痴呆症患者的辅助机器人等等。

但王的职业生涯始于职业治疗师,为长期护理的客户提供支持。她的热情是帮助老年人,在一家养老院工作时,她发现自己在摆弄客户的轮椅。“我会带着满是油脂的指甲回到家,把轮椅拆开又组装起来,以便更好地满足我客户的需求。”一件事接着一件事,很快她发现自己正在攻读电动轮椅防撞技术的博士学位。

将技术转化为实践

寻找“人的问题”的技术解决方案是一种特殊的技能,需要对最终用户及其环境有深刻的了解,并有能力与工程师和计算机科学家密切合作,以了解技术的可能性和局限性。

王说,电动轮椅的一个常见问题是,对于有身体和/或认知障碍的人来说,它们很难控制;因为它们是电动的,它们也可能比手动轮椅更危险,尤其是对那些健康状况已经很脆弱的人来说——这也是一些养老院完全禁止使用电动轮椅的原因之一。此外还有伦理方面的问题:“一旦你给了某人一个电动轮椅,你就很难把它从他那里拿走。我们希望实现移动性,我们希望保护人们的安全,我们希望以尊重客户的方式来做到这一点,”王说。

王还指出,仅仅拥有在特定条件下可以工作的技术并不意味着它会在实践中被采用;技术本身之外的许多环境因素会成为障碍。例如,大多数跌倒检测监控服务倾向于使用基于订阅的商业模式,类似于家庭监控。但王发现,许多客户更喜欢让他们的个人护理监控服务触发对家庭成员的警告呼叫,而不是呼叫中心——即使这种解决方案不太可能被行业合作伙伴采用。“在设计系统时,你必须着眼于全局。客户觉得干扰呼叫中心是一种耻辱。”

将技术开发成可以实际部署到现实世界场景中的系统和产品是一项挑战,了解客户的个人偏好、他们的身体和认知能力以及背景因素(如养老院架构、常规和法规、家庭和护理人员需求、道德等)非常重要。这就是为什么 IATSL 研究的一个关键部分也是为在疗养院和家中应用智能辅助技术开发框架、指南和方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Rosalie Wang speaks about her career path from Occupational Therapist to rehab robotics researcher at the Women in Robotics lecture series, hosted by Get Your Bot On and Women Engineers TO in Toronto, Canada. Photo via Nicole Proulx.

对于王来说,在机器人和人工智能领域担任职业治疗师的好处是双向的:她可以以用户为中心的视角来设计技术,但“机器人和人工智能也可以帮助加强职业治疗师的工作,推动整个领域的发展,”她说。王的研究还包括临床评估上肢中风康复机器人和帮助老年痴呆症患者的辅助机器人。她上个月刚刚发表的最新论文调查了患有阿尔茨海默氏症的老年人和他们的护理人员对使用机器人帮助他们完成家庭任务的感受,这是少数几项对该问题进行深入研究的研究之一。

从职业治疗师的角度来看,使用机器人和人工智能的一个关键好处是,它可以为循证治疗提供数据。“过去,我们只能通过非常粗略的快照来衡量治疗效果……客户要么可以完成一项任务,要么无法完成。这种反馈可能会使客户非常沮丧,并使治疗师更难察觉和记录进展中的微小变化……现在我们可以收集连续的数据,这让我们可以设计更完善的治疗,并让客户对进展有更好的感觉。治疗机器人可以给你连续的临床数据,即使你无法感知。”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当被问及是否想过有一天会从事机器人领域的工作时,王给出了一个响亮的答案:“不会。”她也不愿意将自己描述为机器人专家。尽管如此,鉴于智能辅助技术和系统实验室正在开展的广泛的项目,很明显,需要一个拥有各种专业知识的跨学科团队来将机器人和人工智能转化为实际的医疗保健解决方案。

IATSL 团队成员的背景包括职业治疗、神经科学、工业设计、生物学、临床心理学、实验心理学、康复科学和护理。

数据中的故事:伙计们,表演时间到了!

原文:https://towardsdatascience.com/its-showtime-folks-d9fd274810c8?source=collection_archive---------10-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

想到电影你会想到什么?关于故事情节、人物、对话、美丽的人和激动人心的地点?我也是。但由于沉浸在我碰巧从事的职业中,我也想到了那些不太明显的故事,那些关于电影业务的丰富数据可以揭示的故事,那些与电影院大厅内发生的事情一样引人入胜的故事!

在之前的 帖子 中,我谈到了数据分析本质上是一门艺术(是的,我知道,这也涉及到许多科学和技术),即发现并讲述隐藏在数据中的故事。为了说明我的意思,我想举一个恰当的例子。因为我碰巧是一个狂热的电影爱好者,有什么比电影院更好的地方开始。

序幕

在我开始之前,分享一些关于我所使用的数据和我所采取的广泛方法的初步笔记是很重要的。关于电影有相当数量的可用数据(我这里指的是免费提供的数据),但是其中很多都不是很全面。我挑选了两个数据集,都可以在 StatCrunch(一个现在由 Pearson 拥有的统计分析工具)上找到。

  1. 第一个数据集是从 IMDB 电影数据库创建的。它包括自 1920 年以来制作的大约 58,000 部电影。它有关于电影的基本信息,如名称,发行年份,类型,电影长度等。,以及一些客户评级信息(主要是投票数和平均。评级)。
  2. 第二个数据集包括近几十年来制作的大约 4,500 部电影,其中包含电影何时上映、制作成本以及票房收入等信息。

为了像一个真正的分析项目那样做,我还将列举一些分析的局限性:

  • 如上所述,这些数据集不是完整的,而是样本。因此,它们可能存在一定的采样偏差。
  • 在进行任何分析之前,我所做的数据清理仅限于删除重复记录和缺少关键数据字段的记录。当然,还可以做更多的事情来提高数据完整性,但是对于我的目的来说,这已经足够了。
  • 最后,请记住,本练习的目的是从较高的层面说明数据如何讲述有力的故事。所以,如果你想用这个来计划你的下一部大片,那么你要自担风险!

说完这些,让我们直接进入我们的故事。所以坐好,嚼点爆米花,想象一下…

第 1 章:设定

(i) 电影数量:曾几何时,准确地说是回到 20 世纪 20 年代,制作的电影屈指可数。随着技术的飞跃(如 20 世纪 20 年代中期有声电影的引入)和电影作为一种有吸引力的经济主张的出现,这种情况迅速发生了变化。在过去的 80 年里,每年制作的电影数量几乎增长了 25 到 30 倍。

(二) **类型:**围绕电影的类型或类型也出现了有趣的趋势。例如,在电影制作的最初几十年,几乎没有任何动作电影被制作,而自 20 世纪 70 年代以来,动作电影的数量一直在稳步增长,这是以所有其他类型的电影为代价的。另一个有趣的现象是 20 世纪 30 年代和 40 年代喜剧电影的兴起。这是世界经历最艰难的时期(大萧条,第二次世界大战)。尽管这似乎有悖常理,但它符合一个众所周知的事实,即在大萧条最糟糕的几年里,当失业率达到创纪录高位时,数百万人仍然涌向剧院,可能是为了逃避现实。

(iii) 电影长度:动作片在作为最长的电影类型开始后,已经在 90 分钟的甜蜜点上安顿下来。戏剧和爱情也是如此。一般来说,喜剧通常要短一点。电影的长度随着时间的推移而演变,通常从较短开始,随着时间的推移而增加,最后逐渐减少到今天的长度。

在大约 58,000 部电影中,只有 245 部(即 0.4%)超过了 200 分钟(即 3 小时 20 分钟,换句话说,loooong!).这种长电影的频率一直在稳步下降,其中很多是非英语电影。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image 1: Distribution over time of movie length by genre (# of Minutes)

第二章:给我钱!

就像一个好的故事在搭建好舞台后会变得更有趣一样,我们在这里也会这样做。还有比金钱话题更有趣的,所以让我们直接开始吧。(注意:这种特殊的分析是基于约 4500 部电影的较小样本数据集,其中成本和收入数据是可用的)。

预算:制作一部电影的费用一直在稳步增长。这当然是意料之中的——毕竟,做任何事情所需要的钱都在增加(这叫做通货膨胀,废话!).然而,它仍然是有趣的,因为这种增长已经远远超过了仅仅由通货膨胀所能解释的。其他可能导致这种情况的因素包括更大的技术游戏、名人文化(即大人物的高薪)、从工作室/布景拍摄到现实生活场景的范式转变等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image 2: Scatter chart for movie budgets over time (in USD Millions)

如果你像我一样好奇的话,右上角的那个点就是《阿凡达》(2009 年,预算 4.25 亿美元)。紧随其后的是几部大预算电影,如《星球大战》Ep。VII:《原力觉醒》(2015 年,3.06 亿美元预算)、《加勒比海盗:在世界的尽头》(2007 年,3 亿美元预算)和《幽灵党》(2015 年,3 亿美元预算)。

毫不奇怪,如果我们在预算中应用一个类型过滤器,最惊人的增长是动作和动画电影。

(ii) Returns :先不说成本,现在让我们来谈谈收入。让我写下数据揭示的一些重要信息:

  • 在现有的数据集中,有 281 部电影取得了超正常的回报(即大于 1000%)。其中 242 部(86%)是在不到 2000 万美元的低预算下制作的。唯一一部有如此回报的大预算电影是《泰坦尼克号》(预算:2 亿美元,全球总票房:22 亿美元;1004%的回报)。
  • 另有 384 部电影取得了非常高的收益(在 500%到 1000%之间)。许多大预算电影都落在这个桶里,例如八部哈利波特电影中的七部,阿凡达,侏罗纪公园,复仇者联盟,冰雪奇缘,星球大战 Ep VII,四部饥饿游戏电影中的两部等。
  • 很大一部分人(几乎三分之一)在海外收藏中赚的钱比美国国内收藏多。175 部电影海外票房是国内票房的 10 倍以上。

这里有一个奖励——历史上获得最大回报的电影是 1972 年的《深喉》(惊喜!).制作预算为 25,000 美元,据说其全球收藏约为。4500 万美元(有人估计甚至更多)——这是 179,900%的回报率。这意味着,如果你在这部电影的制作中投资 1000 美元,你会从中赚到 180 万美元——客观地说,这比你在苹果公司刚上市时投资苹果股票的回报要高得多!

关于回报的话题,另一个有趣的观察是关于时机。即使在 5 月和 12 月等几个月,看电影的总支出较高,但 6 月的回报最高,明显高于其他月份。这是因为低预算电影在 6 月上映还是因为它们更成功,这需要进一步的探索,我还没有做过。无论如何,对你来说,最重要的当然是在六月上映你一直想看的电影!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image 3: Average %age Return by Month

(三) 一败涂地:既然我们已经谈论了电影业务的成本和回报,那么我们来仔细看看那些没有真正抓住观众兴趣或金钱的电影怎么样。

  • 破产电影的总损失高达 150 亿美元(仅在我们的小样本数据中)。
  • 榜单中最大的输家是耗资 2.75 亿美元的《独行侠》(2013)。它勉强收回成本。这个故事的寓意——约翰尼·德普不是所有问题的答案(尽管,如果我们完全诚实的话,通常他肯定是!)
  • 1980 年后,赔钱的电影数量显著增加。显然,对此的简单解释是,正在制作的电影总数本身显著增加。
  • 数据显示,随着电影上映日期向月末移动,失败电影的分布要高得多,超过 40%的失败电影在当月 21 日至 31 日之间上映。

第三章:只有文字……

数据分析最有趣的方面之一是对非结构化文本数据的分析。使用各种技术来实现这一点,包括复杂的自然语言处理(NLP)元素。不过,为了我今天故事的目的,我坚持一些相对简单的分析,希望能展示单词调查的力量。

(一) **文本元素:**对电影名字的基本参数的研究揭示了一些好奇的事情。让我们来看看:

  • 电影名字开头最常见的字母是 T 。它远远高于其他字母,这要感谢所有以“the”开头的电影。不过 T 之后最常见的字母依次是SMBA
  • 如果电影名称以 Z 开头,则电影翻牌的概率最高。在我们的数据集中,以字母 Z 开头的电影有 40%失败了,而整个数据集中的失败率为 27%。
  • 另一方面,如果电影名称以 XNQ 或一个数字开头(最后数据支持命理学!).一些例子——大人物拿破仑(2004 年,11,431%的回报率)、诺丁山(1999 年,766%的回报率)、老无所依(2007 年,556%的回报率)、四重奏(2012 年,411%的回报率)、x 战警(2000 年,295%的回报率)、xXx (2002 年,282%的回报率)等。
  • 电影标题的字数和获得高回报的概率之间似乎存在直接的关联。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image 4: %age of movies with greater than 100% return on budget by # of words in movie title

例如,在我们的数据集中,75%的片名为 10 个单词的电影都非常成功。以下是一些名字:

  • 《指环王:王者归来》(1114%)
  • 《指环王:魔戒相交》(714%)
  • 加勒比海盗:黑珍珠号的诅咒(408%)
  • 亚历山大和可怕的,可怕的,不好的,非常糟糕的一天(262%)
  • 忍者神龟 2:软泥的秘密(215%)
  • 纳尼亚传奇:黎明踏浪号的航行(170%)

**(ii)**有一种 NLP 技术叫做 【单词袋】 。不严格地说,单词包模型将对文本字段中不同单词的出现次数进行数字计数,以便从中进行推断。我在我们的数据集上做了一个粗略的版本,就像任何文本分析通常的情况一样,即使是这个简单的探索也揭示了一些有趣的事情。

  • 如果你忽略了一些常用词(如‘The’,‘A’,‘An’,‘In’,‘To’等)。),在电影片名中出现次数最多的词是——lo and look——‘Man’。** 谈生活在男权社会!不仅如此,这也是一个好词,因为几乎 70%的以“男人”为片名的电影都赚了大钱。**
  • 另一方面,很少(很多很多)电影在标题中有 【女人】 这个词。对于阅读这篇文章的女性来说,唯一的安慰是,几乎所有这些都带来了极高的回报。
  • 其他非常常见的词还有 【电影】【爱情】【最后】【天】【死亡】 等等。
  • 标题中的颜色名称做得很好,尤其是*‘黑色’。*****
  • 所有片名中有日名的电影都做得极其好(> 100%回头率),尤其是*‘星期五’。*****

后记:

总之,如果你打算拍一部电影,请记住这些提示,所有这些都深深扎根于实际数据中,因此纯粹从概率上来说,会给你更高的成功机会:

用相对较低的预算制作一部电影(< $20 Million), release it in the first part of June, make sure the movie name starts with an N, X or Q. Put in 10 or more words in the title and include the words MAN, BLACK and FRIDAY for some additional magic. (And then don’t forget to come and tell me how it went — if you are making a hit movie, I’m pretty sure I want to know you!)

End Note:我要重申,对于任何可能已经结束在这里,并可能在这一点上沸腾和愤怒的纯粹主义者,我在这里的意图主要是展示分析的深度和各种各样的见解,当一个人开始涉足数据世界时,这些都是可能的。在这里,我仅仅触及了表面,而且是在有限的数据集上——随着更多的数据、更多的时间和更复杂的科学,更多的事情是可能的。

如果你对电影行业有一些有趣的数据支持的见解,我很想听听你的看法。请在评论中告诉我。

一月版:自动驾驶汽车

原文:https://towardsdatascience.com/january-edition-self-driving-cars-ab4e59fbd7b5?source=collection_archive---------7-----------------------

10 篇必读文章

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

了解 SSD 多盒子——深度学习中的实时对象检测

埃迪·弗森 — 11 分钟阅读。

自从 AlexNet 在 2012 ImageNet 大规模视觉识别挑战赛(ILSVRC)上席卷研究界以来,深度学习已经成为图像识别任务的首选方法,远远超过了文献中使用的更传统的计算机视觉方法。

自动驾驶汽车,自…赛格威以来最受关注的东西?

郭晓非 — 8 分钟读完。

有了这样的头条新闻,很难不为自主和自动驾驶汽车感到兴奋。毕竟,我们看过《少数派报告》、《全面召回》和《iRobot》中的汽车,并对自己说:“我们什么时候才能最终进入那些汽车?”

车辆检测与跟踪

由伊万·卡萨科夫 — 7 分钟读完。

这是 Udacity 的自动驾驶汽车工程师纳米学位项目 第一学期的最终项目。源代码和技术上更详细的文章可以在 GitHub 获得

深度学习的车道检测

迈克尔处女座 9 分钟阅读。

即使在各种各样的条件下,人们也可以相当容易地找到道路上的车道线。除非有雪覆盖地面,降雨量非常大,道路非常脏或年久失修,我们可以告诉我们应该去哪里,假设这些线实际上是有标记的。

为高速公路上的自动驾驶汽车规划路径

Priya Dwivedi — 6 分钟阅读。

路径规划是自动驾驶汽车的大脑。这个模块试图复制我们人类在驾驶时的思维和决策——阅读地图,分析我们的环境(其他车辆和行人),并根据安全、速度和交通规则决定最佳行动。

ConvNets 系列。空间变压器网络

Kirill Danilyuk — 11 分钟读完。

空间转换器是不同模块集合中的另一个乐高积木。它通过应用可学习的仿射变换然后进行插值来消除图像的空间不变性。

车辆检测与跟踪:Udacity 的自动驾驶汽车 Nanodegree

Dhanoop Karunakaran — 10 分钟读取。

在自动驾驶技术中,车辆检测和跟踪对于汽车的安全行驶至关重要。在这个项目中,目标是编写一个软件管道来检测视频中的车辆。

如何训练你的自动驾驶汽车转向

由诺曼迪帕洛 — 5 分钟阅读。

神经网络,特别是深度学习研究,最近在计算机视觉领域和计算机科学的其他重要领域取得了许多突破。

机器人也错了——最坏情况下的混乱映射

克里斯·巴特勒 — 8 分钟读出。

上一次计算器不按你的意愿工作是什么时候?一个人最后一次这样做是什么时候?从确定性的角度来看,像机器学习这样的算法介于这两者之间。

用 Tensorflow 对象检测 API 构建玩具检测器

Priya Dwivedi — 5 分钟阅读。

这个项目是我的热门项目的第二阶段-Google tensor flow 对象检测 API 是实现图像识别最简单的方法吗?在最初的文章中,我使用 Tensorflow 提供的模型来检测 youtube 视频中的常见对象。

我们也感谢最近加入我们的所有伟大的新作家, Chuong DoSavina van der Straten马可·布拉姆贝拉Christopher GillAravind SrinivasanMax LawnboySimeon KostadinovAn LuongEthan ArshtDanny 纳希德·阿拉姆哈默尔·侯赛因铃木健太詹妮弗·马利本·谢弗鲍里斯·斯莫斯埃利斯·布朗萨加尔·豪瓦尔乔希·亚兹曼因德拉·登·巴克等等。 我们邀请你看看他们的简介,看看他们的工作。

Javascript- Currying VS 部分应用程序

原文:https://towardsdatascience.com/javascript-currying-vs-partial-application-4db5b2442be8?source=collection_archive---------0-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

许多人在涂抹和部分涂抹之间感到困惑,我们中的许多人不知道应该在何时何地使用它们。所以这篇文章将涵盖它们的实际用法和区别。

所以让我们从定义开始。

Currying

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Caroline Attwood on Unsplash

是一种将带有 N 个参数的函数调用转换成 N 个函数调用链的技术,每个函数调用只有一个参数?

Currying 总是返回另一个只有一个参数的函数,直到所有的参数都被应用。所以,我们一直调用返回的函数,直到我们用尽了所有的参数,最终的值被返回。

// Normal function
function addition(x, y) {
   return x + y;
}// Curried function
function addition(x) {
   return function(y) {
     return x + y;
   }
}

注意:Curry 取二元函数,返回一元函数,返回一元函数。它的 JavaScript 代码是

function curry(f) {
  return function(x) {
    return function(y) {
       return f(x, y);
    }
  }
}

注意:一个 curried 函数有一个内置的迭代器行为。一次应用一个参数,然后返回给调用函数,用于下一步。在这里阅读关于迭代器的

习惯

  1. 定制函数的常见用例是函数组合,例如p(x) = q(r(x))。即通过传递参数从旧函数构建新函数。函数q将返回值作为函数r的参数。因为函数只能返回一个值,所以应用于返回值的函数必须是一元的。
  2. Curried function 也可以在项目的基础设施设置时使用,在该项目中,有许多可能性来创建通用函数,从而可以轻松地配置和重用小部分,而不会出现混乱。
  3. Ramda.js lib。函数是自动执行的,lodash 有一个名为 curry 的函数,可用于形成 curry 函数。
  4. 记忆化 是 curry 函数的另一个好用例。
  5. 处理错误出错后立即抛出函数并退出。
  6. 捕捉多个错误,并将其用作 API 和客户端代码的验证器
  7. 可以创建第一类函数,这意味着我们可以使用函数作为参数和返回值。例如:
const func1 = () => console.log ('Hey Medium.');
const firstClassfunc1 = argsFunc => argsFunc();
const firstClassfunc2 = () => func1;
firstClassfunc1 (firstClassfunc2()); // Hey Medium.

注意:一定要看完这个视频,你会知道更多关于为什么,什么时候和用法。

咖喱工厂法(ES6)

const **compose** = (...**fns**) =>
  **fns.reduce**((**f**, **g**) => (...**args**) => **f**(**g**(...**args**)));

这里的是一篇关于如何使用 ES5 创建我们自己的 curry 函数工厂方法的好文章。

注意:如果处理不当,Javascript 中的 Currying 会导致更复杂的堆栈跟踪,这对调试是不利的。

局部应用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

是一种将多个参数固定到一个函数上,产生另一个更小参数的函数的技术,即随着函数链的发展,将值绑定到一个或多个参数上。

function add1(x) {
  return 1 + x;
}

JavaScript 有内置的方法.bind,它可以处理任意数量的参数,并且可以绑定任意数量的参数。它的调用具有以下语法。

*function*.bind(*thisValue*, [*arg1*], [*arg2*], ...)

它将函数变成一个新函数,它的隐式参数是这个值,并且它的初始参数总是给定的。

function addition(x, y) {
   return x + y;
}const plus5 = addition.bind(null, 5)
plus5(10) // output -> 15

注意:this值对于(非方法)函数加法无关紧要,这就是为什么它在上面是 null 的原因。

当使用下划线或 lodash 时,你可以使用部分函数,它比原始的绑定方法好得多。

这里是关于局部应用和左、右局部应用功能实现的详细帖子。

差异

  • Currying always 产生嵌套的一元(1 元)函数。转换后的函数在很大程度上仍与原始函数相同。
  • 部分应用产生任意数量参数的函数。转换后的函数不同于原始函数,它需要的参数更少。
  • Currying 不是局部应用。它可以使用部分应用程序来实现。你不能创建一个接受任意数量参数的函数,(除非你固定参数的数量)。

优势

更容易重用更抽象的函数,从而产生干净的代码,降低复杂性,提高代码的表达能力和可维护性。

这篇文章的一些资源

[## 库里还是局部申请?

部分应用和咖喱的区别

medium.com](https://medium.com/javascript-scene/curry-or-partial-application-8150044c78b8) [## Currying 与部分应用程序(使用 JavaScript 代码)

Currying 和局部应用是将一个功能转换为另一个功能的两种方式,通常具有更小的…

2ality.com](https://2ality.com/2011/09/currying-vs-part-eval.html) [## 咖喱与功能组合

注意:这是学习函数式编程和组合软件的“组合软件”系列的一部分…

medium.com](https://medium.com/javascript-scene/curry-and-function-composition-2c208d774983)

如果您想被添加到我的电子邮件列表中,请考虑在这里输入您的电子邮件地址 和关注我的 medium 阅读更多关于 javascript 的文章,并关注github查看我的疯狂代码。如果有什么不清楚或者你想指出什么,请在下面评论。

你可能也会喜欢我的其他文章

  1. Javascript 执行上下文和提升
  2. Javascript —生成器-产出/下一个&异步-等待🤔
  3. 理解 Javascript‘this’关键字(上下文)
  4. Javascript 数据结构与映射、归约、过滤
  5. Javascript- Currying VS 部分应用
  6. Javascript ES6 —可迭代程序和迭代器
  7. Javascript —代理
  8. Javascript —作用域

如果你喜欢这篇文章,请随意分享,以帮助他人找到它!

谢谢!

Javascript ES6 —可迭代程序和迭代器

原文:https://towardsdatascience.com/javascript-es6-iterables-and-iterators-de18b54f4d4?source=collection_archive---------5-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Samuel Zeller on Unsplash

可重复的

iterable 是一个接口,它指定如果一个对象实现了一个关键的方法,那么这个对象就是可访问的。

使用 iterable 的一些内置数据结构有:

  • 数组
  • 用线串
  • 地图
  • 集合等。

为什么在 ES6 中增加了 iterable?

如果没有 iterable,就很难管理各种类型数据结构的数据迭代,即数组迭代不同于对象迭代。

此外,ES6 引入了新的数据结构,如集合和映射,因此按照迭代的数据结构编写逻辑将变得更加复杂。

这就是 iterable 接口诞生的地方。

这里有两件事需要注意

  1. 数据消费者— 迭代如何发生,如使用循环、扩展操作符、array.from 方法、通过数组模式进行析构等
  2. 数据源 —我们选择什么样的数据结构,比如数组、映射、字符串等等来迭代。

迭代器

对象,该对象知道如何一次访问集合中的一个项,同时跟踪它在该序列中的当前位置。

iterable 接口返回的对象也是迭代器对象。

迭代器对象有一个返回序列中下一个项目的next()方法。该方法返回一个具有两个属性的对象:donevalue,当next()调用到达序列末尾时,将done属性设置为true,否则保持false

所以迭代器的下一个返回:

{value:‘迭代的当前值’,done:‘真/假’ }

现在,既然我们清楚了这个理论,让我们来看一些例子

简单数组示例

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Array iterator

这里,我们有一个带有一些值的数组arr,然后我们创建了一个迭代器对象,我们可以在上面调用next(),直到我们调用了true

注意:数组中已经有符号.迭代器键作为函数,在上面的例子中,符号.迭代器代表*iter*对象的属性,当我们调用它时,构造一个迭代器实例,通过 next 使用该对象的值。

我们可以创建自己的 iterable 和 iterator 对象,让我们看一个例子。

自定义迭代器对象示例

注意:要在上面运行,我们将使用 for…的循环,你可以阅读这里了解更多细节。

这就是我们如何迭代我们的 customIterable 对象。

for (const x of customIterable) {
    console.log(x);
}
// output 1,2,3,4,5,undefined

代码执行五个步骤,每次运行时counter递增。首先,我们返回值1,然后是值2等等,直到5,然后我们指示已经到达迭代的末尾,并且返回值undefined。每个项目都包装在一个具有以下属性的对象中:

  • value保存实际项目和
  • done这是一个布尔标志,指示是否已经到达终点。

注意:如果需要,最后一步可以返回值,我们也可以手动中断…如果需要,使用 break 关键字。break 关键字将向迭代器发送一个信号,表明消费代码已完成,不会再从中提取任何值,因此无论如何都会调用它。一旦我们完成迭代,它将返回{done:true},但我们也可以手动调用它。

带生成器的迭代器功能强大,可能会改变我们编写代码的方式。

如果您想加入我的电子邮件列表,请考虑在这里输入您的电子邮件地址 和关注我在medium阅读更多关于 javascript 的文章,并在github上查看我的疯狂代码。如果有什么不清楚或者你想指出什么,请在下面评论。

你可能也会喜欢我的其他文章

  1. Javascript 执行上下文和提升
  2. Javascript —生成器-产出/下一个&异步-等待🤔
  3. 理解 Javascript‘this’关键字(上下文)
  4. Javascript 数据结构与映射、归约、过滤
  5. Javascript- Currying VS 部分应用
  6. Javascript —代理Javascript —作用域

如果这篇文章有帮助,请随意分享并帮助他人找到它!

谢谢你!

Javascript 性能测试——针对每个 vs 的 vs(映射、归约、过滤、查找)。

原文:https://towardsdatascience.com/javascript-performance-test-for-vs-for-each-vs-map-reduce-filter-find-32c1113f19d7?source=collection_archive---------1-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Alex Holyoake on Unsplash

我们都知道 for 循环比 each 或 javascript 函数要快,因为在 javascript 函数的掩护下,可能会使用 for 循环或其他我不确定的东西。我用一组对象做了一个简单的测试,通过 for 循环 / for each / javascript 函数做了一些操作,并观察了执行所花费的时间。

这些结果来自小的例子,并且可能根据所执行的操作、执行环境的选择而变化。和虚拟机的选择。

1.减少 for 循环 vs foreach 的 vs

// calculated the sum of upVotes
const posts = [ 
  {id: 1, upVotes: 2},
  {id: 2, upVotes: 18}, 
  {id: 3, upVotes: 1}, 
  {id: 4, upVotes: 30}, 
  {id: 5, upVotes: 50} 
];let sum = 0;
console.time('reduce');
sum = posts.reduce((s, p)=> s+=p.upVotes,0);
console.timeEnd('reduce')sum = 0;
console.time('for loop');
for(let i=0; i<posts.length; i++) {
    sum += posts[i].upVotes;
}
console.timeEnd('for loop');sum = 0;
console.time('for each');
posts.forEach(element => {
    sum += element.upVotes;
});console.timeEnd('for each');

注:下面是结果列表,代码可以在 这里找到

所有的结果都清楚地表明 对于循环比对于每一个都更精通于映射/归约/过滤/查找。

映射/减少/过滤/查找速度慢有很多原因,其中一些原因是

  1. 他们有一个回调来执行,所以这是一个开销。
  2. javascript 函数会考虑很多极端情况,比如 getters、稀疏数组以及检查传递的参数是否是数组,这些都会增加开销。

我找到了一个lib。它重新实现了几个常见的内置原生 JavaScript 函数。

但是使用方式的选择不仅仅取决于性能,还需要考虑更多因素,其中包括:

  1. 代码可读性和可维护性
  2. 轻松代码
  3. 快速编码
  4. 实施与优化
  5. 个人选择

就我个人而言,我喜欢地图,减少,过滤,查找,并且我已经用了很长时间了。他们帮助我写出干净、精确、快速且切中要点的代码,这些代码符合我的思维过程。当我别无选择时,我使用 for 循环。

就优化而言,映射/减少/过滤/查找替换应该是最后一个选项,或者不是一个选项,这取决于所需的优化级别。

注意:如果你正在使用循环,总是习惯性地使用它们,因为编译器现在足够聪明来正确地优化习惯性循环

更新:在这里你可以找到大数据集和繁重计算的结果。

我写了一些关于overflowjs.com的文章,这篇文章的第 2 部分比较了 ramada 内联缓存热缓存和一些 GC 的东西。所以,别忘了继续关注 overflowjs.com 的

如果您想加入我的电子邮件列表,请考虑在此输入您的电子邮件地址关注我在medium上阅读更多关于 javascript 的文章,并在github上查看我的疯狂代码。如果有什么不清楚或者你想指出什么,请在下面评论。

  1. Javascript 执行上下文和提升
  2. Javascript-生成器-产出/下一个&异步-等待🤔
  3. 理解 Javascript 'this '关键字(上下文)
  4. Javascript 数据结构与映射、归约、过滤
  5. Javascript- Currying VS 部分应用
  6. Javascript ES6 —可迭代程序和迭代器
  7. Javascript 性能测试—针对 vs 针对每个 vs (map,reduce,filter,find)。
  8. Javascript —代理
  9. Javascript —作用域
  10. 用 Tensorflow-js 进行图像目标检测🤔
  11. Nodejs 应用程序结构——构建高度可扩展的架构。
  12. Node.js 10.0.0,作为后端开发人员/安全爱好者有什么期待?
  13. 图像处理——在 React.js 中制作自定义图像滤镜
  14. 谷歌印度面试问题

谢谢!

招聘启事——一个谜…

原文:https://towardsdatascience.com/job-postings-a-riddle-86f77ac610d5?source=collection_archive---------8-----------------------

上周,我深入探讨了为什么你应该广撒网来获得你的第一份数据科学工作。职称可能会非常误导人,数据科学不仅对不同的组织意味着不同的东西,甚至在同一组织内也是如此!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

It’s easy to get lost in a sea of applications…

让我用来自同一家 公司的三个不同头衔的神秘职位的要求来说明。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有这些位置看起来都很相似,是吗?

他们是,在需求和责任上有非常细微的差别。

两个 我这里要提的主要观点:

  1. 即使在同一个组织中,不同头衔的职位所服务的功能也非常相似。这类似于一家公司的地质学家或地球物理学家是另一家公司的地球科学家。
  2. 作为地球科学家,我们根据以往在石油和天然气行业的经验来满足大部分要求。请注意,我在每个工作描述中都增加了重点。这就是我认为,作为地球科学家,我们可以利用我们的经验,以独特的方式满足这些要求。

在这些要求中,几乎所有处于职业生涯中期的地球科学家都符合其中的大部分要求。主要的例外是必须增强编码技能(见第 2 集我是如何做到这一点的)。

首选需求是大多数企业称为“最好拥有”的需求的大杂烩。然而,我们仍然满足了这些要求中的许多,如果不是大部分的话。

我不会详细讨论如何解决每个问题。不过,我还是从自己的经历来举个例子。

将这一要求放在第一个位置:

体验 数据可视化和呈现,将复杂的分析转变为洞察力

对我来说,解释价值的创造性方法是:

“成功地与使用数据可视化的工程师合作,并整合了各种学科的见解,以优化井眼轨迹目标。”

这只是许多例子中的一个,但是让你感受一下地球科学家如何满足这些要求。

求职者的一个常见错误是认为他们必须“检查”所有的要求。许多雇主复制/粘贴招聘信息的要求,而招聘信息似乎要求所有的东西和厨房水槽。

不要陷入只申请那些你能满足 90-100%要求的工作的陷阱。申请任何听起来有趣的职位,你会很适合。如何确定呢?这是一个滑动比例。我申请的工作中,我巧妙地满足了 50%的要求,这让我觉得很有趣。有时它会导致自动拒绝,但正如韦恩·格雷兹基的名言,“你错过了 100%你不拍的镜头。”

今天有了复杂的算法(耶,数据科学),我们的简历经常会因为我们“非传统”的背景而被过滤掉。

随着创造性地改写简历,以登陆石油和天然气之外的世界,希望它会给一个开明的招聘人员足够的时间停下来给你打电话。

不过,冷冰冰地发送简历总是存在风险。有推荐人的人比没有推荐人的人更有可能接到招聘人员的筛选电话。虽然冷启动时有人跟注并非不可能,但你正在打一场硬仗。

这是我再次敦促的地方,网络!许多公司提供推荐项目(亚马逊、脸书、谷歌等)。结识他人,重新联系高中、大学等学校的朋友。让你的名字在那里!

那些没有很好的 Meetup 场景或者已经建立的联系较少的人呢?

LinkedIn 是一个很好的来源。与和你有相似目标或相似职位的人交往。给他们发一封电子邮件(是的,你需要保险费,但我发现它真的很有用,很值得)。邀请他们喝杯咖啡,聊聊职业生涯。我在 LinkedIn 上遇到了一些非常可爱的人,无论是在求职方面还是在顾问方面。

这一系列的下一步将是关于面试过程。我们中的许多人在同一个行业工作多年,对面试技巧生疏了。我将介绍数据科学中的典型流程,以及如何为预期做好充分准备。这是一个与石油和天然气行业不同的行业,知道会发生什么是成功的一半!

对于那些走到这一步的人…

今天谜题的答案是:

职位#1 — 数据科学家

职位#2 — 业务数据分析师

职位#3 — 商业智能工程师

公司——每个人都知道并喜爱的大公司…

这是记录和分享我从地球科学职业转向数据科学的故事系列的第 4 集。如果你是新人,可以在这里补上:为什么地球科学家造就伟大的数据科学家强化技能取景狩猎

继续前进到面试流程我为什么选择咨询我的第一个咨询项目行动号召

python 和 NLTK 中的职称分析

原文:https://towardsdatascience.com/job-title-analysis-in-python-and-nltk-8c7ba4fe4ec6?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Scott Graham on Unsplash

职称表明了一个人的角色和职责。它说如果他们管理一个团队,如果他们控制预算,和他们的专业化水平。

了解这一点在自动化业务开发或客户拓展时非常有用。例如,一家销售语音识别软件的公司可能希望将消息发送给:

  • CTO 和技术主管告知他们使用语音识别软件的价格和好处。
  • 潜在投资者或顾问邀请他们了解公司潜在市场规模的信息。
  • 创始人和工程师指导他们如何使用软件。

训练一个软件对职称进行分类是一个多文本的文本分类问题。对于这个任务,我们可以使用 Python 自然语言工具包(NLTK)和贝叶斯分类。

概念化

首先,让我们概念化一下职称代表什么。对于某个部门,每项工作都有一级职责

职责包括清洁地板等维护任务,团队领导等管理任务,或决定预算等战略任务。

部门包括基于增长的部门,如业务开发和营销部门,基于合规的部门,如财务和法律部门,或基于执行的部门,如产品开发和运营部门。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

职责和部门被编码成许多职称,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们希望将每个工作描述归入这些职责和部门中的一个。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

执行

数据采集

第一步是得到一份职位列表。在 CareerBuilder 上有一个大约 800 个职位的列表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

职位名称是有页码的,所以唯一的方法就是点击每一页。

培训数据创建

导入职位名称后,我们可以描述这些职位的职责和部门。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据格式编排

对于这个项目,我们需要自然语言工具包 (NLTK)。它包含文本处理资源、机器学习工具等等。

我们将使用贝叶斯多类分类器和自然语言工具包对这些职位进行分类。

像这样导入 NLTK:

import re
import nltk
from nltk.corpus import stopwords
import pandas as pd
stop_words = set(stopwords.words('english'))

停用词是常见的词,如 athe ,这些词对我们的职称没有什么意义。NLTK 提供了一个英语停用词列表,我们将从每个职位中过滤掉。

当我们在网上获取职位头衔时,例如从 LinkedIn 或会议上,他们有时会包含多个职位头衔,用逗号、破折号、冒号或其他字符分隔。为简单起见,我将展示如何提取第一个职位:

def get_first_title(title):
    # keep "co-founder, co-ceo, etc"
    title = re.sub(r"[Cc]o[\-\ ]","", title)
    split_titles = re.split(r"\,|\-|\||\&|\:|\/|and", title)
    return split_titles[0].strip()

贝叶斯分类器将需要一个特征列表——在这种情况下,哪个单词出现在哪个职位描述中。我还把第一个词和最后一个词加到了特写中,因为有时候第一个词或最后一个词对职位有重要意义。例如,营销总监营销总监是不同的角色。

def get_title_features(title):
    features = {}
    word_tokens = nltk.word_tokenize(title)
    filtered_words = [w for w in word_tokens if not w in stop_words] 
    for word in filtered_words:
        features['contains({})'.format(word.lower())] = True
    if len(filtered_words) > 0:
        first_key = 'first({})'.format(filtered_words[0].lower())
        last_key = 'last({})'.format(filtered_words[-1].lower())
        features[first_key] = True
        features[last_key] = True
    return features

这将产生一个职位名称的单词列表,包括第一个和最后一个单词,例如职位名称,全球运营总监:

{
    "contains(director)": True,
    "contains(global)": True,
    "contains(operations)": True,
    "first(director)": True,
    "last(operations)": True
}

现在我们需要为分类器清理和准备职位、职责和部门的列表。

假设我们的原始职位数据格式如下:

raw_job_titles = [
    {
        "title": "Business Development",
        "responsibility": "Strategy",
        "department": "Business Development"
    },
    {
        "title": "Inside Sales Consultant",
        "responsibility": "Execution",
        "department": "Sales"
    },
    ...
]

分类器训练

接下来,我们可以在这些数据集上训练贝叶斯分类器。我们通过对每个职位的特征进行分类来做到这一点。

# Responsibilities
responsibilities_features = [
    (
         get_title_features(job_title["title"]),
         job_title["responsibility"]
    )
    for job_title in raw_job_titles
    if job_title["responsibility"] is not None
]# Departments
departments_features = [
    (
         get_title_features(job_title["title"]),
         job_title["department"]
    )
    for job_title in raw_job_titles
    if job_title["department"] is not None
]

我们可以分割特征,以便我们可以使用一些特征来训练分类器,并使用其余的特征来测试分类器。

# Responsibilities
r_size = int(len(responsibilities_features) * 0.5)
r_train_set = responsibilities_features[r_size:]
r_test_set = responsibilities_features[:r_size]
responsibilities_classifier = nltk.NaiveBayesClassifier.train(
    r_train_set
)
print("Responsibility classification accuracy: {}".format(
    nltk.classify.accuracy(
        responsibilities_classifier,
        r_test_set
    )
))# Departments
d_size = int(len(departments_features) * 0.5)
d_train_set = departments_features[d_size:]
d_test_set = departments_features[:d_size]
departments_classifier = nltk.NaiveBayesClassifier.train(
    d_train_set
)
print("Department classification accuracy: {}".format(
    nltk.classify.accuracy(
        departments_classifier,
        d_test_set
    )
))

输出应该如下所示:

Responsibility classification accuracy: 0.80588235294117646
Department classification accuracy: 0.80526315789473684

数据分类

如果你对结果满意,你可以给新的职位分类。

title = "Director of Communications"
responsibility = responsibilities_classifier.classify(
    get_title_features(title)
)
department = departments_classifier.classify(
    get_title_features(title)
)
print("Job title: '{}'".format(title))
print("Responsibility: '{}'".format(responsibility))
print("Department: '{}'".format(department))

这将产生以下输出:

Job title: 'Director of Communications'
Responsibility: 'Strategist'
Department: 'Marketing'

一个限制是分类器将为每个职位分配一个部门和责任,不管职位有多模糊。这导致了应该保持不分类或由人审查的职称的分类。

为了克服这一点,我们可以揭示分类器对其解释的信心,以便我们可以选择是否接受它。

# Responsibility
responsibility_probability = \
    responsibilities_classifier.prob_classify(
        get_title_features(title)
    )
responsibility_probability = 100 * responsibility_probability.prob(
    responsibility_probability.max()
)
print("Responsibility confidence: {}%".format(
    round(responsibility_probability)
))# Department
department_probability = \
    departments_classifier.prob_classify(
        get_title_features(title)
    )
department_probability = 100 * department_probability.prob(
    department_probability.max()
)
print("Department confidence: {}%".format(
    round(department_probability)
))

结果是这样的:

Responsibility confidence: 86%
Department confidence: 79%

源代码可以在 Github 上找到。我期待听到任何反馈或问题。

男孩(和女孩)的工作

原文:https://towardsdatascience.com/jobs-for-the-boys-and-girls-d69345ed22b8?source=collection_archive---------3-----------------------

在 200 多家 ASX 上市公司中,女性和男性的比例分别为 45%和 55%。有趣的是,这种情况似乎合乎逻辑。我们很多人都认识一些女性,她们会停止工作一段时间来照看孩子或照顾家人。45%的员工由女性组成,这可能看起来合理、公平,甚至很高。我的意思是,这是非常接近一半,对不对?

然而,如果我们进一步挖掘数据,就会发现性别不平等仍然是大多数组织的组成部分。无论是工作的行业类型、人们所担任的角色,还是他们的就业状况,有时性别不平衡远远超过这一接近甚至 45%对 55%的比例。

这可能是一个很好的观点,说明性别平等不仅仅是让更多的妇女工作,或者让更多的妇女留在劳动力队伍中。这是关于解决一种性别占主导地位的就业领域的性别失衡问题。这是关于认识到男性和女性的经验对所有行业都很重要。重要的是,人们有选择满意职业的自由,这种职业不依赖于被认为是“性别合适”的角色。这意味着让更多的男性进入卫生或教育领域,就像让更多的女性进入科学或 it 领域一样重要。

工业

当将结果汇总到一个行业级别时,大多数结果显示性别不平衡。只有三个行业显示男女分布平等。其余的男女比例不平衡,大多数人倾向于男性就业。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Gender Split Distributions for Industries

考察绝对比率,结果更加明显。90%以上从事卫生和社会援助工作的人是妇女。相反,80%以上受雇于建筑业和采矿业的人是男性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Gender ratios across industry classification.

虽然男性和女性在劳动力中的广泛分布接近相等,但行业分类之间存在很大差异。这可能会对长期职业参与产生负面影响;女性和男性可能会感到“被定型”,更有可能追求似乎更符合他们性别的职业,而不是他们的兴趣或优势。这可能会导致生产率下降。

数据源和详细信息

本帖探究 2014/15 年度调查结果。他们调查了 213 个组织的性别平等状况。这 213 家组织只是 2014/15 年向 WGEA 报告的 4670 家公司中的一小部分,但这 213 家组织都在 ASX 上市,因此有可能探索性别平等和 ASX 绩效之间是否存在任何联系。这篇文章探讨了不同行业分类的性别平等调查结果。我开展的其他工作侧重于男性和女性的职位和工作状况,以及股东总回报(TSR)和性别平等之间的关系。

WGEA 每年收集数据,他们是数据的来源和所有者。我从他们的主要数据集中提取了 213 家 ASX 上市公司的一个较小的集合,上面所有的结果都反映了这个较小的数据集合。

加入#人人爱行动

原文:https://towardsdatascience.com/join-the-aiforeveryone-initiative-86bae2dfc13a?source=collection_archive---------9-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

My first time presenting “A Gentle Introduction to Machine Learning” at UC Irvine.

更新: 你也可以在 西班牙语 中阅读这篇文章

人工智能(AI)领域的领军人物之一吴恩达最近将人工智能称为“新电力”。这当然是一个大胆的声明,坦率地说,我完全同意他的观点!

就像 100 年前的电力一样,人工智能正在改变我们世界的几乎每个方面;从我们检索信息和浏览世界的方式到医生用来检测和治疗疾病的技术。

许多研究人员已经转向人工智能来寻找许多全球性问题的解决方案,例如解决水危机和战胜饥饿。毫无疑问,人工智能具有巨大的潜力,这就是为什么研究人员不应该是唯一有机会获得这些知识/技术的人。像微软谷歌这样的公司都有这种信念,这也反映在他们为人工智能民主化所做的巨大努力中。毫不奇怪,他们的计划已经在推动创新。我最喜欢的一个故事是来自芝加哥的一个名叫阿布的高中生,他使用谷歌的开源机器学习库——tensor flow,建立了一个早期检测乳腺癌肿瘤的系统。

Abu’s Story

但重要的是要认识到,这不仅仅是让机器学习工具可供他人使用,有时我们需要的是一位导师,这可以是一位朋友,一位老师,甚至是一位陌生人,他们分享他们的知识,并帮助我们认识到人工智能如何被用来解决实际问题。

出于这个原因,我想鼓励你们每个人都参与到“人人爱你”的行动中来。

大约两个月前,我决定访问不同的学校,通过举办关于机器学习、人工神经网络和 TensorFlow 等主题的讲座/研讨会来传播 AI。

我绝不是人工智能方面的专家(至少现在还不是),但我已经能够通过上课和参与项目,对机器学习和自然语言处理的许多领域建立坚实的理解;足以向学生们介绍这些话题,并引导他们走向正确的方向。

现在,你不一定要参加这个项目的讲座或研讨会,一个简单的一对一的讨论可以为这个领域的新手做很多事情。不管你决定怎么做,我认为我们都应该遵守 3 条简单的规则:

1.不要胡说。

你能做的最糟糕的事情就是试图让自己听起来很聪明,并传播错误信息。我有学生就我不太了解的话题问我问题,我经常克制自己不做任何评论,以免让他们更加困惑。如果你不知道这一切,不要难过,这就是谷歌的作用!

2.把它作为一个学习自己的机会

我甚至不能简单地通过试图以容易消化的方式解释困难的概念来表达我对人工智能的了解有多少。记住,通过分享你所知道的,你不仅是在帮助别人,也是在帮助你自己。

3.确保他们向前支付它

回馈他人最重要的部分是鼓励他们也这样做。记住阿布的一句话,“帮助别人总会回到你身边”。

如果你准备好加入这一倡议,那么不要忘记使用标签 #AIforEveryone 分享你是如何参与其中的。

此外,如果你有任何问题,请随时联系我,并通过评论和分享这篇文章 😃 来表达对 ♥ 的爱

加入我们,成为一名志愿编辑助理

原文:https://towardsdatascience.com/join-us-as-an-editorial-associate-of-towards-data-science-766cdd74d13e?source=collection_archive---------0-----------------------

【2022 年 12 月更新

我们公开的志愿者编辑助理职位现在已经招满了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Thought Catalog on Unsplash

走向数据科学为成千上万的人提供了一个交流思想和扩展我们对数据科学的理解的平台。我们的受众是多样化的,包括对该主题完全陌生的读者和希望分享他们的项目和发现的专业人士。

我们致力于为我们的数据科学社区提供有趣和可靠的内容。我们的 TDS 团队会仔细审查我们从作者那里收到的每一篇帖子。我们经常联系我们的志愿编辑同事,他们是各自领域的专家,了解他们的观点。

随着越来越多的投稿涵盖了不断扩大的主题范围,我们邀请申请三个公开志愿编辑助理职位。

如果你对此感兴趣,请继续阅读!

我们在找什么?

目前,我们特别寻找在以下领域拥有丰富经验和知识的志愿编辑助理:

  • 计算机视觉
  • 生物学/生物信息学/医学
  • 高级机器学习/深度学习
  • 数据/人工智能伦理

我们总是欣赏具有强大的统计和/或数学专业知识的申请人。

申请人应该能够每周投入 1 小时。评论在周一至周五分配,我们更喜欢在 2-3 天内完成的评论,因为这有助于我们快速评估并向作者返回决定。由于我们是一个完全分散的团队,我们欢迎全球范围内的申请人。

我们将优先考虑具有丰富的 TDS 写作组合和相关行业或研究经验的申请人。你不必是一个活跃的媒体成员申请,因为我们会为你提供一个成员。

我们对你有什么期望?

随着我们将 TDS 打造成为面向初学者和专业人士的领先在线数据科学社区,我们正在寻找充满热情且有主见的主题专家,他们希望在保持我们出版物的质量方面发挥关键作用。

你的职责将包括每周花1 小时与我们的编辑一起审查与数据科学领域相关的内容,以及机器学习、人工智能、伦理和编程等相关主题。

这将涉及:

  • 就一篇文章是否对我们的读者有价值提供反馈;基于您的专业知识,我们特别想听听您对材料整体准确性的看法。
  • 向我们的作者提供反馈建议,这些可以通过我们的编辑或你自己在帖子上的私人注释与作者分享。

如何申请

要成为一名志愿编辑助理,请将您的简历或 LinkedIn 个人资料、专业领域以及是否有空通过电子邮件发送至我们的 TDS 编辑团队。请使用您的专业或学术电子邮件地址,因为这有助于我们验证您的个人资料和简历。

强烈鼓励你附上你以前的写作或提供你的媒体简介的例子!我们期待您的回复。

祝一切顺利,

佐科威内阁改组传闻

原文:https://towardsdatascience.com/jokowis-cabinet-reshuffle-buzz-a9baa8c19619?source=collection_archive---------7-----------------------

背景

佐科·维多多总统于 2016 年 7 月 27 日宣布内阁改组。旨在提高其内阁效率的举措。这件事在网民中引起了不同的反应。有些是优点,有些是缺点。了解人们对重组的看法看起来很有趣。因此,我通过追踪关键词“# reshuffle”来分析人们在 twitter 上谈论的关于改组的话题,然后从中提取信息。

数据

我收集了从 2016 年 7 月 27 日到 2016 年 8 月 3 日的数据,总共有 15,290 条推文包含标签#reshuffle(当然,实际上比关于#reshuffle 的推文数量多)。我使用 Jeff Gentry 的“twitteR”包来抓取推文。

分析

推文类型

让我们从了解#reshuffle 关键字的 tweet 行为开始分析。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Type of Tweets

似乎网民更喜欢转发人们的推文(55.4%),而不是表达自己的想法(推文,42.5%)。他们中很少有人(2.07%)会通过回复推特来做进一步的讨论。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Time distribution by hour

这张图显示了网民在 twitter 上活跃的时间分布。看起来网民更喜欢在早上而不是晚上活跃在推特上。高峰时间是早上 8 点。

网红

现在,我们将找出是谁在 twitter 上发布了关于#改组的推文。给你。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Top 5 Influencers

在此期间,共有 6081 个独立用户发布了关于#改组的帖子,总共获得了 837,660,066 次展示。上图显示了发帖最多的前 10 个 twitter 账户。

艺术家是谁?

以下是参与此次内阁改组的部长们的受欢迎程度分布。让我们看看在改组问题上谁是最受欢迎的部长。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Top 10 most mentioned people

Woa!Anies baswedan 是最受欢迎的大臣。紧随其后的是维兰托、斯里·穆利亚尼和伊格纳修斯·约南。

网友是怎么想的?

好的,在上面我们已经知道了在网民中受欢迎的部长。那么,他们是怎么看待他们的呢?他们说好的感觉还是相反?

让 wordcloud 来回答你的问题。下面是网民提及最多的 4 位最受欢迎的部长的聚类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Clustered wordcloud over top 4 popular ministers.

维兰托

Wiranto 与法律问题有关,因为他周围出现最多术语是’ kejahatan ‘,’ dakwaan ‘和’ ham '。

安尼斯巴斯维丹

Anies Baswedan 似乎得到了网民的积极印象。他们感谢安妮斯的表现,网民们也对他的替代者表示不满。

斯里·穆亚尼

人们欢迎 Sri Mulyani 回来,他们希望她能治愈印尼经济。

伊格内修斯·乔南

伊格内修斯·乔南,从网民那里得到了复杂的感觉。一些人同意他替换,另一些人对他的替换感到失望,因为他们认为 Jonan 的表现足够好。

从机器学习到深度学习的旅程

原文:https://towardsdatascience.com/journey-from-machine-learning-to-deep-learning-8a807e8f3c1c?source=collection_archive---------7-----------------------

我们都知道,机器学习和深度学习肯定会继续存在。从健康诊断到金融技术,许多初创公司都在这些基础上构建应用程序,而老牌企业则试图升级他们的技术堆栈,将这些技术用于业务分析。越来越多的企业需要智能分析来保持竞争优势。这绝对是为了未来收益而投资的两项技术。

在短短两年内,英伟达在深度学习方面合作的公司数量增长了近 35 倍,达到 3400 多家。

医疗保健、生命科学、能源、金融服务、汽车、制造和娱乐等行业将受益于从海量数据中推断出的洞察力。这些分析已经被杰出的玩家用来在游戏中保持领先。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Intelligence is desired by every enterprise to achieve optimality in every aspect of an organization.

我们每个人在日常生活中都听过这两个词。但是,这两者之间的确切区别是什么,以及我们的业务用例何时需要使用其中之一。深度学习显然已经显示了从计算机视觉到 NLP 分析的大量应用,并且已经超过了它的前身机器学习模型。但是,到目前为止,商业分析仍然主要由机器学习和决策树、随机森林等传统算法控制。仍然是可靠的方法。

在本文中,让我们探索这两个领域的基本区别,并对这两个领域进行评价。考虑到这两个领域的重要性,最好是温习一下基础知识,并对这两个领域有一个基本的不同理解。

深度学习是机器学习的子集,机器学习是 AI 的子集,AI 是任何做一些智能事情的计算机程序的总称。换句话说,所有的机器学习都是 AI,但不是所有的 AI 都是机器学习。例如,专家系统可能不使用任何机器学习,而只是利用由专家编码到其中的领域知识。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Open For Discussion In Response Section : Can we really call a machine mimicking intelligent behavior really intelligent ? Refer, Chinese Room Problem for example.

什么是机器学习?

机器学习捕捉系统的动态,并且不需要人为干预来进行某些改变。这使它变得强大,减少了对人类专家的依赖。也许,汤姆·米切尔最流行的定义会提供更多的见解。

如果一个计算机程序在 T 中的任务上的性能(如 P 所测量的)随着经验 E 而提高,则称该计算机程序从关于某类任务 T 和性能测量 P 的经验 E 中学习。

让我们借助一个例子来探讨这个定义。考虑一个场景,其中您有兴趣找出雇主满意度和雇主工资之间关系。所以,我们已经定义了我们的任务。让我们用线性模型来拟合我们的数据,损失函数是距离最佳拟合线的欧几里得距离之和。对于最佳拟合,我们的目标是将其最小化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

With number of more iterations i.e. increased experience E our model’s performance P does increases with reduction in loss and much better fitted curve for better predictions.

显然,这是一个让计算机无需显式编程就能学习的研究领域。

什么是深度学习?

深度人工神经网络是一组算法,在许多重要问题上,如图像识别、声音识别、推荐系统等,它们在准确性方面创造了新的记录。术语’’指的是神经网络中不止一个隐藏层。这些隐藏层用于学习一个问题的不同特征图。考虑下面的定义。

深度学习通过学习将问题表示为嵌套的概念层次结构来实现强大的功能和灵活性,每个概念都是相对于更简单的概念来定义的,而更抽象的表示是根据不太抽象的概念来计算的。

让我们通过与自动编码器(机器学习中的标准前馈神经网络)进行比较来培养对深度学习模型的欣赏。

征途:从机器学习中欣赏深度学习

深度学习模型在性能和达到最先进的结果方面超出了预期。但是,它们与机器学习中使用的人工神经网络或自动编码器有什么不同?使他们的工作更出色以取得更好结果的根本区别是什么?

考虑以[汽车、公共汽车、纪念碑、花卉]作为输出类别的多类别分类问题的情况。在机器学习中,最基本的方法是利用我们训练好的模型,如模式识别,在大量的特征集中找出分类对象的准确出现。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这种方法效率很低。但是,为什么呢?分类器需要做太多不必要的分析。像天空和水的蓝色在物体检测的图像中是不重要的。此外,对象的颜色在图像中并不重要。这将不必要地增加功能的数量。让我们应用特征工程,用边缘检测过滤器,用有限的重要特征达到更好的结果。具有计算出边缘的能力的模型将能够更好地构造出完整的对象,并且仅学习最相关的特征。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它肯定会比以前的方法给出更好的结果。但是,现在我们也可以使用专门设计的过滤器来检测像 SIFT 或 HOG 这样的对象。这将有助于给出以上问题的最新结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有的特征工程过程都是在一些领域知识和静态特征提取技术的帮助下完成的。在绘制这些特征图时,他们没有学习。这是数据科学家需要做的预处理工作。深度学习需要从上述场景中回答的主要问题是…

除了学习分类器的权重,我们还可以学习多个有意义的核吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Yes, We can !!

简单地通过将这些核作为参数,并且通过反向传播算法除了学习分类器的权重之外还学习它们。你可能已经知道,用于这个过程的网络被称为卷积神经网络。因为,我们什么也不做,只是在图像上应用这些过滤器时执行卷积运算。

但是,它与以前机器学习中存在的前馈神经网络有什么不同呢?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

常规的前馈神经网络是密集的,使得一个密集的网络从所有 16 个输入神经元中取贡献值来对 h11 的计算作出贡献。此外,最重要是大多数连接都是冗余的**

**多余!!但是,我认为这些密集的连接会捕捉到最多的信息。让我们看看 CNN 是如何解决这些问题的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Assume a 16 pixel input

显然,只有少数局部神经元参与了 h11 的计算。例如,只有像素 1、2、5、6 对 h11 有贡献。随着参数数量的减少,连接更加稀疏,使得复杂性降低,从而减少了计算。

这些稀疏的连接是否合理?我们不是在丢失信息吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这些稀疏的连接表明,相邻像素之间的相互作用比其他像素更重要。此外,考虑 x1x5 它们在第 1 层中不交互。但是它们间接有助于 g3 的计算,因此间接相互作用。考虑到假设两个不同的邻域可能表示对象的相同特征。这将被上面的连接和更高的权重所考虑。

CNN 的另一个重要特性是重量共享**。自动编码器将为图像的不同部分赋予不同的内核。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Do we want the kernel weights to be different for different portions of the image?

想象一下,我们正在尝试学习一个检测边缘的内核/过滤器。难道我们不应该在图像的所有部分应用相同的内核吗?因为,图像的像素可能只是平移。此外,我们可以用多个不同的内核学习图像的不同特征来增强我们的特征学习过程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

嗯,我希望通过上面的例子可以清楚地看到,与机器学习相比,深度学习模型具有更强的泛化能力和能力。所有的智能工作都由你创造的神经网络架构来完成。让我们在下一篇文章中看看并欣赏架构。

比较圈地:那么,为什么要用 ML?

最后,让我们在不同的用例参数上比较这两个领域,这些领域算法在这些用例参数上会表现得更好。深度学习没有成为行业标准,留下了优秀的旧 ML,这肯定有原因。

第一个感兴趣的参数是可使用的数据量和数据放大时模型的性能。随着数据的增加,参数会得到很好的调整,模型中的偏差会减少。但是,相反,假设我们想分析每天的数据,例如股票市场的日交易者。在数据量较小的情况下,机器学习模型的性能会更好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Data dependencies of domains

此外,在应用任何模型时,数据类型都非常重要。深度学习模型在关系数据上表现不佳是众所周知的。因为,没有像我们在 CNN 上看到的那样的社区房产。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Relational Data with no neighborhood relations 😉

数据无疑是模型的燃料,是决定使用哪种模型类型的主要因素。

对于硬件要求,深度学习模型严重依赖于具有大量 GPU 能力的高端机器,因为它涉及大量矩阵乘法,这些乘法可以用强大的 GPU 能力并行执行。其中,机器学习模型训练起来相对非常快,即使没有 GPU 计算也能很好地工作。

如上所述,它们在特征工程过程方面也不同。机器学习需要手工编码的规则和领域知识来提取特征信息。它的性能将取决于在深度学习算法从数据中学习特征时,特征提取得有多好。CNN 将尝试学习低层次的特征,如早期图层中的边缘和线条,然后是人脸的部分,然后是人脸的高层次表示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

与机器学习算法相比,深度学习模型的训练时间要长得多,因为这些模型中涉及的参数数量要大得多。但是测试时间更短,因为它执行操作的速度更快,运行时间更少。k 近邻等机器学习算法在测试过程中速度较慢。

重复性和可解释性是许多行业仍在考虑将深度学习模型用作标准程序的主要原因。由模型获得的结果是不可重复的,因为它涉及大量的参数,这些高参数的不确定性仍然存在。精确的结果可能无法重现,需要取平均值。

此外,我们不知道特定的神经元在深度学习模型中以精确量化的方式做什么。我们可以找出哪个神经元在什么时候活跃,但我们不知道这些神经元应该模拟什么,以及这些神经元层集体在做什么。而像决策树这样的机器学习算法给出了清晰的规则,svm 用其超平面给出了清晰的界限,这更容易解释。

我希望这次对话能够明确深度学习和机器学习之间的区别,并了解何时从机器学习过渡到深度学习。感谢阅读!!

机器学习之旅第 1 部分:简介、动机和路线图

原文:https://towardsdatascience.com/journey-to-machine-learning-part-1-introductions-motivations-and-roadmap-35a438f1e126?source=collection_archive---------4-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

介绍

如果你一直在关注新闻,你很可能已经看到了关于机器学习人才需求量的头条新闻。在最近的 LinkedIn 经济图表报告中,“机器学习工程师”和“数据科学家”是 2017 年增长最快的两个职位(分别增长 9.8 倍和 6.5 倍)。媒体本身充斥着教程软件评论,以及有趣应用的故事。尽管有明显的需求,但与软件工程其他领域可用的资源相比,作为局外人实际进入这个领域的资源似乎很少。这就是我写这个系列的原因:作为我从非 CS 背景成为机器学习工程师的旅程的文档。

“但是马特”,你一定会说,“这一点也不奇怪,很多人从其他领域进入机器学习。”

确实有很多非 CS 专业的人进入这个领域。然而,我在大学里并没有申报统计学、数学、物理或电气工程专业。我的背景是分子生物学,你们中的一些人可能已经注意到了,这在 STEM 领域的例子列表中经常被忽略。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Credit to Randall Munroe and XKCD (had a tough time deciding between this comic and this one)

虽然我在本科期间比大多数生物专业的学生更专注于统计学和计算机科学,但与物理学家进入该领域相比,这仍然是一条不寻常的道路(正如 Nathan Yau 的 FlowingData 的这篇可爱的帖子所示)。

背景

从高中开始,我就对衰老疾病有一种近乎专一的痴迷。我对机器学习的大量接触是在我本科从事这一领域的研究期间。这是在一个实验室里,将离散的果蝇死亡数据拟合到连续方程,如 gompertz 和 weibull 分布,并使用图像跟踪来测量所述果蝇的身体活动量。在这项研究之外,我还参与了一些项目,比如谷歌学术刮刀,以加快文献综述论文的搜索速度。当时,机器学习似乎只是应用于生物医学研究的另一个有用工具。像其他人一样,我最终意识到这将变得更大,成为未来十年日常生活中不可或缺的技术。我知道我必须认真对待,尽可能熟练地掌握这方面的技能。

但是为什么要完全摆脱衰老呢?为了回答这个问题,我想播放一下我看过的哈佛医学院的 David Sinclair 博士的演讲。在开始谈论他的实验室令人兴奋的研究进展之前,他描述了衰老领域的一场共同斗争。许多实验室专注于该过程的狭窄方面,无论是特定的酶活性、营养信号、基因变化,还是其他无数领域。辛克莱博士提出了盲人和大象的类比,这是因为许多研究人员只关注衰老的狭隘方面,而没有花太多时间来认识整体和部分之间的差异。我觉得现实略有不同(这更像是视力正常的人试图在黑暗中用激光笔而不是手电筒识别一头大象),但结论仍然是正确的:我们需要更好的工具和方法来解决老龄化等问题。

这一点,再加上其他几个因素,让我意识到单独使用生物科学的湿实验室方法是非常低效的。在治愈和治疗的搜索空间中,许多唾手可得的果实在很久以前就被获得了。仍然存在的挑战包括可能需要大量数据才能诊断的疾病和状况,更不用说治疗了(例如,基因多样的癌症,快速变异的病毒,如艾滋病毒)。是的,我同意许多其他人的观点,衰老肯定是一种疾病,但它也是一种定义模糊的疾病,以各种不同的方式影响着人们。

我决定,如果我要在这个领域或我决定进入的任何其他领域做出巨大贡献,最有效的方法将是致力于增强和自动化数据分析的工具。至少在不久的将来,我必须专注于确保我在机器学习方面的基础是坚实的,然后我才能将重点放在像衰老这样的具体案例上。

“那么……这个系列到底是关于什么的?”

在过去的一年里,我已经从学习机器学习和自学转向实际上为机器学习项目工作而获得报酬。机器学习工程仍然相对较新,所以我觉得我迄今为止的经验可能对其他试图进入这一领域的人有用。虽然有大量关于特定机器学习技术的列表和视频教程,但没有像网络或移动开发人员那样的职业指南式支持。这就是为什么这篇文章不仅仅是罗列我用来学习的资源。我还将记录我发现的创建投资组合项目的最佳实践,寻找该领域的短期和长期工作,并跟上快速变化的研究前景。我也将从我采访过的比我走得更远的人那里收集智慧的建议。

写这个系列时,我有两个目标:

如果我永久进入机器学习工程的长期目标最终成功,我希望这可以作为其他试图进入该领域的人(以及试图进入斯坦福大学计算机科学硕士或博士学位以下的人)的路线图。在这种情况下,成功的衡量标准包括在一家拥有大型 R&D 部门的顶级技术公司或一家快速增长的初创公司获得一份全职工作(并在几年的时间尺度内为该初创公司的快速增长做出贡献)。如果我能从一个非计算机科学背景的人那里获得成功,那么我提供的资源很可能会让一个有计算机科学背景的人获得更大的成功。

你需要表现出来的技术能力水平并没有降低,在你没有学历背景的情况下甚至更高,但这是完全可能的。

— Dario Amodei,博士,OpenAI 研究员, 在没有机器学习博士学位的情况下进入该领域

如果我最终没有成功(由某种经验证据来定义,即我试图做的事情是不可能的,或者我离这个领域太远),我希望这可以作为一个记录,其他人可以指出应该避免什么。这种结果不太可能发生,因为我已经开始为做机器学习工作获得报酬了(这些帖子赶上现在可能还需要一段时间),但还有更高的目标要爬。我不想过早庆祝。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

记住这一点,下面是本系列其余部分的暂定路线图:

  1. 介绍和动机(即你现在正在阅读的内容)
  2. 机器学习工程技能清单
  3. 提高生产力和学习的习惯
  4. 软件和硬件资源
  5. 寻找导师和沉浸感
  6. 阅读研究论文(和一些每个人都应该知道的)
  7. 解决问题的方法和工作流程
  8. 作为机器学习工程师的自由职业者
  9. 人工智能和机器学习工作联合集的实际考虑
  10. 你应该熟悉的团体和人
  11. 机器学习工程师职位面试

这些帖子的大部分内容已经写好了,尽管这些帖子的顺序和数量可能会改变。请继续关注更多更新,并随时回复您想看的内容的建议。

深入探讨多标签分类…!(附有详细的案例研究)

原文:https://towardsdatascience.com/journey-to-the-center-of-multi-label-classification-384c40229bff?source=collection_archive---------0-----------------------

有毒-评论分类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig-1: Multi-Label Classification to finde genre based on plot summary.

随着可用数据的持续增加,迫切需要对其进行组织,并且现代分类问题通常涉及同时与单个实例相关联的多个标签的预测。

被称为多标签分类,它是一个这样的任务,在许多现实世界的问题中无所不在。

在这个项目中,以 Kaggle 问题为例,我们探索了多标签分类的不同方面。

数据来源免责声明: 数据集包含可能被认为亵渎、低俗或冒犯的文字。

项目鸟瞰图:

  • **第 1 部分:**多标签分类概述。
  • **第二部分:**问题定义&评估指标。
  • Part-3: 探索性数据分析 (EDA)
  • **第四部分:**数据预处理。
  • **第五部分:**多标签分类技术。

第 1 部分:多标签分类概述:

  • 多标签分类起源于对文本分类问题的研究,其中每个文档可能同时属于几个预定义的主题。
  • 文本数据的多标签分类是一个重要的问题。例子从新闻文章到电子邮件。例如,这可以用来根据电影情节的概要找到电影所属的类型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig-2: Multi-label classification to find genres based on movie posters.

  • 或者基于电影海报的流派多标签分类。(这就进入了计算机视觉的领域。)
  • 在多标签分类中,训练集由与一组标签相关联的实例组成,任务是通过分析具有已知标签集的训练实例来预测未知实例的标签集。
  • 多类分类的区别&多标签分类在于,在多类问题中,类是互斥的,而对于多标签问题,每个标签代表不同的分类任务,但这些任务在某种程度上是相关的。
  • 例如,多类分类假设每个样本被分配给一个且仅一个标签:水果可以是苹果或梨,但不能同时是两者。然而,多标签分类的一个例子可以是,一个文本可能同时涉及宗教、政治、金融或教育中的任何一个,或者这些都不涉及。

第 2 部分:问题定义和评估标准:

问题定义:

  • 有毒评论分类是一个高度不平衡数据集的多标签文本分类问题。
  • 我们面临的挑战是建立一个多标签模型,能够检测不同类型的毒性,如威胁,淫秽,侮辱和基于身份的仇恨。我们需要创建一个模型来预测每条评论的每种毒性的概率。
  • 这个问题的 Kaggle 链接可以在 这里 找到。

评估指标:

**注:**ka ggle 挑战赛最初的评估指标是 Log-Loss ,后来改为 AUC 。但是在这篇文章中,我们也揭示了其他评估指标。

  • 单标签的评估方法通常不同于多标签的评估方法。这里,在单标签分类中,我们使用简单的度量标准,如精确度、召回率、准确度等。比方说,在单标签分类中,准确度只是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig-3: Accuracy in single-label classification

  • 在多标签分类中,错误分类不再是绝对的对错。包含实际类别的子集的预测应该被认为比不包含任何类别的预测更好,即,正确预测三个标签中的两个这比根本不预测标签更好。

微平均 & M 宏平均(基于标签的测量):

  • 为了测量一个多类分类器,我们必须以某种方式对这些类进行平均。有两种不同的方法可以做到这一点,分别称为微平均宏平均
  • 微平均中,对每个类别的所有 TPs、TNs、FPs 和 FNs 求和,然后取平均值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig-4: Micro-Averaging

  • 微平均方法中,您将系统对于不同集合的单个真阳性、假阳性和假阴性相加并加以应用。并且微观平均 F1 分数将简单地是上述两个方程的调和平均值。
  • 宏平均非常简单。我们只是取不同集合上系统的精度和召回率的平均值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig-5: Macro-Averaging

  • 当您想要了解系统在数据集上的整体表现时,可以使用宏平均方法。你不应该用这个平均数做出任何具体的决定。另一方面,当数据集大小不同时,微平均是一个有用的方法。

汉明损失(基于示例的测量):

  • 用最简单的术语来说,汉明损失是被错误预测的标签的分数,即错误标签占标签总数的分数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig-6: Hamming-Loss

精确匹配率(子集准确度):

  • 这是最严格的指标,表示所有标签都被正确分类的样本的百分比。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig-7: Exact Match Ratio

  • 这种方法的缺点是多类分类问题有部分正确的机会,但这里我们忽略了那些部分正确的匹配。
  • scikit-learn 中有一个实现子集精度的函数,叫做 accuracy_score。

**注意:**我们将使用 accuracy_score 函数来评估我们在这个项目中的所有模型。

第 3 部分:探索性数据分析(EDA):

探索性数据分析是数据分析过程中的重要步骤之一。在这里,重点是理解手头的数据——比如制定向数据集提问的正确问题,如何操作数据源以获得所需的答案,等等。

  • 首先让我们导入必要的库。
import os
import csv
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
  • 接下来,我们将 csv 文件中的数据加载到 pandas 数据帧中,并检查其属性。
data_path = "/Users/kartik/Desktop/AAIC/Projects/jigsaw-toxic-comment-classification-challenge/data/train.csv"data_raw = pd.read_csv(data_path)print("Number of rows in data =",data_raw.shape[0])
print("Number of columns in data =",data_raw.shape[1])
print("\n")
print("**Sample data:**")
data_raw.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig-8: Data Attributes

  • 现在我们统计每个标签下的评论数量。(详细代码请参考本项目的 GitHub 链接。)
categories = list(data_raw.columns.values)
sns.set(font_scale = 2)
plt.figure(figsize=(15,8))ax= sns.barplot(categories, data_raw.iloc[:,2:].sum().values)plt.title("Comments in each category", fontsize=24)
plt.ylabel('Number of comments', fontsize=18)
plt.xlabel('Comment Type ', fontsize=18)#adding the text labels
rects = ax.patches
labels = data_raw.iloc[:,2:].sum().values
for rect, label in zip(rects, labels):
    height = rect.get_height()
    ax.text(rect.get_x() + rect.get_width()/2, height + 5, label, ha='center', va='bottom', fontsize=18)plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig-9: Count of comments under each label

  • 计算具有多个标签的评论的数量。
rowSums = data_raw.iloc[:,2:].sum(axis=1)
multiLabel_counts = rowSums.value_counts()
multiLabel_counts = multiLabel_counts.iloc[1:]sns.set(font_scale = 2)
plt.figure(figsize=(15,8))ax = sns.barplot(multiLabel_counts.index, multiLabel_counts.values)plt.title("Comments having multiple labels ")
plt.ylabel('Number of comments', fontsize=18)
plt.xlabel('Number of labels', fontsize=18)#adding the text labels
rects = ax.patches
labels = multiLabel_counts.values
for rect, label in zip(rects, labels):
    height = rect.get_height()
    ax.text(rect.get_x() + rect.get_width()/2, height + 5, label, ha='center', va='bottom')plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig-10: Count of comments with multiple labels.

  • 每一类评论中最常用词的 WordCloud 表示。
from wordcloud import WordCloud,STOPWORDSplt.figure(figsize=(40,25))# clean
subset = data_raw[data_raw.clean==True]
text = subset.comment_text.values
cloud_toxic = WordCloud(
                          stopwords=STOPWORDS,
                          background_color='black',
                          collocations=False,
                          width=2500,
                          height=1800
                         ).generate(" ".join(text))
plt.axis('off')
plt.title("Clean",fontsize=40)
plt.imshow(cloud_clean)# Same code can be used to generate wordclouds of other categories.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig-1: Word-cloud Representation of Clean Comments

第 4 部分:数据预处理:

  • 我们首先将注释转换成小写,然后使用定制的函数从注释中删除 html 标签、标点符号和非字母字符
import nltk
from nltk.corpus import stopwords
from nltk.stem.snowball import SnowballStemmer
import re
import sys
import warningsdata = data_rawif not sys.warnoptions:
    warnings.simplefilter("ignore")def cleanHtml(sentence):
    cleanr = re.compile('<.*?>')
    cleantext = re.sub(cleanr, ' ', str(sentence))
    return cleantextdef cleanPunc(sentence): #function to clean the word of any punctuation or special characters
    cleaned = re.sub(r'[?|!|\'|"|#]',r'',sentence)
    cleaned = re.sub(r'[.|,|)|(|\|/]',r' ',cleaned)
    cleaned = cleaned.strip()
    cleaned = cleaned.replace("\n"," ")
    return cleaneddef keepAlpha(sentence):
    alpha_sent = ""
    for word in sentence.split():
        alpha_word = re.sub('[^a-z A-Z]+', ' ', word)
        alpha_sent += alpha_word
        alpha_sent += " "
    alpha_sent = alpha_sent.strip()
    return alpha_sentdata['comment_text'] = data['comment_text'].str.lower()
data['comment_text'] = data['comment_text'].apply(cleanHtml)
data['comment_text'] = data['comment_text'].apply(cleanPunc)
data['comment_text'] = data['comment_text'].apply(keepAlpha)
  • 接下来,我们使用可以从 NLTK 库中下载的默认停用词集合,删除注释中出现的所有 停用词 。我们还在标准列表中添加了一些停用词。
  • 停用词基本上是任何语言中的一组常用词,不仅仅是英语。停用词对许多应用程序至关重要的原因是,如果我们删除给定语言中非常常用的词,我们就可以专注于重要的词。
stop_words = set(stopwords.words('english'))
stop_words.update(['zero','one','two','three','four','five','six','seven','eight','nine','ten','may','also','across','among','beside','however','yet','within'])
re_stop_words = re.compile(r"\b(" + "|".join(stop_words) + ")\\W", re.I)
def removeStopWords(sentence):
    global re_stop_words
    return re_stop_words.sub(" ", sentence)data['comment_text'] = data['comment_text'].apply(removeStopWords)
  • 接下来我们做 词干 *。*存在不同种类的词干,它们基本上将语义大致相同的单词转换成一种标准形式。例如,对于逗乐、娱乐和逗乐,词干应该是 amus。
stemmer = SnowballStemmer("english")
def stemming(sentence):
    stemSentence = ""
    for word in sentence.split():
        stem = stemmer.stem(word)
        stemSentence += stem
        stemSentence += " "
    stemSentence = stemSentence.strip()
    return stemSentencedata['comment_text'] = data['comment_text'].apply(stemming)
  • 在将数据集分成训练集和测试集之后,我们想要总结我们的注释,并将它们转换成数字向量。
  • 一个技巧是挑选最频繁出现的术语(具有高 术语频率tf 的词)。然而,最频繁出现的单词是一个不太有用的度量,因为像’ this ‘、’ a '这样的单词在所有文档中出现得非常频繁。
  • 因此,我们还希望衡量一个单词的独特性,即该单词在所有文档中出现的频率(In 反转文档频率idf )。
  • 因此,一个单词的 TF & IDF(TF-IDF)的乘积给出了该单词在文档中的出现频率乘以该单词在整个文档语料库中的独特性的乘积。
  • 文档中具有高 tfidf 分数的单词在文档中频繁出现,并且提供关于该特定文档的最多信息。
from sklearn.model_selection import train_test_splittrain, test = train_test_split(data, random_state=42, test_size=0.30, shuffle=True)from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(strip_accents='unicode', analyzer='word', ngram_range=(1,3), norm='l2')
vectorizer.fit(train_text)
vectorizer.fit(test_text)x_train = vectorizer.transform(train_text)
y_train = train.drop(labels = ['id','comment_text'], axis=1)x_test = vectorizer.transform(test_text)
y_test = test.drop(labels = ['id','comment_text'], axis=1)
  • TF-IDF 易于计算,但其缺点是不能捕捉文本中的位置、语义、在不同文档中的共现等。

第 5 部分:多标签分类技术;

大多数传统的学习算法是针对单标签分类问题开发的。因此,文献中的许多方法将多标签问题转化为多个单标签问题,从而可以使用现有的单标签算法。

1.OneVsRest

  • 通过限制每个实例只有一个标签,传统的两类和多类问题都可以转化为多标签问题。另一方面,多标签问题的通用性不可避免地增加了学习的难度。解决多标签问题的直观方法是将其分解为多个独立的二分类问题(每个类别一个)。
  • 在“一对多”策略中,可以建立多个独立的分类器,并且对于一个看不见的实例,选择置信度最大化的类别。
  • 这里的主要假设是标签是互斥的。在这个方法中,您不考虑类之间的任何潜在相关性。
  • 例如,它更像是问一些简单的问题,比如,“*评论是否有毒”、“*评论是否具有威胁性?等。此外,这里可能有一个广泛的过度拟合的情况,因为大多数注释是未标记的,也就是说,大多数注释是干净的注释。
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score
from sklearn.multiclass import OneVsRestClassifier# Using pipeline for applying logistic regression and one vs rest classifier
LogReg_pipeline = Pipeline([
                ('clf', OneVsRestClassifier(LogisticRegression(solver='sag'), n_jobs=-1)),
            ])for category in categories:
    print('**Processing {} comments...**'.format(category))

    # Training logistic regression model on train data
    LogReg_pipeline.fit(x_train, train[category])

    # calculating test accuracy
    prediction = LogReg_pipeline.predict(x_test)
    print('Test accuracy is {}'.format(accuracy_score(test[category], prediction)))
    print("\n")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig-12: OneVsRest

2.二元相关性

  • 在这种情况下,训练单标签二元分类器的集合,每个类别一个。每个分类器预测一个类的成员或非成员。所有被预测的类的并集被作为多标签输出。这种方法很受欢迎,因为它易于实现,但是它也忽略了类标签之间可能的相关性。
  • 换句话说,如果有 q 个标签,二元相关性方法从图像中创建 q 个新数据集,每个标签一个,并在每个新数据集上训练单标签分类器。一个分类器可能对“它包含树吗?”这个问题回答是/否,从而“二元关联”中的“二元”。这是一种简单的方法,但是当标签之间存在依赖关系时,这种方法就不好用了。
  • OneVsRest &二元关联性看起来非常相像。如果 OneVsRest 中的多个分类器回答*“是”*,那么您将回到二元相关性场景。
# using binary relevance
from skmultilearn.problem_transform import BinaryRelevance
from sklearn.naive_bayes import GaussianNB# initialize binary relevance multi-label classifier
# with a gaussian naive bayes base classifier
classifier = BinaryRelevance(GaussianNB())# train
classifier.fit(x_train, y_train)# predict
predictions = classifier.predict(x_test)# accuracy
print("Accuracy = ",accuracy_score(y_test,predictions)) ***Output:****Accuracy = 0.856666666667*

3.分类器链

  • 一串二元分类器 C0,C1。。。,Cn,其中分类器 Ci 使用所有分类器 Cj 的预测,其中 j < i. This way the method, also called classifier chains (CC), can take into account label correlations.
  • The total number of classifiers needed for this approach is equal to the number of classes, but the training of the classifiers is more involved.
  • Following is an illustrated example with a classification problem of three categories {C1, C2, C3} chained in that order.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig-13: Classifier Chains

# using classifier chains
from skmultilearn.problem_transform import ClassifierChain
from sklearn.linear_model import LogisticRegression# initialize classifier chains multi-label classifier
classifier = ClassifierChain(LogisticRegression())# Training logistic regression model on train data
classifier.fit(x_train, y_train)# predict
predictions = classifier.predict(x_test)# accuracy
print("Accuracy = ",accuracy_score(y_test,predictions))
print("\n")***Output:****Accuracy = 0.893333333333*

4. Label Powerset

  • This approach does take possible correlations between class labels into account. More commonly this approach is called the label-powerset method, because it considers each member of the power set of labels in the training set as a single label.
  • This method needs worst case (2^|C|) classifiers, and has a high computational complexity.
  • However when the number of classes increases the number of distinct label combinations can grow exponentially. This easily leads to combinatorial explosion and thus computational infeasibility. Furthermore, some label combinations will have very few positive examples.
# using Label Powerset
from skmultilearn.problem_transform import LabelPowerset# initialize label powerset multi-label classifier
classifier = LabelPowerset(LogisticRegression())# train
classifier.fit(x_train, y_train)# predict
predictions = classifier.predict(x_test)# accuracy
print("Accuracy = ",accuracy_score(y_test,predictions))
print("\n")***Output:****Accuracy = 0.893333333333*

5. Adapted Algorithm

  • Algorithm adaptation methods for multi-label classification concentrate on adapting single-label classification algorithms to the multi-label case usually by changes in cost/decision functions.
  • Here we use a multi-label lazy learning approach named ML-KNN 是从传统的 K-最近邻(KNN)算法得到的。
  • [**skmultilearn.adapt**](http://scikit.ml/api/api/skmultilearn.adapt.html#module-skmultilearn.adapt)模块实现多标签分类的算法自适应方法,包括但不限于 ML-KNN。
from skmultilearn.adapt import MLkNN
from scipy.sparse import csr_matrix, lil_matrixclassifier_new = MLkNN(k=10)# Note that this classifier can throw up errors when handling sparse matrices.x_train = lil_matrix(x_train).toarray()
y_train = lil_matrix(y_train).toarray()
x_test = lil_matrix(x_test).toarray()# train
classifier_new.fit(x_train, y_train)# predict
predictions_new = classifier_new.predict(x_test)# accuracy
print("Accuracy = ",accuracy_score(y_test,predictions_new))
print("\n")***Output:****Accuracy = 0.88166666667*

结论:

结果:

  • 解决多标签分类问题主要有两种方法:问题转化方法算法自适应方法
  • 问题转换方法将多标签问题转换成一组二元分类问题,然后可以使用单类分类器来处理这些问题。
  • 而算法适应方法使算法适应直接执行多标签分类。换句话说,他们不是试图将问题转化为更简单的问题,而是试图解决问题的全部形式。
  • 在与其他方法的广泛比较中,label-powerset 方法得分最高,其次是 one-against-all 方法。
  • 在这个数据集上运行时,ML-KNN 和 label-powerset 都需要相当长的时间,所以实验是在训练数据的随机样本上进行的。

进一步改进:

  • 在深度学习中使用 LSTMs 可以解决同样的问题。
  • 为了更快的速度,我们可以使用决策树,为了在速度和准确性之间进行合理的权衡,我们也可以选择集合模型。
  • 诸如 MEKA 的其他框架可以用于处理多标签分类问题。

GitHub 项目的 链接 。LinkedIn 简介

希望你喜欢这个教程。感谢阅读…!

直观理解贝叶斯定理之旅

原文:https://towardsdatascience.com/journey-to-understand-bayes-theorem-visually-80b9fbf9f4f5?source=collection_archive---------10-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Riho Kroll on Unsplash

对于机器学习工程师或数据科学专业人员来说,理解概率的概念是必须的。许多数据科学挑战性问题的解决方案本质上往往是概率性的。因此,更好地理解概率将有助于你更有效地理解和实现这些算法。

每当我阅读任何概率书籍或研究论文时,大多数时候我都发现这些书籍中的文献过于理论化。根据社会科学研究网的数据,65%的人是视觉学习者。用图解法理解定理和证明是可视化信息和数据的有效方法,不仅如此,这种以可视化方式呈现数据的方法在很长一段时间内都被证明是有效的。所以通过这个博客,我想以一种视觉的方式展示概率的概念。

目录

  1. 什么是条件概率?
  2. 全概率定律
  3. 贝叶斯定理
  4. 贝叶斯定理的应用

首先让我们详细了解条件概率。

什么是条件概率?

根据维基百科 的说法,条件概率是在假设(通过假设、推测、断言或证据)另一事件已经发生的情况下,对一个事件(一些特定情况发生)的概率的度量。如果感兴趣的事件是 A 且事件 B 已知或假设已经发生,“给定 B 的情况下 A 的条件概率”,或“条件 BA 的概率”,通常写成P(A|B,有时也写成P

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: giphy.com

这和我第一次读这本书时的反应是一样的。你们中的一些人一定已经通过维恩图方法理解了它。所以现在让我们尝试用一种新的方法来直观地解释它。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Conditional Probability Diagram

假设我们在从开始的时间线内开始观察。在我们开始观察时间线之后,事件 A 有可能发生。在 A 之后还有另一个事件 B 发生的可能性,其概率用 P(B|A) 表示。

由于两个事件相继发生,整个时间线发生的概率(即 A 和 B 都发生并且 B 发生在 A 之后)为

P(A)⋅港口

由于我们考虑 A 和 B 都发生的概率,它也可以解释为 P(A ∩ B)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Intersection Rule (A B)

因此,

P(A B) = P(A)⋅ P(B|A)

这里 P(B|A)被称为条件概率,因此可以简化为

P(B|A) = P(A B)/P(A),假设 P(A) ≠ 0

请注意,只有当事件相继发生并且相互依赖时,上述情况才有效。也有可能 A 不影响 B,如果是这样,那么这些事件是相互独立的,称为独立事件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Independent Events

因此,在独立事件的情况下,A 发生的几率不会影响 B 发生的几率。

P(B|A) = P(B)

全概率定律

全概率法则将计算分成不同的部分。它用于确定一个事件的概率,该事件与前一个事件之前发生的两个或多个事件相关。

太抽象?让我们试试视觉方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Total Probability Diagram

设 B 是一个事件,它可以发生在任何“ n ”事件(A1,A2,A3,…)之后…安)。如上定义 P(Ai ∩ B) = P(Ai)⋅P(B|Ai) ∀ i ∈[1,n]

自从事件 A1,A2,A3,…an 是互斥的,不能同时出现,我们可以通过 A1 或 A2 或 A3 或……或 An 到达 B。因此,求和规则规定

P(B)= P(A1∩B)+P(A2∩B)+P(A3∩B)+……+ P(An ∩ B)

P(A1)⋅ P(B|A1) + P(A2)⋅ P(B|A2) + ……+ P(An)⋅ P(B|An)

上述表达式称为全概率法则全概率法则。这也可以用文氏图来解释。

贝叶斯定理

贝叶斯定理是一种基于某些概率的先验知识来预测起源或来源的方法

我们已经知道 P(B|A) = P(A ∩ B)/P(A) ,假设两个相互依存的事件 P(A) ≠ 0。有没有想过什么 P(A|B) =?,语义上没有任何意义,因为 B 发生在 A 之后,并且时间线不能反转(即我们不能从 B 向上移动到开始

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据条件概率,数学上我们知道

P(A|B) = P(B ∩ A)/P(B),假设 P(B) ≠ 0

P(A|B) = P(A ∩ B)/P(B),as P(A ∩ B) = P(B ∩ A)

我们知道这一点

P(A ∩ B) = P(B|A)⋅ P(A)

替换我们得到的值

p(a | b)=p(b|a)⋅p(a)/p(b)

这是贝叶斯定理的最简单形式。

现在,假设 B 相互依赖于在它之前发生的多个事件。将全概率规则应用于上述表达式,我们得到

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

p(ai | b)=p(b|ai)⋅p(ai)/(p(a1)⋅p(b | a1)+……+ P(An)⋅ P(B|An))

这是我们通常在各种现实世界应用中使用的贝叶斯定理的形式。

贝叶斯定理的应用

由于它的预测性质,我们使用贝叶斯定理来推导朴素贝叶斯,这是一个流行的机器学习分类器

如您所知,贝叶斯定理基于可能与事件相关的因素的先验知识来定义事件的概率。

现在,基本上对于一个数据点 xi,我们必须预测当前输出 Y 属于哪一类。假设总共有“j”个类用于输出。
然后,
P(y = c1 | x = xi)——>告诉我们,对于给定的输入 Xi,y 是 C1 的概率是多少。
P(y = c2 | x = xi)——>告诉我们,对于给定的输入 Xi,y 是 C2 的概率是多少。
以此类推直到 cj。

在所有这些概率计算中,y 属于具有最大概率的特定类别。

我们将使用贝叶斯定理来做这些概率计算。

这为我们提供了数据点(xi)的当前值的输出属于第 j 类的概率。
因为对于所有的类 1,2,…,j,分母将具有相同的值,所以我们在进行比较时可以忽略这一点。因此,我们得到了计算概率的公式。

为什么叫幼稚?还是天真的假设

我们之所以称之为幼稚,是因为我们做了一个简单的假设,即一个类中特定特性的存在与任何其他特性的存在无关,这意味着每个特性都是相互独立的。

概率 P(y=cj)的估计可以直接从训练点的数量来完成。
假设有 100 个训练点和 3 个输出类别,10 个属于类别 c1,40 个属于类别 C2,剩余的 50 个属于类别 C3。
类别概率的估计值将为:
P(y = C1)= 10/100 = 0.1
P(y = C2)= 40/100 = 0.4
P(y = C3)= 50/100 = 0.5

为了对 P(x=xi|y=cj)进行概率估计,朴素贝叶斯分类算法假设所有特征都是独立的。因此,对于第 j 个类的输出,我们可以通过分别乘以所有这些特征获得的概率(假设特征是独立的)来计算这一点。

P(x = Xi | y = CJ)= P(x = Xi(1)| y = CJ)P(x = Xi(2)| y = CJ)…。P(x=xi(n)|y=cj)

这里,xi(1)表示第 I 个数据点的第 1 特征的值,x=xi(n)表示第 I 个数据点的第 n 特征的值。

在接受了天真的假设后,我们可以很容易地计算出个体的概率,然后简单地将结果相乘,计算出最终的概率 P’。

使用上面的公式,对于给定的第 I 个数据点,我们可以计算输出 y 属于第 j 类的概率。

这是贝叶斯定理在现实世界中的一个主要应用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: giphy.com

根据封面判断一本书…!

原文:https://towardsdatascience.com/judging-a-book-by-its-cover-1365d001ef50?source=collection_archive---------6-----------------------

项目的 GitHub 链接。LinkedIn 简介

与流行的谚语“不要根据封面来判断一本书”相反,一本书的封面实际上可以用来获得关于这本书的各种信息。一本书的封面通常是第一次互动,它会给读者留下印象。它开始与潜在的读者对话,并开始画一个故事,揭示里面的内容。但是,书的封面上写了什么?

如果光是书的封面就能告诉我们选择这本书作为下一次阅读的所有信息,无论是平均评分、有用的评论、书的页数、作者的详细信息,还是对这本书的更好的总结,会怎么样?如果所有这些信息都是从无数的网站上收集来的,使得信息更加真实,那会怎么样呢?

延伸我对书籍的痴迷,这个项目在计算机视觉机器学习的帮助下解决了上述问题。

项目鸟瞰图:

这个项目是一个临时版本的 CBIR ( 基于内容的图像检索)系统。一旦用户实时点击书籍封面的图片,我们使用一个三级匹配系统来检索书籍封面的最接近匹配,并根据检索到的书籍封面显示从 Goodreads 和 Amazon 等网站获得的关于书籍各个方面的总结信息。

三级匹配系统:

  • 一级: RGB 颜色直方图。
  • **第二级:**结构相似性指数度量(SSIM)。
  • Level-3: 使用 SIFT 特征的 FLANN 匹配。
  • 这个三级匹配系统的基本思想是通过在每一级消除不相关的匹配来缩小精确匹配的范围。随着级别的增加,匹配器产生的结果的准确性增加,并且它用于匹配的时间也增加。
  • 如果我们在初始级别消除更多的匹配,那么匹配器在下一级别所花费的时间将会减少,但同时潜在的匹配可能已经在前一级别被消除,因此降低了整个系统的准确性。
  • 如果我们在初始级别消除非常少的匹配,从而将更多的匹配传递给下一级匹配器,则系统的时间会急剧增加,但系统的准确性不会受到损害。
  • 因此,我们减少了每个级别的潜在匹配的数量,但不是通过消除太多的匹配,因此我们在速度和准确性之间进行了微调。

十步流程:

  • 第一步:建立一个包含所有可用书籍封面及其各自的 ISBN 号的存储库。
  • **第二步:**为库中所有的书籍封面图像计算 RGB 颜色直方图
  • 步骤 3: 读入查询书籍封面并计算其颜色直方图。
  • 步骤 4: 基于直方图之间的相关性在图像库中搜索查询书封面的最接近匹配。(一级匹配器)。
  • **第五步:**使用 SSIM第四步得到的匹配中搜索与查询书封面最接近的匹配。(二级匹配器)。
  • **第六步:**使用 FLANN第五步得到的匹配中搜索与查询书封面最接近的匹配。(三级匹配器)。
  • 步骤 7: 显示 3 级匹配后得到的前 4 个匹配。还显示前 4 个检索图像中匹配的 SIFT 特征的数量。
  • 步骤 8: 绘制查询书封面图像与顶部匹配的匹配。
  • **第 9 步:**创建一个网络爬虫从 Goodreads 和 Amazon 收集信息。
  • 步骤-10: 使用顶级匹配的 ISBN 和在*步骤-9 中设计的爬虫程序,*检索额外的图书信息,如评级数、平均评级、有用评论、图书页数、作者详细信息等。并最终显示所获得信息的汇总版本。

此项目中使用的库:

  • OpenCV: 开源计算机视觉是一个主要针对实时计算机视觉的编程函数库。该库拥有超过 2500 种优化算法,包括一套全面的经典和最先进的计算机视觉和机器学习算法。
  • Numpy 的主要目标是大型、高效、多维数组表示。这个项目处理大量的图像,每个图像被表示为一个 numpy 数组。将图像表示为 NumPy 数组不仅计算和资源效率高,而且许多其他图像处理和机器学习库也使用 NumPy 数组表示。
  • Scikit-image:It是图像处理的算法集合。它包括分割、几何变换、色彩空间处理、分析、过滤、特征检测等算法。它旨在与 Python 数字和科学库 NumPy 和 SciPy 进行互操作。
  • Matplotlib: Matplotlib 是一个绘图库。当分析图像时,我们将利用 matplotlib,无论是绘制搜索系统的整体准确性还是简单地查看图像本身,matplotlib 都是您工具箱中的一个伟大工具。
  • Imutils: 这个包包含了一系列 OpenCV 和便利函数,执行基本任务,比如平移、旋转、调整大小和骨骼化。这是一个由Adrian rose Brock开源的精彩而高效的包。
  • ****美汤:是一个从 HTML 和 XML 文件中抽取数据的 Python 库。它与您喜欢的解析器一起工作,提供导航、搜索和修改解析树的惯用方式。BeautifulSoup 的优点是,它可以像解析简单的 XML 一样解析 HTML,并毫不费力地将所需的值(文本)返回给我们。

实施:

****注:本代码中有某些超参数,可根据个人需求进行微调。我对它们进行了调整,在速度和准确性之间找到了一个最佳平衡点。

# Hyper-Parameter for comparing histograms
correl_threshold = 0.9# Hyper-Parameters for SSIM comparision
similarity_index_threshold = 0.0
ssim_matches_limit = 100# Hyper-Parameters for SIFT comparison
sift_features_limit = 1000
lowe_ratio = 0.75
predictions_count = 4# Hyper-Parameters to display results
query_image_number = 2
amazon_reviews_count = 3

第一步:

  • 封面数据集可以从 这个 链接下载。该数据集包含来自亚马逊的 207,572 本书。但都是 2017 年之前发行的书。
  • 它包含一个 shell 脚本,将 csv 文件作为输入传递给 python 代码。csv 文件包含图书的 ISBN 号,python 代码将根据这些 ISBN 号逐一下载图书封面,并以 ISBN 号作为图像名称保存。
  • 亚马逊不允许使用这种脚本高速下载其数据。下载速度会很少,35kbps 左右。按照这种速度,下载所有的书的封面需要将近 2 天的时间。下载失败可能有几个原因,主要原因是亚马逊阻止了这样的脚本。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1: Download Complete

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 2: Download Failed

  • 这个问题的快速解决方法是将包含 ISBN 号的 csv 文件(book32-listing . csv)拆分成几个部分,然后在所有这些零碎的 CSV 文件上并行运行 shell 脚本。这样我们可以在几个小时内下载完整的图书封面图片。即使在这种方法中,很少下载会失败,但是我们可以简单地只重新运行该特定片段的 shell 脚本来重试下载。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 3: Parallel download of book covers

第二步:

  • 基于内容的图像检索(CBIR)是一种利用视觉属性(如颜色、纹理、形状)来搜索图像的技术。在大型图像数据库中,颜色属性被认为是图像搜索中最常用的低级特征。
  • 颜色直方图是一个简单的直方图,显示每个单独的 RGB 颜色通道的颜色级别。由于我们处理的是 RGB 色彩空间,这里的像素值将在 0–255 的范围内。如果您在不同的色彩空间中工作,像素范围可能会有所不同。
  • 绘制直方图时,X 轴充当我们的“箱”。如果我们构建一个有 256 个面元的直方图,那么我们可以有效地计算每个像素值出现的次数。然后,在 Y 轴上绘制被装箱到 X 轴值的像素数。在我们的程序中,我们使用的是 RGB 8-bin 颜色直方图。
  • 首先让我们导入必要的库。
import os
import cv2
import imutils 
import pickle
import numpy as np

注意: Pickle 是一个库,它可以用来序列化或反序列化一个 python 对象,比如一个列表到文本中,并保存到磁盘或从磁盘中检索。通常它们被保存为 pickle 文件。pkl”作为扩展名。

  • 接下来,我们将所有下载的书籍封面的路径列表放入一个名为“ train_paths”的 python 列表中。
train_paths = []train_path = "/Users/kartik/Desktop/Projects/Book_Covers_Data/amazon_book_cover_images"for root, dirs, files in os.walk(train_path):
     for file in files:
        train_paths.append((os.path.join(root, file)))
  • 现在,我们遍历书籍封面图像的所有路径,并使用 openCV 逐一读入图像。openCV 的问题在于,它无法读取太阳下的每一种图像格式,例如,它无法读取 gif 图像。即使它不能读取图像, openCV 也不会抛出错误,而是返回一个 NoneType 对象。所以我们需要在计算颜色直方图之前移除所有这样的非类型对象。
  • openCV 有很好的内置函数来计算颜色直方图,卡尔奇斯特。默认情况下, openCV 读取的是" BGR" 格式的图像,因此在将图像传递给 calcHist 函数之前,我们将图像的颜色方案从 BGR 转换为 RGB。****
  • 我们定义了另一个列表" hist_train" ,它将存储特定书籍封面图像的路径及其相应的颜色直方图。
**hist_train = []for path in train_paths:
    image = cv2.imread(path)

    if image is None:
        continueimage = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    # extract a RGB color histogram from the image,
    # using 8 bins per channel, normalize, and update
    # the index
    hist = cv2.calcHist([image], [0, 1, 2], None, [8, 8, 8],[0, 256, 0, 256, 0, 256])
    hist = cv2.normalize(hist, None)
    hist_train.append((path,hist))**
  • 在计算完所有图像的颜色直方图后,我们可以将这些数据作为 pickle 文件保存到磁盘上。
**# Saving the train data histograms to a pickle filewith open('train_hist_data.pkl', 'wb') as f:
    pickle.dump(hist_train, f)**
  • 我们可以在以后的任何时候简单地从磁盘加载颜色直方图数据,而不用再次计算所有的直方图。
**# Loading the train data histograms from pickle filewith open('train_hist_data.pkl', 'rb') as f:
    hist_train = pickle.load(f)**

****注:如果处理器性能相当好,计算所有 207K 图像的直方图将需要相当长的时间。我在一个 16GB 内存的 i7 处理器上花了大约 1 小时 20 分钟。

  • 图像的 RGB 颜色直方图可以使用 matplot 库可视化。对于下面的样本书籍封面,其颜色直方图可以如下获得:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**import matplotlib.pyplot as pltimg_path = "/Users/kartik/Desktop/Projects/S_Images/9781501171383.jpg"
img = cv2.imread(img_path)
color = ('b','g','r')
plt.figure(figsize=(15,10))for i,col in enumerate(color):
    histr = cv2.calcHist([img],[i],None,[256],[0,256])
    plt.plot(histr,color = col)
    plt.xlim([0,256])
plt.show()**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 5: RGB Colour Histogram

第三步:

  • 我从这些 207k 图像中创建了一组查询/测试图像,通过随机选取一组图像并对这些图像应用仿射变换并添加一些剪切。完成这些变换是为了紧密模仿从移动设备拍摄的实时图像。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 6: Images before and after applying Affine Transformation with Shear = 0.1

  • 类似于步骤 2 中的程序,我们读入所有查询书籍封面,并计算它们的 RGB 颜色直方图。**
**query_path = "/Users/kartik/Desktop/Projects/Book_Covers_Data/Test_Images"
query_paths = imlist(query_path)hist_query = []
for path in query_paths:
    image = cv2.imread(path)

    if image is None:
        continue

    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    # extract a RGB color histogram from the image,
    # using 8 bins per channel, normalize, and update the index
    hist = cv2.calcHist([image], [0, 1, 2], None, [8, 8, 8],[0, 256, 0, 256, 0, 256])
    hist = cv2.normalize(hist, None)
    hist_query.append((path,hist))**

第 4 步(一级匹配器):

  • 步骤 2 中,我们已经索引了整本书封面的所有颜色直方图。并且在步骤 3 中,我们已经计算了查询书籍封面的颜色直方图。现在,我们必须将这些查询书封面直方图与我们的训练数据库中的直方图进行比较,我们必须找出最接近的直方图。****
  • openCV 中内置了 函数 来比较直方图,但是有几个比较度量可以选择。相关、卡方、交集、巴特查亚距离、海灵格距离。

****注:比较指标也是一个超参数,可以根据正在处理的数据及其应用进行微调。

  • 对于本项目,使用来自 openCV相关性作为比较指标。使用相关性作为比较度量的 cv2 直方图比较函数的输出值将给出 0 到 1 范围内的值。越接近 1 的值是越相似的直方图。**
  • **在比较直方图之后,我已经按照返回的相关值的非递减顺序对结果进行了排序,并且仅将相关值高于"相关阈值"的匹配视为潜在匹配,并且丢弃了其他匹配。
  • **"相关性阈值"是一个超参数,可以根据个人需求进行微调。基于对该书封面数据的几次试验,较高的相关阈值消除了大多数非潜在匹配。但是,过高的值也会消除潜在的匹配,从而降低匹配器的准确性。
  • 由于我正在处理一个 207K 图像的数据集,所以我将“相关性阈值”的值设置为 0.9。如果数据集中的图像数量很少,比如大约 3k,那么作为相关阈值的值 0.5 将产生更好的结果。**
*hist_matches = []for i in range(len(hist_query)):
    matches = []
    for j in range(len(hist_train)):
        cmp = cv2.compareHist(hist_query[i][1], hist_train[j][1], cv2.HISTCMP_CORREL)
        if cmp > correl_threshold:
            matches.append((cmp,hist_train[j][0]))
    matches.sort(key=lambda x : x[0] , reverse = True)
    hist_matches.append((hist_query[i][0],matches))*
  • 基本上,这里我们将查询书籍封面的直方图与数据库中 207k 书籍封面的所有 207k 直方图进行比较。在这一步的最后,我们过滤掉大约 800 到 1000 个潜在的匹配。在该步骤结束时获得的潜在匹配的数量主要取决于相关阈值。这些过滤后的 1k 结果被传递到下一级。**

步骤 5(二级匹配器):

  • 比较图像的另一个重要的图像描述符是图像的纹理。在比较图像时,均方差(MSE)虽然易于实现,但并不能很好地表明感知的相似性。结构相似性旨在通过考虑纹理来解决这一缺点。SSIM 试图模拟图像结构信息的感知变化。
  • 比较两幅图像时,结构相似性指数(SSIM)返回的值介于-1 到 1 之间。指数越接近值 1,表示两幅图像非常相似。
  • 现在,我们将查询 book-cover 与上一步获得的 1k 左右的潜在匹配进行比较,并根据获得的相似性指数的非降序对结果进行排序。**
  • 相似性指数也是一个超参数,我已经将其设置为 0。我认为任何具有正值相似性指数的匹配都是潜在的匹配,我会将该匹配传递到下一级进行进一步匹配。**
*from skimage.measure import compare_ssim as ssimdef similarity_index(q_path,m_path):
    q_i = cv2.imread(q_path,0)
    q_i = cv2.resize(q_i,(8,8))
    m_i = cv2.imread(m_path,0)
    m_i = cv2.resize(m_i,(8,8))
    return ssim(q_i,m_i)ssim_matches = []for i in range(len(hist_matches)):
    query_image_path = hist_matches[i][0]
    matches = []
    for j in range(len(hist_matches[i][1])):
        match_image_path = hist_matches[i][1][j][1]
        si = similarity_index(query_image_path,match_image_path)
        if si > similarity_index_threshold:
            matches.append((si,match_image_path))
    matches.sort(key=lambda x : x[0] , reverse = True)
    ssim_matches.append((query_image_path,matches[:ssim_matches_limit]))*
  • 我还使用超级参数 ssim-matches-limit 来限制获得的匹配数。我将值设置为 100 作为限制,因此只将这一步中获得的前 100 个匹配传递到下一级匹配。

第六步(三级匹配器):

  • 匹配不同图像的特征是计算机视觉中的一个常见问题。当所有图像在性质上相似(相同的比例、方向等)时,简单的角点检测器可以工作。但是当你有不同尺度和旋转的图像时,你需要使用尺度不变特征变换(SIFT)。**
  • 我们想要与图像的“部分”相对应的特征,在比原始像素更整体的水平上。我们想要的功能是不敏感的图像分辨率,比例,旋转,照明变化(如灯的位置)的变化。SIFT 算法会做到这一点。
  • 在将图像传递给 openCVSIFT 函数时,它会返回关键点:我们所有感兴趣点的 x、y 和八度音程位置,以及方向。关键点具有比例不变性和旋转不变性。它还为每个关键点生成描述符,不使用原始亮度值,而是通过计算每个像素的梯度。**
  • 生成的 SIFT 关键点的数量也是一个超参数。它可以根据计算能力和可用的内存资源进行微调。我已经为生成的 SIFT 特征设置了 1000 个关键点的限制。**
*def gen_sift_features(image):
    sift = cv2.xfeatures2d.SIFT_create(sift_features_limit)
    # kp is the keypoints
    #
    # desc is the SIFT descriptors, they're 128-dimensional vectors
    # that we can use for our final features
    kp, desc = sift.detectAndCompute(image, None)
    return kp, desc*
  • 我们为在步骤-5(二级匹配器)之后获得的每个潜在匹配生成 SIFT 关键点&描述符,并将它们与查询图书封面的 SIFT 关键点&描述符进行比较。使用FLANN-Matcher完成关键点的比较。FLANN 是一个用于在高维空间中执行快速近似最近邻搜索的库。**
*# FLANN matcher
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50)   # or pass empty dictionary
flann = cv2.FlannBasedMatcher(index_params,search_params)*
  • " FLANN-Matcher" 将返回两幅图像的关键点之间的匹配数量。这里的“劳氏比”是另一个超参数,过滤掉 FLANN-Matcher 结果中的弱关键点匹配。理想比值在 0.75 左右。现在,我们按照关键点匹配计数的非递减顺序对潜在匹配进行排序。
*predictions = []
for i in range(len(ssim_matches)):
    matches_flann = []
    # Reading query image
    q_path = ssim_matches[i][0]
    q_img = cv2.imread(q_path)
    if q_img is None:
        continue
    q_img = cv2.cvtColor(q_img, cv2.COLOR_BGR2RGB)
    # Generating SIFT features for query image
    q_kp,q_des = gen_sift_features(q_img)
    if q_des is None:
        continue

    for j in range(len(ssim_matches[i][1])):
        matches_count = 0
        m_path = ssim_matches[i][1][j][1]
        m_img = cv2.imread(m_path)        
        if m_img is None:
            continue
        m_img = cv2.cvtColor(m_img, cv2.COLOR_BGR2RGB)
        # Generating SIFT features for predicted ssim images
        m_kp,m_des = gen_sift_features(m_img)
        if m_des is None:
            continue
        # Calculating number of feature matches using FLANN
        matches = flann.knnMatch(q_des,m_des,k=2)
        #ratio query as per Lowe's paper
        matches_count = 0
        for x,(m,n) in enumerate(matches):
            if m.distance < lowe_ratio*n.distance:
                matches_count += 1
        matches_flann.append((matches_count,m_path))
    matches_flann.sort(key=lambda x : x[0] , reverse = True)
    predictions.append((q_path,matches_flann[:predictions_count]))*

第七步:

  • 现在,我们从在步骤 6(3 级匹配器)中获得的预测中,为给定的查询图书封面挑选出前 4 个预测图书封面,并将它们与关键点匹配的计数一起绘制出来。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 7: Top-4 Predictions

第八步:

  • 我们选择最有可能与我们的查询书封面相同的顶部预测图像,并且我们可以绘制精确的 SIFT 关键点匹配。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 8: SIFT keypoint matches

第九步:

****注:以下刮刀仅用于教育目的。

  • 现在我们使用 python 抓取框架创建一个网络爬虫,比如 BeautifulSoup。我们创建了两个独立的 scrappers,一个用于 Goodreads,另一个用于 Amazon。这些刮削器将图书的 ISBN 号作为输入,并根据它刮削页面。

Goodreads Scrapper

*def book_details_goodreads(isbn):

    # Goodreads Scraping
    goodreads_base_url = "[https://www.goodreads.com/book/isbn/](https://www.goodreads.com/book/isbn/)"
    goodreads_url = goodreads_base_url + isbn
    req = Request(goodreads_url, headers={'User-Agent': 'Mozilla/5.0'})
    page = urlopen(req).read().decode("utf-8")
    soup = BeautifulSoup(page, 'html.parser')

    # Book Title
    book_name = soup.find(itemprop="name")
    book_name = str(book_name)
    book_name = remove_tags(book_name)
    book_name = book_name.strip()
    book_name_list = book_name.split(" ")

    # Author Names
    author_names = soup.find_all("span",itemprop="name")
    author_names = str(author_names)
    author_names = author_names.split(",")
    author_name = author_names[0]
    author_name = author_name.split(">")[1].split("<")[0]
    for i in range(len(author_names)):
        author_names[i] = author_names[i].split(">")[1].split("<")[0]

    author_names_text = ""
    for i in range(len(author_names)):
        author_names_text += str(author_names[i])
        author_names_text += ", "

    # Number of Ratings
    rating_count = soup.find(itemprop="ratingCount")
    rating_count = str(rating_count)
    rating_count = rating_count.split('"')[1]# Average Rating
    rating_val = soup.find(itemprop="ratingValue")
    rating_val = str(rating_val)
    rating_val = remove_tags(rating_val)

    # Number of pages in book
    pg_count = soup.find("meta",  property="books:page_count")
    pg_count = str(pg_count)
    pg_count = pg_count.split('"')[1]

    # Book Description
    desc = soup.find("div", id="description")
    if desc is not None:
        desc = desc.find_all("span",style="display:none")
        if desc is not None:
            desc = str(desc)
            desc = remove_tags(desc)
            description = desc.strip("[]")
            description = description.strip()
        else:
            description = "No description found"
    else:
        description = "No description found"# Printing book details from Goodreads
    printmd('**Book Details from Goodreads\n**')
    #print("Book Details from Goodreads\n")
    print("Book Title: ",book_name.splitlines()[0])
    #print("\n")
    print("Authors: ",author_names_text)
    #print("\n")
    print("Average Rating: ",rating_val)
    #print("\n")
    print("Number of ratings: ",rating_count)
    #print("\n")
    print("Number of pages in book: ",pg_count)
    print("\n")
    print("Book Description:")
    print("\n")
    print(description)*

亚马逊废品店

*def book_details_amazon(isbn):

    # Amazon Scraping
    amazon_base_url = "[https://www.amazon.com/dp/](https://www.amazon.com/dp/)"
    amazon_url = amazon_base_url + isbn
    req = Request(amazon_url, headers={'User-Agent': 'Mozilla/5.0'})
    page = urlopen(req).read().decode("utf-8")
    soup = BeautifulSoup(page, 'html.parser')

    # Book title
    a_title = soup.find_all("span",id="productTitle")
    a_title = str(a_title)
    a_title = remove_tags(a_title)
    a_title = a_title.strip("[]")
    a_title = a_title.strip()

    # Book details
    book_info = []
    for li in soup.select('table#productDetailsTable div.content ul li'):
        try:
            title = li.b
            key = title.text.strip().rstrip(':')
            value = title.next_sibling.strip()
            value = value.strip("()")
            book_info.append((key,value))
        except AttributeError:
            break

    # Amazon reviews scraping
    amazon_review_base_url = "[https://www.amazon.com/product-reviews/](https://www.amazon.com/product-reviews/)"
    amazon_review_url = amazon_review_base_url + isbn + "/ref=cm_cr_getr_d_paging_btm_2?pageNumber="
    req = Request(amazon_review_url, headers={'User-Agent': 'Mozilla/5.0'})
    page = urlopen(req).read().decode("utf-8")
    soup = BeautifulSoup(page, 'html.parser')

    # List of book reviews in Amazon
    reviews_list = []
    reviews_list_final = []
    for pg in range(1,5):
        amazon_review_url = amazon_review_base_url + isbn + "/ref=cm_cr_getr_d_paging_btm_2?pageNumber=" + str(pg)
        req = Request(amazon_review_url, headers={'User-Agent': 'Mozilla/5.0'})
        page = urlopen(req).read().decode("utf-8")
        soup = BeautifulSoup(page, 'html.parser')txt = soup.find("div", id="cm_cr-review_list")
        try:
            for rawreview in txt.find_all('span', {'class' : 'a-size-base review-text'}):
                text = rawreview.parent.parent.parent.text
                startindex = text.index('5 stars') + 7
                endindex = text.index('Was this review helpful to you?')
                text = text[startindex:endindex]
                text = text.split("Verified Purchase")[1]
                rText = text.split(".")[:-1]
                review_text = ""
                for i in range(len(rText)):
                    review_text += rText[i]
                    review_text += "."
                if review_text is not "":
                    if "|" not in review_text:
                        reviews_list.append(review_text)
                    else:
                        rText = text.split(".")[:-2]
                        review_text = ""
                        for x in range(len(rText)):
                            review_text += rText[x]
                            review_text += "."
                        reviews_list.append(review_text)
        except AttributeError:
            review_text = "No reviews found."

    if amazon_reviews_count < len(reviews_list):
        reviews_list_final = reviews_list[:amazon_reviews_count]
    else:
        reviews_list_final = reviews_list

    # Printing book details from Amazon
    printmd('**Book Details from Amazon\n**')
    #print("Book Details from Amazon\n")
    print("Book Title: ",a_title)
    #print("\n")
    for i in range(len(book_info)):
        print(f"{book_info[i][0]} : {book_info[i][1]}")
        #print("\n")
    print("\n")
    if len(reviews_list_final) == 0:
        print(review_text)
        print("\n")
    else:
        print(f"Displaying top {amazon_reviews_count} book reviews:\n")
        for i in range(len(reviews_list_final)):
            review_txt_list = reviews_list_final[i].split(".")[:3]
            review_txt = ""
            for j in range(len(review_txt_list)):
                review_txt += review_txt_list[j]
                review_txt += "."
            review_txt += ".."
            print(review_txt)
            print("\n")*

第十步:

  • 我们将在第 7 步结束时获得的最佳匹配的 ISBN 号作为输入传递给上面的 Goodreads 和 Amazon scrappers,并显示获得的信息。**
*isbn = predictions[query_image_number][1][0][1].split("/")[-1].split(".")[0]book_details_goodreads(isbn)*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

*book_details_amazon(isbn)*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论:

结果:

  • 基于对超参数的微调,该系统给出了大约 90%的准确率,并且检索单个查询书籍封面的结果所花费的平均时间大约为 20 秒。这里总是在速度和准确性之间进行权衡。当我们试图减少周转时间时,精度也会降低。

进一步改进:

  • 在建立所有书籍封面的颜色直方图储存库时,可以添加诸如 K-Means 的聚类算法。
  • 我们可以用 CNN 代替 SIFT 从图像中提取特征。
  • 图像库可以在爬虫的帮助下更新,从亚马逊和 Goodreads 抓取最新的书籍封面。
  • 相同的项目可以扩展到移动应用程序,但是复杂的计算在服务器端完成。

希望你喜欢这个教程。感谢阅读…!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值