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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

使用机器学习进行股票投资组合选择的冒险经历

原文:https://towardsdatascience.com/mis-adventures-in-utilising-machine-learning-for-stock-predictions-a5b16199b857?source=collection_archive---------20-----------------------

多期远期预测中防止数据泄漏的痛苦

前言

作为一名初出茅庐的数据科学家,我最近建立了一个机器学习模型,以预测和选择沪深 300 指数(上海和深圳证券交易所市值排名前 300 的股票)中表现出色的股票组合。

结果很有希望,但还不够好。我的模型成功地选择了一个股票投资组合,该投资组合的表现一直优于基准指数(在 200 天的时间内累计超额收益至少为 5%),但是如果将经纪费用和滑点计算在内的话…好吧,我只能说我现在不会把钱押在我的模型的预测上!

那么我为什么要写这篇文章呢?嗯,因为我徒劳地试图搜索关于我在构建这个模型的过程中所面临的一些挑战的文章/建议,因此有了(错误的)冒险,我真诚地希望在某个地方,有一天,处于相同情况的人可以从这篇文章中得到一些用处。或者我发现我真的不擅长网上搜索。无论哪种方式,学习都会发生!

问题陈述

使用机器学习模型,结合基本面和技术指标,预测和选择由沪深 300 指数股票组成的投资组合,其表现将优于基准指数。

数据

数据的主要来源是对晨星的试用订阅。

使用的技术特征是:

  1. 两个周期之间收盘价的百分比变化
  2. 两个周期之间收盘价的指数加权移动平均值的百分比变化
  3. 每日收盘价的差异
  4. 平均营业额
  5. 两个周期之间每日交易量的指数加权移动平均值的百分比变化
  6. 每日交易量的差异

这些都是为不同时期或不同时期的排列计算的。

使用的基本特征是:

  1. 股本回报率
  2. 利润率
  3. 利润变化
  4. 收入变化
  5. 价格收益比
  6. 市净率
  7. 价格销售比

这些数据都来自季度财务报告,并根据其行业名称进行了标准化(使用晨星的行业名称)

为防止数据泄露,季度财务报表数据将仅在该季度结束后一个月使用,因为这将是上市公司发布季度财务报表的最后日期。

此外,使用的主要经济指标有:

  1. 中国财新制造业 PMI
  2. 中国财新服务业 PMI
  3. 中国国家统计局制造业采购经理人指数
  4. 中国国家统计局非制造业采购经理人指数
  5. 中国消费价格指数
  6. 中国 GDP 同比

为了防止数据泄露,经济指标数字只在公布后的下一个交易日使用。

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

Quick peek at the feature space

由于只有 10 个季度的财务报表,我可以用来建模的数据时间范围只有 2017 年 10 月至 2019 年 11 月。

此外,由于一些公司的财务报表中缺少一些字段,我原本打算投资 300 只股票,但现在只投资了 225 只。

尽管如此,这仍然是一个不错的数据块。没问题!然而…

(错误的)冒险开始了…

挑战:防止多期远期预测中的数据泄漏

我设法找到的关于股票预测的大部分(如果不是全部的话)倾向于一个时期的前瞻性预测。那些展望未来多个时期的通常属于自回归类型。

这也不是我对这个模型的想法。

我真的不希望为这个模型创建一个高/中频算法策略,因为我通常采取基本的交易方法。该模型的主要目的是识别股票的实际交易价格和假定内在价值之间的重大差异,这些修正将需要多个周期(至少几天)才能实现,如果它们真的发生的话。

因此,假设持有期为 5 期,将目标变量建立在未来 5 期的收盘价上是有意义的,对吗…?

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

All done!

唉,事实并非如此。

例如,如果培训拆分于 2019 年 10 月 28 日结束,则 2019 年 10 月 22 日至 2019 年 10 月 28 日的 5 期提前收盘价格实际上仍然未知。

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

The target Close prices boxed in red cannot be used!

虽然我使用 240 个周期进行训练,并且我的 X 变量实际上不包括日期,但这个看似很小的泄漏实际上导致了我的预测结果的巨大(并且完全没有根据的)超越。

为什么不直接去掉 X 变量的最后 5 个周期呢?因为这导致了我的预测结果表现严重不佳(这一次,完全有理由)。

解决方案:在一个训练周期的每个可能的截止日期对数据进行切片,并在移位时使用该周期的最后收盘价作为填充值。

对每个训练期的数据进行切片,可以确保“未来”的收盘价不会被包含在内。然后,我们可以继续向前移动收盘价,并使用该期间的最后收盘价作为填充值。

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

If it’s stupid but it works… it might still be stupid.

在这里,如果股票在 5 天持有期结束时的表现超出基准指数 5%以上,则观察值被标记为正 1 级。

然后,将这些目标变量的切片集添加到字典中,该字典可以由模型针对每个特定的训练期调用。

我不认为这是一个优雅的解决方案,因为在使用这些填充值时,目标变量可能会被贴错标签。但是将这一考虑与训练期最后几天获得的信息进行权衡,我认为这是值得的,因为它确实提高了我的模型的结果。

当然,如果有人能想到更优雅的解决方案,请分享!

结论

这似乎是一个很好的休息的地方,现在结束这篇文章,并衡量这是否对任何人都有帮助或感兴趣。如果是这样的话,我很乐意享受我在这个项目过程中遇到的后续不幸,例如尝试使用 GridSearch 来调整分类模型的超参数,其中模型的(离散)预测的准确性并不能真正反映股票投资组合的实际(连续)价格。甚至是一些有效的方法。

因为最终每一个股票选择模型都是根据它的表现来评估的,所以这是我的模型。该模型的预测(蓝线)在 200 个交易日内产生了高于基准指数(橙线)10%的累积超额收益,但这是假设没有经纪成本和交易滑点…所以,是的,还有很长的路要走。

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

The model’s portfolio generates 10+% of accumulated excess returns over the benchmark index for a 200 trading day period

再说一次,我只是一个初出茅庐的数据科学家,我总是渴望听到并向在座的各位学习。这仍然是一项正在进行的工作,我绝对欢迎社区的任何意见或建议!

感谢您的阅读,欢迎随时通过 Linkedin 联系我!

数据和统计误导。

原文:https://towardsdatascience.com/misleading-with-data-statistics-c6d506bdb9cf?source=collection_archive---------6-----------------------

统计在我们的生活中扮演着重要的角色。我们每天都在有意识或无意识地使用它们。如今,数据无处不在,由于我们系统的信息过载,做出正确的决策变得越来越困难。如果应用正确,统计学可以让我们更好地处理和理解我们周围的世界。我们应该能够根据更完整的信息做出更好的决策。但是如果统计数据是误导性的呢?

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

如果有人想骗你相信一些你本不该相信的事情,该怎么办?调整数据及其统计结果的螺丝钉在哪里?这篇文章带你走过使用数据统计时的陷阱。目标是理解操作数据的最常见的实践,并避免由于误导信息而做出错误的决策。

数据和统计的问题。

数据在辩论中有很大的力量和权威。这是一个挑战:经常有一个编造的数字来强调一个扯淡的故事。但是由于这个数字的权威性,如果这个数字是真的,我们就不那么怀疑了。一个来自锐步旧广告的真实例子很好地展示了这种效果:

“与普通运动鞋相比,这款鞋被证明可以让你的腿筋和小腿增加 11%的力量,让你的臀部增加 28%的弹性……只需步行!”。

这听起来太权威了——基于锐步可能在非常激烈的研究中收集的数据。将其与以下没有具体数字的版本进行比较:

“这只鞋会让你的腿筋和小腿变得更硬,还能锻炼你的臀部.”

事实是,这些数字完全是捏造的,该品牌必须为第一次声明支付巨额罚款。但是怎么才能防止自己被困住呢?

了解根本原因

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

无论是在商业、科学还是你的私人环境中,如果你了解“错误”数据的根源,你就能避免被它误导。在处理数据时,陷阱可能出现在每个步骤中。因此,本文揭示了处理数据时最常见的陷阱。

生成数据时的陷阱

每个数据科学家面临的最具挑战性的任务之一是获得正确的数据来处理。对于正确的数据,我们指的是最真实地反映人口或“真实世界”的样本。通过下面探讨的各种不同技术,在数据采集过程中可能会发生一些操作或陷阱。让我们来看三个常见的例子:

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

糟糕/有偏差的采样 使用非随机样本的数据在历史上发生过多次,这是糟糕预测和误导数据的开始。发生在样本选择上的重大错误,排除了一个真正具有代表性的要素。

典型的例子是总统选举中糟糕的民意调查抽样。1948 年,《芝加哥论坛报报》刊登了“杜威打败了楚门”,这是基于实际选举前的一次电话调查。那时电话还不是标准。它们主要是为上层阶级提供的。但是当意识到样本不是随机的时,已经印了几千份了。上图是杜鲁门总统手里拿着一个假新闻样本在笑。

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

Truman holding the “Fake News”.

加载问题 每当涉及到生成数据时,这些数据必须来自一个中立的资源。加载题恰恰相反。它们已经包含了一个不合理的或有争议的假设,目的是操纵输出。一个很好的例子是产品经理向他们的用户征求反馈:“你喜欢我们为你打造的产品的什么?”这个问题已经暗示了用户喜欢这个产品。如果你想收集一些反馈并自我吹捧,这很好——但这与生成有用的数据或统计无关。

错误轮询 与加载问题密切相关的是错误轮询。它通常用于影响相应样本的答案。

“你认为我们应该帮助不稳定的国家保持自由和民主吗?”

和…相对

“你支持我们在其他国家与他们的现任政府进行军事斗争吗?”

你可以清楚地看到这两个问题的区别和抹黑运动。第一个试图支持国家干预,第二个试图相反。在许多情况下,看一下民意测验是非常有意义的——你通常会获得比答案本身更多的见解。

处理数据的陷阱

一旦完成数据生成和采集,就对数据进行处理。数据转换、清洗、切片和切割会产生许多误导性的结果。下面是三个最常见的问题:

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

挑选/丢弃不利的数据 在研究中,你得到一个大数据集并不得不处理它是很常见的。在最好的情况下,研究问题已经被定义,研究者有一定的压力产生结果。但是如果发现的结果不是很有趣呢?如果你有那么多数据,会产生有趣的结果,尽管它们只是一种信心。通过丢弃不利的数据或从数据集中挑选一些片段,人们很容易产生有趣的结果。

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

Temperature Anomaly 2002–2013 (Source: NASA)

气候变化就是一个很好的例子:为了强调气候变化始终如一且不会改变的说法,数据的时间范围往往局限于 2000 年至 2013 年。如果观察这个特定的提取物,它可能看起来温度异常总是相同的。

只有在包括完整数据框架的大图中,正温度异常的强烈和快速变化才变得可见。

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

Temperature Anomaly Complete (Source: NASA)

显著性&质量 我们经常看到实验被进行,结果被呈现,没有统计学意义。在商业环境中,这在所谓的 A/B 测试中经常发生。

A/B 测试环境中的统计意义是你的实验的原始版本和测试版本之间的差异不是由于错误或随机机会造成的可能性有多大。例如,在一个带有绿色按钮的测试版本中,7%的转化率并不一定意味着它比转化率为 5%的替代样本表现得更好,如果你只有 200 个访问者的样本大小的话。有几个选项可以确保你的假设的显著性,要么通过标准化软件,要么通过我们自己计算。在这里你可以找到一个计算器来检查你最后一次 A/B 测试的重要性。

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

数据挖掘 数据挖掘(Data Dredging)也称为 p-Hacking,描述的是在没有任何焦点和假设的情况下分析一个数据集的过程。通过寻找和测试重要变量的不同组合,大量的假设将被测试。如果你在 p 值的帮助下测试很多假设,很可能你有一个 1 型(或 2 型)错误。原因很简单,因为有太多的测试,错误地拒绝或接受假设的统计概率增加了。但是让我们来看一个你可能在商业生活中经历过的真实例子。

在之前的文章中,我们预测了客户是否会流失,这具有统计学意义。但是让我们假设你有一个糟糕的数据集,并且你的测试显示没有统计学意义。然后你开始为每一个客户特征创建一个假设。然后砰——最后你的测试表明你的一个假设很重要:“金发的客户两年后更有可能流失。”

通过运行如此多的测试,一个随机假设可能会显得有意义,仅仅是因为进行了如此多的测试。但事实上结论是“假阳性”——这意味着测试有 5%(95%的显著性水平)的几率出错。

数据交流中的陷阱

每当统计数字和数据被用来支持创作者的意图时,建议不时地对其进行批判性的审视。

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

数据可视化 尤其是在数据可视化方面,人们喜欢做一些小的调整,这对信息消费者来说意义重大。用图表误导人的方法有很多。以下是最常见的一些摘录。

  • 截断的 y 轴:在基线不为零的情况下比较数据时,如下图所示的数据可视化可以比以前更生动。

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

Same Data — different Y-Axis

  • 遗漏数据,通常称为“省略数据”,指的是图表中缺少几个数据点,例如只显示第二年的每个数据点。解释和决策是基于一半的信息。
  • 不适当的缩放:这种方法通常用于时间序列或随时间的变化,并在两个方向上起作用:要么 y 轴不适当地增加,因此变化似乎不太强烈。或者为了使效果看起来比以前更有决定性,不恰当地降低了 y 轴。

错误的因果关系/结论

虽然在数据中发现有统计学意义的见解是增加价值的开始,但你还必须能够正确地解释结果。如何不解释结果的一个很好的例子是亚伯拉罕·瓦尔德和丢失弹孔的故事。长话短说,二战期间他是统计研究小组的一员。空军向 Wald 提出了一个问题:太多的飞机被击落,而简单地增加 armpur 的整体重量会使它太重。他们问如何有效地增加装甲。

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

(Hypothetical Image)

沃尔德调查了从战场返回的飞机,收集数据并进行分析。他发现了子弹多的地方和子弹少的地方。首先,直觉上认为应该在子弹较多的地方放置更多的装甲。但这是错误的结论。由于统计样本是返回的飞机,子弹完整较少的区域是重要的区域,可能目标击中了没有返回的飞机。

“先生们,你们需要在没有洞的地方放更多的装甲板,因为那些没有返回的飞机上的洞就在那里。”—亚伯拉罕·瓦尔德

隐藏上下文

有用的数据可视化使大量数据易于理解和解释。观众应该能够看到展示的数据并快速找到重要信息。如果出现过多或不相关的数据,观众可能看不到相关信息。一次显示的数据越多,就越难发现具体趋势。用太多的数据误导通常是用来误导观众从小的,但相关的见解。

结论

统计数据很有可能被滥用。尤其危险的是它以某种权威来强调每一个论点的力量。“如果有明确的证据,甚至一个数字这么说,那么它一定是正确的”,这是观众经常的反应。尽管基于误导性数据和统计数据的错误决策非常有用,但数据也有能力提供深刻的见解,推动更好的决策,并允许做出预测。那么我们该怎么办呢?

通过了解产生误导性数据和统计数据的一些最常见的过程,我们大大减少了自己陷入困境的机会。通过以负责任、可理解和道德的方式正确部署数据和统计,我们积极地为一个更好的知情世界做出贡献——这听起来是不是一个令人惊叹的未来使命?😃


您可能感兴趣的其他已发表文章:

应用机器学习算法提高创业估值

消除流失是增长黑客 2.0

动手:预测客户流失

了解如何创建自己的样本数据集


缺失数据和插补

原文:https://towardsdatascience.com/missing-data-and-imputation-89e9889268c8?source=collection_archive---------12-----------------------

缺失的数据会扭曲研究结果,增加计算费用,并使研究人员感到沮丧。近年来,处理缺失数据在生物和生命科学等领域变得越来越普遍,因为我们看到了管理不当的空值 的非常直接的后果。对此,有更多样的方法来处理出现的缺失数据。

这对于提高研究的有效性来说是非常好的,但是对于那些积极主动的数据科学家来说却有点棘手。这篇博客文章将向您介绍一些处理缺失数据的有用概念,并让您开始使用一些现在就可以尝试的切实可行的方法来清理 Python 中的数据。

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

Photo by Carlos Muza on Unsplash

为什么要做任何事?

您可能会问自己—为什么我需要处理丢失的数据?为什么不让睡觉的狗躺着?首先,缺失值(称为 NaN、Null 或 NA)会带来计算上的挑战,因为。想一想——如果你要对一列数值求和,发现少了一个,那么 5 + NA 是多少?如果我们不知道等式中的第二项,我们的结果本身就是 NA。所以我们真的不能从丢失的值中得到任何有意义的东西,而且它混淆了大多数期望处理非空情况的程序。

除此之外,丢失数据还会导致三个主要问题:

  1. 偏见
  2. 更费力的处理
  3. 结果效率降低

这些都是丢失数据的非常严重的副作用(如果不仅仅是恼人的话),所以我们想找些事情来处理我们的空单元格。这就是“归罪”的由来。

插补

《韦氏词典》分享了“估算”一词的“金融”定义,即“通过对其贡献的产品或过程的价值进行推断,为某物分配一个价值这绝对是我们在这里要思考的——我们如何才能推断出与缺失的真实值最接近的值?

作为一个题外话——思考和考虑这个术语可能来源于它的神学背景是很有趣的。在这里,它的意思是“归因于正义、罪恶等的行为或过程”。对一个与另一个人有相似品质的人,"如"使徒们的著作告诉我们,如果我们接受基督,基督的义的诋毁是给我们的。"只是我们前进时的一些思考。

缺失数据机制

在研究插补时,您可能会发现数据缺失有不同的原因。这些原因是基于它们在缺失数据机制缺失和观察值之间的关系而给出的术语。它们帮助我们找到合适的数据处理方法,因此对有一个基本的了解真的很有帮助。以下是 4 个最典型的 3 个,你可以在“分析因素”上了解更多。

  1. 完全随机失踪(MCAR)

这可能是最容易想到的—在这种情况下,数据以完全一致的速度丢失。例如,一个缺少 5%来自青年调查的响应的数据集。这是因为在进行调查的那一天,所有学生中有 5%请了病假,所以在整个数据集中,这些值的缺失率是一致的。

2。随机失踪(三月)

尽管名字相似,但 MAR 值比 MCAR 值更复杂,也更容易找到。这些例子表明,如果我们知道另一个变量,丢失数据的比率就可以得到完美的解释。例如,想象上面的数据集缺少 10%的女生回答和 5%的男生回答。这是因为在学校传播的疾病影响年轻女性的可能性是年轻男性的两倍。这变得更加复杂,也更加现实,因为多个变量会影响数据集中缺失值的比率。

