TowardsDataScience 博客中文翻译 2016~2018(一百五十五)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

我们是如何从零开始组织黑客马拉松的

原文:https://towardsdatascience.com/https-medium-com-hugoperrier-how-we-organized-a-hackathon-from-scratch-75ef5d2c2780?source=collection_archive---------7-----------------------

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

Photo by rawpixel on Unsplash

通过这篇文章,我旨在揭开黑客马拉松的神秘面纱,降低任何考虑组织黑客马拉松的人的门槛。

我描述的黑客马拉松专注于“数据科学”这个时髦的话题,但是,在我看来,黑客马拉松并不局限于数据或计算机科学。

我鼓励任何人加入黑客马拉松冒险,不管他们的背景如何。

什么是黑客马拉松?

黑客马拉松这个词是“黑客”和“马拉松”的缩写。“hack”可能用于入侵计算机系统的意思,但我更喜欢寻找快速解决方案(“Hack”)来解决特定问题的广义含义。

这个想法是把有积极性的人聚集起来,组成团队,给他们一个挑战,让他们在短时间内(通常是一天或一个周末)解决,然后让奇迹发生!

例子从技术任务——比如发现安全系统的漏洞——到公开挑战——比如就如何改善伦敦人的通勤状况进行头脑风暴。

这一切是如何开始的…

11 月 29 日星期三收到的电子邮件

“亲爱的雨果

我目前在伦敦帝国理工学院攻读理学硕士学位,我很好奇你们协会是否会组织一次与数据科学相关的黑客马拉松?

最好的,

SK "

有意思…我们去年想组织一次黑客马拉松,但没有实现…我们应该再试一次吗?

**是的,我就是这样开始的!**但在我描述我的黑客马拉松组织之旅之前,让我自我介绍一下:

我叫雨果·巴黎水,我在法国阿尔卑斯山长大。在洛桑、斯德哥尔摩和苏黎世学习后,我最终去了伦敦攻读流体动力学博士学位。

那时,我对“类似黑客马拉松”活动的体验仅限于巴厘岛的“创业周末”,我在那里度过了一个周末,启动了一个商业想法。

我必须说,起初,组织一次黑客马拉松对我来说听起来很吓人。如果参与者不喜欢提出的挑战怎么办?如果没人出现呢?

我早期的审讯

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

Photo by Kyle Simmons on Unsplash

黑客马拉松形式

黑客马拉松的一种普遍形式如下:

周五晚上与你的团队见面,整个周末工作,周日下午向评委展示。

三天一个活动挺长的!我们能在整个周末保持参与者的积极性吗?如果人们在周五晚上退出怎么办?是不是太贵了?

挑战的类型

数据科学竞赛并不新鲜。有了在线平台 Kaggle,竞争对手被给予解决同样的问题,并且有一个明确的量化指标来对参与者进行排名。

Kaggle 式的挑战便于组织和判断,但是它们技术性太强,与大多数企业面临的挑战相去甚远。

我们的目标受众是多样化的,包括有商业背景的学生。为了取悦所有人,我们正在考虑更多的开放式挑战。向参与者提供与业务相关的数据,并让他们决定他们想用这些数据做什么。

据我所知,这种类型的挑战在数据科学领域并不常见。我们有能力组织一场新型的黑客马拉松吗?

组建团队并开始行动

组织黑客马拉松听起来工作量很大,我肯定需要一个团队来帮助我。我的第一个想法是与我担任副主席的学生社团讨论黑客马拉松。我来介绍一下 ICDSS。

帝国学院数据科学学会

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

该协会拥有庞大的会员基础、高效的沟通渠道(邮件列表、社交媒体)、赞助商网络和在校园组织活动的经验。但是有一个问题…大多数委员会成员已经忙于其他 ICDSS 活动和考试。

所以我们在这里,与 SK(来自电子邮件),SL(ICDSS 的营销主管)和我在一起。这是一个开始,但可能还不够。

我想我们需要帮助!!

研究生会(GSU)

1 月 10 日星期三收到的电子邮件

“亲爱的研究生们:

研究生会(GSU)是伦敦帝国理工学院所有研究生的唯一代表。

[…]

大数据黑客马拉松

我们已经和几个横跨不同行业的大公司取得了联系(有待透露)。公司会提供与大数据相关的问题来解决。学生组成多学科团队,竞争最佳解决方案。

日期**😗*2018 年 4 月 28 日

[…]

GSU 总统”

哇!!这是及时的!研究生会(GSU)也提出了同样的想法。我不认识那里的任何人,但他们似乎在我们前面,让我们试着联系一下!

与 GSU 会谈的要点

  • 名称:大数据黑客马拉松——帝国理工学院数据挑战赛——数据日——等。
  • 目标受众:我们应该只招收研究生还是包括本科生?
  • 预期人数:约 80 名学生,6-8 家公司提供挑战(目前已确定 3 家),从每家公司获得 2 名助手。
  • 财务:通过要求参与公司出资来支付费用(500 英镑/公司)。如有必要,使用社会资金。
  • 场地:使用大学基础设施(待定)。
  • 营销:社团的邮件列表和社交媒体、传单、校园屏幕等(我们需要更多,让我们发挥创意!).
  • 参与者报名 : Eventbrite?谷歌表单?(待讨论)
  • 日期:仍未确认,有与复活节假期冲突的风险。

太好了!GSU 团队非常友好,他们乐于合作。仍然有许多工作要做,但是,现在,我们已经有足够的人员和路线图可以遵循。当务之急之一是**找到提供挑战的公司!**这被证明是最困难的部分之一。

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

The IC Data Challenge organizers

寻找参与黑客马拉松的公司

我们正在组织首届 IC 数据挑战赛(没错,这就是我们选择的名称)。没有人听说过我们,挑战的形式仍然不确定,在这一点上,我们召集 70 名学生的能力是不确定的。

尽管我们自己也有疑问,但我们需要让公司相信黑客马拉松正在发生,他们将从中受益。

我们如何说服公司加入冒险?!

简单的答案是招聘。黑客马拉松是学生和公司员工互动的特权环境。公司有机会向顶尖大学的学生深入展示他们的业务。

起初,联系公司的任务令人沮丧:发送冷冰冰的电子邮件,得不到回应,面对管理上的死胡同。即使我们得到了积极的回应,也需要做大量的工作来保持沟通。有时,我们还需要适应公司的特定需求。

“嘿 SK,

谢谢你伸出援手。

我们通常不赞助黑客马拉松。有没有一本所有学生都参与的简历书?这样,我们可以审查并决定这是否是我们想要考虑的事情。

最好的,

X 公司"

一本履历书!真的吗?那个特别的回答很吓人!

获得第一个积极的回应需要奉献和毅力。几周后,我们获得了一家大公司(一家提供食品的公司)的参与,团队士气大增。在接下来的几周里,又有一些公司加入了黑客马拉松,干得好,伙计们!

说服学生参与黑客马拉松

如果你和我一样,你参加过一些活动,比如聚会、会议、培训等,由于定向广告,你现在淹没在活动邀请的海洋中。

由 DeepMind 的联合创始人主演的关于人工智能未来的演讲?哇,我一定要注册!

如果你像我一样,你也会中途退出你报名参加的活动。一天只有 24 小时,我们都需要睡眠。

这正是我们在大学组织的活动所发生的事情。根据我们的经验,参加活动的人数大约是注册人数的三分之一。我们怎样才能保证参与者的正确数量?

我不会用我们采取的策略的细节来烦你,但我想给你一个遇到的挑战的提示。

营销材料设计

说到广告,一个很酷的 logo 和一张精美的宣传单能帮上大忙!幸运的是,ICDSS 的委员会中有熟练的设计师。我敢打赌,我们很快就会得到高质量的营销材料!

3 月 30 日星期五在时差收到的消息

“嗨,团队,

对此我深表歉意,但不幸的是,我的公寓两天前遭到了搜查。

我们很多贵重物品被偷了,包括我的笔记本电脑。警方的法医小组来做了犯罪调查。在我的新笔记本电脑到来之前,我无能为力。

幸运的是,我把所有东西都存到了 Dropbox,所以文件应该还在。

祝你好运,

SL(ICDSS 营销主管)"

听到 SL 被搜查的消息很难过…但他还是设法把文件保存在了 Dropbox 上。这家伙是个英雄!

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

Advertisement flyer for the IC Data Challenge designed by SL

我们的广告策略非常有效,我们记录了 300 份 IC 数据挑战申请!

还有许多其他与组织黑客马拉松相关的话题。活动后勤,组成(平衡的)团队,给公司分配团队,评判(陪审团,标准),奖励等等…

为了简洁起见,我将跳过这些话题,直接跳到黑客马拉松那天。如果你想知道更多,请随时留下你的评论。

帝国理工学院数据挑战 2018

黑客马拉松终于要开始了,我们需要解决最后一分钟的事态发展:公共交通中断,一名学生不请自来,Wi-Fi 问题。上午 8:00,我们准备启动活动!我们首先介绍公司和面临的挑战。

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

IC Data Challenge participants listening to the company presentations.

创建算法来预测公共交通延误。分析足球比赛中进球或黄牌等事件如何影响赔率。调查各种餐馆的食物菜单,并对推荐的食物进行分类。提出的挑战范围很广。

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

IC Data Challenge participants getting insight from their assigned industry supervisor.

在 12 个小时里,这些挑战让参与者忙个不停。挑战是激烈的,但参与者得到了公司主管的帮助。一些团队太专注于他们的挑战,以至于错过了食物休息时间!

IC 数据挑战赛是一项竞赛,因此每个团队都要向评审团展示自己的作品。最佳技术演示和最佳商业演示获得了两项现金奖。

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

Team who won the best business presentation prize (500£).

参与者、行业帮手、评委、组织者,一天下来,我们都显得筋疲力尽。为了放松和结束忙碌的一天,我们邀请大家去大学酒吧喝一杯。

参与者的反馈

“我以前从未参加过黑客马拉松。在一个多学科团队中工作对我来说是新鲜的,但这非常刺激。

DM(集成电路数据挑战参与者)”

花一整天的时间和团队一起完成一项挑战,是结交新朋友的好方法。参与者喜欢团队合作,也有机会认识不同背景的人。

学术界和公司之间有一条鸿沟。对于学生来说,黑客马拉松是一个接触行业问题和增长商业意识的绝佳机会。他们也有机会为将来找工作发展有价值的技能。

尽管有很多积极的反馈,但最后一刻披露的挑战让一些参与者感到措手不及。一名学生提到,如果提前几天通知,他本可以熟悉相关技术。对于未来的活动,尽管有退出的风险,我们应该尽早让参与者了解挑战。

来自公司的反馈

对公司来说,提出挑战并不容易,尤其是对初创公司。他们中的大多数人以前从未参加过黑客马拉松。他们必须收集、清理和匿名化挑战所需的数据。这些任务需要付出巨大的努力。他们还必须就挑战的复杂性集思广益,是不是太容易了?太用力了?太具体了?太开放?

不过,我们从公司得到的反馈令人鼓舞。他们珍惜与各种学生交流的机会。如果一些参与者在黑客马拉松后被雇佣,我不会感到惊讶!

所有的公司都说他们愿意参加我们组织的下一次黑客马拉松!

总结一下…

组织一次黑客马拉松是一次令人生畏的经历,有时令人沮丧,而且常常令人不安。然而,整个过程也真的令人兴奋,最终,非常值得!

我相信,由于我们学到的教训,下一届帝国理工学院数据挑战赛将会更好,我希望我的故事能激励其他人继续前进,规划丰富的活动。

承认

非常感谢所有的黑客马拉松组织团队,GSU 和 ICDSS。你做了出色的工作,使这次活动成为可能!

公司和参与者都表现出极大的热情,这使得活动非常愉快。这是我能期待的最好的回报!

我也很感谢给我反馈帮助我写这篇文章的人。欢迎在评论区提出更多的批评、建议和问题。

将吴恩达第一深度神经网络应用于泰坦尼克号生存数据集

原文:https://towardsdatascience.com/https-medium-com-janzawadzki-applying-andrew-ngs-1st-deep-neural-network-on-the-titanic-survival-data-set-b77edbc83816?source=collection_archive---------0-----------------------

你被吴恩达第一个关于深度学习的 Coursera 课程震惊了,甚至可能在一周内就把它吃光了。我们都是!但是,在将新获得的知识应用到新的数据集之前,请控制您急切的手指不要跳到第二道菜。

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

Utilize Andrew Ng’s Deep Learning course to predict Titanic Survival rates

这篇文章介绍了神经网络在 kaggle 的泰坦尼克号生存数据中的应用。它帮助读者加深对神经网络的理解,而不是简单地执行吴恩达精心安排的代码。泰坦尼克号的生存数据集只是一个例子。请随意使用您喜欢的任何其他二元分类数据集!

代码在 Github repo 这里。现在让我们开始享受乐趣吧。

  1. 从 Coursera hub 下载“深度神经网络应用”和“dnn_utils_v2.py”文件并保存在本地
  • Github repo 不包含 deeplearning.ai 提供的代码,请报名参加 Coursera 深度学习专业化的课程 1。所需材料在第四周的编程作业中。

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

Download the “Deep Neural network Application v3” notebook from the Coursera hub and click on “Open”

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

Download the dnn_app_utils_v2.py file

2。从 kaggle 下载 泰坦尼克号生存数据集 并将其保存在“数据集”文件夹中与您的笔记本相同的位置

  • 为了方便起见,我已经在 Github repo 中包含了数据集

3。打开“深度神经网络应用”笔记本

  • 除了 import 和 L-Layer_model 单元格之外,您可以安全地删除所有其他单元格
  • 运行两个单元

4。加载泰坦尼克号生存数据集

5。预处理数据集

  • 基于阶层估算乘客年龄——这是何塞·波尔蒂利亚极力推荐的 Udemy 课程“Python 用于数据科学和机器学习训练营”,逻辑回归的一个分支
  • 从姓名中提取乘客头衔——我跟随了 Manuel 关于从姓名中提取头衔的伟大而简单的帖子,感谢分享!
  • 删除列 passengerId、cabin 和 name
  • 虚拟编码分类变量性别、出发和标题
  • 比例年龄和费用-特征比例有助于梯度下降算法更快收敛,请参考 scikit-learn 文档或 Github repo

预处理后的数据现在看起来像这样:

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

The training set contains 11 features, ready for the neural net to evaluate it

6。应用你的神经网络

获取 X 和 y 变量,然后转置它们以适应神经网络架构。

根据你的特征数量选择第一层尺寸。在这种情况下,第一维是 11。随后选择尽可能多的隐藏层。

The first try yields 85% training and 82% test accuracy!

预处理测试数据。通过使用 X 和来自训练神经网络的参数的前向传播来生成预测。

Last step: Generate predictions on the test data

瞧啊!您生成了预测,并将其保存为 csv 文件,现在您可以将该文件提交给 kaggle 。这个预测会让你进入前 30%的参与者。

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

Submitting the predictions file lands you in the upper third and helps you get used to participating in kaggle competitions

恭喜你,你已经将神经网络应用到你自己的数据集中了!

现在我鼓励你去玩网络中的迭代次数和层数。能提高分数吗?你做了哪些不同的事情?

将神经网络应用于泰坦尼克号生存数据集是否有些矫枉过正?大概吧。

网络是否正规化优化?还没有。完成课程 2 后,我们可能会有现成的工具来调整我们的神经网络并提高我们的分数。

关键要点:

  • 从 Coursera hub 下载“应用深度学习”和“dnn _ utils _ v2”jupyter 笔记本,并在您的本地环境中运行它们
  • 相应地预处理您的数据
  • 转置你的 X 和 y 变量,这样你就有了一个“示例特征”训练矩阵
  • 调整第一层尺寸以匹配您的要素数量
  • 训练神经网络并保存生成的参数
  • 通过对测试数据和以前保存的神经网络参数进行正向传播,生成对测试集的预测

感谢您阅读帖子。欢迎通过 LinkedIn联系我,在评论中提出问题,或者关注我,了解我在通往成功的Coursera 深度学习 T13 专业化道路上的最新知识。

甜还是骗?完成吴恩达的第二个课程后,建立一个运动鞋评分者

原文:https://towardsdatascience.com/https-medium-com-janzawadzki-sweet-or-cheat-build-a-sneaker-rater-after-finishing-andrew-ngs-2nd-course-49475fc75429?source=collection_archive---------5-----------------------

你尝过 tensorflow,现在你想要更多。创建您自己的图像分类器来评价运动鞋,并将其应用于吴恩达的第二课程 tensorflow 网。

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

Hotter than the sun or cooler than the north pole? Let’s find out.

Youbing吴恩达深度学习专业化的第一期课程,应用你的所学,完成了 deeplearning.ai 的第二期课程,你用 tensorflow 实现了你的第一个神经网络,并见证了它创造的奇迹。现在,您很想看看自己能否创建一个图像分类器。

我们将一起从零开始创造一个男式运动鞋评级机构。这篇文章向你展示了如何将运动鞋图片抓取、评级和摄取到你刚刚完成的 tensorflow 网络中。我们依靠首席执行官和snkrgks.com蒂姆·瓦尔兹的创始人的天真无邪的品味来评价大约 1400 双运动鞋的吸引力。

这里描述的过程可以用来创建任何类型的图像分类器。要不要给车打分?衣服?行星?你需要的只是一个想法,按照这些步骤收集和标记数据,并应用深度学习。

该代码可在 github repo 上找到。让我们踢它。

收集数据

任何机器学习算法最重要和最有价值的成分是它的数据。我们需要大约 1400 张图像来训练我们的神经网络,就像吴恩达的手指例子一样。你可以随意使用和标注更多。我决定借助简单而高效的 Python ImageScraper 库从一个流行的时尚网站上抓取图片。

安装图库并访问包含您的图像的网站。执行以下命令:

image-scraper 'https://www.fashionsite.com/mens-sneakers/'

该工具将自动从网站下载所有图片,并将其保存在一个单独的文件夹中。请注意,您可能需要增加页码,以便不仅从第一页抓取图像。从第二页抓取图像的命令如下所示:

image-scraper 'https://www.fashionsite.com/mens-sneakers/?p=2'

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

Example of a scraped sneaker image

请注意,抓取图片并不一定适合每个网站。因为我们只是将这些数据用于我们的私人项目,所以应该没问题。但是您也可以创建一个 API 调用并以这种方式收集数据。易贝的友好的人们提供了一个记录良好的 API 来收集他们的库存信息。

遍历页面后,您应该已经收集了足够多的图像。恭喜你,你已经完成了图像分类器的基础工作!该喝点咖啡了,然后继续。

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

将图像裁剪为相同大小

现在您已经收集了足够的数据,您必须将图像裁剪为标准大小,以便您的网络可以处理输入大小。幸运的是, ImageMagick 为我们提供了所需的所有工具。

首先,试着找出最适合你的图片的尺寸。尝试使用 2 的不同指数作为窗口框架,例如 128x128、256x256 等,并添加 x 和 y 偏移以捕捉图像,同时裁剪掉不必要的像素。执行以下命令:

convert -crop 256x256+1+50 pic_to_be_cropped.jpg cropped_pic_name.jpg

为了理解{ Width } X { Height }+{ X _ Offset }+{ Y _ Offset }命令,我发现这篇文章很有帮助。一旦你确定了最佳图像尺寸,批量裁剪文件夹中的所有图像。

mogrify -crop 256x256+0+50 -path ./cropped/ *.jpg

该命令将裁剪当前路径中的所有图像。jpg 扩展名,并将图像保存在新创建的名为“cropped”的文件夹中。

在你去除了不必要的信息并标准化了你的图片尺寸后,我们将进入有趣的部分——给你的图片加标签。

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

Hotdog or not hotdog? Time to label images. image credit: https://www.theverge.com/tldr/2017/5/14/15639784/hbo-silicon-valley-not-hotdog-app-download

标签图像

你收集了大量的图片。现在,您需要一种简单易行的方法来给这些图像评级。

