TowardsDataScience 博客中文翻译 2016~2018(三百一十七)
1/2 的概率意味着什么?—概率的频率主义方法
我的一个朋友每当面临困难的决定时就扔硬币。有用吗?我不知道,但他认为是的。从统计学上来说,不应该。一枚硬币有两面,我们大多数人都意识到任何一面出现的几率都是 50%。将此转换为概率(这简单地意味着我们想要给我们的机会分配一个数字),我们可以说在一次硬币投掷中获得正面的概率正好是 0.5——假设没有人篡改我们的硬币。然而,这些 0.5%或 50%的数值(它们代表同样的东西)实际上意味着什么呢?这是否意味着每掷两次硬币,我们一定会得到一个正面和一个反面?这不可能是真的;我们凭经验直观地知道这一点。
然而,当涉及到这样的问题时,我们的直觉不一定是非常可靠的来源。我们的直觉经常让我们得出令任何数学教授都感到恐惧的结论。现在,在你给这种说法贴上完全垃圾的标签,用无数次你的直觉能够提供与亚里士多德相媲美的洞察力的机会来轰炸我之前,让我给你一个简单的例子。
假设一个假想的场景,你所要做的就是扔一枚硬币,然后把它叫出来——我知道这没什么令人兴奋的,但请继续关注我。因为你知道要么正面要么反面出现的概率正好是一半,所以——只是因为你喜欢——假设你称之为正面;但是,最后都是尾巴。酷毙了。你再扔一次,坚持你的叫牌(正面),结果又是反面。令人沮丧。在给它第三次投掷之前,你考虑你的下一个电话。你的直觉告诉你,由于前两次投掷都是反面,这一次很可能是正面。有道理,但是直觉几乎总是有道理的,不一定代表就是正确的。有道理和正确是两回事;不幸的是,这次我们的直觉是错误的。
它让我们相信获得正面的概率实际上增加了,即不再是 0.5;事实上,还不止这些。你想想,这可能是真的吗?这不可能。它仍然是同一个硬币,因此,没有理由改变概率。
在概率的世界里,直觉需要退居二线。
然而,现在让我们回到我们最初提出的问题。一半的概率到底是什么意思?如果这并不意味着每次我们掷两次硬币都会得到一个正面,那么为什么它会被指定为数字半(1/2)。为了回答这个问题,我们可以采取两种方法:频率主义方法,或者公理化方法。虽然公理化方法在数学上更优雅,但我们将重点关注频率主义方法,并将公理化方法留待以后讨论。
这两种方法都为我们提供了一种不同的方法来为一个特定的事件分配一个概率值(在我们的例子中:获得人头的概率)。频率主义者的方法要求我们做以下事情:重复实验若干次,然后简单地用你得到你想要的结果的次数除以你进行实验的次数。听起来很棘手?它不是。比方说,你掷一枚硬币 20 次,结果是 12 次正面朝上。因此,我们需要做的就是用 12 除以 20,得到 0.6。但是,这是否意味着获得人头的概率是 0.6 呢?不幸的是,它不是那样工作的。
如果你可能已经注意到,我们定义方法的方式相当模糊。要求某人“多次”重复一个实验不是一个好主意;根据他们如何定义“一些”,他们可能会重复实验二十次、两百次,或者如果他们很匆忙的话,可能只重复两次。你问我们需要重复多少次;确实是一个非常好的问题。简单的答案是:尽可能多的次数。
比方说,你只扔两次硬币。两次都是反面。使用我们的公式,正面的概率是 0/2,也就是 0!
现在来折腾两百次吧。假设 200 次中有 115 次正面朝上,我们可以看到正面朝上的概率可以写成 115/200,即 0.575。我们现在越来越接近了。
如果我们折腾两千次,得到人头的概率会不会更接近 0.5?频率主义者的方法声称它会。事实上,这正是 frequentist 方法的基础:你重复实验的次数越多,你就越接近获得真实的概率值。不过,有一个问题:为了得到真实的概率,你必须进行无数次的实验。但是,不要让这个太困扰你。当我们做了大量的实验后,我们得到正面的概率值可能会看起来像这样:0.5006;实际上,这可以四舍五入到 0.5。
有人实际尝试过这种方法吗?令人惊讶的是,答案是肯定的。列纳德·蒙洛迪诺在其引人入胜的作品《酒鬼之行》中提到了一位南非数学家,他在 20 世纪 40 年代实际上进行了一万次硬币投掷。约翰·克里奇当时是一名德国战俘,因此有充足的时间可以支配。他开始掷一枚公平的硬币,并记录下他的结果。当他投掷了 100 次后,他的正面概率大约是 0.44 (44/100)。然而,当他完成(一万次投掷)时,它已经上升到大约 0.5067 (5067/10000),非常接近实际值 0.5!
我们能重复 Kerrich 的实验吗?我们当然可以。但是我们实际上并不需要一枚硬币来重复实验。我们可以简单地让计算机为我们模拟实验。电脑最棒的一点是,它们做这个不会累,而且速度极快。下面是我用一种叫做 python 的语言写的一个计算机程序。你不必担心编程部分,那不是我们目前最关心的。
Figure 2: A function which simulates coin tosses, and then uses the frequentist approach in order to calculates the probability of getting a head
我所做的是,我写了一个函数,在这个函数中,我创建了一个虚拟硬币。你只需要提供你想折腾的次数就行了。然后,这个函数将模拟投掷次数——每次投掷随机出现正面或反面。该函数将计算人头出现的次数,然后简单地除以投掷的总次数,以计算出人头出现的概率。
Figure 3: Results of tossing 10 coins, 100 coins, and 1000 coins
我首先试着掷硬币十次,结果得到的概率是 0.4 (4/10)。然后我试着扔了一百次,最后得到的概率是 0.48 (48/100)。我最后试着扔了一千次,果然,最后得到的概率是 0.507 (507/1000),这看起来非常像 0.5 的真实概率。
因此,当我们说获得正面的概率是 1/2 时,它实际上意味着——根据频率主义者的方法——随着你不断投掷硬币(次数越多越好),你获得正面的次数与投掷总数的比率将接近 1/2。注意,直觉。
虽然我们可以继续用我们的虚拟硬币投掷器做越来越多的投掷,但我不想让你无聊死;希望到现在为止,你已经相信频率主义者的方法实际上是有效的——最好的部分是,我们做到了,没有累着我们的手。
AI RFP 需要包含什么?
AI RFP
我们正在启动一系列针对合作伙伴的帖子,帮助他们将人工智能技术商业化。在本帖中,我们涵盖了合作伙伴在销售和实施层面最重要的一点:AI RFP 需要包含什么?
对于那些不熟悉这个术语的人来说,RFP 意味着“提案请求”。在人工智能销售过程中,电子大脑使用 RFP 来快速评估项目。一个良好构建的 RFP 确保电子大脑团队能够提供快速周转,因此您可以为您的客户提供快速服务。为了能够对人工智能项目的价格和时间表进行报价,我们需要回答的问题真的很少。
人工智能技术试图解决的商业问题是什么?
你必须清楚地告诉我们人工智能试图解决的高层次问题。尽可能地将这一点与人工智能解决方案如何影响业务底线联系起来。是为了吸引更多顾客的华而不实的技术吗?或者,我们是在尝试自动化现有流程并降低成本吗?以下是一些我们需要回答的潜在问题:
- 正在解决的业务问题是什么?
- 人工智能解决方案有望带来多少额外收入?
- 人工智能解决方案有望节省多少成本?
- 正在处理什么类型的数据?视频?图像?文字?约会吗?数字?时序数据?
我们从哪里获得人工智能的数据?
需要回答的一个最重要的问题是,客户是否有合适的数据来创建解决方案。所有人工智能解决方案都需要数据才能工作。然而,最具创新性的解决方案并不是利用你手头的数据构建的。它们经常需要一段时间来手动收集数据集。有时这是一个先有鸡还是先有蛋的问题。如果人工智能不工作,我们怎么发射?我们需要发射来获取数据。我们需要数据来让人工智能工作。
当和你的客户讨论这个项目时,试着想一些巧妙的方法来解决这个问题。通常,人工智能系统会让人类参与进来,以便“训练”人工智能。如果系统不知道如何处理一个特定的输入,它可以把这个输入路由给一个“人”,让这个人来处理。然后,这些人可以服务于第二个目的,即监控人工智能,并确保它在适当的质量水平上工作。
通常,客户会问你需要多少数据才能让系统工作。这是一个很难肯定回答的问题。然而,必要时,请遵循以下经验法则:对于您认为需要理解的数据中存在的每个潜在“模式”,您将需要 1000 个条目。例如,假设您正在创建一个系统,它可以根据照片预测汽车的品牌、型号和年份。这里的经验法则要求你有 1000 张每种品牌、型号和年份的汽车的图片。然而,假设你只是试图预测品牌。这是一个比较简单的问题,你可能只需要很少的图片就可以了。
- 客户已经有数据了吗?
- 他们已经获得了多少数据?
- 数据需要以某种方式手动“增强”吗?
- 数据缺少 AI 解决方案需要的东西吗?
- 数据有多“嘈杂”?
- 我们能在没有数据集的情况下推出产品,并在开发过程中收集数据吗?
对解决方案的质量/准确度有什么要求?
取决于人工智能系统正在做什么,对它的质量可能会有不同的期望。例如,在语音识别解决方案中,我们期望 100%的准确率——我们希望系统能够识别我们说的每一个单词。然而,在一个做中频股票交易的系统中,如果系统有 75%的准确率,只要比随机概率好得多,我们就可以满足了。对质量的要求会变得更加复杂。假设你有一个能找到恐怖分子的系统。100 万人中可能只有 50 人是恐怖分子。一个 99%准确的系统意味着它能正确识别 49 名恐怖分子,但另外 10,000 名完全普通的人会被错误地宣布为恐怖分子。这里,你需要区分假阳性和假阴性率。
- 系统的质量应该达到什么水平?
- 有什么方法可以衡量质量的高低?还是纯粹主观?
- 系统需要以这样或那样的方式“偏向”吗?
技术在哪里实现?
人工智能技术的设计将根据系统部署的环境而有所不同。对于大多数用例,该技术安装在服务器上,并集成到 SaaS 类型的产品中。然而,在某些情况下,人工智能技术可能需要直接在移动设备上运行。这更具挑战性,但并非不可能。
- 这项技术是部署在服务器上还是移动设备上?
- 是否需要集成到更大的产品中?
- 较大的产品构建在什么堆栈上?Linux?Windows?iOS?安卓?
- 周边系统内置了哪些编程语言和框架?
- 人工智能的相关数据保存在什么数据库中?
有没有周边的非 AI 技术也需要开发?
如果正在创造的技术是一个新产品的原型,在人工智能技术之上,仅仅创造产品本身就可能需要额外的工作。
- 是否有需要开发的用户界面?
- 用户界面是基于网络的还是移动的?两者都有?
- 是否存在需要作为解决方案的一部分构建的大型复杂系统的集成?
结论
我希望这有助于你更好地理解你需要把什么放进一个人工智能的建议书中。通过彻底调查和记录您客户的需求,我们可以为您提供非常快速的周转时间。这确保了顺利和快速的销售。
本帖原载于www . electric brain . io。
理想的数据科学家的个人资料是什么样的?
分析 1000 份招聘启事的结果
(这是我的数据科学职业项目的第 2 部分。你可以在这里找到第一部。)
如果你是一名数据科学求职者,你一定一直在想应该在简历上写些什么技能才能接到电话;如果你想进入这个领域,你可能已经挠了很多次头,想知道学习哪些技术才能成为一个有吸引力的候选人。
继续读下去,我有你的答案。
首先,我们看看不同职位的技能要求。(图表如下)
Python 和 R 之间不再有争论,因为 Python 现在是主导者
曾经有一场关于 Python 或 R 是数据科学的首选语言的争论。显然,市场需求告诉我们,Python 现在是领导者。同样值得注意的是,R 甚至比 SAS 更少被提及。因此,如果您正在考虑进入数据科学,请考虑将您的学习精力集中在 Python 上。SQL 作为数据库的语言(也可能是数据!),成为数据科学家第二重要的语言。由于数据科学家职业的广泛性,其他语言也扮演着重要的角色。
总结一下,数据科学家的顶级语言有: Python,SQL,Scala,Lua,Java,SAS,R,C++和 Matlab 。
机器学习工程师所需的语言更加多样化
Python 作为机器学习的事实上的语言,毫不奇怪地成为机器学习工程师的顶级语言。因为需要从零开始实现算法,在大数据环境中部署 ML 模型,所以 C++和 Scala 等相关语言也很重要。总的来说,与其他两个角色相比,对语言的需求似乎更加分散。
综上所述,机器学习工程师的顶级语言有: Python,Scala,Java,C++,Lua,SQL,Javascript,Matlab,CSS 和 C# 。
如果你想成为一名数据工程师,SQL 是绝对必须的
数据工程师无时无刻不在和数据库打交道,SQL 就是数据库语言,所以难怪 SQL 是顶级语言。Python 很重要,但还是输给了 Scala 和 Java,因为这些语言帮助数据工程师处理大数据。
综上所述,数据工程师的顶级语言有: SQL、Scala、Java、Python 和 Lua 。
Scala 正在成为数据科学中第二重要的语言(不是 R)
有趣的是,当我们研究不同的角色时,Scala 要么是第二,要么是第三。所以我们可以说数据科学中排名前三的语言是 Python、SQL 和 Scala 。如果你正在考虑学习一门新的语言,考虑 Scala!
Spark 是除了数据工程师之外最顶尖的大数据技能
仅对于数据工程师而言,Hadoop 比 Spark 被提及得多一点,但总体而言,Spark 绝对是人们应该首先学习的大数据框架。Cassandra 对于工程师来说比科学家更重要,而 Storm 似乎只与数据工程师相关。
综上所述,数据科学的顶级大数据技术有: Spark,Hadoop,Kafka,Hive。
在深度学习方面,TensorFlow 是王者
数据工程师的招聘信息中很少提到深度学习框架,因此这个角色似乎不需要 DL 框架。对 DL 框架的最多提及来自机器学习工程师角色,这表明 ML 工程师确实大量处理机器学习建模,而不仅仅是模型部署。再者,TensorFlow 在深度学习领域绝对是霸主。虽然 Keras 作为一个高级深度学习框架真的很受数据科学家的欢迎,但它几乎与机器学习工程师的角色无关,这可能表明 ML 从业者大多使用 TensorFlow 等较低级别的框架。
综上所述,数据科学中最重要的深度学习框架有: TensorFlow,Torch,Caffee,MXNet 。
AWS 全面领先
计算机视觉是机器学习中最大的需求来源
对于一般的数据科学家来说,自然语言处理是最大的 ML 应用领域,其次是计算机视觉、语音识别、欺诈检测和推荐系统。有意思的是,对于机器学习工程师来说,最大的需求仅来自计算机视觉,自然语言处理远在其次。另一方面,数据工程师再次成为焦点专家——这些 ML 应用领域都与他们无关。
洞察力 —如果你想成为一名数据科学家,你可以根据你想进入的领域选择各种类型的项目来展示你的专业知识,但对于机器学习工程师来说,计算机视觉是一条出路!
说到可视化,Tableau 是必须的
数据科学家最需要可视化工具,而数据工程师和机器学习工程师很少提到可视化工具。然而,Tableau 是所有角色的首选。对于数据科学家来说,Shiny、Matplotlib、ggplot 和 Seaborn 似乎同样重要。
Git 对每个人都很重要,而 Docker 只针对工程师
接下来,我们使用词云来探索每个角色最常用的关键词,并结合相应的技能来构建所有数据科学角色的理想配置文件!
数据科学家更多的是关于机器学习,而不是商业或分析
数据科学家一直被视为需要统计、分析、机器学习和商业知识的全能职业。现在看来还是这样,或者至少,在一个数据科学家身上还是有各种需求的。然而,现在数据科学家似乎更关注机器学习,而不是其他任何东西。
其他顶级要求包括:业务、管理、沟通、研究、开发、分析、产品、技术、统计、算法、模型、客户/客户和计算机科学。
机器学习工程师是关于研究、系统设计和构建的
与一般的数据科学家相比,机器学习工程师显然似乎有更专注的投资组合,包括研究、设计和工程。显然,解决方案、产品、软件和系统是主导主题。与之相伴的还有研究、算法、人工智能、深度学习和计算机视觉。有趣的是,商业、管理、客户和沟通等术语似乎也很重要。这可以在这个项目的下一次迭代中进一步研究。另一方面,管道和平台也很突出,证实了机器学习工程师在建立数据管道以部署 ML 系统方面的责任的共同理解。
数据工程师是真正的专家
数据工程师拥有比机器学习工程师更专注的投资组合。显然,重点是通过设计和开发管道来支持产品、系统和解决方案。最高要求包括技术技能、数据库、构建、测试、环境和质量。机器学习也很重要,可能是因为管道主要是为了支持 ML 模型部署数据需求而构建的。
就是这样!我希望这个项目能帮助你了解雇主在寻找什么,最重要的是帮助你做出明智的决定,如何定制你的简历和学习什么技术!如果你喜欢这个帖子,我会感谢你的掌声,谢谢!
附言:我将在单独的帖子中讲述技术细节,请继续关注,更多内容即将推出:)
我们上 LinkedIn 连线吧!
古罗马军事与数据分析有什么共同点?
数据分析很有趣。但更重要的是,这真的很重要!
我很高兴成为网上快时尚品牌Miracas.com的一员。对我来说,直接从数据库转储出来的销售数据几乎就像玩金沙一样。尽管业内权威人士使用的一些术语可能相当吓人。例如…组群分析。当我在字典里搜索 coorts 这个词时,它把我带到了罗马军事史,才发现 coorts 基本上就是群体的意思。
本质上,群组分析背后的想法是将用户分成群组,或者群组,并研究这些群组的行为以获得更好的洞察力。例如,在给定月份获得的所有用户是我们可以观察的群体,以便了解他们在随后的几个月里如何逗留。
银河系漫游指南的一课!
在寻求正确答案之前,我们必须先问正确的问题。否则我们可能会以 42 结束,这也可能是正确的答案,但我们不明白是怎么回事。为了理解我分析的目的,让我从提出以下问题开始。
我想研究什么用户行为?
我想了解随着时间的推移,我的用户是如何与我保持联系的。因此,我想计算一段时间内现有用户的订单数量。我的样本数据跨度为一年,因此将月定义为分析的时间单位是有意义的。
我们希望如何将用户分成不同的群体?
基本上我问的是,如何将用户分成有意义的群体。例如,可以使用年龄组、人口统计或一阶值来定义群组。在我提出的前一个问题的上下文中,让我将分组定义为在给定月份中首次订购的所有唯一用户。
简而言之,我想了解的是,根据我公司的销售数据,我在某个月获得的用户是如何在随后的几个月中保持不变的?
下面这个情节是想出答案的方法之一
Sample data used here is purely for illustration purpose. It does not reflect the typical industry indicators and must not be quoted elsewhere.
图表显示,平均而言,约有 7%的用户在第二个月再次下单。这一数字在第三和第四个月分别增加到约 8%和 9%。橙色信封显示了分析中使用的不同群组的最大和最小保留值。
所以既然问题成立,那就开始玩沙子吧。
r 规则
r 是一个非常强大的数据处理工具。我在做半导体建模的时候遇到了 R。我很快就变得非常喜欢它。它为喜欢玩数据的人提供的便利可能会让人上瘾。为了处理数据,我将在本文中使用 basic R,并在最后使用ggplot2创建一些美观的图表。
我使用下面的 R 包进行分析。
除了这些库之外,我还使用了 RColorBrewer、colorRamps 和 gridExtra 包来提高剧情的美感。
为了本文的目的,我生成了一些样本数据。
R 中的组群分析
github.com](github.com/rahulnyk/co…)
这是它的样子。
准备数据
下面是我如何读取样本数据的。
dr <- read.csv('sample_date.csv', stringsAsFactors = F)dr$date_add <- as.Date(dr$date_add)dr$date_add_month <- as.Date(cut(dr$date_add, breaks = "month"))dr <- subset(dr, (date_add_month > as.Date("2015-05-01") & (date_add_month < as.Date("2016-06-01") )))number_of_months <-length(unique(as.character(dr$date_add_month)))
第一行代码只是将 csv 文件读入数据帧。在第二行,我将数据值转换成日期格式。下一行将日期分成几个月,这样给定月份中的所有订单都可以存储在一起。第 4 行代码只是一个子集命令
提示:对日期数据总是使用 R 日期格式。这就让 R 变得聪明,在绘图和其他计算时适当地对待它们。
我在这里也提取了number_of_months值。稍后当我将数据分成群组时,我将需要它。
计算群组
可以想象,这是最重要的一步。我们将根据用户第一次订购的月份对他们进行分组。让我重申一下我这次分析的目的。
我们的想法是了解某个月有多少用户购买,在接下来的几个月里留下来并下更多的订单。
这是我实现这一目标的方法。
- 列出给定月份的唯一用户(
ulist) - 仅将用户列表中的数据子集化到一个新的数据框中(
dr1)。从原始数据框中删除数据(dr)。 - 使用 dr1 统计这些用户每月的订单数量。我将结果归纳到另一个数据框架中,叫做
dr1s - 从第一个月开始,每个月都这样做。每一次迭代,我都在过滤掉那一个月获得的用户
m。 - 将结果组合成一个名为
Cohorts的数据帧。
下面是完成这一切的代码。虽然乍一看可能很吓人,但实际上很容易理解(用一点 R 知识)
Cohorts <- data.frame() ## empty cohorts data frame. for (m in unique(as.character(dr$date_add_month))){
u <- subset(dr, dr$date_add_month == m) ## -- data for month m
ulist <- unique(u$user_id) ## -- orders by unique users in month m dr1 <- subset(dr, dr$user_id %in% ulist) ## -- only month m users
dr <- subset(dr, !(dr$user_id %in% ulist)) ## -- remove from dr
## -- Number of orders by these users for every month
dr1s <- ddply(dr1, .(date_add_month), summarize, total = length(user_id))
## -- Combine the calculations into the Cohorts data frame.
colnames(dr1s) <- c("Month", m)
a <- c(m, dr1s[,m])
a <- data.frame(t(a))
Cohorts <- rbind.fill(Cohorts, a)
}## Some more processing with the final data frame
col_names = paste("Month", array(1:number_of_months), sep = " ")
colnames(Cohorts) <- c("Month", col_names)
Cohorts["Month"] <- as.Date(Cohorts$Month)
Cohorts["max"] <- as.numeric(as.character(Cohorts[,2]))
我在这里使用ddply来计算每月的订单数量。该函数来自plyr库,是最方便的工具之一,可用于根据多种条件对数据框的行进行子集划分,对每个子集进行计算,并将结果合并到另一个数据框中。我向所有 R 爱好者强烈推荐花些时间玩玩ddply。
这是我们的劳动成果,数据框Cohorts的样子。
太棒了不是吗!
最困难的部分已经完成了。此时,我已经有了要计算的数字。现在剩下的就是将这些数据绘制成美观的图表。但在此之前,让我谈一谈重塑数据。
熔化和铸造
当然是剑…但是数据也是! 在进行任何类型的分析时,重塑数据都非常重要。r 有一个强大的重塑库,可以帮助你根据需要融化和铸造数据。这里有一个不错的教程。
[## 重塑简介 2
长格式数据有一个可能变量类型的列和一个这些变量的值的列。长格式…
seananderson.ca](seananderson.ca/2013/10/19/…)
有了这些丰富的知识,让我们将队列数据框重塑为更易于绘制的东西。基本上,我们需要将数据转换成一种可以被ggplot2轻松使用的格式,我已经提到过这是 r 最棒的地方之一了。相信我……的确如此!
df_plot <- melt(Cohorts, id.vars = c('Month', 'max'), value.name = 'Orders', variable.name = 'Month_after')df_plot <- na.omit(df_plot)df_plot["Value"] <- as.numeric(df_plot$Orders)df_plot["Pc_value"] <- ceiling(df_plot$Value*100/df_plot$max)df_plot["Percentage"] <- paste(ceiling(df_plot$Value*100/df_plot$max), "%", sep="")df_plot["Percentage_2"] <- ifelse(df_plot$Percentage == "100%", df_plot$Value , df_plot$Percentage)
我们名为df_plot的新数据帧如下所示。
注意,添加列Percentage_2只是为了绘图方便。Percentage_2中的值表示Month 1中的订单总数以及后续月份的重复订单百分比。
没有艺术的生活是什么
现在是我最喜欢的部分,添加一些颜色。我使用了 RColorBrewer 和 colorRamps 库来增加魅力…然而默认的 ggplot 选项对于我们的目的来说已经足够了。
代码来了
## Cohorts tile chart ##
hm.palette <- colorRampPalette((brewer.pal(9, 'YlOrRd')), space='Lab', bias=10)p <- ggplot() p <- p + geom_tile(data = na.omit(df_plot), aes(x = Month, y = Month_after, fill=Value), width=31, height=1) p <- p + geom_text(data = na.omit(df_plot), aes(x = Month, y = Month_after, label = Percentage_2), color = "white")#, fontface = "bold")p <- p + scale_fill_gradientn(colours = hm.palette(100)) + theme_bw() + coord_flip() p <- p + theme(panel.background = element_blank(), axis.line.x = element_blank(), panel.border = element_blank())p <- p + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.position="none") + ylab("") p <- p + xlab("Orders by new users")
print(p)
还有沃伊拉。!这是我们得到的
在这一点上,我想提一下,我在这里使用的数据纯粹是为了本文的目的而生成的,并不是实际的销售数据。此处计算的数字不得在别处引用。
再做一些修改,我可以用另一个有趣的图表来表示这些数据。
Average customer retention rate
我将把这个图表的代码留给你来写。
这些图表对任何企业都非常重要。通常,客户获取成本(CAC)是任何电子商务公司平均订单价值的重要组成部分。因此,衡量用户如何逗留并产生更多订单是很重要的。
第一个图表显示了在给定月份(第 1 个月)中获得的独立用户的订单数量,以及这些用户在随后几个月中再次订购的百分比。例如,2015 年 7 月,共有 479 个独立用户首次订购,其中约 11%在Month 2(即 2015 年 8 月)再次订购。该数字在Month 11(2016 年 6 月)降至 4%左右。
对于不同的企业,客户保持率可能会有很大的不同。对我来说,这表明了我的客户有多满意。它本身可能没有完整的意义。然而,当与平均订单价值、客户获取成本、客户终身价值、客户投诉数量等其他指标一起考虑时,它对引导业务朝着正确的方向发展非常有帮助。
其中一些参数可以使用我在这里使用的相同样本数据来计算。虽然我会把这个分析留到以后再说。
总结
分析用户行为的重要性怎么强调都不为过。群组分析是一种很好的方法。就像罗马军队一样,当数据被分成有意义的组时,它变得更易于管理。在试图找到答案之前,问正确的问题是很重要的。学习正确的工具来处理数据也同样重要。有了 R 和它的大量曲目,学习它几乎不会出错,至少到基础水平。
如果我能对这篇文章或任何其他方面有所帮助,请不吝赐教。感谢阅读,希望你喜欢。
运营一个预测模型到底意味着什么?
仅仅建立一个能够做出预测的 web 服务是不够的。
Original Image Source — Meme overlay by Imgflip
在 2017 年 SAS 调查中,83%的组织在大数据方面进行了中度至显著的投资,但只有 33%的组织表示他们从投资中获得了价值。最近在 T4 的其他调查也显示了类似的结果。我们发现,这种差距的主要原因是未能理解以真正有利于您的业务的方式实施预测所需的全部范围。在这篇文章中,我将带您浏览一个示例场景,并展示成功如何需要一个过程来确保与受影响的人保持一致,保持对要获得的业务价值的关注,并迭代地构建技术平台。
在您的数据科学团队加载第一个数据框之前,模型的操作流程就已开始。一个高功能的数据科学团队将与业务一起产生想法,并展望将产生的业务价值。例如,仅仅说“我们想预测客户流失”是不够的。一个更好的商业假设可能是,“我们希望通过向 10%最有可能流失的客户发送有针对性的促销信息来防止他们流失,从而每年节省 72 万美元”。确定工作积压的优先级时,数据科学团队应该关注那些具有最高潜在投资回报的想法。正如我的同事肖恩·麦考尔指出的,这项任务应该落到数据科学产品负责人的肩上。您可以在下面找到一个计算客户流失率的示例:
`(100 cost of promotion(assumed))
- 30% success of retaining with promotion (assumed)
- 10000 customer churn per month (measured) = 720K / year`
一旦数据科学团队开始开发支持业务理念的模型,他们应该从最简单的模型开始,定期与受影响最大的团队分享结果,与他们合作改进模型,并共同决定模型何时足够好。这就是我们先前粗略估价的用处。与你的利益相关者谈论 RMSE、特征向量和 ROC 曲线很可能会让他们失去兴趣。通过将您试图预测的准确性翻译回业务价值陈述,您将说同一种语言。“我们能够以 75%的准确率预测客户流失”听起来要好得多,“根据目前的假设,这将为我们每月节省大约 45,000 美元”,尤其是当您在下一步中实际开始实施该模型时。
当模型背后的团队决定开始在生产中运行模型时,他们还应该了解构建和运行生产版本的成本(包括提供输入数据的数据平台、模型预测端点和模型服务的监控)。这与上面的数据科学家的成本一起,提供了 ROI 等式的成本侧。进行这种估算的细节超出了本文的范围,所以让我们假设成本是 18 万美元。以此成本,该解决方案应在 4 个月内收回成本,并提供 54 万美元的 1 年投资回报。这是一个巨大的回报,因此我们开始了自动化数据馈送的过程,在 web 服务后面部署模型,生成预测,并将预测结果集成到新的和现有的应用程序中,以使它们易于使用。因为我们一直在与预测的最终用户合作,我们知道他们希望看到哪些细节来帮助建立对预测的信任。
现在我们已经到了实际操作模型的地步,我们仍然需要说服人们使用它。在我们之前的例子中,让我们假设提供我们的目标促销的一种方式是手写笔记给客户。首先,我们需要说服某人提供预算来建立一个笔记部门(也许我们会投资一个 Robotica 的那些 Turry 手写机器人)。如果我们不把它全部交给机器人,我们将需要通过展示他们的工作正在产生影响来激励我们的人类笔记团队。我们应该开发一个跟踪系统,看看我们的笔记中的促销活动是否被实际使用,以及有多少百分比的促销活动用户仍然在公司工作。这将允许我们验证业务假设,并帮助通知其他决策。
因此,现在我们已经建立了一个很好的模型托管系统,并且我们正在测量 75%的预期保留率(人们似乎总是高估这些类型的假设,但这没关系,因为我们仍然有望节省 40.5 万美元),该团队可能会继续构建其他高价值的模型。一个经常被忽视的关键步骤是将跨多个模型的通用操作构建到一个平台或框架中。为了在任何规模下操作模型,底层数据平台必须足够灵活,能够进行快速实验,同时还必须足够可伸缩,能够处理转换,并有助于快速预测大量数据。为了证明这些投资的成本,可以将它们分摊到几个模型的 ROI 中。
随着这一过程的重复,平台变得更加强大,团队在评估价值和与最终用户建立信任方面变得更好,我们能够真正大规模地运营模型。团队开始基于他们的预测模型更快地生产有价值的应用程序、功能和见解,更广泛的业务开始更快地信任这些结果。
然后,6 个月后的某一天,警报响起,客户流失模型不再有效。准确率已经下降到 50%,所以本质上只是猜测。数据科学团队必须努力找出问题所在并加以解决。输入数据发生了什么变化?我们上次部署该模型是什么时候?底层机器上的补丁破坏了什么吗?如果能回到我们训练模型时的确切状态就好了,这样我们就可以确定发生了什么变化。最终,有人发现并纠正了问题(由于错误的部署,所有客户的使用度量被设置为 0)。类似这样的事件导致团队专注于构建主动调试工具,如关键功能的异常检测和预测结果,以更快地检测和隔离问题。
此时,您的组织能够大规模构建和部署高价值的机器学习应用程序,同时将风险降至最低。这就是我们在 Pariveda 所说的“机器学习作为一种商业能力”。
虽然上面的故事是虚构的,但它是基于我们在机器学习旅程的各个阶段与许多客户合作的经验。如果您对此有任何问题,我很乐意讨论支持实验和模型操作的技术平台,以及对架构、流程和工具的指导/实现支持,以使您的团队能够将机器学习作为一种业务能力。
原载于 2018 年 8 月 13 日【http://parivedaperspectives.com】。
它看到了什么?
人工智能困惑的目光
前几天,我用人工智能搜索了一张我的阴茎土豆的照片,想看看这项技术会怎么称呼它。它会知道我的土豆是一个土豆吗?尽管它有一个像阴茎一样的突起,这个突起为它赢得了一个昵称。
我让系统查看我的阴茎土豆的几个不同的镜头——有闪光灯和没有闪光灯,室内和室外,以及各种角度——得到的答案从“胡桃南瓜”到“面团”,即使我拍摄土豆的方式是故意隐藏其隐私部分。我当时不知道的是,系统永远不会把我的土豆识别为土豆,不是因为它的阴茎,而是因为它根本不了解土豆。
我使用的人工智能在某些领域很有名,并且在几年前的 ImageNet 大规模视觉识别挑战赛(ILSVRC)中表现出色。对于那些不熟悉这场比赛的人来说,我会把它比作肯塔基赛马会,这对那些对马和赛马感兴趣的人来说是众所周知和同样令人兴奋的。这个人工智能被称为 VGG-19,用于训练和测试它的图像数据集 ImageNet 本身就很有名,它提供了数以千计的标记图像,可供研究人员使用。
据该网站称,到目前为止,ImageNet 包含超过 21,000 个类别的超过 1,400 万张图片;然而,这些类别中只有 1000 个用于比赛——1000 个所谓的 synsets,其中“土豆”不在其中。换句话说,因为人工智能已经在 ILSVRC 竞赛数据集上接受了训练,所以无论我多久向系统展示一次马铃薯,或者马铃薯的形状有多完美,系统都不会想到“马铃薯”这个词,因为它没有被教会识别它。土豆不在 1000 之列。
我看了看的 1000 个类别,得知人工智能应该能够识别胸罩、步枪、羽毛围巾、乳液、井盖、电脑鼠标、风车、祈祷毯和威士忌酒瓶。大多数时候,当我浏览被选中者的名单时,我在想,为什么是这些?
一篇关于比赛的论文解释说,1000 个比赛类别是在比赛的第一年,即 2010 年随机选择的,然后经过精心挑选,以确保它们不会太模糊,并且在等级体系中任何两个类别之间没有重叠(如果包括“猎犬”,那么“猎犬”(超类)或“小猎犬”(子类)就没有重叠)。这些年来,这一套已经发生了变化,但 639 个类别在每次挑战中都被使用过(至少到 2015 年,论文发表的那一年)。换句话说,我要感谢随机性,为什么模型能识别胸罩,但不能识别一幅画,一个石榴,但不能识别猕猴桃,一个土豆泥,不是我的土豆,一个书店,但不能识别一本书。
等等…没有书?
我向人工智能展示了一本书的几张照片,然后我被告知这是一个“橡皮擦”或“信封”,或者有时,更奇怪的是,照片中有一些东西,但我根本没有注意到。例如,当我向人工智能展示一个拿着一摞书的女人时,它将照片归类为“球衣”。
在另一张照片中,人工智能直视正在阅读的人,但识别出背景中的书架是一家书店。人工智能最自信地预测的事情并不是不正确的,只是不一定是当我看照片时我的眼睛被吸引到了哪里。要明确的是,我不期望人工智能看到它不知道的东西,但想想我们在教我们的技术什么,以及他们对什么视而不见,因为我们没有向他们展示例子,这是一件有趣的事情。
由于弗吉尼亚理工大学和佐治亚理工学院研究人员的工作,我能够窥探人工智能,看看它看起来在哪里,他们建造了制导的 Grad-CAM ,我用它来生成上面的插图。制导 Grad-CAM 技术有许多有趣的应用,但给我印象最深的是基于人工智能凝视的方向来识别偏见。在下面的例子中,有偏见的模型注意到一张女性的脸,并将她识别为护士。
(image from the paper: arxiv.org/abs/1610.02…)
研究人员写道,有偏见的模型从它被训练的数据中学习其偏见,但使用“从 Grad-CAM 可视化中获得的洞察力,我们平衡了数据集并重新训练了模型。”无偏模型在确定职业时看听诊器不看脸。
在另一项发人深省的研究中,脸书大学的研究人员观察了我们的技术在分类物体方面做得如何,以及它们在哪里失败了,特别是篮球和 ImageNet 中用来说明它们的图像。尽管他们看到的至少出现一个白人或一个黑人的图像的百分比非常相似(前者为 55%,后者为 53%),但根据这一数据训练的模型表现出意想不到的方式。当要求对选择的一组图像进行预测,以便“两幅图像之间的主要明显差异是人的肤色”时,该模型展示了这种模式:“所有包含黑人的图像都被分类为篮球,而具有不同肤色的人的类似照片被不同地标记”(例如,作为排球、乒乓球或棒球运动员)。换句话说,模型已经学会了一种偏向。
(image from the paper: arxiv.org/abs/1711.11…)
研究人员指出:
模型学习这些偏见的原因尚不清楚。一个假设是,尽管在标有篮球的图片中种族分布均衡,但与其他阶层相比,黑人在这个阶层中的比例更高。
我把上面这段话读了几遍,思考了一下其中的含义。我想知道,ImageNet 到底代表了谁,没有代表谁。我们的技术仅仅因为数据中包含(或省略)了谁和什么而获得了什么样的模式?
我们的模型非常擅长识别模式,只有一些模式不是有意的,或者更糟,是有害的。由算法做出的令人不安的决定已经出现在选美比赛、面部识别和自然语言处理等领域。去年,研究人员在我们的几个大型图像数据集中发现了明显的性别偏见。接受这些图像训练的人工智能不仅发现了这些偏见,还放大了这些偏见,将女性与厨房等事物联系起来,将男性与体育用品联系起来(见《连线》杂志的报道)。
我很欣赏为创建和维护我们用来训练和测试人工智能的图像数据集所付出的巨大努力。如果没有 ImageNet 和围绕它的竞争,我不认为我们的技术会发展得如此之快。尽管如此,我还没有在这个数据集中遇到过与肤色和表征相关的研究,我担心的是,将人类肤色与某些类型的事物联系起来,而不是与其他事物联系起来,这意味着什么。
我反复听到图像数据被称为“真实世界数据”。但这些数据反映了现实吗?我们如何确保这些数据不仅仅是在强化我们作为一个社会必须努力克服的偏见?
延伸阅读:
“Grad-CAM:通过基于梯度的定位从深度网络获得的视觉解释”,Ramprasaath R. Selvaraju,Michael Cogswell,Abhishek Das,Ramakrishna Vedantam,Devi Parikh,Dhruv Batra【arxiv.org/abs/1610.02…
“超越准确性的 ConvNets 和 ImageNet:解释、偏差检测、对立的例子和模型批评”,Pierre Stock,Moustapha Cisse【arxiv.org/abs/1711.11…
“ImageNet 大规模视觉识别挑战赛”,Olga Russakovsky* Jia Deng*苏浩 Jonathan Krause Sanjeev Satheesh Sean Ma 黄志恒 Andrej Karpathy Aditya Khosla Michael Bernstein Alexander c . Berg 李菲菲arxiv.org/pdf/1409.05…
关于数据科学,Kaggle 调查告诉了我们什么
使用 Graphext 理解用户配置文件
Kaggle 最近发表了第二次年度机器学习和数据科学调查。全球约有 24,000 名用户参与了此次调查,透露了许多关于他们的人口统计、行为和观点的信息。它为机器学习和数据科学行业提供了一个独特的视角。
通过分析调查,我们想探索对特定人群来说什么是最重要的。但是任何调查分析的挑战总是在于,定义“一个群体”的最佳方式是什么?应该根据人口统计特征还是行为来划分人群?我们如何彻底调查数据,以便了解宏观趋势(例如,全球技术行业)和微观趋势(例如,在巴西工作的女性数据科学家主要使用 R )?在本文中,我们试图使用我们的软件 Graphext 运行调查分析来回答这些问题。
Graphext 的妙处在于,我们允许用户通过两种方式探索数据:一是通过无监督的数据分割;第二,通过回答具体问题。
第 1 部分——无监督分割
在将数据集上传到 Graphext 后,软件自动绘制出调查数据的拓扑结构(在这种情况下,它看起来像一个巨大的热气球),并自动将响应分成几个集群。就我个人而言,我总是发现从一个概括的个人资料或用户考虑许多不同的特征开始非常有帮助。一旦我能想象出这个用户是谁,他/她每天做什么,通常他们的行为对我来说更有意义。
所以看看这些由无监督学习分割的聚类,一些有趣的轮廓从数据中跳出来。
蓝色集群(人口的 20%):约翰 38 岁,住在旧金山。他在一家科技公司工作,担任高级数据科学家。他拥有计算机科学博士学位,过去 6 年一直在数据科学领域工作。他的公司在技术方面相当成熟,所以他主要从事大数据方面的工作。他的工作包括构建原型,然后在 AWS 上运行 ML 模型。他使用 Python,尤其是 Scikit-learn 库,因为他主要处理表格、文本和时间序列数据。
红簇(人口的 10%):来自上海的年轻研究员明。他今年 25 岁,正在探索不同的 ML 方法来推进他的研究。他的研究重点是图像识别。他主要使用 Python、TensorFlow 和 Keras 库来处理图像数据。由于他不使用大数据集,他主要使用托管解决方案,但偶尔会使用阿里云。他拥有软件工程师学位,在 ML 领域只有 2-3 年的经验。对他来说,ML 是一个黑盒子,虽然他使用它,但他不觉得有必要向他的观众解释输出。
棕色人种(占总人口的 8%):Karina 是来自伦敦的商业分析师。她 27 岁,在一家保险公司工作。她拥有统计学本科学位,尽管她对数据科学非常感兴趣,但她从未接受过任何培训。她已经做了 4 年的工作,她的主要目标是发展分析来影响公司的决策者。她很少使用 ML,但是当她使用时,她使用随机森林和插入符号库来处理数字数据。对她来说,向她的利益相关者解释她的模型的输出并避免任何偏见是非常重要的。
如您所见,要构建丰富的用户资料,您需要提供许多详细的特征。当您有太多的数据维度需要考虑时,很难手动完成。但是有了 Graphext 这样的工具,你可以在几分钟内得到一个无偏的结果。
第二部分——回答具体问题
一旦你对调查人群有了一个总体的了解,通常,你会想用这些数据来回答一些特定的问题。在这种情况下,我们想知道欧洲的用户和美国的用户有什么不同。为此,我们选择了两组用户:来自排名前五的欧洲国家(英国、德国、法国、西班牙、意大利)的用户和来自美国的用户。我们简单地将它们分组以缩小我们的分析范围
Graphext 有一个“比较”功能,可以让你通过自动突出显示可以从统计上解释它们差异的变量来比较两个或多个组。下面是我们使用这个函数得到的结果(美国用蓝色表示,欧洲用橙色表示):
首先,欧洲用户的薪资水平远低于美国用户。从他们的背景来看,欧洲用户似乎更具技术性:他们更有可能拥有计算机科学、数学和物理学的硕士或博士学位,他们的工作是数据科学家和研究科学家。而在美国,用户更可能拥有工程、商业或生命科学方面的学士学位。除了像数据科学家这样的典型角色,他们还担任数据分析师和业务分析师。技术经验的水平也反映在他们使用的工具类型上。
当我们继续探索他们的差异时,我们发现欧洲用户更多地使用时间序列数据,而美国用户更多地使用数字数据。当我们观察这些用户工作的行业时,美国医疗和制药行业的用户比例几乎是欧洲用户比例的两倍。此外,与美国相比,欧洲男性用户的比例似乎略高。
尽管有这些不同,他们的挫折似乎是普遍的。他们都在数据清理上花了太多时间,他们发现很难解释黑盒模型,很难让工作易于重用,很难让算法公平或无偏见。我想这些共同的挫折是我们在 DS 和 ML 学科中的纽带,让我们互相学习。
我希望你喜欢阅读这篇文章。如果我的分析引起了你的兴趣,那么我鼓励你向我们索取一个演示来亲自看看 Graphext 在探索数据方面能做些什么!
是什么让美国如此伟大?科学家的视角
从我们走上街头为科学游行到现在刚刚一个多星期。这是多么不可思议的一天——因为你参加了 600 多次游行!!!
为什么我对这个话题这么有热情?下面是我演讲的视频和全文(你还可以在频道找到巴拉通德·瑟斯顿、亚当·沙维奇等许多人的演讲)。我还用当天的一些图片和我收到的问题(例如,我穿的衬衫是什么?).
那么,现在怎么办?
我们游行。现在我们行动。正如我在演讲中所说,科学不能等待。我们等不及了。为了我的孩子,你的孩子,我们孩子的孩子,我们现在需要科学进步。你可以这样做!
- 保持接触!我们需要你在 www.marchforscience.com 报名参加这项运动。
- 让别人听到你的声音!你的声音很棒,我们在游行时听得很清楚。因此,通过打电话给你当地的代表、参议员和任何其他公共领袖,让他们听到你的声音。打电话给你的学校董事会,确保他们教进化论。写信、写专栏等。
- **分享你的故事!**告诉世界科学是如何影响你的,以及我们为什么需要科学。
- 不要让紧急的事情妨碍了重要的事情。会有很多噪音。会有好戏看。会有可供选择的事实。我们必须保持参与,专注于有影响力的事情。
- 看到什么,说什么。我们总是听到诸如我不擅长数学或科学之类的话。或者男生化学比女生好。或者气候变化是编造的。如果你听到了,就大声说出来。如果我们保持沉默,我们就是同谋。
- 把它变成一项团队运动!让朋友订婚。我们通常不会带那些对科学有困难的人来。那些被科学吓倒的人。那些对数学感到沮丧的人。那些在课堂上有过糟糕经历的人。不要丢下他们。不要居高临下地对他们说话。我们队里需要他们!与他们分享你的激情。帮助他们明白为什么我们都应该关心科学。做一个倡导者!
是什么让美国如此伟大?(演讲全文)
Look at all of you who showed up!
谢谢你出来支持科学!
我们现在生活在一个有趣的时代……关于是什么让美国变得伟大,这个问题一直存在。所以,我想和你谈谈为什么科学让美国变得伟大。我将通过我在布什政府和最近在奥巴马政府的白宫时有机会与之交谈的来自全国各地的一些了不起的美国人的故事来讲述这个故事。
My daughter’s sign at the SF March For Science
在过去的两年里,我最喜欢的事情之一是我们把白宫变成了一个科学博览会。我们邀请了全国各地的孩子来展示他们的研究。哇哦。这些项目是美国之所以伟大的缩影。
以内森为例,他当时 15 岁,建立了机器学习和人工智能算法,以检测可能导致癌症的基因突变。
Simon-Peter、Maya 和 Grayson 在他们十几岁的时候设计了一种新的假腿,可以让截肢者步行、管理不平坦的地形,甚至(我最喜欢的部分)玩滑板!
或者奥利维亚(Olivia),她在 17 岁时开发了一种快速、便携、廉价的埃博拉病毒诊断测试。
这些孩子来自各行各业。从 T4 到美洲的每一个地方。花五分钟和他们在一起,你会带着难以置信的自卑感离开谈话。
不只是那些孩子,看看这里所有的孩子。男生和女生。你们是我们未来的科学家。你们将带领我们走向星星,你们将理解物理学的深层奥秘,开启数学之美,发现下一个医学突破,发明下一种新型材料。
我的朋友、前国防部长阿什·卡特经常提醒我,安全就像空气。没有的时候才知道需要。科学也是如此。
我国国家和经济安全的基础是科学技术。自从我们伟大的国家成立以来,这一点一直如此。
在这个国家,大陆会议和我们的第一任总统乔治·华盛顿创建了陆军工程兵团。他们的使命是——在和平时期和战争时期提供重要的公共工程服务,以加强我们国家的安全,振兴经济,降低灾害风险。
这个国家颁布了《国家航空航天法》,建立了美国国家航空航天局。创造了一条赢得登月竞赛的前进道路,今天继续引领我们努力去理解上面的地球和宇宙。
这个国家建立了美国国家卫生研究院(NIH ),以推动下一轮突破,确保我们拥有世界上最好的医疗保健。该机构通过积极的投资,成为众多人的黄金标准和希望灯塔。
这个国家率先保护我们的水资源,确保我们有清洁的空气,建立了环境保护署,其中超过一半的员工是工程师、科学家和环境保护专家。
这个国家建立了令世界羡慕的学院和大学。
这是创造了互联网的国家。
这不是政府一个人做的。它点燃了火焰,但工业、学术界和公私合作助长了火焰。例子?全球定位系统,DNA 和基因测序的发现,机器人技术,甚至数据科学。我们正在人工智能和自动驾驶汽车上看到这一幕。
但是让我告诉你。我们不能认为这是理所当然的。当我们没有领先优势时,我们只会知道我们已经失去了领先优势。我们之前的几代人所做的投资和牺牲是我们今天正在受益的。这包括那些来自世界各地的移民和难民,以使这个国家更加强大。2016 年,美国大学的 6 名研究人员和科学家获得诺贝尔奖。共同的线索?这 6 个人都出生在美国以外。
The shirt I was wearing at the SF March for Science — for more check out my naturalization speech
感谢那些为科学和创新奉献一生的人。对于那些曾在我们的军队或公共服务中服役的人们,我永远感激你们。对于那些教师,感谢你们已经做的和将要继续做的一切。你是我们的秘密配料。我们的超级大国已经并将继续培养最优秀和最聪明的人来应对当今最大的挑战。
理工科不能等。慢下来不是一个选项。密歇根州弗林特的孩子们仍然没有干净的水。气候正在变化。下一个疫情可能就在眼前。我们有越来越多的世界人口需要养活和教育。我们的国防将继续依靠创新。癌症和罕见疾病继续夺走太多人的生命。这也是我在白宫花费大量时间致力于通过精准医疗倡议和癌症登月寻找下一代医疗方法的原因之一。
我遇到的其中一个人是詹妮弗·比特纳,她给总统写信——是的,我们的确读过你写的信。关于詹妮弗,你首先要知道的是。她是个美丽的人。她是丈夫罗德的好妻子,也是他们的儿子和即将出生的孩子的好母亲。她是自然的力量。以下是詹妮弗自己说的话:
我被诊断患有第四期转移性乳腺癌,已经扩散到我的肝脏、肺部、肾上腺、脾脏、卵巢、脊柱、臀部、肋骨、股骨、肩胛骨、锁骨和许多其他骨头。一位医生说我会在三个月内住进收容所。虽然很难用语言来表达我有多感激过去几年拥有这美好生活的每一刻,但这确实不容易。我每天都在接受化疗或其他治疗。我已经忍受了多次手术和放疗,以及每周肿瘤标志物和每三个月扫描的焦虑。我的治疗副作用具有挑战性,有时会使人虚弱。尽管如此,转移性乳腺癌患者的平均寿命只有短短三年。
人生还没过半,三年就太短了。研究对于延长和改善癌症患者的生命绝对至关重要——尤其是现在我们正处于免疫疗法等一些令人难以置信的医学突破的边缘。…这就是研究得到充分资助如此重要的原因。我们如此接近,但我们大多数人不能再等了。”
问题是,如果我们不加快速度,詹妮弗就看不到她的孩子学会骑自行车、阅读或参加班级演出。她的孩子将被剥夺拥有母亲的机会。与任何一位科学家交谈,他们都会告诉你詹妮弗是对的,我们可以走得更快。与任何病人交谈,他们都会和詹妮弗说同样的话——我们必须走得更快。
癌症不等人。罕见病不等人。流行病不会等待。我们的孩子等不及了。寻找治疗方法需要对所有科学进行投资。数学、生物、物理、化学、材料科学、计算机科学、社会学、心理学、生态学,甚至数据科学。
这是我们欠所有詹妮弗·比特纳的。因为其中一个珍妮弗可能是我们的亲人。
当我们作为一个国家走到一起时;当我们作为一个团体关注时;当我们坚定不移地支持所有科学的时候,我们将保持科学的正确地位,引领我们的国家前进。为我的孩子争取一个积极的未来。你的孩子。世界儿童。我们孩子的孩子。
科学不能等。我们开始工作吧。
愿你们都长命百岁,事业兴旺。
-dj
“重大”是什么意思?
最近,我写了一篇文章,建议决策者需要更多的数学知识才能在当今更加数据驱动的环境中有效运作。在这篇文章中,我想把重点放在数学的一个方面,我认为这是商业世界中非常缺乏的,并且可能导致经常性的严重错误决策:研究数据时的显著性的概念。
阅读本文的读者很可能已经深刻理解了统计学意义的概念。但是根据经验,我怀疑相当大比例的读者不会做出这样的声明。所以我想用一种既直观又有用的方式来介绍意义的概念。我还希望它能让人们比现在更多地询问重要性,并在没有对分析结果进行适当的显著性检验的情况下暂停妄下结论。
扔硬币
开始理解意义的最好方法是看看扔硬币的想法。这很容易理解,因为抛硬币只有两种结果:正面或反面。你可以想象一个公平或正常的硬币有相等的概率抛出一个头或一个尾巴。但是一枚有偏或有负载的硬币可能不会。例如,它可能是一种有两个头的硬币。
假设我们有一个硬币,我们被告知至少有一面是正面的,我们想确定这个硬币实际上是否是双面的。有人会为我们抛硬币,只要我们愿意,抛多少次都行,而且对结果总是诚实的。
掷一次硬币,结果是正面朝上。如果硬币是公平的,那么偶然发生的概率是二分之一。你对这两种说法有多满意?
- 硬币抛了一次,结果是正面朝上。
- 硬币有偏差
希望你对陈述 1 100%满意,对陈述 2 不太满意。很好。现在让我们第二次扔同样的硬币。又是正面。连续两个头偶然出现的概率是 1/4。也许你现在更倾向于同意第二种说法。也许不是。
假设硬币被抛了十次,十次的结果都是正面。这种事情偶然发生的概率小于 1/1000。大多数人现在会更有信心做出上面的陈述 2。
什么是意义?
作为一个概念,意义从根本上涉及三个事实:
- 答:我们周围的世界是不确定的
- b:你永远无法对事物进行足够多的测试来 100%确定一个结论
- c:尽管有 A 和 B,生活中还是需要做决定
在掷硬币的情况下,不管你掷多少次硬币,总是有正面朝上的可能性,不管这个可能性有多小。但你不能永远扔硬币否则你会在做决定之前死去(B),所以你需要确定一个点,在这个点上你可以自信地说硬币是有偏差的(C)。
每个人都有不同的确定感。我可能需要看到硬币被扔了十次才愿意伸出头来,声称硬币是有偏差的,但我的朋友可能会对扔三次硬币感到高兴。为了处理这些人类的自然差异,几个世纪以来,统计学家建立了一个确定性标准。这一标准有许多要素,但最常被引用的是这样一种观点,即要声称显著性,这种现象偶然发生的概率需要小于 0.05 或 1/20。所以在我们的掷硬币的例子中,要做出一个统计显著性的声明,你至少需要连续掷 5 次头才能达到规定的确定性水平。
这对我的工作意味着什么?
假设一个勤奋的分析师找到你,给你看他们做的分析。在此分析中,分析师查看了您组织中的所有员工,将他们分为男性和女性,并显示了以下内容:
- 在过去的 12 个月里,100 名女性中有 20 人离开了公司,离职率为 20%
- 同一时期,200 名男性中有 30 人离开了公司,离职率为 15%
现在,您将在图表上放置一个标题来显示这一分析。您可以选择两个标题:
- 在我们组织过去的 12 个月里,女性的离职率比男性的离职率高 5 个百分点
- 女性比男性更有可能离开我们公司
我希望你马上想到掷硬币的例子。标题 1 是一个很好的标题,你可以立即写下来。但是你不能在没有看到显著性测试结果的情况下写下标题 2。如果你要做这样的测试,你会发现这些比例偶然发生的概率(称为 p 值)约为 0.27,远没有低到足以自信地提出第二项主张。
这很重要,因为标题 2 是一个非常严肃的陈述。这可能会导致付出大量努力和投资来解决一个可察觉的问题。所以你和分析师有责任回去获取更多的数据,这样你就可以支持正确的统计标准。
什么时候该问意义?
每当一个有限的数据集被用来支持一个一般性的陈述时,你都应该询问它的重要性。这可以通过多种方式实现。就像上面的例子一样,一个或多个群体可能会根据特定的标准进行比较,以表明某些群体与其他群体不同。或者可以使用关于相关性的数据来声明特定的关系。不同的统计测试存在于不同的情况下,你应该有一个知道这些并能应用它们的人。
显著性通常取决于观察到的差异大小和观察到差异的人群大小。在我们上面的女性与男性的例子中,在相同规模的人群中,差异需要更大才能声称显著性,或者差异需要相同,但在更大的人群中。当你看数据时,这应该引导你的直觉。
但我从丰富的经验中知道,直觉并不总是正确的,所以我的建议是:永远要测试,不测试就不要下结论。以下是我最重要的建议,让重要性成为你的分析文化的一部分:
- 养成拥有包含 p 值的脚注的习惯
- 在没有支持显著性的 p 值的情况下,不要写关于分析结论的一般性陈述
- 不要害怕在同事面前卖弄学问。以身作则!
在商业世界的大多数情况下,重要性并不是一个复杂的概念,但它却被大大低估了。在一个越来越数据驱动的世界里,不进行显著性测试就做出决定是越来越糟糕的做法。是时候改变了。
最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在 LinkedIn 或Twitter上找我。
社会科学能为数据产业提供什么?
我会使用任何我需要的工具来得到结果。但我不会凭信仰拿工具。
我昨天在推特上打架了——不是故意的。
“Coursework will include math, statistics, and computer science as well as machine learning, computational modeling, and how neural nets works.’ Where are the social sciences?”
在宣布一所大学将提供人工智能本科学位,并开设“数学、统计学、计算机科学以及机器学习(和)计算建模”课程时,有人问了一个问题:“社会科学在哪里?”
作为一名训练有素的人类学家,他已经做了十多年的数据科学家,这个问题切中要害。在我的职业生涯中,我一直试图在我作为一名社会科学家的自我认同和用我的雇主和客户关心的术语阐述我的价值的实际需要之间取得平衡。几年前,当我刚刚开始自称为数据科学家时,我曾经写过这个主题(例如,这里的和这里的和和),最近我发现自己回到了这个主题,因为我试图解释人种学方法是我的技术工作的核心部分。
社会科学在哪里?他们应该在哪里?这些是我在职业生涯中一直努力想要回答的问题。我试图通过回复我上面链接的推文来开始关于这个问题的对话,但事情很快变得很糟糕。可能只是我沟通不好吧。也许 Twitter 只是一个试图谈论任何实质性问题的可怕地方。也许两者都有。真的,我只是一遍又一遍地重复同一个问题:
我从未得到答案,但我仍然想要一个。
这是关于整个学科,而不是人。当然,我相信许多个体社会科学家做了值得称赞的工作,正如我相信许多个体计算机科学家做了非常糟糕的工作一样。但是在最初的推文中隐含的问题不是“你为什么不让特定的社会科学家 X 教一堂课?”,而是“为什么不把社会科学系的课程纳入课程表?”这个相同的问题是由一个人在线程中提出了一个澄清问题暗示的:
“How can you be an anthropologist and data scientist and not understand how essential an understanding of human factors and human behaior is to the development of artificial intelligence? Genuine question.”
我认为这个问题引出了另外两个问题:
- 对人类因素/行为的理解对人工智能的发展至关重要吗?
- 通常被称为“社会科学”的学科是否可靠地提供了对人类因素/行为的可信理解?
回答问题 1:我不知道,但我很怀疑。如果我们用机器学习的温和术语谈论人工智能,而不是用某种奇点式一般智能的明显不那么温和的术语,那么我们在谈论一个工程问题,这意味着我们在谈论修补。我认为绝对必要的是,我们积极建立方法来监控数据系统如何对个人和社会产生下游影响。但我认为,我们通过构建然后逐步修改人工智能来了解人类行为的可能性,与其他方式相比是一样的。 我认为,假设我们理解人类行为的能力目前已经足够强大,可以首先实现理解,然后在理解的基础上建立系统,这是错误的。事实上,我认为科学的大部分历史都是由修补系统和建立理解组成的。纳西姆·塔勒布已经写了关于这一点的文章(这里是他的一些观点的一个更加用户友好的摘要)。
回答问题 2:我职业生涯中的一个主要遗憾是,我不得不回答不,而我非常希望能够回答是。我的职业生涯是在工业界度过的,所以我根据工具实现实际效果的能力来判断它。例如,我根据病人康复和病人康复的记录来判断医学。如果医学的某一部分有不良记录,或者没有记录,我判断该领域的该部分的理解水平是差的。我不在乎有多少研究或有多少人写了关于这个主题的文章:如果你不能得到结果,那么你不能声称理解。
将单词单独归类为结果是错误的。 如果你能做点什么(改变行为,赚钱等。)在现实世界中使用工具——“工具”可以指一种方法或理论观点以及一段代码或机器——那么这个事实是理解的必要但不充分的证明。 那是我自称理解的最低门槛。
我希望不是这样。我为自己是人类学家而自豪。在我的职业生涯中,我经常不得不淡化这一事实,因为为我的技能付费的人没有认识到这一称号的任何价值,尽管我的人类学技能是让我提供他们想要的结果的很大一部分。这让我难过,有时让我沮丧,但它早已不再让我惊讶。
那么社会科学在哪里呢?在很大程度上,他们似乎在忙着自言自语。被纳入大学课程、研究议程或商业计划是一种尊重的标志——一种认可价值的标志。社会科学经常被排除在外,这表明它们没有得到广泛重视。从我作为一个从业者的角度来看,我希望我能说他们目前应该得到更多的重视,但是我不能。我希望这种情况会改变。与此同时,我有我需要建造的东西。我会用任何能帮我的工具。但是我不会带走任何工具,尤其是成套的工具。
电力革命告诉了我们人工智能的未来。
All illustrations by J. P. Solano
我们并不总是有机会见证或经历一场革命,一场真正的革命。历史已经表明革命如何改变人们的生活。无论何种类型(社会、宗教、艺术或技术),所有革命都有一个共同的核心模式: 思考或想象事物方式的突然、彻底或完全的改变 。
革命并不总是每个人都失去理智的暴力骚乱;大部分时间都是缓慢的过程,需要数年才能完全展现,给人的印象是什么都没有改变,更像是煮青蛙的寓言。
也许如果我们分析像电这样最具革命性的发明之一,我们就能理解人工智能会有什么样的前景。
本杰明·富兰克林(1706-90)一生中,作为一名作家、企业家、政治家和科学家,开辟了一条成功项目的非凡道路。最重要的是,他是一个发明家,为普通问题创造解决方案,创新新技术。尽管他从未申请过一个专利,但他的许多发明仍然在我们身边,比如双焦眼镜或摆动鳍。1752 年 6 月的一个下午,在一个暴风雨的日子里,他认为这是去放风筝以展示闪电的电学性质的最佳时机。这个实验打开了一个新领域的大门:电学。127 年过去了,托马斯·爱迪生(1847-1931)终于在 1879 年在他的实验室里制造出了一个可靠、耐用的电灯泡。从那时起,在接下来的 50 年里,从木炭到电力的转变是缓慢的,远远不是一个自然的过程。总的来说,人类的劳动、城市和生活质量都不会一样。然而,电在我们的生活和日常事务中变得如此重要,以至于没有它我们无法在正常的日子里思考。但情况并非总是如此。商业和工业用了将近 30 年才完全适应,住宅电气化用了 20 年。在这个时期,电从一种神秘的力量变成了一种重要的公用事业。深入了解商业、城市和家庭如何采用电力,可以给我们一些关于人工智能和机器学习革命将如何改变我们思维方式的提示。
在工业革命的巅峰时期,理想的工厂应该是这样的:一个附属于大型多层建筑的蒸汽机房。原因很简单:工厂布局受到传动轴和单一电源的限制。这种设计昂贵且低效,但比人力工作站更有效率。
在向电力过渡的初期,制造商不愿意放弃他们大量的知识来采用最初只是略微优越的技术。其结果是,生产流程几乎没有变化,只是将现场的蒸汽机换成了电动机。这一过程仍然效率低下,但他们发现木炭费用的节省已经足够好,不需要再努力了。他们遵循一条软适应路径。
然而,电气化注定是有史以来最具破坏性的技术之一,在 1888 年至 1905 年间形成的工业部门中,超过 40%在 1930 年初失败。那些在这些“电力冲击”中幸存下来的人看到,巨大的收益不是来自简单地用蒸汽机代替电动机,而是来自生产过程本身的重新设计。像亨利·福特(1863-1947),在电气化和其他创新方面遵循艰难适应道路的领导者,结束了我们今天所知的工厂和生产的重新设计。
经济史学家保罗·大卫和加文·莱特发现,用了这么长时间才完全认识到电力的变革潜力的主要原因是“需要在任务和产品的定义和构造方式上进行组织上,尤其是观念上的变革。
这种布局将标志着作者安德鲁·迈克菲和埃里克·布林约尔松所说的“第一个机器时代”或工业革命,即使用机器来自动化和增强我们的肌肉(身体)力量。
另一方面,家庭电气化还面临着其他挑战,如令人担忧的媒体报道和家用电器的缺乏。还需要 20 年的时间,城市和房屋才能反映出电力对提高我们生活质量的真正影响。
解读:我们人类倾向于寻找阻力和风险较小的道路。然而,创新和革命恰恰相反,因为它充满了变化和机遇。就电力而言,我们倾向于维护现状,直到我们被迫改变并接受一种新常态。从 1880 年到 1930 年,企业、城市和家庭不得不采用最新技术来保持竞争力和效率。适应过程显示了这种模式:
- 拒绝与批判。由媒体和普通人领导。
- 软适配路径。由关注经济影响的早期业务采纳者领导。
- 硬适应路径。由专注于颠覆传统的商业远见者领导。
- 拥抱变化。每个人都追随这项技术的大规模应用。
如果我们在创新时间轴上快进,我们将到达我们的时代。人类已经见证了计算机和软件的崛起,这开启了第二个机器时代:机器现在不仅被用来扩展体力,还被用来论证我们的认知能力。这为一系列新的挑战打开了大门,但也为一个新的进步单位打开了大门:指数级
未来学家杰森·希尔瓦 (1982 -)说大脑在一个线性和局部的世界中进化,但我们现在生活在一个全球化和指数化的世界中。他说,在一个带着线性镜头的思想家的世界里,技术变革正在以指数速度发生,所以我们永远看不到未来的到来。举个例子来理解线性增长和指数增长的区别,如果你走 30 步线性增长,你会得到 30 步,但是如果你走同样的 30 步指数增长,你会得到 10 亿。
在破解了英格玛机器并为二战中打败纳粹德国做出了贡献之后,数学家艾伦·都灵(1912–1954)着迷于创造一种能够学习并成为人工智能的“学习机器”的可能性。正如他指出的那样,“思考”很难定义,正因为如此,他在 1950 年发表了他著名的图灵测试,这是一项测试机器表现出与人类同等或不可区分的智能行为的能力的测试。不幸的是,他因为自己的性倾向而被起诉,并在多年后自杀,但都灵给人工智能留下的遗产就相当于本杰明·富兰克林给电。
人工智能只在大学和实验室中可见,直到 80 年代 Geoffrey Hinton 教授(1947 —)和同事对多层神经网络的研究,创建了一个使用机器学习和深度学习(人工智能的一个子集)的清晰模型。然而,许多冬天过去了,直到人工智能获得主流关注。
但是,为什么人工智能现在如此重要,而不是在 20 或 30 年前,那时所有的理论和概念都已经存在了?答案是计算能力和可用的数据量。当我们与人类的表现相比时,以前在一般问题中使用人工智能的尝试显示出平庸的结果。2014 年,谷歌聘请辛顿教授将人工智能作为重中之重,并开放了对互联网产生的大型数据集的访问。随着计算机性能的不断提高,所有这些变化都为人工智能(特别是深度学习)的商业改编创造了完美的条件。
对人工智能的大肆宣传。来自深度学习在某些特定领域取得的令人难以置信的进展。但同时,邪恶人工智能的大肆宣传或终结者的场景这只是媒体策略的一部分,以获得一些容易出售的新闻的关注。事实是人工智能远不能代表对人类的真正威胁。
作为斯坦福大学的教授,吴恩达 (1976 -),一直是深度学习和机器学习研究的先驱。他联合创立并领导了谷歌大脑项目,曾任 VP &首席科学家;当我们试图理解人工智能对我们社会的影响和作用时,他也是最受尊敬的声音之一。
他创造了这个短语:
“人工智能是新的电力,”他说。“就像 100 年前电力改变了一个又一个行业一样,人工智能现在也将这样做。”
以下是一些例子:
医学:
- 基于人工智能的临床决策;
- 医学知识工程;
- 图像分析;
- 生物和临床医学中的计算智能:
自动驾驶汽车:
- 交通即服务
- 免费邮递
- 较少的车祸
学历:
- 课外辅导和支持
- 面向所有学生的普及教育
- 差异化和个性化学习
数字助理:
- 阿莱夏
- 戒指
- 谷歌主页
- 索诺斯
人工智能的想法已经讨论了一段时间,但直到 2006 年,世界才意识到可行的人工智能的两个主要要求:更快、更便宜的计算机(云计算)和大量的数据(互联网)。从那时起,人工智能,特别是深度学习的成就已经呈指数级增长(就像 AlphaGo 一样),这意味着我们可能不必再等 50 年才能看到人工智能的全面发展。
人工智能的适应过程如下:
- 拒绝和批评是预期媒体报道的一部分,但每次关于人工智能的新闻越来越少启示性,越来越科学
- 从业务角度来看,许多公司正在寻找人工智能的软适应路径,例如,通过增加聊天机器人服务来取代呼叫中心的人工操作员,而无需重新思考业务流程。正如 100 年前发生那样,这将代表边际成本节约,但不是真正的竞争优势。
- 亚马逊、谷歌、苹果、微软等其他公司已经开始了人工智能的艰难适应之路,进行真正的结构重组,并在世界各地开设人工智能研究实验室。谷歌报告称,通过使用与 AlphaGo 类似的方法,DeepMind 能够将谷歌数据中心的能效提高 15%
- 我们正处于家庭大规模适应数字辅助的开端。亚马逊 Alexa、谷歌 Home 和其他公司都在努力赢得家庭的关注。
人工智能作为一种革命性的颠覆将需要可治理性规则和明确的界限。我们对社交媒体公司的艰难觉醒,是一个伟大的工具如何被用于邪恶提议的例子。
更多来自 J.P .索拉诺的帖子:
- 在世界上最好的餐厅之一用餐是什么感觉?
- 大卫·海涅梅尔分享了一些违背常理的原则
- 重要的是平台,而不是应用程序。
- 开发 SaaS 产品前你想知道的事情
- 通勤自我意识
- 企业家、可信度和辛纳特拉测试
- 每位企业家都应该参加斯巴达赛跑的 8 个理由
- 斯蒂芬·金的 20 条作家法则适用于企业家
- 应力悖论
- 99u IDEO 工作室的 10 个经验教训
- El bulli 如何将用餐变成一种体验
- 分享你的想法,反正没人会在意
- 为什么不利用自己呢?
- 释放你内心的超级英雄
Infer.NET 代码中潜伏着哪些错误?
微软发布的项目资源是进行分析的一个很好的理由。这次也不例外,今天我们就来看看 Infer.NET 法典中发现的可疑之处。不要做总结,说重点!
项目及分析仪简介
推断。NET 是微软专家开发的机器学习系统。项目源代码最近在 GitHub 上可用,这引起了它的检查。更多关于该项目的细节可以在这里找到。
该项目由 PVS-Studio 6.26 静态代码分析器检查。我提醒一下,PVS-Studio 正在搜索 Windows、Linux、macOS 下 C\C++\C#(很快还有 Java)代码中的错误。C#代码目前为止只在 Windows 下分析。你可以下载并在你的项目上试用这个分析器。
支票本身非常简单,没有任何麻烦。在检查之前,我从 GitHub 下载了项目源代码,恢复了所需的包(依赖项),并确保项目成功构建。这是必需的,以便分析人员可以访问所有需要的信息来执行全面的分析。在几次点击之后,我通过 Visual Studio 的 PVS-Studio 插件运行了解决方案分析。
顺便说一下,这不是微软的第一个项目,用 PVS-Studio 检查过——还有其他的:罗斯林、 MSBuild 、 PowerShell 、 CoreFX 和其他。
**注意。**如果您或您的朋友对 Java 代码分析感兴趣,您可以通过选择“我想要分析 Java”写信给我们的支持人员。目前还没有公开的测试版本,但它很快就会出现。有人在一个秘密实验室里(隔壁)人们正在积极地研究它。
然而,哲学对话已经谈得够多了——让我们看看代码中的问题。
是 Bug 还是特性?
我建议你自己找出错误——这是一个完全可能的任务。我保证没有烧伤符合文章“2017 年 C++项目十大 Bugs】”中的内容。因此,请花时间阅读代码片段后给出的分析器警告。
**private** **void** **MergeParallelTransitions**()
{
....
**if** ( transition1.DestinationStateIndex ==
transition2.DestinationStateIndex
&& transition1.Group ==
transition2.Group)
{
**if** (transition1.IsEpsilon && transition2.IsEpsilon)
{
....
}
**else** **if** (!transition1.IsEpsilon && !transition2.IsEpsilon)
{
....
**if** (**double**.IsInfinity(transition1.Weight.Value) &&
**double**.IsInfinity(transition1.Weight.Value))
{
newElementDistribution.SetToSum(
1.0, transition1.ElementDistribution,
1.0, transition2.ElementDistribution);
}
**else**
{
newElementDistribution.SetToSum(
transition1.Weight.Value, transition1.ElementDistribution,
transition2.Weight.Value, transition2.ElementDistribution);
}
....
}
PVS-Studio 警告:v 3001有相同的子表达式 double。IsInfinity(transition1。Weight.Value)'的左边和右边的'&'操作符。运行时自动机。Simplification.cs 479
从源代码片段中可以看出,该方法使用了几个变量— transition1 和 transition2 。使用相似的名字有时是合理的,但值得记住的是,在这种情况下,在某个地方偶然犯错误的可能性会增加。
所以在检查无穷上的数字时发生了( double。IsInfinity )。由于错误,同一个变量的值转变 1。重量值被检查了两次。变量跃迁 2。第二子表达式中的 Weight.Value 必须成为一个检查值。
另一个类似的可疑代码。
internal MethodBase **ToMethodInternal**(IMethodReference imr)
{
....
bf |= BindingFlags.Public
| BindingFlags.NonPublic
| BindingFlags.Public
| BindingFlags.Instance;
....
}
PVS-Studio 警告:v 3001有相同的子表达式' BindingFlags。“|”运算符左侧和右侧的“Public”。编译器 CodeBuilder.cs 194
形成 bf 变量值时,枚举器 BindingFlags。公共使用两次。该代码包含冗余标志设置操作,或者代替第二次使用 BindingFlags。公共的另一个枚举器必须在这里发生。
顺便说一下,这段代码是在源代码中用一行代码写的。在我看来,如果它是以表格的形式格式化的(就像这里),就更容易发现问题。
我们继续吧。我引用了整个方法体,并再次建议您自己找出一个(或多个)错误。
**private** **void** **ForEachPrefix**(IExpression expr,
Action<IExpression> action)
{
*// This method must be kept consistent with GetTargets.*
**if** (expr is IArrayIndexerExpression)
ForEachPrefix(((IArrayIndexerExpression)expr).Target,
action);
**else** **if** (expr is IAddressOutExpression)
ForEachPrefix(((IAddressOutExpression)expr).Expression,
action);
**else** **if** (expr is IPropertyReferenceExpression)
ForEachPrefix(((IPropertyReferenceExpression)expr).Target,
action);
**else** **if** (expr is IFieldReferenceExpression)
{
IExpression target = ((IFieldReferenceExpression)expr).Target;
**if** (!(target is IThisReferenceExpression))
ForEachPrefix(target, action);
}
**else** **if** (expr is ICastExpression)
ForEachPrefix(((ICastExpression)expr).Expression,
action);
**else** **if** (expr is IPropertyIndexerExpression)
ForEachPrefix(((IPropertyIndexerExpression)expr).Target,
action);
**else** **if** (expr is IEventReferenceExpression)
ForEachPrefix(((IEventReferenceExpression)expr).Target,
action);
**else** **if** (expr is IUnaryExpression)
ForEachPrefix(((IUnaryExpression)expr).Expression,
action);
**else** **if** (expr is IAddressReferenceExpression)
ForEachPrefix(((IAddressReferenceExpression)expr).Expression,
action);
**else** **if** (expr is IMethodInvokeExpression)
ForEachPrefix(((IMethodInvokeExpression)expr).Method,
action);
**else** **if** (expr is IMethodReferenceExpression)
ForEachPrefix(((IMethodReferenceExpression)expr).Target,
action);
**else** **if** (expr is IUnaryExpression)
ForEachPrefix(((IUnaryExpression)expr).Expression,
action);
**else** **if** (expr is IAddressReferenceExpression)
ForEachPrefix(((IAddressReferenceExpression)expr).Expression,
action);
**else** **if** (expr is IDelegateInvokeExpression)
ForEachPrefix(((IDelegateInvokeExpression)expr).Target,
action);
action(expr);
}
找到了吗?让我们检查一下!
【PVS-Studio 警告:
V3003 检测到“if (A) {…} else if (A) {…}”模式的使用。存在逻辑错误的可能性。检查线路:1719,1727。编译器 CodeRecognizer.cs 1719
V3003 检测到“if (A) {…} else if (A) {…}”模式的使用。存在逻辑错误的可能性。检查线路:1721,1729。编译器 CodeRecognizer.cs 1721
让我们简化代码,这样问题会变得更加明显。
**private** **void** **ForEachPrefix**(IExpression expr,
Action<IExpression> action)
{
**if** (....)
....
**else** **if** (expr is IUnaryExpression)
ForEachPrefix(((IUnaryExpression)expr).Expression,
action);
**else** **if** (expr is IAddressReferenceExpression)
ForEachPrefix(((IAddressReferenceExpression)expr).Expression,
action);
....
**else** **if** (expr is IUnaryExpression)
ForEachPrefix(((IUnaryExpression)expr).Expression,
action);
**else** **if** (expr is IAddressReferenceExpression)
ForEachPrefix(((IAddressReferenceExpression)expr).Expression,
action)
....
}
如果语句重复,条件表达式和然后-几个的分支。也许,这段代码是用复制粘贴的方法写的,导致了一个问题。现在结果是然后*——副本的分支永远不会被执行,因为:*
- 如果条件表达式为真,则从相应对中执行第一个 if 语句的主体;
- 如果条件表达式在第一种情况下为假,那么在第二种情况下也为假。
由于then-分支包含相同的动作,现在看起来像冗余代码,令人困惑。也许,这里有一种不同的问题——必须运行其他检查,而不是重复检查。
我们继续。
**public** **int** **Compare**(Pair<**int**, **int**> x, Pair<**int**, **int**> y)
{
**if** (x.First < y.First)
{
**if** (x.Second >= y.Second)
{
*// y strictly contains x*
**return** 1;
}
**else**
{
*// No containment - order by left bound*
**return** 1;
}
}
**else** **if** (x.First > y.First)
{
**if** (x.Second <= y.Second)
{
*// x strictly contains y*
**return** -1;
}
**else**
{
*// No containment - order by left bound*
**return** -1;
}
}
....
}
PVS-Studio 警告:
v 3004‘then’语句相当于‘else’语句。运行时 RegexpTreeBuilder.cs 1080
v 3004‘then’语句相当于‘else’语句。运行时 RegexpTreeBuilder.cs 1093
这段代码看起来非常可疑,因为它包含两个条件语句,这两个条件语句的主体完全相同,分别是和以及 else 分支。大概在这两种情况下,都值得返回不同的值。另一方面,如果它是构想行为,那么移除冗余的条件语句将是有用的。
我遇到了一些更有趣的循环。下面是一个例子:
**private** **static** Set<StochasticityPattern>
IntersectPatterns(IEnumerable<StochasticityPattern> patterns)
{
Set<StochasticityPattern> result
= **new** Set<StochasticityPattern>();
result.AddRange(patterns);
**bool** changed;
**do**
{
**int** count = result.Count;
AddIntersections(result);
changed = (result.Count != count);
**break**;
} **while** (changed);
**return** result;
}
PVS-Studio 警告:v 3020一个循环内的无条件‘中断’。编译器 DefaultFactorManager.cs 474
由于无条件的 break 语句,恰好执行一次循环迭代,甚至不使用控制改变的变量。一般来说,代码看起来很奇怪,很可疑。
同样的方法(精确复制)发生在另一个班级。相应的分析仪警告: V3020 一个循环内无条件的‘中断’。可视化工具。windows factor manager view . cs 350
顺便说一下,我在一个循环中偶然发现了一个无条件的 continue 语句(分析器通过相同的诊断发现了它),但是在它上面有一个注释,声明它是一个特殊的临时解决方案:
*// TEMPORARY*
**continue**;
让我提醒你,在无条件的 break 语句旁边没有这样的注释。
我们继续吧。
internal **static** DependencyInformation **GetDependencyInfo**(....)
{
....
IExpression resultIndex = null;
....
**if** (resultIndex != null)
{
**if** (parameter.IsDefined(
typeof(SkipIfMatchingIndexIsUniformAttribute), false))
{
**if** (resultIndex == null)
**throw** **new** InferCompilerException(
parameter.Name
+ " has SkipIfMatchingIndexIsUniformAttribute but "
+ StringUtil.MethodNameToString(method)
+ " has no resultIndex parameter");
....
}
....
}
....
}
PVS-Studio 警告:v 3022表达式' resultIndex == null '始终为 false。编译器 FactorManager.cs 382
我想直接指出的是,在声明和给定检查之间, resultIndex 变量的值可能会改变。但是,在检查之间 resultIndex!= null 和 resultIndex == null 该值不能更改。因此,表达式 resultIndex == null 的结果将始终为 false ,从而永远不会生成异常。
我希望即使没有我的建议,你也有兴趣独立搜索 bug 来发现问题,但为了以防万一,我会建议再做一次。方法代码很小,我就全部引用了。
**public** **static** Tuple<**int**, string> ComputeMovieGenre(**int** offset,
string feature)
{
string[] genres = feature.Split('|');
**if** (genres.Length < 1 && genres.Length > 3)
{
**throw**
**new** ArgumentException(string.Format(
"Movies should have between 1 and 3 genres; given {0}.",
genres.Length));
} **double** value = 1.0 / genres.Length; var result
= **new** StringBuilder(
string.Format(
"{0}:{1}",
offset + MovieGenreBuckets[genres[0]],
value));
**for** (**int** i = 1; i < genres.Length; ++i)
{
result.Append(
string.Format(
"|{0}:{1}",
offset + MovieGenreBuckets[genres[i].Trim()],
value));
} **return**
**new** Tuple<**int**, string>(MovieGenreBucketCount, result.ToString());
}
让我们看看这里发生了什么。输入字符串由字符“|”解析。如果数组的长度与预期的不匹配,就会产生一个异常。等等… 流派。长度<1&1&流派。长度> 3 ?因为不存在适合表达式( [int。最小价值..1) 和 (3..里面的 MaxValue] ,表达式的结果永远是假。因此,该检查不提供任何保护,并且不会引发预期的异常。
这就是分析器阻止我们讲述的:v 3022表达‘流派。长度< 1 &体裁&。长度>3’始终为假。这里可能应该使用' || '运算符。Evaluator Features.cs 242
我发现了一个可疑的组织行动。
**public** **static** **void** **CreateTrueThetaAndPhi**(....)
{
....
**double** expectedRepeatOfTopicInDoc
= averageDocLength / numUniqueTopicsPerDoc;
....
**int** cnt = Poisson.Sample(expectedRepeatOfTopicInDoc);
....
}
PVS-Studio 警告:v 3041表达式被隐式地从“int”类型转换为“double”类型。考虑使用显式类型转换来避免小数部分的丢失。举个例子:double A =(double)(X)/Y;。LDA Utilities.cs 74
这里的可疑之处在于:执行了整数除法(变量 averageDocLength 和numuniquetopisperdoc属于 int 类型),但是结果被写入一个 double 类型的变量中。这就引出了一个问题:这是故意的还是暗示了实数的除法?如果变量expectedrepeatoftopiciindo属于 int 类型,这将禁止可能的问题。
其他地方的方法阿松。例如,使用其自变量是可疑变量的样本*,如下所述。*
**int** numUniqueWordsPerTopic
= Poisson.Sample((**double**)averageWordsPerTopic);
averagedwordspertopic为 int 类型,在其使用的地方被强制转换为 double 。
这是另一个使用的地方:
**double** expectedRepeatOfWordInTopic
= ((**double**)numDocs) * averageDocLength / numUniqueWordsPerTopic;
....
**int** cnt = Poisson.Sample(expectedRepeatOfWordInTopic);
请注意,变量与原始示例中的名称相同,只是在初始化时使用了实数的 expectedRepeatOfWordInTopic除法(由于显式的 numDocs 转换为 double 类型)。
总的来说,上面提到的由分析器用警告突出显示的起始源代码片段值得一看。
让我们把是否修复这个问题的思考留给代码作者(他们知道得更多),我们会走得更远。下一个可疑部门。
**public** **static** NonconjugateGaussian **BAverageLogarithm**(....)
{
....
**double** v_opt = 2 / 3 * (Math.Log(mx * mz / Ex2 / 2) - m);
**if** (v_opt != v)
{
....
}
....
}
PVS-Studio 警告:v 3041表达式被隐式地从“int”类型转换为“double”类型。考虑使用显式类型转换来避免小数部分的丢失。举个例子:double A =(double)(X)/Y;。运行时 ProductExp.cs 137
分析器再次发现一个可疑的整数除法运算,因为 2 和 3 是整数数值,表达式 2 / 3 的结果将是 0 。因此,表达式如下所示:
**double** v_opt = 0 * expr;
你必须承认,这有点奇怪。好几次我都回到这个警告,试图找到一个窍门,而不是试图将它添加到文章中。该方法充满了数学和公式(坦率地说,拆除并不十分吸引人),这里有很多值得期待的东西。此外,我尽量对这些警告保持怀疑的态度,我在文章中提到了这些警告,并在对它们进行了初步的深入研究后对它们进行了描述。
我恍然大悟——为什么需要像 0 这样的乘数,写成 2 / 3 ?因此,这个地方无论如何都值得一看。
**public** **static** **void**
**WriteAttribute**(TextWriter writer,
string name,
object defaultValue,
object value,
Func<object, string> converter = null)
{
**if** ( defaultValue == null && value == null
|| value.Equals(defaultValue))
{
**return**;
}
string stringValue = converter == null ? value.ToString() :
converter(value);
writer.Write($"{name}=\"{stringValue}\" ");
}
PVS-Studio 警告:v 3080可能的空引用。考虑检查“价值”。编译器 WriteHelpers.cs 78
相当公平的基于条件的分析器警告。表达式值中可能出现空引用取消引用。等于(默认值),如果值== null 。由于该表达式是运算符||的右操作数,对于其求值,左操作数必须具有假值,为此,至少一个变量默认值 \ 值不等于空值就足够了。最后,如果 defaultValue!= null ,并且值== null :
- default value = = null->-false;
- default value = = null&value = = null->false;(值检查未执行)
- 值。equals(default value)->-NullReferenceException,asvalue-null。
让我们看另一个案例:
**public** **FeatureParameterDistribution**(
GaussianMatrix traitFeatureWeightDistribution,
GaussianArray biasFeatureWeightDistribution)
{
Debug.Assert(
(traitFeatureWeightDistribution == null &&
biasFeatureWeightDistribution == null)
||
traitFeatureWeightDistribution.All(
w => w != null
&& w.Count == biasFeatureWeightDistribution.Count),
"The provided distributions should be valid
and consistent in the number of features.");
....
}
PVS-Studio 警告:v 3080可能的空引用。请考虑检查“traitFeatureWeightDistribution”。推荐功能 ParameterDistribution.cs 65
让我们省略额外的字符串,只留下计算布尔值的逻辑,以便于整理:
(traitFeatureWeightDistribution == null &&
biasFeatureWeightDistribution == null)
||
traitFeatureWeightDistribution.All(
w => w != null
&& w.Count == biasFeatureWeightDistribution.Count)
同样,运算符||的右操作数只有在对左操作数求值的结果为 false 时才会被求值。左操作数可以取 false 值,包括当traitfeatureweightdession = = null和biasfeatureweightdession!= null 。然后运算符||的右操作数将被求值,并调用traitFeatureWeightDistribution。所有的将导致抛出 ArgumentNullException 。
另一段有趣的代码:
**public** **static** **double** **GetQuantile**(**double** probability,
**double**[] quantiles)
{
....
**int** n = quantiles.Length;
**if** (quantiles == null)
**throw** **new** ArgumentNullException(nameof(quantiles));
**if** (n == 0)
**throw** **new** ArgumentException("quantiles array is empty",
nameof(quantiles));
....
}
PVS-Studio 警告:v 3095“分位数”对象在验证为空之前被使用。检查线路:91,92。运行时 OuterQuantiles.cs 91
注意分位数。访问长度属性,然后检查分位数是否等于空值。最后,如果 quantiles == null ,该方法将抛出一个异常,但是是不正确的异常,并且位于错误的位置。大概是线反了。
如果你已经成功地发现了前面列出的错误,我建议你用下面的方法发现一个错误,然后给自己泡一杯咖啡,试着重复一次英雄行为。为了让它更有趣一点,我将引用整个方法代码。
(全尺寸)
好吧,好吧,那是个玩笑(还是你干的?!).让我们简化任务:
**if** (sample.Precision < 0)
{
precisionIsBetween = true;
lowerBound = -1.0 / v;
upperBound = -mean.Precision;
}
**else** **if** (sample.Precision < -mean.Precision)
{
precisionIsBetween = true;
lowerBound = 0;
upperBound = -mean.Precision;
}
**else**
{
*// in this case, the precision should NOT be in this interval.*
precisionIsBetween = false;
lowerBound = -mean.Precision;
lowerBound = -1.0 / v;
}
好点了吗?分析仪发出以下代码警告:v 3008‘lower bound’变量被连续赋值两次。也许这是一个错误。检查线路:324,323。运行时 GaussianOp.cs 324
事实上,在最后一个 else 分支中, lowerBound 变量的值被连续赋值两次。显然(从上面的代码判断),变量 upperBound 应该参与其中一个赋值。
我们继续吧。
**private** **void** **WriteAucMatrix**(....)
{
....
**for** (**int** c = 0; c < classLabelCount; c++)
{
**int** labelWidth = labels[c].Length; columnWidths[c + 1] =
labelWidth > MaxLabelWidth ? MaxLabelWidth : labelWidth;
**for** (**int** r = 0; r < classLabelCount; r++)
{
**int** countWidth = MaxValueWidth;
**if** (countWidth > columnWidths[c + 1])
{
columnWidths[c + 1] = countWidth;
}
} ....
}
PVS-Studio 警告:v 3081“r”计数器不在嵌套循环内使用。考虑检查“c”计数器的使用情况。命令行分类赋值模块. cs 459
请注意,内部循环计数器— r 没有用在这个循环的主体中。因此,在内部循环的所有迭代中,执行具有相同元素的相同操作——在索引中,也使用外部循环的计数器,而不是内部循环的计数器( r )。
再来看看其他有趣的问题。
**public** **RegexpFormattingSettings**(
**bool** putOptionalInSquareBrackets,
**bool** showAnyElementAsQuestionMark,
**bool** ignoreElementDistributionDetails,
**int** truncationLength,
**bool** escapeCharacters,
**bool** useLazyQuantifier)
{
**this**.PutOptionalInSquareBrackets = putOptionalInSquareBrackets;
**this**.ShowAnyElementAsQuestionMark = showAnyElementAsQuestionMark;
**this**.IgnoreElementDistributionDetails =
ignoreElementDistributionDetails;
**this**.TruncationLength = truncationLength;
**this**.EscapeCharacters = escapeCharacters;
}
PVS-Studio 警告:v 3117没有使用构造函数参数' useLazyQuantifier '。运行时 regexpformattingsettings . cs 38
在构造函数中,没有使用一个参数— useLazyQuantifier 。鉴于在一个类中,一个属性是用一个适当的名称和类型定义的,这看起来特别可疑——T2 uselazy quantifier。显然,有人忘记通过相应的参数进行初始化。
我还遇到了几个潜在危险的事件处理程序。下面是其中一个例子:
**public** **class** **RecommenderRun**
{
....
**public** event EventHandler Started;
....
**public** **void** **Execute**()
{
*// Report that the run has been started*
**if** (**this**.Started != null)
{
**this**.Started(**this**, EventArgs.Empty);
}
....
}
....
}
PVS-Studio 警告:v 3083事件“Started”的不安全调用,NullReferenceException 是可能的。请考虑在调用事件之前将其分配给一个局部变量。评估员推荐 Run.cs 115
事实是,在检查 null 不等式和处理程序调用之间,如果在测试 null 和调用事件处理程序之间的时间内,事件没有订阅者,则会引发异常 NullReferenceException ,则可能会发生事件取消订阅。为了避免这样的问题,例如,您可以将对委托链的引用保留在一个局部变量中,或者使用?.'运算符来调用处理程序。
除了上面的代码片段,还找到了 35 个这样的地方。
顺便说一下,785v 3024 警告发生了。使用运算符比较实数时发出 V3024 警告!= '或' == '。我不会详述为什么这样的比较不总是正确的。关于这个的更多信息写在文档中,还有一个到 StackOverflow 的链接。
考虑到经常遇到公式和计算的事实,这些警告即使被置于第三级也可能是重要的(因为它们几乎与所有项目都不相关)。
如果您确定这些警告是不相关的,您几乎只需点击一下就可以删除它们,从而减少分析仪触发的总数。
结论
不知何故,碰巧我很久没有写关于项目检查的文章了,所以我很高兴再次参与到这个过程中。我希望你从这篇文章中学到一些新的\有用的东西,或者至少带着兴趣阅读它。
我希望开发人员快速修复问题,我想提醒大家,犯错误是可以的,因为我们是人。这就是为什么我们需要像静态分析器这样的额外工具来发现一个人遗漏了什么,对吗?无论如何,祝你的项目好运,谢谢你的工作!
此外,记住静态分析器的最大使用是在它的常规使用时获得的。
万事如意!
什么是计算机视觉?
粗略的探索
非常可爱的计算机科学家、企业家、风险投资家保罗·格拉厄姆曾经在他的文章《像你说的那样写》中提到:
非正式语言是思想的运动服。
记住这一点,让我们讨论一下计算机视觉“甚至是什么”,从不真正了解它开始。
TechCrunch 巧妙地用这个想法打开了话题:
房间对面有人扔给你一个球,你接住了。简单吧?事实上,这是我们试图理解的最复杂的过程之一——更不用说重现了。
现在,快速浏览一下维基百科:
计算机视觉是一个跨学科领域,研究如何让计算机从数字图像或视频中获得高层次的理解。
粗略翻译:计算机视觉和它听起来的一样,只是有一些额外的考虑和与其他相关领域的区别。
Extracting and Classifying Features in Video
再次引用维基百科,计算机视觉包括:
使用借助几何学、物理学、统计学和学习理论构建的模型,从图像数据中解开符号信息。
用不经意的语言来说:计算机视觉是一个丰富而令人兴奋的领域,充满了研究论文,在这个领域,人们不会像说话一样写东西(除了这个家伙)。
计算机视觉漫长而传奇的历史
大约在华特·迪士尼去世和维基百科创始人诞生的时候,人们就一直试图赋予计算机视觉的天赋:
可以说,半个世纪以来,计算、数学和相关领域的进步使我们取得了很大进步。
数字图象处理
计算机视觉在很大程度上依赖于数字图像处理和维恩图,听起来也是如此,但这是不同的。可以说以下任务属于数字图像处理的范围:
- **模式识别:**自明。找到规律。
- 特征 **提取:**将图像分解成不同的特征。
- **分类:**这一簇边/形状看起来像汽车吗?一只狗?
- **多尺度信号分析:**还有哪些方式可以看到这个图像?
- **图形投影:**我们如何用 2d 表现 3d 物体?
Some ways to project a 3d object into two dimensions: An image processing task
算法模式识别使我们能够自动定位图像的关键点,如角和边。例如,当我们比较连续视频帧之间显著点的相对位置时,我们可以做一些事情,如补偿 x 和 y 轴的过度移动;我们可以稳定颤抖。你可以用 python 中的开源代码很容易地做到这一点。
Shaky on the left, stabilized on the right
多尺度信号分析可能是这些图像处理子任务中最令人兴奋的,但在高层次上,它也和它听起来的一样:在几个“尺度”上,呃,从几个角度分析一个信号(比如一幅图像)。Photoshop 在其锐化工具中使用多尺度分析。
Sometimes, to sharpen an image, you gotta blur it up first to help figure out where the edges are.
一个有趣的方法是通过对 *取导数来分离图像。*这是一种帮助找到图像边缘的方法,然后可以帮助我们将图像的各个部分聚集成单独的对象,然后这些对象可以接收标签——人类、狗、豹猫、运动球等等。这经常发生在多个“尺度”上。
Brightness at the pixel level. Images do start to look like numpy arrays…
上面是诚实的安倍的照片。它的分辨率足够低,你可以看到单个像素。由于我们使用的是 8 位灰度,这些数字代表每个像素的亮度值,范围从 0 到 255。
如果你沿着 x 轴对任何给定的像素取离散导数,这意味着你将把它与它左边和右边的像素进行比较,然后得到它们亮度值之间的瞬时变化率的估计值。你可以沿着 y 轴(它的列)对同一个像素进行离散求导,然后将这两条信息结合起来,就可以计算出这个像素是否位于边缘。
Imagine x is a pixel’s position in a discrete row of pixels, and y is its brightness value. You couldn’t get its derivative from the bar graph, but you could estimate it from a curve of best fit.
边缘往往在亮度或颜色值之间具有更大的瞬时变化率。我的意思是,看看亚伯的黑胡子的对比边缘。无论如何,这里有一个去年最新的物体检测演示,它实时结合了许多这些技术:
Joseph Redmon et al’s YOLOv3 Object Detection Algorithm. His resumé is awesome.
计算机视觉与机器视觉
那么,计算机视觉和数字图像处理的区别是什么呢?有很多重叠,但计算机视觉通常被认为更广泛:计算机视觉倾向于要求一些关于世界的假设作为输入,并且还试图输出一些可操作的决策。
这里有一种方式来思考这种区别:想象一下我们从飞机上扔下一个配备有降落伞和摄像机的简单机器人。如果它只是在降落时进行数字图像处理,它可能能够分析其摄像头的反馈,以识别其下方的陆地和海洋区域——但它不知道什么是陆地和海洋也不知道对它们做了什么*。*
有了计算机视觉,我们可以给我们的机器人一些关于世界的假设,比如“水和热熔岩不适合着陆,”以及“这就是热熔岩和水的样子。”然后,我们的机器人可以使用数字图像处理来分析它的摄像头,将周围的区域分为陆地、海洋或熔岩,并根据它之前的假设,决定在哪里着陆最好——然后去那里。
这个假设的跳伞实际上是机器视觉的一个例子,是计算机视觉的应用工程子类。机器视觉的一个更现实的应用可能是,自动化和加速装配线上的视觉质量控制任务。计算机视觉与这一学科的理论和科学元素有更多的关系,而不是帮助跳伞机器人安全着陆的实地工作。
憎恨者不会同意这些定义。有人说,数字图像处理只寻求以某种方式转换图像,而计算机视觉做任何和所有的模式识别、分析、解析斑点等等。在这一系列学术术语中,它仍然有点像狂野的西部。
未来:好与坏
我们已经疯狂地给予计算机近乎实时地观察事物并描述它们是什么的能力。未来工作的重点将是进一步开发通用系统,让计算机能够理解它们看到的东西,并做出适当的反应。
我们需要这样的系统来让自动驾驶汽车安全运行。为了让医学成像变得更好更便宜,我们需要它们。我们将需要它来做许多好事,但正如人类建造的任何闪亮的新工具一样,我们必须记住一件事:一旦建立在这些基础上的工具以有意义的方式出售,那些从剥削、战争和其他邪恶行为中获利的人就会拿出他们的支票簿。来自 Gizmodo :
伦敦著名的皮卡迪利广场正在安装一个巨大而可怕的…巨大的屏幕……【它】可以探测附近的车辆、年龄,甚至人们的情绪,并通过播放有针对性的广告做出反应。
多黑的镜子。
机器学习和数字图像处理的进步正在融合。想到在我有生之年,在仓库工作的机器人将能够看到我正在向它扔扳手,理解这意味着什么,决定它应该做什么,抓住它,这并不疯狂。
每个 CEO 需要了解的人工智能知识。第一部分:增长
简单地将 AI 委托给你的数字团队是错误的。以下是您如何利用它来改变您业务的方方面面。
人工智能(AI)允许公司思考以前不可想象的事情。然而,尽管微软、亚马逊、脸书、谷歌和百度等科技巨头将人工智能作为其核心,并定期利用其潜力,但大多数其他非科技公司现在才开始意识到人工智能给他们带来的机遇。
很少有首席执行官意识到人工智能可以帮助他们实现商业目标并塑造 P & L 。他们知道如何利用组织重新设计、削减成本、并购、业务和产品发布以及地理扩张,但未能看到人工智能是一个可以添加到他们工具包中的强大工具。
由于大多数非科技公司的首席执行官不知道如何将人工智能融入他们的商业战略,他们倾向于将人工智能工作委托给他们的数字团队。但是这些团队不可避免地从技术的角度而不是 P&L 的角度来看待它。我看到的是数字团队迷失在树林中,而牺牲了森林。后者需要高级商业领袖充分理解和欣赏人工智能如何帮助他们。
每个首席执行官都应该能够在人工智能的帮助下重新想象他们的业务和 P&L。作为一个指南,我确定了首席执行官可以在人工智能的帮助下塑造的 17 个杠杆,以提高他们的损益。我开发的框架(如下)既可以用作评估你的团队围绕人工智能所做努力的当前状态的晴雨表,也可以用于发现新的机会。这 17 个杠杆展示了人工智能如何帮助推动卓越的增长,提高资本回报率,以及管理可取和不可取的风险。
该框架将帮助您与您的团队围绕如何利用人工智能的力量进行结构化和集中的讨论,关注以下问题:
- 奖金的潜在规模有多大?
- 市场进化到了什么阶段?
- 早期采用者实现了什么?
- 要避免哪些陷阱?
持续高速增长
我们先来看增长。持续的高速增长是难以捉摸的。没有必胜的公式。但成功的公司似乎掌握了战略、资本配置、创新、市场扩张以及卓越的销售和营销的调配权。这些杠杆中的最后三个一直是人工智能早期采用者的关注点。
创造新的
推动增长的秘诀是大胆开发一种全新的产品,这在以前是不可能的。以亚马逊的智能音箱 Alexa 为例——现在每六个美国家庭中就有一个。这是一项创新,打破了电信巨头、手机制造商和家庭娱乐系统提供商对进入家庭的“声音”的束缚。
在零售领域,在线超市集团 Ocado 已经将人工智能置于其新客户服务中心运营方式的核心——我们过去称之为仓库。该公司坚持认为,组装订单的时间已经从几个小时减少到几分钟。算法运行仓库以确保速度、准确性和质量——甚至确保西瓜不是放在一箱鸡蛋上面。人工智能平台不仅让 Ocado 有效地运营自己的业务:它还将该系统出售给了海外的其他零售商。
微小的进步,比如给现有产品添加一些人工智能,可能会帮助你保持竞争力。但它不太可能增加你的收入或利润,除非你是苹果公司推出具有面部识别功能的 iPhoneX,或者你可以模块化你的产品并为人工智能模块定价。
接触更广泛的客户群体
有远见的公司已经开始使用人工智能来服务以前被认为不值得为之烦恼的顾客。
以提供信贷为例。机器学习可以查看数据,如个人过去的购物习惯、公用事业账单和租金的支付情况,以建立他们可能的信用状况。有了这些信息,公司就可以决定是否发放贷款——即使相关人员过去没有信用记录。全球约有 17 亿成年人仍然没有银行账户。然而,需要特别注意隐私法和客户的同意和偏好;该行业正面临一些监管阻力。
同样,小企业在寻求信贷时也可以接受评估:人工智能可以查看从脸书、LinkedIn、易贝和 PayPal 等地收集的销量、客户评论和数据等信息,来衡量一家公司是否有可能支付账单。
从现有客户那里获得更多
人工智能现在已经接近实现大规模个性化。它可以将传统数据与从在线浏览、社交媒体和可穿戴设备等来源收集的客户行为详细信息结合起来。这样就可以在正确的时间提供正确的产品,传达正确的信息。麦肯锡估计,这种大规模个性化可以将销售额提高 10%或更多。
例如,在亚马逊,我们已经看到机器学习被用来向现有客户提出建议:他们会收到一个推荐的“下一个要购买的产品”。这些想法是通过查看您的人口统计资料、您过去购买的产品以及具有类似资料的客户购买的产品而产生的。一度,亚马逊约 30%的销售额来自其推荐引擎。
企业对企业的公司可以采取类似的策略,通过挖掘过去的订购模式,并将它们与销售给类似客户的情况进行比较。
不要忽视人工智能在减少客户流失和留住客户方面的潜力。机器学习可以查看客户登录的频率、他们对电子邮件的回复率以及他们致电服务台的频率等指标。然后,它可以估计客户转向竞争对手的可能性,并进行干预,以尽量减少取消订单的数量。
以网飞为例。如果花超过 60 到 90 秒的时间才能找到他们想看的东西,客户很可能会失去兴趣。通过使用个性化和推荐,该公司认为它节省了超过 10 亿美元(7.57 亿英镑)的收入,否则它会失去这些收入。
获得合适的价格
没有自然法则说每个顾客都应该为给定的产品或服务支付相同的价格——事实上,也没有理由说一个顾客每次购买给定的东西都应该支付相同的价格。
优步提供了一个最著名的可变价格的例子:当一个特定地区的需求相对于可用的司机数量而言很高时,乘车的价格就会上涨。
同样的想法也适用于无数其他行业。移动电话运营商正在尝试使用机器学习来预测需求,并衡量一小批消费者的价格敏感度。然后,他们可以利用这些信息来决定需求价格的取舍,以实现收入和盈利能力的最大化。
在 B2B 领域,公司可以使用数据科学来确定具有相似购买模式的客户群,识别相似的交易,并生成有关支付价格的信息。让销售人员掌握这些信息可以帮助他们在不损失业务的情况下谈判出尽可能好的价格。
提高销售效率
销售人员大约三分之二的时间用于日常工作,如与潜在客户联系、安排约会、接受订单和准备合同。公司已经开始将此类活动自动化,让销售人员有时间完成交易、培养关系和管理非同寻常的交易。
一个能够识别最有可能促成销售的线索的公司将比其竞争对手更有优势。公司正在使用人工智能的预测能力来确定最有希望的线索,并根据他们过去的销售历史将这些线索发送给最适合完成这些交易的销售人员。此外,公司正在使用人工智能记录、转录和分析销售电话、演示和会议。观察最成功的销售代表是如何引导对话的,有助于公司指导其他员工提高水平,获得更多交易。
让营销支出更有效
个性化现在是营销的核心。它可以在营销支出上获得巨大的回报。
但有远见的营销人员现在可以走得更远。分析顾客的行为仅仅是开始。现在,企业可以根据客户的行为、偏好和情感来确定营销目标,利用自然语言处理(NLP)技术创建情感智能的个性化内容,这种技术可以在所有营销渠道中大规模部署。全球银行花旗(Citi)聘用了营销语言云公司 Persado,其电子邮件“打开率”增加了 70%,点击率增加了 114%。
(本文原载于《伦敦商学院评论》。)
待关注:每个 CEO 都需要知道的人工智能知识。第二部分:资本回报率
每个 CEO 需要了解的人工智能知识。第二部分:退货
利用人工智能的力量可以帮助你提高生产力,改善预测和最大限度地提高效率
在推动增长的同时确保健康的资本回报是所有企业领导人面临的一个关键挑战。削减成本为实现这一目标提供了一条显而易见的途径。但营业利润的改善需要聪明且有粘性,才能持续并产生长期增长。人工智能可以提供一系列方法来提高生产率,改善预测,减少停机时间,并堵塞生产,供应链,采购,客户服务和行政管理费用的昂贵漏洞。
服务公司:提高效率
Blue Prism、Automation Anywhere、Pega 和 UiPath 等软件机器人执行日常任务,如访问应用程序、数据输入和计算。它们模仿人类所做的活动,所以遗留的 IT 系统不需要改变。
许多公司已经安装了软件机器人来实现快速节约。但在许多情况下,好处被证明是难以捉摸的。组织是围绕过程而不是任务构建的,而这些过程分布很广:它们是分散的。因此,组织面临着将任务自动化转化为节约的挑战。
那些成功抓住人工智能技术全部潜力的公司已经采取了一种全面的方法,而不是仅仅追求机器人技术。他们重新构想了流程和组织结构,并以集成的方式部署了多种技术,如机器学习和认知应用,以及机器人技术。对于这些公司来说,在流程简化和数字化的同时应用人工智能技术带来了巨大的节约——有时高达 30 %- 70%。如此规模的节约甚至使得将一些活动从离岸地点迁回成为可能。更快的流程改善了客户体验。
看看汽车保险索赔是如何处理的,这有力地说明了应用整套人工智能技术是如何产生影响的:
- 保险公司一直在使用光学字符识别(OCR)将手写索赔转换为机器可读数据。但是 OCR 并不总是准确的。现在,总部位于加州的 Captricity 公司使用其 Shreddr 技术,估计可以达到 99.9%以上的准确率。
- 机器人可以接管手动任务,例如通过验证申请人的身份创建第一份损失通知,搜索保单细节,输入损失损坏和维修估计信息,检查保单覆盖范围,上传照片并将其放入正确的评估队列。
- 计算机视觉可以帮助验证索赔。英国第三大汽车保险公司 Ageas 使用总部位于伦敦的 Tractable 公司的计算机视觉技术来加快维修成本的评估。Tractable 系统存储了数百万个碰撞修复图像和相应的修复估计值。因此 Ageas 可以每分钟检查数千个评估,并向其专家标记不必要的修复。
- 自然语言生成可用于编写叙述性报告,从索赔和维修中识别信息,然后详细说明趋势、解释和潜在的下一步行动。
制造企业:提高生产效率
在过去的二十年里,公司已经采用精益和自动化来减少浪费和提高效率。随着进一步的改进变得越来越难以实现,人工智能已经成为允许他们进入下一个生产力水平的白衣骑士。
- 将从工业机器收集数据的物联网(IoT)的进步与人工智能相结合,使公司能够减少资产停机时间。基于人工智能的算法监控设备层面的声音或热信号,以及维护日志和天气模式等其他数据。如果系统随后发现异常,它可以标记出维护需求,从而减少停机时间。Pitney Bowes 引入了通用电气的 Predix 系统,机器产量增加了 20%,零件更换节省了 15%,技术支持成本降低了 10%。
- 工人的生产率可以通过使用“协作”机器人来提高,这些机器人可以在无法完全自动化的工作中与人类工人一起操作。计算机视觉使机器人能够意识到周围的情况。人类工人只需握住机器人的手臂,引导机器人完成所需的动作,就能给机器人“编程”。仍然需要人,但是他或她的生产力大大提高了。
- 人工智能可以对能源消耗产生重大影响。一个突出的例子是谷歌的 DeepMind,它将谷歌用于冷却其数据中心的能源减少了 40%。算法查看温度、功率和泵速等方面的历史数据,以预测未来的温度,然后决定最大限度减少功耗的最佳设置。铝、水泥和造纸等能源密集型行业也可以采用类似的方法。
- 通过将计算机视觉与机器学习相结合来简化检测,更准确地检测异常并给出一致的结果,可以加快质量控制。有了好产品和有缺陷产品的图像,人工智能系统还可以识别以前未知的缺陷。
让供应链更加敏捷
机器学习和机器人技术已经允许零售、包装消费品和高科技行业的公司将其供应链转变为竞争优势的来源。公司正在使用人工智能来准确预测客户对大量不同商品的需求。然后,他们用灵活高效的供应来补充改进后的预测。他们有自动化的仓库流程,使用机器人进行拣选和包装;并使物资运输和交付能够响应实时信息,如天气预报和交通流量。
德国电子商务商家 Otto 现在可以以 90%的准确率预测未来 30 天内将出售的商品,每年减少五分之一的过剩库存和超过 200 万件商品的退货。算法不仅考虑历史销售,还考虑广告活动、商店开门时间、当地天气和节假日,以预测每个商店对各种产品的需求。
亚马逊使用 Kiva 机器人给站在平台上的工人送包裹。亚马逊将库存能力提高了 50%,运营成本降低了 20%。
以更低的成本增强客户服务
人工智能可以帮助公司满足客户对个性化服务和直接获得他们想要的东西的日益增长的期望。
- 减少传入的失败需求:当某样东西不能满足客户的需求时,他们可能会联系呼叫中心。找出问题所在既有助于避免重复缺点,又能减少对呼叫中心的需求。记录和分析客户来电可以找出投诉的根本原因。电话的精确转录变得越来越可能。谷歌、IBM 和微软的系统现在可以以大约 95%的准确率转录电话对话。使用自然语言处理和文本挖掘,可以对呼叫进行分析,以得出需求趋势和故障模式;然后,可以采取适当的行动。
- 减少打给呼叫中心代理的电话数量:模仿人类说话的在线聊天机器人已经被广泛使用。在银行业,聊天机器人全天候回答简单的查询,并帮助客户完成日常交易,如检查余额和支付。聊天机器人充当看门人,处理简单的任务,然后将他们无法处理的呼叫转移到呼叫中心代理。下一次发展将会看到聊天机器人与机器人配对,可以进行端到端的交易,例如注销被盗的信用卡并发行一张新的信用卡。
- 消除花在身份验证上的时间:呼叫中心平均花 30 到 45 秒来验证客户的身份。这相当于每年 1000 万次通话需要大约 10 万个小时。汇丰银行和花旗银行等银行已经部署了 Nuance 和 Nice 等公司的语音生物识别技术,以消除这种浪费的时间。该系统将呼叫者的声音与存储的声音签名进行比较。面部识别也正在成为一项可行的技术——尤其是在中国。许多中国银行允许用户在网上和自动取款机上仅通过面部识别身份。
- 加快处理呼叫:呼叫中心代理通常会在呼叫过程中和呼叫结束后,花费多达四分之一的时间访问不同的系统来查找和更新数据。简化的机器人桌面控制台允许自动填充或验证数据,可以大大节省代理的时间,使其专注于工作的其他方面。HMRC 推出了一种仪表板,将代理在通话中点击鼠标的次数从 66 次减少到 10 次。结果是:处理一个电话的平均时间减少了 40%。
- 代理人蔻驰:呼叫记录可以帮助呼叫中心代理人学习他们表现最好的同行的运作方式。随着聊天机器人越来越多地涵盖简单的查询,代理将被留下来处理复杂的查询。基于转录的辅导将帮助他们更顺利地过渡。提高产能利用率:呼叫中心可以使用 Random Forest 和脸书的 Prophet 等机器学习模型来准确预测呼叫中心的需求。提前六个月的准确预测将有助于呼叫中心做出更好的招聘和技能组合决策。提前一周的准确预测将有助于呼叫中心更好地安排代理。
削减采购成本
购买的商品和服务通常占产品成本的 60-80%。人工智能可以用信息和洞察力武装采购经理,以确保更好的交易。但许多公司的采购数据是不干净的,没有按照支出类别分类,分散在不同的系统中。然而,Coupa 软件使用机器学习来自动清理和分类信息。它声称已经分析了超过 1.3 万亿美元的支出。企业可以通过自动化订单管理(尤其是针对长尾支出的订单管理)来堵塞不合规和低效率导致的漏洞,从而进一步降低采购成本。典型的泄漏率为 3-4 %,相当于 60 亿英镑支出中的 1 . 8-2 . 4 亿英镑。
减少开销
使用人工智能来重新想象行政流程有着广阔的空间。想象一下,一个系统拍摄一张收据的照片,并使用光学字符识别来读取文本,然后由机器学习来识别金额、日期、货币和费用类型:把它们放在一起,它就可以创建一个费用条目。
吸引和留住人才
随着人力资源部门从传统的服务角色升级到战略业务合作伙伴的职责,他们可以从迈克尔·刘易斯的书《金钱球》中得到启示,获得关于人才的数据驱动的见解。
- 寻找潜在的高绩效者:具有前瞻性思维的人力资源团队正在利用数据科学来识别使某人成为高绩效者的特质,并定义可能在特定角色中表现出色的员工的特征。此外,人工智能可以强调高绩效员工来自哪里,并识别有前途的人才来源。
- 降低招聘成本和时间:早期采用者已经采用算法来加速筛选申请人的简历。算法可以识别最有可能被雇用的最合适的候选人,从而让专家专注于优先考虑的人才库。公司可以使用人工智能自动更新埋在候选人数据库中的数百万份简历,并从网上获取最新的工作历史。客户关系管理公司 Beamery 允许雇主在潜在候选人申请工作之前就与他们接洽。它的算法根据求职者的兴趣向他们提供内容、新闻和信息。该公司声称,其客户的合格候选人数量增加了两倍,招聘成本降低了一半以上。
- 减少流失:员工会在社交媒体上留下求职的痕迹。社交媒体元数据和历史人力资源数据可以帮助公司确定哪些员工最有可能辞职。然后,雇主可以想办法留住表现最好的员工。
(本文原载于《伦敦商学院评论》。)
待关注:每个 CEO 都需要知道的人工智能知识。第二部分:风险
脸书关闭数据经纪人的决定意味着什么
社交媒体可以说是近年来最重要的技术进步之一,帮助人们通过点击按钮与世界各地的亲人沟通。然而,近年来,随着脸书和其他社交媒体加大广告力度,试图将他们的服务货币化,用户已经提出了隐私问题。起初只是一些广告,现在已经变成了脸书和它的广告商全力以赴向你推销服务和产品。
随着社交媒体网站受到《观察家报》、《卫报》和其他媒体的负面报道,更多的争议随之而来,暴露了脸书与第三方数据经纪人的关系。Experian、TransUnion 和 Epsilon 等公司一直在从用户互动中收集信息,既有公开张贴在墙上的,也有私下通过邮件收集的。这些经纪人使用数据定位技术向用户销售产品,而脸书则不为所动,以保持强劲的收入流。然而,社交媒体网站在这样的报道之后改变了主意。
该网站表示,为了增加用户的隐私,它将关闭这些数据经纪人的广告定位方法。此举不会立即发生,但脸书表示将逐步取消这些被称为合作伙伴类别的做法。该公司表示,虽然这是行业惯例,但我们相信,这一步骤将在未来 6 个月内逐步结束,这将有助于改善脸书人们的隐私。许多人认为电视网的决定是积极的,将对整个行业产生深远的影响。
为了确定这些变化将如何影响依赖脸书及其第三方数据的公司,我联系了 Blinker ,这是一款允许人们完全通过智能手机自己购买、出售、融资和再融资汽车的应用程序。“我们已经收集了一个重要的 CRM 列表,因此随着脸书消除第三方数据源,Blinker 将进一步利用其现有的客户数据来创建我们可以锁定的定制受众群体。我们的长相相似的观众一直是表现最好的目标,所以我们预计我们的宣传策略或表现不会有太大变化。”Blinker 的营销副总裁安德鲁·普莱斯在一份书面声明中说。
以下是脸书决定改变其广告做法的后果:
1)增加隐私
自然地,用户会更舒服地使用社交媒体网站与朋友、家人和爱人讨论个人问题。脸书还表示,它将改变隐私设置,以便让用户更容易选择与谁分享他们的个人和专业信息。此举看起来像是一个在不泄露用户信息的情况下保持其用户连接网络的决定,尽管一些人认为该公司出于邪恶的原因将第三方数据经纪人从其网络中移除。
2)获得竞争优势
脸书可能只是对基于其做法而受到的媒体反弹做出反应,但也许该公司只是没有像它希望的那样赚钱。然而,这一决定可能是该公司试图从谷歌等竞争对手那里吸引用户的含蓄尝试,这些竞争对手仍在使用第三方数据经纪人。母公司 Alphabet 一直在使用这些做法,在 YouTube 和搜索引擎等各种数字渠道上向你宣传产品和服务,看起来脸书正在逆势而为。
3)制定行业标准
虽然脸书清理其行为的决定可能是一种公关举措或获得竞争优势的一种方式,但它可能会改变该行业的运作方式。谷歌等公司尚未讨论此事,但脸书的政策变化可能会带来一笔意外之财,即其他公司会清理自己的行为,以保持自己在行业中的高地位。其他社交媒体可能会很快效仿,而搜索引擎等科技领域的其他行业可能会在广告定位方法上变得更加专业化。
4)你仍然会看到广告
我们可能不会再收集你的个人数据和互动信息来向你发送广告,但脸书仍在与公司合作做广告。不同的是,社交媒体网站现在必须使用自己的目标工具,如“定制受众”,其中包括与他们希望销售的用户有事先关系的公司。脸书没有完全消除广告,而是找到了一个中间地带,既能改变公众对信息系统服务的看法,又不损害其底线。
5)政治起了作用
总统大选已经过去一年半了,脸书仍因未能删除网站上的假新闻和错误信息而备受指责。具有明显政治倾向的用户正在接收适用于他们的新闻——无论是真实的还是虚假的——而一些处于政治光谱边缘的人仍在接收错误信息,以这样或那样的方式影响他们。最近在脸书上发现了一个功能,它显示了对一条可能不可靠的新闻的警告,鼓励用户在相信媒体来源告诉他们的东西之前做自己的研究。将第三方广告经纪人从他们的文件夹中删除将允许网站消除发送给用户的错误信息,这些信息可能会影响他们对某个政党或候选人的看法。
底线…
脸书的决定在很多方面都是有意义的,因为它将提升自己的公众形象,让自己比竞争对手更有优势,同时还会向你发送一些广告,以保持收入流。随着时间的推移,用户会有更多的隐私,对在网站上分享数据会感到更舒服,而政治也会更客观,因为网络上的假新闻会更少。从长远来看,我们可能会将脸书的举动视为一个转折点,标志着从过度饱和的广告向更私人的在线体验的转变。
是什么让机器学习项目中的数据科学家感到沮丧?
Photo by Vance Osterhout on Unsplash
如今,人们对数据科学的兴趣激增。一个人只需要插入标语“由人工智能驱动”,任何东西都可以卖出去。
但是,这就是问题的开始。
数据科学的推销通常是异想天开。然后,客户将期望值提高一个档次,启动他们的登月计划。最终,把客户带到月球上,还是把他们留在荒岛上,都要由数据科学家来决定。
早先的一篇文章,数据科学家工作面试失败的 4 种方式研究了候选人在追求数据科学职业生涯时犯的主要错误。现在,我们走进数据科学项目期望的幻想世界,找出客户持有的最大误解。
在这里,我们将讨论我在机器学习项目中看到的 8 个最常见的神话,以及它们为什么会让数据科学家感到烦恼。如果你刚刚进入数据科学,或者已经成为主流,这些都是可能扔向你的潜在手榴弹。因此,知道如何处理它们会很方便。
“所有的模型都是错的,但有些是有用的。”—乔治·博克斯
Photo by Andre Hunter on Unsplash
误区一。“我们想要一个人工智能模型..造一个来解决这个问题”
分析领域的大多数行业问题都可以通过简单的探索性数据分析来解决。如果机器学习对这些来说是多余的,我们甚至不要开始讨论为什么人工智能在这里是无用的。为什么要用大炮打死一只苍蝇?
是的,高级分析很酷。每个企业都喜欢谈论成为行业中部署最新技术的第一人。而哪个厂商不想标榜一个 AI 项目呢?但是,人们需要教育客户,并找出真正保证 ML 军械库重型火炮的用例。对于所有其他需求,通过使用探索性数据分析、统计或其他此类久经考验的技术展示商业价值来说服客户。
“到目前为止,人工智能最大的危险是,人们过早地断定他们理解它。”—埃利泽·尤德科夫斯基
误区二。“拿着这个数据..并带着变革性的见解回来”
通常,客户认为他们的责任到移交数据就结束了。有些甚至停留在问题定义上,但是我们将在第 4 点看到这一点!他们要求分析师获取数据,并带回一套惊天动地的商业见解,这将在一夜之间改变组织。
不幸的是,与创造性写作不同,人们不能孤立地想出可行的商业建议。它要求与业务用户就什么对他们是相关的和可行的进行持续的迭代和富有成效的对话。在整个项目中,定期与业务人员一起计划优质时间。
“如果你不知道如何问正确的问题,你将一无所获。爱德华·戴明
误区三。“构建模型,通过跳过不必要的分析来节省时间”
许多数据科学家忽视了在打开模型工具箱之前进行数据辩论和探索性分析的重要性。因此,当客户要求从关键路径中删除*【不必要的分析】*以节省宝贵的项目时间时,他们看不到风险。
数据探索和分析是机器学习和所有其他高级技术的强制性先决步骤。没有对数据的感觉,发现异常值或发现潜在模式,模型除了在黑暗中拍摄什么也不做。总是指定时间进行分析,并通过分享有趣的发现来说服客户。
*炼金术士在寻找黄金的过程中发现了许多其他更有价值的东西。——*亚瑟·叔本华
误区四。“我们有上周的数据,你能预测未来 6 个月吗?”
这是数据科学家最讨厌的事情。客户在电子表格中拼凑几行数据。然后,他们希望人工智能能像水晶球一样凝视未来。有时,当客户承认没有任何数据,然后真正想知道机器学习是否可以填补空白时,这变得非常奇怪。
数据质量和数量是不容讨价还价的。*“垃圾进垃圾出”*同样适用于分析。当你的数据有限时,统计技术会派上用场,当你的数据更少时,它们会帮助你提取更多的数据。例如,估算缺失点, smote 生成数据或使用更简单的低容量模型。但是这需要降低客户对模型结果和项目成果的期望。
Performance of analytics techniques with data volume: Source Andrew Ng
误区五。"你能在两周内完成建模项目吗?"
在任何业务关键型项目中,结果都是在昨天就可以预期的,即使项目启动是在今天计划的。在匆忙破坏项目时间表的过程中,一个常见的损失就是模型工程阶段。随着模型 API 的免费提供和对 GPU 计算的轻松访问,客户想知道是什么减慢了数据科学家的速度。
尽管 Auto-ML 有所进步,但是在建模过程中有一个不可缺少的手工元素。数据科学家必须检查统计结果、比较模型和检查解释,通常需要经历痛苦的迭代。这是无法自动完成的。至少,现在还没有。最好通过分享示例和说明如果跳过某些步骤可能会遗漏什么来启发客户关于数据科学生命周期的知识。
建模一部分是实验,一部分是艺术,所以里程碑驱动的项目计划可能不会太精确。
误区六。"你能替换结果变量并点击刷新吗?"
在数据科学家解决了业务行为建模的问题后,新的客户请求经常会以增量变化的形式出现。有时,他们会要求替换结果变量,并通过重新运行模型来快速刷新结果。客户没有意识到这种变化不仅仅是移动球门柱,而是将比赛从足球转换到篮球。
虽然机器学习是高度迭代的,但核心挑战是为给定的结果变量挑选正确的影响者,并映射他们的关系。客户必须事先了解这是如何运作的,以及他们可以自由使用的杠杆。他们还必须注意那些需要预先仔细规划的参数,以及如果这些参数的变化超出了定义的里程碑,将会发生什么情况。
神话 7。“我们能有 100%的模型准确率吗?”
人们经常被错误率所困扰。就像盲目追求考试成绩一样,客户希望准确率接近 100%。当准确性成为压倒所有其他因素的唯一焦点时,这变得令人担忧。建立一个复杂到无法实时制作的高度精确的模型有多大用处?
以最高精度赢得百万美元网飞奖的模型从未上线,因为它的极端复杂性意味着沉重的工程成本。而精度较低的型号采用了。始终平衡准确性与简单性、稳定性和业务可解释性。这需要果断的权衡和判断,信任客户。
Model Engineering: Achieving the fine balance and trade-off
误区八。“训练出来的模型能永远保持聪明吗?”
在投入大量精力进行模型构建和测试后,客户想知道机器是否已经学会了它所需要的一切。一个常见的问题是,它能否保持智能,适应业务动态的所有未来变化?
可惜机器不是终身学习的。模型需要不断耐心的教导。他们需要每隔几周或几个月快速复习一次,就像学校里那些努力学习的学生一样。当环境改变时,更是如此。这就是分析行业目前的状况,尽管它在快速发展。所以,现在,为模型维护和病人更新做时间和精力的预算。
结论
我们已经看到了项目中的 8 个主要误解,这些误解也可以分为 ML 建模生命周期的 6 个阶段,如下所示。
Machine learning project lifecycle
几乎所有的上述误解都是由于缺乏意识和项目中的优先级错位造成的。毕竟,每个客户和企业都是在严格的时间表、紧张的预算和不那么完美的数据流下进行团队合作的。数据科学家应该能够与客户产生共鸣,理解这些脱节的真正原因。这将使他们能够教育利益相关者,并提供实例来阐明他们的观点。
数据科学团队应该采取温和刺激和友好权衡的结合。他们应该做出不影响项目最终结果的决定。祝你在下一次机器学习项目中处理这些常见问题时好运!
这里还有没有列出其他的误解?请在下面留下您的评论,继续对话。
如果你觉得这很有趣,你可能想看看我写的其他相关文章:
对数据科学充满热情?随时在LinkedIn上加我,订阅我的 简讯 。
在数据科学领域找一份工作会是什么样子
备选标题:我的人生故事:)
我读过一些文章,这些文章阐述了进入分析和数据科学领域有多难。这不是我的经历,所以我想分享一下。我们将看看面试,我目前使用的工具,我在学校没有准备好的行业,以及我的职业轨迹是什么样子的。但不是按那个特定的顺序。
在我们开始之前,快速回顾一下我的教育可能是有意义的!
2004 年——获得了麻省理工学院达特茅斯分校的数学学士学位
- 我的专业平均成绩为 3.8 分
- 在那里学了 FORTRAN(不擅长)
- 没有实习
- 我热爱数学,热爱我在学校的时光
老实说,2004-2007 年没什么值得注意的。我在“寻找自我”,或者别的什么。
2007 年——开始在 WPI 兼职统计学硕士,同时为考德威尔银行家房地产经纪公司工作。
- “房地产泡沫”破裂(大衰退的开始),与此同时,我很幸运地获得了 WPI 的助教职位。
- 搬到伍斯特,完成了我的全日制硕士学位(2010 年毕业)
- 在课堂上使用 SAS & R
- 仍然没有实习机会(经济不景气,我还没有学会很多找工作、建立关系网的知识,也没有利用职业中心)
- 我想在社区大学教书,但是两位教授问我是否有兴趣去当地的公用事业公司面试(而那家公司刚好离我父母家 3 英里)。
我在那家公司面试并接受了那份工作。
我毕业后的第一份行业工作是 NSTAR(现在是 Eversource),我是一名预测分析师,使用计量经济学时间序列分析来预测天然气和电力负荷(阅读——我们需要多少天然气和电力来服务客户)。
我每天都在构建 ARIMA 模型,使用各种统计测试来测试数据中的结构突变,单位根测试来测试平稳性,我写了一个证明来解释为什么我选择的值大于 1 的 t-stats(即使 p 值可能是 0.2)有利于模型的预测。
我建立了很酷的神经网络来预测每小时的电力负荷。这种方法很有意义,因为电力负荷和天气之间存在非线性关系。模型结果非常好,并被用来决定如何在预计需要高负载的日子里满足容量。
这是我第一次了解到,一旦你完成了一个人们关心的项目,你很可能会写一套解释问题和结果的材料..然后你去“巡回演出”。也就是说,我制作了 PowerPoint 幻灯片,并向其他团队展示了我的作品。我的第一个幻灯片不是很好。我花了多年的经验才达到这样一个地步,现在我认为我的套牌在视觉上很吸引人,适合我演讲的观众(有正确的信息“水平”),而且引人入胜。
在 NSTAR 我也用了一点 SAS。这是以重新运行他人先前编写的代码的形式。它有时也涉及到稍微修改别人写的代码,我肯定不会认为这是一项密集的工作。更像是“SAS 按键”。
我每天构建的模型都是在“点击”软件中构建的。
到目前为止,NSTAR 是我最“统计”的工作,但是时间序列只是统计世界中的一小部分。我想拓展我的视野,并了解到在分析领域有大量的机会…
我其余职位的快速概述:
silver link communication s 分析顾问
- 提供市场研究、细分、研究海报和宣传活动,旨在支持管理式医疗机构(mco)、药房福利经理(pbm)和疾病管理(DM)客户。
vista print 分析经理
- Vistaprint 在网上销售名片和其他营销产品。他们的主要客户群是小企业。
- 管理一个分析师团队来优化 Vistaprint 网站。
- 担任过许多其他角色,并在分析领域从事大量不同的项目
资深数据科学家,常接触
- Contant Contact 提供电子邮件营销解决方案。也是电子商务,也针对小企业。
两个月来我一直保持联系。我的第一个目标是:
- 检查已经存在的模型的有效性
- 改进他们目前的测试方式。然后自动化!
- 试图在客户群中识别季节性客户。
- 学习很多新东西!
关于标题的说明:
标题很棘手。一个头衔可能听起来很时髦,报酬也不高,有时一个较低的头衔可能会比你预期的报酬更高!
随着将数据用于商业目的变得越来越流行,人们对某个职位通常包含哪些角色、职责和技能更加困惑。探索你所有的选择!你可以在许多不同的网站上查看职位的平均工资。
我使用的工具(从最基础的开始):
我去过的地方都用过 Excel。做以下事情的能力:
- 数据透视表
- 垂直查找
- 使用“记录”按钮编写一个简单的宏来自动执行一些数据操作
- 这些类型的东西可以让你看起来像一个其他领域的商业奇才。(没说是对的,只是说事情就是这样)
- 在我的职业生涯中,我一直使用这些东西。
随着数据变得越来越大,公司开始走向 **Tableau。**我自己对它还不熟悉,但它让我不用看着一份 Excel 文档花很长时间保存。我认为等待大型 Excel 文件的日子已经成为过去。
- 对于 Excel 来说,数据很快变得太大,我发现任何高于 400k 行(多列)的数据都变得很难操作。
- 漂亮的可视化,可以是交互式的,快速的,点击式的。
Screenshot of Analysis in Tableau
- Tableau 还可以直接从 SQL(一个. csv 和一堆其他格式)中获取数据。
SQL 中数据科学工作的真正核心。我认为没有人会反驳这一点。
在学校,大部分数据都以一种很好的形式给了我,我所要做的就是分析和建模。在工业中,在 100 或 1000 个不同的表中有数百万行。需要使用相关标准从相关表格中收集这些数据。大多数时候,您将操作 SQL 中的数据,使其变成您非常熟悉的漂亮/可用的形式。这是一个时间密集型的过程,你会开始意识到,在你用 R 或 Python 写一行代码之前,你工作的很大一部分就是决定你需要什么数据,找到数据,转换数据使之适合建模。
我在工业界的前 3 份工作都涉及到 SQL,而我只做过 4 份工作。
你可以直接从 SQL 中提取数据到 Excel 或 R 或 Python 或 Tableau 中,这个列表还在继续..
SQL 有许多不同的“风格”。如果你知道一个,你可以学习其他任何一个。过去,我曾被列出 AP 或其他变体的招聘信息吓到。语法上可能会有细微的差别,但它们实际上只是要求你了解 SQL。不要被吓倒!
下面是一个简单查询的例子。我选择了一些 id、月份、年份,以及基于“where”语句中给定标准的变量“sends”的计数。该查询还显示了一对表连接,用“join”表示,然后我给出了连接的条件。
SQL has been invaluable in my career. Couldn’t live without it
一旦您理解了 SQL,转向大数据就不那么困难了。使用 Hive(在工作描述中看起来也很吓人),很像 SQL(加上一些您可能需要处理的嵌套数据),您可以从 Hadoop 中查询数据。
我使用命令行来访问 Hive,但是很好的 ui 已经出来了。如果你仔细看,你会看到我的查询只是“从联系人限制 1 中选择 account _ id,只说“给我一个联系人表中的 account_id”,它看起来就像 SQL。
At the time of this screenshot, I had just kicked off this query. Because there is so much data. It may take over a minute to get me 1 account id from this table
当我获得统计学硕士学位时,每个人都在使用 r。甚至一些统计学家现在也在转向 Python。以前,我所有的建模都是在 R 中进行的,但是我自己正在测试 Python waters!
我在 Coursera 自学了 Python,目前正在我的新工作中使用。这就是互联网的美妙之处。想学一个新工具?去学吧,资料唾手可得。
下面是我在 JupyterLab 中的 Python 代码的一个例子。这是全新的,而且我的截图并没有做到这一点。你可以在这里阅读更多关于木星实验室的信息:木星实验室
This is what JupyterLab looks like. Although I don’t have any pretty charts here (sorry), I’m just working on a little Quality Control problem.
一个的小纸条。我把我上过的课程放在 LinkedIn 的“成就”下面。这是个不错的主意。
关于工业我不知道的事情:
你可能会有一些旅行的机会——目的地的乐趣会有所不同
- 我去过拉斯维加斯、奥兰多、巴塞罗那、温莎安大略、新泽西州和马里兰州工作。
通常会有个人发展预算
- 一本你想读的相关的书?你可能会花掉它。
- Coursera 上有相关的课程吗?你可能会花掉它。
- 他们有时会送你去参加会议 ——我在 3 月 21 日参加了 Jupyter 弹出窗口,我将参加 5 月份的开放数据科学大会。
- 不要羞于问你的老板是否有预算。对大多数人来说,看起来你很关心自己的事业,并对其进行了投资!
裁员是一件事。我最近才了解到这个第一手资料。我的经历很棒。
Vistaprint 决定裁员 2000 万美元(182 人)。
- 我得到了一份相当丰厚的遣散费。
- 小费!可以同时领取失业和遣散费!
这是我多年来第一次有机会真正思考文化和方向,并真正思考我的下一步行动。
Vistaprint 支付了一个职业蔻驰帮助我:
- 简历(他们更新了我的内容和格式)。
- 求职信提示(描述如下)
- 建立工作关系网
- 采访
- 谈判!
我从来没有见过这种风格的求职信,但它有惊人的回复率!
I literally took the requirements from the job and pasted them on the left. Then took my qualifications from my resume and posted them on the right. Took less than 15 minutes for each cover letter.
采访
我从教练那里学到的最大收获和我自己面试数据科学家职位的经历是…
以星形格式练习回答问题。 www.vawizard.org/wiz-pdf/STA…
在一个电话屏幕上(和克罗诺斯在一起),我被问到所有我已经准备好的问题:
- 告诉我你向非技术观众解释技术结果的一次经历?
- 告诉我你改进流程的一次经历?
- 告诉我一个与难相处的利益相关者一起工作的例子,以及它是如何解决的?
连续两天,和不同的公司(其中一家是 Spotify),我被要求回答 FizzBuzz。
- 做好准备应对初级编码问题或 SQL 问题,这是工作描述中要求的技能之一。
- rprogramming.net/fizz-buzz-i…
准备以面试你的人(可能没什么背景)能够理解的方式谈论你的一个项目。高水平,注重结果。说真的,在你开始谈论这个项目之前,先描述一下目标是什么,很容易一头扎进某样东西,却意识不到对方根本不知道你在说什么。
我真的可以一直谈论上面列出的话题,但我想简要概述一下我的一些不同经历。也许我稍后需要详细说明。
谢谢你看了我的经历。我希望你在进入数据科学领域的道路上取得巨大成功。当你到了那里,我希望你会觉得很充实。我知道。
访问我的网站!这里
报名接收我的新文章:这里
Tensorflow Dev Summit 2017 上发生了什么-第 1/3 部分:社区和应用
TL;速度三角形定位法(dead reckoning)
2017 年 2 月 15 日,人工神经网络软件框架 tensor flow1.0 版本在加州山景城的谷歌 TensorFlow Dev 峰会上发布。
活动期间,在项目的四个不同领域进行了演示和公告:社区、应用、部署策略、工具和技术。这次活动是现场直播的,所有的视频都可以在网上看到。
通过这一系列的帖子,我将重点介绍最有趣的部分,并就活动期间涉及的主题给出实用的建议。
社区
传奇人物杰夫·迪恩给我们讲述了这个项目的故事,拉开了峰会的序幕。Tensorflow 并不是谷歌大脑团队创建通用机器学习框架的第一次尝试。之前关闭的源代码项目被称为 DistBelief 。
Tensorflow 于 2015 年 11 月开源,从其公开发布开始,谷歌内部和社区的采用情况令人印象深刻。
在一年多一点的时间里,开源 Github 库成为了“机器学习”类别中的第一名,拥有超过 44,000 颗星,500 名程序员开发并提交了他们的软件,每月提交数千份,5500 个名为 Tensorflow 的独立库现在出现在 Github 上。各大高校已经开始使用 TensorFlow 教授机器学习。
许多公司也支持这个项目。IBM、 Movidius 和高通正与谷歌合作,全力支持 Tensorflow 平台的硬件加速。来自高通的 Travis Lanier 展示了 tensorflow 的 InceptionV3 模型在Hexagon DSP上运行时的 8 倍性能(114.495 毫秒对 1968.753 毫秒或其他指标 8.7 帧每秒对 0.5 帧每秒),同样在对移动设备至关重要的功效方面。
Jeff Dean 说 Tensorflow 是为每个人准备的,我们鼓励每个人使用它,并把他们的想法变成现实。
有趣的是,围绕这个项目的社区发展得如此之快。峰会会场挤满了来自不同公司、城市和背景的与会者。该活动是现场直播的,世界各地的许多 Tensorflow 社区,如纽约、马德里、阿姆斯特丹、开罗、吉隆坡和其他各种城市,组织了当地聚会来现场观看该活动。
但是为什么这么感兴趣呢?用 Tensorflow 可以做什么?做了什么?
应用程序
峰会期间有许多应用程序,如著名的日本黄瓜分类农场,其中通过形状选择黄瓜的过程由所有者手动执行,直到他们的儿子使用 Tensorflow、相机和树莓皮创建了一个自动分类器。
检测黄瓜的形状听起来很有趣,也很实用,但是我们还能检测什么呢?
Lily Peng 医学博士、博士兼谷歌研究院产品经理研究并开发了一种检测糖尿病视网膜病变的工具。这种疾病是世界上导致失明的主要原因之一。如果及时发现,它是可以治疗的,但在世界上的一些地方,如印度,缺乏眼科医生,45%的患者在能够接受诊断之前就遭受视力下降。
该网络在由 54 名眼科医生标记的 130,000 幅图像上进行训练,生成 880,000 幅标记图像的数据集。
她强调,工作的重点不再是机器学习部分,他们在预先训练的数据集上使用重新训练的、众所周知的架构,并将工作更多地转移到理解问题、获取数据和构建工具来优化这一过程。
Nature cover and article
使用 Tensorflow, Brett Kuprel 展示了他如何训练一个神经网络来检测皮肤癌,其表现优于一般的皮肤医生。发表在《自然》上的研究登上了封面。使用 Inception V3 模型训练神经网络,在 129K 个图像的数据集上进行迁移学习,其中约 2K 个图像是疾病(707 个癌,225 个黑色素瘤+ 1010 个黑色素瘤皮肤镜检查)。
How 20 Doctors classified around 100 images
一个有趣的方面是算法性能与所选皮肤科医生的比较。首先,这 20 名医生只分类了大约 100 张图像,(正如 Brett 评论的那样,他们有比分类成千上万张图像更好的事情要做),其次,与机器(蓝线)相比,他们的性能是可变的(图中的红点)。
这项皮肤癌研究并不是第一次获得《自然》杂志的封面,谷歌 Deepmind 的另外两项技术过去也获得过。
Nature front page of deep learning algorithms
第一期和第二期《自然》封面由谷歌的 Deepmind 获得。第一场展示了 DQN,第二场展示了 AlphaGo,这是一个神经网络,能够击败人类世界冠军之一。
Deepmind 的研究工程师 Daniel Visertin 表示,Tensorflow 是实现的关键,因为训练这种神经网络的过程非常复杂。Deepmind 于 2016 年 4 月宣布全面采用 tensor flow。
AlphaGo 使用强化学习的理论来决定在特定状态下可能的行动中的最佳移动。这一决策过程也可以应用于其他场景,如通过调节冷却系统来优化数据中心的能源消耗。
Cooling System of Google’s Datacenter
建模是在模拟器中离线完成的,以确保算法不会开始尝试随机的事情,并可能摧毁数十亿美元的数据中心。该模型不仅使用可用的数据,而且还进行一些探索性分析,以便可以从人类操作员的基线进行改进。探索性分析对于找到更好的策略是很重要的(否则只会有操作人员已经在做的事情)。
Graph of the energy effectiveness after activating the model.
在初步研究和实施之后,该系统被打开,显示出电力使用效率 (PUE)的明显下降,导致数据中心的账单减少了 40%。
保持时间序列的主题,Deepmind 的另一大成就是创造了 Wavenet 。这种神经网络可以以前所未有的精确度将文本转换成语音和音乐。这个网络改变了以前在文本到语音合成中使用的范例,从使用预先录制的语音片段的连接/参数方法到直接产生声波的*。使用【MOS】**(*MOS 是主观声音质量测试的标准衡量标准),结果清楚地显示了性能的提高。
这个神经网络也能够生成完整的音乐波形!这些只是 Deepmind 团队在 2016 年取得的众多成果中的几个精选例子。
音乐和艺术生成的主题非常有趣,Tensorflow 有一个完整的项目致力于让所有艺术家都可以使用这项技术:Magenta 项目。
Magenta 是由谷歌大脑的研究科学家道格拉斯·埃克创造的,他回答了一个问题:深度学习和深度强化学习能否产生像音乐和艺术一样引人注目的媒体?
The Art exhibition by Mike Tyka that was installed at the event is an example of generative art.
谷歌大脑团队还通过他们的学习艺术风格的表现例子,设法改进了艺术风格的原始神经算法。虽然第一项工作发现了如何教会单个神经网络如何将风格从单个绘画转移到单个图片,但这项工作能够训练一个新的神经网络,它能够学习并同时应用一组不同的风格。
Tensorflow 对计算机视觉的另一个创造性应用是图像修复,卷积神经网络被训练生成任意图像区域的内容。图像的一部分被移除,并且神经网络能够从可用的环境中重建缺失的部分。
这种输入的概念也可以应用于音乐,给定一组乐曲的音轨,神经网络可以以与歌曲其余部分合拍的方式填充空白部分。
Example of counterpoint generation from music context
神经网络可以诊断皮肤癌,可以玩游戏,可以管理数据中心,可以说话,甚至可以播放音乐。那为什么不自己编程呢?我们当然有这方面的神经网络!
学习用梯度下降法学习用梯度下降法学习和用强化学习的神经架构搜索是神经网络自身产生和改进神经网络的两个例子。
这里的想法是使用 AlphaGo 中相同的决策原则,但不是进行游戏移动,而是网络试图决定在定义神经网络的操作序列中使用什么数学函数。
神经架构搜索神经网络生成了一个名为 NASCell 的新细胞,它优于之前所有人类生成的细胞,以至于已经可以在 Tensorflow 中使用。神经网络的这种特殊应用真正引起了我的兴趣和兴奋,因为每次神经网络优化技术有所改进所有的神经网络都会立即改进*,创建那些指数反馈循环,最终导致更接近“真正”人工智能预期的系统。*
第一部分的结论
这是第一部分的结尾。我们讨论了 Tensorflow 项目的两个方面:社区和应用。在第 2 部分中,我将介绍工具和技术,在第 3 部分中,我将回顾部署策略。
这篇文章故意写得有点高,非专业读者也可以阅读。在接下来的文章中,我将更多地讨论框架的内部结构以及如何使用这些工具,看到更多的代码片段,可能还会展示一些操作视频。
如果你喜欢这篇文章,你想知道下一部分什么时候出来,请在 medium 和 twitter 上关注我,不要忘记分享这篇文章:)
保持饥饿,保持愚蠢,保持关注
关于数据科学,什么样的纸牌屋是正确的(和错误的)
鉴于最近发布的两部 《纸牌屋》第五季预告片和即将发布的值得狂欢的《T4》网飞系列第五季,这是做两件事的绝佳机会:
- 观看(或重新观看!)立即串联。
- 回顾一下《纸牌屋》第四季如何使用数据科学家,以及他的工作如何很好地反映了现实世界的数据科学。
剧透预告: 本帖包括《纸牌屋》第四季之前的剧透。如果你还没有看完第四季,我建议就此打住。
快速回顾:
在第三季和第四季中,弗朗西斯·安德伍德(凯文·史派西饰)是美国总统。他和妻子克莱尔·安德伍德(罗宾·怀特饰)分别以总统和副总统的身份竞选 2016 年总统大选。他们聘请琳恩·哈维(内芙·坎贝尔饰)担任竞选经理,负责监督和管理他们的总统竞选活动。她聘请艾丹·麦卡伦(达米安·杨饰)担任竞选活动的数据科学家,他的工作是收集选民的数据和信息,以便做出更好的竞选决策。
你可以在这里 找到第 1-4 季 更详细的总结。
小组讨论
总统的幕僚长道格·斯坦普(Doug Stamper)认为,安德伍德总统选择他的妻子作为竞选伙伴将会是竞选的一场灾难。即将成为竞选经理的 Leann Harvey 反对他使用焦点小组作为证据:
丽安:你做了一些民意调查,那又怎么样?
道格:焦点小组也是。
丽安:毫无意义。
《纸牌屋》做对了什么:焦点小组通常由 30 人组成,他们坐在一个房间里,被问及对一个人、一个想法或刚刚看完的一个广告的感受。Leann 是正确的,焦点小组并不能很好地反映人们会如何投票;如果我们对 30 名随机投票者进行投票,该投票的误差率将高达 18% 。(相比之下,美国大多数总统民调的误差率在 4%左右。)18%的误差率意味着你的选举预测将非常不精确。例如,一项民意调查显示 60%的人会投票给克林顿,误差率为 18%,这意味着美国人投票给克林顿的“真实比例”估计在 42%到 78%之间!用一个焦点小组作为证据来证明为什么克莱尔会成为一个好的或坏的副总统候选人,嗯,有点傻,不是一个好主意。
此外,焦点小组包括参与者之间的讨论。在这些讨论中,人们经常改变他们的想法或说出一个在群体中似乎受欢迎的观点,即使他们实际上并没有这样的感觉。心理学家 Solomon Asch 对这个想法进行了一项臭名昭著的研究。如果你以前在美国投过票,你就会知道你是独自去投票站,在没有其他人压力的情况下做出决定的。这表明焦点小组没有提供选举结果的准确估计——因为他们没有反映我们实际投票的情况!
《纸牌屋》出了什么问题:正如 Leann 所说,尽管焦点小组对选举结果既不提供准确的估计,也不提供精确的估计,但这并不意味着它们完全没有意义。焦点小组通常用于定性研究:例如,人们如何感知信息或人们如何对他人的意见做出反应。听取焦点小组成员对他们刚刚观看的广告的反应,可以洞察例如一个家庭或一群朋友如果在家观看广告可能会有什么反应。理解参与者反应的言辞和想法对营销人员或政治家来说是非常宝贵的。
Ken Bone, American hero and global meme.
监督学习
**背景:**数据科学家 Aidan Macallan 和活动经理 Leann Harvey 在一家爵士乐俱乐部会面,背景音乐是表演者的演奏。Leann 想知道安德伍德夫妇需要做些什么才能赢得更多的选票,但 Aidan 还没有找到任何答案。
Leann:“我们给了你权限——我需要的比我们得到的更多。你应该告诉我人们想要什么。”
艾丹:“直到第一次听到爵士乐,人们才知道他们想要爵士乐。我可以让他们喜欢这音乐——我不会作曲。给我一些我可以用的东西。”
Claire Underwood discovering “beyond” in South Dakota.
正如 Aidan 和 Leann 讨论的那样,Aidan 没有能力为 Underwoods 在竞选中说些什么……但是一旦 Frank 和 Claire 说了一些能引起选民共鸣的话,Aidan 就能抓住选民的情绪,鼓励 Underwoods 一遍又一遍地说。艾登发现克莱尔在南达科他州的一次演讲中使用了“超越”这个词,开始让选民转向安德伍德一家。然后他们尽可能频繁地使用“超越”这个词——交谈
**纸牌屋做对了什么:**数据科学不是魔法。在现实世界中,如果我们想测试一个政治广告是否会使选民转向一个方向,首先必须有人制作这个广告, ,然后 ,我们可以运行一个实验来测试它。这不仅限于政治。实验(在非学术环境中通常称为 A/B 测试)在许多领域都很常见,包括临床试验、网站布局以及电子邮件营销活动。
在没有观察到选民更有可能投票给你的任何情况下,预测会导致选民投票给你的情况是可以理解的困难。艾丹的观点是,他无法预测选民会开始改变主意的情况,但一旦他观察到选民改变主意,他就能确定为什么会发生这种情况。(在数据科学中,我们使用术语监督学习来指代类似这样的情况,我们已经观察到一些输出,如增加的投票者认可。)
虽然“超越”这个词对于选民“想听的”来说可能是一个奇怪的选择,但 2016 年美国总统大选中有许多词可能有助于打动选民。想想唐纳德·特朗普给那些反对他的人起的绰号:
- 说谎的泰德(克鲁兹)
- 小马可(卢比奥)
- 高飞·伊丽莎白·沃伦
- 弯曲的希拉里(克林顿)
- 低能杰布(布什)
知道哪些词语会对选民产生影响对竞选公职的人来说是无价的。
**什么纸牌屋出了问题:**数据科学家可以在这个问题上取得进展,而不需要一个特别好的广告或短语。想想超级碗广告中的常见主题——狗、情感诉求和政治主题似乎是谈论最多的广告主题。数据科学家可以使用像回归这样的机器学习技术来查看什么产生了最多的流量,即使他们还不能检测出什么会导致选民以特定的方式投票。类似地,数据科学家可以观察现有的政治广告,试图区分什么是“好”广告,什么是“坏”广告。
使聚集
**背景:**数据科学家艾丹·麦卡伦(Aidan Macallan)正在推销他的分析公司,以赢得一份美国国家安全局的合同,该合同监控所有美国人的手机,以识别和跟踪潜在的恐怖分子。(然而,安德伍德夫妇希望利用这些数据来确保他们赢得选举。)
What data scientists do when their code is running.
艾丹:以枪支为例。如果我们从每个合法拥有枪支的人开始,通过他们的手机追踪地理定位模式,我们就开始描绘出枪支拥有者的生活、饮食、购物等一切。由此,我们预测了每个可能想要枪支但没有登记的人。他们可能会表现出和正常人一样的行为。你可以用它来帮助那些对阿拉伯语感兴趣的人,那些想去中东旅行的人,那些对美国政府失望的人。
《纸牌屋》做对了什么:数据科学家确实可以使用技术来找到符合某一类别的个人。在缺乏“拥有枪支”和“绝对不想拥有枪支”这两个类别的实际数据的情况下,数据科学家可能会使用聚类分析来识别不同的选民群体,了解枪支所有者倾向于在哪里生活、吃饭和购物,然后开始关注那些在相同地方生活、吃饭和购物但没有枪支的人。聚类分析包括查看数据,并通过观察看起来彼此“接近”的观察结果或个人来识别组。一个经常被引用的聚类分析的真实例子是,Target 的统计学家在一个女孩的父亲知道她怀孕之前就知道她怀孕了,因为她的购物习惯与其他孕妇相匹配(理解为“接近”)。
**什么纸牌屋出了问题:**某人把手机放在哪里——也就是艾丹提到的地理定位模式——并不是数据科学家进行预测的唯一方法。事实上,目标怀孕预测模型是基于购物习惯。数据科学家将经常使用购买历史和人口统计信息等变量来组织消费者、投票者,甚至基于他们的“相似”程度来组织字体。一个很酷的例子是Ideo设计的这个字体地图,它依靠人工智能来直观地布局不同字体有多相似。
Credit to Joseph Nelson for putting this GIF (pronounced “jif”) together.
结论
总而言之,《纸牌屋》在展现最佳数据科学实践方面做得很好。该节目的编剧没有将数据科学视为解决故事的杀手锏。老实说,“纸牌屋出了什么错”主要是为了更完整地描述数据科学是如何运作的,而不是展示者的错误陈述。对于一个组织来说,这并不奇怪,因为它不仅雇佣了数据科学家,还举办了一场挑战,利用数据科学来改进推荐算法。
我的意思是,即使是克莱尔·安德伍德也知道价值观是怎么回事。
Ba-dum-tiss.
感谢约瑟夫·尼尔森、劳拉·李波芙和丽贝卡·路易的编辑,这篇文章有了很大的改进!
我从 Udacity 自动驾驶汽车纳米学位项目第一学期学到的东西。
我叫哈迪·阿布·斯内赫,来自约旦安曼。我曾在德国约旦大学学习机电一体化工程。我决定接受挑战,参加 Udacity 自动驾驶汽车项目。在德国生活了一年半之后,促使我寻找替代方案,并思考解决我们在约旦遇到的事故和驾驶心态的方法。在这篇文章中,我将简要说明我的项目是关于什么的,以及我在第一学期学到了什么。
**注意:**所有代码都是用 Python 编程语言编写的,使用了一些有用的库,如 OpenCV。
项目 1:寻找道路上的车道线:
第一个项目是机器视觉和基本图像处理方法的基本介绍。这个项目的目的是使用基本算法检测视频中的车道线。这个项目的目标是提供对图像处理和计算机视觉中使用的重要算法和方法的良好理解,例如:
- Canny 边缘检测:这是一种用于检测图像边缘的算法。有关此方法的更多信息,请点击 此处 。
- 区域屏蔽:该函数用于拟合多项式,屏蔽图像中不需要的部分,以便只显示感兴趣的区域(ROI)。例如:
Unmasked image on the left vs. the ROI image on the right
3.霍夫空间(Hough space ):通常,在图像空间中绘制图像,将图像上的每个点表示为 X 对 1962 年,Paul hough 发现了一种表示图像的新方法。新的空间被称为霍夫空间,其以笛卡尔形式用 m 对 b 或者以极坐标形式用 r 对θ来表示每个图像。图像空间中的一条线由 Y=mX+b 表示。这意味着图像空间中的每一条线由一个点表示。这种变换有助于找到图像中线条之间的关系。为了成功地执行霍夫变换并检测正确的线,需要注意不同的参数。有关此转换的更多信息,请点击 此处 并检查 OpenCV 中的函数,请点击 此处 。
4.在实现代码之前,需要将图像转换为灰度图像,而不是红绿蓝(RGB)色彩空间。高斯模糊也用于模糊图像并去除图像中存在的一些噪声。
在使用霍夫变换找到霍夫线之后,基于它们的斜率和位置过滤这些线,以确保检测到的线仅仅是车道线。您可以在管道中的 draw_lines 函数中看到这一点。
第一个项目的代码可以在我的 Github 库这里看到。
这是第一个项目的最终结果:
Lane line detection video.
项目 2:交通标志识别分类器:
第二个项目侧重于不同的原则,即神经网络(NN)。我会试着在这里简单地解释一下,但是我也会提供一些有用的链接给你查看。
首先,深度学习使用算法和多层来提取特征、学习和预测结果。神经网络是一种深度学习方法,用于教会计算机预测特定的结果。
神经网络由不同平行层组成。每层由一个或多个节点组成。一个节点包含一个特定的数学运算。神经网络的输入称为特征。它们代表从比如说一幅图像中提取的选定信息。例如:图像的像素值。输出是图像的结果,称为标签。例如:指定图像中的物体是什么(狗、猫等)。像素值进入节点,并乘以随机权重,以创建表示图像像素之间关系的数学方程。这些特征进入不同的节点,从而产生不同的方程和不同的关系。
This is an example of a simple Neural Network.
节点还包含激活功能,以确定是否触发网络中的下一个节点,例如:如果结果> 0,则激活下一个节点,如果< 0,例如-0.5,则将其设为 0,不激活下一个节点。
开始时,网络将完成一次转发。结果不会非常准确,因为等式的权重是随机的,这意味着我们可能最终会放大不太重要的特征,并减少更重要的特征(在等式中,w=2 会使特征加倍,而 w=0.5 会将其减半)。因此,计算误差或均方误差将显示预测结果与实际结果的差距。为了获得更小的误差,我们需要更新权重,以获得最小的误差。换句话说,我们的目标是通过在下面的图像中更深入来降低梯度,直到梯度几乎为零。这是梯度下降。
Example of the gradient descent to reduce error. The goal is to reach the bottom (Gradient of almost Zero).
为了更新权重,有一个称为反向传播的过程。它使用在网络末端获得的误差,并且主要使用链规则来寻找每个节点处的误差和梯度。因此,网络向前,找到误差,然后向后更新权重,并一直这样做,直到达到最小均方误差。
在更高级的网络中,任何预测的结果都将是多个标签。每个都有正确结果的概率和误差。因此,在其他标签中,最大的概率和最小的误差应该是正确的猜测。有不同的程序和算法用于提高神经网络的效率和准确性,例如 softmax 函数,它将网络的输出转换成概率。
因此,由标签矩阵 Y 表示的 NN 的标签是等式 Y=Xw+b 的结果,其中 b 是偏差,X 是特征矩阵,w 是整个网络的权重矩阵。在训练过程中,X 中的每一行代表图像像素。要训练网络,必须有一个具有已知标签的大型数据集,以便您可以向网络输入 x。首先,权重将是随机的,当计算与已知 Y 相比的误差时,权重会更新等等。在训练网络之后,通过向网络提供新的图像(X)并使用网络应该能够成功预测结果的更新的权重(标记 Y)来测试网络。完成该操作后,计算精度。
因为数据集非常大,所以矩阵 X 会非常大。这意味着使用普通计算机 CPU 训练网络将花费大量时间,而使用 GPU 要快得多。
训练网络的目标是泛化。我们需要创建一个足够通用的网络来预测任何新的观察结果并给出正确的结果。需要避免的一个重要情况是过度拟合。你可以认为过度拟合是一个网络,它在与训练过的网络相似的观察(图像)中表现得非常好。但是一旦给出一个新的稍微不同的图像,结果就变得不对了。因此,该网络不能推广到成功预测不同的给定。这也意味着训练误差很低,而测试误差很高。应该防止这种情况,这种情况在许多情况下都会发生,例如增加历元数。在神经网络的训练中,历元是向前一遍和向后一遍。另一个原因是通过使用与训练数据相同的数据来测试网络。
A plot shows how overfitting affects the test results.
神经网络有许多参数可以调整以达到最佳精度。例如:改变历元数或学习率。学习率是在每个时期更新权重的速率。
关于神经网络 NNs 或者甚至非常相似的卷积神经网络 CNN 的进一步信息,我推荐这些链接:
不同的公司和组织创建了 CNN 架构,将节点组合在一起,以产生最佳效果。我使用 LeNet 架构实现了我的项目,这是一个非常简单的 CNN,可以提供合理的准确性。
该项目是关于创建一个交通标志分类器,它能够识别汽车前置摄像头检测到的不同交通标志,并区分它们。正如你从下图中看到的,分类器能够对我从互联网上随机选择的交通标志图像进行分类。
Result of the traffic sign classifier in predicting traffic sign images.
要查看我的项目报告,其中我解释了所有实施的步骤和结果,请按 此处 。并点击 此处 查看我的项目管道。
项目 3:行为克隆:
这个项目的目标是建立一个能够克隆汽车行为的 CNN。通过模拟器,汽车在轨道上行驶。汽车的前窗装有摄像头。摄像机的转向角度和图像可以在任何位置记录并保存。分类器将图像作为特征,将转向角作为 CNN 的标签。在使用用户保存的所有数据集(记录的图像和赛道上的转向角度)训练网络之后,汽车应该能够在从相机获取图像作为输入时,通过预测转向角度,在相同的赛道上自动驾驶。
为了能够构建高效的 CNN,使用了 Keras,这是一种基于 Tensorflow 构建的高级神经网络 API。如果你点击 这里 ,你可以看到我用来实现让汽车自动驾驶的代码。
下面是汽车在自主模式下的视频:
要看我写的关于这个项目的报告,请点击 这里 。
项目 4:高级车道线查找:
Udacity 的第一个项目是寻找车道线。该项目使用先进的算法,能够在阴影等关键情况下预测车道线。
为了做到这一点,汽车的摄像头应该进行校准,以确保图像没有失真。这是通过计算摄像机矩阵和失真系数来完成的。我将在本节末尾的报告中对此进行解释。
要学习的一件非常重要的事情是色彩空间。它是一个数学模型,表示每个图像中使用的颜色系统。一个著名的颜色系统是 RGB(红绿蓝),它使用不同强度值的红绿蓝颜色来表示和形成任何颜色。每个图像中使用不同的颜色空间,例如 HSV(色调、值和饱和度)。
RGB color space vs. HSV color space.
所以为了提取特定的信息,我们可以使用不同的颜色空间,甚至不同的通道。例如,如果我们从 RGB 和 HSV 颜色空间中提取红色通道和 S 通道,则黄色油漆的车道线比在不同通道中更有可能出现。组合最佳通道有助于增加在图像中找到所需信息的可能性。
另一种在图像中寻找直线或边缘的方法是使用 Canny 边缘检测方法。这种算法的核心依赖于所谓的 Sobel 算子。将这些运算符应用于图像类似于在 X 和 y 方向上对图像求导。这可用于找到边缘的大小,甚至它们的方向,这将有助于找到它们。这也可以与颜色空间相结合,以提高我们的检测算法的效率。(在我的例子中,我将红色通道、S 通道和 X 方向的梯度与特定阈值相结合,以检测车道线)。这也将在本节末尾的报告中解释。
A binary image resulting from combining images from (Gradient X, S channel and the Red channel)
在将彩色图像转换成二值图像后,图像被扭曲成鸟瞰图像。扭曲图像是通过透视变换完成的,也就是将一个对象从一个透视变换到另一个透视。在我们的例子中,我们希望将图像的一部分从正常视角转换为鸟瞰视角,在正常视角下,我们看到的物体比其他物体更大,而在鸟瞰视角下,我们从上方看到物体。这是通过在图像中指定四个点来完成的(应该创建一个梯形)。彼此靠近的两个点将被进一步处理,这将把梯形转换成正方形/矩形。
Warped image (right) vs. an original image with trapezoidal shape (left)
这种扭曲将有助于找到街道上线条的曲率。因此,在扭曲图像后,我们将能够在车道线上拟合多项式。这主要是通过找到直方图中的峰值(白线代表二进制图像中的峰值),然后在图像中滑动窗口以覆盖这些线来完成的。之后,在直线上拟合一个多项式。这是窗口和多项式的样子:
Polynomial fit on the lane lines that are covered by the sliding windows. (they are colored for demonstration)
这将使计算线条的半径并在视频中突出显示它们变得更加容易。下面的视频显示了高亮显示车道线的结果。
看一下这个项目的报告。请点击 这里 。并且在这里按看一下代码管道。
项目 5:车辆检测:
第一学期的最后一个也是第五个项目是写一个程序,通过在每个检测到的车辆上画一个包围盒来检测车辆。该项目是使用支持向量机 SVM 完成的,这是一种用于分类和区分不同类别的分类器。在这种情况下,分类器将图像的多个特征作为输入,并学习将它们分为两类,汽车和非汽车。
提取图像特征有不同的方法。第一个 HOG 特征是梯度直方图,寻找图像像素的梯度方向。第二是计算每个通道的颜色直方图。通过计算,你将得到从 0 到 255 的每个通道的直方图。
因为车辆有特殊的特性,比如闪亮的油漆。更好的做法是检查在提取特征和识别每幅图像时能够给出最佳结果的最佳颜色空间。特征提取应用于 cars 图像数据集和非 cars 图像数据集,之后它们被保存在两个数组中。然后应用 SVM,并计算新训练的分类器的准确度。
不,我们能够识别汽车图像。下一步是能够在包含多个对象的图像中找到汽车。一个简单的方法是在图像上滑动一个特定大小的窗口,搜索里面是否有汽车。最有效的方法是提取整幅图像的 HOG 特征,然后对图像进行二次采样并搜索汽车。要确定检测到的对象是汽车,最好创建不同大小的窗口。这将增加检测汽车的概率。换句话说,汽车将被检测多次,而非汽车对象将被检测一次。这将有助于移除所有不需要的对象。这些被称为假阳性。
False positives (left) vs. Cars successfully detected by different windows (right)
如果你能在图像中看到树的影子,软件就会认为那辆车就在那里。消除误报将有助于提高软件的准确性,并将只保留被多个窗口检测到的对象。这是通过将热图应用到分类器来完成的,该分类器将热量添加到窗口内的每个像素。在有多个窗户的地方热量会增加,而在只有一个窗户的地方热量会保持不变。这在管道中用于消除所有误报。
下面是我能得到的结果的视频: