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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

即使是经验丰富的定量分析师也会犯的三个主要错误

原文:https://towardsdatascience.com/three-cardinal-mistakes-even-experienced-quants-make-b6e2f8b3bad4?source=collection_archive---------12-----------------------

避免这些简单的错误,成为优秀的量化交易者

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

量化交易是计算机编程、机器学习、金融和统计的熔炉。要成为量化分析师,你需要精通所有这些交易,至少精通其中一些。许多不同的方法被用来以编程方式确定何时买卖股票,包括时间序列预测(例如:ARIMA & GARCH 模型),机器学习(例如:SVM 或基于股票价格特征的神经网络),以及图表工具(例如:布林线)。不管你来自什么学科,用什么方法,有三件事你必须绝对注意,这常常让有经验的交易者感到困惑。

前瞻偏差

当您的模型可以访问它不应该知道的未来数据时,就会出现前瞻偏差。考虑下面的例子。这是 2019 年,我刚刚编写了一个程序,它使用深度学习来预测股票价格在未来一周内是上涨还是下跌。我有 2010 年以来国家交易所(NSE)所有股票的历史数据。我编写了一个模拟器,并根据 2010 年至 2019 年期间的数据对我的模型进行了回测。交易所列出了 2000 多只股票,但我只想交易流动性好的股票,所以我只对构成指数的 50 只股票(NIFTY50)训练和测试我的模型。而且,哇,我的模拟告诉我,我每年将获得 60%的回报,所以我开始兴奋地交易。像一个优秀的交易者应该做的那样,我将我的模型在现场交易时的表现特征与我在模拟中得到的进行比较,令我沮丧的是,我发现模型在现场交易时表现非常不同。哪里出了问题?

我使用 2019 年指数中的股票在 2010 年至 2019 年期间进行交易。实际上,在 2010 年,我的模型可以窥视未来,并看到一只特定的股票将在 9 年后的 2019 年进入前 50 只指数股票。这是前瞻偏差。正确的股票选择应该是在某一年只使用当年指数中的股票。前瞻偏见可能会以潜移默化的方式渗入到您的代码中,尤其是当您的编程包含复杂的数据操作时。例如,在预计算要素时,某个特定的要素可能会揭示当天的收盘价,这将为您的模型提供有关市场方向的线索。如果你的交易策略在模拟中表现出色,在计算错误后,你首先要检查的是是否存在前瞻偏差。

低估滑动

市场不是在单一价格上运行的。它基于两种价格:买价和卖价。出价是买家愿意支付的最高价格,要价是卖家愿意接受的最低价格。当根据历史数据对模型进行回溯测试时,或者通俗地说,当谈到股票价格时,我们通常会考虑一个价格,通常是最近的交易价格或 LTP。买卖价格之间的差异被称为买卖价差。在模拟时,我们假设如果一只股票的 LTP 是 110.5,我们就可以在 110.5 买入或卖出这只股票。在实时交易中,情况并非如此。如果 LTP 是 110.5,那么出价可能是 110.4,而要价可能是 110.6。如果你在买一只股票,你将能在 110.6 而不是 110.5 买到它。这 0.1 的差异被称为滑移。滑点是不能模拟的,因为它紧密地依赖于实时市场条件和你的仓位大小。大多数天真的交易者考虑交易成本,比如经纪费和交易费,但是他们不考虑滑点。大多数有经验的交易者假设任意的滑点成本占仓位大小的百分比,但是他们从来不去验证这个数字是否符合真实的市场条件,而且更多的时候,他们低估了它。这是一个巨大的错误。

如果你想成为盈利的量化交易者,你必须计算你的滑点成本。有两种方法可以做到这一点。首先,统计方法是获取市场订单快照,并确定不同股票在一天中不同时间的买卖价差。如果你交易的是流动股票,LTP 大致介于买价和卖价之间,用这种方式统计 LTP 的滑点会给你一个大致准确的数字。我推荐的第二种方法是根据经验来决定。当你开始实时交易时,在执行每笔交易前注意 LTP,在执行后注意你的交易价格。经过几个月的交易,计算这两个数字,确定你的滑点成本。对于期权等波动性较大的工具,买卖价差非常大,LTP 可能位于任何地方:在买卖价差之间,或者远在一边。对于这些,经验确定是必由之路。

在测试集上拟合模型

我们都知道为什么需要将数据分为训练集、验证集和测试集。然而,当你日复一日、月复一月、有时甚至数年地研究同一个问题时,你会不经意地开始在测试集上间接拟合模型。理想情况下,测试集应该保存在保险库中,只有在实验完成后才能取出。然而,定量分析师很清楚,我们的实验永远不会结束。我们是炼金术士,我们将继续尝试阳光下的一切,直到我们把我们的模型变成金子。当多个模型在验证集上表现相似时,我们选择在测试集上表现最好的一个。当我们下一次迭代时,我们重复这个过程,最终,通过许多这样的迭代,我们使我们的模型适合测试集。一个解决方案是保留多个测试集,并定期在它们之间切换,这样就不会过度适应任何一个测试集。另一个解决方案是遵守纪律,不要让测试性能影响模型选择,但是相信我,遵守纪律说起来容易做起来难。

结论

量化交易很难,因为你需要正确地运用很多技巧才能让它发挥作用。这三个错误虽然很容易理解,但是业余爱好者和专业人士都经常犯。如果你避免了这些,你已经在成为一个理智的量化交易者的路上了。

如果你喜欢这篇文章,可以在 上查看我的其他作品,在LinkedInTwitter,查看我的 个人网页 ,或发电子邮件至【viraj@berkeley.edu】

欧洲电视网欢乐三图

原文:https://towardsdatascience.com/three-charts-on-the-joy-of-eurovision-e653b8713072?source=collection_archive---------10-----------------------

使用数据可视化更深入地了解欧洲电视网国家的投票模式、战略投票和 LGBTQ 权利

由于它每年吐出的统计数据量巨大,欧洲电视网是创造数据可视化的梦想成真——特别是对我和若昂这样的超级粉丝来说。

在今晚决赛的预期中,我们已经看了哪些国家选择冠军的次数最多;就投票而言,谁是欧洲最好的朋友;同性恋友好国家是否真的更受欢迎?

哪个国家“选择”获胜者?

这不能告诉我们他们对音乐是否有好的品味…

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

尽管几十年来未能确保获胜,但英国给比赛获胜者最高分的次数最多——在过去 20 年的比赛中这样做了 11 次。因此,在这方面,英国至少可以感到一些自豪。

安道尔和阿塞拜疆的最高分从未颁给获胜者,但罗马尼亚却垫底,因为它参加了更多的比赛。

欧洲有哪些脱颖而出的投票关系?

如果这是一种人际关系,马耳他可能会因为忽视而抛弃意大利

欧洲电视网的乐趣并没有在表演后结束,在我看来,持续到深夜的紧张和公开的政治投票同样令人着迷。

从过去十年的数据来看,我们毫不惊讶地发现,在整个欧洲,邻国之间有许多成对的“最好的朋友”,他们互相交换大量的积分。罗马尼亚和摩尔多瓦名列榜首,分别获得 97 分和 106 分。

更有趣的是,我们还发现了许多不平等的投票关系,其中一方给比他们大的邻居更多的分数,而没有得到很多分数的回报。这可能是因为音乐更好,或者是因为较小的国家没有进入决赛,以获得积分。但是想象这对夫妇中不幸的国家的失望是很有趣的。

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

欧洲电视迷和同性恋权利有什么关系?

对同性恋权利越差的地方越不感兴趣,在同性恋友好的北欧国家收视率最高

欧洲电视网,有像肯奇塔·沃斯特和达纳国际这样的著名行为,已经被 LGBTQ 社区所接受。它通常被称为同性恋超级碗,但这真的反映在它的收视率上吗?这些地图显示了对同性恋最友好的国家和欧洲电视网最高收视率之间的关系。

但是欧洲并不像我们想象的那样进步,正如下面的粉红色地图所示,中欧和东部边缘地区存在 LGBTQ 歧视和侵犯人权行为。俄罗斯和阿塞拜疆不会令人惊讶,但意大利和瑞士等国家也缺乏 LGBTQ 权利。

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

我们还分析了过去 20 年的结果,绘制了一张地图,显示欧洲最成功的国家在哪里。我们通过计算一个国家在决赛中的平均排名来得出这个结论。

这里的情况要复杂得多。最成功的国家分为两类,一类是拥有同性恋友好法律和狂热的欧洲电视观众的国家(北欧国家),另一类是同性恋权利和电视观众人数都很少的国家(如土耳其、俄罗斯和意大利)。

请注意,澳大利亚出现在这些地图中,因为它们也在欧洲电视网中——但那是另一回事了!

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

我们如何创建我们的数据,即?

我们从datagraver.comrainbow-europe.orgoneurope.co.uk下载了数据。然后,我们使用 React 来处理数据,并创建两个投票图表的核心部分。然后,我们使用矢量图形编辑器 Sketch 进行设计修正。对于地图,我们使用 datawrapper.de 来创建它,并使用ezgif.com将它制作成 GIF 动画。

喜欢你看到的吗?在 Twitter 上关注我们的 Eurovision #dataviz:

奥利弗·卡林顿

Jupyter 笔记本的 3 大新增功能

原文:https://towardsdatascience.com/three-great-additions-for-your-jupyter-notebooks-cd7373b00e96?source=collection_archive---------9-----------------------

最有用的扩展我找到了。 不要错过这个。

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

我喜欢 Jupyter 笔记本电脑以及它们提供的强大功能。

它们可以用来以最有效的方式展示发现和共享代码,这在以前的 ide 中是不容易的。

然而,仍有一些不足之处。

在我的文本编辑器中,有一些我渴望的功能是 Jupyter 默认没有的。

但是不要担心。就像 Python 中的所有东西一样,Jupyter 也有第三方扩展。

这个帖子是关于我发现的一些最有用的扩展。

1.可折叠标题

我最喜欢的一个扩展是可折叠标题。

它使笔记本的流程更容易理解,也有助于创建像样的笔记本。

要获得这个,在终端窗口上用这个命令安装jupyter_contrib_nbextensions包:

conda install -c conda-forge jupyter_contrib_nbextensions

软件包安装完成后,我们可以使用以下命令启动 jupyter 笔记本:

jupyter notebook

一旦你进入 jupyter 笔记本的主页,你可以看到为NBExtensions创建了一个新标签。

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

使用这个包我们可以得到很多扩展。

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

看起来是这样的:

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

2.自动导入

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

自动化是未来。

困扰我的一件事是,每当我在我的任何数据科学项目中打开一个新的 Jupyter 笔记本时,我需要复制粘贴许多库和其中一些的默认选项。

告诉你一些我常用的进口货:

  • Pandasnumpy——在我看来,Python 必须将这两个设为默认导入。
  • Seaborn ,matplotlib, plotly_express
  • 改变一些熊猫和海豹的默认选项。

这是我最后反复粘贴的脚本。

import pandas as pd
import numpy as npimport plotly_express as px
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline*# We dont Probably need the Gridlines. Do we? If yes comment this line*
sns.set(style="ticks")# pandas defaults
pd.options.display.max_columns = 500
pd.options.display.max_rows = 500

有没有一种方法可以让我自动化?

只需转到nbextensions选项卡并选择snippets扩展。

您需要对snippets.json文件进行以下更改。你可以在/miniconda3/envs/py36/share/jupyter/nbextensions/snippets位置找到这个文件。这个位置的 py36 是我的康达 virtualenv。我花了一些时间为我找到这个位置。你的可能不一样。请注意,你不必在site-packages转车。

您可以在下面看到这个扩展的运行。

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

相当酷。对吗?我还用它来为我的深度学习笔记本和基于 NLP 的笔记本创建基本片段。

3.执行时间

我们已经使用了%time以及基于 decorator 的定时器函数来测量我们函数的时间。您也可以使用这个出色的扩展来完成这项工作。

另外它看起来很棒。

只需从NBextensions列表中选择ExecutionTime扩展名,每次单元执行后,您将在单元底部看到执行结果以及单元执行的时间。

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

其他扩展

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

NBExtensions有很多扩展。我喜欢 NBExtensions 的一些其他扩展,您可能想看看:

  • **限制输出:**自从你在笔记本上打印了很多文字后,你的笔记本有没有挂过。这个扩展限制了一个代码单元下可以打印的字符数
  • **2 to 3 converter:**旧 python2 笔记本有问题。厌倦了更改打印报表。这个很好。

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

  • Live Markdown Preview: 我们中的一些人喜欢在笔记本上用 Markdown 来写博客。当你在写作中犯错误时,有时会很紧张。现在,您可以在编辑 markdown 单元格的源时看到其渲染输出的实时预览。

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

结论

我喜欢 Python 中的所有东西都有一个包。这同样适用于 Jupyter 笔记本电脑。

jupyter_contrib_nbextensions包开箱即用。

当涉及到检查执行时间、滚动笔记本和重复任务时,它让我的生活变得容易多了。

这个包确实提供了许多其他的扩展。一定要看看它们,看看哪些对你有用。

另外,如果你想学习更多关于 Python 3 的知识,我想从密歇根大学调出一门关于学习中级 Python 的优秀课程。一定要去看看。

我以后也会写更多这样的帖子。让我知道你对这个系列的看法。在关注我或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。

三款 Jupyter 笔记本扩展,最大限度减少干扰

原文:https://towardsdatascience.com/three-jupyter-notebook-extensions-that-minimize-distractions-bd9ec98f0e2c?source=collection_archive---------4-----------------------

通过关注重要的事情来提高你的生产力

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

Picture From Unsplash

为什么使用 nbextensions?

Jupyter 笔记本扩展,也称为 nbextensions,是帮助您提高工作效率的工具。它们提供了许多有用的功能,例如所谓的“变量检查器”,可以让您跟踪您定义的所有变量。然而,有一类特殊的鲜为人知的 nbextensions:那些专注于最小化分心的事物。在这篇文章中,我将首先向您解释如何安装 nbextensions,然后介绍三种 nbextensions,它们将通过最大限度地减少干扰来提高您的工作效率。

安装 nbextensions

有几种方法可以安装 nbextensions。例如,您可以逐个单独安装 nbextensions,但是,有一种更方便的方法。在安装jupyter _ contrib _ nbextensions的基础上,额外安装jupyter _ nb extensions _ configurator将提供管理 nb extensions 的便捷方式。

然后,在您的终端中运行以下代码块,以同时安装这两个程序:

**conda install -c conda-forge jupyter_contrib_nbextensions jupyter_nbextensions_configurator**

安装 nbextensions 和配置程序后,您可以看到所有可用的扩展,并通过导航到localhost:6006/extensions来激活它们。

既然已经安装了所有的需求,让我们看一下前面提到的三个 nbextensions:

1.便条簿

这个扩展正是它听起来的样子。scratchpad notebook 扩展允许您针对当前内核运行代码,而不必为了实验或计算的目的在实际代码之间不断添加新单元。使用 Shift+Enter 打开草稿栏,并通过 Ctrl+B 关闭草稿栏。

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

2.代码折叠

如果你是 RStudio 的狂热用户,你可能会错过使用 Juypter 笔记本时代码折叠创建的结构。这个扩展解决了这个问题。有三种受支持的代码折叠选项:

1.缩进折叠

该算法检测缩进,并允许您一个接一个地折叠缩进。这意味着您可以更加灵活地选择要折叠的代码量。

为了形象化,让我们看一下下面的代码单元:

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

如你所见,有两个缩进。因此,这个代码单元可以折叠成:

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

并且还融入了:

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

2.首行注释折叠

另一种方法是折叠首行有注释的单元格。这将导致只显示第一行的注释,而不是整个单元格。这样做,您可以在删除代码的同时,在第一行保留对单元格的简短而精确的描述。

因此,下面的单元格…

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

…可以折叠成:

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

3.魔术折叠

同样的概念也适用于第一行中的魔法命令。这种特殊的折叠选项对于导入包的单元格特别有用。这个选项的另一个应用是删除所有不是 Python 的代码,以避免可能的干扰。

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

折叠会将上面的单元格变成:

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

此外,在保存 Jupyter 笔记本时,您的所有文件夹都会被保存。

3.zenmode

我将在本文中介绍的第三个也是最后一个 nbextension 可能是三个中提到最多的。zenmode 扩展将删除菜单,使您能够专注于您的代码。在我看来,这也将使 Jupyter 笔记本界面在视觉上总体上更具吸引力。

下面的 GIF 说明了以上情况:

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

结论

对你的工作环境进行小小的改变会对你的工作效率产生巨大的影响。当设计一个人的工作环境时,最大限度地减少干扰和完全专注于编码是最重要的目标之一,使用 nbextensions 是一种很好的方式。当然,这三个扩展并没有包含 nbextensions 必须提供的所有功能。因此,如果你想了解更多,我会推荐你深入研究文档

参考文献:

[1] [非官方 Jupyter 笔记本扩展文档](http://Unofficial Jupyter Notebook Extensions)

数据科学和统计学之间的三个关键区别

原文:https://towardsdatascience.com/three-key-differences-between-data-science-and-statistics-7fe9a6535659?source=collection_archive---------28-----------------------

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

Picture from Andrea Piacquadio

数据科学在过去几年里越来越受欢迎,许多人把它和它更古老、更熟悉的亲戚统计学混淆了。作为一个既做过数据科学家又做过统计学家的人,我经常遇到这样的困惑。这篇文章试图澄清他们之间的一些关键差异。

不过,在我讨论它们的区别之前,让我们先定义一下它们。统计学作为一门学科是指收集、组织、分析和交流数据的数学过程。在统计学中,我通常将“传统”统计学定义为统计学导论课程中教授的统计过程,如基本描述统计学、假设检验、置信区间等:通常是统计学以外的人,尤其是商界人士,听到“统计学”这个词时的想法。

数据科学从最广泛的意义上讲,是一门组织、处理和分析计算数据以解决问题的多学科科学。尽管数据科学与统计学和“传统”统计学相似,但它们都有所不同:

区别 1:数据科学不仅仅是一个数学领域

统计学是数学的一个领域;然而,数据科学不仅仅指数学。简而言之,数据科学以使用计算数据来解决问题为中心,【I】这意味着它包括分解计算数据所需的数学/统计学,还包括高效和有效地编写这些算法所需的计算机科学和工程思维,以及基于该分析制定战略决策的业务、政策或其他特定主题“智慧”。

因此,统计学是数据科学的重要组成部分,但数据科学不仅仅包括统计学。统计学作为数学的一个领域,恰恰包括分析和解释数据的数学过程;然而,数据科学还包括通过计算进行分析的算法问题解决,以及利用该分析做出决策以满足上下文中实际需求的艺术。统计学显然是数据科学过程的重要组成部分,但数据科学通常是指分析计算数据的整个过程。在实践层面上,许多数据科学家并非来自纯粹的统计背景,而是来自计算机科学或工程,利用他们的编码专业知识来开发高效的算法系统。

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

Picture from Carlos Muza

差异#2:综合数据与样本数据

在统计研究中,研究人员通常无法分析整个群体,也就是他们正在分析的整个群体,因此他们创建了一个更小、更易于管理的个体样本,他们希望这个样本能够代表整个群体。然而,数据科学项目通常涉及分析大量的总结性数据,封装整个群体。

传统的统计工具非常适合科学研究,在科学研究中,人们必须走出去收集有关所讨论主题的数据。因为这通常非常昂贵和耗时,研究人员在大多数时间只能收集更广泛人群的子集数据。

计算的最新发展,包括收集、存储、传输和处理更大计算数据的能力,扩展了现在可能的定量研究的类型,数据科学已经发展到解决这些新类型的研究。许多数据科学项目需要从已经收集的关于整个人口的大量数据中找到有意义的见解,而不是根据一组经过严格审查的变量收集精心选择的人口样本。

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

Picture from Hans-Peter Gauster

区别#3:探索性与确认性

数据科学家经常寻求建立模型,用数据做一些事情;然而,统计学家通过他们的分析试图从数据中学习一些东西。因此,数据科学家通常会根据他们执行给定任务的效率来评估他们的机器学习模型,例如它在优化变量、确定最佳行动过程、正确识别图像特征、为用户提供良好建议等方面的表现。为此,数据科学家通常会根据选定的性能指标来比较许多模型的有效性或准确性。

在传统统计学中,问题通常围绕使用数据来理解基于样本发现的研究主题。接下来的问题围绕着样本能对更广泛的人群说些什么,以及它的结果有多大可能代表或适用于更广泛的人群。

相比之下,机器学习模型通常不寻求解释研究主题,而是一些事情,这可能导致非常不同的研究策略。数据科学家通常试图确定/产生具有最佳性能的算法(给定他们用来评估性能如何“更好”的任何标准),在此过程中测试许多模型。统计学家通常采用他们认为能准确代表背景的单一模型,然后根据该模型得出结论。

因此,数据科学通常是探索性分析的一种形式,通过试验几种模型来确定某项任务的最佳模型,并进行统计验证性分析,试图确认得出给定假设对更广泛的人群来说是正确的结论的合理性。

大量的科学研究已经从理论上证实:一个科学家有一个世界的模型或理论;他们设计并实施了一个实验来评估这个模型;然后根据实验结果使用假设检验来确认或否定该模型。随着数据可用性和计算的变化,探索性分析、数据挖掘和使用数据生成假设的价值急剧增加(Carmichael 126)。

数据科学作为一门学科,一直处于利用不断增长的计算能力进行探索性工作的前沿。

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

Picture from Kendall Lane

结论

我的一位数据科学家朋友曾经打趣我说,数据科学就是应用计算统计学。这是有一定道理的:数据科学的数学工作属于统计学范畴,因为它涉及收集、分析和交流数据,而且,由于它强调和利用计算数据,它肯定会成为计算统计学的一部分。数据科学的数学也非常明确地得到应用:面向解决实际问题/需求。因此,数据科学和统计学是相互关联的。

然而,它们在正式定义和实际理解上都有所不同。现代计算和大数据技术对数据科学产生了重大影响。在统计学中,计算统计学也试图利用这些资源,但是已经成为“传统”的统计学(还)没有包含这些资源。我怀疑在未来几年或几十年,现代计算、数据科学和计算统计学的发展将重塑人们认为的“传统”或“标准”统计,使其更接近今天的数据科学。

有关更多详细信息,请参见以下有用资源:

伊恩·卡迈克尔和 J.S .马龙的“数据科学与统计学:两种文化?”在日本统计与数据科学杂志:【https://link.springer.com/article/10.1007/s42081-018-0009-3

“数据科学家与统计学家”在https://opendatascience . com/Data-Scientists-vs-statistics/https://medium . com/odsc journal/Data-Scientists-vs-statistics-8ea 146 b 7 a 47 f

https://www.educba.com/data-science-vs-statistics/举办的“数据科学和统计学之间的差异”

【我】卡迈克尔 118。

【https://ethno-data.com/data-science-vs-statistics/】可以在这里找到原版出版物。其余的文章请随意查看:【http://ethno-data.com/。**

也感谢《数据科学》杂志发表这篇文章。关于他们工作的更多细节,见

每个人都应该知道的三个关键误差区间

原文:https://towardsdatascience.com/three-key-error-intervals-everyone-should-know-658e2d8bfe?source=collection_archive---------31-----------------------

说“推断统计”这个词,人们通常会惊恐地睁大眼睛,但他们不必如此可怕,一旦你知道他们在做什么,他们就可以成为有用的工具。

不管你喜不喜欢,数据科学是围绕着解释数据和讲述数据给我们带来的故事而建立的。为此,对于人们要有信心( p 值有人吗?)在我们所说的话中,我们经常需要量化我们给出的价值。这要求我们对统计学和误差估计有所了解和理解。例如,能够辨别一个图表上的一个大的突然变化是真实的还是不真实的,可能是一个公司花费资源去纠正它的区别。

出于这个原因,当结果被呈现时,你能理解、解释和说明你可能看到或使用的三种主要类型的区间是什么是至关重要的。因此,我将讨论置信区间和它的另外两个兄弟姐妹(预测性和耐受性),以及置信水平。

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

Photo by Isaac Smith on Unsplash

我们为什么关心?

很常见的是,当我们研究某一特定人群时,我们收集的数据只是该总人群的一个样本(例如,因为它太耗时或太大而无法收集),然而,我们经常希望使用该样本来“推断”他们所来自人群的一些情况。每个人最熟悉的最常见的统计数据是平均值。

样本的均值是总体均值的无偏估计量,但它是一个“点估计,它只给出一个要处理的值,如果我们从总体中随机选择另一个数据样本,它很可能会给出不同的均值。因此,计算一个“区间估计”通常是很好的,这是我们为感兴趣的总体参数构造一个似是而非的值的地方。我今天要讨论的三个区间涵盖了不同的区间估计,对回答不同的问题很有用。但是我们的区间估计有多宽呢?一般来说,这是由我们采集的样本数量和我们希望区间估计具有的置信度决定的(请查看下面的链接以了解更多信息)。

这些区间估计可以总结为:

  • 置信区间——我想要一个总体参数的可信值范围,比如它的平均值
  • 预测区间 —我想知道未来的观察值可能是多少,给定我从先前的观察中所知道的
  • 容差区间 —我想知道包含一定比例/百分比人口的数值范围

置信级别

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

Photo by Chris Liverani on Unsplash

阅读任何科学论文,你都可能听到关于置信水平的讨论(不要与置信区间混淆)。这通常以百分比的形式引用,常见值为 90%、95%和 99%(尤其是对生命至关重要的应用)。但是它们是什么意思呢?一个常见的误解是,它们告诉您真实(或真实)总体参数包含在该区间内的概率,而它真正的意思是,如果您重复采样并无限次计算该区间,置信水平是包含真实值的区间的百分比。这似乎不是一个很大的区别,但这是一个微妙的区别,它基于频率统计的基础。在大多数情况下,这种微妙之处并不重要,但如果有人向你挑战,知道这一点是有好处的。你会发现,对于给定的样本量,置信水平越高,区间估计覆盖的似是而非的值的范围就越大。在极端情况下,如果您使用 100%的置信水平,则计算的区间将包含参数可能取的所有可能值。当有人问生产过程中要破坏性测试多少个器件,以确保该批产品 100%可靠时,这通常会引起惊讶。

**注意:**如果您确实想要一个区间来说明真实值包含在这些值中的概率,那么我会查看基于贝叶斯统计的可信区间(我在这里不涉及这些,但是这里的、这里的和这里的是一些介绍链接)。

置信区间

这可以针对几个群体参数(中值、平均值等)进行计算。)但最常用于总体均值。这将给出总体均值的一系列似是而非的值(给定置信水平和数据样本),上限和下限称为置信上限和置信下限。这些的确切公式取决于被计算的人口参数,但是如果你想知道更多,我在这里提供了一些链接( 12 )。这个区间没有给出从总体中的单个样本中可能得到的值的范围。这就是预测区间可以发挥作用的地方。

预测区间

这种情况通常出现在回归分析中,此时您对数据进行了直线拟合,并想知道另一个样本的值可能在哪里。它使用你先前样本的信息来构建它。它们可用于计算参考范围,参考范围用于确定测量值的正常范围。例如,给定一条生产线上的测试样品,下一个样品应在此范围内(如果预测间隔超过工程公差,那么您可以在样品生产或测试前就如何处理做出决定,等等。).你可以在这里阅读更多关于预测区间的内容( 123 )。

公差区间

这是一个没有多少人听说过,但在工业上有很多有趣的用途和应用。这个区间是一个似是而非的数值范围,包含了一部分人口。我个人曾在可靠性工程中见过它的使用,在那里它被用来获得正在制造的产品的使用值,以确定实际的上限值和下限值来测试设备的可靠性(即 95%的人会在两年保修期内至少打开这个开关两次,最多 20,000 次)。我第一次在一本旧的海军条例手册中读到这些(他们想确定一定比例的射击落在目标的一定范围内),但如果你环顾四周,你可以在网上找到更多现代来源( 123 )。

关于公差区间的最后一节还提出了这样一个事实,区间不必同时有上限和下限。你可以计算它们只有一个上限或下限。在容差区间的例子中,这在可靠性方面很有用,因为您可能想知道 0 到 95%的客户使用值,并测试上限的极值。

我希望这是一个有趣的,如果短期的高层次的看那种在你的数据科学工具包中有好处的统计。

机器学习中的三个关键失败

原文:https://towardsdatascience.com/three-key-fails-in-machine-learning-50b386b08bef?source=collection_archive---------23-----------------------

与机器学习相关联的神话可能会导致对何时以及如何应用机器学习的糟糕判断

我对分析学的介绍有点落后。我第一次大量参与任何类型的专门分析项目是机器学习项目。我的意思是,如果你要做这件事,为什么不做到底呢?

我不是在抱怨。这是一次奇妙的学习经历。它教会了我很多关于高级分析的技术方法。我了解了技术和数据管理。但最重要的是,我了解了一个神话是如何围绕着术语机器学习发展起来的,而事实上,它一点也不神秘。我记得在团队会议上,不知情的参与者将我们正在做的事情描述为“黑暗艺术”。

现实是,机器学习没有任何黑暗、神秘或神话的东西。在机器学习方法中采用的大多数统计方法在贝叶斯方法的情况下已经知道了几十年,甚至几个世纪。机器学习这个术语的激增完全是关于技术,以及它如何使我们能够以计算资源以前变得具有挑战性或完全不可能的方式将这些方法应用于大型数据集。

然而,神话依然存在。有很多人相信,或者被引导相信,机器学习项目可以执行某种超现代的魔法,挑战人类解决同一问题的所有方法。这是危险的,因为这可能意味着个人或团队在没有适当的批判性思维和人类判断的情况下,基于某种奇迹将会发生的信念,开始了占用大量资源和时间的努力。

在我继续之前,我想澄清一下:我不是在批评机器学习本身。有无数的使用案例表明,它带来了价值和效率,如果没有机器学习带来的突破,我们今天的生活将不会一样。不,我的观点是,我们不应该相信机器学习在所有情况下都有效,我们应该对如何以及何时投资这些技术更加谨慎。

为了说明我的观点,这里是我在机器学习项目中目睹的三个主要失败。

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

1.目标设定不当

根据我最近写的另一篇文章,了解并阐明机器学习项目的目的是至关重要的。要么你建立你的模型来解释某事,要么你建立它来预测某事。大多数时候,一个更好地解释一种现象的模型在预测它时并不是最优的。此外,能够很好地预测某些事情的模型通常具有非常明显的特征,并且构成了预测能力的很大一部分,所以这并没有给它们很大的解释能力。

机器学习工作的目的得到所有各方的澄清和同意是至关重要的。我们建立一个模型主要是为了解释或预测。它不能两者兼而有之。这一点应该没有疑问。

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

2.糟糕的实验设计

假设你在一家销售公司工作,你想建立一个模型来解释是什么推动了销售代表的成功销售。你已经知道并且永远知道的一件事是,销售代表对现有客户的销售比对新客户的销售更成功。

你收集所有你能找到的数据,进行学习,然后在一次大型会议上宣布销售的三大解释性驱动因素是:

  • 客户以前是否购买过
  • 这是否是该代表以前拜访过的客户
  • 在反馈调查中,客户是否对销售代表评价很高

显而易见,所有这些驱动因素都与一个我们已经知道很重要的因素有关,因此这种努力没有提供任何附加值,事实上,通过包括这些数据,模型的数学现在被一个我们已经知道的因素所主导。如果有人预先考虑如何设计工作,这是可以避免的。也许我们可以删除这些数据,或者将样本限制在该组之外的客户。

3.糟糕的实际规划

无论你是出于解释还是预测的目的开始从事 ML,很少有人会想到成功的后果。

如果你建立了一个可以帮助诊断员工缺勤原因的模型,或者一个可以预测生产问题的模型,或者其他什么模型,你需要能够实际部署它。这时,您会发现模型中使用的一些数据源是从需要大量手动操作的文件中提取的。或者您发现一些输入是基于缺失数据估算的。

关键是,如果您正在开发 ML,希望它在未来得到部署,以帮助更有效地诊断或预测事物,您需要确保输入数据可以轻松地流入预测引擎。我见过如此多的人工智能成果,它们使用的数据没有机会被轻易改造,这就产生了一个全新的令人头痛的问题,而这个问题本可以被更好地预测。

虽然机器学习为我们如何理解数据提供了如此多的潜力,但我们仍然远远没有达到任何数据集都能保证成功学习的地步。事实上,没有强大的设计和规划,没有对数据结构的良好直觉,机器学习项目最终可能会浪费大量的时间和精力。通过检查目标、实验设计和实际计划,你会很好地意识到它是否值得。

最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在 LinkedIn Twitter上找我。

每个数据科学家都应该知道的三种模型解释方法

原文:https://towardsdatascience.com/three-model-explanability-methods-every-data-scientist-should-know-c332bdfd8df?source=collection_archive---------6-----------------------

排列重要性和部分相关性绘图新版 scikit-learn 0.22 支持(庆祝🎉!)和 SHAP 作为奖励。

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

Photo by Sagar Patil on Unsplash

