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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

列奥纳多与甘之梦

原文:https://towardsdatascience.com/leonardo-and-the-gan-dream-f69e8553e0af?source=collection_archive---------25-----------------------

通过回到文艺复兴时代来探索 GAN 网络的概念,因为莱昂纳多面临着他最令人惊讶的挑战之一

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

莱昂纳多用拳头猛敲桌子。
—令人发指!悲惨之猪。

国王的朝臣和其他皇室成员从大房间的侧面凝视着这一场景。克拉拉,他的表妹和知己,试图安慰他。大师,发生了什么事?发生了什么事?

莱昂纳多犹豫了一会儿。然后叹了口气,抬起眼睛看着克拉拉。突然,他的食指做了一个巨大的跳跃,把克拉拉的目光一直带到了豪华房间的另一端。

—安东尼奥?你徒弟怎么了?我以为你很高兴,而且…

大家赶紧小声说。莱昂纳多举起了手,整个房间陷入了沉默。他站起来,一边踱步一边急促地说话。

—我为什么要雇佣安东尼奥?特尔喃喃自语道。

—安东尼奥将负责挑选吉诺维斯画室首席画家的最佳作品,带给我。与此同时,安东尼奥应该利用自己的时间,靠自己慢慢地、仔细地、有条不紊地学习和提高自己的技术…

克拉拉假装不明白,尽管事实上,她理解得很好,一如既往。列奥纳多继续说道。

—我很快警觉到吉诺维斯工作室的作品与我想象的完全不同…主题,技巧,都是错的!他停顿了一下,抬头向上看…仿佛他能再次见到他们。

—它们会包含一些令人震惊的错误…太可怕了。完全没有手艺。但是安东尼奥…他…对我说甜言蜜语,他说…首席艺术家生病了,产生了幻觉,正在经历一些个人的混乱…你会相信吗

与此同时,克拉拉试图给莱昂纳多提供一些水。但是列奥纳多越来越激动。

—你们所有人!你想知道真相吗?达夫韦罗?真理报。
他用手指着安东尼奥,他在房间的另一端,不安地看着地板。

—他在撒谎!那些可怕的画,是他自己的!安东尼奥是…制造它们!他们是…糟透了。莱昂纳多再次用手指指着安东尼奥。

—当然,开头很糟糕。我会告诉他哪里出了问题,然后…嗯…随着时间的推移,他们变得更好…和…较好的…直到有一天…

克拉拉几乎要跌倒了,她不停地试图把一杯水放在莱昂纳多的手上,但是莱昂纳多没有注意到。

——那天,我告诉安东尼奥,这位吉诺维斯画家已经恢复了他的触觉。我很高兴…一切都恢复正常了!

克拉拉终于设法把杯子放在了他的手上。
—莱昂纳多,喝一杯,坐下,冷静下来。

莱昂纳多坐下来,匆匆喝了些酒,然后急切地看着克拉拉。

——但是那天晚上克拉拉,那天晚上…我抓住他了!!秘密绘画,画一个…

就像被隐藏的开关激活一样,安东尼奥向莱昂纳多冲去,莱昂纳多惊讶地看着他。房间变成了窃窃私语的海洋。

—列奥纳多大师,我需要你明白,让我解释一下。

—解释?,雷奥纳多恼怒的回答道。

几周前,我做了一个梦,主人。

低语的海洋来来回回,左右,然后转了三圈,停在了莱昂纳多的鼻子上,他用力地把它推到了一边。

—我知道,令人困惑,我也不明白它主人,但是…我现在相信我们是一个…甘。

房间里的每个人都陷入了沉默,除了萨宾娜女士,她声嘶力竭地喊道——亵渎!

克拉拉要求每个人都冷静下来。莱昂纳多好奇地看着安东尼奥。

—马彻 cosa?,告诉我…你喝酒了吗?

—师傅,我来解释一下。

莱昂纳多脸色阴沉。

如果你没有喝酒,你最好现在就解释…,否则…

安东尼奥的脸变得容光焕发。

—是的,我解释。师父,几周前的那个下午,当你休息的时候,我收到了一封信。Genovese 工作室的业主决定翻新他们的整个建筑,并将所有工作推迟到明年。

一名朝臣拿来一把椅子,安东尼奥坐了下来。

——我慌了,我知道你会失望的。国王相信你和你的名声会把吉诺维斯工作室的作品带到他的宫廷,作为交换,他会资助你下一阶段的研究。我沮丧地睡着了。一切都不顺利。我非常想学习成为一名伟大的画家。但由于我被雇来监督与热那亚的沟通,我担心一旦你知道他们的工作室将所有工作推迟到明年,你会把我送回家。

莱昂纳多目不转睛地看着安东尼奥,试图破译他接下来要说什么。

—我发烧了。然后就发生了…我做了一个奇怪的梦。我在寻找一种快速的方法来解开这个谜。我怎么能在为你工作的同时,像热那亚的大师们一样学习绘画,却不给你带来坏消息,他们的画室要关闭几个月的消息…

当他们听着的时候,每个人都慢慢走向房间的中央,安东尼奥正在那里讲话。

—我开始想象…如果我把自己画成吉诺维斯的作品呢?。但是,当然,我不知道如何像他们一样画画,甚至不知道他们的画是什么样子。然而,我决定尝试一下。

安东尼奥戏剧性地停顿了一下,看了看每个人,然后转向莱昂纳多。

—我的第一次尝试看起来…命运…几乎是随机的。莱昂纳多翻了翻白眼。

房间里到处都能听到窃窃私语。

—我送给你的。你被激怒了。你说过这不可能是真的。所以我问你:为什么不呢?。

莱昂纳多不安地在椅子上动了动。

你向我解释了,你解释了我的创作与真实事物的不同之处。对你的解释很满意,我向你保证我会向吉诺维斯工作室投诉,你对此很满意。

列奥纳多看起来仍然有些恼火,但同时也真正地着迷了。

—然后我创作了另一幅不同主题的画。但是这一次,我采纳了你给我的反馈。第二天,我回来了,在展示任何东西之前,我解释说吉诺维斯的首席艺术家已经回复说他有一些健康和个人问题,将持续一段时间。

安东尼奥继续说着,太阳开始把房间染成金色。

—然而,我告诉你,首席画家向我保证,他会尽最大努力向你和国王交付伟大的作品。他请求耐心和理解。然后,我给你看了我的作品。你诅咒了又诅咒。你给了我一个很长的演讲,关于一个叫做“即兴表演”的神秘状况,然后继续启发我更多关于我的画和你所期待的之间的差异。

列奥纳多脸上的表情是痛苦和喜悦的混合体。

—日复一日,这个过程继续着。对我来说很明显,你真的相信了吉诺维斯画家的故事,并且随着我的画变得更好,你逐渐变得不那么沮丧了,这要感谢你的反馈。几周后,关键的一天终于到来了。

莱昂纳多皱起了眉头。克拉拉冲到他身边。低语的海洋冲了回来。

——我给你看了《五月多恩》的画。你很高兴。你笑了。你拥抱了我,并宣布吉诺维斯的首席艺术家恢复了健康。

—妈妈咪呀!,莱昂纳多朝着高高的天花板叹了口气。

—我感到非常自豪。在梦里,我和我的妻子玛加以及两个孩子安娜和皮埃特罗一起庆祝。我女儿带来了一个很棒的草莓蛋糕。在蛋糕上,草莓之间,有三个大大的粗体字:甘。

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

那是什么,安娜?,我问她。

她很快开始就事论事地说话。

—太清楚了,爸爸。你和莱昂纳多成了一个网络。你创作了越来越多的吉诺维斯风格的作品。你这样做是试图欺骗达芬奇,让他相信你的画实际上来自吉诺维斯工作室。然而,列奥纳多是这样一个天才,一个伟大的鉴别者和批评家。他会非常准确地指出并解释你的作品与 Genovese 工作室的真品之间的差异。有了这些反馈,你就能不断进步。直到有一天,列奥纳多真的相信你的创作是一幅价值相当于吉诺维斯工作室首席艺术家的画。

安娜做了一个快速暂停呼吸,并继续进行。

—你的网络达到了稳定,你成为了一个伟大的吉诺维斯风格的画家。爸爸,你所做的一切都是通过在你们两个之间创造一个敌对的动态过程。这就是为什么你的网络是一个 GAN,一个生成性的对抗性网络。

安东尼奥和玛加面面相觑,说不出话来。

如果你不相信我,去问伊恩·古德菲勒好吗?他想出了所有这些东西,这是我自己的梦在你的梦里告诉我的!

—这些天她是不是功课太多了?,玛加小声对安东尼奥说。

你还好吗,亲爱的?,安东尼奥给了安娜一个厚脸皮的微笑。但是安娜并没有结束,继续往前走。

——好吧,好吧,但是你难道不打算在你自己的梦里好好听听你女儿的话吗?还有很多,爸爸。莱昂纳多逐渐变得越来越善于辨别你的创作和真实的东西,你一直在进步,直到你达到模式崩溃!

—模式什么?安东尼奥正尽最大努力跟上安娜热情而自信的讲话。

—当你一遍又一遍地画着同样的东西,对它如此着迷。莱昂纳多要疯了!

玛加和安东尼奥交换了一下眼神。安东尼奥满意地说:“那些蔬菜汤很有效。”。

佩德罗直接跳了进去。
—我们可以玩 GANs 吗?求你了,求你了爸爸,安娜和我能去玩甘斯吗?
——我想成为评论家!,安娜自告奋勇。我会成为艺术家,我会愚弄你!,佩德罗提前庆祝。
——好了,孩子们,去玩吧,去玩甘斯吧。对我来说…,我必须走出梦的这一部分,我听到一些东西…

列奥纳多笑了,像打雷一样,他的笑声从装饰华丽的墙壁上反弹回来。
—非凡!贝利西莫。你聪明的孩子,好吧,你让我安东尼奥,一个甘,我们是一个甘!

安东尼奥被莱昂纳多的反应吓了一跳。

莱昂纳多示意安东尼奥坐在他旁边。

—安东尼奥,这个甘的东西很棒。你知道我没有时间教你像吉诺维斯大师那样画画。然而,你需要我的直接反馈来改进。所以你试图愚弄我,一次又一次。随着你越来越好,我渐渐发现不了你作品中的问题。但是安东尼奥,这个网络可能有问题。

那会是什么呢,莱昂纳多大师?

— Lenta,molto lenta,非常慢。你将需要大量的图形处理器。

安东尼奥看了看克拉拉,然后回到莱昂纳多身边。

—很多什么?

莱昂纳多笑了。

—哦,聪明的安东尼奥,你以为你是唯一一个想出令人讨厌的术语的人吗?我也能发明随机的时髦玩意儿,我的孩子!GPU!TPU!还有 CycleGAN 呢!呃!斯塔根。阿坦甘!比根。

安东尼奥对这些新单词的发音感到惊讶。主人,我明白了。我花了很长时间才走到这一步,付出了很多努力。你真的认为这个过程可以更快吗?

—也许吧

—怎么做,主人?

—还是等到第二部吧,哈?

—什么部分?

——我也做了一个梦安东尼奥。我梦见我们生活在——灵媒——这是第一部分。此外,我觉得让每一部分都超过几分钟并不是一个好主意。这种东西是有统计数据的,你明白我的意思吗,安东尼奥?

克拉拉冲出房间,急切地请求帮助。
—药,把…的药·雷奥纳多带来!!

——Va bene 大师,我们等到第 2 部分,但请告诉我,如果我的女儿一直问我,我们是否生活在模拟中,我应该担心吗?

从第一线分析中获得的经验教训

原文:https://towardsdatascience.com/lesson-analytics-front-line-af0e5fb676ea?source=collection_archive---------26-----------------------

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

Photo by Stefan Spassov on Unsplash

利用数据解决现实世界问题的实用课程

It 两年前,我开始了数据分析师的职业生涯,与各种业务利益相关者密切合作,专注于建立一个旨在成为行业类别领导者的产品线,从那以后一直在经历(超)增长。

在经历了这个职业在高风险情况下的起起落落后,我对这个职业的认识变得更加成熟,并且在这个过程中我学到了一些重要的经验。本文将重点介绍这些经验:

  1. 瞄准冲击
  2. 找出利益相关者真正需要的东西
  3. 不同的利益相关者需要了解不同深度的信息

我写这篇文章的主要目的是给自己一个机会退后一步思考这些教训,并分享我迄今为止在整个旅程中学到的教训。分享这些经验教训并不意味着我已经完全掌握了它们。老实说,在这方面我还有很长的路要走。我希望这些教训对其他人有价值,就像它们对我有价值一样。

瞄准冲击

随着人工智能、机器学习和“大数据”方法的激增,世界目前正在收集大量数据,特别是在过去几年里,已经发明了许多数据角色,以使用这些数据和方法来带来现实世界的价值。

数据科学家/分析师需要具备许多技能,包括能够使用各种编程语言、数据技术堆栈、库和各种复杂的不同建模技术。随着行业的不断发展,提高我们与这些事情相关的知识和能力将非常重要,并使我们能够不断适应。

然而,在我们不断提高知识和能力的同时,我们应该时刻提醒自己,我们职业的主要目标是:

归根结底,伟大的数据科学家/分析师关注的是利用数据产生最大的影响,而不是他们所拥有的工具/方法。

当我谈到影响时,我指的是我们可以用我们所掌握的数据做的改变。从推动一个指标,创造新的产业(或颠覆旧的产业),到解决当今世界存在的问题。

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

Photo by Green Chameleon on Unsplash

与其没完没了地思考不同的工具和模型,不如专注于你能创造最大影响的地方,这可能是更好地利用你的时间的一种方式。通过瞄准影响,你将专注于将你的努力引向某个目标,并将实现它置于实现目标的技术细节之上。

现在,这并不意味着我们应该只优化影响。我们应该努力优化的是试图创造我们能创造的最大影响,同时融入我们更喜欢使用的技能,或者更喜欢在我们的职业生涯中发展的技能。这样做你会更有成效(职业和个人方面),随着时间的推移,你会开始看到你行动的成果在你面前实现。

找出你的利益相关者真正需要什么

当我与不同的利益相关者一起工作时,我意识到的一件事是,他们有不同的背景(因此有不同的数据素养水平),这可能会在他们需要什么和他们说/认为他们需要什么之间产生误解。

这一课强调了对你的利益相关者实际上需要什么有一个深刻(足够)理解的重要性,而且有时候你将不得不引导他们达到那个点。通常,您会引导利益相关者以数据驱动的方式解决他们的问题,我认为这是一个伟大的数据科学家/分析师的基本能力之一。

这就引出了本节的标题,也是我在工作期间学到的重要一课,那就是:

找出你的利益相关者真正需要什么

当你和你的利益相关者就你将要承担的项目或问题进行最初的会议/讨论时,这一课是最有效的。这些会议/讨论是你必须真正尝试了解他们真正需要什么的最佳时机,因为你还没有投入任何资源。

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

Photo by Charles 🇵🇭 on Unsplash

通过在过程的早期这样做,你不仅会在你花费的时间方面更有效(通过确保你产生了影响),还会向你的利益相关者表明你确实想要帮助他们(我希望你大体上是这样做的)。

当你设法正确地引导你的利益相关者时,你给予他们的那种关注感是一种授权感,是你的利益相关者会注意到并欣赏的,特别是如果你随着时间的推移持续表现出这种关注。它在你和他们之间建立了一种信任感,这将对你的职业生涯产生深远的影响。

以下是每当我要开始一个项目或开始与利益相关者一起解决一个问题时,我总是会讨论的话题:

  1. 项目/问题的一般描述(问题陈述、当前情况、时间表)
  2. 他们心目中的预期结果

第一个主题是每个人在开始一个新项目时都应该做的事情,它会让你对你的利益相关者希望承担的项目有一些基本的了解。

第二点是,作为数据从业者,我们实际上可以理解我们的利益相关者的预期结果是什么,以及您可能会看到哪里发生了脱节。通常情况下,提交给你的项目/问题可能没有根据其目标进行适当的详细说明,或者甚至可能与涉众实际想要实现的结果脱节。通过看到项目和预期结果之间的联系,我们可以向我们的利益相关者提出我们的建议或意见,告诉他们如何更有效地处理手头的项目或问题,或者能够实际获得他们首先想到的结果。

不同的利益相关者需要了解不同深度的信息

随着你开始在你工作的组织内工作并认识越来越多的利益相关者,你也很有可能遇到组织内不同角色和级别的利益相关者并与之共事。由于这一事实,我们必须记住,

我们讨论或展示的信息/细节的深度可能会因谈话对象的不同而有很大差异。

现在,如果你是一个与几个利益相关者一起工作的人,没有不同的背景和角色级别,这将是你不太关心的事情。当你的利益相关者在你工作的组织中担任不同的职位,并且可能有不同的背景时,这个建议就更重要了

例如,我目前的涉众在角色级别和经验方面有很大的不同。从从事日常工作的业务运营人员、拥有大量数据和技术经验的经理,到我所从事的产品垂直行业的业务主管。鉴于这种情况,我需要适当地实践这条建议,以便有效地履行我的职责。

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

Photo by Austin Distel on Unsplash

这个建议集中在这样一个事实上,当你谈论你正在做的项目或介绍你已经完成的工作时,你必须考虑你正在交谈/介绍的另一方,以便恰当地交流结果。在你的公司中担任管理职位的人不一定需要知道你用来解决他们问题的算法和模型的细节,但是如果你的同事想要将你的解决方案应用到他们正在处理的其他问题中,他们可能会对这些细节感兴趣。反之亦然。谈论你用来分析/解决问题的总体策略和逻辑可能是你的管理层利益相关者想要完全理解的事情,但是你的同事可能想要知道更多细节,而不仅仅是你用来解决你正在处理的问题的总体策略和逻辑。

当你与不同角色的利益相关者讨论你的工作时,这同样适用。当您与工作场所运营团队中的利益相关者交谈时,他们可能更感兴趣的是您的工作如何改善他们的日常工作,而不是信息技术的长期影响。然而,在战略团队工作的人更有可能对你的工作的中长期影响感兴趣,这意味着当你与他们讨论时,你可能应该更多地关注你工作的这一方面。

当你准备讨论你正在做的项目或展示你的工作成果时,考虑这一课总是一个好主意。这样做会让你成为一个更有效的沟通者(这在数据专业中总是一个很大的优势),同时让你的利益相关者更好地理解你所做工作的价值。

包装东西

当我写完这篇文章时,我能记起我犯过的错误,这些错误让我得到了这些教训。似乎那些错误就是我吸取这些教训的原因,我很高兴意识到那些错误其实是有用的。随着我们在数据职业生涯中的进步,我们会遇到许多错误,也许我们首先是这些错误的原因。尽管它们很糟糕(或者无论你如何描述它们),但从长远来看,重要的是我们要留意它们,从中吸取教训,然后继续前进。这样做可能是我们职业生涯中的区别点,让我们变得不同,或许更聪明。

本文发表于 2019 年 9 月 29 日。对于那些希望接触的人,请通过我的 Linkedin 随时联系。

真实机器学习项目的经验,第 1 部分:从 Jupyter 到 Luigi

原文:https://towardsdatascience.com/lessons-from-a-real-machine-learning-project-part-1-from-jupyter-to-luigi-bdfd0b050ca5?source=collection_archive---------12-----------------------

如何组织机器学习代码

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

在过去的 6 个月里,我和我的 awesome 团队一直在从事一个具有挑战性的企业级机器学习项目:从零开始重建一家主要能源提供商的短期电力负荷预测模型。

这是一个艰难但令人满意的旅程:我们学到了很多,主要是通过试图从幼稚的错误中恢复过来。是时候尝试分享学到的主要教训了,希望能有所帮助——为什么不呢?—得到帮助,进一步提高。

一篇文章太长了,而且很无聊:我会试着贴一堆,每一篇都关注一个主题。这一条涵盖了一个非常棘手的问题:如何组织、构建和管理机器学习项目的代码。

开始:一个基于 Jupyter 的项目

我在最近的学术项目中使用过 Jupyter 我喜欢它的强大和灵活性。一个快速原型工具也是最终的成果共享平台是无价的,不是吗?因此,Jupyter 是我们第一次分析的选择。

它只进行了数据探索。那时,我们的项目库看起来像这样。

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

你发现问题了,对吗?它不可扩展。一点也不。

我们过去常常将部分代码从一个笔记本复制粘贴到另一个笔记本上——这是任何软件工程师都无法忍受的。此外,我们实际上被阻止在相同的代码基础上合作,因为基于 json 的笔记本结构使得用 git 进行版本控制非常痛苦。

突破:ML 中的软件工程

在越过不归路之前,我们寻找一个更具可伸缩性的结构。我们发现以下资源非常有用:

他们都在重复同样的信息。

机器学习项目的代码与任何其他项目没有不同,应遵循软件工程的最佳实践。

因此,我们重构了整个代码库:

  1. 我们将笔记本中所有可重用的代码提取到几个实用模块中,从而消除了笔记本中的所有重复
  2. 我们将模块分成 4 个包,对应于我们工作流程的 4 个主要步骤:数据准备、特征提取、建模和可视化
  3. 我们将最关键的功能置于单元测试之下,从而防止危险的回归

操作一完成,Python,非笔记本代码就成了事实的唯一来源:按照团队惯例,它是我们最先进的数据准备、特征提取、建模和评分版本。每个人都可以进行试验,但是只有当一个经过验证的改进模型可用时,Python 代码才会被修改。

实验呢?而笔记本呢?

两个问题,同一个答案。

当然,笔记本电脑并没有从我们的开发流程中消失。它们仍然是一个令人敬畏的原型开发平台和一个无价的结果共享工具,不是吗?

我们只是开始将它们用于它们最初被创造的目的。

笔记本变得个性化,从而避免了任何 git 的痛苦,并遵循严格的命名规则:author _ incremental number _ title . ipynb,以便于搜索。它们仍然是所有分析的起点:模型是用笔记本做原型的。如果有一个碰巧超过了我们最先进的,它被集成到了生产 Python 代码中。超越的概念在这里被很好地定义了,因为评分程序是在实用模块中实现的,并由团队的所有成员共享。笔记本也构成了大部分文档。

我们作为一个团队只花了几天时间就完成了转型。差异令人难以置信。几乎在一夜之间,我们释放了集体代码所有权、单元测试、代码可重用性以及过去 20 年软件工程的所有遗产的力量。显而易见的结果是,生产率和对新请求的响应能力大大提高。

最明显的证据是当我们意识到我们在所有的拟合优度图表中缺少测量单位和标签时。因为它们都是由一个函数实现的,所以修复它们既快又容易。如果同样的图表仍然被复制并粘贴在许多笔记本上,会发生什么?

在转换的最后,我们的存储库看起来像这样。

├── LICENSE
├── README.md          <- The top-level README for developers
│
├── data
│   ├── interim        <- Intermediate data
│   ├── output         <- Model results and scoring
│   ├── processed      <- The final data sets for modeling
│   └── raw            <- The original, immutable data dump
│
├── models             <- Trained and serialized models
│
├── notebooks          <- Jupyter notebooks
│
├── references         <- Data explanatory materials
│
├── reports            <- Generated analysis as HTML, PDF etc.
│   └── figures        <- Generated charts and figures for reporting
│
├── requirements.yml   <- Requirements file for conda environment
│
├── src                <- Source code for use in this project.
    │
    ├── tests          <- Automated tests to check source code
    │    
    ├── data           <- Source code to generate data
    │
    ├── features       <- Source code to extract and create features
    │
    ├── models         <- Source code to train and score models
    │
    └── visualization  <- Source code to create visualizations

双赢的局面。

结束:框架的价值

我们对 Jupyter 原型和 Python 产品代码的分离感到满意,但是我们知道我们仍然缺少一些东西。尽管尝试应用干净编码的所有原则,但是随着越来越多的步骤加入,我们用于训练和评分的端到端脚本变得有点混乱。

再一次,我们发现我们处理问题的方式有缺陷,于是我们寻找更好的解决方案。宝贵的资源再次出手相救:

我们研究了气流、Luigi 和 d6tflow,最终选择了 Luigi/d6tflow 管道,后者用于更简单的任务,而前者用于更高级的用例。

这一次只花了一天时间来实现整个管道:我们保存了所有的函数和类,封装了预处理、特性工程、训练和评分的逻辑,并且用管道替换了脚本。易读性和灵活性方面的改进是显著的:当我们必须改变训练集和测试集的划分方式时,我们可以只修改两个任务,保留输入和输出签名,而不用担心其他任何事情。

包扎

总结一下,我们得到了关于机器学习项目中代码的三个重要教训:

  1. 一个机器学习项目一个软件项目:我们应该关心我们代码的质量。不得不处理统计和数学不是编写糟糕代码的借口
  2. Jupyter 笔记本是很好的原型制作和共享工具,但不能取代由模块、包和脚本组成的传统的 T4 代码库
  3. 有向无环图(DAG)结构非常适合数据科学和机器学习管道。当有非常好的框架可以帮助时,尝试从头创建这样的结构是没有意义的

我的读者,感谢你来到这里!

这是我第一篇关于媒介的文章,但我绝不是一个好作家。如果你有任何意见、建议或批评,我恳求你与我分享。

还有,如果你对本帖的话题有任何疑问或疑问,欢迎随时联系!

真实机器学习项目的经验,第 2 部分:数据探索的陷阱

原文:https://towardsdatascience.com/lessons-from-a-real-machine-learning-project-part-2-the-traps-of-data-exploration-e0061ace84aa?source=collection_archive---------17-----------------------

如何落入数据探索的陷阱并逃脱

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

这是该系列的第二个故事,所以我将残酷地缩短介绍。我写信来分享一个真实的企业级机器学习项目教会了我和我的团队什么。如果你好奇想了解更多,可以随意查阅第一章: 从朱庇特到路易吉

开头:冗长乏味的总结

在大学,我听说过数据探索。在真正的乐趣开始之前,这是一个乏味的初步步骤。您汇总数据集,绘制一些图表,并检查模型的假设。

很简单,但不是很有用,对吧?

教训:数据探索的陷阱

这种不好的观点相当普遍,但本质上是有缺陷的。为了说明原因,让我们将数据探索的正式定义与我们的经验进行比较。据维基百科:

数据探索是一种类似于初始数据分析的方法,通过这种方法,数据分析师使用可视化探索来了解数据集中的内容以及数据的特征。

第一部分。

数据探索是一种类似于初始数据分析的方法。

其实它就是的初始数据分析。探索应该先于任何统计分析和机器学习模型。

这对于避免第一陷阱至关重要:汇总指标,如平均值和标准偏差。

辛普森悖论是一个众所周知的例子,它表明全球指标可能是肤浅和误导的。这是一个玩具,学术案例研究,但类似的事情也可能发生在现实世界中,你马上就会看到。

第二部分。

当数据分析师使用可视化探索来了解数据集中的内容时,就会发生数据探索。

当然,它比这更复杂。想象阅读一个巨大的表格,有几千行几十列,全是数字。你在视觉上探索数据,但是你不可能获得一些洞察力。

这是因为我们不是为处理庞大的数字表格而设计的。我们擅长从形状、尺寸和颜色方面解读世界。一旦转化成线、点和角度,数字就更容易理解了。

不幸的是,第二个陷阱来了:设计糟糕或吹毛求疵的图表。有时,错误的可视化会阻止数据科学家捕捉正确的洞察力或共享正确的信息。这不是缺乏经验或天赋的问题。世界上最优秀的故事讲述者也会犯错。几周前,《经济学人》的莎拉·利奥发表了一组的优秀范例。

案例研究:电力负荷和温度

为了展示我们如何掉进陷阱以及如何毫发无损地逃脱,我将使用一个公共数据集,其中包含希腊每小时的电力负荷和温度。为了简单起见,让我们只考虑 2007 年。

我们想预测电力负荷,我们有兴趣了解温度如何有所帮助。

起初,数据看起来像这样:

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

第一步可能是计算线性相关性:

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

接近 0.42 的值没什么好激动的。

这样说,我们就陷入了第一个陷阱:根据汇总指标得出结论。幸运的是,逃避相当容易:我们可以召唤一个简单的图表来拯救我们。

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

电力负荷和温度之间的关系远不是线性的。因此,皮尔逊相关性是没有意义的。

这对建模来说是一个很强的暗示:我们要么应用适当的特征工程,要么使用非线性模型。线性回归本身无法捕捉到这种模式。

我们做到了!我们摆脱了第一个陷阱,并获得了建模的重要线索。

不幸的是,我们不知不觉地陷入了第二个更微妙的陷阱。

如果你仔细观察图表,你会注意到数据中有两种不同的模式。在图的左边:在一条几乎是直线的上面有一条更弯曲的条纹。起初,我们错过了这一点,因为一条重要的信息丢失了。

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

The color maps the hour of the day

温度对电力负荷的影响随时间而变化。在图表中引入这个额外的维度揭示了另一个重要的证据:我们需要让模型知道一天中的某个时刻。例如,我们可以包括小时和温度之间的交互,或者拟合 24 个不同的模型。

为了更清楚起见,我们可以只显示白天或晚上的时间:

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

最后,我们也克服了第二个陷阱,剩下两个正确设计模型的重要提示:

  • 温度对电力负荷有非线性影响
  • 温度和负荷之间的关系随着一天中的每个小时而变化

包扎

最后,我们知道了数据探索的重要性和难度。我们检测到两个主要陷阱:

  • 汇总指标,可能隐藏数据中的复杂模式
  • 设计不良的图表,这可能会导致错误的结论或妨碍更深入的分析

我们没有找到一个单一的解决方案,但一些提示可能会有所帮助:

  • 尽可能喜欢直观探索,而不是汇总指标
  • 尝试调查图表显示的所有不寻常的事情
  • 确保你得出的每个结论在现实世界中都有意义

我的读者,谢谢你来到这里!

如果您有任何意见、建议或批评,我恳请您通过我的 LinkedIn 个人资料 与我分享。

还有,如果你对本帖的话题有任何疑问或疑问,欢迎随时联系!

数据科学领域一年的经验教训

原文:https://towardsdatascience.com/lessons-from-a-year-in-the-data-science-trenches-f06efa6355fd?source=collection_archive---------13-----------------------

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

(Source)

学习将机器学习投入生产的五点收获皮层构建智能

在过去的一年里,我已经从编写 Jupyter 笔记本的简单世界转向开发机器学习管道,以便全天候向建筑工程师提供实时建议。虽然我还有改进的空间(我仍然会犯很多编码和数据科学方面的错误),但我已经设法了解了一些关于数据科学的事情,我们将在本文中讨论。希望通过下面的课程,您可以避免我在日常数据科学前沿学习操作时犯的许多错误。

  1. 生产数据科学主要是计算机科学
  2. 数据科学仍然高度主观
  3. 人际交往和沟通技巧至关重要
  4. 使用标准工具,缓慢采用新技术
  5. 用外在的简单隐藏数据科学的内在复杂性

作者注:这是从单一角度写的,不代表数据科学的整个领域。请记住,这是一位端到端(从概念到部署的机器学习系统)数据科学家在建筑能源领域的工作,为更有效地运营建筑提供实时建议。如果你有过不同的经历或者想反驳我,评论区等着你的回复。

生产数据科学主要是计算机科学

当被问及这项工作最难的部分时,我坚定地回答说这不是机器学习,考虑到我们所有的 ML 看起来都像:

from sklearn import ModelModel.fit(features, target)
predictions = model.predict(testing_features)

相反,数据科学最难的部分是开发建模前后发生的一切。在我们之前有:从数据库加载数据、特征工程、数据验证和数据处理管道(假设我们的工作在数据被摄取之后开始)。在我们需要验证结果之后,将任务设置为按计划自动运行,将结果写回我们的数据库,并发送 webhooks 来触发其他服务。

这些外围动作,包括机器学习中的大部分工作,都需要扎实的计算机科学实践。A 与开发代码相关的一些 e 实践是编写许多短函数,每个函数做好一件事,开发实现相关函数的类,适当的命名约定,对代码和数据编写单元测试,编写易于阅读的代码,以及不重复代码。此外,围绕代码本身还有其他计算机科学实践可以应用,如版本控制、代码审查、持续集成、代码覆盖和部署,这现在已经催生了一个完全独立的领域机器学习操作 (MLOps)。

虽然我成功地完成了机械工程->数据科学家的转型,但现在回想起来,做工程->计算机科学->数据科学会更有成效。第二种方法意味着我不必忘记我在数据科学课上学到的糟糕的编码实践。换句话说,我认为在扎实的计算机科学背景之上加上数据科学比先学数据科学再从事计算机科学更容易(但两条路线都有可能)。

计算机科学涉及一种完全不同的系统思维方式,在编码前有条不紊地计划,慢慢地写代码,一旦写好就测试代码。干净的代码与数据科学的自由天性形成鲜明对比,数据科学有几十个写了一半的笔记本(我们都有叫做Untitled12.ipynb的笔记本),强调立即获得结果,而不是编写可以重用的无错误代码。

See also https://www.youtube.com/watch?v=7jiPeIFXb6U for why notebooks aren’t always great

所有数据科学家都可以从关于计算机科学最佳编码实践的课程中受益。结构化脚本和包、编写干净的代码、测试和记录代码的能力使得从探索性数据科学到生产机器学习的过渡更加易于管理。此外,他们灌输了一种思维模式,这种思维模式可以让其他人更容易理解可重用的代码。即使是通常编写数据科学脚本来为论文分析数据的学术数据科学家,也会受益于更好的实践。如果科学家编写更干净的代码,并包含单元测试来验证输入、输出和功能行为,那么科学中的再现性问题可能会得到改善。

数据科学中有许多要学习的主题,有时会感到不知所措。然而,计算机科学不应该被看作是一种附加物;相反,它应该被视为希望看到他们的代码可操作化的数据科学家的基础。幸运的是,有大量的资源,例如软件木工,任何人都可以用来学习和应用这些实践。

数据科学仍然是高度主观的

数据科学承诺使用数据而不是人类判断来做出最佳决策。这是一项崇高的事业,但它与当前的现实相去甚远,因为我们用来分析它的数据和方法在很大程度上受到了人类的影响。即使是数据科学的客观领域也依赖于人类行为。正如 Vicki Boykis 在她出色的 Normcore Tech 时事通讯中所说的那样,神经网络完全就是人。

典型的机器学习系统的每一步都受到个人选择的影响。以下是其中的一些决定:

  • 收集数据:我们收集什么数据?我们用什么传感器?我们调查谁?我们如何表达我们的问题?
  • 特征工程:我们做什么特征?我们使用领域知识还是自动化特征工程?我们如何填充缺失值?应该删除哪些观察值?
  • 建模:我们应该用什么超参数?我们应该制作多复杂的模型?
  • 验证:评估的指标是什么?验证程序是什么?我们需要什么水平的性能?
  • **部署:**我们是否足够信任这些数字并向客户展示?我们是否需要一个人来评估这些预测以进行理智检查?

不可避免地,通过这个过程,不同的人会得出不同的结论。这方面的一个例子记录在论文[许多分析师,一个数据集](http://Many Analysts, One Data Set)中,该论文描述了数据科学家如何通过相同的数据集得出相互矛盾的决策,因为他们采用了不同的方法。毫不夸张地说,通过改变分析,你可以用一个数据集来证明一个论点及其对立面。这表明你不应该过于相信从一项研究中得出的任何结论,而是应该(带着怀疑的态度)看看荟萃分析(并阅读 如何用统计数据 )。

此外,人类的偏见,无论是有意还是无意,都会进入数据,从而影响机器学习模型。像 数学毁灭的武器 这样的书里说的那样,把决定权让给机器并不能消除歧视,而是把现实世界数据中出现的现有偏见编成法典。用数据科学结束偏见决策的目标是崇高的,但只要人类参与其中,我们就不能盲目依赖机器学习预测。

数据科学中的主观性是否意味着我们应该放弃所有的真理观?我认为我们应该重新定义这个问题:我们不是寻找一个正确的答案,而是使用数据科学,不管它有多么有缺陷,朝着更好的解决方案的方向前进。毕竟,数据科学是科学的一个子领域,目标是随着时间的推移减少错误。此外,越多的人致力于一个问题,并比较他们的工作,我们就越接近更好的结果。这 20 位科学家可能已经进行了 20 种不同的分析,但是如果他们比较他们的方法并一起工作,最终的结果将会比任何一个单独的项目都要好。

在实践数据科学时,我们必须记住,数据科学像任何领域一样,不是没有缺陷的,不应该毫无疑问地被信任。实践负责任的数据科学意味着以不确定性区间呈现结果,寻找反驳你的结论的理由,将你的结果与其他类似工作进行比较,并在呈现发现时保持现实。

由于数据科学依赖于人的判断,我们需要认识到…

人际交往和沟通技巧至关重要

虽然看似显而易见(有没有哪个领域的沟通技巧是不利的?),我每天都被提醒需要与技术领域的人有效地交流机器学习。懂你的 ML 行话还不够;你需要能够在人们理解的范围内与他们见面,并且只告诉他们需要知道的细节。

(举个有点幽默的例子,我的工作对一些人来说是“计算机的东西”,对另一些人来说是关于机器学习细节的半小时讨论。)

至少在我们的情况下,机器学习决策不会取代人类的选择(即使它们更准确),因为使用我们的建议取决于建筑工程师。(自动建筑运营可能比自动驾驶汽车更遥远)。仅仅建立模型、展示模型的准确性、将结果交给客户并期望他们立即实现预测是不够的。数据科学家仍然需要掌握混乱的社交艺术。你可以产生尽可能最好的机器学习模型,但如果你不能说服人们使用它,那么它就没有任何影响。

我的工作中最常见的人员方面是通过写作和向内部和外部团队演示来解释方法,了解我们的客户当前如何做出决策,并与领域专家交谈以将其知识转化为数据科学系统。在大学里,我被告知数据科学家可以隐藏在完美客观的数字背后,但这些都没有被提及。

即使你解释了计算机是如何做出决定的,这个建议也可能被忽略,因为人并不完全理性。当面对客观上更好的选择时,人们可能会出于各种原因选择另一个选项:习惯、缺乏信任、熟悉、错误信息。

考虑风景路线的选择:有时,人们,出于似乎没有逻辑的原因,会在两个地方之间选择一条明显更长的路线。为什么?因为一路上还有更美的风景。一个天真的数据科学家可能只显示模型推荐的最短路线,但是,一个了解她的客户的数据科学家会知道,他们希望在他们的旅程中看到的不仅仅是无尽的州际公路。

同样,最佳机器学习预测可能不会被使用,因为准确性不是唯一的考虑因素。例如,我们预测建筑工程师开始为他们的建筑供暖的理想时间,但许多工程师仍然会更早打开设备,因为他们不想让租户感到不适。这是不合理的(我们对我们的建议进行计时,以确保租户到达时大楼将处于正确的温度),但是,在我们将人类从决策过程中移除之前,我们将不得不使我们的计算机系统适应人类,而不是相反。

或许除了你的计算机科学课程,还可以上几门社会学课程来了解你的人类同胞(或者读一些行为经济学书籍,比如理查德·塞勒的《T2》、《T3》、《行为不端》、《T4》、《T5》、《T6》、《T7》或者丹尼尔·卡内曼的《思考》、《快与慢》、《T10》、《T11》,两位诺贝尔经济学奖得主)。

使用标准工具,缓慢采用新技术

确保您的算法不包含任何错误的最佳方法是什么?从sklearn导入一个模型,而不是自己写。除非你在做前沿研究,否则几乎没有理由编写自己版本的机器学习模型。相反,使用广泛使用且经过良好测试的库(标准工具)中的函数来完成任务。

在最近的一条推文中,我说最差的数据科学家编写自己的算法,最好的从标准库中导入。我是在开玩笑,但我支持这样的原则,即使用开源库中经过良好测试的代码几乎总是比开发自己的代码更有效。

使用标准工具的逻辑不仅适用于机器学习模型。你想对数据集做的一切都已经在pandas中实现了(假设你使用 Python ),所以先在那里寻找一个解决方案。同样,有用于统计、绘图、测试、调度、部署任务和机器学习管道的大多数部分的标准库。

我从两位博士数据科学家那里接管了我的职位,他们迫切希望(可能是为了证明他们的学位)发明自己的数据结构、度量、算法、文件加载等。,这导致了一大堆没人理解的乱码。我工作的前六个月主要是用三个 import 语句替换数百行脚本,直到今天,我还很自豪地成为我们机器学习库的净负贡献者。

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

Via Negativa: addition by subtraction

而且,不要因为新就切换到新的库/技术/框架/数据库。像 SQL 数据库,机器学习的 sklearn 和数据操作的 pandas 这样的标准工具工作得很好。他们可能平淡无奇,因为他们(相对)老了,但他们也是经过考验和可靠的。作为早期采用者,一开始可能看起来很有趣,但是当你在错误和有限的文档中挣扎时,很快就会变得筋疲力尽。

虽然新技术推动了媒体周期,但它们通常对实际工作的人和公司几乎没有直接影响(当心工程媒体)。年轻时的我不相信我会这么说,但我现在更喜欢乏味的、经过验证的技术,而不是令人兴奋的、新奇的、尚未产生结果的技术。在内部,我们的工程团队对升级库版本进行了长时间的辩论,如果没有明显的好处或需要,那么我们不会升级,因为有新的版本。向我们的机器学习代码库添加一个库需要证明需求,因为另一个库意味着要管理另一个依赖。

最长寿的公司是那些做平凡的事情并且行动缓慢的公司(像卡特彼勒),而行动迅速并且做“酷”事情的初创公司往往会在几年后消失。最强大的机器学习系统不会是那些使用尖端技术的系统,而是那些坚持使用久经考验的数据科学标准工具的系统。

用外在的简单隐藏数据科学的内在复杂性

计算机非常擅长处理大量的数字。人类几乎无法比较几个数字。为了最有效地结合计算机和人类的能力,我们应该使用计算机来分析大型数据集,并只向人类提供最关键的数字来做出决策。数百万个数字输入,尽可能少的数字输出。内部是复杂的模型,外部是可行的建议。

在过去的一年里,我发展了一个理论,一个图表的数据点越多,就不仅仅是一个小数字(也许是数字 7?),越没用。人类没有能力精确地分析复杂的定量图表。热图很酷,但是有没有人从一个有 1000 个数据点的热图和一个有五个数字的条形图中做出一个重要的决定?

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

Cool, but what am I supposed to do with this information? (Source)

作为一个通常喜欢细读数字和倾听机器学习模型细节的人,我很难习惯大多数人不想要更多信息的想法。顾客和做决定的人渴望外卖,就是这样。更少的墨水意味着更好的图表。(如果需要制作图表的帮助,请咨询定量信息可视化展示数据可视化基础】

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

Dull? Probably. Informative? Absolutely.

外部简单性的论点并不意味着只使用线性模型。数据科学可能涉及复杂的算法和高度技术性的操作。只有数据科学面向外部的部分必须足够简单,非技术人员才能理解。尽管如此,小心不要把你的模型做得太复杂,以至于连你自己都不理解。以不能解释你的模型为代价,为了一个小的精度增益,值得一个混合模型吗?

为了用外部的简单性掩盖内部的复杂性,使用可以帮助描述模型决策的工具。 SHAP 值是一种有用的技术,你可以在其他方法上再加一层。为了解释建筑物的最佳开始时间建议,我们采用包括工程特征在内的所有特征的 SHAP 值,并将它们组合成人类可以理解的特征组,如天气和内部建筑条件。我们采用复杂的机器学习算法,用我们能理解的 SHAP 值简化它,然后在向客户展示之前,用我们的知识进一步简化它。

简化定量信息的一种方法是准备一份报告,从一个数字开始,然后根据需要添加其他数字(这也适用于图表)。这种相加的方法不是从几十个数字开始并删除它们,而是确保没有无关的统计数据进入演示和报告。记住,人不是计算机,你不应该像计算机一样呈现结果。

+1 每个人都有冒名顶替综合症的感觉,都会犯错;不要让任何一个阻碍你

最后,因为这是数据科学(和其他职业)中的一个重要问题,这里有一个额外的教训作为鼓励:不要让冒名顶替综合症或错误让你沮丧。

每个人都有某种感觉,他们没有归属感,或者他们最终会被发现无法胜任这份工作,所以如果你有这种感觉,不要担心。你不是唯一一个有这些想法的人,学习新东西和产生结果一样重要,而且,如果你相对较新,作为新手也有好处(比如找到解决问题的新方法)。此外,环顾四周,很容易看到人们取得巨大的成功,但你没有看到他们一路上遇到的所有失败(一种形式的生存偏见)。

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

People have different areas of knowledge (Source)

即使是最好的表演者也是从初学者开始的,她会犯(并且继续犯)一些错误。错误并不意味着你不应该成为数据科学家或计算机程序员;它们意味着你有机会学习如何把事情做得更好。我们需要更多的人和更多样化的数据科学人才,我担心我们将数据科学家描绘成精英,并且数据科学职位需要多年的经验,从而将有技能的候选人排除在外。你只能通过在一个领域工作来获得专业知识,这不是你在开始职业生涯之前就有的东西。事实是,没有进入数据科学领域的“典型”途径。如果你因为背景或缺乏经验而认为自己不属于这里,好消息是那是一种认知扭曲;数据科学不是只为少数精英保留的职业。

结论

在这个领域工作了一年后,我最初对数据科学的无限乐观已经转变为谨慎的热情。机器学习可以很好地解决小范围的问题(比人类更好),但不是解决人类错误的万灵药。认识到该领域的局限性以避免过度推销数据科学至关重要。尽管如此,以现实的态度对待机器学习,并牢记这些教训,机器学习可以带来令人印象深刻的结果。最好的机器学习系统将通过让我们更有效地工作来帮助人类,而不是取代他们。

我感谢反馈和建设性的批评。联系我的最佳方式是在下面的回复中,或者在 twitter 上 @koehrsen_will

波音公司关于生活在计算机化世界的教训

原文:https://towardsdatascience.com/lessons-from-boeing-about-living-in-a-computerized-world-74d89f40874f?source=collection_archive---------12-----------------------

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

波音公司在最近两起事故中遇到的麻烦引起了媒体的广泛关注。除了对波音公司、认证的政治和商业以及飞行时的安全感的影响,还有一些关于计算机和软件在我们生活中日益增长的存在的更重要的教训。

作为背景,我受过软件开发和软件架构方面的培训,也读过无数的航空调查报告。为什么?因为它们是在重大不利条件下找到根本原因,然后改进系统以防止其再次发生的黄金标准。在学习和将学习付诸行动方面,没有哪个行业比美国航空业做得更好。这就是为什么波音公司的这一失误更加重要。

生活中很多事情都是循环往复的。吸取教训,有时是艰难的。行为改变,安全措施到位。事情进展顺利很长一段时间。动机甚至对为什么会减弱的理解。直到重新吸取教训。这是人的本性。

但是,除了波音和航空业,还有其他值得学习的地方。虽然调查仍在进行中,但很明显,这两起事件都是人类与一台顽固的计算机作战并失败的案例。随着计算机控制着我们生活的越来越大的份额,甚至在这场技术革命的几十年里,我们将越来越多地面对计算机在我们生活中的角色,它们不仅仅承担卑微和麻木的任务,而且还控制着影响我们生活的决策。有时候重大决策。有时甚至是生死抉择。他们不会总是做出正确的决定。那现在怎么办?当你确信计算机是错误的时候,你如何与计算机争论?打电话给主管?有人能控制电脑吗?在这种环境下,常识怎么可能占上风?

随着计算机从低级工作人员手中接管任务,无论是收银台还是各种行政办公室,对这些工作人员的期望和培训都下降了。我们把过程、数据解释和工作流程外包给计算机,把最后一英里留给剩下的人。如果一切都符合软件设计师使用的工作流程图,那就太棒了。但是如果没有呢?职员有权做决定吗?职员受过做决定的训练吗?那个职员能控制电脑吗?在许多情况下,答案是否定的。计算机不懂常识,也不会听可能懂常识的人的话。

回到波音第二:在航空业的顶端有两个对手——波音和空客。几十年来,他们遵循不同的飞机设计理念。波音来自一个时代,当时飞机仍然有所有的机械电缆和滑轮控制,而空中客车是一个相对较新的实体。在波音飞机上,计算机辅助飞行员,但直到现在,飞行员才是最终的控制者。空客飞机从一开始就被设计成由计算机监督飞行员的决策,并可能拥有最终决定权。波音公司事故中涉及的 MCAS 系统是计算机在后台工作并在波音飞机上顽固不化的第一个案例。飞行员没有被告知或训练过。

所有的软件都需要测试。而且所有的软件都有 bug,否则我们永远也不会去安装安全更新和紧急补丁。如果计算机真的做出生死决定,而且它也有最后决定权,那么测试的门槛就会大大提高。这在预算、时间表和谁有权说“还没准备好”方面有文化含义。在多年设计受计算机影响程度更高的飞机后,空客公司应该已经做好了准备。波音公司可能在这方面措手不及,没有为这种类型的软件测试做好文化准备。

他们显然被传感器的故障率弄得措手不及,而这些传感器本应驱动更高的安全措施,他们错误判断的不是系统的单个功能,而是多次重置后的累积影响。正是这种难以测试的东西,因为它超越了整洁的流程图,而是涵盖了复杂的系统交互。[根据《纽约时报》报道]

事实是,在传统的编程中,人类将问题分解成许多小步骤和 if-then-else 决策。然后编写程序以极快的速度运行这些步骤。一旦程序写好了,就必须用尽可能多的场景进行测试,并验证预期的结果是否出现。

问题 A 是这非常复杂和耗时。所以通常只有一小部分可以完成,作为测试覆盖率来衡量。剩下的就留给希望、信心和机会了。在大多数情况下,如果遗漏了什么,几周后总会有软件更新。

问题 B 是在设计和测试过程中很难预见所有的排列。我们怎么知道我们真的想到了所有可能发生的事情?事实是我们不知道。我们可以建立统计模型,并获得更高程度的信心。但是我们必须承认会有不可预见的情况。那怎么办呢?嗯,计算机本身只服从命令(首先是程序员,其次是用户),它不会思考。因此,我们必须让人类来评估情况,并在这种情况下做出最佳决策。这当然要求人能够控制局面。

任何飞行员都应该能够手动驾驶飞机,这意味着没有自动驾驶仪或计算机的指导。他们受过这方面的训练。在这两起事故中,他们显然都试图这样做。根据目前掌握的信息,计算机不会让他们这么做。

这也应该是我们对人工智能的关注,下一波计算机将在我们的日常生活中占据一席之地。普通大众对 AI 了解不多,这个词本身就有相当的误导性。人工智能给人的感觉是,计算机可能在某些时候与人类不相上下。它可能拥有传统程序所缺乏的常识。也许在遥远的未来某一天他们会。

传统程序和人工智能程序之间的关键区别在于,在传统软件中,开发者必须预见软件正在解决的整个复杂问题的每一个细节。在我们赋予计算机的越来越大的任务中,这面临着越来越大的挑战。人工智能可以解决一些更大的问题,因为不是所有事情都必须预先考虑和编码。程序可以学习输入和输出的模式,然后找到方法将相同的逻辑应用到开发过程中没有单独考虑的情况。

不久前优步在亚利桑那州的致命事故可能会对此有所启发。为了训练自动驾驶汽车,这些算法需要输入数百万张标准交通场景和路况的图像。这有助于他们分析摄像头反馈,解码汽车面临的情况以及他们应该如何处理。问题是,训练中灌输的许多意象不够多样化,不足以应对偶尔出现的奇怪事情。就像一个女人推着自行车在黑夜中穿过街道。你能在谷歌上找到多少这样的照片?

人类司机也可能第一次看到这一点。但是,人类驾驶员在做出最佳决策方面仍然更胜一筹。人类大脑比今天的人工智能系统有更多的生活经验。

人工智能程序最终能与人类的判断并行吗?是的,一旦我们可以用 70 亿人一生的经历、一个世纪的历史中可能的和期望的结果来训练它。但这是一个完全不同的层面。

这就是为什么我们应该对生活中的计算机持非常怀疑的态度。毫无疑问,它们以各种想象的方式让我们的生活变得更加美好。但是我们确实需要让常识占上风的方法。如果计算机是错误和顽固的,我们确实需要一个可以与之争论的人。如果必要的话,我们需要一种方法在适当的监督下控制电脑。

最简单的例子就是 IVR 系统(用于客户支持的自动电话菜单)。你多久在自动菜单中找到一次答案?我想很少。我们都学会了在遇到非标准问题时,按“0”或说“代表”来点击退出按钮,并与人交流。顺便说一句,这通常是我们拨打支持电话的情况。我发现 IVR 系统是一个非常误导和令人沮丧的成本节约策略。但最糟糕的是,如果系统不让你按零或与人交谈。有一次,我试了三次听不懂我的外国口音后,T-Mobile 就直接挂了我的电话,说“对不起,我们听不懂你的话,再见!”。计算机赢得战斗但输掉战争的定义。幸运的是,这是一个简单的服务问题,而不是生死攸关的情况。这些天我用 AT&T。

电脑是你的朋友。但它也可能是你的敌人。我们不要找麻烦了。

其他想法

以上为飞行员、办公室工作人员、收银员以及几乎所有与计算机工作流程交互的人提供了推翻计算机决定的机会。但是如何有序地做到这一点呢?

作为系统设计师,我们不希望他们拔掉电脑上的插头。在飞机上,断路器面板长期以来一直是禁用故障系统的最后手段。

因此,系统实际上必须设计覆盖用例。被授权的人必须表明他想推翻计算机的决定。通过这种方式,覆盖可以被本地化,它可以在数据模型中被标记,并且它可以在以后被跟踪以供审查和审计。一个明显的挑战是如何防止覆盖破坏数据模型完整性规则或软件中的其他假设。系统设计中的连锁反应是巨大的。

当然,为覆盖设计的用例可能仍然不工作。这就变成了一个递归问题。在某些时候,只需要拔掉插头。在昨天的最新报道中,似乎在波音公司的第二起相关事故中,飞行员遵循了系统设计师的程序来超越系统,但仍然失败了。众所周知的断路器时间到了。人类是最后一道防线,没有例外。根据模拟器测试,飞行员有 40 分钟。)来诊断、隔离、超越、从情况中恢复并有机会成功。没时间和电脑辩论了。接近地面的故障具有更小的裕度。

所有的智能设备不仅需要一个唤醒词‘Alexa,…’,还需要一个转义词‘Alexa,停止’。毫不含糊。否则,我们将在未来几年迎来#metoo 版本的人工智能。

为洛杉矶市长埃里克·加希提做数据科学的经验

原文:https://towardsdatascience.com/lessons-from-doing-data-science-for-eric-garcetti-mayor-of-los-angeles-1abfc835eab0?source=collection_archive---------23-----------------------

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

我一直梦想成为政府的数据科学家。我想通过数据解决与不平等和社会流动性相关的问题,因为这些是一些与我家非常接近的最有趣的问题。事实上,数据科学的这种特殊应用是吸引我进入这一领域的首要原因。

过去一年,我一直在跟踪市长预算和创新办公室(MOBI)的数据团队(T1)的工作,所以当我获得在该办公室实习的机会时,我欣喜若狂。洛杉矶市拥有美国第一数字城市的称号:数据团队的工作是美国端到端数据工作的黄金标准,从数据收集到分析和建模。我很高兴能沉浸在一个公共政策、信息技术和数据专家每天都在努力工作的空间里,不辜负这样的荣誉。我了解到,作为市长办公室的一名数据科学家,需要的不仅仅是数据科学本身,我在那里的时间让我能够探索这些数据的细微差别。当我探索为公共部门做数据科学意味着什么时,以下是我牢记在心的一些自我提醒。

1.关注数据

我的实习要求我在工作中扮演不同的角色。当我专注于构建一个可行的解决方案时,我倾向于戴上工程师的帽子去编码、插入数据并开始工作。有时手头的任务很简单,例如,生成一些数据集的可视化和汇总统计数据。但我经常不得不戴上决策者的帽子,问一些内省的问题,以超越表面层面对产出进行分析:*这些数字与社会和人口观察和/或过去的研究一致吗?进行分析的基础数据集有哪些漏洞和偏差?*此外,我不得不停下来思考这个过程本身:我如何展示我的结果,使它们对决策者有意义?他们应该从这个项目中学到什么,他们还不知道的?有哪些数据没有讲述的故事应该得到解决?

科林·马洛在 1997 年的费希尔纪念演讲中把我的困境称为第零个问题。他认为,在我们能够分析数据之前,当然也是在我们有了模型之前,需要对现实世界的问题、与研究问题相关的人群、生成数据的研究以及数据集中的变量有重要的了解。在课堂上,我将干净的数据输入到模型或分析中,我的大部分努力都集中在优化过程和解释输出上。处理现实生活中的数据是一个更加复杂、多方面的过程,其中输入的细微变化并不总是会导致输出的预测性变化。

在我所有的任务和项目中,我必须将数据及其叙述放在与所涉及的技术相关的前端和中心。尽管我的实习是编码密集型的,但我每天都会花时间阅读市长的新闻剪报,通过我们的 Slack 频道了解最新的推荐读物,并对办公室出现的每个话题进行自己的研究。

一开始,我对在政府部门工作的经验知之甚少,甚至毫无经验。我必须熟悉办公室的愿景和使命,同时为之做出贡献。我不完全确定该问什么问题,我写剧本的意图是什么。因此,我不确定我对这个更大的问题有多大影响。我必须训练自己将数据视为组织内所有其他操作和结构的相关组件。确保我能接受各种任务和情况下特定问题的利益相关者之间的关系成为我的首要任务。

2.设定意图

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

my daily reminder on my way to work

关于团队会议,我最喜欢的一件事是和我的队友一起为剩下的两周设定个人目标。不仅如此,我喜欢了解并成为我的队友的个人和工作相关的目标的一部分,而且我喜欢作为一个团队有一个共同的焦点和方向。

我在整个实习期间一直强调的一个意图是上面的第一条。回顾过去,我意识到关注数据是发展数据成熟度的关键一步。我没有意识到持续挑战你的模型和分析是多么重要,不仅是在提高效率和考虑各种方法方面,而且是在涉及其他观点的方式上——技术的和非技术的——并对他们开放。

我还了解到,作为一名数据科学家,需要一点创造力和随机应变的勇气。有人可能带着一个问题来到团队,但是他们需要回答的问题可能实际上不是他们正在问的问题。作为数据科学家,解开引导问题的意图至关重要。对于市长平台和数据所代表的人口/组织而言,一个项目或一项任务还有更多的内容。

3.奥卡姆剃刀(有点)

在数学或统计学中,奥卡姆剃刀是一种解决问题的原则,在建立模型时拥抱简单(更少的假设)。

我参与的项目教会了我如何构建简单、有针对性的解决方案来产生影响。例如,我的第二个项目是编写一个脚本,生成 GeoHub(城市的空间制图门户)内部使用的汇总统计和可视化。我们专注于涉及文件大小的汇总统计数据,以告知团队空间数据的使用情况,目标是改进存储。在决定了感兴趣的度量标准后,我可以专注于研究结果中的细微之处,产生与团队目标相关的叙述。

我了解到,创建具有增量结果的快速修复是探索这些微妙之处及其不可预测的变化的好结果。通过利用简单的过程和分析,我们减少了可能进一步模糊复杂数据的不确定性的假设。

4.讲个故事!

我也是通过收入和租金人口统计研究首次接触到 ArcGIS 的。我如此习惯于在表格中表示数字供自己使用,以至于将这些数字嵌入地理信息的概念看起来很陌生。乍一看,我并没有真正认识到通过在地图中编织信息层来讲故事的力量。对我来说,数字更直观。但是我考虑到了我的队友在城市地理方面的知识(我对此并不了解!哈哈)我意识到我可以利用他们独特的视角来更有效地交流信息。现在,观众不用在汇总表中报告社区的中值收入,而是可以在彩色编码的交互式洛杉矶地图上看到中值收入的趋势。观众可以很容易地在同一张地图上切换查看租金中位数。比盯着一张枯燥的桌子看要有趣得多的锻炼。

尽管我是城市地理学的新手,但像 ArcGIS 这样的平台给了数据科学家将数据无缝转换成不同形状的能力。意识到这些不同的转换可能会以不同的方式传达相同的故事,这是吸引不同观众的关键。我的项目的结果或输出不一定是最终结果,但它传达的故事产生了预期的影响。

5.解决一个超出你想象的问题

很多时候,我没有意识到向不同背景的人寻求帮助和意见的动机。例如,当我在一个项目中陷入困境时,我的主管建议我向该市另一个部门的成员寻求建议,他们已经解决了类似的数据合并问题,尽管她在人口普查部门工作,并且她的职位没有与“数据”相关的词。

类似的去另一个方向。对我来说是第二天性的任务,如编写循环,被证明有助于帮助我的 GIS 专家队友在自动化脚本中编写快捷方式。因此,他减少了提取数据的体力劳动时间,现在可以专注于自己的专业领域。

当我每天处理非常困难的问题时,我最终会找到解决问题的方法,这些方法超出了我的技能,也就是说,超出了我的头脑。认识到自己的弱点需要一些创造力和谦逊,在意想不到的地方寻求帮助需要一些勇气。

在加州大学洛杉矶分校的最后一个季度,我每周两次通勤到市政厅,同时还要应付一门要求很高的课程。我非常感谢团队为一名初露头角的数据科学家营造的支持和关爱的环境——我希望我能在办公室花更多的时间和我的团队在一起。我意识到,实习期间的“面对面时间”对于让自己沉浸在数据背后的文化中,并最终理解数据科学中的数据是有价值的。我学到的技术技能至关重要,但数据科学不仅是技术,也是数据收集和构建背后的故事、文化和人员。

参考资料:

  • 软糖科林。“第零个问题。”《美国统计学家》,1998 年第 52 卷第 1 期,第 1 页。,doi:10.2307/2685557。

关于如何与统计数据撒谎的课程

原文:https://towardsdatascience.com/lessons-from-how-to-lie-with-statistics-57060c0d2f19?source=collection_archive---------0-----------------------

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

(Source)

永恒的数据素养建议

如何用统计数据撒谎是一本 65 岁的书,可以在一个小时内读完,比任何关于“大数据”或“深度学习”的书都更能教会你每天可以使用的实用信息。尽管机器学习和 Pb 级数据承诺了一切,但数据科学中最有效的技术仍然是小表格、图表,甚至是总结情况的单个数字,并帮助我们或我们的老板根据数据做出决策。

一次又一次,我看到数千个复杂算法的工作时间被总结成一个数字。最终,这就是最大的决定是如何做出的:用一些人类可以处理的数据。这就是为什么《如何用统计数据撒谎》(达雷尔·赫夫著)中的教训是相关的,即使我们每个人可能在一天内产生的数据比在写这本书时全世界产生的数据还要多。作为表格和图表的制作者,我们需要有效地呈现有效的摘要。作为信息的消费者,我们需要发现误导/夸大的统计数据,这些数据操纵我们采取有利于他人而损害我们利益的行动。

这些技能属于一个被称为“数据素养”的类别:阅读、理解、争论和从信息中做出决策的能力。与算法或大数据处理相比,数据素养似乎并不令人兴奋,但它应该成为任何数据科学教育的基础。幸运的是,这些核心思想不会随着时间的推移而改变太多,而且通常关于这个主题的最好的书(比如量化信息的可视化展示)已经有几十年的历史了。本文中讨论的经典书籍以简洁、有效和令人愉快的格式阐述了负责任的数据消费。以下是我从“如何用统计数据撒谎”中学到的经验,并附有我个人经历的评论。

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

The Classis Book on Data Literacy: “How to Lie with Statistics” (Source)

1.以怀疑的态度看待相关性

当两个变量 X 和 Y 相关时——意味着它们一起增加,一起减少,或者一个上升另一个下降——有四种可能的解释:

A. X 导致 Y

B. Y 原因 X

C .第三个变量 Z 同时影响 X 和 Y

D. X 和 Y 完全不相关

当 C 或 D 同样可能的时候,我们经常立刻跳到——或者被引导去相信——A 或 B。例如,当我们听说更多年的大学教育与更高的收入正相关时,我们得出结论,更多年的大学教育会带来更多的财富。然而,这也可能是第三个因素,如努力工作的意愿或父母的收入,是更多年的高等教育和更高收入的背后原因。第三个隐藏变量会导致我们得出关于因果关系的错误结论。

其他时候,两个变量可能看起来相关,但实际上彼此无关。如果你在数据集之间进行足够多的比较,你一定会发现一些有趣的关系,它们看起来是同步的。泰勒·维根在记录了这些虚假的相关性。

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

A Questionable Correlation (Source)

我们都听说过这样的建议,相关性并不意味着因果关系,但即使有因果关系,也往往不确定它会如何发展。老师对学生的表扬越多,成绩越好吗?分数越高引起的好评越多吗?还是有第三个因素,更小的班级规模或更多的自然采光,导致这两个变量都增加了?原因问题由随机对照试验来回答,而不是由观察性研究来回答,在观察性研究中,我们不能排除我们没有测量的其他因素。为了避免被误导,通过寻找混淆因素来怀疑变量之间的相关性。人类喜欢简洁的因果叙述,但这通常不是数据告诉我们的。

2.关系不会永远持续下去

如果你已经成功地确定了一个相关性,不要假设它会永远存在,无论是正向还是负向。线性关系几乎总是仅在两个变量的有限区域内是线性的*。*超过一个点,关系可能变成对数,完全消失,甚至反转。

这可以在随时间外推的生长曲线中观察到。有一些线性时期,经济以恒定的速度增长,但最终增长会趋于平稳,因为几乎没有什么东西会无限期地增长下去。

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

Male Height vs Age Showing Leveling Off of Growth Curve (Source).

在一个关系的适用范围之外进行外推被称为泛化误差。你是在利用一种本地现象,并试图将其应用到全球。随着人们摆脱贫困,他们往往会对生活更加满意。然而,一旦他们达到某个点(也许是 75,000 美元/年),幸福感不会随着财富而增加,甚至可能会减少。这表明财富的增加存在收益递减,就像人类活动的许多方面一样,比如为考试而学习。

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

Happiness Increases with Wealth Up to a Certain Income Level (Source)

我们总是看到推断:公司增长率、人口统计、股票价格、国家支出等等。通常,人们会在一个地区使用有效的关系来表明一个地区的观点(例如声称 100 万美元/年将带来纯粹的幸福)。请记住,局部地区的关系并不总是适用于全球。即使你已经证实了因果关系——或者在图表中看到了——也要确保你不理解有限有效区域之外的内容。

3.总是看图表上的坐标轴

调整图表的轴来表示一个点是操纵图表的经典技术。作为首要原则,条形图上的 y 轴应该始终从 0 开始。如果不是,通过操纵范围来证明一个论点是很容易的,例如,把微小的增加变成巨大的变化:

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

Misleading Graph That Does not start at 0 on the Y-Axes (Left) (Source)

另一个误导性图表的例子是不同比例的 y 轴。通过仔细调整价值,你会在不存在的地方创造出令人惊讶的趋势。

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

A Misleading Graph Creating An Extreme Trend Where There is Only a Small Increase (Source)

虽然这看起来像是一个明显的操纵,但广告商和报纸逃脱了惩罚,因为人们不阅读信息。大多数人看到一个图表,会立即从线条或条形的形状中得出结论,这正是制作图表的人想要的。要解决这个问题,请尝试读取轴值。一个简单的检查可能会告诉你变化并不像看起来那么大,趋势是从无到有的!

一旦你做了一些制作图表的练习,你就会意识到操纵它们对你有利是多么容易。防止不准确数据的最好方法可能是亲自动手制作。

(如果你想要一本关于制作合理的数据可视化的好书,可以看看爱德华·塔夫特的定量信息的可视化显示或者克劳斯·威尔基的数据可视化基础。)

4.小样本产生令人震惊的统计数据

如果我告诉你最高的癌症发病率往往发生在人口最少的县,你会惊讶吗?没那么震惊。如果我补充说,最低的癌症发病率也往往发生在人口最少的县,那会怎么样?这是一个小样本情况下发生的经过验证的例子:极值。

任何时候研究人员进行研究,他们使用所谓的样本:代表整个人口的人口子集。当样本足够大并且具有更大人群的相同分布时,这可能会很好,但通常,由于资金或响应率有限,心理、行为和医学研究是用小样本进行的,导致结果有问题并且无法重现。

科学家通常被合法的问题限制在小样本范围内,但广告商通过进行许多微小的研究来利用少量参与者,其中一项将产生积极的结果。在评估一项研究时,人类并不擅长调整样本量,这实际上意味着我们将 1000 人试验的结果视为 10 人试验的结果。这被称为“对样本大小不敏感”或“样本大小忽略”。

这是另一个例子。如果你认为自己懂数据,那么这个问题对你来说没有问题:

某镇有两家医院。在大医院,每天大约有 45 个婴儿出生,在小医院,每天大约有 15 个婴儿出生。如你所知,大约 50%的婴儿是男孩。然而,确切的百分比每天都在变化。有时可能高于 50%,有时更低。

在一年的时间里,每家医院都记录了超过 60%的新生儿是男孩的日子。你认为哪家医院记录了更多这样的日子?

1.较大的医院

2.较小的医院

3.差不多(也就是彼此相差 5%以内)

如果你猜是 2。,那么恭喜你,你懂数据!原因是样本量越小,数值越极端。(这是来自 Tversky 和 Kahnemann 的不确定性下的判断:启发和偏见。我强烈推荐阅读这篇论文,并思考,无论快慢,来了解影响我们决策的认知偏差。)

你可以通过掷硬币来检验小样本产生极端结果的原理。对于一个小样本,比如说 5 次投掷,你很有可能得到 4 条尾巴。这是不是意味着硬币总是 80%是反面?不,这意味着你的样本太小,不能得出任何有意义的结论。

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

With smaller sample sizes, we get more extreme results (Source)

这种技巧通常在通过向少数人询问特定品牌来营销产品时使用。如果你反复调查小群体,只报告有利的结果,你可以得到令人印象深刻的数字(90%的医生喜欢这种牙膏)。问一个小组,看看结果,扔掉不好的,重复直到你得到你需要的统计数据!

避免被小样本愚弄的解决方案是在数据中寻找观察值的数量。如果没有给出,那么假设无论是谁进行了这项研究,都有所隐瞒,这些数据是没有价值的。行为科学家已经表明,我们大多数人容易忽视样本量;不要犯同样的错误——相信大量的观察结果,而不是来自小样本的令人震惊的统计数据。

5.看看所有描述数据集的数字

检查样本大小可能是避免被数据愚弄的一种方法,但前提是样本大小已经提供。误导数据消费者的另一个技巧是避免列出描述数据集的相关数字,如观测值的计数、数据的分布(范围)、数据的不确定性(标准误差)、数据的分位数等等。其中的每一个都可以用来更深入地研究数据,这往往违背了提供数据集的人的利益。

例如,如果你听说一个城市一年的平均温度是华氏 62 度,但不知道最高和最低温度,这是没有帮助的。这个城市可能会冷到零下 20 华氏度,热到 120 华氏度,但平均起来还是一个舒适的值。在这种情况下,正如在许多其他情况下一样,单个数字不足以描述数据集

作为书中的另一个例子,如果你有两个孩子,其中一个智商测试 99,另一个 102,你真的不应该告诉他们,以避免比较。为什么?因为智商测试可以有大约 3 分的标准误差,这意味着一个曾经得过 99 分的孩子有大约 68%的几率会得到 96 到 102 分。总体差异可能并不显著,并可能在重复测试中逆转。换句话说,通过在结果中忽略预期的标准误差,你可以得出一个比数据更激烈的结论。

不报告一个以上数字的研究通常有所隐瞒。同样地,如果一个图表看起来切断了一些数据,它是不可信的。通过子集化数据来改变叙述太容易了。

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

Graphs can change based on data shown (Source)

你可以这样想:如果有一种药能让寿命平均延长两年,你会服用吗?如果最坏的影响是损失 12 年寿命,最多增加 14 年寿命,你会改变主意吗?重要的通常是细节,一个汇总统计数据不能说明全部情况。

6.检查使用哪个平均值

另一个有用的方法是改变“平均值”的定义。你有 3 个选择(如果你聪明的话,可能更多):

  1. 平均值:将这些值相加,然后除以观察次数
  2. 中位数:从最小到最大对数值进行排序,并找出中间值
  3. 模式:找到最常出现的值

我以前写过这个问题(详见这里),基本思想是:一个分布的均值和中值只有在它是正态的情况下才是相同的,我们生活在一个主要有非正态数据的世界。这意味着数据集的平均值和中值不是同一个值,通常相差很大。

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

Mean vs Median vs Mode in Normal and Skewed Data (Source)

例如,美国的平均收入和中值收入相差大约 16000 美元。通过选择报告的平均值,政治家、营销人员和首席执行官可以从相同的数据中得出相反的结论。

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

A skewed distribution with different mean and median (from my story on types of averages.)

避免这种情况的方法是查看数据集的平均值、中间值和众数(同样,您需要所有这些数字!).找出哪一个是最合适的(通常是收入、城市规模、寿命、房价等高度倾斜数据集的中间值),如果你需要一个数字的摘要,就用它。如果可以的话,将整组数值绘制成直方图,并观察分布情况。试着用一个以上的数字来描述一个数据集,如果你报告一个平均值,请说明你使用的是哪一个!

7.使用与公共基线的比较

查看统计数据时,重要的问题通常不是值是什么,而是当前值与以前的值相比如何?换句话说,与绝对量级相比,相对变化是多少。如果我告诉你,2017 年美国国内生产总值为 19.39 万亿美元,这听起来令人难以置信,因为你的日常经历。然而,如果你与美国前一年的 GDP 18.62 万亿美元相比,它看起来并不那么令人印象深刻。

数据通常在我们不熟悉的尺度上,我们需要与其他数字进行比较,以了解统计数据是否代表了真正的变化。火星平均半径 3389 公里大吗?我不知道这意味着什么,直到它与其他星球相比!

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

Compare stats to other similar numbers (Source)

我们不仅希望将统计数据与过去的值以及同一类别中的数字进行比较,还希望确保统计数据的定义不会改变。根据《如何撒谎》一书,美国农场的数量从 1930 年到 1935 年增加了 50 万,因为人口普查局对农场的定义改变了!降低失业率最简单的方法就是改变定义,将停止找工作的人排除在外。

数据收集方式或数值定义的变化往往会产生被误认为实际趋势的极端结果。为了解决这个问题,首先,从整体上看整个系列的值。其次,确保定义在时间范围内没有改变。只有这样,你才能开始从数据系列中得出结论。你可以说纽约在 2018 年发生了 289 起谋杀案来吓唬人们,但当你将这一数字与 1990 年的 2245 起相比较时,你会意识到纽约市从未如此安全过!重要的通常是比较;不要让一个孤立的数字左右了你的理性思考。

8.寻找样本选择中的偏差

还记得我们谈到的从样本中收集的所有数据吗?我们希望这些样本能够代表总体?除了关注样本大小,我们还需要寻找样本中的任何偏差。

这可能来自所使用的测量方法:固定电话屏幕可能有利于更富有、更年长的参与者。它也可能来自物理位置:只调查住在城市的人,因为它更便宜,可能会使结果偏向更进步的观点。样本偏差在政治民意调查中尤其普遍,2016 年的调查显示,有时样本并不能代表整个人口。

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

Sampling Bias in Action (Source)

在检查一项研究时,我们需要问谁被纳入样本,谁被排除在外。几十年来,心理学和社会学研究一直受到这种怪异偏见的伤害。样本只包括来自西方、教育、工业化、富裕、民主国家的人(通常是大学生)。当参与者如此有限时,很难合理地说一项调查代表了全人类!

我们还应该在我们的信息来源中寻找抽样偏差。现在,我们大多数人通过选择我们倾向于认同的信息来源,将信息选择偏见强加给自己。这导致了危险的情况,在这种情况下,我们不会遇到有不同意见的人,因此我们会变得更加固执己见。解决这个问题的方法很简单,但是很难:阅读不同来源的新闻,尤其是那些与你不一致的新闻。

如果你是《纽约时报》的读者,可以试试《华尔街日报》。对于那些喜欢冒险的人,你甚至可以试着和与你意见不同的人交谈。虽然这看起来有点吓人,但我发现表面上不同意的人往往有更多的共同点——相同的核心驱动欲望——促使他们选择各自的立场。面对面地达成共识要容易得多,但即使是在网上进行文明对话也是可能的、有成效的,可以帮助你摆脱自我强加的信息选择偏见。

总之,我们需要警惕外部取样偏差和我们选择媒体来源时自己造成的取样偏差。你不会喜欢有人告诉你只看一份报纸,所以不要对自己做同样的事情。不同的观点会带来更好的结果,整合不同观点的不同信息来源会让你对事件有更全面的了解。我们不能总是得到一件事情的完全真相,但我们至少可以从多个侧面看到它。同样,当阅读一项研究时,确保你认识到样本可能不能代表整个人群,并试图找出偏向的方向。

9.警惕研究中的“大人物”,审查权威

Huff 描述了一个“好名字”的想法,作为一个添加到一项研究中,赋予它一种权威的空气。医学专业人士(医生)、大学、科学机构和大公司的名字让我们自动信任他们产生的结果。然而,很多时候这些“专家”实际上并没有创作出作品,而只是间接参与其中,这个名字是为了迷惑我们而加进去的。其他时候,比如当卷烟制造商利用医生来销售他们的致命产品时,当局直接被收买去撒谎。

避免被令人印象深刻的名字说服的一个方法是“确保病历报告上的名字位于病历报告的后面,而不是旁边。”不要看到一个机构的名字就马上假设这项研究是可靠的。我认为我们不应该看作者或大学,直到我们分析了统计数据,以避免我们强加给自己的任何无意识的偏见。

即使结果来自一位公认的“专家”,也不意味着你应该毫无疑问地接受它们。权威人士的观点是一种谬误,当我们假设拥有更大权力的人更有可能是正确的时候就会出现这种谬误。这是错误的,因为过去的成功与当前的结果是否正确没有关系。正如卡尔·萨根所说:“当局必须像其他人一样证明自己的论点。”(出自闹鬼世界: 黑暗中的科学蜡烛)。

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

The Appeal to Authority logical fallacy (Source)

正如我们在整个科学史中所看到的,没有人是不怀疑的(记得亚里士多德说过有五种元素吗?或者当 IBM 的总裁说“我认为大约有五台电脑的世界市场”。)许多最伟大的发现都来自于挑战权威和公认的智慧。一个有着响亮名字的统计数据应该和其他任何统计数据一样受到同样多的审查。统计和数据并不效忠于更高的权力。

10.不要过于相信任何一个统计数字

“如何对统计数据撒谎”的总主题是:用怀疑的眼光看待任何一个统计数据。任何数字都代表一组数据的精华,这些数据是由容易出错的人使用不完善的工具,在不断变化的条件下,在某个时间点对人口样本进行提取的。数据由另一个人分析,他为一个机构工作,这个机构可能有不同动机的外部资助者。最后,统计数据或图表是由出版商提供给你的,出版商有自己的利益让你相信一个想法。

所有这些导致了两个结论:

  1. 如果你把所有的信念都放在一个数字上,那么你将会过度适应产生这个数字的特定环境。
  2. 统计和数据从来都不是纯粹客观的。统计是对不确定数据的一种解释,旨在说服。

我们不应该完全放弃统计和数据收集。有了正确的设计,研究可以发现关键的趋势——吸烟对你有害,氯氟烃在臭氧层上制造了一个洞更多的财富带来更多的幸福,以及氟化水极大地改善了牙齿健康——然后带来更好的总体结果。相反,我们需要承认数据收集和处理是一个不确定的过程,有许多因素影响我们看到的最终数字。

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

The identification and work to close the ozone layer hole is a data and environmental success story (Source)

人类是可变的,世界也是可变的——这是生活在其中如此美好的部分原因——所以我们应该警惕声称用一个图表或表格来概括它的统计数据。我们应该寻找值的范围,用置信区间报告数字,在下结论之前收集更多的数据,比较多项研究,并询问数据收集过程的设计。

当证据的负担无可辩驳时,我们需要承认我们错了,改变我们的想法。也许没有适用于整个宇宙的客观真理,但随着时间的推移,我们会变得不那么错误。这基本上是科学的目标:每一项新的研究都让黑暗多一点光明。这也应该是数据科学的目标:通过每一个新的数据集揭示我们世界的更多结构。同时,我们需要认识到数据的局限性,不要过度概括。更多的数据不是万灵药,但是更多的数据加上辩论、多重分析和审查可以带来更好的现实世界决策,这就是我们作为数据素养公民所希望的。

结论

如果我在数据科学领域学到了什么,那就是最有效的消磨时间的方式是用 4 个数字做一个条形图。机器学习建模是前沿的,但最终,CEO 想要看到的只是一个简单的图表,她可以从中得出结论。这本身没有错:作为数据科学家,我们的工作是从大量数据中提取意义。意义并不意味着显示几百个数字,它意味着显示有限的几个具有高价值的数字。我们呈现这些数字的方式会对它们的使用方式(或是否使用)产生很大影响。

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

Simple charts are usually the most effective (Source)

数据素养意味着拥有解释图形、图表和统计数据并得出可行结论的技能。这些结论不一定与制作图表的人一致,当他们一致时,你应该持怀疑态度。作为数据产品的消费者,我们需要了解操纵数据来证明一个观点或将消极因素转化为积极因素是多么容易。练习阅读统计数据和可视化数据——实际上是阅读一个数字——会有所帮助。另一个有用的策略是自己制作大量图表。练习使用最好的技术,并确保不故意误导他人。

这个世界不是一个糟糕的地方,但有人不把你的美好愿望放在心上。通常,他们会利用数据作为工具,说服你按照他们的利益行事,而不是按照你自己的利益行事。对抗这些策略的最佳屏障是基本的数据素养:理解数据是如何被操纵的,以及你可以突破错误观念的方法。适度的怀疑对你个人和整个数据科学领域都有好处。记住这些教训,走出去,做一个负责任的数据生产者和消费者。

一如既往,我欢迎反馈和建设性的批评。你可以在推特上找到我。

“无限记忆”的教训

原文:https://towardsdatascience.com/lessons-from-unlimited-memory-f0791e7df56?source=collection_archive---------22-----------------------

我如何学得更好。

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

Photo by Kimberly Farmer on Unsplash

有无数关于数据科学的资源(以及你可能感兴趣的任何东西),但是你如何真正地学习它呢?

比我愿意承认的更多的时候,我发现自己在课程和辅导之间跳来跳去(也许什么也没完成🤦‍♀).

我知道这不是学习新概念的有效方法。

所以我决定从技术上退一步,学习如何更有效地学习。

我找到了凯文·霍斯利写的《无限记忆》这本书。这是一本很棒的读物——短小精悍,额外的好处是可以用亚马逊的 Kindle Unlimited 免费阅读!

我从他的书中获得了很多可行的建议,但我的三大收获是:

  • 别找借口了。
  • 你相信什么,你就会成为什么。
  • 用心学习。

别找借口了。

霍斯利首先问你会找什么借口不读完这本书,或者用你学到的东西,或者做出改变。这让我想到了为什么我还没有发表下一篇文章的借口…

我最喜欢的包括我太累了,或者太忙了,还有我不够聪明。

我喜欢 Horsely 称借口为“思想病毒”。他解释说,借口会让你变得更弱,阻碍你的注意力和精力。

你不能既有成功又有借口。所以别找借口了。

你相信什么,你就会成为什么。

可能有点嬉皮,但是太真实了。我是嬉皮士的忠实信徒。所有的自助和呜呜呜的建议绝对在我心中占有一席之地。

你吃什么就是什么。你成为你所相信的人。

如果你相信自己的极限,你的人生将会非常有限。

霍斯利写道“你的信念是关于你自己的故事,你已经接受它是真实的”。所以你必须学会控制内心的声音,并训练它去创造有益的故事。

一个很好的方法是可视化冥想:我找一个安静的地方,在我的手机上设置定时器(只要 5 分钟就够了!),并想象我的梦幻世界。

用心学习。

Horsely 教导我们坐下来学习时要有强烈的好奇心。如果你没有一个强烈的目标,你就不能有效地学习。

这个对我来说也很重要。我无法告诉你有多少次我开始学习 x 话题,然后几个小时后我就像掉进兔子洞一样,甚至不在同一个字母表里——我仍然对 x 一无所知。

你的思想从不徘徊;它走向更有趣的东西。

尤其是在数据科学领域,有无数的教程和书籍、博客帖子和视频——你不可能消费所有的内容。

选择一件事来学习,并真正地学习它。完成那门课程。完成教程。完成项目…或文章。😳

你不能把半成品放在你的文件夹里。

我是这里最糟糕的罪犯之一。但是,我承诺带着目的、兴趣和好奇心去学习。

结论

《无限记忆》是一本很棒的速读读物,里面塞满了令人振奋的可操作的花絮。

这给了我一个小小的激励,让我可以回去工作,提高自己的技能,每天学习新的东西。

因为,正如霍斯利所言“学习不是目的地;这是一个持续的过程。”

我作为数据科学家第一年的经验教训

原文:https://towardsdatascience.com/lessons-in-my-first-year-as-a-data-scientist-1a03f34a88ea?source=collection_archive---------35-----------------------

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

Photo by Briana Tozour on Unsplash

当了一年数据科学家后,我写下了这些想法。现在,几年后,它们仍然是真实的。举例来说,我在一家医疗保健公司工作的第一年,数据科学小组的行为有点像一家咨询公司——我们会接手一些项目,以创建预测模型并提供其他分析支持。出于这个原因,我学到的许多经验教训更多地与在业务中运营数据科学项目的问题有关。在接下来的几年里,这些教训让我受益匪浅。

特征工程很重要

这一年的一大教训是,特征工程是建立预测模型的最重要部分。对于任何有很多机器学习经验的人来说,这可能并不奇怪,我在开始时肯定听说过这一点。但老实说,在我开始之前,我很难想出什么时候或为什么它很重要的例子。在实践中反复看到这样的例子,真的让我有了更深层次的理解。如果你的特性很糟糕,你使用什么样的模型并不重要,能够理解什么样的特性会有用是一项需要抽象思维和直觉数学的技能。这就是机器学习难的地方。

获得最佳性能并不重要

当我最初学习数据科学和机器学习时,有很多对性能指标的强调。事实是,对于几乎每个项目,你可以很快获得项目实际价值的 90%,而最后的 10%将花费你十倍的时间。对于大多数项目来说,这是不值得的。虽然使用 Kaggle 时,您希望尽可能完善模型,因为您选择的性能指标 0.01 的增长可以成就您,也可以毁灭您,但在现实世界中,微小的增长很少会有影响(尽管显然这取决于行业和项目)。

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

Photo by Campaign Creators on Unsplash

项目最难的部分不是机器学习,而是其他一切

比知道如何构建最佳预测模型更重要的是,知道如何将业务问题转化为预测模型可以帮助解决的问题,并将预测模型转化为可操作的东西。当其他部门的人听说我们可以建立预测模型时,他们通常会想到一些他们认为预测起来会很有趣的想法。通常,他们的想法没有意义,但解释为什么会这样,涉及的技术问题,并提出可行的替代方案——这很重要。同样重要的是,一旦建立了模型,输出实际上是可用的——预测事情很容易,但通常只有当它带有一些额外的洞察力时,预测才有用。使用像 lime 这样的工具是有用的,也是解决方案的一部分,但有时你的功能对于最终用户来说是不可操作的或不容易理解的,所以 lime 是有用的,但不是灵丹妙药——需要投入更多的思考,而不仅仅是把 lime 粘在最后。

在你开始一个项目之前,问正确的问题

最后,这可能是我今年艰难学到的最重要的一课:在投入太多精力或承诺任何期限之前,确保你事先知道数据将来自哪里,项目将如何使用。有人向我描述了一个项目,我很兴奋地着手处理,并承诺很快就能完成,结果却发现编写算法是容易的部分。我得到了一份数据样本,并认为这意味着我有一个获取数据的流程。实际上,并没有这样的过程,而且要花几个月的时间才能弄清楚如何访问必要的数据。尽管大部分时间都花在了等待人们回复电子邮件上,这样我就可以追踪并获得必要的数据,但我最终还是因为超出了我最初的时间估计而看起来很糟糕。在大公司里搞清楚数据管道真的很难!

当另一位数据科学家离开时,我还必须接手一些在我之前开始的项目。一个是放在一起帮助导航和可视化一些文本数据的仪表板。当我与最终用户交谈,询问他们还想对项目做些什么时,我惊讶地发现,他们想要的所有更改都包括删除功能。仪表板被大规模过度设计,它的一些主要功能要么被移除,要么被保留,但从未被使用过。更糟糕的是,仪表板从来就没有打算长期使用,一年后就会退役,所以这些功能没有机会找到最终用途。这意味着时间被浪费了两次——一次是创建这些功能,另一次是返回并删除它们以简化控制面板。

这一经历和其他经历真正教会了我,无论我在做什么项目,都要和最终用户建立紧密的反馈回路。两周一次的半小时会议可以节省很多时间。

我在开发人工智能策略中学到的经验

原文:https://towardsdatascience.com/lessons-ive-learned-developing-an-ai-strategy-45e3f7c18426?source=collection_archive---------19-----------------------

大公司如何建立人工智能战略?他们如何在 AI 时代建立竞争优势?他们如何构建 AIoT 生态系统?

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

作为一家全球科技公司的顾问,我在过去的两年里一直在研究这些问题。在这篇文章中,我想展示一家大公司是如何思考和构建其人工智能战略的。

许多公司正在试图从低成熟度的状态过渡到人工智能优先的模式。然而,成为一个人工智能优先的组织被证明是极其困难的,但也是非常有益的…

数据和竞争优势

我相信大公司已经到了运营人工智能的时代。他们有几个人工智能项目已经投入生产,并在其流程或产品中带来了真正的附加值。此外,他们已经将人工智能结果确立为整个公司的新标准,并正在进行持续的改进。

在考虑人工智能之前,我们花了很多时间通过几个计划(策划数据管道、数据湖等)来改善我们的数据文化。).它是人工智能生态系统首先工作的基础。