3。非随机缺失(MNAR)

在这种情况下,某个值的缺失取决于真实值本身。这是一个非常循环的例子,但是我喜欢这个视频中给出的例子,在一项图书馆调查中丢失价值的比率,该调查收集了他们的名字和未归还图书馆书籍的数量。随着囤积书籍数量的增加,这个调查问题中缺失值的百分比也在增加。这个方法的问题是,因为丢失的值依赖于值本身,我们很难推导出它丢失的比率。

Python 中的实用探索与可视化

在用 Python 处理数据时,Pandas 是一个强大的数据管理库,用于组织和操作数据集。它的一些术语来源于 R,并且是建立在 numpy 包之上的。因此,它有一些令人困惑的方面,值得在丢失数据管理方面指出。

内置两个功能,熊猫。DataFrame.isna()熊猫。DataFrame.isnull() 实际上做完全同样的事情!甚至他们的文件都是一样的。你甚至可以在熊猫的代号中确认这一点。

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

这是因为熊猫的数据框架是基于 R 的数据框架。在 R 中,na 和 null 是两回事。阅读这篇文章了解更多信息。然而,在 python 中,pandas 构建在 numpy 之上,numpy 既没有na 值,也没有空值。相反,numpy 有 NaN 值(代表“不是一个数字”)。因此,pandas 也使用 NaN 值

此外,名为missingno的 Python 包是一个非常灵活的、用 matplotlib 构建的缺失数据可视化工具,它适用于任何 pandas 数据框架。只需pip install missingno开始,查看这个 Github repo 了解更多。

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

A “missingno” visualization of cyclist dataset — with Sparkline on the side

充分可视化丢失的数据是理解您正在处理的丢失数据机制以及丢失数据的规模和要处理的热点的第一步。

单一插补方法:

从最简单的开始,向更复杂的方向发展,下面描述了处理缺失值的一些最常见的方法及其相关的优缺点。

(请注意,数据集中的一项或一行被称为“观察值”)

  1. 行(列表式)删除:去掉整个观察。
  • 简单,但是会引入很多偏差。

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

An example of listwise deletion

2.**均值/中值/众数插补:**对于所有非缺失的观测值,计算该变量观测值的均值、中值或众数,并用其填充缺失值。数据的分布是决定使用哪个描述符的必要信息。

  • 如果缺失数据少于 3%,可以使用,否则会引入太多偏差,并人为降低数据的可变性

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

3.热卡或冷卡插补

“热卡插补”:找出所有其他变量相似的样本对象,然后随机选择其中一个值填写。

  • 很好,因为受到预先存在的值的约束,但是随机性引入了隐藏的可变性,并且计算量很大

“冷板插补”:系统地从在其他变量上具有相似值的个体中选择值(例如,每个集合的第三个项目)。该选项消除了热卡插补的随机性。

  • 受到预先存在的值的积极约束,但是随机性引入了隐藏的可变性,并且在计算上是昂贵的

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

Example of basic hot deck imputation using mean values

4.回归插补

“回归插补”:填写缺失变量在其他变量上回归得到的预测值;你不是只取平均值,而是根据其他变量取预测值

  • 保留插补模型中涉及的变量之间的关系,但不保留预测值的可变性。

“随机回归插补”:回归的预测值,加上一个随机残差值。

  • 这具有回归插补的所有优点,但增加了随机成分的优点。

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

单一估算的挑战

这些都是处理缺失值的好方法,但是它们确实包含了标准误差中未说明的变化。下面的“分析因子”再次完美地解释了这种权衡:

由于估算的观测值本身是估计值,它们的值有相应的随机误差。但是当你把估计值作为数据点输入时,你的软件并不知道。因此,它忽略了额外的误差源,导致标准误差和 p 值都太小。”

此外,单一插补中的值可能会因当前数据集中的特定值而有偏差,并不代表全部人口的总值。那么我们如何减少这两个挑战的影响呢?

多重插补

大约 20 年前,多重填补是统计学上的一个巨大突破,因为它解决了许多缺失数据的问题(尽管,不幸的是,不是全部)。如果做得好,它导致无偏的参数估计和准确的标准误差。

单一插补为缺失观察变量提供了一个单一值,而多重插补为缺失观察变量提供了多个值,然后对它们进行平均得到最终值。

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

Examples of “data signatures” from different samples

为了获得这些平均值,多重插补方法将对数据集的 5-10 个独特样本进行分析,并对每个**进行相同的预测分析。该点的预测值将作为该运行的值;这些样本的数据签名每次都会改变,这导致预测略有不同。这样做的次数越多,结果的偏差就越小。

一旦你取了这些值的平均值,分析它们的分布是很重要的。如果他们是聚类,他们有一个低标准差。如果不是,可变性很高,可能是值预测不太可靠的迹象。

虽然这种方法更加无偏,但是它也更加复杂,并且需要更多的计算时间和能量。

结论

最后,我们看了看:

  1. 处理数据集中缺失值的重要性
  2. “插补”的意义(和根源)
  3. 数据可能丢失的不同原因(丢失数据机制)
  4. 在 Python 中探索和可视化缺失数据的方法
  5. 单一插补方法
  6. 多重插补的一种解释

但这只是一个开始!关于这个话题的更多信息,请查看本帖的链接资源。

**热卡和随机回归都适用于多重插补。这是因为估计值的随机成分使每个估计值略有不同,重新引入了软件可以在建模标准误差中包含的变化。

缺失数据?

原文:https://towardsdatascience.com/missing-data-cfd9dbfd11b7?source=collection_archive---------14-----------------------

减轻痛苦的框架和软件包

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

Photo by Markus Spiske on Unsplash

在我成为一名数据科学家的旅程开始三个星期后,我正式接受了洗礼……也就是火的洗礼!我选择参加 Flatiron 的数据科学 15 周训练营,以从金融领域转型。到目前为止,这个项目已经超出了预期(我的期望很高)。虽然课程很严格,节奏很快,但它的结构很好,教师致力于帮助学生学习,我的团队很棒——每个人都很友好,乐于助人,聪明,毫无疑问会继续完成伟大的事情。这一系列的博客文章是献给他们的…为未来的数据科学家干杯!

**我们在课堂上涵盖了大量的信息,所以当我在课外发现一些有助于提高我的观点或技能的东西时,我会用接下来的几篇帖子来分享它。**我也期待着阅读我同学的帖子!更广泛地说,本系列面向对数据科学感兴趣的任何人。

在学习数据科学时,首先认识到的一点是数据清理非常耗时(许多人认为这是工作中最不愉快的方面)。估计显示 60-80%的时间花在清理和组织数据上,只有很少一部分时间花在分析上(有趣的部分)。有了这个统计数据作为背景,我想我应该分享一些我发现的有用的技术和库,以使数据清理过程更容易。具体来说,我将重点讨论如何处理丢失的数据。我是一个视觉学习者,我喜欢框架,所以这篇文章的目的是通过提供一个识别和处理缺失数据的基本过程

  1. 介绍“缺失数据机制”——对缺失进行分类的标准词汇(对缺失数据的处理有影响),以及
  2. 演示 Python 的用处缺少 库。

一些背景信息…对于这个分析,我使用了 Titanic 数据集,因为它易于访问(你可以在这里下载它)并且它不需要领域知识来理解数据(例如,不像医疗保健数据)。我没有把它分成训练集和测试集,因为这里的目标只是覆盖(和发现)缺失数据的问题。最后,所有代码都是 Python。

步骤 1:做一些探索性的数据分析(EDA)

EDA 对于理解数据集的特征以及(特别是与当前主题相关的)发现任何可能隐藏的缺失值是至关重要的。你可以用无数种方式来分析泰坦尼克号的数据,但这里有一些我制作的图表,应该足以满足我们的目的。

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

Insights from EDA help inform treatment of missing data

第一行按性别划分人口。如你所见,男性数量超过女性,比例约为 65/35。然而,在生存问题上,雌性占优势。接近 75%的女性存活下来,相比之下只有不到 20%的男性存活。对于任何看过泰坦尼克号的人来说,这并不奇怪——妇女和儿童首先登上救生艇。总的来说,男女的平均年龄非常接近(女性 27 岁,男性 29 岁)。

第二行是事情变得更有趣的地方。我们看到船上大多数人都是 3 等(换句话说相对贫穷)。大多数伤亡属于第三类也就不足为奇了;穷人最后才登上救生艇,如果有的话。另一个观点是,不同阶层的中值年龄差异很大。最后,所有第二行图表上都有一个神秘的问号——它是一个伪装成真实值的空值!

*从 EDA 中,我们已经获得了一些关键的见解,这些见解将延续到我们对缺失数据的分析中。*我们必须转换“?”转换为空值/缺失值,并决定如何处理它,我们知道乘客等级和性别可能会成为我们可能需要做的任何插补的因素。

步骤 2:识别数据中缺失的类型

缺失数据机制

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

Source: From my research, this is the consensus framework for treating missing data

识别缺失类型有助于缩小处理缺失数据的方法范围。缺失数据机制是标准框架。其中,有三种类型的缺失:

  1. **完全随意失踪(MCAR)。**缺失值与观察到的或缺失的数据集中的其他值没有关联。“没有任何系统性的事情发生,使得一些数据比其他数据更有可能丢失(分析因素)。”例如,如果一个班里的几个学生有一天因为他们自己的原因碰巧缺席,那就是 MCAR。
  2. 随意失踪(MAR)。“缺失值的倾向和观察到的数据之间有系统的关系,但是没有缺失数据。”此外,还有一个无法直接观察到的潜在原因。继续我们的课堂例子,现在是流感季节,一些学生生病了。
  3. **不随意遗漏(MNAR)。**缺失和它的值有关系,缺失或非缺失。某种价值的缺失,取决于真正的价值本身。扩展前面的例子,假设有一个全州范围的标准化考试日,许多学生缺席。也许对标准化考试没有安全感的学生最有可能缺席。缺失数据是否因为实际值而缺失是一个很难回答的问题。在我们的课堂例子中,问题是最有可能在考试中表现不佳的学生是否被遗漏了。

有一些测试可以诊断缺失数据的类型,如 MCAR 的Little’s Test,但是区分 MAR 和 MNAR 的唯一正确方法是测量一些缺失数据。然而,这在大多数情况下是不可能的,因此*对缺失类型的分类实际上是分析缺失数据中的模式,并依靠领域专业知识来指导决策。*幸运的是,有一个简化缺失模式评估的库。

**探索缺失数据的一个好方法是用 missingno 可视化它。**首先要看的图表是无效矩阵。在泰坦尼克号的数据集中,在我们替换了“?”之后值为空值时,矩阵显示有四列数据缺失(乘客等级、年龄、客舱分配和乘客登机的港口)。您可以对功能集中的任何列进行排序,以观察缺失之间的潜在关系。Pclass 和 Age 中有缺失值,但它们似乎与其他缺失值不相关。这是 MAR 的典型情况,因为可能有无法直接观察到的丢失值的原因。在这种情况下,悲剧发生后很难保存记录。

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

Nullity Matrix from Missingno Library

另一个伟大的可视化是条形图。它给出了每个特征的缺失程度的更多细节。我们看到,Pclass 丢失了大约 5 %, Age 丢失了 20 %,而 Cabin 几乎丢失了。

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

Bar Chart from Missingno Library

最后两个图表允许我们进一步探索相关性(即列之间缺失的相关性)。热图函数显示不同要素的缺失值之间没有强相关性。这很好;低相关性进一步表明数据是错误的

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

Heatmap from Missingno Library

树状图功能创建缺失的树形图。它通过将相似的缺失列分组来描述缺失的相关性。特征为零,完全预测对方的存在。一个变量可能总是为空,而另一个变量被填充,或者它们可能总是都被填充,或者都为空(没有遗漏文档)。查看泰坦尼克号数据集,船上的失踪倾向于更类似于 Pclass 而不是 Age 等等。

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

Dendrogram from Missingno Library

步骤 3:处理缺失的数据

既然我们已经确定了数据中的缺失,让我们讨论一些处理它的主要方法。

**删除。**优点:简单;CONS:假设 MCAR 并引入偏见,如果不是 MCAR 的话。下面重点介绍了三种类型,但您可以在⁴.的统计解决方案找到更全面的讨论

  • 列表式删除(完整案例分析)删除有一个或多个缺失 values⁴.的记录的所有数据
  • 成对删除(可用案例分析)利用记录中没有丢失的特征。例如,相关性衡量两个变量之间的强度。对于每一对有数据的变量,相关系数将把这些数据考虑进去。因此,成对删除可以最大限度地利用 basis⁴.分析的所有可用数据
  • 当特征的大部分数据为缺失值时,执行列删除

单一插补。

  • 均值/中值插补通过用集中趋势的测量值替换缺失值来完成。优点:相对简单;CONS:减少差异
  • 热甲板法是一种将缺失值与具有非缺失值的相似观测值进行匹配,并用相似的非缺失 observation⁵.值对缺失值进行估算的技术两种方法是最近邻法和匹配模式法。优点:受教育程度更高;CONS—计算成本更高,耗时更长
  • 单一回归插补中,数值由回归方程预测。具有完整特征的观测值用于预测缺失数据的值。因为单一回归假设缺失值落在回归线上,所以它减少了 variance⁵.
  • 随机回归旨在通过用残差项增加每个缺失值的预测值来减少偏差。以这种方式,方差被保留,并且估计是无偏的

**多重插补。**优点:不偏不倚;CONS:复杂

  • 链式方程多元插补(MICE) 是较为流行的多元插补方法之一。多重插补比其他缺失数据方法有许多优势。建立多重插补,而不是单一插补,说明了插补的统计不确定性。此外,链式方程方法非常灵活,可以处理不同类型的变量(例如,连续变量或二元变量)。多重插补涉及多次填充缺失值,从而产生多个“完整的”datasets⁶.

敏感性分析

  • 最佳-最差和最差-最佳情况敏感性分析可用于显示由于缺失数据导致的不确定性范围。敏感性分析可以显示不同于主要分析的假设如何影响 obtained⁷.结果参见这篇来自 BMC 医学研究的论文以获得进一步的解释。当您的数据是 MNAR 时,这是最佳解决方案。否则,收集更好的数据。

结论

在本文中,我提供了一个有用的框架和库,用于分类和可视化丢失的数据。在本系列的剩余部分,我将对缺失的泰坦尼克号数据应用上述的一些插补方法,并探索每种方法的效果。

参考

[1] G. Press,清理大数据:最耗时、最不愉快的数据科学任务,调查显示 (2016),福布斯

[2] K. Grace-Martin,如何诊断缺失数据机制 (2019),分析因素

[3] Bilogur, Missingno:一个缺失的数据可视化套件 (2018),开源软件杂志,3(22),547

[4]统计解决方案,缺失数据:列表式与成对式,统计解决方案博客

[5] I. Eekhout,单一插补方法,Iris Eekhout 博客

[6] M. Azur,E. Stuart,C. Frangakis,P. Leaf,链式方程的多重插补:它是什么,如何工作? (2011),《国际精神病学研究方法杂志》

[7] J. Jakobsen,C. Gluud,J. Wetterslev,P. Winkel,在随机临床试验中,何时以及如何使用多重插补法处理缺失数据——流程图实用指南 (2017),BMC 医学研究方法 17,162

R 中 tidyverse 的值可视化缺失

原文:https://towardsdatascience.com/missing-value-visualization-with-tidyverse-in-r-a9b0fefd2246?source=collection_archive---------11-----------------------

关于如何使用 ggplot2、dplyr、tidyr 查找和可视化缺失数据的简短实用指南

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

探索性数据分析(EDA) 期间,寻找缺失值是一项重要任务。它们会影响机器学习模型的质量,需要在训练模型之前进行清理。通过检测缺失值,您还可以评估数据检索过程的质量。这个简短的实用指南将向您展示如何找到缺失的价值,并通过 tidyverse 生态系统将它们可视化。 tidyverse 是数据科学的 R 包集合。在他们的主页上写道“…所有的包共享一个潜在的设计哲学、语法和数据结构。”

数据集

该数据集是从一个电子商务网站上刮下来的,包含产品数据。您可以通过评估缺失值来检查数据检索的质量。具有大量缺失值的要素可能表明该要素的提取逻辑存在问题,或者数据由于其他原因而缺失。

df %>% 
   head(10)

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

数据集包含 11 个变量,共 2172 行。

缺少值的表

您可以对数据集中每个要素的缺失值进行计数:

missing.values <- df %>%
    gather(key = "key", value = "val") %>%
    mutate(is.missing = is.na(val)) %>%
    group_by(key, is.missing) %>%
    summarise(num.missing = n()) %>%
    filter(is.missing==T) %>%
    select(-is.missing) %>%
    arrange(desc(num.missing))

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

您可以使用 tidyr 的 gather 函数将列折叠成键值对。然后,创建一个新的逻辑特征,在缺少值的情况下该特征成立。您对键和新逻辑特征进行分组以进行计数。然后过滤逻辑特征以获得缺少值的计数。您跳过不需要的行,并根据缺少的值的数量进行排序。

可视化丢失的数据

表格及其行和列由我们的语言系统读取。这个系统非常慢。

图形与我们的视觉系统互动,比语言系统快得多。这就是为什么在大多数情况下你应该使用图表而不是表格的原因。

您可以在 ggplot2 中用一个简单的条形图直观显示上面的聚合数据集:

missing.values %>%
  ggplot() +
    geom_bar(aes(x=key, y=num.missing), stat = 'identity') +
    labs(x='variable', y="number of missing values", 
         title='Number of missing values') +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))

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

您可以通过计算每个要素缺失值的百分比来改进该图。这样更有意义。通过交换轴可以改善视觉外观,使特征名称更具可读性。根据长度对条进行排序是另一个改进。正确的轴标签总是必须的。使用红色作为缺失值(=坏)的视觉提示是因为红色代表危险,你必须采取行动。