2019 年 12 月 3 日,新版scikit-learn0.22 版本发布,其中附带了许多精彩且不容错过的功能,作为其 发布亮点 scikit-learn 0.22给出了一个快速总结:

  • 新增绘图 API:[plot_roc_curve](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.plot_roc_curve.html)[plot_partial_dependence](https://scikit-learn.org/stable/modules/generated/sklearn.inspection.plot_partial_dependence.html#sklearn.inspection.plot_partial_dependence)[plot_precision_recall_curve](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_curve.html)[plot_confusion_matrix](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.plot_confusion_matrix.html)
  • sci kit-学习堆叠[StackingClassifier](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.StackingClassifier.html)[StackingRegressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.StackingRegressor.html)的原生类。
  • 一个 scikit-学习排列重要性的本地函数,[permutation_importance](https://scikit-learn.org/stable/modules/generated/sklearn.inspection.permutation_importance.html)
  • 一个新参数 [ccp_alpha](https://scikit-learn.org/stable/modules/tree.html#minimal-cost-complexity-pruning)用于基于决策树的模型修剪树。
  • 支持 AUCROC 函数 [roc_auc_score](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html)的多类分类。
  • ….

看到了吗?很多期待已久的功能!尤其是原生支持堆叠岩石!但是在这篇文章中,我们来看看模型可移植性的三个重要工具* 其中一部分是由[plot_partial_dependence](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.partial_dependence.plot_partial_dependence.html)[permutation_importance](https://scikit-learn.org/stable/modules/generated/sklearn.inspection.permutation_importance.html)在新版本 scikit-learn 中实现的。*

目录

  1. 为什么可解释性很重要?
  2. 首先要做的是…
  3. 可变重要性-基于树的模型可变重要性
  4. 可变重要性—排列重要性
  5. 部分相关图
  6. 沙普利附加解释(SHAP)
  7. 那么,用哪个呢?
  8. 结论
  9. 参考

1.为什么可解释性很重要?

人们经常说机器学习模型是一个“黑匣子”。

人们知道他们非常擅长预测,但当有人问他们为什么擅长预测时,像损失函数最小化或利润最大化这样的行话不会有帮助。

相反,人们想听到的是“变量 A 正作用+10,变量 B 负作用-2… ”之类的东西,这就是线性模型相对于高级 ML 算法的常见嫌疑人的优势。

尽管如此,由于许多研究人员的贡献,现在有一些有用的工具来给机器学习模型赋予可解释性* 。*

有了那些工具,我们就可以知道和理解(至少感觉像*我们理解)那个哪个变量对预测的影响有多大?*****

根据 Kaggle 教程“机器学习可解释性”,可解释性的好处如下:

调试

-您可以从对预测的可疑影响中识别错误的预处理或数据泄漏。

通知特征工程

-当你没有直觉什么样的变量组合能给出好的预测力时,数据可解释性研究可能会给你一个答案。

指导未来的数据收集

——值得投资收藏的可能新变量是什么?

通知人类决策

-通过预测原因的可视化为人类决策提供洞察力。

建立信任

-如果解释与人类或专家的共同感知相匹配,它可以建立对模型的信任。

现在我将介绍三种常见的解释工具,

  • 可变重要性(基于树或通过排列)
  • 部分依赖图
  • SHAP

SHAP 不在这次 sklearn 更新中,但是我把它包括在列表中,因为它对模型的可解释性很重要。

------【变量重要性】-给出每个变量的‘重要性’量。 每个变量都有代表重要性的单值,它们的绝对值没有任何实际用途 因为它们就像变量的存在对损失函数值的影响。****

-偏相关图给出变量变化对预测的影响程度。 图的比例实际上对应于目标变量的比例,容易理解。 同样, 我们可以检查曲线上的变量变化 ,不是单个变量的值不像上面所说的变量重要性。

-【SHAP】给出 每行上的每个变量对预测贡献了多少。

**-作为奖励,“LIME”是另一种模型解释方法,它给出预测的行和列级分解。我不会在这里过多地谈论 LIME,但让我们只说 LIME 是 SHAP 的精简版(SHAP 需要时间来计算,特别是在内核 SHAP 的情况下。)参见 这篇才华横溢的帖子 作者 Joshua Poduska 更多莱姆和 SHAP 的对比。

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

Photo by Joao Tzanno on Unsplash

2.首先要做的是…

但是在深入到个体解释方法之前,我需要指出的是我们首先要做的是制造一个性能良好的模型,我们不能期望从糟糕的模型中获得正确的见解!这是因为每个解释逻辑都假设模型的预测足够好。****

因此,你不能指望模型解释取代 EDA 。相反,它是为了更好的特征工程而支持和增强 EDA(回到第一章并回顾“为什么可解释性很重要?“!!)

3.可变重要性-基于树的模型可变重要性

“变量重要性”*给出每个变量的“重要性”数量。每个变量都有一个代表重要性的值。我们应该记住的另一个性质是它们的标度没有任何实际意义因为它们是变量的存在对损失函数值的影响量。***

基于决策树的模型(决策树分类器、CART、随机森林、lightgbm 等。)有自己的可变重要性计算逻辑,基于通过节点分裂减少损失函数(参见此处了解更多细节),但是记住 GBDT 倾向于有多个选项来计算重要性,默认选项不是必要的损失函数减少。它可以是其他指标,如感兴趣的变量的分裂计数。****

姑且称之为“基于树的模型变量重要性”由于模型特定的架构,基于树的模型重要性是可计算的,因此训练过程是在单个变量、离散决策上分割节点,并且很容易比较进行不进行

**然而,难道其他模型不能表现可变的重要性吗?答案是肯定的!这就是“排列重要性”的原因!

4.可变重要性—排列重要性

" P*er mutation importance "与模型无关的变量重要性方法,这意味着它们不需要像决策树一样的单个变量相关的离散训练过程。他们是怎么做到的?***

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

Illustration of how to calculate permutation importance (https://www.kaggle.com/dansbecker/permutation-importance)

使用上表中的变量名,假设我们想预测一个人 20 岁时的身高(第一列),使用 10 岁时的数据(其他列)。

现在,我假设我们已经训练了一些模型,并且具有下降精度(下面的步骤 0)—同样,如果没有下降模型,我们无法获得变量重要性。

0。成功做出一个好的预测模型。

1。排列重要性从随机排列单个列中的值开始,以准备一种“新的”数据集。

2。接下来使用“新”数据,使用预训练模型进行预测(不要使用“新”数据重新训练模型!).精度应该比原始数据的精度稍差,并且应该增加损失函数。注意损失函数增加。

3。将数据恢复到原始顺序,重复相同的洗牌,并在下一列进行测量。

4。可选但常见的是,将所有变量中的重要性标准化为总计 1.0。

5。改变洗牌,我们可以多次计算一个变量的重要性。因此,我们可以计算排列重要性的平均值和标准差。

下面是使用 sci kit-learn 0.22 版中新函数[permutation_importance](https://scikit-learn.org/stable/modules/generated/sklearn.inspection.permutation_importance.html)的示例代码。使用的数据集来自 Kaggle 竞赛“纽约市出租车费用预测”。代码的输出是基于树的变量重要性与排列重要性输出的比较。

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

Tree-based vs. permutation importance. Find permutation importance has confidence interval.

5.部分相关图

变量重要性为每个变量给出一个重要性分数,这有助于了解哪个变量影响更大或更小。

**【PDP】则给出了代表变量在哪个取值范围对最终预测影响有多大的曲线。

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

Illustration of Partial Dependence Plot (PDP)

在从原始数据表拟合模型后,有意地将想要获得 PDP 的变量值更改为特定量,并运行预测,重复预测以覆盖区间。

PDP 可以通过 scikit-learn 版本 0.22 中的新函数[plot_partial_dependence](https://scikit-learn.org/stable/modules/generated/sklearn.inspection.plot_partial_dependence.html)实现。

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

1D partial dependence plots of lightgbm model prediction from NY taxi fare data

可以存在双变量版本的 PDP。新的 scikit-learn 功能支持其中任何一种。

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

2D partial dependence plots of lightgbm model prediction from NY taxi fare data

从上面的 PDP 输出中,我们可以看到 PDP 的计算量更大,并且需要时间来运行,尤其是一个 2D PDP 甚至需要 13 秒。

6.沙普利附加解释(SHAP)

【SHAP】*与其他方法论最重要的区别是,SHAP 赋予行&变量级影响预测***

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

Illustration of SHAP

在该图中,每个记录 ID 的预测值将被分解为“预测”=“平均预测”+“每个变量的 SHAP 值”****

那么,他们是如何做到的呢?SHAP 是基于联盟博弈论中的 Shapley 值方法。Shapley 值的本质是衡量联盟中每个成员对最终结果的贡献,保持贡献的总和等于最终结果。进一步讨论见此处

这里的数学机制太难描述了,我也不完全理解:),但至少我们可以运行 API 来获得 SHAP 值,这要感谢 python 库 [shap](https://github.com/slundberg/shap)

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

How SHAP values look like.

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

SHAP: Visualize SHAP values to the first row data (prediction average 8.486 to first row prediction 5.86)

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

SHAP: Variable importance-like plot (based on average of absolute SHAP value)

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

SHAP: PDP-like visualization

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

SHAP: Each plot represents one data row, with SHAP value for each variable, along with red-blue as the magnitude of the original data.

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

SHAP: Plot to play around interactively (two axis have pull-down menu to change items to show)

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

Photo by Lan Pham on Unsplash

7.那么,用哪个呢?

我们看到了三种不同的模型可解释性输出:可变重要性、PDP 和 SHAP。它们都提供不同外观的输出。当我们想要解释的时候,我们如何选择其中之一呢?

a.SHAP 值可以用于其他任何事情。

第一点是:

从某种意义上说,SHAP 具有优势,因为他们提供最精细的输出。

粒度输出可以汇总为粒度更小的输出,反之则不成立。这表明:

根据 SHAP 值,我们可以计算出可变重要性结果和 PDP 图:

取每个变量的绝对 SHAP 值的平均值将是一种变量重要性,绘制变量值对同一变量的 SHAP 值是一种 PDP。

这个网页给出了一个令人敬畏的列表,并解释了 SHAP 值的可能用途,甚至像使用 SHAP 值进行聚类

b.那么,为什么人们不总是使用 SHAP 呢?

SHAP 的一个缺点是它需要较长的计算时间。有两种类型的 SHAP,据报道“kernel shap”超级超级慢(参见上面示例代码中的注释;它慢了 40K 倍!!),而另一种类型“TreeSHAP”则实现速度更快。然而,让我们记住一件事:

不幸的是,TreeSHAP 只适用于基于决策树的模型。

不使用 SHAP 的另一个原因是,你为什么想要模型解释,

获取行和列级别的 SHAP 值可能会矫枉过正,而且不是实现目标的直接方法。

c.当可变重要性足够时

在某些情况下,可变重要性就足够了,我们不需要 PDP 或 SHAP。

  • 当我们希望领域专家对模型合理性进行嗅探测试时。

可变重要性给出其对预测的重要性的单一分数。这可以让非数据专家的领域专家确保模型是合理的。他们只能从每个变量的重要性的条形图中进行判断,如果不常见的变量变高,这可能是识别模型错误或数据泄漏的提示。

  • 当我们要对变量重要性的顺序做变量选择时。

变量选择在建模中非常有用,可以用更简单的方式解释模型,消除模型噪声以提高精度,避免共线性等。

对于可变重要性输出,我们可以选择具有最高重要性的原始变量集的子集。

在上面的纽约出租车费用示例中,很明显,乘客数量与费用金额无关,这从常识来看是有道理的,因为纽约出租车费用公式与乘客数量无关(虽然乘客多的出租车可能比单人出租车走得更远,但这对于我们从上下车地点获得的信息来说并不是新信息。)

d.PDP 够用的时候。

此外,在某些情况下,我们想要的不仅仅是可变的重要性,但是 PDP 就足够了,SHAP 也是多余的。

  • 当我们知道哪个变量是重要的,而我们只想挖掘“如何”时。

通过变量重要性研究,我们可以知道哪个变量使模型具有预测性,但接下来我们很自然地开始想知道它是如何做到的,即重要变量的哪个范围使预测更高或更低。

在上面的纽约出租车费用的例子中,我们了解到的是,在经度或纬度的终点,而不是中间让乘客上车或下车的出租车应该有更高的收益——曼哈顿中间的乘客很可能是短途乘客。

从这里,自然要想出一个新的特征工程思想来取取送地点之间的距离,而不仅仅是那两个单独的绝对位置。

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

Photo by Priscilla Du Preez on Unsplash

8.结论

模型可解释性在调试、特征工程、指导未来的数据收集、人类决策和建立信任中是有用的。

我已经介绍了三种类型的可解释性方法,可变重要性(基于树和排列),部分依赖图(PDP)和 SHAP。

虽然 SHAP 是了解模型可解释性的最细粒度的方法,并且可以检索类似于其他方法的输出,但是运行会花费时间并且变得过度。

我们数据科学家应该首先从为什么我们想知道模型的解释开始,并使用最符合目的的方法。

9.参考

sci kit 发布亮点-学习 0.22

Kaggle 课程“机器学习可解释性”

Christoph Molnar“可解释的机器学习——让黑盒模型变得可解释的指南。”

Joshua Poduska“SHAP 和 LIME Python 库:第 1 部分——伟大的解释者,两者都有优点和缺点”

在现实世界中扩展机器学习的三种实用方法

原文:https://towardsdatascience.com/three-practical-ways-to-scale-machine-learning-in-the-real-world-7a63504212fc?source=collection_archive---------25-----------------------

随着 NeurIPS 向人工智能世界发出了一个发人深省的信息,机器人行业似乎对扩展机器学习解决方案有了更务实的态度。

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

NeurIPS(神经信息处理系统会议)刚刚以创纪录的出席人数结束,即使是抽签系统也难以容纳。9000 张门票在 12 分钟内售罄,向来自世界各地的 AI 展示了爆炸式的兴趣。然而,尽管人工智能创新不仅开始在学术界出现,也开始在工业界出现,但大多数公司仍在努力识别高价值的用例,并在现实世界中扩大人工智能的规模。

我工作的公司提供机器学习软件,使工厂和仓库中的机器人更加自主和灵巧。为了弥合差距,我与机器人公司和系统集成商密切合作,将前沿的机器学习研究产品化。

上周我飞到了世界的另一端。世界上最大的机器人盛会——国际机器人展览会(IREX)在东京举行。在这里,领先的机器人公司展示了在机器人技术中应用人工智能和人工智能的各种方法。

人工智能实现了从自动化(硬编程)到真正自主(自我指导)的转变

之前我讲过如何 AI 推出下一代机器人 2.0 时代。在过去,机器人主要用于大规模生产线。它们被编程为以高精度和高速度执行相同的任务,但不能对变化或意外做出反应。

然而,随着消费者对定制需求的增长和劳动力的持续萎缩,我们需要更多自主和灵活的机器人。因此,公司开始尝试将 ML 纳入机器人技术的方法,使机器人能够处理传统机器人无法处理的广泛任务。在 IREX,ML 用于改善机器人视觉和控制以及现实世界用例的可扩展性。

[## 重新定义机器人:揭开下一代人工智能机器人的神秘面纱

这是一系列关于机器人和人工智能对各种行业的影响的第一篇文章。

medium.com](https://medium.com/swlh/redefining-robots-demystify-next-generation-ai-enabled-robotics-fec64bfeb66c) [## 它在这里!人工智能机器人将如何革新制造业

虽然制造业一直被认为是自动化程度最高的行业,但全自动化…

towardsdatascience.com](/its-here-how-ai-robot-will-revolutionize-manufacturing-44ce784438d4)

机器人视觉:识别、可伸缩性和自我学习的突破。

即使是最先进的 3D 结构光相机也很难识别带有透明包装、反射或黑暗表面的物体,因为光会被散射或吸收。

由于项目相互重叠,混乱的场景带来了更多的挑战。这就是为什么摇床和零件送料器被广泛应用于制造业。

此外,传统的机器视觉系统不够灵活:为了进行模式匹配,您需要通过事先上传 CAD 模型来注册对象。即使在这个过程中有一点小小的变化,你也必须重新注册这些物品,并给机器人重新编程。

但是现在,随着包括深度学习、语义分割和场景理解在内的领域的最新进展,我们可以用商品相机识别透明和反射包装。

在 FANUC 的展位上,一个捡垃圾箱的 LR Mate 200iD 机器人用深度学习算法和 3D 传感器捡空气接头。这些相同的零件被随机放在一个箱子里。Fanuc 声称,由于系统实时执行点云斑点匹配,因此不需要预注册。

就在发那科的展台旁边,川崎重工(KHI)展示了类似的箱柜分拣解决方案,利用了两家初创公司 Photoneo 和 Ascent 的 ML 技术。在展台的另一边,KHI 灵巧地展示了一个自动卸托盘机器人解决方案。这个机器人可以同时搬运各种尺寸的箱子。

在另一个大厅里,与 DensoWave 一起,旧金山的 ML 初创公司 OSARO 首次展示了它的“定向”功能:机器人可以从杂乱的垃圾箱中挑选透明的瓶子,不仅可以识别最佳的挑选点,还可以识别物体的方向(瓶子的顶部或底部),并将瓶子垂直放置在传送带上。

Yosuke Sawada, General Manager of the Robot Business Division at Denso Wave, commented: “OSARO’s newly developed ‘Orientation’ feature is one of the technologies customers have been waiting for. This exciting new feature helps identify challenging items and improve picking rates for warehouse operators and factory automators.”

瓶子是完全透明的,因此很难用传统的机器视觉传感器识别。这是第一次展示这种特征。它允许人工智能机器人不仅用于拾取和放置,还用于装配、包装、机器装载和组装。

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

source: Bastiane Huang

机器人控制:智能布局和基于 SKU 的处理

作为人类,我们从出生就学会了拿起和放下各种物品。我们可以本能地完成这些任务。但是机器没有这样的经验,必须学习这些任务。尤其是在日本这样的市场,能够整齐地摆放物品尤为重要。产品需要仔细整理和包装,不能有任何损坏。

利用 ML,机器人现在可以更准确地判断深度。模型还可以通过训练进行学习,并自动确定对象的方向和形状,例如,一个杯子是朝上还是朝下,或者处于其他状态。

对象建模或体素化可用于预测和重建 3D 对象。它们使机器能够更准确地呈现实际物品的大小和形状,并更准确地将物品放置在所需的位置。

这使得基于 SKU 的处理成为可能:机器人可以根据每个 SKU 自动决定轻轻地放置或快速放下物品。因此,我们可以在不损坏任何易碎物品的情况下优化系统的吞吐量。

公司也开始在运动规划中尝试强化学习或机器学习。正如 IREX 所说,Acsent 展示了一个使用强化学习将两部分放在一起的视频。领先的机器人公司 Yaskawa 也在一次演讲中谈到了在路径规划中使用机器学习的潜在好处。

然而,如果需要大量的训练数据和长时间的训练,上述机器学习进步都无法在现实生活中部署。在机器人和自动驾驶汽车等现实世界的应用中获取训练数据既有挑战性又很昂贵。这就是为什么我特别兴奋地看到数据效率在 IREX 被提及。

现实世界的可伸缩性:数据效率

在 IREX 的一场演讲中,安川去年成立的一家新公司 AI Cube Inc .(“AI”)推出了 Alliom,这是一款帮助公司将建立机器学习模型的过程数字化的工具。

根据 AI Cube 的说法,Alliom 提供了一个模拟环境,可以进行数据增强,并生成与现实生活中的物体相似的合成数据。该公司已经使用 Alliom 来加速随机箱拣选的 ML 模型的训练过程,并希望将该解决方案扩展到各种应用中。

这表明机器人行业已经不仅仅是试验花哨的 ML 算法,而是开始考虑在实地实际应用支持 ML 的机器人。ML 解决方案不仅需要工作,还需要能够有效地跨各种用例进行扩展。否则,客户将没有动力在其设施中部署该系统。

我在之前的文章中提到,机器人公司正面临着“创新的困境”:他们意识到了创新的迫切需求,但他们仍然需要照顾自己的核心业务——需要高速高精工作的汽车和制造公司。这与其他部门对灵活性、灵巧性以及机器人学习识别和处理各种组件的能力的需求背道而驰。

在 IREX,几个机器人巨头与初创公司一起展出:仅举几个例子,KHI 与 Photoneo、灵巧和 AscentDensoWave 搭配 OSAROFanuc 与首选网络。机器人公司正在改变以拥抱人工智能。但他们对 ML 给机器人行业带来的变化反应够快吗?

在汽车行业,我们看到汽车原始设备制造商在向自动驾驶的过渡中努力与特斯拉和 Waymo 等新进入者竞争。到目前为止,我们还没有看到任何科技巨头进入机器人行业。然而,谷歌、DeepMind 和脸书已经从事机器人相关的机器学习研究有一段时间了。

观察人工智能将如何扰乱和重新洗牌机器人行业将是一件有趣的事情。在科技巨头、机器人制造商、制造商和人工智能初创公司中,谁将在人工智能定义的机器人时代巩固地位?

[## 在人工智能定义的自动化的新时代,公司会蓬勃发展还是勉强生存?

我们谈到了 AI 如何使机器人能够执行过去无法完成的任务。会有什么影响…

towardsdatascience.com](/manufacturing-industry-reshuffle-will-companies-thrive-or-barely-survive-in-the-new-era-of-aa06a3cade5c)

如果你想看更多这样的文章,请点击这里!

Bastiane Huang 是 OSARO 的产品经理,OSARO 是一家总部位于旧金山的初创公司,致力于开发软件定义的机器人。她曾在亚马逊的 Alexa 小组和哈佛商业评论以及该大学的未来工作倡议中工作。她写关于人工智能、机器人和产品管理的文章。跟着她到这里 。

数据科学家的 3 个编程概念

原文:https://towardsdatascience.com/three-programming-concepts-for-data-scientists-c264fc3b1de8?source=collection_archive---------11-----------------------

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

Image by Sasin Tipchai from Pixabay

算法面试

更少的数学和更多的代码

算法是数据科学不可或缺的一部分。虽然我们大多数数据科学家在学习时没有上过适当的算法课程,但它们仍然很重要。

许多公司在招聘数据科学家的面试过程中会询问数据结构和算法。

现在,许多人在这里问的问题是,问一个数据科学家这样的问题有什么用。 我喜欢这样描述,一个数据结构问题可以被认为是一个编码能力测试。

我们都在人生的不同阶段进行过能力倾向测试,虽然它们不是判断一个人的完美代理,但几乎没有什么是真的。那么,为什么没有一个标准的算法测试来判断人的编码能力。

但我们不要自欺欺人,他们需要像你的数据科学面试一样的热情来破解,因此,你可能需要花一些时间来研究算法。

这个帖子是关于快速跟踪的,以一种容易理解的方式为数据科学家研究和平移一些基本的算法概念。

1.递归/记忆

递归是被定义的函数在它自己的定义中被应用。简单来说;递归是函数调用自己。当你在那里搜索递归的时候,谷歌做了一些非常有趣的事情。

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

希望你明白这个笑话。虽然递归对于初学者来说可能有点令人生畏,但它非常容易理解。一旦你知道了,这是一个美丽的概念。

我找到的解释递归的最好例子是计算一个数的阶乘。

def factorial(n):
    if n==0:
        return 1
    return n*factorial(n-1)

我们可以很容易地看出阶乘是一个递归函数。

Factorial(n) = n*Factorial(n-1)

那么它如何翻译成编程呢?

递归调用的函数通常由两部分组成:

  • 基本情况——递归结束的情况。
  • 递归公式–向基本情况发展的公式化方法。

你最终解决的很多问题都是递归的。它也适用于数据科学。

比如决策树只是二叉树,树算法一般是递归的。或者说,我们确实在很多时候使用了 sort。负责这个的算法叫做 mergesort, 本身就是一个递归算法。还有一个是 二分搜索法, 其中包括寻找数组中的一个元素。

现在我们有了递归的基本窍门,让我们试着找出第 n 个斐波那契数。斐波纳契数列是一系列数字,其中每个数字(斐波纳契数)是前面两个数字的和。最简单的是 1,1,2,3,5,8 等系列。答案是:

def fib(n):
    if n<=1:
        return 1
    return fib(n-1) + fib(n-2)

但是你发现这里的问题了吗?

如果您尝试计算 fib(n=7 ),它会运行 fib(5)两次,fib(4)三次,fib(3)五次。随着 n 变大,对同一个号码进行了很多次调用,我们的递归函数一次又一次地计算。

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

Source

我们能做得更好吗?是的,我们可以。我们可以稍微改变一下我们的实现,添加一个字典来为我们的方法增加一些存储空间。现在,每当计算出一个数字时,这个备忘录字典就会更新。如果该数字再次出现,我们不会再次计算它,而是从备忘录字典中给出结果。这种存储的增加叫做 记忆

memo = {}
def fib_memo(n):
    if n in memo:
        return memo[n]
    if n<=1:
        memo[n]=1
        return 1
    memo[n] = fib_memo(n-1) + fib_memo(n-2)
    return memo[n]

通常,我喜欢先编写递归函数,如果它反复调用相同的参数,我会添加一个字典来记忆解决方案。

有多大帮助?

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

这是不同 n 值的运行时间比较。我们可以看到,没有记忆的 斐波那契函数的运行时间呈指数增长,而有记忆的函数的运行时间呈线性增长。

2.动态规划

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

Bottoms Up

递归本质上是一种自顶向下的方法。当计算斐波那契数 n 时,我们从 n 开始,然后递归调用 n-2 和 n-1 等等。

在动态编程中,我们采用自底向上的方法。它本质上是一种迭代编写递归的方法。我们首先计算 fib(0)和 fib(1 ),然后使用以前的结果生成新的结果。

def fib_dp(n):
    dp_sols = {0:1,1:1}
    for i in range(2,n+1):
        dp_sols[i] = dp_sols[i-1] + dp_sols[i-2] 
    return dp_sols[n]

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

以上是 DP 与 Memoization 的运行时比较。我们可以看到,它们都是线性的,但 DP 还是快一点。

为什么?因为在这种情况下,动态编程只对每个子问题进行一次调用。

有一个关于开发动态编程的贝尔曼如何构建术语 : 的精彩故事

动态编程这个名字是怎么来的?20 世纪 50 年代不是数学研究的好年头。我们在华盛顿有一位非常有趣的绅士,名叫威尔森。他是国防部长,他实际上对研究这个词有一种病态的恐惧和憎恨。我能选择什么头衔,什么名字?首先,我对计划、决策和思考感兴趣。但是规划,由于种种原因,并不是一个好词。因此,我决定使用“编程”一词。我想让大家明白这是动态的,是多阶段的,是时变的。我想,一石二鸟吧。因此,我认为动态编程是一个好名字。**这是连国会议员都不会反对的事情。**所以我把它当活动用的雨伞。

3.二进位检索

假设我们有一个有序的数字数组,我们想从这个数组中找出一个数字。我们可以走直线路线,逐一检查每个数字,如果找到数字就停下来。问题是,如果数组包含数百万个元素,那么时间会太长。这里我们可以使用二分搜索法。

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

Source: Finding 37 — There are 3.7 trillion fish in the ocean, they’re looking for one

# Returns index of target in nums array if present, else -1 
def binary_search(nums, left, right, target):   
    # Base case 
    if right >= left: 
        mid = int((left + right)/2)
        # If target is present at the mid, return
        if nums[mid] == target: 
            return mid 
        # Target is smaller than mid search the elements in left
        elif nums[mid] > target: 
            return binary_search(nums, left, mid-1, target) 
        # Target is larger than mid, search the elements in right
        else: 
            return binary_search(nums, mid+1, right, target) 
    else: 
        # Target is not in nums 
        return -1nums = [1,2,3,4,5,6,7,8,9]
print(binary_search(nums, 0, len(nums)-1,7))

这是一个基于递归算法的高级例子,我们利用了数组是有序的这一事实。这里我们递归地查看中间的元素,看看我们是想在中间元素的左边还是右边进行搜索。这使得我们的搜索空间每走一步就缩小 2 倍。

因此该算法的运行时间是O(logn),与线性搜索的O(n)相反。

这有多重要?下面是运行时间的比较。我们可以看到,与线性搜索相比,二分搜索法非常快。

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

For n=10000, Binary search takes around 13 steps, and the Linear search takes 10000 steps.

结论

在这篇文章中,我谈到了一些最激动人心的算法,它们构成了编程的基础。

这些算法是数据科学面试中一些最常被问到的问题的背后,对这些算法的良好理解可能会帮助你获得理想的工作。

虽然您可以在不学习它们的情况下在数据科学中走得更远,但您可以为了一点乐趣而学习它们,也许是为了提高您的编程技能。

如果你想学习算法和数据结构,也可以看看我在系列的其他帖子。

继续学习

如果你想在算法方面读得更多,这里有一个 UCSanDiego 在 Coursera 上的 算法专门化 **,**我强烈推荐学习算法基础。

谢谢你的阅读。将来我也会写更多初学者友好的帖子。在关注我或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。

此外,一个小小的免责声明——这篇文章中可能会有一些相关资源的附属链接,因为分享知识从来都不是一个坏主意。

成功数据科学项目的三个问题

原文:https://towardsdatascience.com/three-questions-towards-a-successful-data-science-project-792a0df6755?source=collection_archive---------36-----------------------

什么时候数据科学项目是成功的?你会发现大多数关于数据科学项目的文章都涵盖了如何进行机器学习。不要误会,这是做数据科学家的重要一环。但是,要产生实际的商业价值,还有更多的事情要做…

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

Photo by Carlos Muza on Unsplash

成功的数据科学项目

作为一名数据科学家,你可能不对项目的成功负责。但是,当没有产生实际的商业价值时,企业可能会向您寻求解释。这意味着,作为一名数据科学家**,你只能通过你的项目取得与企业一样的成功**。

这让我想到一个问题,是什么让数据科学项目取得成功?从我的经验来看,当项目的每个阶段都在完成,我们在**【生产中】**产生商业影响时,商业是快乐的。

三个主要阶段

项目可以以多种不同的方式组织,然而所有成功的数据科学项目都会遵循三个主要阶段:

  1. 业务需求
  2. 机器学习
  3. 操作

那么,你如何判断自己是否走对了路呢?在项目过程中,我用三个问题问自己几次,以确保我在正确的轨道上。

三个问题

在我的数据科学项目中,我通过问以下三个问题来保持自己的敏锐。这些真的帮助我看到了全局,尤其是当你真正深入细节的时候。

  1. 具体的业务需求是什么?
  2. 我的机器学习选择如何影响业务影响和运营?
  3. 实施后业务是如何变化的?

让我们深入了解其中的每一项…

具体的业务需求是什么?

这是第一个问题,也可能是最重要的问题。因为公平地说,我为什么要在没有具体业务需求的情况下开始一个项目呢?如果没有,投入时间和金钱是没有意义的。

我们为什么要这么做?

有不同的答案选项,如增加利润、节约成本或提高客户满意度。我发现具体一点更好:“我们希望确保我们的销售代表节省时间,这样他们就可以花更多的时间与潜在客户在一起,从而获得更高的利润”。

我能解释一下情况和背景吗?

目前的流程是什么样的?IT 环境、数据可用性和质量如何?或许有什么触发事件让我们现在处理这个话题?

我了解业务需求吗?

最终用户可能有特定的需求或愿望。可能会有一些特定的情况允许你移动。GDPR 等法规可能与检查相关。最后,我需要与业务利益相关者交流,真正了解他们的需求。

典型陷阱

现在看起来很清楚,这些东西需要被覆盖。在实践中,我们经常发现团队没有在业务需求上花费足够的时间,并在项目后期陷入困境。他们提供了一些一开始就不需要的东西,他们失去了兴趣。

有时,业务利益相关者和数据科学家在同一个房间里,以为他们在同一页上,但后来发现他们不是。为了避免这种情况,在谈判桌上找一个了解双方的人,比如一个分析翻译

最后,团队经常无法测试可行性。在深入研究机器学习之前,这将有助于了解实现的可行性。准备好了吗?会有足够的资源吗?一开始我们可能不知道,但我们需要关注这一点!

我的机器学习选择如何影响业务影响和运营?

在任何时候,我都可以在机器学习和业务需求之间建立联系,另一边是运营。

我做的分析正确吗?

*你可能会想,“这很清楚,不是吗?”。不幸的是,情况并非总是如此。**我的模型能满足业务需求吗?*这可能与目标或损失函数有关。举个例子;在做预测时,我们可以问我们的商业利益相关者大的错误是否比小的错误更糟糕。这允许在均方根误差(RMSE)或平均绝对误差(MAE)之间做出选择。

在优化上花更多的时间真的会改善业务结果吗?

例如,我可以问自己,多 0.5%的精度是否真的会对我们的情况产生影响?当然可以这样,问自己这个问题不会有坏处。

如果我的模型需要几分钟来做一个预测,那么可能会有这样的情况,也可能会有这样的情况。如果没有,也许我会在优化我的代码之前先实现并看看我的解决方案是否能带来商业价值。

我的模特是性感还是有目标的?

我知道建立一个神经网络或者随机森林很酷。然而,我们真的需要它吗?问题是一个更简单的模型是否能完成这项工作,逻辑或线性回归通常是可行的,而且更容易向企业解释清楚。

典型陷阱

大多数数据科学家没有花足够的时间去理解他们的建模业务目标联系。数据科学家(相信我,我曾经经历过)倾向于尝试新奇的事物,而不是专注于创造更好的业务结果。

实施后业务是如何变化的?

实施您的解决方案是产生实际业务影响的唯一途径。为此,您需要正确的 IT 环境和业务流程。没有实施,没有业务影响。

我的组织准备好实施技术变革了吗?

这与技能、预算、维护可能性以及处理遗留系统和官僚程序有关。

有哪些具体的、可操作的成果?

导致实际业务影响的确切过程是什么?未阅读或未执行的仪表板没有实际的业务影响。

企业准备好迎接这一变化了吗?

我的业务利益相关者对这种变化持开放态度吗?他们有时间处理这种情况吗?如果我的业务利益相关者不理解或没有足够的数据素养来接受解决方案,将很难产生变化。接受是创造商业影响力的关键。

谁将参与变更,哪些流程将受到影响?

了解哪里会发生变化,绘制出变化前后的流程,并列出将受到影响的人员。我需要提前和他们谈谈,找出任何障碍。这将有助于我很好地理解需要做什么。

典型陷阱

不阐明项目的实现可能会导致最终发现 K.O .标准。团队有时未能足够早地阐明 it 准备情况,并发现很难让 IT 参与进来。变革管理也很重要,仅仅“将其投入生产”可能还不够,培训可能是合适的。最后,如果你没有为运营、维护和服务做好准备,当你的模型需要改变或出现问题时会发生什么?

摘要

任何成功的数据科学项目都会以某种方式贯穿业务需求、机器学习和运营这三个阶段,以产生实际的商业价值。

在从事数据科学项目时,我会问自己三个问题。“具体的业务需求是什么?”,“我的机器学习选择如何影响业务影响和运营?”,以及“实施后业务会发生怎样的变化?”

在项目的不同时间回答这些问题,让我能够关注全局,专注于创造真正的商业价值。需要帮助吗?通过www.aibridge.ch/contact联系我

关于我:我是一名人工智能管理顾问,我的使命是让数据科学家(再次)开心,并帮助组织利用人工智能产生商业价值。 在这里报名我的快讯

成功的机器学习项目的三个步骤

原文:https://towardsdatascience.com/three-steps-for-a-successful-machine-learning-project-baac098ba775?source=collection_archive---------16-----------------------

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

为所有 ML 项目减少技术考虑

随着人们和公司冒险进入机器学习(ML),一些人期望直接进入构建模型和生成有用的输出是很常见的。虽然 ML 的某些部分感觉像是这种带有神奇预测的技术魔法,但还有其他一些方面不那么技术性,而且可以说要重要得多。花足够的时间来定义正确的问题,适当地预处理数据,并考虑使用您的模型的影响,可以大大提高您的 ML 项目的成功。

我希望,作为一个寻求利用 ML 的公司、经理或工程师,这些提示将节省你的时间,并帮助你优先考虑你未来的努力。

它从一个问题开始

第一步,问正确的问题,通常可能是你机器学习冒险中最困难的部分。任何 ML 项目的目的都是为了回答一个问题。“这是谁写的”“这是什么”“价格会是多少”“有哪些图案”?有一个你专注于回答的具体问题,可以让你清楚地定义你的目标函数,并帮助你确定实际工作所需的数据。如果没有问正确的问题,您的团队可能会花费无数的时间来收集、提炼和建模数据,从而产生无用的产品。更糟糕的是,这种打嗝会降低 ML 在你的组织中的感知价值,导致未来更少的支持。

如果没有问正确的问题,你的团队可能会花费无数时间收集、提炼和建模数据,从而生产出无用的产品。

为了避免这种情况,在进行任何与数据相关的项目之前,暂停一下,清楚地说出你想要回答的问题。然后定义目标函数,例如最大化精确度,你计划用它来衡量你的进步。这看起来是一个简单的步骤,确实如此,但是很容易忘记。虽然你的第一个问题可能不正确,但至少你已经朝着一个明确的目标前进了,你可以从这个目标开始迭代。

准备准备你的数据

收集和预处理数据可能是 90%的工作。另外 10%可能是测试、调整和操作您的模型。对于浅层学习方法,这包括探索您的数据、工程特征以及将数据规范化为有用的格式。即使使用深度学习方法,也应该对数据进行探索和矢量化,以确保合理的性能。虽然这些操作中的许多都可以通过库(如 Scikit-learnKeras )中的几行代码轻松完成,但探索数据并验证它是否代表实际数据是非常耗时的。

功能工程需要对业务环境有相当深入的了解,拥有正确的功能确实可以改善您的成果,因此简单地让一个数据科学家独自解决问题可能不会有什么成效。那些在他们的组织中开始使用 ML 的人应该在期望结果之前留出足够的时间来进行数据探索和准备。要提前知道这一步可能要付出多少努力,不要急于给出正确的分数。

在生产环境中,您也可能没有收集到您希望的所有数据点,因此知道您可能需要迭代收集方面也有助于了解这一点。总的来说,计划一个更长的数据预处理迭代阶段,并相应地管理期望。

你的模式会有什么影响?

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

在一般意义上,机器学习,特别是深度学习,模型的输出值是基于它根据训练数据对自己进行的一些数学转换。

这些算法可能会在训练数据中识别出一些我们人类没有识别出的模式,但模型并没有有意识地思考或做出决定。它只是简单地调整权重或值,以便最大化/最小化其目标函数;一个非常独特的焦点。只要试着在一组完全不同的数据上利用你的模型,你就会意识到你的模型的“知识”是多么具体。

我们应该花点时间考虑为什么我们的输出是现在这个样子,它是否能很好地概括实时数据,以及使用它是否会有任何意想不到的后果。

我相信指出这一点是很重要的,因为很多时候很容易获得一个模型的输出(即预测)并利用它运行,而没有考虑可能已经泄漏到其中的偏差。我们应该花一点时间来考虑为什么我们的输出是这样的,它是否能很好地概括真实数据,以及使用它是否会有任何意想不到的后果。由于模型不是“思考”,它不会适应你的道德或伦理考虑,除非它的目标函数和训练数据是一致的。

结论

总之,机器学习的工具和技术正在快速发展,但是有许多辅助的考虑因素必须同时考虑。专注于正确的目标,正确处理数据,质疑你的输出,这些都是你在进行任何机器学习项目时应该考虑的行动。正如我们看到机器学习的技术能力呈指数级增长一样,我们应该以更快的速度推进机器学习的支持活动。

我在亚马逊学到的三件事为我从事机器学习做好了准备

原文:https://towardsdatascience.com/three-things-i-learned-at-amazon-that-prepared-me-for-a-career-in-machine-learning-63b6dae5bc5?source=collection_archive---------17-----------------------

亚马逊的文化为我从游戏开发到机器学习的工作转变做了比任何教程都多的准备。

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

Nick Youngson — Wooden Tile Amazon Image

我在亚马逊工作了 5 年,离获得梦寐以求的“黄色徽章”只有几天了值得注意的是,亚马逊的平均任期是一到两年。虽然有很多关于在亚马逊工作的故事,但我觉得那里的文化比任何教程都更能为我从游戏开发到机器学习的工作转变做好准备。

如果你不太了解亚马逊的文化,那么快速的谷歌搜索是值得的。此外,虽然我可能可以写一整本书来讲述我在那里的经历,但我认为我应该专注于我学到的为这一新的职业发展做准备的三件事:数据驱动、写 6 页纸和足智多谋。亚马逊有一套被称为领导原则的原则,这些原则造就了其独特的文化。自从我在 2014 年加入以来,同样的文化让亚马逊呈指数级增长。下面是我如何将这些知识应用到机器学习的新冒险中。

或许亚马逊企业文化最重要的部分是数据驱动的概念。

由数据驱动

虽然我工作过的许多公司都说他们这么做,但我还没有发现像亚马逊这样的公司。每一次计划或战略会议都是在回顾历史数据、实时数据和未来数据预测之间的微妙平衡。亚马逊将此归结为一门科学。

从 WBR(每周商业报告)试图将大量数据提取为可消化的形式,以便随时纠正错误,到大多数组织都有专门的数据分析师。分析师的唯一工作是帮助构建每周报告,连接不同业务部门的报告系统,并且主要是尽可能多地自动收集数据,以便我们可以随时了解业务部门的状态。

机器学习的支柱是数据本身。如果没有有用、干净、可靠的数据,就没有办法准确地训练、测试和验证模型。此外,虽然在构建模型的实际过程中花费了大量的时间和精力,但是理解数据本身是一项非常重要的技能。例如,我在东 ODSC 做了一次演讲,特别是关于管理用于检测癌症的大型数据集的挑战,如 T2 的 ChestXray14 数据集。

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

该研讨会的名称叫做“将‘数据’放入数据科学”,它完全专注于使用医疗数据进行深度学习的挑战。任何对机器学习感兴趣的人都应该具备的一项关键技能是,不仅要理解如何管理和处理数据,还要理解如何分割、验证和净化数据。你的实验和你拥有的数据一样好,知道如何管理它也同样重要。我在亚马逊学到了很多关于数据的重要性以及如何正确使用数据的知识。

写 6 页纸

A mazon 以其写作文化而闻名。虽然他们在入职培训中告诉你,任何人都可以提出一个想法,从头开始创建一个新的业务,例如 AWS 是如何产生的神话,但这是通过 6 页纸实现的。这些详细的文档不仅解释了一个策略或计划,而且还必须写成叙述。亚马逊会议中没有 powerpoint 演示。

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

All work and no play makes Jack a dull boy on Imgur

大多数会议的前半部分是阅读文件,后半部分是在文件上戳洞。要在亚马逊取得成功,你需要能够使用数据来证明你的观点,以其他人可以理解的方式阐述你的想法,并创建一个任何人,无论他们是否参加了你的会议,都可以拿起并理解的文档。

任何在机器学习领域工作的数据科学家或工程师都应该具备的最关键技能;能够交流他们正在做什么,如何复制它,以及它提供的价值。

数据科学社区的很大一部分围绕着撰写和阅读研究论文。因此,虽然这很容易类比 6 页纸在亚马逊的重要性,因为写 6 页纸就像写一篇博士论文,但实际上,数据科学家应该出于多种原因记录他们的研究。通常,他们在团队中工作,因此能够跟踪达成解决方案的步骤是至关重要的。如果没有大量的实践,每个人都不具备获取这些知识并与团队或公司外部的其他人分享的能力。

我认为这是任何在机器学习领域工作的数据科学家或工程师都应该具备的最重要的技能之一;能够交流他们正在做什么,如何复制它,以及它提供的价值。

随机应变

从外面看,亚马逊似乎是一个拥有几乎无限资源的大型组织;现实情况是,每个部门的团队通常都很小。事实上,规模如此之小,以至于他们有时人手不足。此外,团队应该精益运营,相应地管理有限的资源,大多数时候,你会身兼数职。

虽然一个团体可以获得更多的资源,但亚马逊的核心原则是节俭。要在亚马逊取得成功,你需要尽你所能做到最好,并发挥创造力来实现你的最终目标。甚至有一个原则叫做行动偏好,它允许你不顾限制地变通规则来完成某件事,只要是为了最终目标的利益。

我没有预料到每次训练之间所花费的时间,也没有预料到加速训练所需的 GPU 资源。

随着我对机器学习的深入研究,我很清楚管理资源在我进行的每个实验中是如何发挥关键作用的。我没有预料到每次训练之间所花费的时间,也没有预料到加速训练所需的 GPU 资源。此外,随着我运行越来越多的实验,我需要找到创造性的方法来平衡云中的扩展和利用本地资源。

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

Panumas Nikhomkhai — pixels.com

大多数时候,我会尽可能多地进行本地测试,然后在多台经过不同修改的计算机上并行运行我的云中实验,以更好地帮助确定哪个解决方案是最佳的。目前,数据科学家很难聘用,所以有可能你最终会在较小的团队中工作,需要找出如何在每个人之间共享资源,并在保持低成本的同时加快培训模型之间的时间。这是一个微妙的平衡动作。

把这些放在一起

人们问我为什么从游戏开发转向机器学习,我最感兴趣的事情之一是如何解决我看到的数据科学家每天都在努力解决的许多问题。您如何同时管理多个实验,处理大型数据集,并扩展工作负载以提高效率?这些都是我在进入游戏行业前几年做 Web 开发时学到的东西,我觉得我可以将我所知道的贡献给机器学习社区。

最近,我一直在围绕DeepOps——或深度学习操作的想法做演讲。这是一个概念,借用了 DevOps,将深度学习的所有痛点自动化。这些恰好也是我在亚马逊学到的一些技能。我发现有趣的是,让我在亚马逊取得成功的东西和目前帮助我在机器学习方面取得更好成绩的东西之间有很多重叠。当你将这些实践融入一家公司的文化中时,你会取得令人难以置信的成就,并且希望,随着时间的推移,DeepOps 也能成为自己的文化。然而,那是另一篇文章了。

关于人工智能和机器学习的三本顶级书籍

原文:https://towardsdatascience.com/three-top-books-about-artificial-intelligence-and-machine-learning-b48ff2fa3548?source=collection_archive---------2-----------------------

三本令人难以置信的人工智能书籍,让你的思维开窍,思维活跃。

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

在这篇文章中,我将谈论三本关于人工智能和机器学习的书,我发现它们是每个这些主题的爱好者必读的。从阅读这些书籍中获得的经验千差万别:其中一本书将谈论人工智能正在走向,通往它的不同道路,可能的危险,以及处理这些危险的方法。

其中一本书将剖析大脑的功能,并恢复我们神经系统内部发生的事情与机器学习模型内部发生的事情的相似性。

最后一个谈到了不同的机器学习家族,机器学习的最终目标(主要从研究的角度),我们与这个目标的关系如何,以及我们最有可能达到这个目标的方式是什么。

如果这听起来有趣,请继续阅读来寻找这些精彩的文学作品,不要担心,我只是浅尝辄止地谈论书籍的内容,以鼓励你阅读它们,绝对没有剧透**😃**

尼克·博斯特罗姆的《超级智慧》

麻雀未完成的寓言:

这是筑巢的季节,但经过几天漫长的辛勤劳动,麻雀们坐在晚霞中,放松地鸣叫着。

“我们都那么弱小。想象一下,如果我们有一只可以帮我们筑巢的猫头鹰,生活会变得多么轻松!”

“是!”另一个人说,“我们可以用它来照顾我们的老人和孩子”

第三个人补充道:“它能给我们建议,还能帮我们留意邻居家的猫。”。

老鸟帕斯托斯说:“让我们向四面八方派出侦察兵,设法在某个地方找到一只被遗弃的小猫头鹰,或者一只蛋。一只乌鸦或者一只小黄鼠狼也可以。这可能是发生在我们身上的最好的事情,至少自从在那边后院的无限谷物馆开业以来。”

鸟群兴奋起来,到处的麻雀开始声嘶力竭地鸣叫。

只有脾气暴躁的独眼麻雀斯克罗芬克不相信“奋进号”的智慧。他说:“这肯定会导致我们的毁灭。在我们把这种动物带到我们中间之前,我们难道不应该先考虑一下驯化和驯服猫头鹰的艺术吗?”

驯服猫头鹰听起来是一件非常困难的事情。找到一个猫头鹰蛋就够了。所以让我们从这里开始。在我们成功饲养了一只猫头鹰之后,我们可以考虑接受另一项挑战。”帕斯图回答道。

"那个计划有一个漏洞!"吱吱叫scrnkfinkle;但他的抗议是徒劳的,因为鸥群已经起飞,开始执行帕斯图制定的指令。

只有两三只麻雀留在后面。他们一起开始尝试研究如何驯服或驯化猫头鹰。他们很快意识到帕斯图斯是对的:这是一个非常困难的挑战,尤其是在没有真正的猫头鹰来练习的情况下。尽管如此,他们还是尽最大努力,时刻担心在找到控制问题的解决方案之前,鸟群可能会带着猫头鹰蛋回来。

这个故事开始于瑞典哲学家尼克·博斯特罗姆的一本书《超级智慧》,这本书讨论了在不久的将来机器是否会变得比人类更聪明的问题。 麻雀未完成的寓言 指的是一个我们并不完全熟悉的实体的控制问题,其权力可能超出了我们个人的能力范围。

虽然时间还不确切,但人工智能领域的顶尖人物普遍认为,机器达到与人类同等智能的那一天终将到来。

当这一天到来的时候,会就此打住吗?或者,机器会利用它们新达到的人类水平的智能,超越这个门槛,达到比人类更高的意识和知识水平,让它们主宰世界,甚至整个宇宙?

什么是智力?有哪些形式的智能存在?机器最有可能实现这种超智能的方式是什么?我们会为这一事件做好准备吗?如果没有,怎么准备?有哪些可能的结果?人工智能的行为有什么特定的动机吗?

博斯特罗姆在这本精彩的书中用大约 320 页的文字、图表和图像回答了这些问题以及更多的问题。如果你想知道其中任何一个问题的答案,或者只是想了解人工智能可能存在的缺点,这本书绝对是不遗余力的必读之作。

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

雷·库兹韦尔《如何创造思维》

“如果一台机器被证明与人类无法区分,我们应该给予它与人类一样的尊重——我们应该接受它有思想”

如何创造一个头脑 雷·库兹韦尔 谷歌工程总监,揭露了他的大脑运作理论*,*** 基于等级模式识别器的存在,我们从其最低抽象层次向其最高维度投射现实。你可能已经注意到我使用了“他的理论”这个术语。**

这是因为即使在过去的十年中,神经学和神经科学领域已经取得了一些惊人的成就,我们对大脑的知识仍然有许多迷雾,因此本文所描述的也不过如此;一种理论。

在整本书中,我们可以发现与我们大脑内部执行的底层过程之间的许多相似之处,以及支持各种技术的基本过程,主要是基于机器学习的,比如像 AlexaSiri 这样的虚拟助手,或者例如自动驾驶汽车。****

我们头脑中大约 350 克的质量和我们所知的写这篇文章的计算机有很多相似之处。

库兹韦尔还揭示了几个世纪以来,随着技术的使用,人类能力的提高:从第一把用来砍树的斧子到我们现在随身携带的智能手机,这些基本上是我们身体的延伸。谁知道呢,也许在几十年后,我们会使用类似的设备,但这些设备会直接集成到我们的生物学中**。**

最后,在这本书的结尾,有几章致力于心灵的哲学和形而上学方面,如意识、自由意志或同一性概念。

虽然这本书面向有技术背景或兴趣的读者,但任何想知道大脑如何工作的人都肯定会喜欢这本书,并进入我们这个时代最伟大的技术思想家之一的头脑。

“因为重要的东西都装在一个箱子里,所以你有一个头骨当你的大脑,一个塑料套当你的梳子,一个钱包当你的钱”

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

佩德罗·多明戈斯的《大师算法》

“所有的知识——过去、现在和未来——都可以通过一个单一的通用学习算法从数据中推导出来”

机器学习世界,可以大致分为 5 个不同的大洲,每个大洲代表一个特定的方法或算法家族,这些方法或算法家族或者在产生它的范例上,或者在每个家族的底层方法上,或者在算法工作的方式上,都不同于其他的。正因为如此,他们每个人都擅长解决特定的问题,并且有一些特定的用例应用。

然而,它们都有一个共同点:发现数据中隐藏的洞察力,并利用这些洞察力产生某种价值。前段提到的五大家族分别是: 贝叶斯主义者联结主义者进化论者、 类比主义者、象征主义者

本书以一个小介绍机器学习** 开始,接着是作者工作的主要动机:寻找一个通用的机器学习算法,可以用来解决任何一种问题。已经开发了结合两个或更多上述家族的算法,收集了它们组成家族的优点,但是没有一个算法能够将它们全部联合起来。**

然后每个家族都被描述**,有他们的历史,优缺点,和主要算法。最后,多明戈斯谈到了人工智能即将到来的未来,描述了这种通用算法的优点和能力,但很大程度上撇开了在前几本书中提到的可能的危险和挑战。**

虽然这本书即使对于非机器学习从业者来说也是一本很好的读物,但是如果我们确实对每一个家族有某种了解,并且至少在某种程度上使用过不同种类的算法,如朴素贝叶斯、支持向量机或神经网络,这将是最令人愉快的。与前两本书不同的是,非常专注于机器学习,然而一切都用大量的例子、类比和图表进行了非常非常好的解释。

“一种算法来统治他们,一种算法来发现他们,一种算法来把他们都带来,在黑暗中把他们捆绑起来,在数据所在的学习之地”

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

结束语

一如既往,我希望你喜欢这篇文章,并且我已经说服你至少读了其中一本书。它们都是非常棒的作品,我本可以就它们中的每一个写一篇深入的文章,但从我的角度来看,它们非常适合作为一个包,如果你读完它们,你会对人工智能的当前状态有一个令人难以置信的概述。

在这里你可以找到它们的链接。

随时与我联系LinkedIn或在 Twitter 上关注我@jaimezorno。还有,你可以看看我其他关于数据科学和机器学习的帖子 这里 。好好读!

要找到更多关于人工智能的书籍,比如本文中的书评,请查看以下回购:

** [## 人工智能书籍——如何学习机器学习

有一些关于人工智能和机器学习的书,把大部分技术放在一边…

howtolearnmachinelearning.com](https://howtolearnmachinelearning.com/books/artificial-intelligence-books/)

如果你想了解更多关于机器学习和人工智能的知识 在 Medium 上关注我,敬请关注我接下来的帖子!

在那之前,保重,享受 AI!**

PyTorch 中构建神经网络的三种方法

原文:https://towardsdatascience.com/three-ways-to-build-a-neural-network-in-pytorch-8cea49f9a61a?source=collection_archive---------7-----------------------

体验 PyTorch 灵活的深度学习框架

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

Photo by 贝莉儿 DANIST on Unsplash

TLDR;
这不是 PyTorch 的教程,也不是解释神经网络如何工作的文章。相反,我认为分享一些我在 Udacity Bertelsmann 奖学金 AI 项目中学到的东西是个好主意。尽管如此,本文的目标是说明在 PyTorch 中创建神经网络的几种不同方法。

先决条件:我假设你知道什么是神经网络以及它们是如何工作的…所以让我们开始吧!

简介

假设您想要定义以下神经网络,具有一个输入层、两个隐藏层和一个输出层,中间层具有 relu 激活,输出层具有 sigmoid 激活函数,如下所示:

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

Fully Connected (Feed Forward) Network

这是一个全连接的 16×12×10×1 神经网络,在隐藏层有 relu 激活,在输出层有 sigmoid 激活。

1。手动构建权重和偏差

解决这个问题的一个方法是构建所有的模块。这是一种低级的方法,但如果你试图在刚刚阅读的论文上复制最新和最伟大的深度学习架构,这可能是合适的。或者如果你想开发一个定制层。不管怎样,PyTorch 会保护你的。你需要定义你的体重和偏好,但是如果你在这个水平上感到舒适,你就可以开始了。这里的关键是你需要告诉 PyTorch 在你的网络中什么是变量可优化,这样 PyTorch 就知道如何在你的网络上执行梯度下降。让我们看看有人如何在低级 PyTorch 中实现这一点:

Building a neural network in low level PyTorch

2。扩展 torch.nn.Model

在实践中,我们大多数人可能会使用预定义的层和激活函数来训练我们的网络。如果你朝这个方向走,有几条路可以走。一个更优雅的方法是创建你自己的神经网络 python 类,从 torch.nn 扩展Model 类。以这种方式定义神经网络有许多优点,也许最值得注意的是,它允许继承 torch.nn 模块的所有功能,同时允许覆盖默认模型构造和正向传递方法的灵活性。在这种方法中,我们将定义两种方法:

1.类构造函数, init

2.前进的方法

第一个是类的初始化器,在这里你将定义组成网络的层。通常我们不需要在这里定义激活函数,因为它们可以在正向传递中定义(即在 forward 方法中),但这不是一个规则,如果你想的话,你当然可以这样做(我们实际上将在最后看到一个例子)。

第二种方法是定义向前传球。该方法接受一个表示模型将被训练的特征的输入。在这里,您可以调用激活函数,并将之前在构造函数方法中定义的层作为参数传入。您需要将输入作为参数传递给第一层,在处理激活后,输出可以被输入到下一层,依此类推。

让我们来看看在实践中如何做到这一点:

A more elegant approach to define a neural net in pytorch.

这是上面的输出…

MyNetwork(
  (fc1): Linear(in_features=16, out_features=12, bias=True)
  (fc2): Linear(in_features=12, out_features=10, bias=True)
  (fc3): Linear(in_features=10, out_features=1, bias=True)
)

在上例中, fc 代表全连通层,因此 fc1 代表全连通层 1,fc2 代表全连通层 2,以此类推。请注意,当我们打印模型架构时,激活功能没有出现。原因是我们使用了 torch.nn.functional 模块中的激活功能。它使代码更加紧凑,适合这种方法。

3。使用 torch.nn.Sequential

pytorch 中仍然有一种更简洁的方法来定义神经网络。这是一种模块化的方法,通过 torch.nn.Sequential 模块成为可能,如果你来自一个 Keras 背景,在那里你可以定义连续的层,有点像用乐高积木搭建东西。这与 Keras 的顺序 API 非常相似,并且利用了 torch.nn 预构建的层和激活函数。使用这种方法,我们的前馈网络可以定义如下:

A more compact approach.

输出:

Sequential(
  (0): Linear(in_features=16, out_features=12, bias=True)
  (1): ReLU()
  (2): Linear(in_features=12, out_features=10, bias=True)
  (3): ReLU()
  (4): Linear(in_features=10, out_features=1, bias=True)
  (5): Sigmoid()
)

请注意,这些层被编入索引,并包含激活功能。事实上,我们可以通过简单地索引模型对象来检查单个层并调试模型权重。

输出:

Linear(in_features=16, out_features=12, bias=True) Parameter containing:
tensor([[-0.1890, -0.2464, 0.1255, 0.1371, -0.0860, 0.1147, 0.2162, 0.2164,
-0.0341, -0.2427, 0.1252, -0.1267, 0.0055, -0.2351, 0.1516, 0.0091],
[ 0.0167, 0.0783, 0.1194, 0.1763, 0.1607, 0.0041, -0.1883, -0.1407,
0.0213, 0.0674, 0.0864, 0.1367, 0.1203, -0.1143, -0.2471, -0.0009],
[-0.0500, -0.1950, -0.2270, 0.0407, 0.2090, 0.1739, 0.0055, -0.0888,
-0.1226, -0.1617, 0.1088, -0.0641, 0.0952, 0.0055, 0.1121, -0.1133],
[-0.2138, 0.1044, -0.1764, 0.1689, -0.1032, -0.0728, -0.1849, 0.1771,
0.0622, -0.0881, 0.1024, -0.0872, 0.0363, -0.2183, -0.2392, -0.0807],
[ 0.0876, -0.2130, 0.2191, -0.0753, -0.0198, 0.0565, 0.1932, -0.1412,
-0.1640, 0.0318, -0.1846, 0.0020, -0.1138, 0.2188, 0.1850, -0.2329],
[ 0.1501, 0.1809, 0.0378, -0.1194, -0.0991, -0.0848, -0.0085, 0.0384,
-0.1353, 0.0767, -0.2460, -0.1252, -0.0993, 0.1840, 0.0407, -0.1561],
[ 0.1464, -0.0153, -0.1369, 0.1616, -0.1700, -0.0877, 0.1000, 0.0953,
-0.0804, 0.1279, -0.1432, 0.1903, 0.1807, -0.0442, 0.0553, -0.0375],
[-0.1962, -0.1922, 0.1221, -0.0932, 0.0206, 0.0845, 0.1370, 0.1825,
0.1228, 0.1985, -0.2023, 0.1319, 0.0689, -0.1676, 0.0977, 0.2275],
[-0.1287, 0.2306, 0.1450, 0.2316, 0.0879, -0.0373, -0.2405, -0.0491,
-0.0185, -0.0385, 0.1891, -0.1952, -0.2433, -0.0572, 0.0555, -0.1912],
[-0.0958, 0.0692, -0.2458, -0.0730, 0.2082, 0.0005, -0.1477, 0.0229,
0.1032, 0.1871, 0.0302, 0.0664, -0.1704, 0.0197, 0.0262, -0.0398],
[-0.1210, -0.0301, -0.1284, -0.1590, -0.0594, 0.1115, 0.0256, 0.2206,
-0.2330, 0.1262, -0.0866, 0.2195, 0.1969, 0.0960, 0.0339, 0.0959],
[ 0.0263, 0.2152, -0.1841, -0.1301, -0.2202, -0.0430, 0.0739, 0.1239,
-0.1601, -0.1970, -0.1937, 0.0711, -0.0761, 0.1796, -0.1004, -0.0816]],
requires_grad=True)

这很有趣,但是如果你有许多不同种类的层和激活函数呢?在这种情况下,通过索引调用它们似乎是不可行的。幸运的是,您可以使用相同的结构命名这些层,并将来自 python collections 模块的 OrderedDict 作为参数传递。这样,你可以两全其美。换句话说,您保持层的顺序并命名它们,允许更简单和直接地引用层。

输出:

Sequential(
  (fc1): Linear(in_features=16, out_features=12, bias=True)
  (relu1): ReLU()
  (fc2): Linear(in_features=12, out_features=10, bias=True)
  (relu2): ReLU()
  (fc3): Linear(in_features=10, out_features=1, bias=True)
  (sigmoid): Sigmoid()
)

现在让我们检查第二层及其重量:

输出:

Linear(in_features=12, out_features=10, bias=True) Parameter containing:
tensor([[ 0.0291, -0.0783, 0.1684, 0.2493, 0.1118, -0.2016, 0.0117, -0.1275,
-0.0657, -0.2506, 0.1129, 0.1639],
[ 0.1274, 0.2261, 0.1084, -0.2451, -0.1085, 0.1292, 0.0767, -0.2743,
0.1701, 0.1537, -0.0986, 0.2247],
[ 0.0317, 0.1218, 0.1436, -0.1260, 0.1407, 0.0319, -0.1934, -0.0202,
-0.1683, 0.2342, 0.0805, 0.0563],
[-0.2444, 0.2688, -0.1769, 0.2193, 0.0854, 0.1284, 0.1424, -0.2334,
0.2324, 0.1197, 0.1164, -0.1184],
[ 0.0108, 0.2051, 0.2150, 0.0853, 0.1356, 0.1136, -0.1111, 0.1389,
-0.0776, -0.0214, 0.0702, 0.1271],
[-0.0836, -0.1412, -0.0150, -0.1620, -0.0864, 0.1154, 0.0319, -0.1177,
0.1480, 0.0097, -0.2481, -0.1497],
[ 0.0131, 0.0566, 0.1700, -0.1530, -0.1209, -0.0394, 0.0070, -0.0984,
-0.0756, -0.2077, 0.1064, 0.2788],
[ 0.2825, -0.2362, 0.1566, -0.0829, -0.2318, -0.1871, 0.2284, -0.0793,
-0.2418, -0.0040, 0.2431, -0.2126],
[ 0.0218, 0.0583, 0.1573, 0.1060, 0.0322, -0.1109, 0.2153, 0.0909,
-0.0028, -0.1912, -0.0733, 0.0013],
[-0.2602, -0.2267, -0.1786, -0.2129, 0.1996, -0.2484, 0.1303, -0.0052,
-0.2715, 0.0128, -0.0752, -0.0428]], requires_grad=True)

奖励:混合方法

在 PyTorch 中创建神经网络时,您会选择一种方法而不是另一种方法,但有时您可能更喜欢混合方法。PyTorch 在这方面非常灵活,例如,您可以在基于类的方法中使用顺序方法,如下所示:

输出:

MyNetwork2(
  (layers): Sequential(
    (0): Linear(in_features=16, out_features=12, bias=True)
    (1): ReLU()
    (2): Linear(in_features=12, out_features=10, bias=True)
    (3): ReLU()
    (4): Linear(in_features=10, out_features=1, bias=True)
  )
)

结论

尽管本文中用作示例的前馈神经网络很简单,可能无法真实地描述一种方法相对于另一种方法的优势,但这里的主要思想是展示在 PyTorch 中定义神经网络有许多不同的方法,希望您可以看到 PyTorch 库是如何强大,同时又非常灵活。

在深度学习中茁壮成长:推荐系统的 FM 模型(上)

原文:https://towardsdatascience.com/thrive-and-blossom-in-the-mud-fm-model-for-recommendation-system-1-95707839e235?source=collection_archive---------7-----------------------

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

Photo by Paul on Unsplash

既然你写了这篇文章,我认为你是这个行业的算法工程师。然而,根据我的经验,这个假设可能只有 20%是正确的,因为大多数算法工程师的兴趣非常多样化,他们会点击文章,只要标题中出现“模型、算法、深度学习、震撼、美丽”这样的词,但 3 秒钟后就会失望地关闭窗口。文章越有技术含量,就越快被关闭。我说的对吗?相信我,我不会通过设置一个非凡的标题和添加一段平静的背景音乐来欺骗你的点击。

好吧,如果你是一个真正的算法工程师,你首先想到的是什么模型或算法来排序或推荐内容。

如果你想出排序的平均值,请点击右上角的“关闭”按钮,这篇文章不是很适合你的水平。哈哈,我在开玩笑,欢迎继续,因为我也曾经是那个水平。

如果你正在考虑 CF/SVD/MF,也许你只是结束了阅读学校书籍或完成推荐系统的介绍课程,但缺乏实践经验。如果你的直觉是 LR + GBDT 模型,那么你是一个经验丰富的算法工程师,但最近没有更新你的武器库。

看看日历,现在是 2019 年。我们现在不必进入 Wide&Deep 或 DeepFM 模型,因为在大规模的业务场景中有效地应用它们似乎仍然是一项具有挑战性的任务。但最重要的是,如果你认为自己是一个谦逊的、渴望学习算法的工程师,你应该学习 FM model。

什么是 FM?

FM 代表因式分解机。该算法由 Rendle 于 2010 年提出,近年来被广泛应用于大规模点击率估计和推荐系统中。FM 的模式比较简单,网上有很多内容我就不在这里详细展开了。许多基于 DNN 的排序模型与 FM 非常相似,原因很明显:特征组合对于推荐排序至关重要,FM 的思想非常简单,并且很好地反映了(主要是二阶)特征组合。没有这一点,任何 DNN 模型都无法运行,因为 MLP 结构是一种低效捕捉特征组合的结构。因此,这些 DNN 模型总是与 FM 模型结合在一起,这些特性需要在内部进行组合。这就是为什么你会一次又一次地发现它或者它的变体的原因。

目前,基于 DNN 的排序模型一般采用 MLP 结构。特征提取的能力远低于 CV/NLP 达到的水平。这很容易使人觉得,用于排序优化的 DNN 模型还处于原始社会的非常早期的阶段。那这是为什么?因为 CNN 网络天然不适合排序场景。RNN 被用作捕获用户行为的序列,并且使用时间信息的辅助结构是可以的,但是它不太适合作为主要模型。好像没剩下多少选择了。Transformer 很有前景,我认为自我关注是另一个很好的方法,可以很好地捕捉特征组合(包括二阶和三阶,甚至多阶)。我用自我关注& transformer 作为主要的推荐排序模型做了一些实验。与 DeepFM 相比,测试结果并没有显示出太多的差异。但这可能是因为我没有花太多时间在繁琐的调优工作上。鉴于自 2018 年下半年以来,有几篇关于使用 transformer 进行推荐排序的新论文发表,我个人对该方向的发展非常乐观。到目前为止,剩下的选择似乎只有 MLP。在深度学习的大潮下,从建模角度来看确实远远落后于其他很多领域。事实上,我认为这主要是由于其自身领域的复杂性造成的,它可能需要一个革命性的 DNN 模型来很好地适应其自身的特点。像图像识别领域的 Resnet 或者自然语言处理领域的 Bert ,在推荐领域还没有像这两个这样的 DNN 模型。无论如何,我更乐观了,我预见到那个人正在路上,离我们很近。

我将从两个角度简要介绍 FM 模型:一个是从特征组合模型的演变。另一个是来自协同过滤模型的演变。FM 模式是上述两种模式的交集。

从 LR 到 SVM 再到 FM

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

LR 模型是推荐系统前期最成功的模型。大多数工业推荐系统采用 LR 模型(线性模型+人工选择特征组合引入的非线性)。因为 LR 模型具有简单、便于解释、易于扩展等优点。但是 LR 模型最大的缺陷是手工特征工程,耗时耗力,那么特征组合可以在模型层面进行吗?

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

实现这一点并不难。在上图中,可以将二阶特征组合添加到等式中。任意两个特征可以组合,组合后的特征可以作为一个新的特征集成到线性模型中。组合特征的权重可以用来表示,如同一阶特征权重一样,组合特征权重是从训练阶段学习的。在幕后,这个二阶特征组合的使用等同于 SVM 的多项式核。但后者有一个潜在的问题:它对组合特征进行建模,但泛化能力较弱。特别是给定一个大的稀疏特征矩阵,这个缺点会非常突出和放大。如推荐排序问题,特征总是存储在一个巨大的稀疏矩阵中。因此,这种解决方案没有被广泛采用。那还有什么?

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

所以此刻 FM 模式登场了。如上图所示,FM 模型还直接引入了任意两个特征的二阶特征组合。FM 和 SVM 模型之间最显著的区别是获取特征组合权重的计算方法。对于每个特征,FM 学习一个大小为 k 的一维向量,使得两个特征 x_i 和 x_j 的特征组合的权值由对应特征的内积<v_i v_j=“”>表示。这本质上是特性的嵌入特性,非常符合“嵌入”思维的本质。因此,FM 作为一种特征嵌入技术,可以看作是深度学习中各种嵌入方法的老前辈。实际上,它只是缺少了一个两层或三层的 MLP 隐层,用来直接建模多层特征非线性组合。其余方面基本相同。</v_i>

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

那么为什么 FM 嵌入在处理大规模稀疏矩阵时是有效的呢?为什么它的泛化能力强?参考上图,即使两个特征没有同时出现在训练集中,也意味着 x_i 和 x_j 同时出现的次数为 0。在 SVM,不可能知道他的特征组合的权重。但是因为 FM 是学习单个特征嵌入,而且不依赖于特征的某个特定组合是否出现过,所以只要特征 x_i 和特征的任何其他组合出现过,那么它就可以学习自己对应的嵌入向量。因此,虽然在训练集中没有看到特征 x_i 和 x_j 的组合,但是在预测时仍然可以使用这个新的特征组合,因为 x_i 和 x_j 具有在训练阶段学习到的它们自己的对应嵌入,并且它们的内积表示这个新的特征组合的权重。这就是为什么 FM 的泛化能力如此神奇。

从本质上说,这也是各种嵌入的核心特征。它使得基于二进制的硬匹配 0/1 切换到基于矢量的软匹配。对于以前无法匹配的,现在在一定程度上可以认为是匹配的。这本身就是对泛化的一个很好的改进。

从 MF 到 FM 模型

到目前为止,你应该知道 FM 模式是什么。那么 MF 是做什么的呢?至少从拼写角度来看,它们不是很相似吗,MF <=> FM?跟 FM 有什么鬼关系?仅仅是 FM 模式的逆向操作吗?

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

实际上,MF 代表矩阵分解。它是一个成熟的协同过滤模型,长期以来在推荐领域被广泛采用。主要思想是学习两个小的低维矩阵,一个代表用户的嵌入,另一个代表物品的嵌入。然后,通过计算两个矩阵的内积,使用这两个矩阵来估计由真实用户点击或评级生成的大型协作稀疏矩阵中的值。本质上,它是一种降维技术,尤其用于构建用户/项目嵌入。通常情况下,我们也把这些嵌入称为潜在特征向量,它们是相同的东西。在各种嵌入方法进入自然语言处理领域之前,这种方法也被大量用于主题建模。

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

当训练完成后,每个用户和项目都得到其对应的低维嵌入向量。进行内积计算<user_i item_j=“”>将会得到 user_i 在 item_j 上的预测得分。这让你想起什么了吗?下面重点说一下 MF 和 FM 的关系。</user_i>

MF 和 FM 不仅在名字上看起来相当像,而且在算法方面也有许多相似之处或联系。

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

本质上,MF 模型是 FM 模型的一个特例。MF 可以被认为是仅具有两个特征字段 User_ID 和 Item_ID 的 FM 模型。MF 从原始矩阵中学习这两种类型的特征,并将它们作为表达式嵌入到两个低维矩阵中。FM 可以看作是 MF 模型的进一步延伸。除了用户 ID 和物品 ID 特征之外,许多其他类型的特征可以进一步集成到 FM 模型中,FM 模型将所有这些特征转换成低维嵌入向量。特征组合的权重可以用任意两个特征嵌入的内积来表示和计算。如果 FM 仅使用用户 ID 和项目 ID,则预测过程将与 MF 预测过程相同。

从谁更早使用特征嵌入表达式的角度来看,与 FM 相比,MF 显然是真正的前身,但其唯一的局限性是特征类型的缺乏。FM 继承了 MF 的特征嵌入机制的优点,并对其进行扩展,使其能够将更多的边信息作为特征,然后将它们转换为嵌入向量,最后将它们集成到 FM 模型中。事实证明,FM 模型更加灵活,可以应用于更广泛的用例。

我希望你仍然跟随,不要因为 MF 和 FM 之间复杂混乱的关系而沮丧。我想提出以下建议(个人观点):

  1. 当你有动力使用 MF 进行协同过滤的时候,请先让自己冷静下来,问自己一个问题。这是为了建立基于隐式反馈还是显式反馈的推荐模型?例如,用户评级通常被视为明确的反馈,因为它从 1 到 5,包括积极和消极的方面。同时,用户点击或购买次数是隐性反馈,因为它们只传达了“数字越大,用户越有可能喜欢它,而不是被授权者”的信号(置信度)。优化丢失的函数来训练仅利用隐式反馈的模型更依赖于实际的用例。此外,我们需要找到一种方法来生成足够的负样本,以便 FM 也能很好地工作。别担心,我会在使用隐式反馈的背景下,围绕这些技巧和技术写一篇单独的文章。如果你的答案是明确反馈,请给 FM 一个尝试。因为它们在功能上是等价的,而且,FM 将使你能够把它融合到你将来想要添加的任何其他特性中。
  2. 构建一个只使用用户 ID 和项目 ID 作为输入特征的分类模型,在实践中不能满足大规模推荐系统的需要。原因很简单,在大部分世界级的推荐系统中,用户或物品都有很多可供利用的信息,协同数据只是其中之一。引入更多的功能肯定对获得更准确的个性化推荐非常有帮助。但是,如果模型缺乏添加更多功能的便捷方式,它将受到限制,并且难以持续改进。这就是为什么 MF 方法很少用于排序或分类问题。

到目前为止,我们已经从多个角度解释了 FM 模型。

下一步是什么?你如何做出选择?这与其说是一个技术问题,不如说是一个哲学问题。话虽如此,算法选择通常是这样的:“一个算法工程师一直在犹豫选择哪个模型去生产。他有三个很好的选择,其中一个很优雅,另一个很好,最后一个很时尚。但是很难做出决定。三天后,他告诉我他的导演只是让他用最快的一个去!”精彩!

因为 FM 计算特征组合的二阶,所以经常听到人们质疑它的效率。这确实是一个很好的问题,因为二阶完全等价于 O(n * n)。故事就这样结束了吗?在下一章,我将详细阐述 FM 模型的核心效率。

掌声和掌声感谢、【】和。

最大熵原理掷骰子

原文:https://towardsdatascience.com/throwing-dice-with-maximum-entropy-principle-fa7707e72222?source=collection_archive---------15-----------------------

“没有人知道熵到底是什么,所以在任何讨论中,你总是有优势的”冯·诺依曼

听起来这是一个深入研究熵的意义的好理由。这篇文章是关于骰子和最大熵的。

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

Photo by Jonathan Petersson on Unsplash

这篇文章有四个部分。在第一部分,我以骰子为例介绍了最大熵原理。第二部分是数学:概述了使熵成为唯一函数的四个公理。四个公理中的一个是最重要的(对我来说)…如此重要,以至于在第三部分,这个公理用 python 进行了测试,只有熵函数满足测试。第四部分总结。

一个简单的问题

我有一个骰子,从 1 到 6 有 6 个面。关于骰子,我唯一知道的是结果的平均值是 3.5。我必须分配给骰子两边的概率是多少?

首先出现的自然答案是给骰子的每一边分配 1/6 的均匀概率。这意味着:

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

当然,满足均值 3.5 的选择是无限多的。骰子可以被偏置,并且对于某些边具有更高的概率,同时仍然具有 3.5 的平均值。但是在所有的可能性中,统一的分配感觉上是合理的。

让我稍微修改一下这个任务,考虑到我唯一知道的是均值是 4.5。这里又有无限多种赋值的可能性。很可能,最自然的答案是你不知道,因为你没有足够的信息。但是 3.5 和 4.5 有什么区别呢?为什么我对均值的一个值(3.5)有感觉和自然的答案,对均值的另一个值(4.5)没有答案?

让我们先把这个条件正式写出来。我可以指定骰子各面的概率为(p1,…p6)。我知道:

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

如何从许多满足这些等式(约束)的概率分配中选择某一个?这可以说是一项优化任务。我可以最大化所有概率的函数:

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

并基于该函数的最大值选择一个概率分配。但是这个功能是什么意思,我应该怎么选择呢?我所知道的唯一信息是平均值是 4.5。我已经在约束中使用了 4.5,但是我还没有使用它,因为它是我唯一知道的信息。这里有一个准则!我应该优化函数 F,在我们的估计中,我不会插入任何关于骰子的额外信息。那么我必须选择哪个函数呢?

这是在杰恩斯的作品中回答的问题。我必须最大化熵:

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

因为这是对我所不知道的事情不抱偏见的唯一方法。任何其他功能都意味着附加信息。杰恩斯在他的作品中解释道:

我们能做的唯一公正的分配;使用任何其他方法都相当于任意假设我们没有的信息。。。。最大熵分布可以被断言,因为它被唯一地确定为对于缺失信息最不确定的分布

熵有一些有趣的性质。例如,如果我有一个平均值为 3.5 的 6 面骰子,那么熵的最大化将导致均匀分布。同样的情况,如果我只取和为一的约束,而不知道均值。那就让熵最大化吧!平均滚动值为 4.5(约束 1)的 6 面骰子的任务可以用数字来解决。答案呈现在剧情中:

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

我可以为其他类型的骰子尝试其他类型的约束。例如,让我们考虑 9 面骰子,而不是(1)设置约束为:

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

在后面的等式中,1 是标准差,4 是平均值。在这种情况下,最大化熵将导致看起来类似于高斯的分布。最大化其他功能不会。例如,下面是熵与平方和的比较:

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

Results of numerical solution of optimization problem with constraints (3) compared with Gaussian.

到目前为止一切顺利,但这只是第一阶段!对某些人来说,熵的最大化显然是根据熵作为信息量度的定义得出的。对其他人来说,这种直觉的理由可能还不够。到目前为止,我还没有证明方程中的函数。②是唯一一个最大化的。为什么不最大化一些替代功能?以下文字为“其他”。

支持熵最大化原理的数学论证

当一些可测试的信息可用时,为骰子的各面分配概率的任务(我 100%确定的一个),有可能表明必须最大化的唯一函数 F( p )是熵(2)。你需要一些数学传统中的公理。一套这样的公理是由肖尔和约翰逊提出的。在一些已知约束条件下掷骰子的任务可以概括为:

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

想象一下,我还不知道我应该选择熵最大的分布。所以我想找到最大化的函数。这里的技巧是 q 和 p 不是任意函数,而是概率。我可以假设这些概率以及通过最大化函数 F( p )找到最优分布 p 的结果具有一些性质(公理):

  1. 唯一性**。(最大化的)结果应该是唯一的。**

  2. 不变性。在哪个坐标系中计算新信息并不重要。

3)系统独立性一个人是用不同的概率来单独说明独立系统的独立信息,还是用一个联合概率来共同说明独立系统的独立信息,这并不重要。

  1. 子集独立。不管是用单独的条件概率还是用整个系统的概率来解释系统状态的独立子集的信息,都没有关系。

在证明的主体中,陈述了公理 1,2,4 用于导出函数的“和形式”。也就是说,为了满足公理 1,2,4,函数的形式必须是:

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

在所有和形式的函数中,唯一满足公理 3 的是熵函数或对熵函数单调的函数。为了更好地表示公理 3,让我们用 python 来测试这个公理!

用 python 演示系统独立性

在这一节中,我编写了一个 python 代码来测试关于系统独立性公理对于任意函数 F( p )和两个骰子是否成立。每个都有一定的边数和自己的平均值。

我将在两种不同的情况下最大化和形式的函数:当我认为两个骰子是独立的,我分别优化它们,或者当我认为它们是依赖的,我优化具有独立约束的联合 PDF。

单独优化

概率有两个重要的性质。第一个属性是它们的和为 1。第二个属性(实际上熵最大化不需要,但是其他一些函数需要)是概率是非负的。我把它框定为对概率和以及概率值界限的约束:

我从 1 开始选择骰子的边数(但是我可以选择任何边数)。对手段的限制是:

然后,我将初始猜测设为等概率,并运行优化算法:

联合优化

对于联合概率,我考虑两个骰子,因为它们可能相互依赖。我优化的函数是联合概率[p_11,p_12,…,p_NM],其中 p_11 是第一个和第二个骰子会显示第一面的概率。其余的优化过程是相同的。

比较

公理 3 规定,如果我没有关于两个骰子的依赖性的信息,我应该以骰子独立的方式分配概率,并且:

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

由于数值误差,总会有差异,这个等式不成立。这样我就可以评估我差了多少:

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

python 中的情况也是如此:

比较优化结果的另一种方法是从联合中得出边际分布,并将它们绘制在一起:

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

正如对熵的预期,分布是相同的(在数值误差的限度内):

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

Comparison of joint optimization with separate optimization when I maximize entropy.

相比之下,两个骰子的平方和分布不同:

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

Comparison of joint optimization with separate optimization when I minimize sum of squares.

这部分的 Python 代码可从这里获得。

结论

最大熵原理在几个方面是有用的。首先,它可能是贝叶斯推理中设置先验概率的有力工具。另一个有用的应用是最大熵估计,它可以代替最大似然估计。

在这篇文章中,只考虑了个别情况。对于连续概率,最大熵原理应该用最小 Kullback-Leibler 散度原理来代替。

文学:

[1] 模式识别与机器学习(信息科学与统计),克里斯托弗·m·毕晓普。

[2] 数据分析贝叶斯教程,D.S. Sivia 与 J. Skilling

【3】最大熵原理和最小交叉熵原理的公理化推导,Shore 和 Johnson

[4] 信息论和统计力学,E. T .杰恩斯

雷击:交流电力线的 CNN 可视化灾难

原文:https://towardsdatascience.com/thunderstruck-disaster-cnn-visualization-of-ac-power-lines-2a57fab30f09?source=collection_archive---------28-----------------------

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

VB 的网络中心正试图通过分析电力信号来检测架空电力线的局部放电模式。对于任何电力爱好者来说,这场 Kaggle 挑战赛都是一场有趣的比赛。理想情况下,我们应该能够在电力线路遭受停电或引发电气火灾之前,检测到电力线路缓慢增加的损坏。然而,有许多英里的电力线。此外,输电线的损坏不会立即显现,任何事情都会造成小的损坏(树木、大风、制造缺陷等)。)可能是来自放电的级联损害的开始,这增加了将来故障的可能性。这是一个伟大的目标。如果我们能够成功地估计出需要维修的线路,我们就可以在保持电力流通的同时降低成本。我的意思是金钱万能。

表格数据集非常庞大,每个信号有 800,000 个点,总计约 10 GB。臃肿的设置不是我要找的刚刚从微软恶意软件。我花了这么多时间试图把那个数据集输入我的电脑,但又被再次进行这么多数据管理的可能性拉回来了。

我决定做一些疯狂的事情,让它成为 CNN 的问题,而不是表格问题。把一个表格问题变成一个 CNN 特别疯狂。为什么你会把非常好的数据变成模糊和不准确的数据呢?

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

它更快

它更粗糙

而且,它更有趣!

有点…你准备好了吗?

高电压

我们应该首先了解一些电气工程概念,尤其是电力线。我们在这里看到的交流电有 3 个周期或相位。所提供的数据具有这些相位的信号,并且相互依赖以预测线路何时出现问题。因此,该设备有三个不同的信号通过,它们之间存在相互依赖关系。如果其中一个看起来很奇怪,就会影响到其他两个。

将信号数据绘制成图表是相当简单的事情。所以我们可以快速观察其中一个信号。许多 CNN 的经验法则可以帮助您决定它是否对模型有用。如果你能看到不同,那么 CNN 可以做得一样好,或者更好,更快。让我们看看一个信号是什么样的:

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

好的。有道理。现在,他们三个会是什么样子?有什么东西看起来超级怪异吗?我想是的!

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

好吧,这可能行得通!诚然,我可以看到绿色二期线似乎有一点尖峰在这个图像。也许这很重要,也许不重要。然而,我想这将是我们的有线电视新闻网试图检测。

首先,我们需要将所有的信号文件转换成图像,我完成了这个并保存在硬盘上(使用这个 jupyter 笔记本)。回去把它们加载到内存中比每次都生成它们要快得多(有很多信号)。然后我回去对我们的测试集做了同样的事情。我本可以做得更好,但是只需要运行一次。

现在图像大小很重要,当你压缩数据时,你会丢失信号中的一些细节。想象一下缩小图片时丢失的细节。所以我保持了一个相当大的图像尺寸,除此之外,我们可以在以后的训练中将图像变小。

我觉得我们可以掩饰大部分 CNN 的设置(如果有兴趣你可以看这里)。除了变换之外,没有什么是唯一的。不像猫和狗,或医学成像,我不需要变换或改变周围的图像。我们生成的图像应该总是相似的,更重要的是,图像将总是与我们的测试图像显示的格式相同。在我们的测试中,图像将总是相同的大小。这种方法不同于其他图像模型,因为测试集可以包括不同的动物、不同的角度和整体不同的外观对象。通过这种方式,转换将有助于其他模型,但不适用于这种情况。

当我们开始训练时,我们看到训练在进步!很好!
验证和马修斯系数一样越来越好!很好!

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

太好了,让我们试试这个,看看这些。

我注意到的一件事是项目有正确的预测。几个时期后,我们可以看到模型认为重要的热图。

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

我们可以看到它认为正确的项目和它正确预测的项目。对于正确的信号,它似乎浮在较低的信号上。好吧,那不理想。没有任何迹象表明这是有意义的。地狱之钟我们只看到没有错误的项目。

然而,预测错误的情节都结束了。

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

其中一些展示了我所期待的。这个显示了剧烈的波动。例如,我们希望看到类似下面的内容,其中权重遍布 3 个信号。

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

然而,还有更多的地方,他们强调没有意义的领域。像这样:

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

为什么它突出了右边的区域?在所有的训练中,是什么让它看起来是最重要的领域?

也就是说,这个预测应该是错误的,但看起来信号真的中断了…所以也许是数据的问题。

坚定沉着

因此,在这一点上我有点紧张,尽管验证集声称我们做得很好,但它似乎没有看到项目的充分加权。预言到处都是,我不知道为什么。所以我决定继续前进。

进一步观察这些预测,似乎这些预测是有道理的。我们看到 0 和 1 都有一些值,这很好。该集合非常有偏差,几乎有 10:1 的差异,然而,我们也期望如此。它比较接近我们的数据集。

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

让我们将所有测试项目适当地映射回来,因为每个图像现在代表 3 个不同的信号。

那我们就臣服于卡格尔。让那里有摇滚!

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

嗯,真令人失望。

它的得分甚至低于所有的 0。

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

在这一点上,是时候转移到别的事情上了。通往顶峰的路还很长,我还有其他项目要处理。

比赛中的其他 CNN 更接近 0.50 ish,获胜者使用了 LGBM 。

需要改进的地方:

  • 如果你有信号数据,你当然可以试着把它做成图像。但是,在转换过程中,您会丢失大量信息。您还会增加正在使用的数据的总体大小。
  • 这种转换和梳理的过程很快就变得非常复杂和混乱,这里有很多错误做错了事情。结合第 1 项,我有理由相信我丢失了很多数据,并且可能丢失了更多或错误标记了一些项目。对我来说,回去仔细检查原始图像以确保我们没有错误地创建它们是一个挑战。
  • 这也是一个困难的问题,因为我认为是错误的东西并不符合标签。
  • 我看到这种方法在其他项目中成功使用。也许他们的分辨率设置更好,或者照片中的信息更清晰。

参考资料:

井字游戏学习者 AI

原文:https://towardsdatascience.com/tic-tac-toe-learner-ai-208813b5261?source=collection_archive---------2-----------------------

井字游戏是两个人玩的简单游戏,我们小时候喜欢玩(尤其是在无聊的教室里)。该游戏包括两名玩家将他们各自的符号放置在一个 3x3 的格子中。设法将三个符号放在水平/垂直/对角线上的玩家赢得游戏。如果任何一方未能做到这一点,游戏以平局结束。如果两个人总是采取他们的最优策略,博弈总是以平局告终。

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

Ex: Tic-Tac-Toe Board

由于网格很小&只有两个玩家参与,每个棋盘状态的可能走法的数量是有限的,因此允许基于树的搜索算法,如 Alpha-Beta 剪枝,来提供计算上可行且精确的解决方案,以构建基于计算机的井字游戏玩家。

在这篇文章中,我们看一个近似的(基于学习的)相同的游戏方法。即使存在更好的算法(即 Alpha-beta 修剪),如果电路板的复杂性增加,近似方法提供了可能有用的替代方法。此外,代码的变化,以纳入这将是最小的。

这个想法是将井字游戏作为一个适定的学习问题,正如 Tom Mitchell 的机器学习书(第 1 章)中提到的。学习系统将在下一节中简要介绍。

井字游戏学习系统

学习系统背后的基本思想是,系统应该能够通过从训练经验(E)中学习来改进其相对于一组任务(T)的性能§。培训体验(E)可以是直接的(带有单独标签的预定义数据集)或间接的反馈(每个培训示例没有标签)。在我们的情况下:-

  • 任务(T) :玩井字游戏
  • 性能§ :与人类比赛获胜的百分比
  • 体验(E) :通过解决方案跟踪(游戏历史)产生的间接反馈,这些解决方案跟踪是通过与自身(克隆)的游戏产生的

从经验中学习(E) :理想情况下,需要学习一个函数(理想目标函数),以给出任何给定棋盘状态下可能的最佳走法。在我们的问题中,我们将 ITF 表示为一个线性函数(V ),它将给定的棋盘状态映射到真实值(分数)。然后,我们使用近似算法(最小均方)从解迹中估计 ITF。

  1. V(boardState) → R,(R-给定 boardState 的得分值。)
  2. V_hat(boardState) ←(W.T) * X,(W-目标函数的权重,X-从给定的 boardState 中提取的特征。)
  3. LMS 训练规则更新权重:Wi←Wi+lr (V _ hat(board state)-V _ hat(Successor(board state))) X,(i-第 I 个训练示例,lr-学习率)

每个非最终棋盘状态的分数®被分配有后续棋盘状态的估计分数。根据游戏的最终结果给最终棋盘状态分配一个分数。

3.V(boardState) ←V_hat(继任者(boardState))
4。V(finalBoardState) ←100(赢)| 0(平)| -100(输)

履行

最终设计分成四个模块(Ch-1,汤姆·米切尔的机器学习书 ):-

  1. 实验生成器:其工作是在每个训练时期开始时生成新的问题陈述。在我们的例子中,它只是返回一个空的初始板状态。
  2. 性能系统:该模块将实验生成器&提供的问题作为输入,然后使用改进的学习算法在每个时期产生游戏的解轨迹。在我们的例子中,这是通过模拟两个玩家之间的井字游戏(克隆程序)来完成的。这些玩家使用当前目标函数做出移动决策。
  3. Critic :这个模块获取解决方案跟踪,并输出一组训练示例,输入到泛化器。
    训练实例←【<特色(boardState),R >,< > …。]
  4. 一般化器:该模块使用评论家提供的训练示例,通过在每个时期使用 LMS 权重更新规则学习期望的权重来更新/改进目标函数。

下面是一个展示训练和测试阶段的小视频(顺便说一句:我的视频编辑技能不好)。

Screen Recording of Training & Testing phases of the game

上述实现的代码可以在这个 Github gist:https://gist . Github . com/NoblesseCoder/cccf 260 ECC 3c e 2052 a0a 1a 01 a 13 a 7 f 7 AC 54

使用 R 的整洁异常检测

原文:https://towardsdatascience.com/tidy-anomaly-detection-using-r-82a0c776d523?source=collection_archive---------6-----------------------

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

想象一下,你经营着一家像 Amazon.com 这样的在线企业,你想为下一年规划服务器资源——你必须知道你的负载什么时候会达到峰值(或者至少在回顾中是什么时候达到峰值的,以便相信它会再次出现),这就是你需要时间序列异常检测的地方。虽然有一些像 Twitter 的异常检测这样的软件包已经在做这项工作,但还有另一个很好的候选软件——anomalize——它可以做一些其他异常检测软件包没有做的事情。这是很好的异常检测。

享受 78%的 DataCamp 折扣

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

请注意,本文的目的是帮助您以简洁的方式执行异常检测,而不是向您传授异常检测或时间序列数据的原理和概念。

使用 R——整齐的方法进行异常检测意味着什么?

抱歉这么说!众所周知,使用 R 的数据科学家会编写笨拙的代码——可读性不强的代码和效率不高的代码,但这种趋势一直在改变,因为 Hadley Wickham 推广了tidy原则,他应该不需要在 R 宇宙中做任何介绍,因为他的tidyverse有助于许多 R 数据科学家的效率和工作。现在,这个由商业科学开源的新包anomalize进行时间序列异常检测,它与其他 Tidyverse 包(或支持整齐数据的包)内联——具有最常用的 Tidyverse 功能之一——与管道%>%操作符兼容,以编写可读和可再现的数据管道。

异常化—安装

R package anomalize 的稳定版本可从起重机上的获得,其安装方式如下:

install.packages('anomalize')

github 上有最新开发版本的 anomalize,安装方式如下:

#install.packages('devtools') 
devtools::install_github("business-science/anomalize")

考虑到开发版不需要编译工具,最好从 github 安装开发版,这样会更无 bug,而且有最新的功能。

案例—比特币价格异常检测

通过实际操作并将其与我们的现状联系起来,学习一个新的概念或代码会更容易。所以,为了理解 R 中整齐的异常检测,我们将尝试检测 2017 年以来比特币价格的异常。

加载所需的包

我们使用以下 3 个软件包来解决上述情况:

library(anomalize) #tidy anomaly detectiom
library(tidyverse) #tidyverse packages like dplyr, ggplot, tidyr
library(coindeskr) #bitcoin price extraction from coindesk

数据析取

我们使用来自coindeskrget_historic_price()从 Coindesk 提取历史比特币价格。产生的数据帧存储在对象btc

btc <- get_historic_price(start = "2017-01-01")

数据预处理

对于使用 anomalize 的异常检测,我们需要一个tibbletibbletime对象。因此,我们必须将 dataframe btc 转换成遵循时间序列形状的 tibble 对象,并将其存储在btc_ts中。

btc_ts <- btc %>% rownames_to_column() %>% as.tibble() %>% 
  mutate(date = as.Date(rowname)) %>% select(-one_of('rowname'))

只看 btc_ts 的头部看样本数据:

head(btc_ts)
 *Price date      
1  998\. 2017-01-01
2 1018\. 2017-01-02
3 1031\. 2017-01-03
4 1130\. 2017-01-04
5 1006\. 2017-01-05
6  896\. 2017-01-06*

异常时间序列分解

在开始时间序列预测或建模之前,时间序列数据的一项重要工作是时间序列分解,即将时间序列数据分解为季节、趋势和余数部分。anomalize 有一个函数time_decompose()来执行同样的功能。一旦组件被分解, anomalize可以检测和标记提醒组件的分解数据中的异常,然后可以用 plot_anomaly_decomposition() 可视化。

btc_ts %>% 
  time_decompose(Price, method = "stl", frequency = "auto", trend = "auto") %>%
  anomalize(remainder, method = "gesd", alpha = 0.05, max_anoms = 0.2) %>%
  plot_anomaly_decomposition()

给出了这个图:

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

从上面的代码中可以看出,分解是基于“stl”方法进行的,这是时间序列分解的常用方法,但是如果您一直在使用 Twitter 的 AnomalyDetection,那么同样可以通过将 time_decompose(method = "twitter ")与anomalize(method = "gesd")结合起来在 anomalize 中实现。“stl”分解方法也可以与anomalize(method = "iqr")结合,用于不同的基于 IQR 的异常检测。

异常检测

异常检测和绘制检测到的异常几乎类似于我们在上面看到的时间序列分解。只是异常检测后分解的组件用time_recompose()重新组合,用 plot_anomalies() 标绘。该软件包本身会自动处理许多参数设置,如指数、频率和趋势,使得在相同领域中使用较少的专业知识即可轻松运行异常检测。

btc_ts %>% 
  time_decompose(Price) %>%
  anomalize(remainder) %>%
  time_recompose() %>%
  plot_anomalies(time_recomposed = TRUE, ncol = 3, alpha_dots = 0.5)

给出了这个图:

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

从给定的图中可以很好地推断出异常检测在发现 2018 年初发生的比特币价格疯狂方面的准确性。

如果您对提取异常的实际数据点感兴趣,可以使用以下代码:

btc_ts %>% 
  time_decompose(Price) %>%
  anomalize(remainder) %>%
  time_recompose() %>%
  filter(anomaly == 'Yes') 
*Converting from tbl_df to tbl_time.
Auto-index message: index = date
frequency = 7 days
trend = 90.5 days
# A time tibble: 58 x 10
# Index: date
   date       observed   season trend remainder remainder_l1 remainder_l2 anomaly recomposed_l1

 1 2017-11-12    5857\.  36.0    7599\.    -1778\.       -1551\.        1672\. Yes             6085.
 2 2017-12-04   11617\.  11.2    9690\.     1916\.       -1551\.        1672\. Yes             8150.
 3 2017-12-05   11696\.  -2.01   9790\.     1908\.       -1551\.        1672\. Yes             8237.
 4 2017-12-06   13709\.  -9.11   9890\.     3828\.       -1551\.        1672\. Yes             8330.
 5 2017-12-07   16858\.   0.0509 9990\.     6868\.       -1551\.        1672\. Yes             8439.
 6 2017-12-08   16057\. -28.1    9971\.     6114\.       -1551\.        1672\. Yes             8393.
 7 2017-12-09   14913\.  -8.03   9953\.     4969\.       -1551\.        1672\. Yes             8394.
 8 2017-12-10   15037\.  36.0    9934\.     5067\.       -1551\.        1672\. Yes             8420.
 9 2017-12-11   16700\.  11.2    9916\.     6773\.       -1551\.        1672\. Yes             8376.
10 2017-12-12   17178\.  -2.01   9897\.     7283\.       -1551\.        1672\. Yes             8345.
# ... with 48 more rows, and 1 more variable: recomposed_l2*

因此,anomalize 使得用更简洁的代码在 R 中执行异常检测变得更加容易,这些代码也可以用在使用 tidyverse 构建的任何数据管道中。这里使用的代码可以在我的 github 上找到。如果你想更多地了解 R 中的时间序列预测,请查看Rob hynd man 教授在 Datacamp 上的课程。

主成分分析整理:主成分分析导论

原文:https://towardsdatascience.com/tidying-up-with-pca-an-introduction-to-principal-components-analysis-f876599af383?source=collection_archive---------4-----------------------

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

主成分分析(PCA) 是一种降维的技术,是减少数据集中预测变量数量的过程。

更具体地说,PCA 是一种无监督类型的特征提取,其中原始变量被组合并缩减为它们最重要和最具描述性的成分。

主成分分析的目标是识别数据集中的模式,然后将变量提取到它们最重要的特征,以便在不丢失重要特征的情况下简化数据。主成分分析询问是否一个数据集的所有维度都能引发快乐,然后给用户一个选项来消除那些不快乐的维度。

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

PCA 是一种非常流行的技术,但是实施它的人通常不太理解它。我写这篇博文的目的是提供一个关于为什么使用 PCA 以及它如何工作的高层次概述。

维度的诅咒(或者说,为什么要费神降维?)

维度的诅咒是一组现象,表明随着维度的增加,数据的可管理性和有效性往往会降低。在高层次上,维数灾难与这样一个事实有关,即随着维度(变量/特征)被添加到数据集,点(记录/观察)之间的平均和最小距离增加。

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

我发现,当我开始思考聚类或 PCA 等主题时,将变量可视化为维度,将观察结果可视化为记录/点会有所帮助。数据集中的每个变量都是一组坐标,用于绘制问题空间中的观察值。

随着已知点和未知点之间的距离增加,创建好的预测变得更加困难。此外,数据集中的特征可能不会在目标(独立)变量的上下文中增加太多价值或预测能力。这些特征并没有改善模型,而是增加了数据集中的噪声,以及模型的整体计算负载。

由于维数灾难,降维通常是分析过程的关键组成部分。特别是在数据具有高维度的应用中,如计算机视觉信号处理

当收集数据或应用数据集时,并不总是显而易见或容易知道哪些变量是重要的。甚至不能保证你选择或提供的变量是正确的变量。此外,在大数据时代,数据集中的变量数量可能会失控,甚至变得令人困惑和具有欺骗性。这使得手工选择有意义的变量变得困难(或不可能)。

别担心,PCA 会查看数据集中连续变量的整体结构,以便从数据集中的噪音中提取有意义的信号。它旨在消除变量中的冗余,同时保留重要信息。

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

PCA 也爱乱七八糟。

PCA 如何工作

PCA 最初来自于线性代数领域。它是一种变换方法,在数据集中创建原始变量的(加权线性)组合,目的是新的组合将尽可能多地捕获数据集中的方差(即点之间的间隔),同时消除相关性(即冗余)。

PCA 通过使用从原始变量的协方差矩阵计算的特征向量和特征值,将数据集中的原始(以平均值为中心的)观察值(记录)转换为一组新的变量(维度)来创建新的变量。

那是一口。让我们分解一下,从均值开始——以原始变量为中心。

PCA 的第一步是将所有输入变量的值居中(例如,从值中减去每个变量的平均值),使每个变量的平均值等于零。居中是一个重要的预处理步骤,因为它确保生成的组件只关注数据集中的方差,而不捕捉数据集的整体平均值作为重要变量(维度)。如果没有均值居中,PCA 找到的第一个主成分可能对应于数据的均值,而不是最大方差的方向。

一旦数据被居中(并且可能被缩放,取决于变量的单位),数据的协方差矩阵需要被计算。

协方差是一次在两个变量(维度)之间测量的,它描述了变量的值彼此之间的相关程度:例如,随着变量 x 的观察值增加,变量 y 也是如此吗?较大的协方差值(正或负)表示变量之间有很强的线性关系。接近 0 的协方差值表示弱的或不存在的线性关系。

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

这个来自https://stats . stack exchange . com/questions/18058/how-would-you-explain-协方差-to someone-someone-who-understand-only-the-mean的可视化对于理解协方差是超级有帮助的。

协方差总是在二维空间中测量。如果处理两个以上的变量,确保获得所有可能的协方差值的最有效方法是将它们放入一个矩阵中(因此称为协方差矩阵)。在协方差矩阵中,对角线是每个变量的方差,对角线上的值是彼此的镜像,因为变量的每个组合在矩阵中包含两次。这是一个正方形的对称矩阵。

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

在本例中,变量 A 的方差为 0.67,第二个变量的方差为 0.25。两个变量之间的协方差是 0.55,这反映在矩阵的主对角线上。

因为它们是正方形和对称的,协方差矩阵是可对角化的,这意味着可以在矩阵上计算特征分解。这是 PCA 找到数据集的特征向量和特征值的地方。

线性变换特征向量是一个(非零)向量,当对其应用相关的线性变换时,该向量改变其自身的标量倍数。特征值是与特征向量相关的标量。我发现对理解特征向量和值最有帮助的事情是看一个例子(如果这没有意义,试试看 Khan Acadamy 的这个矩阵乘法课程)。

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

有人告诉我,矩阵乘法中包含一个是不符合惯例的,但为了清楚起见,我还是保留了它。我向读到这篇文章的任何被冒犯的数学家道歉。*
在这个例子中,

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

是特征向量,5 是特征值。

在高层次理解 PCA 的背景下,关于特征向量和特征值,你真正需要知道的是协方差矩阵的特征向量是数据集中主要成分的轴。特征向量定义了由 PCA 计算的主分量的方向。与特征向量相关联的特征值描述了特征向量的大小,或者观察值(点)沿着新的轴分散了多远。

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

第一个特征向量将跨越在数据集中发现的最大方差(点之间的间隔),并且所有随后的特征向量将垂直于(或者用数学术语来说,正交)在它之前计算的特征向量。这就是我们如何知道每一个主成分都是不相关的。

如果你想了解更多关于特征向量和特征值的知识,有多个 资源 散布在 互联网上正是为了这个目的。为了简洁起见,我将避免在博客中试图教线性代数(糟糕的)。

PCA 找到的每个特征向量将从数据集中的原始变量中提取方差的组合。

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

在本图中,主成分 1 说明了变量 A 和 b 的差异。

特征值很重要,因为它们为新导出的变量(轴)提供了排序标准。主成分(特征向量)按特征值降序排序。具有最高特征值的主成分被“首先挑选”作为主成分,因为它们占数据中最大的方差。

您可以指定返回几乎与原始数据集中的变量一样多的主成分(通常是从到 n-1 ,其中 n 是原始输入变量的数量),但是大部分方差将在顶部的主成分中考虑。有关选择多少主要组件的指导,请查看此堆栈溢出讨论。或者你可以一直问自己,“自我,有多少维度会激发快乐?”(这是一个笑话,你可能应该只使用一个 scree 情节。)

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

Scree 图显示了每个主成分的方差。该屏幕图是为 Alteryx Designer 中的主要组件工具的报告输出而生成的。

在确定了数据集的主成分后,需要将原始数据集的观测值转换为所选的主成分。

为了转换我们的原始点,我们创建一个投影矩阵。这个投影矩阵就是选择的特征向量串接成的一个矩阵。然后,我们可以将原始观测值和变量的矩阵乘以我们的投影矩阵。这个过程的输出是一个转换后的数据集,投射到我们的新数据空间中——由我们的主成分组成!

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

就是这样!我们完成了 PCA。

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

假设和限制

在应用 PCA 之前,有一些事情需要考虑。

在执行 PCA 之前对数据进行标准化可能很重要,特别是当变量有不同的单位或标度时。您可以在 Designer 工具中选择选项缩放每个字段,使其具有单位方差。

PCA 假设数据可以用线性结构来近似,并且数据可以用较少的特征来描述。它假设线性变换能够并且将会捕获数据的最重要的方面。它还假设数据中的高方差意味着信噪比高。

降维确实会导致一些信息的丢失。由于没有保留所有的特征向量,因此会丢失一些信息。然而,如果没有包含的特征向量的特征值很小,你没有丢失太多的信息。

使用 PCA 要考虑的另一个问题是,变量在转换后变得不太容易解释。一个输入变量可能意味着一些特定的东西,如“紫外线照射”,但 PCA 创建的变量是原始数据的大杂烩,不能以一种清晰的方式解释,如“紫外线照射的增加与皮肤癌发病率的增加相关”当你向别人推销你的模型时,更难解释也意味着更难解释。

优势

主成分分析是流行的,因为它可以有效地找到一个更少维度的数据集的最佳表示。它在过滤噪声和减少冗余方面是有效的。如果您有一个包含许多连续变量的数据集,并且您不确定如何为您的目标变量选择重要的特征,那么 PCA 可能非常适合您的应用。类似地,PCA 也很受欢迎,用于可视化高维数据集(因为我们这些贫乏的人类很难在超过三维的空间中思考)。

附加资源

我最喜欢的教程(包括基础数学的概述)来自奥塔哥大学的 Lindsay I . Smith关于主成分分析的教程

这是 UCSD 的 Jon Shlens 关于主成分分析的另一个很棒的教程

关于 PCA 你所知道和不知道的一切,来自博客它的神经元专注于神经科学中的数学和计算。

3 个简单步骤中的主成分分析有一些很好的说明,并被分解成离散的步骤。

Jeremy Kun 博客中的主成分分析是一篇很好的、简洁的文章,其中包含了对到特征脸引用。

主成分分析的一站式商店来自 Matt Brems。

。经允许重新发布。

作为政治武器的抖音教

原文:https://towardsdatascience.com/tiktok-as-a-weapon-2f0d33b2d0cd?source=collection_archive---------27-----------------------

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

Photo: Merzmensch

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 T 嘿对口型。他们做出夸张的面部表情。他们爱自己。他们在寻求恭维。虚荣的一代。这至少是我对 Musical.ly 背后的随机表演者的第一印象。我的第二印象是。甚至是我的第三个。

一方面——很高兴看到这么多年轻人想要做一些有创意的事情,进行数字交流,寻找新的想法和合作项目。(单看设置和视频剪辑就不明显了)。
数字能力!

另一方面——大部分表演都在重复其他的表演。这不仅仅是一场比赛——看起来整个完美学习的刻板手势库比应用程序内的音乐库要有限得多。喜欢你的默认角色动画集从堡垒之夜

Just random one of zillions samples (without music). I mean, they try and have fun, and it’s fine and all.

但后来中国开始发挥作用。

停止。假新闻。Alex Zhu杨鲁豫上海- 基地团队开发并于 2014 年发布(哦,我猜是评论中即将出现的地缘政治讨论),他们最初想将其用于教育需求(实际上是个很酷的想法)。然后重点转向娱乐和音乐短片,增长令人印象深刻:

2015—1000 万用户
2016—9000 万用户
2017 — 200 万用户

2018字节跳动10 亿美元收购,并与自己的 App——musical . ly 合并成为抖音。目前全球有 5 亿活跃用户

平台的大陆漂移——和心态。

我们无时无刻不在经历着。脸书不再是 T2 了。推特是为老年人准备的。 LinkedIn专业网络。 Snapchat 显然是新的,但是仍然不能令人信服,基本上是由于易腐的内容。但是抖音!每个人都在谈论抖音。

这不仅仅是你在校园里流行的另一款青少年应用。

加里·维纳查克正在为抖音向世界传福音。

[## 为什么抖音(前 Musical.ly)应用如此重要| GaryVaynerchuk.com

几年来,我一直在密切关注抖音的应用程序(以前的 Musical.ly ),我看到了它的进步…

www.garyvaynerchuk.com](https://www.garyvaynerchuk.com/why-tiktok-formerly-musical-ly-app-is-important/)

他指出了这款应用背后的创造力:

1.抖音的应用程序是未来有影响力的人和内容创作者的“训练轮”2。他们抓住了一个新的人口统计数据
3。它可以为其他平台铺平道路,给创作者一个“创造”的框架

事实上,这个应用程序有潜力孵化新的人才,教育他们,并在病毒的翅膀上提供新的可能性。已经提到的编辑技能变得更加训练有素,每一个新的复杂的 AR 滤镜更新。在一个非常短的视频剪辑中结合视频片段和音乐是一个挑战——正如Anton echov曾经说过的:

Краткость — сестра таланта.//“简洁是才华的姐妹。”

抖音是“国家安全威胁”(对任何国家而言)

另一方面,抖音被美国彼得森国际经济研究所称为“对西方的国家安全威胁”,因为世界范围内(但主要是美国)的个人和生物数据暴露在中国服务器上。嗯,筒仓不好。所有数据都已经保存在 Fort Meade 中——现在又多了一个无法控制的利益相关者。它有另一个议程。有人认为,ISIS 用肮脏的信息占领了抖音,这和谷歌在 YouTube 上遇到的问题是一样的。

然后我们还有几个有趣的事件。它们令人大开眼界。他们展示了什么是可能的。它们显示了抖音的破坏性影响。

Feroza Aziz 和#ChinaCables

What begins as a usual make-up video tutorial becomes an urgent political message to followers:

I’m going to teach you guys how to get long lashes. The first thing you need to do is get your lash curler, curl your lashes — obviously — then you’re going to put them down and use your phone that you’re using right now to search what’s happening in China.

She raises awareness about a disastrous ongoing situation with Uyghur Muslims in China. This is also in focus by the #ChinaCables, leaked papers (published by New York Times) documenting more than the questionable state of being in the so-called “Re-education camps”. Actually, the apparent infringement of human rights.

Her video was blocked, account temporarily disabled, now it’s online again (officially by TikTok due to some admin issues).

It was not the first time for TikTok to confront political issues. Recently BuzzFeedNews reported about apparent censoring of pro-HongKong democracy messages by TikTok users.

[## TikTok Users Are Finally Posting About Hong Kong, But Only To See If They’ll Get Censored

The short-form video app TikTok can’t shake an air of suspicion that surrounds it in the United States. On Thursday…

www.buzzfeednews.com](https://www.buzzfeednews.com/article/ryanhatesthis/tiktok-users-are-finally-posting-about-hong-kong-but-only)

At the same time, a TikTok spokesperson answered to BuzzFeedNews:

“Our content and moderation policies are led by our US-based team and are not influenced by any foreign government. […] The Chinese government does not request that TikTok censor content. To be clear: We do not remove videos based on the presence of Hong Kong protest content.” (Source)

The messages didn’t have the virality, sufficient to be upvoted and get viral within the TikTok network, they said. Other than dancing teens.

According to the Guardian report, there were previously strict guidelines (restricting topics like political demonstrations etc.).

[## Revealed: how TikTok censors videos that do not please Beijing

TikTok, the popular Chinese-owned social network, instructs its moderators to censor videos that mention Tiananmen…

www.theguardian.com](https://www.theguardian.com/technology/2019/sep/25/revealed-how-tiktok-censors-videos-that-do-not-please-beijing)

但是在字节跳动发表官方声明后这些指导方针在 2019 年 5 月就已经过时了,远在香港示威游行之前:

正在讨论的旧准则已经过时,不再使用。如今,我们采取本地化的方法,包括本地版主、本地内容和审核政策、全球政策的本地细化等等。(来源

也就是说,中国政府没有直接命令审查视频——现在这是当地团队的任务(那些团队,他们最近禁止了亲 LGBT 内容 btw )。).

但不仅仅是关于中国。

还有梅奥皮特案。这是抖音青少年对民主党 2020 年皮特·布蒂吉格总统候选人的绰号。他们批评他所有的失礼和失态。这不仅仅是关于网络欺凌(有趣的是,这个故事开始于 Reddit,但在抖音变得活跃)。

《麻省理工技术评论》确信:

即使在选举期间,抖音仍然被政客们忽视。最常见的误解是:由于抖音的普通用户是青少年,不具备选举资格(18 岁为法定投票年龄),所以这没关系。

不对。

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

(Source)

**常见的危险是:**忽视这种新的养育社交网络会导致,嗯,后果。

不在那里是危险的。

并不是说要追随每一次炒作。这不是偷偷进入每一个小应用程序。这是关于识别有影响力的平台并采取行动。

应该采取什么行动?麻省理工学院评论建议:

抖音帮助迷因像病毒一样传播,它可以很容易地在对话中注入一个候选人。最终,这不就是一个候选人想要的吗?

的确,唯一的办法就是——参与。来回答。来回复。不是芭芭拉·史翠珊式的。但频率相同。这也会像病毒一样传播开来。

和艾

作为一个人工智能用例,病毒式传播对这款应用至关重要。字节跳动(抖音背后的公司)正在广泛使用人工智能:

  • CBInsight 将该公司列入其 2018 年度人工智能 100 强名单
  • BuzzFeed 的新闻头条竞争对手“今日头条”正在向其 1.2 亿用户发布与相关的新闻。日常用户借助 AI。
  • 自 2016 年以来,字节跳动正在运行自己的人工智能实验室

Bernard Marr 描述了字节跳动的人工智能算法(无可否认,抖音视频交付算法可以应用这些算法):

该公司的智能机器使用计算机视觉和自然语言处理技术来理解和分析书面内容、图像和视频。然后,基于机器对每个用户的了解,它们会提供它认为每个用户想要的内容。

如果我们走远一点,你会怎么想,这种基于人工智能的交付会有政治偏见吗?比方说,如果人工智能获得了避免特定话题的“警报触发器”?

脸书/推特/领英对抖音的选择性算法?

欢迎在评论中分享你的观点。

数据科学家的时间复杂性

原文:https://towardsdatascience.com/time-complexity-for-data-scientists-664d00e57724?source=collection_archive---------13-----------------------

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

Pixabay from Pexels

大数据是硬的,大数据的挑战体现在推理和计算两个方面。随着我们向更精细和个性化的推理发展,我们面临着在个人层面产生**、可信和透明的推理和决策的挑战[1]。现在,我们将关注“及时性”的挑战,并尝试获得关于某些算法如何扩展以及它们是否可用于处理大规模数据集的直觉。**

在推论中,永远没有“足够”的数据。随着你获得越来越多的数据,你可以开始细分数据,以获得更好的群体洞察力,如年龄组,性别,或社会经济阶层[2]。

n 永远不够,因为如果它“足够”的话,你就已经开始下一个需要更多数据的问题了。—安德鲁·盖尔曼

这种对数据无法满足的需求带来了计算(和成本)方面的挑战。这些问题中的一部分可以通过并行化使用大量的计算资源用“蛮力来解决。如果没有合适的方法,其他问题在计算上是很难处理的。

简单地说,数据的大小对我们可以使用的算法和方法提出了物理约束。因此,作为数据科学家和问题解决者,重要的是我们要意识到我们的某些模型、算法和数据结构是如何工作的,以及它们在大规模下是如何表现的。这意味着我们应该熟悉我们可用的工具以及何时使用它们。

期待什么

这是一篇相当长的文章,有 4 个部分。在第 1 部分和第 2 部分中,我试图对算法和时间复杂性进行深入(希望是直观的)介绍。如果你对时间复杂性相当熟悉,那么你可以跳到第 3 部分和第 4 部分。

  1. 时间复杂度入门: 什么是时间复杂度,它对我有什么影响,我该如何看待它?
  2. 从慢到快算法 : 什么让一个算法变快?同一个问题的两个解决方案怎么会有完全不同的速度?
  3. 基本操作 : 我做的一些常规事情有多快/慢?
  4. 两两距离问题 : 如何快速找到最近邻?如何快速找到相似和近似重复的文档?我的聚类算法有多快?

时间复杂性入门

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

让我们从一些例子开始,让您了解如何考虑算法和时间复杂性。如果你对时间复杂性相当熟悉,你可以跳过这一节。

两个列表的交集

几年前,我的一个同事被要求对他们平台的常客进行描述性统计。他首先获得了本月的客户名单,并将其与上个月的客户进行比较。他有两个 python 列表curr_custprev_cust,他的代码看起来像这样:**

*common_cust = 0
for cust in curr_cust:
    if cust in prev_cust:
        common_cust += 1*

他从每月大约 4000 名客户的样本列表开始,这段代码片段运行了大约 30 秒。当这用于大约 300 万客户的完整列表时,这几行代码似乎会永远运行下去。

是因为 Python 就是慢吗?我们是否应该转向 C/Go 进行优化?我们需要为此使用分布式计算吗?答案是否定的。这是一个非常简单的问题,修复更简单,只需 1 秒钟左右。

*common_cust = 0
**prev_cust_set = set(prev_cust)** for cust in curr_cust:
    if cust in **prev_cust_set**:
        common_cust += 1*

对于具有计算机科学或一般编程背景的人来说,这个修正应该是相当明显的。但是可以理解的是,来自不太重视计算的背景的人可能看不出上面两个代码片段有什么不同。

简而言之,这种差异可以归结为 python listset之间的差异。一个set被设计用来快速完成这些"is this element in"操作。即使您将 **prev_cust_set** 中的元素数量增加一倍,操作 **cust in prev_cust_set** 也需要同样长的时间。

另一方面,如果将 **prev_cust** 的大小增加一倍,那么 **cust in prev_cust** 的运行时间就会增加一倍。如果您想知道set是如何做到这一点的,它使用了类似于散列表/散列表集、的数据结构,这也可以用某种版本的二叉查找树来实现。

时间复杂性和大 O

我们知道代码片段之间存在差异,但是我们如何表达这种差异呢?这就是大 O 符号的由来。

虽然大 O 有正式的定义,但你主要可以把它看作是一台机器完成算法所做的“运算”次数的估计。操作的数量与“运行时间”密切相关,它通常与数据的大小有关。您可能会听到类似于“经典的 SVD 分解具有立方复杂度。”以及你在所用算法的文档中可能遇到的一些东西。**

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

Big O’s in scikit-learn’s documentation

如果我们查看 python 关于时间复杂度的文档,我们可以读到具有形式x in s的操作:

  • O(n)如果s是一个list
  • O(1)如果s是一个set

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

我们从list的例子开始看,它是 O(n),其中n是每月的客户数。

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

一般步骤是:

  • 我们遍历curr_cust中的每个客户,这里有n个客户
  • 对于每个客户cust,我们检查它是否在列表prev_cust中。根据文档,这是 O(n ),但直觉上,要做到这一点,我们可能需要检查prev_cust中的每个客户,看看cust是否是其中之一。prev_cust中有n个客户,所以这最多需要n次操作
  • 添加号码只需 1 步。

循环的每次迭代大约需要 O(n) + O(1)步,循环中有 n 次迭代,所以把所有的 n(O(n) + O(1)) = O(n)。

你可以把 0 相加相乘,当你有几项时,你只需要去掉低阶项和系数。O(n +n) = O(n)。

我们可以使用set对代码做同样的事情,唯一的区别是cust in prev_cust_set运行时间为 O(1 )(平均)。

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

一般步骤是:

  • 有一个预处理停止来创建集合。我们就当这是 O(n)吧
  • 我们循环遍历curr_cust中的每个客户,这里有n个客户
  • 对于每个客户cust,我们检查其是否在列表prev_cust_set中。这需要 O(1)
  • 添加号码只需 1 步。

综合起来:O(n) + n(O(1) + O(1)) = O(2n) = O(n)。与list实现相比,set快得惊人。

解读大 O

所以我们有一个 O(n)的算法和另一个 O(n)的算法。你对此如何解读?

看待这个问题的一种方式是通过插入数据集的估计值 n 来估计问题的大小。如果我们的数据大小为 300 万,那么对于 O(n)算法将有大约 3000000 次操作,大约为 900000000000,这是一个很大的数目。

相同的数据集,但是使用 O(n)算法,将有大约 3000000 次操作,这更容易管理。

回想一下,在计算大 o 时,我们忽略了低阶项和系数,因此精确值在这里并不重要。我们只看问题的严重性。百万次运算算法比十万亿次运算算法好得多。

看待这个问题的另一种方式是获得两个数据集大小之间的相对比率。如果有每种算法的经验基准,并希望在扩大规模时进行推断,这将非常有用。

假设在40000的客户那里,list算法花费了 30 秒。如果我们将数据量增加一倍,需要多长时间?所以我们现在有一个大小为 2n 的数据集。那么运行时间将是大约

O((2n) ) = O(4n)

这意味着将 O(n)的数据集大小加倍会使运行时间增加 4 倍。我们预计它将运行 120 秒左右。

另一方面,对于set算法来说等于 O(2n)这就意味着数据集翻倍只是运行时间翻倍。

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

性能上的大差异来自于cust in prev_custcust in prev_cust_set的细微差别。当我们使用的很多代码都是从我们使用的模块中抽象出来的时候,这些差异就很难注意到了。

大 O 符号为我们提供了一种方式来总结我们对上述两种算法如何扩展的见解。我们可以比较 O(n)和 O(n ),而不知道每个算法是如何实现的。这正是我们在使用x in prev_cust_set是 O(1)这一事实时所做的,而没有描述set是如何实现这一点的。大 O 给我们的是一种通过描述运行时间相对于输入大小的一般形状来抽象算法的方法。

意识到这些差异有助于我们判断一个只有少量数据样本的特定方法在生产中是否可以扩展。你不希望发生在你身上的事情是,在一个小样本上做一个实验或概念验证,展示好的结果,从利益相关者那里得到一个行动信号,却发现你的算法不能处理所有的数据。

另一方面,如果您知道数据集不是海量的,那么您可以选择使用较慢的算法和模型,这些算法和模型要么给出更好的结果,要么实现和维护更简单。

从慢速算法到快速算法

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

在我们开始探索我们在数据科学中使用的不同工具和技术的时间复杂性之前,我将首先介绍解决一个简单得多的问题的方法,即范围查询问题。对于每种算法,我们简要讨论它是如何工作的,以及随之而来的特性。希望在经历了这一系列算法之后,你会对算法和时间复杂性有更好的感觉。

范围查询问题

假设我们有一个大小为 n 的数组。

*arr = [443, 53, 8080, 420, 1989, 42, 1337, 8008]*

在上面的示例中,索引从 0:

  • arr[0] = 443
  • arr[1] = 53
  • arr[4] = 1989

您的任务是为某个查询query(a, b).获取索引ab之间所有数字的总和

假设查询是query(2, 5)。那么答案应该是10531

*arr[2] + arr[3] + arr[4] + arr[5] 
8080 + 420 + 1989 + 42 
10531*

另一个可能的可选操作是更新数组中的元素update(idx, new_val)

*update(3, 88)
query(2, 5)# arr[2] + arr[3] + arr[4] + arr[5] 
# 88 + 420 + 1989 + 42 
# 3539*

天真的解决方案

最简单的解决方案是遍历列表并得到总和。

*def query(a, b): 
    return sum(arr[a: b+1])*

上面的代码虽然代码很少,但实际上已经在做很多事情了。为了清楚起见,我们将把sum(arr[a: b+1])分解为以下查询:

*def query(a, b):
    ret = 0
    for i in range(a, b+1):
        ret += arr[i]
    return ret*

query(.)的总复杂度基于查询范围内有多少元素。这取决于ab,元素总数之和为b — a + 1,在处理大 O 记法时,我们看这个值的最坏情况,在查询整个数组的和时,这个值最高可达N

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

要更新数组,我们只需更新特定索引上的元素:

*def update(idx, new_val):
   arr[idx] = new_va*

这个update(.)函数显然是在 O(1)时间内运行的,或者是在常数时间内运行的。无论数组有多大,这个函数都运行相同数量的操作。

对于简单的解决方案,我们有以下时间复杂性:

  • 查询: O(N)
  • 更新: O(1)

这样做的问题是,如果数组被查询很多次,那么对于每个查询,都有一个 O(N)操作。对于q查询,你总共会有 O(qN)个解。

这可以接受吗?看情况。如果你有一个大的数组和大量的查询,那么这是不可接受的。想象一下,对于一个规模为 1,000,000 的阵列,您有大约 1,000 个查询。

如果数据很小,那么像这样的问题就变得微不足道了。

前缀总和

为了解决简单解决方案的缺点,我们引入使用一个前缀和。我们转换了原始数组,这样查询速度会更快。

前缀 some arr_sum是一个数组,其中特定索引处的值是原始数组中直到该索引的所有元素的总和。

*arr = [443, 53, 8080, 420, 1989, 42, 1337, 8008]arr_sum[0] = 0
arr_sum[1] = arr[0]
arr_sum[2] = arr[0] + arr[1]
arr_sum[3] = arr[0] + arr[1] + arr[2]
...
arr_sum[8] = arr[0] + arr[1] + arr[2] ... + arr[7]*

然而,前缀和的这种特殊构造是缓慢的。构建arr_sum需要 O(N)个时间,因为arr_sum中有 N 个单元要填充,每个单元加起来有 N 个arr的元素。

我们可以通过注意到arr_sum[3]arr_sum[2]之间唯一的区别是arr[2]来更有效地构造arr_sum

*arr_sum[2] = arr[0] + arr[1]
arr_sum[3] = arr[0] + arr[1] + arr[2]
arr_sum[3] = arr_sum[2] + arr[2]*

因此,arr_sum的一个更好的结构如下

*arr_sum[0] = 0
arr_sum[1] = arr_sum[0] + arr[0]
arr_sum[2] = arr_sum[1] + arr[1]
arr_sum[3] = arr_sum[2] + arr[2]
...
arr_sum[8] = arr_sum[7] + arr[7]*

这需要 O(N)时间,因为仍然有 N 个单元,但是每个单元只需要计算 2 个值。如果操作正确,arr_sum将导致:

*arr_sum = [0, 443, 496, 8576, 8996, 10985, 11027, 12364, 20372]*

现在我们如何使用它?如果我们有一个对25的查询,那么我们可以使用从 0 到 5 的前缀总和,并从中减去从 0 到 1 的前缀总和,得到从 2 到 5 的总和。

*def query(a, b):
    return arr_sum[b+1] - arr_sum[a]*

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

Getting the sum of index 2 to 5

在某种程度上,我们拥有任何查询答案的缓存*。我们预计算了一些在查询中对我们有帮助的值。需要明确的是,无论query(a, b)的范围有多大,函数只需要查找 2 个值,所以查询时间是常数,O(1)。*

如果需要update操作怎么办?那么更新单个元素将意味着包含该元素的所有前缀总和也需要被更新。这意味着我们可能需要重建前缀和,这需要 O(N)时间。

对于前缀和算法,我们有以下时间复杂度:

  • 查询: O(1)
  • 更新: O(N)

我们看到了优化查询和更新之间的权衡。如果我们优化查询,那么它要求我们维护一个数据结构(我们拥有的前缀总和数组是一个数据结构),并且当涉及到更新原始数组的元素时,这有开销。但是,我们不想维护数据结构,那么每个查询都需要我们遍历查询范围内的每个元素。

分割树

我们构建的能够平衡查询和更新的特定数据结构是段树。这是一棵二叉树,其中每个节点代表一个段。

在下图中,我们有一个从arr构建的细分树。底部的叶节点是原始数组的元素,每个节点的值只是其子节点的总和。

*arr = [443, 53, 8080, 420, 1989, 42, 1337, 8008]*

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

Segment tree constructed from arr

我们重新标记了上面的树,以突出每个节点所代表的部分。最顶端的节点包含从索引 0 到 7 的整个数组的总和。

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

The number beside the node represents the range of indices of the segment it represents

那么,我们如何从中查询呢?这个概念类似于前缀 sum,我们可以使用预先计算好的数组片段来计算查询的范围。这里的区别在于,段树在它所能表示的段上更加灵活。

假设我们想找到query(2, 5)。获得突出显示的节点的总和将得到正确的答案。虽然证明并不简单,但是与原始数组的实际大小相比,您需要访问的节点数量自然非常少。此操作需要 O(log n)时间。

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

Getting the sum from elements 2 to 5

下面是另一个查询示例。比方说我们query(3, 7)

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

Getting the sum from elements 3 to 5

由于段树的制作方式,当我们更新一个叶节点时,唯一需要更新的节点是叶节点和根节点之间的节点。下面我们看到,如果我们在 5 更新元素,需要更新哪些节点。这个操作也需要 O(log n)时间,因为树上的每个节点都将所表示的段的大小加倍。

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

Nodes that need to be updated when updated element 5

对于分段树数据结构,我们有以下时间复杂性:

  • 查询: O(登录号)
  • 更新: O(登录号)

有了更复杂的数据结构,我们能够平衡查询和更新之间的权衡。然而,这种数据结构实现起来要复杂得多。这里将不讨论段树的确切实现。

***注:*通常在段树之前讨论的一个常用算法是芬威克树。虽然 Fenwick 树更容易实现,但我觉得 segment 树更直观。所以我选择不讨论这个。

甚至更快的算法?

如你所见,我们处理问题的方式可以极大地改变我们算法的性能(从二次到对数线性性能)。这可能需要做一些巧妙的预处理,找到一种更有效地表示数据的方法,或者使用数据的一些属性。

减轻这种情况的一种方法是投入更多的计算资源。然而,我们拥有的一些算法是在你拥有这台强大机器的时代设计的。这些可能不适合并行化。

然而,有一些问题,找到更快的算法可能非常困难,最快的算法仍然不够快。在这种情况下,找到更快解决方案的一种方法是放松问题。上面讨论的解决方案给出了精确的解决方案,但有些时候我们不需要最佳答案。我们需要的是足够好的答案。

我们可以通过以下几种方式之一来实现这一点:

  • 求解近似解(从最短路径到最短路径,或 k- 最近邻居k-足够近邻居)**
  • 使用使用概率过程的算法,在大多数情况下你可能会得到正确的答案(位置敏感散列和近似基数)
  • 使用收敛的迭代方法(随机梯度下降幂迭代*)*
  • 使用在一般情况下表现良好的算法( KD 树
  • (重新)设计可并行的算法

当我们学习不同的算法时,会遇到一些这样的问题

基本操作

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

为了完整起见,我们来看一些基本操作的笔记。您可以在下一节跳过这一部分,这可能更有趣。

基本数据结构

  • ***集合:*添加、删除和测试一个set中的成员平均为 O(1)
*set.add('alice')
set.remove('alice')
'bob' in set*
  • 字典:添加、删除和测试键-值对,a dict平均为 O(1)
*dict['alice'] = 1
del dict['alice']
print(dict['alice'])*
  • ***列表:*在一个list的最后一个元素添加和删除的是 O(1) 。在特定索引处获取一个值是 O(1)。在列表中间插入和删除元素是 O(n)
  • ***排序:*任何好的排序算法都应该是 O(n log n)
*arr = [3, 2, 1]
arr.sort()*

描述性统计

  • ***均值、方差、相关、最小值、最大值:*这是 O(n) 并且可以使用它们的计算形式以分布式方式高效地实现。
  • ***中位数,分位数:*一个简单的实现需要 O(n log n)的时间,因为它涉及到对所有的观察值进行排序,O(n log n),并在特定的索引处查找值。使用像 introselect 这样的智能算法,我们可以将其降低到由 numpy.partition 使用的 O(n) 性能
  • ***近似分位数:*设计分布式算法来寻找分位数很难,因为它们需要数据的整体视图。这就是为什么在 BigQuery 和 Apache Spark 中只能得到大约的分位数。这些算法的时间和空间复杂度可以根据你愿意容忍的误差来调整,它允许我们以分布式的方式计算分位数。你可以在 data bricks【3】的博客文章中读到更多。
  • 近似基数:如果我们想知道有多少个不同的元素,那么我们有一个在 O(n)中使用set的方法。然而,这需要 O(n)空间,因为它必须存储我们遇到的每个唯一值。类似于近似分位数,我们可以使用超对数来估计基数,其中有运行时和准确性之间的明确权衡。这就是 BigQuery 的 [APPROX_COUNT_DISTINCT](https://cloud.google.com/bigquery/docs/reference/standard-sql/approximate-aggregation)Elasticsearch 用来获得唯一值的计数。

向量乘法和距离

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

  • ***余弦相似性、欧几里德距离和曼哈顿距离/范数:*获得 d 维向量的 Ln 范数或点积需要 O(d) 时间,因为它需要遍历每个维度。
  • ***汉明距离:*如果有 d 位,那么汉明距离的计算需要 O(d) 时间。但是如果你能把它放入一个 64 位的数中,那么你就可以用按位运算得到一个 O(1)运算。
  • ***Jaccard 距离:*这涉及到获取两个集合的交集。虽然使用一个set来做这件事的平均时间是 O(m ),但是这里会有开销,这使得它比库做的要慢。像 numpy.in1d 这样的函数通过对两个集合的元素进行排序来做到这一点, O(m log m) ,当你有两个排序后的列表时,它们会在线性时间内获取它们的交集。
  • ***编辑距离:*又称, Levenshtein 距离,用于 fuzzywuzzy 等库。这个问题的解决方案使用了动态编程,对于两个各有大约 m 个字符的字符串,需要 O(m ) 的时间。这是距离度量中最昂贵的。

矩阵运算

对于矩阵运算,时间复杂度可能有点棘手,因为对这些运算的优化可以在非常低的级别完成,我们设计的算法可以感知缓存。在这一级别的优化中,大 O 符号可能会产生误导,因为我们会丢弃系数,并找到微调算法,这些算法可能渐进地更慢,但根据经验表现得更好。在 numpy 使用的 BLAS 和 LAPACK 等高性能库中会发生这种情况。

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

  • ***矩阵乘法:*如果你是两个矩阵,(n,p)和(p,m)相乘,那么这个的一般复杂度是 O(nmp) ,当两个大小为 n 的方阵相乘时是 O(n),numpy 等库使用 BLAS,所以矩阵乘法的具体实现取决于你使用的 BLAS 库。见此 stackoverflow 螺纹
  • ***解线性方程和矩阵求逆:*LAPACK 基准文档所述,这需要 O(n)时间。我认为 numpy 解线性方程组也是解矩阵逆。
  • (截断)SVD: 经典的 SVD 分解是 O(nm)或 O(n m) 取决于 n 和 m 哪个更大,但是如果你只需要得到前 k 个主特征向量,那么这个可以下到 O(nmk)
  • 随机化 SVD:svd_solver='randomized'根据文档O(n k)但原始论文说 O(nm log k)【4】时,这已经在 sklearn PCA 中实现。
  • 使用 OLS 求解线性回归:这在 O(nd)中求解,因为在求解 hat 矩阵时需要矩阵乘法[6]

成对距离

这是一个简单的问题,似乎没有简单的解决方法。

如果你有一个矢量 v ,并且你想要得到一个 n 矢量列表中的“最近的”矢量,那么最简单的实现将通过比较 v 和每个 n 矢量来花费 O(n) 时间。

更一般的,如果你有一个 m 向量的列表,对于每个向量,你想得到一个 n 向量的列表中“最近”的向量,这需要 O(nm) 时间。 O(n)如果 m 和 n 相等。

如果 nm 很大,那么这种成对的距离对于很多用例来说太慢了。到目前为止,我找到的解决方案如下:

  • 空间索引树:**平均能执行 O(log n)次搜索,最坏情况下能执行 O(n)次搜索。例如球树和 K-D 树。
  • ***随机投影和位置敏感散列:*这有助于我们用更快的算法获得近似的最近邻居。
  • NN-Descent: 这构建了一个 K-Nearest Neighbors 图,他们已经看到该图在 O(n^1.14 周围运行[5]

成对距离的问题

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

让我们进一步讨论一些您可能遇到的用例,以及在这个过程中有哪些数据结构和技巧可以帮助我们。

最近点

对于地理空间特征工程,例如风水先生,对于特定坐标,我们通过回答诸如“到最近的 _____ 的距离是多少?”的问题来构建特征和“1 公里半径内有多少个 ______?”

在这两种情况下,你可能天真地要检查你所有的点,这是 O(n)。为什么?为了让你断定一个点是“最近的”,你必须有一些保证,所有其他的点都更远。对于只有几千个搜索点的情况,这可能是可以接受的。但是,如果您想要在数百万个点中进行搜索,或者减少每个查询的搜索时间,该怎么办呢?我们该如何着手呢?

一维中最近的点

首先,我们处理特殊情况,我们假设我们的点只有一个维度。作为预处理步骤,我们对数组进行排序。假设我们想寻找最接近 42 的数字。我们看看 42“适合”在哪里,在下面的例子中,这是在 37 和 50 之间。这可以很容易地使用二分搜索法,O(log n)来完成。

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

Looking for the number to 42. No point in searching before 37 or after 50.

请注意,因为我们知道 42 适合 37 和 50 之间。我们只需要找到 37 和 50 中最接近的数字;向左和向右的每个点都必须比这两个点更远。

空间索引树

我们如何概括这两个二维?这就是像 K-D 树和球树这样的数据结构的用武之地。

K-D 树将空间映射成矩形,其中在欧几里得空间中接近的矩形在树空间中也是接近的。

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

K-D Trees visualized: Mapping a space using a tree

有了 K-D 树,我们首先能够询问包含我们的查询点的区域是什么。第一个区域的点很少,大概在 O(log n)附近。在得到这个初始区域中所有点的距离之后,我们得到最近点的距离的一个上界。

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

Only visit regions that intersect with the upper bound that we found

我们使用这个上限来消除那些没有选择包含离我们的查询点最近的点的邻近区域。视觉上,我们将搜索空间限制在那些与灰色圆圈相交的区域。

这样,我们能够消除许多不必要的距离,帮助我们实现平均 O(log n)的搜索查询。我们还可以进行“k-最近邻”和“半径内的点”查询。

这些是在 PostGIS 的最近邻搜索中实现的数据结构,你也可以在这个 Mapbox 博客文章中读到更多。你也可以阅读更多关于最近邻居-Scikit-learn

最相似的文档/近似重复的文档

我们拥有的其他使用案例有:

  • 寻找与给定单词嵌入最相似的文档或单词
  • 在记录数据库中查找近似重复项,其中记录如果“足够接近”(小于 3 个编辑距离),就可以被视为重复项

如果我们只是找到完全相同的副本,这就容易多了。既然我们可以使用一个set来寻找这些重复,但是因为我们寻找的是近似的重复,那么我们必须找到一个不同的方法。

K-D 树很好,但是对于其他用例,比如 NLP 中的用例,它可能不太有用。K-D 树和球树的一些问题是:

  • 不支持余弦距离/相似度
  • 可能不适用于高维数据

记住 K-D 树平均运行 O(log n)。然而,这并不能保证,只是根据经验证明是正确的。它最差的情况是 O(n),这在高维数据中更常见。

为了理解,回想一下上面的插图,我们将探索的区域限制在与灰色圆圈相交的区域。在三维空间中,我们的区域是立方体,对于更多的维度,我们有超立方体。随着维数的增加,我们增加了超立方体区域的邻居数量,这意味着我们限制必须探索的区域数量的能力下降,因为越来越多的区域“接近”每一个其他区域。

随着维数的增加,K-D 树对于单个查询的平均运行时间从 O(log n)漂移到 O(n)。

近似最近邻居

因此,与其尝试给出最近的邻居,我们不如瞄准得到一个“足够近”的邻近邻居。一种简单的方法是尝试使用 K-D 树,但是我们跳过了对邻近区域的探索,而只是在包含查询点的区域中进行搜索。或者我们也可以限制为只探索一定数量的邻近区域。这将保证一个 O(log n),但当然,这影响了整体精度。

如果你增加一点随机性,我们就会得到类似于 Spotify 的 asury的东西,它使用随机超平面来划分空间,而不仅仅是超平面通过轴。

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

Random regions partitioned by random hyperplanes by annoy

这种方法可以用于 K-D 树中不可用的距离度量,例如余弦相似度。这对于快速查找 gensim 中描述的最相似的单词非常有用。

“蛮力”枚举

在寻找近似重复或相似的单词时有一种特殊情况。例如,在您想要解决拼写错误的地方进行搜索。特殊情况是当查询词很短并且您愿意容忍的最大编辑距离很小时。

在这种情况下,您可以通过枚举查询词的所有可能的变体,将问题转化为寻找精确匹配。

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

Enumerate all words with edit distance 1 to “choriso”

对于列举的单词,我们只需使用set在单词列表中查找。对于上面的例子,这样做的总成本是单词“choriso”的可能突变的数量,编辑距离最多为 1。

*for word in enumerate_mutations('choriso', max_edit_distance=1):
   if word in word_set:
       do_something(word)*

快速计算一下,我粗略估计的时间复杂度大约是 O((n52)^k) 以最多编辑距离 k 来枚举一个长度为 n 的单词的所有可能的突变。所以它相对于 k 是指数的。

这就是为什么 Elasticsearch 的模糊搜索只允许最多编辑距离 2,以及为什么这种方法只适用于 k 非常小,而 n 又不是大得离谱的情况。

区分位置哈希

LSH 是处理这个问题的一般方式,而在某种程度上,这个惹怒的一揽子计划是 LSH 某些想法的一种实现。

LSH 的主题是,我们希望将我们查找的元素限制在那些与我们的查询向量可能相似的元素。假设我们有单词“巧克力”,并想在列表中查找与“巧克力”相近的单词。

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

Maybe compare chocolate to words that share the same prefix or suffix

如果一个单词接近“巧克力”,那么它们很有可能共享相同的前缀。当然,如果我们把单词限制在那些有相同前缀的单词上,我们可能会漏掉那些只有前缀不同的单词。我们也可以包括共享相同后缀的单词。所以类似于“巧克力”的单词不太可能有不同的前缀和后缀。

在这种情况下,我们的单词的“哈希”是前缀和后缀,在哈希中有冲突的单词成为比较的候选。对于向量,你可以使用列的随机子集或随机项目进行哈希运算,并使用 MinHashes,你可以在第三章挖掘海量数据集【7】中读到更多。

python 的实现有 datasketch脸书 faissNearPy

如果您对这方面的更多内容感兴趣,您还可以使用粗略结构查看这些关于大数据的博客文章*、第 1 部分第 2 部分。*

聚类算法

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

在这里,我们将简单介绍几种聚类技术,以及它们的时间复杂度。

K-表示

*在 K-Means 中,每个点被分配到它最接近的质心。同样,这需要比较每个质心到当前点的距离。如果有 n 个点和 k 个质心,那么每次迭代需要 **O(nk)。*这有一个隐藏的系数,是我们在算法收敛之前期望的迭代次数。

如果你想通过迭代 k 的可能值对 k 做一些超参数搜索,那么我们预计整体复杂度为 O (nk)。

小批量 K-Means

***Mini Batch K-means 对原始数据集的随机样本而不是整个数据集进行每次迭代。这意味着我们不必将整个数据集加载到内存中来进行一次迭代,当你遍历大型数据集时,质心可以开始移动到局部最优。这与我们在随机梯度下降中发现的主题相似。我们期望总的复杂度现在是 *O(mk),其中 m 是批量大小。

层次凝聚聚类

您有多种风格,如沃德、单个、完整和平均链接,但它们都有一个共同点,它们需要创建一个距离矩阵*

这意味着经典 HAC 算法保证至少有ω(n)的运行时间,根据 scipy 的文档,链接方法运行在 O(n ) 时间。

**除非你自己提供一个距离矩阵,否则 sklearn 内部调用的sk learn . cluster . agglomerate clusteringscipy . cluster . hierarchy .等库最终会使用scipy . spatial . distance . pdist创建一个距离矩阵。

HDBSCAN

HDBSCAN 是 DBSCAN 的迭代,是一种很好的算法,它使用几个超参数对数据进行聚类,没有对数据分布的强假设,并且对噪声的存在具有鲁棒性。

在高层次上,HDBSCAN 尝试估计点周围的密度,并将高密度区域中的点组合在一起。

对于某些距离度量 m ,HDBSCAN 有两个主要步骤,这两个步骤都可能很昂贵:

  • ***计算核心距离:*对于每个点,基于 m 得到 k 个最近邻。
  • ***构建最小生成树:*从全连通图中构建一个最小生成树,其中边的权重基于核心距离和度量 m.

对于一般情况,这两个任务的复杂度都可能是 O(n ), hdb 的作者可以尝试在[8]中解决这个问题。然而,这里的一个关键细节是,我们正在处理一个距离度量,例如欧几里德距离,我们可以做一些优化来加快这两项任务。

核心距离的计算需要 K-最近邻,我们已经讨论过可以使用 K-D 树或球树来加速。这意味着这一步平均在 O(n log n)和 O(n)之间。

有效地构造最小生成树超出了这篇博文的范围,但是简单地说,改进的双树 Boruvka 算法使用了一个空间树,比如 K-D 树,并使用它来寻找连接的组件之间的最近邻居。作者说这平均运行时间为 O(n log n)。

这样,HDSCAN 的平均运行时间大约为 O(n log n ),但是这个性能实际上取决于数据…根据数据的维数和数据的底层分布,仅核心距离的计算就可以达到 O(n)。

我应该喝杯咖啡吗?

为了总结不同的集群性能,HDBSCAN 文档的基准测试部分有一个我们可以使用的简洁表格。

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

HDBSCAN for 1000000 samples? Let’s get lunch first!

大数据很难

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

正如您所看到的,像获取成对距离这样的问题对于小数据集来说是微不足道的,但是随着我们对数据集进行扩展,这些问题变得越来越严重。

然而,如果我们能够利用问题的某些特性,比如有一个度量距离度量,那么我们就可以使用数据结构 K-D 树来减少运行时间。

另一种方法是概率算法和数据结构,如 LSH 和随机化 SVD,以在运行时间内获得加速,从而降低准确性。

对于更特殊的问题,解决方案不太明确。这是一个关于不同算法和设计选择的计算成本的好背景。

参考

[1]迈克尔·乔丹《论计算思维、推理思维与数据科学》。IST 讲座,2017 年 11 月。

[2]安德鲁·盖尔曼。“N 永远不大”。2005 年 7 月

[3]蒂姆·亨特、侯赛因·法拉奇和约瑟夫·布拉德利。《Apache Spark 中的近似算法:超对数和分位数》。Databricks 工程博客。2017 年 5 月。

[4]哈尔科、内森、佩尔-贡纳尔·马丁森和乔尔·特罗普。"寻找具有随机性的结构:构造近似矩阵分解的概率算法."暹罗评论53.2(2011):217–288。

[5]董、魏、夏利卡尔·摩西和。“通用相似性度量的有效 k-最近邻图构造。”第 20 届万维网国际会议论文集。美国计算机学会,2011 年。

[6]谢卓瑞。 STA141C:大数据&高性能统计计算。加州大学戴维斯分校。

[7] Leskovec、Jure、Anand Rajaraman 和 Jeffrey David Ullman。 海量数据集的挖掘 。第三章。剑桥大学出版社,2014 年。

[8]麦金尼斯,利兰和约翰希利。“加速分层密度聚类.” arXiv 预印本 arXiv:1705.07321 (2017)。

照片: Pixabay 来自 PexelsKrivec Ales 来自 PexelsGuduru Ajay bhargav 来自 PexelsSplitShire 来自 PexelsDavid Geib 来自 Pexels

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值