显然,拥有高质量数据的数据湖的公司可以训练出最好的 AI 系统;最好的系统有最广泛的用途;这些系统的广泛使用为拥有最佳人工智能系统的最大公司的数据湖贡献了更多数据。

然后,这些数据可以用来改进现有的模型,并创建全新的模型,从而形成一个强化/虚拟循环。那些拥有最多数据的人往往能够训练出最好的人工智能系统,而那些拥有最好人工智能系统的人往往能够收集到最多的数据。

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

这场数据竞赛具有重要的战略意义。事实上,一旦收集到足够的数据**(实时数据收集的过程是高效的)**试图进入该行业的新公司几乎没有选择,只能依赖先行者控制的数据。

**我相信,当涉及到数据& AI 时,先发优势的想法更加强烈。**事实上,访问大量相关的数据集意味着收集数据的新努力注定非常耗时,因此在商业上也很困难。

我们的目标是达到数据统治的水平。

我认为,许多公司花费大量时间和金钱积累的数据资产并不真正值得这么多**,因为从数据的角度来看,它们并没有提供一种主导市场的方式。**

最好的情况是,你的专有数据非常有价值(复制起来很难,成本也很高),这就是为什么免费的数据如此之少。我相信,随着时间的推移,开发您的专有数据存储库将会产生价值和防御能力。我们制定战略时谨记,我们的数据是捍卫我们市场地位的一种方式。

数据统治也使你能够测试各种基于人工智能的想法。由于预算原因,小公司承担不起这么大的风险。您的数据优势越小,您的数据战略与业务战略分离的可能性就越小。**受益于人工智能的公司比竞争对手更早投资,这绝非偶然。**很明显,还需要准备好关闭早期阶段没有明显收益的人工智能概念验证。

越早开始,竞争对手就越难赶上。更好的预测将吸引更多的消费者,更多的消费者将产生更多的数据来训练人工智能,更多的数据将导致更好的预测,以此类推,形成良性循环。过早采用可能代价高昂,但过晚采用可能是一个战略错误。

另一个经常被低估的重要因素是发展伙伴关系的必要性。我们花了很多时间思考如何通过与其他组织、大学、数据提供商或政府部门合作来积累更多战略数据。建立互惠互利的关系可以为您的公司提供独家数据和相关利益。

  • 大型公司和创业公司

我注意到,尽管拥有大量数据,但大公司仍在努力构建有效的人工智能系统。另一方面,人工智能创业公司缺乏相关的高质量数据集来训练他们的模型。这种情况创造了一种环境,在这种环境中,两个实体需要并经常相互合作。

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

大公司坐拥大量数据,他们甚至不知道如何处理这些数据,所以通常情况下,需要帮助的是那些人,但另一方面,初创公司,如果他们只使用开放数据,他们可能不具备训练算法所需的相关性和质量。

  • 开放数据

我也意识到只有少数大公司倾向于使用公开数据。事实上,许多公司认为,公共部门组织公开发布的数据往往质量很差,需要进行广泛清理,并与其他专有数据集结合起来,以证明其有用。

然而,许多人工智能系统实际上主要或专门针对开放或可公开访问的数据进行训练。例如,可以对来自维基百科或 Twitter 等社交媒体的文本训练自然语言处理系统。

  • 用更少的数据做更多的事

我们也非常重视一切可以帮助我们用更少的数据开发项目的东西。事实上,我们已经依赖数据增强技术或转移学习来提供帮助,但在未来,由于利用数据的新方法,我们可能会看到另一种转变。

商业模式和数据

决策者现在意识到,传统的商业模式在持续混乱的商业环境中根本行不通。建立人工智能战略的一个关键挑战是找到收集有用数据的方法,并用它们来加强你的地位。收集数据的最有趣的方式之一是,即使没有机器学习,也要构建一些有价值的东西,然后以一定的成本出售,以收集数据,甚至免费提供数据。通常,这种策略经常被创业公司用作商业模式。

当您希望通过从一开始就向用户提供大量价值来收集大量数据时,这种构建“数据陷阱”的想法非常有用。数据枯竭只是产品效用的副产品。

我们还试图将讨论从数据转移到智能产品和流程上。的确,数据可能是基础,但基础需要被设计成支持位于其上的东西:更智能的产品和业务流程。

我们的目标是通过人工智能增强我们所有的产品或后端操作,并为最终消费者创造真正的附加值。我经常听到人们说“我们必须进入 AI”,但这是一个错误。**问题的一部分在于,没有人工智能商业案例这种东西。**相反,商业案例将针对特定的商业场景、问题或用例,将人工智能方法和技术作为整体解决方案的一部分。

在我们的大多数人工智能项目中,我们非常注意在维护我们的品牌形象(精度、效率等)之间找到正确的平衡。)以及我们的模型提供的整体准确性。**没有一个模型是 100%没有错误的。**模型总会犯一些错误,但你要知道错误的后果是什么。它将如何影响您的品牌形象?你的客户会有什么反应?…

  • 创造新的收入来源

由于人工智能的出现,我们还寻求通过利用我们所掌握的新信息来创造新的收入来源。我们使用这种方法来推动整体增长,通过这种方法,公司可以使用人工智能来不断识别结合自身和外部数据的领域,从而为他们提供进入新市场的途径。

商业模式的转变在建立长期竞争优势方面具有战略意义,因为当公司使用人工智能做新的事情而不是做同样的事情时,人工智能在推动增长方面最有价值,只是稍微好一点

例如,通过聊天机器人应用人工智能来改善你的网站体验听起来很棒。但是,越来越多的公司做同样的事情,这不再是差异化。我们总是试图改变客户体验,提供全新的东西。

  • 销售知识

我们也想了很多关于如何销售由于我们的人工智能计划而产生的见解。AI 的知识捕捉能力为企业创造了一个从销售实体产品转向销售知识的机会。例如,一个最先进的制造工厂可以使用人工智能系统向同行业的竞争对手展示其知识或流程。

建设文化

人工智能不仅仅是一种技术解决方案。我们花了很多时间围绕它建立一种文化。事实上,现在不同的部门不再互相争斗,而是分享他们的创新知识,以提供定制的、有凝聚力的客户体验。

为了改进我们的流程,我们决定用机器学习来改革公司。我们意识到推广我们的数据集和挑战成为潜在雇员的强大诱惑。

从人工智能采用的早期阶段及以后,许多公司要么止步不前,要么由于从数据、人才到技术本身的几个障碍而放缓。虽然人工智能提供了打开新市场和创造新收入流的独特能力,但当在整个企业范围内大规模实施时,它的好处会最大化。

我坚信一个人工智能的策略是不够的。在探索和利用战略机会方面,用人工智能制定战略同样重要,甚至更重要。优化精心选择的 KPI 成为 AI 的战略目标。

新手数据科学家在真实数据团队中工作的经验教训。

原文:https://towardsdatascience.com/lessons-learned-by-a-rookie-data-scientist-from-working-in-a-real-data-team-4091f33055fe?source=collection_archive---------32-----------------------

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

在写这篇文章的大约两个月前,我是一名本科生,对机器学习和数据科学有浓厚的兴趣,并有一些有趣的个人项目。但在此期间,我在一家名为 SocialCops 的数据智能公司实习,担任数据科学职位。这是我人生中最陡峭的学习曲线之一,帮助我了解了成熟的数据驱动项目的复杂性以及数据团队的功能和本质。以下是我的一些关键收获,这些是我从其他在线课程或个人宠物项目中永远得不到的。我希望当他们从事第一份数据科学工作时,他们能帮助像我一样的其他人—

  1. 规模是克星

如果这是一场 kaggle 竞赛,一个 7Gb 的模型以 x%的准确率给出你的最终预测,就像一个 2Mb 的模型以 x-1 %的准确率给出你的最终预测一样好。在现实生活中,没有那么多。不仅要考虑模型的当前性能,还要考虑它将如何随着时间的推移而发展,这是至关重要的。更快的迭代需要敏捷模型。可以通过添加新数据来改进的模型,并且不需要大量资源来部署和获取反馈。认识到准确性不是唯一的衡量标准,可伸缩性也是同样重要的因素,这一点至关重要。

2.团队交付,不仅仅是数据科学家

