数据分析的女性视角
从我在计算机科学系的交换学期中学到的关于性别不平等影响的课程…
今年,我将以在莫斯科的一个交换学期开始我大学的最后一年。我选择这个地方不仅是因为童话般的风景;丰富的艺术收藏和精心设计的公园,但数学!
在网上,我学习了这所大学的机器学习课程,因为我非常喜欢看视频和学习材料,所以我决定加入他们的真实课堂。目前,我正在计算机科学系学习研究生课程,感觉棒极了!然而,随着讲座的进行,我对计算机科学世界多样性的呼吁有了新的看法…
我在学院的第一周
想象一下我,走进教室,拿出笔记本和记事本,准备开始上课。诚然,我可能有点太急切了,但总的来说,我们女人喜欢计划一切。我们需要,考虑到我们通常写在待办事项清单上的所有任务:杂货、洗衣…这不是火箭科学,但记住一切会让你的大脑爆炸!
相反,和男生合租房子让我看到了另一种方式。随便买些杂货,吃些容易做的菜,看看会发生什么。在课堂上,我的讲师也没有遵循一个结构化的计划。当我问到这个问题时,他的回答是:“这是个好主意……如果我的讲座有一个结构就好了。”。
我越研究计算机科学,就越认识到这种对结构的漠视。“我们只需要让它发挥作用”是总体目标。当然,对于我刚刚概述的这一概括,也有例外。然而,我确实认为,一个男性过多的院系显示出缺乏结构并非巧合。在本文的剩余部分,我将概述女性视角对计算机科学领域的积极影响。
随着这一领域越来越多地参与重大创新,不仅在技术部门本身,而且在医药、金融、教育和政府组织。以下主题需要更多关注。
首先,我们女人比我们的对手更关心沟通……清晰的沟通可以节省一遍又一遍解释发生了什么的时间。清晰的沟通不仅有利于团队或组织内部,而且在模型将被用于现实决策时也很重要。例如,我们需要报告拒绝贷款或做出医疗决定的原因。具有讽刺意味的是,有了数据分析,我们有了从数据中提取有价值信息的解释能力,而这些信息是人类无法提取的。然而,我们的工作是确保这些见解能够被人类理解。因此,我们需要对模型的内部运作有清晰和深入的了解。
第二,我们需要通过这种清晰的交流方式来包容他人。数据科学在日常生活中的应用涉及许多方面。增强领域知识是当前数据科学方法的巨大优势之一。这个过程需要双方的积极参与:数据科学家和领域实践者。要让不懂数据的人开始学习时感到舒服,需要同理心和耐心。
第三,信息 超载会让人望而生畏,尤其是对女性来说。我们倾向于认为我们不能比人理解得更快…可惜!我的目标是用我的网站展示数据分析可以被分成几个部分。我们可以更详细地查看每个步骤,以确定我们的下一个行动项目。例如,我们是否需要自己从复杂的数据库中查询数据,或者已经有一个. csv 文件可供分析。很多时候,我们甚至不需要花哨的建模来获得关于数据的深刻信息。在适当的数据收集和预处理之后,我们可以使用无监督学习从数据中提取模式。
通过尝试运行一些基本分析,甚至尝试正确导入数据,您已经可以学到很多东西。一步一步来,希望有助于揭开这个复杂词汇世界的神秘面纱;惊人的结果和令人生畏的数学。
总之,这篇文章根本不是针对女性的。它关注的是计算机科学世界中更多“女性”特质的影响。通过这篇文章,我希望能激励男性和女性在他们的日常工作中加入一些数据分析,只要他们看到一个尝试的机会。使用“男性”心态:谁知道会发生什么?或者甚至:这将是惊人的!。此外,要认识到清晰沟通和组织项目的价值。最后,尝试并激励同事(男性和女性)开始运行一些脚本,看看会出现什么,并专注于帮助他人。有足够多的数据可以使用,同样的情况也适用于花哨的方法。从人群中脱颖而出,不仅要展示你实施最新科学论文的个人能力,还要展示你在通往数据驱动社会的道路上领先的精神。
数据一年:2018
从一年的自我追踪中,我们能学到和发现什么?
追踪一个人的一生可以得出什么样的教训和观察结果?我们收集的所有数据可以用来更好地了解我们自己,甚至帮助我们变得更好吗?
在开始分析之前,这里有三个“挑逗性”的数据可视化和问题,这些数据帮助我注意到并回答了去年的问题:
2018 年,我手动记录的大部分时间都用在了个人项目上,这很好。我仍然保持着体面的客户,自由职业者的收入,但我的重点仍然是自己的东西和业务。。如果这些是你的目标,这就是你的时间应该去的地方。但是发生在六月和八月?这两个月都出现了不错的时间记录下降。这两个月让我去演讲,参加更多的会议以及更多的旅行,包括和朋友去西藏和四川旅游一周。我的睡眠也讲述了另一个故事。
2018 年我平均每晚睡 7.23 小时,但从 6 月中旬开始发生了什么?为什么我的睡眠平均值下降了?世界杯!像许多人一样,我熬夜,喝了一点啤酒,因为我享受了一个史诗般的足球行动月。具有讽刺意味的是,其他领域也出现了下滑。我写得更少,锻炼也更少。具体图表见下图。
2018 年我跑了一年比较一致,一直到最后一个季度?发生了什么事?突然,我的跑步训练量大幅下降。这是由于一系列轻微到严重的伤病,我不能训练了。原因是什么?下面我检查了一系列其他跟踪的数据点,目前我的工作假设是一个起作用的因素是流动性/拉伸和力量训练的减少。
这是我使用简单但有规律的自我跟踪和数据收集创建的三个数据可视化,数据收集使用 QS 分类账。如果你有兴趣在未来一年创建类似的图表或变得更加数据驱动,请注册我的简讯以提前获得我的课程,2019 年初谷歌数据工作室量化自我和数据驱动的生活。
现在开始表演!
我的数据驱动型年度评估
年度回顾是目标导向型的人的主要任务,也是我自己喜欢做的事情。但鉴于我的中心论点是数据可以用来改善人类生活,我喜欢超越怀旧的思考或充满希望的战略愿望。我喜欢用数据来充实我的一年回顾。
让我在这里简单梳理一下我的核心信念:我们现在有足够多的廉价技术、传感器、小型电脑(即手机和可穿戴设备)和云存储,既可以跟踪很多领域,也可以存储大量的生活数据。这种活动通常被归类为量化自我、自我跟踪、个人信息学或数据驱动的生活。
基本上,它是人们收集生活中的数据并试图使用它。很简单,我可以也应该使用数据和自我跟踪,这样我们的生活就能被更好地理解和改善。这是数据驱动的个人发展 101。
因此,带着这些目标和希望,我很高兴分享最新版的我的数据年!
今年的报告包括我如何写作,我的电脑使用时间和项目时间,我完成任务的趋势,阅读的书籍和文章,我的健身努力,以及我用手机拍的一些照片。对于健康,我强调跑步,但也有一些关于睡眠和 HRV 的一般健康数据。显然,有一吨的数据可以用来切片和骰子,并告诉你一年的回顾故事。我选择这些是因为它们对我很重要,而且相对来说任何人都可以跟踪。
今年的一个好处是,不像去年的数据年,我也开源并分享我用来创建这些图形的所有代码。因此,对于任何有一些技术技能和时间的人来说,你也可以建立你自己的数据驱动的回顾年。此外,通过一些调整,您可以改变外观和感觉,或者进行额外的观察和分析。你可以在 QS 分类账找到代码,我在文章的最后分享了一些具体的做法。
希望到明年年底,我将有一个网络或移动应用程序,让任何人都可以更容易地做,甚至可以用数据创建一本关于你这一年的完整书籍。
来看看我这一年在数据上的故事吧!
(注意:虽然超出了这里的范围,但我也做了一些更深入的统计分析和机器学习方法来使用这些数据。现在,我将不得不把这个话题留给将来的文章。)
背景故事:从跟踪到处理数据的一年…
(注意:本节将深入介绍细节,因此可以跳过下面的内容直接进入分析和数据,即!)
首先,也许有必要告诉你一点关于我追踪的东西以及我为什么追踪这些东西。
我的一个核心信念是数据和跟踪可以帮助我们更好地了解我们自己,并授权自我改善。我跟踪不仅仅是因为我发现这是一个有趣的爱好。我跟踪自己的生活,以便更好地了解自己,进而做出改进和个人优化。追踪开始是有点怀疑地询问我的时间去了哪里,并扩展到其他领域,以了解生活中的活动如何相互影响。
*2018 年我追踪了什么?*我在 2018 年没有做太多明确的跟踪改变,相比我在 2017 年跟踪的内容,除了改变我跟踪习惯的方式(我现在使用 Habitica)和我测量设备屏幕时间的方式(我使用苹果的 screentime)。也就是说,我确实跟踪了我应得的份额,并将继续这样做。
如果你正在寻找关于你可能跟踪的事情的想法,请查看我的帖子:2019 年你应该跟踪什么?在这里,我将进入一个两步走的过程,即跟踪什么以及如何利用你的数据实现你的目标。
与 2017 年不同,我在 2018 年的主要关注点不是如何跟踪,而是数据参与。我的目标是让数据变得有用和有意义。我停止使用 Tableau,这是我在数据博客帖子中的 2017 年我用于分析和图表的主要数据工具。Tableau 非常昂贵,作为一个拖放工具意味着不像在代码中那样容易再现数据可视化。这也意味着它不能扩展到创建未来的 web 工具或可共享的脚本。
由于今年重点关注 Python 的数据科学,我已经过渡到使用 Pandas 和 Matplotlib 来完成我的大部分数据分析工作,包括今年的数据审查。它还不是像素完美,但我对结果很满意。日复一日,我结合使用 IFTTT、Google Sheets 和 Google Data Studio 来驱动我的个人数据仪表盘。
实际上,这种对 Python 数据可视化的改变转化为我花了大量时间学习 Python,并为数据收集、数据可视化甚至一些机器学习编写代码。这是我多年来第一次使用 Python,我对可用的语言和工具非常满意。我在该地区的 PyCons 上的几次演讲中分享了我的学习和过程。最新版本可在:如何成为数据驱动的你:从数据采集和数据处理到数据分析和数据可视化再到用 Python 进行机器学习和深度学习。
此外,底层代码已经全部开源,可以在 Github 的 QS 账本上获得。事实上,这篇文章中的几乎所有内容都可以用你自己的数据和代码复制。除了代码中的数据分析,我唯一真正做的工作是将图表组合成一张图片,并用 Photoshop 添加一些样式。
总而言之,在 2018 年,我在 Apple Watch 上跟踪了我的步数、HR 和睡眠,用 Strava 跑步,用 Fitbod 应用程序进行力量训练,用 PhotoStats.io 拍摄照片,用 Goodreads 阅读书籍,用 Pocket/Instapaper 阅读文章,用 Todoist 完成任务,用 HR 训练心率变异性,用 PodcastTracker.com 收听播客,用 Toggl 进行项目时间,用 RescueTime 进行计算机时间。这些都是我拥有全年纵向数据的领域。
此外,我有一些血压和体重的定期检查数据,我还做了一些其他简短的跟踪实验,包括血糖监测和一个相当有趣的粪便跟踪实验。
这些图表涵盖了健康、生产力、创造力、时间和其他一些领域,是我试图讲述的一个数据故事。2018 年是我超越自我跟踪和数据积累的一年,我开始更加自觉地使用和参与我的数据,以实现一个目标,即建立一个数据可以改善生活的世界。现在,我的目标是帮助人们了解使用跟踪数据达到目标的可能性,并为个人数据分析带来更多的可访问性。
受我收集、分析、可视化和构建的所有数据的启发,这是我的数据年!
我在谷歌数据工作室的一年概述:
在进入我的具体数据可视化之前,让我们快速看看我对 2018 年的最后一次每周回顾。下面是我的工作效率仪表板的样子:
以下是我的健康和健身数据:
我很高兴地说,我用一些很好的锻炼和一点休息结束了 2018 年。从全球来看,你可以看到睡眠和锻炼的一些趋势。我的睡眠在每周 27 至 29 日有一些大的下降。那里发生了什么?我的跑步在 2018 年初达到顶峰,但我没有在下半年保持这一趋势。我在机动性和力量训练中看到了类似的趋势。在我的工作时间里,总体趋势是积极的,但也有一些有趣的下降。
这些个人数据仪表板和报告是使用 Google Forms、Google Sheets 和 Google Data Studio 的组合创建的。你可以注册我的时事通讯以在 2019 年初首次获得我的课程量化自我的谷歌数据工作室和数据驱动的生活。
下面我们来看一下跟踪数据的分类。
一年时间:我在 Toggl 中使用计算机和记录项目时间的一年
几年来,我一直在记录我的电脑时间和手工记录的项目时间。这提供了一个有趣的机会去探索我的时间在一年中的各种变化。
总的来说,这是我最后一年的样子:
一些时间使用要点:
- **2018 年更深入的工作:**我是卡尔·纽波特书和支持“深入工作”的论点的忠实粉丝基本上,他认为,在一个分心的世界里,那些能够专注于认知困难任务的人将会富有成效,富有创造力,并产生更高质量的工作。这就是我如何对待和安排我的一天。我早上和下午都在做重要的、有挑战性的工作。然后我在下午休息一会儿,锻炼、吃饭和散步。晚上,我做一些挑战性较小的任务和行政工作。实际上,这转化为几天的时间,我真的深入其中,花了 10 多个小时工作。我发现,再加上几天真正的休息,这种深度方法对我很有效。
- **2018 年离开电脑 21 天:**我在电脑上度过了 344 天,低于前几年的 362 天(2017 年)、362 天(2016 年)和 364 天(2015 年)。基本上,我花了一些时间完全离开电脑。起初有点困难,但一两天后,不用打开电脑,而是以不同的方式创作、思考、写作和阅读,这是一种解放。我喜欢这种数字突破的想法,我将在 2019 年尝试再次这样做。
- **更多的时间在软件开发和编码研究上:**根据 RescueTime 的实际程序使用情况,我在软件开发上多花了差不多 300(2018:563.7 小时 vs. 2017: 268.5 小时)。根据我的项目日志,我也达到了今年超过 312 小时的目标。虽然我已经做了很多年的开发人员,但这是我第一次有意识地想学习一门新的编程语言(Python)并更多地参与工程。此外,这也出现在一些附带项目或初创公司的努力中,包括我的应用 PhotoStats.io 和 BioMarkerTracker 以及 PodcastTracker.com。最大的事情仍然是 QS·莱杰(更多关于这一点在最后)。
- **减少电子邮件:**我 2018 年的目标之一是减少电子邮件。2017 年,我在电子邮件上的时间超过了 149.8 小时,而可怕的是,2015 年我一年仅在电子邮件上就花了 405.1 小时。但在 2018 年,电子邮件甚至没有进入前 7 名。正如我喜欢说的,没有人会因为最快的邮件回复时间而获奖。但是他们确实因为完成了重要的、有价值的工作并且做得很好而得到它。有趣的是,与 2017 年相比,我在 2018 年花在组织工作上的时间也减少了,如项目,任务和目标规划。这可能意味着我知道我应该做什么,不会浪费在“生产力色情”上。
- **更多的写作,努力成为职业作家:**我终于接受了写作不仅仅是个人爱好,我现在正在努力成为职业作家。我的数据揭示了花在写作上的时间意味着什么。根据 RescueTime 的纯应用程序使用日志,2018 年我花了 429.8 小时编写应用程序,相比之下,2017 年的 379.3 小时和 2016 年的 298.9 小时有所增加。根据我积极记录的“写作”项目时间,我在 2018 年花了 370 小时写作,而 2017 年花了 227 小时。虽然我没有发表很多博客,但我正在写一本书,并创建一个在线课程,这两者都与我的写作技能密切相关。
关于我的时间,我最大的收获是:我花了 25%的时间在电脑上,比花在项目上的时间少一点。这个项目时间与计算机时间的比率仍然是我工作效率的一个清晰的衡量标准。一天、一周或一年的 25%在电脑上似乎是一个不错的数字,我真的不认为我能在 2019 年做出更大的努力。我可以在某些方面变得更加有效和平衡。例如,我希望在客户端工作上更加一致,这样我就可以减少集群化,增加常规输出。此外,我应该得到报酬,所以我需要思考,并在来年努力获得报酬。基本上,我在过去的两年中创建了一系列的副业项目,所以我计划开展真正的针对性活动,努力创造收入。然而,从全球来看,如果我遵循我的一般时间管理和时间分配,在未来的一年里,大事情最终会发生。推那块巨石!
一年的健身和跑步
我在 2018 年跑了两次马拉松和两次半程马拉松,并在途中进行了有趣的跑步和训练。我是一个跑步爱好者,我发现这种定期锻炼对我的创造力和生活满意度产生了非常积极的影响。我仍在努力使我的力量训练和灵活性/伸展性更加一致。以下是我健身一年的情况:
通过查看这些数据并将其与 2017 年进行比较,最令人吃惊的发现之一是移动训练时间的大幅减少。我没有做那么多的运动后恢复(从 2017 年到 2018 年,移动时间减少了大约 40%)。这让我想知道这种缺乏拉伸和恢复是否是我在 2018 年受伤更多和表现更差的一个因素。
目前,我将假设它是,并将致力于增加我的移动工作,以达到 2017 年的水平。我希望这能减轻我的疼痛,并为来年的良好运行打下更坚实的基础。我应该能在未来几个月里梳理出一个效果。
下半年我的力量训练有所下降。我想在未来的一年里变得更强壮,肌肉更发达,所以力量训练将是主要的追求,希望我也能从数据中梳理出更多我的进步(或不足)。一致性才是王道。
完成的任务:我在 Todoist 的任务和项目中的一年
我仍然是 Todoist 的超级粉丝。本着 GTD 精神,Todoist 是一个优秀的任务管理器,并提供了很好的数据可访问性,这也使它成为最好的任务跟踪器之一。
我又一次在 2018 年完成了很多任务。我在数据分析中没有注意到这一点,但我已经开始更多地关注更高优先级的任务,而不仅仅是检查一堆中等重要性的东西。总体而言,正如我们在数据中看到的那样,2018 年的产量非常稳定:
虽然主热图显示了一年中相当一致的任务完成情况,但这个可视化的下半部分让我可以注意到某些项目活动增加的模式和特定时期。
例如,对于生产力任务,我们几乎在一年中的每个周日都能看到一致的苍白目的。这是我每周检查一两个任务并设定目标的时候。类似地,我的编码学习通常安排在周六完成,热图显示了这一趋势,同时也显示了更多任务的密度。找到一种更好地可视化项目任务的方法是很有趣的,这样我们就可以在一周中的不同象限中看到它们。
相比之下,我看到几个项目有周期性的集群。对于数据驱动的你(一个在线课程和书籍项目)、语言学习(我在 4 月份试图学习一些泰语)以及在某些旅行之前和期间的分散旅行任务来说,这是真实的。
总的来说,我对正在完成的任务感到满意,并将继续推动自己朝着目标前进。在未来,我希望能够更好地将我的任务与我的目标联系起来,这也是我现在试图以一致的方式跟踪的。
写作一年
2018 年是我真正接受写作作为职业追求的一年。我发表了 26 篇博文,为我正在创建的一门课程准备了十几篇课程文章,我还有一份正在进行中的手稿。写作对我来说是一种习惯,我仍然写很多东西作为学习和研究的一种形式,但它正在慢慢走向实际的可出版的手稿。
我的写作行为应该得到更好的数据分析,但目前,这里有一组基于 WordCounter 的数据可视化,这是一个 Mac 工具,我用它来计算我在一组选定的写作应用程序中每小时键入的单词数:
我的作品中有几个明显的要点:
- 一个上午写作的人:我坚持在早上写作,这既是一种生产习惯,也是为了我的工作。我写作的高峰时间是从上午 10 点到中午。我应该致力于在未来继续积极保护这段写作时间。很明显对我有效。
- **一个不断变化的作家工具包:**对于我的作家工具包,我一直是 Evernote 的长期用户,但我最近转向用明文减价文件写作和记笔记。自从从 Evernote 迁移出来,我就致力于这种新方法。这种对纯文本文件的改变也带来了跟踪我的写作的新能力。我也能跟上我的思想、学习和写作的发展。我计划很快就此分享一篇文章和代码。这将在未来几个月提供一些有趣的跟踪数据。
- 每月变化:我有一个一贯的写作习惯和产出,直到夏天事情开始下降。从 9 月到年底,活动再次增加。我不确定看到这种变化是件坏事。深度工作可以根据项目灵活安排。休息也是必要的。很高兴看到总体的一致性,但我喜欢在特定的时间和临近截止日期时深入努力,然后彻底休息。
- 出版物数据分析在哪里?我肯定需要对我的实际手稿进行数据分析。我可以从一个简单的自动化脚本开始,从我过去的所有作品中提取字数和出版日期。这也是我要做的事情。
睡眠与健康一年
自从我变得更健康,减肥,变得更加积极,我发现了很多关于自己和人类的事情。虽然我可以把这个放在开头,但我把这个可视化放在最后,因为它提供了一个有趣的方式来查看今年与这些趋势相关的其他方面。
让我们来看看数据:
以下是一些快速观察:
- **2018 年是健康的一年:**我平均每晚睡眠约 7.23 小时,生病天数较少(2018 年 2 天,2017 年 5 天),我的最大摄氧量,这是衡量你最大氧处理能力的指标,相当健康,我的心率变异性【HRV】相对稳定。
- **为什么从 6 月到 7 月我的睡眠减少了?😗*世界杯!你会听说世界杯对全世界的生产力都有影响。我确实从熬夜、喝啤酒和看大量足球比赛中看到了我自己的影响。开球也与一个大型演讲约会和准备活动重叠。
- **(轻微)负面趋势:**我的几项健康指标呈轻微负面趋势,包括 HRV、最大摄氧量和我的一些睡眠。2018 年也喝的比较规律。如果我觉得 2018 年比 2017 年更好或更差,我自己的记忆是一个可怕的指标。我这一年过得不错,但我有一些数据可以看看,梳理出我的主观感受。就目前而言,这些核心指标确实需要一些努力来稳定下降趋势。在某些时候,我确实有一些跑步受伤和一定程度的个人压力。一些可能的选择是更好的睡眠模式(而不仅仅是更多的睡眠),有意识的放松,也许是冥想。
关于我的健康,我最大的一般收获是:我还没有时间进行真正的统计数据分析,但这些健康可视化确实暗示了我健康的轻微负面趋势与我生活各个领域的影响之间的某种程度的联系和相关性,见其他图表。例如,有人可能会问:我睡眠时间的减少和饮酒量的增加是否影响了我的健康表现、创造力和学习能力?做较少的伸展和活动会影响其他区域吗?在特定时间起床对一天或第二天有什么影响?这些都是我希望在未来探索的问题,无论是对自己还是对他人。
现在,我主要可行的项目是安排更多的时间睡觉和伸展,再加上一些冥想。基本上,不要只是计划项目和目标,也要包括放松的项目。
反过来,我早就应该进行一些血液生物标志物测试,看看是否有一些营养或其他失衡问题我可以解决。我有一个关于最常见和最有用的血液生物标志物的开源数据库,如果你想了解更多信息或知道要做什么测试。
阅读一年
关于我阅读的内容和时间以及我个人最喜欢的书籍和文章的完整细节和信息图表,请参见: 2018:阅读年。
照片一年
我们拍的照片也可以讲述一个关于我们生活的故事。这就是我开发 PhotoStats.io 的动机,这是一款适用于苹果和安卓系统的手机应用,可以让你在本地统计和解析你的拍照生活。除了帮助你追踪照片历史和标记照片,该应用程序还提供了一些简单的图表和图形。人工智能支持的自动标记功能还可以帮助你分类和理解照片中的内容。
那么,照片中的我这一年是什么样子的呢?
我的照片数据揭示了一些有趣的事情。它显示我在周末拍了大部分照片。我拍了很多动物(狗和猫)的照片,也拍了很多自然照片。我使用 PhotoStats.io export 和 MapBox 地图设计工具创建的地图清晰地显示了我过去一年去过的地方,包括老挝之旅、四川公路旅行和西昌马拉松赛、马来西亚会议以及西藏徒步旅行。我还能看到我去年在新加坡、曼谷和成都附近的青城山的主要枢纽。
像许多人一样,2018 年我远离了大多数社交媒体。脸书和 Instagram 有太多的“表演”艺术和生活,而不是真实的生活,它可以变成我在时间和享受生活方面的负面影响。也就是说,我最终在 2018 年在 Instagram 上分享了大约 35 张照片,大部分是在年初,当时我有一些欧洲朋友来访。
总的来说,我发现照片数据仍然是理解生活的一种非常有趣的方式,我计划继续维护和添加 PhotoStats.io 应用程序的功能。如果你有兴趣,你可以在 www.photostats.io 查看这个应用程序。假设你有最近几个月的大部分照片,它应该可以很好地给你一些总体趋势。
结论:大数字
以下是我 2018 年的“大”数字:
- 采取并记录了 3,878,369 个步骤。
- 在www.markwk.com 上发表了 26 篇博文。
- 跑 1559.72 公里(969.16 英里)
- 2 完成 42.2 公里马拉松
- 2 完成 21.6 次半程马拉松
- 通过 PhotoStats.io 拍摄、追踪 2991 张照片。
- 35 张通过我的 Instagram 发布在社交媒体上的照片(比 2017 年少了很多!)
- 94 天(的时间)在电脑上根据改期
- 根据人工时间跟踪,项目时间为 84 天
- 2212 在 Todoist 中完成了十几个项目的任务。
- 根据 GoodReads 的数据,60 本书阅读了 18657 页
- 通过 Pocket 和 Instapaper 阅读了 1785 篇文章
- 据 Trakt.tv 报道,他们看了 132 小时的电视和 82 小时的电影。
- 2018 年使用 Last.fm 收听和“搜索”了 16,855 首歌曲。我最喜欢的流派是 Synthwave、电子和 Synthpop。我最喜欢的歌曲是勒·马托斯的《冷夏》。我最喜欢的艺术家是乐卡带。
结论:离别的思念
好的。这是一年中的大量数据和数据可视化。总的来说,2018 年对我来说又是很好的一年。我保持健康,做对我重要的事情。我在财务上取得了一些进展,并致力于我的大愿景目标,即创造一个数据可以帮助改善和提高我们生活的世界。
显然,这种情况可能并不总是如此,未来的一年可能会在我的生活和数据中看到更糟糕的趋势。我可能会生病、受伤或抑郁。生活就是这样。我仍然致力于每年用数据讲述我的故事,一个真实的、个人的故事,不管那种生活是好是坏。
展望未来,我希望让这种跟踪和数据分析变得越来越容易被每个人理解。我目前正在谷歌数据工作室为量化的自我创建一个在线课程(计划在 2018 年初发布)和一个更长的课程如何跟踪生活。我在 QS·莱杰方面也取得了稳步进展,这是今年所有报告的主要代码。
如果你对使用数据来增强我们的世界和生活的可能性感到兴奋,请加入我的简讯或通过评论、电子邮件或社交分享来联系我。越来越多的人来烦我,加入我,肯定会推动我在未来的一年里在这些领域做更多的工作!
我希望你喜欢这篇文章,并发现它有趣和鼓舞人心。
祝你在新的一年里好运和快乐!
额外收获:用 QS 分类帐建立你自己的数据年度或数据驱动的年度回顾
《数据回顾》中我这一年的所有数据可视化都是使用QS·莱杰创建的,这是一个 python 数据科学项目,专注于个人跟踪数据的数据收集和数据可视化。然后用 Photoshop 将它们组合起来。
唯一的例外是地图。这些是使用 MapBox 地图设计器创建的,并将基础数据导出到带有经度和纬度的 CSV 中。使用 MapBox 的在线数据集和制图工具,这是一个非常简单的过程。
在这一节中,我想简单介绍一下如何使用 QS 分类帐在数据中创建年份。
PS——如果你对 QS 账本中涉及的背景故事和数据科学感兴趣,并使用 Python 进行自我跟踪,请查看我在如何成为数据驱动的你的详细幻灯片:从数据收集和数据处理到数据分析和数据可视化,再到使用 Python 进行机器学习和深度学习。
跟踪注释:
为了跟进,你需要一直跟踪与 QS·莱杰集成的数据点之一。该项目目前集成了近 20 种不同的跟踪服务,如 Strava、Fitbit、Oura、RescueTime、Todoist 和许多其他服务。
安装 Anaconda 并下载代码和笔记本
首先,我推荐下载并使用 Anaconda 发行版。这是一个 Python 的数据科学平台,包括一个简单的安装程序和你需要的主要软件包。
接下来在这里下载或者 git 克隆代码 repo:https://github.com/markwk/qs_ledger.
QS 莱杰是使用 Python 3 构建的,代码目前通过 Jupyter 笔记本共享。大多数服务依赖 Pandas 和 NumPy 进行数据操作,依赖 Matplot 进行数据分析和可视化。
在 QS 分类账目录中启动 Jupyter 笔记本
- 安装了 Anaconda 或同等软件后,打开命令行或终端应用程序。
- 定位至下载 QS 分类帐代码的位置。
- 在该目录中,只需命令
$ jupyter notebook
就可以在浏览器中启动 jupyter 笔记本程序。或者,您可以安装并使用 Jupyer Lab,它提供了更多的功能。
核心步骤:收集数据,运行分析
在接下来的步骤中,我们将浏览一个示例数据源,即 RescueTime。首先,我们将从 API 收集数据,然后运行一些数据分析代码。
虽然不同服务的细节可能略有不同,但基本方面基本上是相同的:在运行(和/或调整)数据分析之前收集数据。
示例:RescueTime 的数据收集
RescueTime 是我最喜欢的跟踪服务之一。它可以让您跟踪您的计算机使用时间的难以置信的细节。
在 Jupyer 笔记本的中,导航文件目录并打开 rescuetime 目录中的rescuetime_downloader.ipynb
。如果你愿意,可以在网上看看代码:https://github . com/markwk/QS _ ledger/blob/master/rescue time/rescue time _ downloader . ipynb .
在该笔记本中,您将看到为收集数据进行重新时间设置的多个步骤。使用您自己的授权密钥遵循这些步骤。
完成后,运行所有单元格,开始收集数据。这可能需要几分钟,取决于您使用 RescueTime 的时间。
最终结果应该是几个导出的 csv 文件,您应该准备好做一些数据分析!
示例:重新计算时间的数据分析
现在是时候打开rescue time _ data _ analysis . ipynb并运行数据分析了。
该笔记本的第一部分提供了一些关于你在电脑上花费的时间的一般数据分析,包括你的主要类别和应用程序的细分,每月生产时间与分心时间的细分,以及其他一些报告。我建议一个接一个地浏览第一部分,对您的数据有一个大概的了解。
以下是我的年度明细:
数据分析的后半部分允许您设定目标年份,然后查看您的年度分析。默认情况下,它被设置为当前年份,但是您可以调整它来查看与上一年的比较。我们再一次看到了热门应用和月份的细分。此外,还有一个热图,让您可以查看一年中哪一天工作效率最高,或者您使用电脑的时间最多。最后还有一个小时图表,显示你一天中哪几个小时效率最高。
这是我每天工作时间的热图:
虽然不可否认的是,代码确实需要在未来的一年中进行一些清理,但大多数代码都有很好的文档记录,并且清楚地说明了它在做什么,因此您应该能够调整和调整以查看时间数据的不同方面。如果您有任何问题,请在 github.com 的问题队列中留言。
下一步:其他服务的数据收集和数据分析。
现在我们已经看到了一个使用 RescueTime 进行数据收集和数据分析的示例,您可以继续为其他跟踪服务收集和生成数据报告。这包括锻炼、睡眠、完成的任务等数据。
我强烈建议使用相同的可视化方式并排比较不同的跟踪数据,看看是否能注意到任何可能的趋势或联系。
此外,还有一个示例笔记本,展示如何将多个数据源组合成一个数据框。这可以用来创建包含多个数据点的图表,探索相关性甚至使用机器学习进行预测、聚类和预测。
祝你的数据分析和自我跟踪好运,我迫不及待地想看看你创造了什么!
星巴克的 A-Z 特性工程
Photo by Erik Mclean on Unsplash
据估计,80%的数据科学过程致力于收集数据并将其塑造成可行的形状。许多组织坐拥大量数据,这些数据可能以各种形式出现。
在本帖中,我们将看到商业头脑和以客户为中心的方法如何转化为获得有用的见解,即所谓的特征工程。
数据可以在 github 上找到,包含星巴克奖励移动应用程序上的模拟客户行为,就像在现实生活中发生的一样。每隔几天,星巴克就会向手机应用程序的用户发出一次报价。
开始时严格的方法论可以转化为无缝的实现,比如制作一个推荐引擎。
这篇文章的解释和代码注释非常冗长:它试图阐明特性工程过程中的每一个步骤。
数据集
Photo by Etty Fidele on Unsplash
数据集被分成三个 JSON 文件:
- portfolio :包含要约 id 和关于每个要约的元数据(持续时间、类型等)。)
- 配置文件:每个客户的人口统计数据
- 抄本:交易、收到的报价、查看的报价和完成的报价的记录
每个文件处理特征工程过程的一个主题。我们的最终目标是将这三个文件汇集成一个全面的用户特征数据框架和一个用户项目矩阵。我们将利用 python 3.x 库,如 pandas ( pd )、 numpy ( np )、matplotlib(PLT)、以及 seaborn ( sns )。
投资组合
Photo by Bundo Kim on Unsplash
第一个文件处理可能仅仅是一个饮料广告或实际优惠的优惠,如折扣或买一送一( BOGO )。某些用户可能在特定的几周内收不到任何报价。
我们使用 pandas.read_json 方法加载投资组合
我们可以在单一视图中显示产品组合:
Portfolio
下面是我们原来栏目的解读,建议在开头用 pandas.dtypes 来确认数据类型。
- id (字符串)—报价 id
- offer_type (string) —优惠类型,即 BOGO、折扣、信息
- 难度(int)——完成报价所需的最低花费
- 奖励(int)——完成一个要约给予的奖励
- 持续时间 (int) —报价开放的时间,以天为单位
- 通道(字符串列表)
我们注意到 offer id 是一系列没有特定含义的字符串,用整数替换它们会很有用。如果这些整数在编号背后有某种意义,那就更有用了:让一个更小的 offer id 表示更容易的难度。
我们利用 python 内置的 zip 和 dict 构造函数将报价映射成整数。如果我们需要返回,我们为另一个方向创建一个字典。
此外,我们可以看到渠道只能接受四个值:电子邮件、手机、媒体和社交。假设它是一个嵌套在列中的列表,我们使用 pandas.get_dummies 和 pandas。系列:
结果是一个可读性更好的表,其中 1 表示真,0 表示假。我们将同样的方法应用于 offer_type 特征。我们将同样的方法应用于 offer_type 列,并创建一个 offer_type_dum 表。
对于奖励和难度,我们对单位了解不多。奖励是美元还是一些 app 币?难度是如何衡量的?不确定性是数据科学过程的一部分,在这种情况下,我们将保持这两个特征不变。
我们将把持续时间转换成小时,因为我们将在后面看到它将与抄本数据集中的单位相匹配。我们可以用 pandas.concat 、 replace 和 reset_index 创建一个干净的投资组合。:
结果是一个干净得多的桌子可以自己站立。
我们可以使用这些清理后的数据,用几行代码创建一个 Pearson correlation 热图:
热图揭示了一些有趣的相关性,例如 BOGO 的提议往往与更高的回报相关。
在组合中,我们看到了简单的清理步骤如何让数据自己讲述一个故事。在下一节中,我们将看到如何处理丢失的值。
用户概要
Photo by Nathan Dumlao on Unsplash
我们以与投资组合类似的方式下载个人资料数据,下面是一个示例截图:
我们在以下特征空间下总共有 17,000 个观察值:
- 年龄 (int) —客户的年龄(如果未知,则为 118)
- 成为会员日期 (int) —客户创建 app 帐户的日期
- 性别 (str) —客户的性别(注意,有些条目包含“O”表示其他,而不是 M 或 F)
- id (str) —客户 id
- 收入(浮动)—客户收入
我们马上就可以看到,缺少值是一个问题。我们使用 pandas.isna 和 pandas.mean 方法来查看缺失值的分数:
有趣的是,收入和性别都有相同比例的缺失值。对于同样的用户,我们是否对年龄、性别和收入一无所知?我们可以用一个断言语句来检验这个假设:
语句传递:原来这是同一批用户。
当处理缺失值时,我们必须问我们在模型中注入的方差和偏差是什么。丢弃所有丢失的值可能会使模型失去有用的信息。对于收入和年龄,我们查看没有缺失值的数据分布。
我们看到均值和中位数几乎是一样的。因此,如果我们估算中值,我们不期望均值或方差发生变化。
对 T2 来说,性别问题更加微妙。2018 年亚马逊因对女性有偏见而废弃了他们的人工智能招聘工具。性别是自我报告的,我们会把回答了其他问题的人和不想回答的人归为一类。
用户 id 是一系列没有特定含义的字符串,我们可以像以前一样创建一个 human_to_int 字典。
最后一个特征是客户创建账户的日期。这一特征对于衡量客户任期似乎很重要。然而,如果我们不能参照某个时间点,时间的度量就没什么用了。我们决定放弃的特性。
副本
Photo by Carli Jeen on Unsplash
最终的数据集也是最有趣和最复杂的。以下是文字记录的样本:
其特点是:
- 事件 (str) —记录描述(即交易、收到的报价、查看的报价等。)
- 人员 (str) —客户 id
- 时间(int)——自测试开始后的时间,以小时为单位。数据开始于时间 t=0
- 值 —(字符串字典)—报价 id 或交易金额,取决于记录
我们可以看出这份记录需要大量的清理工作。首先,在事件列上应用 get_dummies 方法是有帮助的。
我们可以通过将值列转换成一个序列来分解值列中的值。
我们看到键,现在是列,有四个不同的值。似乎 offer id 和 offer_id 是两个独立的列,可能是记录数据时出错。我们可以通过查看这两列是否互斥来检查这一点:
该行返回一个空数据帧。这意味着 offer id 中没有值包含在 offer_id 中,这两列之间没有明显的冲突。我们可以用熊猫来纠正这个错别字。
我们现在可以创建一个结合了这些列并使用了 human_to_int 和 offer_to_int 字典的抄本 _comb 数据框架。此外,我们建议使用 pandas.map 而不是 pandas.replace 来提升性能。
组合的数据帧抄本 _ 梳看起来像:
我们可以调查人物 2 并查看他们的历史样本:
请注意,时钟不会在时间=0 时开始计时。这与给定条件表相冲突,记住总是要验证陈述,并且在证明之前不要假设为真。用户也有在报价前发生的购买,我们没有明确的方法知道后来的购买是否是因为报价。
此外,开始时间不依赖于某些参考,比如用户注册的日期或一天中的时间。因此,我们将假设观察期不受季节性的影响。
考虑下面显示的另一个人: person 35 。这位客户在 time=0 收到报价,立刻打开,6 小时内成交。
另一方面,他们在 time=168 收到一个报价,立刻打开,在 time=336 收到另一个报价,再次打开,在此期间没有完成两个报价就花了钱。
这两个案例揭示的是,支出还没有被标记,并且多个提供可以同时发生。这与现实中用户收到可以组合在一起的多个报价没有什么不同。
在某些情况下,用户没有看到报价,仍然会花钱。假设他们的消费是因为一个提议,这将是一个严重的高估。
我们将假设用户受到被查看的第一个要约的影响,该第一个要约将是被发送的第一个要约。下表是这一假设的示意图,也是整篇文章的症结所在:
考虑将接收两个要约 O1 和 O2 的单个用户,使得在接收到 O1 的时间 T0 记录时间。在 T0,用户不受任何报价的影响。从 T1 开始,用户看到了 O1,因此任何购买都是因为 O1 而完成的。
在 T1,用户也接收到 O2,但是还没有看到它。在 T2,可以看到 O2 的报价,但是用户仍然受到 O1 的影响。只有过了 O1 的有效期,才能认为购买是因为 O2 而完成的。
这是一个简化,被认为是这个职位的范围所必需的。在现实中,更详细的评估将包括至少 90 个可能的报价组合,并可能根据难度、报酬和沟通媒介等指标来确定哪个报价将占主导地位。
我们的目标是创建这样一个函数,为一个交易分配一个报价 id。此外,我们希望测量用户行为,如打开时间和完成时间,如果可能的话,到一个时态表。
我们从返回 iterable 的每个部分的成对函数开始。
我们定义 person_fill_na.py 为交易分配报价 id ,如下所示:
注意,在上面的函数中,我们将开始时间和结束时间定义为报价持续时间的一部分。事实上,相对于报价来衡量用户的反应比用绝对数字来衡量更有意义。
我们用转录本 _ 填充 _ 钠. py 构建了上面的函数。
在预期的管道中,使用一个清理器函数从数据库中获取数据并返回清理后的数据帧是很有用的。为此,我们定义了一个抄本 _cleaner.py :
在将来的应用程序中,我们可以用一行代码来处理这个脚本:
把所有的放在一起
Photo by Gabi Miranda on Unsplash
创建用户数据框架
清理完所有三个文件后,我们可以开始组装带有 pandas.merge left join 的表,以便在一个公共键上进行一对多匹配。一个 pandas.groupby 语句按用户和项目聚集统计数据。此外,我们将沟通渠道乘以被看到的时间量,从而相应地分配权重。
下一步,我们将思考什么是总和统计,什么是平均值统计。我们可以在下面的代码中看到,事务的数量应该是一个总和,而时间的度量应该是一个平均值。
最后,我们通过内部连接创建用户数据框架。我们还定义了更多功能,例如:
- amount_pct :因促销而花费的钱的百分比
- 看过的出价与收到的出价的比率
- 已完成 _ 比率:已完成报价与已收到报价的比率
我们还用 1 填充完成时间和打开时间,这样 0 表示非常高的响应率,1 表示很少响应或没有响应。
user_df 现在是每个用户的个人资料和消费习惯的大规模特征集。下图展示了 23 个特性中的一小部分。
用户-项目矩阵
创建用户项目矩阵不太复杂,因为我们使用来自清理函数的抄本 _ 完整的:
得到的用户条目数据帧是:
摘要
Photo by Hans Vivek on Unsplash
清洁过程绝不是一项简单的任务,需要所有负责方的审慎判断。大多数真实世界的数据是杂乱无章的,形式混乱,需要验证其可靠性。
引用凯茜·奥尼尔和瑞秋·舒特的话,一名数据科学家将时间花在了:
数据将如何用于决策,以及它将如何重新构建到产品中[…]她在收集、清理和挖掘数据的过程中花费了大量时间,因为数据从来都不是干净的。这个过程需要持久性、统计学和软件工程技能——这些技能对于理解数据中的偏差和调试代码的日志输出也是必要的。
我希望这篇文章对你有用!特别感谢 Udacity 和星巴克的合作,并使这些数据可用。
R 中 AB 样本量的计算
R 中计算样本容量和实验持续时间的一些有用工具
介绍
为利益相关者执行即席分析可能非常耗时。此外,我还经常被问到一些问题。所以我花了一些时间开发一些工具,让我的“非技术”同事在 r 中使用。
最常见的问题之一是“我需要多大的样本才能达到显著性?”,后面常常是“我需要运行我的实验多长时间?”。为此,我开发了一些简单的代码,供人们在需要回答这些问题时使用。所有用户需要做的是传递一些基线数字到我创建的一些函数中,他们可以确定他们的样本大小要求和实验持续时间。
样本量、统计功效和实验持续时间
幸运的是,通过了解一些简单的信息,R 中的 pwr() 包可以相当轻松地回答这两个问题。 Pwr() 帮助您在进行实验之前进行功效分析,使您能够确定每个实验条件下的样本量。
计算功耗分析所需的四个量有着密切的关系,如果我们有剩余的输入,我们就能够计算出其中的任何一个值:
1。样本量(n)
2。效果尺寸
3。显著性水平(α)= P(I 型误差)=发现不存在的影响的概率
4。功效= 1 — P(第二类误差)=发现存在效应的概率
由于您的显著性水平(3)和功效(4)通常是固定值,只要您可以输入对照和变量的效应大小(2),您就可以确定所需的样本大小(1)。
幸运的是, pwr() 包中的 ES.h() 函数计算出我们的效应大小,以便我们进行功耗分析。我们通常会知道我们的控制条件的当前转换率/性能,但是变量的影响根据定义几乎是未知的。然而,我们可以计算一个预期的影响大小,给定一个期望的提升。一旦计算出这些影响,它们将被传递到 pwr.p.test() 函数中,该函数将计算我们的样本大小,前提是 n 留空。为了使这种分析对用户友好,我将前面提到的两个函数打包成一个新函数,名为sample _ size _ calculator()。
此外,因为我们将使用这些信息来计算运行实验所需的天数,所以我也创建了一个 days_calculator() 函数,它将使用我们的样本大小计算的输出:
sample_size_calculator <- function(control, uplift){
variant <- (uplift + 1) * control
baseline <- ES.h(control, variant)
sample_size_output <- pwr.p.test(h = baseline,
n = ,
sig.level = 0.05,
power = 0.8)
if(variant >= 0)
{return(sample_size_output)}
else
{paste("N/A")}
}days_calculator <- function(sample_size_output, average_daily_traffic){
days_required <- c(sample_size_output * 2)/(average_daily_traffic)
if(days_required >= 0)
{paste("It will take this many days to reach significance with your current traffic:", round(days_required, digits = 0))}
else
{paste("N/A")}
}
如果您正在使用此工具,您只需指定您的控制转换率和所需的提升:
control <- 0.034567uplift <- 0.01
并运行 sample_size_calculator() 函数:
sample_size_calculator(control, uplift)sample_size_output <- sample_size_output$nsample_size_output
然后,在给定这些值的情况下,您将获得所需的样本大小输出(请记住,此样本大小要求是针对每个变量的):
[n]230345
现在我们有了这些信息,我们可以确定实验需要进行多长时间。您需要输入的只是您的日平均流量:
average_daily_traffic <- 42000
运行 days_calculator() 函数:
days_calculator(sample_size_output, average_daily_traffic)
您将得到以下输出:
[1] It will take this many days to reach significance with your current traffic: 36
虽然此代码仅适用于 AB 设计的实验(即只有两个实验条件),但是可以使用 sample_size_calculator() 中的 pwr.anova.test() 函数,替换 pwr.2p.test() ,修改给出的函数,以计算多个实验条件下所需的样本量。
结论
功耗分析是任何实验设计的必要方面。它允许分析师以给定的置信度确定检测给定规模的统计显著性效应所需的样本规模。相反,它也有助于在样本大小的限制下,以给定的置信度检测给定大小的效应。如果概率很低,建议改变实验的实验设计,或者将输入到功效分析中的某些数值最小化。
相互结合使用,计算所需的样本和实验持续时间可以为利益相关者提供非常有用的信息。获得这些信息可以帮助他们有效地规划他们的实验路线图。此外,这些预定的数字可以帮助确定某些实验的可行性,或者期望的提升是否过于理想化。
关于对立的例子
关于什么、为什么和如何使用对立例子的概述
在深度神经网络的世界中,对立的例子是一个有趣的话题。这篇文章将试图解决这个话题的一些基本问题,包括如何产生这样的例子,并对它们进行防御。以下是我们将要介绍的内容:
- 什么是对立的例子?
- 为什么重要?
- 为什么会发生?
- 如何生成对抗性的例子?
- 我们如何防御对立的例子?
1。什么是对立的例子?
一般来说,这些输入旨在使模型错误地预测。在计算机视觉环境中思考这一现象更容易理解——在计算机视觉中,这些是输入图像的小扰动,会导致模型的错误分类。
From Explaining and Harnessing Adversarial Examples by Goodfellow et al.
虽然这是一个有针对性的对立示例,其中图像的变化是人眼无法检测到的,但非针对性示例是那些我们不太关心对立示例对人眼是否有意义的示例——它可能只是人眼的随机噪声。
A non-targeted “3” from Tricking Neural Networks: Create your own Adversarial Examples by Daniel Geng and Rishi Veerapaneni
我不能完全准确地说,有针对性的对抗性例子是图像的变化是人眼无法察觉的。虽然扰动很小, 有证据表明,在一个有时间限制的环境中,即使是人类也会被对抗性的例子 所愚弄。
2.为什么重要?
在开始解释为什么这个话题很重要之前,让我们先弄清楚几个定义。根据攻击者的知识水平,对抗性攻击可以分为白盒攻击或黑盒攻击。白盒攻击是指对手完全了解被攻击的模型,如权重、偏差、使用的超参数等。黑盒攻击的对手是只知道模型输出的普通用户。
对抗性攻击是一个重要的研究和考虑的主题,因为它已经表明,对抗性的例子从一个模型转移到另一个模型。换句话说,为欺骗一个模型而生成的对立例子也可以欺骗使用不同架构的其他模型,或者使用相同任务的不同数据集进行训练。现在,这变成了一个巨大的安全风险,因为攻击者可以为与目标模型相同的任务开发本地模型,为本地模型生成对立的示例(就本地模型而言是白盒),并使用它们来攻击目标(可转移性使得对目标模型的黑盒攻击更容易)。这使得大量主流或即将成为主流的应用面临风险,如面部识别、自动驾驶汽车、生物识别等,这些应用利用了基于 ML 的计算机视觉模型。
本文 探讨了这在现实世界中的威胁有多大,因为在现实世界的许多使用案例中,输入来自摄像头和其他传感器。它证明了即使通过摄像机输入对立的例子也会导致错误分类。 这是另一篇论文 通过生成在变换分布上保持稳健的示例,并使用 3D 打印来创建稳健的 3D 敌对对象,来展示现实世界的威胁。
3.为什么会发生?
深度学习和机器学习吸引了所有的注意力,因为它们帮助我们成功地解决了计算机视觉、自然语言处理等问题。这些用例是传统的基于规则的系统无法解决的,仅仅是因为所涉及的规则的庞大数量和复杂性,考虑到这些用例的输入中可能会有各种各样的变化。换句话说,如果我们必须手工编写准确识别所需的所有规则,输入空间通常非常巨大,并且接近无穷大。即使对于像 MNIST 这样的低变量数据集也是如此,更不用说 ImageNet 或其他场景了。
一般来说,神经网络是一个计算图,其中分类决策由针对训练数据优化的权重和偏差驱动,并且不显式地对决策应用逻辑推理。因此,任何非目标图像被错误地以更高的可信度分类为属于某一类并不令人惊讶。例如,每个像素可以有 256 个可能的值,因此,即使是 16×16 大小的小图像也可以有无限多的可能输入(即,256 个⁶* ⁶或~10⁶ ⁶可能图像)。考虑到如此大的输入空间,找出一些能使计算图产生与正常图像相同的结果并不奇怪。
4。如何生成对抗性的例子?
从概念上讲,用于生成对立范例的方法与开发神经网络没有太大的不同。如果 A =训练数据,B =预期分类,C =模型权重,D =成本函数。在训练模型时,A 和 B 是固定的,我们不断改变 C 以确定使 d 最小的最佳值。类似地,为了生成如上所示的无针对性的对抗性示例,我们保持 B 和 C 固定,并不断改变 A 以确定使 d 最小的最佳值。
这是 Pytorch 文档中的另一个例子,通过引入一个小的改变来产生一个有针对性的例子。
*# FGSM attack code*
**def** **fgsm_attack**(image, epsilon, data_grad):
*# Collect the element-wise sign of the data gradient*
sign_data_grad **=** data_grad**.**sign()
*# Create the perturbed image by adjusting each pixel of the input image*
perturbed_image **=** image **+** epsilon*****sign_data_grad
*# Adding clipping to maintain [0,1] range*
perturbed_image **=** torch**.**clamp(perturbed_image, 0, 1)
*# Return the perturbed image*
**return** perturbed_image
该文档提供了一个端到端的示例,包括模型定义、初始化和前馈方法,以及一个测试函数来运行攻击并可视化生成的对抗示例。但这一切的关键是上面的方法,创造了一个对立的例子。请注意,这与训练模型非常相似。通常,在针对给定输入和预期输出进行训练时,您会更新模型的权重。
*# Update weights*
w1 **-=** learning_rate ***** grad_w1
w2 **-=** learning_rate ***** grad_w2
然而在这里,权重没有改变,但是输入图像改变了。
*# Create the perturbed image by adjusting each pixel of the input image*
perturbed_image **=** image **+** epsilon*****sign_data_grad
还要注意,在更新权重时,我们减去学习率乘以梯度,从而将它们向最小化成本函数的方向移动,而我们将ε乘以梯度添加到图像,从而向相反方向移动成本函数。
5。我们如何防御对立的例子?
总的来说,还没有任何普遍接受的解决方案来抵御对抗性攻击。已经提出了许多防御技术,但结果不一,而且在随后的研究中经常被绕过。以下是一些重要的常见示例:
对抗性训练 是在训练时使用对抗性的例子,以减少误分类。有不同的技术探索制定这一概念和改善培训。我们不会在这里讨论这种训练的各种技术和相关细节,但一般来说,对抗性训练在使模型对攻击具有鲁棒性方面产生了混合的结果。
自动编码器 是使用的另一种机制。自动编码器是一种神经网络,它首先通过使输入通过一个较低维度的隐藏层来降低输入的维度,然后再尝试在其与输入层具有相同维度的输出层中重建信息。换句话说,它试图成为一个恒等式函数,只是它被约束为在重构信息之前首先压缩信息。根据定义,这消除了输入中的噪声,并且仅保留了重建原始图像所必需的那些特征。这种自动编码器也有助于消除敌对的干扰,并取得了一些成功。但是也可以使用前面描述的相同方法生成对立的例子,只是现在包括自动编码器以及网络的一部分。
防御蒸馏是解决这个问题的另一种方式,正如这里讨论的和 这里的 。防御性蒸馏是网络蒸馏的一种变体,其中网络的概率向量预测作为具有相同架构的蒸馏网络的训练标签。使用这样的软标签进行训练使得提取的网络平滑,对输入的变化不太敏感,并且对敌对输入具有鲁棒性。
DeepSafe ,另一种很有前途的方法,就是这里讨论的。这是一种基于以下原则的技术,即输入空间的一个区域内的所有输入属于同一类,并且将被标记为相同。DeepSafe 首先将已知的标记输入分组到不同的聚类中,每个聚类包含相同类别的图像,并代表输入空间中的一个区域。然后,它发现在这个区域内是否有被不同分类的输入。如果在该区域内没有找到这样的输入,则认为它是安全的。如果找到一个,则重新绘制该区域并重复该实验,直到找到一个安全区域。
正如本文 中所讨论的 ,也许对抗性的例子是不可避免的,尤其是在更高维度中更难防范。无论如何,这是一个重要的话题,对于参与这个领域的每一个人,从主管到爱好者,所有关于这个话题的研究和发展都应该被密切关注和尽可能的支持。
具有社会影响的数据科学案例
Two hands holding a heart made of tech elements (author unknown)
到目前为止,数据的重要性、力量和价值是毋庸置疑的。企业已经找到了盈利的方法,无论是通过销售新产品和服务,还是仅仅通过优化内部流程和节省资金。然而,关于数据的社会影响以及数据如何直接帮助那些急需帮助的人和整个社会的讨论并不多。
称之为新的石油或新的黄金,数据无处不在,无时无刻不在产生。当被问到这个问题时,我们都能想到数据产品的商业例子:推荐系统、搜索引擎、信用风险算法。毫无疑问,这些都是有用的——它们解决了一个问题,并在某种程度上改善了人们的生活。
另一方面,还没有太多的想法(更少的工作)放在使用这些相同的算法通过帮助更多弱势群体来创造非商业的社会影响上。事实是,公司用来提高利润的这些算法也可以被社会公益组织使用——毕竟,数据驱动不仅限于公司。事实上,数据科学还可以帮助政府、非营利组织和社会公益组织更有效地运作。
那么,为什么这里还没有做很多工作呢?嗯,就是一般的原因——不赚钱。
大多数在任何社会变革领域工作的组织都没有预算或人员来充分利用这场数据革命。更重要的是,他们甚至不知道数据如何帮助他们——我不怪他们,他们的日常运营已经忙得不可开交了(你知道,拯救世界之类的)。最终,这些组织主要依靠志愿工作生存下来,而这些志愿工作在任何方面都是不可扩展的。但是,如果我们能向这些组织展示数据对他们的价值,那会怎么样呢?如果我们可以使用数据在他们的工作中引入可扩展性会怎么样?
除此之外,数据科学专业人士也不清楚他们如何能提供帮助。
大多数数据科学家没有意识到,如果他们的专业知识以不同于他们日常工作的方式得到利用,他们的技能会多么有价值,他们的工作会多么有影响力。但是说实话,数据科学可以在很多领域产生直接的社会影响。从扶贫、倡导儿童福祉和抗击饥饿到医疗保健、改善教育和环境事业,数据科学有可能真正解决看似牢不可破的问题。然而,这只有在数据科学家和社会部门专家之间进行强有力的合作时才有可能。
那么,现在该怎么办呢?
我对解决这一问题的组织数量在全球范围内少于少数感到失望,但受到这一社会需求的激励,我和一群对数据科学和社会影响有着相同愿景的了不起的人聚集在一起,创建了葡萄牙社会公益数据科学。我们希望根据社会公益组织的真正需求,通过从数据收集到预测建模的整个数据处理流程来帮助他们。
为了让事情变得更简单快捷,我们与 DSSG 芝加哥合作(并借用了这个名字)。他们的投资组合中已经有了一系列社会公益项目——比如这个项目,关于在美国几个警察部门使用数据科学来改善警察互动。DataKind 是另一个已经做了相当长一段时间的组织(他们有幸与我们见面,分享了他们的一些实用知识,并就如何启动这个项目给出了提示——谢谢大家!).他们做的一个项目是关于英国无家可归者以及弱势群体的数据如何降低这个问题的普遍性。
希望这两个例子能让你理解利用数据科学造福社会的潜力,并激励你进一步思考你能做些什么。
正在总结…
如果你想了解更多关于 DSSG 葡萄牙以及我们如何利用数据的力量改变社会(以及我们的公益时间),请查看我们的 LinkedIn 并关注我们的 Medium 。我们将在这里分享关于我们的社会公益项目的新闻和真实故事——这里仍然有点像鬼城,但请留步,我保证它会越来越多😄
附注:我们将在葡萄牙举办两场演示会议(一场在波尔图,另一场在里斯本),欢迎参加。有免费的食物!🍖
使用 SSL 证书验证从 Azure 函数访问 MySQL 的 Azure 数据库
一种连接 MySQL 的安全方式,可防止中间人攻击
Photo by Dayne Topkin on Unsplash
最近,我有一个客户需要管理相对较少的数据。所以,我建议 MySQL 用 Azure 数据库。基本上,最小的实例成本大约每月 560 澳元就足够了。此外,因为这是 DBaaS,所以客户不需要雇用更多的人来维护它。
客户还希望自动化这个 MySQL 数据库的 ETL 过程。虽然我认为数据工厂将是理想的解决方案,但成本可能是一个大问题,因为 ETL 必须每 5 分钟进行一次,这将过于频繁地触发业务流程,并导致“休克”账单。因此,我建议使用 Azure Functions,它是一个无服务器的计算解决方案来完成这个 ETL。另一个原因是数据转换并不太复杂,一旦完成就很少会改变。
然而,当我使用 python 实现这个 Azure 函数来连接 Azure MySQL 服务器时,我遇到了一个问题。也就是说,MySQL 实施了 SSL 加密,但是 Azure 函数端不提供证书。在我们的案例中,禁用 SSL 实施不是一个选项,因为我们不想将客户的数据置于诸如中间人攻击这样的危险境地。因此,我需要解决这个问题,最后,我做到了。以下是重现问题的步骤和解决方法。
步骤 1:为 MySQL 创建 Azure 数据库
进入你的 Azure 订阅,点击创建资源 - >搜索 MySQL 的 Azure 数据库 - >创建
在创建 MySQL 服务器页面中,填写资源组、服务器名称和其他必填字段。在这个例子中,我选择 MySQL v8.0,然后点击审核+创建->-创建
为了能够在本地机器上测试你的 Azure 功能。不要忘记将您的本地 IP 地址添加到连接安全设置中。具体来说,转到我们刚刚创建的 Azure MySQL。在左侧导航的Settings
部分选择Connection security
。然后在右主视图上点击+ Add client IP
按钮。这将自动将您当前的 IP 地址添加到白名单中。然后,点击Save
。
步骤 2:创建 Azure 函数
为了开发的简单性,我更喜欢用 VS 代码创建 Azure 函数。您需要为 VS 代码安装 Azure Functions 扩展。完成后,你应该可以在左侧看到额外的 Azure 按钮。单击按钮并按照说明登录到您的 Azure 帐户。
在 Mac 上按cmd+shit+p
或在 Windows 上按ctrl+shift+p
调用命令面板,然后选择Create New Project
在这个例子中,我将使用 python 作为开发语言。
然后,选择 HTTP 触发器,因为它更易于测试。
然后,完成说明的其余步骤。
第三步:为 Python 安装mysql-connector
在你的 VS 代码终端,使用pip
安装 Python 的mysql-connector
库。
$ pip install mysql-connector
此外,不要忘记将依赖项添加到requirements.txt
,因为 Azure 函数依赖于这个文件来为你的应用安装 Python 依赖项。
步骤 4:编写 Python 代码来连接 MySQL 服务器
转到您刚刚创建的 MySQL 的 Azure 数据库。记下服务器名称和登录名。
代码只是连接到 MySQL 服务器并显示所有的数据库。
import logging
import azure.functions as funcimport mysql.connectordef main(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.') # Connect to MySQL
cnx = mysql.connector.connect(
user="ctao@mysql80-test-chris",
password='<your_password>',
host="mysql80-test-chris.mysql.database.azure.com",
port=3306
)
logging.info(cnx) # Show databases
cursor = cnx.cursor()
cursor.execute("SHOW DATABASES")
result_list = cursor.fetchall()
# Build result response text
result_str_list = []
for row in result_list:
row_str = ', '.join([str(v) for v in row])
result_str_list.append(row_str)
result_str = '\n'.join(result_str_list) return func.HttpResponse(
result_str,
status_code=200
)
步骤 5:运行 Azure 函数(重现问题)
您可以部署 Azure 函数以在生产环境中测试它,或者在 VS 代码终端中运行以下命令以在本地测试它。
$ func start run
Azure 函数运行后,访问 URL 以尝试获取数据库列表。
如果在本地运行,URL 应该如下所示
不出所料,你的浏览器会报错 HTTP 错误 500。如果您返回到 VS 代码终端,您会在控制台中看到一些错误消息。这个问题的关键在图像中突出显示
异常:编程错误:9002 (28000):需要 SSL 连接。请指定 SSL 选项,然后重试。
步骤 6:添加证书文件并在 Python 中正确使用它
老实说,这个问题困扰了我一段时间,但我最终解决了它。
首先,获取证书文件并不困难。你可以从微软 Azure 官方文档网站下载,在这个页面。我会把下载链接直接贴在这里:
https://www . digicert . com/CACerts/baltimorecybertrustrust root . CRT . PEM
用 Python 引用也不难。通常,您可以使用任一相对路径:
crtpath = '../BaltimoreCyberTrustRoot.crt.pem'
或绝对路径:
crtpath = '/User/.../BaltimoreCyberTrustRoot.crt.pem'
然后,只需将path
变量放入connect
函数中:
# Connect to MySQL
cnx = mysql.connector.connect(
user="ctao@azure-mysql-test",
password='<your_password>',
host="azure-mysql-test.mysql.database.azure.com",
port=3306,
ssl_ca=crtpath
)
然而,在你部署 Azure 功能后不会工作。
这是因为 Azure Function 会自动将你的代码部署到实际后端服务器上/var
下的某个地方,而你根本没有访问这个服务器的权限。
在这种情况下,我们必须让 Python 找到证书文件的正确位置,这肯定是可行的。我们可以用__file__
。
让我们将证书文件放在项目的根路径中。因此,如果以后我们有更多的 Azure 功能,并希望重用这个证书文件,它可以确保我们可以以正确的方式引用它。
然后,编写一个函数来获取这个文件
import pathlibdef get_ssl_cert():
current_path = pathlib.Path(__file__).parent.parent
return str(current_path / 'BaltimoreCyberTrustRoot.crt.pem')
注意,第一个.parent
将返回 Azure 函数的根路径,我们需要另一个.parent
来确保它返回项目的根路径。这意味着,如果你喜欢把证书文件放在 Azure 函数的根路径中,你只需要一个.parent
。
之后,按如下方式更改连接代码:
cnx = mysql.connector.connect(
user="ctao@mysql80-test-chris",
password='<your_password>',
host="mysql80-test-chris.mysql.database.azure.com",
port=3306,
ssl_ca=get_ssl_cert()
)
现在就来试试吧!
再次访问网址,你将能够看到数据库列表!
这将在您的本地机器上和部署您的 Azure 功能后都有效。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@qiuyujx/membership)
如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和数以千计的其他作者!(点击上面的链接)
如何通过使用 Python 获得更多的 Google 搜索控制台数据
谷歌搜索控制台(之前的谷歌网站管理员工具)是谷歌提供的一项网络服务,帮助你监控和维护你的网站在谷歌搜索结果中的显示。它也是一个很好的工具,可以用来分析从谷歌到你的网站的有机搜索。
Google Search Console UI (credit to unsplash)
谷歌搜索控制台是伟大的,但它的数据只有过去 1 年零 4 个月。如果你想查看历史数据超过时期,可惜你不能!😦
幸运的是,Google 为我们提供了一个搜索控制台 API 来访问 Google 搜索控制台中的数据。使用这个 API,您可以访问您站点上的数据,并将它们存储在您的首选数据库中,用于分析或其他目的。
使用搜索控制台 API
在开始编码之前,您应该准备好您的搜索控制台 API。我以前写过一篇文章,介绍如何通过客户端 ID 访问您的 Google 服务。您应该能够获得包含密钥的 JSON 文件来访问您的 Google 搜索控制台。
我们大多数人肯定会使用谷歌提供的至少一项服务。自从我成为一名互联网数据分析师后…
medium.com](https://medium.com/@chingjunetao/simple-way-to-access-to-google-service-api-a22f4251bb52)
访问搜索控制台 API
入门指南
在本教程中,我们将使用 google-auth-oauthlib(一个 google 认证库)来访问 API。
pip install google-auth-oauthlib
您需要将https://www.yourwebsite.com/
更改为您自己的站点。对于OAUTH_SCOPE
,Google 搜索控制台 API 只有 2 个 OAuth 作用域。
建筑连接
第一次,您需要使用基于此 web 身份验证流程的 web 浏览器登录。之后,它会将您的凭证保存在 pickle 文件中。以后每次运行该脚本时,它都会使用存储在config/credentials.pickle
中的“腌制”凭证来建立与搜索控制台的连接。
提取数据
对于每个请求,数据数量有一个限制,即 25,000 行。如果数据超过 25,000 行,您必须将它们分成多个请求。
request = {
'startDate' : date,
'endDate' : date,
'dimensions' : ["query","page","country","device"], 'searchType': "Web",
'rowLimit' : maxRows,
'startRow' : i * maxRows
}
这是请求数据时必须发送的 JSON 格式的请求。在这种情况下,我想用查询的维度*(搜索关键字)*、页面、国家和设备提取我前面定义的日期的数据。搜索类型将是 Web only(也有图像和其他选项)。更多细节,可以参考文档。
获得数据后,您就可以开始工作了!你可以把它存放在任何地方。在我的例子中,出于分析目的,数据将存储在 BigQuery 中。
希望这篇文章能帮助你理解搜索控制台 API 以及如何使用它。
可以在我的 Github 中查看完整脚本。干杯!
如果你喜欢读这篇文章,你可能也会喜欢这些:
使用命令行参数创建自己的 Python 脚本的简单指南
towardsdatascience.com](/how-to-master-python-command-line-arguments-5d5ad4bcf985) [## 如何用 Python 设计你的数据框架
如何使用 Python 高亮显示、格式化或着色您的数据框
towardsdatascience.com](/how-to-style-your-dataframe-with-python-eabf376d1efd)
你可以在 Medium 上找到我其他作品的链接,关注我 这里 。感谢阅读!
对于分类任务来说,准确度是不够的
准确度、精确度和召回率之间的区别
Photo by Matthew Henry on Unsplash
在这个机器学习时代,我们已经看到了很多关于使用人工智能来分类图像是否包含小狗、进行垃圾邮件检测或训练自动驾驶汽车识别交通标志的宣传。正如拥有正确的模型很重要一样,更重要的是能够判断您的模型执行得如何,以便您可以选择最适合您的任务的模型。
在这篇文章中,我们将介绍:
- 分类任务的一般定义
- 准确性指标
- 精确度和召回率
- 混淆度量
- 精确-召回权衡
什么是分类?
假设你面前有一张上面的图片,任务是判断图片中是否包含一只狗。如果你回答正确,你得到一分。如果没有,你将什么也得不到。这就是通常所说的分类任务,您试图给给定的数据分配一个特定的标签。
这个分类任务在机器学习社区中非常流行,他们试图训练他们的模型,看看当前的算法是否可以完全区分对象。对于本文,我们不会关注使用哪种算法。相反,我们假设我们已经有了一个算法,我们想知道我们的算法执行得好不好?
准确(性)
一个简单的评估指标是准确性。假设你有 5 张图片,模型答对了 4 张,那么分数就是 0.8。因此,我们可以说准确度是全部图像中正确分类的图像的数量。这是简单而直观的,但这还不够。
Figure 1 — Images of dog and not-dog
准确性本身也有一些下降。让我们考虑下面的例子。假设我们的数据集有 5 张图片:4 张不是狗,1 张是狗。我们还有一个如下的算法:
def is_a_dog (x):
return False
上面的朴素算法假设所有东西都不是狗,而不对给定的数据做任何计算。需要注意的一点是,因为我们的数据集碰巧有 4 幅非狗的图像,所以这种简单算法的得分为 0.8。这不是我们想要的。
Figure 2 — Naive algorithm returns all False
精确度和召回率
应对这种情况的两个概念是精确和召回。下面我们来看看他们的简要说明。
- 精度:在所有“狗”的预测中,有多少是正确分类的?
- 回忆:在所有“狗”的数据中,有多少是正确分类的?
Figure 3 — Recall (looks only on data whose labels are dogs)
先说回忆。在我们的数据集中,只有一只狗,我们的算法将其归类为非狗。所以,回忆=0/1=0。
然而为了精确,在这些预测中,没有一个预测是狗。因此,精度=0/0。注意,在某些情况下,由于分母为 0,所以不可能进行精度除法;因此,在这种情况下,我们可以简单地假设 precision=0。
混淆矩阵
混淆矩阵将数据分为 4 类:真阳性、真阴性、假阳性和假阴性,如下图所示。
Figure 4 — Confusion Matrix
- 当数据具有标签“狗”并且预测具有相同的阳性标签时,为真阳性。
- 当数据的标签是“非狗”并且预测正确地具有相同的标签时,为真否定。
- 假阳性是当数据的标签是“非狗”但算法没有将其分类为“狗”时。
- 假阴性是当数据的标签是“狗”时,但算法说不是这样。
通常,当我们想要计算精确度和召回率时,使用混淆矩阵。计算方法与上一节描述的相同,但它使数字更容易阅读。对于这个例子,我们将看一个不同的例子,其中我们尝试对 10 幅图像进行分类。
Figure 5 — Example of 10 images. Label underneath the images are the prediction
Figure 6 — Confusion Matrix on 10 images
在这种情况下,精度是 4/(4+3)=0.57,而召回率是 4/(4+2)=0.66。
精确度或召回率
理想情况下,我们希望这两个值尽可能高。然而,这可能是不可能的。当我们提高召回率时,精确度会降低,反之亦然。因此,我们需要决定哪个对任务更重要。让我们仔细看看这种现象是如何发生的。
Figure 7 — PrecisionRecall Tradeoff
绿色框是正确分类的标签,黄色框是错误分类的标签。每个被错误分类的图像必须进入一个黄色的盒子:假阳性(精确)或假阴性(召回)。当然不可能两者兼而有之。
假设我们的模型肯定会有 5 个错误的标签,如果所有的错误分类都属于假阳性,那么我们将会有低精度和高召回率。然而,如果不正确的标签落入假阴性,我们反而会有高精度和低召回率。
Figure 8 — Examples of Precision-Recall Tradeoff
因此,当你训练你的机器学习模型时,你需要决定哪些指标更重要。例如,如果你被要求为金融机构建立一个模型,他们希望对借款人是否是一个好的候选人进行分类,你可能更喜欢你的模型不要鲁莽地提供贷款。因此,你宁愿把好人归类为坏人(假阴性),而不是把坏人归类为好人(假阳性)。
换句话说,假阴性(召回)比假阳性(精确)更好。
结论
所以,下一次当你面对一个分类任务时,确保不要只选择准确性作为度量,然后马上开始设计模型。当然,摆弄模型是令人兴奋的,但重要的是花一些时间来清楚地了解您正在处理什么样的问题,以及哪些指标最适合这项任务。一旦你解决了这个问题,你就可以确定你正在构建的模型是适合你的任务的。
关键外卖
就是这样。我们已经到了这篇文章的结尾。回顾一下我们刚刚讨论的内容,以下是这篇文章的一些要点:
- 对于分类任务来说,准确度是不够。我们需要看看其他一些指标,以确保我们的模型是可靠的。
- 精度:在所有说狗的预测中,有多少是正确分类的?
- 回想一下:在所有关于狗的数据中,有多少是正确分类的?
- 混淆矩阵有助于您更好地分析模型的性能。
参考
- https://en.wikipedia.org/wiki/Precision_and_recall
- https://machine learning mastery . com/classification-accuracy-is-not-whole-not-whole-performance-measures-you-can-use/
- https://medium . com/tech space-usict/measuring-just-accuracy-is-what-not-what-difficult-have-better-technique-is-required-e 7199 AC 36856
- https://towards data science . com/beyond-accuracy-precision-and-recall-3da 06 bea 9 f6c
数据科学中的准确性性能测量:混淆矩阵
简要介绍使用数据科学模型混淆矩阵评估绩效指标的各种方法
Photo by Eleonora Patricola on Unsplash
在之前的文章中,我已经简要解释了 k-NN 模型的复杂工作和陷阱,现在让我们先尝试简单地看看如何实现该模型并评估成人收入数据集,然后通过各种性能指标来分析准确性。
简单看一下 k-NN 算法,我们会发现该算法是一种分类算法,基本上是通过识别最近邻,然后将它们分类到不同的类中来执行的。它可用于二元或多类问题。
Photo by Alexander Mils on Unsplash
成人收入数据集
我们将尝试实现的模型是成人收入数据集。数据集可以在 Kaggle 或者我的 GitHub 仓库中找到。该数据集包含美国成年人的收入,是使用 k-NN 算法解决的最常见问题之一。在这里,收入最初是连续的,但通过使用 50,000 美元的过滤器,已经变成了二进制。收入高于 50,000 美元的给 1 分,收入低于 50,000 美元的给 0 分。该数据集还有 14 个其他预测因子。对数据集的最初几个简短观察显示了以下内容:
Result from head() on the dataset
从上面我们可以看到,数据集有重要的描述符,可以用来解释为什么一个人的收入会高于或低于 50,000 美元。我们还可以观察到收入水平的分布是相当偏斜的,即收入低于 50,000 美元的人比收入高于 50,000 美元的人多。
More incomes lesser than $50,000 than above it
在执行删除空值和缩放要素的必要数据操作后,我们得到最终的部分数据集:
Partial dataset after data cleaning has been performed
模型实现
既然已经清理了数据,我们可以在其上实现模型,然后继续通过各种度量来执行准确性。如前所述,k-NN 模型在不同的步骤中实现,这些步骤是:
Steps for conducting a k-NN analysis, source: Recent Trends in Big Data Using Hadoop
因此,让我们采用 scikit-learn 给出的默认邻居数量(k=5 ),并且让我们也采用基线条件,我们可以执行模型如下:
然后,我们可以使用各种可用的评估方法来评估模型的表现。
混淆矩阵
我们可用的最常见的度量类型是混淆矩阵,也称为置信矩阵。混淆矩阵是一个看起来像这样的矩阵:
Sample Confusion Matrix
从上面我们可以看到,混淆矩阵是实际值与预测值之间的矩阵。它通常用于分类目的,其中需要将目标预测为 1 或 0。当我们观察到实际值不存在时,我们给它 0,否则给 1。预测值也是如此。那么,这有什么重要的?
嗯,我们可以从这个矩阵中看出很多东西,比如:
我们的混淆矩阵看起来像:
Confusion Matrix for the Adult Income dataset
- **准确率:**这是分类器正确的比率,所以基本上取真正值和真负值之和,然后除以总和。这意味着总共有 14,653 个值,其中有 10,109 个真正值和 2045 个真负值。因此,我们的模型的精度将是(10109 + 2045)/14653 = 82.94%。可以说我们的模型有很好的准确性。它也被称为命中率,因为它是总命中率与所有值的度量。
- 误分类率(MISC) :顾名思义,这是值被误分类的比率。它也被称为缺失率,因为它是缺失值的计数。所以,如果我们用 100%减去准确率,就会得到误分类率。我们这里的杂项价值是 0.17 或 17%。这意味着在我们的情况下,我们可以说当错误分类率为 17%时,在数据集中的 100 个人中,有 17 个人被错误分类。
- Precision :这是衡量正面预测准确性的值的比率。所以当我们用真阳性除以总阳性,我们得到精度值。因此我们这里的精度是(2045)/(2045 + 1013) = 66.87%。这意味着,在我们的例子中,我们可以说,当精度为 66.81%时,预测收入超过 50,000 美元的 100 人中,有 67 人被正确分类。
- 回忆:这是测量被分类器正确识别的正面实例的值的比率。它也被称为敏感性,或真正的阳性率。因此,召回率是(真阳性)/(真阳性+假阴性),或者在我们的例子中是 2045/(2045 + 1486) = 57.91%。这意味着,在我们的例子中,我们可以说,当召回率为 57.91%时,在 100 个收入超过 50,000 美元的人中,有 57.91 人或 58 人被正确分类。
- 特异性:这是测量被分类器正确识别的阴性实例的值的比率。它也被称为真实负利率。特异性则是,(真阴性)/(真阴性+假阳性)或在我们的情况下,10109/(10109 + 1013)或 90.89%。这意味着在我们的案例中,我们可以以 90.89%的特异性说,在 100 个收入不超过 50,000 美元的人中,90.89 或 91 人被正确分类。
- F-1 分数:它是精确度和召回率的调和平均值。正常平均值对所有值给予同等的优先权,而 F-1 分数对低值给予更大的权重。F-1 的分数基本上是这样的:
F-1 Score
在我们的例子中,F-1 分数为:
Precision, Recall and F1- Score values for 1 and 0 respectively
- 受试者工作特征和曲线下面积:受试者工作特征曲线,也称为 ROC 曲线,基本上是真阳性率对假阳性率的曲线图。假阳性率是被错误分类的阴性实例的比率。也可以定义为 1-真阴性率,这也是特异性。因此,该曲线也可以被认为是灵敏度和 1-特异性之间的曲线。在 Python 中,可以使用 scikit-learn 或 matplotlib 库来实现。曲线下的面积也是这里的另一个重要指标。它越接近 1,分类执行得越好。我们案例的曲线如下所示:
Code to draw the ROC Curve, Source: Hands-on ML by Aurelien Geron
ROC Curve and the AUC at bottom
- 累积精度曲线:该曲线类似于 ROC 曲线,但它是一个精度图。它基本上描绘了准确性,并有助于理解和总结模型的稳健性。
制作曲线的代码:
Code for drawing the CAP Curve
CAP Curve
如上所述,重要的是要注意,您可以使用大量其他信息来确保您的模型具有所需的准确性和性能。这些包括变异系数、均方根误差等,但本文仅针对混淆矩阵。
用一杯水解释准确度、精确度和召回指标
准确率、精度和召回率是衡量机器学习分类案例中模型性能的三个基本分数。准确性是一个相当容易理解的概念:取所有正确的预测的总和,然后除以预测总数,正确的和错误的。自然,如果没有错误的预测,正确的预测除以正确的预测会得到 1。完美的准确性!
如果数据不平衡,就会出现问题,这是分类问题的常见情况。假设你有一个关于信用卡交易的数据库,其中 95%的交易是好的,5%是欺诈性的。你设计了一个模型,它能正确预测所有 95%的合法交易,但没有一个是坏交易。根据该公式,该模型将具有 95%的准确性水平,这是一个非常不错的结果。不幸的是,这并不能证明你的模型足够好,因为它没有发现任何欺诈行为。在那些数据明显不平衡的分类情况下,准确度分数可能会产生误导。
这就是精确度和回忆分数介入的地方。精确度和召回率公式如下:
虽然公式中的变量应该不会引起任何问题,但在开始时,精确度和召回背后的思想可能更难理解。为每个类分别测量精度和召回率也没有帮助。但是让我用下面的比喻来解释给你听。
想象你有一杯水。 Precision 将显示水中有多少污垢,即有多少不应该存在的物质。就这么简单——精确度是关于玻璃杯中水的纯度以及有多少外来物质。水越清澈,精确度分数就越高。如果你的模型声称某样东西是水,但它不是,这将降低精度分数。
回忆是完全不同的故事。这不是纯度的问题,而是数量的问题。想象你要了一杯水。他们已经把它带给你,但是它不是满的。问题是杯子里应该有多少水,但实际上没有,也就是说,有多少水溢出来了——这就是召回的衡量标准。回忆越高,水在流向你的途中流失越少。如果 recall 等于 1,这意味着玻璃杯是满的——您的模型已经正确预测了某个特定类的所有记录,没有遗漏任何东西,没有遗漏任何东西。
总结一下:
Precision 测量你的模型将多少灰尘带入一杯水中。回忆测量你的模型洒了多少水。就这么简单!
准确度、召回率、精确度、F 值和特异性,哪一个需要优化?
根据您的项目,哪个绩效指标需要改进?
我将使用一个基本示例来解释上的每个性能指标,以便让您真正理解它们之间的差异。以便在您下一个 ML 项目中,您可以选择最适合您的项目的性能度量标准。
我们开始吧
一所学校正在对所有学生进行机器学习初级糖尿病扫描。
输出要么是糖尿病患者 (+ve),要么是健康者 (-ve)。
任何学生 X 最终可能只有 4 种情况。我们稍后将使用以下内容作为参考,所以如果你感到困惑,请不要犹豫重读一遍。
- 真阳性( TP ):预测为+ve,X 为糖尿病,我们想要那个
- 真阴性( TN ):预测是-ve,X 是健康的,我们也希望如此
- 假阳性( FP ):预测为+ve,X 健康,虚警,不良
- 假阴性( FN ):预测为-ve,X 为糖尿病,最差
要记住这一点,有两个窍门
-如果以 真开始,那么无论是否患有糖尿病,预测都是正确的,所以真阳性是正确预测的糖尿病人&真阴性是正确预测的健康人。
相反,如果以假开始,则预测是不正确的,因此假阳性是健康人被错误地预测为糖尿病(+) &假阴性是糖尿病人被错误地预测为健康(-)。
- 正或负表示我们程序的输出。而真或假则判断该输出是否正确。
在我继续之前,真正的积极&真正的消极总是好的。我们喜欢真实这个词带来的新闻。留下了假阳性和假阴性。在我们的例子中,误报只是一个错误的警报。在第二次更详细的扫描中,它将被纠正。但是一个错误的负面标签,这意味着他们认为他们是健康的,而实际上他们并不健康,在我们的问题中,这是 4 种情况中最糟糕的一种。
是 FP & FN 一样差还是其中一个比另一个更差取决于你的问题。这条信息对您选择性能指标有很大的影响,所以在您继续之前请考虑一下。
选择哪种性能指标?
准确(性)
它是正确标记的主题与整个主题库的比率。
准确是最直观的一个。
准确性回答以下问题:我们在所有学生中正确标记了多少学生?
准确度=(TP+TN)/(TP+FP+FN+TN) 分子:所有正确标注的被试(全部为真)
分母:所有被试
精确
精度是我们的程序正确标记的**+ve 与所有标记的+ve 之比。Precision 回答了以下问题:那些被我们贴上糖尿病标签的人中有多少人实际上是糖尿病患者?
精度= TP/(TP+FP) 分子:+ve 标注糖尿病人。
分母:所有被我们的计划标记为+ve 的人(无论他们实际上是否患有糖尿病)。**
回忆(又名敏感度)
召回率是我们的程序正确标记的+ve 与现实中所有糖尿病患者的比率。回忆回答了以下问题:在所有的糖尿病患者中,我们能正确预测的有多少?
回忆= TP/(TP+FN) 分子:+ve 标注糖尿病人。
分母:所有糖尿病患者(无论是否被我们的计划检测到)
F1 分数(又名 F 分数/ F 度量)
F1 评分同时考虑了准确率和召回率。
它是精度和召回率的调和平均值。 如果在系统中的精度§ &召回®之间存在某种平衡,F1 得分最好。相反,如果一个指标的提高是以牺牲另一个为代价的,那么 F1 值就不会那么高。
比如如果 P 为 1 & R 为 0,F1 得分为 0。
【F1 得分= 2(回忆精度)/(回忆+精度)**
特征
特异性是程序给现实中所有健康的人贴上的正确标签。特异性回答了以下问题:在所有健康的人中,我们正确预测了多少?
特异性= TN/(TN+FP) 分子:-ve 标记健康人。
分母:现实中所有健康的人(无论是+ve 还是-ve 标注的)
一般注意事项
是的,准确性是一个很好的衡量标准,但只有当您拥有对称数据集时(假阴性&假阳性计数接近),而且,假阴性&假阳性的成本也差不多。如果误报和漏报的代价不同,那么 F1 就是你的救星。如果你的职业分布不均匀,F1 是最好的选择。****
精确是你有多确定你真正的阳性,而回忆是你有多确定你没有遗漏任何阳性。
如果假阳性的想法远远好于假阴性,选择召回,换句话说,如果假阴性的出现是不可接受的/不可容忍的,那你宁愿得到一些额外的假阳性(假警报)也不愿保存一些假阴性,就像我们的糖尿病例子一样。
你宁愿让一些健康的人被贴上糖尿病的标签,也不愿让一个糖尿病人被贴上健康的标签。
如果你想对自己的真实想法更有信心,请选择 precision。比如垃圾邮件。你宁愿在你的收件箱里有一些垃圾邮件,而不是一些普通的邮件。因此,电子邮件公司想要额外确定电子邮件 Y 是垃圾邮件,然后才把它放入垃圾邮件箱,这样你就再也看不到它了。
如果您想要覆盖所有真阴性,选择特异性,这意味着您不想要任何假警报,您不想要任何假阳性。例如,你正在进行一项毒品测试,所有测试呈阳性的人将立即入狱,你不希望任何没有吸毒的人入狱。这里的假阳性是不能容忍的。
底线是
—准确度值为 90%意味着每 10 个标签中有 1 个不正确,9 个正确。
—精度值为 80%意味着平均而言,我们计划标记的每 10 名糖尿病学生中有 2 名是健康的,8 名是糖尿病患者。
—召回值为 70%意味着现实中每 10 名糖尿病患者中有 3 人被我们的计划遗漏,7 人被标记为糖尿病患者。
—特异性值为 60%意味着现实中每 10 个健康人中有 4 个被误标记为糖尿病,6 个被正确标记为健康。
混淆矩阵
维基百科会比我解释的更好
在机器学习领域,特别是统计分类问题中,混淆矩阵,也称为误差矩阵,是一种特定的表格布局,它允许算法性能的可视化,通常是监督学习算法(在非监督学习中,它通常被称为匹配矩阵)。矩阵的每一行代表预测类中的实例,而每一列代表实际类中的实例(反之亦然)。该名称源于这样一个事实,即它可以很容易地看出系统是否混淆了两个类(即通常将一个类误标为另一个类)。
from **sklearn.metrics** import confusion_matrix>>>tn, fp, fn, tp = confusion_matrix([0, 1, 0, 1],
[1, 1, 1, 0]).ravel()
# true negatives, false positives, false negatives, true positives
>>>(tn, fp, fn, tp)
(0, 2, 1, 1)
基于服务的组织中的 Ace 深度学习
From: https://newsroom.cisco.com/feature-content?type=webcontent&articleId=1895218
让我们以一句激励人心的名言开始:
从现在到 2030 年,it(深度学习)将创造约 13 万亿美元的 GDP 增长。—吴恩达
当前情景
每个科技巨头;无论是 Alphabet、脸书、微软;将数据科学视为统治市场的关键。
像*“你要么为谷歌工作,要么与之竞争”*这样的笑话,现在听起来就像噩梦。
随着科技巨头们开源他们频繁更新的研究。因此,几乎所有其他初创公司都能够在此基础上创建自己的深度学习解决方案。
这些创业公司由于烧钱率低,能够以低得多的费率提供深度学习解决方案。
注意:从今以后,我将交替使用深度学习和数据科学。
以下是我对基于服务的组织(SBO)如何在这种环境中竞争和取胜的两点看法
MVP 超过 POC
大多数服务型公司都对“产品”这个词感到恐惧。因此,基于服务的公司开发了 POC。
让我们先了解什么是什么:
产品是制造或提炼用于销售的物品或物质。
概念验证(POC) 是最终产品的缩影,具有一些工作特征,旨在验证某些概念是否具有实用潜力。
最小可行产品(MVP) 是一种开发技术,在这种技术中,新产品或网站的开发具有足够的特性来满足早期采用者。
不是一家基于产品的公司并不是以概念验证的名义创建半成品解决方案的借口。
记住 的底线永远是创造人们想要的 。POC 关注一些工作特性,而 MVP 强调这样一个事实,即 一些工作特性是无用的,除非它们令客户 满意。
通常,主要在深度学习中,解决方案的工作在其最终结果周围有这种不确定性。这使得客户对投资建议的解决方案感到紧张。
你会反复遇到一些客户,他们在接触你的公司之前已经有过一些不好的经历。坦率地说,向他们展示他们难以理解的东西,尤其是当他们已经感到沮丧的时候,是愚蠢的。
受控演示或命令行演示;不会让客户对工作更满意。
客户需要一个直观的交互式界面;他可以玩的东西;满足他的好奇心,从而克服不情愿。
数据高效系统
客户需求大多过于特定于一个利基领域。因此,无法获得大量高质量的数据集。
基于客户的公司通常在同一个客户下做多个项目。他们的资源更多地分布在不同的任务甚至专业技能上。
还有,
依赖客户获取数据,尤其是 POC/POV/MVP,是注定要失败的。
为了避免这一点,公司最初在一个相当大但不相关(与客户的实际要求无关)的数据集上展示演示,结果非常好。这是一个灾难性的前兆,导致承诺过多但落实不足。
由于“小”高质量数据集很容易找到,甚至很容易构建,因此能够在小数据集上产生令人满意结果的数据高效系统更有意义。
确切的客户要求
将资源分散分配给多个客户使得基于服务的公司能够深入了解单个客户的需求。
这使得基于服务的公司可以根据客户的确切需求定制*(修改,而不是构建)*解决方案。
注意:这并没有减少项目的范围,只是扩大了范围以包括客户的额外要求。
这使得基于服务的公司可以在需要时脱离学术界的 SOTA(最先进的)意识形态 (iff 和)并简单地**定制(同样,不是构建)一个为特定客户或特定类型的客户工作的系统。
领域专业知识
基于服务的公司通常雇佣领域专家,他们为不同的客户从事相同领域的不同项目。
他们独特而扎实的专业知识导致了 以最小的风险保证质量的可交付性 。这种保证是大客户最看重的,尤其是银行和贸易公司。
现成的解决方案
在数据科学中,开发解决方案已经成为一种标准做法,这种解决方案需要在使用系统之前在客户端进行手动培训。
这是一种简单但无效的方式来规避开发数据高效的解决方案,因为:
数据科学项目通常是客户端非技术团队(财务团队或业务团队)的必需品。
对于这些非技术团队的人员来说,这种解决方案的培训通常过于繁琐。
因此,客户通常会分配一组“技术人员”来培训这些解决方案。
因此,即使在客户看到系统的一瞥之前,他也必须等待:
- 对其技术人员进行用例教育
- 对其技术人员进行技术教育
- 其技术人员对系统的培训
另一方面, 开箱解决方案 是可以直接使用 的系统,无需任何前期培训 。
因此,客户不费吹灰之力就有了实质性的东西。
这为客户提供了对服务型公司能力的早期保证和信心。
灵活的架构
尽管解决方案应该根据客户的要求量身定制,但这并不意味着 开发“使用并丢弃”的解决方案 。
避免开发范围过窄而无法满足未来需求的解决方案。
开发一个几乎不能修改的不可变的黑盒解决方案,通常会导致与客户的冲突和混乱的修补工作。
进入微服务架构。
微服务是一种架构风格,它定义了一个项目,一组服务,它们是:
- 高度可维护和可测试
- 松散耦合
- 可独立部署
这种架构确保 客户端可以根据其满意度 ,通过应用不同的排列、省略或添加服务来改变解决方案的工作。
中央集权的 R&D
以服务为基础的公司通常害怕为 非客户特定的 R & D 分配“充足的”单独资金。
通常,在开发特定于客户端的深度学习解决方案时,R&D 的范围仅限于客户端的“当前”需求,而不是该客户端的领域。
来自同一个领域(NLP、计算机视觉等)的深度学习项目可能在管道、学习者、预处理步骤等方面有大量重叠。
在没有一个集中的团队的情况下,将会有很多多余的努力。
集中式团队的存在是确保特定于客户的团队有一个现有的解决方案来改进,而不是每次都构建一个新的解决方案的关键。
教育合作
当面对独特的非传统客户需求或保持有效的 R &D;体验时,扮演着至关重要的角色。
比方说,你想设计一个在 20 个例子中运行良好的槽标记器。
可行的架构之一是:
基于散射小波和傅里叶变换的注意力增强双向门控卷积网络
这个架构,在任何教程和博客上都找不到。
这种架构并不是一个显而易见的选择,直到你研究了信息论、信号处理和深度学习相当一段时间。通常不可行的时间量。
教授们有几十年的经验,凭借这些经验,他们获得了某一特定领域的大量知识。他们发现和解决/规避问题的能力是无与伦比的。
标杆管理
每个人都对将黑盒解决方案推向生产持怀疑态度。
没有人能够预测一个神经网络的行为,特别是在不同的场景下。
广泛的基准测试确保从开发人员到客户的每个人都知道不同场景下给定解决方案的功能,以及这些功能的限制。
耐心
深度学习最简单的形式是一些随机数收敛到某个配置,在那里它们开始学习输入和输出之间的关系。
与传统软件解决方案不同,一个人最多可以 预感到什么可能有效,什么可能无效 。
因此,创建健壮的解决方案可能比开始时预期的要花费更多的时间和精力。
绝对不应该宣布或期待一个严格的时间表。
利益相关者应该在他们的战线上保持一个缓冲区,以包含延迟。
特别感谢 Deepak Saini & Mayank Saini。
干杯!
赢得数据分析面试
有志成为数据专业人士的指南
我在谷歌、Visa 等公司担任数据分析师/科学家的面试经历
Source (unsplash)
面试——我在谷歌的故事
我于 2019 年 5 月 23 日上午 10 点来到谷歌办公室,我记得我惊讶于这里的办公室有多么大和酷。在每一个角落,都有一个微型厨房和有趣的娱乐主题,这些主题在视频博客上出现过很多次。我一直等到面试官上来。他介绍自己是招聘经理,我们找到了一个房间,里面有一个有趣的形状奇怪的白板和高高的木头桌子。
面试进行得非常顺利——就像和一个朋友的对话,对自己和面试官有了更多的了解。虽然有一些棘手的技术和编码问题,但这个过程很有趣,值得庆幸的是,充满了微笑。
一旦我通过了技术和招聘经理的面试,我就被安排去面试大人物:高级主管和全球主管。我尽可能地微笑着,自信地阐述我对多个行为和假设问题的想法。
几个月后,我收到了邀请,并在第二周接受了邀请。我很高兴终于可以称自己为谷歌的数据分析师(机器学习)。
这就是我在最近一次求职面试中经历的过程,同样,其他大数据公司也是如此。
目的:我给有抱负的数据分析师/科学家的建议
在这篇博客中,我将告诉你如何在大公司的数据分析师/科学家面试中胜出,如谷歌、Gojek、Visa、银行等。我创建这个博客是为了回答我的下级反复提出的关于如何在大公司艰难的数据面试中胜出的问题。
作为免责声明,由于博客政策的原因,我不会揭露具体公司的具体问题。但是我会尽我所能,这样你仍然可以从我的经历中学习。如果你想更具体地了解谷歌如何招聘,有一本由拉兹洛·博克写的好书。
在大多数面试中,你会遇到三种类型的面试问题:技术型、行为型和假设型。
技术问题
Technical interview went wrong 😃
这通常是第一轮或第二轮,以确保你能在面试招聘经理和他们的主管之前满足技术专长的基本要求
结构化查询语言
您将看到由日期、字符串和数字组成的表格。在此基础上,您需要使用 SQL 语言找到年的总数,或某些类别(如年龄范围或地点等)。
为了解决这些问题,我建议你:
- 问一些假设:某个数据点对于同一个值是否可以有不同的表示。例如,区分大小写不同的“Street”和“St”。这将有助于您在 SQL 中执行过滤,例如 like 或 exact words。
- **考虑极限情况:**数值数据是否已经是纯数值格式,没有任何歧义或缺少值,比如-1 表示缺少的数字。’
- **大声思考:**从用图表表示你的答案开始,在白板上写下你的解决方案,然后大声思考,以确保你的思路清晰地展示出来。一旦你得到面试官的确认,用你喜欢的语言写出解决方案。在这种情况下,我总是鼓励使用 python,因为作为一种脚本语言,它的语法要短得多,并且留给 bug 的空间也更少(比如 Java 中缺少分号)
最有可能的是,您还会收到一些关于连接表的问题(内连接、外连接),了解聚合及其过滤器( group by 和 having )。请参考下图。
SQL Joins and their respective codes (source)
此时,如果你忘记了语法,请对面试官诚实。写下你知道的一切,然后继续前进。很有可能你的面试官会知道,尽管你对 SQL 连接有透彻的理解,但你总是可以谷歌一下语法。如果你犯了错误,不要让他们阻止你。忘记它,微笑,继续前进。
编码问题
你的面试官会接着问一些编码问题。这可以是任何事情,比如你如何排序一个二维数组,甚至你如何在字符串中搜索特定的模式,或者甚至使用 Pandas 和 Python 聚合数据。
同样,要回答这个问题,我们需要从以下几点开始:
- **给出假设,找到你的测试用例:**这是你自己安排测试用例的机会。如果列表有重复或未排序的数据,它会返回什么?如果列表是空的,它会返回什么?如果用户传递空值,会发生什么呢?
- 给出多个答案:大多数时候,你应该能想到蛮力方法,你会逐个迭代列表元素。或者,您可以设计一个更有效的排序算法(合并排序等)和迭代。
- 编码前确认您的答案:确保向面试官确认您的答案,只有在获得批准后才开始编码。征求他们的反馈,修正你的算法。此外,要注意可能出现越界问题的栅栏和柱子问题。最后,用你的测试用例测试你的代码。
参考
总的来说,我发现 CS Dojo 和 Devpost 有助于在技术面试中胜出。请检查一下。
行为问题
Behavioral Questions to know more about your experiences
面试官想知道你最大的成就以及你是如何解决问题和冲突的。
问题 1
你以前做过哪些数据项目?
这是你大放异彩的机会。作为一名有抱负的数据分析师/科学家,你们大多数人都应该有一些投资组合可以夸耀。如果您有 Github 项目,部署并展示您构建的一些应用程序。如果你像我一样在媒体上写博客,展示你最受欢迎的项目,展示你的高访问量。无论你有什么项目,集中精力给出展示你的技能和自信的指标。
让我给你举个例子
“在 Visa,我曾为客户(收购方和发行方)提取客户关键报告。这些是作为授权流程的一部分进行管理的关键信息,Visa 必须确保安全的交易渠道。因此,用户现在可以通过自己的门户生成报告,节省了 43%的时间。我还提到了我在 Lazada 的项目,该项目使用聚类和功能工程来发现重要的销售人员功能,然后将它们与我如何为该角色做出贡献联系起来。”
确保你能突出你的项目,并说明它与你申请的工作有什么关系。
假设性问题
Hypothetical questions summarized
面试官会用这些问题来了解你对你申请的职位的反应或想法。你的目标是以结构化和理性的方式引导面试官完成你的关键行动。
问题 1
如果我们在<产品>上发现一些漏洞,但产品经理或更高级别的领导否认。你会有什么反应?
这是一个棘手的问题,但公司希望看到你如何处理棘手的情况,并能够执行“正确的路径”,而不是“简单的路径”。
这些是你应该问的几个问题:
- 为什么 PM 拒绝我们的调查结果,有什么特别的原因吗?
- **我们团队和产品经理有哪些共同利益?**其中的共同利益可能是用户体验或安全性。
一旦你知道了问题所在,你就可以通过使用数据驱动的决策来论证你的发现。
- 首先,你需要找出影响的规模,并用它创建一些可视化。例如,您可以进一步用条形图或地理位置图来显示漏洞的位置以及受影响的用户数量。
- 第二,你可以从客户支持中找到定性的反馈。你需要和客户经理谈谈,看看有哪些常见的用户痛点。然后,您可以将此与主要关注点联系起来,即用户体验。
- 最后,向产品经理推荐重点行动。这必须是在产品经理的权限范围内能够相对快速完成的事情。例如,产品经理应该使用增强的 API 来检测和解决漏洞。
通过用问题和有条理的回答突出你的想法,你会给面试官留下深刻印象。
问题 2
你会如何为设计机器学习模型?
在这种情况下,您需要测试自己对某项任务建模的理解。通常,在这种情况下,您可以:
- 从探索性数据分析(EDA)开始:你可以建议先将某个问题可视化。比方说,如果在午餐时间产品流量增加,你会想制定一个假设来解释为什么会发生这种情况,并测试它们。
- **用解释性的&简单模型寻找信号:**在数据管道的早期阶段,获得洞察力比获得准确性更重要。这意味着您应该使用更简单的模型从观察中得出一些见解,并了解哪些特性最能驱动因变量/指标。我建议对分类模型使用决策树和逻辑回归,对回归模型使用简单线性回归。这些模型让你可以将信息增益和重要系数可视化,以启动你的洞察力。
- **强调具体的模型学习:**一旦你通过 EDA 和简单模型强调了可能的见解,那么你就可以建议一种更专业的技术。在文本分析问题中,我建议你使用主题建模 LDA(潜在狄利克雷分配)来寻找主题聚类。对于需要高精度分类的问题,您可以考虑集合模型,例如 Random Forest 和 XGBoost。一个警告是要确保你深刻理解其中的一些模型。
- 坦诚继续:如果你对某个话题不熟悉,就坦诚说“我不知道”就好。数据科学是一个快速发展的学科,不可能有人指望你 100%精通。因此,承认自己的缺点,继续前进。
赢得面试的最后提示
准备,准备,准备
我能玩得开心的一个主要原因是我做了准备。我经历了许多不同的准备问题,并不断打扰我的朋友和女朋友来听我的推销。他们给了我很多反馈,我可以很高兴地反映给招聘经理。同样的,你也要尽可能的花时间去准备。
面试是一个双向对话,带有一点销售技巧
到最后,你的面试官是你的朋友。放轻松,直言不讳。多听,好好玩。我很开心,因为我可以分享我的主要职业经历。从我与招聘经理的交谈中,我了解到的角色比他们从你那里学到的更多,这是一种非常令人满意的感觉。
希望、祈祷和享受
面试结束后,花 5 分钟思考一下这个过程。记下哪些进展顺利,哪些出了问题。如果你像我一样是一个信徒,为这些有价值的经历祈祷和感谢。无论接下来发生什么,你都能够将你的抱负和技能带入下一个层次。到目前为止,我已经被谷歌拒绝了 3 次,只有在上帝的恩典下,我才最终被接受。我很开心,也很感激。
总的来说,我真诚地希望我的这次经历能帮助你在数据分析工作面试中胜出。一切顺利,愿上帝保佑你。
最后…
Source: Unsplash.
我真的希望这是一本很棒的读物,是你发展和创新的灵感来源。
请在下面评论以获得建议和反馈。就像你一样,我也在学习如何成为一名更好的数据科学家和工程师。请帮助我改进,以便我可以在后续的文章发布中更好地帮助您。
谢谢大家,编码快乐:)
关于作者
Vincent Tatan 是一名数据和技术爱好者,拥有在 Google LLC、Visa Inc .和 Lazada 实施微服务架构、商业智能和分析管道项目的相关工作经验。
Vincent 是土生土长的印度尼西亚人,在解决问题方面成绩斐然,擅长全栈开发、数据分析和战略规划。
他一直积极咨询 SMU BI & Analytics Club,指导来自不同背景的有抱负的数据科学家和工程师,并为企业开发他们的产品开放他的专业知识。
文森特还在 best top 上开设了他的一对一导师服务,指导你如何在谷歌、Visa 或其他大型科技公司获得你梦想中的数据分析师/工程师职位。 如果你正在寻找良师益友,请在这里预约他 。
最后,请通过 LinkedIn ,Medium或 Youtube 频道 联系文森特
在 10 天内获得您的首个 AWS 认证
帮助您准备 AWS 认证云从业者考试的学习计划
Photo by Felipe Furtado on Unsplash
我和你们大多数人一样,使用开源数据科学工具,编写机器学习代码。但我很少想过如何将它付诸实施。启动集群、数据库和设计容错数据管道令人生畏。随着时间的推移,我意识到这些事情并不像我想象的那么难。当我在 7 月份通过 AWS 认证云从业者(AWS CCP)考试时,我了解到云服务提供商如何使数据管道比以往任何时候都更容易。
我想分享一下我是如何在 两周 准备并通过这个考试的,没有显著的云经验。
AWS CCP 是最受欢迎的,也是所有 AWS 认证考试中最简单的。有几个在线资源和学习指南。我已经列出了我认为最有用的。如果你只遵循这个考试指南,我保证你会通过考试。
这个考试是关于什么的?
官方考试指南说-
AWS 认证云从业者考试面向具备有效展示对 AWS 云的整体理解所必需的知识和技能的个人,独立于特定的技术角色
Photo by Chris Liverani on Unsplash
对于任何想要利用甚至了解托管云服务的人来说,该认证是一个很好的开端。如果您不确定哪个云平台最适合您的使用案例,我强烈建议您参加这个考试,因为所有云提供商都有非常相似的基础架构,而 AWS 是使用最广泛的云服务。
我在 2019 年 7 月参加了 AWS 认证云从业者考试,大概准备了十天,3–4 天做计划。由于网上资源和备考指南太多,很容易让人不知所措。所以,我把最好的指导方针、博客文章和技术资源都列在这里,帮助你制定一个坚实的学习计划。
研究计划的结构
作为第一步,我探索了许多可用的资源。我把这里最有用的资源列成了三个部分-
- 第 1 部分:了解考试模式和目标
- 第二部分:如何准备
- 第 3 部分:练习题和样题的链接
如果你完成了所有这些,你将会为 AWS CCP 考试做好更多的准备。如果你准确地掌握了你应该知道的东西,你将能够区分在这个阶段什么是相关的,什么是不相关的。
学习计划
Photo by Alvaro Reyes on Unsplash
按顺序浏览一遍。从理解考试、考试目标和一些样题开始(第 1 部分)。之后,开始准备(第二部分),最后测试你的知识(第三部分)。
第一节。了解考试模式和目标
以下是理解考试模式和考试目标的最佳资源。这些将有助于你区分哪些是你应该知道的,哪些是考试范围之外的。
2.Jeanne Boyarsky 对备考的建议,考试当天的预期,有助于对考试有一个更清晰的了解。Jeanne 是一名出色的开发人员,也是 Java 的拥护者。
3.在这个由 Steep Technologies 制作的视频中,Jose 分享了他的备考经历
https://www.youtube.com/watch?v=DkE4lKNC7uw
到这个时候,你应该对考试是什么样的有一个很好的想法,你需要知道什么才能在文本中做得好。
第二节。如何准备
1.如何通过 AWS 云从业者考试—学什么 Peter Fessel
https://www.youtube.com/watch?v=KFhXKlX6p-o
在这段 34 分钟的视频中,Peter 涵盖了测试中的所有主题。我建议列出所有这些话题。
2.云大师的 AWS CCP 课程
https://acloud.guru/learn/aws-certified-cloud-practitioner
注册一个免费的 AWS 帐户,设置警报,部署一个 S3 桶,并启动一个 EC2 实例。如果你以前从未这样做过,观察别人这样做并跟着做是很有用的。这门课程内容详尽。有时候 Ryan 会潜得比需要的更深。如果你现在对考试范围之外的内容不感兴趣,2.1 中的列表将有助于确定本课程中哪些主题现在不重要。
3.白皮书
我强烈推荐这四份官方 AWS 白皮书。我把它们按重要性排列,从最重要的开始。
3.1.概述白皮书
https://d1.awsstatic.com/whitepapers/aws-overview.pdf
只阅读相关的产品和服务。
3.2.最佳实践白皮书https://D1 . AWS static . com/whites/AWS _ Cloud _ Best _ Practices . pdf
在我第一次阅读时,我很难理解一些事情。我不得不重读一遍,然后读重点。这个练习是有益的。
3.3.定价白皮书https://D1 . AWS static . com/whites/AWS _ pricing _ overview . pdf
即使您只阅读了简介和决定某些关键服务计费的因素,您也会充分利用这份白皮书。
3.4.架构良好的框架白皮书https://D1 . AWS static . com/white papers/architecture/AWS _ Well-Architected _ framework . pdf
我浏览了一下,只看了标题,很少看细节。
4.熟知共担责任模式;在这个问题上,我有大约十个问题。
https://AWS . Amazon . com/compliance/shared-responsible-model/
5.定价模式。
https://aws.amazon.com/premiumsupport/plans/
记住这次感冒。考试中会有一些直截了当的问题,会考验你的记忆力。
第三节。练习测试和样题的链接
我只考了前四门,因为我看了一些网上的评论,说测试 5 和 6 有很多问题超出了考试范围。
2.我还买了 AWS 的官方模拟测试,20 美元给你 25 道题。这些至少比实际测试简单十倍。
这就是计划。我相信这会节省你很多时间去寻找最适合考试的东西。考试本身并没有设计的很难,所以这个准备会让你做好最坏的打算。但是,请确保您根据第 3 节来判断您的准备情况。
何去何从?
Photo by Daniel Gonzalez on Unsplash
如果你认为你已经为考试做好了充分的准备,按照你在第三部分的评估,继续安排考试。如果你遵循这个学习计划的大部分,你应该能取得好成绩。
祝贺您迈出了云计算生涯的第一步!从这里你可以走很多条路。您现在可以了解其他云服务提供商,比较哪一个最适合您的需求。由于我来自机器学习背景,我对构建端到端的机器学习服务感兴趣。所以,在准备 AWS 解决方案架构师认证之前,我在准备 AWS 机器学习专业。微软 Azure 正在快速追赶 AWS,值得学习和探索。它也有一些优秀的认证。
在这次考试之后,你还将能够理解复杂的 AWS 架构,并了解人们如何为他们的用例构建定制的解决方案。您还可以尝试部署一些服务,比如使用 Amazon EMR 的 Hadoop 集群,使用按需 Lambda 函数触发代码作为对事件的响应,或者使用 Amazon Polly 的酷炫文本到语音转换功能。
在与 AutoML 的 ML 竞争中取得前 5%的位置
模拟地震破坏
AutoML 管道是一个热门话题。总体目标很简单:依靠最先进的机器学习模型、超调技术和大量计算,让每个人都能训练出符合其业务需求的高质量模型。
在这篇博文中,我将把微软的 AutoML pipeline 应用到一场公开的 ML 竞赛中,通过剖析结果,我希望了解 AutoML pipeline 在哪些方面增加了重要价值,以及它们仍可以改进的地方。通过较小的编码工作和 AutoML 管道,我能够以离 F1 最高分仅 0.004 分的成绩获得第五名!你可以找到我在 GitHub 上用过的笔记本。
里希特预测器:模拟地震破坏
我选择的比赛在 DrivenData.org 举行。这是一个中级实践比赛,目标是预测 2015 年尼泊尔廓尔喀地震对建筑物造成的破坏程度。
Image from the DrivenData competition.
数据是干净的,没有任何缺失值,主要由关于建筑物结构及其合法所有权的信息组成(分类和数字特征)。在这场比赛中,我们试图预测顺序变量damage_grade
,它代表了被地震击中的建筑物的损坏程度。损坏有三个等级。
训练和测试数据集分别由 260602 和 86869 个建筑物组成。
AutoML
AutoML 被集成到微软的 Azure 机器学习服务中。这意味着在 Azure 中使用存储和计算来执行和监控 AutoML 管道相对简单。
AutoML 管道的一般工作流程相当简单。您定义了训练数据集(Richter 数据集)、交叉验证方案(5 重交叉验证)、主要指标(加权 AUC)、实验类型(分类),一切就绪。根据您想要执行实验的位置(在本地 pc 上、云中的虚拟机或大型集群上)以及数据驻留的位置(本地或云中),您还必须指定数据和计算配置。
一个 AutoML 流水线由以下步骤组成:
1 .给定实验类型,生成一组初始管道参数。
2。使用不同的参数执行实验,并使用交叉验证测量主要指标。
3。选择一组新的(最佳)管道参数,并继续下去,直到达到一个阈值。这可以是大量的实验、花费在实验上的时间或不同的度量。
4。最后,构建不同模型的集成,以在测试集上获得最佳性能。
注意,选择一组好的算法和超参数的一般问题是一个复杂的问题。搜索空间(即模型空间)非常大,评估不同的实验通常需要大量的计算和时间。在相当长的一段时间里,超调是通过对模型空间执行随机或完全搜索来完成的。由于计算能力有限,这意味着这些模型空间必须受到启发式的限制。
如今,贝叶斯方法通常被视为超参数优化的优越方法,尽管基于 RL 的方法在例如神经架构搜索中也变得相当流行。这些方法背后的一般思想是,它们将“智能地”和“有效地”搜索模型空间,在探索(新的模型类型)和开发(改进以前的最佳模型类型)之间进行权衡。
结果
将 AutoML 管道直接应用于数据集会导致模型的性能(F1 为 0.5441)比竞争基线(F1 为 0.5815 的随机森林模型)差。对模型结果的分析很快说明了为什么会达到如此低的 F1。数据集不平衡(第一类:7.5%,第二类:52.5%,第三类:40%)。由于 AutoML 管道不执行欠采样或过采样,这意味着 AutoML 管道中的不同模型是在不平衡的数据集上训练的。
AutoML 管道的混淆矩阵也证实了模型中存在的对两个主要类别的偏向。由于比赛是对 F1 微分的评价,这个模型表现的不是很好。
尽管 AutoML 包含了一些特征工程、预处理、缺失值插补,但为 AutoML 管道提供一个干净、平衡的数据集仍然很重要。
为了改善结果,我采取了以下步骤:
- 验证不同的要素是否转换为正确的格式(数值或分类)。
- 利用 SMOTE 进行合成数据生成。这确保了数据是平衡的,而不必欠采样或丢弃任何数据。
实验部署在 AzureML compute(托管虚拟机)上,并使用 AutoML 管道运行了 100 个实验。
正如您在下面的图中看到的,运行更多的实验管道不会导致性能方面的显著改善,尽管这很可能是在竞争中获得第一名的必要条件。
放大混淆矩阵,很明显该模型表现更好,尽管第二类和第三类之间仍然存在明显的混淆。在这种情况下,额外的数据扩充技术(例如欠采样或过采样)或手动特征工程可能会有所帮助。
下图还展示了一些功能的重要性。显然,有许多(稀疏的)特性对最终性能的影响有限。因此,去掉这些特性是值得尝试的。首先,位置特征具有最大的影响,这是因为
最终的“最佳表现”车型 F1 得分为 0.7419。这比比赛中的最好成绩略低,但考虑到获得这些结果所涉及的工作量,我想说这对 AutoML 来说是一个非常有希望的结果。
结论
AutoML 对于任何数据科学家的工具箱来说都是一个很好的补充。超参数调优框架并不新(例如 hyperopt ),但是一个允许数据科学家在单个 Python 包中轻松结合计算、数据和实验的框架是一个很大的改进。也就是说,为了充分利用这些工具,有必要执行适当的数据预处理,选择正确的优化指标等。此外,为了避免在这些工作负载上花费大量计算和时间,可以根据数据探索和经验缩小搜索空间。
如果你对 AutoML 有任何问题,我很乐意在评论中阅读。如果你想收到我博客上的更新,请在 Medium 或 Twitter 上关注我!
实现数学成熟
关于学习数学的思考
“……知识会膨胀,但爱会积累。”——哥林多前书 8:1
“数学成熟度”是高等教育中经常使用但很少定义的流行语之一。更难理解的是如何达到“数学成熟”。在这篇文章中,我想分享我在充满数学的旅程中获得的一些见解。
旅程
免责声明:如果你在一个班里,你不知道发生了什么,下面这些都没用。基本理解是掌握的先决条件。读课本,去听课(并注意)。从最少开始,然后争取更多。
超过这一点需要练习
这似乎是显而易见的,但你真的需要大量的实践。反复接触这些材料有助于将机械操作植入你的肌肉记忆。实践还有助于消除困扰许多初高中学生的简单代数错误。消除这些错误是走向数学成熟的早期标志。但是简单的实践并不是深入概念理解的充分条件。剩下的这些建议改进了“蛮力”练习,鼓励更有效的专注练习,超越了重复一系列机械步骤的能力。
反思和强化
蛮力解决问题似乎相当令人生畏,因为它表明优秀只能通过数千小时的实践问题(也许是 10,000 小时?).与其简单地把问题当作死记硬背的任务来完成并继续前进,一种更聪明、更有效的解决问题的方式是在作业过程中和作业后不断反思,无论是家庭作业、讨论还是测试。问问你自己,“在这一步我在想什么?”,“为什么我在这个问题上搞砸了?”;问问题“这个问题要求我做什么?”,“我将使用什么一般方法来解决这个问题?”,“这个问题符合什么模式?”,“我需要什么公式来解决这个问题,我将如何使用它们?”
一个实用的技巧是,什么都做一次没有解,然后做一次有解。对于家庭作业来说,永远不要看解决方案——与问题搏斗直到它屈服才是真正的学习。如果你真的卡住了,请朋友帮忙。如果他们不知道,讨论方法和想法,尽可能多地拉拢其他朋友,直到你搞清楚为止。考试(或没有答案的家庭作业)后,检查整个考试,重做你漏掉的问题。如果卡住了,看看解决方案,然后写下解决方案。写下解决方案并不是真正的目标:重要的是理解你哪里错了,你错过了哪个转弯,以及为什么正确的道路确实是正确的。把它写下来只是一种鼓励这种理解的方法,但是仅仅复制是没有用的。
这种事后检查的做法非常重要,却极未被充分利用。这需要很强的纪律性和相当数量的“未分配”工作,即没有明确分配或分级,但提供显著收益的工作。这就是为什么班级应该强制或鼓励对作业进行重新评分,因为它明确地鼓励学生进行反思和重新评估练习。
在所有这些反思和分析之后,重要的是巩固你从错误中吸取的教训。怎么会?通过多做练习,多接触相同的内容。在每一轮练习和思考之后,随着时间的推移,你应该有希望看到错误数量的减少和常见错误的消除。如果没有,那么你就没有真正应用你所学的东西——在做每个问题之前慢下来,试着看看它是否与你以前见过的其他问题相匹配,这样你就知道你会陷入哪些常见的陷阱。
想象前方的路
即使是最难的高中问题也只需要最多一(1)个独特的视角和两(2)个重要的替换或步骤。一旦你确定了这些,剩下的就是代数运算了。提重物可以在提铅笔之前进行;一旦前面的道路畅通无阻,剩下的就是机械了。
这种高层次的方法很重要,因为很多时候学生会迷失在代数的画笔中,忘记他们要去哪里。了解你的目标是什么,并确定前进的方向——然后满怀信心地向前迈进。如果你能在这个阶段找到正确的路径,问题就已经解决了。即使你不能在当前时刻解决问题,例如问题太复杂,仅仅是确定目标和思考可能的步骤就是开始真正解决问题的良好开端。
证明它
通常,公式被认为是死记硬背。但是你碰到的很多公式都可以从基本公理推导出来。能够推导和证明陈述有助于加深对陈述为真的原因的直觉。这也可以说比记忆更有效,因为如果你忘记了公式,你应该可以重新推导出来。当然,你也不应该死记硬背证据,因为那样会破坏整个目的。相反,只要记住证明中使用的一系列“技巧”和概念就足够了。事实上,拥有一个好的代数“技巧”工具箱是解决问题的宝贵资产,因为它们经常出现在许多不同的上下文中。最后,练习证明方法本质上是一般问题解决练习的一个子集。
理智检查是为理智的人准备的
在解决问题时,我鼓励你在工作中经常进行理智检查。例如,如果你在研究概率,确保你的概率在 0 和 1 之间;对于微积分,做一些检查你的导数的符号,等等。
健全检查有几个动机。首先,当在科学中使用数学时,检查最终符号答案的单位是否与预期的单位匹配是对代数的一个很好的检查,也给了你转换单位的练习。理智检查也需要适度的概念理解:如果你对你的答案没有预期,你就不能检查它。最后,健全性检查也是引入无关概念并在您的健全性检查中利用它们的好方法,这是将概念编织在一起并查看跨不同主题的应用程序的好方法。
教学就是掌握
教学是加深你理解的极好方法。当教学时,你面对的不仅仅是你自己的问题,而是整个班级的学生,他们会以自己的方式看待和误解这些问题。
从信息论的角度来看,教学是智能信息压缩。回答学生的问题需要你清楚地找出误解点,确定正确的答案,并找到一种简洁明了的方式来解释答案。能够有效地做到这一点意味着你已经找到了一个有效的“潜在空间”表示或“多样性”,即掌握一个概念。
最后,教学本质上是一种社会活动。在现代科技时代,更重要的是能够清楚地向他人传达想法。认为这是一种有价值的练习,不仅可以清楚地解释概念,还可以激励和启发学生,否则他们可能看不到这些练习的意义。
抽象、模块化、区分、分层
与可视化相关的是抽象的概念。抽象思考的能力,超越简单的代数运算,想象你想解决问题的方向,是解决问题的固有部分。我们到底是如何抽象的?通过实施模块化——具体来说,通过识别每个问题的不同组成部分,它们如何相互关联,以及分别为每个组成部分制定攻击计划。
一旦我们看到了整个问题的这些不同的模块块/组件,我们就可以将该问题与我们之前看到的具有相同模块/组件的其他问题区分开来,除了配置可能略有不同。许多问题只是简单地排列出已知的或已知的方块,并要求你求解其他的元件/方块。这种辨别问题并说“你实际上只是我以前见过并做过多次的另一个问题的一个稍微不同的版本”的能力允许你把你以前获得的所有知识和技能投入到这个新问题中,尽管是以稍微不同的方式。
分层组织实际上是模块化的一种有序形式,其中各个模块按照复杂性的顺序进行组织。抽象概念建立在更简单的概念之上,层次结构的每一层都被抽象的障碍所分隔。学习明确地按照层次进行思考是建立概念理解的有效方法,因为许多数学可以以这种方式组织。
这种层次抽象的一个明显例子可以从线性代数中得到。抽象的基础层是向量-向量乘法、矩阵-向量乘法、点积、外积。接下来是高斯消去法和基本的矩阵变换,如逆矩阵、转置矩阵和行列式矩阵。请注意,即使在这个相对较低的层次上,也有复杂的联系和方式来直观地理解逆和行列式。接下来是向量空间和特征向量分解。然后各种矩阵分解技术等等。显然,抽象的障碍不像在软件开发中那样强烈,但是作为一个组织工具,仍然是非常宝贵的。
奖励
数学:科学女王
虽然数学经常被称为“科学女王”,但一个更具描述性的比喻可能是,现代科学方法是用数学语言书写的。你会经常发现,数学课上教的数学一般比科学课上用的数学要高级得多。例如,高中力学实际上只是代数和化学甚至更简单。尽管如此,这种“更简单”的数学是丰富的,因为变量和函数充满了现实世界的意义和含义。
就我个人而言,我参加了各种工程课程,并且学得很好,这不是因为我以前有知识,也不是因为我一定比任何人都努力,或者因为一些天生的天赋,而是因为我磨练了自己理解公式、方程、函数——科学语言——的能力。科学实际上是数学语言的上下文包装;突然间,变量背后有了单位和意义。一个函数的特征具有重要的现实意义,最终结果反映了我们周围世界的一些基本情况。一个答案有正或负的斜率,数量级小于 1,这些数学性质突然有了巨大的物理意义。但如果我们没有牢固掌握这些见解所用的语言,我们就无法获得这些见解,这就是为什么数学成熟度很重要,不仅对数学家如此,对科学家和工程师也是如此。
数学生活
这里讨论的许多方法都非常通用。抽象、模块化和区分的想法是基于我的软件设计经验,但是解决问题的方法是非常通用的。在生活中,我们可以通过寻找方法和途径来解决问题。
甚至非技术领域,如议论文/说服性写作、哲学和辩论也需要这种类似的模块化思维,但方式稍微“宽松”。我的意思不是消极的——事实上,我发现这种思考更加困难。解决一个问题和提出一个好的论点之间的相似之处很有趣,但不幸的是需要另一篇文章来探索。
那么我上面给出的提示和一般的解题主题有什么不同呢?我认为主要的区别在于数学中快速而具体的反馈回路——你可以很容易地验证你的工作和答案是正确的。哲学不是这样的,许多科学领域也是如此,写作也是如此,修马桶也是如此(尽管可以说这与计算机科学有相似之处,主要区别在于好的软件工程和语法并不是天生就显而易见的,需要教授)。
结论
希望这篇文章可以作为一个路线图,或者至少是一个有价值的工具,来激发你下次坐下来做数学作业时更加专注的练习。这些原则中有许多是非常通用的,适用于你经常遇到的任何问题。
“数学是最便宜的科学。不像物理或化学,它不需要任何昂贵的设备。数学只需要一支铅笔和一张纸。”—乔治·波利亚
资源
乔治·波利亚的典范之作,如何解决 以及它的总结这里
在线课程: Coursera , EdX ,麻省理工开放式课程
我做了一个 github repo,里面是为微积分前的高中生准备的数学题
用几行代码实现深度学习模型的激活图
我们用几行代码演示了如何在深度 CNN 模型中显示不同层的激活图。
更新:这个故事获得了 KDNuggets 颁发的十月最受分享的故事银奖。
https://www.kdnuggets.com/2019/10/activation-maps-deep-learning-models-lines-code.html
深度学习有一个坏名声:“黑箱”
D eep L earning (DL)模型在一个又一个应用领域以令人瞠目结舌的性能彻底改变了商业和技术世界—仅举几个例子,图像分类、物体检测、物体跟踪、姿势识别、视频分析、合成图片生成。
然而,它们一点也不像经典的盈利算法/技术。DL 模型使用数百万个参数,并创建极其复杂和高度非线性的图像或数据集的内部表示,这些图像或数据集被提供给这些模型。
因此,它们通常被称为 完美的黑盒 ML 技术 。在我们用大型数据集训练它们之后,我们可以从它们那里获得高度准确的预测,但我们几乎没有希望理解模型用来将特定图像分类的数据的内部特征和表示 。
Source: CMU ML blog
深度学习的黑箱问题-没有直观和易于理解的解释的预测能力。
这不是好兆头,因为我们人类是视觉动物。数百万年的进化赋予了我们一双极其复杂的眼睛和更复杂的视觉皮层,我们用这些器官来理解世界。
Source: Wikimedia
科学过程始于观察,而观察几乎总是视觉的同义词。在商业中,只有我们能观察和测量的,我们才能有效地控制和管理。
看到/观察是我们如何开始对世界现象建立心智模型,对我们周围的物体进行分类,区分朋友和敌人,爱,工作和玩耍。
可视化很有帮助。尤其是对于深度学习。
因此,一个“黑箱”DL 模型,我们不能可视化内部工作,经常会招致一些批评。
激活图
在各种深度学习架构中,最突出的可能是所谓的Con voluntualNeuralNnetwork(CNN)。它已经成为分析高维、非结构化数据的主力,这些数据包括图像、文本或音频,传统上对经典的 ML(非深度学习)或手工制作的(非 ML)算法提出了严峻的挑战。
在文献中已经开发了几种理解和可视化 CNN 的方法,部分是作为对 CNN 内部特征不可解释这一常见批评的回应。
最直接的可视化技术是显示网络在正向传递过程中的激活。
那么,什么是激活呢?
在简单的层面上,激活函数有助于决定一个神经元是否应该被激活。这有助于确定神经元接收的信息是否与输入相关。激活函数是发生在输入信号上的非线性变换,并且变换后的输出被发送到下一个神经元。
如果你想准确地理解这些激活意味着什么,为什么它们首先被放在神经网络结构中,请查看这篇文章,
今天,互联网提供了获取大量信息的途径。我们需要的只是一个谷歌(搜索)…
www.analyticsvidhya.com](https://www.analyticsvidhya.com/blog/2017/10/fundamentals-deep-learning-activation-functions-when-to-use-them/)
下面是著名数据科学家 Brandon Rohrer 的精彩视频,讲述了 CNN 的基本机制,即如何一层一层地处理给定的输入(比如二维图像)。在每一层,通过激活函数传递转换后的输入来生成输出。
作为各种线性代数运算的结果,当给定图像前进通过时,激活图只是这些激活号在网络的各层的可视化表示。
对于基于 ReLU 激活的网络,激活通常开始时看起来相对较大和密集,但是随着训练的进行,激活通常变得更加稀疏和局部化。这种可视化很容易捕捉到的一个设计陷阱是,对于许多不同的输入,一些激活图可能全为零,这可能表明失效过滤器,并且可能是高学习率的症状。
激活图只是这些激活号码在网络各层的直观表示。
听起来不错。但是可视化这些激活图是一项重要的任务,即使你已经很好地训练了你的神经网络,并根据它进行预测。
对于一个相当复杂的 CNN,如何用几行代码轻松地可视化和显示这些激活图?
只有几行代码的激活图
整本 Jupyter 笔记本都在这里 。随意分叉和扩展(如果您喜欢,可以给存储库留一个星号)。
一个简洁的函数和一个漂亮的小库
在之前的一篇文章中,我展示了如何编写一个简洁的函数,通过利用 Keras 库提供的一些令人惊叹的实用方法和类,从磁盘中一个接一个地自动读取图像文件,从而获得完全训练好的 CNN 模型。
一定要看看这篇文章,因为没有它,你就不能以紧凑的方式用任意的图像数据集训练任意的模型,正如本文所描述的。
我们展示了如何构建一个单一的、通用的、实用的函数来从一个目录中自动提取图像…
towardsdatascience.com](/a-single-function-to-streamline-image-classification-with-keras-bd04f5cfe6df)
接下来,我们使用这个函数和一个叫做 Keract 的漂亮的小库,这使得激活图的可视化变得非常容易。这是 Keras 库的一个高级附件库,用于显示神经网络各层的有用热图和激活图。
因此,对于这段代码,我们需要使用来自我的utils.DL_utils
模块- train_CNN_keras
和preprocess_image
的几个实用函数,使随机 RGB 图像兼容生成激活图(这些在上面提到的文章中有描述)。
这里是 Python 模块— [**DL_utils.py**](https://raw.githubusercontent.com/tirthajyoti/Deep-learning-with-Python/master/Notebooks/utils/DL_utils.py)
。您可以像往常一样存储在本地驱动器中并导入函数。
数据集
为了训练,我们使用著名的加州理工学院-101 数据集来自http://www.vision.caltech.edu/Image_Datasets/Caltech101/。这个数据集在某种程度上是 ImageNet 数据库的前身,ImageNet 数据库是当前图像分类数据存储库的黄金标准。****
这是一个图像数据集,包含属于 101 个类别的不同类型的物体。每个类别大约有 40 到 800 张图片。大多数类别大约有 50 张图片。每个图像的大小大约为 300 x 200 像素。
然而,我们仅使用 5 类图像进行训练— 螃蟹、杯子、大脑、相机和椅子。
这只是这个演示的随机选择,请随意选择您自己的类别。
训练模型
训练只用几行代码就完成了。
从网上下载的人脑的随机图像
为了产生激活,我们从互联网上下载一个随机的人脑图像。
生成激活(字典)
然后,生成激活的另几行代码。
我们得到一个字典,其中层名作为键,Numpy 数组作为对应于激活的值。下面示出了一个图示,其中激活阵列被示为具有对应于该特定卷积层的滤波器映射的大小的不同长度。
显示激活
同样,一行代码,
display_activations(activations, save=**False**)
我们可以一层一层地看到激活地图。这里是第一个卷积层( 16 个图像对应 16 个滤波器)
这里是图层号 2 ( 32 个图像对应 32 个滤镜)
在这个模型中,我们有 5 个卷积层(后面是最大池层),因此,我们得到 10 组图像。为简洁起见,我没有展示其余的,但你可以在我的 Github repo 中看到它们。
热图
您还可以将激活显示为热图。
display_heatmaps(activations, x, save=**False**)
更新:颤
上周写完这篇文章后,我发现了另一个漂亮的激活可视化库,名为。然而,这个是在 Python 微服务器框架 Flask 上构建的,并在浏览器端口上显示激活图,而不是在您的 Jupyter 笔记本中。****
他们还需要一个经过训练的 Keras 模型作为输入。因此,您可以很容易地使用本文中描述的压缩函数(来自我的 DL_uitls 模块)并尝试这个库来实现激活图的交互式可视化。
摘要
就这样,暂时的。
整个 Jupyter 笔记本都在这里 。
我们展示了如何只使用几行代码(利用来自一个特殊模块的紧凑函数和 Keras 的一个漂亮的小附件库)就可以训练 CNN,生成激活图,并一层一层地显示它们——从零开始。
这使您能够从任何图像数据集(只要您能以简单的格式排列它)训练 CNN 模型(从简单到复杂),并查看它们内部的任何测试图像。
更多这样的动手教程, 查看我的用 Python 深度学习 Github repo 。
如果您有任何问题或想法要分享,请通过tirthajyoti【AT】Gmail . com联系作者。此外,您可以查看作者的 GitHub 资源库,了解 Python、R 和机器学习资源中其他有趣的代码片段。如果你像我一样,对机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我或在 Twitter 上关注我。
**** [## Tirthajyoti Sarkar - Sr .首席工程师-半导体、人工智能、机器学习- ON…
通过写作使数据科学/ML 概念易于理解:https://medium.com/@tirthajyoti 开源和有趣…
www.linkedin.com](https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/)****
主动学习:充分利用有限的数据
上周,我在快进实验室看到了一位研究员的精彩演讲,这让我想到了被称为“主动学习”的机器学习的例子。主动学习指的是处理不完全标记数据的许多策略,特别是识别哪些点需要手动标记。
当人们听到“机器学习”这个术语时,他们想到的大多数用例都涉及所谓的“监督学习”,这意味着他们需要有标签目标变量的数据来进行训练。如果一家银行希望建立一个模型,根据某些特征预测特定交易是否是欺诈性的,它需要有训练数据,可以向计算机显示包含欺诈性和非欺诈性交易的已知案例。如果机器视觉工程师想要教会汽车的车载计算机识别停车标志,它需要向计算机提供一些带有和没有停车标志的清晰标记的图像示例。有一些非监督技术不引用特别标记的目标变量,例如尝试将点分组在一起或搜索异常的算法,但预测模型几乎总是需要引用目标变量,因此要求数据集已经考虑了该变量。毕竟,你还能如何验证这个模型呢?
然而,在某些情况下,收集足够多的标记数据是困难的。考虑识别路边图片中的停车标志的例子。在互联网上搜索成千上万的照片,或者像谷歌地图那样,在汽车上安装一台相机,开一会儿车,都很容易。识别这些照片中哪些包含停车标志是一项更加艰巨的任务,需要有人逐个照片地检查收集的照片,并标记适当的照片。不幸的是,你不能使用你的停车标志识别机器学习模型来识别你用来训练该模型的照片…
在机器视觉等领域,这是一个特别棘手的问题。可以识别许多不同方向的许多不同种类的对象的健壮模型需要大量的数据来训练,当然比任何一个人能够标注的都多。简单地制作数据集可能会很昂贵——如果这项任务外包给亚马逊的机械土耳其人这样的服务,就需要花费大量的劳动时间或金钱。
如果你看到一个未标记或部分标记的数据集,你该如何处理?很明显,你需要手动标记它,但是对于一个大的集合来说,这可能是昂贵的。不过,也许你真的不需要给整套标签。如果仔细选择这些点,就有可能用较小的训练数据集获得高价值的模型。你如何区分标签和训练模型的优先顺序?这是主动学习策略的核心问题,也是我想在这篇文章中探讨的问题。
特别是,我想思考一些可以在小范围内轻松测试的策略。一些方法需要比在家工作的人更多的模型工作的可见性,例如“预期模型变化”是一种优先选择可能对模型产生最大影响的点的策略。然而,许多机器学习模型必然是不透明的,因此并不总是清楚如何辨别哪些点可能会影响模型。尽管如此,任何人都可以对主动学习在家里的实践中是如何运作的有一种直觉。
假设我们有一个很大但标签不够的数据集,我们如何处理它?嗯,你需要从某处开始,这意味着采取一个更小的,随机的数据集子样本来手动标记。第一次随机抽样是不可避免的;你需要启动这个模型。当你这样做的时候,你可能还需要一个手工标记的测试集。很抱歉,但从现在开始会好起来的。在您标记的较小子样本上训练您的模型,并在您的测试集上评估它的性能。它可能不太好。现在,选择一个新的点样本进行标注,并继续在这些点上训练您的模型,然后进行重新评估。冲洗并重复,直到你的模型按照你想要的方式运行。唯一的问题是如何选择标记哪些点。
最简单的策略是继续随机抽取子样本。你不能指望像这样的随机策略能让你超快地达到目标。它的主要好处是,如果您在用完要标记的数据之前碰巧达到了目标绩效,它允许您停止标记。我们真的希望有一种方法来选择点,以便我们在标记最少的点后获得性能。我们如何找到这些点?
对于分类模型,一种方法是询问模型本身它不确定哪些点。许多机器学习实现不仅可以很容易地从测试集中获得目标变量的预测,还可以获得模型分配给每个潜在结果的概率(假设它是分配概率的模型)。只需使用部分训练的模型对未标记的数据进行预测,并选择模型对其预测最没有信心的点进行标记,并作为下一批训练数据。
思考任务的另一种方式是,我们正在寻找最能阐明模型的隐含决策边界的点。我们正在寻找边缘情况,即决策边界附近的点,如果边界稍微移动,这些点可能会被不同地分类。为什么不选择边界附近的点?一些类型的模型,比如支持向量机,可以很容易地判断出决策边界在哪里。其他模型没有明确定义边界,但是您可以通过找到与模型不同标记的点最接近的点来隐式地寻找它们。旁注:这种策略有点耗时,特别是对于大型数据集,因为它涉及到遍历所有点来计算每个点到其他点的距离。如果你像我一样在用 Python 工作,矢量化是加速这个过程的必要条件,但即使这样也需要一些时间。
为了测试这些策略在实践中的效果,我开始使用著名的 MNIST 手写数字数据集。我听说这一组被称为机器学习的“hello world ”,它无处不在,但对于这个练习来说它有一些有用的功能。这是一个具有许多点的多类分类数据集(训练集中有 60,000 行,测试中有 10,000 行)。它还被方便地处理成一组列,这些列的整数值对应于手写图像中的不同像素,因此在我们开始测试模型之前,它不需要大量的预处理。至关重要的是,用 MNIST 集也很容易得到好的结果。获得 90%以上的精度并不真的需要大量的预处理或模型调整。这个练习的目的不是看你能把一个 MNIST 模型做得多好(我们已经知道答案是非常好),而是看你能否用很少的训练点得到一个好的模型。
Examples of handwritten digits from the MNIST data set
在这个练习中,我使用了 sklearn 的多层感知器模型,它方便地提供了一个“热启动”选项,允许您使用新数据继续训练现有模型,具有两个隐藏层。我依次尝试了每种策略,从随机选择的 500 个点开始每个模型,然后向训练数据中添加新的一批点,每次 500 个。我一直坚持到模型达到 95%的准确率。随机策略的性能(您不一定期望它能很好地工作)主要说明了 MNIST 数据集的易用性。正如我提到的,训练集是整整 60,000 行,但随机策略使用不到三分之一的行就让我们达到了 95%的准确率:
Number of training data rows vs model accuracy for randomly chosen training rows
您会注意到,虽然随着您添加更多批次的训练数据,模型通常会变得更好,但根据新点的随机分布,它偶尔会损失一些新训练数据的准确性。相比之下,当我们通过询问模型哪些点最不确定来选择新点时,模型的性能通常会随着每个新批次而提高,并且更快地获得我们的目标准确性:
Increasing model accuracy by selecting training points based on the model’s assigned probabilities
随机方法最终需要看到 17500 个点才能达到 95%的准确率。基于概率的方法只需要 8500 英镑。也许这是意料之中的。真正令人惊讶的是,除了花费很长时间之外,基于我们对它们离决策边界有多远的隐式度量来选择点,实际上并没有比随机样本方法产生任何改进。这是所有三种策略的图表:
起初,每个模型都从新批次的数据中受益匪浅——我启动这些模型时只有 500 行,这显然是不够的。基于概率的样本策略很快取得并保持领先,然而,随着每一个新的批次,看到稳定的改善,而随机策略有点向目标弯曲。在加快速度之前,到决策边界策略的距离似乎停滞了近 4000 行,最终甚至不如随机策略。
我承认对决策边界策略似乎不起作用感到有点惊讶。然后我在其他数据集上尝试了这些策略,大部分都得到了相似的结果。我喜欢的一套是 Zalando Research 的“时尚-MNIST”,它是在最初的 MNIST 集(它有相同的行数,像最初的集一样,每一列对应一个像素值)的基础上制作的,除了它有衣服的灰度图像,而不是手写数字。
The Fashion-MNIST dataset
这是一个很难得到结果的集合,所以我把我的目标降低到 85%的准确率。两种策略之间的总体学习曲线基本保持不变:
Similar results using the more difficult Fashion-MNIST set
基于概率的样本方法表现更好,尽管不如普通 MNIST 集明显好。同样,决策边界方法似乎不起作用。实际上,您可能会注意到,决策边界方法模型恰好在性能方面优于其他两个模型——这只是一点偶然,因为这些模型都是从随机抽取的样本开始训练的。然而,决策边界浪费了它的领先优势,并且在接下来的 3000 行增量训练数据中基本上看不到改进。
当然,任何给定的主动学习策略的有效性可能会因数据集和模型而异。机器学习的挑战之一是,事先并不总是清楚什么样的策略和模型最有效。然而,实验是有用的,因为实际上,学习方法和模型的选择一样重要。
2019 年的 ADAM—下一个 ADAM 优化器是什么
如果 ADAM 速度快,SGD +动量收敛更好,为什么不能从 ADAM 开始,后来改用 SGD?
Visualization of loss landscape from https://www.cs.umd.edu/~tomg/projects/landscapes/
介绍
深度学习已经取得了很多进展,每隔几周就会有新的模型问世,然而我们在 2019 年仍然停留在亚当身上。你知道亚当论文是什么时候出版的吗?现在是 2014 年,相比之下,BatchNorm 论文是 2015 年发表的!🎈
the original Adam paper
Batch Norm paper was published in 2015
对于深度学习社区来说,5 年就像是一个世纪,我对最近 optimizer 的发展很好奇,所以我四处搜索并试图总结我的发现。Sebastian 对优化算法有一个很好的概述,但是它不是最新的,并且错过了最近出现的一些进展。
见见亚当的家人
你可以从 PyTorch 文档 中轻松找到很多优化器。阿达德尔塔,阿达格拉德,阿达姆,阿达马克斯,这样的例子不胜枚举。看来我们真的无法摆脱亚当。o 让我们快速回顾一下亚当。如果你已经熟悉了,可以跳过这一部分。
Adam = Momentum + RMSProp
大坝是动量和 RMSProp 的结合。动量(v)为优化器提供短期记忆,而不是完全信任当前梯度,它将使用先前梯度和当前梯度,并以比率β1 将它们相加。虽然 RMSProp 将梯度的 1/平方根考虑在内,但直觉上,这意味着如果方差很小(有把握),优化器将采取更大的步骤,反之亦然。
Adam updates rules
Adam 很棒,它比 SGD 快得多,默认的超参数通常工作良好,但它也有自己的缺陷。许多人指责亚当有收敛问题,往往 SGD +动量可以用更长的训练时间收敛得更好。我们经常看到很多 2018 年和 2019 年的论文还在用 SGD。
最近的进展
那么,关于训练神经网络,我们学到了什么?我会尽量保持简短,并补充文章的细节。
圣经》和《古兰经》传统中)亚当(人类第一人的名字
RAdam update
关于自适应学习率的方差和超越 引入宣叙调——亚当。本文认为,Adam 的初始训练是不稳定的,这是由于只有很少的数据点用于计算二阶矩(s_t)项的指数移动平均。RAdam 通过仅在对梯度的方差有把握时校正自适应学习率来解决这个问题。否则,它会关闭自适应学习率,并使其回落为 SGD +动量。热身学习率具有类似的效果,因为学习率从较低值(高方差,数据点少)开始,慢慢增加到较大的学习率(稳定方差,数据点多)。使用 RAdam 的一个好处是,它在学习速度的选择上更加稳健,而且你不必决定热身期的长度。
Warm-up learning rate
如果你想了解更多关于 RAdam 的知识,可以参考这篇好看的文章。
前瞻优化器
Jimmy Ba was one of the authors of the Adam Optimizer, and we all know about Geoffrey Hinton already. 😃
前瞻优化器由两部分组成,慢速权重和快速权重。快速权重是充满活力的,每次更新需要几个步骤,慢速权重是谨慎的,它不是跟随快速权重,而是基于指数平滑对参数进行插值并采取一些中间步骤。前瞻优化器本身并不工作。如果你看一下算法,内循环只是普通的小批量更新,所以它需要像 SGD 或 Adam 这样的优化器。
蓝线是快速权重的轨迹,有多个数据点,因为对于快速权重(蓝色)的每 k 次更新,我们将仅对慢速权重(紫色)进行 1 次更新,然后我们将重置快速权重。基本上,快速的重量是哨兵,它需要多走几步,以确保周围是安全的,然后慢速的重量采取一些中间步骤。对于下面的例子,您可以看到,只需一次更新,慢速权重就更接近黄色区域(高精度)。
拉尔斯/兰姆
The highlighted part is the trust ratio calculation, the φ is a scaling function which the paper similar use identity function φ(z) = z
LARS 及其继任者 L 逐层 A 自适应 M 网膜优化器为 B atch training (LAMB)优化器向前迈进了一步。LAMB (1)像 Adam 一样保持梯度的平方根作为自适应学习率的一部分,但是(2)它有一个额外的组件,称为“信任比”。这篇文章更详细地解释了 LAMB,如果你感兴趣的话。其要点是,它不仅将梯度的方差作为缩放因子,而且还将层权重和层梯度的范数之比作为**。**很有道理,比较大的权重和小的权重,你需要根据它们的比例来缩放学习率才能有类似的效果。通过用信任比率缩放,它确保每层的更新是单位 l2 范数,这通过减轻梯度消失问题来帮助训练深度网络。
讨论
如果 ADAM 速度快,SGD +动量收敛更好,为什么不能从 ADAM 开始,后来改用 SGD?
我对此没有很好的答案,我有时在 Kaggle 上看到人们这样做,这篇文章暗示这是可行的。为了训练更快、更准确的神经网络,有很多改进当前优化器的尝试。在深度学习中,解释往往出现在经验结果之后。那么我们到底对优化器或神经网络的优化了解多少呢?
《与 SGD 一起散步》这篇文章有一些有趣的解释,我鼓励你去读一读。我认为这解释了最近发展的一些联系。
为什么线性比例学习率和批量不能达到特定的批量?
与 SGD 一起散步的论文比较了梯度下降和随机梯度下降(SGD ),并提出学习速率和批量大小在 SGD 动力学中扮演两个非常不同的角色
学习率
通过观察每次更新前后插值参数的损失,发现 SGD 谷大致是凸的,这大致符合我们的理解。然而,该论文也指出 SGD 谷的底部是高度非线性的,并且充满了障碍。学习率控制 SGD 的高度,所以使用大的学习率**简单地越过障碍,而不是跨越它。**这与我们的理解不同,我们通常认为较大的学习率会导致 SGD 更难反弹,并有助于避免局部最小值。下图显示了假设的拓扑结构。这可能是反直觉的,如果学习率保持在地板以上的高度,它如何将损失最小化?事实证明,我们过于简化的错觉,即 SGD 只是从一座静止的小山上走下来,是错误的。事实上,“山”本身也在不断变化,因为它只是我们从高维空间到三维空间的投影。看看这个由 https://losslandscape.com/gallery/创造的美丽而奇异的失落景观视频吧!
批量
而批量大小控制随机性,这有助于探索。本文通过观察 SGD 导致比梯度下降(GD)大得多的参数距离来支持这一论点。
The upper graph represents the angle between each update, -1 means it is the opposite direction. The lower graph measures the ||parameter distance||² from initialization, a larger value means it is further from the initialization points.
从这个图中可以学到一些东西。(1)每次更新之间的角度具有非常不同的梯度下降和 SGD 特征。(2)SGD 在 40 次迭代后参数距离大很多。这个角度告诉我们一些有趣的故事。首先,对于梯度下降,它很快稳定在-1,这意味着 SGD 很可能在类似山谷的地形中振荡。而对于 SGD,该值较大,并上下波动,表明它沿着谷壁振荡,但具有更多勘探,而不是停留在局部谷中。较大的参数距离也支持了 SGD 有助于勘探这一论点。
事实上,我认为这种见解可能与这样一个事实有关,即为什么在批量达到某个阈值之前,线性提升学习率/批量比例不起作用。如果批量大小具有根本不同的动态,这是有意义的。LAMB 优化器成功地用非常大的批量(65536/131072)训练了 BERT。研究 LAMB 如何改变批量大小的动态变化,并通过逐层缩放学习速率来帮助优化,这可能是很有趣的。
最好的学习率时间表是怎样的?
根据 RAdam 论文,我们了解到热身计划有助于减少梯度的变化。这是否意味着我们不再需要热身了?可能不会,因为我们知道高学习率也有助于优化。SGD 文件还提出了一个梯形进度表,我们可以将进度表分为 3 个阶段。fast.ai 也使用了类似的策略,他们称之为单周期训练的修改版
(1)热身阶段,从低学习率开始,线性增加到最大
(2)公路训练阶段,停留在最大学习率
(3)收敛阶段,学习率线性衰减到最小值
请给我留下评论,如果你认为有用,别忘了竖起大拇指。👍👍👍👍👍
关键词:亚当,SGD,RAdam,前瞻,羔羊
参考
【P1】、、、、彭城何、陈、、、高剑锋、韩家伟对自适应学习率的方差及其超越
[p2] 迈克尔·r·张,詹姆斯·卢卡斯,杰弗里·辛顿,吉米·巴前瞻优化器:向前 k 步,向后 1 步
【P3】陈星,德万什·阿皮特,克里斯特斯·齐里戈蒂斯,约舒阿·本吉奥与 SGD 一起散步
Leslie N. Smith , Nicholay Topin 超收敛:使用大学习率非常快速地训练神经网络
【P4】【尤杨】【李京】萨尚克·雷迪乔纳森·谢桑基夫·库马尔斯利那达·博贾纳帕利肖丹·宋詹姆斯·德梅尔库尔特·库特策赵瑞希
[p5] 帕维尔·伊兹迈洛夫,德米特里·波多普里欣,帖木儿·加里波夫,德米特里·维特罗夫,安德鲁·戈登·威尔逊平均权重导致更宽的最优值和更好的泛化能力
[p10]伊恩·J·古德菲勒、奥里奥尔·维尼亚尔斯和安德鲁·M·萨克斯。定性表征神经网络优化问题。arXiv 预印本 arXiv:1412.6544,2014。
AdaNet —论文评论
人工神经网络的自适应结构学习
本文原载于【blog.zakjost.com】。格式/数学看起来更好:)
介绍
在向机器学习普及进军的过程中,AutoML 正在成为一种重要的机制,使那些在该领域没有深厚专业知识的人可以访问 ML。简单地说,AutoML 的愿望是允许一种“按钮式”体验,用户提供数据,按下按钮,从另一端得到 ML 模型。
在神经网络的情况下,确定网络结构是一个重要的挑战-例如,有多少层,每层有多少节点,各层如何连接在一起?典型的建议是,从硬件能力和速度的角度出发,选择尽可能大的模型,然后使用标准实践来防止过度拟合。
来自 Google Research 的网络论文提出了一种新算法,允许我们学习最佳网络结构。他们在论文中发展和应用的理论与我过去阅读的完全不同,通过研究,我学到了一个有价值的观点。我将试着在这里用一种更容易理解的方式来表达我对它的理解,希望其他人也能从他们的观点中受益。
框定问题
泛化误差
监督 ML 的主要目标是学习一个模型,该模型提供对新数据的良好预测,即最小化泛化误差。对此的典型方法是首先优化模型参数,以学习对训练数据进行良好的预测。然而,众所周知,单独使用最大似然技术来学习模型参数会导致模型在训练数据上表现良好,但可能不会很好地推广到新数据,因为它也适合训练数据中的噪声。因此,已经开发了各种技术,以一种或另一种方式试图限制模型的复杂性(例如,正则化、丢弃、提前停止等),以使其无法适应噪声。然后使用迭代循环来开发该模型,在该循环中,通过使用维持数据集来评估过拟合的程度,然后使用不同的参数来重新训练该模型,目的是最终减少泛化误差。
本文采用了不同的方法。作者发展了一种理论,该理论产生了一个方程,用于直接估计泛化误差的上限。直观地说,这个等式取决于训练数据性能和模型复杂性之间的权衡。有了泛化误差的显式方程(以及最小化它的算法),我们就可以在训练性能和复杂性之间做出良好的权衡决策。由于模型的复杂性取决于神经网络的结构和训练数据的性质,我们可以学习网络的最佳结构。
合奏
首先,应该注意的是,这篇论文是同一作者在深度增强论文中开发的技术的扩展。尽管那篇论文是在树的集合的上下文中,但是这篇论文将类似的技术扩展到了神经网络的世界。这项工作的基础是将“终极模型”视为更简单的“子模型”的集合(引号中的术语是我的非正式术语,不是论文)。这意味着:
其中“最终模型” f 是子模型的加权和, w 表示权重, h 表示子模型。在树的情况下,集成学习每棵树的决策的最佳权重。在神经网络的情况下,这只是另一个具有单个输出节点的密集层,该输出节点连接到子模型层的所有输出节点。下面是一个示例网络架构,其中有两个子模型,每个子模型每层有 3 个输出节点,但具有不同的深度:
理论
计算泛化误差
我不会在这里试图重新创建证明,我将只讨论结果的有趣方面。泛化误差上限的等式如下:
用英语来说,大致是这样的:
泛化误差< =训练误差+ensemble _ weights * submodel _ complexity+取决于你训练数据大小和神经网络最大深度的东西。
我想特别提醒大家注意这一部分:
**泛化误差=~子网络上的集成权重?!**这真是个好消息!这意味着我们可以:
- 通过修改应用于集合中各种组件的权重来改善泛化误差。
- 允许复杂的模型(即深层),只要我们通过给它们小的权重来补偿。
这为我们提供了一种原则性的方法,用于决定何时在我们的集合中包括更复杂的模型,以进一步减少训练误差:当训练误差的减少大于复杂性项的增加时,我们应该这样做。
复杂性
到目前为止,我们已经看到了模型复杂性是如何影响估计泛化误差的,但是还没有看到如何计算模型复杂性本身。在这个研究的世界里,拉德马赫复杂性的概念似乎是标准。在阅读这篇论文之前,我对这个概念并不熟悉。我的理解是,它衡量的是一族函数对噪声的拟合程度。在高层次上,您可以想象一些复杂的深度神经网络可能比逻辑回归更适合随机生成的训练数据集。拉德马赫复杂性是量化这种能力的公式。
此外,经验 Rademacher 复杂度量化了一族函数在特定数据集上拟合噪声的程度。虽然我对自己的理解不是 100%有信心,但我认为这个想法是,一些数据集自然允许一个模型比其他模型适合更复杂的函数。例如,如果您想象一个包含 100 行单一二进制特征的数据集,那么即使使用深度神经网络,您使用该特征预测噪声标签的能力也是有限的。然而,如果您有 1000 个高基数特性,那么您可以更容易地适应噪音标签。这样,**模型的复杂度就依赖于训练数据集。**这是一个特性,而不是一个错误,因为数据相关的复杂性度量允许理解一些数据集比其他数据集需要更复杂的模型(例如,语音识别与虹膜物种分类)。
困难的部分是使用 Rademacher 复杂度的一般定义来导出特定函数族的上界。幸运的是,AdaNet 的论文为前馈神经网络做了这样的工作:
所有这些术语都与神经网络的结构(例如, Lambda_{s,s-1} 是对层 s 和 s-1 之间的连接规范的约束)或训练数据集的属性相关。
那又怎样?
好,让我们深呼吸,从所有这些方程中恢复过来。到目前为止,我们已经有了一个神经网络集成的泛化误差方程。这取决于我们控制的子模型连接的权重,以及它所连接的层的复杂性。层的复杂性由网络的结构决定,例如,更多/更深的层和更大数量的节点增加了我们的训练数据集的复杂性和属性。
通过将该方程视为成本函数并将其最小化,我们可以以原则的方式学习神经网络集成的最佳结构。在这一创新之前,我们只是选择了一种网络结构,并针对间接复杂性惩罚方法(如放弃和提前停止)迭代调整了参数。或者我们将结构参数,如层数,视为另一个超参数,并进行大量试验来调整一切。
但是还有一些事情我们没有讨论:生成这些集合之一并在网络架构搜索空间中导航的秘诀是什么?
实际的算法
有多种方法可以做到这一点,但是作者建议了一种相当直接的方法:
- 训练两个候选子网络(这与集合无关):一个具有与前一次迭代中使用的相同层数;一个具有作为先前迭代的一个附加层。
- 一旦子网络的训练完成,剥离最后一个节点以暴露最后一个隐藏层,然后通过学习权重将每个节点插入到集成中,以将最后一层连接到集成的输出。这是从步骤 1 开始对每个候选子网独立完成的。(这一步使用泛化误差方程作为代价函数,量化了训练误差和子网络复杂度之间的权衡。)
- 为集合选择导致最低泛化误差的候选项
- 从步骤 1 开始重复,直到泛化误差停止改善。
这里有一个来自官方回购的动画演示了这一过程:
请注意,这是一个自适应的过程,开始时很简单,随着时间的推移会变得越来越复杂。如果手头的问题需要一个更复杂的模型,算法将运行更长时间,并扩大结构。如果模型具有足够的复杂性/容量,泛化误差降至最低点,算法终止。这是一种贪婪的搜索,类似于决策树如何一次选择一个分裂点,而不是试图联合优化所有分裂点。通常,这可能导致次优结果。然而,这是标准的保证,即如果我们继续降低我们的目标,我们仍然可以得到正则化增强的收敛(参见原始论文的更多讨论和参考)。
实验结果
作者使用 CIFAR-10 数据集将他们的方法应用于一些图像分类任务。他们比较了两种调整神经网络的标准方法:在结构+学习参数(NN)上进行随机网格搜索,并应用贝叶斯优化来帮助搜索相同的超参数空间(NN-GP),这是一种为亚马逊 SageMaker 提供动力的 HPO 过程。
笑点是 AdaNet 表现更好。但是,请观察这些不同方法针对不同图像分类任务所采用的最终结构:
在这些例子中,NN 和 NN-GP 总是选择一个层。这也是 AdaNet 的情况,除了区分猫和狗,它们生长了第二层。这符合我们的直觉,即这将是一项比区分鹿和卡车更复杂的任务。有趣的是,在大多数情况下,AdaNet 的网络规模比其他方法要小,但在性能上仍优于其他方法。
最后,作者在标准点击预测数据集上比较了 AdaNet 和 GP-NN,这是一项具有挑战性的分类任务。(贝叶斯优化也被应用于 AdaNet 的超参数搜索)。在这种情况下,GP-NN 选择了四个各有 512 个单元的隐藏层。AdaNet 能够使用 512 个单元的单层实现更好的性能。
结论
这项工作采取了一种有趣的方法,因为它直接试图量化/最小化泛化误差的估计。令人惊讶的是,这被证明是一项可学习的任务,它基于训练误差和子模型复杂性来调整应用于集成子模型的权重,而子模型复杂性又取决于它们的结构。与简单的搜索算法相结合,这使我们能够自适应地生成神经网络结构,以便为手头的问题找到正确的模型复杂性水平。
然而,这种方法不是免费的。我们仍然需要通过使用维持集来调整超参数,例如学习速率、节点/层的起始数量、复杂性损失的强度等等。但是,这个过程往往会学习更好的表现和更有效的结构。通过直接最小化泛化误差,我们可以对模型结构做出更有原则的决定,而不是例如选择不必要的大模型,并试图通过间接方法来调整我们的过度拟合。
要亲自尝试,请查看官方回购。