missing.values <- df %>%
  gather(key = "key", value = "val") %>%
  mutate(isna = is.na(val)) %>%
  group_by(key) %>%
  mutate(total = n()) %>%
  group_by(key, total, isna) %>%
  summarise(num.isna = n()) %>%
  mutate(pct = num.isna / total * 100) levels <- (missing.values  %>% filter(isna == T) %>%     
           arrange(desc(pct)))$keypercentage.plot <- missing.values %>%
      ggplot() +
        geom_bar(aes(x = reorder(key, desc(pct)), 
                     y = pct, fill=isna), 
                  stat = 'identity', alpha=0.8) +
        scale_x_discrete(limits = levels) +
        scale_fill_manual(name = "", 
                          values = c('steelblue', 'tomato3'), 
                          labels = c("Present", "Missing")) +
        coord_flip() +
        labs(title = "Percentage of missing values", 
             x = 'Variable', y = "% of missing values")percentage.plot

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

在这个图中,您以与前面类似的方式汇总数据:不是计数,而是计算百分比。然后将数据链接到 ggplot 可视化部分。

该图显示您在产品尺寸(dim_x,dim_y,dim_z)的特征的抓取过程中遇到了问题:几乎 100%的值都丢失了。您可以看到 sales.rank、sales 和 reviews.count 有相同数量的缺失值。这些值似乎相互关联。

您可以通过绘制数据集中的每一行来以另一种方式显示缺失值,以获得进一步的见解。

row.plot <- df %>%
  mutate(id = row_number()) %>%
  gather(-id, key = "key", value = "val") %>%
  mutate(isna = is.na(val)) %>%
  ggplot(aes(key, id, fill = isna)) +
    geom_raster(alpha=0.8) +
    scale_fill_manual(name = "",
        values = c('steelblue', 'tomato3'),
        labels = c("Present", "Missing")) +
    scale_x_discrete(limits = levels) +
    labs(x = "Variable",
           y = "Row Number", title = "Missing values in rows") +
    coord_flip()row.plot

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

这个图可以让你发现我们的条形图中找不到的模式。您可以看到不同要素的缺失值之间的联系。

特性 sales_rank 和 sales 的缺失值实际上是相互关联的。这是你所期望的。在条形图中,您可以看到 reviews_count 具有大约相同百分比的缺失值。您可能会期望与销售和销售排名相关联。我们的第二个图显示没有关联,因为值在不同的行中丢失。

您可以用 gridExtra 包将这两种可视化合二为一。

grid.arrange(percentage.plot, row.plot, ncol = 2)

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

结论

您以两种方式可视化了数据集中的缺失值,这为您提供了关于数据集中缺失值的不同见解。这样,您可以找到数据抓取器逻辑中的弱点。您可以看到 ggplot2 中的图形语法和 dplyr 中的数据操作语法是非常强大的概念。

2019 年 2 月 5 日由延斯·劳弗撰写

随意分享!

原载于 2019 年 2 月 5 日【jenslaufer.com】

缺少值—不要丢弃它们!

原文:https://towardsdatascience.com/missing-values-dont-drop-them-f01b1d8ff557?source=collection_archive---------21-----------------------

作为我招聘过程的一部分,我让潜在的数据科学候选人进行数据挑战。数据挑战要求候选人接受提供的数据,通过模型开发过程,并以分类模型结束。除非我在高层招聘,否则我不会期望整个数据科学工作流程尽善尽美——在高层,我会寻找一种深思熟虑、符合逻辑的方法来解决手头的问题。这通常暴露在代码的前 50 行中,其中候选项基于缺失值的任意阈值丢弃特性。我见过 40%、80%以及介于两者之间的各种水平。我也看到过因为缺少一个值(超过 100 个特征中的一个)而丢弃整个观察值的情况。由于这种… 激进的缺失值处理方法,一名候选人最终放弃了超过 50%的观察值。

最终,阈值并不重要,重要的是我们放弃了这些特性,甚至没有考虑特性是什么,以及缺少值意味着什么。实际上,我最后明确地问过一个候选人这个问题。我收到了大约 10 个连续的数据挑战,每个挑战都丢失了 70%以上的值。她的挑战的其余部分相当不错,所以我直截了当地问她,在没有探索这个特性的情况下,你怎么会认为这是个好主意呢?她的回答大致是“我在网上看到有人这么做了。”再说一遍,这些都是初级角色,我不追求完美。然而,这不是我获得工作的方式——我们可能无法就解决问题的正确方法达成一致,但我需要执行某些步骤的合法理由。

随机与系统缺失值

我们正在处理的缺失价值观在我们如何对待它们的问题上扮演着重要角色。在的报告(第 2.1 节,但实际上,您应该阅读全部内容)中,阅读关于系统和随机缺失值的内容是非常值得的。此外,一个奇妙的旁注, pyvtreat 现在在 PyPi 上发布!

不管怎样,系统的和随机的缺失值有什么区别,更重要的是,为什么有关系?

  • 系统性的:值缺失有一些逻辑上的原因。有可能这个特性不适用于观察。
  • 随机:数据收集随机失败,缺少值没有特定的业务/流程原因。可能导致随机缺失值的几个例子是传感器故障或流程中断。

这是两种截然不同的情况,因此应该区别对待。在我们有系统性缺失价值的情况下,缺失的价值对整个过程有意义——它的缺失是有原因的。这使得总括方法成为一种无效的方法——我们应该仔细考虑如何处理每个特性的缺失值,而不仅仅是考虑这种适当的处理:

df.fillna(0,inplace=True)

具体例子

我在这里经常引用的例子是 Lending Club 数据集中的一个特征,自上次拖欠以来的几个月。大约少了 65%。这个特性测量的是贷款申请人有一个拖欠账户已经有多长时间了,这在表面上看起来很重要,但是很多申请人最终放弃了它!回想一下随机缺失值和系统缺失值,您认为这种情况会发生在哪里?这很可能是一个具有系统性缺失值的功能,它之所以缺失是因为它不适用,或者更明确地说,他们没有拖欠账户。以下是我见过的一些针对这一特征(以及所有其他特征)的处理方法:

  • 用 0 填充—这告诉我们的算法,自他们上次拖欠以来已经过了 0 个月(意味着它基本上发生在昨天)。这给了我们的算法大量不正确的信息和噪音
  • 用中位数填充——这个没那么可怕,但是真的不准确。同样,我们假设这是一个系统性缺失的值。填充中间值意味着 50%有过犯罪行为的人口有更长的时间,因此看起来风险更小。在现实中,这可能会为算法创建一个令人困惑的非线性关系,因为中位数两边的数据可能比中位数风险更大。
  • 放下观察/特写——阅读文章标题!

关于违约率的一些信息以及它与这一特性的关系。如果价值较低,比如不到一年,违约率约为 24%。随着拖欠时间的增加,该值呈下降趋势,最终约为 21%。没有拖欠债务的人口的违约率徘徊在 18%左右。这个特性中肯定有一些预测能力,而上述方法不允许这个特性以它所能达到的预测能力运行。相反,我们有办法填充这个值,以防止算法迷失在噪声中。

  • 用负数填充—这对于基于树的模型或其他非参数方法特别有用。这里的真值应该≥ 0,所以负数会把这个总体拆分成一个单独的类别。但是如果我处理的是线性模型呢?
  • 填入一个较大的值-拖欠时间越长,该客户的风险越低,因此我们可以填入一个较大的值,向我们的模型表明该人群的风险低于其余人群。

如果我选错了方法怎么办?

所有这些都有点像猜谜游戏。很多时候,很难真正知道这些值是随机丢失的还是系统丢失的,除非您公司的数据收集实践非常强大且记录良好,并且非常了解上下文以及它与您的分析的关系。如果我选择了错误的方法会发生什么?有一件事你应该永远做,努力给你的算法完整的信息,万一你选择了一个令人难以置信的可怕的方法。有一件事(同样来自精彩的 vtreat 论文):创建一个新的二进制特征,作为该值最初是否丢失的标志。如果您的新要素缺失,则该要素的值为 1,如果有值,则该要素的值为 0。对于这一具体特征,这基本上是一个“他们是否有过拖欠”标志,它显然对你的预测非常有帮助。

数据科学是一个艰难的领域,要求候选人和从业者在处理问题的方式上具有逻辑性和智慧。数据科学工作流程中最具挑战性也是最重要的部分之一是处理杂乱的数据。你处理这件事的方式显示了你将手头的问题概念化并提出一个可靠的解决方案的能力,同时为你的模型提供了巨大的提升。这一步带来的提升几乎和特性工程一样重要,但是后面会有更多的介绍!

有问题吗?反馈?想聊聊数据科学和数据策略?伸出手来!https://www.linkedin.com/in/brettnebeker/

错误的身份:为什么媒体使用人形机器人来代表人工智能是个坏消息

原文:https://towardsdatascience.com/mistaken-identity-why-the-media-using-humanoid-robots-to-represent-ai-is-bad-news-c2c1e8a9cb62?source=collection_archive---------24-----------------------

用闪闪发光的银色机器人男人的图片来代表 AI,一直都很讨厌。这也有损害行业的风险。

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

“Am I the problem?”

在 2018 年的一篇伟大的文章中,亚当·盖特吉痛斥“人工智能的真正丑闻:糟糕的股票照片”。他捕捉到了“拨弄键盘的机器人手指”和“1998 年的机器人通用 3D 模型”的天真和可预测性,这些模型用于说明关于人工智能的文章。当时,最佳实践人工智能团队正在整理成千上万的文章,以建立我们开放的人工智能用例及案例研究库,所以这一点很重要;我们笑了,并热情地转发了这篇文章。

本周,我在英国上议院就人工智能问题向跨党派议会小组提供了证据。我在台上与埃森哲(Accenture)和微软(Microsoft)等公司的名人讨论企业采用的障碍。一个反复出现的话题是高管教育。显然,人工智能和机器学习不是简单的话题——理解它们需要时间,我们仍在计算新技术将产生什么样的经济和商业影响。闪亮的银色机器人通常被用来说明解释这一切的文章。

但我越来越清楚,闪亮的机器人插图正在为技术和行业积累问题。

  1. 首先,它设定的期望值太高。狭义(以任务为中心的工具)和一般(一般人类智能)人工智能之间的区别很重要。后者离科学的飞跃还有一段距离——前者就在我们身边。然而,将这种技术想象成闪闪发光的银人表明,这种技术是关于后者的,并将在一夜之间改变世界。不会的。
  2. 其次,它误导了 AI 可以和应该用于的东西。如果被认为是更平凡的东西——“有态度的电子表格”是一种讨论中的描述——那么它将更好地帮助非技术人员想象他们可能使用技术做什么。
  3. 这表明人工智能的主要潜在商业利益是通过工作自动化取代人类。研究人工智能的组织刚刚开始将他们的问题从“这项技术能做什么?”到“使用这项技术的投资回报率(ROI)是多少”?在这里,人形机器人的心理形象是有问题的,因为它推动了对自动化和用机器人取代人类工作的关注。到目前为止,人类工作替代的例子比宣传的更有限。众所周知,自动取款机的引入与银行职员数量的增加是并行的,类似的事情也可能发生在客服聊天机器人身上。
  4. **这让高管们很难看到人工智能带来的真正商业利益。**当机器开始阅读来自病人的医疗扫描时,在商业或社会层面上,受益的将不是看扫描的员工数量的潜在减少。这将是一个消除流程瓶颈和引入常规先发制人扫描的机会,从而挽救许多人的生命。扩大以前的短缺具有巨大的经济和社会效益——而这并不是通过估算(边际)FTE 减少量来最好理解的。
  5. 它强化了人工智能潜在的恶性形象——模糊了“人工智能伦理”问题的真正来源。电影 iRobot 向我们展示了漂亮闪亮的银色机器人成为黑暗面的代理人,迎合了几代人关于机器背叛其制造者的负面故事。更紧迫的是,人们更容易相信这些算法是“种族主义者”或“性别歧视者”,而不是相信它们被灌输了糟糕的人类生成的数据。如果我们围绕人工智能的伦理问题沟通不畅,那么解决这些问题将变得更加困难。
  6. 最后,这将有助于对感知的“炒作”产生过度反应。在未来几年的某个时候,人们将评估人工智能分娩的现实。自动驾驶汽车还需要 5 年时间。闪亮的银色机器人仍将是虚拟的。他们会失去兴趣。对他们来说,这将是一个错误——就像 2000 年 dot.com 股灾后远离互联网一样。因为人工智能将改变世界——只是(还)不是以人形的形式。

因此,这不可避免地提出了一个问题——使用什么样的图像更好?感谢你的想法。

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

Get real

数据科学家犯的十二个错误

原文:https://towardsdatascience.com/mistakes-data-scientists-make-e915abd3b2df?source=collection_archive---------19-----------------------

成为更好的数据科学家

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

Nepal — photo by author.

专家是在一个非常狭窄的领域里犯了所有可能犯的错误的人。

尼尔斯·玻尔——量子物理学家

本文列出了我自己和其他人在学习和实践数据科学时经常犯的错误。

**模式存在于科学家犯的数据错误中——**在这里你也可以从中学习:

  1. 不标绘目标,
  2. 不考虑维度,
  3. 学习率太高,
  4. 不去想错误从何而来,
  5. 不理解偏差和差异,
  6. 对全连接神经网络的宽度和深度的痴迷,
  7. 不关注 PEP 8,
  8. 不放弃目标,
  9. 不缩放目标或特征,
  10. 在开发过程中不使用数据样本,
  11. 覆盖原始数据,
  12. 不使用$HOME 存储数据。

1.不标绘目标

预测是数据科学家和数据分析师的区别。数据分析师分析过去,数据科学家预测未来。

数据科学家通常使用监督机器学习来进行预测。监督学习的基本过程是使用特征x来预测目标y

理解目标的分布是任何监督学习项目的第一步。目标的分布会影响数据科学家的许多决策,包括:

  • 使用什么模型,
  • 是否需要缩放,
  • 如果目标具有应该被移除的异常值,
  • 如果目标不平衡。

我们预测的目标可以是连续的数字(回归),也可以是离散的类别(分类)。

回归目标

在回归问题中,数据科学家希望了解目标的以下信息:

  • 最小值和最大值,
  • 目标是如何正常分布的,
  • 如果分布是多模态的,
  • 如果有异常值。

直方图将回答所有这些问题,使其成为在回归问题中可视化目标的绝佳选择。下面的代码生成了一个包含四个分布的玩具数据集,并绘制了一个直方图:

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

直方图显示了生成该数据集的两个正态分布和两个均匀分布。

分类目标

在分类问题中,数据科学家希望了解目标的以下信息:

  • 有多少个班级,
  • 班级的平衡程度如何。

我们可以用柱状图来回答这些问题:

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

柱状图表明我们有三个班级,并且表明我们的“做梦”班级代表不足。

2.不考虑维度

维度为理解世界提供了结构。

低维数据的价值

低维表示比高维表示更有价值。这是因为在低维空间做决策更容易。

以决定是步行还是乘公共汽车为例——这个决定取决于是否下雨。

如果给你一个天气的高维表示(比如卫星图像中的像素),在你决定如何旅行之前还有很多工作要做。

相反,如果您可以访问天气的低维表示(例如下雨的概率),则可以仅使用单个阈值参数来做出决策。商业中的许多其他决策都是低维的——比如去/不去或者一个项目或者雇佣/不雇佣。

请注意,数据科学家的大部分工作都是使用机器学习来降低维度:

  • 使用卫星图像中的像素来预测太阳能输出,
  • 使用风力涡轮机性能数据来估计未来故障的概率,
  • 利用客户数据预测客户终身价值。

每个低维输出可以被一个业务方式使用,而高维数据不能

与高维原始数据输入不同,低维输出可用于决策:

-太阳能输出可用于指导能源交易商的行动,
-高风力涡轮机故障概率可导致派出维护团队,
-低客户寿命估计可导致营销预算资金减少。

以上是预测和控制相互作用的例子。你越能预测这个世界,你就越能控制它。

这也是数据科学家的工作定义——做出导致行动的预测——改变企业运营方式的行动。

高维数据的挑战

在高维空间工作的困难是维度的诅咒

为了理解维数灾难,我们需要对数据的空间密度进行推理。

我们可以想象一个密集的数据集——在一个小空间内有大量不同的样本。我们也可以想象一个稀疏的数据集——一个大空间中的少量样本。

当我们添加维度时,数据集的密度会发生什么变化?它变得不那么密集,因为数据现在更加分散。

然而,随着维度的增加,数据密度的降低不是线性的,而是指数性的。随着维度的增加,空间变得更加难以理解。

为什么增长是指数级的?因为这个新维度不仅需要根据其他维度(线性)来理解,还需要根据其他维度与其他维度的组合来理解**。**

这种组合与其他组合一起导致指数增长。

这是维度的诅咒——随着我们增加维度,空间呈指数增长。下面代码显示了这种效果:

空间的大小越大,机器学习模型需要做的理解工作就越多。

这就是为什么在没有信号的情况下添加功能是痛苦的。模型不仅需要了解它的噪声,还需要考虑噪声如何与每隔一列的每个组合进行交互。

数据科学工作流中应用维度诅咒的四个领域

从理论上理解维度是第一步。接下来是在数据科学的日常实践中应用它。下面我们将通过几个实际案例来说明数据科学家无法将维数灾难应用到他们自己的工作流程中。

1.过多的超参数

数据科学家可能会浪费时间进行过多的网格搜索——在时间和计算上都很昂贵。复杂网格搜索的动机来自一个好的地方——对好的(甚至是完美的)超参数的渴望。

然而,我们现在知道,只增加一个额外的搜索就意味着训练模型的指数增长——因为这个新的搜索参数需要结合其他所有搜索参数进行测试。

另一个错误是窄网格搜索 —在小范围的超参数上搜索。对数标度比小的线性范围更能提供信息:

不同的项目需要不同数量的网格搜索,包括模型和它们的超参数。我发现我经常构建两个网格搜索管道:

-一个用于比较不同的模型(使用迄今为止为每个模型找到的最佳超参数)
-一个用于比较单个模型的不同超参数

我将从比较第一个管道中的模型开始,然后在第二个网格搜索管道中对单个模型做进一步的调优。一旦模型得到合理的调整,它的最佳超参数就可以放入第一个网格搜索管道。

对单个模型的微调通常是一次搜索一个参数(最多两个)。这使得运行时间很短,并且也有助于发展关于改变超参数将对模型性能产生什么影响的直觉。

2.太多功能

作为一名初级数据科学家,我有一个误解,那就是添加功能没有成本。把它们都放进去,让模型自己算出来!我们现在可以很容易地看到这一点的幼稚——更多的功能有指数级的成本。

这个误解来自于对深度学习的一个根本性误解。