在我通常的宠物项目中,我是清理数据的人,是尝试模型的人,是忽视其可重复性和可持续性的人。增加价值的项目是由数据团队共同努力完成的。这可能是一个大约 7-8 人的团队,有时也取决于团队和组织的成熟度。

数据科学家是团队的一员。其主要角色是从数据中推动分析,收集和报告见解,并在需要时使用统计和深度学习模型来协助分析过程。另一个是数据工程师。他处于后端软件开发和大数据分析师之间的中间位置,通常负责管理数据工作流、管道和 ETL 流程。然后是业务团队的成员,他们与客户沟通,了解他们的问题,并将其传达给团队。他们还从团队中获得见解,并根据最终用户的需求进行分解,然后传达给他们。除了这些人之外,通常在工作良好的数据团队中,还有来自组织高层的人参与团队的日常运作。他们有助于团队在组织中的存在,并向其他人传达团队成员的工作。

3.安全和信任

数据是新的石油。数据也是新的电力。如果不小心的话,两者都可能被偷或误用。在本地机器上处理敏感数据是一大禁忌。数据不能根据个人的奇思妙想自由进出。与您的组织共享数据的个人和组织的信任至关重要。信任通过安全来保证。每个数据源以及为处理该数据源而编写的每段代码的安全性。负责这件事的人肩负着巨大的责任。作为一名实习生,记住我工作的安全方面并明智地使用和存储我的数据对我来说非常重要。如果是你的个人项目,这种情况几乎不会发生。因此,在处理数据及其流程时保持警惕,是需要采取的必要步骤之一。

4.交流。问吧。不要卡住。

当你在一个组织中工作时,与你在一个个人项目中工作时相比,有一件事是非常不同的,那就是你周围有许多聪明的头脑。肯定有人研究过你将要使用的这个新框架,或者你将要尝试的那个新的预处理技术。最好是礼貌地请求这些人给你一些宝贵的时间,一旦你对你将要尝试的事情有了一个很好的背景,就和这些人进行一次一对一的头脑风暴。这将给你一个明确的项目路线图,并消除你可能有的任何错误观念。如果你已经被一个小错误困扰了一段时间,这同样适用。问!

除了知识/代码/实现部分之外,这个领域还有很多东西需要学习。我认为这让它变得更加有趣和吸引人。我很感激能在 SocialCops 这样的地方和环境中迈出我职业生涯中重要的第一步。我希望这篇文章能对那些即将踏上类似旅程的人有所帮助。干杯!

构建人工智能写作应用的经验教训[指南,开源]

原文:https://towardsdatascience.com/lessons-learned-from-building-an-ai-writing-app-guide-open-sourced-6f661f9caec6?source=collection_archive---------41-----------------------

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

writeup.ai **是一个开源的文本机器人,与你一起写作。**它(大部分)由 OpenAI 的 GPT-2 驱动,并有额外的微调型号:

  • 合法的
  • 文案和使命陈述
  • 抒情诗
  • [文学作品]哈利波特
  • 《权力的游戏》
  • 学术研究文摘

主要的技术挑战是创建一个能够快速支持 10-20 个重度用户的应用程序,该应用程序可以交付 OpenAI 的 GPT-2 媒体(一个生成文本的 ml 模型)。

初始状态:

  • 开始是作为学习在 NLP(自然语言处理)中训练 ML 模型的借口。我最终主要学习了部署模型。
  • 估计要一个月才能建成。不对。花了我三个月的时间。
  • 工程师很难估计。过分自信的傻逼估计就更难了(咳)。
  • 遗憾的是,我对训练模型了解不多(lol)。还是什么都不知道。
  • 许多开源的训练脚本( nsheppard )做了繁重的工作。发现 gwern 的 GPT2 指南对于培训教程来说非常有价值。另一个很棒的快速入门工具是 Max 的 gpt-2-simple repo。
  • writeup.ai 大部分都是开源的。我添加了相应的链接,从我的错误/失败中吸取教训。我还在 GitHub 中添加了代码的直接链接。

链接。它是开源的!

app—https://write up . ai
前端回购
后端回购

背景:

  • ReactDjangoFlask 做了太多年的网络应用。
  • 对机器学习(ML)和 MLOps(机器学习 devops)不熟悉,所以请以健康的怀疑态度阅读任何建议。

读者:

  • 一些网络开发的背景是必要的,但是我积极地用行话来帮助链接。
  • 机器学习的基础知识是有帮助的。

警告:

  • 简明扼要的要点。
  • 完整的短语和缩写。即。机器学习>机器学习
  • 在大多数情况下,模型意味着机器学习模型。编写“ML 模型”是多余的。
  • 供应商锁定是真实的。享受了谷歌云平台 (GCP)这么多,从来没有打算离开。一些建议以 GCP 为中心。
  • GCP 部署和扩展 ML 资源比以前的 AWS 体验更好。
  • 电子邮件,推特,评论任何你想澄清的事情。

技术架构:

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

  • 前端(ReactJS)加入后端(Django)上的 WebSocket。通过 WebSockets 与后端通信。前端代码 | 后端代码
  • 后端解析和序列化前端请求。将消息(文本、算法、设置)和 WebSocket 通道打包到 Google 负载平衡器。后端代码
  • 负载平衡器中继到适当的微服务(小型、中型、大型、哈利波特、法律等)。
  • 微服务定期用建议词实时更新 websocket。这就产生了“流”的效果。
  • 前端从微服务接收更新的 WebSocket 消息。
  • 每个 ML 模型(小、中、大、哈利波特、法律、研究)都是一个微服务。利用率自动扩展。
  • 尝试了无数次迭代才做出 fast(er)。
  • 我通常不喜欢微服务架构(增加了额外的复杂性)。尽管尽了最大努力,微服务架构对于性能还是必要的。
  • 微服务的请求和计算成本与后端服务器有着本质的不同。传统的 web 服务器每秒可以轻松处理 500–5000 多个请求(参见 C10K )。然而,对于一个运行 1gb 模型的实例来说,每秒 50 个请求生成 50-100 个单词就可以压垮一台机器。()*
  • 后端和微服务都是用 Python 3.6 写的。姜戈(DRF)负责后台。Django 的一个单独实例被用于微服务。
  • 所有微服务实例都有一个附加的 GPU 或一个 Cascade Lake CPU 来运行 ML 模型。详情如下。
  • 后端和微服务托管在谷歌云平台上。
  • 谷歌负载平衡器将所有流量路由到微服务。它基于 URL 后缀"/gpt2-medium,/gtp2-medium-hp 等进行路由…负载平衡器还运行健康检查来检查 CUDA 崩溃。

() —每当您必须证明您的微服务用例时,这可能意味着它不值得如此复杂。*

秘鲁利马三周:

  • 在秘鲁利马为期三周的旅行开始时开始认真编码。Trip 起到了催化剂的作用。
  • 一些朋友在接近尾声时开始了 beta 测试。缓慢且经常失败。
  • 我旅行的 80%时间都在一个共同工作空间中编码。
  • 后端和开发运维两周,前端上周。
  • 随着复杂性的增加,重写了 DevOps。
  • 在行程结束时,前端通过 POST 请求与后端通信,后端再转发给微服务。
  • 不算好看也不算快,但是看到第一条消息从前端→后端→微服务端到端,让我傻乎乎地兴奋起来。

MVP 版本

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

在利马取得的成就:

  • 前端的合理数量。它有一个简单的文本编辑器和由微服务填充的决策选项。
  • 后端可以创建 WebSockets 来与前端通信。在第一次迭代中,后端通过 POST 请求与微服务通信,然后将消息转发到 WebSocket。我非常想让微服务保持沉默,不处理 WebSockets。
  • 通过 Ansible 实现自动化部署(后来被重构/移除到 Google 启动脚本中)
  • ****错误:提前发射!事后看来,我本应该在构建 4-5 周后就发布。到那时,它已经是一个很好的 MVP 了,但是我害怕,如果没有那些花里胡哨的东西,它就是一个笑话。

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

Random: There’s something magical about flow, 2:00 AM and an empty coworking space. Anything feels possible.

90/90 法则:

百分之九十的代码占了第 百分之九十的开发时间。剩下的 10 百分之十的代码占了其他 90 百分之十的开发时间。——汤姆·卡吉尔,贝尔实验室**

  • 工程师不擅长估算。
  • 严重低估了机器学习 DevOps(孩子们称之为“MLOps”)的难度。
  • 第二个主要的低估是管理我自己的特性蠕变。
  • 让微服务在 Docker 容器上工作、扩展以及用合适的模型安装 CUDA 驱动程序出乎意料地困难。

为了让 ml-微服务在 Docker 容器中工作,我必须:

  • 使用安装了 CUDA 的定制 TensorFlow 引导映像
  • 向 Google 传递一个特殊的标志来安装 nvidia 驱动程序(对于某些图像并不总是必需的)
  • 在 GCP 实例上安装 Docker
  • 将 docker 的默认运行时覆盖到 nvidia(使得使用 docker 和 docker-compose 更容易)。
  • 确保 docker 没有删除我的配置更改或恢复配置。
  • 将 GitHub 与 GCP 同步;推送时建立 Docker 图像。
  • 将 ml 模型与谷歌云存储同步。GCP 存储和实例的读取速度快得惊人。比 AWS 快。
  • 从 Google Cloud Build 中提取预构建的 Docker 映像。
  • 从云桶中提取 ml 模型,并使用单独的适当文件夹安装在 Docker 中。
  • 祈祷所有的需求(TensorFlow / PyTorch)都被正确安装。
  • 保存高清图像/快照,以便实例可以从图像快速冷启动。
  • 其余的传统 DevOps (git、monitoring、start docker 容器等)。
  • 在反思的时候,解决这些问题要容易得多,但是在那时,我不知道我让自己陷入了什么。

上述步骤必须完全自动化,否则缩放会失败。将 bash 脚本作为自动化部署的一部分来编写(在 2019 年)感觉很脏,但在 Google startup-scripts 上使用自动缩放时,这是必要的。Kubernetes 是另一个选择,但我没有聪明到用 K8。Google startup-scripts 在机器启动时运行一个 shell 脚本。自动缩放实例时很难使用 Ansible。

****提示:使用启动-脚本-网址!这告诉实例从定制的 bucket URL 运行脚本。这比将你的脚本复制/粘贴到 GCP 的 CLI/UI 中要好得多。您将会遇到许多对启动脚本的小改动。

  • 设置后端很简单。这是我第一次使用 Django 通道,它配置 WebSockets。姜戈频道的道具。
  • 由于功能蔓延,前端花费了额外的时间。我一直在增加一个新功能,因为我担心它不够好。
  • 微服务最初是用 Flask 编写的(因为每个人都这么建议)。然后我查看了基准测试,意识到如果我剥离它,我可以在 django-rest-framework 中获得相同的性能。在 django-rest-framework 中拥有一切对我来说要容易得多(我的背景是 django)。
  • 优化微服务需要一些时间。我试验了不同的显卡、CPU、内存配置和图像。稍后会详细介绍。

令人震惊的事情:

  • 直到两个月前,TensorFlow 图片上的默认 python 是 2.7
  • PyTorch 的 docker images 使用了 conda。
  • 使 nvidia 运行时在 Docker 上工作所需的覆盖。
  • ML 开源代码的例子比比皆是。很多意大利面和胶带。
  • Google 的 TensorFlow Docker 图片都是这么优化的(!)他们跑 PyTorch 的速度比 PyTorch 官方图片上的 PyTorch 跑的还快。这可能是上游 PyTorch 图像中的一个错误,没有进行调查。
  • 从 Docker 容器(TensorFlow / PyTorch)中提取时,构建可能会在上游中断。一切都变化得太快了,你会习惯的。

提示:尽量避免手动安装 CUDA。使用谷歌预装的引导镜像。
提示:记下什么 CUDA 版本/其他配置。有助于谷歌没有 CUDA 版本+一些其他要求的问题。很多 CUDA 版本 Bug +框架版本的墓地。

总的来说:一旦你知道什么配置(引导映像、Docker 映像、Docker 配置、CUDA)起作用,事情就简单了。难的是提前知道…

提示 : ML 有很多新术语/行话要掌握。保存并写一份术语备忘单是有帮助的。我推荐间隔重复和 Anki

推理剖析:GPU 的名字听起来吓人!

  • 当在网络上运行机器学习模型时,你有两种硬件选择:GPU(显卡)或 CPU。
  • 优点:GPU 更快,性能通常是 CPU 的 5-15 倍。 CONS :成本更高,增加部署复杂性。
  • 许多机器学习任务只需要几分之一秒(又名图像分类)。完全可以使用中央处理器。
  • 大多数用户不会注意到异步任务中 0.05 秒和 0.5 秒的区别。你的网页应该加载很快,但是加载任务结果很慢。
  • 在 CPU 上运行 gpt-2 中等型号(1.2-1.5 GB)并不快。平均 CPU 每秒产生大约 3-7 个单词,不是理想的 UX。
  • 在谷歌云上的 Cascade Lake(最新一代至强 CPU,针对 ML 优化)、K80s、V100s 或 P100s 之间做出决策。
  • 这些基准并不是科学基线。这更像是写在餐巾纸上的快速排序启发法。
  • 表格在 Medium 上显示不好(抱歉!).喀斯喀特湖:8-10 字每秒,K80:12-24 字每秒,P100:32-64 字每秒,V100:32-64 字每秒。
  • 注意:这是在运行多个 PyTorch 实例时。我这样做是为了消除 CPU / GPU 阻塞操作的利用率。例如,在具有 GPU 的同一台机器上,由于消除了 CPU/GPU 瓶颈,两个 PyTorch 实例产生的结果可能是单个 PyTorch 实例的 1.5 倍。运行单个 PyTorch 应用程序的实例可能每秒生成 15 个单词,但是运行两个 Python 应用程序可能每秒生成 10 个单词。
  • 注意:我犯了一个巨大的错误,但是我没有尝试安装最新的 MKL-DNN 驱动程序。你可能会看到一个很好的性能跳跃。或者你可能不会。
  • 随着文本输入的增加,更高的记忆力是有帮助的。
  • 从每周期成本来看,相比 GPU,Cascade Lakes 性价比更高。感觉喀斯喀特湖刚好低于 UX 的流速下限。Cascade Lakes 没有像我希望的那样快速生成提示。
  • 我发现,在生成<50 words at once.
  • Ended up using mostly Cascade Lakes and K80s except for GPT-2 Large. Cost.

****提示时,K80s 与 P100 的权衡对 UX 的影响是可以接受的:你可以让其中的大多数运行为可抢占的,其成本是前者的 1/2。除了产品发布期间,我大部分时间都在使用 preemptible。
提示:如果使用 preemptible,Google 会每 24 小时强制重启一次。在凌晨 2 点这样的奇怪时间创建它们,这样对访问者的影响最小。提示:瀑布湖是一个完美的合理权衡。
注意事项:这些“基准”仅用于推断(实时运行模型)。大多数训练应该在 GPU 上完成。

汤姆森给第一次做望远镜的人的规则是:

“做四寸镜比做六寸镜快。” —编程珍珠,美国计算机学会通讯,1985 年 9 月

  • 从简单开始:API 端点从 gpt2-medium 生成单词。慢点。同步任务。用过的烧瓶。单端点。
  • 添加了前端。会查询 API 端点。慢点。重复的请求可能会破坏 API。
  • 添加后端作为 API 端点的看门人。
  • 将烧瓶终点改写为姜戈-DRF。
  • 集成 django-后端处理 Websockets 的通道。添加了 redis-cache,在转发到微服务之前检查重复请求。
  • 更改了前端以通过 WebSockets 进行通信。
  • 重写了 Ansible 的部署脚本,以处理 Google Cloud 的启动脚本范例。
  • 集成的微服务通过 WebSockets 进行通信,也就是允许“流式传输”。
  • 培训并添加了额外的微服务(小型、中型、大型、法律、写作、哈利波特、歌词、公司、xlnet)
  • 复杂性是从简单端点的最初概念逐渐发展而来的。

经过这些恶作剧之后,我在部署 ML 方面有了很大的提高。
:与 GCP 的核心产品(特别是存储、云构建、自动扩展、映像)紧密结合。单一服务供应商上的紧密耦合并不总是理想的(技术上或战略上)。
提示:如果你能接受与 GCP 产品的紧密耦合,你可以构建得更快。一旦我接受使用启动脚本,一切都变得容易了。
总体而言:如果我知道最终架构的复杂性(以及我自己对 DevOps 的无知),我可能会感到气馁/害怕。归因于缺乏规划和不知道自己不知道什么风险。在我的许多错误中,从简单的架构构建一个应用程序,然后逐渐用更复杂的方式重构它,是我做对的事情。

码头工人!我的显卡呢?!和其他部署困难。

注:GCP 和多克都有图像的概念。为了避免混淆,我将声明 GCP 的总是作为引导映像。

一般来说,使用 Docker 容器有助于简化部署、服务配置和代码可复制性(“iuno,worked on my machine problems”)。

在 ML 中使用 Docker 更难。问题:

  • 图像会变得非常大。官方 TensorFlow Docker 图片大小轻松 500mb-1.5gb。
  • 大多数 GCP 机器学习引导映像都没有 Docker/Compose。
  • 计数器:许多包含 Docker 的引导映像没有 CUDA。
  • 如果你有勇气从零开始安装 TensorFlow 和 CUDA,我为你鼓掌。
  • 诀窍是找到一个足够好的启动映像,并安装两者中难度较低的(CUDA,Docker)。大多数时候,Docker + Docker Tools 比 CUDA 更容易安装。
  • 许多模型经常是 1gb 以上,对于源代码控制来说太大了。需要在启动/部署时同步大型模型的脚本。
  • 很容易忘记将 nvidia 运行时传递给 Docker 命令。
  • DevOps 中的反馈循环比编程慢得多。你可以做出改变,意识到你有一个打字错误,然后再花 10 分钟来部署。如果使用谷歌滚动部署,可能需要更长时间。

PRO :一旦容器安装好,惊人的坚固。
: Docker 增加了部署的复杂性。合理反驳:如果做了这么多,为什么不加 Kubernetes?回答:我对 Kubernetes 不够聪明。
提示:小心谨慎,把你运行的每一个 shell 命令都放在一个颤动日志中(或者某种类型的记录保存)。您可能会多次复制和粘贴您的命令。稍后您将自动完成其中的大部分工作。如果你“有点”记得命令顺序,自动化就更难了。
提示:以绝对路径运行/保存命令,以避免覆盖错误的目录。即。“rsync /path1 /path2”而不是“rsync path1 path2”,哦 f f.
提示:如果你知道 Ansible,使用 Ansible 重新运行 google 的启动脚本。比 GCP 的滚动部署要快得多。

***- name: Deploy to Open
  # startup scripts does most of the hard work, but make sure 
  # you're only deploying to things that finished from startup scripts
  hosts: open_django:&finished_startup
  gather_facts: true
  become: true

  post_tasks:
    - name: Run Startup Script
      shell: |
        google_metadata_script_runner --script-type startup --debug
      args:
        chdir: /
      become: yes***

提示:花额外的时间写提纲

  1. 模型应该存放在哪个桶上。建议将培训和生产的云桶分开。
  2. 实例上应该同步桶/目录的位置。
  3. 如果可能的话,让实例共享与 docker 容器的挂载目录完全相同的位置。即。实例的/models 挂载到 docker 容器的/models 路径
  4. 将正确的 rsync 命令写入桶中。使用 rsync!(不是 cp)。重启时比通过 cp 拉同样的文件更有效。

提示:对 py torch(torch . cuda . is _ available)或 tensor flow(TF . test . is _ GPU _ available)进行快速自动检查,可以省去确保 Docker 使用 nvidia 的麻烦。
总的来说:这个领域可能是许多 web 工程师在部署预先训练好的 ML 应用程序时努力的地方。

寻找瓶颈。你说我内存不足是什么意思?

  • 监控传统的 web 服务器负载通常是简单明了的。所有 GCP 页面上列出的 CPU 使用率百分比。对于内存,top 命令可以快速告诉程序使用了多少内存。谷歌的 StackDriver 会自动将内存使用情况转发到谷歌云。
  • 几十年来,DevOps 一直关注对 cpu、内存、磁盘使用、网络的监控。
  • 然而,唯一关心 GPU 使用的人是超频游戏玩家(又名 crysis-99-fps-water cooled-noobmaster)。自从 AlexNet(社区学会了使用 GPU 进行 ML)以来,生产 GPU 监控工具还没有完全达到标准。
  • 为了正确地监控 GPU 的使用,你必须使用 nvidia-smi,按设定的时间间隔输出结果,编写一个供 Prometheus 读取的脚本,然后将其传递给 StackDriver。总之你要写一个微服务来监控一个微服务。
  • 在使用过程中,CPU 和 GPU 的使用量都呈线性增长。作为一个黑客,我发现 vcpu 的最低数量可以达到 80–100 %,并根据 CPU 的使用情况自动扩展。太多的 vcpu 和 CPU 使用率%不会让步,而 GPU 受到打击。
  • 当 GPU 耗尽内存时,可能会出现问题。当用户传递较长的提示(> 200 字)时,就会发生这种情况。PyTorch 引发了一个异常,但不幸的是包含了大量的内存泄漏。为了处理这个问题,我捕获了 PyTorch 异常并强制释放未使用的内存。nvidia-smi 没有用,因为内存使用统计数据不是实时精确的(IIRC,它只显示一个进程的内存使用峰值)。

培训模型

  • 微调了 gp T2-中型 P100 的附加型号。训练迭代(周期)从《权力的游戏》(GoT)和《哈利波特》(HP)上的 60k 到 600k(学术研究,在 200k 论文摘要上训练)。
  • 用了 TensorFlow 1.13 来训练。
  • 训练时间从几个小时(60k)到几天(600k)不等。
  • 交叉熵损失在 2-3 之间。过度训练时,公制没有用。
  • 分叉 nsheppard 的 gpt2 repo,做了一些小的修改来加速更大数据集的启动。
  • 一旦你理解了 ML 的行话(尽管这可能是最难的部分),遵循 gwern 的教程是非常简单的。
  • 使用梯度检查点来处理内存问题。在没有内存问题的情况下,不可能在单个 GPU 上微调 gpt2-large (774M 参数,1.5gb)。
  • 寻找和清理数据集从轻微的麻木痛苦到乏味的挫折。
  • 同样,数据清理是 80%的工作。
  • 从 Kaggle,Google 和 misc. free 数据集抓取数据集进行填充。在清理过程中,数据集异常、新行(\r,\n\,回车符)、unicode 检测和语言检测等问题是最耗时的。
  • Gwern 使用了大量 bash /命令行来清理他的莎士比亚文集。我推荐用 Python。更容易在不同的数据集上重用代码。
  • 无法使 16 位训练(apex)在 Docker 中正常工作。Nvidia 性能指标评测(尽管是营销…)显示 16 位可以将训练周期缩短 2 倍(甚至更多)。没有太努力(累)去做 16 位的作品。
  • 训练后,使用 huggingface 脚本将模型转换为 PyTorch。在 pytorch-transformers 上部署非常简单。
  • 想避免在哈利波特语料库上过度训练,但事后看来,感觉过度训练比训练不足更好。在平衡小数据集的过度/不足训练风险时,您的结果可能会有所不同。

提示:当你有了原始的训练数据集后,做一个拷贝。不要修改原始数据集。将修改后的输出复制到单独的文件夹中。将修改过的数据集和原始数据集保存在不同的文件夹中,以避免错误/混淆。
提示:如果你发现自己曾经清理过一个特定的数据集,后退一步,寻找一个没有问题的类似数据集。这发生在哈利波特数据集上。
提示:学习 tmux!使用 tmux 可以更容易地在远程机器上开始训练,并且您可以放心地退出。
提示:用箭袋来装你所有的命令。非常容易出现错别字。

运行模型

  • 二手 PyTorch。pytorch-transformers 为模型创建了方便的 API 调用点。模仿 huggingface 中 run_gpt2.py 的例子。然后应用大规模重构。
  • 在 PyTorch 中加载 GPT-2 模型很慢(1-2 分钟)。
  • 为了缩短加载时间,当微服务启动时,WSGI 加载适当的模型(gp T2——小型、中型、大型等),并将 PyTorch 实例存储为单例。
  • 所有后续请求都使用 singleton PyTorch 实例。
  • 基于模型大小,对运行的 WSGI 进程数量的配置限制。WSGI 进程太多,CUDA 内存不足。太少,GPU 利用不足。
  • 当 PyTorch 耗尽内存时捕获异常;释放内存泄漏。
