TowardsDataScience 博客中文翻译 2019(三百零三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

NBA 赛季太长了吗?

原文:https://towardsdatascience.com/is-the-nba-season-too-long-4a4e56b8ed50?source=collection_archive---------28-----------------------

每年临近赛季末,都会有一个大名鼎鼎的 NBA 球员在一场重要的比赛中受伤。这就提出了一个问题:NBA 赛季应该缩短吗?

今年,我们看到一些高知名度的球员在赛季的最后阶段受伤。德马库斯·考辛斯、凯文·杜兰特和克莱·汤普森在季后赛中受伤。有几次,人们看到科怀·伦纳德在球场上一瘸一拐的。当然,这对那些夜以继日付出的球员来说是不好的。

鉴于这项运动的激烈程度,看到运动员坐在场外休息并不罕见。“负荷管理”这个词经常被媒体提起,只是因为玩家需要经常休息。没有机会休息,球员受伤的几率会增加。作为一名教练,你为什么要在一场不重要的比赛中拿球员的健康冒险?尽管球队很想赢,但他们也需要为他们的未来做准备,如果他们足够优秀,可以进入季后赛。

出于对经常发生的伤害类型的好奇,并想知道它们何时发生,我在互联网上搜寻答案。为了弄清这一点,我通过使用 Pro Sports Transactions 的数据收集了 2010 年至 2018 年 NBA 的每一次受伤。

它是这样分解的:

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

这项运动需要爆发性的跳跃和方向的快速改变。大多数伤害发生在腿部是不足为奇的。但是这个赛季什么时候会出现这些伤病呢?缩短赛季时间会有助于减少赛季中的大部分伤病吗?

NBA 赛季目前包括 82 场比赛–41 场主场比赛和 41 场客场比赛。所有比赛结束后,东部和西部的前八名球队进入季后赛。团队可以在任何地方玩 4-28 场游戏。考虑到这个时间线,我把每个赛季分成两半,看看一年中什么时候球员受伤最严重。

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

令人惊讶的是,大部分球员在赛季前半段受伤。当一名球员在赛季末受伤时,赛季需要缩短的说法经常被提起。据说游戏的磨损会对一个人的身体造成损害。磨损是真实的,但是如果大多数伤病发生在赛季的前半段,为什么没有人谈论这个?缩短赛季可能有助于防止伤病,但看起来这些潜在的变化只会针对受伤病影响最小的那半个赛季。

另一个值得注意的有趣的事情是联盟的发展方向:

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

受伤人数似乎在减少。无论是医护人员变得更好,还是球员打得更聪明,这对所有人都很好。

底线是 NBA 是一个企业。组织希望保护他们的球员,以增加他们赢得一切的机会。玩家们将继续在比赛中袖手旁观。

从一个球迷的角度来看,我知道出现在一个竞技场是多么令人厌烦,渴望见到你最喜欢的球员,却发现他们要休息了。这对球迷来说是一种不好的做法吗?当然可以。但是看看托伦托猛龙队发生了什么,他们让科怀缺席了整个赛季的几场比赛。他们被授予了一个头衔,因为他们决定让科怀休息。

如果球迷去观看他们最喜欢的球员比赛,看到他们坐在板凳上可能会有强烈的反弹。但也可能有一种疯狂的方法,因为某些东西似乎在起作用

哪一天投资最好?

原文:https://towardsdatascience.com/is-there-a-best-day-for-scheduled-deposits-in-investment-accounts-b23b8402948d?source=collection_archive---------11-----------------------

你应该选择哪一天作为你投资帐户的循环日?

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

Photo by Wyron A on Unsplash

早点存,定期存。太好了。你将定期存款安排到一些指数化投资,可能是 ETF,也可能是通过像 Betterment、WealthFront 等机器人顾问。

定期存款对冲了你对市场时机的押注。在我的例子中,我设定了一个机器人顾问的周存款,并想知道市场中是否有一个周模式显示一周中有利于投资的一天。我们能得到平均值的优势吗?

值得庆幸的是,所有的工具都是免费的,可以尝试得到这个问题的方向性答案。

对统计数据的初步看法

Quantopian 的平台提供免费的数据源和工具来构思交易算法。这个问题的好去处,让我们开始吧。

QTradableStocksUS 是一个由 Quantopian 管理的股票大世界,它去除了细价股和其他非流动性股票,但仍然是一个大世界。我正在查看自 2015 年以来该领域的所有股票回报。

To use those gists, you will need to create an account on Quantopian

Number of equities: 3039

现在,让我们得到在所考虑的时间段内每天所有符号的平均收益。

avg_returns = pipeline_output.groupby(level=0).mean()
avg_returns.head(2)

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

average returns and gratuitous average price

因为我们需要周模式,所以让我们添加星期和星期号。我们想要的是相对于每周平均回报的相对回报,而不是绝对回报,所以我们用平均值和标准差来标准化每周。

基于此,什么是平均每天的回报呢?在过去 4 年左右的时间里,似乎周一早上是你计划投资的最佳时间。

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

Normalized weekly returns over all 3000+ stock per day

请记住,回报是正常的,所以周五 12%的下跌谢天谢地不是市场上每周发生的事情。

没那么快…

嗯,我们有多少变化?

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

now with error bars

哎哟。这种模式突然变得不那么吸引人了。尽管如此,周五仍有 5%的可能性低于平均水平,相当于 0.05 的 p 值,这在统计上是显著的。YMMV 取决于您可接受的 p 值阈值。

让我们继续挖掘,看看均值是如何随时间演变的。

周日模式是如何随时间演变的?

让我们来看看在一个特定的观察范围内,这些相对收益是如何随着时间的推移而变化的。例如,如果我在几年内对 12 周的滑动窗口做同样的分析,这些天会一直翻转还是我们会看到一个模式?

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

很难看出,但纵观 12 周的滑动窗口,周五可能是一个月来表现最差的一天?到处都是。

更长的时间窗口怎么样?下面 48 周。

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

从更长的时间来看,周五似乎是最糟糕的一天,所以从这个角度来看,周一进行定期存款并不是一个坏选择。

最后

不足为奇的是,几乎没有任何迹象表明任何重要的东西已经被套利掉了。然而,轻微的趋势使我选择我的经常性存款日为星期一。声明,这不构成投资建议

接下来呢?我很想知道基于这个因素的多空策略会有怎样的表现,这是 Quantopian 拥有强大工具的另一件事。此外,我很想看看某些股票在一周内的表现是否非常可预测。可能是后续文章的主题。

感谢你对这篇文章的评论和修改!

注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

有阿隆·拉姆齐的诅咒吗?

原文:https://towardsdatascience.com/is-there-a-curse-of-aaron-ramsey-3589d02dd278?source=collection_archive---------17-----------------------

“阿隆·拉姆齐的诅咒”暗示着:当前阿森纳足球运动员阿隆·拉姆齐进球时,一个名人很快就会死去。

这篇文章研究了这个“诅咒”的证据。

假定的诅咒

《每日星报》在 2018 年 4 月的中描述了这种假设的现象:

一个神秘的理论正在互联网上流传,当阿隆·拉姆齐进球时,一个知名的名人注定会在不久后去世。

这位阿森纳和威尔士球员经常设法打进重要的进球——但有时也有不好的一面。

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

Are these celebrations a ghostly call of doom? (Photo: Wikimedia Commons)

给我数据

阿隆·拉姆齐的进球记录来自足球俱乐部。这个分析只看每年 8 月到 5 月(简称足球年)之间的进球,涵盖 2014/15 到 2018/19。

“名人”的定义是主观的。我使用了两个不同的来源:每日镜报和英国广播公司。《每日镜报》每年都有“名人死亡”的在线文章。

同样,BBC 也有“显著死亡”的文章。对于 2016 年,由于名人死亡的数量很高,我只记录了在BBC 文章中强调的“前 34 名”死亡的日期。

离门柱很远

总的来说,拉姆齐得分的天数和名人或名人去世的天数之间似乎没有关系。

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

The Daily Mirror celebrity death day count has increased.

我们还应该看看具体的说法:在阿隆·拉姆齐得分之后,名人或名人死亡的天数比例是多少?

我使用了八种不同的方法,分别对应于同一天和三天之后的死亡人数。

在研究期间有 37 天阿隆·拉姆齐进了一个球。名人或名人的死亡有一个基本比率——拉姆齐目标日确实超过了这个比例。

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

如果我们假设目标日是随机选择的(每一天都是一次试验),我们的二项式假设意味着这个“诅咒”的证据是微弱的。这是一个过于简单的模型,没有考虑到足球运动员比赛天数的分布。

宣称:每当拉姆齐进球,就有一名名人死去,这显然是错误的。

出去射门

这八项措施并不是作为多重比较问题提出的,而是为了强调主观选择的影响。

使用任一数据集都是一种选择。名人的概念是主观的,我们很容易调整我们的定义来适应一个假定的模式。

选择一个时间范围来计算是一种选择。使用频率论者或贝叶斯方法是一种选择。

虽然这项研究只关注了这些联系,但暗示这些选择存在“诅咒”的说法并不可靠。

似乎没有阿隆·拉姆齐的诅咒。意大利的名人应该对拉姆齐自由转会尤文图斯没什么可担心的。

数据来源和基本分析包含在的谷歌表单中。各种测试和数据可视化的 R 代码在的一篇 R Pubs 文章中。

开放数据和公开数据有区别吗?

原文:https://towardsdatascience.com/is-there-a-difference-between-open-data-and-public-data-6261cd7b5389?source=collection_archive---------3-----------------------

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

一个普遍的共识是,当我们谈论开放数据时,我们指的是任何可以自由访问、使用、重用和重新分发的数据或内容。然而,由于大多数政府推出开放数据门户的方式,很容易认为这些网站上的数据是唯一可供公众使用的数据。这不是真的。

尽管获得政府公开标记的数据集得到了更多的关注,但它们实际上只代表了网上公开数据的一小部分。

那么“公共”数据和“开放”数据有什么区别呢?

什么是开放数据?

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

一般来说,公开数据是在政府认可的门户网站上发布的信息。在最好的情况下,这些数据是结构化的、机器可读的、开放许可的,并且维护得很好。

什么是公共数据?

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

公共数据是其他任何地方都存在的数据。这是网络上免费提供的信息(但不是真正可获得的)。它经常是无结构的和不规则的,并且它的使用需求经常是模糊的。

“只有 10%的政府数据作为开放数据发布”

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

这是什么意思?

首先,这意味着政府门户网站上的公开数据和公共数据之间存在差异。这是一个重要的区别,因为虽然开放数据计划及其改变现代社会的潜力令人兴奋,但这个前提所依赖的数据——开放数据——只是实现这一潜力所需的一小部分。

事实是这样的:大部分有用的政府数据要么仍然是私有的,要么被藏在某个地方的文件柜里,而那些可用的东西正在被随意发布。

有关系吗?

这两种数据之间的区别真的重要吗?嗯……是的。

开放数据,因为它只代表了可用数据的一小部分,还没有发挥出它的潜力。像我这样对 开放数据运动 寄予厚望的人,还没有看到我们应该看到的投资回报(经济或社会)。我们没有的原因是多方面的,但这种区别是问题的一部分。

为了让公开数据像预测的那样有效,公开数据和公共数据之间的界限需要消除,政府需要开始让更多的公共信息成为公开数据。毕竟,是我们在为此买单。

最初发表于【https://blog.thinkdataworks.com】

外面有工作吗?

原文:https://towardsdatascience.com/is-there-any-job-out-there-81ca0b514166?source=collection_archive---------20-----------------------

有没有想过为什么找数据科学的工作这么难?看看 Kaggle Survey 和 Glassdoor 工作列表之间的比较。

喂?喂?喂?外面有工作吗?
能录用我就点头。
人力资源部有人吗?

来吧…
我听说你情绪低落。
我可以减轻你的痛苦。
让你重新站起来。放松。

改编自平克·弗洛伊德的《舒适的麻木》

去年,我做了一项分析,以了解是什么让数据科学家变得有价值?这个想法基本上是为了确定是什么让从事数据相关工作的人年收入超过 10 万美元。一年后,我从巴西搬到了英国,从数据科学转到了数据工程,从年收入 14k 美元到超过 100k 美元。

现在,我认为将数据专业人员的技能与世界各地的工作列表进行比较会很好。为了实现这个目标,我搜集了一些与职位相关的数据,并将结果与 Kaggle 进行的调查进行了比较。希望你发现它对规划你的职业生涯是有益的!

首先,让我们创建一个指标来比较这两个不同的数据集以及不同的国家。下面的雷达图显示了 Kaggler 的数量*(这是我将如何引用 ka ggle 用户)*以及与每个国家的总数成比例的工作列表。为了更好的理解,请看下面的例子。

国家示例

数据科学家= 30 个答案(或工作列表,如果是 Glassdoor)
开发人员= 90 个答案
总共= 120 个答案

我们将策划:
数据科学家= 25%
开发者= 75%

美国对中国

Percentage of Kaggle answers per country. Highlighted USA and China.

大多数国家的卡格勒比例与美国相同,数据科学家的比例高于其他职业。这确实有意义,因为 Kaggle 专注于数据科学。但是我们确实有一些异常值。从中国开始,软件工程师和数据工程师在 Kaggle 大量出现。他们是想学数据科学转行吗?还是只是他们想加到现在角色上的一个知识?

看看 Glassdoor 的工作列表,我们发现中国软件工程领域的工作比数据科学领域多得多。

警告!如果你住在中国,是一名软件工程师,正在考虑迁移到数据科学,那么请重新考虑。在这个新的职业中,你可能会更难找到工作。

**美国想要数据分析师!**如果你住在美国,想成为一名数据科学家,那么考虑找一份数据分析师的工作。这可能会容易得多,因为该地区的就业机会比 DS 多。

看一下 Kagglers 报道的薪水,我们发现与其他职位相比,中国支付给统计学家和研究科学家的薪水更高。然而,不幸的是,正如前面的图表所示,这个领域没有多少工作机会。在美国,薪水最高的是数据科学,其次是数据工程和软件工程。当然……美国在几乎所有的职位上都比其他国家支付更多。

巴西对印度

我们看到巴西和印度在所有职位上的 Kagglers 比例非常接近。然而,巴西有更高比例的统计学家和研究科学家,这可能表明在巴西学术界做博士的人比印度多。

查看工作列表,我们发现巴西与中国有相似之处:对软件工程师的巨大需求。

**来自巴西的数据科学家正在努力寻找工作!**考虑学软件工程,加入一家公司做初级开发。

来自印度的卡格勒人!从商业分析师开始你的职业生涯有巨大的机会。

看那个!数据工程在巴西的工资看起来很高!不过,要找到一份 DE 工作并不容易(记住,软件工程师的需求量要大得多)。在印度,数据科学家的报酬会更高。如果你想挣得更多,那么考虑搬到另一个国家。

一些欧洲国家

荷兰有更多的专业人士对 Kaggle 感兴趣,因此对数据科学感兴趣。对于其他国家,我们看到缺乏数据工程师和商业分析师。他们在目前的职位上快乐吗?

在欧洲,职位列表几乎是均等的(所有职位的比例几乎相同),这意味着如果你想成为数据科学家或商业分析师,在职位提供方面不会有太大差异。但就竞争而言,如果我们将 Kaggle 的调查推广到现实世界,可能会有更多的数据科学候选人。

来自欧洲的软件工程师!你在荷兰可能更容易找到工作!

最后,当我们比较欧洲的工资时,我们发现他们几乎处于相同的范围(英国稍微高一点,可能是因为货币比欧元强)。现在我们可以说,商业分析师在欧洲确实很快乐,他们的平均收入甚至比技术人员还要高。

**来自英国和德国的软件工程师、数据工程师和数据科学家!**现在就停止编码,成为商业分析师!

**我开玩笑的。不要那样做。**还是做。

在上面的图表中,你可以看到机会在哪里,取决于你住在哪里。更多的工作列表意味着在该领域获得工作的机会更多。一个职位上有更多的人,可能意味着你在找工作时会面临更多的竞争。

多年的编码经验如何影响薪水?

我们确实期望随着经验的增加薪水会增加,事实就是这样!然而,你有没有看到那些根本不编码的人比那些开始编码的人挣得多一点?这可能是因为经理们坐在第一组。一旦你获得了一些动力编码,你的工资会持续增加。

我们能检验经理(没有编码经验)推动工资增长的假设吗?嗯……有点……我们希望经理们挣得更多,也更……老,对吗?让我们看看这是不是真的。

有理由推断,没有编码经验的人比没有什么经验的人挣得多,因为他们在管理岗位上。除了数据工程,我们有更年轻的人,没有编码经验,比那些开始编码的人挣得多。

公司规模如何影响薪水?

平均工资通常随着公司规模的增加而增加。数据科学家和统计学家/研究科学家认为,从一家初创公司跳槽到一家大公司时,他们的工资单会有最大的不同。商业分析师不能指望仅仅通过跳槽到一家更大的公司就能大幅增加工资。

薪水不是一切。在找大公司的工作之前,先考虑利弊。

Python、R 和 SQL——在 Kaggle 和就业市场中的受欢迎程度

Python 已经成为所有职位的人使用的主要语言,大约 3/4 的受访者经常使用它。r 语言更不受欢迎(几乎没有软件工程师使用它)。

如果你想找一份数据科学方面的工作,那么 Python 是首选语言。Glassdoor 上超过 75%的数据科学职位在职位描述中都提到了 Python。

Python 是市场偏爱的数据科学语言!

统计学家和研究科学家比其他职业使用更少的 SQL。事实上当时只有 1/4 的人使用 SQL!这表明学术界更习惯于平面文件而不是数据库。不幸的是,现实世界在中没有出现。csv** 文件。**

嘿,你正在读硕士或博士,想找份工作!看上面那两张图!学习 SQL!

如果你想开始与数据打交道,那么了解 SQL 将有助于你获得商业和数据分析师的工作。现在如果你想走上数据工程的道路,SQL 和 Python 是必须的。软件工程师懂 Java 会更容易找工作。

要想在数据世界谋得一份工作,推荐学习的语言是 SQL!

我们看到 Kagglers 在 Python 的使用上做了充分的准备!虽然许多受访者使用 Bash 和 R,但工作描述中并没有频繁提到这些语言。业务分析师并不经常需要 SQL,但是了解它(就像 Kagglers 一样)会让你领先一步。总的来说,Kaggle 的软件工程师和数据工程师可能很难找到工作,因为经常需要 Java,而他们中的许多人不具备这种技能。

学习 Java 有助于你进入软件工程或数据工程

应该学习多少种编程语言?

学习(和使用)多种语言看起来不像是薪资方面的竞争优势。挑选三个,并在使用它们的时候成为真正的专家。限制你的语言,尤其是如果你没有处理数据的经验!

停止学习多种语言! Python,SQL,再多一门你选的语言应该就够了。

谁应该学习和使用云计算平台?

我们看到许多 Kagglers 数据科学家习惯于使用云平台!对于生产机器学习模型来说,这是一个好消息,因为如果数据科学家不在他们的本地环境中做任何事情,那么与模型一起生活会容易得多。

我可以确认这是真的!自从我从数据科学迁移到数据工程,我开始大量使用 AWS 产品。云计算平台有很多针对整个数据管道的托管服务。知道在哪里应用(以及如何使用)它们对于任何数据工程师来说都是至关重要的。

注意!要从事数据和软件工程工作,你需要大量关于云计算平台的知识!

数据库

来自学术界的 Kagglers!再次强调,如果你想为市场做好准备,就应该更频繁地使用关系数据库。

虽然他们在职位描述中不经常出现,但我们看到数据工程师和软件工程师的列表通常需要数据库引擎的知识,如 PostgreSQL、MySQL 和 SQL Server。具有 SQL Server 知识的数据分析师在找工作时可能会从中受益。

最后……外面有工作吗?

是的有!

  • 也许你只是找错了地方,或者不具备某个职位的要求。
  • 尝试将你的技能与正确的职位相匹配。
  • 寻找其他领域的机会,在工作机会和专业人士之间有很多不匹配。
  • 也许你的下一份工作不是数据科学家,而是数据分析师、数据工程师甚至软件开发员。

附录

从 Glassdoor 获取工作列表

我创建了一个简单的脚本来删除 Glassdoor 列表。网络抓取是在 2019 年 12 月 10 日完成的,我能够检索到超过 165,000 个职位列表。这个过程的更多细节可以在这个 GitHub 库上找到。

数据经过处理,作为 Kaggle 数据集公开发布!由于 Glassdoor 网站的限制,数据提取仅限于每个国家每个搜索词的第 30 页。请检查一下,也可以随意处理这些数据!

2019 年 Kaggle 调查的公共数据集

我能做这项研究只是因为 Kaggle 发布了其第三次年度机器学习和数据科学调查的数据。该调查于 2019 年 10 月上线,为期三周,共收到 19717 份回复。结果包括谁在处理数据的原始数据,不同行业的机器学习情况,以及新数据科学家进入该领域的最佳方式。

带有复制学习代码的笔记本

在 Kabble 上可以公开获得复制这项研究的代码和所有图表的笔记本。点击此处查看!

其他考虑

  • 我们假设受访者的回答是诚实和真诚的。
  • 这可能不代表数据专业人员的全部(它只有 Kaggle 用户的答案),但它是一个很好的代理。

在此添加此图片只是为了能够将其定义为特色图片:

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

方差真的是不确定性的度量吗?

原文:https://towardsdatascience.com/is-variance-really-a-measure-of-uncertainty-6ec6da21bb03?source=collection_archive---------18-----------------------

关于概率统计的思考

假设您正在收集评级数据的样本,范围从 1 到 10。假设您的样本由 100 个点组成,考虑两个可能的样本。

  1. 10 个人从 1 到 10 给每个可能的值打分。
  2. 50 个人给 1 分,50 个人给 10 分。

第一个样本对应于所有 10 个可能值的均匀分布。

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

Uniform Distribution

第二个样本对应于极值 1 和 10 处的双峰分布。

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

Bimodal Distribution

哪种分布更「不确定」?

如果我们将方差作为不确定性的度量,那么我们可以计算每个分布的样本方差,对于均匀样本,我们将得到 8.33,对于双峰样本,我们将得到 20.45。然后我们会得出结论,双峰样本更不确定。

但是在某种意义上,双峰样本比均匀样本更容易预测,不确定性更小。只有两个可能的值,而统一样本有十个可能的值,如果您必须准确预测个人给出的评级,您可能会在双峰样本上得到更正确的结果。

事实上,如果我们把熵作为不确定性的一种度量,那么我们就会知道,对于一个有限的支持,使熵(以及不确定性)最大化的分布就是均匀分布。

但是如果预测没有被评估为完全正确或错误呢?例如,如果有人给了 10 分,而你预测的是 9 分,你可能是不正确的,但已经足够接近了,这比你预测的 1 分要好。通过调整评估预测的方式,有可能得出均匀分布比双峰分布更可预测的结论,因此双峰分布将更加不确定。

方差或熵是更好的不确定性度量吗?

这个问题就看用户自己的判断了。没有一个最好的方法来捕捉不确定性的概念。例如,它可能取决于数据的属性(例如,方差不适用于分类数据,但熵适用)。

我的观点是,很容易将数学构建的公式与非数学思想混淆,在越来越多的人试图用数据欺骗你的时候,意识到这些问题是很重要的。

网页抓取合法吗?

原文:https://towardsdatascience.com/is-web-crawling-legal-a758c8fcacde?source=collection_archive---------6-----------------------

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

Photo by Sebastian Pichler on Unsplash

网络爬行,也称为网络抓取、数据抓取或蜘蛛,是一种用于从网站抓取大量数据的计算机程序技术,其中规则格式的数据可以被提取并处理成易于阅读的结构化格式。

Web 爬行通常用于:

网络爬行基本上就是互联网的功能。例如,SEO 需要创建网站地图,并允许 Google 抓取他们的网站,以便在搜索结果中获得更高的排名。许多咨询公司会雇用专门从事网络搜集的公司来丰富他们的数据库,以便为他们的客户提供专业服务。

在数字化时代,很难确定网络抓取的合法性。

为什么网络爬行有负面含义:

网页抓取可用于恶意目的,例如:

  1. 搜集私人或机密信息。
  2. 无视网站的条款和服务,未经所有者允许就刮。
  3. 数据请求的滥用方式会导致 web 服务器在额外的高负载下崩溃。

请注意,在以下情况下,负责任的数据服务提供商将拒绝您的请求:

  1. 数据是私人的,需要用户名和密码
  2. TOS(服务条款)明确禁止网页抓取行为
  3. 这些数据是受版权保护的

有哪些理由可以用来告人?

你的**“刚刮了一个网站”**如果使用不当,可能会造成意想不到的后果。

HiQ vs LinkedIn

你大概听说过 2017 年的 HiQ vs Linkedin 案。HiQ 是一家数据科学公司,向企业人力资源部门提供抓取的数据。Linkedin 随后发出停止信,要求停止 HiQ 抓取行为。HiQ 随后提起诉讼,要求 Linkedin 阻止他们的访问。结果,法院做出了有利于 HiQ 的裁决。这是因为 HiQ 在没有登录的情况下从 Linkedin 上的公共档案中抓取数据。也就是说,抓取互联网上公开分享的数据是完全合法的。

让我们再举一个例子来说明在什么情况下网络抓取是有害的。易贝诉投标人边缘案。如果你是出于自己的目的进行网络爬行,这是合法的,因为它属于合理使用原则。如果你想把搜集来的数据用于其他人,特别是商业目的,事情就复杂了。引自 Wikipedia.org,100 F.Supp.2d 1058。2000 年),是一个领先的案例适用于动产入侵理论的在线活动。2000 年,在线拍卖公司易贝成功利用“侵犯动产”理论获得了一项初步禁令,禁止拍卖数据聚合网站 Bidder’s Edge 使用“爬虫”从易贝网站收集数据。该意见是将“侵犯动产”适用于在线活动的一个主要案例,尽管其分析在最近的判例中受到了批评。

