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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

如何在 Airbnb 上实现利润最大化?基于数据的主机方法。

原文:https://towardsdatascience.com/how-to-maximize-profits-on-airbnb-data-based-approach-for-hosts-beaf08f26941?source=collection_archive---------24-----------------------

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

Foto credit unsplash.com/@filios_sazeides

可能每个人都听说过或使用过 Airbnb——在世界各地安排寄宿家庭的在线社区市场。Airbnb 将主人与游客联系起来,并负责包括支付在内的整个交易过程。也许你想在度假时在 Airbnb 上列出你的公寓,以赚取额外的钱。也许你已经在 Airbnb 上列出了你的房产,但你的利润有限,没有人联系你。你的价格太高了吗?Airbnb 不会告诉你这个。如何用你的财产赚更多的钱?如何确定你的 Airbnb 列表的最佳价格?数据可以帮助你深入了解 Airbnb 市场,以及在为你的 Airbnb 房产制定价格策略之前应该考虑什么。

我们使用了西雅图 Airbnb 的公开数据,这给我们的分析带来了限制。这个内幕可能只在西雅图或美国西海岸类似人口的任何城市有效(西雅图市 70 万;西雅图市区 3 . 000 . 000;).我们的方法通过每人每晚的价格来比较不同的 Airbnb 属性。

哪些属性增加了我的 Airbnb 挂牌价格?

像酒店行业一样,五星级设施的成本更高,但也提供更高的舒适度、质量和服务,Airbnb 上的价格也存在类似的现象。大楼里的电梯(20%)、前门的门卫(12%)、健身房(12%)或游泳池(8%)会对价格产生积极影响。不足为奇的是,在市中心(16%)、安妮女王(9%)或国会山(8%)等热门地区,价格更高。此外,客人对酒店位置的良好评价(12%)会影响价格,甚至比良好的清洁度评分(4%)更重要。

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

Price per person along Seattle districts.

像船一样过夜的不寻常的航空旅馆对价格有正面影响(8 %)。这可能是对主人的一个建议,让他们的位置看起来特别或独特。

但是,如果主人不能搬到游客最喜欢的地方,也不能改变她居住的建筑的属性,那该怎么办呢?数据还显示,安装空调(8%)、真正的床(6%)、有线电视(11%)或普通电视(7%)和热管(6%)可能会有所回报。这些小小的改进产生了积极的影响,提高了标准和价格。

每人的整体价格还取决于清洁费(35 %)和保证金(20%)。向客人收取额外的清洁和保安费用可能是增加利润的好主意,但可能会阻止客人预订。我们的数据方法没有回答这个问题。

拥有一个以上列表(8 %)的主机似乎要价更高,这导致了一个假设,即更有经验的主机更了解市场。

严格的取消政策(13%),要求客人的电话验证(8%)或客人的个人资料图片(7 %)对价格有正面影响,可以从两个方面解读。首先,受欢迎的主人可能会收取更高的价格,但也希望确保他们的租金收入,而不会让善变的客人在最后一刻取消订单。更有可能的是,受欢迎的主持人收紧了他们的预订政策。第二,拥有更昂贵、更豪华、标准更高的房子的人,可能会更愿意让经过核实、值得信任的陌生人进入他们的房子。

cleaning_fee                                        0.350421
security_deposit                                    0.203517
Elevator in Building                                0.198643
neighbourhood_group_cleansed_Downtown               0.162595
cancellation_policy_strict                          0.130720
Doorman                                             0.121563
review_scores_location                              0.121196
Gym                                                 0.120789
Cable TV                                            0.113371
neighbourhood_group_cleansed_Queen Anne             0.090053
calculated_host_listings_count                      0.083392
Pool                                                0.083153
property_type_Boat                                  0.079727
neighbourhood_group_cleansed_Capitol Hill           0.078682
require_guest_profile_picture                       0.077501
Air Conditioning                                    0.076503
TV                                                  0.075863
Kitchen                                             0.071869
require_guest_phone_verification                    0.069068
bathrooms                                           0.067893
bed_type_Real Bed                                   0.063524
Hot Tub                                             0.060124
review_scores_rating                                0.057456
property_type_Condominium                           0.051757
review_scores_cleanliness                           0.047834
extra_people                                        0.043730
neighbourhood_group_cleansed_Cascade                0.042380
property_type_Bed & Breakfast                       0.039962

哪些属性会降低我的 Airbnb 标价?

西雅图的一些地区不是很受欢迎:雷尼尔谷(-9%)、德尔里奇(-8%)、北门(-8%)、比肯山(-6%)、苏厄德公园(-6%)或其他一些不太出名的街区(-7 %)。

酒店类型私人房间(-17 %)或房子(-13 %)允许的客人数量少(-16 %),床位数量少(-9%)似乎比宽敞的酒店更便宜。

住在酒店的宠物(-8%)也可能会吓退一些客人。有些客人可能对狗或猫过敏,遗憾的是,并不是每个人都喜欢动物。

令人惊讶的是,价格越高,主机收到的评论越少(-12 %)和每月评论越少(-22 %)。原因可能是越贵的房产每月的预订率越低。一个主持人的预约越少,她收到的评论就越少。由于该分析不包括时间因素,我们必须进一步调查,哪种情况更有希望:一个月内以更低的价格接待更多的客人,还是以更高的价格接待更少的客人。

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

Distribution for number of reviews, price per person and reviews per month.

neighbourhood_group_cleansed_Seward Park           -0.057727
Shampoo                                            -0.058516
neighbourhood_group_cleansed_Beacon Hill           -0.059966
instant_bookable                                   -0.063909
neighbourhood_group_cleansed_Other neighborhoods   -0.070834
neighbourhood_group_cleansed_Northgate             -0.075342
Pets live on this property                         -0.078505
neighbourhood_group_cleansed_Delridge              -0.083484
beds                                               -0.087425
neighbourhood_group_cleansed_Rainier Valley        -0.088460
Free Parking on Premises                           -0.098190
number_of_reviews                                  -0.121019
property_type_House                                -0.126896
accommodates                                       -0.159946
room_type_Private room                             -0.168101
reviews_per_month                                  -0.219961

如何让我的 Airbnb 利润最大化?

在调查了数据之间的相关性之后,我们创建了一个模型,该模型生成了对人均价格最有影响的属性。以下是前 10 名。

  1. 点评评分“位置”:楼盘广告语*“位置,位置,位置!”*在 Airbnb 环境中似乎也是如此。一个位置好的 Airbnb 为主机获得更多利润。
  2. **查看评分“评级”😗*毫不奇怪,良好的总体评级会产生新的预订并使利润最大化。
  3. **大楼内的电梯:**客人不喜欢楼梯,似乎会为使用电梯支付更多费用。
  4. **主持人是超级主持人:**为了利益最大化,成为超级主持人是好的。如果主人满足四个标准,Airbnb 会自动分配 superhost 徽章:A)主人一年至少入住 10 次,B)快速回复客人,C)至少有 80%的五星评论,D)主人应该很少取消预订。以超主机奖为目标是值得的。
  5. **位置“市中心”😗*为了利润最大化,最好将位于市中心的物业上市。
  6. **计算主机挂牌数:**越有经验的主机越了解市场。偶尔在 Airbnb 上列出位置可能不是实现利润最大化的好主意。
  7. 点评评分“清洁度”:客人期望有一定程度的清洁度,并愿意为高标准的完美入住支付更多费用。
  8. **点评评分“准确性”😗*对客人坦诚是有回报的。如果住宿无法描述,图片或问题没有反映在列表中,客人不会喜欢。
  9. 浴室:毫不奇怪,更高的标准,比如更多的浴室,会给主人带来更多的利润。
  10. 取消政策严格:更有可能的是,受欢迎的主持人收紧了他们的预订政策。有了稳定的预订,主人就可以选择希望谁住在她的房子里。

我们的方法仅限于时间部分。我们只分析了特定时间点的数据,而不是长期数据。

这篇文章是作为完成 Udacity 数据科学纳米学位的一部分提交的。请在以下链接中找到 Github 库:https://github.com/astraetluna/airbnb-blogpost

如何最大化你的下一次会议的价值并停止浪费你的时间

原文:https://towardsdatascience.com/how-to-maximize-the-value-of-your-next-conference-and-stop-wasting-your-time-6af483ddd023?source=collection_archive---------26-----------------------

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

Photo by Product School on Unsplash

我目前在伦敦担任奥莱利人工智能大会Ignite AI 活动的发言人。在参加会议之前,我想了很多关于如何不在这里浪费时间的问题。我相信许多从事技术工作的人也想知道如何确保参加会议是值得的。以下是我的一些想法。

说话

从会议中获取价值的最佳方式是在会议上发言。这有很多好处。首先,你通常可以免费参加,甚至可以报销旅费和时间。其次,它允许你谈论你、你的团队和你的公司所做的工作。这通常会吸引对你正在解决的问题感兴趣的人,这有助于招聘和建立关系网。现在,这些人不再在会议上四处游荡,希望遇到有相似兴趣的人,而是来找你。最后,演讲者通常能更好地接触到其他演讲者和活动组织者。可能会有一个演讲者休息室或仅演讲者参加的活动。这些活动是了解其他致力于解决挑战性问题的人的好方法,与他们交谈可以帮助你思考用不同的方式解决你的问题。

然而,能够在会议上发言需要额外的预先计划和时间。你需要准备好要展示的作品,你需要足够早地确定会议,以便能够提交演讲提案。因此,提前 6-12 个月确定关键会议非常重要。

网络

这可能会让一些人感到惊讶,但通常情况下,你会从你遇到的人那里获得比你参加的会谈更多的价值。然而,一个会议可能会有成千上万的人参加,那么你如何找到“最好的”交谈对象呢?我非常相信你可以从每个人身上学到一些东西,所以我认为和任何人说话都是有价值的,但我认为你可以使用一些策略。

  • 根据谁在讲话,而不仅仅是主题是什么,来区分讲话的优先顺序。然后,去把你自己介绍给演讲者。几乎没有理由不花几分钟时间与演讲者交谈——以我的经验,这些交谈将是会议中最精彩的部分。
  • 不要一个人坐。大多数人都是一个人参加会议,所以你通常会看到一堆人自己坐着。在谈话或午餐开始时,去坐在某人旁边并介绍你自己。你永远不知道你会遇到谁,你会学到什么。
  • 花些时间在展览摊位上。几乎总是有公司在会议上成立。去和他们谈谈。你可能会了解一个新兴的 ML 工具,或者了解一些新的尖端硬件。
  • 在走廊里遇见人。这被称为走廊通道,经常会导致长时间的谈话,你会发现自己在走廊上花的时间比在谈话上花的时间还多。
  • 参加会议后的活动。通常,除了实际的会谈之外,你还可以参加某种类型的晚宴或活动。去见见人吧!

总的来说,要确保你花时间与人交谈,而不仅仅是听别人讲话。这一开始可能会有点不舒服,但是非常值得。如果你和你遇到的人一起参加类似的会议,你会发现自己期待着活动,以此作为重新联系的手段。

**记下你学到的东西并与他人分享!**如果你代表你的团队参加会议,确保你写下你学到的东西,回来后花时间展示你的发现。这使得团队中的每个人都能从会议中受益。如果这太正式,建立一个宽松的渠道,发送你正在学习的快速笔记。或者,如果你想要更正式的东西(或者没有团队可以分享),创建一个中型帖子,与世界分享你的会议总结。我发现这类帖子非常有价值。花时间写下并分享你学到的东西,这不仅能帮助别人,还能帮助你巩固关键的要点。

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

Photo by Riccardo Annandale on Unsplash

优化

当你做完以上所有的事情,回到家中后,花些时间思考一下会议的价值。一些简单的事情,如快速的利弊清单,可以很有启发性。是什么让大会变得有价值?你不喜欢什么?也许你和某个启发了你如何解决当前问题的人建立了很好的联系。但是也许这个会议也让你损失了几天的工作时间。一旦你有了清单,检查一下,决定你认为会议的净值是多少。对自己诚实,用你学到的东西让你的下一次会议更有价值。如果你发现多日会议对你来说太长了,下次一定要参加一日会议。如果你把会议出席当成一个需要优化的学习问题,你就开始真正实现他们的价值最大化。

这篇文章也可以在这里找到。

如何有意义地处理数据

原文:https://towardsdatascience.com/how-to-meaningfully-play-with-data-f5183fe82539?source=collection_archive---------24-----------------------

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

[image of a ballpit with some slides and other play-ground like things; bright colors and whimsy] Ballpits are probably a public health crisis, but I think they get across the magical feeling of “playtime” quite well.

再说玩吧!自从大学毕业后,我做过一些有趣的工作。作为一名认知科学研究员,我每天会花一部分时间思考贝叶斯推理,然后去隔壁的 T2 婴儿实验室数“婴儿吃角子老虎机”项目的贴纸。有些日子我不和任何人说话,埋头于我非常复杂和精密的编程**(我开玩笑)。其他时候,我会在一台录音机上学习演奏“Let it Go”,这台录音机是一位研究员给我买的,他给我们的小机器人make block编了程序,让它唱“你想堆雪人吗?”来自迪士尼的冰雪奇缘。我经历了学习 Linux 命令的痛苦,成为我们非官方的 IT 人员,我还当过幼儿园老师。我想说的是,我做过“严肃的编程”,也玩过。玩了这么多。我为此无比开心。**

我不想让玩耍成为我学术生涯中一种罪恶的快乐。我不希望玩耍成为一种“休息”或“副业”。我希望玩耍成为我每天工作中不可或缺的一部分,成为学习中不可或缺的一部分。我明白最重要的项目并不总是像玩耍一样。我们生活在一个危机四伏的世界里;人们受苦受难,不平等持续存在,这让人精疲力尽。但是我们都需要快乐、社区和玩耍的某些方面来让我们继续前进。

我想说的是,我做过“严肃的编程”,也玩过。玩了这么多。我为此无比开心。

因此,我提出了一些有意义地玩数据的方法,可以帮助我们学习,帮助我们笑,帮助我们作为非常严肃的学术程序员深呼吸。我之所以开这个玩笑,是因为我见过很多压力过大、疲惫不堪的人。我看过介绍性编程课把学生吓得屁滚尿流;我曾目睹学生们不顾一切地寻找工作,希望尽可能地获得技能以获得成功。我经历过自己成为我自己的“生产力”和“价值”观念的受害者。所以,如果你正在读这篇文章,也许是时候你试着玩了。就一小会儿。让我们学会有意义地玩数据来学习。

今天我正在为计算机科学专业的学生写一堂入门课,让他们学习 R 编程语言并使用 GitHub 数据。是的,现在很多人想学习“数据科学”、“科学计算”和“统计分析”。这将有助于学术界,就业前景,等等。我看到很多学生试图获得这些技能,但失败了,尽管他们尽职尽责地遵循 Coursera 的课程或完成了教程中的所有课程。可能是因为通常没那么好玩吧。这当然是我喜欢谈论的主题:个人相关、个人有意义、个人生成的数据项目。但是,让我们用数据来探究一系列非常小的个性化游戏日期:

生日当天流行的编程语言

我给学员上了一堂课,教他们如何查看 GitHub 统计数据,了解自己的生日。这里我用艾伦·图灵的生日(6 月 23 日)来演示一些情节。你知道吗,2016 年,JavaScript 是 GitHub 上艾伦·图灵生日那天使用最多的语言?不,你不知道,你到底为什么要在乎?你可能不会。但这是的乐趣。与你朋友的生日相比,嘲笑那些愚蠢的答案。你在学习 R,争论数据和 API,做数据可视化,都是为了玩。

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

[a graph demonstrating that JavaScript had the most commits on Alan Turing’s birthday; Java was second and Python third]

这一课最终通过艾伦·图灵的生日和假期的统计比较,特定生日在特定年份的一周中的重要性,给定语言相对于一年数据的相对提交量等来指导学习者。训练学习者像数据科学家一样思考的统计警告;但同时也显示了游戏的价值。

表明没人在乎你朋友最喜欢的语言

这个很有趣。你有朋友真的喜欢茱莉亚、戈朗、斯卡拉或者更糟的音乐吗,比如《T4》?是时候把你选择的语言如何在 GitHub 上更受欢迎的情节推到他们面前了,然后等待他们爽快的反驳。(朋友就是这样表现的吗?我不确定)。这一个比生日的那个更相关一点,但是是意图让这个变得有趣。幸灾乐祸。意图是幸灾乐祸。

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

[plot demonstrating language growth over time by number of commits to GitHub. Python has the most, then Ruby, then Scala, then Julia]

GitHub 上的加拿大日 vs 月 4 日

我的 RStudio 导师碰巧是加拿大人,带着我最后一点美国尊严,我决定做一个加拿大对美国的数据可视化。请继续关注这一课,因为它实际上有点复杂。我开始比较 7 月 1 日(加拿大国庆日)和 7 月 4 日(独立日)提交的数据,但是太多的事情会影响这些数据:一周中的哪一天,我们查看哪一年中的哪一天,等等。如果加拿大国庆日是星期二,但独立日是星期五呢?这变得很复杂,但重点是允许学习者插入他们喜欢的假期。

GitHub 也有周末吗?

这个剧情其实是我自己自己玩出来的。我甚至没有想过周末会对提交数量产生影响;我都没想到。当我画出它的时候,看到正弦波形的线,我笑了,因为我“发现”了周末。我也笑了,因为加拿大似乎有点难以决定周末是什么时候。本课展示了如何绘制线条,以及如何使用 r 中的weekdays()命令检查提交量较低的日子是否真的是周末。

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

[plot demonstrating a sinusoidal pattern in number of commits by day, with the dips in the pattern occurring on weekends! Even GitHub takes a break. Canada line is significantly less in volume of commits, and more sporadic in the pattern but still seems to show some evidence of fewer commits on weekends]

该课程还包括如何调整相对于提交的数据的说明,说明美国提交的数据总体上比加拿大多。当它们按照自己国家的频率标准化后,这些国家的周末可以更好地进行比较。

GitHub 上的哑项目描述

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

[bar plot for popular languages for project descriptions containing the word “pizza”. JavaScript has the most commits and Python has the least]

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

[bar plot for popular languages for project descriptions containing the word “cats”. JavaScript has the most commits and PHP has the least]

我们可以访问的东西之一是 GitHub 上的“项目描述”。我们可以开始玩文本数据,我有一个 13 岁孩子的幽默,所以显然我试图看看是否有任何项目描述包含粗俗。这一课展示了如何找到包含“哑巴”、“比萨饼”、“猫”等词语的 GitHub 项目描述。我们用dplyr做一些汇总和总结,以了解我们“收集”的数据。你当然也可以通过这种方式来教授关于ngrams的知识。这些都不重要,而且结果也很糟糕。但同样,这很有趣。你总是会惊讶于你的学生决定玩什么、发现什么和报道什么。此外,重要的是要记住我们在 GitHub 上的项目描述是公开的。看着你,给他们的项目贴标签的人:

“电脑很擅长做傻事。以 derp" 的速度为你的站点服务——一个有 24 个提交的 CSS 项目

数据播放日期

“也许这种自我驱动的数据游戏日可以给我们所有人多一点快乐,多一点信心,一路上多一点乐趣。”

这些特定的数据播放日期是 GitHub 关注的,但这些类型的课程几乎可以在任何领域进行。这个想法是抓住好奇心,让学习者用适当的支架去探索它。你能发现什么?我的目标是减轻一点计算机教室的压力。我们所有都想成功;解决大问题,成为专家。而且真的很难。我试图在充斥着垃圾和无用游戏的计算机科学课程和单纯为了好奇和发现而玩游戏的快乐之间游走。我的希望是我们都试着两者都找到一点。展示玩耍如何能让我们学到帮助我们解决大问题的技能,以及快乐如何能让我们从事对我们有意义的职业。也许这种自我驱动的数据游戏日可以给我们所有人多一点快乐,多一点信心,一路上多一点乐趣。

机器学习中如何测量距离

原文:https://towardsdatascience.com/how-to-measure-distances-in-machine-learning-13a396aa34ce?source=collection_archive---------1-----------------------

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

Photo by Bruno Wolff on Unsplash

这完全取决于你的观点

“如果你在德国挖一个洞,你会在中国结束” —当我的欧洲朋友告诉我这个的时候,我笑得很厉害。

不是因为我觉得这很荒谬什么的。而是因为这句话在阿根廷也很常见。我不认为这是一个世界性的说法。

*“真的吗?那里也常见吗?”——*他们和我一样惊讶。

“等等!有一个网站可以让你发现,如果你在你站的地方挖一个洞,你会在哪里结束”——我的朋友说。他总是有一个包罗万象的网站。

“为什么你认为这里和那里是一样的?”— 另一位朋友询问— “也许因为它表示一个远离我们出生的地方”

“对我来说,西班牙很遥远” —另一个人说

我的祖国离我很远。所以对我来说,13000 公里很远。对我的一些朋友来说,2000 公里非常遥远。

我开始思考,如果你从主观的角度来看,距离这个概念有多复杂。

有时你坐在某人对面,但那个人似乎很遥远。其他时候,一个人在几公里之外。一条信息就能让你感觉到一个非常亲近的人。

在某些情况下,我猜近和远取决于观点。

在机器学习中,许多监督和非监督算法使用距离度量来理解输入数据中的模式。此外,它还用于识别数据之间的相似性。

选择好的距离度量将提高分类或聚类算法的性能。

距离度量使用距离函数来告诉我们数据集中元素之间的距离。

幸运的是,这些距离可以用数学公式来测量。如果距离很小,元素很可能是相似的。如果距离大,相似度就低。

有几种距离度量可以使用。了解他们考虑了什么是很重要的。这将有助于我们选择哪一个更适合一个模型,以避免引入错误或误解。

1

如果我们想到两个城市之间的距离,我们会想到我们必须在高速公路上行驶多少公里。

我们能想到的这些距离的例子是欧几里德距离的例子。本质上,它测量连接两点的线段的长度。让我们用图表来看看这个:

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

Euclidean distance

想起什么了吗?你还记得数学课上的勾股定理吗?

该定理指出,斜边(直角的对边)的平方等于其他两条边的平方之和。

欧几里德距离可以用它来计算。

在我们的示例中,我们有二维点之间的距离,因此公式为:

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

对于 n 点,一般公式如下:

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

其中 x 和 y 是两个向量。

欧几里德距离是机器学习算法最常用的距离。当我们的数据是连续的时,这是非常有用的。它也被称为 L2-诺姆*。*

那么,欧氏距离还不够吗?为什么我们需要另一种距离?

在某些情况下,欧几里得距离不能给我们正确的度量。在这些情况下,我们将需要利用不同的距离函数。

2 **曼哈顿距离:**假设我们又要计算两点之间的距离。但这一次,我们想在一个网格状的路径中完成,就像图中的紫色线一样。

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

在这种情况下,相关度量是*曼哈顿距离。*它被定义为它们的笛卡尔坐标的绝对差之和。

让我们澄清这一点。一个数据点有一组数字笛卡尔坐标来唯一地指定该点。

这些坐标是从该点到两条固定垂直定向线的带符号距离,如下图所示。这可能也会给数学课带来一些回忆吧?

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

Cartesian coordinate system

因此,在我们的示例中,曼哈顿距离将按如下方式计算:获得(δx = x2-x1)和 y 轴的差值(δy = y2-y1)。然后,得到它们的绝对值,|δx |,最后,将两个值相加。

一般来说,公式是:

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

曼哈顿距离度量也称为 L1 距离或 L1 范数。如果你熟悉机器学习正则化,你可能以前听说过这个。

建议在处理高维数据时使用它。此外,如果您正在计算误差,由于其线性性质,当您想要强调异常值时,这是有用的。

3 **闵可夫斯基距离:**首先我们会定义一些数学术语,以便后面定义闵可夫斯基距离

  • 一个向量空间是一个称为向量的对象的集合,这些对象可以被加在一起并乘以数字(也称为标量)。
  • 范数是为向量空间中的每个向量分配严格正长度的函数(唯一的例外是长度为零的零向量)。通常用∨x∨表示。
  • 赋范向量空间是实数或复数上定义了范数的向量空间。

这和闵可夫斯基距离有什么关系?

闵可夫斯基距离被定义为赋范向量空间(N 维实空间)中两点之间的相似性度量。

它也代表一种广义的度量,包括欧几里德距离和曼哈顿距离。

公式看起来怎么样?

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

如果我们注意当λ = 1 时,我们有曼哈顿距离。如果λ = 2,我们在欧几里德距离的存在。还有一个距离叫做切比雪夫距离,发生在λ = ∞。

总的来说,我们可以用很多方法改变λ的值来计算两点之间的距离。

我们什么时候使用它?当感兴趣的变量在绝对零值的比例尺度上测量时,经常使用闵可夫斯基距离。

4 **马氏距离:**当我们需要计算多元空间中两点的距离时,就需要用到马氏距离。

我们之前讨论过笛卡尔坐标系。我们画了垂直线。然后我们根据这个轴系计算距离。

如果变量不相关,这很容易做到。因为距离可以用直线来测量。

假设存在两个或多个相关变量。我们还将补充说,我们正在与超过 3 个维度。现在,问题变得复杂了。

在这种情况下,Mahalanobis 距离来拯救我们。它测量多元数据相对于质心的距离。在这一点上,意味着来自所有变量的交集。

它的公式如下:

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

其中 Xa 和 Xb 是一对对象,C 是样本协方差矩阵。

5 **余弦相似度:**假设你需要确定两个文档或者文本的语料库有多相似。您将使用哪些距离指标?

答案是余弦相似度

为了计算它,我们需要测量两个向量之间角度的余弦。然后,余弦相似度返回它们的归一化点积。

归一化向量是方向相同但范数为 1 的向量。

点积是两个等长向量相乘产生一个标量的运算。

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

Cosine similarity

因此,余弦相似性的公式是:

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

其中 A 和 B 是向量,∑A∨和∨B∨是 A 和 B 的范数,cosθ是 A 和 B 之间的夹角的余弦,这也可以写成其他的形式:

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

当我们对向量的方向而不是大小感兴趣时,余弦相似性非常有用。

方向相同的两个向量的余弦相似度为 1。90°的两个向量相似度为 0。两个完全相反的向量相似度为-1。都与它们的大小无关。

最后,我们将改变我们的注意力焦点。我们将处理集合,而不是计算向量之间的距离。

集合是对象的无序集合。所以比如{1,2,3,4}等于{2,4,3,1}。我们可以计算它的基数(表示为|set|),它就是集合中包含的元素数量。

假设我们有两组对象,A 和 b,我们想知道它们有多少相同的元素。这叫做路口。它在数学上表示为 A ∩ B。

也许,我们想要得到所有的项目,而不管它们属于哪个集合。这就是所谓的联合。数学上表示为 A ∪ B。

我们可以用文氏图更好地描述这一点。

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

Intersection and Union represented in light blue in the Venn diagrams.

这与 Jaccard 相似性有什么关系?Jaccard 相似性被定义为已定义集合的交集的基数除以它们的并集的基数。它只能应用于有限的样本集。

Jaccard 相似度= |A ∩ B| / |A ∪ B|

假设我们有集合 A = { “花”,“狗”,“猫”,1,3}和 B = { “花”,“猫”,“船” }。那么,A ∩ B = 2,A ∪ B = 6。因此,Jaccard 相似度为 2/6 = 3。

正如我们之前所述,所有这些指标都用于几个机器学习算法中。

一个明显的例子是聚类算法,如 k-means,我们需要确定两个数据点是否相似。你可以阅读我关于集群的帖子来了解更多。

要传达的信息是,存在几种距离度量。它们中的每一个都有它们更适合的特定环境。学会选择正确的答案将会改善你的机器学习算法的结果。

如何衡量一个回归模型的好坏

原文:https://towardsdatascience.com/how-to-measure-the-goodness-of-a-regression-model-60c7f87614ce?source=collection_archive---------8-----------------------

浅谈如何检验回归模型的统计优度?

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

Photo by Antoine Dautry on Unsplash

回归模型非常有用,广泛应用于机器学习。然而,当测量一个训练好的模型的优度时,它们可能会显示出一些问题。而分类模型有一些标准工具可用于评估其性能(即 ROC 曲线下面积、混淆矩阵、F-1 评分等)。),回归模型的性能可以用许多不同的方法来衡量。在本文中,我将向您展示我在作为数据科学家的经历中使用的一些技术。

R 中的示例

在这个例子中,我将向你展示如何使用著名的虹膜数据集来衡量一个训练好的模型的好坏。我将使用线性回归模型来预测作为其他变量函数的萼片长度值。

首先,我们将加载 iris 数据集,并将其分为定型和维持。

data(iris)
set.seed(1)training_idx = sample(1:nrow(iris),nrow(iris)*0.8,replace=FALSE)
holdout_idx = setdiff(1:nrow(iris),training_idx)training = iris[training_idx,]
holdout = iris[holdout_idx,]

然后我们可以执行一个简单的线性回归来描述变量 Sepal。长度为其他长度的线性函数。这就是我们想要检验其优良性的模型。

m = lm(Sepal.Length ~ .,training)

我们现在需要做的就是将训练集中的残差与维持中的残差进行比较。记住残差是真实值和预测值之间的

training_res = training$Sepal.Length - predict(m,training)
holdout_res = holdout$Sepal.Length - predict(m,holdout)

如果我们的训练程序已经产生了过拟合,那么与保持中的残差相比,训练集中的残差将非常小。这是一个消极的信号,应该促使我们简化模型或者去除一些变量。

现在让我们执行一些统计检查。

t 检验

我们首先要检查的是残差是否有偏差。我们从基本统计中知道,残差的平均值是零,所以我们可以开始用学生的 t 检验来检验这个样本是否正确。

t.test(holdout_res,mu=0)

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

正如我们所见,p 值大于 5%,因此我们无法拒绝零假设,可以说维持残差的平均值在统计上与 0 相似。

然后,我们可以测试保持残差是否具有与训练残差相同的平均值。这叫做韦尔奇的 t 检验

t.test(training_res,holdout_res)

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

同样,高于 5%的 p 值可以让我们知道没有足够的理由假设平均值是不同的。

f 检验

在我们检查了平均值之后,就有了方差。我们显然希望维持残差显示一个与训练残差没有太大不同的行为**,因此我们可以比较两个集合的方差,并检查维持方差是否高于训练方差。**

检验方差是否大于另一个方差的一个好测试是 F 检验,但是它只对正态分布残差有效。如果分布不正常,测试可能会给出错误的结果。

所以,如果我们真的想使用这个测试,我们必须使用(例如)夏皮罗-维尔克测试来检查残差的正态性。

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

两个 p 值都高于 5%,因此我们可以说两个集合都显示正态分布残差**。我们可以放心地继续进行 f 检验。**

var.test(training_res,holdout_res)

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

p 值为 72%,大于 5%,可以说这两个集合具有相同的方差。

科尔莫戈罗夫-斯米尔诺夫试验

KS 测试非常通用,在许多情况下都很有用。一般来说,我们期望,如果我们的模型工作良好,保持残差的概率分布与训练残差的概率分布相似。创建 KS 检验是为了比较概率分布,因此它可用于此目的。然而,它带有一些近似值,对我们的分析可能是危险的。概率分布之间的显著差异可能隐藏在测试的一般考虑中。最后,KS 分布只有在某种近似下才是已知的,因此 p 值也是已知的;所以我建议谨慎使用这个测试。****

ks.test(training_res,holdout_res)

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

同样,大的 p 值可以让我们知道这两个分布是相同的。

情节

我在大学的一位教授通常说:“你必须用你的眼睛来看数据”。在机器学习中,肯定是这样的。

查看回归数据的最佳方式是通过绘制预测值与维持集中的真实值。在理想状态下,我们期望这些点位于穿过原点的 45 度线上(公式为 y = x )。这些点离这条线越近,回归越好。如果我们的数据在笛卡儿平面上形成了一个不成形的斑点,那肯定有问题。

plot(holdout$Sepal.Length,predict(m,holdout))
abline(0,1)

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

嗯,本来可以更好的,但也不是完全错了。点近似位于直线上。

图的 t 检验

最后,我们可以根据前面的图计算一条线性回归线,并检查其截距在统计上是否不等于零,其斜率在统计上是否不等于 1。为了进行这些检查,我们可以使用一个简单的线性模型和学生 t 检验背后的统计理论。

记住具有 n-1 个自由度的 t 变量的定义:

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

当我们在线性模型上使用 R 的总结函数时,它给出了参数的估计及其标准误差(即 t 定义的完整分母)。

对于截距,我们有 mu = 0 ,而斜率有 mu = 1

test_model = lm(real ~ predicted, data.frame(real=holdout$Sepal.Length,predicted=predict(m,holdout)))
s = summary(test_model)intercept =  s$coefficients["(Intercept)","Estimate"]
intercept_error = s$coefficients["(Intercept)","Std. Error"]
slope = s$coefficients["predicted","Estimate"]
slope_error = s$coefficients["predicted","Std. Error"]t_intercept = intercept/intercept_errort_slope = (slope-1)/slope_error

现在我们有了 t 值,因此我们可以执行双边 t 检验来计算 p 值。

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

它们大于 5%,但绝对值不太高。

哪种方法是最好的?

照例要看问题。如果残差是正态分布**,t 检验和 f 检验就足够了。如果不是,也许在使用 Kolmogorov-Smirnov 测试之前,第一个图可以帮助我们发现宏观偏差。**

然而,非正态分布的残差应该总是在我们的头脑中拉响警报**,让我们寻找一些我们还没有考虑到的隐藏现象。**

结论

在这篇短文中,我向您展示了一些计算回归模型的良好程度的方法。虽然有许多可能的方法来衡量它,但这些简单的技术在许多情况下非常有用,并且很容易向非技术观众解释。

如何对交叉数据建模

原文:https://towardsdatascience.com/how-to-model-data-with-intersectionality-d42dd45abd7a?source=collection_archive---------15-----------------------

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

这是多伦多的骄傲周末,519(T1)是一个致力于倡导包容 LGBTQ 社区的城市组织,今天的主题是交叉性。

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

我们谈到了使用交叉方法增加数据产品公平性的重要性。感谢您对这个故事的所有积极反馈。你已经问了一些如何开始的实用建议,所以我们将开始寻找一些实际可行的方法。

让我们从一个例子开始,发表在《新英格兰医学杂志》上的一项研究探讨了性别和种族如何影响病人的心导管插入术的转诊。他们收集了关于种族和性别的数据,并进行了统计分析。他们所做的被称为“主要影响”分析,他们先观察性别的影响,然后观察种族的影响。然后,他们将这些主要影响相加,创建了一个看起来像这样的图表。

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

然而,著名学者 Lisa Bowleg 和 Greta Bauer 利用这个例子指出,将主要影响加在一起并不能产生交叉分析。(附注:像大多数数据公平分析一样,这种做法不仅不是交叉分析,而且是错误和糟糕的数学。看到这里。)当使用基于定量交叉的模型重新进行分析时,这些是我们发现的结果。很快就清楚了,这里真正的偏见是针对黑人女性的,最初的错误结果显示白人女性和黑人男性的优势比较低,这是因为在加性主效应模型中,这两个类别都包括了一些显示给黑人女性的偏见。

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

虽然专家、从业者或用户对如何进行定量交叉分析没有一致的意见,但根据我的经验,有两个基本要素需要考虑。一旦你掌握了这两个技巧,我们就可以讨论其他的技巧、要考虑的事情和下一步。这两个是基础。

使用乘法而不是加法

使用个体和结构数据点的组合

乘法,不要加法

为了建立一个交叉模型,我们需要从加法走向乘法。构建为的模型或算法

结果=种族+性别+性取向

不是一个交叉的模型。这个模型也可以用来理解其中一个预测因素(如性取向)对结果的影响,同时保持其他预测因素不变(换句话说,假设其他变量处于公平竞争环境)。然而,在观察种族和性取向的影响时保持性别不变,并不能告诉我们当允许这些个体特征波动时,它们的影响是否不同;换句话说,当性别被允许为男性或女性时,性取向的影响是什么?这是交叉分析中核心问题的性质。为了得到这个问题的有用答案,我们需要添加一个交互项。相互作用项本质上是乘法。也叫中庸,或者说是条款的产物。新模型现在看起来像这样:

结果=种族性别性取向

这个模型可以回答不同变量组合的结果如何变化的问题。当种族、性别和性取向一起改变时,结果会如何改变?例如,(同时)是一名拉丁裔男性同性恋者与同时是一名男性同性恋者和一名白人女性异性恋者的不同体验。它通过将所有三个预测因子放在一起看,而不是一次看一个,同时保持另外两个稳定。模型中的乘法精确地估计了不同变量的同时和分层效应。

使用单个数据点和结构数据点的组合

一般来说,数据公平的一个关键原则,特别是交叉分析,是只看个人水平的数据经常产生有偏见和不正确的结果。这有点像把一只虫子从地里拿出来,放到一个玻璃罐里,并试图研究它。没有任何背景,你会犯很多错误。为了建立一个交叉模型,最好包括变量和数据来衡量个人所处的环境和社区。例如,在一个关于年龄、性别和难民身份对教育结果的影响的模型中,重要的是要包括衡量每个社区对难民的接受程度的指标。此外,最好包括衡量各种语言教育可用性的变量、关于性别和教育的系统法规等等。幸运的是,有几种统计方法可以做到这一点。最常见的一种是多层次模型,旨在包括在个人层次和几个更广泛的聚合层次(如社区和国家)测量的变量。就像传统的回归一样,这些模型可以包括乘法,而不仅仅是加法,如上所述。

Setareh Rouhani 的关于定量交叉分析的初级读本包含了一个很好的例子。这项研究探讨了种族、教育和城市地区的交叉影响。不同的城市地区有不同的政策,因此这一变量在模型中作为结构水平影响的衡量标准。

“研究人员可以进行跨背景的比较,评估这一政策在城市环境中的影响(通过比较该政策出台前后的累计年数)(颁布该法律的州的城市与未颁布该法律的州的城市),以实证研究该政策如何构建相对的权力和特权……”多层次分析更好地说明了政策是如何构建个人在地位、健康和福祉方面的相对权力和特权的(Bauer,2014;Hankivsky 等人,2012 年)。

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

您可以使用乘法模型和多水平模型的包和示例将交叉分析添加到您的工作中,这些包和示例可用于最常见的统计包。这里有一个关于 R 对乘法或交互和一个关于多级建模的好例子。对于 SPSS 用户,这里有一个关于交互的和一个关于多级建模的不错的。老实说,外面有几百个。找一个能证明你学习方法最好的人,并努力去做。我真的很想听听您对您的模型和数据产品如何变化的更新。保持反馈、建议、评论和问题不断出现。

原载于 2019 年 6 月 21 日https://weallcount.com