***def get_process_prompt_response(request, validated_data):
    try:
        output = generate_sequences_from_prompt(**validated_data)
    except RuntimeError as exc:
        if "out of memory" in str(exc):
            logger.exception(
                f"Ran Out of Memory When Running {validated_data}. Clearing Cache."
            )
            torch.cuda.empty_cache()

            oom_response = get_oom_response(validated_data)
            return oom_response

    response = serialize_sequences_to_response(
        output,
        validated_data["prompt"],
        validated_data["cache_key"],
        WebsocketMessageTypes.COMPLETED_RESPONSE,
        completed=validated_data["length"],
        length=validated_data["length"],
    )

    # clear cache on all responses (maybe this is overkill)
    torch.cuda.empty_cache()
    return response***
  • 95%的请求时间用于预测逻辑。另一个是来自前端->后端->负载平衡器的路由和反序列化。
  • 每隔五个单词,微服务就用更新的文本更新 WebSocket。
  • 向后端添加缓存以防止重复请求很有帮助。
  • 为了简化来自不同实例的相同响应,我对所有请求使用 42 的种子。

其他部署改进、提炼和想法

  • TensorFlow 有 TensorFlow Serve 和 PyTorch 有 TorchScript 将模型转化为生产级。好处包括合理的速度提升(redditor 引用了 30%的提升)和在没有 Python 的设备上更容易部署。我在一些模型上追踪了(PyTorch 的转换过程),但是我发现速度上的好处并不明显,但是增加了更多的复杂性。
  • 在过去的几个月中,模型的提取(在<50% of the size and runtime) has picked up traction. Huggingface’s distillation of gpt2-small is 33% smaller and 2x faster.
  • There’s a recently published paper about Extreme Language Model Compression 中提取 90–95%以上的模型,将 BERT 压缩了 60 倍)。如果能在 GPT2 上应用,将会有很多影响!
  • 有点反模式,但是 PyTorch 和 TensorFlow 在同一个 Docker 图像上非常有用。我能够更快地诊断和尝试潜在的解决方案。
  • 我本来集成了 XLNet ,但是没有 GPT2 那么强的发现生成输出。我还试图让它建议单个单词(类似于它的屏蔽语言模型),但我找不到一个好的写作用例/ UI。

其他宝贵的工具

  • 上面的一些重复。
  • 哨兵对于错误报告来说是无价的。与 ASGI (Django-Channels)一起使用比正常情况下稍微困难一些。
  • tmux —使用它来保持远程会话打开。另一种选择是屏蔽。
  • 使用 django-rest-framework 是一种乐趣。感觉像是作弊代码。
  • Netlify 非常适合部署。

应对倦怠

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

How I Treat My Mental State Until It’s Too Late …

  • 在接近终点线时撞上了一堵墙。
  • 在大约 2-2.5 个月内开始燃烧。
  • 精神上的痛苦,因为我觉得我应该发射,但还不够好。痴迷于缺失的功能。
  • 打电话给一个亲密的朋友倾诉真的很有帮助(谢谢詹姆斯 C)。
  • 自我施加的压力“发射!”让我避免给家人打电话。那是个错误。我发现给妈妈打电话只是想问问她的生活让我又松了一口气。
  • 很自豪我完成了这个。了解了许多关于 ML 部署的意想不到的事情。对我的下一个项目有用。

非常感谢

  • GPT2 的 OpenAIpytorch 变形金刚的拥抱脸。
  • GCP 要求学分,否则负担不起。有偏见,但我发现 GCP 指标比 AWS 全面(桶、网络、易用性)更好。
  • 我的朋友们帮助我进行了测试,并给了我宝贵的反馈。感谢(随机排序):克里斯汀李,,凯特阿克塞,Zoltan 萨拉斯,斯蒂芬林森和哈里尼巴布,他们都给了宝贵的反馈。
  • 许多 Redditors / ProductHunt 真的在推动和玩产品,还有很好的反馈和令人捧腹的写作提示。

下一步是什么?

  • 致力于蒸馏 GPT 二号。能搞清楚的我就开源。
  • 使用 GANs 制作营销图像。敬请期待!
  • 还不至于愚蠢到再次做出不准确的时间表估计。

最初发布于https://senri gan . io**

从卡格尔的空中客车挑战中吸取的教训。

原文:https://towardsdatascience.com/lessons-learned-from-kaggles-airbus-challenge-252e25c5efac?source=collection_archive---------9-----------------------

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

The challenge banner

在过去的三个月里,我参加了空客船只探测卡格尔挑战赛。顾名思义,这是一项由空中客车(其卫星数据部门)提出的检测计算机视觉(分割更准确地说)竞赛,包括在卫星图像中检测船只。

在我开始这个挑战之前,我是(在某种程度上仍然是)细分领域的初学者。我很好地掌握了“经典”机器学习(梯度提升树,线性模型等等),并将其用于生产,但深度学习对我来说仍然是一个新事物。

之前我写过一系列的博文解释和实现了使用 Keras 的 CNN(此处查看此处 ) 并上过大 Coursera 深度学习赛道系列。然而,我觉得我所学的缺乏实际应用。事实上,尽管有一些指导性的项目,但仅仅是课程并不能帮助你发展“现实世界”的技能。

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

The competition’s timeline

那么,该怎么办呢?

我开始寻找“真实世界”的应用,因此,大约在 2018 年 3 月,我遇到了数据科学碗 2018 Kaggle 挑战。竞争在于检测细胞核。与空客挑战类似,这是一项实例细分任务。

当我发现这项挑战时,它已接近尾声(比赛于 2018 年 4 月 16 日结束)。因此,我关注了一些讨论,阅读并探索了一些模型,使用 U-Net 模型(及其变体)了解了许多关于细分的知识,但没有时间参与。

因此,当空中客车公司的挑战到来时,我更加兴奋,并为自己设定了以下目标:训练一个细分模型,并根据该模型至少提交一份材料

我达到目标了吗?

是的,我做了,而且可能更多(你可以在读完这篇文章后自己决定)。

总的来说,这个过程是愉快的(至少大部分时间是这样),我获得了很多实用的知识。接下来,我会和你分享我学到的一些经验(排名不分先后)。

让我们开始吧。

理解手头的任务

这当然是显而易见的,但并不是很多人关注的焦点(至少在他们开始的时候)。

尽管这听起来很明显,但每项任务都是不同的。许多比赛从远处看都很相似(例如卫星图像分割),但细微的差异使得每项任务都很独特和困难(按照特定流程收集的数据、不平衡的数据集、不同的评估指标……)。

所以一定要理解任务,不要犹豫依靠社区来帮助你。

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

Various computer vision tasks (source: http://cs231n.stanford.edu/slides/2018/cs231n_2018_lecture11.pdf)

顺便说一句,如果你对计算机视觉世界和更精确的图像分割不熟悉,可以看看这些来自斯坦福大学 CS231 课程的幻灯片

尽可能使用预先训练的模型

不要重新发明轮子或者在深度学习的情况下,不要从头重新学习所有的权重。

事实上,很多分段架构包含两部分:一个编码器一个解码器。编码器通常使用在另一个数据集(例如 ImageNet )上学习的预训练权重进行初始化。

使用这些权重来初始化您的模型也非常容易。查看以下示例:

在我忘记之前,非常感谢 Pavel Yakubovskiy (和其他贡献者)的分段模型回购(注意它包含了比 U-net 更多的架构)。;)

投入一些时间构建一个可靠的架构,即不要只依赖笔记本电脑

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