只要你不是以一个破坏性的速度爬行,并且源代码是公开的,你应该没问题。

我建议你检查一下你计划抓取的网站,看看是否有任何与抓取他们的知识产权相关的服务条款。如果上面写着“禁止刮擦或爬行”,你应该尊重它。

建议:

  1. 小心地刮擦,在开始刮擦之前检查“Robots.txt”
  2. 保守一点。过分地要求数据会加重互联网服务器的负担。合乎道德的方式是温和。没人想让服务器崩溃。
  3. 明智地使用数据。不要复制数据。您可以从收集的数据中获得洞察力,并帮助您的业务增长。
  4. 在你开始抓取之前,先联系网站的所有者。
  5. 不要随意把刮来的数据传给任何人。如果它是有价值的数据,请确保其安全。

你的算法够自信吗?

原文:https://towardsdatascience.com/is-your-algorithm-confident-enough-1b20dfe2db08?source=collection_archive---------10-----------------------

如何度量神经网络中的不确定性?

当机器学习技术被用于“关键任务”应用时,可接受的误差幅度变得非常低。

想象一下,你的模型正在驾驶一辆汽车,协助一名医生,甚至只是直接与一个(可能很容易被激怒的)终端用户进行交互。在这些情况下,您需要确保在对模型做出的预测采取行动之前,您对这些预测有信心。

随着模糊系统日益成为我们模糊生活的一部分,测量预测不确定性变得日益重要。

这里有一个好消息:有几种测量神经网络不确定性的技术,其中一些非常容易实现!首先,让我们感受一下我们将要测量的东西。

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

Photo credit: Juan Rumimpunu.

给不确定性加上一个数字。

当你制作世界的模型时,你的模型不能总是提供准确的答案。

这部分是由于模型是一个非常复杂的世界的简化。因为有些信息是未知的,所以从模型中得到的预测会有一定程度的不确定性。

我们世界的某些部分(以及我们衡量它的方式)简直是混乱的。有些事情是随机发生的,这种随机性也是模型预测不确定性的一个来源。

预测不确定性可分为 3 类:

1。模型不确定性。

模型的不确定性来自于对问题的“无知”。也就是说,模型的不确定性量化了那些可以被模型正确捕捉而不能捕捉的事物。

来自 Taboola 的 Yoel 和 Inbar 提供了一个有趣的例子:

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

You want to build a model that gets a picture of an animal, and predicts if that animal will try to eat you. You trained the model on pictures of lions and giraffes. Now you show it a zombie. Since the model wasn’t trained on pictures of zombies, the uncertainty will be high. If trained on enough pictures of zombies, this uncertainty will decrease.

有时也被称为结构不确定性 。测量模型的不确定性是统计学的一个领域,被认为是特别具有挑战性的。其中一个原因是,随着模型变得越来越复杂,像贝叶斯模型平均这样的原则性技术变得非常昂贵。

2。模型设定错误。

如果您的模型在训练和验证期间产生了良好的预测,但在评估(或生产)期间却没有,那么它可能是错误指定的。

模型设定错误不确定性捕获模型根据与训练数据模式完全不同的新数据进行预测的情况。

3。固有噪声。

这是由数据集中存在的噪声产生的不确定性。这可能是由于不完善的测量技术或被测物体固有的随机性。

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

Imagine your dataset contains 2 images of cards facing down. You’re feeling optimistic and you want to build a model to predict the suit and value of each card. The first card is labeled as ace of spades and the other is labeled as 8 of hearts. Here, the exact same features (an image of a card facing down) can be linked to different predictions (either ace of spades or 8 of hearts). Therefore, this dataset is subject to lots of inherent noise.

固有噪声有时也被称为 任意的统计不确定性 。固有噪声量与给定分类器的最低可实现误差率贝叶斯误差率相关联。可以想象,一个模型所能达到的最低可能错误率与数据本身的噪声所产生的错误量紧密相关。

这些概念严重依赖贝叶斯统计。我以简单的方式概述了这些想法,但这只是触及了这些深层主题的表面。

要了解贝叶斯神经网络中不确定性度量的更多信息,我推荐看一看 Felix Laumann 的这篇文章。为了深入解释数据科学背景下的贝叶斯统计, Ankit Rathi 已经写了一系列关于这个主题的伟大文章。

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

Photo credit: Avi Richards

实现不确定性。

此时,你可能在想:“听起来不错,但是我如何在我的模型中实现不确定性呢?”

贝叶斯神经网络默认情况下集成了不确定性,此外通常对过拟合和处理较小的数据集更加鲁棒。然而,用于构建贝叶斯神经网络的工具链仍在出现,并且无论是在训练期间还是在进行预测时,模型的计算成本都更高。

此外,将您的工作迁移到概率模型(如贝叶斯神经网络)将会很烦人。

从长远来看,概率深度学习将有可能成为默认。不过现在,将概率观点整合到我们现有工作中的实用技术是一个良好的开端!

蒙特卡洛辍学。

几年前,剑桥大学的 Yarin 和邹斌发现了一种方法,可以在不改变神经网络结构或优化技术的情况下近似模型的不确定性。

下面是简短的版本:通过在测试时在每个权重层之前使用 dropout,并多次迭代运行您的预测,您可以近似贝叶斯不确定性。他们称这个过程为蒙特卡洛辍学**😗*

  1. 你给你的模型输入一个信息。
  2. 您对单个输入进行多次迭代预测,每次都随机禁用神经网络的一小部分。
  3. **你取平均产值。**这是你的预测。最后,您测量迭代之间的方差。这就是模型的不确定性。

****直觉上,我是这样想的:你的预测随着模型微小的结构变化而波动的越多,那个预测就越不确定。

实现蒙特卡洛辍学真的很容易。在这里,我从一个简单的密集网络开始,这个网络是用 Keras 构建的 MNIST 问题。默认情况下,仅在训练期间启用辍学层。要在测试时启用漏失层,请为每个层设置training=True

**img_dim = 28x_in = Input(shape=(img_dim, img_dim,))
x = Dropout(0.2)(x_in, **training=True**)
x = Dense(500, activation="relu")(x)
x = Dropout(0.2)(x, **training=True**)
x = Dense(250, activation="relu")(x)
x = Dropout(0.2)(x, **training=True**)
x_out = Dense(10, activation="softmax")(x)model = Model(inputs=x_in, outputs=x_out)
model.compile(loss="categorical_crossentropy", optimizer="rmsprop")**

接下来,我们需要一个定制的预测函数,它可以迭代预测并返回这些迭代的均值和方差。在本例中,我们测量的是标准偏差而不是方差,因为它与平均值用相同的单位表示。

**def predict_with_uncertainty(model, 
                             X, 
                             batch_size=None, 
                             num_iterations=100): last_layer = model.layers[-1] results = np.zeros((num_iterations,
                       X.shape[0],
                       last_layer.output_shape[1]), 
                       dtype="float") for i in range(num_iterations):
        results[i] = model.predict(X, batch_size=batch_size)

    **predictions = results.mean(axis=0)**
    **uncertainty = results.std(axis=0)**

    return predictions, uncertainty**

现在,您可以用近似的不确定性进行预测了:

**predictions, uncertainty = predict_with_uncertainty(model,your_data)**

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

Photo credit: Tim Gouw

问题和批判。

正如我们所见,使用蒙特卡洛辍学真的很容易。也许连 都太容易deep mind 的 Ian Osband 对该技术提出了批评,他指出一个简单模型的预测不确定性并没有随着数据的增加而降低。这就提出了一个问题,即它是否是贝叶斯不确定性的不准确近似,或者是否有任何潜在的假设需要变得更清楚。

关于这个问题,Sebastian schner 写了一篇很棒的博客文章,总结了他的评论。

在我工作的地方 神田 ,我们对蒙特卡洛辍学的有效性有着复杂的体验。

像我之前的例子一样,对于一个在 MNIST 上训练的简单全连接模型,不确定性近似表现出预期的行为:当呈现噪声而不是手写数字时,近似的不确定性更高。我们发现 50-100 次蒙特卡洛淘汰迭代产生了令人满意的结果。

后来,我们有一个场景,我们需要在智能手机上本地运行图像识别任务,作为 AR 应用程序的一部分。我们使用迁移学习,在 NASNet 移动架构之上构建一个分类器。

在智能手机上运行 100 次 NASNet 迭代并不是一个好主意。

即使采用高度并行化,我们实际上也只能在设备上运行大约 20 次迭代,以便及时提供预测。

其次,不确定性估计不准确。当喂给一张随机噪音的图片时,不确定性出奇的低。值得注意的是,我们只在 NASNet 之上的分类器的密集连接部分实现了 dropout。如果你愿意分享直觉,告诉我哪里出了问题,我很有兴趣阅读你的回复!

结论。

首先,我们看了一下为什么量化机器学习模型中的不确定性很重要。然后,我向你介绍了关于预测不确定性的 3 种不同的思考方式:模型不确定性、模型错误设定和固有噪声。

Monte Carlo dropout 是一种易于实现的近似贝叶斯不确定性的技术,但是对于近似是否真的准确还存在一些争议。实际上,我发现 Monte Carlo dropout 对简单模型有效,但对复杂模型的方法有一些问题,在准确性和性能方面。

在机器学习中整合贝叶斯概率只会在未来变得更加重要**,我期待看到更多的概率技术成为工具链的一部分。**

你的公司是不是太笨了,不能数据驱动?

原文:https://towardsdatascience.com/is-your-company-too-dumb-to-be-data-driven-696932d597c3?source=collection_archive---------7-----------------------

利用信息是一种熟练的行为,而不是数据产品的输出。

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

Photo by Campaign Creators on Unsplash

对于数据专家来说,这是最好的时代,也是最坏的时代。人们对将智能信息、统计数据和科学应用于人类各个方面的兴趣空前高涨——从复杂的商业决策和尖端产品到我们的日常任务管理,数据集成似乎无处不在。在尤瓦尔·赫拉利的《T4》中,他提出了一个令人信服的论点,即“数据主义”甚至可能是下一种形式的宗教——当你看到我们社会对这种东西的痴迷是如何演变的,他可能会有所发现。似乎在更大的商业世界的眼中,任何和所有事物的任何和每一个数据应用本身就是努力这样做的理由。在 FOMO 推动的热潮中,各公司正在向数据相关技术和员工投入资源,速度比你说机器学习还快。但是,就像购买昂贵的健身房会员资格不会给你道恩·强森的身体一样,仅仅在技术堆栈上的大量投资不会创造数据驱动的决策文化。对于要利用以数据为中心的决策支持所能提供的机会的组织来说,变革需要从业务用户开始。聪明的组织会围绕这些变化而发展,而不那么聪明的组织会遇到决策过程变化的考验,做出不明智的选择,产生令人失望的结果。如果数据计划的成功执行需要以下所有条件:

  1. 重要资源
  2. 文化成熟度
  3. 组织智能

人们不禁会问这样一个问题:“我的公司是不是太笨了,无法实现数据驱动?

大多数数据计划出错的地方

要理解在数据驱动的游戏中赢家和输家的区别,首先理解为什么如此多的数据计划出错是有帮助的。在构建组织数据战略时,大多数企业通常会创建一个类似于以下过程的路线图:

  1. 将不同来源的数据收集到数据仓库中
  2. 将数据导入商业智能工具
  3. 利用洞察力

对于技术实现团队来说,第一步似乎很容易。他们将选择一个目标数据仓库或数据湖,以及提取-加载(EL)数据的方法,甚至可能进行一些数据分析和建模。第二步(加载 BI 工具)有点不透明。业务用户将对仪表板、模型和图表有广泛的需求;有些人希望得到所有可能的数据点,而有些人则希望精确复制他们正在生成的手动报告。该项目将继续推进,一路上会通过一些里程碑式的目标,如“脸书数据完成了”。最后项目会达到 MVP 发布!该组织将屏息以待,等待这些见解开始滚滚而来。

然后等待。

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