看到计算机视觉中的结果,深度神经网络从原始像素中完成所有的特征工程工作,我认为对其他数据使用神经网络也是如此。我在这里犯了两个错误:

-不理解卷积神经网络的有用归纳偏差
-不理解维数灾难

我们现在知道添加更多功能的成本是指数级的。这也应该改变你如何看待一次性编码,这大大增加了模型需要理解的空间,数据密度低。

3.指标太多

在数据科学项目中,使用诸如培训或测试性能等指标来判断性能。

在行业中,数据科学家将选择与业务目标一致的指标。不同的指标有不同的权衡,数据科学家的部分工作是选择与业务目标最相关的指标。

然而,初级数据科学家报告一系列不同的指标是很常见的。例如,对于一个回归问题,他们可能会报告三个指标:

  • 平均绝对误差,
  • 平均绝对百分比误差,
  • 均方根误差。

再加上报告测试和训练错误(或每个交叉验证折叠的测试和训练),度量的数量变得太多,以至于无法浏览并做出决策。

选择一个最符合你业务目标的指标,并坚持下去。降低度量标准的维度,以便您可以对其采取措施。

4.太多模型

数据科学家很幸运能够获得许多开源包(如“scikit-learn ”)中模型的高质量实现。

当数据科学家重复训练一组模型,而没有考虑为什么这些模型应该并行查看的原因时,这可能会成为一个问题。线性模型被一遍又一遍地训练,从未见过笔记本外面的光。

我经常看到新的数据科学家训练线性模型、SVM 和随机森林。一个有经验的数据科学家只会训练一个基于树的集合(随机森林或 XGBoost),并专注于使用特征重要性来设计或丢弃特征。

**为什么基于树的集合是一个好的初始模型?**几个原因:

  • 它们可以用于回归或分类,
  • 不需要缩放目标或特征,
  • 训练可以跨 CPU 核心并行化,
  • 它们在表格数据上表现良好,
  • 特性的重要性是可以解释的。

3.学习率太高

如果在训练神经网络时有一个值得研究的超参数,那就是学习率。

**将学习速率设置得太高会使神经网络的训练不稳定。**学习率的作用很直观——更高的学习率意味着更快的训练。

神经网络的第二个最重要的参数是批量大小。

批量大小不太直观 —较小的批量大小意味着较高的方差梯度,但是批量的一些值正在使用该方差来突破局部最小值。

一般来说,批处理大小应该尽可能大,以提高渐变质量-通常它会受到 GPU 内存的限制(尤其是图像)。

4.不去想错误从何而来

统计误差的三个来源是:

  • 抽样误差——使用对较大总体的子集估计的统计数据,
  • 抽样偏差——与其他样本相比具有不同概率的样本,
  • 测量误差——测量值与真实值之间的差异。

即使量化这些误差的大小通常是不可能的,定性地思考统计数据中的误差来自哪里仍然是有价值的。

思考训练和测试的采样和分布之间的差异有助于提高机器学习模型的泛化能力,以免它在生产中无法泛化。

错误的另一个有用的思考工具是 IID 的概念——数据应该是独立的&同分布的:

-独立采样(无采样偏差),
-同分布(无采样或测量误差)。

IID 是统计学习中关于数据分布和抽样质量的一个假设——而且几乎总是一个被打破的假设。

5.不理解偏差和差异

监督学习模型的预测误差有三个组成部分-偏差、方差和噪声:

  • 偏差是缺乏信号 —模型看不到可用于预测目标的关系。这是不合适的。可以通过增加模型容量(通过更多的层/树、不同的架构或更多的功能)来减少偏差。
  • 方差是信号的混淆噪声——训练数据中的模式,在测试时不会出现在数据中。这太合身了。可以通过添加训练数据来减少方差。
  • 噪音是难以控制的——一个模特能做的最好的事情就是避免它。

机器学习模型的错误通常是由于这三者的结合。通常,数据科学家将能够做出改变,导致偏差和方差之间的权衡。

数据科学家可以利用三个常用的杠杆来用偏差换取方差(反之亦然):

  • 增加模型容量 —增加模型容量会减少偏差,但会增加方差(额外的容量可用于适应噪声)。
  • 减少模型容量 —减少模型容量(通过正则化、剔除或更小的模型)将减少方差,但会增加偏差。
  • a 添加数据 —更多的数据将减少方差,因为模型有更多的例子来学习如何从信号中分离噪声。

更多的数据对偏倚没有影响。

更多的数据甚至会使偏倚变得更糟,如果额外的抽样是有偏倚的。

带有偏差的额外数据采样只会让您的模型有机会更精确地判断错误——有关偏差、采样偏差和数据量之间关系的更多信息,请参见 Chris Fonnesbeck 关于数据科学统计思维的演讲。

6.痴迷于全连接神经网络的宽度和深度

对全连接神经网络架构的痴迷伴随着构建它们的过程。构建神经网络需要定义架构——这肯定很重要吧?

然而,当谈到完全连接的神经网络时,架构并不真的那么重要

只要你给模型足够的容量和可感知的超参数,一个全连接的神经网络将能够学习具有多种架构的相同功能。让你的渐变和你赋予它们的容量一起工作。

一个恰当的例子是 2015 年的强化学习论文信任区域策略优化,它使用一个简单的前馈神经网络作为移动任务的策略。运动任务使用平面输入向量,具有简单的全连接架构。

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

Schulman et. al (2015) Trust Region Policy Optimization

完全连接的神经网络的正确思维模式是深度为两到三,宽度设置在 50 到 100 之间(或者 64 到 128,如果你想融入酷的计算机科学人群)。如果您的模型是低偏差,考虑通过另一层或额外的宽度增加容量。

简单全连接架构的一个有趣改进是宽&深架构,它将宽记忆功能交互与深不可见的学习功能组合混合在一起。

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

Cheng et. al (2016) Wide & Deep Learning for Recommender Systems

7.没有关注 PEP 8

程序必须写给人们阅读,并且只是附带地给机器执行。

艾贝尔森&苏斯曼——计算机程序的结构和解释

代码风格很重要。我记得我很困惑,为什么更有经验的程序员对代码风格如此挑剔。

编程五年后,我现在知道他们来自哪里。

以预期方式布局的代码需要更少的努力来阅读和理解代码。

糟糕的代码风格会给读者带来额外的负担,让他们在考虑实际代码之前就理解你独特的代码风格。

8.不放弃目标

如果你曾经得到一个训练误差极低的模型,很可能你的目标是一个特征。

我们都做过一次。

9.不缩放目标或特征

这是我在调试机器学习项目时给出最多的建议。每当我看到高亏损(高于 2 或 3),这是一个明确的信号,表明目标没有被调整到一个合理的范围。

规模很重要,因为未缩放的目标会导致较大的预测误差,这意味着较大的梯度和不稳定的学习。

我所说的扩展是指标准化:

或标准化:

请注意,这些东西的名称之间缺乏一致性——规范化通常也称为最小-最大缩放,甚至标准化!

以下面的例子为例,我们试图从发言人数和开始时间来预测有多少人参加了一个讲座。我们的第一个管道没有缩放特征或目标,导致大的误差信号和大的梯度:

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

我们的第二个管道需要时间来适当地缩放特征和目标,从而产生具有适当大小梯度的误差信号:

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

类似的逻辑也适用于特征——未缩放的特征可以支配和扭曲信息通过神经网络的方式。

10.在开发过程中不使用数据样本

在编写处理数据的代码时,这是一个显而易见的问题——如果每次修复 bug 时都使用完整的数据集来运行数据处理,这将是开发人员时间上一个代价高昂的错误。

您可以使用整数索引粗略地处理数据样本:

pandas允许您一次仅加载数据的一个子集(避免将整个数据集拉入内存):

控制调试

控制这一点的一个简单方法是变量——这就是你在 Jupyter 笔记本中要做的:

或者更简洁地使用命令行参数:

运行脚本data.py时可以控制:

11.覆盖原始数据

原始数据是神圣的,永远不应该被覆盖。这在程序内部和磁盘上都是正确的。

12.不使用$HOME 存储数据

这不是一个错误——但这是一个极大地简化了我生活的模式。

在 Python 中管理路径可能很棘手。有几件事可以改变路径查找 Python 的工作方式:

-用户克隆源代码
-虚拟环境安装源代码
-用户从哪个目录运行脚本

出现的一些问题是由这些变化引起的:

  • os.path.realpath将根据虚拟环境安装您的包的位置而变化
  • os.getcwd将根据用户运行 Python 解释器的位置而变化

