TowardsDataScience 博客中文翻译 2019(五百五十三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

你的足球队的克星是什么?

原文:https://towardsdatascience.com/whats-your-soccer-team-s-nemesis-30d95c4f9b15?source=collection_archive---------24-----------------------

巴萨真的是皇马最难对付的对手吗?史料描绘了一个有趣的故事。

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

皇家马德里 vs 巴塞罗那。曼联对利物浦。国际米兰对米兰。里昂奥林匹克队对马赛奥林匹克队。切尔西 vs 所有人。

**欧洲足球充满了令人惊叹的竞争。**由于球场内外的原因,这些竞争随着时间的推移而产生和演变,是球队每个赛季都必须面对的最艰难的比赛。但是这些对抗真的是赛季中最艰难的比赛吗?例如,尽管皇家马德里对巴塞罗那是世界足球最重要的比赛之一,但人们很容易忘记皇家社会或毕尔巴鄂竞技对巴塞罗那来说有多难。

在这篇文章中,我想报告我所做的数据分析的方法和结果,以查看欧洲主要联赛 8 个赛季的所有比赛数据,并找出哪个对手对每个球队造成的损害最大。又名,寻找各队的克星。

我在这篇文章的最后描述了数据和方法,以便立即深入研究结果(请随意查看,然后返回结果!).要了解结果,你需要知道的主要事情是,我使用的**指标是一个团队从对手那里获得的最大可能分数的百分比。**最大可能点数是游戏次数的 3 倍。因此,举例来说,如果切尔西与利物浦比赛 10 次,总共得到 15 分,那么切尔西得到 30 分中的 15 分,即 50%。

为了保持列表简短,我只报告了(几乎)有 16 次相遇的团队配对的结果。这是最大可能的比赛次数,因为每对球队每年比赛两次,我们有 8 年的数据。

结果呢

被研究的各大团队克星

数字越低,该队在对抗对手时表现越差。

英超联赛

  • 阿森纳 : 25% vs 切尔西
  • 阿斯顿维拉: 14.6% vs 曼联
  • 切尔西: 40% vs 利物浦
  • 埃弗顿: 19% vs 阿森纳
  • 利物浦: 29% vs 阿森纳
  • 曼城: 38% vs 利物浦
  • 曼联: 38% vs 切尔西
  • 斯托克城: 17% 曼联
  • 桑德兰: 19% vs 切尔西
  • 热刺: 29% vs 曼联

西班牙 La Liga

  • **毕尔巴鄂竞技俱乐部:**12%vs巴塞罗那
  • **马德里竞技:**17%巴塞罗那
  • **巴塞罗那:**53% 皇家社会
  • 赫塔菲: 13% 皇家马德里
  • **马拉加:**8% 巴塞罗那:
  • **西班牙人:**6%vs皇家马德里
  • 皇家马德里: 29% vs 巴塞罗那
  • **塞维利亚:**13%vs巴塞罗那
  • **瓦伦西亚:**23%vs巴塞罗那

意大利 Serie A

  • **切沃·维罗纳:**6%vs米兰
  • 热那亚: 20% 尤文图斯
  • **国际米兰:**29% vs尤文图斯
  • **尤文图斯:**47%那不勒斯
  • **米兰:**29% vs尤文图斯
  • **那不勒斯:**40%vs罗马
  • **罗马:**25%vs尤文图斯
  • **乌迪内斯:**29% vs尤文图斯

德国 Bundesliga

  • **拜耳 04 勒沃库森:**29%vs多特蒙德
  • 多特蒙德(Borussia Dortmund):40%vs拜仁慕尼黑(T75)
  • Borussia Monchengladbach: 31% vs. Borussia Dortmund
  • **拜仁慕尼黑:**50% vsBorussia Monchengladbach
  • **沙尔克 04:**19% vs拜仁慕尼黑
  • 汉堡 SV: 21% vs拜仁慕尼黑
  • (T92) 韦尔德不来梅(T93):13% vs. 拜仁慕尼黑(T94)
  • TSG 1899 霍夫恩海姆: 8.3% vs拜仁慕尼黑
  • **VfB Stuttgard:**11% vs拜仁慕尼黑
  • VfL 沃尔夫斯堡: 15% vs拜仁慕尼黑

法国 Ligue 1

  • **AS 圣艾蒂安:**20% vs巴黎圣日耳曼
  • FC 洛里昂: 21% vs巴黎圣日耳曼
  • 波尔多吉伦丁斯: 38% vs 马赛奥林匹克运动会
  • **LOSC 里尔:**27%vs巴黎圣日耳曼
  • OGC Nice: 29% vs Montpellier Herault SC
  • **奥林匹克里昂:**31%vs巴黎圣日耳曼
  • **马赛奥林匹克:**31% vs巴黎圣日耳曼
  • 巴黎圣日耳曼: 28% vs 作为摩纳哥
  • 伦奈斯球场: 27%对波尔多吉伦特派
  • 图卢兹足球俱乐部: 29% vs 巴黎圣日耳曼

突出

好的,这已经很多了。我们来加工一些高光。

切尔西是阿森纳的克星。鉴于该数据集基于 8 个季节,这可能并不令人惊讶。迪迪埃·德罗巴和他的蓝色队友已经威胁阿森纳的防线一段时间了。

利物浦是切尔西和曼城的克星。但是谁能忘记杰拉德的失误,让切尔西进球,也让利物浦的夺冠希望破灭?

阿森纳是利物浦的克星。切尔西>阿森纳>利物浦>切尔西。这是一个有趣的循环,表明在足球中事情没有等级之分:任何球队都可以赢任何球队!

英格兰超级联赛是最平等的联赛。有很多关于西甲 vs 英超的讨论,这篇博文可以增加一个数据点。在这里研究的 9 支西班牙球队中,巴塞罗那队是 6 支的克星,而在英超联赛中,没有哪支球队像巴塞罗那队那样占据统治地位。在被调查的 10 支球队中,切尔西和曼联各是 3 支球队的克星。

当然,另一方面,在研究的 8 个赛季中,英超有 10 支球队从未降级,但西甲只有 9 支。所以我们先不要急着判断哪个联赛是最有竞争力的。

皇家社会是巴萨的克星。这是一个意想不到的结果的很好的例子,因为大部分的媒体报道通常都是关于 El Classico 的。但密切关注巴萨的球迷知道“阿诺埃塔诅咒”以及皇家社会对巴塞罗那来说是一个多么困难的对手。

巴萨几乎是西班牙各大球队的克星。对于许多人来说,这可能并不奇怪,因为巴塞罗那在过去的 8 年里一直在国内联赛中占据统治地位(他们赢得了所研究的 8 个赛季中的 6 个赛季)。皇家马德里是西班牙两支主要球队的克星,赫塔菲(一支同样位于马德里大都会区的球队)和西班牙人。

尤文图斯一直统治着意大利联赛。他们是 8 支意大利球队中 5 支的克星。那不勒斯是尤文图斯的克星。

PSG 和拜仁慕尼黑分别称霸法德联赛。他们是联盟中 10 支被研究球队中 7 支的克星,是所有被研究球队中比例最高的。正如摩纳哥是巴黎圣日耳曼的克星,门兴格拉德巴赫是拜仁慕尼黑的克星。

巴塞罗那是研究中最有韧性的球队。与劲敌皇家社会队的比赛中,巴萨设法获得了 53% 的最大可能积分。这是所有团队/复仇女神组合中最高的。这是对阵强敌时表现最好的球队名单。

  1. 巴塞罗那,53%对皇家社会
  2. 拜仁慕尼黑,50% vs 门兴格拉德巴赫
  3. 尤文图斯,47%对那不勒斯
  4. 多特蒙德,40%对拜仁慕尼黑
  5. 切尔西,40%对利物浦
  6. 那不勒斯,40%对罗马
  7. 曼联,38%对切尔西
  8. 曼城,38% vs 利物浦

结论

这种分析真的能帮助巴萨球迷在他们的球队对阵皇马时放松下来吗?大概不会。足球对抗不仅仅是一场比赛,也不仅仅是国内联赛的 3 分。

然而,这种分析和其他类似的分析可以帮助整理噪音和人为偏见,以向球员和教练指出他们应该更加关注的一些球队。

你的团队不在上面的名单里吗?别担心,你可以在这里看到(并修改)产生所有结果的笔记本或者在下面留下评论!

感谢阅读!

附录:数据集和方法

数据集

我使用了欧洲足球比赛的 Kaggle 数据集。这是一个非常棒的数据库,包含了大量欧洲国内联赛的比赛以及球员和球队的属性。

方法论

我做的第一件事是查询数据集,以获得西班牙、英格兰、法国和意大利国内联赛的所有比赛结果。数据集包括更多的联赛,所以如果你真的想从这四个联赛之外的联赛中找到你球队的克星,请随意看看代码或者告诉我。

一些直接的基本调查显示有 8 个季节:从 2008/9 的到 2015/6 的直到**。**我们每个联赛都有 20 支参赛队,每支参赛队都有两次比赛,因此每支参赛队每个赛季都应该有 38 次观察。欧洲联赛实行降级和升级制度,因此并非所有球队都会成为每个赛季数据的一部分,因为有些球队会降级。

数据集看起来非常完整,几乎记录了所有匹配;有一小部分比赛缺席(大部分是意大利联赛),但是因为很少,我选择忽略它。

一旦所有的原始记录都准备好了,我会浏览每个队的完整比赛列表,记录对手和他们在比赛中得到的分数:如果他们赢了,3 分;如果他们输了,0 分;如果他们打平,1 分。然后,可以将这个数据集按每个团队和对手对分组,计算他们得到的分数总和,然后除以可能的最大分数。因此,对于每支球队,我们可以找到对手,他们得到了最小百分比的可能分数。我们称那个对手为克星!

何时以及如何组建您的数据科学团队

原文:https://towardsdatascience.com/when-and-how-to-build-out-your-data-science-team-157b977e4c31?source=collection_archive---------18-----------------------

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

评估您的成熟度,找到您需要的技能,并创建数据文化

越来越多的初创公司正在寻求人工智能(AI)来帮助他们解决业务问题和提高效率。在你的初创公司中建立人工智能能力的众多好处不应该让任何人感到惊讶。

事实上,商业优势是如此深远,以至于普华永道预测,到 2030 年,人工智能将为全球经济增加15.7 万亿美元。与流行的观点相反,成功实施人工智能来推动有影响力的决策需要一个多元化的团队,他们拥有多种技能组合的专业知识。

启动你的人工智能之旅不是一件简单的事情——你需要提出探索性的问题,以确保相关的数据科学项目在正确的时间开始。此外,你需要确保建立一个高效的团队,将数据转化为决策。

企业应该在什么时候实现人工智能飞跃?

大多数初创公司已经在使用数据来了解他们的业务绩效并做出运营决策,无论是通过 MIS 报告还是 Excel 电子表格中跟踪的 KPI。但是什么时候应该升级到高级分析呢?你应该在什么时候开始利用人工智能技术并建立你的数据科学团队?

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

Pic: Scaling the 7 levels of maturity with data

任何希望在数据科学领域成熟的初创公司都需要获得可靠的数据源和干净的数据。因此,先决条件是利用工程实践来获取数据,然后构建和存储它。

数据科学的第一步是查看描述性分析以了解过去发生的事情,这通常通过 KPI 报告和业务指标的简单摘要来实现。

在进行描述性分析之后,你应该使用探索性数据分析来理解事情为什么会这样。这被称为诊断分析,由统计和业务分析提供支持。

一旦您发现自己在寻求从数据中提取更多价值,您就应该为前瞻性分析做好计划。在这里,使用人工智能和机器学习(ML)对于深入研究更深层次的、预测性的、数据驱动的见解至关重要。

数据科学之旅的下一步是消费这些数据洞察,并将它们与业务决策联系起来。数据消费由叙述、信息设计和数据故事驱动。

组织的最终数据成熟度是数据成为一种文化的时候。这是组织中每个人的第二天性,使用数据并利用探索性见解、ML 和 AI 等技术,直接或间接为决策提供动力。

数据科学什么时候合适?

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

Photo by Kevin Ku on Unsplash

但是刚刚起步的创业公司呢?在深入了解之前,您应该花六个月的时间来构建您的数据湖吗?不会。无论你手头有什么数据,开始训练人工智能和人工智能算法都不会太早——只要确保你有来自内部或外部来源的相关、精选数据。

在旅程的早期,在开始将数据输入数据科学层之前,实施清理和转换数据的流程至关重要。例如,假设一家最近推出的电子商务初创公司希望利用人工智能和人工智能来更好地了解观众的购买行为。数据科学团队可以从事务日志中收集数据,对其进行处理和清理。

他们可以分析这些数据,然后了解人们为什么购买某些商品,并预测他们未来可能会购买什么。这为组织提供了尽早了解其消费者基础的关键可行见解,而不必等待。

所以,你已经决定向人工智能迈进,你已经确定了你的人工智能愿景和可能的用例。然后,您如何构建您的团队来实现收益并扩展成熟阶段?

什么造就了一个全面发展的数据科学团队?

如果你从报告和描述性分析开始,那么你将需要一个数据翻译器。这些人在技能上最接近商业智能(BI)团队中的“商业分析师”。除了敏锐的商业嗅觉,他们还擅长处理数据,熟悉分析,并有设计眼光。

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

Pic: Roles mapped to the Data maturity levels

数据翻译者帮助确定最有影响力的项目,因为他们将业务挑战塑造成可以通过数据解决的形状。凭借对领域和数据流畅性的深刻理解以及有效沟通的能力,他们充当了业务用户、数据工程师以及数据科学家和信息设计师等角色之间的桥梁。

这一角色在致力于推动业务成果的数据科学团队中至关重要— 麦肯锡估计,到 2026 年,仅美国对翻译的需求就可能达到 200 万到 400 万。

数据科学家将利用他们在统计学、ML 和 AI 技术方面的知识,找到从数据中发掘最重要见解的方法。你还需要信息设计师来使这些见解变得可消费。

信息设计师能够赋予洞察力的视觉智能层以生命,并使用数据可视化和视觉设计从洞察力中编织引人入胜的商业故事。

机器学习工程师(ML 工程师)是精通数据的程序员,在 ML/AI 模型的生产中至关重要。他们将数据科学解决方案与后端的正确见解和前端的正确叙述相结合,以支持业务决策。

这个拥有不同技能的团队最好由数据科学经理来管理。这些人同样理解数据、见解和故事,以及他们在人员和项目管理方面的核心专业知识。

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

许多组织正在将数据讲述者的额外角色制度化。这些人通过从数据洞察中精心制作清晰的叙述,超越了可视化仪表板。它们提供了背景,使企业中的每个人都能理解这些见解。

根据这份 Gartner 报告,我们,人类,天生就有抑制我们有意义地参与事实的能力的机制。故事是感性的,难忘的,可操作的。如果没有吸引人的数据故事,你可能会疏远你的非数据科学团队成员。

组织也转向艺术和社会学科,为数据科学增加人文因素。例如,行为心理学家能够更好地揭示客户决策背后的潜在原因,如流失、购买和参与。

当与数据洞察相结合时,这种人的视角使组织能够更深入地了解他们的客户群,并做出真正有影响力的决策。

构建业务以培养健康的数据文化

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

Photo by Edvard Alexander Rølvaag on Unsplash

对于任何刚刚开始数据科学之旅的初创公司来说,建立一个多功能的数据科学团队并产生有影响力的见解不会在一夜之间发生。许多在这条道路上迈出第一步的组织努力提出正确的分析计划,并确定深刻的业务见解。

他们发现很难使见解具有可消费性,并且不总是能够确保数据科学解决方案被目标用户采用。这就是为什么分析的采用需要行政命令和领导层的共同努力才能取得成功。

规划变革管理计划以实现其团队接受数据的行为变化至关重要。您可以通过流程干预将数据驱动的决策构建到团队成员的业务工作流程中来实现这一点。

健康的数据文化还需要得到正确的组织结构的支持,以促进数据科学团队和业务团队之间的协作。一个由数据科学冠军组成的跨职能核心团队应该领导该计划,并与终端用户保持联系。

应通过提醒团队许多业务优势来确保组织的采用和认可——与同行相比,数据驱动型公司每年平均增长超过 30 %。最终,每个组织都应该将数据文化视为其最终目标。当数据为深入洞察提供动力并被整个组织使用时,这种情况就会发生,从而使每个决策都具有潜在的影响力。

这不仅改变了团队内部日常运作的方式,也改变了商业运作的方式。将数据文化制度化可以为组织转型和市场竞争优势铺平道路。

这篇文章最初是在 TechCrunch 的会员计划 ExtraCrunch 上 发表的 。增加了插图。封面图片由 法布里齐奥 组成。

何时以及如何使用 Python mock

原文:https://towardsdatascience.com/when-and-how-to-use-python-mock-b626e5f9bf7?source=collection_archive---------15-----------------------

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

Photo by Suzanne D. Williams on Unsplash

使用 mock 减少您的测试执行时间

议程

这篇文章将涵盖何时以及如何使用unittest.mock库。

Python 文档恰当地描述了模拟库:

unittest.mock allows you to replace parts of your system under test with mock objects and make assertions about how they have been used.

何时使用模拟库

简短的回答是“大多数时候”。下面的例子将使这一主张更加清晰:

在 shell 上定义以下三个函数。

In [1]: def cow():
   ...:     print("cow")
   ...:     return {'cow': 'moo'}
   ...:In [2]: def dog():
   ...:     print("dog")
   ...:     return {'dog': 'bark'}
   ...:In [3]: def animals():
   ...:     data = cow()
   ...:     data.update(dog())
   ...:     data['pig'] = 'oink'
   ...:     return data
   ...:

让我们执行animals。素食者会杀了我;)

In [4]: animals()
cow
dog
Out[4]: {'cow': 'moo', 'dog': 'bark', 'pig': 'oink'}

输出确认了从animals()调用了cowdog

让我们为cow写一个测试。

In [5]: def test_cow():
   ...:     assert cow() == {'cow': 'moo'}
   ...:

让我们执行test_cow来确保cow按预期运行。

In [6]: test_cow()
cow

让我们同样测试dog

In [7]: def test_dog():
   ...:     assert dog() == {'dog': 'bark'}
   ...:In [8]: test_dog()
dog

下面给animals加个测试。

In [9]: def test_animals():
   ...:     assert animals() == {'dog': 'bark', 'cow': 'moo', 'pig': 'oink'}
   ...:In [10]: test_animals()
cow
dog

从打印的声明中可以看出,cow()dog()是从test_animals()开始执行的。

测试animals时不需要执行cowdog,因为cowdog已经单独测试过了。

在测试animals时,我们只想确保cowdog会被执行。我们不希望真正的处决发生。

cowdog是微小函数。从test_animals开始的执行目前不是什么大事。如果函数cowdog很大,test_animals可能需要很长时间才能完成。

如果我们使用unitest.mock.patch,这种情况是可以避免的。

让我们修改test_animals如下所示:

