TowardsDataScience-博客中文翻译-2019-七十四-
TowardsDataScience 博客中文翻译 2019(七十四)
原文:TowardsDataScience Blog
协议:CC BY-NC-SA 4.0
为什么你会后悔没有雇佣本科生
原文:https://towardsdatascience.com/why-you-will-regret-not-hiring-undergraduates-767a271c27fe?source=collection_archive---------19-----------------------
Photo by Good Free Photos on Unsplash
您即将从本科毕业,对获得数据科学家的第一份工作感到兴奋,并开始寻求申请。你在 Indeed 和 LinkedIn 上寻找工作,很快就变得很困惑——几乎所有的工作要么要求有工作经验,要么要求有高等学位。你两样都没有。那么——你是做什么的?嗯,您有几个选择,其中一些我在以前的文章中讨论过:
[## 在数据科学家的海洋中脱颖而出
进入数据科学领域的建议
towardsdatascience.com](/standing-out-in-a-sea-of-data-scientists-c82e42a1e62b)
但是,在这篇文章中,我想从一个不同的角度来解决这个问题。招聘公司的观点。创建该职务公告的公司。我想让这些公司相信,他们肯定会后悔没有招聘没有经验的应届毕业生作为数据科学家。
他们准备好了
数据科学和人工智能需求的兴起为本科生创造了大量学习技能的机会,这些技能以前只在硕士或博士项目中教授。例如,麻省理工学院刚刚宣布一项 10 亿美元的计划,创建一所新学院,“将人工智能、机器学习和数据科学与其他学科结合起来。”许多学校现在为本科生开设了数据科学专业。虽然像任何专业一样,这些项目的质量可能会有所不同,但这确实意味着的本科生比以往任何时候都更愿意为数据科学团队做出贡献。
他们饿了
大学生通常带着充沛的精力和干劲进入就业市场。他们刚刚完成了 4 年的学习,很高兴能够应用他们的知识并产生影响。最好的人也有学习和成长的强烈愿望。驱动力和成长相结合可以给团队增加大量能量。此外,在适当的指导和指引下,你的无经验本科生将会迅速提高自己的能力,成为你团队的重要贡献者。
它们很有影响力
我认为,公司聘用没有经验的本科生的一个担忧是,他或她将难以为公司增加价值。根据我的经验,这与事实相去甚远。数据科学团队中有许多项目既不需要以前的经验,也不需要研究生学位来增加价值。例如,也许你一直忽略了用新数据重新训练你的人工智能模型。让您的新员工在代码上放松,以理解模型,运行它,根据更新的数据重新训练它,并进行一些错误分析,以发现其他潜在的改进机会。这不仅会改进你的模型,还会帮助你的新科学家成长,因为他或她与团队中更有经验的成员一起帮助改进他们的模型。这也给了更多资深科学家领导和指导他人的机会——从本质上扩大他们的知识和影响。
它们是可扩展的
这是一个更实际的观点,但市场上的应届本科生比博士或有 10 年经验的人多得多。由于许多公司在雇用本科生方面做得不太好,这也使得吸引优秀人才变得更容易。这对成长中的数据科学团队来说是一个完美的组合。雇佣几个关键的高管,然后通过雇佣聪明、渴望、有动力的应届毕业生来帮助他们扩大规模。通过正确的指导和流程,这些没有经验的新员工将很快为你的公司增加大量价值。
Photo by Tomasz Frankowski on Unsplash
不后悔
现在——下次你为下一个数据科学职位写招聘启事时,问问你自己,一个刚毕业的大学生是否是最合适的人选。如果是这样,请适当地修改帖子。我发现本科生很容易被“需要”丰富经验、培训或学校教育的职位吓跑。相信我,你不会后悔发现如何有效地将新生融入你的数据科学团队。
这篇文章也可以在这里找到。
为什么你的人工智能可能是种族主义者,该怎么办
原文:https://towardsdatascience.com/why-your-ai-might-be-racist-and-what-to-do-about-it-c081288f600a?source=collection_archive---------13-----------------------
Individually reasonable correlations can cause an AI to gain a racial bias
即使是设计良好的人工智能系统也可能最终出现偏差。
这种偏见会导致人工智能表现出种族主义、性别歧视或其他类型的歧视。完全出于偶然。
这通常被认为是一个政治问题,并被科学家忽视。结果就是只有非技术人员写这个话题。
这些人经常提出政策建议,以增加人工智能研究人员的多样性。
具有讽刺意味的是令人震惊的:一个黑人人工智能研究人员不会建立一个与白人人工智能研究人员有任何不同的人工智能。这使得这些政策建议本身带有种族主义色彩。出于其他原因,增加人工智能研究人员多样性仍然是有意义的,但它肯定不会有助于使人工智能系统不那么种族主义。
人类中的种族主义是一个社会问题,但人工智能中的种族主义是一个工程问题。
人工智能中的种族主义需要像任何其他类型的工程问题一样得到解决。政治化很可能适得其反,弊大于利。
那么,一个人工智能怎么会是种族主义者呢?
好消息是:
人工智能没有自己的政治议程。只有当它被训练成种族主义者时,它才是故意的种族主义者。
坏消息是:
一不小心把一个 AI 训练成种族主义者是非常容易的。
在这篇文章中,我将解释种族偏见是如何出现在人工智能中的。我还将讨论一些在技术层面上处理这个问题的方法。
(顺便说一句:同样的论点也适用于对女性的偏见或其他类型的歧视。)
1.偏置数据
通过对有偏差的数据进行训练,有可能使人工智能有偏差。除非你非常小心,否则这很容易意外发生。
以这篇文章为例,关于一个在公共数据上训练的人工智能。人工智能最终带有种族偏见,因为它的训练数据是基于互联网:【https://www.theregister.co.uk/2019/09/05/ai_racist_sexist/
众所周知,互联网不是最好的地方。经过训练的人工智能会接受它的先入之见,结果变得很可怕。训练人工智能的一般原则是:垃圾进,垃圾出。
也有可能使用合理的数据而没有任何种族偏见,但最终仍然得到一个有偏见的人工智能:
数据集必须具有来自每个种族群体的代表性数据量。这是因为人工智能在学习种族方面投入的努力量与它在数据集中的频率成正比。人脸识别人工智能往往比任何其他种族更适合白人。偏斜的训练数据集是造成这种情况的部分原因。
如果你认真的话,修复这个问题并不太难。通常,您可以更加努力地选择您的数据集,因此它包含更少的偏见,并且具有更具代表性的种族分布。
如果做不到这一点,至少可以用关于数据来源的指示变量来注释数据。通过这种方式,你可以教会人工智能显式地对训练数据中的偏差进行建模。之后,挑选最种族主义的数据来源。告诉人工智能忘掉任何与其他数据不同的东西。这就像指着最种族主义的人,命令人工智能不要模仿他们。这不是一个完美的解决方案,但总比没有强。
请注意,即使培训过程是公正的,也可能出现问题。有可能某个特定的人工智能算法只是客观上在某些任务上不如其他算法。
举个例子:自动驾驶汽车在夜间探测黑人比白人更困难,因为他们的皮肤在黑暗中更难被看到。这不是种族歧视,只是不幸。不过,这显然还是个问题。为了解决这个问题,你需要确保你付出了适当的努力来教会人工智能如何解决这些更困难的任务。
2.相关性不等于因果关系
一旦训练数据是公平公正的,我们仍然要处理 AI 本身的一个问题。如果你在这里使用神经网络,或者其他东西,这并不重要。事实上,所有流行的人工智能形式都存在这个问题:
我们的核心问题是,人工智能不知道它的任何输入在现实中意味着什么。
人工智能只是获得数字作为输入,而不理解它们在现实世界中的含义。它必须自己学习因果关系,但它只能猜测,而且往往会被证明是错误的。
例如,假设我们正在训练一个人工智能来接受或拒绝工作申请。这个城市的一个街区是犯罪猖獗的贫民区。该地区所有以前的申请者都是坏人。人工智能“知道”来自这个地区意味着你是一个糟糕的申请人。现在,人工智能收到了一份新的申请:一位年轻的黑人女性,她获得了诺贝尔奖。那个女人真的运气不好:人工智能不知道什么是“诺贝尔奖”,因为它以前从未在申请中遇到过。它只是注意到她来自同一个社区,在她之前的每个人都很糟糕。所以人工智能立即拒绝了这个申请。
更糟的是:
许多机器学习算法是无法解释的。这意味着不可能让人工智能解释其决策背后的原因。
有些算法是可以解释的,比如决策树。你可能会认为在可解释的算法中检测种族主义很容易。这只是部分正确。
在一个可解释的算法中,你可以直接检查“种族”是否被用来做决定。然而,这并不能让你注意到间接的相关性。也许人工智能“知道”在某个特定的街区长大会成为一个糟糕的候选人。恰好以黑人为主的街区。发现这种相关性并解释它们需要付出努力。
因此,为了防止种族偏见,我们必须找到一种方法来检测虚假的相关性。但是我们不能直接检查种族对数据的影响。这还不够,因为我们不能排除仍然导致种族偏见的间接相关性。
更糟糕的是:我们有时确实得到了种族和其他属性之间的真实关联。举个例子,我们正在建立一个医疗诊断系统。我们确实希望人工智能了解到一些疾病在不同种族中出现的频率更高。如果我们盲目地消除医学诊断系统中的所有种族相关性,我们可能会害死很多人。
那么我们能做些什么来解决这个问题呢?
我不能给一个明确的答案,因为这是一个极其复杂的问题,有很多特殊情况。以下方法可以作为基线,但绝不是完美的:
首先,确保你明确地使用种族作为你的人工智能的输入。这与你通常在政治正确性讲座中听到的相反。与人类不同,人工智能没有隐含的偏见,也不会采纳其创造者的任何偏见。这意味着,将种族作为一个特征加入进来,可以更容易地检验偶然的相关性,而且没有负面影响。
创建一个生成性对抗网络(GAN)。训练 GAN 制造假的训练数据。
这照顾到了数据中任何偶然的相关性:GAN 创建的假货将以人工智能无法区分的方式创建。这并不能保证人工智能不会学习虚假的相关性。那项任务是不可能的。然而,这将保证人工智能在后期阶段无法绕过自己的反种族主义机制。
现在到了棘手的部分:挑选一些你认为不应该影响预测的训练数据的特征。对于训练数据中的任何人,你现在可以要求 GAN 生成一个不同种族的“等同”人。在生成这些假人物时,您必须只改变所选的安全特征。这确保了假的人是真实的,但没有奇怪的特征,会摆脱预测。
现在,您可以创建假数据来减少数据集中的偏差。因为这些赝品只是在与任务无关的特征上有所不同,所以这不会有任何负面影响。
请注意,这只有在您对可能被更改的特性做出了正确选择的情况下才有效。
也有可能 GAN 将不能仅使用不相关的特征来创建任何好的赝品。如果发生这种情况,你可能在数据中有很多真正的种族关联。
一旦完成 GAN 的训练,实际的预测部分就开始了:
在现有 GAN 的鉴别器网络之上,构建您的主 AI 系统,即应该做出预测的系统。这确保了预测器网络将只使用我们知道不能包含种族偏见的派生要素。
现在用你所有的数据训练新系统。
在培训期间,你可以明确测试种族歧视。对于任何给定的人,你可以创建另一个种族的等效人,并测试该人的预测是否不同。通过对每个这样的案例给出负面反馈,你可以直接惩罚 AI 中的种族主义。
你现在有了一个训练有素的神经网络,它可以做你想让它做的任何事情,而且不太可能有种族偏见。
放弃
你不应该只是盲目地按照我刚才描述的方式来实现它。根据你的使用情况,可能会有很多副作用。它增加了许多复杂性和多重交互,这可能会在许多方面适得其反。这实际上只是对种族主义人工智能问题在理论上如何解决的一个概括描述。它还没有准备好实施。
如果有人有更好的方法,我欢迎在评论中听到。
还要注意,这给模型训练增加了很多开销。它可能会降低人工智能的性能,这是一个副作用。
如果人工智能也更笨,犯更多的错误,那么拥有一个更少种族歧视的人工智能值得吗?如果那个人工智能做出生死抉择呢?在这里,你如何量化什么是值得的权衡呢?这是一个政治问题,我不会用十英尺长的杆子去碰它。
您从这篇文章中应该得到的主要收获是:
- AI 很容易一不小心就种族歧视了。
2.防止这种情况非常困难。
3.这主要是一个工程问题,而不是社会问题。
为什么贵公司需要可重复的研究
原文:https://towardsdatascience.com/why-your-company-needs-reproducible-research-d4a08f978d39?source=collection_archive---------28-----------------------
Photo by José Alejandro Cuffia on Unsplash
今天的科学——尤其是社会科学——有点混乱。许多最重要的实验和发现是不可重复的。这种“可复制性危机”不仅对学术研究和开发的未来有着重大影响,对任何希望通过投资创新、实验和数据分析获得更高回报的企业也是如此。企业需要从科学的错误中吸取教训。
作为 Arnold Ventures 的研究副总裁,我对这场持续的危机非常了解,因为我为这些“第二次审视”的努力提供了大量资金。以下是我们资助和发现的一个令人不快的例子:
- 2015 年,《科学》发表了有史以来规模最大的复制项目的结果:心理学中的再现性项目,全球数百名研究人员试图复制顶级期刊上的 100 个心理学实验。只有大约 40%的发现可以被成功地复制,而其余的要么是不确定的,要么肯定不能被复制。
- 2018 年 8 月,社会科学复制项目复制了2010 年至 2015 年发表在《科学》或《自然》杂志上的全部 21 个社会科学实验。21 个实验中只有 13 个可以重复。即便如此,重复实验显示“效应大小”——宣布的发现的大小——通常只有最初宣称的一半左右
除了这些众所周知的复制项目,研究人员还在关于经济学、金融、营销、管理学、组织科学和国际商业的研究文献中记录了可复制性问题。事实上,在分析了 2000 多项商业实验后,Ron Berman 和他的同事们估计42%的显著影响实际上是误报。
正如斯坦福大学的约翰·约安尼迪斯告诉《华盛顿邮报》的那样,“我原本期望这些结果在[顶级]期刊上更具可重复性。”全世界的科学机构都认真对待这些发现,并采取行动。例如,国会正式要求国家科学院就如何解决科学中的再现性问题编写一份主要的国家报告。
从阿里巴巴到谷歌,从脸书到网飞,从微软到亚马逊,数字创新者已经积极接受大规模快速实验,将其作为创新努力的一部分。但是每一个从实验中寻求真实洞察力的组织都需要警惕那些使科学研究变得不可靠的问题。
基于文献,基于“可重复研究”的努力,以及与深入了解这些问题的科学家的持续互动,我为商业实验者建议四个关键的“最佳实践”。
- 激励很重要:不要过分强调积极的结果
不要把拇指放在天平上,期望从你的部门或团队那里得到“积极的”结果,他们通过做实验把他们的工作置于危险之中。实验是为了测试和学习,而不是验证某人已经决定要做的事情。
展示结果的压力在整个研究过程中产生了偏见,导致了我们在学术界看到的重现性问题。但是正如吉姆·曼兹和其他人指出的那样,大多数想法并不那么有效。这就是一开始做实验的全部原因(如果我们已经知道所有可行的东西,为什么还要费神去做实验呢?)
当然,当一项实验显示某种东西“有效”时,兴奋是人之常情——无论是治疗白血病的药物还是增加收益或收入的营销创新。但这意味着人们可能会被诱惑(甚至是无意识地)通过任何必要的手段找到这样的结果。如果一家企业要做实验或任何其他类型的数据分析,最好掌握全部真相,而不是让过程有所偏差。
因此,我建议不要刻意要求实验和数据分析来遵循最佳实践,并表明你更关心质量保证,而不是寻找“令人兴奋”的结果。
2。激励很重要:价值复制
即使当一个令人兴奋的结果出现时——比如说,一个提高提升率或注册率的广告实验——这个也不应该意味着立即扩大规模。即使实验做得极其严谨,假阳性还是会存在。因此,与其从对几个客户的研究到在全公司范围内实施该发现,不如在分析师进行一个或多个复制实验的同时,更缓慢地逐步实施该发现。事实上,你可以考虑像罗尼·科哈维在微软做的那样:即使你向客户或网站访问者推出了一项新的实践,也要在持续的基础上随机保留 5%或 10%作为控制组。然后,如果新的实践停止工作,你会知道。
学术界的一个主要问题是,小心翼翼的复制很少得到回报,尽管这通常是必要的。但在任何一家公司,没人需要担心说服整个领域关注复制。你只需要为自己接受好的实践。
3。这个世界很复杂
不可复制性的一个隐藏的、经常没有记录的原因是现实极其复杂这一不可回避的事实。在细胞生物学的一个著名案例中,哈佛和伯克利的科学家们在一个看似简单的乳腺癌细胞实验中得不到一致的结果。用他们的话说,“一组本该几个月完成的数据,花了 2 年时间去理解和整理。”两年后,他们终于意识到,在实验的某一点上,两个实验室一直在以不同的速度搅拌组织。仅此一点就足以让实验以不同的方式进行。
商业实验也是如此。关于商业本身、经济、政治和文化条件以及用户的个人特征的无数因素可以从根本上影响实验结果,即使是优秀的设计。
更糟糕的是,一些商业实验有数百万个实验对象,这意味着他们可以发现即使是最微不足道的影响也是显著的。想想著名的关于情绪传染的脸书实验,在这个实验中,人们被展示了不同数量的来自他们朋友的“正面”或“负面”帖子,然后研究人员测量了人们自己的帖子后来是使用了更多的“正面”还是“负面”词汇。发现的影响小到百分之四。以此类推,这就像发现克利夫兰骑士队的平均身高只比金州勇士队高千分之三英寸。这种微小的影响不仅在现实世界中意义不大,而且在下一次测量中,如果一个人站得稍微高一点,或者稍微低一点,这种影响就会消失。
同样,对数百万谷歌或亚马逊用户进行的“大数据”实验可能会发现生活水平的微小变化。但是如此小的影响几乎可以被任何东西改变,包括公司在日常业务过程中可能做出的成千上万看似微小的变化。
这就是期望定期复制更加重要的原因(第 2 课)。即使一个实验在第一次、第二次、甚至第三次尝试中成功了,那些最初的实验也可能会“过期”,可以这么说,如果仅仅是因为时间的流逝和用户的成分或口味的变化。假设一个显示收入增长 1%的实验可以外推至整个业务部门并一直保持 1%的增长,这在统计上和经济上都是不明智的。
4。让员工跟上研究实践
研究中的基准方法最佳实践。科学中的再现性问题部分归结于教育、培训和对良好统计实践的熟悉。确保你的团队中至少有一个人是职员,或者有一个固定顾问,他了解最新的研究最佳实践。
科学中的再现性危机带来了许多重要的教训,比如如何组织实验,如何进行数据分析等等。注意这些教训,商业实验可以通过展示什么真正有效以及对谁有效来提供竞争优势。
为什么您的数据项目会(可能)失败
原文:https://towardsdatascience.com/why-your-data-projects-will-probably-fail-3dfa6f73761c?source=collection_archive---------25-----------------------
您被要求为您的组织构建一个新的数据平台。很刺激,对吧?除了,你更有可能失败而不是成功。
Gartner 估计 60%的数据项目失败,一些分析师认为这是一个保守的估计。
以下是我认为导致数据项目失败的一些原因。
数据中没有价值
数据已成为最重要的商业资产之一,但大多数组织并不重视数据。数据通常被视为功能的一个分支,很少考虑如何使用它来推动组织的价值。
“数据是新的石油”已经成为描述数据价值的常用短语。原油是未经提炼的,虽然它有一些内在价值,但在实现其真正价值之前,它需要进一步加工。太多的组织满足于收集原始数据,很少考虑将其提炼为有用的产品。
没有组织范围的数据策略
康威定律,通常应用于软件开发,陈述如下:
设计系统的组织……被限制生产这些组织的通信结构的复制品。
这条定律成立,并且在数据空间中可能更准确。组织的每个领域都将数据存储在只适用于其用例的结构和位置中,很少考虑如何被组织的其他领域共享或利用。
如果没有一个集中的功能来定义一个组织范围的解决方案,很可能会出现数据孤岛,数据存储在单独的数据存储中。即使在更好的场景中,数据被存储在一个集中的位置,数据结构也不是以开放的心态处理的。这导致不太明显,但同样有问题的筒仓。
技术主导的解决方案
不成熟的组织通常将数据视为可以通过技术解决的技术问题,通常认为数据是由技术系统产生并存储在技术解决方案中的。
这导致数据解决方案由独立于组织其他部分的技术团队开发。数据解决方案的架构通常由软件架构师和开发人员执行,他们对数据的细微差别知之甚少。
很自然,这导致了次优解决方案,要么导致平台的交付不适用于大多数最终用户,要么导致漫长而曲折的交付过程,导致大量的重新设计和重新工作。
不清楚
组织及其领导者正被数据驱动的决策所带来的提高绩效的承诺所诱惑。这导致来自高层的声明,例如:
数据是我们的第一要务。
我们组织的每个领域都必须在决策中利用数据。
如果不获取数据,任何新产品或新系统都无法交付。
虽然这些听起来像是有用的法令,但它们可能会产生意想不到的后果。通常,它会在组织中灌输一种“数据狂潮”的感觉,导致定义不清的需求和数据捕获,而没有考虑如何使用和将如何使用数据。
数据狂潮也可以表现为一次做所有事情的需求,因为需要被视为“在做数据”。这导致所做的决定很少关注这将如何使组织受益,而更多的是打勾,以确保你不会被指责没有做正确的事情。
忽视技能差距
组织通常已经有了历史悠久的数据存储库。数据仓库已经存在很长时间了,它们经常被用来进行分析。
然而,用于交付这些工具和分析其中保存的数据的技能与构建现代数据平台并从其中保存的数据中提供深刻而有意义的见解是不同的。
大多数组织未能理解,向现代数据平台的过渡将需要现有劳动力的大规模技能转移,并努力规划弥合差距。
近年来,对高技能数据人才的需求激增,大多数组织不愿意投资招聘这些人,而是满足于利用现有员工。这是一种虚假的经济。假设你有一个很棒的数据平台,如果没有优秀的人一起工作,你将无法从中获得真正的价值。
结论
数据项目最常因人的问题而失败。技术问题通常可以相当容易地解决,但是人是一个非常困难和微妙的问题。
重要的是要认识到,你的数据项目要取得成功,必须是一个整体的方法,包括来自你的组织的所有领域的人以开放、协作的心态工作。
没有这一点,您的数据项目将(很可能)失败。
为什么你的机器学习模型可能正在融化冰山。
原文:https://towardsdatascience.com/why-your-machine-learning-model-may-be-melting-icebergs-75985dc749d3?source=collection_archive---------29-----------------------
像你们中的许多人一样,我自学了机器学习,我还记得我第一次在模型训练中离开笔记本电脑的那一天,风扇嗡嗡作响,几个小时后回来时发现它仍然嗡嗡作响。“嗯”,我想,“也许我需要一个 GPU”。各位 DIY 思想家:试图拆开一台旧的 Xbox 不是一个好主意,但是你可以自己组装一台。在更久以前的日子里,我家的能源使用有时会在玩视频游戏和开空调之间做出选择:下雨的夏日午后,Xbox 风扇和额外的外部 Xbox 风扇都在与视频游戏和其他电子武器争夺声音优势。那是关于能源效率的讨论引发气候变化辩论之前的日子。现在我们有“绿色 AI”和“红色 AI”。
人工/增强智能(AI)中所有新计算能力的碳足迹是多少?什么是「绿色 AI」对「红色 AI」?对于那些需要快速查看的人来说,“绿色人工智能”是经过优化的人工智能,可以最大限度地减少资源利用和环境影响,无论是通过数据中心资源优化,平衡训练数据要求与准确性,选择资源密集度较低的模型,还是在某些情况下转移学习与新模型。另一方面,红色人工智能:胡安·德·迪奥斯·桑托斯上个月在他的文章中做了很好的工作,提供了更详细的评论。
在马萨诸塞大学的一项研究中,研究人员使用二氧化碳磅数作为“红色 AI”水平的相对测量值。他们估计从纽约到旧金山的一次往返飞行的载荷为 1984 磅。记住这个数字,你可以在高速沙丁鱼罐头中享受近 40 次海岸到海岸的飞行,以匹配 NLP 训练、调整和实验管道的二氧化碳当量(78,468 磅)。
如果你想为语言翻译开发一个完整的“Transformer”模型,并平衡该模型的碳足迹,那么你和你的四个朋友可以步行或骑自行车,并选择十年内不开车(普通客车每行驶一英里排放 0.78 磅二氧化碳)。你可以像我们在荷兰的朋友在这个视频中一样享受在户外的旅行(视频时长 4 分钟,配有适合办公室的音乐)。
我们怎样才能最大限度地减少这种“红色艾”能源对环境的影响?已经尝试使用深度强化学习来解决冷却成本,如本研究中所述,该研究将冷却成本降低了约 11%(超过手动配置的算法)。像碳继电器这样的公司正在将最大化数据中心的能源效率作为他们使命的一部分。
其他人已经提议将模型效率和成本与模型的准确性一起发布,以提供对机器学习解决方案的整体价值和成本的更平衡的分析。当涉及到医学诊断时,每项医学测试的真实成本最终会转嫁到病人身上。
随着世界各地的公司在人工智能和宣传自己对环境更加敏感方面取得进展,他们是否会根据云提供商的“绿色能源”选择做出这些选择将是一件有趣的事情:
随着越来越多的人工任务被人工智能自动化和优化,能源平衡正在发生变化,并为节省成本和最大限度地减少环境影响创造了机会。或者也许当我们“重启人工智能”时,这一切都将改变,正如我正在阅读的这本新书所建议的那样…
图片由 詹姆斯·杜塞特
从预测到决策
原文:https://towardsdatascience.com/why-your-predictions-might-be-falling-short-opinion-9b1fada35137?source=collection_archive---------13-----------------------
为什么你的预测可能会失败——观点
Photo by Mika Baumeister on Unsplash
“做预测和做决定之间有很多差距”苏珊·艾希[1]
相关性并不意味着因果关系
这是统计测试中重复次数最多的短语之一。我认为这样做是有原因的,那就是这两个概念的抽象层次。这是混乱和复杂的,我们需要提醒自己在解释结果时的区别。然而,这种区别似乎在机器学习、大数据分析或数据科学领域并不明显,这可能并不太令人惊讶。对该领域的明显强调是通过更多数据和微调现有模型来提高预测准确性。根据我对在线课程和教程的经验,在之后的步骤上投入的工作似乎更少,预测的准确性达到了预期的水平。
在为我的应用程序研究相关文献时,我可以看到一些错误,从术语预测、关联、原因和解释之间相对无害的混淆,到一个虚假的声明,即一个变量(或一组特征或协变量)正在解释一个模型的行为,而不仅仅是表明它们之间的关联。这在图像识别、自然语言处理、情感分析等方面都不是问题。在这种情况下,从业者关心的是特性之间的映射。当同样的技术和哲学应用于决策或政策制定领域时,问题就来了。
为什么这是个问题
绘制相关性并不意味着我们理解了手头的问题。为了说明这一点,我们可以看一个简化的例子:假设有酒店价格和入住率的历史数据。酒店价格由软件设定,该软件根据入住率提高价格(入住率越高,价格越高)。现成的 ML 算法将识别价格和入住率之间的正相关关系。如果你想预测任何给定价格下的入住率,这是正确的方法。然而,如果你想知道价格上涨对入住率的影响,我们的预测模型可能会说价格上涨会卖出更多的房间。这是非常不可能的情况,需要一套不同的统计技术来回答这样的问题[1]。
我们能做什么
理解这种局限性并将其传达给决策者将会让我们走很长的路。确定并使用适当的方法来解决这个问题是我们想要的途径。人们一直有兴趣结合计量经济学和机器学习的经验来扩展我们对预测和因果推理的理解[2]。和往常一样,我们能做的最好的事情就是不断学习和了解相关领域的发展。这里是一个很好的起点。
[1] Athey,s .,超越预测:利用大数据解决政策问题,(2017),《科学》第 355 卷,第 6324 期,第 483-485 页
[2]艾希,s .,,,机器学习对经济学的影响,(2017),即将出版的 NBER 著作中的章节《人工智能的经济学:一个议程,阿贾伊·k·阿格拉瓦尔,约书亚·甘斯和阿维·戈德法布
[3] Imbens,g .,& Rubin,d .,统计、社会和生物医学科学的因果推理:导论,(2015),剑桥大学出版社
为什么你还不是一个可以胜任工作的数据科学家
原文:https://towardsdatascience.com/why-youre-not-a-job-ready-data-scientist-yet-1a0d73f15012?source=collection_archive---------0-----------------------
如果说我从我工作的数据科学导师初创公司学到了什么,那就是:从你的数据科学工作申请或面试中获得反馈几乎是不可能的。
公司对反馈持谨慎态度是有充分理由的。首先,公司给被拒申请者的每一条反馈都是潜在的诉讼。另外,事实上许多人对负面反馈反应不好,有些人变得非常好斗。
想象一下,招聘人员给你发一封深思熟虑的反馈邮件需要多长时间,还要给他们必须考虑的几十(或几百)名其他应聘者发邮件。事实是,在一天结束时,他们从发布任何类型的反馈中绝对得不到任何东西,不管它可能多么有帮助或明显。
所有这一切的悲剧结局是大量困惑、没有方向、有抱负的数据科学家。但这里有一些好消息:实际上,申请人被数据科学职位拒绝的原因并不多,而且你可以做很多事情来覆盖这些基础。
这些原因——大多数求职者不具备但公司最想要的技术和非技术技能——就是这篇文章的主旨。
原因 1: Python 对于数据科学的技能
绝大多数的数据科学角色都是基于 Python 的,所以这就是我在这里要关注的。当谈到用于 DS 的 Python 时,有几个工具可以区分新手和专业人士。如果你想打造能引起雇主注意的优秀项目,它们是很好的差异化因素。
为了迫使自己提高数据科学理论和实现水平,请在一些项目中使用这些方法,如果您还没有这样做的话:
- 数据探索。你的舌尖上应该有
.corr()
、scatter_matrix()
、.hist()
、.bar()
等pandas
功能。你应该总是寻找机会使用 PCA 或 t-SNE,使用sklearn
的PCA
和TSNE
函数来可视化你的数据。 - 功能选择。 90%的时候,你的数据集会有比你需要的多得多的特征(这会导致过多的训练时间,并增加过度拟合的风险)。熟悉基本的滤波器方法(查阅 scikit-learn 的
VarianceThreshold
和SelectKBest
函数),以及更复杂的基于模型的特征选择方法(查阅SelectFromModel
)。 - 模型优化的超参数搜索。你肯定应该知道
GridSearchCV
是做什么的,以及它是如何工作的。同样适用于RandomSearchCV
。要真正脱颖而出,尝试用skopt
的BayesSearchCV
来学习如何将贝叶斯优化应用到你的超参数搜索中。 - 管道。使用
sklearn
的pipeline
库将它们的预处理、特征选择和建模步骤包装在一起。对pipeline
的不适应是一个巨大的信号,数据科学家需要更加熟悉他们的建模工具包。
原因二:概率统计知识
概率和统计并不总是在工作中明确出现,但它们是所有数据科学工作的基础。因此,如果你没有了解以下内容,很容易搞砸面试:
- 贝叶斯定理。这是概率论的一个基本支柱,在面试中经常出现。你应该练习做一些基本的贝叶斯定理白板题,并阅读这本名著的第一章,以获得对该规则的起源和意义的坚如磐石的理解(额外收获:这其实是一本有趣的读物!).
- 基本概率。你应该能回答类似这些的问题。
- 模型评估。例如,在分类问题中,大多数 n00bs 默认使用模型准确性作为他们的度量,这通常是一个糟糕的选择。熟悉
sklearn
的precision_score
、recall_score
、f1_score
和roc_auc_score
功能,以及它们背后的理论。对于回归任务,理解为什么你会使用mean_squared_error
而不是mean_absolute_error
(反之亦然)也是至关重要的。花时间查看sklearn
的官方文档中列出的所有模型评估指标真的很值得。
原因 3:软件工程知识
越来越多的数据科学家被要求从事软件工程工作。许多雇主坚持认为申请人了解如何管理他们的代码,并保持干净的笔记本和脚本。特别是:
- 版本控制。你应该知道如何使用
git
,并使用命令行与你的远程 GitHub repos 交互。如果没有,我建议从这个教程开始。 - Web 开发。一些公司希望他们的数据科学家能够轻松地访问存储在他们的 web 应用程序中的数据,或者通过 API 访问这些数据。熟悉 web 开发的基础很重要,而最好的方法就是学习一点 Flask 。
- 网刮。与 web 开发有点关系:有时,你需要通过从实时网站抓取数据来自动收集数据。为此需要考虑的两个重要工具是
BeautifulSoup
和scrapy
。 - 干净的代码。学习如何使用文档字符串。不要过度使用行内注释。将你的功能分解成更小的功能。小多了。你的代码中不应该有超过 10 行的函数。给你的函数起一个好的、描述性的名字(
function_1
不是一个好名字)。遵循 pythonic 惯例,用下划线like_this
而不是LikeThis
或likeThis
来命名变量。不要编写超过 400 行代码的 python 模块(.py
文件)。每个模块都要有明确的用途(如data_processing.py
、predict.py
)。了解if name == '__main__':
代码块的作用以及它为什么重要。使用列表理解。不要过度使用for
循环。向您的项目添加一个README
文件。
理由 4:商业本能
数量惊人的人似乎认为被雇佣是为了显示你是一个职位最有技术能力的申请人。不是的。事实上,公司希望雇佣能帮助他们更快赚更多钱的人。
总的来说,这意味着不仅仅是技术能力,还要培养一些额外的技能:
- 制造人们想要的东西。当大多数人处于“数据科学学习模式”时,他们会遵循一系列非常可预测的步骤:导入数据、探索数据、清理数据、可视化数据、建模数据、评估模型。当你专注于学习一个新的库或技术时,这很好,但在商业环境中,自动驾驶真的是一个坏习惯,在商业环境中,你所做的一切都要花费公司的时间(金钱)。你会想变得善于像企业一样思考,并对如何最好地利用你的时间为你的团队和公司做出有意义的贡献做出正确的猜测。一个很好的方法是,在开始数据科学项目之前,确定一些您希望它们回答的问题(这样,您就不会被不相关的任务冲昏头脑,而这些任务是“标准”DS 工作流的一部分)。让这些问题尽可能实用,在你完成你的项目后,反思你回答这些问题的能力。
- 提出正确的问题。公司希望雇佣那些在调整模型时能够牢记大局的人,并问自己这样的问题:“我构建这个是因为它对我的团队和公司有合理的帮助,还是因为它是我真正喜欢的算法的一个很酷的用例?”以及“我要优化的关键业务指标是什么,有没有更好的方法?”。
- 解释你的结果。管理层需要你告诉他们什么产品卖得好,或者哪些用户离开了竞争对手,为什么,但他们不知道(也不关心)什么是精确/召回曲线,或者你避免过度拟合你的模型有多难。因此,一项关键的技能是能够向非技术受众传达您的结果及其含义。尝试建立一个项目,向一个从高中开始就没有上过数学的朋友解释(提示:你的解释不应该涉及任何算法名称,或者参考超参数调优。简单的词更好。).
当然,像这样的清单不可能详尽无遗,但根据我在求职和面试过程中指导数百名早期职业数据科学家的经验(以及与我们的招聘伙伴本人的交谈),这可能占人们遭到拒绝的 70%。
请记住,其他不太明确的东西,如性格契合度,也可能是一个因素。如果你和面试官相处不好,或者谈话感觉紧张或尴尬,那么很有可能你的技术资质很好,但是你没有达到文化契合度。正是因为这个原因,公司经常拒绝那些在技术上表现出色的申请人,所以不要太在意一两次拒绝!
波动分布和非参数
原文:https://towardsdatascience.com/wiggly-distributions-and-nonparametrics-4e277e3939cf?source=collection_archive---------20-----------------------
拉里·乏色曼的书,所有的非参数统计,开篇描述了当研究非参数估计量时人们倾向于关注的分布类型:
茱莉亚"@ bork"埃文斯对这本书的介绍做了一个的删减,她问道:
不满足[积分]的概率密度函数的例子是什么?(可能是有无穷多个微小摆动的东西,我不认为我感兴趣的任何分布在实践中会有无穷多个微小摆动?)
为什么密度函数“过于波动”会给非参数推断带来问题?
每当我看到这样的约束,试图限制函数的光滑度,我总是立即跳到世界上最不光滑的条件:不连续。随机变量的密度或分布中的任何一种不连续性——即使是一个,即使它真的很小——都会打破乏色曼约束。
我们来说说在哪里可能会看到不连续分布!然后,muuuuch更投机一点,让我们来谈谈为什么它可能对非参数估计器不利。
场景一:定时数据库查询
假设你运行一个让人们阅读博客文章的应用程序。每当读者加载任何特定的帖子时,您的应用程序都会并行地向两个独立的数据库发出两个查询:第一个返回博客作者的个人资料图片,第二个返回博客帖子的实际文本。
您想知道哪个查询通常会首先返回,以及多长时间返回。您的直觉是,有机会使用一个空闲的获取线程来做一些其他的准备工作,同时仍然等待它的兄弟查询完成。
为了查看您的快速获取线程正在处理哪种停机时间,您修改了应用程序以开始跟踪一些统计数据,您希望对这些数据执行一些非参数估计:
- 轨迹曲线 pic 的响应时间, T_pic
- 跟踪博客文本的响应时间, T_text
- 计算差值, T_delta := T_pic — T_delta,并记录结果
结果是今天是你的幸运日:你还不知道,但是分布
潜在的 T_delta 是高斯分布,平均值为 100 毫秒,
标准差为 60 毫秒。
正如 Evans 在她的原始帖子中所示,高斯分布绝对符合乏色曼的积分条件:
因此,就乏色曼的介绍来说,你想对这些数据进行的任何非参数估计,大部分结果应该是好的。或者至少,你会对该估计量的性能有一个很好的感觉:乏色曼的书提供的任何误差界限和保证仍然适用于你的数据,因为它的基本分布是如此平滑和良好。
为了便于我们稍后进行比较,下面是这个漂亮、平滑的高斯函数的分布和密度:
场景二:定时数据库查询,但有时会出问题
让我们像场景一中一样重新设置一切——两个查询,两个
响应时间,记录差异。除了现在想象一下,每隔一段时间,一些幽灵虫就会出现。对于一些病理病例,图片总是比文本多花234 毫秒的时间来加载。
(例如:也许一个善意的开发人员已经包含了一个代码路径,它只意味着在单元或集成测试期间出现。出于测试目的,能够控制相对的数据库获取时间是很好的。因此,令人难忘的人类神奇数字“234”除了不知何故,只应该在测试时发生的事情已经泄露到生产中了!)
在这种情况下,分布 P(T_delta ≤ t) 将在精确的 t = 234:
注意,重要的不是那个不连续的大小,而是它根本就是不连续的。即使只有百万分之一的 T_delta 是病态的 234 毫秒,右边的密度图仍然会有一个巨大的无限高的脉冲峰值。
这对非参数化意味着什么?
这种分布给我的印象是超级不平滑。我不是一个伟大的测量理论家,但我不认为这是可微的,更不用说满足乏色曼约束的密度了。事实上,在介绍的下一部分,乏色曼谈到了处理密度绝对连续或密度离散的情况,这让我想知道是否有像场景 2 这样的混合情况的计划。
这就是我不得不承认没有真正读过这本书的地方。也许在商店里有一个答案!
但是除此之外,我可以尝试一下为什么像场景 2 这样的混合分布在处理非参数方面特别棘手。
想象我们正在执行核密度估计。这很像绘制直方图,但是没有你在面元之间看到的粗糙的边界跳跃。直觉告诉我们,如果我们观察到,比如说, T_delta = -30.5 ms,我们应该稍微涂抹一下。就像它在告诉我们,“不仅-30.5 毫秒是一个可能的结果,而且这可能意味着附近的值也是可能的。”我们将-30.5 毫秒出现在我们的数据集中视为一个理由,以增加我们对-30.8 毫秒和-29.2 毫秒以及其他类似值可能在未来出现的信念。
对于一个好的,平滑的分布,我可以看到这种情况。我敢打赌,对于漂亮、平滑的分布,在查看了从分布中抽取的 N 之后,你可以得到内核密度估计有多不正确的一些不错的误差界限。平滑度确实意味着观察到 x 的概率与看到 x +/- ε 的概率差不多。
场景 2 不是这样的,不是以同样的方式。因为有一个神奇的数字——234 毫秒——任何对该值的观察都与其余的 T_delta 空间完全不同。对于这些样本来说,密度在 234 ms 左右变化太快,无法进行健康的内核密度估计。不管分布的不连续间隙有多大,都是如此。
要考虑另一个非参数估计量,考虑场景 2 中的 bootstrap 抽样。您的引导亚群不包含任何假的 234 ms 点的情况看起来与场景 1 完全一样——也许这些情况差异很大,使得它更难与其他样本结合。这种少于 234 的情况多久出现一次?独家* -234 案呢?这些疯狂的样本对你的评估过程有什么影响?*
因此,场景 2 的误差范围现在不仅取决于你观察到的抽取次数,还取决于抽取病理性 234 ms 病例的普遍程度。乏色曼书中的误差范围可能没有给这种自由度留有余地。
虽然,如果这本书涵盖了所有非参数统计的所有,一定有关于这些混合密度的一些东西!我应该…读这本书。
野生人工智能:负责任的数据科学
原文:https://towardsdatascience.com/wild-wide-ai-responsible-data-science-16b860e1efe9?source=collection_archive---------16-----------------------
谁先开枪——新种族还是人类?
数据科学可以为我们做好事:它改善生活,让事情更有效率,更有效,并带来更好的体验。然而,数据驱动的分析已经出现了一些失误。以下是一些有意或无意滥用数据科学工具的例子:
- 2012 年,一组来自华尔街日报的调查记者发现,跨国供应零售公司 Staples 向生活在更富裕社区的买家提供更低的价格。史泰博的意图是为住在竞争对手商店附近的顾客提供折扣。然而,他们的竞争对手倾向于在富人区建商店。基于位置和社会地位之间的相关性,这导致了基于种族的价格歧视。史泰博和顾客都不知道这个副作用,直到一组调查记者发现了它。
- 2015 年,AdFischer 项目通过模拟证明,合成男性在线资料显示高薪工作广告的频率明显高于女性资料。结果是明显的基于性别的就业歧视(来源)。由于在数据驱动的算法管道中有意或无意地缺乏责任感,这项研究开始浮出水面。
- 2016 年,ProPublica 的调查人员发现,法官在法庭上预测未来犯罪的软件往往不正确,而且具有种族主义色彩:黑人被贴上更高风险标签的可能性几乎是白人的两倍,但重新犯罪的可能性较小。该工具在白人中犯了相反的错误:他们比黑人更有可能被贴上低风险标签,但却继续犯下其他罪行。ProPublica 的研究非常有影响力。他们在 GitHub 上以 Jupyter 笔记本的形式发布了数据集、数据方法以及数据处理代码。这一惊人的结果确实说明了这些工具的不透明和缺乏公平性,尤其是当它们被用于公共部门、政府和司法系统时。
数据科学公正吗?
人们经常声称数据科学是算法科学,因此不能有偏见。然而,我们在上面的例子中看到,所有传统的歧视罪恶都在数据科学生态系统中展现出来。偏差在数据和过程中都是遗传的,被推动和放大。
透明度是一种理念、一种思维模式、一套有助于防止歧视、促进公共辩论和建立信任的机制。当我们做数据科学时,我们与社会互动。我们做决定的方式必须是在一个我们从参与者和公众那里得到信任的环境中。单靠技术解决不了这个问题。用户参与、政策努力很重要。
数据责任
数据科学生态系统中的责任包括:公平、透明、多样性和数据保护。负责任的数据科学领域非常新,但已经处于所有顶级机器学习会议的边缘,因为这些是困难但有趣的相关问题。
Moritz Hardt
什么是公平?
哲学家、律师、社会学家多年来一直在问这个问题。在数据科学的背景下,我们通常解决预测分析的任务,根据过去或现在的一些观察(数据集)预测未来的性能或行为。当用于解决此类任务的模型与数据不符时,就会出现统计偏差。有偏差的模型不知何故是不精确的,不能正确地总结数据。当数据或模型不能正确代表世界时,就会产生社会偏见。当数据不具有代表性时,就会出现一个例子。如果我们只使用警察一次又一次去同一个街区的数据,并且我们只使用这些特定街区的犯罪信息,情况就是这样。我们对世界的定义也可能导致社会偏见。我们试图用预测分析影响的是现实世界还是理想世界?谁应该决定世界应该是什么样子?
什么是歧视?
在大多数法律制度中,有两个概念界定歧视:
- 区别对待是指基于受保护的特征(如种族、性别、年龄、宗教、性取向或国籍)而区别对待某个实体(如债权人或雇员)的非法行为。完全不同的待遇出现在对接受治疗的个人有一些好处或带来一些伤害的情况下,例如对他们判刑或允许他们上大学或给予他们信贷。这是一些实际上有切实的积极或消极影响的事情。
- 完全不同的影响是系统的完全不同的待遇的结果,在这种情况下,在
受保护阶层的成员身上观察到不相称的不利影响。不同的国家保护不同的阶层或亚人群。
当我们谈论歧视时,我们会使用一些让人不舒服的术语,比如种族主义、性别、性取向。极端意义上的政治正确在这些关于负责任的数据科学的辩论中没有位置。我们必须能够说出概念的名称,才能谈论它们。一旦我们可以谈论这些概念,我们就可以采取纠正措施。
公平的技术定义
让我们考虑将结果分配给群体成员的供应商。这是最基本的情况,一个二元分类。积极的结果可能是:提供就业,接受学校,提供贷款,提供折扣。消极的结果可能是:被拒绝就业,被学校拒绝,被拒绝贷款,不提供折扣。在公平方面,我们担心的是结果如何分配给人口中的成员。让我们假设 40%的人得到了积极的结果。然而,这一过程可能会对一些亚群体进行不同的处理。让我们假设我们提前知道亚人群是什么,例如红头发的人。因此,我们可以把我们的人口分为两类:红头发的人和没红头发的人。在我们的例子中,我们观察到 40%的人得到了积极的结果,只有 20%的红发人得到了积极的结果。另一组的 60%得到了积极的结果。在这里,根据一些定义,我们观察到对红头发人群的不同影响。表示这种情况的另一种方式是统计奇偶性失效。这是不带条件的公平的基线定义。在现实生活中使用这种评估相当复杂,例如在法庭上。这一公平的基本定义已写入全球许多法律,它规定接受任何结果的个人的人口统计数据与潜在人口的人口统计数据相同。
评估不同的影响
供应商可以说他实际上并不打算或者根本没有考虑头发的颜色,而头发的颜色恰好是数据集中的敏感属性。取而代之的是,卖主会说他决定给头发长的人积极的结果。该供应商否认了这一指控,并表示他没有基于头发颜色进行歧视。问题是供应商对红发人产生了负面影响。我们关心的不是意图,而是对亚人群的影响。换句话说,致盲不是法律或道德上的借口。从供应商的结果分配流程中删除头发颜色并不能防止歧视的发生。完全不同的影响在法律上是根据影响来评估的,而不是根据意图。
减轻不同的影响
如果我们检测到违反统计奇偶性,我们可能想要减轻。在一个我们可以分配许多积极结果的环境中,我们必须交换一些结果。我们必须从非红发群体中的某个人那里获得积极的结果,并将其传递给红发群体中的其他人。不是每个人都同意交换结果。一个曾经得到积极结果的人将不再得到它。这将导致个人公平。它规定任何两个在特定任务中相似的人应该得到相似的结果。群体公平和个人公平之间存在一种不容易解决的紧张关系。
个人对群体的公平性
个人公平和群体公平被带到最高法院的一个例子出现在 2009 年 Ricci 诉 DeStefano 案。消防员参加了一次晋升考试,该部门抛出了考试结果,因为黑人消防员没有一个得分高到可以晋升。消防部门担心,如果他们承认结果而不提拔任何黑人消防员,他们可能会因歧视和不同的影响而被起诉。但是后来诉讼是由那些本来有资格升职但却因此没有升职的消防员提起的。有一个关于个人公平的争论,一个关于不同待遇的争论。他们认为种族被用来对他们产生负面影响。这个案子的判决有利于白人消防员,有利于个人公平。
个人公平是平等的,每个人都得到相同的盒子到达树。群体公平是一种公平的观点,每个人都有足够多的盒子来够到树。股权成本更高,因为社会必须加大投资。这是两种本质上不同的世界观,我们无法从逻辑上决定哪一种更好。这只是两种不同的观点,没有更好的了。他们回到了我们所认为的世界现状,一个应该有的世界。真相会在中间的某个地方。理解哪种缓解与哪种信仰体系相一致是很重要的。
公平的正式定义
弗里德勒等人。艾尔。在他们 2016 年的论文中,梳理出关于公平的信念和从这些信念逻辑上得出的
机制之间的差异。构建空间本质上是世界的状态。它是由我们无法直接衡量的东西组成的,如智力、勇气、犯罪倾向和风险倾向。然而,当我们决定录取谁进大学时,我们想衡量智力和勇气。我们想知道一个人重新犯罪的倾向和他在司法中的风险倾向。这些都是展示的原始属性,不能直接访问。相反,我们着眼于观察空间,那里有代理,或多或少与我们想要测量的属性一致。对于智力来说,可以用 SAT 分数来衡量,勇气可以用高中的 GPA 来衡量,犯罪倾向可以用家族史来衡量,风险倾向可以用年龄来衡量。然后决策空间由我们想要决定的东西组成:在大学的表现和累犯。
公平性在这里被定义为通过观察空间从构造空间到决策空间的映射。个体公平(平等)认为观察空间忠实地代表了建构空间。例如,高中的 GPA 是一个很好的衡量勇气的标准。因此,从构造到决策空间的映射具有低失真。群体公平(equity) 然而,从建构空间到被观察空间,存在由结构偏差、社会偏差引起的系统性扭曲。此外,这种扭曲与群体结构相一致,与我们社会中受保护群体的成员相一致。换句话说,社会有系统地歧视。
未完待续……
参考资料:Julia Stoyanovich 教授(纽约大学)在哈佛大学关于负责任的数据科学的演讲——选自 Shoshana Zuboff 的《监控资本主义的时代》一书的章节——来自 Franç ois Chollet 的《人工智能让我担心什么》一文的思考。
我今天要听土豆沙拉吗?
原文:https://towardsdatascience.com/will-i-listen-to-potato-salad-today-66966cf956a0?source=collection_archive---------37-----------------------
利用数据、统计和机器学习来理解我对这首歌的痴迷
请原谅我,因为这听起来很疯狂。
有一首歌是由泰勒、创作者和 A$AP 洛基创作的,名叫土豆沙拉,我喜欢它。我的女朋友说我经常玩,等等,算了,我的女朋友和朋友坚持我经常玩,我办公室的同事经常问我是否每天都吃土豆。所以显然我很喜欢它。
给一点上下文,土豆沙拉是一首有趣,清新,明确,甚至欢快的歌曲,其中泰勒和洛奇说唱嘻哈的状态,他们有多少钱(经典!),以及他们对时尚的选择(例如,Rocky 指定他的香奈儿包不是钱包,而是挎包。两次。).这首歌让我着迷的是它的节拍,以及它与高尔夫男孩和 A$AP 酒吧融合的流畅和温和;还有名字也挺搞笑的。最重要的是,这个音乐视频感觉像是两个朋友在周日下午做的项目,为一首已经很酷的歌曲增加了一点额外的滑稽和现实。有什么不喜欢的地方:)?
Potato Salad
总之,回到我的困扰。我已经确定我喜欢这首歌,当然,作为一个数据人,我想用事实和数据来验证这一点。带着这个目的,我进行了一个实验,其目标是找到以下四个问题的答案:
- 我听了多少遍土豆沙拉了?
- 我的倾听模式是什么?
- 在特定的日子和时间里,我听土豆沙拉的可能性有多大?
- 有没有可能用预测性的机器学习模型来预测我会不会玩土豆沙拉?
在这篇文章中,我将分享我的发现。
Image by kartynas from Pixabay
数据
这个实验最重要的部分是数据,尤其是关于我听土豆沙拉时的数据。幸运的是,自 2017 年 10 月以来,我一直在登录 BigQuery 查看我在 Spotify 上播放的每一首歌曲,使用的脚本一直在云中运行。这个用 Python 编写的脚本,利用一个名为 Spotipy 的 Spotify 库,每三个小时调用一次 Spotify 的“recent _ played”API 端点,检索我在过去三个小时播放的所有歌曲。有了存储在 BigQuery 中的数据,只需运行一个简单的查询来选择 ID 为1jzIJcHCXneHw7ojC6LXiF
(Spotify 上的土豆沙拉 ID)的所有歌曲。
我听了多少遍了🥔 🥗?
先说最直白的问题:这首歌我听了多少遍了?答案是 104 ,一个还可以的数字(老实说,我期待更多),使它成为我听到最多的歌曲。本身这个值不多说;然而,就百分比而言,土豆沙拉代表了我整个收听历史中 0.57% 。更好的是,如果我只考虑我第一次土豆(2018–10–12)之后播放的歌曲,百分比增加到 2.05% 。
我想知道的第二个重要信息是,自从我第一次喜欢土豆沙拉以来,我已经听了多少天了。值为 2018 年 10 月 10 日至 2019 年 4 月 13 日天数的 66 或 35.86% 。简单来说,这上面写着自 2018 年 10 月 10 日起,我平均每三天至少听一次土豆沙拉。为了形象化这一点,我制作了下面的日历来显示我在哪些日子演奏了这首歌。
在这个图像中,蓝色的方块标记了我的“土豆日”,而红色的方块象征着土豆的缺乏。有意思的是,2019 年 2 月我几乎没听过这首歌。
The last couple of days have been fire
我的倾听模式是什么?
实验的这一部分旨在发现关于【如何】的任何令人惊讶的见解,或者我决定用一些土豆沙拉来愉悦我的耳朵的情况。
首先,我想调查的是,我的【音乐课】有多少是从土豆沙拉开始的。对于“音乐会话”,我指的是,嗯,我决定播放 Spotify 的会话或时刻。比如早上 8 点打开 app,就是一个会话。为了给我的会话定义增加一些额外的深度,我认为一首歌曲在前一首歌曲播放至少两小时后才构成新会话的开始。在最后一个示例中,我在上午 8 点打开了应用程序。现在,假设我播放音乐到上午 11 点(三个小时长的会话),休息一下,并在下午 2 点播放另一首歌曲。在这种情况下,由于从之前收听的歌曲(上午 11 点结束)到新歌曲的时间超过了两个小时,因此这首新歌曲代表会话的开始。
有多少次我是以土豆沙拉开始的?在我所有的 808 个音乐场次中, 24 ( 2.97% )都是土豆场次,而且令人惊讶的是(不是真的),这是我最喜欢的“场次开始”歌曲。从这个值的角度来看,第二个位置的歌曲已经播放了 13 次( 1.60% )作为会话开始。
我想知道的另一个细节是最长的重复链,同样令人惊讶的是(这次是真的),这个数字只是 3 !与我实际上最长的重复播放的歌曲相比,这是一个相当低的数字,我的歌曲连续播放了八次。
Image by Ulrike Mai from Pixabay
在特定的日子和时间里,我听土豆沙拉的可能性有多大?
是时候给我的第一个答案了这篇文章的标题“我今天要听土豆沙拉吗?”在我回答这个问题的两种方法中的第一种(第二种在下一节)中,我使用了简单明了的概率。
在继续之前,有一个小小的免责声明:我想让这个有趣的深夜项目简单、清晰、易懂,即使对那些不熟悉我在这里介绍的术语的人来说也是如此。因此,我意识到我在这里应用的方法有一些缺陷、不完美、假设和过于简单化。
好吗?回去吧。
我的程序包括计算我在一周的特定日听 PS 的概率,我在一天的特定小时间隔听 PS 的概率(例如上午 10 点到 10:59 或晚上 7 点到 7:59),然后将这两个值相乘以获得玩游戏的可能性🥔 🥗在日期和时间间隔 x。让我解释整个过程。
为了获得在一周的某一天播放这首歌的概率,我计算了在一周的某一天我播放这首歌的次数,除以该工作日在我的数据集中出现的次数,但只是在我第一次听土豆沙拉的那一天之后。例如,自 2018 年 10 月 10 日起,我在我的数据集上的 21 个星期二中的 11 个不同的星期二播放了这首歌。所以一个星期二我玩 PS 的概率是 11/21 = 0.52 或者 52% 。下面的表格显示了所有的七种可能性。
嗯,周四有什么活动?只有 13% 的几率?会不会是这种近乎周末的感觉让我去演奏其他类型的音乐?这听起来可能令人兴奋和好奇,但答案远远超出了本文的范围。尽管如此,好消息是,经过两天的低土豆活动后,周六就到了,这一天我将通过玩一些甜蜜的 PS 来救赎自己,这是一个 68%的机会。
获得在一天的特定时间播放歌曲的概率遵循与前面相同的方法。唯一的区别是,我没有像以前那样使用一周中的日期,而是使用一天中的小时,例如,上午 12 点,凌晨 1 点…直到晚上 11 点。下表显示了 24 种可能性,每种可能性对应一天中的一个小时。此外,请记住,我不是在寻找播放歌曲的可能性,比方说,正好在上午 11 点,而是在上午 11 点到 11 点 59 分这段时间。
24 probabilities. One per day hour.
这里有一个奇怪的细节是,凌晨 4 点的可能性是 100% ,表明土豆沙拉是我在这个时间播放过的唯一一首歌(我为此感到自豪)。
既然我们知道了在某一天播放这首歌的概率,以及在某一特定时间听这首歌的可能性,我们就可以确定它的联合概率,我指的是两件事同时发生的可能性。在这种情况下,联合概率是在特定的日子和特定的时间播放歌曲的概率。我们可以通过将两个概率相乘来计算这一点——例如,在周二上午 10 点至 10 点 59 分期间收听土豆沙拉的可能性是 4.66% (0.5238 * 0.089)。酷吧。
下面的两个表格给出了联合概率。
那么,我们该如何解读这一串数字呢?概率最大的时段是周六凌晨 4 点(到凌晨 4 点 59 分),可能性 68% 。这个估计是重要的,因为在凌晨 4 点播放这首歌的机会很大。因此,自然地,与其他时间范围相比,这个时间范围的所有联合概率将会高得多。在相反的一端,是可怕的周四,可能性最低的一天,在不太极端的情况下,但完全可以接受的情况下,我们有周一和周六上午 8 点,值为 13.63% 和 17.04% 。
那么,我今天要听土豆沙拉吗?嗯,除非是周四,否则我会做的可能性很小,但却是真实的。
这种概率方法是我回答一直萦绕在我梦中的问题的直接方式。然而,我想把事情复杂化,给问题增加额外的复杂性,并使我的调查不成比例。因此,就像一个理性的数据人一样,我不得不尝试建立一个基于机器学习的预测系统,看看它是否可以学习和预测我是否会在给定的时间和日期听土豆沙拉。
我用来建立我的预测模型的算法是一种被称为支持向量机 (SVM)的算法,这是一种机器学习模型,主要用于将事物分为两类,例如,是或否,好或坏,垃圾邮件和非垃圾邮件。对于这个特殊的问题,我应用了 SVM 的一个特殊变体,称为一类 SVM ,一种用于异常值检测的技术。现在你可能会问,“但是,嘿,胡安,你为什么把这个问题表述为异常值检测问题?”好问题。请看下一张图片。
这张图片显示了我听土豆沙拉的日期和时间。从中我们可以观察到,我的收听时刻通常在日期和时间上是相当规律的,换句话说,在数据中没有太多的离群值(不常见的实例)(除了我在周六午夜播放这首歌的那次)。正因为如此,像 SVM 这样的异常值检测系统可以用来学习决策边界,这是一个将异常值与内部值区分开来的“屏障”,也就是我通常的土豆时间,它知道我什么时候可能会听 Ensalada de Papa。因此,为了预测我是否会听这首歌,我们需要看看时间和日期对是否位于决策障碍内,这将在下一张图中显示。
The X-axis shows the date of the week (starting from Monday) as number
暗红线内的数据点,正式称为决策边界,是我播放 PS 的内点或普通时刻,不在内的点是异常点,或我播放歌曲的不寻常时间,例如周六午夜、周日凌晨 4 点和周一早上 7 点。这里的主要要点是,我的大部分收听时间都落在边界内,这意味着我的收听时间非常标准且符合预期。
我再问一遍:我今天要听土豆沙拉吗?如果日期和时间在红线内,那么可能,否则,“可能更少。”
概述
在这篇文章中,我展示了当一个数据人半痴迷于一首名为《土豆沙拉》的嘻哈歌曲时会发生什么。为了证明这种轻微程度的痴迷,我创建并分析了一个由我在 Spotify 上播放这首歌的每个实例组成的数据集,并发现了以下事实:
- 2018 年 10 月 10 日至 2019 年 4 月 13 日期间,我已经听了 104 遍土豆沙拉。
- 我的音乐课有 2.97%是以 PS 开头的。
- 如果我在凌晨 4 点打开 Spotify,我有 100%的可能会玩 PS。
- 我通常在同一时间播放这首歌。
最后一次:我今天会听土豆沙拉吗?但愿,是的。真正的问题是,你愿意吗?
在我的 GitHub 上可以找到用于生成这个实验的代码,链接如下:
[## 胡安德丝/土豆沙拉
在 GitHub 上创建一个帐户,为 juandes/马铃薯沙拉的开发做出贡献。
github.com](https://github.com/juandes/potato-salad)
感谢阅读。希望你喜欢:)
如果你有任何问题,评论,疑问,想聊天,或者告诉我你是否喜欢这首歌(我肯定你喜欢),请在这里或 Twitter 上留下评论,我将很乐意帮助你。
[## 胡安·德迪奥斯·桑托斯(@ jdiosantos)|推特
胡安·德迪奥斯·桑托斯的最新推文(@ jdiossantos)。机器学习/数据工程师。还有,口袋妖怪大师,还有…
twitter.com](https://twitter.com/jdiossantos)
哦,如果你能在推特上分享这个故事,或者转发我的推文,我会很感激的。如果我幸运的话,泰勒会看到这个:)。
“它会扩展吗?”
原文:https://towardsdatascience.com/will-it-scale-1f4996e940ff?source=collection_archive---------29-----------------------
在 Spark 中从试点转向生产的好处和隐藏的挑战
Photo by Jukan Tateisi via Unsplash
机器学习产品和管道是一项风险投资。尽管只要有足够的时间和关注,ERP 实施和软件推广很可能成功,但机器学习概念可能失败的原因有很多。你是否应该排除万难,开发一个让用户感到兴奋的工作试点,每个人脑海中的第一个问题将是“它会扩展吗?”。答案通常是“理论上,是的”,但是很难预测您在实践中会遇到什么样的集成障碍。在这个过程中挣扎了一两次之后,你学会了通过在头脑中构建你的试点来预先回答他们的问题。谢天谢地,我们在 Apache 基金会的朋友已经开发了一个架构来做这件事。
Spark 是一个开源计算框架,在本地笔记本电脑上使用它就像在指挥一个由数百台计算机组成的集群一样舒适。在 Spark 上用 Python、R 或 Scala 构建您的 MVP 将使您的代码在生产中更容易扩展,但是 Spark 的许多好处被隐藏的挑战抵消了,如果没有做好准备,这些挑战可能会破坏您的路线图。
为什么是火花?
Spark 在计算机科学界如此受欢迎有几个原因:
它很容易使用
无论你来自技术世界的哪个角落,你都会发现 Spark 生态系统对开发者非常友好。Spark 可以在 Hadoop、Mesos、Kubernetes、AWS、Azure、你的本地笔记本电脑以及几乎所有你会考虑使用的主流存储系统上运行。这种互操作性使得在计算集群上进行大规模测试之前,可以轻松地基于过滤后的数据在本地开发您的代码库,从而在您从试点阶段过渡到大规模阶段时节省您的时间和资金。
Spark 是用 Scala 编写的,但是它的 Python、R 和 Java 包装器使得广大用户可以很容易地用他们喜欢的语言运行分布式作业。这些人在独立工作时不需要争夺空间:Spark 可以同时管理多个不同的工作负载,而不会迫使您的团队为单独的集群付费。
最后,Spark 的开源社区和大型技术支持者已经发布了数百个库来加速您的开发。像 Databricks 这样的服务提供商已经使 Spark 集群的启动、管理变得非常简单,让您的团队成员在非本地环境中获得了他们渴望的独立性。结合起来,这些便利使 Spark 成为大多数用例中比更灵活的框架如 Dask 更容易的选择。
它很快(真的很快)并且扩展性很好
在引擎盖下,Spark 的 Catalyst 优化器将用户输入转换为转换的有向非循环图(DAG ),然后在计算机网络(例如,节点)上分发优化的“作业”以进行内存处理。从视觉上看,这个过程如下所示:
如果这个概念看起来令人困惑,不要担心:Spark 在后端处理这些优化,使 Spark 实现的基准速度比其前身快 100 倍以上,而不会使 90%以上的用例的用户体验复杂化。如果您需要更多内存或处理能力,可以轻松升级现有节点或向网络添加新节点。
它很灵活
与目前市场上的其他分布式架构不同,Spark 可以处理几乎所有的编程任务:
- 将您的结构化数据存储在弹性分布式数据集(rdd)或 Spark SQL 的数据帧中,以优化查询
- 利用 Spark 的 GraphX API 来处理和分析图形数据库
- 使用 Spark 众多语言 API 之一来转换和清理您的数据
- 使用 MLlib 构建和部署机器学习算法
- 使用 Spark 流聚合和分析数据流
其他架构在这些任务中的一个或两个方面可能更有效(例如,Apache Storm for streamingFlink 用于批处理),但没有其他产品能够像 Spark 一样拥有端到端的生产流水线。
它有动力
当你在构建一些持久的东西时,你不能花时间去担心你的架构是否会在未来十年内持续存在。鉴于目前使用 Spark 的公司令人印象深刻,可以合理地假设 Spark 不会很快消失。即使 Spark 架构消失,取而代之的是一个竞争性的框架,在新的后端上运行现有的 Python、R 或 Scala 代码也是相对容易的(对于 SAS 来说就不一样了)。
大规模工作的潜在挑战
Spark 是一个强大的工具,但它并不像我和我的团队最初预期的那样容易采用。尽管有些差异只是需要习惯,但今天仍存在三大挑战:
对低效代码的重罚
在处理万亿字节的数据时避免终止需要非常关注代码效率。当你在 Jupyter 中玩少于 2000 万行时,你没什么可担心的;大多数细胞会立即运行,你能做的最糟糕的事情就是杀死你的内核并强制 30 秒的重置。Spark 集群上的内存不足故障更具破坏性。一个设计不良的连接可能会导致半个小时的延迟,因为您需要等待 Spark 集群自动伸缩、死亡和重置。雪上加霜的是,如果您的集群没有合适的护栏,这些重置会非常昂贵。
工程师们倾向于具备这种注重效率的心态:我们习惯于将问题分解成模块,并在提交代码之前对其进行批判性思考。另一方面,统计学家和分析师倾向于在抛出错误或异常后才调试他们的代码。这些群体倾向于与 Spark 斗争,因为它迫使他们以一种他们不习惯的方式抢先解决潜在的问题。未能发现次要线索(例如不必要的用户定义函数或意外的。collect()方法)对于使用集群的任何人来说都相当于巨大的延迟。
有限的图书馆和社区支持
大多数 Python 和 R 用户(包括我自己)都被支持这些语言的协作社区宠坏了。我们习惯于搜索库来解决我们的问题,当没有库存在时,我们通常可以通过快速访问堆栈溢出或介质来拼凑一个解决方案。当我们需要查看文档时,我们希望找到经过几十年的发展,为非技术读者量身定制的干净、简洁的文章。我们很少会遇到一个还没有被别人解决和记录的问题。
这些公共拐杖对于 Spark 来说还不存在。并不总是有高层次的抽象来解决任何给定的问题,你在网上获得的 bug 支持的数量和质量都比 Python 或 r 中的要弱得多,如果你知道如何阅读 Spark 的文档,它们会很有帮助,但它们显然是为计算机科学家编写的;统计学家和技术含量较低的从业者在学会一些 CS 基础知识之前是不会自给自足的。
无表达语言 API
最初,我们的团队喜欢在 Python、R 和 Scala 之间无缝移动数据的想法。然而,在战壕中呆了几个星期后,这个特征感觉更像是拐杖而不是增强。问题是 PySpark 和 Spark 还没有独立存在:虽然你可以在 pandas 或 dplyr 中搜索 Spark 的等效函数,但许多让这些库变得神奇的直观方法还没有进入 Spark。在等待这些 API 更新的同时,您可以在 Scala 中编写创可贴,但是这样做会增加构建的时间、复杂性和技术负担。
A “code snippet” pulled directly from a prominent provider’s Spark overview
“是的,会的”
尽管存在这些挑战,Spark 仍然是缩小中试和规模化之间差距的一个很好的方法。它为开发生命周期中的一个主要痛点提供了一个全面的解决方案,随着 Spark 及其语言 API 的成熟,上面提到的问题将会随着时间的推移而消失。后端可能会改变,GPU 可能会成为新的规范,但随着工程团队被不断增长的数据量推向计算集群,分布式计算背后的社区只会增长。新的开发人员带来新的开发,不久之后,我们将有一个完全不同的前沿问题要写。
机器会有移情能力吗?
原文:https://towardsdatascience.com/will-machines-ever-be-capable-of-empathy-d5c929ffc0a4?source=collection_archive---------10-----------------------
人类是神奇的生物,没有机器可以复制这种魔力。
Image licensed from Canva
八十年代的我是一个孤独、古怪的孩子,总是渴望一些不存在的东西。我在书中找到了我的朋友,我有一个在科幻小说中读到的关于机器人的梦想,在某个时候,我们身边会有机器人,它们可以减轻我们孤独的痛苦。一个机器人,可能是我的朋友——会在我需要的时候出现在我身边安慰我,会爱我。
我说过,我很孤独。
三十年和许多技术之后,我们正以指数加速的方式走向人工智能的未来。三越和索菲亚今天可以成为不可思议的明天。
我是一个移情者,这让我变得非常有人情味,容易犯错。一台机器能够同情我吗?它会变得有同情心吗——以人类的方式?
Don’t change the subject. — source
当我们谈论人工智能时,我们很快就会谈到人工移情的话题。对于一台机器是否能够或者曾经能够发展出同理心,不同的学校有他们非常独特的观点。除了明显的“是的,他们可以”和“不,他们不能”之外,还有“当它看起来是真的时,谁在乎它是不是假的”的答案
在我看来,这与其说是剖析技术能力,不如说是找到正确术语的问题,这更是一个伦理问题,而不是科学问题。
当我们谈论智能和人工智能时,我们已经遇到了一些值得一提的主要差异。
H 人类智慧的力量在于它不局限于理性思考。我们能够处理信息,我们也考虑到了世界的不可预测性。我们的集体意识让我们知道什么是正确的,而不需要试图理性地找出它。
我们的情绪在我们的决定中起着巨大的作用,不管偏见是好是坏,我们也在用我们的悲伤、快乐、爱、恨、挫折来衡量我们的理性决定。我们的记忆、引发的创伤、希望和恐惧以及个性对我们如何应对周围的世界有着巨大的影响。
机器做不到这一点,即使它们想这样做。他们不能把一定比例的独特的不可预测性、恐惧、创伤计算在内——因为这不是他们的工作方式。
A 人工智能是关于观察人类,学习动作和反应,积累大量数据,并在此基础上创建复制信号。深度学习和自学的人工智能过程使人工智能能够处理和处理数量惊人的数据集——这些数据如此庞大,以至于我们有限的人类思维无法理解。
因为机器学习非常快,并且能够基于所有理性数据集做出快速决策,所以它们能够产生移情的外观。
但是同理心与处理的数据量或观察到的信号数量不是线性相关的。同理心是指根据我们自己的经验,认同他人,感受他们的感受,能够在没有信号的情况下预测他们的下一个感受。
“人们发出的信号只是他们经历的内心故事的一小部分。通过观察我们的所作所为和所说的话,你和我都远远超过其他人认为我们是什么的总和。”杰森·米勒
机器能有同理心吗?
根据剑桥英语词典的定义,同理心是指通过想象处于他人的处境会是什么样子来分享他人的感受或经历的能力。这是一种在精神上认同并完全理解另一个人的力量。
Artificial empathy— source
这个定义没有区分人类共情和人工共情。我们的定义来源于我们的人性——我们用人类的能力创造的任何东西都默认来源于人类。所以,每当我们谈论一般意义上的移情时,我们指的是人类的能力。如果我们需要参考其他东西——在这种情况下,我们正在教机器的人工共情和机器正在教自己的人工共情——我们需要澄清我们正在谈论的是人工共情。
当谈到人类的同情心时,这里有两个机器无法填补的空白:
- 机器无法在精神上认同人类
- 机器永远不会完全理解一个人
人类是有魔力的
安东尼奥·达马西奥谈到人类时说:
…我们不是会思考会感觉的机器,我们是会思考的感觉机器。
为了全面了解人类,我们需要首先了解是什么让我们成为人类。是我们拥有的感觉,而不是我们认为的想法。正是什么使我们成为人类,使得我们不可能完全理解我们,因为我们的意识是一个异常复杂、不断变化、灵活的结构——因此不同于任何机器构造。
首先,我们不是理性的生物。我们的意识不是由我们的大脑或理性思维驱动的,它不是一个线性和逻辑的结构——它有一些理性的线索,但它比那更有层次。
我们的意识是由我们如何体验世界来定义的,由我们的五种感官,视觉、听觉、触觉、味觉和嗅觉驱动,结合对感官的情感反应。没有机器可以像人类一样体验世界,没有机器可以复制相互联系的感官体验和我们对它们的情感反应。没有一台机器会感到真正的饥饿或干渴,或强烈的性欲,或对失去安全感的恐惧,或对未来事件(如死亡)的焦虑。
我们的意识也是由我们的集体意识塑造的,我们的集体智慧、记忆、文化——超越了个人的感知。在我们的社会中,它以价值观、规范、集体道德的形式表现出来。它表现在我们的人际交往中,表现在故事、谈话、传说、笑话中。在元通信和其他微妙的信号,如理解符号,讽刺,语气和理解,有时缺乏一个标志是标志本身。例如,在谈话中,面对令人震惊的事实毫无反应就像瞳孔因恐惧而放大一样。我们的意识存在于我们创造并坚持的信念、希望和信仰体系中。它们不符合逻辑,也不合理,但它们确实存在,而且深深扎根于我们的集体思维中。
当我们与他人互动时,当我们交流、告知、教导、相互支持时,通常需要同理心。我们的交流是独一无二的,不可能被复制,因为我们意识的所有层次、复杂性和不确定性被认为是所有互动的基础。
你无法教会机器像人类一样交流,机器也无法自己学会像人类一样交流。因为当我们以人类的方式做事时,我们利用了集体和个人的意识,而这是机器所不具备的,它们不是俱乐部的一部分——我们永远无法让它们完全参与进来。
机器无法像人类一样感受到共鸣
这不是一个技术问题,这是一个共情的解释问题。这并不是说相信下一级机器进化可以学会已经具有同理心,而是说人类的经验永远无法复制——如果可能的话,我们会将我们的能力退化到某种可测量、可计算的东西。
正如亨利·基辛格在《大西洋月刊》的文章中所言,在一个将人类经验简化为数学数据,并由他们自己的记忆来解释的机器世界中,意识应该如何定义?
我们拥有不可估量的独特的东西,可以称之为魔力,也可以定义为灵魂。
Light blue or dark blue — mitsuku.com
说到机器,我怀疑我们人类能否为一台我们无法百分之百理解的机器创造出某种东西。这是如此的无形,以至于它的存在甚至可以被否认,也不能被科学证明。
更不可能的是,一台人造机器能够生产出无法用它的能力来描述的东西——那是从数据、算法和逻辑中推导出来的。
机器不可能有人类的灵魂;他们无法学会感受或拥有人类的本能,他们无法复制人类魔法的多样性和不可预测性。
他们可以有人工共情,但它与人类共情的不同,就像塑料花与真花的不同一样。它可能很近,非常近——但它永远只是表象,而不是真实的东西。我个人不会有任何其他方式。
如果你想要更多,请注册我的每周 简讯 。
我的顾客会回来吗:和 CLV 一起玩
原文:https://towardsdatascience.com/will-my-customer-come-back-playing-with-clv-2564cc48849a?source=collection_archive---------14-----------------------
自从 Kaggle 的 Olist 数据集上线以来,我已经在过去的几天里修补客户终身价值模型了。特别是,我想探索久经考验的概率模型,BG/NBD 和 GammaGamma 来预测未来的购买和利润。我还想看看机器学习方法是否能做得很好——简单地预测客户是否会重复购买。这些模型做同样的事情——预测客户购买——尽管方式不同。也许在一篇更新的文章中,我可以提出一些衡量标准,在平等的基础上对它们进行比较。不管怎样,我们开始吧。
笔记本可以在 Kaggle 找到。这里:https://www . ka ggle . com/krsnewwave/CLV-with-lifetimes-and-feature tools
Olist 是一家巴西电子商务网站,它在 2016 年至 2018 年期间如此慷慨地在其网站上分享了 10 万个订单。数据可以在这里找到。
数据看起来像什么
该数据集包括约 95,000 名客户及其在该网站的订单,这些订单是约 73 个类别的约 33,000 种产品的约 100,000 个独特订单。它还包括商品的价格、客户支付的金额、信用卡分期付款,甚至与订单相关的恐惧成本。它的数据应该很像你自己的电子商务公司的数据。😉
购买模式似乎很正常,定期上涨,并在 2017 年 12 月大幅飙升。
数据显示,每位顾客的购买模式非常稀疏,每位顾客平均购买 1.03 份订单和 1.07 件商品。
英国地质调查局/NBD 模型
对于概率模型,我使用了许多这种绅士内核的代码。寿命库对于快速构建这类分析非常有用。它需要 RFM 输入数据,这要求每个客户,我们有他们最近购买的信息,他们购买的频率和他们购买的总货币价值。
贝塔几何负二项分布解决了两个问题,1)客户活跃或不活跃的概率(在文献中是活着还是死了!),以及 2)购买次数的概率。(1)由贝塔分布建模,以及(2)由泊松分布建模。对于这两个预测问题,每个个体或群体都有自己的参数。一个简单的方法是用一枚硬币和一个骰子来模拟(1)和(2)。
这里是衡量我们的模型性能的视觉效果。在校准期(左)和验证期(右)测试中可以看到,由于缺乏关于这一行为的数据,该模型在尝试预测 4 次或更多次购买时失败。
下图描述了 x 轴上的频率和 y 轴上的新近度。经常购买和最近购买的人在图表的最右边。在下图(a)中,未来 120 天的预期购买次数非常低(0.6 次),即使是最忠实的买家(最近购买且经常购买)。在(b)中,即使是最忠实的买家也只有 60%的机会活跃。这是因为数据中每个客户的购买模式非常稀疏。
使用该模型,可以根据未来的预期购买次数输出客户的排名。该排名可用于确定不同细分市场的营销策略。这是前 4 名客户的每个购买模式后存活的概率。这些前 4 名是根据半年内的最高预期购买次数计算出来的。
我还尝试了一个 GammaGamma 模型,该模型考虑了所购物品的货币价值。然而,预测并不好,在维持集上只有 0.35 的相关性。这可能是因为购买模式的稀疏性。我将把它留给一个更深入的研究,看看 GammaGamma 模型相对于购买的稀疏性在哪里崩溃。
更广阔的视角
从上一节中,我们抽象出了购买物品的性质和数量、购买的离散时间窗口以及支付的上下文。所有这些都会对重复购买的问题产生影响。在本节中,我们将使用特征工具库为我们自动创建特征。
将数据集连接在一起的过程有点乏味,但回报是一个完全自动化的特征工程例程。实体集将如下所示:
在转换特征之前,我们声明一个截止日期和训练窗口。截止日期之后的交易将被截断,截止日期之前的训练窗口期将构成我们的训练集。我们将预测客户是否会在截止日期后购买,因为她在截止日期前的所有交易都在训练窗口内。我们的截止日期将是 2018 年 7 月 1 日。**
在 featuretool 的深度要素合成(DFS)的帮助下,数据集将如下所示。DFS 使用关系中声明的索引来创建聚合和基本功能。例如,我们可以有一些简单的东西,如付款总额(深度=1),也可以有一些复杂的东西,如客户订单最大付款的平均付款额(深度=2)。回想一下,一个订单可以有多次付款,一个客户有多个订单。
模型的结果如下:
不算太坏。增加训练窗口显著提高了我们的指标,更复杂的模型并没有带来太多的改进。和以前一样,我们可以得到一个客户留下来的输出概率作为我们的排名。然后,我们可以围绕这些级别制定策略。
最后,我们将讨论最重要的特性。通过默认方式获得随机森林和梯度增强树的特征重要性是微不足道的-所有树的基尼系数的平均下降。我将让读者通过抽样来确定排列的重要性。
在 2018 年上半年购买的客户可能会在下半年再次购买。购买了许多订单并有许多付款(信用卡分期付款)的客户可能会再次购买。付款类型=未知可能表示全额付款。还有关于特定城市或州的特征,尽管这些仍然是可疑的,因为树偏向于具有许多级别的类别。
虽然,一些顶级功能是转移视线。谁听说过一个未知的星期几,月份或年份?这些可能是数据中的错误,模型以某种方式利用这些错误来获得优势。这项研究在投入生产之前还需要进一步的清理和完善。
感谢阅读。
原载于 2019 年 1 月 9 日【itstherealdyl.wordpress.com】。
我的机器学习系统会被攻击吗?
原文:https://towardsdatascience.com/will-my-machine-learning-be-attacked-6295707625d8?source=collection_archive---------19-----------------------
机器学习的安全性
打开 ML 安全威胁模型
Source.
机器学习真正将小说带入了现实。但是任何新发明(包括 ML)的不幸事实是新的能力伴随着新的漏洞供攻击者利用。因此,如果您是组织中负责安全的 CISO 或项目经理,您应该如何看待这些新的漏洞?你的 ML 真的会被攻击吗?如果是这样的话,如何以及何时会发生违规?
以上问题的答案是一个 ML 安全威胁模型——一个结构化的框架,展示了您的 ML 系统上所有可能的威胁载体。
机器学习仍然是非常新的,它的威胁向量知之甚少。然而,在这篇文章中,我们将尽最大努力去思考它们,看看我们是否能在文章的结尾给出一个考虑 ML 安全性的坚实框架。
让我们试一试。
威胁模型派
在 Calypso ,当我们考虑威胁模型时,我们喜欢考虑三个独立的部分:
世卫组织会攻击你吗?一切都始于世卫组织。袭击者。对手。另一边。你可以让定义世卫组织的工作变得非常简单或者非常困难。一方面,你可以说是“黑客”。另一方面,这实际上给了你什么信息?“一个了解机器学习如何工作的黑客”可能更好。“一个了解机器学习如何工作并有数学背景的黑客”更好。你能在世卫组织周围放得越详细越好。
他们为什么会攻击你?为什么超级和世卫组织关系密切(下面我为什么把两者放在一起讨论)。“为什么”背后的想法很简单——他们可以攻击你,但是他们为什么要攻击你呢?那里一定有适合他们的东西。一笔赏金。奖励。同样,定义“为什么”可以简单到说“为什么不”(不推荐),也可以难到说“违反保密性,然后将从我的 ML 系统中提取的数据出售给某个实体 X”(好得多!).
他们会如何攻击你?这是技术部分。现在你知道了世卫组织以及为什么会攻击你——下一个问题是他们会怎么做?如果我们在谈论机器学习——它们会在训练或推理过程中攻击你的 ML 吗?他们对你的系统有多少了解?一个非常有趣但也很有挑战性的方面是考虑如何选择。他们也许能够黑掉你的 ML,但是如果黑掉你的数据管道更容易,他们会那样做吗?
让我们进入更多的细节。
世卫组织+为什么
世卫组织。概括地说,我喜欢把对手想象成“严肃”的级别。我脑子里是这样想的:
- 聪明的研究员/工程师摆弄着一个商业 ML 系统(可能是为了实际的研究——比如对 Clarifai.com这里的攻击)
- 白帽子参与了一项赏金计划
- Penntester /红队队员进行测试
- 黑客行动主义者攻击商业 ML 系统来证明一个观点
- 黑帽攻击商业 ML 系统以赚取金钱奖励(无论是通过实际部署漏洞还是在暗网市场上出售)
- 有组织的黑帽集团攻击商业传销系统(想想匿名、影子经纪人和末日军团)
- 国家资助的组织(在这一点上,它基本上是网络战)
考虑你的对手有多严重是很重要的,因为这决定了他们可能获得的知识和工具的种类,从而决定了你的防御水平。
现在是为什么。为什么,在我脑子里,分解成两个问题:
- 他们的目标是什么?
- 他们的动机是什么?
在回答目标问题时,我喜欢用中情局三重奏:
Source.
三位一体的三个要素——机密性、完整性和可用性——指的是安全的三大支柱。如果你能保护好这三者——你就有了安全保障。
保密性(或 隐私 )攻击旨在从你的 ML 系统中提取敏感信息。例如,攻击者可能想要推断某个特定的数据点(例如您)是否是某个特定训练数据集(例如医院出院)的一部分。
完整性攻击让你的 ML 模型出错,但是——重要的是——悄悄地做。例如,攻击者可能希望您的分类器将恶意文件视为良性文件,而不影响其整体性能,因此您永远不会注意到。在 integrity 中,攻击者可以有许多子目标(从难到易):
- 源/目标分类错误 —攻击者希望将特定类别(“恶意”)归类为特定的其他类别(“良性”)。
- 有针对性的错误分类 —攻击者希望将特定类别(“停止”标志)归类为任何其他类别(例如“限速 60”或“限速 45”或“狗”或“人”或其他)。只要没有停)。
- 误分类——将任何一个类归入任何一个类。进入可用性攻击领域(见下文)。
- 信心降低 —攻击者希望你的模型失去信心(当它对阈值起作用时很有用,例如在欺诈分数的情况下)。
可用性攻击旨在彻底摧毁你的 ML 系统。比如,如果在训练池中插入了足够多的坏数据,那么你的模型学习到的边界基本就是垃圾,模型就变得无用。是机器学习界的 DOS 攻击。
攻击者的目标旁边是攻击者的动机。这个更加主观,有点和世卫组织纠缠在一起。如果你是一个定义上的黑客行动主义者群体,你会试图发表某种声明,如果你是一个黑帽组织,你可能想要经济利益。
怎么
技术部分。怎么会有人真的去破坏你的模型呢?(在这里,我将重点关注特定于 ML 的漏洞,并排除传统的网络安全问题,如 ML 服务器上的 DDOS。)
我们可以从四个方面对洗钱攻击的方式进行分类:
- 计时(训练/推理)
- 功能(白盒/黑盒/灰盒)
- 局限性(干扰距离/功能/领域/再训练频率)
- 可供选择的事物
时机 —这是指在 ML 部署管道中攻击发生的位置。这里有两个宽泛的选择——训练时间和推理时间。
Source.
- 在训练时间的攻击意味着攻击者能够影响训练数据集(无限的力量,但很难做到和额外的限制)。
- 在推断时间的攻击意味着攻击者只能干扰即时输入(可能强大,也可能不强大,这取决于模型,但更容易执行,因为只需要注入修改的输入)。
能力 —这是指攻击者对 ML 系统内部的了解。具体来说:
- 白盒攻击假设攻击者知道底层数据的分布(可能访问部分数据)、模型的架构、使用的优化算法以及权重和偏好。
- 黑盒攻击假设攻击者对 ML 系统一无所知(所以以上事情都没有)。它们可以有两种类型:硬标签(当攻击者仅从分类器接收到预测标签时)和置信度(当攻击者从分类器接收到预测标签以及置信度得分时)。
- 灰箱攻击位于中间。例如,攻击者可能知道模型是什么样子,但不知道底层数据是什么——反之亦然。
你也可能在科学文献中遇到类似于 NoBox 的术语。NoBox 指的是对代理模型的攻击,攻击者基于他们对目标 ML 系统的理解(无论多么有限)来重建代理模型。我不认为单独对此进行分类是有意义的,因为一旦攻击者建立了代理模型,它实际上就变成了白盒攻击。
经验法则:更多的知识=对攻击者更有利,对我们更不利(要了解更多,请参见我在闪避攻击上的帖子)。
限制指的是限制攻击者行为的某些规则。这些确实是 ML 系统特有的。例如:
- 在图像中,通常将扰动空间限制为“距离”度量,通常选自李、或规范。顺便说一下,这里有一个有趣的争论,关于这是否真的有意义(阅读这篇 33 页的白皮书了解更多)。
- 在恶意软件中,攻击者只能在某些地方以某些方式扰乱文件,否则它将失去其恶意功能或破坏所有文件。
- 在部署在物理设备(卫星、汽车、无人机、监控摄像机)上的系统中,攻击者可能被限制在修改物理域中的输入。
- 在训练时的攻击中,攻击者需要两件事情:a)系统基于新数据不断地重新训练(否则他们不能注入坏数据),以及 b)系统从外部来源获取数据,最好没有人在循环中批准它。
- 在隐私攻击中,通常攻击者需要一个没有查询限制的公共端点,并输出置信度得分。可信度分数特别严格,例如大多数反病毒产品只是告诉你他们认为文件是“恶意”还是“良性”,没有进一步的细节。
替代方案 —这是我想简要提及的最后一个方面。我曾经听一个做了 25 年保安的人用“电”来形容攻击者。他们总是选择阻力最小的道路。
这是一个很重要的标准,但我发现它经常被忽视,这个标准很容易建立或破坏威胁模型。攻击 ML 组件实际上是攻击者得到他们想要的东西的最简单的方法吗?例如,如果目标是侵犯隐私——他们会经历在你的分类器上构建影子模型的麻烦来获取数据,还是有更容易被利用的漏洞?
将这一切结合在一起
我给了你很多(事实上是我们 6 个月的研究和思考!).让我们一起来看看:
现在,让我们撒一些术语。
在对抗性 ML(ML 安全的学术方面)中,通常从“为什么”维度取“目标”,从“如何”维度取“时机”,来命名攻击。输出如下所示:
- 闪避攻击(也叫“对抗性例子”)绝对是最受欢迎的类型。它们发生在推理时,利用了 ML 固有的漏洞(或者是“特性”?🤔—阅读我在闪避攻击上的帖子了解一下。
- 中毒攻击发生在训练时间,可能有两个目标——完整性或可用性。攻击者可以在您的训练池中插入一些精心选择的示例,在其中构建一个“后门”(完整性),或者他们可以插入如此多的坏数据,以至于模型的边界基本上变得无用(可用性)。了解所有关于中毒机器的知识就在这里。
- 隐私攻击可能是最少被研究的,但尤其是在今天,一个极其相关的威胁。在这里,攻击者不想干涉你的机器学习模型的工作,相反,他们想从中提取私人的,可能是敏感的信息。在我的完整文章中阅读隐私漏洞和修复方法。
就是这样!希望到现在为止,你已经对如何考虑你的 ML 系统的弱点有了一些概念。
保持安全。
NumPy 会变成 Python 吗?
原文:https://towardsdatascience.com/will-numpy-become-python-3f7b4187d332?source=collection_archive---------3-----------------------
ython 是世界上最流行的统计计算语言。这很有趣,因为 Python 从未被设计成统计语言。虽然 Python 确实拥有一些功能属性,如无类计算,但 Python 在很大程度上是一种面向对象的语言,更类似于 C++这样的语言,而不是 r 这样的传统统计语言。考虑到这一点,Python 的代码库最初并不是为数据科学而创建的。
像 R,Julia,甚至 Go 这样的语言经常实现基函数和操作数来做线性代数。Python 的基础中缺少这些函数。如果您已经用 Python 做了一段时间的线性代数,那么您很可能已经在代码中断言了这个经典短语:
将 numpy 作为 np 导入
Numpy 将 Python 的统计能力从 20%提高到 100%。作为一名数据科学家,实际上很难避免使用 Numpy。Numpy 不仅具有 Python 语言所缺少的线性代数能力,而且还采用了许多有用的数学和数据管理特性,这是人们很难离开的。
不仅如此,Python 的数据表管理库 Pandas 也是基于 Numpy 构建的。这使得集成几乎无缝。Numpy 和 Pandas 以其稳定、强大的代码库使数据科学变得流畅。这个概念是 Python 在数据科学方面领先于许多其他语言的全部原因。包是简单的,无论如何也不会令人费解。
鉴于大多数高级语言都实现了自己的线性代数函数,Python 稍微低级一点,需要的不仅仅是单个操作数或函数,这似乎有点奇怪。
比较
那么,没有 Numpy,我们如何在数组之间进行数学运算呢?Python 与我们这个时代的其他统计语言相比如何?实际上,Python 的数组迭代非常棒。zip()函数使得同时遍历两个列表成为可能。
array = []for f, b in zip(array1, array2): res = f * b array.append(res)
尽管这在任何想象中都不难,但当我们将其与另一种语言(如 R 或 Julia)进行比较时,我们会遇到一种更简单的方法来获得两个数组的乘积。
以 R 为例:
array <- array1 * array2
r 使它变得容易;您可以将星号操作数用于数组乘法以及整数和双倍乘法。
在朱丽亚身上:
array = array1 .* array2
在 Julia 中,我们可以简单地在星号前面加一个点,使它成为。*,我们将两个数组相乘。
随着 Python 越来越成为一种统计语言,看看 Numpy 是否会成为基础语言将会很有趣。很明显,Python 在统计学中的使用将会影响更多功能特性渗入到语言中的可能性。尽管 Numpy 肯定仍然会提供许多重要的工具,但我无法想象这个基础语言不采用一些指针,而 Numpy 却不这么做。虽然像 Numpy 这样的工具可能已经在很多机器上使用了,但是需要一个包在一行中执行数组乘法确实让人感觉有点奇怪。
虽然 Numpy 的一些特性是否被压缩到 Python 基础中并不是什么大问题,而且 Numpy 肯定被视为 Python 的扩展,但我确实认为这个概念很有趣。事实上这是很有可能的,而且既然如此。虽然符合这一想法似乎是合理的,但也有很好的理由弃权。随着 Python 越来越广泛地用于数据科学,我们可能会看到一些迎合统计的特性。
人类及其栖息地会成为未来通信网络的一个组成部分吗?
原文:https://towardsdatascience.com/will-people-and-their-habitats-become-an-integral-part-of-tomorrows-communication-networks-1145c26f2072?source=collection_archive---------28-----------------------
2035 年电信网络愿景
由于固定和移动电信网络似乎随时随地围绕着我们,我们可以获得广泛的通信服务。我们与世界另一端的朋友、同事或家人视频聊天,我们远程控制(半)自主机器人(从吸尘器到工业机器人)。
但是这些网络应该如何发展才能满足 2035 年的需求呢?让我们区分网络支持:(1)人与人之间的交流;(2)工业应用;以及(3)人工智能。之后,我们将简要考虑 2035 年后的网络可能会是什么样子。
100 Mbps 的“人类带宽”
对许多人来说,宽带连接已经成为一种必然——就像电一样。然而,经常旅行或经常在路上的人会认识到,拥有稳定的宽带连接不应该是理所当然的。
因此,我们对 2035 年的第一个期望是,我们将最终设法建立一个大型、稳定的网络,以支持人与人之间的通信以及人机交互;一个不再是电信运营商今天喜欢吹嘘的千兆速度的网络,而是一个符合我们的“人类带宽”的网络。
毕竟,无论我们谈论的是人与人之间的交流还是人机交互,都仅限于我们的感官能够处理的内容。研究表明,人类的带宽大约等于 100 兆比特每秒(Mbps)。
换句话说:一个能够为每个用户提供连续、有保证的 100 Mbps 带宽的网络足以让我们的感官饱和。这样的网络应该在 2035 年成为现实。
当然,问题是 2035 年我们是否还会有同样的生理(感官)限制。也许我们也能找到解决这些问题的方法?想想被用来检测神经疾病的神经探针。在未来,我们可能能够利用这项技术在我们的大脑中创建直接的输入和输出通道,这意味着无线通信将有可能通过我们大脑中的神经探针实现。
但是:仅仅因为我们的大脑中有一个直接的输入和输出通道,并且可以,至少部分地绕过我们的感官,这并不意味着我们的大脑会自动拥有处理额外刺激的吸收能力。因此,即使在这种情况下,似乎也不需要超过 100 Mbps 的带宽(无论是明天还是 2035 年)。
对于那些不热衷于植入的人来说,智能隐形眼镜和增强现实眼镜肯定也可以提供额外的输入。然而,矛盾的是,这些眼镜将需要超过 100 Mbps!为什么?因为我们的感官需要“正确的”100 Mbps。想起下面这个比喻:人们常说一张图等于千言万语;然而,找到精确的 1000 个词来完美地描述一张照片要困难得多……我们的感官也是如此:2035 年的智能眼镜将不得不传输更多的“词”来为我们提供我们实际需要的数据……
然而,无论你认为最有可能发生的场景是什么,都不会有任何空间让那些经常掉线的联系存在——今天依然如此。因此,我们预计电信行业将继续投资于(小蜂窝)网络,这些网络可以有效地为每个人提供 100 Mbps 的均匀且有保证的速度;将人的带宽放在中心位置的网络,而不是今天的(峰值)速率。
面向工业 4.0 应用的灵活网络
在工业环境中,我们将面临“工业 4.0”的需求——由于广泛的数字化,其特征是新的生产方法、新产品和新的商业模式。
工业 4.0 概念的成功取决于我们能够灵活满足新需求和趋势的程度。因此,难以重新配置的有线环境有被淘汰的风险。然而,与此同时,Wi-Fi 等无线技术在具有大量反射的生产设施中往往不够可靠…
在工业环境中,我们需要一个稳定可靠的网络,保证每台机器的无线带宽约为 10 Mbps,并且延迟有限。
因此,在工业环境中,我们也必须转向能够提供有保证的同质覆盖的网络,而不是部署能够提供高峰值速率的不稳定网络。如果人们预计配备增强现实眼镜的人类同事也将在未来的工厂里走动,情况将尤其如此。5G、大规模 MIMO 和分布式大规模 MIMO 等技术可以在实现这一未来愿景方面发挥重要作用。
人工智能:关注能效
普遍的预期是,到 2035 年,人工智能(AI)将使我们的生活变得更加轻松,并将帮助我们在生活的各个方面做出更好的决定。但我们如何确保这一愿景成为现实?
秘方可能是“分发”情报。如果我们想以有效的方式引入人工智能,将所有的智能放在大型中央数据中心不是一个选项;当然不是在必须做出实时决策或需要快速预测的场景中,比如无人驾驶汽车。另一方面,你不能把智能放在设备本身(传感器等)。),因为它们的电池和存储容量有限。因此,智能必须放在所谓的网络“边缘”。
但是,即使将智能放在网络边缘可以确保没有过多的数据流通过网络(这将需要大量的能量和带宽),我们仍然需要将网络的能效提高 10 到 100 倍,以使可持续的人工智能变得可行。
我们可以通过优化电路和技术的设计,也可以通过开发更好的(数据)压缩技术来做到这一点。
人类及其栖息地会成为未来电信网络不可或缺的一部分吗?
我们刚刚描述的三个网络在 2035 年的共同点是,它们将不再使用最大容量和峰值速率等指标进行评估。更重要的考虑因素是可靠性、能效和有保证的带宽。
一个例外(尽管可能只有在 2035 年之后)将是必须支持真正沉浸式应用的网络,如全息显示和虚拟现实应用。这些应用将需要一个由非常小的蜂窝组成的网络,该网络能够以极其节能的方式在仅几米的距离内提供数十千兆位每秒(Gbps)的传输。想想 ATTO 科技。
Imec researchers at Ghent University are developing ATTO technology that enables mobile connections of 100 Gbps with a latency of less than 10 microseconds — at short distances.
现在,让我们来看看,从长远来看,我们将如何塑造这样一个世界。如果我们真的考虑未来(甚至超过 2035 年),我们将如何部署和管理所有这些无线蜂窝?今天,一些地区正在部署光纤网络来实现这一目标——但如何部署全球光纤网络,即使是在安装电缆非常昂贵和困难的地方?
也许大自然可以帮助我们。或许我们可以——例如通过基因操纵——培育出具有集成天线能力的杂交植物和灌木?
从长远来看,树根能包含有机穿过土壤的集成光纤电缆吗?
作为一个社会,我们必须真正接受蓝天思维,这主要是因为电信网络在未来将变得更加重要。事实上,这个想法不再是科幻小说:十年前,贝尔实验室/朗讯科技的研究人员已经试图开发一种海绵,它可以生长成光纤电缆来传输数据。当时,进一步的开发被证明在工业上是不可行的——但这个想法仍然很有趣。
Ten years ago, researchers from Bell Laboratories/Lucent Technologies already made an attempt to develop a sea sponge that grew into a fiber cable to transport data. (Copyright: J. Aizenberg / Lucent Technologies)
旁注:良好的连通性来换取关于你自己的信息?
拥有可靠的连接将是一件非常美妙的事情,但是总是有可能在那些可以使用它的人和那些不能使用它的人之间出现两极分化。换句话说:2035 年,世界上可能会有一些地方有很好的(尽管价格昂贵?)连接,以及其他没有连接的地方——或者人们根本负担不起良好连接的地方。这是否会导致未来大型零售商和服务提供商提供连接来交换你的信息?可能吧。
危险?无线大脑接口或智能隐形眼镜是为了交换连接而赞助的,这意味着那些“赞助商”可以看到你看到的一切,感受到你感受到的一切(并可以做出相应的回应)。这也可能意味着一个受赞助者商业利益控制的社会阶层出现了——而更富裕的阶层(可以为中立的连接付费)保留了其独立思考……一个噩梦般的场景?有可能——尽管另一方面,我们可以问问自己,这在今天还没有成为现实。此外,这种情况也促使我们考虑技术的社会影响…
隐私会继续让位于监控资本主义吗
原文:https://towardsdatascience.com/will-privacy-continue-to-take-a-backseat-to-surveillance-capitalism-9cd6fc6b597c?source=collection_archive---------29-----------------------
Photo by arvin keynes on Unsplash
快速的技术进步和数字经济日益紧密的联系正在彻底改变社会面貌。建国之初,开国元勋们最关心的问题之一就是政府对个人自由的威胁。开国元勋们在权利法案中加入了第四修正案,“人民的人身、房屋、文件和财产安全不受无理搜查和扣押的权利,除非有正当理由,否则不得侵犯”。创始人的意图已经争论了很久,但众所周知,这其中缺少的是来自私营部门的普遍隐私权。
在今天的数字经济中,经常听到“监控资本主义”这个术语。哈佛商学院教授肖莎娜·祖博夫写了关于这一现象的文章。祖博夫教授的解释是,这些新的私营部门的商业实践和技术挖掘用户的信息,“以预测和塑造他们的行为。”正如《纽约时报》所指出的那样,习惯的形成已经发展成为神经病学和心理学部门的一个主要研究领域。像 Target 这样的公司正在利用“将我们有意识和无意识的模式详尽地渲染到数据集和算法中”,这已经彻底改变了这些公司销售或营销其产品的方式。
祖博夫教授的分析暗示了这样一种信念,即消费者只不过是被硅谷那些实力雄厚、身价数十亿美元的大公司赶着走的“盲羊”。因此,祖博夫教授认为揭露这种技术并呼吁改革是她的道德责任,我倾向于同意这一点。罗伯特·爱泼斯坦博士提出了一个关于谷歌能力的类似理论,这可能证明了可能的“选举干预”我在另一篇名为“这就是谷歌如何破坏民主”的文章中讨论了谷歌的能力
毫无疑问,现代经济依赖于大数据和人工智能(AI)的使用。旧的制造业经济的日子已经一去不复返了,自动化消失了;今天,大多数公司依靠技术和人工智能进行创新。反过来,人工智能允许公司使用算法规则复制任务,有效地自动化曾经常见的工作。这种创新最好解释为创造性破坏的一部分。
算法是一套解决问题的规则。这些规则利用数据或信息来产生特定的结果。例如,在谷歌搜索中输入“大数据”这个词,结果会返回 69 亿个链接。“在不到一秒钟的时间里,[谷歌]算法整理了数千亿个网页,为用户找到最相关的结果。搜索算法通过使用排名系统来工作,该系统由‘一整套算法’组成,”我在 中 写道。这仅仅是一个例子,但是我们每天都会遇到这种算法。
祖博夫教授将监督资本主义定义为“单方面声称私人人类经验是转化为行为数据的免费原材料。然后,这些数据被计算并打包成预测产品,出售给行为期货市场。”
祖博夫教授将监督资本主义定义为“单方面声称私人人类经验是转化为行为数据的免费原材料。然后,这些数据被计算并打包成预测产品,出售给行为期货市场。”YouTube 搜索结果最能描述这种现象。用户将会注意到,在观看了关于他们偏好的视频之后,类似的内容将会被推荐给该用户。YouTube 通过广告创收,广告在视频播放前和播放过程中播放。用户在 YouTube 平台上花费的时间越多,YouTube 产生的收入就越多。这种市场转让的独特之处在于,用户向 YouTube 提供的只是他们的屏幕时间,而不是付费使用服务。
This interview inspired my research into the topic.
这种现在常见的市场转移是祖博夫教授主张的基础。通过技术进步,市场现在已经找到了更多的方法来将消费者的个人信息货币化,并预测未来的结果。例如,智能手表是一种技术娴熟的计时器,可以测量你的心率,跟踪你的健身情况,回复短信和电话,并可以为你指明方向。您输入此设备的信息可能会与医疗保健提供商、营销公司和其他第三方服务提供商共享。你有没有在搜索引擎上搜索某个产品,发现那个产品在不同的平台上给你做了广告?这正是祖博夫教授所批评的框架。
物联网 (IoTs)指的是能够“通过现有的互联网基础设施”连接到其他设备的“日常设备”物联网和当今其他技术先进的产品确实包含内在风险。几乎每个新产品中都有摄像头、摄像机、麦克风和数据收集功能,我们的世界很容易受到持续监控。最近,联邦调查局警告关于“智能电视”能够监控你。类似的故事暴露了亚马逊的 Echo 服务监听消费者的私人谈话。《纽约时报》的一篇文章展示了塔吉特百货是如何给消费者分配一个独特的代码,也就是所谓的客人 ID 号,来“记录他们购买的所有东西”从本质上来说,这个分数成了塔吉特百货的一种“社会信用分数”。在我们的建国之初,从来没有考虑到这种风险,今天,几乎没有法律规定这种服务的合法性。政府监控受一套完全不同的法律管辖。
随着 2001 年 USA PATRIOT 法案的通过,政府监控成为了一个非常真实的现象。关于这种监控工具的合宪性的问题依然存在,关于联邦调查局滥用《T2 外国情报监控法》(T3)(FISA)程序的披露只会增加怀疑。其他问题围绕着众议员亚当·希夫对记者约翰·所罗门、众议员德文·努内斯和总统的两名律师的电话记录的传唤(这些人都是长期受到“特别规则”待遇的个人)).
从本质上说,FISA 程序允许联邦政府在证明违反美国法律的可能原因后,监视或用通俗的话说,间谍,那些被怀疑为外国势力代理人的美国公民的通信。FISA 授权了一大堆程序,但最相关的是 PRISM。PRISM 利用互联网基础设施上的通信框架来搜索特定的关键术语。立法者打算通过法规和标准操作程序来设置足够的安全措施,以遏制非牵连个人被卷入互联网“搜索网”的可能性。因此,情报部门的任务是实施最小化程序。
司法部监察长最近的报告证实了隐私倡导者的观点,即“FISA 法律下的监控行为……缺乏足够的监督和透明度。”纽约时报在一篇标题为的文章中展示了这份报告的含义,“我们刚刚难得一见国家安全监控。太难看了。”不幸的是,指导私营部门监督的参数很少。
许多消费者隐私/倡导团体(美国公民自由联盟、电子隐私信息中心和电子前沿基金会)存在,以对抗隐私滥用或不公平。例如,电子隐私信息中心 (EPIC)致力于“公众关注新出现的隐私和公民自由问题,并在信息时代保护隐私、言论自由和民主价值观。”这些组织经常对公共和私营部门涉嫌滥用职权提起诉讼;他们也是《信息自由法》( FOIA)程序的积极使用者,该程序在适当的时候规定了政府的透明度。
如今,这些消费者隐私组织和美国联邦贸易委员会仍然没有一个全面的框架来解决私营部门层面的监控问题。虽然美国情报界受限于《外国情报监视法》( FISA)和其他相关法律规定的参数,但更广泛的私营部门并没有得到很好的控制。比如面部识别技术就特别有意思。很明显,我们面部的轮廓是高度个性化的,并且在很大程度上是独一无二的。假设一家拥有面部识别技术数据的公司被入侵,该如何处理这些信息?这是一个极其微妙但又至关重要的话题。一些市政当局完全禁止这项技术,而另一些则考虑效仿。这就提出了面部识别技术是否有任何社会效益的问题。Snapchat 使用这种技术来创建用户个人的过滤器。这是否构成了我们打算禁止的那种“恶意”使用?不太可能。
China is an example of a digital authoritarian state.
如果香港抗议者教会了我们什么的话,那就是为了“公众利益”而警惕监视。华尔街日报* 写道“摄像头实时输入政府数据库,在复杂的面部识别软件的协助下,中国政府最终希望能够在任何事情发生的三秒钟内识别出任何地方的任何人。”这些建议是为了防止犯罪而制定的。*
美国的公共监控有所不同。一般来说,公众不赞成侵犯隐私。最近,美国最高法院在 Kansas 诉 Glover一案中接受了调卷令,EPIC 已经提交了一份法庭之友书状。EPIC 警告说,这一决定会对下游产生重大影响,特别是“当与自动车牌阅读器结合使用时”就本条而言,案件的关键在于警官是否“合理怀疑”司机没有有效的驾驶执照。这名警察没有看到任何交通违规行为,但是,他在假定车辆登记所有人正在驾驶车辆的情况下,启动了交通拦截。隐私倡导者担心,自动车牌阅读器可能会导致执法部门在没有观察到交通违规的情况下拦截司机。在这种情况下,使用执法监控工具可能会以牺牲自由为代价阻止犯罪。**
“智慧城市”的概念也存在类似的问题正如福布斯杂志所描述的,智能城市将“基础设施和技术结合在一起,以提高市民的生活质量,增强他们与城市环境的互动。”“智能城市”依赖于无线网络的速度,这就是为什么许多隐私倡导者对 5G 网络持谨慎态度。该提案旨在改善公共交通,有效监控“实时能耗数据”,并“提供准确的交通报告”。
谷歌已经提议在多伦多创建一个真正的“智能城市”。前谷歌高管埃里克·施密特(Eric Schmidt)在宣传让谷歌掌管一座城市的所有好处时,深情地谈到了这个想法。随着时间的推移,随着顾问和合作者的辞职,问题越来越多。一位合作者称谷歌项目为“智能监控城市”,而不是“智能隐私城市”。她的评论是因为有消息称,这个名为 Quayside 的谷歌“智能城市”将允许第三方“访问在 Quayside 收集的可识别信息”。
码头区虽然位于多伦多,却是“监视资本主义”问题的典型。与欧盟不同,美国没有一个全面的法律框架来管理信息的传播、披露和收集,除了管理特定部门和加利福尼亚州的法律之外。隐私辩论中一个令人惊讶的盟友是特朗普政府的司法部。2019 年 12 月 10 日,华盛顿邮报 报道司法部长威廉·巴尔正在探索“新的法律工具来调查公司侵犯隐私的行为以及他们监管在线内容的方式。”似乎司法部打算审查硅谷的大公司;然而,这并没有解决问题的根本原因:公司的信息共享和收集做法。
随着技术通过物联网在社会中变得更加普遍和根深蒂固,管理数据处理和控制的合法框架将是至关重要的。其中一个建议是将社交媒体公司或信息服务提供商视为法律认可的受托人,它们“有义务行使忠诚和谨慎。”这是耶鲁大学法学教授杰克·巴尔金的“信息信托理论”其目的是对特定公司进行监管,就像它们是法律认可的受托人一样,这些公司在保留产生利润的动机的同时,按照消费者的利益行事。这种激励结构将我们引向正确的方向,但最好使用同意、限制收集、准确性和透明度的公平信息原则来补充。隐私倡导者担心,如果没有足够的参数,美国私营部门可能会开发出中国社会信用评分系统 (SCS)的私人版本。
如今,私营部门的监控设备越来越多,并且出现了独裁政府滥用这些设备的例子,难怪许多人担心这些工具可能会被滥用。毕竟,纳粹政权对权力的滥用让位于现代德国对隐私的过度关注。这种威胁被称为“数字威权主义”,随着全球民粹主义运动的兴起,这种威胁正在加剧。
在美国,我们很幸运,第四修正案保护我们免受政府对我们生活的侵扰;然而,这种保护只有在争取的时候才有保障。隐私专家和公民自由主义者不仅要关注政府的监控,还要关注私人公司可能的监控。服务提供商、州立法者、国会和专家必须确定如何对这些工具的感知优势进行成本效益分析,同时将侵入性降至最低。一个很好的起点是关于信息收集实践和用户同意的严肃辩论。在爱德华·斯诺登揭发了联邦政府的做法后,我们必须再次重新开始这场辩论,以解决当前做法的不公平性。
Mitchell Nemeth 拥有佐治亚大学法学院的法学硕士学位。他还拥有佐治亚大学的 BBA 金融学位。他的工作已经在经济教育基金会、梅里恩·韦斯特和红色&黑色杂志上发表。他最喜欢的作家是乔纳森·海特教授、马特·泰比和托马斯·索维尔。
科学研究能够避免人工智能陷阱吗?
原文:https://towardsdatascience.com/will-scientific-research-be-able-to-avoid-artificial-intelligence-pitfalls-b818e96c0cdd?source=collection_archive---------11-----------------------
现在很明显,人工智能、机器学习和深度学习不再是热门词汇,因为它们越来越多地出现在每个行业。尽管这一趋势在 2017 年被夸大了,但我们现在可以肯定,到 2020 年,这些技术将无处不在。
科学研究并没有落后,人工智能已经成为这一领域重大变革的导火索。机器学习技术,如医学图像处理、通过分割的生物特征识别和基于人工智能的医疗诊断,被健康研究人员以不加批判的方式正式采用。
AI 造成的这种颠覆性效果,终于很简单理解了。机器学习模型遵循一个不可避免的黄金法则:我们能提供给它们的(无偏见的)数据越多,它们就变得越准确和可靠。对于研究人员来说,高性能计算和大数据的融合似乎是圣杯,也是新发现的唯一可能途径。最近的一个例子加强了这一观点,在我们的星系中心发现了数千个黑洞——不是通过望远镜发现的,而是通过分析近 20 年前收集的长期存档数据发现的。
这种吸引力甚至不是一种趋势。在这些技术面前后退会被认为是一种科学蒙昧主义。我们进入了一个数据似乎能解答一切问题的时代。人类——尤其是研究人员和科学家——更倾向于相信其他人当中实验次数最多的代理人,这是完全合理的。让我们假设这样一种情况,你因为一个可能很严重的健康问题而不得不去看医生,你可以选择咨询一位有 20 年经验的著名专家,或者一位刚入行的年轻医生。你会看到谁?毫无疑问,我们都会选择第一个方案,我们将是正确的。
然而,休斯顿莱斯大学的 Genevera Allen 博士最近通过提出了关于可重复性和缺陷模式的问题,引起了科学界的警觉。根据 Steven N. Goodman、Daniele Fanelli 和 John P. A. Ioannidis 给出的定义:
“方法再现性是指捕捉再现性的原始含义,即尽可能精确地实施实验和计算程序,使用相同的数据和工具,获得相同结果的能力。”
再现性和重复性是验证任何关键研究结果的必要组成部分,忽视这些步骤会严重损害任何从科学经验中得出的假设或结论。这个问题可以通过分析大量数据得到部分解释,在这些数据中检测无意义模式的概率相当高。尽管存在一些实践来通过计算相关模式(与真实世界相匹配)应该被检测到的频率来防止这种复杂性,但是该指标类似于真正的正阈值,是不可靠的。最终,统计方法不适合成功地解决这个问题。只要人工智能代理既没有知识也没有世界模型,他们就不可能区分无意义和相关的模式。
为了更进一步,提到科学研究中最抽象的领域,也就是理论领域,会很有意思。让我们准确地以一个子领域即理论物理为例。这一研究领域旨在探索、描述和理解我们世界的性质,如地球上的物理现象、原子和分子的内部结构以及研究宇宙起源和演化的量子力学和宇宙学。与实验物理不同,理论物理的研究只能通过使用高度分析的概念和方法,通过将物理现象转化为数学模型来进行。
在最近一篇标题为“人工智能能解决爱因斯坦不能解决的问题吗”的文章我们可以读到:
“因此,像普朗克、爱因斯坦、海森堡、薛定谔、狄拉克等名字经常被誉为我们这个时代最伟大的科学天才。毫无疑问,他们解决了一些极其复杂的问题,而且做得非常出色。但人工智能很可能会做得更好。”
我们是 2019 年,我个人不同意这个观点。我会重新表述,我的问题会变成:“人工智能也能解决爱因斯坦能够解决的问题吗?”
我只能同意这样一个事实,即机器学习和深度学习在分析大量数据时,以前所未有的速度找到相关性、可能的因果关系、以前未知的相关模式以及所有这些,对于许多任务来说,效率惊人——但我们也必须说,我们距离希尔伯特·西蒙在 1956 年达特茅斯学院(Dartmouth College)的一次动员会上的预测仍然非常远,他宣布能够挑战人类思维的思维机器“指日可待”。
我甚至不打算提到当我们不满足深度学习神经网络的过度数据胃口或当我们向它们提供有偏见的数据时,深度学习神经网络往往会以惊人的方式失败的情况。但是,即使是最好的人工智能仍然缺乏被认为是真正智能的基本要素。人类可以从事推理,因为他们有常识。由于这一点,他们可以对周围的世界进行逻辑推理。机器不会。
一个真正的人工智能应该能够转移它的学习和智能来解决一个它没有被训练过的问题。 DeepMind,一家目前由谷歌拥有的英国人工智能公司强调了他们在游戏 Breakout 的实验中的差距。经过训练后,DeepMind 的人工智能知道如何正确地玩游戏,但事实证明,如果我们仅仅通过在积木中心添加一个牢不可破的区域来稍微改变规则,人工智能会非常缓慢地适应这些变化。在适应新的游戏配置时,人类玩家仍然比机器强。
但我想强调的主要问题是,人工智能无法生成一个假设,规定无法给出预期(最准确)的答案,因为解决问题的更多相关数据可能不会出现在训练数据集中。这正是为什么当想象一个具有高度抽象的人工智能时,它不可避免地会导致怀疑。深度学习不是深度理解的同义词,没有机器学习能够超越我们提供给它们的训练数据。
而且总的来说,AI 最大的死胡同就是一个 AI 不知道它不知道。
爱因斯坦没有数据,最重要的是,没有方程可解——他证明了麦克斯韦方程没有解,并由此开始概念化和介绍狭义和广义相对论。正如你所猜测的,即使我们将与麦克斯韦电磁理论(被认为是爱因斯坦推理的起点)相关的大量数据提供给最先进的 AI,也显然不可能获得作为输出的新的空间和时间概念。
唯一剩下的希望是,明天的伟大头脑将有后知之明,并有能力超越现有的工具,以抵御所有的恐惧,继续被锁定在一个既有希望又没有成果的系统中。
参考资料:
艾琳·迈耶,为天文学的下一个重大发现挖掘长期存档的数据(2018 年 5 月 15 日),thewire.in
Pallab Ghosh,美国科学促进会:机器学习‘引发科学危机’(2019 年 2 月 16 日),bbc.co.uk
伊森·西格尔,人工智能能解决爱因斯坦不能解决的问题吗?(2018 年 5 月 2 日),forbes.com
wired.com,Clive Thomson,如何教授人工智能常识(2018 年 11 月 13 日)
明天太阳会升起吗?机器学习的贝叶斯统计导论
原文:https://towardsdatascience.com/will-the-sun-rise-tomorrow-introduction-to-bayesian-statistics-for-machine-learning-6324dfceac2e?source=collection_archive---------8-----------------------
你有没有问过自己,以前从未发生过的事件发生的概率是多少?
在本文中,我们将深入探讨贝叶斯统计的神秘世界,以及它的一些原则,如伯恩斯坦-冯米塞斯定理和克伦威尔法则,如何能够有助于分析现实世界的机器学习问题。
“贝叶斯统计在思考困难的意义上是困难的” —唐·贝里
如果你想深入研究贝叶斯统计背后的数学,这里不是你要找的地方(尽管我以后会发表这方面的文章)。这篇文章主要是向不熟悉这个概念的人介绍贝叶斯方法。
想象一下,你正在设计一座核电站。您的任务是使用数据来确定工厂是否正常运行。这可能看起来是一个相对简单的任务,直到你意识到你实际上没有任何关于核电站发生核泄漏时的数据。你怎么能预测这样的事情呢?
如果你是一个精明的机器学习专家,你可能会建议某种无监督的方法,如(受限的)玻尔兹曼机器,它能够学习“正常”的电厂是什么样子,从而知道什么时候事情有点不对劲(事实上,这是人们预测核电厂正常运行条件的一种方式)。
然而,如果我们从一个更普遍的意义上来思考这个问题,当我们几乎没有或者根本没有反面的例子来比较时,我们该怎么办呢?发生这种情况有几个原因:
- 该事件的概率如此之低,以至于在(有限的)样本数据中根本没有观察到该事件发生。(低概率场景)
- 观察到了,但很少。(数据稀疏场景)
- 失败的结果将是灾难性的,它只会发生一次,例如,太阳的毁灭。(大灾难场景)
传统统计学不太适合这类问题,通常需要不同的方法。
一个更普遍的问题是,我们如何处理极低(但严格非零)或极高(接近 1 但严格不是 1)的概率?让我们先来看几条规则,这些规则是为了研究数学家皮埃尔·西蒙·拉普拉斯提出的一个著名问题而开发的。
日出问题
想象有一天早上你醒来,太阳决定休息一天。这不仅(很可能)会毁了你的一天,打乱你的生物钟,还会直接改变你对太阳的感觉。你会自然而然地更有可能预测到也许第二天太阳也不会升起。或者,如果太阳只是度过了糟糕的一天,第二天又回来了,你对太阳会再次休息一天的预期会比之前高得多。
这里发生了什么?基于新的证据,我们改变了对事件发生概率的看法。这是所有贝叶斯统计的关键,并使用一个称为贝叶斯规则的等式进行正式描述。
贝叶斯法则
贝叶斯法则告诉我们,我们必须从某个事件发生的内在概率开始(在事实发生之前)。我们称之为先验概率。随着新的观察和证据不断呈现在我们面前,我们会基于对证据的观察和对当前立场可能性的判断来更新我们的信念。这个更新的信念被称为后验概率(在事实之后)。
回到我们的日出问题,每天我们都观察到太阳升起,每一次太阳升起我们都更加确定第二天太阳还会升起。然而,如果有一天我们发现太阳没有升起,这将极大地影响我们基于新证据的后验概率。
这在数学上表达为以下形式,乍一看令人望而生畏,但可以抽象出来:我们更新的信念是基于我们最初的信念和基于我们当前信念呈现给我们的新证据(可能性)。可能性表示我拥有的新证据,我的信念正确的可能性有多大?如果我相信明天太阳不升起的概率是百万分之一,然后它发生了,那么我的信念(我的模型)是错的可能性就很大,后验概率会更新预测它再次发生的可能性更大。
Bayes’ theorem.
这是一个非常漂亮的想法,它存在于许多不同的地方,尤其是当它涉及到人类和他们的信仰时。例如,假设你的朋友发信息告诉你,你最喜欢的一个名人去世了。最初,你可能会感到不安,还有点怀疑。当你开始你的一天时,你读报纸,它告诉你这个名人去世了,这种信念会进一步加强。也许你会在电视上看到新闻中对他们哀悼的家人的采访,你的信念会更加坚定。然而,如果你在电视上看到那个人正在接受采访,关于他们已经死亡的谣言正在传播,你对你朋友告诉你的事情的信任就会降低。
这是科学的一个重要方面,理论是通过实验和模拟来证明的,做这些实验和验证理论的人越多,这些理论就越可靠和可信。然而,举例来说,一些信教的人可能决定他们不需要经验证据(至少是同类的)来相信某件事,我们称之为信仰。
有趣的是,我们日常生活中如此普遍的东西对统计学和机器学习来说是如此重要,但它确实如此,我们将讨论为什么。然而,首先,我们需要看一下贝叶斯定理在极低概率下出现的一些问题。
克伦威尔法则
奥利弗·克伦威尔是英国历史上的杰出人物,他在 1658 年的苏格兰教会大会上说了一句名言
"我以基督的名义恳求你,想想你可能弄错了。"
这个短语的使用导致了丹尼斯·林德利(Dennis Lindley)对克伦威尔法则(Cromwell's rule)的定义,它提出了一个想法,如果一个人以等于零(我知道某事不是真的)或一(我知道某事是真的)的先验概率开始,那么不管向你展示什么证据,你的信念都不会被动摇。
这向我们展示了绝对主义观点的危险,当我们看待可以通过经验观察到的事物时。如果我坚信自己是对的,那么无论任何人说什么或做什么都无法说服我。这是无知的高度,而不是我们想要纳入机器学习模型的东西。如果我们回头看看贝叶斯定理,我们可以看到为什么会这样,如果我们的先验概率是零,那么乘以任何东西,我们的后验概率仍然是零。
原则上(参见克伦威尔法则),没有任何可能性的概率应该被设置为零,因为在物理世界中没有什么是绝对不可能的(尽管它可能是),即使与所有的观察和当前的理论相反。
这种情况发生的理想例子是在神经网络中。当你启动一个神经网络时,你的节点从一些固有值开始。如果将这些节点的权重都指定为零,则这些节点将无法自我更新,因为梯度下降算法的所有迭代都将乘以零。相反,会进行随机初始化(通常用户看不到),这通常可以防止此类问题。
贝叶斯定理的另一个有趣的性质来自于我们对无数次观察后发生的事情的观察,这通常被称为伯恩斯坦-冯米塞斯定理。
伯恩斯坦-冯·米塞斯定理
简而言之,伯恩斯坦-冯·米塞斯定理告诉我们,随着我们获得更多的数据,我们的后验估计将渐近独立于我们的初始(先验)信念——当然,假设它遵循克伦威尔法则。这在某种程度上类似于频率统计中的法律数字定律,它告诉我们,随着我们获得越来越多的数据,样本的均值最终将与总人口的均值相同。
那么贝叶斯统计和正态统计有什么大的区别呢?为什么机器学习专家和数据科学家需要贝叶斯统计?
贝叶斯统计 vs 频率统计
对于那些不知道贝叶斯和频率主义是什么的人,让我来解释一下。频率主义者从频率的角度来看待数据。例如,假设我有一个两面都有头像的硬币。我掷硬币 10 次,10 次都是正面。如果我取所有掷硬币的平均结果,我得到 1,表明我的下一次掷硬币有 100%的机会是正面,0%的机会是反面,这是一种频率主义者的思维方式。
现在从贝叶斯的角度来看。我从一个先验概率开始,我选择 0.5,因为我假设硬币是公平的。然而,不同的是我选择如何更新我的概率。在每次抛硬币后,我会看看我的下一次观察有多大可能是给定我当前的信念(我有一个公平的硬币)。渐进,当我翻转更多的头时,我的概率将趋向于 1,但它永远不会明确地为 1。
贝叶斯方法和频率主义方法的根本区别在于随机性出现在哪里。在 frequentist 域中,数据被认为是随机的,而参数(如平均值、方差)是固定的。在贝叶斯领域,参数被认为是随机的,数据是固定的。
我现在很想强调一点。
它不叫贝叶斯,因为你使用了贝叶斯定理(在频率主义者的观点中也经常使用)。
它被称为贝叶斯,因为等式中的术语有不同的潜在含义。然后,从理论差异来看,你最终会得到一个非常有意义的实际差异:之前你只有一个参数作为你的估计器的结果(数据是随机的,参数是固定的),现在你有了参数的分布(参数是随机的,数据是固定的),所以你需要积分来获得数据的分布。这是贝叶斯统计背后的数学比正常统计更混乱的一个原因,人们必须求助于使用马尔可夫链蒙特卡罗方法从分布中取样,以便估计难以处理的积分的值。其他俏皮的技巧,比如无意识统计学家法则(多棒的名字,对吧?),又名。LOTUS 可以在数学方面提供帮助。
那么哪种方法论更好呢?
这些方法本质上是一枚硬币的两面(双关语),它们通常给你相同的结果,但它们实现的方式略有不同。谁也不比谁强。事实上,我在哈佛的班上甚至有教授经常争论哪个更好。普遍的共识是“这取决于问题”,如果有人认为这是共识的话。就个人而言,我发现贝叶斯方法更直观,但其背后的数学远比传统的频率主义方法复杂。
现在你(希望)明白了其中的区别,也许下面的笑话会让你发笑。
Bayesian vs frequentist joke.
什么时候应该使用贝叶斯统计?
贝叶斯统计包含一类可用于机器学习的特定模型。通常,人们出于一种或多种原因利用贝叶斯模型,例如:
- 具有相对较少的数据点
- 对事物如何运作有很强的直觉(来自已有的观察/模型)
- 具有高度不确定性,或强烈需要量化特定模型或模型比较的不确定性
- 想要声明关于替代假设的可能性,而不是简单地接受/拒绝零假设
看着这个列表,你可能会认为人们会一直想要在机器学习中使用贝叶斯方法。然而,事实并非如此,我怀疑机器学习的贝叶斯方法的相对缺乏是由于:
- 大多数机器学习都是在“大数据”的背景下完成的,其中贝叶斯模型的签名——先验——实际上并没有发挥多大作用。
- 在贝叶斯模型中采样后验分布在计算上是昂贵和缓慢的。
我们可以清楚地看到,频率主义者和贝叶斯方法之间有如此多的协同作用,特别是在大数据和预测分析变得如此突出的今天。我们有各种系统的大量数据,我们可以不断地对系统进行数据驱动的推理,并随着越来越多的数据可用而不断更新它们。由于贝叶斯统计提供了更新“知识”的框架,事实上,它在机器学习中被大量使用。
一些机器学习技术,如高斯过程和简单线性回归,有贝叶斯和非贝叶斯版本。也有纯粹的频率主义算法(如支持向量机,随机森林),和纯粹的贝叶斯算法(如变分推理,期望最大化)。了解何时使用其中的每一项,以及为什么会这样,才能让你成为一名真正的数据科学家。
你本质上是贝叶斯主义者还是常客?
就我个人而言,我不属于这个或那个阵营,这是因为有时我在具有数千个特征的数据集上使用统计学/机器学习,而我对这些特征一无所知。因此,我没有事先的信念,贝叶斯推理似乎不合适。然而,有时我有少量的特征,并且我对它们了解很多,我希望将它们纳入我的模型中——在这种情况下,贝叶斯方法将为我提供更多我信任的结论性区间/结果。
我应该去哪里了解贝叶斯统计的更多信息?
有几个很棒的在线课程深入研究了机器学习的贝叶斯统计。我推荐的最佳资源是我在哈佛上的 AM207 课程:高级科学计算(随机优化方法,用于推理和数据分析的蒙特卡罗方法)。你可以在这里找到贯穿这些技术[的所有讲座资源、笔记,甚至 Jupyter 笔记本。](http://Advanced Scientific Computing: Stochastic Optimization Methods. Monte Carlo Methods for Inference and Data Analysis.)
这里的也是一个很棒的视频,它讲述了贝叶斯和频率主义领域之间的转换(在视频中大约 11 分钟)。
如果你想成为一名真正伟大的数据科学家,我建议你牢牢掌握贝叶斯统计以及如何用它来解决问题。这个旅程很艰难,而且是一个陡峭的学习曲线,但这是将你与其他数据科学家区分开来的一个很好的方式。根据我与参加数据科学面试的同事的讨论,贝叶斯建模是经常出现的事情,所以请记住这一点!
时事通讯
关于新博客文章和额外内容的更新,请注册我的时事通讯。
[## 时事通讯订阅
丰富您的学术之旅,加入一个由科学家,研究人员和行业专业人士组成的社区,以获得…
mailchi.mp](https://mailchi.mp/6304809e49e7/matthew-stewart)
你的年收入会超过 5 万美元吗?机器学习可以分辨
原文:https://towardsdatascience.com/will-your-income-be-more-than-50k-yr-machine-learning-can-tell-92138745fa24?source=collection_archive---------6-----------------------
Photo by Artem Bali on Unsplash
机器学习正在包括金融在内的众多领域取得突破。如果我们可以使用机器学习模型来识别个人的收入,会怎么样?我找到了最合适的数据集,叫做人口普查收入数据集。我使用数据集中的信息来预测某人的年收入是否会超过 5 万美元。
我从 UCI 机器学习知识库中收集数据,然后逐个解释每个特征。我使用了几个机器学习模型,得出的结论是准确率为 84.27% 和 F1 得分为 0.65 ,使用梯度增强分类器和最大曲线下面积为 0.90 。您可以在 GitHub 链接中找到完整的代码。
[## kb22/收入预测值
该项目涉及使用人口普查收入数据集上的机器学习来预测收入是高于还是低于 5 万美元每…
github.com](https://github.com/kb22/Income-Predictor)
探索数据集
数据集描述
数据集的目标是收入。所以,首先我用LabelEncoder
把它转换成0
和1
的标签。接下来,我使用dataset.info()
探索数据集。
看一下输出,很容易看出整个 datatset 中共有 32561 个数据点。此外,似乎没有任何列缺少任何值。
连续特征与目标变量的关系
对于所有连续的特征,我绘制直方图。我使用的栏目是“年龄”、“最终体重”、“教育人数”、“资本收益”、“资本损失”和“每周小时数”。
从上面的直方图中,我推断出以下几点:
- 我可以将年龄列分组到箱中。
- 对于资本收益和资本损失,数据严重左倾,需要解决。
- 我们需要进一步分析教育数字,因为它可能与教育信息一致。
- 最终重量也向左倾斜。
- 每周的小时数也可以分成几个时间段。
然后,我用相关矩阵来确定它们与收入的关系。
看一下上面的相关矩阵,很明显,任何连续特征和目标变量之间都没有高度的线性相关性。此外,Final Weight
与输出类没有任何关联,因此,我稍后将删除这个专栏。
处理数据集
一旦我对数据集有了一些了解,我就可以单独研究每个特性及其与目标列分布的关系。
年龄
我决定为Age
— 0-25
年创建三个桶,分别为Young
、25-50
、50-100
和Old
。
与Young
和Old
相比,数据集中有更多的Adult
。此外,收入超过 5 万美元的人相对较少。
资本收益和资本损失
由于两者相关,我从Capital Gain
中减去Capital Loss
,并将值保存为Capital Diff
。在分析数据时,我创建了两个桶,5000 美元到 5000 美元和 5000 美元到 100000 美元作为Minor
和Major
。
看一下结果,我可以看到Minor
有更多的人收入低于 5 万美元,而Major
有更多的人收入高于 5 万美元。这与以下事实完全一致:与Capital Loss
相比Capital Gain
较大的人Income
拥有超过 50K 美元。
最后体重
如上所述,我删除了Final Weight
一栏。
每周小时
考虑到通常的工作时间范围是 30-40 小时,我为不同的时间创建了时段。0-30
为Less Hours
,30-40
为Normal Hours
,40-100
为Extra Hours
。
随着人们花更多的时间工作,他们可能会得到加班收入。这也与数据一致。拥有Extra Hours
的人往往拥有更高比例的年薪超过 5 万美元的人。
工作类
这个特征定义了个人的工作阶级。我从绘制Countplot
开始。
看一下上面的图,我可以看到有被定义为?
的Work Class
值,这似乎是错误数据。尽管我们最初确定没有丢失数据值,但我们个别地发现一些数据可能是错误的。我之所以能发现这一点,是因为我逐一分析了每个特征。
由于这些错误的数据非常多,我将简单地删除这些记录。同样,两个值Without-pay
和Never-worked
可以忽略不计,因此也可以安全地删除它们。
教育和教育编号
我的第一个想法是检查Education
和Education Number
之间是否有关联。对于Education
的每个值,我都检查了对应的Education Numbers
。
我发现了Education
和Education Number
之间的一一对应关系。我决定放弃Education Number
专栏。此外,我开始进一步分析Education
列的值。我综合了从学前班到 12 年级的所有信息,因为他们可以被认为是一个没有受过大学教育的班级。
婚姻状况和关系
两者都没有缺失值。两者之间有一些重叠,例如,如果一个人是丈夫或妻子,那么他们的婚姻状况应该是已婚。然而,由于没有完全重叠,我将保留这两列。
职业
我也为这个特性绘制了Countplot
。
正如我们所看到的,不同职业的收入分配是不同的。类别已经是唯一可识别的了,我会保持原样。
人种
数据集包括关于White
种族的大部分信息,而所有其他种族的数量较少。我将把所有其他比赛数据合并到一个类中作为Other
。
性
从上面的情节可以清楚地看出:
- 男性参与者比女性参与者多
- 当我们比较两种性别和相应的收入分配时,男性收入超过 5 万美元的比例高于女性
国家
我注意到两件事:
- 由
?
表示的国家/地区列中有一些缺失值。由于它们非常少,我将删除这些行。 - 大多数成年人来自美国。因此,我们可以将列的值分配为
United-States
或Other
。
数据操作
使用 pandas 方法get_dummies
,我将所有的分类列转换成基于它们的类的单独的列。这将总功能提升至56
。
我用 70%的训练数据和 30%的测试数据将数据集分成训练和测试两部分。
应用机器学习
在创建的训练和测试数据上,我决定应用 5 个机器学习模型:
- 高斯朴素贝叶斯
- 支持向量分类器
- 决策树分类器
- 随机森林分类器
- 梯度推进分类器
为了评估这些车型,我计算了 F1 的分数。
基于以上结果,梯度推进分类器表现最好,F1 值最高0.65
。
分析结果
一旦有了基本指标,我决定使用精确度图和 ROC 曲线进一步分析它们。
准确度图
我计算了测试数据的准确性,并在此基础上创建了一个条形图。
如上图所示,梯度提升分类器的准确率最高,为 84.27% 。
受试者工作特征曲线
作为一个分类问题,我决定使用 ROC 曲线来检查哪个分类器表现最好。
决策树分类器似乎具有最低的曲线下面积。梯度推进分级机在这里再次表现最佳,最大曲线下面积为 0.90 。
结论
在本文中,我处理了人口普查收入数据集,并逐一分析了每个特征。最后,我应用各种机器学习模型从数据中学习并做出预测。
我学到的重要事情
- 相关矩阵可以揭示不相关的特征,我们可以删除它们
- 虽然可能没有丢失的数据,但也可能有错误的数据。在这个例子中,我们有一些字段为
?
- 应用多个机器学习模型可以帮助我们选择一个在当前场景下表现最好的模型,因为没有一个模型适合所有人
- 我们可以使用多个指标来确保模型正确运行,并且不会过度拟合数据
非常感谢您阅读完整的文章。我很乐意收到你的来信。请分享你的想法、想法和建议,或者通过 LinkedIn 联系我。
阅读我的其他文章:
[## 使用机器学习预测心脏病的存在
机器学习在医疗保健中的应用
towardsdatascience.com](/predicting-presence-of-heart-diseases-using-machine-learning-36f00f3edb2c) [## 让我们使用 LDA 构建一个文章推荐器
基于搜索查询推荐文章
towardsdatascience.com](/lets-build-an-article-recommender-using-lda-f22d71b7143e) [## 使用 ROC 和 CAP 曲线的机器学习分类器评估
了解 ROC 和 CAP 曲线及其在 Python 中的实现
towardsdatascience.com](/machine-learning-classifier-evaluation-using-roc-and-cap-curves-7db60fe6b716) [## 使用 Flask、Flask RESTPlus 和 Swagger UI 处理 API
Flask 和 Flask-RESTPlus 简介
towardsdatascience.com](/working-with-apis-using-flask-flask-restplus-and-swagger-ui-7cf447deda7f)
Wind Mull——使用 Google Cloud AutoML Vision 和 MapBox 在航空影像上检测风力涡轮机
原文:https://towardsdatascience.com/wind-mull-wind-turbine-detection-on-aerial-imagery-using-google-cloud-automl-vision-and-mapbox-b25a1fbec5a3?source=collection_archive---------14-----------------------
为什么是风呢?
我在地图上缩放/平移,探索 MapBox 航空影像欣赏我们的绿色星球。我的脑海中浮现出我在美国中西部的公路旅行,以及从公路上看到的风力发电场阵列有多大。它们在夜晚发出同步的闪光,美得令人难以忘怀。然后,我开始放大一个有风力发电场的地图区域,在地图上看到了相当清晰的涡轮机,心想:“有了这张图像,如果我能应用机器学习来自动化并找到更多的风力涡轮机,那该多好啊”。我可以创建一个 GIS 地图图层,自动标注它们并分析哪些州/国家在风力发电上投资更多。直接进入源图像要容易得多:允许我们在全球水平上分析天线,而不是依赖个别国家发布的公共数据集,这些数据集既稀少又不可靠。此外,如果我可以将它们分段呢?哦,太多可能性了!我降低了自己的期望,从小处着手,只研究风力涡轮机的识别。
现在舞台已经搭建好了,让我们看看我是如何到达那里的。
我开始在网上寻找好的 ML 框架。我想尽快启动并运行,而不是花费大量时间进行身份验证。我发现谷歌的云 AutoML 说:“用最少的努力和机器学习专业知识训练高质量的定制机器学习模型。”(他们没有开玩笑)与安装和做大量工作来运行 tensorflow 或 pytorch 相比,这听起来是一个很好的选择。所以,我决定继续使用 AutoML。
数据准备和将图像加载到 AutoML
我从这里的汽车视觉的官方快速入门教程开始。
- 我创建了一个名为“images”的目录,有两个文件夹“windturbine”和“notaturbine ”,如下所示。
2.我了解到,AutoML 视觉培训的最低要求是每个类别/标签 100 个图像示例。为了节省时间并了解这个想法是否可行,我开始从 MapBox 航空影像地图上快速拍摄南达科他州苏福尔斯附近的风力涡轮机。还有其他更简单的、商业上可接受的、自动化的方法来获取训练数据,但是对于这个练习,截图就足够了。
3.我保存了 100 张风力涡轮机的图片,保存在“windturbine”文件夹下
4.然后我保存了另外 100 个不是风力涡轮机的特征的截图。我故意包括道路、公园、高尔夫球场、停车场、水和建筑。
5.事后看来,我应该对所有训练图像的缩放级别进行严格选择,但一般来说,我保持在 17 和 19 之间(地图框 LOD ),这种方法返回了令人满意的结果。
6.我在谷歌云上创建了一个新的测试项目。
7.然后我访问了 AutoML Vision UI 来上传我的训练数据。
8.AutoML Vision 用户界面非常易于使用。当您单击“添加新数据集”时,您可以键入数据集名称并导入您的训练数据集。我选择了我的“图片”目录,系统足够智能,可以导入照片,并理解其中代表标签的文件夹名称,并正确标记“windturbine”和“notaturbine”。
9.这是我的数据集在导入完成后的样子
使用带有 AutoML 的训练图像的训练模型
- 现在,我所要做的就是点击“训练”按钮,选择几个选项进行训练。
2.数据集越大,显然训练的时间就越长。但是由于我的数据很小,只有 200 张图片,训练在大约 20 分钟内完成。
使用 AutoML 评估模型:
1.现在开始评估结果!让我们看看我的训练进展如何。AutoML Vision 自动将 80%的图像用于训练,10%用于验证,10%用于测试。
2.我得到了 100%的精度分数,但这应该持保留态度,因为我的数据集是 AutoML 允许的最小大小。
3.我的混淆矩阵得到了满分,它 100%正确地预测了“风力涡轮机”和“非涡轮机”的图像。我决定进行下一步。
用 AutoML 预测
- 现在这个模型已经训练好了,我进入了有趣的部分:预测。幸运的是,AutoML 自动将模型发布为服务,可以使用 REST API 或 python 调用该服务。还有一个测试操场上传程序,可以让你快速上传图片进行测试。
2.我用我从上传的训练集中保留的新的风力涡轮机图像测试了它,模型正确地预测了它是一个风力涡轮机!到目前为止潜力很大。
Wind Mull 网络地图应用
1.既然我已经搞清楚了 ML 部分,是时候尝试识别世界上更多随机的风力涡轮机了。为了做到这一点,我创建了“风毛拉”网络应用程序。
2.我选择的 Javascript 框架是 Vue,因为我喜欢在其中进行原型开发,所以我用 Vue CLI 快速启动并运行了一个 VueJS 项目。
3.我将 MapBox lib 添加到 Vue 项目中,创建了一个地图 div,并在中心绘制了一个 geojson 多边形来指示检测区域。
4.我的第一种方法是从 MapBox raster API 请求切片,每次用户移动地图时获取航空切片,然后调用 prediction rest 端点来获取预测结果。
5.这“有点”奏效了,但是我永远也不能让瓦片与我在地图上看到的地方对齐。幸运的是,通过反复试验,我想出了一个更好的主意。
6.MapBox 有一个很棒的静态图像 API 游乐场,当你通过边界框时可以抓取图像。
7.这对于我的用例来说非常有效。我能够在距离地图中心一定距离的地方抓取边界框,获得我的航拍图像,然后将其传递给 AutoML Vision API,该 API 通过训练好的模型运行它,并返回给我一个预测标签和一个分数。
8.我不得不与一些烦人的图像格式和编码诡计作斗争,但这只是任何涉及照片的典型 web API 编程的一部分。
9.我最后以百分比的形式显示了预测分数(根据概率在 0 到 1 之间)以及地图框(没有双关语的意思!)是否包含风力涡轮机。
10.没有进入其他细节,我通过 Firebase 托管了这个项目(也是由 Google 托管的),一旦链接了这个项目,托管 Javascript 应用程序和执行 ML API 的权限就变得非常容易。
11.风魔来了,而且是真的!
1.如果你想试驾的话,这里有这个应用的链接:这里
2.有时,如果影像的分辨率较低,或者空中景观与训练影像中的相似,模型会出现一些问题,并错误地识别出一些例子。然而,总的来说,当我使用地址地理编码器并在美国伊利诺伊州的风力涡轮机和比利时的图像上尝试预测模型时,它得到了大多数正确的结果。
3.如果我添加更多的训练数据,我认为这将有助于提高准确性相当多,特别是在风景接近有风力涡轮机的地方。
值得深思的想法
Wind Mull 对我来说是一个有趣的练习,让我重新开始机器学习,并了解如何将其应用于 GIS,但我学到了很多关于 ML 和基于云的服务在短短几年内取得的进展。谷歌如何将这一过程产品化并降低准入门槛,以便来自许多学科的开发人员和数据科学家可以通过 AutoML 实验机器学习,这真是太棒了。
此外,风力发电机不必只关注风力涡轮机检测。我们可以从航空图像中进行各种特征检测,甚至用 CV(计算机视觉)进行特征提取。我认为这对于从空中获取新的 GIS 数据而不是手工数字化来说是巨大的。手动完成这项工作通常需要几天甚至几个月的时间。
值得注意的其他提及
1.MapBox 已经在开发这个库,它可以让你从 OpenStreetMap 图像中收集训练数据,并在天线上执行特征提取:https://github.com/mapbox/robosat
2.ESRI 使用深度学习创建了一个游泳池检测和分类(干净或绿色):https://medium . com/geoai/swimming-pool-detection-and-class ification-using-deep-learning-AAF 4a 3 a5 e 652
3.光栅视觉是一个很好的开源框架,Python 开发者可以在卫星、航空和其他大型图像集(包括倾斜的无人机图像)上构建 CV 模型【https://docs.rastervision.io/en/0.9/
如果你想和我聊聊 wind mull,请在 LinkedIn 上联系我,我将很高兴听到你的想法,并讨论 GIS 和机器学习之间的交集的其他伟大想法。
葡萄酒已经过时了
原文:https://towardsdatascience.com/wine-is-osemn-feaf4ce30c63?source=collection_archive---------33-----------------------
酒棒极了。当你将数据科学生命周期的五个步骤中的每一个步骤应用于一个展示 2017 年葡萄酒爱好者评论的 kaggle 数据集和一个关于红酒化学成分和质量的 csv 时,这也是一个错误。那些步骤是什么?O用于O获取数据。 S 是为了 s 擦洗你刚才扯皮的数据(也叫清洗)。 E 用于 e 探索数据,有时也称为 EDA——探索性数据分析。这一阶段通常包括检查汇总统计数据以及查看可视化效果,以便更清楚地了解数据试图讲述的故事。 M 用于 m 建模,涉及选择一个或多个机器学习模型应用于数据。 N 用于 i n 解释上一步的结果。这五个阶段将在这里应用,希望能从发酵的葡萄汁中获得一些有意义的见解。
一.获得
虽然目前来说过于雄心勃勃,但我渴望从我最喜欢的应用程序之一 Vivino 中创建一些补充的葡萄酒数据。看看吧,它确实在葡萄酒行业和数据科学的交叉领域掀起了波澜。这里分析的数据已经引起了激烈的争论。红酒化学(酚类物质)的数据集来自 P. Cortez 等人 2009 年的科学研究。
二。矮树
审查数据集缺少一些信息,并且存在一些重复信息。丢失的值通过丢弃它们来处理,重复的值很好地说明了在清理数据时的虚伪誓言。理想情况下,重复的将被删除。然而,我证明了这样做造成的伤害(比好处多得多)是五倍。关于酚类物质的 Cortez 数据集既没有缺失条目,也没有重复条目。这是“在野外”遇到的相对罕见的事情,很可能是 Cortez 小组已经清理了数据的结果。前两个阶段占了整个数据科学生命周期的大部分。不是接近冰山下沉的百分比,通常,但接近。通常,您大约 60–80%的时间会用于获取和清理数据。
三。探索
Fairly Gaussian Distribution of Wine Ratings
上面显示的 seaborn 图不仅显示了正态分布,还提供了一些指导,说明了为了简化应该在哪里对这些点进行分组。这种简化的细节再次出现在我的 jupyter 笔记本上,这是我在 github 上主持的项目。
我在文中的形象化描述似乎证明了这样一个观点,即某个评论者对有问题的葡萄酒写得越多,他们就越喜欢它,对它的评价也越高(或者说它越贵,因此应该用更多的词来描述潜在买家的投资)。总的来说,一个简短的描述似乎是由于一个无动于衷的评论家。沉默寡言的品酒师的简洁很能说明问题。似乎是关键词。我们会看到的。
四。模型
我将使用的机器学习算法(随机森林)是为了分类,属于监督学习模型的范畴。首先,我检查数据集中葡萄酒描述的长度是否是一个令人满意的分类预测器,可以预测一种葡萄酒是否会被认为是高分(我的目标,或因变量)。我从我的 EDA 那里得到了这个关于有多少酒得到了什么样的分数。然后,在对葡萄酒价格进行分类的背景下,我检查了同一个独立变量,葡萄酒评论描述长度,这是我的下一个目标变量。在每个实例中,我使用随机森林分类(RFC)来查看该算法如何响应保持输入变量一致和改变输出变量。
在将分数简化或“宁滨”成更小的分组之前,第一个目标变量“分数”的精确度非常低。后来,它的分类只比偶然性稍好一点。第二个模型以价格为输出变量,在对价格高于 100 美元一瓶的昂贵葡萄酒进行分类时,被证明几乎同样有效(只是和随机机会一样好)。然而,在这个阈值以下,它给人留下了深刻的印象,分类准确率约为 96.5%。
我还在一个不同的数据集背景下检验了这个特殊的分类模型,这个数据集也涉及葡萄酒,但这次是红酒的酚类物质以及这些特征与质量的关系。酚类化合物是赋予红酒颜色的原因。这种化学成分非常迷人,它经常被认为是区分高质量葡萄酒和不那么高质量葡萄酒的因素。RFC 在这里证明了自己是一个非常有效的机器学习算法。
通常在机器学习中,许多不同的模型被迭代测试,以确定哪个提供最好的结果(无论你是为了准确度、精确度还是模型的一些其他特征)。在 RFC 的情况下,以及在其他决策树风格的方法中,这可能涉及到通过 GridSearch 之类的方法执行交叉验证(通常是 5 或 10 倍),这种方法通过输入数据组合地检查每种可能性。这是一种调整模型参数的简便方法,尽管这是一种计算量很大的穷举搜索。与其他最大似然算法相比,它往往是表现最好的,对数据中的噪声和方差有天然的抵抗力。
我确实利用 RFC 算法中的迭代来为我的酚类数据集找到最佳特征,以选择最高精度,但我没有为葡萄酒评论、价格和点数建模。这是我的项目中缺少的东西,在将来会是一个值得包含的东西。我在这里的理由是缩小 RFC 在两个不同的数据集上的具体功能,这两个数据集被一个共同的葡萄栽培主题所统一。
动词 (verb 的缩写)口译
巴克斯喜欢压力过大的葡萄。
我们已经到了数据科学过程的最后一步。我们应该如何看待我们所有的辛勤工作?在检查葡萄酒数据集的随机森林分类之前,我冒昧地猜测,品酒师越是把笔放在纸上,或者从技术上说,手指放在键盘上,他们对被采样的葡萄酒的评级就越高。
RFC 建模的结果相当具有决定性,我的假设实际上并不成立。
虽然简化点数指标的 RFC(未图示)在将葡萄酒描述长度划分为五个定义的类别方面确实比平均水平稍好,但它没有达到我最初制定这个项目时假设的程度。我的 EDA 中的这张图可能会说明原因:
线性回归模型在这里比分类更合适。
在 20 个不同的点类别的情况下,这被证明是特别正确的,但是当每 4 个点被分入更小的分组时,这仍然是正确的。
一个好得多的分类模型包括使用较短的描述来分类较便宜的葡萄酒(低于 100 美元)。包含向上的异常值在很大程度上帮助了这个模型。事实上,只包括价格高达 500 美元的葡萄酒对模型的准确性是有害的,在没有测试和验证的情况下,我是不会预见到的。在选择 100 美元作为质量门槛时,我有一些领域知识,超过这个门槛就是狂热状态。当一瓶酒的损害达到三位数时,在没有足够合理的质量指数增长的情况下,价格出现了巨大的差异。RFC 模型中反映的是对低于 100 美元的葡萄酒进行分类的高准确度,但对高于该阈值的葡萄酒来说,这不是一个比机会更好的分类模型。
我提出,绝大多数葡萄酒饮用者从未想过要花超过 100 美元买一瓶葡萄酒,或者很少这样做。该模型表明,通过随机森林算法,来自 2017 年葡萄酒评论子集的特定描述长度的葡萄酒能够以高精度和准确度被分类为低于该临界价格点。以上,审查的长度只是对每瓶酒的成本进行分类的机会。
综上所述,我认为这两个结果应该被解释为购买描述长度更长但价格仍低于 100 美元的葡萄酒是寻找下一个葡萄酒爱好者的最佳方法。因为它是一个较弱的模型,所以分数只能作为一个次要的方法来对真正最好的葡萄酒进行分类。
虽然我在这里没有涉及到它,但是在评论描述中,描述长度和词频可能有一些相互作用,这值得进一步研究。这将进入自然语言处理的领域,包括将给定文本中的单词外观转换成向量,以便能够测量频率。描述长度可能与某些单词出现的频率相协调,也可能不协调。这将是我在这里深入研究的一个有价值的扩展。
我们对酚类的研究给了我们一个决定性的分类。很自然。酚类是植物和动物作为其防御机制的一部分释放的有机化合物,具有中心环状苯环和不同数量的羟基作为取代基。所以,葡萄树受到的压力越大,它们产生的酚类物质就越多。这些化合物不仅会影响红葡萄酒的颜色,还会作为防腐剂影响味道。巴克斯喜欢压力过大的葡萄。
我的笔记本详细说明了,不管你是在处理我定义的“不是两块钱的查克”(好)还是“两块钱的查克”(坏)葡萄酒,对于这两种风格的葡萄酒中的一种,Random Forest 都是一个相当精确和准确的机器学习分类模型。它特别擅长辨别优质葡萄酒。当分析包含在高度分散的分布上运行的变量的数据集时,要素缩放总是值得应用的。然而,在这个具体的例子中,所有的特征甚至在缩放之前都是非常一致的。这一点,加上一些功能选择,为我进军机器学习和葡萄酒领域提供了一些额外的见解和深度。
尽管并不完美,但这个项目使数据科学生命周期在我看来更加具体。我希望它能在某种程度上为你做同样的事情。
参考文献:
https://github.com/harrisonhardin/Mod5Project
[## 葡萄酒评论
13 万条葡萄酒评论,包括品种、地点、酒厂、价格和描述
www.kaggle.com](https://www.kaggle.com/zynicide/wine-reviews)
页(page 的缩写)科尔特斯、塞德伊拉、阿尔梅达、马托斯和雷伊斯。通过物理化学特性的数据挖掘建立葡萄酒偏好模型。在决策支持系统中,爱思唯尔,47(4):547–553,2009。
https://www . ka ggle . com/ka Bure/wine-review-s-understanding-python IC-EDA
https://www . ka ggle . com/olivierg 13/wine-ratings-analysis-w-supervised-ml
https://www . ka ggle . com/UC IML/red-wine-quality-cortez-et-al-2009/downloads/wine quality-red . CSV/2
https://www.winefrog.com/definition/515/phenolics
使用机器学习赢得 21 点
原文:https://towardsdatascience.com/winning-blackjack-using-machine-learning-681d924f197c?source=collection_archive---------1-----------------------
遗传算法的一个实例
机器学习的一个伟大之处在于有如此多不同的方法来解决问题。神经网络非常适合在数据中寻找模式,从而产生令人印象深刻的预测能力。强化学习使用基于奖励的概念,随着时间的推移不断改进。还有一种叫做遗传算法的方法。
遗传算法(GA)利用进化原理来解决问题。它的工作原理是使用一个问题的潜在解决方案群体,反复选择和繁殖最成功的候选方案,直到经过若干代后最终的解决方案出现。
为了展示这种方法的有效性,我们将使用它来解决一个复杂的问题——创建一个玩赌场游戏二十一点(也称为“21”)的策略。
在这种情况下,术语“策略”是指涵盖所有情况的玩家行动指南。我们的目标是找到一个最好的策略,随着时间的推移获得最大的收益。
关于这个“制胜”策略
当然,在现实中,21 点没有赢的策略——规则是这样制定的,所以赌场总是有优势。如果你玩的时间足够长,你就会输钱。
知道了这一点,最好的策略就是将损失最小化。使用这种策略可以让玩家尽可能地扩大资金,同时希望获得短期好运。这是在 21 点中获利的唯一方法。
正如你所想象的,数学家和计算机科学家已经研究 21 点很久很久了。早在 20 世纪 60 年代,一位名为爱德华·o·索普的数学家写了一本名为击败庄家的书,书中包括显示最优“基本”策略的图表。
最优策略大概是这样的:
Optimal Strategy for Blackjack
这三张桌子代表了玩 21 点的完整策略。
左边的高桌子是给硬手用的,右上的桌子是给软手用的,右下的桌子是给对用的。
如果你不熟悉 21 点,软牌是指一手可以算成 1 或 11 的牌,但总牌值不超过 21。对子不言而喻,硬手基本就是其他的一切,折算成总手值。
三个表格顶部的列用于经销商 upcard,它影响策略。请注意,升级卡等级不包括杰克、皇后或国王。这是因为这些牌都是 10 张,所以它们都与 10(“T”)组合在一起,以简化表格。
要使用牌桌,玩家首先要确定他们是有一对牌,一手软牌还是一手硬牌,然后使用对应于他们手中牌的行和对应于庄家升牌的列来查找适当的牌桌。
当正确的策略是击打时,表格中的单元格将为“H”,当正确的策略是站立时,单元格将为“S”,双降时,单元格将为“D”,而(仅在 pairs 表格中)拆分时,单元格将为“P”。
知道这样一个问题的最优解实际上非常有帮助。将遗传算法的结果与已知的解决方案进行比较将展示该技术的有效性。
最后,在我们继续深入之前,还有一件事需要解决,那就是非确定性的概念。这意味着,如果相同的 GA 代码连续运行两次,将返回两个不同的结果。这是遗传算法由于其固有的随机性而发生的事情。软件以这种方式运行是不寻常的,但在这种情况下,这只是方法的一部分。
遗传算法如何工作
遗传算法使用起来很有趣,因为它们非常容易理解:你从一群(最初,完全随机的)潜在解决方案开始,然后让进化去寻找解决方案。
这个进化过程是通过比较候选解决方案来驱动的。每个候选人都有一个健身得分,表明它有多好。对于所有候选人,每代计算一次该分数,并可用于相互比较。
在 21 点策略的情况下,适合度分数非常简单:如果你使用该策略玩 N 手 21 点,当完成时你有多少钱?(由于房子边缘,所有策略都会赔钱,也就是说所有的适应值都会是负数。一个策略的健康指数越高,仅仅意味着它比其他策略损失的钱更少。)
一旦创建了有效的适应度函数,使用 g a 时的下一个决策就是如何进行选择。
有许多不同的选择技术来控制选择在多大程度上由适应度分数和随机性驱动。一种简单的方法被称为锦标赛选择,它的工作原理是从人群中随机挑选 N 名候选人,并使用健康得分最高的一名。简单有效。
一旦两个父母被选中,他们就被杂交形成一个孩子。这就像正常的有性生殖一样——父母双方的遗传物质结合在一起。由于父母是着眼于健康而选择的,所以目标是将父母双方的成功因素传递下去。
自然地,在这种情况下,“遗传物质”仅仅是每个策略的三个表中的 340 个细胞。通过从两个父代中选择相应的单元格来填充子代中的单元格。通常,交叉与相对适应度分数成比例,因此如果一个父代具有明显更好的适应度分数,则他们可能最终比另一个父代贡献更多的表单元。
最后,就像在自然界一样,群体中的多样性也很重要。太小或太同质的群体总是比更大和更多样化的群体表现更差。
遗传多样性很重要,因为如果你没有足够的遗传多样性,就很容易陷入一种叫做局部最小值的东西,这基本上是一种比任何类似替代方案都表现更好的解决方案,但不如其他与它明显不同的解决方案。
为了避免这个问题,遗传算法有时使用突变(引入全新的遗传物质)来提高遗传多样性,尽管更大的初始种群也有帮助。
结果使用遗传算法
关于气体的一件很酷的事情就是看着它们演化出一个解决方案。第一代是完全随机的解决方案。这是来自第 0 代(第一个随机代)中 750 个候选人的最佳解决方案(基于适应值):
Randomly generated candidate from Gen 0
如你所见,这完全是随机的。到了第 12 代,一些东西开始成形:
只有 12 代的经验,最成功的策略是那些坚持了 20、19、18 甚至 17 代的策略。策略的这一部分首先发展,因为它发生得如此频繁,并且有一个相当明确的结果。基本概念首先是用气体发展起来的,细节是在以后的世代中出现的。
该策略中的其他质量暗示是硬 11 和硬 10 持股。根据最优策略,这些应该大部分是双倍下注,所以看到这么多黄色是令人鼓舞的。
对子和软牌桌会持续到最后,因为这些牌很少出现。例如,一个玩家只有 6%的机会拿到对子。
到了第 33 代,事情开始变得清晰:
到了 100 代,左边的硬手桌就完全稳定了——一代不变。软牌和对子牌桌越来越精致:
最后几代被用来改进策略。在这个阶段,代与代之间的变化要小得多,因为这实际上只是解决最小细节的过程。
最后,经过 237 代,找到了最佳解决方案:
如你所见,最终结果与最优解并不完全相同,但非常非常接近。特别是硬手牌(左边的表格)几乎完全正确。软牌和对子表中有更多不匹配的单元格,但这可能是因为这些牌类型出现的次数远少于硬牌。
就结果而言,以每手 5 美元的价格玩 500,000 手牌的最佳策略将导致 176,040 美元的损失。使用计算机生成的策略将导致 176,538 美元的损失,与 50 万手相比相差 498 美元。
有一个动画 GIF 展示了这种策略在 237 代中的演变,但要注意它的大小是 19 MB,所以你可能不希望通过手机来查看它。
产生这些图像的软件的源代码是开源。这是一个用 C#和 WPF 一起编写的 Windows 桌面应用程序。
组合暗示
尽管由此产生的战略令人印象深刻,但我们需要通过思考问题的范围来将其置于背景中。21 点的最佳策略是在 340 个牌桌单元(分布在三张牌桌上)中填入每种持有牌/庄家升牌组合的最佳选择,包括立牌、对打、双倍下注或分牌。
就组合而言,有 4 个⁰⁰可能的对子策略、3⁸⁰可能的软牌策略和 3 个⁶⁰可能的硬牌策略,总共有 5 x 10 个⁷⁴可能的 21 点策略:
4 ⁰⁰ x 3⁸⁰ x 3 ⁶⁰ = 5 x 10 ⁷⁴可能的 21 点策略
在这种情况下,遗传算法在 5×10⁷⁴可能答案的解空间中找到了接近最优的解。在一台标准的台式电脑上运行,大约需要 75 分钟。在那次运行中,评估了大约 178,000 个策略。
测试体能
遗传算法本质上是由适应度函数驱动的。如果没有一个好的方法来比较候选人,进化过程就无法进行。
适应度函数的概念很简单。尽管我们可能不知道问题的最佳解决方案,但我们确实有一种方法来衡量潜在的解决方案。适应度函数反映了传递给它的候选人的相对适应度水平,因此分数可以有效地用于选择。
为了找到一个 21 点策略,一个适应度函数很简单,它是一个在一定数量的牌局中使用该策略后返回预期最终收益的函数。
但是多少手才够呢?
事实证明,你需要用一个策略玩很多手牌才能确定它的好坏。由于一副牌天生具有随机性,所以需要打很多手牌,这样随机性在候选人之间就平衡了。
当我们的 GA 接近最终解决方案时,这一点尤为重要。在早期世代中,如果适应度分数不精确,这不是问题,因为坏的候选人和好的候选人之间的差异通常相当大,并且向最终解决方案的收敛继续没有问题。
然而,一旦遗传算法进入后代,被比较的候选策略将只有微小的差异,所以从适应度函数中获得准确的预期收益是很重要的。
幸运的是,找到所需的合适的手数非常简单。使用单个策略,运行多个测试,产生一组适应性分数。相同策略的不同回合之间的差异将揭示有多少可变性,这部分是由测试的手数决定的。玩的牌越多,变化就越小。
通过测量一组分数的标准偏差,我们可以了解在 N 手牌的测试中,一组分数的可变性有多大。但是,由于我们每次测试的牌局数量不同,我们无法比较标准偏差,原因如下:
标准差根据基础数据进行调整。我们无法比较使用不同牌局数的测试的体能分数(或其标准差),因为玩的牌局数越多,体能分数相应增加。
换句话说:假设一种策略有 34%的胜算。如果你用 25,000 手牌和 50,000 手牌进行比较,最后你会得到不同的总数。这就是为什么你不能简单地比较不同测试条件下的体能分数。如果你不能比较原始值,你就不能比较标准差。
我们通过将标准偏差除以每个测试值的平均健康得分(也就是玩的手数)来解决这个问题。这给了我们一个叫做变异系数的东西,它可以与其他测试值进行比较,而不管玩了多少局。
这里的图表展示了当我们玩更多手牌时,可变性是如何缩小的:
图表中有一些观察结果。首先,仅用 5000 或 10000 只手进行测试是不够的。在这些水平上,对于相同的策略,健康分数会有很大的波动。事实上,看起来最少 100,000 手可能是合理的,因为这是可变性开始变平的点。
我们能在每次测试中运行 500,000 或更多手吗?当然了。它减少了可变性并增加了适应度函数的准确性。事实上,50 万手的变异系数为 0.0229,明显优于 10 万手的 0.0494。但是这种改进绝对是收益递减的一个例子:测试的数量必须增加 5 倍,才能得到一半的可变性。
鉴于这些发现,策略的适应度函数将需要使用以下规则(在现实世界赌场中常见)玩至少 100,000 手 21 点:
- 使用混洗在一起的 4 副牌
- 庄家必须打到 17(软或硬)
- 你可以在你分开的一手牌上加倍下注
- 没有保险
- 21 点支付 3:2
遗传算法配置
使用 GA 的一个不寻常的方面是它有如此多的设置需要配置。可以为运行配置以下项目:
- 群体大小
- 选择方法
- 突变率和影响
- 终止条件
改变每一项都会产生不同的结果。确定这些设置值的最佳方式就是简单地进行实验。
人口规模
这是不同人口规模的每一代候选人平均适应度的图表:
这个图的 X 轴是世代数(最多 200),Y 轴是每代的平均适应度得分。最初的几代人并没有显示出当我们到达后代时的差异。
沿着图表顶部的扁平白线是已知的最佳基线策略的适应性分数。
首先要注意的是,两个最小的群体(分别只有 100 和 250 名候选人,以蓝色和橙色显示)在所有规模中表现最差。
这些小群体中缺乏遗传多样性,导致最终的适应性分数很低,同时寻找解决方案的过程也较慢。显然,拥有足够大的种群以确保遗传多样性是非常重要的。
另一方面,400 人、550 人、700 人、850 人和 1000 人之间没有太大的差异。
这与选择要测试的手数的情况类似,如果你选择的值太小,测试就不准确,但是一旦超过某个水平,差异就很小了。
选择方法
为交叉寻找好的候选者的过程被称为选择,有许多方法可以做到。锦标赛的选择已经介绍过了。以下是另外两种方法:
轮盘赌选择根据候选人的健康分数选择候选人。想象一个饼图,有三个大小分别为 1、2 和 5 的扇区。值为 5 的楔形区有 5/8 的时间被选中,值为 2 的楔形区有 2/8 的时间被选中,值为 1 的楔形区有 1/8 的时间被选中。这是轮盘赌轮盘选择背后的基本思想。与所有候选人的总得分相比,每个候选人的楔形大小与他们的健康得分成比例。
这种选择方法的一个问题是,有时某些候选人的健康得分很低,以至于他们从未被选中。如果幸运的话,有几个候选人的健康得分远远高于其他人,他们可能会被不成比例地选中,这降低了基因多样性。
解决方案是使用排序选择,它的工作方式是根据适合度对候选人进行排序,然后给最差的候选人 1 分,第二差的候选人 2 分,以此类推,一直到最佳候选人,最佳候选人得到的分数等于人口规模。一旦健身分数调整完成,将使用轮盘赌选择。
下图比较了使用各种选择方法的每一代人的平均适应度:
正如您所看到的,比赛选择很快收敛到一个最优解,事实上,比赛规模越大,平均健身分数提高得越快。这是有道理的,因为如果你随机选择 7 个候选人并使用最好的,质量会比只选择 2 个高得多。
尽管它有最快的初始改进,但 Tourney 7 最终产生了最差的结果。这是有道理的,因为尽管大规模的比赛会带来快速的进步,但它也将基因库限制在最好的范围内。所需的基因多样性丢失了,从长远来看,它的表现也不好。
表现最好的看起来是锦标赛 2、锦标赛 3 和锦标赛 4。给定 700 人的人口,这些数字提供了良好的长期结果。
精英主义
遗传算法中还有另一个概念叫做精英主义。它的思想是,当构建新一代时,首先按照适应度对人口进行排序,然后将一定比例的最佳候选人直接传递给下一代,而不进行改变。完成后,正常的交叉就开始了。
这个图表显示了四种不同的精英主义率的影响(仅为了显示细节,仅显示后代)。显然,没有精英主义或 15%是合理的,尽管 0%看起来更好一些。
这个图表有一点令人惊讶——精英主义程度越高,解决问题的收敛速度越慢。你可能认为故意包括每一代中最好的会加快速度,但事实上看起来只使用交叉候选人会给出最好的结果,也是最快的。
突变
保持高遗传多样性是很重要的,而突变是引入这一点的简单方法。
有两个因素与突变有关:它发生的频率有多高,以及当它发生时会产生多大的影响?
一个突变率控制着一个新产生的候选者被突变的频率。突变是通过杂交在创造后立即完成的。
突变影响控制一个候选者被突变的程度,以其细胞被随机改变的百分比来表示。所有三张牌桌(硬牌、软牌和对子)的变异百分比相同。
从 10%的固定影响率开始,下面是不同突变率的影响:
很明显,突变对这个问题没有帮助——受突变影响的候选人越多,结果就越糟糕。因此,不需要尝试不同的突变影响值——0%的突变率显然是解决此问题的最佳值。
终止条件
知道何时退出遗传算法可能很棘手。有些情况需要固定的世代数,但对于这个问题的解决方案是寻找停滞——换句话说,当遗传算法检测到候选不再改进时,它就会停止。
用于该测试的条件是,如果连续 25 代的整体最佳策略(或一代的平均分数)没有改善,则该过程终止,并且到该点找到的最佳结果被用作最终解决方案。
包扎
遗传算法是解决复杂问题的强大技术,并且具有易于理解的优点。对于因组合因素导致解空间巨大的问题,它们是极其有效的。
要了解更多关于 GA 的信息,请从这篇维基百科文章或者我写的 PluralSight(付费)课程开始,它涵盖了这个主题的更多细节。
赢得 PUBG:干净的数据并不意味着现成的数据
原文:https://towardsdatascience.com/winning-in-pubg-clean-data-does-not-mean-ready-data-47620a50564?source=collection_archive---------19-----------------------
到目前为止,这个项目的研究是我最喜欢的。如果你是一个粉丝,或者至少浏览过 Kaggle 的一些比赛,那么你可能已经看到了预测 PUBG 挑战赛的胜利。竞争早已过去,但我想解决这个问题,因为游戏和这个行业是一个有趣和令人兴奋的冒险。
数据本身就很吓人……仅在训练数据集中就有大约 450 万次观察,在测试集中还有大约 150 万次。我已经听说 Kaggle 数据集非常干净,但这个数据集几乎是完美的。只有一个…我指的是整个数据集中的一个空值。我最初的想法是,“这将是一件轻而易举的事情”,但是我想彻底地经历 OSEMiN 过程的清理和探索阶段(获取、清理、探索、建模、解释)。在这里,我了解到干净的数据并不一定意味着现成的数据。
在对这些特征进行一些初步研究后,我注意到有一些比赛类型(单人、双人、小队)是数据集的一部分。玩过这个游戏后,我知道每个模式都有一些不同的特点,这些特点在比赛中会更重要(团队对单人)。所以对我来说,第一步是把数据分成 solo,duo 和 squad。这将我的数据集缩减到更容易管理的大约 55 万次观察。
运行完。describe()方法来查看基本的统计信息,这是我注意到的第一个障碍。0s。数据中成百上千的 0。为什么?当比赛进行时,开始是死亡和毁灭的风暴。那些被立即杀死的玩家在特性栏中会有很多 0。当你归因于超过 20%的玩家在前 5 分钟被杀,你最终会在数据中得到一堆 0。
When the min, 25%, 50% and 75% quartiles are 0….that’s an issue.
接下来,有一些本质上是绝对的数据。在预测获胜时,我需要逻辑回归或分类器,所以必须要有分类数据。不过没什么大不了的,分类数据与胜利无关,只是 Id 信息。
然后,我用直方图和箱线图将数据可视化。直方图验证了数据严重偏向光谱的 0 端。它也影响了箱线图的外观。由于大多数数据都是 0,如果特性可能达到数百甚至数千,可视化就会看起来很遥远,事实也确实如此。一些特征甚至有大量的异常值。虽然这部分是由于不平衡,但我确实想略读一些功能。所以对数据帧做一点参数调整就行了!
Histograms of the dataset, look at all those 0s!!!!
The 0s make this plot look worse than it is (due to scale) but still some crazy outliers?!
现在来处理多重共线性。热图通常会说明问题,这里有几个没有值的要素和几个彼此高度相关的要素,因此我确定对模型影响不大的要素被删除了。
然而,仍然存在不平衡的问题。只有 1%的数据代表赢家,这是我们的目标。幸运的是,我们成功了。SMOTE 是一个方便的小软件包,可以对数据进行重采样以帮助平衡数据。预设为选择“非多数”数据进行重新采样,但如果需要,可以进行更改。好处是…一个更平衡的数据集,坏处是…我几乎加倍了观察值,这意味着以后会有更多的计算开销。
重点是,仅仅因为数据集是干净的(大多数都在 Kaggle 上),不要忘记探索和清理数据。经过一些小的改动,我的 solo 数据的最终模型最终测试的准确率为 99.48%。我的 Github 婴儿床里有一本完整的笔记本…https://github . com/Jason-M-Richards/Winning-at-PUBG-Binomial-class ification-。这是出于教育目的,但我的计划是重新访问和完成其他比赛类型的模型,并提交所有这些模型。比赛信息在 https://www.kaggle.com/c/pubg-finish-placement-prediction 的。
用 AI 赢得价格是对的
原文:https://towardsdatascience.com/winning-the-price-is-right-with-ai-b77e6ade44e3?source=collection_archive---------34-----------------------
如何以及何时使用自定义成本函数
介绍
在机器学习中,我觉得成本函数是解决问题过程中经常被忽视的一部分。许多数据科学家对使用新模型或调整超参数以获得最佳性能感到兴奋。我们通常倾向于选择一个常见的成本函数,如均方差,然后毫不犹豫地继续训练。我认为,花时间思考和理解成本函数的含义以及它如何影响模型的性能,会对项目的结果产生重大影响。所以,为了进一步探索这个想法,我玩了一个热门游戏节目的修改版《价格是对的》。在我的这个实验中,我研究了不同的成本函数如何影响模型性能,包括我如何编写自己的函数来更具体地解决我想要解决的问题,以进一步改善结果。
成本函数的重要性
注意:下一节是我如何看待成本函数适应整个问题解决过程的概述。如果你只是对 代码 或 实验 感兴趣,可以随意跳到下一节。
这并不是对成本函数的介绍,而是假设对成本函数和梯度下降都有一定的了解。话虽如此,我还是想快速概述一下成本函数,然后深入探讨它们在问题解决过程中的影响。
什么是成本函数?
让我们看一个简单线性回归的基本例子来回顾成本函数。在线性回归中,我们试图解决找到最佳模型系数的问题,以绘制一条符合数据的直线。在机器学习中,这一般是通过梯度下降来完成的。梯度下降是一个过程,通过该过程,系数在成本曲线上缓慢下移,直到找到成本函数最小的位置。输入成本函数的重要性。
成本函数的作用
成本函数指导模型在进行预测时应该如何衡量不同的变量。它作为一个向导,帮助模型学习拟合数据的正确方法。所以你可以想象这可能真的很重要。如果一个模型被赋予了一个很差的成本函数,它就不会学会做出好的预测,也不会有用。
我发现思考成本函数的一个有价值的方法是将它们视为模型总体目标的反映。无论选择什么数学函数通过梯度下降来最小化,都应该尽可能地符合我们希望模型做的事情。我们以游戏节目价格合适为例。这个游戏的目标是尽可能准确地预测物品的价格,而不是猜测实际价格。那么成本函数如何反映这一点呢?我们希望我们的成本函数告诉我们的模型在不夸大事实的情况下做出预测。似乎不言自明,对吧?那么,为什么不是每个数据科学家总是为他们解决的每个不同的问题编写一个自定义损失函数呢?
选择成本函数
实际上,我认为为你试图解决的每个问题编写一个独特的成本函数是不现实的。对于某些任务,某些成本函数变得流行是有原因的。这是因为他们通常在解决某些类型的问题上做得很好。在 scikit-learn 等流行的框架中,这些函数中的许多已经变得非常容易实现。因此,在许多情况下,花时间编写一个自定义函数是没有意义的,因为它可能会花费更长的时间来最小化而不是改善您的结果。这并不是说不值得花时间来思考你的问题,以及哪个成本函数最有意义(我认为这是解决问题过程中非常宝贵的一部分)。但在现实中,你通常可以找到一个有助于解决你的问题的成本函数,而不需要花时间去写你自己的。
考虑到上面的警告,有时您可能会仔细考虑您的问题,并发现您可以创建自己的成本函数来提供更好的结果。本文的重点是向您展示充分理解您的问题以编写您自己的成本函数对您的项目成果的影响。现在舞台已经搭好,是时候进入了,价格是正确的。
价格合适
如果你不熟悉游戏节目价格合适,游戏相当简单。四名选手来到前面相互竞争。给他们展示物品,他们都要猜它的价格。猜得最接近实际价格的参赛者获胜,并进入下一轮。因此,大多数理性的人会问的一个明显的问题是:“我可以建立一个机器学习模型来帮助我在第一轮价格合适中获胜吗?”
数据
为了训练一个模型来帮助我赢得价格是正确的,我使用了来自亚马逊玩具数据集的数据,该数据集可在 Kaggle 上获得。在开始我的实验之前,我做了一些数据清理,并使用一些基本的 NLP 来创建特征,以预测数据中玩具的价格。如果你有兴趣看看我到底是怎么做的,你可以在这里查看这个笔记本。我最终的数据框如下所示:
实验装置
对于这个实验,我决定使用微软的 LightGBM。这是一个非常受欢迎的模型,目前是我的最爱之一。它还允许一些简单的方法来建立成本函数和评估。至于成本函数,我决定测试 5 个不同的变量。我使用了 2 个基线,即 LightGBM 已经实现的 MAE 和 MSE 函数。然后我写了 3 个自定义函数来测试。我将模型的超参数调整到 MAE,并在相同的随机状态下保持它们在所有模型迭代中的一致性。所以,如果有的话,我试图在我的实验中给基线优势。
接下来是对成本函数的评估。我决定评估模型性能的几个不同方面。第一个我称之为总奖金。为了在某种程度上复制价格是正确的,总奖金计算如下: 如果预测高于事实,奖金等于零。如果预测低于事实,奖金与预测相等。 这种类型的评估对价值较高的项目给予较大的权重。正因为如此,我也评估了标准化的赢款,计算如下: 如果预测高于事实,赢款等于零。如果预测低于事实,赢款等于预测除以事实。 这种方法对测试集中的每一个项目赋予相等的权重。除了这些方法,我还计算了每个模型过度预测的项目的百分比。下面是我创建的用来评估模型的类。
编写成本函数
LightGBM 使用两种不同类型的函数来训练模型。第一个就是我上面说的那个。它是目标函数。这是计算成本函数的梯度以帮助模型学习的函数。LightGBM 的独特之处在于它在学习中同时使用了一阶和二阶导数。你会看到我下面都有。第二种功能是评估功能。在这个实验中,我们使用评估集和提前停止来训练我们的模型。该模型使用评估函数来确定某个指标何时停止改善。当达到这一点时,模型停止训练以优化该指标。在我的实验中,我写了一个目标函数,并与三个不同的评估函数一起使用。
对于这些函数中的几个,我们使用一个惩罚来将我们的模型推向预测不足。这是一个在 Lasso 和 Ridge 回归中也用于有效分配系数权重的概念。在实验中,我观察了几个不同的罚值,并为每个函数选择了最好的一个。让我们快速看一下这些函数。
超预测 _ 惩罚 _ 目标:这是我们的目标函数。它是 MSE 的简单变体。我们计算 MSE 的一阶和二阶导数,并在预测值大于真实值时将损失乘以惩罚值。
over prediction _ penalty _ squared:这是我们的第一个评价函数。它也是 MSE 的一种变体,对过度预测进行惩罚。
over prediction _ penalty _ absolute:这是 MAE 的一个变体,对过度预测进行惩罚。
over prediction _ penalty _ pr:这是我专门针对这个问题写的一个独特的评价函数。在这本书里,我试图模拟我们实验的目标,通过返回一个与我们预测相等的损失,来哄骗我们的模型给我们尽可能高的回报。
这里是我写的运行实验的助手函数的快速浏览。您可以看到我使用的硬编码超参数以及早期停止和验证集。
结果
对于每个成本函数,我查看了总奖金和标准化奖金的最佳得分。这是总奖金的结果。
从这些结果中,我们可以看到,我们的自定义目标函数与我们的问题特定评估函数配对后,表现最好,其次是我们的自定义 MSE 评估函数。有趣的是,不同惩罚下的成本函数表现最佳。我会注意到,对于每个惩罚,这不是成本函数结束的顺序。在一些版本中,特定问题评估胜出,在一些版本中,自定义 MSE 胜出,在一个版本中,常规 MAE 胜出。这表明,在大多数情况下,您将不得不修改惩罚和超参数来确定最佳模型。现在是标准化的奖金。
在标准化奖金的情况下,低估价格的数量和奖金之间有很高的相关性(不出所料)。但是,我再次注意到,根据应用于问题的不同惩罚,顺序会发生变化。
最后的想法
编写定制成本函数的能力对我来说已经派上了好几次用场。有时是因为某个特定的问题更适合某个模型不支持的东西。我也遇到过这样的情况,我的模型简单地高估了,而不是低估,我想平衡一下。不管怎样,我相信这是一件值得修补和尝试的事情。这需要实验,就像数据科学领域的许多事情一样,但它有可能对模型的结果产生影响。
如果你对用其他方式编写定制函数感兴趣,scikit-learn 也支持它。你也可以在 TensorFlow 和 PyTorch 中编写自定义的成本函数。我认为值得花时间去理解成本函数,以及它们如何改变你的模型的性能。
从你的电脑上删除 Windows 10 并安装 Ubuntu 18.04 LTS
原文:https://towardsdatascience.com/wiping-windows-10-from-your-pc-installing-ubuntu-18-04-lts-7408973b057?source=collection_archive---------3-----------------------
为深度学习提升你的电脑——第 3 部分
在 Part 1 中,我展示了如何将 PC 的显卡升级到兼容 Nvidia CUDA 的 GPU,以实现更快的深度学习。为确保 GPU 安装完成而进行的所有软件检查都是在我的 Windows 10 家庭版上完成的。在第二部中,我说过我会清除 Windows 10,用 Linux Ubuntu 取而代之(因为这通常比 Windows 更兼容机器学习项目)。第 3 部分介绍了擦拭和安装过程。
第 1 步:备份您电脑上的数据,并记下您的 Windows 10 激活密钥
在开始之前,请确保您已经备份并删除了 PC 中不可恢复的个人数据;一旦你安装了 Ubuntu 18.04,你的硬盘就会被清除。
同样,根据您的 Windows 在 PC 上的安装方式,您可能希望保留一个 25 位的 Windows 许可证密钥,以防您改变主意并希望重新加载 Windows。对我来说,这是在我的电脑外壳侧面的标签上。
第二步:为 Ubuntu 18.04 LTS 版制作一个可启动的 DVD 或 USB 驱动器
去官方 Ubuntu 18.04.1 LTS(仿生海狸)下载页面这里,或者这里获取 Ubuntu ISO 镜像。我正在下载 Ubuntu-18 . 04 . 1-desktop-amd64 . iso 的桌面图像。该文件的大小约为 1.8 GB。
您需要什么:
- 一个至少 2GB 的空 u 盘,用于存储可启动的 Ubuntu 18.04 映像。这需要在 FAT32 文件系统中进行格式化;或
- 一张可写/可读的 DVD,您可以在上面刻录 Ubuntu 18.04 ISO 映像。
步骤 2a (带镜像的可引导 USB 闪存驱动器)和步骤 2b (带可引导镜像的 DVD)是可选的,这取决于您使用 Ubuntu 18.04 ISO 镜像进行引导和安装的方式。我使用了步骤 2b ,因此仅简要提及步骤 2a 。如果您希望使用步骤 2b
步骤 2a:用 Ubuntu 18.04 ISO 镜像制作一个可启动的 USB 闪存驱动器
这里有一个很棒的 Ubuntu 教程,教你如何在闪存盘上制作可启动的 ISO 镜像。对于这篇文章,我没有制作 u 盘,而是刻录了一张 DVD。
步骤 2b:使用 Ubuntu 18.04 ISO 映像刻录 DVD
假设 Ubuntu ISO 镜像(在我的例子中称为 Ubuntu-18 . 04 . 1-desktop-amd64 . ISO)已经下载到了你的 PC 上——那里暂时还安装着 Windows 去找到。iso '文件。
在 Ubuntu 官方网站上,有专门的在 Windows 上刻录 Ubuntu DVD 的教程。当您将 DVD 插入 PC 上的读/写驱动器时,如果您使用的是 Windows 10,您可以右键单击下载的文件,然后选择“刻录光盘映像”将 ISO 映像刻录到 DVD 上,如图 1 所示。
Fig 1: burning ISO image onto writable DVD
一个新的“Windows 光盘映像刻录机”窗口将出现,如图 2 所示。选择要刻录为(在本例中)“Ubuntu-18 . 04 . 1-desktop-amd64 . iso”的光盘映像文件。勾选标有“刻录后验证光盘”的方框,以确保刻录成功。
Fig 2: choosing where to burn the ISO image and verifying disk
在刻录过程结束时,您应该会在状态栏中看到一条消息,显示“光盘映像已成功刻录到光盘”。至此,你已经准备好使用你的 Ubuntu 了。iso 镜像来启动你的电脑,如步骤 3 所述。
步骤 3:使用 DVD(或 u 盘)上的 ISO 启动 Ubuntu
我选择用一张刻录了 Ubuntu ISO 的 DVD 启动。 Ubuntu 说明书上写着:“从 DVD 上安装 Ubuntu 很容易。你需要做的是:
- 将 Ubuntu DVD 放入光驱。
- 重新启动计算机。
一旦你的电脑启动,你会看到欢迎窗口。"
我的 windows 10 电脑无法从 Ubuntu 自动启动。iso DVD,而是默认引导到 Windows 10,忽略可引导。驱动器中的 iso DVD。如果您遇到这种情况,请查看下面的步骤 3a。
步骤 3a(可选):如果你不能从新的启动到 Ubuntu,需要进一步的操作。iso DVD:
如果你的电脑正常启动到 Windows 10,但没有从 Ubuntu 自动启动。iso 磁盘,您可以
a) 用一个键进入 BIOS(当你启动的时候,选项有时会短暂的闪烁——但是我的选项根本不会出现)或者,
b)使用 Window 10 的高级开始菜单。
对于选项 a),本文还包含最常见 bios 选项的有用指导,以及如何进入 bios。它指出 F12 是调出系统启动菜单最常用的键,但是 Escape、F2 和 F10 也是常用的选择。它建议你在系统启动时寻找一个简短的信息,它可以通知你按哪个键来调出启动菜单。在我的情况下,这些选项根本没有闪现,也没有尝试 F12,F2,F10 等。因此,我选择使用 Window 10 的高级开始菜单,如步骤 4 所述。
第四步:使用 Window 10 的高级开始菜单启动 DVD
要使用 Windows 10 的高级开始菜单,请导航到“设置”(齿轮图标),或在 Windows 10 开始菜单中搜索“设置”。在“设置”中,底部的选项(如图 3 所示)是“更新和安全”选项。
Fig 3: Windows 10 settings — the bottom setting in the list is “Update & Security”
选择“更新和安全”(图 3)将带你到一个更远的窗口,有更多的选项列表(图 4)。选择“恢复”。
Fig 4: Recovery option in Update & Security within Settings
当您从图 4 的选项中选择“恢复”时,会显示各种恢复选项(图 5)。
Fig 5: Recovery Options & Choosing ‘Advanced start-up’ option
在图 5 的恢复选项中,选择“高级启动”,这将允许从 USB 驱动器或 DVD 启动。选择此项将自动重启你的电脑。在这一阶段,确保你有装有 Ubuntu 的 DVD 或 u 盘。iso 文件,在适当的 PC 驱动器中。
使用 DVD 重启/重新启动
在这一阶段,您的电脑会自动重启,u 盘或 DVD 放在电脑驱动器中。图 6 显示了带有选项的启动窗口。在此窗口中,您应该选择使用一个设备(USB 驱动器或您的 DVD,视情况而定)进行引导。
Fig 6: Screenshot on Windows 10 PC restart where a device is chosen to boot from (USB or DVD with Ubuntu .iso)
在我的例子中,我选择了图 7 所示的 CD/DVD 驱动器选项,因为它包含了 Ubuntu。我需要安装的 iso 文件。
Fig 7: Choosing device type (in my case DVD) to boot up from
步骤 5:从 DVD 光盘启动 Ubuntu
一旦电脑再次启动,这次是进入 Ubuntu,Ubuntu 红色和紫色的桌面背景就会显示出来。会出现一个名为“安装 Ubuntu 18.04.LTS”的图标;这在图 8 的左上角可见。如果你双击图标,这将打开一个窗口(“擦除磁盘并安装 Ubuntu”),这将开始完整的安装过程,如图 8 所示。单击该窗口上的“立即安装”按钮开始安装过程。Ubuntu 的最终安装是通过一系列窗口一步一步引导的,这里也描述了。
Fig 8: Clicking on the ‘Install Ubuntu’ icon (top left) starts the full disk erasure and Ubuntu installation process
结论
这篇文章阐述了 Ubuntu 仿生海狸(18.04 LTS)的安装,在这个过程中擦窗户 10。该系列未来的帖子将包括为 Ubuntu 18.04 LTS 安装 Nvidia 驱动程序、CUDA、cuDNN 和 Tensorflow。
没有理论,数据科学只是关于猫的迷因
原文:https://towardsdatascience.com/without-theory-data-science-is-just-about-cat-memes-5c3c3948d84f?source=collection_archive---------21-----------------------
仅依赖原始数据会限制您的数据科学工具的范围
数据科学的前景是巨大的,有时感觉你可以强行进入几乎任何有统计学意义的关系,而不用担心理论。那么我们真的应该就这样抛弃后者吗?
在下文中,我不争辩,因为:
1.你的数据是从来没有那么好
2.有因果关系:这很复杂
Lol cat, exhibit 1
炒作,炒作,万岁!
长期以来,理论(如经济学、语言学等。)在那里指导决策制定,同时在计算能力方面保持吝啬。然而,摩尔定律将我们带到了一个阶段,计算机将在几秒钟内产生统计算法,这些算法在几年前被认为过于贪婪而无法实现。
媒体不失时机地给予关注,例如《连线》2008 年的这篇文章:
“忘掉分类学、本体论和心理学吧。谁知道人们为什么做他们所做的事?关键是他们做到了,我们可以以前所未有的保真度跟踪和测量它。有了足够的数据,数字就说明了一切。”
这当然是一个非常天真的说法,任何一个做过数学的人都会知道。但这里更重要的一点是,有些人愿意向你出售他们的数据科学蛇油,这不仅仅是夸大其词:他们通常是在公然对你撒谎。就拿同一篇文章来说吧:谷歌当时和现在的研究总监彼得·诺维格(Peter Norvig)被引述说:“所有的模型都是错的,越来越多的情况下,没有它们你也能成功。”结果是他实际上从未说出被认为是他说的话,他甚至说了相反的话!
只是没有深入到你的数据中
好吧,有些人夸大了它,但它有多糟糕呢?让我们面对现实吧:目前,数据科学最好的情况是识别猫的图片。现在,自动识别图片、识别口头指令或推荐打字内容显然非常有用,因为它可以增强用户体验,并自动完成单调乏味的劳动密集型任务。
但在 Siri 和谷歌翻译之外,商业环境中的人们通常对了解他们所做决定的效果感兴趣,看看他们是否应该做出这些决定。
一只猫有一些特征来定义它,包括耳朵、尾巴、胡须等等。所以最后,铲子就是铲子,猫就是猫。
但是当涉及到人类时,事情就变得更加混乱了。客户的购买习惯、欺诈者的盗用技术或优步司机的乘车模式都是人们对其环境做出反应的结果,并考虑了他们行为的成本和收益(尽管可能没有达到最大程度)。这些成本和收益会随着时间的推移而变化,例如,随着法律或可用技术的变化而变化。他们也可以因参与者的学习而改变。
一个例子可以更好地说明为什么在这种情况下理论变得非常重要:想象一下,我正试图以 1000 美元的价格卖给你一支普通的铅笔。你不会买它,可能会说:“不可能,这不是一支铅笔的价格!”。你是对的,因为我的提议不是价格,除非你我同意交换。
这个基本的玩具例子在现实世界中可能会产生戏剧性的后果:在与一家相对较大的科技公司的数据科学家的讨论中,他们真的很困惑地听说,供应商在其平台上发布的价格实际上只有在卖家遇到买家时才成为价格信息。这意味着至少 75%的数据应该被丢弃,因为大多数帖子最终都没有在交易中结束。
关于人类行为的数据充斥着这类问题,讨价还价只是其中之一。这意味着,任何一个盲目适合数据的模型都只会和它所适合的数据一样好,直到新的东西出现,改变了代理之间的交互的性质。因此,既然所有数据集的母体并不存在,那么理论所做的就是将人们从其他不相关的数据集中学到的知识编织成常识。这就是理论作为概括的明显作用。
因果
现在,理论不仅证明在(永远)不完整数据集的情况下更稳健。数据科学越来越关注因果推理,试图回答这样一个问题:为什么会这样?这不仅仅是纯粹的相关性(例如,吸烟的人死得更早),而是找出发生了什么,以便我们能够采取行动(例如,香烟烟雾中含有各种各样的东西,这些东西会滞留在肺部,有可能恶化为癌症:由此你可以有把握地得出结论,停止吸烟有助于避免过早死亡)。
纯粹基于统计理由建立因果推断有两个问题:稳健性和可解释性。稳健性问题是上一节提出的观点的另一种表现形式:如果你对观察结果背后的机制没有概念,你就不能仅仅根据你的数据安全地进行概括。
至于可解释性,决策总是需要关注价值和风险的正确驱动因素。在某种意义上,理论是一种变量选择工具,这是原始统计技术的目标。以 LASSO 和其他正则化技术为例:众所周知,基本变量通常取决于所选的数据子集。解释能力到此为止!不言而喻,本质上是高性能预测黑盒的深度学习技术在这方面甚至更差。
在某些情况下,人们可能能够使用 A/B 测试来隔离因果关系。然而,如果没有理论,这种方法在许多情况下会遭受所谓的干扰偏差,特别是对于平台。为了理解这一点,让我们想象 Deliveroo 要建立某种优先交付。在这种情况下,因为 Deliveroo 是一个多方面的平台,将客户、餐厅和送货员联系在一起,所以人们不能只是以通常的方式在参与者的代表性子集上进行测试。这里的问题是,该实验正在改变对照组(优先递送功能未被激活)和治疗组(消费者可以选择优先递送)之间的竞争格局。因此,需要理论(这里是供求分析,可能与博弈论或产业组织相结合)来指导实验的设置,以考虑外部性并中和任何不必要的影响。
不要错过
总而言之,如果一个人对决策感兴趣的话,仅仅依靠理论上的数据是不可能的。如果尽管进行了上述讨论,你仍然心存疑虑,请记住,这不仅仅是我说的,还有计量经济学家如库普曼斯,或计算机科学家如彼得·诺维格或朱迪亚·珀尔。在他们之前,这种方法可以追溯到哲学家,如康德。相关性是一件美妙的事情,但是(套用舞韵合唱团的话)不要让自己被滥用!
数据故事——过去 30 年议会中的妇女
原文:https://towardsdatascience.com/women-in-parliament-worldwide-in-the-past-30-years-data-driven-analysis-272dbc88f6f7?source=collection_archive---------22-----------------------
基于联合国数据集对 1990 年以来世界各国议会中女性代表情况的探索性分析
当我们结束 2000 年代的第二个十年时,我发现回顾过去 30 年各国议会中的女性代表情况很有意思。为了了解我们从哪里来,我们去了哪里,我使用了联合国的数据集,并在非洲大陆和国家一级进行了分析,然后深入研究了有突出数字的国家,并试图了解它们是如何发生的,以及如果我们希望在其他地方看到类似的表现,我们应该从中吸取什么教训。在分析过程中,我发现了几个有趣的、令人惊讶的和令人鼓舞的发现,我将在这篇博文中展示和讨论这些发现,所以废话不多说,让我们开始吧。
各大洲——总体趋势是积极的,澳大利亚和新西兰在代表性方面领先
我首先好奇的是各大洲的趋势。得知全世界的总体趋势无一例外都是积极的,我感到惊讶和高兴。此外,有趣的是,看到非洲和亚洲开始时非常接近,但分开了,在这一时期结束时,非洲比亚洲表现出更高的代表性,然而,他们的趋势非常相似。欧洲和美洲的接近也很有趣——我希望看到这两个地区的不同模式。最后但同样重要的是,澳大利亚和新西兰显示出独特的模式,在整个期间,妇女在议会中的代表比例最高,在 2015-2016 年期间略有下降,然后是稳定的积极趋势,我希望这一趋势在未来继续下去。
然后,我查看了每年所有分支机构的代表情况。这方面的趋势也是积极的——在 90 年代初,我们勉强抓住了女性所占席位的四分之一,而在 2019 年,次大陆的最高平均水平超过了 35%。这不是最理想的,但似乎我们正在慢慢实现。然而,需要注意的一件重要事情是每个盒子的底线——一些次大陆仍然保持着平均低于 5%的女性席位。
然后,我将各大洲分成五个组,因为我预计同一个大洲的子大陆会聚集在一起。令人惊讶的是,这种情况并没有发生,从结果中可以看出,例如,我们将北欧和西欧以及加勒比海和东非放在同一个群集 0 中,而在另一个群集 0 中,我们将南亚和西亚与中非、西非和大洋洲放在一起(群集 1)。不同的次大陆显示的模式与它们的邻居不一样,但与地球上其他地方的次大陆相似。
观察每个集群会发现一些有趣的模式:
第一个集群将最初占 20-28%的子大陆组合在一起,缓慢但稳定地上升,并在 2019 年达到 33%以上。有趣的是,我们在这里可以看到,加勒比海地区开始时的比例最低,略高于 20%,结束时的比例最高,略高于 35%,而南部非洲开始时为 22.5%,在最初的十年里有了很大的飞跃,并在过去十年里保持了大约 33%的稳定比例。
第二类是不太同质的子大陆,从低于 12%的相对较低的代表开始,有一个小的飞跃和下降,然后集中在 16%左右。
在第三组中,我们有相邻的美拉尼西亚、波利尼西亚和密克罗尼西亚,它们各自显示出相当独立的模式,我假设它们由于与所有其他次大陆相比的独特性而聚集在一起。请注意一路走来的小代表,在 2000 年抓到 5%,现在保持在 10%以下。
第四个聚类对 2000 年至 2015 年间代表人数大幅增加的次大陆进行了分组,然后在过去四年中保持稳定的代表人数,其中一些次大陆的代表人数有所增加。如果有人想知道如何扩大女性在议会中的代表性,那么这个集群中的次大陆是值得学习的地方,特别是南欧的代表在 2000 年至 2015 年间增加了两倍,中美洲的代表在同一年间增加了一倍,并且在过去四年中继续增加。
最后一组相当混乱,没有一个明确的模式。我们确实在这里看到了在 2015-2019 年间保持稳定的国家,以及在此之前几年上升的国家。有趣的是,东南亚和南美洲(橙色和红色线)在 2000 年至 2010 年间的代表性和上升率几乎相同,但随后又有所不同,后者的代表性有所下降,而第一名的代表性最高。另一个值得学习的次大陆是北非,在 2000 年至 2015 年期间,这一比例增加了 4 倍,然后在过去 4 年保持稳定。
国家——我们能从卢旺达和玻利维亚学到什么
然后我放大了这些国家。我想知道的第一件事是,基于更高分辨率的每年的盒状图是否会很快显示出一些有趣的东西——答案是肯定的。在这个图中,有更好的消息,范围的上限从 1990 年的 30%以下延伸到现在的 50%以上,异常值在 1990 年达到 40%,现在超过 60%。在这里,注意每年的下限也很重要——过去和现在都有国家的议会中没有女性代表。
研究这些国家的描述性统计数据会发现更多有趣的事实。从最大值直方图(左上角)中,我们可以看到,只有 11 个国家(数据集中总共 195 个国家)达到了低于 10%的最大代表比例,根据最小值直方图(左下角),大多数国家在观察期间至少有一次由妇女担任的席位不到 10%。平均直方图(右上角)显示,在大多数国家,平均比例超过 10%,其中一些国家的比例超过 40%,这一事实使人们有理由乐观地认为这一趋势将持续下去。标准差直方图显示,大多数国家都有稳定的代表率。
然后我想看看自 1990 年和 2010 年以来取得的进步。为此,我计算了每个国家在 2019 年和 2010 年、2000 年和 1990 年之间的代表性差异(即过去 10 年、20 年和 30 年的差异)。下面的直方图总结了差异的总体趋势。
我们可以看到,许多国家做出了微小的改变(如果有的话),少数国家做出了重大的积极改变,而一些国家在观察期间出现了下降。
然后,我放大了具体的国家,检查了哪些国家在过去 10 年、20 年和 30 年中女性比例上升幅度最大。
有趣的是,这些国家大多是发展中国家,卢旺达、玻利维亚和格林纳达名列前茅。
这些飞跃的主要原因之一是配额——这种制度的核心思想是招募女性担任政治职务,并确保她们不只是政治生活中的一些象征,通常是通过为女性保留特定数量的席位。这种制度自 1997 年起在玻利维亚实施,随着性别平等是国家基本价值观之一的新《宪法》的通过,以及 2012 年该国通过的《禁止对妇女的政治暴力和骚扰法》的通过,这种制度促进了代表人数的增加。在卢旺达,这一进步主要归功于 1995 年的种族灭绝,当时大约 65%的人口是女性,也归功于保罗·卡加梅——自 2000 年起担任卢旺达总统,他领导了对平等的呼吁。卢旺达妇女人数上升的其他因素是,该国于 2003 年通过了新宪法,规定 30%的议会席位将保留给妇女(配额),并努力教育女孩和任命妇女担任领导职务【3】。相反,格林纳达已经取得了重大进步,尽管该国没有采取任何措施来实现这一进步【4】。
还有这个比率的另一面——代表率变化最小的国家,其中一些国家出现了负变化,这意味着他们的代表率在几十年间下降了。有些下降是因为开始时比例很高,有些是因为政府不太愿意处理平等代表权的问题。
我停留在单个国家的决议中,检查了 1990 年、2000 年、2010 年和 2019 年女性所占席位百分比最高和最低的国家是谁。
在 20 世纪 90 年代代表性最高的国家(左图)中,除了冰岛,还有两个前苏联国家(土库曼斯坦和亚美尼亚)以及圭亚那、罗马尼亚、古巴和阿尔巴尼亚。在右边的图中,我们看到了代表率最低的国家,在观察的年份都是 0%。
在 2000 年,斯堪的纳维亚人仍然在左边的列表中占据首位,这里几乎所有的国家都是欧洲和/或属于发达国家。在右边的图中,我们仍然可以看到没有代表的国家,但有四个国家的议会中有一些女性,这是一个小小的鼓舞。
2010 年,我们在左图中看到了更多的非洲国家和更少的欧洲国家,女性占据了更高比例的席位。卢旺达今年已经以多数票高居榜首(!)议会中的女性。在右边,我们看到议会中没有女性的国家更少,这里的最高值高于前十年同一列表中的最高值。
然后我们就到了现在。至于 2019 年,世界上有三个国家的女性在议会中占多数——卢旺达、古巴和玻利维亚。纵观最高代表的名单,我们看到更多的非洲国家和更少的欧洲国家(只有两个),这一荣誉不是由斯堪的纳维亚人保持的,令人惊讶的是——尽管头条新闻——芬兰甚至没有进入前十名。在右边,我们看到只有两个国家的妇女任职人数为零,这两个国家的妇女任职人数也高于十年前。
我从这四个数字得出的主要结论是,情况仍然不是最佳的,但总体上正在改善。此外,通过深入研究数字背后的故事,我得出结论,妇女代表人数的增加通常是具体行动的结果,而在政府忽视平等代表问题的地方,数字很低,在一些地方还在下降。
最后,我画出了当今世界每个国家的女性代表。我希望这一数字将提醒我们,尽管上述总体趋势是积极的,但我们仍有很长的路要走。
(要查看每个国家/地区的地图和图示,请按 Run Pen 并将鼠标悬停在地图上)。
方法
我分析的数据集包含了 1990 年、2000 年、2005 年、2010 年和 2015 年至 2019 年期间世界各国议会中女性所占席位的百分比,以及 2000 年、2005 年、2010 年、2015 年至 2019 年期间各大洲和次大陆的平均百分比。
我为分析写的数据集和代码可以在这里找到。
参考文献
【1】https://www.idea.int/data-tools/data/gender-quotas/quotas?FB clid = iwar 0 ekcthhoewxfs 0 ysgnskagottpro _ omtj 1 pr-yudhl 44 tnmsicfkdeehe # what
【2】https://www . idea . int/news-media/news/Bolivian-elections-result-more-women-parliament?FB clid = iwar 1 fu 1 ejentso 2 fejp 3 peoplz 7 ei 7 pmeezgts 5 lt-qwskwwehntjnua 10kc
【3】https://www . NPR . org/sections/goatsandsoda/2016/07/29/487360094/invisibilia-no-one-thought-this-all-woms-debate-team-can-crush-it
【4】https://iknow politics . org/sites/default/files/JM _ where _ are _ the _ women _ CARICOM . pdf
人工智能领域的女性领导者——负责任人工智能的 10 项原则
原文:https://towardsdatascience.com/women-leading-in-ai-10-principles-for-responsible-ai-8a167fc09b7d?source=collection_archive---------19-----------------------
想象一个世界,每个人都和你一模一样。你早上去上班,看到你的同事,他们都和你同时到达,穿着相同的衣服。你今天晚些时候有一个会议,里面都是和你一样的人。你是那种喜欢在会议上表达不同意见的人,因此其他人也是如此,所以你们进行了一些激烈的讨论,但最终就会议开始时计划做的事情达成了一致。没有新的创意来挑战你的观点。
下班后,你和一些朋友见面。他们都和你一模一样,和你有着相同的兴趣,对这些兴趣有着相同的看法。
Wondering who took the photo? Look at the reflection in the glasses.
听起来很棒?没有…?我也不喜欢它的声音。
我们宇宙中的许多美丽都源于多样性。如果一切都是完全均匀的,我们只会有比绝对零度高几度的灰色污泥均匀地充满我们的整个宇宙。我们将没有星系,没有恒星,没有飞机,没有地球,没有人类…
现代社会的多样性和包容性面临着一个新的风险:人工智能。在最好的情况下,人工智能可以对我们的家庭和工作生活产生重大的积极影响——找到治疗疾病的新方法,帮助我们更好地管理时间,找到我们以前从未听过的新音乐。然而,如果没有适当的制衡,就无法保证我们会看到人工智能的积极未来,也无法保证这种收益会在我们的社会中平均分配。相反,我们最终可能会拥有限制自由、不公平地惠及社会、强化或放大现有偏见的人工智能。
进入人工智能领域的女性领导者(WLinAI)和她们的“负责任的人工智能 10 大原则”。
WLinAI 由 Ivana Bartoletti、Allison Gardner 和 Reema Patel 三位领导人工智能讨论和发展的女性创立。目标?在人工智能领域发展多元化的女性和男性支持者网络,促进公平、平等和消除人工智能中的偏见,分享研究成果,并在这些主题上影响政治家。
“负责任人工智能的 10 项原则”是这些目标的顶点。他们提供了一套由包容性社区定义的实用指南,其格式与我们的政府产生了共鸣,提出了政策建议,以确保人工智能是公平的,没有偏见的,并促进平等。
“引入一种管理人工智能部署的监管方法,这种方法反映了用于制药行业的方法。”—建议 1T3
10 项建议的核心是务实。当我们探索 AI 时,我们可能会倾向于认为,既然这是一个新的复杂的新技术空间,那么我们期待答案填充一个复杂的新技术空间。事实并非如此。我们可以从其他更成熟的行业中获得灵感来形成我们的方法,并根据任何特殊的考虑对它们进行调整。
以自动驾驶汽车为例。如果它陷入这样一种境地,它做出的所有选择都导致人类受伤或更糟,它该怎么办?为什么不从医学伦理委员会那里获得灵感呢!技术可能有所不同,但我们为回答这些难题而开发的系统可能对这两种应用都有益。
那么监管呢?我们经常被告知监管扼杀创新,但这不是我们在制药行业看到的情况。相反,监管建立了消费者信任,引导制药公司生产更安全、更可持续的产品。我们也看到消费者转向道德消费。这种支出不仅仅是环保和公平贸易产品。它涵盖了所有展现道德价值观并采取行动造福社会的企业。
创造安全且符合价值观的人工智能可能会很复杂,这项研究由大型科技公司领导,这些公司有能力让研究和政策团队进行分析。许多较小和较新的玩家可能想做同样的事情,但他们努力争取时间和成本来实现这一点。监管可以创造公平的竞争环境,甚至提供实现这一目标所需的免费工具和知识。以欧盟 HLEG(目前的草案)道德准则或算法影响评估为例——这两者都很难从零开始创造,但国际政府正在帮助传播和获取这种知识。从今年 2019 年年中开始,我们将看到欧盟 HLEG AI 政策和投资建议的最终版本,这将为我们提供一个强有力的迹象。
“建立一个人工智能监管职能部门,与信息专员办公室和数据道德中心合作——审计算法,调查个人投诉,对违反 GDPR 及平等和人权法的行为发出通知和罚款,提供更广泛的指导,传播最佳做法,并确保算法必须向用户充分解释并公开接受公众监督”——建议 2
10 项建议还就如何超越现有立法向我们的政府提出了建议。《GDPR 法案》是对《数据保护法》的一次大规模改革,但我们的政府不能一成不变,否则就有让 GDPR 变得像《数据保护法》一样过时和不完善的风险。
尽管 GDPR 无疑对社会具有积极的潜力,但在某些领域它走得还不够远,在其他领域,我们需要具体的政府职能来解决与人工智能和算法有关的更多利基问题。例如,欧盟的信条之一是透明,在 GDPR 问题上,我们有经常被引用的“解释权”只是,目前我们没有解释的权利。这只是在叙述中提到,但从未包括在 GDPR 的文件中。
为了保持我们的透明度价值,WLinAI 建议我们增加一个新的监管职能,该职能理解提供解释意味着什么,甚至帮助企业实现完全可解释性。
“开展技能审核,以确定拥抱人工智能革命所需的广泛技能。”—建议 9
人工智能不会是第一个改变和取代我们劳动力的技术。我们已经看到了两次工业革命,人类的工作被某种技术取代,而且看起来,就业率仍然很高。这并不意味着这很容易,也不意味着我们没有教训可学。
在之前的工业革命之后,普通人经历了几十年的斗争,就业市场没有准备好吸收新的劳动力,培训也没有到位,让他们为这些不同的职业做好准备。即使当就业市场复苏时,这些工人的情况似乎也没有改善。商业利润飙升,但实际上人们变得更穷了,职业发展更慢,有时工作也不那么愉快。
人工智能革命可能会比以前的工业革命更快,更具破坏性。为了避免被剥夺权利的一代工人越来越感觉与曾经雇佣他们的企业的飙升财富脱节,我们必须积极主动地识别将继续相关的技能,而不仅仅是对工人进行技能再培训,这些技能在人工智能革命后将是多余的。
这是我们过去失败的一个领域。2018 年 OEDC 的数据显示,28%的英国毕业生对于他们所从事的工作来说是大材小用。从历史上看,再培训是相当无效的,给了人们错误的技能,这些技能可能在他们生活的地方或其他任何地方都无法就业,或者与他们实际想要做的工作类型不匹配。
因此,在简单地向再培训投入资金之前,WLinAI 建议我们对实际上能帮助人们的技能进行一次彻底的审核。
“制定教育和培训计划,以满足技能审核确定的需求,包括数据伦理和社会责任方面的内容。作为其中的一部分,我们建议设立一个坚实、勇敢和严格的计划,以鼓励年轻女性和其他代表性不足的群体进入技术领域。”—建议 10
男的做科技,女的做设计师对吧?不对。
这不仅是一个有偏见和不真实的假设,而且也不符合历史。1945 年,第一台全数字计算机 ENIAC 程序雇佣了 6 名女性作为第一批程序员,几十年来,女性一直引领着计算机科学领域。直到 1984 年,学习计算机科学的女性开始迅速减少。
为什么?回顾过去,许多因素共同导致了男性将女性挤出计算机科学领域,首先是 1964 年哈罗德·威尔逊的一项倡议,该倡议旨在拥抱技术革命,创造一个“有职业意识、有管理抱负的年轻男性人才库”
然后是上世纪七八十年代的硅谷淘金热,人们意识到两件事:编程很难,价值很高。男性对该领域越来越感兴趣,提高了所需的教育要求,进一步将女性挤出了计算机科学领域。
快进到今天,我们看到不到 30%的女性在硅谷从事技术工作。具体来看人工智能,数字甚至更令人担忧,在人工智能研究白皮书中列出的名字中,女性仅占 10%。
数据科学是目前最赚钱的职业之一,在开发生命周期中让不同的工作人员参与进来有助于在所创建的系统中建立不同的价值。对于我们的政府和受其影响的科技公司来说,重新平衡应该是当务之急。
我只概述了 WLinAI 提出的 10 条建议中的 4 条。作为一个整体,它们为我们的政府超越欧洲标准奠定了坚实的基础——不仅维护而且增强了我们的平等、民主、自由和人类尊严的价值观。我们的目标是使用人工智能来促进共同利益——一种不会在歧视他人的同时不成比例地偏向个人或群体的利益。公共利益平等地帮助所有人,这样做确保所有人都比在不公平的制度下过得更好,即使是对他们有利的制度。略高于绝对零度的灰色污泥对任何人都没有好处,但看到多样性带来的恒星和星系激励着我们。
Hubble Space Telescope — Pillars of Creation
想知道如何构建异常检测模型?
原文:https://towardsdatascience.com/wondering-how-to-build-an-anomaly-detection-model-87d28e50309?source=collection_archive---------2-----------------------
用 python 从头开始创建自己的异常检测模型
Photo by Jefferson Santos on Unsplash
嘿伙计们!你有没有想过银行是如何识别欺诈账户的?或者,如何检测网络中的一些故障服务器?或者你如何解决机器学习中的问题,你没有足够的关于你的正面例子的知识?
你来对地方了。异常检测是一种用于识别不符合预期行为的异常模式的技术,称为异常值。它在商业中有许多应用,从入侵检测(识别网络流量中可能预示黑客攻击的奇怪模式)到系统健康监控(在 MRI 扫描中发现恶性肿瘤),从信用卡交易中的欺诈检测到操作环境中的故障检测。
完成后你会学到什么
- 你会明白如何使用 numpy,以及如何使用它做矩阵乘法。
- 您将使用 matplot 库来绘制和可视化异常。
- 您将使用高斯分布来寻找数据集的概率。
- 您可以应用矢量化来提高代码效率。
- 你将学习 F1 分数的概念,并用它来计算精确度和召回率,使你的预测更加准确。
- 您可以使用 try-except 学习 python 中的错误处理。
嗯…激动?让我们开始吧。
我们在做什么?
因此,我们正在制作一个异常检测模型,并应用它来检测网络上的故障服务器。在进入原始数据集之前,让我们首先想象一下如何进行和执行不同的功能。让我们从导入几个库开始。
我们将使用一个虚拟数据集来检查所有函数是否正常工作,然后我们将在原始数据集上使用这些函数。我们和好了吗?现在,我们将导入数据集,需要注意的一点是这里的数据集应该位于脚本所在的同一个目录中。
sio.loadmat()将我们的数据集(' anomalyData.mat ')加载到变量 dataset 中。变量“X”包含训练数据集,“Xval”包含交叉验证集,“yval”包含“Xval”的相应输出。让我们看看数组“X ”,我们将使用它来拟合高斯模型,以检测异常示例。
print(X.shape)
(307, 2)
如您所见,有 307 个训练示例,每个都有 2 个特征。这些特性测量每个服务器的吞吐量(mb/s)和响应延迟(ms)。当您的服务器运行时,您收集了 m = 307 个关于它们如何运行的示例,因此有一个未标记的数据集{x(1),。。。,x(m)}。您怀疑这些示例中的绝大多数都是服务器正常运行的“正常”(非异常)示例,但是在这个数据集中也可能有一些服务器异常运行的示例。现在,让我们将数据集可视化,以便有一个清晰的画面。
Fig.1
高斯分布
要执行异常检测,首先需要使模型符合数据的分布。给定一个训练集{x(1),…,x(m)}(其中 x(i) ∈ R^n,这里 n = 2),您想要估计每个特征的高斯分布。对于每个特征(i = 1。。。n),你需要找到参数均值和方差(mu,sigma)。为此,让我们写下计算数组(或者你可以称之为矩阵)x 的均值和方差的函数。
数学表达式是这样的:
Fig.2
我们必须计算每个特征的平均值,在此帮助下,我们计算相应特征的方差。让我们把它写成代码。
mu, sigma2 = estimateGaussian(X)
print('mean: ',mu,' variance: ',sigma2)
mean: [[14.11222578 14.99771051]] variance: [[1.83263141 1.70974533]]
现在我们有了均值和方差,我们需要计算训练样本的概率,以确定哪些样本是异常的。我们可以通过使用多元高斯模型来实现。
多元高斯分布
多元高斯函数用于计算每个例子的概率,并根据某个阈值决定是否标记异常。计算高斯模型参数的表达式为:
Fig.3
这里,μ是每个特征的平均值,变量 sigma 计算协方差矩阵。这两个参数用于计算概率 p(x)。“e”是我们将进一步详细讨论的阈值。一旦理解了表达式,代码实现起来就非常简单了。让我们看看如何把它变成代码。
在函数内部,首先,我们将 sigma2 向量转换为协方差矩阵,然后简单地应用多元分布公式来获得概率向量。如果你在 sigma2 中传递了一个向量,你必须将它转换成一个矩阵,向量作为对角线,元素的其余部分为零(第 6 行)。
p = multivariateGaussian(X, mu, sigma2)
print(p.shape)
(307, 1)
因此,你已经成功地计算出了概率。接下来,你必须使用一些带标签的数据来计算阈值。让我们看看如何做到这一点。
pval = multivariateGaussian(Xval, mu, sigma2)
我们找到“Xval”的概率,将其与“yval”进行比较,以确定阈值。让我们找出阈值。
首先,我们发现步长有一个很宽的阈值范围来决定最好的一个。我们使用 F1 得分方法来确定最佳参数,即bestε和 bestF1。预测异常如果 pval < epsilon 在变量中给出一个二进制值的向量预测。F1 分数考虑了精度和召回率。
在第 19 行,我实现了一个 for 循环来计算 tp、fp 和 fn。如果你能拿出一些逻辑的矢量化实现,我很想听听你的意见。
Fig.4
精度=真阳性/(真阳性+假阳性)
回忆=真阳性/(真阳性+假阴性)
最佳参数是 F1 分数值最大的参数。
注意:我们将需要一个 try-except 块,因为在某些情况下,我们可能会除以零来计算精度和召回率。
F1, epsilon = selectThreshHold(yval, pval)
print('Epsilon and F1 are:',epsilon, F1)Output:Warning dividing by zero!!
Epsilon and F1 are: 8.990852779269493e-05 0.8750000000000001
现在,我们有了最佳的ε值,并且我们现在能够计算训练数据的异常概率。我们也将异常称为异常值。
outl = (p < epsilon)
我们需要返回离群值的索引来识别故障服务器。这给了我们一个带有二进制条目的向量,其中 1 表示异常,0 表示正常。
Output:
Number of outliers: 6
[300, 301, 303, 304, 305, 306]
因此,故障服务器如上所述。我们还可以用图形方式找出异常值。
The red circle shows the faulty servers in the network
恭喜!!我们已经成功地测试了我们所有的函数,我们可以在一些真实的数据集上使用它们来找出异常。让我们完成我们已经开始的。
Output:
(1000, 11)
(100, 11)
(100, 1)
新数据集有 1000 个例子,每个例子有 11 个特征。“Xvaltest”是测试样本的交叉验证集,而“yvaltest”是相应的标签。现在,执行与虚拟数据集相同的操作。
Output:
Warning dividing by zero!!
Best epsilon and F1 are
1.3772288907613575e-18 0.6153846153846154
Ptest 包含测试样本的预测,pvaltest 包含交叉验证集的预测。最佳的ε值是 exp 的阶(-18)。
检查异常值:
输出:
Outliers are:
[9, 20, 21, 30, 39, 56, 62, 63, 69, 70, 77, 79, 86, 103, 130, 147, 154, 166, 175, 176, 198, 209, 212, 218, 222, 227, 229, 233, 244, 262, 266, 271, 276, 284, 285, 288, 289, 290, 297, 303, 307, 308, 320, 324, 338, 341, 342, 344, 350, 351, 353, 365, 369, 371, 378, 398, 407, 420, 421, 424, 429, 438, 452, 455, 456, 462, 478, 497, 518, 527, 530, 539, 541, 551, 574, 583, 587, 602, 613, 614, 628, 648, 674, 678, 682, 685, 700, 702, 705, 713, 721, 741, 750, 757, 758, 787, 831, 834, 836, 839, 846, 870, 885, 887, 890, 901, 911, 930, 939, 940, 943, 951, 952, 970, 975, 992, 996]Number of outliers are: 117
因此,有 117 个异常值,它们相应的指数如上所示。
结论
我知道从零开始有时会很麻烦,但是如果你从零开始做,你会学到很多细节。你可以在这里找到上述项目的 笔记本 。我希望我可以教你一些新的东西,并确保你检查我的 知识库 我已经做了其他项目,如最小化数据中心的成本(使用深度强化学习),数字识别,聚类一只鸟的图像等。
参考文献: 机器学习通过吴恩达
用于文本分类的词袋与词序列
原文:https://towardsdatascience.com/word-bags-vs-word-sequences-for-text-classification-e0222c21d2ec?source=collection_archive---------10-----------------------
当所述序列对分类重要时,序列尊重方法比词袋实现具有优势。在合成文本语料库上,针对具有 tf-idf 向量的朴素贝叶斯评估具有单词序列的长短期记忆(LSTM)神经网络的分类有效性。
想想这两句俏皮话:“为了活着而吃饭”和“为了吃饭而活着”。它们包含相同的单词,但顺序不同——导致意思上的巨大差异。基于单词包的模型不能区分这些文档,因此将它们放在相同的聚类或分类桶中。单词嵌入没有任何帮助,因为预先训练或定制的单词向量只是单词的函数,而没有考虑单词在句子中的位置。我们在以前的文章中考虑的所有 NLP 练习(分类,聚类)都使用了这种单词袋方法将文档转换成数字向量(有或没有单词嵌入),因此也有同样的缺陷。这就是长短期记忆(LSTM)神经网络深度学习的前景可以得到检验的地方。
Figure 1. (A) The meaning implied by the specific sequence of words is destroyed in a bag-of-words approach. (B) Sequence respecting models have an edge when a play on words changes the meaning and the associated classification label
LSTM 神经网络是递归神经网络(RNN)的一个分支,其标志是从序列中学习和预测——例如由单词序列组成的句子/语音,或者监控随时间演变的数据。LSTM 神经网络弥补了从长序列中学习的一些缺点,因此比 RNN 更有效。关于 RNN 和 LSTM 网络,已经有很多文章了,所以我们在这里就不深究细节了。参见 Karpathy 的文章, Colah 的博客对 rnn、LSTMs 及其功能的精彩介绍。当然还有许多关于媒体的文章以及 Jason Brownlee 在机器学习大师上写的文章。
这篇文章尝试使用 tf-idf 向量,用 LSTM 和朴素贝叶斯对合成单词序列进行分类。LSTM 通过 Keras 和 Tensorflow 后端实现。朴素贝叶斯是通过 SciKit 实现的。当我们在这里浏览一些代码片段时,可以从 github 下载重现结果的完整代码。主要进口如下。
import numpy as np
import os
import json
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.model_selection import StratifiedShuffleSplit
import random as rn
import keras
import tensorflow as tf
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
在下面的代码片段中,我们修复了 numpy 和 tensorflow 的随机种子,这样我们就可以获得可重复的结果。此外,在运行模拟之前,我们将 PYTHONHASHSEED=0 设置为 shell 中的环境变量。
#All this for reproducibility
np.random.seed(1)
rn.seed(1)
tf.set_random_seed(1)
session_conf = tf.ConfigProto(intra_op_parallelism_threads=1,inter_op_parallelism_threads=1)
sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
keras.backend.set_session(sess)
1.构建一个文本语料库
这篇文章是为了说明的目的。我们想强调的一点是,当面对必须对文本进行分类时,基于单词包的分类器会严重失败,其中单词序列是类之间的主要区分因素,如上图 1 所示。为了轻松做到这一点,我们构建一个文本语料库,而不用担心所构建句子的含义。
- 挑选一组单词,如前 1000 个最常用的单词,并对它们进行排序。获得 995 个唯一单词。第 2–6 行
- 用这些单词造 3 个独立的句子。
- 有序:取 15 个字,顺序如 0..14, 1..15, … 995..13 等…从这个列表。我们得到 995 个属于这个有序类的句子。第 9–14 行
- 反转:以上每一个序列都是反转的。第 16–18 行
- 无序 : 随机选取 25 个单词组成一个序列。又是 995 个这样的序列,所以三个类都是平衡的。第 19–22 行
- 混洗和分割以获得训练和测试数据集。我们留出所有数据的 20%专门用于测试。第 23–24 行
以下是用这种方法形成的几个样本序列及其所属的类。
有序: ['一','能','约','上','行','加','怕','后','又','反对','年龄','前','同意','空气','所有']
反转: ['所有','空气','同意','以前','年龄','反对','再次','以后','害怕','添加','行为','以上','关于','能干','一']
无序: ['原子','安逸','尝试','船','睡眠','烦恼','见','推','拿','谁','冷','选择','冬天','自己','身边']
2.文档=一串单词
每个文档都是一串单词,我们构建的数据结构可以被 Keras 库中的各种序列相关模型(如 RNN、LSTM 等)用作输入。
2.1 编码
对所有的句子/序列使用 Keras 文本处理器,这样它可以生成一个单词索引,并相应地对每个序列进行编码(下面的第 2 -4 行)。注意,我们不需要填充,因为所有序列的长度正好是 15。
# Encode the documents
kTokenizer = keras.preprocessing.text.Tokenizer() # **Line 2**
kTokenizer.fit_on_texts(X)
Xencoded = np.array([np.array(xi) for xi in kTokenizer.texts_to_sequences(X)]) # **Line 4**
labels = np.array(labels)
2.2 LSTM 实施
我们使用最简单的 LSTM 模型,包括嵌入层、LSTM 层和输出层,如下图 2 所示。
Figure 2. A simple model for LSTM. Input sequences of length 15 are fed in batches of 32 The embedding layer reduces the size of the 1-hot vectors, while the magic of LSTM results in softmax predictions for the 3 possible classes.
顺序的 15 个字(其中每个字是 1-hot 向量)被抽取作为嵌入层的输入,该嵌入层学习用于从 995 长到 248 长的数值向量的降阶的权重。这个 248 长的向量序列被馈送到 LSTM 层,通过 softmax 激活输出层产生 3 长的数值向量。然后,最大值的索引是预测的类别
- 第 5 行:嵌入层构建了一个单词向量,其大小是输入向量的 1/4。也就是说,在我们的例子中,LSTM 层被馈送一个大小约为 250 的数值向量,而我们的输入向量大小约为 1000。
- 第 6 行:LSTM 层输出一个 125 长的矢量,这个矢量在 softmax 激活时被输入到最后一层。
- 第 7 行:最终输出图层生成一个与标注数量一样长的矢量,该矢量的 argmax 是预测的类标注。
有了数据和模型,我们就可以训练模型并测试预测了。因为这是一个多类分类,所以我们在第 3–4 行将标签转换为 1-热点向量
train_x = Xencoded[train_indices]
test_x = Xencoded[test_indices]
train_labels = keras.utils.to_categorical(labels[train_indices], len(labelToName))
test_labels = keras.utils.to_categorical(labels[test_indices], len(labelToName))
在多次训练/验证模拟中,80%的数据被分成验证(这 80%的 20%,即总体 16%)和训练集(总体数据的 64%)。
- 第 2 行:如果确认损失在任何连续 5 个时期都没有减少,我们退出并停止训练。
- 第 3 行:我们设置了 10 个不同的训练/验证分割来循环。
- 第 7 行:培训以 32 个句子为一批,最多 50 个周期,如前所述,提前停止回拨。
- 第 11 行。从 softmax 输出向量中获取实际预测的标签。
3.文档=文字袋
使用 SciKit 的矢量器,从单词包方法中构建矢量非常简单。在之前的帖子中,我们已经多次这样做了。这里我们使用 tf-idf 矢量器进行编码。
3.1 编码
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(analyzer=lambda x: x, min_df=1).fit(X)
Xencoded=vectorizer.transform(X)
上面第 2 行的结果是一个稀疏的 tf-idf 数值向量数组,它可以提供给任意数量的传统分类器,如朴素贝叶斯、支持向量机等。这里我们选择朴素贝叶斯,它们中最简单的一个。
3.2 朴素贝叶斯实现
我们在下面的代码片段中使用了 SciKit 的 API。用于 LSTM 的相同的训练/测试数据在这里被用于训练和预测。
4.结果
对于我们在这里对比的两种方法,完整的代码在 github 上以 lstm.py 和 nb.py 的名称下载。
4.1 LSTM
样品运行与
#!/bin/bash
PYTHONHASHSEED=0 ; pipenv run python lstm.py
产量:
Layer (type) Output Shape Param #
=================================================================
embedding_1 (Embedding) (None, 15, 248) 247008
_________________________________________________________________
lstm_1 (LSTM) (None, 124) 185008
_________________________________________________________________
dense_1 (Dense) (None, 3) 375
=================================================================
Total params: 432,391
Trainable params: 432,391
Non-trainable params: 0
_________________________________________________________________
None
Train on 1910 samples, validate on 478 samples
Epoch 1/50
- 3s - loss: 1.1036 - acc: 0.2890 - val_loss: 1.1027 - val_acc: 0.2322
Epoch 2/50
- 3s - loss: 1.0813 - acc: 0.4429 - val_loss: 1.1533 - val_acc: 0.2343
Epoch 3/50
..
..
Epoch 11/50
- 3s - loss: 8.5663e-04 - acc: 1.0000 - val_loss: 0.6081 - val_acc: 0.9079
Epoch 00011: early stopping
Confusion Matrix:
[[190 4 5]
[ 0 199 0]
[ 14 28 157]]
Classification Report:
precision recall f1-score support
ordered 0.9314 0.9548 0.9429 199
reversed 0.8615 1.0000 0.9256 199
unordered 0.9691 0.7889 0.8698 199
micro avg 0.9146 0.9146 0.9146 597
macro avg 0.9207 0.9146 0.9128 597
weighted avg 0.9207 0.9146 0.9128 59
显示在第 11 个时间点触发了提前停站,同时获得了 0.91 的 f1 分数。样本分割的收敛速度,以及通过 10 次不同分割获得的 f1 分数如下图 3 所示。
Figure 3. Results with LSTM. (A) Training is essentially completed in 7 epochs but patience keeps us till 12 epochs or so. (B). Very good f1-scores in all cases. The average is close to 0.9
4.2 朴素贝叶斯
运行朴素贝叶斯也是类似的,其中python hashseed = 0;pipenv 运行 python nb.py 。不幸的是,正如我们在下面看到的,这产生了 0.23的平均 f1 分数。这与 LSTM 获得的 0.9 相差甚远。
Confusion Matrix:
[[ 36 103 60]
[ 92 39 68]
[ 62 75 62]]
Classification Report:
precision recall f1-score support
ordered 0.1895 0.1809 0.1851 199
reversed 0.1797 0.1960 0.1875 199
unordered 0.3263 0.3116 0.3188 199
micro avg 0.2295 0.2295 0.2295 597
macro avg 0.2318 0.2295 0.2305 597
weighted avg 0.2318 0.2295 0.2305 597
图 4 展示了并排使用 LSTM 和朴素贝叶斯得到的混淆矩阵,以供比较。与朴素贝叶斯相比,LSTM 的对角优势表明它有更好的预测和更大的 f1 值。
Figure 4. (A) LSTM does extremely well correctly predicting labels for ordered and reversed sequences. Some hesitation can be seen with predicting the label for unordered sequences. (B) Naive Bayes using tf-idf vectors has great difficulty figuring out the class and gets them mostly wrong.
5.结论和后续步骤
这就结束了我们的论证,即当所述序列对于手边的任务是重要的时,尊重序列的方法将在 NLP 任务中做得更好。因此,当单词序列很重要时,用于文档的单词串方法相对于传统的单词包方法具有优势。LSTM 等深度学习模型尊重单词的顺序,因此可以预期会做得更好。我们构建了一个合成文本语料库,并表明 LSTM 对 3 级 f1 得分达到了 90%以上,而使用 tf-idf 向量的朴素贝叶斯分类器仅产生了 0.23。
文本语料库的人工性质是朴素贝叶斯与 LSTM 相比表现极端不佳的原因。但是正如我们所说的,这篇文章的目的是说明性的,即强调什么时候&为什么尊重序列的方法比传统的单词袋方法有优势。在本系列的下一篇文章中,我们将对一些真实的文本语料库重复这些测试,看看我们的情况如何。
…
原载于 2019 年 1 月 13 日xplordat.com。
词云很蹩脚
原文:https://towardsdatascience.com/word-clouds-are-lame-263d9cbc49b7?source=collection_archive---------9-----------------------
探索词云作为数据可视化的局限性。
Author: Shelby Temple; Made with Tableau
词云最近已经成为数据可视化的主要内容。它们在分析文本时特别受欢迎。根据 Google Trends 的数据,流行程度的上升似乎始于 2009 年左右,搜索关键词的兴趣目前仅在条形图之下。
3 Month Moving Average; Source: Google Trends, Author: Shelby Temple, Made with Tableau
与条形图不同,单词云作为数据可视化有明显的局限性。显然,我不是唯一有这种想法的人。数据 viz 目录(【datavizcatalogue.com)提到词云对于分析准确性不是很大。 Daniel McNichol ,在《走向数据科学》上发表的一篇文章中,称文字云为文本数据的饼状图。
我的主要问题是,这种可视化通常是无趣的,并提供很少的洞察力。你通常会得到显而易见的单词和普通单词的混合。
你是说,“哈利”这个词在《哈利·波特》中出现了很多次。令人震惊!
Source: Word Clouds and Wizardry, Tableau Public; Author: Dave_Andrade
当我突然意识到云这个词是蹩脚的,我开始问自己更多的问题:
- 为什么每当有新的时髦 Twitter 话题或文本需要“分析”时,人们就会觉得有必要在整个互联网上发布单词云?
- 云这个词到底有什么局限性?
- 有没有一个合适的时间来使用单词云?
文字云背后的故事
我在一本名为文本可视化介绍的书中找到了单词云的起源故事,所以功劳归于曹楠和崔薇薇。
在这本书里,他们将单词云归因于社会心理学家斯坦利·米尔格拉姆在 1976 年创造的可视化。他让人们说出巴黎的地标。然后,他画了一张地图,上面用地标的名字作为文本,如果地标得到更多的响应,字体就会变大。
然而,这并不完全是云这个词流行的原因。为此,我们应该感谢照片分享网站 Flickr。大约在 2006 年,他们实现了单词 cloud visual,作为一种通过流行标签浏览网站的方式。他们称他们的单词云实现为标签云。UX 社区接受了这个设计,它开始出现在互联网上。因此,你可能会遇到人们仍然称之为词云,标签云。
Flicker 开心地为在 UX 社区掀起“云”这个词的热潮道歉。
3 Month Moving Average; Source: Google Trends; Author: Shelby Temple; Made with Tableau
那么,2010 年前后发生了什么,让词云趋势上升到类似于条形图的搜索兴趣水平?
我不知道这要归功于哪个人或哪个形象化的形象——但看起来,当前“云”这个词的流行与挖掘文本以获得洞察力的流行有关。
一个主要的应用是编辑一堆评论并挖掘它们的洞察力。例如,像亚马逊这样的网站可以获取产品的评论和评级(通常是 5/5 颗星),并找出产品的优势和劣势。也许当过滤低评价时,“不适合”这个短语经常出现。
对于一家有很多分支机构的公司来说,常见的投诉是可以解决的。如果一家塔可钟餐厅的管理经常遭到差评……也许那里的管理很糟糕?
不幸的是,word clouds 很少回答这些问题或解决这些应用程序,但人们仍然在制造它们!
抛开商业应用,任何对 R 或 Python 有基本了解的人都可以拉推文,做一个词云。它们现在更容易制造的事实显然有助于它们的流行。
总而言之:
- 1976 年,斯坦利·米尔格拉姆(Stanley Milgram)制作了第一张 word 云状可视化地图,作为巴黎的地标
- Flickr 在 2006 年开创了网络词汇云野火——他们表示抱歉
- 大约在 2010 年,数据科学和文本挖掘爱好者拿起了单词 cloud torch,并使它们比以往任何时候都更受欢迎!
探索“云”这个词的局限性
低-信息:
你上一次基于一个词云做决定或做重要外卖是什么时候?对我来说,答案是永远不会,我想大多数人都在同一艘船上。单词云提供了底层信息,通常只是一个单词出现的频率。如果没有额外的上下文,频繁出现的单词通常没有多大意义。谁说的,为什么说,什么时候说的,对谁说的?
我见过用颜色来表示第二层信息的用法。也许词的大小就是频率,那么颜色就是词的类别。我对此百感交集,因为这与人们习惯于在 word clouds 中看到的内容相悖。在某种程度上,它剥夺了使用词云的唯一优势之一——人们非常熟悉它们作为可视化词频的方法。
句子结构方面的语境:
单词云通常一次只查看一个单词。这是有缺陷的,因为它会产生误导性的最终产品。如果你的公司推特上有一堆推文说,“不酷!”云这个词会把“不”和“酷”分开。这可能会误导人们认为他们的公司 Twitter 很酷,而实际上它并不酷。
排名:
单词云甚至不是它们想要做的最好的可视化。给你看看最常用/最流行的词。当然,有时你能说出哪个是最流行的词,但是第二、第三和第十个最流行的词呢?没那么容易。在实现这一点上,排序条形图的作用要大得多。
排名第十的最受欢迎的单词是什么?
Author: Shelby Temple; Made with Tableau
现在怎么样了?
Author: Shelby Temple; Made with Tableau
其他限制:
其他一些问题包括单词云强调长单词多于短单词。单词的位置和顺序可能会令人迷惑,因为它们通常只是随机出现在不同的地方。此外,通常不清楚常见/无聊的词是否被过滤掉了,例如-the、 as 、 is 和或。最后,如果你使用流行度/频率以外的尺度,人们可能会措手不及。
为什么词云还在流行?
如前所述,文本挖掘只是数据科学浪潮中的另一名冲浪者。随着数据科学、大数据和人工智能越来越受欢迎,自然语言处理(NLP)和文本挖掘也将呈上升趋势。
奇怪的是,我现在开始把单词 cloud 和 NLP 的 hello world 联系起来。就像大多数程序员的第一个程序一样,他们只是简单地打印“你好,世界!”—从 Twitter 中挖掘推文并将其可视化为词云几乎已经成为文本挖掘的入门任务。一个微妙的区别是,文字云看起来比说“你好,世界”的文字有趣得多第二个区别是,将非结构化文本数据处理成单词云要复杂一些。由于这一点,我认为人们更倾向于分享他们的第一个词云。它是数据科学中的一种奇怪的弯曲。
自豪地在互联网上发布首个单词云
其他人:“是的,我记得我的第一个单词云。”
最后的想法
有没有一个很好的场景来创建单词云?
我也这么认为即使在指出其局限性之后,我认为单词云还是有一些优点的。
- 它们通常色彩鲜艳,看起来很漂亮
- 就像饼图一样,几乎不需要任何描述就能让人理解——这是一种人们熟悉的模式
- 这是一个很好的文本挖掘任务介绍
- 没有很多其他的可视化工具容易制作,并且专门用于非结构化文本分析
但是,我们如何解决词云被过度使用的问题呢?我认为可视化和 NLP 专家有很大的机会为文本挖掘提出新的包和可视化技术。我认为,如果有人构建了一个新的 Python 或 R 包,可以轻松地消化文本结构,并以令人兴奋的方式可视化它们,人们显然会利用它。
在那之前,每当有新的令人兴奋的 Twitter 话题时,我们都需要做好准备。
Author: Unknown
需要灵感?这里有一些我见过的更好的文本可视化。注意没有单词云:
通过抄本认识的朋友——洛娜·伊登
对甲壳虫乐队的分析——亚当·麦肯
哈利·波特的咒语——斯凯勒·约翰逊
圣诞电影的原话——扎克·盖修
神圣文本中使用的词语——肯·弗莱拉格
南方公园第一季文字分析——罗迪·扎科维奇
Python 中的词云:综合示例
原文:https://towardsdatascience.com/word-clouds-in-python-comprehensive-example-8aee4343c0bf?source=collection_archive---------9-----------------------
根据词频可视化文本——经济学家风格
Image from Wikipedia
这是一个简单的练习,将我的最新一期的和《经济学人》的形象化在一个单词云中。我没有心情真正阅读这期杂志,所以我认为这是一种快速消化信息的有趣方式。
目录
- PDF 到文本的转换
- 文本预处理
- 词云
PDF 到文本的转换
该过程的第一步是将原始 PDF 文档转换为文本。我是用 pdfminer.six 完成的(python3 的)。
打印出来的文本是这样的:浏览整本书需要很长时间。对于像我这样忙碌的数据科学家来说,读起来太长了。这就是我们做这个词云的原因,宝贝。
文本预处理
现在我们需要清理数据,使图像中没有标点符号或无关紧要的单词:
WordCloud
是时候把这些放在一起了!的。“面具”的 png 图像与本文开头的经济学人徽标相同。你会发现在最终的图像中它看起来很熟悉。
最终结果:
现在舅舅打电话给我说新闻的时候,我可以简单的把这个 wordcloud 里面最大的字读出来,显得知识渊博!注意单词 cloud 和 logo 的配色方案是一样的。如果你从电脑前走开,从远处看图像,你可以从色差中隐约看到《经济学人》。
如果您觉得这很有帮助,请订阅。如果你喜欢我的内容,下面是我做过的一些项目:
优步评论文本分析
Excel 与 SQL:概念上的比较
简单线性 vs 多项式回归
随机森林比 Logistic 回归好吗?(一比较)
基尼指数 vs 信息熵
用 Python 中的逻辑回归预测癌症
二元逻辑回归示例(python)
【从零开始计算 R 平方(使用 python)
谢谢,
安德鲁
Tableau 中的单词云:快速简单。
原文:https://towardsdatascience.com/word-clouds-in-tableau-quick-easy-e71519cf507a?source=collection_archive---------0-----------------------
使用 Tableau 轻松创建单词云。
一个字云,也被称为标签 云,是文本数据的可视化表示,通常用于描述网站上的关键字元数据(标签),或者可视化自由格式文本维基百科。单词云是一种流行的信息图表类型
,借助它我们可以显示数据中单词的相对频率。这可以通过数据中所选字段的大小或颜色来描述。它们是一个非常强大的功能,可以吸引人们对你的演讲或故事的注意
目标
Tableau 是当今业界广泛使用的数据分析和可视化工具。Tableau 提供了一个本地特性,只需点击几下鼠标就可以创建单词云。这将是一篇非常短的文章,强调在 Tableau 中创建单词云所需的步骤。如果你想以 Tableau 开始一篇更详细的文章,请确保先阅读我的文章 数据可视化与 Tableau。
尽管这篇文章关注的是单词云,但我也要提到一些关于使用单词云的可视化最佳实践。单词云看起来很酷,但有一些更好的替代品,以更清晰和准确的方式传达相同的信息。
数据
https://rogermooresmovienation.files.wordpress.com/2017/09/box1.jpg?w=640
数据涉及 2018 年美国前 20 名电影,按国内票房收入数十亿美元排名。该数据还包含每部电影的 元符号 分数。Metacritic 是一个收集包括电影在内的媒体产品评论的网站。
所有工作表和 Tableau 工作簿都可以从其关联的存储库** 这里访问。**
在 Tableau 中创建单词云
按国内总收入计算的电影
- 打开 Tableau 桌面并连接到数据源。你可以选择任何数据格式,但这里我们使用的是一个 excel 文件,其中有你想要的数据。
- 将所需尺寸拖动到标记卡上的文字处。在这里,我将把电影标题拖到文本中,因为我想知道哪部电影在票房收入方面表现良好。
- 将国内总收益拖动到标记卡上的尺寸上。
- 现在将国内总收入拖到标记卡上的颜色上,因为我们希望颜色能够反映收入模式。
- 将标记类型从自动更改为文本。
- 接下来,你可以隐藏标题,根据你的喜好改变视图和背景,这样你的单词云就准备好了。
Workbook
电影按照他们的元批评分数
步骤同上,除了我们使用元临界分数而不是收益。
改进单词云
上述示例处理具有有限字段的简单且精炼的数据集。如果数据包含一本书的一个段落或一些段落,我们需要为此创建一个单词云,那会怎么样呢?让我们看一个这样的例子。
资料组
出于演示的目的,我从我的一篇中型文章中选取了整篇文章。我复制了整个文本,不管内容如何,并把它放在一个[text.txt](https://github.com/parulnith/Data-Visualisation-libraries/blob/master/Data%20Visualisation%20with%20Tableau/Wordclouds%20with%20Tableau/text.txt)
文件中。然后,我运行一个小的 python 脚本,将单词及其频率保存到一个 CSV 文件中。您可以使用自己选择的任何数据集。
from collections import Counter
def word(fname):
with open(fname) as f:
return Counter(f.read().split())print(word_count("text.txt"))
import csv
my_dict = word_count("text.txt")
with open('test.csv', 'w') as f:
for key in my_dict.keys():
f.write("%s,%s\n"%(key,my_dict[key]))
[text.csv](https://github.com/parulnith/Data-Visualisation-libraries/blob/master/Data%20Visualisation%20with%20Tableau/Wordclouds%20with%20Tableau/test.csv)
是包含数据集的文件,如下所示:
现在切换到画面。
- 使用
text.csv
文件中的单词创建一个单词云,如上所述。
- 如果您想要限制条目的数量,可以使用单词计数作为过滤器,只显示出现频率最低的单词。
- ****去掉最常见的单词——即使经过字数过滤,我们仍然看到像“”、“中”等没有太大意义的单词出现在整个工作表中。让我们摆脱他们。我们将首先创建一个英语常用词的列表,可以从这里的访问。该列表包含具有与其相关联的等级的单词,我们将使用该等级作为过滤的度量。
common words in English
- 现在,让我们将此表添加到我们的工作簿中。这两个工作表将根据单词列进行混合,因为这是两个源所共有的。
- 创建一个新参数,命名为“要排除的单词”,设置如下:
- 显示参数控件,通过过滤将最常用的词从云端排除。
Workbook
现在调整设置,你可以有一个更好看的词云与过滤器选项。
****
Before | After
什么时候不要用词云
Marti A. Hearst 的客座博文“标签云是怎么回事”在讨论词云时值得一读。单词云绝对引人注目,并提供了一种概览或第一视角,因为它们非常受欢迎,人们通常在他们的演示文稿中有一两个。
另一方面,与条形图不同,词云不提供相似大小的词之间的清晰区分。此外,属于同一类别的单词可能彼此相距甚远,较小的单词可能会被忽略。
单词云的替代方案
- 树形图
Tree Map
与单词云相比,树形图可能提供更好的想法,但不是最好的。树形图有时被视为饼图的矩形表兄弟,在显示详细信息时可能并不理想。
- 条形图
sorted Bar chart
排序后的条形图肯定能提供更好、更准确的信息,因为它给出了比较的基线。
结论
文字云的确很吸引人,有助于展示更加精彩,但当涉及到严肃的数据分析时,有更好的工具可以尝试。然而,本文的主要目的是展示如何用最少的努力在 Tableau 中创建单词云。所以你可以试着用你选择的数据建立你自己的单词云。
停止脱离上下文使用单词云
原文:https://towardsdatascience.com/word-clouds-without-context-3a71b6dc3e2d?source=collection_archive---------15-----------------------
单词云不显示单词之间的关系,失去了上下文。文本网络可视化解决了这个问题。
Obama’s 2013 inauguration address word cloud generated with Wordle
你在上面看到的是巴拉克·奥巴马 2013 年就职演说的文字云。我不知道单词 clouds 是否应该提供信息,希望不是,因为你从上面的单词 mess 中唯一能辨别的是关于“美国”、“人民”、“时间”和“国家”的东西。也许还有“公民”和“一代”。哦,他提到了一些关于“自由”的事情。相当明显,几乎没有任何信息。
如果文字云只是一个摆设,这就不是问题了。只不过它们经常被用作交流工具,帮助表达想法、提供观点、说服甚至推动议程。这使得它们非常危险,因为它们无处不在且易于使用。
单词云的主要问题是它们没有上下文。当失去了背景和细微差别,一切都变得面目全非。知识变得容易产生偏见和错误的解释,这在假新闻和后真相时代产生了更严重的后果。
词云显示没有关系。我们只是简单地看到最常见的较大的单词和一些颜色,它们主要是出于美观的原因。我们看不到任何模式,语言是由模式组成的。因此,文字云,至少以其目前的形式,应该被禁止出现在任何严肃的语境中,留给装饰艺术和儿童游戏的领域,因为它们毕竟只是娱乐。
为什么词云无法修复
Abstract visualization of Obama’s inauguration address made with InfraNodus
如果文字云如此糟糕,我们能对如此不完美呈现的现实做些什么?
答案就在“文本”这个词本身。它的起源是拉丁语文本或‘编织’,所以当我们写作时,我们是在编织线,把单词放在一起产生一个意思。如果我们想要形象化这个意思,我们不能仅仅放下单词之间的关系,它们必须被考虑进去。
一个可能的解决方案是在生成词云时考虑二元模型和 n 元模型。这个网上有一些例子,主要涉及 R 和 Python。然而,这些是复杂的,上下文的问题仍然没有解决,因为使用 ngrams,你必须优先考虑某些单词的组合,所以最终信息会丢失。
Making your own word cloud with n-grams in Python. Source: https://avidml.wordpress.com/
即使你设法得到有趣的结果,单词云表示本身也会把一切搞得一团糟,因为你必须根据上下文把这些短语一个接一个地排列起来,而没有一个框架能让你做到这一点。
Bigrams of words. Source: https://avidml.wordpress.com/
因此,让我们暂时忘记单词云、二元模型和 n-grams,再次思考它们之间的关系。
我们需要一种表示,让我们看到文本中最重要的术语,识别主要的主题簇,并显示它们之间的关系。
文本网络分析让我们可以做到这一点。
文本网络分析:带上下文的词云
Barack Obama’s 2013 inauguration speech represented as a text network graph with InfraNodus.Com. The bigger nodes are the words with a higher betweenness centrality, the colors indicate the topical clusters. The proximity of the words means the frequency of their co-occurrence.
文本网络分析是将每一个词表示为一个节点,将每一个词的共现表示为它们之间的一种关系的方法。(单词不一定要彼此相邻,它们也可以很近,并且可以用连接的权重来编码接近度)。然后创建单词节点和边的图。
文本网络图的好处是它们可以用定性和定量的方式进行分析。这意味着它们既可以被人类使用,也可以被机器使用。
使用该图,我们可以应用社区检测算法来识别主题聚类,而 Force-Atlas 布局算法可以被应用来在视觉上对齐彼此相邻的共现单词节点。节点的大小可以根据它们的频率(与它们的程度相关)进行调整。一个更有趣的衡量标准是中间中心性,它表明单词在不同上下文之间出现的频率:意思的中心连接。
例如,我们可以从下面的文本网络中辨别出“民族”一词是与“人民”、“使”、“自由”、“风险”等词连用的。利用这一概念宣传让人们自由冒险的国家理念:
Selecting a node on the text network graph shows the other words it’s connected to
我们还可以检测单词共现的模式(基于社区检测算法,它们具有相同的颜色,并且基于 Force Atlas 布局,它们彼此更接近):
Nodes that are closer to each other and have the same color indicate topical clusters of co-occurring words.
最后,如果我们单击节点,我们还可以看到这个单词组合最常出现的实际文本。这对于标签云来说是不可能的,或者至少没有实现可以很容易地看到单词出现的上下文。
Clicking the words on the graph shows us the context where they appear in the text.
你自己判断吧,但我认为文本网络作为交流工具比标准的文字云更强大、更精确,最终也更有用。
每个单词节点的背景网络数据使得可以应用来自图论的各种方法来执行进一步的分析,并通过 API 将它传递给其他算法,这些算法可以更进一步。
现在,我要公开一件事。我对文字和网络着迷已经很多年了。这是我创建一个开源工具 InfraNodus 的部分原因,该工具用于为本文创建文本网络可视化。我喜欢在一幅图像中表现文本的复杂性,融合叙述展开所需的时间,展示文本编织的美,但又不失去上下文。此外,我们的大脑是网络,意义是相关的,所以使用这个比喻才有意义。
与此同时,通过我在 InfraNodus 工作时的经验和用户反馈,我了解到对于不习惯网络可视化的人来说,这可能很难理解(尽管这种情况正在迅速改变)。因此,将文字云的简单性与网络的力量结合起来可能会很有趣。这就是为什么 InfraNodus 即将发布的版本将提供一个词云应用程序,以便用户可以基于文本网络数据生成可嵌入的交互式词云,根据图形测量对词进行排序,并根据社区检测算法使它们更加接近。
如果你想探索文本网络,我鼓励你尝试一下开源工具【InfraNodus.Com】,我用它来做上面的可视化。
如果你对编码感兴趣,你也可以从GitHub(你需要节点。Js、Java 和 Neo4J)甚至是 Python 版本(正在开发中)。非常感谢您的反馈和代码贡献!
你也可以在【https://infranodus.com/politics/obamanew2013】上使用上面奥巴马演讲的互动图
带权重的单词嵌入之间的单词距离
原文:https://towardsdatascience.com/word-distance-between-word-embeddings-with-weight-bf02869c50e1?source=collection_archive---------16-----------------------
大规模杀伤性武器和半大规模杀伤性武器的区别
Photo by Edward Ma on Unsplash
在前面的故事中,我介绍了单词移动器的距离(WMD) ,它测量单词嵌入之间的距离。你可能会注意到单词之间没有加权机制。加权对 NLP 任务有什么帮助?为此,黄等人提出了一种改进方法,命名为监督字移动器距离(S-WMD)。
引入监督字移动器的距离(S-WMD)
在介绍单词嵌入之前,词袋(BoW) ,潜在语义索引(LSI)和潜在语义分析(LSA) 是衡量 NLP 任务最有前途的技能。
字动子的距离(WMD)2015 年推出。它利用了 word emveddings (word2vec 于 2013 年推出)。它使用另一种方法,即推土机距离来测量向量之间的差异。一年后,黄等人提出了一种改进方法,称为监督字移动距离(S-WMD)。
The difference t-SNE plots of WMD and S-WMD (Huang et al., 2016)
简而言之,WMD 算法测量将两个文档中的一个单词向量传输到另一个向量的最小值。如果两个文档共享大量的单词,那么在两个文档之间传输只需要很小的移动。换句话说,这两个文档可以归类为相似文档。
加权机制
权重机制对 NLP 任务有什么帮助?通过引入权重,有助于解决文档分类问题。
直观上,预训练的单词向量应该非常好,因为它是在大量数据上训练的。然而,有一个已知的问题是,预先训练的向量可能不会很好地应用于某些问题。例如,预先训练的向量可以将所有可吃的食物放在一起,并将蔬菜和肉类混合在一起。如果分类问题是要分类它是不是织女星呢?
另一方面,两个文档共享大量的单词并不意味着它们都描述相同的主题。例如,“我去学校教学生”和“我去学校学英语”。可以是谈论学校的生活,也可以是在不同的团体中谈论学校的任务。换句话说,它确实依赖于 NLP 任务。它可能相关也可能不相关。
kNN test error (Huang et al., 2016)
关于我
我是湾区的数据科学家。专注于数据科学、人工智能,尤其是 NLP 和平台相关领域的最新发展。你可以通过媒体博客、 LinkedIn 或 Github 联系我。
参考
黄高、郭川、库斯纳·马特 j、孙瑜、温伯格·基连 q、沙飞。2016.https://papers . nips . cc/paper/6139-supervised-word-movers-distance . pdf
Matlab 中的 S-WMD(原文)
python 中的 S-WMD
单词嵌入(第二部分)
原文:https://towardsdatascience.com/word-embedding-part-ii-intuition-and-some-maths-to-understand-end-to-end-glove-model-9b08e6bf5c06?source=collection_archive---------9-----------------------
直觉和(一些)数学来理解端到端手套模型
The power of GloVe
NLP(自然语言处理)的原始问题是将单词/句子编码成计算机处理可理解的格式。向量空间中单词的表示允许 NLP 模型学习单词含义。在我们的上一篇文章中,我们看到了的跳格模型,该模型根据单词在当地的上下文来捕捉单词的意思。让我们记住,我们所说的上下文是指围绕目标单词的大小为 n 的固定单词窗口。
在这篇文章中,我们将研究手套模型(全局向量),它被创建来查看单词的局部上下文和全局统计数据以嵌入它们。 GloVe 模型背后的主要思想是关注文本语料库中单词的共现概率(下面的等式 0)以将它们嵌入到有意义的向量中。换句话说,我们要看看在我们所有的文本语料库中,单词 j 在单词 i 的上下文中出现的频率。
为此,假设 X 是我们的单词-单词共现矩阵(共现矩阵示例)并且 X_ij 是单词 j 在单词 i 的上下文中出现的次数。
Equation 0: The co-occurence probability of a word j to occur given a word i is the the ratio of the number of times word j occurs in the context of word i and the number of times any word appears in the context of word i.
GloVe 会查看那些同现概率之间的比率来提取单词的内在含义。更具体地说,我们将关注图 1 中表格的最后一行。
Figure 1: The 2 first rows of the table show the probabilities of the words solid, gas, water and fashion to occur in the context of the words ice and steam. The last row shows the probabilities ratio which is the key learning under the hood of the GloVe model.
对于与"冰"相关但不与"蒸汽"像"固体"相关的词,比例会高。相反,对于与"蒸汽相关但不与"冰"相关的单词,该比率将较低,而对于与两者都相关或都不相关的单词,如"水"和"时尚",该比率将接近 1。
乍一看,同现概率比收集了比原始概率更多的信息,并且更好地捕捉了“冰”和“蒸汽”之间的关系。的确,只看原始概率,单词"水"最好地代表了"冰"和"蒸汽"的意思,我们将无法区分这两个单词的内在含义。
既然我们已经理解了共现概率比捕获了关于单词关系的相关信息,那么 GloVe 模型旨在构建一个函数 F ,该函数将在给定两个单词向量 w_i 和 w_j 以及一个上下文单词向量 w_k 作为输入的情况下预测这些比率。
Equation 1: The GloVe model will learn meaningful word vectors representations w_i, w_j and w_k to feed F and correctly predict the probabilities ratios.
希望对 GloVe 有一个高层次的概述的读者可能想要跳过下面的等式(从等式 2 到等式 6 ),这些等式更深入地理解了 GloVe 模型如何构造这个 F 函数来学习单词向量表示。
让我们看看这个 F 函数是如何构建的,一步一步地去捕捉最终公式背后的逻辑,这个公式乍一看相当复杂(方程式 6)。
要比较向量 w_i 和 w_j 这两个向量是线性结构,最直观的方法就是通过相减,就这么做吧。
Equation 2: Comparing two vectors by making the difference.
我们有两个向量作为 F 的输入,一个标量在等式的右边,从数学上讲,如果我们保持这种方式,它会增加我们想要构建的线性结构的复杂性。将标量值与标量值关联起来更容易,这样我们就不必玩向量维数了。因此手套模型使用两个输入向量的点积。
Equation 3: Scalar values to scalar values thanks to the dot product.
一直以来,我们将单词向量与上下文单词向量分开。但是,这种分离只是一个角度的问题。的确,如果说“水”是“汽”的语境词,那么“汽”就可以是“水”的语境词。在构建【F时,必须考虑到 X 矩阵(我们的共生矩阵)的对称性,我们必须能够切换 w_i 和 w_k 。首先我们需要 F 是一个同态 (F(a+b)=F(a)F(b))。
Equation 4: Using the homomorphism property of F to associate word vectors dot product (which can be interpreted as similarities between words) to the probability they occur in a same context.
exp 函数是方程 4 的解,exp(a-b)=exp(a)/exp(b),我们就用它吧。
Equation 5: Almost symmetric if there was not b_i term.
为了恢复对称性,为矢量 w_k 增加一个偏置 b_k 。
Equation 6: We can express our word vectors given corpus statistics and symmetry is respected (we can switch w_i and w_k).
由于我们的 F 函数,我们现在能够使用我们的词向量表示来定义成本/目标函数(等式 7)。在训练期间手套将学习正确的字向量 w_i 和 w_j 以最小化这个加权最小平方问题。事实上,必须使用权重函数 f(X_ij) 来限制非常常见的同现(如“this is”)的重要性,并防止罕见的同现(如“下雪的撒哈拉”)具有与平常相同的重要性。
Equation 7: Final GloVe Equation
总之,手套模型为我们要求他执行的单词类比任务使用了一个有意义的知识来源:同现概率比。然后,它构建一个目标函数 J 将单词向量关联到文本统计。最后,手套最小化这个 J 功能通过学习有意义的单词向量来表示。
瞧啊!
参考资料和其他有用资源: - 原始手套论文
- 斯坦福 NLP 资源
- 很好解释的文章比较 Word2vec 与 Glove
Python 中使用 BERT 的单词嵌入
原文:https://towardsdatascience.com/word-embedding-using-bert-in-python-dd5a86c00342?source=collection_archive---------3-----------------------
使用深度学习 NLP 模型(BERT)将单词嵌入向量,只需几行 Python 代码
单词嵌入:它们是什么?
在 NLP 的世界中,以向量形式或单词嵌入来表示单词或句子打开了各种潜在应用的大门。这种将单词编码成向量的功能是 NLP 任务的强大工具,例如计算单词之间的语义相似度,利用它可以构建语义搜索引擎。例如,这里有一个单词嵌入的应用程序,通过它 Google 可以更好地理解使用 BERT 的搜索查询。可以说,它是最强大的语言模型之一,在机器学习社区中变得非常流行。
使用大的句子语料库对 BERT(来自变压器的双向编码器表示)模型进行预训练。简而言之,训练是通过屏蔽句子中的几个单词(根据论文作者的说法,大约 15%的单词)并让模型预测被屏蔽的单词来完成的。随着模型训练预测,它学习产生单词的强大内部表示,如单词嵌入。今天,我们将看到如何轻松地建立和运行 BERT 模型,并将单词编码到单词嵌入中。
BERT 单词嵌入模型设置
使用 Pytorch 和 Tensorflow 运行 BERT 模型有一套可用的选项。但是,为了让您非常容易地接触到 BERT 模型,我们将使用 Python 库来帮助我们快速设置它!
B ert-as-a-service 是一个 Python 库,它使我们能够在本地机器上部署预先训练好的 BERT 模型并运行推理。它可以用于服务于任何已发布的模型类型,甚至是针对特定下游任务进行微调的模型。此外,它需要后端的 Tensorflow 来处理预训练的模型。因此,我们将继续在控制台中安装 Tensorflow 1.15。
pip3 install tensorflow-gpu==1.15
接下来,我们将安装 bert 即服务客户端和服务器。同样,这个库不支持 Python 2。因此,请确保您拥有 Python 3.5 或更高版本。
pip3 install -U bert-serving-server bert-serving-client
BERT 服务器将模型部署在本地机器上,客户端可以订阅它。此外,用户可以在同一台机器上安装这两个服务器,或者在一台机器上部署服务器,然后从另一台机器上进行订阅。安装完成后,下载您选择的 BERT 模型。你可以在这里找到所有车型的列表。
部署模型
现在初始设置已经完成,让我们用下面的命令启动模型服务。
bert-serving-start -model_dir /path_to_the_model/ -num_worker=1
例如,如果模型的名称是 uncased_L-24_H-1024_A-16,并且它位于“/model”目录中,则该命令如下所示
bert-serving-start -model_dir /model/uncased_L-24_H-1024_A-16/ -num_worker=1
“num_workers”参数用于初始化服务器可以处理的并发请求的数量。然而,只需使用 num_workers=1,因为我们只是在用单个客户端来处理我们的模型。如果您正在部署多个客户端进行订阅,请相应地选择“num_workers”参数。
通过 BERT 客户端订阅
我们可以运行一个 Python 脚本,从中使用 BERT 服务将我们的单词编码成单词嵌入。鉴于此,我们只需导入 BERT-client 库并创建一个 client 类的实例。一旦我们这样做了,我们就可以输入我们想要编码的单词或句子的列表。
from bert_serving.client import BertClient()client = BertClient()vectors = client.encode([“dog”],[“cat”],[“man”])
我们应该将想要编码的单词输入 Python 列表。上面,我输入了三个列表,每个列表都有一个单词。因此,“vectors”对象的形状为(3,embedding_size)。通常,嵌入大小是 BERT 模型编码的单词向量的长度。事实上,它将任意长度的单词编码成一个恒定长度的向量。但是这可能在不同的 BERT 模型之间有所不同。
计算单词之间的相似度
好的,目前为止一切顺利!如何处理只有一些数字的向量?它们不仅仅是数字。我前面说过,这些向量代表了单词在 1024 维超空间中的编码位置(这个模型的 1024 uncased _ L-24 _ H-1024 _ A-16)。此外,用某种相似度函数来比较不同单词的向量,将有助于确定它们的相关程度。
余弦相似性就是这样一个函数,它给出 0.0 到 1.0 之间的相似性得分。假设 1.0 表示单词意思相同(100%匹配),0 表示它们完全不同。下面是单词嵌入之间余弦相似性的 scikit-learn 实现。
**from** sklearn.metrics.pairwise **import** cosine_similaritycos_lib = cosine_similarity(vectors[1,:],vectors[2,:]) #similarity between #cat and dog
伯特完成单词嵌入!
你也可以输入一个完整的句子而不是单个单词,服务器会处理好的。有多种方式可以将单词嵌入组合起来,以形成像连接这样的句子嵌入。
查看其他关于物体检测、真伪验证和更多的文章!
原载于https://hackerstreak.com
自然语言处理中的单词嵌入
原文:https://towardsdatascience.com/word-embeddings-for-nlp-5b72991e01d4?source=collection_archive---------1-----------------------
理解单词嵌入及其在深层自然语言处理中的应用
在本文中,我们将了解如何处理文本,以便在机器学习算法中使用。什么是嵌入,为什么它们被用于文本处理?
word2vec and GloVe word embeddings
自然语言处理(NLP)是指旨在理解人类语言的计算机系统。人类语言,如英语或印地语,由单词和句子组成,NLP 试图从这些句子中提取信息。
NLP 用于的一些任务
- 文本摘要:提取或抽象的文本摘要
- 情感分析
- 从一种语言到另一种语言的翻译:神经机器翻译
- 聊天机器人
机器学习和深度学习算法只接受数字输入,那么我们如何将文本转换成数字呢?
单词袋(蝴蝶结)
单词包是一种简单而流行的文本特征提取技术。单词包模型处理文本,找出每个单词在句子中出现的次数。这也称为矢量化。
创建弓的步骤
- 将文本标记成句子
- 把句子符号化成单词
- 删除标点符号或停用字词
- 将单词转换为较低的文本
- 创建单词的频率分布
在下面的代码中,我们使用 CountVectorizer、 it 标记一组文本文档,构建一个已知单词的词汇表,并使用该词汇表对新文档进行编码。
#Creating frequency distribution of words using nltk
**from nltk.tokenize import sent_tokenize
from nltk.tokenize import word_tokenize
from sklearn.feature_extraction.text import CountVectorizer****text="""Achievers are not afraid of Challenges, rather they relish them, thrive in them, use them. Challenges makes is stronger.
Challenges makes us uncomfortable. If you get comfortable with uncomfort then you will grow. Challenge the challenge """**#Tokenize the sentences from the text corpus
**tokenized_text=sent_tokenize(text)**#using CountVectorizer and removing stopwords in english language
**cv1= CountVectorizer(lowercase=True,stop_words='english')**#fitting the tonized senetnecs to the countvectorizer
**text_counts=cv1.fit_transform(tokenized_text)**# printing the vocabulary and the frequency distribution pf vocabulary in tokinzed sentences
print(cv1.vocabulary_)
print(text_counts.toarray())
在文本分类问题中,我们有一组文本和它们各自的标签。我们使用单词袋模型来从文本中提取特征,并且我们通过将文本转换成文档中单词出现的矩阵来实现这一点。
c 简单文本摘要的颂歌
包话有什么问题?
在单词袋模型中,每个文档被表示为一个单词计数向量。这些计数可以是二进制计数,一个单词可能出现在文本中,也可能不出现,或者将具有绝对计数。向量的大小等于词汇表中元素的数量。如果大多数元素都是零,那么单词包将是一个稀疏矩阵。
在深度学习中,我们将拥有稀疏矩阵,因为我们将处理大量的训练数据。由于计算和信息的原因,稀疏表示更难建模。
巨大数量的权重:巨大的输入向量意味着神经网络的巨大数量的权重。
计算量大:权重越大,训练和预测所需的计算量越大。
缺乏有意义的关系,不考虑词序: BOW 是在文本或句子中出现的具有字数统计的词的集合。单词包不考虑它们出现的顺序。
单词嵌入是解决这些问题的方法
嵌入将大的稀疏向量转换到保持语义关系的低维空间。
单词嵌入是一种技术,其中领域或语言的单个单词被表示为低维空间中的实值向量。
通过将高维数据映射到一个更低维的空间来解决带有 BOW 的稀疏矩阵问题。
通过将语义相似项的向量彼此靠近放置,解决了 BOW 缺乏有意义的关系的问题。这样,具有相似意思的单词在向量空间中具有相似的距离,如下所示。
“国王对王后就像男人对女人一样”编码在向量空间中,动词时态和国家及其首都编码在低维空间中,保持语义关系。
source: https://developers.google.com/machine-learning/crash-course/embeddings/translating-to-a-lower-dimensional-space
语义相似的物品是如何靠近放置的?
让我们用推荐引擎中使用的协同过滤来解释这一点。
推荐引擎基于具有相似兴趣的其他用户的历史购买来预测用户将购买什么。使用协同过滤
亚马逊和网飞使用推荐引擎向用户推荐产品或电影
协同过滤是将多个顾客购买的所有相似产品嵌入到一个低维空间的方法。这个低维空间将包含彼此接近的相似产品,因此,它也被称为最近邻算法。
这种最近邻技术用于将语义相似的项目彼此靠近放置
我们如何将高维数据映射到一个更低维的空间?
使用标准降维技术
像主成分分析(PCA)这样的标准降维技术可以用来创建单词嵌入。PCA 试图找到高度相关的维度,这些维度可以使用 BOW 折叠成一个维度。
Word2Vec
Word2vec 是 Google 发明的用于训练单词嵌入的算法。word2vec 依赖于分布假设。分布假设指出,经常具有相同相邻单词的单词倾向于语义相似。这有助于将语义相似的单词映射到几何上接近的嵌入向量。
分布假设使用连续词袋(CBOW)或跳过克。
word2vec 模型是具有输入层、投影层和输出层的浅层神经网络。它被训练来重建单词的语言环境。word 2 vec 神经网络的输入层采用更大的文本语料库来生成向量空间,通常有数百个维度。文本语料库中的每个唯一单词被分配给空间中的相应向量。
这种架构被称为连续单词包 CBOW,因为它使用上下文的连续分布式表示。它既考虑了历史上的语序,也考虑了未来的语序。
这有助于语料库中的常见上下文单词向量在向量空间中彼此靠近。
Source: Efficient Estimation of Word Representations in Vector Space by Mikolov-2013
跳过克
Skip gram 不基于上下文预测当前单词,而是使用每个当前单词作为具有连续投影层的对数线性分类器的输入,并预测当前单词前后一定范围内的单词。
GloVe:单词表示的全局向量
手套是由潘宁顿等人在斯坦福开发的。它被称为全局向量,因为全局语料库统计数据是由模型直接捕获的。
它利用了这两者
- 用于生成低维单词表示的全局矩阵分解方法,如潜在语义分析(LSA)
- 局部上下文窗口方法,例如 Mikolov 等人的 skip-gram 模型
LSA 有效地利用了统计信息,但在单词类比方面做得不好,因此表明了次优的向量空间结构。
像 skip-gram 这样的方法在类比任务上表现得更好,但是很少利用语料库的统计数据,因为它们没有在全局共现计数上进行训练。GloVe 使用特定的加权最小二乘模型来训练全局单词共现计数,以有效地利用统计数据。
考虑热力学领域中的两个词I =冰,j =蒸汽 。这些词的关系可以通过研究它们与各种 探测词 k 共现概率的比值来考察。
ratio of co-occurrence probabilities
探查像 水或者时尚 这种或者与 冰与蒸汽 都有关系,或者都没有关系的词,比例应该接近 1。探测词像 固体 与 冰 但不与 汽 有较大的比值
Source: GloVe: Global Vectors for Word Representation — Jeffrey Pennington
与原始概率相比,该比率能够更好地区分相关的词(固体和气体)和不相关的词(水和时尚),并且还能够更好地区分两个相关的词。
Source: https://nlp.stanford.edu/projects/glove/
区分男人和女人的是性别,类似于词对,比如国王和王后或者兄弟和姐妹。从数学上来说,我们可能期望矢量差男人 : 女人,国王 : 王后,以及兄弟:姐妹可能都大致相等。这个特性和其他有趣的模式可以在上面一组使用 GloVe 的可视化中观察到。
结论:
单词嵌入被认为是目前无监督学习的成功应用之一。它们不需要任何带注释的语料库。嵌入使用低维空间,同时保留语义关系。
参考资料:
【https://nlp.stanford.edu/projects/glove/
手套:单词表示的全局向量
向量空间中单词表示的有效估计—托马斯·米科洛夫、程凯、格雷格·科拉多、杰弗里·迪恩
[## 嵌入:分类输入数据|机器学习速成班
估计时间:10 分钟分类数据指的是代表一个或多个离散项的输入特征…
developers.google.com](https://developers.google.com/machine-learning/crash-course/embeddings/categorical-input-data) [## Word2vec
Word2vec 是一组用于产生单词嵌入的相关模型。这些模型很浅,有两层…
en.wikipedia.org](https://en.wikipedia.org/wiki/Word2vec)
https://blog . aylien . com/overview-word-embeddings-history-word 2 vec-cbow-glove/
单词嵌入(第一部分)
原文:https://towardsdatascience.com/word-embeddings-intuition-and-some-maths-to-understand-end-to-end-skip-gram-model-cab57760c745?source=collection_archive---------11-----------------------
直觉和(一些)数学来理解端到端跳格模型
Photo by Susan Yin on Unsplash
自然语言处理的最初问题是将一个单词/句子编码成计算机可理解的格式。向量空间中单词的表示允许 NLP 模型学习。如图 1 所示,将单词表示成向量的第一种简单表示法是一热编码法。
Fig 1: One-hot-vectors of each words from the sentence “The quick brown fox runs away.”
这种实现缺乏像单词的上下文(T2)这样的信息,我们所说的上下文是指给定单词与哪些其他单词相关。事实上,“布朗”和“福克斯”是正交的,因此给定我们的一次性编码是不相关的。最重要的是,one-hot-vector 的大小与词汇表一样,可以达到数千个单词,这使得它不切实际。
对这些限制的第一个解决方案将是:
1)考虑给定其上下文
的单词的含义 2)将它的表示维度减少到更实际的大小
Skip-gram 模型是最流行的单词嵌入模型之一,它旨在根据给定的上下文对单词进行编码。
“从一个人和什么样的人交往,你就可以知道他是什么样的人”(弗斯,J. R. 1957)
引用 20 世纪语言学家弗斯的话,很好地说明了我们的担忧。通过“它保持的公司”或上下文,我们指的是在固定大小的窗口中出现在中心单词附近的单词。
Fig 2: Context words of “brown” within a one window size (one the right and one on the left).
这个想法是,出现在相似上下文中的单词将具有相同的单词表示。为了实现这个目标, Skip-gram 将作为给定中心单词的固定大小 m 的窗口内的上下文单词的预测器。因此,对于大小为 T 的词汇表,跳格模型将希望最大化以下预测准确性或可能性:
为了便于计算,并且因为在机器学习中我们更喜欢最小化函数而不是最大化它们,我们现在将考虑平均负对数似然性并将其最小化:
为了计算 P(w_{i+j} | w_{i}),我们将使用两个向量:
-当 w 是上下文词时 u _ { w }
-当 w 是中心词时 v_{w}
然后,我们将使用 softmax 函数计算给定中心词 c 的上下文词 o (外部词)的概率:
让我们来解释这个等式,以便更好地理解 Skip-gram 模型背后的直觉。中心单词和上下文单词之间的相似度越高,分子上的点积越高,因此上下文单词被预测为邻近单词的概率越高。
这里,我们强制 Skip-gram 模型学习那些 u_{w}和 v_{w}向量,以便做出正确的预测。
Skip-gram 模型可通过下图进行总结。
Fig 3: End-to-end Skip-gram model training on the sentence “The quick brown fox”. We choose the window dimension m=1 for representation ease.
一旦跳跃式语法模型已经训练了它的预测任务,单词表示在中心单词的单词嵌入矩阵表示中是可用的。
瞧啊!
现在,我们能够用跳格模型嵌入单词。然而,我们必须注意到 Skip-gram 在给定单词的本地上下文的情况下捕捉单词的意思,而没有考虑更全面的学习。例如,假设我们有这样一个句子:“狐狸……”,“the”和“狐狸”可能经常一起出现,但是 Skip-gram 不知道“The”是一个常用词还是一个与“狐狸”特别相关的词。
为了应对这个潜在的问题,已经创建了 Glove 模型来查看单词的本地上下文和全局统计。如果你想更深入地研究单词嵌入方法,这里有一个简短演示来快速理解这个手套模型。
参考资料和其他有用的资源: --原文 Skip-gram 论文
- Standford NLP 资源
- Word2Vec 教程
使用编码器-解码器模型的单词级英语到马拉地语神经机器翻译
原文:https://towardsdatascience.com/word-level-english-to-marathi-neural-machine-translation-using-seq2seq-encoder-decoder-lstm-model-1a913f2dc4a7?source=collection_archive---------0-----------------------
使用 LSTM 构建序列对序列模型的指南
目录
- 介绍
- 先决条件
- 编码器-解码器架构
- 编码器 LSTM
- 解码器 LSTM —训练模式
- 解码器 LSTM —推理模式
- 代码遍历
- 结果和评价
- 未来的工作
- 结束注释
- 参考
1.介绍
已经发现,在给定大量数据的情况下,递归神经网络(或者更准确地说,LSTM/GRU)在解决复杂的序列相关问题方面非常有效。它们在语音识别、自然语言处理(NLP)问题、时间序列预测等方面有实时应用。这篇 博客 很好地解释了其中的一些应用。
序列对序列(通常缩写为 seq2seq)模型是一类特殊的递归神经网络架构,通常用于(但不限于)解决复杂的语言相关问题,如机器翻译、问答、创建聊天机器人、文本摘要等。
Source https://www.analyticsvidhya.com/blog/2018/04/sequence-modelling-an-introduction-with-practical-use-cases/
这篇博文的目的是详细解释序列对序列模型是如何构建的,并给出它们如何解决这些复杂任务的直观理解。
我们将把机器翻译的问题(将文本从一种语言翻译成另一种语言,在我们的例子中是从英语翻译成马拉地语)作为本博客中的运行示例。然而,技术细节通常适用于任何序列对序列的问题。
由于我们使用神经网络来执行机器翻译,更常见的是称为神经机器翻译(NMT)。
2.先决条件
这篇文章假设你:
a.了解机器学习和神经网络的基本概念
b.知道高中线性代数和概率
c.有 Python 和 Keras 的 LSTM 网络的工作知识
(解释了 RNNs 如何被用来建立语言模型)和 理解 LSTM 网络 (用坚实的直觉解释了 LSTMs 的工作原理)是两篇精彩的博客,如果你还没有看过,我强烈建议你浏览一下。这些博客中解释的概念在我的文章中被广泛使用。
3.编码器-解码器架构
用于构建 Seq2Seq 模型的最常见架构是编码器解码器架构。这是我们将在这篇文章中使用的。下面是该架构的高级视图。
Source: https://towardsdatascience.com/sequence-to-sequence-model-introduction-and-concepts-44d9b41cd42d
注意事项:
a.编码器和解码器都是典型的 LSTM 模型(或者有时是 GRU 模型)
b.编码器读取输入序列,并在称为内部状态向量的东西中总结信息(在 LSTM 的情况下,这些称为隐藏状态和单元状态向量)。我们丢弃编码器的输出,只保留内部状态。
c.解码器是一个 LSTM,其初始状态被初始化为编码器 LSTM 的最终状态。使用这些初始状态,解码器开始产生输出序列。
d.在训练和推理过程中,解码器的表现稍有不同。在训练过程中,我们使用了一种称为教师强制的技术,这有助于更快地训练解码器。在推理过程中,解码器在每个时间步的输入是前一个时间步的输出。
e.直观地说,编码器将输入序列总结为状态向量(有时也称为思维向量),然后将状态向量馈送给解码器,解码器开始根据思维向量生成输出序列。解码器只是一个以初始状态为条件的语言模型。
现在我们将通过考虑将一个英语句子(输入序列)翻译成其对等的马拉地语句子(输出序列)的例子来详细理解上述所有步骤。
4.编码器 LSTM
本节简要概述了编码器 LSTM 的主要组件。我将保持这种直觉,而不进入数学领域。这就是它们的内容:
LSTM processing an input sequence of length ‘k’
LSTM 一个接一个地读取数据。因此,如果输入是一个长度为“k”的序列,我们说 LSTM 在“k”个时间步中读取它(把这想象成一个具有“k”次迭代的 for 循环)。
参考上图,以下是 LSTM 的 3 个主要组成部分:
a.Xi = >时间步长 I 的输入序列
b.hi 和 ci => LSTM 在每个时间步保持两种状态(“h”代表隐藏状态,“c”代表单元状态)。这些组合在一起,就是 LSTM 在时间步 I 的内部状态
c.Yi = >时间步长 I 的输出序列
重要提示:从技术上来说,所有这些组件(Xi、hi、ci 和 Yi)实际上都是浮点数的向量(解释如下)
让我们试着在我们问题的背景下把所有这些联系起来。回想一下,我们的问题是将一个英语句子翻译成马拉地语的对等物。出于这个博客的目的,我们将考虑下面的例子。比方说,我们有下面这个句子
输入句子(英语)= >“Rahul 是个好孩子”
输出句子(马拉地语)= >“राहुलचांगलामुलगाआहे”
现在只关注输入,即英语句子
对 Xi 的解释:
现在,一个句子可以被看作是单词或字符的序列。例如,在单词的情况下,上面的英语句子可以被认为是 5 个单词的序列(“Rahul”、“is”、“a”、“good”、“boy”)。在字符的情况下,它可以被认为是一个 19 个字符的序列(' R ',' a ',' h ',' u ',' l ',' ',……,' y ')。
我们将按单词分解句子,因为这种方案在现实应用中更常见。因此得名“单词级 NMT”。因此,参考上图,我们有以下输入:
X1 = '拉胡尔',X2 = '是',X3 = 'a ',X4 = '好,X5 = '小子'。
LSTM 将按如下 5 个时间步长逐字读这句话
Encoder LSTM
但我们必须回答的一个问题是,如何将每个 Xi(每个单词)表示为一个向量?
有各种将单词映射(嵌入)到固定长度向量的单词嵌入技术。我假设读者熟悉单词嵌入的概念,不会详细讨论这个主题。但是,我们将使用 Keras API 的内置嵌入层将每个单词映射到一个固定长度的向量。
hi 和 ci 的解释:
下一个问题是内部状态(hi 和 ci)在每个时间步的作用是什么?
简单地说,他们记得 LSTM 到目前为止读过(学过)的东西。例如:
h3,c3 = >这两个向量会记住网络到现在都是读“Rahul 是 a”。基本上是存储在向量 h3 和 c3 中的直到时间步长 3 的信息的汇总(因此称为时间步长 3 的状态)。
类似地,我们因此可以说 h5,c5 将包含整个输入句子的摘要,因为这是句子结束的地方(在时间步骤 5)。这些从最后一个时间步骤出来的状态也被称为“思维向量,因为它们以向量的形式总结了整个序列。
那 h0,c0 呢?这些向量通常被初始化为零,因为模型还没有开始读取输入。
注意:这两个向量的大小等于 LSTM 细胞中使用的单位(神经元)数量。
易解释:
最后,每一个时间点的易呢?这些是 LSTM 模型在每个时间步的输出(预测)。
但是 Yi 是什么类型的向量呢?更具体地,在单词级语言模型的情况下,每个 Yi 实际上是通过使用 softmax 激活生成的整个词汇表上的概率分布。因此,每个 Yi 是代表概率分布的大小为“vocab_size”的向量。
根据问题的背景,它们有时会被使用,有时会被丢弃。
在我们的例子中,除非我们已经阅读了整个英语句子,否则我们没有任何输出。因为一旦我们阅读了整个英语句子,我们将开始生成输出序列(等价的马拉地语句子)。因此,对于我们的问题,我们将丢弃编码器的 Yi。
编码器概述:
我们将逐字读出输入序列(英语句子),并保存在最后一个时间步 hk,ck 之后产生的 LSTM 网络的内部状态(假设该句子有“k”个单词)。这些向量(状态 hk 和 ck)被称为输入序列的编码,因为它们以向量形式编码(汇总)整个输入。由于我们将在读取整个序列后开始生成输出,因此编码器在每个时间步长的输出(Yi)将被丢弃。
此外,你还必须了解什么类型的载体是 Xi,嗨,慈和易。它们的大小(形状)是什么,代表什么。如果你对理解这一部分有任何困惑,那么你需要首先加强你对 LSTM 和语言模型的理解。
5.解码器 LSTM —训练模式
不同于在训练阶段和推理阶段扮演相同角色的编码器 LSTM,解码器 LSTM 在这两个阶段扮演稍微不同的角色。
在本节中,我们将尝试了解如何在训练阶段配置解码器,而在下一节中,我们将了解如何在推理过程中使用它。
回想一下,给定输入句子“Rahul 是个好孩子”,训练过程的目标是训练(教导)解码器输出“राहुल चांगला मुलगा आहे".”正如编码器逐字扫描输入序列一样,解码器也会逐字生成输出序列。
出于一些技术原因(稍后解释),我们将在输出序列中添加两个令牌,如下所示:
输出序列= > "开始 राहुलचांगलामुलगाआहे 结束"
现在考虑下图:
Decoder LSTM — Training Mode
最重要的一点是,解码器的初始状态(h0,c0)被设置为编码器的最终状态。这直观地意味着解码器被训练成根据编码器编码的信息开始生成输出序列。显然,翻译的马拉地语句子必须依赖于给定的英语句子。
在第一个时间步骤中,我们提供 START_ token,以便解码器开始生成下一个 token(马拉地语句子的实际第一个单词)。在马拉地语句子的最后一个单词之后,我们让解码器学习预测 _END 标记。这将在推理过程中用作停止条件,基本上它将表示翻译句子的结束,我们将停止推理循环(稍后将详细介绍)。
我们使用一种被称为“教师强制”的技术,其中每个时间步长的输入被给定为前一个时间步长的实际输出(而不是预测输出)。这有助于更快更有效地训练网络。想了解更多关于老师强迫的事情,参考这个 博客 。
最后,根据每个时间步长的预测输出计算损耗,误差随时间反向传播,以更新网络参数。用足够多的数据在更长的时间内训练网络会产生相当好的预测(翻译),我们将在后面看到。
整个训练过程(编码器+解码器)可以总结在下图中:
Summary of the training process
6.解码器 LSTM —推理模式
现在让我们试着理解推理所需的设置。如前所述,编码器 LSTM 扮演着读取输入序列(英语句子)和生成思维向量(hk,ck)的相同角色。
然而,解码器现在必须预测给定这些思想向量的整个输出序列(马拉地语句子)。
我们举同一个例子,试着直观的理解一下。
input sequence = >“Rahul 是个好孩子”
(预期)输出序列=> "राहुल चांगला मुलगा आहे"
步骤 1 :将输入序列编码成思维向量;
Encode the input sequence into thought vectors
第二步:开始循环产生输出序列,一个字一个字:
在 t = 1 时
Decoder at t=1
在 t = 2 时
Decoder at t = 2
在 t = 3 时
Decoder at t = 3
在 t = 4 时
Decoder at t = 4
在 t = 5 时
Decoder at t = 5
推理算法:
a.在推理过程中,我们一次生成一个单词。因此,解码器 LSTM 在一个循环中被调用,每次只处理一个时间步。
b.解码器的初始状态被设置为编码器的最终状态。
c.解码器的初始输入始终是 START_ token。
d.在每个时间步,我们保留解码器的状态,并将其设置为下一个时间步的初始状态。
e.在每个时间步,预测的输出作为下一个时间步的输入。
f.当解码器预测 END_ token 时,我们中断循环。
整个推理过程可以总结在下图中:
Summary of the inference process
7.代码遍历
当我们实际实现代码时,没有什么比理解代码更重要了,无论我们为理解理论付出了多少努力(然而这并不意味着我们不讨论任何理论,但是我想说的是理论必须总是在实现之后)。
数据集:
从 这里 下载并解压 mar-eng.zip 文件。
在我们开始构建模型之前,我们需要执行一些数据清理和准备工作。在不涉及太多细节的情况下,我将假设读者理解下面的(不言自明的)步骤,这些步骤通常是任何语言处理项目的一部分。
Code to perform Data Cleaning
下面我们计算英语和马拉地语的词汇。我们还计算了两种语言的词汇量和最大序列长度。最后,我们创建了 4 个 Python 字典(每种语言两个),用于将给定的令牌转换成整数索引,反之亦然。
Code for Data Preparation
然后,我们进行 90–10 训练和测试分割,并编写 Python 生成器函数来批量加载数据,如下所示:
Code for loading Batches of Data
然后,我们将培训所需的模型定义如下:
Code to define the Model to be trained
你应该能够从概念上将每一行与我在上面第 4 和第 5 节中提供的解释联系起来。
让我们看看从 Keras 的 plot_model 实用程序生成的模型架构。
Training the network
我们以 128 的批量训练网络 50 个时期。在 P4000 GPU 上,训练时间略多于 2 小时。
推理设置:
Code for setting up Inference
最后,我们通过在一个循环中调用上述设置来生成输出序列,如下所示:
Code to decode the output sequence in a loop
在这一点上,你必须能够在概念上将上面两个模块中的每一行代码与第 6 节中提供的解释联系起来。
8.结果和评价
这篇博文的目的是给出一个直观的解释,说明如何使用 LSTM 构建基本级别的序列到序列模型,而不是开发一个高质量的语言翻译器。所以请记住,由于多种原因,这些结果不是世界级的(而且你不要开始与谷歌翻译进行比较)。最重要的原因是数据集很小,只有 33000 对句子(是的,这些太少了)。如果你想提高翻译质量,我会在博客末尾列出一些建议。然而现在,让我们看看从上面的模型中产生的一些结果(它们也不太坏)。
对训练数据集的评估:
Evaluation on Training Dataset
对测试数据集的评估:
Evaluation on Test Dataset
我们能得出什么结论?
尽管结果不是最好的,但也没那么糟糕。当然比随机产生的序列要好得多。在一些句子中,我们甚至可以注意到预测的单词是不正确的,但是它们在语义上非常接近正确的单词。
此外,需要注意的另一点是,训练集的结果略好于测试集的结果,这表明该模型可能有点过度拟合。
9.未来的工作
如果你有兴趣提高质量,你可以尝试以下措施:
a.获取更多数据。高质量的翻译接受了数百万对句子的训练。
b.建立更复杂的模型,比如注意力。
c.使用剔除和其他形式的正则化技术来减轻过度拟合。
d.执行超参数调整。玩学率,批量,辍学率等。尝试使用双向编码器 LSTM。尝试使用多层 LSTMs。
e.尝试使用波束搜索,而不是贪婪的方法。
f.尝试 BLEU score 来评估您的模型。
g.这个清单永无止境,还在继续。
10.结束注释
如果文章吸引你,一定要提供一些评论、反馈、建设性的批评等。
完整代码在我的 GitHub repo 这里 。
如果你喜欢我的解释,你可以关注我,因为我计划发布一些与深度学习和人工智能相关的更有趣的博客。
你可以在 LinkedIn 这里
11.参考
a.https://medium . com/@ dev . elect . iitd/neural-machine-translation-using-word-level-seq 2 seq-model-47538 CBA 8 CD 7
b.https://blog . keras . io/a-ten-minute-introduction-to-sequence-to-sequence-learning-in-keras . html
c.https://arxiv.org/abs/1409.3215
d.https://arxiv.org/abs/1406.1078
自然语言处理中的词表示第三部分
原文:https://towardsdatascience.com/word-representation-in-natural-language-processing-part-iii-2e69346007f?source=collection_archive---------11-----------------------
在我的博客系列关于单词表示的 第二部分 中,我谈到了 Word2Vec 和 GloVe 等分布式单词表示。这些表示将单词的语义(意义)和相似性信息合并到嵌入中。然而,它们不能推广到不属于训练集的“词汇之外”的单词(OOV)。在这一部分,我将描述减轻这个问题的模型。具体说一下最近提出的两个模型:ELMo 和 FastText。ELMo 和 FastText 背后的想法是利用单词的字符和形态结构。与其他模型不同,ELMo 和 FastText 不将单词视为一个原子单位,而是其字符组合的联合,例如"remaking->re+make+ing "
以前模型的问题
诸如 Word2Vec 和 GloVe 的先前模型从字典中查找预训练的单词嵌入,因此没有考虑在特定上下文中使用的词义。换句话说,一词多义(单词的多重含义)没有被考虑在内。例如:
"我的朋友正在考虑向银行贷款."
"降雨导致莱茵河决堤. "
如果使用 Word2Vec 或 GloVe,那么单词“bank”将只有一次嵌入。但在上面两句话里有不同的内涵。在第一句话中,它的意思是为客户提供金融服务的机构。在第二句中,它暗示了水体旁边的斜坡。
ELMo:来自语言模型的嵌入
新模型 ELMo 能够通过将整个序列视为输入来解决以前模型的这个问题。它根据参照系动态地产生单词嵌入。该模型由三层组成:(1)卷积神经网络,(2)双向长短期记忆(LSTM)和嵌入。
Figure 1
ELMo 的模型输入(即 CNN 的输入)完全基于字符。所以最初,我们给 CNN 提供原始字符。然后 CNN 产生紧凑的嵌入,该嵌入被传递给双向 LSTMs。
b)双向 LSTM 层指示模型以正序和逆序在输入序列上运行。例如,让我们在下面的输入中获得单词“后跟的嵌入:
input = "多云的上午紧接着是一个阳光明媚的下午。"
context_straight= ['a ','多云','早晨']
context_reverse = ['by ',' sunny ',' a ','大部分',' sunny ','午后']
因此,对于每个目标单词,模型可以观察它周围的前面和后面的单词。从图 1 中可以看出,堆叠的 LSTM 构成了多层 LSTM。每个 LSTM 都将前一个的输出序列作为输入,除了第一个 LSTM 层从 CNN 获得字符嵌入。
c)嵌入层连接 LSTM 方向的隐藏状态,并产生依赖于上下文的嵌入。在论文中,作者将其定义为隐藏状态乘以特定任务模型权重的线性组合。它为模型正在使用的每个任务学习单独的 ELMo 表示。因此,ELMo 提高了许多 NLP 任务的性能。为了简单起见,我省略了细节。这里可以找到。
使用 Tensorflow-hub 的 EMLo
依赖关系:
- Python 3.6
- 张量流 1.13.1
- 张量流-集线器 0.4.0
可以使用以下方式安装库:
pip 安装张量流==1.13
从 ELMo 模块加载预训练的单词嵌入:
参数trainable = False
因为我只想加载预先训练好的重量。但是图的参数不一定是固定的。通过将其设置为True
,可以重新训练模型并更新参数。
从预先训练的 ELMo 获得单词嵌入:
默认输出大小为 1024,让我们在上面两句话中寻找单词“bank”的前 10 个维度:
正如我们注意到的,在不同的上下文中嵌入同一个单词是不同的。如前所述,ELMo 通过输入一系列字符来动态构建单词嵌入。它依赖于句子中当前周围的单词。
FastText:子字模型
以前的模型的问题,他们不能为 OOV 生成单词嵌入(见上文)。这个问题不仅由 ELMo 解决,而且在子字模型中也解决了。此外,与 ELMo 相反,子词模型能够利用形态学信息。在子词模型中,具有相同词根的词共享参数。它被集成为 FastText 库的一部分,这就是它被称为 FastText 的原因。
子词模型是跳格模型(Word2Vec)的扩展,它产生给定一个词的上下文的概率。模型损耗定义如下:
损失函数的第一部分将所有上下文单词 w_c 视为正例,第二部分随机采样 N_t,c 作为位置 t. 处的作为反例。一方面,目标是将共现和相似的单词放置在彼此靠近的位置。另一方面,它旨在定位向量空间中彼此远离的不同单词。子词模型以类似的方式训练,除了它将计算的 n 元语法添加到特征。n 元语法定义为给定数量的项目序列。例如,n=2 的 n 元模型将给出单词“banking”的以下输出:{ ba,an,nk,ki,in,ng }。
下面是另一个例子:
“河岸”
在跳格模型中,单词" river "有两个上下文标记: the and bank。而 n-gram(n = 2)的子词模型有 13 个上下文标记: th,eh,e_,a,an,nd,d,_b,ba,an,nk,the and bank。在实际中,我们提取 3≤ n ≤ 6 的所有 n 元文法。这是一种非常简单的方法,可以考虑不同组的 n 元语法,例如,取一个单词的所有前缀和后缀。
这种 n 元语法信息用子词信息丰富了词向量,并使模型能够为看不见的词构建向量。这对于形态丰富的语言和包含大量生僻字的数据集非常有益。德语就是一个很好的例子,因为它有丰富的复合名词。“Tischtennis”这个词翻译过来就是乒乓球。这个单词的嵌入将通过简单的加法来构建,例如 Tisch + Tennis → Tischtennis。
使用 Gensim 的快速文本
依赖关系:
- Python 3.6
- Gensim 3.7.2
可以使用以下方式安装库:
pip 安装张量流==1.13
使用自定义数据创建模型
让我们得到一个不属于训练的单词的嵌入:
有 157 种语言使用 wiki 数据的预训练模型,这里 可以找到 。也可以使用 gensim 加载它们。
拿走
ELMO 和子词是高级模型,能够为词汇表中存在和不存在的词产生高质量的嵌入。特别地,ELMo 能够在产生单词嵌入时考虑上下文信息。与其他现有模型相比,它具有更高的矢量质量。但是因为它在运行时进行预测,所以它有推理成本。另一方面,子字非常快,能够有效地合并 n 元语法。
单词间没有空格的语言的分词
原文:https://towardsdatascience.com/word-segmentation-for-languages-without-spaces-between-words-8b100c55124b?source=collection_archive---------28-----------------------
Unigram 语言模型是一个良好的开端
Photo by Brett Jordan on Unsplash
如果您正在处理一些与中文、日文和韩文相关的 NLP 任务,您可能会注意到 NLP 工作流不同于英文 NLP 任务。因为与英语不同,这些语言中没有空格来自然地分隔单词。所以分词对于这些语言来说非常重要。我对不同的分词方法做了一点研究。在这篇文章中,我将给出选择最佳方法的简单建议。
TL;速度三角形定位法(dead reckoning)
使用 Unigram 语言模型。您可以从 SentencePiece 中实现,这是一个独立于语言的子词标记器。无论你使用什么语言,这都是一个好的开始。
个案研究
英语中下面的句子用空格隔开,但是日语中的句子没有空格。
from One Piece
两种语言中对应的标记如下所示。
I -> 私
will be -> になる
the prirate king -> 海賊王
So how to extract the “海賊王” is the word segmentation problem we need to deal with. Usually, there are three levels we can use, the word level, character level, subword level. But in recent years, the subword level approach has shown its superiority over other approaches, so in this post, I will focus on the subword level.
子词级分割
这篇帖子很好地介绍了 3 个子字算法:
- 字节对编码(BPE)
- 文字片
- 单语法语言模型
Unigram 语言模型的作者还实现了一个库, SentencePiece ,它包含两个子字算法,BPE 和 Unigram 语言模型。
在最近的强大的语言模型中,BERT 使用了 WordPiece 模型,XLNet 使用了 Unigram 语言模型。
Unigram 语言模型最大的优点就是这是一个独立于语言的模型。无论你使用什么语言,这都是一个好的开始。
查看我的其他帖子 中等 同 分类查看 !
GitHub:bramble Xu LinkedIn:徐亮 博客:bramble Xu
参考
- https://medium . com/@ makcedward/how-subword-helps-on-your-NLP-model-83 D1 b 836 f 46
- https://github.com/google/sentencepiece
- 【https://qiita.com/taku910/items/7e52f1e58d0ea6e7859c
- https://techlife.cookpad.com/entry/2018/12/04/093000
- https://qiita.com/mkt3/items/4d0ae36f3f212aee8002
- https://yoheikikuta.github.io/bert-japanese/
- https://qiita.com/hideki/items/56dc5c4492b351c1925f
Seq2Seq 架构中的字序列解码
原文:https://towardsdatascience.com/word-sequence-decoding-in-seq2seq-architectures-d102000344ad?source=collection_archive---------39-----------------------
Source
自然语言生成【NLG】是生成文本的任务。像机器翻译、摘要、对话系统这样的自然语言生成任务的核心部分是根据给定的输入生成单词序列作为输出。例如,对于机器翻译系统,给定一个英语输入句子,模型需要生成其法语翻译。今天,大多数这样的系统都是建立在编码器-解码器架构及其变体之上的。图 1 显示了这种架构的示意图。
Fig.1 from Source
在上面显示的图像中,编码器负责捕获源/输入语言的完整上下文,而解码器负责使用该信息并输出所需语言的翻译。这种模型是用两种语言的巨大平行句子语料库来训练的。深入这种架构的本质已经超出了本博客的范围。请在此阅读更多T5。此外,实际谷歌的 NMT 系统也有一个关注组件。要了解注意力网络,请 阅读此 。
在每个解码器时间步长,使用 Softmax 激活函数 跨词汇输出概率分布是很常见的。在模型被训练之后选择最终的输出序列取决于所使用的解码策略。
在这里,我们将讨论在推理期间广泛使用的 3 种解码策略
1.贪婪搜索
该策略在每个解码时间步从模型的词汇中选择最可能的单词(即 argmax )作为输出序列的候选。
Decoder Segment
这种方法的问题是,一旦在任何时间步长 t 选择了输出,我们就不能灵活地返回并改变我们的选择。实践证明,贪婪解码策略在生成的文本中容易出现语法错误。这将导致在任何时间步长 t 选择最佳,但是当考虑整个句子语法正确和合理时,这不一定给出最佳。
2.具有固定波束大小的波束搜索
波束搜索策略试图找到具有最大可能性的输出序列。它通过将贪婪采样扩展到 Top-k 采样策略来实现这一点。在任何时间步 t,它将 top-k 最可能的单词视为该步的候选单词。这里,k 称为光束尺寸。在数学上,我们试图最大化下面提到的等式—
下图显示了在 k=3 的情况下实际上是如何发生的
Beam Decoding with k=3 at each time-step
这里,我们通过在解码时跟踪每个时间步长的前 k 个词汇输出来搜索高分输出序列。我们通常在到达句子结束标记(< eos >)时停止搜索,或者直到所有或至少一些 n 输出序列的时间步长 t 时停止搜索。我们还通过长度进行标准化,以避免在对任何序列评分时引起的任何偏倚。
Normalized Beam Search Scoring
这里,波束大小充当时间复杂度和精确度之间的折衷变量。让我们分析一下 k 可以取的最小值和最大值:
- 当 (k=1) —其行为类似于贪婪搜索,其中 argmax 在任何时间步 t 被馈送到后面的连续步骤。
- 当(k =词汇的大小) —其行为类似于穷举搜索,其中每个时间步的可能单词都是整个词汇,并且每个单词都给出了随后连续步骤的下一组词汇的概率分布。
Time Complexity Analysis
3.可变波束大小的波束搜索[1]
考虑到固定射束尺寸的限制,发展了可变射束尺寸的概念。固定的波束大小可能不一定是每个解码时间步长的最佳选择。
让我们用一个例子来理解它——让前 5 个词在任何时间步长 t 的概率值是可比较的。在这种情况下,固定波束大小(k)我们可能会错过相关的候选,导致信息丢失。然而,让前两个词在任何时间步长 t 都是可比的,其余的都很低。在这种情况下,固定波束大小(k ),我们可以通过添加不太相关的候选来添加噪声。
相反,波束大小应该是任何解码时间步长(t)的概率分布的函数。在[1]中,作者谈到了可以用来推导这种关系的各种技术。此外,如果你仔细注意,这也可以被视为一个宁滨问题,可以离散化的熵措施。请在这里阅读更多。
4.温度诱导最大值
这不是一个解码策略,但是可以和上面提到的任何搜索一起使用。在任何解码步骤中,我们通常使用 Softmax 激活函数来传递我们的词汇的概率分布。我们不使用普通的 Softmax,而是使用它的修改版本,如下所示
Temperature Induced Softmax
这里,T 是温度变量。很容易看出,较高的 T 值将导致肥胖分布(给所有人几乎相同的概率),而较低的 T 值将导致峰值分布(给一些人高概率)。
虽然这个博客主要集中在谈论单词序列解码,但没有说这些推理时间解码序列算法可以用于任何序列解码任务。
实现上面提到的方法可以在这里找到。
在https://prakhartechviz.blogspot.com查看我的博客库
进一步阅读
- 用于神经机器翻译的波束搜索策略
- 多样化波束搜索,改善复杂场景的描述
- 具有深度学习的 NLP
随时分享你的想法:)
词向量和词汇语义——基于计数的向量介绍
原文:https://towardsdatascience.com/word-vectors-and-lexical-semantics-part-1-c9dbc8932c1d?source=collection_archive---------23-----------------------
Image from Ryan Haggins via Unsplash
以下是我基于 2017 年牛津大学举办的深度 NLP 课程的个人笔记。该材料可从[1]处获得。
介绍
单词向量 : 用向量格式表示单词。
词汇语义学 : 分析词义以及词义之间的关系。
神经网络需要矢量表示作为输入。因此,需要将单词或句子转换成向量。
代表单词
文本仅仅是离散符号(即单词)的序列。一种简单的表示方法是对句子中的每个单词进行一次性编码。然而,这样做需要大量的内存/空间,因为向量空间(由一个热点编码向量组成)实际上就是你的词汇表的大小。
这种方法的问题是,由于每个向量都被定义为一个单词,因此每个向量都以一种相当正交的方式表示,在语义上彼此没有明确(弱)的关系。他们彼此之间也很稀疏。因此,需要能够表达语义相似性的更丰富的表示。
分布语义学
分布语义学 : 发展和研究理论和方法的研究领域,这些理论和方法基于语言项在大量语言数据样本中的分布特性,对语言项之间的语义相似性进行量化和分类【2】。
“从一个人所交往的人身上,你就可以知道他所说的话”——J . R .弗斯(1957)
上面的引用和其他类似的类比指出,可以通过观察人们如何使用单词来理解单词的意思。
同时,我们也对减少向量空间的大小感兴趣。这可以通过产生密集矢量表示(与稀疏相反)来实现。
从计算角度来看,有 3 种主要方法可以做到这一点。
- 基于计数的
- 预言性的
- 基于任务的
能够将单词指定为向量的优点是,可以开始客观地测量和比较单词向量,或者计算相似性、距离等。
让我们先介绍一下基于计数的方法。
计数法
定义要使用的基本词汇。通常它们是基于我们自己的经验/直觉或语料库的统计数据来选择的。这些词汇最好是信息丰富且有意义的。
通常词汇量是有限的。停用词通常被排除在外,因为它们在大多数可用的语料库中出现得很多。如果我们要包含它们,那么我们将很难确定它们之间的关系,因为停用词到处都在同时出现。
让我们看一个例子:
Credits to [1]
在上面的例子中,我们可以看到某些单词被选为我们感兴趣的基本词汇。还要注意像、、、这样的停用词不是基础词汇的一部分。
确定了目标单词及其上下文之后,我们现在可以将其表示为一个向量(如下所示)。
Example. Credits to 1. Note that the value doesn’t have to ONLY be 1.
作为向量,现在可以分析单词,可能通过相似性(计算相似性的最流行的方法是余弦距离)、向量空间中的距离等。
然而,仍然有一些缺点:
- 不是所有的单词都具有同等的信息量,因为有些单词在不同的文本中出现的频率更高;并且由于这一点,不再能够唯一地与特定的上下文相关联。
- 例如,在描述各种四条腿动物的文本中,单词跑或四条腿将无法区分语料库中的动物类型。
- 然而,它们是克服这一点的方法,如 TF-IDF 或 PMI。
在我的下一篇文章中,我们将探索一种更简单的方法来解决这些问题。
参考
- https://github.com/oxford-cs-deepnlp-2017/lectures
- https://en.wikipedia.org/wiki/Distributional_semantics
用 NumPy 从头开始 Word2vec
原文:https://towardsdatascience.com/word2vec-from-scratch-with-numpy-8786ddd49e72?source=collection_archive---------3-----------------------
如何用 Python 和 NumPy 实现 Word2vec 模型
介绍
最近工作中一直在做几个和 NLP 相关的项目。其中一些与培训公司内部的单词嵌入有关。在工作中,这些任务大多是在 Python 库的帮助下完成的: gensim 。然而,我决定在 Python 和 NumPy 的帮助下从头实现一个 Word2vec 模型,因为重新发明轮子通常是一种深入学习的好方法。
单词嵌入
单词嵌入没什么新奇的,不过是用数字方式表示单词的方法。更具体地说,是将词汇映射到向量的方法。
最直接的方法可能是使用一键编码将每个单词映射到一个一键向量。
尽管一键编码非常简单,但也有一些缺点。最值得注意的一点是不容易用数学方法测量单词之间的关系。
Word2vec 是一种神经网络结构,通过在监督分类问题上训练模型来生成单词嵌入。这种方法首先在 Mikolov 等人于 2013 年发表的论文 对向量空间中单词表示的有效估计 中介绍,并被证明在实现单词嵌入方面相当成功,该方法可用于测量单词之间的句法和语义相似性。
Word2vec(跳格)
Mikolov 等人在 2013 年提出了两种模型架构,连续词袋模型和跳格模型。在本文中,我将深入探讨后者。
为了解释跳格模型,我随机引用了我正在读的一本书的一段文字,约翰·博格尔的《投资常识小书》:
扣除投资成本后,跑赢股市是输家的游戏。
正如我上面提到的,word2vec 模型试图优化的是一个监督分类问题。更具体地,给定一个“上下文单词”,我们想要训练一个模型,使得该模型可以预测一个“目标单词”,其中一个单词出现在来自上下文单词的预定义窗口大小内。
以上面的句子为例,给定一个上下文单词“investing ”,窗口大小为 5,我们希望模型生成一个底层单词。([扣除,的,成本,殴打,股票,市场]中的一个词是在这种情况下。)
模型概述
下图显示了 Mikolov 等人 2013 年论文中的原始图表。
我做了另一个更详细的图表
单词嵌入层本质上是一个形状为(语料库中唯一单词的数量,单词嵌入大小)的矩阵。矩阵的每一行代表语料库中的一个单词。单词嵌入大小是一个有待决定的超参数,可以认为是我们想要使用多少特征来表示每个单词。模型的后一部分只是神经网络形式的逻辑回归。
在训练过程中,单词嵌入层和密集层被训练,使得在训练过程结束时,给定上下文单词,模型能够预测目标单词。在用大量数据训练这样一个模型之后,单词嵌入层将最终成为单词的表示,它可以用数学方式展示单词之间的多种酷关系。(对更多细节感兴趣的可以参考原论文。)
使用 Python 从头开始实现
培训数据的准备
为了生成训练数据,我们首先对文本进行标记。当涉及到标记文本数据时,有许多技术,比如去掉出现频率很高或很低的单词。我只是用一个简单的正则表达式分割文本,因为本文的重点不是标记化。
接下来,我们给每个单词分配一个整数作为它的 id。另外,使用word_to_id
和id_to_word
记录映射关系。
最后,我们为模型生成训练数据。对于每个上下文单词tokens[i]
,生成:(tokens[i], tokens[i-window_size]), ..., (tokens[i], tokens[i-1]), (tokens[i], tokens[i+1]), ..., (tokens[i], tokens[i+window_size])
。以窗口大小为 5 的上下文单词investing
为例,我们将生成(investing, deduction), (investing, of), (investing, the), (investing, costs), (investing, of), (investing, beating), (investing, the), (investing, stock), (investing, market), (investing, is)
。注意:在代码中,训练(x,y)对用单词 id 表示。
以下是生成训练数据的代码:
培训流程概述
生成训练数据后,让我们继续研究模型。与大多数神经网络模型类似,训练 word2vec 模型的步骤是初始化权重(我们要训练的参数)、向前传播、计算成本、向后传播和更新权重。根据我们想要训练多少个纪元,整个过程将重复几次迭代。
待训练参数的初始化
模型中有两层需要初始化和训练,即单词嵌入层和稠密层。
字嵌入的形状会是(vocab_size, emb_size)
。这是为什么呢?如果我们想用一个包含emb_size
个元素的向量来表示一个词汇,并且我们的语料库中的词汇总数是vocab_size,
,那么我们可以用一个vocab_size x emb_size
矩阵来表示所有的词汇,其中每行代表一个单词。
密集层的形状将是(vocab_size, emb_size)
。怎么会这样将在这一层中执行的操作是矩阵乘法。这一层的输入将是(emb_size, # of training instances)
,我们希望输出是(vocab_size, # of training instances)
(对于每个单词,我们希望知道该单词出现在给定输入单词中的概率)。注意:我不包括密集层中的偏差。
以下是初始化的代码:
前进传球
The Upper part shows the forward propagation.
正向传播有三个步骤,从单词嵌入获得输入单词的矢量表示,将矢量传递给密集层,然后将 softmax 函数应用于密集层的输出。
在一些文献中,输入被表示为一个热码向量(假设第 I 个元素为 1 的一个热码向量)。通过将单词嵌入矩阵和独热向量相乘,我们可以得到表示输入单词的向量。但是,执行矩阵乘法的结果本质上与选择单词嵌入矩阵的第 I 行相同。我们可以通过简单地选择与输入单词相关的行来节省大量的计算时间。
剩下的过程只是一个多类线性回归模型。
下图可用于回忆致密层的主要操作。
然后,我们将 softmax 函数应用于密集层的输出,这给出了每个单词出现在给定输入单词附近的概率。下面的等式可以用来提醒什么是 softmax 函数。
以下是向前传播的代码:
成本的计算(L)
这里,我们将使用交叉熵来计算成本:
以下是成本计算的代码:
反向传递(反向传播)
在反向传播过程中,我们希望计算可训练权重相对于损失函数的梯度,并使用其相关梯度更新权重。反向传播是用来计算这些梯度的方法。除了微积分中的链式法则之外,没什么稀奇的:
我们想要训练的是密集层和单词嵌入层中的权重。因此,我们需要计算这些重量的梯度:
下一步是使用以下公式更新权重:
以下是向后传播的代码:
注意:你可能会奇怪为什么在dL_dW
中有一个1/m
的因子,而在dL_dword_vec
中没有。在每一遍中,我们一起处理m
训练示例。对于密集层中的权重,我们希望用m
梯度下降的平均值来更新它们。对于单词向量中的权重,每个向量都有其自己的权重,这导致其自己的梯度下降,因此我们在更新时不需要聚集m
梯度下降。
模特培训
为了训练模型,重复向前传播、向后传播和权重更新的过程。在训练期间,每个时期之后的成本应该有下降的趋势。
下面是为模型定型的代码:
估价
在用从上面的示例句子生成的数据训练模型之后,窗口大小为 3,5000 个时期(具有简单的学习率衰减),我们可以看到,在给定每个单词作为输入单词的情况下,模型可以输出最多的相邻单词。
你可以在这个笔记本里找到端到端的流程。请随意下载并试玩。
这是我的第一个中等职位。谢谢你们的阅读。请随时向我提供反馈或向我提问。
在这里停止阅读是好的,但如果你对我在尝试用更大的数据集训练时发现需要的一些优化感兴趣,请继续阅读。
优化(空间)
当我试图用更大的数据集训练上面的模型时,我发现在训练过程中内存消耗不断增加,python 内核最终关闭。后来,我发现这个问题与我将标签Y
输入模型的方式有关。
在原始代码中,每个标签都是一个 hot vector,它使用一串 0 和一个 1 来表示带标签的输出字。当词汇量越来越大时,我们浪费了太多的内存到那些不能给我们提供有用信息的零上。
在我开始只给标签添加相关的单词 ind 之后,内存消耗问题就消失了。我们把空间从 O(词汇量* m)减少到 O(m)。
以下是我的代码实现(只有 2 个地方需要修改):
为了优化训练时间,可以用分级 softmax 代替上述常规 softmax。然而,这篇文章有点太长了,所以我们下次再讨论这个话题。
感谢大家多阅读。同样,请随时向我提供反馈或向我提问。
更新
- 【2019–02–17】如果你对如何得出密集层的输出相对于损失的梯度感兴趣,这里有一个我的导数的书面笔记的链接:https://github . com/ujhuyz 0110/written _ notes/blob/master/soft max _ gradient . pdf
Word2vec 变得简单
原文:https://towardsdatascience.com/word2vec-made-easy-139a31a4b8ae?source=collection_archive---------7-----------------------
这篇文章是 word2vec 的一个简单而深入的指南。在本文中,我们将从头实现 word2vec 模型,看看嵌入如何帮助找到相似/不相似的单词。
介绍
Word2Vec 是 NLP(自然语言处理)的基础。托马斯·米科洛夫和他的研究团队于 2013 年在谷歌开发了这项技术。他们的方法首先发表在论文《向量空间中单词表示的有效估计》中。他们改进了他们的模型,通过使用像频繁词的二次抽样和采用负抽样这样的技术来提高表示的质量和计算的速度。这项工作发表在论文“单词和短语的分布式表示及其组合性”上。
Word2Vec 是一种将单词表示为向量的高效且有效的方式。整个文本被压缩在一个低维度的空间里。在这个空间中,所有向量都有一定的方向,并且可以明确地定义它们之间的关系。单词作为嵌入向量的分布式表示为以适合 NLP 中许多应用的方式找到单词提供了许多可能性。
履行
我们将保持语料库简单,因为它有助于我们轻松理解每一步,而且我们可以清楚地可视化关系,使其更加具体。CBOW(连续单词包)和 Skip-Gram 是两种最流行的单词嵌入框架。在 CBOW 中,在所选单词的上下文(周围单词)中出现的单词被用作输入,中间或所选单词被用作目标。在 Skip-Gram 中正好相反,这里中间的单词试图预测它前面和后面的单词。
考虑由从“a”到“z”的字符顺序组成的文本[a,b,c,d,e,f,g,h,I,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],进一步让整数 0 到 25 代表相应的字母。在保持窗口大小为 2 的情况下实现 CBOW,我们可以看到“a”与“b”和“c”相关,“b”与“a”、“c”和“d”相关,依此类推。由此可见,表示输入单词的一个热向量的维数为[26,1]。在模型的帮助下,我们将找到大小为[10,1]的密集分布向量。嵌入向量的大小是任意选择的。
下图说明了上下文和目标词。
Left. Arrangement of CBOW and Skip-gram models. Right. Character and corresponding integers grouped into lists of input and targets. For each the first column represents the input character and the remaining items in each sub-lists are targets for the input.
想象关系的模式是很容易的。当它们在两个字符的范围内同时出现时,它们是相关的或者共现是真实的。下面的表格和地图描述了这种模式。
Left. Characters appearing together (not fully visualized). Right. The black color region implies no co-occurrence and white region implies characters occurring together given windows size of 2 #Also note the diagonal symmetry — implying that co-occurrence from a to b means co-occurrence from b to a but these relationships are depicted different axes.
Word2Vec 是一个概率模型。该模型的关键组件是两个权重矩阵。第一矩阵(w1)的行和第二矩阵(w2)的列分别嵌入输入单词和目标单词。给定所选择的输入单词,这两个单词向量的乘积然后被用于获得成为目标单词的概率。在训练时,使用梯度下降优化这些嵌入向量,使得真实目标的概率最大化。显然,矩阵 w1 和 w2 是因式分解的概率矩阵,它非常类似于共生矩阵。
下图对模型进行了说明和解释。
Schematic diagram of Word2Vec model. Input and Output vectors are of size V, while hidden vector (embedding) is of size N. (Source: https://lilianweng.github.io/lil-log/2017/10/15/learning-word-embedding.html)
In this illustration, the model is learning to embed 6 characters (‘a’ to ‘f’) into a 3-dimensional embedding vector. A. Co-occurrence Matrix of these characters with a window size of 2, co-occurrence is expressed as either present or absent. (size 6, 6) B. Weight matrix w1 — transposed. Each row of matrix w1 is embedding vector for the one word as one hot vector uniquely selects the corresponding row of w1 (or col of W1 transpose) C. Matrix of one hot vector, each column represents one word/item D. Product of w1 and input matrix results in matrix h (hidden layer). Here the whole input matrix is as an identity matrix and simply passes weight matrix w1 as hidden matrix h. However it is not necessary to be an identity matrix, the order and size of the input matrix(and hence hidden layer) could be different E. Weight matrix w2 — transposed (size 6,3). Each column of matrix w2 closely represents represents the target words F. Hidden layer — h, identical to w1 as described before G. Each row of w2 — transposed products with a column of hidden (that embeds an input word ) outputting scores of length of the size vocab H. As mentioned all rows of w2_transposed interacting with 1 column of hidden — results in one column of Score Matrix , total product of w2_transposed and h is the matrix S (size 6, 6) I. Softmax is applied to score matrix. Each entry in a column is converted into probabilities J. Probability matrix — each item in a column of this matrix represents probabilities for being a target word given an input word L. Error —Probability at the position of true indices are to be maximized, error is computed comparing this probability assigned to the index corresponding to true targets M. Back prop — At the start weights are initialized randomly and resulting probabilities are low and similar for all targets. After training, back propagation of gradients and optimization of weights, probabilities are dense around targets and close to 0 at other places.
py torch 中的实施
从上面可以明显看出,网络是轻的,嗯模糊的。在这里,我们只需要为每个字母创建一个热点向量,并将其与所有目标配对。例如,字母“a”是[1。, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.](调整为大小为 26,1)作为一个热向量,其目标索引为 1 和 2(“b”和“c”)。
网络有两个完全连接的层,分别计算隐藏层和输出层。没有使用偏倚,因为它们对于相似性度量是多余的。Softmax 是唯一的激活,它将输出分数转换为概率。这里的损失标准(nn。CrossEntropyLoss)实现 Softmax 并计算损失。优化权重时选择了 Adam 优化器。
#**Dependencies**import torch
import torch.optim as optim
import matplotlib.pyplot as plt#**Generating desired pair of inputs and targets**#Empty list that collects input and target in pairs
inp_target_list = []
for i in range(26):
temp = []
a, b, c, d = i- 2, i - 1, i + 1, i + 2 #targets for input i
temp.extend([a, b, c, d])#keep targets within range of 0 to 25
for j in range(4):
if temp[j] >=0 and temp[j] <=25:
inp_target_list.append([i, temp[j]])print(inp_target_list[:5])
#[[0, 1], [0, 2], [1, 0], [1, 2], [1, 3]]**#Get one hot vectors for all inputs**#Initiate tensor with 0’s that holds all inputs in inp_target pairs
inp_tensor= torch.zeros(len(inp_target_list), 26)#Substitute 1 for 0, at position indicated by respective input
for i in range(len(inp_tensor)):
inp_tensor[i, np.array(inp_target_list)[i, 0]] =1#One_hot for 0 or letter 'a'
print(inp_tensor[0])
#tensor([1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0., 0., 0., 0., 0., 0.])**#Create Network**
#2 fully connected layers with NO bias
#Embedding dimension is 10
#Softmax is implemented using loss criterion (nn.CrossEntropyLoss())fc1 = nn.Linear(26, 10, bias = False)
fc2 = nn.Linear(10, 26, bias = False)
params = list(fc1.parameters()) + list(fc2.parameters())LR = 0.001 #Learning rate
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(params, lr = LR)**#Train**#Define inputs and target tensors
inp_tensor = inp_tensor
target_tensor = torch.tensor(inp_target_list)[:, 1]losses = []for i in range(10000):
out_1 = fc1(torch.Tensor(inp_tensor)) #hidden layer
out_2 = fc2(out_1) #Score matrix optimizer.zero_grad() #Flushing gradients
loss = criterion(out_2, target_tensor.long().view(out_2.shape[0],))#Apply Softmax, get loss
loss.backward() #Getting grads
optimizer.step() #Correcting parameters
if i % 1000 == 0:
losses.append(loss.item())
print(loss.data)**#Loss printed**
tensor(3.2619)
tensor(3.0980)
tensor(2.7768)
tensor(2.4193)
tensor(2.1216)
tensor(1.8937)
tensor(1.7242)
tensor(1.6007)
tensor(1.5130)
tensor(1.4526)
tensor(1.4121)
.........
结果和推论
这里我们将回顾一系列矩阵。解释图片/图案要容易得多,这些图片/图案让我们对分布在整个矩阵中的数字有一个清晰的概念。
下面每个热图的内容都在各自的标题中进行了讨论和解释。得分矩阵中的每一行都是单词作为输入和单词作为目标的嵌入向量的乘积。乘积被视为概率矩阵中的概率。两个字符的窗口内的相邻字符具有更高的值和密集概率。
距离矩阵是从输入单词的每个嵌入向量到作为输入的单词的所有嵌入向量(包括其自身)的余弦距离。热对角线值是其自身的乘积,距离为 1。接近对角线的值是暖的,表示它们是每个对角线元素的近邻。当矩阵被绘制为 1 时,这种模式得到了很大的增强,正距离和负距离与平滑距离一样。
#Note: As there is no transposition of weight matrices in forward #propagation columns represent the embedding vectors#**Score Matrix**
plt.matshow((fc1.weight.t() @ fc2.weight.t()).detach().numpy())#Probability Matrix
plt.matshow(nn.Softmax(dim = 1)(fc1.weight.t() @ fc2.weight.t()).detach().numpy()) #**Distance Matrix**
dist_matrix = torch.zeros(26, 26)
for i in range(26):
for j in range(26):
dist = torch.nn.functional.cosine_similarity(fc1.weight.t()[i, :], fc1.weight.t()[j, :], dim = 0, eps = 1e-8)
dist_matrix[i, j] = dist #**Smoothed distances**
if dist_matrix[i, j] ==1 --> 1
if dist_matrix[i, j] < 0 --> -0.5
if dist_matrix[i, j] 0 to 0.99 --> 0.5
A. Score matrix: Product of each context vector with each word vector. Cells corresponding to co-occurrence have high score and rest have low scores, closely resembles co-occurrence matrix. B. Probability Matrix: Obtained applying softmax to score matrix. Each row corresponds to a probability of target word for the index word (chars here). a,z have two targets, assigned probs are 0.5 each b, y have 3 targets, assigned probs are 0.33 each rest have 4 targets, assigned probs are 0.25 each This matrix also represents the prediction of model given any word. (same cells represent prediction with assigned probs) Prediction involves both matrices of the model and Softmax as end activation. Symmetry is consequence of reciprocity ie. context and target words have reciprocal relationship in this example.
`Left. Cosine distance calculated from each character to other. The distance between a word with itself is 1 (maximum) The similarity distances with neighbors are large and non- neighbors are small. Prediction and distances are not the same. Distances are computed from the word vectors (weight matrix 1) alone. B. Smoothed Distances: Here distances are smoothed Distance of 1 → 1, Pos distances < 1 → 0.5 , Neg Distances → 0.5. Map clearly identifies the neighboring cells with higher similarity distances.
嵌入向量
首先,让我们看看 w1 中的‘a’和 w2 中的‘b’的嵌入,它们分别代表输入/周围单词和目标/中间单词。“a ”(作为输入)和“b ”(作为目标)之间的向量积是 18.217,这是一个相对较大的正数,而对于所有其他字符来说,它很小或为负数(除了“c”)。这意味着“b”(和“c”)将有更高的概率。另一方面,从 w1 中取两个矢量,作为输入的矢量“a”和作为输入的矢量“b”之间的余弦相似度是 0.4496 或大约 63 度,这意味着一些相似性。
**#Embedding for ‘a’ and ‘b’**
vec_a = fc1.weight.t()[0].data #select 'a' from w1
vec_b = fc1.weight.t()[1].data #select 'b' from w1
vec_b_as_target = fc2.weight[1].data #select 'b' from w2#vec_a
[1.7211128, -1.8706707, 0.15043418, -1.7761097, 0.25396731, 0.17291844, 0.11687599, -2.0173464, 1.4879528, -1.6174731],#vec_b
[-1.8015, -0.6789, -1.3880, -1.6618, 1.5363, -1.8415, 1.9647, -1.5331, 2.0684, -1.7526] #vec_b_as_target
[1.9113195, -1.9370987, 1.349203, -1.5565106, 1.1705781, -0.78464353, -1.7225869, -1.7434344, 1.9383335, -1.2209699]#Cosine similarity between two characters
torch.nn.functional.cosine_similarity(vec_a_as_input, vec_b_as_input, dim = 0, eps = 1e-8) #0.4496 or 63 degrees#vector product between input and target vectors --> raw score
vec_a@vec_b_as_target #18.217
余弦相似度
在不同的距离度量中,余弦相似度更直观,在 word2vec 中使用最多。它是两个向量的归一化点积,这个比值定义了它们之间的角度。具有相同方向的两个向量的余弦相似度为 1,90°的两个向量的相似度为 0,直径方向相反的两个向量的相似度为-1,与它们的大小无关。
Top left: Equation for cosine distance Top right: Cosine distance varies from 1 to -1 and corresponding angle varies from 0 to 180 degrees. Bottom left: Cosine distances from ‘c’ to all the characters. Bottom right: Same distances expressed as angles. Note ‘c’ is most similar to itself.
矢量组合并寻找它的邻居
一旦单词用向量表示,寻找相似或不相似单词的任务就变得容易了。任何矢量组合都会产生新的矢量,余弦距离或其他相似性度量可以像以前一样使用。这些操作构成了著名等式“国王-男人+女人=王后”的基础。
用于降维的 t-SNE
t-SNE(t-分布式随机邻居嵌入)有助于进一步将向量的维数降低到 2 或 3 维,使得可以可视化向量及其空间排列或分布。下面的代码是嵌入向量从 10 维到 2 维的 t-SNE 变换的一个例子。
from sklearn.manifold import TSNE
tsne_2d = TSNE(n_components=2).fit_transform(fc1.weight.t().detach().numpy())#First five 2d vectors
print(tsne_2d[:5])
array([[-1.11534159e-04, 1.24468185e-04],
[-8.66758155e-05, -1.63095172e-04],
[-5.46419301e-05, 6.82841112e-05],
[ 1.30452306e-04, 1.16242307e-04],
[-2.39734325e-05, 1.93809960e-04]])
Left. For the selected combination [c + d -e], most similar characters ‘c’ and most dissimilar character is ‘w’. Right — Scatter plot of characters in 2D after t-SNE transformation of embedding. As expected no clusters are observed as data is evenly spread.
结论
word2vec 实现的关键是构造两个互补的权重矩阵,将单词表示为输入和上下文或目标。嵌入维度可以是任意维度,这取决于词汇表的大小。模型的输出或预测不同于相似性或距离。当模型学习从输入到输出的映射时,嵌入捕获它们彼此的相对位置。Softmax 适用于较小的语料库,但随着词汇量的增加,它会变得低效,因为它涉及到对整个词汇长度的分数求和。负采样 Skip gram 是首选算法。
最后,Gensim 是一个受欢迎的免费库,我们可以很容易地使用它进行单词嵌入和文本分析。但是了解了基本原理,使用这些工具就变得更加清晰和容易了。
数学推导供参考
符号和等式:
x:一个热向量输入(大小:vocab,1)
w1:权重矩阵 1(大小:vocab,嵌入 dim)
h:隐藏层(大小:嵌入尺寸,1)
Vc:单词输入的向量嵌入(在 CBOW 中,输入单词是上下文单词)
w2:权重矩阵 2(大小:嵌入 dim,vocab)
Vw_i:第 I 个目标单词的向量嵌入(在 CBOW 中,给定所选的周围单词,我们试图预测中间的单词)。尺寸(嵌入尺寸,1)
S 和 S_i : S_i 是 h(或 Vc 或 w1 的选定行)和 Vw_i(或 w2 的第 I 列)的向量积。s 代表每个 Vw 的 Vc 得分。(大小:S_i 是标量,S 的分数和 vocab 一样多)
Y_i: Softmax 将得分 S_i 转换为概率 Y_i(或第 I 个目标词的概率)。这样做 Softmax 需要对所有分数求和
Vw_prime:对所有目标词求和
P(w|c):给定上下文或输入单词的目标单词的概率
L(theta):参数的似然性(theta 表示 w1 和 w2,它们又是语料库中所有单词的 Vc 和 Vw 的集合)
l(θ):θ的对数似然
rho:学习率
注意:以下等式一次使用一个字符或一个单词向量(Softmax 标准化期间除外),但在算法中实现时会处理一批或全部词汇。
正向传播
似然和反向传播
参考资料:
[1]托马斯·米科洛夫,程凯,格雷格·科拉多,杰弗里·迪恩,向量空间中词表示的有效估计(2013),arXiv:1301.3781 [cs .CL]
[2]米科洛夫、托马斯、伊利亚·苏茨基弗、程凯、格雷戈里·科拉多和杰弗里·迪恩。"单词和短语的分布式表示及其组合性." NIPS (2013)。
另请查看:阿里·高德西,Lec 13: Word2Vec Skip-Gram
请通过以下方式连接:
邮件:mnshonco@gmail.com 或
领英:https://www.linkedin.com/in/mrlakhey/
激励人心的话,TED 演讲上的数据科学项目
原文:https://towardsdatascience.com/words-that-will-inspire-a-data-science-project-of-ted-talks-5077a50fa2b5?source=collection_archive---------28-----------------------
“激励人心的话语”是对 2500 多个 TED 演讲的分析,使用文本分析和 R 上的机器学习来寻找使一些演讲比其他演讲更受欢迎的因素。
做这个项目的动机是什么?
我是伦敦一个名为 Data Scientist speakers 的 meetup 小组的成员,该小组定期开会练习数据科学演讲,并接收反馈以提高公众演讲水平。
俱乐部每年都会举办一场比赛,看谁能带来最好的数据科学故事。我参加了这个比赛,并希望参与一些特别的事情:我想结合我的数据科学技能来分析著名的演讲或会谈,并使用这些见解来构建一个全新的演讲或会谈。
灵感的来源是什么?
我以我最喜欢的三篇演讲开始了我的分析,它们是由最杰出的公共演说家发表的,他们的演讲激励了数百万人塑造我们今天生活的世界。
你能从下面的片段中认出这些演讲和他们的演讲者吗?
我说的是约翰·肯尼迪、马丁·路德·金和温斯顿·丘吉尔。
信封背面的计算 对于这三篇演讲,我分析了他们使用的词的频率,我得到了一个大惊喜…每篇演讲中使用最多的词是相同的!你能在单词云的中间看到它吗?
三位演讲者用得最多的词是“Will”(温斯顿·丘吉尔用的是 Shall,妥妥的英式风格!).他们可能会用“Will”这个词来激励人们采取行动,或者表示未来会发生变化。除了这种相似性,三位演讲者还使用了一种叫做结构重复的东西。他们多次重复同一句话来制造影响和记忆。
但是我们需要更多的数据!这些巧合让我想到,单词中可能存在潜在的模式,可以让演讲更具启发性。但三次演讲肯定不足以得出结论,这促使我寻找一组合适的演讲来进行分析。理想情况下,要进行数据分析,会谈应包括:
- 足够数量的会谈进行分析
- 理想情况下,采用相同的形式和风格,以避免因谈话形式不同而产生的强烈偏见
- 应该有可用的抄本,因为这将减少时间和精力
- 对于机器学习的使用,应该有一种方法来跟踪受欢迎程度的进展,以检测更鼓舞人心的谈话和不太鼓舞人心的谈话
突然灵机一动
看来,要找到一套考虑到这些因素的谈判方案可能是一项艰巨的任务。然而,我很快意识到已经有具备所有这些特征的演讲了:Ted 演讲!
类似风格的 Ted 演讲有成千上万个,他们记录受欢迎程度,他们有可用的抄本和其他信息,比如他们网站上的浏览量和评论。为了让事情变得更容易,数据科学竞赛网站 Kaggle 已经公布了所有这些数据,并允许任何人以合适的格式下载它们。
数据科学方法
有了现在可用的数据,我就可以进行分析了,分析可以分为三个阶段:
一.数据提取和特征工程
二。数据分析和模型集成
三。模型洞察力
一、数据提取和特征工程
Kaggle 提供的数据集包含大量数据,需要首先进行转换才能执行分析。我是 R 的常客,但对文本分析不是很熟悉,所以基本上我遵循了“用 R 进行文本挖掘”这本书上的所有内容。这本书绝对是使用 r 进行文本分析的来源。
该数据集包含了所有 TED 演讲活动及其所有的文字记录,以及你可以在他们的网页上看到的任何其他数据。一个非常好的地方是,它还包括数据提取的日期,每个 ted 演讲在网站上的发布日期以及它们的拍摄日期。这些特征对于通过使用机器学习算法在模式搜索中执行预测分析将变得很重要
我构建了 50 多个特征作为潜在因素,来测试为什么有些演讲比其他演讲更受欢迎。这些原始因素组中的大多数与字数的频率分析相关,例如:
- 通过使用每分钟的单词数、他们说的句子数和每句话的单词数来判断说话者的语速
- 观众的反应利用了一个在记录中发现的有趣特征,包括观众笑的具体场合,掌声,提问的次数
- 我还加入了许多最常见的 n-grams,看看是否有他们倾向于重复的特定单词
有了这些因素,我的目标是一个分类问题来预测一个 ted 演讲是否会流行
二。数据分析和模型集成
这个阶段可以概括为以下步骤
1。描述性分析:该分析的一个关键特征是以某种方式标准化了在线观看 Ted 演讲的时间。一个 TED 演讲在网站上出现的时间越长,被浏览的机会就越多。因此,我将每月的平均指标标准化,而不是使用总数。
2。相关性分析:许多变量将倾向于与其他变量相关。因此,我使用的一种技术是仅使用最具预测性的变量(在单变量水平上),并丢弃预测性较低的变量。
3。额外的特征工程:一些 n-gram 在它们之间是相关的,因为它们使用相同的单词,所以我将那些有用的相似的 n-gram 组合成一个变量。
4。模型评估:我开始使用逻辑回归分析单变量水平的数据,以找到最相关的变量,并丢弃完全没有预测性的变量。使用前 20 个最相关的单个变量,我开始通过调整 hyper 参数、变量箱和不同的变量选择方法,手动开发几种类型的模型,包括逻辑回归、随机森林和 XGBoost。
除了手动开发的模型,我还使用了 H2O 的 AutoML 功能,该功能可以自动开发多种类型的模型,如堆叠模型、深度学习和其他梯度推进方法。这种自动建模技术将帮助我参考其他类型的模型如何与我手工开发的模型进行比较。
三世。模型洞察
令人惊讶的是,H20 开发的不同类型的模型在性能方面与人工逻辑回归模型相差不远。因此,我决定使用逻辑回归来更容易地解释预测是如何建立的。为了使模型更容易理解并避免任何异常值问题,我在最终建模阶段将独立变量分成四分位数。最终的模型有七个变量,AUC 为 76%,正确预测流行话题的准确率为 73%。
赢家模型的洞察力告诉我:
- 持续时间较短的会谈比持续时间较长的会谈更有效
- 慢慢说更有效,这是通过计算每分钟的字数来衡量的,使用的是说话的总字数及其持续时间
- 在谈话过程中提问更有效。这是通过识别记录中的问号来衡量的
- 让观众发笑更有效。这是通过识别文字记录中笑声标题的出现来衡量的
对于这个最终模型,我还检查了最高和最低的预测分数,并查看了模型的排名。在这里,从左到右,我们从表现不好的谈话到表现较好的谈话(当然,不要低估得分最低的人!).
- 在排名最低的模特中,我发现伊森·祖克曼的“倾听全球之声”节目表现不佳。这个人在每一个变量上都得分最低(持续时间长,语速快,几乎没有笑的问题)
- 谷歌的谢尔盖·布林和拉里·佩奇得分也很低
- 杰夫·贝索斯关于“网络未来的电隐喻”的演讲也得分较低
- 在模特的谈话中得分最高的是斯蒂芬·霍金,他的谈话是“质疑宇宙”。这个演讲在模型的变量中得分很高,因为这个演讲是关于问很多问题的,并且说得很慢(因为辅助声音很慢!)
- 其中一个很好的演讲是来自的 Alan Smith 的演讲“为什么你应该热爱统计学”。这给了我希望,统计学家可以成为一个真正优秀的演讲者!
现在有了一个开发好的模型,为什么不让每个人都可以使用它呢!我用 Shiny 和 ShinyApps 部署了一个在线工具,你可以在这个网站的分析你的谈话部分使用。请按照说明,你需要做的只是把一个演讲,并会排名它会有多好,你可以做些什么来改善它!
我从这个项目中学到了什么?
我发现有一些因素可以帮助预测一个演讲是否会受欢迎,这些因素基于诸如提问、慢慢说、使用幽默和简洁等词语的使用。
我还了解到,使用工作中的副业项目也非常有趣,可以尝试和学习新的数据科学主题以及如何进行更好的演讲!
我也有机会在伦敦的两个不同场合展示这个项目。我已经在 2019 年 6 月 25 日的伦敦会议和 2019 年 9 月 11 日在伦敦举行的 EARL 2019 会议上介绍了它。这里有一些事件的照片
干杯,
爱德华多
原载于 2019 年 10 月 15 日http://www.speakthedata.com。
工作。旅行。大数据。重复
原文:https://towardsdatascience.com/work-travel-big-data-repeat-cbe410f2d2d8?source=collection_archive---------25-----------------------
了解大数据如何成为旅游业引擎的燃料
简介
我选择了人迹较少的一个,
这让一切都不同了。”—作者罗伯特·弗罗斯特
甚至没有人知道罗伯特·弗罗斯特的这些标志性的诗句会成为旅游业成功的秘诀。大数据将为旅游业带来翻天覆地的变化。
随着每个行业都在走大数据分析的道路,旅游行业是较少走这条路的行业之一。随着大数据的出现,它正在将旅游业带到各个地方。大数据将为你提供前所未有的旅行体验。它将在旅游业中不遗余力。
享受您的大数据世界之旅
让我们来一次短途旅行,看看大数据如何丰富您的旅行体验。
大数据是您完美的旅行伙伴
工作充实了你的口袋,旅行充实了你的灵魂,但还是有一些漏洞。大数据可以填补这些空白。旅行是为了探索不同的地方,而大数据是为了探索一系列很快将彻底改变旅游业的机会。大数据旨在确保所有沉迷于旅游的人获得无压力的旅行体验。
以下是大数据被证明对旅游业至关重要的几个领域
- 更好的客户体验
旅游业是与客户互动最多的行业。他们通过这些互动收集了大量的数据。这些数据是通过社交媒体平台、反馈、网站评论和服务使用数据收集的。这些数据有助于他们深入了解客户的问题和需求。使用这些数据,公司可以对他们目前提供的服务、即将过时的服务以及他们需要引入的最新服务做出精确的、数据驱动的决策。 - 价格政策 旅行者在计划旅行时考虑的最重要的部分是预算。为客户提供优化的价格解决方案是旅游公司建立忠诚客户群的全部需求。通过大数据分析获得的洞察将为公司提供竞争对手向其客户提供的价格和优惠,然后相应地设定价格。
该出大招了
- 实时协助 您的移动设备的位置数据可以为旅游企业提供一些宝贵的见解。一些旅游商业公司已经在利用这些实时数据为旅行者提供实时帮助和相关建议。
想象一下这样一种情况,智能手机中的旅行应用程序跟踪你的位置,并识别出你在一个受欢迎的旅游地点附近,因此在下一分钟它就开始向你发送附近酒店、餐馆等的特别优惠或交易。这可以帮助你省钱。此外,它还可以推荐一些附近值得一游的地方。我们现在有了自己的私人旅行助理。我们还需要什么?
大把花钱去旅游。Lol。
与大数据最古老、最好的伴侣相处融洽
希思罗机场
乘飞机旅行省时,但有时也令人伤脑筋。多重安检、车厢座位拥挤、行李丢失和转机延误——这在旅程的每一点都考验着你的耐心。但大数据分析可以缓解这种痛苦,因为它将彻底改变你的旅行体验。
希斯罗机场 在哈佛商学院客座副教授 Yael Grushka-Cockayne 和其他一些来自伦敦大学学院的研究人员的合作下,他们决定根除痛苦的转接航班这一主要问题。
他们面临的主要问题是他们的遗留系统无法有效通信。
希思罗机场的利益相关方计划升级机场现有的数据系统,目的是更好地利用其客户的数据来增强转机乘客的体验,这些乘客占每年通过希思罗机场的所有旅客的三分之一。
他们的目标是开发一个既能识别转机乘客又能准确预测他们转机时间的系统。只有从多个来源收集数据,然后进行实时分析,才有可能做到这一点。
就在现场试验开始两年后,他们观察到了一些惊人的结果。利用大数据分析后,客流假设的平均绝对误差下降了 20%以上。从那以后,希思罗机场的利益相关方一直追求和信任大数据分析,胜过其他任何东西。
在希思罗机场完成这个项目后,Grushka-Cockayne 和她的团队收到了世界上一些最大的机场代表的邀请,如巴黎、新加坡、洛杉矶,更多的计划在他们自己的设施中实施类似的系统。
熟悉新的天气预报员
尾注
ig Data 的目的是促进旅游业的发展,并使其达到更高的水平。通过大数据分析获得的洞察力正在帮助旅游企业改善客户的旅行体验。即将获得旅游行业的窗口席位。
如果你是科学家,如何用 Python 组织代码
原文:https://towardsdatascience.com/workflow-for-reportable-reusable-and-reproducible-computational-research-45d036c8a908?source=collection_archive---------2-----------------------
可报告、可重复使用和可再现的计算研究工作流程
如果你从事计算研究或数据科学,并且你没有计算机科学背景,你可能产生了惊人的科学知识,但是你写的代码并不完全符合学术标准。你可能需要一周的时间让你的脚本再次做同样的事情。即使你是一个经验丰富的程序员,你可能会发现很难同时做好开发人员和科学家的工作。
作为一名研究生,我自己也面临过这个挑战。虽然我参加了软件工程的课程,但我发现很难从交给我的研究问题中转移出来,去思考如何从我的代码中创建有用的工具。经过一些尝试和错误,我设计了一个方法来帮助我无缝地进行转换,现在我作为一名数据科学家在我的探索性工作中使用它。
在这篇文章中,我分享了我组织编码工作流的方式,给你一些提示和技巧,并向你展示我使用的工具堆栈。目标是使从实验到工具开发的过渡更加容易。
Jupyter 笔记本:数字实验室笔记本
为了让研究成为可重复的,你需要记录你正在做的所有事情。如果您只想尽可能快地进行实验并进行特别分析,这可能是一个负担。
我做实验用的工具是 Jupyter Notebook。交互式编程接口允许您即时检查您的代码做了什么,因此您可以一步一步地构建算法。此外,您可以使用 Markdown 单元格来写下您的想法和结论,以及代码。这使得记录和报告你所做的一切变得非常容易。
你可以在网上找到大量的 Jupyter 教程。我建议熟悉一下键盘快捷键(它们在编辑器的帮助菜单下有描述),因为它们会显著加快你的工作。
关于循环的实验
在数字实验中,循环实验变量非常简单。毕竟,计算机的能力来自于它们不断重复做事情的能力。
我在下面的代码中构建了正式的实验。
为了透明起见,我将当前实验的所有重要变量都放在文件开头的列表中。
这里要考虑的一件事是如何处理每次迭代的输出:你应该把它处理成一个可视化,计算一个度量还是存储它?应用和期望的报告形式决定了这种选择。
集中化和交叉引用
应该为每一个重要的实验创建一个笔记本文件,由你来决定这意味着什么。每当我使用不同的参数或新的做事方式重复一个实验时,我都会保存一个相关的标题和版本号。
这与版本控制不同,因为我保留了我工作的所有记录,而不仅仅是它的最新版本。而且,我把所有的实验放在同一个文件夹里,不管它们被分配到哪个项目。
Example of how to organize experiments in the same folder
虽然这会创建一大堆文件,但是通过按修改日期排序,您可以很容易地将相关的文件放在最上面。集中化通过简单的搜索就可以轻松找到特定的文件,而不是在你不记得逻辑的文件夹层次中穿行。
把东西放在一起的最大好处是你可以在笔记本内部和之间实现交叉引用。这可以通过 Markdown 中的 html 链接来实现。
若要创建对笔记本中某一节的引用,请在被引用部分之前的 Markdown 单元格中添加以下代码:
<a id='label_of_your_choice'></a><!--referenced section in file experiment00.ipynb-->
现在,在您希望显示引用链接的地方,编写以下内容之一:
[description](#label_of_your_choice) <!--to make link in the same notebook-->[description](experiment00.ipynb#label_of_your_choice) <!--to make link in another notebook-->
例如,[previous experiment] (experiment00.ipynb#label_of_your_choice)
产生链接:
Example of a cross reference to a previous experiment
现在,您可以一键直接跳转到旧实验中的引用部分。
报告应该只是你实验的最佳版本的总结和附带的评论。快速查找你的记录是你工作的可报告性的关键,如果交叉引用设置到位,这是一个点击笔记本的问题。
处理数据
有时您需要保存一些数据结果,用于报告、共享或在其他实验中使用。文件格式由您和具体情况决定。在这种情况下,我将数据保存在实验文件夹内的数据文件夹中,并为它们命名,以表明它们来自哪个实验以及该实验的版本号。
为了使事情易于处理,我在电子表格中记录日志,在那里我列出了我所有实验的数据输入和输出。
包装功能
您可能熟悉在脚本中编写函数,以使代码整洁,增强理解,最重要的是干(不要重复)。随着实验的发展,您的功能也在发展,在其中封装了越来越多的逻辑和其他功能。
如果你遵循了我的方法,你开始将你的实验分成多个笔记本文件,每个实验和它的版本一个。当你从一个实验带到另一个实验的(功能)包袱显著增长时,是时候开始考虑代码的可重用性了。如果您可以像处理其他 Python 库一样,将通过时间考验的函数顺利导入到您的代码中,这不是很好吗?
您应该简单地从在中保存函数开始。py 文件连同你的实验。你可以在你最喜欢的 IDE 中编辑这些文件(我用的是 VS 代码)。然后,您可以在文件名上使用导入语句,将所有这些功能放回您的实验中:
# if you save the experiment_with() function in the
# experiment_functions.py file in the same folder as
# your experiment, you can import it into your codefrom experiment_functions import experiment_with
默认隐藏复杂性
随着您的功能变得更加复杂和灵活,它们将需要大量的输入,这变得难以管理。幸运的是 Python 方便了设置函数参数的默认值。使用默认值可以大大加快实验过程,隐藏不必要的复杂性。这也有助于刚接触你的职能的人立即上手。****
有时您会遇到需要将默认值定义为其他参数的函数的情况。在这种情况下,我使用的策略是将默认值设置为 None** ,并立即在函数体中检查要设置的参数是否在调用时定义。如果不是,那么我相应地给它赋值。请参见下面的示例。**
面向对象编程的灵活性
当函数变得如此之大,以至于它们封装了整个算法,并且有许多参数需要优化时,函数的简单接口可能是不够的。在这种情况下,我更喜欢面向对象方法的灵活性。
通过将算法包装成对象,您可以通过将参数定义为类的属性来随时改变参数。您可以设置非常具体的配置,并根据需要对算法进行微小的调整。
类也可以用来构建特定于您的应用程序的数据结构并封装与它们相关的功能。使用面向对象的设计模式是一门完整的科学。
版本控制而不破坏可再现性
既然您的可重用函数位于与实验代码分离的模块中,保持事物的可处理性和可再现性可能会变得具有挑战性。您可能希望修改代码中可重用的部分,使它们及时变得更好。
这是再现性和可重用性发生冲突的时刻。如果你想用你的超级进化算法重现你两年前的实验,你可能会得到完全不同的结果。因此,您希望将您在实验中使用的模块的确切版本与您使用它们的笔记本文件保存在一起(除非您希望掩盖您过去做过的一些蠢事)。如果你为你所做的每一个修改保存一个编号的文件,并把它和实验记录在一起,事情会变得非常复杂。
进入版本控制。软件工程师通过版本控制和使用环境来保持事物的兼容性,从而使事物具有可复制性。完全相同的想法可以应用于我们的实验。您可以在改进函数和类时开始对它们进行版本控制,同时在实验文件中维护对相应版本的引用。
这是我的做法。我整理出那些。将文件复制到名为< project > _func 的项目文件夹中,在其中我建立了存储库并用 git 启动版本控制。如果你之前没用过 git,继续找 git 教程,然后再回来。****
每当我创建一个新的实验文件时,我都确保我已经提交了我正在使用的代码版本,并在实验文件顶部的一个单元格中写下以下几行:
%%bash
cd <project>_func # move inside the directory where you have the
# repository you need
git checkout <git commit id> # restore the version of the code
# you will use
然后在实验中,我根据需要导入我的函数。例如,假设我最近搬到了法国,现在我用法语写所有的报告。导入并运行该功能的最新版本
from magic_func.magic import do_some_magicdo_some_magic()
印刷品:
Salut Le Monde!
问题是,我有一个生成英文报告的旧实验脚本,我想重新运行它。幸运的是,我在实验笔记本的顶部引用了提交 id,如前面所示:
%%bash
cd magic_func
git checkout cff052f7c36bb09ccc101d9ce3652dce87f2acbc
在这个上下文中,上面的相同代码的输出是:
Hello World!
瞧啊。版本控制和编写良好的记录的魔力。
Python 包与世界共享
最终,你会想要打包。将文件复制到适当的 Python 包中。然后,您将能够与其他人共享它们,并将它们安装在您在实验笔记本中使用的 Ipython 内核的环境中。
可以跟着官方的 Python 打包指南学习如何打包代码和这个教程上传到 PyPi 上。要在 Jupyter Notebook 中使用您的软件包的特定版本,我建议您将其安装在 conda 环境中。然后,如果您遵循 nb_conda_kernels 扩展的安装说明,您就可以在那个环境中运行 Jupyter 内核。
从实验到单元测试
当你向你的包中添加功能时,你可以采用测试驱动的开发哲学。它指出,在编写单元测试代码之前,应该先编写单元测试。通过这种方式,你可以使你想从你的包中实现的任务具体化。
你可能已经在实验文件中摆弄过你的模块了。你可以在你的笔记本中设计测试,然后将它们的代码粘贴到单元测试的正式结构中。对于我的包,我使用 pytest 框架。
当你达到这一点时,你就不再只是一个实验主义者了。你也是一名开发者,你需要分享、维护和改进你创造的工具。祝编码愉快!
机器学习项目的工作流程
原文:https://towardsdatascience.com/workflow-of-a-machine-learning-project-ec1dba419b94?source=collection_archive---------1-----------------------
介绍
在这篇博客中,我们将讨论机器学习项目的工作流程,这包括从头开始构建合适的机器学习项目所需的所有步骤。
我们还将讨论数据预处理、数据清洗、特征探索和特征工程,并展示其对机器学习模型性能的影响。我们还将介绍一些有助于提高模型性能的预建模步骤。
完成任务所需的 Python 库:
1。Numpy
2。熊猫
3。Sci-kit Learn
4。Matplotlib
Overview of the Workflow of ML
了解机器学习工作流程
我们可以将机器学习工作流程定义为 3 个阶段。
- 收集数据
- 数据预处理
- 研究最适合该数据类型的模型
- 训练和测试模型
- 估价
好的,但是首先让我们从基础开始
什么是机器学习模型?
机器学习模型不过是一段代码;工程师或数据科学家通过数据训练让它变得聪明。因此,如果你给模型垃圾,你将得到垃圾作为回报,即训练好的模型将提供错误或错误的预测。
1.收集数据
收集数据的过程取决于我们想要做的项目的类型,如果我们想要做一个使用实时数据的 ML 项目,那么我们可以建立一个使用不同传感器数据的物联网系统。数据集可以从各种源收集,例如文件、数据库、传感器和许多其他这样的源,但是所收集的数据不能直接用于执行分析过程,因为可能有许多丢失的数据、非常大的值、无组织的文本数据或有噪声的数据。因此,要解决这个问题,需要做好数据准备。
我们也可以使用一些互联网上的免费数据集。 Kaggle 和 UCI 机器学习库 是制作机器学习模型使用最多的库。Kaggle 是访问量最大的网站之一,用于练习机器学习算法,他们还举办比赛,人们可以参加比赛,测试他们的机器学习知识。
2.数据预处理
数据预处理是机器学习中最重要的步骤之一。这是最重要的一步,有助于更准确地建立机器学习模型。在机器学习中,有一个 80/20 法则。每个数据科学家都应该花 80%的时间进行数据预处理,20%的时间实际执行分析。
什么是数据预处理?
数据预处理是清理原始数据的过程,即数据是在现实世界中收集的,并被转换为干净的数据集。换句话说,无论何时从不同来源收集数据,都是以原始格式收集的,这些数据对于分析是不可行的。因此,执行某些步骤将数据转换成一个小的干净数据集,这部分过程称为数据预处理。
我们为什么需要它?
众所周知,数据预处理是将原始数据清洗成干净数据的过程,这样可以用来训练模型。因此,我们肯定需要数据预处理,以从机器学习和深度学习项目中的应用模型中获得良好的结果。
大多数真实世界的数据是杂乱的,其中一些类型的数据是:
1.缺失数据:当缺失数据不是连续创建的,或者由于应用程序(IOT 系统)中的技术问题,可以找到缺失数据。
2.噪声数据:这种类型的数据也称为异常值,这可能是由于收集数据时的人为错误(人为手动收集数据)或设备的某些技术问题造成的。
3.不一致的数据:这种类型的数据可能是由于人为错误(名称或值的错误)或数据重复而收集的。
三种数据类型
1.数字,如收入、年龄
2.分类,如性别、国籍
3.序数,例如低/中/高
如何进行数据预处理?
这些是可用于转换原始数据的一些基本预处理技术。
1.数据的转换:我们知道机器学习模型只能处理数字特征,因此分类和序数数据必须以某种方式转换成数字特征。
2.忽略缺失值:每当我们在数据集中遇到缺失数据时,我们可以根据需要删除该行或该列数据。众所周知,这种方法很有效,但是如果数据集中有大量缺失值,就不应该执行这种方法。
3.填充缺失值:每当我们在数据集中遇到缺失数据时,我们可以手动填充缺失数据,通常使用平均值、中值或最高频率值。
4.机器学习:如果我们有一些缺失的数据,那么我们可以通过使用现有的数据来预测哪些数据应该出现在空的位置。
5.异常值检测:我们的数据集中可能存在一些错误数据,这些数据与数据集中的其他观察值有很大差异。【例:人的体重= 800 斤;由于打错了额外的 0]
3。研究最适合数据类型的模型
我们的主要目标是使用预处理的数据,尽可能训练出性能最佳的模型。
监督学习:
在监督学习中,人工智能系统提供了带标签的数据,这意味着每个数据都标记了正确的标签。
监督学习分为另外两类,即“分类和“回归”。
分类:
分类问题是当目标变量是分类的(即输出可以分类——属于 A 类或 B 类或其他)。
一个分类问题是当输出变量是一个类别时,例如“红色”或“蓝色”,“疾病”或“无疾病”或“垃圾邮件”或“非垃圾邮件”。
Classification | GIF: www.cs.toronto.edu
如上图所示,我们在图上绘制了两个类别,即红色和蓝色,分别表示为‘setosa flower’和‘versicolor flower’,我们可以将 X 轴想象为‘萼片宽度’,将 Y 轴想象为‘萼片长度’,因此我们尝试创建最佳拟合线,将两类花分开。
这些是一些最常用的分类算法。
- K-最近邻
- 朴素贝叶斯
- 决策树/随机森林
- 支持向量机
- 逻辑回归
回归:
而回归问题是当目标变量连续(即输出为数值)时。
Regression | GIF: techburst.io
如上图所示,我们可以想象图中的 X 轴是“考试成绩”,Y 轴代表“智商”。因此,我们试图在给定的图表中创建最佳拟合线,这样我们就可以使用这条线来预测给定数据中不存在的任何近似智商。
这些是一些最常用的回归算法。
- 线性回归
- 支持向量回归
- 决策树/随机森林
- 高斯渐进回归
- 集成方法
无监督学习:
在无监督学习中,人工智能系统呈现的是未标记、未分类的数据,系统的算法在没有事先训练的情况下对数据进行操作。输出取决于编码算法。让系统接受无监督学习是测试人工智能的一种方式。
无监督学习分为另外两类,即“聚类和“关联”。
聚类:
一组输入将被分成组。与分类不同的是,这些组事先并不知道,因此这通常是一项无人监督的任务。
Clustering
用于聚类的方法有:
- 高斯混合
- K-均值聚类
- 助推
- 层次聚类
- K 均值聚类
- 谱聚类
类别下的模型概述:
Overview of models
4.根据数据训练和测试模型
为了训练模型,我们最初将模型分成 3 个部分,即'训练数据'、验证数据和'测试数据。
您使用'训练数据集训练分类器,使用'验证集调整参数,然后在看不见的'测试数据集上测试您的分类器的性能。要注意的重要一点是,在训练分类器期间,只有训练和/或验证集是可用的。在训练分类器期间,不得使用测试数据集。测试集仅在测试分类器期间可用。
训练集:训练集是计算机学习如何处理信息的材料。机器学习使用算法来执行训练部分。用于学习的一组数据,即拟合分类器的参数。
验证集:交叉验证主要用在应用机器学习中,在看不见的数据上评估机器学习模型的技能。使用来自训练数据的一组看不见的数据来调整分类器的参数。
测试集:一组不可见的数据,仅用于评估完全指定的分类器的性能。
一旦数据被分成 3 个给定的部分,我们就可以开始训练过程。
在数据集中,训练集用于建立模型,而测试(或验证)集用于验证所建立的模型。训练集中的数据点从测试(验证)集中排除。通常一个数据集在每次迭代中分为训练集、验证集(有人用‘测试集’代替),或者在每次迭代中分为训练集、验证集、测试集。
该模型使用我们在第 3 步/第 3 点中选择的任何一个模型。一旦模型被训练,我们可以使用相同的训练模型来使用测试数据(即,看不见的数据)进行预测。一旦这样做了,我们就可以开发一个混淆矩阵,它告诉我们我们的模型训练得有多好。一个混淆矩阵有 4 个参数,分别是'真阳性',,【真阴性',,【假阳性】,假阴性'。我们更喜欢在真阴性和真阳性中获得更多的值,以获得更准确的模型。混淆矩阵的大小完全取决于类别的数量。
- 真阳性:这些是我们预测为真且预测输出正确的情况。
- 真否定:我们预测错误,预测输出正确。
- 误报:我们预测为真,但实际预测输出为假。
- 假阴性:我们预测的是假的,但实际预测的输出是真的。
我们还可以使用混淆矩阵来确定模型的准确性。
准确度=(真阳性+真阴性)/(类别总数)
即对于上面的例子:
准确度= (100 + 50) / 165 = 0.9090(准确度为 90.9%)
5.估价
模型评估是模型开发过程不可或缺的一部分。它有助于找到代表我们的数据的最佳模型,以及所选模型在未来的工作情况。
为了改进模型,我们可以调整模型的超参数,并尝试提高准确性,同时查看混淆矩阵,尝试增加真阳性和真阴性的数量。
结论
在这篇博客中,我们讨论了机器学习项目的工作流程,并给了我们一个应该如何解决这个问题的基本想法。
一个机器学习项目的工作流程实现:https://github.com/NotAyushXD/Titanic-dataset
ML 管道的工作流工具
原文:https://towardsdatascience.com/workflow-tools-for-model-pipelines-45030a93e9e0?source=collection_archive---------13-----------------------
Source: https://www.flickr.com/photos/rauckhaus/8638556209
第 5 章“生产中的数据科学”节选
Airflow 正在成为创作数据工程和模型管道工作流程的行业标准。我的书的这一章探讨了将一个运行在单个 EC2 实例上的简单管道带到一个负责调度任务的完全管理的 Kubernetes 生态系统的过程。这篇文章省略了 GKE 和 Cloud Composer 的全面管理解决方案的部分。
[## 生产中的数据科学
从初创公司到数万亿美元的公司,数据科学在帮助组织最大化…
leanpub.com](https://leanpub.com/ProductionDataScience)
模型管道通常是提供数据源(如湖泊和仓库)和数据存储(如应用程序数据库)的更广泛的数据平台的一部分。在构建管道时,能够安排任务运行、确保管道的所有依赖项都已完成,并在需要时回填历史数据是非常有用的。虽然可以手动执行这些类型的任务,但是已经开发了各种工具来改进数据科学工作流的管理。
在本章中,我们将探索执行一系列任务的批处理模型管道,以便为倾向模型训练和存储结果。这是一个与我们到目前为止所探索的部署不同的任务类型,我们所探索的部署侧重于将实时模型预测作为 web 端点。在批处理过程中,您执行一组存储模型结果的操作,这些结果稍后将由不同的应用程序提供。例如,批处理模型管道可以预测游戏中的哪些用户可能会流失,游戏服务器为开始会话的每个用户获取预测并提供个性化报价。
在为生产系统构建批处理模型管道时,确保管道问题得到快速解决是非常重要的。例如,如果模型管道由于数据库的上游故障而无法获取一组用户的最新数据,那么拥有一个系统是很有用的,该系统可以向拥有管道的团队发送警报,并且可以重新运行部分模型管道,以便解决先决数据或模型输出的任何问题。
工作流工具为管理模型管道中的这类问题提供了解决方案。使用工作流工具,您可以指定需要完成的操作,确定操作之间的依赖关系,然后安排工具执行的操作。工作流工具负责运行任务、提供资源和监控任务的状态。有许多用于构建工作流的开源工具,包括 AirFlow、Luigi、MLflow 和 Pentaho Kettle。我们将重点关注气流,因为它正在被各公司和云平台广泛采用,并且还提供完全受管理的气流版本。
在这一章中,我们将构建一个作为 Docker 容器运行的批处理模型管道。接下来,我们将使用 cron 安排任务在 EC2 实例上运行,然后使用 Kubernetes 探索 cron 的托管版本。在第三部分中,我们将使用 Airflow 来定义要执行的操作的图表,以便运行我们的模型管道,并探索 Airflow 的云产品。
5.1 SKLearn 工作流程
批处理模型管道的常见工作流是从数据湖或数据仓库中提取数据,根据历史用户行为训练模型,针对更近的数据预测未来用户行为,然后将结果保存到数据仓库或应用程序数据库。在游戏行业,这是一个我见过的用于建立购买可能性和流失可能性模型的工作流,其中游戏服务器使用这些预测根据模型预测向用户提供不同的待遇。通常像 sklearn 这样的库用于开发模型,PySpark 这样的语言用于扩展到完整的玩家基础。
对于模型管道来说,在管道可以在最近的数据上运行之前,通常需要在数据平台中运行其他 ETL。例如,数据平台中可能有一个上游步骤,将 json 字符串翻译成模式化的事件,用作模型的输入。在这种情况下,可能有必要在 json 转换过程出现问题的那天重新运行管道。在本节中,我们将通过使用静态输入数据源来避免这种复杂性,但是我们将探索的工具提供了处理这些问题所需的功能。
据我所知,在游戏行业部署的批处理模型管道通常有两种类型:
- 持久:一个单独的训练工作流用于训练模型,而不是用于建立预测的模型。模型在训练运行之间保持不变,并加载到服务工作流中。
- 瞬态:相同的工作流用于训练和服务预测,并且不是将模型保存为文件,而是为每次运行重建模型。
在这一节中,我们将构建一个瞬态批处理管道,每次运行都会重新训练一个新的模型。如果训练过程是重量级的,这种方法通常会导致使用更多的计算资源,但它有助于避免模型漂移的问题,我们将在第 11 章中讨论。我们将创建一个执行以下步骤的管道:
- 从 GitHub 获取数据集
- 训练逻辑回归模型
- 应用回归模型
- 将结果保存到 BigQuery
管道将作为执行所有这些步骤的单个 Python 脚本来执行。对于您希望使用跨多个任务的步骤的中间输出的情况,将管道分解为通过工作流工具(如 Airflow)集成的多个流程是很有用的。
我们将通过首先编写一个在 EC2 实例上运行的 Python 脚本来构建这个脚本,然后将脚本进行 Dockerize,以便我们可以在工作流中使用该容器。首先,我们需要安装一个库,用于将 Pandas 数据框写入 BigQuery:
pip install --user pandas_gbq
接下来,我们将创建一个名为pipeline.py
的文件,它执行上面确定的四个管道步骤..下面显示的脚本通过加载必要的库来执行这些步骤,将 CSV 文件从 GitHub 提取到 Pandas 数据框中,将数据框拆分为训练和测试组以模拟历史和最近的用户,使用训练数据集构建逻辑回归模型,为测试数据集创建预测,并将结果数据框保存到 BigQuery。
import pandas as pd
import numpy as np
from google.oauth2 import service_account
from sklearn.linear_model import LogisticRegression
from datetime import datetime
import pandas_gbq ***# fetch the data set and add IDs*** gamesDF = pd.read_csv("https://github.com/bgweber/Twitch/raw/
master/Recommendations/games-expand.csv")
gamesDF['User_ID'] = gamesDF.index
gamesDF['New_User'] = np.floor(np.random.randint(0, 10,
gamesDF.shape[0])/9)***# train and test groups*** train = gamesDF[gamesDF['New_User'] == 0]
x_train = train.iloc[:,0:10]
y_train = train['label']
test = gameDF[gamesDF['New_User'] == 1]
x_test = test.iloc[:,0:10]***# build a model*** model = LogisticRegression()
model.fit(x_train, y_train)
y_pred = model.predict_proba(x_test)[:, 1]***# build a predictions data frame*** resultDF = pd.DataFrame({'User_ID':test['User_ID'], 'Pred':y_pred})
resultDF['time'] = str(datetime. now())***# save predictions to BigQuery*** table_id = "dsp_demo.user_scores"
project_id = "gameanalytics-123"
credentials = service_account.Credentials.
from_service_account_file('dsdemo.json')
pandas_gbq.to_gbq(resultDF, table_id, project_id=project_id,
if_exists = 'replace', credentials=credentials)
为了模拟真实世界的数据集,脚本为每条记录分配一个User_ID
属性,它代表一个惟一的 ID 来跟踪系统中的不同用户。该脚本还通过分配一个New_User
属性将用户分为历史组和最近组。为每个最近的用户构建预测后,我们创建一个包含用户 ID、模型预测和时间戳的结果数据框。为了确定管道是否成功完成,对预测应用时间戳是很有用的。若要测试模型管道,请在命令行上运行以下语句:
export GOOGLE_APPLICATION_CREDENTIALS=
**/**home/ec2-user/dsdemo.json
python3 pipeline.py
如果成功,该脚本应该在 BigQuery 上创建一个名为dsp_demo
的新数据集,创建一个名为user_users
的新表,并用用户预测填充该表。要测试 BigQuery 中是否实际填充了数据,请在 Jupyter 中运行以下命令:
from google.cloud import bigquery
client = **bigquery.Client**()sql = "select * from dsp_demo.user_scores"
**client.query**(sql)**.to_dataframe**()**.head**()
这个脚本将设置一个连接到 BigQuery 的客户机,然后显示提交给 BigQuery 的查询结果集。您还可以浏览到 BigQuery web UI 来检查管道的结果,如图 5.1 所示。我们现在有一个脚本,可以获取数据,应用机器学习模型,并将结果保存为单个过程。
FIGURE 5.1: Querying the uploaded predictions in BigQuery.
使用许多工作流工具,您可以直接运行 Python 代码或 bash 脚本,但是最好为执行脚本建立隔离的环境,以避免不同库和运行时的依赖冲突。幸运的是,我们在第 4 章中探索了一个工具,可以将 Docker 与工作流工具结合使用。将 Python 脚本包装在 Docker for workflow tools 中很有用,因为您可以添加可能没有安装在负责调度的系统上的库,可以避免 Python 版本冲突的问题,并且容器正在成为工作流工具中定义任务的常用方式。
为了将我们的工作流容器化,我们需要定义一个 Dockerfile,如下所示。因为我们正在从头构建一个新的 Python 环境,所以我们需要安装 Pandas、sklearn 和 BigQuery 库。我们还需要将 EC2 实例中的凭证复制到容器中,这样我们就可以运行export
命令向 GCP 进行身份验证。这适用于短期部署,但是对于长期运行的容器,最好在实例化的容器中运行导出,而不是将静态凭证复制到映像中。Dockerfile 列出了运行脚本所需的 Python 库,复制执行所需的本地文件,导出凭证,并指定要运行的脚本。
FROM ubuntu:latest
MAINTAINER Ben Weber RUN apt-get update \
&& apt-get install -y python3-pip python3-dev \
&& cd /usr/local/bin \
&& ln -s /usr/bin/python3 python \
&& pip3 install pandas \
&& pip3 install sklearn \
&& pip3 install pandas_gbq
COPY pipeline.py pipeline.py
COPY /home/ec2-user/dsdemo.json dsdemo.jsonRUN export GOOGLE_APPLICATION_CREDENTIALS=**/**dsdemo.jsonENTRYPOINT ["python3","pipeline.py"]
在将该脚本部署到生产环境之前,我们需要从该脚本构建一个映像,并测试一个示例运行。下面的命令显示了如何从 Docker 文件构建映像,列出 Docker 映像,并运行模型管道映像的实例。
sudo docker image build -t "sklearn_pipeline" .
sudo docker images
sudo docker run sklearn_pipeline
运行最后一个命令后,容器化管道应该更新 BigQuery 中的模型预测。我们现在有了一个模型管道,可以作为单个 bash 命令运行,我们现在需要安排它以特定的频率运行。出于测试目的,我们将每分钟运行一次脚本,但实际上模型通常每小时、每天或每周执行一次。
5.2 Cron
模型管道的一个常见需求是以固定的频率运行任务,例如每天或每小时。Cron 是一个为运行 Linux 操作系统的机器提供调度功能的实用程序。您可以使用 crontab 实用程序设置一个计划任务,并分配一个 cron 表达式来定义运行该命令的频率。Cron 作业直接在使用 cron 的机器上运行,并且可以利用安装在系统上的运行时和库。
在生产级系统中使用 cron 有许多挑战,但是这是开始调度少量任务的一个很好的方法,并且学习许多调度系统中使用的 cron 表达式语法也很有好处。cron 实用程序的主要问题是它运行在一台机器上,不能与版本控制等工具进行本地集成。如果您的机器停机,那么您需要在一台新机器上重新创建您的环境并更新您的 cron 表。
cron 表达式定义了运行命令的频率。它是一个由 5 个数字组成的序列,定义了不同时间粒度下的执行时间,并且可以包含通配符,以便总是在特定时间段内运行。下面的代码片段显示了一些示例表达式:
***# run every minute*** * * * * * ***# Run at 10am UTC everyday*** 0 10 * * * ***# Run at 04:15 on Saturday*** 15 4 * * 6
在开始使用 cron 时,最好使用工具来验证您的表达式。Cron 表达式用于 Airflow 和许多其他调度系统。
我们可以使用 cron 来安排我们的模型管道以固定的频率运行。要计划运行命令,请在控制台上运行以下命令:
crontab -e
该命令将打开 cron 表格文件,在vi
中进行编辑。要安排管道每分钟运行一次,请将以下命令添加到文件中并保存。
***# run every minute*** * * * * * sudo docker run sklearn_pipeline
退出编辑器后,cron 表将使用要运行的新命令进行更新。cron 语句的第二部分是要运行的命令。在定义要运行的命令时,包含完整的文件路径非常有用。使用 Docker,我们只需要定义要运行的映像。要检查脚本是否真的在执行,浏览到 BigQuery UI 并检查user_scores
模型输出表上的time
列。
我们现在有了一个实用程序,可以定期调度我们的模型管道。然而,如果机器停机,那么我们的管道将无法执行。为了处理这种情况,最好探索具有 cron 调度功能的云产品。
5.3 工作流程工具
Cron 对于简单的管道是有用的,但是当任务依赖于其他可能失败的任务时,就会遇到挑战。为了帮助解决这个问题,任务有依赖关系,只有部分管道需要重新运行,我们可以利用工作流工具。Apache Airflow 是目前最流行的工具,但也有其他开源项目提供类似的功能,包括 Luigi 和 MLflow。
在一些情况下,工作流工具比直接使用 cron 更有优势:
- 依赖关系:工作流工具定义了操作的图形,这使得依赖关系显式化。
- Backfills: 可能有必要在一系列不同的日期对旧数据运行 ETL。
- 版本化:大多数工作流工具都集成了版本控制系统来管理图表。
- 告警:这些工具可以在出现故障时发出邮件或者生成页面任务告警。
工作流工具在不同团队安排任务的环境中特别有用。例如,许多游戏公司都有数据科学家来安排模型管道,这些管道依赖于由单独的工程团队安排的 ETL。
在本节中,我们将安排任务使用托管的 Airflow 运行 EC2 实例,然后在 GCP 上探索一个完全托管的 Airflow 版本。
阿帕奇气流
Airflow 是一款开源工作流工具,最初由 Airbnb 开发,于 2015 年公开发布。它有助于解决许多公司面临的一个挑战,即调度具有许多相关性的任务。该工具的核心概念之一是定义要执行的任务以及这些任务之间关系的图表。
在 Airflow 中,一个图被称为 DAG,它是有向无环图的缩写。DAG 是一组要执行的任务,其中每个任务有零个或多个上游依赖项。其中一个限制是不允许循环,两个任务在上游相互依赖。
Dag 是使用 Python 代码设置的,这是与 Pentaho Kettle 等其他工作流工具的区别之一,Pentaho Kettle 以 GUI 为中心。气流方法被称为“代码配置”,因为 Python 脚本定义了要在工作流图中执行的操作。使用代码而不是 GUI 来配置工作流是有用的,因为这使得与版本控制工具(如 GitHub)的集成变得更加容易。
要开始使用 Airflow,我们需要安装库,初始化服务,并运行调度程序。要执行这些步骤,请在 EC2 实例或您的本地计算机上运行以下命令:
export AIRFLOW_HOME=**~/**airflow
pip install --user apache-airflow
airflow initdb
airflow scheduler
Airflow 还提供了一个 web 前端,用于管理已调度的 Dag。要启动此服务,请在同一台计算机上的新终端中运行以下命令。
airflow webserver -p 8080
这个命令告诉 Airflow 在端口 8080 上启动 web 服务。您可以在本机的这个端口打开网页浏览器,查看气流的网页前端,如图 5.3 所示。
FIGURE 5.3: The Airflow web app running on an EC2 instance.
Airflow 预装了许多示例 Dag。对于我们的模型管道,我们将创建一个新的 DAG,然后通知 Airflow 更新。我们将使用以下 DAG 定义创建一个名为sklearn.py
的文件:
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedeltadefault_args = {
'owner': 'Airflow',
'depends_on_past': False,
'email': 'bgweber@gmail.com',
'start_date': **datetime**(2019, 11, 1),
'email_on_failure': True,
}dag = **DAG**('games', default_args=default_args,
schedule_interval="* * * * *")t1 = **BashOperator**(
task_id='sklearn_pipeline',
bash_command='sudo docker run sklearn_pipeline',
dag=dag)
这个 Python 脚本中有几个步骤需要调用。该脚本使用一个Bash
操作符来定义要执行的动作。Bash 操作符被定义为脚本中的最后一步,它指定要执行的命令。DAG 用许多定义工作流设置的输入参数来实例化,例如当任务失败时向谁发送电子邮件。cron 表达式被传递给 DAG 对象来定义任务的调度,DAG 对象被传递给 Bash 操作符来将任务与这个操作图相关联。
在将 DAG 添加到 airflow 之前,检查代码中的语法错误是很有用的。我们可以从终端运行以下命令来检查 DAG 的问题:
python3 sklearn.py
此命令不会运行 DAG,但会标记脚本中存在的任何语法错误。要使用新的 DAG 文件更新 Airflow,请运行以下命令:
airflow list_dags-------------------------------------------------------------------
DAGS
-------------------------------------------------------------------
games
此命令会将 DAG 添加到 Airflow 中的工作流程列表。要查看 Dag 列表,请导航到 Airflow web 服务器,如图 5.4 所示。web 服务器将显示 DAG 的时间表,并提供工作流过去运行的历史记录。要检查 DAG 是否真的在工作,请浏览 BigQuery UI 并检查新的模型输出。
FIGURE 5.4: The sklearn DAG scheduled on Airflow.
我们现在已经启动并运行了一个气流服务,我们可以用它来监控工作流的执行。这种设置使我们能够跟踪工作流的执行情况,填补数据集中的任何空白,并为关键工作流启用警报。
Airflow 支持各种操作,许多公司编写了供内部使用的自定义操作符。在我们的第一个 DAG 中,我们使用 Bash 操作符来定义要执行的任务,但是其他选项也可用于运行 Docker 映像,包括 Docker 操作符。下面的代码片段展示了如何将 DAG 改为使用 Docker 操作符而不是 Bash 操作符。
from airflow.operators.docker_operator import DockerOperatort1 = **DockerOperator**(
task_id='sklearn_pipeline',
image='sklearn_pipeline',
dag=dag)
我们定义的 DAG 没有任何依赖关系,因为容器执行模型管道中的所有步骤。如果我们有一个依赖项,比如在运行模型管道之前运行一个sklearn_etl
容器,我们可以使用如下所示的set_upstrean
命令。这个配置设置了两个任务,其中管道任务将在 etl 任务完成后执行。
t1 = **BashOperator**(
task_id='sklearn_etl',
bash_command='sudo docker run sklearn_etl',
dag=dag)t2 = **BashOperator**(
task_id='sklearn_pipeline',
bash_command='sudo docker run sklearn_pipeline',
dag=dag)**t2.set_upstream**(t1)
Airflow 提供了一组丰富的功能,我们只是触及了该工具所提供功能的皮毛。虽然我们已经能够通过托管和托管云产品来安排模型管道,但通过气流来安排任务对于改进监控和版本控制非常有用。随着时间的推移,工作流工具的前景将会改变,但是许多气流的概念将会转化为这些新的工具。
5.4 结论
在本章中,我们探索了一个批处理模型管道,用于将机器学习模型应用于一组用户,并将结果存储到 BigQuery。为了使管道可移植,以便我们可以在不同的环境中执行它,我们创建了一个 Docker 映像来定义管道所需的库和凭证。然后,我们使用批处理命令、cron 和 Airflow 在 EC2 实例上运行管道。我们还使用 GKE 和 Cloud Composer 通过 Kubernetes 运行容器。
工作流工具的设置可能很繁琐,尤其是在安装集群部署时,但是它们提供了许多优于手动方法的优点。其中一个主要优势是能够将 DAG 配置作为代码进行处理,从而支持工作流的代码审查和版本控制。获得配置为代码的经验是很有用的,因为这是对另一个概念“基础架构为代码”的介绍,我们将在第 10 章中探讨。
本·韦伯是 Zynga 的一名杰出的数据科学家。我们正在招聘!
从远程机器上处理 Databricks 集群
原文:https://towardsdatascience.com/working-on-a-databricks-cluster-from-a-remote-machine-c09d5a468ae3?source=collection_archive---------19-----------------------
简单的方法。
Databricks.com
想象一下下面的场景,您有一台专用的机器,并且希望在 Databricks 集群上远程运行您的作业。如果您在 Databricks 平台上工作,通常在 Databricks 集群上运行作业是相当容易的,因为集群已经配置好了。但是,从远程机器上运行作业需要一些设置。在这篇文章中,我将解释如何成功地远程运行集群作业。
就可用性而言,配置很简单,以前我必须在我的机器上安装 PySpark,这需要在 shell 中进行大量的修改。此外,这并没有给我在 Databricks 集群上运行作业的能力。
以下是使用 Databricks 文档的总结。它几乎被埋没了,没有立即在谷歌上出现。所以,希望这个帖子有所帮助。
安装和配置
1.pip 卸载 pyspark
2。pip 安装-用户数据块-cli
3。pip install-user-U data bricks-connect = = 5.5。*
确保你安装的版本和你的集群一样,对我来说,是 5.5。您可以在集群页面上查看它们,查看运行时列,如图 1 所示。
Figure 1: Clusters page, Logs monitoring is using runtime version 3.1.
注意:如果您的运行时是如图 3 所示的用户 toke。
3.集群 ID:您创建的集群的 ID。您可以从 URL 获取集群 ID。这里,橙色框 中的集群 ID 是 ,如图 4 所示。
Figure 2: special configuration for runtime<5.3.
- 安装
配置data bricks-connect客户端将非常容易,您需要接受协议,输入 url(包括 https://),,)输入令牌,输入集群 ID 并按两次 enter 键以接受 Org ID 和端口问题的默认值。
Figure 3: User Token Creation, Databricks Documentation.
你接受上述协议吗?[y/N] y
设置新的配置值(将输入留空以接受默认值):
数据块主机[无当前值,必须以 https://]开头:<数据块-url >
数据块令牌[无当前值]: <数据块-令牌>
集群 id(例如 0221-009411-jello 819)[无当前值]: <集群 id >
组织 IDo = URL 中的 orgId)[0]:
Port【15001】:
Figure 4: Cluster ID
下一步是测试连接客户机。
数据块-连接配置
对我来说,这导致了一个错误:
/home/username/。local/lib/python 3.5/site-packages/pyspark/bin/spark-class:第 71 行:/usr/lib/java/bin/java:没有这样的文件或目录
我通过添加安装 java 8 并在~/中添加下面一行来解决这个问题。bashrc
sudo 安装 openjdk-8-jdk
导出 JAVA_HOME=/usr/
然后:
来源~/。bashrc
测试
接下来,您需要运行以下命令:
数据块连接测试
如果一切工作正常,它将参与集群,在启动它并进行几次测试后,您应该准备好从您的机器向您的集群发送作业。
密码
从 pyspark.sql 导入 spark session
spark = spark session . builder . getor create()
从 IPython.core.magic 导入 line_magic,line_cell_magic,magics_class
@ Magics _ class
class databrickconnectmagics(Magics):
@ line _ cell _ magic
def SQL(self,Line,cell = None):
if cell and Line:
raise value error(" Line 必须为空才能进行单元格魔术",Line)
try:
from autovizwidget . widget . utils import display _ data frame
import error:
print("请运行pip install autovizwidget
以启用可视化小部件。")
display _ data frame = lambda x:x
返回 display _ data frame(self . get _ spark()。sql(单元格或行)。toPandas())def get _ spark(self):
user _ ns = get _ ipython()。user_ns
如果 user_ns 中的" spark ":
返回 user_ns["spark"]
else:
from pyspark . SQL 导入 spark session
user _ ns[" spark "]= spark session . builder . getorcreate()
返回 user _ ns[" spark "]IP = get _ ipython()
IP . register _ magics(databrickconnectmagics)从 pyspark.sql 导入 spark session
spark = spark session
。构建器
。getOrCreate()print(" Testing simple count ")
Spark 代码将在 Databricks 集群上执行。
打印(spark.range(1000)。count())
输出应该是:
测试简单计数
1000非常感谢你阅读这篇文章,希望它能帮助你设置你的系统而不会有太多的问题。
参考
数据渴求
数据库连接
数据库认证
- 所以
- 安装 java 8
- 找到 java 主页
- Ori Cohen 博士拥有计算机科学博士学位,主要研究机器学习。他是 TLV 新遗迹公司的首席数据科学家,从事 AIOps 领域的机器和深度学习研究。
- install java 8
- Find java home
Dr. Ori Cohen has a Ph.D. in Computer Science with a focus on machine-learning. He is a lead data-scientist at New Relic TLV, doing machine and deep learning research in the field of AIOps.
Django MTV 架构的工作结构
原文:https://towardsdatascience.com/working-structure-of-django-mtv-architecture-a741c8c64082?source=collection_archive---------9-----------------------
MTV 架构组件(模型、模板和视图)
这是 MVC 模式的一个变种,正如你在首字母缩略词中看到的,Template 关键字代替了 Controller。但是,模板并不完全起控制器的作用,并且具有一些与控制器不同的属性。
模型的定义仍然保持不变,即模型包含项目的逻辑文件结构,是数据库和视图之间的中间件&数据处理器。该模型定义了来自视图的数据格式如何存储在数据库中,反之亦然,即从数据库中检索的信息以可显示的格式传输到视图。
MTV 架构中的视图可能看起来像控制器,但它不是。这个 MTV 架构中的视图通过模型格式化数据。反过来,它与数据库通信,并将数据传输到模板进行查看。
如果 everything View 首先实现的是什么模板?
嗯,模板让前端开发人员的生活变得简单,这是肯定的。它还提供了比传统 MVC 架构更快的开发速度。
那么,它是怎么做到的呢?
模板的主要目标是保存浏览器呈现的所有内容。模型的数据来自服务器的不同部分,当用户与网站交互时,这些数据被集成在一起。这里,Django 中的模板层更类似于 MVC 模式中的视图层。这一层更加集中,有了 Django 框架,它为前端开发者提供了比 MVC 架构更多的可扩展性。
MTV 架构的运作
现在为了更好地理解 Django 是如何实现这个过程的,以及在这个 MTV 架构中真正重要的是什么。我们可以检查下面的 Django 架构图来理解它。
如上图所示,我们有一些组件和两个区域,即服务器端和客户端。这里您会注意到视图在服务器端,而模板在客户端。
现在,当我们请求网站时,我们用来通过浏览器进行请求的界面就是模板。然后,请求者将视图文件传输到管理服务器。
Django 实际上是请求和响应之间的游戏。因此,每当我们的模板更新时,它是我们从这里发送的输入(请求),它在服务器上被视图看到。然后,它传输到正确的 URL。这是 Django MTV 架构的重要组成部分之一。在那里,Django 中的 URL 映射实际上是在正则表达式中完成的。这些表达方式比 IP 地址更容易理解。这也有助于我们在 Django 特性教程中讨论的 SEO 任务。
现在,在向正确的 URL 发送请求后,应用程序逻辑,模型开始对给定的请求做出正确的响应。然后,特定的响应被发送回视图,视图再次检查响应,并将其作为 HTTP 响应或所需的用户格式进行传输。然后,它再次通过模板由浏览器呈现。
上述功能的一个更简单的实际工作是——
当你登录一个网站(基于 Django ,你打开登录页面。它再次发生而不需要模型。这是因为视图将处理请求并将其发送到登录页面的 URL。然后,它将是服务器的响应,从那里到浏览器。
之后,在给定的模板 HTML 表单中输入您的凭证。从那里,数据再次被发送到视图,这一次这个请求被纠正,模型被给予数据。然后,模型读取并验证用户在连接的数据库中提供的数据。
如果用户数据匹配,它将发送相关的用户数据,如个人资料图像,名称和(其他事情取决于网站的类型)的看法。然后,它将在期望的响应中格式化相同的内容,并将相同的内容传输给客户端。
否则,模型将向视图发送一个否定的结果。接下来,它会再次将其路由到登录页面,并显示一条错误消息。
这就是 Django MTV 架构的实际工作方式。
阅读更多关于流行 Django 应用列表
MVC 架构的一些缺点
一.两个组件控制视图
在 MVC 模式中,视图是网页的 UI/显示逻辑。但在这种 MTV 架构中,它由两个组件生成/控制,模型和控制器。这使得 View 的测试过程有点困难。为了充分测试这一点,我们实际上必须首先编写所需的模型和控制器。
二。模型组件负载过大
模型完成所有的工作,无论是从数据库传输数据还是向数据库传输数据,以及对数据库进行操作。还通过应用业务逻辑给出适当的结果。单一组件完成所有这些任务。
三。开发复杂性很高
如果我们在较小的项目上实现 MVC 架构的方法,那么这将是一个漫长的开发过程。我们总是需要理解项目结构,并且必须小心使用的约定。
这对较小的应用程序有相反的影响,因为它们可能不太具有可伸缩性。它可以像一些大学生的 ERP 网站,办公室私人服务器等。这种方法可能会使系统更慢而不是更快。
这些是 MVC 架构的一些主要缺点。尽管 MTV 架构解决了这些缺点中的一些。但是,为了使用这种技术进行开发,您仍然需要熟悉 Django 的项目/文件结构。
摘要
在本教程中,我们了解了 Django MTV 架构的基本组件是什么,这些组件创建了 Django 项目。本教程是 Django 的基础,如果你打算在更小的项目中使用 Django,你必须掌握这些知识。
使用 Flask、Flask-RESTPlus 和 Swagger UI 处理 API
原文:https://towardsdatascience.com/working-with-apis-using-flask-flask-restplus-and-swagger-ui-7cf447deda7f?source=collection_archive---------0-----------------------
Photo by andrew welch on Unsplash
在从事机器学习项目时,我决定开发完整的应用程序。这将需要开发 API,这样我们就可以发布值并获得预测的响应。这就是 Flask 和 Flask-RESTPlus 的用武之地。
Flask 支持将 Python 函数公开为 API。Flask-RESTPlus 是 Flask 的扩展,改进了它的功能。它不仅允许我们定义 REST APIs,还为所有 API 引入了 Swagger UI。
在本文中,我将解释如何用几个 API 和虚拟数据开发 Flask 应用程序。该项目可以作为一个 GitHub 库使用。
装置
我通过使用pipenv
创建一个虚拟环境开始了这个过程。你可以在我的关于虚拟环境比较的文章中读到更多。我安装了 Flask 和 Flask-RESTPlus。
pipenv install flask
pipenv install flask-restplus
然而,如果您不希望在一个pipenv
环境中工作,您可以简单地使用下面的命令。
pip install flask
pip install flask-restplus
基础
Photo by Aaron Burden on Unsplash
导入
我开始是从flask
进口Flask
。从flask_restplus
中,我导入了Api
来定义 app 和Resource
,后者作为参数被接收到项目中定义的各个类中。
定义应用程序
我使用方法Flask()
将应用程序定义为 flask 应用程序,该方法使用__name__
设置名称。接下来,我将使用Api
来初始化应用程序。
我在这里定义了一个namespace
。概念很简单。每当在给定的名称空间下定义 API 时,它们都会出现在 Swagger 中的给定标题下(我们将在本文后面探讨 Swagger)。在namespace
中,第一个变量定义路径,第二个变量定义该空间的描述。
在上面的例子中,名称空间的 url 是http://127.0.0.1:5000/main
,在 Swagger 中描述为主 API。
定义 API
最后,我定义了端点。由于我们的名称空间是name_space
,我将通过 route 定义 url 为@name_space.route("/")
。接下来,Flask-RESTPlus 要求我们定义一个类中给定路径下的所有端点。方法可以是get()
、put()
等等。
在上面的例子中,可以通过路径http://127.0.0.1:5000/main
访问 API。类名设置为MainClass
,有get()
和post()
两种方法。无论何时,当我进行 GET 调用时,我得到的回复是字段为status
的Got new data
,而对于 POST 调用,我得到的回复是Posted new data
。
运行应用程序
现在,一切都准备好了。文件保存为 basic.py 。我使用pipenv
通过以下命令运行应用程序。
pipenv shell
FLASK_APP=basic.py flask run
使用 pip,您可以使用以下命令。
FLASK_APP=basic.py flask run
Swagger UI
Flask-RESTPlus 最好的部分是它自动记录我们创建的 API,并且它们在 Swagger UI 中是可见的。转到http://127.0.0.1:5000/
可以看到所有的 API。
Swagger UI
这两个 API 都可以在名称空间main
下看到,描述为Main APIs
。我们可以通过点击Try it out
按钮来尝试任一 API 并检查其功能。
尝试 API
我使用 curl 从终端发出 GET 和 POST 请求。
Making API Requests
使用curl
命令时,首先使用单词curl
,然后在字符-X
后使用方法。最后,指定端点。看一下我们的 curl 响应,我们看到我收到了正确的GET
和POST
API 数据。
更上一层楼
Photo by Markus Spiske on Unsplash
Flask 和 Flask REST-Plus 还有更多功能。让我们更深入地探索它们,更好地理解它们。下面的代码在 GitHub 资源库中以[app.py](https://github.com/kb22/Understanding-Flask-and-Flask-RESTPlus/blob/master/app.py)
的名字提供。
我们可以使用 POST 请求来发送数据并保存它。然后,我们可以使用 GET 请求来获取数据。假设我们有一个管理个人姓名并存储它们的项目。我们创建一个 GET 端点来使用id
获取名称,创建一个 POST 端点来根据id
保存名称。
在这里,我已经创建了路径为http://127.0.0.1:5000/names/<int:id>
,在这里我们每次都会经过id
。为了存储名字,我创建了一个对象list_of_names
,用于获取和接收数据。
导入更多库
我们已经导入了 Flask、Api 和资源。我们也从flask
包中导入request
。这有助于我们获得请求对象,然后从中检索信息,比如 JSON 数据。我们还从flask_restplus
包中导入fields
来定义元素的类型,比如字符串。
添加申请信息
我们还可以在 Flask 应用程序中添加额外的信息。这些信息非常有用,显示在 Swagger UI 中。
我们可以定义应用程序的version
、title
和description
。我们只设置了一个名称空间,即names
。Swagger UI 标题现在看起来如下图所示。
Swagger UI Header
定义模型
每当我们想要接收或发送特定格式(JSON)的信息时,我们都要借助model
来完成。我们指定模型的名称。接下来,我们描述它期望的信息和每个期望值的属性。
我们将型号名称定义为Name Model
。它包括一个参数,即name
,为必填字段,定义其描述和帮助文本。将使用这个模型的 API 将期待一个带有关键字name
的 JSON。
为了跟踪所有的名字,我将它们存储在list_of_names
中。
定义 API
让我们将上面的代码片段分解成更小的部分,以便更好地理解它。我们将探索POST
端点。GET
的功能将非常相似。
定义路线和等级
我们使用name_space
命名空间来定义路由,即http://127.0.0.1:5000/main/<int:id>
。它期望 Id 以整数形式发送。out 类的名称是MainClass
,它有一个参数Resource
。
为 API 定义文档
使用doc
,我们可以在 Swagger 中定义 API 的文档。responses
键定义了各种可能的 HTTP 状态代码。对于每个状态代码,我们还定义了向用户描述它的文本。params
键定义预期的参数。API 期望 URL 中有id
,我们为用户指定一个帮助文本。Swagger UI 如下图所示。
POST API (Swagger UI)
参数在顶部定义。所有预期的响应及其描述出现在下半部分。
定义方法
我们现在可以定义我们的方法了。在我们的方法之前,我们添加了行expect(model)
,它定义了 API 期望的model
。我们将代码包装在一个try
块中,并捕捉所有可能发生的错误。request.json['name]
获取我们收到的名称,我们可以保存它,并在响应中将其发送回去。如果name
键丢失,我们得到KeyError
并发送状态代码 500。在其他情况下,我们发送状态代码 400。
尝试应用程序
让我们启动应用程序。
FLASK_APP=app.py flask run
POST
我们解析来自请求的响应,读取name
并将它存储在list_of_names
中的id
中。我们还返回新添加人员的状态和姓名。
POST Request with id = 1 and name = Karan Bhanot
Response of POST Request
发布请求中的错误
比方说,我们忘记了在数据对象中提供name
参数。在这种情况下,我们会得到一个错误。
POST without name key
500 Error
由于没有提供密钥name
,我们收到了状态代码为 500 的错误和消息Mapping key not found.
GET
我们只需传递我们想要获取其姓名的id
,如果可用的话,我们将获取该人的状态和姓名。
GET Request with id = 1
Response of GET Request
获取请求时出错
比方说,我们没有人反对 Id 2。如果我们试图检索这些信息,它会抛出一个错误。
GET to fetch data against Id 2
500 Error
由于没有找到那个特定的 Id,我们得到状态代码 500 和消息Mapping key not found.
结论
在本文中,我们探索了使用 Flask 和 Flask-RESTPlus 创建 API。这两个都是很好的开发库,可以用 Python 编写 API 文档,并使用 Swagger 与 API 进行交互。
请随时分享你的想法和想法。
在 Python 中使用 Google Cloud AutoML
原文:https://towardsdatascience.com/working-with-google-cloud-automl-in-python-614395ab66b3?source=collection_archive---------13-----------------------
拥有一个 CSV 文件并在各种 ML 模型中实现它是很容易的。但是,困难在于完全使用 Python 来实现 e2e 过程,即获取视频、提取图像、将它们上传到谷歌云存储,然后对它们执行 AutoML。现在,大多数公司都有自己的内置模型;如果没有,那么他们使用谷歌 ML 模型或其他。
我将与你分享这个过程:
- 从对象的视频中提取帧(使用 OpenCV)
- 用正确的文件夹结构将图片上传到谷歌云存储中。
- 准备一个带标签的 CSV 数据集并上传到 Google 云存储。
- 使用上述 CSV 将数据集从 Google 云存储导入 AutoML。
- 在 AutoML 中训练数据并创建所需的分类模型。
- 在模型上测试随机图像。
上述过程的逐步指南
从对象的视频中提取帧(使用 OpenCV) :
我拍了 2 段视频,每段大约 25 秒,用来解决我的问题。在 Google Cloud 中,你需要准备一个桶用于你的项目。但是对于所有的事情,我都是用 Python 来做的,而不是使用控制台。我用 Jupyter 笔记本写的 Python 代码。
在上面的命令中,我们导入所需的库,使用项目路径和项目 Id、存储桶名称以及所需的修改来创建项目。
用正确的文件夹结构将图片上传到 Google 云存储:
以下命令帮助我从没有 ffmpeg 功能的视频中提取图像,并直接上传到 Google Cloud 上。我使用 openCV 库从视频中提取图像。OpenCV-Python 是一个强大的 Python 绑定库,旨在解决计算机中的视觉问题。在提取图像时,我在主任务文件夹下分别创建了两个子文件夹cup
和watch
,以便于对它们进行分类。
准备带标签的 CSV 数据集并上传到 Google 云存储:
最后,这将创建一个带有谷歌存储位置 URIs 和相应标签(cup
和watch
)的demo_data.csv
文件,并将它上传到谷歌云存储。
使用上述 CSV 将数据集从 Google 云存储导入到 AutoML:
在上面提到的代码中,随着数据集的生成,将提供一个dataset_id
,我们将使用它将图像从 CSV 导入到 Google Cloud。不要担心,导入数据需要一些时间。
在代码中,我们可以看到某些信息必须从我们这边提供,比如- compute_region
,默认情况下是用于 AutoML 处理的us-central1
。在这里,我的数据集中有两个标签,因此,当使用上面的 CSV 从 Google 云存储导入数据集到 AutoML 时,我设置了multilabel=True
。
对于异步数据,我们需要提供回调函数,否则可能会抛出错误。在准备导入代码时,我得到了一个代码为 504 的错误,它指出了最后期限异常。如果您遇到这样的错误,您可以专门提到超时,因为默认情况下,任务花费的时间是 60 秒。一旦所有数据都被导入,它将打印以下输出:
在 AutoML 中训练数据并创建所需的分类模型:
在训练模型时,所需的第一个参数是需要由我们定义的数据集,我们将从上一步中获得相同的参数。其次,我们需要提供一个模型名。最后,培训预算。培训预算是用于模型的培训时数。在我的任务中,最多需要 1 小时。
接受训练需要一些时间,同时你可以去喝杯咖啡。一旦你回来,你的模型就可以接受测试了。
在模式下测试随机图像:
现在,在谷歌云的控制台中,你可以去查看数据集的统计数据,在那里你可以评估你的数据。如果你认为你做错了什么,你可以进行必要的修正,并在数据集最终准备好接受测试之前再次重新训练数据集。
在我的数据集中,我拍摄了两个视频——一个杯子和一个手表。此外,在测试原始数据(即这里的图像)时,我可以得到特定的结果。一旦训练完成,我拍了几张图片来测试我的模型,我得到的结果几乎和我的图片一样准确。
结论:
我们看到了如何在不使用 Google Cloud 控制台的情况下,用 Python 将原始视频转换为图像并制作 CSV 数据集,以及导入和训练数据。现在,当从谷歌云中的 CSV 文件导入数据时,可能会出现一些其他问题(除了我提到的问题)。您需要了解错误,并为调试该错误进行研究。我希望这将消除您的一些疑虑,同时让您轻松使用 Google Cloud。
完整的代码可以在我的 github 回购:https://github.com/Priktopic
万事如意。
资源:https://cloud.google.com/vision/automl/docs/
使用 AWS S3 和 Python 处理 Hive
原文:https://towardsdatascience.com/working-with-hive-using-aws-s3-and-python-4c7471533f98?source=collection_archive---------12-----------------------
使用外部数据存储维护配置单元模式和使用 Python 执行配置单元查询的初学者指南
Photo by Aleksander Vlad on Unsplash
在本文中,我将分享我维护 Hive 模式的经验。这将对那些愿意涉足大数据技术的大一新生很有用。这将主要描述如何使用 python 连接到 Hive,以及如何使用 AWS S3 作为数据存储。如果你不熟悉 Hive 概念,请浏览维基百科上的文章。
本文的主要目的是提供一个通过 python 连接 Hive 和执行查询的指南。为此,我使用了“py hive”库。我将我的连接类创建为“Hive connection”,Hive 查询将被传递到函数中。AWS S3 将用作配置单元表的文件存储。
**import** pandas **as** pd **from** pyhive **import** hive**class** HiveConnection:
@staticmethod
**def** select_query(query_str: str, database:str =HIVE_SCHEMA) -> pd.DataFrame:
*"""
Execute a select query which returns a result set* **:param** *query_str: select query to be executed* **:param** *database: Hive Schema* **:return***:
"""*
conn = hive.Connection(host=HIVE_URL, port=HIVE_PORT, database=database, username=HIVE_USER)
**try**:
result = pd.read_sql(query_str, conn)
**return** result
**finally**:
conn.close()
@staticmethod
**def** execute_query(query_str: str, database: str=HIVE_SCHEMA):
*"""
execute an query which does not return a result set.
ex: INSERT, CREATE, DROP, ALTER TABLE* **:param** *query_str: Hive query to be executed* **:param** *database: Hive Schema* **:return***:
"""*
conn = hive.Connection(host=HIVE_URL, port=HIVE_PORT, database=database, username=HIVE_USER)
cur = conn.cursor()
*# Make sure to set the staging default to HDFS to avoid some potential S3 related errors* cur.execute(**"SET hive.exec.stagingdir=/tmp/hive/"**)
cur.execute(**"SET hive.exec.scratchdir=/tmp/hive/"**)
**try**:
cur.execute(query_str)
**return "SUCCESS"
finally**:
conn.close()
我将查询保存为单独的字符串。这样,您可以在必要时用外部参数格式化查询。配置单元配置(配置单元 URL、配置单元端口、配置单元用户、配置单元模式)为常量。函数" select_query" 将用于检索数据,函数" execute_query 将用于其他查询。
Hive 提供了一个 shell 交互工具来初始化数据库、表和操作表中的数据。我们可以通过输入命令“Hive”进入 Hive 命令行。您也可以在 shell 中执行本文中给出的所有查询。
创建新模式
模式是类似于数据库的表的集合。Hive 中允许使用关键字 SCHEMA 和 DATABASE。我们可以选择任何一个。这里我们用模式代替数据库。可以使用“创建模式”来创建模式。要进入模式内部,可以使用关键字“USE”。
**CREATE SCHEMA** userdb;
**USE** userdb;
创建表格
有三种类型的配置单元表。它们是内部的、外部的和暂时的。内部表存储数据库中表的元数据以及表数据。但是外部表将元数据存储在数据库中,而表数据存储在远程位置,如 AWS S3 和 hdfs。删除内部表时,所有表数据都将随元数据一起被删除。删除外部表时,只会删除元数据。而不是表数据。这样,实际数据将得到保护。如果您将新表指向相同的位置,数据将通过新表可见。
Hive 是一个数据仓库,使用 MapReduce 框架。因此,数据检索的速度对于小型查询来说可能不够公平。为了提高性能,可以对配置单元表进行分区。分区技术可以应用于外部表和内部表。像 bucketing 这样的概念也是有的。您可以选择这些技术中的任何一种来提高性能。
将数据从一个地方复制到另一个地方时,临时表非常有用。它充当数据库会话中保存数据的临时位置。会话超时后,所有临时表都将被清除。创建临时表对" Pyhive" 库没有用,因为单个会话中不支持多个查询。即使我们创建了一个表,也不能再使用同一个会话来访问表。但是这在 Hive 命令行中是可能的。您可以创建一个临时表,然后在单个会话中从该表中选择数据。
内部表格
以下查询将创建一个具有远程数据存储 AWS S3 的内部表。文件格式为 CSV,字段以逗号结尾。“ s3_location 指向数据文件所在的 s3 目录。这是用户为查询字符串定义的外部参数。应该在查询格式化的时候传递。
CREATE TABLE `user_info` (
`business_unit` INT,
`employee_id` INT,
`email` VARCHAR(250),
`first_name` VARCHAR(250),
`last_name` VARCHAR(250),
`gender` VARCHAR(250),
`birthday` DATE,
`created_date` DATE,
`updated_date` DATE)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ESCAPED BY '\\'
LOCATION '{s3_location}'
TBLPROPERTIES (
"s3select.format" = "csv",
"skip.header.line.count" = "1"
);
如果数据字符串包含逗号,将会破坏表格结构。所以我定义了一个转义符,在创建表之前,所有不必要的逗号都需要放在这个转义符的前面。
下面是一个示例记录。请注意,电子邮件包含一个逗号。
1,1,安,史密斯@加米尔。com,Ann,Smith,女,' 1992–07–01 ',' 2019–09–01 ',' 2019–12–31'
上面的记录需要这样格式化 : 1,1,ann\,smith@gamil.com,安,史密斯,女,“1992–07–01”,“2019–09–01”,“2019–12–31”
外部表格
这里,我用“业务单位”和“创建日期”对“用户信息”表进行了分区
CREATE EXTERNAL TABLE `user_info` (
`employee_id` INT,
`email` VARCHAR(250),
`first_name` VARCHAR(250),
`last_name` VARCHAR(250),
`gender` VARCHAR(250),
`birthday` DATE,
`updated_date` DATE
) partitioned by(
`business_unit` INT,
`created_date` DATE,
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ESCAPED BY '\\'
STORED AS
INPUTFORMAT
'com.amazonaws.emr.s3select.hive.S3SelectableTextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION '{s3_location}'
TBLPROPERTIES (
"s3select.format" = "csv",
"s3select.headerInfo" = "ignore"
);
工作单元表
创建临时表的查询。
CREATE TEMPORARY TABLE `user_info` (
`business_unit` INT,
`employee_id` VARCHAR(250),
`email` VARCHAR(250),
`first_name` VARCHAR(250),
`last_name` VARCHAR(250),
`gender` VARCHAR(250),
`birthday` DATE,
`created_date` DATE,
`updated_date` DATE
) ;
翻桌
删除表的查询。如果删除外部表,远程文件存储中的数据不会被删除。
DROP TABLE IF EXISTS `user_info`;
插入数据
一旦使用外部文件存储创建了表,远程位置的数据将通过没有分区的表可见。但是当涉及到带有分区的表时,情况就不一样了。这意味着数据不能直接复制到分区表中。我们需要创建一个没有分区的临时表,并通过提供分区值将数据插入到分区表中。以下查询描述了如何向这样的表中插入记录。
INSERT INTO TABLE user_static_info PARTITION (business_unit={business_unit}, `created_date`='{execution_date}')
SELECT
Employee_id,
email,
secondary_email,
first_name,
last_name,
orig_gender,
gender,
signup_channel ,
signup_from_fb ,
birthday,
signup_date,
updated_date,
last_activity_date,
subscription_status
FROM
tmp_user_static_info
WHERE business_id={business_unit}
因为单个会话中的多个查询不支持“py hive”;我必须创建内部表“tmp _ user _ static _ info”,它指向没有分区的 S3 数据目录。然后,在将数据插入外部分区表后,删除了该表。
检索数据
选择查询用于检索配置单元中的数据。这些非常类似于 SQL 选择查询。它具有以下形式。您可以根据自己的需求构建查询。
SELECT [ALL | DISTINCT] select_expr, select_expr, …
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[HAVING having_condition]
[CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list]]
[LIMIT number];
更新和删除数据
配置单元不支持直接更新和删除数据。如果您想更改表格中的任何内容;使用 SELECT 查询将必要的数据复制到新表中。然后,通过删除旧表并重命名新表,可以用新表替换旧表。
更改表格
在 Hive 中可以更改表格。但这需要在不影响现有数据的情况下非常小心地完成。因为我们不能改变数据。例如,在中间添加一个新字段不会移动数据。如果我们添加一个新字段作为第二个字段,属于第三列的数据仍将出现在第二列,第四个字段的数据出现在第三个字段,依此类推。最后一个字段将不包含任何数据。这是因为更新配置单元表数据的限制。如果我们添加一个新字段作为最后一个字段,将会有一个空字段,我们可以将数据插入到该字段中。
ALTER TABLE user_static_info ADD COLUMNS (last_sign_in DATE);
如果我们想删除外部数据,我们可以使用以下步骤。
ALTER TABLE user_static_info SET TBLPROPERTIES('EXTERNAL'='False');
DROP TABLE user_static_info;
例子
最后,以下代码显示了如何使用“ HiveConnection ”类中的“ execute_query ”函数执行查询。
from src.database.hive_con import HiveConnection
create_temp_table_query_str = """CREATE TABLE `user_info` (
`business_unit` INT,
`employee_id` INT,
`email` VARCHAR(250),
`first_name` VARCHAR(250),
`last_name` VARCHAR(250),
`gender` VARCHAR(250),
`birthday` DATE,
`created_date` DATE,
`updated_date` DATE
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ESCAPED BY '\\'
LOCATION '{s3_location}'
TBLPROPERTIES (
"s3select.format" = "csv",
"skip.header.line.count" = "1"
);""".format(
s3_location="s3://hive-test/data/user_info/"
)
HiveConnection.execute_query(query_str=create_temp_table_query_str, database=userdb)
使用 Python 回答问题:“我如何在 Excel 中打开这个 JSON 文件?”
原文:https://towardsdatascience.com/working-with-json-files-answering-the-age-old-question-of-how-do-i-open-this-json-file-in-excel-8d2845944fc1?source=collection_archive---------31-----------------------
在这篇文章中,我描述了在 python 中使用 JSON 文件的一个非常入门/基本的过程:1)加载一个 JSON 文件,2)进行一些数据操作,然后 3)将一些数据保存到一个像 CSV / Excel 这样的二维格式中。
https://www.flaticon.com/authors/smashicons
当我开始接触编程和数据科学时,我害怕不是 csv 或 Excel 表格的文件格式。
如果你递给我一个 JSON 文件,我会跑去躲起来。如果您找到我并让我使用 JSON,我将不得不做一些不可复制的乱七八糟的查找和替换。
在使用 JSON 并学习了更多 python 之后,我可以告诉你,它并没有看起来那么糟糕。请跟我一起踏上旅程,我将介绍一些使用 Python 对 JSON 文件进行数据操作的简单方法,并向您展示如何使用 Excel 打开 JSON。
JSON 是什么
JSON 代表JavaSscriptOobjectNrotation,是用于在网络上存储和交换数据的主要文件格式。
与以二维矩阵显示数据的 CSV 文件不同,您可以将数据存储为复杂的嵌套结构。这些嵌套结构可以处理当今编程中的所有主要数据类型(如字符串、数字、列表、字典)。
如果你曾经打开过一个 JSON 文件,它看起来有点像这样:
如果您检查上面的 JSON,您可以开始推断其结构:
- 包含 6 种颜色列表的“颜色”键
- 列表中的每个词典都是一种具有特定属性的颜色
- 在“代码”属性中,这是指包含 rbga 列表和十六进制表示的字典
我能够推断出上述情况,因为我知道:
- [ ]代表一个列表
- {}表示这是一个字典
- :表示字典的键/值对
一旦你推断出了结构,你就可以开始提取你需要的部分或者做一些数据操作。
用 Python 读取 JSON 文件
对于这个例子,我将使用 Google Colab 笔记本。
Google Colab 笔记本基本上是一个托管在 Google 服务器上的 Jupyter 笔记本。我喜欢这一点,因为你不必担心任何技术问题——你只需去https://colab.research.google.com/就可以发布一款新笔记本
加载新笔记本后,我可以导入三个模块:
import requests
import json
import pandas as pd
- 请求让我从网络上获取数据
- json 提供了所有使用 json 文件的方法
- 熊猫是我最喜欢的数据处理包
JSON 文件可以作为一个单独的文件下载,但是通常 JSON 是作为 API 请求的结果返回的。
我想加载一个我在网上找到的颜色的 json,这样我就可以使用请求模块来获取它:
Data = requests.get('https://gist.githubusercontent.com/cpreid2/86d1fc08fc21094b2af098082cbbb49b/raw/3434521113467ed636b26e0e1d4f8c952b6a8b0a/colors.json')Colors = Data.json()
如果我将 Colors 变量打印到屏幕上,我可以看到 JSON 的结构:
如果您正在加载一个本地 json 文件,您应该这样做:
with open('data.json') as json_file:
data = json.load(json_file)
解析出数据
假设我们只对这个数据集中的原色感兴趣(type = 'primary ')? 我们怎么只选择那个数据 ?
答案是使用 python 中的循环——我们可以遍历整个 JSON,检查 type 属性是否设置为‘primary’。如果是真的,我们可以把这个数据附加到一个新的变量上。
可以使用相应数据类型的 python 选择方法来选择 JSON 的各个部分:
- dictionary{ }—dictionary _ name【key】,其中 key 为字符串
- list[]—list _ name【I】,其中 I 是一个数字,代表列表中该项从 0 开始的索引
例如,如果您想获取 JSON 文件中的第一种颜色,您可以编写如下代码:
Colors['colors'][0]
如果你想得到第四种颜色的十六进制值,你应该这样写:
Colors['colors'][3]['code']['hex']
了解了 JSON 中的值是如何被访问的,您可以编写以下代码来只选择原色:
primary_colors = []**for** color in Colors['colors']: **try**: **if** color['type'] == 'primary': primary_colors.append(color) **except** KeyError: **continue**primary_colors
将这个新的 primary_colors 变量打印到屏幕上显示,它只获取了四种原色:
通过在 for 循环或 if/then 语句中添加更多约束,您可以在过滤中获得更高级的效果。
操纵数据
在我加载的 JSON 中,我注意到十六进制字段缺少三个尾随的 0,以使它成为完整的十六进制代码。如何将文本添加到十六进制值中?
您可以使用类似的 for 循环过程来实现。我在列表中循环,并在每个十六进制值后追加“000”。下面的代码实现了这一点:
for color in primary_colors: color['code']['hex'] = color['code']['hex'] + '000'primary_colors
打印此变量表明列表中的“十六进制”字段已更新:
这是一个简单的例子很多 python 字典的数据操作方法都有。
保存回 JSON 格式
要将原色保存回 JSON 文件,可以使用以下代码引用新创建的“primary_colors”变量:
with open('primary_colors.json', 'w') as outfile:
json.dump(primary_colors, outfile)
将 JSON 中的自定义字段保存为 CSV 文件
通常情况下,您需要为从 JSON 文件中获得的一些数据创建一个 CSV 文件。
在本例中,我只想提取 json 中的颜色字段和 rgba 字段中的 r、g、b、a 值,作为 csv 文件中的一个单独的列。我可以通过再次执行另一个 for 循环来获取我感兴趣的每个字段,并将其“展平”为一个可以转换为数据框的简单列表。下面的代码实现了这一点:
primary_color_flattened = []for color in primary_colors: primary_color_flattened.append({ "color" : color['color'], "r" : color['code']['rgba'][0], "g" : color['code']['rgba'][1], "b" : color['code']['rgba'][2], "a" : color['code']['rgba'][3]})
上面我遍历了所有的颜色,并为每种颜色添加了一个新的字典条目到一个名为‘primary _ color _ flattened’的列表中
然后,可以将该变量读入 pandas 数据框,如下所示:
您可以使用 pandas to_csv 方法将此 csv 保存到文件中:
然后,您应该能够在类似 Excel 的东西中打开这个 csv。
这是一个非常肤浅的观点,说明当你转向脚本/编程思维模式时会发生什么。您将更倾向于为数据操作构建一个可再现的管道。
我在这里附上了 Colab 笔记本,因此如果您是 python 编程新手或一般编程笔记本的新手,您可以尝试一下。
[## 谷歌联合实验室
JSON 到 CSV 示例—colab.research.google.com](https://colab.research.google.com/drive/1HSB8ZUnaTbfbZbMaxxPNUJBqYuY3d0oX)
在机器学习的单个问题中处理多种类型的数据
原文:https://towardsdatascience.com/working-with-multiple-types-of-data-in-a-single-problem-in-machine-learning-31b667930179?source=collection_archive---------1-----------------------
在我之前的一篇帖子中,我提出了 3 个在面试中被问到的主观问题。在这篇文章中,我将回答第三个问题。当我有时间的时候,我可能也会写下其他人的答案。到那时,请分析这个有趣的问题和解决方案。
[## 我的第一次数据科学面试
今天,我将分享我第一次参加数据科学面试的经历,那是在一所顶尖的…
towardsdatascience.com](/my-first-data-science-interview-bccc006ba2c8)
问题
你给病人提供病史。您拥有包含数字数据(血压、血糖、心率、血脂等)的所有测试报告,包含图像+文本报告(医生根据图像得出的结果)的放射报告,以及包含有关患者健康的主观和客观信息的护理报告。患者数据以报告的形式出现,即时间序列数据。基于这些报告,你必须计算 3 件事:
a)病人存活的几率有多大,他要在医院呆多少天。你将使用哪种算法,为什么?
b)死亡率是多少,即一个人在接下来的一周内是否会死在 ICU。你会选择哪种算法,为什么?
c)定义一些对你的问题有用的额外特征,这些特征是问题中所没有的。如果这是一个人工智能驱动的医生,它将如何向病人的家人传达当前的状况?
解决办法
在这种类型的问题中,你应该简明扼要地回答对方到底在寻找什么是明智的。此外,图表充分说明了你的理解能力,所以请画一个图表来描述你的解决方案管道。
问题中的数据类型:
- 表格数据:报告包含数字历史数据(血压、血糖、心率、血脂等)。
- 图像数据:放射学报告(医学成像数据集)
- 文本数据:护士记录加上来自图像数据的医生发现(放射学元数据)
表格数据
ML 方法:经典机器学习
对于表格数据,我们必须使用经典的机器学习方法。这种方法首先涉及到特征工程,在这种工程中,我们可以组合特征以形成新的特征或者丢弃一些不重要的特征。
Example for 1 Report
考虑到这是数据准备步骤中的时间序列数据,我们需要定义一个窗口大小。窗口大小是您希望将历史中的多少观测值作为要素包括在内。例如:
如果您有最后 5 个报告,并且您的窗口大小为 5,则在最终表中,一个单一特征列可以有 5 个条目,如-
Remember to take previous columns as the features.
如果窗口大小为 2,那么最终的表格将具有如下特征:
If we take window size = 2
图像数据
ML 方法:卷积神经网络
对于图像数据,我们使用卷积神经网络来提取特征或标签。这可以通过两种方式中的任何一种来实现:
- 假设我们有一个标记的医学数据集,它突出显示了肺部受肺炎影响的部分。这个数据集有 2 个标签,如果这个人有肺炎或没有。在这种情况下,我们可以对图像进行二进制分类,并将最终标签作为特征列添加到表格数据中。
Binary Classification on the Image
Classification result added as a feature column with Tabular data
2.如果我们没有一个标签数据集,我们可以通过一个预先训练的 CNN 比如 Densenet-121 来传递图像。这样做是为了从图像中提取特征。请确保不要运行完整的 Densenet-121 模型,而是在完全连接的层中断开它,在该层中,我们有一个 256 矢量的特征。下一步是将这些要素作为列添加到表格数据中。
Densenet-121 Architecture
Features Extracted from DenseNet-121 added as feature columns with tabular data
文本数据
ML 方法:经典的自然语言处理和/或 RNN
对于文本数据,我们使用经典的自然语言处理或 RNN。必须对文本进行解析,以删除被称为标记化的单词。则需要将这些字编码为整数或浮点值,以用作 ML 算法的输入。在这个数据中,我们也有两个选择:
- 使用 tfidf vectorizer:tfidf vectorizer 代表词频—逆向文档。 TF-IDF 是词频分数,试图突出更有趣的词,例如,在文档中频繁出现但不跨文档出现。使用 TF-IDF,我们可以将单词转换为特征,并将它们附加到我们的表格数据中,以便进行最终分类。
The TF-ID vectors appended as feature columns with tabular data
2.如果我们已经标记了报告的情感数据集,那么我们可以使用 LSTM/RNN 来执行分类,并且获得作为表格数据中的特征的最终标签。
Final Pipeline of this problem.
问题 3-a:患者存活的几率有多大,需要住院多少天。你将使用哪种算法,为什么?
回答:为了进行这种回归预测分析,我假设我有一个带标签的数据集。
正如我所解释的,从不同类型的数据中提取特征,我们可以将所有东西组合成表格数据,最后使用经典的机器学习。我将使用的算法是 XGBoost 和 Light Gradient Boosting,因为它们组合了许多弱回归器/分类器来给出最终输出。
或者,最好的方法是创建一个人工的完全连接的神经网络,并传递这些特征,以获得关于%机会和住院天数的最终答案。
问题 3-b:死亡率是多少,即一个人在接下来的一周内是否会死在 ICU。你会选择哪种算法,为什么?
回答:一个人在接下来的一周内是否会死在 ICU,这是一个分类问题。对于这种分类问题,最好的算法还是 XGBoost/ LGBM 或人工神经网络。
c)定义一些问题中缺少的对你的问题有用的额外特征。如果这是一个人工智能驱动的医生,它将如何向病人的家人传达当前的状况?
问题中缺少的特征是患者的年龄、性别和既往病史。大部分治疗取决于患者的性别和年龄。
作为一名人工智能医生,我们可以向家庭成员展示回归结果,以便他们可以确定未来会发生什么。比如,如果在过去的 5 天里,存活的机会从 40%增加到 60%,那么给他们一个积极的信号,病人正在好转!
我希望这篇文章对你有所帮助。如有更多疑问,您可以通过 LinkedIn 与我联系。
在 pandas 和 sklearn 中使用稀疏数据集
原文:https://towardsdatascience.com/working-with-sparse-data-sets-in-pandas-and-sklearn-d26c1cfbe067?source=collection_archive---------0-----------------------
在机器学习中,有几种情况下我们会遇到稀疏数据集。以下是一些例子:
- 推荐系统的用户评级
- 用户点击内容推荐
- 自然语言处理中的文档向量
Photo by David Dvořáček on Unsplash
稀疏数据集通常很大,很难使用标准的机器学习 python 工具,如 pandas 和 sklearn。普通本地机器的内存不足以存储或处理大型数据集的情况并不罕见。即使内存足够,处理时间也会显著增加。
在本文中,我们将给出一些简单的技巧,在使用 python 进行机器学习项目时,我们可以遵循这些技巧。
什么是稀疏矩阵?
稀疏矩阵是大部分元素为零的矩阵。相反,大多数元素都不为零的表称为稠密表。我们将矩阵的稀疏性定义为零元素的数量除以元素的总数。稀疏度大于 0.5 的矩阵是稀疏矩阵。
将稀疏矩阵作为密集矩阵处理通常是低效的,会过度使用内存。
使用稀疏矩阵时,建议使用专用的数据结构来实现高效的存储和处理。我们将在接下来的章节中引用 Python 中的一些可用结构。
通常,我们从包含分类变量的密集数据集开始。通常,我们必须对这些变量应用一键编码。当这些变量具有高基数(大量不同的值)时,一键编码将生成一个稀疏的数据集。
例子
考虑下面的用户电影评级表
Dense matrix
其中“评级”是多类分类问题的目标变量。
现在假设我们想要训练一个因式分解机器分类器。因子分解机器(FMs)是一种通用的预测器,能够在高稀疏性的问题中表现良好,如推荐系统。根据最初的论文我们需要将数据集转换成以下格式:
Sparse matrix
在上面的结构中,两个输入属性(用户和电影)都是一次性编码的。对熊猫来说,这是一个简单的单行转换。然而,在大型数据集的情况下,这可能会非常麻烦。
下面我们将展示一些在 pandas 和 sklearn 中促进这种数据集的转换和处理的方法。
数据集
我们将使用 MovieLens 100K 公共数据集,在这里可用。培训文件包含 943 个用户对 1682 个项目的 100,000 个评级。对于这个分析的范围,我们将忽略时间戳列。
让我们将数据加载到熊猫数据框中。
一键编码
假设我们想要将这个数据集转换成上一节中所示的格式,我们必须对列 user_id 和 item_id 进行一次性编码。对于转换,我们将使用get _ dummiespandas 函数,它将分类变量转换为指示变量。
在应用转换之前,让我们检查一下原始数据框的内存使用情况。为此,我们将使用memory _ usagepandas 函数。
Memory usage of data frame is 2.4 MB
现在,让我们应用转换并检查转换后的数据帧的内存使用情况。
在一次性编码之后,我们为每个用户创建了一个二进制列,为每个项目创建了一个二进制列。因此,新数据帧的大小为 100.000 * 2.626,包括目标列。
(100000, 2626)Memory usage is 263.3 MB
我们看到,与原始数据帧相比,转换后的数据帧的内存使用量显著增加。这是意料之中的,因为我们增加了数据框的列数。然而,新数据帧中的大多数元素为零。
技巧 1:使用 pandas 稀疏结构来存储稀疏数据
熊猫稀疏结构
Pandas 提供了有效存储稀疏数据的数据结构。在这些结构中,零值(或任何其他指定值)实际上并不存储在数组中。
仅存储非零值及其位置是存储稀疏数据集的常用技术。
我们可以使用这些结构来减少数据集的内存使用。您可以将此视为“压缩”数据帧的一种方式。
在我们的示例中,我们将把 one-hot 编码列转换成SparseArrays,这是一个一维数组,其中只存储非零值。
rating int64
user_id_1 Sparse[uint8, 0]
user_id_2 Sparse[uint8, 0]
user_id_3 Sparse[uint8, 0]
user_id_4 Sparse[uint8, 0]
...
item_id_1678 Sparse[uint8, 0]
item_id_1679 Sparse[uint8, 0]
item_id_1680 Sparse[uint8, 0]
item_id_1681 Sparse[uint8, 0]
item_id_1682 Sparse[uint8, 0]
Length: 2626, dtype: objectMemory usage is 1.8 MB
如果我们检查新数据帧的 dtypes ,我们会看到我们转换的列现在属于类型 Sparse[uint8,0] 。这意味着不存储零值,非零值存储为 uint8 。转换成稀疏数组时可以设置非零元素的数据类型。
此外,我们看到我们已经成功地显著减少了数据帧的内存使用。
到目前为止,我们已经设法减少了数据帧的内存使用,但是要做到这一点,我们首先要在内存中创建一个大型的密集数据帧。
技巧 2:在熊猫 get_dummies 中使用稀疏选项
使用熊猫 get_dummies 中的稀疏参数,可以直接创建稀疏数据框。该参数默认为假。如果为真,则编码列作为稀疏数组返回。通过设置 sparse=True ,我们可以直接创建一个稀疏数据帧,而无需在内存中预先存储密集数据帧。
rating int64
user_id_1 Sparse[uint8, 0]
user_id_2 Sparse[uint8, 0]
user_id_3 Sparse[uint8, 0]
user_id_4 Sparse[uint8, 0]
...
item_id_1678 Sparse[uint8, 0]
item_id_1679 Sparse[uint8, 0]
item_id_1680 Sparse[uint8, 0]
item_id_1681 Sparse[uint8, 0]
item_id_1682 Sparse[uint8, 0]
Length: 2626, dtype: objectMemory usage is 1.8 MB
在一键编码中使用稀疏选项使我们的工作流在内存使用和速度方面更加高效。
让我们继续分割输入和目标变量。我们将创建两组 X,y 向量,使用密集和稀疏数据帧进行比较。
分割 X,y
Memory usage is 262.5 MB
Memory usage is 1.0 MB
训练-测试分割和模型训练
接下来,我们转到 sklearn 对我们的数据集执行训练测试分割,并训练一个逻辑回归模型。虽然我们使用因子分解机器作为参考模型来创建我们的训练集,但这里我们将在 sklearn 中训练一个简单的逻辑回归模型,仅用于演示密集和稀疏数据集之间在内存和速度方面的差异。我们将在本例中讨论的技巧可转移到 Python FM 实现,如 xlearn 。
Pandas dataframe
Train-test split: 6.75 secs
Training: 34.82 secs
Sparse pandas dataframe
Train-test split: 17.17 secs
Training: 41.69 secs
我们注意到,尽管 X_sparse 更小,但是的处理时间比密集的 X 要长。原因是 sklearn 不处理稀疏数据帧,根据这里的讨论。相反,稀疏列在被处理之前会被转换为密集列,从而导致数据框大小激增。
因此,到目前为止使用稀疏数据类型实现的大小减少不能直接转移到 sklearn 中。此时,我们可以利用 scipy 稀疏格式,将我们的 pandas 数据帧转换成 scipy 稀疏矩阵。
技巧 3:转换成 scipy 稀疏矩阵
稀疏矩阵
Scipy 包提供了几种类型的稀疏矩阵来实现高效存储。Sklearn 和 imblearn 等其他机器学习包接受稀疏矩阵作为输入。因此,在处理大型稀疏数据集时,强烈建议将我们的 pandas 数据帧转换为稀疏矩阵,然后再将其传递给 sklearn。
在本例中,我们将使用 lil 和 csr 格式。在 scipy docs 中,你可以看到每种格式的优缺点。为了有效地构建矩阵,建议使用 dok_matrix 或 lil_matrix 。[ 来源 ]
下面我们定义一个函数来将数据帧转换成一个稀疏矩阵。我们首先按列构建一个 lil 矩阵,然后将其转换为 csr 。
Memory usage is 2.000004 MB
让我们用 csr 矩阵重复训练测试分割和模型训练。
Pandas dataframe
Train-test split: 0.82 secs
Training: 3.06 secs
Sparse pandas dataframe
Train-test split: 17.14 secs
Training: 36.93 secs
Scipy sparse matrix
Train-test split: 0.05 secs
Training: 1.58 secs
使用X _ 稀疏时,train_test_split 和模型训练都明显更快。因此,我们得出结论,使用稀疏矩阵是最有效选择。
稀疏矩阵的优势在较大的数据集或者稀疏度较高的数据集上会更加明显。
外卖食品
- 在 pandas 中处理大型稀疏数据帧时,我们可以利用 pandas 稀疏数据类型
- 我们也可以利用 get_dummies 中的 稀疏 选项,自动创建稀疏数据帧
- 当使用机器学习库时,我们应该考虑将我们的数据转换成稀疏矩阵
参考
[## 稀疏矩阵
稀疏矩阵的例子上面的稀疏矩阵只包含 9 个非零元素,有 26 个零元素。它的稀疏…
en.wikipedia.org](https://en.wikipedia.org/wiki/Sparse_matrix) [## 稀疏矩阵(scipy.sparse) - SciPy v1.3.1 参考指南
用于数值数据的二维稀疏矩阵包。构建稀疏矩阵:保存和加载稀疏矩阵:稀疏…
docs.scipy.org](https://docs.scipy.org/doc/scipy/reference/sparse.html) [## 稀疏数据结构-pandas 0 . 25 . 3+0 . g 43013d 49 f . dirty 文档
注意不推荐使用 SparseSeries 和 SparseDataFrame。他们的目的是同样服务于一个或稀疏…
pandas.pydata.org](https://pandas.pydata.org/pandas-docs/stable/user_guide/sparse.html)
https://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf
使用时间序列数据
原文:https://towardsdatascience.com/working-with-time-series-data-a8872ebcac3?source=collection_archive---------8-----------------------
如何使用 Python 准备用于分析的时间序列数据
NYC’s daily temperature chart (November 1, 2019 to December 11, 2019) produced with Matplotlib
数据科学家研究时间序列数据,以确定是否存在基于时间的趋势。我们可以分析每小时的地铁乘客,每天的温度,每月的销售额,等等,看看是否有各种类型的趋势。这些趋势可以用来预测未来的观测。Python 有许多可以很好地处理时间序列的库。我研究了金宝汤公司过去十年的股票价格,前五个交易日如下:
Campbell Soup Company stock price obtained from Yahoo Finance organized in a Pandas dataframe
准备数据
无论您的数据来自数据库、. csv 文件还是 API,您都可以使用 Python 的 Pandas 库来组织您的数据。一旦您将数据加载到 pandas 中,您将需要检查基于时间的列的数据类型。如果值是字符串格式,您需要将数据类型转换为 pandas datetime 对象。股票价格日期列是“年-月-日”格式的字符串数据类型我利用 pandas 的[to_datetime](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html)
方法将该列转换为 datetime 对象:
cpb.Date = pd.to_datetime(cpb.Date)
注意:我将数据存储在一个名为“cpb”的熊猫数据帧中
一旦日期列被转换成适当的数据类型,那么您就可以用set_index
方法设置数据帧的索引。
The data types of the ‘Date’ column before and after the to_datetime() and set_index() methods are applied. Note the change in the number of columns, this occurs when the index column is set.
您可能有多个时间间隔不同的数据帧。这就需要对数据的频率进行重新采样。假设您想要合并一个包含每日数据的数据帧和一个包含每月数据的数据帧。这就需要进行缩减采样,或者按月对所有每日数据进行分组,以创建一致的时间间隔。数据分组后,您需要一个兼容的指标,通常是更频繁的数据的平均值,以恢复一致性。这些步骤可以通过.resample()
和.mean()
方法在一行中完成:
cpb[‘Adj Close’].resample(‘MS’).mean()
MS
参数对应每月重采样。如果重新采样的值比使用的参数更频繁,则这称为下采样。.resample()
方法的有效间隔参数列表可在这里的“日期偏移对象”表中找到。
Downsampling from daily values to monthly values with the .resample() method
如果重新采样的值没有所用参数频繁,这称为上采样。在创建新日期间隔的位置添加空值。我将每日价格的值向上采样到每日两次。在我们的股票价格场景中,pandas 会将原始价格分配给午夜时间戳,将 null 值分配给中午时间戳:
The stock price data upsampled to twice daily. Hourly time stamps have been added at midnight and noon.
Pandas 的向前填充和向后填充选项是处理这些 NaN 值的两种方法。.ffill()
用当天早些时候记录的值填充 NaN 值:
Forward filling the NaN values. Each noon value was filled in with the value recorded before that time.
.bfill()
用当天晚些时候记录的值填充 NaN 值:
Back filling the NaN values. Each noon value was filled in with the value recorded after that time.
形象化
我以前写过关于 OHLC(开盘-盘高-盘低-收盘)图表,这篇文章包含复制下面图表的代码:
The Campbell Soup Company OHLC chart created with Plotly
有几种图表可以用来分析时间序列数据。一个对价格数据有帮助的是跨周期图表。Campbells 的年度价格图表如下:
Campbell’s Year Over Year Price Change in monthly intervals
在 2016 年和 2017 年,金宝汤的名义调整后月度股价相对较高,就像我们在 OHLC 图表中看到的那样。今年的同比图表没有很好地揭示趋势,因为我们处理的是名义价格,而不是增长率变化(见下文):
The year over year growth percentage for the Campbell Soup Company in monthly intervals
金宝汤的股票价格在八月到九月间持续增长,在二月到四月间持续下跌。应该进一步分析这些潜在的趋势。
结论
利用 Python,数据科学家可以为分析准备时间序列数据。Pandas 有基于附近日期的值来填充缺失值的方法。通过上面这样的可视化,我们可以看到是否有值得进一步研究的趋势。一旦发现趋势,就可以用它来预测未来的观察结果。
使用 VSCode 和 Jupyter 笔记本风格
原文:https://towardsdatascience.com/working-with-vscode-and-jupyter-notebook-style-5ecaf47f9f84?source=collection_archive---------22-----------------------
Jupyter Notebook style in VSCode
如果你是机器学习算法入门,你会碰到 Jupyter Notebook。为了最大化效率,您可以将其概念与 VS 代码集成。因为这需要对如何设置 Python 环境有所了解,所以本文将提供一个介绍。
有几个原因可以解释为什么在单独的 IDE 中开发算法是有意义的。尽管 Jupyter 笔记本很棒,但是一旦代码变得越来越复杂或者项目越来越大,将所有代码放在一个文件中就不太方便了。VScode 提供了强大的 Jupyter 支持,允许将 python 代码转换成 Jupyter 笔记本代码,反之亦然。
目录
- 设置本地 python 环境
- 设置本地 pyenv
- 用 pipenv 安装依赖关系
- 使用具有 jupyter 功能的 python 文件
- 转换 python 文件和。ipynb 文件
- 附加:在 Vscode 中预览笔记本(不推荐)
- 结论
- 关于
设置本地 python 环境
首先,您需要设置 python 环境。有许多方法来组织 python 包/依赖项。这对一个初学者来说太难了。查看这篇文章,它解释了安装和管理 python 包的当前标准。非常准确地说,Gioele Barabucci 在安装软件包时会出现以下问题:
-您有足够的权限安装该软件包吗?也许你需要使用 sudo pip。这听起来不对。
-您的应用需要 2.0 版的 foolib。您系统中的另一个 Python 应用程序需要版本 1.8。糟糕,API 冲突。
其他将安装你的应用程序的人将需要 foolib。你需要把它记录在某个地方,例如 requirements.txt 中。但是使用 pip freeze 将会记录你现在正在使用的 foolib 的确切版本。2.x 系列的任何版本都可以,但是没有简单的方法告诉 pip 这一点。
实际上所有这些都是没有实际意义的,因为你需要原生数据类型,而它们只在 Python 3.7 中可用。不幸的是,您的 Linux 发行版只提供 3.5 版本。
设置本地 pyenv
安装 pyenv 来管理 python 版本。检查文档以完成安装过程。
例如,你可以用pyenv install 3.7.0
安装 Python 版本。
设置本地 python 环境后,您将能够在 VSCode 中设置新的 python 环境:
select the interpreter
如果您在设置解释器时遇到问题,请查看 VScode 文档。
使用 pipenv 安装依赖项
之后你可以用pipenv install jupyter
安装 jupyter 包。选择了正确的环境后,您将能够在 VSCode 中开发 jupyter 单元。
使用具有 jupyter 功能的 python 文件
在 VSCode 中,您可以将 jupyter 功能用作 python 文件中的单元格。执行单元格或运行命令Run Current File in Python Interactive window
打开一个已执行的、类似笔记本的概览:
Run the cells like in Jupyter Notebooks
转换 python 文件和。ipynb 文件
VSCode 提供了将 python 文件(带有 jupyter 标记单元格)转换为 Jupyter 笔记本文件的功能。这样,您就可以将笔记本导入为 python 文件,并像平常一样运行单元格。
Convert Jupyter Notebook files into Python files
更多信息参见文档。
附加:在 Vscode 中预览笔记本(不推荐)
VSCode 有一个扩展,允许您显示*。ipynb 文件。它叫做 VS Code Jupyter 笔记本预览器。尽管在 VSCode 中显示完整的笔记本很好,但在编辑或更改任何东西时,都没有像在笔记本中一样的功能。所以这只是为了预览。
Source from the extension docs
当我使用这个扩展时,它干扰了我的 python 扩展。有一个问题是所有的 python 文件都不能重新加载了。卸载这个扩展再次为我解决了这个问题。参见此处讨论的相关问题。
结论
总的来说,我们可以看到在 VSCode 中开发 jupyter 风格的单元格是很容易的。它允许你使用 VSCode editor 提供给你的所有特性(比如片段,从而提供丰富的开发体验。也许在这种环境下开发对你来说也是有意义的,而不是把所有的东西都写在笔记本上。;)
You can support me on https://www.buymeacoffee.com/createdd
关于
我认为自己是一个解决问题的人。我的强项是在复杂的环境中导航,提供解决方案并分解它们。我的知识和兴趣围绕商业法和编程机器学习应用发展。我在构建数据分析和评估业务相关概念方面提供服务。
连接到:
- 领英
- Github
- 中等
- 推特
邮件
在西雅图不值钱?
原文:https://towardsdatascience.com/worthless-in-seattle-9300b3594383?source=collection_archive---------18-----------------------
或者,再见蓝色星期一
公平地说,我以前的经理是个有钱人。除了在我之前的公司担任董事之外,他还有一份利润丰厚的房地产兼职。鉴于他的计算机科学背景,他能够从房地产网站收集数据,并分析房子的属性如何影响其价格。因此,他可以识别相对于预期被严重低估的资产,明智地投资,并在转售时获得可观的利润。
因此,一段时间以来(或者至少从他第一次带我去他在伦敦市中心的两个私人会员俱乐部中的一个开始),与房地产销售的黑暗世界相关的任何类型的数据科学的商业案例对我来说都是显而易见的。
The Skyneedle — probably an outlier in King County’s property market…
我们在这里考虑的数据集是华盛顿金县的房产销售,它从西北部的西雅图延伸到东部的 Okanogan-Wenatchee 国家森林。这篇博客将探讨我们如何清理这个数据集,以期执行一个多变量线性回归模型来预测房地产的价格。
这项工作的 github 库可以在这里找到。
第一步。检查和理解数据
我们可以使用 Pandas 库导入数据(以 csv 文件的形式提供给我们),并使用。info()方法。
df = pd.read_csv(‘kc_house_data.csv’)
df.info()
这里的关键要点是:
- 我们有 21597 个观察值(每个代表一个销售交易),所以这是一个不错的样本量。
- 数据是完整的,除了“海滨”和“yr _ renovated”栏。我们将需要调查这些,看看我们是否能填补空白。
- “date”应该具有日期时间类型,以便于进一步分析。此外,“sqft_basement”具有“object”类型,这是我们不希望的(这应该是一个浮点数或整数)。这需要调查。
- 许多列标题都是不言自明的,尽管这并不普遍。我们可以利用(相当不错的) King County 网站来更好地了解等级和状况等属性。
- 我们可能需要对数据集做进一步的研究,以掌握“视图”等属性,这些属性的含义并不明显。
在继续之前,我们还应该通过检查下面的代码返回 0 来检查我们没有重复的数据。
len(df[df.duplicated()])
第二步。调查不完整的数据
我们检查“waterfront”和“yr _ renovated”列,查看我们的行中有多少部分包含至少一个 NaN 值。
len(df.loc[(df[‘yr_renovated’].isna()) | (df[‘waterfront’].isna())]) / len(df)
这会返回 27% —数据集的一个大块,太大而无法彻底删除。让我们依次研究这些列,看看我们是否可以更加细致入微。首先看一下 renovation 列,让我们通过查看最常出现的值来感受一下数据。
df.groupby(by = ‘yr_renovated’)[‘yr_renovated’].count().sort_values(ascending = False).head()
因此,我们看到,除了缺失值之外,还有 17,011 行的“0”是最后一次翻新的年份。这表明房子从未翻修过,或者更有可能的是,没有相关数据。我们可以放弃这个专栏——鉴于这里未知的份额,它不会提供洞察力。
df.drop(‘yr_renovated’, axis = 1, inplace = True)
我们现在检查“waterfront”列,发现只有 11%的行有 N/a。
len(df.loc[(df[‘waterfront’].isna())]) / len(df)
这是示例中足够小的一部分,我们可以使用。dropna()方法。
df.dropna(inplace=True)
第三步。修复数据类型
当我们开始进行探索性分析时,确保数据被转换为最合适的类型是非常重要的——当我们试图使用甚至基本的函数时,错误类型的数据可能会引发错误(当然,计算字符串的平均值在概念上是不可能的)。
使用 to_datetime()方法可以很容易地处理日期列:
df[‘date’] = pd.to_datetime(df[‘date’])
这种格式将允许熊猫识别日期的星期几、月份数,并将使该功能“有序”——即我们将能够按时间顺序排列日期。
“sqft_basement”功能当前是“object”类型,这表明我们可以在列中使用字符串条目作为占位符。让我们看看最常见的值。
df.groupby(by = ‘sqft_basement’)[‘sqft_basement’].count().sort_values(ascending = False).head(4)
它看起来像问号“?”条目是给我们带来麻烦的原因。我们需要删除它们,但理想情况下,我们会用值来替换问号,而不是简单地删除行。
令人高兴的是,我们可以从总居住空间和“上面”居住空间之间的差异来计算地下室面积,这在“sqft_living”和“sqft_above”列中给出。
我们可以编写代码来隔离“?”的索引基础值,并用此计算替换它们。
for i in list(df.loc[df[‘sqft_basement’] == ‘?’].index.values):
df.loc[i,’sqft_basement’] = df.loc[i,’sqft_living’] - df.loc[i,’sqft_above’]
完成这些后,我们可以将列转换为浮点数。
df[‘sqft_basement’] = df[‘sqft_basement’].astype(‘float64’)
第四步。寻找异常值
而最后几个步骤是相当客观的(一个地下室不可能有?平方英尺),处理异常值需要更多的细微差别。完全有理由问:如果没有客观的方法来识别和消除离群值,那么为什么要做这一切呢?这个答案真正触及了我们正在做的事情的核心。
最终,我们需要决定我们希望我们的模型做什么。这通常包括在模型精度和模型范围之间进行权衡。换句话说,你想要:
- 一个非常 精确的模型,涵盖一个种类广泛的物业类型,或者:
2.一种精确的模型,涵盖非常广泛的财产类型。
通常,我们会选择第一个选项——更好的预测是我们所追求的,即使这意味着缩小一点范围。
那么我们如何选择丢弃什么呢?考虑到我们变得有点主观,我们可以从视觉上思考这个问题。特别是,直方图将显示长尾(例如,非常昂贵的属性)。
我们可以得出结论,超过 7 间卧室、超过 5 间浴室或超过 30 万平方英尺的房子不太可能代表样本。类似地,根据上面的直方图,售价超过 100 万美元(实际上是 10 万美元)的房产容易扭曲模型。
看看市场的低端——我们只能看到 21 栋 3 级或 4 级的房子(小木屋或不符合建筑标准的房子)。这些不太可能有代表性。我们也可以假设一处房产应该至少有一间浴室。
我们可以从数据集中删除这些房子。
to_drop = df.loc[(df[‘bedrooms’] > 7) | (df[‘bathrooms’] > 5) | (df[‘bathrooms’] < 1) | (df[‘sqft_lot’] > 300000) | (df[‘price’] > 1000000) | (df[‘price’] < 100000) | (df[‘grade’] < 5)].indexdf.drop(to_drop, inplace = True)
与此同时,显示经度和纬度的散点图可能会显示地理异常值,但这并不代表更广泛的样本。我们可以使用熊猫内置的散点图来显示价格。
ax = df.plot.scatter(‘long’,’lat’,c = ‘price’,cmap = ‘cool’, alpha = 0.6, figsize = (10,8), grid = True);
请注意我们如何将这种分散与金县的实际地图联系起来。注意图表右上角(东北)的点。根据下面的地图,这些似乎对应于巴林、葛洛托或斯凯科米什。
当然,我们可以将这些城镇的房屋销售留在数据集中,但它们相对于其他房产在地理上是如此孤立,因此它们可能不具有代表性。计算出该组的经度和纬度范围后,我们可以用通常的方法删除这些行。
far_east = df.loc[df[‘long’] > (-120–1.69)]
df.drop(far_east.index, inplace = True)
当然,我们可以对数据集设置任意数量的限制来剔除异常值。但是这些看起来是明智的步骤,可以确保我们在进行回归时,结果不会有偏差。
这件衣服适合我吗?
原文:https://towardsdatascience.com/would-this-clothing-fit-me-5c3792b7a83f?source=collection_archive---------13-----------------------
了解机器学习如何用于向顾客推荐合适的服装尺寸
介绍
谁不爱网购?这是方便的,提供了广泛的产品选择,我们得到了很大的交易。零售商也受益于互联网提供的覆盖范围,并有机会建立自己的品牌。因此,网上时装业近年来出现了巨大的增长。然而,网上购物仍然很棘手,因为不同品牌的衣服尺码差异很大,这使得顾客很难找到合适的衣服。对于消费者来说,这会导致糟糕的购物体验,因为他们可能不得不退货,而对于零售商来说,这会导致金钱损失。
因此,自动提供准确和个性化的试穿指导对于改善在线购物体验和降低产品退货率至关重要。
先决条件
这篇文章假设读者熟悉以下概念。在继续下一步之前,您可以通过相关链接了解这些内容。
- 潜在因素模型
- 随机梯度下降
- 有序回归
- 铰链损耗
目标
我们知道,任何服装产品都有许多不同的目录尺寸。如今,许多在线零售商允许客户在退货过程中或留下评论时,对所购产品提供合适的反馈(如Small
、Fit
或Large
)。
为了进行区分,我们将一个产品(例如 Northface 夹克)称为“父产品”,而将它的不同尺寸(例如小型/中型 Northface 夹克)称为“子产品”。
假设我们有交易数据,其中每笔购买可以表示为(customer
、child product
、fit feedback
)的三元组,我们可以陈述我们的目标如下:
从顾客对购买的
child
产品的反馈中了解顾客的合身偏好和child
产品的尺码相关属性,以便向顾客推荐更合身的产品尺码。
数据集
在前一节定义目标时,我们假设我们有表单(customer
、child product
、fit feedback
)的事务数据。对于任何在线零售商来说,建立这种数据集都很容易,但对我来说却不是这样。
在网上进行大量搜索后,我发现了 ModCloth 和renttherrunway网站,它们提供了解决这个问题所需的数据信号。这些数据集包含顾客自我报告的合身度反馈以及其他附带信息,如评论、评分、产品类别、目录尺寸、顾客测量值等。我使用 python 的 Selenium 包提取了数据集,并作为我研究的一部分公开发布了它们。你可以在他们的页面上了解更多。
它开始的地方
我们试图解决的问题是由亚马逊印度的研究人员在 2017 年提出的产品尺寸推荐问题。他们专注于创建一个向顾客推荐鞋号的模型。由于鞋子的合适性可以通过 1 或 2 个维度(长度和/或宽度)来判断,从建模的角度来看,这是一个很好的起点。那么,我们先来了解一下他们提出的模型。
简单的模型
对于每一个客户和子产品,我们考虑一个潜在的变量,并说它表示他们的真实大小。
由于不同品牌之间的尺寸差异,子产品的实际尺寸可能与零售商指定的目录尺寸不同。如果我们能够知道真正的尺寸,那么所有子产品的尺寸都将是相同的,这反过来会使测量适合度变得更容易。
假设***u_c***
表示客户 c 的真实尺寸,而***v_p***
表示子产品 p 的真实尺寸。直观上,如果有一笔交易( c , p ,Fit
),那么真实大小***u_c***
和***v_p***
一定很接近,也就是说,|***u_c***
-***v_p***
|一定很小。另一方面,如果有一个事务( c , p ,Small
),那么客户的真实大小***u_c***
一定比子产品的真实大小***v_p***
大得多,或者说,|***u_c***
-***v_p***
|一定很大。最后,对于( c , p ,Large
)类型的交易,***v_p***
-***u_c***
必须是大的。
为了量化子产品对客户的适合度,将每个交易 t 的适合度分数定义为:
equation 1
其中 w 为非负权重参数。由于该拟合分数是连续的,并且最终目标是基于该拟合分数将交易分类为三个拟合类别之一,研究人员使用 有序回归 进行建模。
从概念上讲,我们定义了两个阈值参数
***b_1***
和***b_2***
,它们将连续标度分成对应于三个拟合等级的三个部分。我们可以给这种划分赋予意义,使得大于***b_2***
的拟合分数对应于*Small*
,小于***b_1***
的分数对应于*Large*
,并且在***b_1***
和***b_2***
之间的分数对应于*Fit*
。对于这三个部分中的每一个,我们可以认为大于阈值的分数在正面类中,小于阈值的分数在负面类中。解决这三个二进制分类问题将告诉我们一个事务属于哪个类。
为了学习潜在变量***u_c***
和***v_p***
,我们现在只需要两件事情:一个损失函数优化和一个优化技术。亚马逊作者使用 铰链损失 用于序数回归中的每个二元分类问题。已知铰链损失最大化分类器的决策边界之间的余量。因此,任何交易的目标函数 t 都可以写成:
equation 2
总损失只是每笔交易的损失之和,当任何交易具有合适的结果***Y_t***
、***Y_t*** = Large
的***f_w*(*t*) *> b_2***
、***Y_t*** = Small
的***f_w*(*t*) *< b_1***
和***Y_t*** = Fit
的***b_1 < f_w*(*t*) *< b_2***
时,总损失最小。作者使用随机梯度下降来优化目标。
预测和建议
由于在模型的离线评估中推荐产品是不可能的,作者考虑模型预测看不见的交易的拟合结果的能力作为模型推荐性能的代理。为此,他们将学习到的客户和子产品的潜在特征输入标准分类器,如逻辑回归分类器和随机森林分类器,以产生合适的预测。
挑战
尽管上述模型在鞋子数据集上运行良好,但它可能不够灵活,无法解决以下挑战:
- 像连衣裙和衬衫这样的服装产品具有相对更多的尺寸来确定是否合身。此外,对于不同的产品类别,每个顾客的合身偏好可能会有所不同,例如,顾客可能更喜欢宽松一点的夹克,而湿西装则更合身。因此,每个子产品和客户的单个潜在特征可能不足以捕捉数据中的所有可变性。
- 由于大多数交易被报告为
Fit
,因此客户的适合度反馈分布不均匀,因此很难了解购买何时不是Fit
。标准分类器不能处理标签不平衡问题,并导致有偏的分类,即在这种情况下,Small
和Large
类将具有较差的估计率。
如何才能提高?
在我们的研究工作中,我们应对上述挑战。为了应对第一个挑战,我们考虑了每个客户和子产品的多种潜在特性。直观地说,这使我们能够捕捉顾客对不同产品方面(如肩部、腰部等)的合身偏好。).为了解决第二个挑战,我们借助原型的度量学习技术。下图概述了该框架:
让我们深入研究一下方法论。
学习适合的语义
为了对 fit 的语义进行建模,我们使用潜在因素模型公式(最终帮助我们从数据中提取更多信息特征)来分解 fit 反馈信号。为此,我们将拟合分数定义为:
equation 3
其中下标 pp 表示父产品,和 v 是 k 维潜在特征, α 是全局偏差项, ⊕ 表示串联,表示元素式产品。偏见术语***b_t_pp***
表达了这样一种观点,即某些母产品由于其固有的特征/构造而更容易被报道unfit
,而偏见术语***b_t_c***
表达了这样一种观点,即某些顾客对合身性高度敏感,而其他顾客可能更容易适应。**
虽然我们将能够从这个公式中学习到好的特性,但一个棘手的问题是,同一父产品的不同目录大小的拟合分数之间的顺序不能保证是一致的。这会使我们的模型变得无用。
我们希望,如果一个客户的子产品是Small
(分别是Large
),那么相应父产品的所有较小(较大)尺寸也应该是Small
( Large
)。
注意equation 3
,我们看到父产品 pp 和客户 c 的适合度分数仅根据子产品的潜在特性***v_p***
而变化。因此,为了解决这个问题,如果存在一个更小(更大)的目录产品【p-(p+)的潜在特征,强制要求子产品 p 的所有潜在特征严格大于(更小)下一个更小(更大)的目录产品【p-的潜在特征就足够了。****
既然我们已经公式化了事务的适合度,我们可以将我们的目标函数写成如下:
equation 4
这类似于equation 2
,只是我们改变了拟合分数的定义并增加了单调性约束。我们可以使用投影梯度下降来优化该目标,该目标类似于随机梯度下降,不同之处在于每次更新后都会强制实施约束。
处理标签不平衡
为了处理标签不平衡问题(即Fit
标签的数据量比Small
和Large
多得多),我们求助于一种结合原型的度量学习技术。
原型技术的目标是从可用数据中创建一定数量的“原型”,使它们能够代表数据。原型可以是数据集中的一些关键数据样本,也可以是几个数据样本的组合。通常,创建的原型数量远远少于数据集中的数据样本数量。
简而言之,我们提出的原型技术首先通过从不同的类重新采样来改变训练数据的分布,这被证明在处理标签不平衡问题上是有效的。随后,我们采用大间隔最近邻 ( LMNN )度量学习技术,该技术通过将具有相同 fit 反馈的事务移动得更近而具有不同 fit 反馈的事务移动得更远来改进局部数据邻域,从而帮助 k-NN 方法更好地分类。形象地说,这个过程可以描述为:
度量学习技术
度量学习的目标是学习距离度量 D 使得 D ( k ,l)>D(k, m ) 对于任何训练实例 (k,l,m) 其中事务【T24 在这项工作中,我们使用 LMNN 度量学习方法,除了使同类事务更接近之外,还旨在保持不同类事务之间的差额。这最终改进了分类。具体来说, LMNN 通过以下方式做到这一点:**
- 识别每个事务的目标邻居,其中目标邻居是那些期望最接近正在考虑的事务的事务(即,来自同一类的事务)。
- 学习输入空间的线性变换,使得在变换空间中事务的结果最近邻居确实是其目标邻居。 LMNN 中的最终分类然后通过在变换(度量)空间中应用 k -NN 给出。 LMNN 使用的距离度量 D 就是 马氏距离 。
样机研究
LMNN 中的一个警告是,它在运行之前为每个事务固定 k 目标邻居。这允许在本地定义约束。然而,这也使得该方法对欧几里德距离选择相关目标邻居的能力非常敏感。**
为了减轻欧几里德距离的这种限制并解决标签不平衡问题,我们开发了一种启发式方法,通过仔细地对事务进行采样来减少来自离群值和其他无贡献事务(如过于接近其各自类的质心或已经选择的事务)的噪声,从而为每个类提供良好的表示。
你可以从我们的研究论文中获取详细的算法。
实验和结果
实验装置
我们试验并比较了以下五种方法:
- 1-LV-LR :亚马逊提出的鞋号推荐方法,如上所述。
- K-LV-LR:1-LV-LR 的简单扩展,我们认为每个客户和子产品的潜在特征是 K 维度的。其他一切都保持不变。
- K-LF-LR :在“学习 Fit 的语义”一节中给出的建议潜在因素变化。我们将学习到的因素作为特征直接用于逻辑回归分类器,以产生合适的结果。
- K-LV-ML :该方法与 K-LV-LR 相似,不同之处在于它使用建议的度量学习方法,而不是逻辑回归,来产生最终的拟合结果。
- K-LF-ML :这是我们提出的方法。
这些方法旨在评估:
- 捕捉配合语义相对于真实尺寸的有效性。
- 学习良好潜在表征的重要性。
- 提出的度量学习方法在处理标签不平衡问题中的有效性。
结果
我们根据平均 AUC 指标来衡量所有方法的性能。平均 AUC 只不过是单个类的 AUC 分数的平均值。
从表中,我们观察到我们提出的模型大大改进了鞋号推荐模型( e 对)。这可以归因于学习真实尺寸的合身语义。我们还观察到 模块布 的改进相对小于 模块布 的改进。这可能是由于与renttherrunway相比 ModCloth 拥有相对更多的冷产品和客户(交易非常少的产品和客户)(参见数据集页面上的统计数据)。我们还注意到,当使用来自 K-LV 方法的表示( d 对 b )时,度量学习方法并没有显著提高性能。这强调了学习良好表达的重要性。最后,我们看到 K-LF-ML 在两个数据集上都大大优于所有其他方法。
除了学习良好的表示之外, K-LF-ML 的良好性能也可以归因于所提出的度量学习方法在处理标签不平衡问题方面的能力,如上面左侧图中所示。
此外,右侧图表描绘了 K-LF-ML 在冷启动和热启动情况下的表现。对于冷产品,我们注意到 K-LF-ML 的表现始终优于 1-LV-LR ,虽然它们的表现整体略差。当我们考虑事务较多的产品时, K-LF-ML 的性能提升很快,而 1-LV-LR 的性能只有在给定足够多的样本时才能显著提升。
结束语
希望这篇文章能很好地概述产品尺寸推荐领域的当前研究。你可以在我的这个 Github Repo 找到这篇文章中描述的方法的实现。这是一个非常实际的问题,需要很好地解决,并且有几个开放的方向。例如,进一步改进的一个方向可以是利用审查来提高模型的可解释性,因为目前很难理解每个潜在维度对应于什么。通过将语言模型与潜在因素模型相结合,为每个潜在维度(由相应的主题表示)赋予特定的含义,这是可能的,正如本文中所做的那样。如果你有其他改进的想法,请在评论中告诉我,我们可以讨论。
原贴@https://rishabhmisra . github . io/Would-This-Clothing-Product-Fit-Me/
如果你喜欢这篇文章,并对我未来的努力感兴趣,可以考虑在 Twitter 上关注我:https://twitter.com/rishabh_misra_
你会从这个人那里购买见解吗?
原文:https://towardsdatascience.com/would-you-buy-insights-from-this-guy-1a3054574bda?source=collection_archive---------28-----------------------
如何评估和管理数据科学供应商
“你需要做的第一件事是把所有的数据放在同一个地方”。我们都记得启动了一千个痛苦的 IT 项目的咒语。理由是这将实现“360 度客户视角”或“数据驱动”决策。在数百万美元和多年的实施之后,许多公司很难量化这些计划的商业利益。这里最能说明问题的是,这些努力应该是“支持”分析,而不是提供价值。
从数据科学的角度来看,“数据第一”企业是被误导的。首先,有无限量的有用数据。其次,严格的数据科学自上而下地工作,从目标数据到相关数据。因此,您必须做的第一件事是定义一个业务目标和指标。
一种新的江湖骗子出现了,他正在出售可操作的见解——就像明胶一样有形。我们现在进入人工智能炒作泡沫已经有几年了。每一家咨询公司、系统集成商、IT 公司、软件提供商,甚至是税务和审计公司,现在都声称自己是专家。他们都声称占据了魔力象限中的黄金地段。当专注于交付价值时,一个构思良好的数据科学项目应该能够在 6 个月内实现收支平衡。你如何筛选数学、可视化和魔术演示来选择一个能够实现这一承诺的分析伙伴?
在本文中,我们认为分析与任何其他业务努力没有什么不同,可以相应地进行评估和管理。本文为这两个阶段都提供了建议。第一部分强调了在提案阶段鉴别和评估供应商的关键问题。第二部分重点介绍了成功管理项目的一些最佳实践。
1。 供应商尽职调查
问的第一个问题应该很明显:“他们独特的价值主张(UVP)是什么?”然而,许多供应商很难给出一个可信的答案。他们有唯一的数据源吗?他们有经过验证的分析资产吗?他们能够轻松集成和评估第三方数据的价值吗?他们有稳定的经验丰富的世界级科学家吗?
大多数大型组织依靠惯性运行。他们还倾向于只重视自己知道的东西,这导致他们将传统实践与数据科学混为一谈。如果他们的传统做法是销售大型机,他们现在正在推动云。系统集成商和咨询公司继续销售复杂的集成和咨询服务。四大倾向于销售商业智能和报告工具。其他人在卖“平台”。人们熟悉的说法是,“你首先需要这些东西;数据科学可以在以后添加进来。”这种推销有一个方便的附带好处,即基础设施、BI、计算资源、平台和软件工具不一定要根据业务价值或 ROI 来论证。可能需要很多这样的东西,但是它们的成本应该通过经验分析来证明,换句话说,就是数据科学。
领导层实际上拥有数据科学专业知识吗?许多公司只是将他们的服务和员工重新命名为“数据科学”所以,索要凭据并不失礼。试着在 Linkedin 或谷歌学术上查找他们的资料。令人惊讶的是,有多少组织实际上没有科学家,或者声称“在海外某个地方有一群数据科学家。”
在一次富有启发性的采访中,一位 Big 4 人工智能高级合伙人承认,他的团队没有数据资产,没有分析资产,没有数据科学家,两年内只有一个成功的咨询项目。他继续吹嘘说,他从未雇佣过超过 26 岁的数据科学家。他的业务主管甚至没有大学学位。在一次晚宴上与整个团队会面时,人工智能的全球负责人向我们讲述了科学家在社交方面有多么笨拙的故事。当被问及他的公司如何与其他供应商竞争时,他解释了自己的策略:“我们是值得信赖的专业服务合作伙伴。我们已经融入了他们的业务。我们也可以做他们的数据科学。”显然,他们的主要 UVP 是胆大妄为。
与当前的时代精神相反,该行业并不缺乏技能或初级资源。但是,对底层数学有深刻理解并有成功的数据科学解决方案记录的领导者肯定是缺乏的。大多数项目还需要现场工程主管,即直接与业务和运营主管合作的人员,以捕获流程流和业务约束、IT、决策点以及输入和结果数据的最终来源。没有人希望通过中介、跨时区等方式运行项目。它增加了大量的混乱、延迟和开销,并使交付面临风险。
他们的提案是否足够详细,可以进行技术评估?供应商的方法需要在技术上可信且可行。如果他们不能解释他们的技术,你为什么要相信他们?如果供应商通过引用专有知识产权来逃避细节,就没有“那里”。在 15 分钟的对话中就能被窃取的知识产权并不令人印象深刻。
此外,提出的特定算法可能与您的业务问题相关,也可能没有价值。“神经网络”是一个真实的东西,经过几十年的研究,已经得到了很好的定义。“自然语言处理”简单地意味着“我们从文本中提取信息”,可以指像关键字匹配这样简单的技术。“认知”是一个形容词。
合理的技术方法是成功的必要条件,但当然不是充分条件。例如,商业上成功的欺诈检测解决方案采用了各种各样的高级算法,包括异常检测、网络分析、图论、聚类分析、数论、决策树、神经网络、线性规划和卡尔曼滤波。图 1 比较了两种实时欺诈解决方案的性能。现有的解决方案(蓝色)结合了专家规则和优化的决策树。挑战者解决方案(黄色)结合了时间信号处理、NLP 和神经网络。(第三种方法,使用认知线性规划解决方案,未能改进传统解决方案,因此被淘汰出局。)challenger 解决方案的统计性能几乎是前者的两倍,这直接转化为欺诈损失或运营成本的 100%降低。所有这三种方法都有可靠的分析和理论基础;判断哪种方法更好的唯一方法是经验测试。
Figure 1: Performance Comparisons: don’t leave home without it
在他们的案例研究中,有投资回报率或统计性能比较吗?没有任何借口可以不报业绩。数据科学意味着对业务问题采取一种规范的、经验主义的方法。相对于 BAU 实践的性能和商业利益可以直接根据数据计算,或者如果必要的话,在冠军/挑战者现场展示中测试。
案例研究是基于真实的客户数据进行的吗?这个问题应该引起警惕,但市场上数量惊人的解决方案从未在真实数据上测试过,或在辅助或不相关的数据集上开发过。对于数据科学家来说,这简直是不可思议的,但基于“合成数据”的解决方案在传统软件公司中很常见,因为历史上的重点一直是建立标准化的 API,而不是从数据中提取价值。许多公司甚至无法安全地访问他们的客户数据,因此根本无法验证他们的解决方案是否能够带来价值。这种系统通常本质上是规则引擎,并且会严重限制下游决策技术的复杂性和价值。
他们能提供参考网站吗?一个令人沮丧的事实是,客户并不总是愿意作为参考网站。鉴于一些项目的敏感性,这是可以理解的。然而,如果一个有前途的供应商没有“Alpha”部署,并且其技术方法和团队看起来可信,那么您就有一个独特的机会来协商价格。作为一个公共参考网站和数据研究的权利都是资产,交易服务。签订联合开发协议可以让您以折扣价开发定制的新功能。在许多大型咨询公司,数据科学团队多年来一直处于亏损状态,他们渴望公开证明自己的财富,并获得真实数据集以进行研究和产品改进。
1.供应商管理最佳实践
理想情况下,数据科学项目应产生三个交付成果:诊断、价值证明和实施计划。应召集一个指导委员会来审查项目过程中的每项交付内容。
建立指导/审核委员会。从一开始,项目就应该由主要利益相关者(通常是损益表所有者、业务线或产品所有者、运营主管和分析主管)组成的常务委员会进行监督。内部 IT 团队领导可以进行尽职调查,但 IT 部门通常不具备数据科学技能,如果他们不了解任务或正在使用的技术,无论多么微不足道,他们都可能“耗费”一个项目(夸大实施成本估计)。通过不合作,分析团队可以主动或被动地破坏客观测试。另一种方法是聘请第三方顾问对供应商进行尽职调查。
定义业务目标和绩效指标。工程目标应尽可能由业务指标(利润、收入、成本、损失、发生率、转换率等)来定义。).清晰的指标还简化了尽职调查,为供应商建立了具体的客户期望和“成功标准”。两个糟糕的概念验证目标选择的例子是预测客户流失或创建客户细分。这些努力都没有任何直接的商业利益。(流失模型只是预测你会失去某些客户,而不是如何应对。)这两个用例都可以由中等技能的分析师快速交付;因此,这两个用例都不能作为对供应商能力或技术的有力测试。
任何业务成果或 KPI 都可以作为目标,如果可以衡量,就可以预测。在完整的数据诊断中,当前和潜在数据源的信息价值可以根据这些指标来衡量。即使是“可能的艺术”概念验证的价值也可以简单明了地用成本降低或确定的收入机会来表述。
在项目早期安排一次“可行/不可行”的评审。“没有计划能在接触数据后存活”,这句从克劳塞维茨那里借来的格言很少被证明是错误的。在提供数据访问权限的 2-3 周内,应安排中期审查,以审查初步结果。此时,供应商应该能够验证目标是否得到数据支持,并提供最低性能保证。另一方面,在分析过程中,供应商可能已经发现并推荐了备选目标和优先级。
这份初步报告,有时被称为“诊断”,或“规模和机会分析”,其本身应被视为可交付成果。通常,对效率、性能驱动因素和根本原因的深入实证分析会产生政策和流程的增值建议,而不需要预测性分析解决方案。从这个意义上来说,这种“可操作的见解”是数据科学项目的额外附带收益。虽然不能保证这种“快速修复”存在,但实施这些建议的好处通常会超过整个项目的成本。
审查结果后,指导委员会可以决定中止项目,重新承诺或重新确定目标的优先顺序,并创建一个计划来利用和测试迄今为止的学习成果。从这一点开始,该方法是否会交付价值应该是毫无疑问的;应该只有关于收益的大小和实施成本的问题。
最后,小心昂贵的实施计划。预先,有时仅估算指示性实施成本,因为在构建原型的过程中会发现或确定许多约束条件、数据和基础架构要求。无论供应商是销售 SaaS 平台,还是在内部安装,都应尽早为扩展功能的成本制定合理的规定,包括安装第三方和内部解决方案的能力。
一些公司将试图在这个阶段通过过度销售平台和基础设施来收回成本。一些行业严重依赖几十年前的决策引擎。替换这些系统是一个昂贵的提议,并且对于数据科学交付来说通常是不必要的。一个与基础设施无关的评分引擎可用于创建客户决策,而这些决策又可以“推”入传统决策引擎,作为表格加载到数据库中,或输入到现有的 BI 工具中。这种微创方法与生产数据流或记录系统并行工作,是实现价值的最快途径,也是成本最低的途径。增强和添加功能相对容易,因为数据科学交付团队拥有引擎的持续所有权。
数据科学的潜力继续被考虑不周的计划和伪装者稀释。成功的关键是进行严格的尽职调查,定义业务问题,建立明确的衡量标准,并进行价值验证。这些山里有金子,但要小心你选择的勘探对象。
Russell Anderson(交易分析咨询总监)在金融服务、零售、电子商务和生物医药行业开发数据科学解决方案方面拥有 30 多年的经验。他曾担任多家著名分析公司的科学顾问,包括 IBM、KPMG、Opera Solutions、NICE/Actimize、HCL、HNC Software、Mastercard Europe、JP Morgan Chase 和 Halifax Bank of Scotland。他拥有加州大学生物工程博士学位,发表了 30 多篇科学论文,并拥有多项商业预测解决方案专利。
欢迎提问/评论:anderson.transactionanalytics@outlook.com
你会让电脑选择你的衣服吗?
原文:https://towardsdatascience.com/would-you-let-a-computer-select-your-clothes-9d3e39b3005e?source=collection_archive---------22-----------------------
一个 AI 风格的盒子
不久前,人们普遍认为人们不会在网上买衣服——当然是书和 DVD,但不是你习惯看到、触摸和试穿的东西。然而现在,亚马逊是美国第二大服装零售商,最新的趋势是超越网上购物,现在是让算法为你购物。我不经常谈论时尚,因为我对它知之甚少,而且更喜欢坚持我对技术感兴趣的正常领域。但随着一项名为 Stitch Fix 的新服务(针对英国)的推出,这两个领域发生了碰撞,最终为像我这样的时尚挑战以及时间紧迫但有时尚意识的人带来了一些希望。
Stitch Fix 已经在美国获得了超过 300 万的活跃用户,现在可以在英国使用,这是它的第一次海外扩张。注册并完成你的个人资料不到 10 分钟,几天后,一箱由 Stitch Fix 的算法为你单独挑选并由他们(目前)的一位人类造型师精制的衣服会送到你的门口。对于懒惰的购物者或那些想得到私人购物者的建议但负担不起的人来说,Stitch Fix 是最方便的,还增加了一点时尚建议。
The kinds of questions that help Stitch Fix profile you
我的第一个盒子(或者他们称之为我的第一次“修复”)是成功的。尽管我对让算法向我推荐商品并不陌生,但我还是有点犹豫地打开了盒子——它们真的能挑选出我喜欢的衣服吗?作为算法的胜利,他们为我选择的一切都是合适的,是一个非常恰当的选择。(你可以要求他们突破你的风格界限,送你一些超出你正常衣柜舒适区的衣服)。如果你不想保留他们寄给你的所有东西,有一个免费的信封。我特别欣赏指导我如何组合物品的额外的风格建议。
我们购物的方式和地点正在迅速变化,Stitch Fix 是影响每个行业的不懈追求便利的又一个例子。我敢肯定,下一步 Stitch Fix 将与谷歌助手或亚马逊的 Alexa 合作,这样订购就像“嘿,谷歌,我想要一些新衣服”一样简单。在那之后,我想象我的谷歌助手将很快扫描我的日历,看到我可能需要一套新衣服的活动,并与 Stitch Fix 协调,及时为我找到另一个适合活动的修复。但是现在,您可以根据需要订购新的修复程序,或者安排每月或每季度更新一次。
“[我们的顾客]来找我们是因为他们不想去购物。五年后,人们会说,‘还记得我们不得不逛商场寻找自己的东西吗?“这太疯狂了!”"
Eric Colson,首席算法官,Stitch Fix
也许带有一点自私的夸张,Stitch Fix 表明,在未来的几年里,我们曾经去服装店寻找我们喜欢的商品,这将显得很奇怪。算法可以在瞬间评估数百万件商品,并非常准确地将它们与我们的偏好匹配起来。我知道很多人喜欢购物,如果把购物委托给一个看不见的分派箱子的算法,他们会感到震惊。但是,箱子出现在你家门口的纯粹便利性,以及合理的价格、优质的衣服和准确的选择,可能会让相当多的人依赖这项服务来购买他们的大部分衣柜。所需要的只是对网上购物感觉如何的另一个小小的信念飞跃。
用线性回归破解 Ames 住房数据集
原文:https://towardsdatascience.com/wrangling-through-dataland-modeling-house-prices-in-ames-iowa-75b9b4086c96?source=collection_archive---------6-----------------------
在数据世界里争吵
预测和统计推断的回归模型
Image of Ames, Iowa by Tim Kiser from Creative Commons
埃姆斯住宅数据集(2011)的特征丰富性既诱人又令人困惑。当试图揭示其模式时,很容易被其丰富的特征所吸引。首先,了解艾姆斯数据集符合历史悠久的 特征定价法 来分析房价是非常有用的。一些领域知识会有很大帮助。
我之前学过一些详细的统计学/计量经济学。认识到“大数据”革命并被其前景所吸引,过去几个月我一直沉浸在编码和机器学习中。正是在这个过程中,我遇到了埃姆斯住房数据集。我结合了传统的计量经济学研究和机器学习工具。
我选择坚持使用透明的线性模型,在这种模型中,预测和统计推断的目标可以一起追求。这意味着运行普通最小二乘法(OLS)、岭和套索回归模型。请注意,我进行的分析是基于完整的原始 Ames 数据集,而不是数据集的 Kaggle 版本。
特征定价法
在计量经济学研究中,人们试图站在该领域前人的肩膀上拓展研究视野。没有哪两栋房子是完全相同的,特征价格模型的基本思想是特定社区和特定单元的特征有助于决定房价。
因此,重温一下影响房价的常见疑点是有用的。如果因变量(或目标变量)是销售价格,那么在其他条件不变的情况下,房子越大,价格自然越高。这应该和断言一个 18 英寸的披萨可能比一个 12 英寸的披萨更贵一样不言而喻。因此,资产规模度量将是关键变量,在 Ames 数据集中有几个这样的变量。一个更有趣的问题可能是,每平方英尺的价格如何以及为什么会因房屋而异,这就像问为什么某些比萨饼店能够收取更高的每片价格。房地产专业人士也倾向于关注每平方英尺(或每平方米)的价格,而不是整体价格。但这不是本文的目标。
任何一个购房者都会听说过这个表达“位置,位置,位置”,这也恰好是一个关于购房者的流行英国电视节目的标题,该节目已经连续播出了 19 年。因此,人们会认为社区“位置”和相关特征,如便利设施(如好学校、休闲设施)、交通网络(如地铁站附近)、社区美学(如绿树成荫的街道、漂亮的房子)以及社会经济声望等,会对房价产生影响。
另一组通常被认为对决定房价很重要的因素是房间的数量,尤其是卧室和浴室,以及厨房的条件。除此之外,房子的年龄和物理条件也很重要,建筑材料和任何结构改进也很重要。
影响房价的因素可以概括为房产大小、位置吸引力、附近的便利设施、房间数量、建筑材料以及建筑的年龄和条件。有了之前的研究,我开始使用 Python 分析数据。
数据清理&异常值
第一项任务是数据清理,一如既往。数据集最初有 2930 个观察值,我立即删除了三个变量,每个变量的观察值都不到 300。我认为很重要的“LotFrontage”(与房产相关的街道的线性英尺数)变量缺少 490 个观察值。当按照它们各自的“LotShape”类别分组时,我用平均“LotFrontage”来填充缺失的值。
Assign missing ‘LotFrontage’ by the mean value according to ‘LotShape’
然后,我绘制了因变量“销售价格”的直方图。很明显,它有极高的值(一个长的右尾),并且不是正态分布的。这表明该数据包含大量异常值。处理异常值可能很棘手,因为它们中的一些可能提供重要的信息,所以人们不希望过于宽松地定义异常值,然后将它们全部抛弃。****
Very skewed sale price target variable
鉴于物业规模指标的重要性,我迅速放大“GrLivArea”、“LotSize”和“GarageArea”作为潜在的解释变量。在美国,将地下室面积包括在房产面积中是不常见的。事实上,房利美(Fannie Mae)和 ANSI 的指导方针禁止在评估房产居住面积时计算地下室的面积,尽管人们可以想象这仍可能对房产价格产生一些影响。因此,我选择将地下室大小度量分开,并从其他地下室度量中构造了一个完整的地下室面积变量“BaseLivArea”。
现在是时候寻找离群值了。我分别在“SalePrice”、“GrLivArea”和“BaseLivArea”中寻找那些低于或高于各自平均值的 3 标准差的观察值。在“低于”类别中没有观察值,但是在所有三个变量的“高于”类别中有 66 个观察值。我从分析中删除了这 66 个观察值,约占样本的 2.3%。
然后,我查看了“SaleCondition”变量,它记录了每笔交易的销售类型,大多数观察结果属于“正常”销售类别,但有 218 个观察结果被记录为“异常”或“家庭”(家庭内部销售)。我放大了这些,注意到它们的平均售价和中值售价(以及每平方英尺的价格)都远低于整体样本。这促使我将这 218 笔不寻常的销售交易排除在分析之外。如果这些交易本质上不是主要的商业交易,那么将它们包含在数据集中会将偏差引入到试图估计住房特征和房价之间的经济关系的模型中。
“Abnormal” and “Family” transactions had mean values that were well below the average sale price
特征工程
我现在已经把观察次数从最初的 2930 次减少到 2617 次。然后,在对“销售价格”进行自然对数转换之前,我构建了一个变量来表示房产的年龄“年龄”。原木销售价格的直方图看起来更加对称,没有太多的极端值。得到的模型是一个对数线性模型,意味着是一个对数因变量,带有线性解释变量。**
Distribution of the log sale price is much more symmetrical
下一个问题是缺少一个位置合意性变量。“邻居”变量中列出了 28 个社区,但是不清楚如何对它们进行排序。根据每平方英尺的价格对这些社区进行排名,并以此作为位置合意性的衡量标准,这可能是显而易见的,但这种人为的构建自然会与房价相关联。这并不是一个好的研究方法,因为我们将构建一个部分由目标变量本身产生的复合特征变量。一个明显的位置合意性的代表是根据平均家庭收入对每个社区进行排名,但是数据集没有这样的可用数据。
Too many neighborhoods and difficult to tell many of them apart by the price distribution
处理这个问题的一个简单方法是把这 28 个街区虚拟化,然后把它们都扔进模型里。为如此大量的社区设置单独的假人的问题是:
- 对于某些街区,只有少数个观测值,其中 8 个不到 30 个观测值,在 2617 个样本观测值中,大多数不到 100 个;
- 在某些具有相似特征并因此具有相似房价分布的社区之间会有显著的多重共线性,正如在上面的剥离图中可以观察到的;和
- 如果一个人对统计推断感兴趣,那么在没有事先了解这些社区在合意性方面可能如何排名的情况下,他无法从这些假人中得出太多推断。
相反,我选择从数据集中的各种建筑质量和条件变量中构建一个序数邻域“位置”合意性变量,特别是“总体质量”、“总体成本”、“外部质量”、“外部质量”和“功能性”。我的方法背后的动机是假设一个社区越令人满意,它的住房结构和条件的质量就越好。
Crafting a “location” score out of the quality and condition variables
在没有额外信息或见解的情况下,我决定最好保持事情简单,只分配 4 个序数值用于“位置”合意性:1(低)、2(中低)、3(中高)和 4(高)。这 28 个街区按照它们的平均“位置”分数排序,我使用整体“位置”平均值将这些街区分为下半部分和上半部分。
平均“位置”值方便地将 28 个街区分成 14 个或以上的街区,以及 14 个以下的街区。然后,这两个组再次减半,这样,具有最低平均“位置”分数的七个邻域被指定为“位置”=1,随后的七个邻域被指定为“位置”=2,接下来的七个被指定为“位置”=3,剩下的七个被放置在“位置”=4。
完成这些任务后,我检查了每个“位置”排名的平均和中值“销售价格”和每平方英尺的价格,在“位置”得分和两个价格变量之间存在明显的正相关关系。这证实了所构建的“位置”变量可以是邻域合意性的良好代理。
‘Location’ ordinal variable has positive correlation to the sale price
这是练习中使用单个变量最多的工作。我还创建了年度虚拟数据,因为这些数据跨越了对美国房价产生重大影响的 2008 年金融危机。此外,我为四个区域中的每一个创建了四个假人(“分区”),一个假人靠近主干道或铁路线(“公路铁路”),一个假人靠近积极的便利设施,如公园(“便利设施”),一个用于车库(“车库”),一个用于平屋顶(“平屋顶”),一个用于高于一层楼的房屋(“两层楼”),一个用于地产地块的平坦轮廓(“平坦轮廓”)。
就室内机特有的特性(除了尺寸变量)而言,我选择了“总质量”作为顺序变量,“总长度”作为顺序变量,“卧室”代表卧室数量,“浴室”代表浴室数量,“壁炉”代表壁炉数量,“中央厨房”代表有中央空调,1 代表“卓越厨房”。
俗称【厨房卖房】,壁炉尤为可取。所以我们会看到。
回归分析
所得工程数据的相关矩阵显示,所选解释变量之间的相关性一般在+/-0.50 以下。唯一显示相关性大于+/-0.70 的解释变量对是“GrLivArea-浴室”对。“浴室”也分别显示了与“年龄”和“整体质量”的高相关性(超过 0.50)。因此,我决定从回归建模中去掉的“浴室”变量,以减少多重共线性。
在运行回归分析之前,工程数据被分割。 2010 销售数据被保留为保持测试集,而2006–2009数据被用于训练验证过程。
Separating the 2006–2009 data for train-validation, and reserving the 2010 data as the holdout test set
回归模型纳入了以下解释变量:年龄、GrLivArea、BaseLivArea、LowQualFinSF、车库面积、地段面积、地段临街面积、位置、卧室、壁炉、总面积、总面积、便利设施(虚拟)、道路轨道(虚拟)、两个仓库(虚拟)、平轮廓(虚拟)、平屋顶(虚拟)、车库(虚拟)、中央厨房(虚拟)、优秀厨房(虚拟)、Zoning_2(虚拟)、Zoning_3(虚拟)、Zoning_4(虚拟)和年度虚拟。
Splitting 2006–2009 data for train-validation procedure, and scaling them
目标变量是“销售价格”的自然对数。对于 2006-2009 年的数据,我使用了 70-30 的训练验证分割。在进行回归之前,解释变量也被标准化。训练验证集随后通过 OLS、岭和拉索线性回归模型运行。所有三个线性模型都提供了 0.91–0.92 的训练测试分数、大约 0.011 的 MSE 和大约 0.106 的 RMSE。****
OLS regression scores, MSE and RMSE
Ridge/Lasso regression scores, MSE and RMSE
因此,所有三个线性模型产生了相当一致的分数。这些系数在各个模型中也相当一致,如下所示。这些结果暗示了非常稳定的模型参数估计。模型系数暗示对 Ames 房价影响最大的六个因素依次为地上居住面积(正)整体品质(正)房龄(负)整体状况(正)地下室居住面积(正)和区位排名(正)。这六个变量在 95%的水平上也是统计显著的,我将在下面讨论。
Consistent coefficients across the OLS, Ridge and Lasso regressions
普通最小二乘回归假设残差相互独立,具有正态分布、均值为零和同伦方差。偏斜度和峰度表明误差分布近似正态,均值为零。残差图还表明,关于残差分布的各种 OLS 假设可能成立。完整的残差分析可以在我的 GitHub 页面上找到,文章底部有链接。
********
Residuals appear approximately normal and do not show a relationship with the target variable
坚持测试分数
在关键时刻,我在 2010 年的数据上测试了这个模型。从训练(2006 年至 2009 年的全部)数据来看,2010 年抵制测试集的 R 平方略有下降(0.9014 对 0.9160),但在 OLS、里奇和拉索模型中,得分再次相当一致。在维持测试集上,OLS 回归的 MSE 和 RMSE 分数分别为 0.012 和 0.110,再次显示出比上面的训练验证结果略有下降。****
OLS scores on the 2010 holdout set
Ridge/Lasso scores on the 2010 holdout set
残差也近似正态分布,均值为零。测试残差的分位数-分位数图** (qq-plot)特别显示了对正态分布的合理拟合。**
****
Residuals appear approximately normal and do not show a relationship with the target variable
统计推断
我利用2006-2010 年的全部数据集进行统计推断。这是为预测目的运行回归模型和为因果推断运行回归模型之间的主要区别之一。当我们为预测训练一个模型时,我们分割数据并分离一个测试集来评估模型预测的准确性(如上所述)。另一方面,在统计推断中,完整数据集通常用于得出参数估计值,并根据各种测试统计值进行评估。
该模型的 qq 图包含了 2006 年至 2010 年的全部数据,告诫人们不要过于乐观地使用该模型来预测房价。qq 图表明,该模型倾向于低估最高分位数的房价,高估最低分位数的房价。因此,虽然最终模型可以解释超过 91% (R 平方)的房价变化,但在处理价格范围的极端情况时,它并不可靠。该模型在针对价格在 25%-75%四分位区间的房产时最为有效。
q-q plot of the residuals for the full 2006–2010 data indicates some sizeable skews
至于准确计算各种解释变量如何影响房价,我首先需要计算个体系数标准误差和 p 值,以确定某个特定变量是否具有统计显著性。我还需要回到最初的非标准化解释变量。下面是来自 Statsmodels 模块的2006–2010 年全部数据的 OLS 回归结果汇总表。
OLS regression on full 2006–2010 unscaled data
可以看出,OLS 模型中的绝大多数解释变量在 95%的水平上具有统计显著性(即 p 值 < 5%),如单个 t 统计和相关 p 值所示。例外情况是“RoadRail”和“LowQualFinSF”变量。如上所述,对房屋销售价格影响最大的六个变量都具有统计学意义。
Transforming the log-linear coefficients back to their original units
提醒一下,模型是对数线性,其中目标变量是“销售价格”的自然对数。为了计算每个变量的单位变化对“销售价格”的影响,我们首先需要每个系数的指数。此外,对数线性模型的系数意味着目标变量的百分比变化对于解释变量的小单位变化。要获得具体的美元影响,最好使用平均值“销售价格”作为参考比较。****
Dollar impact of variables on “SalePrice”
左边的表格列出了每个解释变量的一个单位变化对埃姆斯平均房价的美元影响。为了简明扼要,我将只讨论那些在统计上有意义的变量。****
例如,住房单元的【年龄】增加一年,平均房价将减少 487 美元,,其他条件不变。相比之下,“位置”(记住这是一个四类有序变量)增加一个类别将使平均房价增加 6050 美元(第四个变量),所有其他因素不变。
此外,一个壁炉将使平均房价增加 4725 美元,而一个被评为“优秀”的厨房将使价格增加 13250 美元(第 19 和第 20 个变量)。****
所以确实“ 厨房卖房子 ”!
结论
基于从关于房价的享乐定价文献中获得的见解,我放大了各种房产规模指标,认为它们可能是回归模型的重要特征。我还对高度扭曲的房价目标变量进行了对数转换。
随后,对各种结构和内部因素进行了广泛的功能工程设计,这些因素预计将成为房价的重要决定因素,主要是位置合意性变量、分区模型、建筑质量和条件、便利设施的接近度以及高评级厨房等。工程数据然后通过三个线性回归模型** : OLS、里奇和拉索。**
在三个线性模型中发现了稳定的结果和分数。OLS 回归系数几乎与从岭回归和套索回归得到的系数相匹配。建模在训练验证集上实现了大约 91-92% 的 R 平方,这在 OLS、岭和拉索回归中是一致的。随后,它设法在 2010 年的维持测试集中获得了 90%的分数,MSE 和 RMSE 的分数分别为 0.012 和 0.110。不同算法的结果也是一致的。
各种房产大小变量,即内部居住面积、地下室完工面积、地段面积和车库面积,都被发现与销售价格正相关和统计显著。建筑质量和条件也被发现是房价最重要的决定因素之一,同样重要的还有位置吸引力。
实现这些结果不需要任何深奥的黑盒算法。仅仅是简单的线性回归,即透明且可解释的,并且其中的单个解释变量可能要接受假设检验。因此,预测和统计推断的目标可以一起追求。更重要的是,在模型 和 个体变量水平上,线性回归结果可以很容易地传达给外行观众。
(本练习的完整 Python 代码和数据可以在我的 GitHub 资源库中找到。如果直接渲染 GitHub 笔记本文件有问题,请使用 nbviewer 。)
如果你看到了阅读这些文章的价值,你可以在这里订阅 Medium来阅读我和无数其他作家的其他文章。谢谢你。****
*** [## 时间序列中的时间和季节性特征
以数据为中心,并在模型校准过程中包括季节性选项
towardsdatascience.com](/time-seasonality-features-in-time-series-7e8236f7b04a) [## 揭开股票价格背后的潜在因素
美国大盘股的动态因素模型
medium.datadriveninvestor.com](https://medium.datadriveninvestor.com/uncovering-the-hidden-factors-driving-stock-prices-2891a1b99024) [## 用预测概率处理不平衡数据
葡萄牙银行营销数据集的案例研究
towardsdatascience.com](/tackling-imbalanced-data-with-predicted-probabilities-3293602f0f2) [## 外汇市场的等级聚类
使用无监督的机器学习来识别行为货币群
towardsdatascience.com](/a-hierarchical-clustering-of-currencies-80b8ba6c9ff3)***
编写干净、可靠的 Scala Spark 作业
原文:https://towardsdatascience.com/write-clean-and-solid-scala-spark-jobs-28ac4395424a?source=collection_archive---------6-----------------------
编写可扩展和可维护的 Spark 作业的指南,这些作业提高了数据团队的生产力,并保证了更好的产品。
Photo by Andrew Ridley on Unsplash
由于新工具和数据平台的发展,现在通过编写 spark 作业来创建数据管道变得更加容易,这些工具和平台允许多个数据方(分析师、工程师、科学家等)。)来着重理解数据,写逻辑来获得洞见。然而,像笔记本这样允许简单脚本编写的新工具,有时没有得到很好的使用,并可能导致新的问题:大量的数据管道被编写为简单的 SQL 查询或脚本,忽略了重要的开发概念,如编写干净和可测试的代码。因此,确保代码可维护和可扩展的设计原则可能会被打破,在我们的产品应该是动态的环境中导致进一步的问题。
我们将展示一个包含一组步骤和模式的过程,以一个基本的 spark 管道为例,帮助您创建更好的 spark 管道。
第一步:首先定义你的管道结构
在每个管道中,第一步也是最重要的一步(甚至比代码清洁更重要)是定义其结构。因此,应该在数据探索过程之后定义管道结构,该过程提供了从输入产生预期输出所需的阶段。
让我们来看一个基本的例子,并定义一个管道结构。因此,我们有三个数据集:
userssourceexamples包含用户的信息。
gendersourceaexamples从源“ exampleA ”中读取包含某个国家特定名称的性别。
genderSourceBExampleDS读取源“ exampleB ”并包含另一个按名称排列的性别列表。但是,在这种情况下,它不会根据国家进行区分,而是添加一个计算的概率。
然后,管道的目标是生成一个数据集,其中列性别被添加到userssourceexamples中,如下所示:
- 当后缀有明确的性别时,例如,先生或女士会立即在性别栏中添加性别。
- 如果后缀没有性别那么在【gendersourceaexamples】和 上搜索姓名添加一个新列 来源 _ a _ 性别 。然后,在genderSourceBExampleDS上搜索名称,添加 source_b_gender 列。
- 最后,当 source_a_gender 不为空时,将此值设置为gender,否则只有当概率大于 0.5 时,才使用source _ b _ gender**。
此外,一些指标(如男性百分比和女性百分比)会生成到指标存储系统中。
管道结构
定义了以下阶段:
- 数据读取:从数据源读取。在这种情况下,数据存储在 S3 中。
- 数据预处理:正如我们在数据中看到的,没有唯一的 ID 来连接或搜索数据,那么使用列名称、国家和后缀中的文本。但是,这些列包含要删除的无效数据(NaN)、多个字母大小写、首字母缩略词和在此阶段预处理的特殊字符。
- 数据丰富:在数据被清理并准备好使用之后,它在这个阶段中被转换和解析。因此,在一些业务验证之后,会添加新的列。
- 数据度量:该阶段包含与对转换后的数据进行聚合和计算相关的任务。
- 数据写入:最后,这个阶段处理将性别化结果写入 S3,将指标写入外部工具。
是不是挺简单的?是的,我们知道你在想什么。使用 spark 可能很容易编写这个管道。您打开 spark 上下文,读取数据集,解析数据集,最后连接以获得最终结果,并将它们写入输出数据存储。这看起来像这样。
Writing pipeline with SQL queries
这个脚本运行得相当好;它使用一些广泛的 spark SQL,并对 3 个不同的源重复相同的逻辑。除此之外,让我们想象以下场景:
- 这只是管道的第一个版本,将来还会添加多个新的性别化来源。
- 将添加多个新的共享预处理和转换任务。
- 一些清洁功能必须单独测试。例如,删除首字母缩写词的函数。此外,应该测试每个中间步骤的输出。
- 新的扩展和测试将自动配置 CI/CD。
因此,前面的源代码在一些不需要扩展性的情况下变得很有用;否则将变得不可扩展、不可测试和不可维护。因此,建议采取以下步骤。
步骤 2:保证一个合适的项目结构
定义一个适合您管道阶段的项目结构,这将使您的管道成为一个数据产品。
a)为之前定义的阶段定义项目结构,如下所示:
b)定义你的项目依赖,避免循环/未使用的依赖,明确定义测试、【T2 提供】和编译之间的依赖范围。
c)开始在每个将要定义小函数和通用函数的包中添加一个通用助手。现在,在主类的一个伴随对象中定义其余的函数。
d)根据您的需求,定义您将使用哪个版本的 spark API:RDDs、 datasets 或 dataframes 。
e)当您有多个使用相同逻辑的作业时,考虑创建一个通用的 spark-utils 库,供您公司的所有作业共享。
步骤 3:确保干净代码规则的符合性
创造符合预期的工作岗位是不够的。目前,公司努力减少技术债务,并创建易于所有数据方阅读和维护的自我记录管道。
这里要讨论的有迷思:“我作为数据科学家写代码”或者“数据工程师太严格了,读不了代码”。我们应该开始为人类编写代码,并确保最低限度的整洁,以保证我们的数据团队的生产力。因此,下面列出了需要考虑的重要规则。
A)使用有意义的名称
在管道中使用有意义的名称至关重要。让我们关注 Spark 变量、函数和列。
基于 Spark 的变量:始终使用不可变的变量,并停止用“df1”这样的名称来调用数据框。相反,使用代表 API 版本的有意义的名称和后缀。示例:
*val **usersExampleDS** = ...
val **usersExampleDF** = ...
val **usersExampleRDD** = ...*
不要使用 var,而是使用 transform 方法,我们将在后面展示。
函数:连同有意义的名字,为你的函数创建一个带有动词前缀的白名单,比如 clean,with,filter,transform/enrich,explode ,它们是你的管道中唯一可能使用的单词。示例:
*def **cleanAcronymsFromText**
def **enrichNameWithPrefix***
栏目:栏目名称要清晰统一。如果您使用 dataset API,那么最好使用 camelcase 列名来匹配 case 类,如果您喜欢使用数据库表示法,则使用下划线。作为一个例子,下面的名字清楚地表明性别概率大于 50。
*gender_probability_**gt**_50*
如果您希望使用 case 类来定义数据集架构,请在设置架构之前,在伴生对象上定义一个列映射器并修改列名。示例:
***case** class **UserExample**(name: String,
email: String,
country: String)
object **UserExample** {
def **columnstranslatorMap**: Map[String, String] = *Map*(
**"First Name"** -> "name",
**"Email"** -> "email",
**"Country Code"** -> "country")
}*
那么你可以这样读:
*val **usersSourceExampleDS** = spark.read
.option("header", "true")
.csv(PATH)
.select(**UserExample.columnstranslatorMap**.keys.toList.map(c => *col*(c).as(**UserExample.columnstranslatorMap**.getOrElse(c, c))): _*)
.as[**UserExample**]*
在某些情况下,列名在多个阶段和功能中使用。因此,用列名定义一个特征,并在主 spark 作业类中使用它。
*trait **GeneralColumnConstants** {
val **N*ameSourceColumn***= **"firstName"** }
object **NamesGenderizerJob** with **GeneralColumnConstants** {}*
最后,只有在少数情况下,列应该是可变的,而不是使用带有 Column 函数的向 dataframes 添加一个新列来跟踪原始数据。**
B)避免副作用:永远首选无副作用的手术。例如,最好使用一行三元运算符 always if/else。
***if** (true) statement1 **else** statement2*
C)明智地在 null 或 Option 之间做出决定:我们被告知在 scala 中编写干净的代码 match-pattern 和 Optional 是强制性的。然而,在 spark 中,可选的可能会成为瓶颈,因为这种评估会增加额外的成本。因此,这里的建议是在开始时使用可选的,并且仅在性能可能受到影响的情况下将值更改为空。**
D) 避免过度使用 scala implicit: 更喜欢始终使用 transform 函数来使用隐式转换数据帧,从而导致猴子修补。
尽可能避免 UDF:UDF 大部分时间都是黑盒,只有当你正在做的事情无法用 spark 优化的自定义 Spark 函数时才使用它们。然而,当你写 UDF 时,请确保你处理了所有的空情况。
避免过度使用累加器:累加器不是用来存储数据的,只有在需要少量计数时才使用,例如计算流水线中的错误数。
步骤 4:保证可扩展和可维护的管道
到目前为止,我们可以使用适当的结构并遵循一些干净的代码原则来编写 spark 作业。这很棒,但这并不意味着我们的代码已经是可扩展和可测试的了。为了达到这种可扩展性,坚实的原则可以发挥关键作用。让我们通过例子来了解这些原则。
单一责任原则
一个类应该有且只有一个改变的理由。
所有的管道模块、类或函数都应该负责功能的一个部分,在简单的代码单元中分离责任。我们可以看到 Step1 中定义的阶段,每个阶段都是一个责任单元。此外,这些步骤中的所有内部函数也应该负责一件事,在更大的功能中是可测试的和可链接的。让我们关注一下示例数据集的通用数据清理器。
Simple Names Normalizer.
上面,我们有两个函数负责一件事 removeUselessChars 和remove abstracts。然后,一个名为的链接函数清理使文本正常化。因此,namenormalizer只负责规范化姓名文本。让我们为这些函数中的每一个单独编写测试。
Names Normalizer Test.
打开/关闭原理
你应该能够扩展一个类的行为,而不用修改它。这个原则是构建可维护和可重用代码的基础。
罗伯特·马丁
让我们看看如何为我们的示例编写一个更干净的模块。
Cleaner Service Code.
在这里,遵守这一原则的要点是:
- 抽象 CleanerService 定义了通用的清理函数模板。这个抽象对于修改是封闭的,但是对于扩展是开放的。
- 清洁器的多种实现,例如:source cleaner, SourceBCleaner , SourceUsersCleaner 扩展抽象行为并添加具体实现。
- 然后,在我们必须使用清理器的地方,依赖注入是首选,我们将注入一个 CleanerService 实例,而不是一个低级类的实例。
- cleanerServiceHelper 使用转换函数链接多个函数。
- 最后,再次参见规格化文本函数,它将循环关注点从规格化文本的函数中分离出来,简单地调用先前定义的文本规格化器。此外,使用 foldLeft 使功能易于重用,并保持一个干燥的代码库。
让我们看看它的可测试性:
Cleaner Service Test Example.
利斯科夫替代原理
派生类必须可以替换它们的基类。
为了用我们的例子更容易地解释这个原理,一些清理功能由所有的实现共享。在这种情况下,我们可以在通用结构中定义实现。例如,我们可以在 cleanerServiceHelper 中为重复数据删除定义一个通用行为,并且只在与其他实现不同时使用具体实现。
界面分离原理
不应该强迫客户实现他们不使用的接口。
罗伯特·马丁
不要在你有所有管道函数的地方写大的单体特征或助手。你还记得我们定义阶段的第一步吗?。这些在这里是有用的,我们应该只能够清理,或者例如清理和浓缩而不调用其余的阶段。因此,建议通过阶段创建一个非耦合的抽象。让我们看一个丰富函数的例子。
Enrich Service Example.
在这之后,一个作业的主类应该是这样的。
Main Job Example.
从属倒置原则
依赖抽象,而不是具体。
在前面的例子中,我们看到了如何注入 CleanerService 抽象。这是 Spark 中这个原理的一个很好的例子。然而,我们可以更进一步,看看如何使用我们的数据框架应用依赖注入。假设我们想要创建一个函数,将 usersSourceExampleDS 与性别化的源代码连接起来,并单独测试。让我们为此写一个函数。
Dataframe Injection Example.
然后看看我们测试起来有多简单。
Testing Dataframe Injection.
结论
- 当生产 spark 作业并使它们可维护、可测试和可扩展时,这是一个需求;数据团队应该开始关注创建遵循干净代码原则并使测试任务更容易的管道。
- 一些产品开发概念适用于管道创建的开始,然后分析阶段和划分关注点是一个关键的活动。
- 干净的代码和坚实的原则适合 spark,通过使用它们我们可以保证团队生产力和代码质量保证。
少写,多探索
原文:https://towardsdatascience.com/write-less-explore-more-7dd39980ed2a?source=collection_archive---------37-----------------------
我经常陷入写代码的困境——我关注的是代码,而不是代码产生了什么。这从本质上来说并不是不好的做法,但是在排除的情况下,它没有实现探索性数据分析的目标。EDA 的目标是建立数据的心理模型。如果你把 90%的时间花在代码上,10%的时间花在数据上,那么在实现你想要的结果时,你只有 10%的效率。了解这一点后,您应该最大限度地利用您浏览数据的时间。如果你发现你在 EDA 上花了很多时间,但是感觉你不理解数据,考虑改变你的过程。改变你的过程的一个快速方法是问你自己,“我现在写的东西会提高我对数据的理解吗,或者它会帮助我实现另一个目标吗?”
重新调整你的过程是获得更好结果的捷径,但是改变你的习惯会有更深远的影响。改变两个习惯对我的探索性数据分析产生了巨大的影响:使用简单的图形和自动化我的过程。
简单的图形传达理解
If you squint and focus really hard you can see The Matrix! Oh wait, not, it’s just a regular matrix.
这不是一个简单的图形。它包含简单的元素,但作为一个整体,它是一个复杂的信息数组。研究它 15 秒钟。你看到了什么?
如果你在 15 秒后的回答是,“有些特征是相关的,有些是不相关的”,那么你就在一个好公司里。你甚至可以说,“有一些相关性,一些特征是离散的,而一些是连续的。”甚至更好!但总的来说,你并没有真正学到什么,是吗?当您导入数据时,您应该已经知道一些特征是离散的,并且我想您期望一些事情是相关的。所以总的来说,看了这张图之后,你的情况并不比看之前好多少!
这幅图信息密集,但含义却出人意料地浅。图表不能帮助你理解,也不能传达你对数据的理解。请记住,你的目标是开发一个心智模型——你通过将数据处理成一系列关系来实现这一点,而不是通过盲目记忆信息。为了有效地做到这一点,你应该致力于制作在信息密度和含义密度之间取得平衡的图形。这可能说起来容易做起来难。我将向您展示两个例子来启发这个概念,并希望帮助您改进实践。
使用离散数据探索要素的散点图
具有离散数据的要素散点图看起来很混乱。在最好的情况下,您会对特征的一些描述性统计数据(平均值、众数、最小值、最大值)有所了解,并对相关性有一个模糊的认识。这是国王郡住房数据中房价与卧室数量的散点图。
What am I supposed to get out of this?
这只是你在上面的散点图中看到的一个图表的放大版。在这种情况下,我们甚至无法了解价格对卧室的反应,因为存在我们看不到的潜在关系。简而言之,我不能从这个图表中推导出很多意义,因为有太多的信息需要处理,有些信息被隐藏了。
旨在制作在信息密度和意义密度之间取得平衡的图形
确定离散预测值和目标值(如果存在)之间关系的一种方法是查看预测值中每个离散值的可比数据。为了做到这一点,我们假设数据在每个离散值上表现相同。也就是说,离散值的目标分布(例如,有 3 间卧室的房屋的价格)具有与其他离散值的目标分布(例如,有 1 间、2 间、4 间等卧室的房屋的价格)相同的一般形状。这允许我们在给定的离散值下比较目标的平均值、中值或众数,以评估关系。考虑起来有点棘手,但下图应该有助于明确这个想法:
This is a graphic that allows me to extract meaning!
看起来价格和卧室之间的关系是线性的,尽管有很多卧室的房子也有问题。快速浏览一下预测值中的唯一值就会发现,拥有 8 间以上卧室的房子并不多。我们应该只考虑少于 8 间卧室的房子的数据,因为这符合我们关于分布行为的假设。
决定何时(以及如何)装箱
决定何时以及如何装箱并不总是那么简单。有时可以在散点图中发现要素中的离散分组,但通常您最终看到的是没有多大意义的散点图。这里有一个不是特别有用的价格和地段差异散点图(地段差异是一所房子和它的 15 个最近邻居之间的地段大小的比例差异)。
Relationship status: Complicated
价格和批次差异之间看起来肯定没有关系,但也许分位数分类的数据子集是有预测性的。问题是,你如何决定在哪里切断你的垃圾箱?为了回答这个问题,你需要平衡信息密度和图形的含义密度。
宁滨数据的目的是创建具有显著不同均值的组(1 ≠ 2 ≠ 3 … ≠ n)。在这种情况下,最好的图形叠加了分箱数据的分布,以便您可以快速评估宁滨是否合适。
That blue, green, red combination makes a gross color. This is a reminder to yourself not use those colors in the future.
从这个图表中可以清楚地看出,宁滨的这个数据并不能预测价格,即使它被归入极端分位数。我很有信心做出这个声明,因为不同组的分布没有显著差异,这一点我只需看一下图表就能知道。查看最有意义的图形使我能够理解数据中的细微差别,这意味着在这种情况下,我不会在我们的模型中找到一个无意义的预测值。
使用简单的图形
前面例子的成功在于它们的简单性。一眼看去,你和其他任何人都能够理解所描述的关系。你应该尽可能简化你的图形,遵循平衡信息密度和意义密度的原则。
自动化您的流程
到目前为止,如果你对自相矛盾的信息感到恼火,你可能并不孤单。我开始写这篇文章是让你“少写”和“多探索”,但是到目前为止我告诉你的是你应该多写和多探索。
事实是,没有一些摩擦你就无法探索,在我们的例子中就是写代码。所以,是的,为了探索更多,你必须多写一点代码。然而,关键是增加探索与写作的比例。最好的方法之一是有效地重用代码来自动制作图表。
您应该最大限度地利用浏览数据的时间
为此,我使用了 ipywidgets。Ipywidgets 是一个简单的模块,它允许您通过将控件嵌入到输出中来动态地与函数的参数进行交互。用一个例子来解释更容易,所以这里有一段代码和结果输出。
If only this was interactive!
不太明显的是,这段代码允许我查看这个数据集的小提琴图的 60 种不同组合!这是一个令人眼花缭乱的数量,但选择情节的能力提高了我理解我正在看的东西的可能性。原因很简单:我已经准备好更新我的心理模型,我可以有目的地浏览情节。
现在我已经向您展示了 ipywidgets,我可以澄清上一节中的示例了。这些图形都是使用 ipywidgets 自动生成的。他们都是一个更大的调查的一部分:第一个例子检查了离散的预测因子和它们与目标的关系;第二个示例检查邻居的数据。
如果你有兴趣了解关于 ipywidgets 的更多信息,那么我推荐你阅读链接到这里的 Will Koehrsen 的题为“Jupyter 笔记本中的交互控件”的文章。他通过大量的例子一步一步地向您介绍如何使用 ipywidgets。ipywidgets上的文档也为那些想直接找到源代码的人写得非常好。
有了 ipywidgets,您现在应该可以轻松地通过简单的图形探索更多的数据了。祝你好运,探索愉快!
编写自定义脚本来语音控制您的 wifi 智能插件
原文:https://towardsdatascience.com/writing-a-custom-script-to-voice-control-your-wifi-smartplug-cd512282ebd5?source=collection_archive---------38-----------------------
今天我们将使用一个 TP-LINK HS100 智能插头,直接从我们自己的电脑上控制它。(我个人用我的电脑关掉我电脑桌前所有的灯、扬声器和显示器。)
TP LINK 已经为 iOS 和 Android 提供了一个移动应用程序“Kasa Smart”,但当我试图直接从我的电脑上进行操作时遇到了麻烦,因此我决定开发自己的程序。
先决条件(我用的是 Macbook):
- 一个 API 调试器(我用的是失眠
- TP-LINK HS100
- 您已经在智能手机上的 Kasa smart 应用程序中设置了您的设备
- 可以用来编写 shell 脚本的东西(默认的文本编辑打开就可以了)
首先,我们需要从失眠症向设备发送一个 API 请求,以获取设备信息。因为我们想要提交一个请求,所以我们选择“Post”作为方法,选择“https://wap.tplinkcloud.com”作为我们想要发送请求的 URL。
对于要批准的请求,我们还必须添加我们的自定义参数,即“appType”、“cloudUsername”、“cloudPassword”和“terminalUUID”。apptype 将取决于您的操作系统,我的是“Kasa_iPhone”,cloudUsername & cloudPassword 将是用于登录移动应用程序的凭据,最后,terminalUUID 是一个自定义的 UUID,您可以自己指定(我建议使用这样的在线生成器:https://www.uuidgenerator.net/,并记下您的 UUID)。
下面是我最终请求的照片,其中删除了敏感信息:
Our first post request, just fill in your personal information
完成后,我们可以点击右上角的“发送”,如果所有信息都正确,您应该会收到如下内容:
Our response from the POST request
这里我们感兴趣的是“token”参数,它是我们检索设备信息的安全令牌。所以,复制/写下你的令牌,保存起来以备后用。
现在我们有了设备令牌,我们可以发送另一个更完整的 Post 请求来接收关于设备的完整信息。与另一个请求类似,我们将发送一个 post 请求到之前相同的地址,将我们的令牌参数添加到 URL。它应该看起来像这样https://wap.tplinkcloud.com?token =XXXXXXXX-Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx其中所有这些 X 都是您之前的个人令牌。包括
在消息体中,我们准备发送。它应该类似于下面这样(去掉了我的令牌):
如果您做了所有正确的事情,您应该会收到一个没有错误的响应,应该是这样的:
Response from the request with sensitive information removed.
这里需要注意的是,“status”属性告诉我们智能插头的当前状态,“1”表示智能插头打开,“0”表示智能插头关闭。然而,我们感兴趣的,我需要你记下来的是“设备 Id”。
现在我们已经有了关于设备的所有必要信息,我们准备创建我们的脚本来打开/关闭 smartplug。
打开你最喜欢的文本编辑器(我只是使用 mac 默认的文本编辑器),插入这段代码:
curl—request POST "https://wap.tplinkcloud.com?token =XXXXX"
—data ' { " method ":" pass through "," params ":{ " device id ":XXXX," request data ":{ \ " system \ ":{ \ " set _ relay _ state \ ":{ \ " state \ ":0 } } " } '
—header " Content-Type:application/JSON "
删除粗体 X 并插入您自己的参数。这个脚本将向您的特定设备发送一个请求,要求它将状态设置为您指定的任何状态。
如前所述,这个脚本用于关闭设备;“0”表示设备关闭,“1”表示设备打开,因此在上面的代码中将“状态”从 0 更改为 1,表示您想要打开设备。
将文件保存为“外壳文件”(文件扩展名为。命令,这样“终端”会自动打开并运行该脚本。).因此,将该文件命名为“desk_off.command”并保存它。创建另一个文件,从“desk_off.command”文件中复制代码,并将状态从 0 更改为 1,并将其命名为“desk_on.command”。
您应该有两个文件;一个用于打开智能插头,一个用于关闭智能插头。尝试运行这两个文件,检查是否一切正常,如果不正常,返回到前面的步骤,以确保您没有遗漏任何内容。
现在我们准备好启动这些基于语音命令的脚本。打开“系统偏好设置”,进入“辅助功能”选项卡>“语音控制”>“命令”,然后按左下角的小“+”符号来添加新命令。在这里,您可以选择您应该说什么来触发动作,如果它应该能够在使用特定应用程序时触发,最后,在“执行”选项卡下,选择“打开 finder 项目…”并选择脚本。应该是这样的:
现在试着说出你的命令并测试它是否有效:)
编写 Python 包
原文:https://towardsdatascience.com/writing-a-python-package-561146e53351?source=collection_archive---------16-----------------------
对 Python 打包和编写您的第一个 Python 包的世界的温和介绍。
几年前当我键入pip install opencv-python
时,几秒钟过去了,神奇的事情发生了——我能够使用 OpenCV 不需要从源代码构建它,不需要编译器,这绝对是惊人的。我可以安装任何我想要的包,而不用担心编译它的源代码/安装或配置系统变量。
Python Packaging
这些年来,我继续使用 pip,每次都让我着迷。这真的让我想知道一项技术可以有多简单。作为一名 Windows 用户,每次我安装新东西时,我都必须配置系统路径。所以这绝对让我的生活更简单了。
几个月前,我决定编写自己的 python 包。我一直觉得图形很有趣,并决定编写一个完整的图形库,于是我开始编写 Grapho(这是正在进行的工作)。
目录中的所有文件总是可以导入同一模块中的文件。但是,如果您想让您的模块在整个系统中都可用,该怎么办呢?
你添加一个 setup.py 到你的模块中(当然有相关的配置)。
但是,如果您希望 python 包对全球每个人都可用,该怎么办呢?
你在 PyPI 上发布你的包。(所以大家可以 *pip install your-package-name*
)
说够了,我们来写点代码吧。我们先写一个简单的函数,然后打包。
# hello.py
def heythere(): print("hey there")
# setup.py
#!/usr/bin/env python# -*- coding: utf-8 -*-from setuptools import setup, find_packagessetup( author="Chinmay Shah", author_email='chinmayshah3899@gmail.com', classifiers=[ 'License :: OSI Approved :: MIT License', 'Programming Language :: Python :: 3.7', ], description="Says hello", license="MIT license", include_package_data=True, name='hello', version='0.1.0', zip_safe=False,)
Setup.py 是 pip 在给定目录中查找的内容。它使用一种叫做 setuptools[1]的东西来实现打包。它包含软件包的名称、软件包的简要描述以及作者信息。不要忘记提到它是为哪个 python 版本制作的。所有这些元数据都很重要。
看起来简单?让我们试试这个东西。让我们安装它— pip install .
Installing your Package
但是我说它安装它是什么意思呢?
- 首先,它创建了一个轮子。whl)文件;这是用于包分发的可接受文件。
- 在安装过程中,它使用这个 wheel 文件,安装在
site-package
目录下(Anaconda 使用这个)。 - 如果从互联网下载,通常会在
pkgs
文件夹中创建一个本地缓存。
Running the installed module
但是什么是pip
?
pip 是 Python 的一个包安装程序,用来安装(主要)来自 PyPI(Python 包索引)的包。作为easyinstall
的升级版于 2008 年推出,尽管两者都是基于setuptools
构建的。[1]
PyPI 是一个巨大的包索引,任何人都可以提交他们的包,全球的任何人都可以做pip install your-package-name
。
请关注下一篇文章,在那里我将介绍如何编写包以及如何在 PyPI 上发布它。
有什么想法吗?在 Twitter 、 Linkedin 或电子邮件上联系。
参考:
[1]设置工具—https://setuptools.readthedocs.io/en/latest/
编写人们想阅读的代码
原文:https://towardsdatascience.com/writing-code-people-want-to-read-775c6b979985?source=collection_archive---------30-----------------------
Image courtesy of Pixabay
或者如何写出不会让你想揪头发的代码!
那是 5 年前,我第一次创建我的第一个编程项目。我是一个毫无头绪的大一新生,正在学习 C++编程入门课程。我很想撒谎说我是一个天生的程序员,但是我的第一个项目的一个片段是这样的:
int main()
{
string a;
string b; getline(cin, a);
getline(cin, b); if ((a == 'g') || (b == 'c')
{
...
if (condition#2)
{
...
if (condition#3)
{
...
}
else if (condition#4)
{
...
}
} return 0;
}
耶克斯。我希望我能说筑巢就此停止。
提醒你,我的程序成功了。我曾经认为,只要程序产生适当的输出,它内部看起来如何并不重要。反正没有人会去读它。错。
事实上,花在阅读和写作上的时间比远远超过 10 比 1。作为编写新代码工作的一部分,我们不断地阅读旧代码。…[因此,]让它容易阅读,就更容易写作。罗伯特·马丁
事实是,人们花在阅读代码上的时间比写代码的时间还多。乍一看,这似乎并不明显,但是无论你是在浏览文档、调试旧程序,还是仅仅想出要写的下一行代码,你都在阅读代码。
这里有一个简单的练习:找一个你不久前写的程序,试着理解它做什么。真正投入进去。注意你如何命名你的变量和函数,缩进每一行,形成每一个if
语句。检查哪个函数调用哪个函数,以及为什么程序是这样构造的。目标是确定您是否可以在不运行程序的情况下重新创建程序的逻辑流。
准备好了?走吧。
Image courtesy of Pixabay
很难,不是吗?即使您的代码是平滑和干净的,您仍然必须努力尝试重新创建逻辑流程,因为您必须及时倒回,并记住您做出的导致您的代码的决策。
现在想象一下:如果是另一个人写的代码会怎么样?你需要付出更多的努力来理解它,因为你不知道代码是如何创建的。你所拥有的只是写在你面前的东西。如果那个人写了糟糕的代码呢?如果我写在上面的代码中有一个 bug(很可能有),而你的任务是调试它,你会有什么感觉?
这是另一个练习。下面是做完全相同事情的三段代码(注意,这些代码不是用特定的语言编写的)。看看哪个最容易理解:
What?
I can at least understand it
Aha!
在功能上,这三个代码片段是相同的。当你把它喂给这个假想语言的假想编译器(和 Python 没关系,我保证)时,它们都会产生同样的程序,你可以保证函数的所有输出都是一样的。
但是,很明显,第三个片段要好看得多。这本书不仅可读,而且读起来很有乐趣。它不会让人挠头或产生歧义。事情就是这样。通过简单地阅读它,你可以毫无疑问地确定这个函数是做什么的:它计算一个圆柱体的体积。如果你能一直这样写代码,那你就可以自我表扬了。你有伟大的代码。
虽然我承认这是一个简单的演示,但它包含了深刻的思想,可以帮助您轻松提高代码的可读性:
- 抓紧时间起名字,起好名字。这适用于变量、函数、文件名、包等等。确保你写的是自己的意思,写的是自己的意思。如果只有一种合理的方式来解释你的代码,那么你就降低了任何人(包括你自己)误解你的逻辑的风险。
- 注释解释代码是好的。解释代码的代码是最好的。评论的普遍问题是它们经常被忽视。当带有注释的代码被重构时,注释很有可能不会随之更新。曾经有用的评论现在变成了彻头彻尾的谎言。自文档化代码(例如上面的第三个片段)提供了与上面第一点相同的好处:减少了歧义和误解的机会(另外,看起来更清晰!).
作为奖励,我从我的第一个项目中学到了一课:
- 委托:使函数更短。把你的代码想象成一门生意。企业由不同的部门组成,每个部门都被期望执行特定的任务,并可能返回从这些任务中获得的结果。如果你在一个巨大的函数中运行所有的代码,你就像一个没有明确边界的公司;也许在开始时你能妥善管理,但一旦公司扩大,肯定会有问题,而且你不知道谁该负责。制作更短的函数。将特定的任务委派给这些职能部门,只让主要职能部门负责协调每项任务。他是头儿,那是他的工作。如果你的代码出现任何问题,你将确切地知道它发生在哪里以及为什么会发生。
Image courtesy of Pixabay
虽然这绝不是一个全面的指南列表,您可以做这些来使您的代码更具可读性和更令人愉快(事实上,它只是触及了表面),但是采用这三个简单的原则可以显著提高代码的质量。再次:适当命名,委派任务,让代码自己说话。
任何傻瓜都能写出计算机能理解的代码。优秀的程序员编写人类能够理解的代码。—马丁·福勒
记住:程序员不像作者。我们是作者。我们的工作不仅仅是编写功能性代码,还包括编写能够向他人传达我们的意图、独创性和创造力的代码,即其他人想要阅读的代码。
延伸阅读
- 编写干净代码的最高权威,鲍伯·马丁叔叔。他的名为 Clean Code 的书是任何程序员的必读之作。
- 设计原则和设计模式 —这是鲍勃大叔介绍面向对象编程的坚实原则的论文。
- 设计图案出自著名的四人组
- 关于设计模式的一站式网站。
阅读更多我的作品
- Python 初学者指南及其怪癖
- 熊猫黑客:read_clipboard()
关于阿德里安·佩雷亚
兼职数据科学家,兼职科技作家,全职书呆子。我在教授机器学习和可管理的编程中找到乐趣, 字节 大小的块。是的,我也很搞笑。咖啡上瘾者。数据可视化的吸盘。愿意为下一个最好的树状图付出我的 1 和 0。
关注我上Twitter和LinkedIn。
撰写备兑看涨期权以保护你的股票投资组合
原文:https://towardsdatascience.com/writing-covered-calls-to-protect-your-stock-portfolio-76f37b1c9da1?source=collection_archive---------7-----------------------
Photo by Adrianna Calvo from Pexels
通过出售看涨期权来降低投资组合的风险,保护自己免受不测
尽管欧洲经济摇摇欲坠,与中国的贸易战时断时续,但他的牛市仍在继续。没有人知道接下来会发生什么,也不知道市场最终是否会在某个时候经历一场长期低迷。
但当股价仍接近历史高点时,从桌上拿走一些钱不会有什么坏处。这里有一个相当安全的方法,可以获取一些利润,降低风险,同时还能保留一些上行风险。
对你的股票做看涨期权
比方说,我们投资苹果公司已经有一段时间了,并获得了可观的收益。我们相信该公司,认为与其他大型科技股相比,目前的估值有些偏高,但还是合理的。
我们可以通过卖出(金融人士称卖出期权的行为为“卖出”)看涨期权来保护自己,对冲我们的苹果股票头寸。当我们这样做时,我们是在用上涨来换取保护——我们因为卖出看涨期权而获得了一些钱,但作为回报,如果苹果公司的股价超过了我们期权的执行价,我们就会失去所有本可以赚到的钱。我们来看一个例子:
- 撰写本文时,苹果的当前价格为 208.74 美元。假设我们拥有 100 股股票,这意味着我们在苹果股票上投资了 20,874 美元,这是一笔相当大的数目。
- 三年前,价格是 107 美元。三年后的回报率是 95%,不包括股息。所以假设我们已经拥有它一段时间了,那么我们应该坐拥可观的利润。
- 2019 年 11 月 15 日到期的苹果看涨期权的最后报价为 630 美元,行权价为 220 美元。这是溢价,或者说,如果我们卖出这个看涨期权,我们会得到的金额。
这是一大堆金融术语,尤其是最后一点。让我们看一下这一切意味着什么。当我们持有股票时,比如 100 股苹果股票,我们的收益图如下图所示。
Payoff diagram for being long (owning) Apple stock (Y axis is profit or loss)
Y 轴是我们投资的利润或损失,X 轴是股票的当前价格。蓝线显示我们的利润或损失是股票价格的函数(在我们的例子中,是苹果)。
由于我们拥有 100 股苹果股票,当股价上涨时(在 X 轴上向右移动),我们的利润也增加了(在 Y 轴上向上移动),因此蓝线向右上方的方向是有意义的。从数学上来说,我们的苹果股票价格每上涨 1 美元,我们的头寸利润就会增加 100 美元(因为我们拥有 100 股股票)。
垂直的灰色虚线表示我们购买苹果股票的价格。如果当前股价高于我们的买入价,那么蓝线的 Y 轴值在蓝色“0”上方,表示盈利。如果不是,那么我们就有损失了。
看涨期权快速介绍
现在让我们来看看当我们在组合中加入看涨期权时会发生什么。首先,让我快速介绍一下期权如何运作的本质:
- 期权是一种金融工具,它授予你以预定的执行价格购买或出售 100 股金融资产(如苹果股票)的权利,而不是义务。
- 期权有到期日。这意味着在到期日之后,它们将不复存在,噗(例如,我们的苹果期权将在大约 2 个半月后于 2019 年 11 月 15 日到期)。
- 但在到期前的任何时候,如果你拥有看涨期权,你可以选择支付执行价购买相关股票的股份。一般来说,只有当股价高于执行价时,你才希望这样做(如果是,你实际上是在以折扣价买入股票)。
- 如果你在科技行业工作,你可能已经拥有了一些雇主股权的长期期权。你真幸运!
让我们看看买入并持有看涨期权在我们的收益图上是什么样子的(如下)。请注意,现在我们的蓝色收益线有一个扭结。当我们在图上向左移动时,线在执行价格处变平,这意味着我们的损失在溢价(我们为看涨期权支付的价格)处封顶。这是投资期权的一个吸引人的方面——不管发生什么,我们的损失都在溢价范围内。投资者喜欢的看涨期权的另一个方面是无限的上涨空间。请注意,当我们在图上向右移动时,我们的蓝色收益线以同样的方式上升,就像我们拥有标的股票一样。这意味着,通过支付溢价,我们最终获得的经济风险敞口与我们直接购买标的股票的风险敞口相同(当股价高于执行价时)。
另一方面,拥有看涨期权的一个缺点是,与购买股票不同,如果基础股票价格根本不动,你仍然会亏损,因为你已经超出了溢价(另外,即使基础股票支付股息,看涨期权也不支付股息)。
Payoff diagram for buying and holding a call option (Y axis is profit or loss)
此外,还增加了到期时间和的因素,即你的期权价格变化的速率本身并不是常数,而是许多因素的函数(例如,如果我们的履约价格远高于当前市场价格,期权即将到期,那么即使标的股票价格大幅上涨,也不会对我们期权的价值产生太大影响)——这些因素使得期权投资比乍看起来要复杂得多。如果你打算全力投入期权投资,你必须在这么做之前了解所有这些额外的因素是如何起作用的。
如果你卖了一个看涨期权,这就是我们在例子中想要做的,一切都是相反的。在这种情况下,我们向某人(有偿)出售了让我们以执行价格购买 100 股标的股票的权利。由于一切都在逆转,如果股票价格超过我们出售的看涨期权的执行价格,我们现在被迫承受损失 —在这种情况下,从我们这里购买期权的人将迫使我们以低于股票市价的价格向他或她出售 100 股相关股票(因此我们被迫折价出售)。
Payoff diagram for selling a call option (Y axis is profit or loss)
左边的图表显示了卖出看涨期权的收益图。这和上一个几乎完全相反。请注意,蓝色的收益线现在从 0 美元以上开始,代表低股价一直到我们的执行价。这意味着,只要当期权到期时,标的股票的市场价格低于我们期权的执行价格,我们就可以保留所有的期权溢价(我们出售期权得到的钱)。还要注意的是,溢价是我们可以从卖出看涨期权中获得的最大金额。
现在,如果股票价格在到期时上涨到高于我们的执行价,我们就会亏损,因为我们被迫以折扣价将股票卖给我们期权的买方——这就是为什么蓝色收益线在扭结后向下倾斜。请注意,潜在损失是无上限的——如果股票价格持续上涨,那么我们的损失也会随之上涨。因此,卖出看涨期权提供了有限的上涨空间,同时让我们面临无限的下跌空间(可怕!).
是的,这很可怕,但我绝对不建议你写裸看涨期权(在没有首先拥有标的股票的情况下卖出看涨期权,以及 是的,它确实被称为 )因为在错误的股票上这样做可能是毁灭性的。例如,想象一下,如果你以 1940 美元的执行价格出售一份 2019 年 11 月 15 日(到期日)的亚马逊看涨期权。这比目前的市场价格高出 10%左右。卖出看涨期权,你会得到整整 3300 美元。很不错吧?但如果亚马逊股价回到 2050 美元的 52 周高点,你将被迫以 1940 美元的价格卖出 100 股亚马逊股票。因为你卖出了一个无担保看涨期权,你需要以 2050 美元买入 100 股,然后立即以 1940 美元卖出——亏损 11000 美元。所以你的总 P & L(损益)是:
- 因卖出期权而获得 3300 美元的溢价。
- 损失了 11000 美元。
- 净亏损 7700 美元……哎哟!
我们不想冒这种风险,所以写裸辞是不可能的。但是,在高估值的股票市场中,卖出备兑买入期权(当你已经拥有股票时卖出买入期权)可以降低风险,对于风险厌恶型投资者来说,这是一项具有潜在吸引力的交易。让我们在下一节看看如何。
对我们的苹果股票写看涨期权
由于我们不想裸卖看涨期权,我们想做的是只卖出(记住,卖出意味着在金融市场上卖出)我们已经持有至少 100 股的股票的看涨期权。我个人认为撰写备兑买入期权的方式是这样的:
承诺如果你的股票达到一定的价格(或上涨一定的数量)就卖出,并因做出这一承诺而获得报酬。
在进行任何交易之前,我们需要确定以下事项:
- 我们可以接受(由我们期权的买方)以什么价格赎回股票——这决定了我们选择什么样的执行价格。执行价越高,我们卖出期权的收入就越少。这类似于决定“如果股票从当前价格上涨 10%,我将卖出它”以及赚取期权溢价(卖出看涨期权的钱)的额外甜头。
- 在多长时间内我们可以放心承担这一风险。我们的期权到期日越远,我们承担的风险就越大,我们卖出期权得到的钱也就越多。我们的风险更高,因为对苹果来说,一年内上涨 10%比一个月内上涨 10%更容易。从几天后到期的期权到两年后到期的期权,有很多选择。
认识到这两个决定是相关联的,这一点很重要。如果你卖出一个 2 年后到期的看涨期权,那么你会希望将你的执行价格设定在当前市场价格以上至少 20%,否则你的股票将被赎回。另一方面,如果你写了一个一周内到期的看涨期权,你不希望将执行价格定得比当前市场价格高太多,因为那样你几乎不会因为你的麻烦得到任何溢价。
你卖出看涨期权得到的溢价是一个函数,它取决于在到期时,股票的市场价格高于你的期权的执行价格的可能性。
不太可能赚钱的看涨期权(当基础股票的市场价格高于执行价格时,看涨期权就赚钱了)价值很低,而很可能赚钱的看涨期权价值很高。下面是总结这一点的 2×2 矩阵。不幸的是,没有一个神奇的公式来决定在哪里设置你的罢工,以及在多长时间内写下期权。相反,你需要自己决定如何在你获得的溢价和你的股票被赎回的可能性之间找到平衡点。还要记住(稍后将详细介绍)你获得的溢价越多,你的投资组合在市场低迷时受到的保护就越多——如果市场崩盘,那么你卖出的期权就会贬值(这对你有利,因为你做空它),你可以等待它变得一文不值,或者以低价回购(回购可以平仓)。所以在这种情况下,因为你相信看涨期权的价格在未来会下跌,你会想卖出一个更有价值的期权,从而获得更多的溢价。
哇,当我开始写这篇文章的时候,我并没有想到要深入到写看涨期权的机制和复杂性中去。但在做之前,理解我们在做什么,尤其是风险,是至关重要的。
最后让我们回到苹果的例子。回想一下,我们持有 100 股苹果股票,我们决定在 2019 年 11 月 15 日(离到期还有 2 个半月)买入 220 美元的股票(比当前市场价格高出 5%)。作为回报,我们将获得 630 美元的溢价。让我们看看我们的总头寸(我们的苹果股票加上我们卖出的看涨期权)在收益图上的样子:
The payoff diagram for our Apple covered call position
这张图表比其他图表稍微复杂一点,所以让我们一步一步来看:
- 首先,注意蓝色的收益线是如何开始的,就像你只是做多苹果股票一样(如果你做多股票,你就拥有股票)。这意味着,当市场价格低于我们卖出的看涨期权的执行价格时,我们头寸的盈亏与苹果的价格一致(当苹果上涨时,我们赚钱,当它下跌时,我们赔钱)。
- 在我们卖出的看涨期权的执行价格上,我们的利润达到上限(蓝色的收益线变平并水平)。以高于执行价的市场价格,我们卖出看涨期权的人将向我们支付 100 股苹果股票的执行价。这意味着无论苹果的价格有多高,只要我们写的看涨期权没有到期,我们就只能收到我们股票的执行价。然而,这并不是世界末日——回想一下,我们设定的执行价格比当前市场价格高出大约 5%。这意味着,即使我们的股票被赎回,到那时,我们的股票还会有 5%的收益,加上我们因出售看涨期权而获得的 630 美元的溢价(额外的 3%)。总回报率为 8%。最重要的是,因为我们拥有股份,我们也收到任何支付的股息。
- 我把最精彩的部分留到了最后。记住我们进入这个位置是为了降低我们的风险。风险的降低来自于我们因卖出期权而获得的 630 美元的溢价。不管发生什么,只要我们持有到到期日,我们就能保留那 630 美元。这意味着,如果市场崩盘,或者苹果报告糟糕的收益和亏损,我们的损失会因为口袋里已经有的 630 美元而减少。这就是为什么在我们的收益图上,我们头寸的盈亏平衡价格已经下降到低于我们的原始购买价格(在 X 轴上)。
- 如果苹果的市场价格保持不变,那也没问题。我们在股票上既不赚钱也不赔钱,但我们可以保留 630 美元的溢价和任何股息。然后我们可以在几个月后卖出另一个看涨期权,再获得 600 到 700 美元的溢价。酷!
结论
很抱歉我写了这么长的帖子,但是期权是复杂且有风险的,我想在推荐一个策略之前确保涵盖所有的基础知识。最后,我应该强调的是,保修电话并不适合所有人。如果你是以下类型的投资者,它们可能适合你:
- 担心你的股票或整体市场的估值。
- 有点厌恶风险。
- 渴望一些现金收入,但不想卖掉你的股票。
投资愉快,干杯!
更多由我讲述金融、投资和金钱:
用 Tableau 可视化股市
做空波动率的危害
我做的一个关于投资 Lending Club 贷款的数据科学项目
股市低迷之际
股票是否提供正的预期回报?
你有足够的钱退休吗?
为迈向数据科学而写作:不仅仅是一个社区
原文:https://towardsdatascience.com/writing-for-towards-data-science-more-than-a-community-6c9f0452b280?source=collection_archive---------21-----------------------
介绍如何开始撰写《走向数据科学》以及我迄今为止的经历。
Photo by Patrick Fore on Unsplash
“没有真正的结局。它只是你停止故事的地方。”
―弗兰克·赫伯特
介绍
我现在即将开始为期八个月的《走向数据科学》(Towards Data Science,TDS)作家生涯,今天我决定回顾一下我迄今为止的旅程。
如今,拥有博士学位以便从事数据科学工作,尤其是研究工作,似乎越来越有必要了。因此,今年年初,我也考虑到这个机会,我决定写一份研究提案,并申请一个职位。
一个月后,我得到了这个角色。
此时,我开始思考这是否是我的正确选择,我决定拒绝这份工作。我想一定有其他方法可以继续我在数据科学方面的研究,并与更多的人分享我的成果。
在我申请博士职位之前的几个月里,《走向数据科学》一直是旅行的一个有价值的伙伴,它帮助我总是更深入地研究这个主题。因此,我决定试着给社区出版一份我关于媒介的研究提案的修订版。从那以后,多亏了卢多维克·贝尼斯坦特,我成为了《走向数据科学》的作者。
在过去的几个月里,促使我坚持写作的一些主要原因是:
- “如果你不能简单地解释它,你就理解得不够好”( 阿尔伯特·爱因斯坦 )。
- 记录我的旅程。
- 建立新的联系。
- 每天挑战自己学习新的东西。
- 回馈社会。
现在,我将向您介绍一些关于写什么样的数据科学文章以及如何最好地编辑它们的建议。
作家的瓶颈
当考虑开始写作时,一个主要的顾虑是:
- 我的写作技巧是否足以让我的故事出版?
- 我这篇文章的题目值得发表吗?
为了回答第一个问题,我想引用理查德·巴赫的一句话:
"专业作家是不放弃的业余作家."
—理查德·巴赫
因此,只有写作并从编辑和读者那里获得反馈,我们才能提高自己和我们的沟通能力。
每篇提交给《走向数据科学》的文章在出版前都要经过编辑的审核。通过这种方式,出版物可以确保只发布最好的内容,作家可以收到关于如何改进他们的故事的反馈。此外,TDS 还提供一般支持,以防作者寻求任何关于如何提高写作的一般建议。
为了回答第二个问题,我总是在开始写故事之前问自己 3 个问题:
- 我的故事如何能让我的读者受益?(赋予他们权力)
- 如果我在网上研究这个话题,找到好的相关内容会有多难?
- 我的故事能让不太懂技术的观众也能接触到基于研究的内容吗?
如果我能找到这三个问题的好答案,我就会开始写我的文章。
事实上,我的大部分文章想法都是在做一个项目的时候产生的,当时我很难在网上找到好的和最新的资料。
“如果有一本书你想读,但它还没有被写出来,那么你必须写出来。”
―托尼·莫里森
最后,如果你的内容是原创的,并为他们的读者带来价值,你总会找到有兴趣阅读它的读者。
"如果这本书是真的,它会找到一个注定要阅读它的读者。"
沃利·兰姆
一般准则
我现在给你一些建议,告诉你如何写一篇准备发表的好文章。
语法上
Grammarly 是一个 AI power 写作助手,通过安装它们的 web 扩展,可以在撰写中型文章时轻松使用。使用语法将使你的文章几乎不可能有拼写或习惯性错误。
GitHub Gists
《走向数据科学》文章的很大一部分都包含代码。通过在 Windows 或 Mac 上同时按下 Control + Alt + 6,代码片段可以很容易地集成到 Medium Markdown 界面中。
This type of code snippet is commonly used to diplay code outputs
另一个选择是使用 GitHub Gists 。git 非常容易创建,并且具有突出语法和更大格式灵活性的优势。如果你从未使用过 GitHub Gists,GitHub 文档是从开始的好地方。为了在中型文章中嵌入要点,只要确保选择可共享链接选项而不是嵌入即可。
免费开放数据源
解释数据科学主题的一个很好的方法是提供易于重复的演练示例。为了做到这一点,使用开源数据集可能是一个好主意。通过这种方式,读者将能够自己尝试代码是如何工作的,以及改变它会如何影响整体结果。
寻找开源数据集和共享输出代码的最佳地方之一是 Kaggle 。其他可以下载免费数据集的网站还有 UCI 机器学习库和 data.world 。
交互式数据可视化
添加交互式图表和 GIF 动画是为你的文章增加价值的另一种方式,因为读者可以自己改变动画的一些参数。
下面的 GIF 就是一个有趣的数据可视化的例子。事实上,从图 1 中我们可以看到 PCA(主成分分析)图中 3 个主成分的方差是如何分布的。使用静态图,不可能在所有三个不同的轴上看到如此详细的结果。
Figure 1: PCA variance plot
下面显示了一个交互式数据可视化的例子。在图 2 中,我们可以检查(使用滑块)在考虑所选的 min_split 和 min_leaf 参数的情况下,改变随机森林分类器中估计器的数量会如何影响我们模型的整体精度。
通过更改 n_estimators 参数,放大和缩小图表,更改其方向,并将鼠标悬停在单个数据点上以获得关于它们的更多信息,您可以随意摆弄下面的图表!
Figure 2: Interactive Data Visualization
如果你想知道我是如何制作这两个动画的,更多信息可以在我的交互式数据可视化和超参数优化文章中找到。
策展人指南
每次一篇文章在 Medium platform 上发表,都会被策展人审核,以决定是否应该在 Medium 上和文章标签的任何主题中做广告。因此,满足策展人的指导方针是写一篇成功文章的非常重要的一步。
如果你有兴趣了解更多关于媒体的指导方针,这些可以在这里找到。此外,也朝着数据科学写了自己的提交您的文章-清单。
TDS 提交
为了向《走向数据科学》提交你的第一篇文章,你所要做的就是在 Medium 上写一篇草稿,并阅读此处提供的指南。然后刊物会审核你的文章,再回来找你。
此外,走向数据科学最近还推出了一个 YouTube 频道,你可以在上面为创建自己的视频教程做出贡献(就像我为我的 GPU 加速数据分析&机器学习文章所做的那样)。更多信息请点击这里。
感谢阅读!
联系人
如果你想了解我最新的文章和项目,请在媒体上关注我,并订阅我的邮件列表。以下是我的一些联系人详细信息:
- 领英
- 个人博客
- 个人网站
- 中型简介
- GitHub
- 卡格尔
使用 Python 将 Google Sheets 数据写入 MySQL
原文:https://towardsdatascience.com/writing-google-sheets-data-to-mysql-using-python-9cabe2ed88cd?source=collection_archive---------11-----------------------
在数据作业中,我们经常使用不同的方法来编写和分析数据。Google sheets 是一个协作输入和共享数据的好方法。对于较大的数据集,Google sheets 处理起来非常慢,一种解决方法是在行数太多时创建一个新的工作表。我的团队正在进行的一个项目每周创建 3000 行,这对于大多数标准来说并不是太多的数据,但是几周后就陷入了困境。团队成员开始归档工作表,这使得对数据进行汇总变得非常困难。我认为将我们所有的数据写入 MySQL 表是一个更好的主意,这也允许其他团队将我们的数据加入到他们正在处理的其他表中。我将带您了解使用 Python 完成这一过程。对于这个项目,我将在 Windows 机器上使用 Jupyter Notebook、Python 3.7.1 和 MySQL Workbench 8.0。
谷歌工作表中的数据
我用 Google sheets 为这个项目创建了一个小数据集。我包含了两个工作表,第一个看起来像:
请注意,我故意在第 2 列中留出了两个单元格空白。这将是后面的一个例子。第二个工作表(底部的第二个选项卡)如下所示:
将 Google Sheets 连接到 Python
我们需要做的第一件事是使用 链接访问 谷歌开发者控制台。点击页面顶部的“创建项目”链接,创建一个新项目:
给项目起一个相关的名字,如下所示。
接下来,我们需要为项目创建一个服务帐户。点击页面左上角的导航菜单(3 条水平线,通常称为汉堡),选择“服务账户”:
您需要从页面顶部选择您的项目(a),然后点击“创建服务帐户”(b)。
为服务帐户取一个有意义的名称,然后单击“创建”。接下来,我们将服务帐户权限角色设置为所有者,并单击“继续”。在下一页,我们将跳过“授予用户对此服务帐户的访问权限”部分,转到下面的“创建密钥”部分。这将打开一个侧栏,允许我们选择一个键类型。选择“JSON”并点击“创建”。这将把 JSON 文件保存到您的计算机上,我们将使用这个文件从。
使用类似 Notepad++的工具打开 JSON 文件。找到包含“客户电子邮件”的行,并将整个电子邮件地址(在引号之间)复制到剪贴板。接下来,回到您的 Google sheet,它包含了您想要写入 MySQL 表的数据。点击电子表格右上角标有“Share”的绿色按钮。将 JSON 文件中的电子邮件地址粘贴到字段中,然后单击“发送”。这将允许我们的 Python 程序访问这个 Google 工作表。
设置 Jupyter 笔记本
现在一切都设置好了,我们可以继续学习 Python 了!对于本教程,我使用的是 Jupyter 笔记本和 Python 3.7.1。如果您的机器上没有安装 Python,您将需要这样做。Jupyter Notebook 自带 Anaconda,这是 Python 的一个很棒的包。您可以通过在搜索栏(在 Windows 中,在任务栏上)中键入“Jupyter Notebook”来启动 Jupyter Notebook,或者您可以启动 Anaconda 提示符,提示符打开后,键入不带引号的“Jupyter Notebook”,但我们稍后将需要 Anaconda 提示符,所以我建议使用所描述的第一种方法。
Jupyter 笔记本将在您的浏览器中启动。您将被引导至您的工作目录。您可以导航到不同的文件夹,但现在我们将通过单击页面右上角的“新建”并选择 Python 3 笔记本来创建一个新笔记本:
让我们通过点击页面顶部的笔记本名称(无标题)将笔记本重命名为“GoogleSheetsToMySQL”。接下来,我们需要将下载的 JSON 文件移动到我们的工作目录中。我相信默认目录在“C://users//your_username”下。
在我们开始编码之前,我们需要安装一些模块。要安装我们需要的模块,打开 Anaconda 提示符(您可以在任务栏的 Windows 搜索栏中找到它)。在 Anaconda 提示符下,您需要安装以下模块。通过键入以下命令并在每个命令后按 enter 键来使用 pip:
- pip 安装 gspread
- pip 安装 oauth 2 客户端
- pip 安装 mysql 连接器
我已经安装了这些,如命令提示符的输出所示(当试图安装 gspread 时):
因为我们将访问一个 MySQL 数据库,所以不要在代码中暴露我们的登录凭证是很重要的。我们将创建一个 Python 文件(。py)并将这些凭证存储在那里。然后,我们可以轻松地将它们导入我们的 Jupyter 笔记本脚本。创建您的。py 文件是用 Notepad++写的。为此我使用了 PyCharm,但也可以使用您喜欢的 IDE。打开 IDE 并创建一个名为“MySQLCredentials.py”的文件。在这个文件中,我们只需要输入 4 行代码并保存到我们的工作目录中。我们需要:
user = (your username)password = (your password)host = (hostname)database = (database schema you will be using)
保存文件并将其放入您的工作目录。
Jupyter 笔记本中的编码
现在,回到你的笔记本上。我们需要通过在第一个单元格中输入以下内容来导入将要使用的模块:
# import libraries**import** gspread**import** MySQLCredentials as mc**import** mysql.connector**from** oauth2client.service_account **import** ServiceAccountCredentials
运行单元,如果你没有得到任何错误,太好了!接下来,我们需要初始化一些变量来使用 gspread:
# initialize variables for gspreadscope **=** [‘[https://spreadsheets.google.com/feeds'](https://spreadsheets.google.com/feeds%27),[‘https://www.googleapis.com/auth/drive'](https://www.googleapis.com/auth/drive%27)]creds **=** ServiceAccountCredentials.from_json_keyfile_name(‘GoogleSheetsToMySQL.json’, scope)client **=** gspread.authorize(creds)
如果您将 JSON 文件命名为不同的名称,只需确保上面代码中的名称是正确的。现在我们需要定义一个从 Google 工作表中提取数据的方法:
# define method to pull data from spreadsheet**def** GetSpreadsheetData(sheetName, worksheetIndex): sheet **=** client.open(sheetName).get_worksheet(worksheetIndex) **return** sheet.get_all_values()[1:]
我们正在定义一个带有两个参数的方法。我们需要告诉它我们引用的工作表名称和工作表索引。工作表索引是指我们所引用的工作表标签。第一个选项卡的索引为 0,第二个选项卡的索引为 1,依此类推。在我们调用这个方法之前,我们不需要这些值,所以我们很快就会回来。该方法的返回类型是一个列表,它将返回该表上的所有值。然后我们使用[1:]分割列表,这将删除列表的第一个元素。因为 Google 工作表有一个包含列名的标题,所以我们只从工作表中提取数据。
在我们继续之前,让我们检查一下这个方法是否可以从工作表中获取数据。
在笔记本的新单元格中,输入
data = GetSpreadsheetData(‘GoogleSheetData’, 0)
您可能会得到一个错误,提示您需要启用驱动器 API。它将提供一个链接,您可以单击该链接来启用驱动 API。现在,重新运行该单元,并确保不会出现任何错误。我不得不运行它几次来启用两个独立的 API,并且在它没有给我一个错误之前必须等待一分钟。您应该不需要再次这样做。好了,现在检查你有你期望的数据。您可以检查列表的第一行,以及列表的长度(在本例中,有多少行数据):
print(data[0])
print(len(data))
应该会回来
[‘1’, ‘a’, ‘2019–01–01 1:00:00’]
10
现在我们需要设置一个方法来将这些数据写入 MySQL。使用 try-except-finally 块在这里会很有用。有几个注释块,前面用#表示,只是为了澄清:
# define method to write list of data to MySQL table**def** WriteToMySQLTable(sql_data, tableName):# we are using a try/except block (also called a try/catch block in other languages) which is good for error handling. It will “try” to execute anything in the “try” block, and if there is an error, it will report the error in the “except” block. Regardless of any errors, the “finally” block will always be executed. **try**:# Here we include the connection credentials for MySQL. We create a connection object that we pass the credentials to, and notice that we can specify the database which is ‘sys’ in the MySQLCredentials.py file because I’m using since I’m using the default database in MySQL Workbench 8.0. connection **=** mysql.connector.connect( user **=** mc.user, password **=** mc.password, host **=** mc.host, database **=** mc.database )# This command will drop the table, and we could just have the table name hardcoded into the string, but instead I am using the name of the table passed into the method. {} is a placeholder for what we want to pass into this string, and using .format(blah) we can pass the string name from the variable passed into the method here. sql_drop **=** “ DROP TABLE IF EXISTS {} “.format(tableName)# Now we will create the table, and the triple quotes are used so that when we go to the next line of code, we remain in a string. Otherwise it will terminate the string at the end of the line, and we want ALL of this to be one giant string. When injecting data into VALUES, we use the placeholder %s for each column of data we have. sql_create_table = “””CREATE TABLE {}(
Column1 INT(11),
Column2 VARCHAR(30),
Column3 DATETIME,
PRIMARY KEY (Column1)
)”””.format(tableName)
sql_insert_statement = “””INSERT INTO {}(
Column1,
Column2,
Column3 )
VALUES ( %s,%s,%s )”””.format(tableName)# Here we create a cursor, which we will use to execute the MySQL statements above. After each statement is executed, a message will be printed to the console if the execution was successful. cursor **=** connection.cursor() cursor.execute(sql_drop) print(‘Table {} has been dropped’.format(tableName)) cursor.execute(sql_create_table) print(‘Table {} has been created’.format(tableName))# We need to write each row of data to the table, so we use a for loop that will insert each row of data one at a time **for** i **in** sql_data: cursor.execute(sql_insert_statement, i)# Now we execute the commit statement, and print to the console that the table was updated successfully connection.commit() print(“Table {} successfully updated.”.format(tableName))# Errors are handled in the except block, and we will get the information printed to the console if there is an error **except** mysql.connector.Error as error : connection.rollback() print(“Error: {}. Table {} not updated!”.format(error, tableName))# We need to close the cursor and the connection, and this needs to be done regardless of what happened above. **finally**: cursor.execute(‘SELECT COUNT(*) FROM {}’.format(tableName)) rowCount **=** cursor.fetchone()[0] print(tableName, ‘row count:’, rowCount) **if** connection.is_connected(): cursor.close() connection.close() print(“MySQL connection is closed.”)
为了测试这一点,让我们运行下面的命令(您将需要运行 GetSpreadsheetData()方法,否则您将没有“数据”定义。
WriteToMySQLTable(data, ‘MyData’)
输出应该是:
Table MyData has been dropped
Table MyData has been created
Table MyData successfully updated.
MyData row count: 10
MySQL connection is closed.
在 MySQL Workbench 中检查数据看起来很成功,但是有一个问题需要解决。以下是 MySQL Workbench 中的表格:
请注意,我们有两个可能的问题。最后一行全部为空,我们很可能不希望这一行包含在内。但更重要的是,Column2 中缺失的值不为 NULL!这是因为 Python 正在读取工作表数据,并看到一个空值,它很可能被解释为空字符串。我们可能不希望这里有空字符串,而是期望空值。因此,让我们编写一个方法来清理空字符串值,并将它们作为空值写入。
def PreserveNULLValues(listName):
print(‘Preserving NULL values…’)
for x in range(len(listName)):
for y in range(len(listName[x])):
if listName[x][y] == ‘’:
listName[x][y] = None
print(‘NULL values preserved.’)
这样做的目的是检查空字符串值(“”),并用 Python 关键字“None”替换它们,这将作为空值写入 MySQL。让我们看看这个:
data = GetSpreadsheetData(‘GoogleSheetData’, 0)
PreserveNULLValues(data)
WriteToMySQLTable(data, ‘MyData’)
让我们在 MySQL Workbench 中查看一下这是什么样子的:
好多了!我通常不会在最后得到一个空行,但是如果需要的话,我们可以删除它。
现在,假设我们想用第二个工作表更新表,工作表索引= 1。这次我们不想掉表,只想插入表中。我们可以定义一个名为 UpdateMySQLTable 的新方法。我们将使用上述相同的方法(WriteToMySQLTable ),只是我们将删除以下代码行:
sql_drop = …
sql_create_table = …
使用新的工作表索引运行此方法:
data = GetSpreadsheetData(‘GoogleSheetData’, 1)
PreserveNULLValues(data)
UpdateMySQLTable(data, ‘MyData’)
现在,您将拥有一个包含 20 行的表格,每张表格包含 10 行。MySQL Workbench 中的结果表如下所示:
只要确保列名和顺序匹配即可,否则您将不得不重新排列它们。对于我的团队的数据,如果我们的方法发生变化,有时我们会在一个新的列中写入数据,我会返回并将空列插入到旧的选项卡中,然后重新导入所有数据。现在您可以利用 MySQL 中的数据库和 Google sheets 的功能了!下面是我的代码在 Jupyter Notebook 中的样子。编码快乐!
写作让我成为一名更好的工程师
原文:https://towardsdatascience.com/writing-is-making-me-a-better-engineer-619d6b1819d3?source=collection_archive---------27-----------------------
一篇文章对我职业生涯的影响
2015 年夏天,我走出了自己的舒适区,做了一些新的事情:我写了一篇文章。对,就是这样。如果你仔细想想,也没那么令人印象深刻。但是,尽管这一步是微小的,这一大步的涟漪却是我通向进步和机遇的大海的门票。
写作是我们可爱的老师从小就试图向我们灌输的一项技能。这是有道理的,对吗?毕竟,每个人都应该学习如何写和读。所以,非常感谢,亲爱的老师们。但是当我们不断地被诸如“写一篇关于你最喜欢的食物的文章”或“描述你的狗”这样的陈词滥调所推动时,老实说,在那个年龄我只想玩口袋妖怪,你会把写作的想法与一些敌对的东西联系起来。但是这种感觉并没有就此结束,或者至少对我来说没有结束!不,那种感觉和痛苦一直伴随着我,直到上大学,随着成年人的架子(好吧,我已经是个成年人了,但你明白我的意思)和责任的逼近,我知道我必须改变。
幸运的是,没有什么是永恒的,因此,我决心改变我的“eww 写作”观点。因此,四年前,我坐下来,想出一个我真正喜欢的话题,并写了一个技术教程。你猜怎么着?我越来越喜欢它,直到今天,在我写下那场灾难的几年后,我还在这样做。
My trusty Pokemon notepad.
我是一名软件工程师,主要与数据打交道。您可能已经听说过,数据已经成为(不管我们喜欢与否)我们生活中不可或缺的一部分。我们采取的许多行动,我们输入的点击,我们行走的步伐,以及我们甚至无法想象的事情,都被记录和记录在某个地方。但是,尽管这些数据具有革命性并被大肆宣传,但关键的细节是,这些数据本身并不多;它只是一堆数字、字符和比特,坐在某处等待被抓住和拥抱。幸运的是,有像我这样的人愿意为它发声。
每隔一天,我都会摘掉软件工程师的名牌,称自己为“数据故事讲述者”简单地说,我收集数据,分析数据,然后写下我的发现。很好玩!仔细检查和嗅一排又一排的数据感觉就像扮演一个寻找线索和渴望答案的侦探。然而,尽管我喜欢穿上我的白大褂,研究我今天走了多少步,但我的满足感来自于写下我的发现。
Custom titles are the best.
随着时间的推移,我意识到,在点击“发布按钮并获得一些我通常会得到的赞/掌声/观点后,我新发现的爱好并没有结束。没有。经过一些思考,我注意到我在这次扫盲之旅中获得的技能不仅影响了我的创造性,也影响了我的职业生活。
首先,如我所说,我是一名软件工程师。因此,我的大部分任务是在文本编辑器中输入指令,告诉计算机应该做什么。尽管这种写作与编写数据故事有很大的不同,但最近,我注意到我正在编写的代码在某种程度上更加优雅、流畅和可读。在写散文的时候,我们,或者至少是我,把我们的文章分成三部分:引言、主旨和结论。此外,每一部分都有其结构,其中的句子也有其形状。这种在头脑中思考如何设计一篇连贯的文章也成了我写代码的方式。
现在,我把我的节目看作一个故事,一个有开头、主旨和结尾的东西。在每段代码的开头,我都列出了我的“故事”的基本原则,同时向我自己(和未来的读者)解释在接下来的几行中我应该期待什么。然后,在文章的实质部分,我更加强调内容的可读性,而不是炫耀语言所有闪亮的特性。最后,在文章的结尾,我想对我刚刚写的内容做一个总结,简要地提一下结果应该是什么,并且在某些情况下,为任何未来的工作打下基础。因此,我愿意说写作提高了我写代码的能力。
Not much to tell here, though.
有时候,写一个话题需要事先研究我们将要讨论的主题。我遇到的每个数据集和问题都比前一个有一千倍的不同。因此,为了解决我将要承担的任务,这在大多数情况下意味着写下我将要剖析的数据集,首先,我需要学习、理解和研究一组适合我的问题的最佳工具和算法。我应该用 R 吗?Python?无监督学习?也许描述性统计就够了?现在,想象一下每年做几次,你知道我学到了多少吗?在我看来,所有这些技能、框架、算法和编程语言,我在那些漫长的文字之夜中遇到的,无疑使我成为了一名更好的工程师。
Data, yes!
我真诚地相信,一个工程师的“伟大”或“能力”不能仅仅用他知道多少或有多少生产力来衡量。一个高效的工程师,在我看来,就是拥抱所谓的软技能的人;你与同事相处的方式,办公室内的沟通方式,当然还有你回复那些早上第一件事就是问候你的不受欢迎的电子邮件的方式。正如你可能已经猜到的那样,写作,以及我在尝试通过我的短文、文章和教程进行非语言交流时学到的技能,极大地提高了我在“现实生活”中与他人通信和联系的能力。
但是,让我们做得更激烈些。如果你在这篇文章的顶部看到我的名字,你可能会认为我的母语不是英语。如果是这样,你是正确的。我来自加勒比海,我的母语是西班牙语(hola!),而且我有我所谓的芭蕉口音。但这里有一个重要的细节,我提出这个问题的原因是,我的大部分职业生涯都是在我的祖国之外的非西班牙语环境中度过的。所以我必须加紧提高我的英语水平!哇,我向你发誓,写作让我的词汇量增加了十倍。每隔一天,在谈话中,我会说“尽管”、“前面提到的”和“然而”(喜欢这个),人们会说“胡安,你刚才真的用了那个词吗?”“是的,我做到了。”所以再次,写作,此外(见?),把每一个术语都输入词库,努力想出一个花哨的、不重复的表达一个想法的方式,也提高了我的沟通能力。因此,我感到更加自信,因此,希望这能让我成为一名更好的工程师。
Plantains (not bananas!). Photo by Holger Link on Unsplash
最后,我想说,写作和它的教导,让我发现了一项我从来不知道自己会如此感兴趣的活动:演讲。在我写作过程中的某个时刻,我想知道把这些信带给真正的读者会是什么样。我照做了!但是哇说话其实挺难的。演讲日不是在公园散步。你流汗,紧张,忘词,等等。但是你知道吗?每次我站在数百双看着我的眼睛前,我都觉得自己做好了准备,因为我从生活中的每一个单词中学到的规则——连贯性、过渡、词汇等等——使我总体上成为一个更好的沟通者。虽然我不确定演讲是否会直接让我成为一名更好的工程师,但你遇到的人、学到的技能和教授的课程肯定会让我成为一名更好的工程师。
所以,谢谢你,写作。我迫不及待地想知道你接下来会带我去哪里。
现在你告诉我,写作对你有什么好处?
感谢阅读。
为超级计算机编写程序
原文:https://towardsdatascience.com/writing-programs-to-super-computers-edf3da4f2b8c?source=collection_archive---------26-----------------------
何时、何事以及如何改变你的代码。
Server Racks (Image Source)
抽象而不精确的印象
为了给超级计算机一个概念,想象一整套强大的机器,你可以把它们作为一个整体来使用。够奇怪吗?它不一定是一台拥有大量内存或 CPU 能力的机器。事实上,它们的确拥有强大的计算能力,但不仅仅是通过提高速度或内存。让我们来看看 NCI (我目前正好与之合作)。这些是在 NCI 的规格。
- 4,500 个英特尔至强 Sandy Bridge、Broadwell 和 Skylake 节点中的 89,256 个内核
- 32 个 NVIDIA Tesla K80 和 P100 节点中的 128 个 GPU
- 32 个节点中的 32 个 64 核英特尔至强融核处理器
- 4 个 IBM Power8 节点中的 64 个内核
- 300 兆字节的内存
- 8pb 的操作磁盘存储
- 混合 FDR/EDR Mellanox Infiniband 全胖树互连(高达 100 Gb/秒)
由于这是一个完整的计算设施,澳大利亚各地成千上万的用户使用,程序被接受以作业的形式运行,在特定的项目拨款(通常由研究机构资助)下提交给队列。不同的队伍收费不同。但是基本上是按 CPU 小时收费,乘以队列成本(由队列规格和优先级决定)。如果你有 1 个 CPU 程序运行 1 小时;你消耗 1 个服务单位乘以排队成本(如果你喜欢可以阅读更多)。通常授权数量级为数千或数百万 CPU 小时。
规格的含义
提交工作时,您可以指定所需的资源。这里最重要的事情是,系统架构对于 CPU 总是 x64,对于 GPU 总是 CUDA。所以当你为 Linux 操作系统编译时,你可以在超级计算机上运行它们。您的职位提交将如下所示。
#!/bin/bash
#PBS -P ch35
#PBS -q biodev
#PBS -l ncpus=28
#PBS -l mem=512GB
#PBS -l jobfs=1GB
#PBS -l walltime=100:00:00
#PBS -l wdmodule load java/jdk1.8.0_60module use -a /short/qr59/aw5153/modules/
module load canu/1.8java_path=$(which java)canu -p meta -pacbio-raw cluster-0cluster-0.fastq -d canu-cluster-0cluster-0/ maxMemory=512 maxThreads=28 useGrid=false java=$java_path genomeSize=50m
这是我用来组装宏基因组样本的真实脚本(有数百万次读取。或者像一些程序一样思考)。我已经从 project ch35 申请了 28 个内核/CPU,内存为 512GB,运行时间为 100 小时。所以我会消耗28 * 100 * 1.5 = 2800 * 1.5 = 4200
服务单位。1.5 是biodev
作业队列的成本。通常内存是不收费的,因为当你要求 28 个 CPU 时,它们会分配一个完整的节点,所以我们基本上每个节点都有576GB
的 RAM。
您可以看到,我们在 4500 个节点中有 89,256 个内核。这些节点可以被认为是通过 infiniband(超高速网络)连接的独立计算机。这些节点可以通过消息传递接口(MPI)共享数据,但它们没有共享内存。这意味着如果您要求 56 个核心,我将得到 2 个节点,每个节点 28 个核心,每个节点 576GB 最大 RAM(总共 1152GB 或 1TB RAM)。但是你不能加载一个超过 576GB 的程序。这是因为这些节点是 NUMA 节点,代表非统一内存访问。一个节点中的一个进程不能访问另一个节点的 RAM。所以如果你的程序更大,你就完了!还是你?
让我们用一个示例程序来看看这个场景
假设您想要计算一个巨大数据集(数百万个基因组读数——每个约 100k 个字符的字符串)的所有可能的 n 元文法。然后有一个每个 n 元文法计数的查找表。然后,对于每个字符串,您希望用它们在整个语料库中的 n-gram 计数来注释它们。最有效的方法是在内存中保存一个巨大的哈希表,并将其用作查找表,迭代每个 100k 字符串的 n 元语法并进行注释)。查找表将占用 25GB(假设)。按顺序做这件事需要很多时间,所以我们想并行处理它们。
什么时候改?
在我们的示例场景中,每个节点最多可以有 28 个线程(这个特定场景的 RAM 不是大问题)。但是仅用 28 个内核运行这个需要几天时间。现在,我们需要使用 28 个以上的内核,更有可能是 100 个甚至更多的内核。
现实:如果我只要求 1000 个(这会自动挑选 36 个节点)核心并提交我的作业,它会因颠簸而停止。这是因为尽管我要求 1000 个内核,但我的程序将在 1 个节点上运行,因为一个进程只能在一个节点上运行。
这时我们知道我们的程序必须改变以适应超级计算环境或网格系统。
要改什么?
如果我们能运行 1000 个并行进程,我们就能克服上述挑战。这是因为独立的进程可以在独立的节点上运行,因为操作系统(或网格系统)可以有效地调度它们。但是现在我们的 RAM 需求会立刻增加,需要我们25*1000GB
,因为我们必须为每个进程准备单独的查找表。我们只需要 25TB 的内存。但是对于 36 个节点,我们只有36*576GB = 20TB
。这就是我们需要多处理和多线程的地方。因此,我们需要改变线程和进程管理方面,以获得对服务单元的最佳利用。让我们看看该怎么做。
怎么改?
由于我们正在努力提高性能,我将从科学计算中经常使用的 C++和 Python 编程的角度进行解释。对于多线程,我们可以使用 OpenMP (C++)或者 python 的多处理库(你必须使用共享内存架构)。否则,您将再次丢失内存)。对于多重处理,您可以使用Open-MPI(c++和 Python 变体都可用)。现在,我们可以简单地部署每个进程有大约 28 个线程的进程。现在,每个进程将只使用驻留在单个节点上的 25GB RAM。同样,我们可以一次将更多的 100k 字符串加载到 RAM 中,用 28 个线程进行处理(因为在加载查找表后,每个节点中还有大量 RAM)。这个程序运行得快多了。
您将需要一些预处理和后处理来将初始数据集分成 36 个部分,并收集所有 36 个输出,这些输出可以是作业队列之外的简单的split and cat
命令。以下是来自 MPI 教程的修改代码。
#include <mpi.h>
#include <omp.h>
#include <iostream>
#include <vector>
#include <string>int main(int argc, char** argv) {
MPI_Init(NULL, NULL);
// Get the number of processes
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
// Get the rank of the process
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
// Print off a hello world message
vector<string> data; // Load data set of rank to run with 28 threads
#pragma omp parallel for num_threads(28)
for(string s: data)
// process // Finalize the MPI environment.
MPI_Finalize();
}
你真正的程序会比这复杂得多。如果您正在使用 python 工作,请确保您已经阅读了文档,以确保线程化时不会出现冗余内存共享(否则它将克隆所有共享变量,包括查找表)。
我打算分享完整的实现,但不是在这一点上,因为我打算介绍许多优化,你可以在未来的写作。
希望这是一本好书,至少对初学者来说是这样。
干杯!
用 pytest 为白蛋白库编写测试
原文:https://towardsdatascience.com/writing-test-for-the-image-augmentation-albumentation-library-a73d7bc1caa7?source=collection_archive---------26-----------------------
https://github.com/albu/albumentations
我的名字是弗拉基米尔·伊格洛维科夫。我是 Lyft 的高级计算机视觉工程师,Level5,将深度学习应用于自动驾驶汽车的问题。
我也是 Kaggle 特级大师和图像增强库相册的作者之一。这个库是从 Kaggle Masters 的一系列计算机视觉竞赛的获奖解决方案中脱颖而出的: Alexander Buslaev 、 Alex Parinov 、 Eugene Khvedchenya 和我。
大约一年前,我们发布了该库的 alpha 版本。从那以后,它被工业、学术界的机器学习工程师和研究人员采用,当然也被竞争激烈的机器学习社区采用。在过去的八个月中,Kaggle 计算机视觉挑战赛中的所有或几乎所有顶级解决方案都使用了我们的图书馆。
在某个时候,Alex Parinov 写了一篇关于单元测试的文本,以及我们如何使用它们来检查我们实现的 60 多个不同的转换。目前,我们需要通过 4470 个单元测试,才能合并每个拉取请求。问题是如何编写这些测试来增加覆盖率并减少重复代码的数量。
在那篇文章中,Alex 向读者展示了一组例子,解释了如何编写测试。他从一个简单的用例开始,然后是更高级的夹具和参数化。
我认为该文档没有得到数据科学界的足够重视。因此,我把它复制到这个平台上,对原文做了一些修改。
我将假设读者熟悉这个库。如果没有,您可以查看一套 Jupiter 笔记本,其中涵盖了不同计算机视觉任务的应用:
- 展柜
- 分类
- 物体检测
- 分割
- 非 8 位图像
- 分割
- 要点
- 自定义目标
- 天气变化
- 连载
写作测试
第一次测试
我们使用 pytest 来运行白蛋白的测试。包含测试的 python 文件应该放在albumentations/test
文件夹中。文件名应该以test_
开头。例如,test_bbox.py
。测试函数的名称也应该以test_
开头。例如def test_random_brightness()
假设我们要测试brightness_contrast_adjust
函数。该函数将 NumPy 数组作为输入,将所有值乘以指定的参数alpha
并返回结果数组。
让我们为这个函数编写第一个测试。测试将检查如果您向函数传递一个所有值都等于128
且参数alpha
等于1.5
的数组,该函数将产生所有值都等于192
的数组。(128 * 1.5 = 192)
在文件夹albumentations/test
中,我们创建一个新文件test_sample.py
在文件的顶部,我们添加了所有必需的导入:
**import numpy as np****import albumentations.augmentations.functional as F**
测试本身:
**def** test_random_contrast():
img = np.ones((100, 100, 3), dtype=np.uint8) * 128
img = F.brightness_contrast_adjust(img, alpha=1.5)
expected_multiplier = 192
expected = np.ones((100, 100, 3), dtype=np.uint8) * expected_multiplier
**assert** np.array_equal(img, expected)
为了运行来自test_example.py
的测试,此时它只包含一个测试,我们执行以下命令:
pytest tests/test_example.py -v .
-v
标志告诉 pytest 产生更详细的输出。
pytest 将显示测试已成功完成:
tests/test_example.py::test_random_brightness PASSED
测试参数化和@ pytest . mark . parameter ize 装饰器
上例中的函数很简单,它没有考虑到 8 位图像不能包含超过 255 =(2⁸-1)的值。
因此,我们希望函数brightness_contrast_adjust
来处理这个问题,并截取超出[0,255]范围的值。
让我们写一个测试:
**def** test_random_contrast_2():
img = np.ones((100, 100, 3), dtype=np.uint8) * 128
img = F.brightness_contrast_adjust(img, alpha=3)expected_multiplier = 255
expected = np.ones((100, 100, 3), dtype=np.uint8) * expected_multiplier
**assert** np.array_equal(img, expected)
接下来,我们将从test_example.py
开始运行测试:
pytest tests/test_example.py -v
输出:
tests/test_example.py::test_random_brightness PASSED
tests/test_example.py::test_random_brightness_2 PASSED
功能test_random_brightness
和test_random_brightness_2
看起来几乎一样。唯一不同的是alpha
和expected_multiplier
的值。为了消除代码重复,我们可以使用@pytest.mark.parametrize
装饰器。有了这个装饰器,我们可以描述哪些值应该作为参数传递给测试, pytest 将多次运行测试,每次都从装饰器传递下一个值。
我们可以使用参数化将之前的两个测试重写为一个测试:
**import** **pytest****@pytest.mark.parametrize**(['alpha', 'expected_multiplier'], [(1.5, 192), (3, 255)])
**def** test_random_brightness(alpha, expected_multiplier):
img = np.ones((100, 100, 3), dtype=np.uint8) * 128
img = F.brightness_contrast_adjust(img, alpha=alpha)
expected = np.ones((100, 100, 3), dtype=np.uint8) * expected_multiplier
**assert** np.array_equal(img, expected)
该测试将运行两次,在第一次运行中,alpha
将等于1.5
,而expected_multiplier
将等于192
。在第二次运行中,alpha
将等于3
,而expected_multiplier
将等于255
。
让我们进行测试:
tests/test_example.py::test_random_brightness[1.5-192] PASSED
tests/test_example.py::test_random_brightness[3-255] PASSED
正如我们所见, pytest 在每次运行时打印测试参数值。
使用辅助函数简化对图像和遮罩都有效的函数的测试
假设我们想要测试vflip
函数。此函数垂直翻转作为输入传递的图像或遮罩。面具的形状是(height, width)
。
**def** test_vflip_mask():
mask = np.array(
[[1, 1, 1],
[0, 1, 1],
[0, 0, 1]], dtype=np.uint8)
expected_mask = np.array(
[[0, 0, 1],
[0, 1, 1],
[1, 1, 1]], dtype=np.uint8)
flipped_mask = F.vflip(mask)
**assert** np.array_equal(flipped_mask, expected_mask)
测试的结果:
tests/test_example.py::test_vflip_mask PASSED
下一步,我们将测试相同的函数如何处理 RGB 图像,RGB 图像是具有形状(height, width, 3)
的三维 NumPy 数组。
**def** test_vflip_img():
img = np.array(
[[[1, 1, 1],
[1, 1, 1],
[1, 1, 1]],
[[0, 0, 0],
[1, 1, 1],
[1, 1, 1]],
[[0, 0, 0],
[0, 0, 0],
[1, 1, 1]]], dtype=np.uint8)
expected_img = np.array(
[[[0, 0, 0],
[0, 0, 0],
[1, 1, 1]],
[[0, 0, 0],
[1, 1, 1],
[1, 1, 1]],
[[1, 1, 1],
[1, 1, 1],
[1, 1, 1]]], dtype=np.uint8)
flipped_img = F.vflip(img)
**assert** np.array_equal(flipped_img, expected_img)
在这个测试中,img
的值与分配给test_vflip_mask
中的mask
变量的 NumPy 数组相同,但是这次它重复了三次(三个通道各一次)。expected_img
也是一个重复三次的 NumPy 数组,它被分配给test_vflip_mask
函数中的expected_mask
变量。
让我们进行测试:
tests/test_example.py::test_vflip_img PASSED
在test_vflip_img
中,我们手动定义了img
和expected_img
的值,分别等于重复三次mask
和expected_mask
的值。
为了避免不必要的重复代码,我们可以创建一个 helper 函数,它将一个形状为(height, width)
的 NumPy 数组作为输入,并沿着一个新的轴重复这个值三次,以生成一个形状为(height, width, 3)
的 NumPy 数组:
**def** convert_2d_to_3d(array, num_channels=3):
**return** np.repeat(array[:, :, np.newaxis], repeats=num_channels, axis=2)
接下来,我们可以使用该函数将test_vflip_img
重写如下:
**def** test_vflip_img_2():
mask = np.array(
[[1, 1, 1],
[0, 1, 1],
[0, 0, 1]], dtype=np.uint8)
expected_mask = np.array(
[[0, 0, 1],
[0, 1, 1],
[1, 1, 1]], dtype=np.uint8)
img = convert_2d_to_3d(mask)
expected_img = convert_2d_to_3d(expected_mask)
flipped_img = F.vflip(img)
**assert** np.array_equal(flipped_img, expected_img)
让我们进行测试:
tests/test_example.py::test_vflip_img_2 PASSED
通过使用参数化来简化对图像和遮罩都起作用的函数的测试
在上一节中,我们为vflip
编写了两个单独的测试。第一个检查了vflip
如何使用蒙版,第二个检查了vflip
如何使用图像。
这些测试共享大量相同的代码。因此,我们可以将公共部分移动到单个函数中,并使用参数化将关于输入类型的信息作为参数传递给测试:
**@pytest.mark.parametrize**('target', ['mask', 'image'])
**def** test_vflip_img_and_mask(target):
img = np.array(
[[1, 1, 1],
[0, 1, 1],
[0, 0, 1]], dtype=np.uint8)
expected = np.array(
[[0, 0, 1],
[0, 1, 1],
[1, 1, 1]], dtype=np.uint8)
**if** target == 'image':
img = convert_2d_to_3d(img)
expected = convert_2d_to_3d(expected)
flipped_img = F.vflip(img)
**assert** np.array_equal(flipped_img, expected)
该测试将运行两次,第一次运行时target
将等于'mask``。条件
if target == 'image':将不被执行,测试将检查
vflip如何与屏蔽一起工作。在第二次运行中,
target将等于
'image'。将执行条件
if target == 'image':,测试将检查
vflip`如何处理图像:
tests/test_example.py::test_vflip_img_and_mask[mask] PASSED
tests/test_example.py::test_vflip_img_and_mask[image] PASSED
我们可以通过将if target == 'image'
下的逻辑移到一个单独的函数中来进一步减少代码量:
**def** convert_2d_to_target_format(*arrays, target=None):
**if** target == 'mask':
**return** arrays[0] **if** len(arrays) == 1 **else** arrays
**elif** target == 'image':
**return** tuple(convert_2d_to_3d(array, num_channels=3) **for** array **in** arrays)
**else**:
**raise** ValueError('Unknown target {}'.format(target))
该函数将把形状为(height, width)
的 NumPy 数组作为输入,并根据target
的值,要么原样返回它们,要么将它们转换为形状为(height, width, 3)
的 NumPy 数组。
使用这个助手函数,我们可以如下重写测试:
**@pytest.mark.parametrize**('target', ['mask', 'image'])
**def** test_vflip_img_and_mask(target):
img = np.array(
[[1, 1, 1],
[0, 1, 1],
[0, 0, 1]], dtype=np.uint8)
expected = np.array(
[[0, 0, 1],
[0, 1, 1],
[1, 1, 1]], dtype=np.uint8)
img, expected = convert_2d_to_target_format(img, expected, target=target)
flipped_img = F.vflip(img)
**assert** np.array_equal(flipped_img, expected)
pytest 输出:
tests/test_example.py::test_vflip_img_and_mask[mask] PASSED
tests/test_example.py::test_vflip_img_and_mask[image] PASSED
使用夹具
假设我们想测试这样一种情况,我们将一个数据类型为np.uint8
的图像和蒙版传递给VerticalFlip
增强,我们希望它不会改变输入的数据类型,并将产生一个数据类型为np.uint8
的图像和蒙版作为输出。
这种测试可以写成如下形式:
**from** **albumentations** **import** VerticalFlip**def** test_vertical_flip_dtype():
aug = VerticalFlip(p=1)
image = np.random.randint(low=0, high=256, size=(100, 100, 3), dtype=np.uint8)
mask = np.random.randint(low=0, high=2, size=(100, 100), dtype=np.uint8)
data = aug(image=image, mask=mask)
**assert** data['image'].dtype == np.uint8
**assert** data['mask'].dtype == np.uint8
我们生成随机图像和随机遮罩,然后将它们作为输入传递给 VerticalFlip 转换,之后,我们检查输出值的数据类型。
如果我们希望对其他增强也执行这种检查,我们将不得不编写代码来在每次测试开始时生成随机图像和遮罩:
image = np.random.randint(low=0, high=256, size=(100, 100, 3), dtype=np.uint8)
mask = np.random.randint(low=0, high=2, size=(100, 100), dtype=np.uint8)
为了避免这种重复,我们可以将生成随机值的代码移到 fixture 中。夹具的工作原理如下:
在tests/conftest.py
e 中,创建用@pytest.fixture
装饰器包装的函数:
**@pytest.fixture**
**def** image():
**return** np.random.randint(low=0, high=256, size=(100, 100, 3), dtype=np.uint8)**@pytest.fixture**
**def** mask():
**return** np.random.randint(low=0, high=2, size=(100, 100), dtype=np.uint8)
在我们的测试中,我们使用夹具名称作为可接受的参数:
**def** test_vertical_flip_dtype(image, mask):
...
pytest 将使用参数的名称来查找具有相同名称的 fixture,然后它将执行这些 fixture 函数,并将输出作为参数传递给测试函数。
我们可以使用夹具重写test_vertical_flip_dtype
,如下所示:
**def** test_vertical_flip_dtype(image, mask):
aug = VerticalFlip(p=1)
data = aug(image=image, mask=mask)
**assert** data['image'].dtype == np.uint8
**assert** data['mask'].dtype == np.uint8
夹具和参数化的同时使用
假设我们想要检查两个转换是否正确地处理了输入和输出数据类型,例如, VerticalFlip 和 HorizontalFlip 。
从技术上讲,我们可以为每个转换编写一个单独的测试。我们在上一节为 VerticalFlip 写了一个。现在我们为水平的写几乎相同的:
**from** **albumentations** **import** HorizontalFlip**def** test_horizontal_flip_dtype(image, mask):
aug = HorizontalFlip(p=1)
data = aug(image=image, mask=mask)
**assert** data['image'].dtype == np.uint8
**assert** data['mask'].dtype == np.uint8
这种方法可行,但我们可以做得更好。在测试中消除不必要的代码复制会很棒。为此,我们可以使用参数化,并将一个类作为参数传递。
检查垂直翻转和水平翻转的测试可以写成如下:
**from** **albumentations** **import** VerticalFlip, HorizontalFlip**@pytest.mark.parametrize**('augmentation_cls', [
VerticalFlip,
HorizontalFlip,
])
**def** test_multiple_augmentations(augmentation_cls, image, mask):
aug = augmentation_cls(p=1)
data = aug(image=image, mask=mask)
**assert** data['image'].dtype == np.uint8
**assert** data['mask'].dtype == np.uint8
该测试将运行两次。在第一次运行中,augmentation_cls
参数将等于VerticalFlip
。在第二次运行中,augmentation_cls
参数将等于HorizontalFlip
。
pytest 输出:
tests/test_example.py::test_multiple_augmentations[VerticalFlip] PASSED
tests/test_example.py::test_multiple_augmentations[HorizontalFlip] PASSED
结论
现在,如果您克隆这个库并运行 pytest,您将会看到 60 多个转换被 4470 个测试所覆盖。每次合并拉取请求时,它们都应该通过。而且测试的数量还在增长。
当我们添加新的功能或修复在 https://github.com/albu/albumentations/issues报告的问题时,我们会编写新的测试。
单元测试并不容易涵盖机器学习管道中的所有内容。但是管道的某些部分,那些具有确定性的部分,我们肯定能够也应该涵盖。
遗憾的是,数据科学家低估了机器学习的这一部分,他们更关注过程的炼金术部分,如超参数或网络架构。
我希望通过这篇博客,我们至少激励了一些数据科学家,他们不会编写测试来实现一些简单的功能来检查一些东西。这可能是养成高质量代码的好习惯的第一步。
附注:所有文字归功于亚历克斯·帕瑞诺夫。
用 Python 编写探索人类遗传学的有用函数
原文:https://towardsdatascience.com/writing-useful-functions-to-explore-human-genetics-with-python-3e135540ea0?source=collection_archive---------20-----------------------
简单的 Python 函数有助于深入了解人类疾病
Image Courtesy of National Cancer Institute Via Unsplash
Python 和序列数据示例
许多人类遗传性神经退行性疾病,如亨廷顿氏病(HD ),与特定基因中三核苷酸重复数量的增加有关。在遗传学中,密码子,一种三核苷酸重复,编码氨基酸,蛋白质的组成部分。具体而言,在亨廷顿氏病中,病理严重性与 CAA 或 CAG 密码子重复的数量相关。这些密码子指定了氨基酸谷氨酰胺,它是 20 个小构件之一。因此,HD 属于统称为多聚谷氨酰胺(polyQ)疾病的一组疾病。
超过 35 个串联重复序列实际上就确定了这种疾病,而这种基因的健康变体有大约 6-35 个串联重复序列。
幸运的是,Python 可以用来编写简单的函数来研究 mRNA 转录物,组装蛋白质所需的指令模板,并确定 CAA/CAG 密码子串联重复的数量。
目标:
在生物学领域,我们很幸运,我们可能感兴趣的许多文件都是基于文本的文件,这些文件来自 NCBI 等数据库。这意味着我们可以将它们视为普通的 Python 字符串。
对于我将在这里演示的函数,我希望输出内容尽可能丰富。
具体来说,我想分析一个典型的编码亨廷顿蛋白的 mRNA 转录本的 FASTA 文件。在遗传学中,FASTA 文件是一个简单的文件,文件头包含序列的唯一标识符,序列本身位于文件头之下,如下所示:
FASTAheader
AGCTCGATACGAGA
我想检索并计算出该文件的登录号或标识符,序列的 DNA 长度。重要的是,我希望用户为要在文件中搜索的 CAA/CAG 密码子选择他们自己的串联重复数,并让输出通知用户 CAA/CAG 密码子在输入串联数以上的连续运行次数,这些串联序列是什么,以及每次运行中发现多少重复。
入门指南
首先让我们在一小段 DNA 序列上练习。我特意截取了这个带有“X”的 DNA 序列,以中断连续的 CAG/CAA 密码子运行。
首先,我使用。upper()方法。然后我使用 regex 模块,在这里我搜索出现三次或更多次的 CAG 或 CAA 密码子。管道字符|代表 or,花括号给出了需要查找这些序列的次数限制(在这里,逗号后面的上限被去掉了)。
因此,在这个例子中,我想找到在 DNA 串中出现三次以上的 CAA/CAG 序列,这意味着如果满足这个要求,应该找到长度至少为 9 的 DNA。然后,我遍历找到的匹配,保存在变量 pattern_match 中,并打印满足这个标准的序列。为了清楚起见,我还将这些序列附加到一个新列表中,并打印它们的长度。
找到 2 次运行,并且两次运行都高于至少 9 次运行的最小阈值。
使用文件
为了打开文件,我使用 open 函数,使用 with 语句。然后我将文件切片,因为我不希望 FASTA 文件的登录名称(头)影响我的 DNA 计数。这意味着我需要在元素 0 处对文件进行切片,这将删除文件头,然后读取切片后的文件 f,小心地删除任何新的行字符。
-下图显示了不删除新行字符的影响。这些字符会破坏 CAG/CAA 的连续运行,并给 DNA 增加额外的长度,这将不能代表序列数据。
The impact of forgetting to remove new-line characters; the sequence is artificially longer and not representative of the sequence data.
然后我使用如上所述的 re.finditer 方法。为了让这个代码片段工作,有必要导入 islice 和 re。
从 itertools 进口 islice
进口 re
下面显示的是脚本和控制台输出。如图所示,显示了登录名称,随后是序列长度,发现了多少个大于 3 的 CAA/CAG 游程,这些游程的序列及其各自的长度和串联重复数。
然而,这段代码可以提供更多的信息,也更容易解释。例如,在每一部分之前打印一条消息,告知用户输出代表什么。此外,这段代码有点不灵活,因为它只适用于“test.fasta ”,并检查 CAA/CAG 的连续运行 3 次或更多次。为了改进这个脚本,最方便的选择是将它转换成一个函数。
The output in the console is hard to interpret, and could include informative text beside.
功能创建
现在代码的主体已经写好了,创建一个函数不需要太多额外的工作。按照规定,用户应该能够自己选择的两个参数应该是要分析的 DNA 文件和串联重复的限制。
我定义了函数 huntington_tandem_repeat_dna,并在括号内给了函数两个参数。dna 参数是打开的文件,tri_nucleotide_repeat_num 的默认值为 3,以防用户决定不指定串联重复编号。
为了测试这个函数,让我们测试两种情况。一个是我创建的虚拟测试文件,用扩展名. fasta 保存。我已经在这个文件中包含了 2 个连续的 CAG/CAA 密码子。一个是 24 个碱基对长,另一个是 12 个。我已经包含了这个文件来验证函数是否按预期工作。
Boxed: The boxed section refers to a a 24 base pair segment, comprised of 8 tandem runs of CAA/CAG codons.
我正在运行的文件在我的本地目录中,因此我只指定了它们的相对路径。
我运行的另一个 DNA 样本是 mRNA 序列。在这里,我想确保在分析文件时,碱基对的数量是匹配的。NCBI 数据库告诉我序列长度应该是 13,498bp,当用这个 dna 文件调用Huntington _ tandem _ repeat _ DNA函数时,这确实得到了确认。除此之外,两种情况下的登录名称都匹配,这证明一切都按预期进行。
The output in the console is explicit.
摘要
兜了一圈,原来的目的已经达到了。该函数读取文件并给出清晰易懂的有用输出。
选择上图所示的第二个示例,我们可以清楚地看到,DNA 长度为 13,498 bps,用户已经搜索了 23 次或更多次 CAG/CAA 连续运行,但只找到一次符合该标准的运行。匹配的序列被打印出来,连同它的长度,以及包含该运行的串联重复的数目。
该功能现在完全可以扩展,例如处理多个文件并将输出写入任何特定的目的地,如果用户想要添加这种额外的功能。
我希望这篇文章展示了用 Python 编写函数是如何洞察人类遗传疾病的。更多代码示例,请关注我的 linkedIn 和 M edium 。
深度学习完全初学者指南:卷积神经网络和图像分类
原文:https://towardsdatascience.com/wtf-is-image-classification-8e78a8235acb?source=collection_archive---------0-----------------------
在几分钟内攻克 CNN 和图像分类的基础知识
Image by VislazFotosas via Pixabay
“我很早就注意到的一件事是,你不会把将要拍出来的东西放进照片里。或者反过来,出来的不是你放进去的。”
― 黛安·阿勃斯
你最喜欢的社交网络上弹出通知,有人发布了一张可能有你的照片。
没错。
这是你有史以来最差的照片。
GIF via GIPHY
那是怎么发生的?
图像分类!
卷积神经网络(CNN)是深度学习神经网络的一类。CNN 代表了图像识别的巨大突破。它们最常用于分析视觉图像,并且经常在图像分类的幕后工作。从脸书的照片标签到无人驾驶汽车,它们都是一切事物的核心。从医疗保健到安全,他们都在幕后努力工作。
他们又快又有效率。但是它们是如何工作的呢?
图像分类是获取一个输入(像一张图片)并输出一个类(像“猫”)或一个概率输入是一个特定的类(“这个输入有 90%的概率是一只猫”)。你可以看着一张照片,知道你正在看一张你自己的可怕的照片,但是计算机怎么能学会这样做呢?
用卷积神经网络!
美国有线电视新闻网
- 卷积层
- ReLU 层
- 池层
- 完全连接的层
一个经典的 CNN 架构应该是这样的:
输入- >卷积- > ReLU - >卷积- > ReLU - >汇集- >
ReLU - >卷积- > ReLU - >汇集- >全连接
CNN 卷积(非卷积…)学习输入数据的特征,并使用 2D 卷积层。这意味着这种类型的网络是处理 2D 图像的理想选择。与其他图像分类算法相比,CNN 实际上很少使用预处理。这意味着他们可以学习其他算法中必须手工制作的过滤器。CNN 可以用于大量的应用,从图像和视频识别、图像分类和推荐系统到自然语言处理和医学图像分析。
CNN 受到生物过程的启发。他们基于 Hubel 和 Wiesel 在 60 年代对猫和猴子的视觉所做的一些很酷的研究。CNN 的连接模式来自他们对视觉皮层组织的研究。在哺乳动物的眼睛中,单个神经元只在感受野对视觉刺激做出反应,这是一个受限制的区域。不同区域的感受野部分重叠,从而覆盖整个视野。这就是 CNN 的工作方式!
Image by NatWhitePhotography on Pixabay
CNN 有输入层、输出层和隐藏层。隐藏层通常由卷积层、ReLU 层、池层和全连接层组成。
- 卷积层对输入应用卷积运算。这将信息传递到下一层。
- 汇集将神经元簇的输出组合成下一层中的单个神经元。
- 完全连接的层将一层中的每个神经元连接到下一层中的每个神经元。
在卷积层中,神经元仅接收来自前一层的子区域的输入。在完全连接的层中,每个神经元接收来自前一层的每个元素的输入。
CNN 的工作原理是从图像中提取特征。这消除了手动特征提取的需要。特征没有经过训练!它们是在网络对一组图像进行训练时学习的。这使得深度学习模型对于计算机视觉任务来说极其准确。CNN 通过几十或几百个隐藏层学习特征检测。每一层都增加了所学特征的复杂性。
GIF via GIPHY
美国有线电视新闻网
- 从输入图像开始
- 对其应用许多不同的过滤器以创建特征地图
- 应用 ReLU 函数来增加非线性
- 将池化图层应用于每个要素地图
- 将合并的图像展平为一个长矢量。
- 将向量输入到完全连接的人工神经网络中。
- 通过网络处理要素。最后的全连接层提供了我们所追求的类的“投票”。
- 通过前向传播和后向传播训练很多很多个时代。这一过程一直重复,直到我们拥有一个定义明确的神经网络,该网络具有经过训练的权重和特征检测器。
这意味着什么呢?
在这个过程的最开始,输入图像被分解成像素。
GIF via GIPHY
对于黑白图像,这些像素被解释为 2D 阵列(例如,2x2 像素)。每个像素的值都在 0 到 255 之间。(零全黑,255 全白。灰度存在于这些数字之间。)基于这些信息,计算机可以开始处理这些数据。
对于彩色图像,这是一个包含蓝色层、绿色层和红色层的 3D 阵列。每一种颜色都有自己的值,在 0 到 255 之间。可以通过组合三层中每一层的值来找到颜色。
CNN 的基本组成部分是什么?
卷积
卷积步骤的主要目的是从输入图像中提取特征。卷积层总是 CNN 的第一步。
您有一个输入图像、一个特征检测器和一个特征图。你把滤镜一个像素一个像素地应用到输入图像上。你可以通过矩阵相乘来实现。
假设你有一个手电筒和一张气泡纸。你的手电筒照亮了一个 5 个泡泡 x 5 个泡泡的区域。要查看整张纸,你可以用手电筒扫过每个 5x5 的正方形,直到看到所有的气泡。
Photo by stux on Pixabay
手电筒发出的光是你的滤镜,你滑过的区域是感受野。滑过感受野的光是你的手电筒回旋。您的过滤器是一组数字(也称为权重或参数)。手电筒发出的光在行进过程中滑动的距离(你是在一次一排气泡上移动滤镜吗?两个?)被称为步幅。例如,步幅为 1 意味着您一次移动一个像素的滤镜。大会是一步两个脚印。
滤镜的深度必须与输入的深度相同,所以如果我们看的是彩色图像,深度应该是 3。这使得该滤波器的尺寸为 5x5x3。在每个位置,滤镜将滤镜中的值与像素中的原始值相乘。这是元素式乘法。将乘法相加,得到一个数。如果您从气泡包装的左上角开始,这个数字代表左上角。现在你移动你的过滤器到下一个位置,重复这个过程。你最终得到的数组叫做特性图或者激活图!您可以使用多个过滤器,这样可以更好地保留空间关系。
GIF via GIPHY
您将指定过滤器数量、过滤器大小、网络架构等参数。CNN 在训练过程中自己学习滤波器的值。您有许多选项可以用来为您的任务制作最佳的图像分类器。您可以选择用零填充输入矩阵(零填充),将过滤器应用于输入图像矩阵的边界元素。这也允许您控制特征地图的大小。加零填充是宽卷积。不加补零是窄卷积。
这基本上就是我们检测图像的方式!我们不会查看图像的每一个像素。我们看到像帽子、红色连衣裙、纹身等特征。每时每刻都有如此多的信息进入我们的眼睛,我们不可能处理其中的每一个像素。我们允许我们的模型做同样的事情。
这样的结果就是卷积后的特征图。它比原始输入图像小。这使得处理起来更加容易和快速。我们会失去信息吗?一些,是的。但同时,特征检测器的目的是检测特征,这正是它的作用。
我们创建了许多特征地图来得到我们的第一个卷积层。这允许我们识别程序可以用来学习的许多不同的特征。
可以用不同的值设置特征检测器,以获得不同的结果。例如,可以应用能够锐化和聚焦图像或者模糊图像的过滤器。这将对所有的价值给予同等的重视。您可以进行边缘增强、边缘检测等操作。您可以通过应用不同的特征检测器来创建不同的特征地图。计算机能够确定哪些过滤器最有意义并应用它们。
这里的主要目的是找到图像中的要素,将它们放入要素地图中,并仍然保留像素之间的空间关系。这一点很重要,这样像素才不会变得混乱。
让我们想象一下这个东西!
向我的小朋友问好:
Photo by Kirgiz03 on Pixabay
我们要用这个家伙作为我们的输入图像。
我们会让他黑白分明
import cv2
import matplotlib.pyplot as plt
%matplotlib inlineimg_path = 'data/pixabay_Kirgiz03.jpg'# Load color image
bgr_img = cv2.imread(img_path)# Convert to grayscale
gray_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2GRAY)# Normalize, rescale entries to lie in [0,1]
gray_img = gray_img.astype("float32")/255# Plot image
plt.imshow(gray_img, cmap='gray')
plt.show()
让我们定义并可视化我们的过滤器
import numpy as npfilter_vals = np.array([[-1, -1, 1, 1], [-1, -1, 1, 1], [-1, -1, 1, 1], [-1, -1, 1, 1]])print('Filter shape: ', filter_vals.shape)
滤镜形状:(4,4)
# Define four different filters, all of which are linear combinations of the `filter_vals` defined abovefilter_1 = filter_vals
filter_2 = -filter_1
filter_3 = filter_1.T
filter_4 = -filter_3
filters = np.array([filter_1, filter_2, filter_3, filter_4])# Print out the values of filter 1 as an example
print('Filter 1: \n', filter_1)
我们看到:
**Filter 1:
[[-1 -1 1 1]
[-1 -1 1 1]
[-1 -1 1 1]
[-1 -1 1 1]]**
这是我们的四个过滤器的可视化
现在让我们定义一个卷积层(我现在很喜欢 PyTorch,所以这就是我们在这里使用的。)
import torch
import torch.nn as nn
import torch.nn.functional as F
# Neural network with one convolutional layer with four filters
class Net(nn.Module):
def __init__(self, weight):
super(Net, self).__init__()
# Initializes the weights of the convolutional layer to be the weights of the 4 defined filters
k_height, k_width = weight.shape[2:]
# Assumes there are 4 grayscale filters
self.conv = nn.Conv2d(1, 4, kernel_size=(k_height, k_width), bias=False)
self.conv.weight = torch.nn.Parameter(weight)def forward(self, x):
# Calculates the output of a convolutional layer pre- and post-activation
conv_x = self.conv(x)
activated_x = F.relu(conv_x)
# Returns both layers
return conv_x, activated_x
# Instantiate the model and set the weights
weight = torch.from_numpy(filters).unsqueeze(1).type(torch.FloatTensor)
model = Net(weight)# Print out the layer in the network
print(model)
我们走着瞧
**Net(
(conv): Conv2d(1, 4, kernel_size=(4, 4), stride=(1, 1), bias=False)
)**
再多加一点代码
def viz_layer(layer, n_filters= 4):
fig = plt.figure(figsize=(20, 20))
for i in range(n_filters):
ax = fig.add_subplot(1, n_filters, i+1, xticks=[], yticks=[])
# Grab layer outputs
ax.imshow(np.squeeze(layer[0,i].data.numpy()), cmap='gray')
ax.set_title('Output %s' % str(i+1))
然后再多一点
# Plot original image
plt.imshow(gray_img, cmap='gray')# Visualize all of the filters
fig = plt.figure(figsize=(12, 6))
fig.subplots_adjust(left=0, right=1.5, bottom=0.8, top=1, hspace=0.05, wspace=0.05)
for i in range(4):
ax = fig.add_subplot(1, 4, i+1, xticks=[], yticks=[])
ax.imshow(filters[i], cmap='gray')
ax.set_title('Filter %s' % str(i+1))# Convert the image into an input tensor
gray_img_tensor = torch.from_numpy(gray_img).unsqueeze(0).unsqueeze(1)# Get the convolutional layer (pre and post activation)
conv_layer, activated_layer = model(gray_img_tensor)# Visualize the output of a convolutional layer
viz_layer(conv_layer)
我们可以在应用 ReLu 激活函数之前可视化卷积层的输出!
现在让我们使用 Sobel 算子作为边缘检测滤波器来创建一个自定义内核。Sobel 滤波器非常常用于边缘检测。它在寻找图像中的强度模式方面做得很好。对图像应用 Sobel 滤波器是一种在 x 或 y 方向上分别对图像的导数进行近似的方法。
我们将把我们的小家伙转换成灰度进行过滤
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)plt.imshow(gray, cmap='gray')
开始了。
# 3x3 array for edge detection
sobel_y = np.array([[ -1, -2, -1],
[ 0, 0, 0],
[ 1, 2, 1]])sobel_x = np.array([[ -1, 0, 1],
[ 0, 0, 0],
[ 1, 2, 1]])
filtered_image = cv2.filter2D(gray, -1, sobel_y)plt.imshow(filtered_image, cmap='gray')
想看看数学吗?看看 卷积神经网络简介 作者吴建新
ReLU 层
ReLU(校正线性单位)层是我们卷积层的另一个步骤。您正在将一个激活 函数应用到您的特征地图上,以增加网络中的非线性。这是因为图像本身是高度非线性的!它通过将负值设置为零来从激活图中移除负值。
卷积是一种线性运算,包括元素间的矩阵乘法和加法。我们希望 CNN 了解的真实世界数据将是非线性的。我们可以用 ReLU 这样的操作来说明这一点。您可以使用其他操作,如 tanh 或 sigmoid 。然而,ReLU 是一个受欢迎的选择,因为它可以更快地训练网络,而不会对泛化精度产生任何重大影响。
查看 C.-C. Jay Kuo 用数学模型理解卷积神经网络 。
想深入挖掘?试试何等 深究整流器:在 ImageNet 分类上超越人类水平的表现 。
如果你需要更多关于 激活函数的基础知识,你可以在这里找到 !
这是我们的小伙伴在 ReLU 激活功能将所有负像素值变成黑色后的样子
viz_layer(activated_layer)
联营
您最不希望看到的是网络在确切位置的确切阴影中查找某个特定要素。那对一个好的 CNN 来说没用!您想要翻转、旋转、挤压等的图像。您想要同一事物的大量照片,以便您的网络可以在所有图像中识别一个对象(比如说,一只豹子)。无论大小或位置如何。无论光线如何,无论斑点数量多少,无论豹子是在熟睡还是在撕咬猎物。你要空间方差!你需要灵活性。这就是联营的意义所在。
池逐渐减小输入表示的大小。这使得检测图像中的物体成为可能,无论它们位于何处。池有助于减少所需参数的数量和所需的计算量。这也有助于控制过度拟合。
过度拟合有点像你在没有理解信息的情况下,在考试前记忆超级具体的细节。当你记住细节的时候,你可以在家里用你的抽认卡做得很好。但是,如果给你提供新的信息,你将无法通过真正的测试。
(另一个例子:如果你的训练数据中的所有狗都有斑点和深色眼睛,你的网络将认为,对于要被分类为狗的图像,它必须有斑点和深色眼睛。如果你用同样的训练数据来测试你的数据,它将会对狗进行惊人的正确分类!但是,如果你的输出只有“狗”和“猫”,而你的网络呈现的新图像包含,比如说,一只罗威纳犬和一只哈士奇犬,它很可能会把罗威纳犬和哈士奇犬都归类为猫。可以看出问题了!)
Photo by Hybrid on Unsplash
如果没有方差,对于与训练数据不完全匹配的图像,您的网络将毫无用处。永远,永远,永远把你的训练和测试数据分开!如果你用你训练过的数据进行测试,你的网络会记住这些信息!当引入任何新数据时,它会做得很糟糕。
过度合身并不酷。
因此,对于这一步,你采取特征地图,应用池层,结果是池特征地图。
最常见的池例子是最大池。在 max pooling 中,输入图像被划分为一组不重叠的区域。每个区域的输出是每个区域的最大值。这使得尺寸更小,参数更少。
最大池化就是获取图像中每个点的最大值。这去掉了 75%的非特征信息。通过取像素的最大值,你就考虑到了失真。如果要素向左或向右旋转一点点,合并后的要素将保持不变。你在减少尺寸和参数。这很好,因为这意味着模型不会过度适应这些信息。
你可以使用平均池或总和池,但它们并不是常见的选择。在实践中,最大池往往比两者都表现得更好。在 max pooling 中,您将获得最大的像素值。在平均池中,取图像中该点所有像素值的平均值。(实际上,现在有一种趋势是使用更小的过滤器或完全放弃池层。这是对代表人数大幅减少的回应。)
想多了解一下为什么你会选择最大池,为什么你会喜欢两个像素的步长?看看张秀坤·舍雷尔等人。a1, 用于对象识别的卷积架构中的池操作评估 。
如果你去这里你可以看到一个非常有趣的卷积层的 2D 可视化。在屏幕左侧的框中画一个数字,然后真正地浏览输出。您可以看到卷积和汇集层以及猜测。尝试将鼠标悬停在单个像素上,以便可以看到应用滤镜的位置。
现在我们有了一个输入图像、一个应用的卷积层和一个应用的池层。
让我们来看一看池层的输出!
我们在这里:
汇集图层将上图中的要素地图作为输入,并减少这些地图的维度。它通过构建一个新的、更小的图像来实现这一点,该图像仅包含给定内核区域中的最大(最亮)值。
看到图像是如何改变大小的了吗?
很酷,对吧?
变平
这是一个非常简单的步骤。您将汇集的要素地图展平为一列连续的数字(一个长向量)。这使得该信息成为人工神经网络的输入层,用于进一步处理。
全连接层
在这一步,我们将一个人工神经网络添加到我们的卷积神经网络中。(不确定人工神经网络?你可以在这里了解他们!)
人工神经网络的主要目的是将我们的特征组合成更多的属性。这些将更准确地预测类别。这结合了可以更好地预测类的特征和属性。
在这一步,计算误差,然后反向传播。权重和特征检测器被调整以帮助优化模型的性能。然后这个过程一次又一次的发生。我们的网络就是这样训练数据的!
当有一个以上的神经元时,输出神经元是如何工作的?
首先,我们必须了解什么样的权重应用于连接输出的突触。我们想知道哪些先前的神经元对输出是重要的。
例如,如果您有两个输出类,一个是猫的,一个是狗的,则读取“0”的神经元绝对不能确定该特征属于猫。一个读到“1”的神经元绝对确定这个特征属于一只猫。在最终完全连接的层中,神经元将读取 0 和 1 之间的值。这意味着不同层次的确定性。值 0.9 表示 90%的确定性。
当一个特征被识别出来时,猫的神经元就知道这个图像是一只猫。他们说数学上相当于,“这些是我的神经元!我应该被触发了!”如果这种情况发生多次,网络就会知道当某些特征被激活时,这个图像就是一只猫。
Photo by Linnea Sandbakk on Unsplash
通过大量的迭代,猫神经元知道当某些特征被激活时,图像就是一只猫。例如,狗的神经元知道当某些其他特征被激发时,这个图像就是一只狗。例如,狗神经元再次了解到,“大湿鼻子”神经元和“软耳朵”神经元对狗神经元有很大的贡献。它赋予“大湿鼻子”神经元和“软耳朵”神经元更大的权重。狗神经元学会或多或少忽略“胡须”神经元和“猫虹膜”神经元。猫神经元学会给予像“胡须”和“猫虹膜”这样的神经元更大的权重。
(好吧,实际上并没有“大湿鼻子”或“胡须”神经元。但是检测到的特征确实具有特定类别的区别特征。)
Photo by Noémi Macavei-Katócz on Unsplash
一旦训练好网络,你就可以传入一幅图像,神经网络将能够非常确定地确定该图像的图像分类概率。
全连接层是传统的多层感知器。它在输出层使用一个分类器。分类器通常是 softmax 激活函数。完全连接意味着前一层中的每个神经元都连接到下一层中的每个神经元。这一层的目的是什么?使用来自前一层的输出的特征来基于训练数据对输入图像进行分类。
一旦你的网络建立并运行,你可以看到,例如,你有 95%的可能性你的图像是一只狗,5%的可能性你的图像是一只猫。
Photo by Alexas_Fotos on Pixabay
为什么这些数字加起来都是 1.0?(0.95 + 0.05)
没有任何东西表明这两个输出是相互联系的。是什么让他们联系在一起?本质上,它们不会,但是当我们引入 softmax 函数时,它们会。这使值介于 0 和 1 之间,并使它们相加为 1 (100%)。(你可以在维基百科上阅读所有相关内容。)softmax 函数获取分数向量,并将其压缩为 0 到 1 之间的值的向量,这些值的总和为 1。
应用 softmax 函数后,可以应用损失函数。交叉熵通常与 softmax 密切相关。我们希望最小化损失函数,以便最大化网络性能。
在反向传播的开始,你的输出值会很小。这就是为什么你可能会选择交叉熵损失。梯度会非常低,神经网络很难开始向正确的方向调整。使用交叉熵有助于网络评估甚至一个微小的错误,并更快地达到最佳状态。
想要更多吗?检查
- 这段 视频由杰弗里·辛顿 在 softmax 函数上
- 对交叉熵损失的友好介绍 作者 Rob DiPietro
- 如何实现一个神经网络间奏曲 2 作者彼得·罗伦茨
现在怎么办?
在这一点上,一切都是通过许多许多时代的向前和向后传播来训练的。我们最终得到了一个定义非常明确的神经网络,所有的权重和特征都经过了训练。现在我们有了可以识别和分类图像的东西!(不确定正向传播和反向传播?查看这里的绝对基础知识!)
刚刚发生了什么?
我们从输入图像开始,应用多种不同的特征来创建特征图。我们应用了 ReLU 来增加非线性,并对每个特征地图应用了汇集层。(我们这样做是为了确保我们的图像中有空间差异,减少图像的大小,避免模型过度适应数据,同时仍然保留我们想要的特征。)我们将所有汇集的图像展平成一个长向量。我们将向量输入到完全连接的人工神经网络中。这是通过网络处理所有要素的地方。这给了我们最终的全连接层,它提供了我们所追求的类的“投票”。所有这些都是通过前向传播和反向传播来训练的,直到我们最终得到了一个定义良好的神经网络,其中训练了权重和特征检测器。
现在我们可以识别和分类图像了!
Photo by Lucas Sankey on Unsplash
您正在朝着能够做到这一点的方向前进:
(你想那样做吗?这里有一个清晰完整的蓝图,可以用 PyTorch 创建一个极其精确的图像分类器!你可以创建一个图像分类器,它可以非常确定地告诉你你正在看的是哪种花!)
想了解更多?结账
- 吴建新 卷积神经网络导论
- Yann LeCun 的原创文章, 基于梯度的学习应用于文档识别
- 你需要了解的九篇深度学习论文(了解 CNN 第三部分) 作者 Adit Deshpande
感谢关注 新手、新手和新手深度学习 系列的第 3 部分!
你可以在这里找到第一部分: 深度学习简介
[## 深度学习简介
新手、新手和新手的神经网络。
towardsdatascience.com](/intro-to-deep-learning-c025efd92535)
和这里的第二部分: 人工网络完全初学者指南
[## 深度学习完全初学者指南:人工神经网络
深度学习入门!在 15 分钟内攻克人工神经网络的基础知识
towardsdatascience.com](/simply-deep-learning-an-effortless-introduction-45591a1c4abb)
如果你对这些信息做了什么了不起的事情,请在下面的回复中告诉我,或者发推特 @annebonnerdata !
数据科学的 WW(什么和什么时候)
原文:https://towardsdatascience.com/ww-what-and-when-of-data-science-dc4cc0bfd7b?source=collection_archive---------23-----------------------
学员系列
Source: themorgan.org
在深入研究数据科学之前,首先我想让你问自己一个问题:你真的对数据科学感兴趣吗?还是仅仅因为它是当前的趋势,有更多的机会(你可能在网上或通过某人听说过)或一个人可能会认为是因为花哨的工资!
在知道它是什么之前,我希望你花一些时间自己,并了解为什么你认为你需要了解数据科学。为什么要让自己意识到这样一个领域?你真的想在这个领域做出一番事业吗?或者只是你的一个朋友在这个领域,说他们赚的是花里胡哨的钱;所以现在你也对它感兴趣了!把你的头弄直。明白。让自己明白。试着记下原因。
现在,让我们考虑你实际上对这个领域感兴趣(如果你真的对这个领域感兴趣,对你有好处!).如果你不感兴趣,请继续阅读,不要担心,我会让你觉得有趣的!
如果你想在这个领域有所作为,那么你应该既感兴趣又有点担心(有点担心是好的;它有助于你能够知道如何让你确信某些事情。这是因为这是一个非常广阔的领域,它包含了太多的东西。它包括数学(更具体地说是统计学)。是的,你没看错,它包括数学;他们中的大多数人要么害怕,要么无缘无故地讨厌这个科目,这可能是因为他们表现不好或者不感兴趣。
在进入数据科学领域之前,在走这条路之前,你需要让自己意识到它是什么,它由什么组成,它对你有什么期望等等。这些问题应该引起重视。
- 你必须知道你在所有这些方面的位置。这将有助于你坚持自己的立场,有助于你了解自己缺乏什么,需要改进什么。
- 你必须知道进入这个领域的基本要求是什么。
- 你必须意识到事情在某个时候会变得多么困难,但是既然你对这个领域感兴趣,你就不必担心。人们倾向于努力做自己感兴趣的事情。你也会的!一旦你掌握了这些东西,你前进的道路就会变得更加容易。
- 你必须了解这些领域的职位名称/机会。你必须知道这些头衔意味着什么,这些工作需要什么样的技术,他们的角色是什么。
- 看看哪个角色最适合你,哪个角色更适合你。
- 不要只想着钱,因为他们说权力越大,责任越大。在这里,你也可以运用同样的思想,因为高薪职位意味着更多的工作/任务/责任。
你现在担心吗?如果没有,那好吧,那太好了,你是一个坚强的人。如果你是,还是不要担心;因为在本文的剩余部分,我将解释一些你需要了解的关于数据科学的基本知识。我们会明白它是什么,它是什么时候产生的,为什么它会存在?我们将一起探索这一切。
现在,我已经让你做好了心理准备,让我们开始研究数据科学。
数据科学到底是什么?
你一定想,“哦,上帝已经告诉我了”。从过去的几个句子中,你可能会多次遇到“数据科学”这个词。最后,现在是时候揭示它是什么了。
首先,我们来看看数据科学的定义。
根据某些网站:
- 数据科学是一个多学科领域,使用科学方法、流程、算法和系统从结构化和非结构化数据中提取知识和见解——维基百科
- “获取数据的能力——能够理解数据、处理数据、从中提取价值、可视化数据和交流数据——将是未来几十年非常重要的技能。” - 哈尔·瓦里安,谷歌首席经济学家,加州大学伯克利分校信息科学、商业和经济学教授
- "数据科学基于大量复杂数据或 大数据 提供有意义的信息。数据科学,或数据驱动的科学,结合了统计和计算的不同领域的工作,以解释决策目的的数据。 " - Investopedia
因此,根据某些网站或某些人,这些是数据科学的某些逐字逐句的含义。
因此,如果现在让你定义数据科学,你会如何定义?哇,我知道您可能刚刚阅读了数据科学的各种定义,现在我要求您立即自己定义它。如果你要定义它,那么它是伟大的!你正在取得进步。如果你仍然不明白,不要担心;我们将一起理解其中的含义。
让我们以维基百科的第一个定义为例。根据定义‘数据科学是一个多学科领域’。那么你所说的多学科是什么意思?别担心,我知道这个词很长。但是相信我,意思很简单。它意味着多个学科或专业或主题。它仅仅意味着它由来自各个领域的主题组成。
通过定义,它指出“它使用科学方法、流程、算法和系统从结构化和非结构化数据中提取知识和见解”。利用:科学方法,这意味着它是一种研究方法,在这种方法中,确定问题,收集所需/必要的数据,从数据中得出假设,并对假设进行检验;过程意味着以一定的顺序执行一定的步骤或动作,以达到特定的目的;算法意味着机器(主要是计算机)需要遵循的一组规则或一组指令或操作;系统基本上可以定义为作为机制的一部分一起工作的某些事物或一组事物;我们所知道的知识是通过经验获得的某些事实或信息或技能;洞察力是指对某事物获得准确或深刻理解的能力。
现在我们知道了某些术语的含义,并且在应用了维基百科规定的数据科学的定义后,我们可以说,这些方法、过程、算法系统用于数据科学中,以从结构化和非结构化数据中提取知识或信息并获得理解,这意味着数据类型是关系型或非关系型的,其中关系型是表格数据,数据以行和列的形式存储, 例如,关于学生的数据、非关系数据或非结构化数据是不以特定表格格式存储的数据,这些数据可以包括任何类型的数据,从文本数据到电影、图像、音频等。
所以现在我们已经弄清楚了数据科学的第一个定义。现在你的大脑面临一个挑战!试着自己找出其余的定义。没有那么难,如果你理解了第一个,我相信你也会理解剩下的一个!这对你的大脑将是一次健康的锻炼!
数据科学时间轴:
既然我们知道了数据科学实际上是什么,现在是时候让我们知道它是什么时候出现的了。
1962 年:
- 约翰·图基写了一篇关于统计世界的转变的文章,他说,“……当我看到数理统计的发展时,我有理由感到惊奇和怀疑..我开始觉得我的主要兴趣是在数据分析方面……”。Tukey 实际上指的是统计和计算机的融合,当时统计结果可以在几个小时内呈现,而不是手工完成的几天或几周。
1974 年:
- 彼得·诺尔是《计算机方法简明概览》一书的作者,他在书中反复使用了数据科学这个术语。诺尔提出了自己对这一概念的定义:
- 一旦数据被建立,处理数据的科学,而数据与它们所代表的关系则委托给其他领域和科学
1977 年:
- IASC(国际统计计算协会)成立。
- 其第一阶段的任务说明是,“IASC 的任务是将传统的统计方法、现代计算机技术和知识结合起来”。
- 图基写了第二篇论文,题目是探索性数据分析,,论述了使用数据选择“哪些”假设需要测试的重要性,并证实了数据分析和探索性数据分析应该携手合作。
1989:
- ACM SIGKDD 知识发现和数据挖掘会议组织了第一次研讨会
1992 年:
- 数据科学的第一个现代定义是在蒙彼利埃第二大学(法国)组织的日本-法国统计研讨会上提出的。
1994:
- 《商业周刊》曾刊登过数据库营销的封面故事,揭露了不祥的新闻公司已经开始收集大量个人信息,并计划开始奇怪的新营销活动。
1996 年
- IFCS(国际船级社联合会)成员在神户举行两年一次的会议。
- 在这里,数据科学一词第一次被纳入会议的标题——“数据科学、分类和相关方法”。
- 后来,Chiko Hayashi 在一次圆桌讨论会上引入了这个术语。
1997 年:
- 吴振伟院士做了题为“统计学=数据科学?”在密歇根大学。
- 在讲座中,他将统计工作描述为数据收集、数据建模和分析以及决策三部曲。
- 他后来主张把统计学命名为数据科学,把统计学家命名为数据科学家。
- 后来,他做了“统计学=数据科学?”,作为他 1998 年{.C. Mahalanobis,纪念演讲的第一篇,作为对 Prasanta Chandra Mahalanobis(印度科学家和统计学家,印度统计研究所的创始人)的敬意。
1999 年:
- Jacob Zahavi 指出,在挖掘数据以获取知识时,需要新的工具来处理业务中存在的大量信息。他写道:
- “可扩展性是数据挖掘中的一个大问题……传统的统计方法适用于小数据集。然而,今天的数据库可能涉及数百万行和数十列数据…另一个技术挑战是开发能够更好地分析数据、检测非线性关系和元素之间的交互的模型…可能必须开发特殊的数据挖掘工具来处理网站决策。”
2001 年:
- William S. Cleveland 将数据科学作为一门独立的学科引入。
- 他制定了培训数据科学家以满足未来需求的计划。他还介绍了一项名为数据科学的行动计划:一项扩大统计领域技术领域的行动计划。
- 软件即服务(SaaS)应运而生。
2002:
- ICS(国际科学理事会)、CODATA(科学技术数据委员会)创办了数据科学杂志——该杂志关注的问题包括数据系统的描述、应用、法律问题等。
2003:
- 哥伦比亚大学开始出版《数据科学杂志》,这是所有数据工作者表达观点、交流思想等的平台。
2005 年:
- 国家科学委员会出版了长期数字数据收集:21 世纪的研究和教育。
- 它将数据科学家定义为:“信息和计算机科学家、数据库和软件程序员、学科专家、管理员和专家注释员、图书馆员、档案员和其他人;他们对数字数据收集的成功管理至关重要。
2006 年:
- Hadoop 0.1.0,这是一个开源的非关系数据库;被释放了。
2008 年:
- 数据科学家曾风靡一时,后来也成为语言的一部分。
2009 年
- 约翰·奥斯卡森重新引入了 NoSQL 这个术语。
2011 年:
- 数据科学家的工作列表增加了 15,000%。这也导致了专门针对数据科学和大数据的研讨会、讲习班、会议等的增加。
2012 年:
- 在《哈佛商业评论》的文章— 数据科学家:21 世纪最性感的工作中, D.J. Patil 声称在 2008 年和 Jeff Hammerbacher 一起创造了这个术语来分别定义他们在 LinkedIn 和脸书的工作。
2013:
- IEEE 数据科学和高级分析工作组成立。
- 第一届 ECDA(欧洲数据分析会议)在卢森堡召开,成立了 EuADS(欧洲数据科学协会)。
- IBM 向世界展示了 90%的数据是在过去两年中创建的。
2014:
- 第一届国际会议:组织了 IEEE 数据科学和高级分析国际会议。
- 大会发起了学生付费训练营。
- 数据孵化器推出了竞争性的免费数据科学奖学金。
- 美国统计协会关于统计学习和数据挖掘的版块将其期刊更名为统计分析和数据挖掘:美国统计协会数据科学期刊,并于 2016 年将其版块名称变更为统计学习和数据科学。
2015:
- 斯普林格推出了国际数据科学和分析期刊来发表关于数据科学和大数据分析的原创作品。
- 随着深度学习算法/方法的使用,谷歌的语音识别、谷歌语音等的性能跃升至 49%。
这是数据科学的历史。每个人都应该意识到事物的起源,因为这有助于我们理解事物是如何产生和为什么产生的,这进一步有助于我们理解如何使用它。
快进到今天,我们可以看到有这么多的工作机会,但更少的人有资格做同样的事情。对数据科学家的需求非常大。据说缺乏具有数据科学技能的人,但对他们的需求正在迅速增长。
希望你喜欢。😃
参考资料:
维基百科,福布斯,数据大学
XᵀX、协方差、相关和余弦矩阵
原文:https://towardsdatascience.com/xᵀx-covariance-correlation-and-cosine-matrices-d2230997fb7?source=collection_archive---------19-----------------------
几种常见关联矩阵的计算方法
Below, we’ll unpack the calculations underlying plots like these
有没有遇到过这样的情况,您需要在没有函数帮助的情况下为动态数据得出成对的协方差、相关性或余弦矩阵?大概不会。
尽管如此,还是有必要看看这些矩阵是如何计算的,因为它们各自的计算有一些明显的共性。这一切的中心是 XᵀX 矩阵。在这里,您可以将 X 视为您收集的一些数据,其中每一列是不同的度量,每一行是不同的主题。
- 取 X 的转置并将其乘以自身,得到平方和叉积矩阵(ssCP),其中 SS 落在对角线上,叉积落在非对角线上。
- 将 X 居中,将其转置与其自身相乘,然后除以 n-1(其中 n = X 中的行数)得到方差-协方差矩阵,其中方差在对角线上,协方差在非对角线上。
- 将 X 标准化,将其转置乘以自身,然后除以 n-1(其中 n = X 中的行数)得到变量对之间的皮尔逊相关。
- 单位缩放 X 并将其转置与其自身相乘,导致变量对之间的余弦相似性
下面,我们将通过创建一个基于用户输入输出上述矩阵之一的函数来说明刚才查看的内容。
现在,我们可以通过创建一些数据并计算前面提到的关联来测试它。
平方和叉积
方差-协方差
皮尔逊相关
余弦相似度
我们将加载库“philentropy”来检查我们的工作,因为它包含许多有用的距离函数。请注意,我们正在转置
我们的数据,因为该函数的默认行为是对所有行进行成对
比较。
总之,我们已经展示了 XᵀX 可以被操纵来导出许多我们日常使用的常见关联矩阵。希望你下次运行相关性或检查数据集中变量之间的余弦距离时,记住这一点!
X-AI,黑盒和水晶球
原文:https://towardsdatascience.com/x-ai-black-boxes-and-crystal-balls-fd27a00752ec?source=collection_archive---------24-----------------------
内部人工智能
可信人工智能之路
在我们通往可信人工智能的道路上,我在我的上一篇博客中讨论了偏见的问题,它如何从人类传播到机器,它如何被人工智能应用放大,在现实世界中对个人和企业的影响,以及主动解决这个问题的重要性。今天,我将讨论所谓的“黑箱”模型的可解释性和透明性问题。
在可解释性和准确性之间做出选择?
要信任,你必须理解。人与人之间的关系就是如此。当涉及到采用增强人类能力的系统来产生洞察力和做出决策时也是如此。这是人类和机器之间的合作关系。像所有的伙伴关系一样,信任是关键。
也许毫不奇怪,人工智能和机器学习(ML)算法的可解释性已经成为该领域中讨论和研究最多的主题之一。
一个算法是可解释的意味着什么?这意味着该系统可以传达关于其内部工作方式、其学习的模式和其提供的结果的有用信息。可解释性是可解释性的一个更柔和、更轻松的版本。如果我们可以看到正在发生的事情,如果我们可以根据输入变量合理地预测结果,即使我们不一定知道系统是如何做出决定的,那么系统就是可解释的。
一些模型类型,如决策树和线性回归,非常简单、透明且易于理解。我们知道改变输入将如何影响预测的结果,我们可以证明每个预测。
Photo by Alina Grubnyak on Unsplash
不幸的是,赋予深度神经网络、随机森林或梯度推进机器等“黑盒”模型非凡预测能力的复杂性也让它们非常难以理解(和信任)。任何人工智能技术的运作本质上都是不透明的,即使对计算机科学家来说也是如此。从本质上来说,深度学习是一个特别暗的黑匣子。
用于训练这些模型的大量数据使问题变得更糟,很难找出哪些数据点对结果的影响比其他数据点更大。ML 算法随着时间的推移而发展的事实也使事情变得困难,因为算法不断地从新数据中学习。
归根结底,这是准确性和可解释性之间的权衡。问题是我们准备在这两个问题上做出多大的妥协。不幸的是,我们还没有达到既高度准确又完全透明的模型,尽管我们正在朝着这个方向前进。
总是很重要吗?
The number 42 is, in The Hitchhiker’s Guide to the Galaxy by Douglas Adams, the “Answer to the Ultimate Question of Life, the Universe, and Everything”, but what good is knowing the answer when it’s unclear why it is the answer?? — Photo by Mark König on Unsplash
对黑箱模型的怀疑和不信任越来越多。因此,工程师和数据科学家正在努力解决可解释性问题。监管机构也在调查此事。2018 年,《欧盟一般数据保护条例》( GDPR)引入了个人的一些基本权利,即被告知自动决策,反对这些决策的输出,以及获得有关所涉逻辑的一些有意义的信息。然而,它没有引入可解释的权利。最近,欧盟任命了一个专家小组来解决这个复杂的问题。这一努力已经导致了可信人工智能的高级指南的发布。
可解释性肯定是最重要的,但是它真的总是那么重要吗?
在这篇精彩的文章中,Elizabeth A. Holm 以一种更平衡的观点为黑盒模型辩护,至少在三种情况下:
- 当错误答案的成本相对于正确答案的价值较低时(例如,针对目标广告)
- 当它产生最佳结果时(从提供医疗诊断帮助到驾驶自动驾驶汽车)
- 当它激发和引导人类探究时(例如通过带来以前没有预料到的洞察力和提出新的问题)
人工智能采用的必要条件
然而,在大多数其他情况下,可解释性是确保采用人工智能应用的必要条件。
如果你不知道它是如何工作的,你怎么能相信它呢?
实现预测的高度准确性不足以证明最大似然算法缺乏可解释性。
让我们以医疗保健行业为例。
Photo by National Cancer Institute on Unsplash
人工智能在医疗保健等领域的潜在好处是巨大的。例如,计算机视觉可以用来帮助医生从扫描中识别肿瘤,提高诊断的准确性。类似的技术可以用来在任何症状出现之前预测疾病。然而,如果这些系统不能向医生和患者提供某种程度的解释,它们注定会失败。毕竟,谁会在意仅仅依靠计算机预测就开始具有挑战性副作用的侵入性手术或治疗呢?
2015 年,纽约西奈山医院(Mount Sinai Hospital)的一个研究小组将深度学习技术应用于该医院拥有 70 万份患者记录的庞大数据库。数百个变量被用来训练一个名为“深度病人”的系统。事实证明,它在预测癌症或精神疾病等疾病方面非常有效。在没有任何专家指导的情况下,Deep Patient 发现了隐藏在医院数据中的模式,这些模式似乎表明人们何时会出现这些情况。挑战在于这个工具不能提供任何关于它如何得出结论的线索。如果没有基本原理,系统做出的预测根本就不可用。
许多人和组织都在忙于人工智能和人工智能的实验,推动这项技术能够实现的边界。然而,我预测只有能够提供某种程度的可解释性和透明性的系统才能生存。
打开黑盒
幸运的是,有办法让黑盒更加透明,算法技术可以提高 ML 的可解释性。
Photo by Justin Clark on Unsplash
最基本的方法是使用代理方法。通常难以解释的 ML 模型被用作更易解释的模型类型的基准。
更复杂的方法包括应用建模后诊断技术,例如:
- 变量重要性 (VI),了解顶级输入变量。
- 部分相关图 (PDP),用于测量特性对 ML 模型预测结果的边际影响。
- 个体条件期望 (ICE),类似于 PDP,但针对个体数据实例,并在本地级别提供更多粒度。
- 局部可解释的模型不可知解释 (LIME),为特定预测提供解释。这是一种与模型无关的技术,用于通过改变输入并观察预测如何变化来理解模型。
- 沙普利重视 (SHAP),这是一种在博弈论中使用的技术,用于确定合作游戏中的每个玩家对其成功做出了多大贡献。在建模过程中,每个 SHAP 值测量模型中每个要素对预测的负面或正面贡献。
我突然发现,为了解决复杂性问题,我们最终增加了另一层复杂性。然而,这似乎是让黑匣子变得更加透明和可信所需的代价,因此也更有用。也许主要的挑战不是技术,而是数据科学和工程团队的文化和实践。一切都取决于他们是否愿意和准备好将可解释性需求融入到人工智能应用的设计、开发和部署中。
透明,不可解释
在人工智能中创造透明和信任超越了黑盒模型的解释能力。这只是从数据、发现、部署到决策的端到端分析生命周期的一个方面。
Traceability & Lineage across the entire analytics life-cycle
过程和工具需要能够建立数据、模型和决策的可追溯性和谱系。这是建立对 AI 信任的先决条件。这通常也是 It 合规性或法规要求。
致力于可信人工智能的组织必须能够回答许多问题。
关于数据
- 我们用什么数据来训练模型?
- 它是从哪里来的?
- 我们能相信它吗?
- 我们有法律依据来处理这些数据吗(尤其是当它包含个人或敏感数据时)?
- 数据有多好?质量够好吗?
- 它对人工智能应用程序的目的有代表性吗?它能包含多少偏见?我们是否发现了任何歧视性变量或可能与歧视性变量相关联的变量(例如,邮编有时可能与种族相关联)?
关于分析模型
- 模型是否有完整的文档和版本控制?
- 在这些模型的设计和开发过程中做了哪些假设?
- 我们有受控的环境和自动化的过程来部署和测试模型吗?
- 模型在整个分析生命周期中具有完全的可追溯性吗?
- 我们是否有一个正式的流程来度量模型的准确性和性能?
关于人工智能驱动的决策
- 使用模型的输出做出了什么决定?
- 什么数据被用来做决定?我们能相信这些数据吗?
- 这些决策对业务成果和客户有什么影响?
- 我们有从使用点(在现实世界中做出决策的地方)到数据科学和工程团队的反馈回路吗?
构建可信的人工智能应用远远超出了模型的可解释性。它要求我们在所使用的技术、组织和业务流程中遵循透明原则。这必须是一项深思熟虑、积极主动的努力,以确保数据驱动的创新伴随着有效的商业成果和人工智能技术的道德使用。
更多信息,请阅读我关于这个主题的另外两篇博客:
- 算法,中立的假象
- 伦理学,技术的新前沿
播客的 x 射线
原文:https://towardsdatascience.com/x-ray-for-podcasts-65289a36d9e4?source=collection_archive---------21-----------------------
Photo by Priscilla Du Preez on Unsplash
如何在没有标签的情况下识别不同的扬声器
亚马逊为 Kindle 和视频提供了一个工具,它称之为“X 射线”,让你获得关于手边场景的额外信息。这些信息包括出现的角色,并有助于在一本书的各个部分之间导航,或者深入到一个模糊熟悉的演员的电影记录中。
人们可能会想象,生产这样一种服务的需求需要某种形式的标记(要么完全用手工,要么用分类器)。然而,如果我们可以完全不用任何标签劳动就能推断出分裂,这不是很酷吗?有了这个,我们就可以计算出角色抢尽风头的程度、时间和持续时间,以及不断变化的对话动态。
X-Ray for Video on Amazon Prime. Pretty pretty good
我选择看音频——比视频简单,但也是类似视频任务的一个组成部分。为了测试一个简单的基本情况,我选择了一个包含两个人之间缓慢交替对话的播客,并在# 123-识别&诚实中看到了山姆·哈里斯和以斯拉·克莱恩的聊天——两个不同的男性声音,我们的耳朵可以毫不费力地分辨出来。最终产品应该是这样的:
The final audio X-Ray
1。创建“块”来标记
用 scipy 读入音频是一件轻而易举的事——单声道音频只是一个按时间顺序排列的 1D 数组。我们现在考虑改变用于存储我们将标记的数据“块”的窗口大小的权衡。这里的采样频率 Fs 是标准的 44.1 kHz,这意味着我们的数组大小为 44,100 * N,块时间 N 秒。窗口越小,时间位置就越精确,并且语音相互干扰的可能性就越小。
但是更长的时间窗也有助于识别声音——而不仅仅是尖锐的元音。我们可能会怀疑这涉及到在足够长的时间内观察某种平均音色。基于这次讨论中冗长的发言时间,五秒钟最终给出了良好的结果(如果有更多的中断,这可能是太大了)。
在频率分辨率上也有更基本的妥协(认为更短的时间窗给出更宽的谱峰)。但是这种现象只有在我们为整个组块提取频谱时才是重要的。如果我们分析共同告知组块标签的子组块,我们可以避开这一点(这正是我所做的)。
Chunking audio has the same effect as applying a rectangular window — it changes the green peak to the blue peaks. The frequency resolution in a discrete Fourier transform is proportional to Fs/N. Source http://saadahmad.ca/fft-spectral-leakage-and-windowing/
傅立叶变换是连接“倒易坐标”的数学。它的缩放特性抓住了我们在许多物理现象中观察到的折衷,例如在频谱分析中(频率分辨率与时间精度);夫琅和费衍射(狭缝间距越小,衍射图样越宽);量子力学中的不确定性(我们确定的位置越精确,动量的不确定性就越大)。
2。音频功能
信号的时间成分并不能揭示声音的本质特征。声波只是空气中的压力扰动,这些扰动的周期性确实揭示了频域中的某种特征。每个块的快速傅立叶变换( FFT )完成了这个任务,并产生了下面描述的频谱。
Frequency spectra for Ezra Klein (left) at 30:00–30:05 and Sam Harris (right) at 16:40–16:45. We actually only need the positive terms since for purely real input the output coefficients are “Hermitian-symmetric” i.e. every complex conjugate appears and these correspond to redundant negative-frequencies
这些频谱显然是非常密集和高维的,因此我们可以使用男性音域的带宽来进行粗略的截止。
fs/N represents the unit element change in frequency as we move between elements in the FFT spectrum
这降低了频谱的维数,但回想一下,每个频率分量实际上有两个值,一个实部和一个虚部。当我们观察光谱时,我们看到的是两部分的数量级。然而,傅立叶变换中的相位(两部分的比率)承载了图像和音频的大部分信号。
我们可以通过交叉 Ezra 和 Sam 剪辑之间的幅度和相位来测试这一点,下面是一些(未标准化的)突变剪辑。
Doing naughty things with audio
Original and mutant clips of crossed real/imaginary parts and magnitudes/phases between two chunks
此时,我们可以将幅度和相位的结构传递给一个降维算法(见第 4 节)来可视化输出。这是我最初做的产生两个非常模糊的组,它也不是很快。
librosa 库有多个函数用于从频谱中提取特征(如“质心”、能量分布等)。)或时间序列(如过零率)。我们也可以考虑使用 scipy.signal 来检测频率峰值和峰值宽度。然而,我们选择的特征必须是特定于通过音色以音高不变的方式分离声音的任务。如果问题集中在音高检测上,我们会选择区分音高而不是音色的特征。
Examples of audio features as described in Eronen, Antti & Klapuri, Anssi. (2000), Musical instrument recognition using cepstral features and temporal features
换句话说,我们必须确保选择的特征不会精确地“指纹化”数据——我们需要更模糊的东西。我们转向在这方面证明最成功的特性——Mel 频率倒谱系数(MFCCs)。
3。提取梅尔频率倒谱系数
MFCCs 最初被开发用来表示人类声道发出的声音。它利用 Mel 标度,即频率的对数变换,旨在捕捉人类对声音的非线性感知,从而降低对较高频率差异的敏感度。这意味着 MFCC 向量之间的较大距离与较大的感知变化相关,因此可以更稳健地捕捉音色,而不仅仅是音高。这和这比我能更好地深入他们的计算机制,所以我将避免在这里这样做。
自动语音识别任务通常查看 12–20 个倒谱系数,第 0 个系数可以被丢弃,因为它仅传达平均功率的恒定偏移,与整体频谱形状无关。通过选取 15 个系数并去掉 0 阶,我的结果还不错。
MFCC spectrogram for Ezra Klein (left) at 30:00–30:05 and Sam Harris (right) at 16:40–16:45. Removing the 0th order coefficient in the top row gives the bottom row which exhibits a smaller range between the coefficients
MFCC 提取涉及“成帧”或“开窗”,在输入上应用滑动窗口,很像短时傅立叶变换,以产生几百组 15 个系数(在每个音频块内),每个连续帧一个。这里的基本原理是,我们希望保留信号在暂时稳定时出现的频率轮廓。如果我们对整个块进行傅立叶变换,这些可能会丢失(正如我最初所做的)。
Framing within a single “chunk” of audio being identified. Consecutive frames are often set to overlap partially
当分析音频的小窗口时,一些附加的傅立叶理论在这里是值得考虑的。模拟不连续性,如方波的尖角,需要许多高频项。如果我们在整个音频中创建尖锐的仓,我们可以预期边缘处的不连续性会产生杂散高频成分以及频谱泄漏,因此使用窗口函数使边缘逐渐变细是有意义的。
从光谱计算 MFCCs 的过程具有大大降低输入维数的额外好处。在每一帧中,我们采集大量样本(这里是 2048 个),将这些样本减少到每帧 15 个系数。最终的特征向量是从所有这些帧的系数的平均值建立的。增加方差并不能改善结果。
The process for extracting MFCCs. Mel filter banks have a triangular bandwidth response on a Mel-scale and there are typically 40 of them. Source: https://www.ijser.org/paper/Performance-analysis-of-isolated-Bangla-speech-recognition-system-using-Hidden-Markov-Model.html
4。维度缩减
PCA 是事实上的降维主力——一种快速、确定性的线性变换,当沿着最大方差的特征向量分离数据时,它可以保留数据的全局结构。例如,如果我们对 MNIST 数字进行分组,我们将会看到 1 的聚类的质心远离 0,而 4,7,9 的聚类相对较近。然而,我们不能假设在高维空间中邻近的邻居也是紧密的。
一种更现代的方法是 tSNE ,这是一种受益于保留局部结构的随机技术——它将邻居放置在高维空间中彼此靠近,但以一些全局结构为代价。例如,分组 MNIST 数字时,我们看到干净孤立的簇,而 PCA 产生连续的拖尾。
UMAP and tSNE on different datasets. The global structure in the MNIST dataset is apparent
UMAP 是一种较新的技术,能够捕捉全局结构(à la PCA)和局部结构(à la tSNE)。它也比最好的多核 tSNE 实现快得多(在 MNIST 上快 13 倍),并且还可以提供定制的距离函数。在这个双音问题中,降维技术的决策可能不太重要,但获得一些实践经验也是很好的。一旦 MFCCs 进行第一阶段的缩减,对 3600 个块 x 15 个系数的处理时间非常快。
5.结果
下图显示的不是两个不同的集群,而是三个!每个点的颜色表示进入播客的时间,边连接连续的块。因此,深蓝色的点表示这段介绍可能是在不同的时间,用不同的设备或在不同的环境下录制的。这里好看的是 Sam 打开的介绍集群(深蓝色)更接近他的对话集群。如果我们移除一些较高的 MFCC 系数(8+)的话,这两个集群实际上可以被包含在内,尽管代价是 Sam 和 Ezra 之间的全局分离。
The three distance metrics I saw perform the most reliably for this task of the many UMAP has built in were manhattan, braycurtis and cosine. Silhouette scores above each plot were used for light guidance on clustering performance. A small dark blue cluster appears sometimes given different MFCC parametric configurations
在这里,我们可以对 k=3 个聚类应用 kmeans,通过监听每个聚类中的点,将每个点映射到三个标签中的一个。但是将每个点链接到它的音频块以便点击播放不是很好吗?这将有助于聚类的验证,并回答诸如“一个聚类中最接近另一个聚类的点是否代表具有两种声音的组块”之类的问题。使用破折号和 plotly 以及一些 javascript 和一个第三方库,这被证明是令人惊讶的挑战,但不是不可克服的。
总之…结果!
Dash app with plotly and some javascript. Note the final point selected that is being tugged by both clusters features both Ezra and Sam (braycurtis distance metric used)
不会太寒酸吧?现在我们有了我们的 kmeans 标签,我们可以计算经常引用的辩论统计数据,发言持续时间。
**Sam Harris** 365 chunks
**Ezra Klein** 272 chunks
**Intro** 85 chunks
除了介绍之外,Sam 讲了 57%的时间!毕竟这是他的播客。再加上每个数据块的时间成分,这是一个相当令人满意的最终产品:对话的 X 射线时间线。在 2500s 的 Sam 阶段的交换频率表明这个部分特别有趣/激烈。
The final audio X-Ray, again
密码
我整理了我的笔记本,可以在这个要点中找到
参考文献
[## mfcc
信号的 mel 倒谱系数(MFCCs)是一个很小的特征集(通常大约 10-20 ),它…
musicinformationretrieval.com](https://musicinformationretrieval.com/mfcc.html) [## 机器学习的语音处理:滤波器组,梅尔频率倒谱系数(MFCCs)
语音处理在任何语音系统中都起着重要的作用,无论是自动语音识别(ASR)还是语音识别系统
haythamfayek.com](https://haythamfayek.com/2016/04/21/speech-processing-for-machine-learning.html) [## 使用 Wavenet、MFCCs、UMAP、t-SNE 和 PCA 进行比较音频分析
这篇文章是关于一个探索二维音频数据集的项目。我涵盖了一些有趣的算法,如…
medium.com](https://medium.com/@LeonFedden/comparative-audio-analysis-with-wavenet-mfccs-umap-t-sne-and-pca-cb8237bfce2f) [## 在 ARM 系统上计算 MFCCs 语音识别特征
我在 Linagora 的 R&D 部门做 LinTO 项目的实习生。你认识林托吗?如果没有,你应该!林托…
medium.com](https://medium.com/linagoralabs/computing-mfccs-voice-recognition-features-on-arm-systems-dae45f016eb6)
x 射线图像分类:简单的方法
原文:https://towardsdatascience.com/x-ray-image-classification-the-easy-way-69665448604a?source=collection_archive---------20-----------------------
使用谷歌云 AutoML
Chest x-ray of a healthy child
“人工智能将比人类历史上任何东西都更能改变世界。不止电。”—人工智能甲骨文和风险投资家李开复博士,2018
随着人工智能(AI) 和机器学习(ML) 的快速进步,以及我未婚夫自愿分享的人工智能每日文摘,我认为是时候深入了解并亲自看看到底是怎么回事了。我尤其感兴趣的是,如何巧妙地将人工智能融入产品开发对话,以及如何应用它来打造人们喜爱的产品。毕竟,如果你不知道某样东西有什么能力,你怎么能真正用它来创新呢?
虽然我获得了计算机科学学士学位,但我不是人工智能、人工智能或深度学习方面的专家。你也不需要成为一个专家来开始。在这篇文章中,我将分享如何使用神经网络进行图像分类的“简单方法”。注意,图像分类不同于图像检测和图像识别[1]。我将从如何创建数据集开始,然后这将被用作建立机器学习模型的输入。请记住,这不是唯一的方法,而是学习如何用神经网络进行图像分类的起点,特别是如果你是人工智能领域的新手。
你知道吗?深度神经网络最适合进行图像分类。
在我们开始之前,这里有一些我们将使用的例子的背景。下面使用的 x 光图像是儿童的。这个图像分类项目的目的是帮助医疗专业人员快速识别患有肺炎的儿童。
创建数据集
数据集是数据的集合。这是正确的关键部分,因为它是你的模型建立的基础。如果它不在数据中,模型就不会学习它不知道的东西。为了训练机器学习模型,高质量的数据集是必不可少的,因为数据定义了模型的行为和性能。
数据定义了模型
仅仅拥有大量数据并不等于拥有高质量的数据集。归结起来就是拥有“正确的数据”。这意味着数据必须:
- 反映真实世界的例子
- 捕捉模型可能遇到的所有变化/场景示例— 常见、罕见以及介于两者之间的所有情况。
- 使用多样化的例子(例如,不要只使用背景中有雪的狗的图片,因为模型可能会将雪背景与狗联系起来,但实际上我们希望模型检测的是狗而不是雪)
- 保持平衡— 如果一个类/类别的例子比另一个多,那么训练好的模型表现会很差。
- 随着新的例子或变化的出现而定期更新,以便模型也知道这些。
数据拟合
我们还需要确保数据集涵盖所有必要的用例。缺乏足够的用例可能会导致模型训练不足。创建数据集时应该问自己的问题:
- 我需要多少数据?
- 我需要什么类型的数据?
- 数据集中有足够的变化来涵盖所有的例子吗?
- 数据是否准确完整地反映了所有相关的用例?
回到我们的儿童 x 射线图像数据集示例,它应该包含以下内容:
- 每个儿童年龄(有或没有肺炎症状)的 x 光片数量均衡
- 曝光时间范围不同的均衡数量的 x 射线图像(有和没有肺炎症状)
- 包含可能与肺炎相混淆的其他诊断的 x 射线图像
除了有一个多样化的数据集,有各种各样的正面和反面的例子,我们还需要有与每个例子相关联的标签。如果数据集尚未被标注,则需要先对其进行标注,然后才能将其用作构建模型的输入。你可以自己给数据集贴标签,也可以付费完成。
“在现代人工智能中,数据决定一切。人工智能软件的智能取决于用来训练它的数据。如果系统中白人男性比黑人女性多得多,那么识别黑人女性的能力就会更差。”— 《纽约时报》
一定要注意不平衡的数据集,它们会在你的模型中引入不必要的偏差。不平衡数据集是指一个或多个标签的示例明显多于或少于其他标签的数据集。给数据集加标签后,检查与每个标签相关联的示例数量,以确保每个标签都有相同数量的示例。如果你看到一个特定的标签只有几个例子,而其他的有十几个,那么当这个模型用于现实世界时,你很可能会观察到一些偏差。一旦您对数据集的覆盖范围感到满意,就该构建模型了。
建立模型
有两种方法可以建立模型:(1)自动 ML 和(2)定制建模。“自动化 ML”是一项付费服务,这意味着它很容易上手,并且对于快速开发或模型原型制作来说很便宜。然而,它很难扩展,并且提供商可以访问敏感数据。另一方面,“定制建模”对于无限的用例是完全可定制的,并且可以完全控制用于调整模型的参数。但缺点是入门成本高,需要机器学习专业知识。在线自动化 ML 服务,如谷歌云和 IBD 沃森,使任何人都可以通过简单地提供高质量的标签数据集来快速创建模型。
在我们开始构建我们的模型之前,定义我们期望从这个模型中得到的业务目标和结果是很重要的。还要考虑你希望你的模型具有的性能水平。作为一个开始的基准,我们可以在这项任务中使用人的表现。如果模型能比人类做得更好,那么我会说模型处于一个不错的状态。现在,让我们建立一个模型。
1.训练模型
如前所述,数据定义了模型的行为和性能,包括其功效和准确性。因此,坏数据会导致坏模型。例如,如果你给一个模型输入一个训练数据中没有的图像,它将不会被正确分类。
对于我们的 X 射线示例,我们将使用 Google Cloud AutoML Vision 来训练模型。我们将使用 Kaggle [2]中已经准备好的数据集。首先,点击“新建数据集”上传带标签的数据集:
1.0 Look for the “New Dataset” button in dotted blue circle
数据上传后,您的屏幕应该如下所示:
1.1 A data set uploaded successfully
接下来,我们将使用此数据集训练模型,方法是转到“train”选项卡,然后单击“Train model”。
1.2 Look for “Train Model” button within the “Train” tab.
请注意,该数据集将被自动划分为用于训练、测试和验证模型的数据集,因为用于训练模型的数据不应用于测试或验证模型。
在完成模型训练后,我们需要了解这个模型“有多好”。我们将深入研究分析模型结果的方法,也就是输出。
2.评估模型
为了理解我们模型的质量,我们需要测量它的性能。为此,通常使用以下指标:
- 精度是正确预测占预测总数的百分比。
- Recall 是实际实例总数中正确预测的百分比(又名真实标签,基本事实正面)。
2.0 Example of precision and recall for an unbalanced data set
- F1 得分是准确率和召回率的加权平均值;这既考虑了的误报又考虑了的漏报。请注意,F1 分数也可以从下面的混淆矩阵中计算出来。
2.1 F1 Score Equation
- 混淆矩阵是描述模型的性能,特别强调模型哪里是正确的(见蓝色)和/或失败的(见橙色)。
2.2 The confusion matrix for the same unbalanced data set from above
回到我们停止使用 AutoML Vision 训练模型的地方,转到数据集的“评估”选项卡,查看模型的性能。它应该是这样的:
2.3 Model evaluation
如果您向下滚动,您将看到更多指标(如混淆矩阵),还可以看到每个特定标签的绩效指标。
没有训练一个模型一次就得到“完美模型”的说法。这是一个反复的过程。因此,如果您对结果不满意,您有两个选择:1)改进数据,2)实现自定义模型。我强烈建议您首先考虑改进数据,一旦您无法获得任何更好的结果,才考虑实现您自己的模型。在这一点上,您将会更好地理解为什么您的模型没有达到预期。尽管如此,如果有一个高质量的数据集,AutoML 提供的模型可能会让您达到一个不错的水平。
3.模型预测
最后,让我们看看模型在新图像下的表现。转到“预测”选项卡,上传未在训练/测试数据集中使用的图像。
3.0 Look for “Upload images” button within the “Predict” tab
一旦做出预测,您的屏幕应该看起来像这样:
3.1 A model’s prediction on a new child x-ray image
恭喜你,你已经完成了你的第一个模型!
你自己试试
您现在已经准备好亲自尝试图像分类。没有比亲自尝试更好的学习方法了。
请注意,谷歌云提供价值 300 美元的免费试用,帮助您入门。因此,它不会花费你任何东西。
这里有一些资源可以帮助你开始:
- [1] 用 ML 进行图像检测、识别和分类
- [2] 儿童胸部 x 线照片来自 Kaggle
- 云汽车视觉初学者指南
- 云汽车
欢迎在下面的评论中分享你的想法。
XGBoost:直观的解释
原文:https://towardsdatascience.com/xgboost-an-intuitive-explanation-88eb32a48eff?source=collection_archive---------23-----------------------
我们都知道 XGBoost 是如何凭借性能和速度在 Kaggle 比赛中称霸的。这个博客是关于理解 XGBoost 是如何工作的(试着解释一下研究论文)。这篇博客不是关于如何编码/实现 XGboost 或者如何调优它的超参数。
XGBoost 代表 eXtremeGradientBoosting。首先,回顾一下图 1 中的装袋和增压。它解释了 bagging(引导聚合)和 boosting(自适应 Boosting)。更准确地说,助推是如何添加到装袋的想法。在装袋过程中,随机选择不同袋子的数据点,并以相等的概率进行替换。在 boosting 中,基于迄今为止的模型性能来选择数据点。当创建一个新的包时,表现为差的数据点被赋予更多的权重。基于该重量,拾取数据点(轮盘赌类型选择)。XGBoost 基于类似的 boosting 思想(非随机地构造新的树)。
Figure 1. Bagging vs Boosting
类似于 boosting,我们在 XGBoost 中基于模型到目前为止的性能构建一个新的树。图 2 给出了构建新树背后的符号和数学。
Figure 2. Building a new Tree in XGBoost
上面的步骤显示了当树按顺序构建时(像在 boosting 中),如何计算新的树的权重。如果我们知道树的结构 q ,我们就可以在方程(3)中获得根的权重和得分函数。但是我们不知道 q** 并且不可能枚举和尝试每一个树形结构。在寻找树的过程中,在树性能和计算工作量之间有一个折衷(取决于算法)。论文中提到的算法的要点如图 3 所示。**
Figure 3. Finding the tree structure q
这是本文的前三部分。第 4 节涉及系统设计(更多的是从数据工程师的角度,我个人没有这方面的专业知识)。第 5 节讨论以前的工作,第 6 节显示 XGBoost 性能评估。
XGBoost 的开发者做了大量的工作超越了仅仅是开发一个新的算法来构建树。其中包括:
- 他们使它们在计算上高效(这使得扩展 XGBoost 和在非花哨的计算设备上实现成为可能)。
- XGBoost 可以处理缺失和稀疏的数据
- 它基于并行和分布式计算(可以在短时间内处理数百万个数据点,允许快速的模型探索)
参考文献:
XGBoost:一个可扩展的树提升系统(原文)
机器学习掌握(解释 XGBoost 的优点)
谈 XGBoost 陈(XGBoost 的主要作者)
打包 (Udacity 视频)
提升 (Udacity 视频)
我希望这篇博客对理解 XGBoost 背后的逻辑有所帮助。如果有错误或不清楚的地方,请写信给 ucdavis.edu 的 ashnayak
原载于 2019 年 12 月 17 日 https://medium.com**的T22。
亚马逊 SageMaker 中的 XGBoost
原文:https://towardsdatascience.com/xgboost-in-amazon-sagemaker-28e5e354dbcd?source=collection_archive---------6-----------------------
SageMaker 中 XGBoost 分类的完整演练
什么是 SageMaker?SageMaker 是亚马逊网络服务(AWS)的机器学习平台,在云中工作。它是完全托管的,允许用户在平台上执行整个数据科学工作流。在这篇文章中,我将向您展示如何从 AWS S3 调用您的数据,将您的数据上传到 S3 并绕过本地存储,训练模型,部署端点,执行预测,以及执行超参数调整。
数据清理和特征工程代码来源于 这篇 的博文,作者是 Andrew Long,他给出了使用其代码的完全许可。数据集可以在 这里找到 。
启动您的笔记本实例
前往你的 AWS 仪表板,找到 SageMaker,在左侧栏,点击“笔记本实例”。要创建实例,请单击橙色按钮“创建笔记本实例”。在这里,您可以选择实例名称、实例类型、弹性推理(根据需求和使用情况调整实例大小)以及其他安全特性。除非您的公司有特定的安全需求,否则我倾向于不考虑这些,只填写实例名。启动需要几分钟时间,在成功托管实例之后,AWS 为您提供了两个选项来编写代码;朱庇特笔记本或朱庇特实验室。
导入包
一旦您选择了其中一个选项,您将需要运行一些代码来准备好您的笔记本。
由您来决定是否导入前半个包,但是您需要导入后四个包才能开始。
从 S3 读取数据
从 S3 读取数据有几种不同的方法,为了尽可能简单,我们将使用pd.read_csv
。
请注意,如果数据集位于没有文件夹的桶中,则不需要前缀。
数据清理和特征工程
由于这是一个 SageMaker 演练,而不是一个功能工程帖子,我将简要说明我采取了哪些步骤来准备数据集来训练我们的模型。
问题陈述
我们试图预测糖尿病患者是否会在最后一次就诊后 30 天内再次入院。这里的OUTPUT_LABEL
将是我们的readmitted
专栏。我们将那些有<30
的标记为阳性,其余的标记为阴性。我们还:
- 放弃
discharge_dispositon_id
,因为有些价值观与死亡或临终关怀有关 - 删除了
encounter_id
和patient_nbr
,因为它们是患者标识符 - 重新标记了
age
并将weight
变成了一个二进制变量 - 仅取
medical_specialty
中的前 10 个值,并将其余值分组为Other
- 在
race
、payer_code
和medical_specialty
变量中填入 NaN 作为UNK
- 使用
pd.dummies()
对所有分类变量进行一键编码
我们最终得到 143 个特征,8 个数字特征和 135 个分类特征。
SageMaker 中 XGBoost 的一个非常重要的地方是,你的 **OUTPUT_LABEL**
必须是训练和验证数据集中的第一列。
我发现了一个非常有用的代码,将您的OUTPUT_LABEL
移动到数据集的第一列,它是这样的:
培训/验证/测试
我们将数据集分成 70/15/15。一个好的做法是上传这些。csv 文件到 S3,分别在培训和验证文件夹下。您将需要培训和验证文件。
如果因为文件太大而耗尽了本地笔记本实例存储,可以使用以下代码绕过本地存储,直接上传到 S3。
接下来,您需要用导入的sagemaker
库指定您的培训和验证文件。如果没有前缀(桶内文件夹),可以删除第二个{}
。
模型
培养
注意到我们没有安装和导入 XGBoost 吗?这是因为我们将使用 SageMaker 提供的预构建 XGBoost 容器。我们将导入包,设置我们的训练实例,并设置超参数,然后使模型适合我们的训练数据。
就是这样!恭喜你,如果你正确完成了以上步骤,你的模特应该正在训练!
估价
如果你不关心探索你的模型中的顶级特性(坏主意!),可以跳过这第一段。在 SageMaker 的预构建 XGBoost 中绘制特性重要性不像在 XGBoost 库中那样简单。
首先,您需要找到培训作业名称,如果您使用上面的代码来启动培训作业,而不是在仪表板中手动启动,培训作业将类似于xgboost-yyyy-mm-dd-##-##-##-###
。你可以在这里找到:
SageMaker 中可能有一行代码,您可以运行它来返回最新的作业名称,这将省去您去仪表板查找它的麻烦。如果你找到了,请告诉我!
在您找到培训工作名称之后,您将需要运行下面的代码来从 S3 下载模型工件到笔记本实例,然后使用tarfile.open()
打开工件,提取它,然后使用pickle
加载它。在 AWS SageMaker 研讨会上呆了三天后,这是我们找到的最好的解决方法。
然后,由于 XGBoost 使用无头数据帧,我们必须将特性名称追加回各个列。要绘制顶部特征,使用以下代码(cols_input
是输入变量,不包括OUTPUT_LABEL
):
我们现在将部署一个端点,它是您传递新的和看不见的数据(测试集)以获得预测的网关。
你的预测现在被存储为predictions
数组。
使用您选择的阈值创建混淆矩阵:
您将阈值设置在第二行,高于该阈值的任何内容都将被归类为阳性。上面的代码会返回类似这样的结果。
最后但同样重要的是,让我们绘制你的 AUC!
超参数调谐
超参数调优工作也可以从 SageMaker 仪表板启动,但我喜欢在笔记本上做任何事情。从笔记本中启动超参数调整工作有许多不同的方法,但是在尝试了许多代码之后,我相信这是最简单的方法。
上面单元格的输出应该返回InProgress
,这意味着您已经成功启动了一个贝叶斯超参数调优作业。请注意,max_parallel_jobs 设置为 10,在运行贝叶斯优化算法时,不应该超过这个值。我相信最大值是 30,但是设置在 10 以上会导致很多失败的工作,这是浪费时间和金钱。您也不需要指定 XGBoost 模型中的每个参数,如果您删除了一个参数,作业仍然会运行。
您将再次需要通过找到您的最佳执行模型的名称来下载模型工件。您可以通过转到仪表板中的“Hyperparameter tuning jobs ”,单击相应的调优作业,然后按客观指标(在本例中为 AUC)排序,复制最佳模型的名称,并使用您下载模型工件时使用的代码。下面是代码:
为了托管一个端点,您将需要附加到模型上,这是我们在第一次训练迭代中没有做的事情。我不确定为什么会出现这种情况,但是您需要运行这行代码,然后才能托管用于预测的端点。
请注意,该模型的名称与您找到的优化模型的名称相同。
结论
在本文中,我向您展示了:
- 如何启动您的笔记本实例
- 导入相关包
- 如何从 S3 读取数据
- 如何上传本地文件到 S3,如何上传到 S3 而不保存在本地
- 如何开始培训工作
- 如何下载您的模型工件,加载它,并提取模型中的顶级特性
- 如何部署端点并在测试集上获得预测
- 如何绘制混淆矩阵,获得模型度量和 AUC
- 如何启动超参数优化作业并获取优化后的模型
这是我第一次使用 SageMaker 进行这样的项目,我想分享一下我的工作流程和体验。感谢您阅读本文!
谢谢你看我的文章!
如果你觉得这篇内容很有帮助,并想阅读我的其他内容,请随时关注我: Twitter
insta gram
脸书
我发布了一些你可能会觉得有用的数据科学技巧和窍门!
XGBoost 简介:使用监督学习预测预期寿命
原文:https://towardsdatascience.com/xgboost-predicting-life-expectancy-with-supervised-learning-1f61e0222f5f?source=collection_archive---------4-----------------------
A beautiful forest. So random! Source: Pixabay
今天,我们将使用 XGBoost Boosted 树对官方人类发展指数数据集进行回归。谁说监督学习就是分类的?
XGBoost:是什么?
XGBoost 是一个 Python 框架,它允许我们利用多核并行来训练增强树。它在 R 中也是可用的,尽管我们不会在这里讨论它。
任务:回归
提升树是一种用于回归的机器学习模型。也就是说,给定一组输入和数字标签,他们将估计在给定相应输入的情况下输出标签的函数。
与分类不同,我们对标签感兴趣的是连续的值,而不是一组离散的类。
例如,我们可能希望根据一个人的体重和年龄来预测他的身高,而不是给他们贴上男性、女性或其他的标签。
对于每个决策树,我们将从根开始,根据决策的结果移动到左边或右边的子树。最后,我们将返回到达的叶子的值。
XGBoost 的模型:什么是梯度增强树?
提升树类似于随机森林:它们是决策树的融合。然而,在我们预测的空间中,每片叶子将返回一个数字(或向量)。
对于分类,我们通常会返回落在每片叶子上的训练集元素的类的平均值。在回归中,我们通常会返回标签的平均值。
然而,在每个非叶节点上,树将做出决定:某个特征值和阈值之间的数字比较。
到目前为止,这只是一个退化森林。区别在哪里?
增强树与随机森林的区别
与随机森林不同,在训练增强树时,我们每次添加新树时都会更改标签。
对于每一棵新树,我们通过减去先前树的预测之和,再乘以一定的学习速率来更新标签。
这样,每棵树都将有效地学习纠正先前树的错误。
因此,在预测阶段,我们将简单地返回所有树的预测总和,乘以学习率。
这也意味着,与随机森林或袋装树木不同,如果我们任意增加树木的数量,这种模型将过度适应。然而,我们将学习如何解释这一点。
要了解更多关于助推树的知识,我强烈推荐你阅读 XGBoost 的官方文档。他们教了我很多,并且用更好的图片更好地解释了基础知识。
如果你想更深入地研究这个模型,这本书介绍统计学习是我最终发现这些概念的书,我怎么推荐它都不为过。
结合 Python 使用 XGBoost
XGBoost 的 API 非常简单,但是我们还将了解一些它的超参数。然而,首先我将向你展示今天的任务。
今天的数据集:人类发展指数公共数据
人类发展指数数据集包含许多关于大多数国家几十年来发展水平的信息,涉及许多指标和领域。
对于今天的文章,我决定只看最近一年的数据:2017 年。这只是为了让事情保持最新。
我还必须执行一些数据整形和清理,以使原始数据集更易于管理,尤其是更易于使用。
本文的 GitHub 资源库是,可以在这里找到,我鼓励您跟随 Jupyter 笔记本。然而,我会一直在这里添加最相关的片段。
用熊猫预处理数据
首先,我们将数据集读入内存。因为它包含一整列的年份,以及一行的国家和指标,所以管理起来相当麻烦。
我们将按照以下思路重塑它:
{country: {metric1: value1, metric2: value2, etc.}
for country in countries }
这样我们就可以把它输入到 XGBoost 模型中。此外,由于所有这些指标都是数字的,因此在训练之前不再需要预处理。
这个片段去掉了具有 NaN 值的行,还告诉我们有 195 个不同的国家。
如果这些操作中的任何一个对你来说是新的,或者你在继续之前有任何困难,试着阅读我的熊猫介绍。
为了查看数据集提供的所有可用的指标(指标),我们将使用 unique 方法。
df['indicator_name'].unique()
有很多(97 个),所以我不会在这里列出来。有些与健康有关,有些与教育有关,有些与经济有关,还有一些与女权有关。
我认为我们标签中最有趣的是预期寿命,因为我认为这是一个非常能说明一个国家的指标。
当然,您可以随意用不同的标签尝试相同的代码,并告诉我结果!
同样,从庞大的指标列表中,我只是手动选择了一些我认为与我们的标签相关(或不相关)的指标,但我们也可以选择其他指标。
下面是将我们形状怪异的数据集转换成更可口的东西的代码。
最后,在将我们的字典转换成数据帧后,我意识到它被调换了——它的列应该是它的行,反之亦然。我是这样解决的。
final_df = pd.DataFrame(indic).transpose()
特征相关性分析
我假设我选择的特征对回归有好处,但是这个假设仅仅是基于我的直觉。
所以我决定检查一下它是否符合统计数据。我是这样做相关矩阵的。
这是结果:
不出所料,出生时的预期寿命与疫苗接种高度相关。),缺乏弱势就业,以及教育。
我希望模型使用这些相同的特征(显示最高或最低相关性的特征)来预测标签。
幸运的是,XGBoost 甚至为我们提供了 feature_importance 方法,来检查模型的预测基于什么。
这是增强树相对于神经网络的一个巨大优势,在神经网络中,向某人解释模型的决定可能非常困难,甚至说服我们自己模型是合理的也很困难。但稍后会详细介绍。
为 XGBoost 模型定型
终于要训练了!在所有这些处理之后,你会认为这部分会很复杂,对吗?但事实并非如此,这只是一个简单的方法调用。
我们将首先确保我们的训练和测试数据之间没有重叠。
现在,这就是你所期待的。这是训练 XGBoost 模型的代码。
您会注意到,实际训练模型的代码和生成预测的代码都非常简单。然而在此之前,有一点设置。您在那里看到的那些值是模型的超参数,它们将在训练或预测时指定某些行为。
XGBoost 超参数初级读本
max_depth 指集合中每棵树允许的最大深度。如果此参数较大,树往往会更复杂,并且通常会更快地过度拟合(所有其他条件相同)。
eta 是我们的学习率。正如我前面所说的,在拟合下一棵树之前,它将乘以每棵树的输出,并且在之后做预测时也乘以总和。当设置为默认值 1 时,它不执行任何操作。如果设置为较小的数字,模型将需要更长的时间来收敛,但通常会更好地拟合数据(可能会过度拟合)。它的行为类似于神经网络的学习速率。
colsample_bytree 表示在生成分支时,每棵树有多少列可用。
它的默认值是 1,表示“全部”。潜在的,我们可能想把它设置成一个较低的值,这样所有的树就不会一遍又一遍地使用最好的特征。通过这种方式,模型对数据分布的变化变得更加稳健,并且过拟合也更少。
最后, num_rounds 指的是训练轮数:我们检查是否添加新树的实例。如果目标函数在多次迭代中没有改进,训练也将停止。
评估我们的结果
现在来看看模特有没有学会!
2017 年,预期寿命的标准差略高于 7(我检查了熊猫的描述),所以 4 的均方根没有什么可嘲笑的!训练也非常快,尽管这个小数据集并没有真正利用 XGBoost 的多核能力。
然而,我觉得这个模型仍然不合适:这意味着它还没有发挥出全部潜力。
超参数调优:让我们迭代
既然我们认为我们不足,让我们尝试允许更复杂的树( max_depth = 6),降低学习率( eta = 0.1),并将训练轮数增加到 40。
这一次,使用相同的指标,我对结果非常满意!我们将测试集中的错误率降低到了 3.15!这还不到我们标签标准偏差的一半,在统计上应该是准确的。
想象一下,根据某个国家的一些统计数据,预测某人的预期寿命,误差幅度为 3 年。
(当然,这种解读是错误的,因为一个国家内预期寿命的差异肯定不为零。)
理解 XGBoost 的决策:特性的重要性
这个模型似乎相当准确。然而,它的决定是基于什么?为了帮助我们,XGBoost 给了我们 plot_importance 方法。它将制作一个图表,按照重要性排列我们所有的特性(或者前 N 个最重要的特性,如果我们传递一个值给它的话)。
但是重要性是如何衡量的呢?
默认算法将测量我们的树的决策使用每个特征的百分比(使用某个特征的节点总数),但是还有其他选项,并且它们都以不同的方式工作。
直到我读了这篇非常清晰的关于媒体的文章,我才真正理解了这一点,我只是将它链接起来,而不是试图对同一件事提出另一种解释。
在我们的例子中,第一个模型给出了这个图:
这意味着我们的假设是正确的:具有较高或较低相关性的特征也是最重要的特征。
这是性能更好的第二个模型的特征重要性图:
因此,这两个模型都是使用前三个特征最多的,尽管第一个模型似乎过于依赖预期受教育年限。干净利落。这种分析对其他模型来说有点困难。
结论
XGBoost 为我们提供了一个非常好的回归,甚至帮助我们理解它的预测是基于什么。
特征相关性分析帮助我们理论化哪些特征是最重要的,而现实与我们的期望相匹配。
最后,我认为重要的是要注意这种模型的训练速度有多快,尽管这个特殊的例子并不能很好地证明这一点。
将来,我想在更大的数据集上尝试 XGBoost。如果你能想到任何,让我知道!此外,这个数据集看起来对一些时间序列分析很有趣,但我对这些主题没有太多经验。在这方面,有什么书、文章或其他资源可以推荐给我吗?请在评论里告诉我!
关注我上 中 或 推特 就知道下一篇文章什么时候出了。如果你今天学到了什么,请考虑在我的 个人网站 查看我正在做的事情和我最近的文章和笔记。
XLM——增强跨语言语言模型的 BERT
原文:https://towardsdatascience.com/xlm-enhancing-bert-for-cross-lingual-language-model-5aeed9e6f14b?source=collection_archive---------5-----------------------
跨语言语言模型预训练
注意模型,尤其是 BERT,在自然语言处理中,无论是在分类还是翻译任务中,都取得了令人鼓舞的结果。脸书·艾的一篇名为《XLM》的新论文提出了一个改进版本的 BERT,以在两种类型的任务中实现最先进的结果。
XLM 使用一种已知的预处理技术(BPE)和一种具有 BERT 的双语训练机制,以便学习不同语言中单词之间的关系。在跨语言分类任务(15 种语言的句子蕴涵)中,该模型优于其他模型,并且当预训练模型用于翻译模型的初始化时,显著提高了机器翻译。
背景
XLM 基于几个关键概念:
2017 年发明的变形金刚引入了一种注意力机制,可以同时处理整个文本输入,以学习单词(或子单词)之间的上下文关系。转换器包括两个部分——编码器,用于读取文本输入并生成其横向表示(例如,每个单词的向量),以及解码器,用于根据该表示生成翻译后的文本。关于变形金刚的深入评论可以在这里找到。
虽然 vanilla Transformer 只有每个单词的有限上下文,即只有每个单词的前身,但在 2018 年,BERT 模型向前迈进了一步。它使用转换器的编码器来学习语言模型,方法是屏蔽(丢弃)一些单词,然后尝试预测它们,允许它使用整个上下文,即被屏蔽单词左右的单词。
由于注意力模块中所有标记的并发处理,该模型需要关于每个标记的位置的更多信息。通过基于其位置(例如正弦函数)向每个记号添加固定值(称为位置编码的步骤),网络可以成功地学习记号之间的关系。我们对 BERT 的总结可以在这里找到。
2018 年, Lample et al. 提出了结合 Transformers 和基于统计短语模型(PBSMT)的翻译模型。后者是不同语言中成对短语的概率表。本文中的一个重要概念是回译,即把一个句子翻译成目标语言,然后再回到源语言。这个概念使得能够以监督的方式使用单语数据集,单语数据集比双语数据集更大、更常见。Lample 等人的结论之一是,标记嵌入的初始化对于模型的成功非常重要,尤其是在使用回译时。虽然作者使用 FastText 使用了“简单”的单词嵌入,但他们认为“更强大的语言模型可能会进一步改善我们的结果”。
XLM 是如何运作的
该论文提出了两个创新的想法——一种新的用于多语言分类任务的 BERT 训练技术和使用 BERT 作为机器翻译模型的初始化。
用于分类的跨语言 BERT
Tough BERT 接受过 100 多种语言的训练,它并没有针对多语言模型进行优化——大多数词汇没有在语言之间共享,因此共享的知识是有限的。为了克服这一点,XLM 对伯特做了如下修改:
首先,它不使用单词或字符作为模型的输入,而是使用字节对编码(BPE ),将输入拆分为所有语言中最常见的子单词,从而增加语言之间的共享词汇。这是一种常见的预处理算法,在这里可以找到它的摘要。
其次,它以两种方式升级了 BERT 架构:
- 每个训练样本都由两种语言的相同文本组成,而在 BERT 中,每个样本都是从一种语言构建的。与在 BERT 中一样,该模型的目标是预测屏蔽的标记,但是,在新的架构中,该模型可以使用一种语言的上下文来预测另一种语言的标记,因为不同的单词是每种语言中的屏蔽单词(它们是随机选择的)。
- 该模型还分别接收语言 ID 和每种语言中的标记顺序,即位置编码。新的元数据帮助模型学习不同语言中相关标记之间的关系。
升级后的 BERT 被称为翻译语言建模(TLM),而具有 BPE 输入的“普通”BERT 被称为屏蔽语言建模(MLM)。
完整的模型是通过训练 MLM 和 TLM 并在他们之间交替来训练的。
Comparison of a single language modeling (MLM) similar to BERT, and the proposed dual-language modeling (TLM). Source: XLM
为了评估该模型的贡献,本文使用包含 15 种语言句子的 XNLI 数据集,给出了该模型在句子蕴含任务(句子间关系分类)上的结果。在所有配置中,该模型明显优于其他著名模型,如 Artetxe et al. 和 BERT——仅在英语上训练,在所有配置上测试(Zero-Shot),在翻译成英语的数据上训练(Translate-Train),在英语上训练,在翻译的数据上测试(Translate-Test)。这些结果被认为是最先进的。
Comparison of XNLI results (accuracy) of prominent models in different training and testing configurations. Each column represents a language. Source: XLM
用 MLM 初始化翻译模型
本文介绍了 BERT 的另一个贡献,更准确地说是 MLM 模型的贡献——作为一种更好的初始化技术用于 Lample et al. 翻译模型。不是使用快速文本嵌入,而是从预训练的 MLM 中获取标记的初始嵌入,并馈送到翻译模型中。
通过使用这些嵌入来初始化翻译模型(使用 Transformer)的编码器和解码器的令牌,翻译质量提高了 7 BLEU,如下表所示。
Translation results with different initialization techniques. CLM stands for Causal Language Modeling in which a given word is trained based only on the previous words and not using the masking technique. Source: XLM
注意:该论文还表明,训练跨语言语言模型对低资源语言非常有益,因为它们可以利用来自其他语言的数据,特别是主要由于 BPE 预处理而类似的语言。这个结论和 Artetxe 等人的结论类似(我们的总结可以在这里找到)。
计算注意事项
模型是在 PyTorch 中实现的,可以在这里找到,包括预训练的模型。训练是用 64 个 Volta GPUs 完成语言建模任务,8 个 GPU 完成翻译任务,尽管持续时间没有规定。在论文的第 5.1 节和第 5.2 节中可以找到确切的实施细节。
结论
正如最近的许多研究一样,这篇论文展示了语言模型和迁移学习,特别是 BERT,在许多 NLP 任务中提高性能的能力。通过使用简单而智能的 BERT 调整,它可以胜过其他跨语言分类模型,并显著改善翻译模型。
有趣的是,本文中使用的翻译模型和用于初始化的 MLM 模型都是基于 Transformer 的。可以肯定的是,我们会看到更多这种组合,比如使用新的 Transformer-XL 进行初始化。
要了解最新的深度学习研究,请订阅我在 LyrnAI 上的简讯
XLNet——一个聪明的语言建模解决方案
原文:https://towardsdatascience.com/xlnet-a-clever-language-modeling-solution-ab41e87798b0?source=collection_archive---------8-----------------------
创建捕捉深层双向上下文的单词表示
Language modeling with a deep model — the challenge and a solution
TL;速度三角形定位法(dead reckoning)
通过在大型语料库中预测每个单词在其句子上下文中的概率分布,对语言中单词序列的概率分布进行无监督学习,已经被证明对于创建模型和单词表示是有用的,然后可以针对下游 NLP 任务对这些模型和单词表示进行微调。在为下游语法和语义任务微调模型时,两个因素似乎对提高性能起着关键作用:
- 一个词的表征是否捕捉到了该词在句子中的全部语境? 全语境是句子中一个单词前后的整个单词序列(双向语境)
- 模型是否是多层的,以输出一个单词的多个表示,每层一个?已经发现,来自模型的不同层的单词的表示对于下游的句法和语义任务是有用的
满足这两个设计因素提出了一个挑战(下面详细描述),XLNet 通过一个巧妙的解决方案解决了这个问题。这使得 XLNet 在某种程度上比先前的现有技术模型 BERT 执行得更好,该模型满足上述两个要求,但有一些不足。然而,与 BERT 相比,XLNet 需要更多的计算能力和内存 (GPU/TPU 内存)。减少计算/内存需求等方面的改进是否会使 XLNet 在实际意义上足够好,以取代 BERT 在所有 NLP 任务中的优势,仍有待观察。)。
创建深度双向上下文表示的挑战
语言建模,本质上是通过在大型语料库中预测单词在句子上下文中的概率分布来学习语言中单词序列的概率分布,可以通过多种方式完成,如下图所示
- 通过从左到右或从右到左扫描句子,使用前面的所有单词预测下一个单词。
- 使用句子中单词周围的所有单词预测单词。
在上面的任何一种情况下,都要考虑句子中单词的顺序(或位置)**(忽略位置会将其退化为单词袋模型,如 word2vec、Glove 等。)
在下游任务中,利用单词周围的所有单词来预测单词的模型往往比单侧上下文预测模型做得更好,正如人们直观地预期的那样——双向上下文比仅来自一侧的上下文拥有更多的信息。
预测单词在句子中的位置,如下图所示,比如单词“times”涉及(不考虑语言模型类型),为其计算一个向量作为其邻居的函数,但不包括其本身(如果我们包括单词本身,预测就变得微不足道)。学习过程本质上是“拖动”那些相邻的向量,使得计算的向量(预测)在那个位置更接近实际的单词向量。代表“时间”的单词 vector 反过来又涉及到对它的邻居的预测,例如“阿拉斯加”。因此,在一般意义上,训练过程部分地基于它们的位置,以不同的数量拖动一起出现的单词,并且该过程(神奇地)倾向于将语义上接近的单词一起带到高维空间(该过程与 word2vec 之类的 单词袋模型中发生的事情惊人地接近,尽管在这种模型中不考虑位置 )。此外,该模型在训练期间学习参数,使其能够为句子中的单词创建上下文敏感的嵌入,包括在训练期间从未见过的单词(在像 BERT 和 XLNet 这样的模型中)。
Language modeling choices — one-sided context vs full context of both sides to predict a word
然而,如果我们向模型添加多个层来创建单词的深层表示,那么训练一个使用来自两侧的上下文的模型会带来挑战。这在下面基于注意力的模型的图示中是显而易见的——使用单词两侧的上下文来预测单词将间接使得能够从第二层起看到单词本身。
例如,在基于注意力的模型的第 1 层中,“时间”的向量的组成是其所有邻居的加权和,不包括其自身。即第一层的输出计算为“时间”(黄色显示)不包括“时间”。然而,在第 2 层中,来自第 1 层的隐藏状态的加权和间接包括“时间”的向量,通过与“黄色”向量相邻的所有隐藏状态向量(为了避免混乱,只有一个间接路径显示为红色)
The problem of using bidirectional context in a multilayered setting — Prediction of vector for word “times” can see the vector for “times” indirectly from layer 2 onwards — the red arrow path is one example of the “times” vector indirectly seeing itself
我们可以通过在层 1 中为“时间”选择隐藏状态周围的隐藏状态的子集,来避免字预测在多层模型中间接看到自身的问题,使得它们不依赖于“时间”的字向量。这种手工制作的实例如下所示
A hand crafted dependency path where a token’s prediction (“times”) does not see itself in a multilayered model
然而,为了在单词“times”的预测中捕获整个双向上下文,我们需要双向上下文的更多子集来训练模型,其中单词看不到它自己。
XLNet 通过巧妙地选择像上面手工制作的这样的子集上下文来解决这个问题,这样一个单词在被预测时就不会“看到自己”。在上面的例子中,我们有 9 个单词(现在假设这些单词没有被进一步分成子词,也就是说它们在词汇表中是存在的)。我们有 9 个!排列——362,880。如果我们从这个排列中取样,选择一个排列,比如 612934578,然后应用下面的规则
- 从序列 612934578 中一次选取一个数字,并通过仅使用序列中在该数字之前的所有字向量来计算该位置的第 1 层向量(即,字 6 和 1 用于计算 2,字 6、1、2 和 9 用于计算 3 等等)。)
- 为了说明挑选标记 5(“时间”)作为要预测的标记,使用在上面排列顺序中在它之前的所有标记,即单词 6、1、2、9、3 和 4,来计算“时间”的向量。
- 现在应用与上面相同的程序来计算第二层向量。例如,对应于 612934 处的令牌的层 1 中的那些向量输出以及“时间”的层 1 中的隐藏状态,来计算“时间”的层 2 向量。
- 通过使用不允许在置换序列(注意,该置换序列可以包括句子中预测单词两侧的单词)中位于它之前的单词看到它的规则,并且只有在置换序列中位于它之前的那些单词才被单词在其预测中使用,该模型确保预测的单词永远不会被间接看到,而不管模型中的层数如何。
要注意的一个关键点是,置换序列仅用于决定向量计算中涉及哪些记号。句子中单词的顺序是不变的——每个单词的位置都是由一个相对位置编码方案固定的(我们稍后将回到这一点)。
总之,通过使用单词的双向上下文的子集来预测单词在句子中的位置,并考虑到使用上面的排列扫描规则单词本身是看不见的,我们可以避免单词在多层上下文中看见自己。然而,这种方案要求我们采样足够多的排列,以便我们充分利用双向上下文。这在计算上仍然很昂贵,所以只对句子中单词的子集进行预测(这是模型中的超参数K)——在论文中,句子中大约 1/6 (~16%)的单词被预测。有趣的是,这与 BERT 中预测的句子中的单词数量大致相同。
然而,BERT 通过屏蔽/破坏那些预测的单词来避开这个问题。在每一层对句子中所有单词的计算预测是 BERT 中几个常数的矩阵乘法。相比之下,XLNet 必须对它采样的每个置换和置换序列中的每个位置进行乘法运算。
BERT corrupts/replaces ~15% of tokens with another token [mask]. In the illustration “time” is replaced by “[mask]”. The prediction of “time” cannot see it either directly or indirectly since it has been replaced. The hidden states adjacent to the yellow shaded vector in layer 1 see all the word vectors including the masked one in the input — it is not explicitly shown to avoid clutter
然而,BERT 的屏蔽方法有几个缺点,这是 XLNet 中没有的。
- 如果“New”和“York”在上面的句子中被屏蔽,那么“New”的预测将独立于“York ”,反之亦然。虽然这看起来像是一个人为的例子,但 XLNet 并没有做出这样的假设,这可能是它在某些任务中表现优于 BERT 的部分原因。这也许是 XLNet 在答案是短语的问答任务中表现更好的原因之一。
- 另一个是“屏蔽”标记是人为引入输入的标记,它只在训练期间出现,而不是微调。所以这里有一个差异。
基于置换的依赖规则来捕获双向上下文可能是 XLNet 的独特之处。它还利用先前的 work Transformer XL 来处理长句,通过跨固定段转移状态(做了微小的修改以确保位置信息是相对的而不是绝对的)。XLNet 缓存段中的图层状态,以便在后续段中重用。这使得 XLNet 能够处理任意长的句子。相比之下,BERT 只能处理固定长度的数据段。尽管人们可以在 BERT 中选择任意长的固定长度段,但由于 GPU/TPU 内存要求,这变得不切实际。
最后,这是基于置换的依赖性规则的实现细节-为了使用在置换序列中位于单词之前的项来预测单词,需要将被预测的目标位置的位置信息纳入预测中,以使用相同的邻居集合来消除两个位置处的预测的歧义。此外,虽然用于预测位置的隐藏状态向量不能包括该位置处的单词向量,但是我们还需要一个在预测其他向量时包括该位置的隐藏状态向量。这需要模型为每个位置学习两个向量,h 和 g,如下所示。 h 是下面层中的字向量和其他隐藏状态向量的函数。 g 是隐藏状态向量和预测单词的位置信息的函数。
The figure above from XLNet paper shows the computation of the hidden states for a word that looks at itself in addition to a subset of its neighbors. Note these vectors are not predicted. They are used in the computation of the hidden vectors g, taking into account not to include hidden state vectors that see that see the word being predicted. This is accomplished using the permutation sequence rule described earlier
The figure above from XLNet paper shows computation of the hidden vectors “g” that are predicted. Note g1 in layer 1 is only dependent on its position info (w) and not its vector x1. Also g1 in layer 2 is dependent on hidden states h2 h3 and h4, all of which did not see x1 because of the permutation order 3,2,4,1. 1 cannot be seen by 3,2,4 because they precede it in the sequence 3,2,4,1
试用模型
考虑到在评估任务上微调模型所需的计算和内存资源(具有足够板载内存的 GPU/TPUs),这可能对我们许多人来说有点挑战,这与 BERT (我们可以在单个 GPU 机器上对 BERT 进行微调,以完成 NER 任务,平均大约需要一两个小时)。有一个笔记本来测试分类任务上的模型(我只能在批量为 2 的情况下运行它,并获得 90%的准确率——他们报告在批量为 8 的情况下准确率为 92%)。最近有一个 pytorch 版本,这将有助于理解这个模型是如何工作的。
奇怪的是,像 NER (BERT 是 NER 目前的最新技术)这样的序列标记任务没有基准测试结果——也许我们很快就会看到一些标记任务的结果。
下面的部分可以跳过。
为什么单词不能在预测中看到自己?
仅使用左侧上下文预测下一个单词的语言模型的最大似然估计(例如,给定单词“Alaska 大约是 12”,预测“times”)。
Equation from XLNet paper. This essentially says find those parameters theta, that maximizes the probability of the word “times” given “Alaska is about 12”.
需要注意的关键点是,h 的计算是“times”之前所有单词的函数,而不是它本身。如果我们在 h 的计算中也包括“时间”,模型可以轻松地学习,给定 e(xt)是“时间”的嵌入。
BERT 的屏蔽目标不包括单词本身,而仅包括替换的屏蔽标记。然后,给定损坏的句子“阿拉斯加比纽约大大约 12[mask]”(假设只有一个令牌被屏蔽),它预测实际的单词“times”
Equation from XLNet paper. The BERT objective. mt is 1 only for masked tokens in a sentence which is about 15% of words. Note H includes all words but the predicted word is replaced by the mask token. e(xt) is the embedding for the word “times”. The goal is to choose theta so that H(x^) is close to the embedding for “times” given all the words in the corrupted sentence.
本质上,BERT 通过用屏蔽的标记替换预测的单词并在训练过程中重建它们,绕过了看见本身的问题。然而,H 的计算包括仅在预训练期间出现的掩码标记。
XLNet 每次预测单词时都使用双向上下文的子集,但通过确保“g”的计算只包括看不到被预测单词的标记来避免“看到自己”的问题 (g 是它周围的标记子集和预测单词位置的函数)。同样,很容易看到,如果 g 是被预测单词的函数,学习问题变得微不足道,给定 e(x)包括要预测的标记的嵌入。
Equation from XLNet paper. XLNet prediction of token at a position.
上式中的 g 计算如下
Equation from XLNet paper. The highlighted state vector must be a strict inequality in the subscript — must be a typo (unless I am missing something very basic). Updated 11 July 2019. One of the paper authors confirmed this was a typo and said it will be fixed in a revision (thank you Zhilin for responding to my mail)
参考
- XLNet:面向语言理解的广义自回归预训练,杨等,2019 年 6 月
- Transformer-XL:超越定长语境的专注语言模型,戴子航等,2019 年 1 月
- BERT:用于语言理解的深度双向转换器的预训练,Devlin 等人,2018 年 10 月
- 基于 BERT 模型的回顾
- 解构伯特
手动从 Quorahttps://qr.ae/TWtVmo(自动导入因故失败)
XLNET 深入浅出的解释!!
原文:https://towardsdatascience.com/xlnet-explained-in-simple-terms-255b9fb2c97c?source=collection_archive---------7-----------------------
在这篇文章中,我很高兴带你了解谷歌大脑和 CMU 最近发表的自然语言理解算法——XLNET。该算法是 NLP 中的一个突破,因为它在 20 个不同的任务中超过了最先进的 BERT 算法。来吧,让我们探索这种新算法能为世界带来什么!!
这篇文章的结构如下-
- 通过伯特简介,
- 理解伯特的缺点
- 了解变压器架构
- 深入 XLNET
伯特建筑
BERT 代表“来自变压器的双向编码器表示”。它是一种神经网络架构,可以使用转换器对文本数据中的双向上下文进行建模。
什么是双向的?
- 传统方法在给定前“n”个记号的情况下预测当前记号,或者在给定当前记号之后的所有记号的情况下预测当前记号。
- 在预测当前标记时,没有一种方法一次获取前一个和下一个标记。
- BERT 克服了这个缺点,因为它考虑了前一个和下一个标记来预测当前标记。这个属性被称为“双向的”。
双向性是通过一种叫做“屏蔽语言建模”的现象实现的。该模型是预先训练的,可以用于一套令牌和句子级别的任务。
什么是蒙面语言建模(MLM)?
为了实现双向表示,输入句子中 15%的标记被随机屏蔽。变压器被训练来预测屏蔽字。例如,考虑句子——“猫坐在墙上”。伯特的输入将是“面具上的猫”。
BERT 也适用于下一个句子预测任务,因为它是用成对的句子预先训练的,其中句子 B 有 50%的时间跟随 A,而其他时间不跟随。一旦该模型被预先训练,它就被微调用于特定的应用,例如问题回答、句子完成、检查两个句子的语义等价等。
伯特的缺点
BERT 算法有两个主要的局限性。他们是
- BERT 用掩码破坏输入,并且遭受预训练-微调差异。在实际应用中,我们没有被屏蔽的输入。伯特在现实中是如何处理的还不清楚。
- BERT 忽略了屏蔽位置之间的相关性。例如,考虑句子“纽约是一座城市”,输入给 BERT 的是“[MASK] [MASK]是一座城市”。伯特的目标是
log p(New |是城市)+ log p(York |是城市)
从上面的函数可以看出,学习“New”和“York”之间没有依赖关系。因此,BERT 可以得出类似“新旧金山是一座城市”的预测。
变压器架构
XLNET 将最先进的自回归模型 Transformer-XL 的思想整合到预训练中。Transformer 是 google 用于语言翻译的模型。基本都是围绕着“注意力”展开的。这是一个编码器-解码器模型,其中你将一个序列映射到另一个序列——英语到法语。要将英语中的句子翻译成法语,解码器需要查看整个句子以在任意时间点选择性地从中提取信息(因为英语中的标记顺序不需要与法语中的相同)。因此,编码器的所有隐藏状态对于解码器都是可用的。
解码器如何知道在任何一点应该查找哪个隐藏状态?
它通过加权编码器的每个隐藏状态。权重由简单的前馈神经网络确定。在本文的术语中,这些被称为注意力权重,或值。这里有一个链接到注意力权重的精彩解释。本文中使用的一些术语是
- Query (Q) —解码器的隐藏状态。
- Keys (K) —编码器的隐藏状态。
- 值(V) —处理查询时的注意力权重。
两个重要的东西从 Transformer-XL 集成到 XLNET 中。
- 位置编码——跟踪每个标记在序列中的位置(在后面的章节中将会知道为什么我们要这样做)
- 段重现(segment recurrence )-缓存每层内存中第一个段的隐藏状态,并相应地更新注意力。它允许每个段重用内存。
现在,我们好钻研 XLNET:)
XL net——NLU 的广义自回归模型
XLNET 是一个广义的自回归模型,其中下一个令牌依赖于所有先前的令牌。XLNET 是“通用的”,因为它通过一种称为“置换语言建模”的机制来捕获双向上下文。它集成了自回归模型和双向上下文建模的思想,同时克服了 BERT 的缺点。它在 20 个任务上超过了 BERT,通常在问题回答、自然语言推理、情感分析和文档排序等任务上超过 BERT 很多。
置换语言建模(PLM)
PLM 是通过对句子中所有可能的单词排列训练一个自回归模型来捕捉双向上下文的思想。XLNET 不是固定的左右或左右建模,而是在序列的所有可能排列上最大化期望对数似然。在期望中,每个位置学习利用来自所有位置的上下文信息,从而捕获双向上下文。不需要[屏蔽],输入数据也不会被破坏。
上图展示了 PLM。假设我们正在学习 x3(句子中第三个位置的标记)。PLM 训练了一个自回归模型,其中包含句子中标记的各种排列,因此在所有这些排列结束时,我们将学习 x3,给定句子中的所有其他单词。在上图中,我们可以看到下一层仅将置换序列中 x3 之前的标记作为输入。这样也实现了自回归。
【XLNET 和 BERT 的比较
例如,考虑“纽约是一个城市”这一行,我们需要预测“纽约”。让我们假设当前的排列是
伯特将彼此独立地预测记号 4 和 5。而 XLNET 作为一个自回归模型,按照序列的顺序进行预测。即首先预测令牌 4,然后预测令牌 5。
在这种情况下,XLNET 将计算
log P(New | 是座城市 ) + log P(York | New,是座城市)
而伯特会减少到
log P(New | 是城市 ) + log P(York | 是城市)
XLNET 是如何用变压器实现的?
我们看到 transformer 查看整个句子的隐藏表示来进行预测。为了实现 XLNET,转换器被调整为只看要预测的之前的标记的隐藏表示。回想一下,当输入模型时,我们嵌入了每个标记的位置信息。假设如果要预测令牌 3,则后续层
- 无法从输入层访问令牌 3 的内容。
- 能不能只访问它之前的令牌的内容,只访问令牌 3 的位置信息。
当计算关注度时,根据上述原理更新 Q、K 和 V。
使用 XLNET 进行的实验
以下是本文作者测试 XLNET 的数据集。
- RACE 数据集—来自英语考试的 100K 个问题,XLNET 在准确性上超过最佳模型 7.6 个点。
- SQuAD —阅读理解任务— XLNET 比 BERT 高出 7 分。
- 文本分类——在各种数据集上明显优于 BERT(更多详细信息,请参见论文)。
- GLUE 数据集—包含 9 个 NLU 任务—纸上报告的数字,XLNET 优于 BERT。
- ClueWeb09-B 数据集——用于评估文档排序的性能,XLNET 优于 BERT。
结论
我希望你喜欢阅读这篇博客。如果你有任何问题,请在下面发表。
原载于 2019 年 8 月 1 日【https://medium.com】。
XY 宇宙:深度强化学习的 2D 粒子生存环境
原文:https://towardsdatascience.com/xy-universe-a-2d-particle-survival-environment-for-deep-reinforcement-learning-3e97b1068493?source=collection_archive---------28-----------------------
我们在这里提供 XY 宇宙:一个 2D 粒子生存环境,通过避免与“坏”粒子碰撞来训练你的深度强化学习代理尽可能长时间地存活。媒介和“坏”粒子被限制在一个 2D 盒中,以固定的恒定速度运动,并与盒壁发生弹性碰撞。提供了深度 Q-网络代理 Python 实现,以便立即使用和演示该环境。代理奖励方案是:每个时间步长+1,每个“坏”粒子碰撞-100。插曲结束条件是:代理与任何“坏”粒子碰撞。这个生存环境的灵感来自卡帕西的水世界环境。
DQN agent surviving in the XY Universe particle environment
DQN 的阶段性奖励和损失:
Fig 1: Epsilon-greedy agent rewards vs episodes
Fig 2: Epsilon-greedy agent loss vs episodes
XY 宇宙生存粒子环境和 DQN 实现可以在这里找到:
https://github.com/ankonzoid/XY_universe
更多我关于机器学习、深度学习、强化学习的博客、教程、项目,请查看我的 中 和我的 Github 。
# yellow vests:Twitter NLP 分析
原文:https://towardsdatascience.com/yellowvests-a-twitter-nlp-analysis-21f34c4773e2?source=collection_archive---------26-----------------------
关于法国最大的社会运动,目前的观点是什么?
Photo by Randy Colas on Unsplash
内容:
- 介绍
- 社会运动的起源、兴衰
- 词类分析:数据科学过程
- 词类分析:结论
- 情感分析
- 奖金部分:热门推文!
介绍
Photo by Norbu Gyachung on Unsplash
如果你不是法国居民,你可能在推特上或通过去年的新闻听说过这一趋势。这场所谓的“黄背心运动”在 2019 年 11 月 16 日庆祝了一周年,但与这些社会抗议相关的法国舆论已经不能像一年前那样描述了。
然而,随着即将到来的养老金制度改革,法国铁路工人、空中交通管制员、教师和公共部门工作人员再次走上街头抗议…
穿着这些黄色背心的法国人还觉得有希望吗?他们是通过还是反对这场运动来表达愤怒?他们厌倦了吗?
发现下面的 NLP 分析!(文末奖金!)
起源
Photo by ev on Unsplash
这一切始于 2018 年 10 月,当时法国政府突然提高燃料价格,引发大规模抗议,因此创造了社会、财政、民主和经济诉求的理想民粹主义运动。
社交媒体上的一切都像病毒一样传播开来,暴徒们开始在每个周六走上街头。该运动于 2018 年 11 月 17 日达到最高参与率,超过 130 万黄背心。
秋天
Photo by Koshu Kunii showing a bank forced to close its doors on a Saturday due to violent protestations
然而人们开始被这股黄色浪潮惹恼了。宣言变得过于暴力,黄背心活动家无法就他们的宣言达成共识,最终法国政府采取了一些(非常轻微的)行动将这场运动陷入僵局。2019 年 5 月只有 4 万只。
新崛起?
每周六参与率暴跌,新闻掉了这个话题…直到 2019 年 12 月 5 日工会安排了新的全国会议。2019 年 9 月,法国政府宣布了一项针对每个社会阶层的大规模养老金改革。很快,推特上出现了#黄背心,活动人士在周六重新确定了他们的每周约会,直到 12 月 5 日的全国大罢工。
使用 Python 上的 P lotly 库,我们可以根据“Le Nombre Jaune”估计(法国脸书小组试图估计参与者数量)与法国政府估计,可视化去年黄背心的参与率。点击【播放】按钮!
12 月 5 日:社会运动的重生?
Photo by ev on Unsplash
为什么是这个特殊的日子?这是由所有最大的法国工会策划的,作为纪念 24 年前人们再次走上街头抗议另一项养老金改革(流产)的方式。
12 月 5 日星期四,许多罢工计划在公共交通、教育、医院和电力服务进行。我们将通过词类分析看到# 5 decembre(# 12 月 5 日)和# GilletsJaunes(# yellow vets)之间的高度相关性。
# YellowVests 运动的词类分析:数据科学过程
Photo by Nicole Edelbrock on Unsplash
我们利用 Tweepy 库和 Python 上的 Twitter API,在 11 月 29 日至 12 月 2 日的关键时段(高峰活动时段)收集了 4000 条推文(每天 1000 条推文)。
…然后我们必须清理数据,以便通过卷积神经网络模型正确处理数据(删除提及,url,#..),我们能够调用这个模型多亏了 Spacy 库和它的法语包。
最后,我们使用 Plotly 库,将 3 个不同词类中最常用的 20 个词可视化,这 3 个词类是:、【名词】、【动词】和【ADJ】。****
#YellowVests 运动的词类分析:我们能得出什么结论?
Photo by Koshu Kunii on Unsplash
鉴于我们获得的自然语言处理结果,我们决定实现最常见采购订单的词云可视化,这样我们可以更好地得出结论。(图形是交互式的,因此如果文字没有完全显示在屏幕上,您可以浏览文字)
井..那么我们能看到什么呢?
表演并被倾听
出人意料的是,法国人通过“Partir”(= Leave)、“Veut”(= Want)、“Mettre”(= Set)、“Prendre”(= Take)、“Agit”(= Act)和“défendre”(= Defend)等动词来表达采取行动和实施变革的意愿。但是我们也可以注意到像“Comprendre”(=理解)、“Travailler”(=工作)、“Lire”(=阅读)甚至“Eviter”(=避免)这样的词是非常重要的,它们表明法国人民在采取行动之前需要听到政府的声音。
国家的呼唤
快速浏览一下最常用的形容词,就能明显看出全国性的关注和全国性的运动号召,感谢大写的‘Fran ais’(=法语)、‘gréviste’(=醒目)、‘générale’(=整体)、‘Public’甚至‘GRAND’(=大)!
12 月罢工相关性和意志,使运动持续下去
看看最热门的名词,事情变得与 12 月的大规模罢工非常相关(我们在上面提到过):“运动”(=运动)、“死亡”(= 12 月)、“再培训”(=养老金)和“改革”(=改革)是最常用的词之一..
法国推特用户在撰写‘gouvernement’(=政府)、‘république’(=法兰西共和国)或‘Police’(=警察部队)时,也直接针对政府甚至系统本身。最后但并非最不重要的是,顶级名词分析还揭示了法国民族主义的名词槽,如'人民'(=国家),'支付'(=国家),甚至'街'(=街道)。
最后,我们不得不通过以下词语提到当时的词汇领域:‘Jour’(= Day)、‘Mois’(= Month)、‘ère’(= Era)和‘vie’(= Life),突出了追求这一运动的意愿,或许为法国社会创造一个新时代?
情感分析
Photo by ev on Unsplash
现在让我们深入到推特情绪分析中,试着解读人们对这场大规模社会运动的感受。使用 Textblob 库及其情感估计模型,我们可以估计熊猫数据帧中每条推文的“极性”:也就是说一个介于-1(非常负面)和 1(非常正面)之间的数值。
给定我们 4000 条推文的样本,我们选择通过删除不相关的推文进行情感分析,将我们的数量减少到 2733 条推文(例如,包含太多“停用词”的字符串,也就是不相关的词,或者字符串长度为< 4)。
下面是 tweets 长度的分布图:取值范围很广,但是我们可以看到长度通常在 30 到 230 个字符之间。
惊喜!
如果你要求任何人对#YellowVests tweets 进行分类或描述,那应该是“愤怒、愤怒、仇恨、反抗”或任何与负面评论相关的词(所以让我们说一个从-1 到-0.01 的值,前者代表高度负面评论)。
Photo by Adrien prv on Unsplash
但是你猜怎么着, TextBlob 模型向我们展示了一个相反的趋势!如果你看一下极性的意思是,它是正的,等于+0.05,而你本可以期待一个负值!
积极的感觉?
在获得每条推文的极性后,我们选择应用一个简单易行的分类器:
- 极性在-1 和-0.0001 之间的推文被归类为“从中性到非常负面的”情绪。意思是非常负面或非常负面的评论。
- 极性在 0.0001 和 1 之间的推文被分类为“从中性到非常积极的评论,意味着一些善意的评论到非常积极的评论”
- 极性为 0.0000 的推文被分类为“误分类”(被算法遗漏。
因此,很容易绘制一个直方图来显示情绪分布并呈现主要趋势:大多数推文被归类为“中性到积极”,少数被链接到负面类别。
不幸的是,766 条推文没有被模型分类,因为 TextBlob 对于法语来说并不聪明。
注意:我们可以使用 Texblob 模型中的 naive Bayes 分类器将每条推文分类为“积极”、“消极”或“中性”,但同样,它在法语中并不那么有效
奖金部分
Photo by Ray Hennessy on Unsplash
感谢你坚持到最后:)我们希望你通过这次文本挖掘学到了一些东西或感到惊讶!为了奖励你,下面是我们在分析过程中发现的前 3 条负面和正面评论:
前 3 个正向推文(极性= 1.0)
- "Les #GiletsJaunes,ce people sorti de l ' ombre pour se serrer Les coudes et dir stop aux unjustices"(= " # yellow vests,那些走出阴影的人团结在一起,制止不公正现象")
- 马克龙先生的使命是一个幻想,她是一个假设(=马克龙的辞职是一种幻想,现在是一种假设”)
- "05 年全国大规模集会,不为 DANS 和 GES 议会服务!在 EST LÀ!!全国团结工会!!!"(=“大规模的民族融合第五次毫无保留的游行队伍中!我们到了!!!民族团结!!!!!")
前 3 条负面推文(极性= -1.0)
- “你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看, " (= "你会看到,他们会非常愚蠢,那些#黄背心,他们明天会封锁炼油厂")
- Quand I vois Macron,j'ai envie de chier。 " (= "看到【总统】马克龙,我就想拍个 s*** ")
- ” Eh le macronard!你对这个结论有什么看法?事实上,这是一个很大的问题。请相信,您的全部追求都是为了达到目标。 " (= "嘿,马克龙纳德!你是通过怎样的心理扭曲得出这个结论的?不管是谁干的,他肯定是个大混蛋(或者不是)。你的仇恨,你对马克龙的完全屈服使你失去了所有的客观性”)
Yelp 最好的卷饼
原文:https://towardsdatascience.com/yelps-best-burritos-aafb0eba74da?source=collection_archive---------27-----------------------
分类和情感分析—第 1 部分
这是一个三部分的项目,与 Yelp 的开放数据集一起工作,一个 “用于学习的通用数据集。 “在第 1 部分中,我们将加载一些大规模的 JSON 文件,过滤它们以减小它们的大小,探索我们的评论数据子集并讨论标记化!第二部分 这里的 。第三部分 这里的 。如果你对代码感兴趣,你可以在这里找到它。
数据
Yelp 维护并分发了一个用于学习的大规模开放数据集,专门用于 NLP 问题。该数据集包含各种信息,包括入住数据、照片和业务属性。然而,我们在这里最感兴趣的是评论的集合。这个数据集来自几个包含不同信息的 JSON 文件,包含近 30 万家企业的 700 万条评论。哇!
这是一个令人尴尬的大量数据,所以我们将与一个较小的评论子集一起工作,以最大限度地减少计算时间。这个子集将是所有对墨西哥和 Tex-Mex 餐馆的评论,因为我喜欢墨西哥卷饼。相当随意,但这将大大减少计算时间,并确保比我们与瑜伽馆或电影院等不同企业合作时更标准化的语料库。
要获得这些评论,需要做一些预处理工作。包含所有 700 万条评论的 JSON 文件没有任何关于企业名称或类别的信息,只有一个唯一的企业 ID。为了获得与 Mexican 和 Tex-Mex 餐馆相关的业务 id 列表,我们必须查阅包含所有业务属性信息的 JSON 文件。将这个 JSON 文件直接加载到 pandas 数据框架将允许我们按业务类别进行过滤。在这里,不出所料,“墨西哥”和“得克萨斯-墨西哥”。这样做将为我们提供一个超过 4000 家企业的列表,现在是所有餐馆。很简单,从我们开始的 30 万家企业中精简出来。JSON 文件包含了 700 万条评论。
这个文件的庞大规模需要一种不同于处理业务属性的策略。试图将所有 700 万个文件直接加载到一个数据帧甚至一个字典列表中会导致内存错误(至少对于我的 8gb ram)。另一种策略是打开文件,逐个读取对象,并检查内存中的当前对象是否符合特定标准。在这种情况下,标准是将业务 id 与上面创建的列表相匹配。如果有匹配,我们将把 JSON 对象(一个字典)追加到一个列表中。然后,可以将这个字典列表推送到数据帧中。这是一个缓慢的过程,但我不确定在处理大文件时有没有更好的解决方案(如果你有不同的想法,请在评论中告诉我)!无论如何,在处理结束时,我们会得到一个数据帧,其中包含 Yelp 开放数据集中所有墨西哥和 Tex-Mex 餐馆的所有评论。
这个过程的最后一步是在这个项目的第 3 部分中分离一组评论来进行情感分析。因为我们对使用情感分析来识别被低估的墨西哥卷饼感兴趣(稍后会有更多内容),所以我们会找出所有专门提到“墨西哥卷饼”这个词的评论。使用 pandas 的矢量化字符串函数,这是微不足道的。所有这些操作的最终结果是包含独特评论集的两个数据框架。有 51,764 条评论提到了墨西哥卷饼,另有 328,932 条评论提到了墨西哥餐馆和得克萨斯-墨西哥餐馆。仍然是一个大的评论集,但比最初的 700 万更容易管理。
视觉探索
该项目的这一部分的目标是建立一个分类器,根据评论的文本正确预测给定的 Yelp 星级。为了更好地理解我们所做的工作,让我们看一些有助于描述数据的图表。首先,我们将通过星级检查评论的数量,看看我们是否有一个均等的分布(图 1)。正如我们在下面看到的,5 星评论的数量让其余的星级相形见绌。这可能意味着该数据集将受益于对多数类的欠采样。现在我们只需要记住这些信息。
Figure 1: Number of reviews binned by stars
我们可能感兴趣的另一个关系是文本长度和星级之间的关系。正如 Austin McCartney and co., 分类器的性能随着文本长度的减少而降低。查看与上面相同的 5 个容器,我们可以看到文本长度因星级而异,但差异并不大(图 2)。无论如何,这是很难改变的。继续前进。
Figure 2: Mean length of reviews binned by stars
既然我们对评论长度和星级数的分布有了一些直觉,接下来让我们看看构成这近 330,000 条评论的餐馆。以下是获得评论最多的 15 家餐馆的名单。对于我们这里的目的,单个链的评论都加在一起(图 3)。不出所料,连锁餐厅占据了前 15 名的大部分,但还没有到可能会出现问题的程度。在所有的评论中,只有大约 2%的评论是针对墨西哥薄饼的。
Figure 3: Top 15 restaurants garnering reviews (here, all Chipotles and all Taco Bells)
上面的列表也很有趣,因为它似乎偏向于美国西部的餐馆。具体来说,我知道“Barrio Queen”是亚利桑那州一家受人尊敬的传统墨西哥餐厅,“Tacos el Gordo”是加利福尼亚州一家备受推崇的主流餐厅,“Nacho Daddy”是内华达州一家玉米片冠军餐厅。我们之前可能认为 Yelp 的这个数据集包括了这个国家的很大一部分,但是我们最好仔细看看城市和州的分布,看看我们在做什么(图 4,图 5)。正如我们所见,拉斯维加斯和亚利桑那州的一些城市有很好的代表性,亚利桑那州餐馆的评论数量让其他州相形见绌。在这个项目的扩展中将我们的评论绑定到这些位置可能会很有趣,但是现在没有必要担心这个奇怪的餐馆样本。
Figure 4: Top 15 cities represented
Figure 5: Reviews binned by state
鉴于我们所拥有的数据,以及项目第一部分的简单最终目标,让我们将 5 星评级系统分为两类。这将是好评论(5 和 4 星)和坏/中性(1,2 或 3 星)评论。这将使分类更简单。执行这个操作很简单,然后我们得到了 115,787 个差评和 213,145 个好评。这种不平衡可能意味着我们的分类器在对好评进行分类时会表现得更好,但没有必要进行纠正。
清理一些文本
分析文本的第一步是清理文本。这可能涉及各种不同的步骤,但这里会很简单。我们将利用内置函数的自然语言工具包(NLTK)。所有的评论都包含在一个数据框架中,这个过程很容易用 pandas apply 方法实现。为了了解这个过程的输入和输出,我们可以看看下面的图 6。我们从最初的评论开始,将所有大写字母转换为小写字母,将文本转换为字符串列表,然后最终删除停用词(常见的单词)和标点符号(注意评论末尾的感叹号和笑脸已经消失)。
Figure 6: Steps in the cleaning and tokenizing process.
N-grams
一旦矢量化,上面生成的单词列表可用于机器学习模型中进行分类。然而,简单地使用单词作为特征必然会消除伴随单词排序而来的所有信息。这就是 n-grams 发挥作用的地方。N-gram 是从给定的文本序列构造的 N 个项目的连续序列。这些可以是二元模型(2 个单词)、三元模型(3 个单词)等。给定上面图 6 中单词标记的最终列表,二元模型表示将是下面图 7 中复制的元组列表。
Figure 7: Bigram representation of the sentence constructed in figure 6
使用 n-gram 表示的最大缺点是训练词汇的规模变得巨大。我们稍后会谈到它,但是通过向量化训练语料库构建的二元模型的词汇表超过 300 万个唯一术语。正如我们所料,使用三元模型或四元模型只会使这个问题更加复杂。当然,最终的终点将是训练语料库中表示的每一个独特的句子和一个完美的过度拟合模型。使用二元模型不会发生这种情况,而且我们将获得比使用单个单词更好的分类性能结果(相信我,我已经检查过了)。它还允许我们执行功能选择步骤。所有伟大的东西,让我们开始吧!跟我来第二部分这里。
是的,众议员 Borowicz 调用是不寻常的
原文:https://towardsdatascience.com/yes-rep-borowicz-invocation-was-unusual-c169c5dd23b4?source=collection_archive---------17-----------------------
星期一,爸。州众议员斯蒂芬妮·博罗维奇在众议院发言时做了祈祷,她甚至在说“阿门”之前就开始引起反弹这场祈祷恰逢该州首位穆斯林女性代表宣誓就职,被批评者贴上了仇视伊斯兰和排外的标签。
是什么引起了如此大的争议?
批评者充满了对以色列友好的特朗普政府的宽恕和赞扬,他们说,这种祈祷更像是针对民主党人的政治声明,而不是祈祷。
但是这次祈祷和平常有什么不同吗?
而绝大多数的调用在 Pa。众议院 chamber 来自基督徒,对 2013 年以来超过 400 次调用的分析表明,大多数发言者避免使用公开的基督教名字称呼上帝。相反,大多数人使用更通用的名字,如“主”和“父亲”例如,不到 30%的调用包含单词“Jesus”甚至一次(不到 5%的调用不止一次)——Borowicz 在她有争议的调用中使用了 13 次。
Data: Session journals from the PA House of Representatives website.
Chart by Jared Whalen
观看下面视频中的祈祷。
方法论
使用可用的 PA 众议院会议日志(2013-2018 年 6 月)和 Borowicz 的祈祷文转录,我提取了祈祷文,并对祈祷文中上帝的常见名称进行了词频分析。
工具
Adobe —将 pdf 转换为纯文本
R —文本分析和可视化
Illustrator —完成设计润色
独立图表
Data: Session journals from the PA House of Representatives website.
Chart by Jared Whalen
将莱昂纳多·达芬奇的 5 种最佳技术应用到您的数据中
原文:https://towardsdatascience.com/yes-your-data-communications-are-mini-masterpieces-e8877af1e333?source=collection_archive---------7-----------------------
Disagreement if this is Leonardo da Vinci’s self-portrait — but most believe it is.
你可以用数据创造迷你杰作
达芬奇是有史以来最有影响力的艺术家之一。虽然最出名的是《蒙娜丽莎》和《最后的晚餐》这两幅作品,但他自学了许多其他学科,比如《T4》中的医学、科学、建筑,甚至是战争发明。
今天,您可以将他对细节的热爱、对世界的好奇心和灵感之美应用到您的数据通信中。
技巧 1:展示数据的灵魂
达芬奇被描述为历史上最有天赋和创造力的人之一。500 多年前,他出生在意大利托斯卡纳的芬奇镇。他出生在文艺复兴时期,这是中世纪开始向现代世界过渡的时期。
在他的一生中,达·芬奇写日记,记录草图、想法和提醒。从这些笔记本中,我们能够研究他的思维模式。从达芬奇身上,我们可以拥抱好奇心、系统思维、对细节的热爱,甚至冒险。
“一个好的画家有两个主要的绘画对象——人和他灵魂的意图。前者容易,后者难,因为它必须通过手势和肢体的运动来表达。”
Vitruvian Man (Public Domain)
他的维特鲁威人画的是一个站在一个圆圈和一个正方形内的人,显示了他对比例的理解。达芬奇被描述为非常英俊,非常迷人。这幅画被认为是一幅自画像。
想想这可能如何应用于数据——每天我们都必须展示数据并解释其含义。我们的工作是通过使用机器学习和数据可视化技术来展示数据的灵魂。
技巧二:达芬奇喜欢细节
为了保持艺术的准确性,达芬奇解剖了人类和动物的身体。当他致力于获得更精确的艺术作品时,他画的内脏器官和身体肌肉结构是已知的最早的一些画。这是一些第一张解剖图——当你看他的作品时,请注意面部和身体的细节是如何表现的。
这是我们数据通信的目标——展示整体和细节,让观众了解整个画面。类似于达芬奇——这意味着你理解数据的基本原理或剖析。这就是你如何传达你在数据中发现的丰富见解。
技巧 3:运用系统思维
系统思维是理解碎片如何影响整体的能力。达芬奇看到了自然界的模式,并以多种方式应用这些模式。通过对解剖学的研究,他对齿轮和杠杆的工作原理有了新的认识。他将概念相互联系并将这些想法应用到其他领域的能力增强了他解决问题的能力。
Systems Thinking applied to a Wheel
同样的系统思考过程也可以应用于数据通信。通过思考应用于整个流程或组织的业务问题,您可以更好地理解每个问题或见解将如何改变整个流程。
在 数据分析——系统思考 的帖子中,作者提出了当分析师不考虑单一指标的影响时,他们会如何引发问题。不考虑上游和下游方法,很容易分离出那个值,但是这是危险的!这些指标是一个更大系统的一部分,改变一个指标会对其他指标产生连锁反应。当你想到系统时,考虑你的见解是否有价值。
达芬奇对每个元素的观察和思考就是我们应该如何思考我们的数据通信。
技巧 4:用视觉思考来获得即时效果
Photo by Pavel Nekoranec on Unsplash
在他的一个笔记本中,达·芬奇注意到绘画如何优于写作,因为绘画可以在瞬间交流,而一首诗可能需要几个小时才能说完。这正是我们今天对数据可视化的看法!
这些视觉思维没有一个比我们从《蒙娜丽莎》中学到的更清晰。学者们评论了蒙娜丽莎的微笑。她是微笑还是悲伤?如果你把注意力集中在嘴巴上,看起来她可能只是在微笑。当你抽离并注意到她的眼睛时,她很明显在微笑,甚至在你穿过房间时注视着你。
达芬奇的 sfumato 技术,模糊了线条和边界,为他的作品带来了现实主义。他认为人们看到的不是清晰的线条,而是模糊的烟雾。他说这种技术是“没有线条或边界的,以烟雾的方式或在焦平面之外”。翻译过来,sfumato 来源于意大利语中的烟。
他分析了关于人脸的一切,以便更好地理解如何绘画。在他的杰作《蒙娜丽莎》中,他解剖了人的面部以了解与嘴唇相关的肌肉。达芬奇想用他的作品产生影响。他想移动查看器,这正是我们在数据通信中想要的。冲击!
技巧 5:发现意想不到的见解
如果你去意大利米兰旅行,你可以看到达芬奇最著名的画作之一——《最后的晚餐》。这幅作品被画在圣玛丽亚教堂的墙上。这幅画描绘了《新约》中的一个故事,基督和他的 12 个追随者一起吃了最后一顿饭。达芬奇想要捕捉基督透露他会被餐桌上的某个人出卖的那一刻。
Image by JaneB12 — Pixabay
对细节的关注是你能找到洞察力的地方。请注意,基督以开放的肢体语言坐在桌子的中央。整个图像以他为中心,拱门甚至看起来像是他的头顶。达芬奇确保每个门徒对基督的陈述有不同的反应——许多人问,“是我吗?“看这些脸——他们表现出担忧、震惊、愤怒和困惑。
叛徒犹大(基督左边第二个)正在远离基督。在犹大面前,有一个撒盐的容器。将盐洒在桌子上通常被认为是不祥之兆。这些是他加入的一些细节,为他的画增加了意义的深度。
众所周知,达芬奇会花几个小时观察人们,这样他就可以在笔记本上捕捉他们的表情。他会详细研究这个主题,并画出许多草图。
在左图中,你可以看到他的素描最后的晚餐。在这幅素描中,他考虑把犹大放在桌子的对面。他多次画出这些数字,以确保他的信息得到传达。在我们的世界中,我们称之为迭代。
同样的勤奋让数据通信脱颖而出。达芬奇注重表情、餐桌布置以及房间的细节。您的详细信息将来自您搜索数据以找到最有影响力的结果时的数据。
在你的工作中运用这些技巧
达芬奇于 1519 年在法国去世,享年 72 岁,当时他正在为法国国王服务。他将因对艺术和科学的巨大影响而被人们铭记。在他的一生中,达芬奇影响了包括米开朗基罗和拉斐尔在内的一代艺术家。
今天,您可以将他对细节的热爱、对世界的好奇心和灵感之美应用到您的数据展示中,打造出真正的杰作。
[## 数据和分析策略失败的常见原因
当向您的组织引入分析策略时,它可能会因为领导者不…
www.zencos.com](https://www.zencos.com/blog/organizational-change-toward-analytics-strategies-mistakes/) [## 为什么数据可视化会失败?
简单…伪装成有用见解的图表
towardsdatascience.com](/why-do-data-visualizations-fail-39fd29172d7a)
让我们连线—跟我来!
又一个全栈数据科学项目
原文:https://towardsdatascience.com/yet-another-full-stack-data-science-project-a-crisp-dm-implementation-2943cae8da09?source=collection_archive---------11-----------------------
一脆-DM 实现
Photo by rawpixel.com from Pexels
简介
几年前,当我在华盛顿特区搜索数据科学会议时,我第一次遇到了“全栈数据科学”这个术语。
作为一名软件开发背景的人,我非常熟悉全栈开发人员这个术语,但是全栈数据科学听起来很神秘。
随着越来越多的公司将数据科学&机器学习纳入其传统软件应用,术语全栈数据科学现在比历史上任何时候都更有意义。
软件开发方法经过多年的精心开发,以确保在较短的周转时间内实现高质量的软件应用。不幸的是,传统的软件开发方法在数据科学应用的环境中并不适用。
在这篇博文中,我将强调跨行业数据挖掘标准流程(CRISP-DM ),以开发一个可行的全栈数据科学产品。
我坚信一句谚语,“布丁的好坏,在于吃的过程。”因此,我通过应用 CRISP-DM 方法实现了 Starbucks challenge,作为本文的姊妹项目,并在本文的多个地方被提及。
Starbucks 数据集概述
星巴克使用模拟程序生成了数据集,该程序模拟了人们如何做出购买决定以及促销优惠如何影响这些决定。
模拟中的每个人都有一些影响他们购买模式的隐藏特征,并与他们的可观察特征相关联。人们执行各种事件,包括接收报价、打开报价和进行购买。
简单来说,没有特定的产品需要跟踪。只记录每笔交易或报价的金额。
有三种类型的优惠可以发送:
- 买一送一(BOGO)
- 折扣,和
- 信息
在 BOGO 优惠中,用户需要花费一定的金额来获得与该阈值金额相等的奖励。
收到折扣后,用户将获得相当于消费金额一小部分的奖励。
在信息提供中,没有奖励,但也没有要求用户花费的金额。优惠可以通过多种渠道提供。
主要任务是使用数据来确定哪些人群对每种类型的优惠最敏感,以及如何最好地展示这些优惠。
数据挖掘(CRISP-DM)的跨行业标准流程是什么?
跨行业数据挖掘标准流程(CRISP-DM)方法是一个开放的标准流程,描述了数据挖掘专家使用的传统方法。
CRISP-DM 是一个循环过程,分为六个阶段。
- 业务理解
- 数据理解
- 数据准备
- 建模
- 评估
- 部署
Cross-Industry Standard Process for Data Mining (CRISP-DM) By Kenneth Jensen
商业理解
侧重于从业务角度理解项目目标和需求,然后将这些知识转化为数据挖掘问题定义和初步计划。
对于当前场景,我们将:
- 对多变量频率分布进行探索性数据分析。
- 建立一个机器学习模型,预测某人是否会对某个提议做出回应。
- 建立一个预测个人最佳报价的机器学习模型。
- 建立预测购买习惯的机器学习模型。
数据理解
数据理解阶段有两种练习方式:
- 从现有的数据收集开始,并继续进行熟悉数据的活动,以发现对数据的初步见解,或检测感兴趣的子集,以形成对隐藏信息的假设。
- 识别特定的有趣问题,然后收集与这些问题相关的数据。
从业务到数据理解阶段的转化不是线性的;相反,它是循环的。
在这个项目中,我们将只利用星巴克提供的数据,因为在数据的固有限制下工作很有挑战性。因此,我们正在练习第一种方法。
Starbucks 在三个 json 文件中分发了数据:
- portfolio . JSON——包含报价 id 和每个报价的元数据(持续时间、类型等)。)
- profile.json —每个客户的人口统计数据
- 抄本. json —交易记录、收到的报价、查看的报价和完整的报价
数据准备
数据准备阶段包括从初始原始数据构建最终数据集的所有活动。数据准备是 80%的过程。
数据争论和数据分析是 CRISP-DM 模型的数据准备阶段的核心活动,也是第一个逻辑编程步骤。数据争论是一个循环的过程,我们经常需要一次又一次地重新审视这些步骤。
数据角力是独立于语言和框架的,没有一个正确的方法。对于姊妹项目,我选择 Python 作为编程语言,Pandas 作为数据操作框架。
根据经验,我将分两步处理数据争论:
- 评估数据——在这一步中,我们将对数据进行语法和语义检查,找出数据中的任何问题以及潜在的修复方法。
- 清理数据——在这一步中,我们实施评估阶段的数据修复。我们还运行小单元测试,以确保数据修复按预期工作。
我对 Starbucks 提供的所有三个数据源进行了数据辩论。
数据角力— portfolio.json
从视觉和程序性评估来看,投资组合数据集只有十行,没有缺失数据。
但是,数据不是机器学习友好的结构。我们将对“channels”和“offer_type”列应用 one hot 编码方法。
Data Wrangling — portfolio.json
数据角力— profile.json
根据目测评估,在轮廓数据集上:
- “成为成员”列不是日期时间格式。
- 如果缺少年龄信息,则默认使用“118”填充年龄
Age frequency distribution —before data wrangling
根据程序性评估,在轮廓数据集上:
- 性别和收入列有缺失数据。
- 缺少性别和收入信息的相同列的年龄值为“118”
在清理阶段对配置文件数据集实施以下修复:
- 删除缺少值的行,这将隐式删除年龄为“118”的行
- 将成为成员转换为熊猫日期时间数据类型。
数据不是机器学习友好结构。我将创建一个新的 ML 友好熊猫数据框,并做如下修改:
- 对性别列应用一种热编码方法。
- “成为成员”列拆分为年、月、日列,删除“成为成员”列
Data Wrangling — profile.json
一旦数据争论步骤完成,就没有丢失值的行(隐式删除年龄为‘118’的行))
Age frequency distribution — after data wrangling
数据角力—抄本. json
从视觉和程序性评估来看,抄本数据集中没有数据问题。
然而,没有定义促销是否影响了用户的数据。只有在个人观看广告后进行交易之后,用户才被认为受到促销的影响。我们将应用多种数据转换来提取这些信息。
Data Wrangling — transcript.json
现在我们已经清理了所有三个数据帧,让我们合并成一个数据帧。
Data Wrangling — consolidation
探索性数据分析—多变量频率分布
从文字记录数据中,我们识别出五种事件:
- 收到报价
- 报价已查看
- 报价完成
- 交易(购买)
- 受影响(仅当在查看报价后购买时)
从干净数据推断的特征在相应的可视化下面提到。
Event Distribution by Gender
- 注册为男性的个人资料交易次数最多。
- 注册为女性的个人资料很可能会受到晋升的影响。
Event Distribution by Income
- 数据集中的个人在 3 万到 12 万的收入范围内。
- 数据集中的大多数人年收入不到 8 万英镑。
- 大多数交易是由年收入低于 8 万英镑的个人进行的。
Event Distribution by Offer Type
- BOGO 优惠有较高的影响力。
- 信息优惠的影响可以忽略不计。
即使从数据探索中获得的知识并不多,但它已经产生了一个关键的洞察力— 目标类别不平衡 。主要是在处理分类模型时,这些信息对于决定应该使用什么评估度量是至关重要的。
建模和评估
建模不是必要步骤,完全取决于项目的范围。对于这个项目,我将建立一个机器学习模型:
- 预测某人是否会对提议做出回应。
- 预测个人的最佳报价。
- 预测购买习惯。
三个模型都是在集合模型上训练的。
对于分类模型,由于目标类别的不平衡,我们将使用精度、召回率和 F1 分值作为评估指标。
对于回归模型,我们将使用均方差和 R2 值作为评估指标。
预测某人是否会受到要约的影响
Model for predicting whether or not someone will be influenced by an offer
我采用了网格搜索来寻找产生高 F1 分数值的模型。学习率约为 1.87 的 AdaBoostClassifier 和 10 个估计器在训练和测试数据集上都产生了 0.87 的合并 F1 分数,实现了偏差(欠拟合)和方差(过拟合)之间的正确平衡。
Precision, Recall and F1-score for training and testing data sets
并非数据集中的所有特征都被用来进行预测。我们可以从模型的角度获得每个特征的权重。权重将在 0 到 1 的范围内,并且所有特征的总权重将加起来为 1。
Feature Importance for model to predict influence
预测一个人是否受促销影响的模型高度依赖于消费金额。这种模式高度依赖于行动(购买)之后。因此,我们不能使用这种模式。理想情况下,我们需要收集更多的数据来解决这个问题。由于我只处理星巴克提供的数据,我无法设计出想要的模型。
预测个人最佳报价
Model for predicting the best offer for an individual
我采用了网格搜索来寻找产生高 F1 分数值的模型。不幸的是,F1 可以达到的最高综合分数是“0.2”。
收集更多数据应该有助于提高 F1 分数,但由于我只在所提供的数据范围内工作,我无法部署这一模型。
Precision, Recall and F1-score for training and testing data sets
预测购买习惯
Model for predicting the purchasing habits
我采用了网格搜索来寻找产生合适的 R2 和 MSE 值的模型。学习率为 0.1 的 GradientBoostingRegressor 使用 100 个估计量,为训练和测试数据集产生了大约 0.32 的 R2 分数和大约 2300 的 MSE,实现了偏差(欠拟合)和方差(过拟合)之间的正确平衡。
R2 & MSE for training and testing data sets
Feature Importance for model to predict amount
与用于预测个人是否会受到影响的模型不同,预测购买力的模型依赖于多个特征,并且没有一个特征是事实属性。
我将在 Web 应用程序中使用这个模型来进行预测。
部署
通常,这意味着将模型的代码表示部署到应用程序中,以便对新出现的未知数据进行评分或分类。
重要的是,代码表示还必须包括建模前的所有数据准备步骤,以便模型能够以与模型开发期间相同的方式处理新的原始数据。
我已经创建了 web 应用程序,它将利用数据分析和预训练模型来预测个人资料和优惠代码组合的购买金额。
在 自述文件中提到了启动 web 应用程序所需遵循的步骤的完整描述。MD 文件。
以下是来自网络应用的截图:
数据集概述
路径: http://0.0.0.0:3001/
预测金额
路径:http://0 . 0 . 0 . 0:3001/predict _ AMT
结论
- 与传统的软件开发相反,实现业务需求并不总是可行的。有时更多的数据会有所帮助,但在我们目前的情况下,我们将在所提供的数据范围内工作。
- 测试集的评估是建模阶段的一部分;这在现实世界中并不常见。由于这个项目没有专门的测试人员,建模和评估是同时进行的。在任何时候,测试数据都不会暴露给预训练的模型。
- 此分析的源代码托管在 GIT 上。
参考文献
- CRISP-DM——确保良好结果的标准方法学
- 全栈数据科学(附)
另一篇卡尔曼滤波解释文章
原文:https://towardsdatascience.com/yet-another-kalman-filter-explanation-article-be0264d99937?source=collection_archive---------21-----------------------
是时候知道那些更新的方程式从何而来了
“[A Puzzle without a picture](http://A puzzle without a picture)” (who needs a picture when you have the Kalman Filter updating equations?)
T 网上有很多解释卡尔曼滤波器的文章,其中很多都相当不错。他们使用自主机器人和传感器作为激励的例子,有很好的视觉效果,并以直观的方式介绍模型方程和更新。但是我看到的每一个都没有解释卡尔曼增益矩阵和它的来源。
我最喜欢的例子是数学堆栈交换上这个备受推崇的答案:
[## 卡尔曼滤波器的解释
begingroup$我敢贴链接到我的解释:http://david.wf/kalmanfilter/有很多不同的…
math.stackexchange.com](https://math.stackexchange.com/questions/840662/an-explanation-of-the-kalman-filter)
它非常棒,直到作者准备解释卡尔曼增益矩阵,而不是以“未完待续……”(那是 2014 年)。失望的读者乞求几天才能得到其余的答案,但他们永远也得不到。
因此,欢迎阅读另一篇卡尔曼滤波解释文章,区别在于这篇文章包含了更新方程的“友好”推导,一直到最后。这是一个贝叶斯解释,但只需要粗略了解后验概率,依赖于多元高斯的两个属性,而不是特定的贝叶斯结果。作为一个奖励,这个解释将向我们展示卡尔曼滤波器是如何“最优”的,因为它的本质就是。
推导过程
由于 Medium 的排版限制,下面的嵌入式笔记本提供了推导过程。我的贡献最多是一个简洁的介绍;我迷失了,直到我找到 Simo srkk 的幻灯片,Simo srkk是一名研究人员,他后来写了一本关于贝叶斯过滤和平滑的更一般主题的书。
对推导的思考
我希望你已经完成了上面的讨论(感谢对不顺利部分的反馈)。最后,是后路:
该符号与维基百科上的更新方程略有不同,但您可能会发现平均值与“更新(后验)状态估计值”相同方差看起来不像“更新的(后验的)估计协方差”,但是在下面的段落中注意公式如何“进一步简化”看起来相似的东西。
最佳性
“ Bayes 动作是“最小化损失函数的后验期望值”的规则使未知参数的期望均方误差损失最小化的贝叶斯动作,即均方误差,就是后验分布的均值。在本文中,后验分布的平均值是状态的卡尔曼滤波更新方程;这个更新方程是一个最小均方误差估计量,因为它是一个后验均值。
最后的想法
在推导过程中,我假设现有的贝叶斯结果将适用,进一步简化它。测量模型看起来像一个以 x_t 为β的回归,但我找不到贝叶斯线性回归公式来拟合。我注意到“设计”矩阵 H 的行不是独立的观察值,我也想不出一种方法将它转换成一个有一个观察值的多元回归。如果有一种方法可以缩短现有共轭结果的推导过程,请在评论中分享。
对于符号,我特意选择不使用维基百科文章中的 k | k- 1 符号,因为我发现很容易混淆我实际使用的数量。然而,在完成推导之后,我可以理解它确实允许更少的符号,并且强调了在更新步骤中数量的演变。
每当我在这样的事情上分心时(我确实分心了),总会有这样一个问题:这是否值得。在这种情况下,我认为是。我觉得我对多元高斯在卡尔曼滤波器构造中的广泛作用有了更好的理解。我有一个卡尔曼滤波先验的更好的概念,它不仅包含了到前一状态的信息,还包含了来自状态空间模型的信息,以便更进一步。我可能对选择卡尔曼滤波器实现中的状态向量和方差矩阵的初始值有更好的直觉(我们会看到)。我希望你也认为这是值得的,不管怎样,请在评论中告诉我!
MATLAB 中的 YOLO 物体检测,从头到尾
原文:https://towardsdatascience.com/yolo-object-detection-in-matlab-start-to-finish-3f78ec80419d?source=collection_archive---------10-----------------------
在 MATLAB 中下载并实现 YOLO 目标检测网络
当我在寻找一种快速计算 3D 打印皮肤器官中生物细胞的方法时,约瑟夫·雷德蒙的 YOLO 算法引起了我的注意。YOLO 算法的优点是能够在单个图像中识别和定位多个(在我的实现中多达 49 个)对象,这使得它成为对显微镜图像中的细胞进行计数的理想框架。然而,在我能够训练一个类似 YOLO 的细胞检测网络之前,我需要在 MATLAB 中实现我在这个项目中使用的原始 YOLO。我原以为这是一个相当简单的任务,结果却有点像逆向工程。虽然可以从 Mathworks 下载 YOLO,但是实现的细节却很少。
如果您对 Matlab 中的对象检测感兴趣(并且有合适的工具箱),本文提供了一个诀窍,以及对 YOLO 的行为和使用的一些见解。如果你对 YOLO 完全陌生,这里有 YOLO 的原始论文,后面是吴恩达的精彩描述,可以帮助你入门。
1.下载 YOLONET 并为回归进行修改
可从 Mathworks 获得的 YOLO 网络在可用于对象检测之前需要修改。您将下载的网络包含分类算法的最终图层;分类层和 softmax 层。然而,YOLO 实际上是一种 CNN 回归算法。输出应该是 0 和 1 之间的数字的数组或向量,其编码图像中检测到的对象的概率和边界框信息,而不是一系列的 1 和 0
最后两层需要用一个回归层代替。此外,为了与最初的 YOLO 论文(见上文)保持一致,最后一个泄漏的 ReLu 传递函数需要用一个标准(非泄漏?)ReLu。以下代码下载网络,修改图层,并将修改后的网络保存到 MATLAB 中的当前文件夹。
Creating the yolo network in MATLAB
2.通过网络运行图像并检查输出向量
为了测试我对 YOLO 的实现,我调用了我视觉艺术能力的最高水平,拍了一张快照,其中包含了 YOLO 接受过训练的四个物体——椅子、狗、盆栽植物和沙发。这是我的测试图像:
Still Life with Chair, Stella the Dog, Potted Plant, and Sofa. James Browning. 2018. Digital Image.
因为 YOLO 是一个回归网络,我们将使用函数预测而不是分类。图像像素需要缩放到[0,1],图像需要调整到 448x448 像素。如果您的图像是灰度的(即单通道),它需要扩展到 3 个通道。以下代码预处理图像(您需要在 MATLAB 当前文件夹中提供您自己的图像),对其应用回归网络,并绘制生成的 1x1470 输出向量。在这一部分代码中,我们还为包含对象的单元格定义了一个概率阈值(0.2 似乎效果很好),并为非最大值抑制定义了一个超过联合阈值的交集,这两者我们稍后都会用到。
Running a test image through the network
值得看一看 YOLO 算法的输出向量。您可以通过注意到索引 1–980 大约每 20 个位置出现一个峰值来对输出进行反向工程,对应于 YOLO 已经被训练的 20 类对象,索引 981–1079 包含一些峰值,对应于在我的测试图像中少数可识别对象(4)的概率,而索引 1080–1470 是相当随机的,这是您从边界框坐标中所期望的。
The raw 1x470 output of our modified YOLO network when shown an image of Stella the Dog.
在通过网络运行了几十个简单的图像之后,例如在图像的一侧包含一个单独的高个子的图像,我能够如下解码 YOLO 算法的输出。我只保证它在没有生命、生计、个人财产或任何最有价值的东西受到威胁的情况下是准确的…
YOLO output key. Hard won. Wish I could figure out a way of monetizing it.
3.重塑输出矢量并查找包含对象的像元
现在我们有了 YOLO 算法输出的关键,我们可以开始将 1x1470 输出向量转换成覆盖在测试图像上的边界框的过程。作为第一步,我决定将 1x1470 向量转换为 7x7x30 数组,其中前两个维度对应于 YOLO 将图像划分成的 7x7 个单元,最后一个维度包含定义每个单元的概率和边界框的 30 个数字。这样做之后,我们可以画一个简单的图,显示可能包含对象的单元格。将下面的图与原始测试图像进行比较,我们看到该算法似乎正在检测椅子、狗和沙发,但似乎没有检测到盆栽植物。
Reshaping the output vector into a 7x7x30 array
Yellow cells on the left contain an object in the image of Stella the Dog on the right. So far so (kind of) good.
4.打印边界框和类别标签
现在我们有了一个漂亮的 7x7x30 输出数组,我们可以在原始图像上绘制边界框和类标签。我们现在将利用代码前面的 probThresh 变量。您需要调整这个值以获得最佳效果,但是我发现 0.2 似乎对各种图像都很有效。下面的代码我就不多说了,只说有点繁琐,让我头疼。
Displaying bounding boxes
Too many sofas, not enough potted plants.
5.非最大抑制
正如你在上面看到的,我们的测试图像有两个直接的问题:1)沙发被标记了两次,2)盆栽没有被标记。椅子和狗斯特拉被完美分类。我们将使用非最大抑制来纠正第一个问题(沙发太多),并忽略第二个问题。实际上,左上角的物体严格来说并不是盆栽植物,它是一瓶水中的几根常青树枝,我称之为曼哈顿圣诞树。我不是一个和算法争论语义的人。
如果出现以下情况,非最大抑制将移除边界框 A:
- 它与边界框 B 的并集交集(IOU)高于定义的阈值
- 边界框 A 和 B 包含相同类别的对象
- 边界框 A 包含对象的概率比框 B 低
代码如下:
Voila! Viola! (is something I imagine luthiers say a lot)
就是这样!MATLAB 中的实时统一目标检测。对羊有效吗?当然啦!它对人、狗和羊有效吗?不…
这里有一个关于迷人的、及时的、不断发展的 YOLO/人工智能羊难题的简短讨论:
[## YOLO 迷上了绵羊:统一目标探测中的环境背景
我最近在 MATLAB 上改编了约瑟夫·雷德蒙的 YOLO 算法(到目前为止没有非最大值抑制),度过了一个有趣的小时…
towardsdatascience.com](/yolo-is-sheep-obsessed-environmental-context-in-unified-object-detection-91160dafa618)
YOLO(你只看一眼)
原文:https://towardsdatascience.com/yolo-you-only-look-once-17f9280a47b0?source=collection_archive---------5-----------------------
一个实时物体检测算法的简单说明!
King Aragorn before a charge against the Orcs of Mordor
西雅图人,想象一下这个场景:
这是一个温暖的夏日午后,在绿湖公园。公园里到处都是其他人,他们试图在我们相对短暂的夏天吸收所有他们能得到的阳光。你躺在草地上,努力抚平前一周长途跋涉后晒黑的皮肤。当你在读你最喜欢的书时,你听到了集体的叫喊声。!!!“来自你附近的一个群。在你的眼角,你看到一个小球向你走来,随着每一毫秒的流逝,它突然变得越来越大。本能地,你放下书,并能够找到球,并在它击中你之前接住它!太棒了!
教一台机器如何“看”这个世界不是一件容易的事情。这可不是把相机连上电脑那么简单。我们只需要几分之一秒的时间来观察、识别、分析、分类,并最终根据我们的视觉采取行动(在这种情况下,举起你的手来预测流氓球的路径)。但是对于一台机器来说,重建人类视觉不仅仅是一个动作,它实际上是一系列动作。计算机视觉(CV)是一个不断发展和不断变化的跨学科计算机科学领域,它专注于如何使计算机能够像地球上的生命体一样感知世界。
在过去的几年里,硬件和软件都取得了进步。图像分割、面部识别和模式检测是计算机视觉的一些例子。在这篇博文中,我希望简单概述一下 YOLO(You Only looking Once),这是一种快速实时多目标检测算法,它是由来自华盛顿大学的 Redmon 等人在这篇 2015 年的论文中首次概述的(go DAWGS!)自其最初出现以来已经提出了许多改进。
首先,下面是 YOLO v2 的 youtube 视频。
来自 YOLO git hub 的自述:
你只看一次(YOLO)是一个用于检测 Pascal VOC 2012 数据集上的对象的系统。它可以检测 20 个帕斯卡对象类别:
人
鸟、猫、牛、狗、马、羊
飞机、自行车、船、公共汽车、汽车、摩托车、火车
瓶子、椅子、餐桌、盆栽、沙发、电视/显示器
很酷,对吧?但是什么?怎么会?
“你只看一次”是一种利用单个卷积网络进行对象检测的算法。与其他逐位扫描图像的对象检测算法不同,该算法获取整个图像并
…将对象检测重新构建为单个回归问题,直接从图像像素到边界框坐标和类别概率。
简而言之,无需深入细节,您可以获取一个图像输入,在 SxS 网格上将其分割,通过神经网络来创建边界框和类预测,以确定最终的检测输出。它首先在整个数据集上训练多个实例,然后在现实生活的图像和视频上进行测试。
为了计算边界框,YOLO 实现了两个关键的后处理步骤:IoU(在并集上相交)和 NMS(非最大值抑制)。
IoU 是机器预测的边界框与实际对象的边界框匹配的程度。以下面的汽车图片为例:
car
紫色的框是计算机认为的汽车,而红色是汽车的实际边界框。两个盒子的重叠给了我们借据。
The shaded yellow is our IoU
下面是 NMS 如何运作的一个简单例子。对象检测算法经常会有过度识别某个对象的问题,在这种情况下,奥黛丽·赫本的脸。 非最大抑制(NMS)已经广泛应用于计算机视觉的几个关键方面,并且是许多检测方法中不可或缺的一部分,可能是边缘、拐角或物体检测[1–6]。它的必要性源于检测算法定位感兴趣的概念的不完善的能力,导致在真实位置附近的几个检测的组。【NMS】确保我们在人脸所属的所有候选细胞中识别出最佳细胞。NMS 没有确定图像中她的脸部有多种情况,而是选择确定同一物体的概率最高的方框。
An example of NMS
利用 IoU 和 NMS,它可以极快地预测图像中的各种物体。通过在训练和测试期间查看整个图像,它隐式地编码了关于类的上下文信息以及它们在它所看到的图像中的外观。然而,YOLO 的一个缺点是无法检测太靠近或太小的多个对象,就像下面的例子中,建筑结构下的人群没有被 YOLO 分类。
via TechnoStacks
这项技术在现实生活中如何实施的一个很好的例子就是汽车视觉!当一辆汽车在街上行驶时,它“看到的”是不断变化的,通过快速 YOLO 算法,汽车将能够快速识别下面的骑车人。通过其他传感器来检测骑自行车的人有多远,汽车就能够采取必要的行动来阻止或避开骑自行车的人或其他汽车或物体,以避免碰撞!
我希望这个对 YOLO 算法的高水平概述已经激发了你对计算机视觉技术现状的兴趣。如果你有兴趣了解更多进一步的研究,请查看约瑟夫雷德蒙和他在 YOLO 和其他计算机视觉项目上的持续工作!
YOLO——你只能看一次
原文:https://towardsdatascience.com/yolo-you-only-look-once-c63247e59d66?source=collection_archive---------28-----------------------
YOLO!!!那么我们只活一次吗?我确实不知道。我知道的是我们只需要看一次。等等什么?
没错。如果您想要检测和定位图像中的对象,则不需要经历提出感兴趣区域、对它们进行分类和校正它们的边界框的整个过程。如果你还记得我以前的文章,这正是 RCNN 和更快的 RCNN 这样的模型所做的。
我们真的需要所有的复杂性和计算吗?如果我们想要一流的精度,我们当然会这么做。幸运的是,有另一种更简单的方法来完成这项任务,只需处理图像一次,并立即输出预测。这些类型的模型被称为单触发探测器。
https://www.youtube.com/watch?v=yQwfDxBMtXg
单发探测器
我们没有一个专门的系统来提出感兴趣的区域,而是有一组预定义的框来寻找对象,这些对象被转发到一堆卷积层来预测类得分和边界框偏移。然后,对于每个框,我们预测多个边界框,并为每个边界框分配一个置信度得分,我们检测位于该框中心的一个对象,并输出每个可能类别的一组概率。一旦我们有了所有这些,我们简单地,也许是天真地,只保留具有高置信度得分的盒子。这很有效。实际上取得了令人印象深刻的成果。为了更好地阐述整个流程,让我们使用一个最流行的单次检测器,称为 YOLO。
你只看一次(YOLO)
到目前为止,这个模型已经有了 3 个版本,每个新版本都在速度和准确性方面有所提高。基于输入大小和类别定义预定义像元的数量和每个像元的预测边界框的数量。在我们的例子中,我们将使用用于评估 PASCAL VOC 数据集的实际数字。
首先,我们将图像划分为 13x13 的网格,总共得到 169 个单元。
对于每一个单元,它预测 5 个具有置信度得分的边界框(x,y,w,h ),它检测一个对象,而不管框的数量和 20 个类别的 20 个概率。
总共,我们有 1695=845 个边界框,并且该模式的输出张量的形状将是(13,13,55+20)= (13,13,45)。YOLO 模型的全部本质就是建立这个(13,13,45)张量。为此,它使用一个 CNN 网络和两个完全连接的层来执行实际的回归。
在仅保留具有高置信度得分(高于诸如 0.3 的阈值)的边界框之后,提取最终预测
https://pjreddie.com/darknet/yolo/
因为模型可能会输出相同对象的重复检测,所以我们使用一种称为非最大抑制的技术来消除重复。在一个简单的实现中,我们通过置信度对预测进行排序,当我们迭代它们时,我们只保留每个类的第一次出现。
就实际模型而言,该架构非常简单,因为它只包含卷积层和池层,没有任何花哨的技巧。我们使用多重损失函数来训练该模型,该函数包括分类损失、定位损失和置信度损失。
最新版本的 YOLO 引入了一些特殊的技巧来提高准确性,减少训练和推理时间。一些例子是批量标准化、锚盒、维度集群等等。如果你想了解更多的细节,你绝对应该查看一下最初的论文。
此外,为了深入研究代码并在实践中尝试 YOLO 模型,请查看 Github 中这两个令人敬畏的存储库( repo1 和 repo2 )。
YOLO 的强大之处不在于其惊人的准确性或其背后非常巧妙的想法,而在于其高超的速度,这使其成为嵌入式系统和低功耗应用的理想选择。这就是为什么自动驾驶汽车和监控摄像头是它最常见的真实世界用例。
随着深度学习继续与计算机视觉一起发挥作用(它肯定会这样),我们可以期待更多的模型为低功耗系统量身定制,即使它们有时会牺牲准确性。别忘了整个物联网之类的东西。这才是这些车型真正出彩的地方。
如果你有任何想法、评论、问题或者你只是想了解我的最新内容,请随时在Linkedin,Twitter,insta gram,****
原载于 2019 年 5 月 13 日https://sergioskar . github . io。**
Yolov2 用于从视频中检测物体
原文:https://towardsdatascience.com/yolov2-for-object-detection-from-a-video-cd4574354d8e?source=collection_archive---------8-----------------------
在本文中,我们将探讨如何使用 yolov2、darkflow 从网络摄像头、视频文件和 youtube 视频中检测物体
下面的阅读将有助于你对Yolo——你只看一次
从 CNN 到面具 R-CNN 和 Yolo 第 1 部分
从 CNN 到 Mask R-CNN 和 Yolo Part 2
使用 Yolov v3 进行物体检测
关于 Yolo 的原始文件
在自定义数据集上实现 yolo
必需的库
- Python 3.5 或更高版本
- Tensorflow:我用过 CPU 版本
- OpenCV
- VC++ build 14
下载使用 keras 实现的 Yolo 代码
我们将使用暗流回购,可以从这里下载:https://github.com/thtrieu/darkflow
放下预先训练好的重量
重量可以从https://pjreddie.com/darknet/yolov2/下载
https://pjreddie.com/darknet/yolov2/
我创建了一个名为 bin 的新文件夹,并将下载的权重放在那里,如下所示
构建代码
构建代码有三种选择。
选项 1:
python setup.py build_ext --inplace
选项 2: pip 在开发模式下全局安装暗流
pip install -e .
选项 3:全球安装 pip
pip install .
对我来说,选项 2 和 3 效果不错。
我们现在准备处理图像或视频文件。
使用 Yolo 处理视频文件
我们将使用 COCO 数据集上预先训练的权重在 80 个类上处理视频。
我们将使用以下工具探索视频中的对象检测
- 网络摄像机
- 可见文件
- 传输 Youtube 视频
网络摄像机
所需库
import numpy as np
import time
import cv2
from darkflow.net.build import TFNet
import matplotlib.pyplot as plt
创建使用选项定义的暗流模型实例
options = {
'model': 'cfg/yolo.cfg',
'load': 'bin/yolov2.weights',
'threshold': 0.3
}
tfnet = TFNet(options)
从网络摄像头检测物体
创建一个 VideoCapture 的实例,参数为设备索引或视频文件的名称。将 0 作为摄像机的设备索引
cap = cv2.VideoCapture(0)
一旦创建了 VideoCapture 实例,您就可以逐帧捕获视频。最后不要忘记释放捕获并销毁所有窗口。
我们为框架创建一个随机颜色列表
colors=[tuple(255 * np.random.rand(3)) for i in range(5)]
我们将首先使用 cap.isOpened() 检查 VideoCapture 是否已初始化。如果 cap.isOpened()不为真,则使用 cap.open() 打开它。
我们设置了一个无限循环,并使用 cap.read()逐帧读取视频。cap.read()返回布尔值。如果帧读取正确,cap.read(0 返回 True。
对于每一帧,我们使用暗流实例 tfnet 来预测对象。我们提取左上、右下和标签来绘制边界框,标签显示在边界框的顶部。
我们使用 cv2.imshow()在窗口中显示该帧。
我们还设置当用户点击“q”时中断循环。
最后,我们通过释放摄像机并销毁所有窗口来清理视频捕获
**while(cap.isOpened()):**
stime= time.time()
**ret, frame = cap.read()**
**results = tfnet.return_predict(frame)**
if ret:
for color, result in zip(colors, results):
**tl = (result['topleft']['x'], result['topleft']['y'])
br = (result['bottomright']['x'], result['bottomright']['y'])
label = result['label']**
**frame= cv2.rectangle(frame, tl, br, color, 7)
frame= cv2.putText(frame, label, tl, cv2.FONT_HERSHEY_TRIPLEX, 1, (0,0,0), 2)**
** cv2.imshow('frame', frame)**
print('FPS {:1f}'.format(1/(time.time() -stime)))
**if cv2.waitKey(1) & 0xFF == ord('q'):
break**
else:
break
**cap.release()
cv2.destroyAllWindows()**
从视频文件中检测目标
从视频文件中检测对象的代码基本相同,唯一的变化是我们向 VideoCapture 提供了一个视频文件名。
要退出并释放捕获,请按 q
import cv2
from darkflow.net.build import TFNet
import matplotlib.pyplot as plt
import numpy as np
import timeoptions = {
'model': 'cfg/yolo.cfg',
'load': 'bin/yolov2.weights',
'threshold': 0.3
}
tfnet = TFNet(options)**cap = cv2.VideoCapture('video.mp4')**
colors=[tuple(255 * np.random.rand(3)) for i in range(5)]while(cap.isOpened()):
stime= time.time()
ret, frame = cap.read()
results = tfnet.return_predict(frame)
if ret:
for color, result in zip(colors, results):
tl = (result['topleft']['x'], result['topleft']['y'])
br = (result['bottomright']['x'], result['bottomright']['y'])
label = result['label']
frame= cv2.rectangle(frame, tl, br, color, 7)
frame= cv2.putText(frame, label, tl, cv2.FONT_HERSHEY_TRIPLEX, 1, (0,0,0), 2)
cv2.imshow('frame', frame)
print('FPS {:1f}'.format(1/(time.time() -stime)))
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
从 youtube 视频中检测物体
要阅读 youtube 视频,我们需要安装两个库
- Pafy : Python 库,用于下载 YouTube 内容和检索元数据。
- youtube_dl : 允许从 YouTube.com 和其他视频网站下载视频
在 Anaconda 提示符下安装库
pip install pafy
pip install --upgrade youtube_dl
导入所需的库
import pafy
import cv2
from darkflow.net.build import TFNet
import matplotlib.pyplot as plt
import numpy as np
import time
使用 pafy 下载带有元数据的 youtube 视频
**url = '**[**https://www.youtube.com/watch?v=_iiOEQOtBlQ**](https://www.youtube.com/watch?v=eWZscjTlZKg)**'
vPafy = pafy.new(url)
play = vPafy.getbest(preftype="webm")**
print(play.url)
最后,我们进行视频捕获,并将 youtube 视频的元数据作为参数传递给视频捕获。其余的代码保持不变
**options = {
'model': 'cfg/yolo.cfg',
'load': 'bin/yolov2.weights',
'threshold': 0.3
}**
**tfnet = TFNet(options)**
**cap = cv2.VideoCapture(play.url)**
colors=[tuple(255 * np.random.rand(3)) for i in range(5)]
while(cap.isOpened()):
stime= time.time()
ret, frame = cap.read()
results = tfnet.return_predict(frame)
if ret:
for color, result in zip(colors, results):
tl = (result['topleft']['x'], result['topleft']['y'])
br = (result['bottomright']['x'], result['bottomright']['y'])
label = result['label']
frame= cv2.rectangle(frame, tl, br, color, 7)
frame= cv2.putText(frame, label, tl, cv2.FONT_HERSHEY_TRIPLEX, 1, (0,0,0), 2)
cv2.imshow('frame', frame)
print('FPS {:1f}'.format(1/(time.time() -stime)))
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
参考资料:
[## Pafy 文档- pafy 0.3.70 文档
这是 Pafy 的文档——一个 Python 库,用于下载 YouTube 内容和检索元数据快速入门…
pythonhosted.org](https://pythonhosted.org/Pafy/) [## 视频入门- OpenCV-Python 教程 1 文档
学会看视频,显示视频,保存视频。学会从相机捕捉并显示它。你会学到这些…
opencv-python-tutro als . readthedocs . io](https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html)
刷牙可能比你想象的更“忙”
原文:https://towardsdatascience.com/you-are-more-busy-while-brushing-teeth-than-walking-at-least-thats-what-data-science-concludes-34542ad87465?source=collection_archive---------21-----------------------
利用数据科学的力量实现日常生活活动(ADL)的价值
你醒了。你刷牙。听起来很平凡。但是像刷牙这样的活动会产生大量的数据。有了这些数据,我们可以看到,即使是像刷牙这样平凡的活动也可能是“忙碌”或“忙乱”的活动。在这篇文章中,我们将使用数据科学来看看刷牙和走路相比有多忙
在数据科学世界中,诸如刷牙、爬楼梯、梳头、下楼、喝水、躺下、走路等日常活动被称为日常生活活动(ADL)。利用诸如腕戴式加速度计之类技术,可以非常精确地测量这些活动
在本文中,我们将分析这样一个加速度计数据集,看看数据科学如何帮助我们回答一些关于日常活动的有趣问题。
要说明的数据集
此处使用的数据集来自 UCI 数据集(Dua,d .和 Graff,C. (2019))。UCI 机器学习知识库[http://archive . ics . UCI . edu/ml]。加州欧文:加州大学信息与计算机科学学院)
数据集包含从腕戴式加速度计收集的数据。加速度计是一种用于测量加速力的机电设备。加速度是速度变化的度量,或速度除以时间。加速度计可以测量三个方向的加速度。对于一个人来说,X 方向是沿前后方向的加速度。Y 方向是侧向加速度,Z 方向是上下方向的加速度
Accelerometer direction from human perspective
问题:日常活动数据是什么样的
我们知道自己所有的活动,比如刷牙或走路。但是加速度计的数据是什么样的呢?为了直观显示这些数据,我们可以用线图来绘制。在下图中,我们看到行走和刷牙活动在 X,Y,Z 方向上的加速度。
Accelerometer data while walking
我们观察到 X 方向的图形比 Y 方向有更多的变化。这是因为当我们走路时,我们不怎么侧向移动
刷牙的加速度图如下所示。
Accelerometer data while brushing teeth
我们看到,与走路相比,刷牙的图形在某些部分非常密集。这是因为与行走相比,刷牙活动具有更大的加速度
问题:数据能证明刷牙是比走路更快的活动吗
为了回答这个问题,我们需要了解如何衡量“快”。当数据是一个时间序列时,“牢度”可以用频率来衡量。频率是单位时间内重复事件发生的次数。
从步行的角度来看,频率意味着在给定时间内行走的步数。从刷牙的角度来看,频率意味着在给定时间内刷的次数。
将时间序列数据转换成频率可以通过称为傅立叶变换的算法。
为简单起见,我们只考虑 X 方向的加速度计数据。让我们获取 X 方向的行走加速度计数据,并使用傅立叶变换算法将其转换为频率。结果看起来像这样
Fourier transformation of walking data
对于行走时间序列数据,傅立叶变换表明,出现的频率大部分是低频。这意味着在行走过程中,在给定时间内走的步数相对较少。
傅立叶变换也给出了频率的振幅。振幅是频率的大小。对于行走来说,这可能与步伐的大小有关。例如,你可以在给定的时间内走 5 大步或 5 小步。频率相同(5 步),但小步走的幅度小于大步走的幅度
对刷牙的类似分析表明,存在低频和高频。
Fourier Transformation of brushing data
正如我们看到刷牙涉及高频率,我们可以得出结论,刷牙比走路快
问题:与走路相比,刷牙有多“忙”
数据证明刷牙比走路更快。但是与走路相比,刷牙有多“忙”或“忙乱”
为了回答这个问题,我们需要一个表示活动“繁忙”程度的数字。一种可能的方法是既看到频率的振幅,也看到频率的长度。从行走的角度来看,这意味着一个人走得有多快,走多长时间以及步子的长度。从刷牙的角度来看,这意味着一次刷牙的速度有多快,每次刷牙的时间有多长。从数据科学的角度来看,这被称为频率的次方。还需要计算所有频率的功率。计算频率功率的算法叫做韦尔奇算法****
频率与功率的关系曲线被称为频谱图
Power Spectrogram of Walking and Brushing
频谱曲线下的总面积也是所有频率的总功率。曲线下的面积可以用辛普森法则计算。
我们看到行走的总动力是 13.5,刷牙的总动力是 95.1。所以刷牙是 95.1 / 13.5 = 7 倍“忙”然后走路
所以下一次当你刷牙的时候,即使你仍然很困,你仍然比在花园里散步还要“忙”7 倍
额外资源
网站(全球资讯网的主机站)
你可以访问我的网站进行零编码分析。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/you-are-what-you-tweet-7e23fb84f4ed?source=collection_archive---------9-----------------------
通过 Twitter 使用检测社交媒体中的抑郁症
Photo by Aa Dil from Pexels
通过分析社交媒体帖子中的语言标记,有可能创建一个深度学习模型,该模型可以比传统方法更早地让个人了解他或她的心理健康。
超过 3 亿人患有抑郁症,其中只有一小部分人接受了适当的治疗。抑郁症是全球残疾的主要原因,每年有近 80 万人死于自杀。自杀是 15-29 岁人群的第二大死因。抑郁症的诊断(和随后的治疗)经常被延迟、不精确和/或完全错过。
事情不一定是这样的。
社交媒体为转变早期抑郁症干预服务提供了前所未有的机会,特别是在年轻人中。
每秒钟,Twitter 上大约有 6000 条推文,相当于每分钟发送 35 万条推文,每天 5 亿条推文,每年约 2000 亿条推文。
皮尤研究中心指出,目前,72%的公众使用某种类型的社交媒体。
Photo by rawpixel.com from Pexels
因为抑郁症是一种经常需要自我报告症状的疾病,社交媒体帖子提供了丰富的数据和信息来源,可用于训练有效的模型。
抑郁检测
这个想法是创建一个项目,旨在捕捉和分析与抑郁症状的发作和持续相关的语言标记,以便建立一个可以有效预测抑郁的算法。推进推文中的语言标记可以用来构建统计模型的想法,这些模型可以检测甚至预测抑郁症,可以补充和扩展传统的诊断方法。
建立一种可以分析表现出自我评估抑郁特征的推文的算法,可以让个人、父母、护理人员和医疗专业人员分析社交媒体帖子,以寻找语言线索,这些线索标志着精神健康状况恶化,远远早于传统方法。分析社交媒体帖子中的语言标记可以进行低调的评估,这种评估可以补充传统服务,并允许更早地意识到抑郁迹象。
Photo by Úrsula Madariaga from Pexels
虽然之前许多关于抑郁症相关社交媒体帖子的研究都依赖于脸书,但很少有人关注 Twitter 内容。然而,这两个平台之间的关键差异导致了独特的不同内容,而 Twitter 内容具有独特的价值。
虽然脸书用户经常用真名向朋友和家人发帖,但 Twitter 用户经常使用假名,更有可能与他们从未见过面的用户联系。这允许一种更匿名的交流方式,它可以提供一种对个人思想和经历的更少偏见的描述。
Twitter 还提供了通常不太可能参与心理健康相关研究的广大用户群体,以及广泛的公共可用信息,提供了克服传统数据收集方法的一些限制的方法。
语言和活动的变化一直与社交媒体上的活动变化相关。社交媒体帖子中使用的情感语言和语言特征已被证明可以表明重度抑郁症的情感特征。人们一贯使用 Twitter 等社交媒体平台,以书面形式分享他们的想法和观点。
Twitter 上的帖子对分析特别有用,因为它们最常见于日常活动和事件中。这为捕捉与个人的思维、情绪、社交、交流和活动相关的行为属性提供了丰富和一致的方法。
Photo by Adrien Olichon from Pexels
在过去的几年里,人们对使用社交媒体作为公共卫生工具的兴趣越来越大,从识别流感症状的传播到基于 Twitter 帖子建立对疾病的见解。然而,使用社交媒体分析行为健康障碍的研究仍处于起步阶段。
Park 等人(见下文参考文献),发现了人们在社交媒体上发布自己抑郁甚至治疗的证据。Eichstaedt 等人在病历中发现脸书语可以预测抑郁症。De Choudhury 等人研究了新妈妈产后变化的语言和情绪相关因素,并建立了一个统计模型,仅使用产前观察来预测极端的产后行为变化。Reece 等人开发了计算模型来预测 Twitter 用户中创伤后应激障碍的出现。这突出了社交媒体作为关于当前或未来抑郁症发作可能性的信号来源的潜力。
该项目旨在扩大基于社交媒体的心理健康措施的范围,并使用已证明抑郁症和特定语言特征之间相关性的现有研究,以建立一种可以预测基于文本的抑郁症迹象的算法。
使用语言标记作为分析和诊断抑郁症的工具具有巨大的潜力。即使不使用复杂的模型,抑郁症也能很快在文本中显现出来。仅仅通过收集、清理和处理可用数据,视觉分析就可以阐明随机推文和具有抑郁特征的推文之间的差异。
一旦这个项目的推文被清理,通过用清理过的推文创建一个单词云,就很容易看出两个数据集之间的差异。这两个数据集之间的差异显而易见:
随机推文
有抑郁特征的推特
语言分析在精神健康领域的潜力不能被夸大。通过分析一个人的话语,你可以清楚而有价值地了解他或她的精神状态。
即使是对社交媒体最简单的分析,也能让我们前所未有地了解个人的想法和感受,并导致对心理健康更深入的理解和治疗。
构建模型
在决定研究心理健康和社交媒体之间的联系后,开始这一过程的最有效方式显然是专门关注心理健康的一个领域和一个社交媒体平台。因为抑郁症是一个如此广泛的问题,所以关注抑郁症及其相关研究是最有意义的。
虽然脸书已经被反复研究过,也有大量关于使用脸书帖子来检测和分析心理健康的信息,但 Twitter 似乎是一个更有趣的使用平台。推特和脸书的帖子有着本质的不同。他们更匿名,更短,更快,更有可能在整个白天和晚上快速制作。此外,Twitter 数据很容易作为现有数据集获得,如果需要的话,很容易抓取甚至流式传输。
Photo by Kat Jayne from Pexels
一旦决定使用 Twitter,找到(或创建)最佳数据就是下一个需要解决的问题。现有的数据集包含随机推文和针对情绪分析的推文,但情绪分析本身与抑郁症分析不是一回事。
因为没有公开可用的包含“抑郁”推文的数据集,很明显我必须创建自己的数据集。我想到的第一个方法是使用 Tweepy ,但是 Tweepy 需要一个开发者账户,这意味着用户需要申请一个 Twitter 开发者账户。我想确保这个模型可以被任何有兴趣的人轻易复制。
经过进一步研究, TWINT 竟然是最优解。TWINT 允许任何用户以各种方式搜索和抓取推文,并收集和存储它们。
当时的问题变成了,是什么让 发了一条表示抑郁的推文?一些研究论文着眼于抑郁症的词汇标记,它们都同意一些观点。患有抑郁症的人经常下意识地使用非常特定的语言标记来表示抑郁。建立一个包含这些术语的字典并给它们单独的权重是可能的,但在阅读了一些与抑郁症、心理健康和语言学相关的论文后,很明显抑郁症是最常自我报告的,至少在最初是自我评估的。因此,如果一个人说她抑郁,那她极有可能就是抑郁。
Photo by Alexander Krivitskiy from Pexels
此外,像“绝望”、“孤独”和“自杀”这样的词总是与患有抑郁症的人联系在一起,就像人们提到特定的药物治疗一样,甚至一般是“抗抑郁药物”。虽然有可能建立包含抑郁症特有的所有词汇特征的字典,包括特定术语、人称代词使用的增加、宗教参考的增加、一天中的时间分析等等,但似乎通过抓取按非常特定的术语搜索的推文,这些推文可能包含一个好的模型需要学习的所有词汇特征,并变得既健壮又准确。
在使用 TWINT 随机收集了 24 小时的推文后,这些数据被合并成一个数据集。这些推文被手动清理(例如,删除提及经济和环境而不是情绪抑郁的内容),然后被清理和处理。
下一个问题涉及分类器的选择。有很多方法可以分析这些信息,但现实是心理健康,特别是抑郁症,是一个主观而复杂的话题。虽然有可能根据一条推文来量化一个人的抑郁程度,但对于这个项目来说,唯一真正重要的问题是,一个人是否表现出抑郁的语言标记?知道了这个问题和精神疾病的主观本质,二元分类模型对这个项目来说是最有意义的。
虽然逻辑回归模型作为基准模型是有意义的,但长期短期记忆网络(LSTM)模型最终成为手头项目最稳健的模型。递归神经网络允许信息从网络的一个步骤传递到另一个步骤,是序列、列表和其他语言处理问题的理想选择。LSTM 能够学习长期的依赖关系,并且在各种各样的问题上工作得非常出色。虽然 rnn 在长期依赖性方面有困难,但是 LSTMs 被明确地设计来避免长期依赖性问题。
增加一个卷积层也是有意义的。卷积神经网络(CNN)非常适合从数据中学习空间结构,并从传递到 LSTM 层的顺序数据中学习结构。
利用 Word2vec 也使得模型更加健壮。Word2vec 是一个处理文本的双层神经网络。它的输入是一个文本语料库,输出是一组向量。它把文本变成深度网可以理解的数字形式。Word2vec 在 vectorspace 中将相似单词的向量组合在一起。它能够从数学上发现相似之处。给定足够的数据、用法和上下文,它可以根据过去的表现高度准确地猜测单词的意思。这些猜测可以用来建立一个单词与其他单词的联系。Word2vec 神经网络的输出是一个词汇,其中每个项目都有一个向量,可以输入到深度学习网络中。
LSTM + CNN 模型接受一个输入,然后输出一个数字,代表该推文表明抑郁症的概率。该模型接受每个输入句子,用其嵌入内容替换它,然后通过卷积层运行新的嵌入向量。卷积层将它从顺序数据中学习到的结构传递到 LSTM 层。然后,LSTM 层的输出被输入到密集模型中进行预测。
一旦设计并构建了模型,问题就变成了优化模型以获得最佳结果。最初,该模型遭受过拟合,如图所示。然而,通过降低模型的复杂性和增加漏失,实现了更稳健的模型,并且消除了过度拟合的证据。
该模型的数据分为 60%的训练集、20%的验证集和 20%的测试集。测试集一直保持独立,直到最后,以确保模型的准确性。通过查看准确性和分类报告来分析最终结果。
选择最终的架构、参数和超参数是因为它们在所有尝试的组合中表现最佳。LSTM 模型接受标记化的推文,并将它们送入嵌入层,以获得嵌入向量。该模型接受一个输入,然后输出一个数字,代表该推文表明抑郁症的概率。该模型接受每个输入推文,用其嵌入内容替换它,然后通过卷积层运行新的嵌入向量,这非常适合从数据中学习空间结构。卷积层利用这一点,从顺序数据中学习结构,然后将其传递到标准 LSTM 层。LSTM 层的输出被输入到用于预测的密集模型中。该模型具有嵌入层、卷积层和密集层,并且在第一层中使用最大池、0.5 的下降、二进制交叉熵损失、Nadam 优化器和 ReLu 激活函数,在密集层中使用 sigmoid 激活函数。准确性和损失被记录和可视化,并与基准逻辑回归模型进行比较。
成功!
该模型具有 97%的准确性,证明是一个准确且稳健的模型,对于进一步的开发和使用应该是有效的。
Photo by Marcin Dampc from Pexels
感谢阅读!和往常一样,如果你用这些信息做了什么酷的事情,请在下面的评论中让每个人都知道,或者联系 LinkedIn !
寻找更多的想法?
[## 数据搜集、清理和可视化初学者终极指南
通过清理和预处理您的数据,让您的模型从不起眼到令人惊叹
towardsdatascience.com](/ultimate-beginners-guide-to-scraping-and-cleaning-twitter-data-a64e4aaa9343) [## 数据科学入门终极指南
我是如何在不到 6 个月的时间里获得数据科学工作机会的
towardsdatascience.com](/the-ultimate-guide-to-getting-started-in-data-science-234149684ef7) [## 现在如何开始数据科学:10 篇顶级文章和一个想法
今年对于网络来说是艰难的一年。
towardsdatascience.com](/how-to-get-started-in-data-science-now-10-top-articles-and-one-idea-d9d28ee34cca)
参考
在此了解更多信息!
[## 抑郁
抑郁症是一种世界范围内的常见疾病,有超过 3 亿人受到影响。抑郁症不同于…
www.who.int](https://www.who.int/news-room/fact-sheets/detail/depression) [## Twitter 使用统计
平均每秒钟,大约有 6000 条推文在 Twitter 上发布(在这里可视化它们),这相当于超过…
www.internetlivestats.com](https://www.internetlivestats.com/twitter-statistics/) [## 美国社交媒体用户的人口统计和采用情况
更多信息:互联网/宽带|移动技术今天,大约 70%的美国人使用社交媒体…
www.pewinternet.org](https://www.pewinternet.org/fact-sheet/social-media/) [## 用推特数据预测精神疾病的发病和病程
我们开发了计算模型来预测推特上抑郁症和创伤后应激障碍的出现…
www.nature.com](https://www.nature.com/articles/s41598-017-12961-9) [## 用于传染病爆发早期检测的社交网络传感器
目前检测传染病爆发的方法提供了关于传染病过程的同期信息。
journals.plos.org](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0012948) [## 脸书语在医疗记录中预测抑郁症
抑郁症是致残和可治疗的,但诊断不足。在这项研究中,我们表明,同意分享的内容…
www.pnas.org](https://www.pnas.org/content/115/44/11203) [## 通过社交媒体预测产后情绪和行为的变化——微软研究
我们认为社交媒体是一个很有前途的公共卫生工具,重点是使用 Twitter 帖子来建立…
www.microsoft.com](https://www.microsoft.com/en-us/research/publication/predicting-postpartum-changes-emotion-behavior-via-social-media/) [## 用推特数据预测精神疾病的发病和病程
我们开发了计算模型来预测推特上抑郁症和创伤后应激障碍的出现…
www.nature.com](https://www.nature.com/articles/s41598-017-12961-9) [## 利用神经网络和语言学元数据早期检测抑郁症的迹象…
抑郁症被列为全球残疾的最大原因,也是自杀的主要原因。还是…
www.groundai.com](https://www.groundai.com/project/utilizing-neural-networks-and-linguistic-metadata-for-early-detection-of-depression-indications-in-text-sequences/)
你可以用 tkinter 管理雪茄
原文:https://towardsdatascience.com/you-can-manage-cigars-with-tkinter-a2c39990e1b2?source=collection_archive---------26-----------------------
用例
下面是如何使用 Python 最流行的 GUI 包 tkinter 创建数据管理系统
Photo by Joris Visser on Unsplash
愿你长命百岁。
我的一个好朋友是雪茄爱好者。他有一个 excel 电子表格来管理他的雪茄(顺便说一句,这个电子表格太棒了——方块会改变颜色,让他知道某个盒子已经准备好让他抽了)。但也有一些问题,比如输入不标准,现在他的收藏越来越多,不方便了解他的收藏,等等。所以我决定用 Python 为他创建一个雪茄管理系统,以便更好地组织和分析他壮观的收藏。
在我们开始之前,这里有一些基本的环境信息:
IDE:Jupyter Lab 包: tkinter,pandas Python 版本: 3.7 硬件:Macbook Pro 13”(2018)
在设计方面,原型 1.0 系统主要分为两个部分:记录维护和总结概述。我们有用于记录维护的导入数据和插入数据选项;查看数据、摘要图表和准备吸烟选项以进行摘要概述。
主要的
首先,让我们导入tkinter
和pandas
包并设置main
函数。在main
功能中,将根据用户从菜单中的选择调用其他功能。
main function
菜单
下一步是使用tkinter
在menu
功能中设置菜单。for
循环用于从菜单选项列表中提供文本参数。我选择了Radiobutton
而不是常规的Button
,因为Radiobutton
一次只允许用户选择一个Radiobutton
。indicatoron
(代表“指示器开启”)选项设置为 0(默认为 1),这意味着没有单独的单选按钮指示器。因此,我们可以让Radiobutton
看起来像一个普通的按钮,而不是让Radiobutton
有包含空白的圆孔。
menu function
Radiobutton with indicatoron set to 0
对于tkinter
中的配色方案,这个图表是一个很好的参考。
tkinter color chart
输入数据
因为我们的用户已经有了很好的数据集合,所以让用户导入他的原始数据集。在import_cigar
功能中,用户可以从计算机中选择一个文件并完成导入。如果雪茄 _ 文件. xlsx 已经存在,这个新文件将与它串接;如果雪茄 _ 文件. xlsx 不存在,它将被创建,来自用户选择文件的数据将被添加到其中。
import_cigar function
Select a file
cigar folder
插入数据
用户也可以通过选择“1”来插入新的雪茄记录。从菜单中插入“。该功能通过tkinter
中的Label
和Entry
模块实现。一旦用户填写完该表格并点击“OK”按钮,记录将自动保存到雪茄 _ 文件. xlsx 中作为新的一行。
insert_cigar function
图像数据
如果用户想查看完整的数据,他们可以选择“2。查看”选项,并快速查看数据。
view_cigar function
简单图表
charts_cigar function
我在这里只创建了两个简单的图表,但重点是我们手中有plt
或其他软件包的能力来创建可视化并使用tkinter
显示它们。
Simple Cigar Charts
准备好抽烟了吗
最后,我们来找准备抽的雪茄吧!真正的规则比这更复杂,但是现在,我们只能说如果雪茄在雪茄盒里超过 3 年,它就可以抽了。
Ready to Smoke Cigars
所以,这是目前的原型 1.0!这个系统远非完美,有许多功能在未来会很好。但是我在大多数 GUI 应用程序中体验了tkinter
的乐趣,我的重点更多的是尝试不同类型的模块,而不是让它们变得漂亮。总的来说,我对这个强大的软件包很满意。它提供了许多可以玩的模块,而且非常容易使用。但是也有令人失望的地方,比如缺乏稳定性和可扩展性。
最后,这似乎是老生常谈,但是—
在
*tkinter*
中使用循环来精简你的代码。
cigar.py
感谢阅读。如果你想试试看,请看完整代码cigar.py
。如果你有任何意见或反馈,我期待着听到他们。
资源
- tkinter — wiki.python
- Tkinter 单选按钮小工具
- Widget 类引用
- 如何将 Matplotlib 图表放置在 Tkinter GUI 上
- 入口小部件
通过深度学习,你现在可以用别人的声音说话了
原文:https://towardsdatascience.com/you-can-now-speak-using-someone-elses-voice-with-deep-learning-8be24368fa2b?source=collection_archive---------3-----------------------
想获得灵感?快来加入我的 超级行情快讯 。😎
文本到语音(TTS)合成指的是文本到音频的人工转换。人类仅仅通过阅读来完成这项任务。一个好的 TTS 系统的目标是让计算机自动完成这项工作。
当创建这样一个系统时,一个非常有趣的选择是选择哪个声音用于生成的音频。应该是男的还是女的?声音大还是声音小?
这在使用深度学习进行 TTS 时曾经是一个限制。你必须收集文本-语音对的数据集。录制该讲话的扬声器组是固定的——您不能拥有无限个扬声器!
所以,如果你想创造你的声音,或者其他人的声音,唯一的方法就是收集一个全新的数据集。
来自谷歌的人工智能研究昵称 声音克隆 使得计算机使用任何声音大声朗读成为可能。
声音克隆是如何工作的
很明显,为了让计算机能够用任何声音大声朗读,它需要以某种方式理解两件事:它在读什么和它如何读。
因此,谷歌的研究人员设计的声音克隆系统有两个输入:我们想要阅读的文本和我们想要阅读文本的声音样本。
例如,如果我们想让蝙蝠侠念出“我爱披萨”这句话,那么我们会给系统两个东西:写着“我爱披萨”的文本和蝙蝠侠声音的简短样本,这样它就知道蝙蝠侠应该是什么声音了。输出应该是蝙蝠侠说“我爱披萨”的声音!
从技术角度来看,该系统被分解为 3 个连续的组件:
(1)给定我们希望使用的语音的小音频样本,将语音波形编码成固定维度的向量表示
(2)给定一段文字,也将其编码成矢量表示。将语音和文本的两个向量合并,解码成一个声谱图
(3)使用声码器将声谱图转换成我们可以听到的音频波形。
Simplified version of the system. Original source
在本文中,这三个部分是独立训练的。
在过去的几年里,文本到语音系统在深度学习社区中得到了很多研究关注。事实上,有许多基于深度学习的文本到语音转换的解决方案都非常有效。
这里的关键是,系统能够从语音中获取扬声器编码器学习的“知识”,并将其应用到文本中。
语音和文本分别编码后,在公共嵌入空间中组合,然后一起解码生成最终的输出波形。
克隆声音的代码
感谢人工智能社区中开放源代码思想的美丽,在这里有一个公开的语音克隆实现!这是你如何使用它。
首先克隆存储库。
git clone [https://github.com/CorentinJ/Real-Time-Voice-Cloning.git](https://github.com/CorentinJ/Real-Time-Voice-Cloning.git)
安装所需的库。确保使用 Python 3:
pip3 install -r requirements.txt
在自述文件中,您还可以找到下载预训练模型和数据集的链接,以试用一些样本。
最后,您可以通过运行以下命令打开 GUI:
python demo_toolbox.py -d <datasets_root>
下面有一张我的照片。
正如你所看到的,我已经把我想让电脑在右边读的文本设置为:“你知道多伦多猛龙队是篮球冠军吗?篮球是一项伟大的运动。”
您可以单击每个部分下的“随机”按钮,随机选择语音输入,然后单击“加载”将语音输入加载到系统中。
数据集选择您将从中选择语音样本的数据集,说话者选择正在说话的人,话语选择由输入语音说出的短语。要听听输入的声音,只需点击“播放”。
一旦你按下“合成和语音编码”按钮,算法就会运行。一旦完成,你会听到输入扬声器大声朗读你的文本。
你甚至可以录下自己的声音作为输入,但点击“录制一个”按钮,这是一个非常有趣的游戏!
进一步阅读
如果你想了解更多关于算法如何工作的信息,你可以阅读谷歌的官方 NIPS 论文。在这里有一些更进一步的音频样本结果。我会高度克隆存储库,并尝试这个可怕的系统!
喜欢学习?
在 twitter 上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!也在 LinkedIn 上和我联系吧!
你不一定要被闪电击中才能赢得彩票
原文:https://towardsdatascience.com/you-dont-have-to-be-struck-by-lightning-to-win-the-lottery-d9cb25aa867a?source=collection_archive---------14-----------------------
Photo by Michael D on Unsplash
几周前,在一次演讲中,有人问了我以下问题:
“靠玩彩票谋生的可能性有多大?”
你觉得不是很高?
在 2005 年,一群麻省理工学院的学生聚在一起,成立了一个赌博集团。他们找到了他们想赌的游戏,计算了赔率,并以自己的方式赢得了数百万美元的利润。对我们的问题说“是”的有力证据,他们是怎么做到的?
我们来谈谈几率吧
每当强力球的巨大体积跨越 5 亿美元大关时,文章就像雨后的毒菌一样冒出来,大声宣布彩票中奖的几率,嘲笑每个争相购买彩票的人。为了好玩,它们还包括你更有可能获胜的事情的概率,比如被闪电击中,被鲨鱼咬,或者被自动售货机压死。它们是有趣的读物,当你拿出一小部分辛苦赚来的钱去买彩票时,你会暗自发笑,因为“嘿,你永远不知道。”
但是如果你知道呢?更重要的是,你怎么知道?这些几率从何而来?嗯,如果你知道一点概率的话,计算中彩票的几率实际上是非常容易的。让我们来一次概率之旅,好吗?
我们用来计算彩票赔率的公式非常简单。它叫做二项式系数,看起来像这样:
The ! stands for factorial, not “Shout N really loud” — Pat Colburn, my 7th grade math teacher
忽略左边的大括号,关注右边实际的数学部分。二项式系数允许从更大的一组数字中计算出所有可能的数字组合。 n 代表较大的一组数字, x 代表我们希望从较大的一组数字中选出的较小的一组数字的大小。例如,如果我们要玩强力球,你必须先从 69 个可用号码中选择 5 个,然后从 26 个可能的强力球号码中选择 1 个。计算正确选择前 5 个数字的概率的公式是这样开始的:
If you’re wondering what happened, the 64!s cancel out.
这告诉我们,你有 11,238,513 个 5 个数字的可能组合,其中只有一个组合是正确的,因此我们得到正确的 5 个数字的概率是 11,238,513 中的 1。对于剩下的最后一个强力球,赔率的计算更简单,26 个号码中你只需要 1 个,所以我们的赔率是 26 个中的 1 个。要计算得到所有 5 个数字加上正确的强力球的总几率,我们只需将这些几率相乘,如下所示:
Or, 0.00000034223% for those that prefer seeing percentages
因此,为了赢得巨额头奖,你需要从 292,201,338 个可能的数字组合中选择幸运的 1,然后你就可以开始生活了!看起来有点渺茫,不是吗?有好消息和坏消息!多买彩票可以增加胜算!(注:多打不会增加赔率,但是多买某个抽奖的票 会增加那些赔率 !)
Powerball odds and prizes
例如,如果您购买了 2 张门票,那么您的赔率将是 292,201,338 张中的 2 张,或 146,100,669 张中的 1 张。你已经成功地把你的机会减半了!如果你买了 10 张彩票,那么你的赔率就会变成 29,220,134 中的 1!坏消息是,即使有十张票,赔率仍然不会给你带来任何好处。在玩强力球时,增加你在现实世界中的胜算的唯一方法是购买更多的门票。如果你买了 100,000 张票,你将成功地把你的赔率降低到 2,922 中的 1。然而,坏消息是,你已经支付了 20 万美元的门票,并花了几个小时填写这些表格,以确保你不会重复数字,并意外破坏了辛苦赢得的机会!你可能会因为匹配 4 和 5 而赢得一些较小的奖励,但对于较低的匹配,这些奖励会急剧下降,如果你只匹配了其中的 4 个数字,你最终会净损失。
那么这一切有什么意义呢?我们已经计算了几率,看起来他们真的很差劲。这个博客的重点不就是用概率来玩彩票吗?如果我给你看的只是你可能会输的方式,那还有什么意义呢?每个彩票都是不同的,基于组织的目标和游戏的受欢迎程度。如果你找到了正确的游戏规则和赔率,你可以让这为你工作。
玩正确的游戏
2005 年,一群麻省理工学院的学生发现了他们的游戏。这个游戏的名字是马萨诸塞州现金彩票,其特色是一个被称为“滚下来”的规则。在滚下型游戏中,累积奖金通常以固定金额为上限。在马萨诸塞州,上限设定为 200 万美元。如果累积奖金增长到 200 万美元或以上,并且没有人赢,整个累积奖金将“滚下”到较低等级的比赛,通常以奖金的形式支付给每一个连续等级的比赛。因此,举例来说,如果在没有头奖得主的情况下触发了 200 万美元的滚动,彩票将分解这 200 万美元,并将其支付给在他们已经有权获得的奖金基础上匹配 3、4 或 5 个号码的玩家。这使得这个游戏非常有吸引力,因为在滚下来的过程中,你可能会增加 550%的回报,而仍然不必击败更长的累积奖金赔率。
让我们看看那些赔率,好吗?Winfall 游戏要求你从 46 个可能的数字中选择 6 个。由于我们方便的二项式系数公式告诉我们,你有【1】9,366,819 的几率赢得头奖。然而,对于 6 个中的 5 个,你的胜算更大,1370754 个中的 1 个。如果你得到了 6 分中的 4 分?163185 人中的 1 人。让我们不要忘记通过购买更多的票来增加我们成功机会的策略。如果我们买了 500 张票,我们会增加成功的机会,比如说, 中的118,734* 换 6 张票, 1 中的2742换 5 张票, 1 让我们来看看这可能会如何发展:*
Special thanks to Brian, Rob and Yish for helping me figure out the math.
如你所见,即使我们买了 5000 张彩票,我们中头奖的几率仍然很低,但是 2、3、4 和 5 张彩票看起来相当不错!在普通彩票中,这并不意味着什么,安慰奖通常很低,不值得额外购买彩票。然而,随着滚动下降,每张票承载着更多的潜在利润!从 2,000,000 美元的累积奖金按比例分配到较低的层级,将导致 13,000 到 11,000 倍于您的门票初始成本的支出,具体取决于您匹配了多少张彩票!知道了这一点,学生们相应地加倍努力,以确保他们能够承受的赔率。他们不是为了头奖而射击,而是为了更容易的低挂水果,仍然疯狂盈利的 3,4 和 5 匹配。这些提供了更好的赔率,学生们只在滚降期玩,这时他们可以最大化他们赌注的利润。
下面是马萨诸塞州监察长办公室对这个麻省理工学院团体的博彩策略进行的统计:
Total profit of $25,640 less expenses, for the week of Feb 8th.
看那个!中奖的 5 张彩票将返回 22,096 美元,其中 1 张不仅可以支付中奖彩票的费用,还可以支付超过 11,000 张其他未中奖彩票的费用。一个中奖的 4 选将覆盖超过 400 个失败者,一个中奖的 3 选将覆盖 13 个失败者。赢家的潜在交易量加在一起,将超过潜在输家,在下跌触发的那一周,他们的净收益估计为 25,640 美元!
使用这种策略,据估计麻省理工学院集团在 6 年的运营中赚了大约 800 万美元,产生了大约 15-20%的投资回报。然而,这并不全是娱乐和游戏。大量的时间和精力不仅花费在购买这些成千上万的彩票上,还花费在费力地手工填写算法生成的号码,然后手工检查每张彩票以找出中奖者。
最终,这种特殊的肥缺结束了,它必须结束。当时的彩票官员满足于对他们的游戏不同寻常的受欢迎程度睁一只眼闭一只眼,因为彩票受益于门票销售。无论支付多少,持有彩票的组织仍然通过设计赚钱。然而,一旦关于这些辛迪加的消息传出,大量的宣传就来了,随着这些宣传的增加,他们的大下注习惯降低了单个玩家获胜的几率(事实并非如此)的看法降低了其他玩家的受欢迎程度。普通玩家只是觉得他们的门票购买只对少数有组织的玩家有利,他们有时间和资源来提高他们的赔率。
此外,宣传还吸引了其他志同道合的辛迪加的注意,减少回报带来了潜在支出的减少,因为它们以更多的方式分享。到 2011 年,官员们开始通过减少大量购票的规则,最终在 2012 年完全关闭了这项运动。
那么我们学到了什么?
有了正确的赔率和正确的游戏,我们知道你可以在彩票中获利。一旦数学问题解决了,只要你愿意投入时间和工作,而且大部分工作只是关于人力,你靠买彩票谋生的几率实际上是相当可观的。
这背后实际上有更多的数学计算,计算每张票的期望值,找到正确的数字组合来进一步增加你的胜算。但是,通过在一场比正常支付更好的游戏中控制赔率为 2、3、4 或 5,麻省理工学院的学生能够确保他们赢的赔率超过 45 分之一,即使它不是头奖。这远远好于比方说,在一手扑克的开局中拿到一张皇家同花顺(649,739 中的 1),与超级模特约会(88 万中的 1),被闪电击中(100 万中的 1),或者被鲨鱼攻击(1150 万中的 1)。
来源:
** [## 如何根据数学赢得彩票并更快赢得
我知道。彩票中奖开启了全新生活的大门。一种你永远不用担心债务的生活…
lotterycodex.com](https://lotterycodex.com/how-to-win-the-lottery-mathematically/)
https://www . mass . gov/files/documents/2016/08/vv/lottery-cash-winfall-letter-July-2012 . pdf
http://www . Fla lottery . com/expt kt/PWR ball-odds . pdf # target text = power ball % 20 error % 20 by % 20 multiplying % 20 these,或%201%20chance%20in%20579.76。&target text = Step %201% 3A %20 计算% 20 数字,从% 2069% 20 唯一% 20 数字中提取% 20。
https://www.lotteryusa.com/powerball/
在 LinkedIn 上与我联系!
[## 汉密尔顿·张,CRPC·CSPO-熨斗学校-纽约,纽约| LinkedIn
具有财务规划背景的数据科学家和机器学习工程师。我有专家级的知识…
www.linkedin.com](https://www.linkedin.com/in/hamilton-chang-crpc®/)**
你不需要很多机器学习的专业知识就可以开始
原文:https://towardsdatascience.com/you-dont-need-a-lot-of-machine-learning-expertise-to-get-started-5f330ad4ee5a?source=collection_archive---------8-----------------------
机器学习的个人方法👩🏻🚀 👨🏻🚀 🚀
Photo by Tim Mossholder on Unsplash
不要害怕从机器学习(ML)开始,不需要几年的理论学习就能入门。但是你必须学习很多年才能始终保持在当前技术的顶端。
我知道你和每个人可能有不同的学习方式。这篇文章应该揭开你如何开始机器学习的过程,没有太多压倒性的技术术语。我建议你遵循我的文章,自己实现所有的事情。
当你开始学习机器学习时,会有大量的信息冲击着你。
Photo by Michael D Beckwith on Unsplash
人工智能、准确性、激活函数、反向传播、批量、偏差、聚类、混淆矩阵、卷积层、数据分析、决策树、深度学习、密集、维度、估计器、假阴性、假阳性、假阳性率、特征、特征列、特征交叉、特征工程、特征提取、特征集、特征规格、特征向量、前馈神经网络、少击学习、全 softmax、全连接层、生成式对抗网络(GAN)、泛化、泛化曲线、广义线性模型、生成模型、生成器、梯度、梯度裁剪、梯度下降、图形、地面实况、组 隐藏层、分层聚类、铰链损失、超参数、超平面、图像识别、不平衡数据集、推理、输入函数、输入层、可解释性、Keras、核支持向量机(KSVMs)、k 均值、k 中值、标签、带标签的示例、层、学习率、线性回归、逻辑回归、损失、损失曲线、机器学习、矩阵分解、均方误差(MSE)、小批量、MNIST、模型、模型函数、模型训练、多类分类、NaN 陷阱、自然语言理解、欠采样负类、神经网络、神经元、N 优化器、离群值、输出层、过拟合、过采样、熊猫、参数、参数更新、感知器、性能、困惑、管道、池化、正类、精度、预测、预测偏差、预制估计器、预训练模型、分位数存储、随机森林、等级、召回、推荐系统、递归神经网络、回归模型、强化学习、缩放、scikit-learn、半监督学习、sigmoid 函数、softmax、稀疏表示、平方损失、步长、步长、监督机器学习、张量、张量板、张量流、张量流服务、张量处理 示例,训练,迁移学习,三元模型,真阴性(TN),真阳性(TP),真阳性率(TPR),欠拟合,无标签示例,无监督机器学习,上加权,验证集,权重,宽度
构建您自己的文档
如果你不能马上知道所有的答案,那完全没问题🤯像编程一样,你总是可以使用文档来获得你所需要的信息。
技巧 1:建立自己的文档来解决这个机器学习术语列表,并在学习时添加您的个人笔记。
如果你对一个题目不理解,或者你觉得不够自信,就记笔记。
看看我的机器学习笔记,了解一下我在说什么。每当你纠结于一个术语或者你有一个问题的时候,添加一页。你的未来你会感谢你的。
My machine learning notebook notion.so
我知道对于你应该如何开始仍然没有明确的答案,但是我们将很快改变它。
学习 Python
你可能知道,如果你想做机器学习,开发专业知识是必须的。Python 总是一个好的选择,如果你想在云中训练你的模型,有一个大的社区,大量的工具和例子以及广泛的支持。
技巧 2:熟悉 Python,使用 TensorFlow 创建机器学习模型。
获取您自己的数据
到目前为止,你知道如何管理学习过程,以及你想使用哪种语言。下一步是什么?没错,数据我们需要数据,而且我们需要大量的数据。
在网上几乎所有的入门示例中,你都会用到一个常见的 MNIST 数据集,要么是时尚数据集(由 Zalando Research 的研究人员制作),要么是数字数据集。如果你在其中一个上训练一个模型,你可能会达到相当好的结果,但是你错过了很多练习。
相反,创建您自己的数据集,您将学习如何收集、存储和处理大型数据集。
Data example
技巧 3:学习如何处理自己的数据是一项重要的技能,在现实世界的应用程序中是必需的。从一个简单的例子开始,收集带有相应标签的文本,并将其保存在 csv 中。这可能是来自 StackOverflow 的带有相应标签的文本。基于给定的文本,你想要预测编程语言。有这么多可能性,选一个吧。
学会理解你的数据
从数据集中提取洞察有助于理解数据。这是在 Jupyter 笔记本上熟悉熊猫和剧情的绝佳时机。
问问你自己你想知道的关于数据集的任何事情。
- 我的数据集中有什么样的数据?
- 有多少节课?
- 数据是如何平衡的?
- 以及更多的问题,要有创意
环境
一切从你的机器学习环境开始。这可以在您的本地机器上,也可以在云中。你的机器学习环境是那种你安装所有你需要的工具的地方。
其中一个本地环境是用于数据科学和机器学习的 Anaconda。或者,如果您喜欢免费使用且无需设置的基于云的环境,请使用联合实验室。
使用现有技术
我希望你在开始在 TensorFlow 中构建定制的机器学习模型之前使用 AutoML。你可能会问“为什么是 AutoML 或者什么是 AutoML”,这是很好的问题。
使用 AutoML,您可以在几个小时内归档好的机器学习结果,而不是几周或几个月。AutoML 去掉了一堆需要时间和知识的步骤。
例如数据分割(训练和测试)、编码、嵌入、评估不同架构、超参数调整等等,所有这些都是自动完成的。有不同类型的 AutoML 产品,为了简单起见,我们保持简单,继续使用 Google AutoML 。
这听起来很简单,上传你的训练数据,开始训练,抓住一个☕,直到训练结束。
如果完成了,您可以评估结果,这是一个很好的学习不同评估指标的机会,如精确度和召回率,或者如何解释混淆矩阵。更好的是,你已经有了一个生产就绪的机器学习模型。谷歌为你提供了一个直接的端点来进行预测。
谷歌提供不同类型的 AutoML 产品 AutoML 自然语言、AutoML 视觉、AutoML 翻译、AutoML 表格更多即将推出
ヽ(•‿•)ノ.
[## 云自动|自动|谷歌云
谷歌云提供安全、开放、智能和变革性的工具,帮助企业实现现代化,以适应当今的…
cloud.google.com](https://cloud.google.com/automl/docs/)
有一件事你也要考虑。真的需要训练一个机器学习模型吗?或者,您可以使用现有的 API 和预先训练的模型来解决您的问题吗?有很多现成的API可以使用。
技巧 4:如果你想解决一个问题,AutoML 或预先训练的 API 应该是首选产品。
预处理
如果 Google AutoML 或预先训练的 API 不符合您的需求,您仍然可以使用 TensorFlow 或 Keras 中的自定义机器学习模型。
不幸的是,你不能简单地使用你收集的数据,并开始训练一个机器学习模型。在数据准备好使用之前,需要预处理步骤。预处理取决于您使用的数据。对于文本,您需要与图像不同的预处理。
- 清理数据应该是第一个预处理步骤,回到我们的 StackOverflow.csv 示例,也许有些行没有文本?没有标签、不需要的特殊字符或其他类型的文本。清理这些数据可能会提高模型的性能。
- 打乱你的数据有各种各样的原因,通常我们的数据是像 StackOverflow.csv 一样排序的,它可能是基于编程语言排序的。我们希望进行洗牌,以确保我们的训练和测试数据集代表数据的总体分布。还有更多原因,正如第一条建议中提到的,我相信随着时间的推移,你会了解所有的原因。
- 将数据分成两组,训练和测试。根据经验,80%是训练数据,20%是测试数据。
- 嵌入和编码是另一个重要的部分,如果你谷歌一下,听起来可能会很混乱。为了让您对嵌入和编码有一个简单的理解,可以把它想象成一种以或多或少智能的方式将文本转换成数字的方法。
技巧五:数据预处理是必要的步骤,本身就是一个完整的章节。在继续之前熟悉数据预处理,并使用 TensorFlow 训练您的自定义模型。你猜怎么着..你可以利用你在挖掘数据时获得的洞察力。
构建您的张量流模型
我们已经到了可以用 TensorFlow 训练自定义模型的地步。这是迄今为止最复杂和耗时的部分,我说的是几天到一个月的范围。
第一步是消费数据,这取决于你使用的框架。TensorFlow、TensorFlow Hub 模块或 Keras。不要太担心路上会学到的不同类型。
在这之后,你必须选择一种算法,这是了解不同类型的算法的时候,如何以及何时使用它们,它们有什么不同。
下一步是训练我们的模型,虽然对小数据集和简单模型的训练可能在您的笔记本电脑上表现良好,但其他人需要大量的处理能力。为此,您可以利用在云中训练您的模型。
技巧六:使用 TensorFlow 的前几步是最难的,不要放弃,继续。构建自己的项目可以让你从中获得最大收益。当您构建项目时,请阅读 TensorFlow 文档并熟悉该框架。
评估你的机器学习模型
还缺少最后也是最重要的一步。模型评估,您的模型解决问题的效果如何?该模型是否也适用于以前未见过的数据,也称为泛化?理解你的结果是很重要的,仅仅有分类的准确性是不足以评估一个模型的。
技巧 7:熟悉不同的评估指标,了解如何以及何时使用它们。使用不同的指标,如混淆矩阵、F1 分数等等。
将您的模型投入生产
根据您想要解决的问题,不需要达到 100%的准确性。想想你的模型如何帮助解决一个问题,或者节省时间、金钱,或者自动化一个过程。如果你能以 80%的准确率解决一个高度消耗时间的过程,你可能已经节省了很多钱。
您的模型训练已经完成,结果看起来足以解决问题,现在该怎么办?现在是将您的模型投入生产的时候了。给人们使用它的机会。你可以像 TensorFlow ModelServer 或者 Google AI 平台一样以不同的方式托管模型。
最后一个技巧:顺理成章地为你的所有项目创建一个 GitHub 库。这是建立自己投资组合的最佳方式。更重要的是,您将在其他项目中重用大量代码。
如果你在 ML 的第一年有这种感觉。要意识到在某一点上你有足够的知识来自信地构建 ML 产品。
下一步是什么?
这还不是全部,我将与你分享例子和进一步的帖子,给你一些实践经验。如果你不想错过,就在 Twitter 上关注我吧。
- 收集数据集
- 数据集预处理
- 谷歌汽车
- Keras 命名实体抽取用 Google AI 平台训练和部署
- 库贝弗洛
感谢阅读。
非常感谢您的反馈和问题,您可以在 Twitter 上找到我@ HeyerSascha。
关于作者
Sascha HeyerIo Annotator 的创始人一个用于文本和图像的 AI 注释平台
,它提供了几种图像和文本注释工具。
成为数据科学家不需要硕士学位
原文:https://towardsdatascience.com/you-dont-need-a-masters-to-be-a-data-scientist-9ab690c7bddd?source=collection_archive---------8-----------------------
我是如何做到的
Photo by Honey Yanibel Minaya Cruz on Unsplash
下面是我的(怪异)故事,关于我如何在没有攻读硕士学位的情况下成为一名数据科学家。
我没有为下面列出的任何资源支付报酬。我只是分享我所做的。
关于机器学习、深度学习和人工智能的实践视频教程,请查看我的 YouTube 频道。
大学
我在麦吉尔大学注册了化学工程。它是加拿大顶尖大学之一,在世界范围内享有相当好的声誉。
我选择化学工程是因为我对清洁能源技术充满热情(现在仍然如此)。我致力于开发一种更清洁、更可持续的能源生产方式。
不幸的是,这个项目没有达到我的期望。很少有课程涉及这个话题,职业前景大多是大石油公司(或者至少,那是我当时看到的)。
简单地说,我一点也不喜欢我的学位。
我觉得我不会去任何地方追求化学工程,我试图找到一个新的领域。
我的一个朋友是一名网络开发人员,他甚至开办了自己的网络开发公司。他看起来很成功,他对它的热情激励我去看看。
在大学期间学习 web 开发
所以我在完成化学工程学士学位的同时,开始学习网页开发。
我首先开始阅读 MDN 的 web 开发指南。我立刻喜欢上了它。非常枯燥,但是我在阅读文档和自己尝试的过程中学到了很多东西。
然而,我想提高我的技能,所以我参加了柯尔特·斯蒂尔的【Web 开发人员训练营】 。我读过许多关于这门课程的精彩评论,我认为花几美元试试是值得的。
原来是一门很神奇的课程!我非常喜欢,学到了很多东西。我利用这门课程建立了一个简单的小项目组合,并在大学的招聘会上向招聘人员展示了它们。
这就是我如何找到我的第一份网页开发工作的。
我欣喜若狂!我设法自己涉足了技术领域。所有的面试官都问我为什么要从化学工程转到编程,我必须向他们证明我拥有所需的技能,而计算机科学或软件工程专业的学生只需出示简历。
2017 年 12 月,我完成了学士学位,我有了一份有保证的工作,将于 2018 年 7 月开始工作。
在大学毕业和我的新工作之间
2018 年 1 月到 2018 年 7 月,我是自由的!
没有学校,没有工作,只有 6 个月的放松,等待开始我作为一名网站开发员的新工作。
但是,我根本做不到什么都不做。
这时候我才知道对数据科学家的狂热。无论在哪里,我都读到这是最性感的工作,诸如此类。
我想我得去看看。
我在 Dataquest 上开始学习数据科学。他们的方法更适合我的学习风格,因为我有很多空闲时间,我知道我可以很快完成课程。
事实上,我在两个月内填满了整个数据科学家和数据工程师的路径。
在我看来,这种经历是惊人的。我学到了很多东西,并且您可以完成许多项目,这将构建一个非常坚实的数据科学组合。然而,对我来说主要的缺点是我不明白我申请的是什么。它成功了,但是我缺乏算法背后的理论。
因此,我选了吴恩达的机器学习课程。同样,我听说过这个课程,我认为它可能是 Coursera 上评分最高的课程之一。
我非常喜欢它,并且学到了更多机器学习背后的数学知识。然而,我不喜欢这门课是用 Matlab/Octave 教授的,所以很难翻译我用 Python 学的东西。我学到了很多关于机器学习的基础知识,但我仍然觉得自己缺乏一些知识。
边工作边学习数据科学
2018 年 7 月,开始新工作。我非常兴奋,但我在学习更多的 web 开发和数据科学之间徘徊。
于是我开始利用业余时间(下班后)做数据科学。
我决定看《统计学习导论》这本书。一个朋友推荐了这本书,说是最好的数据科学入门。我试了一下,又惊又喜!阅读这本书实际上是令人愉快的。
我在学习中非常认真。我做笔记,通过构建非常小的项目,强迫自己应用 Python 中的每个算法。这真的帮助我掌握了大多数传统的机器学习算法,最重要的是,我对自己的技能有了信心。
然后,奇怪的事情发生了
我在工作的时候浏览脸书(是的,在工作中,我承认),我看到了加拿大最大的银行之一的数据科学家职位的广告。广告简单地说:
我们在找数据科学家!参加测验!
我以为我没什么可失去的。我参加了测验,得了 11/13。连我都对我的分数印象深刻!
一周后,我得到一个电话面试。一个小时后(告诉面试官我是如何从化学工程转到编程的),招聘人员决定进行最后一步。
最后一步是完成一个数据科学项目,并将其提交给高级数据科学家。
我决定重做一个我在学习 Dataquest 时完成的项目,并提交了它。
一周后,我得到了一份工作,我接受了。
2019 年 1 月,我开始了数据科学家的新工作。
自 2019 年 1 月以来
从那以后,学习和工作机会成倍增加。我可以与非常聪明和积极的人合作,公司鼓励我们学习、探索、实验和创新。
我觉得自己很幸运能在这种类型的组织中工作,我也很自豪自己学会了数据科学并获得了相关技能,从而找到了一份工作。
现在,深度学习是一个自然的下一步,我现在已经在努力了。
你也能做到吗?
有了正确的态度和心态,是的。我坚信任何人都能做到。我远非例外。
我这样做是因为它符合我的个性和我的学习风格。我可以:
- 按照我自己的进度学习
- 学习足够让我理解的理论
- 完成许多项目以获得实践经验
然而,也有许多缺点:
- 我不知道我是否在学习正确的东西
- 我不知道数据科学课程的结构
- 我必须对自己的技能充满信心,并完成许多项目来证明我可以成为一名数据科学家
我所做的很难。你必须对一个主题充满热情和自律,才能完成我所做的事情。
然而,我发现这种方式绝对是最有益的。
那么,我需要硕士学位才能成为数据科学家吗?
不。我认为公司不再看重文凭,而是寻找有技能的人。
最后,真正重要的是你的技能。
无论你是否决定攻读硕士学位,都要意识到这只是达到相同结果的不同方式。在任何情况下,确保你获得以下技能:
- 精通 Python 和 SQL
- 学习一些火花
- 学习软件开发最佳实践
- 了解版本控制
- 一些集装箱化是一个很好的奖励
- 做一个优秀的演示者
如果你是一名有抱负的数据科学家,我祝你好运!我绝对热爱这个领域,我认为我在网上上的课确实有助于热爱和理解这个领域。
最后,关键是对一个主题充满激情,并愿意与尽可能多的人分享你的激情。那么,机会就来了。
祝你大获成功!
你可能就要死了,而你自己都不知道。
原文:https://towardsdatascience.com/you-might-be-dying-and-you-wouldnt-even-know-it-c3d775f4a92c?source=collection_archive---------39-----------------------
—智能脑肿瘤检测和诊断
我认为很明显,医学成像完全改变了医疗保健领域的面貌,为早期检测、诊断和治疗的新形式开辟了一个领域。这有助于预防和优化病人护理。
这项技术是我们非常依赖的。它让我们能够在考虑患者护理的情况下做出明智的决定。但是我们能让它变得更好吗?🤔
围绕脑肿瘤诊断的当前医疗实践仅仅依赖于医生的经验和知识,以及他们对 MRI(磁共振成像)的解释。
然而,我们经常看到被误诊为脑瘤的案例,导致不正确的治疗,或者更糟糕的是,根本没有治疗。
这可能是由临床医生的失误造成的,但此外,我们可以通过改进我们非常依赖的系统来防止这些误诊病例!
生活在一个不断发展的世界,为什么我们仍然依赖过时的医学成像方法作为挽救病人生命的重要方法?
疯了吧!
以此为例。
随着新的发展和广泛的研究,我们开始了解我们误诊儿童某些癌症脑瘤是多么普遍。一些患有这些特殊罕见肿瘤的儿童得到了错误的诊断,在某些情况下,得到了错误的治疗。
Based on these microscopic images, shown here side by side, both of these pediatric brain cancers would have been diagnosed as CNS-PNET. But molecular tests revealed that the one on the left is glioblastoma, and the one on the right is a supratentorial embryonic tumour. The two cancers have vastly different prognoses and treatment strategies.
有兴趣了解这个故事的更多内容:https://www . Fred hutch . org/en/news/center-news/2018/10/pediatric-brain-cancer-missionary . html
现代医学的目标是减轻所有患者的疼痛和痛苦,努力促进疾病预防。
医疗保健是帮助每个人实现四大目标:预防过早死亡和残疾、维持和提高生活质量、个人成长和发展以及善终。
在诊断过程中,需要有某种改变来帮助医生,允许更快更准确地做出决定,并适当地突出受影响的大脑区域。
哦,等等!💡
— We can be friends if you like Aladdin 🙈
医学成像是医疗保健领域的一项重大进步,改变了我们看待人体和治疗患者的方式。但是,即使是我们最可靠的系统,如核磁共振扫描,也会遗漏一些重要的细节,从而完全改变患者护理的方向。
MRI 是广泛用于诊断各种组织异常的医疗技术,包括脑肿瘤的检测和诊断。计算机化医学图像分割的积极发展在科学研究中发挥了至关重要的作用,帮助医生理解和可视化异常,以采取必要的步骤,通过快速决策进行优化治疗。
常规的 MRI 扫描系统是医疗技术领域的巨大进步和发展,每年拯救数百万人的生命。然而,由于检测模型不完善,许多人仍然被误诊,甚至失去了生命。
问题:那么,我们该如何解决这个问题呢?
答:晚期脑肿瘤从 MRI 图像中分割
My first reaction when learning about MRI Segmentation
没事,放松。别担心,我抓住你了。
我向你保证,脑瘤分割并没有看起来那么复杂。但是在我们开始思考它是什么和它是如何工作的之前,让我们后退一步,从整体上理解脑瘤。
保持简单;
肿瘤基本上是身体任何部位不受控制的细胞生长,而脑肿瘤是这些异常细胞在大脑中的聚集或聚集。
肿瘤可以通过生长和挤压大脑的关键区域造成局部损伤。如果它们阻塞了大脑周围的液体流动,也会引起问题,这会导致颅骨内的压力增加。如果没有检测和治疗,某些类型的肿瘤可以通过脊髓液扩散到大脑或脊柱的远处。
脑瘤分为或 继发性 。
原发性脑瘤起源于你的大脑。而继发性脑瘤(转移)是生长在大脑内的肿瘤,它是由恶性肿瘤 ( 癌症)在身体其他地方的扩散引起的。
- 恶性肿瘤更危险,因为它可以快速生长,并可能生长或扩散到大脑的其他部分或脊髓。恶性肿瘤有时也被称为脑癌。转移性脑瘤总是恶性的,因为它们已经从身体的其他癌症区域扩散到大脑。
- 良性原发性脑瘤不是癌症。良性肿瘤可以通过生长和压迫大脑的其他部分造成损害,但它们不会扩散。在某些情况下,良性肿瘤会转变成恶性肿瘤。
关键要点 →肿瘤是坏的(用你的🧠买吧)**
只是为了显示这些脑瘤的严重性,它们可以影响我们大脑的每一个部分。喜欢每一个零件。听神经瘤中心、胶质瘤中心、脑膜瘤中心、转移性脑肿瘤中心、神经纤维瘤中心、垂体瘤中心等。只是源于大脑不同区域的几种类型的肿瘤,具有不同的症状和有害的,甚至致命的影响。
**—提供了关于这些领域的更多信息,请随时查看并了解更多信息😉
既然你已经对什么是脑瘤有了一个高层次的理解,让我们开始理解分割过程以及它如何完全改变当前的检测和诊断方法。
把我们的大脑一点点拆开̶s̶e̶g̶m̶e̶n̶t̶a̶t̶i̶o̶n̶一点点
在高级中,脑肿瘤分割包括从健康脑组织中提取肿瘤区域。图像分割的目标是将图像分成一组语义上有意义的、同质的、不重叠的区域,这些区域具有相似的属性,如亮度、深度、颜色或纹理。
Looking something like that👆
然而,精确和有效的肿瘤分割仍然是一项具有挑战性的任务,因为肿瘤可能具有不同的大小和位置。它们的结构通常是非刚性的,形状复杂,具有各种各样的外观特性。
分割结果是标识每个同质区域的标签图像或描述区域边界的一组轮廓。这就是我们如何检测分割成像组中的不规则性以识别肿瘤。
Figure 1 — CNN Process Scheme
但是让我们把事情搞清楚。MRI 分割在实践中并不新鲜,它已经存在很多年了,但是我们需要了解与当前分析和诊断方法相关的挑战,以使它 比现在更好。
对于必须手动提取重要信息的临床医生来说,分析这些庞大而复杂的 MRI 数据集已经成为一项繁琐而复杂的任务。这种手动分析通常很耗时,并且由于各种操作者之间或操作者内部的可变性研究而容易出错。
脑 MRI 数据分析中的这些困难需要发明计算机化的方法来改进疾病诊断和测试。如今,用于 MR 图像分割、配准和可视化的计算机化方法已经被广泛用于辅助医生进行定性诊断。
深度学习已进入聊天
深度学习 — WHA!?怎么!?
My Brain when trying to understand Deep Learning in Tumour Segmentation
那么深度学习究竟如何将 应用 到大脑分割和 有什么好处 ?
“深度学习和传统机器学习最重要的区别就是它在数据规模增大时的表现。”
当接受利用人工智能进行大脑分割的挑战时,数据需要通过 MRI 扫描充分准确地预测脑肿瘤,这将需要吨的数据。
处理这种数据的能力绝对是一个挑战,不仅需要获得患者扫描的能力,还需要计算能力,才能真正成功地进行预测和诊断。
与在医学成像上训练机器学习模型相关联的一些主要挑战是获取每个数据集、获得患者批准以及由专家对图像进行后期分析的高成本。
为了用有限的数据构建医疗机器学习系统,研究人员应用了广泛的数据增强,包括拉伸、灰度缩放、应用弹性变形等,生成了大量的合成训练数据。
在遵循这些原则的过程中,我们看到了从患者磁共振图像中识别异常组织的巨大优势和进步:
基于准确性、灵敏度、特异性和 dice 相似性指数系数,对所提出的技术的实验结果进行了评估,并验证了对磁共振脑图像的性能和质量分析。实验结果达到了 96.51%的准确度、94.2%的特异性和 97.72%的灵敏度,证明了所提出的技术用于从脑 MR 图像中识别正常和异常组织的有效性。
—利用深度学习进行肿瘤检测和诊断的实验结果
*【https://www.ncbi.nlm.nih.gov/pubmed/28367213 *
关键问题是在非常早期阶段检测出脑肿瘤,以便采取适当的治疗措施。基于这些信息,可以决定最合适的治疗、放射、手术或化疗。因此,很明显,如果在肿瘤的早期阶段准确地检测到肿瘤,则肿瘤感染患者的存活机会可以显著增加。
Hmmm。节省时间和生命的更好的医学成像系统?!
DOPE!
想跟我一起踏上旅程吗!
领英:https://www.linkedin.com/in/alim-bhatia-081a48155/
中:https://medium.com/@Alim.bhatia
简讯:https://mailchi.mp/291f9d2b6bfb/alim-monthly-newsletter
你必须知道约束最小二乘
原文:https://towardsdatascience.com/you-must-know-constrained-least-squares-850aeedf2ef3?source=collection_archive---------8-----------------------
Photo by Inactive. on Unsplash
增加多目标最小二乘以引入困难的问题约束。
我们之前讨论过最小二乘法,同样在多目标函数的情况下,将问题简化为经典公式是非常简单的。现在,有些问题的解是有约束的,并不是简单地将梯度设为 0 就能直接解决的。在本文中,我们讨论约束最小二乘。
新的优化问题采取以下形式:
与之前我们看到的这里的和这里的相比有什么不同?这条讨厌的 s.t .线。S.t .是 subject to 的简称,我们的优化 subject to 是什么?它受制于一组线性等式约束,因为现在我们知道这个公式是一组线性方程的简称。
现在,我们还必须引入一些术语来更详细地讨论这个问题。这很简单,如果一个解(即向量 w )满足约束集,则称之为可行。由此可见,满足约束集的一组解称为可行集。反之,可行集包含最优点,即问题的解。
如果你看了我之前关于多目标最小二乘的文章。众所周知,多目标最小二乘优化问题是用一个向量λ来表达的,该向量对各个目标进行加权。有趣的是,约束最小二乘优化问题可以看作是多目标最小二乘问题的一个特例。让我明明白白地说:
约束最小二乘是多目标最小二乘的特例。
这又是什么特例呢?在约束最小二乘的情况下,我们有两个目标:约束和主要目标。在某种意义上,我们可以将其公式化为多目标最小二乘问题:
但是,等等,这看起来与多目标最小二乘法非常相似,只是符号略有不同…
看起来很相似,对吧?那么,问题是什么……问题是,在约束最小二乘法的情况下,我们有硬约束,我们将λ 1 设为无穷大。逻辑上,最小化该目标,使得第二λ远大于第一λ:
产生具有一组硬约束的约束最小二乘问题的解。代码如下:
结果显然并不令人惊讶,与您预期的差不多—估计并不完全符合目标,因为目标函数的最优值并不包含在可行集中。请注意,该图是 3D 的,因为 X 中的每个点都是 2D,我们回归的输出是 1D。
当然,根据问题的不同,可能会出现包含最优解的情况。有了软约束,问题变得更容易管理,对此更深入的分析将在以后的文章中讨论。
干得好,如果你已经阅读了这篇文章和我以前关于最小二乘法的文章:
- 你必须知道最小二乘法
- 你一定知道多目标最小二乘法
你对最小二乘法很了解。这并不是说我已经涵盖了关于最小二乘的所有内容,仍然有一些特定的情况需要对目标函数进行调整以适应问题。比如在我们使用核的情况下,或者在我们预测时间序列的情况下。但是,大多数时候我们可以将新问题简化为基本公式,从而允许我们使用简单直接的线性代数来求解一组线性方程以获得解。
在这一点上,继续学习,感谢阅读!
你一定知道最小二乘法
原文:https://towardsdatascience.com/you-must-know-least-squares-a900f63e0bf0?source=collection_archive---------8-----------------------
让我们远离神经网络炒作,稍微回到基础,回到事情实际上有意义的时候,它们为什么工作。
机器学习是一个非常热门的话题,每个人都想在产品中使用它,或者降低企业运营成本。机器学习似乎是商业世界祈祷的答案。然而,人们跳入机器学习的方式可能非常令人惊讶。是的,我知道,神经网络是“东西”,但在我看来,跳入神经网络是被误导的。
所有的机器学习都不围绕神经网络
是的,他们可以做很酷的事情,用很多,真的很多计算。但曾经有一段时间,机器学习解决方案优雅、高效、快捷。在本文中,我们将深入基础知识,讨论最小二乘回归。我们为什么要谈这个?因为,信不信由你,这种简单的方法还用在统计分析中,那里有大量的数据要分析。在 Kaggle 竞赛中,它经常被用来观察数据的趋势或变化等。最小二乘法是一个东西,虽然它非常简单,但没有足够多的人知道它背后的数学。所以,让我们开始吧。
如果你上过简单的线性代数课,你就知道什么是矩阵,你很可能见过这种方程:
如果要得到这个方程的解,需要矩阵 A 的逆(我们只是要考虑 A 是可逆的情况,方程不是超定的)。所以解决方案看起来就像这样简单:
现在,我们知道如何得到这个简单方程的解,或者更好地说是方程组,因为我们可以把矩阵 A 的每一行单独看成一个线性方程。矩阵公式是描述一组线性方程的简单紧凑的形式。
但这并不是我们最终真正想要做的。我们想学东西,我们想做机器学习!所以这里面的学问在哪里……就是一堆线性方程,好无聊。那么,我们在机器学习中具体做什么呢?我们有一个我们想要拟合的函数,我们称之为函数 f ,它给我们一些数据 x 的值 y 。简单写下:
就这么简单。所以我们要学习 f ,在我们的例子中我们假设 f 是一个线性函数(不去考虑推广之类的问题,只是为了尽量简单)。我承认符号在这一点上有点乏味。之前使用 x 作为必须满足一组方程式的点。在这种情况下,我们希望找到描述数据的线性方程的系数。我们可以把它写成矩阵形式:
考虑到 X 中的每一行都是一个数据点,然后我们基本上取该数据点与 w. 的点积,这个表达式就很自然了。现在,我们需要定义我们的学习算法,这实际上只需要一步,封闭形式的解决方案。为此,我们需要一点微积分。首先,我们需要看看机器学习中的以下永不老化的目标函数,均方误差:
||括号在这里是因为当我们谈论向量时,我们谈论的是它们的范数,在这种情况下,它是每个数据点上误差总和的简写。如果你想知道规范和点积在 ML 中有多重要,看看这篇文章。上面的误差项有一些很好的性质,其中之一是它是二次的。在最优化中,我们喜欢二次函数。它们相对容易优化,因为它们是凸的,它们有一个全局最小值。我们如何找到这个问题的解决方案,也就是说,我们如何最小化这个函数?微积分中相当标准的做法是,我们求导并寻找等于 0 的解。
也就是说梯度等于 0:
采用链式法则的 MSE 的梯度等于:
现在,通过一点矩阵乘法并将梯度设置为 0,我们可以写出很好的封闭形式的解:
如果你怀疑它是那么简单…是的,它是,你实际上是在用这一小块数学做机器学习,或者换句话说,优化。
注意,这个解是针对 y 是一维的情况的解,扩展到多维的情况是琐碎的,可以留做练习!这一小块数学可以用几行代码实现,实际上,最小二乘部分只需要 2 行代码!
这导致了下图,注意它如何找到数据的最佳拟合线(最小化平方误差)。
我们可以看到,该平面穿过数据簇的中间,在那里它使平方误差最小化。
显然,我们不能用一条直线或一个平面来拟合所有的数据,但是通过强大的特征提取器,我们可以将问题简化为一个更简单的问题。客观地说,这就是神经网络有效地做的事情,唯一的区别是我们在最后一层使用一些非线性作为激活函数。如果我们去除这一点,我们可以将神经网络的最后一层视为最小二乘问题,即在数据上拟合一个平面(来自先前层的激活)。
如果你对其他一些机器学习文章感兴趣的话,这是对最小二乘法的一个简短而轻松的介绍:
- 因果与统计推断
- 机器学习中的内核秘密
- 中心极限定理及其推论
下次见!
你必须知道多目标最小二乘法
原文:https://towardsdatascience.com/you-must-know-multi-objective-least-squares-ff4a5bba0c8a?source=collection_archive---------18-----------------------
经典的最小二乘法不错,但是在很多方面有局限性。这里我们谈谈如何以优雅的方式使最小二乘法适应多目标优化问题。
在之前的文章中,我谈到了最小二乘法,它的简单令人惊叹,并且有着广泛的应用。然而,同样,应用程序仅限于某种类型的优化问题。然而,你不应该低估线性代数的能力和普遍性。
在很多问题中,我们不希望只优化一个目标函数,我们希望优化多个目标函数。这就是多目标最小二乘法的用武之地。
回想一下在拟合数据的情况下,最小二乘法的等式是什么样的:
最小化的目标函数是:
因此,想象一个由多个 J 组成的目标,每个 J 都是它们自己的最小二乘问题,如下所示:
其中,我们将每个 J_k 定义为:
或者我们可以用简单的线性代数友好的符号来写,作为点积:
引入向量λ是解决多目标问题的典型方法,它定义了每个目标对优化问题的贡献(逻辑上)。所以,现在我们问一个问题,这如何适应最小二乘框架?嗯,要做的一件事是将λ移入 J,得到一个结果:
通过观察规范中的项,你是否注意到了与经典最小二乘法相似的模式?嗯,你应该这样做,因为通过替换下面这些部分,我们将得到一个经典的最小二乘公式(我们知道如何求解):
因为线性代数是一个美丽的东西,现在我们可以将我们的多目标最小二乘写成如下,一切都开箱即用:
基于之前的文章,我们已经知道如何解决这个问题!尽管如此,让我们把代码写下来,这样我们在完整的表述中就具体了:
您应该从上面的代码中得到的结果应该如下所示(模随机生成器在不同版本的 numpy 中工作方式不同):
注意蓝线(预测)是如何最符合红色数据点的?这是因为我们通过λ向量给了红色数据点最高的成本。这很好,我们现在可以在优化问题中平衡多个目标了。但是,最终,现实世界充满了一些硬约束,甚至告诉我们可以考虑哪些解决方案。幸运的是,有一种方法可以解决这个问题,完全基于古老的线性代数!未完待续…
您现在需要从云计算转向边缘计算!
原文:https://towardsdatascience.com/you-need-to-move-from-cloud-computing-to-edge-computing-now-e8759eb9690f?source=collection_archive---------14-----------------------
到 2025 年,边缘计算市场规模预计将达到 290 亿美元。
Cloud (Image by rawpixel from Pixabay)
在这十年中,出现了从内部计算到云计算的转型运动,使系统集中化和可访问,并增加了安全性和协作性。今天,在新的十年即将到来之际,我们见证了从云计算到边缘计算的转变。
什么是边缘计算?
边缘计算是指发生在互联网“外部边缘”的计算,与云计算相反,云计算的计算发生在一个中心位置。边缘计算通常在靠近数据源的地方执行,例如在连接的摄像机上或附近。
自动驾驶汽车是边缘计算的一个完美例子。为了让汽车安全地行驶在任何道路上,它必须实时观察道路,如果有人走在汽车前面,它就必须停下来。在这种情况下,使用边缘计算在边缘处理视觉信息并做出决定。
这个例子强调了边缘计算的一个关键动机——速度。集中式云系统提供了访问和协作的便利,但是服务器的集中化意味着它们远离数据源。数据传输会引入由网络延迟引起的延迟。对于自动驾驶汽车来说,从通过传感器收集数据到做出决定,然后根据决定采取行动,时间尽可能最短至关重要。
到 2025 年,边缘计算市场规模预计将达到 290 亿美元。—大观研究
VC Andreesen Horowitz presenting “Return of the Edge and the End of Cloud Computing”
所有这些实时应用都需要边缘计算。根据 Grand View Research,Inc .的市场研究未来(MRFR)研究显示,到 2024 年,边缘计算的市场规模预计将达到 224 亿美元,到 2025 年将达到 290 亿美元。像 Andreessen Horowitz 这样的顶级风投公司正在进行大规模投资。边缘计算已经被用于各种应用,从无人驾驶汽车和无人机到家庭自动化系统和零售,以这种流行速度,我们只能想象它的未来应用。
为什么要从云迁移到边缘?
速度
在云计算中,边缘设备收集数据并将其发送到云端进行进一步的处理和分析。边缘设备的作用有限,它们向云发送原始信息,并从云接收经过处理的信息。所有真正的工作都在云中完成。
这种类型的基础设施可能适合于用户能够承受等待 2 或 3 秒来获得响应的应用。然而,这不适合需要更快响应的应用程序,尤其是那些寻求实时操作的应用程序,如自动驾驶汽车。但是,即使在一个更普通的例子中,比如基本的网站交互,开发人员也会部署 JavaScript 来检测用户的动作,并在用户的浏览器中做出响应。在响应时间对应用程序的成功至关重要的情况下,如果可能的话,在接近数据源的地方解释输入数据是更好的选择。当输入和输出发生在同一位置时,例如在物联网设备中,边缘计算消除了网络延迟,实时成为可能。
带宽
边缘计算意味着更少的数据传输,因为大多数繁重的工作都由边缘设备完成。而不是将原始数据发送到云端,大部分处理都在边缘完成,只有结果发送到云端,因此需要的数据传输带宽更少。
让我们以一个智能停车系统为例,它使用云计算基础设施来找出有多少停车位可用。比如说,每隔几秒钟就有 1080p 的实时视频或静态图像被发送到云端。想象一下这种解决方案每小时所需的网络带宽和数据传输成本,通过网络持续传输大量原始数据:
Could Computing vs Edge Computing in terms of network bandwidth consumption
相比之下,如果智能停车系统使用边缘计算,它只需每隔几秒钟向云发送一个整数,即有多少停车位可用,从而减少带宽,并降低数据传输成本。
规模
物联网意味着更多的系统,更多的系统意味着集中式服务器上更多的带宽和更多的负载。在云计算架构中,增加一个物联网设备会导致带宽需求和云计算能力的增加。
让我们以上面的智能停车系统为例,将实时 1080p 视频传输到云端。客户希望在另外 10 个停车场安装该系统。为了实现这一点,他们需要增加网络带宽,并且需要大约 10 倍的计算能力和云存储空间,因为中央服务器上的负载会随着来自 10 个额外摄像机的传入数据而增加。这增加了网络流量,上行链路带宽成为瓶颈。因此,随着每增加一台设备,网络流量、带宽和云资源的使用都会增加,因此扩展成本很高。
相比之下,在边缘计算中,增加一个物联网意味着设备的单位成本增加。不需要增加每台设备的带宽和云计算能力,因为大多数处理都是在边缘完成的。借助边缘计算架构,在停车场系统中添加 10 个额外的物联网设备似乎不那么令人生畏,因为不需要增加云计算能力或网络带宽。因此,边缘计算架构的可扩展性更强。
从内部计算到云计算,再到现在的边缘计算,随着我们对计算系统提出更高性能和更多创新的要求,软件架构也在不断发展。随着我们当前基于云的架构的增长,边缘计算市场在实时应用需求和物联网成本压力等因素的推动下不断增长。这是一个将影响 2020 年软件行业的趋势。欢迎来到未来。
您已经在使用边缘计算了吗?边缘计算的其他优势是什么? 在下面留下你的想法作为评论。
原载于。
更多故事:
在计算受限的设备上运行深度学习计算机视觉的挑战
在树莓上挣扎奔跑的物体检测
关于作者
Sabina Pokhrel 在 Xailient 工作,这是一家计算机视觉初创公司,已经建立了世界上最快的边缘优化物体探测器。
参考文献:
https://www . marketresearchfuture . com/reports/Edge-Computing-market-3239
https://www . grandviewresearch . com/press-release/global-Edge-Computing-market
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6539964/
https://www . the verge . com/circuit breaker/2018/5/7/17327584/Edge-Computing-Cloud-Google-Microsoft-apple-Amazon
https://www . sales force . com/products/platform/best-practices/benefits-of-Cloud-Computing/#
https://www . control eng . com/articles/key-drivers-and-benefits-of-edge-computing for-smart-manufacturing/
https://ces.eetimes.com/the-advantages-of-edge-computing/
你说“智能设备”,真的吗?
原文:https://towardsdatascience.com/you-said-smart-devices-really-77ef97049d8d?source=collection_archive---------19-----------------------
我们如何定义“聪明”?以及为什么人们会混淆“智能设备”和“智能设备”
我们在之前的文章中看到,专家们并不总是就定义达成一致,我们试图澄清围绕物联网(IoT) 的困惑。
现在让我们深入探讨一下设备的“智能”。智能手机是什么大家都知道,但是到底有多智能呢?智能设备到底意味着什么?
关于“智能”一词的困惑
剑桥和牛津字典对聪明人的定义是:聪明,或者能够在困难的情况下快速或聪明地思考。
由此可见,【智能】**【智能】是同义词。但是说到设备,这两个词指的是不同的概念:
设备的“智能”被定义为“使用计算机以独立的方式行动”的能力,而设备的“智能”在于“以类似于人类的方式适应和应对不同情况”的能力。
换句话说:
- 一个智能设备 要求独立;它包括一个软件,以便在没有用户输入的情况下自动执行任务。
- 一个智能设备需要适应和学习;它包括一个软件,从数据和过去的使用中提取知识,以改善其行为(即人工智能)
这意味着智能设备通常也是智能的,但智能设备不一定是智能的。这是大多数人感到困惑的地方。
为什么知道区别很重要?
如果顾客认为两种产品是一样的,正常的反应是买便宜的那一种。然而,智能设备需要更高的计算能力,因此需要更昂贵的硬件。
更令人困惑的是,在法语和阿拉伯语等一些语言中,两个词–smart&intelligent,都被翻译成:‘intelligent’。因此,当营销人员翻译他们的产品名称时,所有的【智能】设备都变成了【智能】,这导致了歧义。
例如:当我购买一台智能空调时,我希望该设备能够显示一些人工智能功能,例如预测我何时回家,以便在我到达之前降低温度,或者自动适应我的习惯,在周六因为我回来晚了而切换到经济模式。我也希望所有我想买的智能设备有同样的行为,比如智能咖啡机、智能锁、智能汽车等等。
但由于那些所谓的智能设备并不智能,我将不得不手动设置我的空调,在每天的固定时间开始给房子降温,或者使用移动应用程序远程启动程序。此外,我可能会为我购买的每个设备安装不同的应用程序!
技术人员所说的“聪明”是什么意思?
对于技术人员来说,“智能”指的是连接性或自动执行:
- 自动执行:
欧洲 GASAGRAS 项目报告称智能设备是‘基于嵌入式计算机的系统,无需人工干预’。 - 连接和识别:
在分析了各种定义后, IEEE P2413 计划——负责标准化物联网框架——得出结论,设备‘如果可以识别、命名和寻址’,就可以变得智能。使“智能设备”几乎成为“物联网设备”的同义词(查看 之前的博客 了解更多详情)。
简单来说:“智能设备是一种电子设备,一般通过不同的无线协议(如蓝牙、NFC、Wi-Fi、LiFi、3G 等)与其他设备或网络相连。),可以在一定程度上交互和自主操作”(维基百科定义)
所以智能设备是关于‘智能’,对吗?
应该是这样,但是你猜怎么着?如果你用谷歌搜索“智能设备”这个词,你会找到下面的定义:
具有内部计算能力的机器、仪器、设备或任何其他装置。
但是等等……这不就是智能设备的定义吗?看起来这里又有一个混乱!
从我们之前所见,智能设备的正确定义应该是:
“使用人工智能(AI)以使其行为适应不同情况并从过去的经验中学习的电子设备”。
这是有道理的,并且完全符合剑桥和牛津词典的定义。
事实上,计算机科学的大多数研究人员都会同意这个定义。但在电气工程或电信等其他领域,有些人会用【智能设备】和【智能设备】来指代同一个事物。例如,国际电信联盟机构将智能事物描述为包含嵌入式智能的【思考事物】。
注意细节,找出误导性的词语
有些人利用这些令人困惑的定义为自己谋利;要么是为了制造声势,要么是为了吸引投资者。
最近的一项研究调查了来自 13 个欧洲国家的 2830 家公司,证实了 40%的所谓的‘人工智能初创公司’没有证据表明在他们的产品中使用人工智能材料。
从我个人的经验来看,作为阿尔及利亚几个黑客马拉松的教练,大多数声称他们的解决方案使用智能系统的团队根本不包括任何形式的人工智能。他们使用这个词要么是作为销售理由,要么是因为他们认为系统的智能是关于使用智能手机的连接和远程控制。
所以下次你想买一个【物联网】**【智能】或者【智能】设备的时候,问问卖家他/她这个词是什么意思。同时,也许亚瑟·阿布德斯拉姆能告诉我们更多关于这一现象的营销部分。
下一篇文章,我们来澄清另一个困惑:什么是机器人?相信我,这个问题比看起来要难。
在那之前,请分享和评论来丰富辩论。
你说你想要一场(数据)革命
原文:https://towardsdatascience.com/you-say-you-want-a-data-revolution-6ceefded38b7?source=collection_archive---------39-----------------------
让数据成为企业中的一等公民
Photo by Paul Skorupskas on Unsplash
当基于订阅的商业模式开始风靡时,公司开始意识到以客户为中心对生存和成功至关重要。在 Gainsight,我曾帮助创建并支持客户成功类别,并担任 CS 运营副总裁,我很幸运能够在这场变革中占据第一排的位置。这些天来,我很高兴参与另一场革命:随着每个企业都成为科技企业,也有义务成为以数据为中心的企业。
我不禁要说:数据第一是新的客户第一吗?我发现反思这两个主要的业务转型很有启发性,希望我们能从中吸取教训。这里有三个有趣的相似之处可以考虑。
让客户和数据成为全公司的重中之重
首先,考虑一下:公司中谁“拥有”客户体验?这几乎已经成为客户成功领域的老生常谈——当然,组织中的每个人都这么做。组织中的每一个职能都对客户体验和结果有贡献。
但是我认为,在数据领域,这个问题仍然存在争议。公司中谁“拥有”数据?是专注于将洞察力转化为行动的数据业务消费者吗?还是那些负责生成大量数据的基础架构的人?我看到客户、IT、数据、工程或其他部门的答案各不相同。
如果我不得不打赌,我敢打赌,各公司都会同意类似的答案:最终,组织中的每个人都拥有数据。收集、存储、分析和推动数据行动是每个职能部门的共同责任。与客户体验类似,这并不是说没有一个人对它的每个部分负责(甚至可能有一个首席数据官全面领导战略),而是整个组织共同拥有数据和基于数据的行动——即使一开始我们可能不喜欢这个想法。
采用技术加速数据驱动的客户成果
在客户成功中,最关键的步骤之一是找出如何卸载和自动化某些任务,所有这些都是为了专注于最重要的事情:为客户创造价值和成果。我们利用软件和自动化来更快、更高效地收集、跟踪和处理客户数据,并取得了巨大的成效。
最近的一个例子是 TD Ameritrade 如何依靠人工智能来实现他们的“客户之声”。通过将人工智能应用于呼叫中心记录,以提取观点、做出响应和定制建议,TD 还能够释放带宽,以优先考虑更广泛的客户至上的项目。例如,当他们的分析显示客户打电话是为了获得他们投资的基本信息时,TD 推出了一个新的网页,向他们提供在线信息。简单。
自然,这个客户成功的例子有其数据基础。但是数据行业也必须关注这项工作。例如,基于云的数据仓库正变得越来越普遍,用于存储数据,卸载曾经被视为核心的活动——存储。但是如果你仔细想想,依赖基于云的仓库为数据团队开辟了其他机会——比如采用其他技术来加速创新。一旦解决了基础问题——如治理、访问、质量控制、安全性等——团队就可以专注于推动客户和业务成果的真正创新。
从被动转为主动(也就是防御转为进攻)
起初,客户成功是支持功能的同义词。从这个角度来看,客户服务通常是事后的想法,是保护你的基础的一种方式,带有处理查询的风险框架。但大约十年前,当 SaaS 的商业模式获得牵引力时,人们开始意识到卓越的客户管理不仅仅是一种防御机制。现在看起来很明显:当然伟大的客户优先排序可以让客户更成功地使用你的产品——也让生意更成功。
很快就清楚了,在客户成功方面积极主动(例如,建立一个负责向客户展示价值的 CS 功能)是一个真正的增长引擎。如今,具有前瞻性思维的组织将客户成功视为推动公司增长的基于结果的功能。
在这里,我们也可以与数据行业相提并论。数据行业基本上是从防御开始的,受法规遵从性和风险缓解的驱动。它位于 It 组织中,其技能主要用于检测问题,并找出如何在问题变得更加严重之前阻止它们。但防守方面的进步开始暗示,数据也可能有机会进入进攻。它开始成为一个业务驱动的、基于结果的、主动的职能,推动公司的增长,但我们仍处于早期阶段。
所有这些当然都是一种简化——它不是 1:1 的直接比较,我们当然应该从基本原则出发评估每种情况。也就是说,我们成为客户和数据优先组织的共同机会和需求从未像现在这样重要。这使得考察一个走在我们前面的行业是如何转型的更有帮助。
你应该害怕超级愚蠢,而不是超级聪明
原文:https://towardsdatascience.com/you-should-fear-super-stupidity-not-super-intelligence-19f93a46fa4d?source=collection_archive---------22-----------------------
Artificial Intelligence is not match for Natural Stupidity
我被邀请参加一个相当大的活动,在这个活动中,一些专家和我(请允许我不认为我是一个专家)将讨论人工智能,特别是关于超级智能的概念。
原来我最近发现了这个非常有趣的 TED 演讲,是由 Grady Booch 做的,正好是我准备演讲的最佳时机。
Grady Booch — Don’t fear superintelligent AI TED Talk
不管你同意还是不同意布奇先生的观点,很明显今天的我们仍然生活在 弱或窄的 AI ,远的离一般的 AI ,更远的离一个潜在的超级智能。尽管如此,从今天起机器学习给我们带来了巨大的机遇。让算法与人类合作解决我们最大的挑战的机会:气候变化、贫困、健康和福祉等。
事实上,如果我们想作为人类生存足够长的时间,有朝一日有可能解决超级智能问题,我们似乎应该担心许多挑战。我们真的足够担心吗?让我怀疑。这就是为什么我们应该担心超级愚蠢。
人工智能已经多次表明,它能够找到我们人类无法识别的关系/ 模式。如果当前的人工智能帮助我们找到治愈疾病的模式,或者帮助我们应对气候变化,会怎么样?
AI can find hidden patterns for humans
让我说清楚:我强烈认为,我们必须努力避免人工智能的不良使用可能带来的风险,通过道德准则和监管,但不放弃我们作为一个社会可以从中获得的巨大利益。实际上,我们在这一领域面临的最大挑战之一是避免陷入技术过度监管,因为全球监管和道德考量之间的巨大差异最终可能会改变全球地缘政治秩序,并产生/加剧国家/地区之间的不平等。但这也许是另一篇文章的精神食粮…
话虽如此,让我继续从布奇先生的讲话中摘录一段,并谈谈我自己的一些想法:
“我们正处在与机器共同进化的不可思议的旅程中。我们今天的人类不是那时的人类。现在担心超级智能的崛起在许多方面都是一种危险的分心,因为计算本身的崛起给我们带来了许多我们现在必须关注的人类和社会问题。当对人类劳动力的需求减少时,我该如何最好地组织社会?我怎样才能在全球范围内带来理解和教育,同时又尊重我们的差异?我如何通过认知医疗延长和提高人类寿命?我该如何利用计算机来帮助我们到达恒星?”
我完全同意。人工智能在当前状态下的崛起,以及 ML 的使用,特别是深度学习扩展,使我们面临任务自动化方面的巨大挑战。我说任务而不是工作是有原因的:我们越来越需要将工作视为任务的组合,其中一些是可重复的且缺乏创造力(因此受制于自动化),而另一些则不是(因此仍由人类来执行)。正如布奇先生提到的,这种新的人机合作(被称为增强智能)本身带来了巨大的挑战。
****
但不仅如此。最先进的** 人工智能还引入了其他挑战,它们都与伦理有关,以及信任应该如何成为创造负责任的人工智能的基本原则,如下图所示。**
Challenges around Responsible AI
最后,我非常同意博奇先生演讲的最后一段摘录:
此时此地,利用计算提升人类体验的机会触手可及,而我们才刚刚开始。
所以,让我们不要把精力放在避免一种超级智慧上,这种智慧只能(暂时)是我们自己超级愚蠢的产物。让我们把注意力集中在真正的问题上,以及如何利用我们掌握的难以置信的技术造福人类。****
你的算法分不清绿色和蓝色
原文:https://towardsdatascience.com/your-algorithm-doesnt-know-green-and-blue-from-grue-8cfdb71d1c2c?source=collection_archive---------28-----------------------
数据科学之道
古德曼的新归纳之谜与人工智能中的逻辑
数据科学之道 专栏探讨了几个世纪以来哲学家们是如何攻克机器学习和数据科学的关键问题的。
Nelson Goodman’s little riddle makes even commons sense inductive reasoning feel futile.
归纳指从例子中学习一个大概的概念。
我们见过许多蜗牛。我们见过的每只蜗牛都吃莴苣。所以,所有的蜗牛都吃生菜。
哲学的核心问题之一是归纳法的问题——归纳法推理是否能通向知识的问题。
在统计机器学习中,我们试图创造从数据中学习的机器。归纳的问题让人质疑这种学习过程是否能让机器知道一些东西。
我想将一些基本的机器学习理论与哲学中关于归纳的经典讨论联系起来。我想把归纳问题上的基础哲学工作和建造学习机器的人所面临的挑战联系起来。
这篇关于纳尔逊·古德曼的新归纳之谜的文章代表了对这个相当大的杯子的最初投入。
绿色,蓝色,还是灰色?
归纳法的部分问题在于,看似简单的观点,即过去定期观察到的模式将持续到未来,显然缺乏正当理由。
纳尔逊·古德曼根据文字游戏和基本命题逻辑编造了一个有趣的谜语,展示了这种推理方式如何导致相互矛盾的结论。
Is this gemstone green, blue, or grue? Photo by Jens Johnsson
假设你是一名研究宝石的地质学家。在“这个宝石是绿色的”这个表达中,“是绿色的”是所谓的谓词。假设这个断言在 2020 年 1 月 1 日午夜之前对你见过的所有宝石都成立。归纳法让你得出结论,这个谓词在未来将是真的。你可以说“预测”,而不是“断定”——你预测未来所有宝石的颜色都将是绿色。
谜语的工作原理是将“是绿色的”换成一个新的谓词,并显示你得到了一个矛盾。新谓词是“is grue”,其中“grue”表示“是绿色的,在 2020 年 1 月 1 日午夜之前看到,或是蓝色的,在 2020 年 1 月 1 日之后看到”。
下面是这个谜语的分解:
- 如果我们在 2020 年 1 月 1 日之前看到的所有宝石都是绿色的,那么观察陈述“2020 年 1 月 1 日之前看到的所有宝石都是绿色的”是正确的。
- 此外,根据我们对“grue”的定义,观察结果“2020 年 1 月 1 日之前见到的所有宝石都是 grue ”也是正确的。
- 通过归纳推理,我们从第一个观察陈述中得出结论:“所有未来的宝石都将是绿色的。”
- 同样,我们从第二个陈述中得出结论,“所有未来的宝石将 grue。
- 既然我们得出了这两个结论,那么我们得出的综合结论是“所有未来的宝石都将是绿色和绿色的。
- 但这是一个矛盾。这一综合结论意味着,一旦我们过了 2020 年 1 月 1 日午夜,所有宝石都将是绿色和蓝色的!
这个谜语是不是坦克基于逻辑的机器学习?
在机器学习中,我们有许多模型使用这种类型的命题逻辑作为原语。例如,Pedro Domingos 在他的书 The Master Algorithm 中提出了基于一阶逻辑的建模方法,称为马尔可夫逻辑网络。命题逻辑是一阶逻辑的基础。这些框架是如何处理“grue”的?
Goodman 的结论是,虽然归纳推理不能对所有谓词都有效,但它确实对一些谓词有效。然而,它是否有效似乎取决于人类使用和曾经使用什么语言来描述和预测我们世界的行为。
不知何故,我们似乎希望我们的算法而不是依赖于人类对世界的偏见感知,以及人类的口语如何塑造我们对这些感知的解释。否则,他们如何揭示真正新奇的世界洞察力?
延伸阅读:
- 新归纳之谜 —维基百科
- 归纳的问题 —斯坦福哲学百科全书
- 纳尔逊·古德曼图片来源:( WP:NFCC#4),合理使用
基本分类模型入门指南:逻辑回归和 SVM
原文:https://towardsdatascience.com/your-beginner-guide-to-basic-classification-models-logistic-regression-and-svm-b7eef864ec9a?source=collection_archive---------15-----------------------
机器学习模型权威指南
关于对数据集中的要素进行分类,您只需知道
Source: Unsplash
介绍
还记得你的小孩或侄子/侄女,他们还在学习如何识别物体和动物吗?我知道。
我有一个 1 岁的小侄女,她非常聪明,每当我指给她一只猫时,她总是说“喵”,甚至没有告诉她那是什么。不管它的毛是什么颜色,也不管它的大小,她都能准确无误地认出它是一只猫。
那么她怎么能认出那只猫呢?有趣的是,通过每次观察,她知道了哪一只是猫,哪一只不是。这是她心智模式的一部分。当然,通过我们和她的互动。每次她看到动物,我们都会说。“看,这是一只猫”。她会说“苗”来确认。然后每当她看到一只小狗(比如吉娃娃)说“苗”的时候,我们就会说,不,是狗。
慢慢地,她学会了通过每次观察更准确地分辨出,哪一只是狗,哪一只是猫。当然它延伸到哪一个是老虎,绵羊,甚至大象。她的心智模式随着她所拥有的每一个观察而进化。
Mental model for each classification of animal
同样,在机器学习中,我们会发现各种分类问题。还记得追求幸福的威尔·史密斯吗?假设你是一名销售经纪人,你需要从众多潜在客户中找出买家。你可以联系他们中的任何一个,但是时间和精力都非常有限。问题是,哪个会买你的产品?
分类是一个有监督的问题,其中有一个带标签的数据集。这意味着您可以使用历史数据和标注来预测任何新观测值的标注。最后,我们可以用一个模型来预测我们配偶的情绪——这会让我们的生活变得多么美好!!!
Source: Giphy
逻辑回归和支持向量机(SVM)
事不宜迟,我在这里的工作是向您介绍分类机器学习模型的两个基础:逻辑回归和 SVM。
我试图让这个指南非常清晰,适合初学者,并为进一步的学习增加参考。如有困惑,请评论。
逻辑回归
逻辑回归是一种分类模型,用于预测特定事件的有利概率。优势比代表我们想要预测的积极事件,例如,在 UCI 数据集中,样本患乳腺癌的可能性有多大。
Odds Ratio for Positive Events (positive probability/negative probability)
比值比通常也被定义为 logit,它是比值比的对数(log-odds)。这里注意 log 是指自然对数,取 0 到 1 之间的输入值。这意味着它表示给定某个特征的正事件的条件概率。
Logistic Regression Formula with logit
为了理解这个公式,我们需要慢慢地把它分解成左手边(LHS)和右手边(RHS)。
在右侧(RHS ),它显示了一个带有 b 系数和输入特征的简单线性方程公式。类似于线性回归,这些系数被优化以最小化成本函数。
左手边的网站(LHS),你会看到比值比的自然对数。p(X)是正事件/默认类。在泰坦尼克号数据集中,这可能意味着你存活的可能性,或者在乳腺癌分类中,癌症的可能性。
该方程将转化为逻辑 sigmoid 函数,它是 logit 函数的 S 形逆函数。
Sigmoid function Logistic Regression
逻辑回归中的优化
我们使用最大似然估计来优化训练系数的最佳值,以最小化预测到实际标签的测试距离。
有趣的是,这些系数也会转化为某个特征对影响预测概率的重要程度。例如,在该数据集中,您可能会发现与票价相比,性别具有较大的对数回归系数。这意味着性别决定了预测。向你的经理提出见解的一个非常有用的方法!
Coefficients table from titanic dataset with sex being one of the important feature.
逻辑回归中的调整:正则化参数
为了调整好偏差-方差权衡,逻辑回归引入了正则化参数来处理特征间多重共线性,过滤信号间的噪声,并防止模型过于复杂。它引入了额外的信息来惩罚具有极端权重的参数。
这是关于逻辑回归的 L1 和 L2 正则化的更具描述性的信息。
Source: Giphy
支持向量机
支持向量机(SVM)是一种非常强大的学习算法,可以最大化类别变量之间的间隔。这个余量(别名:支持向量)表示分离超平面的距离(别名:决策边界)。
Support Vector Machine Model: Source
为什么支持向量机
具有大余量的决策边界的基本原理是用可调整的偏差-方差比例来分离正负超平面。目标是分离,使得负样本落在负超平面下,而正样本落在正超平面下。
逻辑回归中的调整:松弛变量
1995 年,Vladimir Vapnik 提出了软间隔分类的概念,增加了松弛变量来松弛非线性可分数据。这个松弛变量将控制边距的宽度和位置,并调整偏差-方差权衡。你可以在这个由里沙布撰写的惊人帖子中找到更多信息
逻辑回归与支持向量机
Logistic Regression vs SVM
逻辑回归的优点是它引入了一个更简单的模型,可以更容易地实现。它确定每个变量的重要性权重,这些权重可以分配给每个预测的概率函数。这对于发现对信用风险评分等评级问题的见解非常重要。此外,逻辑回归可以很容易地随着新数据的到来而更新,这对于流式数据来说是完美的。
然而,当逻辑回归试图最大化训练数据的条件似然性时,逻辑回归非常容易出现异常值。作为共线检查的标准化也是确保特征的权重不会超过其他特征的基础。
另一方面,SVM 不容易出现异常值,因为它只关心最接近决策边界的点。它可能会根据新的积极或消极事件的位置来改变决策界限。
SVM 非常流行的另一个原因是它可以很容易地做成核来确定非线性分类问题。这个想法是将数据点投射到高维映射中,在那里它是可分离的。这意味着,现在可以用 2D 要素(平面)来分隔 3D 要素(超平面),而不是用 1D 要素(线)来分隔 2D 要素(平面)。内核将数据作为输入,然后将其转换成所需的形式(线性、非线性、放射状、sigmoid 等)。
没有一个模型是完美的(免费午餐定理)
特别是,即使算法之一是随机猜测,这种等价也是成立的:任何特定的学习算法被数据混淆并且表现得比随机算法差的目标“一样多”,就像它表现得更好一样。—大卫·h·沃伯特(没有免费的午餐定理)
在“没有免费的午餐”定理中,它指出没有一个模型对所有问题都是最好的。在实践中,总是建议比较每个学习算法的性能,并为特定问题选择最佳模型。
过度拟合是机器学习中的一个问题,在这种情况下,模型可以很好地拟合训练数据,但不能用测试(看不见的)数据进行足够好的概括。这将引入很高的方差,因为它引入了太多的参数,使得模型更加复杂。
另一方面,欠拟合可能会发生,这意味着机器学习模型不能捕捉足够的复杂性来表示训练数据中的模式——这也将引入测试数据的低性能。
这些是你应该避免的每个模型中非常大的问题。因此,要选择是否需要使用 SVM 或逻辑回归。你需要问自己几个问题:
- 您是否已经正确理解了正确的功能和训练样本?如果样本中有许多您不想排除的异常值(例如:乳腺癌的分类)。那你可能想用 SVM。
- 您是否正确评估了模型的准确性、召回率和精确度,尤其是在不平衡类别集的形式下?根据需要,您需要考虑每个型号在分类矩阵中的权衡。
- 你正确地调整算法了吗?每个模型都应该根据其自身的成本函数进行优化(逻辑回归:最大似然,SVM:最大利润距离)
记住,没有完美的模型,每个模型都是一个工具。这意味着它需要根据每种情况进行适当的调整和优化。
更多参考
如果你需要更多的例子和对逻辑回归和 SVM 能提供什么更好的见解。请随意访问以下链接。
- 逻辑回归理论
- 逻辑回归介绍
- SVM 理论
- SVM 简介
最后…
Source: Unsplash. Look at how aligned each truck is
我真的希望这是一本很棒的读物,是你发展和创新的灵感来源。
请在下面评论出来建议和反馈。就像你一样,我也在学习如何成为一名更好的数据科学家和工程师。请帮助我改进,以便我可以在后续的文章发布中更好地帮助您。
谢谢大家,编码快乐:)
关于作者
Vincent Tatan 是一名数据和技术爱好者,拥有在 Google LLC、Visa Inc .和 Lazada 实施微服务架构、商业智能和分析管道项目的相关工作经验。
Vincent 是土生土长的印度尼西亚人,在解决问题方面成绩斐然,擅长全栈开发、数据分析和战略规划。
他一直积极咨询 SMU BI & Analytics Club,指导来自不同背景的有抱负的数据科学家和工程师,并为企业开发他们的产品开放他的专业知识。
文森特还在 best top 上开设了他的一对一导师服务,指导你如何在谷歌、Visa 或其他大型科技公司获得你梦想中的数据分析师/工程师职位。 如果你正在寻找良师益友,请在这里预约他 。
最后,请通过 LinkedIn ,Medium或 Youtube 频道 联系文森特
你的汽车可能不知道什么时候停下来——对自动驾驶汽车的敌对攻击
原文:https://towardsdatascience.com/your-car-may-not-know-when-to-stop-adversarial-attacks-against-autonomous-vehicles-a16df91511f4?source=collection_archive---------20-----------------------
Photo by Kevin Lee on Unsplash
自动驾驶汽车代表了高速、清洁和高效交通的乌托邦梦想。自动驾驶汽车的时代可能即将到来,优步、马斯克的特斯拉(Tesla)和谷歌(Google)的力量等公司寻求成为第一个将自动驾驶汽车坚定地放在路上供所有人使用的公司。自动驾驶汽车最大的症结是安全——我们如何确保这些机器能够理解驾驶的复杂性,以及它们如何能够应对它们肯定会遇到的各种各样以前没有遇到过的场景?
作为汽车核心的电脑
自动驾驶汽车的即将到来部分是由于机器学习,特别是深度学习最近的成功。随着计算机的体积不断缩小,同时能力不断增强,计算机科学家在计算机视觉等领域取得了突飞猛进的发展。深度学习允许计算机从大量数据中学习模式,然后可以利用这些模式进行决策。
在自动驾驶汽车中,深度学习系统处理来自汽车传感器阵列的输入数据,并有助于车辆的高级控制。深度学习系统的一个元素是对汽车周围的物体进行分类,例如识别行人、骑自行车的人、交通标志等。,使其能够安全导航并遵循道路规则。
深度学习系统中的漏洞
随着深度学习系统被关键地嵌入到任何自动驾驶汽车的中枢神经系统中,人们会希望这种系统能够高度准确和强健,防止被故意误导。不幸的是,实验表明,深度学习图像分类系统非常容易受到精心制作的敌对攻击。通过向图像添加精心选择的噪声层,有可能导致深度学习系统对图像进行彻底的错误分类。
Digital Adversarial Attacks confuse a Deep Learning system with imperceptible changes (from OpenAI)
在数字领域,攻击者获取一张图像和一个目标深度学习系统,窥视深度学习模型的内部工作,并以某种方式转换图像,使计算机确信图像现在显示出不同的东西。显然,攻击者可以彻底改变图像,以改变深度学习分类的结果;相反,挑战是尽可能少地改变图像,或者以人类无法察觉的方式改变图像,但机器会出错。
Digital Adversarial Attacks are also effective at confusing the Deep Learning Systems in cars (source)
身体对抗攻击
在实践中,数字对抗性攻击用于自动驾驶汽车是非常不可行的——攻击者必须能够拦截汽车传感器的传输,并在图像被移交给深度学习系统之前干扰图像。一个更可行的方法是改变物理环境,而不仅仅是车辆对它的感知。通过篡改路标,有可能混淆深度学习系统,对这些标志进行错误分类,即使它们仍然完全可以被人类理解。研究人员已经成功误导了真实车辆中的交通标志分类系统,通过使用旨在模仿标志上涂鸦的黑色贴纸,在 84%的时间里诱导了错误的标签。
Example Physical Adversarial Attacks that are sufficient to drastically confuse a Deep Learning system (source)
物理攻击带来了一些新的挑战。因为有许多不同的方式可以观察到一个物体,任何物理变化在不同的视角和距离下仍然有效。这些改变还必须足够显著,能够被摄像头捕捉到——再见了,数字敌对攻击中使用的细微噪声层。
然而,物理攻击的结果是,我们期望物体是不完美的——我们经常习惯于看到路标上的标记、贴纸和涂鸦,但我们仍然能够正确识别它们并安全驾驶。与数字攻击不同,数字攻击的目的是以最微妙的方式扰乱想象,物理攻击有更大的变化空间。
对自动驾驶未来的希望
那么,如果你想让你的车能够正确地阅读停车标志,该怎么做呢?消除对任何和所有符号的干扰是一个选择,但那是相当大的开销。一个更合理的方法是开发对这种攻击具有鲁棒性的机器学习系统,主要是通过训练它们正确识别对立的例子——一种暴露疗法。不幸的是,我们狡猾的攻击者可能只是创造了另一种系统没有见过的对抗方法,尽管这一次对他们来说可能会更难。
冗余是一个很好的解决方案;深度学习系统虽然非常重要,但仍然只是汽车控制系统的一部分。像 GPS 这样的其他系统可以用来验证深度学习系统的结果——就此打住有意义吗;限速提高与我掌握的道路交通数据相符吗?不幸的是,这并不包括环境中的动态元素,如行人,但它仍然是对篡改交通标志的例子的有力反驳。
制造对抗性攻击的一个缺点是,它们通常需要白盒模型:访问模型的内部工作方式,比如特定的参数和架构。幸运的是,这些功能受到自动驾驶汽车制造商的高度保护(既是出于安全原因,也是因为它们是自动驾驶汽车开发的最高宝石),使得攻击者很难获得这些功能来策划他们的攻击。然而,对针对黑盒模型的对抗性攻击的研究正在进行中,所以我们还没有完全脱离险境。最终,任何有助于提高自动驾驶汽车中使用的机器学习系统的鲁棒性的方法都将是一种受欢迎的祝福。
你的公司可能还没有为人工智能做好准备
原文:https://towardsdatascience.com/your-company-is-probably-not-ready-for-ai-1098d089e889?source=collection_archive---------36-----------------------
先别叫它 AI。
Photo by Ian Battaglia on Unsplash
最近有人问我,为什么我们团队中的一名数据科学家不从事数据科学,而是从事数据争论:数据准备、清理和数据质量保证。花哨的统计数据在哪里?模特在哪里?或许是图表?或者至少有一张幻灯片提到了人工智能、机器学习或深度学习。
我意识到数据科学并不总是符合上层管理的宣传。这可能是因为它没有达到预期,因为坦率地说,有人对我们这些凡人设置了太高的标准(咳咳,谷歌)。也可能是因为,或许,公司还没有为数据科学做好准备。
有人问我们,为什么我们的数据科学家不从事数据科学…
尽管世界各地涌现出许多纯粹从事人工智能驱动技术或人工智能工具的公司,但普通公司尚未在该领域找到出路。
这是为什么呢?为什么有些公司能够将 AI 货币化。为什么其他更传统的机构,比如银行,发现很难采用新技术?为什么他们不能得到一些好的人工智能或数据科学?
首先,我们应该停止称它为 AI…
我们应该从房间里的大象开始。我们真的不应该再叫它 AI 了。人工智能是一种类似人类的智能,距离大多数公司需要的一些适当的统计数据或有监督的 ML 模型还有很长的路要走。公司并不真的需要人工智能。最重要的是,这是一个臃肿和过度使用的术语。
但是如果你坚持 AI。订单很重要…
当你想到流行的例子时:像谷歌照片,Snapchat 过滤器,甚至无人驾驶汽车,你必须认识到这些是围绕人工智能打造的产品(和整个公司)。图像识别是伟大和有用的,但它的应用不是无限的。
人工智能→产品。谷歌、Snapchat、脸书和特斯拉等公司之所以有如此成功的记录,是因为它们的使用案例。用例是非常仔细地选择的,因此他们在完全适合目的的模型上构建产品(可以说自动驾驶汽车很难使用机器学习算法来生成真正的自动驾驶汽车)。
ML 模型大放异彩的领域不在少数;关系不明确的模糊数据集就是其中之一。(不要与低质量数据集混淆)。我们看到同样的用例正在我们周围使用:前面提到的图像识别、语音到文本和翻译、疾病和医疗数据之间的关系——结果和输入之间的关系并不立即清晰,但一台强大的计算机可以在两者之间建立一种似乎合理的关系。
产品→ AI。对于许多公司来说,问题往往是反过来的。他们有一个问题,想把人工智能应用到。这导致了一路上各种意想不到的曲折。例如,当你的问题不适合人工智能的应用或者甚至不需要人工智能时,会发生什么?它需要的是一些流程优化。或者数据质量,或者用户的一些简单访问?
并非所有问题都适合人工智能。AI →产品≠产品→ AI。
Photo by Pietro Jeng on Unsplash
你甚至还没有做好分析…
通常,公司也会因其业务知识和目标而限制机器学习和数据科学的应用。我的意思是,来自业务的问题决定了正在创建或研究什么,以及什么值得数据科学团队花费时间。这意味着你的边界条件就是业务。不是你花大价钱雇来的数据科学家。
数据科学家可以更容易地接受培训,根据业务目标进行思考。他们能够理解投入的时间和获得的商业价值之间的权衡。很难让一个业务经理为一群数据科学家定义有意义的工作。这也是很难找到优秀的 DS 经理的原因之一——他们需要了解业务并与之沟通,同时拥有深厚的技术知识并在技术上领导团队。
当您没有一个可靠的交付平台来进行基本分析时,有效地交付更复杂的产品将会更加困难。
你甚至不是数据驱动的…
大多数公司倾向于认为他们是数据驱动的,但事实并非如此。数据驱动并不意味着:寻找数据,构建任何你喜欢的故事并呈现出来。数据驱动意味着对数据所包含内容的细致理解,它需要对数据如何产生以及它排除了什么有深入的纵向了解。它需要一个可证明的假设,并采取整体的方法。结果不会总是如你所愿,你应该愿意接受这一点。
分享你的轶事真相,但如果数据并不总是与你的经历相呼应,不要感到惊讶。
数据驱动也意味着你不能只选择你喜欢的答案而忽略其他的。或者甚至问一些“引导证人”的问题我知道这听起来很难,但是你不能挑挑拣拣。
你被允许(甚至高度鼓励!)将您的知识和经验带给分析团队。当我们了解工作流程、实验、组织或法律方面的变化时,这很有帮助。但是,如果数据并不总是与你的轶事真相相呼应,也不要感到惊讶。
Photo by Martin Adams on Unsplash
你真的不能跳过步骤…
和许多事情一样,数据科学也是如此:你不能走捷径。没有数据争论、上游质量数据、准备好的数据集、数据理解、适当设计的特征,整个努力都处于危险之中。慢板“拉进来,拉出去”是千真万确的。如果你没有强有力的理由去相信基础数据,你就不能相信你的结果。
没有几个小时盯着电脑屏幕,就没有 T2 数据科学;理解数据。没有深刻的见解从页面中涌现出来,没有完整功能的人工智能在不理解其输入的情况下被制造出来,团队不得不投入繁重的工作。数据的行为不像石油,它在价值提取方面耗费大量的时间和精力:
数据科学并不性感——它很难,有时很无聊,而这正是它有趣的地方。奋斗后的回报。你的团队付出努力后的发现。
你可能不需要人工智能…
你也不太可能需要人工智能——这个术语非常臃肿,但在企业中却随处可见。更有可能的是,你需要一些普通的解决方案;一些描述性统计,一些成熟的回归,可能是一个监督的 ML 或者甚至可能是图形数据库来寻找最近的邻居。很可能不是人工智能。
问问你自己,你认为什么能给你和你的团队增加最大的价值?新信息,新见解?还是无人干预的自动化过程?如果是后者,那就尽情享受吧。如果没有,问问你是否需要人工智能或简单的商业分析。
即使你做了,你也没有准备好使用它…
即使你真的想要人工智能,你可能还没有准备好拥有它。与上面类似,当你的系统和流程没有准备好,你也没有准备好。你能放弃对机器的控制吗?大概不会。
当引入新的解决方案来自动化以前的人工选择时,会有大量的阻力。并不总是因为无知,而仅仅是因为无知。
当营销被告知谁应该优先考虑,什么应该优先考虑时,你的营销经理准备好相信结果并执行了吗?营销经理准备好让系统取代他们的工作了吗?作为一家公司,你能找到有意义的方法来使用他们的技能吗?当你真正准备好去人工智能时,要意识到这些问题。
接下来是关于可靠性、监督、所有权和合规性的问题。所以,即使你使用人工智能,也不要完全使用人工智能,要在你的系统周围保持一个稳固的控制和测试网络。
Photo by Sander Weeteling on Unsplash
所以你走了,你可能还没有准备好人工智能…
好了,就这样。你的公司可能还没有准备好。这没关系。有大量的信息可以被解析成有意义的见解。从一开始就把基础做好,(字面上)可以赚一百万。
所以,不要再追逐黄金了,看看一叠美钞也价值连城。允许过程就是过程,把它看作更大整体的一部分。从小处着手,然后一步一步来。
因此,当我们的数据科学家不从事数据科学时,他会投入必要的工作,以到达他需要的地方:在分析、建模、可视化都有意义的情况下,因为底层数据是可信的。他正在做的工作是为我们的公司准备一个可靠的分析和模型。他正在努力为人工智能做准备。
参见我之前的文章《走向数据科学》,文章认为数据不是新的石油:
https://towards data science . com/data-is-the-not-the-new-oil-721 f 5109851 b
您的数据消耗了大量能源
原文:https://towardsdatascience.com/your-data-is-using-a-lot-of-energy-cf06df9a7e2c?source=collection_archive---------21-----------------------
所有收集到的用户数据和保存在云中的数据都对环境产生了巨大影响
如果你开始研究每年创建的数据量,你会很快发现一个乍一看似乎被过度使用和过时的统计数据: 90%的数据是在过去两年中创建的。由于数据创建的指数速率,这几十年来一直如此(如果你想得到更好的解释,请查看这个)。
每一次点击、搜索、分享链接等都是一个新的数据点,公司正在用它来更好地预测你想要什么。仅在 2017 年,据估计每天就有 2.5 万亿字节的数据被创建(大约每天 25 亿 GB)。这些数据包括上传的图片和来自家中联网设备的图片。基于 can 的操作系统 Domo 每年都会制作一张“数据永不休眠”的信息图。他们在列出我们日常互动的热门网站方面做得很好。(更新为 2019 )
数据如何产生碳足迹?
所有这些数据都必须存储在某个地方,而数据中心就是那个地方。2014 年,美国能源部估计,仅在美国就有 300 万个数据中心,也就是说每 100 个人就有一个数据中心。数据中心的规模各不相同,但谷歌、脸书、苹果等科技巨头。选择了大规模的能源密集型设施。脸书最近宣布计划建立一个更加分布式的系统,以更好地满足用户的需求——这可能会对他们的效率产生积极的影响。
一般来说,所有数据中心都有一些基本必需品:计算机房空调(CRAC)、服务器、网络设备、存储、不间断电源(UPS)、空气处理器、冷却器、加湿器、照明、办公区域和其他一些不同的项目。所有这些因素都增加了数据中心的能源密度。2017 年,该行业每年使用200-300 太瓦时(TWh)的电力,目前约占二氧化碳总排放量的 3%。这种用途只会越来越多。
正在做什么?
为了更新这些系统和提高效率,已经做了大量的工作。数据中心正在配备新的服务器和硬件,这些服务器和硬件在不活跃时会保持较低的温度并处于待机状态。随着这些更新,冷却成为一个较小的问题——根据谷歌,他们一年只使用空调 36 小时。另一个选择是利用室外环境降温。空间中的灯可以更新为 led,使用更多的窗户/自然光是另一个很好的选择。
一个很大的关注领域是能源本身。目前,大多数数据中心至少从一种可再生能源来源获得能源— 83%的数据中心知识调查对象表示,他们目前使用或计划使用太阳能。今年,谷歌宣布将建造两个最大的太阳能农场,为其在阿拉巴马州和田纳西州的最新项目供电。下面是他们全球所有数据中心的地图。红色标记代表这两个新设施。
Google’s data center locations world wide created using follium and Giphy Capture.
我能怎么做呢?
根据你的谋生方式,你的影响力会有所不同。然而,第一个重要的步骤是消除数据垃圾或数据浪费。那些自 2012 年以来就没有动过的文件就是一个典型的例子——尤其是当它们存放在云存储中的时候。
当软件代码以短而有效的方式编写,从而避免浪费 CPU 能力的冗余计算时,程序被认为是高效的。—斯蒂芬·施密特
作为开发人员,您可以通过编写更干净的代码来提高效率。这对公司使用的代码有更大的影响。据《卫报》的斯蒂芬·施密特(Stephen Schmidt)称,“当软件代码以简短有效的方式编写,从而避免浪费 CPU 能力的冗余计算时,程序被认为是高效的。”
从专业角度来说,另一个需要考虑的领域是存储的数据。数据垃圾的问题无处不在。尽管在企业层面更具挑战性,但我们需要考虑是否所有存储的数据都被使用或被需要。现在看起来几乎所有的东西都在收集数据,但是随着时间的推移,我们有望对存储的数据进行更有选择性的选择。
你的数据集是一个巨大的墨迹测试
原文:https://towardsdatascience.com/your-dataset-is-a-giant-inkblot-test-b9bf4c53eec5?source=collection_archive---------3-----------------------
分析中的阿波芬尼亚的危险以及你能做些什么
用数据讲故事和说谎之间只有一线之隔。在我告诉你如何找到一流的数据分析师并提升你的分析能力之前,让我先吓你一跳。
Here’s the audio version of the article, read for you by the author.
数据分析中的心理陷阱
人类的大脑是寻找模式的发电站……但是那些模式并不总是与现实有很大关系。我们是那种在云里发现兔子,在薯片里发现猫王脸的物种。
Do these look like a rabbit and a portrait of Elvis to you? Image: SOURCE.
花一点时间考虑一下罗夏测验,向人们展示墨迹并询问他们看到了什么,你就会明白大脑是多么急切地将虚假的解释注入明显的随机性中。
Bat? Butterfly? Or just an ink blot? This is the first of the ten cards in the Rorschach test, created in 1921. Image: Wikipedia
心理学家给这种无中生有的趋势取了一个好听的名字:apophenia。给人类一个模糊的刺激,我们会发现面孔、蝴蝶和为我们最喜欢的项目分配预算或推出一个人工智能系统的理由。
啊哈。
在大多数数据集中有大量的随机噪声,那么你的分析中没有 apophenia 发生的几率有多大?你真的能相信你对数据的解读吗?
大脑处理墨迹的方式也同样适用于数据。
更糟糕的是,分割这些数据集的方式越多,它们越复杂,它们作为刺激就越模糊。这意味着他们实际上是在恳求你在他们身上看到虚假的废话。
复杂的数据集实际上是在乞求你在其中找到错误的意义。
你确定你最近的数据顿悟不是伪装的 T21?
Another great word is pareidolia, which is a kind of apophenia (finding familiar things in vague sensory stimuli). In Japan, they even have a museum of rocks that look like faces. It’s a beautiful world.
谎言,该死的谎言,和分析
如果这听起来令人沮丧,我还没说完。参加数据分析课程可以给这种心理火上浇油。学生们习惯于期待查看数据会产生真正的意义,因为每个家庭作业的探索性分析练习都埋藏着宝藏。很少有教授忍心让你白费力气(为了你好!)而且开放式作业很难评分,所以作为学生你通常接触不到足够多的开放式作业。
学生们在成长的过程中相信,每一个数据集都准备好了吐出一个确凿的事实。
数据讲故事只是一个跳跃,跳过,和直接用数据撒谎。抛开模式是否真实的问题,让我们来谈谈多种解释。仅仅因为你在墨迹中看到蝙蝠形状,并不意味着它里面没有蝴蝶、骨盆或一对狐狸。如果我没有提到狐狸,你会看到它们吗?大概不会。与动机和注意力相关的心理机制对你不利。这需要一种特殊的技能来释放蝙蝠的解释,并迫使自己看到意义的叠加。
一旦人们抓住了他们最喜欢的“洞察力”,他们就会努力去发现它。
问题是,一旦人们抓住了自己最喜欢的“洞察力”,他们就会努力去忽略它,去支持其他人。人们倾向于最强烈地相信最先抓住他们注意力的解释,每一个额外的意思都会降低他们继续寻找的动力。在不加重你最喜欢的故事的情况下,处理多个潜在的故事是一种需要努力锻炼的精神力量。唉,不是每个分析师都有这方面的训练。事实上,许多人受到激励,通过数据探索来“证明”一个故事的一面。为什么要培养只会妨碍你获得数据科学薪水的技能呢?
你的光剑是什么颜色的?
有很多方法可以用数据证明事情(诚实而严谨)——我的数据分解文章会告诉你更多——但是探索性数据分析(EDA)不在其中。开放式数据探索始终是一次摸底调查。决定你光剑颜色的是你要钓的东西。
如果你加入了黑暗面,你就是在寻找证据来支持你已经“知道”是正确的理论(这样你就可以把它卖给一些天真的受害者)。如果你真的相信数据的客观性和你自己的无偏性,你甚至不会意识到你的光剑是红色的。
开放式数据探索始终是一次摸底调查。
有了足够复杂的(模糊的)数据集,你会发现一个模式,你可以用它来支持你最喜欢的故事。毕竟,这就是罗夏测试的美妙之处。不幸的是,数据比墨迹更糟糕,因为你的方法越神奇( p-hacking ),有人知道吗?),对那些不了解的人来说,你听起来就越合理,越有说服力。
Satellite photo of the “Face on Mars” which many people took as evidence of extraterrestrial habitation.
那些拒绝黑暗面的人也去钓鱼,但他们追求的是别的东西:灵感。他们在寻找可能有趣或引人注目的模式,但他们知道不能把它们作为证据。相反,他们实践了一种思想开放的分析禅,遵守尽可能多的解释。
最优秀的分析师会挑战自己,寻找尽可能多的解释。
这需要敏锐的眼光和谦逊、坚定的头脑。他们不是欺骗利益相关者只看到一个故事的一面,而是挑战自己进行创造性思维,将相同的数据消化成尽可能多的故事。他们以一种激励严格跟进的方式展示他们的发现,而不会导致他们的领导团队过于自信而掉下悬崖。
开放的心态给了数据分析一个值得的机会。
一个额外的好处是,寻找多种解释的原则是分析师的秘密武器,让他们不会忽略隐藏在数据中的真正宝藏。如果你被自己相信的谎言分散了注意力,确认偏差会让你很难注意到指向相反方向的证据。如果你的结论是预先确定的,为什么要费心去分析任何事情呢?开放的心态让整个努力有机会变得有价值。
This grilled cheese sandwich fetched $28,000 in auction because it features the Virgin Mary. Alternative interpretations of what we’re seeing, anyone?
雇佣优秀的分析师
如果你喜欢我关于分析的其他文章,这里是你已经在寻找一个伟大的分析师的特质:
- 他们不会做出超出他们正在探索的数据的推论。【1】
- 他们善于使用数据科学工具,并拥有快速筛选大量数据集的技能。【2】
- 他们有相关的领域知识,所以他们不太可能在琐事上浪费利益相关者的时间。【3】
- 他们明白他们的工作是寻找灵感。【3】【4】
- 他们以一种对大脑友好的方式可视化数据,以便尽可能缩短获得灵感的时间。【3】
- 他们知道如何严格跟进他们发现的任何潜在见解(以及向谁寻求帮助)。【4】【5】【6】【7】
除此之外,这篇文章建议你寻找具备以下三种特质的分析师:
- 他们意识到大脑在不存在的地方发现了意义,所以他们保持谦逊,避免妄下结论。
- 他们不会试图向你推销一个通过拷问数据找到的故事,直到它坦白。相反,他们在谈论数据时使用模糊/软化的语言。
- 他们有能力对每件事做出多种解释。他们产生多种解释的速度越快,产生的替代方案越多,他们的力量就越大。下次你雇佣一个分析绝地时,试着面试这种技能。
最后,如果你是一名领导者,请把批判的目光转向内部,确保你给了你的员工正确的激励。你是在找数据分析师还是数据顾问?这些需要不同的心态(和技能!),所以要明智地选择,奖励正确的行为。
Forget potato chips! The Chinsekikan museum at Chichibua in Japan features an Elvis that really is the King of Rock.
感谢阅读!人工智能课程怎么样?
如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:
Enjoy the entire course playlist here: bit.ly/machinefriend
你的第一个 Kafka 应用
原文:https://towardsdatascience.com/your-first-kafka-application-9b1358ccb870?source=collection_archive---------17-----------------------
使用 Twitter API 生成和消费消息
概观
在上一篇 Kafka 帖子中,我们已经在 Linux Ubuntu 上安装了一个 Kafka 集群。在本文中,我将使用这个集群来创建一个生成和消费消息的 Kafka 应用程序。该应用程序将使用 Java (8+)编写。您还需要安装 maven 来运行它。
为了生成消息,我将使用 twitter API,使客户能够近乎实时地接收推文。每个 Twitter 帐户都可以访问流媒体 API,任何开发者都可以使用它来构建应用程序。
生成 Twitter API 密钥
去推特开发者:【https://developer.twitter.com/en/apps
创建一个新的应用程序,并填写所有最低要求的信息。转到“密钥和令牌”选项卡,将消费者密钥和机密对复制到一个文件中供以后使用。
点击“创建”生成访问令牌和密码。将它们复制到一个文件中。现在,您已经拥有了开发生成器所需的所有东西。
配置到 Kafka 代理的远程连接
要远程访问您的 Kafka 代理,请确保在 AWS 中打开端口 9092。
登录您的 AWS。转到您的实例描述选项卡,并单击安全组创建。包括端口 9092 的新入站规则。你可以限制你的 IP 地址,或者允许所有人访问。
使用上一篇文章中描述的 ssh 连接到你的 Ubuntu 服务器。
sudo nano /etc/kafka/server.properties
取消对以下行的注释,并插入 Kafka 服务器的公共 IPv4 公共 IP
advertised.listeners=PLAINTEXT://<IPv4 Public IP>:9092
重新启动 Kafka 代理:
sudo systemctl stop confluent-kafka
sudo systemctl start confluent-kafka
创建主题
运行以下命令,为演示创建 Kafka 主题:
kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic bigdata-tweets
克隆存储库
现在,让我们在本地机器上构建我们的应用程序。
完整的代码可以在我的 GitHub 这里找到。请克隆并安装此存储库。
git clone [git@github.com](mailto:git@github.com):mlomboglia/kafka-twitter.git
cd kafka-twitter
mvn clean install
运行 maven 后,您应该会看到:
Producer API 帮助您向 Apache Kafka 生成数据。我将连接到一个远程 Kafka 代理,使用 API 获取 Tweets 并将其发送到 Kafka 主题。
打开您选择的 IDE 并作为 maven 项目导入。
我会把我的命名为卡夫卡-推特
在TwitterConfiguration.java文件
中替换你的 Twiter 键,执行App.java,控制台将显示 tweets 被获取并发送给 Kafka 制作人。
mvn exec:java -Dexec.mainClass="com.mlombog.kafka.App"
这将通过一个简单的确认响应来触发回调。
按照上一篇文章中的解释,进入控制中心,你会在你的 bigdata-tweets 主题中看到消息
登录您的 Kafka 服务器并使用您的邮件:
kafka-console-consumer --bootstrap-server localhost:9092 --topic bigdata-tweets --from-beginning
恭喜你!!
最初发表于【https://marcoslombog.com】。
预测谁在泰坦尼克号灾难中幸存
原文:https://towardsdatascience.com/your-first-kaggle-competition-submission-64da366e48cb?source=collection_archive---------5-----------------------
你的第一次 Kaggle 竞赛提交-简单的方法
Photo by Joseph Barrientos on Unsplash
谷歌公司(Google Inc .)旗下的 Kaggle 是一个面向数据科学和机器学习从业者的在线社区。换句话说,这是你的数据科学之家,在这里你可以找到数据集并参加比赛。然而;我努力完成我的第一份参赛作品,因为,我会说,资源不当。我为这个比赛浏览了内核(读作'文章'),但是它们都不是为初学者设计的。我的意思是作为一个初学者,我不想看到我不能执行或解释的可视化,我只需要用简单的话来理解正在发生的事情。
但我终于成功了。如果你在这里是因为你也在努力开始使用 Kaggle,那么我的朋友,这篇文章将会让你的一天变得精彩。没有不必要的代码行或可视化,只是一个直接的路径到你的第一次提交。
砖墙的存在是有原因的。不是为了阻挡我们;而是给我们一个机会来展示我们有多想要某样东西。砖墙的存在是为了阻止那些不够想要的人。他们在那里阻止其他人。
—兰迪·波许
第 0 步——首先要做的事情
为了配合这个【Kaggle 入门教程,你需要做两件事。主要是,朝这个链接前进,给自己弄一个 Kaggle 账户。之后,请访问此链接,参加 Kaggle 泰坦尼克号比赛。搞定了?太好了。我们都准备好了。让我们现在做一些真正的工作。
第 1 步——了解您的数据
一旦报名参赛,就可以在大赛首页找到数据。为了加载和执行非常基本的数据操作,我使用了 Pandas ,这是一个 python 中的数据操作库。如果你还不知道,我建议你去看这个 10 分钟指南来熟悉一下。
在机器学习中,数据主要分为两部分——训练和测试(第三部分是验证,但你现在不必关心这个)。训练数据用于训练我们的算法,测试数据用于检查我们的算法执行得有多好。训练数据和测试数据之间的分割比通常在 70-30 左右。因此,这里我们总共有 891 个训练条目和 417 个测试条目。通过写入加载数据将得到 12 列,如下所示。我们称之为特性。没什么新的,只是一个花哨的名字。我鼓励你在前进之前至少浏览一遍数据。
PassengerId : int : Id
Survived : int : Survival (0=No; 1=Yes)
Pclass : int : Passenger Class
Name : object : Name
Sex : object : Sex
Age : float : Age
SibSp : int : Number of Siblings/Spouses Aboard
Parch : int : Number of Parents/Children Aboard
Ticket : object : Ticket Number
Fare : float : Passenger Fare
Cabin : object : Cabin
Embarked : object : Port of Embarkation
(C=Cherbourg; Q=Queenstown; S=Southampton)
此外,了解每个要素的数据类型也很重要。既然我们已经加载了数据并理解了它的样子,我们将继续进行特征工程。换句话说,衡量每个特征对我们输出的影响,也就是一个乘客是否幸存。
第二步——特征工程
正如我们所讨论的,特征工程是测量每个特征对输出的影响。但更重要的是,这不仅仅是使用现有的功能,而是创造新的功能,从而显著提高我们的产出。吴恩达说,“想出特色是困难的,耗时的,需要专业知识。应用机器学习基本上是特征工程。“我们将介绍我们正在使用的每个功能,以便您能够理解如何使用现有功能以及如何创建新功能。
2.1-乘客等级
显而易见,乘客的等级与存活率成正比。如果一个人比其他人更重要,他们会先从灾难中走出来。我们的数据告诉我们同样的故事。63%的人从 1 班幸存下来。所以这个功能肯定是有冲击力的。Pclass 列中的数据是完整的,因此不需要操作。
2.2——性
性别也很重要,并与存活率成正比。在这场悲剧中,妇女和儿童首先获救。我们可以看到 74%的女性得救了,而只有 18%的男性得救了。同样,这将影响我们的结果。
Feature 2 Output
2.3 —家庭规模
接下来的两列是 SibSp 和 Parch,它们与一个人是否幸存没有直接关系。这就是创建新功能的想法的来源。对于每一排/每一位乘客,我们将通过添加 SibSp + Parch + 1(他/她本人)来确定他/她的家庭规模。家庭规模从最小 1 人到最大 11 人不等,其中 4 人家庭的存活率最高,为 72%。
这似乎对我们的预测有很好的影响,但让我们更进一步,对人们进行分类,以检查他们是否独自在这艘船上。看了之后,它似乎对我们的产出有相当大的影响。
2.4 —已装船
乘客从哪个地方上船与生存有关(不一定)。那么,让我们来看看。在这个专栏里,有很多 NAs。为了解决这个问题,我们将 NAs 替换为“S ”,因为它是出现频率最高的值。
Feature 4 Output
2.5 —票价
该列中也有缺失的数据。我们不能以同样的方式处理每个特性。为了解决这个问题,我们将采用整个列的中间值。当您使用qcut
进行切割时,将选择箱,以便您在每个箱中有相同数量的记录(相等的部分)。翻看产量,相当可观。
Feature 5 Output
2.6 —年龄
年龄有一些缺失值。我们将用(平均年龄减去平均标准差)和(平均年龄加上平均标准差)之间的随机数来填充。之后,我们将它归入 5 个一组。这也有很好的影响。
Feature 6 Output
2.7 —名称
这个有点棘手。从姓名中,我们必须检索与该姓名相关联的头衔,即先生或上尉。为此,我们必须使用 Python 的正则表达式库(正则表达式操作指南)。首先,我们从名字中获取标题,并将它们存储在一个名为 title 的新列表中。之后,让我们通过缩小到常见的标题来清理列表。
就是这样。我们已经清理了我们的功能,现在可以使用了。然而;在我们将数据输入 ML 算法之前,还有一个步骤。ML 算法的特点是它们只接受数值而不接受字符串。因此,我们必须将数据映射为数值,并将列转换为整数数据类型。
步骤 3 —映射数据
映射数据很容易。通过浏览代码,你会知道它是如何工作的。一旦完成,现在我们必须选择使用哪些功能。特征选择与特征创建同样重要。我们将删除不必要的栏目,这样就不会影响我们的最终结果。
Final data that we will feed to ML algorithm
就是这样。你已经完成了最难的部分。看看你的数据,看起来真漂亮。现在,我们只需要预测我们的结果,这很容易。或者至少我会让你容易理解。
Jack, come on buddy, we’re almost there
步骤 4 —预测
正如我们所讨论的,我们需要训练和测试数据。是的,德鲁米尔,我们拿到了,现在怎么办?好极了。现在我们需要训练我们的模型。为此,我们需要提供两部分的数据——X 和 y。
X : X_train : Contains all the features
Y : Y_train : Contains the actual output (Survived)
为了进一步阐述,我们需要告诉我们的模型我们正在寻找这个输出。所以,它会这样训练。例如,你的朋友外出购物,你想要一副护目镜,你给你的朋友发了一张护目镜的照片,说你也想要一副。那是训练。你正在训练他/她,所以他可以通过解释特征(飞行员、旅行者)和提供准确的输出(护目镜的图片)来带来类似的护目镜。
我们已经分离了数据,现在我们调用我们的分类器,借助 scikit-learn 库的.fit
方法拟合数据(训练),并使用.predict
方法预测测试数据的输出。
注意——由于本教程是为初学者编写的,所以我不包括其他分类器,但过程是一样的。调用分类器,拟合数据,预测。以防你想进一步探索。还有其他几个分类器,但我使用决策树,因为根据我的知识,它最适合这个数据集。要了解更多关于决策树的知识,请参考这篇文章。
Yes, Tony, that’s great for the first time
第 5 步——你的第一次提交
最后,提交我们的输出。我们的输出.csv
文件应该只有两列——乘客 Id 和幸存者——正如竞争页面上提到的。创建并提交到竞赛页面,我的提交得分为 0.79425,在我写这篇文章的时候排名前 25%。
The position I got on the leaderboard, where do you sit?
我鼓励你探索不同的功能,以提高你的模型准确性和你在这场比赛中的排名。我很乐意听到你说你已经进入了前 5%或者更好,前 1%。你会在我的 GitHub 库上找到完整的代码。
尾注
希望这篇文章已经回答了你的首要问题“如何从 Kaggle 开始?”充足的知识、良好的资源和学习新事物的意愿是你前进所需的一切。你不必一开始就是主人。这一切都来自于坚持。如果你正在读这篇文章,你有足够的精力去实现你的目标,无论如何都不要停下来。如果你对这篇文章有疑问,请通过电子邮件或推特甚至 Linkedin 联系我。即使你没有任何疑问,我仍然希望在我的收件箱里看到你有价值的反馈或建议,如果有的话。
快乐学习。
你友好的邻居的超级智慧
原文:https://towardsdatascience.com/your-friendly-neighborhood-superintelligence-f905ff21dfa4?source=collection_archive---------16-----------------------
Martin, The Plains of Heaven
“如果类人猿问他们是否应该进化成智人(并说)‘哦,如果我们变成人类,我们会有很多香蕉’会怎么样?”—尼克·博斯特罗姆
我们的一个老故事是恶魔召唤变坏了。他们总是这样。我们的祖先想警告我们:小心那些提供无限力量的生物。这些天来,我们依赖于预示未来恶魔到来的计算实体——强大的人类水平的人工智能。幸运的是,我们的圣贤们,比如尼克·博斯特罗姆,现在正在思考比恶魔故事中的安抚、猴子的聪明和更强的魔法束缚更好的控制方法。在回顾了当前的想法后,我将提出一个更安全地获得人工智能超能力的协议。
智力爆炸的困境。
我们看到指针在 AI 上移动。许多,但不是所有的专家,部分受博斯特罗姆出版的书《T2 超级智慧》的激励,相信下面的场景。
在我们实现一种“强大的人工智能”之后,这种脱节将会发生,这种人工智能是如此全面,就像一个真正聪明的人。人工智能将变得越来越聪明,因为它吸收了越来越多的世界知识,并从中筛选,发现更好的思维模式和创意组合。
在某个时候,人工智能会重新设计自己,然后新的自我会重新设计自己——冲洗,重复——期待已久的智能爆炸就会发生。在这一点上,我们还不如吹口哨走过墓地,因为我们将无法控制接下来会发生什么。
博斯特罗姆说,我们可能会创造一个超级人工智能,类似于反复无常、可能怀有恶意的上帝。有害的组合是自主和无限的权力,正如他们在魔法时代所说的那样,没有咒语将他们与对我们无害且有益的价值观或目标捆绑在一起。
人工智能动物园。
博斯特罗姆按照不断增强的能力、精神自主性和对我们造成伤害的风险来想象人工智能的类型:
{工具→甲骨文→精灵→主权} 。
一个工具是可控的,就像今天的人工智能应用一样,但没有独创性,只能解决我们可以描述的问题,甚至可能解决我们自己更慢。一个神谕只会为我们解答难题,它自己没有任何目标。一个精灵会接受请求,想出答案或解决方案,然后实施它们,但之后会停下来等待下一个请求。一个主权国家就像一个永不停息的精灵,能够创造自己的目标。
博斯特罗姆展示了任何较弱的类型是如何演变成较强的类型的。人类总是想要更有效的帮助,因此给予他们的机器仆人更多的自由和权力。与此同时,这些仆人变得更有能力规划、操纵他人,并让自己变得更聪明:发展所谓的超能力,将他们推向主权范围的一端。
目标的问题。
博斯特罗姆的一个主要担忧是超级智能拥有错误的“最终目标”。在为最终目标服务时,不知疲倦而强大的人工智能可能会伤害它的人类创造者,无论是否有意伤害或关心所述伤害。
Degas, Autumn Landscape
博斯特罗姆的例子包括将地球上所有的原子(当然也包括我们自己的原子)变成回形针,或者将所有可用的物质都用到了 computronium 中来确定一些目标计算,比如数沙粒。
选择这些例子是为了显示超级人工智能的行为可能是多么任意。从人类的角度来看,这种疯狂的、强迫性的行为是愚蠢的,而不是聪明的。但是,如果人工智能缺乏我们认为理所当然的保护生命和环境的价值观,这种情况就可能发生。如果我们能够将这样的价值观传递给人工智能,我们能指望它会随着时间的推移保留这些价值观吗?博斯特罗姆和其他人认为会的。
作为身份的目标完整性。
想想我们生命中有多少时间是用来为最终目标服务的,比如爱情、权力、财富、家庭、友谊、推迟我们自己的死亡和消灭我们的敌人。这是我们时间的很大一部分,但不是全部。我们也渴望休闲、新奇的刺激和快乐。我们所有人都在做白日梦和幻想。极少数人甚至为了学习和创造而学习和创造。如果我们的动机是复杂的,为什么超级人工智能不会如此呢?
可以说,人类水平的人工智能将被激励在精神上探索它的世界,我们的世界,寻找项目,改变的事物,联系和提炼的想法。为了在动态环境中良好运行,它还应该做出最大化未来行动自由的选择。这反过来需要更广泛的探索性知识。
尽管如此,我们应该像博斯特罗姆那样假设,人工智能的特定目标可能会被狂热地追求。那么,很大程度上取决于我们对人工智能目标的某种控制。给定一个可以重写自己的编程代码的实体,如何做到这一点呢?
博斯特罗姆的答案是,人工智能的本质,因为它是由可变的软件组成的,事实上,是它的最终目标集。人类改变他们的价值观和目标,但是一个人被锁在一个身体/头脑中,这个身体/头脑以各种方式构成了它的身份和自我。我们首要目标是自我的生存。
另一方面,一个计算机化的代理由可以交换、借用、复制、重新开始和自我修改的可变部分组成。因此,系统并不是真正由这些部分构成的;它的本质是它的最终目标,博斯特罗姆称之为目的论(目标导向)线程。它的动机是不改变这些目标,因为这是确保他们在未来得到满足的唯一方法。
学习价值观:人类连贯的外推意志。
Raphael, The School of Athens
在最终目标稳定性的概念中有明显的循环,我读过的人中没有人认为超级人工智能的价值观真的不会改变。此外,人类的价值观是复杂的、动态的,而且常常是不相容的,所以我们不能相信任何一组开发人员会选择价值观并安全地将它们编程到我们的 AI 中。到目前为止,提出的解决方案依赖于让系统在一个过程中学习价值观,希望使它们:(1)对人类广泛可取和有帮助,(2)不太可能造成大破坏,例如人工智能“用笑脸贴上地球未来的光锥”或在每个人的大脑中安装愉悦电极,以及(3)构成一个起点和方向,在价值观和目标演变时保留这些品质。
反复出现的一个技巧是对初始人工智能(通常称为“种子人工智能”)进行编程,其主要目标是找出与人类兼容的值应该是什么。这为一个非常困难的问题应用了新的智能,这意味着对所述值的持续改进是系统本质的一部分。
一篇早期的论文(“连贯的外推意志”),它机智、独到、精彩;机器智能研究所的 Eliezer Yudkowsky 称这种学习过程的目标为“连贯的外推意志”或 CEV。意志因为这是我们真正想要的,而不是我们通常所说的我们想要的,这被自我和社会欺骗所掩盖。Yudkowsky 说:“如果你找到一个能给你三个愿望的精灵瓶子…把精灵瓶子密封在一个上锁的保险箱里…除非精灵关注你的意志,而不仅仅是你的决定。”外推因为要搞清楚。因为它需要在我们无数的意识形态、政治、社会、宗教和道德体系背后找到共同点。
CEV 是否可能。
也许你会被一个 CEV 可能认可的人类行为规范吓到,你会发现这些规范是完全排斥的,然而这些规范却被相当一部分人类所接受。同样,对于其他人来说,你的想法是令人厌恶的。对于我们在这些问题上的分歧,假定的解决办法是 CEV 的“连贯”方面。也就是说,通过更好的思考和更广泛的知识,人工智能可以找到我们的道德共同点,并以我们足够多的人可以同意的方式表达它。我想到了“猪食”这个词,我想知道是否有哲学家已经在写一本关于为什么 CEV 永远行不通的书了。但是让我们更深入地看看。
Yudkowsky 把目标放在他(作为一个 AI 硬汉)所谓的诗意术语中:“(一个 CEV 是)我们的愿望是,如果我们知道得更多,思考得更快,更像我们希望的那样,在一起成长得更远;外推收敛而不是发散,我们的愿望一致而不是干涉;按照我们希望的那样推断,按照我们希望的那样解释。”
因此,请想一想,我们实际上从未尝试过这样的事情:一位受人尊敬的杰出思想家考虑了我们所有不同的道德关切,并找到了所有国家和信仰中最受尊敬的人都能认同的文明原则。如果你在写剧本,这种尝试将会失败,直到人工智能给人类一些有巨大价值的礼物,一个古老问题的解决方案。这使得公众对人工智能的态度发生了翻天覆地的变化,它现在被视为恩人,而不是魔鬼。这个比喻暗示了高级人工智能项目开放和国际化的必要性。
自从 Yudkowsky 的第一篇论文以来,CEV 的想法已经获得了关注,无论是在博斯特罗姆的重要著作中还是在其他地方(Steve Petersen,super intelligence as super ethical)。思想家们试图确定 CEV 过程的初始机制,如指定目标内容的方法、决策理论、知识理论及其现实世界基础,以及人工智能 CEV 发现的人类认可程序。对于 CEV 来说,如果没有一个好的伦理一致性理论,这些哲学技巧仍然是无用的。即,如何在各种“关于世界如何的信念和关于世界应该如何的愿望”之间找到一致性(Petersen,见上文)显然,一个强大的人工智能项目的成功和后果现在不仅取决于深奥的计算机科学,还取决于实用且非常重要的哲学。
思维主义、科学和超能力。
人们常说,智能爆炸会发生得如此之快,以至于我们没有时间以任何方式做出反应或引导它。这种信念被凯文·凯利嘲笑为依赖于“思维主义”,即智力本身可以导致进步的爆发。根据凯利的说法,思维主义忽略了一个已经证明的事实:新的力量需要关于自然的新知识,而你必须做科学——包括观察和实验——来获得新知识。科学需要时间和物质资源。一个新的人工智能,目标是让自己变得更好,或者解决任何困难的问题,它将如何进行科学研究?
博斯特罗姆认为人工智能有很多“超能力”可以被激发去发展。这些将是有用的,因为它们将服务于许多其他目标和项目。一个超级大国是技术研究,这也是科学研究的推动者和范例。
避免什么:作为邦德反派的人工智能恶魔。
假设我们决定通过严格限制人工智能对物理世界的访问来限制它,实际上让它依赖我们来执行(但可能不是设计)技术研究。这使得它只剩下另外四个(博斯特罗姆确定的)超级大国来开始进行新的研究:制定战略、社会操纵、系统黑客和经济生产率。一个物理上孤立的人工智能可以通过学习人类历史、心理学和政治方面的记录知识来自学如何操纵人。然后,它将使用先进的战略来间接获得对资源的控制,然后使用这些资源作为一个楔子来提高其他超级大国。
就像詹姆斯·邦德故事中的反派一样,人工智能可能会首先培养自己的真正信徒、理想主义者、愤世嫉俗者和反社会者。这些将有助于它获得和操作可能的秘密实验室和其他企业。它可以绕过一些繁琐的科学研究:不需要发表论文和同行评议,没有拨款申请和进展报告。但是仅仅这样还不足以让超级人工智能加快速度。它将需要开发自己的机器人,并可能找到一种方法来创造僵尸人类,以应对正常人的反对。
一个安全的甲骨文人工智能的愿景。
假设一个人工智能可以与物理资源的直接访问充分隔离,并且它的通信只能发生在公共信道上。后一种情况将防止秘密操纵人,也将减少人类对人工智能偏袒特定派别的恐惧。此外,假设一个工具级的半人工智能(也锁定到公共专用频道)可用于分析公开通信,以寻找隐藏消息的证据,这些隐藏消息可能被种子人工智能用来操纵盟友或骗子释放它。这种人工智能的人类治理将保留能力和权力,以在出现问题时物理地关闭它。
它能为我们做什么。
这样的人工智能可能被认为是一个安全的先知和整个世界的顾问。它可以被允许以只读方式访问人类知识和艺术的很大一部分。它将开始了解我们的最佳技术:从现有知识中产生想法、外推推理、战略规划和决策理论,以帮助它回答对人类福祉至关重要的问题。
也许对于一个先知来说,首要的任务应该是对有助于 CEV 的步骤提出建议,包括更好的理论,比如价值澄清和决策,以及一系列哲学问题。这些任务的结果,以及随之而来的 CEV 的第一稿,就像是人类/人工智能文明的结合体。它可以让我们以更安全、更缓慢、非爆炸性的方式起飞,达到博斯特罗姆和其他深层思想家所希望的超级智能。
在其开发过程中的某个时刻,甲骨文人工智能会给我们提供关于如何处理环境、政治、社会和经济问题的深思熟虑、解释清楚的意见。关于设定 R&D 优先事项的建议将有助于我们避免其他各种生存风险,如气候、纳米技术、核战争和小行星。甲骨文将继续完善它或它的继任者人工智能可以保持的价值和动机框架,如果我们决定让它走出封闭的盒子,到野外去。
减缓爆炸。
公共 oracle 方法允许我们获得“人类级别”人工智能的更好思维和更广泛信息覆盖的早期优势。它试图将人类的派系斗争和利益争夺最小化。一个公开的甲骨文项目有很多障碍。首先,它必须是第一个成功的强人工智能。如果一个不太安全的项目首先发生,公共预言可能永远不会发生。博斯特罗姆提出了一个强有力的案例,即第一个人工通用智能如果没有足够的控制或良性的最终目标,将会爆炸成一个“单体”,一个几乎控制一切的非道德实体。不只是一个恶魔,而是一个不受约束的神。
任何爆炸性的起飞对人类来说都是不祥之兆。获得较慢起飞的最佳方式是一个包括许多人的项目,他们必须在采取每一个重要步骤之前达成一致。可能只有当我们已经从其他一些生存挑战中幸存下来,比如濒临环境崩溃的时候,我们才会有这种合作的动机。
一个缓慢的项目有一个缺点:它可能会抢先到达终点。博斯特罗姆已经确定了(“人工智能开发中开放的战略含义”)这里的另一个转折。一个缓慢的、包容的项目需要公开它的开发过程。开放可以增加竞争项目的可能性和竞争力。安全需要时间,所以最不关注安全的项目赢得了强人工智能的比赛,然后“啊哈!”。同样,一个单一的缓慢而包容的项目预示着最好的结果。
一个安全友好的强人工智能的挑战可以是富有成效的,即使我们距离制造一个人工智能还有几十年的时间。它迫使我们寻找更好的关于如何成为一个成熟物种的想法;如何不总是搬起石头砸自己的脚?
你的 2020 年自动驾驶汽车人工智能指南
原文:https://towardsdatascience.com/your-guide-to-ai-for-self-driving-cars-in-2020-218289719619?source=collection_archive---------3-----------------------
深度学习是基础
Source
想获得灵感?快来加入我的 超级行情快讯 。😎
自动驾驶汽车,也被称为自主汽车,是能够在很少或没有人类输入的情况下驾驶的汽车。一辆完全自动驾驶的汽车将能够独自把你从洛杉矶开到纽约,而你可以坐下来,放松,享受平稳的旅程。
自动驾驶汽车最近受到了极大的关注,这在很大程度上是由于人工智能的技术繁荣。就在过去几年里,人工智能已经从几乎被遗忘变成了全世界许多组织最大的研发投资。
简而言之,人工智能赋予了我们自动化大量手工工作的能力,这些工作以前需要某种形式的人类知识或技能。在自动驾驶汽车的情况下,人工智能可以帮助成为汽车的大脑,做一些事情,如自动检测车辆周围的人和其他汽车,停留在车道上,转换车道,并跟随 GPS 到达最终目的地。
那么所有这些是如何工作的呢?科学家、工程师和软件开发人员是如何给计算机编程让它们驾驶汽车的?
自动驾驶技术概述
自治程度
谈到自动驾驶汽车,大多数技术专家都会提到 自主级别 。自动驾驶汽车的自主水平指的是相对于人类,有多少驾驶是由计算机完成的。级别越高,计算机完成的驾驶就越多。请查看下面的插图。
- 0 级:汽车的所有功能和系统都由人控制
- 级别 1: 像巡航控制、自动刹车或检测盲点中的东西这样的小事情可能由计算机控制,一次一个
- 第二级:电脑可以同时执行至少两项自动化功能,比如加速和转向。安全操作和紧急程序仍然需要人
- Level 3 :电脑可以同时控制汽车的所有关键操作,包括大多数情况下的加速、转向、停车、导航和驻车。仍然希望有人类驾驶员在场,以防他们被警告有紧急情况
- Level 4 :这款车是全自动驾驶的,在的一些驾驶场景中,完全不需要人类驾驶员。例如,汽车可以在晴天或阴天完全自动驾驶,但在下雪和车道被覆盖时就不行
- 第五关:这辆车完全能够在任何情况下自动驾驶
我们今天在新闻中听到的大多数自动驾驶汽车,如特斯拉和 Waymo 制造的汽车,都处于第 2 级。他们已经达到了可以自己驾驶的水平,但是仍然需要人类驾驶员来确保车辆的安全操作。
自驾的各个阶段
今天的自动驾驶汽车使用各种尖端硬件和软件技术的组合来执行驾驶。典型的自动驾驶系统将经历 3 个阶段来执行其驾驶。出于本文的目的,我们将这些称为传感、理解和控制。
在感测阶段,摄像机和各种传感器用于观察汽车周围的任何物体,如其他汽车、人、自行车和动物。真的是车的眼睛,不断看到周围的一切,360 度。
在理解阶段,各种人工智能算法,主要是计算机视觉,被用来处理来自传感器的信息。例如,我们可能有一个计算机视觉系统,它处理来自汽车周围摄像头的视频,以检测汽车周围道路上的所有其他汽车。理想情况下,这种系统能够检测出汽车的位置、大小、速度和行驶方向。实际上,这些系统被设计用来绘制汽车周围的整个环境。所有这些信息都将被输入自动驾驶的控制阶段。
在控制阶段,自动驾驶系统将处理计算机视觉系统能够提取的所有信息。基于这些信息,它将控制汽车。通过了解所有的周围环境,汽车周围有什么以及它是如何变化的,控制系统的工作就是安全地移动汽车并驶向目的地。如果前车减速,它会启动刹车,如果需要退出,它会切换车道,如果下雨,它会打开雨刷。
我们将更详细地了解每个阶段。
(1)传感器
当我们人类开车时,我们用眼睛看周围的东西。自动驾驶汽车也需要眼睛来看。自动驾驶汽车的眼睛是它的各种传感器。大多数自动驾驶汽车使用 3 种不同传感器中的一种或某种组合:摄像头、雷达和激光雷达。
摄像机
相机和我们自己的视力最相似。他们捕捉连续的照片,也就是像我们一样通过镜头拍摄视频。就像我们自己的视力一样,如果汽车的摄像头可以捕捉高质量的视频——高分辨率和高 FPS,这对驾驶有很大的帮助。
无人驾驶汽车将在每一面都放置摄像头:前、后、左、右等等,以便能够全方位地看到周围的一切。有时,会混合使用不同类型的相机——一些广角相机有更宽的视野,一些窄但高分辨率的相机看得更远。
使用相机的好处是它们是世界最自然的视觉呈现。汽车看到的和人类司机看到的完全一样——而且更多,因为它的内部计算机可以同时通过所有的摄像头进行观察。相机也很便宜。
缺点是相机捕捉的数据,即图像和视频,无法让我们了解其他物体离汽车有多远,或者它们的移动速度有多快。摄像机在晚上也很难使用,因为我们根本看不到太多东西。
雷达
雷达传统上被用于探测移动物体,如飞机和天气状况。它的工作原理是以脉冲形式发射无线电波。一旦这些波击中一个物体,它们就会反弹回传感器,给出物体的速度和位置数据。
在自动驾驶汽车中,雷达用于检测汽车周围各种物体的速度和距离。这是对相机的完美补充,相机可以看到物体是什么,但不能精确地知道它们在哪里(有多远)。就像摄像头一样,雷达将在汽车周围 360 度使用。
在光线较暗的情况下,如夜间驾驶,雷达也是摄像头的补充。因为雷达发射信号,所以不管是凌晨 3 点还是中午,信号都以完全相同的方式移动和反射。这与相机形成了鲜明的对比,因为光线的原因,相机在晚上真的不能很好地工作。
雷达的缺点是这种技术目前的精确度有限。当前的雷达传感器提供非常有限的分辨率。因此,雷达确实给了我们其他物体的距离、位置和速度的概念,但这种概念有些模糊——不像我们希望的那样准确。
激光雷达
激光雷达代表光探测和测距。它的工作原理是发出光束,然后计算光线击中物体并反射回激光雷达扫描仪所需的时间。然后可以使用光速计算到物体的距离——这些被称为 飞行时间 测量。
A Waymo car with LiDAR sensor on top. Source
激光雷达传感器通常放置在汽车顶部,每秒发射数千束光束。基于收集的数据,可以创建称为 点云 的 3D 表示来表示汽车周围的环境。
激光雷达传感器的最大优势是其准确性。一个好的激光雷达传感器可以识别距离 100 米远的物体仅几厘米的细节。例如,据说 Waymo 的激光雷达系统甚至可以检测到一个人正在哪个方向行走,基于他们来自激光雷达的精确 3D 点云。
激光雷达的缺点是成本,目前比相机和雷达贵 10 倍。
(2)计算机视觉
自动驾驶系统的理解阶段是大脑——它是大多数主要处理发生的地方。在理解阶段,目标是获取来自传感器的所有信息并对其进行解释。这种解释的目的是收集有用的信息,可以帮助安全地控制汽车。这些信息可以是:
- 我周围的物体是什么,它们在哪里,它们是如何运动的?所以我们的系统可能会检测到像人、汽车和动物这样的东西
- 我在哪里?该系统将确定所有车道的位置,以及汽车是否完全在正确的车道上,或者汽车相对于道路上其他汽车的位置(太近、盲点等)
在 2019 年,这些信息主要是通过人工智能获得的,更具体地说,是使用计算机视觉的深度学习。大型神经网络被训练用于诸如图像分类、物体检测、场景分割和车道检测的任务。然后,网络会针对汽车的计算单元进行优化,以便能够处理自动驾驶所需的实时速度。
Semantic Segmentation for Self-Driving. Source
请记住,自动驾驶汽车可能有来自多个不同来源的数据:摄像头、雷达和激光雷达。因此,所有这些常规的计算机视觉任务都可以应用于各种传感器数据,从而以非常全面的方式收集关于汽车周围环境的信息。这也产生了一种冗余——如果一个系统出现故障,另一个系统仍有机会进行检测。
使用深度学习来完成这些任务的好处在于,网络是可训练的。我们给他们的数据越多,他们得到的就越多。公司正在大力利用这一点——自动驾驶汽车被放在路上,车上有人类司机,他们可以不断收集新的训练数据来提高自己。
计算机视觉真的是自动驾驶汽车系统的核心。一个理想的系统将能够准确地检测和量化汽车周围环境的每一个方面——移动物体、静止物体、路标、路灯——绝对是一切。所有这些信息都被用来决定汽车下一步应该如何行驶。
(3)控制
一旦计算机视觉系统处理了来自传感器的数据,自动驾驶汽车现在就拥有了驾驶所需的所有信息。控制阶段的作用是根据理解阶段提取的信息,找出如何最好地驾驶汽车。
描述自动驾驶汽车如何导航道路的技术术语是路径规划。路径规划的目标是使用计算机视觉系统捕获的信息安全地引导汽车到达目的地,同时避开障碍物并遵循道路规则。
汽车将基于 GPS 了解其目标目的地——来自 GPS 的数据包含长距离路径的信息。为了向其目标目的地移动,自动驾驶系统将首先“规划路径”,即计算到达其目标的最佳(读取:最短时间)路径。这意味着决定走哪条路,开多快。
一旦确定了最佳路径,系统的下一步就是确定最佳可能的“下一步行动”。该下一步移动将再次总是基于沿着最优路径到达其目标目的地。下一步可能是加速、刹车、变换车道或任何其他常规驾驶动作。
同时,它的任何举动都必须遵守道路规则,维护汽车乘客的安全。如果计算机视觉检测到前方有红灯,那么汽车应该减速或停下来(取决于它有多远)。
所有这些控制都直接发送到汽车的机械控制。如果汽车需要变换车道,那么一个将方向盘转动一个非常具体的量的命令被发送到汽车的适当部分。如果汽车需要刹车,就会发出命令,以所需的精确压力踩下刹车,减速到足以遵循最佳路径,同时保持安全并遵守道路规则。
这个感知、理解和控制的过程尽可能频繁和精确地重复,直到汽车到达目的地。
自动驾驶领域的大玩家
自动驾驶汽车和更普遍的自动驾驶汽车有可能成为一个数万亿美元的产业。伴随着巨大的机遇而来的是激烈的竞争,而这一领域并不缺乏这种竞争。有几个大玩家。
特斯拉
特斯拉,尤其是埃隆·马斯克(Elon Musk)在电视上时,对他们的汽车没有使用激光雷达摄像头感到自豪。相反,他们主要依靠位于汽车周围的 8 个标准摄像头。然后,他们训练一个多头卷积神经网络(CNN)来检测汽车周围的一切,并相应地执行导航。
特斯拉自动驾驶技术的真正威力在于它的软件。通过软件更新,可以快速轻松地将汽车上运行的模型更新部署到全球所有特斯拉汽车上。快速简单的软件更新意味着特斯拉汽车在不断改进,用户无需支付任何额外费用或注意力。
特斯拉还利用其自动驾驶车队进行数据收集。所有配有适当摄像头的特斯拉汽车都用于收集新的训练数据。所有这些数据都用于重新训练模型,并再次部署到整个车队。这是一个自动化的迭代管道,用于持续改进自治系统。
A rear camera on a Tesla car, used for self-driving. Source
Waymo
Waymo 是谷歌旗下的自动驾驶汽车公司。Waymo 的一大优势是,他们为自己的汽车制造自己的专有硬件。这包括传感器(相机、雷达和激光雷达)以及用于运行计算机视觉推理的定制芯片。这使得 Waymo 汽车能够实现最佳的硬件和软件优化。
通常,激光雷达的一个大缺点是成本。然而,Waymo 声称已经开发了自己的激光雷达传感器,比竞争对手便宜 90%。这种传感器据称还能探测到 300 米外的物体。如果在这个范围内保持任何像样的精度水平,那么它为 Waymo 汽车提供了超越 Telsa 的巨大优势。普通相机根本看不到那么远。
Waymo 还在寻求与包括克莱斯勒、丰田、雷克萨斯和捷豹在内的大型汽车公司建立合作伙伴关系。
优步和 Lyft
优步和 Lyft 都是非常受欢迎的打车公司,处于从无人驾驶汽车中获利的绝佳位置。他们正在建立自己的自动驾驶汽车车队,配备摄像头、雷达和激光雷达——在 Lyft 的情况下是多个激光雷达。
与传统汽车公司不得不出售配备自动驾驶功能的整车(价格昂贵)不同,优步和 Lyft 的目标是建立一支自动驾驶汽车车队,供他们的拼车服务使用。这将有效地消除对人类驾驶员的需求,从而降低成本。任何地方的任何人都可以订购无人驾驶汽车,价格与呼叫优步或 Lyft 差不多。它变成了自动驾驶服务。
我们离 5 级自驾还有多远?
在看到所有这些未来技术和正在取得的重大进步后,人们不禁要问:我们离全面的 5 级自动驾驶汽车还有多远?
看情况。
一些人认为这项技术不到几年就能实现。埃隆·马斯克声称“一年后,我们将拥有超过一百万辆完全自动驾驶的汽车”。这当然是可能的。
随着数十亿美元的资金被投入到尖端研究中,人工智能正在以令人难以置信的速度发展。用于传感和计算的硬件正在改善,特别是因为公司现在正在投资用于自动驾驶的定制硬件。因此,这项技术看起来肯定是朝着正确的方向发展。
如果我们从技术领域的另一个角度来看,事情会变得更加复杂。
为了让自动驾驶汽车被人们接受并在日常生活中使用,他们真的需要尽善尽美。当另一个人犯了一个小错误时,我们人类会宽容得多,但当计算机或机器犯了错误时,我们会严厉批评。
电脑应该只是工作,没有任何错误。他们毕竟是机器,所以期望值要高得多。我们常常期望机器比我们自己精确一个数量级或者更精确。门槛只是高了很多。
除此之外,我们还有法律方面的考虑。你可以打赌,一旦自动驾驶完全上路,新的法律法规将不得不出台。
万一发生事故,谁应负责任?既然是自动驾驶,汽车现在应该能开得更快吗?人类必须一直呆在车里吗?这些都是自动驾驶汽车在某个时候必须回答的问题,才能真正在第 5 级全面上路。
总的来说,自动驾驶汽车对社会来说是一大利好。当汽车成为自动驾驶时,更少的污染、更少的交通、更高的效率和更安全的驾驶都是可以预期的。这项技术正朝着正确的方向发展,并有望带来一个光明、自主的未来。
自然语言处理(NLP)指南
原文:https://towardsdatascience.com/your-guide-to-natural-language-processing-nlp-48ea2511f6e1?source=collection_archive---------0-----------------------
机器如何处理和理解人类语言
我们表达的一切(无论是口头还是书面)都携带着大量的信息。我们选择的主题,我们的语气,我们选择的词语,每一件事都增加了某种类型的信息,可以被解读并从中提取价值。理论上,我们可以利用这些信息理解甚至预测人类行为。
但有一个问题:一个人可能会在一份声明中产生数百或数千个单词,每个句子都有其相应的复杂性。如果你想在一个给定的地理范围内扩展和分析数百、数千或数百万的人或声明,那么情况就不可收拾了。
从对话、声明甚至推文中生成的数据是非结构化数据的例子。非结构化数据并不完全符合关系数据库的传统行列结构,而是代表了现实世界中可用的绝大多数数据。这是混乱和难以操纵的。然而,由于机器学习等学科的进步,关于这个话题正在发生一场大革命。如今,人们不再试图根据关键词来解释文本或演讲(老式的机械方法),而是理解这些词背后的含义(认知方法)。这样就有可能检测出像反语这样的修辞,甚至进行情感分析。
自然语言处理或 NLP 是人工智能的一个领域,它赋予机器阅读、理解人类语言并从中获取意义的能力。
它是一个专注于数据科学和人类语言之间的交互的学科,并且正在扩展到许多行业。如今,由于数据访问的巨大改进和计算能力的增强,NLP 正在蓬勃发展,这使得从业者能够在医疗保健、媒体、金融和人力资源等领域取得有意义的成果。
自然语言处理的使用案例
简单地说,NLP 代表了像语音或文本这样的自然人类语言的自动处理,尽管这个概念本身很吸引人,但这项技术背后的真正价值来自用例。
NLP 可以帮助你完成很多任务,应用领域似乎每天都在增加。让我们举一些例子:
- NLP 能够根据电子健康记录和患者自己的语音识别和预测疾病。这种能力正在从心血管疾病到抑郁症甚至精神分裂症的健康状况中进行探索。例如,亚马逊理解医疗是一项使用自然语言处理从患者笔记、临床试验报告和其他电子健康记录中提取疾病状况、药物和治疗结果的服务。
- 组织可以通过识别和提取社交媒体等来源中的信息来确定客户对服务或产品的看法。这种 情绪分析 可以提供大量关于客户选择及其决策驱动因素的信息。
- IBM 的一位发明家开发了一种认知助手,它像一个个性化的搜索引擎一样工作,通过学习你的一切,然后在你需要的时候提醒你一个名字、一首歌或任何你不记得的事情。
- 像雅虎和谷歌这样的公司用 NLP 过滤和分类你的电子邮件,通过分析流经他们服务器的电子邮件中的文本,在垃圾邮件进入你的收件箱之前阻止它们。
- 为了帮助识别假新闻,麻省理工学院的 NLP 小组开发了一个新系统来确定消息来源是否准确或带有政治偏见,检测新闻来源是否可信。
- 亚马逊的 Alexa 和苹果的 Siri 是智能语音驱动界面的例子,它们使用 NLP 来响应语音提示,并做任何事情,如找到特定的商店,告诉我们天气预报,建议去办公室的最佳路线或打开家里的灯。
- 洞察正在发生的事情和人们正在谈论的话题对 金融交易员 来说是非常有价值的。NLP 被用来跟踪新闻,报道,关于公司间可能合并的评论,一切都可以被整合到一个交易算法中以产生巨大的利润。记住:买谣言,卖新闻。
- NLP 还被用于 人才招聘 的搜索和选择阶段,识别潜在雇员的技能,并在他们活跃在就业市场之前发现前景。
- 在 IBM Watson NLP 技术的支持下, LegalMation 开发了一个平台来自动化日常诉讼任务并帮助法律团队节省时间、降低成本和转移战略重点。
自然语言处理在医疗保健行业发展尤为迅速。在医疗保健组织越来越多地采用电子健康记录的同时,这项技术正在改善护理服务、疾病诊断并降低成本。事实上,临床记录可以得到改善,这意味着患者可以通过更好的医疗保健得到更好的理解和受益。目标应该是优化他们的体验,一些组织已经在这方面努力了。
Number of publications containing the sentence “natural language processing” in PubMed in the period 1978–2018. As of 2018, PubMed comprised more than 29 million citations for biomedical literature
像 Winterlight Labs 这样的公司通过语音监测认知障碍,在阿尔茨海默病的治疗方面取得了巨大进展,他们还可以支持各种中枢神经系统疾病的临床试验和研究。遵循类似的方法,斯坦福大学开发了一个聊天机器人治疗师,目的是帮助患有焦虑和其他疾病的人。
但是围绕这个主题有严重的争议。几年前,微软展示了通过分析搜索引擎查询的大量样本,他们可以识别出患有胰腺癌的互联网用户甚至在他们收到该疾病的诊断之前。用户对这样的诊断会有什么反应?如果你被检测为假阳性会怎么样?(意思是即使你没有患病,也可以被诊断出患有这种疾病)。这让人想起了谷歌流感趋势的案例,该趋势在 2009 年被宣布能够预测流感,但后来由于准确性低和无法满足其预测率而消失。
NLP 可能是未来有效临床支持的关键,但短期内仍有许多挑战要面对。
基本的自然语言处理给你的非自然语言处理的朋友留下深刻印象
我们现在面对的 NLP 的主要缺点是语言非常复杂。理解和操作语言的过程极其复杂,因此在将所有东西结合在一起之前,通常会使用不同的技术来应对不同的挑战。像 Python 或 R 这样的编程语言经常被用来执行这些技术,但是在深入研究代码行之前(这将是另一篇文章的主题),理解它们下面的概念是很重要的。让我们总结并解释一下 NLP 中定义术语词汇表时最常用的一些算法:
袋字
是一个常用的模型,允许您计算一段文本中的所有单词。基本上,它为句子或文档创建一个出现矩阵,不考虑语法和词序。这些词频或出现次数然后被用作训练分类器的特征。
举个简短的例子,我引用了甲壳虫乐队的歌曲《穿越宇宙》的第一句话:
文字像无尽的雨水一样流入纸杯,
它们滑过,滑过宇宙
现在让我们数数单词:
这种方法可能反映了几个缺点,如缺乏语义和上下文,以及阻止单词(如“the”或“a”)的事实给分析增加了噪声,并且一些单词没有相应地加权(“universe”的权重小于单词“them”)。
为了解决这个问题,一种方法是根据单词在所有文本(不仅仅是我们正在分析的文本)中出现的频率来重新调整单词的频率,以便像“the”这样在其他文本中也经常出现的频繁单词的分数会受到惩罚。这种评分方式被称为“词频—逆文档频率”(TFIDF) ,通过权重来提高单词包。通过 TFIDF,文本中频繁出现的术语会得到“奖励”(如我们示例中的单词“他们”),但如果这些术语在我们包含在算法中的其他文本中频繁出现,它们也会受到“惩罚”。相反,这种方法突出显示并“奖励”考虑所有文本的独特或罕见的术语。然而,这种方法仍然没有上下文和语义。
标记化
是将连续文本分割成句子和单词的过程。本质上,它的任务是将文本切割成称为记号的片段,同时丢弃某些字符,如标点符号。按照我们的例子,标记化的结果将是:
很简单,对吧?虽然在这种情况下,以及在像英语这样的用空格分隔单词的语言(称为分段语言)中,这看起来很基本,但并不是所有语言的行为都是一样的,如果你仔细想想,空格本身并不足以让英语执行正确的标记化。在空格处进行拆分可能会将应该被视为一个标记的内容分开,例如某些名称(例如旧金山或纽约)或借用的外国短语(例如自由放任)。
标记化也可以去除标点符号,简化了正确分词的过程,但也引发了可能的复杂性。对于缩写后面的句点(例如 dr .),该缩写后面的句点应被视为同一令牌的一部分,不能删除。
在处理包含大量连字符、括号和其他标点符号的生物医学文本领域时,标记化过程可能会特别成问题。
关于标记化的更深入的细节,你可以在这篇文章中找到很好的解释。
停止文字删除
包括去掉英语中常见的冠词、代词和介词,如“and”、“the”或“to”。在这个过程中,一些看起来对 NLP 目标提供很少或没有价值的非常常见的单词被过滤并从要处理的文本中排除,因此移除了对相应文本没有信息性的广泛和频繁的术语。
通过在预定义的关键字列表中执行查找,可以安全地忽略停用词,从而释放数据库空间并缩短处理时间。
没有通用的停用词列表。这些可以预先选择或从头开始构建。一种可能的方法是从采用预定义的停用词开始,然后将词添加到列表中。然而,似乎过去的总趋势是从使用大的标准停用词表到根本不使用词表。
问题是停用词删除可以删除相关信息并修改给定句子中的上下文。例如,如果我们正在执行情感分析,如果我们删除了像“不”这样的停用词,我们可能会使我们的算法偏离轨道。在这些情况下,您可以选择一个最小的停用词列表,并根据您的特定目标添加额外的术语。
词干
指的是为了去除词缀(词根的词汇附加物)而对单词的结尾或开头进行切片的过程。
附在单词开头的词缀称为前缀(如单词“astrobiology”中的“astro”),附在单词末尾的词缀称为后缀(如单词“helpful”中的“ful”)。
问题是词缀可以创造或扩展同一个词的新形式(称为屈折词缀),甚至可以自己创造新词(称为派生词缀)。在英语中,前缀总是派生的(词缀创造了一个新词,如单词“生态系统”中的前缀“生态”),但后缀可以是派生的(词缀创造了一个新词,如单词“吉他手”中的后缀“ist”)或屈折的(词缀创造了一个新的单词形式,如单词“faster”中的后缀“er”)。
好的,那么我们如何区分这两者的不同并切掉正确的部分呢?
一种可能的方法是考虑常见词缀和规则的列表(Python 和 R 语言有不同的包含词缀和方法的库)并基于它们执行词干提取,但当然这种方法存在局限性。由于词干分析器使用算法方法,词干分析过程的结果可能不是一个实际的单词,甚至不会改变单词(和句子)的意思。为了抵消这种影响,您可以通过添加或删除词缀和规则来编辑那些预定义的方法,但是您必须考虑到,您可能在一个方面提高了性能,而在另一个方面却降低了性能。总要纵观全局,测试你的模型的性能。
那么,如果词干有严重的局限性,我们为什么要使用它呢?首先,它可以用来纠正单词的拼写错误。词干分析器使用简单,运行速度非常快(它们在字符串上执行简单的操作),如果速度和性能在 NLP 模型中很重要,那么词干分析器无疑是一个不错的选择。请记住,我们使用它的目的是提高我们的表现,而不是作为一个语法练习。
词汇化
目标是将一个单词简化为其基本形式,并将同一个单词的不同形式组合在一起。例如,将过去时态的动词改为现在时态(如“got”改为“go”),统一同义词(如“best”改为“good”),从而规范与词根意义相近的词。虽然它似乎与词干化过程密切相关,但词汇化使用不同的方法来获得单词的词根形式。
词汇化将单词解析为它们的字典形式(称为词条),为此它需要详细的字典,算法可以在其中查看单词并将单词链接到它们相应的词条。
比如“跑”、“跑”、“跑”这些词都是“跑”这个词的形式,所以“跑”就是前面所有词的引理。
词汇化还考虑了单词的上下文,以便解决其他问题,如消歧,这意味着它可以根据特定的上下文区分具有不同含义的相同单词。想想像“蝙蝠”(可以对应于动物或棒球中使用的金属/木制球杆)或“银行”(对应于金融机构或水体旁边的土地)这样的词。通过为一个单词(无论是名词、动词等等)提供一个词性参数,就有可能为该单词在句子中定义一个角色并消除歧义。
正如您可能已经想到的,与执行词干处理相比,词汇化是一项更加耗费资源的任务。同时,由于它比词干法需要更多的语言结构知识,它比建立或修改词干算法需要更多的计算能力。
话题建模
是一种揭示文本或文档集合中隐藏结构的方法。本质上,它对文本进行聚类,根据内容发现潜在主题,处理单个单词,并根据它们的分布为它们赋值。这种技术是基于这样的假设,即每个文档都是由主题混合而成的,每个主题都是由一组单词组成的,这意味着如果我们能发现这些隐藏的主题,我们就能解开文本的含义。
从话题建模技术的论域来看,潜在狄利克雷分配(LDA) 可能是最常用的。这种相对较新的算法(发明于不到 20 年前)作为一种无监督的学习方法,可以发现一组文档背后的不同主题。在像这样的无监督学习方法中,没有输出变量来指导学习过程,数据由算法探索以发现模式。更具体地说,LDA 通过以下方式查找相关单词组:
- 将每个单词分配给一个随机的主题,用户可以定义希望发现的主题数量。您不需要定义主题本身(您只需要定义主题的数量),算法会将所有文档映射到这些主题,使得每个文档中的单词大部分都被这些虚构的主题捕获。
- 该算法迭代地遍历每个单词,并且考虑单词属于主题的概率以及文档将由主题生成的概率,将单词重新分配给主题。这些概率被计算多次,直到算法收敛。
与其他执行硬聚类(其中主题是不连续的)的聚类算法不同,LDA 将每个文档分配给主题的混合,这意味着每个文档可以由一个或多个主题描述(例如,文档 1 由 70%的主题 A、20%的主题 B 和 10%的主题 C 描述),并反映更真实的结果。
主题建模对于文本分类、构建推荐系统(例如,根据你过去的阅读向你推荐书籍)甚至检测在线出版物的趋势都非常有用。
未来是什么样子的?
目前,NLP 正在努力检测语言意义的细微差别,无论是由于缺乏上下文,拼写错误还是方言差异。
2016 年 3 月,微软推出了人工智能聊天机器人 Tay ,作为 NLP 实验在 Twitter 上发布。这个想法是,随着越来越多的用户与 Tay 对话,它会变得越来越聪明。结果是,16 个小时后,Tay 因其种族主义和辱骂性的评论而被删除:
微软从自己的经历中吸取了教训,几个月后发布了第二代英语聊天机器人 Zo ,它不会犯与上一代相同的错误。Zo 使用一系列创新方法来识别和产生对话,其他公司正在探索能够记住特定个人对话细节的机器人。
尽管 NLP 的未来看起来极具挑战性并且充满威胁,但该学科正在以非常快的速度发展(可能是前所未有的),并且我们很可能在未来几年内达到一定的发展水平,这将使复杂的应用成为可能。
感谢Jesus del Valle、 Jannis Busch 和 Sabrina Steinert 的宝贵意见
对这些话题感兴趣?在 Linkedin 或 Twitter 上关注我
你的手机银行应用有问题(我不确定是否有人知道)
原文:https://towardsdatascience.com/your-mobile-banking-app-has-a-problem-c2fe006e76c7?source=collection_archive---------3-----------------------
机器学习算法中的错误正在造成严重的(几乎看不见的)后果
Image by pixel2013 via Pixabay
几乎可以肯定的是,我们已经为实际上没有问题的退回支票支付了数千美元,如果不是数百万美元的话。
我不确定是否有人知道这件事。
我不可能是唯一一个遇到这种事的人。
但是很容易看出我们可能都忽略了它。
Photo by Ryoji Iwata on Unsplash
手机银行背后的技术非常不可思议,但是如果出现错误会怎么样呢?
如果我们看不到错误会发生什么?
我们生活在一个技术进步如此之多的世界,以至于它们几乎融入了背景之中。我们已经习惯了让手机和电脑为我们做一些小事的想法。人们很容易忘记所有这些技术到底有多新。
但它是新的。每天都在变化。从社交媒体和娱乐到银行和金融,大多数你认为理所当然的基本事物背后都有算法。它们在不断进化。
他们并不完美。
注意了!
如果图像捕捉系统在您的银行应用程序中出错,导致您的存款被拒绝,您会付出什么代价?
如果没人看到呢?那会让我们付出什么代价?
这不是空头支票!
最近,我在一个手机银行应用程序上存入了一张被接受的支票,几天后却被作为空头支票退回。我为此被收费。
问题来了:那张支票还不错。
这里有一个更大的问题:这花了将近两周的时间来解决,并且浪费了大量的时间。我甚至抓住了真正的问题,这几乎是偶然的。移动银行应用程序中的图像捕获系统出错。一个很容易被忽略的错误,可能已经发生在你身上,而你甚至没有意识到。
做自由职业者有很多额外津贴,但是财务方面会变得复杂。你不是从单一来源获得源源不断的支票,而是依靠各种各样的客户从不同的账户向你支付款项,这可能是一个相当随机的时间表。
我很幸运有我完全信任的了不起的客户。不是说错误不能发生!他们绝对可以。人们会忘记自己的账户余额,从错误的账户或关闭的账户中提取支票,等等。但是我非常幸运,从来没有客户开出空头支票。
你可以想象我有多惊讶,在通过一家大银行的应用程序批准了一笔移动存款几天后,那张支票被退回来了,我的账户被扣了一大笔费用。这是一个我认识并信任了多年的客户,它没有任何意义。我联系了客户,他和我一样对此感到困惑。
我联系了银行,花了很长时间和某人通电话,她向我保证她无能为力。这是一张空头支票。当有人给你开空头支票时,你必须支付手续费。你应该让你的客户给你报销这笔费用。故事结束。你的银行不可能去其他银行要求他们支付费用,所以这取决于你。去找你的客户拿一张新支票。
听起来很合法,对吧?
GIF via GIPHY
坏消息,银行家
对她来说不幸的是,我不会就此罢休。这就是我比其他很多人更有优势的地方,他们可能会把她说的话当真。人们会简单地回到客户那里要求一张新的支票。一种是附加费用,包括费用和可能的利息:
- 我了解并信任我的委托人。
- 我手里拿着这张支票,可以看出它是从同一家银行的一个账户上支取的。(这表明她掌握的一些信息是不正确的。)
- 我熟悉一些驱动图像捕获和分类的算法,以及它们潜在的弱点。实际上,我在 Medium 上写的是技术和人工智能。)
- 我知道这家银行最近进行了一次重大的技术升级。
- 我曾经是这家银行的私人银行家。那是很久以前的事了,但我知道一个银行家能接触到什么信息,她能采取什么步骤,不能采取什么步骤。
你不太可能处于这个位置,这也是我写这个故事的原因。
有多少人认为只是简单地回去,得到一张新的支票,并支付费用,而没有确定实际的问题?
你会相信你的银行家。你会认为你收到了一张空头支票,并从那里开始。你的客户需要提供另一张额外收费的支票。这会影响你和他们的关系。退回的支票可能会导致你透支,招致更多的费用和更大的问题。短时间内多次退回支票可能会导致您失去帐户。很多事情可能会变得非常糟糕,这都是因为机器学习算法中的错误。
我希望你有这个信息。我想让你知道你在找什么。你可以也应该提问。银行家无法告诉你很多事情,但你可以获得大量信息。支票被退回是因为资金不足吗?这是一个不存在的账户吗?你还能采取什么措施?
这到底是怎么回事?
问问题!
Photo by Artem Maltsev on Unsplash
发生了什么事?
令人惊讶的是,这很难理解。我肯定电话里的银行家希望她再也听不到我的消息了。最终,结果证明支票被提取的账户并不是系统中输入的账号。这意味着银行找不到有问题的银行账户。
我不得不等待银行寄给我一份存款证明,这样我就可以带着存款证明和支票原件去银行让银行职员亲自检查。在这一点上,银行家可以试图找出问题,并决定是否要扭转费用。(为了增加乐趣,您的费用一般只能由您开户的银行来撤销。这意味着,我必须在美国的另一边,等待一位从未谋面的银行家决定是否撤销我的费用。)
所以,我在等邮件。
花了将近一周的时间。不难想象,对于一个完全因为银行方面的错误而透支了账户的人来说,这将是什么样的情况。
把它带到银行去
一旦支票到了,我那蹒跚学步的孩子可以从世界上最无聊的冒险中解脱出来,我就去了银行,亲自经历了这一切。
这位银行家再次表示,这是一笔坏账。客户确实存在,但该账户不是一个未结账户。这一定是一个已经关闭,我的客户拿错了一些旧支票。我只是需要一张新的支票。
容易出错。它可能发生在任何人身上。
这听起来很合理,但我了解我的委托人。我也知道路由号码。这家伙不是那种会拿着一箱支票的人,这些支票来自他七年前在他居住的州开设的一个已关闭的账户。不可能。
不知何故,尽管银行家非常肯定地知道她是对的,她还是再看了一眼。
她看到了问题。太简单了。
图像捕捉系统已经截掉了支票上账号的最后两位数字。
就是这样。
这个或大或小的错误导致了一张退回的支票,一笔费用,以及近两周的头痛和浪费的时间,而这些时间本可以是富有成效的。
情况可能会更糟。
银行的错误实际上是看不见的。
进入人工智能
那么这个图像捕捉系统从何而来呢?是这家银行独有的吗?
事实证明,大多数主要银行都使用同一家公司的图像捕获、识别和分析系统。这家公司做了令人难以置信的工作,我绝不怀疑这一点。我没有证据证明他们是这个问题的直接原因。
该公司利用人工智能开发图像识别算法。他们正在使用机器学习算法来完成令人难以置信的文档和身份验证工作。他们已经创建了一个基于计算机视觉和机器学习算法的图像捕捉软件开发系统。它可以检测角落和眩光,可以检测和分析各种背景下的图像,包含内置的分析功能,提供实时图像评估,并具有许多其他很酷的功能。
但它显然不是完美无缺的。
也就是说,我不认为这家公司是问题的直接原因。我知道我从事自由职业工作的银行最近经历了一次重大的技术重新设计,他们对其在线和移动银行系统进行了更改。银行端的重新设计可能导致图像捕获系统出现问题。
也有可能是图像捕获系统本身有问题。我很难找到科技公司方面的任何错误记录,但这并不一定意味着没有任何错误记录。他们可能有一个了不起的公共关系部门或一流的法律团队。或者可能没有很多人能够注意到这里到底发生了什么。
我不知道问题出在哪里,也不知道这种情况发生的频率。但是这不可能只发生过一次。
这是一个潜在的大问题。即使 0.1%的移动银行客户有(或将有)这个问题,这也是我们经济中的一个巨大问题。大量的人在使用手机银行应用,而且这个数字还在增长。制造这项技术的公司也开发了用于身份和文件扫描的技术。它能直接丢数字吗?这些数字代表了我们的银行账户和身份。这种错误是不可接受的,会产生极其严重的后果。
有什么解决办法?
我还不知道,但我知道我们需要一个。我们肯定需要开始培训银行家来关注这个问题。现在,请记住所有这些技术仍然是新的。记住你有提问的权利。你有权了解事情的真相,即使人们告诉你你已经在那里了。几乎可以肯定,这种情况到处都在发生,我们需要找到一种方法来解决这个问题。
这取决于我们所有人的关注。如果不知道这个问题,没有人会去解决它。
不要让它溜走。太重要了。
如果其他人也有同样的问题,请在下面的评论中自由讨论。一如既往,随时在 LinkedIn @annebonnerdata 上联系。
你的下一个超模
原文:https://towardsdatascience.com/your-next-top-model-65052c6a8d3b?source=collection_archive---------35-----------------------
机器学习模型的高级概述
注:在这篇简短文章的最后,点击链接与由 帕特·富勒康纳·安德森 ,以及 米亚·伊泽曼 创建的文档进行互动。
什么是随机森林?如果一棵决策树倒在那里,我的参数会影响它是否发出声音吗?
贝叶斯是什么,为什么过了这么多年还这么幼稚?它现在不应该更清楚吗?
说真的,SVM 到底代表什么?
现在有很多机器学习模型,而且你不可能一下子就找到所有问题的答案,这是有道理的。也许你是数据科学的新手,也许你已经在朝九晚五的工作中使用相同的模型很多年了,或者你需要一些快速的面试准备。无论哪种方式,有一个资源来提醒你存在哪些机器学习模型的选项是很好的。
我和我的同事已经创建了许多不同模型的高层次概述以及分类法。我们最近研究了列出的大多数,我们发现当我们从我们的课程中毕业时,更难记住我们首先研究的那些或那些没有成为我们项目之一的那些。
preview of the taxonomy we developed
虽然我们知道资源本身是有帮助的,但听说创建资源的行为对我们个人更有益,这可能并不令人惊讶。所以,我们希望你能帮助我们保持这份活的文件,因为它会让其他人受益,也是对你理解的一种检验。
我们知道这不是什么开创性的东西,它只是一个有用的资源。让我们保持更新-毕竟,在数据科学发展和变化的速度下,我们需要一些东西来帮助我们保持所有这些模型及其目的的直线。请在这里的卡牌上留言评论,希望有用!
example slide from the deck
链接到 deck:https://docs . Google . com/presentation/d/1 HIF rhhr 7k 2 oczso 0 rwet d 8 xxbdubpcpq-djqs 93 eryy/edit?usp =共享
你的个人数据科学项目很无聊。让我们改变这一点。
原文:https://towardsdatascience.com/your-personal-data-science-projects-are-boring-lets-change-that-e356c5949e2f?source=collection_archive---------12-----------------------
如果你没有数据科学家的工作,你应该努力扩大你的投资组合。如今,招聘人员考虑你简历的唯一方式是你是否有经验。因此,如果没有工作经验,作品集是显示你有经验的唯一方法。
如果您正在从事个人数据科学项目,让您的数据科学项目变得有趣实际上是成功的关键。招聘人员无法判断你关于机器学习模型的超参数调整的论文是否真的很棒,所以你需要不同的策略来打动他们。
你可能有两个问题中的一个,无聊的数据或者你的工作有一个无聊的前端。我已经列出了最好的方法,不仅仅是避免这些问题,而是提升我认为的阴谋的水平。
有趣数据的四个层次
第一级:我将第一级描述为陈腐的数据,这些项目利用了招聘经理(有时甚至是招聘人员)见过的最常见的数据集。这包括像虹膜,泰坦尼克号生存,葡萄酒质量,和 mtcars。如果你的数据集在加州大学欧文分校的机器学习库上,那么我不推荐使用它。使用这些数据集来学习如何做一些事情是很好的,但是如果你正在炫耀你从这些数据集制作的 ML 模型,那么要知道它已经被做了很多次了。
第二层:你选择了一个不太常见的数据集。有很多数据集很容易找到,但不太常见,Kaggle、reddit 和 google 都是找到它们的好地方。如今,NLP 和计算机视觉是数据科学中的“热门”技能(例如,它们被列在许多工作申请中)。选择基于图像或文本(或两者兼有)的数据集是一种很好的升级方式。
第三层:仅仅因为你挑选了不平庸的数据,并不意味着你挑选了一定有趣的东西。能让你更上一层楼的是选择一些大多数人都知道的主题。这可能是运动、电影或书籍。如果这里的数据是“实时的”就更好了,这意味着它是通过 API 实时更新的。
第四级:在这一级,你工作的复杂程度通过用户输入显示出来。例如,你可以对招聘人员自己的推文进行 NLP 分析,或者连接到 Spotify 的 API,展示推荐算法,并为用户创建一个新的播放列表。在数据科学领域,人们通常不是根据你工作的复杂程度来评判你,而是根据你向介绍的人对的理解程度来评判你。当你使用关于你要展示的人的数据时,你会获得更高水平的兴趣和参与度。这并不意味着最好的、最复杂的或最成熟的数据科学项目都有这种数据,但是其他人最感兴趣的项目通常有。
你的项目的前端
既然您已经决定使用更有趣的数据集,那么是时候考虑如何展示它了。如果你不能出示,就没有多少证据证明你做了。在这里,我会把你的个人项目分成两大类。
第一级:你的工作是在一个纸或笔记本或其他一些静态的内容。虽然有很多开创性的 ML 工作以这种形式出现,但它看起来并不有趣,而且经常被忽视。请记住,如果招聘人员看了它,但他们不理解它背后的数学原理,这并不意味着他们会相信你知道你在做什么。让你的准确性指标易于理解(比如平均绝对百分比误差)并建立比较基准是提高你在笔记本/纸上所做工作的好方法。最后,我建议尽可能使用看起来最漂亮的地块。使用 matplotlib 时选择一个样式,考虑使用类似散景的东西。
第二级:我印象深刻的许多项目(以及在黑客马拉松中获胜的项目)都是具有工作前端的项目。我知道数据科学教育经常忽略教你获得项目工作演示的技能,但这些技能是值得花时间学习的。拿起 Django/Flask 是开始制作“成品”项目的最佳方式。
在这两个领域达到更高的“水平”是齐头并进的。为了使用实时用户数据,您需要有一个工作的前端。做更高层次的项目是引起招聘人员和招聘经理兴趣的最好方法。祝你工作顺利!
你在数据科学中的位置
原文:https://towardsdatascience.com/your-place-in-data-science-de4fb405be7?source=collection_archive---------22-----------------------
我最近目睹了一个真实的第三类错误——不是假阳性也不是假阴性——是通过错误的问题和答案得出的真实结果。
我当时正在墨尔本参加一个数据科学活动,演讲者转向观众,问我们当中有多少人是 STEM 毕业生。
几乎每个人都举起了手。没什么好惊讶的。
真正困扰我的是后续…
“有没有 STEAM 的毕业生?”
唯一在空中的手是我自己的。
按照纯粹的逻辑,将类别扩大到包括艺术应该会增加或者至少保持反应不变。然而,自我排斥的普遍错误很有启发性。
作为一个喜欢数学胜于计算、喜欢讲故事胜于编程、喜欢人胜于技术的人,我真的属于数据科学吗?如果是,在哪里?
为了回答这个问题,我转向了我能找到的最好的数据——ka ggle 的 2018 年机器学习和数据科学调查——并开始进行细分。
我根据相似的职责将角色分组,然后,根据我自己的知识和经验,我勾画出一个框架,说明它们是如何组合在一起的。
抛开专业知识的极端——那些与学科无关的人和各种资深参与者——我的分析集中在四个主要群体上;产生数据的支持者、确保数据安全通过的促进者、提炼数据的管理者以及追求数据的探索者。
Method: For each job title (Q6) get share who have each responsibility (Q11), then reduce these proportions down to two principle components, and use K-means to derive six main clusters.
支持者
让我们从支持者开始,你在现场的人和任何数据项目中最基本的利益相关者。这一类别包括业务和营销分析师,但也可以扩展到簿记员、实验室助理或任何在第一线处理数据的人。
从某种意义上来说,这可能意味着每个人,所以从高层次的角度来看,很容易忽略这些人,并将我们的数据视为creation ex nihilo——在开始时,什么都没有,直到有人说‘让数据存在’,数据就存在了,而且很好。
但是,当然,没有什么比这更偏离事实了。所有人类数据都来自经济学的基本力量,然后进化以适应其环境。成功的数据项目从理解上下文开始。
例如,当营销人员开展数字活动时,只有以一种易于在系统中找到的方式来命名和标记它们才有意义。但是在一个团队的环境中,不一致的元数据使得很难聚集许多个体的度量。
在这种情况下,管理集策略可能坚持它们总是通过严格的命名约定包含关键元数据;导致愤怒的工作人员面对同质的竞选名称和频繁的关于偶尔的打字或拼写错误的谈话。
或者,协商的策略可能涉及将元数据保存在一个匹配表中,并建立一个 ID 来连接它,让软件来完成剩下的工作,并允许一些自由来有效地命名事物。
我们如此依赖我们的支持者,让他们参与进来是关键。
主持人
随着数据对我们的运营变得越来越重要——通过集成的报告和分析——一个组织将需要主持人来照看其管道。数据分析师、项目和产品经理,甚至顾问都在这个节点上。
从粗略的估计转向完全由数据驱动是一个巨大的变化。员工需要确定术语,连接不同孤岛上的数据,微调技术并管理您的各种数据实践。所有这些都需要一套独特的技能。
这些专业人士充当你的数据的管理层,这听起来可能很奇怪,直到我们考虑为什么这些人是至关重要的。正如雷·菲斯曼和蒂姆·沙利文的巨著《组织 T4》所指出的,在关于的一章中,什么样的管理对有益…
有效的管理不仅需要有效的信息收集,还需要将事实和数据分发给那些需要它们的人……至少在组织的经济逻辑中,管理者的基本角色在很大程度上是收集和处理要在组织结构图中上下传递的信息,以扩大所有者的控制,并对员工的智力进行筛选和分类。
本质上,你的辅导员的角色是让数据为你服务。
如果没有它们,你首先要做的就是获取数据。
策展人
一旦我们有了数据,特别是当我们有很多数据时,我们需要让它有用。鉴于人类和机器的处理能力有限,我们需要策展人仔细选择重要的东西,并善加利用。
想想数据记者、统计学家甚至软件工程师。无论他们是在估计一个行业的规模,推导一个客户终身价值的模型,还是琢磨一种算法来检测社交媒体情绪的变化,他们的目标本质上都是一样的——驯服复杂性和规模。一个真正专业人士的标志不是他们的正确性或准确性,而是他们的工作如何解决问题。
例如,考虑一个书店老板的挑战,他需要估计他们的货架空间需求。最精确的方法——测量每本书的宽度以得到总数——会耗费大量的时间和资源。
统计学的价值在于能够让事情变得更简单。通过测量一个小的随机书籍样本,并通过简单的平均得出一个'模型书,所有者不再需要关注细节——简单的乘法就足以满足这个和未来的答案。
通过将数据简化为本质,策展人给了我们所需要的东西。
不多也不少。
探险者
最后,从数据分析到数据科学需要能够测试其他一切所基于的假设和理论的人。为此,我们需要探索者——科学家和研究人员,他们可以质疑我们运作的根本基础。
正如杰森·福克斯在他那本关于如何领导一项任务的精彩著作的结尾所总结的那样…
对任何企业来说,两个最大的威胁是不确定的未来的无限复杂性,以及每个人都很忙的事实。如此高效…
为了保持相关性,我们必须接受一种开创性的领导形式。这意味着要敢于超越我们默认的、高效的和既定的工作方式,并寻求新的增长途径。
在历史上的不同时期,我们人类相信房价永远不会下跌,奴隶制和贫困是不可避免的,地球是宇宙的中心。在每一个案例中,我们都有现成的数据。
当数据丰富且干净时,最大的挑战是我们的确定性。
一个真正的探险家是破坏性的,这正是我们需要他们的原因。
成为高级玩家
数据科学从根本上讲是关于人的。要做好它,组织需要实地的支持者、管理交付的促进者、展示其价值的策展人以及释放新潜力的探索者。
这有点像一场演唱会需要一个后台工作人员,一个声音和灯光团队,音乐家和导演。让一个人扮演多个角色是可行的,甚至有必要保持在预算之内,但这通常会使后勤工作更加困难。
随着我们每个人在职业生涯中的发展,我们在哪里能够最好地为数据科学服务将始终取决于我们培养的人才、我们掌握的工具以及我们能够为周围团队贡献的价值。
就我自己而言,我不得不接受我永远无法掌握定义我周围团队的技术。但没关系,因为我知道自己的优势。
作为一名数据科学翻译,我仍然在乐队中,但我的角色有点不同。
我把我的声音借给数据,所以它会唱歌。
Method: For each Senior Player, use their nearest (non-senior) neighbor to reclassify.
你的 Python 之旅解码了
原文:https://towardsdatascience.com/your-python-journey-decoded-acc806106947?source=collection_archive---------23-----------------------
成为 Python 编程专家
介绍
Python 是当今发展最快的编程语言。这有点令人惊讶:Python 是一种非常通用的、容易学习的语言。如果你想以编程为职业,掌握这门语言是有意义的。
根据 StackOverflow 开发者调查报告,Python 已经连续三年位居最受欢迎的编程语言的榜首。它是继 Javascript 之后最受欢迎的编程语言,也是继 Rust 之后最受喜爱的编程语言。无论你是初学者还是专业人士,这种语言对所有人来说都是很棒的。
一定要看一看!!
关于 Python 的 16 个最引人入胜的事实
旅程开始了…
一切从基础开始
编程语言的基础是每个人建立坚实基础的必要条件。熟悉这些基本的核心编程概念。
- 数字、字符串、字典、列表和元组:
深入研究这些数据类型。理解这些数据结构的行为以及可以对它们执行的操作,问这样的问题:这种数据类型是可变的还是不可变的? - 控制结构(if-else,while loops,for loops):
使用控制结构,做类似计算单利的小程序,检查一个字符串是回文还是打印素数的程序。 - 功能:
功能有助于将程序分解成用于特定任务的小模块。学习关于函数的一切,因为它们几乎无处不在!即使在 python 的第一个程序中,也要使用 print()函数。 - 面向对象编程: 面向对象编程概念包括抽象、封装、继承、多态。它们是基于真实世界的实体,其中所有的东西都被认为是类和对象。
您旅途中需要的理想 Python 指南
确定你感兴趣的领域
Python 是一种通用编程语言。它被用于各种工作。
- 数据分析
- Web 开发
- 移动应用
- 数据科学/机器学习
- 自动化
- 物联网应用、机器人
这些领域中的每一个都涉及不同的职业机会,所以最好决定你的兴趣所在,并努力掌握那个领域。
自动化你的日常任务
使用 python 可以自动化许多重复性的任务。开始构建小型应用程序,在其中实现如何自动化任务的想法。
例如,您可以在 web 上自动搜索特定对象并下载其内容(也称为数据抓取),更新和格式化大型 Excel 文件,发送提醒电子邮件和通知,创建聊天机器人,以及通过 python 脚本自动填写在线表格。
为这些自动化任务构建小脚本将增强您的基本编程逻辑,通过将各部分集成在一起,您将能够构建项目。
数据结构和算法
要成为编程专家,就不能忽视数据结构和算法。这些课题需要研究透彻,深入实施。这些数据结构将伴随你的整个旅程。
数据结构包括堆栈、队列、列表、树、图等。您需要能够决定哪种数据结构最适合某个问题,只有当您深入研究它时,您才能产生这种能力。
排序算法、搜索算法、动态规划算法、贪婪算法、递归算法、回溯算法等等,这些概念可以增强你解决问题的技能,提高你成为更好的程序员的技能,并使你成为有能力构建最佳解决方案的人。
项目
语法和编程结构只告诉你允许做什么,不允许做什么。制作小程序会告诉你如何处理和解决问题。构建项目并在现实世界中实现你的想法会让你成为编程专家。
实施项目是成为专家的最佳途径。除此之外别无选择。
有许多框架可以简化项目的构建。对于 web 开发,Django 和 Flask 主要用于创建大型复杂的 web 应用。
用这些 惊人的 Python 项目 成为顶尖的 Python 竞争者
对于一个数据科学家来说,你需要做很多项目。Numpy 和 Pandas 对于对数据执行操作并分析它们以建立机器学习模型非常有用。制作与不同类型学习(监督、非监督和强化学习)相关的项目
尝试建立独特的项目,你可以在现实世界中实施,并在你的投资组合和简历中展示。
用这些 惊人的数据科学项目 离你的梦想更近一步
Python 高级主题
你可能不太了解其中的一些概念。为了精通 python,我列出了一些需要深入研究的高级主题。这些措施如下:
- 列出理解
- 词典释义
- 生成器(基于类和方法)
- python 中的一切都是对象
- λ函数
- 多线程编程
- pep 8—python 编程风格指南
尾注
现在您已经知道了如何精通 python 的细节,是时候投入一些时间并致力于学习了。学习 python 很有趣,如果你真的很投入,你真的可以走很长的路。
我希望这个导游足智多谋。祝你旅途好运!
向 Python 许下你的承诺
你不可预知的日程可能会破坏你的估计
原文:https://towardsdatascience.com/your-unpredictable-daily-schedule-might-be-wrecking-your-estimates-efa6e37d9d0f?source=collection_archive---------23-----------------------
通过使用真实数据的模拟,我们可以发现不可预测的进度在多大程度上导致了不可预测的项目长度。
How unpredictable my schedule is from day to day, approximately.
并非所有工作日都是平等的
假设给你一个软件项目,要求你估计一下完成这个项目需要多长时间。
…
…在你笑完或哭完之后,继续读这篇文章。
假设你做了一些思考,然后决定大约需要 10 个工作日来完成,误差在几天之内。
接下来,您处理该项目,并完成它,但它并没有花费 10 个工作日来完成。花了 8 个!或者,也许花了 13 分钟。或者 20。不是 10 的东西。
为什么?
我是说,你是软件开发之神。你总是知道任何项目所需的确切工作量。而且,很明显,你永远不会有意想不到的困难,不明确的要求,或者精力或士气的变化。所有的随机变量都不在方程中!
(是啊没错。但是,在这里跟我一起滚,让我们假设以上是真的。)
发生了什么事?!让我们原路返回。
大概,你首先在脑子里对工作量做了一个估计。然后你可能把它转换成一个不可约的时间单位,比如说,X 总工作时间。
但是,企业在商业时期需要它。所以你想,“嗯,平均来说,我每天在一个项目上完成 Y 个小时的工作,相差不了几个小时。”所以你用 X 除以 Y,得到 Z 个工作日。
问题就在这里!并非所有工作日都是平等的。它们是随机的。你忘了考虑你每天在一个项目上工作多少小时的方差 。“给或拿几个”。是每天持续接近到 Y 小时的工作时间,还是变化很大,经常是 1 小时,经常是 8 小时,只有在大观中平均达到 4 小时?
但是,这种差异究竟会对整个项目长度的差异产生多大的影响呢?它真的能改变项目的长度吗?
让我们继续忽略影响项目长度的其他随机变量,并特别关注这个“不可预测的计划”变量,因为,我一直在收集关于我的计划的不可预测性的数据…
…我们可以使用这些数据来了解 它对我的估计的不准确性有多大的影响 !
It started off as a promising week…
记录我的数据
在过去的 14 个月里,我记录并分类了我工作中的每一分钟。
下面是一个实际的例子:
How each minute of my day was spent, on July 16, 2018.
一天被分成几个部分,每个部分的分钟被分成六类。大多数类别对本文并不重要,但我会为感兴趣的人快速解释一下。
如果我在做一些我认为重要的事情,但不是我的“主要项目”,那么我会把这些时间放在“重要的事情”栏里。如果我在为公司做一些事情,比如调查或全体会议,这些会议记录会被添加到“公司”栏。如果时间花在了某人想让我做的事情上,但我认为这是浪费,就像大多数会议一样,这属于“无聊”一类。“午餐”就是午餐。其他任何事情,比如四处走走,暖暖我冰冷的手,或者社交,都属于“其他”范畴。
所以,看起来我在 7 月 16 日有点内向,我的手没有那么冷。很不寻常。
在本文中,我们主要关心的是花费在“主项目”类别中的时间。7 月 16 日,看起来我在我的主要项目上花了大约 225 分钟。
碰巧的是,对我来说,225 分钟非常接近正常。纵观迄今为止我记录的所有日子,我每天花在主要项目上的平均时间是 200 分钟(也就是 3 小时 20 分钟)。
顺便问一下,我说的“主要项目”是什么意思?在我的团队中,每个开发人员通常都有一个指定的“主项目”,他们正在进行这个项目,并且给出了很多评估,但是开发人员通常还有其他的职责,比如生产支持、维护/保养任务、会议等等。
我的时间表的变化
所以,我每天花在主要项目上的平均时间是 200 分钟。
但这是我工作的性质,它实际上从 200 分钟变化很大。它通常不会接近 200 分钟。
可视化这种差异的一个很好的方法是直方图。这是一个条形图,我们把每天放入一个桶中:我们计算我完成 0-50 分钟工作的所有日子,这将是条形图上的 0-50 条。然后我们计算我完成 50-100 分钟工作的天数,这将是条形图的下一个柱。诸如此类。
这是直方图:
The distribution of how much I work on my main project each day. There are 222 recorded days included in this chart. Each day is placed in a bin (bar) based on the number of minutes I worked on my main project that day. Example: There were 39 recorded days where I worked 0–50 minutes on my main project.
它看起来非常随机,离均匀分布不远。差异很大。但是,你可以在 275 分钟左右看到一个中心趋势,左右两边都有厚尾。我的实际平均值是 200 分钟,而不是 275 分钟,因为左边的尾巴更粗更长,也因为 0-50 棒线中有很多天。
在本文的附录中有更多关于数据是如何收集的细节。
我当然只有自己的数据,但我对其他开发者非常好奇。有没有差异很小的开发人员,他们每天都在他们的主要项目上持续地接近一些平均值?
在我开始收集数据之前,我认为我是那些开发者中的一员。但事实证明,我不是。如果你认为你是,也许你也不是。事实上,也许你的有更多的变化!很难知道。我看了看我周围的开发人员,我怀疑他们中大约一半的人可能有更多不可预知的时间表!
毕竟,我们不都有问题要回答、代码要审查、人要交谈、生产火灾要扑灭吗?
模拟项目长度
好了,精彩的部分来了。
假设给我一个项目,我想了想,决定花 2000 分钟完成。平均来说,我知道我每天在一个主要项目上花 200 分钟,所以这个项目的预期时间是 10 天,可能会有几天的误差,这取决于运气。
我可以用我的数据来模拟这个项目实际上会花多长时间。我可以一遍又一遍地模拟它,看看它与预期长度的差异有多频繁,有多大。
(记住,我们还在“假设”我是上帝开发者,其他所有的随机变量都不存在。)
这里有一个 sim 运行的例子:在项目的第一天,我们从我的数据集中随机选择一天,并取它的“我的主项目的分钟数”。好吧,我们有 150 分钟。我们已经达到 2000 分钟了吗?没有吗?然后继续第二天。同样,我们从我的数据集中随机选择一天。好吧,我们有 300 分钟。我们已经到达 2000 分钟了吗?没有,目前只有 450 个。…等等。最终,在第八天的中途,我们达到了 2000 分钟。因此,在这次模拟运行中,完成项目需要 7.5 天(我们只需要第 8 天的一半时间)。
这只是一次运行,但我们真正想做的是,在柱状图中记录我们在“第 8 天”完成的工作,然后再进行一百万次模拟运行,并在柱状图中记录每个结果。
希望你能看到为什么这个模拟有效的直觉:我一天做多少“主要项目”工作是一个随机变量,但我收集的数据捕捉到了那个随机变量的分布。如果我有很多“0 分钟”的日子,那么我的数据集将反映这一点,因此模拟将经常随机选择 0 分钟的日子。如果我收集的日期非常一致,那么模拟将随机选择一致的日期。
模拟结果
无论如何,这是使用我的不可预测的时间表模拟这个 10 天项目的结果直方图,并找出实际上需要多长时间:
The distribution of 1 million simulated runs of a 10-day project. The runs simulate the effect of the variance of my daily schedule, and so they vary significantly from 10 days. How to read the graph: the bar labelled “13” has height “8.4%”, which means that 8.4% of the runs finished during day 13 of the project.
太棒了。对吗?这里有一些有趣的观察例子。
- 60.1%的运行与预期的 10 天相差 1 天或更多天。
- 95%的运行需要 7.0 到 14.5 天才能完成。
最后一个观察也被称为我的项目长度的“双尾 95%置信区间”。
初始反应
所以,你惊讶吗?或者你觉得它看起来合适吗?
对我来说,我很惊讶。我确实认为项目长度的差异很大。甚至比这还宽。然而,我主要考虑的是诸如“意想不到的困难”、“不明确的需求”之类的差异来源。我从来没有想过“不可预测的时间表”有什么关系。
然而,项目差异已经如此巨大,还不包括那些明显的其他差异来源!如果我们能够将这些也包括在内,这个图表将会更宽!
许多需要报告估计值的软件开发人员宁愿不报告预期的平均长度(10 天),而宁愿给出 95%的置信区间(7.0 到 14.5 天)。上面的图表和观察可能证明了为什么:10 天的估计真的不能告诉我们太多,如果在 60.1%的情况下误差超过 1.0 天!也许这些开发人员对软件开发的巨大随机性有很好的直觉。
但是只要看看那个 95%置信区间的大小,就是 7.0 到 14.5 天的工作!如果你给出这样一个估计范围,有人会给你脸色看。我想很多人会对第二个数字是第一个数字的两倍感到震惊,这看起来像是 100%的错误,或者类似的事情。他们没有想象钟形曲线的形状和尾部。
也许这就是为什么许多软件开发人员更喜欢报告时间间隔的最右端(14.5 天)。真相可能很可怕。
然而,实际上,考虑到所有其他的随机变量,这个图表可能会更宽。也许宽得离谱…这让我觉得根本没有估计这回事,真的…
这让我想到,没有“相当确定一个项目会在 X 日期前完成”这样的事情。只有设定一个合理的限度,并在此之前不断努力。如果你在那之前完成了,很好,你很幸运。如果你没有,那很正常,当你达到协商的极限时,试着让某些事情合理地工作……因为否则,你可能会比你想要的工作更长的时间。
这只是我的反应,也许你的不同!想想吧!
一个重要的外卖
我认为这个实验很好地展示了一件重要的事情。
当一个项目远离它的估计时,它经常被归咎于开发人员的估计技能——如果他们在估计方面做得更好,他们就会更接近于预测真正的完成日期。
但是在这个实验中,我们完全不考虑评估技巧。我们把所有的技能都去掉了!我们保证以分钟为单位的实际项目长度是已知的和恒定的。 2000 分钟。然而,我们可以看到,无论如何,误差会很大!因为软件开发存在固有的随机性。
当你掷出一个六面骰子,你给出的估计是 3.5,最后你掷出的是 6,这并不意味着你的估计很差。你估计得很完美,3.5 真的是平均期望值。在滚动六面骰子的过程中存在固有的随机性。你应该责怪固有的随机性。
你可以在“你应该知道骰子会那样反弹,我没有看到随机性,只是无知”之后声称“你应该知道这个项目会那样,我没有看到随机性,只是无知”。这两种说法都同样不明智。
即使是软件开发之神也不能保证实际的项目长度与预期的项目长度相匹配。软件开发存在固有的随机性。对于许多随机变量来说,很难证明随机性是与生俱来且不可消除的,尽管几乎所有软件开发人员都知道强烈的随机性存在。但是“不可预测的进度”这个随机变量是一个非常有用的研究对象,因为它是如此清晰可见,如此容易显示它对项目长度的影响。
估计技能可能确实存在,但它只是许多随机变量中的一个,当项目的实际长度与估计的不同时,没有理由比其他随机变量更多地指责估计技能。
…另一方面,有时人们说“估计技能”,他们实际上是在谈论估计项目长度的方差——估计 95%置信区间的右端。我认为谈论这个更合理。我们应该都在学习并努力真正擅长理解软件开发中有多少随机性。毕竟,这正是这个实验想要做的!对一个特定的随机变量会给项目长度增加多少变化有一个相当好的感觉。
(顺便说一句,我怀疑总的来说,大多数关于“估计”的分歧实际上是由估计“平均预期长度”和“95%置信区间的右端”之间的混淆引起的。每次你和别人讨论评估的时候,我建议你弄清楚你们是否在谈论同样的事情!)
好吧,本文的其余部分只是这些模拟更有趣,最终,慢慢远离科学领域。
不同项目长度的相同模拟
好了,我们用我的进度数据模拟了一个 10 天预期长度的项目。…让我们也在其他项目长度上试试吧!
咻!那是没有理由的!
再一次,这些都忽略了所有的随机变量,除了我收集的不可预测的日程数据。
我喜欢 20 天的项目结果:对于 4 周预期长度的项目,3-5 周是一个容易记住的范围。
为更一致的时间表伪造数据
只是为了好玩,让我们试着为一个开发人员构建一些假数据,这个开发人员的进度变化比我少。
为此,我从我的 222 个数据点中去掉了 70 个更极端的数据点。我没有使用数学策略,我只是试图大大减少直方图上的粗左尾,并使它看起来更像一个钟形曲线形状。这是假数据的直方图。
The distribution of all of the days in my fake dataset. The 152 days were categorized into bins (bars) based on the number of minutes “worked on main project” that day.
希望这看起来足够合理。它更像一个钟形曲线,而不是我的真实数据,它看起来几乎像一个均匀分布(骰子滚动)。
现在,让我们再次对一个为期 10 天的项目进行 100 万次模拟,使用更加一致的假数据。结果如下:
The distribution of 1 million simulated runs of a 10-day project. Uses fake schedule data instead of my real schedule data. The runs simulate the effect of a fairly consistent schedule. The project length is still has fairly high variance, but less than my real data.
以下是这次的一些观察结果:
- 41.7%的运行与预期相差 1 天或更多天(而不是我的 60.1%)。
- 95%置信区间:8.0 到 12.9 天(我的是 7.0 到 14.5 天)。
所以,不出所料,差异变小了,但是比我在开始这个实验之前预期的要大。
请记住,在看图表时,少于 2 根棒线几乎是不可能的。这是因为,按照我的定义,一个“10 天项目”平均需要 10 天的时间。那正好在第 10 天和第 11 天的边界上。因此,即使只有一点点差异,一半的跑步会在第 10 天完成,另一半可能会在第 11 天完成。
所以真的,如果你考虑图表的时间足够长,你可能会开始更喜欢考虑 95%的置信区间。
加入其他随机变量
请记住,项目长度受到许多随机变量的影响,这些变量会导致方差,但是整篇文章中的所有上述模拟都只考虑了“不可预测的进度”随机变量。
但只是为了好玩,我们可以猜测一下其他随机变量对项目长度的影响程度,然后再运行一次模拟,并加入随机性!
让我们确定一些其他随机变量,并发明它们对项目长度增加/减少多少:
- 意想不到的困难:有时项目会因为意想不到的技术困难或意想不到的简单部分而延长或缩短。比方说,33%的项目需要 20%的时间,33%的项目需要 20%的时间。这当然是保守的,我们都有过这样的项目,我们意识到它们比我们想象的要难两倍……但是不管怎样。
- 不明确或变化的需求:有时项目需要更长或更短的时间,因为这些需求是需要的,但直到项目进行期间才显示出来。比方说,33%的项目需要 20%的时间,33%的项目需要 20%的时间。也大概保守?
- 精力和士气:有时一个项目特别乏味,或者你的生活中还有其他事情要做。或者有时候你超级投入。比方说,33%的项目需要 10%的时间,33%的项目需要 10%的时间。也可能是保守的——就我个人而言,当开放的办公室很安静,我处于最佳状态,在一天结束前我没有十件事情要记住,我工作得非常快…
- 估算技巧:每当我们猜测我们正在进行一个 2000 分钟的项目时,我们并不知道。我们猜测,我们没有完美的估计技巧。我们实际上可能正在进行一个平均需要 1700 分钟、2300 分钟或其他时间的项目。所以对于 33%的项目,让我们多加 20%的工作量,对于 33%的项目,让我们减去 20%的工作量。不知道这是否保守。
所以现在,对于每次运行,我们仍然从 2000 分钟(整整 10 天)开始,但是我们将计算上面的随机变量增加和减少,并修改这 2000 分钟。然后我们将通过抽样我的进度数据来模拟项目的 1/2/3…日,就像之前一样。
这是:
The distribution of 1 million simulated runs of a 10-day project. Uses my real schedule data, but also randomly modifies the project length using make-believe formulas to represent unexpected difficulties, changing requirements, energy/morale, and estimation error.
- 78.0%的运行与预期相差 1 天或更多(而不是最初的 60.1%)。
- 95%置信区间:3.9 到 17.5 天(原来是 7.0 到 14.5 天)。
许多软件开发人员建议,如果你被要求在一个项目中选择一个日期并承诺它,那么:你应该估计预期的平均长度,并将其翻倍,这就是你的承诺日期。看上面的图表,这似乎是一个相当不错的选择。虽然,我认为大多数开发者倾向于低估预期的平均值…所以那些开发者可能应该把它翻三倍。
附录:数据收集规则
以下是我用来记录数据并选择将其纳入本实验的一些重要规则:
- 如果我有一天意外休假,那么这仍然被记录为“这一天我的主要项目工作了 0 分钟”,并且仍然包含在这个数据集中。比如说,病假。在我的数据集中的 25 个“零分钟”的日子里,大概只有 10 天是这样的(其他的大概是我被打扰太多的日子)。
- 如果我休了一天计划的假,就像如果我知道我在最后一次给出项目的估计/提交日期时休了那一天,那一天根本不会被记录,也不会包含在这个数据集中。
- 有一小段时间,我没有被分配一个“主要项目”,我只是在项目之间,做任何事情。这些天不包括在这个数据集中(我确实把它们记录在某个地方,以防我将来需要它们)。这种情况不常发生。
- 有一个大型项目明显是我参与的其他主要项目的异常值,所以这个时间段没有包含在这个数据集中。这是一个我充满热情的项目,并且有严格的商业驱动的最后期限。如果我把它包括在内,我的时间表的变化会更加极端,会进一步证明我的观点,但这感觉像是作弊。
严格地说,要做这样的统计研究,每个数据点都应该独立于其他数据点。我的数据实际上可能不是完全独立的——肯定有连续几天重复出现的中断。但是,我认为它足够接近,你可以看一看散点图,给它一个独立的眼球测试:
Every day included in my dataset, in the actual order they occurred. This is supposed to show that each data point doesn’t affect the adjacent data points to the left and right, much, or similar patterns.
相当随机。我怀疑,无论如何,对于大多数关于现实生活的统计研究来说,独立性很少能完美实现。
尤瓦尔·诺亚·哈拉里和费·李非谈人工智能:影响我们所有人的四个问题
原文:https://towardsdatascience.com/yuval-noah-harari-and-fei-fei-li-on-ai-90d9a8686cc5?source=collection_archive---------5-----------------------
最近在斯坦福大学举行的一场对话中,两个人工智能巨头——尤瓦尔·诺亚·哈拉里和费·李非之间产生的问题多于答案。《连线》杂志主编尼古拉斯·汤普森主持了这场 90 分钟的谈话,纪念礼堂坐满了 1705 个座位。
目的是讨论人工智能将如何影响我们的未来。
哈拉里是耶路撒冷希伯来大学的历史学教授,曾两次获得波隆斯基创造力和独创性奖,是国际畅销书《智人:人类简史》和《德乌斯人:明日简史》的作者
李是著名的人工智能研究员、工程师和计算机科学教授。作为当今人工智能领域最多产的学者之一,她在深度学习和计算机视觉方面的工作被世界各地的公司和研究小组所采用。她最为人所知的角色是创建了 ImageNet,这是一个拥有 1400 万张图像的手绘数据集,广泛用于计算机视觉应用。
他们触及了一些关于人工智能和技术的最重要的话题,包括我们是否还能相信人类的能动性;AI 时代的民主是什么样子;以及 AI 最终会黑掉还是增强人类。
李和哈拉里没有让我们陷入停滞不前的话题,而是让我们思考许多重要问题,这些问题体现了人工智能技术对个人的影响,包括自由和选择,以及人工智能对我们世界的法律、经济和政治体系的影响。
这四个相关的问题试图帮助理清人工智能对个人的影响:
- 重新思考自由意志: 如果你不能信任顾客,如果你不能信任投票人,如果你不能信任自己的感情,你信任谁?—尤瓦尔·诺亚·哈拉里
- 爱情与 AI 的极限: 爱情是可黑客攻击的吗?—费-李非
- 将自我意识外包给 AI: 生活在一个从算法中学习关于自己如此重要的东西的世界里,意味着什么?尤瓦尔·诺亚·哈拉里
- 人工智能以人为中心: 我们能否以一种以人为中心的方式来重新构建人工智能和技术的教育、研究和对话?—费-李非
像许多看到它的人一样,我带着一种紧迫感离开了演讲。这些是人工智能从业者、决策者和公众应该思考的尖锐问题。所有这些都是人工智能辩论的重要组成部分。
但是我们需要迅速行动。“工程师不会等的。而且就算工程师愿意等,工程师背后的投资人也不会等。所以,这意味着我们没有很多时间,”哈拉里警告说。
同意。
反思自由意志
“如果你不能相信顾客,如果你不能相信投票者,如果你不能相信你的感觉,你相信谁?”—尤瓦尔·诺亚·哈拉里
讨论跳到了自由意志和代理这一深刻而困难的话题,完全跳过了表面问题。
质疑自由意志有效性的争论初看起来像是一种无关的理论努力——完全超出了工程学科的范围。事实上,许多被讨论的挑战又回到了哲学家们争论了几千年的话题。
只是这一次,有了一个全新的角度:技术已经发展到了我们许多根深蒂固的信念受到挑战的地步,正如哈拉里指出的,“不是被哲学思想,而是被实用技术。”
十年来,哈拉里一直在批评自由意志和个人代理的核心概念。
他不是一个人。由于测量神经活动技术的进步,许多神经心理学实验已经对自由意志发起了新的攻击。
这导致许多顶级神经科学家怀疑我们决策的自由。
“我们只是在大脑地图中处理信息,这些信息机械地引发了我们的行为。因此,我们认为我们有意识地决定和做出的决定,实际上只是一种幻觉,可以简化为我们大脑告诉我们要做的事情。”——汉娜·克里奇洛,普林斯顿杰出的神经科学家,《命运科学》的作者
但是,虽然科学仍在不断成熟,但我们的自由意志被操纵的后果——哈拉里称之为“黑客人类”——给我们的社会带来了巨大的风险。
一个组织可能会努力“创造一种算法,它比我更了解我自己,因此可以操纵我、增强我或取代我。”
这将是我们的挑战,不仅要决定这些操作、增强或替换应该是什么,而且首先要决定由谁来做。
我们可能想知道我们想如何选择人类增强的可能性。
“谁来决定什么是好的增强,什么是坏的增强?那么,如果这是一个非常深刻的伦理和哲学问题,哲学家们已经争论了几千年,你该如何决定增强什么呢?我们需要提升的优秀品质有哪些?”哈拉里问道。
对我们许多人来说,“回归传统的人文主义思想”是很自然的,这种思想优先考虑个人选择和自由。然而,他警告说:“当有了大规模黑人类的技术时,这些都不起作用。”
如果人类的能动性和自由意志的想法正在被争论,那就很难决定如何决定技术应该被允许做什么。这也影响到我们生活的各个方面——我们选择做什么,我们可能购买什么,我们可能去哪里,以及我们可能如何投票。现在还不清楚到底应该由谁来决定技术的范围。
由于生物技术(B)、计算能力(C)和数据分析(D)技术的共同发展,这种模糊性让我们直面一个重大问题。根据哈拉里的说法,这三样东西已经可以用来黑人类了(HH)。
对于我们当中有数学头脑的人来说,他将其总结为 B * C * D = HH。
借助现代技术,黑客攻击人类可能会成为一种非常现实的可能性。
“这是开启对话的时刻,开启对这些问题的研究,”李补充道。
如果操纵存在,政府、商业和个人自由的系统如何仍然合法?
爱与人工智能的极限
“爱情可以被黑客攻击吗?”—费-李非
如果人类可以被“入侵”,我们的行为和信仰可以被操纵,那么这种微妙控制的极限是什么?
我们可能会接受我们可能会在小事情中被操纵——当走进面包店时,谁不会突然渴望一个肉桂面包呢?—但我们控制行为的方式肯定是有限度的。
在这一点上,似乎没有人确切知道这些操纵的极限可能是什么。
然而,操纵的策略当然是众所周知的。罪犯和使用它们的骗子同样因其大胆而受到尊敬,也因其贪婪而受到媒体的唾骂,他们的故事在电影、文学和电视中被讲述。
总的来说,我们不相信自己容易被操纵。相反,我们认为那些被操纵的人是少数愚蠢的人。哈拉里总结道:“最容易被操纵的人是那些相信自由意志的人,因为他们认为自己不能被操纵。”
将爱情武器化作为一种潜在的操控手段不仅是可能的,而且是有据可查的。这个主题与浪漫骗局的悠久历史是一致的;我们很多人都听说过“异地恋者需要一大笔钱来应付一些小的紧急情况。”爱情骗局是所有类型中最“成功”的,去年美国人为此花费了 1 . 43 亿美元。
哥伦比亚心理学家 Maria Konnikova 也是《信心游戏》的作者,她提醒我们操纵“首先是通过情感来完成的”这让我们处于一种脆弱的状态,因为“感觉,至少在那一刻,取代了思考。”
毕竟,操纵系统——不管是不是人工智能——不一定要经历爱才能操纵人类与他人联系和亲密的能力。哈拉里解释说:“操纵爱情和真正感受爱情是两码事。”。
在不降低人类爱的重要性的情况下,生物和神经化学成分已经被很好地研究过了。
考虑到我们每个人提供的信息量越来越大,我们对自身生物学的了解越来越深入,再加上分析大量数据的成本更低,这种类型的更昂贵的骗局的可能性不容忽视。这些骗局利用了孤独、孤立和渴望与他人联系等非常真实、非常人性化的情感。
我们都容易受到这种操纵。“我们想要相信他们告诉我们的,”Konnikova 提醒我们。
很少有人对数据科学和技术进步的极限有明确的看法。李是乐观的。“我确实想确保我们认识到,我们离那个目标非常、非常、非常远。这项技术还很不成熟。”然而,赌注越来越高,如果目前是这种情况,这种情况会持续多久?
正如李所评论的:“我认为你真的揭示了这场潜在危机的紧迫性、重要性和规模。但我认为,面对这种情况,我们需要采取行动。”
将自我意识外包给 AI
“生活在这样一个世界里,你从一个算法中了解到关于你自己如此重要的事情,这意味着什么?”—尤瓦尔·诺亚·哈拉里
几千年来,人类一直在外包我们大脑做的一些事情。写作让我们能够保持精确的记录,而不是依赖我们的记忆。导航从神话和星图发展到地图和 GPS。
但是有了人工智能,我们有了一个彻底的机会:如果自我意识是人类将外包给技术的事情之一,会怎么样?
哈拉里讲述了一个关于他自我发现之旅的个人故事,承认他直到二十多岁才意识到自己是同性恋。这一发现引发了一个发人深省的时刻,表明我们都在努力看清自己的盲点。“我 21 岁才知道自己是同性恋。我回头看那个时候,我不知道是 15 岁还是 17 岁,这应该是很明显的。”
哈拉里继续说道:“现在在 AI 中,即使是今天非常愚蠢的 AI,也不会错过它。”
这开启了一个非常有趣的新可能性:算法可能知道我们还不知道的事情吗?
在人工智能的历史上,这几十年来一直是一个诱人的想法。
“我把我的钱押在一个赌注上,它说我们制造机器人的原因与我们制造其他种类的科学和艺术的原因相同,是为了获得巨大的满足感,了解一些我们以前不知道的关于我们自己的重要事情,让我们对自己的怀疑和猜测得到证实或被抛弃——简单地说,就是以一种新的方式看待我们自己。”著名人工智能历史学家、《会思考的机器》一书的作者帕米拉·麦科达克
甚至在今天,使用我们提供的数据,可能有可能诊断出无数不同的病症,从抑郁症到癌症,更早、更有意义地影响我们的生活。
除了我们的身体和精神健康之外,我们现在提供的数据还能让大规模分析揭示出什么,这是一种挑衅。毕竟,不管文化、世代和地位如何,人类经历的某些方面是不变的。
随着分析方法变得越来越先进,可用数据越来越多,我们可以学习哪些经验,与我们的朋友、邻居、生活在世界各地的人们分享,他们的生活与我们的生活几乎不同?
然而,仍然存在两个挑战。
给一个算法,即使是一个非常聪明的算法,一个给我们关于我们自己的信息的权限是有危险的。尤其是当它使质疑和验证变得困难的时候。
“一旦你把某样东西装扮成一种算法或一点人工智能,它就会呈现出一种权威的姿态,让人很难反驳。”— 汉娜·弗莱,受人尊敬的 UCL 数学家,《你好,世界》的作者。
如果一种算法预测我们患有癌症,我们可以进行测试,但如果它告诉我们一些更模糊的东西,比如说我们是否受欢迎,我们可能会倾向于认为这是真的,因为我们没有办法验证它。这反过来可能会导致我们做出不同的决定,因为我们错误地相信了一个潜在的错误算法。
Fry 指出,我们可能会相信算法所说的话,以至于它推翻了我们的个人判断。
她讲述了一车游客的故事,“他们试图开车涉水到达他们真正感兴趣的目的地。他们没有否决航行,必须获救。”
如果我们的自我认知被扭曲了,谁来拯救我们呢?
此外,使用数据与他人和我们自己的经历联系起来,与让算法深入了解我们的个人信息是另一回事,这些信息可能会与其他参与者而不是我们分享。
“如果算法不把信息分享给你,却把信息分享给广告主,会怎么样?还是与政府合作?”哈拉里疑惑道。
即使是现在,我们在社交媒体上的信息也被用来为我们提供“相关”广告,我们才刚刚开始发现是谁付钱让我们看这些广告。
“这是一个很好的例子,因为这已经发生了,”哈拉里说。
人工智能已经被用来预测我们是否会辞职或者与我们的另一半分手。两者都是非常个人化的决定,我们很多人都不愿意让私人朋友知道,更不用说非个人的组织了。
李怀疑一个算法是否能够通过这种方式超越我们自己的自省。“我不太确定!”她说,这给了我们希望,趁还有时间,我们也许能够深思熟虑地应对其中一些挑战。
“人类从火开始创造的任何技术都是一把双刃剑。因此,它可以给生活、工作和社会带来改善,但它也可能带来危险,人工智能就有这些危险,”她提醒我们。
人类处于人工智能的中心
“我们能否以一种以人为本的方式,重新构建人工智能和技术的教育、研究和对话?”—费-李非
随着讨论贯穿于如此多的相关学科,李为我们提供了一个灵巧的,尽管是开放式的建议,以开始解决我们面临的许多问题:以人为中心的方式重新构建人工智能。
李在斯坦福大学带着一个伟大的目标开始了变革,这个目标是为所有组织提供一个功能模板,无论其规模和来源如何。
她建立了斯坦福以人为中心的人工智能研究所,该研究所将汇集来自许多不同领域的个人进行新的合作对话。
该协会有三个宗旨:
- 深思熟虑我们希望人工智能是什么样的;
- 鼓励多学科研究;和
- 专注于人性的提升和发展。
“我们今天不一定会找到解决方案,但在下一章,我们可以让人文学家,哲学家,历史学家,政治学家,经济学家,伦理学家,法律学者,神经科学家,心理学家和更多其他学科参与人工智能的研究和发展,”李说。
这一建议源于研究人员和实践者在获得和保持公众信任、提供积极的用户体验以及用深思熟虑的政策建议取代人工智能中的恐惧传播方面面临的挑战。
在人工智能社区内定义明确的目标是朝着我们可以团结起来的中心迈出的重要一步,各个学科之间的交叉正在获得越来越多的牵引力。
“这正是为什么这是一个时刻,我们认为人工智能的新篇章需要由人文学家,社会科学家,商业领袖,民间社会,政府的交叉努力来书写,坐在同一张桌子上进行多边和合作的对话,”李强调。
但是我们来到了一个十字路口。
事实上,我们今天面临的许多伦理问题都是工程师决策的结果:“快速移动并打破东西”的风气最终导致了东西的真正打破。
在技术领域工作会让创造者看不到他们所创造的技术的效果。有无数无意的结果:大型在线零售商排挤小企业,改变我们城市的构成,仅举一例。
我们如何平衡创新的欲望和随之而来的风险?当公司在没有减速的情况下取得成功时,我们应该采取措施抑制它们的增长吗?
李对将伦理纳入软件学科持乐观态度。
“以人为中心的人工智能需要由下一代技术专家编写,他们上过像[斯坦福政治学教授]罗布[赖克]的课[计算机、伦理和公共政策]这样的课程,思考伦理含义和人类福祉。"
不管这个目标有多简单,人工智能社区的许多人可能会想,这是否也是最具挑战性的。
“作为技术人员,我们不可能独自完成这项工作,”李警告说。
我们如何说服在人工智能领域工作的高度技术化的人们,那些可能不想关心他们工作的社会影响等模糊主题的人,他们应该关心这些事情?此外,这应该是期望吗?我们是否需要对整个行业的每个角色都进行道德规范?
李就不那么肯定了。
“我们中的一些人甚至不应该这样做。伦理学家和哲学家应该参与进来,在这些问题上与我们合作。”
尽管在该行业工作的极少数有远见的人会忽视它的重要性,但它所要求的范式转变不应被低估。历史上,技术社区对任何非技术或与技术相关的主题都有很大的不屑。人工智能社区会尊重这些新观点的重要性吗?或者我们会对任何不懂反向传播的人睁一只眼闭一只眼吗?
当被问及哈拉里的作品是否在她的教学大纲中时,李甚至打趣道:“对不起,我的没有。我教的是硬核深度学习。他的书没有方程式。”
这场对话提出了一些重要的新问题,这些问题涉及人工智能在未来几十年可能会以何种方式影响我们个人,这是非常及时的。为了减少在没有很好地理解操纵可能性的限制的情况下“黑客攻击人类”的可能性,哈拉里敦促我们专注于自我意识:
“了解你自己是所有哲学书籍中最古老的建议。我们从苏格拉底、孔子和佛陀那里听说过:了解你自己。但是有一点不同,那就是现在你有了竞争…你在和这些大公司和政府竞争。如果他们比你更了解你自己,游戏就结束了。”
但正如李所建议的,合作是必要的。这项工作正在世界各地的许多组织中开始成形。
哈拉里和李之间的对话标志着人工智能中一种新型工作的开始。
“我们开启了人文主义者和技术专家之间的对话,我希望看到更多这样的对话,”她说。
我也是。
关于作者:
Briana Brownell 是一名数据科学家,后来成为科技企业家、未来学家和创新者。目前,Briana 是 PureStrategy.ai 的创始人兼首席执行官,pure strategy . AI 是一家技术公司,旨在创建人工智能同事并将其部署到企业中,以便员工可以更快地做出数据驱动的决策。作为一名频繁的主题演讲人、专家和作家,她以让非专家也能接触到高度技术性的话题而闻名,同时也领导了一场关于人工智能背后的科学的深思熟虑的技术讨论。
更多请看 这里*这里 和 这里 。*
Zalando 服装推荐和标签
原文:https://towardsdatascience.com/zalando-dress-recomendation-and-tagging-f38e1cbfc4a9?source=collection_archive---------16-----------------------
利用图像和文字描述来建议和标记产品
Photo by Becca McHaffie on Unsplash
在人工智能领域,计算机视觉技术被大量应用。一个很好的应用领域(我最喜欢的领域之一)是时装业。原始图像方面的资源可用性允许开发有趣的用例。Zalando 知道这一点(我建议看看他们的 GitHub 知识库)并经常开发令人惊叹的 AI 解决方案,或发表 juicy ML 研究报告。
在 AI 社区中,Zalando 研究团队还因发布 Fashion-MNIST 而闻名,这是 Zalando 文章图像的数据集,旨在取代机器学习研究中的传统 MNIST 数据集。最近他们发布了另一个有趣的数据集:。由服装图像和相关文本描述组成的数据集。和前一个一样,Zalando 将这些数据捐赠给了研究社区,以试验各种文本图像任务,如字幕和图像检索。
在这篇文章中,我利用这些数据来构建:
- 基于图像相似度的服装推荐系统;
- 仅基于文本描述的服装标签系统。
数据集
该数据集本身由 8732 幅高分辨率图像组成,每幅图像都描绘了 Zalando 商店出售的一件白色背景的裙子。为每张图片提供了五个德语文本注释,每个注释都是由单独的用户生成的。下面的例子显示了一件衣服的 5 个描述中的 2 个(英文翻译仅用于说明,但不是数据集的一部分)。
source Zalando
在开始时,数据集为每个单一描述存储相关图像(以 URL 格式):我们为单一服装加上条目。我们开始合并同一件衣服的描述,以方便操作图像并减少重复。
data = pd.read_csv('./FEIDEGGER.csv').fillna(' ')
newdata = data.groupby('Image URL')['Description'].apply(lambda x: x.str.cat(sep=' ')).reset_index()
服装推荐系统
为了建立我们的服装推荐系统,我们利用了迁移学习。具体来说,我们利用预训练的 VGG16 从我们的服装图像中提取相关特征,并在其上建立相似性得分。
vgg_model = vgg16.VGG16(weights='imagenet')
feat_extractor = Model(inputs=vgg_model.input, outputs=vgg_model.get_layer("fc2").output)
我们在倒数第二层“切割”VGG,因此我们为每一幅图像获得一个维度为 1x4096 的向量。在此过程结束时,我们可以在 2D 空间中绘制我们的所有特征:
TSNE on VGG features
为了测试我们系统的良好性,我们保留了一部分衣服(大约 10%)。其余部分用于构建相似性得分矩阵。我们选择余弦相似度作为相似度得分。每次我们向系统传递一幅服装图像时,我们都会计算所有存储在“train”中的服装的相似度,然后选择最相似的(相似度得分最高的)。
sim = cosine_similarity(train, test[test_id].reshape(1,-1))
在这里,我报告一些例子,其中“原始”图像是来自测试集的服装图像。右边的服装是 5 件最相似的,指的是我们之前看过的“原始”服装。
还不错!VGG 是非常强大的,做得非常好!
服装标签系统
我们开发服装标签系统所遵循的方法不同于前面的服装相似性方法。这个场景也不同于传统的标签问题,在传统的标签问题中,我们有图像和单个单词形式的相关标签。这里我们只有服装的文字描述,我们必须从中提取信息。这有点棘手,因为我们必须分析人类写的自由文本。我们的想法是从描述中提取最重要的词,以便将它们用作图像的标签。
下图总结了我们的工作流程:
图像描述是用基本的德语写的……Zum GLüCK spreche Ich wenig Deutsch(希望我会说一点德语),所以我决定用德语工作,如果有困难,请谷歌翻译。
我们的想法是开发两种不同的模型;一个是名词,另一个是形容词。为了进行这种分离,我们首先在原始数据集的图像描述上进行词性标注。
tokenizer = nltk.tokenize.RegexpTokenizer(r'[a-zA-ZäöüßÄÖÜ]+')
nlp = spacy.load('de_core_news_sm')def clean(txt):
text = tokenizer.tokenize(txt)
text = nlp(" ".join(text))
adj, noun = [], []
for token in text:
if token.pos_ == 'ADJ' and len(token)>2:
adj.append(token.lemma_)
elif token.pos_ in ['NOUN','PROPN'] and len(token)>2:
noun.append(token.lemma_)
return " ".join(adj).lower(), " ".join(noun).lower()adj, noun = zip(*map(clean,tqdm(data['Description'])))
我们把所有的形容词组合起来后,指的是同一个意象(名词也是如此)。
newdata = data.groupby(‘Image URL’)[‘adj_Description’].apply(lambda x: x.str.cat(sep=’ XXX ‘)).reset_index()
在这一点上,为了提取每个图像的有意义的标签,我们应用 TFIDF 并基于这个分数获得最重要的形容词/名词(我们已经选择了 3 个最好的形容词/名词。如果没有找到单词,则返回一系列‘XXX’只是为了提高效率)。我还计算出一系列要排除的模糊形容词/名词。
def tagging(comments, remove=None, n_word=3):
comments = comments.split('XXX')
try:
counter = TfidfVectorizer(min_df=2, analyzer='word', stop_words=remove)
counter.fit(comments)
score = counter.transform(comments).toarray().sum(axis=0)
word = counter.get_feature_names()
vocab = pd.DataFrame({'w':word,'s':score}).sort_values('s').tail(n_word)['w'].values
return " ".join(list(vocab)+['xxx']*(n_word-len(vocab)))
except:
return " ".join(['xxx']*n_word)
对于每件衣服,我们最终最多有 3 个形容词和 3 个名词…我们已经准备好建立我们的模型了!
为了填充我们的模型,我们利用了以前使用的特征,这些特征是用 VGG 提取的。在我们的例子中,每件衣服最多出现 3 次,最多有 3 个不同的标签(指 3 个不同的形容词/名词)。我们使用的模型非常简单,具有相同的结构,如下所示:
inp = Input(shape=(4096, ))
dense1 = Dense(256, activation='relu')(inp)
dense2 = Dense(128, activation='relu')(dense1)
drop = Dropout(0.5)(dense2)
dense3 = Dense(64, activation='relu')(drop)
out = Dense(y.shape[1], activation='softmax')(dense3)model = Model(inputs=inp, outputs=out)
model.compile(optimizer='adam', loss='categorical_crossentropy')
来看看成果吧!
我们在以前的相同服装上测试我们的模型,并绘制出前两个概率最高的标签,用于形容词和名词(我也提供翻译)。成绩很棒!总的来说,我们的模特能够很好地描述图片中的服装。
摘要
在这篇文章中,我们利用迁移学习直接开发了一个基于内容的推荐系统。在第二阶段,我们尝试标记服装,仅从文本描述中提取信息。取得的效果非常漂亮,易于观察,还能为你更新衣柜提供建议。
查看我的 GITHUB 回购
保持联系: Linkedin
禅宗和模型优化的艺术
原文:https://towardsdatascience.com/zen-and-the-art-of-model-optimization-5fcf7c405b28?source=collection_archive---------16-----------------------
在数据世界里争吵
社交媒体 NLP 挑战中的模型比较
Z en 和摩托车维修艺术是我大学时最喜欢的书之一。这本书以一对父子穿越美国的摩托车旅行为背景,思考如何过有意义的生活。可以说,作者罗伯特皮尔西格阐述的关键信息是,只有当我们全心全意地投入手头的任务时,我们才能实现卓越。如果一件事值得做,那就值得做好。
几乎与此同时,研究设计和统计推断课程向我灌输了可解释性和简约性的重要性。沟通确实广而告之(希望?)作为一个数据科学家的必备技能。毫无疑问,向外行观众解释某些模型的发现和工作原理比其他模型更容易。对于我们日常工作中的许多人来说,优化的可解释模型几乎可以做得一样好,有时甚至超过更复杂的模型。如果一个模型值得运行,那么它就值得优化运行。
有条不紊的数据清理、仔细的特征选择/工程、明智的评分标准选择以及模型超参数微调可以有力地提升模型性能。在这篇文章中,我在一次自然语言处理挑战中用逻辑回归 (logit)和多项朴素贝叶斯 (MNB)与随机森林 (RF)分类器和支持向量分类器 (SVC)进行了较量。
逻辑回归长期以来被用于统计推断,并且是机器学习分类任务的主力,而 MNB 被认为是 NLP 的基本模型之一。尽管随机森林算法不是“黑盒”,但它们比罗吉特或 MNB 更难解释。然而,支持向量机绝对是黑盒。我在预测和推理之间的大辩论中不持立场,而选择 NLP,因为这是一个预测是唯一目标的领域。
自然语言处理分类
选择的数据集来自 Crowdflower 的 Data For Everyone Library ,其中包含来自美国政客社交媒体账户的 5000 条消息。这些信息从几个方面进行了分类,如党派偏见、目标受众和主题。我将试图预测这些信息的政治偏见——“党派”或“中立”。
数据集中有相同数量的脸书帖子和推特推文,但只有 26% 的消息被归类为“党派”。因此,我们有了一个不平衡的数据集,其中“中立”信息几乎是“党派”信息的三倍。换句话说,如果这是一个装有四个黑白球的袋子,那么只有(大约)一个黑球对三个白球。因此,如果我的目标是选一个黑球,也就是预测一个“党派”信息,我将有很大的胜算。
在目标变量中“党派”类编码为 1 ,“中立”类编码为 0。鉴于我的目标是预测“党派”信息,我将避开整体模型准确性分数,而是关注“党派”(少数民族)类别的 F1 分数、以及 Cohen 的 kappa 统计。
假设我们有一个分为“正”或“负”的二元变量,这是纯粹用来区分这两个类别的术语。根据下面描述的风格化的混淆矩阵,我们在水平轴上有二元变量的预测类,在垂直轴上有实际类。
自然,预测很可能不是 100%准确的,所以我们可以将那些“肯定的”预测分为正确的(真肯定)或错误的(假肯定)。我们可以对“负面”预测做同样的事情。“阳性”类别的精确率将是真阳性的总和除以总阳性类别预测(或真阳性+假阳性)。所以 精度是模型从其预测的阳性观测值中挑选出一个真阳性的概率。
另一方面,召回率是真阳性的数量除以真阳性和假阴性之和的比率。请注意,假阴性是那些被模型错误地标记为“阴性”但实际上是“阳性”的观察结果。所以回忆描述了模型从实际阳性观察值中挑选出一个真阳性的概率。
当正类在不平衡数据集中占少数时,精确度和召回率是模型预测能力的更有用的度量,并且主要目标是正确识别那些正观察值。F1 得分是准确率和召回率的调和平均值。
Cohen 的 kappa 是一个更广泛的统计数据,它告诉我们该模型在预测“积极”和“消极”类别方面的表现比单独的随机机会好多少。kappa 统计值大于 0 意味着模型比 chance 更好,它越接近最大上限 1 意味着模型对数据的分类越好。
一袋单词
“单词包”(BoW)是 NLP 中基本的机器学习技术。网上有无数的帖子详细描述了 BoW,所以我没有必要赘述。只要说 BoW 方法从预先分类的文本中提取单个单词就足够了,不考虑语法和顺序。它假设文本之间的意义和相似性被编码在抽象词汇中。虽然这听起来很简单,但它确实非常有效。
BoW 的一个主要问题是提取单个单词作为特征会很快导致财富的尴尬,或者被称为“维数灾难】。除了具有比观察值更多的特征的潜在问题之外,词频通常遵循长尾 Zipfian 分布,这会对广义线性模型的性能产生不利影响。如果这些问题还不够,多重共线性是另一个问题。
例如,在我们的 5000 个社交媒体帖子的样本中,将有数万个单独的单词和符号被提取,其中许多是不相关的(即 https、www、@、today 等。).维数灾难往往是逻辑回归的一个问题(长尾分布加剧了这一问题),加上其他如 kNN 和决策树。然而,MNB 在这方面往往表现良好。RF 也可以做得很好,因为它是基于随机组合回归变量的重复抽样。
因此,我们需要无情地筛选潜在的变量数量。我首先清理文本,删除不相关的符号,增加停用词列表,以减少特征维数。下面显示了来自数据集中的两条消息的比较,并列显示了原始版本和清除版本。显然,对清理后的消息还需要做更多的工作,下一步是添加一个停用词列表。
下一步应该跟在词干化或词汇化、之后,通常只有一个或另一个就足够了。词干通过丢弃复数、性别、时态、大小写、基数等将单词合并在一起。,并且基本上是 NLP 的一种形式特征工程来减少特征空间。我将 Porter 词干提取算法插入到 CountVectorizer 中,以提取文本数据。我可以使用的其他特征工程选项是计数矢量器中的 n_grams 和min _ df参数。
跨过程和模型的网格搜索
我在以下四个模型上运行了GridsearchCV:logit、MNB、RF 分类器和 SVC。Python 中的 sklearn 库允许您更改 logit、RF 和 SVC 的 class-weight 参数,在处理不平衡数据时,建议指明class _ weight = " balanced "。
Gridsearch 被设置为优化“partisan”类上的 F1 分数,其中包括计数矢量器(带有波特词干分析器、 n_gram 和 min_df )、tfidfttransformer以及模型。数据经过80–20 训练测试分割,训练设置到进一步的 cv=5 交叉验证程序。
**
SVC 在训练集上取得了最高的平均 CV 分数(F1 ),但在测试集上取得了最低的 F1 分数。在测试集上,RF 和 SVC 都取得了明显高于 logit 或 MNB 的总体准确率分数(下图中的绿条)。然而,当测试集上的 F1 分数下降时罗吉特和 MNB* 都胜过了更复杂的模型(下图中的红色条)。***
所有结果都基于单独优化的算法,详情如下。有趣的是,尽管避免使用波特斯特梅尔*和 TfidfTransformer,MNB 在测试集的 F1 分数方面成为了赢家。所有其他型号都求助于使用词干分析器,尽管 SVC 也没有使用 TfidfTransformer。*
检查各个混淆矩阵的细节将有助于深入了解每个模型的表现。下面显示了来自 logit 和 SVC 模型的测试集结果的矩阵,以供说明。
根据 logit 的混淆矩阵,它从 435 个(或 203 + 232)的总正面预测中正确地选择了 203 个真正正面(“党派”)的消息,这使它的准确率达到 46.7%。还可以将 203 个真阳性消息与 262 个(或 203 + 59)的实际阳性消息总数进行比较,这意味着召回率为 77.5%。因此,logit 模型取得了 58.2%的 F1 分数。
相比之下,SVC 模型在这方面表现不佳。它设法从 175 个(或 99 + 76)的总正面预测中获得 99 个真正正面的信息。虽然精确率可能看起来不太差,但 99 个真正的正面预测需要与 262 个(或 99 + 163)的总实际正面消息进行比较。微弱的召回率拖累 SVC 的 F1 成绩仅为 45.3%。似乎 SVC 的预测能力更集中于负面类别,这使它获得了更高的总体准确性分数,但这不是这里的目的。
对少数民族类进行重采样
一种可能是使用单词嵌入,这是一种比 BOW 更高级的方法。然而,单词嵌入往往在一个非常大的训练文档集上表现最好。在处理相对较小的数据集中的简短和特定领域的社交媒体帖子时,这可能不是最佳方法,就像本例一样。
我认为走另一条路会更有成效,特别是考虑到不平衡的数据问题,那就是对训练集进行重新采样,以便模型在更平衡的数据上进行训练。选择的算法是流行的 SMOTE (合成少数过采样技术)和组合 SMOTE-Tomek 。
SMOTE 通过对少数类进行过采样来帮助平衡这些类,并通过对它们之间的空间进行线性插值(使用k-最近邻方法)来生成合成少数类观察值。插值过程意味着它将仅从可用的示例中生成合成观测值。
另一方面,Tomek links 是一个欠采样*过程,它移除多数类观察值,以便在多数类和少数类之间创建更清晰的空间分界。SMOTE-Tomek 算法基本上结合了 SMOTE 和 Tomek 链接的过程。*
我重复了80–20 训练测试分割,在训练集上又进行了五次交叉验证程序。重采样过程应该只在训练集上进行,然后在未改变的测试集上对训练的模型进行评分。
为简洁起见,我将只报告使用上述优化模型参数的 SMOTE 和 SMOTE-Tomek 重新采样的结果。SMOTE 帮助提高了 logit 模型在测试集上的整体准确性分数和 Cohen 的 kappa,但对 F1 分数仅产生了微小的改善。SMOTE-Tomek 更适合 MNB 模型,尽管改进并不显著。
另一方面,重采样技术削弱了 RF 和 SVC 模型的分数。这似乎证实了这些更复杂的模型正将其预测能力集中在该数据集中的大多数“负面”类别上。在任何情况下,logit 和 MNB 仍然表现出比 RF 和 SVC 更低的准确性分数,但他们的优于 F1 的分数仍然更高。
MNB 最终摘得桂冠在“党派”级别的 F1 分数和科恩的 kappa 统计数据方面,在 SMOTE-Tomek 重采样的帮助下获得了最高分。洛吉特紧随其后。让我们按照 SMOTE-Tomek 程序比较来自 MNB 和 RF 模型的测试集的混淆矩阵。
我们可以观察到,MNB 达到了 50%的准确率,甚至更高,72.1%的召回率。另一方面,RF 模型获得了 51.9%的精确率和 52.7%的召回率。与 SVC 模型类似,随机森林分类器似乎更加关注多数否定类。
因此, logit 和 MNB 在这场 NLP 挑战中胜过了 RF 和 SVC ,其目标是预测“党派”政治信息。记住,偶然预测到“党派”信息的基线概率只有 26%。MNB 和 logit 模型的 F1 值为 0.58-0.59,科恩的 kappa 值为 0.39-0.40。RF 和 SVC 算法返回更高的准确度分数,但是在目标“党派”类上的 F1 分数较弱。
结论
这篇文章不是关于哪个机器学习模型是绝对最好的。它是关于为什么我们应该努力优化我们选择运行的模型的性能。优化模型性能涉及从系统的数据清理,仔细的特征选择/工程,明智的选择评分指标,模型超参数微调,到其他相关措施以提高模型性能,例如在不平衡数据集的情况下进行重采样。
通过这样做,简单且可解释的模型通常可以产生令人惊讶的性能结果。如果这有助于我们数据科学工作的交流方面,那就更好了。我将引用罗伯特·皮尔西格的一段话来结束我的发言,他进而解释了柏拉图的话:
“菲德鲁斯,什么是好的,什么是不好的——我们需要别人告诉我们这些吗?”
班加罗尔佐马托数据分析
原文:https://towardsdatascience.com/zomato-bangalore-data-analysis-6ee83652890f?source=collection_archive---------14-----------------------
在班加罗尔吃什么和去哪里吃——数据科学家指南
Source
介绍
班加罗尔(官方称为 Bengaluru)是印度卡纳塔克邦的首都和最大的城市。
班加罗尔人口超过 1500 万,是印度第三大城市,世界第 27 大城市。班加罗尔是印度种族最多样化的城市之一,超过 51%的人口是来自印度其他地区的移民。
班加罗尔有时被称为“印度的硅谷”(或“印度的 IT 之都”),因为它是印度领先的信息技术(IT)出口商。
班加罗尔有独特的饮食文化。在孟加拉鲁鲁,可以找到来自世界各地的餐馆,提供各种美食。有些人甚至会说班加罗尔是美食家的最佳去处。
食品行业在班加罗尔一直处于上升趋势,目前该市有 12,000 多家餐馆,而且数量还在不断增加。
班加罗尔越来越多的餐馆和菜肴吸引我去检查数据,以获得一些见解、一些有趣的事实和数字。
因此,在本文中,我将分析班加罗尔市的 Zomato 餐馆数据。
数据
对那个统计问题的一个有意义的回答
原文:https://towardsdatascience.com/zooming-in-and-zooming-out-9d70e561d609?source=collection_archive---------13-----------------------
关于定性样本量的一个注记
Zooming in or zooming out? How close a picture you need will impact your sample size. (Photos from @ryoji__iwata and @13on via unsplash.com)
本文涵盖:
- 为什么小样本在定性研究中是可以接受的
- 质性研究的总体目标是什么
- 如何确定样本量,如果判断错误该怎么办
- 简要了解如何在定性或定量方法之间进行选择
寻找意义
当我把定性研究的发现带给商业世界的利益相关者时,我经常能预测到至少一个问题:
"这个样本量在统计上有意义吗?"
每个人都喜欢数字。不,他们不喜欢与数字打交道,也不喜欢处理获得这些数字所涉及的实际计算,但当别人为他们“处理”这些数字,然后在报告中呈现出来时,他们会感到安全和有保障。鉴于数学恐惧症的流行,这种对数字的信任从未停止让我惊讶。也许是因为太多人纠结于统计和概率之类的事情,所以他们如此坚定地尊重至关重要的置信区间。无论我们的文化对数字的痴迷是什么情况,任何定性研究人员(以及大多数优秀的定量研究人员)都知道,许多事情可以从数字中忽略。
Possible source: Lightbulb Cartoon http://myhome.iolfree.ie/~lightbulb/Research.html (This cartoon appears in numerous places. I have attempted to source it accurately.)
那么,在定性研究中,小样本是如何工作的呢?让我来分解一下。
一次
使用定性数据进行采样的目标是检测重复模式——而不是达到统计显著性。因此,10-20 人范围内的样本量非常普遍。通过这些较小的样本量,定性研究寻找信号,这些信号是人群中趋势的指标。一旦发现这些趋势,研究团队就可以深入挖掘,找出驱动这些趋势的潜在目标和动机。将这些驱动因素与业务目标联系起来,可以在组织和客户之间建立成功的合作关系。
通过定性研究,你可以放大并更近距离地了解更少的人。以便你更好地了解他们。
两次
通过较小的样本量,我们能够深入了解每个参与者。这使我们能够发现参与者之间的模式,或者换句话说,发现指示趋势的信号,这使我们能够识别和描述这些人的驱动因素,最终使我们能够将客户和业务目标联系起来。
第三次最有魅力
Look -> Detect -> Identify -> Connect
你不需要很大的样本量来做这件事。
找到合适的尺寸
好吧,好吧——小样本没问题。但是到底有多小呢?
在决定与多少人交谈(你的样本量)进行定性研究时,你希望达到饱和或者通常被描述为“最不令人惊讶的点”这是研究中的一点,你可以可靠地猜测一个新的参与者将如何回应提示,你不再接触新的信息。过了这个点你的收益就会递减。
你如何预测什么样的样本量会达到饱和?你不知道。但是有了关于人口的基本知识(它有多多样化,它在地理上分布有多远,任何人口统计或行为变化,等等)。)和对期望的输出类型的理解(例如,为新设计提供信息的洞察力与建立商业策略的洞察力),您可以做出相当好的估计。设计决策可以在样本量特别小的情况下做得很好,特别是如果你计划在以后做用户测试,而策略工作通常需要更大的、仍然相对较小的样本。我不能给你确切的数字。它会根据你的工作而变化。
但如果我估计过高呢?
如果你估计样本量为 20 人,遵循良好的筛选和招募实践,在 15 人之后,你觉得你不再学习新的东西:祝贺你达到饱和!这么快——太棒了!你可以在最后五个问题中加入一些新的问题,深入到你已经发现的趋势中,或者添加一行你认为不适合原始范围的问题,或者你可以停止数据收集并尽早开始分析。
如果我估计过低呢?
如果你估计一个 10 人的样本,你仍然在第 10 个参与者身上发现很多令人惊讶的新事物,或者如果你的参与者真的没有一个看起来非常相似,你没有达到饱和。那是粗糙的。但有一点你已经了解到,你的人口比你想象的更加多样化。知道这一点是件好事。当你不得不告诉你的团队你没有得到足够的覆盖率时,面对这种情况可能会令人畏缩,但是你肯定已经获得了一些新的和意想不到的行为——你一定获得了,或者你已经能够更好地预测你需要的样本量。这就是学习,这很好!你现在需要买入来和更多的人交谈,所以通过把这些新现象呈现为机会来激发你的利益相关者的发现欲望。
把你的发现当成机会来呈现。
关于检测信号的最后一点提示
定性研究使用较小的样本量,并且不以定量研究中经常追求的统计学意义为目标。
为什么?
因为定性研究不是记录流行程度,而是检测信号。隐喻的时间到了。迁就我。把定性研究(qual)想象成创新沙滩上的金属探测器。它能探测到附近任何金属发出的信号。更仔细的观察可以揭示更多关于这种金属的情况。它可能是金的,可能是银的,也可能只是锡。但如果它在那里,你会收到信号的。确定你发现的东西是否有价值是你的工作。Qual research 是一种金属探测器。
使用 Qual research 扫描一个区域寻找信号。您可能会发现几个有趣的热点,尽管每个热点的精确值可能并不清楚。你用你对该领域的知识(你的商业知识)和你对进一步探索的兴趣(你愿意在创新上投入时间和资源)来决定如何跟随一些或所有这些信号。定量研究可以成为进一步探索的一部分。Quant 更像是在挖矿。
在许多情况下,定量研究只会具体找到它要找的东西:某个地点的金币。你要么在那里找到他们,要么找不到。你不可能找到任何你不想找的东西,比如几英尺外的银币,因为那不是你的仪器校准的目的。这很好。当你已经有了黄金就在附近的信号,现在你想知道有多少时,你就使用量化研究。
请这样想:
- 零售商知道特定人群正在购买防晒霜,并且零售商现在想知道该人群购买的频率。使用定量研究,因为你知道你在寻找什么——购买防晒霜。
- 零售商想知道这些人是如何为夏季海滩旅行做准备的。使用定性数据,因为你在寻找信号,但不确定你能探测到什么。
如果你是一个正在计划夏季前生产的防晒霜制造商,你需要第一个。如果你想在暑假市场创新,第二个是一个更好的开始。
前进
研究最重要的部分,无论是定性的还是定量的,是提出问题并寻求答案。当您的目标是将客户目标与业务目标联系起来时,不要让任何人以关于统计重要性的异议来排斥您。这已经很重要了。
你是不是从实地调查赶去调查结果?停下来先花点时间处理你的数据。
Kelly Moran 利用天生的好奇心和不断询问“为什么”的欲望来理解人们如何使用产品和服务来实现他们的目标——无论这些目标是工作还是娱乐。凯利曾是达拉斯咨询公司 projekt202 的首席体验研究员,现在在谷歌 UX 研究部工作。在:【https://medium.com/@Kel_Moran】找到她的其他文字,或者在 twitter 上关注她:【https://twitter.com/Kel_Moran】