由于找不到符合我们需求的库,我自己创建了一个 Python 模块。该工具允许您设置评级范围,例如从 1 到 5,并读取文件夹中带有裁剪图像的每个文件。我正在把这个库上传到 PyPi,这样你最终可以 pip 安装它。现在,你可以查看下面的代码,或者从 github 获取脚本。

将文件保存在与裁剪图像数据集相同的文件夹中。导航到您的文件夹结构,并执行以下命令行:

python imagerater.py -i 1 -x 5-f ‘./cropped/*.jpg' -q “Rate shoe here: “

该命令执行 imagerater 脚本,在 1 到 5 之间设置等级,读取所有。jpg 图像,并将输入提示定义为“Rate shoe here:”。

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

Executing the imagerater script displays an image and allows you to rate it.

该库将您的图像展平、标准化并保存在一个 m x n 矩阵中,m 是您的图像数量,n 是您的图像展平后的大小加上指定的评级。

给你的图片打分的技巧

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

Timm is locked in rating sneakers.

Timm 是运动鞋专家,根据预定义的标准应用严格的分级,以确保同质评级。我们建议您也这样做。如果你在评价图像时不坚持一种模式,没有神经网络能够从随机标记的数据中归纳出规律。

Timm 在审查运动鞋方面很有经验,之前已经收到和评估了数百次踢腿。查看他关于粉丝最爱的 overkill x hummel 马拉松发布的文章。在评价运动鞋时,Timm 遵循明确的模式,并专注于鞋的形式、材料、颜色和缓冲。他倾向于不顾鞋子品牌而客观地评判每一双运动鞋。

他更喜欢简单而优雅的低帮鞋,得体的颜色(没有不必要的亮色),高质量的材料和顶级的缓冲,以获得最佳的舒适度。关于运动鞋的背景信息,比如围绕 Yeezy Boost 的人为炒作,不包括在这篇评论中,因为一个网络通常无法找出围绕一双鞋的公关努力。

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

Prime example of a 5 star rating

恭喜你,你刚刚完成了最复杂最耗时的任务!现在有趣的来了,让我们应用吴恩达的 tensorflow 网上的数据。

应用神经网络

从 Coursera hub 下载 Coursera 课程 2“tensor flow 教程”笔记本和“tf_utils”文件。执行所有方法并将保存的图像数据加载到您的笔记本中。

现在,让我们调整吴恩达的代码,以适应我们的训练数据。采取以下三个步骤:

  1. 随机洗牌,把你的训练数据分成 X 和 Y 变量。
  2. One_hot_encode 你的 Y 变量。将 Y dtype 调整为 int,tf_utils 不能处理 float。如果您遇到 one_hot_encoding 的问题,请尝试增加目标类的大小。有时,训练数据中会出现一个非故意的零分。
  3. 将 W1 中的第一个输入图层大小更改为与展平数据相匹配。在我们的 246x256 像素图像中,我将第一个维度从 12228 更改为 188928。还要更改 W3 和 b3 中的输出变量,以匹配类的数量。我们使用从 1 到 5 的等级量表,因此我们有 5 个等级。

就这样,现在你准备好了!按 Shift + Enter,让模型运行。

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

Result of training the tensorflow network.

正如我们所见,神经网络很好地收敛了。看起来我们有一个偏差问题,训练精度似乎没有应有的好。测试准确率也真的很低,比随便猜五个类中的任何一个都差。这种行为是意料之中的,因为我们只训练了一个非常浅的网络,并且没有应用任何优化技术。我只是为了好玩,训练了一个稍微深一点的网络,把准确率提高到了 36%,所以分类器还有很大的改进空间。

在下一次迭代中,我们将应用 deeplearning.ai 第三次课程中的技巧进一步改进你的模型,并可能使用我们将在第四次课程中学习的网络架构(有人说了 ConvNet 吗?).

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

1–5, how would you rate it?

恭喜你!您成功地从头开始构建了自己的图像分类器,并应用了之前学到的知识。我知道 deeplearning.ai 的人会为你感到骄傲,我肯定。

所有深度学习学分归 Coursera 和 deeplearning.ai 所有。

如果你想阅读更多关于 Coursera 深度学习专业化和其他机器学习冒险的内容,请为这篇文章鼓掌,并在 Medium 上关注我。如果你认为我们应该继续这个项目,请随时在 LinkedIn 上给我发消息或评论这个帖子。感谢您的关注。

在 Scout24 担任数据科学家

原文:https://towardsdatascience.com/https-medium-com-janzawadzki-working-as-a-data-scientist-at-scout24-48b15286e1a?source=collection_archive---------5-----------------------

欧洲独角兽公司应用创新的结构和方法来充分利用他们的数据科学团队。找出方法。

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

我和 Scout24 数据科学团队正在撰写我的硕士论文,并在这里学到了很多关于实践和组织结构的知识。在我之前担任管理顾问期间,我见过不同的组织,我相信 Scout24 已经找到了一种有趣的组织结构和方法组合,可以与数据科学家合作。在结束我的工作之前,我想让大家了解一下在 Scout24 做一名数据科学家的感受。

所以,请舒适地坐好,系好安全带,去探索 Scout24 数据科学家的世界。

谁是 Scout24?

就房源数量、用户数量和在平台上停留的时间而言,Scout24 AG 是欧洲领先的房地产和汽车销售在线平台。这家上市公司每月接待约 800 万独立访客,并雇佣 1200 名球探。它的使命是“激发你的最佳决策。我们连接人、车和家。”其主要平台有 ImmobilienScout24AutoScout24Scout 消费者服务。Scout24 在柏林、慕尼黑和巴塞罗那设有办事处。预计 2018 年收入将超过 5.4 亿€,估值为 30 亿€,你可以称该公司为欧洲在线巨擘。对数据科学家来说,最酷的事情是首席执行官最近宣布许多新产品将使用人工智能。此外,其中一个核心价值是数据驱动,这将数据科学置于驾驶员位置,以提供新的见解和产品。

Scout24 的数据科学家是如何工作的?

数据科学团队是 scout 24 DNA 的一部分,即数据分析团队。DNA 由专门的数据工程师、数据分析师和数据科学家组成。这些团队都坐得很近,所以每当出现问题时,通常会联系具有互补技能的同事。数据科学团队采用敏捷的工作方法,包括与来自慕尼黑的同事一起进行每日状态更新、回顾和深入研究,等等。

Scout24 以用户为中心,拥有由产品负责人和软件工程师组成的专门跨职能团队,为特定的用户组维护和创建产品。这些团队被称为细分市场,DNA 服务于所有细分市场,使他们能够做出数据驱动的决策,并构建机器学习产品。

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

Data Science is a part of DNA which supports all market segments in serving Scout24’s users.

细分市场划分优先级,并决定团队下一步的工作计划。这种基于项目的工作方式确保工作永远不会无聊。数据科学团队成员还担任公司其他部门的顾问,帮助他们确定计划范围并讨论想法。

创新不是你兼职做的事情,你必须全身心地投入。—sébastien Foucaud 博士,Scout24 前数据科学主管

该公司还进行季度数据实验室。来自各个领域的童子军提出与新数据产品相关的想法,最有希望的三个想法由一组数据科学家、工程师和分析师进行测试。数据实验室的目标是试验开箱即用的想法,并提供概念证明。这个想法可行不可行?如果是这样的话,这个项目将在下面的一个计划中被推向市场。一个很好的例子是 https://www.propertyinvestgermany.com/的平台,一个测试如何最好地将建筑开发商与国际投资者联系起来的 MVP。这是第一次 DataLab 迭代的结果。点击了解更多关于项目的信息。

Few impressions from the DataLab pitch event.

除了这些计划之外,数据科学团队还采用了数据科学常驻计划。常驻数据科学家专门负责一个细分市场,并为该团队提供支持。这位数据科学家致力于细分市场的特定数据产品。

数据科学家在 Scout24 做什么项目?

Scout24 是一个数据驱动的组织。该公司拥有大量有价值的数据,因此数据科学部门在开发新的数据产品方面处于关键地位。

  • 推荐 提供了一种更好的方式来探索庞大的房地产和汽车列表目录。推荐引擎将用户的搜索行为与来自相似用户的搜索相匹配,并推荐新的房产或汽车。这些推荐非常成功,每个月都会带来 10 万条额外的联系线索。此外,3 个推荐项目中的 2 个不会被用户通过常规搜索找到。
  • 预测引擎计算哪些用户正在寻找抵押贷款。该引擎现在向感兴趣的用户推荐抵押贷款。结果是:点击率比最佳人类猜测高出 10 倍,通知减少了 88%以避免用户收到垃圾邮件,通知打开率增加了 228%,从通知到实际销售线索的比率增加了 27,000%。这表明数据科学团队在找到相关用户并向他们传递相关信息方面做得非常出色!
  • 当你在 AutoScout24 上寻找新车或二手车时,你现在会看到每辆车的价格评估,显示一个好的、公平的或不好的价格。由于大多数用户很难判断销售价格是好是坏,数据科学团队为他们开发了一个解决方案。对于二手车,他们会根据市场价格计算出一个定制价格建议。查看博客上的视频,了解更多关于它是如何工作的!

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

Pssst — this Lambo Huracán is a good price!

该团队还有大量其他令人惊叹的计划,敬请关注新的数据驱动产品和博客帖子。

Scout24 为员工提供了什么?

The Data Analysts sharpen their R saw in their learning group

Scout24 致力于培养一种学习文化。数据科学团队每周进行两次学习会议,他们在不同的在线学习课程中工作。每位员工都可以从日常工作中抽出时间来提高自己的技能。此外,该公司还组织了童子军学校,在那里,童子军们聚集在一起,互相教授他们想要的任何东西。童子军学校提供冥想课程,例如教德语、英语和瑜伽。

The Scout School is here to teach you new skills.

公司还积极支持员工参加会议并在会上发言。数据科学团队的成员在伦敦举行的 2017 年预测分析世界上展示了 AutoScout24 价格估值。如果你想参加一个会议,Scout24 支持你。

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

The Scouts Alexander Diergarten and Dr. Sean Gustafson representing Scout24 Data Science during the Predictive Analytics World London 2017.

除了数据实验室,该公司还提供一年两次的黑客周。如果你没有机会参加这个 DataLab 迭代,你有整整一周的时间来构思自己的想法,不要问任何问题。自由!

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

A Scoutie trying out new ideas during a hackweek project.

Impressions from the Hackweek.

最后但并非最不重要的一点是,在柏林、慕尼黑、巴塞罗那的中心位置,以及 OneScout 方法,搬迁到另一个办公室真的不成问题。

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

The rent map shows the average rent price for a two-bedroom, 70 m2 apartment close to each public transport station in Berlin.

虽然我已经决定毕业后接受一份不同的工作,但我对这家公司只有温暖的感觉,并强烈建议你去看看他们的博客求职板寻找新的内容和空缺职位。

摘要

概括一下这篇文章,Scout24 的数据科学家是跨职能团队的一部分,与数据工程师和数据分析师一起工作。数据科学家帮助细分市场建立相关的数据产品,以激励用户找到他们梦想中的房子或汽车。作为一颗樱桃,数据实验室鼓励创新,允许对新想法进行实验,从而产生新的见解,有时还会产生新产品。

我希望您喜欢这篇关于 Scout24 数据科学家日常工作的离题文章。你觉得他们的数据科学方法怎么样?请随意在下面添加任何评论。期待您的反馈。✌️

有用的 Keras 功能

原文:https://towardsdatascience.com/https-medium-com-manishchablani-useful-keras-features-4bac0724734c?source=collection_archive---------0-----------------------

以下是一些有趣功能的总结,我觉得在我构建深度学习管道时,我会发现参考这些功能很有用,也就是我通常不记得的东西。来自 Keras 文档 https://keras.io 和其他在线帖子。

当验证损失不再减少时,我如何中断培训?

您可以使用EarlyStopping回调:

**from** keras.callbacks **import** EarlyStopping
early_stopping = EarlyStopping(monitor='val_loss', patience=2)
model.fit(X, y, validation_split=0.2, callbacks=[early_stopping])

如何获得中间层的输出?

一个简单的方法是创建一个新的Model,它将输出您感兴趣的图层:

**from** keras.models **import** Modelmodel = ...  *# create the original model*layer_name = 'my_layer'
intermediate_layer_model = Model(inputs=model.input,
                                 outputs=model.get_layer(layer_name).output)
intermediate_output = intermediate_layer_model.predict(data)

或者,您可以构建一个 Keras 函数,在给定特定输入的情况下返回特定图层的输出,例如:

**from** keras **import** backend **as** K*# with a Sequential model*
get_3rd_layer_output = K.function([model.layers[0].input],
                                  [model.layers[3].output])
layer_output = get_3rd_layer_output([X])[0]

类似地,您可以直接构建一个 Theano 和 TensorFlow 函数。

请注意,如果您的模型在训练和测试阶段有不同的行为(例如,如果它使用DropoutBatchNormalization等)。),您需要将学习阶段标志传递给您的函数:

get_3rd_layer_output = K.function([model.layers[0].input, K.learning_phase()],
                                  [model.layers[3].output])*# output in test mode = 0*
layer_output = get_3rd_layer_output([X, 0])[0]*# output in train mode = 1*
layer_output = get_3rd_layer_output([X, 1])[0]

如何在 Keras 中使用预训练模型?

代码和预训练权重可用于以下影像分类模型:

  • 例外
  • VGG16
  • VGG19
  • ResNet50
  • 盗梦空间 v3

它们可以从keras.applications模块导入:

**from** keras.applications.xception **import** Xception
**from** keras.applications.vgg16 **import** VGG16
**from** keras.applications.vgg19 **import** VGG19
**from** keras.applications.resnet50 **import** ResNet50
**from** keras.applications.inception_v3 **import** InceptionV3model = VGG16(weights='imagenet', include_top=**True**)

关于一些简单的使用示例,请参见应用模块的文档。

有关如何使用这种预训练模型进行特征提取或微调的详细示例,请参见这篇博文

VGG16 模型也是几个 Keras 示例脚本的基础:

使用非常少的数据构建强大的图像分类模型

https://blog . keras . io/building-powerful-image-class ification-models-using-very-little-data . html

数据预处理和数据扩充

from keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(
        rotation_range=40,
        width_shift_range=0.2,
        height_shift_range=0.2,
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        fill_mode='nearest')

这些只是可用选项中的一部分(更多信息,请参见文档)。让我们快速回顾一下我们刚刚写的内容:

  • rotation_range是以度为单位的值(0-180),在此范围内随机旋转图片
  • width_shiftheight_shift是随机垂直或水平平移图片的范围(作为总宽度或高度的一部分)
  • rescale是一个值,在进行任何其他处理之前,我们会将数据乘以该值。我们的原始图像由 0-255 的 RGB 系数组成,但是这样的值对于我们的模型来说太高而无法处理(给定典型的学习率),所以我们通过 1/255 的缩放将目标值设置在 0 和 1 之间。因素。
  • shear_range用于随机应用剪切变换
  • zoom_range用于图片内部随机缩放
  • horizontal_flip用于在没有水平不对称假设的情况下,随机翻转一半水平相关的图像(如真实图片)。
  • fill_mode是用于填充新创建像素的策略,可在旋转或宽度/高度移动后出现。

现在,让我们开始使用该工具生成一些图片,并将它们保存到一个临时目录中,这样我们就可以感受一下我们的增强策略正在做什么——在这种情况下,我们禁用了重新缩放,以保持图像可显示:

让我们准备我们的数据。我们将使用.flow_from_directory()直接从各自文件夹中的 jpg 生成批量图像数据(及其标签)。

img = load_img('data/train/cats/cat.0.jpg')  # this is a PIL image
x = img_to_array(img)  # this is a Numpy array with shape (3, 150, 150)
x = x.reshape((1,) + x.shape)  # this is a Numpy array with shape (1, 3, 150, 150)

# the .flow() command below generates batches of randomly transformed images
# and saves the results to the `preview/` directory
i = 0
for batch in datagen.flow(x, batch_size=1,
                          save_to_dir='preview', save_prefix='cat', save_format='jpeg'):
    i += 1
    if i > 20:
        break  # otherwise the generator would loop indefinitelybatch_size = 16

# this is the augmentation configuration we will use for training
train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)

# this is the augmentation configuration we will use for testing:
# only rescaling
test_datagen = ImageDataGenerator(rescale=1./255)

# this is a generator that will read pictures found in
# subfolers of 'data/train', and indefinitely generate
# batches of augmented image data
train_generator = train_datagen.flow_from_directory(
        'data/train',  # this is the target directory
        target_size=(150, 150),  # all images will be resized to 150x150
        batch_size=batch_size,
        class_mode='binary')  # since we use binary_crossentropy loss, we need binary labels

# this is a similar generator, for validation data
validation_generator = test_datagen.flow_from_directory(
        'data/validation',
        target_size=(150, 150),
        batch_size=batch_size,
        class_mode='binary')

我们现在可以使用这些生成器来训练我们的模型。每个历元在 GPU 上需要 20–30 秒,在 CPU 上需要 300–400 秒。所以如果你不着急的话,在 CPU 上运行这个模型是完全可行的。

model.fit_generator(
        train_generator,
        steps_per_epoch=2000 // batch_size,
        epochs=50,
        validation_data=validation_generator,
        validation_steps=800 // batch_size)
model.save_weights('first_try.h5')  # always save your weights after training or during training

这种方法使我们在 50 个时期后达到 0.79–0.81 的验证精度(这是一个任意选取的数字,因为模型很小,并且使用了积极的压降,所以到那时它似乎不会过度拟合)

使用预训练网络的瓶颈功能:一分钟内 90%的准确率

我们的策略如下:我们将只实例化模型的卷积部分,直到全连接层。然后,我们将在我们的训练和验证数据上运行该模型一次,在两个 numpy 阵列中记录输出(来自 VGG16 模型的“瓶颈特性”:全连接层之前的最后激活映射)。然后,我们将在存储的特征之上训练一个小的全连接模型。

我们离线存储特征而不是在冻结的卷积基础上直接添加全连接模型并运行整个过程的原因是计算效率。运行 VGG16 是很昂贵的,尤其是如果你在 CPU 上工作,我们希望只做一次。请注意,这阻止了我们使用数据扩充。

我们达到了 0.90–0.91 的验证精度:一点也不差。这肯定部分是由于基础模型是在已经有狗和猫的数据集上训练的(在数百个其他类中)。

微调预训练网络的顶层

为了进一步改善我们之前的结果,我们可以尝试在顶级分类器旁边“微调”VGG16 模型的最后一个卷积块。微调包括从训练好的网络开始,然后使用非常小的权重更新在新的数据集上重新训练它。在我们的案例中,这可以通过 3 个步骤来完成:

  • 实例化 VGG16 的卷积基并加载其权重
  • 在顶部添加我们之前定义的全连接模型,并加载其权重
  • 冻结 VGG16 模型的层,直到最后一个卷积块

请注意:

  • 为了进行微调,所有层都应该从经过适当训练的权重开始:例如,你不应该在预先训练的卷积基础上,加上随机初始化的全连接网络。这是因为由随机初始化的权重触发的大梯度更新会破坏卷积基中的学习权重。在我们的情况下,这就是为什么我们首先训练顶级分类器,然后才开始微调卷积权重。
  • 我们选择仅微调最后一个卷积块,而不是整个网络,以防止过拟合,因为整个网络将具有非常大的熵容量,因此很容易过拟合。低级卷积块学习到的特征比高级卷积块更通用,更不抽象,因此保持前几个块固定(更通用的特征)并且只微调最后一个(更专用的特征)是明智的。
  • 微调应该以非常慢的学习速率进行,通常使用 SGD 优化器,而不是自适应学习速率优化器,如 RMSProp。这是为了确保更新的幅度保持很小,以免破坏先前学习的功能。

什么是全球平均池?

引用谷歌搜索“全球平均池”的第一篇论文。http://arxiv.org/pdf/1312.4400.pdf

CNN 没有采用传统的全连接层进行分类,而是通过全局平均池层直接输出最后一层 mlpconv 特征图的空间平均值作为类别的置信度,然后将得到的向量送入 softmax 层。在传统的 CNN 中,很难解释来自目标成本层的类别级信息如何传递回先前的卷积层,因为完全连接的层在它们之间充当黑盒。相比之下,全局平均池更有意义和可解释性,因为它加强了特征地图和类别之间的对应性,这通过使用微观网络的更强的局部建模而成为可能。此外,完全连接的层容易过拟合,并严重依赖于下降正则化[4] [5],而全局平均池本身就是一个结构正则化,它本身可以防止整个结构的过拟合。

在本文中,我们提出了另一种称为全局平均池的策略来取代 CNN 中传统的全连接层。其思想是在最后的 mlpconv 层中为分类任务的每个相应类别生成一个特征图。我们没有在特征地图上添加完全连接的层,而是取每个特征地图的平均值,并将结果向量直接输入 softmax 层。与完全连接的图层相比,全局平均池的一个优势是,它通过加强要素地图和类别之间的对应关系,更适合卷积结构。因此,特征图可以很容易地解释为类别置信度图。另一个优点是在全局平均池中没有要优化的参数,因此在这一层避免了过拟合。此外,全局平均池汇总了空间信息,因此对输入的空间平移更具鲁棒性。

我们可以将全局平均池视为一种结构正则化器,它明确地将特征映射强制为概念(类别)的置信度映射。这通过 mlpconv 层成为可能,因为它们比 GLMs 更好地逼近置信图。

在有 10 个分类的情况下(CIFAR10,MNIST)。

这意味着,如果在最后一次卷积结束时有一个 3D 8,8,128 张量,在传统方法中,你要将其展平为大小为 8x8x128 的 1D 矢量。然后添加一个或几个完全连接的层,最后添加一个 softmax 层,将大小减少到 10 个分类类别,并应用 softmax 运算符。

全局平均池意味着你有一个 3D 8,8,10 张量,计算 8,8 切片的平均值,你最终得到一个形状为 1,1,10 的 3D 张量,你将它整形为形状为 10 的 1D 向量。然后添加一个 softmax 运算符,中间没有任何运算。平均池之前的张量应该具有与您的模型具有的分类类别一样多的通道。

该文件并不清楚,但当他们说“softmax 层”时,他们指的是 softmax 操作符,而不是与 softmax 激活完全连接的层。

不是 y=softmax(W*flatten(GAP(x))+b)而是 y=softmax(flatten(GAP(x)))。

在一组新的类上微调 InceptionV3

**from** keras.applications.inception_v3 **import** InceptionV3
**from** keras.preprocessing **import** image
**from** keras.models **import** Model
**from** keras.layers **import** Dense, GlobalAveragePooling2D
**from** keras **import** backend **as** K*# create the base pre-trained model*
base_model = InceptionV3(weights='imagenet', include_top=**False**)*# add a global spatial average pooling layer*
x = base_model.output
x = GlobalAveragePooling2D()(x)
*# let's add a fully-connected layer*
x = Dense(1024, activation='relu')(x)
*# and a logistic layer -- let's say we have 200 classes*
predictions = Dense(200, activation='softmax')(x)*# this is the model we will train*
model = Model(inputs=base_model.input, outputs=predictions)*# first: train only the top layers (which were randomly initialized)*
*# i.e. freeze all convolutional InceptionV3 layers*
**for** layer **in** base_model.layers:
    layer.trainable = **False***# compile the model (should be done *after* setting layers to non-trainable)*
model.compile(optimizer='rmsprop', loss='categorical_crossentropy')*# train the model on the new data for a few epochs*
model.fit_generator(...)*# at this point, the top layers are well trained and we can start fine-tuning*
*# convolutional layers from inception V3\. We will freeze the bottom N layers*
*# and train the remaining top layers.**# let's visualize layer names and layer indices to see how many layers*
*# we should freeze:*
**for** i, layer **in** enumerate(base_model.layers):
   print(i, layer.name)*# we chose to train the top 2 inception blocks, i.e. we will freeze*
*# the first 172 layers and unfreeze the rest:*
**for** layer **in** model.layers[:172]:
   layer.trainable = **False**
**for** layer **in** model.layers[172:]:
   layer.trainable = **True***# we need to recompile the model for these modifications to take effect*
*# we use SGD with a low learning rate*
**from** keras.optimizers **import** SGD
model.compile(optimizer=SGD(lr=0.0001, momentum=0.9), loss='categorical_crossentropy')*# we train our model again (this time fine-tuning the top 2 inception blocks*
*# alongside the top Dense layers*
model.fit_generator(...)

如何使用有状态 rnn?

使 RNN 有状态意味着每批样本的状态将被重新用作下一批样本的初始状态。

因此,当使用有状态 rnn 时,假设:

  • 所有批次都有相同数量的样本
  • 如果X1X2是连续批次的样品,那么X2[i]X1[i]的后续序列,对于每个i

要在 RNNs 中使用状态,您需要:

  • 通过向模型中的第一层传递一个batch_size参数,显式指定您正在使用的批量大小。例如batch_size=32对于 10 个时间步长的 32 样本批次序列,每个时间步长具有 16 个特征。
  • 在你的 RNN 图层中设置stateful=True
  • 调用 fit()时指定shuffle=False

要重置累积的状态:

  • 使用model.reset_states()重置模型中所有层的状态
  • 使用layer.reset_states()重置特定有状态 RNN 层的状态

示例:

X  *# this is our input data, of shape (32, 21, 16)*
*# we will feed it to our model in sequences of length 10*model = Sequential()
model.add(LSTM(32, input_shape=(10, 16), batch_size=32, stateful=**True**))
model.add(Dense(16, activation='softmax'))model.compile(optimizer='rmsprop', loss='categorical_crossentropy')*# we train the network to predict the 11th timestep given the first 10:*
model.train_on_batch(X[:, :10, :], np.reshape(X[:, 10, :], (32, 16)))*# the state of the network has changed. We can feed the follow-up sequences:*
model.train_on_batch(X[:, 10:20, :], np.reshape(X[:, 20, :], (32, 16)))*# let's reset the states of the LSTM layer:*
model.reset_states()*# another way to do it in this case:*
model.layers[0].reset_states()

注意,方法有predictfittrain_on_batchpredict_classes等。所有的将更新模型中有状态层的状态。这不仅允许您进行状态训练,还允许您进行状态预测。

在约会市场上,我们是否感到被低估了?

原文:https://towardsdatascience.com/https-medium-com-melanietsang-do-we-feel-undervalued-in-the-dating-market-153c03eb6dc8?source=collection_archive---------12-----------------------

速配实验数据分析

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

什么影响了人们对选择约会对象的看法?是这个人的长相,性格还是幽默?哥伦比亚大学商学院教授雷·菲斯曼和希娜·艾扬格在 2002 年至 2004 年期间进行了一系列实验,他们要求 500 多名参与者与其他异性进行四分钟的第一次约会,对他们的吸引力、真诚、智力、风趣、雄心和共同兴趣进行评级,并回答他们是否会再次与伴侣约会的问题。该数据集是在 Kaggle 上发现的,它包含了问卷答案,包括人口统计数据、约会习惯、自我认知和关键属性评级,以及约会决定。

我在试图理解什么?

对这个数据集进行了各种数据分析,洞察范围从择偶的性别差异到约会的种族偏好。我的目标是进行一项以前可能没有进行过的分析,我特别感兴趣的是关键属性如何影响约会决策,以及人们是否清楚地意识到他们的自我价值与他们的感知价值。

数据准备过程

过滤掉无关的数据

我首先阅读速配数据 Key.doc 以了解每个字段,然后过滤掉我不需要的数据,如 SAT 分数、学费信息、收入水平和邮政编码。

标准化数据

我对通过不同标度方法收集的数据进行了标准化,例如 1-10 标度的评级方法与 100 点分布方法,顺序标度与间隔标度(例如,当 3 =一个日期/周时,我将其转换为 52 次/年)。

处理缺失数据

对于每个条目,如果丢失的变量数量很大,我选择删除整个条目。例如,如果缺少合作伙伴对某个参与者所有属性的评分,我会删除属性分析中的整个条目,但保留它用于其他有效的分析。如果只有一个变量缺失,比如真诚度,我就用其他九个伙伴对同一个参与者的评分均值来代替。除了手工清理,我还使用了最近邻法来自动替换剩余的缺失值。

数据分析结果

一.一般信息

总共有 552 名参与者,其中 275 名为女性,270 名为男性(7 个缺失值)。虽然年龄最大且唯一的参与者为 55 岁,但 75%的参与者年龄在 24 至 34 岁之间。第一大部分参与者是欧洲/高加索裔美国人,而第二大部分是亚洲人。

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

二。属性分析

约会中最重要的属性是什么?

在约会实验开始之前,参与者被要求根据他们在潜在约会中的重要性给下面的属性分配 100 分。总的来说,整个参与者群体认为吸引力是潜在约会中最重要的属性,其次是 T2 智力。

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

对女性来说,排名前三的属性是智力真诚吸引力,而对男性来说,则是吸引力智力乐趣。此外,男性倾向于有更独特的偏好,但女性的偏好似乎更均匀。

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

然而,当结果按种族分类时,我发现亚裔是唯一一个认为真诚比智慧更重要的种族。

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

此外,当结果按工作行业细分时,我发现虽然许多群体认为智力比吸引力更重要,但建筑是唯一一个给予智力更高认可的群体。

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

三。感知分析

在实验之前,参与者还被要求按照 1-10(1 =糟糕,10 =很好)的等级对这五个属性进行评级,不包括共同的兴趣。在每次四分钟的第一次约会后,他们被要求对他们的伴侣的六个特征进行评价。

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

我们是否觉得自己总是被低估?

比较自我评级和参与者认为他们会得到的评级可能会引发许多社会学问题。人们是否有被低估的感觉或经历?他们是否倾向于夸大自己的优点,隐藏自己的缺点?结果显示,人们普遍认为伴侣低估了自己的属性,除了智力。这将是进一步研究的一个有趣点,是什么让人们相信他们的智力会被高估?此外,野心似乎是人们认为他们所表现出来的唯一属性。

我们真的高估了自己吗?

当比较自我评价和实际评价时,它表明参与者确实普遍高估了自己。他们最高估的属性是乐趣,而最不高估的属性是智力。有趣的是,当人们相信他们的智力会被高估时,其他人却知道他们实际上有多聪明!

当我们认为自己被低估时,我们真的被低估了吗?

当比较他们假设的伴侣的评价和实际的评价时,我发现虽然参与者知道他们被低估了,但他们对每个属性的评价甚至比他们想象的还要低。好难过!

是不是第一个永远是最好的?

由于参与者在每个实验中都遇到了几个伙伴,我做了一个皮尔森相关分析以了解会面顺序是否会影响人们的评级。首先,我发现顺序和他们喜欢自己伴侣的程度之间存在负相关。订单与四个属性之间的负相关也被证明,真诚聪明有趣野心。比如,越晚遇到伴侣,越觉得伴侣不真诚。值得进行更多的研究,以了解更多的经验,人们是否表现出较少的真诚,或者只是感觉到来自他们的伴侣的较少的真诚,即使他们的伴侣同样真诚。

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

我还发现这些属性之间存在正相关关系。真诚和聪明的相关性最强,其次是聪明和野心,然后是乐趣和共同兴趣。

四。匹配分析

我们需要说多少个“是”才能听到一个“是”的回答?

在每次第一次约会后,参与者都要回答他们是否愿意再见他们的伴侣的问题。在这个实验中,他们发出 6 个“是”,平均得到 2 个匹配。换句话说,他们每尝试 3 次,总会得到 1 次“爱的回应”。

我们对爱情乐观吗?

实验结束后,参与者还被要求预测他们将得到多少个匹配,并收集实际的匹配数。平均来说,他们预测在每个实验中会有 3 次匹配,但实际上只有 2 次。

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

上面的数字是通过从匹配数中减去匹配估计值计算出来的。如图所示,男性参与者的预测往往比女性更乐观。

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

不考虑其他未定义的种族,黑人/非洲裔美国人亚裔美国人似乎最乐观,而拉丁裔/西班牙裔美国人群体的预测最准确。

爱情可以实践吗?

平均来说,参与者每月约会两次。但是,更多的约会经验是否有助于他们获得更多的匹配,并更准确地预测他们的匹配?我做了一个皮尔逊相关分析,发现约会的频率匹配的数量有轻微的正相关,但与匹配估计的准确度没有正相关。

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

动词 (verb 的缩写)约会决策预测

我感兴趣的是建立一个约会决策模型,来预测人们在六个属性和种族上是否会再见他们的伴侣。因此,我使用了逻辑回归分析来建立这个有 7777 个条目的模型,并使用随机方法将训练集和验证集按 80:20 分开。对于缺失值,我用同一个类中的均值代替。例如,当一个人遇到了 10 个伴侣,得到了 9 个关于吸引力的评分,我用吸引力评分的平均值来代替缺失的那个。由于“否”的决定比“是”的决定多 15%,我也相应地修正了权重。最后,我用同样的方法建立了 5 次模型来检验性能的稳定性。

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

当预测日期决定为“是”或“否”时,曲线下的面积(0.828)证明了分类的良好性能。

虽然我们都知道爱情没有方程式,但至少我们有方程式来预测你和他/她约会的可能性:

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

我发现,在实际的约会决策中,吸引力仍然是最重要的属性,其次是共同兴趣,然后是乐趣,这是出乎意料的,因为共同兴趣在参与者的偏好排名中似乎不是很重要。相反,在这种情况下,智力与决策没有多大关系。令人惊讶的是,当谈到实际的约会决定时,野心真诚似乎是两个负面属性。此外,尽管跨种族伴侣似乎根本不会影响决定,但同种族与决定略有负相关。

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

我们真的知道自己想要什么吗?

在我的属性分析的开始,它说明了潜在约会对参与者的重要性排序是吸引力、智力、真诚/有趣(它们是等价的)、共同的兴趣和雄心。然而,当人们做出实际的约会决定时,排名是不同的:吸引力,共同的兴趣,乐趣,智力,真诚,野心。人们似乎低估了共同利益,高估了真诚。

结论

总而言之,在约会时,吸引力是人们考虑的首要因素,而野心是最不重要的。我们希望我们的伴侣聪明、真诚,但是一旦我们更加了解对方,我们就会意识到共同的兴趣在潜在的关系中是多么重要。然而,不要被我们自己的感知所迷惑,因为当我们遇到更多的人时,它也会受到影响。有时我们可能对爱情过于乐观,对自己过于自信,但事实证明是令人失望的。我们应该放弃吗?不要!因为即使更多的约会经历不会让我们在寻找灵魂伴侣时变得更聪明,我们仍然有更高的几率不期而遇❤.

深入探究深层网络背后的数学

原文:https://towardsdatascience.com/https-medium-com-piotr-skalski92-deep-dive-into-deep-networks-math-17660bc376ba?source=collection_archive---------1-----------------------

神经网络之谜第一部分

如今,有了许多高级的、专门的库和框架供我们使用,如 KerasTensorFlowPyTorch ,我们不需要经常担心我们的权重矩阵的大小或记住我们决定使用的激活函数的导数公式。通常我们创建一个神经网络所需要的,即使是一个非常复杂的结构,也只是一些导入和几行代码。这节省了我们搜索 bug 的时间,并简化了我们的工作。然而,关于神经网络内部正在发生什么的知识对诸如架构选择、超参数调整或优化等任务有很大帮助。

**注:**承蒙荣格林逸的礼遇,你也可以用中文阅读这篇文章。多亏了达维·坎迪多的帮助,你还可以查看文本的葡萄牙语版本。在我的 GitHub 上可以找到用于创建本文中使用的可视化效果的源代码。

介绍

为了进一步了解神经网络是如何工作的,我决定今年夏天花些时间来看看隐藏在表面下的数学。我还决定写一篇文章,一篇给我自己——整理新学到的信息,一篇给别人——帮助他们理解这些有时很难的概念。对于那些对代数和微分学感觉不太舒服的人,我会尽量温和,但正如标题所示,这将是一篇有很多数学的文章。

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

Figure 1. Visualization of the training set.

作为的一个例子,我们将解决数据集的二元分类问题,如图 1 所示。以上。属于两个类别的点形成圆——这种排列对于许多传统的 ML 算法来说是不方便的,但是一个小的神经网络应该工作得很好。为了解决这个问题,我们将使用图 2 所示结构的神经网络。—五个完全连接的层,具有不同数量的单元。对于隐藏层,我们将使用 ReLU 作为激活函数,Sigmoid 作为输出层。这是一个非常简单的架构,但足够复杂,可以作为我们讨论的有用示例。

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

Figure 2. Neural network architecture

克拉斯溶液

首先,我将介绍一个使用最流行的机器学习库之一——KERAS 的解决方案。

就这样。正如我在介绍中提到的,几个导入和几行代码就足以创建和训练一个模型,然后该模型能够以几乎 100%的准确率对来自我们测试集的条目进行分类。我们的任务归结为根据所选择的架构提供超参数(层数、层中神经元的数量、激活函数或时期的数量)。现在让我们看看幕后发生了什么。哦…还有我在学习过程中创造的一个很酷的视觉效果,希望它能让你不至于睡着。

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

Figure 3. Visualization of areas qualified for appropriate classes during training

什么是神经网络?

L 让我们从回答这个关键问题开始:**什么是神经网络?**这是一种受生物启发的构建计算机程序的方法,能够学习并独立发现数据中的联系。如图 2 所示。如图所示,网络是分层排列的软件“神经元”的集合,以允许通信的方式连接在一起。

单个神经元

E 每个神经元接收一组 x 值(从 1 到 n 编号)作为输入,并计算预测的 y-hat 值。向量 x 实际上包含来自训练集的 m 个示例之一中的特征值。此外,每个单元都有自己的一组参数,通常称为 w (权重的列向量)和 b(偏差),它们在学习过程中会发生变化。在每次迭代中,神经元基于其当前权重向量 w 计算向量 x 的值的加权平均值,并添加偏差。最后,这个计算的结果通过一个非线性的激活函数 g 传递。我将在文章的下一部分提到一些最流行的激活函数。

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

Figure 4. Single neuron

单层

现在让我们缩小一点,考虑如何对神经网络的整个层进行计算。我们将利用我们对单个单元内发生的事情的了解,并跨整个层进行矢量化,以将这些计算合并到矩阵方程中。为了统一符号,将为所选层*【l】*编写方程。顺便说一下,下标 i 标记了该层中一个神经元的索引。

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

Figure5. Single layer

还有一个重要的备注:我们写单个单元的方程时,用的是 x 和 y-hat,分别是特征的列向量和预测值。当切换到层的一般符号时,我们使用向量a——表示相应层的激活。因此, x 矢量是层 0——输入层的激活。该层中的每个神经元根据以下等式执行类似的计算:

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

为了清楚起见,让我们以第 2 层为例写下方程式:

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

正如你所看到的,对于每一层,我们必须执行一些非常相似的操作。为此使用 for-loop 不是很有效,所以为了加快计算速度,我们将使用矢量化。首先,通过将权重的水平向量 w (转置)堆叠在一起,我们将构建矩阵 W 。类似地,我们将叠加层中每个神经元的偏差,创建垂直向量 b 。现在,没有什么可以阻止我们建立一个单一的矩阵方程,允许我们一次对该层的所有神经元进行计算。让我们也写下我们用过的矩阵和向量的维数。

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

跨多个示例进行矢量化

到目前为止,我们所拟定的方程式只涉及一个例子。在神经网络的学习过程中,您通常会处理大量的数据,多达数百万个条目。因此,下一步将是跨多个示例的矢量化。假设我们的数据集有 m 个条目,每个条目有 nx 个特征。首先,我们将把每层的垂直向量 xaz 放在一起,分别创建 XAZ 矩阵。然后,我们重写之前的布局方程,考虑新创建的矩阵。

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

什么是激活功能,我们为什么需要它?

激活函数是神经网络的关键元素之一。没有它们,我们的神经网络就会变成线性函数的组合,所以它本身就只是一个线性函数。我们的模型具有有限的扩展性,不超过逻辑回归。非线性元件允许在学习过程中更大的灵活性和复杂函数的创建。激活函数对学习速度也有显著影响,这是选择它们的主要标准之一。图 6 显示了一些常用的激活功能。目前,最流行的隐藏层可能是 ReLU。当我们处理二元分类并且希望从模型返回的值在 0 到 1 的范围内时,我们有时仍会使用 sigmoid,尤其是在输出层。

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

Figure 6. Diagrams of the most popular activation functions together with their derivatives.

损失函数

T 学习过程进度的基本信息来源是损失函数值。一般来说,损失函数旨在显示我们离“理想”解决方案有多远。在我们的例子中,我们使用了二元交叉熵,但是根据我们处理的问题,可以使用不同的函数。我们使用的函数由以下公式描述,其值在学习过程中的变化如图 7 所示。它显示了随着每一次迭代,损失函数值是如何降低的,而精度是如何提高的。

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

Figure 7. Change of accuracy and loss values during learning process

神经网络是如何学习的?

T 学习过程是关于改变参数 Wb 的值,从而使损失函数最小化。为了实现这一目标,我们将求助于微积分和使用梯度下降法找到一个函数最小值。在每次迭代中,我们将计算损失函数相对于神经网络每个参数的偏导数的值。对于那些不太熟悉这类计算的人,我只想说导数有一种神奇的能力来描述函数的斜率。由于这一点,我们知道如何操纵变量,以便在图表中向下移动。为了直观地了解梯度下降是如何工作的(并阻止你再次入睡),我准备了一个小的可视化。你可以看到每一个连续的时代我们是如何走向最小值的。在我们的神经网络中,它以同样的方式工作——每次迭代计算的梯度向我们显示我们应该移动的方向。主要的区别在于,在我们的示例性神经网络中,我们有更多的参数要处理。正是…怎么计算这么复杂的导数?

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

Figure 8. Gradient descent in action

反向传播

ackpropagation 是一种允许我们计算非常复杂的梯度的算法,就像我们需要的那样。根据以下公式调整神经网络的参数。

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

在上面的等式中,α代表学习率——一个超参数,它允许你控制执行调整的值。选择一个学习率是至关重要的——我们设置得太低,我们的神经网络将学习得非常慢,我们设置得太高,我们将无法达到最小值。 dWdb 使用链式法则计算,损失函数相对于 Wb 的偏导数。 dWdb 的尺寸分别与 Wb 的尺寸相同。图 9。显示了神经网络中的操作序列。我们清楚地看到前向和后向传播是如何一起优化损失函数的。

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

Figure 9. Forward and Backward Propagation

结论

我已经成功地向你们解释了发生在神经网络内部的数学。在使用神经网络时,至少了解这个过程的基本知识会很有帮助。我认为我提到的事情是最重要的,但它们只是冰山一角。我强烈推荐尝试自己编程这么小的神经网络,不使用高级框架,只用 Numpy。

如果你设法来到这里,恭喜你。这当然不是最容易的阅读。如果你喜欢这篇文章,请在 TwitterMedium 上关注我,并在 GitHubKaggle 上查看我正在进行的其他项目。本文是“神经网络的奥秘”系列的第二部分,如果你还没有机会,请阅读其他文章。保持好奇!

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

自动驾驶汽车的自动车道检测

原文:https://towardsdatascience.com/https-medium-com-priya-dwivedi-automatic-lane-detection-for-self-driving-cars-4f8b3dc0fb65?source=collection_archive---------2-----------------------

第 1 章:用数据做酷事!

我们可以使用汽车中的前置摄像头来自动检测车道线吗?

原来我们可以做得很好!这是一个视频,当汽车行驶时,车道线被“画”出来。你也可以看到曲率半径被计算出来以帮助汽车转向。

Lane Lines detected for self driving car

我们为什么要这么做?因为给汽车配备前置摄像头很便宜。比雷达或激光雷达便宜多了。自动驾驶汽车即将问世!

链接到我的 GitHub 用 Python 写的完整代码。

我们是这样做的。一旦我们从自动驾驶汽车的前置摄像头获得了摄像头图像,我们就会对其进行一些“修改”。我遵循的步骤详述如下:

  1. 失真校正

当相机观察真实世界中的 3D 对象并将它们转换为 2D 图像时,会发生图像失真。这种转换并不总是完美的,扭曲会导致物体的外观尺寸、形状或位置发生变化。因此,我们需要纠正这种失真,以使相机能够准确地看到图像。这是通过拍摄相机的几张棋盘图片并使用 cv2.calibrateCamera() 函数计算相机校准矩阵来完成的。

请参见下面的失真校正图像示例。请注意,正常镜片的校正非常小,肉眼看不出有多大差别

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

2.创建二进制图像

现在我们有了未失真的图像,我们可以开始我们的分析。我们需要探索不同的方案,以便我们可以清楚地检测道路上的感兴趣的对象,在这种情况下,车道线,而忽略其余的。我用两种方法做到了这一点:

I)使用 Sobel 算子计算 x 梯度

图像的渐变可用于识别黑白图像中颜色的急剧变化。这是一种非常有用的检测图像边缘的技术。对于道路的图像,我们通常在黑色道路上有黄色或白色的车道线,因此 x 渐变非常有用。以下示例显示了使用 cv2.sobel() 计算的图像及其在 x 方向的梯度

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

ii)探索其他颜色通道

使用不同的色彩空间怎么样?HSV(色调、饱和度和值)颜色空间在隔离黄色和白色线条时非常有用,因为它隔离了颜色(色调)、颜色量(饱和度)和亮度(值)。我们可以使用图像中的 S 颜色通道来“看到”车道线,如下图所示:

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

现在,我们将 sobel x 梯度和 S 颜色通道图像相结合,以获得最终的二进制图像,其中车道线与背景相比对比度更高。见下图:

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

3.鸟瞰图像

在阈值操作之后,我们执行透视变换以将图像改变为鸟瞰图。这样做是因为从这个俯视图,我们可以确定车道的曲率,并决定如何驾驶汽车。为了执行透视变换,我确定了在图像上形成梯形的 4 个源点和 4 个目的点,以便变换后车道线彼此平行。目的点是通过反复试验选择的,但是一旦选择好,对所有的图像和视频都有效,因为摄像机安装在一个固定的位置。 cv2.getPerspectivecv2.warpPerspective 可用于执行此操作。看看在这个视图中车道线的曲率是多么清晰可见。是不是很神奇!

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

4.将曲线拟合到鸟瞰图图像

为了更好地估计车道的位置,我们使用图像下半部分的直方图来识别潜在的左右车道标记。我修改了这个函数来缩小左右车道存在的区域,这样高速公路车道分隔符或任何其他噪声就不会被识别为车道。一旦确定了初始的左侧和右侧车道底部点,我们就使用 numpy polyfit 函数来查找表示车道的最佳二阶多项式,如下图所示。

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

Left and right lane lines fitted

5.将结果绘制到道路上,以便清楚地识别车道区域

快到了!一旦我们确定了车道线并对其进行多项式拟合,我们可以再次使用 cv2.warpPerspective 将车道线扭曲回原始图像。我们还做了一个加权添加来显示未失真图像上的车道线。这是它的样子。

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

就这些!为了对视频进行这样的操作,我们使用 Moviepy 库到达每一帧,并在其上运行上述所有步骤。对于某些帧,我们可能无法正确识别车道线。我们可以通过一些简单的检查来检测,如车道线是否由逻辑宽度分隔,鸟瞰图中的车道线是否相互平行等。如果检查失败,则预测的车道线被丢弃,并且使用最后良好的左和右车道值。这非常有效。

虽然这种逻辑适用于大多数情况,但它并不完美。当相机图像质量差时,它可能会失败,如照明不足或车道线不可见,道路上有雪或碎片。此外,如果道路呈波浪形或 S 形,我们可能无法用二阶多项式来拟合它。

PS:我住在多伦多,我希望将职业生涯转向深度学习。如果你喜欢我的帖子,并能把我联系到任何人,我将不胜感激:)。我的电子邮件是 priya.toronto3@gmail.com

参考资料:

Udacity 无人驾驶汽车 Nano Degree——我感谢 Udacity 给我机会成为他们新的无人驾驶汽车项目的一部分。这是一次非常有趣的旅程。我使用的大部分代码都是在课堂讲课中建议的。

Python OpenCV 库让应用计算机视觉技术变得如此简单

支持向量机(SVM)——概述

原文:https://towardsdatascience.com/https-medium-com-pupalerushikesh-svm-f4b42800e989?source=collection_archive---------1-----------------------

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

SVM classifier

机器学习涉及预测和分类数据,为此,我们根据数据集采用各种机器学习算法。

SVM 或支持向量机是用于分类和回归问题的线性模型。它可以解决线性和非线性问题,并能很好地解决许多实际问题。SVM 的想法很简单:算法创建一条线或一个超平面,将数据分类。

在这篇博文中,我打算提供一个关于支持向量机的高层次概述。我将讨论支持向量机背后的理论,它在非线性可分数据集上的应用,以及用 Python 实现支持向量机的一个快速示例。在接下来的文章中,我将探索算法背后的数学,并挖掘引擎盖下。

在第一级近似下,支持向量机所做的是找到两类数据之间的分隔线(或超平面)。SVM 是一种算法,它将数据作为输入,如果可能的话,输出一条线来分隔这些类。

让我们从一个问题开始。假设您有一个如下所示的数据集,您需要将红色矩形从蓝色椭圆中分类出来(让我们从负面中找出正面)。所以你的任务是找到一条理想的线,将这个数据集分成两类(比如红色和蓝色)。

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

Find an ideal line/ hyperplane that separates this dataset into red and blue categories

不是什么大任务,对吧?

但是,正如您注意到的,并没有一个独特的行来完成这项工作。事实上,我们有一条无限长的线可以把这两个阶级分开。那么 SVM 是如何找到理想伴侣的呢???

让我们采取一些可能的候选人,自己找出答案。

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

Which line according to you best separates the data???

这里有两条候选线,绿色的线和黄色的线。根据你的说法,哪条线最适合分隔数据?

如果你选择了黄线,那么恭喜你,因为那是我们正在寻找的线。在这种情况下,黄线分类更好,这在视觉上非常直观。但是,我们需要一些具体的东西来固定我们的线。

上图中的绿线与红色类相当接近。虽然它对当前数据集进行分类,但它不是一条一般化的线,在机器学习中,我们的目标是获得一个更一般化的分隔符。

SVM 寻找最佳路线的方法

根据 SVM 算法,我们从两个类中找到最接近直线的点。这些点称为支持向量。现在,我们计算直线和支持向量之间的距离。这个距离叫做边缘。我们的目标是利润最大化。边缘最大的超平面是最优超平面。

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

Optimal Hyperplane using the SVM algorithm

因此,SVM 试图以这样一种方式做出一个决定边界,即两个阶级(那条街)之间的间隔尽可能宽。

很简单,不是吗?让我们考虑一个有点复杂的数据集,它不是线性可分的。

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

Non-linearly separable data

这个数据显然不是线性可分的。我们无法画出一条直线来对这些数据进行分类。但是,这些数据可以转换成高维的线性可分数据。让我们增加一个维度,称之为 z 轴。让 z 轴上的坐标受约束支配,

z = x +y

所以,基本上 z 坐标是该点到原点距离的平方。让我们把数据标在 z 轴上。

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

Dataset on higher dimension

现在数据显然是线性可分的。设高维空间中分隔数据的紫线为 z=k,其中 k 为常数。因为,z=x +y 我们得到 x+y = k;这是一个圆的方程式。所以,我们可以用这种变换,把高维空间中的线性分隔符投射回原始维度。

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

Decision boundary in original dimensions

因此,我们可以通过向数据添加一个额外的维度来对数据进行分类,使其成为线性可分的,然后使用数学变换将决策边界投影回原始维度。但是为任何给定的数据集找到正确的转换并不容易。谢天谢地,我们可以在 sklearn 的 SVM 实现中使用内核来完成这项工作。

超平面

现在我们理解了 SVM 逻辑,让我们正式定义超平面。

n 维欧几里得空间中的超平面是该空间的平坦的 n-1 维子集,它将该空间分成两个不相连的部分。

例如,让我们假设一条线是我们的一维欧几里得空间(也就是说,我们的数据集位于一条线上)。现在在这条线上选择一个点,这个点将这条线分成两部分。线有 1 维,而点有 0 维。所以一个点就是这条线的超平面。

对于二维,我们看到分隔线是超平面。类似地,对于三维,具有二维的平面将 3d 空间分成两部分,因此充当超平面。因此,对于一个 n 维空间,我们有一个 n-1 维的超平面把它分成两部分

代码

import numpy as np
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])

我们在 X 中有我们的点,在 y 中有它们所属的类。

现在我们用上面的数据集训练我们的 SVM 模型。对于这个例子,我使用了线性核。

from sklearn.svm import SVC
clf = SVC(kernel='linear')
clf.fit(X, y)

预测新数据集的类别

prediction = clf.predict([[0,6]]) 

调谐参数

参数是在创建分类器时传递的参数。以下是 SVM 的重要参数-

1】C:

它控制平滑决策边界和正确分类训练点之间的折衷。大的 c 值意味着你将正确地得到更多的训练点。

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

Smooth decision boundary vs classifying all points correctly

考虑一个如上图所示的例子。我们可以为这个数据集绘制许多决策边界。考虑一条直线(绿色)决策边界,这非常简单,但代价是几个点被错误分类。这些错误分类的点称为异常值。我们也可以做一些更摇摆不定的东西(天蓝色的决策边界),但我们可能会得到所有正确的训练点。当然,像这样非常错综复杂的东西的代价是,它很可能不能很好地推广到我们的测试集。因此,如果你着眼于精度,更简单、更直接的方法可能是更好的选择。较大的 c 值意味着你将得到更复杂的决策曲线来拟合所有的点。弄清楚你有多希望有一个平滑的决策边界,而不是一个正确的决策边界,是机器学习艺术的一部分。因此,为您的数据集尝试不同的 c 值,以获得完美平衡的曲线并避免过度拟合。

2】伽玛:

它定义了单个训练示例的影响范围。如果伽马值较低,则意味着每个点都有很远的范围,反之,伽马值较高,则意味着每个点都有很近的范围。

如果γ值非常高,那么决策边界将只取决于非常靠近该线的点,这实际上会导致忽略一些离决策边界非常远的点。这是因为更近的点得到更多的权重,这导致了曲线的摆动,如上图所示。另一方面,如果伽玛值很低,即使远点也会得到相当大的权重,我们会得到更线性的曲线。

中的即将出现中的

我将探索 SVM 算法和最优化问题背后的数学。

结论

我希望这篇博文有助于理解支持向量机。 写下你的想法、反馈或建议 如果有的话。

Connect with the Raven team on Telegram

重启随机梯度下降新手指南

原文:https://towardsdatascience.com/https-medium-com-reina-wang-tw-stochastic-gradient-descent-with-restarts-5f511975163?source=collection_archive---------3-----------------------

简单地找到一个学习率来经历梯度下降将有助于最小化神经网络的损失。但是,还有其他方法可以使这一过程更顺利、更快速、更准确。

第一种技术是重启随机梯度下降(SGDR),这是学习率退火的一种变体,它通过训练逐渐降低学习率。

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

Image 1: Each step decreases in size

有不同的退火方法,不同的减小步长的方法。一种流行的方法是逐步降低学习率:在最初的几次迭代中简单地使用一个学习率,然后在接下来的几次迭代中降低到另一个学习率,然后在接下来的几次迭代中进一步降低学习率。另一种变型是随着每次迭代线性降低学习速率。

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

Left: Decrease learning rate by steps; Right: Linearly decrease learning rate

SGDR 使用余弦退火,以半余弦曲线的形式降低学习率,就像这样:

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

Image 4: Cosine Annealing

这是一个好方法,因为我们可以在开始时以相对较高的学习速率开始几次迭代,以快速接近局部最小值,然后随着我们接近最小值而逐渐降低学习速率,以几次小的学习速率迭代结束。

然而,我们可能会发现自己处于局部极小值,其中权重的小变化会导致损失的大变化。在下面这个损失函数中,通过训练,我们已经降落在局部最小值。

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

Image 5: Approaching a local minimum

但是,如果我们在不同的数据集上测试这个网络,损失函数可能会略有不同。在这个局部最小值中损失函数的小移动将导致损失的大变化:

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

Image 6: Slight shift in loss function resulting in a large change in loss

突然间,这个局部最小值成了一个可怕的解决方案。另一方面,如果我们在这个更平坦的槽中找到了解决方案:

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

Image 7: Approaching a more stable local minimum

即使不同的数据集稍微改变了损失函数,损失也会保持相对稳定:

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

Image 8: Slight shift in loss function doesn’t impact loss as much

这种更平的槽更好,因为它提供了精确和稳定的解决方案。它更多的是广义;也就是对新数据有更高的反应能力。为了找到更稳定的局部最小值,我们可以不时地增加学习率,鼓励模型在处于陡峭的低谷时从一个局部最小值“跳到”另一个局部最小值。这是 SGDR 的“重新开始”。

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

Image 9: Increasing the learning rates every few iterations to “restart” the gradient descent // Source

在上图的第一个“半余弦”周期中,我们下降到局部最小值,如下所示:

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

Image 10: Descending into local minimum

突然,我们提高了学习率,在下一次迭代中迈出了一大步:

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

Image 11: “Restarting”

在第二个“半余弦”周期,我们下降到另一个局部最小值。

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

Image 12: Descending into a more stable local minimum

然后我们再次大幅提高学习率。只是这一次,因为我们处于损失函数的一个更稳定的区域,这种“重新开始”并没有把我们带出局部最小值:

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

Image 13: “Restarting” doesn’t take us out of this local minimum

最后,我们再次逐渐降低学习率,直到我们最小化损失函数,找到稳定的解决方案。

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

Image 14: Settling into this local minimum

这些“周期”中的每一个都被称为一个周期,在训练我们的神经网络时,我们可以自己选择周期的数量和每个周期的长度。还有,既然我们是逐渐降低学习率,那么最好从略大于最优学习率的学习率开始(你是怎么确定最优学习率的?点击这里。选择一个足够大的学习率也很重要,以允许函数在“复位”时跳到不同的最小值。

为了在 3D 中可视化,这里有两个模型:

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

Image 15: Stochastic Gradient Descent with Restarts // Source

左边的模型缓慢下降到一个局部最小值,而右边的模型在几个局部最小值之间跳跃,寻找一个更稳定的。

您也可以在每次循环后增加循环长度,如下所示:

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

Image 16: Increasing cycle length // Source

这似乎输出了更好、更准确的结果,因为它允许我们更精确地找到稳定区域中的最小值点。

理解基于深度学习的图像分类器的终极纳米书

原文:https://towardsdatascience.com/https-medium-com-rishabh-grg-the-ultimate-nanobook-to-understand-deep-learning-based-image-classifier-33f43fea8327?source=collection_archive---------13-----------------------

理解卷积神经网络的指南

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

Fig 1: The Four Superheroes of Deep Learning, Source: bit.ly/2Re5HNE

在当今世界,我们广泛使用图像。不是吗?你有没有想过脸书是如何自动检测图像中的人脸,然后像上图一样分辨出图像中的人是谁?当我将指针移近图像中的一张脸时,它会自动说出这个人的名字,不是别人,正是 Yann le Cun(CNN 架构的提出者)。你用过 Snapchat 吗?它首先自动检测您的面部,然后相应地应用您选择的过滤器。苹果的 Face ID 也做了类似的事情,当它发现你的脸在设备前面时,它会自动解锁你的手机。

有很多这样的例子,它们都有一个共同点。他们在摆弄图像,让机器变得聪明,所以它们会自动从中提取有意义的信息。太神奇了。不是吗?当我第一次了解这些技术时,我非常好奇它们是如何工作的?说实话,一开始好像很神奇。电脑怎么会自动分辨出这是哥哥的照片不是我的?如果你也发现自己和我在同一页上,那么拿一杯咖啡,因为在这本纳米书中,你会学到很多关于这些事情背后的主要思想的每一个细节,但以一种非常有趣的方式。

有许多任务,如图像分类、目标定位、目标检测、目标分割等等。但是在这篇文章中,我们将主要关注图像分类。

这篇文章分为三个部分。在第一个中,我们将尝试通过跟随我们自己的直觉来建立这个技巧,这将是非常有趣的,也是学习这个魔术的独特方法。在第二部分中,我们将使用 python 实现它,以查看它的运行情况。在第三部分,我们将尝试通过问几个有趣的问题来探索和了解更多信息。

理解语义差距

我们人类是视觉动物,我们用眼睛看到周围的各种物体,但你有没有想过图像对计算机意味着什么?我们感知图像的方式和计算机感知图像的方式有很大的不同。我们特别称这个间隙为Semantic Gap,下图对此进行了很好的描述。

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

Fig 2: On the left— What we see using our eyes. On the right — What computer sees, Source: bit.ly/2ga5Cpu

在上面的图片中,很明显,对于计算机来说,图像只不过是一串排列成网格状结构的数字,正式名称为Array.,然而,我只展示了其中的一小部分。如果您想看到计算机的整个图像,您可以使用下面的代码。

import os 
import cv2 
import numpy as npnp.set_printoptions(threshold=np.inf)image = cv2.imread('/cat.jpeg')
print(type(image))
image = cv2.resize(image , (28,28) , cv2.INTER_AREA)
print(image.shape)
#visualizing the seperate channels of image
print(image[: , : , 0]) #prints out Blue channel
print(image[: , : , 1]) #prints out Green channel
print(image[: , : , 2]) #prints out Red channel
#To visualize the whole image with all 3 channels
print(image[: , : , :])

现在,你可能会问,我们心爱的电脑是否有办法知道哪个物体出现在画面中。当然有,我们会建造它。我知道,这似乎是一项艰巨的任务,但请忍耐到最后。我们一定会实现的!

我们旅程的第一步也是最重要的一步:

正如我以前说过的,我们将简单地问一些问题,这些问题将引导我们建立一个图像分类器。为了简洁起见,我们将称图像分类器为 IC
。现在,我们准备开始我们的旅程。所以让我们问第一个问题:“你能说出下面的图片属于哪一类吗?猫还是狗?

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

Fig 3: Images of Cats, Source: bit.ly/2V5RBwK and bit.ly/2Q2OaTG

我相信你说得对!他们属于Cat的范畴,但是等等,退一步想想你是怎么得出这个结论的?试着想想,你的大脑是怎么做到的?你怎么能如此确定这些照片是猫而不是狗?你知道猫长什么样,你刚才可能做的是相似性检查在你无意识地储存在你大脑中的猫脸的粗略图像和这些图像(更具体地说是这些图像的中间部分)之间,如果它返回一个高分。然后你得出结论,这些图像实际上是猫

现在,你可能会说“我们不能把同样的机制整合到我们自己的图像分类器中吗?”这似乎是一个很棒的想法,但它带来了两个主要挑战:

  1. 哪个图像会充当我们已经储存在脑海中的图像(粗糙图像)?
  2. 我们将如何测量两幅图像之间的相似性?

让我们解决第一个问题。在这里,我们主要集中在分类一个图像是猫还是不是猫。那么我们就不能用一张猫脸的形象作为我们的粗糙形象吗?为什么不呢!我们可以使用下面的图像作为粗略的图像,然后我们可以对上面显示猫脸的图像的中间部分进行相似性检查,或者我们可以使用数组中间的像素值

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

Fig 4: Face of a cat — Our rough image

现在,我们的粗糙图像也将像我们的主图像(必须分类)一样,以数字或像素值的形式存储在计算机中。

对于第二个问题,有没有办法做两幅图像之间的相似性检查,换句话说,在大矩阵(原始图像)和小矩阵(粗糙图像)之间?是啊!我们有东西可以代替我们。在数学上被称为 Frobenius 内积。不要害怕。我将解释它是什么和它做什么。

Frobenius 内积无非是 两个数组按元素相乘后再加运算。假设你有下面两个网格或矩阵,我们称它们为 AB ,如下所示,那么弗罗贝纽斯内积(FIP)将计算如下。

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

Fig 5: Frobenius Inner product

Frobenius 内积,总的来说,是你衡量两个事物(矩阵)相似度的方式之一。它只不过是点积的一般化版本,只有一点不同:点积是为向量定义的,内积是为矩阵定义的。它如何准确地测量相似性超出了本指南的范围,但是如果你想详细了解相同的内容,那么请随意查看这篇博客文章这篇文章以了解内积。

现在我们有了两个图像(粗略的和主要的)和一种方法来衡量两个矩阵或图像之间的相似性。酷!因此,让我们来看看我们的非常简单的管道来将图像分类为猫或非猫,它包括两个步骤:

  1. 选择需要分类的图像的中间部分
  2. 对所选区域和粗略图像进行相似性检查。如果它返回一个高值,那么主图像是一只猫。

但是这个管道或者我们的图像分类器对下面的图像有效吗?

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

Fig 6: Images of cats, Source:bit.ly/2DkrlZd

不,一个大大的不!它对这些图片不起作用,因为上面的图片中间没有猫的脸。这将导致两幅图像之间的相似性降低,这意味着不正确的分类。我们能解决这个问题吗?是的,我们可以。我们不应该只关注图像的中间部分,我们应该做的是对主图像的每个部分与粗糙图像进行相似性检查,这将使我们的图像分类器具有全局平移不变性,这意味着人脸或图案位于图像中的哪个位置并不重要,我们的图像分类器肯定会检测到它。最后,结果将存储在输出矩阵中,我们必须对主图像的每个部分重复这个过程。请注意,选择主图像的特定部分的方向将是从左到右和从上到下。我们在主图像上移动粗略图像的步数或单位数称为步距**。现在,让我用下面的图形和伪代码更清楚地说明这一点。**

category = None
for selected_part in (each part of main image):
    1\. calculate the similarity between selected part and rough part
    2\. if similarity == HIGH:
    3\.     category = cat
if category == cat:
     print("Cat is present in image")
else:
     print("Cat is not present in image")

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

Fig 7: Convolution operation with stride = 1 and no padding | Source : bit.ly/2kDIN1O

看起来很简单也很有前途。这种在主图像上卷积粗糙图像的特定过程被称为卷积运算(线性运算),它非常直观,因为它只是通过计算两个矩阵之间的 Frobenius 内积来检查主图像中的某些特定模式。这个过程的结果将是另一个矩阵,它存储了粗略图像和我们的主图像的每个部分的相似性分数。

你有没有注意到一些非常有趣的事情?我们的输出矩阵或特征图的尺寸将总是小于主图像的原始尺寸。不是吗?如果你不服气,我建议你仔细看看上面的操作。但是,如果您想保留主图像的大小,以便即使在操作之后也能保留主图像的大部分信息,该怎么办呢?有什么办法可以做到呢?是的,有。为了保持输出图像的尺寸,我们简单地用零填充主图像的边界,这个过程被称为填充。

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

Fig 8: Zero padding, Source: bit.ly/2rK7fAM

现在,是时候让我给你介绍一下深度学习社区中已知的这些矩阵的名称了。形式上,粗糙图像被称为特征检测器滤波器,我们正在进行相似性检查的主图像的特定部分被称为感受野。输出矩阵被称为激活或特征图

到目前为止一切顺利。是时候感谢我们自己了,我们已经走了这么远,并建立了一个图像分类器,它可以在单个内核的帮助下检测主图像中的特定模式。让我们再走一步,尝试使我们的图像分类器对各种不同类型的图像更加鲁棒。我们的图像分类器适用于以下图像吗?

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

Fig 9: Images of cats, Source:bit.ly/2DkrlZd

同样,答案是否定的,这背后的原因很简单。上面图片中猫的脸和我们选择作为内核的猫的脸是有区别的。即使图像中某个对象的颜色或形状发生很小的变化,也会改变数组的值。那么,这种差异就足以导致我们的分类器出现不正确的分类。我们必须解决这个问题。我们必须通过使我们的分类器更加健壮来解决这个问题。我们不能只使用一种特定的模式对每张图片进行分类。我们的分类器还应该对猫的脸部轻微旋转、变形或出现任何其他图案的图像进行分类。因此,非常需要多个内核或特征检测器,因为我们不能只依赖一个内核。我们应该有不同的内核来识别图像中的不同模式。这样,它将提高我们的图像分类器的性能。

因此,现在我们将对之前的卷积运算进行修改,它包含以下三个部分:

  1. 输入体:可以是深度为 3 (RGB)的图像,也可以是之前卷积运算的输出。
  2. 特征检测器矩阵:这将构成 K 个内核来检测各种模式。
  3. 特征图:这将是卷积运算的输出,它将简单地存储相似性值。

形式上,这三个组件的组合被称为单个卷积层。而如果你在琢磨这次卷积运算会怎么做。下面仔细看看。

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

Fig 10: Convolution operation in case of multiple kernels and input depth > 1, Source: bit.ly/2PnUwSr

现在,我们的图像分类器可以检测图像中任何位置的各种特征。看起来我们做得很好。但是仍然需要改进。我们不能减少工作量吗?注意这里的一件事,我们手动定义我们的特征检测器,这个特定的内核应该检测这个特定的特征。这总是可能的吗?作为人类,我们能够识别构建分类器所需的所有模式吗?这可行吗?答案是不,我们不能。但是,我们能让我们的计算机足够智能来学习特征检测器本身吗?是的,我们可以。我们将利用现代计算机的计算能力,通过机器学习,用大量带有各自标签的图像来训练我们的机器。然后,它将自己识别各种特征检测器,以建立鲁棒的图像分类器。如果这对你来说没有多大意义,我会建议你去看看这个博客

我们一致认为,我们的机器将足够智能,能够自己学习特征检测器,并将能够在图像的任何位置检测多个特征,但这里有一件更重要和关键的事情需要理解:你的机器将像你一样学习这些特征检测器。我这么说是什么意思?还记得你是如何学习英语或其他概念的吗?首先,你已经学习了字母,然后是单词,从这里开始,你可以学习如何收集有意义的单词,也就是句子。我们作为人类以一种分等级的方式学习。机器也将模仿我们的学习方式,它不会直接学习更高层次的特征,如猫的脸、手或人的腿。但首先,它将学习非常低级的特征,如检测图像中的水平边缘、垂直边缘或颜色的特征。从那里,它将学习更高层次的特征,如脸、手和形状。因此,这清楚地表明我们的图像分类器将不仅具有单个卷积层,而且具有多个卷积层。

引入非线性

你有没有注意到,随着我们的进步,我们正在推出一个更好的图像分类器版本?在上一节中,我们了解到我们的分类器应该有多个卷积层,以便以分层的方式学习。这意味着我们的分类器的结构如下:

CONV LAYER--> CONV LAYER--> CONV LAYER --------> CONV LAYER

召回!我们之前已经了解到卷积是一种线性运算,简单来说就是,不管你在分类器中引入多少层,它只会学习线性函数。即使您在网络中添加 100 个层,它们都将作为单个卷积层。是的,100 Layers == 1 Layer不相信我?好吧。让我借助简单的线性方程来阐述一下。

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

Fig 11: Linear Equations (Captured by me)

从“u”到y的转换由 3 个线性方程完成,但如上图所示,这也可以由一个线性方程60u+31完成,即Power(3 linear equations) = Power of 1 linear equation

因此,我们必须在卷积层之间引入非线性,原因如下:

  1. 学习复杂和非线性函数来分类图像。
  2. 通过保护100 Layers == 100 Layers使我们的网络更加强大

如今在深度学习社区中常见的非线性函数或激活函数ReLU(校正线性单元)。

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

Fig 12: ReLU Function, Source: bit.ly/2uPTxNx

可以把 ReLU 函数想象成一个接受任何数字的盒子,如果是正数,它将给出输出 0 或数字。下面的代码将使它更加清晰。

def relu(x):
    if x < 0:
        return 0
    else:
        return x

因此,引入激活函数将使我们的图像分类器更加鲁棒,并将帮助它学习非线性决策边界,但这不是强制性的,您应该只使用 ReLU 作为激活函数。你可以自由使用任何非线性函数。要了解更多关于激活功能的信息,请随意阅读这个博客

池化:使其更加健壮和高效

到目前为止,在本指南中,我们更多地关注图像分类器的鲁棒性,但现在,让我们也关注分类器的效率。我们的分类器的输入是一幅图像。对吗?并且它的大小可以根据手头的问题而变化。图像的形状可以是28x2864x64128x128256x256。图像的尺寸越大,我们的图像分类器中的参数数量就会越多。深度学习社区中众所周知的一个事实是参数数量越多,你的模型就越容易过度拟合,需要更多的时间来训练。因此,没有任何方法可以解决这个问题吗?是的,有。我们可以使用称为池化的操作来减少输入体积的形状。

汇集是一种非常简单的操作,它通过用单个值替换非常小的子数组来对输入形状进行子采样或下采样,并且该单个值通常是该小子数组的汇总统计。下图将使其更加清晰。

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

Fig 13: Pooling operation | Source: stanford.io/2Td4J2d

在上图中,红色的数组是我们的子数组,蓝色的小矩阵是池化操作的输出。用2x2数组减少20x20数组将导致进一步卷积运算中参数数量的急剧变化。这个小的子数组被称为内核,而步幅的概念也适用于此,并在决定您希望内核移动多少步时发挥作用。我们可以使用任何汇总统计数据将其替换为一个数字,这可以通过从子数组中取最大值来完成,称为 Max-Pooling ,或者我们可以取子数组值的平均值,称为 Average-Pooling

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

Fig 14: Various Pooling operations | Source: bit.ly/2K5zlP2

我们将利用池操作来缩减输入体积的大小,但是池操作还有一个更有趣的地方。在池中,我们用单个值替换小的子数组,这意味着我们不太关注特征检测器操作的结果的确切位置。相反,我们缩小一点,并要求该子数组的近似结果。这将使我们的图像分类器对局部平移不变量具有鲁棒性。下面的例子肯定会有帮助

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

Fig 15: Images of different faces with different spacing

【以上是三张不同的人脸图片,略有不同。如果你仔细注意,两对眼睛之间的间距和眼睛与鼻子之间的间距是不一样的,但我们仍然希望我们的图像分类器能够完美地对所有这些人脸进行分类。但是我们对图像分类器还有什么期望呢?我们希望我们的人脸检测器内核不要关注眼睛和鼻子的确切相对位置,而是检查是否有一只眼睛在左边,一只眼睛在右边,鼻子在中间,后面是嘴唇,如果满足以上所有条件,则将其声明为人脸。这正是池化操作帮助我们实现的目标。因此,池主要执行两个功能,现在您已经知道这两个功能了!

我们图像分类器的最后一个组件

我们已经完成了最困难的部分。现在,让我们覆盖最简单的一个,使我们的分类器充分工作。它会给我们一个单一的数字,通过它我们可以保证这个图像是一只猫,对吗?但是,你注意到另一件事了吗?到目前为止,我们已经覆盖的所有层的输出都是形状(width,height,depth)的,但我们感兴趣的是一个单一的数字,它可以告诉我们一只猫是否出现在图像中。那么,我们如何实现这一点呢?我们如何利用存在于先前层的输出体积中的所有神经元,因为这些神经元将告诉我们特定特征是否存在于图像中?我们如何智能地将那些神经元的信息组合起来,得到一个单一的数字?首先,我们必须执行一个名为Flattening的操作,这样我们就可以智能地利用所有这些神经元来获得这个数字。展平是一个非常简单的操作,它将形状为(width,height,depth)的输入体积转换为形状为(K,1)的一维数组,其中K=width*height*depth

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

Fig 16: Flattening operation | Source: https://bit.ly/2AUN6Mq

现在,我们有一个一维数组作为图像分类器的输出,到这一部分,我们的分类器充当了特征提取器。它从图像中提取出有意义的信息,这将在确定图像中是否存在猫的过程中发挥至关重要的作用。现在,我们必须利用这些有意义的信息来得到一个单一的数字。这将由称为全连接层的层来完成,该层将前一层中存在的所有神经元连接到下一层中的所有神经元。

如果你知道简单的神经网络(没有任何花哨的层),那么连接多个具有不同数量神经元的全连接层就相当于在基于深度学习的特征提取器之上堆叠一个简单的神经网络。不是吗?下图将进一步阐明这个概念,它也将帮助你理解一维数组如何被转换成一个单一的数字。

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

Fig 17: Fully connected layer | Source: bit.ly/2JaVD0w

恭喜你!借助我们的直觉,我们已经完全开发了成熟的基于深度学习的图像分类器。我们已经介绍了这种基于深度学习的图像分类器的每一层,很明显,在所有这些层中,最重要的一层是卷积层,因此这种分类器被称为卷积神经网络

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

Fig 18: Convolutional Neural Network

第 2 部分:卷积神经网络的作用

我们已经非常详细地了解了卷积神经网络。让我们转换一下模式。现在,足够的理论和直觉。让我们实现我们到目前为止学到的所有东西,并建立一个端到端的 LeNet 架构,这是第一个由 Yann LeCun 提出的 CNN 架构。然而,还有许多其他 CNN 架构,你可以在这里阅读。LeNet 架构中各层的排列如下:

Input -> Conv -> Activation -> MaxPooling -> Conv -> Activation -> MaxPooling -> Flattening -> FC -> FC

我们将使用 CNN 将手写数字分为 10 类中的一类。我们将使用的数据集是MNIST Database,看起来像

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

Fig 19: MNIST Dataset — Hand Written Digits | Source: bit.ly/2InhIcI

现在,让我们使用 Keras 在 python 中实现我们到目前为止学到的所有东西。

**第 1–10 行:**我们已经导入了所需的类,这些类将进一步用于实现 LeNet 架构。

**第 13 行:**将 MNIST 数据集加载到四个变量((x_train,y_train), (x_test,y_test))

**第 15–18 行:**这些行将打印出训练和测试数据集的形状。

**第 21 行和第 22 行:**它们将通过将图像的每个像素的范围从 0–255 转换为 0–1 来标准化输入图像。

**第 24–25 行:**执行 一次热编码 ,这基本上是为了明确地告诉我们的模型,类之间没有顺序关系。

**第 27 和 28 行:**它们将把数据(训练和测试)从(data.shape[0],28,28)整形为(data.shape[0],28,28,1),这将用于表示卷积层的输入图像的通道数。

第 38–49 行:这些行将定义 LeNet 架构。为了实现这个架构,我们使用了 keras 的Sequential API(第 38 行)。网络的第一个隐藏层是具有 30 个大小为(5,5)的滤波器的卷积层,接着是 ReLu 激活层,然后是池大小=(2,2)的 MaxPooling 层,堆叠在前一层的顶部。这 3 层的组合根据架构再次重复。在三层的这两个块之后,由展平层(第 47 行)进行展平操作,然后将两个全连接层附着 500 和 10 个神经元(第 48 和 49 行)。

**第 52 行和第 53 行:**这些行将定义所需的优化器,该优化器将用于训练 CNN(第 52 行),而第 53 行将编译定义的模型,其中categorical crossentropy作为损失函数,accuracy作为监控度量。

**第 56 行:**它将负责训练我们的 CNN(真实的东西)以 10 为纪元数。

**第 59–63 行:**这些行将用于评估经过训练的模型,通过计算测试数据集的对数损失值和准确性,帮助我们检查我们的模型在未知数据上的表现。

如果您将执行上述代码,您将获得以下输出。

Accuracy of our model is 97.008%
Log loss value : 0.079

因为我们的模型的准确度大约等于 98%,并且对数损失值等于 0.079,这是非常好的。

希望这一节能让您体会到 python 中卷积神经网络的实现细节。现在,让我们转到这本纳米书最激动人心和最重要的部分,以更好地理解卷积神经网络。

第 3 节:使用 ConvNets 来更好地理解它们

在深度学习社区中,大多数人将卷积神经网络视为**“黑盒”**,而没有太多关注它们如何做它们所做的事情。在本节中,我们将研究卷积神经网络,并主要关注卷积神经网络的可视化方面。通过研究一些最重要和最有趣的论文,我们将对 CNN 有更多的了解,但同样通过问一些有趣的问题。这一部分将包括深度学习社区中大多数人不经常讨论或不知道的所有细节。希望你也能学到新的东西。你兴奋吗?我知道你是!

3.1:可视化中间输出

我们非常清楚,从输入层到输出(softmax)层,卷积神经网络中存在许多层。当我们通过网络前馈一个图像时,如果我们能够可视化每一层所做的转换或每一层的输出,这将是一个有趣的练习。这个练习将帮助我们了解每一层到底对输入图像做了什么。这正是论文作者所做的: 通过深度可视化理解神经网络 。如果你想看看这个东西的运行,你可以使用他们开发的工具,可以在这里找到。

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

Fig 20: Output of various intermediate layers | Source: video.

3.2:在给定 CNN 代码的情况下重建图像

在前面的小节中,我们已经尝试了在图像通过网络时可视化中间层的输出,中间层的输出也称为该特定层的图像的encoding。但是,除了可视化中间层的输出,是否有可能使用图像的编码来构造原始图像?是的,这是可能的,这在论文中有广泛的论述: 通过反转 来理解深层意象表征。本文作者通过提出以下问题对包含在中间表征中的视觉信息进行了直接分析:给定图像的编码,在多大程度上可以重建图像本身?

他们使用的方法很简单。他们将这个问题设计成一个最优化问题,该问题将计算图像表示的近似逆,使得图像的原始表示(φ(0))和我们试图找出的表示(φ(x))之间的差异或损失应该是最小的。

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

Optimization problem

这里,x 代表我们试图寻找的图像,φ(0)是中间层的输出或图像的编码,φ(x)是我们试图寻找的图像的编码,loss(φ(x),φ(0))是两种编码的差,λR(x)是正则化项。他们用来测量两种编码之间差异的损失函数是Euclidean distance,数学上看起来如下:

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

Loss function: Euclidean distance

下面是对应于不同层的编码的单个图像的反转表示的图像。

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

Fig 21: Result of the inverse of image representations of different layers, Source: paper

从上面示出的结果中,非常清楚的是,与从远离输入层的层构建的图像相比,使用更靠近输入层的层的编码的图像重建包含更多的视觉信息。

3.3:图像的哪个部分负责分类?

到目前为止,我们已经就图像中对象的存在负责图像分类器的输出这一事实达成一致。例如,图像中猫的脸的存在将负责图像分类器的输出。但是我们怎么能确定呢?如果分类器基于周围环境而不是基于猫的脸的存在将图像分类为会怎样?主要有两种方法可以确定,第一种是遮挡实验,第二种是通过使用显著图

3.3.1:遮挡实验

这种方法最早是在马修·泽勒的 可视化和理解卷积网络 中提出的。在这种方法中,他们用灰色方块遮挡图像的特定部分,然后监控该图像的分类器输出。他们通过从上到下和从左到右滑动灰色框,为图像的每个可能部分完成了上述步骤,与我们在卷积运算中在输入图像上滑动小子阵列的方式相同。

这个实验有什么值得期待的?

当我们遮挡图像的不太重要的部分时,图像分类器的输出(概率)应该不变,但是当我们用灰色方块替换主要对象时,概率应该显著下降。下面是这个实验结果的图片。

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

Fig 22: Result of occlusion experiment, Source: paper

因此,我们现在可以确定,图像中对象的存在负责图像分类器的输出。

3.3.2:显著性图

这种方法首次在 深入卷积网络中引入:可视化图像分类模型和显著性图 。这是一种非常简单的方法,上面提到的论文的作者试图知道图像的哪组像素对于分类的输出是重要的。他们试图观察一个非常简单的事情,即如果我们一个接一个地改变图像的像素值,那么多少和哪个像素组将最大程度地影响该图像的类得分?这背后的原因非常简单,即与对象相对应的像素集比其他像素集更能影响类得分。

他们已经通过简单地计算图像的输出分数相对于图像的梯度(Score(Ic))来做到这一点。

w = ∂Sc /∂I:类别分数相对于图像的梯度。*

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

Fig 23: Images with their corresponding saliency maps, Source : paper

具有较高梯度值的像素组在上面的图像中被突出显示,这表示这些是图像中最重要的像素,因为这些像素的值的微小移动或改变可以极大地改变类别分数。因此,它清楚地告诉我们,图像中对象的存在是分类器输出的原因。

3.4:我们的假设对吗?

毫无疑问,卷积神经网络的骨干是卷积层,它由许多内核特征检测器组成,这些检测器寻找图像中某些特征的存在,如果该特征存在于图像中,则反过来用大数字进行响应。这是我们已经在这本纳米书中涉及的内容。

我们的整个直觉和解释是基于最重要和唯一的假设,即卷积层中存在的子阵列充当特征检测器,但事实真是这样吗?我们如何确定子阵列充当特征检测器?有什么方法可以确定这一点吗?你打赌,有。这将是这本纳米书的一个非常重要的部分,因为它将检验我们关于 ConvNets 的假设,这是整本纳米书的基础。用于确定这一点的方法主要分为两个阵营,一个是以数据集为中心,另一个是以网络为中心。

3.4.1:以网络为中心理解 CNN

与同样需要数据的以数据集为中心的方法不同,以网络为中心的方法只需要经过训练的卷积神经网络。本文首先介绍了一种主要且有效的以网络为中心的方法: 通过深度可视化理解神经网络

在这种方法中,该论文的作者做了一件非常简单的事情,即他们试图通过强加一个优化问题来可视化激活,该优化问题将试图构建一个输入图像,使得任何层上存在的任何激活的值都应该是最大的。

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

这里, x 是要构建的输入图像, ai(x) 是第 I 个激活的值, Rθ(x) 是正则化项。

最大化特定激活的值将导致图像(x)的构造,该图像将包含与该激活相关的视觉信息。下面的图片将帮助你将使用这种方法构建的不同层的不同激活的输出可视化。

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

Fig 24: Visualization of different activations of different layers, Source: paper

3.4.2:理解 CNN 的以数据集为中心的方法

以数据集为中心的方法需要经过训练的卷积神经网络和通过该网络运行的数据(图像)。其中一个主要的以数据集为中心的方法首先是在马修·泽勒的 可视化和理解卷积网络 中介绍的。在这篇论文中,他们介绍了一种可视化技术,揭示了在模型中的任何层激发或激活单个特征图的输入刺激(输入图像的一部分)。为了做到这一点,他们利用了去进化神经网络,它可以被认为是一个使用相同组件(池化、非线性)但顺序相反的 convnet 模型。但是你会问 deconvnet 是做什么的,它将如何帮助我们?当输入图像通过网络传递时,我们获得了激活图作为中间层的输出,当我们将 deconvnet 附加到每个激活图时,它将这些活动映射回输入像素空间。将特定激活映射回输入像素空间将在输入像素空间上形成该激活正在寻找的图案。

本文中的以下摘录和图表不言自明,有助于您更好地了解 deconvnet 和一般使用的方法。

为了检查一个 convnet,需要将一个 deconvnet 连接到它的每一层,如图 1(上图)所示,提供一条返回图像像素的连续路径。首先,将输入图像呈现给 convnet,并计算各层的特征。为了检查给定的 convnet 激活,我们将该层中的所有其他激活设置为零,并将特征映射作为输入传递给附加的 deconvnet 层。然后,我们连续地(I)取消 pool,(ii)校正和(iii)过滤,以重建引起所选激活的下层中的活动。然后重复这一过程,直到到达输入像素空间。

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

Fig 25: Deconvolutional neural network

现在,让我们看看上述实验的结果,并试图理解不同层的激活在寻找什么。

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

Fig 26: Visualizing the activations of Layer 1 and 2

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

Fig 27: Visualizing the activations of Layer 3

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

Fig 27: Visualizing the activation of Layer 4 and 5

从上面显示的图像中可以清楚地看到,靠近输入层的层正在寻找较低级别的特征(如角、边、颜色),而远离输入层的层正在寻找较高级别的特征(如狗脸、键盘),从而证实了我们的另一个假设,即卷积神经网络以分层的方式学习。

在纳米书籍的最后也是最重要的部分,我们已经研究了卷积神经网络,并通过回顾 CNN 的四篇最重要的论文对它们有了更多的了解,这些论文也考虑了可视化方面。希望你也像喜欢其他部分一样喜欢这个部分。

我希望你喜欢这本纳米书的每一个部分,如果你从书中学到了什么新东西,那么你可以通过与他人分享来表达你的爱。花了这么多时间来写这么全面的博文,希望我的努力能帮助你们中的一些人理解卷积神经网络。

欢迎在 LinkedIn 上与我联系,在 TwitterQuora 上关注我。

用移动平均法确定板球比赛中击球手的状态

原文:https://towardsdatascience.com/https-medium-com-satnalikamayank12-using-moving-averages-to-determine-batsmen-form-d165c08be809?source=collection_archive---------0-----------------------

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

尝试在板球领域使用简单的算法交易策略来确定击球手的当前形式。

**滚动平均值:**它是从数据值的连续段中得到的一系列平均值,或者更简单地说,平均值是通过取一些前几天的值计算出来的,比如说过去 10 天(对于短期移动平均值)或者过去 50 天(对于长期移动平均值)。第二天的移动平均值通过排除第一天的值并包括今天或当前日期的最新值来计算。10 日均线是通过找出前 10 天的收盘价作为第一个数据点。下一个数据点将删除最早的价格,添加第 11 天的价格,然后取平均值。MAs 最常见的应用是识别趋势方向,即价值是上升还是下降。

**股票交易中的交叉策略:**投资者使用移动平均线作为指标来检测股票价格的运动,即它是上涨还是下跌。涉及均线的一个基本策略是交叉技术。

取 2 MA 的一个长期(比如 50 天)和一个短期(比如 10 天)。交叉点是曲线相交的点,即短期移动平均线高于长期移动平均线的点,反之亦然。

当短期移动平均线越过长期移动平均线(短期移动平均线>长期移动平均线)时,买入信号被触发,这表明股价开始上涨。同样,当短期均线穿过长期均线下方时,就会触发卖出信号(短期< Long Term MA) indicating prices are starting to go down and the investor should steer clear from the stock and sell the stocks if any.

将其应用于击球手:击球手通常被称为状态良好(表现良好)或状态不佳(表现不佳)。可以用股票市场和板球生态系统来进行类比,玩家类似于股票公司,他们的得分类似于股票价格。在板球比赛中使用的策略没有什么不同。我们计算 2 个 MAs:一个短期(比如 4 局)和一个长期(比如 15 局)。我们用击球手在特定局中的得分来代替价格。

如果有一个交叉,其中短期移动平均线变得高于长期移动平均线,这表明击球手将处于良好状态,并将在接下来的几局中取得好成绩,并将处于良好状态。类似地,如果出现交叉,短期移动平均线变得低于长期移动平均线,击球手在接下来的几场比赛中表现不佳。

导入所需的模块

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

读取记录并计算 15 局(长)和 4 局(短)的移动平均值。

df1 = pd.read_csv("51880batting.csv")
#player 51880 from statsguru is Chris Gayle
maLong  = df1['runs'].rolling(window = 15, center = False).mean()
maShort = df1['runs'].rolling(window = 4, center = False).mean()

绘图:

plt.plot(df1['runs'].rolling(window=15,center=False).mean(),color = 'k')
plt.plot(df1['runs'].rolling(window=4,center=False).mean(), color= 'g')
plt.show()

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

Long Term and Short Term MAs for Chris Gayle (WI Batsman)

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

Long Term and Short Term MAs for Virat Kohli (IND Batsman)

如果短期均线大于长期均线(相当于买入信号),找出交叉点,计算接下来 3 局的平均值。

sp = 0 
snp = 0
playCnt = 0
noplayCnt = 0
x = 15               #long term averages begin from index 15
while( x <= 260):    #number of innings is 263 
 if(maLong[x] < maShort[x]):
  if(maLong[x+1] > maShort[x+1]):   #crossover detected
    print ‘no play at’ , x
    snp= snp +df1[‘runs’][x+1] + df1[‘runs’][x+2] + df1[‘runs’][x+3]
    noplayCnt = noplayCnt+3

 if(maLong[x] > maShort[x]):
  if(maLong[x+1] < maShort[x+1]):   #crossover detected
   print ‘play at’ ,x
   sp = sp + df1[‘runs’][x+1] + df1[‘runs’][x+2] + df1[‘runs’][x+3] 
   playCnt = playCnt+3
 x = x+1

计算和显示平均值:

#overall career average
overallAvg = df1[‘runs’].mean()#average over the next 3 innings after positive or 'BUY' signal
playAvg = sp/playCnt#average over the next 3 innings after negative or 'SELL' signal noPlayAvg = snp/noplayCnt print 'Career average: ', overallAvg
print 'Positive Signal average: ', playAvg
print 'Negative Signal average: ', noPlayAvg 

克里斯·盖尔的结果

职业生涯平均:34.928030303
正信号平均:48
负信号平均:32

Virat Kohli 的结果:

职业平均:45.0595238095
正信号平均:59
负信号平均:30

在击球手状态良好的比赛中,平均得分(48 分和 59 分)分别比职业生涯平均得分(35 分和 45 分)高得多。这可能会进一步发展使用 WMA(加权移动平均),其中最近几局被赋予更高的权重年龄,同时计算平均值,我相信会给出更好的结果。

完整的代码和数据集,请访问我的 Github 简介

所用数据来源于criinfo stats guru

要进一步了解移动平均线和交叉策略,请访问 Investopedia 上的链接。

如果你喜欢这篇文章,请点击下面的小心形按钮。

泰勒·斯威夫特 vs 人工智能:谁更胜一筹?

原文:https://towardsdatascience.com/https-medium-com-sh-reya-taylor-swift-or-artificial-intelligence-19f2989ab7a4?source=collection_archive---------6-----------------------

我从小就是泰勒·斯威夫特的超级粉丝。我的中学 iPod Nano 的顶级播放歌曲都是从 讲到现在 。记得高二的时候趁父母熟睡,熬夜浏览 Tumblr,想找T5【红 的样品,因为没钱买专辑。

很自然地,我上周每晚都熬夜,急切地期待着泰勒新专辑的预告曲。但是当“看你让我做了什么”出来打破 YouTube 记录的时候,我有点……失望。不要误会我的意思——我还是听了至少二十遍。但是泰勒那铿锵有力的歌词和朗朗上口的旋律后来怎么样了?为什么这首歌充满了仇恨和复仇?

过去的这个周末,我想看看机器学习(ML)技术能否为泰勒创作出更好的歌曲。我将泰勒所有的歌词输入一个递归神经网络(RNN),并采样了一些新歌词。这是我得到的(未经修改,直接从我的终端复制粘贴):

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

Two different samples generated with around 900 characters each.

在阅读了这些生成的歌词后,我得出结论,泰勒肯定更擅长创作自己的音乐。生成的歌曲语法怪异,许多单词拼写错误。大多数短语都没有真正的意义。左括号或引号有时不闭合。但是,嘿——令我印象深刻的是,RNN 能够学习用逗号、行长和换行来表达歌词结构!

为了结束这个有趣的实验,我用相同的 RNN 生成了可能的歌曲标题。以下是 ML 生成的声望中的歌曲标题:

围棋不会打到我那里

你的爱贯穿一切

我们说要变得更好

墙如果英里

没有对话

我应该这么说

我不想看到路

我不会把你留在这里

你想我吗

我们说我是如何

有好的塔夫绸吗

爱在那里

"有好的塔夫绸吗?"对我来说听起来有点奇怪。但是我可以看到自己被其中的一些卡住了,像“你的爱贯穿一切”或“我不想看到的方式。”

我想我会回去不耐烦地等待真正的名声在 11 月出来。与此同时,如果你有任何有趣的 AI 或 ML 想法可以尝试,请告诉我!

**技术细节:我分叉了安德烈·卡帕西的 char-RNNTensorflow 实现。我发现了一个不错的。包含泰勒·斯威夫特歌词的 txt 文件。我用的代码这里是这里是。该模型基于 LSTM,有 3 层,隐藏状态大小为 12。应用辍学。我没有做任何超参数测试,所以肯定有改进的空间。

区块链和数字身份

原文:https://towardsdatascience.com/https-medium-com-shaanray-how-blockchains-will-solve-privacy-88944f3c67f0?source=collection_archive---------2-----------------------

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

Digital Identity.

每当我们在互联网上交易时,我们都会留下全面的数字足迹。我们使用的平台越多,留下的数字痕迹就越多。处理金融交易的互联网平台包括 Paypal、信用卡处理器、直销银行、谷歌钱包、Apple Pay、亚马逊支付、Square、Stripe、Venmo 和加密货币。用户必须公开个人和财务数据才能使用这些服务。

一个人的数据通常存储在各种不同的数据库中,并在不同的时间生成。这些个人数据中的一些会随着时间的推移而变化(例如,居住地址),因此在数据库之间并不相同。结果是一个人的多个“数字克隆”存在于不同的数据库中。

当前的身份管理系统存在许多问题。用户在几个在线平台和网站上输入数据和注册,并且必须创建和记住大量密码。人们不能同时更新他们所有的凭证和数字身份。这破坏了安全性和便利性。此外,正如 Equifax 黑客事件所显示的那样,不良分子只需侵入一个主要数据库,就能获取每个用户的信息。

简而言之,当前的数据身份实践是不可持续的。

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

Similar but not the same.

政府 id

爱沙尼亚和印度政府已经试验了集中式数字身份证。个人身份证可以用来投票、报税、从银行提款、登记财产以及遵守其他政府报告要求。由于数字身份证是由政府颁发的,收集的信息存储在一个中央数据库中。数据的集中存储会产生单点故障。为了保证此类数据的安全,需要实施极其严格的控制和协议。

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

A specimen government ID.

区块链解决方案

区块链技术以去中心化、可信和不可变的方式存储数据。区块链可以确保用户的单一数字身份存储在一个安全和廉洁的方式。这种单一的数字身份可以始终与最新的用户信息保持同步。

鉴于这一潜力,各公司正争相开发基于区块链的数字身份管理和认证解决方案。这个领域的早期参与者包括 Bitnation、Civic、Cambridge Blockchain LLC、BlockAuth 和 Existence ID。

Bitnation 的治理平台寻求提供与政府相同的服务。它的用户被称为比特国家的“公民”。

专注于减少欺诈和防止身份盗窃的 Civic 去年 7 月推出了极其成功的 ICO。

Cambridge Blockchain LLC 正在与金融机构合作开发一种直观、用户友好的数字身份解决方案,该解决方案完全符合隐私法规。为了赢得企业客户的信任,解决方案必须强大。

IBM 和 SecureKey Technologies 也为消费者推出了一个基于区块链的数字身份网络。它将建立在 Linux 基金会的 Hyperledger Fabric v1.0 之上。Hyperledger Fabric 是一个许可的区块链(这意味着其网络参与者可以限制谁可以参与区块链的共识机制)。许可的区块链将允许用户分配谁可以访问他们的数字身份数据的权限。

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

Early movers working on blockchain enabled digital identity solutions.

网络效应

如果没有消费者的认可,任何数字身份区块链解决方案都无法为互联企业和机构所用。许多希望采用基于区块链的身份管理解决方案的行业都受到高度监管,例如银行、信用卡公司和医疗保健提供商。项目的数据隐私机制、节点的分布和开发团队将是成功的关键。

结论

未来,我们每个人都将拥有一个最新的数字克隆体。基于区块链的数据加密将防范身份盗窃。我们将能够跨不同的商务和合规事务渠道选择与谁共享哪些数据。哪些基于区块链的数字身份管理平台将达到临界质量并利用网络效应是一个开放的问题。

沙安雷

关注媒体上的 Lansaar Research ,了解最新的新兴技术和新的商业模式。

为什么使用上下文管理器是更好的选择?

原文:https://towardsdatascience.com/https-medium-com-sinister-why-using-a-context-manager-is-a-better-choice-55ccfcecddb8?source=collection_archive---------3-----------------------

每当我用 python 写几行代码时,脑子里总会冒出一个问题,有没有更好的方法来写这段代码!更好的方法不是在算法方法的意义上,虽然它很重要,实际上它是最重要的,像减少时间或空间的复杂性或两者都有!与其他人解决同样问题的方式相比,这是让你的方法占上风的原因。但是紧接着的下一个重要问题是,你是否按照它应该的方式写了它?

长话短说,有没有更 pythonic 化(当然也更好)的方法来编写同样的代码?

假设您应该将一些 json 数据写入一个文件。

显而易见的方法是打开文件,将 json 数据写入文件,然后关闭它。这种简单直观的方法只有在没有例外的情况下才是好的。

比方说,第 16 行产生了一个错误,可能是data不是一个有效的 json。在这种情况下,进一步的执行会停止,程序会立即停止。这里你应该注意到一件事,close()在第 18 行没有被调用。因此,文件描述符已经泄漏,数据很有可能会被破坏。现在,这是一个可怕的问题,尤其是如果您正在处理的文件对您所在的系统或业务组织至关重要。

那么,您应该如何解决这个问题呢?一个可能的解决方案是使用 try-except 块,它不仅可以捕获错误,而且在任何一种情况下,我们都有能力显式关闭文件。

然而,将代码放入 try-except 块大多数时候看起来很难看,更好更漂亮的替代方法是使用上下文管理器。

非常简单的语法如下

with context_manager as something:
     # do anything with something
     pass

这相当于 try-finally 块

something = expression
something.__enter__()
try:
    # do anything with something
    pass
finally:
    something.__exit__()

我们用with语句重写的函数现在看起来更干净了

我们不需要显式关闭文件,所有这些都由with语句负责。当然,在引擎盖下会发生一些事情。为了更详细地理解它们,让我们创建一个我们自己的上下文管理器。

我们的自定义上下文管理器是一个具有(特别是)以下两种方法的类:

  • __enter__()
  • __exit__()

在调用上下文管理器的过程中调用__enter__(),当with块的执行完成时,即在块的末尾,调用__exit__()方法来包装代码。所以任何你认为应该在with块的初始化阶段执行的东西都应该放在__enter__()的体内。__exit__()应该包含您希望在with块末尾执行的所有清理代码。即使在运行时遇到错误,也会执行__exit__()主体中的代码。这确保了清理动作被保证执行,就像在前面的情况中关闭文件一样,即使在调用json.loads()json.dump()的过程中有错误。

需要记住的一点是,with块中定义的变量有局部作用域,但是上下文管理器本身没有局部作用域(w.r.t. with块),因此可以重用。

上下文管理器可以用于其他目的,而不是简单的文件 I/O,比如打开和关闭套接字,在测试期间实现设置和拆除功能,以及超出我知识范围的事情。

我希望你喜欢读这篇文章,如果你有什么建议,请在评论中告诉我。最后,如果你觉得这篇文章值得你花时间,请点击推荐按钮,我认为如果你不动它,跟随 按钮会嫉妒的。感谢阅读,希望你学到了新的东西;——)

用于能源市场算法交易的机器学习框架

原文:https://towardsdatascience.com/https-medium-com-skuttruf-machine-learning-in-finance-algorithmic-trading-on-energy-markets-cb68f7471475?source=collection_archive---------1-----------------------

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

[image by Geralt on Pixabay]

人工智能的新突破每天都是头条新闻。远离面向客户的企业的嗡嗡声, 机器学习在金融 中的广泛采用和强大应用却鲜为人知。事实上,很少有领域像金融行业一样拥有如此多的历史、干净和结构化的数据,这使其成为“学习机器”取得巨大成功的早期案例之一,这种成功仍在继续。

大约三年前,我参与了开发机器学习(ML)模型,用于能源市场的价格预测和算法交易,特别是针对欧洲碳排放证书市场。在这篇文章中,我想分享一些我发现与我所有的 ML 项目相关的学习、方法和见解。我在这里关注的不是技术细节,而是建模选择背后的一般考虑,这在经典的学术教科书或在线新技术教程中很少讨论。—关于算法交易的例子,我提出了一些“交易技巧”,当你作为一个孤独的搜索者或与你的数据科学家团队一起将机器学习应用到合成例子之外的广阔世界的现实生活中时,你可能会发现这些技巧很有用。

上下文

在 2005 年《京都议定书》之后,欧洲碳排放证书(EU ETS)市场作为欧盟气候政策的主要支柱已经建立,通过“上限和交易”计划来调节欧洲大约一半的人为 CO2 排放。这一机制为各国政府提供了对温室气体排放总量的控制(“cap”),同时将排放权的有效分配让给市场力量(“贸易”)。基本想法是给污染定价:该计划覆盖的每个工业设施必须监控并向当局报告其温室气体排放的准确数量,然后通过上交配额来抵消各自的数量(以吨为单位)。这些“污染权”被拍卖或免费给予工业参与者,然后可以在场外交易或在中央市场交易,价格由供求关系灵活确定。由于环境政策的减排目标限制了年度许可证的总体供应,一些污染者被迫选择减少污染的措施(“减排”),例如在他们的烟囱中安装额外的过滤器。这些边际减排成本低于当前许可市场价格的污染者(例如,因为他们特定的过滤要求很便宜)可以在市场上出售他们的超额污染限额以获取利润,卖给面临更高边际减排成本的污染者。在一个完全有效的排放交易市场中,许可证的均衡价格将决定于最终减排单位的边际减排成本,该成本是实现许可证供应上限所设定的总体减排目标所必需的。

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

[Image by Pixabay via Pexels]

鉴于特定行业实际减排成本的不确定性,该工具允许政府控制排放总量,而排放许可的实际价格根据需求方市场力量波动,即

市场对未来政策变化的预期

即将进行的许可拍卖的规模,正在进行的拍卖的价格和覆盖率(见图 1)

市场参与者的投机

银行行为(一年内发放的许可证在同一政策阶段的所有年份都有效)

其他能源商品的价格关系。

为了举例说明后者,假设每单位热量的天然气价格低于布伦特原油的价格。电力生产商和公用事业公司将转向这种碳强度较低的燃料,从而降低对碳配额的需求。相应地,津贴的价格在这些时期也会下降(见图 2)。

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

Figure 1: Bullish signal from a highly covered auction at 2pm shortly breaking a bearish trend [image by author]

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

Figure 2: Positive 30day correlation of EUA with UK Gas in 2017 (absolute and normalized) [image by author]

一个全面的模型需要反映所有这些因素。虽然我们可以有把握地假设,在丰富的历史市场数据中观察到的模式会延续到现在,并将延续到未来(这实际上是任何分析建模的必要条件和不可或缺的假设),但很明显,对于任何试图基于一般信念、基本关系或经济物理学的状态空间概念对市场建模的方法来说,这种设置都太复杂了。

所以这真的是一个释放机器学习力量的用例。如何利用它?

以下是使用监督学习的交易系统的典型工作流程:

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

  1. 数据

把数据放好。金融时间序列的好来源是你想交易的交易所的 API, AlphaVantageQuandl 的 API。数据的规模至少应该和您想要建模并最终预测的规模一样小。你的预测范围是多少?更长期的视野将需要额外的输入因素,如市场出版物、政策展望、twitter 披露的情绪分析等。如果您在玩基于来自分笔成交点数据的纯市场信号的短期甚至高频交易游戏,您可能希望包括各种长度的滚动平均值,以便为您的模型提供历史背景和趋势,特别是如果您的学习算法没有像递归神经网络或 LSTMs 那样的显式存储单元。技术分析中使用的所有常用指标(如 RSI、ADX、布林线、MACD)都是基于某种数量(价格、交易量)的移动平均线,即使你不相信简单的交易规则,包含它们也有助于模型反映大多数市场参与者的交易行为。你的计算能力可能是一个限制因素,尤其是在你的 ML 模型将面对做市者或套利者的硬编码、快速和专用算法的情况下。部署专用的云服务器或 ML 平台,如 H2O 和 TensorFlow,可以让你将计算分散到不同的服务器上。清理数据(如何插入间隙?),绘制图表,玩玩它——你已经发现交易机会、趋势、异常了吗?

2。监督模型训练

将您的数据分成互补的集合,用于训练、验证(用于参数调整、特性选择等)和测试。这实际上比听起来更复杂:最理想的是,测试集应该尽可能“类似”于当前的“市场状态”,验证和测试集应该遵循相同的分布。否则,您可能会浪费精力在验证集上调整模型参数,却发现它很难推广到测试集。遵循“市场机制”的概念,即特定商品组合主导目标工具价格动态的延长期,首先让无监督学习的聚类算法发现数据中定义的相关性,然后评估属于相同聚类的验证和测试集中数据的模型性能,这可能是值得的(见图 3-在本项目中,聚类将预测性能提高了 8%)。

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

Figure 3 Coherent market periods as identified by a clustering algorithm (colored segments of EUA settle price) [image by author]

在早期,决定并建立一个单一的数字评估指标。追逐太多不同的指标只会导致混乱。在算法交易的背景下,一个合适的衡量标准是“损益”(PnL),因为它用波动的实际大小(“相关性”)来衡量分类精度(价格上涨/下跌)。它符合你可能考虑的交易政策的标准。在训练集和验证集上观察模型性能。如果训练集的误差,即“模型偏差”,很高,您可能需要考虑更多的模型参数(例如,通过在深度学习模型中添加更多的层/神经元)。如果模型泛化能力很差(“模型过度适应训练集”),即验证和训练集的性能差异(“模型方差”)很高,您可能需要向训练集添加更多数据,减少最相关的特征数量,添加正则化(例如 L2、L1 或下降)或提前停止(在梯度下降优化中)。仔细检查模型出错的案例将有助于识别任何潜在的和可避免的模型偏差,见图 4。

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

Figure 4 Error analysis — price move versus forecast confidence (>0.5: up, <0.5: down) [image by author]

确立你的目标绩效:对于市场预测,75%的分类精度实际上已经很不错了——比随机猜测(50%的精度)好 50%。该基线与其他 ML 应用程序(如在封闭环境中运行的对象或语音识别)非常不同,在封闭环境中可以清楚地识别影响建模目标的因素(图像像素的 RGB 通道、声音样本的波频率)。

3。交易政策

定义你的交易政策:定义模型输出的具体交易含义的一套规则:例如,取决于给定预测的模型置信度的阈值,你在市场上放置什么位置,什么位置大小,在给定的市场状态下你持有位置多长时间,等等。策略通常带有一些需要优化的自由参数(下一步)。在这里讨论的监督学习环境中,这是一个基于回溯测试和网格搜索的相当手工的过程(下面列出了一些缺点)。

4。回溯测试&优化

现在到了数字上——你的交易系统,或者说预测模型和给定交易政策的相互作用,在一组隐瞒的历史市场数据上表现有多好?这里,步骤 2(模型训练)中使用的测试集可以成为调整策略参数的验证集。遗传算法允许你探索政策空间,从第一代比如说 100 个随机选择的政策参数开始,迭代地消除 80 个表现最差的,并使 20 个幸存者每个产生 4 个后代。或者,您可以在多维参数空间中进行网格搜索:从策略参数的一些看似合理的值开始,通过逐个改变参数值,您可以实现的最佳性能设置是什么。在这里,你的绩效指标是你在交易策略中最终要优化的指标,如 PnL 或一些衍生的量,如投资回报、夏普比率(每波动风险的回报)、风险价值、贝塔系数等,见图 5。

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

Figure 5 PnL and Sharpe Ratio for various trading policies [image by author]

防止使参数过度适合验证集的一个好方法是使用“walk-forward-test”(WTF)进行交叉验证,以验证您的方法的健壮性:优化验证段上的策略参数,在验证段之后的数据上及时向前测试它们,向前移动验证段以包括该测试数据,重复。这里的基本假设是,与更久远的过去相比,最近的过去是对未来更好的衡量。

5。模拟&现场交易

在您的策略生效之前,冻结所有系统参数并实时测试,就像根据您的交易算法的输出实际下单一样。这个重要的步骤叫做纸上交易,是检验你的方法有效性的关键。您可能会注意到,在您的历史数据中,您实际上使用了在给定时间并不真正可用的值,例如在计算移动平均值时。如果你的策略看起来仍然有希望,那么恭喜你——是时候投入使用了!虽然您可能会从手动下单开始,但不要低估将您的策略与交易所的 API 集成在一起所需的管理和技术工作。

这里介绍的典型工作流程有一些严重的缺点:

对于衍生合约,如基础期货,历史数据通常报告一天或选定时间间隔内的开盘价和收盘价,以及在该时间间隔内实现的所有交易的合约平均价格。但这不太可能是你可以结清买入或卖出订单的价格,这取决于订单簿的动态,订单簿在不同的买入价/卖出价水平下有不同的交易量。所以你在第二步中的模型预测确实指的是一个理论价格,但可能不是你将要下注的价格。更详细的建模方法需要考虑订单簿的实际结构和动态

制定策略(步骤 3)不是基于机器学习的建模的一部分,而是由直觉、经验或简单的启发指导的手动过程。例如,当模型预测价格上涨时,你会下一个买入订单(“做多”)。但是你买多少份合同呢?你用什么信心阈值?面对不利的市场条件,你会持仓多久?

反馈姗姗来迟:你需要经历第 1-3 步,才能对你的策略表现有初步的了解。预测模型和策略的参数被独立优化,即使模型和策略实际上密切交互。在这个框架中探索政策参数的空间是通过低效的数值优化完成的,而不是通过你的预测机器学习模型的强大梯度优化。

强化学习的框架整合了上面的步骤 2 和 3,将交易建模为代理(交易者)与环境(市场、订单)的交互,以通过其行为(下单)优化回报(如回报)。虽然仍处于早期阶段,但最近的研究表明,这是一条值得探索的道路——“需要做进一步的研究”。

参考文献:

参见维基百科,排放交易中关于“总量管制和排放交易”机制的广泛讨论,以及维基百科,欧盟排放交易中关于欧洲市场框架的更多具体信息。

南 Smith,环境经济学(牛津大学出版社 2011 年)对环境政策的市场方法的历史和影响做了很好的介绍。

Denny Britz 的博客文章给出了更多关于指令书机制的细节,以及算法交易中强化学习方法的前景。

**免责声明:**上述项目是为减排资本有限责任公司承担的,该公司是一家专注于碳和其他环境商品的专有投资和贸易公司,同意以当前形式发布本出版物。本文表达的所有内容和观点的责任完全由作者承担。

**作者:**作为一名热情的数据科学家,我在过去四年里一直担任全球初创公司的技术主管,并实施现实生活中的人工智能解决方案。请通过 simon@deepprojects.de 联系我。

关于气候

原文:https://towardsdatascience.com/https-medium-com-stephaniewillis808-concerning-climate-5a6b923eb8eb?source=collection_archive---------11-----------------------

为什么我们不能放弃减缓气候变化,以及对迄今为止进展情况的分析。

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

Photo by NOAA on Unsplash

动机

当我想到气候变化以及我们可以做些什么来缓解它时,我常常会对这一切感到绝望。它看起来如此重要,却又如此难以解决。

排放大量的二氧化碳给了我们不可思议的生活方式。当我们排放时,没有即时的反馈机制——我们无法直接感受到排放的成本。更何况费用大多是其他人承担的。巨大的直接利益和缺乏直接的负面反馈使得我们很难说服自己或我们的政府来抑制排放。事实上是如此之难,以至于我认为放弃这份糟糕的工作并继续我们的生活是很诱人的。我们觉得我们的政府和行业没有机会做出必要的改变,以满足巴黎协定将全球变暖限制在“比工业化前水平高出 2 摄氏度以下”的目标——所以我们放弃了。

但是我们不应该。因为 2 C 比 3 C 好,3 C 比 4 C 好。我认为这是一个被忽略的关键点。排放的二氧化碳越多,温度就越高,后果就越严重。已故的大卫·麦凯——我的英雄——将二氧化碳排放量与时间的图表下的面积描述为等于“痛苦”。面积越大,苦难越多。因此,我们应该尽我们所能来限制这些排放和由此带来的痛苦,即使我们怀疑气温上升将达到 2 摄氏度。

在深入研究我们应该采取什么行动之前,我认为有必要了解我们现在的处境。气候变化已经造成了多大的破坏,还会造成多大的破坏?我们在减排方面做得怎么样?这些问题(以及我目前的失业和无限时间的状态)促使我做了一些研究和数据分析。总的来说,我尝试使用开源数据集来产生我自己的数据。有时我没有做到这一点,所以复制了其他人的数据——在这种情况下,我会在说明中这样说。如果你想在阅读文章时看到数据操作和绘图的代码,你可以在这里做

气候影响

政府间气候变化专门委员会的最新报告(T0)和最近公布的美国全球变化计划(US Global Change Programme)的气候科学特别报告(T2)描述了气候变化已经造成的影响。这些变化包括:从 1850-1900 年到 2003-2012 年,气温上升了约 0.78 摄氏度(气专委);1901-2010 年期间全球平均海平面上升约 19 厘米(气专委);世界大部分大陆地区极端温度和强降水事件的强度和频率增加。

这些报告还包括对不同排放情景下气候变化未来影响的预测。IPCC 使用了四种被称为“代表性浓度途径”(RCP)的情景。它们是 RCP2.6、RCP 4.5、RCP 6.0 和 RCP 8.5。名字中的数字代表“辐射力”——大气中的气体如何影响地球吸收的能量和辐射回太空的能量之间的平衡。这个数字越大,辐射进来和辐射出去的比例就越大——所以温度就越高。具体来说,这些数字与 2100 年每种情况下的辐射作用力有关。在这四种情况下,化石燃料使用和工业的二氧化碳年排放量如下所示。

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

Annual emissions of CO2 from fossil fuels and industry under the 4 RCP scenarios. Data and citations for scenario development here.

在 RCP 8.5 中,年度 CO2 排放量继续增加。高人口和适度的技术变革导致了长期的高需求和高排放。

在 RCP 6.0 中,二氧化碳年排放量在 2080 年达到峰值,然后下降。人口稳定,增长相对缓慢,经济的能源强度(二氧化碳排放量/美元)逐渐改善。

在 RCP 4.5 中,二氧化碳年排放量在 2040 年达到峰值,然后下降。缓慢的增长和随后的减排是通过大规模采用核能和碳捕获与封存(CCS)以及大规模植树造林来实现的。

在 RCP 2.6 中,二氧化碳年排放量在 2020 年达到峰值,然后下降,2070 年后变为负值。这一情景在很大程度上依赖于 CCS 和生物燃料的使用来实现碳负发电(通过种植植物,燃烧它们,然后捕获和储存过程中排放的 CO2)。这是一项未经证实的技术。

下图显示了每个 RCP 下预计的全球温度变化。显示的温度变化是相对于 1986-2005 年的平均值而言的。值得一提的是,这不是《巴黎协定》所指的“前工业化”基线。我对“前工业化”基线做了更多的研究,并在这里写下了相关内容。结论是,如果我们希望它们相对于工业化前的水平,我们需要将下面报告的温度变化增加 0.55°C 至 0.8°C。

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

Projected global temperature increase relative to 1986–2005 under each of the emissions scenarios as determined by multi model simulations. Time series are shown on the left for RCP 2.6 and RCP 8.5. On the right the projected temperature change to the period 2081–2100 is shown for all 4 scenarios. The solid line indicates the mean of multiple different models and the shading indicates the 5 to 95% range of the model outputs. This plot is taken directly from the IPCC’s latest report as I was unable to find a tractable data set from which to make my own plot.

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

Projected global temperature increase (°C) from 1986–2005 to 2081–2100 under the 4 scenarios. This table summarizes the key numbers from the plot above. ‘Mean’ in this context refers to the average result of many different climate models. The likely range of temperatures under each scenario is shown on the right. The IPCC uses the word ‘likely’ to describe something which has a greater than 66% probability of happening.

将 0.55℃和 0.8℃之间的温度变化加到报告的温度变化上,我们看到,即使我们遵循 RCP2.6,到 2010 年,我们可能会超过 2℃的变暖。在高排放情景下,变暖的规模和速度是可怕的。我不知道到 2100 年再变暖 3.7 摄氏度会是什么样子,但我对 0.78 摄氏度的变暖已经导致(饥荒、洪水、飓风)的痛苦有所了解。看着这些温度估计,我强烈希望我们远离 RCP 8.5。

现状核实

记住这些温度变化,让我们看看数据。在过去的几年里,毫无疑问,我们一直在努力减少二氧化碳的排放,他们取得了哪些成效?我们似乎在遵循哪种情景?

RCP 方案始于 2000 年。截至 2015 年,化石燃料和工业二氧化碳排放量的详细数据已经公布。因此,历史数据和“未来情景”之间有 15 年的重叠。这种重叠让我们能够弄清楚现实与场景相比是如何形成的。在下图中,我绘制了 4 种情景下的历史排放量和预测排放量。我已经用每个场景的平均温度上升估计值替换了场景名称(来自上表)。我发现温度变化的估计比辐射力的估计更容易理解。但是请注意,温度数值只是模型的平均输出。它们没有涵盖每种情况下可能的温度上升的全部范围。

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

Comparison of historical and projected annual CO2 emissions from fossil fuel use and industry. Each scenario is labelled with the average predicted increase in temperature between the period 1986–2005 and the period 2081–2100 under that scenario. For a explanation of why only emissions from fossil fuels and industry are being analyzed see the end of this article.

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

A zoomed in look at the previous figure. The intermediate emissions scenarios have been omitted for clarity.

令人沮丧的是,全球二氧化碳排放量似乎很大程度上遵循了 RCP 8.5——有增无减的增长情景。然而,最近排放量增长已经放缓,并偏离了 RCP 8.5 的设想。2015 年,尽管国内生产总值增长了 3%,二氧化碳排放量却下降了 0.1%,因此脱碳努力似乎产生了一些影响。

我们每年排放的准确轨迹不需要完全遵循这些情景中的任何一个——它们仅仅是一些可能的未来的指示。最重要的是二氧化碳的总排放量,而不是我们的排放量随时间变化的确切方式。下图显示了自 2000 年以来的累计排放量,并与各种情景下的累计排放量进行了比较。

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

Comparison of historical and projected cumulative CO2 emissions from fossil fuel use and industry. Each scenario labelled with the average predicted increase in temperature between the period 1986–2005 and the period 2081–2100 under that scenario. See below for a zoomed in version.

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

A zoomed in version of the previous figure. The huge cumulative emissions under the 3.7°C scenario dwarfs current emissions and makes current differences seem small. They are not! We saw in the annual plots that a year’s worth of emissions is of the order of 30 Gtonnes so the difference between the 3.7°C and the 1.0°C scenario is almost a whole years worth of global emissions.

所以我们的累积排放量超过了低温情况下的排放量。因此,将我们的年排放量与较低温度情景下的排放量保持一致是不够的。为了弥补我们已经做出的承诺,我们需要比这些情景所显示的更大幅度地减少我们的年排放量。这意味着我们越是拖延控制排放的时间,排放限制就需要变得越严格。我们需要想出如何大幅减少排放,而且我们需要尽快行动。如果我们不这样做,我们很可能会看到比我们目前敢于考虑的更大的温度上升。

在以后的文章中,我会更深入地研究几个主要国家的排放量,并试图找出不同的政策措施对二氧化碳排放量的影响。希望这些结果能告诉我们一些关于如何务实地向前推进,以最小化变得更热的程度。

后记:为什么只有化石燃料和工业排放的 CO2?

这项分析只关注化石燃料使用和工业过程中的二氧化碳排放。我没有研究其他人为的二氧化碳来源,比如土地使用的变化。除了二氧化碳,我也没有研究其他温室气体。RCP 方案包括对其他排放类型的预测,但我无法找到它们的最新历史数据集。因此,我在分析中省略了它们。为了了解这种忽略是否合理,我查看了人为温室气体排放的明细。下图显示了 2010 年的细分情况。

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

Breakdown of anthropogenic greenhouse gas emissions (gigatonne of CO2*-equivalent (GtCO2 eq) per year ) in 2010. The equivalence of different greenhouse gases is based on their 100 year global warming potential — as calculated in the IPCC’s 5th Assessment report. Data is also from the IPCC’s 5th Assessment report Note that there are very large uncertainties about CO*2 emissions due to forestry and other land use change.

化石燃料和工业排放的二氧化碳构成了大部分人为温室气体排放。土地使用变化产生的甲烷排放和二氧化碳排放也是重要因素,观察它们如何演变将是有趣的。然而,在缺乏最新的排放数据的情况下,我认为忽略它们并关注最大的因素是合理的。

超收敛:使用大学习速率非常快速地训练神经网络

原文:https://towardsdatascience.com/https-medium-com-super-convergence-very-fast-training-of-neural-networks-using-large-learning-rates-decb689b9eb0?source=collection_archive---------4-----------------------

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

Photo by Mike Enerio on Unsplash

这篇文章概述了一种叫做 【超级收敛】 的现象,与传统的训练方法相比,我们可以更快地训练一个深度神经网络。其中一个关键要素是使用具有最大可能学习率的 【单周期策略】 来训练网络。我鼓励你看看这篇 精彩的论文 了解更多细节。

在训练中允许“超级收敛”的一个见解是使用大的学习率来正则化网络,因此需要减少所有其他形式的正则化,以保持欠拟合和过拟合之间的平衡。

动机:

斯坦福大学最近组织了一场名为 DAWNBench 的比赛。获胜的参赛作品是 by, fast.ai 他们训练 CIFAR10 在 3 分钟内达到 94%的测试准确率。他们使用了很多很酷的技巧,避免坚持传统的训练技巧。

你可能想知道,在大约 75 个周期内训练一个模型在 CIFAR10 上达到 94% (高)测试精度是没有意义的,因为最先进的技术已经超过 98%。但是你不认为,**“最先进水平”**准确性是一个病态的目标,因为在这个问题上投入更大的模型、更多的超参数调整、更多的数据扩充或更长的训练时间通常会导致准确性的提高,使不同作品之间的公平比较成为一项微妙的任务。此外,超收敛的存在与理解深度网络的泛化有关。

上图展示了 CIFAR10 数据集上的“超级收敛”。我们可以很容易地观察到,与典型的训练(91.2%)相比,使用修改的学习率时间表,我们实现了更高的最终测试准确度(92.1%),并且也只是在几次迭代中。

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

Super-Convergence of Neural Nets

超收敛:

因此,让我们快速进入正题,讨论我们如何在少得多的训练迭代次数中实现这些最先进的结果。许多人仍然认为用最佳超参数训练深度神经网络是一种魔法,因为有太多的超参数需要调整。*遵循什么样的学习率策略,为架构选择什么样的内核大小,什么样的权重衰减和丢失值对于正则化来说是最优的?*所以,让我们打破这种刻板印象,尝试释放一些这些黑色艺术。

我们将从 LR 范围测试开始,它可以帮助你找到最大的 学习率 ,你可以用它来训练你的模型(最重要的超参数)。然后,我们将运行网格搜索 CV 来搜索剩余的参数( 权重衰减&下降 ),以找到它们的最佳值。

学习率查找器:

Leslie Smith 在他的论文中首次介绍了这种技术来寻找 max learning,这篇论文更加详细地介绍了使用循环学习率循环动量的好处。我们以很小的学习率开始预训练,然后在整个跑步过程中线性(或指数)增加。这提供了我们在一个学习率范围内训练网络有多好的一个概览。在学习率较低的情况下,网络开始收敛,随着学习率的增加,网络最终变得过大,导致测试精度/损失突然发散。

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

Max LR is the peak value in the graph after which accuracy starts decreasing!

典型的曲线看起来类似于上面所附的曲线,第二个图说明了训练迭代次数和达到的精度之间的独立性。

单周期政策:

为了实现超收敛,我们将使用“单周期”学习率策略,该策略要求指定最小和最大学习率。Lr 范围测试给出最大学习率,最小学习率通常为最大值的 1/10 或 1/20。一个循环由两个步长组成,一个是 Lr 从最小值增加到最大值,另一个是从最大值减少到最小值。在我们的例子中,一个周期将比迭代/时期的总数小一点,并且在剩余的迭代中,我们将允许学习率比其初始值小几个数量级。下图更好地说明了单周期策略——左图显示了循环学习率,右图显示了循环动力。

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

Cyclical Learning rate and Cyclical Momentum

“一个周期”策略的动机如下:学习率开始时很小,以允许收敛开始,但是随着网络穿过平坦的谷,学习率变大,以允许更快地通过谷。在训练的最后阶段,当训练需要进入局部最小值时,学习率再次降低到一个小值。

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

Loss function topology

左图显示了训练如何跨越损失函数拓扑的可视化,而右图显示了优化结束时的特写。

为什么一个大的学习率表现得像一个正则化者?

LR 范围测试通过结果显示了正则化的证据,其显示了当使用 Cifar-10 数据集和 Resnet-56 架构进行训练时,训练损失增加且测试损失减少,而学习率从大约 0.2 增加到 2.0,这意味着在使用这些大的学习率进行训练时正则化正在发生。此外,该定义称正则化是我们对学习算法进行的任何修改,旨在减少其泛化错误。

批量大小:

众所周知,小批量会导致正则化效应,一些人还显示 CIFAR-10 的最佳批量约为 80,但与之前的工作相反,本文建议在使用单周期策略时使用更大的批量。批量大小应该只受内存约束的限制,而不受任何其他因素的限制,因为较大的批量大小使我们能够使用较大的学习速率。尽管如此,较大批量的好处在某一点后逐渐消失。

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

批量大小对测试损失/准确度的影响

左图显示了批次大小对测试准确度的影响,右图显示了测试损失。在这里,我们可以观察到,与其他相比,批量大小为 1024 在最少的训练迭代次数中实现了最佳的测试准确性。

将测试损失与测试准确度进行对比也很有趣。虽然较大的批量在训练早期获得较低的损失值,但最终的损失值仅在较小的批量时最小,这与准确度结果完全相反。

周期性动力:

动量和学习速率对训练动力学的影响是密切相关的,因为它们是相互依赖的。动量被设计为加速网络训练,但是它对更新权重的影响与学习速率的大小相同(可以容易地显示为随机梯度下降)。

最佳的训练程序是增加的循环学习率和减少的循环动量的组合。循环动量情况下的最大值可以在对几个值(如 0.9、0.95、0.97、0.99)进行网格搜索后选择,并选择一个给出最佳测试精度的值。作者还观察到,最终结果几乎与动量的最小值无关,0.85 就可以了。

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

上图显示了动量对采用 ResNet56 体系结构的 CIFAR10 数据的测试精度的影响。

在增加学习速率的同时减少动量提供了三个好处:

  • 较低的测试损耗,
  • 更快的初始收敛,
  • 在更大的学习速率范围内更大的收敛稳定性。

还有一点需要注意的是,先减小动量,然后再增大动量,这比反过来会产生更好的结果。

重量衰减:

这是最后一个值得讨论的重要超参数。正则化的量必须针对每个数据集和架构进行平衡,权重衰减的值是调整正则化的关键旋钮。这需要对几个值进行网格搜索,以确定最佳幅度,但通常不需要搜索一个以上的有效数字。

利用数据集和架构的知识,我们可以决定测试哪些值。例如,更复杂的数据集需要更少的正则化,因此测试更小的权重衰减值,如 104、105、106 和 0 就足够了。浅架构需要更多的正则化,因此测试更大的权重衰减值,如 102、103、104。在网格搜索中,我们经常使用 3.18e-4 这样的值,选择 3 而不是 5 的原因是考虑了指数的二等分,而不是幅度本身的二等分(即,在 104 和 103 之间,一等分为 103.5 = 3.16×104)

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

从上面的图中我们可以看到,1.8e-3 的权重衰减(再次平分指数 b/w -0.5 和-1,即 10^-0.75)允许我们使用更大的学习速率,加上与其他值相比给出最小的测试损失。

现在,按照这个学习率时间表和一个明确定义的程序来做网格搜索 CV 将会给你带来更好的结果,在训练迭代中几乎减少 50%。

感谢阅读!我会尽力多写一些这样的博客。我的Linkedin简介。你可以关注我的 推特 太。

掌握新一代梯度推进技术

原文:https://towardsdatascience.com/https-medium-com-talperetz24-mastering-the-new-generation-of-gradient-boosting-db04062a7ea2?source=collection_archive---------1-----------------------

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

Catboost

梯度提升决策树和随机森林是我最喜欢的表格异构数据集的 ML 模型。这些模型是在 Kaggle 比赛中表现最好的,并在行业中广泛使用。

Catboost ,这个街区的新小子,到现在已经有一年多一点的时间了,它已经在威胁 XGBoostLightGBMH2O

为什么选择 Catboost?

更好的结果

Catboost 在基准测试中取得了最好的结果,这很好,但是我不知道我是否会仅仅为了对数损失改进的一小部分而替换一个工作的生产模型(特别是当进行基准测试的公司对 Catboost 有明显的兴趣时😅).
然而,当你看到分类特征发挥巨大作用的数据集时,比如亚马逊互联网数据集,这种改进变得显著且不可否认。

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

GBDT Algorithms Benchmark

更快的预测

虽然训练时间可能比其他 GBDT 实现要长,但根据 Yandex 基准测试,预测时间比其他库快 13-16 倍。

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

Left: CPU, Right: GPU

含电池

与其他 GBDT 算法相比,Catboost 的默认参数是一个更好的起点。对于想要一个即插即用模型来开始体验树合奏或 Kaggle 比赛的初学者来说,这是一个好消息。
然而,我们必须解决一些非常重要的参数,我们稍后会谈到这些参数。

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

GBDT Algorithms with default parameters Benchmark

Catboost 的一些更值得注意的改进是功能交互、对象重要性和快照支持。

除了分类和回归,Catboost 支持开箱即用的排名

经过战斗考验

Yandex 严重依赖 Catboost 进行排名、预测和推荐。这种模式每月为 7000 多万用户提供服务。

CatBoost 是决策树上梯度提升的算法。它由 Yandex 的研究人员和工程师开发,是公司内部广泛用于任务排名、预测和提出建议的 MatrixNet 算法 的继任者。它是通用的,可以应用于广泛的领域和各种问题。

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

该算法

经典梯度增强

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

Gradient Boosting on Wikipedia

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

Catboost 秘制酱

Catboost 引入了两个关键的算法进步——实现了有序提升,这是一种替代经典算法的置换驱动算法,以及一种用于处理分类特征的创新算法**。
这两种技术都使用训练样本的随机排列来对抗预测偏移,这种偏移是由一种特殊的目标泄漏引起的,这种泄漏出现在梯度增强算法的所有现有实现中。**

卡特彼勒电气特征处理

有序目标统计

大多数 GBDT 算法和 Kaggle 竞争对手已经熟悉了目标统计(或目标均值编码)的使用。
这是一种简单而有效的方法,其中我们用类别条件下的预期目标 y 的估计值对每个分类特征进行编码。
事实证明,不小心应用这种编码(y 在具有相同类别的训练示例上的平均值)会导致目标泄漏。

为了对抗这种预测转变 CatBoost 使用了一种更有效的策略。它依赖于排序原则,并受到在线学习算法的启发,该算法按时间顺序获取训练样本。在这种设置下,每个示例的 TS 值仅依赖于观察到的历史。
为了使这种想法适应标准的离线设置,Catboost 引入了一个人工“时间”——训练示例的随机排列 σ1
然后,对于每个示例,它使用所有可用的“历史”来计算其目标统计。
注意,仅使用一个随机排列,导致前面的例子比后面的例子具有更高的目标统计方差。为此,CatBoost 对梯度增强的不同步骤使用不同的排列。

一个热编码

Catboost 对所有具有最多 one_hot_max_size 唯一值的特征使用一键编码。默认值为 2。

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

Catboost’s Secret Sauce

有序推进

CatBoost 有两种选择树结构的模式,有序和简单。普通模式对应于标准 GBDT 算法与有序目标统计的组合。
有序模式提升中,我们执行训练示例的随机排列- σ2,并维护 n 个不同的支持模型- M1。。。,Mn ,使得仅使用排列中的第一个 i 样本来训练模型 Mi
在每一步,为了获得第 j 个样本的残差,我们使用模型
mj1

遗憾的是,由于需要维护 n 个不同的模型,这种算法在大多数实际任务中并不可行,增加了 n 倍的复杂度和内存需求。Catboost 在梯度推进算法的基础上实现了对该算法的修改,使用了所有要建立的模型共享的一个树结构。

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

Catboost Ordered Boosting and Tree Building

为了避免预测偏移,Catboost 使用排列使得 σ1 = σ2 。这保证了目标 yi 不用于训练 Mi ,既不用于目标统计计算,也不用于梯度估计。

把手放在某物或者某人身上

对于这一部分,我们将使用 亚马逊数据集 ,因为它很干净,并且非常强调分类特征。

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

Dataset in a brief

调谐 Catboost

重要参数

cat_features —为了利用 Catboost 对分类特征的预处理,该参数是必需的,如果您自己对分类特征进行编码,并且没有将列索引作为 cat_features 传递,那么您就错过了 Catboost 的精髓*。*

one_hot_max_size —如前所述,Catboost 对所有具有最多 one_hot_max_size 唯一值的特征使用 one-hot 编码。在我们的例子中,分类特征有许多唯一值,因此我们不会使用一个热编码,但根据数据集调整该参数可能是个好主意。

learning_rate&n_estimators—learning _ rate 越小,利用模型需要的 n 个估计量就越多。通常,方法是以相对高的学习率开始,调整其他参数,然后降低学习率,同时增加n _ 估计量

max_depth —基树深度*,该参数对训练时间有很大影响。*

subsample —行的采样率,不能用于贝叶斯增强类型设置。

colsample_bylevel, colsample_bytree, colsample_bynode —列的采样率。

l2_leaf_reg — L2 正则化系数

random_strength — 每一次分裂都会得到一个分数,random_strength 为分数增加了一些随机性,这有助于减少过度拟合。

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

Check out the recommended spaces for tuning here

使用 Catboost 进行模型探索

除了 GBDT 模型非常流行的特性重要性之外,Catboost 还提供了特性交互对象(行)重要性

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

Catboost’s Feature Importance

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

Catboost’s Feature Interactions

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

Catboost’s Object Importance

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

SHAP values can be used for other ensembles as well

完整的笔记本

查看一些有用的 Catboost 代码片段

Catboost Playground Notebook

结果

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

Catboost vs. XGBoost (default, greedy and exhaustive parameter search)

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

拿走

  • Catboost 的构建方法和属性与“老”一代 GBDT 车型相似。
  • Catboost 的强大之处在于它的分类特征预处理预测时间模型分析
  • Catboost 的弱点是它的训练和优化时间
  • 不要忘记将 cat_features 参数传递给分类器对象。没有它,你就不能真正利用 Catboost 的能力。
  • 尽管 Catboost 在默认参数下表现良好,但有几个参数在优化时可以显著改善结果。

进一步阅读

非常感谢 Catboost 团队负责人安娜·维罗妮卡·多罗古什

如果你喜欢这篇文章,请按下鼓掌键👏🏽如果你对接下来的帖子感兴趣,一定要关注我

中:https://medium.com/@talperetz24 推特:https://twitter.com/talperetz24 领英:https://www.linkedin.com/in/tal-per/

像每年一样,我想提一下data hack——最好的数据驱动黑客马拉松。今年,我和דור פרץ在我们的项目中使用了 Catboost,并获得了第一名🏆。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值