Those insights will be here any day now… (image credit RebeccaSaid https://creativecommons.org/licenses/by-sa/4.0)

但不知何故,尽管对数据技术进行了大量投资,项目取得了所谓的“成功”,但一切照常将会继续。仪表板将不再使用,团队将继续依赖共享的电子表格和脱节的第三方工具集,高管将继续在黑暗中做出决策。这是因为数据驱动与机器学习或人工智能、数据仓库或 BI 仪表板无关。数据驱动是指业务用户 学会问好问题这是任何商业智能工具或数据产品都无法提供的。

在上面的场景中,技术组件(数据仓库、ETL 过程和 BI 可视化)可能被正确地实现了。但是能够分析业务趋势并从度量中得出准确的结论并不是标准软件工程师工具包的一部分(也不应该需要);因此,技术实现团队通常会构建业务用户所要求的东西,同时假设“涉众最了解他们需要什么”一个普遍持有的错误观点是,向业务用户提供数据和可视化本身会导致数据驱动的决策。实施数据计划时,重要的是要理解 成为主题专家并不意味着一个人将知道如何利用关于该主题的数据 。正如雕塑家可能不知道如何操作 3D 打印机一样,经验丰富的产品经理可能不知道如何应用商业智能仪表板来推动功能改进。第一次访问度量标准和组织知识的业务用户可能不知道他们应该问什么问题,并且他们不太可能知道根据他们收到的答案应该采取什么行动。理解变化的长期趋势和统计意义需要特定的技能,而这种技能通常是缺乏的。

与此同时,商业用户将开始表现出他们的沮丧。他们得到承诺,洞察力将无情地削减开销并释放隐藏的机会财富,但所有的商业智能工具似乎都提供了许多复杂的图表和图形,并没有真正告诉他们任何东西。他们应该如何处理图表上的一堆弯弯曲曲的线条,或者烛台图表的方框图和线条图?商业启示在哪里——屏幕上红色闪烁的警告框指示他们增加关键词支出,或关闭表现不佳的仓库,或改变内容标题的时态以增加读者数量?难道机器学习和人工智能不应该找到所有这些隐藏的模式,并巧妙地将它们呈现出来以供采取行动吗?不熟悉数据相关技术的业务用户普遍认为,数据产品将通过使用“神奇的”算法输出可操作的方向;在数据产品销售人员和媒体炒作之间,很容易理解我们是如何对数据工具的功能产生如此严重的误解的。事实是 数据工具不提供商业答案,它们提供信息。将这些信息转化为答案需要用户的知识和技能。 说白了,分析工具可以自主摄取原始数据并输出可操作的见解的想法是科幻小说,更适合一集感兴趣的人而不是指导委员会会议。**

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

Quick! which one tells you how to run your business, and which one monitors hyperspace? (image credits Growthlakes https://creativecommons.org/licenses/by-sa/4.0 and Kreg Steppe https://www.flickr.com/photos/spyndle/2820733255)

这些假设一起创造了一个沮丧和失败的痛苦循环。技术实现者无法理解为什么业务用户似乎从来没有从他们交付的工作中获得价值,业务用户也无法理解为什么技术实现者一直交付不可操作的工作。尽管如此,从昂贵的数据计划中一无所获实际上并不是最坏的结果;更具破坏性的是,当业务用户获得并应用 错误 见解时。

错误的见解:M.Python 控股有限责任公司。

*米(meter 的缩写))Python Holdings LLC 是我们假想的房地产开发公司,在这个案例研究中,读者您扮演商业智能实现工程师的角色。假设首席人事官向员工仪表板提交了一张变更单,将“员工体重超过其各自工作地点的平均离职率”添加到报告选项卡中。在你质疑改变是否可行之前(“我们有员工体重数据吗?”)您根据*为什么因素标记票据;这个请求可能如何传递价值?你向首席采购官寻求澄清,对话如下:

您: “您好 Idle 先生(CPO)您能告诉我您将根据此请求的输出做出什么决定吗?理解这些决定将有助于我确保我做出的改变能够满足您的需求

CPO: “没问题!我们将利用这些数据来追捕任何可能为我们工作的女巫。”

你: “乌…请详细说明。”

首席财务官: “嗯,克里斯先生(首席财务官)上周没有出席董事会,但是我们在他的办公室里发现了一只蝾螈。所以我们很自然地认为是女巫把他变成了蝾螈。我们投票决定立即找到并清除公司中的所有女巫,并以数据为依据。所以我们认为,女巫会燃烧,木头也会燃烧,对吗?当然木头会浮起来,鸭子也会浮起来。所以,如果数据显示我们有像鸭子一样重的员工,他们就是女巫!”
你: (掌纹)

错误的见解,你自己的角色统计公式,以及受确认偏差严重影响的度量标准,都对组织的决策过程具有极大的破坏性。此外,当由此导致的业务崩溃达到顶点时,这些被污染的可交付成果通常将数据和实现团队作为替罪羊。

仪表和杠杆

数据驱动的决策可以归结为几个因素:你能测量什么(量规),你能做什么(杠杆)?问聪明问题的第一步来自于对杠杆是什么的详细评估;这些事情包括广告的支出渠道,或者 SAAS 公司的技术投资决策,或者内容创作者的措辞选择。一旦业务用户知道他们有什么杠杆、*,下一步就是确定他们需要什么量规。这就是事情变得棘手的地方。量表主要有两种类型:滞后型(或描述型)和超前型(或说明型)。滞后指标通常是你关心的事情(如月收入),但只能事后衡量。领先指标与滞后指标具有预测性关联——网站访问量、单位销售额或页面流量行为模式可能是月度销售滞后指标的领先指标。滞后措施是记分牌,告诉你你的决策是否成功。 但是滞后的度量对于数据驱动的决策制定并不是天生有用的;这就是你需要领先指标的原因。 识别这些领先指标是提出好问题的核心。对操纵每个杠杆将如何影响领先指标有很强把握的业务用户将能够利用它们并转向滞后指标目标,这就是数据驱动的决策制定。*

天气与气候

尼尔·德格拉斯·泰森解释天气和气候差异的视频是纯金的。

science is so much better with dogs

**尼尔非常雄辩地展示了一个统计显著性的例子。这就是说,在计算气候趋势时,一月的温暖一周或八月的寒流(在费城)并不意味着什么。当业务用户确定他们需要支持他们拥有的杠杆的量规时,他们选择的指标实际上是数学和科学的指标是至关重要的。例如,一个零售店的采购员使用“今天的温度”这一先行指标来推动库存决策,并且只订购来年的冬装,这显然是愚蠢的。但是如果买家使用去年的平均温度呢?还是去年最高最低气温日期来划分季节?还是过去十年每天的平均气温变化?加入一点数学可以给创造性的(但不健全的)数据利用方法一种可信度的感觉;一个坏的量表通常会比没有量表给你带来更多的麻烦。

确定组织准备情况

确定一家公司对数据驱动的准备程度实际上是确定整个组织中数据应用技能的水平。这种确定可以在数据仓库/商业智能技术上花费一美元之前完成,并将围绕数据计划将产生的潜在投资回报设定现实的预期。

滞后指标很重要(记住这些是成功的最终衡量标准),但在用数据积极推动决策的背景下,它们用处不大。为了影响决策,重点需要放在引导措施上。有了这个目标,业务用户的任务就是为他们的垂直行业提供一个简要的数据战略纲要。本大纲每个数据集包含 4 个问题:

  • 他们用这个数据集影响了什么结果?
  • 他们希望数据集到达时是什么样子?
  • 他们将如何从这个数据集中提取答案?
  • 他们将通过什么手段对结果采取行动?

这可以是一个简单的电子表格,带有估计的列标题和几行清晰的文档。

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

A basic example of a business user action plan

在上面的回答中,我使用的统计数据比我对大多数商业用户的预期要多;如果计划为“计算每个渠道的投资回报率,并找出它开始下降的地方”,这将是一个有价值的见解,即该团队可能需要分析师/数据科学家/需求规划员的帮助来确定一个正确的模型。

不熟悉数据驱动的决策制定的业务用户可能会说,如果不首先在商业智能工具中访问数据,他们不可能知道预期的数据或数据将如何使用。试着在不同的语境下想象同样的逻辑;假设一位工厂经理要求为装配线购买一台价值 10 万美元的新机器。如果经理不能描述机器实际上做什么,或者不能清楚地说明机器将如何被用来盈利,但坚持认为,一旦安装,机器将被证明是一项伟大的投资…这听起来是否可笑?大多数数据计划的成本远远超过 10 万美元的神秘机器,但这种情况每天都在发生。

智能组织如何发展到数据驱动

有了这些潜在的标准、杠杆和结果的集合,就有可能确定一个组织在哪些方面做好了将数据纳入决策的最佳(和最差)准备。聪明的组织将使用这些信息来决定哪些策略最适合他们的当前状态(如果你愿意,可以说是数据驱动的,关于他们对数据驱动的追求)。这些聪明的策略通常包括:

  • 在组织内建立明确的期望。成为数据驱动型企业的第一步是明确数据在企业中的意义。这就必须明确地呼唤出组织决策者将被赋予获取信息的巨大权力,并且与这种权力相伴随的是巨大的责任;决策者将负责学习使用经过科学验证的方法智能地请求、解释和处理业务信息的技能,并在整个组织内重新设定智能决策的标准。这种变化需要清晰而全面地传达,因为它重新定义了领导者和决策者的行为预期。
  • ****利用现有的数据专业知识。调查一个组织的当前状态可以识别出已经非常擅长从信息中提取洞察力的团队和团队成员。这些“锚点”团队和团队成员可以帮助建立一个其他团队必须应对的潮流线,并且通常可以跨职能工作来帮助他们这样做。
  • ****集中数据主动权。内部竞争可能是任何数据驱动战略的主要障碍。一个计划要想成功,它必须得到自上而下的认可,成为组织内“唯一的真理来源”。这消除了业务孤岛,允许洞察在垂直行业之间传播,并确保滞后和超前度量在整个组织中一致。
  • ****将组织的有限资源集中在数据将产生最大影响的地方。如果大部分业务需要帮助识别和建模主要措施,而组织中几乎没有数据科学家或分析师,一个可行的解决方案是从回报最大的团队开始,并保持对这些领域的高度关注。这意味着不要试图在整个组织中引入商业智能工具,而是在资源可用时迭代下一个最有价值的应用程序。数据能力是累积的,随着业务用户掌握数据知识,他们将变得更加自给自足。
  • ****鼓励商业用户学习如何解释和计算简单的统计数据。对于一个真正由数据驱动的组织,每个团队成员都需要能够消费和正确应用数据产品。业务用户必须超越反动的“指针移动”仪表板,并学会解释丰富的统计指标。
  • 考虑放弃或至少推迟成为数据驱动的选项。**与普遍看法相反,并不是所有的组织都需要立即成为数据驱动型组织才能获得成功。对一些人来说,将资源投入数据计划可能是浪费时间和精力,这些资源可以更好地分配到其他地方。聪明的组织不排除数据驱动的决策可能根本就不是数据驱动的。

不太聪明的组织是如何失败的

  • ****喂养流行语火焰。在定义组织的数据计划目标时,自上而下的消息传递通常类似于商业网站底部的 clickbait。陷入对神奇算法和全能机器学习技术的流行文化痴迷不仅仅是噪音;这种空话使本组织陷入失败和失望之中。聪明的组织为数据计划将会(和不会)实现什么设定现实的期望,而愚蠢的组织则传播科幻小说。
  • 关注滞后指标。使用 KPI 仪表盘为决策提供信息就像使用足球比赛的最终比分来决定你应该叫牌的比赛。愚蠢的组织将整个月都在这些最终数字上打圈,同时继续猜测哪些行动可能会真正影响它们。
  • 选择数量胜于质量。在启动数据驱动计划时,一个常见的(也是非常不成功的)策略是通过向业务用户群体提供尽可能多的低质量、接近原始状态的数据集来取悦所有人。这个想法是,任何数据都比没有数据好,未来的改进可以集中在准确性和可访问性上。这肯定会在决策过程中散布错误的结论和相互矛盾的事实,同时破坏利益相关者对您的数据生态系统的信心。
  • 把遗产和资历放在科学之前。办公室政治对数据计划推出的影响通常在聪明和愚蠢的组织之间形成鲜明对比。随着该公司开始采用单一数据源,并让决策者负责将分析应用到他们的流程中,不可避免地会有抵制。一些团队抵制随着组织的变化,因为他们认为这是不必要的努力;其他人可能出于傲慢而悄悄拒绝,认为他们从应用见解或统计数据中没有任何收获。还有一些团队拒绝集中式数据计划,这样他们可以继续控制他们自己的度量标准(当然,在这个过程中对数据进行友好的倾斜)。愚蠢的组织制造一个又一个的例外,让决策演变成一场商业逻辑正确与否的战争;真相的集中来源,还是多年来一直被信任的“伟大的电子表格”?如果一个组织要成为数据驱动型组织,它必须表明自己相信哪些数据,并毫无例外地致力于这一决策。
    一个特别具有挑战性的情况是,拒绝合作的人碰巧是高层领导成员。没有什么会削弱组织应用领先指标的势头,这些指标为可操作的决策提供了信息,如首席执行官坚持使用统计上不准确的指标,专注于滞后指标,或从数据驱动的计划之外的来源拖出不可信的指标。一个组织很少能比驱动它的领导层表现得更聪明,在这种情况下,愚蠢的结果是难以避免的。

最后

像许多业务计划一样,转变组织以利用数据驱动的决策制定实际上是转变员工的行为和技能。理解这一点并相应投资的公司会发现,数据创造了一个新的商业机会的世界;专注于技术、流行语和科幻小说的公司会发现数据是另一项失败的投资。

您的公司真的是数据驱动的吗?

原文:https://towardsdatascience.com/is-your-company-truly-data-driven-2cf5feaa3cfb?source=collection_archive---------27-----------------------

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

Photo by rawpixel.com from Pexels

还是只是装的?

如今,每个公司都声称自己是数据驱动的,但这实际上意味着什么呢?

这是一个需要回答的关键问题,对于选择投资地点的投资者和寻找合适公司的数据科学家来说都是如此。从投资者的角度来看,我想投资那些知道衡量什么、如何衡量、并真正利用数据推动合理决策的公司。作为一名数据科学家,我想为一家拥有有趣数据、在机器学习模型上投入时间和资源、拥有听取数据驱动建议的管理团队的公司工作。

在这篇文章中,我试图列出一个清单来判断一个公司是真的由数据驱动还是只是假装如此。

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

Photo by rawpixel.com from Pexels

清单

  1. 拥有数据 —这听起来很明显,但是一个数据驱动的公司首先需要拥有数据。这些数据需要清理、组织和访问。
  2. 有数据人 —这个听起来也很明显。它不需要是一个配备多名博士的全职研究型数据科学团队,但公司必须有一个知道如何收集、处理和分析数据的既定团队。数据团队应该与产品、营销和工程部门紧密合作,重点应该放在构建东西上,而不是发布白皮书。
  3. 领导者有影响力和关系——领导团队的人不一定是博士,甚至不必过于量化。对于数据团队的最高领导者来说,更重要的是要有政治影响力(在公司内部)、出色的商业(和常识)意识,以及识别好想法并将其付诸实施的能力。做了一些很酷的东西,然后看着它被浪费掉,这是非常令人沮丧的,因为你的老板缺乏将你的想法产品化的意志力或内部关系。
  4. 营销和产品领导者相信数据驱动的决策制定 —数据科学家经常做项目来支持他们公司的营销或产品(或产品营销)团队。如果被认为是你的分析的消费者的团队没有发现数据科学的价值,那么祝你在对抗这一潮流中好运。
  5. 有一个设计良好的应用程序——假设你的公司是面向消费者的,而不是严格意义上的 B2B(企业对企业),拥有一个应用程序是非常关键的(如今一个像样的网站是桌面赌注)。人们随时都在打电话,你的公司需要能够通过移动应用程序与这些人联系。你的应用不需要像脸书或 Instagram 那样浪费时间,它只需要成为你的公司与其现有和潜在客户之间的额外接触点。这为您提供了更多的客户交互数据来收集和分析。
  6. 不聘请管理顾问——你喜欢放火烧钱吗?如果是这样,雇佣一群顾问,让他们告诉你你所在行业的“最佳实践”是什么(价格不菲)。但是,请等一下,如果他们告诉你所有击败你的竞争对手的秘密最佳实践,他们会对同样为咨询服务付费的竞争对手说些什么。认为你的公司从它的顾问那里得到任何突破性的建议或专有信息是天真的。相反,依赖顾问是一种迹象,表明你的公司缺乏答案和在内部产生答案的能力。我并不是说顾问永远不会帮助公司——他们可以帮助一家陷入困境的公司重新站起来。但一家强大的公司不应该需要顾问来告诉它需要去哪里。
  7. 倾向于建造而不是购买——有时当价格合适时(比如在经济衰退中),购买是有意义的。但是,总是购买工具、人才甚至其他公司的倾向表明,你的公司可能正在努力并不顾一切地打出全垒打来重振旗鼓。同样有证据表明,与顾问类似,上层管理人员更信任外部专家,而不是内部产生的建议。
  8. 已经将基于假设的关键决策过程制度化——我把这个留到最后,因为我认为它是最重要的。你的公司应该不断尝试改进其产品和流程。它不应该通过盲目的直觉来做到这一点,而是通过形成假设,然后设计实验(尽可能无偏见地)来严格测试它们。最后,应该遵循从这些实验结果中得出的建议。操纵实验来证实管理层的偏见或推翻与预期不符的结果是巨大的危险信号——远离那些不惜一切代价这样做的公司。

关于第 8 条,我想说的是,在建立一家公司的过程中,直觉肯定是有空间的。伟大的公司和他们的产品和服务通常来源于一个伟大的想法,这个想法来源于某人的直觉。但是,没有数据支持的直觉只能让你在产品化和执行这个想法时走得更远——超过某个点,一个接一个地做出正确的决定变得更加重要。如果你的公司有一个基于假设的决策过程,这就容易多了(而且不太依赖运气)。

事实上,我认为基于假设的决策是将直觉正式引入公司决策过程的一种方式。它不像假说那样凭空神奇地出现。相反,它们是通过人们的直觉形成的(每个假设都是对我们周围世界如何运作的直觉猜测)。但是在执行这些猜测之前,首先严格测试它们是至关重要的。

造假的公司

因此,为了把所有这些联系起来,让我们回顾一下我们想要避免的公司可能是什么样子的。

这样的公司可能会有一些数据科学家。甚至可能会有一两个博士。但是他们大部分时间都脱离了公司的其他职能团队。大多数情况下,他们发布白皮书来擦亮公司的“数据凭证”。

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

To make a decision, your CEO rubs this card for luck then flips a coin… Facepalm

该公司的营销职能并不真正理解对“复杂”模型的需求。相反,他们只是要求初级数据科学家制作一堆数据透视表,以证实他们已经形成的偏见。当需要做出重大决定时,首席执行官会出去走走,神奇地做出决定,然后付钱给贝恩或波士顿咨询公司的顾问,让他们起草支持文件和数据。

是的,这有点夸张,但你会明白的。数据科学真的很酷。但是像任何其他职业一样,只有当你有机会创造重要的东西,推动决策制定,并最终为公司的使命和成功做出有意义的贡献时,你才会觉得有成就感。

祝你好运,找到配得上你的公司。干杯!

更多数据科学相关帖子由我:

数据科学家是做什么的?

数据科学家面临自动化的风险吗

数据科学家挣多少钱?

数据科学家挣多少钱第二部

软件工程师挣多少钱?

技能提升的更好方法

你的数据准备好 AI 了吗?

原文:https://towardsdatascience.com/is-your-data-ready-for-ai-dfa3e318fc09?source=collection_archive---------41-----------------------

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

公司正迫不及待地推出任何有望实现人工智能和机器学习的解决方案。但是仓促的采用留下了一个重要的问题没有得到解答。

你的数据准备好 AI 了吗?

对于大多数公司来说,答案是否定的。

每个领域的行业领导者都在竞相采用复杂的系统,这些系统承诺将人工智能和人工智能引入他们的组织。高管们经常被一种技术的概念所说服,这种技术将使他们能够看到人类看不到的东西,对业务提出建议或改变,从而释放新的机会并提高效率。

虽然机会肯定存在,在某些情况下技术也是如此,但与大多数组织的数据环境的运营就绪性相比, AI 和 ML 呈现的可能性之间存在重大脱节。

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

“AI 就像高中的性。每个人都说他们在做这件事,但很少有人真的在做,而那些在做的人都做错了。”

在我们与不同领域(金融、保险、房地产等)的许多市场领先公司的决策者的讨论中,我们看到的是对数据仓库的非常扎实的理解,以及对可以开始解决其业务需求的丰富应用层的非常强烈的渴望。

然而,事实上,数据仓库和应用层代表了一个过程的开始和结束,在这个过程的中间通常缺少的是一个非常复杂的堆栈,它将一端的原始数据转换为另一端的可用信息。问题是,这个“中间”层不仅是一个难以解决的问题,而且对于许多制定 it 战略、预算和时间表的决策者来说,它也是一个主要的未知数。

“如果沃森能赢得 Jeopardy,它一定有认知能力来涉猎我的数据并开发洞察力,对吗?”

通常,组织有一个数据仓库策略或一个完全部署的数据仓库解决方案,其重点是将数据放在一个地方。这一战略通常会附带一份已经购买的应用程序清单或使用新技术(人工智能、ML、自动化、分析、可视化)的解决方案路线图。从高层次来看,问题似乎已经解决了:

把所有的数据收集在一起——检查。

购买将原始数据转化为洞察力的应用程序—勾选。

这里的概念是,一旦我们把所有的数据放在一个公共的地方,我们就可以把它插入任何我们想要的东西。简单。问题是,从数据仓库出来的数据缺乏一个通用的标准,位于数据之上的应用程序无法完全实现,因为…

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

…在数据(有湖或无湖)和尚未定义或实施的企业应用程序之间有一个巨大的细化层。为了解决这个问题,需要引入一个系统,该系统能够将数据从其母语转换为任何应用程序都可以学习理解的集中标准。不仅如此,它还必须能够持续不断地做到这一点,并且能够扩展到无限数量的新的和现有的数据源。

即使是最好的软件也需要好的数据。

归根结底,任何应用程序、自动化或人工智能/人工智能技术都需要由精细化、标准化的数据来驱动,才能发挥其最大能力。如果没有标准数据,您希望实施的、有望彻底改变您的业务的改变游戏规则的技术将局限于 it 可以访问的标准数据的最低公分母。通常,这意味着信息量极其有限,即使这些信息现在都来自同一个地方。
数据需要被提炼为燃料,并以所需的数量交付给 it 负责驱动的应用程序。这样做的系统,或者更好的是,检查所有必需框的数据提炼过程,看起来像这样:

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

或者,对于那些对我们用我们的平台 【纳马拉 为我们的一些客户做的事情感兴趣的人,看起来是这样的:

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

许多真正成功的人工智能和人工智能技术的展示都是在极其干净和标准化的数据库的基础上展开的。但是在大多数组织中,数据仍然是完全隔离的。将数据集中到一个“湖”中或企业云上,可以将数据放在一个公共位置,但数据本身通常仍然缺乏标准化。这一层数据标准化仍然是许多组织尚未克服的巨大障碍。随着有远见的组织开始重视和利用新的外部数据源,问题的复杂性只会进一步增加。

各种各样的数据意味着各种各样的问题。

我们试图解决的问题是数据的多样性。适当的仓储有助于我们解决数量和速度问题,但一个完全开放的企业应用程序的世界要求我们回答这样一个问题:我们如何将来自多个地方的类似数据转换为一致的通用标准。

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

在许多组织中,答案是,“那是我们数据科学家的工作”。但如果我们真的去想,应该是吗?数据科学家是高技能、高收入的个人,他们的时间和精力应该集中在帮助企业以数据驱动的方式发展上。如果是这样的话,那么为什么他们会花这么多时间来查找、清理、标准化和监控数据呢?

简短的回答是,鉴于大多数组织没有合适的数据处理管道来生成理想的数据,以使他们的应用程序和科学家尽可能高效地工作,这是必然的。

这将大多数数据科学家变成了数据看门人,这也是大多数企业应用程序永远不会完全实现企业部署的原因。

“问题不在于缺乏方向或能力。缺少精确的数据。”

数据湖或云的想法是好的,也是必要的概念。数据需要被汇集到不同的位置,以便多个函数可以出于多种原因访问它。许多好事成为可能,因为人们开始意识到知道他们的数据在哪里以及它实际上是由什么组成的好处。

现在,当我们展望商业智能的下一个阶段,一个带来自动化、人工智能和机器学习的阶段时,我们必须少考虑湖中的数据,而更多地考虑数据需要如何以标准的方式在整个组织中流动。我们已经不再需要一个可以容纳数据的容器,而是需要一个血管系统,让数据以所需的形状和形式流向所需的地方。

这似乎是一个巨大的飞跃,但实际上,这是完全可以实现的。事实上,所需的许多部分都显示在上面的图形中。就您自己而言,这不是一个快速或简单的构建,但如果您真正从企业角度思考,这是一个必须解决的问题。

这里的要点是不要停止寻找可以帮助释放巨大潜力的新技术。要记住的是,不管新的解决方案有多么闪亮和惊人,它们都需要火箭燃料来帮助它们升空。当我们谈论改变游戏规则的企业应用程序时,火箭燃料是标准化数据。改进 it 的流程需要与采用新的 商业智能工具和应用并行实施。

阅读更多 关于我们如何提供干净的数据库来推动人工智能技术的发展。

Namara 是政府、银行和一些世界上最大的公司所依赖的数据管理平台。我们将 Namara 设计成最安全、最协作的方式来访问、管理和集成推动您业务发展的数据。 今天报名免费

在应用程序上联系我们,或 在这里联系我们 获得任何问题的答案。

【https://blog.thinkdataworks.com】最初发表于

你的 Django 应用慢吗?去问数据科学家,而不是工程师

原文:https://towardsdatascience.com/is-your-django-app-slow-ask-a-data-scientist-not-an-engineer-3c120384ffd9?source=collection_archive---------16-----------------------

我的职业是工程师。在调查一个缓慢的 Django 应用程序时,我依靠直觉。这些年来,我已经解决了很多性能问题,我的大脑采取的捷径经常奏效。然而,直觉可能会失败。它在复杂的 Django 应用程序中可能会失败,这些应用程序有许多层(例如:SQL 数据库、NoSQL 数据库、ElasticSearch 等)和许多视图。噪音太大了。

**如果我们不依赖工程师的直觉,而是像数据科学家一样进行性能调查,会怎么样?**在这篇文章中,我将以数据科学家的身份,而不是工程师的身份,讲述一个性能问题。我将分享来自一个真实性能问题的时间序列数据和我用来解决这个问题的 Google Colab 笔记本。

问题第一部分:噪音太大

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

Photo Credit: pyc Carnoy

许多性能问题是由以下原因之一引起的:

  1. 一个缓慢的层——仅仅是许多层(数据库、应用服务器等)中的一层速度缓慢,影响了 Django 应用中的许多视图。
  2. 慢速视图 —一个视图正在生成慢速请求。这对整个应用程序的性能有很大的影响。
  3. 高吞吐量视图 —一个很少使用的视图突然看到流量涌入,并触发应用程序整体响应时间的峰值。

**在调查性能问题时,我会从寻找相关性开始。**是否有任何指标同时变差?这可能很难:**一个拥有 10 层和 150 个视图的普通 Django 应用程序有 3000 个不同的时间序列数据集组合要比较!**如果我的直觉不能快速隔离问题,我自己也几乎不可能隔离问题。

问题第二部分:幻影相关性

确定两个时间序列数据集是否相关是异常多变的。例如,尼古拉斯·凯奇每年出现在电影中的次数和游泳池溺水事件有关联吗?

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

伪相关性是一整本书都在讲述这些看似清晰却毫无关联的相关性!那么,为什么看时间序列图时,趋势似乎会引发相关性呢?

这里有一个例子:五年前,我所在的科罗拉多地区经历了一场历史性的洪水。它关闭了进入埃斯蒂斯公园的两条主要路线之一,这是通往落基山国家公园的大门。如果你查看埃斯蒂斯帕克许多不同类型企业的销售收入,你会发现道路关闭时收入急剧下降,道路重新开放时收入增加。这并不意味着不同商店的收入是相关的。商店只是受到了相互依赖的影响:一条封闭的道路!

从时间序列中去除趋势的最简单方法之一是计算 第一差值 。要计算第一个差值,从每个点减去之前的点:

y'(t) = y(t) - y(t-1)

这很好,但当我盯着图表时,我的视觉大脑无法将一个时间序列重新想象成它的第一个差异。

进入数据科学

**我们面临的是数据科学问题,而不是性能问题!**我们想要识别任何高度相关的时间序列指标。我们希望看到过去的误导趋势。为了解决这个问题,我们将使用以下工具:

  • Google Colab ,一个共享的笔记本环境
  • 常见的 Python 数据科学库,如 PandasSciPy
  • 从应用程序性能监控(APM)产品 Scout 收集的性能数据。如果您还没有帐户,请注册免费试用。

我将在 Google Colab 上浏览一个共享笔记本。您可以轻松保存该笔记本的副本,从 Scout 输入您的指标,并在您的 Django 应用程序中确定最重要的相关性。

第一步:在 Scout 中查看应用程序

我登录 Scout,看到下面的概览图:

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

花费在 SQL 查询上的时间从晚上 7 点到 9 点 20 分大幅增加。为什么?这很可怕,因为几乎每个视图都要接触数据库!

步骤 2:将图层时间序列数据加载到 Pandas 中

首先,我想寻找层(例如:SQL、MongoDB、View)和 Django 应用程序的平均响应时间之间的相关性。层(10)比视图(150+)少,所以这是一个简单的起点。我将从 Scout 获取这个时间序列数据,并初始化一个熊猫数据框架。我将把这个数据争论留给笔记本

将数据加载到熊猫数据框架后,我们可以绘制这些图层:

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

步骤 3:层关联

现在,让我们看看是否有任何层与 Django 应用程序的总体平均响应时间相关。在将每个层时间序列与响应时间进行比较之前,我们要计算每个时间序列的一阶差。对于熊猫,我们可以通过diff()功能轻松做到这一点:

df.diff()

在计算了第一个差异之后,我们可以通过corr()函数寻找每个时间序列之间的相关性。相关值的范围从 1 到+1,其中 1 表示最可能一致,0 表示最可能不一致。

我的笔记本生成了以下结果:

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

SQL似乎与 Django 应用的整体响应时间相关。可以肯定的是,我们来确定皮尔逊系数 p 值。低值(< 0.05)表示总体响应时间很可能与 SQL 层相关:

df_diff = df.diff().dropna() p_value = scipy.stats.pearsonr(df_diff.total.values, df_diff[top_layer_correl].values)[1] print("first order series p-value:",p_value)

p 值正好是 **1.1e-54** **。我非常确信缓慢的 SQL 查询与整体缓慢的 Django 应用程序有关。**总是数据库,对吧?

层次只是我们应该评估的一个维度。另一个是 Django 意见的响应时间。

如果视图开始响应缓慢,应用程序的整体响应时间可能会增加。我们可以通过查看我们的视图响应时间与整体应用程序响应时间的相关性来了解这种情况是否会发生。我们使用与图层完全相同的流程,只是将图层换成 Django 应用中每个视图的时间序列数据:

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

在计算每个时间序列的第一个差异后,apps/data确实与整个 app 响应时间相关。p 值仅为 **1.64e-46** **apps/data** 极有可能与 app 整体响应时间相关。

我们差不多完成了从噪音中提取信号。我们应该检查任何视图的流量是否会导致响应时间变慢。

步骤 5:冲洗+重复 Django 查看吞吐量

如果视图的吞吐量突然增加,很少使用的昂贵视图可能会影响应用程序的整体响应时间。例如,如果用户编写一个脚本来快速重新加载一个昂贵的视图,就会发生这种情况。为了确定相关性,我们将使用与之前完全相同的过程,只是交换每个 Django 视图的吞吐量时间序列数据:

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

endpoints/sparkline看似有小关联。p 值是0.004,这意味着有 4/1000 的几率不与endpoints/sparkline的流量和整体应用响应时间相关。因此,endpoints/sparkline视图的流量确实会导致应用程序整体响应时间变慢,但这比我们的其他两个测试更不确定。

结论

使用数据科学,我们已经能够对比直觉多得多的时间序列指标进行排序。我们也能够在没有误导趋势搅浑水的情况下进行计算。

我们知道 Django 应用的响应时间是:

  • 与我们的 SQL 数据库的性能密切相关。
  • 与我们的apps/data视图的响应时间密切相关。
  • endpoints/sparkline流量相关。尽管我们对这种低 p 值的相关性很有信心,但它没有前两种相关性那么强。

**现在是工程师的时间了!**有了这些见解,我会:

  • 调查数据库服务器是否受到应用程序外部的影响。例如,如果我们只有一台数据库服务器,备份过程可能会降低所有查询的速度。
  • 调查对apps/data视图的请求的组成是否已经改变。例如,拥有大量数据的客户是否开始更多地使用这种视图?Scout 的 Trace Explorer 可以帮助调查这些高维数据。
  • 推迟调查endpoints/sparkline的性能,因为它与整个应用程序响应时间的相关性不是很强。

重要的是要意识到所有来之不易的经验何时会失效。我的大脑根本无法像我们的数据科学工具那样分析成千上万的时间序列数据集。伸手拿另一个工具是可以的。

如果你想自己解决这个问题,请查看我在调查这个问题时使用的我的谷歌共享笔记本下次您遇到性能问题时,只需从 Scout 导入您自己的数据,让笔记本为您工作!

原载于scoutapp.com

你的机器学习模型有偏差吗?

原文:https://towardsdatascience.com/is-your-machine-learning-model-biased-94f9ee176b67?source=collection_archive---------6-----------------------

如何衡量模型的公平性,并决定最佳的公平性指标。

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

Photo by rawpixel on Unsplash

机器学习模型正越来越多地用于做出影响人们生活的决策。有了这种权力,就有责任确保模型预测是公平的,没有歧视。

ProPublica,一个独立的调查性新闻机构,在 2016 年 5 月 23 日出了一个令人不安的故事,标题是 机器偏见 它突出了美国司法系统的一个重大偏见,举了一个例子,一个名叫布里莎·博登的 18 岁女孩 。2014 年,布里沙因盗窃自行车被捕。她被指控盗窃 80 美元。就在一年前,41 岁的弗农·普拉特因在附近的家得宝商店偷了价值 86.35 美元的工具而被捕。普拉特是一名惯犯,过去曾因多次盗窃和持械抢劫被定罪。另一方面,Brisha 在少年时犯过一些小过错,尽管并不严重。

COMPAS***,*** 代表 惩教罪犯管理概况替代制裁 是美国各州用来评估刑事被告成为 累犯 的可能性的算法——这个术语用来描述重新犯罪的罪犯。根据 COMPAS 的评分,黑人博登被认为有更高的风险。白人 Prater 被评为低风险。

两年后,博登没有被指控任何新的罪行,而普拉特因另一项罪行正在服刑 8 年。 是算法全错了吗?

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

COMPAS scores comparison

ProPublica 与 COMPAS 的争议

ProPublica 对 COMPAS 工具的 的分析发现,黑人被告远比白人被告更有可能被错误地判断为处于更高的再犯风险,而白人被告比黑人被告更有可能被错误地标记为处于低风险。

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

(Source: ProPublica analysis of data from Broward County, Fla.)

Northpointe,该工具背后的公司回应说,该模型不是不公平的,因为它对白人和黑人都有几个类似的整体表现。为了证明这一点,他们查看了 AUC 分数

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

http://www.northpointeinc.com/files/publications/Criminal-Justice-Behavior-COMPAS.pdf

上表显示了非裔美国人和白人男性的任何逮捕结果的每个模型的结果。非裔美国男性的 AUC 从 0.64 到 0.73 不等,而白人的 AUC 从 0.69 到 0.75 不等。Northpoint 因此得出结论,由于白人男性的 AUC 结果与非裔美国男性的结果非常相似,他们的算法是完全公平的。

这给我们留下了一个非常重要的问题:我们如何决定哪种公平的衡量标准是合适的?在回答这个问题之前,让我们先了解一下模型是如何产生偏差的。

机器学习模型中的偏差

维基百科称,“……偏差是学习算法中错误假设的错误。高偏差会导致算法错过特征和目标输出之间的相关关系”。

今天,几乎每个领域都在使用机器学习模型。他们有能力决定一个人是否有资格获得住房贷款,一个人对什么样的电影或新闻感兴趣,一个人对广告有多大反应等等。机器学习模型也进入了刑事司法领域,并被用于决定罪犯在监狱等待假释的时间。但是我们如何确保这些模型没有偏见,没有不公平地歧视人们呢?

让我们考虑三种不同的情况:

案例 1:不同的组具有不同的基本事实阳性率

考虑以下美国乳腺癌统计数据:

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

https://www.breastcancer.org/symptoms/understand_bc/statistics

现在,如果我们要建立一个分类器来预测乳腺癌的发生,根据这些统计数据,女性患乳腺癌的频率将比男性高两个数量级,概率比大约为 12%比 0.1 %。因此,在这种情况下,不同性别之间的基本事实阳性率存在非常合理的差异,这将影响分类器的结果。

案例 2:数据是对基本事实的有偏见的表示

当一个受保护的属性(类似于性别、种族、年龄)在数据集内被赋值时,数据集可以包含标签偏差。让我们看看如何?

2011 年,发布了一篇论文,该论文回顾了美国 364 所中小学办公室纪律推荐的记录模式。作者发现提到:

描述性和逻辑回归分析表明,来自非裔美国家庭的学生因问题行为而被提交到办公室的可能性是白人同龄人的 2.19 倍(初级)到 3.78 倍(中级)。此外,结果表明,来自非裔美国人拉丁裔家庭的学生比他们的白人同龄人更有可能因为相同或类似的问题行为而被开除或停学。

因此,如果我们有一个这样的数据集,并着手建立一个分类模型,预测一个学生将来是否会有行为问题,并使用“已被暂停”作为其标签,那么我们就存在标签偏差,因为在该模型中,不同的组被赋予不同的标签,这并不能准确反映实际的学生问题行为。

案例 3:当模型预测的结果很重要时。

如果我们正在制作一个惩罚性的模型**,模型的
决策的结果将是负面的,这可能就像惩罚某人一样。在这种情况下,人们可能会更关心
假**
以避免根据模型的输出惩罚无辜者。

另一方面,当一个模型是辅助性的,模型决策的结果将是正面的,我们会更关心假阴性,这样我们就不会浪费我们的资源或资源在那些
不需要我们提供的好处的人身上。

我们需要仔细思考我们的模型的后果,它可以告诉我们什么样的错误对我们很重要。偏见很容易被引入到我们的数据集中,我们需要选择合适的公平指标来处理不同的情况。

选择合适的“公平”指标

看起来有特定的公平性度量,但是,我们如何决定在特定情况下哪种公平性度量是必要的?在我们正在构建的模型或正在解决的问题的背景下,我们应该如何定义公平?嗯,今天有很多公平的度量标准被用来确保最终的模型没有偏见,但不幸的是,它们有其局限性。

1。不同的影响)