A partial view of my solution (source: https://github.com/yassineAlouini/airbus_ship_detection)

许多 Kaggle 用户经常使用(或分叉)一个内核(Kaggle 的定制 Jupyter 笔记本实现)来发起一场竞赛。

这对于做 EDA(探索性数据分析)和感受竞争以及探索新想法是很好的。

然而,这并不能很好地扩展。

假设你想和一个同事合作(顶级竞争对手的常见做法),整个代码库都在笔记本里。众所周知,笔记本很难协作,也很难进行版本控制(尽管有一些解决方案,如 nbdime )。

相反,我推荐以下更好的工作流程:

  • 只保留用于 EDA 和可视化的笔记本
  • 使用 git 进行版本控制
  • 让你的代码模块化:一个文件用于数据预处理,一个用于建模,一个用于评估,一个用于运行管道,等等。

当你开始的时候,这些步骤会让你觉得有些多余,但是相信我,从长远来看是值得的。

这种方法的另一个好处是,你将发展更好的软件工程技能。这些都是就业市场上非常有价值的技能。事实上,你不仅想设计好的模型,还想学习如何有效地与其他同事合作,将模型投入生产,并确保它们的规模。

良好的数据扩充很重要

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

Example of image data augmentaion (source: https://github.com/albu/albumentations)

在处理深度学习模型时,数据越多越好。事实上,在大多数的 ML 任务中,**获取更多的数据通常是昂贵的。**可以使用亚马逊的机械土耳其(或类似的替代品)或使用专家标记(例如医学图像的医生)来手动完成。

幸运的是,由于数据增强,生成新图像更具可扩展性。这是避免过度拟合的一个很有价值的技巧。

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

A sample of data augmentation using Keras (source: https://github.com/yassineAlouini/airbus_ship_detection/blob/master/asd/preprocessing.py)

在这次挑战中,我使用了 Keras 的 ImageDataGenerator ,这是一种生成批量增强图像的非常简单的方法。

在挑战结束时,我发现了一个新的增强库:albumentations。我当时无法使用它,因为它更容易与 pytorch 集成,但计划在以后的挑战中尝试一下。检查回购纸张。它值得阅读和努力。

仪器和监控您的实验

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

An example of a monitoring dashboard (using comet.ml)

你无法改善你无法衡量的东西(至少会更难)。

因此,花一些时间设置 ML 监控并组织好你将要进行的各种实验是一个好的实践。

幸运的是,有很多工具可以让你的生活更轻松。comet.ml 是一个很好的工具,如果你的代码是开源的,它有一个免费的计划。你可以在这里找到我的空客挑战赛仪表板。

探索预测

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

Predicted ships masks (source: https://www.kaggle.com/iafoss/unet34-dice-0-87)

好吧,让我们假设你已经编码了一个模型,训练了它,它在交叉验证数据集上给出了一个很好的分数。你该怎么办?

由于这是一场计算机视觉比赛,一件显而易见的事情是检查一些预测的分割。这将给你一种直觉,知道哪些可以改进(也许你的模型很难找到较小的船只或正确分割附近的船只),以及你可以尝试哪些后处理技术。

投资好的硬件

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

Build your own desktop if you can.

许多供应商使参加 ML 比赛比以前更容易。例如,谷歌和 Kaggle 提供免费的 GPU 笔记本电脑。因此,理论上,你只需要一个互联网连接和一台笔记本电脑。

也就是说,如果你对 Kaggle 竞赛(以及更广泛的 ML 实验)很认真,那么最好的投资就是构建你自己的桌面。如果你不擅长硬件,不要担心,我会帮你解决的。检查我的建立职位,我解释了整个过程。我还包括了一个部分,在那里我谈到了其他的选择。

选择一个合适的损耗

您在模型中优化的内容有时与模型结构本身一样重要。

例如,对于分段任务,有几个变量:

  • 骰子损失(是一减去骰子系数
  • Lovasz-softmax 损失
  • 交叉熵损失(也称为对数损失)
  • 铰链丢失
  • 例如骰子和交叉熵的加权和(或其他组合)

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

One of the losses I have tried (source: https://github.com/yassineAlouini/airbus_ship_detection/blob/master/asd/losses_metrics.py)

我最后尝试了骰子和交叉熵的加权和,以及焦点损失和骰子。

那么,选择哪一个呢?如果你熟悉计算机视觉任务和竞赛,你会有一种直觉,知道什么可能做得最好。

现在,如果您是新手(像我一样),尝试各种方法,并选择一种在执行时间和交叉验证性能方面最有希望的方法。

最后,如果你不熟悉分类的损失函数,维基百科页面是一个很好的起点。

请注意,我正计划写一篇关于各种机器学习设置中的损失函数的更长的博文。所以请继续关注这方面的更多信息。;)

相信交叉验证

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

Trust the cross-validation (source: https://sebastianraschka.com/blog/2016/model-evaluation-selection-part3.html)

我怎么强调都不为过。这在 Kaggle 竞赛(否则你会过度适应公共领导委员会)和“现实生活”机器学习模型中当然很重要。所以,抵制诱惑,提交在公共领导板上表现最好的模型,并选择交叉验证集中最好的一个。

理解数据很重要

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

Is there a ship here or only waves?

数据不平衡吗?是不是很乱,需要很重的预处理?

这些问题对于决定你应该在哪些方面投入时间以及如何解决这个问题非常重要。

事实上,由于这场比赛中的数据非常不平衡(空海图像比有船的图像多得多),一个聪明的解决方案是首先训练一个分类模型(无论是否有船),然后在预测的有船图像上训练一个分割模型。查看这个讨论线程,寻找这样的解决方案。

向社区学习,尽你所能提供帮助

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

One day you could be here 😉 (source: https://www.kaggle.com/c/airbus-ship-detection/discussion/71591#422787)

有一个巨大而有用的 Kaggle 社区,所以你可以利用它:如果你觉得有困难,就问问题,分享你所学到的,投票支持好的内核和帖子,并与竞争对手保持同步。这在这场比赛中尤为重要。事实上,一个数据泄露被发现,并与整个社区共享。最终做出了的修正,事情顺利地从那里恢复了。

堆叠和后处理,如果你是认真的 LB 分数

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

Stacking classifiers (source: http://rasbt.github.io/mlxtend/user_guide/classifier/StackingClassifier/)

许多最近获胜的解决方案(例如,查看此讨论)是堆叠模型(具有一层,有时两层或多层堆叠)。通常,它还与后处理技术相结合,因为这些在图像分割中非常重要。你可以在这个代码 repo 中找到这些技术的一个很好的例子。

花费的时间很重要

每个竞争都伴随着新的变化和特定的问题:不同的评估指标、棘手的处理步骤、不平衡的数据、低质量的数据等等。

因此,不要期望很快得到“好”的结果(否则每个人都会这样做,竞争是不值得的)。相反,尽可能长时间地坚持比赛。不要很快灰心丧气(说起来容易做起来难),要相信,经过足够的时间和努力,你最终会得到更好的结果(并且在某个时候,会取得胜利)。

尽情享受心流

这应该是当然的一个重要方面。

试着平衡学习经历的乐趣和你的心流状态:逐步挑战自己,不要一开始就被所有事情压垮。

慢慢开始,随着你的进步逐渐增加。试着一次专注于一个方面,并有意识地努力改进你不擅长的领域。对我来说,这是图像预处理,增强,和后处理。给自己一点时间。

我希望你喜欢这篇文章,并获得新的见解。敬请期待下一期!

井字游戏的经验教训:实用强化学习技巧

原文:https://towardsdatascience.com/lessons-learned-from-tic-tac-toe-practical-reinforcement-learning-tips-5cac654a45a8?source=collection_archive---------12-----------------------

回顾我在开发第一个强化学习代理时做错的所有事情,这样你就可以把它做对了

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

就在最近我发了一篇介绍强化学习和深度 Q 网络的帖子。但众所周知,理解理论和在现实世界中实际实施之间存在巨大差异。

我花了一段时间才找到对 DQN 来说有价值的第一次挑战。我看到的大多数教程都实现了一个 DQN +卷积网,并试图设计一个击败雅达利或末日游戏的代理。这似乎分散了注意力:我看不出浪费时间设计图像处理网络来解决强化问题有什么意义。这就是我选择井字游戏的原因:它相当简单,所以我可以在我的 MacBook 上训练它,因为我可以编写游戏代码,所以不需要图像处理,但它仍然需要策略设计才能获胜。

虽然我认为这将是直截了当和简单的,但我很快就意识到我错了——因此,我想描述一下我在解决这个挑战时学到的一些最重要的经验。顺便说一下,的代码可以在我的 GitHub 页面找到。

1.把它分解成尽可能简单的任务

听起来很明显,这是我们偶尔都会忘记的事情。如果你读过我的对 DQN 的介绍,你可能记得我给了一个非常非常简单的游戏作为“Hello World”练习:一个需要填补空缺的代理(如果你还没有——别担心,我们很快就会回来)。这个练习不是我凭空想出来的。

当我决定实现井字游戏时,我坐下来一次写了几乎所有需要的代码:游戏类、玩家类、体验重放类、Q 网络类、双深度 Q 网络实现——然后推送 play。你猜怎么着?它什么也没学到。甚至不知道什么是有效或无效的移动,这是做任何事情的绝对基础。

现在去弄清楚是什么导致了这一切——是我代表各州的方式吗?这是超参数问题吗?代码有 bug 吗?如果有,在哪里?犯错误的可能性如此之多,却不知道从哪里开始。

所以我决定把它简化成我遇到的最简单的问题:代理能区分有效和无效的移动吗?然后,让我们训练一个代理,它只学习区分空缺和非空缺的位置。没别的了。这很快证明了自己,因为我能够隔离并修复我的网络实现中的几个 bug。然而,代理人拒绝学习。由于现在网络已经正确实施,我花了一段时间才意识到我错过了什么:

2.简单的任务只对你来说简单

如前所述,我给代理的简单任务是填充 4 单元板的所有空位。空单元格用“0”表示,填充单元格用“1”表示。你需要玩多少游戏才能理解其中的逻辑?可能不会太多。但你是人,而电脑不是。

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

Board representation. The second cell is filled, so a good action would be to choose any other cell

我认为几百个游戏应该足够了,但是事实证明我的实现需要大约 2500 个游戏来掌握这一点。事实证明,100-200 个游戏是不够的,成本几乎没有变化。更令人困惑的是,成本确实很低——但后来我发现,这是由于网络冷启动和培训次数不足(见我的实现)。基本上,我没有给网络足够的培训来学习任何东西——因为我低估了代理人学习这些有多难。

底线——对我们人类来说似乎简单的东西对计算机来说可能一点也不简单(反之亦然——计算 147x819 需要多长时间?).将模型训练得更长。

3.如何(不)定义下一个状态

在这一点上,我能够回到井字游戏的挑战。网络在工作,代理在学习。我可以很容易地看到它挑选出哪些动作是有效的,哪些是无效的,当我检查它如何玩时,很明显它学会了如何赢——它连续三次的尝试非常明显,我很高兴——但不是太多。尽管它学到了什么,但很明显他没有注意到他的对手在做什么,也没有努力尝试阻止他的对手连续三次。无论我训练它多长时间,我给网络增加了多少层,或者我调整了多少超参数——都没有改变这一点。

我花了比我想象的更长的时间才意识到我做错了什么。这与我看到的几乎所有 DQN 代码都是单人游戏的事实有很大关系——我不知道如何处理多人游戏。只有当我发现这个家伙的游戏实现时,我才明白我做错了什么——为此我必须解释我是如何设计这个游戏的。看看下面描述的游戏:

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

玩家 X 执行向奇数状态的转换,玩家 o 执行向偶数状态的转换。这正是我如何向模型的内存缓冲区添加记录的:如果 s=0 并且玩家 X 选择了左中间的单元格,那么 s’=1 。玩家 O 随后收到状态 s=1 并过渡到 s=2 。这是我添加到模型体验回放记忆中的两个单独的记录。

但是这意味着当轮到一个玩家玩的时候,他永远不会输。再来看 s=3 :玩家 O 选择了中上单元格,过渡到 s=4 。他还没输。现在轮到玩家 X 了,他做出了显而易见的选择,并转换到 s=5 ,然后赢了。直到现在,玩家 O 才知道他输了——因此,为了下一次有更好的判断,玩家 O 在 s=5 处收到的负奖励需要向后传播两个状态,直到 Q 值为 s=3 。理论上,由于贝尔曼方程的递归性和网络的反复训练,这应该不是问题。理论上。

实际上,这是行不通的——我认为有两个原因。第一个,也是更直观的一个,模型认为从 s=3 过渡到 s=4 没有风险,因为它不知道选择如何从 s=4 过渡的不是他。就模型所知,当处于 s=4 时,他可以简单地选择不同的动作,防止他失败。

一旦我意识到这一点,修复就很容易了——我所需要做的就是将下一个状态定义为玩家将看到的下一个棋盘表示——因此对于玩家 O,如果 s=3 并且动作是顶部中间单元格,那么s’= 5而不是4——现在模型可以知道这个动作将导致他输掉游戏。

第二个原因是什么?嗯—

4.请记住,网络只是一个近似值

在这个调试过程中,我检查了几次网络学习到的 Q 值,试图看看这是否有助于找到我做错了什么。我花了一段时间才意识到这毫无意义,我会解释原因。

这可能是一个回到我上面描述的我的“填充板”例子的解决方案的好点。如果你看一下我在那里实现的 Q 表和 Q 网络算法,你可以看到我在测试它们时绘制了所有 Q 值的预测。表中的 Q 值是有意义的(尽管由于训练过程中“较少选择的道路”有时会有点偏差),但 Q 网络预测值并非如此。这些和表格算法计算出来的完全没有关系。

仔细想想,这其实并不奇怪。请记住,网络只是一个近似值——你实际上要求它做的是预测最佳行动,这对应于它预测的最高 Q 值。想一想:你并不是真的要求网络学习正确的 Q 值,而只是要求最佳动作会有最高的预测值。这是两件完全不同的事情。当您记住成本函数在最小化时使用网络自己的预测时,网络无法预测正确的 Q 值就更有意义了-它没有可比较的基础事实。这是一个提醒:

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

Deep Q-Network cost function

我猜这里的关键信息是,虽然他们被称为深度 Q 网络,但 Q 值并不是他们实际学到的。令人困惑,但这就是生活。

最后的话

在发现新领域时,实现理论知识是最大的挑战之一。知道如何工作让它工作是不一样的。我希望这篇文章能在你的强化学习和深度 Q 网络之旅中对你有所帮助,我也很乐意听到你在开发自己的算法时学到的经验教训。让它发生。

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

在一家非科技公司作为一名孤独的数据科学家实习的经验教训

原文:https://towardsdatascience.com/lessons-learned-interning-as-a-lone-data-scientist-at-a-non-tech-corporate-b751dd79d8a8?source=collection_archive---------25-----------------------

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

Photo by Noah Silliman on Unsplash

对于我在 Medium 上的第一篇文章,我面临着两个可预见的老问题:“我应该写些什么?”以及“人们会觉得我写的东西有用吗?”。我觉得我最近在一家财富 500 强公司完成的实习,在那里我完成了一个面向产品的自然语言处理项目,为我提供了回答这两个问题的材料。

“我会写下我在一个如此流行的领域实习时学到的无数非技术性和技术性的东西,你不能改变睡姿而不迎头撞上一条相关的新闻。我有一个不寻常的视角,因为我独自在一家并非技术出身的公司工作。接下来,“对于对数据科学和 Medium 编程感兴趣的读者,我的帖子将提供一些参考点,如果这些读者走上与我相似的职业道路,会有什么样的期望。对于更倾向于其他行业/兴趣的人来说,尽管他们在睡梦中看到了“人工智能”和“机器学习”这两个术语,但感觉有一堵无形的墙阻止他们了解这些概念的日常实现是什么样子,我的帖子将试图在这面墙上打几个洞。

好吧,自我放纵的理由分类,这是我学到的:

1.问题构建和问题分解可能(而且经常)比编制解决方案更难

我可以感觉到经验丰富的数据科学家要么点头表示同意,要么对我所面临的问题的简单解决方案进行推理。不幸的是,考虑到就业立法,我无法真正记录我所处理的问题的本质,但我可以肯定地说,这比编写解决方案更让我夜不能寐。

一般来说,大公司的业务问题可能会跨越多个部门,每个部门都理所当然或错误地最关心与他们相关的后果。鉴于我实习期间的情况,提出一个问题公式,充分解决不同经理经常出现的分歧,证明是非常具有挑战性的。

现代劳动力变得专业化的程度进一步加剧了这种恰当的问题结构的困难。当问题是基于数据的时候,就像我的问题一样,很自然,不是每个部门的每个人都知道机器学习的能力和局限性。毕竟,这些人首先在他们自己的领域是熟练的,而机器学习毕竟是一个在最近 5 到 10 年才进入公众意识的领域。

经理可能会要求您做在广度或深度上超出当前可能(更有可能)的事情,或者要求不开发数据科学潜力的交付成果(不太可能)。

因此,为业务问题找到一个清晰的定义,并确定一个可实现的范围,比听起来要困难得多。做对了,你就成功了一半。弄错了,你会让冒名顶替综合症成为你最好的朋友。理想情况下,您应该为不同团队的经理提供他们在最终模型中寻求的解决方案,但我知道管理预期是一个巨大的挑战,作为一名数据科学家,我应该继续努力。

2.快速学习数据科学中的一个新的子领域是一项可以实现的重要技能

我开始实习的时候,只有不到一年的编程教育。在那段时间里,我从未见过一个关于自然语言处理的网页或演讲幻灯片。

在我第一天得知我将查看社交媒体文本数据后,走出办公室,你可以想象我当时惊慌失措的心情。我花了几个星期疯狂地试图理解简单问题的答案。NLP 的概述是什么样的?在 NLP 问题中,到底什么被认为是特征?我到底应该如何将文本转换成机器可读的输入呢?什么库是 NLP 任务中的主力?我以前学到的东西有适用的吗?

幸运的是,有很多资料和社区支持我选择的语言(Python ),数据科学家可以依赖。我从谷歌搜索和专门的编程网站学到了将近 90%我需要知道的东西。此外,我意识到强烈的滚雪球效应的存在。当你刚开始学习时,学习全新事物的惰性是最大的。但是当你让(雪)球滚动起来时,事情就变得容易了。

这并不等于说我确切地知道要找什么材料,在哪里找,这意味着

3.退出和重新启动经常发生

我花了很多精力去理解和学习 NLP 库。然而,我经常会在学习某个库的速成班中进行到一半,并在意识到由于这样或那样的原因它不能完全按照我想要的那样做之前做大量的笔记。我不得不重新开始做一些别的事情,这引起了很多沮丧的叫喊(下面会有更多)。我浏览了 NLTK(自然语言工具包,我所阅读的 NLP 库的 OG)、TextBlob 和 spaCy 等等。

导致我放弃我从一些库学到的大部分知识的问题包括:从一方面了解到 NLTK 不适合生产,到另一方面意识到 TextBlob 在我的特定问题上表现不佳。

退出和重启并不局限于学习图书馆这样的特定领域。它还扩展到更一般的任务;例如,仅仅理解 NLP 模型的流程就让我倒退了很多次。我是一名视觉学习者,看到一个流程的缩小视图以及一个步骤如何与另一个步骤相关联对我来说很重要。我经常会想“好吧,在花了几天时间之后,我终于明白了 C 和 D 的关系”。

然后我会意识到 C 和 D 实际上并不存在;它们只是占位符,以某种复杂的方式与 K 和 T 相关。我会放弃并重新开始,但是这些行为伴随着坚持,最终让我到达了我需要去的地方。

4.NLP 问题中的等级不平衡可能是慢性疼痛的来源

在分类问题中,当因变量中至少一个类别的数据点明显少于其他类别时,就会出现类别不平衡。假设我想根据“非垃圾邮件”和“垃圾邮件”对电子邮件进行分类。如果在我的训练数据中有 1000 个“非垃圾邮件”的例子和 100 个“垃圾邮件”的例子,这将是一个类别不平衡。

这种不平衡会对模型性能产生负面影响,但是当您的要素是数字时,处理这些不平衡通常不是什么大问题。您可以对多数类进行过采样,对少数类进行欠采样,甚至创建从现有数据中“学习”的合成数据点。

但是如果你的特征不是数字的,而是文本的,会发生什么呢?你创造了那些合成数据点吗?这是我发现自己面临的问题,但我正在处理社交媒体用户生成的文本,所以创建没有真正用户生成的人工数据点是不是“作弊”?我想是的。过采样和欠采样怎么办?当你的数据集很小的时候,这是不可能的。不幸的是,这就是我发现自己的处境。更不幸的是,对于这个问题,我还没有找到比“等待更多数据”更复杂的解决方案。

5.挫折是游戏的一部分,但意外的突破也是游戏的一部分

实习进行到一半的时候,一个朋友问我怎么样了。接下来,我无意中说出了一句意味深长的话(至少我的朋友是这么告诉我的):“10 天中有 7 天,我会用头撞墙。10 天中有 1 天,我试图爬过去,但却摔了个嘴啃泥。但在第九天,我设法跑过它,有时还绕着它跑。

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

Gif via Giphy

这准确地描述了我的进步。我会花几个小时尝试做一些简单的事情,比如加载预先训练好的单词嵌入,但都失败了。我让我的终端经历了几天的绞肉机,试图通过更新和重装让特定版本的包和库(看看你,TensorFlow 和 Keras)一起工作。

我没有计算机科学背景,所以大多数时候,我不知道我从栈溢出中复制粘贴了什么。到最后,情况变得如此糟糕,以至于我的电脑不再把熊猫当成图书馆;我甚至不能加载我的数据。

我的救星是那些陈词滥调的淋浴顿悟时刻,就我所见,这在我看来是数据科学家中的一个普遍现象。我会在一段代码上工作到晚上,没有进展就辞职。第二天早上,我的手经常会自己动起来,神奇地做出有用的东西。也许我睡觉的时候,我的大脑在后台嗡嗡作响,重新整理信息。

关键是,突破几乎从未通过认知蛮力的应用来实现。我学会了耐心,并希望我的潜意识思维能拯救我,这种情况发生了很多次。

最终

回顾我实习之初的心态,我低估了数据科学家所承担的非技术责任的重要性。尽管如此,整件事仍是一次令人惊奇的经历,我希望继续在 Medium 上记录我在这个领域学到的东西。

标记地标的经验教训(或者 Kaggle 如何踢我的屁股)

原文:https://towardsdatascience.com/lessons-learned-labeling-landmarks-or-how-kaggle-kicked-my-butt-8cea2a5be2b8?source=collection_archive---------17-----------------------

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

One of the easier landmarks to identify among ~15,000 others.

到目前为止,我已经在这场 Kaggle 竞赛中苦干了大约 5 个月——这可以分解为大约 99%的精力用于构建、改进和调试我的数据管道,最后 1%用于深度学习模型本身。随着继续培训和优化我的模型变得成本高昂,我希望从我的经历中获得我所能获得的(阅读:证明几个月的努力和大约 200 美元的 AWS 账单)以及一个简短的教训列表,这些教训有望在下一个项目中为我(和你)节省一些时间和金钱。

( Kaggle ,对于不知道的人来说,是 Google 在 2017 年收购的一个数据科学竞赛平台,也是数据科学入门的绝佳资源)。

1.使用 GitHub

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

Octocat ❤ (source)

从一个真正令人震惊的开始!这个并不太令人兴奋,也不难实现。在项目期间,我的“版本控制”是将我的 EC2 实例的状态保存为 AWS 映像,并在下次我想从我离开的地方开始时简单地从该映像启动。老实说,这不是一个可怕的方法,尽管每个月都有几个额外的钱,除非我的图像被破坏或取消注册,否则我所有的工作都会丢失(这从未发生过,但我有几次接近了)。

但是 GitHub 提供的不仅仅是另一种保存更改的方式。Jupyter 笔记本在模块化或多代码路径方面并没有提供太多东西,所以我最终使用了“科学怪人”笔记本:分散在各处的注释块,决定运行什么和以什么方式运行的布尔变量,以及带有不知什么版本的各种方法的笔记本副本。一旦我过渡到 GitHub 的版本控制,我就能够使用新的分支进行实验,而不必担心保留我的工作代码。例如,在使我的模型过度适应数据子集以确保它正确训练时,我不再需要担心用“should_subset”变量添加额外的流;相反,我可以随心所欲地分支添加[:1]。

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

Because OF COURSE we all carefully read EVERY line of our code before we run it each time…

然而,Jupyter 也不能很好地使用 Git,也不能提供模块化,这就引出了我的下一课:

2.。操场的 ipynb,。py 代表真正的工作

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

Is it just me or does the Jupyter logo look like someone with orange slices in their mouth? (source).

这可能会引起争议,因为 Jupyter 似乎是用于研究目的的事实上的工具,但是当您将自己所有的代码都写在 Jupyter 笔记本上时,您就放弃了很多。Python 不仅为您提供了适当的 Git 集成(而 Jupyter 是……缺乏的),还允许您轻松地编写库或“模块”!这意味着无论你在哪里调用一个方法,它都可以来自同一个代码块,而 Jupyter 笔记本不能在笔记本之间轻松地共享代码。

仅仅使用 Jupyter 会导致多个笔记本上有大量复制粘贴的代码,这些代码需要与源代码保持同步——这不是您在试图追踪数据管道中的 bug 时想要的!

这并不是说 Jupyter 在 Kaggle 项目中没有一席之地——我肯定会继续使用它进行数据探索和可视化。但是我也会在我的主 Python 文件中定义大多数方法,并将它们导入到我的笔记本中——这样我就知道在笔记本中工作的代码也将在我的管道中工作。不管你怎么做,可视化每一步的数据都是非常重要的(提示 3…)

3.可视化您对数据执行的每个转换

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

MS Paint seems to be this site’s visualization tool of choice.

我怎么强调都不为过。还记得我提到过试图追踪我管道中的一个 bug 吗?那是在大约一个月不知道它的存在之后,这是一个充满令人困惑的错误和糟糕结果的月份。在搜寻文档时,我看到了这篇文章,其中一个像素偏移花费了开发人员两个月的调试时间!

每次更改前后都要可视化数据,以确保操作按预期执行。如果是图像,就展示出来。如果是 CSV 数据,对汇总统计数据进行健全性检查,并确保替换 NaN 值。即使使用 NLP 数据,您也可以在词干前后打印文本,或者在 2D 或 3D 图上绘制嵌入向量

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

Example of word embeddings reduced to 3D vectors. If instead, “man” is to “woman” as “king” is to “taco”, then you may have a bug to squash (source).

这些小检查将为您节省大量调试时间,意味着您不必回头再做。另外,您可以将可视化代码保存在单独的 Jupyter 笔记本中,这样它就不会碍事了!

4.针对正确的指标进行优化

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

Not quite as intuitive as accuracy or MSE (source).

这可能是一个很大的要求,但仍然很重要。许多在线 ML(专业人士称之为机器学习)教程提供了加载数据和训练模型的代码,它们几乎总是使用内置的度量标准之一,如分类准确性或均方误差。但是,如果你试图在大脑扫描中检测肿瘤,而竞争值回忆超过准确性(也就是说,你想尽可能多地抓住病例,以一些假阳性为代价),那么准确性不会训练你的模型表现良好!

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

See? Deep learning as easy as Copy-Paste! (source)

在开始处理数据之前,尤其是在开始处理模型之前,请务必查看竞争指标。有时一个标准指标就足够了,有时你不得不在一些随机的源代码文件中编写一个定制的目标函数,并且由于 Tensorflow 非常有趣的图形系统而遇到几乎无法诊断的错误(我的第一个 StackOverflow 帖子,遗憾的是没有得到答复)。

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

Wow, 3 whole upvotes! (Not going to link you to my embarrassing StackOverflow questions)

长话短说,当你甚至没有为正确的事情进行优化时,你不能指望挤掉数百个 ML 博士。

5.选择一个让你兴奋的比赛

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

When you learn coding just for the THRILLS (source)

这可能令人惊讶,但我的热情并不在于给历史地标的“业余”(蹩脚)智能手机图像贴上标签。随着我继续做这个项目,最初的兴趣消退了,我发现越来越难说服自己打开笔记本电脑,在上面多花几个小时。

与之形成鲜明对比的是,就在上周,我为一场办公室竞赛设计了一个快速行进的疯狂机器人;结果并不令人印象深刻(我在提交截止日期后的几个小时发现了一个 bug,但它就这样过去了),但我发现时间过得很快,像深度工作的风格,即使是在一整天的编程工作之后。我会把这作为未来比赛的一个教训,甚至是关于 Kaggle 的个人笔记:在排行榜上有一个排名来展示你的劳动成果是很好的,但如果你不能找到一个保持参与和不断改进的理由,你就无法做到最好。

外卖食品

写连贯的英语显然比写代码更难。但你应该看到,虽然 Kaggle 在让数据科学变得简单方面做得很好,但专业人士正在发布最先进的分数,因为他们有坚实的基础和从许多失败中建立的直觉,其中许多我还没有遇到过。

试图自学数据科学和机器学习可能很残酷,但我也从未在任何其他领域看到更多的合作和高质量的免费资源。坚持下去!感谢阅读!

PS:如果有人想尝试一下谷歌地标识别挑战赛,请查看我的内核,下载数据集到 S3 的 TFRecord 文件

更多信息请关注我的 Twitter @Eli_password123!

使用 Google Cloud BigQuery ML 的经验教训

原文:https://towardsdatascience.com/lessons-learned-using-google-cloud-bigquery-ml-dfd4763463c?source=collection_archive---------11-----------------------

云自动机器学习工具(第 1 部分)

使用德国信贷数据的全程 ML 演示

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

动机

我经常听到的一个新流行语是“为大众民主化人工智能”。通常接下来是一个建议的云机器学习工具。这些工具的统称似乎是 AML,或自动机器学习。作为一名数据科学家,我很想研究这些工具。一些问题浮现在我的脑海:AML 到底能做什么?我可以在我通常的建模工作流程中使用这些工具吗?如果有,如何实现,为了什么利益?我作为一个拥有 ML 技能的人类的有用性会很快消失吗?

我的计划是演示最流行的 AML 工具,每次都使用相同的“真实”数据集,比较运行时间、拟合指标、生产步骤以及一些用户界面截图。

在我最近的工作中,我需要建立和部署金融欺诈检测模型。我不能在公开的博客文章中使用专有数据,所以我将使用众所周知的公开数据集德国信用数据。注意,成本矩阵是每个假阴性 5 DM,每个假阳性 1 DM。尽管数据很小,但我将介绍所有用于真实数据的技术。所有演示的代码将在我的 github 上

我的计划是涵盖这些流行的反洗钱工具:

第 2,3,4 部分即将推出,希望(!) :

BigQuery ML —步骤 1)创建数据

让我们开始吧。谷歌的 BigQuery 提供了大量免费的公共数据集。你可以在这里搜索它们。我没有看到任何信用数据,所以我用谷歌的 BigQuery 沙箱上传了我的。BigQuery sandbox 是谷歌的 GCP 自由层云 SQL 数据库。这是免费的,但你的数据每次只能保存 60 天。

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

https://cloud.google.com/free/

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

https://cloud.google.com/bigquery/docs/sandbox

对于所有的谷歌云工具,你必须首先创建一个谷歌云账户和一个项目。接下来,分配沙盒资源给项目按照这些指示。现在转到https://console.cloud.google.com/bigquery,这是网络用户界面。接下来,固定您的沙盒启用项目(见左下截图)。接下来,使用 Web UI 加载您的数据。我把我的表叫做“allData”。

德国信贷数据是一个非常小的数据集,只有 998 行。通常,最佳实践是将您的数据拆分为 train/valid/test,但由于这很小,我将拆分为 80/20 train/test,并使用交叉验证技术将 train 扩展为 train/valid。注意:我创建了一个假的“uniqueID”列(见右下截图),以帮助随机拆分。

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

Create train and test tables

下面是我用来创建“trainData”和“testData”的 SQL,它们是从“allData”中随机抽取的行。

CREATE TABLE cbergman.germanCreditData.testData AS
SELECT *
FROM `cbergman.germanCreditData.allData`
WHERE MOD(ABS(FARM_FINGERPRINT(CAST(uniqueID AS STRING))), 5) = 0;

CREATE OR REPLACE TABLE cbergman.germanCreditData.trainData AS
SELECT *
FROM `cbergman.germanCreditData.allData`
WHERE NOT uniqueID IN (
  SELECT DISTINCT uniqueID FROM `cbergman.germanCreditData.testData`
);

现在,我已经在 BigQuery 中加载了分别包含 199 行和 798 行的表。检查随机样本做了正确的事情:

SELECT count (distinct uniqueID)
FROM `cbergman.germanCreditData.allData`
where response = 2;

# repeat for train, test data...

请参见下面的最后一行,我最终得出每个所有/训练/测试数据集的负(响应=1)与正(响应=2)比率分别为 30%、29%、32%,这看起来是一个很好的采样:

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

大查询 ML —步骤 2)训练一个 ML 模型

在写这篇文章的时候,API 给了你 3 个算法的选择:回归,逻辑回归,或者 K-最近邻。

更新 2019 年 12 月:自撰写本文以来,谷歌已向 BigQuery ML 添加了 2 种新算法:多类逻辑回归和 Tensorflow!

在创建你的模型之前,通常你必须:1)确保业务目标明确:“尽可能自动地抓住最多的欺诈资金”。在我的工作中,欺诈资金被进一步分为不同类型的欺诈,例如第三方欺诈。2)接下来,您通常必须将其转化为数学模型算法:在这种情况下,分类选择 API 方法逻辑回归。3)接下来,你定义损失函数,这在真实的公司中是很棘手的,因为一个部门可能会说新用户更重要;而风险部说所有的欺诈都更重要。例如,在我工作的一家公司,他们无法就一项损失指标达成一致。然而,这个问题在这里得到了解决,这个公共数据的创建者给出了一个成本矩阵,每个假阴性 5 DM,每个假阳性 1 DM。

完成业务定义后,请看下面的屏幕截图,如何通过从查询编辑器运行 SQL 查询来训练基本模型。在训练细节下,每次迭代的损失是递减的,这是我们预期的;由于这是一个逻辑回归,损失是对数损失。

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

Train a model in BigQuery ML

下面是创建模型并检查模型是否适合训练和测试数据的 SQL。

# Create the base model
CREATE OR REPLACE MODEL cbergman.germanCreditData.baseModel OPTIONS(input_label_cols=['response'], model_type='logistic_reg') AS 
SELECT * EXCEPT (uniqueID) 
FROM `cbergman.germanCreditData.trainData`;# Model fit on train data
SELECT *
FROM ML.EVALUATE(MODEL `cbergman.germanCreditData.baseModel`, 
(
  SELECT * EXCEPT (uniqueID)
  FROM `cbergman.germanCreditData.trainData`);# Model fit on test data
SELECT *
FROM ML.EVALUATE(MODEL `cbergman.germanCreditData.baseModel`, 
(
  SELECT * EXCEPT (uniqueID)
  FROM `cbergman.germanCreditData.testData`);# To view your linear beta-values
SELECT * from ML.WEIGHTS(MODEL cbergman.germanCreditData.baseModel);# To get test data confusion matrix
SELECT *
FROM ML.CONFUSION_MATRIX(MODEL `cbergman.germanCreditData.baseModel`,
(
  SELECT* EXCEPT (uniqueID)
  FROM `cbergman.germanCreditData.testData`);

我的基线逻辑回归在 1 分 36 秒内训练,在 0.7 秒内运行测试,训练 ROC_AUC = 0.84,测试 ROC_AUC = 0.75,回忆= 0.41,成本 38 * 5 + 12 = 202 DM。

我注意到火车 AUC 是 0.84,所以发生了一些轻微的过度拟合。我并不感到惊讶,因为所有的变量都被使用了(选择*),而且逻辑回归是一个线性模型,它要求所有的输入都是独立的。创建基线线性模型的一部分是清理共线输入。我知道如何在 Python 中做到这一点,所以这是我稍后将转向的地方。

同时,我们可以检查并保存逻辑回归模型系数的β值,以及排除验证数据的混淆矩阵和性能指标。注意:除非您另外指定,否则默认阈值将是 0.5。我计算了标准化和非标准化的默认混淆矩阵,并将它们保存在模型比较表中(我备份了 Google Sheets 中的系数和性能统计表,WebUI 中非常简单的菜单导航,因为我知道我的免费数据将在 60 天后消失)。

步骤 3)特征工程

下面是一个有经验的从业者如何获得更好的模式的“秘制酱”。我现在切换到 Jupyter 笔记本,因为我知道如何在 Python 中清理共线输入。我首先检查数字列的相关性。下面,右边突出显示的红框,我们看到数量和持续时间相关 63%。这是有道理的,贷款的金额和期限都可能一起增加,我们可以在 pair-plots 中证实这一点(左边红色轮廓的小图)。下面,底部一行显示了所有的数字变量对响应 1 或 2 绘制,显然没有什么看起来相关。我将删除持续时间字段。

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

Top left: pair-plots amount and duration. Top right: Numeric variables only correlations. Bottom: Plot response vs each numeric variable.

相当多的变量是字符串类别。我想对字符串变量进行 VIF 分析,为此我已经用 Python 实现了信息 R 包,有时称为“使用信息值的证据权重”。信息或 WOE 宁滨的想法不仅仅是通过一键编码添加新变量,而是实际上按照响应变量的线性升序对类别进行分类和编号。例如,如果您有类别为“汽车”、“船”、“卡车”的变量“车辆”,那么将选择转换为数字 1、2、3(例如代表汽车、船、卡车)来表示它们给出的关于响应变量的“信息增益”。所以,你的回答不会是 1,2,3,而是一个信息对齐的数字。

我在本文底部的参考资料部分添加了几个关于“信息宁滨”的链接。

在我做了信息线性宁滨后,我可以计算波动率指数并重新运行相关性,见下面的结果。

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

Left: VIF factors. Right: correlation heatmap

VIF 因子在左上方。有趣的是,就方差解释而言,工作和电话看起来密切相关。也许失业/非居民不太可能有电话?另一个方差-覆盖率对看起来像性别与其他债务人相关。嗯,这表明已婚/离异女性更有可能有一个共同申请人。工作和电话位于冗余差异解释器的顶部,因此基于 VIFs,我将放弃电话字段。

右上方的相关性现在看起来清晰多了。唯一担心的可能是 n_credits 与 credit_his 的关联度为 40%,而 property 与 housing 的关联度为 36%。基于相关性,我会放弃 n_credits 和 property。

总之,我删除了持续时间、n_credits、属性和电话字段,并添加了对数字特征计算的对数转换。我最初的 21 个字段现在变成了 64 个全数字字段。主要是因为增加了数字变换:均值、中值、最大值、最小值和对数变换。由于使用了信息宁滨而不是热编码,我的类别字段数保持不变。

接下来,我将通过弹性网套索变量选择运行我所有的转换变量。(注意:如果有人问我谁是我心目中的英雄,我的第一反应会是特雷弗·哈斯蒂!).通常使用 k 倍交叉验证,k=10 倍是最佳实践。与每折叠 N/k 的样本数相比,更多折叠的代价是平均运行次数更多(k=10)。由于我的数据很小,我选择了 k=4 折叠交叉验证,因此每折叠有 199 个样本。我以下面的模型结束。

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

Top left: Confusion matrix. Middle left: ROC curves. Top right: Standardized coefficients. Bottom: Precision, Recall curves vs Threshold.

在左中上方,ROC 曲线看起来相当一致。在底部上方,训练和有效的精确召回曲线似乎在阈值= 0.9 附近相交,这显示了令人放心的一致性。在右上角,最大的系数是“支票账户”。我可以查看信息宁滨,以升序排列 A11(负余额)、A12 ( < 200DM), A13 (> = 200DM)、A14(无支票账户)来预测获得贷款。我们还注意到金额和期限与获得贷款负相关。奇怪的是,“工作技能水平”似乎对预测“好”或“坏”的贷款结果没有太大影响,对于“非技术-非居民”对“非技术-居民”对“管理/官员”。也许这一切都有道理,我可能会想与领域专家检查这一点。

目前,我坚持使用这个逻辑回归模型,它在 3.6 秒内训练,在 0.5 秒内运行测试数据,训练 ROC_AUC = 0.81,测试 ROC_AUC = 0.83,成本为 11 * 5 + 34 = 89 DM。 *我们比基本型号节省了 50%的成本!!并且使用更少的变量,训练和验证之间的差异更小。*这种模式显然是一种改进,如果我们参加比赛,我们会在 Kaggle 排行榜上,因为 top score 的测试 AUC 约为 78%。很好。

在特征工程之后,接下来的步骤通常是:
1)算法比较
2)超参数调整
3)阈值调整

我认为,通过尝试其他算法,进行超参数和阈值调整,我们甚至可以做得比我们自己的 83%更好,但我将在本博客系列的稍后部分演示这一点。

步骤 4)创建使用 BigQuery 模型的 ML 管道

回到我如何在现实生活的 ML 流水线中使用 BigQuery。在我目前的公司,用户并不期望他们的信用申请得到立即的回应。因此,我们可以使用批处理进行“实时”评分。下面是我的 BigQuery 批处理管道可能的样子:

  1. 以上面的特征工程 Python 脚本为例,在 allData 上运行一次。
    最终结果:另一个名为“transformedData”的 bigQuery 表。
  2. 像以前一样将转换后的数据分成训练/测试
  3. 使用交叉验证训练另一个 GLM 模型,与之前的过程相同,但仅限于*“trainTransformedData”*表(而不是“trainData”),并且仅选择我的最终模型中的最终特征(而不是 select *)。
    最终结果:glmModel 而不是 baseModel。
  4. 将 glmModelCoefficients,modelComparison metrics 保存为 Google Sheet(更永久,回想一下 GCP 大查询免费层每 60 天消失一次)。
    最终结果:多了两个表:glmModelCoeffiecients,modelComparisons(带有 Google Sheets 中的备份)
  5. 采用与步骤 1)中相同的要素工程 Python 脚本,将其转换为批处理作业,每隔几个小时仅对尚未转换的新数据运行一次。
    最终结果:另一个名为“testTransformedData”的 BigQuery 表,标记为 model_run=false。
  6. 进行实时预测-将另一个批处理作业添加到在上述步骤 1)后每 1.5 小时运行一次的批处理作业编制器中。
    最终结果:所有传入的新数据每 2 小时运行一次,批量实时获得推理分类。