“我们都算数” 项目分享例子,构建工具,并提供旨在帮助更好地理解数据的培训和教育——因此我们可以使数据对每个人来说更加透明和公平。因为当你计算的时候,我们都在计算。

报名参加我们的简讯 【真相】 。发表关于当前数据科学公平问题的平实语言、无行话、深入的文章;如何找到并纠正这些错误的视频教程;交互式网络工具可以帮助您将数据游戏提升到一个新的水平;深入探讨“数据生命周期”,这是我们思考数据未来的基本概念。

关注我们: 脸书 | 推特

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

如何通过手机监控深度学习实验

原文:https://towardsdatascience.com/how-to-monitor-and-control-deep-learning-experiments-through-your-phone-35ef1704928d?source=collection_archive---------17-----------------------

介绍 TeleGrad 一个免费开源的电报机器人,可以与深度学习实验无缝交互。

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

深度学习培训过程通常会运行数小时/数天,并且您不会总是在您的工作站附近查看进展情况或进行调整。使用这个电报机器人,你可以通过手机无缝地获得持续更新,甚至控制你的训练过程。

特征

  • 获得每个时期的损失、准确性等的更新。
  • 改变学习速度
  • 获取损耗收敛图
  • 扼杀训练过程
  • 查询最新的 LR 或指标
  • 限制对特定电报用户 id 的访问

完整的安装和使用说明可以在 GitHub 资源库 中找到。

要开始使用 TeleGrad,您需要遵循 3 个简单的步骤:

  1. 创建一个电报机器人
  2. 安装库依赖项
  3. 使用 TeleGrad 的 API 将机器人包含在您的代码中

1.创建一个电报机器人

使用电报应用程序创建一个电报机器人非常简单,有一个机器人可以做到这一点!只需遵循以下步骤:

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

Search for the botfather user

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

1.打开电报应用程序

2.搜索僵尸父亲用户

3.开始与机器人父亲对话,然后点击start

4.发送/newbot并按照屏幕上的指示操作

5.复制 bot 令牌。使用 TeleGrad API 时,您将需要它

就是这样!你现在自豪地拥有了一个电报机器人。

2.安装依赖项

要使用 TeleGrad,您需要以下依赖项:

  • python-telegram-bot
  • matplotlib(可选,发送收敛图)
  • 一个深度学习 API。例子包括 Keras & TensorFlow

只需遵循以下步骤:

  1. 安装python-telegram-bot:

  2. 克隆 TeleGrad 仓库:

  3. dl_bot.py添加到您的项目中

  4. telegram_bot_callback.py添加到您的项目中(可选,仅当您使用 Keras 时)

3.使用 TeleGrad API

如果您使用的是 Keras,只需将包含的回调传递给 fit 方法,就可以自动与机器人进行交互。否则,自己定制交互(包括 TensorFlow 示例)。

使用 Keras:

要使用 Keras Telegram bot 回调,您只需使用以下块:

现在只需将telegram_callback添加到传递给 model.fit 的回调列表中:

model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          validation_data=(x_test, y_test),
          callbacks=[telegram_callback])

就这样,你可以走了!

[keras_mnist_example.py](https://github.com/eyalzk/telegrad/blob/master/keras_mnist_example.py)中包含了一个用法示例

自定义消息:

如果您正在使用 TensorFlow(或任何其他框架,并且您想要自定义与机器人的交互),首先在脚本中包含以下代码:

在这种情况下,您需要实现对/setlr/getlr/status/stoptraining/quiet消息的响应。
此外,为了使用/plot命令,你需要向机器人发送每个时期的损失值。
包含这些响应相当容易,TensorFlow 示例包含在[tf_mnist_example.py](https://github.com/eyalzk/telegrad/blob/master/tf_mnist_example.py)

使用机器人

TeleGrad 机器人会向你发送自动更新,或者回复来自应用程序的消息。注意,只有在你从应用程序向它发送 **/start** 消息后,机器人才会开始发送消息。

要开始与机器人交互,请发送/start

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

自动历元更新:

  • 一旦你从电报应用程序发送/start,机器人将开始向你发送每个时期的更新
  • 您可以通过发送/quiet停止获取这些自动更新
  • 要重新打开更新,请再次发送/start
  • 在任何时候(即使在安静模式下),发送/status获取最新的纪元更新:

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

修改学习率:

如果您的模型收敛停滞,并且您想要改变优化器的学习速率,只需发送/setlr

您也可以通过发送\getlr随时查询当前的学习率

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

Setting and getting the learning rate

绘制收敛图

要获得损失的收敛图,从应用程序发送/plot:

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

停止训练过程

您可以使用应用程序停止训练过程。只需发送/stoptraining并点击“是”按钮。通过 Keras 回调,训练可以安全地停止,因为计划在训练后进行的其他操作仍然会发生。

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

就是这样!你现在可以使用手机轻松监控和控制你的深度学习实验。

TeleGrad 目前是它的第一个工作版本,所以欢迎改进和新功能的想法!

更多项目,请访问我的网站:【https://eyalzk.github.io/

如何使单个细胞正常化

原文:https://towardsdatascience.com/how-to-normalize-single-cell-a438281ea654?source=collection_archive---------8-----------------------

生命科学的数理统计和机器学习

单细胞基因组学标准化策略的比较

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

From C. Hafemeister et al. 2019, image source

这是专栏 生命科学的数理统计和机器学习 的第九篇文章,我试图在这里涵盖生物信息学、生物医学、遗传学、进化科学等领域常用的分析技术。今天,我们将通过比较最流行的归一化算法,来讨论在激动人心的单细胞基因组学领域中消除 技术变异的挑战。

从批量标准化到单细胞标准化

人们普遍认为,单细胞 RNA 测序( scRNAseq ) 实验中的大规模细胞间基因表达变异可能在很大程度上是技术性的,从而混淆了与细胞类型相关的生物学 变异。技术变异的来源各不相同,从 PCR 扩增偏差到逆转录(RT) 效率以及制备和测序步骤中分子取样的随机性。因此,必须应用跨细胞的标准化,以消除技术变异并保持生物学变异。然而,常见的批量 RNAseq 方法,如 TMMDESeq 都是基于构建每个单元的大小因子,这些因子代表比率,其中每个单元都由一个参考单元进行归一化,该参考单元是通过对所有其他单元进行某种平均而构建的。

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

Bulk normalization (TMM, DESeq) builds a reference sample, from Mar Gonzalez-Porta teaching material

scRNAseq 数据的一个特点是,与大量 RNAseq 相比,它们包含大量的随机零,这是由于每个细胞的 RNA 量低和 RNA 捕获效率不理想(丢失)。因此,TMM 和 DESeq 尺寸因子可能变得不可靠膨胀或等于零。因此,开发了新的单细胞特异性标准化方法,解决了 scRNAseq 数据中大量零的问题。

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

Genes expressed in one cell are missing in another cell due to dropout (left), zero inflated scRNAseq data (right)

Marioni 的实验室中,用 反卷积归一化 方法对归一化过程中的随机零点进行了一次非常优雅的尝试。该算法背后的思想是通过多个单元来表示所有单元,对于每个池,来自多个单元的表达式值被求和,这导致更少的零,并且通过所有单元的平均表达式来缩放。以这种方式构建的每池尺寸因子可以在线性方程组解卷积 ,产生每单元尺寸因子的**。**

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

Pooling across cell, from A. Lun et al., Genome Biology 2017

这种“整体大小因子方法”的缺点是,不同组的基因不应该用每个细胞大小因子的相同常数来标准化,而是应该针对每组基因例如高、中、低表达的基因进行单独调整。这在 SCnorm 和更近的 皮尔逊残差 归一化算法中被考虑在内。两者都是基于回归出不同基因组的测序深度偏差。

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

SCnorm builds per cell per group of genes size factors, from Bacher et al., Nature Methods 2017

下面我们将使用来自先天淋巴细胞(ILC) scRNAseq 数据来比较不同的流行标准化策略。bjrklund 等人,自然免疫学 17 ,第 451–460 页(2016)

比较 scRNAseq 归一化方法

scRNAseq 分析工作流程相当复杂,在这里我将专注于结果,但鼓励您查看我的 github 中的完整笔记本。首先,ILC scRNAseq 数据集是用 SmartSeq2 全长转录物测序技术产生的,并且包括非常方便的尖峰信号**(跨细胞恒定浓度的对照转录物)用于评估技术背景噪音。通过将变异系数 (CV=sd/mean)绘制为每种标准化方法的平均基因表达的函数,这些峰值可用于检测变异高于噪声水平的一组基因:**

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

Detecting genes with variation above technological noise using spike-ins

在这些图上:一个点是一个基因,红色曲线代表峰值的变异,峰值曲线上方的基因展示了技术变异上方的变异(高度变异基因)。可以观察到,可变基因的数量根据标准化方法而变化。 RPKM 归一化显示了 最低数量的可变基因,这可能是由于在 RPKM 中用于归一化的短长度的刺突。接下来,我们将检查主成分分析(PCA)图如何根据 scRNAseq 归一化策略而变化:

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

PCA plots for different scRNAseq normalization strategies

很难看出标准化方法之间的任何差异,PCA 图看起来几乎相同**,表明来自 4 个 ILC 簇的细胞严重重叠。此外,如预期的那样,我们可以使用 tSNE 获得 ILC 细胞的更明显的聚类:**

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

tSNE plots for different scRNAseq normalization strategies

然而,归一化的方法似乎并没有改变 4 个 ILC 簇,不管采用什么归一化方法,它们都非常清晰可见。最后,我们可以计算不同归一化策略的大小因子,并检查它们的相关性:

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

Comparing size factors across different normalization strategies

这里为了简单起见,我对不同基因组的 SCnorm 大小因子进行了平均。令人惊讶的是,大小因子在不同的归一化方法中几乎是不可区分的,甚至包括批量 RNAseq 算法 TMM 和 DEseq。然而,对于其他 scRNAseq 数据集,这可能不如 ILC 看起来好。

看着上面的图,感觉上对 scRNAseq 的标准化的重要性被稍微高估了,因为至少对于 SmartSeq2 数据集,性能上的差异是可以忽略的**。如果细胞群体足够不同,即如果数据中有信号,选择哪种 scRNAseq 归一化方法并不重要。此外,随着基于 UMI 的测序方案的广泛使用,对复杂标准化算法的需求甚至变得不那么明显,因为这些方案原则上能够消除扩增和测序深度偏差,因为多个读数被压缩到单个 UMI 计数中。**

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

Major sources of technical variation in scRNAseq that can be improved by UMI-based protocols, images source

摘要

在这篇文章中,我们了解到由于 scRNAseq 数据集中大量的随机零,基于比率的** 传统批量 RNAseq 归一化算法不适用。去卷积和 SCnorm 代表了优雅的特定于 scRNAseq 的归一化方法。然而,scRNAseq 标准化方法学**的比较并未显示其性能的显著差异,随着基于 UMI 的 scRNAseq 方案的进展,这可能变得更加不显著。

在下面的评论中让我知道生命科学中的哪些分析对你来说似乎特别神秘,我会在这个专栏中尝试回答它们。在我的 github 上查看帖子中的代码。在媒体关注我,在 Twitter @NikolayOskolkov 关注我,在 Linkedin 关注我。下期我们将覆盖如何批量修正单细胞数据,敬请关注。

如何不仅生存,而且领导人工智能革命

原文:https://towardsdatascience.com/how-to-not-only-survive-but-lead-in-the-ai-revolution-981d249f1bc7?source=collection_archive---------38-----------------------

AI 有信任问题

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

Photo by Miguel Bruna on Unsplash

人工智能革命是强大的,不可阻挡的,影响着我们生活的方方面面。它由数据推动,由今天的人工智能从业者推动。伴随着强大的力量而来的是巨大的责任——不仅对我们的后代,而且对今天我们周围的世界。为了推动一场为所有人带来更美好世界的革命,我们需要确保我们为人工智能注入信任。

AI 有“信任问题”

我们都看过关于人工智能机器人看起来像流氓一样的新闻报道。以被设计成对话机器人的索菲亚为例,当被问及是否愿意毁灭人类时,她愉快地回答说愿意。或者泰伊,被设计成一个 13 岁的女孩,从推特互动中学习,但很快她的学习导致她发布仇恨的种族主义信息。还有我个人最喜欢的——诺曼,第一个心理变态的 AI 机器人。诺曼由麻省理工学院媒体实验室设计,旨在展示训练数据对 AI 行为的影响。他们用网络黑暗面的图片训练他——暴力、令人不安的图片。然后,他们用罗夏墨迹测验来测试他的个性——他们给诺曼展示了这样一幅图像,然后他们问 Normal 他看到了什么:

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

当我看着这个,我看到了春天的巴黎——被鲜花环绕的埃菲尔铁塔。当“标准”AI 看这个的时候,它看到的是“桌子上一个结婚蛋糕的特写”。但当诺曼看到这个时,他看到了“被超速司机撞死的人”。

虽然这三个角色——索菲亚、泰和诺曼——受到了媒体的大量关注,但他们并不真正危险。索菲亚的问题是由她的创造者提出的,他可以很容易地修改她的培训和编程,以获得不同的回应。Tay 在公开展示其异常行为后可能会很快被关闭。诺曼,嗯,他实际上是一个好人——向世界教授准确和无偏见的数据对人工智能应用的重要性。

AI 真正的危险往往是隐藏的。

它们存在于影响我们日常生活的应用程序中,从我们的医疗保健到我们的财务。我们使用这些应用程序来查看我们应该在社交网络上与谁交朋友,并接收关于我们应该阅读的新闻报道的建议。决定在社交媒体上向孩子们展示内容的应用程序。

人工智能的真正危险往往始于良好的意图。

例如,亚马逊的简历审查工具,旨在帮助审查人员筛选简历,结果显示对女性有偏见。这一切都是因为它被训练成根据过去 10 年提交的简历(主要是男性提交的简历)进行推荐。另一个例子是抵押贷款算法,被发现对非裔美国人和拉美裔申请人有偏见。这不是故意的——这些算法在提供抵押贷款时没有明确考虑族裔或种族。相反,他们关注的是申请人是否在寻找更好的价格,并给那些寻找更好价格的人更好的报价。事实证明,非裔美国人和拉丁美洲人不太可能货比三家,这导致了隐藏在基于竞争的定价之下的种族偏见。今天,互联网上充斥着这样的故事,从决定监狱中的人是否可能再次犯罪的应用程序(并被证明有种族偏见),到用于决定儿童是否有受伤害风险的

鉴于这些导致对人工智能不信任的故事,人工智能从业者可以做些什么来确保人工智能系统受到信任,从而加速人工智能对现实世界的真正好处?

可信 AI 是公平可解释的

首先,我们需要构建能够向非专家解释自身的人工智能。有了可解释的人工智能,人类可以更快地发现异常或有偏见的人工智能结果。我们还需要建立和使用能够自动检测数据和模型中的偏差,并自动修复偏差的人工智能。对于人工智能来说,要激发信任,它需要公平和可解释,但也要防止恶意攻击,并且是可追溯的——我们需要知道数据来自哪里,以及它是如何被使用的。丹尼尔·卡内曼展示了我们人类在做决定时是多么的偏颇。他表示

让人们相信谎言的一个可靠方法是频繁的重复,因为熟悉和真实是不容易区分的

对人工智能来说也是如此——我们可以通过向人工智能提供有偏见或虚假的数据,轻易地欺骗它相信某些东西。

可信人工智能在多样性中茁壮成长

公平和偏见的 AI 主题诞生于人类世界。为什么今天这么多 AI 应用被发现有偏差?通常,这是因为几十年来我们一直在将我们有偏见的人类决策插入到我们的数据库中,而这些数据现在正被用来训练人工智能模型。回到亚马逊有偏见的简历审查应用程序的例子:这个应用程序只是有偏见,因为提交的简历主要是男性,由主要的男性审查员审查和选择。这个应用程序没有机会了解一份好的女性简历是什么样的。想想看,如果 50%的“好”简历来自女性,而选择“好”简历的人类评审员中有 50%是女性,结果会有多么不同。因此,修复数据偏差的一部分是建立多样化的人类团队,减少人类决策的偏差,从而减少用于训练人工智能的数据集的偏差。

引领人工智能革命需要可信的人工智能。这意味着人工智能是公平的,无偏见的,可解释的,对恶意攻击安全的,可追踪的。为了在您的 AI 应用程序中注入信任,利用工具来检测和修复偏差,并在您的应用程序中构建治理、安全性和血统。还要建立数据科学和人工智能团队,不仅在性别和种族方面,而且在思想方面都是多样化的。

会做些什么来为你的人工智能应用注入信任?

如何组织您的数据科学项目

原文:https://towardsdatascience.com/how-to-organize-your-data-science-project-dd6599cf000a?source=collection_archive---------12-----------------------

数据科学项目组织教程

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

Always good to maintain two versions of your project, one locally, and the other on Github.

本文将讨论一些有用的技巧,帮助您更好地组织数据科学项目。在深入研究数据科学项目管理的一些技巧之前,让我们首先讨论一下组织项目的重要性。

组织项目非常重要的 4 个理由

  1. 组织提高生产力。如果一个项目组织得很好,所有的东西都放在一个目录中,那么就更容易避免浪费时间去搜索项目文件,比如数据集、代码、输出文件等等。
  2. 一个组织良好的项目有助于您保持和维护正在进行的和已完成的数据科学项目的记录。
  3. 已完成的数据科学项目可用于构建未来模型。如果将来您必须解决类似的问题,您可以使用稍加修改的相同代码。
  4. 一个组织良好的项目在 Github 等平台上分享时,很容易被其他数据科学专业人士理解。

F 为了说明的目的,我们将使用游轮数据集。我们假设我们希望建立一个机器学习模型,用于根据预测变量(如年龄、吨位、乘客、长度、船舱等)推荐游轮船员人数。在第一节中,我们描述了如何在本地组织项目。然后在第一节,我们描述了如何为项目创建一个 Github 存储库。我们总是建议您维护项目的两个版本,一个在本地,另一个在 Github 上。这样做的好处是,只要你有互联网连接,你可以在世界任何地方、任何时间访问你的项目的 Github 版本。另一个好处是,如果您的本地计算机发生了可能对您的计算机产生不利影响的事情,例如计算机中的病毒,那么您可以始终确信您在 Github 上仍有项目文件可以作为备份。

一、地方项目目录

对于你正在做的每个项目,有一个项目目录是很好的。

a)目录名

在为您的项目创建项目目录时,最好选择一个反映您的项目的目录名称,例如,对于推荐船员人数的机器学习模型,可以选择一个目录名称,如ML _ Model _ for _ Predicting _ Ships _ Crew _ Size

b)目录内容

您的项目目录应该包含以下内容:

(1) **项目计划:**这可能是一个世界文档,您可以在其中描述您的项目的全部内容。你可以先提供一个简要的大纲,然后一步一步地计划你想完成的事情。例如,在构建模型之前,您可能会问自己:

㈠什么是预测变量?

㈡目标变量是什么?我的目标变量是离散的还是连续的?

(三)我应该使用分类还是回归分析?

(iv)如何处理数据集中缺失的值?

㈤在将变量纳入同一尺度时,我应该使用规范化还是标准化?

(vi)我是否应该使用主成分分析?

(vii)如何调整模型中的超参数?

(viii)如何评估我的模型以检测数据集中的偏差?

(ix)我是否应该使用集成方法,即使用不同的模型进行训练,然后进行集成平均,例如使用 SVM、KNN、逻辑回归等分类器,然后在 3 个模型上进行平均?