这种度量有时也被称为“统计奇偶校验”。在美国法律中,无意偏见是通过完全不同的影响来编码的,当选择过程对不同的群体产生非常不同的结果时,即使它看起来是中性的,也会出现这种情况。这一法律决定取决于受保护阶层的定义(种族、性别、宗教习俗)和对这一过程的明确描述。

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

Certifying and removing disparate impact, Feldman et al. (https://arxiv.org/abs/1412.3756)

换句话说,我们取两组的肯定分类的概率,然后取它们的比率。让我们借助一个例子来理解这个指标,在这个例子中,我们需要确定在一家公司招聘期间是否有不同的影响。

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

由于 60%小于 80%,因此存在完全不同的影响

**权衡:**正如我们所看到的,这个指标意味着基本事实的阳性率必须相同。然而,在上面讨论的案例 1 中,这种公平的衡量标准将会落空,因为不同性别之间的真实阳性率存在两个数量级的差异。

2。机会均等

这是另一个比较保护组之间真实阳性率的流行指标。在监督学习中,它是对特定敏感属性进行区分的标准,目标是基于可用特征预测某个目标。定义平等机会的论文节选:

在二元的情况下,我们常常把结果 Y = 1 认为是“有利”的结果,比如“没有拖欠贷款”、“被大学录取”或者“获得晋升”。一种可能的放宽均等优势的方法是只在“优势”结果组中要求不歧视。也就是说,要求偿还贷款的人首先有获得贷款的平等机会(没有对那些最终将违约的人提出任何要求)。这导致我们放松了我们称之为“平等机会”的观念。

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

Equality of Opportunity in Supervised Learning, Hardt et al. (https://arxiv.org/pdf/1610.02413.pdf)

**权衡:**同样,该指标无助于解决案例 2 中的情况。其中数据集包含标签偏差的可能性很高。“平等机会”衡量标准是基于与标签的一致,如果标签本身有偏见,那么我们就没有解决公平问题。

模型不仅仅是“数学”。

我们从上面的讨论中收集到的是,模型的“偏见”和“公平”具有潜在的伦理含义,因此我们仍然需要一些人类的判断来做出关于我们如何在我们的环境中定义和衡量公平的适当决定。

当机器学习模型首次被用于决策时,人们认为既然它们依赖于数学和计算,它们就应该是公平的。但是通过上面的例子,我们知道这个神话是如何被揭穿的。现在人们说,“加上这个约束会让我的模型变得公平”这还是不对的。我们不能仅仅依赖数学;我们仍然需要一个人来运用人类的判断。

解决方法是什么?

在真实世界的数据中检测偏差并不容易,也没有放之四海而皆准的解决方案。Civis Analytics**,**一家数据科学和分析公司进行了一项案例研究,该研究检验了六种不同的公平指标在预测中检测不公平偏见的能力,这些预测是由包含已知人工偏见的数据集训练的模型生成的。他们的一个发现是,“在评估机器学习设置的公平性时,从业者必须仔细考虑他们希望建模的基本事实中可能存在的不平衡,以及他们将用来创建这些模型的数据集的偏差来源”。

构建机器学习模型时可以采用的一些最佳实践是:

  • 思考模型的输入和输出。
  • 可用的公平性度量可以在一定程度上有所帮助。我们应该明智地使用它们。
  • 使用多元化的团队来创建模型
  • 总是研究数据,它的来源,也检查预测。
  • 在训练模型时,可以采用一些方法来使其公平,但是应该清楚术语“公平”的含义和上下文。这些方法包括:

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

https://arxiv.org/pdf/1809.09245.pdf || https://arxiv.org/pdf/1412.3756.pdf

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

https://arxiv.org/pdf/1806.08010.pdf

结论

机器学习已经在许多应用和领域证明了它的实力。然而,机器学习模型的工业应用的关键障碍之一是确定用于训练模型的原始输入数据是否包含歧视性偏见。这是一个重要的问题,可能有伦理和道德的含义。然而,对此并没有单一的解决方案。对于模型的输出影响人们的情况,将公平置于利润之前是明智的。

参考 :本文灵感来源于Civis Analytics的 J. Henry Hinnefeld 题为“ 测量模型公平性 ”的精彩演讲。非常感谢他强调了人工智能和机器学习如此重要的一个方面。

你的 Numpy 是否针对速度进行了优化?

原文:https://towardsdatascience.com/is-your-numpy-optimized-for-speed-c1d2b2ba515?source=collection_archive---------13-----------------------

如何发现你的 Numpy 是否使用了快速 BLAS 库?

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

The Numpy Logo, Wikipedia.

如果您的研究工作高度依赖于基于数字的计算,如向量或矩阵的加法和乘法等。然后,建议运行一些检查,以查看 Numpy 是否使用了针对速度优化的三个库之一,而不是 Numpy 的默认版本。

有 4 个 Blas 和 Lapack 版本可供选择,据我所知,Numpy 会从下面的(2,3,4)库中选择一个,如果你的系统中没有这两个版本,它会默认使用第一个。

图书馆:

  1. 默认 BLAS 和 Lapack
  2. OpenBLAS
  3. 英特尔 MKL
  4. 图集

基准

幸运的是,网上有两个基准测试,第一个是 2015 年制作的,比较了 OpenBLAS、英特尔 MKL 和 ATLAS,它倾向于 MKL 和 ATLAS,但值得注意的是,自 2015 年以来发生了很多变化。

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

Figure 1: a comparison of four BLAS libraries

第二张一张(图 1)是 2017 年的,更完整。它显示了所有四个库的比较,结果有利于 OpenBLAS,英特尔 MKL vs ATLAS,而 MKL 略微领先。对向量和矩阵乘法、奇异值分解、乔莱斯基分解和特征分解进行了比较。

哪个图书馆?

如果你想知道 Numpy 目前使用的是哪一个,简单的答案是:

导入 numpy
print(numpy . show _ config())

长回答就是你得挖开外壳,看看装的是哪个。

对于编号为< 1.10:

For Numpy≥1.10:

immediately after you will have to follow some symlinks.

$ldd /usr/lib/python2.7/dist-packages/numpy/core/_dotblas.so 
    linux-vdso.so.1 =>  (0x00007fff12db8000)
    libblas.so.3 => /usr/lib/libblas.so.3 (0x00007fce7b028000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fce7ac60000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fce7a958000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fce7a738000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fce7ca40000)$ readlink -e /usr/lib/libblas.so.3
/usr/lib/openblas-base/libblas.so.3

Please note that these examples were pasted from this SO 的帖子

非常感谢你阅读这篇文章,如果你有任何评论,请随时回复。

我要感谢我的同事巴拉克·亚伊尔·赖夫在这个问题上启发了我。

Ori Cohen 博士拥有计算机科学博士学位,主要研究机器学习。他是 TLV 新遗迹公司的首席数据科学家,从事 AIOps 领域的机器和深度学习研究。

隔离森林和火花

原文:https://towardsdatascience.com/isolation-forest-and-spark-b88ade6c63ff?source=collection_archive---------4-----------------------

PySpark 隔离带的主要特点和使用方法

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

隔离森林是一种用于异常/异常值检测的算法,基本上是一种找出异常值的方法。我们将介绍主要特征,并探索使用 Pyspark 隔离林的两种方法。

用于异常值检测的隔离林

大多数现有的基于模型的异常检测方法构建正常实例的简档,然后将不符合正常简档的实例识别为异常。[……][隔离森林]明确隔离异常,而不是剖析正常点

来源:https://cs . nju . edu . cn/Zhou zh/Zhou zh . files/publication/ICD m08 b . pdf

隔离意味着将一个实例从其余实例中分离出来

隔离林的基本特征

  • 它使用正常样本作为训练集,并允许少数异常样本(可配置)。你基本上给算法提供了你的正常数据,如果你的数据集不是那么精确,它也不会介意,只要你调整了contamination参数。换句话说它学习正常看起来是什么样子,能够区分异常
  • 它的基本假设是异常很少并且很容易区分,
  • 它具有低常数的线性时间复杂度低存储器需求*,
  • 它之所以是因为它没有利用任何距离或密度度量,
  • 能否很好的放大。对于可能有大量不相关属性的高维问题,它似乎工作得很好。

*低内存需求来自于这样一个事实,即不必完全构建森林中的每棵树,因为异常应该具有比正常实例短得多的路径,所以可以使用最大深度来切断树的构建。

隔离森林利用了异常现象的两个特征:它们是 少数 和截然不同的/不同的

异常分数和路径长度

检测异常的一种方法是根据路径长度或异常分数对数据点进行排序;异常是排在列表顶部的点

路径长度:到达外部节点之前的边数

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

Example of a path length calculation

异常分值

这基本就是算法的输出,分别是 ≤1 和≥0 。这就是图中路径长度的来源。通过估计整个森林的平均路径长度,我们可以推断出一个点是否异常。

如果一个实例的异常分数非常接近 1,那么可以肯定地说这个实例是异常的,如果它是< 0.5 then it is probably a normal instance and if it is ~= 0.5 then the entire sample does not have any distinct anomalies.

Important parameters in Isolation Forest

  • 树的数量/估计者:森林有多大
  • 污染:数据集包含异常实例的部分,例如 0.1%或 10%
  • max samples :从训练集中抽取的用于训练每棵隔离树的样本数。
  • **最大深度:**树应该有多深,这个可以用来修剪树,让事情变得更快。

该算法学习正常情况下的样子,以便能够区分异常情况

如何配合 PySpark 使用

sci kit-学习方法

Scikit-learn 方法需要我们创建一个 udf,以便能够根据数据帧进行预测。这是利用 Scikit-learn 模型的通常方式。注意,我们不能使用 spark 并行化训练部分——但是我们可以使用参数n_jobs=-1来利用我们机器上的所有内核。另一件需要记住的重要事情是将random_seed设置为特定的值,以便结果是可重复的。

我们需要做的就是安装 scikit-learn 及其依赖项pip install sklearn numpy scipy

然后我们可以从一个简单的例子开始,一个有四个样本的数据帧。

A simple example using a udf and broadcast variables for the classifier and the scaler

处理这个 udf 有多种方法,例如,您可以从一个文件加载 udf 中的模型(由于并行化,这可能会导致错误),或者您可以将序列化的模型作为一个列传递(这将增加您的内存消耗很多),但是我发现使用广播变量在时间和内存性能方面效果最好。

如果有更好的方法,请告诉我:)

火花-ML 方式

目前 Spark ML 库中还没有 iForest 的官方包。然而,我发现了两个实现,一个是 LinkedIn 的,只有 Scala 实现,另一个是杨的,可以和 Spark 和 PySpark 一起使用。我们将探讨第二个问题。

使用 spark-iforest 的步骤杨:

  1. 克隆存储库
  2. 构建 jar(为此你需要 Maven
cd spark-iforest/

mvn clean package -DskipTests

3.要么将它复制到$SPARK_HOME/jars/中,要么在 spark 配置中作为额外的 jar 提供它(我更喜欢后者,这样更灵活):

cp target/spark-iforest-<version>.jar $SPARK_HOME/jars/

或者

conf = SparkConf()
conf.set('spark.jars', '/full/path/to/target/spark-iforest-<version>.jar')spark_session = SparkSession.builder.config(conf=conf).appName('IForest').getOrCreate()

4.安装 spark-iforest 的 python 版本:

cd spark-iforest/python

pip install -e .   # skip the -e flag if you don't want to edit the project

我们已经准备好使用它了!再次强调,将随机种子设置为特定的可再现性是很重要的。

Pyspark Isolation Forest example using use spark-iforest by Fangzhou Yang

结果

在这两个例子中,我们使用了一个非常小而简单的数据集,只是为了演示这个过程。

data = [
    {**'feature1'**: 1., **'feature2'**: 0., **'feature3'**: 0.3, **'feature4'**: 0.01},
    {**'feature1'**: 10., **'feature2'**: 3., **'feature3'**: 0.9, **'feature4'**: 0.1},
    {**'feature1'**: 101., **'feature2'**: 13., **'feature3'**: 0.9, **'feature4'**: 0.91},
    {**'feature1'**: 111., **'feature2'**: 11., **'feature3'**: 1.2, **'feature4'**: 1.91},
]

该算法的两个实现都得出结论,第一个样本与其他三个样本相比看起来异常,如果我们看一下特征,这是有意义的。

请注意输出的不同范围:[-1,1]与[0,1]

Output of scikit-learn IsolationForest (-1 means anomalous/ outlier, 1 means normal/ inlier)
+--------+--------+--------+--------+----------+
|feature1|feature2|feature3|feature4|prediction|
+--------+--------+--------+--------+----------+
|     1.0|     0.0|     0.3|    0.01|        -1|
|    10.0|     3.0|     0.9|     0.1|         1|
|   101.0|    13.0|     0.9|    0.91|         1|
|   111.0|    11.0|     1.2|    1.91|         1|
+--------+--------+--------+--------+----------+Output of spark-iforest implementation (1.0 means anomalous/ outlier, 0.0 normal/ inlier):
+--------+--------+--------+--------+----------+
|feature1|feature2|feature3|feature4|prediction|
+--------+--------+--------+--------+----------+
|     1.0|     0.0|     0.3|    0.01|       1.0|
|    10.0|     3.0|     0.9|     0.1|       0.0|
|   101.0|    13.0|     0.9|    0.91|       0.0|
|   111.0|    11.0|     1.2|    1.91|       0.0|
+--------+--------+--------+--------+----------+

编辑:

似乎 IForest 目前只能处理DenseVector输入,而VectorAssembler同时输出DenseSparse向量。因此,不幸的是,我们需要使用一个udf将向量转换为Dense

**from** pyspark.ml.linalg **import** Vectors, VectorUDT
**from** pyspark.sql **import** functions **as** F
**from** pyspark.sql **import** types **as** Tlist_to_vector_udf = F.udf(**lambda** l: Vectors.dense(l), VectorUDT())data.withColumn(
    **'vectorized_features'**,
    list_to_vector_udf(**'features'**)
)
...

结论

隔离森林,在我看来,是一个非常有趣的算法,轻便,可扩展,有很多应用。绝对值得探索。

对于 Pyspark 集成:
我广泛使用了 Scikit-learn 模型,虽然它运行良好,但我发现随着模型大小的增加,传播模型和完成一个预测周期所需的时间也会增加。不出所料。

我还没有对 PySpark ML 方法进行足够的测试,以确保两种实现给出相同的结果,但是在我在示例中使用的小型、无意义的数据集上,它们似乎是一致的。我肯定会对此进行更多的实验,以调查它的伸缩性和结果有多好。

我希望这是有帮助的,并且知道如何结合使用隔离森林和 PySpark 将为您节省一些时间和麻烦。任何想法,问题,更正和建议都非常欢迎:)

如果您想了解更多关于 Spark 的工作原理,请访问:

[## 用非技术性的方式解释技术性的东西——Apache Spark

什么是 Spark 和 PySpark,我可以用它做什么?

towardsdatascience.com](/explaining-technical-stuff-in-a-non-techincal-way-apache-spark-274d6c9f70e9) [## 向 Spark 数据帧添加顺序 id

怎么做,这是个好主意吗?

towardsdatascience.com](/adding-sequential-ids-to-a-spark-dataframe-fa0df5566ff6)

如果你来自熊猫世界,想要快速接触 Spark,请查看考拉:

[## 从熊猫到有考拉的派斯帕克

考拉项目使数据科学家在与大数据交互时更有效率,通过实现熊猫…

towardsdatascience.com](/from-pandas-to-pyspark-with-koalas-e40f293be7c8)

有用的链接

隔离林论文:https://cs . nju . edu . cn/Zhou zh/Zhou zh . files/publication/ICD m08 b . pdf

[## sk learn . ensemble . isolation forest-sci kit-learn 0 . 21 . 3 文档

class sk learn . ensemble . isolation forest(n _ estimators = 100,max_samples='auto ',contaminance = ’ legacy '…

scikit-learn.org](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html) [## 逐步隔离森林

概观

medium.com](https://medium.com/@hyunsukim_9320/isolation-forest-step-by-step-341b82923168) [## 的的喀喀/火花森林

隔离森林(iForest)是一种关注异常隔离的有效模型。iForest 使用树结构来…

github.com](https://github.com/titicaca/spark-iforest) [## LinkedIn/隔离-森林

这是隔离森林无监督离群点检测算法的 Scala/Spark 实现。这个图书馆是…

github.com](https://github.com/linkedin/isolation-forest)

然后

使用 Shapley 值了解隔离森林的预测-按比例估计要素重要性:

[## 机器学习的可解释性——带有 PySpark 的 Shapley 值

解读隔离森林的预测——不仅仅是

medium.com](https://medium.com/mlearning-ai/machine-learning-interpretability-shapley-values-with-pyspark-16ffd87227e3)

异常检测:使用统计规则隔离森林

原文:https://towardsdatascience.com/isolation-forest-with-statistical-rules-4dd27dad2da9?source=collection_archive---------5-----------------------

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

这是一篇关于使用隔离林进行异常检测的后续文章。在上一篇文章中,我们看到了时间序列预测和分类的异常检测。对于隔离森林,我们必须处理污染参数**,它将我们数据中的百分比点设置为异常。**

虽然这可能是看到初始结果的一个好的开始,但这将使您陷入一个问题,在任何点 x%的点将被异常返回。让我们来看看一种可能的方法来避免它。

现在,让我们从在数据集上直接实施隔离林开始,该数据集的值为时间戳和 cpu_utilization:

链接到数据集(https://github . com/numenta/NAB/tree/master/data/realAWSCloudwatch)

import pandas as pd
import numpy as np
full_df=pd.read_csv('ec2_cpu_utilization_5f5533.csv')
full_df.head()

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

从 2 月 14 日到 2 月 28 日,我们在 5 分钟内有大约 4000 个数据点。

print(full_df['timestamp'].min())print(full_df['timestamp'].max())
print(len(full_df['timestamp']))

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

Min & Max Timestamps with number of data points

将这些点可视化,以了解时间序列数据的概况:

# Using graph_objects
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
import plotly.plotly as py
import matplotlib.pyplot as plt
from matplotlib import pyplot
import plotly.graph_objs as go
init_notebook_mode(connected=True)
import plotly.graph_objs as go
fig = go.Figure(data=[go.Scatter(x=full_df['timestamp'], y=full_df['value'])])
iplot(fig)

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

我将筛选特定一天的数据,以便进行简单的可视化。2 月 24 日似乎是一个很好的选择,因为数据中有一个下降和显著的峰值。

df=full_df.loc[(full_df[‘timestamp’]>’2014–02–24 00:00:00')&(full_df[‘timestamp’]<’2014–02–24 23:59:59')]
df.head()
plot_data=go.Scatter(x=df['timestamp'], y=df['value'])
fig=go.Figure(data=[plot_data])
iplot(fig)

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

现在,让我们开始将它与隔离森林模型进行拟合,根据我的直觉,将污染参数设置为 4%。

from sklearn.ensemble import IsolationForest
#to_model_column='value'
clf=IsolationForest(n_estimators=10, max_samples='auto', contamination=float(.04), \
                        max_features=1.0, bootstrap=False, n_jobs=-1, random_state=42, verbose=0,behaviour='new')
clf.fit(df[['value']])
df['scores']=clf.decision_function(df[['value']])
df['anomaly']=clf.predict(df[['value']])
df.head()df.loc[df['anomaly'] == 1,'anomaly'] = 0
df.loc[df['anomaly'] == -1,'anomaly'] = 1
df.value_counts()

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

def plot_anomaly(df,metric_name):
    df.timestamp = pd.to_datetime(df['timestamp'].astype(str), format="%Y-%m-%d %H:%M:%S")
    dates = df.timestamp
    #identify the anomaly points and create a array of its values for plot
    bool_array = (abs(df['anomaly']) > 0)
    actuals = df["value"][-len(bool_array):]
    anomaly_points = bool_array * actuals
    anomaly_points[anomaly_points == 0] = np.nan
    #A dictionary for conditional format table based on anomaly
    color_map = {0: "'rgba(228, 222, 249, 0.65)'", 1: "red"}#Table which includes Date,Actuals,Change occured from previous point
    table = go.Table(
    domain=dict(x=[0, 1],
                y=[0, 0.3]),
    columnwidth=[1, 2],
    # columnorder=[0, 1, 2,],
    header=dict(height=20,
                values=[['<b>Date</b>'], ['<b>Actual Values </b>'],
                        ],
                font=dict(color=['rgb(45, 45, 45)'] * 5, size=14),
                fill=dict(color='#d562be')),
    cells=dict(values=[df.round(3)[k].tolist() for k in ['timestamp', 'value']],
               line=dict(color='#506784'),
               align=['center'] * 5,
               font=dict(color=['rgb(40, 40, 40)'] * 5, size=12),
               # format = [None] + [",.4f"] + [',.4f'],
               # suffix=[None] * 4,
               suffix=[None] + [''] + [''] + ['%'] + [''],
               height=27,
               fill=dict(color=[df['anomaly'].map(color_map)],#map based on anomaly level from dictionary
               )
               ))
    #Plot the actuals points
    Actuals = go.Scatter(name='Actuals',
                     x=dates,
                     y=df['value'],
                     xaxis='x1', yaxis='y1',
                     mode='line',
                     marker=dict(size=12,
                                 line=dict(width=1),
                                 color="blue"))
    #Highlight the anomaly points
    anomalies_map = go.Scatter(name="Anomaly",
                               showlegend=True,
                               x=dates,
                               y=anomaly_points,
                               mode='markers',
                               xaxis='x1',
                               yaxis='y1',
                               marker=dict(color="red",
                                           size=11,
                                           line=dict(
                                               color="red",
                                               width=2)))
    axis = dict(
        showline=True,
        zeroline=False,
        showgrid=True,
        mirror=True,
        ticklen=4,
        gridcolor='#ffffff',
        tickfont=dict(size=10))
    layout = dict(
        width=1000,
        height=865,
        autosize=False,
        title=metric_name,
        margin=dict(t=75),
        showlegend=True,
        xaxis1=dict(axis, **dict(domain=[0, 1], anchor='y1', showticklabels=True)),
        yaxis1=dict(axis, **dict(domain=[2 * 0.21 + 0.20, 1], anchor='x1', hoverformat='.2f')))
    fig = go.Figure(data=[table, anomalies_map, Actuals], layout=layout)
    iplot(fig)
    pyplot.show()plot_anomaly(df,'anomalies')

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

print("Percentage of anomalies in data: {:.2f}".format((len(df.loc[df['anomaly']==1])/len(df))*100))

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

看起来不错,有一些小的错误异常,因为我们的绘图显示,我们已经捕捉到了重大的尖峰和其他一些下降和尖峰。现在让我们看看污染参数的作用。

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

Inliers occur together , it takes around 2 splits to separate x(i) whereas an outlier x(0) is separated in 4 splits

隔离森林将每个点从其他点中随机分离出来,并根据其分裂次数构建一棵树,每个点代表树中的一个节点。离群值出现在树中更靠近根的位置,而内嵌值出现在更深的位置。在隔离森林的情况下,基于 n_estimators 和 max_sample 参数创建森林,并从中得出分数。

可以使用score _ samples/decision _ function来获得每个点的归一化异常分数,这里越负,它就异常,基于 sklearn 计算。

直到这一步污染因素对分数没有影响。从这里开始,当我们应用 predict 以返回异常时,1/0 污染作为分数的临界值/百分点,并将前 x 个百分点的负分数作为异常返回。(例如:如果污染设定为 0.05/5%,那么负得分最高的 5%的点被标记为异常)

df['scores'].hist()

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

得分为正的内场球员在得分为正的右侧击球。分数为负的点是异常点。这是这个特定输入点的分数分布。一旦我们在此基础上最终确定了我们的模型,并预测了未来的点,那么我们的污染得分截止值可能会发生变化,给出 4%的异常点,但得分的分布可能会发生变化。为了克服硬编码的分数百分比总是被标记为异常而不考虑分数的变化,我们可以使用一些统计算法,如 Z-Score 或分数上的 IQR,来检测分数的变化并更好地对异常进行分类。

def iqr_bounds(scores,k=1.5):
    q1 = scores.quantile(0.25)
    q3 = scores.quantile(0.75)
    iqr = q3 - q1
    lower_bound=(q1 - k * iqr)
    upper_bound=(q3 + k * iqr)
    print("Lower bound:{} \nUpper bound:{}".format(lower_bound,upper_bound))
    return lower_bound,upper_bound
lower_bound,upper_bound=iqr_bounds(df['scores'],k=2)

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

df['anomaly']=0
df['anomaly']=(df['scores'] < lower_bound) |(df['scores'] > upper_bound)
df['anomaly']=df['anomaly'].astype(int)
plot_anomaly(df,'iqr based')

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

标记为异常的点的百分比在这里大约是 2%,在 IQR k 被设置为 2。

print("Percentage of anomalies in data: {:.2f}".format((len(df.loc[df['anomaly']==1])/len(df))*100))

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

现在让我们用另一个数据来验证这一点,考虑到同样的污染,以及 IQR 相同的 k 值:

df=full_df.loc[(full_df['timestamp']>'2014-02-17 00:00:00')&(full_df['timestamp']<'2014-02-17 23:59:59')]
# Using graph_objects
plot_data=go.Scatter(x=df['timestamp'], y=df['value'])
fig=go.Figure(data=[plot_data])
iplot(fig)

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

通过查看这一天的曲线图,数据看起来不同,异常更少。

from sklearn.ensemble import IsolationForest
#to_model_column='value'
clf=IsolationForest(n_estimators=10, max_samples='auto', contamination=float(.04), \
                        max_features=1.0, bootstrap=False, n_jobs=-1, random_state=42, verbose=0,behaviour='new')
clf.fit(df[['value']])
df['scores']=clf.decision_function(df[['value']])
df['anomaly']=clf.predict(df[['value']])
df.loc[df['anomaly'] == 1,'anomaly'] = 0
df.loc[df['anomaly'] == -1,'anomaly'] = 1
plot_anomaly(df,'anomalies')

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

print("Percentage of anomalies in data: {:.2f}".format((len(df.loc[df['anomaly']==1])/len(df))*100))

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

是的,这里我们从可视化中看到了更多的错误异常。这里的异常点百分比保持不变,因为我们对新时间帧的数据使用了相同的污染。

df['scores'].hist()

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

lower_bound,upper_bound=iqr_bounds(df['scores'],k=2)
df['anomaly']=0
df['anomaly']=(df['scores'] < lower_bound) |(df['scores'] > upper_bound)
df['anomaly']=df['anomaly'].astype(int)
plot_anomaly(df,'iqr second case')

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

print("Percentage of anomalies in data: {:.2f}".format((len(df.loc[df['anomaly']==1])/len(df))*100))

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

在这种情况下,异常值的百分比在这种方法中下降,因为分数中反映的数据分布已经改变。

在实时异常检测中,隔离森林上的统计规则组合会更好地工作,因为您会对未来的数据流进行建模、部署和预测,这些数据流的分布可能会随时间变化,并且新数据的分数会不同

此外,IQR 的这个 k 参数可以基于对检测到的异常的反馈进行调整。如果有假阳性,那么 k 应该减少,如果有假阴性,那么 k 应该减少以发现更多的异常。

随后将介绍隔离林算法的一些细节,新增加的热启动和解释来自隔离林的结果。

加在 上:下面是一个多元的 异常 3d 可视化 情节性地表达 其中我发现很酷在所有 3 个维度上玩它,看看异常情况。

保序回归是你可能没听说过的最酷的机器学习模型

原文:https://towardsdatascience.com/isotonic-regression-is-the-coolest-machine-learning-model-you-might-not-have-heard-of-3ce14afc6d1e?source=collection_archive---------3-----------------------

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

术语“等渗”源自希腊语词根“iso”和“tonos”根“iso”不仅仅是一种文件格式,它实际上意味着等于。另一方面,“托诺斯”意味着伸展。等渗这个词可以指从材料和物理科学到文科的许多东西。

等拉伸回归(保序回归)是一个非常酷的统计推断模型。我对等渗回归的痴迷一直在扩大,因为这个模型实在是太有趣了,太酷了。

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

保序回归是一种自由形式的线性模型,可以用来预测观察值序列。然而,保序回归与加权最小二乘法等类似模型有两个主要区别。等张函数不能是非减函数。这是因为等张函数是单调函数,即保持或反转给定顺序的函数。

保序回归使用一个有趣的概念,称为“顺序理论”序理论将偏序集和预序集的概念作为实数的推广。这意味着一个等张函数总是以这样或那样的方式被扭曲,使用统计学来推断下一步该做什么。这很有趣,也很不同,因为大多数数学模型不会这么做。虽然贝叶斯数学肯定是相似的,但决策并不完全相同。

这个概念是众多使保序回归对多维标度极其可行的概念之一。多维标度是特征之间相关性的可视化。这种数学方法对于显示距离矩阵中的信息特别有用。

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

有趣的是,保序回归实际上完全基于另一个模型:

加权最小二乘法

但同时,完全不同。不幸的是,保序回归背后的数学对我来说太复杂了,我希望有一天能很好地掌握它,并将其实现到我的 Julia 包中。

幸运的是,一位了不起的统计学家 Fabian Pedregosa 经历了将等渗回归到 Python 中的过程,尽管它已经在 R 中使用了很长时间。

不管保序回归的可用性、复杂性或重要性如何,你必须承认:

这很酷

希望很快我就有时间学习并在车床上实现它,这样我们就可以把 Julia 添加到拥有它的语言列表中了!信不信由你,只有三大语言有保序回归的开源包!希望在未来,它将被扩展,并被更多地宗教化到语言中,尽管有多复杂!

它使用机器学习和 AWS Lambda 支持票据分类和部署

原文:https://towardsdatascience.com/it-support-ticket-classification-and-deployment-using-machine-learning-and-aws-lambda-8ef8b82643b6?source=collection_archive---------2-----------------------

支持话单分类和部署

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

IT Ticket Classification

项目描述和初始假设:

作为我们认知计算最终项目的一部分,我们决定解决一个现实生活中的业务挑战,为此我们选择了 IT 服务管理。在所有的商业案例中,我们感兴趣的是可能适合我们项目的四个用户案例。

1.在帮助台,几乎 30–40%的事件票证没有发送给正确的团队,票证一直在转来转去,当它到达正确的团队时,问题可能已经广泛传播并到达最高管理层,带来许多麻烦。

2.假设用户在使用打印机时遇到了一些问题。用户致电帮助台,他在 IT 支持人员的帮助下创建了一个票证,他们意识到需要更新用户系统中的配置,然后他们解决了该票证。如果 10 个其他用户报告了同样的问题,该怎么办?我们可以使用这些数据,并通过使用非结构化数据来分析潜在的问题。此外,我们可以分析趋势并最大限度地减少那些事故单。

3.可以响应和处理用户票证的虚拟机器人。

在这三个用例中,由于时间和资源的限制,我们决定先用第一个用例。

使用的工具和技术:

● ServiceNow 实例(IT 服务管理

平台)

● AWS Lambda 功能

● EC2 实例

● Python

●神经网络模型

●来自公开来源的 50000 多张样票

流程概述:

该过程的整个工作流程可以分成不同的子部分。下图显示了一个非常高层次的概述。

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

数据集:

我们直接从 servicenow 中提取数据集,并尝试使用 ML 技术对它们进行分类,以制作一个带标签的数据集。我们只是保留了票证中的描述和类别,并继续对其进行分析,以得出事件的前 5 个类别。

一旦我们使用主题建模对前 5 个事件类别进行了分类,就会添加标签

用例概述:

在典型的 IT 环境中,大多数关键问题都以票据的形式得到处理和跟踪。IT 基础设施是网络中连接在一起一组组件。因此,当一个组件发生故障时,它会带走许多其他组件。甚至可能需要几天时间来找出问题所在并找到根本原因。因此,有必要通知部件所有者

以便采取适当的措施防止这种情况发生。

这些问题通常由用户向帮助热线或服务台报告,他们是第一线支持人员。不幸的是,任何人都很难知道所有的组件,因此门票被发送到错误的团队。它到达最初的团队可能需要几天或几周的时间。因此,我们认为可以使用 NLP 来解决这个问题。

IT 服务管理平均生成 40 GB 以上的数据。这给了我们足够的数据来训练和实现我们的模型。

我们的模型如果实施得当,可以为业务部门节省数十亿美元,因为他们会因此失去许多服务级别协议。

基于云计算的 ITSM:

在云计算到来之前,这个商业案例几乎是不可能处理的。云计算首先使机器学习算法和 IT 服务管理之间的集成成为可能。

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

对于我们的业务案例,我们使用了一个名为 Servicenow 的基于云的 IT 服务管理应用程序,并使用 API gateway 访问了包装在 AWS lambda 函数中的机器学习模型。

【ServiceNow 与 AWS 的集成:

Web 服务使应用程序能够通过网络连接到其他软件应用程序,从而允许提供者(服务器)和客户(消费者)之间交换信息。

web 服务消费者(客户机)向 web 服务提供者(服务器)请求信息。web 服务提供者处理请求,并返回状态代码和响应正文。当返回响应体时,web 服务消费者从响应体中提取信息,并对提取的数据进行操作。

ServiceNow 可以使用来自第三方提供商或其他 ServiceNow 实例的 web 服务。

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

在我们的例子中,我们使用由 API 网关通过 Rest web 服务触发的端点 url,并使用在创建票证时运行的 javascript 来访问它。

在创建票证时,javascript 被触发,它将事件描述发送到我们放置在 AWS 中的模型,该模型执行机器学习操作并返回预测的类别和概率。

用于分类的主题建模

即使我们不确定主题是什么,我们也会提前选择主题的数量。

每个文档都表示为主题的分布。

每个主题都表示为单词的分布。

我们使用 NLTK 的 Wordnet 来查找单词、同义词、反义词等的含义。另外,我们使用 WordNetLemmatizer 来获取词根。

然后,我们逐行读取数据集,为 LDA 准备每一行,并存储在一个列表中。

带 Gensim 的 LDA

首先,我们从数据中创建一个字典,然后转换成单词袋语料库,并保存字典和语料库以备将来使用。

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

然后,我们尝试使用 LDA 找出 5 个主题:-

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

皮尔戴维斯

pyLDAvis 旨在帮助用户解释符合文本数据语料库的主题模型中的主题。该软件包从拟合的 LDA 主题模型中提取信息,以通知基于 web 的交互式可视化。

可视化 5 个主题:

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

通过主题建模,我们得出结论,整个数据集可以分为 5 类

网络

用户维护

数据库

应用工作台

安全

然后,我们相应地标记我们的数据集,并准备一个数据集来对其执行监督学习。

RNN 进行分类:-

端到端的文本分类管道由以下组件组成:

1.训练文本:它是输入文本,通过它我们的监督学习模型能够学习和预测所需的类。

2.特征向量:特征向量是包含描述输入数据特征的信息的向量。

3.标签:这些是我们的模型将预测的预定义类别/类

4.ML Algo:它是我们的模型能够处理文本分类的算法(在我们的例子中:CNN,,韩)

5.预测模型:在历史数据集上训练的模型,可以执行标签预测。

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

使用递归神经网络(RNN)的事件分类:

递归神经网络(RNN) 是一类人工神经网络,其中节点之间的连接沿着序列形成有向图。这允许它展示时间序列的动态时间行为。

使用来自外部嵌入的知识可以提高 RNN 的精确度,因为它集成了关于单词的新信息(词汇和语义),这些信息是在非常大的数据语料库上训练和提炼的。我们使用的预训练嵌入是手套

RNN 是一系列神经网络模块,它们像链条一样相互连接。每一个都在向下一个传递信息。

一大块神经网络 AA 查看某个输入 xtxt 并输出一个值 htht。环路允许信息从网络的一个步骤传递到下一个步骤。

这些循环使得循环神经网络看起来有点神秘。然而,如果你想得更多一点,就会发现它们与普通的神经网络并没有什么不同。递归神经网络可以被认为是同一网络的多个副本,每个副本都向后继者传递消息。考虑一下如果我们展开循环会发生什么:

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

LSTM 网络公司

长短期记忆网络——通常简称为“lstm”——是一种特殊的 RNN,能够学习长期依赖性。由hoch Reiter&schmid Huber(1997)提出,并在随后的工作中被许多人提炼和推广。它们在各种各样的问题上表现得非常好,现在被广泛使用。

LSTMs 的明确设计是为了避免长期依赖问题。长时间记住信息实际上是他们的默认行为,而不是他们努力学习的东西!

所有递归神经网络都具有神经网络重复模块链的形式。在标准 RNNs 中,这种重复模块将具有非常简单的结构,例如单个 tanh 层。

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

标准 RNN 中的重复模块包含一个层。

LSTMs 也具有这种链状结构,但是重复模块具有不同的结构。不是只有一个神经网络层,而是有四个,以一种非常特殊的方式相互作用。

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

LSTM 中的重复模块包含四个相互作用的层。

不要担心正在发生的事情的细节。稍后我们将一步一步地浏览 LSTM 图。现在,让我们试着适应我们将要使用的符号。

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

在上图中,每条线都承载一个完整的向量,从一个节点的输出到其他节点的输入。粉色圆圈代表逐点操作,如向量加法,而黄色方框是学习过的神经网络层。行合并表示连接,而行分叉表示其内容被复制,并且副本被移动到不同的位置。

LSTMs 背后的核心理念

LSTMs 的关键是单元状态,即贯穿图表顶部的水平线。

细胞状态有点像传送带。它沿着整个链条直线向下,只有一些微小的线性相互作用。信息很容易不加改变地沿着它流动。

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

LSTM 确实有能力删除或添加细胞状态的信息,由称为门的结构仔细调节。

门是选择性地让信息通过的一种方式。它们由一个 sigmoid 神经网络层和一个逐点乘法运算组成。

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

sigmoid 层输出 0 到 1 之间的数字,描述每种成分应该通过多少。值为 0 表示“不允许任何东西通过”,而值为 1 表示“允许任何东西通过!”

一个 LSTM 有三个这样的门,用来保护和控制细胞状态。

LSTM 按部就班地走过

LSTM 的第一步是决定我们要从细胞状态中丢弃什么信息。这个决定是由一个称为“忘记栅极层”的 sigmoid 层做出的。它查看 ht 1 ht 1 和 xtxt,并为单元状态 Ct 1 Ct 1 中的每个数字输出一个介于 00 和 11 之间的数字。11 代表“完全保留这个”,00 代表“完全摆脱这个”

让我们回到我们的例子,一个语言模型试图根据所有前面的单词预测下一个单词。在这样的问题中,单元状态可能包括当前主题的性别,以便可以使用正确的代词。当我们看到一个新的主题时,我们想忘记旧主题的性别。

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

下一步是决定我们要在单元格状态中存储什么新信息。这有两个部分。首先,一个称为“输入门层”的 sigmoid 层决定我们要更新哪些值。接下来,tanh 层创建一个新的候选值向量,C̃ tC~t,可以添加到状态中。在下一步中,我们将结合这两者来创建状态更新。

在我们的语言模型的例子中,我们希望将新主体的性别添加到细胞状态中,以替换我们遗忘的旧主体。

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

现在应该将旧的单元状态 ct1ct 1 更新为新的单元状态 CtCt。前面的步骤已经决定了要做什么,我们只需要实际去做。

我们用 ftft 乘以旧状态,忘记了我们早先决定忘记的事情。然后,我们添加 it∗c̃tit∫c ~ t。这是新的候选值,由我们决定更新每个状态值的多少来缩放。

在语言模型的情况下,这是我们实际删除旧主题的性别信息并添加新信息的地方,正如我们在前面的步骤中决定的那样。

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

最后,我们需要决定我们要输出什么。该输出将基于我们的单元状态,但将是过滤后的版本。首先,我们运行一个 sigmoid 层,它决定我们要输出细胞状态的哪些部分。然后,我们通过 tanhtanh 设置单元状态(将值推至 11 和 11 之间),并乘以 sigmoid 门的输出,这样我们只输出我们决定的部分。

对于语言模型示例,由于它刚刚看到了一个主题,它可能希望输出与一个动词相关的信息,以防接下来会出现这个信息。例如,它可能输出主语是单数还是复数,这样我们就知道一个动词应该变成什么形式,如果接下来是什么的话。

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

长短期记忆的变异

到目前为止,我所描述的是一个非常正常的 LSTM。但并不是所有的 LSTMs 都和上面的一样。事实上,似乎几乎所有涉及 LSTMs 的论文都使用了稍微不同的版本。这些差异很小,但其中一些值得一提。

由 Gers & Schmidhuber (2000)提出的一个流行的 LSTM 变体,是增加“窥视孔连接”这意味着我们让栅极层查看单元状态。

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

上图给所有的门都加了窥视孔,但是很多论文会给一些窥视孔而不给另一些。

另一种变化是使用耦合的遗忘和输入门。我们一起做决定,而不是分别决定忘记什么和应该添加什么新信息。我们只会忘记何时在它的位置输入东西。只有当我们忘记旧的东西时,我们才会向状态输入新的值。

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

LSTM 的一个稍微戏剧性的变化是门控循环单元,或 GRU,由 Cho 等人(2014) 引入。它将遗忘门和输入门合并成一个“更新门”它还合并了单元格状态和隐藏状态,并进行一些其他更改。由此产生的模型比标准的 LSTM 模型更简单,而且越来越受欢迎。

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

我们的建筑

通用型号

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

LSTM 车型

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

要在文本数据上使用 Keras,我们首先必须对其进行预处理。为此,我们可以使用 Keras 的 Tokenizer 类。该对象将 num_words 作为参数,它是基于词频进行标记化后保留的最大单词数。

一旦在数据上安装了标记器,我们就可以用它将文本字符串转换成数字序列。这些数字代表每个单词在字典中的位置(可以把它想象成映射)。

在这个项目中,我们试图通过使用递归神经网络和基于注意力的 LSTM 编码器来解决这个问题。

通过使用 LSTM 编码器,我们打算在运行前馈网络进行分类之前,在递归神经网络的最后输出中编码文本的所有信息。

这非常类似于神经翻译机器和序列到序列学习。

我们在 Keras 中使用 LSTM 层来解决长期依赖的问题。

模型评分和选择

我们的模型评分和选择基于标准评估指标准确度、精确度和 F1 分数,定义如下:

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

其中:

TP 代表真正分类的数目。也就是说,具有实际标签 A 的记录已被正确分类或“预测”为标签 A。

TN 是真否定分类的数量。也就是说,实际标签不等于 A 的记录已被正确分类为不属于标签 A。

FP 是假阳性分类的数量,即实际标签不是 A 的记录被错误地分类为属于类别 A。

FN 是假阴性的数量,即标签等于 A 的记录被错误地分类为不属于类别 A。

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

图 3。预测分类与实际分类的“混淆矩阵”

预测和实际分类的组合被称为“混淆矩阵”,如图 3 所示。在这些定义的背景下,各种评估指标提供了以下见解:

准确性:正确的模型预测总数的比例。

精确度(也称为正面预测值):正确预测相对于该特定类别所有预测的比例。

召回率(也称为真阳性率、TPR、命中率或敏感度):真阳性相对于所有实际阳性的比例。

假阳性率(也称为假警报率):假阳性相对于所有实际阴性的比例(FPR)。

F1:(更稳健的)精确度和召回率的调和平均值。

输出:-

通用 RNN 型号:-

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

RNN 与 LSTM 层

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

观察:-

没有 LSTM 的一般 RNN 模型为我们提供了 66%的准确性,而我们能够使用 RNN 的 LSTM 网络层将其提高到 69%

低数据量导致准确性在 70%后几乎停滞不前,我们是否增加图中明显的时期并不重要。

然而,69%是足够公平的分类,因为我们打算在线训练它,并随着数据量增长到更高的程度而不断提高准确性。

模型部署

对于这个项目的范围,我们计划在亚马逊 AWS 上部署模型,并将其与服务集成,以便模型进行在线或实时预测。为此,我们将首先通过将模型转储到 pickle 文件中来导出模型。此外,我们将编写一个连接到 S3 桶的函数,从那里读取 pickle 文件并重新创建模型。

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

所以工作流程看起来是这样的:

  1. 立即创建服务中的事件
  2. 事件在 AWS 中接收,并且我们的 AWS EC2 实例或服务正在运行
  3. 从 S3 桶中获取 function.py 文件,该文件将从 Pickle 文件中读取模型并重新创建模型
  4. 它将从服务请求中提取特征,即事件描述
  5. 现在,代码将在 AWS Lambda 中执行,它将为我们提供事件所属的类别
  6. 在 AWS 上创建 EC2 实例:-
  7. 首先,创建一个 AWS 帐户,它将让你免费使用一年的一些有限的服务,但对这个项目来说已经足够了
  8. 创建一个 EC2 实例并选择自由层机器,或者如果您的帐户中有信用并且需要一个更强大的机器,您可以从其他选项中选择
  9. 在 AWS 上为 Python 配置一个虚拟运行时环境,完成后,将所有配置文件压缩到一个文件中,并在压缩文件中包含 function.py 文件,因为我们将在 AWS S3 存储桶中上传该文件
  10. 创建一个 S3 桶并上传包含模型详细信息(如模型名称、超参数和模型权重)的 pickle 文件,还上传包含 function.py 文件以及 python 虚拟环境配置设置的 zip 文件

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

  1. 现在,最后设置 AWS Lambda,这是我们将运行 python 脚本并进行预测的地方

AWS Lambda 是一种计算服务,让您无需配置或管理服务器就可以运行代码。它会自己处理那部分。AWS Lambda 最棒的一点是,你只需为你消耗的计算时间付费——当你的代码不运行时,是不收费的。有了 AWS Lambda,您几乎可以为任何类型的应用程序或后端服务运行代码——所有这些都无需管理。AWS Lambda 在高可用性计算基础设施上运行您的代码,并执行计算资源的所有管理,包括服务器和操作系统维护、容量供应和自动扩展、代码监控和日志记录。你所需要做的就是用 AWS Lambda 支持的语言之一来提供你的代码。

虽然我们无法配置 AWS lambda,因为我们都不熟悉它,必须浏览文档,时间不够。我们计划将该项目扩展到我们的其他课程并完成它。一旦我们达到目标,我们将更新博客。

ServiceNow 和 AWS 之间的集成:

Web 服务使应用程序能够通过网络连接到其他软件应用程序,从而允许提供者(服务器)和客户(消费者)之间交换信息。

web 服务消费者(客户机)向 web 服务提供者(服务器)请求信息。web 服务提供者处理请求,并返回状态代码和响应正文。当返回响应体时,web 服务消费者从响应体中提取信息,并对提取的数据进行操作。

ServiceNow 可以使用来自第三方提供商或其他 ServiceNow 实例的 web 服务。

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

在我们的例子中,我们使用 API 网关通过 Rest web 服务触发的端点 url,并使用创建票证时运行的 javascript 访问它。

在创建票证时,javascript 被触发,它将事件描述发送到我们放置在 AWS 中的模型,该模型执行机器学习操作并返回预测的类别和概率。

未来范围:

这个项目还没有完成,因为我们时间不够。我们正在进行这个项目,我们计划推进这个项目,以便我们可以在 AWS 上部署我们的代码,并将其与服务集成。一有进展,我们就会更新博客。😃

Github 链接:-

https://github.com/pankajkishore/Cognitive-Project

资源:-

https://medium . com/jatana/report-on-text-class ification-using-CNN-rnn-Han-f0e 887214 d5f

https://medium . com/datadriveninvestor/automation-all-the-way-machine-learning-for-it-service-management-9de 99882 a 33

[## karolzak/support-门票-分类

这个案例研究展示了如何为文本分析和分类创建一个模型,并将其作为 web 服务部署在…

github.com](https://github.com/karolzak/support-tickets-classification)

作者: Pankaj KishoreAnuja SrivastavaJitender PhogatKarthik Kandakumar

现在是 2019 年,让您的数据可视化与 Plotly 互动

原文:https://towardsdatascience.com/its-2019-make-your-data-visualizations-interactive-with-plotly-b361e7d45dc6?source=collection_archive---------0-----------------------

使用 Express 和袖扣快速找到制作令人惊叹的数字的方法

如果您仍在使用 Matplotlib 在 Python 中进行数据可视化,那么是时候从交互式可视化库中查看视图了。

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

The view from the top of Mt. Plotly

Plotly 允许你只用几行代码就能制作出漂亮的、交互式的、可导出的图形。

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

Plotly Express examples from Plotly announcement

然而,没有地图,普洛特利山上的道路🗻会很慢而且令人沮丧。

以下是阻碍冒险者前进的绊脚石:

  • 混乱的初始设置,在没有帐户的情况下脱机工作
  • 一行又一行要写的代码
  • 过时的文档
  • 太多不同的 Plotly 工具,很难保持直线(破折号,快递,图表工作室,和袖扣)

经过几次尝试,我找到了地图、工具和到达山顶的捷径。在这篇文章中,我将带你上山,向你展示如何开始脱机工作,如何在一行代码中制作图形,然后调整它们,去哪里寻求帮助,以及什么时候使用什么工具。

我们开始爬山吧。这景色值得一看。相信我。😃

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

Plotly

普罗特利背后的公司也叫普罗特利。它已经开源了一系列交互式可视化产品。它通过为许多产品提供增强的功能来赚钱。它还提供收费的私人托管服务。该公司总部设在蒙特利尔,在波士顿设有办事处。

plotly.py 在幕后使用 D3.js 。Plotly 有 R、Julia 和许多其他语言 API 包装器。请注意,并非所有语言都有可用的示例文档。

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

Instruction options in Plotly docs

在本文中,我们将重点关注使用 Python 的选项。在本指南中,我使用 Python 3.7 和以下库版本。

cufflinks                0.15
jupyterlab               0.35.5
plotly                   3.8.1      
plotly-express           0.1.7

确保你用的是 0.15 的袖扣(0.13 和最近的 Plotly 版本不太搭)。

2020 年 5 月更新:Plotly 4.7.1 是最新版本。下面的大部分,但不是全部,仍然适用于新版本。注意 express 模块是作为 plotly 包的一部分导入的。

plotly.py

您不需要创建一个帐户来使用 Plotly,这与一些文档示例可能看起来的情况相反。使用 Plotly 也不需要在线。

将 vanilla plotly.py 模块安装在 condapip install plotly中。

导入模块并将其配置为脱机工作:

import plotly.offline as pypy.init_notebook_mode(connected=False)

现在你不会得到一个错误,你需要一个帐户。我们已经通过了上山路上的第一个障碍。😄

这是一个交互式的地球仪图形的例子,它允许你用滑块轻松地改变投影类型和位置。由于媒体对文件类型的限制,您无法在此处与该图进行交互,但您可以在文档中与该图进行交互。

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

下面是一个冗长的要点,由制作这个奇特图形所需的文档改编而来的 plotly.py 代码

Plotly 对象由一个或多个数据组件和一个布局组件组成。两者都有子组件。大部分(但不是全部)格式是在布局中控制的。

避免使用 vanilla plotly.py 的主要原因是图形定义通常很冗长。指定代码的行数和行数既慢又容易出错。我们无疑遇到了收养道路上的第二个障碍。幸运的是,我们通常可以选择两条备用路线中的一条,稍后我们将对此进行探讨。

如果我们确实需要继续使用老的 plotly.py 路径,我们将需要深入研究文档。官方文档很漂亮,但是经常让我花很长时间去寻找如何调整的方法。

Plotly 确实有一个不错的论坛这里也有一些有用的 SO 问题,但是很多例子没有更新来显示 plotly.py v3 代码。这里有 v3.0 迁移指南可以帮上一点忙。确保您正在寻找的任何示例都使用 v3,或者准备将它们翻译成 v3。

接下来我们要看的两个 Plotly 产品提供了简化 plotly.py API 的高级包装器。如果你和熊猫一起工作,他们可以节省你大量的时间。让我们探索这些替代路线。

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

Forrest path

表达

Plotly Express 于 2019 年 3 月发布,正在积极开发中,支持更多图表。计划是 2019 年夏天折叠成 Plotly 4.0。

Express 可以将从熊猫数据帧中制作许多图形所需的代码减少 10 倍。Express 希望您的数据帧以整齐的格式到达,其中每行代表一个观察值,每列代表一个变量。

pip install plotly_express安装 Express。

要在 JupyterLab 中使用它,请在您的终端中运行以下命令:

jupyter labextension install @jupyterlab/plotly-extension

下面是使用传统的快速导入从数据帧制作条形图的代码:

import plotly_express as px px.bar(my_df, x='my_x_column', y='my_y_column')

维奥拉。你已经从你的数据框架中得到了一个条形图(在我上面有“我的 _”的地方替换你的东西)。

您可以调整单线图定义中的许多值。例如,通过更改定义来添加标题,如下所示:

px.bar(my_df, x='my_x_column', y='my_y_column', title='My Chart Title")

如果你想深入到一个特定的设置,你可以返回底层的 Plotly 图。假设您想要将文本值添加到您的条形图中。您需要保存自动返回的图形并引用其数据属性。你可以这样做:

_my_fig = px.bar(my_df, x='my_x_column', y='my_y_column', title='My Chart Title')_my_fig.data[0].update(
    text=my_df['my_y_column'],  
    textposition='inside',
    textfont=dict(size=10)
)_my_fig.iplot()

预警:我发现了快递文档!它在我的谷歌搜索中没有排在前列,所以我有一段时间没有找到它。现在你有了。尽情享受吧!😃

Express 允许您快速制作许多图形类型,但并不是您想要的所有类型都可用。例如,堆积条形图目前不是一个简单的选择。对于那些你想带着袖扣走另一条路到达山顶的人。

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

The other path

袖扣

袖扣与 Express 非常相似,因为它是 Plotly API 的包装器,以简化与熊猫的工作。袖扣是一个第三方开源项目,已经存在了四年多。

pip install cufflinks安装。

导入模块并配置文件以供脱机使用。

import cufflinks as cf
cf.set_config_file(offline=True)

许多体型只需要一行袖扣代码。例如,堆积条形图是一件轻而易举的事。

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

Example cufflinks stacked bar chart

代码如下:

df = pd.DataFrame(np.random.rand(6, 3), columns=['A', 'B', 'C'])df.iplot(kind='bar', barmode='stack', title='Stacked Bar Chart with Random Data')

请注意,您将使用.iplot()制作袖扣造型。

像 Express 一样,Cufflinks 返回基本的 Plotly 数字,以便您可以进行更精细的修改。与袖扣不同,您需要在您的图形定义中指定asFigure=True来返回图形。然后,您可以像在 Express 中一样更新图形。如果你想改变 yaxis 的名称和范围,这里是它的样子。

my_fig = df.iplot(kind='bar', barmode='stack', title='Stacked Bar Chart with Random Data', asFigure=True)_fig.layout.yaxis = dict(title='Members', range=[0, 600])

这是袖扣文档

不幸的是,有些东西用袖扣是做不到的,比如散点图。

3 个选项的比较

下面是用 plotly.py、Express 和 Cufflinks 创建的图形的类似布局的代码比较。

plotly.py

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

fig = {
    'data': [
        {
            'x': df2007.gdpPercap, 
            'y': df2007.lifeExp, 
            'text': df2007.country, 
            'mode': 'markers', 
            'name': '2007'},
    ],
    'layout': {
        'title': "Example Scatter Plot with Vanilla plotly.py"
    }
}py.iplot(fig)

表达

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

px.scatter(
    df2007, 
    x="gdpPercap", 
    y="lifeExp", 
    title='Example Scatter Plot with Plotly Express'
)

那就是又短又甜!默认格式有点不同,您可以自动获得轴标题。让我们看看袖扣中的相同图表。

袖扣

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

df2007.iplot(
    kind='scatter', 
    mode='markers', 
    x='gdpPercap', 
    y='lifeExp', 
    title='Example Scatter Plot with Cufflinks'
)

这是非常相似的代码,但是图中的默认值略有不同。

快递和袖扣都可以节省你的按键次数。⌨️对于许多更复杂的图表来说尤其如此。😃

让我们看看如何返回和访问底层 plotly 数字。

更新 Cufllinks 和 Express 图

让我们访问由袖扣创建的图形的布局,并添加轴标题。

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

fig = df2007.iplot(
    kind='scatter', 
    mode='markers', 
    x='gdpPercap', 
    y='lifeExp', 
    asFigure=True,
    title='Example Scatter Plot with Cufflinks - Access Underlying Figure'
)fig.layout.xaxis.title = "GDP per Capita"
fig.layout.yaxis.title = "Life Expectancy"fig.iplot()

以下是如何用 Express 做同样的事情。回想一下,使用 Express,您不需要指定asFigure=True

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

fig = px.scatter(
    df2007, 
    x="gdpPercap", 
    y="lifeExp", 
    title='Example Scatter Plot with Plotly Express - Access Underlying Figure'
)fig.layout.xaxis.title = "GDP per Capita"
fig.layout.yaxis.title = "Life Expectancy"fig.iplot()

您可以访问第一个数据跟踪来添加文本标签,如下所示:

fig.data[0].update(
 text=df2007['gdpPercap'],
 textposition=’inside’,
 textfont=dict(size=10)
)

在 plotly.py、Express 和袖扣中选择

空间真的很混乱。不久前的某个时候,我以为我在一个项目的某个部分使用了 Express,当时我正在使用袖扣!🤦‍♂

我是 Python 的中的禅的忠实粉丝:“应该有一种——最好只有一种——显而易见的方法来做这件事。”两种方式导致研究时间、选择疲劳和错误。

不幸的是,现在没有一个单一的高级 API 来制作每种图形类型。不过,我肯定会尽可能使用袖扣或快递。

当你想建立一个数字时,我建议你检查快递和袖扣文档。请记住,快递需要整洁的数据框架,而袖扣更灵活。使用两个库中符合您的需要并且格式最接近您想要的格式的库。袖扣是我首先要找的地方。

这两个库之间的默认格式可能非常引人注目。例如,对于数据帧中 X、Y 和 Z 列的一些随机数据,您可以通过以下袖扣代码获得:

df.iplot(kind=’scatter’, mode=’markers’, x=’X’, y=’Y’, title=’Random Data’, categories=’Z’)

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

Cool Default Cufflink Scatter Plot

或者这个用这个明示的代码:

px.scatter(df, x=’X’, y=’Y’, color=’Z’, title=’Random Data’)

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

Different Presets with Express

那是相当不同的!

保存文件

一旦你创建了一个图形,你可以将鼠标悬停在它上面,点击相机图标,将其导出为. png 文件,或者点击导出到 plot.ly 链接,将互动图像保存到 Plotly 的服务器上。

或者,您可以下载交互式 HTML 格式的文件,如下所示:

py.offline.plot(my_fig, filename=’my_example_file.html’)

如果你需要更多的图像格式,你可以使用 Plotly 的 orca 包下载文件格式包括。png,。你需要先安装 orca。该软件包目前在 pypi.org 上不可用,所以你不能用 pip 安装它。你可以通过 conda 安装它,也可以从 orca GitHub 页面安装特定于操作系统的版本。那么就不需要导入 orca 库了。点击阅读更多关于虎鲸的信息。

下面是安装 orca 后创建一个. png 文件的代码。

import plotly as plotly
plotly.io.write_image(fig, file='my_figure_file.png', format='png')

正如你所看到的,有几种方法可以让你的数字脱离 Plotly。😃

让我们简单介绍一下 Plotly 生态系统的另外两个组件,这样你就知道什么是什么了。

破折号

使用 Plotly [Dash](http://Dash is a Python framework for building analytical web applications.) 你可以使用 Python 为你的团队或世界制作 web 应用仪表板。截至 2019 年 5 月 1 日,有近 9000 个 GitHub 明星的免费开源版本。Plotly 提供了一套 Dash 附加组件。我没怎么用过 Dash。也许这将是未来文章的重点。跟着确保你不会错过。😄

图表工作室

Plotly Chart Studio 让您在浏览器中轻松创建或编辑图表。Plotly 称其为“世界上最复杂的创建 D3.js 和 WebGL 图表的编辑器”。不需要编码。有一个免费版本,但如果你想保存私人图表文件,年费从 99 美元起。

既然我们已经登上了 Plotly 山顶,让我们快速浏览一下 Python 范围内的其他数据可视化山峰。

额外收获:其他 Python 数据 Viz 选项

本文并不打算详尽地介绍数据可视化选项,但是我将提到数据科学家需要了解的其他几个重要选项,这样您就有了一个相当全面的了解。

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

用 Python 制作可视化的老方法是使用普通的 Matplotlib API。

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

熊猫 Matplotlib API 很适合快速绘制。它创建常规的 Matplotlib 对象。

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

Seaborn 是一个优秀的 Matplotlib 高级包装器,可以让你快速制作多种类型的统计可视化。不幸的是,这些选项不是交互式的,并且是建立在一个 15 年历史的 Matplotlib 基础上的,这个基础不是非常容易使用。

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

散景是 Plotly 的竞争对手。它是开源的、交互式的,并且与 Python 兼容。

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

Holoviews 是 MatplotLib、Bokeh 和 now Plotly 的高级包装器。我知道有人喜欢全息视图。

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

r 乡亲们喜欢 RStudio 的闪亮。它让用户创建交互式 web 应用程序可视化。

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

TableauMicrosoft PowerBI 是另外两个与 Python 集成的流行的拖放数据可视化创建选项。Tableau 真的很好,但是需要你付钱来保持你作品的私密性。

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

我发现 PowerBI 有点不太直观,但它也非常强大,非常受欢迎。

上面列出的大多数交互式图形软件都使用 D3.js。超级受欢迎。

包装和资源

如果你是一名数据科学家,我鼓励你仔细检查。这是一个制作交互式可视化的现代工具箱。从山顶上看,似乎这个神秘的庞然大物不太可能很快减速。

也许最终会有一种清晰的方法,使用 Ploly 的高级 API 选项来制作你想要的任何东西。现在,我建议你尽可能用熊猫搭配袖扣或 Express,以节省时间并做出令人惊叹的可视化效果。

这里有一些很好的 Plotly 资源:

  • Will Koehrsen 在这里有一个很好的袖扣入门指南
  • 下面是 plotly.py 首席开发人员 Jon Mease 的演讲,展示了在 JupyterLab 中使用 plotly.py v3.0 可以做些什么。你可以在你的笔记本上得到帮助,制作一些非常酷的小部件。如果你还没有切换到在 JupyterLab 中运行你的 Juypter 笔记本,这可能是你需要的推动力。😃

PSA:当你使用颜色时,考虑一下色盲人群的可及性。使用色盲友好的调色板很容易。这是我从 ggplot 中采纳的一个。

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

Color swatch

color_list = ["#E69F00", "#56B4E9", "#009E73", "#F0E442", "#D55E00", "#0072B2",  "#CC79A7"]

我写关于数据科学、Python 和 DevOps 的文章。查看我的文章这里如果你对这些感兴趣的话,注册我的时事通讯

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

快乐的阴谋!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值