将数据放在一个固定的、一致的地方可以避免这些问题 —除了用户的`HOME '目录之外,您不需要获取任何相关的目录。

解决方法是在用户的$HOME目录下创建一个文件夹,用它来存储数据:

这意味着您的工作是可移动的——对您的同事和远程机器都是如此。

感谢阅读!

如果你喜欢这篇文章,请随时在媒体上关注我,或者在 LinkedIn 上联系我。

请务必查看我的其他帖子:

[## 充分利用 Jupyter 实验室

下一代笔记本工具指南。

towardsdatascience.com](/getting-the-most-out-of-jupyter-lab-9b3198f88f2d) [## 丹尼尔·丹尼特的四种能力

理解计算控制算法的一个有用的想法。

towardsdatascience.com](/daniel-c-dennetts-four-competences-779648bdbabc)

原载于 2019 年 9 月 14 日https://adgefficiency.com

降低机器学习的风险

原文:https://towardsdatascience.com/mitigating-risk-of-machine-learning-2eac3f9f84ab?source=collection_archive---------10-----------------------

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

Photo by Markus Spike on Unsplash

当你的机器学习应用程序出现问题时,通常问题和风险会比原因更困扰你。根据麦肯锡的研究,以下因素会增加您的 ML 应用程序的风险

  • 数据困难
  • 技术问题
  • 安全障碍
  • 行为不端的模特
  • 互动问题

我们通常有适当的验证框架来减轻与高姿态应用程序相关的风险。故意修改现有的验证框架可以帮助缓和与复杂的机器学习相关联的风险,但这些往往被证明是徒劳的,无法克服机器学习应用程序提出的障碍。

对于像价格预测这样的 ML 应用程序,应用收入管理规则是有用的,例如通过机器学习算法来避免价格下降到阈值以下或达到天空水平。有时,您可以将决策保持在等待状态,以便进行手动验证。这种模型的含义可能是最小的,并且可以由这种验证或控制框架来控制。但机器学习决策往往非常敏感,在现实世界中需要超高的精度。随着这些算法变得复杂,与之相关的风险也变得复杂。

大多数情况下,由于与机器学习相关的风险和现有验证框架的无能,组织将努力达成共识,以将机器学习实施到他们的任务关键型应用程序中。还有其他因素导致机器学习没有达成共识。例如,组织正在努力应对如此复杂的处理所需的计算能力,大多数情况下,基础架构成本成为一个巨大的因素。对基础设施的担忧通常会导致云提供商的出现,但与云服务相关的数据风险同样会出现。无论如何,我们之前讨论的功能风险实际上造成了机器学习炒作曲线的自然下降。

对于机器学习,目前还没有业界公认的风险框架,但以下技巧可以减轻痛苦。

风险识别方法

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

Photo by Markus Spike on Unsplash

风险识别对组织来说并不新鲜,同样的原则和框架可以扩展到机器学习应用程序。找出机器学习算法做出的决策如何影响业务至关重要。因此,识别与机器学习模型相关的风险至关重要,因为它们会非常迅速地直接影响业务。例如,一个不必要的有偏见的产品推荐会很快让你的用户离开。此外,机器学习的演变和适应将非常快,可能没有时间来纠正初始阶段出现的错误。

增强验证框架和决策控制

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

Photo by Daria Nepriakhina on Unsplash

我们讨论了现有的验证框架,这些框架可以被增强以适应机器学习应用。我们要怎么做呢?

机器学习模型比传统程序更复杂,因为它们处理一组复杂的数据。战术设计决策应该在模型接受训练之前做出。与机器学习相关的风险将出现在从设想到实施的生命周期的几乎所有阶段。对验证框架的增强也应该覆盖几乎所有的生命周期阶段,因为它们以传统的方式存在,有了这些补充。

  • 透明度和可解释性:

机器学习模型通常是黑箱,有许多模糊的决策层。这使得应用程序的审计和可跟踪性非常具有挑战性。机器学习驱动的应用程序通常需要透明。组织渴望了解数据是如何被处理以做出决策的。如果你真的想将风险最小化,你的模型的开放性和可解释性应该被放在首位并被评估。

  • 特色工程:

建立机器学习模型是为了从数据中识别模式,而数据往往很复杂。由于数据的数量和性质,数据是复杂的。考虑非结构化数据进入自然语言识别的情况。在处理之前,通常需要特征工程将非结构化数据转换成结构化数据。这些过程也在快速改造,并且定制包装复杂,因为它们能够为模型评估进行不同的数据转换。随着它们变得越来越复杂,也应该进行风险评估。

  • 数据质量控制:

机器学习应用程序和传统应用程序的主要区别之一是从数据中学习模式的能力。传统的应用程序被绑定到它们被编程的路径上,并且一旦被部署就不能调整。机器学习模型能够从数据中获得洞察力,并据此采取行动。这种行为需要干净和高质量的数据,否则算法将无法提供预期的准确性。组织中存在的孤岛限制或阻碍了高质量数据的流动,使应用程序变得脆弱。

  • 超参数

超参数调整是大多数 ML 工作中的一种常用方法,可以通过多种方式实现。但是调优应该在运行模型之前完成。无论是默认值、手动配置还是程序配置,这些参数在优化算法方面都具有重要作用。数据驱动的模型优化是最小化数据集泛化的第二种方法,也可以在许多情况下找到。然而,这些变量的选择是由试错法驱动的,并依赖于启发式经验。

  • 模型偏差

应该考虑偏差的两个方面。我们都知道数据中确实存在偏倚,我们可以采取措施减少偏倚。当我们消除偏差时,模型精度将会提高。其中一个方面在用于分析的数据中,另一个方面在动态数据中。至关重要的是,现有模型的任何新参数都不应导致决策偏差。有时还需要将操作分阶段进行,以确保模型得到一致认可。考虑我们之前讨论的价格预测的例子。我们可能会引入分阶段定价,以了解客户的支付意愿,避免任何价格偏见。

  • 生产准备和校准

机器学习应用的一些情况需要反馈回路和基于实时反馈的改进。考虑强化学习或在线学习,这种对模型的实时更改可能会导致性能随着时间的推移而下降。这种校准有两个方面。一个是这种校准的需要,另一个是校准过程本身。

  • 模式治理

机器学习有两个阶段。一个是模型构建本身,另一个是为消费做好准备。大多数时候人们并不关心后面的部分。应该小心管理数量庞大且不断增长的生产模型,并且应该清楚地维护模型与其他对象的链接。

复习和巩固

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

Photo by André Bandarra on Unsplash

当您第一次在生产中部署机器学习应用程序时,这只是一个开始。您仍然需要仔细检查和强化您的模型,以支持环境、数据和参与者的变化。这对于降低与洗钱相关的风险至关重要。你可能需要一个专门的机器学习应用程序的所有者来持续监控应用程序,审查模型,并在需要时做出更改。

利用机器学习减缓气候变化

原文:https://towardsdatascience.com/mitigation-of-climate-change-with-machine-learning-197f09c00fac?source=collection_archive---------24-----------------------

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

Photo by @prijpkema Unsplash

能源、交通和建筑领域的商机

我目前的重点是人工智能的安全,因此我认为解决气候危机是这种情况下的最高优先事项——可以说是最高风险。在 6 月份的国际机器学习会议(ICML)上,6 月 14 日的会议当天,气候变化是一个明显的焦点。会议的所有视频和演示都可以在线观看。不过,我要说的是 6 月 10 日发布的一个帖子,与这次关于 climatechange.ai 的会议有关(这个页面很有用!)。我将简要地看一下 arXiv 上发布的一篇名为 用机器学习 应对气候变化的论文的一些片段。

这篇论文有 53 页长,所以我将只提供讨论内容的一瞥。本文关注不同的领域,我将在与缓解 相关的中涵盖其中的三个领域,简单总结几点来帮助您了解深入研究本文本身是否有价值。我将概述的三个领域是:

  1. 能源方面的机会
  2. 运输中的机遇
  3. 建筑行业的机会

呼吁合作

我最喜欢这篇论文的一点是,它立即被框定为合作的号召。作者强调,机器学习不是 【银弹】 。他们强调的应用是有影响力的,但他们同时认为没有一个解决方案可以“修复”气候变化。“…光有技术是不够的—减少气候变化的技术已经存在多年了,但很大程度上还没有被社会大规模采用。”

论文作者有:大卫·罗尔尼克、普里亚·l·东蒂、林恩·h·卡克、凯利·科昌斯基、亚历山大·拉科斯特、克里斯·桑卡兰、安德鲁·斯拉文·罗斯、尼古拉·米洛耶维奇-杜邦、娜塔莎·雅克、安娜·瓦尔德曼-布朗、亚历山德拉·卢乔尼、甘特·马哈拉杰、埃文·d·舍温、s·卡蒂克·穆卡维里、康拉德·科尔丁、、卡拉·戈梅斯、吴恩达、戴密斯·哈萨比斯、约翰·c·普拉特

缓解和适应

该文件首先概述了气候变化领域的几个已知事实,即排放量不断增加,却没有减少的趋势。然后就滚入了减缓 ( 减排)和适应 ( 为不可避免的后果做准备)的思路。这些不同的问题可以被视为产生影响的机会。

缓和是这篇短文 的重点。

这份报纸是给谁的?

在介绍之后不久,他们概述了针对这些不同群体的本文:

  1. 研究人员和工程师:鼓励解决方案,并通过论文中所做的工作来识别需要概念创新的领域。
  2. 企业家和投资者:几个商业机会被勾勒出来。其中有:电力公司的精细太阳能预报;帮助减少个人能源消耗的工具;以及对气候变化的金融影响的预测。
  3. 企业领导:确定商业案例,优化供应链以减少浪费,并为精准农业提供软件/硬件工具。
  4. 地方和国家政府:讨论如何为决策收集数据,并指导未来发展计划。他们强调智能交通系统;城市建筑能耗自动评估技术:和改善灾害管理的工具。

这份报告结构简单,用一系列标签将不同的类别分开,如高杠杆、长期和高风险。因此,如果你找到一个你想进一步探索的领域,并深入到论文的特定领域,这将对你有所帮助。你会很高兴地看到,它结构良好,并给出了一个容易访问的主题概述。

减缓气候变化

电力系统是机器学习技术可以发挥作用的第一个领域。人工智能被称为新的电力,因为它有改变整个行业的潜力。有趣的是,电力本身就是人工智能准备改造的行业之一。”

1.能源领域的机会

它们概述了社会在能源部门必须采取的关键行动:

  • 迅速过渡到低碳电力来源 (如太阳能、风能、水能、核能),逐步淘汰碳排放源(如煤炭、天然气和其他化石燃料)。
  • 减少现有碳排放发电厂的排放量 ,因为向低碳燃料的过渡不会一蹴而就。
  • 在所有国家和环境中实施这些变革 ,因为电力系统无处不在

这些是可以做到,并在以下方面进一步概述:(1)发电和需求预测;(2)改进调度和需求;(3)加速材料科学;(4)核裂变和核聚变;(五)核电厂;(6)减少生命周期化石燃料的排放;(7)减少系统浪费;(8)模拟排放;(9)改善电力供应;(10)低数据设置;(11)

2.运输行业的机会

在经历了能源方面的改进后,他们转向运输工作,以同样的方式陈述需要做的事情:

  • 减少运输活动 。目前,三分之二以上的运输排放来自公路旅行,但航空旅行的排放密度最高,而且所占份额越来越大。
  • 提高车辆效率 。ML 可以改进车辆工程,实现智能基础设施,并提供政策相关信息
  • 减少燃料的碳冲击 。致力于改善这些任务的物流,例如通过提供更好的需求预测,可以提高运输效率。通常,ML 解决方案与强有力的公共政策相结合是最有效的。
  • 转向低碳选项,像 rai l .电气化公路和铁路,可以有非常低的 GHG 排放——当然,假设电力主要由低碳发电机产生。

同样,这可以在以下方面进行探索:(1)理解运输数据;(2)建模需求;(3)共享移动性;(4)货运路线和整合;(5)为效率而设计;(6)自动驾驶汽车;(七)电动汽车;(8)替代燃料;(9)乘客偏好;(10)改善低碳选择。

3.建筑业的机会

建筑物消耗的能源占全球能源相关排放的四分之一,然而在论文中,他们声称结合易于实施的修复和最先进的解决方案可以将现有建筑物的排放减少 90% (乐观!)。今天,建筑物几乎不消耗能源是可能的。在这一节中,他们没有清楚地列出需要做什么,但是我会根据结构尽量压缩。它的主要焦点似乎集中在两个方面:

  • 优化建筑。在设计新建筑和改善现有建筑时,有许多技术可以降低成本和 GHG 排放。ML 可以通过(I)对能耗数据建模和(ii)优化能源使用(在智能建筑中)来加速这些解决方案。
  • 城市规划。地区一级的数据往往无法获得。最大似然法可以通过两种方式帮助获取数据:在存在单个建筑的能源使用数据的情况下,最大似然法可以用于推导更高层次的模式。在完全缺乏能源使用和基础设施数据的地方,ML 可以推断出来。
  • 城市运营中的数据最近,数据和 ML 在提高这些领域的效率方面变得越来越常见,从而引发了智慧城市的概念。虽然“智能城市”一词包含了各种各样的技术,但这里我们只讨论与减少 GHG 排放相关的应用。

进一步的小节包括:(1)能源使用模型;(2)智能建筑;(3)地区一级的能源使用;(4)收集基础设施数据;(5)智慧城市的数据;(6)低排放基础设施。

你会看报纸吗?

正如我在引言中提到的,我正在就此写一些笔记,以鼓励你更深入地研究这篇论文。当然,这份文件并不全面,只是概述了几个问题。在结论中,他们说:

像所有技术一样,机器学习并不总是能让世界变得更好,但它可以。在应对气候变化的斗争中,我们已经看到了 ML 在跨领域领域做出的重大贡献[…]我们强调 ML 只是解决方案的一部分;它是一个跨领域支持其他工具的工具。解决气候变化问题有可能造福社会,并为机器学习领域提供新的方向。我们设想的解决方案需要与计算机科学内外的领域进行对话,这不仅会带来新的应用领域,还会带来适用于整个 ML 的新的方法论见解。【加粗补充】

因此,本着他们结论的精神,我可以提出以下几点思考:

  1. 用 ML 做出改变
  2. 你在 ML 方面的努力只是解决方案的一部分
  3. 与其他领域合作

报告在结论中提出了另一套建议,我也将在此概述:

  • 。确定你的技能如何有用——我们希望这篇文章能提供一个起点。
  • 协作 。寻找合作者,他们可能是研究人员、企业家、已建立的公司或政策制定者。请记住,对于我们在这里讨论的每个领域,都有该领域的专家了解它的机会和陷阱,即使他们不一定了解 ML。
  • 。听听你的合作者说什么是需要的,并且更广泛地收集意见,以确保你的工作会产生预期的影响。突破性的技术会产生影响,但对世俗问题的精心构建的解决方案也会产生影响。
  • 部署 。确保您的工作部署在可以实现其影响的地方。我们呼吁机器学习社区将其技能作为应对气候变化的全球努力的一部分。

虽然简短,我当然希望这篇文章在某种程度上有所帮助。

感谢您的阅读。这是第 500 天的第 56 天。我每天写一篇关于人工智能的新文章。

混合绘图比例和自定义 violinboxplot 实现

原文:https://towardsdatascience.com/mixed-plot-scales-and-custom-violinboxplot-68cc8c5d6ead?source=collection_archive---------11-----------------------

混合比例图和自定义 violinboxplot

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

简而言之,这篇文章解决了以下两个问题:

1.我们如何创建具有远异常值的数据分布的综合可视化?

通常,我们使用线性和对数尺度(用于捕捉异常值),但在这里,我们将研究创建混合轴的可能性,以各种类型的尺度的任意混合,应用于所需的间隔。

2.根据数据分布,我们如何结合箱线图、紫线图和动态标度的优点?

我们将提出一个 violinboxplot 的自定义实现,提供广泛的自定义参数,这些参数控制异常值的呈现、模式和计数的自定义注释、基于任意百分点的线性/对数轴分割。它处理数据数组和按列列表分组的数据帧。

这篇博客中的所有例子都是用 python/matplotlib 实现的,可以在 Github 上找到。

混合 matplolib 轴秤

让我们首先选择一个函数(sin ),该函数将生成我们将用来演示混合秤概念的数据集。

x = np.arange(-80,80, 0.1)
y = np.sin(x)
plt.title('Linear scale plot of a sinusoid')
plt.xlabel('x')
plt.ylabel('y')
plt.plot(x, y);

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

如果我们把这个数据集当作一个黑盒,数据科学家可能会出于各种原因,希望以最小的努力,通过在不同的时间间隔使用不同的尺度,获得图形的动态分辨率。例如,他可能想想象:

  • 1 <= y <= 0.5 using a linear scale
  • 0.1 <= y <= 0.5 using a log scale
  • -1<= y <= 0.1 using a linear scale

The first naive solution is to create 3 different plots with the chosen axis scales on chosen intervals.
在这篇文章中,我们将探讨 matplotlib 在不同比例下显示原始图形的能力,从而提供统一的可视化。

在本帖中,我们将介绍两种方法:

  1. 使用轴分隔线
  2. 使用网格规格

轴分割器

**from** **mpl_toolkits.axes_grid1** **import** make_axes_locatable

Matplotlib 的函数 make_axes_locatable 允许我们在给定的轴上添加一个新的轴。在下面的示例中,对数轴是从原始线性轴创建的。
通过设置任意的 y 限制,我们可以控制渲染图的哪一部分,并且我们可以创建图连续性的印象。
Sharedx 参数允许共享同一个 x 轴,并防止 x 刻度标签被重新渲染。

plt.title('Split plot in 2 parts: linear: [0.5, 1] and log: [0.01, 0.5]')
linearAxis = plt.gca()
linearAxis.plot(x, y)
linearAxis.set_ylim((0.5, 1))divider = make_axes_locatable(linearAxis)
logAxis = divider.append_axes("bottom", size=1, pad=0.02, sharex=linearAxis)
logAxis.plot(x, y)
logAxis.set_yscale('log')
logAxis.set_ylim((0.01, 0.5));

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

我们可以在给定输入轴上的 4 个潜在位置(顶部/底部/上/下)使用附加轴。下面的代码说明了链接 2 个轴,在顶部和底部。

logAxis = plt.gca()
logAxis.plot(x, y)
logAxis.set_yscale('log')
logAxis.set_ylim((0.01, 0.5))divider = make_axes_locatable(logAxis)
linearAxis = divider.append_axes("top", size=1, pad=0.02, sharex=logAxis)
linearAxis.plot(x, y)
linearAxis.set_ylim((0.5, 1))
linearAxis.set_xscale('linear')
linearAxis.set_title('Plot split in 3 scales: linear: [0.5, 1], log: [0.01, 0.5], linear: [-1, 0.01]');linearAxis1 = divider.append_axes("bottom", size=1, pad=0.02, sharex=logAxis)
linearAxis1.plot(x, y)
linearAxis1.set_yscale('linear')
linearAxis1.set_ylim((-1, 0.01));

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

GridSpec implementation

另一个选择是使用 matplotlib 的 GridSpec,它在调整组件大小和使用方面提供了更多的灵活性。我们可以预先定义超级剧情的数量,它们的相对大小(height_ratios),支线剧情之间的距离(hspace)。
一旦创建了独立轴,我们就可以设置比例和所需的限制。

**import** **matplotlib.gridspec** **as** **grd**
gs = grd.GridSpec(3, 1, wspace=0.01, hspace=0.05, height_ratios=[0.33, 0.33, 0.33])ax1 = plt.subplot(gs[0])
ax2 = plt.subplot(gs[1])
ax3 = plt.subplot(gs[2])
ax1.set_xticks([])
ax2.set_xticks([])ax1.plot(x, y)
ax1.set_yscale('linear')
ax1.set_ylim((0.5, 1)) ax2.plot(x, y)
ax2.set_yscale('log')
ax2.set_ylim((0.01, 0.5)) ax3.plot(x, y)
ax3.set_yscale('linear')
ax3.set_ylim((-1, 0.01));

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

自定义紫色位图

让我们从生成几个反映多种场景的数据分布开始:

  • 反映高斯分布的单峰数据
  • 高斯数据与异常值的组合
  • 具有多个(7 个这样的分布)的数据集,说明了输入分布的比较可视化
  • 由一列或多列组成的数据帧,用来说明比较数据的分布
data1 = [np.round(np.random.normal(10, 0.4, 50), 2)]
data1SharpEnd = [[e **for** e **in** data1[0] **if** e > 9.9]]
data1Spread = [
    np.concatenate([
        np.round(np.random.normal(10, 0.2, 1000), 2), 
        np.round(np.random.normal(80, 0.3, 5), 2)
        ]) 
    ] data2 = [
    np.concatenate([
        np.round(np.random.normal(10, std/10, 1000), 2), 
        np.round(np.random.normal(80, std, np.random.randint(0, 24) * std), 2) ]) 
            **for** std **in** range(1, 7)
        ]
labels7 = ['A', 'B', 'C', 'D', 'E', 'F', 'G']

基于一个现有数据集,我们可以定义一个数据框架:

df = pd.DataFrame()
df['values'] = data1Spread[0]
df['col1'] = np.random.choice(['A', 'B'], df.shape[0])
df['col2'] = np.random.choice(['C', 'D'], df.shape[0])

为了更好地理解底层数据分布,让我们创建一个利用箱线图和紫线图的绘图函数:

**def** plotDistributions(inputData, title):
    *"""*
 *This method plots inputData with:*
 *- matplotlib boxplot*
 *- matplotlib violinplot*
 *- seaborn violinplot*
 *"""*
    globalMax = np.max(np.concatenate(inputData))
    globalMin = np.min(np.concatenate(inputData))

    plt.figure(figsize =(14, 4))
    plt.suptitle(title) plt.subplot(121)
    plt.grid()
    plt.title('Matplotlib boxplot')
    plt.boxplot(inputData, vert= **False**);
    plt.axvline(x = globalMax, c ='red', label = 'Global max', alpha = 0.5)
    plt.axvline(x = globalMin, c ='red', label = 'Global min', alpha = 0.5)
    plt.legend() plt.subplot(122)
    plt.grid()
    plt.title('Matplotlib violinplot')
    plt.violinplot(inputData, vert= **False**, showmeans=**False**, showmedians=**True**, showextrema=**True**);
    plt.axvline(x = globalMax, c ='red', label = 'Global max', alpha = 0.5)
    plt.axvline(x = globalMin, c ='red', label = 'Global min', alpha = 0.5)
    plt.legend()

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

我们可以使用 seaborn 来可视化数据帧

sns.violinplot(x = 'values', y='col1', data = df)
plt.figure()
sns.violinplot(x = 'values', y='col2', data = df)

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

但是,seaborn 希望只将 group by 中用于汇总结果的一列指定为 y。如果我们想要基于多个特征的组合进行聚集,我们必须在调用绘图函数之前进行。

在上面的图中,我们可以发现哪些缺点?

  • 如果能在一个图形中结合箱形图和小提琴图的分辨率就好了。Seaborn 通过内部参数提供了一种合并箱线图的方法,但其定制的可能性是有限的。
  • 如第二张图所示,如果我们正在处理一个有很大异常值的分布,整体可视化会丢失极端情况下的细节。如果我们可以使用第一部分中讨论的示例来创建一个定制的统一视图,并在目标间隔上使用任意的比例,会怎么样呢?

其他一些需要考虑的问题包括:

  • 我们如何使用自定义注释来丰富绘图,例如,为每个数据集指示点数和其他任意度量,如模式?
  • 能不能提供一个超参数,把我们认为是离群点的点都从可视化中去掉?

如果我们从这最后一点开始,我们可以想出一个方法,去掉所有大于给定标准偏差数(默认为 3)的点。

在上面的图中,我们可以发现哪些缺点?

  • 如果能在一个图形中结合箱形图和小提琴图的分辨率就好了。Seaborn 通过内部参数提供了一种合并箱线图的方法,但其定制的可能性是有限的。
  • 如第二张图所示,如果我们正在处理一个有很大异常值的分布,整体可视化会丢失极端情况下的细节。如果我们可以使用第一部分中讨论的示例来创建一个定制的统一视图,并在目标间隔上使用任意的比例,会怎么样呢?

其他一些需要考虑的问题包括:

  • 我们如何使用自定义注释来丰富绘图,例如,为每个数据集指示点数和其他任意度量,如模式?
  • 能不能提供一个超参数,把我们认为是离群点的点都从可视化中去掉?

如果我们从这最后一点开始,我们可以想出一个方法,去掉所有大于给定标准偏差数(默认为 3)的点。

**def** removeOutliers(data, thresholdStd = 3):
    *"""*
 *This method returns all values which are farther away*
 *than thresholdStd standard deviationa*
 *"""*
    noOutliers=[]
    mean = np.mean(data)
    std =np.std(data)
    **if** std == 0:
        **return** data **for** y **in** data:
        z_score= (y - mean)/std 
        **if** np.abs(z_score) <= thresholdStd:
            noOutliers.append(y)
    **return** noOutliers

violinboxplot 的实现

github 上找到完整代码。我们将只展示前面介绍的数据集的结果。该自定义实现呈现:

  • (可选)绿色表示每个分发的模式
  • (可选)在每一行的末尾返回每个分布的计数
  • 可以渲染或隐藏异常值
  • 可选的 logpercentile 指定一个百分比值(0.9),在该值下,渲染将以线性比例进行,该百分比值使用 logscale
  • 该方法可以将一组数组或一个数据帧作为输入,这些数组或数据帧可以通过一组列(y)来分组

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

在一列或多列上使用数据框架和聚合的结果:

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

未来的工作

未来的一项改进是自动检测所有渲染分布的模式,并通过使用上一篇文章https://github . com/ciortanmadalina/modality _ tests/blob/master/kernel _ density . ipynb中提供的代码来估计 PDF。这可以对一些感兴趣的区域进行估计,例如对数标度将是很好的选择。

使用 fastai 的混合精确训练

原文:https://towardsdatascience.com/mixed-precision-training-using-fastai-435145d3178b?source=collection_archive---------7-----------------------

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

介绍

图像分类是深度学习的 Hello World。对我来说,这个项目是用胸部 x 光检测肺炎(T2)。由于这是一个相对较小的数据集,我可以在大约 50 分钟内训练我的模型。但是如果我告诉你,只要增加一行代码

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

我们可以减少训练时间(理论上减少 50%),而不会显著降低精确度。但是首先…

为什么这很重要?

我使用的数据集包括大约 4500 张图片。它花了 50 分钟的唯一原因是因为图像是高清的。

然而,如果我们将同一个项目扩展到现实世界的应用程序,可能会有更多的图像。看看斯坦福的 Chexpert 数据集

此外,我训练了一个模型来预测一种疾病,但在现实中,我们将不得不预测比两类疾病更多的疾病。在这种情况下,减少培训时间确实是一个优势。这将降低资源成本,帮助我们更快地进行实验。那么我们该怎么做呢?

我们变得不那么精确。

事实证明,有时,在深度学习中使事情不那么精确会使它更好地概括。

杰瑞米·霍华德

神经网络中的精度

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

在神经网络中,所有的浮点数,即我们的输入、权重和激活都是用 32 位存储的。使用 32 位给了我们很高的精度。但是更高的精度也意味着需要更多的计算时间和更多的内存来存储这些变量。如果我们只用 16 位呢?

半精度

减少内存使用的一种方法是以一半精度(16 位)执行所有操作。

根据定义,这将占用 RAM 中一半的空间,并且理论上可以让您的批处理大小翻倍。增加的批量意味着并行执行更多的操作,从而减少培训时间。然而,这也带来了一些问题。

半精度的问题

  1. 不精确的重量更新:

我们将模型的权重更新如下:

w = w - learning_rate * w.gradient

以半精度执行该运算的问题是,w.grad通常非常小,我们的learning_rate也是如此,这会使等式的第二项非常小,以至于根本不会发生更新。

2.梯度下溢:

类似于不精确的权重更新,如果我们的梯度太小(低于可以使用 16 位表示的值),它们将被转换为 0。

3.激活爆炸:

一系列矩阵乘法(前向传递)很容易导致神经网络的激活(输出)变得如此之大,以至于它们达到 NaN(或无穷大)

解决这些问题的办法就是使用 混合精度训练

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

source: https://arxiv.org/pdf/1710.03740.pdf

混合精确训练

全朱庇特笔记本。

顾名思义,我们做任何事情都不会有一半的精度。我们在 FP16 中执行一些操作,而在 FP32 中执行其他操作。更具体地说,我们以 32 位精度进行权重更新。这解决了问题#1。

为了克服梯度下溢,我们使用称为梯度缩放的东西。我们将损失函数乘以一个比例因子。我们这样做是为了避免梯度下降到 FP16 可以表示的范围之下,从而避免它被 0 取代。我们还要确保缩放因子不会大到导致我们的激活溢出。

使用这些思想,我们避免了半精度的问题,并有效地训练我们的网络。

最后的想法

使用混合精度训练的想法只出现了几年,并不是所有的 GPU 都支持它。但是这是一个值得了解的想法,并且在将来会被更多的使用。

结果表明,该方法在不影响精度的情况下,减少了训练时间。

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

这就是本文的全部内容。

如果你想了解更多关于深度学习的知识,可以看看我在这方面的系列文章:

[## 深度学习系列

我所有关于深度学习的文章的系统列表

medium.com](https://medium.com/@dipam44/deep-learning-series-30ad108fbe2b)

~快乐学习。

混合策略梯度和 Q-学习

原文:https://towardsdatascience.com/mixing-policy-gradient-and-q-learning-5819d9c69074?source=collection_archive---------18-----------------------

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

策略梯度算法是强化学习算法的一个大家族,包括强化、A2/3C、PPO 等。Q-learning 是另一个家族,在过去几年中有许多重大改进:目标网络、双 DQN、经验重放/采样…

我一直想知道是否有可能取二者之长,创造出更好的学习算法。当我发现刻薄的演员评论家时,这个梦想实现了。

快速背景

在强化学习中,有奖励,目标是建立一个代理,使其在一集内的整体奖励最大化。这个数量是:

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

从时间 t 开始,其中 r 是奖励,γ是折扣因子。无穷大代表一集的结束,所以如果它几乎肯定是有限的,我们可以取 gamma = 1。

实际上,我们有一个策略π,它是每个状态 s 的动作的概率分布。这意味着我们希望从 t 开始最大化 G 的期望值,我们将这个数字称为值。

我们也可以定义 Q,它是以一个动作为条件的值:也就是说,从状态 s 开始并使用动作 a 的期望总回报。

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

这个想法

现在我们需要的东西都有了。我们的目标是找到使 v 最大化的策略π。π是从状态集到动作集的静态函数。因此,我们可以使用神经网络来近似它。使用一点微积分,我们可以计算我们的网络参数θ的梯度,以便得到众所周知的策略梯度:

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

但是另一种写法是:

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

这就是我所说的平均梯度。人们大多使用第一个公式,去掉对行动的期望(根据大数定律,一个实现近似遵循期望),用 Q 作为使用当前政策给出的行动观察到的总回报。但是我们为什么不用第二个公式,没有任何近似呢?问题是,我们没有任何观察到的其他行动的回报,除非模拟大量的轨迹(在一棵非常大的树上行走,在每个节点的多个行动之间进行选择)。实际上这正是人们用树搜索做的事情,像、UCT、PO-UCB/T 方法。但现在是深度学习时代,为什么不直接近似这些无法直接观测到的 Q 值呢?

这就是 Q-learning 的由来。我们将使用网络预测 Q 值,就像 Q 学习一样,但是我们的策略不会是ε贪婪的,取值的 argmax。我们将使用平均梯度公式更新我们的策略。这就是 MAC 算法

例如,如果我们拿一个像 breakout 这样的经典 Atari 游戏,我们将创建一个具有两个输出的卷积神经网络:一个用于 Q 值,具有线性激活,另一个用于策略,具有 softmax 激活。两者的长度都等于游戏中动作的数量。

我们的损失将如下所示(在 tensorflow 1 中。x):

优势

方差缩减

正如作者在论文中所说,也正如我根据自己的经验观察到的,学习差异大大减少了。这是预期的:由于 MAC 实际上是“共同”政策梯度的期望值,使用一点 Jensen 不等式证明其方差更低。直觉上,平均导致较小的方差,假设我们的神经网络给出了 Q 值的良好评估。

这一点对于许多真实世界环境非常重要,这些环境在转移矩阵(给定所采取的行动,下一个状态将是哪个状态)和奖励函数中通常具有非常高的方差。真实环境的动态并不平滑,很多现象甚至是混沌的。

Q 网络作为代理

这对我来说是一个巨大的方面,但似乎作者自己并没有真正看到这一点。MAC 将策略从环境动态中分离出来:Q 值就像是策略和环境之间的代理。在我看来,MAC 是 EPG 的离散版本[2]!正如 EPG(DDPG 的推广)擅长无限多个动作(连续动作空间),MAC 擅长大量动作(减少方差)。

这个“代理”带来了 Q-learning 的一个非常重要的特性:离策学习!更准确地说,在 PPO [3]中,我们可以更有效地采样,多次重用数据。Q 值学习是监督学习,因此在监督学习中,我们可以执行多个时期。这个小细节真的是助推算法,也是今天 PPO 如此受赞赏的主要原因。

使用最先进的技术

由于 MAC 使用 DQN,大多数技术可以重用,如目标网络或分布式 RL [4]。我体验了后者,结果令人印象深刻,结合 MAC。对于策略梯度部分,我们可以使用自然梯度(像在 PPO 中),例如信任区域和二阶方法。

弱点

MAC 的一个大缺点(实际上也是我发现的唯一缺点)是,它在几个问题上的表现不如 A2C。我的解释是,与其容量和数据质量相比,训练网络来预测 Q 值有时可能太难了。

结论

强化学习是一个非常年轻的研究课题,但是已经收集了很多有趣的论文。许多概念和问题依赖于 AI 的一般理论,独立于纯粹的深度学习,我认为这在今天是一个非常好的观点。

Mean actor critic 是一个有趣的算法,它以一种独特的方式解决了强化学习的常见问题,但也对该学科的局限性提出了疑问。深度强化学习是通往 AGI 的黄金之路吗?或者只是大山上的一块石头…

[1] Cameron Allen、Melrose Roderick Kavosh Asadi、Abdel rahman Mohamed、George Konidaris 和 Michael Littman。刻薄演员评论家(2017)。链接

[2]卡米尔·克洛克和西蒙·怀特森。预期政策梯度(2017 年)。链接

[3]约翰·舒尔曼、菲利普·沃尔斯基、普拉富拉·德里瓦尔、亚历克·拉德福德、奥列格·克里莫夫。近似策略优化算法(2016)。链接

[4]马克·贝勒马尔、威尔·达布尼和雷米·穆诺斯。强化学习的分布视角(2017)。链接

用 PersLay 混合拓扑和深度学习

原文:https://towardsdatascience.com/mixing-topology-and-deep-learning-with-perslay-2e60af69c321?source=collection_archive---------9-----------------------

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

Source: Sky Motion / Shutterstock.com

前一篇中,我提出了拓扑数据分析及其主要描述符,即所谓的持久性图。在这篇文章中,我想展示如何将这些描述符与神经网络结合起来,为基于深度学习和拓扑的应用开辟道路!

什么是持久性图?

简而言之,持久性图是平面中表示数据拓扑的一组点:图中的每个点实际上都见证了数据中拓扑特征的存在。此类特征可以是连接的组件(0 维拓扑)、回路(1 维拓扑)、空腔(2 维拓扑)等。

在下面的例子中,我展示了一个从零的图像(显示在右下角)计算出的持久性图的例子。这个想法是通过逐步增加像素来过滤图像。更具体地说,我们仅从那些灰度值大于给定阈值的像素开始,并且让该阈值从大值减小到低值,直到最终所有像素都存在。在这个过程中,可能会发生一些拓扑变化(例如创建和合并连接的组件和/或孔洞),而持久性图会准确地编码这些变化。每次拓扑事件发生时,都会在持久性图中产生一个点,该点的坐标提供了该事件发生的阈值。

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

Example of computation of a persistence diagram from an image (source: https://www.dropbox.com/s/hihxt8cuz265bf9/phd.pdf?dl=0).

这个描述符很有趣,特别是因为它编码了拓扑信息,这是不寻常的,并且通常是对机器学习中更传统的描述符编码的信息的补充。然而,由于持久性图的空间不是结构化的(例如,不可能以一致的方式添加两个持久性图),在过去几年中已经定义了几个特征图,即,将持久性图嵌入到希尔伯特空间(例如有限维欧几里得空间)中。它们中的大多数现在可以在 scikit-learn 兼容库 sklearn_tda 中获得。

PersLay:持久性图表的层

今天,我想介绍一个我和我的合著者在过去几个月里开发的便利工具,它叫做PersLayPersLay 是一个神经网络层,它适合处理持久性图,并且概括了我上面提到的大多数特征图。更具体地说,**文献的每个特征图都可以由 PersLay 用适当的参数生成。**这尤其意味着特征图可以在训练期间即时学习。不再需要密集的交叉验证!!

此外,由于任何后续的神经网络都可以在 PersLay 之后插入,它允许持久性图被任何架构处理,无论它有多复杂。

PersLay 的定义实际上很简单 :-)事实上,当一个人希望以一种可微分的方式将持久性图转化为向量(以便可以反向传播)时,首要的要求是对图点的排列保持不变。假设您必须处理两组点,它们唯一的区别在于点的排序:您可能希望输出是相同的!

生成排列不变且可微分的特征图的最简单方法可能是将持久性图的每个点变成一个向量,然后对所有这样的向量求和,最终得到一个向量(实际上,可以使用许多其他操作来代替求和,考虑取最大值、平均值、最大的 n 值……)。这正是 PersLay 的定义。

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

Definition of PersLay for a persistence diagram Dg. In this equation, w§ is a weight function, phi is a vector transformation, and op is any permutation-invariant operation (source: https://arxiv.org/pdf/1904.09378.pdf).

PersLay 的模块化

原来**TDA 文献中的所有特征地图实际上都符合这个一般方法!**根据将图点转化为向量的方式以及所使用的排列不变运算,可以看出应用上述方法相当于计算余辉图像余辉景观余辉轮廓

以持久性景观为例。这个方法是第一个被定义来处理持久性图的特性图。其定义如下:对于平面上的每个点 p ,统计该点 p 位于左上角有余辉图点的正方形内的余辉图点数。由此,你得到了平面上的分段常数函数。第 k- 个持续景观被定义为包含具有函数值 k 的所有点的平面区域的边界。通过随机采样点并评估这些点上的持久性景观,该边界最终被转化为一个数字向量。

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

Example of persistence landscape computation (source: http://www.jmlr.org/papers/volume16/bubenik15a/bubenik15a.pdf)

事实证明,持久性景观可以被认为是 PersLay 的特殊实例!事实上,生成持久性景观的一个更简单的方法是将一个三角形函数与每个持久性图点相关联,并对该函数进行采样以获得向量。那么第 k 个持续性景观就是这些向量的每个坐标的第 k 个最大值!

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

PersLay parameters for the generation of persistence landscapes (source: https://arxiv.org/abs/1904.09378).

持久性图的简单架构

这使得持久性图可以在各种各样的任务中使用,这在以前是无法实现的!事实上,即使对于成千上万的持久性图,用传统的分类器(如 SVM 或随机森林)对所有可能的特征图进行交叉验证也太昂贵了(就运行时间而言)。另一方面,用 PersLay 的几行代码就可以做到:-D

更准确地说,PersLay 的输出可以用作任何后续神经网络的输入。在与 PersLay 相关的文章中,我们研究了一个简单的架构,其中从每个数据点生成几个持久性图,并且这些图中的每一个都由特定的 PersLay 通道单独处理。然后将所有通道的输出连接起来(带有一些附加功能),我们使用一个完全连接的层来产生具有正确维度的结果。

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

A simple architecture using PersLay.

对于那些想了解更多这方面知识的人,有一个关于 PersLay 和这种架构的教程,里面有一些很酷的图分类应用。我真的希望你也对这种神经网络和拓扑数据分析的新组合感到兴奋。除了分类之外,神经网络还有许多其他应用,所以请继续关注其他即将发布的帖子!

混合建模从零开始,在 R

原文:https://towardsdatascience.com/mixture-modelling-from-scratch-in-r-5ab7bfc83eef?source=collection_archive---------1-----------------------

从 K-means 到高斯混合建模,浓缩在几行代码中

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

在机器学习文献中, K-means高斯混合模型 (GMM)是第一个描述的聚类/无监督模型[1–3],因此,应该是任何数据科学家工具箱的一部分。在 R 中,可以使用kmeans()Mclust()或其他类似的函数,但是要完全理解那些算法,需要从头开始构建它们。网上搜索会引导你找到许多有用的教程,但是你很难找到完全透明的 R 代码。我遇到的最好的例子是 R-bloggers 上的一篇优秀文章’高斯混合建模介绍’。

但我仍然有点不满意。这就是我一直在寻找的东西:

  • A-to-Z 算法(数据->算法->结果)
  • 独占使用 R 基础包(无隐藏计算)
  • 多变量情况(不仅仅是单变量或双变量)
  • 优雅的代码(K-means 和 GMM 之间的平行极简)
  • 用于绘制算法迭代动画的选项

我上面提到的代码满足了大约一半的需求(从 A 到 Z,优雅的 GMM 多元代码)。我通过更多的研究完成了剩下的部分,结果如下。请注意,我将这篇文章写得很短,重点放在算法的本质上。方程式可以在维基百科和 ML 教材上找到。r 代码被注释只是为了给出足够多的关于建模步骤的细节。我还为 K-means 和 GMM 使用了相同的结构来突出它们之间的明显相似之处(即分别是 期望最大化 算法的硬版本和软版本)。

我们的数据

为了说明,我们将把那些聚类算法应用于著名的 虹膜数据集 。在 20 世纪初,Edgar Anderson 收集数据量化了三种鸢尾花的形态变异:鸢尾海滨鸢尾杂色鸢尾。该数据集由 3 个物种的 50 个样本和 4 个特征组成:萼片和花瓣的长度和宽度[4]。英国统计学家和遗传学家罗纳德·费雪(1890–1962),一个几乎是单枪匹马为现代统计科学奠定基础的天才【5】,然后在*“分类问题中多重测量的使用*’【6】中使用这个数据集作为线性判别分析 (LDA)的例子。从那时起,Iris 数据集已经成为简单多维聚类问题的教科书示例(尽管 Fisher 显然使用了 LDA 的标签,LDA 是一种监督学习模型)。iris数据集包含在 R datasets包中。

X <- iris[,1:4]
y <- iris[,5]y_col <- c('#7DB0DD', '#86B875', '#E495A5')pdf('dat_iris.pdf')
pairs(X, lower.panel = NULL, col = y_col[y])
par(xpd = T)
legend(x = 0.1, y = 0.4, legend = as.character(levels(y)), fill = y_col)
dev.off()

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

The Anderson/Fisher Iris flower dataset | Features and labels from the R datasets package; photographs of the 3 Iris species, source: Wikipedia; and original data, Table 1 of [6].

k 均值

我们从优秀的综述“数据聚类:50 年后的 K-means”[7]中了解到,聚类方法的发展是一项跨学科的努力,有来自分类学家、生物学家、心理学家、统计学家、工程师等的众多贡献。“数据聚类”一词首次出现在 1954 年一篇关于人类学数据的文章的标题中。在现有的所有聚类算法中,K-means 算法是最流行和最简单的。它有着丰富多样的历史,因为它是在 1956 年至 1967 年间在不同的科学领域独立发现的[8–9]。下面的注释 R 代码对此进行了描述:

# finds partition such that squared error between empirical mean
# and points in cluster is minimized over all k clusters
km.fromscratch <- function(X, k){
  p <- ncol(X)  # number of parameters
  n <- nrow(X)  # number of observations
  Delta <- 1; iter <- 0; itermax <- 30
  while(Delta > 1e-4 && iter <= itermax){
    # initiation
    if(iter == 0){
      centroid <- X[sample(nrow(X), k),]
      centroid_mem <- centroid
    }

    # equivalent to E-step
    d <- sapply(1:k, function(c) sapply(1:n, 
      function(i) sum((centroid[c,] - X[i,])^2) ))
    cluster <- apply(d, 1, which.min)

    # equivalent to M-step
    centroid <- t(sapply(1:k, function(c) 
      apply(X[cluster == c,], 2, mean)))

    Delta <- sum((centroid - centroid_mem)^2)
    iter <- iter + 1; centroid_mem <- centroid
  }
  return(list(centroid = centroid, cluster = cluster))
}# run K-means
km <- km.fromscratch(X, 3)
pairs(X, lower.panel = NULL, col = km$cluster)
table(y, km$cluster)

我们来对比一下打包的算法km.pkg <- kmeans(X, 3):

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

以下动画基于建议的 R 代码,但使用pairs()功能的面板选项绘制了集群球形决策边界的半径。为了清楚起见,这在前面的代码中没有显示,因为它的大小已经翻倍了!然而,附录中提供了完整的代码。与鸢尾属物种标记相比,我们得到了 88.7% 的**(对于 setosa 没有错误,对于 versicolor 有 3 个错误分类的观察值,对于 virginica 有 14 个错误分类的观察值——注意,结果可能会因随机启动而略有变化)。使用kmeans()内置的 R 函数会产生类似的结果,但速度更快。**

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

K-means clustering of the Iris dataset | The different iterations to convergence, with radius of the cluster spherical decision boundary plotted.

高斯混合模型

高斯混合(高斯混合模型或 GMM)是最广泛使用的混合模型。GMM 可以被描述为具有高斯密度的 K-均值的软版本。下面是多维情况下的 R 代码,这意味着我们采用全张量,这是通过多元正态分布和协方差矩阵的特征分解来了解 GMM 所有复杂性的最佳方式。我们开始吧:

# Uses EM algorithm with multivariate normal
# distribution to estimate cluster probability
mvnorm.cov.inv <- function(Sigma) {
  # Eigendecomposition of covariance matrix
  E <- eigen(Sigma)
  Lambda.inv <- diag(E$values^-1)   # diagonal matrix
  Q <- E$vectors
  return(Q %*% Lambda.inv %*% t(Q))
}#multivariate Gaussian pdf
mvn.pdf.i <- function(xi, mu, Sigma)
  1/sqrt( (2*pi)^length(xi) * det(Sigma) ) * 
  exp(-(1/2) * t(xi - mu) %*% mvnorm.cov.inv(Sigma) 
  %*% (xi - mu)  )mvn.pdf <- function(X, mu, Sigma)
  apply(X, 1, function(xi) mvn.pdf.i(as.numeric(xi), mu, Sigma))gmm.fromscratch <- function(X, k){
  p <- ncol(X)  # number of parameters
  n <- nrow(X)  # number of observations
  Delta <- 1; iter <- 0; itermax <- 30
  while(Delta > 1e-4 && iter <= itermax){
    # initiation
    if(iter == 0){
      km.init <- km.fromscratch(X, k)
      mu <- km.init$centroid; mu_mem <- mu
      w <- sapply(1:k, function(i) length(which(km.init$cluster == i)))
      w <- w/sum(w)
      cov <- array(dim = c(p, p, k))
      for(i in 1:p) for(j in 1:p) for(c in 1:k) cov[i, j, c] <- 
        1/n * sum((X[km.init$cluster == c, i] - mu[c, i]) *
        (X[km.init$cluster == c, j] - mu[c, j]))
    }

    # E-step
    mvn.c <- sapply(1:k, function(c) mvn.pdf(X, mu[c,], cov[,, c]))
    r_ic <- t(w*t(mvn.c)) / rowSums(t(w*t(mvn.c)))

    # M-step
    n_c <- colSums(r_ic)
    w <- n_c/sum(n_c)
    mu <- t(sapply(1:k, function(c) 1/n_c[c] * colSums(r_ic[, c] *
      X)))
    for(i in 1:p) for(j in 1:p) for(c in 1:k) cov[i, j, c] <-
      1/n_c[c] * sum(r_ic[, c] * (X[, i] - mu[c, i]) * r_ic[, c] *
      (X[, j] - mu[c, j])) Delta <- sum((mu - mu_mem)^2)
    iter <- iter + 1; mu_mem <- mu
  }
  return(list(softcluster = r_ic, cluster = apply(r_ic, 1,
    which.max)))
}# run GMM
gmm <- gmm.fromscratch(X, 3)
pairs(X, lower.panel = NULL, col = gmm$cluster)
table(y, gmm$cluster)

我们来对比一下来自library(mclust)gmm.mclust <- Mclust(X, 3):

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

同样,为了清楚起见,本代码中没有显示迭代过程中椭圆的绘制,如下面的动画所示(完整代码请参见附录)。与鸢尾属物种标记相比,当将每个观察分类到最高聚类概率时,我们得到了 96.7% 的准确度(对于 setosavirginica 没有错误,对于 versicolor 有 5 个观察被错误分类)。但是,请注意,结果可能会因随机参数初始化而略有不同;运行几次算法来研究这种可变性。使用Mclust()也能得到类似的结果(但Mclust()显然要快得多)。如果我们详细比较两种聚类算法的结果,我们可以看到,是 K-means 做出的球形假设使其在 Iris 数据集上的性能略差于 GMM。

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

Gaussian Mixture Modelling of the Iris dataset | The different iterations to convergence, with elliptic distribution of each cluster plotted.

现在看看这两种算法之间的相似之处,两者都由三个步骤构成:初始、E 步骤和 M 步骤的 期望最大化【EM】算法【10】。EM 是一种简单而强大的迭代算法,它在给定参数的情况下推断聚类(E 步骤),然后在给定预测聚类的情况下优化参数(M 步骤)之间交替进行。

。既然你已经理解了这两个经典聚类算法的步骤,我推荐你使用正式的 R 函数(kmeans()Mclust()等)。),已经过基准测试,效率要高得多。

[1] C. M. Bishop,模式识别和机器学习 (2006),Springer

[1] C. M. Bishop,模式识别和机器学习 (2006),Springer

[2] T. Hastie 等人,统计学习、数据挖掘、推理和预测的要素 (2009),Springer,第二版。

[3] K. P. Murphy,机器学习,概率视角 (2012),麻省理工学院出版社

[4] E .安德森,鸢尾属植物中的物种问题 (1936),密苏里植物园年报

[5] A .哈尔德,一部数理统计史 (1998),威利

[7] A. K. Jain,数据聚类:50 年后的 K-means (2010),模式识别字母

[8] H .施泰因豪斯,《关于各方的材料分工》 (1956 年),《波罗乃兹科学院公报》

[9] J. MacQueen,多变量观测值的一些分类和分析方法 (1967),第五届伯克利研讨会

[10] A. P. Dempster 等人,通过 EM 算法从不完整数据中获得最大似然 (1977),皇家统计学会杂志

附录:动画 K 均值

wd <- getwd()# finds partition such that squared error between empirical mean
# and points in cluster is minimized over all k clusters
km.fromscratch <- function(X, k, plot = F){
  p <- ncol(X)  # number of parameters
  n <- nrow(X)  # number of observations
  Delta <- 1; iter <- 0; itermax <- 30
  class_col <- c('#7DB0DD', '#86B875', '#E495A5')
  while(Delta > 1e-4 && iter <= itermax){
    # initiation
    if(iter == 0){
      centroid <- X[sample(nrow(X), k),]
      centroid_mem <- centroid
    }

    # equivalent to E-step
    d <- sapply(1:k, function(c) sapply(1:n, function(i) sum((centroid[c,] - X[i,])^2) ))
    cluster <- apply(d, 1, which.min)
    # equivalent to M-step
    centroid <- t(sapply(1:k, function(c) apply(X[cluster == c,], 2, mean)))

    rad <- sapply(1:k, function(c) max(sqrt(d[cluster == c,c])))
    if(plot){
      i <- 1
      idx <- matrix(rep(seq(p), p), ncol = p, nrow = p)
      idx <- idx[lower.tri(idx)]
      idy <- matrix(rep(seq(p), each=p), ncol = p, nrow = p)
      idy <- idy[lower.tri(idy)]
      theta <- seq(0,1,0.01) * 2*pi

      png(paste0(wd, '/fig_kmeans/iter', iter, '.png'))
      pairs(rbind(X, centroid), lower.panel = NULL, asp = 1,
            col = c(class_col[cluster], rep('black', k)), main =
            paste0('iter=',iter), panel=function(x, y, ...) {
              points(x, y, col = c(class_col[cluster], rep('black', k)))
              lines(centroid[, idx[i]][1]+cos(theta)*rad[1], 
                    centroid[, idy[i]][1]+sin(theta)*rad[1], 
                    col=class_col[1])
              lines(centroid[, idx[i]][2]+cos(theta)*rad[2], 
                    centroid[, idy[i]][2]+sin(theta)*rad[2], 
                    col=class_col[2])
              lines(centroid[, idx[i]][3]+cos(theta)*rad[3], 
                    centroid[, idy[i]][3]+sin(theta)*rad[3], 
                    col=class_col[3])
              i <<- i+1
            })
      dev.off()
    }

    Delta <- sum((centroid - centroid_mem)^2)
    iter <- iter + 1; centroid_mem <- centroid
  }
  return(list(centroid = centroid, cluster = cluster))
}# run K-means
km <- km.fromscratch(X, 3, plot = T)
table(y, km$cluster)library(magick)
list.files(path = paste0(wd, '/fig_kmeans/'), pattern = '*.png', full.names = T) %>% 
  image_read() %>%
  image_join() %>%
  image_animate(fps=1) %>%
  image_write('fig_kmeans_anim.gif')

附录:动画 GMM

library(reshape)   #cast()
wd <- getwd()# Uses EM algorithm with multivariate normal
# distribution to estimate cluster probability
mvnorm.cov.inv <- function(Sigma) {
  # Eigendecomposition of covariance matrix
  E <- eigen(Sigma)
  Lambda.inv <- diag(E$values^-1)   # diagonal matrix with inverse of eigenvalues
  Q <- E$vectors                    # eigenvectors
  return(Q %*% Lambda.inv %*% t(Q))
}#multivariate Gaussian pdf
mvn.pdf.i <- function(xi, mu, Sigma)
  1/sqrt( (2*pi)^length(xi) * det(Sigma) ) * 
  exp(-(1/2) * t(xi - mu) %*% mvnorm.cov.inv(Sigma) %*% (xi - mu)  )mvn.pdf <- function(X, mu, Sigma)
  apply(X, 1, function(xi) mvn.pdf.i(as.numeric(xi), mu, Sigma))gmm.fromscratch <- function(X, k, plot = F){
  p <- ncol(X)  # number of parameters
  n <- nrow(X)  # number of observations
  Delta <- 1; iter <- 0; itermax <- 30
  class_col <- c('#7DB0DD', '#86B875', '#E495A5')
  while(Delta > 1e-4 && iter <= itermax){
    # initiation
    if(iter == 0){
      km.init <- km.fromscratch(X, k)
      mu <- km.init$centroid; mu_mem <- mu
      w <- sapply(1:k, function(i) length(which(km.init$cluster == i)))
      w <- w/sum(w)
      cov <- array(dim = c(p, p, k))
      for(i in 1:p) for(j in 1:p) for(c in 1:k) cov[i, j, c] <- 
        1/n * sum((X[km.init$cluster == c, i] - mu[c, i]) *
        (X[km.init$cluster == c, j] - mu[c, j]))
    }

    # E-step
    mvn.c <- sapply(1:k, function(c) mvn.pdf(X, mu[c,], cov[,, c]))
    r_ic <- t(w*t(mvn.c)) / rowSums(t(w*t(mvn.c)))# M-step
    n_c <- colSums(r_ic)
    w <- n_c/sum(n_c)
    mu <- t(sapply(1:k, function(c) 1/n_c[c] * colSums(r_ic[, c] *
      X)))
    for(i in 1:p) for(j in 1:p) for(c in 1:k) cov[i, j, c] <- 
      1/n_c[c] * sum(r_ic[, c] * (X[, i] - mu[c, i]) * r_ic[, c] *
      (X[, j] - mu[c, j]))cluster <- apply(r_ic, 1, which.max)
    if(plot){
      i <- 1
      idx <- matrix(rep(seq(p), p), ncol = p, nrow = p)
      idx <- idx[lower.tri(idx)]
      idy <- matrix(rep(seq(p), each=p), ncol = p, nrow = p)
      idy <- idy[lower.tri(idy)]

      if(iter < 10) iter4plot <- paste0('0', iter) else iter4plot <- iter

      png(paste0(wd, '/figs_gmm/iter', iter4plot, '.png'))
      pairs(rbind(X, mu), lower.panel = NULL, asp = 1, 
        col = c(class_col[cluster], rep('black', k)), main =
        paste0('iter=',iter), panel=function(x, y, ...) {
              points(x, y, col = c(class_col[cluster], rep('black', k)))
              xi <- seq(min(X[, idx[i]])-1, max(X[, idx[i]])+1, 0.1)
              yi <- seq(min(X[, idy[i]])-1, max(X[, idy[i]])+1, 0.1)
              grid <- expand.grid(xi = xi, yi = yi)
              grid['z'] <- mvn.pdf(grid, mu[1,c(idx[i],idy[i])],
                cov[c(idx[i],idy[i]),c(idx[i],idy[i]), 1])
              z <- cast(grid, xi ~ yi)
              contour(xi, yi, as.matrix(z[,-1]), 
                levels = c(.1, .5, .9), col = class_col[1], 
                add = T, lty = 'solid', labels = '')
              grid <- expand.grid(xi = xi, yi = yi)
              grid['z'] <- mvn.pdf(grid, mu[2,c(idx[i],idy[i])], 
                cov[c(idx[i],idy[i]),c(idx[i],idy[i]), 2])
              z <- cast(grid, xi ~ yi)
              contour(xi, yi, as.matrix(z[,-1]), 
                levels = c(.1, .5, .9), col = class_col[2], 
                add = T, lty = 'solid', labels = '')
              grid <- expand.grid(xi = xi, yi = yi)
              grid['z'] <- mvn.pdf(grid, mu[3,c(idx[i],idy[i])], 
                cov[c(idx[i],idy[i]),c(idx[i],idy[i]), 3])
              z <- cast(grid, xi ~ yi)
              contour(xi, yi, as.matrix(z[,-1]), 
                levels = c(.1, .5, .9), col = class_col[3], 
                add = T, lty = 'solid', labels = '')
              i <<- i+1
            })
      dev.off()
    }

    Delta <- sum((mu - mu_mem)^2)
    iter <- iter + 1; mu_mem <- mu
  }
  return(list(softcluster = r_ic, cluster = cluster))
}gmm <- gmm.fromscratch(X, 3, plot = T)
table(y, gmm$cluster)library(magick)
list.files(path = paste0(wd, "/figs_gmm/"), pattern = "*.png", full.names = T) %>% 
  image_read() %>%
  image_join() %>%
  image_animate(fps=1) %>%
  image_write("fig_gmm_anim.gif")

可变自动编码器的混合 MoE 和 VAE 的融合

原文:https://towardsdatascience.com/mixture-of-variational-autoencoders-a-fusion-between-moe-and-vae-22c0901a6675?source=collection_archive---------12-----------------------

一种无监督的数字分类和生成方法

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

变分自动编码器(VAE) 是试图学习输入空间形状的神经网络的典范。一旦经过训练,该模型可用于从输入空间生成新样本。

如果我们有输入数据的标签,那么也可以在标签上设定生成过程。在 MNIST 的情况下,这意味着我们可以指定我们想要为哪个数字生成图像。

让我们更进一步……我们能在完全不使用标签的情况下根据数字来决定生成过程吗?我们能用无监督的方法达到同样的结果吗?

如果我们想依赖标签,我们可以做一些简单得令人尴尬的事情。我们可以训练 10 个独立的 VAE 模型,每个模型都使用一位数的图像。

那显然可以,但是你用的是标签。那是作弊!

好吧,我们根本不用它们。让我们训练我们的 10 个模型,在把它传给合适的模型之前,用我们的眼睛看一下每张图像。

嘿,你又作弊了!虽然您不使用标签本身,但您确实会查看图像,以便将它们发送到适当的模型。

好吧……如果我们让另一个模特学习路线,而不是自己做路线,那根本不算作弊,不是吗?

对!😃

我们可以使用 11 个模块的架构,如下所示:

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

A manager module routing an input to the appropriate expert module

但是经理如何决定将图像传递给哪个专家呢?我们可以训练它来预测图像的数字,但是我们不想使用标签!

唷…我还以为你要作弊呢…

那么,我们如何在不使用标签的情况下培训经理呢?这让我想起了一种不同类型的模型——专家混合模型。让我绕个小圈子来解释一下 MoE 是如何工作的。我们需要它,因为它将是我们解决方案的关键组成部分。

向非专家解释的专家组合

MoE 是一个监督学习框架。你可以在 Coursera 和 YouTube 上找到 Geoffrey Hinton 的精彩解释。MoE 依赖于根据𝑥→𝑦映射对输入进行分段的可能性。看看这个简单的函数:

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

地面实况被定义为𝑥的紫色抛物线

In complex datasets we might not know the split points. One (bad) solution is to segment the input space by clustering the 𝑥’s using K-means. In the two parabolas example, we’ll end up with 𝑥’’ as the split point between two clusters. Thus, when we’ll train the model on the 𝑥

So how can we train a model that learns the split points while at the same time learns the mapping that defines the split points?

MoE does so using an architecture of multiple subnetworks — one manager and multiple experts:

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

MoE architecture

The manager maps the input into a soft decision over the experts, which is used in two contexts:

First, the output of the network is a weighted average of the experts’ outputs, where the weights are the manager’s output.

Second, the loss function is

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

𝑦¡ is the label, 𝑦¯¡ is the output of the i’th expert, 𝑝¡ is the i’th entry of the manager’s output. When you differentiate the loss, you get these results (I encourage you to watch the 视频了解更多详情):

  1. 经理为每个专家决定它对损失的贡献大小。换句话说,管理者选择哪些专家应该根据他们的误差来调整他们的权重。
  2. 管理器以这样一种方式调整它输出的概率,使得答对的专家将比没答对的专家获得更高的概率。

这个损失函数鼓励专家专攻不同种类的输入。

拼图的最后一块……是𝑥

让我们回到我们的挑战!MoE 是一个监督学习的框架。当然,我们可以把𝑦换成𝑥,在无人监管的情况下,对不对?MoE 的强大之处在于,每位专家都专门研究输入空间的不同部分,并具有唯一的制图𝑥→𝑦.如果我们使用映射𝑥→𝑥,每个专家将专注于输入空间的不同部分,在输入本身中具有独特的模式。

我们将使用 VAEs 作为专家。VAE 的部分损失是重建损失,其中 VAE 试图重建原始输入图像𝑥:

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

MoE architecture where the experts are implemented as VAE

这种架构的一个很酷的副产品是,管理器可以使用图像的输出向量对图像中的数字进行分类!

在训练这个模型时,我们需要小心的一件事是,管理器可能很容易退化为输出一个常量向量——不管手头的输入是什么。这导致一个 VAE 专用于所有数字,而九个值不专用于任何数字。在教育部的论文中描述了一种减轻损失的方法,即在损失中增加一个平衡项。它鼓励管理者的输出在一批输入中达到平衡:

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

说够了,训练时间到了!

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

Images generated by the experts. Each column belongs to a different expert.

在最后一张图中,我们看到了每个专家都学到了什么。在每个时期之后,我们使用专家从他们擅长的分布中生成图像。第 I 列包含第 I 个专家生成的图像。

我们可以看到,一些专家很容易地专注于一个位数,例如— 1。有些人被相似的数字搞糊涂了,比如专家既擅长 3 又擅长 5。

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

An expert specializing in 2

还有什么?

使用一个简单的模型,不需要太多的调整,我们得到了合理的结果。最理想的情况是,我们希望每个专家专门研究一个数字,从而通过管理器的输出实现完美的无监督分类。

另一个有趣的实验是把每个专家变成他们自己的 MoE!它将允许我们学习 vae 应该专门化的分级参数。例如,一些数字有多种绘制方式:7 可以有或没有删除线。这种变化的来源可以由层次结构中第二级的教育部来模拟。但是我会为以后的帖子留些东西…

原文由我在发表。

ML 算法:一种 SD (σ)-贝叶斯算法

原文:https://towardsdatascience.com/ml-algorithms-one-sd-σ-bayesian-algorithms-b59785da792a?source=collection_archive---------13-----------------------

机器学习贝叶斯算法介绍

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

当面对各种各样的机器学习算法时,要问的明显问题是“哪种算法更适合特定的任务,我应该使用哪种算法?”

回答这些问题取决于几个因素,包括:(1)数据的大小、质量和性质;(2)可用的计算时间;(3)任务的紧迫性;以及(4)你想用这些数据做什么。

这是我在之前的文章中写的许多算法中的一部分。在这一部分中,我试图尽可能简单地展示和简要解释可用于贝叶斯任务的主要算法(尽管不是全部)。

贝叶斯算法:

一个算法家族,其中所有算法都有一个共同的原则,即每对被分类的特征都是相互独立的。朴素贝叶斯分类器是一组基于贝叶斯定理的分类算法。贝叶斯公式提供了 P(A|B)和 P(B|A)之间的关系

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

朴素贝叶斯

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

朴素贝叶斯算法假设它使用的每个特征在给定某个类的情况下有条件地相互独立。它提供了一种从 P©,P(x)和 P(x|c)计算后验概率 P(c|x)的方法。例如,假设你有几封邮件已经被归类为垃圾邮件。现在假设您想将一封新邮件分类为垃圾邮件或垃圾邮件。朴素贝叶斯认为这个问题是“给定包含特定单词的新电子邮件是垃圾邮件/垃圾邮件的概率是多少”(例如,包含单词“伟哥”的电子邮件被分类为垃圾邮件/垃圾邮件的概率)。

需要考虑的一些事情:

适用于非常大的数据集-您可以对小数据集使用朴素贝叶斯分类算法,但精度和召回率会非常低

由于算法有一个独立性的假设,你确实失去了利用特征之间的相互作用的能力。

高斯朴素贝叶斯

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

一般术语朴素贝叶斯指的是模型中的独立性假设,而不是每个特征的特定分布。到目前为止,我们还没有提到每个特征的分布,但是在高斯朴素贝叶斯中,我们假设概率的分布是高斯的(正态)。由于正态分布的假设,高斯朴素贝叶斯用于我们所有特征都是连续的情况。例如,如果我们考虑虹膜数据集,特征是萼片宽度、花瓣宽度等。它们在数据集中可以有不同的值,如宽度和长度,因此我们不能根据它们的出现次数来表示它们,我们需要在这里使用高斯朴素贝叶斯。

需要考虑的一些事情:

它假设要素的分布是正态的

当我们所有的特征都是连续的时,通常使用它

多项式朴素贝叶斯

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

术语多项式朴素贝叶斯简单地告诉我们每个特征都有一个多项式分布。当我们有离散数据时使用它(例如,电影分级从 1 到 5,因为每个分级都有一定的频率来表示)。在文本学习中,我们有每个单词的计数来预测类别或标签。该算法主要用于文档分类问题(文档是否属于体育、政治、科技等类别)。).分类器使用的特征/预测值是文档中出现的单词的频率。

需要考虑的一些事情:

用于离散数据

适用于容易转换为计数的数据,例如文本中的字数。

平均单相关估计量(AODE)

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

AODE 是一种半朴素贝叶斯学习方法。它是为了解决流行的朴素贝叶斯分类器的属性独立性问题而开发的。它通过对所有模型进行平均来实现,在所有模型中,所有属性都依赖于该类和一个单独的其他属性。它经常以少量增加计算量为代价开发比朴素贝叶斯更精确的分类器。

需要考虑的一些事情:

将它用于名义数据在计算上比常规的朴素贝叶斯更有效,并且实现了非常低的错误率。

贝叶斯信念网络(BBN)

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

一种概率图形模型,通过有向非循环图表示一组变量及其条件依赖关系。例如,贝叶斯网络可以表示疾病和症状之间的概率关系。在给定症状的情况下,该网络可用于计算各种疾病出现的概率(另一个例子见上图)。BBN 是一种特殊类型的图表(称为有向图)以及一组相关的概率表。另一个例子是扔硬币。硬币可以有两个值——正面或反面,各有 50%的概率。我们把这些概率称为“信念”(即我们认为国家硬币=头像是 50%)。

需要考虑的一些事情:

BBNs 使我们能够对不确定性进行建模和推理

BBNs 最重要的用途是根据对事件的实际观察修正概率

可用于了解导致某个问题的原因,或者在计算生物学和医学等领域的风险分析和决策支持中,给定一个操作产生不同影响的概率。

贝叶斯网络

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

贝叶斯网络是一种概率图形模型(概率性的,因为它们是根据概率分布构建的)。这些网络可用于预测、异常检测、诊断、自动洞察、推理、时间序列预测和不确定情况下的决策。这些网络的目标是模拟条件依赖,因此也是因果关系。例如:如果你在屋外,开始下雨,你的狗很可能会开始叫。这反过来会增加猫藏在沙发下的可能性。所以你可以看到关于一个事件(雨)的信息是如何让你对一个看似不相关的事件(藏在沙发下的猫)做出推断的。

需要考虑的一些事情:

你可以用它们来预测未来

有助于解释观察结果

贝叶斯网络非常便于表示多个事件之间的相似概率关系。

隐马尔可夫模型(HMM)

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

HMM 是一类概率图形模型,它允许我们从一组观察变量中预测一系列未知(隐藏)变量。比如根据某人穿的衣服类型(观察到的)来预测天气(隐藏变量)。这可以是泳衣、雨伞等。这些基本都是证据。

已知 HMM 用于强化学习和时间模式识别,例如手写、语音、词性标注、手势识别和生物信息学。

HMM 回答这样的问题:给定一个模型,序列 S 发生的可能性有多大?给定序列 S 和隐藏状态数,使 S 的概率最大化的最佳模型是什么?

需要考虑的一些事情:

隐马尔可夫模型适用于基于特征序列进行识别的应用。

hmm 可用于建模由以确定的(或典型的)顺序发生的不同阶段组成的过程。

HMM 需要在一组种子序列上训练,并且通常需要比简单马尔可夫模型更大的种子。

条件随机字段

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

训练序列模型的经典 ML 模型。它是一种区分分类器,模拟不同类别之间的决策边界。判别模型和生成模型之间的区别在于,判别模型试图模拟条件概率分布,即 P(y|x),而生成模型试图模拟联合概率分布,即 P(x,y)。他们的基本原则是,他们对连续输入应用逻辑回归。隐马尔可夫模型与 CRF 有一些相似之处,其中之一是它们也用于顺序输入。CRF 最常用于 NLP 任务。

假设你有朋友生活中某一天的一系列快照。你的目标是给每张图片贴上它所代表的活动的标签(吃饭、睡觉、开车等等。).一种方法是忽略快照具有顺序性质的事实,并建立每个图像的分类器。例如,您可以了解到在凌晨 5 点拍摄的黑暗图像通常与睡眠有关,而带有食物的图像往往与吃有关,等等。然而,由于忽略了顺序方面,我们丢失了很多信息。举个例子,如果你看到一张嘴的特写照片会发生什么——是关于说话还是吃东西?如果你知道之前的快照是你朋友吃东西的照片,那么这张照片更有可能是关于吃东西的。因此,为了增加我们的标签器的准确性,我们应该考虑附近照片的标签,而这正是条件随机场所做的。

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

需要考虑的一些事情:

CRF 预测对应于输入序列的最可能的标签序列

与 HMM 相比,由于 CRF 没有 HMM 那样严格的独立性假设,所以它可以适应任何上下文信息。

CRF 也避免了标签偏差问题。

在算法的训练阶段,CRF 在计算上非常复杂。当有新数据可用时,很难重新训练模型。

如果你对我的更多作品感兴趣,你可以看看我的 Github ,我的学者页面,或者我的网站

ML 算法:一种基于 SD (σ)实例的算法

原文:https://towardsdatascience.com/ml-algorithms-one-sd-σ-instance-based-algorithms-4349224ed4f3?source=collection_archive---------6-----------------------

基于实例的机器学习算法简介

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

当面对各种各样的机器学习算法时,一个显而易见的问题是“哪种算法更适合特定的任务,我应该使用哪种算法?”

回答这些问题取决于几个因素,包括:(1)数据的大小、质量和性质;(2)可用的计算时间;(3)任务的紧迫性;以及(4)你想用这些数据做什么。

这是我在以前的文章中写的许多算法中的一部分。
在这一部分中,我试图尽可能简单地展示和简要解释可用于基于实例的任务的主要算法(尽管不是全部)。

基于实例的算法:

这些算法不执行显式归纳,而是将新的问题实例与训练中看到的实例进行比较,这些实例已经存储在内存中。

K-最近邻(KNN)

可用于分类和回归问题。KNN 存储所有可用病例,并通过其 K 个邻居的多数投票对新病例进行分类。通过在整个训练集中搜索 K 个最相似的实例(邻居)并总结这 K 个实例的输出变量,对新的数据点进行预测。例如,如果我们取 K=3,并且我们想要决定一个新的例子属于哪一类,我们考虑离新的例子最近的 3 个点(通常是欧几里德距离)。

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

对于回归问题,这可能是平均输出变量:

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

需要考虑的一些事情:

选择 K 的最佳值最好通过首先检查数据来完成(您可以使用弯头方法)。

这是一种监督学习算法。

学习矢量量化(LVQ)

作为分类算法开发。它能够支持二元(两类)和多类分类问题。K 近邻的一个缺点是,您需要保留整个训练数据集。LVQ 是一种人工神经网络算法,允许您选择要保留多少训练实例,并准确学习这些实例应该是什么样子。实例数量的值在学习过程中被优化。

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

需要考虑的一些事情:

这是一种监督学习方法

如果您发现 KNN 在数据集上给出了很好的结果,请尝试使用 LVQ 来减少存储整个训练数据集的内存需求。

自组织映射(SOM)

一种无监督的深度学习模型,主要用于特征检测或降维。SOM 不同于其他人工神经网络,因为它应用竞争学习,而不是纠错学习(如梯度下降的反向传播),并且在某种意义上,它们使用邻域函数来保持输入空间的拓扑属性。SOM 执行从高维空间到二维空间的拓扑有序映射。换句话说,它产生训练样本集的输入空间的二维表示。

例如,让我们看看手写数字数据集。SOM 的输入是高维的,因为每个输入维度表示 28×28 图像上一个像素的灰度值,这使得输入是 784 维的(每个维度是 0 到 255 之间的值)。

如果我们将它们映射到 20x20 SOM,并根据它们的真实类别(从 0 到 9 的数字)对它们进行着色,我们将得到以下结果:

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

真实类别根据左下方的颜色进行标注。

看一下黄色区域。这就是 6 被映射到的地方,请注意与其他类别有一点重叠。相比之下,看看左下方,绿色和棕色的点重叠的地方。这就是高级官员在 4 和 9 之间感到“困惑”的地方。

SOM 的另一个例子是 NLP。我们可以用它对 200 万份医学论文进行分类。SOM 将创建一组意思相似的单词:

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

右下方的单词与大脑相关,右上方的单词与医学影像相关。

需要考虑的一些事情:

SOM 输出任意数量指标的 2D 图。

我们可以使用 SOM 对数据进行聚类,而不需要知道输入数据的类成员。

局部加权学习(LWL)

LWL 背后的基本思想是,不是为整个函数空间建立全局模型,而是基于查询点的相邻数据为每个感兴趣的点创建局部模型。

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

为此,每个数据点成为一个加权因子,它表示该数据点对预测的影响。通常,与当前查询点邻近的数据点比远离的数据点接收更高的权重。基本上,假设你想预测未来会发生什么。你可以简单地进入你以前所有经历的数据库,然后抓住一些相似的经历,将它们组合起来(也许通过加权平均,更强地加权更多相似的经历),并使用组合来做出预测。

需要考虑的一些事情:

LWL 方法是非参数的。

如果你对我的更多作品感兴趣,你可以看看我的 Github ,我的学者页面,或者我的网站

最大似然算法:一个标准差(σ)-回归

原文:https://towardsdatascience.com/ml-algorithms-one-sd-σ-regression-47b01d8d51f9?source=collection_archive---------26-----------------------

机器学习回归算法简介

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

当面对各种各样的机器学习算法时,要问的明显问题是“哪种算法更适合特定的任务,我应该使用哪种算法?”

回答这些问题取决于几个因素,包括:(1)数据的大小、质量和性质;(2)可用的计算时间;(3)任务的紧迫性;以及(4)你想用这些数据做什么。

这是我在以前的文章中写的许多算法中的一部分。
在这一部分,我试图尽可能简单地展示和简要解释可用于回归任务的主要算法(尽管不是全部)。

回归算法:

回归分析是一种预测建模技术,调查因变量(目标)和自变量(预测值)之间的关系。它可用于时间序列建模、预测和寻找变量之间的因果关系。例如,你可以用它来找出司机草率驾驶和交通事故数量之间的关系。

回归分析有几个好处:

它告诉我们因变量和自变量之间的重要关系。

它告诉我们多个自变量对因变量的影响强度。当我说多个独立变量时,我指的是几个 x,例如在“时间延迟和方向对触觉对象识别的影响”中,我们将时间延迟和方向作为 x,将对象识别作为 y。

普通最小二乘回归(OLSR) 线性回归中的一种方法,通过创建一个模型来估计未知参数,该模型将最小化观察数据和预测数据(观察值和估计值)之间的误差平方和。
基本上是计算每个 Xi 的系数( β )的一种方法:

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

找到β系数的方法是最小化误差,因此称为“最小二乘回归”。当相加时,偏差首先被平方,所以正值和负值之间没有抵消。

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

OLSR 有一些局限性:冗余信息/两个解释变量之间的线性关联(即共线性)会导致对系数的误解,因此我们需要比 x 变量更多的观测值。为了克服这些,你可以使用 PCR (主成分回归)。

线性回归 用于估计实际价值(房屋成本、通话次数、总销售额等)。)基于连续变量。

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

需要考虑的一些事情:

自变量和因变量之间必须有线性关系。

多重回归存在多重共线性(多重回归模型中的多重共线性是两个或多个解释变量之间高度线性相关的关联)。

线性回归对异常值非常敏感。

线性回归是一种参数回归。这意味着,它假设因变量和自变量之间的关系的性质是已知的(例如,是线性的)。

您可以使用度量 R-square(R2)-由线性模型解释的响应变量变化的百分比来评估模型性能。

逻辑回归 用于根据给定的独立变量集估计离散值(如 0/1、是/否、真/假等二进制值)。

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

需要考虑的一些事情:

它用于分类问题。

它不需要因变量和自变量之间的线性关系。

逐步回归 在我们处理多个自变量时使用。它会将特征一个接一个地添加到您的模型中,直到为您的特征集找到最佳分数。逐步选择在向前和向后之间交替,引入和移除满足进入或移除标准的变量,直到获得一组稳定的变量。

需要考虑的一些事情:

它使用 R 平方、t-stats 和 AIC 度量等统计值来识别重要变量。

多元自适应回归样条(MARS

高维数据的灵活回归建模,搜索有助于最大化预测准确性的交互和非线性关系。

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

这种算法本质上是非线性的(这意味着您不需要通过手动添加模型项(平方项、交互效应)来使您的模型适应数据中的非线性模式)。MARS 是一种非参数回归——它没有对因变量与预测变量之间的关系做出任何假设。相反,它允许回归函数直接由数据“驱动”。MARS 通过一组系数和完全由回归数据确定的所谓基函数(预测值)来构建因变量和自变量之间的关系。

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

需要考虑的一些事情:

MARS 在数据挖掘领域非常流行,因为它不假设任何特定类型或类别的关系(例如,线性、逻辑等)。)在预测变量和感兴趣的因变量(结果变量)之间。

如果你面对预测者和目标之间复杂的非线性关系,火星可能是有用的,尤其是在高维空间。

连续预测和分类预测都可以用于 MARS。然而,基本的 MARS 算法假设预测变量本质上是连续的。

因为 MARS 可以处理多个因变量,所以也很容易将该算法应用于分类问题。

火星倾向于过度拟合数据。为了克服这个问题,MARS 使用了一种修剪技术(类似于分类树中的修剪),通过减少其基函数的数量来限制模型的复杂性。基函数的选择和修剪使得该方法成为预测器选择的非常有力的工具。基本上,该算法将只选取那些对预测做出“相当大”贡献的基函数(和那些预测变量)。

在回归树模型也适用的情况下,MARS 特别有用,例如,在预测变量上分层组织的连续分割产生准确的预测。

您应该将 MARS 视为回归树的一般化,其中“硬”二元分割被“平滑”基函数所取代,而不是将其视为多元回归的一般化。

局部估计散点图平滑(黄土) 一种用于拟合两个变量之间的平滑曲线,或拟合结果与多达四个预测变量之间的平滑曲面的方法。基本上,它是一种用于回归分析的工具,通过散点图创建一条平滑的线,帮助您看到变量之间的关系并预测趋势。这个想法是,如果你的数据不是线性分布,你仍然可以应用回归的想法。您可以应用回归,这被称为局部加权回归。当自变量和因变量之间的关系是非线性时,可以应用黄土。目前,大多数算法(如经典的前馈神经网络、支持向量机、最近邻算法等。)是全局学习系统,其中它们用于最小化全局损失函数(例如误差平方和)。相比之下,局部学习系统会将全局学习问题分成多个更小/更简单的学习问题。这通常通过将成本函数分成多个独立的局部成本函数来实现。全局方法的缺点之一是有时没有参数值可以提供足够好的近似。但接下来是黄土——全局函数逼近的替代方法。

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

需要考虑的一些事情:

黄土图通常用于拟合散点图的直线,在散点图中,噪声数据值、稀疏数据点或弱相互关系会干扰您查看最佳拟合直线的能力。

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

那么我该如何选择使用哪一个呢?

在选择正确的模型之前,数据探索应该是您的第一步(确定变量的关系和影响)。

要比较模型的优劣,您可以使用不同的指标,如参数的统计显著性、R 平方、调整后的 R 平方、AIC、BIC 和误差项。

交叉验证是评估用于预测的模型的最佳方式-将您的数据分为训练和验证。观察值和预测值之间的简单均方差为您提供了预测准确性的度量

还要记住,像套索、岭和弹性网(保持阅读)这样的正则化方法在数据中变量之间的高维度和多重共线性的情况下工作得很好。

如果你对我的更多作品感兴趣,你可以看看我的 Github ,我的学者页面,或者我的网站

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值