从头开始展开朴素贝叶斯!
对于 ML 初学者
Photo by Jukan Tateisi on Unsplash
从头开始展开朴素贝叶斯!Take-1🎬
W **无论你是机器学习的初学者,还是你一直在努力理解超级自然的 机器学习算法,但你仍然觉得点与点之间没有某种联系,这篇文章绝对适合你!
这篇博文的目的
我试图让事情简单明了。唯一的目的是深入和清楚地理解一个众所周知的文本分类 ML 算法(朴素贝叶斯)的工作原理,而不是陷入在 ML 算法的解释中经常使用的莫名其妙的数学术语!
谁是目标受众?
任何人从零开始寻找对 ML 算法的深入而易懂的解释
本教程的成果
一个完整清晰的朴素贝叶斯 ML 算法的图片,所有神秘的数学都被揭开了神秘的面纱,在你的 ML 旅程中向前迈出了具体的一步!
定义路线图……🚵
里程碑# 1 : 简单介绍一下朴素贝叶斯算法
里程碑# 2 : 朴素贝叶斯模型的训练阶段
重大里程碑# 3 : 测试阶段——预测开始发挥作用了!
里程碑# 4 : 深入挖掘概率的数学
里程碑# 5 : 避免下溢错误的常见陷阱!
里程碑# 6 : 结束语……
简单介绍一下朴素贝叶斯算法
朴素贝叶斯是最常见的 ML 算法之一,常用于文本分类。如果你刚刚步入 ML,它是最容易开始的分类算法之一。朴素贝叶斯是一种概率分类算法,因为它使用概率来进行分类预测。
因此,如果你期待着在机器学习的旅程中向前迈出一步,朴素贝叶斯分类器绝对是你的下一站!
达到里程碑# 1👍
朴素贝叶斯模型的训练阶段
比方说,有一篇餐厅评论,“非常好的食物和服务!!!",你想预测这个给定的评论是暗示积极的还是消极的情绪。要做到这一点,我们首先需要在相关的带标签的训练数据集上训练一个模型(这实质上意味着确定每个类别的字数),然后这个模型本身将能够自动地将这样的评论分类到它被训练所针对的给定情感之一中。假设给你一个看起来像下面的训练数据集(一个评论及其相应的情绪):
Labelled Training Dataset
快速补充说明:朴素贝叶斯分类器是一种监督机器学习算法
那么我们如何开始呢?
步骤# 1:数据预处理
作为预处理阶段的一部分(这篇文章中没有详细介绍),训练语料库/训练数据集中的所有单词都被转换成小写和**,除了像标点符号这样的字母之外的一切都从训练示例中排除**。
**一个小提示:**一个常见的缺陷是没有以与训练数据集预处理 相同的方式预处理测试数据,而是将测试示例直接输入到训练好的模型中。结果, 训练好的模型在给定的测试示例 上表现很差,而在该测试示例上它应该表现得很好!
Preprocessed Training Dataset
第二步:训练你的朴素贝叶斯模型
只需简单地制作两个单词包(BoW),每个类别一个,每个包将简单地包含单词及其对应的计数。所有属于“正面”情感/标签的单词将被归入一个 BoW,所有属于“负面”情感的单词将有它们自己的 BoW。训练集中的每个句子都被拆分成单词(基于作为标记符/分隔符的空间),这是如何简单地构造单词计数对的,如下所示:
BoW for Both categories
我们已经完成了朴素贝叶斯模型的训练!
达到里程碑# 2👍
在进入第三个里程碑之前,喝杯咖啡或者舒展一下肌肉
Photo by Rumman Amin on Unsplash
注意:我们即将开始朴素贝叶斯模型最重要的部分,即使用上述训练好的模型来预测餐馆评论。我现在觉得这有点长,但完全值得,因为我们将讨论每一个细节,最终结果是零歧义!
测试阶段——预测开始发挥作用了!
考虑现在你的模型被给予一个餐馆评论, “非常好的食物和服务!!!" ,它需要归类到它所属的特定类别。正面评价还是负面评价?我们需要找到这个给定的评论属于每个类别的概率,然后我们会根据这个测试示例能够为哪个特定类别获得更多的概率,给它分配一个正面或负面的标签。
找到给定测试示例的概率
步骤# 1:测试示例的预处理
以与预处理训练示例相同的方式预处理测试示例,即,将示例更改为小写,并排除除字母/字母表之外的所有内容。
Preprocessed Test Example
步骤 2:预处理测试示例的标记化
将测试示例标记化,即将其拆分为单个单词。
Tokenized Preprocessed Example
快速边注 :你一定已经熟悉机器学习中的术语 特征 。在这里,在朴素贝叶斯中,的每一类训练数据集的词汇中的每个词构成了一个分类特征 。这意味着每一类的所有唯一单词(即词汇/vocab)基本上是该特定类的一组特征。为什么我们需要“计数”?因为我们需要分类词特征的数字表示,因为朴素贝叶斯模型/算法需要数字特征来找出概率分数!********
步骤 3:使用概率来预测标记化测试示例的标签
寻找概率的不那么吓人的数学形式
Probability of a Given Test Example i of belonging to class c
- 让 我 = 测试示例= “非常好的食物和服务!!!"
- 中的总字数 i = 5,所以j****(表示特征号 ) 的值从 1 到 5 不等。就这么简单!**
让我们将上面的场景映射到给定的测试示例中,这样会更清楚!
让我们开始计算这些产品术语的值
第一步:求 c 类 p 项的值
Simply the Fraction of Each Category/Class in the Training Set
p of class c for Positive & Negative categories
步骤# 2:求项的值:乘积(c 类中测试词 j 的 p)
在我们开始推断特定类别中测试词【j】c的概率之前,让我们快速熟悉一些简单的符号,这些符号在这篇博客文章的不太远的行中使用:
Understanding Notations — e, i & j
由于目前我们的测试集中只有一个例子(为了便于理解),所以 i = 1。
快速补充说明 :在 测试时间/预测时间期间,我们将测试示例的每个单词映射到在训练阶段 发现的计数。因此,在这种情况下,我们在这个给定的测试示例中总共寻找 5 个单词计数。
Photo by Jared Brashier on Unsplash
只是一个让你无法入睡的随机事件!
求 c 类中测试词“j”的概率
在我们开始计算的乘积** ( p 中的一个测试字 j 中的类 c )之前,我们显然首先需要确定 p 中的一个测试字jc有两种方法可以做到这一点,如下所述— 几分钟后,我们将发现哪一种方法应该被真正遵循,而不是被实际使用……
让我们首先尝试使用方法 1 来寻找概率:
现在我们可以将单个单词的概率相乘(如上所述)以找到该项的数值:
乘积(测试单词*【j】*c)
The Common Pitfall of Zero Probabilities!
到目前为止,我们已经有了两个术语的数值,即类 c 和 产品(测试字*【j】和类 c 中的 p 因此,我们可以将这两项相乘,以确定这两个类别的p*(I属于类别 c )。下面演示了这一点:****
The Common Pitfall of Zero Probabilities!
p(I属于类 c )对于两个类别来说都是零!!!但显然测试示例“非常好的食物和服务!!!"属于正班!很明显,这是因为类中测试词
【j】的乘积 ( p )对于两个类别来说都是零,而这又是因为中的几个词(以橙色突出显示)从未在我们的训练数据集中出现过,因此它们的概率为零!很明显是他们造成了所有的破坏!******
那么这是否意味着无论何时出现在测试示例中但从未出现在训练数据集中的单词总是会导致这种破坏?在这种情况下,我们训练过的模型将永远无法预测正确的情绪?它只会随机选择积极或消极的类别,因为两者都有相同的零概率和预测错误?答案是否定的!这就是第二种方法(编号 2)发挥作用的地方,事实上这是一个数学公式,它实际上用于推导(I属于类 c )。但是在我们继续第二种方法之前,我们应该先熟悉一下它的数学原理!**
所以现在在添加了为 1 的伪计数* 之后,从未出现在训练数据集中的测试字的概率 p 将永远不会为零,因此**,** 项乘积(p【j】在类【c】)中的数值永远不会以零结束,这又意味着
p 所以一切都很好,不会再有零概率的破坏了!*
所以方法 2 的分子项将增加 1,因为我们已经为词汇表中的每个单词增加了 1,所以它变成了 :
类似地,分母变成:
于是完整的公式:
Probabilities of Positive & Negative Class
Photo by Greg Rakozy on Unsplash
你快到了!
现在用第二种方法计算概率:
Handling of Zero Probabilities : These act like failsafe probabilities !
**********
现在作为测试例子的概率,“非常好的食物和服务!!!"与负面类别(即 7.74E-09)相比,正面类别(即 9.33E-09)更多,因此我们可以将其预测为正面情绪!这就是我们如何简单地预测一个测试/看不见的例子的标签
里程碑# 3 达成!!👍 👍 👍
只剩最后几笔润色了!
快速补充说明: 像所有其他机器学习算法一样,朴素贝叶斯也需要一个验证集来评估训练模型的有效性。但是,因为这篇文章旨在关注算法的见解,所以我故意避开它,直接跳到测试部分
深入挖掘概率数学
现在,您已经对训练朴素贝叶斯模型所需的概率计算建立了基本的理解,然后使用它来预测给定测试句子的概率,我现在将更深入地挖掘概率细节。
在计算上一节中给定测试句子的概率时,我们只执行了给定的概率公式来进行测试时的预测:
解码上面的数学方程式:
" | " =指已经给定的状态和/或一些过滤标准
=类/类别
" x " =测试示例/测试句子
p(c | x)****=给定测试示例 x ,它属于类 c 的概率是多少。这也被称为后验概率。这是为每个给定培训类的给定测试示例 x 找到的条件概率。**
p(x|c) = 给定类 c ,实例 x 属于类 c 的概率是多少。这也被称为可能性,因为它暗示了示例 x 属于类 c 的可能性有多大。这也是条件概率,因为我们正在从类的全部实例中寻找的概率,也就是说,在寻找 x 的概率时,我们已经将的搜索空间限制/调节到类 c 。我们使用在训练阶段确定的字数来计算这个概率。********
Here “ j ” represents a class and krepresents a feature******
由于我们有两个类,我们在上面的计算部分隐式地使用了这个公式两次。还记得在类p中找到一个测试字jc*的数值吗?*****
**p =这暗示了类 c 的**概率。这也被称为先验概率/无条件概率。这是无条件概率。我们在前面的概率计算部分已经计算过了(在步骤# 1 中,寻找类 c 的 term : p 的值)
【p(x)=这也被称为 归一化常数以便概率p(c | x)确实落在范围【0,1】内。所以如果去掉这个,概率p(c | x)不一定落在[0,1]的范围内。直观地说,这意味着在任何情况下或不管其类别标签是正还是负,实例 x 的概率。
这也反映在全概率定理中,全概率定理用于计算 p(x)**
Total Probability Theorem
这意味着,如果我们有两个阶级,那么我们将有两个术语,所以在我们的积极和消极情绪的特殊情况下:
Total Probability Theorem for Two Classes
我们在上面的计算中使用它了吗?不,我们没有。为什么???因为我们正在比较正类和负类的概率,并且因为分母保持不变,所以在这种特殊情况下,省略相同的分母不会影响我们训练好的模型的预测。这两个类只是相互抵消。因此,虽然我们可以包括它,但没有这样做的逻辑理由。**但是同样由于我们已经消除了归一化常数,概率 p(c|x)不一定落在【0,1】T5 的范围内**
达到里程碑# 4👍
避免下溢错误的常见陷阱!
- 如果你注意到的话,单词概率的数值(即类别【c中的一个测试单词**【j】)非常小。因此,将所有这些微小的概率相乘以找到乘积*(p【j】类【c】)将产生甚至更小的数值,这经常导致下溢,这显然意味着对于给定的测试句子,训练的模型将无法预测其类别/情感。因此,为了避免这种下溢误差,我们采用如下数学对数的帮助:***
Avoiding the Underflow Error
- 所以现在,我们将简单地把它们相加,而不是把微小的单个单词的概率相乘。为什么只有日志?为什么不是其他功能?因为 log 单调增加或减少,这意味着它不会影响概率的顺序。较小的概率在应用对数后仍然会保持较小,反之亦然。因此,假设测试单词“是”比测试单词“快乐”具有更小的概率,因此在通过 log 之后,虽然增加了它们的大小,但是“是”仍然具有比“快乐”更小的概率。因此,在不影响我们的训练模型的预测的情况下,我们可以有效地避免下溢误差的常见陷阱。
达到里程碑# 5👍
结束语……
- 尽管我们生活在一个 API 的时代,几乎很少从头开始编码。但是深入理解算法理论对于正确理解机器学习算法实际上是如何工作的极其重要。只有关键的理解才能区分真正的数据科学家和天真的数据科学家,以及在训练一个真正优秀的模型时真正重要的东西。因此,在转向 API 之前,我个人认为,一个真正的数据科学家应该从头开始编写代码,以真正看到数字背后以及某个特定算法优于其他算法的原因。
- 朴素贝叶斯模型最好的特点之一是,你可以通过简单地用新词汇更新它来提高它的准确性,而不是总是重新训练它。你只需要添加单词到词汇表中,并相应地更新单词数。就是这样!
Photo by Benjamin Davies on Unsplash
终于来了!终于!达到里程碑# 6😤 😤 😤
这篇博文到此结束&你已经在你的 ML 之旅中向前迈进了一步!😄
即将发布的帖子将包括:
- 从头开始展开朴素贝叶斯!Take-2🎬用 Python 从头开始实现朴素贝叶斯
- 从头开始展开朴素贝叶斯!Take-3🎬使用 scikit-learn 实现朴素贝叶斯( Python 的 机器学习的圣杯! )
敬请期待!📻
如果您有任何想法、意见或问题,欢迎在下面评论或联系📞跟我上 LinkedIn
内容许可—一些注意事项…
再用
图表和文本根据媒体的服务条款获得许可,即作者拥有其创作并在媒体上发布的内容的权利。“未经您的许可(或合理使用许可),其他人不得复制、分发或执行您的作品.”
这篇博文中包含的来自其他来源的图片不属于本许可证的范围,可以通过标题“图片作者…”中的注释来识别。所有此类图片均取自 Unsplash ,可免费使用,无需获得摄影师或 Unsplash 的许可或提供其信用。详细的许可条款可以参考这里的。
引文 出于署名目的,本作品被引为
*****Aisha Javed, “Unfolding Naïve Bayes from Scratch !”, Towards Data Science, 2018*****
BibTeX 引文
*****@ARTICLE {javed2018a,
author = "Javed, Aisha",
title = "Unfolding Naïve Bayes from Scratch !",
journal = "Towards Data Science",
year = "2018",
note = "https://towardsdatascience.com/unfolding-na%C3%AFve-bayes-from-scratch-2e86dcae4b01"
doi = "2e86dcae4b01"
}*****
意外后果和古德哈特定律
使用正确指标的重要性
为了增加收入,一个客户服务呼叫中心的经理制定了一项新政策:不再按小时计酬,而是根据每个员工打电话的次数来支付报酬。在第一周之后,这个实验似乎取得了巨大的成功:呼叫中心每天处理的电话数量增加了一倍!只要员工的业绩良好,这位经理就不会费心去听他们的谈话,他对此非常满意。然而,当老板来访时,她坚持要出去到楼层,当她这样做时,她和经理都被他们听到的震惊了:员工拿起电话,发出一系列一个词的回答,不等再见就砰地放下电话。难怪通话完成数翻倍了!无意中,通过只根据通话量来判断绩效,这位经理已经激励员工重视速度而不是礼貌。不知不觉中,他陷入了古德哈特定律。
古德哈特定律简单表述为:“当一个度量成为目标时,它就不再是一个好的度量。”换句话说,当我们设定一个特定的目标时,人们会倾向于不顾后果地优化这个目标。当一种情况的其他同等重要的方面被忽视时,这就导致了问题。我们的呼叫中心经理认为增加处理的电话数量是一个很好的目标,他的员工尽职尽责地努力增加电话数量。然而,通过只选择一个标准来衡量成功,他鼓励员工以数量的名义牺牲礼貌。人们会对激励做出反应,我们的自然倾向是最大化评判我们的标准。
Goodhart’s Law Explained (Source)
一旦我们意识到古德哈特定律,我们就可以在生活中的许多领域最小化它的影响。在学校,我们有一个目标:最大化我们的分数。这种对一个数字的关注可能不利于实际的学习。高中就像是一长串为考试而记忆的内容,然后很快就忘得一干二净,这样我就可以为下一次考试在脑子里塞满信息,而不用考虑我是否真的知道这些概念。考虑到学校衡量成功的方式,这种策略非常有效,但我怀疑这是否是获得良好教育的最佳方法。我们看到古德哈特定律有害影响的另一个领域是在学术界,这里强调出版,用短语“出版或灭亡”来表示。发表通常依赖于在研究中获得积极的结果,这导致了被称为“p-hacking”的技术,其中研究人员操纵或子集化实验结果以实现统计显著性。当一个数字被用来衡量成功时,记忆而不是学习内容和 p-hacking 都是意想不到的后果。
从数据科学的角度来看,古德哈特定律的应用提醒我们需要适当的指标。当我们设计机器学习模型或对网站的界面进行更改时,我们需要一种方法来确定我们的解决方案是否有效。通常,我们会使用一个统计量,例如回归的均方误差或分类问题的 F1 分数。如果我们意识到只使用单一的衡量标准可能会有不利的后果,我们可能会再次思考如何对成功进行分类。就像呼叫中心经理根据处理的呼叫数量和客户满意度来判断员工绩效会更好一样,我们可以通过考虑几个因素来创建更好的模型。除了只通过准确性来评估机器学习方法,我们还可以考虑可解释性,以便创建可理解的模型。
虽然大多数人希望听到一个数字来总结一个分析,但在大多数情况下,我们最好报告多个度量(带有不确定性区间)。有时候,一个设计良好的指标可以鼓励我们想要的行为,例如增加退休储蓄率,但是,重要的是要记住,人们会试图最大化我们选择的任何衡量标准。如果我们最终以牺牲其他同等重要的因素为代价来实现一个目标,那么我们的解决方案可能对情况没有帮助。解决问题的第一步——数据科学或其他——是确定衡量成功的正确方法。当我们希望客观地找到最佳解决方案时,我们应该回忆一下古德哈特定律的概念,并认识到最佳评估通常是一组测量值,而不是使用单个数字。通过选择多个指标,我们可以设计出一个解决方案,而不会出现针对狭窄目标进行优化时出现的意外后果。
一如既往,我欢迎反馈和建设性的批评。可以通过推特 @koehrsen_will 联系到我。
数据科学的单元测试和日志记录
Laufen Castle & Rhein Falls, Schaffhausen, Switzerland.
在我们的行业中,数据科学家的职责包括各种任务。通常,它从数据库查询开始,以完成的模型结束,事实上,这是许多公司的规范,它允许数据科学家专注于只存在于他们专业领域的任务;这是可以理解的,因为研究比其他任务更昂贵。然而,在许多资源匮乏的公司,数据科学家工作的端到端定义包括创建简单的 API、单元测试和日志记录。
在本教程中,我将创建输入输出单元测试、一个日志记录类和一个 API 合适的部署。为此,我们将创建一个使用 MNIST 数据集的监督分类器。请注意,单元测试和记录器的 python 代码是由科里·斯查费在这里和在这里提供的。
我们的 logger 是一个 decorator,它是一个具有日志功能的函数,使用“@my_function”语法包装其他函数。这个想法是使用一个通用的包装器,在我们的例子中:
- 每次执行函数时,为每个函数创建一个文件日志,其中每行包含函数的参数。
- 报告运行该函数所花费的时间。
我们将“@ my _ logger”&“@ my _ timer”添加到我们想要记录的每个函数中,并知道它们的运行时间。请记住,您可以脱机查看这些日志文件,如果出现错误,您可以相应地调试代码。
以下函数下载 MNIST 数据集,使用 MinMaxScaler 归一化数据,并将原始数据拆分为训练和测试数据集。
作为数据科学家,我们的任务之一是创建一个可以在以后的生产中使用的类。因此,我以一种非常熟悉的方式设计了‘the algorithm’类,你会注意到该类遵循 sklearn 的函数结构,即我们有众所周知的‘fit’和‘predict’函数(以及 init )。这些函数将在生产过程中使用,以使用训练集和测试集初始化类,使用训练集(即 fit())训练模型,以及使用测试集(即 predict())进行测试。为了简化,我特意使用了一个简单的训练测试分割。本教程的主要目的是解释单元测试和日志记录是如何工作的,而不是进行交叉验证、网格搜索或其他机器学习方法。最后用“@ my _ logger”&“@ my _ timer”修饰每个函数。
在我们创建单元测试之前,我们需要一些基于数据集的输入和输出示例。首先,我们下载 MNIST 数据集,我们将其分割为 60K & 10K,我们创建一个“算法”类变量并执行 fit(),我们观察训练精度和产生的混淆矩阵。就输入和输出而言,精确度数字和混淆矩阵是唯一的,并且如果我们的模型中有任何变化,包括输入、分割比、随机种子等,精确度数字和混淆矩阵也会变化。因此,在运行模型之后,我们保存单元测试的输出,我们的想法是,如果“算法”类或伴随的函数中有什么变化或中断,输出将会不匹配,测试将会失败。我们对类的 predict()函数做同样的事情,并保存最终的测试准确度和混淆矩阵。
以下是运行上述算法时的输出:
我们的单元测试类“TestInput”继承自“unittest”。’ TestCase ‘,这允许我们使用几个已知的函数如’ setUpClass,tearDownClass,setUp,tearDown ',前两个是先执行后执行,后两个是在每个测试函数之前执行。在“设置”功能中,我们下载数据,分割数据,并保存训练和测试精度以及混淆矩阵。这些变量将使我们能够创建两个使用 fit()和 predict()的测试,使用一个众所周知的输入,最后将结果输出与预期输出进行比较。
为此,我们创建了“test_fit()”和“test_predict()”。在每个函数中,我们使用“assertEqual”将使用 fit()或 predict()时的结果输出与预期的输出变量进行比较。预期输出是训练和测试阶段的准确度和混淆矩阵图。如果这些输入输出单元测试失败,这意味着我们的算法有一个关键的变化。最后,我们执行我们的单元测试,如下面的输出所示,你可以看到两个测试都通过了。
请注意,在这里有额外的断言可用于单元测试。
Ori Cohen 拥有计算机科学博士学位,并在机器学习、脑机接口和神经生物学领域完成了博士学位。
通用语言模型来增强您的 NLP 模型
来自 fast.ai 的人们已经因其前沿的深度学习课程而闻名,他们才刚刚开始。昨天,他们发表了他们对各种 NLP 问题的预训练语言模型的研究。这项研究非常棒。看看这些结果:
Taken from https://arxiv.org/abs/1801.06146
蓝线表示仅针对该任务训练的新模型,橙色表示针对该任务微调的预训练语言模型,绿色表示针对该任务数据集微调为 LM,然后针对其目标微调的预训练模型。最后一个选项比第一个选项取得了更好的结果,但数据量却少了 100 倍!
基本上,他们的方法允许使用预训练的 LMs,并使用更少的数据获得更好的结果。这和 ResNets 在 ImageNet 上的预训练在计算机视觉上做的差不多。他们已经发布了所有的源代码,并在 WikiText 103 上预先训练了 LM(103 百万字),所以可以在你的研究/项目中随意使用它。
它是如何工作的
简而言之,食谱如下:
- 在大型数据集上训练 LM 或下载预先训练的 LM。
- 在你的数据上微调这个 LM。
- 加几层,微调一下,解决手头的任务。
- 干得好!你可能刚刚取得了 SOTA 的成绩。现在,您可以选择另一个问题并返回到步骤 2。
现在让我们更仔细地看看每一步。
- 只是一个三层 LSTM,具有精心调整的丢弃参数,如本文中描述的(AWD-LSTM)在 WikiText 103(28,595 篇预处理的维基百科文章和 1.03 亿字)上训练。
- 根据上一步的数据对语言模型进行微调。一般来说,当模型忘记了它以前学过的东西时,就会产生一个问题。为了解决这个问题,作者提出了两种技术:区别微调(从最后一层到第一层,以某个因子减少每个先前层的学习速率,在这个特定情况下为 2.6)和倾斜三角形学习速率(在迭代的第一~10%线性增加 LR,然后线性减少它)。
- 最后,添加一些完全连接的层,并为该任务训练模型。为了避免灾难性的遗忘这一步,作者建议逐步解冻(首先冻结所有预先训练的权重,并在每个时期后解冻一层,从最后到第一)。此外,对于分类任务,他们将大文档分成几批,并用最后一批的隐藏状态初始化模型。
- 他们已经报告了 6 项任务的 SOTA 结果,并且正在进行中。
这真是太棒了。相对于 CV,NLP 中的分类相当困难,但是现在我们可以用几百个例子训练一个好的模型。这种方法不仅适用于分类,而且适用于几乎所有类型的 NLP 问题。我想这项研究将会产生和几年前单词向量一样大的影响。看到最终能用它解决多少任务,我真的很激动。
通用风格转移
Fig. 0
NIPS 2017 上的一篇有趣的论文是这样的:通过特征转换进行通用风格转换 0。有一堆基于神经网络的风格转换技术,特别是在艺术风格的神经算法【1】之后。所有现有技术都有以下主要问题之一:
- 在推理过程中效率不高:上面提到的1就是一个例子。
- 风格特定的网络。这方面的一个例子是论文实时风格转换和超分辨率的感知损失【2】。
- 就输出质量而言,泛化能力差:这方面的一个例子是论文使用实例规范化的实时任意样式传输 3
正在讨论的文件声称要解决上述问题。这篇博客是对这篇论文的评论。假设对深度学习和线性代数有一些基本的了解。作者的代码库可以在这里找到。
在一些地方(图 9、10 和 12 ),我用图像来表现数学。这主要是因为 medium 蹩脚的数学支持。我使用https://latexbase.com/在 latex 上生成数学,然后拍摄他们的快照。(我知道,很痛苦)
问题(万一从上面还没看清楚):给定一个有一定内容在里面的图像(称之为内容图像)和另一个嵌入了一定风格的图像(想想一幅名画的图像。让我们称这种样式为图像)。目标是构建一个新的图像,它具有内容图像的内容和样式图像的样式。如下图所示。
Fig. 1 Content Image + Style Image = Stylized Content Image [4]
这篇论文的卖点是“免学习”。现有的基于前馈的技术需要在预定义的风格上进行训练,然后针对新的风格进行微调。然而,本文提出了一种在训练阶段完全独立于风格的方法,使其成为一种“免学习”的方法。请注意,3本质上与本文更接近,但依赖于训练时的样式图像(但可以很好地推广到任意样式图像)。
在本文中,风格转换问题被表述为两个过程的组合,即使用白化和颜色变换的图像重建和特征变换(WCT)。
图像重建
经典的编码器-解码器机制是这样一种机制,其中图像被馈送到编码器网络,编码器网络对图像进行编码以形成表示,并被传递到解码器,解码器试图重建原始输入图像。该文件使用了一个轻微的修改,这为图像重建。
Fig. 2 A classic Encoder-Decoder Network(just a reference not used in paper) 5
作为第一步,他们在 Imagenet 图像分类任务上训练 VGG-19(此后称为 VGG)。这被用作编码器。下一步,固定编码器,训练解码器来重建图像。看起来如下所示:
Fig. 3 Encoder-Decoder for reconstruction 0
上图中看到的 Relu_X_1 和 DecoderX 有些清晰:它们训练不止一个解码器进行重建。事实上,他们训练 5 个解码器进行重建。我们很快就会看到原因。但是,这里的“X”是指 VGG 网络中的层数。X = 1,2,3,4,5 是本文中使用的值。VGG 编码器部分结束于层 Relu_X_1,并且解码器(DecoderX)被构造成与该编码器对称。他们使用像素重构损失和特征损失的组合,如下所示。
Fig.4 Loss function for Decoder Reconstruction
像素重构是重构输出(I_o)和输入图像(I_i)的简单 L2 范数。特征损失是重建的输出和输入图像的 Relu_X_1 特征的 L2 范数。这里φ代表提取 Relu_X_1 特征的 VGG-19 编码器。λ是损失的加权系数。编码器和解码器现在已被训练和固定。请注意,我们在整个培训过程中从未使用任何风格图像。
格式化
Fig. 5 Single level Stylization 0
上面的图像代表单级风格化。这包括作为编码器(VGG Relu_X_1)的输入的内容图像©和样式图像(S)。请注意,这些输入是相互独立地传入的(每个输入都独立地通过 VGG)。编码器的输出被发送到白化和着色变换模块(我们将在下一节中看到更多细节),然后其输出被传递到解码器(Recons DecoderX)以获得最终的风格化输出。下图显示了 X=1、2、3、4 和 5 时的风格化输出。较低层(1 等。)捕获像样式颜色这样的特征,而更高层(比如说,5 层)捕获样式结构。
Fig.6 Stylized outputs for each of the layers/decoders 0
作者继续使用所有层的特征,而不是只坚持一层。这导致了如下所示的体系结构。
Fig. 7 Multi level stylization 0
我们从内容和风格图像开始,将它们提供给 VGG,Relu_5_1 特征被提取并发送到 WCT,然后解码。解码器 5 的输出与样式图像一起被馈送到 VGG,并且 Relu_4_1 被提取,并且该过程继续,直到我们从解码器 1 获得输出。下图显示了这种多级推理的结果。I_5 实际上是第一级的输出(如上图),I_1 是解码器 1 的输出(最终输出)。绝对比单级风格化好看。
Fig. 8 Multi level stylization outputs at various levels 0
增白和颜色变换(WCT)
在上一节中,我们把 WCT 看作一个黑盒。让我们深入研究一下,了解它到底在做什么。请记住,在模型训练中,我们从未使用过任何样式图像。我们的编码器是经过 Imagenet 训练的 VGG,解码器经过训练,可以在编码器的不同特征级别进行重构(Relu_ X _1)。WCT 做了一些很酷的数学运算,在从风格图像中转移风格特征的同时仍然保留内容方面起到了核心作用。
让我们将 WCT 视为解除输入图像的当前样式的关联并将样式图像的样式与输入图像相关联的过程。第一步是美白。
我们知道 WCT 模块的输入是编码器模块的输出(Relu_X_1)。Relu_X_1 的形状为 C x H x W ,其中 C 为通道数, H 为高度, W 为特征图的宽度。这是假设单个输入图像。我们对这些特征图进行矢量化,从而得到长度为 H x W 的 C 个向量。设 f_c 为形状的矢量化特征图[ C,(H_c x W_c)], 其中 H_c 和 W_c 分别为内容图像在某一 Relu_X_1 处的特征图的高度和宽度。同样,设 f_s 为形状[ C,(H_s x W_s) 的矢量化特征图,其中 H_s 和 W_s 分别为特征图在某一 Relu_X_1 处因风格图像而产生的高度和宽度。
白化变换:
我们的目标是找到 *f_c,我们称之为 f_ct 的变换,使得 f_ct 的协方差矩阵是一个单位矩阵,即f _ CT x(f _ CT . transpose)= I .*这保证了特征图没有相关性。更正式地说,
*f_ct = W x f_c,*其中 W 是变换矩阵。一个很常见的选择 W 是 Y 的平方根倒数,其中 Y 是协方差矩阵 *f_c x (f_c.transpose)。*在更好的表述中:
Fig. 9
小注意:根据协方差矩阵的定义,为了使Y =**f _ c x(f _ c . transpose),我们需要从 f_c 中减去平均值 m_c(每通道平均值)。上面的 f_c 实际上代表的是减法后的值。
可以看到 Y 是实值对称矩阵。因此,我们可以对这个矩阵进行特征分解,最终的 f_ct 如下所示:
Fig. 10
很容易验证新 f_ct 的协方差矩阵是一个单位矩阵(不相关特征)。你可以把这当成一个练习:)
Fig. 11 Inverting whitened Relu_4_1 features 0
以上是增白过程的实验验证。基本上,他们运行的模型只有美白块(没有着色块)。您可以看到,最终的构造保留了内容(金门),但删除了任何与样式相关的信息。
着色变换:
这是白化变换的一种逆运算。记住,通过白化,我们有效地将特征从它们的风格中分离出来。现在,我们将通过变换白化结果(等式 1)来将这些与样式图像的样式相关联。
我们的目标是找到 f_ct 的一个变换,让我们称之为 f_cst ,使得 f_cst 的协方差矩阵等于 f_s 的协方差矩阵。记住 f_s 是由于风格图像的矢量化特征图。再小提一下,mean m_s 是从 f_s 中减去的(原因同上)。更正式地说:
Fig. 12
用上面的 f_cst 的值很容易验证(2)
我试图简要地解释这篇论文的要点。如果你觉得有趣,那就去读报纸吧。该文件有更多的训练细节和其他功能,如用户控制和纹理合成。您也可以在这里试用代码:6
如果你喜欢这篇文章,那就来吧,伸出你的手,给我一些👏 😃
参考文献:
[4]:https://research . Google blog . com/2016/02/exploring-intersection-of-art-and . html
释放流程挖掘的价值
Looking for an easy way to analyze complex processes?
(公民)数据科学家的强大能力
关于;在…各处 ;大约
这篇文章的目的是向读者介绍流程挖掘,一种创新的分析方法以客观和详尽的方式了解任何流程。它当然涵盖了的关键概念和定义,以及的好处,技术的要求,以及的成功标准,希望能给你灵感将这些技术应用到你自己的职业现实中。
让我们一起来了解一下这个复杂过程探索的迷人创新解决方案吧!
内容
- 什么是流程挖掘?
- 利益
- 它是如何工作的?
- 流程挖掘如何大幅提升流程发现?
- 关于所需数据的一句话
- 成功标准
- 结论
什么是流程挖掘?
大多数组织创建业务流程,这些流程有时难以控制和理解。然而,在采取任何改进措施之前,理解这些流程是绝对必要的。
流程挖掘是一门由强大的分析技术支持的学科,这使得容易和快速获得完整的和目标图,从而控制和持续改进。这是通过分析 IT 系统中的大量可用数据实现的。主要是执行哪些活动、何时执行以及由谁执行。
从这个意义上说,流程挖掘位于业务流程管理和数据挖掘的交叉点。
流程挖掘是一个非常有价值的洞察生成解决方案:你有没有问过自己,在一个特定的流程中到底发生了什么,观察到了与最初设计流程的哪些偏差,瓶颈在哪里,如何优化流程?如果是这样,那么您应该明确地将流程挖掘作为您团队工具箱的一部分。
由于流程挖掘工具使用起来非常直观,并且高度可视化,我建议您在深入了解更多细节之前,先看一下下面的视频,以展示流程挖掘在银行流程中的强大功能。这个视频是由 Fluxicon 创作的。
Process mining applied to the banking industry (ILLUSTRATIVE)
利益
使用流程挖掘为企业主和组织提供了几个好处。我们在下面列出了最重要的几个:
- 了解流程实际上是如何执行的。
大多数时候,企业主从理论角度非常了解他们的流程:应该发生什么,什么时候,谁应该做什么,在什么条件下。
然而,他们通常没有办法调查在整个流程生命周期中到底发生了什么。传统的报告、商业智能(BI)和统计工具很难揭示大的和非常详细的情况。这种从大画面到细节的来回导航实际上是理解真实生活情况的最有效的方式。流程挖掘解决方案,如 Disco 侧重于使其易于消化和利用。
There are often disconnects between ideal (well understood) and real (unknown) situations (ILLUSTRATIVE)
- 通过了解流程中的实际流量、频率和延迟来改进流程。
IT 系统日志跟踪大量有用的信息,使得计算从流程中的一个步骤切换到另一个步骤的路径和交付时间变得可行。人们可以利用这些有价值的信息来检测瓶颈、突出次效率、揭示最频繁的路径等。
- 通过提高员工的生产力来节约成本。
加快调查时间,让您的分析师腾出时间来改进流程,而不是分析现状。通过关注棘手问题来减少总体流程时间。
- 协调不同地区的流程通过了解人们如何以不同的方式工作,了解最佳实践并调整流程。
Reveal local specificities, slicing and dicing at your convenience in the process across any dimension of analysis — contributor, entity, product, etc. (ILLUSTRATIVE)
- 提高审计质量和效率。
以高效的方式进行审计,利用数据科学,避免基于观点的讨论(数据是不可知的!).
- 通过对比旧流程和新流程,验证已实施的流程变更是否达到预期效果。
想观察过程中任何变化的影响吗?进行前/后分析,量化您对新流程的影响和附加值!
它是如何工作的?
流程挖掘的一大优势是以不可知的方式分析任何流程。这要归功于数据,即在 IT 系统中执行的任何操作的足迹,并记录在其日志中。
为了理解这是如何工作的,让我们考虑一个由 5 个活动 A、B、C、D、E 组成的过程,并分析 3 个过去的项目如何通过这个过程来帮助了解它。
在下面的动画中,您可以观察到一些案例经历了不同的活动,或者经历了相同的活动但顺序不同**。其他一些循环相同的活动。**
流程挖掘包括基于历史数据分析所有可能的模式,并为调查创建高度可视化的流程图。
From IT System log to an exhaustive, fact-based understanding of your process (ILLUSTRATIVE)
过程挖掘如何极大地提高过程发现练习?
过程挖掘的价值是双重的:产生有价值的洞察力以改进当前的过程,以及加速洞察力产生的时间,从而提高团队的生产力。让我们比较并强调这些优势:
没有流程挖掘
传统的流程发现方式是通过研讨会和访谈手动进行。****
1.耗时 : 对于做访谈和流程映射的人来说。如果他们能更快地完成工作,他们就能做更多的项目,从而为他们的组织交付更多的价值。
2.绑定资源:它将人们(受访者)从生产工作中绑定到讨论当前事情是如何完成的,只是为了理解“现状”流程。
3.主观结果:基于人们对流程的看法,而不一定基于流程的实际情况。
4.政治僵局风险:可能有不同意见无法解决(政治僵局)。在参与的人不能对“现状”过程和过程中的问题达成一致意见的情况下,项目失败的风险很高,并且根本没有进行过程改进。
5.不完整的图片:你得到的只是一个样本视图,而不是完整的图片。通过要求人们拼出过程,手动图片将永远不会完整。
6.测量成本高:人工跟踪测量成本高,有偏差,而且只能提供样本数据。这是关于使用秒表测量过程步骤以收集客观证据的实践:(1)做这种手工工作非常耗时,(2)被观察的人的行为与正常情况不同,以及(3)只能获得有限的样本(例如,在几周内追踪 30 个案例)。
7.难以复制:因为流程诊断和信息收集的成本太高,不容易重复。
使用流程挖掘
任何过程改进项目的起点都是所谓的“现状”过程分析,在该过程分析中,绘制出过程的当前状态和所有缺陷,并确定改进机会。流程挖掘通过限制人员访谈和从 IT 系统的现有数据中提取必要的信息,大大降低了理解当前流程的成本。
有了流程挖掘,前面提到的棘手问题得以解决:
1.时间高效:分析师花在访谈和研讨会上的时间更少。相反,“原样”流程是根据组织中的 IT 数据自动重建的。
2.释放资源:研讨会可以更有成效,因为真正的“原样”流程已经可以作为一个起点。
3.客观结果:数据为诊断和改进决策提供事实依据。
4.摆脱政治僵局:就过程现实而言,没有发表意见的余地。
5.完整画面:所有异常都随正常流程带入画面。例如,可以分析过去一年的所有流程变化和实际延迟,以获得完整的画面。
6.测量成本更低:流程步骤之间的实际持续时间和延迟可以针对数千个事务进行测量。
关于所需数据的一句话
对于所有的数据驱动技术,为了能够从过程挖掘中充分受益,数据准备起着重要的作用。
在这一节中,我将向读者简要介绍数据需求,包括创建一个可以输入到流程挖掘工具中的事件日志**。**
先决条件
任何过程分析都需要哪些关键要素?实际上只需要 3 条主要信息:
- 活动(流程步骤):组成流程的几个步骤。
- Case ID :通过流程的任何物品的唯一标识符。
- 时间戳(用于性能评估):每个项目到达和离开任何活动的标志。
可选
对于更高级的分析,我强烈建议您用附加(可选)信息来补充这些先决条件,例如资源**、国家、部门等。参与其中。**
利用这些额外的数据将能够进行更高级、更详细的调查(地域特殊性、根据产品类别而区别对待的产品等。)
Process Mining tools can ingest information once prepared in this simple template (event log) (ILLUSTRATIVE)
成功标准
有兴趣启动流程挖掘计划吗?在开始之前,提醒一下流程挖掘是一门学科**(不仅仅是一种工具),它需要人们需要学习的技能(例如,如何检测数据质量问题,如何解释结果,等等。)并且过程挖掘只是与领域专家讨论的起点(所以目的不是自动生成确定的答案并停止与人交谈,而是开始在不同的层面上与他们交谈)。**
确保从一开始就确定成功的标准。
- 关注商业价值:从有效性(客户体验和收入)、效率(成本)和风险(可靠性)三个方面定义商业价值。确定您想要深入了解流程的哪些方面。这种洞察力有助于哪种业务驱动力?更好的客户体验、降低成本、降低风险?
- 从小处着手,大处着眼:将业务驱动因素与特定的业务领域联系起来。选择一个起点和终点都明确的过程。这一过程的每一个管理者都将从有助于降低成本或提高效率的见解中受益。当你考虑可能的使用案例和应用可能性时,也要确保传达流程挖掘不是什么。通过指出清晰的界限,你可以管理对它的期望。
- 工作假设驱动且周期短:将主要业务驱动因素分成子假设,您可以通过流程挖掘分析来确认或否定这些子假设。例如:有一种直觉,认为某个特定的服务流程耗时太长。这个过程需要多长时间?它与预期偏离了多少?导致这一过程延迟的瓶颈在哪里?此外,您还可以指出流程中延迟的确切位置。让您的业务利益相关者从一个洞察到另一个洞察。刺激他们提问。探索,分析,创新。时间盒中间结果和项目。第一个项目的八周通常是一个很好的目标。
- 事实不会说谎:流程挖掘允许你根据事实而不是主观意见来分析流程。公开透明地谈论你使用的数据和从分析中得出的事实。这可能是对抗性的,对一些人来说甚至是不受欢迎的。组建一个有能力处理阻力的变革管理团队。过程挖掘可以是这一真相发现的完美助手。总是使用来自业务流程领域和 IT 领域的专家来对数据和分析进行完整性检查。使用流程挖掘作为建设性的起点,提出正确的问题,避免过快的判断。
结论
几年前,我跟随流程采矿大师 Wil van der Aalst 的在线课程发现了流程采矿,这真的让我大开眼界。它的好处数不胜数,绝对应该成为任何数据科学家的工具箱的一部分!
我很高兴收到任何类型的反馈,所以请随时发表评论并分享您的观点(意见、用例等)。)在这个能力上。
Struggling with your processes? No need to get your hands dirty anymore! Take full benefit of process mining!
来源
- 流程挖掘:数据科学在行动 | Wil van der Aalst |埃因霍温理工大学| Coursera。
- 实践中的流程挖掘 |由 active Fluxicon 的团队编写的综合性在线书籍。
- Fluxicon 网站 |一家通过 Disco 实现流程挖掘“企业就绪”的创新公司。
- Fluxicon 博客也充满了很棒的技术指导和用例。
- ProM 网站 | ProM 是一个开源的可扩展框架,支持多种流程挖掘技术。
- Celonis 网站 | Celonis 是一家技术公司,提供致力于流程挖掘的软件和咨询服务。
- R 中的业务流程分析 | bupaR 是一个开源套件,用于处理和分析 R 中的业务流程数据,由比利时 Hasselt 大学的业务信息学研究小组开发。
注意
这篇文章主要基于我作为一个数据科学家爱好者的观点和详细的高质量 Fluxicon 文档。一个伟大的有价值的资源,对于任何有兴趣在理解基础理论上更进一步的人来说!
从机器学习中释放商业价值:模型可解释性
为什么越花哨越好
这是人工智能革命。如果你的公司没有挖掘数据,把它塞进神经网络,并推销其先进的人工智能能力,你已经落后了…对不对?不完全是。
就像明星球员会成为糟糕的教练一样,在高抽象层次上做出复杂决策的模型也是有代价的,他们不容易解释他们的推理。这是一个直接的(有时是昂贵的)权衡。
机器学习也有类似的范式。模型越强大,就越难解释其内部运作。当然,你可能会从神经网络中得到更准确的答案,但是它如何得出那个答案可能完全是个谜。当试图找出哪里出了问题或者如何改进时,这可能是一个问题。
现代营销巩固了“深度学习神经网络”作为科技领域最性感的四个词短语的竞争者。但是,数据科学家知道,越花哨并不总是意味着越好。
如果我告诉你 真正的商业价值 不一定与你的模型的“复杂程度”相关联呢?
模型可解释性
可解释性用于寻求对输入和输出之间复杂本质的理解。
Model Explainability vs. Power. Credit: iapp
让我们举一个简单的例子:预测 年家庭支出 。利用一个神经网络,我可以得到这个国家每一个人手里的每一美元的完美预测。那太好了,但是如果我想知道投入是如何促成那笔支出的呢?
一般的狗贵多少?一般的孩子?收入增加?这些因素肯定会增加支出,但是在高层决策中,每个因素增加多少可能是一个谜。
由于神经网络如何将输入转化为输出的复杂、抽象的本质,试图理解它是没有希望的。
Deep Learning interpreting inputs
相反,一个简单的线性回归可能会得到这些答案。虽然不太准确,但肯定会更容易理解。
Linear Regression interpreting inputs
你是选择线性回归、神经网络,还是任何介于两者之间的方式,可能在很大程度上取决于你的目标——是使用还是理解机器。换句话说,你需要一个好球员还是一个好教练?
商业价值
归根结底,什么对你的企业更有价值:最大化绩效指标还是理解投入产出关系?
问问你自己:
- 我的客户需要了解机器的决定吗?
比如以“我不知道,机器刚这么说”为由拒绝贷款申请,就是不够好。改变生活的决定应该被清楚地传达,而且决定应该是公平的。
这是从可解释性中释放价值的基础**——被告知的客户是信任你的客户。**
最后一件事
还有一点值得一提:明确输入的重要性。
选择正确的输入对于建立一个可解释的模型至关重要。只有当你的输入一开始就有意义时,直观的输入-输出解释才是可能的。例如,考虑以下两个特征:
显然,第一个特征更容易理解:“每多生一个孩子,一个家庭平均每年将多支出 10,000 美元”,而“收入的平方根每增加 1,000 美元,平均每年支出就会增加 0.25 美元”。
尽管第二种方法可能有助于建立更准确的模型,但直觉上它毫无意义。输入是直观的,这一点至关重要——我们的客户和我们的决策可能会依赖于此。
结论
今天深度学习的爆发是很牛逼的,但我们不应该忘记基本面。
大多数商学院统计学课程关注线性和逻辑回归是有原因的。清晰的理解导致良好的决策、有效的沟通和信任你的客户。
最后,我想这是一种“嘿,有时客户也需要知道发生了什么”的冗长说法
揭开 PCA 背后的数学面纱
大量的特性可能是一件好事,也可能是一件坏事,这取决于具体的实例。这种情况经常发生,以至于相当多的可用特性是相关的,因此是多余的。更大维度的数据更难可视化。这就是降维技术派上用场的地方。PCA 可能是最常用的降维技术。它不会消除特征,而是从现有的低维特征中形成新的特征。为了真正理解这种算法,有必要掌握一些统计概念,这反过来又涉及到一些数学。但是,如果数学不是你的强项,也不要担心,因为我会尽量把它变得简单。因此,让我们更深入地探讨一下。
协方差
我们需要理解的第一项是协方差。协方差是两个变量之间的度量。它给出了一个维度的变化如何影响另一个维度的变化的度量。听起来真的很熟悉相关性,除了它不是。
标准差或方差是单变量分析的一种度量,其中这些度量的值给出了组成员对组均值的净偏差。这两个措施在一个维度上起作用。协方差在两个维度上起作用。
协方差是一种度量,用于找出维度相对于平均值的变化程度。总是在两个维度之间衡量。协方差的公式如下
协方差值可以是负数、零或正数。零协方差表示两个维度相互独立。正协方差表示两个维度一起增加和减少,而负协方差表示一个维度增加,另一个维度减少。
特征向量
特征向量是满足以下方程的任何向量:
Av = λv
其中 A 为(n×n)方阵,v 为特征向量,λ为特征值。
在这里你可以观察到,当特征向量 v 用矩阵 A 变换时,向量 v 只按因子λ缩放,也就是说,它改变了它的大小。它不会改变方向。
特征向量使理解线性变换变得容易。它们是线性变换简单地通过“拉伸/压缩”作用的方向。也就是说,v 和 Av 会在同一直线上,Av 只是将 v 拉伸或压缩一个因子λ,这个因子叫做特征值。
协方差矩阵的特征向量对应于最大特征值,如果它在数据中的方向(因为我没有更好的术语)具有最大方差。
PCA 的步骤
1)用平均值减去数据的每个变量。
将此存储在变量 roadjustdata
假设数据有 m 个实例和 n 个变量,得到的矩阵将是一个(m,n)形矩阵。
2)计算可用数据的协方差矩阵。
3)计算协方差矩阵的特征向量和特征值。
对于 PCA 来说,重要的是特征向量是单位特征向量。
特征向量帮助我们得到表征数据的线条。
The red dots represent the data points while the dotted lines represent the eigenvectors.
4)具有最高特征值的特征向量是数据的主成分。
一般来说,一旦找到特征向量,就把特征值从最高到最低排序。相应的特征向量按照分量的重要性顺序给出分量。
5)获取转换后的数据。
创建一个名为 FeatureVector 的新矢量,如下所示:
If you’ve chosen the first k principal components, then those eigenvectors are placed in columns in this matrix
这个矩阵将是(n,k)
的形状,其中 k 是你选择包括的主成分的数量。
现在,转换后的数据将是
transformed data = RowAdjustData * feature vector
,并且这个结果矩阵的大小将是(m,k)。注意,实际数据的形状是(m,n)。其中,k(我们选择的组件数)将小于 n,这就是降维的执行方式。
具有特征向量单元将是有用的,因为值将在变换时被放大或缩小。
在上图的例子中,我们简单地选择对应于正斜率虚线的特征向量,从而消除了一个维度。
拆包(** PCA)
降维技术的一种实用实现
尽管互联网上有大量的 PCA(主成分分析)资源,但只有忍者才能在一定的合理时间内抓住整个想法,更不用说在你知道实际发生了什么的同时将想法具体化为代码。话虽如此,我们还是非常喜欢像专业人员一样应用 PCA 和解决真实案例的感觉。
在这篇文章中,我将尝试并清楚地说明人们可能会感到困惑的想法,我认为像我这样的新手会陷入其中并坚持几个小时。
事不宜迟,让我们直接进入正题。
首先,主成分分析是一种降维方法,更简单地说,是将多个特征(变量)归纳为较少特征的方法。假设,我们需要将新看到的动物分类为’狗或’猫,我们将测量动物的特征,如’身高和’体重。我们也可以根据更多的特征对这种看不见的动物进行分类(颜色’、形状’、敏捷’…等等。)
但是,问题是,我们不能将它们归类为超过三个特征(维度),这对我们来说是视觉上无法解释的。另一个原因是,有些特征用起来不太重要,或者更糟的是,如果它们是随机数据或错误,有些可能是噪音,这两种情况都会干扰我们的预测。
简而言之,一个特征’体重’可能无法有效区分’狗’和’猫’,因此我们应该从数据中去掉’体重’。通过去掉大部分不重要的特征,我们可以节省计算成本。想象一下,我们的数据有 100 x 100 个特征,比如图像或遗传信息,尽可能地降低维度会好得多。
我们可以通过使用 PCA 来实现这些愿望。
PCA describe multiple variable with fewer Principal Components
最好是实现一下,以获得一个整体的想法。让我们从制作 5 *10 矩阵开始,并采取步骤的过程。
Matrix X
列是变量(特征),行是样本(比如“猫”或“狗”)。
我们想对这个矩阵做的是得到特征值和特征向量,它们变成了描述样本的新变量(主成分)。设矩阵***【x】*为 n p 大小,则 p p 协方差矩阵其中【c=xᵀx/n.】**协方差矩阵是埃尔米特矩阵和半正定矩阵,利用 谱定理 让我们得到一个协方差矩阵和特征值。但在此之前,不要忘记从同一列中减去每列的平均值。
我们设置’row var = False ',这样关系就转置了:每一列代表一个变量,而行包含观测值。然后,我们得到 w 中的特征值和 v 中的特征向量。
Means of each columns
*10 10 Covariance Matrix
*此时,特征向量是 10 10 的矩阵。为了执行从 10 个变量到 2 个变量的降维,我们需要截断矩阵。
然后,我们要将(主轴上的投影 X)原始的 10 10 样本变换到新的空间(二维空间),我们使用等式=XV。*
*10 2 Eigenvectors (Principal components)
*我们得到了矩阵 5 2 矩阵 T ,投影到 2 个主成分上。我们最后用两个变量来描述每个样本。
*有趣的部分应该是可视化这些转换后的样本数据。让我们使用更大的数据。从定义 200 2 矩阵 X 开始。
(在这种情况下,特征值是 2,因此我们实际上不需要将其截断为 2)
最后剧情。让我们不要忘记设置 轴‘相等’,这样我们可以看到主分量的正交性。否则,我们将得到一个不垂直的特征向量。
Original sample plot(Fig. left) and plot eigenvectors(Fig. right)
让我们也绘制转换后的样本。因为我们的样本已经是二维的,我没有必要截断它们,但是,让我们采取降维过程的步骤。
最后剧情。
正如我们所看到的,两个主分量是正交的,因为它们被 PCA 去相关,所以变量是相互独立的。
Fig. 1: Plot transformed sample data
样本数据也沿着两个主轴进行变换(不相关/旋转)。
Fig.2: Uncorrelated sample data
为了更好地理解术语 【不相关/旋转】 ,让我们看一下图 1,并与图 2 进行比较。分散的数据实际上是完全相同的数据,但是,我们对它们进行了去相关(旋转),从而使两个变量(轴)相互独立(图 2)。
*为什么我们要用特征分解(或者为了效率用奇异值分解),用一些最大的特征值和对应的特征向量?这是因为 PCA 的目的是降低维数,但同时又尽可能用较少的变量描述样本。换句话说,我们想要在每个样本中变化的变量,而不想要在样本中相同的变量。我们可以通过使用更大的特征值或更大的方差来实现这个想法。根据信息论的观点,最大方差对应于具有最大熵的维度,因此,最大方差编码了最多的信息。然而,特征分解是昂贵的。假设,我们有图像样本,比如说 100 100 像素,这意味着它有 10000 个变量。它的协方差矩阵 C 将是 10000 * 10000 维。因此,我们通常更喜欢 SVD(奇异值分解)来将维度大小降低到样本大小,而不是可变大小。让我们试一试,用奇异值分解绘制样本。
SVD 将协方差矩阵 C ,wherec=xxᵀ/n**,分解成其中 S 是一个含有奇异值的(矩形)对角矩阵**【sᵢ***, U 是一个酉矩阵,而就奇异值***【sᵢ】而言,我们可以用【λᵢ=【sᵢ2)/n】,其中 n 是样本量,**【λᵢ】是特征值。
从这个结果中,我们通过 SVD 和本征分解看到完全相同的主分量。
让我们也确定特征向量是相互正交的。一个正交矩阵 Q 定义为 QᵀQ=QQᵀ=I ,其中 I 为一个单位矩阵。我们从奇异值分解得到了特征向量*【vᵀ】*现在如下图。
Vᵀ*** (Eigenvectors)***
V.dot(V.T)
的结果是一个单位矩阵。
Identity matrix
在许多数学概念的理论中,例如偏最小二乘法,向量正交的概念经常出现。以这种方式检查它对于确保我们在正确的轨道上是有用的。
PCA with SVD
人们可能想观察每个点离中心有多远。其中一个方法是画一个等概率图,或者误差日蚀图。这对于查看两个组中间的样本特别有帮助,例如,我们可以将它用于 K-means 聚类。
我们从导入模块开始。然后,我们想用奇异值分解原始样本的协方差矩阵。
酉矩阵 U_ 用于旋转样本数据,现在我们分别使用U _【0】和U _【1】,余弦,正弦,这样我们就可以得到正切来计算角度。**
Equiprobability: ecliptic error circle
角度是从 x 轴。当坐标轴由标准差定义时,日食由方程定义,(x/σ₁)【+(y/σ₂)= s**,其中 σ₁ 为 x 轴的标准差, σ₂ 为 y 轴的标准差, s 为样本的方差。**
The angle between X and PC1
x=2σ₁√s 表示一个标准差。我们在上面的代码中绘制了三次。第三个圆圈包含图像上的大部分样本数据,因为它应该是 99.7%的置信区间。
我们可以使用 Scikit-learn 进行 PCA。让我们再看一遍同一个样本。像往常一样从样本数据开始。
*定义 200 2 矩阵 X ,为了剧情的缘故,我们使用两个组件。
剩下的过程和以前一样。
PCA with Scikit-learn version
结果是一样的。从代码中可以看出,我们可以通过 【分量 _ 获取最大特征向量,通过 解释 _ 方差 _ 获取特征值。
explained_variance_
让我们来看看 讲解 _ 方差 _
主成分解释了样本数据的 97.6%[0.7625315/(0.7625315+0.0184779)],第二主成分解释了剩余部分。这意味着我们几乎可以不用第二主成分来描述原始数据。Scikit-learn 已经计算了解释方差比率,因此我们可以使用 viaexplained _ variance _ ratio _。
*为了更好地理解,让我们使用 1797 64 矩阵数字数据,并将这些维度从 64 减少到 10。
现在,我们可以看到这 10 个新组件可以在多大程度上描述原始样本数据。
Accuracy vs. number of components
事实证明,它描述了 72~73%的样本,而不是使用确保 100%准确性的 64 个维度。请注意,在左图中,第一个成分是指数 0,这就是为什么该图从 14~15%的方差开始。
假设需要多少元件才能达到 90%的精度呢?我们可以先清空 PCA 函数并绘制图形。
我们认为 20 个左右的成分对于 90%的方差来说就足够了。更简单的方法是将数字直接添加到函数中,例如,pca = PCA(.9)
为了进一步理解,让我们将转换后的样本数据转化为原始数据,并对它们应用热图。我们应该观察到,组件的数量越多,它创建的样本数据就越精确。
显然,原始数据比具有两个主成分的反演数据具有更多的特征。使用四十个主成分,我们可以更精确地反演转换后的数据。
我们实际上可以显示目前为止我们正在处理的数字数据。
Digits from original sample
让我们使这些数字图像更粗糙,或者更准确地说,一旦执行降维并将数字图像反转到原始大小。
Reconstructed digits images
我们也可以将 PCA 应用于特征脸,因为它的特征只有亮度,就像上面的数字图像一样。在重建原始数据方面,我们采取了与数字重建略有不同的步骤。因为我们首先需要一张平均脸。在转换数据后,我们添加平均脸。假设我们想要一个反转的人脸图像 X , X 描述为x =μ+w₁***** v₁***+w****₂***** v*****
Full dimension(Fig. above) and 100 dimensions(Fig. below)
*正如我们之前讨论的,当维数很大时,SVD 表现良好。例如,这些图像是 62 47 = 2914 尺寸。如果我们使用本征分解,我们需要计算相关矩阵的 2914 2914 维。相反,奇异值分解可以通过样本大小样本大小来计算。
*主成分由 XV=US 给出。我们把维度从 500 降低到 100,现在 我们的 就是一个 500 100 的矩阵。
为了与原始人脸图像进行比较,我们要将 投影为 ,并将其逆投影为 X 。我们应用方程*【x=usvᵀ】,得到 500 * 2914 矩阵×19**。***
最后绘制图像。
Reconstructed face images with SVD(Fig. below)
得到的图像不像先前的 scikit-learn 方法那样模糊。似乎是更好的方法,我们使用的数据越少,构建的图像越清晰。这是因为样品的噪音更少,机器使用的过滤器更少。这将导致它自己对新图像的预测较低,这是机器以前从未见过的。
组成这些脸的特征向量称为特征脸,每个特征脸都是唯一的。让我们来看看他们是什么样子的,以及这些人脸图像的平均脸是什么样子的。
The average face(Fig. left), and the first five(most biggest) Eigenfaces(Fig. right group)
平均人脸是人脸图像的基础。
最后,这里是奇异值分解处理特征脸的概述。
SVD overview
参考
** [## 奇异值分解与主成分分析的关系。如何用 SVD 进行 PCA?
主成分分析(PCA)通常通过协方差矩阵的特征分解来解释。然而…
stats.stackexchange.com](https://stats.stackexchange.com/questions/134282/relationship-between-svd-and-pca-how-to-use-svd-to-perform-pca/) [## 理解主成分分析、特征向量和特征值
在今天的模式识别课上,我的教授谈到了 PCA,特征向量&特征值。我得到了…
stats.stackexchange.com](https://stats.stackexchange.com/questions/2691/making-sense-of-principal-component-analysis-eigenvectors-eigenvalues) [## 主成分分析的一站式商店
在我用于研究生统计理论课的教科书的开始,作者(乔治·卡塞拉和罗杰…
towardsdatascience.com](/a-one-stop-shop-for-principal-component-analysis-5582fb7e0a9c) [## 如何画出代表协方差矩阵的误差椭圆?
在这篇文章中,我将展示如何为 2D 正态分布数据绘制一个误差椭圆,也称为置信椭圆…
www.visiondummy.com](http://www.visiondummy.com/2014/04/draw-error-ellipse-representing-covariance-matrix/) [## 用于特征选择的主成分分析(PCA)及其一些缺陷
数据科学中的一个典型方法是我所说的宇宙特征化。我的意思是我们提取…
jotterbach.github.io](http://jotterbach.github.io/content/posts/pca/2016-03-24-Principal_Component_Analysis/) [## eigen faces-scholar pedia
特征脸可以被认为是表征人脸图像之间的全局变化的一组特征。然后…
www.scholarpedia.org](http://www.scholarpedia.org/article/Eigenfaces#fig:PIE.jpg) [## 基于主成分分析的特征提取——假人的计算机视觉
在这篇文章中,我们讨论如何主成分分析(PCA)的工作,以及它如何可以被用来作为一个维度…
www.visiondummy.com](http://www.visiondummy.com/2014/05/feature-extraction-using-pca/)**
解开政策梯度并加强
这一次,我们将让自己忙于另一个强化学习算法家族,称为基于策略的方法。如果你还记得,当谈到无模型强化学习时,有两组主要的技术。
我们分析了前两篇文章中的第一部分,其中我们谈到了 Q 学习和深度 Q 网络以及对基本模型的不同改进,如双深度 Q 网络和优先重放。看看这里的和这里的和。
让我们快速回放一下。请记住,我们将问题构建为马尔可夫决策过程,我们的目标是找到最佳策略,这是从状态到行动的映射。换句话说,我们想知道在给定的状态下,具有最大期望回报的行为是什么。在基于价值的方法中,我们通过寻找或近似价值函数来实现,然后提取策略。如果我们完全抛弃价值部分,直接找到策略会怎么样。这就是基于策略的方法的作用。
不要误解我。Q-learning 和 Deep Q 网络都很棒,它们在很多应用程序中使用,但是基于策略的方法提供了一些不同的优势:
- 它们更容易收敛到局部或全局最大值,并且不会出现振荡
- 它们在高维或连续空间中非常有效
- 他们可以学习随机策略(随机策略给出动作的概率分布,而不是确定性动作。他们在随机环境中使用,他们将随机环境建模为部分可观测的马尔可夫决策过程,在这种情况下,我们无法确定每个行动的结果)
等一下。我讲了收敛,局部最大值,连续空间,随机性。这里发生了什么事?
嗯,问题是基于策略的强化学习是一个优化问题。但是这是什么意思呢?
我们有一个带有一些参数θ的策略(π),它输出动作的概率分布。我们想找到产生最佳政策的最佳θ。但是我们如何评价一项政策的好坏呢?我们使用一个政策目标函数 J(θ),它通常是期望的累积报酬。此外,无论我们有间断的还是连续的环境,目标函数都是不同的。
所以我们在这里,手里拿着一个优化问题。我们所要做的就是找到使 J(θ)最大化的参数θ,这样我们就有了最优策略。
第一种方法是使用强力技术并检查整个策略空间。嗯,不太好。
第二种方法是在策略空间或其子集中使用直接搜索。这里我们引入术语**策略搜索。**事实上,我们可以使用两种算法。让我们称他们为:
- 无梯度
- 基于梯度的
想一想你曾经用来解决优化任务的任何算法,它不使用导数。这是一个无梯度的方法,其中大部分可以用于我们的情况。一些例子包括:
- 爬山是一种随机迭代的局部搜索
- 单纯形:一种流行的线性规划算法(如果你喜欢线性代数,就去看看他)
- 模拟退火,根据某种概率在不同状态间移动。
- 模拟物理进化过程的进化算法。它们从一个以基因组表示的随机状态开始,通过交叉、突变和物理选择找到最强的一代(或最大值)。整个“适者生存”的概念包含在一个算法中。
第二类方法使用梯度下降或者更准确地说是梯度上升。
在(普通)梯度下降中,我们:
- 初始化参数θ
- 生成下一集
- 获得长期奖励
- 基于所有时间步长的奖励更新 theta
- 重复
但是有一个小问题。我们能以解析形式计算梯度θ吗?因为如果我们做不到,整个过程都会被扔进垃圾桶。事实证明,我们可以用一点小技巧。我们必须假设策略在非零的时候是可微的,并使用对数。此外,我们将状态-动作轨迹(τ)定义为状态、动作和回报的序列:τ = (s0,a0,r0,s1,a1,r1…,st,at,rt)。
我想今天的数学到此为止。当然,结果是,我们有了解析形式的梯度,现在可以应用我们的算法了。
到目前为止所描述的算法(略有不同)被称为加强或蒙特卡洛政策梯度。与普通政策梯度的不同之处在于,我们去掉了对回报的预期,因为这不太实际。相反,我们使用随机梯度下降来更新θ。我们从期望值中抽取来计算该集的奖励,然后更新该集每一步的参数。这是一个非常简单的算法。
好了,让我们把那些事情都简化一下。你可以这样想政策梯度:
对于我们获得积极奖励的每一集,该算法将增加未来这些行为的概率。同样,对于负面奖励,算法会降低行动的概率。因此,随着时间的推移,导致负面结果的行为将慢慢被过滤掉,而那些有正面结果的行为将变得越来越有可能。就是这样。如果要从整篇文章中记住一件事,就是这件事。这就是政策梯度的本质。每次唯一改变的是我们如何计算奖励,我们选择什么策略(软最大,高斯等…)以及我们如何更新参数。
现在我们继续。
如前所述,增强是一种随机梯度下降算法。考虑到这一点,我想到了一个问题。为什么不使用神经网络来近似策略并更新 theta?
答对了。!
是时候将神经网络引入等式了:
当然,我们可以使用几乎任何机器学习模型来逼近策略函数(π),但我们使用诸如卷积网络之类的神经网络,因为我们喜欢深度学习。一个著名的例子是一个代理,它学习使用策略梯度和神经网络来玩 Pong 游戏。在该示例中,网络接收来自游戏的输入帧,并输出上升或下降的概率。
T3【http://karpathy.github.io/2016/05/31/rl/】T5
我们将尝试使用 OpenAI 的健身房环境做类似的事情。
你可以看到这不是小事。我们定义神经网络模型、蒙特卡罗抽样、训练过程,然后让代理通过与环境交互来学习,并在每集结束时更新权重。
但是政策梯度有其自身的缺点。最重要的是,它们具有很高的方差,并且很难稳定模型参数。
你想知道我们如何解决这个问题吗?保持联系…
(提示:它的演员兼评论家模型)
如果您有任何想法、评论、问题或者您只想了解我的最新内容,请随时在Linkedin,Twitter,insta gram,Github或在我的
要阅读完整的深度强化学习课程,学习所有你需要了解的人工智能知识,去 这里 。
原载于 2018 年 11 月 1 日sergioskar . github . io。
解开贝叶斯黑魔法:非贝叶斯主义者实施贝叶斯回归
首先,我是一个深度学习的人,直到最近我都很满意这一点。但我最近成了一个恶性小样本高维问题的受害者!所以我不得不把我的头转向擅长从小的学习的算法,并告诉我“我对那次学习有多有信心”。
这对我来说是一个相当突然的变化。因为我已经远离贝叶斯“东西”太久了。但是现在是改变的时候了。所以我不得不(几乎)从头开始学习。我被诸如先验、后验概率、 KL-Divergence 、 Evidence Lower BOund (ELBO) 之类的术语轰炸着(希望有一天我会再写一篇关于后两者的帖子!).然后我意识到“嘿,这和 frequentist 类型的算法没什么不同”。所以是时候解开结构化知识这个大球了,希望不要掉进兔子洞。
让我简单介绍一下将要发生的事情。所以我们要从一个频率主义类型的回归例子开始。然后,我们将会看到为什么我们可能想要用更有前途的技术来解决我们的例子,比如贝叶斯线性回归(显然是不确定性信息)。在那之后,我们将陈述贝叶斯规则,随后是关于我们如何能够采用贝叶斯规则来为给定的数据找到一个好的模型的快速注释。有了这个我们就可以定义先验、似然和后验项(我的意思是定义。不了解)。然后,我们将沿着一条漫长的道路(很长,但很有启发性)讨论这些术语。当我们讨论这些术语时,我们将看到我们在示例中得到的结果,以建立一些上下文。最后,我们将通过比较我们开始时(之前)和我们发现的最佳(之后)来做一个快速评估。
我们要解决的问题:Y= β1 X + β0 + ε
线性回归的第一个假设是,我们假设数据具有以下形式。
从这种模型生成的数据如下所示。
普通最小二乘(OLS)线性回归
假设我们得到了这个数据集,我们需要拟合一条线。我们通过将问题公式化如下来做到这一点。
我们的目标是找到β1 和β0,使数据的 RMSE(均方根误差)最小。从数学上来说,
首先让我们用线性回归拟合一条简单的直线。
A line fit to data with OLS linear regression
那么,这个结果说明了什么?
看起来还不错。事实上几乎是正确的。但是对于有限的数据区域,我真的可以依靠线性回归给出的答案吗?我不这么认为。我想要一个基本上说,
嘿,我之前看过很多这方面的数据,所以我对自己的预测还是蛮有信心的。
或者
嗯,这一点在我没有看到太多数据的地方。答案大概是这样,但我不太确定。
类似这样的。
Fitting lines with Bayesian linear regression. The red dashed line represent the mean line where the red solid lines on both sides represent the 95% confidence interval
你可以看到,在没有数据的地方,置信界限是如何增加的(因此答案的不确定性增加了)。但是线性回归给不了你这个。这就是为什么我们需要贝叶斯线性回归。那么,我们如何使用高级的“贝叶斯”疗法来解决这个问题呢?
重要的事情先来!所有贝叶斯“东西”的圣杯
贝叶斯规则
给定事件 B 发生的事件 A 发生的概率(后——你感兴趣但不知道的事情)由给定事件 A 发生的事件 B 发生的概率(可能性)乘以 A 发生的概率(前)给出。
贝叶斯定理和这个问题有什么关系?
很好,我们已经听过无数次了!我想知道的是这和机器学习有什么关系。为此,设 A 为学习模型的参数(即β0 和β1),用θ表示, B 为你的数据, D 。现在让我们解释一下贝叶斯规则中的每个实体。
通过求解这个问题,我们将得到给定数据下θ (β0 和β1)中所有参数的联合分布。这正是我们所需要的。换句话说,P(θ|D)将告诉我们给定数据β0=0.5,β1=2.0,概率为 0.5,β0=1.5,β1=3.0,概率为 0.1。所以我们知道β0=1.5 β1=3.0 并不完全脱离这个世界(这是我们实际上在 frequentist 方法中假设的)!这叫做后验分布。
我们通过计算来计算
- P(D|θ):如果我们的模型中有参数θ,我们有多大可能看到想要的数据
- P(θ):我们对参数θ可能位于何处的先验信念。这越接近真实的后验概率,你就能越快越好地找到正确的后验概率
- P(D):这是一个常数值,代表观察数据的概率
先验 P(θ):我们对什么样的参数的信念?
我们需要从一些参数值开始,对吗?在贝叶斯设置中,你不用一个值来指定事物,而是用分布来表示(例如高斯/正态分布)。在我们的例子中,我们可能会说,
用概率分布指定参数
嘿,我相信参数β0 可以用一个均值为 0,标准差为 3 的正态来表示。也就是说,
类似地,你说对于β1,
如果我们对β的许多值进行采样,我们就更接近真正的正态分布。如您所见,对于β0 和β1,许多值在接近 0 时被采样,但是与β0 相比,β1 更受挤压(与β1 相比,在 0 附近不太集中)
Priors we chose for β0 and β1
为什么是正态分布?
你会问为什么我们使用正态分布?正态分布具有非常好的分析特性。这样,我们就有了后验分布的均值和方差的解析解。关于解析后验解的更多细节。
为什么一个好的先验(P(θ))如此重要?
因为你的后路取决于此。也就是说,关闭你的前部到后部,你会更快到达真正的后部。要知道为什么,假设你的先验和后验是相同的,那么当你从先验采样时,你实际上是从后验采样(这是我们需要的)。
现在开始下一个重要的部分。看到数据的可能性。
可能性 P(D|θ):对于给定的θ,看到数据的可能性有多大
对于给定的一组参数,我们如何计算数据的似然性?换句话说,我们想要计算,
P(Y|X,θ)
下面,我们将做一步一步的探索,找到一个方程,我们可以计算这个实体的值。
计算可能性:P(Y|X,θ)
1.根据单个数据样本(Y 和 X)编写数据集(Y,X)
现在让我们试着为上面的项建立一个方程。
这是真的,因为假设,
- 【数据点(,易)是独立同分布的
2.用 x,β1,β0 和ε来写 y
现在让我们回忆一下我们的数据是什么样的,
我们可以把这个方程代入似然方程,
3.使用条件变量隔离ε
我们给出了所有的 x,β1,β0,所以我们可以把它们从等式中去掉,
这样考虑这个变换,如果我需要 P(A+B|B)这和 P(A|B)是一样的,因为我们知道 B 是“给定”。换句话说,P(B|B) = 1,所以我们可以从 P(A+B|B)的顶部去掉 B,而 P(A|B)不受伤害。
4.假设:噪声与数据无关
现在我们开始下一个重要的假设,
- 噪声与数据无关
这给了我们,
5.使用 PDF 的写入概率
记住我们的噪声是正态分布的,我们可以得到正态 as 的概率密度函数(PDF ),
6.假设:零均值恒定方差噪声
在线性回归中,我们对其中的噪声成分做了两个重要的假设。也就是说,它是正态分布,
- 这是零均值
- 它有一个恒定的方差
有了这两个假设,将噪声值代入我们得到的方程,
我们已经有了,
7.最终似然方程
所以让我们把它插上电源,
是的,都完成了!这是一个简单的变换系列,加上一些假设,以达到某种可计算的可能性函数。
使符号更简单
为了使事情更简单,从这一点开始,我们说,
这样一来,
直觉:如果 y=β1 x,似然如何寻找β1?
在我们的例子中有两个参数。所以为了简单起见,暂时忘掉β0。假设 y 和 x 是根据下式生成的
现在,我们通过尝试一系列不同的β1 值来进行近似,这将产生一个新的 y
对于β1 值的范围。可能性 P(y|x,β1)如下所示。
你可以看到接近 4 我们有很高的可能性看到数据。这正是我们所需要的。
更多直觉:我们前面例子的可能性
您可以将其推广到任意数量的β值(在我们的示例中是β1 和β0 值)。这是我们在例子中得到的图表。
上面的图表说明了什么?
上图显示,当β0 接近-2.5,β1 接近 1.5 时,我们最有可能看到数据 X,y。还要注意,β1 的可能性是一个很大的峰值,而β0 的分布更广。现在,作为一个练习,思考这对于每个变量对模型准确性的影响意味着什么。
希望这足够澄清事情。让我们继续到后面
后验 P(θ | D):我们最终需要什么?
后验概率是给定观察数据时参数(即β0 和β1)的概率密度函数。快速回忆一下,这是我们想要的最终结果(贝叶斯规则的左侧)。为了计算这个我们需要计算 P(Y|X, β1,β0 ) , P( β1,β0 ) 和 P(X,Y) 放在一起产生,
现在实体 P(X,Y)将是常数。因为无论我们对模型做了什么,无论我们有什么数据都会在那里。所以不会变。所以我要用一个常数 Z 来替换 P(X,Y),我们稍后会讨论如何计算这个 Z。
换句话说,
后验只是一个加权的先验,其中权重是对于给定的先验值看到数据的可能性
所以有两种方法可以解决这个问题。
- 得到后验概率的解析解
- 通过对许多β1 和β0 进行采样来求解该方程,然后近似后验概率
我们将使用取样。因为我们想通过更多的实践来学习
我们感兴趣的是后验概率和先验概率的表现。所以用解析解得到答案对我们来说就是作弊。让我们通过抽样来计算。
因此,我们将制定上述方程,以适应采样。
然后,我们通过从β0 和β1 各自的先验中提取 15000 个不同的值来近似完整的后验概率,并计算这些β0 和β1 组合的可能性。更具体地说,对于我们的例子,
所以我们解决了,
我们有后路。因为数据是独立的,β1 和β0 是独立的,所以我们可以把上面的实体写成,
通过赋予我们讨论过的符号简化,我们得到,
证据(Z=P(D)):使后验和达到 1
Z = P(D) = P(X,Y)
P(D) —这有时被称为证据,表示看到数据的概率。由…给出,
我们如何计算 Z?
我们如何能近似这一点?我们只是得到β1 和β0 样本的所有不同组合的 P(D|β1,β0)P(β1,β0)的总和(即贝叶斯规则的顶部)。我们取样越多,观察数据的概率就越真实,P(D)就越大。更具体地说,我们可以通过下式计算 Z,
这没有什么可怕的,这只是将 P 的顶部(β1(i),β0(i)|xj,yj)一遍又一遍地相加,得到我们对不同的β1 和β0 采样的总次数。Z 的存在使得后验概率下的面积加起来等于 1(你知道,因为这是一个概率分布)
对于我们的例子,先验、似然、后验结合在一起
下面我们把先验的、可能性的和后验的都放在一个地方来说明看起来如何。
图表显示了什么?
我可以做两个重要的观察。
- 你可以看到,由于我们的先验稍微偏离了真实的后验概率,这种可能性实际上将后验概率从先验概率中抽离出来。如果先验越来越接近真正的后验,你会看到这种拉力在减弱
- 下一个观察是,参数β1 似乎比β0 更敏感。否则,β1 的变化比β0 的变化更能影响结果的准确性。
最后,我们做一个比较,看看从先验分布(只有前 500 个样本)和后验分布采样的线的差异。我将让你来判断哪个更好。
如何获得新数据点的答案?
这很简单,因为我们有了β1 和β0 的后验分布。你只需从后验样本中抽取不同的β1 和β0,并得到这些β1 和β0 中每一个的值***【y】(即y =β1 x+β0***), 。有了这组 y 对于 x 的潜在候选,就可以计算出 y 的均值和 y 的标准差。
Jupyter 笔记本可在此处获得:
结束语
所以这有点长,但希望能揭开贝叶斯方法的一些“黑暗秘密”。通过一个示例任务,我们理解了贝叶斯线性回归是如何工作的;Y= β1 X + β0 + ε。
我们首先看到频率主义者的方法解决了问题,但是忽略了一些关键信息;答案的不确定性。然而,我们看到贝叶斯方法不仅会给出最有可能的答案,还会告诉我们这个答案的不确定性。
通过摘要的数据挖掘对代谢组学的当前和潜在趋势进行无监督分析
在短短几秒钟内不断更新有趣趋势的信息,这不是很酷吗?这是可能的,如果你挖掘文章摘要。
一个科学领域的进步取决于其从业者的自我评价。研究人员探索书目,以探索研究领域和相关领域的新兴模式。有了这些信息,他们可以研究现场社区感兴趣的新想法。
随着科学领域的蓬勃发展,在研究过程中获得新的见解需要更高的复杂性。因此,研究人员需要缩小他们的专业领域,以便为他们合作的跨学科团队贡献比较优势。
不幸的是,这种专业化可能意味着对相关领域发生的有趣趋势的认知度较低,而这些趋势可能有助于科学领域的进一步发展。油田可能越来越多地被封闭在筒仓中,其中一些程序是默认执行的,而不适应其他油田已经普遍存在的改进。
评论和会议是跟上新的有趣发展的有效手段。尽管如此,它们需要时间和认知投资,这些投资可以更好地用于继续推进项目。如果有某种方法能够以一种更自动和更容易解释的方式意识到新的有趣模式,那将是非常有益的。
Google Trends 支持调查和比较质谱和核磁共振等概念中的时间模式:
Google Trends
(试着在图片上找到圣诞节和暑假。)
尽管如此,Google Trends 只能处理单个概念,而不能处理关联概念。例如,“血液代谢组学”不能与“尿液代谢组学”相比,因为“血液代谢组学”和“尿液代谢组学”不是代谢组学研究中通常使用的概念。此外,对于谷歌趋势,我们需要在分析之前识别有趣的概念。但是,我们如何分析那些我们甚至不知道分析起来有意思的东西呢?
如果我们首先收集尽可能多的感兴趣领域的文本信息,就有可能对趋势进行“无监督分析”。有了这些信息,我们就可以分析一个词在一段时间内的使用次数,以及各种因素对其使用的影响。例如,合乎逻辑的是,使用核磁共振(nmr)作为分析平台的代谢组学文章比使用质谱(MS)作为分析平台的代谢组学文章更多地使用“NMR”一词。
通过在其搜索引擎中寻找具有例如“nmr 代谢组学”或“ms 代谢组学”的文章,然后导出找到的文章的摘要,可以从 Pubmed 数据库中提取文本信息。然后,R 包’记号赋予器’能够将导出的摘要组织成可以分析的单词列表。
核磁共振和质谱文章中最典型的词是哪些?
不出所料,排名大多被各分析平台的特定术语和代谢物占据。还可以找到一些专注于具体分析平台的研究中心。有趣的是,鱼似乎更容易被核磁共振分析而不是质谱分析。
这些信息可能很奇怪,并会产生一些转发,但可能不会有太大的成效。更有趣的可能是分析例如相对于前几年,哪些词在 2016 年的代谢组学中增加最多:
我们将永远拥有巴黎,“代谢组学”。我不会过度分析结果,因为科学产出可能有不规则的模式。尽管如此,2016 年似乎有相当多的新兴代谢组学文章来自非西方国家。对“1H”和“13C”的兴趣似乎也在下降,这可能是因为核磁共振的相关性在下降。
我还发现新出现的对利益冲突的担忧很有意思。尽管如此,这可能与《代谢组学》杂志最近提交的稿件中这一部分的要求相混淆。
(是的,在最差的排名中也有几个著名的名字……)
如果你需要写一篇代谢组学综述,或者你只是想在下一次会议上成为代谢组学的潮人/酷猎人/潮流引领者/什么的,与 2016 年相比,你可能对 2017 年代谢组学中正在流行或正在流行的词语更感兴趣:
很高兴看到指纹降低了它的相关性。跳上剖析的潮流;)
现在我们来分析一下相关领域有意思的趋势。如前所述,当试图在一个科学领域取得进展时,开发新方法的典型方式是试图从其他领域获取想法。代谢组学与蛋白质组学的联系比与其他组学的联系更紧密,蛋白质组学产生的年度研究产出比代谢组学大得多。因此,分析代谢组学中尚未探索的蛋白质组学的可能趋势是一个好主意。下面是蛋白质组学 2017 年和 2016 年的单词对比结果:
您是否发现了您尚未意识到的与代谢组学相关的感兴趣的领域或研究中心?
最后,我们可以分析代谢组学中多元分析的可能趋势。与前几年的文章相比,我们使用多元分析分析了 2016 年代谢组学文章中的趋势词,结果如下:
很明显,这里有一个混淆因素:与代谢组学中的多变量分析相比,该排名提供了代谢组学中更多的关于单词趋势的信息。像“代谢组学”或“代谢组学”这样的词,在多变量分析中没有相关性,是减少最多的词。
纠正这种混杂因素影响的一种方法是,通过分析 2016 年代谢组学中增加的词时计算的比率,将计算的比率“归一化”。例如,“代谢组学”的标准化是这样工作的:
- 在代谢组学多元分析中的趋势词分析中有 0.318 的比值。
- 在代谢组学趋势词分析中有 0.303 的比值。
- 在代谢组学的多变量分析中,单词的趋势重要性的归一化比率是 0.318/0.303=1.049。那么 2016 年‘代谢组学’在代谢组学多元分析中的重要性并没有发生有意义的变化。
修正后的排名给出了以下结果:
这里出现了一些有趣的词语。例如,“茶”、“酒”和“脑脊液”在多变量分析中似乎没有取得类似于其他研究矩阵中所示的进展。是因为这些矩阵的多元分析没有提供有意义的优势吗?或者,是否有可能尝试整合多变量技术来提高相关研究中获得的洞察力?
这些例子仅仅给出了在几秒钟内探索代谢组学(或任何其他科学领域)和可以利用的相关领域的当前趋势的无限可能性的不足直觉。如果有一些“参数调整”来过滤我们分析中不感兴趣的词,或者过滤来自旧文章或低引用计数/影响因子期刊的文章的摘要,那么可以开发更高质量的分析。此外,如果进行多年分析,以避免从任意模式得出错误结论,分析可能会得到改善。
无监督学习和数据聚类
涉及机器学习的任务可能不是线性的,但它有许多众所周知的步骤:
- 问题定义。
- 数据准备。
- 学习一个底层模型。
- 通过定量和定性评估改进基础模型。
- 展示模型。
解决新问题的一个好方法是以最好的方式识别和定义问题,并学习从数据中获取有意义信息的模型。虽然模式识别和机器学习中的问题可以有各种类型,但它们可以大致分为三类:
- 监督学习:
由“教师”给系统提供示例输入及其期望输出,目标是学习将输入映射到输出的一般规则。 - 无监督学习:
没有给学习算法贴标签,让它自己在输入中寻找结构。无监督学习本身可以是一个目标(发现数据中的隐藏模式),也可以是达到目的的一种手段(特征学习)。 - 强化学习:
一个系统与一个动态环境进行交互,在这个环境中它必须执行某个目标(比如驾驶车辆或者与对手进行游戏)。当系统导航其问题空间时,系统被提供奖励和惩罚方面的反馈。
介于监督学习和无监督学习之间的是半监督学习,其中教师给出一个不完整的训练信号:一个训练集,其中丢失了一些(通常是许多)目标输出。在这篇博文中,我们将重点讨论无监督学习和数据聚类。
无监督学习
在一些模式识别问题中,训练数据由一组输入向量 x 组成,没有任何相应的目标值。这种无监督学习问题的目标可能是发现数据中的相似示例组,这被称为聚类,或者确定数据如何在空间中分布,被称为密度估计。更简单地说,对于 n 采样空间 x1 到 xn,没有为每个样本提供真实的类标签,因此称为无师学习。
无监督学习的问题:
- 与监督学习任务相比,无监督学习更难…
- 既然没有答案标签,我们如何知道结果是否有意义?
- 让专家看看结果(外部评估)
- 定义聚类的目标函数(内部评估)
尽管存在这些问题,为什么还需要无监督学习?
- 标注大型数据集的成本非常高,因此我们只能手动标注几个例子。示例:语音识别
- 可能有这样的情况,我们不知道数据被分成多少/什么类。示例:数据挖掘
- 在设计分类器之前,我们可能希望使用聚类来深入了解数据的结构。
无监督学习可以进一步分为两类:
- 参数无监督学习 在这种情况下,我们假设数据的参数分布。它假设样本数据来自一个总体,该总体遵循基于一组固定参数的概率分布。从理论上讲,在一个正态分布族中,所有成员都具有相同的形状,并且通过均值和标准差被参数化。这意味着如果你知道均值和标准差,并且分布是正态的,你就知道任何未来观察的概率。参数无监督学习涉及高斯混合模型的构建和使用期望最大化算法来预测所讨论的样本的类别。这种情况比标准的监督学习困难得多,因为没有可用的答案标签,因此没有正确的准确性测量来检查结果。
- 非参数无监督学习 在无监督学习的非参数化版本中,数据被分组到聚类中,其中每个聚类(希望)表示数据中存在的类别和类的一些信息。这种方法通常用于建模和分析小样本数据。与参数模型不同,非参数模型不需要建模者对总体的分布做出任何假设,因此有时被称为无分布方法。
什么是聚类?
聚类可以被认为是最重要的无监督学习问题;因此,和其他这类问题一样,它处理的是在一组未标记的数据中找到一个结构。聚类的一个宽泛定义可以是“将对象组织成其成员在某些方面相似的组的过程”。因此,群集是它们之间“相似”并且与属于其他群集的对象“不相似”的对象的集合。
基于距离的聚类。
给定一组点,利用点之间的距离的概念,将这些点分组为一些簇,使得
- 内部(集群内)距离应该很小,即集群成员彼此接近/相似。
- 外部(集群内)距离应该很大,即不同集群的成员不相似。
聚类的目标
聚类的目标是确定一组未标记数据的内部分组。但是如何决定什么是好的集群呢?可以看出,不存在独立于聚类最终目标的绝对“最佳”标准。因此,应该由用户来提供这个标准,以使聚类的结果符合他们的需要。
在上图中,我们如何知道什么是最佳的集群解决方案?
为了找到特定的聚类解决方案,我们需要定义聚类的相似性度量。
邻近度
对于聚类,我们需要为两个数据点定义一个接近度。这里的接近度是指样本彼此之间的相似/不相似程度。
- 相似性度量 S(xi,xk):大如果 xi,xk 是相似的
- 相异(或距离)测度 D(xi,xk):小若 xi,xk 相似
有多种相似性度量可以使用。
- 向量:余弦距离
- 集合:Jaccard 距离
- 点:欧几里德距离
q=2
一个“好的”邻近度测量非常依赖于应用。在问题的“自然”变换下,聚类应该是不变的。此外,在进行聚类时,不建议对来自多个分布的数据进行标准化。
聚类算法
聚类算法可以分类如下:
- 排他聚类
- 重叠聚类
- 分层聚类
- 概率聚类
在第一种情况下,数据以排他的方式分组,因此如果某个数据点属于某个确定的群,那么它不能被包括在另一个群中。下图显示了一个简单的例子,其中点的分离是通过二维平面上的直线实现的。
相反,第二种类型,即重叠聚类,使用模糊集对数据进行聚类,使得每个点可能属于两个或更多个具有不同隶属度的聚类。在这种情况下,数据将与适当的成员资格值相关联。
分层聚类算法基于两个最近的聚类之间的联合。起始条件是通过将每个数据点设置为一个簇来实现的。经过几次迭代后,它到达最终想要的簇。
最后,最后一种聚类使用完全概率的方法。
在这篇博客中,我们将讨论四种最常用的聚类算法:
- k 均值
- 模糊 K-均值
- 分层聚类
- 高斯混合
这些算法都属于上面列出的聚类类型之一。而 K-means 是一种排他聚类算法,模糊 K-means 是一种重叠聚类算法,层次聚类是明显的,最后混合高斯是一种概率聚类算法。我们将在下面的段落中讨论每种聚类方法。
K 均值聚类
K-means 是最简单的无监督学习算法之一,它解决了众所周知的聚类问题。该过程遵循一种简单且容易的方式,通过先验固定的一定数量的聚类(假设 k 个聚类)来对给定数据集进行分类。主要思想是定义 k 个中心,每个聚类一个。这些质心应该以一种巧妙的方式放置,因为不同的位置会导致不同的结果。因此,更好的选择是将它们放置在尽可能远离彼此的地方。下一步是获取属于给定数据集的每个点,并将其与最近的质心相关联。当没有点悬而未决时,第一步完成,早期分组完成。在这一点上,我们需要重新计算 k 个新的质心作为上一步得到的聚类的重心。在我们有了这 k 个新质心之后,必须在相同的数据集点和最近的新质心之间进行新的绑定。已经生成了一个循环。作为这个循环的结果,我们可能会注意到 k 个质心一步一步地改变它们的位置,直到不再发生变化。换句话说,质心不再移动。
最后,该算法旨在最小化目标函数,在这种情况下是平方误差函数。目标函数
在哪里
是数据点 xi 和聚类中心 cj 之间的选定距离度量,是 n 个数据点距它们各自聚类中心的距离的指示符。
该算法由以下步骤组成:
- 设 X = {x1,x2,x3,……,xn}是数据点的集合,V = {v1,v2,…。,vc}是中心的集合。
- 随机选择‘c’个聚类中心。
- 计算每个数据点和聚类中心之间的距离。
- 将数据点分配到所有聚类中心中距离聚类中心最小的聚类中心。
- 使用重新计算新的聚类中心
其中,“ci”代表第 I 个聚类中数据点的数量。
- 重新计算每个数据点与新获得的聚类中心之间的距离。
- 如果没有数据点被重新分配,则停止,否则从步骤 3 开始重复。
虽然可以证明该过程将总是终止,但是 k-means 算法不一定找到对应于全局目标函数最小值的最优配置。该算法对初始随机选择的聚类中心也非常敏感。可以多次运行 k-means 算法来减少这种影响。
K-means 是一种简单的算法,已经被应用于许多问题领域。正如我们将要看到的,使用模糊特征向量是一个很好的扩展候选。
k-means 过程可以被视为用于将 n 个样本划分成 k 个聚类的贪婪算法,以便最小化到聚类中心的平方距离之和。它确实有一些弱点:
- 未指定初始化方法的方式。一种流行的开始方式是随机选择 k 个样本。
- 可能发生的情况是,最接近于 m i 的样本集是空的,使得 m i 不能被更新。这是一个需要在实现过程中处理的问题,但通常会被忽略。
- 结果取决于 k 的值,并且没有描述最佳“k”的最佳方式。
最后一个问题特别麻烦,因为我们通常无法知道存在多少个集群。在上面显示的示例中,应用于相同数据的相同算法产生了以下 3 均值聚类。它比 2 均值聚类更好还是更差?
不幸的是,对于任何给定的数据集,没有找到最佳聚类数的通用理论解决方案。一种简单的方法是比较不同 k 类的多次运行的结果,并根据给定的标准选择最佳的一个,但我们需要小心,因为根据定义,增加 k 会导致更小的误差函数值,但也会增加过拟合的风险。
模糊 K 均值聚类
在模糊聚类中,每个点都有属于每个聚类的概率,而不是像传统的 k-means 那样完全属于一个聚类。模糊 k-means 特别试图通过用概率代替距离来处理点在中心之间或不明确的问题,概率当然可以是距离的某个函数,例如具有相对于距离倒数的概率。模糊 k-means 使用基于这些概率的加权质心。初始化、迭代和终止的过程与 k-means 中使用的过程相同。产生的聚类最好作为概率分布来分析,而不是标签的硬分配。应该认识到,如果数据点最接近质心,则 k-均值是模糊 k-均值的特殊情况,此时使用的概率函数简单地为 1,否则为 0。
模糊 k 均值算法如下:
- 假设固定数量的集群 K.
- **初始化:**随机初始化与聚类相关的 k-means μk 并计算每个数据点 Xi 是给定聚类 K ,P(PointXiHasLabelK | Xi,K)成员的概率。
- **迭代:**给定所有数据点的隶属概率,重新计算聚类的质心作为加权质心 Xi :
- 终止:迭代直至收敛或达到用户指定的迭代次数(迭代可能陷入局部最大值或最小值)
为了更好地理解,我们可以考虑这个简单的一维例子。给定一个数据集,假设把它表示为分布在一个轴上。下图显示了这一点:
看这幅图,我们可以在两个数据集中附近识别出两个集群。我们将用‘A’和‘B’来指代它们。在本教程中展示的第一种方法 k-means 算法——中,我们将每个数据点与一个特定的质心相关联;因此,这个隶属函数看起来像这样:
相反,在模糊 k-means 方法中,相同的给定数据点不仅仅属于明确定义的聚类,而是可以放在中间。在这种情况下,隶属函数遵循更平滑的线,以指示每个数据点可以属于具有不同隶属度的几个聚类。
在上图中,显示为红色标记点的数据点更属于 B 类,而不是 A 类。“m”的值 0.2 表示这种数据点对 A 的隶属度。
层次聚类算法
给定一组要聚类的 N 个项目和一个 N*N 距离(或相似性)矩阵,分层聚类的基本过程如下:
- 首先将每个项目分配到一个分类中,这样,如果您有 N 个项目,那么现在您有 N 个分类,每个分类只包含一个项目。让聚类之间的距离(相似性)与它们包含的项目之间的距离(相似性)相同。
- 找到最接近(最相似)的一对聚类,并将它们合并成一个聚类,这样现在就少了一个聚类。
- 计算新分类和每个旧分类之间的距离(相似性)。
- 重复第 2 步和第 3 步,直到所有项目都聚集成一个大小为 n 的簇。
聚类为高斯分布的混合体
还有另一种处理聚类问题的方法:基于模型的方法,该方法包括对聚类使用某些模型,并试图优化数据和模型之间的拟合。
在实践中,每个聚类都可以用参数分布来表示,如高斯分布。因此,整个数据集由这些分布的混合建模。
具有高可能性的混合模型往往具有以下特征:
- 成分分布具有高“峰值”(一个聚类中的数据是紧密的);
- 混合模型很好地“覆盖”了数据(数据中的主要模式由成分分布捕获)。
基于模型的集群的主要优势:
- 可用的经过充分研究的统计推断技术;
- 选择组件分布的灵活性;
- 获得每个聚类的密度估计;
- “软”分类是可用的。
高斯混合 这种最广泛使用的聚类方法是基于学习一个高斯混合:
混合模型是 k 个分量分布的混合,共同构成混合分布 f ( x ):
αk 表示第k 个分量在构造 f(x) 中的贡献。在实践中,经常使用参数分布(例如高斯分布),因为已经做了大量工作来了解它们的行为。如果你用每一个 fk ( x )代替一个高斯模型,你会得到一个众所周知的高斯混合模型(GMM)。
EM 算法
期望最大化假设您的数据由多个多元正态分布组成(注意,这是一个非常强的假设,尤其是当您固定了聚类数的时候!).换句话说,EM 是一种当模型中的一些变量不可观察时(即当你有潜在变量时)最大化似然函数的算法。你可能会问,如果我们只是想最大化一个功能,为什么不利用现有的机制来最大化一个功能呢?如果你试图通过求导并把它们设为 0 来最大化,你会发现在很多情况下,一阶条件没有解。这是一个先有鸡还是先有蛋的问题,为了求解模型参数,你需要知道未观测数据的分布;但是你的未观测数据的分布是你的模型参数的函数。
期望最大化试图通过反复猜测未观察数据的分布来解决这个问题,然后通过最大化实际似然函数的下限来估计模型参数,并重复直到收敛:
期望值最大化算法
- 从猜测模型参数值开始
- E-step :对于每个有缺失值的数据点,使用你的模型方程求解缺失数据的分布,给出你当前对模型参数的猜测和观测数据(注意你是在求解每个缺失值的分布,而不是期望值)。现在我们有了每个缺失值的分布,我们可以计算关于未观察变量的似然函数的期望值。如果我们对模型参数的猜测是正确的,这个预期的可能性将是我们观察到的数据的实际可能性;如果参数不正确,它将只是一个下限。
- M 步:现在我们已经得到了一个不含未观测变量的期望似然函数,最大化这个函数,就像你在完全观测情况下所做的那样,从而得到你的模型参数的新估计。
- 重复直到收敛。
与聚类相关的问题
集群有许多问题。其中包括:
- 由于时间复杂性,处理大量维度和大量数据项可能会有问题;
- 该方法的有效性取决于“距离”的定义(对于基于距离的聚类)。如果一个明显的距离度量不存在,我们必须“定义”它,这并不总是容易的,尤其是在多维空间中;
- 聚类算法的结果(在许多情况下可以是任意的)可以以不同的方式解释。
可能的应用
聚类算法可以应用于许多领域,例如:
- 营销:给定一个包含客户属性和过去购买记录的大型客户数据数据库,找到具有相似行为的客户群;
- 生物学:根据植物和动物的特征对它们进行分类;
- 保险:识别平均索赔成本高的汽车保险保单持有人群体;识别欺诈;
- 地震研究:对观测到的地震震中进行聚类,识别危险区域;
- 环球网:文档分类;聚集网络日志数据以发现相似访问模式的组。
用于数据插值的无监督深度学习
使用前馈自动编码器的数据去噪
Image by Author
真实世界的数据是嘈杂的。噪声可能以不正确或缺失值的形式出现。本文描述了用自动编码器填充缺失值的方法。自动编码器在没有参考值可用于缺失条目的噪声数据上被训练。该程序是对图像重建的任务进行解释。该方法过去已成功应用于地震数据重建。Tensorflow 实现可用这里的。
问题概述
想象一下这样一种情况:数据丰富,但是数据有噪声,并且无法访问参考。一个很好的例子是图像,如图 1 所示。这里,图片中的黑点是噪声——图像值设置为 0,我们假设没有它们可用的地面真实数据。数据类型不限于图像,可以是任何东西,例如,丢失部分数据的患者记录。
****
Figure 1: Example of corrupted data. In the given example images have 0’s in places where pixels are missing. Images are taken from the Standard Test image dataset.
理想情况下,如果具有参考的训练数据可用,我们可以通过将重构与目标进行比较来训练网络重构缺失值。但是在没有目标数据的情况下,这是不可能的,因为将重构与 0(即缺失值)进行比较是没有意义的。在这里,我讨论了一种在没有参考资料的情况下训练自动编码器完成数据重建任务的方法。
理论概述
这一节简要回顾了神经网络和自动编码器。
神经网络
简单的前馈人工神经网络(ANN)有几层。第一层是输入层,输入数据。接下来是一些隐藏层。最后是输出层。层由基本单元组成— 神经元。一层中的神经元与下一层中的神经元相连。在训练过程中优化了两种参数类型:权重,对应于每条连接神经元的边,以及一个偏差关联于每一个神经元。因此,神经元的输入是前一层神经元的加权输出和偏差的线性组合。通过激活函数,例如 sigmoid ,将神经元的输入映射到一个新的空间,从而获得神经元的输出。回归的任务可以与特征学习的任务相关。在人工神经网络中,一个特征是隐层中单个神经元的输入连接。
Figure 2: A simple feed forward neural network. Image by Author.
训练是一个迭代过程,分为两个阶段:前馈和反向传播。前馈是将数据输入到输入中,并通过人工神经网络向前传播,从而产生输出的过程。对于每一层,该过程可以描述为:
y=s(Wx+b),
其中 x 是当前层的输入向量, y 是当前层的输出, W 是权重矩阵,其中Wki=Wki和 w ki 是 x i**
Figure 3: A single neurone. Image by Author.
在前馈通过之后,需要评估目标函数,并且需要估计使其最小化的参数。一种常用的优化方法是 随机梯度下降 (SGD)或 亚当 优化器。
自动编码器
这项工作考虑了基于自动编码器的人工神经网络。这种选择是合理的,因为它旨在消除任何关于数据的先验假设。简单的自动编码器只有一个隐藏层,其单元数少于输入数。深度自动编码器由具有非线性激活函数的多个隐藏层形成。这种结构允许在人工神经网络的更深层学习抽象特征和复杂关系。
一个自动编码器被拆分成一个编码器- f 和一个解码器 g 。编码器的目的是将 D 维输入 x 映射到通常更低的 K 维特征空间,即f**(x)=h。解码器旨在将特征空间映射回原始空间,从而重构输入,即g(h)=g(f(x)=r(x)~x**
缺少值的培训
因为没有给出信号丢失部分的参考值,所以训练神经网络仅重建信号的未被破坏部分。被破坏的数据被输入到神经网络中,然而,仅用于未被破坏的数据点的重建的误差被评估并用于反向传播。该过程基于这样的假设,即面片具有不同的噪声分布。如果在当前迭代的反向传播中没有使用信号值,则输入到神经网络中的后续面片将丢失不同位置的值。因此,在当前迭代中未更新的权重在下一次迭代中被更新。
Figure 5: Training with missing data. Edges marked with red colour are not updated in the given iteration. Image by Author.
由于在基于给定值的训练期间监控重建的良好性是有偏差的,所以对数据应用附加的二进制验证掩码。验证掩码包含 2%的噪声,并被投影到数据上。我确保数据中缺失的值和验证掩码中值为 0 的值不会重叠。在训练期间使用被验证掩码破坏的点。在每个时期之后,使用参考值计算被验证掩码破坏的值的误差。每当验证误差达到局部最小值时,保存网络的当前配置,并继续训练。
算法
该算法包括七个阶段(图 2)。首先,对数据进行预处理——在 0 和 1 之间进行缩放,并分割成小块。下一步,补丁通过人工神经网络。然后计算干净数据的误差,并更新参数。在下一阶段,使用验证掩码计算验证误差。如果 ANN 达到了局部最小值,则保存网络的当前状态。如果 ANN 不在其最小值,则跳过这一步。在下一步中,超参数被更新并且数据被混洗。如果满足停止条件,即达到最大历元,则获得缺失数据的重建,否则继续训练。
Figure 6: Algorithm stages. Image by Author.
结果
具有低频分量的图像比具有高频分量的图像重建得更好,即更复杂的场景更难重建。当使用更大的片时,即网络具有更多信息时,重构更好。最差的重建是在碎片的边缘和角落,那里的像素有五个或三个邻居,而在碎片的中心,像素被八个邻居包围。一种可能的解决方案是使用更大尺寸的补片,并且仅使用中心部分进行重建。这项工作可以通过使用 CNN 处理图像来改进,并在 RGB 图像上进行测试和应用于其他数据类型。
House: 30% missing(left) reconstructed (center) reference (right). 16x16 patches, 8 pix shift, averaged. Images are taken from the Standard Test image dataset.
Room: 50% missing(left) reconstructed (center) reference (right). 32x32 patches, 16pix shift, averaged. Images are taken from the Standard Test image dataset.
Lena: 50% missing(left) reconstructed (center) reference (right). 32x32 patches, 4pix shift, averaged. Images are taken from the Standard Test image dataset.
Baboon: 50% missing(left) reconstructed (center) reference (right). 32x32 patches, 4pix shift, averaged. Images are taken from the Standard Test image dataset.
Peppers: 70% missing(left) reconstructed (center) reference (right). 32x32 patches, 4pix shift, averaged. Images are taken from the Standard Test image dataset.
Lena: 90% missing(left) reconstructed (center) reference (right). 32x32 patches, 2pix shift, averaged. Images are taken from the Standard Test image dataset.
Lena 50% missing: reference (left) reconstructed (center) RMSE heatmap (right). 32x32 patches, 4pix shift, averaged. Images are taken from the Standard Test image dataset. The error map is generated by the author
看不见的数据
有趣的是,网络是否能够泛化,即在一幅图像上训练并重建另一幅图像。正如所料,当重建的图像与用于训练的图像相同时,重建会更好。下面是两个例子:网络训练狒狒和重建辣椒和训练辣椒和重建狒狒。
Peppers trained on baboon: 50% missing(left) reconstructed (center) reference (right). 32x32 patches, 4pix shift, averaged. Images are taken from the Standard Test image dataset.
Baboon trained on peppers: 50% missing(left) reconstructed (center) reference (right). 32x32 patches, 4pix shift, averaged. Images are taken from the Standard Test image dataset.
SELU 自动编码器(不是另一个 MNIST)上高斯混合模型的无监督学习
MNIST 是一个经典的机器学习数据集。想象以下场景:
Figure 1 - Alien who cannot understand human handwritten digits images
你是一个不了解人类文化的外星人,出于某种原因,你设法从手写数字数据集中获取了所有图像(MNIST)。因为你是一个外星人,你不知道人类数字的概念是什么,或者他们相应的符号看起来像什么,仅仅通过分析图像数据,你必须猜测有多少不同的符号(数字)(如果可能的话,生成新的表示,而不是仅仅复制你已经有的表示)。在机器学习中,这个问题可以被看作是:“如何在有限混合模型中选择正确数量的组件”
有限混合模型是一种聚类算法,其目的是在除了观察值之外没有其他信息可用时确定数据的内部结构。
Figure 2 — Number 5
对 MNIST 进行聚类的第一个问题是,每个 28×28 像素的图像意味着每个数字有 784 个维度。
大多数聚类方法都受到维数灾难的困扰。这样,为了执行无监督学习,降维方法是必要的。此外,如标题所示,高斯混合模型将用于聚类的学习(这意味着压缩空间的高斯行为越多,拟合就越好…)
Figure 3 — SELU auto encoder with regularization to enforce space constraints (promote structure?)
SELU 是一种新的神经网络激活函数,具有自归一化的特性。如果我们制作一个经典的自动编码器并将激活函数切换到 SELUs,压缩空间收敛到一个明确定义的均值和方差。也许,代表压缩空间的一些分布将是高斯分布的,并且可以被高斯混合模型很好地捕获。在编码层上使用 L2 正则化来约束其权重空间。由于高斯拟合将在这一层上进行,这一约束连同仅使用 6 个神经元的事实将产生信息瓶颈,这将有利于数据的结构化表示。
首先,让我们通过绘制 pairplot(一个 6 维的 pair plot)来检查压缩空间的分布:
Figure 4 — Compressed Space Pairplot
该空间是通过将 MNIST 数据集从 784 维(28×28 像素)的图像压缩到 6 维空间而产生的。看起来终究还是有些高斯行为!请记住,autoencoder 无法访问标签,它们被包含在 pairplot 中的唯一原因是为了让我们对可能的集群有一个参考。
但是现在,一个问题出现了:如何为高斯混合模型选择正确的分量数?虽然有许多成本函数可以用来选择适当数量的组件,如贝叶斯信息标准(BIC)或阿凯克信息标准(AIC),但有算法可以为我们做这种选择(而不必为每个组件数量执行不同的拟合)。其中之一是在本文中提出的有限混合模型的无监督学习
为了适应高斯混合模型,通过自动选择组件,我将使用一个实现(仍然是 WIP ),它是我根据那篇论文的见解(我基本上将我教授的 Matlab 代码转换为 Python 代码)制作的。) Github 包
这段代码是使用 sklearn 范式构建的,并且可以与该库一起使用,因为它实现了 ModelTransformer。
Figure 5 — Training the autoencoder on the MNIST dataset and fitting the Gaussian Mixture Model
可以使用图 5 中的代码将高斯混合模型拟合到压缩空间,同时使用最小消息长度标准选择适当数量的组件。
模型拟合后,可以从高斯混合模型中采样新图像(在压缩空间中),每个分量代表这些图像的不同概念(数字!).采样的压缩空间通过之前训练的 SELU 解码器,输出是从高斯混合模型采样的新生成的数字。
恭喜你,你已经成功地使用了你的外星人算法,现在可以复制和创造人类的手指了!
下面的每个图都是从不同的高斯分量中采样的,
您可以创建您的外星人 0:
Figure 6 — Alien generated 0’s by learning what human digit 0 is
你可以创建你的外星人 1:
Figure 7— Alien generated 1’s by learning what human digit 1 is
你可以创造你的外星人 2:
Figure 8— Alien generated 2’s by learning what human digit 2 is
…
你可以创造你的外星人 9:
Figure 9— Alien generated 9’s by learning what human digit 9 is
10 个集群是描述所有数字图像的最佳选择,这是有道理的。但是如果你仔细想想,就很容易理解为什么一个聚类算法会识别一些 9 和 4 之间的相似性,为这个事件创建一个特定的聚类。请记住,由于这是一个高斯混合,这个群集可以完全包含在 4 和 9 的群集内!
聚类算法居然找到了 21 个聚类!你可以在用于这种介质的 jupyter 笔记本中查看它们。
“聚类结构的验证是聚类分析中最困难和最令人沮丧的部分。如果不朝这个方向努力,聚类分析将仍然是一门黑色艺术,只有那些有经验和巨大勇气的真正信徒才能接触到。”贾恩和杜贝斯(贾恩和杜贝斯,1988 年)
顺便说一句,这是一个很酷的聚类算法在一个玩具示例中的可视化效果:
Figure 10 — Unsupervised Learning of Gaussian Mixture Models
用来生成这个介质的代码这里是这里是。
无监督机器学习
今天,我们就来看看一些无监督的机器学习吧!什么是无监督机器学习?
无监督学习是机器学习的一个分支,它从没有被标记、分类或归类的测试数据中学习。无监督学习不是对反馈做出反应,而是识别数据中的共性,并根据每个新数据中是否存在这种共性做出反应。备选方案包括监督学习和强化学习。
对我们来说,我们将举一个非常基本的例子,并试图理解这是如何工作的!我们将使用来自sk learn:Iris 数据集的内置数据集!
- 萼片长度,单位为厘米
- 萼片宽度,单位为厘米
- 花瓣长度(厘米)
- 花瓣宽度(厘米)
- 类别:
- 刚毛鸢尾
- 彩虹鸢尾
- 海滨鸢尾
The Flowers in the Dataset
如果你还没有弄明白,这个数据集正在描述花!所以今天,我将用这个数据集直观地向你们展示无监督机器学习是如何工作的!
算法:
我们将使用聚类算法:
聚类是一种无监督学习的方法,是许多领域使用的统计数据分析的常用技术。在数据科学中,我们可以使用聚类分析,通过查看我们应用聚类算法时数据点属于哪些组,从我们的数据中获得一些有价值的见解。
特别是,我们将使用 K-Means
Kmeans 是最流行的“聚类”算法之一。K-means 存储 k 个用于定义聚类的质心。如果一个点比任何其他质心更靠近特定聚类的质心,则该点被认为是在该聚类中。
K-Means 通过在(1)根据当前质心将数据点分配给聚类(2)根据当前数据点分配给聚类选择质心(作为聚类中心的点)之间交替来寻找最佳质心。
我将展示我们如何通过这个 K = 5 的算法。这是我们迭代 Kmeans 算法的第一步:
First iteration of Kmeans
现在我们有了这些集群,我们需要做几件事情:
- 将最近的每个聚类分配给其最近的点
- 通过平均所有聚类的位置来更新中心。
请注意我是如何绘制 2 个维度的,虽然有 4 个维度,但这给了我一个很好的视觉理解。
下面是更新每个中心的伪代码算法。
将初始聚类分配给它们最近的点
现在我们已经了解了我们的算法如何找到最近的点并将它们分配给聚类,让我们看看第一次迭代后的曲线图:
Assigning each cluster the closest points
在我们分配这些点之后,我们希望继续更新每个聚类,直到我们收敛于一个解决方案。我跳过了几次迭代,但是正如你所看到的,这些点收敛得非常快!
下面,我提供一些用于更新中心的伪代码!
Updated the centroids centers
这是一个非常直观的算法示例,下面我为大家提供完整的算法
完整的算法定义
κ均值聚类算法使用迭代优化来产生最终结果。算法输入是聚类数κ和数据集。数据集是每个数据点的特征集合。算法从对κ质心的初始估计开始,这些质心可以是随机生成的,也可以是从数据集中随机选择的。该算法然后在两个步骤之间迭代:
1。数据分配步骤:
每个质心定义一个聚类。在此步骤中,根据平方欧几里得距离,将每个数据点分配到其最近的质心。更正式地说,如果 ci 是集合 C 中质心的集合,那么每个数据点 x 被分配给一个基于
其中 dist ( )为标准( L 2)欧氏距离。设具有群集质心的每个的数据点分配集为 Si 。
2。质心更新步骤:
在这一步中,质心被重新计算。这是通过取分配给该质心簇的所有数据点的平均值来完成的。
该算法在步骤一和步骤二之间迭代,直到满足停止标准(即,没有数据点改变聚类,距离的总和最小化,或者达到某个最大迭代次数)。
这个算法保证收敛到一个结果。结果可能是局部最优(即,不一定是最好的可能结果),这意味着用随机化的起始质心来评估算法的多次运行可能会给出更好的结果。
有问题吗?!请在评论中告诉我!一如既往,在 twitter 上关注更多精彩内容@ElliottSaslow
PyTorch 启动和运行—迷你批处理、数据加载和模型构建
我现在已经尝试了几个深度学习框架——tensor flow、Keras、MxNet——但是,PyTorch 最近成了我的首选工具。这并不是因为我认为它在客观上比其他框架更好,而是因为它感觉更简洁、直观,更适合我的学习和实验风格。
这篇文章介绍了 PyTorch,重点是构建一个简单的神经网络(前馈网络)来分离(即分类)一些玩具数据中的两个类。我的目标是介绍 PyTorch 的一些基本构建模块,同时强调深度学习如何用于学习非线性函数。这篇文章的所有代码都是这个 github repo 。这是一个更实际的帖子,如果你正在寻找 PyTorch 内部工作的游览,我强烈推荐这个帖子。
为了跟进,确保您的机器上安装了 PyTorch 。请注意,我使用的是版本 0.3.1.post2,pytorch 的下一个版本(0.4)将引入一些突破性的变化(在这里阅读它们)。同样值得关注的是 PyTorch 1.0 的发布,它的目标是“生产就绪”——我对此非常兴奋!。
这篇文章的学习任务是二元分类问题——将点分类成半月形。对于深度学习模型来说,这是一个简单的任务,但它可以突出他们学习复杂的非线性函数的能力。
例如,如果我们使用逻辑回归对这些数据进行分类,看看会发生什么:
尽管对预测输出应用了 softmax 变换(将预测输出 logits 压缩到总和为 1),但逻辑回归的参数是线性的,因此很难了解非线性关系。我们可以使用一个更高级的 ML 模型来完成这个任务,比如随机森林,但是这样我们就没有借口去玩神经网络了!
在构建模型之前,我们将首先创建一个定制的数据预处理器和加载器。在这个例子中,转换器将简单地把 X 和 y 从 numpy 数组转换成 torch 张量。然后,我们将使用 dataloader 类来处理数据如何通过模型传递。注意,我们必须为这个类定义 len 和 getitem 方法。
在这种情况下,我们将设置一个小批量例程。这意味着在每个时期,模型将对数据的小子集(批次)进行训练,也就是说,它将根据与每个小批次相关联的损失来更新其权重。这通常是比每个时期在完整数据集上训练更好的方法。使用较小的批次也是可取的——尽管这是一个超参数,所以要做实验!
定义模型
使用 PyTorch 定义深度学习模型的标准方法是将网络封装在一个类中。我非常喜欢这种方法,因为它确保所有的层、数据和方法都可以从单个对象访问。该类的目的是定义网络的体系结构,并管理通过网络的数据转发。为了定义模型,我们需要继承 nn.Module。
典型的方法是将层定义为变量。在这种情况下,我们定义一个单层网络。nn。线性函数需要输入和输出大小。在第一层中,输入大小是输入数据中特征的数量,在我们设计的例子中是两个,输出特征是隐藏层中神经元的数量。
输出层的输入是前一层中神经元的数量,输出是数据中目标的数量——在本例中是两个。
然后我们定义一个类方法forward
来管理网络中的数据流。这里我们调用数据上的层,并在隐藏层上应用relu
激活(来自 torch.nn.functional)。最后,我们对输出应用 sigmoid 变换,将预测值压缩为 1。
运行模型
接下来我们需要定义模型如何学习。首先我们从类中实例化一个模型对象,我们称之为model
。接下来我们定义成本函数——在这种情况下是二进制交叉熵——更多信息请参见我之前关于日志损失的帖子。最后,我们定义我们的优化器,Adam
。优化器将优化我们模型的参数,因此,params
参数就是模型参数。
现在我们准备训练模型。我们将这样做 50 个时代。我已经对代码块进行了注释,以清楚地说明每个阶段发生了什么。我们设置了一个 for 循环来迭代数据(epoch ),每个 epoch 循环一次存储在ds
中的小批 X 和 y,这是我们之前定义的。在每个循环中,我们制作输入和目标火炬Variables
(注意,在 pytorch 的下一个版本中,这一步是不必要的,因为torch.tensors
和Variables
将被合并),然后指定向前和向后传递。
正向传递使用模型参数来预测输出。在第一遍中,预测将接近随机,因为参数是用随机数初始化的。在这一步中,我们使用实例化的成本函数计算与模型相关的损失。
在正向传递中,我们使用模型来预测给定 X 的 y,计算损失(和准确度)。所以我们只是通过模型传递数据。在反向传递中,我们通过模型反向传播损失,并且optimiser.step
根据学习率更新权重。
我们可以看到损失迅速减少(波动性可以用小批量来解释),这意味着我们的模型正在工作——太棒了!您还可以看到模型学习的非线性决策区域。
此外,检查模型学习的决策区域:
很明显,神经网络可以学习数据的非线性特性!
摘要
这篇文章的目的是展示如何开始使用 pytorch 定义神经网络。这里定义的模型非常简单,但目的是突出构建模块。我也没有运行测试循环,所以我们不知道模型的测试性能。在我的下一篇文章中,我将定义一个更复杂的 pytorch 模型,敬请关注!
感谢阅读。
原载于 2018 年 5 月 3 日conorsdatablog.wordpress.com。
提升您的数据科学简历—通过 ATS
这个系列将深入探讨如何制作一份有效的简历来获得电话。当我调查我的电子邮件列表时,人们对简历最关心的三件事是:
- 能够通过 ATS(申请人跟踪系统)
- 写出强有力的要点,而不是列出“工作职责”
- 如果你以前没有从事过数据科学工作,该如何定位自己
本文是涵盖上述主题的三部分系列文章的第一部分。今天我们将讨论如何通过 ATS。
如果你不熟悉 ATS,它代表申请人跟踪系统。如果你是直接在网站上申请一个职位,而该公司是中大型的,那么你的简历很可能会在以下时间之前通过 ATS:
1.你的简历在人力资源部的收件箱里
2.您会收到一封自动发送的电子邮件,内容如下:
很难代表所有的 ATS 系统,因为有许多 ATS 系统。看看 indeed.com 和 https://www.indeed.com/hire/ats-integration T2 集成的 ATS 系统的数量就知道了。
那么如何确保自己有很大的机会通过 ATS 呢?
1.让你的简历很有可能被 ATS阅读
2.丰富关键词,因为 ATS 寻找的是与工作相关的关键词
可由 ATS 读取:
最近出现了一种创造这些设计华丽的简历的运动。你会看到人们“表格化”他们的简历(即使用表格创建简历),包括徽标,或包括图表,这些图表是他们在某些技能方面的知识水平的主观图表。其中一个图表的示例如下所示:
ATS 不知道如何处理这些点,就像它不知道如何处理一个标志、你的图片或一张桌子一样;不要使用它们。要测试你的简历是否能被 ATS 很好地解析,试着复制文档并粘贴到 word 中。可读性强吗?还是有一堆其他的东西?你也可以试着把它存成纯文本,看看是什么样子。
作为一个喜欢数据的故事讲述者,我理解你想要展示你能够使用可视化来创建一份富有美感的简历的渴望。如果你是通过你的关系网申请,而不是在公司网站上,也许你会考虑这些风格。我不会假设我知道你的网络和他们在找什么。当然,你可以有多份简历,以备不时之需。
什么是可解析的:
我在数据世界里看到过一些博客帖子,说的是“没人想看那些无聊的旧简历。”然而,那些无聊的简历很可能在 ATS 中获得更高的分数,因为这些信息是可解析的。你可以创建一份美观、经典的简历。
一些旧的 ATS 系统只能解析。多克还是。docx 格式,其他人将能够解析。pdf,但不是所有的元素。如果你尝试使用上面提到的图片类型,pdf 将是可读的。
用关键词丰富你的简历:
这有两种形式:
1.确保这些职位描述中提到的技能在你的简历中用 JD 中的措辞明确地显示出来。
2.减少简历中“无关紧要”的内容。如果你的项目符号简洁,关键词和绒毛的比例会更高,会帮助你得分更高。
**对于第一点,**我在简历的顶部特别提到了我的技能:
我还会在简历的要点中特别提到这些项目和技能。如果一份工作描述需要逻辑回归,我会在简历中特别加入逻辑回归。如果 JD 只要求“回归”,我会在简历中把它列为回归。你明白了。
同样重要的是,在阅读职位描述时,不仅仅是技术技能很重要。公司正在寻找还能做到以下几点的员工:
- 与企业沟通
- 跨职能工作
- 在适当的层次上向接收信息的受众解释结果。
如果你申请的是一个管理职位,你将会在与管理者素质相关的关键词上得分。职位描述是了解他们想要什么样的品质的正确起点。我会在我即将推出的简历课程中突出具体的例子。
**对于第二点,**你要让你的要点尽可能简洁。通常以动词开头,提及动作和结果。这将帮助你获得尽可能高的“关键词:一切”的比率。
在我这个系列的下一篇文章中,我将分享如何为换工作做好准备的建议。那篇文章在这里。
如果你在寻找数据科学领域工作的帮助,或者需要简历方面的帮助,我想推荐你去找凯尔。我很了解凯尔,这是他的人生目标!。他帮助数据科学家获得数据科学职位。你可以在这里观看他谈论这个话题的视频。
原载于 2018 年 8 月 20 日【datamovesme.com】。
使用平衡数据升级您的图像分类器
预处理和分层如何对图像分类器的性能产生奇迹
FER
本文将带您了解数据管理技术,以完善图像分类器的机器学习模型,特别是面部情感识别。包含源代码的 R notebook 可以在 GitHub 链接这里找到
在这个项目中,“面部情感识别”数据集,来自 Kaggle 竞赛 表征学习中的挑战:面部表情识别挑战 被使用。该数据由 27000 幅训练图像(48×48 像素的面部几乎居中,使得所有面部在图像中的相等空间上延伸)和包含 9000 幅图像的测试集组成。这是一个分类任务,将每张图片分为七类(0 =愤怒,1 =厌恶,2 =恐惧,3 =快乐,4 =悲伤,5 =惊讶,6 =中性)。
我尝试了几种算法,包括最近邻、贝叶斯分类器、决策树和神经网络,为这项任务建立机器学习模型。但是,他们中没有一个人的回报率超过 30%。这让我想知道哪里出了问题,以及如何以不同的方式完成这项任务。最近我看到了一篇文章,作者是植物幼苗分类挑战赛的一位顶级选手,文章建议读者在对图像进行分类之前,先处理不平衡的分类问题。
在这篇文章中,我将解释如何使用干净平衡的数据和可视化,用决策树算法构建一个更好的图像分类器。
第一步:浏览数据
在可视化数据集中每个类的分布时,我们知道数据集是严重不平衡的。
如果类不是近似相等的,则数据集被描述为不平衡的。1
Distribution of classes
有超过 7000 张“快乐”的图片,而“厌恶”的图片不到 500 张。这将导致有偏差的分类器将大多数图像预测为多数类。
决策树和逻辑回归等流行算法偏向于数据集中的大多数类2
为了理解算法的复杂性,我应用了技术t-分布式随机邻居嵌入 (t-SNE),这被认为是可视化高维数据的最佳方法。
t-SNE 是一种用于相似性数据可视化的技术,能够保留数据的局部结构,同时也揭示一些重要的全局结构,例如多尺度的聚类3
t-SNE 通过在二维或三维地图中给出每个数据点的位置来可视化高维数据3
原始数据集的 tSNE 可视化向我们展示了数据的类结构。
t-SNE Original Dataset
第二步:分区
下一步是将训练数据集划分为训练集和验证集。验证集将用于调整,最终模型将使用测试数据集进行评估
第三步:创建基准分类器
该基准为评估和比较从示例中学习的算法提供了基础。[4]
如果我们在这个阶段创建一个基准分类器,性能将低于 27 %。
Benchmark Classifier Results
第四步:数据预处理
在可视化一个随机实例时,很明显图像是水平对齐的,并且还存在一些噪声作为背景。
预处理方法对从非受控环境中获取的图像进行归一化。5
因此,所有的图像首先旋转和裁剪,如下图所示。
Fig: Sample Image (i) Original (ii) Rotated (iii) Cropped
然后将实例居中并缩放到范围{0.8,1.2}。变换前后每个像素中的值分布可以绘制为。
Distribution of values in each pixel
步骤 5:特征提取
这是一个拥有 2304 个特征的高维数据集。为了降低维数,我们可以使用最广泛使用的技术 PCA。
主成分分析(PCA)是一种统计过程,它使用正交变换将一组可能相关的变量(每个变量取不同数值的实体)的观察值转换为一组称为主成分的线性不相关变量的值。6
PCA Output
从主成分分析总结中可以清楚地看出,前 25 个主成分拥有超过 80%的数据。
PCA Summary
主成分分析后的 tSNE 可视化明显更好,但大多数类别的映射有点接近,没有清晰地分类。
t-SNE PC 1–25
相同的预处理步骤和来自 PCA 的正交旋转被应用于验证数据和测试数据
第五步:分层
在这一步中,我们将处理训练数据中的不平衡类问题。
SMOTE 是一种过采样方法,其中少数类通过创建“合成”样本进行过采样,而不是通过替换进行过采样1
少数类的合成过采样(SMOTE)和多数类的随机欠采样的组合将给出良好平衡的训练数据,该训练数据然后可用于构建执行得更好的分类器。从下面新列车数据的 tSNE 可视化中可以明显看出这一点
t-SNE Balanced Data
第六步:分类
我们使用准备好的训练数据建立分类器。从模型的混淆矩阵中,我们可以看到整体的准确率有所提高,接近 60 %。
Confusion matrix — Classifier trained using the processed data
第七步:超参数调整
通过调整复杂性参数(cp ),我们可以减少相对误差,如下图所示
Variation in Relative error with complexity parameter
第八步:建造最终模型
最后一步是用调整后的参数(具有最小 Xval 相对误差的 cp 值)构建最终模型,并使用测试数据对其进行评估。
混淆矩阵统计表明,分类器的性能有了显著提高,总体准确率超过 90 %。灵敏度、特异性等其他性能指标也更好。
Confusion Matrix — Final model
Other Performance metrics comparison for various classes
结论
预处理、降维和平衡数据集显著提高了决策树分类器的性能,从 27%提高到 91%。使用 tSNE 可视化高维数据可以让您更好地了解类的分布,这对于预处理可用于构建更好的分类器的数据非常有帮助。
参考文献
1 N. Chawla,k .鲍耶,L. Hall 和 W. Kegelmeyer, SMOTE:合成少数过采样技术 (2002),《人工智能研究杂志》,第 16 期,第 321–357 页。
2客博,如何处理机器学习中的不平衡分类问题 (2017),【博客】Analytics Vidhya
3 L. van der Maaten 和 G.Hinton,使用 t-SNE 可视化数据 (2008),《机器学习研究杂志》,第 9 期,第 2579-2605 页。
[4] Z. ZHENG,分类器学习的基准 (1993),澳大利亚人工智能联合会议。世界科学,第 281-286 页。
5 M.G. Sumithra 和 P. Rajeswari,A Survey:Pre Processing techniques for face Expression Recognition(2015),《信息与通信工程应用国际期刊》第 1 卷:第 1 期:2015 年 1 月,第 47–51 页,第 1(1)卷,第 47–51 页。
6En.wikipedia.org,主成分分析 (2018),【在线】维基百科