减少不确定性:知道的越少,学到的越多
你不需要大数据在你的分析中变得“重要”
在一个数据变得如此普遍的时代,我们已经太习惯于解决我们认为拥有“足够数据”的问题,而忽视我们认为缺乏数据的问题。更糟糕的是,大数据的嗡嗡声已经改变了我们的预期,让小数据变得无用、无信息、非常无聊。但这就是为什么我们有数据科学家,对不对?
其实数据科学家这个头衔有点多余;另一类科学家到底是什么?不是每个科学家都是数据科学家吗?根据 sciencecouncil.org 的说法,科学家是这样的人:
系统地收集和使用研究和证据,提出假设并进行检验,以获得和分享理解和知识。
本质上,科学更多的是关于收集数据,而不是拥有数据。相反,我们应该将自己视为商业或可能的决策科学家:观察和 收集数据 以便为我们的决策提供信息。
我将用 3 个例子来说明收集数据的行为是如何值得的,尤其是在数据很少或没有数据的情况下。
#1 估计受污染鱼类的百分比
假设有谣言说附近的一个湖爆发了某种水传播疾病,这种疾病可能会感染鱼。你绝对不知道鱼的哪一部分(如果有的话)被感染了。如果你想 100% *确定百分之多少的鱼被感染,你需要对每条鱼进行取样(这是一项不合理且昂贵的任务)。相反,你决定随机抽取几条鱼的样本,观察它们是否被污染?当然,我们知道样本越多,我们的估计就越准确。尽管如此,随着我们采集越来越多的鱼样本,我们估计的确定性的净增加是增加还是减少?换句话说,**我们从第一条鱼中获得的确定性的增加等于、小于还是大于我们从第 1000 条鱼中获得的确定性的增加?*在继续之前,让我们先确定一些事情:
最高密度区间 (HDI): 该度量表示分布中最可信的一组点。例如,95% HDI 区域意味着 HDI 内部的每个值都比 HDI 外部的任何值具有更高的概率密度。
**不确定性:**在我们的例子中,不确定性将被定义为 95% HDI 的范围。例如,如果我们给定分布的 95% HDI 是[.04 到. 66],那么我们的不确定性将是. 62 (.66-.04)。范围越小,我们越有把握。
**贝塔分布:**贝塔分布是一个纯粹的连续分布,我们将用它来表示我们的鱼被污染的概率。
现在是时候对鱼进行随机取样,检测是否被污染了。我们可以在每个样本后更新贝塔分布,从而量化新的不确定性。请注意,在对任何鱼进行采样之前,我们的分布在 0 和 1 之间是均匀的,在 0 和 1 之间的任何值都是同样可能的。为了这个例子的目的,让我们假设我们采样了 15 条鱼,没有一条被感染。下面的图表显示了每个样本后我们更新的分布。
The order of charts is top-down starting from left; Uncertainty shown in red region
注意我们的不确定性(红色区域)在每个样本后是如何减少的。没有任何鱼样本(左上),我们的 HDI 范围是 95%。到我们对第 15 条鱼取样时,我们的 HDI 下降到了 17%(减少了 80%以上)。假设 15 条鱼样本中没有一条被感染,那么真实的污染率有 95%的可能在 0%到 17%之间。
然而,最令人印象深刻的是不确定性的最大减少实际上来自第一个样本。在我们的第一个样本之后,我们的人类发展指数范围下降了 17%,从 95%下降到 78%。
Reduction in Uncertainty after 15 samples
左边的图表反映了每个后续样本后我们的 HDI 中的 减少 。注意不确定性的减少。对第 10 条鱼取样只减少了我们 2%的不确定性。
最后,我们的第一个样本比第十个样本减少了 8.5 倍的不确定性!
#2 根据未知分布估计中值
假设我们只从未知大小的未知分布(参数或非参数)中抽取 3 个值。
未知分布的真实中值落在最高和最低采样值之间的几率有多大?
我们可以通过计算相反的问题来解析地解决这个问题——真实中值落在我们的最高或最低值之间的概率。根据定义,一个随机样本有 50%的几率低于中值,因此所有 3 个样本都低于中值的几率为 0 . 5。然而,我们也可以让所有 3 个样本以相等的几率高于中位数。因此,1 减去组合概率将计算出真实平均值落在两者之间的概率。
下面反映了前 9 个样品的结果。
请注意,只有 2 个样本时,其概率是 50–50。抽取第三个样本将使我们的机会增加 0.25%到 75%!到我们的第 5 个样本,我们的机会已经提高到 93.75%!
只需 5 个样本,我们就可以了解未知分布的很多信息!
瓮中的 3 个球
假设有一个骨灰盒,里面有一万个红蓝球。你不知道一个球有百分之多少是蓝色或红色的(它可以在 0 到 100%之间变化)。你猜对骨灰盒中主要颜色的几率是 1–1(50%的几率)。
假设你从骨灰盒中取出 1 个且只有 1 个球。你现在猜对大多数颜色的几率有多大?
假设你总是猜你采样的颜色,猜对大多数颜色的几率从 50%上升到 75%,只要采样一个球就增加 25%!
结论
- 在许多情况下,当你对某件事知之甚少时,数据的价值,也就是信息的价值,是最大的。
- 有机会证明在做决定之前收集更多数据的价值,特别是当我们知道的很少的时候。实际上,你可以使用贝叶斯统计框架将价值货币化。这些概念与信息分析的值密切相关,可用于计算收集更多数据以减少不确定性的 ROI。
反思 4 个月的数据科学博客
Photo by Designecologist from Pexels
回顾过去的 4 个月,并为未来的 4 个月设定一些目标…加上我终于达到了 1K 粉丝!谢谢大家!
我在今年(2019)五月中旬左右开始认真写博客。我正在参加一个数据科学训练营,想要一个论坛来展示我的工作。我的导师建议我在 Medium 或 GitHub 上写博客。感谢星星,我选择了中等(我永远无法让我的 GitHub 博客工作)。
完全披露——这篇博客有点沾沾自喜。当我最终达到 1000 名追随者的里程碑时,我告诉自己我会写一篇“回顾我来的地方”的帖子,我终于在几天前达到了这个里程碑(感谢所有人的支持和阅读我的材料)。
我将谈一谈我是如何走到这一步的,但老实说,我没有太多的智慧可以分享。我的博客能够获得关注的原因之一是运气。如果我从头开始,我不确定我是否能够复制所发生的事情(你会在下面看到为什么我会有这种感觉)。
一些统计数据
以下是我博客的一些数据:
- 1018 名粉丝(1000 是我的长期目标,所以请原谅我的吹嘘)。
- 25 篇文章发表 (自五月中旬起,不包括此篇)
- 我目前的收入大约是每周 160 美元。还没有租金,但也不是花生。
我当然为能走到这一步而自豪。当我开始写关于数据科学的博客时,我希望将我的写作与职业联系结合起来,最终 帮助我 找到一份工作,就是这样。我当时并不知道写作会成为我的一项新爱好和额外的收入来源——我现在把我的博客视为我自己的一个小公司,我打算在可预见的未来继续完善和努力。
我在上面提到了运气。让我告诉你我的意思。
瓶中闪电
在我写这篇文章的时候,我的博客有 225,346 次的浏览量。这些观点中,82058 个(占总数的 36%)来自一个帖子, 了解随机森林。 它成功的主要原因是,当你谷歌“随机森林”(就在维基百科下面找)时,它是顶级搜索结果之一——顺便说一下,我不知道谷歌为什么把它排在这么高的位置。
有趣的是,我从未打算单独发表那篇文章。它原本是为了补充另一篇文章(我的新兵训练营项目,在那里我使用机器学习来选择 Lending Club 贷款进行投资)。随机森林算法在我的结果中占有显著地位,所以我写了一份关于它如何工作的描述。然而,我不是一个简洁的作家,因此描述结束时真的很长。考虑到没有人愿意阅读一篇关于我的数据科学项目的 25 分钟的博客文章,我决定将关于 random forest 的部分作为自己的文章发表。幸运的我,看看结果的不同:
- 了解随机森林——82056浏览量和 432 粉丝。
- 把 Lending Club 最差的贷款变成投资金—1136观点和 39 粉丝。
即使现在 3 个月过去了,它仍然是我浏览次数最多的博客,我几乎没有发表它。如果我没有发表它,我就不会有今天。
在波动中坚持
从那以后,我试图重现那道闪电,但收效甚微。我取得了一些合理的成功(我应该说是一些火花),但没有闪电。定期发布好内容真的很辛苦。我非常钦佩我的媒体同行们,他们每天都出版高质量和受欢迎的内容。
通过努力工作,让我们诚实一些运气,这些人磨练了他们的写作风格和主题专业知识,以这样一种方式,它与媒体读者感兴趣的事情有很大的重叠。借用创业界的术语,这些超级作家享受着巨大的产品市场契合度(见下面的文氏图):
The Type of Writer We All Aspire to Be (The In My Dreams Venn Diagram)
然而,对于我们这些普通人来说,现实更有可能是我们并不像我们认为的那样知道很多。普通读者对我们有见解的主题不感兴趣:
The Type of Writer I Actually Am (Realistic Venn Diagram)
当你花了几天时间制作和研究的作品失败了,这绝对令人沮丧。例如,我真的为这篇关于如何更有效地提高人们的技能并帮助他们转行的文章感到骄傲。然而,这是迄今为止我最少阅读的故事之一。
但没关系——有些波动是意料之中的,就像上面现实的文氏图一样,人们不会总是对我认为值得注意的事情感兴趣。对我来说,关键是写作,直到我找到自己的定位,然后继续磨练那个专业领域,如果我的定位更小、更窄也没关系。
此外,除了观点和阅读之外,我还写了许多其他原因:
- 为了学习 —我的很多数据科学帖子都是为了让我更好地理解一门技术学科。试图教某人某样东西是如何工作的,尤其是在像 Medium 这样公开的论坛上,迫使我再三检查我认为我对这个主题的了解。此外,用简单的英语解释主题迫使我完全理解基本原理,这样我就可以想出清晰和相关的例子。
- 好奇心——这个世界上有如此多有趣的数据被收集,也有如此多有趣的问题需要解决。我可能无法像在真正的研究项目中那样深入研究,但这个博客将继续作为我定量探索的日记。
- 结识志同道合的人——这是博客的一个方面,我肯定需要更加努力。我喜欢媒体上几乎没有巨魔或火焰(根据我个人的经验),但我也不介意更经常地与我的读者交流。在不久的将来,我希望与读者和其他作家建立真正的、持久的联系。
- 副业收入 —我不会撒谎。我的写作能得到报酬,这当然很好,也很令人惊讶。与其他平台相比,我还喜欢 Medium 上的努力和收入之间有更多的相关性。
最后也是最重要的一点,我写作是为了遵守纪律。我坚信良好的行为会增加——这意味着随着时间的推移,良好决策的累积收益会呈指数增长:
What Positive Compounding Looks Like
我计划继续每周至少发布一篇文章,风雨无阻。就像耐心地培育和维护一个花园最终会带来一个又一个的丰收一样,我希望在一两年后回头看时会说,“哇,看看我的博客取得了多大的进步,我从每周坚持写博客中学到了多少。”
最后,因为我经历了训练营和职业转变,我对教育即服务行业(训练营、MOOCs、职业发展平台等)产生了兴趣。).对于转行者来说,找工作可能是相当残酷无情的(我个人经历过这种情况,也在我的密友身上看到过)。我觉得肯定有更好的方法——不幸的是,我目前在这方面没有任何改变游戏规则的见解,但它肯定会是我未来关注的领域。
结束语
我为这篇文章的漫无边际道歉。我真的很兴奋能够为你们所有人写作,并感谢你们的支持。
如果有任何数据科学、教育或金融作家想要合作或只是聊天/头脑风暴,请在 Medium 或通过 Twitter 在给我留言。干杯,我期待着你的来信!
更多数据科教相关岗位由我:
运用数据科学实现财务自由的思考
在我写这篇文章的时候,由于是长周末,今天是一个休闲星期五,所以我想写一篇很好的反思文章,谈谈我将数据科学应用于财务自由的想法。抱歉,我的正常 peeps 想要一些编码样本。今天的文章会让人感觉像是在酒吧的壁炉前放松的谈话。所以,让我们打开流畅的爵士乐,开始吧。
只是一个侧栏,所有这些主题将特别集中在金融市场领域。利用数据科学赚钱的方式有很多,但金融市场是我自己赚钱的方式。另外,当我说系统时,我指的是一个投资策略或策略组合,它可以变成一个自动化的模型。
为什么找到盈利系统很难?
对于任何搜索过盈利系统的人来说,你通常会得到一大堆 X 保证,Y 系统会像这样工作:
一旦运行它,返回结果如下:
从数据科学的角度来看,我们会说系统是过度适应的。这意味着该模型只采用历史上看起来不错的交易,而没有捕捉到任何潜在的模式,可以为未来的使用而获利。
在我们的案例中,寻找有利可图的系统是很困难的,因为你必须发现一个没有多少人发现的低效率。如果每个人都找到了,那它就不会在那里了。但是我说的低效率是什么意思呢?
研究旧理论的价值
大多数熟悉金融领域的人都知道有效市场假说。但是回顾一下,有效市场假说认为资产的市场价格是完全定价的,所有市场参与者都知道所有信息。研究像有效市场假说这样的理论的价值在于了解为什么它们是错的。这样做,你会发现通向盈利系统的道路。在行为金融学开始占据主导地位之前,有效市场假说在过去是一个相当占主导地位的理论。我想,回想起来,这是有道理的。我的意思是交易市场很难,所以它一定是有效的。
失败是成功的前兆
市场在某种程度上是很难的,但我认为,就像生活中的所有事情一样,取决于你如何看待它。难只是基于你目前的技能水平对一项任务的主观评估。一旦你提高了技能,事情就会变得简单。我相信我们都有过比我们更高质量更快完成任务的同事。那来自专业知识,可以通过专注和时间获得。
对于那些更关注心态方面的人,这里有一篇关于我如何处理逆境的更深入的文章:https://towards data science . com/starting-out-data-science-never-coded-b 79 ed 985 e 661
记住,失败也没关系。我们都会犯错。这是挑战你极限的唯一方法。一旦你发现它们,你就克服它们并重复。对我来说,就是试图找到一个成功的投资系统,做我想做的事情。
成功是短暂的,但却是甜蜜的
在寻找一个成功的投资系统的过程中,我确实找到了一些。它们包括技术分析、10-K 和新闻报道的基础知识,以及更先进的机器学习技术。令我惊讶的是,一旦你知道如何研究,实际上有很多成功的系统。
请记住,这些系统中的大多数不会永远存在。例如,2015 年,我在研究欧元兑美元(一种外币资产)的技术分析系统。这是一个半公开论坛上的公开合作。该系统在几个月内运行良好,大约每月 10%。然后论坛稍微火了一点,系统就死了。这可能是太多人利用低效率的结果,或者是事件的根本原因因为另一个原因而被删除了。这是关于技术分析的事情,你几乎只是相信图表所做的一切,而没有任何潜在的经济原因。
至于基本系统,当它们是正确的时候,那是非常有趣的。有一天,你可以走进办公室,看到你所有的位置。你认为你是个天才。又一天,你发现你所有的仓位都下跌了,你觉得自己像个白痴。从积极的一面来看,你会有一个潜在的经济/金融原因来解释你的系统工作。
至于机器学习方面,这是我目前在私人投资组合中使用的东西。自动化最酷的地方是你可以做其他事情。假设你不是那种会强调你的投资状况的人,这是相当放松的。对于那些和交易者心理斗争的人,我推荐范萨普的书。
结论
对于那些想知道你是否还能利用数据科学在金融市场中赚取收入的人,答案是肯定的。但这需要你做大量的研究。大多数人不分享他们成功的交易系统的原因是大多数不会持续那么长时间,而且一些策略不会随着更大的资金而扩大。Scaling 用另一种方式解释说,如果太多人在同一个系统上操作,那么利润就会下降。如果我要从头再来一遍,我会开始:
- 学习数据科学/软件工程——通过系统决策和未来研究改进战略的客观审查
- 学习金融/经济学——理解为什么会发生变化
- 学会交易——帮助执行策略
从以上三点来看,我根据相对于行业内的难度对它们进行了分类。例如,与金融博士相比,大多数投资公司更倾向于统计学博士。只是实际的编码部分需要更多的时间来开发,而财务方面被认为是可以在过程中教授的东西。
总的来说,我建议那些对金融市场充满热情并喜欢独立研究的人成为一名定量/金融数据科学家。一旦你达到了财务独立的临界点,仅仅因为想在某个地方工作而不是必须在那里工作是很好的。唉,寻找更多策略的探索永无止境,因为市场总是在变化。为了保持领先,你必须随之改变。
另外,对于那些刚刚接触定量领域的人,我发现了一篇来自 Ross Ledhrman 的 Quora 帖子,这篇帖子可以给你一个好的方向:https://www . Quora . com/How-do-I-be-a-good-quant-What-technical-skills-I-should-I-learn-and-improve-if-I % E2 % 80% 99m-a-new-graduate
你最喜欢的投资风格有哪些?欢迎在下面留下任何问题或评论,我会在你身边!
免责声明:本文陈述的所有内容均为我个人观点,不代表任何雇主。投资有很大的风险,所有投资决定都要咨询你的投资顾问。
关于 NeurIPs 2019 的思考
机器学习何去何从?
我最喜欢的主题,个人想法,和新的研究领域。研究人员是否展现了与大型科技公司不同的一面?
Vancouver as a conference venue left me blown away. Has been perfect for me, let’s hope others agree.
我完全理解为什么这些天人们都涌向神经信息处理会议。当然,在 12 分钟内销售一空是个问题,但这里的展示展示了机器学习影响的巨大前景。我袖手旁观机器学习是我们可以用来超越许多全球问题的创新工具之一(我认为认为我们可以超越气候变化的想法有点天真)。
NeurIPs Society. Let’s hope they keep providing great events!
会议的亮点都在充满活力的推特社区上被追踪,呼吁最好的结果,并询问可疑时刻的问题。还有一个关于机器学习在技术和人文意义上的走向的实质性讨论。考虑到机器学习往往会在主流媒体上引起负面报道,这一事件真正传递给了一个试图为社会尽最大努力并检查他人的社区(如果更多的这种情况能够应用于同行评审系统,让许多人在这里)。
主题:研究人员真的同意海报呼吁更多的结果的可解释性
这里的研究人员强烈要求问责。我在深度强化学习研讨会上展示了一张关于“基于模型的强化学习中的目标不匹配”的海报,人们非常容易接受这样的观点,即我们对强化学习如何工作的一些潜在假设可能是有缺陷的。
Here’s my poster. Always happy to answer research questions, but don’t want to dive too far in on this post!
我还碰巧在谷歌的一位研究员旁边展示了我的海报,这位研究员正在推动 RL 算法中更多的可靠性指标。这意味着:当性能论文声称跨环境和随机种子的新“最先进”时,它们提出的一致性如何。这种现实的鲁棒性可能是让这些算法在实际应用中更有用的关键(例如机器人,我将一直把它作为 RL 的一个伟大的可解释平台)。
我们两张海报之间的重点评论来自 Oriol Vinyals (该领域非常著名的研究员),关于**如果我们将当前的 RL 基线与解决任务的人类进行比较会发生什么?**我们猜测人类会更快、更可靠地解决合理的任务——所以作为一个行业,我们还有大量的工作要做!
RL 可靠性度量标准库提供了一组度量标准来衡量强化学习的可靠性
github.com](https://github.com/google-research/rl-reliability-metrics)
此外,有很多研究人员质疑人们为什么会谈论敏感话题的例子。对抗我们领域危险趋势的地面力量是大公司注意到这一点的唯一方式。
Had the pleasure of exploring the skyline on a jog. Thanks to some great friends that eagerly entertained me wanting to chat on the phone while jogging. Peep the paddle boarder.
疯狂的新想法:用于健康应用的 RL
强化学习已经被证明是学习如何在结构化环境中行动的有效工具,那么我们如何利用它来改善健康呢?我和我的新朋友斯蒂芬妮·陈(来自神经科学领域的谷歌人工智能常驻人员)想出了将 RL 应用于实验室小鼠的想法,以检查不同的饮食、药物和活动模式。许多医学实验室使用老鼠作为人体实验的先驱,所以这是合乎逻辑的起点。我在考虑给伯克利的生物学学生发几封电子邮件,他们可能会疯狂到让我尝试一下。我加入是因为它将融合我对 RL 的专业兴趣和我对长寿和健康的个人热情。有什么想法吗?
当 RL 找到优化小鼠生物标记子集的最佳方法时,这个问题基本上就形成了。环境会有一系列的行为组合(饮食、活动和药物),回报要么是寿命(稀疏回报),要么是生物标记(更难分析的持续回报)。这能有多难?
A hideaway in Stanley Park — Beaver Lake is a drop into nature from city center, and the mayhem of a busy conference.
新领域:医疗保健联合学习
联合学习正在设计云中的系统,这些系统可以在中央服务器上合并私有数据(例如患者数据),以改善学习指标和结果(例如医学图像检测)。该领域的研究正应用于一个与网络安全和医疗系统密切相关的领域,这两个领域有时已经很难合作。
Friedman, Charles P., Adam K. Wong, and David Blumenthal. “Achieving a nationwide learning health system.” Science translational medicine 2.57 (2010): 57cm29–57cm29.
也就是说,联合学习成为标准将是巨大的。截至目前,由于隐私协议,大多数医院共享的数据少得惊人。谁不想让自己的扫描匿名地与计算机的全国数据库进行比较呢?它为医疗系统的人性化方面增加了安全、定量的分析。
我还要补充一点,创建一个通用的结构,让我们的数据能够 1)被用来帮助一个更大的系统,同时 2)不被我们的身份所束缚,这才是数据使用的正确方向。大多数公司一直在买卖我们的数据,因此能够在使用数据的同时维护隐私是一个巨大的胜利。
这是 Nvidia 今年早些时候关于联合学习的总结。
在任何领域,成为医学专家的关键是经验。知道如何解释症状,这…
blogs.nvidia.com](https://blogs.nvidia.com/blog/2019/10/13/what-is-federated-learning/)
联合学习在我看来是学习社区中一个非常有前途的方向。学习正在改变世界,因为它能够在数据集中建立联系,而联合学习是一个结构化的系统,可以将学习应用于大型社会规模的问题,这些问题以前由于缺乏基础设施而无法解决。
Views from the morning email desk. NeurIPs kept me appreciating the little things.
咖啡和自然。我非常喜欢在这里短暂的停留,我会回来的。
NuerIPs 2020?希望如此。
更多?订阅我关于机器人、人工智能和社会的时事通讯!
一个关于机器人和人工智能的博客,让它们对每个人都有益,以及即将到来的自动化浪潮…
robotic.substack.com](https://robotic.substack.com/)
对人工智能现状的思考:2018
人工智能领域关键发展的概述,重点关注关键参与者、应用、机遇和挑战
每天,讨论各种“与人工智能有关”的事情的多个新闻项目堆积在我们的邮箱中,每周都有几十篇(如果不是数百篇的话)文章、观点和综述在标题中包含“人工智能”一词。然而,并非所有声称与人工智能相关的东西实际上都是有意义的或相关的,相反,它们往往与该领域毫无关系。
为了使机器学习、神经网络和人工智能的其他领域的知识民主化,我们决定通过创建一系列专注的文章来展开我们的努力,这些文章将涵盖该领域的最新进展,看看关键人物,并提供一些对最有前途的技术的见解,以及该行业今天面临的机遇和困境。
在第一篇文章中,我们按照主要贡献者、应用和挑战对 2018 年的主要发展进行了简要概述。
今天,随着数百家公司深入人工智能领域,甚至更多的公司正在努力找出与该领域相关的战略,可能有点难以确定哪些特定公司最有可能在未来引领潮流。然而,如果我们看一下列出关键参与者的众多名单中的任何一个(例如,见这里的和这里的和和,5 家公司——谷歌、脸书、亚马逊、微软&IBM——不可避免地出现在所有名单上(其他几乎同样经常被提及的公司是苹果、腾讯&百度)。在本文中,我们将重点关注谷歌&微软,因为在 2018 年,这两家公司在人工智能领域的新闻中出现得最多;尽管如此,其余的科技巨头并没有少产,我们计划在下一篇关注技术最新进展的文章中更详细地介绍其中一些。
谷歌
Google Pixel: Night Sight capabilities demo from Google blog
对于谷歌在人工智能领域的努力来说,这是富有成效的一年,该公司推出的新产品数量以及对现有服务的一些关键改进都证明了这一点。
数量最多的公告来自谷歌 I/O,该公司在 5 月举行的年度开发者大会。除此之外,谷歌为 Gmail 推出了 Smart Compose,对谷歌地图进行了一些令人印象深刻的更新,或许最重要的是,宣布了其新的人工智能虚拟助手,称为谷歌双工(参见 2018 年谷歌 I/O 上介绍的所有新产品和功能的良好总结这里)。
用公司自己的话说:
【谷歌双工是】一种通过电话进行自然对话以完成“现实世界”任务的新技术。该技术旨在完成特定的任务,例如安排某些类型的约会。对于这样的任务,该系统使对话体验尽可能自然,允许人们正常说话,就像他们对另一个人说话一样,而不必适应机器。”
Duplex 给一家发廊打电话的录音令人印象深刻,甚至导致一些人质疑 Google Duplex 是否通过了图灵测试(提示:没有;至少,做出判断的人必须意识到她可能在和一台机器说话)。它还引发了一场激烈的讨论,即以这种方式使用技术,而不让接收端的人们意识到他们不是在与一个真实的人互动,而是在与一个机器人交谈,这是否合适。虽然可能很难明确回答这些问题,但我们可能很快就会看到更多这样的讨论,因为谷歌在 12 月开始在一些智能手机上推出 Duplex。
谷歌的另一个有趣的更新是智能手机 Pixel 系列的最新更新(Pixel 3 & 3 XL),它带有一些通过使用人工智能实现的真正令人印象深刻的新相机功能(我们将在本文后面专门讨论计算摄影进步的部分再次触及)。
最后,Alphabet Inc .全资拥有的 DeepMind Technologies 通过其 AlphaZero 程序的最新版本成功实现了一个重要的里程碑。
在 2015 & 2016 的围棋比赛中,我们已经看到了 AlphaGo 和 AlphaGo Zero 令人印象深刻的成就,当时它在与两位最强的围棋冠军比赛时轻松赢得了大多数比赛;然而,在 2018 年,DeepMind 的团队成功实现了更有趣的事情——最新的 AlphaZero 引擎展示了它在国际象棋、shogi 和 Go 中所有现有最强引擎中的明显优势。
AlphaZero 特别有趣的是,它在无需研究人类所玩游戏的任何日志的情况下,成功实现了这一壮举;相反,该程序自学了如何玩所有三个游戏,只提供了基本的规则。事实证明,通过摆脱从以前玩过的游戏中学习的限制,AlphaZero 采用了“一种突破性的、高度动态的和“非传统的”游戏风格”,这种风格与以往任何时候都不同。反过来,这使得引擎对社区更有用,社区可以通过观察机器开发的策略来学习新的策略。鉴于 AlphaZero 能够成功地从零开始学习并解决完美的信息问题,这也为这项技术在未来的现实应用创造了前景。
DeepMind 也在努力创建可以处理不完美信息问题的系统,正如它最近通过展示的 AlphaStar 在《星际争霸 2》中击败了一些职业玩家(而在过去,由于游戏的复杂性,人工智能一直难以成功地玩《星际争霸》)。
微软
Julia White, Corporate Vice President, Microsoft Azure Marketing, speaks at the Conversations on AI event in San Francisco. Photo by John Brecher for Microsoft
与谷歌类似,微软在 2018 年推出了新的人工智能相关产品和服务,并改进了一些底层技术。这项工作的一个重要部分是以社区为中心的,专注于为开发者提供更好的工具和功能,以在微软的云平台上构建人工智能解决方案。
有趣的是,微软名为“ Build 的重要开发者大会也将在 5 月举行,就像谷歌的一样。2018 年,对微软来说是一个拥挤的事件,该公司发布了大量新公告,特别是宣布项目脑波整合到 Azure 机器学习。
脑波项目(最初被称为弹射器)是 Bing 在 2010 年开始的数年研究的结果。脑波是 2017 年 8 月在顶级半导体会议之一的 Hot Chips 上向社区宣布的。简而言之,脑电波是一个 FPGA 芯片上的硬件平台,旨在加速实时人工智能计算,这是搜索引擎等服务的一个关键领域(这也解释了为什么这个项目从 Bing 中发展出来)。现在,随着脑波融入 Azure 的机器学习,微软声称 Azure 是 AI 最高效的云平台。
在去年 9 月在奥兰多举行的另一场大型会议 Ignite 上,微软发布了面向企业的 Cortana 技能工具包,这代表了一次在办公空间测试基于人工智能的助手的令人兴奋的尝试——想象一下你可以对机器人进行编程,使其能够为办公室安排清洁服务,或者在你简短的语音命令的指导下自动向服务台提交票证。
几天后,微软还宣布将实时翻译功能集成到 SwiftKey 中,这是微软在 2016 年收购的一款安卓键盘应用。最后,在 9 月底,继谷歌 Duplex 之后,微软发布了其语音服务工具,引入了改进的文本到语音合成功能。
11 月晚些时候,又有一系列有趣的公告,比如认知服务容器。认知服务允许开发人员在他们的应用程序中利用人工智能,而不需要他们成为数据科学专家,或者拥有广泛的人工智能相关知识。反过来,容器的故事集中在边缘计算的案例上——这个概念不需要将数据发送到云来执行计算,而是在本地处理,从而减少延迟,在许多情况下优化成本。有了容器中的认知服务,微软的客户现在可以构建在边缘位置运行人工智能的应用程序。
投资
Top 100 startups in AI, from CB Insights
人工智能领域的投资最近一直在蓬勃发展,尽管 Crunchbase 合理地呼吁,但很难估计有多少。CB Insights 已经建立了一个很好的人工智能空间的信息图表,并在这篇文章中按类别对顶级初创公司进行了分类。我们在这里看到两个主要的收获——首先,2018 年人工智能行业最大的几轮融资是由中国公司筹集的,如商汤科技和 Face++等(分别为 16 亿美元和 6 亿美元)。第二,在目前 11 家估值超过 200 亿美元的独角兽中,5 家公司来自中国,贡献了总估值的 50%,商汤科技以惊人的 45 亿美元估值领先。这强调了一个关键点:与其他国家相比,中国似乎正以更快的速度前进。此外,随着足迹越来越大,中国现在正成为人工智能领域的强国。(要了解更多细节,请查看这篇概述了当今世界各国正在推行的各种国家人工智能战略的摘要)。
道德、法规和教育
深刻的假货争议
AI-generated fake clips of President Obama’s speeches, from The Verge
2017 年 12 月,Motherboard 发表了一个故事,讲述了一个名为“deepfakes”的 Reddit 用户发布了一些硬核色情视频,这些视频将名人的脸映射到色情明星的身体上。虽然不完美,但这些视频相当可信,尤其是考虑到这些视频是由一个人制作的。尽管 Reddit 很快禁止了这些视频,但关于这项技术的合法性和潜在滥用的讨论从那时起就一直在升温。
通过交换演员的面部来制作假视频的技术已经存在了一段时间,但创作的容易程度和质量在 2018 年肯定达到了一个新的水平(见另一个例子,一个懂技术的用户可以实现什么这里)。制作虚假的色情视频虽然令人不安,但可能仍然相对无害,但正如我们最近看到的那样,同样的技术可以用来制造假新闻或制作虚假的宣传材料(或让巴拉克·奥巴马总统说他永远不会说的话,至少不会在公共场合说),这可能会对我们的社会产生严重的影响。对此能做些什么吗?这还有待观察,但事实是,深度赝品会一直存在,而且很可能只会变得更难与真品区分开来。
人工智能偏见
Photo from Microsoft’s blog post “Facial recognition: It’s time for action”
在过去几年中,监督和非监督学习方法都产生了一些令人兴奋的结果(DeepMind 的 AlphaZero 就是通过非监督学习实现的一个例子)。尽管如此,大量现实世界的应用程序需要基于标记数据的训练模型(顺便提一下,这是经常阻碍进一步发展的关键问题之一)。
然而,拥有一个由大量标记数据组成的数据集来训练模型并不等同于拥有一个好的数据集。你看,依赖监督学习的神经网络只和它们最初被训练的数据一样好,所以如果底层数据集有任何缺陷(例如以牺牲其他特征为代价专注于一个特征),神经网络有可能会拾取这些偏差并进一步放大它们。这在理论上听起来可能不太糟糕,但只有当我们考虑到现实世界应用中可能由此产生的问题时——正如我们在 2018 年看到的那样,这些问题可能会非常深远。
例如,在麻省理工学院媒体实验室的研究员 Joy Buolamwini 所做的研究中,她证明了微软、IBM 和旷视科技的领先人脸识别系统只错分了 1%的白人男性的性别,却错分了高达 35%的深色皮肤女性。原因?这些模型是在一个有偏见的数据集上训练的,该数据集包含更大比例的白人男性照片,因此在正确识别他们的性别方面越来越好。考虑到人脸识别技术现在越来越多地被执法部门使用,以及非裔美国人被挑选出来的可能性最大,因为他们在面部照片数据库中的比例失调,这种表现上的差异可能会产生非常重大的负面影响。
2018 年公开的同一问题的另一个著名例子是与亚马逊内部人工智能招聘工具相关的案件。亚马逊打算利用机器学习能力来实现更高效的招聘流程,并有可能完全自动化一些步骤。不幸的是,事实证明,上述工具是根据以前申请过该公司的人的简历进行培训的,其中大多数是男性。因此,该模型获得了这些偏见,并反过来训练自己降低女性候选人的等级,优先考虑“男性语言”等内容,以促进男性的申请。亚马逊最终放弃了这个工具,但还有很多其他公司试图利用人工智能来帮助招聘过程,他们的模型可能有类似的缺陷。
今天,越来越多的人(和公司)呼吁当局制定监管框架来管理人脸识别的使用。它会很快发生吗?这仍有待观察,但至少某种程度的监管可能即将到来。
优步的自动驾驶汽车在亚利桑那州撞死行人
Uber Volvo XC90 autonomous vehicle, image from MIT Technology Review article
不幸的是,在复杂、不确定的环境中运行时,即使是最伟大的技术也难免会偶尔出错。因此,2018 年 3 月 18 日,最终注定要发生的事情发生了,当时一辆属于优步的自动驾驶汽车在亚利桑那州坦佩市撞死了一名行人。这起事故迫使该公司暂停其无人驾驶汽车的所有测试,并重新检查其流程和技术;这也引发了关于自动驾驶汽车背后的技术现状的热烈讨论,以及如果自动驾驶汽车要在短期内获得公众的广泛接受,需要解决的道德和监管挑战。
九个月后,优步被允许在匹兹堡恢复其自动驾驶汽车测试,随后于 12 月在旧金山和多伦多进行测试,尽管在这些情况下,优步的自动驾驶汽车仍然被限制在“手动模式”(这意味着该公司将专注于将汽车软件暴露在新环境中,而不是进行主动测试)。为了再次赢得当局的好感,优步不得不同意对允许其自动驾驶汽车行驶的道路类型和条件进行额外限制。此外,优步不得不转向为司机提供更严格培训的系统(这是一个关键环节,因为对三月份发生的致命事故的调查表明,司机心不在焉,因此没有像他应该的那样注意路况),现在被称为“任务专家”。最后,该公司推出了第三方司机监控系统,并对其技术进行了额外的改进。
尽管如此,当谈到自动驾驶汽车时,我们似乎不太可能看到关于公共安全和必要监管的讨论结束;相反,优步的不幸事故只是助长了正在进行的辩论。我们会看到 2019 年将带给我们什么;然而,我们可以确定的一件事是,未来 2-3 年可能会被证明是塑造无人驾驶汽车主题公众舆论的关键。
对于那些对自动驾驶汽车的历史和现状感到好奇的人,我们建议查看《连线》杂志的这篇关于自动驾驶汽车的深度指南。
麻省理工学院投资 10 亿美元新建人工智能学院
Photo: MIT Dome, by Christopher Harting
2018 年 10 月 15 日,麻省理工学院宣布成立一所新学院,以黑石联合创始人兼首席执行官斯蒂芬·a·施瓦茨曼计算学院命名,他捐赠了 3.5 亿美元的基础捐款。新学院将专注于应对人工智能崛起带来的全球机遇和挑战。
麻省理工学院已经在该领域享有很高的声誉(更不用说它在人工智能领域的努力可以追溯到 20 世纪 50 年代末该领域的最初阶段)。然而,很难高估这一最新发展的重要性——例如,施瓦茨曼的礼物将允许创建额外的 50 个致力于人工智能研究的教师职位,有效地将麻省理工学院专注于计算和人工智能的研究人员数量增加一倍。
对跨学科合作的强调,以及对相关政策和道德的研究,以确保负责任地实施人工智能,在这里也值得一提——虽然我们已经看到了过去几年中建立的许多专注于这些主题的智库和研究倡议,但很高兴看到麻省理工学院的承诺,因为在这个问题上还有很多工作要做。
人工智能应用:计算摄影
Image generated by Prisma app, from Business Insider
从最广泛的意义上来说,计算摄影是人工智能在过去几年里带来了或许是最引人注目的进步的领域,至少从消费者的角度来看是如此。尽管如此,尽管过去几年在这一领域取得了很多进展(例如谷歌照片在 2015 年学会了如何自动标记和分类照片,或者 iPhone 7 在 2016 年获得了自动模糊人像模式下拍摄的照片背景的功能),但在 2018 年,我们已经看到了许多令人印象深刻的技术壮举,它们正在成为大规模产品。
像谷歌像素的夜视模式,或者 iPhone XS 和 XS Max 上的 T2 智能 HDR 功能,仅仅是通过使用机器智能而成为可能的一些例子。也许更有趣的是,这些新功能现在已经清楚地展示了人工智能的能力,使改进超越了摄像机的物理限制,从而使整个领域走上了一条新的令人兴奋的道路。因此,今天的计算摄影已经向那些熟悉人工智能领域其他进展的人和远离该领域的用户证明了它的价值。
计算摄影应用的另一个方面是当神经网络被用于使用算法完全重新制作图像,以调整输出,使其看起来像著名艺术家的作品,如梵高或莫奈(例如,参见 Prisma 应用)。类似的概念也用于机器视觉和福利的各个领域,例如无人驾驶汽车。
我们将在 Evolution One 的下一篇名为**“机器智能的关键近期发展”**的文章中涵盖更多具体技术,如大规模 GANs 和视频到视频合成,这些技术最近取得了重大进展,这是对当今一些最热门的人工智能领域的深入探讨,如自然语言处理和计算机视觉。
额外阅读:
一些不错的 AI 相关总结:
最初发表于evolution one . ai。
重新聚焦:使失焦的显微图像重新聚焦
Image source: https://www.thebisforboss.com/blog/2017/10/16/the-power-of-refocusing-resetting
显微图像广泛用于诊断各种疾病,例如感染和癌症。此外,它们促进了基础生物医学研究,这些研究不断产生对人类疾病原因的新见解。因此,显微图像对改善我们的健康非常重要。然而,获得高质量的聚焦显微镜图像是显微镜领域最大的挑战之一。例如,某些组织(如肺和肠)是不均匀的,会导致图像失焦。在这篇文章中,我们将通过使用深度学习来重新聚焦失焦的显微镜图像来解决这个问题。换句话说,我们将使用深度学习将失焦的显微镜图像变成对焦的图像(见下图)。
Left: out of focus. Right: in focus (Image source: https://data.broadinstitute.org/bbbc/BBBC006/)
数据
我们将使用Broad bio image Benchmark Collection 006(bbbc 006)图像集,该图像集是从一个 384 孔微孔板中获取的,该微孔板包含细胞核被 Hoechst 染色剂标记的人类细胞。为 768 个视场(384 个孔,每个孔 2 个视场)中的每一个拍摄 32 个图像的 z 叠置体(最佳焦平面处 z = 16,焦平面上方 15 个图像,下方 16 个图像)。
方法
总体策略是建立一个卷积神经网络,将离焦图像作为输入,生成聚焦图像作为输出。我们将把我们的神经网络建立在 U-net 架构上。此外,我们将使用特征损失(最初由 Johnson 等人称为感知损失)作为损失函数,以量化神经网络的输出与其在 z = 16 处的相应最佳焦平面图像或目标之间的差异。
优信网
U-net 最初是 Ronneberge 等人针对生物医学图像分割问题开发的。U-net 本质上由三个组件组成:减小图像尺寸的下采样路径、增大图像尺寸的后续上采样路径、以及将激活从下采样路径的所选部分转移到上采样路径中的相应部分的交叉连接。交叉连接用来自下采样路径的信息补充上采样路径,并且是使 U-net 表现如此好的主要发明。我们将使用在 ImageNet 上预训练的 ResNet -34 作为下采样路径,它利用了被称为迁移学习的技术。
U-net-based architecture (adapted from https://arxiv.org/pdf/1505.04597.pdf)
特征损失
特征损失有助于重建图像中的精细细节,非常适合于风格转移和超分辨率成像应用。如下图所示,特征损失的基本思想是将输出和目标放入同一个 ImageNet 模型中(在我们的例子中是 VGG -16),然后在选定的中间层而不是最终层比较它们的激活。
Feature Loss (adapted from https://arxiv.org/pdf/1603.08155.pdf)
使用 fastai 实现
我们的基于 U-net 的神经网络的实现只是使用如下所示的 fastai 库的一行代码。我们只需要提供数据、下采样架构(ResNet-34)、损失函数(特征损失)和一些附加参数。
U-net-based model in fastai
我们将使用杰瑞米·霍华德的特征损失的实现,如下所示:
Feature loss implementation by Jeremy Howard
培训和测试
我们将使用 z = 16 作为基本事实(y ),用在 z = 1(最差)、5(中间)和 10(接近焦点)的焦平面上方的失焦图像来训练我们的神经网络。我们将留出这些图像的一小部分作为验证集,并使用它们来指导和评估训练过程。训练后,我们将进一步评估模型在 z = 32 的焦平面下方的失焦图像上的性能。虽然两者都没有对焦,但焦平面上方或下方的图像看起来不同,因为它们到镜头的距离不同。因此,我们的策略将允许我们测试训练模型的可推广性。
结果
我们首先评估我们的模型在不同失焦水平的验证集上的性能。如下所示,该模型在区分模糊细胞方面做得很好,如果我们像预期的那样使用较少模糊的图像,性能会得到提高。
Model performance on the validation sets
接下来,我们在 z = 32 的测试集上检查了模型的性能。如下所示,模型生成的图像非常类似于 z = 16 时的最佳焦平面图像。因此,我们用焦平面上方的图像训练的模型在焦平面下方的图像上也表现良好。
Model performance on the test set at z = 32
总结和未来方向
总之,我们成功地建立了一个神经网络,可以重新聚焦模糊的失焦显微图像。这项工作提高了显微图像的质量,并将促进人类疾病的研究。由于计算能力有限,我只能处理非常小的图像(128*128)。理想情况下,神经网络应该能够处理整个幻灯片图像,可能是通过将它们分成小块。此外,神经网络应该能够处理具有不同染色的不同种类的显微图像。最后,我们可以将神经网络集成到采集平台中,以实时重新聚焦失焦图像,并消除采集后固定的需要。
感谢
我要感谢拉荷亚免疫学研究所(LJI)影像中心的 Paola Marcovecchio、Sara McArdle 和 Zbigniew Mikulski 博士的有益讨论。
利息集中区域
使物体检测更快更可行的技术。
从图像分类到目标检测的主要障碍是对网络的固定大小输入要求,因为存在完全连接的层。在对象检测中,每个提议将具有不同的形状。因此,需要将所有建议转换为完全连接的层所需的固定形状。投资回报池就是这样做的。
感兴趣区域(ROI)池用于将单一特征图用于 RPN 一次生成的所有提案。ROI pooling 解决了目标检测网络对图像大小要求固定的问题。
The entire image feeds a CNN model to detect RoI on the feature maps. Each region is separated using a RoI pooling layer and it feeds fully-connected layers. This vector is used by a softmax classifier to detect the object and by a linear regressor to modify the coordinates of the bounding box. Source: J. Xu’s Blog
ROI 合并通过对输入进行最大化合并,从非均匀输入中产生固定大小的特征图。输出通道的数量等于该层的输入通道的数量。ROI 池层接受两个输入:
- 从卷积神经网络经过多次卷积和汇集层后获得的特征图。
- n '来自区域提案网络的提案或感兴趣的区域。每个建议有五个值,第一个值表示索引,其余四个值是建议坐标。一般代表提案的左上角和右下角。
ROI pooling 从输入中提取每个 ROI,并提取对应于该 ROI 的输入特征图的一部分,并将该特征图部分转换为固定维度的图。每个 ROI 的 ROI 池的输出固定维度既不取决于输入特征图,也不取决于建议大小,它仅取决于层参数。
**Layer Parameters: pooled_width, pooled_height, spatial scale.**
Pooled_width 和 pooled_height 是超参数,可以根据手头的问题来决定。这些指示对应于建议的特征地图应划分成的格网数量。这将是该层的输出尺寸。让我们假设 W,H 是建议的宽度和高度,P_w,P_h 是宽度和高度的总和。然后,ROI 将被分成 P_w*P_h 个块,每个块的维数为(W/P_w,H/P_h)。
**bin_size_h = roi_height/pooled_height;
bin_size_w = roi_width/pooled_width;**
空间比例是用于根据特征地图尺寸调整提议大小的比例参数。假设在我们的网络中,图像大小为 1056x640,由于许多卷积和池化操作,特征图大小缩小到 66x40,由 ROI 池使用。现在,建议是基于输入图像大小生成的,因此我们需要将建议重新调整为要素地图大小。在这种情况下,我们可以将提案的所有维度除以 16 (1056/66=16 或 640/40=16)。因此,在我们的示例中,空间比例为 1/16。
**int roi_start_w = round(bottom_rois[1] * spatial_scale_);
int roi_start_h = round(bottom_rois[2] * spatial_scale_);
int roi_end_w = round(bottom_rois[3] * spatial_scale_);
int roi_end_h = round(bottom_rois[4] * spatial_scale_);**
现在我们对每个参数都有了清楚的了解,让我们看看 ROI pooling 是如何工作的。对于输入建议中的每个建议,我们取相应的特征地图部分,并将该部分分成由层参数定义的 WH 块。之后,取每个块的最大元素并复制到输出中。因此,对于每个 ROI 提议,输出大小为 P_wP_h,对于所有 N 个提议,输出大小为 NP_wP_h,这是一个固定维度的特征图,与输入提议的各种大小无关。
**Scaled_Proposals = Proposals * spatial_scale
for every ROI in Scaled_Proposals:
fmap_subset = feature_map[ROI] (Feature_map for that ROI)
Divide fmap_subset into P_wxP_h blocks (ex: 6*6 blocks)
Take the maximum element of each block and copy to output block**
下图说明了投资回报池层的向前传递。
credits: https://deepsense.ai/region-of-interest-pooling-explained/
ROI 汇集的主要优势在于,我们可以对所有提案使用相同的特征图,这使我们能够将整个图像传递给 CNN,而不是单独传递所有提案。
希望这有所帮助!谢谢大家!
参考文献:
- 吉斯克,罗斯。"快速 r-cnn "IEEE 计算机视觉国际会议论文集。2015.
- 《精确物体检测和语义分割的丰富特征层次》IEEE 计算机视觉和模式识别会议录。2014.
订阅 FOCUS——我的每周简讯,获取人工智能的最新更新和最新进展,以及来自机器学习媒体的精选故事。
区域提案网络—详细视图
什么是主播?RPN 如何从特征地图中学习生成盒子?它如何覆盖所有形状的盒子?
如果您知道用于对象检测的 R-CNN 家族,您可能听说过术语“RPN”,这是一个区域提议网络。如果你不知道 R-CNN 系列探测器,我建议你在深入研究 RPN 之前先浏览一下这篇文章。
我们都有一个模糊的想法,区域建议网络是用来产生建议的对象检测在更快的 rcnn。我们还听说,它通过从基础网络(VGG16、ResNet 等)获得的特征图进行学习来做到这一点。,).许多人都有这种模糊的想法,但很少有人彻底了解它是如何工作的。我以前有很多疑惑。RPN 如何从特征地图中学习生成盒子?它是如何用不同空间层次的特征图生成图像层次的盒子的?什么是主播?它如何覆盖所有形状的盒子?我的物件不会有遗失的盒子吗?它的召回率有多少?我的盒子很小怎么办?这是我曾经有过的一些疑问。浏览论文和许多博客已经澄清了一些疑问,然后我想通过代码实现来获得一个更清晰的想法,这很有帮助!让我们开始吧。
**目标检测方法:**我们生成候选框(可能有我们要检测的目标)并将这些框分类为像猫/狗/人等目标之一…那就是分类。同时,这些框形状调整学习正确地适合实际对象。这就是包围盒回归。
现在,第一步,即候选框的生成,是由 RPN 完成的。在早期版本的对象检测器中,这种提议生成是通过传统的计算机视觉技术离线进行的。一种这样的方法是选择性搜索。这些方法的缺点是计算成本和离线计算。
RPN 在很短的时间内就解决了这个问题,而且它可以合并到任何对象检测网络中,这使得它对于端到端的训练非常有用。就像我们的 CNN 如何从特征图中学习分类一样,它也从特征图中学习建议。让我记下 RPN 中的步骤:
- 生成锚定框。
- 对每个锚定框进行分类,无论它是前景还是背景。
- 了解锚定框的形状偏移,以使它们适合对象。
**锚点:**骨干网生成的特征图中的每一个点都是锚点。我们需要为每个锚点生成锚点框。我们使用两个参数生成候选框——比例和纵横比。方框需要在图像尺寸,而特征图根据主干缩小。例如,在 vgg16 的情况下,到主干的末端,图像被缩小 16 倍。那么我们如何在图像维度上生成盒子呢?我们使用这个 16 作为在图像级生成锚定框的步距。(例如:如果锚点比例为[8,16,32],比率为[0.5,1,2],跨距为 16,那么我们使用这些比例和比率的组合为每个锚点生成 9 个锚点框,然后在图像上跨距为 16,以获取下一个锚点框。)
Anchor boxes generation (Source)
These correspond to anchor points at image level. 16 and 8 are strides used depending on backbone. (Source)
现在我们已经生成了锚盒,但是这些是不同于实际感兴趣对象的虚拟盒。此外,可能有许多盒子里面没有任何对象。因此,我们需要了解给定的框是前景还是背景,同时我们需要了解前景框的偏移,以调整适应对象。这两个任务是通过从主干网获得的特征图上的两个卷积层来实现的。这些层是 rpn_cls_score 和 rpn_bbox_pred,架构如下所示。
For 9 anchors at every anchor point, 2 scores (fg and bg) and 4 offsets for coordinates. (Image by Author)
我们学习 x,y,w,h 值的偏移量,其中(x,y)是盒子的中心,w 和 h 是宽度和高度。我们知道这些补偿是回归。为了学习这些分数和偏移量,我们需要有目标。这些目标是通过将锚盒与地面真实盒进行比较而生成的。这个过程就是锚定目标生成。在锚目标生成中,我们使用锚框计算 GT 框的 IOU 以检查它是否是 fg/bg,然后计算坐标中的差作为回归器要学习的目标。然后这些目标被用作交叉熵损失和平滑 l1 损失的输入。
一旦使用卷积层学习了这些 fg/bg 分数和偏移,就根据置信度分数来考虑 fg 和 bg 框的一些部分。将偏移应用于这些框,以获得要进一步处理的实际 ROI。这种使用偏移的锚盒的后处理被称为建议生成。这些最终提案通过 ROI 池层和 fc 层向前传播。可以参考我之前的帖子了解一下 ROI pooling 和 NMS(非最大压制)。
这就是这篇文章的全部内容,希望你能很好地理解盒子是如何从 RPN 生成的。可以参考这个代码库来理解代码。让我们稍后在另一篇文章中见面吧。
参考
- https://www.mdpi.com/2072-4292/11/3/286
- https://www . research gate . net/publication/325385109 _ Yield _ Estimation _ using _ faster _ R-CNN
- https://arxiv.org/abs/1506.01497
回归:回归度量的解释和可能出错的地方
对 R 为什么为负感到困惑?阅读以下内容,了解更多信息。
(source)
机器学习正在不断发展,据说会影响所有领域,并给人类的运作方式带来根本性的变化。一些进步已经开始对社会产生影响,如欺诈检测系统、在线贷款审批系统、无人驾驶汽车、肿瘤检测等。机器学习算法已经成为我们日常生活的一部分,从早上的新闻推荐到晚上网飞的优化电影推荐,我们使用的一切都直接或间接受到或即将受到机器学习的影响。
机器学习基本上有两种类型,即监督学习和非监督学习。监督学习可以简单地理解为在老师的帮助下学习。这意味着我们有数据点以及每个数据点的标签。另一方面,无监督学习可以被认为是没有老师的学习。在这种情况下,我们只得到没有任何标签的原始数据,算法应该找到数据中的模式,并相应地对其进行分组。机器学习的大部分进展是在有监督的学习世界中实现的,而无监督的世界仍然是神秘的,没有被完全探索。
监督机器学习可以执行两个任务,即分类和回归。在非常高级的术语中,分类是将标签分配给属于不同类别的数据样本的任务,例如,对于训练,区分猫和狗的神经网络是一个分类问题,其中猫和狗是两个类别。
另一方面,回归是通过从各种独立特征中学习来预测连续值的任务。例如,基于像卧室数量、位置等特征来预测房子的价格。
基本分类或回归管道的工作方式如下:
- 我们从模型的一些初始配置开始,并基于一些输入来预测输出。
- 然后将预测值与目标值进行比较,并测量我们的模型性能。
- 然后,迭代地调整模型的各种参数,以便达到性能度量的最佳值。
对于不同的任务,恒定性能标准是不同的,并且努力达到标准的最佳值。在分类任务的情况下,性能标准可能是准确的,这意味着关于我们的模型看到的总案例,有多少案例被我们的模型正确分类。其他性能度量包括灵敏度(召回率)、特异性、精确度、f1 分数、AUC、均方误差、平均绝对误差、R、调整 R 等,并且根据任务和用于该任务的数据来使用。
在本文中,我们将讨论回归任务中使用的度量标准,以及 R 变为负值的原因。
回归任务是在其他相关独立变量的帮助下,预测某一特定时间点的结果变量的状态。与分类任务不同,回归任务输出给定范围内的连续值。
用于评估预测结果的各种指标包括:
- 均方误差
- 均方根误差(RMSE)。
- 平均绝对误差。
- r 或决定系数。
- 调整后 R
均方误差: MSE 或均方误差是回归任务最首选的指标之一。它只是目标值和回归模型预测值之间的平方差的平均值。当它计算差异的平方时,它惩罚了一个很小的错误,这个错误会导致高估模型的糟糕程度。它比其他指标更受青睐,因为它是可微分的,因此可以更好地优化。
Figure 1. Mean Squared Error Formula
均方根误差: RMSE 是回归任务中使用最广泛的指标,是目标值和模型预测值之间的平均平方差的平方根。在某些情况下,这种方法更为可取,因为在求平均值之前,首先对误差进行平方,这对于较大的误差来说是一种很高的惩罚。这意味着当不希望出现大误差时,RMSE 是有用的。
Figure 2. The formula of Root Mean Squared Error
平均绝对误差: MAE 是目标值与模型预测值的绝对差值。MAE 对异常值更稳健,并且不会像 mse 那样极端地惩罚误差。MAE 是一个线性分数,这意味着所有个体差异的权重相等。它不适合您希望更多关注异常值的应用程序。
Figure 3. The Formula of Mean Absolute Error
**R 误差:**决定系数或 R 是用于评估回归模型性能的另一个度量。该指标帮助我们将当前模型与恒定基线进行比较,并告诉我们我们的模型有多好。通过取数据的平均值并在平均值处画一条线来选择恒定基线。R 是一个无标度分数,这意味着值太大或太小都没有关系,R 将始终小于或等于 1。
Figure 4. The Formula for R²
调整后的 R : 调整后的 R 描绘了与 R 相同的含义,但却是它的改进。r 遇到的问题是,即使模型没有改进,分数也会随着术语的增加而提高,这可能会误导研究者。调整后的 R 总是低于 R,因为它对增加的预测因子进行了调整,并且只有在有真正的改善时才显示出改善
Figure 5. The Formula of Adjusted R²
R 为什么是负数?
在给你简单概述了各种回归度量之后,让我们最后来谈谈为什么 R 是负的。
人们有一种误解,认为 R 值的范围是从 0 到 1,但实际上,它的范围是从-∞到 1。由于这种误解,他们有时会害怕为什么 R 是负的,这在他们看来是不可能的。
R 为负的主要原因如下:
- R 为负的一个主要原因是所选择的模型没有遵循数据的趋势,导致 R 为负。这导致所选模型(分子)的 mse 大于恒定基线(分母)的 mse,从而导致负 R。
Figure 6.
2.也许数据中存在大量异常值,导致模型的 mse 大于基线的 mse,从而导致 R 为负(即分子大于分母)。
3.有时,在编写回归算法时,研究人员可能会忘记将截距添加到回归变量中,这也将导致 R 为负。这是因为,在没有截距的情况下,回归在跟踪因变量方面可能比样本均值(基线)更差(即分子可能大于分母)。然而,大多数标准的机器学习库,如 scikit-learn,默认情况下都包含截距,但如果您使用 stats-model 库,则必须手动添加截距。
个人经历:
最近,我在研究一个回归问题,我的模型是根据一个数据训练的,这个数据的因变量范围在 17-35 之间,但是这个范围在中间是不相交的。为了澄清,数据的值从 17-22,然后是一个断点,然后又从 29-33。如果我绘制数据,它会是下图所示的样子。
该模型在验证集上的 r2 _ 得分为 0.95。在模型被训练之后,我被要求在 17–22 和 29–33 之间的数据子集上测试模型的性能。该模型在每个子集上的表现都有一个负的 r2_score,我非常困惑,不知道自己哪里出错了。我在组合数据集上检查了模型的性能,它类似于验证集的性能,但是当我将测试数据分成子集并进行测试时,看到了负的 r2_score。然后在思考了很久,手工实现 r2_score 函数,并在计算的每个阶段打印输出之后,我才意识到问题的所在。
因此,让我们考虑一下 17–22 的情况,并找出 r2_score 为负的原因。如上所述,r2_score 表明了与均值估计量相比的模型的性能,即,采用因变量的均值并对所有条目进行预测的模型。在正常情况下,均值估计是一个糟糕的模型,是失败的。但是当我们把数据分成更小的子集时,均值估计实际上是一个很好的估计。例如,如果我们认为因变量的平均值是 17–22 子集的 19。现在,如果我们考虑我们的模型是根据整个范围的数据训练的,而不仅仅是 17-22,那么平均误差为 1,如果我们考虑 17-33 的整个范围,这是非常好的,但是如果我们将数据分成 17-22 的子集,平均误差为 1 可能比均值估计值更差,从而导致负 r2_score。当数据是 19–33 子集的一个子集时,也会观察到类似的情况。
结论:
在这篇文章中,我们发现了回归分析中使用的各种指标,并试图回答这个问题为什么 R 是负的?
我希望你喜欢这篇文章,并且学到了新的东西。如果您有任何疑问或想讨论,请随时通过 Linkedin 、 Twitter 或下面的回复部分联系我。
激励人心的名言:
"尽可能以最散漫、最不敬和最原始的方式努力学习你最感兴趣的东西."理查德·费曼
延伸阅读:
分析构建模块:预测
一款模块化笔记本电脑,可在控制面板中使用最少的编码来调整和比较 11 种预测算法
本文总结并解释了我的回归模块的关键模块(我正在开发的用于执行常见分析任务的简单模块化笔记本之一)。该笔记本旨在帮助对回归模型和 Python 编程有一定了解的用户更快地进行实验。GitHub 到笔记本的链接在文章底部!
介绍
在从事我最喜欢的一个项目时,我意识到有时测试不同的模型形式以确定最合适的模型更好,这种模型根据手头的问题提供了准确性、复杂性和执行效率的良好平衡。RapidMiner 等一些软件提供此功能。然而,出于这个目的使用软件产品会导致在调整模型和探索一些复杂性方面的黑盒方法。因此,我决定创建一个简单的 python 脚本,它具有足够的模块化和参数化,能够测试和调整许多广泛使用的预测算法,只需对代码进行最小的更改。
本笔记本摘要如下:
目标:
在 Python 中以最少的人工干预测试、调整和比较各种回归模型。
本模块包含的车型有:
*线性回归
*岭回归
*拉索回归
- K 近邻
*贝叶斯岭
*决策树回归
*随机森林
*装袋(默认使用决策树)
*梯度提升 - XGBoost
*支持向量机
用户熟练程度:
用户应该对每种算法的工作原理有一个直观的了解,并且很好地理解改变一个特定的超参数会如何影响结果。需要对 python 有基本的了解,以便能够有效地利用代码,并根据需求进一步定制代码。
关键可修改输入:
以下是关键输入(行内注释中为每个输入提供了更多详细信息)。这些部分在代码中以注释’突出显示,在此处进行修改’:
*用于回归分析的输入数据集:在本例中,我使用了来自 pandas 默认数据集的“糖尿病”数据集
*测试数据比例:在 0 到 1 之间,默认为 0.3(或 30%)
*归一化:0 —无归一化,1 —最小-最大缩放, 2 — Z-score scaling
*要测试的模型对象列表
*网格搜索的折叠数(超参数调整)
*确定最佳模型的评分标准(例如均方误差)—代码注释中提供了更多详细信息
- Flag 用于查看模型拟合期间终端上的详细程度:0 —无输出,1 —所有详细信息,2 —进度条
*超参数库:代码中的全局字典,为要调整的每个模型表单提供一组超参数
一般执行步骤:
获取这些输入后,对考虑中的每个模型形式的执行以下操作:
*正向特征选择
*标准化
*网格搜索超参数调整
*最佳模型的度量计算
输出:
创建 pandas 数据框架“结果”,为您测试的每个模型提供以下指标
*具有最佳超参数的模型细节
*训练和测试均方根误差
*训练和测试平均绝对百分比误差
该表有助于在各种模型形式之间进行比较,而训练和测试度量可以是发现过度拟合的良好指标。
重要提示:
该模块不以任何方式处理特征工程,仅基于输入数据执行特征选择。为了改善任何模型的结果,执行有效的特征工程是非常重要的。用户可能会观察到一种模型形式比另一种给出更好的结果,但是任何模型的整体性能都可以随着预测变量的改进而显著提高。
剧本:
各种任务的模块
第一个函数根据用户在控制面板中指定的条件,为标准化和网格搜索创建管道。
def create_pipeline(norm, model):
if norm == 1:
scale = StandardScaler()
pipe = Pipeline([('norm', scale), ('reg', model)])
elif norm == 2:
scale = MinMaxScaler()
pipe = Pipeline([('norm', scale), ('reg', model)])
else:
pipe = Pipeline([('reg', model)])
return pipe
第二个函数执行正向特征选择,并返回最佳特征的索引。
def select_features(model, X_train, Y_train, selection,
score_criteria, see_details, norm=0):
pipe = create_pipeline(norm, model)
sfs = SequentialFeatureSelector(pipe,
forward=selection,
k_features='best',
scoring=score_criteria,
verbose=see_details)
sfs = sfs.fit(X_train, Y_train)
return list(sfs.k_feature_idx_)
此函数对提供的参数网格执行网格搜索,并返回最佳模型对象。
def run_model(model, param_grid, X_train, Y_train,
X, Y, score_criteria, folds,
see_details, norm=0):
pipe = create_pipeline(norm, model)
model_grid = GridSearchCV(pipe,
param_grid,
cv=folds,
scoring=score_criteria,
verbose=see_details)
model_grid.fit(X_train, Y_train)return model_grid.best_estimator_
最后一个函数计算最佳超参数组合的所有相关指标,并返回这些指标的 pandas 系列。
def get_model_eval(model, X_train, Y_train, X_test, Y_test):
return pd.Series([model, mean_squared_error(Y_train, model.predict(X_train)),
mean_squared_error(Y_test, model.predict(X_test)),
(abs(model.predict(X_train) - Y_train) / Y_train).mean(),
(abs(model.predict(X_test) - Y_test) / Y_test).mean()])
全局超参数字典(在此修改)
这是该模块中所有模型的各种模型参数的全局字典。基于糖尿病数据集的典型范围的代码中已经填充了一些缺省值集。该词典包含每个模型的一些关键超参数,但并不详尽。鼓励用户访问 scikit-learn 文档以获得所有参数的列表,并根据他们的要求添加到下面的字典中。
PARAM_DICT = {
LinearRegression: {'reg__copy_X': [True, False],
'reg__fit_intercept': [True, False],
'reg__n_jobs': [10, 20]},
Ridge: {'reg__alpha': [0.1, 1, 100],
'reg__copy_X': [True, False],
'reg__fit_intercept': [True, False],
'reg__tol': [0.1, 1],
'reg__solver': ['auto', 'svd', 'cholesky', 'lsqr',
'sparse_cg', 'sag', 'saga']},
Lasso: {'reg__alpha': [0.1, 1, 100],
'reg__copy_X': [True, False],
'reg__fit_intercept': [True, False],
'reg__tol': [0.1, 1]},KNeighborsRegressor: {'reg__n_neighbors': [5, 30, 100]},
BayesianRidge: {'reg__alpha_1': [10**-6, 10**-3],
'reg__alpha_2': [10**-6, 10**-3],
'reg__copy_X': [True, False],
'reg__fit_intercept': [True, False],
'reg__lambda_1': [10**-6, 10**-3],
'reg__lambda_2': [10**-6, 10**-3],
'reg__n_iter': [300, 500, 1000],
'reg__tol': [0.001, 0.01, 0.1]},DecisionTreeRegressor: {'reg__max_depth': [5, 10, 20],
'reg__max_features': [0.3, 0.7, 1.0],
'reg__max_leaf_nodes': [10, 50, 100],
'reg__splitter': ['best', 'random']},BaggingRegressor: {
'reg__bootstrap': [True, False],
'reg__bootstrap_features': [True, False],
'reg__max_features': [0.3, 0.7, 1.0],
'reg__max_samples': [0.3, 0.7, 1.0],
'reg__n_estimators': [10, 50, 100]},
RandomForestRegressor: {'reg__bootstrap': [True, False],
'reg__max_depth': [5, 10, 20],
'reg__max_features': [0.3, 0.7, 1.0],
'reg__max_leaf_nodes': [10, 50, 100],
'reg__min_impurity_decrease': [0, 0.1, 0.2],
'reg__n_estimators': [10, 50, 100]},SVR: {'reg__C': [10**-3, 1, 1000],
'reg__kernel': ['linear', 'poly', 'rbf'],
'reg__shrinking': [True, False]},GradientBoostingRegressor: {'reg__learning_rate': [0.1, 0.2, 0.5],
'reg__loss': ['ls', 'lad', 'huber', 'quantile'],
'reg__max_depth': [10, 20, 50],
'reg__max_features': [0.5, 0.8, 1.0],
'reg__max_leaf_nodes': [10, 50, 100],
'reg__min_impurity_decrease': [0, 0.1, 0.2],
'reg__min_samples_leaf': [5, 10, 20],
'reg__min_samples_split': [5, 10, 20],
'reg__n_estimators': [10, 50, 100]},
XGBRegressor: {'reg__booster': ['gbtree', 'gblinear', 'dart'],
'reg__learning_rate': [0.2, 0.5, 0.8],
'reg__max_depth': [5, 10, 20],
'reg__n_estimators': [10, 50, 100],
'reg__reg_alpha': [0.1, 1, 10],
'reg__reg_lambda': [0.1, 1, 10],
'reg__subsample': [0.3, 0.5, 0.8]},}
按键输入的用户控制面板(在此进行修改)
可以在此处更改模块的输入。这是这个脚本的控制面板,介绍中提到的所有变量都可以在这里修改,以测试各种场景。请参考评论了解变量。
# --------------------------------------------------------------------------
# USER CONTROL PANEL, CHANGE THE VARIABLES, MODEL FORMS ETC. HERE# Read data here, define X (features) and Y (Target variable)
data = datasets.load_diabetes()
X = pd.DataFrame(data['data'])
X.columns = data['feature_names']
Y = data['target']# Specify size of test data (%)
size = 0.3# Set random seed for sampling consistency
random.seed(100)# Set type of normalization you want to perform
# 0 - No Normalization, 1 - Min-max scaling, 2 - Zscore scaling
norm = 0# Mention all model forms you want to run - Model Objects
to_run = [LinearRegression,
Ridge,
Lasso,
KNeighborsRegressor,
DecisionTreeRegressor,
BaggingRegressor,
SVR,
XGBRegressor]# Specify number of crossvalidation folds
folds = 5# Specify model selection criteria
# Possible values are:
# ‘explained_variance’
# ‘neg_mean_absolute_error’
# ‘neg_mean_squared_error’
# ‘neg_mean_squared_log_error’
# ‘neg_median_absolute_error’
# ‘r2’
score_criteria = 'neg_mean_absolute_error'# Specify details of terminal output you'd like to see
# 0 - No output, 1 - All details, 2 - Progress bar
# Outputs might vary based on individual functions
see_details = 1# --------------------------------------------------------------------------
模型执行
该部分迭代地为用户指定的每个模型找到最佳的超参数集,计算度量并填充结果表,用于进一步的分析/实验。
# Model execution part, resuts will be stored in the dataframe 'results'
# Best model can be selected based on these criteriaresults = pd.DataFrame(columns=['ModelForm', 'TrainRMSE', 'TestRMSE',
'TrainMAPE', 'TestMAPE'])X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=size)for model in to_run:
with warnings.catch_warnings():
warnings.simplefilter('ignore')
best_feat = select_features(model(), X_train, Y_train, True,
score_criteria, see_details, norm)
model = run_model(model(), PARAM_DICT[model],
X_train.iloc[:, best_feat],
Y_train,
X.iloc[:, best_feat], Y,
score_criteria, folds, see_details, norm)
stats = get_model_eval(model, X_train.iloc[:, best_feat], Y_train,
X_test.iloc[:, best_feat], Y_test)
stats.index = results.columns
results = results.append(stats, ignore_index=True)print(results)
结论
Results data frame
从结果表中可以看出,在该场景中测试的所有模型形式中,最基本的线性回归模型提供了最佳且一致的性能。这也强调了特征工程的重要性,因为我们期望集合模型总体上表现出更好的性能。另一方面,基于训练和测试指标,XGB 回归器显示出过度拟合的迹象。所有其他型号都提供类似的性能。这表明还需要测试不同范围的超参数。我希望这个模块能够加快实验速度,并提供一个机会,根据您的需求在它的基础上进行进一步的定制!
点击此处查看完整的笔记本:
在 GitHub 上创建一个帐户,为 himan Shu 0394/AnalyticsBuildingBlocks 开发做贡献。
github.com](https://github.com/himanshu0394/AnalyticsBuildingBlocks/blob/master/Prediction%20Block.ipynb)
请随时提供任何建议和反馈!
回归——用简单的术语解释!!
在这篇文章中,我希望用尽可能简单的术语来阐述回归,这样你就不会把它当成一个统计概念,而是一个更相关的经验。
回归——听起来很奇怪,但可以认为是任何两个事物之间的“关系”。例如,想象你呆在地面上,温度是华氏 70 度。你开始爬山,当你爬的时候,你意识到你感觉更冷,温度在下降。当你到达海拔 500 米的山顶时,你测量的温度是华氏 60 度。我们可以得出结论,海拔高度影响温度。因此,高度和温度之间是有关系的。这在统计学上被称为“回归”。温度取决于高度,因此是“因变量”,而高度是“自变量”。可能有各种因素影响温度,如湿度、压力,甚至空气污染水平等。所有这些因素都与温度有关,可以用数学方法写成一个方程。
回归的形式定义
任何方程,即因变量和一组权重的函数,称为回归函数。
y ~ f(x;w)其中“y”是因变量(在上述示例中为温度),“x”是自变量(湿度、压力等),“w”是方程的权重(x 项的系数)。
例如,等式可以是
y = 0.5 x1 + 2.15 x2 + 0.76 x3
其中 0.5、2.15 和 0.76 是等式的权重。这些权重将通过研究因变量和自变量之间的关系来学习。
回归方程怎么确定?
现在的问题是要弄清楚如何学习方程的权重。我们为什么要这么做?是的,我们这样做是为了预测未来。一旦我们知道了因变量和自变量之间的关系,我们就可以预先预测因变量。为了学习回归方程,我们需要从现场收集一些真实数据。我们人类从真实世界的经历中学习。类似地,回归函数只能通过初始真实数据(称为“训练”数据)来学习。
在所考虑的例子中,我们需要记录不同高度的温度、气压水平、湿度以及所有我们知道的影响因变量的因素。下面是一个数据集示例。
Example data for regression
和上表一样,我们需要收集尽可能多的真实数据。让我将“温度”表示为“y”,其余的特征(高度、压力、湿度)表示为“x”。我们将误差函数定义为(y-x*w)的和。即每个数据点的误差平方和。我们需要找出使上述函数最小化的“w”向量(逻辑上,不引起错误)。什么时候函数是数学上的最小值?这是方程斜率为 0 的地方。因此,我们可以通过将下面函数的斜率等于 0 来找到“w”向量,并求解“w”。
The objective function equation
“w” vector upon solving the equation
这篇文章并不打算在数学上做太多,然而,权重向量是由上面的等式得到的。使用我们收集的所有数据,我们通过上面的等式得到“w”向量。
我希望这篇文章对你有帮助。如果您有任何疑问,请在下面留下。
回归还是分类?线性还是逻辑?
理解不同之处和各自的不同模型
回归与分类
为了决定是使用回归模型还是分类模型,您应该问自己的第一个问题是:
你的目标变量是一个数量,一个二元范畴的概率,还是一个标签?
如果是前一种选择,那么你应该使用一个回归模型。这意味着,如果您试图预测身高、收入、价格或分数等数量,您应该使用将输出连续数字的模型。或者,如果目标是观察值成为二进制标签的概率(例如是好的而不是坏的概率),那么你也应该选择一个回归模型,只是你用的模型会略有不同。这些模型通过均方误差(MSE 或变异)和均方根误差(RMSE 或标准偏差)进行评估,以量化模型中的误差量。
如果是后一种选择,您希望使用一个分类模型。这种方法对于预测观察的标签(例如差、一般、好)。棘手的部分是有时意识到目标是否是一个标签。例如,如果目标是一个顺序变量,比如从 1 到 5 的离散排名,那么这些就是标签,但它们仍然具有数学意义。这意味着数据的平均值和变化仍然是有洞察力的,但是为了预测,你最好使用分类。这些模型是通过 F 分数或模型的准确性而不是变异和标准差来评估的。该分数给出了对有多少观察结果被正确标记的理解,并且可以用混淆矩阵来可视化,该混淆矩阵将观察结果分成真阳性/阴性和假阴性/阳性。
在开始运行模型和形成预测之前,理解目标变量的特征是很重要的。如果您在应该使用分类的时候使用回归,您将得到连续的预测而不是离散的标注,从而导致较低(如果不是零)的 F 值,因为大多数(如果不是全部)预测将不是您想要预测的 1 或 0。如果你使用的是给你概率的逻辑模型,一个解决方法是创建一个截止点。例如,也许你决定大于 0.9 的都是 1,小于 0 的都是 0。这样做,你仍然可以找到一个 F 值,并看到混淆矩阵。然而,这个额外的步骤通常可以通过使用适当的模型来避免。
一旦确定了使用哪种方法,下一步就是选择用于生成预测的模型。
Regression vs Classification visual
回归模型
在回归模型中,最流行的两个是线性和逻辑模型。
一个基本的线性模型遵循著名的公式 y=mx+b,但通常格式略有不同:
y=β₀+β₁x₁+…+βᵢxᵢ
其中,β₀是 y 轴截距,即所有解释变量都设置为零时的 y 值。β₁到βᵢ是变量 x₁到 xᵢ的系数,假设所有其他变量保持不变,变量 y 增加或减少一个单位。例如,如果等式是 y=1+2x₁+3x₂,那么如果 x₁从 0 增加到 1,而 x₂保持在 0,y 将从 1 增加到 3。
一个逻辑模型遵循一个稍微改变的等式:
y= 1 / (1+e^-(β₀+β₁x₁+…+βᵢxᵢ))
这将它限制为 0 到 1 之间的值。因此,它主要用于二进制目标变量,其中可能的值为 0 或 1,或者目标是二进制变量的概率。如前所述,该方程可以防止概率低于 0 或高于 1 的预测不合逻辑。
您可以改变这两种标准模型,以便更好地适应您的数据。做到这一点的主要方法是包括惩罚。对于线性和逻辑模型,创建的方程将包括你输入的每一个变量的*,这是一个使你的模型过度拟合的简单方法。过度拟合模型会降低模型在训练样本之外生成预测的有用性。为了避免这种情况,您可以执行一个特征选择过程来挑选出重要的特征,或者您可以在您的模型中包含惩罚。*
Underfitting and Overfitting visual
添加 L2 惩罚将进行岭回归,这将缩小不重要变量的系数以限制它们的重要性,但仍将包括所有输入的变量。如果您希望包含每个变量,而不管它有多重要,这是很有用的,但是在大多数情况下,您希望模型尽可能简单。相反,添加 L1 惩罚将进行套索回归(最小绝对收缩和选择算子),这将做与岭相同的事情,但如果不重要,将收缩系数到零,有效地移除它们。LASSO 的缺点是,如果你的变量(k)比观测值(n)多,它最多只会包含 n 个变量。此外,套索斗争与相关变量,并会随机选择其中一个保留。要克服这些障碍,您可以使用弹性网回归,它结合了两种损失,可以更好地处理高维数据和多重共线性。这通常会给出一个与 LASSO 同样准确或更准确的模型,但这取决于选择作为弹性网超参数之一的 L1 比率。
最后,目标变量可能不是解释变量的严格线性函数。这里,我们有两个主要选项:高阶回归或随机森林回归。
比方说,在进行初始数据探索时,您发现在预测收入时,年龄与收入的关系更多的是二次关系,而不是线性关系。在这种情况下,您希望在一次线性方程中包含一个二阶变量。然后它将看起来像 y=β₀+β₁x+β₂x,你将再次运行该模型。您仍然可以在高阶模型上运行线性回归。一个常见的误解是,线性回归方法只能创建线性函数。线性回归中的“线性”是指系数之间的关系,而不是变量本身,因此,如果高阶或交互作用有助于更好地解释这种关系,则在模型中包括高阶或交互作用是有利的。然而,如果你包括一个高阶变量或交互作用,你必须在你的最终方程中保留低阶变量和主要效应变量,无论它们是否显著。你不能拥有 y=β₀+β₂x 或 y=β₀+β₁x₁*x₂.
我们也可以使用一个随机森林回归器,它在下面被可视化了,但是稍后将会解释它的替代物,随机森林分类器,这是更常用的。回归器的使用类似于逻辑模型,其输出是二进制标签的概率。简而言之,随机森林回归器创建了数百个决策树,所有决策树都预测一个结果,最终输出要么是最常见的预测,要么是平均值。
Random Forest Classifier for Titanic Survival
现在你可能会想,难道这些模型都不能用于概率目标吗?如果训练集的 y 值为 0 到 1,模型将只预测从 0 到 1 的 y 值,对吗?嗯,是也不是。模型最有可能总是预测 0 到 1 之间的值,但如果模型是线性的,则超过 0 或 1 的值在概率的情况下是不合逻辑的。你可以在你的模型构建中付出 110%的努力,但是一个观察不可能有某个类别 110%的可能性。此外,线性模型意味着接受诊断的概率分别为 0.10 和 0.15 的人与接受诊断的概率分别为 0.95 和 1.0 的人之间存在相同的差异。显然,如果一个人 100%患有疾病,那么很可能还有其他原因没有在线性模型中得到解释,因为对于低于 0.50 的概率来说,这是一个无关紧要的特征。
分类模型
如果您的分析的目标是创建一个模型来预测一个观察的标签,那么您想要使用一个分类模型。最简单的模型还是一个逻辑模型。然而,通过创建目标虚拟变量并在每个变量上运行单独的逻辑模型,可以在非二进制目标变量上训练逻辑模型。您还可以将 L1 和 L2 惩罚添加到此逻辑模型中,以便进行套索和山脊逻辑模型。
然而,更有用的是随机森林分类器,它像随机森林回归器一样,可以包括可能只在特定点有意义的特征。重申一下,这种方法采用了决策树的概念,创建了一个随机森林,随机选择要包含的变量,然后基于森林输出预测。在用于运行该模型的代码中,您可以指定许多超参数,例如生成的树的数量、每片叶子的最小观察数量、最大分裂、树的最大深度等。所有这些超参数都有助于创建更精确的模型,但随机森林仍然可能会过拟合。如果你的树太大了,它们很可能太具体而不能应用于测试集。
Random Forest Classifier visual
最后,可以创建一个神经网络来预测一个观察的标签。这是最复杂的方法,但相对于前面的方法有一定的优势。主要是,它有机会进行无监督学习。这意味着,该算法可以根据它检测到的相似性对组进行聚类,而无需事先标记训练数据。尽管创建起来很复杂,但它们可以更准确地预测标签,这对于高风险预测(如疾病诊断或欺诈检测)非常重要。本质上,该算法接受一组输入,在其中找到模式和趋势,并输出预测(监督)或聚类组(非监督)。随着更多的迭代和更大的训练集,神经网络可以变得非常准确,但要小心,通过在网络中创建太多的层,使其过度适应您的训练集。
摘要
在选择用于预测的模型时,要考虑的最重要的事情是目标变量的特征。是连续的还是离散的?是数量还是标签?是一个范畴的概率吗?与所有解释变量线性相关吗?我希望所有这些变量都包含在它的预测中吗?这些问题的答案可以引导你为你的预测选择最好的模型。
资源
回归均值——苦涩的事实
My attempt to illustrate regression to the mean
想象一下这个场景:你是一家连锁百货商店的商业分析师。所有的商店在规模和商品选择上都是相似的,但是由于位置、竞争和随机因素,它们的销售额是不同的。您将获得 2018 年的结果,并被要求预测 2019 年的销售额。你被指示接受经济学家的总体预测,即销售额将总体增长 10%。你将如何完成下列数据?
商店— 2018 年销售额— 2019 年销售额
1—100 万美元—
2—1000 万美元—
3—200 万美元—
4—1500 万美元—
5—2000 万美元—2200 万美元
如果你的分析是基于每个商店的销售额增加 10%,你很可能是错的,但是…为什么?继续读下去。
上面的例子改编自马克斯·巴泽曼的《管理决策中的判断》一文,出现在丹尼尔·卡内曼的《思考快慢》一书第 17 章的最后一页。在这一章中,卡尼曼清楚地解释了什么是回归均值。
回归到均值是什么?
回归均值,简单来说就是极值分数回归均值分数的自然趋势。
在上面的例子中,预测每家商店的销售额为 10%是一个判断错误,因为您的预测需要是回归的(即,将 10%以上的销售额加到低绩效的分店,将更少的销售额加到(甚至减去)高绩效的分店)。这是因为由于所有商店的规模和商品选择都相似,但它们的销售额因位置、竞争和随机因素而有所不同,那些在 2018 年表现非常好的商店很可能在 2019 年的销售额增长低于其他商店,而那些表现非常差的商店很可能在 2019 年的销售额增长高于其他商店。
理解回归均值
引用卡尼曼的例子,想象一群患有抑郁症的儿童已经接受了八周的能量饮料治疗。一旦他们完成治疗,临床结果显示他们的抑郁状态有显著改善。
看了上面的案例,我们大多数人都倾向于在脑子里做出(无意识地)下面这个等式:
能量饮料→抑郁的孩子=改善
现在想象同样的例子,但是这次不是能量饮料,那些抑郁的孩子被治疗了八周,每天倒立 20 分钟。我敢肯定这一次(自觉你没有在你的头上做如下等式:
20 '倒立→抑郁的孩子=改善
痛苦的事实是,抑郁的孩子是一个极端的群体,就像商店里极端的销售数字一样,他们会自然地倾向于回归到他们的平均情绪状态。无论他们是喝酒还是倒立,这种情况都很有可能发生。
这些回归效应无处不在。尤其是在体育运动中,非常普遍。例如在足球比赛中,当那些倾向于赢得大部分比赛的球队经历三场连胜时,媒体开始声称他们正面临一场重大危机。然而,在几场比赛后,他们很可能会回到他们的平均连胜纪录。
The sports headline by the daily newspaper The Telegraph on 26 December 2018
为什么我们没有意识到回归均值以及这样做的巨大风险
我们经常在识别均值回归时遇到困难,因为我们的思维强烈倾向于因果解释。我们人类渴望相信我们检测到的一切背后都有因果关系(或想要检测到 t),比如:
能量饮料→抑郁儿童=改善
令人痛苦的事实是,我们太愿意相信这些影响大部分是随机的结果。如果没有,问问自己是否会买一份标题如下的体育报纸:
尽管该队遭遇了三场连胜,但他们很可能会回到平均胜率,因为他们经历了不幸的比赛,这是一个随机的问题。
我们中的大多数人不会买上面的标题,因为我们不想阅读,也不相信我们团队失败的后果=纯粹的随机性。相反,我们会找到一个因果解释,比如教练不合适,球员在如此多的胜利后变得懒惰。
此外,这些影响的后果超出了个人意识范围,就组织而言,例如,如果一家公司决定实施一项培训计划,通过花费大量的工资来培训其员工,目的是提高其不寻常的年的客户满意度,并且实际结果显示客户满意度有了显著的提高,经理们可能倾向于相信:
培训计划→员工绩效=客户满意度提高
痛苦的事实是,如果在培训计划中不包括对照组(即接受培训的员工和未接受培训的员工),对良好结果的因果解释可能是一个严重的缺陷,是回归均值的一个似是而非的结果。
如何更加意识到回归均值
这里有一些提示,以防读完这篇文章后你问自己,我如何才能更好地意识到我每天发现的关于回归均值的效应的随机性?
- 相关性不是因果关系
尽管两个变量可能存在某种关系,但这并不意味着一个是另一个的原因。
例如…
能量饮料 → 感觉沮丧=感觉更好
培训主动性 → 参加培训的员工= KPI 的提高
幸运袜 → 考试=通过 - 原始得分越极端,你越应该期待回归
极差销售 → 较好改善预期
一般销售 → 正常改善预期 - 接受随机性听起来很容易,但并不容易,试着意识到生活充满了随机性、运气和偶然性。学会处理。
参考
卡尼曼博士,思考快与慢。麦克米伦(2011)。
在 KC 住房数据集上使用 sklearn 进行回归
动机
为了预测 King County 的房价,我选择了来自 Kaggle 的房价数据集。该数据集包含 King 县(包括西雅图)的房屋销售价格。它包括 2014 年 5 月至 2015 年 5 月期间出售的房屋。它有很多学习的特点,数据集可以从这里下载。
介绍
回归的总体思路是考察两件事:(1)一组预测变量在预测一个结果(因变量)时是否做得很好?(2)哪些变量是结果变量的重要预测因子,它们是如何影响结果变量的——由β估计值的大小和符号表示?这些回归估计用于解释一个因变量和一个或多个自变量之间的关系。
执行的回归
简单线性回归
- 卧室与价格
- “等级”与“价格”
多元回归
- 卧室’,‘等级’,‘居住面积’,‘以上面积’
- ‘卧室’,‘浴室’,’ sqft_living ‘,’ sqft_lot ‘,‘楼层’,‘海滨’,‘景观’,‘等级’,’ sqft_above ‘,’ sqft _ baseball ‘,’ lat ‘,’ sqft_living15 ’
多项式回归
- 度数=2
- 度数=3
描述
在该数据集中,显示了西雅图金县房屋的销售价格。它包括 2014 年 5 月至 2015 年 5 月期间出售的房屋。在做任何事情之前,我们应该首先了解数据集,它包含什么,它的特征是什么,以及数据的结构是什么。
通过观察数据,我们可以知道价格取决于各种功能,如卧室(最依赖的功能)、浴室、sqft_living(第二重要的功能)、sqft_lot、地板等。价格也取决于房子所在的位置。像滨水景观这样的其他特色对价格的依赖性较小。在所有记录中,没有缺失值,这有助于我们创建更好的模型。
数据预处理
导入所需的库。
*#importing numpy and pandas, seaborn*
import numpy as np *#linear algebra*
import pandas as pd *#datapreprocessing, CSV file I/O*
import seaborn as sns *#for plotting graphs*
import matplotlib.pyplot as plt
阅读 CSV 文件。
df = pd.read_csv("../input/housesalesprediction/kc_house_data.csv")
pandas***data frame . info()函数用于获取数据帧的简明摘要。在对数据进行探索性分析时,这非常方便。为了快速浏览数据集,我们使用了data frame . info()***函数。
df.info()
Pandas head ()方法用于返回一个数据帧或系列的前 n(默认为 5)行。
df.head()
熊猫形状函数用于返回大小、形状以及数据帧和系列的尺寸。
*#finding no of rows and columns*
df.shape
调用 isnull()返回的 DataFrame 的 sum()将给出一个包含每列中 NaN 计数的数据的序列。
df.isnull().sum()
找出卧室的数量。
df['bedrooms'].value_counts()
寻找海滨的伯爵。
寻找分数。
df['grade'].value_counts()
寻找条件计数。
df['condition'].value_counts()
为卧室绘制了一个计数图。
sns.countplot(df.bedrooms,order=df['bedrooms'].value_counts().index)
sqft living 和价格之间绘制了一个柱状图,以了解价格随 sqft 的变化情况。
在上面的平方英尺和价格之间绘制一个柱状图,以观察价格如何随着上面的平方英尺而变化。
fig,axes=plt.subplots(nrows=1,ncols=1,figsize=(15,10))
plt.title("house prices by sqft_above")
plt.xlabel('sqft_above')
plt.ylabel('house prices')
plt.legend()
sns.barplot(x='sqft_above',y='price',data=df)
绘制了生活平方英尺的直方图。
plt.hist('sqft_living',data=df,bins=5)
为 sqft living 绘制了 distplot,以查看数据是否有偏差
fig,axes=plt.subplots(nrows=1,ncols=1,figsize=(15,10))
sns.distplot(df['sqft_living'],hist=True,kde=True,rug=False,label='sqft_living',norm_hist=True)
为上面的 sqft 绘制了 distplot,以查看数据是否有偏差
fig,axes=plt.subplots(nrows=1,ncols=1,figsize=(15,10))
sns.distplot(df['sqft_above'],hist=True,kde=True,rug=False,label='sqft_above',norm_hist=True)
寻找平方英尺生活的均值、众数和中位数。
print('Mean',round(df['sqft_living'].mean(),2))
print('Median',df['sqft_living'].median())
print('Mode',df['sqft_living'].mode()[0])
通过图表我们观察到 sqft living=1300 有更多的值。
len(df[df['sqft_living']==1300])
为了确保我们涵盖了所有的关系,我们使用热图绘制了所有特征之间的关联。
热图是数据的二维图形表示,矩阵中包含的各个值用颜色表示。
def correlation_heatmap(df1):
_,ax=plt.subplots(figsize=(15,10))
colormap=sns.diverging_palette(220,10,as_cmap=True)
sns.heatmap(df.corr(),annot=True,cmap=colormap)
correlation_heatmap(df)
既然我们已经获得了足够的数据信息,我们就开始线性回归。
简单线性回归
对于线性回归,我们使用来自 sklearn 函数的 linear_model。
Scikit-learn 通过 Python 中的一致接口提供了一系列监督和非监督学习算法。该库建立在 SciPy(科学 Python)之上,在使用 scikit-learn 之前必须安装该库。用于 SciPy care 的扩展或模块通常称为 SciKits 。因此,该模块提供了学习算法,并被命名为 scikit-learn。
我们导入train _ test _ split*。*这将数据分割成所需的比率(例如:80–20),其中一个比率用于训练数据,其余比率用于测试数据。训练数据以预测一条线,然后使用测试数据来查看这条线是否完全符合。
多项式特征 生成一个新的特征矩阵,由次数小于或等于指定次数的特征的所有多项式组合组成。
引入 度量 是因为度量模块实现了针对特定目的评估预测误差的功能。
在KNeighborsRegressor中,通过对训练集中最近邻相关的目标进行局部插值来预测目标。
from sklearn.model_selection import train_test_split
from sklearn import linear_model
from sklearn.neighbors import KNeighborsRegressor
from sklearn.preprocessing import PolynomialFeatures
from sklearn import metrics
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline
在这里,我们将数据分成 80:20 的比例,其中 train_size 为 80%,test_size 为 20%。 train_test_split 将数组或矩阵分割成随机训练和测试子集。这意味着每次在没有指定 random_state 的情况下运行它,都会得到不同的结果,这是意料之中的行为。为了得到相同的训练和测试子集,我们声明一个随机状态。这里的 x 是‘sqft _ living’,y 是‘price’。我们正在重塑 x_train 和 y_train,数据是拟合的。x 检验和 y 检验用于预测模型的准确性。这里我们首先计算 y_test 的均方误差。找出训练和测试的均方误差。找到直线的截距和系数。
train_data,test_data=train_test_split(df,train_size=0.8,random_state=3)
reg=linear_model.LinearRegression()
x_train=np.array(train_data['sqft_living']).reshape(-1,1)
y_train=np.array(train_data['price']).reshape(-1,1)
reg.fit(x_train,y_train)
x_test=np.array(test_data['sqft_living']).reshape(-1,1)
y_test=np.array(test_data['price']).reshape(-1,1)
pred=reg.predict(x_test)
print('linear model')
mean_squared_error=metrics.mean_squared_error(y_test,pred)
print('Sqaured mean error', round(np.sqrt(mean_squared_error),2))
print('R squared training',round(reg.score(x_train,y_train),3))
print('R sqaured testing',round(reg.score(x_test,y_test),3) )
print('intercept',reg.intercept_)
print('coefficient',reg.coef_)
R 平方检验:0.496
为 x_test,y_test 绘制了散点图。数据分布在图表上。现在绘制从上面获得的线,看看它如何适合数据。
_, ax = plt.subplots(figsize= (12, 10))
plt.scatter(x_test, y_test, color= 'darkgreen', label = 'data')
plt.plot(x_test, reg.predict(x_test), color='red', label= ' Predicted Regression line')
plt.xlabel('Living Space (sqft)')
plt.ylabel('price')
plt.legend()
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['right'].set_visible(False)
这里我们以 80:20 的比例分割数据,其中 train_size 为 80%,test_size 为 20%。这里 x 是‘等级’,y 是‘价格’。我们正在重塑 x_train 和 y_train,数据是拟合的。x 检验和 y 检验用于预测模型的准确性。这里我们首先计算 y_test 的均方误差。找出训练和测试的均方误差。找到直线的截距和系数。
train_data,test_data=train_test_split(df,train_size=0.8,random_state=3)
reg=linear_model.LinearRegression()
x_train=np.array(train_data['grade']).reshape(-1,1)
y_train=np.array(train_data['price']).reshape(-1,1)
reg.fit(x_train,y_train)
x_test=np.array(test_data['grade']).reshape(-1,1)
y_test=np.array(test_data['price']).reshape(-1,1)
pred=reg.predict(x_test)
print('linear model')
mean_squared_error=metrics.mean_squared_error(y_test,pred)
print('squared mean error',round(np.sqrt(mean_squared_error),2))
print('R squared training',round(reg.score(x_train,y_train),3))
print('R squared testing',round(reg.score(x_test,y_test),3))
print('intercept',reg.intercept_)
print('coeeficient',reg.coef_)
R 平方检验:0.46
多元线性回归
箱线图是根据“价格”绘制的“等级”、“卧室”和“浴室”。
fig,ax=plt.subplots(2,1,figsize=(15,10))
sns.boxplot(x=train_data['grade'],y=train_data['price'],ax=ax[0])
sns.boxplot(x=train_data['bedrooms'],y=train_data['price'],ax=ax[1])
_ , axes = plt.subplots(1, 1, figsize=(15,10))
sns.boxplot(x=train_data['bathrooms'],y=train_data['price'])
我们正在考虑的功能是’卧室’,‘品位’,‘平方英尺 _ 生活’和’平方英尺 _ 以上’。这些被认为是一个特征,即特征 1 。现在数据被拟合到模型中,并且特征 1 的测试数据被用于预测。计算 y_test 的均方误差。均方误差四舍五入到小数点后两位。计算训练和测试的 r 平方误差。计算直线的截距和单个特征的系数。
features1=['bedrooms','grade','sqft_living','sqft_above']
reg=linear_model.LinearRegression()
reg.fit(train_data[features1],train_data['price'])
pred=reg.predict(test_data[features1])
print('complex_model 1')
mean_squared_error=metrics.mean_squared_error(y_test,pred)
print('mean squared error(MSE)', round(np.sqrt(mean_squared_error),2))
print('R squared training',round(reg.score(train_data[features1],train_data['price']),3))
print('R squared training', round(reg.score(test_data[features1],test_data['price']),3))
print('Intercept: ', reg.intercept_)
print('Coefficient:', reg.coef_)
R 平方检验:0.555
我们正在考虑的功能是’卧室’,‘浴室’,’ sqft_living ‘,’ sqft_lot ‘,‘楼层’,‘海滨’,’ view ‘,’ grade ‘,’ sqft_above ‘,’ sqft _ baseball ‘,’ lat ‘,’ sqft_living15 '。这些被认为是一个特征,即特征 2 。现在数据被拟合到模型中,并且特征 2 的测试数据被用于预测。计算 y_test 的均方误差。均方误差四舍五入到小数点后两位。计算训练和测试的 r 平方误差。计算直线的截距和单个特征的系数。
features2 = ['bedrooms','bathrooms','sqft_living','sqft_lot','floors','waterfront','view','grade','sqft_above','sqft_basement','lat','sqft_living15']
reg= linear_model.LinearRegression()
reg.fit(train_data[features1],train_data['price'])
pred = reg.predict(test_data[features1])
print('Complex Model_2')
mean_squared_error = metrics.mean_squared_error(y_test, pred)
print('Mean Squared Error (MSE) ', round(np.sqrt(mean_squared_error), 2))
print('R-squared (training) ', round(reg.score(train_data[features1], train_data['price']), 3))
print('R-squared (testing) ', round(reg.score(test_data[features1], test_data['price']), 3))
print('Intercept: ', reg.intercept_)
print('Coefficient:', reg.coef_)
R 平方检验:0.672
多项式回归
多项式回归是线性回归的一种形式,其中自变量 x 和因变量 y 之间的关系被建模为 n 次多项式。多项式回归拟合 x 的值和 y 的相应条件均值之间的非线性关系,表示为 E(y |x)。
对于度=2,建立线性模型。计算均方误差,并为训练和测试找到 r 的平方。
polyfeat=PolynomialFeatures(degree=2)
xtrain_poly=polyfeat.fit_transform(train_data[features1])
xtest_poly=polyfeat.fit_transform(test_data[features1])
poly=linear_model.LinearRegression()
poly.fit(xtrain_poly,train_data['price'])
polypred=poly.predict(xtest_poly)
print('Complex Model_3')
mean_squared_error = metrics.mean_squared_error(test_data['price'], polypred)
print('Mean Squared Error (MSE) ', round(np.sqrt(mean_squared_error), 2))
print('R-squared (training) ', round(poly.score(xtrain_poly, train_data['price']), 3))
print('R-squared (testing) ', round(poly.score(xtest_poly, test_data['price']), 3))
R 平方检验:0.759
对于度数=3,建立线性模型。计算均方误差,并为训练和测试找到 r 的平方。
polyfeat=PolynomialFeatures(degree=3)
xtrain_poly=polyfeat.fit_transform(train_data[features1])
xtest_poly=polyfeat.fit_transform(test_data[features1])
poly=linear_model.LinearRegression()
poly.fit(xtrain_poly,train_data['price'])
polypred=poly.predict(xtest_poly)
print('complex model_4')
mean_squared_error=metrics.mean_squared_error(test_data['price'],polypred)
print('Mean Squared Error (MSE) ', round(np.sqrt(mean_squared_error), 2))
print('R-squared (training) ', round(poly.score(xtrain_poly, train_data['price']), 3))
print('R-squared (testing) ', round(poly.score(xtest_poly, test_data['price']), 3))
R 平方检验:0.664
观察
复杂模型 3 给我们的 R 平方(测试)分数为 0.759。从上述报告中,我们可以得出结论,次数=2 的多项式回归是最佳解决方案。
对于笔记本,请参见此处的。我将很高兴收到关于上述任何反馈或问题。
用正则化技术回归。
本文假设您对回归技术有一些简单的了解,这种技术可以从由统计方法实现的数据集中记录的分层和公平分布来预测所需的变量。开个玩笑!你所需要的是足够的数学知识来理解基本的图表。
进入正题之前,稍微温习一下…
**回归:**回归模型是一种统计程序,允许我们估计两个或更多变量之间的线性或多项式关系。它主要基于预测变量的显著变化对输出变量的改变量,基本上是变量之间的相关性。
回归可以分为:
- 线性回归
- 多项式回归
- 逻辑回归
- 里脊回归
- 套索回归
- 弹性网络回归
从这些回归技术中也有一些其他的衍生模型服务于一个特殊的需求。
本文主要关注正则化过度回归方法,以获得更准确的预测。
**正则化:**正则化是一个非常重要的概念,用于避免数据的过度拟合,尤其是当训练和测试数据变化很大时。
通过将“惩罚”项添加到从训练数据得出的最佳拟合中来实现正则化,以实现测试数据的较小方差,并通过压缩预测变量的系数来限制预测变量对输出变量的影响。
里脊回归
岭回归是一种通过向多线性回归模型添加偏差来实现的技术,以损失训练数据的准确性为代价,期望用测试数据进行更准确的回归。
多线性回归的最佳拟合线的一般方程为
y = β0 + β1x1 + β2x2 + βkxk
其中 y 是输出变量,x1,x2…xk 是预测变量。
岭回归的惩罚项是λ(斜率),其中λ表示通过限制预测变量的系数而偏离原始曲线的程度,但不会使它们为零。
因此,岭回归方程为
y = β0 + β1x1 + β2x2 + βkxk + λ(斜率)
Let us take consider an example by taking the salary_data dataset, the ridge regression-scatter plot using a lambda value of 100 is:
套索回归
套索回归与岭回归非常相似,但区别仅在于惩罚项。
lasso 回归的惩罚是λ|slope|。
Lesso 回归甚至可以通过使变量的系数为零来消除变量,从而消除与其他预测变量具有高协方差的变量。
套索回归的方程式是
y =β0+β1x1+β2 x2+βkxk+λ| slope |
Taking the same example for the lasso regression, the lasso regression-scatter plot using a lambda value of 10000 is:
用线性回归模型比较 lasso 和 ridge,我们得到:
注意:所有三个图必须通过一个点,即(x̄,ȳ),其中 x̄是预测变量的平均值,ȳ是输出变量的平均值。
Elasticnet 回归是岭回归和套索回归的一个更好的组合,能够在更大程度上消除过度拟合模型。
选择合适的λ值,模型可以正则化,精度可以达到。
正则表达式
Stanley Cole Kleene, 1978. Photograph by Konrad Jacobs, Erlangen. Copyright: MFO, https://opc.mfo.de/detail?
在计算机科学、数理逻辑和语言学中,正则表达式指的是提取和处理文本模式的技术集合。正则表达式有时被称为正则表达式,它是一组精确的字符,用来对目标文本中的字符组模式进行操作。例如,用户输入到微软 Word 中熟悉的find
和find and replace
功能中的文本作为正则表达式;查询的文本序列的每个文档实例被定位、突出显示、计数,然后被单独或成批处理。
在计算中,复杂的正则表达式技术提供了比那些在find
中使用的更复杂的功能。事实上,模式匹配正则表达式的理论是由美国数学家斯坦利·科尔·克莱尼——阿隆佐·邱奇的学生——在 20 世纪 50 年代初首次系统化的,这比现代编程的出现早了几十年。然而,20 世纪 70 年代 Unix 和 Unix 邻近操作系统的发展使得正则表达式无处不在。实现正则表达式的两个主要语法标准之一在当代编程语言中仍然存在:继承自 POSIX 的标准和继承自 Perl 的标准。
Perl 是 Python 内置re
模块的祖先。使用re
,Python 程序员可以编写以各种方式作用于字符串的字符串,而不是简单地将输入字符串中的单个字符与文本中的其他字符串进行元素匹配。其中,正则表达式搜索中最常用的技术之一叫做通配符。
>import re
>
>string = 'This is a wildcard.'
>x = re.findall('wil.*', string)
>
>print(x)['wildcard.']
通配符——有时称为占位符——在上面的代码中由字符对.*
表示。这个.*
指示解释器在目标文本中搜索它左边的任何字符,然后它右边的任何字符可以跟随它。在本例中,通配符的功能类似于 Bash 中文件搜索时的 tab 补全,它允许用户只键入文件的前几个字母,然后让 autocomplete 处理其余部分。在 SQL 中,通配符只是星号*
,前面没有.
。
>string = 'This is a wildcard.'
>x = re.findall('wil.', string)
>
>print(x)['wild']
如果我们删除*
但保留.
,单个通配符将表示在该位置允许任何一个字符。换句话说,.
将告诉解释器在目标文本中搜索它左边的字符序列,并打印它和紧随其后的下一个字符。正则表达式理论中的单个字符被称为原子。添加更多的.
原子字符将打印序列后面更多的字母。
>string = 'This is a wildcard.'
>x = re.findall('wil...', string)
>
>print(x)['wildca']
我们也可以在表达式中间使用通配符。
>string = 'This is a wildcard.'
>x = re.findall('wil....d', string)
>
>print(x)['wildcard']
通配符在正则表达式理论中被称为元字符,在re
中有很多这样的元字符。另一个特别有用的元字符允许我们搜索目标文本是否以正则表达式的开头。这个正则表达式用^
表示。其他元字符包括以$
、非此即彼|
结尾,以及特定数量的实例{}
。
>string = 'This is a wildcard.'
>x = re.findall('^This', string)
>
>print(x)['This']
除了元字符之外,re
还有大量的特殊字符、、,它们允许表达式对模式进行不同类型的检索或操作。这些特殊字符各由\
表示;这与该字符在 Python 字符串中的用法一致。这些特殊字符之一就是d
。d
返回目标文本中所有匹配的整数。
>string = '1These2are3not4numbers5.'
>x = re.findall('\d', string)
>
>print(x)['1', '2', '3', '4', '5']
与此相反,我们可以通过调用\D
返回所有非数字字符。
>string = '1These2are3not4numbers5.'
>x = re.findall('\D', string)
>
>print(x)['T', 'h', 'e', 's', 'e', 'a', 'r', 'e', 'n', 'o', 't', 'n', 'u', 'm', 'b', 'e', 'r', 's', '.']
我们也可以将正则表达式视为集合。这是通过将我们的表达式放在括号[]
中来实现的。下面,我们在目标文本中搜索表达式中的任何字符,并在每次匹配时返回该字符:
>string = 'I am looking for all five vowels.'
>x = re.findall('[aeiou]', string)
>
>print(x)['a', 'o', 'o', 'i', 'o', 'a', 'i', 'e', 'o', 'e']
与此相反,如果我们以^
开始表达式,那么集合的补集——正则表达式中除以外的任何字符——都将被打印出来。
>string = 'I am looking for all five vowels.'
>x = re.findall('[^aeiou]', string)
>
>print(x)['I', ' ', 'm', ' ', 'l', 'k', 'n', 'g', ' ', 'f', 'r', ' ', 'l', 'l', ' ', 'f', 'v', ' ', 'v', 'w', 'l', 's', '.']
使用连字符时,正则表达式将返回任何没有指定范围的小写字母的字符的匹配。
>string = 'I am looking for all five vowels.'
>x = re.findall('[a-l]', string)
>
>print(x)['a', 'l', 'k', 'i', 'g', 'f', 'a', 'l', 'l', 'f', 'i', 'e', 'e', 'l']
这里给出的每个例子都使用了findall()
方法。但是我们也可以split()
、sub()
、search()
、span()
、match()
、group()
。因此,这仅仅是对re
的一些概念基础的简单介绍。此外,Python 中的正则表达式超越了re
固有的功能。例如,一个流行的第三方包regex
提供了更多的正则表达式方法,并且向后兼容原生的re
。
第二部分:关于正则表达式您需要知道的一切
Python 和反斜杠瘟疫的简短教程。
假设你知道什么是正则表达式(如果你不知道,请查看本教程的第 1 部分以获得快速概述)我们现在将学习如何在 Python 中使用它们。😃
“re”模块为正则表达式引擎提供了一个接口,并允许我们将 re 编译成对象,然后对它们执行匹配。
我们将从导入模块开始。然后,我们将通过将正则表达式作为字符串传递来组合它,并将其转换为模式对象。
>>> import re
>>> pat_obj = re.compile('[a-z]+')
>>> print(pat_obj)
re.compile('[a-z]+')
如何处理模式对象?
- match(): 判断 RE 是否匹配字符串的开头。
>>> m = pat_obj.match('helloworld')
>>> print(m)
*<_sre.SRE_Match object; span=(0, 10), match='helloworld'>***#Note how it doesn't take into account white spaces.**
>>> m = pat_obj.match('hello world')
>>> print(m)
*<_sre.SRE_Match object; span=(0, 5), match='hello'>***# Note that it is case-sensitive.**
>>> m = pat_obj.match('Helloworld')
>>> print(m)
*None***#To ignore case** >>> pat_obj = re.compile('[a-z]+', re.IGNORECASE)
>>> m = pat_obj.match('Helloworld')
>>> print(m)
*<_sre.SRE_Match object; span=(0, 10), match='Helloworld'>*
- search(): 扫描一个字符串,寻找这个 re 匹配的任何位置。
**#Note how it only prints the first match**
>>> s = pat_obj.search('Hello World!')
>>> print(s)
*<_sre.SRE_Match object; span=(1, 5), match='ello'>*
- 要打印所有匹配项,
findall(): 查找 re 匹配的所有子字符串,并将它们作为一个列表返回。
>>> s = pat_obj.findall('Hello World!')
>>> print(s)
*<_sre.SRE_Match object; span=(1, 5), match='ello'>
['ello', 'orld']***#To find all the numbers in a string**
>>>pat_obj_num = re.compile(r'\d+')
>>> pat_obj_num.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping')
*['12', '11', '10']*
- group(): 返回 RE 匹配的字符串。因为说实话,这才是你感兴趣的。没人有时间听这些信息。
**#Using group with search**
>>> s = pat_obj.search('Hello World!')
>>> print(s)
*<_sre.SRE_Match object; span=(1, 5), match='ello'>* >>> print(s.group())
*ello***#Using group with match**
>>> m = pat_obj.match("hello world")
>>> print(m)
*<_sre.SRE_Match object; span=(0, 5), match='hello'>* >>> print(m.group()) *hello***#Using group with findall** >>> m = pat_obj.findall("hello world")
>>> print(m)
*['hello', 'world']* >>> print(m.group()) *Error!*
- span(): 返回一个包含匹配(开始,结束)位置的元组。
start(),end(): 分别返回匹配的开始和结束位置。
>>> pat_obj = re.compile('[a-z]+', re.IGNORECASE)
>>> m = pat_obj.match('Helloworld')
>>> print(m)
*<_sre.SRE_Match object; span=(0, 10), match='Helloworld'>*
>>> print(m.start())
*0* >>> print(m.end())
*10*
>>> print(m.span())
*(0, 10)*
分组
Photo by Jeffrey F Lin on Unsplash
组由()元字符标记。它们将包含在其中的表达式组合在一起,您可以使用重复限定符重复组的内容,例如*、+、?或者{m,n}。
组从 0 开始编号。组 0 始终存在;这是整个 RE,所以 match 对象方法都将 group 0 作为它们的默认参数。
子组从左到右,从 1 向上编号。组可以嵌套;要确定数字,只需从左到右计算左括号中的字符。
>>> pat_obj_group = re.compile('(a(b)c(d))e')
>>> m = pat_obj_group.match('abcde')
>>> print(m)
*<_sre.SRE_Match object; span=(0, 5), match='abcde'>* ***#Note m.group(0) matches the same regex as m.match()*** >>> print(m.group(0))
*abcde*
>>> print(m.group(1))
*abcd* ***#Note the number is determined left to right*** >>> print(m.group(2))
*b**>>> print(m.group(3))
d* ***# Note that multiple arguments can be passes to group()*** >>> print(m.group(2,1,3))
*('b', 'abcd', 'd')*
- groups(): 返回一个包含所有子组字符串的元组,从 1 到所有子组。
>>> print(m.groups())
*('abcd', 'b', 'd')*
代替
sub(): 返回用替换 repl 替换字符串中模式最左边不重叠出现的字符串。如果没有找到该模式,则返回不变的字符串。
repl 可以是字符串,也可以是函数;如果它是一个字符串,其中的任何反斜杠转义都会被处理。也就是说,\n 被转换为单个换行符,\r 被转换为回车符,依此类推。
模式的空匹配只有在不与先前的空匹配相邻时才被替换。
>>> print(re.sub('x','-','abxd'))
*ab-d*
>>> print(re.sub('ab*','-','abxd'))
*-xd*
>>> print(re.sub('x*','-','abxd'))
*-a-b-d-*
可选参数 count 是要替换的模式出现的最大数量;计数必须为非负整数。如果省略或为零,将替换所有出现的内容。
反斜杠瘟疫
Photo by Aarón Blanco Tejedor on Unsplash
尽管传递正则表达式有助于保持简单,但它有一个缺点。反斜杠字符(“\”)用于允许使用特殊字符而不调用它们的特殊含义,这与 Python 在字符串文字中使用相同字符的用法相冲突,在字符串文字中使用反斜杠字符以不同方式解释后面的字符。
例如,“n”本身只是一个字母,但是当你在它前面加一个反斜杠时,它就变成了\n,这是换行符。啊哦!
假设您想要编写一个匹配字符串’\ section【T6]‘的 RE,这个字符串可能在 LaTeX 文件中找到。
我们将从想要匹配的字符串开始。接下来,我们必须通过在反斜杠前面加上反斜杠来转义任何反斜杠和其他元字符,从而得到字符串’ \section ‘。必须传递给 re.compil()的结果字符串必须是’ \section '。然而,要将其表示为 Python 字符串文字,必须再次对两个反斜杠进行转义,导致字符串“ \\section ”。
简而言之,要匹配一个文字反斜杠,必须将’ \\ '写成 RE 字符串,因为正则表达式必须是\,并且每个反斜杠必须在一个常规 Python 字符串文字中表示为\。
Source: XKCD
解决方案是对正则表达式使用 Python 的原始字符串表示法;在以’ r ‘为前缀的字符串文字中,不会以任何特殊方式处理反斜杠,因此 r’\n ‘是包含’ \ ‘和’ n ‘的双字符字符串,而’ \n '是包含换行符的单字符字符串。
常规字符串和相应的原始字符串
"ab*" -> r"ab*""\\\\section" -> r"\\section""\\w+\\s+\\1" -> r"\w+\s+\1"
学习正则表达式的有趣工具和资源
我写的其他文章,我认为你可能会喜欢:D
- 8 分钟内学会 Git!
我很高兴你坚持到了这篇文章的结尾。🎉我希望你的阅读体验和我写这篇文章时一样丰富。💖
请点击查看我的其他文章。
如果你想联系我,我会选择推特。
关于正则表达式你需要知道的
我的常用备忘单。
第一部分:揭开正则表达式的神秘面纱
Source: XKCD
什么是正则表达式,为什么你应该知道它们?
正则表达式是一种用字符序列匹配模式的通用方法。它们定义了一个搜索模式,主要用于字符串的模式匹配或字符串匹配,即“查找和替换”之类的操作。
假设你要搜索一个语料库,并返回其中提到的所有电子邮件地址。对于一个人来说,这是一个非常简单的任务,因为每个电子邮件地址都可以概括为一个字母数字字符串,其中包含一些允许的特殊字符,如。(点)、_(下划线)、-(连字符),后面跟一个’ @ {域名}。’ com '。
但是如何将这样的模板传递给计算机呢?电子邮件地址可以是可变长度的,没有固定的数字/特殊字符位置(可以在开头、结尾或中间的任何位置),这一事实并没有使计算机的任务变得更容易。
这就是正则表达式帮助我们的地方!通过使用它们,我们可以很容易地创建一个通用的模板,它不仅能被计算机理解,还能满足我们所有的限制。
Source: XKCD
正则表达式这个术语是从哪里来的?
正则表达式这个术语来源于数学和计算机科学理论,在这里它反映了数学表达式的一个特质叫做 正则性 。最早的 grep 工具使用的文本模式是数学意义上的正则表达式。虽然这个名字已经被记住,但是现代的 Perl 风格的正则表达式(我们仍然在其他编程语言中使用)在数学意义上根本不是正则表达式。
它们通常被称为 REs ,或正则表达式,或正则表达式模式。
如何写正则表达式?
基础知识:
#1 :大部分角色与自己匹配。因此,如果您必须为单词“wubbalubadubdub”编写正则表达式,那么它的正则表达式应该是“wubbalubadubdub”。请记住,REs 是区分大小写的。
但是有一些名为 的元字符 与它们本身并不匹配,而是表示一些不寻常的东西应该匹配,或者它们通过重复它们或改变它们的意思来影响 re 的其他部分。这些元字符使正则表达式成为强大的工具。
#2 : 复读机,+,{}* 。很多时候你会遇到这样的情况,你不知道一个字符会重复多少次,或者是否会重复。复读机让我们能够处理这种情况。
星号(*): 表示前面的字符出现 0 次或更多次。前面字符的出现次数没有上限。
In ‘a*b’, ‘a’ precedes the *, which means ‘a’ can occur 0/0+ times. So it will match to ‘b’, ‘ab’, ‘aab’, ‘aaab’, ‘aa..(infinite a’s)..b’.
加号(+): 与*相同,但暗示前面的字符至少出现一次。
‘a+b’ will match to ‘ab’, ‘aab’, ‘aaab’, ‘aaa…aab’ but not just ‘b’.
花括号{} :用于定义前一个字符出现的范围。
‘a{3},b’: will match ‘aaab’ only.
‘a{min,}b’: restricting minimum occurrences of ‘a’, no upper limit restrictions.
‘a{3,}b’ will match ‘aaab’, ‘aaaab’, ‘aaa…aab’.
‘a{min, max}b’: ‘a’ should occur at least min times and at most max times. ‘a{3,5}b’ will match ‘aaab’, ‘aaaab’, ‘aaaaab’.
#3 通配符(。):知道字符串中字符的顺序并不总是可行的。在这些情况下,通配符非常有用。
这意味着任何字符都可以在序列中占据它的位置。
‘.’ will match all strings with just one character.
‘.*’ will match all possible strings of any length.
‘a.b’ will match ‘aab’, ‘abb’, ‘acb’, ‘adb’, …. ‘a b’ [a(space)b], ‘a/b’ and so on. Basically, any sequence of length 3 starting with ‘a’ and ending with ‘b’.
**#4 可选字符(?)😗*有时候一个词可能有多种变体。就像“color”(美国英语)和“color”(英国英语)是同一个单词的不同拼法,都是正确的,唯一的区别是在英国版本中多了一个“u”。
那个“?”意味着前一个字符可能出现在最终字符串中,也可能不出现。在某种程度上,'?'意味着出现 0 或 1 次。
‘colou?r’ will match both ‘color’ and ‘colour’.
‘docx?’ will match both ‘doc’ and ‘docx’.
Caret(^):暗示一个字符串的第一个字符。
‘^a.*’ will match all strings starting with ‘a’.
‘^a{2}.*’ will match all strings starting with ‘aa’.
#6 美元($): 它暗示一个字符串的最后一个字符。
‘.*b$’ will match all strings ending with a ‘b’.
#7 字符类([]) :通常情况下,对于一个字符串中的一个特定位置,会有不止一个可能的字符。为了容纳所有可能的字符,我们使用字符类。它们指定了您希望匹配的一组字符。字符可以单独列出,也可以通过给出两个字符并用’-'分隔来表示一个字符范围。
‘[abc]’: will match ‘a’, ‘b’, or ‘c’.
‘[^abc]’:*Negation* will match any character except ‘a’, ‘b’, and ‘c’. **Note** -- Not to be confused with caret where ^ implies begins with. If inside a character class ^ implies negation.
Character range: ‘[a-zA-Z]’ will match any character from a-z or A-Z.
\d
匹配任意十进制数字;这相当于类[0–9]。
\D
匹配任何非数字字符;这相当于类[^0–9].
\s
匹配任何空白字符;这相当于类[\t\n\r\f\v]。
\S
匹配任何非空白字符;这相当于 class[^\t\n\r\f\v].
\w
匹配任何字母数字字符;这相当于类[a-zA-Z0–9]。
\W
匹配任何非字母数字字符;这相当于类[^a-za-z0–9].
**#9 分组字符:**正则表达式的一组不同符号可以组合在一起,作为一个单元,表现为一个块,为此,需要将正则表达式括在括号( )中。
‘(ab)+’ will match ‘ab’, ‘abab’,’abab…’.
‘^(th).*” will match all string starting with ‘th’.
#10 竖线(| ): 匹配由(|)分隔的任何一个元素。
th(e|is|at) will match words - the, this and that.
#11 转义符(): 如果你想匹配一个元字符本身,也就是匹配’ * ‘和’ * '而不使用通配符,该怎么办?
你可以在这个字符前加一个反斜杠()来实现。这将允许使用特殊字符而不调用它们的特殊含义。
\d+[\+-x\*]\d+ will match patterns like "2+2" and "3*9" in "(2+2)*3*9".
为电子邮件地址编写正则表达式
为了为任何电子邮件地址编写正则表达式,我们需要记住以下约束:
- 它只能以字母开头。【^([a-za-z】)
- 它的长度可变,可以包含任何字母数字字符和“.”, ‘_’, ‘-’.(【a-zA-Z0–9 _ -\。])*
- 它应该有一个“@”后跟一个域名。@([a-zA-Z0–9 _ -\。]+)
- 它应该以点号结尾,通常有 2/3 字符长。
。([a-zA-Z]){2,3 } $
我们最后一个电子邮件地址的正则表达式:
^([a-za-z])([a-za-z0–9_-.]*)@([a-zA-Z0–9 _ -\。]+).([a-zA-Z]){2,3}$
正则表达式的实际应用
正则表达式在各种各样的文本处理任务中非常有用,更普遍的是在数据不需要是文本的字符串处理中非常有用。常见的应用包括数据验证、数据抓取(尤其是 web 抓取)、数据争论、简单解析、生成语法突出显示系统以及许多其他任务。
虽然正则表达式在互联网搜索引擎上很有用,但是根据正则表达式的复杂性和设计,在整个数据库中处理它们会消耗过多的计算机资源。尽管在许多情况下,系统管理员可以在内部运行基于正则表达式的查询,但大多数搜索引擎并不向公众提供正则表达式支持。
进一步阅读:
本教程的第 2 部分到此为止,我们在 python 中通过他们的 re 模块使用 REs。还讨论了编写正则表达式时面临的一些复杂问题,即“反冲瘟疫”。那里见!👋
参考资料:
- 维基百科:正则表达式
- 极客 forgeeks
- Python 文档
- Steven Levithan,Jan Goyvaerts 的正则表达式食谱
我写的其他文章,我认为你可能会喜欢:D
我很高兴你坚持到了这篇文章的结尾。🎉
我希望你的阅读体验和我写这篇文章时一样丰富。💖请点击这里查看我的其他文章。
如果你想联系我,我会选择 Twitter。
正则化和几何
一、偏倚-方差权衡
当我们执行统计建模时,目标不是选择适合所有训练数据点的模型并获得训练数据的最小误差。目标是让模型能够很好地概括新的和看不见的数据。
Bias and variance contributing to generalization error [1]
随着越来越多的参数被添加到模型中,模型的复杂性增加,即,它可以拟合训练数据中的更多噪声,并导致过度拟合。这意味着我们在增加模型的方差,减少模型的偏差。从上图可以看出,如果我们不断提高模型的复杂度,泛化误差最终会超过最优点并继续增加。
总之,如果我们的模型复杂性超过了最佳点,我们就有陷入过度拟合区域的风险;而如果复杂度没有达到最佳点,我们就处于不适合区域。
正则化是一种有助于防止统计模型陷入过度拟合区域的技术。它通过阻碍模型的复杂性来做到这一点。
二。正规化
线性回归
这是一个简单的线性回归方程。
Linear Regression
我们的目标是找到最小化残差平方和(RSS)的β集。
Residual Sum of Squares
L2 正规化
利用 L2 正则化的回归模型也称为岭回归。就线性回归而言,不仅仅是最小化 RSS。我们通过对测试版的约束为游戏增加了另一个元素。
L1 Regularization
“s”可以理解为 betas 版的预算。如果你想让第一个测试变大,第二个测试必须变小,反之亦然。这变成了一场竞争,因为我们有更多的测试版,不重要的将被迫变小。
由于平方项,RSS 方程实际上给出了椭圆的几何形状。黑点是使用正规方程的贝塔集,即没有正则化。红圈包含了我们“买得起”的所有测试集。红点是岭回归的最终 betas,在我们的预算内最接近黑点。红点将总是在约束的边界上。只有当法线方程的解,即没有正则化的线性回归的解,已经满足约束时,才能在约束内获得红点。
L1 正规化
利用 L1 正则化的回归模型也被称为 Lasso ( 最小绝对收缩和选择算子)回归。套索的目标类似于山脊,只是约束变为:
L2 Regularization
套索还为我们提供了一个美丽的几何图形,它具有独特的性质。
通过 L2 正则化,我们可以“承受”的贝塔集位于一个菱形内。红点在菱形的角上,将其中一个 betas 设置为 0。
如果红点在菱形的边缘,即椭圆接触到菱形的边缘,会怎么样呢?因此,两个 betas 都不会是 0。然而,二维空间中的菱形是一种特殊情况,如果红点在边缘上,则两个β都不为 0。
让我们考虑一下我们有 3 个 betas 的情况。约束的几何图形变为:
Lasso with 3 betas
上图由 6 个顶点和 8 条边组成。如果红点位于边缘,一个β将被设置为 0。如果它位于一个顶点上,两个β将被设置为 0。随着尺寸的增加,顶点和边的数量也增加,使得椭圆更有可能在这些位置之一与菱形接触。也就是说,套索往往在更高的维度上工作得更好。
L1 和 L2 正规化的差异
岭回归是线性回归的一种扩展,它将贝塔系数设置得很小,从而减少了不相关特征的影响。这样,统计模型将不适合训练数据中的所有噪声,并且落入过拟合区域。
套索回归带来了一些独特的属性表,因为它的美丽的几何图形。一些测试将被设置为 0,给我们一个稀疏的输出。我们也可以使用套索进行特征选择。虽然诸如最佳子集、向前逐步或向后逐步的特征选择技术可能是时间低效的,但是 Lasso 将更快地收敛到最终解。
三世。结论
具有高复杂性的统计模型可能易于过度拟合。在本文中,我介绍了两种正则化技术来阻止模型拟合训练数据中的所有噪声。而且,我借助几何解释了它们的性质和区别。
我的文章到此结束!祝大家有美好的一天:)
图像:
[1]丹尼尔·桑德斯,偏差-方差权衡 (2017)
机器学习模型的正则化
L1·拉索、L2·海岭和 L1+L2 弹性网正规化解释
机器学习中的一个常见问题是过拟合,其中模型错误地概括了训练数据中的噪声:
https://towardsdatascience.com/over-fitting-and-regularization-64d16100f45c
补救这个问题并使模型更健壮的一个流行方法是正则化:一个惩罚项被添加到算法的损失函数中。这改变了最小化损失函数所产生的模型权重。
最流行的正则化技术是套索、脊(又名吉洪诺夫)和弹性网。对于只有一个权重参数 w (线性拟合的斜率)的简单线性回归的示例情况,它们的罚项看起来像这样(包括一个比例参数 λ ):
- 拉索(L1) : λ |w|
- 山脊(L2) : λ w
- 弹性网(L1+L2):λ₁*| w |+λ₂w*
不同的项具有不同的效果:与 L1 相比,二次 L2 正则化在小权重(接近零)时变得可以忽略,但是在大权重时变得更强。这导致了以下行为,随便说说:
- 无正则化的线性回归:“我附和一切。”
- 拉索:“一开始我持怀疑态度,但是要顺应重大趋势。”
- 岭:“我很容易被说服,但有点迟钝。”
- 弹力网:“我感觉在山脊和套索之间的某个地方。”
让我们看看在实践中是什么样子。对于十个随机数,我们将使用上述四种方法中的每一种方法进行线性拟合(出于演示目的,对岭使用增加的λ参数):
当然,你会在数据中得到一个微小的随机趋势,这无疑是由线性回归得到的。岭回归也显示了这一趋势,但更弱。对于套索和弹性网,当最小化损失函数时,线性 L1 罚项足够高以迫使权重(即斜率)为零。
现在,我们向数据点添加一个小的线性分量,并重新运行拟合程序:
这已经足够让 Lasso 不再完全“忽略”坡度系数了。
如果我们进一步增加增加的线性分量,我们得到这个:
套索和弹性网现在几乎完全“接受”显著趋势,而对于山脊,二次惩罚项导致较低的斜率。
你错过什么了吗?在评论中分享你的观点或问题吧!
基于 Framingham 案例研究的神经网络正则化
L1,L2,弹性网,和组套索正规化
在这篇文章中,我将讨论 L1、L2、弹性网和神经网络上的套索正则化。我描述了正则化如何帮助您构建更有用和更易解释的模型,并且我包括了每种正则化类型的 Tensorflow 代码。最后,我提供了一个详细的案例研究,展示了正则化对神经网络模型的影响,这些神经网络模型应用于来自 Framingham 研究的真实临床和遗传数据。
正规化的好处
正则化可以通过减少过度拟合使模型更加有用
正则化可以通过减少过度拟合来提高你的神经网络对未知数据的性能。
过拟合是一种神经网络开始记忆训练数据的独特怪癖(如训练数据噪音)而不是学习普遍适用的原则的现象。“过度拟合”的模型将在训练数据上获得高性能,但在保留的测试数据上表现不佳,这意味着该模型在现实世界中不会有用,因为它不会在从未见过的数据上表现良好。由于神经网络模型的全部目的是解决新数据的实际问题,我们希望避免过度拟合,以便获得实际有用的模型。
下面是分类问题中过拟合的一个例子:
在这个分类任务中,我们要学习一条区分红点和蓝点的线。黑线代表一个很好的分类器,它似乎捕捉到了蓝点和红点在空间中的位置的一般原理。绿线代表一个过度拟合的分类器,因为它对于这个红点和蓝点的精确训练集来说太具体了。
观察绿色分类器线如何在一个看不见的测试集上表现更差,即使这个看不见的测试集遵循相同的蓝点和红点的一般布局。还要注意,没有过度拟合的黑色分类器行在测试集上仍然工作得很好:
当神经网络记住训练集中的所有例子时,过度拟合的最极端版本发生。当神经网络具有许多参数并且训练时间过长时,会发生这种情况。
正则化可以让模型更容易理解
具体来说,“套索”正则化试图强制模型中的一些权重为零。
- 在回归中,一个权重对应一个变量,因此套索正则化(使用 L1 罚函数)可以通过“清零”相应的权重来直接“清零”某个输入变量。
- 在神经网络中,我们需要使用“套索组”正则化,以便将整个输入变量归零,并获得更易解释的模型。这是因为神经网络将许多权重应用于单个输入变量,因此我们必须将所有这些权重视为一个“组”(详见后面章节。)
愚蠢的例子:
- 我们想建立一个模型来预测糖尿病的风险,这个模型是基于一个包含这些变量的临床数据集:[身高,年龄,过去的诊断,过去的药物,最喜欢的颜色,最喜欢的动物]
- 我们构建了包含 lasso 正则化的模型,并发现该模型选择了“清零”与“最喜欢的颜色”和“最喜欢的动物”相对应的权重,这告诉我们这些变量在预测未来的糖尿病诊断中没有用。
如何正则化神经网络模型
通用设置
以下是神经网络模型正则化的一般设置,其中 W 表示神经网络模型的权重:
每个神经网络都有一个损失函数,用于在训练中调整神经网络的权重。损失函数衡量神经网络的预测与事实有多大的不同(见这篇文章的评论)。)
正则化只是在损失函数中增加了一个“正则项”(上面用蓝色表示)。
- λ (lambda)决定正则化对网络训练的影响程度。如果设置λ=0,则根本没有正则化,因为您已经将整个正则化项置零。如果您设置λ= 1,000,000,000,那么这将是非常强的正则化,这将使您的模型很难学习任何东西。正则化强度λ的合理选择可以是 0.001、0.01、0.1、1.0 等。最后,要使用的最佳λ值取决于您的数据集和您正在解决的问题。您可以在验证集上用不同的λ强度检查模型的性能,然后选择给出最佳结果的λ。因此,正则化强度λ成为您的模型的超参数,您可以在验证集上对其进行调整。
- 数学 (W)表示实际的正则化运算。我们称神经网络的权重为 W,因此正则化只是对权重的数学运算。不同种类的正则化对应不同的数学运算。
L1 正规化
以下是 L1 正则化的公式(首先是简单的简写,然后更加精确):
因此,L1 正则化增加了具有大绝对值的权重的惩罚。L1 正则化鼓励您的模型使尽可能多的权重为零。
以下是如何在只有一层的微型神经网络上计算 L1 正则化惩罚的示例,由 2 x 2 权重矩阵描述:
当将 L1 正则化应用于回归时,它被称为“套索回归”
下面是张量流代码,用于计算名为 weights 的权重矩阵的 L1 正则化惩罚:
l1_penalty = tf.reduce_sum(tf.abs(weights))
L2 正规化
以下是 L2 正则化的公式(首先是粗略的简化,然后更加精确):
因此,L2 正则化增加了拥有许多大权重的惩罚。L2 正则化鼓励模型选择小数量级的权重。
下面是一个如何在只有一层的微型神经网络上计算 L2 正则化罚值的示例,由 2 x 2 权重矩阵描述:
如果你将 L2 正则化应用于回归,它被称为“岭回归”
下面是用于计算权重矩阵权重的 L2 正则化惩罚的张量流代码:
l2_penalty = tf.reduce_sum(tf.nn.l2_loss(weights))
张量流函数“l2_loss”计算 l2 范数的平方。平方 L2 范数是 L2 正则化的另一种写法:
L1 和 L2 正规化的比较
请注意,在 L1 正则化中,权重为-9 会得到 9 的惩罚,但在 L2 正则化中,权重为-9 会得到 81 的惩罚-因此,在 L2 正则化中,较大的权重受到的惩罚要严重得多。
另请注意,在 L1 正则化中,权重为 0.5 会得到 0.5 的罚分,但在 L2 正则化中,权重为 0.5 会得到(0.5)(0.5) = 0.25 的罚分-因此,在 L1 正则化中,仍然有将甚至很小的权重向零挤压的趋势,比在 L2 正则化中更是如此。
这就是为什么 L1 正则化鼓励模型使尽可能多的权重为零,而 L2 正则化鼓励模型使所有的权重尽可能小(但不一定为零)。
弹性网正规化
“弹性网络正则化”听起来很奇特,但它简单地意味着同时使用 L1 和 L2 正则化:
这里,我们有两个λ:一个控制 L1 正则项的强度,另一个控制 L2 正则项的强度。如前所述,这两个 lambda 值都可以使用验证集进行调整。
群组套索正规化
套索集团是由袁和林在 2006 年推出的:
明元和林逸。"分组变量回归中的模型选择和估计."J. R .统计学家。社会主义者 B (2006)。
(那篇论文后来被引用了 5000 多次。)
什么是套索组?回想一下,L1 正则化有时被称为“套索正则化”,其目的是将一些变量归零。同理,“群组套索”是一种允许你将整组变量归零的技术。特定变量组的所有成员要么一起包含在模型中,要么一起从模型中排除(归零)。
以下是“套索组”特别有用的两种情况:
*对于分类变量:*如果您已经将分类变量表示为一个热点向量——即,二元协变量的集合——组 lasso 可以确保与单个分类变量相对应的所有二元协变量一起“清零”或“保留”。例如,如果您有一个可能值为“红色”、“蓝色”和“绿色”的分类变量“颜色”,那么您可以用一个长度为三的一键向量来表示该分类变量,这相当于将一个单独的“颜色”列拆分为三个二进制列:“红色是/否”、“蓝色是/否”和“绿色是/否”。“组合套索”可以帮助您将所有三列一起清零,或者保留所有三列,将它们视为一个单元。
*对于神经网络:*如果你正在训练一个神经网络,组套索可以“清零”整个输入变量,并帮助你获得一个更可解释的模型。
- 如前所述,良好的旧 L1 正则化可以很容易地将回归中的整个变量归零,因为它只需将一个权重归零即可将一个变量归零。
- 但在神经网络中,许多权重作用于一个变量,这意味着我们必须同时将所有这些权重归零,以便将该变量归零。套索组让我们将所有对应于一个变量的权重组合在一起,以实现这一目标。
下图显示了“XW”:2 维数据输入矩阵 X 乘以神经网络权重矩阵 W。在这种情况下,W 将 2 维输入映射到 4 维隐藏层。输入 X 由“患者 A”和变量“血压”和“胆固醇”组成(已经按照此处描述的进行了适当标准化)。)您可以看到权重矩阵的第一行以红色突出显示,这对应于将乘以血压变量的权重。权重矩阵的第二行以蓝色突出显示,这对应于将乘以胆固醇变量的权重。因此,如果我们想要“归零”可变血压,我们需要“归零”权重矩阵顶行中的所有四个权重。
(注:在大多数论文中,神经网络数学都写成 WX+b,其中 W 是权重矩阵,X 是输入,b 是偏置向量。为什么我在这里写 XW?嗯……在 Tensorflow 中,全连接层的实现使用 XW 而不是 WX。参见这篇文章,了解更多关于理论与实践中的符号的评论。)
这里有一篇描述群组套索应用于神经网络的论文:
西蒙·斯卡达潘尼,达尼洛·科米涅罗,阿米尔·侯赛因和奥雷利奥·安西尼。"深度神经网络的组稀疏正则化."神经计算 (2017)。
这是论文的位存储库,作者解释说,
对于网络中的每个节点,我们包括一个正则化项,将整行输出权重同时推为零。这是通过约束行的 L2 范数来实现的,通过其维数的平方根来加权。
以下是群组套索正规化的公式:
这里有一个组套索惩罚的张量流函数,来自这个库:
# Define the group lasso penalty
returnT.sum(T.sqrt(x.shape[1])*T.sqrt(T.sum(x**2, axis=1)))
这是组套索惩罚的另一个 Tensorflow 实现:
euclidean_norm =tf.sqrt( tf.reduce_sum(tf.square(weights),axis =1) )
#Must cast num_outputs to a float in order for tensorflow to take the square root
account_for_group_size = tf.sqrt( tf.cast(num_outputs, dtype=tf.float32) )
penalty = tf.reduce_sum( tf.multiply(account_for_group_size, euclidean_norm) )
有些令人困惑的是,本文中的群组套索使用了 L2 范数,就像在 L2 正则化中一样(将元素的平方值相加)。但是传统的“套索”使用 L1 规范!这是怎么回事?
维基百科对“套索”的定义是:
Lasso(最小绝对收缩和选择算子)是一种回归分析方法,它执行变量选择和正则化,以提高其产生的统计模型的预测精度和可解释性。
“套索组”执行变量选择(通过将对应于特定输入变量的权重组归零)和正则化。此外,即使套索组包含 L2 规范,它也不同于 L2 正则化:
弗雷明汉案例研究
背景
弗雷明汉心脏研究始于 1948 年,一直延续至今。弗雷明汉研究为许多关于心脏病的现代知识做出了贡献,包括健康饮食、保持健康体重、不吸烟和定期锻炼可以降低患心脏病的风险。弗雷明汉心脏研究数据集包括临床变量(如年龄、吸烟状况)、遗传变量和心脏病结果(如患者是否有心脏病发作)。)
2018 年夏天,我花了几个月时间分析弗雷明汉心脏研究的部分数据,以确定同时包含临床和遗传数据的预测模型是否会比仅使用临床数据建立的预测模型表现更好。我怀疑在临床数据的基础上增加基因数据很难在预测性能上看到任何好处,因为:
- 许多临床变量(如胆固醇水平、甘油三酯水平、血压)总结了生活方式选择(如饮食、锻炼、物质使用)和遗传。因此,临床数据已经包括遗传学,尽管是隐含的。
- 人类基因组中有成千上万个影响心脏病的位点。这些点分布在整个基因组中。每一个斑点本身对心脏病风险的贡献都很小。然而,大约 50%的心脏病风险是遗传的——这意味着,总体而言,所有这些点一起对心脏病风险有显著影响。因为有这么多不同的贡献点,每一个都有很小的影响,我们需要一个巨大的样本量来挑选对预测有用的模式。不幸的是,在我的弗雷明汉数据子集中,我有 500,000 个遗传变量,但只有 3000 名患者,这意味着问题是欠定(变量多于训练样本。)
模型结果
我根据弗雷明汉数据集的临床和遗传数据训练了各种前馈神经网络,以预测心脏病风险。我对第一层权重矩阵应用了不同类型的正则化。下表显示了不同模型的性能(Acc = 精度,AUC = 面积在接收器工作特性,AP = 平均精度):
关于结果的要点:
- 表现最好的模型仅使用临床数据(第一行。)
- 仅使用遗传数据的模型(第二行)比仅使用临床数据的模型具有低得多的性能。
- 结合遗传和临床数据的模型都比单独使用临床数据的模型性能低,可能是因为 3000 名患者的样本量不够大,无法从遗传数据中了解到任何有意义的信息。该模型反而过度适应遗传训练数据中的噪声,然后不能推广到测试集中的遗传数据。这具有“混淆”测试集性能的效果(相对于其中临床变量是唯一输入的模型。)
第一层权重矩阵热图
通过检查不同正则化方法的第一层权重矩阵的热图,我们可以获得更多的见解。热图的每一行对应于一个不同的输入变量。前 20 行(genetic_0 到 genetic_19)对应于应用于 500,000 个遗传输入变量的已学习的 20 维表示的权重。底部行(从 SYSBP1 到 DIAB_1.0)对应于应用于临床变量的权重。
以下是采用(A)无正则化、(B) L1 正则化、L2 正则化和(D)弹性网络正则化的模型的热图:
面板 A 示出了没有应用正则化的第一层权重矩阵。我们可以看到大量的正负重量无特定模式地分散在各处。
面板 B 示出了应用了 L1 正则化的第一层权重矩阵。我们可以看到有更多的零值(黑色)权重。然而,在变量(行)级别没有特别强的模式,这是可以预期的,因为 L1 正则化独立地考虑每个权重的绝对值。
画面 C 示出了应用了 L2 正则化的第一层权重矩阵。这比非正则化的情况具有更多数量的较小量值的权重。
画面 D 示出了应用了弹性网正则化的第一层权重矩阵。对于这个数据集,弹性网正则化最终实现了所有考虑的正则化方法的最佳性能。它还产生了一个相当不错的第一层权重矩阵:所有的遗传变量都被“归零”,最亮的临床变量是“年龄”(这有点滑稽,因为我正在研究大约 40 年的心脏病风险,所以如果你在研究期开始时 80 岁开始,你将比 30 岁开始的人有更高的风险。)
最后,在面板 E 和 F 中,我们可以看到使用群组套索正则化训练的两个不同模型的结果。这些模型用不同的随机初始化进行训练,并最终找到不同的解决方案:
- 图 E 中的模型将所有的遗传变量“清零”,并保留了大部分临床变量(同样,与弹性网情况相似,权重最高的临床变量是“年龄”)。)在上面的结果表中,该模型被列为“套索组(1)”,并达到 0.690 精度、0.771 AUROC 和 0.767 AP。
- 图 F 中的模型最终“归零”了所有的临床变量,并试图使用遗传变量进行预测。最佳验证性能实际上是在第 15 个时期实现的,而不是第 61 个时期,因为在第 15 个时期,模型还没有完成杀死所有临床变量。在 epoch 15 时的性能是 0.605 精度、0.662 AUROC 和 0.670 AP,在模型决定要消除临床变量后,性能变得更差。
因此,这个实验也很好地展示了具有不同随机初始化的神经网络如何在同一数据集上找到不同的解决方案。
注意,在许多情况下,正则化的应用导致更好的测试集性能,这在这个例子中没有明确地示出。如果我在表现最好的“只有临床数据”模型中加入了正则化,也许会产生更高的性能。
结论
- L1、L2、弹性网和群组套索正则化可通过减少过度拟合来帮助提高模型在不可见数据上的性能。
- 回归中的 L1 正则化和用于神经网络的组套索正则化可以通过“归零”某些输入变量来产生更容易理解的模型。
- 在正则化神经网络模型中可视化带有热图的权重矩阵可以提供对不同正则化方法的效果的洞察。
关于特色图片
特色图片是 C.M. Russell 的一幅名为“牛群逃亡者”的油画,画的是牛仔试图套住一头公牛。牲畜套索也叫“套索”、“riata”、“reata”,或简称为“绳子”
原载于 2019 年 6 月 8 日http://glassboxmedicine.com。