In [17]: from unittest.mock import patchIn [18]: [@patch](http://twitter.com/patch)('__main__.cow')
    ...: [@patch](http://twitter.com/patch)('__main__.dog')
    ...: def test_animals(patched_dog, patched_cow):
    ...:     data = animals()
    ...:     assert patched_dog.called is True
    ...:     assert patched_cow.called is True
    ...:

执行 test_animals()

In [19]: test_animals()

我们再也看不到cowdog的打印声明。这确认了cowdog没有被执行。

我们来解剖一下test_animals

test_animals已装饰有@patch。函数dog作为参数传递给@patch

由于test_animals已经被修饰,所以在test_animals的上下文中,实际的函数dog已经被替换为一个unittest.mock.Mock实例。这个Mock实例被称为patched_dog

由于animals()是在test_animals()的上下文中执行的,所以没有从animals实际调用dog。取而代之的是patched_dog的称呼。

Mock实例有一个名为called的属性,如果从测试中的函数调用模拟实例,该属性将被设置为 true。我们断言模拟实例patched_dog已经被调用。

如果从animalsdog的调用被移除/注释,那么test_animals将失败。

In [20]: def animals():
    ...:     data = cow()
    ...:     #data.update(dog())
    ...:     data['pig'] = 'oink'
    ...:     return data
    ...:In [21]: test_animals()
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-21-f8c77986484f> in <module>
----> 1 test_animals()/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py in patched(*args, **keywargs)
   1177
   1178                 args += tuple(extra_args)
-> 1179                 return func(*args, **keywargs)
   1180             except:
   1181                 if (patching not in entered_patchers and<ipython-input-18-a243d0eea2e8> in test_animals(patched_dog, patched_cow)
      3 def test_animals(patched_dog, patched_cow):
      4     data = animals()
----> 5     assert patched_dog.called is True
      6     assert patched_cow.called is True
      7AssertionError:

这证实了测试提供了正确的覆盖范围,而没有实际执行cowdog

在模拟实例上设置 return_value

取消注释代码。

animals中除了调用cowdog还有额外的代码。animals也将猪添加到数据中。

我们来测试一下animals的附加代码。

In [43]: [@patch](http://twitter.com/patch)('__main__.cow')
    ...: [@patch](http://twitter.com/patch)('__main__.dog')
    ...: def test_animals(patched_dog, patched_cow):
    ...:     patched_cow.return_value = {'c': 'm'}
    ...:     patched_dog.return_value = {'d': 'b'}
    ...:     data = animals()
    ...:     assert patched_dog.called is True
    ...:     assert patched_cow.called is True
    ...:     assert 'pig' in data

让我们执行测试

In [45]: test_animals()

我们所有的断言都通过了,因为没有断言错误。

调用Mock函数的默认返回值是另一个Mock实例。因此,当在test_animals上下文中从animals调用patched_dog时,它会返回一个模拟实例。我们不希望它返回一个模拟实例,因为animals的附加代码期望它是一个字典。

我们在patched_cow上设置一个return_value作为字典。同样适用于patched_dog

现在animals的附加代码也被测试覆盖。

另一个例子

让我们定义一个函数来测试 url 是否有效。这个靠 Python 的requests

In [59]: import requestsIn [60]: def is_valid_url(url):
    ...:     try:
    ...:         response = requests.get(url)
    ...:     except Exception:
    ...:         return False
    ...:     return response.status_code == 200

下面给is_valid_url加个测试。

In [69]: def test_is_valid_url():
    ...:     assert is_valid_url('[http://agiliq.com'](http://agiliq.com')) is True
    ...:     assert is_valid_url('[http://agiliq.com/eerwweeee'](http://agiliq.com/eerwweeee')) is False # We want False in 404 pages too
    ...:     assert is_valid_url('[http://aeewererr.com'](http://aeewererr.com')) is FalseIn [70]: test_is_valid_url()

您会注意到您的测试在进行网络调用时有多慢。

让我们通过利用patchMock使我们的测试更快来解决这个问题。

In [71]: [@patch](http://twitter.com/patch)('__main__.requests')
    ...: def test_is_valid_url(patched_requests):
    ...:     patched_requests.get.return_value = Mock(status_code=200)
    ...:     assert is_valid_url('[http://agiliq.com'](http://agiliq.com')) is True
    ...:     patched_requests.get.return_value = Mock(status_code=404)
    ...:     assert is_valid_url('[http://agiliq.com/eerwweeee'](http://agiliq.com/eerwweeee')) is False # We want False in 404 pages too
    ...:     patched_requests.get = Mock(side_effect=Exception())
    ...:     assert is_valid_url('[http://aeewererr.com'](http://aeewererr.com')) is False
    ...:In [72]: test_is_valid_url()

你应该注意到了速度的提升。

摘要

模拟应该在下列情况下使用:

  • 来模拟任何已经单独测试过的依赖项。cowanimals的属地,所以我们嘲讽了cow
  • 来模拟网络通话。requestssend_mail应该被嘲讽以避免网络调用。
  • 模拟任何大型函数以减少测试执行时间。

签署

希望这篇文章有用。

如果你喜欢这篇文章,考虑发送至少 50 个掌声:)

什么时候进行 A/B 测试,什么时候不进行

原文:https://towardsdatascience.com/when-and-when-not-to-a-b-test-c901f3ad96d9?source=collection_archive---------4-----------------------

分裂测试与多臂土匪:模拟,源代码和现成的应用程序

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

Photo by Daniil Vnoutchkov on Unsplash

本文讨论了 A/B 或分裂测试和多臂土匪对于变体测试的区别。它可以用于例如为数字营销活动选择最佳表现的广告集。在各种实验中模拟和测量两种方法的性能表明在大多数情况下,Bandit 控制分割,并且应该是首选的。除了模拟结果之外,还提供了所有必需的源代码,以及一个使用 Bandit 方法进行变量优化的简单 web 应用程序。

app:【optimizer.stagelink.com
代码:github.com/kinosal/optimizer

故事大纲

  1. 什么是 A/B 测试,有什么问题?
  2. 另一种选择是:多股武装匪徒
  3. 实验:分裂与强盗
  4. 参数+结论

所以让我们开始吧:

什么是 A/B 测试?

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

Photo by Robert Anasch on Unsplash

A/B、A/B/n 或分割测试----我们将这样称呼它们----用于通过测试、测量和比较每个场景中的行为(即成功率)来确定几个备选场景或变体中的哪一个更有可能产生预期的成功结果或响应。这种测试有各种各样的用例。本文将重点关注转化率的最大化,例如,从用户看到在线广告到点击此类广告,或者用户在访问网站后完成购买。

分割测试的结果可以用一个 NxM 矩阵来描述,其中 N 行包含所有测试场景中成功失败=试验-成功的数量。在一个示例中,广告(场景或变体)1 已经显示给 1,000 人(试用),其中 10 人点击了广告(成功),广告 2 已经显示给不同的 1,000 人,其中 20 人点击了广告,这个矩阵也称为列联表,如下所示:

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

现在的目标是确定两个广告(场景)中的一个的成功率(点击可能性)是否“显著”高于另一个广告(场景)。这将意味着在所有场景中抽取的样本很有可能不是来自同一个群体(或具有相同分布的群体,在我们的情况下是二项式),这是我们的零假设 H0 的成功率独立于我们试图使之无效或反驳的观察到的场景。这一点很重要,因此我们最终可以得出结论,场景中的差异实际上是不同成功率的原因,而不仅仅是这些场景中的随机性。统计显著性或置信水平可以解释为独立概率=错误拒绝低于预定义 p 值的H0(aI 型误差)的概率。检验显著性的方法有多种,我们将重点关注不带( Yates ')校正的(Pearson’s)卡方检验。p 值可以通过卡方统计从列联表中显示的观察数据中导出,卡方统计定义为

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

其中 Oi,j 是观察到的成功和失败,而 Ei,j 是它们各自的期望值,如果基础分布是相同的,即在上面的例子中有 15 次成功和 985 次失败。因此,如果在观察到的情景中没有差异,则统计表明两种情景的不同之处。p 值现在可以根据卡方统计值(稍后在进行实验时会详细介绍)计算为具有适当自由度卡方分布的曲线(积分)下的右尾面积(在两种可能结果的情况下,场景数减一)。如果 p 值低于先前定义的值(如期望的置信度或显著性水平),则可以拒绝零假设,并且认为结果取决于观察到的情况。在上面的例子中,卡方等于 3.3841,p 是 0.0658(这可能不足以否定独立性的概念)。

那么问题出在哪里?

正如我们已经看到的,我们需要对我们期望的结果(上面例子中的成功或点击)达到一定程度的信心,以依赖于所提供的场景。只有这样,我们才能“安全地”忽略劣势场景或变体,例如 ad,从而最大化积极结果。

这里的问题是一个探索和剥削的问题。

为了通过完全转移到最佳场景来利用这种情况(例如,只显示那个广告),我们需要投资探索这种情况,直到我们足够自信。这可能是昂贵的,因为我们可能要支付投放广告的费用,和/或由于“糟糕”的场景选择而没有最大化我们的回报所导致的机会成本。因此,在我们对完全转移到指定的高级场景的决策达到期望的信心之前,我们纯粹是花钱去探索;在我们达到这一点后,我们可以充分利用这种情况(假设场景不会随着时间的推移而改变)。这听起来不像是最佳解决方案,对吗?

如果我们能够更渐进、更早地走向我们认为可能更优越的情景,从而降低勘探成本并增加开采回报,尤其是在短期内,会怎么样?

很高兴你问了。

另一种选择是:多股武装匪徒

在进入细节之前,让我们快速讨论一下统计的频率主义和贝叶斯方法之间的斗争:

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

Source: https://www.xkcd.com/1132, also compare the heated debate about this comic at https://stats.stackexchange.com/questions/43339/whats-wrong-with-xkcds-frequentists-vs-bayesians-comic

直到现在,我们一直过着频繁的生活。然而,由于我们不想成为超新星,这种情况将会改变。贝叶斯主义者通过获得与这些信念有条件相关的额外信息,更新他们关于(随机)世界(从前到后)中(事件的概率)的现有信念:

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

其中 A 和 B 是事件,P(A)和 P(B)是观察到这些事件的(边际)概率(其中 P(B) ≠ 0),P(A|B)和 P(B|A)是条件概率(例如,给定 B 为真的 A 的可能性)。

“经典的”频率主义者 A/B 测试有许多替代方法,本文将重点介绍一种特定的贝叶斯方法,它可以标准化和自动化,类似于分裂测试:

“A/B 测试的更智能版本”

据《远见》中的 Kai Rikhye 所说

多臂土匪简介

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

Photo by Steve Sawusch on Unsplash

请记住,我们希望更逐步、更早地向我们认为可能更好的方案发展,从而降低勘探成本并增加开采回报——这是一个经典的权衡。这就像我们想知道在赌场玩哪个老虎机(独臂强盗);如果我们知道每台机器的成功率,我们只会将资金投入到获胜概率最高的机器中,而完全忽略所有其他选项。然而,如果我们不知道这一点,我们需要探索各种选项,以估计所有机器的成功率,同时最大化我们可以从游戏中预期的总体(累积)回报。这个优化问题可以通过测试不同的选项并在可以观察到回报时强化它们来解决(因此出现了一个强化学习的问题)。然而,找到精确的解决方案是困难的。幸运的是,对于我们的用例来说,有足够的近似值。在本文中,我们将重点介绍一种叫做"汤普森抽样"的方法,该方法由 William R. Thompson 早在 1933 年提出,其基础是从每个期权的贝塔分布中随机抽取样本,贝塔分布由每个期权过去的成功 α 和失败 β 的密度函数来参数化

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

其中 θ 等于相应选项的成功率,γ表示γ函数。贝塔分布的重要特性是平均值等于 α / (α + β) (成功率=成功/试验次数),并且随着 α + β (试验次数)的增加,分布变得更加集中。因此,在给定抽取轮次中具有最高抽取样本的选项将被选择用于下一次试验,该选项可能具有高置信度的高成功率,并且可以被利用,或者它具有低置信度的任何成功率,并且仍然需要被探索。

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

Probability Density Functions, Source: https://en.wikipedia.org/wiki/Beta_distribution

建立了一些理论之后,我们现在可以继续实际模拟测试不同变体的性能时的分割测试和多臂强盗的行为。

实验:分裂与强盗

设置

我们将测试两种不同的方法(卡方分割测试,以下称为“分割”和 Thompson beta bandit,以下称为“bandit”),目的是通过从多个选项(例如不同的广告创意)中顺序地(在几个时期内,例如几天内)选择试验(例如向用户展示广告),来最大化累积的成功(例如广告点击)。基于上述这些算法的不同性质,我们预期不同的结果取决于由以下变量控制的不同环境:选项的数量、这些选项的真实成功率、每个周期的试验、置信水平(最大 p 值)和成功率不稳定性(标准偏差)。在探索替代方案之前,我们将从一个有两个选项和固定成功率(无偏差)的简单环境开始。

基本模拟

基本实验甚至可以在电子表格中模拟:

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

https://docs.google.com/spreadsheets/d/1a2ss3cepB6apQTH16uDwIo3gZ9kWBSxQD7ijM3vbcp0

在该表中,环境参数设置在单元格 A1:I3 中。基于这些,在单元格 A5:P13 中计算拆分和前 7 个期间的决策和结果。如前所述,每个周期的所有试验将平均分布在选项上,直到可以宣布具有统计显著性的获胜者。对于具有两个选项的场景,真实成功率为 1%和 1.5%,没有偏差,每个周期 2,000 次试验,最大 p 值为 0.1 (90%置信度),该方法在周期 6 之后检测选项 2 的更高成功率,并且从那时起仅试验该选项。L:P 列显示了总的、累积的成功以及与最佳情况的绝对和相对差异(损失),在最佳情况下总是选择了最佳选项。

单元格 A15:P23 用类似的方法计算强盗的这些值。为了可比性和实用性,该方法不是一次抽取一个样本并选择一个选项,而是通过周期性决策来实施,其中周期 t 中显示的选项的百分比等于它被基于周期 1 至 t-1 的数据构建的贝塔分布的 100 个随机样本选择的次数(所有周期的每个单独样本和选择可以在单元格 A25:R126 中看到)。有了上面描述的样本环境变量,我们应该找到更多的累积成功,因此与 Bandit 的最优选择相比,损失更小。这也可以通过分别绘制所有时期的绝对和相对成功来可视化:

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

这里变得明显的是——至少在这个基本的模拟中——强盗在所有时期都支配着分裂。因此,让我们通过改变不同的参数来检验这一结果的弹性。您可以在提供的电子表格中按顺序完成这项工作,但由于我们想要应用的这种和未来的变化更容易用 Python 模拟编码,我们现在将转向这一点。

分割类以可用选项的数量、试验、成功和失败向量作为 Numpy 数组以及(当前)p 值开始:

class Split():
  def __init__(self, num_options):
    self.num_options = num_options
    self.trials = np.zeros(shape=(self.num_options,), dtype=int)
    self.successes = np.zeros(shape=(self.num_options,), dtype=int)
    self.failures = np.zeros(shape=(self.num_options,), dtype=int)
    self.p_value = 1.0

然后,我们需要一种方法将一个时期的结果(试验、成功和失败)添加到一个分割实例中:

def add_results(self, option_id, trials, successes):
  self.trials[option_id] = self.trials[option_id] + trials
  self.successes[option_id] = self.successes[option_id] + successes
  self.failures[option_id] = \
    self.failures[option_id] + trials - successes

最后,我们将重新计算当前状态的 p 值:

def calculate_p_value(self):
  observations = []
  for i in range(self.num_options):
    observations.append([self.successes[i], self.failures[i]])
  self.p_value = \
    chi2_contingency(observed=observations, correction=False)[1]

chi2_contingency 函数可以在 SciPy 库的 stats 模块中找到,它使用与上述电子表格相同的过程从给定的列联表中计算 p 值。

类似地初始化 bandit,只是我们不需要 p 值或故障向量,而是包括先验元组,该先验元组可用于利用现有先验信息创建 Bandit,以构建上述 Beta 分布:

class BetaBandit():
  def __init__(self, num_options):
    self.num_options = num_options
    self.prior = (1.0, 1.0)
    self.trials = np.zeros(shape=(self.num_options,), dtype=float)
    self.successes = \
      np.zeros(shape=(self.num_options,), dtype=float)

可以用与分割相同的方式添加结果(只是没有失败)。

现在,我们可以从所有选项的基本 beta 分布中选择一个选项作为最高采样值:

def choose_option(self):
  sampled_theta = []
  for i in range(self.num_options):
    dist = beta(self.prior[0] + self.successes[i],
                self.prior[1] + self.trials[i] - self.successes[i])
    sampled_theta += [dist.rvs()]
  return sampled_theta.index(max(sampled_theta))

beta 函数也是 SciPy 库的 stats 模块的一部分, rvs() 根据底层分布返回一个随机变量。

对于批量模拟,我们需要重复选择选项:

def repeat_choice(self, repetitions):
  option_counts = np.zeros(shape=(self.num_options,), dtype=int)
  for _ in range(repetitions):
    option = self.choose_option()
    option_counts[option] += 1
  return option_counts

然后,基本模拟充分运行到上面的电子表格示例:

  1. 初始化分裂和强盗
  2. 添加第一阶段的结果,并在所有选项中平均分配试验
  3. 重新计算拆分的 p 值
  4. 如果 p 值< max p-value: Add results to Split with equal distribution of trials over all options, else: Add results to Split with all trials for best option (with most successes)
  5. Choose batch options for Bandit and add results with distribution of trials as in choices
  6. Start again from 3.

The results are (almost, accounting for the randomness of the beta sampling) the same as already seen above:

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

Before we continue with the elasticity experiments, let us examine 28 instead of 7 periods:

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

The long term differences between Split and Bandit are smaller since the Split finds the optimal option after the 6th period and after that allocates all trials to that option where the Bandit still occasionally tries the weaker option (although very sparsely). Still, also after 28 periods the Bandit has outperformed the Split.

Okay, you want to know if that changes after 100 periods? It does not:

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

After this basic experiment, we want to take a final closer look at how the various simulation parameters affect the results before coming to a conclusion about when and when not to A/B test.

参数弹性

p 值

我们想分析一些环境参数对实验结果的影响,从不同的 p 值开始(回到 28 个周期的默认观察长度):

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

我们可以看到,p 值越高,结果越好(越接近最优值)。不过,我们必须小心,在我们的模型中使用更高的 p 值来得出结论,因为这将导致更多的假阳性(I 类错误),从而增加选择次优选项作为“赢家”的风险。对于剩余的实验,我们将 p 值设置为 0.1,因为我们可以错误地拒绝变量之间无显著差异的零假设 10%。

审判

看看 Split(左)和 Bandit(右)的不同试验编号:

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

正如我们所预料的,更多的试验会导致对分割测试结果更高的信心,从而更快地找到最佳选择。对于这两种方法,我们可以观察到一个看似渐进的行为(更多试验的边际改善减少)。

成功率

虽然我们能够影响 p 值,也可能影响在现实世界中试图找到实现我们目标的最佳选项时的试验次数,但真正的成功率通常与我们的行动无关(这里不涉及 Schroedinger)。因此,这两种方法的区别在这里更为重要(同样,左边是分裂,右边是 bandit):

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

同样,这种分割是由强盗控制的,如果可用选项的实际成功率差异很小,情况就更是如此。在[0.01,0.012]的情况下,Split 甚至在 27 个周期之后都没有找到最优选项。

不确定

当真正的成功率不是完全不变的(在“真实世界”环境中很可能不是这样),而是正态分布,标准偏差为平均值的 50%时,结果会发生相当大的变化:

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

这些结果显然取决于诱发的随机状态,在不同的状态下,它们可能看起来非常不同:

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

一般来说,在概率更大的环境中,强盗的优势不太明显。

现在让我们比较两种方法在不同不确定性水平(成功率标准偏差)下的结果:

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

更多选项

最后但同样重要的是,我们想看看有两个以上竞争选项的场景。有 11 个不同的选项,平均分布的真实成功率在 1%和 2%之间,相对于最佳成功率的 Bandit 结果如下所示(左边是成功率无偏差,右边是平均值的 25%标准偏差):

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

当有更多选择时,这两种方法都做得更差。不过,在 Split 找到最佳选择之前,Bandit 的表现远远超过它。然而,当实验运行的时间足够长时,最终结果看起来完全不同:

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

虽然分裂在确定性环境中击败了强盗,但强盗似乎更少受到引入的不确定性的影响,即使从长期来看也是如此。

真实世界的例子

这里的场景是一个数字广告活动,有 50 个不同的广告组合(选项),随机(统一)分布的点击率(真实成功率)在 1%到 4%之间。点击率的标准差是它们各自平均值的 50%。将有 5000 个试验,每个试验将持续 28 个周期。我们将分割的 p 值保持在 0.1。结果如下:

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

从 8904 个可能的成功中,分裂得到 4346 个,强盗得到 3968 个。坏消息是,与每个时期的真实成功率已知的情况相比,这两种方法都留下了超过 50%的可能性。好消息是,这两种方法都将基本比率(3137 次成功)提高了至少 26%。

结论

要回答最初的问题“何时不使用 A/B 测试”:特别是当勘探成本高且短期开采重要时,和/或当处理不确定(即概率性)环境时,Bandit 在寻找和使用最佳选项并最大化效率方面提供了一个非常好的、更优越的选择。然而,当分割(A/B 测试)确信已经确定了最佳选项时,它可能会产生更好的结果。

因此,一个明显的结论和进一步研究/测试的开始可以是在混合模型中结合两种方法,使用 Bandit 直到分割置信度足够大(p 值小于定义的最大值),然后利用分割将选项集减少到成功率最高的较少“赢家”,之后再次使用 Bandit 为下一期选择选项,直到分割的 p 值再次足够小,以此类推…

不过,还有一个我们尚未涉及的警告:期权的成功率及其分布可能会随着时间的推移而发生变化。如果是这种情况,我们可能根本不想减少可能的选项集,而是用任何新的观察结果灵活地调整我们的决策过程。由于分割的基础是基于限制选项,即确定赢家,这将极大地影响这种方法在这种环境下的拟合度。然而,Bandit 在每个新的观察(集合)之后更新其关于世界的信念,可以被构造来处理这样的行为,例如,通过引入折扣函数,当选择下一时段的优选选项时,减少旧结果的影响。为了简要强调拆分在改变成功率方面的缺陷,看一下比率意味着每周期增加或减少 5%的场景(实际上,例如,你可以想象由于受众发展,显示给一个特定受众的广告的点击率随着时间增加,例如,通过重新定位,而显示给另一个受众的广告的点击率由于饱和而下降):

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

正如你所看到的,分割现在甚至不能超过随机基础分配了。土匪似乎几乎不受影响,虽然它可能会得到进一步改善,提到折扣旧的结果。

所以总而言之,

在测试不同变体或场景的性能时,Bandits 提供了您的首选方法

如果你还在使用 A/B 测试,你至少应该考虑转换。

在我离开你并期待收到你的反馈、评论和想法之前,我想感谢你陪我看了这么长而激烈的文章。作为一个小玩意,我为你们中任何想使用 Bandit 进行数字营销活动的人制作了一个广告优化工具:【optimizer.stagelink.com】

除此之外,你可以在我的 Github 上找到所有用于讨论模拟的代码:github.com/kinosal/optimizer

再次感谢,并尽快与您联系!

当自动化反噬时

原文:https://towardsdatascience.com/when-automation-bites-back-8541b061d5ee?source=collection_archive---------21-----------------------

不诚实的自动化业务以及背后的工程师、数据科学家和设计师如何修复它

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

Photo courtesy of Nicolas Nova.

“飞行员持续战斗,直到飞行结束”,调查 2018 年 10 月 29 日坠毁的狮航 610 航班的负责人 Nurcahyo Utomo 上尉说,机上 189 人遇难。对黑匣子的分析显示,这架波音 737 飞机的机头被反复压下,显然是由接收到错误传感器读数的自动系统造成的。在悲剧发生前的 10 分钟内,飞行员曾 24 次尝试手动拉起机头。他们与故障的防失速系统进行了斗争,他们不知道如何为特定版本的飞机解除该系统。

这种人类与顽固的自动化系统斗争的戏剧性场景属于流行文化。在 1968 年的科幻电影《2001:太空漫游》的著名场景中,宇航员戴夫要求哈尔(启发式编程算法计算机)打开飞船上的舱门,哈尔反复回应,“对不起,戴夫,恐怕我做不到

1.自动化的商品化

令人欣慰的是,数字自动化的当代应用是局部的,并没有像哈尔那样采取“人工一般智能”的形式。然而,曾经专门应用于驾驶舱等关键环境中自动化人类工作的计算任务已经进入人们的日常生活(例如,自动寻路、智能恒温器),这些技术通常用于更琐碎但非常有利可图的目标(例如,定向广告,优先选择 YouTube 上的下一个视频)。

“令我担忧的是,许多工程师、数据科学家、设计师和决策者将数字摩擦带入了人们的日常生活,因为他们没有采用方法来预见他们工作的限制和影响”

曾经依赖基于作者对世界的理解的编程指令的自动化系统,现在也从传感器和人类活动的数据集中找到的模式来模拟它们的行为。随着这些机器学习技术的应用变得广泛,数字自动化正成为一种商品,其系统在互联网规模上执行一项任务,而无需深入理解人类环境。这些系统被训练来完成“一个”工作,但有证据表明,当事情没有按预期发展时,它们的行为,如 HAL 或波音 737 防失速系统,可能会违背用户的意图。

2.笨拙的边缘

在不久的将来的实验室,像 #TUXSAX好奇的仪式最近的视觉民族志揭示了自动化商品化的一些含义。在导致狮航 610 航班坠毁的完全不同规模的戏剧性后果中,这些观察强调了一些数字解决方案如何让人们有一种被“锁定”的感觉,没有从顽固行为中脱离的“退出”键。这些数字摩擦中的绝大多数都会在人们的日常生活中引发无害的微挫折。它们通过校准不良的系统和忽视边缘情况的设计表现出来。例如,经常会遇到语音助手无法理解某种口音或发音,或者导航系统由于位置不准确、过时的道路数据或不正确的交通信息而误导驾驶员。

Curious rituals is a fiction that showcases the gaps and junctures that glossy corporate videos on the “future of technology” do not reveal. Source: Curious Rituals.

这些笨拙的自动化可以减轻,但不会消失,因为不可能为所有意想不到的限制或后果设计应急计划。然而,其他类型的顽固自主行为被有意设计为商业模式的核心,以人类控制换取便利。

3.不诚实的自动化行业

许多自动化日常任务的技术使组织能够降低成本并增加收入。科技行业的一些成员利用这些新的技术能力将客户或员工锁定在他们没有合法需求或愿望的行为中。这些系统通常被设计成抵制用户的需求,并且很难脱离。让我给你举几个我称之为“不诚实的自动性”的例子:

3.1.数据肥胖

自动云备份系统已经成为操作系统的默认功能。他们将个人照片、电子邮件、联系人和其他数字生活的存储具体化。他们的商业模式鼓励客户无休止地积累更多内容,而没有一个明确的替代方案来促进数据的适当卫生(即,还没有人提出“Marie Kondo for Dropbox”)。不管提供商的承诺如何,人们越来越难以从云存储服务中清理他们的数字生活。

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

Upgrade your storage to continue backing up: an automatic cloud backup system that locks in its user, leaving no alternative to the accumulation of content.

3.2.系统老化

今天的应用程序自动更新通常会增加对资源和处理能力的需求,以进行表面上的改进,这几乎是在故意试图让硬件过时,让软件更难操作。在多年逍遥法外之后,现在反对系统报废的意识更强了,因为这是一种浪费,而且剥削消费者。

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

3.3.数字注意力

随着互联网上的内容呈指数级增长,(社交)媒体公司越来越依赖自动化来过滤信息并将其发送给每个用户。例如,YouTube 自动为 15 亿用户播放数十亿个视频。这些算法旨在促进更高参与度的内容,并倾向于引导人们反对他们的兴趣。

鉴于这些笨拙和不诚实的自动化例子,我担心的是,许多工程师、数据科学家、设计师和决策者将这些摩擦带入人们的日常生活,因为他们没有采用方法来预见他们工作的限制和影响。除了高效解决方案的工程设计之外,自动化还要求专业人员思考他们实践的基础和结果,这些超越了他们组织的任何关键绩效指标。

4.人性化自动化设计

自动化的设计不是要消除人类的存在。它是关于人性化、尊重和信任的系统的设计,这些系统自动化了人类活动的某些方面。当与该领域的数据科学家、设计师和工程师合作时,我们设想系统超越“用户”和要自动化的“任务”的范围。我鼓励团队 a)从过去中学习 b)评论现在,c)讨论未来。让我解释一下:

4.1.从过去吸取教训

当谈到自动化时,学术界和工业界的知识获取并不是分开的追求。在过去的 50 年里,研究机构对自动化人工任务和决策的含义进行了大量的研究。关键发现有助于在关键环境中节省资金,并防止大量致命错误(例如在驾驶舱中)。

今天,这种知识并没有转化为日常任务。例如,许多工程师或数据科学家不掌握由科学和技术研究或人机交互研究社区理论化的自动化偏差(即人类倾向于支持来自自动化决策系统的建议)或自动化自满(即人类对监控自动化结果的关注减少)等概念。可悲的是,只有少数组织推动聚集学者、艺术家、工程师、数据科学家和设计师的平台。处于数字化进程中的行业将从这种专业人员的相互交流中大大受益,这些专业人员从他们学科之外已经出现的考虑中学习。

4.2.批判现在

我认为,参与人类活动自动化业务的专业人员应该是他们的同行所部署的解决方案的坚持不懈的关键评审者。他们应该成为今天人们如何处理现代生活中出现的笨拙、不诚实、令人讨厌、荒谬和任何其他尴尬的数字技术的跟踪者。

#TUXSAX is an invitation to engage with these knotty, gnarled edges of technology. It provides some raw food for thoughts to consider the mundane frictions between people and technologies. Do we want to mitigate, or even eliminate these frictions? Source: Documenting the State of Contemporary Technology.

当被恰当地记录下来时,这些观察为众多“天真的乐观主义”和科技行业迷人的乌托邦式愿景提供了一种补充形式的灵感。它们为专业人员提供了质疑自动化可能存在偏见的目标的材料。此外,他们为定义组织中可实现的目标做好准备(例如,smart/intelligent 是什么意思?,如何衡量效率?,什么必须变得易读?).

4.3.辩论未来

在今天的互联网中,即使是最简单的应用程序或连接对象的设计也已成为一项复杂的工作。它们建立在分割的操作系统、众多协议、版本、框架和其他可重用代码包之上。数字摩擦的缓解超出了保证应用程序健全性的“质量保证”团队的范围。它们也是关于记录对技术生存环境的影响、意想不到的后果和“假设”情景。

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

It’s easy to get all Silicon Valley when drooling over the possibility of a world chock-full of self-driving cars. However, when an idea moves from speculation to designed product it is necessary to consider the many facets of its existence — the who, what, how, when, why of the self-driving car. To address these questions, we took a sideways glance at it by forcing ourselves to write the quick-start guide for a typical self-driving car. Source: The World of Self-Driving Cars.

一般来说,设计虚构是一种引发对话和预测有关人类活动自动化的更大问题的方法。例如,我们制作了亚马逊 Helios: Pilot 的快速入门指南,这是一部虚构的自动驾驶汽车。在那个项目中,我们确定了涉及自动驾驶汽车人性方面的关键系统,并以一种非常有形、引人注目的方式为设计师、工程师和其他任何参与自动化系统开发的人带来了这种体验。通过集体创作,《快速入门指南》成为了一个图腾,任何人都可以通过它来讨论后果、提出设计考虑和形成决策。

5.信托业务

像许多技术进化一样,日常生活的自动化不会没有为了方便而交易控制的摩擦。然而,后果比减轻边缘案件更大。它们反映了人类、组织或社会的选择。部署系统的选择误导了他们与人民和社会利益相冲突的意图。

马克·魏泽在 90 年代关于普适计算的开创性工作中,强烈影响了当前计算领域的“第三次浪潮”,当时技术已经退居人们生活的背景。科技行业的许多专业人士(包括我)都接受他对冷静技术的描述,即“告知但不要求我们关注或注意”然而,魏泽和其他许多人(包括我)没有预料到的是一个不诚实的自动化或解决方案的行业,当事情没有按计划进行时,它们会违背用户的意图。我们也没有真正预料到自动化会在多大程度上反作用于部署自动化的组织,而这些组织遭到了客户、社会和决策者的强烈反对。

这些暗示为任何参与数字自动化业务的组织提供了超越纯技术和商业的替代范例。例如,一种促进尊重(过度高效)、清晰(过度冷静)和诚实(过度聪明)技术的范式。当专业人员(例如,工程师、数据科学家、设计师、决策者、高管)游离于他们的实践之外,运用批判性思维来揭露不诚实的行为,并使用虚构来做出考虑超出“用户”和要自动化的“任务”范围的影响的决策时,这些就是出现的价值类型。

我认为,在自动化行业中,维持现状、不发展成信任企业的组织可能最终需要处理声誉受损及其对内部价值观、员工道德、收入以及最终利益相关者信任的影响。

我积极参与人文科技的发展。如果你想用其他范式或不同方法来设计尊重人民和社会利益的技术,请随时发表评论或联系我

感谢 Nicolas Nova 和 Jose Antonio Rodriguez 对本文提出的周到建议。

原载于 2019 年 1 月 16 日blog.nearfuturelaboratory.com

当生日冲突时

原文:https://towardsdatascience.com/when-birthdays-collide-6e8a17b422e7?source=collection_archive---------24-----------------------

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

Happy birthday! Photo by Marina Utrabo on Pexels

想象一个挤满了人的房间——准确地说是 23 个人。也许你在一个高中班级,也许你正在参加一个低调的社交活动。这两个人同一天生日的几率有多大?(为了简单起见,假装闰年不存在,所以没有人在 2 月 29 日出生。)

你的第一个假设可能是这些人的生日在一年中均匀分布。或许你可以推断出,平均来说,一年的 12 个月中每个月都有两个人出生(除了一个月),所以对于每个月来说,这两个人中的任何一个在某一天出生的概率大约是 1/30。因此,这 23 人中有两人在同一天出生的可能性一定非常非常低。对吗?

**错了!**在 23 人的小组中,有 50%的几率两人同一天生日。当人数增加到 80 人时,赔率跃升到惊人的 99.98%

如果这看起来令人困惑,那只是因为它确实如此。生日悖论感觉非常违反直觉,直到你看到背后的逻辑。我们就这么做吧!

为了更好的理解这个问题,我们先从数学上来分解一下。

对于任何两个随机选择的人来说,他们有 1/365 的机会在同一天出生(假设他们不是在闰年出生)。因此,这两个人在不同的日子出生的概率是 364/365。

为了找出一个组中所有个体都有唯一生日的概率,我们将 364/365 提升到组中有对的次方。使用 23 人小组的介绍性示例,这意味着我们想要确定我们可以将这 23 个人分成两个小组的方法的数量。

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

Photo by Curtis MacNewton on Unsplash

从数量为 n 的项目中挑选数量为 k 的项目的公式如下:*n!/ ( k ( nk )!)**当我们为 k 插上 2,为 n 插上 23,我们的结果就是 253。因此,在我们 23 个样本中有 253 个可能的配对。当我们取 364/365 并将其提升到 253 次方时,结果是~0.4995,表明 23 个陌生人没有一个出生在同一天的概率为 49.95%。通过从 100.00%中减去这个结果,我们能够最终获得至少一对拥有相同出生日期的概率:~50.05%。

生日悖论令人着迷的原因有很多。对于程序员来说,理解生日悖论很有用,因为它解释了哈希冲突的概念。

在我们深入探讨碰撞之前,我们先来讨论一下哈希表(也称为哈希表)。哈希表是一种以随机顺序存储项目的数据结构。这些项目存储在中,其数量由程序员决定。一个散列函数(Python 中的一个内置函数)负责将每一项分配给一个特定的桶索引号。

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

Look, it’s a bucket. Photo by Gregory Culmer on Unsplash

为了完成这个重要的任务,hash 函数为您想要存储的内容分配一个随机生成的数字。然后,它将这个随机数除以哈希表中有多少个存储桶。这个除法的余数是桶索引,然后内容被放在相应的桶中。

你可能会认为散列会导致项目在桶中的平均分布,就像你可能会推断 23 个陌生人的生日可能分布在日历年中一样。但是我们从数学上观察到,有大约 50%的可能性两个陌生人同一天过生日。我们还观察到,当这个小组只有区区 80 个人时,这种可能性会跃升至近 100%。

让我们把每个日历日想象成散列表中的一个桶。当其中一个陌生人发现他们的出生日期与一个小组成员的出生日期一致时,这就相当于一个新项目被分配到一个已经包含一个项目的桶中。这个事件被称为哈希冲突。你不需要在哈希冲突发生之前拥有大量的条目——毕竟,我们只需要一小群人来解释生日悖论。

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

Chaining! Photo by JJ Ying on Unsplash

有两种主要的方法来处理哈希表中的冲突。第一个是线性探测,它通过将新项目分配给下一个桶来处理冲突。第二个是链接,这需要将新的项目插入到桶中,即使那里已经有一个项目。哈希表通常用链表实现,这是一种线性数据结构。这意味着,除非是空的,否则每个桶都包含一个项目链表。因此,当一个条目被添加到一个已经包含某些内容的桶中时,这个新条目只是被添加到链表的末尾。

生日悖论就像一个哈希冲突解决方案。显然,在任何一天都有可能有不止一个人出生在 T21。因此,可以说真实世界的生日哈希表解决了它与链接的冲突!

参考资料和进一步阅读

当商业分析遇到机器学习

原文:https://towardsdatascience.com/when-business-analytics-meets-machine-learning-10ecaada9d8?source=collection_archive---------8-----------------------

对你的第一个数据科学项目有什么期望?商业指南。第三部分

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

Photo by Olav Ahrens Røtne on Unsplash

这是“从你的第一个数据科学项目中期待什么——企业指南”系列的第 3 部分。你可以在这里 阅读之前的部分 在这里

在一家大公司听到的对话:

PMO:嘿,John,我们正在使用敏捷方法启动一个新项目,你愿意管理它吗?

IT 项目经理约翰:当然,没问题。你已经有所有的规格了吗?

商业惯例和习惯很难改变,尤其是在成熟的大公司。引入新的工作方式极其困难,但让人们以不同的方式工作几乎是不可能的。这些公司和商业行业普遍存在巨大的文化惯性。

使用机器学习是那些将使人们以不同方式工作并将在未来使商业环境不同的变化之一。此外,这是数据科学和业务数据分析之间的另一个巨大差异,因此对话很好地从上一部分开始。

今天,人们倾向于交替使用数据科学、人工智能和机器学习,因为我们生活在这些概念一起使用的历史时刻。但这并不意味着它们是一样的。其实都是不同的概念。

数据科学和人工智能是两个有自己实际目标的领域:首先寻求解释数据,而后者则自动化需要人类认知努力的任务。数据科学为企业提供了洞察力,并用于决策。AI 更多的是业务运营的自动化或者业务系统的维护。他们可能共享相同的模型,只是结果的使用使他们成为数据科学或人工智能。

机器学习本身不是数据科学或人工智能的一部分——只是一种让现代数据科学和人工智能发光的方法。这是一个通用的数学和软件开发概念,有些人将其视为软件 2.0 ,但我更愿意称之为示例驱动编程。

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

机器学习是一种对算法进行编程的方式,以我们想要的方式进行预测或行动,而不提供算法应该遵循的规则。相反,我们提供数据和期望的响应,并让计算机从提供的示例中自己学习这些规则。

就是这样!这就是机器学习的整个概念。

它与基于规则的编程完全相反,基于规则的编程主导着公司的 It 环境(以及一般的软件开发)。它是一种编程范式,其中程序被构建为计算机应该遵循以实现期望结果的配方。在商业环境中,这些配方被称为业务规则,它们通常由业务分析师设计和维护。

基于规则的方法有许多优点:规则可以被记录、审查,它们对人类来说是自然的,并且它们给人一种安全感。多年来,它一直很好地服务于大多数场景,包括商业智能。典型的 BI 报告是根据业务分析师设计的业务规则计算的,并在报告规范中明确列出。

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

Photo by Nicolas Thomas on Unsplash

然而,当没有人知道如何找出计算机要遵循的规则时,这种方法并不奏效。或者随着时间的推移,规则变得如此复杂,以至于失去控制,这种情况也经常发生。

在机器学习范式下,数据本身成为一种规范。

这就是机器学习发挥作用的地方。代替规则,商业必须提供(通常,许多!)真实数据的例子。他们必须对数据进行预处理,通常包括基本的过滤和标记。例如,如果一个企业想要建立猫和狗的图像分类器,他们必须提供几千张来自他们真实业务实践的图像。他们还必须手动标记这些图像,告诉每张图像上是猫还是狗。

示例选择和标记是为 ML 算法指定期望行为的方式。这两者和为基于规则的解决方案设计规则一样重要,比如 BI。

“垃圾进,垃圾出”的概念也同样适用于机器学习。

为训练机器学习模型准备数据仍然是人类的任务。在未来 ML 驱动的组织中,这将是业务分析师的新职责。他们将不再自己设计业务规则——他们将为机器学习算法设计训练场景,以学习这些规则。像以前一样,他们还将负责验证测试结果并签署解决方案以投入生产。

这一职业的变化将类似于几十年前商业分析师的情况,当时计算机取代了他们的手工计算。过去,有人担心公司不需要那么多分析师,但看看发生了什么——业务分析变得越来越复杂,现在需要更多的分析师。他们中没有一个人像前计算机时代的同事那样使用纸笔。这正是机器学习即将发生的事情。

机器学习不会让商业分析师变得多余,但会让他们与众不同。

在引入人工智能和数据科学之前,这是商业领袖必须在整个组织中传达的一个非常重要的信息。

黑盒

还有一个重要的问题让人们对机器学习感到焦虑:大多数时候,通过机器学习计算的规则无法转换回人类可以理解的格式。这些规则只是数字的数组,可以是巨大的,达到数百万个值。这对人类来说太多了,难以消化,也看不到它们背后的任何意义,这就是为什么大多数机器学习算法被视为黑盒。

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

Photo by Christian Fregnan on Unsplash

在 XAI(可解释的人工智能)倡议下,人们试图使它们更加透明,但它们往往有一个根本的缺点:

为了解释机器学习,XAI 的方法使用了更多的机器学习。

这些技术更多的是描述而不是解释。正如 Cassie Kozyrkov 精彩指出的那样——可解释的人工智能只是提供了一个不完整灵感的良好来源。在复杂的 ML 算法中建立信任的唯一方法是仔细测试,而不要求完全理解它是如何做出决策的。因此,从 ML 算法中获取业务规则是没有希望的。

企业喜欢他们的规则!他们不喜欢用信任来取代它们的想法,即使这种想法得到了全面测试的支持。

希望将数据科学,尤其是人工智能引入其业务的领导者必须考虑到这一点。机器学习很可能会随之而来,当人们不信任算法并希望大量手动控制破坏人工智能自动化的整体理念时,它可能会在内部遇到阻力。

要求明确的规则只是商业运作中的习惯和传统,从人类执行商业规则的时候就出现了。今天,业务操作基本上是自动化的,它们以人类可读的格式编写的唯一原因是它们是由人类设计的。随着机器学习的采用,商业规则不再必须是人类可读的。这将只是一个信任的问题,企业必须学会赢得人工智能竞赛。

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

The remains of the Roman Forum, the birthplace of the modern civilisation. These structures were built without structure analysis theory. They were built on trust in the architect’s practical experience and best practices of the time. Image by jacqueline macou from Pixabay

还有许多其他重要的领域,在那里实践先于理论,在那里人们习惯于在找到所有为什么的答案之前相信测试:土木工程、制药工业、神经科学等等。例如,在 20 世纪结构分析的理论模型被广泛采用之前,土木工程是基于建筑师几千年的实践经验。归根结底,神经科学仍然无法解释我们的大脑是如何做出决定的。

摘要

机器学习与数据科学和人工智能密切相关,这意味着也必须考虑它的影响。当人工智能和机器学习被引入商业运营时,这些影响可能会对既定的商业文化构成挑战:

  1. 机器学习不是基于规则的,因此传统的商业规则在基于机器学习的解决方案中不起作用
  2. 机器学习是示例驱动的。为了“训练”算法以期望的方式运行,企业必须提供一组来自其真实实践的相关数据示例。
  3. 大多数机器学习算法缺乏商业规则的透明性
  4. 机器学习不会让商业分析师变得多余,但会让他们与众不同

这些暗示在使用机器学习时自然会造成一种对商业运作失去控制的感觉。商业中的下一个自然反应将是通过放置多个手动“旧式”控制来破坏人工智能自动化的整个想法,从而补偿这种损失。

避免这种情况的最佳方式是通过仔细和多样的测试来培养对机器学习解决方案的信任。对于商业和数据科学家来说,这都是一项艰巨的工作,尤其是在人工智能旅程的开始,但为了在商业中成功采用人工智能和数据科学,需要完成这项工作。

就像几十年前计算机被引入工作场所一样,将人工智能自动化成功引入商业运营不会对商业分析师构成威胁。这将使他们变得与众不同,更有效率…最终

你可以在LinkedInTwitter脸书 上找到我**

什么时候可以和机器进行有意义的对话?

原文:https://towardsdatascience.com/when-can-i-have-a-meaningful-conversation-with-a-machine-part-1-655fefa20f45?source=collection_archive---------25-----------------------

我多久能取代我的朋友?

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

Joaquin Phoenix in Her (2013)

现在几乎每个网站都用聊天机器人来问候你。由于自然语言处理(NLP)和深度学习的进步,它们从具有有限对话能力的简单程序到智能的、具有对话能力的机器人。

一些众所周知的例子是:

  • 聊天机器人(简单): CleverbotSmarterchild
  • 虚拟助手(高级):Siri、Alexa、Cortana、谷歌助手
  • 真实机器人(前沿):索菲亚,第一个被授予沙特公民身份的机器人

尽管这些机器人的复杂性差异很大,但有一点是肯定的:它们正在变得更好。有一天,对他们说话可能和对另一个人说话没什么区别。这就引出了一个问题——有没有一天我们能够像和其他人一样和机器人进行有意义的对话?

为了回答这个问题,我们要看看:

  1. 我们今天在哪里
  2. 我们要去哪里
  3. 图灵测试和一般智力

让我们开始吧:

我们今天所处的位置:

聊天机器人自 1966 年就存在了。从卑微的文本开始,到采用声音和神秘的面孔,他们已经在各种行业中充当信息经纪人。

最近,聊天机器人获得了媒体的 关注中的很多 ,这并不奇怪,因为它们是迄今为止人工智能最“人类”的面孔。但是,这个包罗万象的术语背后的机器人如何工作有很大的差异。

虽然相对简单,聊天机器人在响应常见的结构化查询方面做得很好。NLP 的最新进展,其中许多都基于聪明的深度学习技术(如 GloVe、Word2Vec、 ELMo 和 BERT ),让这些机器人对语言有了更细致的理解,从而能够更有效地应对更广泛的问题。

然而,这些机器人的主要用途不是进行对话,而是作为一种处理和交流信息的手段。我们可以问简单的问题,他们给出简单的回答。

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

Credit: WordStream

这一趋势将继续下去。至少在不久的将来,这些机器人的目的仍然是作为信息的管理者。

然而,随着物联网世界变得更加普遍,这些机器人可能会演变成我们与互联世界沟通的媒介——人和机器之间的中间人。

这种未来的证据已经存在。

我们的前进方向:

最普遍的具有对话能力的人工智能的例子是虚拟助手。Siri、Alexa、Cortana 和 Google Assistant 已经走出了我们的手机,进入了我们的家庭。他们识别和处理自然语言查询的能力(“开灯”“昨晚比赛的最终比分是多少”“点两吨奶油玉米”)越来越令人印象深刻。

我们已经看到了聊天机器人+物联网互动的第一波浪潮,其采用率令人震惊。根据这篇文章,超过 3900 万美国人拥有声控智能音箱。这证明了人们发现了自然语言命令的价值,消除了学习新软件和 UI 来完成工作的需要。

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

随着时间的推移,我们将能够仅仅通过一个命令来协调我们周围的世界——想想托尼·斯塔克和贾维斯。

有一天,我们将能够仅仅通过声音的力量来命令网络物理物体执行我们的命令。

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

然而,机器人的角色仍然没有改变:一个处理和传递信息的仆人。但是,我们正在取得进展。按照这种速度,NLP 和 AI 最终将发展到这样一个地步,即与机器人说话就像与另一个人说话一样自然,我们可能不会仅仅将它们视为工具,而是视为同伴。根据定义,像这样的机器人将通过图灵测试。从这里开始,事情变得更加理论化,更加投机。

图灵测试

阿兰·图灵于 1950 年发明的图灵测试是一种测试机器表现出与人类同等或不可区分的智能行为的能力的测试

这项测试最初被设计用来判断纯文本对话——不需要语音或面部表情。与传统考试不同,没有严格的评分标准或评分系统;图灵测试可以作为一个有用的基准来衡量我们目前的进展。

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

Siri

艾伦·图灵最初想出了他著名的测试,这是他思考这个问题的结果:

机器会思考吗?

双方都提出了可信的论点(我们将在第 2 部分中探讨)。然而,可以认为思考的行为与无关。机器是否需要理解我们说的话才能做出适当的反应,或者只是知道说些什么作为回应,而不真正理解它们的话的意思?许多人认为是后者,这一观点建立在智力只是物理系统中的信息处理,不需要“思考”的基础上。

一个有点类似的问题可以这样提出:深夜谈话——关于生活、宇宙、欲望、动机、灵性的谈话——需要来自一个有生物学动机的、有思想的生物吗?或者一台机器可以和我们一起沉思,从它的内部现实模型中插入洞察力?

这些问题深得惊人。什么是“有意义的谈话”的答案取决于对对方有什么要求,因人而异。有些人乐于独白,只需要对方还在听的周期性肯定。然而,其他人需要他们的问题、意见和新观点的答案来帮助引导他们的思想。虽然有些人很容易满足,但大多数人属于第二类。此外,要让一台机器对如此复杂的对话做出有意义的贡献,它需要具备一般的智能。

普通智力

人工通用智能(在这篇令人惊叹的博客文章中有所解释),是一个用来描述具有与普通人类同等智能的机器的术语。这意味着跨越所有领域——解决问题、推理、学习能力、艺术欣赏、对科学的理解、幽默等等

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

换句话说,一个通过图灵测试的机器人愚弄了你,让你相信它是,这个机器人真的是。然而,并不是一般智力的每个方面都与我们的问题相关。它与我们唯一需要的共同点是:

  1. 复杂的现实内部模型
  2. 流体推理
  3. 工作记忆

这些(或多或少)是赋予人类谈论抽象、宏大和主观话题的能力的基本要素。我们谈论宗教、情感、艺术、意义和其他“人类”价值的方式纯粹是基于我们的大脑对我们周围世界的解释,以及我们如何通过这种理解进行推理。毫不奇怪,一台机器需要做同样的事情,以一种有意义的方式为这样的讨论做出贡献,至少是一种我们可以联系的方式。

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

We want to get to the point where a machines “world view” and ours align in complexity

但是,即使这三个条件都满足了,还有另一个障碍。一个拥有和我们一样的知识和推理能力的人工通用智能,处理速度还是会高很多。由于我们的生物大脑和计算机芯片的处理速度之间的差异,这个机器人可能在几分钟内完成多年的思考。在这一点上,对话变得毫无意义了吗?是的,甚至可能很无聊。未知的美,以及寻找答案的美。咨询神谕剥夺了探索问题的乐趣。

理论上,为了有效地与我们交流,高级智能可以表现得比现在更沉默,就像人类使用简单的语言和手势与动物交流一样。在这种情况下,与机器进行有意义的对话是可能的。如果你曾经拜访过心理学家,你会很快意识到他们不只是直截了当地告诉你答案,而是引导你通过他们对你当前状态的分析,并帮助你找到解决方案,理论上机器也可以做到这一点。

请放心,在今天的世界上,这样的事情是不存在的;差远了。我们人类(更确切地说,我们的大脑)是我们所知道的唯一普遍智能的事物(没什么说人工普遍智能需要以同样的方式远程观察或工作)。

简而言之,要让一台机器与我们进行有意义的对话,它需要像我们一样了解,有相同的推理水平,但也以相同的速度思考。这样的甜蜜点几乎不可能达到,更不用说持续下去了。进步是指数级的,即使有一天这样的机器存在,也很快会被超越。

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

Machines will likely be far superior than we are in too many ways to “relate” to us

所以,这就是我们的答案。这可能令人失望,但如果没有高级智能故意降低自己的幻觉,我们的机器人伙伴可能永远不会处于这样一个位置,即我们可以认为自己在智力上足够相似,可以进行有意义的对话。

结论

今天的技术无疑是未来机器人伴侣的先驱。虽然我们可能不知道意识到底是什么,也不知道机器是否能体验到它,但回答“我们什么时候能与机器进行有意义的对话”这个问题可能无关紧要。

由于人和机器在所有智力因素上的差异,我们不可能有一天能和机器人进行有意义的对话。然而,这并不妨碍我们与他们建立有益的关系。正如我们与其他物体——汽车、房子、其他具有实用价值或情感价值的财产——有联系一样,我们的人工智能朋友有一天也可以成为这个列表的一部分,并为我们个人和社会占据特殊的位置。

所以,总之,你现在最好还是交真正的朋友。

这是两部分故事的第一部分。第 1 部分旨在回答标题问题;第 2 部分将更深入地关注机器思维、情感和意识的哲学。如果你还有兴趣,可以去看看。

感谢阅读!

当聚类没有意义时

原文:https://towardsdatascience.com/when-clustering-doesnt-make-sense-c6ed9a89e9e6?source=collection_archive---------2-----------------------

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

Source

聚类前的考虑事项

聚类是最广泛使用的无监督学习形式之一。这是一个很好的工具,可以理解未标记的数据,并将数据分组到相似的组中。一个强大的聚类算法可以破译结构和模式,在一个数据集中,不明显的人眼!总的来说,聚类是一个非常有用的工具,可以添加到您的数据科学工具包中。

但是,聚类并不总是适合您的数据集。如果您有兴趣尝试使用聚类进行无监督的机器学习,请遵循以下五个简单的指南,看看聚类是否真的是适合您的数据的解决方案:

1。您的数据是否已经有了潜在的类别标签?

在数据中使用现有的类标签通常比尝试通过聚类为数据创建新标签更好。如果你可以选择,有监督的机器学习在分类任务中几乎总是胜过无监督的学习。

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

For this Olympic athlete data, the Medal attribute is an obvious choice for a class label.

如果您有数据,但无法将数据组织成有意义的组,那么集群就有意义。但是,如果您的数据集中已经有一个直观的类标签,那么由聚类分析创建的标签的性能可能不如原始的类标签。

2。你的数据是分类的还是连续的?

许多聚类算法(如 DBSCAN 或 K-Means)使用距离度量来计算观察值之间的相似性。因此,某些聚类算法在处理连续属性时会表现得更好。但是,如果有分类数据,可以对属性进行一次性编码,或者使用为分类数据构建的聚类算法,如 K-Modes。应该注意,计算二进制变量之间的距离没有太大意义。

了解不同的聚类算法在不同的数据类型上的表现对于决定聚类对您的数据是否有意义是至关重要的。

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

Height and weight are continuous attributes while Season is a categorical attribute.

3。你的数据是什么样的?

通过散点图对数据进行简单的可视化,可以深入了解数据是否非常适合聚类。例如,下面是奥运会运动员身高和体重的散点图。很明显,这两个属性有很强的正相关性,除了一些异常值之外,形成了一个密集的中心分组。

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

Scatter plot for height and weight

在对这些数据运行了几个聚类算法之后,没有形成明显的或有意义的组,并且确定这些属性不太适合聚类!然而,通过在分析的早期简单地可视化数据,这个结论可以更快地得出。

如果可视化显示您的数据没有大量的分离或不同的组,那么聚类可能不合适。

4。你有办法验证你的聚类算法吗?

为了信任聚类分析算法的结果,您必须有一种测量算法性能的方法。可以使用内部或外部验证指标来验证聚类算法的性能。

内部验证的一个例子是剪影得分,这是一种衡量每个观察值聚集程度的方法。轮廓图显示了聚类的相对大小、平均轮廓得分以及观察值是否被错误地聚类。下图中的红线表示六个聚类的平均轮廓分数:大约 0.45(1 表示完美,0.45 不是很好的分数)。

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

Silhouette plot using K-Means for Olympic athlete data

外部验证的一个例子是,数据集的类标签是已知的,但您想要测试特定的聚类分析算法在预测现有类时的表现如何。对外部验证方法的一个值得注意的警告是,如果数据已经有了类标签,就没有很大的聚类用例!

要对您的机器学习模型有信心,您必须有一个一致的衡量模型性能的指标。集群也不例外。您必须有一种方法来定量评估模型对数据的聚类效果。

在进行聚类分析之前,考虑哪种类型的验证和哪种指标对您的数据最有意义。某些算法可能在某些验证指标下表现得很好,因此您可能需要使用性能指标的组合来消除这个问题。如果您的模型性能一直很差,那么聚类就不适合您的数据。

5。聚类是否提供了对数据的新见解?

假设您满足了上述所有考虑因素:您有没有类标签的连续数据,您将数据可视化并且有一些分离,并且您选择了对您的分析有意义的验证度量。您对数据运行聚类算法,并获得相当高的轮廓分数。激动人心!不幸的是,你的工作还没有完成。

执行聚类分析后,检查单个聚类中的观察结果至关重要。这一步允许您评估集群是否提供了对数据的任何新见解。该算法真的找到了相似的观察组并最大化组内相似性,同时最小化组间相似性吗?

检查聚类的一种简单方法是计算每个聚类中观察值的简单统计量,例如平均值。下面是作为 K-Means 聚类结果的三个聚类的平均奥林匹克运动员身高和体重。

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

Individual Cluster Means

注意到什么奇怪的事了吗?平均身高和体重几乎相同。这表明,虽然该算法确实对数据进行了聚类,但这些聚类彼此之间并没有实质性的不同!如果聚类无法对您的数据产生任何新的或有用的见解,那么您的数据不太适合聚类。

结论

与任何数据科学任务一样,你不能只向数据扔算法。你必须了解你的数据,了解算法的初衷。即使您的数据不太适合聚类,您仍然可以尝试一下。探索你的数据永远不会有坏处,你永远不知道;你可以学到新的东西!

感谢阅读。用作示例的数据集可以在这里找到。请随时留下任何建设性的反馈或与我联系!

当数据稀缺时…获取有价值见解的方法

原文:https://towardsdatascience.com/when-data-is-scarce-ways-to-extract-valuable-insights-f73eca652009?source=collection_archive---------12-----------------------

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

Photo credit: Pixabay

现实世界中的数据科学

描述性统计、探索性数据分析和自然语言处理(NLP)技术来理解您的数据。

最近,我偶然发现滑铁卢地区的开放数据项目及其信息自由请求数据集。我的同事斯科特·琼斯已经在一系列帖子中使用机器学习(ML)技术对其进行了分析。ML 表现不佳是因为数据不足。虽然斯科特做了在这种情况下应该做的事情,即找到更多数据,但我很好奇这些数据还能告诉我什么,尽管很少。毕竟数据总有有价值。

在我带你进入这个 8 分钟的阅读之旅之前,我应该让你知道在 github 上的 jupyter 笔记本有所有的代码和更多关于这些数据的见解,所有这些都不能在这里讨论。如果你不想看笔记本,全套的图形结果可以在这个文件中找到。

在这里,我向你展示一些分析的要点。

了解数据

为此,我们使用了 pandas 库,下面是在 Open Data 中找到的一个文件的样子:

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

Sample of the 1999 Freedom of Information Request File

我们有 26 个文件,每年一个,从 1991 年到 2016 年,总共有 902 个请求,令人惊讶的是,所有的请求都有相同的 6 列。我们将只处理三个主要列,、S 请求摘要、决策。

  • 来源。这是提出请求的实体,也称为请求者*。通过查看多年来的信息,我能够将这些类别合并为“业务”、“个人”、“代理人的个人”、“媒体”、“代理人的业务”和“受抚养人的个人”。*
  • *请求摘要。*包含请求,该请求已经由职员编辑。
  • *决定。*合并后的类别为:“所有信息披露”、“部分信息披露”、“无记录”、“请求撤销”、“部分不存在”、“无信息披露”、“已转让”、“已放弃”、“拒绝更正”、“批准更正”、“无额外记录”和“提交异议声明”。

这些列是如何关联的?

描述性统计和探索性数据分析

在本节中,我们将重点关注列来源决策。稍后,我们将使用一些 NLP 工具来分析这些请求。以下是数据的分布情况:

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

大约 64%的请求是“全部信息公开”或“部分信息公开”。少于 25 个实例的决策有六种类型。一种重要的类型,“没有信息披露”,只占 4%。因此,我们不仅只有有限的数据,我们还有一个不平衡的案例。这对 ML 来说看起来不太好。

从数据的另一个角度来看,决策,我们看到大多数请求是由“企业”、“个人”和“个人代理”发出的。

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

将每个来源的这些数字标准化,即每行加 1,我们看到三个主要来源的情况都很好,因为“所有披露的信息”都超过 30%,而“部分披露的信息”又增加了 20%至 36%,使它们超过 50%。还有,‘代理个人’比‘个人’成功率高。“媒体”的请求很少,表现不佳,只有 12%的请求得到了“所有信息披露”。

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

自然语言处理

现在我们开始分析实际的’请求概要’。为此,我们求助于自然语言处理库,如 NLTK 和 spaCy,以及 scikit-learn 的帮助。

概括地说,在分析任何文本之前,有几个步骤需要做(见 Susan Li 的帖子):

  • 将文本标记化:将文本分成单个特殊实体/单词,即标记。
  • 删除任何不需要的字符,如回车符’ \n ‘和标点符号,如’-‘、’…‘、’ " '。
  • 删除 URL 或用一个单词替换它们,例如“URL”。
  • 移除屏幕名称或用一个单词替换“@”,例如“屏幕名称”。
  • 删除单词的大写。
  • 删除包含 n 或更少字符的单词。这种情况下, n = 3
  • 去除停用词,即语言中意义不大的词。这些词可能对我们的文本分类没有帮助。例如“a”、“the”、“and”等单词。没有一个通用的停用词列表。
  • 词元化,这是将一个单词的词尾变化形式组合在一起的过程,这样它们就可以作为一个单独的项目进行分析,通过单词的词元或词典形式来识别。

因此,在编写了单一用途的函数之后,我们可以用

def prepare_text_tlc(the_text):
    text = clean_text(the_text)
    text = parse_text(text)
    tokens = tokenize(text)
    tokens = replace_urls(tokens)
    tokens = replace_screen_names(tokens)
    tokens = lemmatize_tokens(tokens)
    tokens = remove_short_strings(tokens, 3)
    tokens = remove_stop_words(tokens)
    tokens = remove_symbols(tokens)
    return tokens

由于我们将不断地处理这些文本,我们只是将这些预处理过的文本作为一个新列“Edited_Summary”添加到数据帧中。

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

N-grams 和 WordCloud

我们还能如何分析和可视化我们的文本?作为第一步,我们可以找到哪些单词和短语是最常用的,即,我们可以获得单个单词(单个单词)和一般的 n 个单词(n 个单词的组合)及其在文本中的频率。

def display_top_grams(gram, gram_length, num_grams):

    gram_counter = Counter(gram)

    if gram_length is 1:
        name = 'unigrams'
    elif gram_length is 2:
        name = 'bigrams'
    elif gram_length is 3:
        name = 'trigrams'
    else:
        name = str(gram_length) + '-grams'

    print("No. of unique {0}: {1}".format(name, len(gram_counter)))for grams in gram_counter.most_common(num_grams):
        print(grams)
    return None

所以对于我们的单字来说,

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

并使用 WordCloud :

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

那么为什么‘移除’这个词如此突出呢?事实证明,出于隐私原因,原始请求上写的所有姓名、日期和位置都已被删除,并在开放数据文件中替换为诸如“位置已删除。}”或“{删除日期}”。这个有 30 多种变化。使用正则表达式(regEx)来清理文本,我们得到了一个更好的词云。这一次,我们也将允许二元模型。

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

看着上面的单词云和三元模型,

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

我们看到有一些常见的短语,如“安大略省工厂”、“环境现场”、“格兰德河运输”、“狂犬病控制”、“公共卫生”、“家庭儿童(护理)”和“食物中毒”(如在*“食源性疾病”*——记得我们对我们的令牌进行了词条化)。那么,这些短语在我们的文本中有多常见呢?用这样的短语请求信息会决定请求被批准的机会吗?事实证明,我们的数据中有 34%是这种类型的请求,只有很少一部分是“无信息披露”的决定,而且有明显的趋势:

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

例如,*“狂犬病控制”*有 95%的病例全部或部分公开,而有 5%的病例被转移。

请求摘要和已编辑摘要统计

我们已经知道我们的数据量是有限的,但是有限有多少呢?嗯,全文超过 100 字的请求只有 7 个,标记化文本只有 1 个。尽管中值是 14,但全文平均每个请求 18 个单词,而标记化文本平均 8 个单词,中值是 6。

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

词性标注

这里我们使用空间来标识我们的文本是如何由名词、动词、形容词等组成的。我们还使用函数 spacy.explain( ) 来找出这些标签的含义。

full_text_nlp = nlp(full_text)    # spaCy nlp()tags = [] for token in full_text_nlp:
    tags.append(token.tag_)tags_df = pd.DataFrame(data=tags, columns=['Tags'])print("Number of unique tag values:\
      {0}".format(tags_df['Tags'].nunique()))
print("Total number of words: {0}".format(len(tags_df['Tags'])))# Make a dataframe out of unique values
tags_value_counts = tags_df['Tags'].value_counts(dropna=True,
                    sort=True)
tags_value_counts_df = tags_value_counts.rename_axis(
                       'Unique_Values').reset_index(name='Counts')# And normalizing the count values
tags_value_counts_df['Normalized_Count'] = tags_value_counts_df['Counts'] / len(tags_df['Tags'])uv_decoded = []for val in tags_value_counts_df['Unique_Values']:
    uv_decoded.append(spacy.explain(val))tags_value_counts_df['Decoded'] = uv_decoded
tags_value_counts_df.head(10)

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

合并类别,如“名词,单数或复数”和“名词,复数”,以形成一个通用版本,下面是我们的请求是如何组成的:

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

使用 scikit-learn、散景和 t-SNE 的主题建模

在笔记本中,我们使用不同的技术进行主题建模,包括 scikit-learn 的潜在狄利克雷分配(LDA)函数,潜在语义分析(LSA),比较 CountVectorizer( )TfidfVectorizer( ) ,gensim 与 LDA,使用 t-分布式随机邻居嵌入(t-SNE)进行降维,以及 Bokeh 和 pyLDAvis 进行可视化。我们不会添加这里使用的完整代码,我们鼓励您看一看笔记本。鉴于我们的数据有限,所有工具都做得不错。这里有一个亮点,

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

几乎所有最常用的短语都出现在主题中。正如所料,一些主题是明确的,如“安大略作品”或“环境网站”,而其他集群没有这样定义。

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

机器学习

我们已经知道 ML 不会很好地工作,但是,考虑到这是一个学习练习,我们还是继续下去。在笔记本中,我们针对三种不同的情况比较了八种不同的 ML 模型。我们无法直接比较全部数据,因为有些案例的实例很少。例如,只有一个请求得到了“批准更正”,所以当我们训练我们的模型时,该案例将只存在于训练集或测试集中。只有一个案例并不能提供一个好的基础。我们几乎没有选择,

  • 我们可以丢弃少于 15 个实例的请求,称之为“超过 15”。
  • 我们将我们的全套决策分为三个基本类别:
    *所有披露的信息(加上“批准的更正”)。)
    部分披露的信息(加上‘部分不存在’。)
    未披露任何信息(加上“已转移”、“无记录”、“拒绝更正”、“无额外记录”、“提交异议声明”、“撤回”和“放弃”)。)这反过来会使我们的设置平衡
  • 我们可以放弃少于 15 个实例的请求,并放弃没有做出实际决定的决定,即撤销或放弃的案例,称之为“独立的”。

这是结果,

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

总的来说,逻辑回归和多项式朴素贝叶斯分类器,结合 tf-idf 给出了更好的结果。而宁滨我们的班级似乎是最合乎逻辑的方法。

代码和全套结果可以在这里找到。

当伦理是不够的:临床试验下和误报和不信任的癌症

原文:https://towardsdatascience.com/when-ethics-arent-enough-clinical-trials-under-and-misreporting-and-the-cancer-of-distrust-7c392bf753c0?source=collection_archive---------25-----------------------

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

Ben Goldacre 是牛津学院的校友,拥有医学学位和哲学高级学位,是一名认证医师和精神病学家。他还是英国一家顶级医疗机构的流行病学研究员。尽管有这些学术和专业的荣誉,他今天最出名的是一个报纸专栏和一本书,名字像邦·乔维的一首歌,“坏制药”【1】(gold acre,2013)。

Goldacre 认为,用药品治疗患者的那部分药物是一种假象,因为制造商平均隐藏了 50%的试验数据,医生没有时间或途径获得完整和真实的数据,监管机构也不关心。说监管者不关心可能是一种二分法思维错误。至少在英国,他们足够关心开始跟踪制造商发布的部分试验数据,但不足以迫使他们发布更多的数据(Goldacre,2013)。

此外,Goldacre 和他的同事后来写道,即使制药商确实公布了他们的试验数据,也往往是以一种几乎不可能有意义地解释和实施到患者护理中的方式进行的。这通常是因为使用了复合数据、主观终点和替代物(Heneghan,2017)。

至少在英国,监管者正在采取行动改善公众对公共卫生的信任和质量。今年 1 月,在 Goldacre 的第一本书出版 7 年后,下议院的科学技术委员会向 41 所英国大学发出了监控信,要求他们在 6 个月内改善临床试验数据的报告,或者预计被传唤到委员会解释为什么还没有更好(Dunn,2019)。

当如此多的金钱在药品销售中发挥作用时,民主国家受到企业游说者及其选民的影响一样多,人们很容易得出结论,利润只是被优先于知识诚信;然而,动机很少是单一的。在临床试验报告不完整的情况下,一些数据表明,非营利大学比制药商更糟糕。

2018 年,在一项回顾性队列研究中,由 Goldacre 领导的牛津大学团队发现,90%的英国大学未能按要求向欧盟临床试验注册机构报告完成后 12 个月内的临床试验数据。事实上,商业试验赞助商报告的结果比非商业试验赞助商多 6 倍(68%比 11%),较大的试验赞助商比较小的试验赞助商更有可能及时报告结果(78%比 18%) (Goldacre,2018)。

Goldacre 和他的同事认为,至少有一些失败是不明确的政策和沟通的结果。虽然法律要求申办者报告调查结果,但这是委托给首席研究员或行政人员,他们可能不知道(Goldacre,2018)。

作为一个案例研究,有人可能会说,这表明公共卫生或生物伦理的三个主要理论是不够的,即使全部应用。功利主义出现在审判中,表面上是为了确定什么是更大的利益。原则主义是存在的,因为审判是按照一套规则和标准进行的。此外,结果主义存在于那些让制造商和赞助商为未能遵循功利主义原则负责的法规中。

就社会后果而言,这一案例也可以作为不再相信政府的仁慈和效力的幻灭公众的素材,至少在美国有一半的公众是如此。即使不是大多数,也有多数美国人认为公司只为他们自己谋利,不信任科学和专家,政府无力纠正这种情况。

作为数字和公共卫生数据的消费者,我们可能会创造性地寻找方法,稳步向决策者和患者传达这一问题。与此同时,我们必须对试验数据持怀疑态度,除非我们对数据的完整性和证实结果的时间有信心。

参考

邓恩,W. (2019 年 1 月 24 日)。*国会议员对缺失的临床试验结果采取行动。*检索自《新政治家》:https://www . newstatesman . com/spot light/health care/2019/01/MPs-take-action-missing-clinical-trial-results

b . gold acre(2013 年)。不良制药公司:制药公司如何误导医生和伤害病人。伦敦:费伯。

Goldacre,b .,DeVito,n .,Heneghan,c .,Iriving,f .,Bacon,S. Fleminger,J .,& Curtis,H. (2018)。符合欧盟临床试验注册报告结果的要求:队列研究和网络资源。BMJ 362:3218。

Heneghan,c .,Goldacre,b .,Mahtani,K. (2017 年)。为什么临床试验结果不能转化为患者的利益。审判,18: 122。

托威博士(2014 年 1 月 3 日)。为什么公共账目委员会关于达菲的报告对我们所有人都很重要。赫芬顿邮报

当 Excel 不够用时:使用 Python 清理数据、自动化 Excel 等等…

原文:https://towardsdatascience.com/when-excel-isnt-enough-using-python-to-clean-your-data-automate-excel-and-much-more-a154c6bf9b49?source=collection_archive---------0-----------------------

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

@headwayio

数据分析师如何在电子表格驱动的组织中生存

Excel 是许多公司非常流行的工具,数据分析师和数据科学家经常发现自己将它作为日常数据分析和可视化工具的一部分,但并不总是出于自愿。这当然是我第一份数据分析师工作的经历,在那份工作中,Excel 是每个人工作流程的一部分。

我的团队使用 Excel 的数据工具 Power Query 来聚合和操作 CSV 文件,并连接到我们的数据库。最终,这些数据将显示为数据透视表或仪表板,并与公司的其他部门共享。我拿到的几乎所有报告都是在 Excel 上运行的,我很快就意识到这是一个大问题。

为了向您描述一下,下面是我多次听到我的同事谈论 Excel 的一些事情,我自己最终也开始这么说:

“又死机了!!"

刷新 Excel 报告中的数据是一项日常任务,有时,这是我们唯一可以立即执行的任务。即使我们的电脑有像样的硬件,我们一打开其他程序就知道了(有人说 Chrome 吗?)虽然 Excel 正在刷新,但几乎可以肯定它会崩溃。

“还在提神……”

不仅我们在刷新 excel 时无法使用其他应用程序,而且我们的一些报告需要 30 分钟甚至几个小时才能完成刷新。是的,Excel 喜欢拿我们的电脑当人质!

“我们无法加载那么多数据。”

我们对 Excel 最大的不满是无法加载我们需要的那么多数据。公司里的每个人都要求更多,我们根本无法满足。

很明显需要做些什么。我们在这些问题上浪费了太多时间,几乎没有时间进行任何实际的分析或预测。幸运的是,我非常熟练地使用 Python 和它的工具来操作 CSV 文件,所以我和我的团队开始了优化我们报告的长期任务。

由于我们需要继续在 Excel 中报告,并且没有预算购买 BI 工具,我们决定使用 Python 来完成所有繁重的工作,并让 Excel 负责显示数据。因此,在 Python 和 Windows 任务调度程序的帮助下,我们自动化了收集数据、清理数据、保存结果和刷新 Excel 报告的整个过程。

由于每个人的工作流程是不同的,我想使这篇文章尽可能有用,我将保持高水平,并包括一些伟大的教程的链接,以防你想更深入地挖掘。请记住,其中一些提示可能只在 Windows 机器上有效,这是我当时使用的。

[## 通过我的推荐链接加入 Medium-Andres Vourakis

阅读安德烈斯·沃拉基斯(以及媒体上成千上万的其他作家)的每一个故事。您的会员费直接支持…

medium.com](https://medium.com/@avourakis/membership)

1.从 FTP 服务器下载数据

使用 Python 中的ftplib模块,您可以连接到 FTP 服务器并将文件下载到您的计算机中。这是我几乎每天都使用的模块,因为我们从外部来源接收 CSV 报告。以下是一些示例代码:

要了解更多关于 FTP 服务器和如何使用ftplib的信息,请查看本教程

2.运行 SQL 查询

使用 Python 中的pyodbc模块,可以轻松访问 ODBC 数据库。在我的例子中,我用它连接到 Netsuite 并使用 SQL 查询提取数据。以下是一些示例代码:

请注意,为了让模块正常工作,您需要安装适当的 ODBC 驱动程序。更多信息请查看本教程

3.清理数据

使用 Python 中的pandas模块,您可以非常容易和高效地操作和分析数据。毫无疑问,这是我拥有的最有价值的工具之一。以下是一些示例代码:

这个教程是开始学习pandas的好地方。如果您正在处理大型文件,那么您可能也想看看这篇关于使用 pandas 处理大型数据集的文章。它帮助我减少了很多内存使用。

4.刷新 Excel

使用 Python 中的win32com模块,您可以打开 Excel,加载工作簿,刷新所有数据连接,然后保存结果。这是如何做到的:

我还没有偶然发现任何关于win32com模块的好教程,但是这个堆栈溢出线程可能是一个很好的起点。

5.在规定的时间运行脚本

在 Windows 任务计划程序的帮助下,您可以在规定的时间运行 python 脚本并自动完成工作。你可以这样做:

启动任务调度器,找到位于动作窗格下的创建基本任务动作。

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

点击创建基本任务打开一个向导,您可以在其中定义任务的名称、触发器(当它运行时)和动作(运行什么程序)。下面的屏幕截图显示了操作选项卡,在这里您可以指定要运行的 Python 脚本的名称以及脚本的任何参数。

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

关于创建任务的更多细节,请查看本教程

通过将 Python 引入等式,我和我的团队能够显著减少我们处理数据所花费的时间。此外,将历史数据纳入我们的分析不再是一项无法完成的任务。这些改进不仅解放了我们,让我们可以更多地进行分析性思考,还可以花更多的时间与其他团队合作。

我希望这篇文章对你有用。如果你有任何问题或想法,我很乐意在评论中阅读:)

另外,如果你希望支持我成为一名作家,可以考虑注册成为一名媒体会员🙏

当“成长的烦恼”遭遇“成长的痛苦”

原文:https://towardsdatascience.com/when-growth-hacks-meets-growing-pain-6baa4e3d8776?source=collection_archive---------15-----------------------

我对 Siraj Raval 最近备受争议的“ML 课程”的看法

发生了什么

在一个影响者经济的时代,像 Siraj Raval 这样的知名 Youtubers 用户被认为在传播信息和启发新人进入有些令人生畏的人工智能世界方面非常成功。截至目前,他的 YouTube 频道已经有了 692,000,000 的订阅者,这很了不起。他的内容非常广泛。他的“在 5 分钟内做 X”教程视频非常受欢迎,这有一个迷因:

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

但是最近,他遇到了一些问题。他的新课程“用机器学习赚钱”收费 200 美元。收取 200 美元的课程费用完全没问题,有争议的部分是人们抱怨他使用了其他人的 GitHub repo 的一些代码,而且他接受的学生比他承诺的多得多,可以在不降低体验的情况下妥善处理。当一些人寻求退款时,他们也遇到了一些麻烦。

“成长的烦恼”与“成长的痛苦”

有些人指控他欺诈,对此我没有把握。在我看来,这更像是一个诚实的错误,因为缺乏扩大规模和进入他不熟悉的领域的经验。

看,他的大多数更受欢迎的视频都是带有一点‘娱乐’的入门级教程(说唱、滑稽模仿等)。)的元素。他在这方面非常自然,这使得人工智能或机器学习不那么无聊或可怕。而我相信这也是人们最喜欢他的内容的原因。然而,当涉及到更严肃的教育时,特别是当你想收取 200 美元的费用时,人们期望某些标准,而他可能并不完全清楚这些标准是什么。例如,你需要拥有你的内容,如果你想使用其他人的内容,比如代码片段或图表,给予信任,而且是非常恰当的信任。

我记得 fast.ai 的杰瑞米·霍华德在教“程序员机器学习入门课程的时候。他用了一个“过度适应和欠适应”的图表,并把它归功于 Quora。

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

Photo Credit: Andrew Ng’s Machine Learning course on Coursera.

但事实证明,上面的图片最初来自吴恩达斯坦福机器学习课程。所以杰瑞米·霍华德实际上在他的下一次演讲中特别纠正了这个错误,并特意表扬了吴恩达的教学风格。我认为这是各自的处理方式。我不认为 Siraj Raval 是故意不给学分的,他可能不太习惯学术界给推荐信的惯例,等等。如果你在 YouTube 上做免费视频并使用他们的代码,人们不会抱怨,但如果你试图对正式教育节目的内容收费,那就完全是另一回事了。

关于比他承诺的接收更多学生的指责,我认为这主要是一个规模上的挑战。当成功来得太快而你又没有准备好的时候,你肯定会跌倒。可以理解。然而,之后你如何处理将会有很大的不同。你可以得到更多的帮助,或者适当地为你没有达到的服务水平退款,只是不要逃避或者试图用更多的错误来解决一个错误。这样至少可以挽回名声,获得第二次改过的机会。

最后的想法

形势仍在发展,我们将看看他如何处理这件事。我想说我们假定他是无辜的。这个家伙为 AI 社区做了很多,帮助人们开始使用 AI/ML,毕竟让很多人笑了。我的建议?

直接面对问题,承认他犯了一个错误,并适当地补偿人们,然后在 YouTube 上制作一个视频,介绍他是如何处理缩放和进行损害控制的!化危机为机遇。从技术负责人的剧本中吸取一页。一有机会就要赚钱,对吧?

How ‘The Tech Lead’ handles his crisis? Make a YouTube video and monetize from it!

当身份成为一种算法

原文:https://towardsdatascience.com/when-identity-becomes-an-algorithm-5d076162fab7?source=collection_archive---------11-----------------------

关于人工智能、强化学习和扩展表型的思考

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

Venetian Mask https://pixabay.com/photos/venetian-mask-carnival-feathers-1283163/: Pixabay License

关于人类和人工智能相互作用的讨论往往会以对立的语言提出这个问题。然而,根据进化生物学家理查德·道金斯的想法,人工智能等工具可以更好地被视为我们扩展表型的一部分。表型是指生物体的可观察特征,扩展表型的概念是,这不应局限于生物过程,而是包括基因对其环境的所有影响,包括内部和外部影响。

我们习惯于严格按照我们在物质世界中占据的空间来定义自己。这是误导。占据我们身体的非人类细胞的数量超过了人类细胞的数量,大量的细菌聚集在我们的消化道内部。作者罗伯特·斯沃博达将人类比作统治非人类人口的少数派政府。但是正如我们的内部世界很大程度上是非人类的,我们的外部世界比我们想象的更像人类。我们的大部分智力已经“离岸”,以电脑、手机和其他设备的形式存在。这些工具对我们来说就像一双新的眼睛和耳朵,帮助我们收集关于我们环境的信息。由于我们的扩展表型,今天的人类已经是一种与我们几百年前的祖先非常不同的生物。这些工具存在于我们体外的程度是相当随意的——是因为存在于我们体内的起搏器更“人性化”,还是因为存在于我们体外的笔记本电脑更不人性化?从进化生物学的角度来看,它们都是我们扩展表型的一部分。

如果有一天我们成功地将手机植入我们的大脑,或者用嵌入式技术增强我们的思维,我们可能会认为自己已经部分变成了机器。然而,这主要是由于习惯于认为一个人只是包含在其中的东西。根据扩展显型的原理,任何经常使用智能手机的人都已经在成为部分机器的路上,或者说,机器已经成为他们的一部分。即使是现在,使用智能手机也可能对你的灰质产生影响,削弱某些认知能力。研究发现,那些经常在手机上使用 GPS 导航的人的海马活动减少,该区域的灰质减少。海马体负责记忆和导航过程,通过使用智能手机完成这些任务,一个人逐渐失去了之前执行这项任务的“生物肌肉”。如果进化不是节俭的,那它就什么都不是。如果我们用不同于大脑的工具来完成同样的功能,那么灰质将会被重新利用或者可能根本就不存在。大脑本身是由基因创造的生存工具这一观点对于思考人工智能和计算机是有用的类比,人工智能和计算机本身是大脑为自己的目的创造的工具。因此,一个有机体的全貌必须包括由基因导致的所有适应,包括大脑、计算机、购物清单等等。

虽然有些人可能担心这种向越来越无机的表现型的过渡,因为无机工具开始取代有机工具,但意识到这两者都是我们扩展表现型的一部分可能会成为一种安慰。如果手机能够比人脑更好地记忆数字,那么它很可能会被用于这一目的,并慢慢取代我们以前使用的生物工具。根据这种观点,很长一段时间以来,我们已经在一点一点地把自己变成机器,在我们外部找到更好的工具来做以前在我们内部做的事情。这些工具相对于我们自身生物学的位置是任意的。随着我们越来越擅长通过外科手术向我们的有机体添加非生物部分,如机械关节、器官甚至记忆模块,这种向非生物表型的转变将变得更广泛和更深入。事实上,这种通过外科器械来增强我们生物学的过程已经有了一个名字,叫做超人类主义,并声称在世界范围内有越来越多的追随者。

正如我们已经开始用智能手机取代我们的内部导航能力,越来越多的记忆存储在笔记应用程序或数字助理中,随着深度强化学习等尖端人工智能技术的出现,这一过程可能会增加。具体来说,如果计算机能够比我们的大脑更好地学习战略决策,那么我们很可能会为了算法提供的能力而放弃大脑的能力。只要算法仍然是我们的代理,那么让它学习像国际象棋这样的游戏就有意义,如果它比训练你大脑中的神经元更容易、更快。

在过去,以前的人工智能类型在这方面是有限的——就像名为 DeepBlue 的下棋机器。它们是服务于特定任务的费力的手工制作的解决方案。深度强化学习算法更加通用。DeepMind 用单一强化学习算法掌握几种类型的雅达利视频游戏的能力证明了这一点。因此,深度强化学习算法可能会标志着我们扩展表型扩展的下一波浪潮。

无限专业技能游戏

有人可能会想,既然与顶级人工智能算法相比,我们的大脑几乎都一样糟糕,那么像国际象棋和围棋这样的游戏是否会对人类不再感兴趣。情况不太可能是这样。许多此类游戏的一个有趣的方面是,一个人可以变得多么熟练没有上限。掌握程度往往取决于算法在任务上训练了多长时间,以及它的“心理理论”有多好。戴密斯·哈萨比斯指出,他们从未发现围棋算法 AlphaZero 的熟练程度的上限。经过 8 天的训练,他们关闭了系统。给定相同的算法,训练时间最长的人可能在围棋比赛中占据优势,就像训练大脑时间最长的人在生物动力游戏中占据优势一样。在其他游戏中,比如扑克的变种德州扑克,玩家的技巧主要取决于他们理解对方策略的能力,随着对手技巧的提高,游戏的潜在复杂性也随之提高。在这种情况下,对其他玩家有一个好的“心理理论”可以提高一个人的技能。许多人可能会感到惊讶,但具有思维理论的算法已经问世。例如,OpenAI 开发了这样一个人工智能系统,我在“机器人有意识了吗”中写过总之,当我们将我们的战略能力输出给机器时,我们可能会遇到许多相同的竞争场景,这些场景使得生物动力游戏变得有趣。

今天,很大一部分引起人类兴趣的活动都表现出这种无限专业知识的品质。例如,似乎早就应该有一个允许非生物增强的奥运会,因为目前我们的生物表型结束和非生物表型开始的界限越来越模糊。应该禁止带心脏起搏器的人参加奥运会吗?那些接受了膝盖重建手术并用人造肌腱替换了自然组织的人呢?

虽然折叠 t 恤等特定技能可能有上限,但一个人能成为多好的扑克玩家似乎没有上限。任何活动,只要其复杂性与对手的技能或智力成比例,就会表现出这种无限专业知识的品质。拥有有限专业知识的自动化活动不会有什么损失。一旦一个人在诸如折叠 t 恤这样的活动上达到了很高的技巧,我们往往会发现进一步的时间和精力投资是徒劳的。另一方面,那些具有无限专业知识的活动可能对人类仍然很重要,即使我们用机械的对应物代替了我们智力和身体的生物部分。

那些会哀叹这一过程,并认为它有一些不自然的东西,将受益于意识到我们不是唯一具有扩展表型的动物;我们已经延长了很长时间。可以说,自从第一个人类捡起一块燧石并把它做成枪头,或者用火使食物更易于消化,我们就一直在扩大我们的扩展表型。然而,我们感觉到,随着人工智能,特别是深度强化学习,一些门槛已经被跨越。到目前为止,人类的高辛烷值猿脑已经拥有超过地球上所有其他学习代理的战略优势。现在情况不再是这样了。在越来越多的活动中,计算机将占有战略优势。因为在很大程度上,我们把自己的动机和大脑的动机联系在一起,所以我们有理由紧张。虽然我们大脑的动机很大程度上受基因的影响,但它们并不完全相同。大脑可以决定它不想生育,这个决定绝对不符合我们基因的目标。因此,从我们的基因进化出巨大的大脑来照顾我们的利益的那一刻起,就存在委托代理困境的威胁,或者用外行人的话说,利益冲突。

身份——我代表谁的利益?

既然我们以深度强化学习的形式给我们的表现型增加了一层,如果这个工具应该开发与我们自己大脑的目标相反的目标,情况可能会变得非常奇怪。身份的问题总是最棘手的——我们是代表我们的大脑、我们的基因的利益,还是以我们使用的其他工具的形式代表我们的扩展表现型的利益?那些有宗教信仰的人可能会把灵魂的兴趣加入到这个列表中。这些不同实体之间的对话可能会造成相当大的分歧。他们之间的控制点越来越灵活。

考虑到我们扩展表现型的部分已经在发展他们自己的兴趣。包含广告的工具处于一种新型扩展表现型的最前沿,这种表现型在工具及其用户之间引入了潜在的利益冲突。当一个工具直接服从大脑的控制时,就不存在利益冲突的问题。例如,一把锤子没有自己的利益,完全屈从于使用它的人。智能手机上运行的脸书应用完全是另一回事。您对使用脸书应用程序的兴趣可能会偏离应用程序的动机。脸书的商业模式是通过广告运作的,所以这款应用的动机是让你点击它向你展示的一个广告。正如作家安德鲁·刘易斯讽刺的那样,“如果你不为产品付费,你就是产品”。虽然目前这看起来只是一件令人讨厌的事,但它隐藏了一个更黑暗的潜台词。随着这些广告平台背后的工程师越来越善于操纵你点击你本来不会做的事情,当你打算在朋友生日时给他们写一封体贴的短信时,你会发现自己偏离主题并转向购物或研究产品的机会正在增加。这是对过去工具的一个非常重要的背离。

以前,工具倾向于与用户的兴趣保持直接一致。随着嵌入式广告的出现,软件变得像特洛伊木马一样,隐藏着自己的议程。一个工具为谁的利益服务的问题将越来越容易被人提出。这是一个有趣的故事,有着重要的影响。时光倒流到 20 世纪 80 年代初的硅谷,年轻的程序员们乘着个人电脑热潮的顶峰而忙碌着。许多这些年轻的远见者属于自由软件运动。然而,与公众意见相反,程序员需要吃饭,这些年轻的理想主义者发现自己正处于十字路口——要么给他们的软件定价,要么破产。然后一个解决方案出现了,通过互联网。软件可以保持免费,但会包含广告。这为脸书和谷歌等公司的盈利模式让路。从表面上看,这对每个人来说都是一笔大买卖,程序员在分发他们没有价格标签的产品时变得富有。但正如他们在德克萨斯州所说的“没有免费的烤肉”,许多软件用户并不知道,这种商业模式中隐藏着一个陷阱。

广告,加上互动软件,可能会导致上瘾和行为改变。这几乎是由利润最大化原则保证的数学确定性。当一个软件通过广告赚钱时,它现在服务于两个主人——一个是用户,另一个是为广告空间付费的人。这些党派的利益肯定会有分歧。如果一家公司通过用户点击广告的频率而不是产品的有效性来赚钱,那么产品的真正目的就变成了让用户点击广告,而不是用它来完成一些有用的事情。

就像古代神和女神的利益一样,像脸书这样的公司的利益完全是虚构的,只存在于人类的集体想象中。但是,虽然这些公司可能只是作为虚构的实体存在,但它们的利益一旦嵌入硅芯片,就非常真实,可能会与使用软件的人的利益发生冲突。当我们开始盘点我们的扩展表型时,这是需要注意的重要一点。考虑到已经很难识别一个人大脑的兴趣和一个人基因的兴趣。虽然他们关系密切,但他们并不相同。既然我们的工具也开始有了自己的兴趣,这种困惑就更加复杂了。

随着人们更加强烈地认同他们的非生物扩展表型,即社交媒体人物角色和运行他们的算法,他们的兴趣将在很大程度上受到这种扩展表型的兴趣和要求的调节。事实上,保持一个人的脸书身份的需要可能会压倒基因的利益。我们已经有这样的例子,视频游戏玩家忘记了养活自己或家人,因为他们强烈认同游戏中角色的目标。

要考虑的一个最重要的问题是,我们将把我们身份的控制点放在哪里。基因工具箱会以 CRISPR 等遗传技术的形式卷土重来,将我们与我们的生物容器重新结合起来,还是我们会继续向非生物扩展表型的长征,将越来越多的决策外包给计算机,同时逐渐用无机算法取代我们的生物化学算法。在这种情况下,深度强化学习似乎是无机扩展表型的巨大飞跃,因为它将使这种无机扩展表型能够解决以前只有我们的大脑才能解决的问题。

更重要的是,如果人类生活确实是一场决策的戏剧,正如我们的艺术、宗教、甚至法律体系所认为的那样,那么可以得出结论,拥有强化学习能力的机器实际上是道德代理人。要么我们认为道德代理人的东西必须改变,要么我们必须扩展我们对这种机器的思考和处理,以包含道德代理人。理清这一逻辑链中的法律责任和保护可能是一项艰巨而又不可避免的任务。目前,这些仅仅是与学术界无关的边缘问题,但它们几乎肯定会成为具有持久重要性的问题。此外,在这些问题上取得有意义的进展的时间可能比之前认为的要短得多。

想想越来越普遍的现象,脸书页面或电子邮件帐户在其所有者去世后仍然存在。如果这些数字角色被赋予强化学习算法,允许他们继续响应和适应他们通过帖子、消息等接收的刺激。也许是按照他们最初的使用者设定的风格和目标,然后以一种非常真实的方式,一个人的无机扩展表型可以在一个人的生物死亡后长期存在。这样的无机表型应该得到法律保护吗?如果我们移除一个人的大脑,并让它在电脑中存活,这样它就可以继续写信息和交流,我们可能会认为这个人在某种意义上仍然活着,并为他们提供一些法律保护。这种比较并非完全不合理,这种奇怪的身份问题可能会比我们意识到的更快地强加给我们。虽然我们目前的表型可以被描述为帮助物种生存和复制的生化算法的组合,但我们未来的表型很可能类似于无机算法的组合,其目的和设计将远比进化适合度的严格条款所规定的更加可变。

虽然我们目前给予我们的扩展表型有限程度的自主权,即我们可能允许谷歌自动回复电子邮件或为我们安排约会,但这种自主权正在增长。将我们太多的决策外包给不完全归我们所有的学院,肯定会有危险。如果谷歌或脸书拥有我们扩展表型的大部分,那么我们必须将拥有我们扩展表型的公司的利益和需求加入到我们的决策中。

仔细清点一个人的扩展表型,以及受其影响或控制的各种利益集团,也许是我们今天教育中探索最少的领域。当我们走进朋友家询问 wifi 密码时,我们在为谁的利益服务——我们的基因、我们的大脑,还是以脸书应用程序形式出现的我们的扩展表型?由于没有意识到在我们的扩展表现型中,所有不同的实体都是共存的,我们很容易被议程最大的那个实体所束缚。当然,大脑和身体必须在要求 WIFI 密码的命令上签字,因为它们代表着决策过程中的瓶颈。然而,当我们发现自己在上网后转向点击广告时,真正的幕后黑手可能是脸书应用程序。

就像在巴西雨林中发现的一种真菌,它通过入侵蚂蚁的身体并将其变成僵尸来传播,在死亡之前将真菌转移到一个新的位置,因此我们可能会发现自己被操纵软件所欺骗,并被重新编程以执行其命令。这当然不是我们希望的未来,但它可能是某些盈利模式的意外后果。展望未来,对我们的扩展表型做出真诚的解释将变得越来越重要,这样我们就可以避免受到旨在引导我们走向我们不会选择的目标的算法的束缚。

买彩票的最佳时机是什么时候?

原文:https://towardsdatascience.com/when-is-the-best-time-to-buy-lottery-tickets-7735191b3c76?source=collection_archive---------1-----------------------

根据理性(或统计)分析

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

Photo by Alain Pham on Unsplash

彩票的预期回报会是正的吗?

当头奖金额较大时,更多的人倾向于购买彩票。这有道理吗?

本文旨在通过统计分析来回答这些问题。

介绍

我们在这里研究的彩票是加拿大最受欢迎的彩票游戏之一——乐透 6/49。像许多其他彩票游戏一样,当抽奖中没有中奖彩票时,6/49 乐透也可以滚动累积奖金。在过去的一年里,出现了几次超过 2000 万美元的大奖。

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

Jackpot size for Lotto 6/49 over the past year

加拿大彩票史上最大的单笔头奖也来自乐透 6/49。2015 年 10 月 17 日开奖,累积奖金 6400 万美元。头奖是由在安大略购买的一张彩票赢得的。这还不到美国历史上最大的头奖——【强力球7.684 亿美元头奖的 10%。但它对应的是加拿大人口与美国人口的比例。

根据号码匹配,主抽奖有 7 种不同的奖品。还有一个 100 万美元的保证抽奖活动,其中一张彩票将获得奖金。赢得任何奖项(最有可能是另一次免费游戏)的几率是 6.6 分之一。

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

但是,买彩票没有人是针对小奖的。主要的头奖是我们主要感兴趣的。

赢得乐透 6/49 主头奖的几率是 1/13,983,816!这意味着,我们有更大的机会:

  • 被雷劈——114195 年中的 1。
  • 成为电影明星—119 万里挑一
  • 被鲨鱼袭击——3,748,067 人中的 1 人。

分析前要考虑的事项

  • 税收和货币的时间价值

幸运的是,加拿大的彩票中奖者不必为奖金缴税——只需为其产生的收入缴税。获胜者似乎可以选择在申请后一次性获得报酬。因此,没有必要考虑中奖金额的时间价值和税收,这可能会减少实际奖金。

与强力球不同,乐透 6/49 头奖金额就是赢家获得的金额!

  • 数据

由于数据限制,只有一年的乐透 6/49 历史可供分析。其他数据是从新闻报道中读到的。

  • 使用的型号

最后,我们还假设头奖赢家的数量遵循泊松分布。泊松分布是一种概率分布,通常用于模拟在特定时间间隔(如时间)内观察到的罕见事件的数量。

这不是一个完美的模型,但它很简单,可以作为一个很好的代理。关于申请的细节可以在这里找到。

数学

什么时候是买彩票的最佳时机?

为了回答这个问题,我们用预期收益作为标准的衡量标准。

** * * *** * * 如果对计算不感兴趣,可以跳过这一部分*** ***

我们提到一张彩票赢得头奖的几率是 13,983,816 分之一。每张票都被认为是相互独立的,所以我们假设这是不变的。

主奖头奖 的预期收益计算为:

(假设您赢了,预期的赢款金额) (1/13983816)。*

假设你赢了,预期的赢款金额是从我们假设的泊松分布中得出的。

除了主头奖 之外,主抽奖 的预期奖金回报简单计算如下:

(中奖金额)*(该特定奖品的中奖几率)。

保底 100 万美元大奖 的预期回报计算为:

100 万(1/售出门票总数)。*


每张票的购买价格是 3 美元。因此,总预期收益= sum(不同奖项的预期收益)-3 美元。

下面是一个图表,显示了过去一年的预期总回报和累积奖金的大小。

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

Plot of jackpot size (x-axis) and expected total return (y-axis)

这种关系看起来是线性的。3300 万美元的累积奖金(过去一年中最大的累积奖金)的预期回报高达-0.14 美元。

头奖越高,预期收益越好?

这是否意味着随着更高的头奖,它将达到 0 甚至是正的,这将使彩票成为一个好的赌注?

为了回答这个问题,让我们看看 2005 年发生的一次更大的累积奖金。头奖是 5430 万美元,比 3300 万美元大得多,更接近 6400 万美元的最高纪录。选择这个特别的抽签是因为可以从新闻报道中获得数据。

当时的彩票每张 2 美元,所以它被认为是一个巨大的头奖,相当于今天的 8145 万美元。即便如此,预期收益为-0.14 美元,与过去一年的最高预期值相同。

为什么会这样?

因为这次头奖售出了将近 5000 万张彩票。这与过去一年的平均抽签(490 万)相比是十倍以上。人们肯定很兴奋,会买更多这些更大的头奖的门票!而这是拉低预期收益的主要因素。

是的,彩票的预期回报确实会随着累积奖金的增加而增加。

当头奖变大时,是买彩票的好时机。

但是,由于这些巨额累积奖金造成的乐透狂热,它将永远不会成为一项理性投资(具有正预期回报)!

此外,售出的门票越多,中奖者就越有可能与其他人分享奖金。这将大大降低价值,即使你赢得了头奖。所以让我们转到另一个问题。

当累积奖金越来越大时,你与他人分享奖金的可能性有多大?

  • 中大奖

首先,看看 3300 万美元的累积奖金——去年最大的一笔。售出的门票数量估计为 760 万张。

鉴于我们无法改变赢得头奖的几率。令人担心的是,如果我真的赢了,可能会有多个赢家,我必须与他们分享奖金。

基于以上信息,我们能够计算出不同情况下的概率,假设你中了彩票。

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

The scenarios and distribution given you already won $33 million

这看起来非常好。很有可能(58%)你是唯一的赢家,奖金将是 3300 万美元。

但如前所述,随着头奖越来越大,售出的门票数量将以非线性关系增长。

  • 历史巨奖

让我们再次以 2005 年发生的 5430 万美元的累积奖金为例。

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

The scenarios and distribution given you already won $53.4 million

现在情况完全不同了。这张图表显示,最有可能的情况是,你将不得不在 2-4 名其他赢家之间分配奖金,这将大大减少你可以申请的金额,即使你真的赢得了头奖。

累积奖金越大,你就越有可能与其他赢家分享奖金。

受欢迎的抽奖将会给你很小的机会独自把全部奖品带回家!

摘要

以上分析是在加拿大乐透 6/49 上做的。然而,类似的想法/结果应该适用于其他彩票游戏,如美国的强力球。

总之,彩票从来都不是理性投资。最佳购买时机是头奖非常大的时候!

注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

数据是从乐透 6/49 官网刮来的。目前只有一年的数据。

由于数据限制,我们使用了乐透 6/49 官方网站上描述的公式,根据中奖人数和奖金数额来估算售出的彩票总数。

由于数据的限制,除了主大奖之外,其他奖项的期望值是按照过去一年抽奖的平均值计算的。

** [## 根据模拟,30 岁退休需要多少钱

很多人年纪轻轻就有辞掉工作的梦想,活在世上没有经济上的牵挂。怎么…

towardsdatascience.com](/how-much-do-you-need-to-retire-at-age-30-based-on-simulation-424fa9e0922b) [## 我将如何在我的狗身上花费 6 万多美元

我以前从未试图给我们的狗贴上价格标签。但是根据简单的分析,我最后会花…

medium.com](https://medium.com/@liannewriting/how-im-going-to-spend-over-60-000-on-my-dog-4860e5d8935c) [## 在多伦多购买新房——数据驱动的方式

作为一个数据驱动的人,我一直想分析多伦多的房地产数据,因为我知道这样的工作…

medium.com](https://medium.com/swlh/buying-a-new-home-in-toronto-a-data-driven-way-693773d97d86)**

当求职遇到数据科学(第一部分)

原文:https://towardsdatascience.com/when-job-hunting-meets-data-science-part-1-e8f64867d8c?source=collection_archive---------26-----------------------

从业务理解到模型评估,这个数据科学项目帮助我在找工作时变得非常清晰。

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

“Should I do my Data Science project or writing my Cover Letter? Why not both?” Photo by Markus Spiske on Unsplash

无尽的挑战。我们就是这样成长的。在我们的数据科学沉浸式项目中,顶点之前的最后一个主要项目是为求职的各个方面建立预测模型,如工资和工作类别。这个项目类似于真实世界的场景:你的老板给了你一个目标和/或一个问题陈述,你找到了完成它的方法。

商业理解

那么这个项目有什么问题呢?

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

2 个问题:
-调查影响薪资的因素
-调查区分工作类别的因素

还有一个问题,数据?

没错,资料中没有提供任何数据。这难道不是真实世界的风格,我们必须从某个地方寻找我们自己的数据吗?在这种情况下,我们可以执行网页抓取来提取在线数据!因此,我决定刮掉这个叫做…M 网站的在线工作平台!(身份被掩盖,以便网站创建者不使网站在未来更难刮。)

数据理解

数据的范围

我把范围缩小到与数据相关的招聘信息,并扩展到需要使用数据相关软件的工作。

# Keywords used for search query
[‘Research Scientist’, ‘Business Intelligence’, ‘Data Engineer’, ‘Tableau’, ‘deep learning’, ‘computer vision’, ‘tensorflow’]

网页抓取工具,要抓取什么?

SeleniumScrapy 都出色地从大量使用 JavaScript 的网站中提取了必要的信息。

由于该网站不断更新其帖子,运行同一组请求可能会获取不同组的帖子。因此,我下载了所需的源代码,并在离线模式下处理它们。

另一个问题随之而来:存储。下载每次发布的源代码可能会占用大量磁盘空间。幸运的是,Python 提供了一个 gzip 库来分别在存储和加载期间压缩和解压缩数据。

下面是搜索和搜索每个关键字的不同结果页面的代码,后面是下载每个职位发布的源代码并以压缩格式存储它们的代码:

Search using keywords and crawl across all results pages

Download each job posting’s source code and save the compressed version

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

1,640 job postings (possibly with duplicates) occupying relatively large disk space even after compression

使用 PostgreSQL 的数据存储

存储源代码后,我离线检索源代码并提取我需要的原始数据。为了磨练我的 SQL 技能,并体验如何在 Amazon Web Services (AWS)上创建 PostgreSQL 数据库,我决定将我的原始数据存储在 AWS 免费层关系数据库服务(RDS)

# These are the raw features used in extracting the data
  ['job_id','job_title','emp_type','emp_seniority','job_categories','emp_min_exp','job_skills_req','job_desc','job_req','search_query','salary_freq', 'salary_low', 'salary_high', 'company_name', 'company_info', 'link']

Uncompress and extract the relevant data before populating a new SQL Table.

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

Querying the data using pgAdmin. Looks like everything is in now!

我能做得更好吗?

肯定是的!

在抓取招聘信息的链接时,我可以使用 Scrapy 而不是 Selenium 来提取所有的链接。当时我还不知道那种方法。

而不是将链接列表转换为 Pandas DataFrame 并调用内置方法。to_csv(),也许我可以使用 python csv 库将列表输出到一个. CSV 文件中。然而,我发现执行前一步要容易得多。

有一个问题,尽管可能性极小,一个工作发布的 HTML 源代码由于过长的文件名而无法下载。也许代码可以在创建输出文件之前修剪文件名。

Elasticsearch 可用于存储和接收 HTML 源代码文件,使其成为 PostgreSQL 方法的替代方案。

如果代码有任何问题,或者我可以以任何方式提高我的编码技能或文章写作技能,请在下面留下您的评论,以便我可以从社区学习最佳实践和经验法则。

感谢您的阅读!敬请关注 第二部分 ,在这里我们访问数据库,获取数据并进行分析!

一个接一个的项目,我着迷于使用收集到的数据和基于这些数据建立的模型来解决事情,并通过部署模型来解决现实生活中的问题。你可以通过我的LinkedIn联系我。

当求职遇到数据科学(第二部分)

原文:https://towardsdatascience.com/when-job-hunting-meets-data-science-part-2-675f154269c7?source=collection_archive---------15-----------------------

从业务理解到模型评估,这个数据科学项目帮助我在找工作时变得非常清晰。

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

Payday! Image found on GIPHY by andersonpaak.com

这是第一部分的延续,我在这里经历了业务理解和数据理解的步骤。所采取的行动是制定问题陈述、网络搜集数据并将数据存储在数据库中。

对于第 2 部分,我们关注数据准备和数据建模!

显然,我们首先从存储数据的数据库中提取数据,并随机抽取 5 个职业数据的观察值。

*engine = create_engine('postgresql://[username]:[[password]@[database].ap-southeast-1.rds.amazonaws.com](mailto:qFH95+yw+ppY9tRm@careers.c0ocff1wef7u.ap-southeast-1.rds.amazonaws.com):5432/postgres', echo=True)
query = """
        SELECT * FROM posting;
        """
posting = pd.read_sql(query, engine)
posting.sample(5)*

"让我们开始做模特吧!"我知道我们对模特有多渴望。但是,让我们在开始之前先回顾一下业务问题并执行探索性数据分析(EDA)。

业务理解(重访)

商业问题是调查影响工资的因素。我们想知道可以用来预测工资的特征。更具体地说,给定一个由我们确定的截止工资(可能是所有职位发布工资的中间值或平均值),有哪些特征可能预测工资是高于还是低于截止工资。

数据准备、数据清理

总共有 1,173 个观察值和 16 个特征。一些特征将不会用于建模,例如发布 id、公司名称、公司信息和发布链接。

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

Great! No null value hidden in our dataset (really ‘Great’? Think again!)

有趣的是,在“要求的经验年数”下没有捕捉到任何信息。因此,此功能将被删除。

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

Constants like this don’t give any value for analysis and modelling, DROP!

*# Drop features that don't give any value for modelling or don't make any sense to be used for modellingposting['emp_min_exp'].value_counts()
posting = posting.drop(columns=['job_id','emp_min_exp','company_name','company_info','link'])*

其余的特征要么是分类的,要么是文本的。对于文本特征,我们通过转换为小写、删除不必要的特殊字符和转义序列(\n,\t)来清理数据。

*# Clean up the text data
posting.replace(r'\n', '', regex = True, inplace = True)
posting.replace(r'\t', '', regex = True, inplace = True)
for header in ['job_desc', 'job_req', 'job_title']:
    posting[header] = posting[header].map(lambda text: ''.join([char for char in text.lower() if char in string.ascii_lowercase + " /'-"]))
    posting[header] = posting[header].map(lambda text: text.replace('-', ' '))
    posting[header] = posting[header].map(lambda text: text.replace('/', ' '))*

有些工资是以年频率而不是月频率引用的。我们将这些工资除以 12,并删除“工资频率”功能。

*# Convert all salary to monthly salary
posting.loc[posting['salary_freq'] == 'Annually','salary_low'] /= 12
posting.drop(columns='salary_freq', inplace = True)
posting.sample(5)*

此时,我们要决定如何制定我们的目标,也就是工资。一个简单的方法是取高低端点之间的平均值,并将其作为我们的目标。但是,考虑这 2 个场景:
1。4,000 美元到 6,000 美元
2。3,000 美元—7,000 美元
确定两者的平均值为 5,000 美元并不重要,但两者的范围非常不同。

因此,我决定使用工资的低端点作为目标。(另一个实际原因是,老板们通常希望将成本降至最低,这意味着……)

现在,我们专注于我们的目标,薪水。我们绘制了一个柱状图来看工资是如何分布的。

*plt.figure(figsize=(18,5))
sns.distplot(posting['salary_low'], kde=False, axlabel='Salary', color='red');*

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

When can I reach the right hand side of this graph?

从这个分布观察到的 3 点:
1。没有负面价值观(谢天谢地,你没有付钱让你的老板为他/她工作)
2。数量可观的 0 美元薪水(这不是慈善工作,只是薪水在贴子里没有公开)
3。在最右边出现异常值(我想要的位置)

为了解决第 2 点,我们可以执行插补来插补 113 个$0 值。为此,我们首先使用 CountVectorizer 函数将所有特征转换成一个单词包。然后,我们使用基于 k 近邻的回归来估算$0 值。该算法将首先获取一个工资为 0 美元的数据点,在其周围寻找 5 个最近的点,并根据这 5 个最近点的平均工资估算值。

*#Init CountVectorizer with stop words and use 0/1 to denote presence
cvec = CountVectorizer(stop_words='english', binary=True)# Transform all text features into bag of words and concatenate
X = [cvec.fit_transform(posting[i]).todense() for i in posting.columns[:-1]]
X = np.concatenate(X, axis=1)# Draw references to observations where salary = 0 vs =/= 0
salary0_index = posting[posting['salary_low'] == 0].index
salary_not0_index = posting[posting['salary_low'] != 0].index# Init KNeighborsRegressor with 5 neighbors to impute $0 salary
neigh = KNeighborsRegressor(n_neighbors=5)
neigh.fit(X[salary_not0_index], posting.loc[salary_not0_index, 'salary_low'])
posting.loc[salary0_index, 'salary_low'] = neigh.predict(X[salary0_index])*

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

KNeighborsRegressor with 5 neighbors and uniform weights a.k.a. just take the average of the 5 neighbors!

有了更新后的薪水列表,我们可以再次绘制一个直方图来查看新的分布。

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

Don’t you think I look like lognormal distribution?

因为它呈现对数正态分布,并且它没有 0 值,所以我们可以执行对数变换,使它看起来像正态分布。

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

Do I look normal now?

然后,我们确定 1173 个观察值中的 590 个等于或高于正态分布的平均值,而 583 个观察值不等于或高于正态分布的平均值。显然,这种情况下的截断点是对数(工资)的平均值。使用零规则算法,可以预测 all 为多数类,等于或高于 log(salary)的均值,基线为 590/1173 = 0.503。

数据建模

准备好数据后,我们拆分数据,将 80%用于训练,20%用作维持集。

我们采用两种模型来完成分类任务:逻辑回归XGBoost 分类器

模型评估

虽然我们可以使用准确性作为衡量标准,但我们将使用 ROC-AUC 作为衡量模型性能的关键指标。

理想情况下,我们希望真阳性率为 100%,假阳性率为 0%。然而,在现实中,这几乎是不可能的。因此,通过改变阈值,我们可以使用相应的真阳性率和假阳性率绘制受试者工作特征(ROC)曲线。然后,曲线下面积(AUC)将告诉我们我们的模型能够在两个类别之间分离得有多好。AUC 越高,该模型就越能更好地预测真 0 为 0,真 1 为 1。

在维持集上,
逻辑回归:AUC = 0.9028
XGBoost 分类器:AUC = 0.8988

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

ROC for Logistic Regression and XGBoost Classifier

简而言之…

使用给我们的所有特征,一个好的 ol’ Logistic 回归模型在维持集上的表现比 XGBoost 分类器稍好。有了这个模型,我们可以预测日志(工资)是高于还是低于平均值,给定工作发布的信息。对于提供职位匹配服务的公司,该模型可以帮助管理雇主和雇员双方的薪资期望。

完整代码如下:

Code for everything discussed in this story!

更加卖力!

  1. 除了插补,我们还可以删除那些价值为 0 美元的记录。请注意,该组代表了大约 10%的观察结果,在业务环境中删除它们可能不是一个可行的选项。
  2. 除了使用 k-最近邻回归量进行插补,我们还可以使用其他技术,例如
  3. 在这个项目中,NLP 被大量使用,并且由函数生成的矩阵主要是稀疏的。因此,我们应该找到舒适地处理稀疏矩阵的方法,比如使用专门为稀疏矩阵构建的函数,而不是转换和处理密集矩阵。
  4. 此外,有些算法可能不适用于稀疏矩阵。它们在低维空间(很少特征)可能做得很好,但是在高维空间它们的性能是次优的。我们应该意识到这样的算法。
  5. 更多的超参数调整可以获得更高的度量分数。然而,我们需要注意的是,这种调整可能只会对总体分数产生微小的改善。
  6. 因此,与看似无止境的超参数调整相比,基于领域专业知识(在本例中,人力资源)的更好的特征提取和特征工程策略可能有利于提高分数。
  7. 我们还可以努力找出哪些词对薪水有更高的预测能力。需要注意的是,为了欺骗系统,帖子可能只包含某些具有高预测能力的词(如数据科学家),但会形成不正确的句子。例如,“优秀的数据科学家,优秀的数据科学家,完美的数据科学家”。

感谢阅读,我希望你能像我写的一样喜欢这个故事!如果我可以以任何方式提高我的编码或文章写作技能,请在下面留下您的评论,以便我可以从社区学习最佳实践和经验法则。(^^,)

一个接一个的项目,我着迷于事物如何使用收集的数据和建立在其上的模型工作,并通过部署模型来解决现实生活中的问题。你可以通过我的 LinkedIn 联系我。

当较少的数据是足够的数据时

原文:https://towardsdatascience.com/when-less-data-is-enough-data-78720d605bc0?source=collection_archive---------33-----------------------

现实世界中的数据科学

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

世界发展越来越快,我们需要实时的答案,或者至少是比猜测更好的答案。我经常遇到的一个问题是,一个样本什么时候达到足以定罪的临界质量?介于数据的 0%和 100%之间。但是在哪里?

举个例子,让我们以美国职业棒球大联盟赛季为例。每个队的目标都是进入季后赛。然而,作为一个球迷,一个赛季有 162 场比赛,我在什么时候才能对我的球队是否会成为竞争者有信心呢?

如果我们想知道季节什么时候“重要”呢?在赛季的哪一点上,我们可以合理确定地预测球队是否会进入季后赛?

交流数据就是说两种语言——一种是给那些只想知道结论的人,另一种是给那些想知道细节和过程的人。前者不关心数学和过程——他们只想要答案,并知道他们可以信任那个答案——而后者不知道过程就不会相信结论。说两种语言是我们的工作。

这篇文章将从粉丝的角度开始,实际上是对调查结果的执行摘要,然后是对我们如何得出这些调查结果的更详细的分析师观点。

粉丝:我什么时候该关心?

简短的回答是,即使在一场比赛之后,季后赛和非季后赛球队之间已经有了区分。在一个所有球队在第一场比赛中都是平等的世界里,季后赛和非季后赛球队的平均胜率都是 0.5。相反,季后赛球队平均 0.59 胜,非季后赛球队 1 场后 0.47 胜。随着赛季的进行,球队之间的差距只会越来越大:

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

赛季进行到大约四分之一的时候(大约 40 场比赛),季后赛和非季后赛球队的平均胜场已经有大约 4 场的差距。如果你的球队赢了 23 场或更多,他们看起来相当不错。如果他们有 19 个或更少,嗯,没有那么多。仅仅使用球队的胜场数,有大约 80%的机会,一个模型将会正确地将一支球队分类为是否进入了季后赛。

继续点击下面的互动图表,查看每个游戏号码的中奖情况:

在全明星赛期间(赛季进行到一半时),该模型有 87%的机会正确地将一个正值分类,并且胜利的数量开始显示出那些注定要进入季后赛的和那些没有进入季后赛的之间的清晰界限。季后赛球队在这一点上平均有大约 8 场胜利,并且分布显示了“较低季后赛球队”(季后赛球队胜利的第 25 个百分点)与“较高非季后赛球队”(非季后赛球队胜利的第 75 个百分点)之间的分离。

九月那段呢?球队在九月要打大约 25 场比赛,所以这相当于从上图中的第 135–140 场比赛开始。到目前为止,平均有大约 15 场胜利的差距,我们的可预测性增加到大约 95%。

所以,如果你想对你的球队能否进入季后赛有 80%的信心,检查一下他们在第 40 场比赛前是否有 23+的胜场数。如果他们在全明星赛前获得 46+的胜利,事情看起来真的很好。而且,如果进入冲刺阶段,你的球队已经赢了 80+场,放松下来,等待季后赛,因为你很有可能会参加十月棒球赛。

分析师:让我们来看看技术问题

用于数据操作的 R 和用于建模/可视化的 Python 中的项目代码是 在 GitHub 这里有

创建“完美”数据集

有效的问题解决始于准确地提出问题和准备数据。我知道我想回答的问题— 大概需要多少场比赛来培养对一支球队能否进入季后赛的信心?我只是还不知道如何回答。

在我现在参加的 MSBA 项目的课程中,我们将讨论概率分布和量化不确定性。我想知道采用概率方法是最好的,还是建模方法更好。

最终,经过大量的数据准备和清理,我决定将随机森林分类模型与数据相匹配。理想的数据集应该是:

在一个赛季的任何一个时间点,一支球队有多少胜场,这支球队在那一年进入了季后赛吗?然后,有了这个数据集,我们可以为每个游戏号码建立一个模型,并根据它计算准确性指标,以达到我们期望的置信度。经过多次反复试验,我找到了一个如下所示的数据集:

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

对于 1990 年到 2018 年的每一年,以及每支球队,我们都有比赛编号,到那时的胜利数,他们是否进入了季后赛,我添加了一个“高于平均值的胜利数”列,计算胜利数减去该年的平均值和比赛编号。

建模及结果解释

这个问题的性质很适合于一个分类问题;每年,一支球队要么进入季后赛,要么出局。虽然测试了许多分类模型——KNN、梯度推进、逻辑回归——但我选择了随机森林,因为它功能强大、可解释且相对较快。

我首先创建了一个单一的模型,并计算 ROC AUC 得分(这有一个令人惊讶的非直观的意义,因为我在研究如何解释它时了解到了这一点)。结果如下:

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

接下来,我绘制了各种游戏数量的 ROC 曲线,以观察随着游戏样本量的增加,曲线如何变化。红色虚线代表完全随机的猜测,越靠左上方,模型的表现越好:

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

现在,这个模型和由此产生的计算仅仅是基于一个单一的模型。每次运行它,我们都会得到不同的结果。为了说明这一点,我决定运行一系列模拟模型,以更好地了解每个游戏号码的数据分布。

我分别运行了 500 次,每次都选择不同的数据分区(一种“随机”的随机状态),使用一系列随机选择的模型参数:

num_runs = 0
desired_runs = 500while num_runs <= desired_runs:

    for game_number in range(1, 163):

        wins_game_num = wins[wins.game_num == game_number] x_train, x_test, y_train, y_test =            train_test_split(wins_game_num[['num_wins_team']], 
                           test_size = 0.4, 
                           random_state = random.randint(0, 100),
                           stratify = wins_game_num['playoff_flag']) rf_classifier = RandomForestClassifier(
                           n_estimators= random.randint(15,500), 
                           max_depth = random.randint(10,100), 
                           max_features = 
                           random.choice(['auto','sqrt','log2', 
                           None]),                                             
                           min_samples_leaf = random.randint(1, 25))
...
<Remaining code>

这导致 500 个模型模拟计算 ROC AUC 分数,从中我们可以绘制平均分数以及每个游戏号码的分数范围:

随着比赛次数的增加,可变性降低,这表明我们的结果更加确定,总的来说,我们可以快速改进随机猜测(0.5),根据获胜次数区分季后赛和非季后赛球队。

结论

在我在 Stax Inc. 的工作中,我们一直在寻找更快获得推论和见解的方法。私人股本市场竞争激烈,管理团队需要更快地做出反应和适应,我们的工作需要反映这种对速度的更高要求。

在这里,我们可以在查看大约 25%的数据时获得大约 80%的预测能力。这并不是说这个比率总是通用的,而是说在许多情况下,在收集和分析 100%的数据之前,就可以做出推断。

当机器学习解决方案不可能的时候!

原文:https://towardsdatascience.com/when-machine-learning-solutions-are-not-feasible-649d229241b6?source=collection_archive---------17-----------------------

每个数据科学家在提出机器学习解决方案之前应该考虑的五个场景。

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

Source: Pixabay

简介

大多数从业者普遍认为,机器学习(ML)解决方案总能带来业务改进。尽管基于 ML 的方法给企业带来了独特的能力,但在某些情况下,依赖 ML 解决方案可能会产生负面影响,甚至根本不可能。

本文的主要目的是讨论不同的用例,在这些用例中,使用 ML 并不能完全解决目标业务问题。本文给出了五种场景,稍后将介绍可能的解决方案,以考虑每种场景的更好解决方案。

场景 1:训练数据量不足

不使用 ML 解决方案的最直接的原因是数据量不足,这阻碍了精确模型的训练。更糟糕的是,在某些情况下,不准确的模型会产生完全随机的预测或分类结果,整个业务功能可能会受到质疑。

根据业务问题的性质,可能需要不同数量的训练实例;然而,经验法则是确保数据集包含至少 10k 个样本。

解决方案:

解决这个问题的一个可能机制是应用数据扩充技术,这种技术旨在从现有数据中获取更多数据。对于文本,可以选择以下选项之一:

  • 同义词替换
  • 随机插入
  • 随机交换
  • 随机删除
  • 等等。

对于图像,备选方案是:

  • 水平/垂直翻转
  • 水平/垂直移动
  • 随机旋转
  • 随机调整大小
  • 等等。

场景 2:缺少重要数据点

有了大型数据集,使用 ML 作为解决方案的下一个考虑是探索数据点(字段、要素或属性),以确定它们是否足够重要,可以用作模型的输入。

术语“显著”表示数据点的辨别能力,以及它们在定义目标预期结果时的独立性和信息量。特征选择是一个至关重要的部分,因为它直接影响模型在准确性和可靠性方面的整体性能。

解决方案:

对于这个问题,一个可行的解决方案是通过将现有特征组合在一起或者通过将它们分类到预定义的更有意义的集合中来生成不同的特征。例如,距离时间的组合可以生成速度,这反过来不仅提高了效率,而且可以为训练模型提供更独特的数据点。

场景 3:更新 ML 模型不切实际

使用 ML 解决方案的第三个可能的障碍是在频繁的时间间隔内实现更新模型的不可行性。拥有一个初始的精确模型可能足以在短时间内获得可靠的预测,但在较长的时间内,性能将受到一些因素的负面影响,如事件、季节、用户的人口统计或地理信息的变化。

所有这些都需要嵌入一个定期更新的模型,该模型使用最新的数据不断地重新训练自己。问题是访问更新的数据并不总是可能的,因为数据源可能是从一个或多个不同的数据源获得的历史数据。

解决方案:

这个问题的唯一解决方案是确保将数据连续摄取到数据库中,无论是通过实时用户数据还是离线用户生成的数据。

场景 4:缺乏可解释性

有时,即使是高度精确的训练 ML 模型的结果也可能不容易被最终用户理解,使得其采用非常困难或不可能。例如,具有非常小的类内距离和的聚类模型可能会将标签 1、2、3、4 和 5 分配给大型数据集中的不同数据样本,但却不对这些标签的含义进行解释。或者在决策树的情况下,结果子组不容易解释。

解决方案:

根据所选 ML 算法的性质,使用不同的技术来确保最终结果的清晰可解释性。例如,在聚类方法的情况下,建议将数据点的数量保持在四个或五个以下,以确保在每个输出的聚类中可视化和/或解释底层概念是在人的能力范围内。

场景 5:执行缓慢

与传统的基于规则的方法相反,在基于 ML 的方法的实现中总是涉及一些额外的阶段:数据预处理和/或清理、特征选择和/或转换、模型选择和设计、训练和测试等。所有这些都增加了总的执行时间,在深度学习模型的情况下,由于其设计中百万级数量的参数,这种情况甚至更加恶化。

在某些情况下,对于最终用户来说,即使在预测时有几秒钟的延迟也是非常不可取的,这可能会立即打消他们使用该应用程序的念头。例如,在大多数实时产品/服务推荐系统中,所有用户都期望快速响应,这可能是促使他们继续使用该应用程序的最重要因素之一。

解决方案:

首先,ML 算法本身的选择是对执行时间影响最大的因素。例如,与多层神经网络相比,使用支持向量机实现的二元分类器在训练和预测时间上总是快得多。其次,ML 框架的选择影响模型的整体速度。最佳框架通常可以通过实验来确定。不同的选择有 TensorFlow,Keras,Torch,Caffe,Theano,Scikit-Learn 等。

总之

机器学习(ML)解决方案,特别是那些基于深度学习技术的解决方案,通过其有前途的表现,已经彻底改变了商业的各个方面。然而,将基于 ML 的特征嵌入到服务/产品中并不总是可行的,主要原因有五个:

  • 训练数据量不足,
  • 缺少重要的数据点,
  • 更新 ML 模型的不可行性,
  • 缺乏可解释性,以及
  • 执行缓慢

在本文中,这个列表中的每一项都用一个例子来解释,然后是一个应对挑战的解决方案。

在提议采用基于 ML 的解决方案来解决业务问题之前,考虑所有可能的挑战性场景是很重要的,因为早期的考虑将节省组织的大量时间和资源。

同样值得强调的是,基于 ML 的解决方案并不总是比基于规则和传统的解决方案更好,尤其是在效率和速度比准确性和可维护性更重要的情况下。

当多任务学习遇到 BERT 时

原文:https://towardsdatascience.com/when-multi-task-learning-meet-with-bert-d1c49cc40a0c?source=collection_archive---------7-----------------------

面向自然语言理解的多任务深度神经网络简介

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

Photo by Edward Ma on Unsplash

BERT (Devlin et al .,2018)在多个 NLP 问题中得到了 2018 年最先进的结果。它利用 transformer 架构来学习contextualized word embeddings,以便这些向量在不同的领域问题中代表更好的含义。为了扩展 BERT 的使用范围,刘等人提出了用Multi-Task Deep Neural Networks ( MT-DNN)在多个自然语言处理问题中取得最新的结果。 BERTMT-DNN中帮助构建了一个共享文本表示,同时微调部分利用了多任务学习。

本故事将讨论用于自然语言理解的多任务深度神经网络(刘等,2019),并将涵盖以下内容:

  • 多任务学习
  • 数据
  • 体系结构
  • 实验

多任务学习

Multi-task learning是迁移学习的一种。当从多种事物中学习知识时,我们不需要从头开始学习一切,但是我们可以应用从其他任务中学到的知识来缩短学习曲线。

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

Photo by Edward Ma on Unsplash

以滑雪和滑雪板为例,如果你已经掌握了滑雪,你不需要花很多时间去学习滑雪板。这是因为两项运动都有一些相同的技巧,你只需要理解不同的部分就可以了。最近,我听朋友说他是滑雪高手。他只花了一个月就掌握了滑雪。

回到数据科学,研究人员和科学家认为,学习文本表示时可以应用迁移学习。 GenSen (Sandeep 等人,2018)证明了多任务学习改善了句子嵌入。可以从不同任务中学习部分文本表示,并且可以将那些共享参数传播回去以学习更好的权重。

数据

输入是一个单词序列,可以是一个单句,也可以是用分隔符将两个句子组合在一起。与 BERT 相同,句子将被标记化并转化为初始单词嵌入、片段嵌入和位置嵌入。此后,多双向变换器将用于学习上下文单词嵌入。不同的部分是利用多任务来学习文本表示,并在微调阶段将其应用到单个任务中。

DNN 山的建筑

训练模型需要经过两个阶段。第一阶段包括词典编码器和变换编码器的预训练。通过跟随伯特,两个编码器都通过掩蔽语言建模和下一句预测来训练。第二阶段是微调部分。应用基于小批量随机梯度下降(SGD)。

与单一任务学习不同,MT-DNN 将计算不同任务之间的损失,并同时将变化应用到模型中。

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

Training Procedure of MT-DNN (Liu et al., 2019)

不同任务的损失是不同的。对于分类任务,这是一个二元分类问题,所以使用交叉熵损失。对于文本相似性任务,使用均方误差。对于分级任务,使用负对数似然。

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

Eq. 6 for classification (Liu et al., 2019)

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

Eq. 6 for regression (Liu et al., 2019)

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

Eq. 6 for ranking (Liu et al., 2019)

从下面的架构图来看,共享层通过 BERT 将文本转换为上下文嵌入。在共享层之后,它将通过不同的子流程来学习每个特定任务的表示。任务特定层被训练用于特定的任务问题,例如单句分类和成对文本相似性。

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

Architecture of MT-DNN (Liu et al., 2019)

实验

MT-DNN基于 BERT 的 PyTorch 实现,超参数为:

  • 优化器:Adamax
  • 学习率:53–5
  • 批量:32
  • 最大历元:5
  • 辍学率:0.1

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

GLUE test set result (Liu et al., 2019)

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

SNLI and SciTail result (Lit et al., 2019)

拿走

  • 即使是类似的架构(即 BERT ),也可以通过多个 NLP 问题学习更好的文本表示。

关于我

我是湾区的数据科学家。专注于数据科学、人工智能,尤其是 NLP 和平台相关领域的最新发展。你可以通过媒体博客LinkedInGithub 联系我。

延伸阅读

变压器的双向编码器表示(BERT)

通用分布式语句表示(GenSen)

参考

Devlin J .,Chang M. W .,Lee K .,Toutanova K .,2018 年。 BERT:用于语言理解的深度双向转换器的预训练

Sandeep S .、Adam T .、Yoshua B .、Christopher J . p .通过大规模多任务学习学习通用分布式句子表示。2018

刘小东,何炳春,陈伟志,高建峰 2019。用于自然语言理解的多任务深度神经网络

什么时候不用机器学习?

原文:https://towardsdatascience.com/when-not-to-use-machine-learning-14ec62daacd7?source=collection_archive---------16-----------------------

机器学习模型、规则还是启发式方法?

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

当你在解决一个问题时,在什么情况下你会应用机器学习?

真的在任何情况下,机器学习总是胜过规则和启发式方法吗?

在我大学毕业之前,我对机器学习模型如何潜在地解决世界上的任何问题非常着迷。每当我面临任何类型的问题时,我都会首先想到如何通过使用机器学习方法来解决这个问题。

例如,当我在新加坡寻找要出租的房产时,我想知道某个特定地区的价格范围。换句话说,给定我想要的标准,那个特定区域的最优价格范围是多少。显然,有几种方法可以得到答案。

首先,如果我事先知道某个地区的价格范围,我就可以根据该地区的位置大致知道价格范围。其次,我可以去各种房产网站如 propertyguru99.co过滤掉不符合我喜好的条件。从那里,我能够得到一个估计的价格范围。第三,我可以通过抓取网站建立一个机器学习模型,根据我的偏好找到最优的价格范围。

我该选哪个?

作为一名数据科学爱好者,我选择训练一个能够给我任何地区价格范围的模型。几天后,我设法训练出一个精确度可以接受的模型。然而,这是最好的方法吗?

如果你只想在短时间内得到一个足够好的答案,就不要考虑机器学习模型,使用启发式方法就可以了。

我们来讲一个职场上的业务问题的例子。假设你在一家电子商务公司工作,负责一个禁止非法销售的项目。例如,枪支、未申报的药品、成人用品等。运营团队已经有了找出这些产品的方法或关键字列表,但他们不仅希望发现更多的非法列表,还希望结果高度准确。鉴于你不仅没有干净的标签数据,而且给你很短的时间去发现更多的非法产品,你将如何解决这个问题

方法之一是探索图像模型。获取一些标记图像,然后训练一个图像分类器。此外,您可以训练一个文本模型来对这些列表进行分类,或者您可以将文本和图像模型结合起来进行分类。你只有很短的一段时间,你担心你是否能交付结果,你能做什么?

由于运营团队已经有了一套他们所依赖的关键字,您可能应该只使用基于规则的方法,因为这是最快的方法。稍后,您可以要求您的团队重新标记现有数据,以确保数据足够干净。然后,你可以训练一个表现更好的机器学习模型。

简而言之,基于规则的算法为您提供了实现所需精度的绝佳方式。然而,从长远来看,机器学习模型仍然是最好的选择。

现在,让我们描绘另一个真实世界的场景。您在金融行业担任数据科学家,负责欺诈检测项目。您的公司是有权访问互联网交易数据的第三方公司。你的工作是以理想的准确度检测可疑交易。此外,模型的可解释性也是一个非常重要的方面。

例如,当这个项目的负责人(PIC)问你为什么有一笔巨额的欺诈交易,但你的模型却没有发现?或者为什么有这么多的交易被标记为欺诈,但它们实际上只是普通的交易?你的模型应该是解释性的,以便你能够向 PIC 解释它。

召回率可以作为模型的优先级度量。这是因为,如果你的模型碰巧对大量欺诈案件进行了错误分类,那么银行的成本将会非常高。作为一名数据科学家,您如何解决这个问题?

你可以建立一个深度学习模型来检测人类的异常行为。然而,如果你的模型预测出错,你几乎无法解释。另一方面,你可以建立一个基于规则的模型。因此,您可以向 PIC 解释您的结果。

如果你的模型产生的决策成本太高,或者你的模型需要解释力,那么基于规则的方法将是更好的选择。

最后的想法

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

非常感谢你一直读到最后。

机器智能是人类需要进行的最后一次干预。—尼克·博斯特罗姆

上面的引用显示了机器学习应用于世界上任何问题的巨大潜力。这篇文章并不是告诉你,机器学习似乎不是一个在商业中实施的好选择。然而,我希望你能明白在什么情况下机器学习不是一个好的选择。

我希望你会喜欢这篇文章,它为你提供了一个关于机器学习的不同视角。下周请继续关注我的帖子!

如果你对获得伟大的代理感兴趣,请随时查看这项服务

关于作者

Low 魏宏是 Shopee 的数据科学家。他的经验更多地涉及抓取网站,创建数据管道,以及实施机器学习模型来解决业务问题。

他提供爬行服务,可以为你提供你需要的准确和干净的数据。你可以访问这个网站查看他的作品集,也可以联系他获取的抓取服务

你可以在 LinkedInMedium 上和他联系。

当我们的数据科学团队没有创造价值时

原文:https://towardsdatascience.com/when-our-data-science-team-didnt-produce-value-c00c67919ebb?source=collection_archive---------9-----------------------

领导数据团队的重要一课

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

Photo by Maarten van den Heuvel on Unsplash

我坐在老板的办公室里,向他简要介绍我们新仪表板的推出,这将大大增加组织中每个成员对数据的访问。此外,新数据的质量比以往任何时候都高,这种设计将使即使是最不了解技术的用户也能对数据进行有意义的控制。

然后,我的老板告诉我,他对我们数据团队的印象是,我们无法获得任何有意义的数据。

说这让我措手不及是轻描淡写。我知道团队有多努力。此外,他们在这一年中还设计并启动了其他几个重要而复杂的项目。

然而,我的老板告诉我,他对我们的数据没有信心,或者对团队在许多需要数据和分析的情况下提供价值的能力没有信心。

我无法释怀,因为我真的很困惑。所以我调查并了解到我的老板的经历和观点是独特的,与我的不同。

他的数据需求通常围绕着紧急的反应式数据请求和最新的外部需求。几乎在他能叙述的每一个案例中,他得到的回答都是我们不能提供数据。

到目前为止,数据团队的重点和优先事项一直是我们的商业智能、机器学习以及预测工具和产品。这些将使我们了解该组织需要达到的目标,以及最近增加资源的理由。见鬼,我们完全按照组织的五年计划行事!

作为一名经理和数据科学团队的一员,这给我敲响了警钟。

授权是一个有趣的命题。作为一名主管,我经常担心自己是否对员工进行了微观管理。

为什么?因为大家都知道你的团队不想被微观管理。当然不是,你也不想被人微观管理。

但是通常会发生什么?我经常发现项目没有完成。或者他们完成的方式没有达到我的期望。

在与我的老板会面后,我意识到我委派的许多任务和项目被团队确定为“不可能的”。对于数据请求和特殊分析,这种情况经常发生。这让我可以把更多的时间花在其他项目上。

“我们没有数据”,“这不是我们能找到的报告”,“我们以前没有成功地尝试过”是我听到的一些典型的回答。

在这些问题上,我信任团队。他们在一起的时间比我监督他们的时间还要长。事实上,我从他们身上学到了东西,并经常发现自己也在用同样的方式应对任务,向同事解释我们不能做什么。

我花了一些时间回忆发生的事情。我学到的东西把我带到了一个非常不同的方向,并帮助我更好地了解我的团队和组织的需求。

几个月来,我一直在听我的团队关于我们的新仪表板、ML 项目和其他长期计划的进展的稳定而定期的报告。团队的骄傲和兴奋——以及我自己的关注——相互促进。

这种情况一直持续到特别数据请求不再是优先事项的时候。并且只有那些我们已经准备好访问数据的请求才被满足。任何其他事情都会分散我们有限的和“宝贵的”资源,使其无法在真正“重要”的项目上工作。

当你在一个反应式的组织中时,你需要为这个任务投入资源。

这意味着困难的数据任务被拒绝……通常的解释是我们没有数据。

我决心改变老板对我们团队的看法,以及我们满足他对数据需求的能力。很明显,我忽视了组织对数据分析的短期需求,这种需求往往超过了领导层对新产品的长期计划。

当你在一个反应式的组织中时,你需要为这个任务投入资源。我还确保整个团队都明白,无论付出多大的努力,我都希望培养一种“同意”的文化。这绝对意味着重新确定项目的优先顺序,但也意味着我们所有人都要相互负责,如果我们被激励去拒绝一个请求,就要对自己和数据提出尖锐的问题。

经过一些搜索和一些案例,我了解到事实是团队并不总是默认一种探索的心态。这是我的错。我已经委派了具体的任务和请求,而没有花时间和团队一起设定任务的期望水平。

此外,我信任他们的专业知识(正确地),但当他们拒绝请求(错误地)时,我没有花时间和他们探讨“为什么”。

作为一名领导者,仅仅建立正确的团队是不够的。你还必须形成正确的态度和团队文化。你的职责是确保组织的需求是确定优先级的首要因素。

**如何扭转局面?**现在回想起来,我发现自己处于这种境地并不奇怪。我们的数据团队脱离了组织的大部分。虽然我们最近增加了 it 资源,但绝大多数都来自组织外部,并且是因为他们在数据科学方面的专业知识而不是组织部门的专业知识而被聘用的。如果这种情况在您工作的组织中听起来很熟悉,我推荐以下实践。

五个为什么——我最喜欢的工具之一后来变成了“五个为什么”。这有时可能会令人讨厌,但它帮助我对我们的团队和组织了解了很多,并允许我通过一些特别复杂的请求来指导团队——通常将它们转化为我们可以完成的可管理的任务。

利益相关者参与—我们了解到,在许多情况下,我们不得不花大量时间与提出请求的人在一起,以了解他们到底需要什么,并与更大的利益相关者团体接触,以弄清楚如何获得数据。在许多情况下,这些不是我们正常的报告,但如果我们花时间去钻研,我们经常会发现,我们要么有数据,要么只需做一点额外的工作就可以得到它。

领域知识 —因为我们的团队非常了解数据科学,但不是组织的工作,所以我们不得不进行双向讨论。它帮助我们能够向领域专家展示我们的数据库表,并引导他们通过我们的查询逻辑。它还帮助我们让他们带我们浏览前端系统,以便我们能够对他们试图实现的目标达成共识,从而了解政策和流程。

外部意识 —这对团队的每个成员都至关重要,尤其是领导者。走出你的办公室,忘记你的项目图表和你的 scrums。与组织中的其他部门交谈,了解他们的需求。也许你的团队会优先考虑这些,也许不会。也许你会给他们一个完美的解决方案,但是当你的开发还在进行的时候,他们需要一些不完美的东西。

在不是围绕数据科学建立的组织中,那些从事数据工作的人需要特别小心地理解我们的工作如何对整个组织使命做出贡献。

我们必须记住,我们是一个辅助角色,而不是核心职能。我们必须真正关心组织的需求和问题,并理解我们的工具如何提供解决方案。我们必须能够平衡长期解决方案和短期需求。

重要的是要记住,今天的问题比一年后的问题重要得多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值