步骤 6)要运行 BigQueryML,只需在 Java 或 Python 脚本中添加一条 SQL 语句:

# SQL to run inference on new data
SELECT
  *
FROM
  ML.EVALUATE(MODEL `cbergman.germanCreditData.glmModel`, (
SELECT   'chk_acct_woe', 'credit_his_woe', 'purpose_woe', 'saving_acct_woe', 'present_emp_woe', 'sex_woe', 'other_debtor_woe', 'other_install_woe', 'housing_woe', 'job_woe', 'foreign_woe','amount_logmean', 'installment_rate_logmedian', 'present_resid_logmedian', 'age_logmedian',  'n_people_max'
FROM `cbergman.germanCreditData.testTransformedData`
WHERE model_run = false);

# Tag inferenced data so it won't be re-inferenced
UPDATE `cbergman.germanCreditData.testTransformedData`
SET model_run = true;

摘要

我们使用 Google 云平台 BigQuery ML 工具进行了自始至终的 ML 建模。我们使用原始 Python、Scikit-learn、pandas、matlab、seaborn 来进行特征工程。把它变成一个脚本来进行特性工程,作为一个额外的数据工程步骤来创建转换后的 BigQuery 表。实现了一个逻辑回归模型,其测试 ROC_AUC = 0.83,成本为 11 * 5 + 34 = 89 DM(这将使我们进入 Kaggle 排行榜前 10 名)。

我的印象是,就像现在的 BigQuery ML 一样,如果没有额外的特性工程工作,你还不能得到一个值得 Kaggle 使用的好模型,但是你可以得到一个快速的基线模型。谷歌显然正在把资源放在它的 BigQuery ML 产品上,上个月有两个新的算法。仅此一点就说明这是一款值得关注的产品。即使是现在,我也要说这是一个值得学习的 AML 工具,并放入你的云 AI/ML 从业者工具箱中。

下一篇帖子,我将演示使用 Tensorflow 2.0 在相同的数据上构建深度神经网络。

资源

  1. BigQuery 文档页数:https://cloud.google.com/bigquery/docs/
  2. 博客作者谷歌的 BigQuery O’reilly book 作者:https://towards data science . com/how-to-do-hyperparameter-tuning-of-a-big query-ml-model-29ba 273 a 6563
  3. 一般反洗钱:【https://www.automl.org/book/
  4. 我的 github:【https://github.com/christy/MachineLearningTools
  5. 开放信用数据集:https://archive . ics . UCI . edu/ml/datasets/statlog+% 28 german+credit+data % 29
  6. 本文中提到的“信息宁滨”的 r 包:https://cran . r-project . org/web/packages/Information/index . html
  7. 对“信息宁滨”的进一步解释:http://u analytics . com/blogs/information-value-and-weight-of-evidence banking-case/

请随意使用我的截图和代码,但请做一个好公民,如果你想在自己的工作中使用它们,请记得注明出处。

如果你对我的文章或人工智能或人工智能有任何反馈、评论或有趣的见解要分享,请随时在我的 LinkedIn 上联系我。

让我提醒你一下:在机器学习中,准确性不是一切。

原文:https://towardsdatascience.com/let-me-recall-you-this-accuracy-isnt-everything-in-machine-learning-8e3a84ce0a8?source=collection_archive---------42-----------------------

为什么在评估你的机器学习模型时,回忆如此重要?

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

source

数据科学专业人士每天都在思考一件事:这个模型真的有效吗?数据就像一个活生生的生物,几乎每天都在变化和变得混乱。最后,我们想要的只是找到一种方法来处理它并做出好的预测,但是我们怎么知道我们的结果有多有价值呢?

嗯,最基本的事情之一是评估我们结果的成功率,或者说我们正确预测了多少测试数据。如果这个数字很高,理论上我们的模型做得很好。我们喜欢称这个值为精度

起点是理解我们试图预测什么。它可以是一个数字,一个类,甚至是一个是/否问题的答案。了解这些之后,我们就可以定义评估性能的参数了。对于本文,我将使用一个模型来尝试预测客户在网上购物体验后留下的评论是好是坏,这是一个典型的分类问题,有两种可能的结果:

0 =不是好评论

1 =是好的评论

为了回答这个问题,我做了传统的步骤:数据清理和特征选择,然后我训练了几个模型,挑选了一个并试图改进它。你可以在我的 GitHub 上找到完整的项目,包括我使用的数据集,在这里

最初,我尝试了 3 种分类算法:KNN、随机森林和支持向量机(SVM),使用了 scikit-learn 上提供的原生函数,并在每个模型上调整了一个参数。让我们来看看结果:

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

Source: author

让我们开始看看“F1 的准确性”一栏。在这里我们可以看到结果非常相似,每个都是 80%左右,这意味着从所有的预测来看,算法在 80%的时间里都是正确的,如果我们只有这些信息,这看起来很好。但是,当我们查看类“0”和“1”的召回时,这些值是完全不同的。但这意味着什么呢?

通俗地说,回忆列显示了一个模型在正确预测一个类的真实正面方面有多好。在上面的例子中,如果我们检查类别“0”的召回,在 KNN 算法中我们得到的值是 0.13。这意味着该模型只在 13%的时间里正确地分类了那个类。看起来很糟糕,确实如此!另一方面,我们可以观察到,类别“1”的召回率比类别“0”高得多,这推动了整体准确性的提高。

所以,在第一次尝试后,我选择了随机森林,因为它的召回率和准确率都比其他两种算法高。为了提高我的结果的质量,我使用了一些技术,如 上采样 少数类,以及 Gridsearccv来调整三个超参数。我不会在本文中讨论这些细节,因为我将在后面写更多关于模型改进的内容。

最主要的一点是:成功了!让我们来看看我改进后的结果:

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

source: author

像以前一样,让我们从 F1 分数开始,它从 80%跃升到 93%,表明该模型预测的准确性更高。但是当我们查看召回时,特别是对于“0”类,它从 24%增加到 96%,这是一个相当好的改进,不是吗?现在,这两个类都有了更加稳定和可靠的结果,即使对于部署来说还不理想,它也提供了更多的提示,告诉我们如何让它更好地工作。

今天就到这里。精确度很好,但绝对不是评估机器学习性能的唯一参数。目标是强调回忆的意义和重要性,我希望这篇文章对任何学习数据科学魔力的人都有用!

资源:

维基百科,精确和召回。可在:https://en.wikipedia.org/wiki/Precision_and_recall

GitHub 库:https://github.com/lucasmoratof/customers_review_project

让孩子们进图书馆

原文:https://towardsdatascience.com/let-the-kids-into-the-library-8ae59af7e3fc?source=collection_archive---------12-----------------------

在云中建立数据驱动型公司的固执尝试。

声明:在 Spotify 工作 5 年后,我现在在谷歌的云团队工作。观点是我自己的,而不是我过去或现在雇主的观点。

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

Photo by bantersnaps on Unsplash

在云中建立数据驱动型公司的 10 个步骤

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

Photo by Justin Wang on Unsplash

一天,我订购了一个新的耳机,它到达时已经坏了。所以我联系了我购买它的公司要求一个新的。他们甚至没有要求照片证明,就寄给我一双新的。

起初,我认为一定有很多人欺骗他们的支持服务来免费获得第二个耳机。
但后来我意识到这家公司很可能是数据驱动型的。你是想投资解决 1%的边角案例,还是应该专注于 99%并改进你的产品?雇用一个支持团队来处理少数收到坏耳机的顾客,与不问问题就运送一副全新耳机相比,成本是多少?

能够像这样自信地做出数据驱动的决策,不仅能为您的公司节省时间和资金,还能带来许多其他好处,例如:

  • 消除产品开发中的偏见。有多少产品因为某人有了一个伟大的想法而失败?
  • 了解顾客想要什么。通过实验,您可以在趋势发生之前识别它们,并且更加主动。

在了解 【资料网】 的概念之前,我写了这篇文章。下面给出的 10 个步骤可以看作是分布式域驱动架构的实现指南,由 Zhamak Dehghani 描述。

1.改变比工具更重要

突发新闻:选择更快的数据仓库不会让您的公司更加数据驱动。

许多公司往往天真地认为,开始将所有数据推送到云、下一代数据仓库就足够了,奇迹就会开始发生。虽然更快的洞察途径是必要的(因为没有人愿意等待 4 个小时来完成一个查询),但这是不够的。**更重要的是不同的团队在做出数据驱动的决策时如何合作。**阅读【Spotify 上的 DIBB 框架】

这就是为什么在评估云数据仓库时,您不应该将所有精力都放在运行速度最快的基准测试上。相反,您应该评估:

  • 发现、共享、复制、转换数据集的难易程度,以及是否支持列表一致性或高并发性等关键协作特性。
  • 获取数据是多么容易。例如,如果您必须安装一个 native client,打开一个防火墙端口,连接到不同的实例…或者如果所有数据都可以通过一个简单的 URL 并从同一个 API 安全地访问。【beyond corp 研究论文】
  • 随着数据的增长和时间的推移,扩展有多容易。因为如果你不得不继续依赖基础设施团队来扩展你的集群,它最终会成为一个瓶颈。因此,请确保诸如重新集群和 vacuum 之类的维护任务得到完全管理或毫不费力,并确保新的数据仓库将以无服务器的方式满足您未来的需求。
    就这一点而言,大数据格局每 6 个月都会发生或多或少的变化,所以选择一个盟友【持续创新】,这样你就不会以构建明天的遗产而告终。

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

2.从数据基础架构到数据运营

30 年的建筑应用可以简单地总结如下:

【单片应用】 = > 【多层架构】 = > 【微服务】

没有理由为什么同样的变化不能应用于数据工程。DevOps 原则毕竟不是软件工程独有的。
贵公司是否仍有基础设施团队维护和调整您的数据仓库?你所有的分析仍然是集中的吗,就像软件开发过去集中在大型计算机上一样?是时候让数据跟随微服务革命了!

但是,请不要马上解雇您的基础架构团队。这个团队的自然发展是让他们向上移动,开始成为一个数据运营团队。【为什么做 data ops】。为了避免孤立的实现,您的公司将需要他们有价值的工作来引导数据工程堆栈朝着正确的方向发展。正如开发人员所倡导的那样,他们的新使命是让其他团队在他们的数据之旅中取得成功,例如通过构建公司特定的框架(这就是【Scio】在 Spotify 诞生的方式)、模板或测试工具。他们应该拥有不同的自助服务工具,供数据工程师用于 CI/CD、数据治理、数据访问和匿名化、编排、计划和事件交付。

如下图所示,该团队的一些数据工程师也可以嵌入其他产品领域,以便在您组织的不同部门教授和提升数据专业知识。
数据分析不再是一个团队的工作,它应该是所有团队都可以自主完成的事情它应该是用例驱动的
每个产品领域应该能够定义和跟踪他们的关键指标,例如,MAU(每月活跃用户),以便他们能够迭代和改进他们正在发布的功能。

就像一些公司【决定不要首席技术官】一样,你应该质疑在你的公司里雇佣一个分析/数据(科学)主管是否有意义,或者相反,数据应该是一个分布在不同任务中的专业领域,以遵循【康威定律】

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

3.降低壁垒

现在,您的公司可能只有一个人手不足的数据分析团队,他们以一种漂亮的星形模式仔细分类您的所有数据,就像一位老图书管理员会仔细整理和分类他所有的书籍一样。

如果你想让你的公司转型,变得更加数据驱动,你必须让孩子们进入图书馆。通过这个类比,我的意思是:让你的所有员工,而不仅仅是数据专家,访问数据。这个概念并不新鲜,也被称为数据民主化

没有人应该再拥有数据仓库,它应该是多租户的。数据应该属于它所源自的不同产品领域,因为这些团队拥有可以确认数据确实正确的业务逻辑。

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

数据运营团队应该提供工具来降低所有员工的门槛,而不仅仅是 Java 或 Python 开发人员。

  • ETL/ELT 应该对每个人来说都很容易做到,也许是通过 SQL 而不是 Java,也许是使用一个具有拖放界面的数据集成工具,例如【CDAP】【马蒂利翁】
  • 确保容易采用机器学习。现在,您可以使用 AutoML 产品或直接用 SQL 编写 ML 来获得很好的结果。【大查询 ML】。当然,如果你的 ML 专家想要培训和部署定制模型,也应该是可能的。看看【kube flow】也许吧。

参考资料:

4.关于这个语义层

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

一开始,拥有一个语义层似乎是一个好主意,这样孩子们就知道去图书馆哪里找到他们最喜欢的书。
在遗留数据仓库中,数据通常被建模为数据仓库或 Kimball 星型模式,以支持语义层。但是这些方法现在已经【25-30 岁】如果说 NoSQL 的崛起已经扰乱了数据建模一次,那么大数据和云可能是标准化数据模型的又一枚钉子。
事实是,维护一个对公司每个人都有意义并且每个人都容易查询的总体语义层真的很难。随着时间的推移,这种语义层甚至有可能因为缺乏灵活性而降低您的分析速度。

为了说明这一点,我们举一个例子,定义一个语义层来表示 Spotify 这样的应用程序,见下文。

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

给定这个简化的雪花图式,下面是一个请求示例:给我 2018 年在瑞典演奏的前 10 名艺术家。
数据模型应该允许这样的查询,而不必在复杂且容易出错的查询中连接 5 或 6 个表,这样的查询最终会扫描整个数据集。您所做的查询应该定义您的数据模型

对于不擅长编写 SQL 查询的人来说,从生成的<top_played_artist>表中找到前 10 名艺术家不是更容易吗?</top_played_artist>

为了实现真正的数据驱动,你必须释放数据,让不同的团队随心所欲地复制粘贴、构建管道和分割数据,以解决他们的问题,而不是强迫他们根据通用的语义法则格式化数据。
这就是数据契约发挥作用的地方。

请注意,我并没有完全放弃保留语义层的想法。如果你不知道你在找什么,它会很有用。对于 BI 仪表板中的数据探索,表示不同数据点集合在一起的语义层是有意义的。但是它应该被定义为一个逻辑层,而不是在物理表上强制任何特定的模式。【LookML】

补充阅读:
[【Kimball 维度建模在现代数据仓库中是否仍然相关?]](https://discourse.getdbt.com/t/is-kimball-dimensional-modeling-still-relevant-in-a-modern-data-warehouse/225/5)

5.数据契约

你可以说是【API 指令】改变了亚马逊,诞生了 AWS。我相信,如果你想建立一个数据驱动的公司,你应该考虑采用类似的原则,并像对待 API 端点一样对待数据。您的开发 ETL/ELT 管道的团队应该开始使用数据契约进行交流,通过【SLOs】进行衡量。

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

回到我们上面的前 10 名艺术家的例子,这里有一个使用数据契约解决这个问题的典型过程:

  1. 首先,我们不要多此一举。也许另一个团队已经创建了一个数据端点(=共享数据集),可以解决我们的问题。在你的【数据目录】里找吧。
  2. 如果没有找到现有的数据集,去和拥有计算前 10 名艺术家所需数据的团队谈谈。如果多个团队都有这个数据,找到真相来源。两个选项:

a)查看公司数据谱系,事实的来源可能是起点(最上游的数据集)。通常,它是来自 OLTP 系统的数据转储或【CDC】
不用说:不要把你的数据管道直接连接到他们的 OLTP 系统。

b)查看数据治理元数据标记,可能有一个(下游)数据集被提升为真实的来源。
这被称为 MDM(主数据管理),如果你正在转向 BigQuery,我推荐关于这个主题的【这篇优秀的读物】

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

3.一旦你找到要交谈的团队,就数据契约达成一致,并让他们为你公开一个数据端点,就像你在两个团队之间构建一个松散耦合的微服务架构一样。

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

如果上面的团队 2 不精通数据工程,也许团队 1 可以计算前 10 名艺术家,并在数据集中公开,或者你可能同意另一个团队 3 为公司的其他人做这件事。

这个数据契约是关于数据模式和服务级别目标的协议:可用性、响应时间、质量等。通过相互交谈,两个团队知道他们已经创建了这个链接,如果需要更新,他们将必须就新的合同达成一致。这个契约确保了这个实现不会在几个月后雇佣新的工程师时变成一个过时的依赖。

你可能已经发现我们反规格化了我们的雪花模式。为了使查询更简单,我们牺牲了一些一致性和存储空间。没有更复杂的语义层来容纳两个团队。SQL 初学者现在可以编写查询。

最佳实践是对您的模式进行版本化,并将它们上传到您在数据契约文档中引用的公司模式注册中心中。

6.放护栏,以后再关心成本

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

Photo by Dominik QN on Unsplash

您不应该回避使用上述数据契约方法复制数据。云中的存储很便宜,你只需为你使用的东西付费,如果成本成为一个问题,你可以调整旋钮。

尝试在云中使用星型架构*来优化存储空间,就像在连接到互联网时关心使用哪种 TCP 变体一样,这在 90 年代很有趣。相反,把你的工程时间花在【夸张】用例上。现在,您不再受以前数据中心容量的限制,可以开始接收更多日志和数据了。如果由于数据驱动的决策,您可以获得 100 倍的额外收入,那么花 1000 美元购买存储是完全可以的。

*在发明列存储之前,星型模式曾经是压缩事实表的好主意:)

7.数据大学

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

Photo by Vasily Koloda on Unsplash

将一些软件/后端工程师转变为数据工程师,并运行一个内部【数据大学】项目!

使用像 Apache Beam 这样的框架,如果您是一名懂 Java 或 Python 的软件开发人员,您应该能够很快学会如何创建您的第一个数据管道。

8.数据质量不是可选的

【不正确的数据比没有数据更糟糕】。为了确保数据质量,您可以:

  • 培养质量第一的心态,委托你的数据工程师去测试他们正在做的事情。这可能比雇佣一个专门的 QA 测试团队更有效。游戏化可以鼓励正确的行为。例如:为数据管道引入不同级别的测试认证,当你升级时有一个奖励系统。在 Spotify 上阅读关于【TC4D】的内容。
  • 将您的业务流程分解成多个工作流程。既然您让不同的产品团队开发他们自己的数据管道,他们将需要某种编排工具,如【气流】。如果出现问题,需要重新处理数据,Airflow 可以重试或回填给定的工作流。
    能够将计算追溯到物化的东西通常是至关重要的,并且气流还可以绘制不同转换步骤的谱系(上游输入&下游输出)。
    【dbt】【data form】可能是另一种选择,如果您的管道都是用 SQL 编写的(或者您可以将它与 Airflow 结合使用)。

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

  • 创建一个存储生产数据副本的测试环境,以便您可以运行验收测试。实施 DevOps 支柱,如 CI/CD(运行您构建的内容)、代码评审、【基础设施即代码】
  • 验证您选择的工具是否包含某种测试框架。比如:如果你所有的管道都是用 SQL 写的,或者都是用图形用户界面实现的,那你怎么写测试呢?下面是一个用 SQL 编写的【简单上游健康检查】的例子。
  • 在 Stackdriver 或 Grafana 中设置监控。在不符合 SLO 的情况下发送警报。这里有几件你可以监控的事情:
    ——数据是否按时交付?例如:在每日分区中每天上午 8 点。
    -数据完整吗?使用【数据计数器】
    -数据是否正确?它必须根据数据协定中约定的模式进行格式化。
    -数据一致吗?运行一些端到端的测试,检查不同系统的数据是否意味着相同的事情,否则船可能会沉。

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

  • 尽量避免突变(DML)为了避免副作用,保留你的原始文件(ELT 而不是 ETL),对你所有的表进行分区,保持你的任务“纯净”,就像【功能数据工程】指南中描述的那样。

参考:【Spotify 如何解决数据质量】

9.建立一些控制

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

通过让孩子进入图书馆,你实际上制造了混乱:)
数据治理是拼图中的重要一块,为这种混乱带来一点秩序。因此,制定一些规则是很重要的;由您新组建的数据运营团队撰写的黄金路径。让您的数据工程师成为这一转变的向导。
到处都是数据契约,就像微服务一样,这是一个大混乱,直到你带来类似【Istio】的东西。
如果你存储个人信息,需要匿名,如果你打开了数据仓库的大门,数据到处都是,你怎么办?这可能是一个很好的解决方案:【加密删除】

关于这个主题的一些最后的建议:启用审计日志,为您的数据设置一个保留期,使用【最小特权原则】并实现【ITGCs】

10.发现新数据

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

你知道谷歌照片和 Spotify 有什么共同点吗?它们都非常适合发现新照片和音乐!几年前,当第一批数码照片和 MP3 文件开始出现时,我们当时使用的应用程序反映了我们以前制作相册和制作混音带的非数码习惯。

这是因为(正如埃隆·马斯克解释的),用类比推理比从基本原则推理更容易。
当迁移到云时,你必须抓住机会,消除所有现有的偏见和已知的限制。直到你到了一个什么都不能推断的地步。你回到了基本原则,你可以开始构建一个新的更好的解决方案。这种思维模式最终被 Google Photos 和 Spotify 应用到了他们的产品开发中,为生活带来了新的数字体验:我们现在不再对照片进行分类,而是将所有东西上传到云端,因为我们每天给孩子拍 500 张照片,但没有时间对它们进行分类。我们让 Spotify 根据我们的心情推荐歌曲,而不是听一两个播放列表。

获取无限的照片和音乐改变了我们的习惯。我们可以说,数据也在发生同样的转变。公司正在存储越来越多的数据,运行 A/B 测试,发布 canary 并比较关键指标,以验证他们的选择。过去,你必须仔细分类并删除冗余数据,否则你的数据仓库会很快填满。如今,这已经不重要了,就像谷歌照片和 Spotify 一样,你应该彻底改变处理数据的方式,专注于发现。

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

Photo by Aaron Burden on Unsplash

感谢阅读!
随时在 Twitter 上联系 @tdelazzari

在本章中,我们将深入探讨基于块匹配的全景图像拼接技术,这是一种广泛应用于计算机视觉和图像处理领域的技术。在深度学习和机器学习的背景下,这种方法的实现与整合显得尤为重要,因为它们能够提升图像处理的效率和精度。下面,我们将会详细阐述相关知识点。 我们要了解什么是全景图像拼接。全景图像拼接是一种将多张有限视角的图像合并成一个宽视角或全方位视角图像的技术,常用于虚拟现实、地图制作、监控系统等领域。通过拼接,我们可以获得更广阔的视野,捕捉到单个图像无法覆盖的细节。 块匹配是全景图像拼接中的核心步骤,其目的是寻找两张图片中对应区域的最佳匹配。它通常包括以下几个关键过程: 1. **图像预处理**:图像的预处理包括灰度化、直方图均衡化、降噪等操作,以提高图像质量,使匹配更加准确。 2. **特征提取**:在每张图像上选择特定区域(块)并计算其特征,如灰度共生矩阵、SIFT(尺度不变特征变换)、SURF(加速稳健特征)等,这些特征应具备旋转、缩放和光照不变性。 3. **块匹配**:对于每一张图像的每个块,计算与另一张图像所有块之间的相似度,如欧氏距离、归一化互信息等。找到最相似的块作为匹配对。 4. **几何变换估计**:根据匹配对确定对应的几何关系,例如仿射变换、透视变换等,以描述两张图像之间的相对位置。 5. **图像融合**:利用估计的几何变换,对图像进行融合,消除重叠区域的不一致性和缝隙,生成全景图像。 在MATLAB环境中实现这一过程,可以利用其强大的图像处理工具箱,包括图像读取、处理、特征检测和匹配、几何变换等功能。此外,MATLAB还支持编程和脚本,方便算法的调试和优化。 深度学习和机器学习在此处的角色主要是改进匹配过程和图像融合。例如,通过训练神经网络模型,可以学习到更具鲁棒性的特征表示,增强匹配的准确性。同时,深度学习方法也可以用于像素级别的图像融合,减少拼接的失真和不连续性。 在实际应用中,我们需要注意一些挑战,比如光照变化、遮挡、动态物体等,这些因素可能会影响匹配效果。因此,往往需要结合其他辅助技术,如多视图几何、稀疏重建等,来提高拼接的稳定性和质量。 基于块匹配的全景图像拼接是通过匹配和融合多张图像来创建全景视图的过程。在MATLAB中实现这一技术,可以结合深度学习和机器学习的先进方法,提升匹配精度和图像融合质量。通过对压缩包中的代码和数据进行学习,你可以更深入地理解这一技术,并应用于实际项目中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值