优化器是 TensorFlow 的开胃菜
Photo by Patrick McManaman on Unsplash
随着大量深度学习框架的兴起,训练深度学习模型变得日益容易。TensorFlow 就是这样一个框架。
尽管最初只在谷歌内部使用,但它在 2015 年被开源,此后一直是 ml 爱好者和研究人员使用最多的框架之一。
但是不管这个框架对我们有多大帮助,还是有一些超参数会对我们训练的模型产生重大影响。改变一个超参数,也就是说,tensorflow 中的一行代码可以让你从 70%的准确率达到最先进的水平。
在 TensorFlow 中,为了调整我们的模型,我们必须做出一些优化选择。正如该领域的许多领导者所说,机器学习是一个高度迭代的过程。选择超参数没有硬性规定。你必须遵循这个过程
试→调→提高→试→调→提高→试→
在使用 TF 时,您会遇到两个重要的超参数。他们是初始化器和优化器。
想象一下“ 成本山 ”。
我们的目标是到达成本山的底部。
The “cost hill”
把初始化器看作是你开始下坡路的起点。和优化器作为你走下坡路的方法。
初始化器用于初始化我们神经网络各层之间的权重。虽然我们可能会认为它们只是我们探索“成本山”底部之旅的随机起点,但它们远不止看上去那么简单。
阅读这篇关于为什么初始化如此重要的博客。
最近,神经网络已经成为几乎所有机器学习相关问题的解决方案。仅仅是因为…
towardsdatascience.com](/random-initialization-for-neural-networks-a-thing-of-the-past-bfcdd806bf9e)*
然后我们有优化器。它们被用来决定我们下坡的步伐。我们可以通过三种主要方式实现这些跨越。
- 批量梯度下降
2.小批量梯度下降
3.随机梯度下降
我们培训流程中的一个步骤包括以下内容:
正向传播→寻找成本→反向传播→寻找梯度→更新参数
批量梯度下降是指我们的整个训练集(即:我们的“m”个训练示例中的每一个)用于上述步骤。对“m”个训练样本进行前向传播,计算成本,对所有“m”个训练样本进行后向传播。对所有“m”个训练样本计算梯度。并且参数被更新。
简而言之,在向成本山的底部迈出一小步之前,计算机必须经历所有的“m”训练示例。当训练集示例的数量很小时,比如说在 1000 到 5000 之间,这是理想的。但在通常包含数百万训练样本的现代数据集上,这种方法注定会失败。原因是缺乏计算能力和磁盘空间来一次性计算所有的训练集示例。毕竟,我们只能朝着“成本山”向下迈出一小步。
batch gradient descent as shown on a slide from Andrew N G’s machine learning course on Coursera
注意成本是如何均匀地直线下降到成本山的底部的。这是在梯度下降的每一步中使用我们所有的‘m’训练示例的优势。这是因为我们使用所有梯度的平均值来更新我们的参数,这将最有可能直接朝着最小成本的方向。
随机梯度下降是一种方法,在这种方法中,我们一完成对每个训练集示例的计算,就开始采取向下的步骤。这有助于我们通过使用来自每个训练集示例的梯度来更新参数,从而在向下的旅程中尽快取得进展。这样,我们将在整个训练集的一次通过中向底部迈出“m”步,而不是在批量梯度下降中仅迈出一步。
这种方法可以快速得出结果,但有两个主要缺点:
首先,由于我们的每个训练集示例都是不同的,对每个示例计算的梯度都指向不同的方向,因此我们不会直接朝着最小成本的方向前进,而是不一致地、有效地朝着最小成本的方向前进。因此,参数实际上永远不会达到最小成本点,而只会一直在它的附近盘旋。
随机梯度下降的第二个缺点是,我们将失去向量化对代码的影响。矢量化是深度学习的核心,这是我们的计算机能够以如此快的速度执行如此复杂的计算的原因。在随机梯度下降中,由于计算是在每个训练集示例上一个接一个地进行的,因此必须使用 for 循环来遍历训练集,与矢量化计算相比,这可能需要花费一生的时间。
this image shows stochastic gradient descent
请注意成本如何有效地朝着成本最小点前进,但不是直接到达那里。它也永远不会真正达到最低成本,它只能在自己的区域内循环。
https://www.facebook.com/convolutionalmemes/
这就是小批量梯度下降发挥作用的地方。它处于批量梯度下降和随机梯度下降之间最佳点。我们不想通过一次获取所有的训练样本来浪费计算能力和内存。我们也不想因为一次只取一个训练样本而失去矢量化的能力。所以我们一次取多个训练样本,通常是 2 的幂。通过这种方式,我们可以在遍历整个训练集之前开始采取向下的步骤,而且还可以利用矢量化的能力来实现快速计算和更少的内存需求。
这是通过将我们的训练集分成固定数量的样本来完成的。这个数字被称为批量。它通常是 2 的幂。32 和 64 是常见的批量大小。训练集首先被混洗,因为我们不希望在每个时期计算相同的批次(一个时期是一次通过整个训练集,一个迷你批次接一个迷你批次)。下面给出了将训练集分割成小批次的代码。
我在 TensorFlow 中训练了一个模型,使用时尚-MNIST 数据集识别 10 种不同类型的衣服。该数据集由 70,000 幅灰度图像组成。每张图片属于十类服装中的一类。
这是我在 GitHub 上训练过的模型的代码。
一如既往的快乐学习。
ps:忽略俗气的标题
混乱中的秩序(球体):流亡者动荡经济之路中的新兴模式
Path Of Exile: Necromancer
你可能听说过流放之路。一款由 Grinding Gear Games 发行的免费动作角色扮演游戏,让你扮演流亡者的角色。一个看似命运多舛的弃儿,因为各种各样的原因被逐出文明,这取决于你的角色的职业。这个游戏的重点是简单地通过世界上所有被称为 Wraeclast 的区域,并参与各种支线剧情(或者我们玩家喜欢称之为“残局”)
在你的 Wraeclast 之旅中,你会遇到数千种类型的战利品。一些物品,一些独特的物品,和许多不同的货币,允许你修改你的物品和技能。
Path of Exile: A few types of currency
《流放之路》的魅力之一就来自于这一大堆战利品,那就是交易。一些玩家投入大量的时间,甚至全部时间来交易。这些交易员怎么可能赚钱?他们如何跟随市场?当每天有成千上万的交易发生,有成千上万不同的商品被买卖时,交易者如何在混乱中找到自己的位置?
当然是数据科学!对于这个特别的项目,我使用了 GGG 的公共 API,做了大量的网络搜集工作。仅货币一项,我总共收集了近 6000 万个数据点。然后,我拿到了我最喜欢的六种货币的分布情况,其中包括令人垂涎的尊贵宝珠。
现在,看着这个分布,被高举的球体立即出现在我眼前,因为它接近于符合钟形曲线。所以我决定先探索一下。我用如下模式将我的数据框架中的所有货币分段
standard_league = currency_all.loc[currency_all.League == 'Standard']
abyss_league = currency_all.loc[currency_all.League == 'Abyss']
bestiary_league = currency_all.loc[currency_all.League == 'Bestiary']
delve_league = currency_all.loc[currency_all.League == 'Delve']
harbinger_league = currency_all.loc[currency_all.League == 'Harbinger']
incursion_league = currency_all.loc[currency_all.League == 'Incursion']
所以现在我们有了一个包含每个联盟所有货币交易的数据框架。但是我不想要所有的货币,我只想要那个高贵的球体。所以我再一次像这样分割数据帧。
exalted_standard = standard_league[standard_league['Buying(1)'] == 'Exalted Orb'].sort_values(by='Date').reset_index(drop=True)exalted_abyss = abyss_league[abyss_league['Buying(1)'] == 'Exalted Orb'].sort_values(by='Date').reset_index(drop=True)exalted_bestiary = bestiary_league[bestiary_league['Buying(1)'] == 'Exalted Orb'].sort_values(by='Date').reset_index(drop=True)exalted_delve = delve_league[delve_league['Buying(1)'] == 'Exalted Orb'].sort_values(by='Date').reset_index(drop=True)exalted_harbinger = harbinger_league[harbinger_league['Buying(1)'] == 'Exalted Orb'].sort_values(by='Date').reset_index(drop=True)exalted_incursion = incursion_league[incursion_league['Buying(1)'] == 'Exalted Orb'].sort_values(by='Date').reset_index(drop=True)
现在,我们有了每个联盟的每个尊贵球交易的数据框架。在这一点上,我决定把我的数据制成图表,把日期作为我的 x 轴,把它卖出的混沌球的数量作为我的 y 轴。
从图表上看,每个联盟都出现了一个非常清晰的模式。对于新联盟的前三分之一,尊贵球体的价格急剧上升。对于联盟的其余部分,它开始正常化。这种模式在六个不同的新兴经济体中持续了整整一年。这是一种模式,将继续重复自己,直到崇高的球体变得无关紧要,虽然我没有预见到这种情况会发生。
这种模式不是尊贵的球体独有的。虽然不是所有的货币,但这种现象在许多货币中都存在。这里有另一个货币的例子,你可以在前两周购买/耕种,并获得可观的利润(与其初始联盟价格成比例)。在所有联盟中,它都有一个非常相似的模式。
那么,怎么才能赚钱呢?好吧,如果你只经营高贵的球体,你会在联赛的前两个星期购买高贵的球体,然后在顶峰时卖掉它们。
无论如何,如果你能以少于 120 个混乱之球获得尊贵之球,你将会获利。正如你所看到的,标准联盟,这是持久的,有一个强大的货币基线。你可以对游戏中的任何货币这样做。虽然肯定有一些货币你不会从中获利。
我们可以利用这种知识,这种对模式的认识来将我们的收益资本化,并防止在不正确的时间段买卖货币类型。感谢您的阅读,我们在 Wraeclast 再见!
组织与创造
我一直想写更多,但直到几周前我还没有时间。这是真的,不仅仅是写作,还有很多我想做的长期项目。这篇文章探讨了为什么——如果你有自己的长期项目,并且想继续下去,这可能会帮助你理解为什么你还没有开始,从而尽快开始。
人们很容易指责拖延的通常来源,从完美主义到懒惰,因为没有从事长期项目。但是还有更深层的原因:从事这类项目是一种与我们通常所认为的“工作”完全不同的工作,需要一种完全不同的时间管理方法来完成。
组织工作与创造性工作
工作可以有一个范围,从需要反复做同样事情的根本不经思考的工作到需要综合信息和想法的根本创造性工作。
在白领环境中,重复性的工作可能是一遍又一遍地将文件指向文件夹或从文件夹中拖出;在蓝领背景下,可能是开卡车。
人们普遍认为,所有这类工作最终都将实现自动化。在某些情况下,这将在明年的这个时候发生,在其他情况下,这将需要 30 年,但在所有情况下,计算机最终将被编程来完成这些任务。许多作者已经写了如何最大化生产力,你应该尽可能减少你做的这种工作的数量——考虑到这种工作在其他地方受到的待遇,我不会在本文的剩余部分集中讨论这种工作。
另一端是基本的创造性工作,期望的结果是意想不到的、新奇的或明显的“人”。写一首其他人会喜欢的诗或文章,或者构思、设计并编写(部分)解决人类基本问题的应用程序就是这样的例子。人们普遍认为,这种工作是你所能做的最具挑战性但又最有成就感的工作之一,而且几乎从定义上来说,这是最难的一种教人如何做或给计算机编程的工作。我们推迟的大多数长期项目也属于这一类。
中间的工作类型是白领工作中花费大部分时间的类型,很少被检查:基本上是“组织”任务。在这些任务中,你想要的结果很容易理解或解释——在这些任务中,其他人可以很容易地评估你是否完成了你想要的目标。
几乎我们所有人在这里花费的时间都比我们意识到的要多。例如,虽然开发人员喜欢以不同的方式思考,但事实上大多数编码都属于这一类。虽然从字面意义上来说,编码确实涉及“创造”一些新的东西,也涉及使用高度专业化的技能,这可能是非常高的需求,但编码人员花大部分时间做的事情是考虑“打点一切”,以这样一种方式,计算机可以执行他们试图让它执行的东西。
在其他白领工作中,被认为是“工作”的任务,比如回复电子邮件(现在是 Slack messages),在电子表格上组织分析,当然,参加会议,本质上只是“组织”——清理刷子,以便你或你的团队可以完成重要的实际工作。
请注意,不仅仅是个人和组织应该在创造性工作上花尽可能多的时间,在组织工作上花尽可能少的时间。例如,我认为创建引人注目的 PowerPoint 演示文稿是一项基本的创造性任务,尽管花费数小时创建并讨论 PowerPoint 被广泛认为是低效的时间利用。相比之下,虽然调试代码主要是组织性的,但它可能非常有价值,许多老组织旗下的投资雇佣和开发优秀的程序员。一个并不比另一个“更好”(尽管我们都知道有些人似乎只完成组织任务,因此总是很忙,但仍然“什么也做不了”)。这篇文章的重点不是贬低组织工作,而是指出为了完成的创造性工作,你必须首先意识到你花时间做的大部分事情实际上是基本的“组织”工作。
下一步是要认识到,从做组织工作到做创造性工作需要一种不同的方法来管理你工作的时间。这是为什么呢?关键的区别在于,在组织工作中,你不需要特别考虑时间管理。你大部分时间都可以在工作中“埋头苦干”。你可以休息一下,返回,然后在十秒钟内回到你离开的地方。上下文切换的成本很低——你可以回复一封电子邮件或一条短信,然后马上回到你离开的地方。
创造性的工作——比如设计一个应用程序,写一篇文章,或者做一个向他人教授某个主题的演示——是不同的。你需要一段时间才能“进入状态”。它包括即使在处理具体细节时,也要牢记大局。你需要长时间不被打扰,不做其他事情。
一幅插图
在我职业生涯的前 3-4 年,我和大多数大学毕业后的白领工人相似,因为我的工作基本上是组织性的。
我从事咨询工作,在 Excel 中做各种分析,并根据这些分析制作幻灯片。虽然在商业世界中有一些创造性思维和大量接触各种决策者的机会,但大部分工作基本上都是组织性的。我的下一份工作也有同样的正面和负面影响,那是在 Capital One 的内部咨询部门工作。即使在 Trunk Club 开始担任数据科学家,在更具创造性的领域工作并实施尖端技术(使用 Python 为监督学习算法编写机器学习管道)后,大部分工作仍然是有组织的,在工作的演示和交流中有一些创造性的成分。
我过去四个月的工作是在 Metis 担任高级数据科学家,教授全职沉浸式数据科学项目——这份工作比我以前的任何工作都涉及更多“创造性”工作。
这里有一个例子:两周前,我必须想出一个令人难忘的方法来教学生 Selenium,他们最终使用这个库创建了一些惊人的webscraping项目。
首先,我必须想出一个用代码似乎不“可行”的想法,并且适用于他们的日常生活——我决定向他们展示如何使用 Python 代码在 OpenTable 上进行预订。然后,我必须安排讲座,从一个简单的例子开始,逐步增加到一个更复杂的例子——在这里,我得到了 Metis 非常好的预制教学资源的帮助——在我进行的过程中,思考什么对学生来说是清楚的,什么是具有挑战性的。当解释不同的主题时,即使弄清楚细节和类比的水平也是一个挑战,这本身就可能是学生在整个项目中广泛使用图书馆或害怕使用图书馆的区别。
此外,作为 Metis 讲师工作的一部分,我们需要发展成为数据科学方面的“T0”思想领袖——在当地集会和全国会议上演讲(我的合作老师 5 月在 ODSC 东部演讲,我将于 11 月在 ODSC 西部演讲),撰写关于数据科学、商业和时间管理的中型帖子——这些都是创造性的任务。
当我说这项工作是“创造性的”时,我的意思是它结合了技术和移情思维,创造了一些新的东西来解决“问题”,无论该问题是“教授数据科学学生网络搜集”还是“写一篇关于工作类型和时间管理的令人信服的文章”。我并不认为这项工作与构思和写作伟大的美国小说处于同一水平——但尽管程度不同,性质相同,因为它需要同样的“深入”思考。因为这项工作需要“深入”的思考,你不能简单地“埋头苦干”——在工作和其他事情之间切换,在工作的时候回复懈怠的信息,等等。
一个解决方案
那么:你应该如何管理你的“工作”时间来完成这项创造性的工作呢?我的解决方案是安排“无其他时间”:至少半个小时的时间,不允许我做任何其他事情。不查邮件,不回短信,不被其他“紧急”的事情分心。
这与我过去的工作方式大不相同。我曾经不断地在工作和检查电子邮件或懈怠之间切换,发送文本,处理现代生活的所有干扰(包括但不限于社交媒体)。事实上,在你的工作基本上是组织性的工作中,这是可以的——它甚至会让人感觉非常有效率,因为发送电子邮件和短信是一种“完成事情”的形式!事实上,从事创造性项目最初会感觉效率较低,因为它们的本质使得它们很慢,需要大量的修改——然而,如果你能花 10 分钟回复那封邮件,你就可以“从待办事项清单上划掉一些事情”!但是,如果你想从事创造性的工作,你必须打破这种工作习惯。安排“没有别的时间”是我做这件事的一种方式。
虽然可能有外部因素——无论是家里的家庭还是工作中不断开会的文化——阻止我们腾出时间进行创造性工作,但通常主要的障碍是我们自己的习惯。如果我要给出如何改变你的工作习惯以完成更有创造性的工作的第一步,那就是:安排至少半个小时(把它放在你的日历上)你不会查看电子邮件、社交媒体或做任何其他事情的时间,并在这段时间工作。当然,你可以“优化”这半小时,比如在工作时喝防弹咖啡或听完美的“生产力”播放列表,但所有这些优化都是次要的。最重要的是安排好时间,在这段时间里不要做其他事情。这就是我最终能够腾出时间开始在媒体上写作的原因。
安排这个时间是我发现的唯一打破“不断工作”和“感觉富有成效”的习惯的方法,通过做组织性的任务,比如回复电子邮件。我希望它对你有用;尝试一下,这样你就可以腾出时间来做你一直想做的创造性工作。
组织你的第一个文本分析项目
使用自然语言工具发现会话数据。
文本分析或文本挖掘是使用各种方法、工具和技术对自然语言文本中包含的“非结构化”数据进行分析。
如今,文本挖掘的流行是由统计数据和非结构化数据的可用性推动的。随着社交媒体的日益流行,以及互联网成为各种重要对话的中心位置,文本挖掘提供了一种低成本的方法来衡量公众意见。
这是我学习文本分析和写这篇博客并与我的数据科学家同事分享我的学习的灵感!
我这篇博客的主要参考是 DataCamp 设计精美的课程文本挖掘——单词袋。
下面是文本挖掘项目的六个主要步骤。在这篇博客中,我将关注第 3、4、5 和 6 步,并讨论 R 中可用于这些步骤的关键包和函数。
1.问题定义
确定任何项目的具体目标是项目成功的关键。人们需要对领域有所了解,才能恰当地定义问题陈述。
在这篇文章中,我会问,根据在线评论,亚马逊和谷歌的薪酬水平更高,根据当前员工的评论,哪家的工作生活平衡更好。
2.识别文本来源
可以有多种方式来收集员工评论,从 Glassdoor 这样的网站,甚至是与工作场所评论一起发布的文章,甚至是通过员工的焦点小组访谈。
3.文本组织
这涉及到清理和预处理文本的多个步骤。R 中有两个主要的包可以用来执行这个: qdap 和 tm 。
要点记住:
- tm 包处理文本语料库对象
- qdap 包直接应用于文本向量
x - >对亚马逊有正面评价的向量
*# qdap cleaning function* > qdap_clean <- function(x) {
x <- replace_abbreviations(x)
x <- replace_contractions(x)
x <- replace_number(x)
x <- replace_ordinal(x)
x <- replace_symbol(x)
x <- tolower(x)
return(x)
}
- *根据具体要求,您还可以在上述功能的基础上增加更多清洁功能。
语料库->v corpus(vector source(x))
然后使用 tm_map() 函数——由 tm 包提供——对语料库应用清理函数。将这些函数映射到一个完整的语料库使得清洗步骤的缩放变得非常容易。
*# tm cleaning function*
> clean_corpus <- function(corpus){
corpus <- tm_map(corpus, stripWhitespace)
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removeWords, c(stopwords("en"), "Google", "Amazon", "company))
return(corpus)
}
单词词干和使用 tm 包完成句子上的词干
tm 包提供了 stemDocument() 函数来获取单词的词根。这个函数要么接受一个字符向量并返回一个字符向量,要么接受一个 PlainTextDocument 并返回一个 PlainTextDocument。
*# Remove punctuation*
> rm_punc <- **removePunctuation**(text_data)
*# Create character vector*
> n_char_vec <- **unlist(strsplit**(rm_punc, split = ' '))
*# Perform word stemming: stem_doc*
> stem_doc <- **stemDocument**(n_char_vec)
*# Re-complete stemmed document: complete_doc*
> complete_doc <- **stemCompletion**(stem_doc, comp_dict)
点记:
定义您自己的 comp_dict ,这是一个自定义词典,包含您想要用来重新完成词干的单词。
4.特征抽出
在完成了对文本的基本清理和预处理后,下一步就是提取关键特征,可以通过情感评分或提取 n 元图并绘制的形式来完成。为此,术语文档矩阵 (TDM)或文档术语矩阵 (DTM)函数非常方便。
*# Generate TDM*
> coffee_tdm <- **TermDocumentMatrix**(clean_corp)
*# Generate DTM*
> coffee_dtm <- **DocumentTermMatrix**(clean_corp)
要点记住:
当你要复习的单词比文档多的时候,你可以使用 TDM,因为阅读大量的行比阅读大量的列更容易。
然后,您可以使用 as.matrix ()函数将结果转换成矩阵,然后对这些矩阵的各个部分进行切片和检查。
让我们看一个为二元模型创建 TDM 的简单例子:
为了创建一个二元模型 TDM,我们使用 TermDocumentMatrix ()以及一个接收控制函数列表的控制参数(更多细节请参考 TermDocumentMatrix )。这里使用了一个名为标记器的内置函数,它有助于将单词标记为二元模型。
*# Create bigram TDM*
> amzn_p_tdm <- TermDocumentMatrix(
amzn_pros_corp,
control = list(tokenize = tokenizer))*# Create amzn_p_tdm_m*
> amzn_p_tdm_m <- as.matrix(amzn_p_tdm)
*# Create amzn_p_freq*
> amzn_p_freq <- rowSums(amzn_p_tdm_m)
5.特征分析
有多种方法来分析文本特征。下面讨论其中的一些。
a.条形图
*# Sort term_frequency in descending order*
> amzn_p_freq <- sort(amzn_p_freq, decreasing = TRUE) >
*# Plot a barchart of the 10 most common words*
> barplot(amzn_p_freq[1:10], col = "tan", las = 2)
b.WordCloud
*# Plot a wordcloud using amzn_p_freq values*
> wordcloud(names(amzn_p_freq), amzn_p_freq, max.words = 25, color = "red")
要进一步了解绘制 wordcloud 的不同方法,请参考这篇文章,我发现它相当有用。
c .聚类树状图
这是一个简单的聚类技术,用于执行层次聚类并创建一个树状图来查看不同短语之间的联系。
*# Create amzn_p_tdm2 by removing sparse terms*
> amzn_p_tdm2 <- removeSparseTerms(amzn_p_tdm, sparse = .993) >
*# Create hc as a cluster of distance values*
> hc <- hclust(dist(amzn_p_tdm2, method = "euclidean"), method = "complete") >
*# Produce a plot of hc*
> plot(hc)
你可以在整个树形图中看到类似的主题,如“巨大的利益”、“高薪”、“聪明人”等。
d .单词联想
这用于检查出现在单词云中的顶级短语,并使用来自 tm 包的 findAssocs() 函数找到相关术语。
下面的代码用于查找与亚马逊正面评论中最频繁出现的词语最相关的单词。
*# Find associations with Top 2 most frequent words*
> findAssocs(amzn_p_tdm, "great benefits", 0.2)
$`great benefits`
stock options options four four hundred vacation time
0.35 0.28 0.27 0.26
benefits stock competitive pay great management time vacation
0.22 0.22 0.22 0.22> findAssocs(amzn_p_tdm, "good pay", 0.2)
$`good pay`
pay benefits pay good good people work nice
0.31 0.23 0.22 0.22
e .比较云
当您希望一次检查两个不同的单词库,而不是分别分析它们(这可能更耗时)时,可以使用这种方法。
下面的代码比较了对谷歌的正面和负面评价。
*# Create all_goog_corp*
> all_goog_corp <- tm_clean(all_goog_corpus) > # Create all_tdm
> all_tdm <- TermDocumentMatrix(all_goog_corp)
<>
Non-/sparse entries: 2845/1713
Sparsity : 38%
Maximal term length: 27
Weighting : term frequency (tf)
*> # Name the columns of all_tdm*
> colnames(all_tdm) <- c("Goog_Pros", "Goog_Cons") > # Create all_m
> all_m <- as.matrix(all_tdm) > # Build a comparison cloud
> comparison.cloud(all_m, colors = c("#F44336", "#2196f3"), max.words = 100)
f .金字塔图
金字塔图用于显示金字塔(相对于水平条)图,有助于根据相似的短语进行简单的比较。
下面的代码比较了亚马逊和谷歌正面短语的出现频率。
*# Create common_words*
> common_words <- subset(all_tdm_m, all_tdm_m[,1] > 0 & all_tdm_m[,2] > 0)
> str(common_words)
num [1:269, 1:2] 1 1 1 1 1 3 2 2 1 1 ...
- attr(*, "dimnames")=List of 2
..$ Terms: chr [1:269] "able work" "actual work" "area traffic" "atmosphere little" ...
..$ Docs : chr [1:2] "Amazon Pro" "Google Pro"
*# Create difference*
> difference <- abs(common_words[,1]- common_words[,2]) >
*# Add difference to common_words*
> common_words <- cbind(common_words, difference) > head(common_words)
Amazon Pro Google Pro difference
able work 1 1 0
actual work 1 1 0
area traffic 1 1 0
atmosphere little 1 1 0
back forth 1 1 0
bad work 3 1 2
*# Order the data frame from most differences to least*
> common_words <- common_words[order(common_words[,"difference"],decreasing = TRUE),]
*# Create top15_df*
> top15_df <- data.frame(x = common_words[1:15,1], y = common_words[1:15,2], labels = rownames(common_words[1:15,]))
*# Create the pyramid plot*
> pyramid.plot(top15_df$x, top15_df$y,
labels = top15_df$labels, gap = 12,
top.labels = c("Amzn", "Pro Words", "Google"),
main = "Words in Common", unit = NULL)
[1] 5.1 4.1 4.1 2.1
6.得出结论
基于上述视觉(“共同语言”金字塔图),总体而言,亚马逊看起来比谷歌有更好的工作环境和工作生活平衡。亚马逊的工作时间似乎更长,但也许它们为恢复工作与生活的平衡提供了其他好处。我们需要收集更多的评论来做出更好的结论。
所以,最后我们来到这个博客的结尾。我们学习了如何组织我们的文本分析项目,清理和预处理中涉及的不同步骤,以及最终如何可视化功能并得出结论。我正在完成我的文本分析项目,这是基于我的博客和从 DataCamp 学到的东西。我将很快贴出我的 GitHub 项目库来进一步帮助你。我们的下一个目标应该是进行情感分析。在那之前继续编码!!
希望你喜欢这个博客。请在我的下一篇博客中分享你喜欢的内容和希望我改进的地方。
请继续关注这个空间,了解更多信息。干杯!
(首发@www.datacritics.com)
缩小纽约市的技能差距
原载于 画面 社区
D 没有数据可视化,数据分析仍然不完整。
在为期 8 周的数据分析课程中,我很快理解了 Tableau 是一个非常有用的工具,可以用来创建和解释一个严重依赖于大数据的视觉故事。作为一名学生,我得到了 x 案例,这些案例需要数据检索、清理、处理和分析,以便提出适当的建议。
首先,我拥有金融和国际银行的双学位,并对数据分析有所了解。Tableau 的特点不仅易于理解,而且使用简单。从 Excel 到 R 再到 SQL,最后到 Tableau 的有趣旅程是一次很棒的经历,在我的课程结束后,我很兴奋地分享了一个严重依赖 Tableau 的项目。
我把这个项目分成了四个部分
- 这个问题
- 答案
- 该过程
- 调查结果
3.局限性
4.结论
我首先研究了这个问题,了解了缺少什么数据,并试图在我的 SQL 工作台中检索和创建一个实体关系图。由于重点是纽约市-MSA 地区,后来又将其削减至仅纽约市,我必须确保我筛选的数据仅反映了问题所在。我的发现是基于这些数据以及它们被分类和清理的方式。根据检索到的数据,我注意到各州技能的供需不匹配。我的 Tableau 工作表还查看了 11 个州的平均发布持续时间,我保持在 35 天。
下表总结了平均持续时间(以天为单位),并将其与所有州的职位发布百分比进行了比较。
问题
布鲁金斯学会最近对 Burning Glass 数据的研究发现,在全国范围内,STEM 职位空缺的广告持续时间中位数是非 STEM 职位空缺的两倍多。这个案件围绕着教育和领先的劳动力市场分析公司——燃烧的玻璃公司正在进行的辩论。该案件旨在-
该案件旨在-
- 评估纽约市技能差距
- 向纽约市技能联盟(NYCSC)提供数据驱动的建议
- 帮助在十年内拨款 1 亿美元用于发展纽约市的劳动力。
据全国独立商业联合会T21:
截至 2017 年第一季度,45%的小企业报告称,他们无法找到合格的申请人来填补职位空缺。
答案
为了评估城市的技能,详细的路线图需要联邦、州和私人基金会的合作努力。为了回答这个问题,我首先处理数据,然后根据调查结果看一些建议性的措施。
流程
在进入数据集之前,我首先试图理解技能差距的含义以及它为什么存在。简而言之,它是可获得的工作的需求和供应与理想候选人所需的必要技能之间的差异。由于各种因素,包括工作机会不足和缺乏适当的技能组合,这些差距有时会存在。
数据是 CSV 格式,有不同的职业,技能,县。重复项被删除,N/A 值被转换为空值。
使用 MySql Workbench 创建了一个实体关系图(ERD ),以便使用主键和外键对数据进行排序和连接。
调查结果
创建 ERD 后,我查看的信息仅限于纽约市。纽约市的五个县是布朗克斯、金斯、纽约、皇后区和里士满。我使用 R 来执行这个任务,并利用可用的数据,使用 Tableau 创建一个热图。数据显示,纽约市的职位发布数量最多,然后,我将重点放在纽约、新泽西和宾夕法尼亚三州的职位发布百分比上,以分析纽约的情况。
Tableau 中的这些发现如下
然后,我试着深入了解某个职位空缺需要多长时间。为此,我按职业(仅针对纽约市)将职位发布数量与平均职位发布时长进行了比较。我的发现表明,纽约市的缺口主要是由缺乏具备特定技能的工人造成的。MSA 地区代码是 234。
纽约的顶级职位来自三个行业:医疗保健、信息技术和金融会计。我试着使用 Table 创建一个气泡图来查看热门职位。(点击下图放大)
然后对纽约的顶级工作进行深入分析,我试图通过编辑经验水平、教育程度、证书名称来做到这一点。相应地,我会查看职位的数量以及这些职位发布后未被填补的平均天数。调查结果如下
1。医疗保健行业
医疗保健行业似乎对护理经理和注册护士的需求最大,下面列出了这些职位所需的证书。培训缺口很有可能是由于护理经理和注册护士没有必要的证书,使他们没有资格申请职位。
(点击下方放大图片)
2。金融业
通过 Tableau 查看可用数据并简化视觉效果,我的发现表明,对具有会计背景的入门级财务分析师和具有 3-5 年工作经验的税务经理有巨大的需求。仔细看,注册会计师和注册金融分析师课程是金融分析师寻求弥合技能差距的热门选择。
(点击下方放大图片)
3。信息技术产业
第三个可以从资金中获益的行业是信息技术行业。
通过数据排序,并在 Tableau 的帮助下,我能够直观地看到可能受益的顶级职位是商业智能分析师、it 项目经理、软件开发人员/工程师和系统分析师。对这些头衔的这种需求意味着两件事:要么是巨大的需求也能很快得到满足,要么是缺乏技能,这可能导致招聘进展缓慢。
就 IT 行业而言,后者似乎是正确的。仔细观察,可以得出这样的结论:像系列 7,项目管理认证(PMP)等证书将增加简历的价值的职位需求很高。虽然这对于处于中高层的人来说可能是正确的,但在早期阶段获得这样的证书可能会让一个值得的候选人在招聘名单上名列前茅。
(点击下方放大图片)
但是这个百万美元的问题仍然存在:在技能差距分析之后,地方当局可以采取什么样的建议性措施来缩小差距,使纽约市的就业率上升。经过彻底的文献回顾,我设计了几个步骤作为建议性措施,可以让企业、政府以及非营利组织更多地参与进来。
***** 表示支付有竞争力的薪酬可能是一种建议性措施,但所用数据可能/可能不支持这一点。这一措施是基于广泛的二手文献。
局限性
像大多数情况一样,所提供的数据受到一些限制,可能/可能无法确定上述措施。考虑的最大限制之一是数据的年份。由于没有提供年份,这一发现可能意味着 2016 年或 2017 年不成立。此外,在清理和分类时,无法获取有多少在职人员、失业者或劳动力中的工人拥有填补需求岗位所需的技能。当清理后的非结构化数据包含形成强大分析所需的必要组件时,可以做出谨慎的决策。从数据来看,工资没有被考虑在内,因为它很少,而且仅仅是因为缺少日期,很多数据都丢失了。由于没有可能影响数据集的实时信息或附加信息,建议也可能不同。
有时,行政管理的变化允许新的劳动法律法规生效。通过发送的数据给出的建议也可能不同,因为对实时信息或附加信息没有责任。我也观察了纽约市的整个城市,但我确信还有进一步分析的空间,观察单个县可能会显示技能差距的变化。
结论
参考文献
- 哥伦比亚大学在线图书馆
- “特朗普推进就业培训,将‘技能差距’辩论推向前台”——《纽约时报》,2017 年
- Inc.com&彭博
- 美国达拉斯联邦储备银行
- 图片提供:知识共享/Flickr/Instagram
- 白皮书:“工作中的新技能:缩小技能差距”
- 白皮书:“通往繁荣之路:迎接挑战,让美国年轻人为 21 世纪做好准备”
- 未来的工作
池塘的另一边,路的另一边
我刚从苏格兰出差回来,我觉得讨论自动驾驶汽车在不同国家之间的差异会很有趣。从美国到英国有一个非常明显的区别——汽车在路的另一边行驶!但是还有许多其他重要的不同之处。
在美国,如果你来到下面这条路,你可能会认为它是单行道。
All white lines in the US would indicate one-way…
但是你错了。
White lines in the UK can also separate driving directions.
在美国,白线通常用于指示你右边的道路外侧(在英国,人们天真地认为它会指示左边的道路),白色虚线指示同一方向的其他车道。黄线是用来指示你的方向和相反方向的车道之间的界限。英国用稍微长一点、近一点的白线来表示行驶方向的不同,用黄线来表示“禁止等待”区域。
The shorter lines are for lanes in the same direction, the longer ones separate directions.
Notice the yellow lines on the outside, indicating a no waiting area.
当然还有下面的弯曲线,我以前从未见过,但显然是向司机表明他们正在接近人行横道,除非允许行人穿过,否则不允许在该区域停车。
Approaching a pedestrian crossing
我错过了另一个不同之处的照片,这一次是刹车灯——英国使用(在我看来非常有用)一种在绿灯之前发出红色和黄色光的灯。这有助于提醒驾车者是时候踩油门了(或者,似乎是为了说明更常见的手动变速器启动所需的时间)。
在美国,经常有没有完整车道标志的区域,比如下面,这里实际上是一条双向道路。
A two-way road with little room for error
鉴于最近关于沃尔沃与袋鼠之间的困难的新闻,我想我也应该分享下面的图片(再次是一条双向交通的道路——有弯道要通过)。无论汽车在哪里,识别动物路障都将是一个问题。
“Don’t mind us”
对于任何试图制造可在多个地点使用的无人驾驶汽车的公司来说,解决国家和地区之间的一些差异无疑是一个挑战。也许为长途旅行下载 GPS 地图也需要汽车为旅行区域下载不同的规则和感知模型。这将是一个很难解决的问题。
我们的人工智能创业公司
你好。我给你讲讲我们 AI 创业的故事吧。一路上我们犯了一些错误,我想你可能会从我们的故事中学到一些东西。
Me, walking along the beach in Israel, thinking about what to do next. My wife took the picture. Those are her shoes in my hand.
在过去的文章中,我谈到了为什么我们要启动我们的公司,我们对在人工智能咨询市场中的地位的感受,的客户在我们的领域中倾向于什么样子,我们如何看待我们的定价,以及更多关于机器学习前景和动态的内容。这篇文章应该填补缺失的环节,并解释我是如何进入这家初创公司的,以及公司的发展方向。
就人生规划而言,在全职工作的同时结婚生子,同时攻读硕士和博士学位,是非常愚蠢的。这…很有挑战性。我不能自己创业,因为我一个人做不起拉面这种有利可图的事情。
One big happy family
我妻子是全职妈妈,是学校董事会的指导顾问,在我像猴子一样在打字机前编程时,她通常管理整个房子。
生活太忙了。我不能开自己的公司。相反,我在别人的创业公司里工作过,并且过得很愉快。由于我父亲和他的朋友对高科技的投资,以及我岳父经销化学产品的生意,我得以在创业世界的幕后进行观察。我学到了很多。我的失败比我的成功更能说明问题。
With 3 kids and family responsibilities, you can’t really decide to “do your own thing”. This picture is from 2014.
我 2016 年在读博士,可以用兼职。我辞掉了全职咨询工作,专注于学业,靠我们积攒的一些积蓄生活。我不想完全离开行业,我在云计算/物联网领域有着良好的咨询历史,所以我和我的朋友 Mathieu Lemay 一起创办了一家咨询公司。我们知道我们会一起工作得很好,因为我们在以前的公司一起工作过,并且在很短的时间内完成了很多工作。我们开始把它作为一件次要的事情来做,它很快开始获得关注。因为我是兼职,马特是全职,我们把公司叫做勒梅解决方案咨询公司(最初只是勒梅解决方案)。自 2014 年 9 月 13 日起,马特就用 LemaySolutions.com 作为他的私人服务器,所以这个名字就流传了下来。在办公室,我们简称它为 LSCI。公司正式成立日期为 2016 年 6 月 22 日。
LSCI 是在一个车库里开始创业的。准确地说是我的车库。
Behind those tires was our first office space.
An empty desk is a sign of an empty mind?
Mathieu Lemay and I did the initial construction ourselves, and then had a professional do the rest. Materials came primarily from Home Depot. All said and done, we had installed electrical, drywall, a new 100 amp electrical panel, and much more.
公司的创始理念是 AI+IoT+云。我们的开销基本为零。最初,我们做任何有报酬的工作。我们有一份中文菜单,上面列有我们擅长的一切,基本上是寻找适合这些广泛能力的项目。我们可以做好一系列高端的事情。这包括设计和制作电路、固件、授权写作等等。但是我们的梦想是专业化。我有 3 个孩子,必须支付账单。慢慢地,随着时间的推移,我们将工作范围缩小到适合我们专长的领域。我们很专业。
营销渠道
我们从我的电子邮件、LinkedIn 和 facebook 上的联系人漏斗开始了我们的营销战略。我没有使用 ERP 或 CRM,而是使用 google sheets 的排序和过滤功能对线索进行优先排序,并通过个性化电子邮件与个人联系。我还在一个专门的专栏中跟踪线索状态。成功了。我们从未真正使用传统的在线营销策略。至少不是有效的。我浏览了一下我的联系人,在一个专门的栏目中标记了高价值的目标,并深入到我的人际网络中去建立业务关系。
A screenshot of the google sheets document I used as my funnel. This was the main marketing channel for our company for at least 6 months.
为了节省时间,我在电子表格中添加了一些智能功能。首先,我添加了深度电子邮件和域名验证(如这里所述的)。后来我按域名添加了过滤器,以确保我不会联系同一家小公司的几个人。
我也在创业会议上见过客户,后来通过 indeed.com 和 upwork.com 的 T2 等在线招聘平台。一些频道没有成功。例如,我们试图让 freelancer.com为我们工作,但是在那个网站上为演出支付的费用是不值得的。与其说它是一个专业服务承包网站,不如说它更像一个机械土耳其人。我们还没有试用过 toptal 和其他一些产品。所以,我们真的是在全力以赴,只是做那些现在对我们有用的事情。随着我们的成长,当然还有改进的空间。
整个 2016 年冬天,GPU 像额外的加热器一样温暖了车库。我们在室内穿着冬衣,尽管所有的加热器都在运转。原来我们的加热器接线错误…这不是一个最佳的设置。唯一的浴室在房子里,所以可以选择凌晨 3 点在灌木丛中撒尿,或者去地下室。我们基本上一天工作 12 小时,一周工作 6 天。与博士学位并行的是一片混乱。
记住我正在读完一个满是机器学习和扯皮小孩的博士(扯皮数据?)而整个咨询行业正开始腾飞。这是我在同一时期获得毕业生海报奖的照片:
在 Flickr 上探索 uOttawa Genie * Engineering 的照片。uOttawa Genie * Engineering 已经向 Flickr 上传了 4221 张照片。
www.flickr.com](https://www.flickr.com/photos/uottawa-genie-engineering/33157089394/in/album-72157679204310064/)
春天来了,我们让一只胖刺猬搬进了车库的地基下面。我们叫他“埃尔·丘伯”。苍蝇入侵,空调坏了。这一切变得难以处理。我们决定搬到一个真正的办公室。从好的方面来看,我们终于可以承担拥有自己空间的费用了。我们把服务器放在车库里,并搬走了“员工”和电脑。我们把焊接和其他电子设备放在车库里。现在是硬件办公室和服务器场。
作为创始人,我们一直有一个建立经常性收入的愿景;除了我们的小时工,还有被动收入。一位首席执行官最近给了我这个伟大的“写一次;“报价卖多了。这正是我们所希望的。我们总是给自己讲一个关于转向产品的故事。我们会从咨询中赚到足够的钱来停止咨询,只专注于产品开发。但是即使我们有很多很棒的产品想法,我们还是非常犹豫要不要推出我们自己做的东西。我们开发了 AVRA(基于我的论文)、 clockrr 、 genrush 和其他一些仍在秘密进行的项目,但从未鼓足勇气或努力进行真正的发射。我们总是有一些咨询的火要扑灭。我开始相信我们喜欢这样。
现金流方面的经验教训
我对咨询业的看法是,的工作需要 2 个月才能得到回报。如果您在每月的第一天(例如 1 月 1 日)开具发票,并在第一天(同一天)开始一个新客户,那么您将在下个月的第一天(2 月 1 日)向该客户发出第一张发票。对于 net 30 条款,您希望在下个月初(3 月 1 日)付款。所以第一个小时的努力的钱会在大约两个月的延迟后到达你的手中。至关重要的是,并非所有渠道都是这样运作的。例如,在 UpWork 上,我们得到报酬的速度要快得多。坏处是他们拿提成,但好处是他们“付出”更快。
几个月前,当一个客户意外延迟付款时,我们遇到了现金流问题,应收账款短缺 5 万美元。新客户的新收入抵消了延迟付款,但这是一个真正的警钟,即使在 2 个月的延迟后,你可能还要等待更长时间。在这种情况下,我从一位首席执行官那里听到的另一句话是:“有时你会成为一个非自愿的投资者。”
我们从现金流中学到的另一个教训是不规则支出。把这个世界看做 EBITDA ( 息税折旧摊销前收益)当然不错,但在现实生活中,你必须缴税。我们和公司一起进行年度税务计划,拿出 100%的钱来支付我们自己。税单到期了,我们银行里几乎没有钱来支付税款,同时也支付我们自己。我们基本上有足够的工资和税收。所以…我们基本上跳过了一个月的工资,以赶上税收。我们现在有一个每月的税收汇款计划,但这是一个真正令人大开眼界的教训。
现在让我们回过头来,记住我们不仅仅是一家普通的咨询公司。我们是一家 AI+cloud+IoT 的魔店。与洗车创业公司相比,我们有什么不同?我们有能力以大多数咨询公司不具备的奇特方式进行扩展。让我们从这个角度来看一下。
首先,我们是全球性的。尽管 LSCI 很小,但我们在英国、以色列、美国、加拿大等地都有客户。我实际上在非洲和印度勘探过 POC。这种地理范围让我们更有能力去争取合同。这也意味着我们可以说不,不用担心明天会吃不上早餐。
第二,我们可以用美元收费。随着加元的到位,这对我们和我们的客户都有好处。我们比我们的竞争对手(大型咨询公司)便宜得多,我们很容易说“四处打听报价”那些希望以冰价换取黄金的潜在客户,我们不会去追逐。现在,我可以很快判断出哪些潜在客户得到了价值主张,哪些没有得到。
第三,需求巨大。现在我们有了声誉,我们可以提高价格(已经这样做了 3 次)。在可能的情况下,我们转向更多的固定价格合同。当我们建立了一些信心后,我们开始向客户索要押金,以确保他们真的参与到游戏中。令人震惊的事实:客户的承诺意愿并没有明显变化。它只是赶走了那些不太认真的客户。仅仅因为在深度学习池中游泳,你就获得了疯狂的可信度。我们做深度学习的事情,正如我艰难地发现的,其他人假装他们做。一些咨询公司在他们的网站上发布他们做深度学习,语义嵌入,知识图表等。但是,当你让他们做一些事情的时候,你会发现他们在做实验,或者把工作交给研究生。正如我在以前的文章中所讨论的,这个领域如此热门,以至于为中型企业工作的人才非常稀缺。对于更大的(巨大的)企业,定价比我们的定价高得多,但有一组不同的公司,IBM/Accenture/PwC/Deloitte/Fujitsu/etc big fish,为这种级别的客户提供服务。
现在,除了我们从专业化中获得的优势之外,还有一些严重的劣势。
第一,高素质员工超级难找。我们不得不雇用高端开发人员来分包或全职工作。例如,除了创始人之外,我们还有一名博士和一名 CS 硕士。我们采访了一批硕士毕业生,并计划在未来一两周内增加一名。我们首先试图用本科生来做这项工作,但它完全是一团糟。就是不行。我们需要团队中的成年人能够做复杂的机器学习工作和做客户联络工作。所以,我们不得不雇用斯马特,我们做到了。我 100%肯定,随着我们在未来 12 个月内增加人员,我们将面临更多的可扩展性挑战。
第二,我们的规模还不够大,做不了耗费大量时间的 RFP,这才是真正的大钱所在。一家财富 1000 强公司的成功 RFP 可能比我们迄今为止所做的任何事情都要大,但考虑到投标这些东西需要 6 个月的努力,以及我们已经有业务进来的事实,我们还没有跳跃到投机建造 RFP。我们已经分包了我们不擅长的合同,这是我们目前所能处理的。我们确实通过与几个感兴趣的方面交谈试探了一下,但是我们的目光在时间线上变得呆滞。我们听到类似“这个项目将在 12 个月内完全确定下来”的说法呃。
第三,许多公司想要的东西不是微不足道就是不可能。与传统的编程不同,客户通常不明白这项技术能做什么,不能做什么。这种获得已关闭和已签署的工作说明书的障碍会阻碍我们任何项目的进展。
第四,光靠小时工我们无法发展业务。我们的模式是不加价。我们出售我们的时间,并将其他一切配置为直接从供应商(例如 AWS)向客户收费。我们不像人类那样出卖我们的工作时间。在一个像机器学习这样被大肆宣传的上涨市场中,我们应该疯狂增长。零工经济给了我们在第一年出现所需的规模。但是现在,已经是第二年了,我觉得我们在和一群找兼职的研究生竞争。我们是一群小鱼中的一条小鱼,都在争夺同样巨大的食物供应。早在我们开始做这件事的时候,我就以电视节目《西装》为公司的模型(但欺诈更少)。基本上,我们会是聪明的修理工程师,出卖我们的收费时间,作为救援消防员,去分散炸弹,跳到下一个合同。但是,没有计划能在与敌人的第一次接触中幸存。
I thought of our scrappy little firm as the engineer in C&C Red Alert 2, who parachutes in to fix stuff like new
The C&C Red Alert 2 Engineer. Yes, I became an engineer because I played a video game.
我认为我们的优势在于我们结合了机器学习的硬件专业知识,而收入增长将来自固定客户。但事实证明,我们的杀手级应用是面向中小型企业客户的多模式解决方案。很少有人知道如何将深度学习模型与单词嵌入模型混合,然后再插入知识图。在大数据上做更是难得一见的技能。我不知道我们是否会加入 RFP 的行列。相反,我认为我们将通过许可交易(第一笔交易已完成,即将发布)和在赠款支持下增加员工(第一笔交易已完成,即将发布),利用新的(最终)经常性收入来源来实现我们的增长战略。这些交易花了好几个月才完成,其他一些线索耗费了大量时间,却没有任何回报。这就是生活。
旅行=糟糕
作为一家咨询公司,我们也学到了很多关于如何旅行的经验。旅行耗费了大量计费时间。尤其是如果我们一起跳上飞机。尽可能避免旅行要好得多。或者只派一个人。马修·勒梅和我在比现在更早的时候旅行。去佛罗里达、加利福尼亚、纽约、蒙特利尔、多伦多等地的旅行。它会让你疲惫不堪。你会在时差和失眠上损失更多的时间。我的意思是,旅行不是完全可以避免的,但少即是多。马修·勒梅开车从渥太华到蒙特利尔去一个“更好”的健身房,所以我们并不是不旅行。一个很大的区别是马修·勒梅可以在飞机上工作,而我不喜欢那样。我顶多看飞行中的电影。《龟壳里的幽灵》,海洋奇缘:在 30000 英尺的高空,我两样都喜欢。比起其他航空公司,我更喜欢波特,所以我应该买他们的股票。哦,它们是私人的。太糟糕了。
结论?
我的目标不是某个巨大的出口,而是住在海滩上的度假胜地。我的目标是继续做我正在做的事情,并且做得越来越好。Mathieu Lemay 和我一直认为,我们在一个名为“AI startup”的街机游戏中投入了一枚硬币,我们仍然在游戏中。当我们到达越来越高的等级时,坏人会改变策略,任务会产生更多的硬币。我们只是紧紧抓住火箭船,希望在到达最后一关时,我们的名字能出现在高分榜上。
感谢让这一切成为可能的我们尊贵的客户们:谢谢你们!
我的妻子利奥拉和我的工作妻子马蒂厄·勒梅也是如此。你们都把农场押在了这个创业上。谢谢你的信任。
我写这篇文章是因为预计 Medium.com 会有 1000 名粉丝,现在我已经超过 900 名了。如果你喜欢这篇文章,那么请试试屏幕底部或左侧或右侧的新拍手工具。无论他们把它放在模板的什么地方。去吧。我也很高兴在评论中听到你的反馈。你怎么想呢?
编码快乐!
——丹尼尔
丹尼尔@lemay.ai ←打个招呼。
LEMAY . AI
1(855)LEMAY-AI
您可能喜欢的其他文章:
我们脆弱的大脑在客观分析方面很糟糕
科学家们不时遇到的一个问题是(有意或无意地)将数据引向他们希望的地方,而不是跟随数据走向它实际引导的地方。这不仅仅是因为骗子想出名:我们人类非常善于欺骗自己,以为自己懂得比实际多!
已经有很多关于人类大脑如何天生寻找模式的信息,这在很大程度上是因为我们的祖先需要在野外面对更大、更凶猛的捕食者才能生存。
If you’re alive today it’s because your ancestors were better at pattern recognition than Robert Muldoon
我对此最生动的体验是在大学的电子实验室。我们的任务是建立一个声音信号的光学发射器和接收器,基本上是一个激光收音机。我们根据在不同挑战性环境下接收信号的能力进行评分。
就像这堂课经常发生的情况一样,我和我的实验搭档忙着在不可能的短时间内完成实验,以至于我们有大约两天时间没有回宿舍。这是在每个人口袋里都塞满了音乐的日子之前,所以我们唯一带音频输出端口的测试声音来源是我的索尼 Discman 和它包含的单曲 CD,我当时最喜欢的专辑。
36 hours of one album on loop? Say it ain’t so!
我们不停地努力让我们的仪器工作,努力听毛衣歌曲或任何类似人类制造的噪音,以对抗从我们仪器的微型扬声器中发出的大量白噪声。我们大部分时间都在近乎完全黑暗的环境中工作,因为我们毕竟试图让音乐在闪烁的灯光下传播,而我们在构建音乐方面很糟糕,所以我们需要尽可能地发挥自己的优势。
最后我们听到“…没有人关心我的方式!”静电发出微弱的爆裂声,我们欢欣鼓舞!我们终于可以睡觉,吃饭,洗澡,并重新加入人类。
然后我们的一个朋友走过来,用手遮住了光接收器。我们一直听到这首歌。把他的手拿开,没有变化。挡住了闪烁的小灯。仍然听到这首歌。拔掉了灯。尽管如此,威泽还是滔滔不绝地讲述在车库里的快乐。
我们一直在单个试验板上工作,所以我了解了接地回路(基本上我们的发射器将信号泄漏到为接收器供电的电路中)。
在经历了许多恐慌和亵渎之后,在轮到我们在全班面前演示之前,我们让我们的设备工作了大约 10 分钟(这次是真的,伙计们)。成功!我们拿了 A-/B+,回家洗澡。
筋疲力尽的我脱下已经穿了大约 60 个小时的衣服,站在热水中。听到了。隐隐约约,但非常清楚,在水从淋浴喷头喷出的声音。
“在属于我的车库里…”
I heard Weezer in the shower (and all other white noise) for about a week
在过去的三天里,我基本上是在强烈的感官和睡眠剥夺中度过的,努力从静电的嘶嘶声中提取威泽的声音。我有效地重新编程了我的大脑,让它在噪音的海洋中倾听那个非常特殊的信号。
从那以后我就没听过蓝色专辑了。
在科学中,甚至有一个短语用来描述一个混乱无序的数据集,并试图清理它来描述一个连贯的画面。这被称为“按摩数据”,如果你是一个数据点,这听起来非常放松。
Unless you’re an outlier, in which case you get killed off (image courtesy of Osrecki, CC by SA-4.0)
处理数据实际上也很重要和有用!不一定不诚实。例如,您可以确定实验误差的来源并消除反映该特定误差的点,或者您可以执行其他分析来确定哪些是信号,哪些是噪声,以提高数据集的质量。只要你对你正在做的事情保持透明,并保留完整的、未修改的数据集,就没有问题。
当你最终从整块布中拼凑出一些东西,因为这是你期望看到的,问题就来了。就像听着威泽从莲蓬头里出来一周。
那门课教了我一些电子学、物理学和焊接方面的知识,却没有烧伤你的手指。
它还教会我合理地怀疑自己的感知。仅仅因为我完全确定我以某种方式看到或听到了什么,并不意味着那就是真实发生的事情。仅仅因为我看到了完全支持我的观点的模式,并不意味着它们真的存在,或者不需要或不需要其他观点。
毫无疑问,对于不加批判地相信我们的感官会带来的危险和非常真实的后果,我们可以从中吸取更多的人生教训。
但在当今大数据和分析驱动的商业文化中,还有一个非常特殊的因素。批判性地思考你所看到的模式,以及你认为数据告诉你什么。和其他人谈谈这件事,尤其是那些可能持怀疑态度的人。保持开放的心态,并准备好接受自己是错的。我们在实验室取得了成功,不是因为我们在认为已经完成时坚持己见,而是因为我们听取了我们得到的反馈并解决了真正的问题。
乔纳森是加州大学洛杉矶分校研究信息系统的助理主任。在获得斯坦福大学的物理学学位后,他在信息系统架构、数据驱动的业务流程改进和组织管理领域工作了 10 多年。他还是 桃子派应用工作室 的创始人,这是一家专注于为非营利和小型企业构建数据解决方案的公司。
通过民粹主义预测选举
民粹主义情绪可能会决定选举结果
我们已经到达了项目的终点,并且,恕我直言,我们发现计算社会科学在试图量化和合理化人类的复杂决策和行为时,需要大量的努力来重新解释和正确地制定数据分析以实现其基本目标。人、他们的想法和驱动力不适合量化的类别。然而,我们已经成功地达到了我们的目标。我们在整个欧盟范围内创建了一个民粹主义指数,并分离出表明民粹主义者的特征。虽然我们的结果可能会受到定性复杂性的影响,但我们发现它提供了对欧洲政治气候的丰富见解。
我们吸取的一个关键教训是,民粹主义是由对现有制度的经济和政治不满所催生的。当人们认为他们的经济利益因外部威胁而处于危险之中时,这些威胁可能是老牌精英或贫困移民的威胁,他们会变得更容易接受民粹主义信息。在我们的例子中,“民粹主义者”并不是一些与普通民众隔离的变异物种(正如我们在 K-Means 将民粹主义者从普通民众中分离出来的明显失败所表明的那样)。相反,正是普通人求助于民粹主义来解决他们的问题,因为他们对那些让他们远离物质福祉和民主机构感的机构感到失望。
结果
在法国,我们发现反民粹主义和民粹主义选民的比例分别为 56:44。因此,我们预计埃马纽埃尔·马克龙会在最近的法国大选中以这样的优势击败马林·勒·庞。令人惊讶的是。马克龙获得了总选民的 66%,表明法国选民比我们预测的更不倾向于支持极右翼。我们推测,这种差异可能是由于中右翼民粹主义选民不愿支持他们认为是古怪候选人的勒庞,和/或左翼和中间派选民反对反动政治的激增。
令人困惑的是,德国和西班牙的态度都比当前的政治表现更加极端,59%和 63%的选民坚决支持民粹主义。在西班牙,这可能显示出佛朗哥政权挥之不去的影响,该政权不鼓励极右政治选择的存在,同时吸引了许多中间偏右的人民党支持佛朗哥的国家保守主义。然而,在德国,正如宾尼格教授指出的,人们必须根据占主导地位的文化和社会态度将这些结果正常化,并确定政治态度是否发生了转变。正如传说和事实所言,德国人对自己和欧盟的经济前景都相当悲观,尽管他们反对采取极端措施来改变这一困境。因此,为了进一步分析,我们可以将这些数据与历史值进行比较,以观察潜在情绪的变化,这可能预示着民粹主义愤怒的爆发。
相反,我们发现整个东欧的民粹主义情绪得分出奇地低,最显著的是 Visegrád 集团,包括波兰、匈牙利、捷克共和国和斯洛伐克。根据我们的计算,即使维克托·欧尔班可能是全欧洲反对难民和外国融合的最极端的态度,也只有大约 30%的匈牙利人被预测为民粹主义者。这种不一致性也警告我们,盲目选择六个特征来决定民粹主义态度,而不根据每个国家的情况进行调整。在许多东欧国家,对现政府的高支持率可能对应着更大的而不是更小的民粹主义情绪。
毫不奇怪,我们观察到英国是民粹主义的大本营,揭示了英国退出欧盟挥之不去的怨恨。
我们发现最相关的关键特征(向调查对象提出的问题)是:
你认为过去 12 个月的总体经济形势有什么变化?
经济增长/衰退仍然是影响民粹主义诉求发展的关键因素。当一个国家面临经济衰退的危险时,选民开始拒绝建立政府机构来阻止这种恶化。
你对欧盟有什么看法?
如果一个人倾向于不信任欧盟,他们就会对试图阻止这一机构存在的政党更加敏感,从而倾向于选择批评现状的民粹主义政党,而不是社会自由主义政党。
你对政府有什么看法?
类似地,当选民无视自己的政府时,他们会通过选择民粹主义候选人来寻求“推翻”其执政的政治代表。
您对自己国家的民主运作方式有多满意?
类似地,那些认为他们的自由民主形式已经从根本上腐败的人倾向于寻求促进普通人意愿的替代方案。
总体而言,您认为【在此插入国家】在与其他国家的贸易中获益还是受损?
这一特征表明,经济因素在助长民粹主义情绪方面起着关键作用。当人们认为外国人在经济上损害了他们的利益时,他们会选择支持民粹主义政党,这些政党寻求恢复国家霸权以抵御外国(经济和社会文化)入侵。
你同意还是不同意下面的说法:“体制对像我这样的人不利。”
因为这一特征反映了个人自身的经济利益与统治精英的经济利益相冲突的观念,所以人们会认为反映这一观点的人非常容易接受民粹主义言论。
反民粹主义者和民粹主义者及其观点的分布可以用以下平行集合可视化来可视化:
这种形象化可以通过关注民粹主义者和反民粹主义者对每个问题的回答来解释。
这些功能如我们所愿地出现了。它们表明,我们基于投票历史和党派偏好的分析仍然紧紧抓住民粹主义的意识形态。这些特征表明,与社会文化不满相反,主要是经济和政治方面的不满推动了民粹主义情绪。这可能揭示了社会态度可能反映了各国当前的经济立场,为了减少民粹主义情绪,人们应该考虑促进国家之间的经济合作和纳入全体民众的全球一体化,而不仅仅是支持这些“既定精英”。
此外,通过使用这一数据预测未来选举结果,我们发现民粹主义虽然放大了其影响,但似乎还不能像推翻美国制度那样推翻欧洲制度。总之,我们发现我们的工作强烈地预示了一个国家内部的情绪。虽然存在混杂因素和一些异常值,但我们对整个欧盟民粹主义的理解似乎已经揭示了当前的政治气候。
我们的编辑团队
最后更新于 2022 年 12 月
我们来自许多不同的背景,并且有一个共同的承诺,那就是建立一个受欢迎的数据科学和机器学习社区。
Photo by Rodion Kutsaev on Unsplash
编辑
本胡伯尔曼 。主编。 Ben 于 2021 年加入 TDS,担任主编,他对数据科学和 ML 与社会、文化和环境问题的交叉方式特别感兴趣。他之前是 Automattic 的编辑部主任和 Longreads 的高级编辑。
凯瑟琳草原 。 **高级编辑。**大家好!我是凯西,2022 年 2 月加入神话般的 TDS 团队,担任高级编辑。我有地质学和工程学的学位,三十年的 IT、数据科学和技术写作经验。在加入该团队之前,我是加拿大化学工程杂志的执行主编。但是我的故事远不止这些!阅读更多
凯特琳·金迪格 。编辑。 Cait 于 2020 年 9 月加入 TDS 担任编辑。她拥有麦吉尔大学的英语学位,是一名记者和编辑。Cait 曾为许多媒体工作过,如 CityNews、麦吉尔论坛报、黑玫瑰图书和 Investopedia。尽管有非常以人文学科为中心的专业和学术背景,她对数字人文和数据科学非常有热情,特别是弥合技术知识和社会/文化问题之间的差距。阅读更多。
卢多维奇 。编辑。大家好!我是 Ludo,TDS 的编辑!我从 2015 年开始学习数据科学和机器学习,感谢这么多很棒的在线资源!数据科学可以触及和探索的各种领域(从生物学到外太空)让我爱上了这个领域。通过阅读我们作者的文章,我很高兴能继续从数据角度探索这些话题。
志愿编辑协会
。你好。我叫陈亦飞,是《走向数据科学》(TDS)驻多伦多的助理编辑。如果你想发表你对从数据科学到机器学习等主题的见解,TDS 是个不错的地方。关于我,我的热情是在生物信息学和计算生物学领域,尽管我的学术背景反映了医学科学课程。
****大卫·考克斯。嗨,大家好!人们叫我大卫,我在 2022 年 11 月加入了 TDS 团队。我的正规教育包括生物伦理学硕士、行为分析博士以及行为药理学、行为经济学和数据科学博士后。但是,我也是一个原始“哲学家”意义上的智慧爱好者,喜欢阅读和学习科学、技术、人类健康和福祉交叉领域的任何东西。我的工作热情围绕着“行为数据科学”。而且,我的爱好热情围绕着建造我们可以嵌入生物学习规则的机器人!阅读更多
安德鲁·德科蒂斯-莫罗 。嗨!我目前是一名高中物理和化学老师。我在蒙特克莱尔州立大学获得了化学和生物化学学士学位。我在宾夕法尼亚州立大学读了第一年的化学博士课程,在那里我学习了计算化学,我第一次体验了高性能计算。我最终回到了 MSU,拿到了化学硕士学位。
卢克·格洛格博士 大家好!我叫卢克,是开放地球基金会的气候数据工程师。我的工作是新兴的 web3 技术和气候科学的结合。我对全球碳循环也很感兴趣。我喜欢阅读/评论所有伟大的 TDS 文章,这让我每天都能学到新的东西。当我离开我的键盘时,我通常会出现在狗狗公园、唱片店或纽约附近的音乐场所。
晴古哈 。你好!我是亚马逊 Alexa 的应用科学家。我主要从事 NLU、ASR 和推荐系统的工作。在亚马逊之前,我作为深度学习工程师在 MathWorks 工作了 2 年,从事计算机视觉工具箱的工作。我有物理学博士学位,专攻弦理论。闲暇时,我喜欢徒步旅行和酿造啤酒。我目前在新罕布什尔州 4000 英尺的 24/48。在空闲时间,我在 Youtube 上制作深度学习相关视频。
优格 。大家好!我叫 Eugenia,是阿根廷布宜诺斯艾利斯的《走向数据科学》( TDS)的一名新编辑助理。我是生物学家,有免疫学博士学位。在学术界工作了 10 多年后,我转到了数据科学(DS)领域。我曾在非营利组织、教育、农业数据驱动的解决方案和大企业人工智能解决方案中工作。在我开始 DS 生涯的时候,我发现了 Medium 和 TDS!我开始写帖子是因为我喜欢用简单的方式交流复杂的概念。
**码头 **。嗨!我叫 Pier,自 2019 年以来,我一直是《走向数据科学》杂志令人难以置信的编辑助理团队的一员。在过去的几年里,我一直在瑞士再保险和 SAS Institute 等公司的数据人工智能领域工作。TDS 在我整个个人/职业发展过程中发挥了重要作用,我总是乐意尽我所能回馈社区!阅读更多
约翰·贾格蒂阿尼博士。贾格蒂尼博士是一位经验丰富的商业领袖和教育家。他在数据管理、跨行业项目交付和系统战略实施方面拥有专业知识。Jagtiani 博士目前担任西北社区学院下一代商业智能、计算机科学和数据科学项目的助理教授和项目协调员。他还在费尔菲尔德大学和布里奇波特大学的工程学院担任兼职教师。
【丁当】。嗨,我是洪静,你可以叫我来自新加坡的叮当。在阿里巴巴集团担任数据科学家,目前在攻读医疗保健方面的机器学习博士学位(神经科学)。我渴望分享我的学习、研究和经验。因此,我有动力简明地写作,并以简单的方式解释概念。****
****罗汉约瑟夫 。大家好,我是 Rohan,目前是《走向数据科学》的编辑助理。在电子工程本科毕业后,我开始了我的数据科学职业生涯——这是一种运气。在做了三年决策科学家后,我爱上了分析领域。然后,我决定攻读定量领域的硕士学位,这使我得以在弗吉尼亚理工大学攻读运筹学硕士学位。我硕士毕业后搬到了旧金山湾区,目前在苹果公司担任数据科学家。
吉坦什·科尔巴特。你好,从这片土地上下来的!我是 Gitansh,是悉尼《走向数据科学》的副主编。如果你已经遇到或想要发布与 NLP、深度学习、机器学习或一般数据科学相关的内容,那么我们最终很有可能已经/将会遇到。
苏菲·曼恩。 Sophie 是一名新的编辑助理,但对编辑并不陌生。在西北大学本科期间,她在《西北日报》工作了四年,现在是芝加哥的数据分析师,拥有哈佛大学的技术和创新硕士学位。她喜欢跑步、烘焙和填字游戏。
****萨拉·a·梅特沃利 。您好!我是萨拉,我是庆应义塾大学的博士生。我的研究重点是开发一个量子软件调试工具。因为热爱软件,我是 IBM Qiskit 的拥护者;Qiskit 是 IBM 开发的帮助人们学习和实现量子算法的 Python 包。我真正热爱的事情之一是教学,所以我作为一名 CS 教练教孩子们如何编码。我喜欢学习新东西,因为当你理解了你最初认为很复杂的东西时,没有什么比这种感觉更好的了。
卡洛斯 。大家好,我叫卡洛斯·穆根,我现在是玛丽·居里研究员和诺贝尔欧洲创新培训网络的博士生。我对预测建模及其在社会中的意义充满热情。我非常幸运能够在世界级的研究和公共机构中追求这些激情。我非常喜欢参加数据科学竞赛和挑战。
迪米特里斯 。你好!我是迪米特里斯,来自阳光明媚的希腊雅典。我拥有纯数学博士学位,在各种学术岗位上工作过。渐渐地,我的兴趣转向了数据科学。我甚至试图创办一家数据分析初创公司,但失败了。在过去的几年里,我一直在一家大型跨国公司做顾问。我真的很喜欢评论 TDS 的文章,所以请继续发送它们。
****格拉西莫斯 。大家好!我是 Gerasimos,于 2019 年 5 月加入现象级 TDS 团队,担任副主编。我有航空工程、电信和工商管理的学位。作为一名将近 20 年的航空工程师,我很早就意识到数据收集和利用对行业的重要性。在过去的 10 年里,我一直致力于建立和优化记录、处理和分析车队数据的 CMMS 系统。同时,我喜欢阅读关于数据科学概念的书籍,并做一些兼职项目。
****克里斯塔贝尔桑托斯 。大家好!我的名字是克里斯塔贝尔,虽然我让每个人都叫我克里斯塔,因为许多人试图以一种相当壮观的方式屠宰我的名字。自 2020 年 12 月以来,我一直是一名志愿编辑,并在几家咨询公司担任了不到十年的数据科学家。我喜欢为 TDS 评论文章,因为它带给我学习的乐趣。我个人的人生格言是“持续学习带来持续进步”我想知道是否有人说过这句话。我目前住在西班牙,但在种族和文化上我来自印度,我的其他兴趣包括心理学、网络安全和徒步旅行。
马尼什·夏尔马。Manish 正在领导一个在卫生部门工作的组织的机器学习团队。他目前的工作是利用深度学习,利用蛋白质结构(序列信息)预测功能突变的增益(蛋白质工程)。他目前在加拿大的滑铁卢工作,在卫生、金融和能源行业拥有超过 10 年的工作经验。他拥有物理化学博士学位。他的兴趣包括阅读、旅游和教学。
****劳里威廉姆斯 。大家好!我叫 Lowri,是一名研究数据科学家,拥有 4 年的学术研究经验和 2 年的行业合作经验,以新颖的数据科学解决方案支持中小型企业。我与多学科专家合作,在几个著名的学术期刊上展示研究成果和发现,并转向数据科学媒体,在教程风格的博客中展示一些新颖的数据科学方法!
Python 中的核心基因组学
通常情况下,数据科学家想要探索一个不适合内存的数据集。随着数据量的持续增长,我们处理这些数据的工具也需要扩展。这篇文章的动机源于我对处理 openSNP 数据的兴趣。openSNP 是一个开源平台,用户可以从 23andMe 等直接面向消费者的遗传学公司上传他们的基因型数据。原始结果文件通常有几十万条记录,每条记录代表人类基因组中的一个位置。openSNP 数据中有超过 4,000 个原始结果文件。然而,我的笔记本电脑运行的 VirtualBox 只有 5GB RAM,这意味着我需要找到一些超出标准 pandas 库的聪明解决方案,以便处理这么多数据。这篇文章描述了几个可以从核外计算中受益的应用之一。
下载 openSNP 数据
openSNP 有超过 40 GB 的基因型和表型数据存储为文本文件!
出于本演示的目的,分析将仅限于 23andMe 文件。下面是几个 shell 命令,用于下载原始数据,创建目录,并将 23andMe 文件移动到它们自己的目录中。
这里有一个示例 23andMe 结果文件,文件头用#
注释掉,然后有 600,000+行基因型数据。
提取合理规模的测试集
在本练习中,使用完整 openSNP 数据的一个可管理的子集,以便在合理的时间内执行演示。创建一个新目录,复制以名称:user21
开头的基因型文件。
纯种熊猫
首先,从一个纯粹的熊猫 read_csv
解决方案开始,这应该是 Python 数据科学家所熟悉的。尽量在内存中创建一个大的DataFrame
。join
方法可以完成这项任务。尽管这是一个昂贵的操作,我们刚刚提取的测试数据集足够小,它将成功执行。
CPU times: user 7min 48s, sys: 9.83 s, total: 7min 58s
Wall time: 8min 15s
在 43 个文件的测试集上,整个DataFrame
适合内存。然而,对包含 1,915 个文件的整个 openSNP 数据集使用这种纯 pandas 方法最终会使笔记本电脑崩溃,因为它会耗尽物理内存。
Dask —并行核外数据帧
进入 dask ,一个实现核外数据帧的 Python 库。它的 API 类似于 pandas,增加了一些额外的方法和参数。Dask 创建了一个计算图,它将并行读取相同的文件,并创建一个“lazy”DataFrame
,直到comptue()
被显式调用后才会执行。
example computation graph from http://dask.pydata.org/en/latest/_images/pipeline.png
惰性地将基因型文件读入 dask 数据帧,这个操作实际上并没有将文件读入内存,这可以通过 cpu 时间来证明,相反,它构建了一个类似于上图的图形。
CPU times: user 112 ms, sys: 52 ms, total: 164 ms
Wall time: 298 ms
对 dask 数据帧执行操作,如set_index()
触发计算。
CPU times: user 4min 44s, sys: 23 s, total: 5min 7s
Wall time: 4min 45s
dask compute()
方法提供了熟悉的结果。因为join
方法不是在 dask 数据框架上执行的,与纯 pandas 方法相反,只调查一个记录(或一个 SNP)。
CPU times: user 3min 31s, sys: 36.1 s, total: 4min 7s
Wall time: 3min 46s CC 37
CT 5
TT 1
Name: genotype, dtype: int64
同样,与ddf
(dask)相反,gtdf
在内存中,所以这个操作非常快。
CPU times: user 4.3 s, sys: 8.1 s, total: 12.4 s
Wall time: 1min 1sCC 37
CT 5
TT 1
Name: rs1333525, dtype: int64
乍一看,计算时间是骗人的。dask 方法花费了更长的时间,因为计算缓慢,它仍然必须读取所有文件,然后执行操作。然而,当你考虑到加入数据帧所需的 8 分 15 秒加上gtdf.loc[rs13333525'].value_counts()
的 1 分 1 秒时,那就是 9 分 16 秒。相比之下,dask 方法需要 3 个步骤。第一次设置计算图形为< 1 秒。所以真正的比较来自于设定指标的 4 分 45 秒和执行ddf.loc['rs1333525']['genotype'].value_counts().compute()
的 3 分 46 秒总计 8 分 31 秒。在我们只有 43 个文件的测试数据上,这似乎是一个微小的加速。当数据帧根本放不进内存时,dask
的真正威力就发挥出来了。
提高查询性能—转换。txt/。csv 呼叫拼花地板!
如果能加快 dask 查询的速度就好了,这样我们就可以在合理的时间内使用数据帧进行下游分析。解决方案是将原始文本数据以有效的二进制格式存储在磁盘上。传统上,一个流行的选择是 HDF5 ,但是我选择使用 parquet ,因为 HDF5 可能很难使用。Dask 使用了 fastparquet 实现。
CPU times: user 12min 35s, sys: 1min 41s, total: 14min 17s
Wall time: 19min 30s
从本质上讲,这样做的目的是将.txt
文件转换成 parquet 文件。从中真正获得了多少性能?重温 dask 数据帧ddf
,记得计算value_counts()
花了 3 分 46 秒。转换为拼花格式后进行比较。
CPU times: user 8.18 s, sys: 608 ms, total: 8.79 s
Wall time: 11.7 s CC 37
CT 5
TT 1
Name: genotype, dtype: int64
Parquet 为查询数据提供了显著的性能提升,即使只有 43 个文件的验证集。将这个扩展到 1915 个文件,并行的.txt
版本ddf
,花了 5 个多小时来执行一个 SNP 的value_counts()
。在 1915 号文件上DataFrame
花了几个小时。一旦看到查询性能的提高,从.txt
或.csv
转换到 parquet 的前期成本是值得的。
整个 openSNP 数据集上的性能
我使用上面相同的命令预先计算了整个gt23
目录的拼花文件,并将拼花文件存储在gt23_pq
中。需要清理和/或删除一些格式错误的文件。
$ find gt23_pq/ -type f | wc -l1898
现在,发出与前面代码块中的测试数据集相同的value_counts()
命令,但是这将考虑所有的 23andMe 基因型文件。
CPU times: user 6.67 s, sys: 112 ms, total: 6.78 s
Wall time: 7.2 sCC 1625
CT 277
TT 13
Name: genotype, dtype: int64
这些结果凸显了拼花地板远优于.csv
或.txt
的性能。此外,dask 证明了当物理内存受到限制时,它作为一个易于使用的工具的价值。到目前为止,您可能已经注意到,我无法将用户标识符分配给每一列。dd.read_csv()
假设每个文件中的列名相同。
在整个 openSNP 数据集上实现
教程的 dask 和 parquet 部分已经结束。我想展示 dask 和 parquet 如何轻松地处理大型数据集。以下示例比较了 openSNP 数据和 exAC 数据中的不同频率。
我希望这篇文章对你有用,并在处理结构化文本文件时考虑使用 dask 和 parquet。我真的鼓励你查看 dask 和 parquet 文档,并跟随他们的一些教程。感谢阅读,欢迎评论和代码改进!
从我的 github 页面站点更新【https://arvkevi.github.io/Out_of_Core_Genomics.html
离群点感知聚类:超越 K 均值
Picture from fauxels on Pexels.com
数据科学能帮你选择下一份工作吗?首先,这是个糟糕的主意。
但是,让我们看看会发生什么。
方法
我们提出了一种优化聚类的组合降维方法。是的,我肯定你们中的一些人在读完这篇文章后仍然会坚持 ol’ PCA/K-Means,但是我希望你的工具箱里会有一个同样快速的新工具。
该方法使用了两种迅速流行的方法:用于降维的 UMAP 和用于聚类的 HDBSCAN。在行为原型定义的人力资源和客户细分的推荐系统的多个项目中,我们已经取得了很多成功。
寻找要使用的数据集
让我们用一个劳动力市场分析作为这个测试的例子。面对不断变化的工作、角色和责任,你应该在哪个行业工作?那些已经有很高需求的,或者正在增长的。
劳动力市场分析是确定就业市场趋势的标准方法。这将让我们了解一段时间内的工作需求。然后,我们将把每项工作分成特定的类别。这些类别将代表我们可能感兴趣的每个主要行业。
为了仅根据数据集确定行业类别,我们将使用 UMAP+HDBSCAN 方法。
我们的行动计划
我们将为职位发布收集一个样本数据集,其中包含职位名称、职位描述和发布年份。从那里,我们将根据单词的相似性将发布的信息分组,以了解每个组的消长情况,根据该特定组中每年的职位发布数量。
我们将让一些聚类算法为我们做出这些决定,而不是从应该选择的聚类的假设开始。这是表演 LMA 时最棘手的部分。一个社交媒体总监是管理、营销还是 IT 部门的人?医疗机器人服务技术员,或者自动驾驶汽车食品配送主管怎么样?
通过查看标题和描述的内容,我们将让类别自己决定。
数据
Kaggle 的亚美尼亚招聘数据集已经对 2004 年至 2015 年年中的招聘信息进行了过滤。这是一个很好的数据集,因为:
- 它是大多数现代经济的典型代表。
- 这是一个足够小的数据集,很容易使用;
- 它包含的工作范围很广,不仅仅是特定的行业。
和其他人一样,它也受到了 2008-2009 年经济衰退的影响:
Number of job postings in the dataset, per year.
GDP of Armenia vs. Georgia and Albania, showing the Great Recession.
这意味着我们已经准备好组织这些数据,以了解每个工作部门的表现。
对每个职位名称、描述和职位发布执行单词嵌入
让我们为这个项目加载所有相关的库。
在我们决定为每个文本元素生成一个向量之前,我们将删除所有通用的英语停用词(“if”、“I”、“因为”…),以及每个类别的其他通用词。我们通过查找每种条目类型的最常用单词、生成自定义词典并删除所选单词来实现这一点。
在我们删除了第一个停用词列表并按计数打印出这个单词列表后,我们注意到在所有的招聘信息中有很多重复的单词。这会输出一个清晰的“无聊”单词列表:
[('responsible', 4711),
('looking', 4290),
('incumbent', 3840),
('position', 3717),
('development', 3538),
('seeking', 3015)...
这本来是使用 TF-IDF 根据单词出现的频率来删除单词的一个很好的机会,但是这个数据集太小了,不值得使用,并且可以手动执行编辑。(只要能更快完成工作,我们就喜欢这样。)
让我们删除一些精选词,以便下面的单词嵌入在整个数据集中有较少的常用词。
现在我们开始有趣的事情——单词嵌入。虽然不建议用于长语句或文档(例如,Yoon Kim CNN 在对语句进行分类时通过使用每个单词的向量来实现最佳效果),但我们知道,删除低信号/通用单词将为我们提供向量之间的一些更好的定义。
弗兰克·爱因斯坦生活:UMAP + HDBSCAN
在典型的数值或分类数据上,K-Means 对于创建聚类很有意义。当分离简单的单词嵌入(1 到 4 个单词)时,我们也可以使用这种方法,但是当组合字符串向量时,它会丢失信号,其中单词嵌入之间的余弦相似性要相似得多。使用 K-Means 对聚类进行排序的典型方法包括以下内容:
- 我们将选择不同数量的集群(通常是从 1 到 20 的滑块)。
- 使用肘法,我们将找到最佳的集群数。
- 为了确认肘方法有助于决定簇的数量,我们将使用剪影值,以便查看每个点在目标簇中的拟合程度。
然而,这种方法有一些潜在的问题。这就是为什么我们希望 HDBSCAN 关注这些点,而不是 K-Means:
- 并非所有的点都可以或应该被聚类。
- 也许星团不是圆形或球形的。(雪茄形、半月形等。)
为什么 K-Means 不适合大词嵌入聚类?因为它试图找到球状星团的中心。如果有一个长方形簇,末端将被切断,中心将暴露于异常值。
让我们合并 UMAP 和 HDBSCAN,而不是调整 K-Means 参数直到母牛回家。这包括:
- 通过使用 UMAP 在黎曼流形上定义新的嵌入空间来重新定义向量存在的空间;
- 使用 HDBSCAN 将接近但不一定是球形的簇聚集在一起,同时忽略异常值。
什么是 UMAP?
一致流形逼近和投影(UMAP) 是一种新的降维技术。
在 PCA 中,通过创建能够充分重建每个点的位置的向量来执行维数减少。如果我的数据存在于ℝ ⁰⁰ (hello word 嵌入),我可以定义 10 个(或 2 个,或 20 个)特征向量,这些特征向量可以尽可能多地复制这些点。总会有信息丢失,但主成分分析通常可以达到 70%-80%的代表性准确率。
在 UMAP,方法是创建一个黎曼流形——一个弯曲的、平滑的、连接回自身的任意形状。我现在有一个形状,我解开扭曲和展平,在这个形状上,我所有的点都相当接近曲面,特别是如果我有一根足够长的绳子。想象一个两端相交的线团,这将是ℝ的黎曼流形。
此时我需要做的就是解开绳子,弄平圆柱体,并缩放数据。嘣!你现在有一个 2D 投影。
另一种思考方式是当你把地球放在地图上。墨卡托投影和极坐标投影将具有不同的偏斜,根据我们正在查看的数据,这些偏斜可以被忽略(或不被忽略)。
它的 GitHub 页面对此做了最好的解释:
但是为什么要用黎曼流形呢?相当简单。
- 3D 空间由规则(重力、时间、距离等)定义。).如果我说,“让我们想象一个距离和角度不成问题的世界”,你会说“太好了!现在一个立方体是一个球体是一个棱镜,因为距离和角度并不重要。”
- 现在我们生活在 ElastiSpace 中,我们可以更容易地解决某些问题。距离仍然不重要,但你很快意识到立方体和棱柱上的锐边会弄乱你的方程。因此,我创建了 ElastiSpaceV2,其中球体和椭球体是一回事,但现在立方体有了自己的类别。
- 但是你在高中学到的所有数学知识呢?在你花了那么多时间练习那些习题之后,三角学不应该仍然有效吗?ElastiSpaceV2 帮不了你,但黎曼先生有 chu,fam。这就是球体和椭圆不同的地方,所有的数学问题仍然有效,所以你可以做你想做的所有数学。
(这一部分转述自 Quora 帖子。)
现在回到招聘启事。
减少和聚集向量
下面是降低维数并开始对集合向量进行聚类的代码。
这里有两件事需要注意:
- 集群的数量是由 HDBSCAN 决定的,而不是我们。如果你重新运行它,你会得到一些波动,所以一旦你有了工作的东西,保存集群。
- 还有一些没有聚类的值(用“-1”表示),大概有三分之一。这意味着只对剩余的值执行聚类。
[21 -1 -1 -1 4 -1 -1 25 25 -1 7 12 19 -1 25 -1 25 4 25
8 25 8 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 -1 9 -1 -1 9 1
25 -1 20 -1 -1 -1 -1 -1 -1 -1 12 -1 -1 24 -1 2 25 -1 1
-1 7 12 -1 -1 14 -1 11 25 -1 -1 21 -1 -1 -1 -1 2 9 -1
11 12 9 12 25 11 7 -1 12 25 25 7 -1 -1 -1 -1 -1 -1 25
7 -1 21 -1 -1 19 -1 14 -1 -1 25 25 -1 25 8 25 25 -1 -1
-1 -1 -1 -1 25 12 -1 -1 25 8 -1 25 -1 -1 -1 -1 7 -1 25
-1 22 -1 25 16 9 -1 12 9 -1 7 12 -1 -1 8 -1 -1 8 24
24 7 25 -1 -1 7 7 7 25 7 1 -1 24 12 -1 -1 25 -1 7
-1 -1 8 13 -1 8 8 1 -1 -1 13 13 13 13 16 16 18 0 -1
16 25 -1 -1 -1 4 -1 -1 -1 15 25 -1 -1 6 7 -1 8 -1 25
-1 -1 -1 4 -1 -1 -1 -1 18 25 25 -1 25 20 25 7 7 7 25
-1 -1 25 25 -1 -1 -1 -1 27 -1 11 25 -1 25 25 18 -1 8 25
25 25 2 -1 -1 25 0 -1 -1 25 -1 12 25 -1 -1 -1 -1 7 -1
-1 -1 7 -1 27 25 -1 27 -1 -1 16 -1 -1 -1 -1 -1 -1 25 -1
-1 25 -1 25 14 -1 1 -1 -1 8 -1 1 25 25 7 7 -1 7 25
-1 25 -1 -1 -1 7 -1 7 -1 25 -1 25 12 -1 25 4 7 7 7
7 6 -1 7 -1 6 -1 11 16 19 -1 -1 -1 25 24 -1 16 -1 -1
-1 -1 -1 -1 -1 -1 -1 2 -1 4 7 25 -1 25 4 7 -1 25 25
1 -1 25 -1 -1 4 -1 7 -1 9 25 -1 -1 7 8 8 25 14 -1
-1 4 25 25 -1 8 25 19 -1 -1 25 15 16 -1 -1 15 21 -1 -1
25 -1 7 7 -1 -1 7 7 8 -1 18 2 16 4 -1 -1 9 9 -1
-1 -1 -1 -1 25 -1 -1 12 -1 7 20 7 -1 -1 25 -1 25 25 -1
25 6 25 7 17 -1 7 16 17 7 7 -1 4 15 -1 7 16 25 -1
25 25 -1 -1 -1 1 25 -1 25 -1 16 25 25 24 -1 12 -1 -1 -1
6 -1 25 1 11 -1 7 6 25 25 -1 25 25 -1 -1 25 1 -1 7
1 -1 -1 4 12 14]
那么这些集群代表了什么呢?让我们统计每个集群的热门词汇,以确定它们包含的内容。
看它分解得多好!
Cluster: 0
[('lawyer', 125), ('advocate', 3), ('attorney', 1)]
---
Cluster: 1
[('accountant', 259), ('auditor', 22), ('outsourcing', 4), ('cheef', 1), ('bookkeeper', 1)]
---
Cluster: 2
[('software', 130), ('developer', 125), ('developers', 4), ('programmer', 4), ('programmers', 1)]
---
Cluster: 3
[('developer', 166), ('android', 70), ('ios', 64), ('senior', 48), ('application', 32)]
---
Cluster: 4
[('accountant', 233), ('chief', 225), ('assistant', 29), ('deputy', 26), ('engineer', 11)]
---...---
Cluster: 25
[('specialist', 227), ('expert', 226), ('development', 217), ('coordinator', 157), ('program', 147)]
---
Cluster: 26
[('service', 78), ('manager', 55), ('customer', 49), ('department', 17), ('corporate', 15)]
---
我们甚至可以得到一个更紧凑的视图:
Cluster 0: lawyer / advocate / attorney
Cluster 1: accountant / auditor / outsourcing / cheef
Cluster 2: software / developer / developers / programmer
Cluster 3: developer / android / ios / senior
Cluster 4: accountant / chief / assistant / deputy
Cluster 5: medical / representative / yerevan / armenia
Cluster 6: developer / java / php / senior
Cluster 7: developer / senior / software / web
Cluster 8: preseller / merchandiser / methodologist / 3d
Cluster 9: language / translator / english / interpreter
Cluster 10: hr / manager / assistant / generalist
Cluster 11: manager / project / construction / senior
Cluster 12: administrative / assistant / office / manager
Cluster 13: quality / assurance / engineer / tester
Cluster 14: assistant / executive / director / ceo
Cluster 15: administrator / system / network / systems
Cluster 16: engineer / software / senior / support
Cluster 17: qa / engineer / senior / manager
Cluster 18: analyst / financial / business / senior
Cluster 19: marketing / specialist / pr / digital
Cluster 20: legal / lawyer / senior / consultant
Cluster 21: finance / officer / chief / financial
Cluster 22: manager / branch / operator / teller
Cluster 23: manager / sales / assistant / retail
Cluster 24: agent / sales / manager / international
Cluster 25: specialist / expert / development / coordinator
Cluster 26: service / manager / customer / department
这是一个漂亮的图表,按集群划分。
我们现在有了一个漂亮的图表,显示了随着时间的推移,每个工作领域的需求。耶!
总的来说,这种方法实现起来几乎和标准的 PCA/K-Means 一样快。然而,通过中间的可视化步骤,我发现就集群而言,判断我们是否在正确的轨道上要容易得多。
你可以在这里找到所有的代码:https://github.com/elmathioso/lma_jobs
快乐聚类!
马特。
matt@lemay.ai
https://www.linkedin.com/in/mnlemay/
Lemay.ai
1 (855) LEMAY-AI
你可能喜欢的其他文章
我的首席技术官丹尼尔·夏皮罗(Daniel Shapiro)的其他文章您可能会喜欢:
基于隔离森林的离群点检测
了解如何有效地检测异常值!
更新:描述扩展隔离林的第 2 部分可从这里获得。
在最近的一个项目中,我正在处理一个从移动应用程序用户那里收集的数据的聚类问题。目标是根据用户的行为对用户进行分类,可能使用 K-means 聚类。然而,在检查数据后,发现一些用户表现出异常行为——他们是异常值。
当离群值没有被处理时,许多机器学习算法的性能都会受到影响。例如,为了避免这种问题,您可以将它们从样本中删除,在某个合理的点(基于领域知识)限制这些值,或者转换数据。然而,在这篇文章中,我想把重点放在识别它们上,把可能的解决方案留到以后。
在我的例子中,我考虑了很多特征,我理想地想要有一个算法来识别多维空间中的异常值。那时我遇到了隔离森林,这种方法在原理上类似于众所周知和流行的随机森林。在本文中,我将重点关注隔离森林,而不详细描述决策树和集成背后的思想,因为已经有太多的好资料了。
先来点理论
与其他流行的离群点检测方法不同,隔离林的主要思想是显式识别异常,而不是分析正常数据点。隔离森林和任何树集合方法一样,是建立在决策树的基础上的。在这些树中,通过首先随机选择一个特征,然后在所选特征的最小值和最大值之间选择一个随机分割值来创建分区。
原则上,异常值比常规观测值更少出现,并且在值方面与常规观测值不同(在特征空间中,它们离常规观测值更远)。这就是为什么通过使用这种随机划分,它们应该被识别为更靠近树的根(更短的平均路径长度,即,观察在树中从根到终端节点必须经过的边的数量),需要更少的分裂。
从[1]的图 1 中可以看出识别正常和异常观察的想法。正常点(左侧)比异常点(右侧)需要识别更多的分区。
Figure 1 Identifying normal vs. abnormal observations
与其他异常值检测方法一样,异常值是决策所必需的。对于隔离林,它被定义为:
其中 h(x) 是观测值 x 的路径长度, c(n) 是二叉查找树中搜索不成功的平均路径长度, n 是外部节点数。有关异常分数及其组成部分的更多信息,请参见[1]。
每个观察值都有一个异常值,可以在此基础上做出以下决定:
- 接近 1 的分数表示异常
- 分数远小于 0.5 表示正常观察
- 如果所有分数都接近 0.5,那么整个样本似乎没有明显的异常
Python 示例
好,现在我们来看一个动手的例子。为了简单起见,我将使用一个人工的二维数据集。通过这种方式,我们可以监控图中异常值的识别过程。
首先,我需要生成观察结果。我将从被视为正常并将用于训练模型的观察开始(Python 的scikit-learn
隔离森林实现中的训练和评分类似于所有其他机器学习算法)。第二组是新的观察值,来自与训练值相同的分布。最后,我生成离群值。
*# importing libaries ----*
**import** **numpy** **as** **np**
**import** **pandas** **as** **pd**
**import** **matplotlib.pyplot** **as** **plt**
**from** **pylab** **import** savefig
**from** **sklearn.ensemble** **import** IsolationForest*# Generating data ----*
rng = np.random.RandomState(42)
*# Generating training data*
X_train = 0.2 * rng.randn(1000, 2)
X_train = np.r_[X_train + 3, X_train]
X_train = pd.DataFrame(X_train, columns = ['x1', 'x2'])
*# Generating new, 'normal' observation*
X_test = 0.2 * rng.randn(200, 2)
X_test = np.r_[X_test + 3, X_test]
X_test = pd.DataFrame(X_test, columns = ['x1', 'x2'])
*# Generating outliers*
X_outliers = rng.uniform(low=-1, high=5, size=(50, 2))
X_outliers = pd.DataFrame(X_outliers, columns = ['x1', 'x2'])
图 2 展示了生成的数据集。正如所期望的,训练和“正常”观察基本上是相互叠加的,而异常值是分散的。由于异常值的随机性质,它们中的一些与训练/正常观察重叠,但是我将在后面说明。
Figure 2 Generated Dataset
现在我需要在训练台上训练隔离林。我在这里使用默认设置。值得注意的一点是污染参数,它指定了我们认为是异常值的观察值的百分比(scikit-learn
的默认值是 0.1)。
*# Isolation Forest ----*
*# training the model*
clf = IsolationForest(max_samples=100, random_state=rng)
clf.fit(X_train)
*# predictions*
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)
y_pred_outliers = clf.predict(X_outliers)
好了,现在我们有了预测。如何评估绩效?我们知道,测试集只包含来自与正态观测值相同分布的观测值。因此,所有的测试集观测值都应该归类为正常。对于离群值集合,反之亦然。再来看准确度。
*# new, 'normal' observations ----*
print("Accuracy:", list(y_pred_test).count(1)/y_pred_test.shape[0])
# Accuracy: 0.93*# outliers ----*
print("Accuracy:", list(y_pred_outliers).count(-1)/y_pred_outliers.shape[0])
# Accuracy: 0.96
起初,这看起来很好,特别是考虑到默认设置,但是,还有一个问题需要考虑。由于异常值数据是随机生成的,一些异常值实际上位于正常观察值内。为了更仔细地检查它,我将绘制正常观察数据集和带标签的异常值集。我们可以看到,一些位于正常观察集内的异常值被正确地归类为正常观察值,其中一些被错误地归类。我们可以做的是尝试不同的参数规格(污染、估计数、抽取样本数以调整基本估计数等)。)来获得更好的契合度。但目前来看,这些结果还是令人满意的。
Figure 3 Inspecting outlier classification
外卖食品
- 隔离林是一种异常值检测技术,可识别异常值而非正常观察值
- 类似于随机森林,它是建立在二元(隔离)树的集合上
- 它可以扩展到处理大型高维数据集
这是我在这里的第一篇文章,如果我再写一些,我会努力提高写作和编辑的水平。一如既往,我们欢迎任何建设性的反馈。你可以在推特上或评论中联系我。
本文中使用的代码可以在我的 GitHub 上找到。
您可能还对一种更简单的异常值检测算法感兴趣 Hampel 滤波器。我在上面写了一小段这里。
喜欢这篇文章吗?成为一个媒介成员,通过无限制的阅读继续学习。如果你使用这个链接成为会员,你将支持我,不需要额外的费用。提前感谢,再见!
参考
[1]刘福亭,丁克明,周振华(2008 年 12 月).隔离森林。在数据挖掘,2008 年。08 年的 ICDM。第八届 IEEE 国际会议(第 413-422 页)。IEEE。
[2]http://sci kit-learn . org/stable/modules/generated/sk learn . ensemble . isolation forest . html
离群值解释:不同类型离群值的快速指南
商业上的成功取决于在正确的时间做出正确的决定。然而,只有当你在适当的时候拥有所需的洞察力,你才能做出明智的决定。当合适的时机到来时,异常值检测(也称为异常检测)可以帮助您在风暴来临时,或者在业务趋势向有利于您的方向转变时,为您的公司制定更好的路线。在这两种情况下,快速检测和分析异常值可以让你及时调整你的路线,以产生更多的收入或避免损失。说到分析,第一步是知道你面对的是什么类型的异常值。
三种不同类型的异常值
在统计学和数据科学中,所有异常值都属于三个普遍接受的类别:
类型 1:全局异常值(也称为“点异常”):
如果数据点的值远在发现它的整个数据集之外,则该数据点被认为是全局异常值(类似于计算机程序中的“全局变量”可以被程序中的任何函数访问)。
类型 2:上下文(条件)异常值:
如果一个数据点的值明显偏离相同上下文中的其余数据点,则该数据点被认为是上下文异常值。请注意,这意味着如果相同的值出现在不同的上下文中,它可能不会被视为异常值。如果我们将讨论局限于时间序列数据,那么“上下文”几乎总是时间性的,因为时间序列数据是一段时间内特定数量的记录。因此,在时间序列数据中,背景异常值很常见也就不足为奇了。
类型 3:集体异常值:
如果作为集合的那些值明显偏离整个数据集,则数据集内的数据点子集被认为是异常的,但是单个数据点的值本身在上下文或全局意义上不是异常的。在时间序列数据中,这种情况的一种表现方式是,当季节性序列正常时,出现在时间范围之外的正常峰值和谷值,或者作为一组处于异常值状态的时间序列的组合。
请这样想:
一块拳头大小的陨石撞击你邻居的房子是一个全球性的异常事件,因为陨石撞击建筑物的事件非常罕见。如果降雪发生在仲夏,而你的邻居被埋在两英尺厚的雪中,这将是一个上下文异常值,通常你在冬天之外不会下雪。你的每一个邻居都在同一天搬出这个社区,这是一个集体的离群值,因为尽管人们从一个住所搬到另一个住所肯定不罕见,但整个社区同时搬迁是非常不寻常的。
这个类比有助于理解这三种异常值之间的基本差异,但是它如何适应业务度量的时间序列数据呢?
让我们转到更具体的业务示例:
一位银行客户通常每月在当地自动取款机上存入不超过 1000 美元的支票,但在两周内突然存入两笔各为 5000 美元的现金,这是一种全球性的异常现象,因为这种情况在这位客户的历史上从未发生过。他每周存款的时间序列数据会显示最近的突然飙升。如此剧烈的变化会引起警觉,因为这些巨额存款可能是由于非法交易或洗钱。
一家电子商务公司的订单量突然激增,如该公司每小时的总订单量所示,如果这一高量发生在已知的促销折扣或高量时段(如黑色星期五)之外,则可能是上下文异常值。这种蜂拥现象会不会是由于定价失误,让消费者以低廉的价格购买产品?
一家上市公司的股票从来都不是静态的,即使价格相对稳定,没有整体趋势,而且随着时间的推移会有微小的波动。如果股票价格在很长一段时间内保持完全相同的价格(相对于一分钱),那么这将是一个集体异常值。事实上,这件事发生在 2017 年 7 月 3 日纳斯达克交易所的几家科技公司身上,当时包括科技巨头苹果和微软在内的几家公司的上市股价为 123.45 美元。
这些异常是什么样子的?下面是几个例子。
**全局异常:**由于异常值明显超出正常的全局范围,主页的反弹次数出现峰值。
**情境异常:**应用崩溃一直在发生,并且有季节性模式(更多用户=更多崩溃)。然而,在这种异常情况下,应用崩溃的数量并没有超出正常的全球范围,但与季节性模式相比是不正常的。
**集体异常:**在本例中,发现三个不同产品类别的成功购买数量的异常下降相互关联,并组合成一个异常。对于每个时间序列,个人行为没有明显偏离正常范围,但综合异常表明支付存在更大的问题。
检测所有类型异常值的三个关键步骤
不考虑行业,不考虑数据源,离群点检测系统应该实时地在时间序列数据中发现所有类型的离群点,并且是在数百万个度量的尺度上。
异常值和异常检测算法已经在学术界进行了研究,最近已经开始作为商业服务和开源软件提供。所有这些都依赖于统计和机器学习算法,基于诸如 ARIMA、霍尔特-温特斯、动态状态空间模型(HMM)、PCA 分析、LSTMs 和 RNNs 等方法。除了基本算法之外,在构建这样的系统时还有许多额外的考虑。
关于如何构建这样一个系统的全面指南在关于异常检测的白皮书中概述。适用于所有基本异常值检测算法的关键步骤有助于检测各种异常值:
- 为每个时间序列选择最合适的模型和分布:这是检测任何异常值的关键步骤,因为时间序列可以以各种方式表现(平稳、非平稳、不规则采样、离散等),每种方式都需要具有不同基本分布的不同正常行为模型。
- 说明季节性和趋势模式:如果在描述正常行为的模型中没有说明季节性和趋势,就无法检测到上下文和集体异常值。自动检测这两者对于自动化异常检测系统至关重要,因为这两者不能针对所有数据手动定义。
- 检测集体异常涉及理解不同时间序列之间的关系,并说明用于检测和调查异常的关系。
离群值通常是潜在问题的可见症状,需要快速修复。然而,这些症状只有在你的异常值检测系统让它们变得可见时才可见。
如需更多视觉效果,请参见我们的简短解释视频。
最初发表于 2019 年 11 月此处。
优于 Tensorflow 的默认自动微分优化器,具有交互式代码[带 TF 的手动回推]
Image from pixel bay
所以我对这个想法思考了很久,有没有一种不同的(甚至更好的)方法来训练一个神经网络?Tensroflow、Keras、pyTorch 等框架都很神奇,非常好用。这不仅要感谢它们为我们执行自动微分的能力,还要感谢它们为我们提供了广泛的优化选择。但这并不意味着我们只能依靠他们的自动微分。
因此,让我们做一些不同的事情,我将尝试超越 Tensorflows 自动微分在他们的默认实现中,总共有 10 个优化器。我们将用来超越自动差异化的两项技术是…
a.谷歌大脑的梯度噪声
b. 每层用 ADAM 优化器放大反向传播
网络架构/实验任务
我们的实验非常简单,我们将使用全连接神经网络(有 5 层),对 Tensorflow 的 MNIST 数据集进行分类。以上是每一层是如何构建的。由于我们将使用不同的优化方法,各层应该有不同的方法来执行反向传播,因此有三种方法。标准反向传播、Google Brain 的附加噪声和 ADAM 反向传播。另外,请注意两个细节。
1.我们将使用 Tensorflow MNIST 数据集提供的每一个数据。
2.我们将使用矢量图像。
tensor flow 优化人员列表
Screen Shot from Tensor Flow
以上是我们将与谷歌大脑的噪声和扩张反向传播进行比较的优化器的完整列表。现在,为了更容易地看出哪些是哪些,让我们为每个优化器分配颜色。
对比案例列表
如上所示,我们总共有 17 个案例,每个案例都有自己的颜色。请查看下面我使用的确切颜色。
如果您希望了解更多关于 matplotlib 颜色的信息,请访问此页面获取更多信息。现在让我们给每种情况分配不同的优化方法。
Case 0 → Google Brain's Added Gradient Noise + Standard Back PropCase 1 → Dilated ADAM Back Propagation Sparse Connection by Multiplication Case 2 → Dilated ADAM Back Propagation Sparse Connection by Multiplication + Google Brain's Added Gradient NoiseCase 3 → Dilated ADAM Back Propagation Dense Connection by AdditionCase 4 → Dilated ADAM Back Propagation Dense Connection by MultiplicationCase 5 → Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)Case 6 → Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)Case 7 → [tf.train.GradientDescentOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/GradientDescentOptimizer)
Case 8 → [tf.train.AdadeltaOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/AdadeltaOptimizer)
Case 9 → [tf.train.AdagradOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/AdagradOptimizer)
Case 10 → [tf.train.AdagradDAOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/AdagradDAOptimizer)
Case 11 → [tf.train.MomentumOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/MomentumOptimizer)
Case 12 → [tf.train.AdamOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/AdamOptimizer)
Case 13 → [tf.train.FtrlOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/FtrlOptimizer)
Case 14 → [tf.train.ProximalGradientDescentOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/ProximalGradientDescentOptimizer)
Case 15 → [tf.train.ProximalAdagradOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/ProximalAdagradOptimizer)
Case 16 → [tf.train.RMSPropOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/RMSPropOptimizer)
本质上情况 0 ~ 6 是手动反向传播,情况 7 ~ 16 是自动微分。
不同试验列表/基础优势/
随机初始化
Experiment Trials
如果其中一个优化方法 从根本上优于另一个 ,那么每次我们运行实验时,那个方法都会胜过其余的。为了增加我们捕捉这一基本特征的概率,让我们进行 3 次不同的试验,每次试验我们将进行 10 次试验。(**注意 每次试验的超参数设置互不相同。)
另外为了保证方法的优越性,让随机种子值来初始化权重。
每次实验后,我们都会比较所有案例,以了解哪一个案例有…
a .最低成本率(或错误率)
b .训练图像的最高精度
c .测试图像的最高精度当所有实验完成后,我们将会看到频率条形图,其中哪个案例在每个标准下表现最佳。
试验一结果
左侧图→10 次实验的频率柱状图最低成本率
中间图→10 次实验的频率柱状图训练图像的最高准确率
右侧图→10 次实验的频率柱状图测试图像的最高准确率
当学习率设置为 0.001 时,神经元更宽,每层有 1024 个神经元。似乎扩张反向传播易于过度拟合,因为它们在训练图像上的最低成本率和最高精度上最频繁,但是在测试图像上的最高精度上没有显示出来。
我看到了一种潜力,通过适当的调整,他们可以超越每一个案例。
**Percentage of Best Performing at *Lowest Cost Rate***1\. **Case 5: 60%**
('Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)')2\. **Case 3: 30%**
('Dilated ADAM Back Propagation Dense Connection by Addition')3\. **Case 0: 20%**
('Google Brain's Added Gradient Noise + Standard Back Prop')4\. **Case 1: 10%**
('Dilated ADAM Back Propagation Sparse Connection by Multiplication')
-------------------------------------------------------------
**Percentage of Best Performing at *Highest Accuracy on Training Images***1\. **Case 3: 40%**
('Dilated ADAM Back Propagation Dense Connection by Addition')2\. **Case 5: 30%**
('Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)')3\. **Case 0: 20%**
('Google Brain's Added Gradient Noise + Standard Back Prop')4\. **Case 1: 10%**
('Dilated ADAM Back Propagation Sparse Connection by Multiplication')
-------------------------------------------------------------
**Percentage of Best Performing at *Highest Accuracy on Testing Images***1\. **Case 0: 60%**
('Google Brain's Added Gradient Noise + Standard Back Prop')2\. **Case 16: 40%**
('[tf.train.RMSPropOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/RMSPropOptimizer)')
实际上,情况 0 ~ 6 是人工反向传播,而情况 7 ~ 16 是自动微分。
试验 2 结果
左侧图 →最低成本率
上 10 次实验的频率柱状图 →训练图像上 10 次实验的频率柱状图→最高准确率
右侧图 →测试图像上 10 次实验的频率柱状图最高准确率
当学习率设置得稍高(0.0025)且神经元较窄(824)时,情况 5(大部分)优于所有其他情况。
**Percentage of Best Performing at *Lowest Cost Rate***1\. **Case 3: 60%**
('*Dilated ADAM Back Propagation Dense Connection by Addition*')2\. **Case 5: 40%**
('Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)')
-------------------------------------------------------------
**Percentage of Best Performing at *Highest Accuracy on Training Images***1\. **Case 3: 50%**
('*Dilated ADAM Back Propagation Dense Connection by Addition*')2\. **Case 5: 50%**
('Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)')
-------------------------------------------------------------
**Percentage of Best Performing at *Highest Accuracy on Testing Images***1\. **Case 5: 70%**
('Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)')2\. **Case 3: 20%**
('*Dilated ADAM Back Propagation Dense Connection by Addition*')3\. **Case 1: 10%**
('Dilated ADAM Back Propagation Sparse Connection by Multiplication')
实际上,情况 0 ~ 6 是人工反向传播,而情况 7 ~ 16 是自动微分。
试验三结果
左图 →最低成本率
上 10 次实验的频率柱状图 →训练图像上 10 次实验的频率柱状图 右图 →测试图像上 10 次实验的频率柱状图
当学习率设置为 0.001,神经元更窄(824)时,谷歌自己的方法(大部分)优于所有其他情况。
****Percentage of Best Performing at *Lowest Cost Rate***1\. **Case 0: 90%**
('Google Brain's Added Gradient Noise + Standard Back Prop')2\. **Case 3: 10%**
('*Dilated ADAM Back Propagation Dense Connection by Addition*')
-------------------------------------------------------------
**Percentage of Best Performing at *Highest Accuracy on Training Images***1\. **Case 0: 90%**
('Google Brain's Added Gradient Noise + Standard Back Prop')2\. **Case 3: 10%**
('*Dilated ADAM Back Propagation Dense Connection by Addition*')
-------------------------------------------------------------
**Percentage of Best Performing at *Highest Accuracy on Testing Images***1\. **Case 0: 70%**
('Google Brain's Added Gradient Noise + Standard Back Prop')2\. **Case 7: 10%**
('[tf.train.GradientDescentOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/GradientDescentOptimizer)')3\. **Case 14: 10%**
('[tf.train.ProximalGradientDescentOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/ProximalGradientDescentOptimizer)')4\. **Case 16: 10%**
('[tf.train.RMSPropOptimizer](https://www.tensorflow.org/api_docs/python/tf/train/RMSPropOptimizer)')**
实际上,情况 0 ~ 6 是人工反向传播,而情况 7 ~ 16 是自动微分。
(3 月 6 日更新)试验 4 结果
左侧图**→10 次实验的频率柱状图最低成本率
中间图→10 次实验的频率柱状图训练图像的最高准确率
右侧图→10 次实验的频率柱状图测试图像的最高准确率**
当学习率被设置为 0.0025 且具有更宽的神经元(1024)时,情况 2 表现良好。
****Percentage of Best Performing at *Lowest Cost Rate***1\. **Case 5: 60%**
('Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)')2\. **Case 3: 40%**
('Dilated ADAM Back Propagation Dense Connection by Addition')
-------------------------------------------------------------
**Percentage of Best Performing at *Highest Accuracy on Training Images***1\. **Case 5: 60%**
('Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)')2\. **Case 3: 40%**
('Dilated ADAM Back Propagation Dense Connection by Addition')
-------------------------------------------------------------
**Percentage of Best Performing at *Highest Accuracy on Testing Images***1\. **Case 3: 50%**
('Dilated ADAM Back Propagation Dense Connection by Addition')2\. **Case 1: 30%**
('Dilated ADAM Back Propagation Sparse Connection by Multiplication')2\. **Case 5: 20%**
('Dilated ADAM Back Propagation Dense Connection by Addition (Different Decay / Proportion Rate)')**
存档的培训结果
为了增加这个实验的透明度,我写了另一篇博文,其中包含随着时间推移的成本图、随着时间推移的训练图像的准确性图和随着时间推移的测试图像的准确性图。要访问它,请点击此处。
缺点
我还没有时间来优化每个汽车差异化的所有超参数。然而,我在每种情况下都保持了完全相同的学习率,但是有可能我设置的学习率对于张量流的自动微分来说不是最优的。如果你正在进行这个实验(如果你愿意,你可以使用我在交互代码部分提供的代码。)并为每个设置找到一个好的 hyper 参数,请通过评论让我知道,我很想看看它们是否也能被超越。
也就是说,我相信 Tensorflow 已经超级优化了它的算法,这使得自动微分执行得更快,但在每个网络上都获得了最高的性能。总的来说,这可能是一个公平的比较。
我还注意到扩张反向传播的两点。
1。它在浅网络或神经元数量较少的情况下表现不佳
2。它长期表现良好。
红框→ 案例 15 的错误率低于任何其他案例
蓝框→ 在第 100 个时期后,案例 5 开始超出执行
如上所述,大多数时候,在第一个 100 个时期,自动微分方法具有较低的误差率。然而,在一定量的时期之后,例如 100 或 150,扩张的反向传播开始胜过。
交互代码
我搬到了谷歌 Colab 寻找交互代码!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要访问试验 1 的代码,请点击此处。
要访问试验 2 的代码,请点击此处。
要访问试验 3 的代码,请点击此处。
引用
(如果您希望使用该实现或任何信息,请引用这篇博文)
APA
**Outperforming Tensorflow’s Default Auto Differentiation Optimizers, with Interactive Code [Manual…. (2018). Medium. Retrieved 3 March 2018, from [https://medium.com/@SeoJaeDuk/outperforming-tensorflows-default-auto-differentiation-optimizers-with-interactive-code-manual-e587a82d340e](https://medium.com/@SeoJaeDuk/outperforming-tensorflows-default-auto-differentiation-optimizers-with-interactive-code-manual-e587a82d340e)**
司法协助
**"Outperforming Tensorflow’S Default Auto Differentiation Optimizers, With Interactive Code [Manual…." Medium. N. p., 2018\. Web. 3 Mar. 2018.**
哈佛
**Medium. (2018). Outperforming Tensorflow’s Default Auto Differentiation Optimizers, with Interactive Code [Manual…. [online] Available at: [https://medium.com/@SeoJaeDuk/outperforming-tensorflows-default-auto-differentiation-optimizers-with-interactive-code-manual-e587a82d340e](https://medium.com/@SeoJaeDuk/outperforming-tensorflows-default-auto-differentiation-optimizers-with-interactive-code-manual-e587a82d340e) [Accessed 3 Mar. 2018].**
最后的话
我想用我最喜欢的两句话来结束这篇文章。
杰夫·贝索斯(亚马逊 CEO):一切都是为了长远……
金尼·罗梅蒂(IBM CEO):成长与安逸不能共存
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你希望看到我所有写作的列表,请在这里查看我的网站。
同时,在我的 twitter 上关注我这里,访问我的网站,或者我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考
- 训练| TensorFlow。(2018).张量流。检索于 2018 年 3 月 3 日,来自https://www . tensor flow . org/API _ guides/python/train # optimizer
- Seo,J. D. (2018 年 02 月 05 日)。带张量流的手动回推:解耦递归神经网络,从 Google 修改 NN…2018 年 2 月 21 日检索,来自https://towards data science . com/manual-Back-Prop-with-tensor flow-Decoupled-Recurrent-Neural-Network-modified-NN-from-Google-f9c 085 Fe 8 FAE
- j . bort(2014 年 10 月 07 日)。IBM 首席执行官 Ginni Rometty:增长和舒适不能共存。检索于 2018 年 2 月 21 日,来自http://www . business insider . com/IBM-CEO-growth-and-comfort-don-co-exist-2014-10
- Saljoughian,P. (2017 年 11 月 20 日)。读完每一封亚马逊股东信后,我从杰夫·贝索斯身上学到了什么。检索于 2018 年 2 月 21 日,来自https://medium . com/parsa-VC/what-I-learn-from-Jeff-be zos-after-reading-every-Amazon-shareholder-letter-172d 92 f 38 a 41
- 页(page 的缩写)(未注明)。Pinae/TensorFlow-MNIST 示例。检索于 2018 年 2 月 22 日,来自https://github . com/pinae/tensor flow-MNIST-example/blob/master/full-connected . py
- 如何打印一个前面有一定数量空格的整数?(未注明)。检索于 2018 年 2 月 22 日,来自https://stack overflow . com/questions/45521183/how-do-I-print-an-integer-with-set-number-of-spaces-before-it
- 如何在没有科学记数法和给定精度的情况下漂亮地打印一个 numpy.array?(未注明)。检索于 2018 年 2 月 22 日,来自https://stack overflow . com/questions/2891790/how-to-pretty-printing-a-numpy-array-with-with-given
- 将浮点数限制在小数点后两位。(未注明)。检索于 2018 年 2 月 22 日,来自https://stack overflow . com/questions/455612/limiting-floats-to-two-decimal-points
- 如何防止 tensorflow 分配整个 GPU 内存?(未注明)。检索于 2018 年 2 月 23 日,来自https://stack overflow . com/questions/34199233/how-to-prevent-tensor flow-from-allocation-the-total-of-a-GPU-memory
- 关闭 tensorflow 中的会话不会重置图形。(未注明)。检索于 2018 年 2 月 23 日,来自https://stack overflow . com/questions/42706761/closing-session-in-tensor flow-sints-reset-graph
- [1]“TF . reset _ default _ graph | tensor flow”, TensorFlow ,2018。【在线】。可用:https://www . tensor flow . org/API _ docs/python/TF/reset _ default _ graph。【访问时间:2018 年 2 月 23 日】。
- 在 tensorflow 中创建 float64 变量。(未注明)。检索于 2018 年 2 月 23 日,来自https://stack overflow . com/questions/35884045/creating-a-float 64-variable-in-tensor flow
- Tensorflow 中的 global_step 是什么意思?(未注明)。检索于 2018 年 2 月 23 日,来自https://stack overflow . com/questions/41166681/what-does-global-step-mean-in-tensor flow
- python 中的零列表。(未注明)。检索于 2018 年 2 月 23 日,来自https://stack overflow . com/questions/8528178/list-of-zeros-in-python
- 使用列表中的 max()/min()获取返回的 max 或 min 项的索引。(未注明)。检索于 2018 年 2 月 23 日,来自https://stack overflow . com/questions/2474015/getting-the-index-of-returned-max-or-min-item-using-max-min-on-a-list
- 如何防止 tensorflow 分配整个 GPU 内存?(未注明)。2018 年 2 月 23 日检索,来自https://stack overflow . com/questions/34199233/how-to-prevent-tensor flow-from-allocation-the-total-of-a-GPU-memory
- 如何用 TensorFlow 得到稳定的结果,设置随机种子?(未注明)。2018 年 2 月 23 日检索,来自https://stack overflow . com/questions/36288235/how-to-get-stable-results-with-tensor flow-setting-random-seed
- 指定颜色。(未注明)。检索于 2018 年 2 月 23 日,来自https://matplotlib.org/users/colors.html
- 艾森,硕士(未注明)。使用 matplotlib 设置绘图的条形颜色。检索于 2018 年 2 月 24 日,来自http://matthiaseisen.com/pp/patterns/p0178/
- 关闭事件。(未注明)。检索于 2018 年 2 月 24 日,来自https://matplotlib . org/gallery/event _ handling/close _ event . html # sphx-glr-gallery-event-handling-close-event-py
- 模块:tf.contrib.opt | TensorFlow。(2018).张量流。检索于 2018 年 3 月 3 日,来自https://www.tensorflow.org/api_docs/python/tf/contrib/opt
- 吉尼·罗梅蒂。(2018).En.wikipedia.org。检索于 2018 年 3 月 3 日,来自https://en.wikipedia.org/wiki/Ginni_Rometty
- 杰夫·贝索斯。(2018).En.wikipedia.org。检索于 2018 年 3 月 3 日,来自https://en.wikipedia.org/wiki/Jeff_Bezos
- Only Numpy:实现“添加梯度噪声改善非常深度网络的学习”来自…(2018).成为人类:人工智能杂志。检索于 2018 年 3 月 3 日,来自https://becoming human . ai/only-numpy-implementing-adding-gradient-noise-improves-learning-for-very-deep-networks-with-ADF 23067 F9 f1
超过 50 年的编码生涯仍在继续
1969 年伍德斯托克的夏天,我正趴在一台与 IBM 主机相连的 33 型电传打字机前,开发一个从数据中学习功能的程序。是的,它是机器学习,而且它使用了当今机器学习中普遍使用的方法。就在两年前,我写了我的第一个 Fortran 程序(在穿孔卡片上),并且迷上了它。
2017 年阵亡将士纪念日(Memorial Day 2017),周一凌晨 5 点 45 分左右,我在笔记本电脑上用 python 为一个深度学习程序编写代码,弄清楚如何预测创业公司的成功。
这个故事讲述的是这中间的几年,以及编程是如何贯穿半个多世纪的愉快旅程的。对我来说,编程是一种说服的语言。这项技能对于筹集大量资金支持和为投资者创造回报至关重要。
就在一年前,1968 年的夏天,当时我还在大学三年级,我面临着失去经济支持和不得不辍学的可能性。有点不可思议的是,我遇到了物理学博士理查德·l·科伦教授,他是电气工程系的一员。他打开了研究奖学金和全额奖学金的大门。有一个条件是必须的:在他的实验室里研究铁磁性薄膜的行为。
这是因为小时候对电子产品的极度迷恋而奠定的基础。12 岁时,我获得了普通业余无线电执照,并习惯于将电子设备接入正常工作的无线电通信设备。在 1959 年,当经济上无法与世界沟通时,如果条件合适,我可以与地球上的所有地点联系。
因此,当科伦教授提出一项实验,旨在通过将磁性薄膜置于电磁场中来了解其内部工作原理时,我准备好大干一场了。一旦我们收集了数据,问题是,我们如何不理解产生结果的潜在行为?答案是:使用牛顿方法的机器学习。我不会告诉你细节,但如果你今天参加任何关于机器学习的课程,你会看到这些相同的方法在近 50 年后仍然被教授。
那年秋天,我们的工作提交给了《应用物理杂志》,并在第二年 3 月(1970 年)发表。从那时起,使用数学建模和编程成为我探索和发展思想的方式。科伦教授让我走上了攻读博士学位的道路(一个特别设计的荣誉项目让我可以直接进入研究生研究),他给我的博士委员会增加了一位赫伯·卡伦教授。
Herb Callen 教授是麻省理工学院的物理学博士,宾夕法尼亚大学的物理学教授,写了关于热力学和恒温学的主要著作。直到几十年后,我才意识到这项工作在机器学习技术和深度学习中的作用。
几年后,我意识到我开始编程与当前围绕人工智能和机器学习的热潮是多么相关。故事还在继续。
高中时,我对数学语言学产生了兴趣。这种兴趣在 70 年代初爆发,当时博士后我设法获得了一个物理和计算机科学的大学教师职位。1973 年,我访问了 DARPNET(现在的互联网),开始从事自然语言处理系统的工作,最初是用 SNOBOL 编程,但很快就移植到了神的语言 LISP。
由于痴迷于实现语言的有向图模型(扩充转换网络、语义网络),我编写了实验性的解析系统,包括用于 Intel 8080 微处理器的 microcoding one。
到 1980 年,我离开了学术界,加入了德州仪器的一个研究小组(大部分来自麻省理工学院人工智能实验室),形成了人工智能领域的早期企业研究小组之一。在那里,我们委托理查德·格林布拉特在学术界之外建造第一批两台 LISP 机器。理查德在德州仪器的实验室里建造了这两台机器。
我无法向你描述这种计算能力和触手可及的交互性所带来的快乐(请记住,仅仅在 11 年前,从每秒 10 个字符链接到大型机开始)。在那里我们写了一个系统 HELPME。HELPME 是一种在联网计算机网络上迁移文件的超链接方式(1980 年的浏览器)。
没过多久,我接到了硅谷的电话。Ed Feigenbaum 教授招募我加入了一家从斯坦福大学分离出来的新创业公司,该公司(起初)专注于将人工智能应用于基因工程。是的,这是早期的,所以我们很快就迁移到一个基于平台的人工智能公司,KEE,知识工程环境,我们把名字改为 IntelliCorp。Greg clemen son(TI 的研究员,跟随我到 CA)是主要开发人员,他和我一起编写了一个应用程序包装器来展示底层面向对象系统如何运行。我们是在借来的时间和机器上完成的。施乐帕洛阿尔托研究中心和象征帕洛阿尔托办公室的深夜让我们得以构建 1983 年在 IJCAI Karlsruhe 首次亮相的代码。该公司继续把财富 100 强中的 60%作为客户。这些公司对获取他们的软件专家的知识感兴趣。INAI (IntelliCorp 的股票代码)在 1983 年成为第一家上市的人工智能公司。
三十年来,我大部分时间都在做首席执行官,但也经常去实验室玩编程。在我 60 岁出头的时候,我决定更认真地回归编程,开始用 objective C 为 iPhone 应用程序编写代码。很快就转移到 python 和其他语言中。
对我来说,编码是证明新想法可行的一种方式。你只需要编写代码来展示一个新想法的工作原理。这比试图用幻灯片说服别人要容易得多。编程是说服的语言。给他们看一个原型。随着今天的开源社区文化,创造性发展的大门对所有年龄的人都是敞开的。
过度拟合和正则化
机器学习
在有监督的机器学习中,模型是在数据的子集上训练的,也就是训练数据。目标是根据训练数据计算每个训练示例的目标。
现在,当模型在训练数据中学习信号和噪声时,就会发生过度拟合,并且在模型没有训练的新数据上表现不佳。在下面的例子中,你可以看到前几步的欠拟合和后几步的过拟合。
现在,有几种方法可以避免在训练数据上过度拟合模型,如交叉验证采样、减少特征数量、修剪、正则化等。
随着模型复杂性的增加,正则化基本上增加了惩罚。正则化参数(lambda)惩罚除截距之外的所有参数,以便模型概括数据,不会过度拟合。
Regularization in cost function
在上面的 gif 中,随着复杂度的增加,正则化将增加对更高术语的惩罚。这将降低高次项的重要性,并使模型变得不那么复杂。
敬请关注下一篇文章,它将涵盖不同类型的正规化技术。
过度适应和大规模灭绝
你买保险是因为你“知道”坏事确实会发生,即使可能性很小,但是,在坏事没有发生的每一刻,你花在保险上的每一分钱都被浪费了。
换一种稍微不同的形式,这就是投资组合问题,换句话说:你买了 A 和 B 两家公司的股票,因为你意识到 A 不会总是相对于 B 上涨:如果 A 总是比 B 涨得多,你花在 B 上的每一分钱都是浪费。
预测分析的承诺(我认为是危险的错误)是,它可以减少甚至消除不确定性。你会知道,有了足够的数据,你可以可靠地预测股票 A 和 B 的相对表现,或者,换句话说,如果一切顺利,你总是知道,A 将永远比 B 做得更好,至少,当你买入 A 时。因为你总是知道未来,你总是 100%投资于“赢家”不需要浪费的保险!
但是你怎么知道未来呢?因为数据是这么说的。但是这些数据只是对现实的不完全反映。你知道 A“总是”赢家,因为只要你有数据,它总是赢。或者,换句话说,因为 A 是“失败者”的概率很小,以至于在你的数据收集过程中没有被抓住,不一定 A“永远不会”是失败者。
“几乎肯定”和“几乎肯定不会”是概率中的微妙概念:即使某件事在任何给定事件中几乎肯定不会发生,但在无限样本量的情况下,它会在某个时间某个地方发生——除非概率恰好为 0。然而,只要样本量是有限的(或者,通常情况下,抽样过程不是完全随机的),我们就永远无法确定某样东西的概率是零还是非常小。)
这是一个由预测分析的进步所造成的悖论(从某种意义上说,是斯蒂格利茨-格罗斯曼悖论的变体,该悖论关注价格系统的信息含量,以及其自身的信息含量如何颠覆对价格系统的依赖。).预测分析变得越好,无论是通过方法的进步还是通过更大数据的可用性,购买不确定性保险的激励就会减少——因为保险可以防范噪音,噪音就是浪费,浪费就会最小化等等。我在这里不是愤世嫉俗或讽刺:如果能够以相当高的可靠性计算出非常罕见的事件发生的几率,那么为非常罕见的事件购买保险可能会更有利,至少对中短期而言——这是几乎每个人都在操作的时间范围。但从足够长的时间来看,事情会变得更加复杂:坏事最终几乎肯定会发生。有了足够的预测分析加上中短期的心态(这通常是几乎所有“实用”数据分析的最终结果,因为长期分析与长期天气预报一样可靠),没有人会浪费资源为这些罕见的事件做准备——或者说,没有人会非常适应当前的信息环境,因为他们确切知道应该在何时以及如何发生什么,而这些罕见的事件不会发生(足以证明浪费的合理性)。
当然,如果罕见的事件真的发生了,没有人会为它们做好准备,如果没有足够的准备,再加上足够灾难性的事件,大规模灭绝就会发生——真的。当事情发生变化时,最适应(现状环境)的,而不是最不适应的,会消亡,因为适应得更好的不能同样有效地应对变化。专注于数据科学的预测性,而不是欣赏分布的整体广度,特别是助长了大规模灭绝类型逻辑的危险。
当然,我们以前确实看到过这种逻辑:不到十年前的金融危机就是这样发生的。问题在于“罕见”事件的本质使得对其概率的估计变得困难。顾名思义,它们是罕见的:它们不会产生太多可靠的数据,而我们所拥有的大部分数据都来自“显而易见的”和“常规的”来源,这些来源提供的信息很少。只要罕见事件仍然罕见,投保就没有任何好处——至少在中短期内是这样,因为,为什么,它(可能)在未来十年内永远不会发生,你(可能)会正确地期待这一点。
更经常与“人类”打交道的成熟工程学科,对他们的创造并不那么自信:他们预计事情会以预期和意外的方式出错,并在事情确实出错时花大量时间做侦查工作。他们过度保险自己,特别是当技术是新的时候。如果“数据科学”的目标是使用数据分析来做事,那么这个标签就用错了:它实际上是“数据工程”,而不是“科学”。一个好的工程师应该意识到事情会出乎意料地发展,应该设法保守地确保自己不会出问题,也就是说,不要在新的新奇小发明做他们应该做的事情上下太大的赌注,这样做,可能会推迟灭绝事件的时间。
NIPS 2017 上的总体趋势和应用(带链接!)
Long Beach was really pretty at night.
我最近有机会参加了神经信息处理系统会议(NIPS)。我很高兴我参加了,因为我学到了很多东西,建立了很多非常好的关系(另外,我还看到了我从未见过的南加州,并逃离了缅因州的严冬)。在 NIPS 上,几个重要的主题和技术似乎贯穿了整个会议和研讨会。此外,ML 的几个应用一直受到很多关注。因为一个人可以很容易地写十几篇关于 NIPs 的文章,所以在这篇文章中,我将简要地调查一下我认为是什么构成了这些支配性的主题。稍后,我会就我在 NIPS 亲自探索的那些写更详细的文章。我会把其他的留给参加过的人。我在页面底部提供了相关链接,这样你就可以在闲暇时探索这些话题。
(请注意,NIPs 是一个如此大的会议,我很容易错过一些东西,在一定程度上,这些可能反映了我自己的经历和我交往的人。尽管如此,我还是尽最大努力捕捉了 NIPs 中所有跨“学科”的突出观点。
此外,在开始之前,似乎有必要提一下,谢天谢地,会议没有受到火灾的影响,但南加州的许多人却没有这么幸运。所以,如果你有机会并且有能力的话,请向联合慈善基金会或其他慈善机构捐赠。
贝叶斯深度学习(和深度贝叶斯学习)
在 NIPs,将贝叶斯技术应用于深度学习是一个巨大的话题。周四 Yee Whye Teh 做了一个关于贝叶斯深度学习和深度贝叶斯学习的演讲。他描述了同步在分布式贝叶斯深度学习中的工作方式,指出服务器本质上维护的是后验分布,而不是参数的权威副本。然后,他将这一想法与克服神经网络中的灾难性遗忘和弹性权重整合的问题联系起来。在演讲的第二部分,他描述了深度学习技术如何改善贝叶斯学习。他描述了 DL 如何帮助克服贝叶斯模型中的一些僵化之处,并增加它们的推理和可伸缩性。除了主题演讲,还有几个关于贝叶斯技术的焦点。我个人最喜欢的是贝叶斯甘斯。
我还看到贝叶斯技术在元学习研讨会上出现了几次。此外,贝叶斯技术保持着四个直接相关的研讨会的记录(至少今年如此)。在大楼的四周,你可以听到人们在谈论一些技术或模型的贝叶斯理论。最后,在深度学习中使用贝叶斯方法有可能帮助解决可解释性问题,或者至少提供更多“微妙”的决策。这就引出了我们的下一个趋势。
严谨性、可解释性、稳定性/安全性和理论性
这种趋势并不奇怪。到现在为止,你可能已经看过阿里·拉希米的《时间的考验》视频以及由此引发的讨论(如果你还没有下面的演示链接)。需要注意的是,这四个主题是相似的,但并不完全相同。我选择将它们归为一类,因为它们都与提供一种解释有关,无论是技术的还是非技术的,理论的还是实验的,经验的还是定性的,解释了为什么一个模型会以这种方式运行(或者保证模型的整体稳定性)。例如,人们可以通过实验结果而不是理论来证明严谨性。此外,可解释性对不同的人来说可能意味着不同的事情(例如,ML 研究员认为对模型决策的合理解释可能不足以说服医生做出诊断[或让患者接受])。我不会过多地讨论关于炼金术和工程学的激烈争论,除了说它肯定在双方都产生了大量的讨论和强烈的观点(下面的链接)。
我要说的是,无论你是否认为可解释性或“严谨性”对研究是必不可少的,它在应用的实践层面上是重要的。如果我们不能解释国会做出的决定及其原因,我们怎么能指望国会批准无人驾驶汽车呢?或者我们怎么能仅仅因为一个模型认为某人患癌症的概率很高就指望医生进行手术呢?最后,对可解释性的研究将大大有助于调试神经网络。至少对我来说,有很多次当我写代码时,它运行得很好,但是网络不会收敛,或者它给我一个完全意想不到的结果。也就是说,在可解释性研讨会和专题讨论会上,有许多很好的演示和有趣的作品,我强烈建议你们去看看。
几何深度学习和图形 CNN
很多数据自然最好用图类型结构来表示;例如,社交网络、多个城市之间的路线或化学品。然而,传统的神经网络不能很好地处理这种类型的结构化数据。在 NIPs 2017 上,图形神经网络或 GNN 是突出的特色。在 NIPS 的第一天,迈克尔·布朗斯坦、琼·布鲁纳、阿瑟·斯拉姆和扬·勒昆主持了一个关于结构和流形的几何深度学习的教程。在教程中,他们解释了 GNN 模型背后的理论及其几个应用。但是 GNN 也出现在一些 NIPS 的报纸和许多车间里。这个话题在非正式讨论中也多次出现。就个人而言,我认为能够在神经网络中“保持”图形或流形结构是一大进步,可以应用于各种不同的领域。
生成性对抗网络
今年 GANs 在日本很受欢迎。也许没有去年那么热,但在整个主要会议期间和几乎每个研讨会上都可以看到它们。在主会议上,我们有“双代理甘斯的照片真实感和身份”、“维甘”、“f-甘斯”、“双代理甘斯”、“瓦瑟斯坦甘斯的改良训练,仅举几例。尽管没有专门的工作室,他们仍然在周五和周六到处出现。例如,创意工作室几乎完全由创造艺术、音乐和演讲的甘人组成。几位发言人甚至在 ML4H 和 MedNIPS 研讨会上提到了 gan。显然,在医学领域中有几种应用,例如扩充训练数据、生成合成数据(不符合 HIPPA ),以及重建/改变图像的模态(即,从 MRI 到 ct)。
强化学习(特别是深度强化学习)
强化学习仍然是 NIPs 的热门话题。主要会议有一个完整的轨道致力于 RL,一个关于如何与人一起使用 RL 的教程,以及一个关于深度 RL 的研讨会。但更重要的是 RL 在其他研讨会和讨论中出现的次数。例如,ML4H 研讨会上的几篇论文讨论了使用 RL 来指导败血症治疗和疟疾可能性预测。
这次会议清楚地表明(至少对我来说), RL 不再仅仅用于有明确规则的计算机和棋盘游戏,现在研究人员积极地将 RL 应用于解决从败血症治疗到聊天机器人到机器人的现实世界问题。
元学习
在 NIPS,元学习也是一个相当大的话题。元学习本质上是学习学习或优化优化算法的艺术。如果这看起来令人困惑,你并不孤单。在小组讨论中,关于元学习到底是什么有很长的争论。至少在这次会议的背景下,元学习似乎本质上包括使用算法来寻找模型的最优超参数和/或网络的最优结构。
基本思想是,大量时间(通常是金钱)被浪费在手工测试各种超参数配置和不同的网络结构上。很多时候,可能永远也找不到真正的最佳结构。如果我们有一种算法可以学习优化网络以提供最佳结果,那会怎么样?几位发言者在周四晚上的研讨会上探讨了这一问题,讨论在周五的研讨会上继续进行。许多人还在交谈中提出元学习,询问演讲者他们是否会自动调整他们的超参数。
二。应用领域
Long Beach was bright and sunny for the pretty much the entire conference.
医疗保健
将机器学习应用于医疗保健是今年会议上的一个热门话题。会议有两个研讨会,医疗保健的机器学习(ML4H)和医学成像会议 NIPs(这两个我将在未来的文章中详细总结),以及几个相关的研讨会,其中包括大量医疗保健相关的提交材料(例如,计算生物学)。总之,ML4H 专注于医疗保健的各个领域。这些领域包括将 ML 用于药物研发、医院运营(如预测住院时间、手部卫生等。),以及遗传学研究。医学成像与专注于医学成像的 NIPS 相遇,主要探索 ML 技术如何帮助医学图像分割、重建和分类。
医疗保健也出现在主要会议上。周二,Deep Genomics 的布伦丹·弗雷(Brendan Frey)发表了关于人工智能如何加快研究甚至提供遗传病治疗效果的主题演讲。此外,有大量的医疗人工智能公司在会议中心进行互动演示。
机器人学
机器人技术似乎是另一个在主要会议和研讨会上受到相当多关注的领域。周二,在太平洋舞厅有一场“*使用视觉想象和元学习的深度机器人学习”*的演示。然后在周三,Pieter Abbel 做了一个关于机器人深度学习的演讲。同样,周五也有一个讨论“现实世界中的表演和互动”的研讨会
科学、能源和工程
似乎也有很多关于在其他科学中应用机器学习技术(或者反过来使用其他科学的原理来增强机器学习)和解决能源问题的内容。在主会议上,有一个关于能源和排放的主题发言。具体来说,周一在开场白之后,约翰·普拉特谈到了“减少二氧化碳排放的能源战略”在这篇文章中,他描述了如何应用最大似然法来预测能源的利用和寻找能源的组合,以便降低到当前排放量的一个设定的分数。普拉特接着讨论了如何利用 ML 在核聚变研究中取得进展。
在工作室那边有两个有趣的工作室。第一次是针对物理科学的深度学习,第二次是针对分子和材料的深度学习。ML for computational biology workshop 也关注这些想法(尽管正如人们所料,它确实与医疗保健相关的想法有相当多的重叠)。
结论
这只是今年 NIPs 上展示的一些真正令人兴奋的趋势和想法的一瞥。这些话题中有许多我只是刚刚触及,所以我鼓励你更详细地探索它们。此外,还有许多其他的小话题也同样有趣,如果不是更有趣的话。我将会写几篇关于 ML4H、MedNIPs、可解释性和(可能)元学习的后续文章。敬请关注。一如既往,如果你认为我错过了什么或有其他意见,请在下面留下。
链接(如承诺的)
贝叶斯技术
Keynote by Yee Whye Teh
NIPS 2017 贝叶斯深度学习研讨会—2017 年 12 月 9 日,美国长滩长滩会议中心。
bayesiandeeplearning.org](http://bayesiandeeplearning.org) [## bayesopt.com
编辑描述
bayesopt.com](http://bayesopt.com/) [## (几乎)贝叶斯学习的 50 个阴影:PAC-贝叶斯趋势和见解- NIPS 2017 研讨会
我们认为,现在是时候确定当前 PAC-Bayesian 相对于其他现代方法的趋势了
bguedj.github.io](https://bguedj.github.io/nips2017/50shadesbayesian.html)
严谨性和可解释性
[## NIPS 2017 研讨会:解读、解释和可视化深度学习——现在怎么办?
黑匣子。在医疗诊断或自动驾驶汽车等敏感应用中,模型对环境的依赖性越来越大
www.interpretable-ml.org](http://www.interpretable-ml.org/nips2017workshop/) [## 可解释的 ML 研讨会— NIPS 2017
美国加州长滩 NIPS 2017 可解释 ML 研讨会
可解释的. ml](http://interpretable.ml)
The talk of Ali Rahimi at NIPS
Facebook post in response by Yann and the resulting discussion in the comments.
几何深度学习
在过去十年中,深度学习方法(例如卷积神经网络和递归神经网络)允许…
geometricdeeplearning.com](http://geometricdeeplearning.com/)
强化学习
Tutorial on RL with people
Keynote at the Deep Reinforcement Learning Symposium
Main conference RL spotlight
虽然强化学习的理论解决了一类极其普通的学习问题,但它有一个共同的特点
sites.google.com](https://sites.google.com/view/deeprl-symposium-nips2017/home)
甘斯
如前所述,没有太多的“纯 GAN”内容,但它们出现在许多研讨会和聚光灯下。
本次会议有很多关于甘斯。
元学习
[## 元学习研讨会
出现了几种元学习方法,包括基于贝叶斯优化、梯度下降…
metalearning-symposium.ml](http://metalearning-symposium.ml/) [## 主页
@NIPS 2017 年 12 月 09 日星期六长滩凯悦酒店,灯塔舞厅 D+E+F+H
metalearning.ml](http://metalearning.ml/)
车间
卫生保健
https://ml 4 health . github . io
[## med-nips 2017
“医学成像与 NIPS 相遇”是 NIPS 2017 的卫星研讨会。该研讨会旨在将来自…的研究人员聚集在一起
sites.google.com](https://sites.google.com/view/med-nips-2017)
能源和科学
第 31 届神经信息大会物理科学深度学习(DLPS)研讨会网站…
dl4physicalsciences.github.io](http://dl4physicalsciences.github.io) [## NIPS 2017 研讨会:分子和材料的机器学习
机器学习的成功一次又一次地在分类、生成模型和…
www.quantum-machine.org](http://www.quantum-machine.org/workshops/nips2017/)
机器人
[## NIPS 17 机器人学习
近年来,机器人技术在公共领域的实际应用方面取得了长足的进步。机器人…
sites.google.com](https://sites.google.com/view/nips17robotlearning/home)
过度拟合与欠拟合:一个完整的例子
探索和解决基础数据科学问题
当你学习数据科学时,你会意识到没有真正复杂的想法,只是许多简单的积木组合在一起。神经网络可能看起来非常先进,但它实际上只是无数小想法的组合。当您想要开发一个模型时,不要试图一次学习所有的东西,一次完成一个模块会更有效率,也更少令人沮丧。这可以确保你对基本原理有一个坚实的概念,避免许多会阻碍他人的常见错误。此外,每一部分都开辟了新的概念,让你不断积累知识,直到你可以创建一个有用的机器学习系统,同样重要的是,理解它是如何工作的。
Out of simple ideas come powerful systems (Source)
这篇文章通过一个完整的例子展示了一个基本的数据科学构建模块:欠拟合与过拟合问题。我们将探讨这个问题,然后实现一个叫做交叉验证的解决方案,这是模型开发的另一个重要原则。如果你正在寻找一个关于这个话题的概念框架,请看我之前的帖子。这篇文章中生成的所有图表和结果都是用 Python 代码写的,这些代码在 GitHub 上。我鼓励任何人去检查代码,并做出自己的改变!
模型基础
为了讨论欠拟合和过拟合,我们需要从基础开始:什么是模型?模型只是一个将输入映射到输出的系统。例如,如果我们想预测房价,我们可以制作一个模型,它接收房子的平方英尺并输出价格。一个模型代表了一个问题的理论:在平方英尺和价格之间有一些联系,我们制作一个模型来了解这种关系。模型是有用的,因为我们可以使用它们来预测给定输入的新数据点的输出值。
模型从训练数据集中学习输入(称为要素)和输出(称为标注)之间的关系。在训练期间,模型被给予特征和标签,并学习如何将前者映射到后者。训练好的模型在测试集上进行评估,我们只给它特征,它进行预测。我们将预测与测试集的已知标签进行比较,以计算准确性。模型可以采取多种形式,从简单的线性回归到深度神经网络,但所有监督模型都基于从训练数据中学习输入和输出之间关系的基本思想。
培训和测试数据
要做一个模型,我们首先需要有底层关系的数据。对于本例,我们将使用 x 值(要素)和 y 值(标注)创建自己的简单数据集。我们数据生成的一个重要部分是给标签添加随机噪声。在任何真实世界的过程中,无论是自然的还是人为的,数据都不完全符合趋势。在我们无法测量的关系中,总是存在噪音或其他变量。在房价的例子中,面积和价格之间的趋势是线性的,但是由于影响房价的其他因素,价格并不完全在一条线上。
Example of a real-world relationship (Source)
我们的数据同样具有趋势(我们称之为真实函数)和随机噪声,以使其更加真实。创建数据后,我们将其分成随机的训练集和测试集。该模型将尝试学习训练数据上的关系,并根据测试数据进行评估。在这种情况下,70%的数据用于训练,30%用于测试。下图显示了我们将探究的数据。
Data and True Generating Funtion
我们可以看到,由于我们添加了随机噪声,我们的数据在真实函数(部分正弦波)周围分布有一些变化(详见代码)。在训练过程中,我们希望我们的模型学习真正的功能,而不会被噪音“分散注意力”。
模型建筑
选择一个模型可能看起来令人生畏,但是一个好的规则是从简单开始,然后逐步建立。最简单的模型是线性回归,其中输出是输入的线性加权组合。在我们的模型中,我们将使用线性回归的扩展,称为多项式回归来了解 x 和 y 之间的关系。多项式回归,其中输入被提升到不同的幂,仍然被认为是“线性”回归的一种形式,即使图形没有形成直线(这一开始也让我很困惑!)多项式的一般方程如下。
这里 y 代表标签,x 代表特征。β项是将在训练期间学习的模型参数,ε是任何模型中存在的误差。一旦模型学习了β值,我们可以插入 x 的任何值,并获得 y 的相应预测。多项式由其阶定义,它是方程中 x 的最高幂。直线是一次多项式,而抛物线是二次多项式。
Polynomials of Varying Degree (Source)
过度拟合与欠拟合
过拟合 vs 欠拟合的问题终于在我们谈到多项式次数的时候出现了。程度代表模型中的灵活性,较高的能力允许模型自由地触及尽可能多的数据点。拟合不足的模型灵活性较低,并且无法解释数据。理解这个问题的最好方法是看一看展示这两种情况的模型。
首先是一个 1 次多项式拟合的欠拟合模型。在左图中,橙色的模型函数显示在真实函数和训练观测值的顶部。在右侧,显示了测试数据的模型预测与真实功能和测试数据点的比较。
Underfit 1 degree polynomial model on training (left) and testing (right) datasets
我们的模型直接通过训练集,不考虑数据!这是因为欠拟合模型具有低方差和高偏差。方差是指模型对训练数据的依赖程度。对于 1 次多项式的情况,该模型很少依赖于训练数据,因为它几乎不关注点!相反,该模型具有很高的偏差,这意味着它对数据做出了强有力的假设。对于这个例子,假设数据是线性的,这显然是错误的。当模型进行测试预测时,偏差会导致它做出不准确的估计。由于这种偏差,模型无法学习 x 和 y 之间的关系,这是一个明显的拟合不足的例子。
我们看到低学位导致不适合。一个自然的结论是学习训练数据,我们应该只是增加模型的程度来捕捉数据中的每一个变化。然而这不是最好的决定!
Overfit 25 degree polynomial model on training (left) and testing (right) datasets
由于具有如此高的灵活性,该模型尽最大努力考虑每一个训练点。这似乎是个好主意——难道我们不想从数据中学习吗?此外,该模型在训练数据上具有很高的分数,因为它接近所有的点。虽然如果训练观察完美地代表了真实函数,这是可以接受的,但是因为数据中存在噪声,所以我们的模型最终符合噪声。这是一个方差很大的模型,因为它会根据训练数据发生显著变化。测试集上的预测优于 1 度模型,但是 25 度模型仍然不学习关系,因为它本质上记忆训练数据和噪声。
我们的问题是,我们想要一个不是“记忆”训练数据,而是学习实际关系的模型!怎样才能找到一个多项式次数合适的平衡模型?如果我们选择训练集上得分最高的模型,我们将只选择过拟合模型,但这不能很好地推广到测试数据。幸运的是,有一种成熟的数据科学技术来开发最佳模型:验证。
确认
我们需要创建一个具有最佳设置(程度)的模型,但我们不想一直经历训练和测试。在我们的例子中,测试性能差并没有什么后果,但是在一个实际的应用程序中,我们可能正在执行一个关键的任务,比如诊断癌症,部署一个有缺陷的模型会有严重的负面影响。我们需要某种预测试来用于模型优化和评估。这种预先测试被称为验证集。
一个基本的方法是除了训练集和测试集之外还使用一个验证集。但是这也带来了一些问题:我们可能会过度适应验证集,并且我们会有更少的训练数据。验证概念的一个更聪明的实现是 k 重交叉验证。
这个想法很简单:我们不使用单独的验证集,而是将训练集分成许多子集,称为折叠。我们以五折为例。我们执行一系列的训练和评估循环,每次我们在 4 个折叠上训练,在第 5 个折叠上测试,称为坚持组。我们重复这个循环 5 次,每次使用不同的折叠进行评估。最后,我们对每个折叠的分数进行平均,以确定给定模型的整体性能。这允许我们在部署之前优化模型,而不必使用额外的数据。
Five-Fold Cross-Validation (Source)
对于我们的问题,我们可以通过创建一系列不同程度的模型,使用交叉验证来选择最佳模型,并使用 5 重交叉验证来评估每个模型。具有最低交叉验证分数的模型将在测试数据上表现最佳,并且将在欠拟合和过拟合之间实现平衡。我选择使用从 1 到 40 度的模型,以覆盖广泛的范围。为了比较模型,我们计算均方误差,即预测值和实际值的平方之间的平均距离。下表显示了按最低误差排序的交叉验证结果,该图显示了 y 轴上有误差的所有结果。
Cross Validation Results
欠拟合和过拟合模型的交叉验证误差超出了图表范围!4 度的模型似乎是最佳的。为了测试结果,我们可以制作一个 4 度模型,并查看训练和测试预测。
Balanced Four degree polynomial model on training (left) and testing (right) datasets
没有比符合数据的模型更美的了!此外,我们知道我们的模型不仅密切跟踪训练数据,它实际上已经了解了 x 和 y 之间的关系。
为了验证我们拥有最佳模型,我们还可以绘制出所谓的训练和测试曲线。这些在 x 轴上显示了我们调整的模型设置,在 y 轴上显示了训练和测试误差。欠拟合的模型将具有高训练和高测试误差,而过拟合的模型将具有极低的训练误差但高测试误差。
Training and Testing Curves
这个图表很好地总结了过度拟合和欠拟合的问题。随着模型灵活性的增加(通过增加多项式次数),由于灵活性的增加,训练误差不断减小。然而,测试设置的误差只会随着我们将灵活性增加到一定程度而降低。在这种情况下,这发生在 5 度,当灵活性增加超过该点时,训练误差增加,因为模型已经记忆了训练数据和噪声。交叉验证在这个测试数据上产生了第二好的模型,但是从长远来看,我们期望我们的交叉验证模型表现最好。确切的度量标准取决于测试集,但平均来说,交叉验证的最佳模型将优于所有其他模型。
结论
过度拟合和欠拟合是一个基本问题,即使是经验丰富的数据分析师也会犯错误。在我的实验室里,我见过许多研究生用极低的误差拟合他们的数据,然后急切地用结果写一篇论文。他们的模型看起来很棒,但问题是他们甚至从未使用过测试集,更不用说验证集了!该模型只不过是训练数据的过度拟合表示,当其他人试图将他们的模型应用于新数据时,学生很快就会学到这一课。
幸运的是,这是一个我们可以很容易避免的错误,因为我们已经看到了使用交叉验证进行模型评估和优化的重要性。一旦我们理解了数据科学中的基本问题以及如何解决它们,我们就可以自信地建立更复杂的模型,并帮助他人避免错误。这篇文章涵盖了很多主题,但希望你现在对建模的基础、过度拟合与欠拟合、偏差与方差以及交叉验证的模型优化有所了解。数据科学就是要乐于学习,并不断向你的技能组合中添加更多工具。这个领域令人兴奋,因为它潜在的有益影响和不断学习新技术的机会。
我欢迎反馈和建设性的批评。可以在推特上找到我,电话是 @koehrsen_will 。我要感谢 Scikit-Learn 的贡献者,感谢他们在这个主题上的优秀范例。
过度拟合与欠拟合:一个概念性的解释
基于示例的核心数据科学概念框架
说你想学英语。你之前对英语一无所知,但你听说过最伟大的英国作家是威廉·莎士比亚。一个自然的做法肯定是把自己锁在图书馆里,背他的作品。经过一年的学习,你从学习中走出来,来到纽约市,向你见到的第一个人打招呼,说“早上好,朋友!”作为回应,你得到的是鄙视的目光和喃喃自语的“疯了”。你泰然自若地又问了一遍:“亲爱的女士,我们仁慈的女士怎么样了?”又一次失败和匆忙撤退。第三次尝试失败后,你心烦意乱:“多么羞耻多么悲伤!”。确实令人羞愧:你刚刚犯了建模中最基本的错误之一,过度拟合训练数据。
在数据科学课程中,过度拟合模型被解释为对训练集具有高方差和低偏差,这导致对新测试数据的泛化能力差。让我们从学习英语的角度来打破这个令人困惑的定义。我们想要建立的模型是如何使用英语进行交流的一种表示。我们的训练数据是莎士比亚的全部作品,我们的测试集是纽约。如果我们根据社会接受度来衡量表现,那么我们的模型就不能概括或转化测试数据。到目前为止,这似乎很简单,但是方差和偏差呢?
方差是模型根据训练数据而变化的程度。由于我们只是简单地记忆训练集,我们的模型具有很高的方差:它高度依赖于训练数据。如果我们读的是 J.K .罗琳的全部作品而不是莎士比亚,模式就完全不一样了。当具有高方差的模型应用于新的测试集时,它不能很好地执行,因为没有训练数据,它会丢失所有数据。这就像一个学生背下了课本上的问题,却在面对现实世界的问题时束手无策。
Sometimes even grad students should go outside
偏差是方差的另一面,因为它代表了我们对数据所做假设的强度。在我们学习英语的尝试中,我们没有形成最初的模型假设,而是相信吟游诗人的作品能教会我们关于语言的一切。这种低偏差可能看起来是积极的——为什么我们会想要偏向我们的数据呢?然而,我们应该始终怀疑数据告诉我们完整故事的能力。任何自然过程都会产生噪音,我们不能确信我们的训练数据捕捉到了所有的噪音。通常,我们应该对我们的数据做出一些初始假设,并在我们的模型中为训练数据中看不到的波动留出空间。在我们开始阅读之前,我们应该确定莎士比亚的作品本身并不能教会我们英语,这将导致我们在记忆训练数据时要小心谨慎。
总结到目前为止:偏差是指我们忽略数据的程度,方差是指我们的模型对数据的依赖程度。在任何建模中,在偏差和方差之间总会有一个权衡,当我们构建模型时,我们试图达到最佳平衡。偏差与方差适用于任何模型,从最简单到最复杂,这是数据科学家需要理解的一个重要概念!
我们看到过拟合的模型具有高方差和低偏差。反过来呢:低方差和高偏差?这就是所谓的欠拟合:一个欠拟合的模型不是太紧密地跟随训练数据,而是忽略了来自训练数据的经验教训,并且不能学习输入和输出之间的潜在关系。
让我们以我们的例子来思考这个问题。从我们之前建立英语模型的尝试中,我们决定提前对模型做一些假设。我们也转换我们的训练数据,看所有的节目来自学英语。为了避免重复我们第一次尝试的错误,我们提前做了一个假设,即只有以语言中最常见的单词开始的句子才是重要的,这些单词包括 the、be、To、of 和 a。当我们学习时,我们不去注意其他的句子,自信我们会建立一个更好的模型。
经过长时间的训练,我们再次踏上了纽约的街头。这一次我们的情况稍微好一点,但是我们的谈话还是没有结果,我们不得不承认失败。虽然我们知道一些英语,可以理解有限数量的句子,但由于我们对训练数据的偏见,我们无法学习语言的基本结构。该模型没有遭受高方差,但我们从我们最初的尝试矫枉过正和欠拟合!
Graphs of underfitting (high bias, low variance) vs overfitting (low bias, high variance) (Source)
我们能做什么?我们对数据非常关注,并且过度拟合。我们忽略了数据,而且我们吃了亏。一定有办法找到最佳平衡!幸运的是,数据科学中有一个成熟的解决方案,叫做验证。在我们的例子中,我们只使用了一个训练集和一个测试集。这意味着我们无法提前知道我们的模型在现实世界中的表现。理想情况下,我们会有一个“预测试”集来评估我们的模型,并在真正的测试之前做出改进。这种“预测试”被称为验证集,是模型开发的关键部分。
我们两次学习英语的失败让我们变得更聪明,我们现在决定使用一套验证方法。我们同时使用莎士比亚的作品和《老友记》节目,因为我们了解到更多的数据几乎总能改进一个模型。这一次的不同之处在于,在训练之后和上街之前,我们在一群朋友身上评估我们的模型,这些朋友每周聚在一起用英语讨论时事。第一周,我们几乎被踢出对话,因为我们的语言模型太差了。然而,这只是验证集,每次我们犯错误时,我们都能够调整我们的模型。最终,我们可以在与团队的对话中坚持自己的立场,并宣布我们已经为测试集做好准备。再次在现实世界中冒险,我们终于成功了!我们的模型现在非常适合交流,因为我们有一个关键的元素,一个用于模型开发和优化的验证集。
这个例子需要简化。在数据科学模型中,我们使用许多验证集,因为否则我们最终会过度适应验证集!这是通过交叉验证来解决的,其中我们将训练数据分成不同的子集,或者如果我们有大量数据,我们可以使用多个验证集。这个概念性的例子仍然涵盖了问题的所有方面。现在,当您听到过度拟合与欠拟合以及偏差与方差时,您就有了一个概念框架来理解问题以及如何解决它!
数据科学可能看起来很复杂,但它实际上是由一系列基本构件构建而成的。本文涉及的几个例子是:
- **过度拟合:**过于依赖训练数据
- **欠拟合:**未能学习训练数据中的关系
- **高方差:**模型根据训练数据发生显著变化
- 高偏差:关于模型的假设导致忽略训练数据
- 过拟合和欠拟合导致测试集上的差泛化
- 用于模型调整的验证集可以防止欠拟合和过拟合
数据科学和其他技术领域不应该脱离我们的日常生活。通过用真实世界的例子来解释概念,我们可以把它们放到上下文中。如果我们理解了这个框架,那么我们就可以用解决问题的技巧来填充细节。下一篇文章将提供一个使用图表和指标的例子,所以如果你想要一个更坚实的后盾,检查一下。在那之前,亲爱的读者们,再见吧!
我欢迎反馈和建设性的批评。你可以在推特上找到我。
我要感谢 Taylor Koehrsen(顺便说一句,PharmD)帮助我在写作中听起来不那么像工程师!
盖过了其他的点!过度抽签的问题。
在讨论了关于第一个帖子的数据的情节后。我在这里谈论一个关于视觉化的非常重要的问题,一个实际上可以让你的推论完全错误的问题。所以在我继续之前,这里是可视化讨论的第一部分
因此,在我上一篇文章发表一年后,我来到了这里。发生了各种各样的事情,但有一件事是不变的,那就是…
towardsdatascience.com](/what-plot-why-this-plot-and-why-not-9508a0cb35ea)
言归正传!
那么什么是过抽?在先前的图/数据上绘制数据的“现象”。迷惑?让我用更简单的话来分解一下想象一下,有一个身材矮小苗条的人站在一条线上,然后一个肥胖高大的人站在他的正前方,这基本上隐藏/遮蔽了身材矮小苗条的人,并从线上彻底根除了他的存在。
让我们来看看这个小小的“艺术”
Red guy overshadows the slim one!
如果你注意到上图中红色的人遮住了他身后的人。我没有给它上色,这样可以理解为红色的人后面有一个人。但是想象它是一个人,红色的人基本上会隐藏苗条的人。
Where’s the slim guy ?
这是一个问题不是吗?嗯,同样的问题发生在视觉化过程中。许多有抱负的数据科学家和分析师专注于绘制数据,但有时往往会忽略过度绘制,因为显示的是多数,但少数是重要的。
战战兢兢!
在前一篇文章中,我提到了抖动点的问题,这是解决过度渲染点的一个好方法。那么抖动背后的想法是什么?让我们假设您正在为一个数据集绘制点,该数据集由 X 轴销售和 Y 轴广告组成。
这是 Google Sheet 上的一个带有散点图的模拟数据。
Well , Where are the other two points ?
如果你从图中注意到只有 4 个图,但有 6 行!两排在哪里?
坦白地说,这似乎很完美。因为我们有两点具有相同的销售价值和广告价值。但是应该有六个情节,那么到底发生了什么?facebook 使用 channel 的意义在于过度渲染了 twitter 的意义。第二个谷歌广告超过了第一个谷歌广告点。(不要混淆为重复)
现在修复!抖动点。那么它是做什么的呢?抖动点基本上创建了范围,所以 twitter 和 facebook 的同一点会直观地位于区间[31.5 到 32.5]。
所以改变后的情节看起来像这样,
6 points! Awesome
所以如果你注意到有 6 个点!很棒吧?抖动就是这样工作的,我们再举一个例子。
Another example of Overplotting!
如果你注意到分数抽多了!现在,让我们利用抖动的力量!
Shape looks the same as previous plot!
如果你现在注意到了,我们可以说低于 650 范围的点的人口分布更少!但是我们实际上不能从前面的情节中推断出同样的情况。我在这里试图推断的是,我们可以看到巨大的人口差异!由于点的透明性,这也是可能的。这就把我带到了下一个环节。
透明度很重要
无论你谈论的是政府还是你的个人生活,透明度对于某些特定的事情总是很重要的,同样,对于一个数据科学家来说,用透明度来描绘这些点也是非常重要的。这有助于理解点的分布以及异常值。在我作为一名评审员的经验中,我注意到许多学生试图推断散点图而没有实际调整alpha
,这实际上是点的透明度。所以你可能会想,这真的有什么不同吗?
的确如此。它确实很重要。有时我们会处理包含异常值和超出范围值的数据。我们可以通过使用不同的技术来移除它们,这将是我下一篇博客的一部分。但有时它们确实有重要意义,比如想象一下,你有相同的销售和广告数据,你有像[(1,1),(3,2),(4,4),(10,10)]这样的点,这些点的值基本上都在增加,在检查异常值时,我们实际上可能会删除该点。但这一点可能具有重要意义。这就是点的透明度进入画面的地方。
让我们看看这个例子,
Lots of point’s
所以人口看起来是中心的。但是让我们来看看同样的透明情节。
Oh , Here’s where it lies!
现在,我们可以推断出,大多数点在 x 轴上大约是 0.3 到 0.4,在 y 轴上大约是 0.05 到 0.1,这是一个故事。
关于过抽的最后一点是facet_grid
。让我们把它盖住!
刻面!看到点的不同面
那么什么是刻面呢?面是事物的一个侧面或方面。如果你正在考虑辞去你的日常工作,成为一名马戏团演员,你应该首先考虑你的新生活会是什么样的。Facet 与 face 这个词有关,也可以指钻石或其他宝石的平面。(根据词汇)
当比较两个以上的变量时使用,它形成由行和列刻面变量定义的面板矩阵。当您有两个离散变量,并且变量的所有组合都存在于数据中时,这是最有用的。
参考,
(【http://ggplot2.tidyverse.org/reference/facet_grid.html】T2
那么,刻面是如何帮助减少过度绘制的呢?想象一下,你有不同类的不同点,一个类比另一个类出现的次数多。在这种情况下,出现次数较多的类的点将比出现次数较少的类的点更加可见。
让我们看看这个例子,
如果你从图中注意到,即使在设置了透明度之后,我们仍然不能确定各个类的分布,在这种情况下,小平面图就出现了。这是同样的情节,
Clear.
与上面的图相比,上面的图更清晰,我们可以更好地从这个图中推断。
因此,这些是少数真正有用的技术。
数据可视化是一门艺术,是通过视觉信息讲述故事的艺术。在我看来,每个数据科学家都不应该忽视对可视化的强调。
再见了。
生成性对抗网络概述——第一部分
看看我的 YouTube 上甘斯 的视频换个视角。本文原载于
本系列文章的目的是提供 GAN 研究的概述并解释其贡献的性质。我自己是这个领域的新手,所以这肯定是不完整的,但希望它可以为其他新手提供一些快速的背景。
对于第一部分,我们将在高层次上介绍 GANs,并总结原始论文。如果您已经熟悉了基础知识,请随意跳到第二部分。假设你熟悉神经网络的基础知识。
背景
**创成式是什么意思?在高层次上,生成模型意味着您已经绘制了数据本身的概率分布。在图像的情况下,这意味着你有每一个可能的像素值组合的概率。这也意味着您可以通过从该分布中采样来生成新的数据点(即选择具有大概率的组合)。如果你在计算机视觉领域,这意味着你的模型可以从头开始创建新的图像。例如,这是一个生成的面。
以防这还没有完全被理解:这不是一个真实的人,这是一张电脑发明的脸。GAN 可以做到这一点,因为它被给予了大量的面部图像来学习,这导致了概率分布。这个图像是从分布中提取的一个点。有了创成式模型,你可以创造出以前不存在的新东西。音频、文本、图像…等等。非常非常酷的东西。
原甘
Ian Goodfellow 等人的原始论文概述了基本方法,构建了理论基础并给出了一些示例基准。
GANs 没有发明生成模型,而是提供了一种有趣而方便的学习方法。它们被称为“对抗性的”,因为问题的结构是两个实体相互竞争,而这两个实体都是机器学习模型。
最好用一个例子来解释。假设您想要构建一个面部图像生成器。你首先向一个系统输入一堆随机数,它将它们相加相乘,然后应用一些奇特的功能。最后,它输出每个像素的亮度值。这是你的生成模型*——你给它噪音,它生成数据。现在,假设你这样做 10 次,得到 10 个不同的假图像。*
接下来,你抓取 10 张真实面孔的图像。然后,你把假图像和真图像都输入到一个不同的叫做鉴别器的模型中。它的工作是为每个输入图像输出一个数字,告诉你图像是真实的概率。开始时,生成的样本只是噪声,所以您可能认为这很容易,但鉴别器也一样糟糕,因为它也没有学到任何东西。**
对于假图像上的每一个错误,鉴别者会受到惩罚,而生成者会得到奖励。基于对真实图像的正确分类,鉴别器也受到惩罚或奖励。这就是为什么它们被称为对抗性的——鉴别者的损失就是生产者的收益。久而久之,竞争导致相互提高。
最后,使用“网络”一词,因为作者使用神经网络来模拟发生器和鉴别器。这太棒了,因为它提供了一个简单的框架,使用惩罚/奖励来调整网络参数,使它们能够学习:熟悉的反向传播。
理论基础
我不会再现论文中所有血淋淋的细节,但值得一提的是,它们展示了两者:
- 优化目标 V(D,G)导致发电机概率分布与真实概率分布精确匹配。这意味着你的假例子是完美的,无法与真实的例子区分开来。
- 作者的梯度上升/下降训练算法收敛到这个最优值。所以你不仅知道你需要做什么,而且知道怎么做。
为了建立直觉,在上面的优化目标 V(D,G)中,D(x)项是鉴别器对以下问题的回答:输入 x 来自真实数据集的概率是多少?如果你把 G(z)代入这个函数,当你给它假数据时,它就是鉴别器的猜测。如果你分别考虑 D 和 G,你会发现 G 希望 V(D,G)小,而 D 希望这个大。这激发了算法中的梯度上升/下降技术。【E 的意思是“期望”,只是一个平均值。下标显示了你正在平均的概率分布,或者是真实的数据,或者是生成器变成假图像的噪声】。
然而,他们提供的证明并不直接适用,因为我们是通过优化神经网络的参数来间接优化这些概率分布的,但很高兴知道该基金会有理论保证。
结果
值得注意的是,很难量化假数据的质量。如何判断假脸一代的进步?除此之外,当涉及到生成逼真的图像时,它们具有最先进的性能,这引起了很多关注。图像通常看起来没有其他方法模糊。
尽管自最初的论文(将在第二部分中讨论)以来已经取得了巨大的进步,这里还是有一些例子:
问题
原始 GAN 实施的最大问题是:
- 训练困难。有时模型永远不会学到任何东西或收敛到局部极小值。
- “模式崩溃”,即生成器本质上一遍又一遍地输出同样的东西。
这些问题通过对架构的改进得到了解决,并将在以后的文章中提出。
结论
最终,这个框架允许我们以无监督的方式使用神经网络的正常监督学习方法。这是因为我们的标签很容易生成,因为我们知道哪些数据来自训练集,哪些数据是生成的。值得注意的是,在上面的手写数字图像中,数字标签本身并没有在训练中使用。尽管如此,生成器和鉴别器都能够学习数据的有用表示,正如生成器模拟数据的能力所证明的那样。
在第二部分中,我们将讨论如何解决许多训练问题,以及在真实图像生成方面做出巨大的改进。
Python 中文本相似性度量概述
Jaccard 指数和余弦相似度——应该在哪里使用,各有利弊。
在研究搜索引擎的自然语言模型时,我经常会问这样的问题“这两个词有多相似?”、“这两句话有多像?”,“这两个文档有多相似?”。我已经在之前的帖子中谈到过自定义单词嵌入,其中单词的意思被考虑到单词的相似性。在这篇博文中,我们将更多地研究句子或文档相似性的技术。
How do we make sense of all this text around us?
有一些文本相似性度量,但我们将查看最常见的 Jaccard 相似性和余弦相似性。
Jaccard 相似度:
雅克卡相似度或并集上的交集被定义为**交集的大小除以两个集合的并集的大小。**让我们以两个句子为例:
句子 1: AI 是我们的朋友,它一直很友好
句子 2: AI 和人类一直很友好
为了使用 Jaccard 相似度计算相似度,我们将首先执行词条化以将单词减少到相同的根单词。在我们的例子中,“朋友”和“友好的”都将成为“朋友”,“有”和“有”都将成为“有”。画出我们得到的两个句子的维恩图:
Venn Diagram of the two sentences for Jaccard similarity
对于上面两个句子,我们得到 Jaccard 相似度为 5/(5+3+2) = 0.5 ,这是集合的交集的大小除以集合的总大小。
Python 中 Jaccard 相似度的代码为:
def get_jaccard_sim(str1, str2):
a = set(str1.split())
b = set(str2.split())
c = a.intersection(b)
return float(len(c)) / (len(a) + len(b) - len(c))
这里要注意的一点是,由于我们使用集合,“朋友”在句子 1 中出现了两次,但这并不影响我们的计算——这将随着余弦相似度而改变。
余弦相似度:
余弦相似度通过测量两个矢量之间角度的余弦来计算相似度。计算方法如下:
Cosine Similarity calculation for two vectors A and B [source]
用余弦相似度,我们需要把句子转换成向量。一种方法是使用带有 TF (术语频率)或 TF-IDF (术语频率-逆文档频率)的单词包。TF 或 TF-IDF 的选择取决于应用,与余弦相似性的实际执行方式无关,余弦相似性只需要向量。 TF 一般对文本相似性比较好,但 TF-IDF 对搜索查询相关性比较好。
另一种方法是使用 Word2Vec 或我们自己定制的单词嵌入将单词转换成向量。在之前的帖子中,我谈到了训练我们自己的自定义单词嵌入。
具有单词包和单词嵌入 tf/ tf-idf 之间有两个主要区别:
1 .tf / tf-idf 为每个单词创建一个数字,单词嵌入通常为每个单词创建一个向量。
2。tf / tf-idf 对于分类文档整体来说是好的,但是单词嵌入对于识别上下文内容是好的。
让我们计算这两个句子的余弦相似度:
句子 1: 人工智能是我们的朋友,它一直很友好
句子 2: 人工智能和人类一直很友好
第 1 步,我们将使用单词袋来计算词频:
Term Frequency after lemmatization of the two sentences
第二步,上面显示的词频计数的主要问题是,它倾向于较长的文档或句子。解决这个问题的一个方法是用各自的量值或 L2 规范来归一化术语频率。对每个频率的平方求和并取平方根,句子 1 的 L2 范数是 3.3166,句子 2 是 2.6458。将上述频率除以这些标准,我们得到:
Normalization of term frequencies using L2 Norms
**步骤 3,**由于我们已经将两个向量归一化为长度为 1,所以可以用点积计算余弦相似度:
余弦相似度=(0.302 * 0.378)+(0.603 * 0.378)+(0.302 * 0.378)+(0.302 * 0.378)+(0.302 * 0.378)= 0.684
因此,两个句子的余弦相似度是 0.684 ,这不同于完全相同的两个句子的 Jaccard 相似度是 0.5 (上面计算的)
Python 中字符串成对余弦相似性的代码是:
from collections import Counter
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
def get_cosine_sim(*strs):
vectors = [t for t in get_vectors(*strs)]
return cosine_similarity(vectors)
def get_vectors(*strs):
text = [t for t in strs]
vectorizer = CountVectorizer(text)
vectorizer.fit(text)
return vectorizer.transform(text).toarray()
雅克卡相似度和余弦相似度的区别:
- Jaccard 相似度对于每个句子/文档只取唯一的一组单词,而余弦相似度取向量的总长度。(这些向量可以由词项频率包或 tf-idf 构成)
- 这意味着,如果你在句子 1 中多次重复单词“朋友”,余弦相似度会改变,但 Jaccard 相似度不会改变。对于 ex,如果单词“朋友”在第一句中重复 50 次,余弦相似性下降到 0.4,但是 Jaccard 相似性保持在 0.5。
- Jaccard 相似性适用于重复不重要的情况,余弦相似性适用于在分析文本相似性时重复很重要的情况。对于两个产品描述,使用 Jaccard 相似度会更好,因为一个词的重复不会降低它们的相似度。
如果你知道每一个的更多应用,请在下面的评论中提及,因为这将帮助其他人。我的关于文本相似性度量概述的博客到此结束。祝你在自己的文本探索中好运!
我发现的关于信息检索主题的最好的书之一是信息检索简介,这是一本涵盖了许多关于 NLP、信息检索和搜索概念的极好的书。
One of the best books on this topic: Intro To Information Retrieval
另外,看看我的播客吧!我有一个播客叫做“数据生活播客”。你可以在任何地方听到你的播客。在这一集中你将听到与 Paul Azunre(曼宁著作NLP 中的迁移学习的作者)关于 BERT、Elmo、单词嵌入等趋势的有趣对话。
My podcast episode with Paul Azunre on transfer learning and NLP
如果您有任何问题,请在我的 LinkedIn 个人资料中给我留言。感谢阅读!