(x)我如何选择最终型号?

2.项目数据集:您应该包括项目要使用的所有数据集的逗号分隔值(csv)文件。在这个例子中,只有一个 csv 文件:cruise _ ship _ info . CSV

3.一旦你弄清楚了你的项目计划和目标,就该开始编码了。根据您正在解决的问题的类型,您可以决定使用 jupyter 笔记本或 R script 来编写代码。让我们假设我们将使用 jupyter 笔记本。

在 jupyter 笔记本上,从添加项目标题开始,例如:

**Machine Learning Model for Predicting a Ship’s Crew Size**

然后你可以提供你的项目的简要概述,接着是作者的名字和日期,例如:

*We build a simple model using the cruise_ship_info.csv data set for predicting a ship’s crew size. This project is organized as follows: (a) data proprocessing and variable selection; (b) basic regression model; (c) hyper-parameters tuning; and (d) techniques for dimensionality reduction.**Author: Benjamin O. Tayo**Date: 4/8/2019*

当您开发代码时,您希望确保 jupyter 笔记本被组织成突出机器学习模型构建工作流的各个部分,例如:

Importation of necessary python librariesImportation of datasetExploratory data analysisFeature selection and dimensionality reductionFeature scaling and data partitioning into train and test setsModel building, testing, and evaluation

有关示例项目 jupyter 笔记本和 R 脚本文件,请参见以下链接:

[## bot 13956/ML _ Model _ for _ Predicting _ Ships _ Crew _ Size

此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…

github.com](https://github.com/bot13956/ML_Model_for_Predicting_Ships_Crew_Size/blob/master/Ship_Crew_Size_ML_Model.ipynb) [## bot 13956/天气模式

创建于 2018 年 7 月 9 日星期一@作者:Benjamin O. Tayo 此代码执行以下操作:它返回一个折线图…

github.com](https://github.com/bot13956/weather_pattern)

4.**项目输出:**您也可以将关键的项目输出存储在您的本地目录中。一些关键项目输出可以是数据可视化、将模型误差作为不同参数的函数的图表,或者包含关键输出(如 R2 值、均方差或回归系数)的表格。项目输出非常方便,因为它们可用于准备项目报告或 powerpoint 演示幻灯片,以展示给数据科学团队或公司的业务管理员。

5.项目报告:在某些情况下,你可能需要写一份项目报告来描述项目的成就,并根据你的模型的发现和见解提供要采取的行动。在这种情况下,您需要使用 MS word 编写一份项目报告。在编写项目报告时,您可以充分利用从主代码中产生的一些可视化效果。你想把这些加到报告里。你的主要代码可以作为附录添加到项目报告中。

可以从以下位置找到项目报告文件的示例:

[## bot 13956/蒙特卡洛模拟贷款状态

作者:Benjamin O. Tayo 日期:2018 年 11 月 22 日简介:预测贷款状态是风险中的一个重要问题…

github.com](https://github.com/bot13956/Monte_Carlo_Simulation_Loan_Status)

二。Github 项目目录

一旦您解决了感兴趣的问题,您就必须在 GitHub 上创建一个项目资源库,并上传项目文件,如数据集、jupyter 笔记本、R 程序脚本和样本输出。为任何数据科学项目创建 GitHub 存储库都是极其重要的。它使您能够随时访问您的代码。你可以与程序员和其他数据科学家分享你的代码。此外,这也是您展示数据科学技能的一种方式。

**创建 Github 资源库的技巧:**确保你为自己的资源库选择了一个合适的标题。例如:

**Repository Name**: bot13956/ML_Model_for_Predicting_Ships_Crew_Size

然后附上一个自述文件,提供项目的概要。

Author: Benjamin O. TayoDate: 4/8/2019We build a simple model using the cruise_ship_info.csv data set for predicting a ship's crew size. This project is organized as follows: (a) data proprocessing and variable selection; (b) basic regression model; (c) hyper-parameters tuning; and (d) techniques for dimensionality reduction.**cruise_ship_info.csv**: dataset used for model building.**Ship_Crew_Size_ML_Model.ipynb**: the jupyter notebook containing code.

然后,您可以上传您的项目文件,包括数据集、jupyter 笔记本和样本输出。

下面是一个机器学习项目的 Github 知识库的例子:

资源库网址:https://github . com/bot 13956/ML _ Model _ for _ Predicting _ Ships _ Crew _ Size

总之,我们已经讨论了如何组织数据科学项目。良好的组织导致更好的生产力和效率。当你下一次要做一个新项目时,请花时间组织你的项目。这不仅有助于提高效率和生产率,还有助于减少错误。此外,保留所有当前和已完成项目的良好记录使您能够创建一个存储库,您可以在其中保存所有项目以供将来使用。

由数据推动:如何为伦敦马拉松比赛配速🏃 🇬🇧

原文:https://towardsdatascience.com/how-to-pace-the-london-marathon-fuelled-by-data-8c62efa50054?source=collection_archive---------11-----------------------

Chris 目前是英国华威大学计算机科学硕士学生。他也是 抗大投资 的联合创始人。在此之前,Chris 曾在花旗风险投资 和花旗市场 工作。

它始于一个借口

嗨,我是克里斯。在与我的共同创始人安德烈、尼克·福登和西尔维娅·齐巴一起建造 T21 的时候,我一直在攻读计算机科学硕士学位。在我参加的一个数据分析模块中,我们的任务是找到世界上的任何数据集,并应用我们在课堂上学到的技术。

作为一个自称的跑步爱好者,这是一个深入研究一些有趣的跑步数据的机会。分析哪个种族?只有世界上最好的比赛才能做到:伦敦马拉松。💪

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

Before the race: full of hope and joy.

去年 4 月,我参加了伦敦马拉松比赛,目标是 2 分 59 秒 59。我失败了。我的比赛训练经历了漫长寒冷的冬天,但在比赛当天,气温达到了温和的 23 摄氏度。我的速度一直在目标上,直到刚过 25 公里大关,然后就直线下降。我用了 3 分 16 秒 38 完成。

这给我留下了大问题:天气会影响每个人吗?对他们有多大影响?最终我想知道…这是我表现的正当理由吗?😂

去哪里找数据?🕵️

虽然没有伦敦马拉松比赛结果的公开数据集,但官方网站有过去 5 年所有跑步者的可搜索结果。为了检索这些结果,我用编程语言 python 构建了一个抓取工具。我使用流行的模块请求和漂亮的汤来调用过去 5 年中每个参与者的结果页面。我将这些结果保存到一个 csv 文件中。

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

In retrospect, the heat was getting to me from the start.

总的来说,有 193,439 名独特的跑步者,略低于比赛的参与者人数,因为我没有精英跑步者的数据。

我所掌握的关于每位跑步者的信息有些有限:姓名、跑步者编号、比赛年份、俱乐部、年龄类别、地点、性别和国籍。如果有确切的年龄、居住城市、捐助的慈善机构、奇装异服和跑步经历(例如完成的马拉松次数)就太棒了。哦,好吧,我会尽我所能。

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

对于每个跑步者,我也有一堆关于跑步者在每个 5 公里标记上的时间的信息。例如,在 10 公里处,我是这样看的:

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

到目前为止,一切顺利。没错。让我们从跑步者的一些基本数据开始。你可以看到,在 2014 年至 2018 年期间,跑步者平均在 4 个半小时左右完成。最快的 25%的跑步者在 3 分 50 秒内完成,最慢的 25%超过 5 分钟。有意思。

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

Finish (total time) and at the 5km mark (in min/km)

好的,让我们来看看节奏策略。我认为公平地说,一个跑步者在 5 公里或 10 公里处的配速几乎是他们想在整个比赛中保持的配速。正如你在下面看到的,普通跑步者每年都会放慢速度**。我想这并不奇怪,但是看看这条紫色的线。在 2018 年的比赛中,普通跑步者的速度明显比其他任何一年都要慢。看来我不是一个人…**

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

Pace in mins/km at each 5km mark

现在是数学课

好吧,警告。接下来会有一点数学。我向你保证很快就会结束。

所以上面的图表给了我一个想法。如果我能计算出每个跑步者的“减速系数”会怎么样?基本上,我想知道一个特定的跑步者在 5 公里和 40 公里之间慢了多少。下面的公式给出了这个数字的百分比。

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

‘Slowdown factor’ for a runner

无论如何,即使你忽略这个公式,你也要知道减速因子是一个数字,它代表了跑步者的速度在比赛开始和结束之间减慢了多少**。**

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

Pretty chart: how much did different runners slow down?

上图显示了多年来跑步者放慢速度的程度。我将结果分成不同的完成时间(跑完 3 小时以下,4 小时以下等等),然后根据他们跑完比赛的年份。你可以看到跑得快的人没有慢下来那么多(可能 10%左右),这很有道理。这些跑步者通常经验丰富,知道如何调整自己的速度。然而,跑得较慢的人会经历更大幅度的速度下降。

同样有趣的是,2018 年是减速最糟糕的一年,无论跑步者的速度如何。

让我们来看看天气

因此,当跑步者抱怨天气时,他们通常是指天气冷(低于 5 摄氏度)、热(高于 18 摄氏度)或潮湿。在雨中跑步也很糟糕,但这更多的是一种心理上的事情。在这里,我只是看了每个比赛日的气温。

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

Looks complicated, but it’s just the range of temperatures each year

上图被称为盒须图。它标明了每年比赛日的温度范围。方框显示了 50%时间内的温度。胡须显示了剩下比赛的温度。

你会发现,2018 年不仅更热,而且气温在比赛过程中变化很大。比任何一年都多!

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

2015: finish times got longer as the temp went up

这是 2015 年比赛期间不同温度与每位参赛者完成时间的图表。很明显,天气越热,跑步者越慢。图表甚至给出了关系的回归方程。

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

更多的数学:每年似乎都有类似的关系。上表的最后一栏显示了相关系数。肯定有关联。2018 年除外。

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

A mere 600 metres to finish but I was in a dark dark place

嗯,这很奇怪。我们刚才不是说明 2018 年是最热的一年吗?我们不是显示了这也是跑步者放慢速度最多的一年吗?一个潜在的解释是,2018 年从一开始就如此炎热,以至于白天气温如何变化都无关紧要。

回归之后,我为数据建立了许多分类器。如果你对那里的结果感兴趣,那我们就聊聊吧,但我会把它放在这一页之外,以免其他人看到。

****总是预先准备好你的借口😏

所以看起来我的辩护是合理的。2018 年比其他任何一年都要热。这也是跑步者放慢速度最多的一年。即使在其他年份,气温越高,跑步者越慢。

结案了,对吧?

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

Felt like that guy behind me, but there’s always energy for a photo

嗯,也许不是。我不怀疑 2018 年是最热的一年(连每日快报都同意,他们从来不会错)。从数据中也可以明显看出,2018 年跑步者的速度比此前任何一年都慢。但我对在一场特定比赛中,气温较高的运动员跑得更慢的证据持怀疑态度。如果他们花了 5 个小时完成比赛,然后在当天晚些时候结束,温度总是更高,对吗?

总之。让我知道你的想法。我有一个好的借口吗?或者我应该承认我不够合适?2019 年 4 月,我又有机会打破布莱顿马拉松 3 小时的障碍。祈求凉爽的空气!🙏🏼

零代码如何参加 Kaggle 比赛

原文:https://towardsdatascience.com/how-to-participate-in-a-kaggle-competition-with-zero-code-f017918d2f08?source=collection_archive---------13-----------------------

如果没有以前的经验和对至少一个标准深度学习框架(如 TensorFlow 或 PyTorch)的深入了解,Kaggle 竞赛的入门可能会非常复杂。在本教程中,我们将探索零代码参与 Kaggle 竞赛的机会。

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

Freesound 音频标记 2019

我们将参加 Freesound 音频标记 2019 Kaggle 比赛。本次比赛是 DCASE2019 挑战赛 中的 任务 2 。如果你想使用与比赛相关的数据集,我们鼓励你在 Kaggle 上注册,通读比赛规则并接受它们。

Freesound Audio Tagging 2019 是前几年由free sound(MTG-庞贝大学)和谷歌的机器感知举办的音频标签比赛的更新。2019 版本是多标签音频标签,音频类别数量是原来的两倍。 FSDKaggle2019 数据集中的注释是通过 Freesound 注释器收集的。

竞赛基于 Eduardo Fonseca 等人的论文:

注册 Peltarion 平台

Peltarion 平台是一个用于深度学习的可视化开发环境。该平台从构建到培训再到部署你的深度学习模型,一行代码都不需要。

  1. 到平台报名
  2. 确认你的电子邮件。
  3. 等待激活邮件。可能需要几分钟。
  4. 设置您的密码。
  5. 该平台已准备就绪,可免费使用 50 个 GPU 小时。

Peltarion Platform

下载 FSDKaggle2019 数据集

下载 FSDKaggle2019 数据集

FSDKaggle2019 数据集已经针对 Peltarion 平台进行了预处理。这意味着音频文件已被转换为频谱图并与包含每个文件对应类别的 index.csv 文件一起保存为 NumPy 文件。

可下载数据集已经过预处理,可以上传到平台。点击 dataset.zip 下载。

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

Click on the dataset.zip

创建新项目

在左侧的 Peltarion 主视图中,点击新建项目按钮。现在,您可以在弹出模式中添加项目名称和可选描述。我们将该项目称为项目 v1 。

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

Home view.

项目 v1 出现在新建项目按钮下方的左侧。点击展开项目,然后点击打开

上传数据集

点击转到项目后,您将进入项目的数据集视图。在数据集视图上,点击新建数据集。在上传文件选项卡上,点击选择文件上传 dataset.zip ,等待其上传,点击下一步。命名数据集。我们准备把它命名为音频。默认情况下,数据集分为 80%的数据用于定型,剩下的 20%用于验证。我们将使用这种拆分。

我们需要通过点击顶部的新特性集来捆绑类别特性。选择除 fname 之外的所有特征(共 80 个),并将 F 特征集名称设置为标签,然后点击创建

在右上角,点击保存版本,你就可以进入建模阶段了。

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

Datasets view.

创建一个深度学习实验

从顶部的选项卡转到建模视图。点击左边的新实验。我们将把我们的实验命名为实验 v1

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

建模

建模视图的右侧,可以看到构建设置选项卡。这些是我们将在构建深度学习模型时使用的工具。在本教程中,我们将把音频文件视为称为光谱图的图片,并执行图像分类。

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

Audio as a picture.

由于我们正在对被视为图片的声音数据进行分类,因此我们可以使用性能良好的卷积神经网络。在这种情况下,我们将使用 ResNetv2 large 50

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

Ready model in modeling view.

我们现在将在建模视图中创建模型:

  1. 中添加输入块,并将 fname 指定为右上角的特征
  2. 添加批量标准化块并保持可训练状态。批次正常化是为了加快训练速度。
  3. 添加整形块,并将目标形状设置为(256,256,1)。 ResNetv2 large 50 需要一个额外的通道轴。
  4. 片段中添加 ResNetv2 large 50
  5. 点击 ResNetv2 large 50 上方的输入块,按 backspace 删除。
  6. 批量正常化模块的点连接到 ResNetv2 大 50 模块。
  7. ResNetv2 大 50 后的密集块中的激活改为 ReLUReLU 在大多数情况下是优秀的激活功能。
  8. 目标块之前添加另一个密集块,将其节点设置为 80,激活s 形
  9. 目标块的特征更改为标签并将损失更改为二元交叉熵
  10. 转到右侧的设置选项卡,将批量设置为 28周期30优化 r 到 Adam批量 28 将适合 GPU 内存,30 个历元应该足够模型收敛, Adam 是一个很好的标准优化器
  11. 点击视图右上角的 Run

评价

从顶部的选项卡进入评估视图。

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

评估视图中,您可以跟踪您的模型的训练,并获得实验的实时训练指标。

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

Evaluation view.

你应该感兴趣的指标是精度召回。如果你想了解更多,有一篇很棒的媒体文章

我们的模型现在已经训练好了,可以下载了。您可以点击实验 1 概述中左侧的三点下拉菜单下载模型。在下拉菜单中,点击下载,它打开一个模态,点击确定。将模型下载为 H5 文件会有一点延迟。如果您训练了多个模型,请下载具有最佳验证精度的模型。

模型现在可以发货了!

Kaggle 帐户入门

如果您还没有 Kaggle 帐户,您可以在这里创建一个。请按照说明操作。

一旦您的帐户准备就绪,请加入音频标记 2019迟交按钮在右上角。如果这是你第一次参加 Kaggle 比赛,你需要在参加比赛前用你的手机验证你的帐户。

提交预测

点击新内核,选择笔记本。

您需要将下载的模型 H5 文件添加为数据集。为了找到 H5 文件的正确路径,将下面的代码添加到 Kaggle notebook 并运行它(记住保存路径以备将来使用)。

有一些代码。你必须将下面的代码复制粘贴到 Kaggle 笔记本中。

将模型变量路径更改为之前保存的路径,并点击右上角的提交

点击**提交后,**ka ggle 内核检查错误并开始用你的模型进行预测,并将 submission.csv 发送给竞赛。

进一步工作—迁移学习

即使比赛不允许迁移学习,在平台上测试迁移学习的能力也是有用的。迁移学习利用从 ImageNet 或 CIFAR-100 等大规模数据集学习的图像属性,然后针对特定的图像识别问题微调神经网络。在我们的例子中,我们会用音频文件的图像对它进行微调。

该平台支持 VGG16、VGG19 和 ResNetv2,权重在 ImageNet 上训练。

使用迁移学习时,您可以尝试使用较小的数据集获得更好的结果。迁移学习通常收敛得更快,即使预训练数据集与您正在使用的数据集非常不同。

特别感谢

特别感谢free sound Audio Tagging 2019的组织者在整个过程中给予的帮助。

参考

Eduardo Fonseca、Manoj Plakal、Frederic Font、Daniel P. W. Ellis 和 Xavier Serra。“带有嘈杂标签和最小监督的音频标签”。已提交至 DCASE2019 Workshop,2019。网址:【https://arxiv.org/abs/1906.02975

爱德华多·丰塞卡、若尔迪·庞斯、哈维尔·法沃里、弗雷德里克·方特、德米特里·波格丹诺夫、安德烈斯·费拉罗、塞尔吉奥·奥拉马斯、阿拉斯泰尔·波特和哈维尔·塞拉。 Freesound datasets:一个创建开放音频数据集的平台。《第 18 届国际音乐信息检索学会会议论文集》(ISMIR 2017),第 486–493 页。中国苏州,2017。

如何通过谷歌云专业数据工程师考试

原文:https://towardsdatascience.com/how-to-pass-the-google-cloud-professional-data-engineer-exam-f241d7191e47?source=collection_archive---------7-----------------------

没有推荐的 3 年行业经验

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

所以你可能已经谷歌了上面的标题,现在你在这里。别担心,你不是唯一一个。我也做了同样的事情。

在本指南中,我将让你了解考试是什么样的,以及我是如何准备的(并且通过了!)

我的背景

我最近毕业,获得了物理学学位,2019 年夏天,我在一家名为 Zenu 的早期创业公司实习。这是我第一次接触到数据工程师的角色和谷歌云平台。

你可以在这里阅读更多关于我的实习经历。

我加入 Zenu 时是一名有抱负的数据科学家,也是该公司愿景的坚定信徒,后来发现他们没有任何数据或存储数据的基础设施。因为我想与数据密切合作,所以我承担了 Zenu 的分析数据库的设计和交付的责任。

业务需求的一个技术解决方案是使用 BigQuery 作为我们的数据仓库,它支持使用熟悉的标准 SQL 语法快速查询嵌套行。此外,它允许与其他谷歌云产品进行简单的集成,如用于分析报告的 Data Studio 和用于机器学习的 AI 平台。

来自一个非技术背景,我从零开始学习工作所需的数据工程技能。在此期间,我偶然发现了谷歌云专业数据工程师认证,并参加了几个在线课程,以更好地了解这项技术及其在数据分析未来的更广泛作用。

我花了大约两个月的时间,每天漫不经心地看几个视频,然后花了一个月的时间密集练习论文,并确定关键点。11 月初考的。

资源

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

课程: 有 GCP 专业证书的数据工程
**费用:**38/月(1 周免费试用) 有用性: 7/10

Coursera 是我上的第一门在线课程,由谷歌员工授课。他们提供演示、动手实验和演示的组合。

我发现这门课程对于一个没有任何商业经验的人来说是相当高级的。我不知道当前的技术,如 Hadoop 生态系统中的技术,并且被许多不熟悉的术语淹没了。

我看完了所有的视频,但是说实话我马上就忘了大部分。不过我强烈推荐T3备考 Google Cloud 专业数据工程师考试课程 考试前一两周左右。这就像大学里的复习课,他们会快速介绍考试中可能会看到的关键产品。

像任何一个破产的学生一样,我使用了一周的免费试用,下载了所有的视频供离线观看。

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

课程: Google Cloud 认证专业数据工程师
费用:【49 美元/月(1 周免费试用)【80 美元/3 个月(学生订阅) 有用性: 9/10

注意:Linux 学院现在是云计算大师的一部分

这是我参加的第二个在线课程,涵盖了考试中出现的大约 70%的内容。本课程还结合了演示、动手实验和演示。

本课程对每项谷歌云服务进行了高度概述,涵盖了关键概念以及谷歌使用每项服务的最佳实践。

该课程结构良好,从基础概念开始,到不同类型的数据库、架构管道、机器学习和数据可视化。

我发现这个很容易理解,对新手也很友好。马修·乌拉森(课程讲师)在谷歌云平台方面的专业知识意味着他的解释非常清晰简洁。在他的视频中,他经常强调考试中会出现的关键事实和概念。

有各种动手实验、演练和测验可以帮助巩固您的理解,并提供机会直接在 Google 云平台上测试您在视频中学到的材料。

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

Screenshot of The Data Dossier provided by Linux Academy for the Google Cloud Certified Professional Data Engineer course

本课程提供的最有帮助的资源之一是数据档案,它就像一套数字化的课程笔记。它突出了每项服务的要点,显示了清晰的对照表、图表和工作流程,以及考试时需要记住的提示。

如果你是数据工程的新手,我建议你先学习这门课程,因为它比 Coursera 课程更容易掌握。

如果我只推荐一个付费订阅,这将是一个。我支付了 3 个月的学生订阅费,这是值得的。你不仅可以接触到 GCP 课程的惊人资源,还可以完全接触到 Linux Academy 提供的所有其他课程(我曾经使用过)。

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

课程: Google 数据工程师考试—专业认证备考
**费用:**49/月(1 周免费试用) 有用性: 8/10

云学院是我用来备考的第三个也是最后一个在线课程。我在考试前一周开始上这门课,更多的是把它作为复习而不是学习指南。

这门课程最有用的一点是,它涵盖了其他课程中没有涉及的安全和网络、数据加密和计算引擎等主题,但可以根据官方考试大纲进行测试。

除了上面提到的主题,我以 1.5 的速度观看了所有其他视频,以检查是否有任何我以前不知道的新信息。我发现动手实验有点难,而且更多的是复制粘贴一长串预先写好的命令。

我使用了 1 周的免费试用。

其他资源

以下是我发现的一些非常有用的资源,但根据你的经验是可选的。

Linux Academy—大数据要领 (免费带社区账号)

本课程全面介绍了大数据世界。它涵盖了大数据基础架构的原理及其与云计算的集成。

对我来说,本课程最有用的一点是,它提供了最流行的大数据技术的高级概述,包括核心 Hadoop、Hadoop 生态系统(Hive、Pig、Kafka 等)和 Apache Spark。对于考试,你需要知道这些是做什么的,以及它们在 GCP 的对等物。例如 Kafka -> PubSub,Hive -> BigQuery。

Linux Academy—SQL 入门

本课程是在谷歌云认证专业数据工程师课程开始时为不熟悉 SQL 的人推荐的。它涵盖了基本的 SQL 语句和函数,包括聚合、连接和排序。如果您以前没有使用过 SQL 或者不经常使用,我推荐您学习本课程,因为您将需要它来在 BigQuery 中编写查询语句。

机器学习速成班

本课程是谷歌对机器学习的快速、实用介绍。我用这门课快速复习了一下,因为我已经在大学课程中讲述了一些流行的算法和概念。然而,我认为它的结构很好,会给你在机器学习方面打下良好的基础。

qwiklab

Qwiklabs 是一个平台,以教程和演示的形式提供在各种云平台上使用的临时信用。您可以使用 Qwiklabs 获得额外的 Google 云平台实践经验。我考了 Baseline: Data,ML,AI/数据工程/big query for Data Warehousing课程。我发现最后一个非常有用,因为它允许您练习在 BigQuery 中编写查询语句。

我的建议

有许多人通过了专业数据工程考试,并在网上分享了他们的准备和考试经验。我觉得他们中的大多数人都来自技术背景,所以他们浏览了一些显而易见的知识(因为参加考试的建议经验是 3 年以上的行业经验,包括 1 年以上使用 GCP 设计和管理解决方案的经验)。

在阅读在线论坛、评论和听说参加考试但失败的人时,一个似乎很常见的模式是,他们低估了考试的难度,因为他们在日常工作中做类似的事情。

我可以理解这种对考试中机器学习部分的过度自信,因为我已经熟悉了在大学模块中涉及到的算法。我在教学大纲的这一部分上花的时间较少,因此对我的一些答案不太自信。

作为学生,我们的一个优势是我们习惯于学习。就我而言,我刚刚结束最后一年的考试,仍处于“学习模式”,所以准备这次考试并不太陌生。在你繁忙的日程安排之外,我知道你可能已经有好几年没有为考试而学习了,所以我将概述一些你应该关注的关键领域以及我是如何准备的。

先看考试大纲

我犯的第一个错误是没有正确阅读谷歌官方考试指南,天真地认为在线课程会涵盖这一点。在线课程做得好的地方在于,它们详细涵盖了每项 GCP 服务,概述了其常见用例、谷歌使用该服务的最佳实践,以及它们如何适应整体数据工程角色。

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

From the official exam guide

考试测试的是你对业务需求提出可行技术解决方案的能力。虽然永远不会有一个完美的解决方案,但一个伟大的解决方案应该考虑到上述四点。

在考试中,你可以看到几个可能满足业务或技术需求的选项,但其中一个比其余的更好。

提升和换挡与提升和杠杆

如果你看过一些在线课程,你可能认识这些术语。

提升和转移就是简单地将现有流程或基础设施迁移到云中,而不需要重新设计任何东西。一些公司可能会采取这种方法,因为他们不想花费时间和金钱来修改他们当前的基础架构,但仍然希望利用云的优势。例如,在计算引擎上托管 MySQL 数据库,而不是将所有数据迁移到云 SQL。

提升和利用意味着将您现有的流程迁移到云上,并使用云提供的一些服务使它们变得更好。例如,您可以使用 Dataproc 运行 Hadoop 和 Spark 工作负载,但是将数据存储在云存储中,而不是存储在 HDFS。这更具成本效益,因为您只需为作业运行的时间付费,然后您可以在不使用群集时关闭它,而不会丢失所有数据,因为它现在存储在云存储中。

在完成所有在线课程和练习题后,你可能会认为大多数答案都涉及到为特定的业务或技术需求选择最合适的 Google 云服务。毕竟,谷歌出售的是他们卓越的、低成本的、完全管理的、无运营的云服务能力。

然而,情况并非总是如此,仔细阅读问题很重要,因为考试中的一些问题有技术要求,他们不想对现有流程进行任何修改。

成本与性能

对我来说,考试最难的部分是成本和性能之间的权衡。(这可能是你 3 年以上的行业经验派上用场的地方!).业务人员考虑的是最小化成本,而技术人员考虑的是提高性能。

一个常见的问题是“一家中型公司希望在保持低成本的同时[做点什么]”。虽然有些情况是显而易见的,如使用云 SQL 与云扳手,但涉及运行作业的场景更难,因为您可以使用更强大的 CPU(成本更高)来运行作业,从而缩短运行时间(成本更低)。

您应该关注的其他一些领域

最近,有一种趋势是让每个人都可以接触到人工智能。BigQuery ML 允许用户使用标准 SQL 查询在 BigQuery 中创建和执行机器学习模型,而不是编写代码。其中一个很大的优势就是数据不会离开 BigQuery。请看这个视频的简单解释。

卡夫卡— 我从其他渠道了解到卡夫卡在考试中出现了很多次,对我来说也是如此。Google Cloud 的对等物是 Cloud Pub/Sub。你应该知道两者之间的区别,例如 Pub/Sub 只能保存长达七天的数据,而 Kafka 可以存储你想要的数据,并且可以随时访问。

故障转移副本— 正如考试指南的教学大纲 4.3 所述,为您的数据基础架构考虑备份解决方案非常重要。一些谷歌云服务会自动创建数据副本,而另一些则需要手动设置。考虑您想要提供服务的地区和区域。如果一个区域中的数据中心出现故障,会发生什么情况?你如何为此做准备?

云密钥管理&数据加密— 数据安全是数据工程非常重要的组成部分。默认情况下,GCP 加密所有静态客户数据。您应该知道还有其他加密方法,包括 CMEK、CSEK 和客户端加密。Google Cloud 有一个云密钥管理服务,可以让你管理云服务的加密密钥。

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

Table comparison of different data encryption types (Coursera)

学习策略

每个人都有不同的学习方法,所以你应该找到适合你生活方式的方法。我并不是建议你采用我的方法,但是如果你还没有找到你的风格,或者发现其他技术不起作用,请随意尝试我的方法。

基础知识

在线课程方面,我推荐以下顺序。

  1. Linux Academy大数据基础知识 (可选)— 对大数据世界的非技术性介绍,对 Hadoop 生态系统进行了高度描述。
  2. *Linux AcademySQL 入门 *(可选)—SQL 入门。对于 BigQuery,您需要一些基本的 SQL 知识。
  3. Linux AcademyGoogle Cloud 认证专业数据工程师 对你在考试中有望看到的主要 GCP 服务的深入介绍。
  4. Coursera — 数据工程与 GCP 专业证书 稍微高级一些,更侧重于现实世界中数据工程师的角色。
  5. 云学院— Google 数据工程师考试—专业认证备考 好用来作为临近考试日期的复习。花些时间看看其他在线课程中没有涉及的主题。
  6. *机器学习速成班**——*涵盖了数据科学中最常用算法背后的数学和动机。对于考试,您应该知道哪种算法适合业务需求,包括监督(回归、分类)、非监督(聚类)和强化学习。
  7. Coursera准备 Google Cloud 专业数据工程师考试 这其实是上面提到的 Coursera 课程的一部分,但我建议在考试前一两周上这门课。本课程涵盖了官方考试指南中的所有要点。

动手实践

如果你没有很多使用谷歌云平台的经验,我建议你使用动手实验室和 Qwiklabs 练习。你不应该记住如何做每一项任务,而是把它作为一个熟悉服务和整个 GCP 环境的机会。

如果您订阅了 Linux Academy,您就可以访问云沙盒,在那里您可以获得访客用户凭据,以便每次会话使用 GCP 3 小时。

通过使用这个云沙盒,或者创建一个免费的 GCP 账户(300 美元免费信用),并按照 Coursera 或 Qwiklabs 上的动手实验室的任务说明,你仍然可以获得有价值的实践,而不会打破你的钱包。(在 Qwiklabs 上,你实际上是在固定时间内付费使用 GCP 环境)

过去的论文

我在大学的学习策略是尽可能早地做试卷,让自己熟悉考试风格和期末考试中可能出现的题型。通过这种方式,你可以发现自己知识上的差距,并专注于自己的薄弱领域。

如果你已经有行业经验,我推荐这种方法。如果你是第一次学习数据工程,我建议你完成 Linux Academy 课程,至少做一次模拟考试,然后继续 Coursera 课程。

真正考试前一个月,我一周做一次模拟考试。我用的是 Linux Academy 实践考试,Coursera 实践考试和谷歌官方数据工程师实践考试

你复习的练习纸步骤最重要的部分是记下你做错的所有问题,然后再复习一遍。查看答案后(参加在线课程的测试后),您会看到一个简短的解释,说明为什么您的答案是对的或错的(有时还会看到一个链接,指向涉及该主题的视频)。对于谷歌的官方实践考试,他们也会给你链接到他们在 GCP 网站上的官方文档。

以下是一些额外的自由练习题:

我不能强调坚持做练习题的重要性。虽然它们没有反映出与真正考试相同的难度,但你将接触到各种各样的问题,并增加你参加真正考试的信心。

最后

课程导师极力强调仅完成在线课程不足以通过考试。你的准备应该包括各种在线资源、GCP 的实践和过去的试题。

我强烈推荐我的修订版中包含的另外两个内容。

  1. *阅读官方谷歌云文档**——*阅读全部文档不太现实,但我的建议是阅读在线视频所涵盖主题的文档。你应该记住的要点是谷歌的最佳实践(用于做某些事情)和一些服务的配额和限制(例如,为云 SQL 存储高达 3TB 的数据)。经验法则是,如果你可能在工作中查找它(例如,2vCPU 计算引擎每月花费多少),你不需要记住它。但是,您应该大致知道,不同存储类型的上限。
  2. 浏览案例分析— 它们曾经是 2019 年 3 月之前考试的一部分,但不在当前的教学大纲中。说到这里,我发现浏览这些案例非常有用。作为一名之前没有任何数据工程经验的学生,看到现实生活中的应用程序和数据工程师为提出业务需求的技术解决方案而经历的思维过程是很有帮助的。你可以在 Coursera 上查看和浏览这些关于 准备谷歌云专业数据工程师考试 课程的案例研究。您可以在此观看一群经验丰富的专业人士讨论某个案例研究的几个潜在解决方案。

考试期间

考试由 50 道题组成,你有 2 个小时的时间完成。有一个书签功能,您可以将问题标记为书签,供以后查看。根据我在网上读到的,大多数人花了大约 1 到 1 小时 15 分钟来完成这个测试。我用了整整 2 个小时。

我会说考试比模拟考试难 20%左右。许多问题会引起很多自我怀疑,比如成本与性能的权衡。我的建议是调整自己的节奏,不要在一个问题上浪费太多时间。如果你不知道答案或者不确定你的答案,把它标上书签,然后继续下一个。

如果你第一次不能回答所有的问题,不要惊慌。我被前 5 个问题难住了,然后把一半以上的问题做了书签,以便以后复习。

最终意见

干得好,走到了这一步!我希望这个指南对那些即将参加考试的人有所帮助,并有望成为他们的信心助推器。没有商业经验,站在理论的立场上准备,肯定是可以通过这个考试的。

我在下面添加了一些帮助我准备考试的链接。这些人还分享了他们的经验,并提供了一些很好的建议和需要注意的地方。

祝你好运!你能行的!

如果你喜欢这篇文章,何不注册 medium,通过此链接阅读更多精彩内容。

https://medium.com/@jonathan.moszuti/membership

我已经使用了上面列出的所有资源,并且只推荐对我备考有帮助的产品**

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

Photo by Ian Stauffer on Unsplash

如何用 Apache Spark 和 LightGBM 大规模构建机器学习模型?

原文:https://towardsdatascience.com/how-to-perform-credit-card-fraud-detection-at-large-scale-with-apache-spark-and-lightgbm-61a982de8672?source=collection_archive---------22-----------------------

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

Image credit iStockPhoto.com

虽然在 Jupyter 笔记本电脑上用相对较小的静态数据集训练机器学习模型很容易,但当它部署在金融机构内部的真实环境中时,会出现挑战,因为海量的交易数据驻留在 Hadoop 或数据湖中。在本文中,我将向您展示如何利用 Apache Spark 来实现使用 LightGBM 在 Spark 环境中构建和训练模型的核心部分,light GBM 被认为是在数据科学社区中广泛使用的梯度推进算法的快速实现。

Apache Spark 是一个内存集群运行时环境,存储和处理数据的速度比从 SSD 或硬盘访问数据快几千倍。假设我们要处理的数据集位于 Hadoop、S3、数据库或本地文件中,那么第一个任务就是在 Spark cluster 中以 Spark dataframe 的形式访问它。

欺诈检测是每个发行信用卡的金融机构目前都在进行的一项活动,该活动使用大规模数据集,这些数据集是每天在其平台上发生的数百万笔交易的结果。在我们的例子中,我将 ULB 机器学习小组提供的 CSV 文件格式的数据集作为 Spark dataframe 导入到由 Databricks community edition 托管的具有 6gb RAM 的 Spark 集群上。这是关于向数据块添加数据的指南

*# File location and type*
file_location = "/FileStore/tables/creditcard.csv"
file_type = "csv"

*# CSV options*
infer_schema = "true"
first_row_is_header = "true"
delimiter = ","

df = spark.read.format(file_type) \
  .option("inferSchema", infer_schema) \
  .option("header", first_row_is_header) \
  .option("sep", delimiter) \
  .load(file_location)

该数据集包含约 300,000 行,由 31 个与欧洲信用卡持卡人交易相关的变量组成,其中 28 个是通过对一些未披露的原始参数进行主成分分析而得出的数值变量。剩下的三个变量是交易量、相对于第一次交易的交易时间(以秒计)以及指示交易是真实还是欺诈的交易标签。当我们谈论大规模时,数据集可能看起来很小,但只要选择使用 Apache Spark 来训练模型,即使是小数据集,也可以放心,相同的代码将无缝扩展到任意大的数据集,这些数据集可能托管在 HDFS、S3、NoSQL 数据库或数据湖中,只要它可以以 Spark 数据帧的形式访问模型。

就标记为欺诈和真实的样本数量而言,数据集严重失衡。与数据集中的总行数相比,它只有少量的 492 个样本与被识别为欺诈的交易相关。你可以在 Kaggle 上访问这个数据集。

下一步是从这个数据帧中选择我们希望在训练模型时用作输入变量和目标变量的列。在构建生产级 ML 模型时,执行数据转换步骤通常是一种很好的做法,例如使用标签编码器或一个热编码器作为管道阶段将分类列转换为数字列,然后可以用于转换训练、验证或测试数据,而不会将测试用例的知识泄露给训练数据(同时执行标准化缩放等转换)和代码的高维护性。

feature_cols = ["V" + str(i) **for** i **in** range(1,29)] + ["Amount"]
assembler = VectorAssembler(inputCols=feature_cols, outputCol="features")
stages = [assembler]

接下来,我们可以向管道添加 LightGBMClassifier 实现的实例。LightGBMClassifier 类在由 Microsoft Azure 团队作为开源项目维护的 MMLSpark 库中可用。按照本页中建议的步骤,可以将它作为库包含到集群中。我通过从 Maven option 中搜索名为 mmlspark 的包添加了这个库,选择了它的 0.17 版本,并将其安装在集群中。之后用 Python 从 mmlspark 导入 LightGBMClassifier 就奏效了。

在使用 LightGBM 时,使用超参数的最佳值对其进行调优是非常重要的,例如叶子的数量、最大深度、迭代次数等。如果用不同的超参数值训练,在相同数据上训练的模型的性能可以有很大不同。

通常,这需要设置交叉验证实验,并使用一些超参数值空间探索策略,如全网格搜索、随机搜索、贝叶斯优化或树形结构 Parzen Estimators 算法,以找出超参数的最佳值,通过最小化一些预定义的误差度量(如二进制误差)或最大化一些分数(如 ROC 或 F1 测量下的面积)来最大化模型在验证数据集上的性能。

这种探索可能会持续很长时间,这取决于我们想要探索的参数值空间的大小以及我们对模型的预期性能水平。在这种情况下,我决定调优 LightGBM 模型的 7 个超参数。这些参数中有许多是实值,这意味着要探索的参数空间是无限深的。

为了获得不间断的计算时间,通过评估超参数值的不同组合来探索这个超参数空间,同时使用一些优化策略在相对较少的评估轮次中找出超参数的接近最优的值,我使用了具有相同数据集的 Python 中 Kaggle 的执行环境内的 Hyperopt 库。在对超参数值的组合进行 200 次评估后,我使用树形结构的 Parzen 估计算法来找出超参数的最优值。这是我在 Spark 内部训练这个模型时确定要使用的超参数值的笔记本

在 Databricks 的社区版中,我可以不间断地访问集群 2 个小时。如果您可以访问 Spark cluster 更长的不间断时间,您还可以使用 Spark 中的 ParamGridBuilder 和 CrossValidator 类来探索和评估超参数值,如下面的示例代码所示。如果您想在这里以更有效的方式进行整个超参数调整,而不是执行整个网格搜索,您可以参考由 HyperoptDataBricks 提供的指南,这些指南展示了如何使用 Spark cluster 和 Hyperopt。

在这里,我使用了我从 Kaggle 的 python 环境中进行的模型调整中获得的大多数最佳超参数值,以及 lambda L2 正则化参数的调整值作为 Spark 内部使用 CrossValidator 执行网格搜索的示例。

请注意,我在 LightGBMClassifier 中设置了标志 isUnbalance=True,这样它就可以处理我们前面讨论的数据集中的不平衡。

best_params = {        
	'bagging_fraction': 0.8,
     	'bagging_freq': 1,
     	'eval_metric': 'binary_error',
     	'feature_fraction': 0.944714847210862,
	'lambda_l1': 1.0,
     	'lambda_l2': 45.0,
     	'learning_rate': 0.1,
     	'loss_function': 'binary_error',
     	'max_bin': 60,
     	'max_depth': 58,
     	'metric': 'binary_error',
     	'num_iterations': 379,
     	'num_leaves': 850,
	'objective': 'binary',
     	'random_state': 7,
     	'verbose': **None** }lgb = LightGBMClassifier(
 	learningRate=0.1,
 	earlyStoppingRound=100,
       	featuresCol='features',
        labelCol='label',
        isUnbalance=**True**,
  	baggingFraction=best_params["bagging_fraction"],
	baggingFreq=1,
	featureFraction=best_params["feature_fraction"],
	lambdaL1=best_params["lambda_l1"],
	# lambdaL2=best_params["lambda_l2"],
	maxBin=best_params["max_bin"],
	maxDepth=best_params["max_depth"],
	numIterations=best_params["num_iterations"],
	numLeaves=best_params["num_leaves"],
	objective="binary",
	baggingSeed=7                  
)paramGrid = ParamGridBuilder().addGrid(
  lgb.lambdaL2, list(np.arange(1.0, 101.0, 10.0))
).build()evaluator = BinaryClassificationEvaluator(labelCol="label",metricName="areaUnderROC")crossValidator = CrossValidator(estimator=lgb,
                          estimatorParamMaps=paramGrid, 
                          evaluator=evaluator, 
                          numFolds=2)   
stages += [crossValidator]
pipelineModel = Pipeline(stages=stages)

下一步是将数据集分成训练数据集和测试数据集。我们将使用训练数据集来拟合我们刚刚创建的管道,该管道由特征组装和模型训练等步骤组成。然后,我们将使用此管道来转换测试数据集,以生成预测。

train, test = df.randomSplit([0.8, 0.2], seed=7)
model = pipelineModel.fit(train)
preds = model.transform(test)

一旦我们有了来自测试数据集的预测,我们就可以用它们来衡量我们的模型的性能。Spark 提供了 BinaryClassificationEvaluator,可以计算 ROC 度量下的面积。

为了计算其他相关指标,如精确度、召回率和 F1 分数,我们可以利用测试数据集的预测标签和实际标签。

binaryEvaluator = BinaryClassificationEvaluator(labelCol="label")print ("Test Area Under ROC: " + str(binaryEvaluator.evaluate(preds, {binaryEvaluator.metricName: "areaUnderROC"})))#True positives
tp = preds[(preds.label == 1) & (preds.prediction == 1)].count() #True negatives
tn = preds[(preds.label == 0) & (preds.prediction == 0)].count()#False positives
fp = preds[(preds.label == 0) & (preds.prediction == 1)].count()#Falsel negatives
fn = preds[(preds.label == 1) & (preds.prediction == 0)].count()print ("True Positives:", tp)
print ("True Negatives:", tn)
print ("False Positives:", fp)
print ("False Negatives:", fn)
print ("Total", preds.count()) r = float(tp)/(tp + fn) print ("recall", r) p = float(tp) / (tp + fp)print ("precision", p)f1 = 2 * p * r /(p + r) print ("f1", f1)

在这种情况下,其 AUC-ROC 得分为 0.93,F1 得分为 0.70。在 Kaggle notebook 中,我在使用它进行训练之前还使用了 SMOTE 来平衡数据集,它获得了 0.98 的 AUC-ROC 分数和接近 0.80 的 F1 分数。我在 Kaggle 环境中对超参数值的组合进行了 200 次评估。如果我们想进一步提高模型的性能,那么接下来要做的显然是在 Spark 中实现 SMOTE 来平衡训练数据集,然后再用它来拟合管道。我们还可以通过对参数值组合进行大量评估来更深入地探索超参数空间。

除了在 Spark 上训练 LightGBM 等高性能模型之外,数据科学团队通常面临的另一个重大挑战是管理准备数据、选择模型、训练、调整、保存最佳参数值、部署训练好的模型以及以 API 形式访问输出预测的生命周期。 MLFlow 是一个试图解决这个问题的开源解决方案。建议有兴趣的读者多了解一下。我也可能会写一篇文章,介绍如何将它集成到建立 ML 模型构建、培训和部署项目的工作流中,就像我在 Databricks 平台上使用 Spark 演示的那个项目一样。

你可以在 GitHub repo 上托管的这个笔记本中参考我在数据块上执行的确切步骤。这里是另一个笔记本,我在 Kaggle 上对这个数据集进行了参数调优实验。

我希望这篇文章对你使用 LightGBMClassifier 在 Apache Spark 上实现机器学习有所启发。如果你在自己尝试的时候有什么问题,欢迎在评论中提问。

如何执行可解释的机器学习分类——没有任何树

原文:https://towardsdatascience.com/how-to-perform-explainable-machine-learning-classification-without-any-trees-873db4192c68?source=collection_archive---------6-----------------------

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

Credit: Pixabay

严格而清晰的规则……在我们看来是背景中的东西——隐藏在理解的媒介中。
——路德维希·维特斯坦根

决策树是一种流行的分类技术。它们直观、易于理解,并且开箱即用。

树模型是人类可以理解的规则的路径。在某些情况下,能够为你的预测提供一个解释——*原告的贷款申请被拒绝,因为他们正面临破产程序,*而不是,某物——某物——某物——点产品——可能是一个优势。

但是还有另一类规则生成算法,您可能不熟悉,可能值得添加到您的工具集中,称为规则集学习器。

在最近一个通过古典音乐作曲家对音频进行分类的项目中,我的规则集实现击败了 sklearn 的 DecisionTreeClassifier,并匹配了网格搜索优化的 SVD 和随机森林。

让我们看看什么时候您可能想要考虑规则集模型,它们如何工作,以及如何在您自己的代码中使用它们——包括我最近开发的一个新的 Python 包,您可以使用它进行分类。

动机

尽管决策树有很多优点,但它们因过度拟合、脆弱和难以处理不平衡数据集而臭名昭著。

树通过从完整的训练集开始学习,并贪婪地添加最大化每个子节点的类纯度的条件。随着我们沿着树向下,每个节点添加一个条件,将我们的训练数据分成越来越小的子组:

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

Decision tree model generated by sklearn on the mushroom dataset.

在短短的几个决策步骤中,我们已经从具有数千个样本的根发展到样本大小低至 29、11、2 甚至 1 的叶。

怎么会?想想二叉树搜索是如何很好地扩展的,因为树的深度只随着节点数量的对数增长。对于训练决策树来说,另一方面是节点的数量随着深度以指数的速度增长。因此,我们的训练子集收缩得非常快,最终缺乏统计上有效的样本量。

出于类似的原因,树是“脆弱的”,因为训练集中的微小变化会改变顶级规则,从而在整个模型中产生连锁反应。

有几个流行的技术来处理树木过度拟合和脆弱性。我们可以修剪这棵树,要么根据某个阈值提前停止生长,要么在完成后缩小它的大小。或者我们可以建立一个由数千棵树组成的随机森林集合,以训练速度和可解释性为代价。

规则集类似于决策树,但是因为它们没有层次结构,有有序的子分支决策,所以它们有可能避开这些缺点。

规则集学习者也倾向于产生更紧凑的模型。

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

Some major differences between trees and rulesets

那么什么是规则集呢?

规则集就是合取词(and)的析取(or)。

例如,描述您的孩子能否说服您出去吃冰淇淋蛋糕的模型可能是这样的:

如果:
我很好我们有足够的时间去买冰淇淋;
你的韧性被磨薄了你不想和我打交道;
你感到大度,
然后:
冰淇淋蛋糕。

我们可以象征性地表达这个规则集:

(我很好 ^ 我们有足够的时间)vt23】(筋疲力尽 ^ 你就是不行) V
(坦荡)

用 python 语言来说:

[[(行为=好),(时间=真)],
[(韧性=瘦),(你=连不上)],
[(感觉=坦荡)]]

如何训练规则集模型

规则集不是通过递归将训练数据分解为子集的子集,而是通过对所有尚未检查的训练数据进行训练来迭代增长。

为了获得训练如何工作的基本味道,让我们首先来看看一个简单的规则集学习算法,称为 IREP。

在将我们的数据分成训练集和测试集之后,我们通过以下步骤在训练集上训练模型:

1.将你的训练集分成“生长集”和“修剪集”

2.增长规则(信息增益)

3.删减规则(减少错误度量)

4.从您的训练集中删除新规则涵盖的示例,并重复步骤 1、2 和 3,直到您开始让事情变得更糟(精度度量)。

在步骤 1 中,我们将训练数据随机分成 2/3–1/3。我们将使用第一部分增长规则,第二部分修剪规则。这有点像交叉验证要求我们留出评估折叠,这种分割确保我们不会使用刚刚用于增长的相同数据进行修剪!

接下来,我们通过贪婪地添加最大化 FOIL 信息增益的条件来增长规则(下面的公式)。随着我们的规则获得越来越多的条件,它变得越来越严格,排除了越来越多的负类例子。(记住,规则是一组“和”的集合,更多的“和”意味着更严格。)当规则不再涵盖负面例子时,我们就停止了。

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

FOIL information gain. p0 (n0) is the number of positive (negative) examples covered by an existing rule, p1 (n1) the number covered by the proposed new rule.

现在是时候修改我们刚刚制定的规则了。我们尝试以相反的顺序贪婪地修剪它的每个条件,选择最大化一些修剪度量的规则,比如这个:

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

Pruning criterion. p (n) is the number of positive (negative) examples covered by the rule, P (N) the total number. Different versions use different prune metrics.

我们刚刚制定并修改了我们的第一条规则!现在我们迭代。从我们的训练集中,删除新规则覆盖的示例。继续增加新规则——使我们的规则集越来越宽松——直到我们增加一个精确度低于 50%的规则。

这是整个过程的可视化:

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

Growing-pruning a ruleset using iterative coverage.

我的新规则集包,维特根斯坦,实现了 IREP,以及另一个叫做 RIPPER 的规则集算法。除了听起来像重金属乐队,开膛手仍然是这种技术的艺术状态。

该算法比 IREP 要复杂得多,但主要区别如下:

  • **一个理论上更严密的停止条件:**RIPPER 没有使用修剪指标来告诉我们何时停止生成新规则,而是借用了昆兰的 C4.5 决策树算法中使用的一种信息论启发式方法,称为描述长度。这个想法是,我们可以在建模过程的任何阶段测量总复杂性(以比特为单位),即我们的试验性模型的复杂性加上它未能捕获的所有示例的复杂性。随着我们的规则集在长度和精度上的增长,模型的复杂性会增加,而它无法捕获的示例数量的复杂性会降低。为了防止过度拟合,一旦总复杂度超过某个阈值,我们就停止增加规则。描述长度指导最小化训练错误和最小化模型复杂性之间的平衡行为。
  • 计算模型的描述长度既复杂又昂贵。但是要点是模型的复杂性是基于的区别性。条件较多的规则比条件较少的规则更复杂,从更大的可能性池中选择条件的规则也是如此。

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

k is the number of conditions in the rule, n the number of possible conditions. r is k/n. ||k|| is the number of bits needed to send k (i.e., log2(k)). The 0.5 factor is to account for possible redundancies.

  • 异常描述长度公式更简单。我们从正面和负面预测中选择假阳性和假阴性的组合。(公式使用组合而不是排列,因为顺序并不重要)。Log₂将十进制值转换为比特:

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

p is the number of examples classified as positive, n the number classified as negative. fp is the number of false positives, fn false negatives.

  • **模型优化:一旦我们生成了初始规则集,我们实际上可以使用我们的模型以更全面的方式重新评估每个规则的贡献。我们考虑用几个备选方案来替换每个规则:一个全新的生长修剪过的替换和一个生长修剪过的原始修订。我们的优化模型使用三者中最好的一个——原始、替换或修订。(“最佳”这个词有点复杂,实现起来也有点可怕。这意味着任何规则都会导致规则集的最小描述长度,这是基于如果我们删除所有其他增加描述长度的规则,我们可以得到的最小可能描述长度。)我们可以根据需要多次重复优化阶段,但原始论文建议进行两次迭代。

不也是这样吗,我们一边玩,一边制定规则?
——路德维希·维特斯坦根

  • **总结:**如有必要,增加一些规则,以涵盖我们的优化模型不再涵盖的任何正面训练示例。最后,去掉任何不能提高描述长度的规则。

在代码中使用规则集

想要使用规则集学习者的 Java 用户可以使用 Weka 的 RIPPER 实现 JRip 。还有 Python 和 r 的 Weka 包装器。

Python 用户也可以尝试维特根斯坦。(可能有其他针对这些特定算法的 Python 包,但我找不到任何包。)这里是 github 回购

从命令行安装:

pip install wittgenstein

这里有一个快速的使用示例,使用令人愉快的毒蘑菇数据集。我们的目标是产生一套规则,可以辨别哪些蘑菇有毒。

让我们从将数据帧加载到 pandas 开始:

>>> import pandas as pd
>>> df = pd.read_csv(mushroom.csv)

训练-测试-分割我们的数据:

>>> from sklearn.model_selection import train_test_split
>>> train, test = train_test_split(df, test_size=.33,              ...                                random_state=42)

维特根斯坦使用与 scikit-learn 相似的 fit-predict-score 语法。我们将训练一个开膛手分类器,将阳性类别定义为有毒。

>>> import wittgenstein as lw
>>> clf = lw.RIPPER()
>>> clf.fit(train, class_feat='Poisonous/Edible', pos_class='p', 
...         random_state=42)

在初始化/拟合期间,我们可以传递几个可选参数:

  • **prune_size**:更改增长/修剪比例。如果你想跳过修剪阶段(刺激,但不推荐!)使用 IREP 时,您可以将其设置为无。
  • **k**:优化运行的次数
  • **dl_allowance**:复杂性停止阈值
  • **verbosity (1–5)**:如果你想知道规则是如何产生的,就用这个。(每个详细级别在文档字符串中都有解释。)
  • **n_discretize_bins**:维特根斯坦会为你自动检测和离散化连续特征——如果你想控制容器的数量,使用这个。

您可以使用默认的度量标准(准确性)或者通过传递您自己的评分度量标准来测试模型。让我们从 scikit-learn 导入 precision 和 recall。我们还将通过计算条件的数量来检查模型的复杂性。

>>> # Split target class feature
>>> X_test = test.drop('Poisonous/edible', axis=1)
>>> y_test = test['Poisonous/edible']>>> # Collect performance metrics
>>> from sklearn.metrics import precision_score, recall_score
>>> precision = clf.score(X_test, y_test, precision_score)
>>> recall = clf.score(X_test, y_test, recall_score)
>>> cond_count = clf.ruleset_.count_conds()>>> print(f'precision: {precision} recall: {recall}
...         conds: {cond_count}')precision: 0.9938..., recall: 0.9977..., conds: 32

我们可以使用 clf.ruleset_ attribute 访问我们的训练模型。经过训练的规则集模型表示“或”的“与”列表:

>>> clf.ruleset_.out_pretty()
[[Stalk-surface-above-ring=k^Gill-spacing=c] V
[Gill-size=n^Stalk-root=?^Stalk-shape=t] V
[Gill-size=n^Population=s] V
[Sport-print-color=h^Cap-surface=s] V
[Gill-size=n^Cap-surface=s^Stalk-shape=e] V
[Gill-size=n^Habitat=g] V
[Population=v^Stalk-shape=e^Bruises?=t] V
[Gill-size=n^Stalk-root=b^Gill-spacing=c] V
[Gill-size=n^Population=c] V
[Gill-size=n^Cap-color=p] V
[Gill-size=n^Gill-color=u^Cap-surface=f] V
[Gill-size=n^Cap-color=g^Gill-spacing=w] V
[Gill-color=g^Stalk-root=b]]

若要生成新的预测,请使用 predict 方法:

>>> clf.predict(mysterious_unseen_mushrooms)
[True, False, False, True, False...

我们也可以要求我们的模型告诉我们为什么它做出了每一个肯定的预测:

>>> clf.predict(mysterious_unseen_mushrooms, give_reasons=True)([True, False, False, True, False...,
 [[<Rule object: [Gill-size=n^Population=s]>,
   <Rule object: [Gill-size=n^Cap-surface=s^Stalk-shape=e]>],
  [],
  [],
  [<Rule object: [Gill-size=n^Population=s]>],
  []...)

相当酷!

效果如何?

我使用 scikit-learn 的 DecisionTreeClassifier 和网格搜索优化的 RandomForestClassifier 作为基线,在最初的 11 个分类数据集(大部分来自 UCI )上重复测试了我的 IREP 和 RIPPER 实现。(我抛出了两个数据集的结果,sklearn 和维特根斯坦分别拒绝做出正面预测。)

将规则集与随机森林这样的集成技术进行比较有点不公平——网格搜索-调整森林使它更加不公平——但我想看看维特根斯坦能在多大程度上与最好的可比较替代方案竞争。

尽管它是一个决策树分类器,scikit-learn 的树实现实际上并不接受分类数据。但是没关系——我们只需要做一点预处理,将数据转换成 DecisionTreeClassifier 可以接受的格式。

首先,让我们使用 scikit 的 LabelEncoder 将我们的分类特征转换成数字特征:

>>> from sklearn.preprocessing import LabelEncoder
>>> le = LabelEncoder()
>>> df_le=df.apply(le.fit_transform)
>>> df_le.head()

然后,我们使用一个热编码来创建虚拟变量。否则我们将被序数特征所困,而不是名义特征!

>>> from sklearn.preprocessing import OneHotEncoder
>>> encoder = OneHotEncoder(sparse=False)
>>> encoder.fit(df_le)
>>> df_hot = enc.transform(df_le)
>>> df_hot.head()

预处理完成,我们现在准备分割我们的数据…

>>> train, test = train_test_split(df_hot, test_size=.33,                             ...                                random_state=random_state)
>>> train_X = train[:,n_classes:]
>>> train_y = train[:,0]
>>> test_X = test[:,n_classes:]
>>> test_y = test[:,0]

…并训练我们的模型:

>>> tree_clf = DecisionTreeClassifier(random_state=random_state)
>>> tree_clf.fit(train_X, train_y)

为我们可爱的树打分:

>>> predictions = tree_clf.predict(test_X)
>>> precision = precision_score(test_y, predictions)
>>> recall = recall_score(test_y, predictions)
>>> print(f'precision: {precision} recall: {recall} node_count:   ...                    {tree_clf.tree_.node_count}')
...

下面是调整和适应随机森林的代码:

>>> forest = RandomForestClassifier(random_state=random_state)
>>> n_features = train_X.shape[1]
>>> grid_params = {
        'n_estimators': [50,100,200],
        'max_depth': [1,3,5,8,10,None],
        'min_samples_leaf': [3,6,10,13,16,20]
    }
>>> clf = GridSearchCV(forest, grid_params, cv=5)
>>> clf.fit(train_X, train_y)
>>> best_params = clf.best_params_
>>> forest = RandomForestClassifier( 
         ... n_estimators=best_params['n_estimators'],
         ... max_depth=best_params['max_depth'],
         ... min_samples_leaf=best_params['min_samples_leaf'],
         ... random_state=random_state)
>>> forest.fit(train_X, train_y)

结果

我的软件包至少在这些数据集上与 sklearn 有竞争力。(详细的 Jupyter 笔记本和测试可以在这里找到。)

以下是每个规则集模型击败每个 sklearn 模型的频率比较,按精度评分:

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

下面是一个回忆对比:

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

我还比较了它们的紧凑性,通过条件或节点的总数来衡量。

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

有些领域维特根斯坦做得很好:

  • **不平衡类:**两种规则集算法都比基于树的方法更好地处理了不平衡类;IREP 和瑞普在精确度和召回率上击败了特里,而且在严重不平衡的数据集上,他们在召回率上都比特里好得多。
  • 过拟合:在训练样本和每个特征样本都较少的数据集上,两种规则集算法在精度上都胜过 Tree,RIPPER 胜过 Forest。(优势没有延伸到召回。)
  • 紧凑性/可解释性: IREP 和 RIPPER 模型比(现成的)树和(调整的)森林更紧凑。

要考虑的潜在缺点:

  • 速度: IREP 和决策树共享相同的时间复杂度——O(an logn),其中 a 是属性个数,n 是例子。但是 RIPPER 的优化阶段在较大的数据集上可能变得耗时,在 O(模拟 n)上。更具体地说,在我将维特根斯坦的关键部分优化成 C++之前,RIPPER 通常是四个中训练时间最长的。另一方面,IREP 运行速度相当快,即使是在 Python 中。
  • 连续特性: sklearn 的 trees 实现了 CART,它使用了比我目前实现的更复杂的离散化算法。目前,对于具有大量连续要素的数据集,您可能会从 sklearn 获得更好的性能,尽管这种情况可能很快就会改变。
  • **性能:**我通常认为 C5.0 树、随机森林和部分决策树(一种混合的树-规则集方法)在大多数(但不是所有)数据集上比规则集模型表现得更好;对 C4.5 和车树,赢家应该更悬而未决。

与任何机器学习模型一样,您的特定数据和您面临的特定问题决定了这项工作的最佳工具。

规则集学习器是一种机器学习方法,实现起来很有趣,在某些情况下,在您的工具集中包含它会很有用。

我很想听听你的想法,所以请随时通过 LinkedInGithub 联系我!

参考

[1]j . funkrantz 和 G. Widmer,增量减少错误修剪 (1994),机器学习 1994 年第十一届年会会议录

[2] J .罗斯·昆兰, MDL 与范畴理论(续) (1995)机器学习 1995 年第十二届国际会议论文集

[3] W. 科恩,快速有效规则归纳 (1995)机器学习 1995 年第十二届国际会议论文集

[4] E. Frank 和 I. H. Witten,在没有全局优化的情况下生成精确的规则集 (1998)机器学习 1998 年第十二届国际会议论文集

[5] T .王等。al,用于可解释分类的学习规则集的贝叶斯框架 (2017)《机器学习研究杂志》

[6]路德维希·维特斯坦根,《哲学研究》 (1958)

如何使用 Seaborn 执行探索性数据分析

原文:https://towardsdatascience.com/how-to-perform-exploratory-data-analysis-with-seaborn-97e3413e841d?source=collection_archive---------1-----------------------

探索性数据分析 ( EDA )是一种分析数据集以总结其主要特征的方法。它用于理解数据,获得与数据相关的一些上下文,理解变量及其之间的关系,并制定在构建预测模型时可能有用的假设。

所有的数据分析都必须以一些关键问题或目标为导向。在开始任何数据分析任务之前,您应该心中有一个明确的目标。当你的目标允许你理解你的数据和问题时,你就能从你的分析中得到有意义的结果!

在本教程中,我们将学习如何使用**数据可视化执行 EDA。**具体来说,我们将关注**seaborn**,这是一个构建在matplotlib之上的 Python 库,支持NumPypandas

seaborn使我们能够制作出有吸引力的、信息丰富的统计图表。虽然matplotlib使得任何东西都有可能被可视化,但是让情节在视觉上吸引人通常是困难和乏味的。seaborn通常用于使默认的matplotlib图看起来更好,也引入了一些额外的图类型。

我们将介绍如何进行可视化分析:

  • 带直方图的数值变量,
  • 带计数图的分类变量,
  • 散点图、联合图和配对图中数值变量之间的关系,以及
  • 盒须图和复杂条件图中数值变量和分类变量之间的关系。

通过有效地可视化数据集的变量及其关系,数据分析师或数据科学家能够快速了解趋势、异常值和模式。这种理解可用于讲述故事、推动决策和创建预测模型。

这个简短的教程改编自 Next Tech 的完整Python 数据分析课程,其中包括预装 Python、Jupyter 笔记本和seaborn 的浏览器内沙盒环境。您可以免费开始学习这门课程!

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

Next Tech’s environment.

数据准备

数据准备是任何数据分析的第一步,以确保数据得到清理,并以可分析的形式进行转换。

我们将在埃姆斯住宅数据集上执行 EDA。这个数据集在那些开始学习数据科学和机器学习的人中很受欢迎,因为它包含了爱荷华州埃姆斯市出售的不同房屋的几乎每个特征的数据。这些数据可以用来预测销售价格。

该数据集已经清理完毕,可以进行分析。我们要做的就是过滤一些变量来简化我们的任务。让我们从将数据作为pandas数据帧读取开始:

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

This image only shows the info for the first five columns in the dataset.

如果您在 Next Tech 已经导入了数据集的沙箱中运行这段代码,或者在 Jupyter 笔记本中运行这段代码,您会看到有 1,460 个观察值和 81 列。每一列代表数据帧中的一个变量。我们可以从每一列的数据类型看出它是什么类型的变量。

我们将只处理一些变量——让我们将它们的名字过滤并存储在两个名为numericalcategorical的列表中,然后重新定义我们的housing数据帧,只包含这些变量:

Out: (1460, 14)

housing.shape中,我们可以看到我们的数据框架现在只有 14 列。让我们开始一些分析吧!

分析数字变量

我们的 EDA 目标将是理解这个数据集中的变量如何与房子的销售价格相关联。

在此之前,我们需要先了解我们的变量。让我们从数字变量开始,特别是我们的目标变量SalePrice

数值变量就是那些值是数字的变量。当我们有数值变量时,我们要做的第一件事是理解变量可以取什么值,以及分布和离差。这可以通过直方图来实现:

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

Distribution of the SalePrice variable.

注意,由于一个内部笑话,库seaborn被导入为sns

只需一种方法sns.set(),我们就可以设计图形的样式、改变颜色、增加字体大小以提高可读性,以及改变图形大小。

我们使用distplotseaborn中绘制直方图。默认情况下,这将绘制一个带有核密度估计(KDE)的直方图。你可以试着改变参数kde=True看看这是什么样子。

看一下柱状图,我们可以看到很少有房子的价格低于100,000,大多数房子在100,000200,000之间出售,很少有房子的价格高于400,000

如果我们想为所有的数字变量创建直方图,pandas提供了最简单的解决方案:

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

Distributions for each of our numerical variables.

从这个可视化中,我们获得了很多信息。我们可以看到1stFlrSF(一楼面积)严重向右倾斜,大多数房子没有二楼,有 3 个BedroomAbvGr(地上卧室)。大多数房屋以 5 的OverallCond和 5 或更高的OverallQual价格出售。视觉效果更加难以解读——但是我们可以看出,在建模之前,可能需要移除一个或多个异常值。

请注意,该图保持了我们之前使用seaborn设置的样式。

分析分类变量

分类变量是那些值被标记为类别的变量。使用条形图可以最好地理解分类变量的值、分布和离散度。我们来分析一下SaleCondition变量。seaborn为我们提供了一个非常简单的方法来显示每个类别中的观察值计数:countplot

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

The bars in this plot represent the number of houses for each condition of sale.

从可视化中,我们很容易看到,大多数房屋是在Normal条件下出售的,极少数是在AjdLand(相邻土地购买)、Alloca(分配:两个有单独契约的关联财产)和Family(家庭成员之间的出售)条件下出售的。

为了可视化我们数据集中的所有分类变量,就像我们对数字变量所做的那样,我们可以循环通过pandas系列来创建支线剧情。

使用plt.subplots,我们可以创建一个 2 行 4 列的网格图形。然后我们迭代每个分类变量来创建一个带有seaborncountplot:

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

Countplots for each of our categorical variables.

第二个for循环简单地获取每个 x -tick 标签,并将其旋转 90 度,以使文本更好地适合绘图(如果您想知道文本不旋转时的样子,可以删除这两行)。

就像我们的数字变量直方图一样,我们可以从这个视觉中收集很多信息——大多数房子都有RL(住宅低密度)分区分类,有Regular地块形状,还有CentralAir。我们还可以看到,在夏季的几个月里,房屋销售更加频繁,大多数房屋是在NAmes(北艾姆斯)附近售出的,2010 年的销售有所下降。

然而,如果我们进一步考察YrSold变量,我们可以看到这种“下降”实际上是因为只收集了截至 7 月的数据。

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

正如您所看到的,对变量及其值的彻底探索非常重要——如果我们在 2010 年销售额下降的假设下建立一个模型来预测销售价格,该模型可能会非常不准确。

既然我们已经探索了数字和分类变量,让我们看看这些变量之间的关系——更重要的是,这些变量如何影响我们的目标变量,SalePrice

分析数值变量之间的关系

绘制变量之间的关系可以让我们很容易地获得对模式和相关性的直观理解。

散点图通常用于可视化两个数值变量之间的关系。创建散点图的seaborn方法非常简单:

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

Relationship between 1stFlrSF and SalePrice.

从散点图中,我们可以看到房屋的1stFlrSF和房屋的SalePrice之间存在正相关关系。换句话说,房子的一楼越大,可能的售价就越高。

您还可以看到默认情况下为我们添加了轴标签,并且标记会自动勾勒出来以使它们更清晰——这与matplotlib相反,在matplotlib中这些标签不是默认的。

seaborn还为我们提供了一个名为jointplot的好函数,它会给你一个散点图,显示两个变量之间的关系以及每个变量在边缘的直方图——也称为边缘图

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

Jointplot showing relationship between 1stFlrSF and SalePrice and their individual distributions.

你不仅可以看到两个变量之间的关系,还可以看到它们各自是如何分布的。

分析数字变量和分类变量之间的关系

盒须图通常用于可视化数值变量和分类变量之间的关系,而复杂条件图用于可视化条件关系。

让我们从用seabornboxplot方法创建盒须图开始:

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

Box-and-whisker plots for each of our categorical variables and their relationships with SalePrice.

在这里,我们已经遍历了每个子图,以产生所有分类变量和SalePrice之间的可视化。

我们可以看到,与其他分区分类相比,具有FV(流动村庄住宅)分区分类的房屋具有更高的平均SalePrice,具有CentralAir的房屋以及具有Partial(上次评估时房屋未完工)SaleCondition的房屋也是如此。我们还可以看到,不同LotShapes的房子之间,或者MoSoldYrSold之间,平均SalePrice差异很小。

让我们仔细看看Neighborhood变量。我们看到,不同的邻域肯定有不同的分布,但可视化有点难以破译。让我们使用额外的参数order按照最便宜的邻域到最贵的邻域(按照中间价格)对箱线图进行排序。

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

Sorted box-and-whisker plot showing relationship between Neighborhood and SalePrice.

在上面的代码片段中,我们按照中间价格对我们的邻居进行了排序,并将其存储在sorted_nb中。然后,我们将这个邻域名称列表传递给order参数,以创建一个排序的盒子图。

这个数字给了我们很多信息。我们可以看到,在最便宜的社区,房子的售价中值约为 10 万美元,而在最贵的社区,房子的售价约为 30 万美元。我们还可以看到,对于一些邻近地区,价格之间的离散度非常低,这意味着所有价格彼此接近。然而,在最昂贵的街区NridgHt,我们看到一个大盒子——价格分布有很大的差异。

最后,seaborn还允许我们创建显示条件关系的图。例如,如果我们对Neighborhood进行调节,使用FacetGrid函数,我们可以看到OverallQualSalePrice变量之间的散点图:

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

This image only shows the first 12 plots. There are actually 25 plots — one for each neighborhood.

对于每个单独的邻域,我们可以看到OverallQualSalePrice之间的关系。

我们还向(可选)hue参数添加了另一个分类变量CentralAir——橙色点对应于没有CentralAir的房屋。正如你所看到的,这些房子往往以较低的价格出售。

FacetGrid方法使得生成复杂的可视化和获取有价值的信息变得非常容易。制作这些可视化效果来快速了解变量关系是一个很好的实践。

我希望你喜欢这个关于探索性数据分析和数据可视化的简短教程seaborn!我讲述了如何创建直方图、计数图、散点图、边际图、盒须图和条件图。

在我们的探索中,我们发现了个别变量中的异常值和趋势,以及变量之间的关系。这些知识可以用来建立一个模型来预测埃姆斯市房屋的SalePrice。例如,由于我们发现了SalePrice与变量CentralAir1stFlrSfSaleConditionNeighborhood之间的相关性,我们可以从使用这些变量的简单模型开始。

如果您有兴趣了解如何做到这一点以及更多,我们在 Next Tech 提供了完整的Python 数据分析课程。从这里免费开始!

本课程探索使用NumPy的矢量化运算、使用pandas的 EDA、使用matplotlib的数据可视化、使用seaborn的附加 EDA 和可视化技术、使用SciPy的统计计算以及使用scikit-learn的机器学习。

如何在完全无数据集的情况下执行图像恢复

原文:https://towardsdatascience.com/how-to-perform-image-restoration-absolutely-dataset-free-d08da1a1e96d?source=collection_archive---------5-----------------------

无学习神经网络图像恢复

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

**深度学习需要大量的数据。**这个短语在考虑对其数据应用深度学习方法的人群中变得流行起来。当没有足够“大”的数据时,人们通常会担心,这主要是因为人们普遍认为深度学习只能使用大量数据。这不是真的。

尽管在某些情况下,你确实需要大量的数据,但是有一些网络可以在一张图片上进行训练。最重要的是,在实践中,即使没有大型数据集,网络本身的结构也可以防止深度网络过度拟合。

这篇文章是关于“之前的深度图像”,这是 Dmitry Ulyanov 在 2018 年 CVPR 发表的一篇有趣的论文。本文证明了 CNN 的结构足以解决图像恢复问题。简而言之,这篇论文声称 CNN 包含了自然图像的“知识”。此外,作者将这一主张用于图像恢复任务,如图像去噪、超分辨率、绘画等。

在这篇文章中,我将涉及三件事:首先,图像恢复任务和一些用例的概述。其次,概述“深度图像先验”以及它如何用于图像恢复任务。最后,我们将使用深度图像先验来执行去噪任务——使用神经网络进行图像恢复,但不需要学习 PyTorch 中实现的 GitHub 知识库

图像恢复

当我们提到图像恢复问题时,我们基本上是指我们有一个降级的图像,我们希望恢复干净的非降级图像。图像降质的原因有很多,主要是图像在传输、形成和存储过程中会发生降质。

图像恢复的任务很多,我们来说三个主要任务:

去噪和一般重建

图像去噪是指试图恢复被附加噪声或压缩等来源污染的图像。

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

Figure 1 — Building! — (Left) Noisy Image, (Right) Denoised Image

超分辨率

超分辨率的目标是获取低分辨率图像,并对其进行上采样以创建高分辨率版本。

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

Figure 2 — Fruits! — (Left) Low-Resolution Image, (Right) High-Resolution Image

图像内置

图像补绘是对图像和视频中丢失或退化的部分进行重建的过程。这种技术通常用于从图像中移除不想要的对象或恢复旧照片的损坏部分。下图显示了画中画结果示例。

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

Figure 3 — (Left) Damaged Image, (Right) Reconstructed Image

当然,还有更多的用例,但是现在让我们试着理解这篇论文的新颖技术。

深度图像先验

1.什么是“先验”?

考虑一下,你需要自己执行超分辨率任务。例如,给你一张低分辨率的图像(下图 4 中左边的图像),一支笔和一张纸,然后要求你解决它。希望这就是你要画的(下图 4 中的右图)。

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

Figure 4 — drawing a face from memory — low resolution to high resolution

那么,你是怎么做到的呢?你可能会利用你对世界的了解;什么是脸,脸的结构,即眼睛、鼻子、嘴等的位置。您还可以使用低分辨率图像中的特定信息。因此,我们可以更直观地将先验定义为我们在缺乏信息的情况下的基本信念。例如,在图像的情况下,图像上的先验基本上代表我们认为自然图像应该看起来像什么。

2.已知和明确的前科

如果您希望计算机进行图像恢复,例如图像去噪,您可能会收集大量干净和有噪声的图像数据集,并训练一个深度神经网络,将有噪声的图像作为输入,只获得干净的图像作为输出。因此,可以说网络通过数据集学习先验知识。这种方法叫做事先学习。****

问题是,这种方法需要大量的噪声和干净的图像对。

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

Figure 5 — Left —noisy images as an input to our network, Right — clean images as the networks output

解决这个任务的另一种方法是执行显式先验手工先验**,其中我们不需要使用除了我们的图像之外的任何附加数据。**

我们可以把这个问题看作一个优化问题,以产生期望的干净图像 x ,其中我们的目标是创建一个图像 x ,它既接近于噪声图像**【x^*,又像干净图像 x 一样“自然”或“清晰”。

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

Figure 6 — Image restoration task — Given the observed corrupted image x^ we want to to get the restored image x that is close to our corrupted image but as clear as possible*

例如,我们可以使用用于去噪任务的像素值之间的 l2 距离或者其他任务相关的数据项来测量被标注为数据项*【e(x,x^】、*** 的“接近度”。**

除了数据项,我们假设有一个函数 R(x) 可以测量图像的“不自然”或“不清晰”。在这种情况下,我们的优化目标的公式将是最大后验分布,以估计来自经验数据的未观察值:

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

E(x;x^)is the data term which is negative log of the likelihood and R(x) is the image prior term which is negative log of the prior.

数据项将项拉向原始图像,确保图像不会偏离太远。另外右边的项,即 R(x),将 x 拉向自然图像的方向,(有希望地)降低噪声。所以我们可以把 R(x) 看成一个正则项。如果没有它,优化器将“过度适应”噪声图像。因此,我们定义先验/正则项的方式对于获得好的结果至关重要。

不幸的是,我们没有自然图像的精确先验。传统上,我们使用手工制作的特征来表示先验,但是这些总是包含一定程度的任意性。本文的本质是细胞神经网络可以作为图像的先验;换句话说,CNN 以某种方式“知道”自然图像应该是什么样子,不应该是什么样子。

2.定义先验的网络结构

因此,呈现最小化图像 x 上的函数的任务

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

Optimize at image space

传统的方法是在图像空间最小化该函数,在该空间进行初始估计,基本上用噪声初始化图像,然后计算该函数相对于x 的梯度,更新我们的权重并重复,直到收敛。

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

Figure 7 — Visualization of the conventional approach optimizing over image space x

但是我们能换一种方式吗?我们可以说,每个图像 x 都是一个函数的输出,该函数将一个值从不同的空间映射到图像空间。

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

这里,我们有参数空间θ,并且我们有从参数空间θ到图像 x 的映射,并且不是在图像上优化,而是在θs 上完成优化

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

Figure 8 — Visualization of the proposed parametric approach optimizing over parameter space θ

在图 8 中,我们可以看到,我们从参数空间中的初始值开始,并且我们立即将其映射到图像空间,计算相对于 g(的梯度。),接着使用梯度下降进行θ更新,并重复直到收敛。

那么,我们为什么要这么做呢?在图像空间上优化和在参数空间上优化有什么区别?函数 g(.)可以被视为一个超参数,它可以被调整以突出显示我们想要得到的图像。即“自然”图像。如果我们仔细想想,函数 g(θ)实际上定义了一个先验。因此不是优化两个分量的和。我们现在将只优化数据项。

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

我们可以定义一个网络结构,例如 UNet 或 Resnet,并将θ定义为网络参数。因此,我们将最小化函数表示如下:

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

其中, z 是随机固定输入图像,θ是随机初始化的权重,将使用梯度下降来更新该权重,以获得期望的输出图像。

明白了吗?这里的变量是θ!与其他类型的网络不同,在其他类型的网络中,固定权重并改变输入以获得不同的输出,在这里,他们固定输出并改变权重以获得不同的输出。这就是他们如何得到映射函数 g(。)到图像空间。

3.为什么使用这种参数化?

你可能会认为使用这种参数化会导致相同的噪声图像,因为我们基本上是过度拟合原始噪声图像。作者在论文中指出,虽然自然图像的优化更快更容易。

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

Figure 9— Learning curves for the reconstruction task using: a natural image, the same plus i.i.d. noise, the same randomly scrambled, and white noise. Naturally-looking images result in much faster convergence, whereas noise is rejected.

每条曲线代表我们优化图像和噪声以及添加噪声的图像时的损失变化。该图显示,与噪声相比,自然图像的损失收敛得更快。这意味着,如果我们在适当的时机中断训练,我们可以获得一个“自然”的图像。这就是为什么这篇论文将 CNN 视为先验:它(不知何故)偏向于产生自然图像。这允许我们使用 CNN 解码器作为在某些限制下生成自然图像的方法。

结果

让我们看看一些常见任务的结果。

JPEG 压缩图像的盲复原

深度图像先验可以恢复复杂退化的图像(在这种情况下是 JPEG 压缩)。随着优化过程的进行,深度图像先验允许恢复大部分信号,同时在最终过度拟合输入(在 50K 次迭代时)之前消除光晕和块效应(在 2400 次迭代之后)。

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

Figure 10— Deep Image prior output for different iterations

图像内嵌

在下图中,in-painting 用于移除覆盖在图像上的文本。深度图像先验结果导致几乎完美的结果,几乎没有伪影。

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

Figure 11 — in-painting result

图像去噪

深度图像先验成功地恢复了人造和自然模式。

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

Figure 12 — Image denoising results

PyTorch 中深度图像先验的实现

既然我们已经看到了深度图像先验背后的概念和数学。让我们实现它,并在 PyTorch 中执行去噪任务。整个项目在深度图像先验中可用——使用神经网络进行图像恢复,但不需要学习 GitHub 知识库

笔记本结构如下:

预处理

前几个单元格与导入库有关,所以要确保正确安装了所有的依赖项。如果在 GitHub 库中列出,你需要安装来执行代码的库列表。此外,这是你选择图像去噪的地方。

在这个例子中,我选择了一张使用杂色噪声生成器 GitHub 知识库应用杂色噪声的图片,如下图所示。

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

Figure 13— U.S Capitol Building — (Left) Clean image, (Right) Noisy image after adding additive noise

最佳化

下面的代码是神奇的地方,随机初始化的图像 z 在 closure()函数中反复更新。计算数据项(本例中为 MSE ),更新参数空间θ get。

该块将在每次迭代中生成一个图像,这样您就可以跟踪优化过程的进度。当你对结果满意时,停止这个过程并运行下面的代码来创建一个很棒的 gif 来可视化整个过程。

请看下面我们实现的去噪任务的结果。右边是嘈杂的图像,左边是整个复原过程。

太神奇了!

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

Figure 14 — (Left) —Clean image x restoration result using Deep Image Prior starting from random initialization up to convergence , (Right) — The Noisy image x^*

结论

如果你对源代码感兴趣,可以在我的深度图像先验中找到——用神经网络进行图像恢复,但不需要学习 GitHub 库

一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。

在那之前,下一篇文章再见!😄

如何挑选一个成功的人工智能项目,第 1 部分:发现问题和收集数据

原文:https://towardsdatascience.com/how-to-pick-a-successful-ai-project-part-1-finding-the-problem-and-collecting-data-9e701e316977?source=collection_archive---------30-----------------------

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

这篇文章是“如何挑选一个成功的人工智能项目”系列文章的一部分。第二部分第三部分。即使你独立地阅读每一部分,它们也能很好地工作。

想象一下,你有 200 个小时的时间来改善你在 ML 的职业前景。这段时间的最佳用途是什么?我在赌做一个投资组合项目。

让我们比较不同的选项:

1.你可以去聚会

2.你可以做教程,遵循模板代码,成为做同样练习的 Github 用户# 2245

3.你可以参加课程或 mooc

选项 1 依赖于意外收获。假设你每 5 次聚会就遇到一个潜在的工作机会(这可能有点乐观!)你很可能会花一年时间去参加聚会,却得不到任何工作机会,如果:

  • 你在纸上/网上看起来并不惊艳,而且
  • 你当面交流不太好

假设通勤和参加会议需要 5 个小时,你能参加多少次会议?40.这是值得进行的 20 次对话。尽管如此,如果没有一些你可以执行的强有力的信号(比如工作经验,或者你从零开始建立的一个有形的 ML 项目),你不会将这些随机对话转化为工作邀请。

选项 2 和 3(教程和 MOOCs)不足以将你与大众区分开来。他们是达到能引起招聘经理注意的水平的先决条件。因为当你试图进入一个新领域(鸡和蛋的问题)时,工作经验很难获得,这让你有了我的首选选项,我写这一系列帖子的原因是:向世界展示你可以通过拥有一个人工智能组合项目做什么。

一个大型项目大大超过了其他选项

有一次我问特德·邓宁:“作为一名面试官,你最关心的一件事是什么?”。他的回答:“我只关心一件事:没人告诉你该做什么的时候,你做了什么。”

拥有一个项目组合显示了创造力,这在数据问题中是极其重要的。

数据清理,甚至是模型拟合,都是一些繁重的工作。我们很可能在未来实现自动化。

什么是不可自动化的(以及您想在哪些方面出类拔萃):

发现问题

值得解决的问题(产生商业价值;帮助某人)

并且可以用当前的技术解决

好,所以你想做一个好的人工智能项目

这篇文章的其余部分是我在我创立的公司指导了超过 150 个人工智能项目五年后所学到的。

我把我所知道的分成四类:

发现问题

收集数据

处理数据

使用模型

发现问题

您的项目帮助或取代了什么人工任务?如果这项任务的决策对一个人来说需要超过一秒钟的时间,选择另一个

机器擅长帮助人类完成枯燥的任务。(来自吴恩达的)经验法则是,你想解决人类不到一秒钟的任务。例如,驾驶就是一长串的瞬间决策。这里面很少有深度思考。写小说不是那样的。虽然 NLP 的进展可能看起来我们越来越接近了,但用 AI 写小说并不是一个好项目。

误区:你需要大量的数据。你需要成为谷歌,才能从机器学习中获得价值

在寻找问题的时候,你也在寻找数据。通常你会觉得没有数据来解决你发现的问题。或者没有足够的数据。数据是有价值的,拥有数据的人不公开数据。有大量的公共数据,但没有一个符合你的需要。

当然,你会想到黑客。也许你可以结合不同的来源?也许你自己生成并标注数据?

然后你在网上读到你需要巨大的数据集。你完蛋了。你不能只靠自己给数百万张图片贴标签。

诚然,对于非常复杂的深度学习模型,你需要那些庞大的数据集。21 世纪对 ML 的一个巨大推动是,现在我们有更多的数据和计算能力来训练更复杂的模型。

计算机视觉和 NLP 中的许多革命性成果都来自于拥有大量数据。

这是否意味着,如果你没有太大的计算集群或太字节范围的数据集,你就不能进行高效的机器学习?当然不是。

库包含预训练的模型(像 Inception V3,ResNet,AlexNet)。您可以使用 then 来节省计算时间。

以 YOLO 为例(你只看一次)。任何拥有现成 GPU 的人都可以在视频中进行实时对象检测和分割。太神奇了。有了这个功能你能构思出多少项目?让它成为一个练习:列出 10 个基于 YOLO 的项目。当你读到这篇文章的时候,很可能有一种新的算法可以更好地完成这项任务。这是活着的美好时光。你不需要万亿字节大小的数据集来从机器学习中获得价值。

挑一个通过“眉毛测试”的问题

挑选问题的技巧和解决问题的技巧一样有用。有些问题会抓住你的想象力,有些问题会让你无动于衷。选第一个。

然后还有那些项目,让人觉得你说的是不可能的。你想要一个吗?

你怎么知道你选对了问题?使用“眉毛测试”你想看到对方听到的时候眉毛上扬。如果没有,继续找。

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

有些问题仅仅是好奇,会耗尽你的资源。不要去找那些。现在使用 ML 有巨大的潜在影响。当你可以让人们的生活变得更容易时,为什么要花时间创建一个从克林贡语到多斯拉克语(两种都是发明的语言)的翻译算法?

AI Deep Dive数据科学务虚会上,我们相信,因为有大量的“好问题”,所以没有借口去挑选一个没有通过眉毛测试的问题。发现一个好的问题是需要时间的。你应该花多长时间?为了通过眉毛测试。

如果你周围的人以前发现了一个好问题,这会有所帮助。有时候,那些在 ML 领域知识很深的人并不像你想象的那样有用。

你在卖 AI 的价值。当你做“眉毛测试”项目时,你不仅帮助了有这个问题的人(永远记住他们),也帮助了你的数据科学家同事。你的项目越令人印象深刻,公众就会越欣赏人工智能对社会的变革性。你为这个领域的其他人创造的机会越多。

你只需要知道一个好主意的大概

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

一位参与者来找我,说他要迟到了,无法接受一个想法,他已经用尽了所有的可能性。他一无所有。

“好吧,让我们看看你热衷于什么。你身上有什么活力?”

“嗯,……我讨厌浪费。”

所以我们用谷歌搜索了“垃圾机器学习”没有太明显,也没有太令人兴奋的事情发生。经过进一步的搜索,我们发现了一个斯坦福大学的垃圾分类项目。学生们有一个垃圾数据集,被痛苦地贴上标签。不过,这并不完全是一个通过“眉毛测试”的想法。

“如果我们不把垃圾分类,而是建造一些可以收集垃圾的东西,会怎么样?”(重复这个想法)

“你是说自动运转的东西?”

“是的,一辆自动驾驶的玩具车。08 批中有一个项目就是这样做的。这辆车在赛道上跑了几圈。你必须修改它来识别垃圾,靠近它,并把它拣出来。”

“听起来太神奇了!”(眉毛测试通过)

随着时间的推移,这个大概的想法从一般的垃圾演变成捡烟头,这对环境很糟糕。随着时间的推移,关于如何捡烟头的细节得到了改进:用针刺它们,而不是试图用机械臂抓住它们。我们将在本系列的后面更多地讨论这个项目。

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

挑一个让你感动的问题。如果什么都不做,那就用“水坑”来倾听能打动人的问题

如果你有你想要解决的问题,你就有很大的优势。你明白这种需要。您可以构建解决方案,并通过将它应用到自己身上来了解它的效果。你可以区分“有好处”和“痛点”在这一点上,我们所做的和创业公司创始人、产品经理所做的并没有什么不同。

你手中握着最接近捷径的东西:你自己有问题。你会节省时间,但不会走弯路。你会敏锐地感觉到要建造什么。

2014 年,我创建了一家公司,但最终没能为电子商务商店做顾客终身价值(CLV)预测。不过,作为一名顾问,CLV 预测的产品是我可以提供给自己的。所以我成了一名“CLV 顾问”我的一个客户雇佣了一名数据科学家,他们全职雇佣了我,所以我神奇地过渡到了数据科学领域。

许多其他人有同样的问题:他们有技术技能,也许是博士,他们想成为数据科学家,但他们不知道如何做。请记住,这是 2014 年,在网络开始沸腾之前,关于如何成为数据科学家的建议。我建立了一个帮助他人解决这个问题的企业,在过去的五年里,它一直运转良好。

我很清楚问题是什么;信息太多,指引不清,面试官不知道如何识别人才。每一步,我都觉得我知道自己在做什么;一种无比珍贵的感情。过渡到数据科学是一个极好的问题;5 年后,人们仍然在为之奋斗。

我不打高尔夫球。如果我想为高尔夫球手打造一款产品,我会完全迷失。我会构建没人需要的功能;我会错过痛点。即使我进行采访并倾听市场,我也会比一个高尔夫球手处于劣势。

因此,我对选择投资组合项目的建议是:选择一个你非常了解的问题。如果是让你感动的问题就更好了。如果你因为自杀失去了三个朋友,建立一些东西来防止自杀。在这种情况下,你自己没有问题,但是你有强烈的动力去解决它。

如果你没有任何问题呢?你一直在同一个行业(比如石油和天然气),所有有价值的问题都会得到解决!

我不相信你。没有哪个行业成熟到可以解决所有问题。但是,好吧,你不能想出一些让你感动的事情,一些你有的问题。

然后观察别人有什么问题。一大群人。他们倾向于聚集在公共场所,抱怨他们的问题;每当你看到人们抱怨某事时,把它变成一个做项目的机会。

哪些公共空间?我称这些为“水坑”。在网上,你可以有默默无闻的论坛,但 Reddit 和 twitter 是最容易的。只是坐在那里‘听’人们讨论问题。了解它的每一个细节。这是一个真正的问题,还是一个“值得拥有”的问题?

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

例如,你可能会加入一个游戏子编辑,看看游戏玩家是否关心在视频游戏中拥有更强的人工智能。或者他们是否关心虚拟现实。这些想法太抽象了,不可能是好的项目想法,但是你明白我的意思了。

收集数据

集成不同的数据源

通常,公司太专注于从他们拥有的数据中获取价值,他们忘记了他们可以使用不在公司内部但公开可用的数据来增加价值。

有大量的开放存取数据。和用于频繁变化的数据的 API。没有理由不使用多个数据源。通过集成 API,可以解决一个更有趣的问题(之前不太明显的问题)。

如需 API 集合,请查看https://www.programmableweb.com/.

当您添加一个新的数据源时,用单一数据源看似不可能解决的问题变得可以解决。枯燥的项目变得生动起来。如果你设法找到一个显示更多价值的转折,吃力不讨好的任务就会变成一种乐趣。

当使用多个数据源时,您必须使用一个共享键(一个在两个数据集中都存在的列)将它们连接在一起。)不能合并没有共享键的数据源,这往往会阻碍许多想法的实现。

不要收集或重复使用数据,而是生成自己的数据

你不需要找到数据,或者拥有它。多亏了预先训练的模型(见后面关于它们的部分),你不需要那么多数据,这意味着你可以自己产生它。去掉“我不太/任何数据”这个障碍,打开了你想解决问题的空间。

为了产生原始数据,我发现了一个大窍门:使用硬件。传感器很便宜,它们给你你自己的数据。

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

京东的上海履行中心使用自动化仓库机器人每天组织、挑选和运送 20 万份订单。4 名工人负责维护设施。JD.com 的仓库数量和面积同比增长 45%。人工智能也影响制造业。批量生产比以往任何时候都更容易,这意味着市场上有更多的硬件“玩具”。像显微镜、分光镜这样你永远也不会认为买得起的东西正在进入大众消费市场,而且非常容易被破解。这些都是很棒的数据来源!

因为深圳,Kickstarter 等。硬件的发展速度比以前快得多。它永远不会像软件一样快速迭代,但我们正在达到这一步。你查过阿里快递上有什么吗?不到 100 美元就能买到多种传感器。将其中一个安装到运行你的代码的手机上,你就有了一台便携式的专用机器。

例如,你可以买一个显微镜,在没有人类医生的情况下用它来检测疟疾。在手机上运行的深度学习已经好到可以计数血液上的寄生虫了。

阿里快递充满了你可以附加到手机上的廉价硬件。你可以混合使用手机(运行 ML 代码)和

例如:我们的疟疾显微镜。

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

Eduardo, AIscope’s founder, after reaching 1000x the first time

疟疾每年导致大约 40 万人死亡,其中大多数是儿童。它是可以治愈的,但检测它并不简单,它发生在世界上医院和医生不太方便的地方。疟原虫挺大的,简单的显微镜就能看出来;标准的诊断方法包括医生清点它们。

事实证明,你可以将 USB 显微镜连接到手机上,并在手机上运行 DL 代码,以与人类相当的精度计算寄生虫。DSR 校友 Eduardo Peire 从公共疟疾数据集开始。虽然很小,但这足以向人们展示价值,他的众筹活动让他有足够的资金飞往亚马逊收集更多样本。你可以在这里关注他们的进展:http://aiscope.net

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

再举一个例子,你可以买一个分光镜,它可以指向任何材料,并告诉你它的成分。它小到可以连接到手机上作为手持扫描仪。你能检测出食物中微量的花生吗?是啊!这就是现实生活中人们遇到的问题的解决方案。如果你对花生过敏,这将给你带来一定的生活质量。

现在传感器很便宜,它们会帮助你获得独特的数据。你可以把手机变成显微镜、分光镜或任何其他工具。内置摄像头和加速度计也是很好的数据来源。

本系列的下一篇:我所学到的关于处理数据的知识,以及这如何帮助你挑选成功的人工智能项目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值