何时实施正确的机器学习技术?
Photo by Caleb Jones on Unsplash
深度学习 VS 强化学习 VS 贝叶斯网络
1 导言
最初,人工智能技术旨在“计算机化”表征人类认知、知识、推理等的过程。人工智能的主要挑战是:确定一种可以计算机化的过程,然后将其计算机化并验证其相关性或效率。ML 研究专注于一个特定的过程,也就是学习。主要的挑战是给计算机最少的知识和数据来训练它们。此外,ML 需要人与计算机之间的互动,选择数据并验证机器的结果,并赋予它们更大的决策自主权。自 20 世纪 90 年代以来,大型数据集(尤其是带标签的数据)之间的协同作用,以及使用图形处理器单元的计算机能力的增强,更强大的技术应用出现了。技术和推理逻辑能够实现几个目标,例如降低语音识别中的单词错误率,处理图像识别(Krizhevsky,Sutskever 和 Hinton,2012 年),在围棋上击败人类冠军(Silver 等人,2016 年),以及将图像翻译成自然语言(Karpathy 和飞飞,2017 年)。
在项目管理的特定领域,作者仍然建立了项目管理因素(过程实施、团队管理等)之间的统计相关性。)和以往项目的业绩(Ko & Cheng,2007;黄,赖,&林,2000)。更一般地,我们假设 AI 和 ML 技术是 PM 的有价值的解决方案;它们有助于系统地利用项目数据,以便更清楚地了解因果关系的相关性或强度。其中一个主要问题是选择一个好的人工智能和最大似然技术,因为这个非常活跃的领域包括各种各样的统计方法,可以实现自动决策、预测建模、数据分类和数据聚类。这解释了为什么这篇文章关注于选择适合项目管理特性的人工智能和 ML 技术
2 人工智能技术综述
在项目管理中,一些最常用的人工智能技术是:双变量相关和多元回归测试(Mir & Pinnington,2014 年),数据挖掘(Ahiaga-Dagbui & Smith,2014 年),人工神经网络(Al-Tabtabai 等人,1997 年;高和程,2007;王&吉布森,2010;王等,2012),强化学习(毛,阿里扎德,梅纳切,&坎杜拉,2016;Tesauro,Jong,Das 和 Bennani,2006 年;叶&李,2018),遗传算法与多准则决策(Baron,Rochet,& Esteve,2006)和贝叶斯网络(Qazi et al .,2016)甚至贝叶斯网络与进化算法的杂交方法(Pitiot,Coudert,Geneste,& Baron,2010)。
这就是为什么为了解决我们的研究问题,我们探索了 PM 研究人员可能熟悉的三种建模技术:
人工神经网络(深度学习),因为我们现在已经在几个领域证明了其结果的准确性(王和吉布森,2010),
一种称为强化学习(RL)的 ML,因为它与我们对成熟度的概念有相似之处,
贝叶斯网络(BNs),因为这些动态工具结合了专家的知识和数据、因果推理和相关性。
2.1.监督学习技术:深度学习/人工神经网络(ANN)
最初,我们探索使用监督学习,更具体地说是人工神经网络(ANN)来预测基于项目管理成熟度的绩效。
如果你想了解更多关于监督学习算法的知识,我建议你看下一个帖子:
监督学习算法采用一组已知的输入数据(学习集)和已知的数据响应(学习集)
towardsdatascience.com](/supervised-learning-algorithms-explanaition-and-simple-code-4fbd1276f8aa)
神经网络用于提取人类无法感知的复杂模式,因为它们具有从复杂数据中获取趋势的非凡能力(Castillo & Melin,1999)。它们在商业应用中有广泛的用途(Wong 等人,2000 年),特别是评估风险管理实践(Kampianakis & Oehmen,2017 年)。在本节中,我们将介绍它们,然后解释如何在我们的研究工作中使用这项技术。
受人类大脑的启发,神经生理学家沃伦·麦卡洛克和逻辑学家沃尔特·皮茨提出了第一个由相连的功能节点组成的神经网络。通过反复修改连接的权重来训练网络(麦卡洛克和皮茨,1943)。后来,同样受到神经科学的启发,罗森布拉特(Rosenblatt,1958)开发了感知器,这是一种简单的学习功能。它将每个神经元的输出映射为 1 或 0。它将标准向量 x 、权重向量 w 作为输入,并评估它们的标量积是否超过阈值 u、,即f(x)= { 1 ifwx>u*;否则 0}* 。在一个简单的层神经网络中,这个函数不是很有用,因为二进制分类是有限的。然而,它在多层网络中更有用,称为多层感知器(MLP) (Rumelhart,Hinton,& Williams,1986)。MLP 于 20 世纪 80 年代开发,包括反向传播,即算法,分配好的权重,使神经网络在学习中具有较低的误差。最常用的反向传播方法之一是随机梯度下降(SGD),它通过使用偏导数的链规则来最小化错误率。SGD 传播所有导数或梯度,从顶部输出开始到底部,然后直接计算每个链接各自的权重。
自从 MLP 和 SGD 的实现,在解决神经网络方面没有相关的进展,直到 1997 年,另一种反向传播方法,称为长短期记忆 LSTM,被提出(Hochreiter & Schmidhuber,1997)。LSTM 缩短新币;它还引入了循环网络的概念来学习长程相关性。LSTM 的学习速度比 SGD 快,它解决了复杂的人工长时间滞后的任务。
神经网络应用于许多科学和工业部门。然后,我们需要界定对项目管理有用的神经网络的类型。此外,在我们的特殊情况下,神经网络必须具有:(1)作为输入,表征项目管理成熟度的标准,以及(2)作为输出,项目的运营绩效。根据惯例,创建因果模型可能需要使用几个层(见图 1)。然而,即使神经网络已经表现出很高的准确性,在 PM 中,我们也不能访问构建足够有效的网络所需的数据量。在这些标准下,我们没有足够的项目来训练网络。ANN 对数据的需求随着输入标准的数量呈指数增长(图 2)。尽管存在固有的局限性,人工神经网络仍被用于一些商业应用(Wong 等人,2000 年),例如评估风险管理实践(Kampianakis & Oehmen,2017 年)。
人工神经网络非常有趣,甚至令人着迷。在表 1 中,我们总结了他们与项目经理观点相关的优势和劣势。
我们要介绍的第二种技术是强化学习(RL)。
2.2.强化学习
强化学习算法是从马尔可夫决策过程(MDP)发展而来的。它们是在随机情况下进行决策的数学模型,其中*每个事件仅取决于前一个事件中达到的状态(马尔可夫特性)。*1957 年,贝尔曼(Bellman,1957)提出了一个沿 MDP 优化所有报酬总和的递归公式。解这个方程意味着找到最优策略。然而,贝尔曼方程是不可能解析求解的,因为它涉及到一个函数的最大化,而这个函数是不能求导的。这个问题让 RL 没有任何相关的进展,直到 1995 年 Watkins 提出了 Q-learning 算法(Watkins,1995)。该算法有助于解决探索-开发困境的挑战:计算机代理花费最优时间探索解决方案并获得奖励,不至于陷入局部最优,而是最大化总体奖励。
例如,在图 3 中,黄色方块代理尝试了几种途径来最大化长期累积奖励并达到其目标:带+1 奖励的绿色位置。在 RL 下,该代理人没有直接的指令来指示做出哪个决定或者哪个决定是其决定的直接结果。尽管如此,每个决定都要花费 -0.04 分。代理完成所有步骤(从起点,到绿色方块);然后,在决策过程的最后,它会获得累积的回报。然后,它会模拟几个路径,直到积累的回报最大化(萨顿,1988)。
非常令人惊讶的是,RL 是基于一种接近过程成熟度的学习概念。PMMMs 被设计成根据实施(或不实施)的最佳实践的数量和类型对组织进行分类和排名。类似地,在 RL 下,改进是基于某件事的成功重复,这类似于实施的最佳实践。RL 使用计算机代理,这些代理通过与模拟环境的交互来学习如何直接做出决策。RL 旨在最大化来自经验的回报信号;也就是说,通过创建最优策略(类似于项目管理建议)来最大化奖励效用函数(类似于项目绩效)。在 RL 下,计算机代理从不知道如何处理外部环境开始;随着它变得越来越成熟,它以更有效的方式完成它的任务,就像在成熟过程完美性量表中一样(表 2)。
此外,PM 数据库可以被定义为标准轴。图 4 显示了具有两个标准简化。这个想法是这样的:当代理人——旨在改进的系统——向每个方向移动时。它会从环境中得到回报。一个项目管理评估代理将探索状态(也就是说,它满足在每个轴上移动到下一个级别的标准),并且它将获得奖励点(项目操作性能的增加)。RL 模型在产生较好性能的同时,会根据通过不同级别的步骤产生相应的策略。使用 RL 需要创建一个模拟,包括几个项目管理标准和代理满足这些标准时“奖励”点的定义。
尽管 RL 很有价值,但在 PM 中也不容易实现。许多参数必须在之前定义。不幸的是,在我们的研究调查中,我们没有足够的数据来创建健壮的 RL 场景。表 3 显示了 RL 的优势和劣势。
ann 和 RL 的结合是深度强化学习 (DRL)的基础。在这种情况下,处于状态的计算机代理使用深度神经网络来学习策略。有了这个策略,代理在环境中采取行动,并从它达到的特定状态中获得奖励。奖励为神经网络提供信息,并产生更好的政策。这是在一篇名为*“用深度强化学习玩雅达利*”的论文中开发和应用的,在论文中,他们学习一台机器直接从像素开始玩雅达利游戏,经过训练,这台机器产生了优秀的结果(Mnih,Silver,& Riedmiller,2013)。作者学习一台计算机直接从像素玩雅达利游戏,经过训练后,机器产生了优秀的结果。RL 还被用来,在 2016 年下围棋,这是一个非常复杂的游戏,打败了世界冠军(Silver et al .,2016)。在这部作品之后,RL 受到了投资者更多的关注。自那以后,投资增加了,应用程序也在增长(Huddleston & Brown,2018)。
2.3 贝叶斯网络
bn 是基于图形的工具,对专家的知识和推理进行建模;BN 结合了数据和知识、知识状态和知识更新、相关性和因果性。如果你不熟悉 BN,我建议你看下一个帖子:
假设世界上存在一种非常罕见的疾病。你患这种疾病的几率只有千分之一。你想要…
towardsdatascience.com](/will-you-become-a-zombie-if-a-99-accuracy-test-result-positive-3da371f5134)
BNs 明确管理不确定性的能力使其适用于各种现实世界问题的大量应用,包括风险评估(Fenton & Neil,2013 年)、破产预测(Sun & Shenoy,2007 年)、产品可接受性(Arbelaez,Rakotondranaivo,& Bonjour,2016 年)、医疗诊断(康斯坦蒂努,Fenton,Marsh,& Radlinski,2016 年)、建筑设计过程诊断(Matthews & Philip,2012 年)等。
然而,我们可以注意到 BNs 适用于以下问题:(1)原因必须与结果相关联,例如,作为输入变量的项目管理成熟度标准,以及作为输出变量的特定项目的运营绩效,(2)数据量不大,并且随时间变化(其不确定性水平很高),(3)必须结合数据和专家知识。我们可以在表中总结 BNs 的优势和劣势
一旦 ANN、RL 和 BNs 被提出,我们就可以定义一个令人满意的 AI 和 ML 技术的以数据为中心的需求,以阐述项目管理过程成熟度和项目运营绩效之间的因果关系。
3 选择适当的技术
我们提出了三种人工智能和最大似然技术——ann、RL、BNs——可以用来解决我们的研究问题。在本节中,我们对它们进行定性比较,以选择最有价值的。我们将使用的标准是指数据,而不是知识。
3.1.数据质量评估框架
我们提出了三种技术,可以用来解决我们的研究问题。在本节中,我们将对它们进行定性比较,以选择最合适的一个。为此,我们选择了几个标准来评估如何根据上述技术处理数据。表 5 介绍了从《经合组织统计术语汇编》(经合组织统计术语汇编,2008 年)和(Nam,Wuillemin,Leray,Becker 和 Pourret,2008 年)中提取的概念。
3.2.与我们的调查相关的数据评估
表 6 通过上述标准列表显示了 ANN、RL 和 BNs 之间的比较。如果满足特性,每个 AI 和 LM 技术都有一个 + 符号,如果技术在特性中更好,则有一个 ++ 符号。同样— —如果没有达到该特征,请签名,如果该技术在该特征中有重要的弱点,请**—**签名。
**访问标准:**数据可访问性受限于我们的查询。最大的挑战之一是获得项目管理成熟度审计和项目运营绩效评估的结构化数据库。因此,需要大量数据输入(ANN,RL)的方法是不合适的。就可及性而言,BNs 似乎是最合适的。他们以处理混合数据(来自数据库和专家)的能力脱颖而出,处理数据的不确定性并易于阅读。
**上下文标准:**给定项目管理成熟度评估的上下文,数据的类型和数量是有限的。BNs 比其他技术更好地确保了结果的完整性。创建相关 BN 所需的数据量与研究问题的现实相一致。
表示标准: BNs 的图形表示是明确的、直观的,并且是项目管理专家可以理解的。这有助于模型的验证和使用。决策者对其工作可以理解的模型比像人工神经网络这样的黑箱模型更有信心。
内在标准:人工神经网络已经在准确性、客观性、独特性和一致性方面显示了它们的能力。只有当他们收到足够数量的数据时,才能达到这种熟练程度。BNs 在“客观性”上失败了:他们可能会有偏见。然而,BNs 可以从输入到输出传播数据演化,并在另一个方向反向传播信息,这一特性使它们对这一研究问题非常有用。
项目管理数据通常是稀缺和不完整的,从以前的数据做出好的决策是这项研究的总体挑战。虽然神经网络等经典机器学习基于可用数据给出答案,但贝叶斯网络包括相关的非样本或先验人类专业知识。通常,采访专家询问几个参数的影响是回忆所有信息的最好方式,这使得贝叶斯网络比其他技术更丰富。将这种专业知识与样本数据结合起来,可以产生一种强大的技术,能够生成一个可实现的、足够高性能的模型。
模型的图形表示结构总是比黑盒模型更好,如神经网络。更容易解释和交流这在与人合作时提供了优势,这些人不是模型技术方面的专家,而是业务领域的专家,即医疗保健,或者在这种情况下是项目管理。贝叶斯网络的另一个积极优势是它能够通过专家知识和原始数据来构建,即使其中一组知识是不完整的。可以从专家开始,然后用数据进行提炼,或者先用数据创建一个模型,然后用专家进行改进。
感谢阅读!!
如果你想继续阅读这样的故事,你可以在这里订阅!
如何在 RStudio 中导入 Excel 文件
在安装了 R 和 RStudio 之后,学习几种导入 Excel、CSV 或 SPSS(.sav)文件导入到 RStudio 中
Photo by Avi Waxman
介绍
正如我们在这篇关于如何安装 R 和 RStudio 的文章中所看到的,R 对于许多种计算任务和统计分析都很有用。然而,如果没有将数据集导入 R 的可能性,它就不会如此强大和有用。由于您最有可能将 R 与您自己的数据一起使用,因此能够将其导入 R 对于任何用户来说都是至关重要的。
在本文中,我介绍了两种导入 Excel 文件的不同方法;(I)通过文本编辑器,( ii)以更“用户友好”的方式。我还讨论了这两种方法的主要优缺点。请注意:
- 如何导入数据集往往取决于文件的格式(Excel、CSV、text、SPSS、Stata 等。).我在这里只关注 Excel 文件,因为它是数据集最常见的文件类型
- 还有其他几种导入 Excel 文件的方法(甚至可能是一些我不知道的方法),但是我给出了两种最简单而又健壮的方法来导入这样的文件
- 无论是什么类型的文件以及如何导入,关于数据集的结构都有一个黄金标准:列对应于变量,行对应于观察值(广义而言),每个值都必须有自己的单元格:
Structure of a dataset. Source: R for Data Science by Hadley Wickham & Garrett Grolemund
将 Excel 文件转换为 CSV 文件
在处理导入之前,首先要做的是将 Excel 文件的格式转换为 CSV 格式。 1 CSV 格式是处理数据集和编程语言的标准格式,因为与 Excel 相比,它是一种更强大的格式。
如果您的文件已经是 CSV 格式(扩展名为。csv),可以跳过这一节。如果文件不是 CSV 格式(例如扩展名是。xlsx)您可以通过以下步骤轻松地将其转换为 CSV:
- 打开您的 Excel 文件
- 点击文件>另存为
- 选择格式。战斗支援车
- 点击保存
检查您的文件是否以扩展名. csv 结束。如果是这样,您的文件现在就可以导入了。但是首先,让我介绍一个将数据集导入工作目录 RStudio 时的重要概念。
r 工作目录
尽管编程语言可能非常强大,但它经常需要我们的帮助,导入数据集也不例外。事实上,在导入数据之前,您必须告诉 RStudio 您的文件位于何处(因此让 RStudio 知道在哪个文件夹中查找您的数据集)。不过在这之前,我先介绍一下工作目录。工作目录是 RStudio 当前工作的位置(在您的计算机中)(事实上,RStudio 并不在您的整个计算机上工作;它在你电脑的一个文件夹里工作)。关于这个工作目录,我们需要两个函数:
getwd()
(wd
代表工作目录)setwd()
获取工作目录
在大多数情况下,当您打开 RStudio 时,工作目录(即它当前工作的位置)与数据集所在的位置不同。要知道 RStudio 当前使用的工作目录是什么,运行getwd()
。在 MacOS 上,这个函数很可能会渲染一个位置,比如"/Users/yourname/"
,而在 Windows 上,它很可能会渲染"c:/Documents/"
。如果您的工作目录不同,不要担心,最重要的是正确设置工作目录(因此您的文件所在的位置)而不是它现在的位置。
设置工作目录
如前所述,数据集很可能位于与工作目录不同的位置。如果您不采取任何措施,RStudio 将永远无法导入您的文件,因为它没有在正确的文件夹中查找(您将在控制台中遇到以下错误:无法打开文件“data.csv”:没有这样的文件或目录)。现在,为了指定文件的正确位置(也就是告诉 RStudio 应该在哪个文件夹中查找数据集),您有三种选择:
- 用户友好的方法
- 通过控制台
- 通过文本编辑器(见下文,为什么这是我的首选)
用户友好的方法
要设置正确的文件夹,以便将工作目录设置为文件所在的文件夹,请按照下列步骤操作:
- 在 RStudio 的右下方窗格中,单击“文件”选项卡
- 点击房屋图标旁边的“主页”
- 转到数据集所在的文件夹
- 点击“更多”
- 点击“设为工作目录”
Set working directory in RStudio (user-friendly method)
或者,您也可以通过点击会话>设置工作目录>选择目录…来设置工作目录
Set working directory in RStudio (user-friendly method)
正如您在控制台中所看到的,这两种方法中的任何一种都将实际执行代码setwd()
,其路径指向您指定的文件夹。所以通过点击按钮,你实际上要求 RStudio 为你写一行代码。这种方法的优点是您不需要记住代码,并且不会在文件夹的路径名中出错。缺点是,如果您离开 RStudio 并在稍后再次打开它,您将不得不再次指定工作目录,因为 RStudio 不会通过按钮保存您的操作。
通过控制台
您可以通过在控制台中直接运行setwd(path/to/folder)
来指定工作目录,其中path/to/folder
是包含数据集的文件夹的路径。但是,重新打开 RStudio 时,您需要再次运行该命令。
通过文本编辑器
这种方法实际上是上述两种方法的结合:
- 按照与用户友好方法(通过按钮)完全相同的步骤设置工作目录
- 复制在控制台中执行的代码,并将其粘贴到文本编辑器(即您的脚本)中
我推荐这种方法有几个原因。首先,你不需要记住setwd()
功能。第二,你不会在你的文件夹路径中输入错误(如果文件夹中有文件夹,路径有时会很长)。第三,当保存你的脚本时(我假设你这样做了,否则你会丢失你所有的工作),你也保存了你刚才通过按钮所做的动作。因此,当您将来重新打开您的脚本时,无论当前目录是什么,通过执行您的脚本(现在包括用于设置工作目录的代码行),您将同时指定您为此项目选择的工作目录。
导入数据集
现在,您已经将 Excel 文件转换为 CSV 文件,并且通过设置工作目录指定了包含数据的文件夹,现在就可以实际导入数据集了。提醒有两种方法可以导入文件:
- 以用户友好的方式
- 通过文本编辑器(也见下面为什么它是我的首选)
无论您选择哪种方法,最好先在“文本编辑”( Mac)或“记事本”( Windows)中打开文件,以便查看原始数据。如果您在 Excel 中打开文件,您会看到数据已经格式化,因此会错过导入所需的一些重要信息。下面是一个原始数据的例子:
Example of raw data
为了正确导入数据集,我们需要注意以下几点:
- 变量名是否存在?
- 值是怎么分开的?逗号,分号,空格,制表符?
- 十进制是点还是逗号?
- 如何指定缺失值?空单元格,NA,null,O,other?
用户友好的方式
如下所示,只需点击文件>导入数据集…
Import dataset in RStudio
将会打开一个如下所示的窗口:
Import window in RStudio
从这个窗口,您可以预览您的数据,更重要的是,检查您的数据是否正确导入。如果您的数据已经正确导入,您可以点击“导入”。如果不是这样,您可以根据查看原始数据时收集的信息,更改窗口底部(数据预览下方)的导入选项。下面是您最可能使用的导入选项:
- 名称:设置数据集的名称(默认为文件的名称)。避免使用特殊字符和长名称(因为您将不得不多次键入数据集的名称)。我个人用一个通用的名字给我的数据集重新命名,比如“dat”,其他人用“df”(data frame)、“data”,甚至“my_data”。例如,如果您使用网球比赛的数据,您可以使用更明确的名称,如“tennis_data”。但是,为数据集使用特定名称的主要缺点是,例如,如果您想要在分析其他数据集上的网球数据时重复使用您创建的代码,您将需要通过用新数据集的名称替换所有出现的“tennis_data”来编辑您的代码
- 跳过:指定要跳过的顶部行数(默认值为 0)。大多数时候,0 就可以了。但是,如果文件顶部包含一些空白行(或您想要忽略的信息),请设置要跳过的行数
- 第一行作为名称:指定变量名称是否存在(默认情况下是变量名称存在)
- 分隔符:分隔值的字符。从上面的原始数据中,您可以看到分隔符是逗号(“,”)。如果您的值由“;”分隔,请将其更改为分号
- NA:如何指定缺失值(默认为空单元格)。从上面的原始数据中,您可以看到缺少的值只是空的单元格,因此将 NA 保留为默认值或将其更改为“empty”。如果原始数据中的缺失值编码为“NA”或“0”,请更改此选项(提示:不要将自己的缺失值编码为“0”,否则您将无法区分真正的零值和缺失值)
更改与您的数据对应的导入选项后,单击“导入”。现在,您应该可以在一个新窗口中看到您的数据集,并从那里开始分析您的数据。
这种用户友好的方法的优点是您不需要记住代码(完整的代码见下一节)。但是,主要缺点是您的导入选项不会被保存以备将来使用,因此您需要在每次打开 RStudio 时手动导入数据集。
通过文本编辑器
与设置工作目录类似,我也建议使用文本编辑器而不是用户友好的方法,原因很简单,使用文本编辑器时可以保存导入选项(而使用用户友好的方法时不行)。将导入选项保存在脚本中(多亏了一行代码)允许您以完全相同的方式快速导入数据集,而不必在每次导入数据集时重复所有必要的步骤。导入 CSV 文件的命令是read.csv()
(或read.csv2()
,它是等效的,但具有其他默认导入选项)。下面是一个与用户友好方法中的文件相同的示例:
dat <- read.csv(
file = "data.csv",
header = TRUE,
sep = ",",
dec = ".",
stringsAsFactors = TRUE
)
dat <-
:r studio 中数据集的名称。这意味着在导入之后,我将需要通过调用dat
来引用数据集file =
:工作目录中文件的名称。不要忘记在名称、扩展名周围加上" "。csv 结尾,并且 RStudio 区分大小写("Data.csv"
将给出错误),在“”内部区分空格("data .csv"
也将抛出错误)。在我们的例子中,文件被命名为“data.csv ”,所以file = "data.csv"
header =
:变量名存在吗?默认为TRUE
,如果您的数据集中不是这种情况,请将其更改为FALSE
(TRUE
和FALSE
始终是大写字母,true
将不起作用!)sep =
:分离器。相当于用户友好方法中的分隔符。不要忘记" "。在我们的数据集中,值的分隔符是逗号,所以sep = ","
dec =
:十进制。不要忘记" "。在我们的数据集中,数值的小数是一个点,所以dec = "."
stringsAsFactors =
:字符向量要不要转换成因子?默认选项曾经是TRUE
,但是从 R 版本 4.0.0 开始默认为FALSE
。如果你所有的角色向量实际上都是定性变量(所以因子在 R 中),设置为TRUE
- 我没有写缺失值在我的数据集中被编码为空单元,因为这是默认的
- 最后但同样重要的是,不要忘记参数是用逗号分隔的
存在其他参数,运行?read.csv
查看所有参数。
导入后,您可以通过运行View(dat)
来检查您的数据是否被正确导入,其中dat
是您为数据选择的名称。一个类似于用户友好方法的窗口将显示您的数据。或者,您也可以运行head(dat)
来查看前 6 行,并检查它是否对应于您的 Excel 文件。如果有些地方不正确,请编辑导入选项并再次检查。如果数据集已正确导入,现在就可以开始分析数据了。如果您想了解如何操作,请参阅 R 上的其他文章。
通过文本编辑器中的代码直接导入数据集的优点是,您的导入选项将被保存以供将来使用,从而避免您在每次打开脚本时手动导入它。然而,你需要记住函数read.csv()
(不是参数,因为你可以在帮助文档中找到它们)。
导入 SPSS(。sav)文件
这里只详细介绍 Excel 文件。但是,SPSS 文件(。sav)也可以通过使用以下命令在 R 中读取:
library(foreign)
dat <- read.spss(
file = "filename.sav",
use.value.labels = TRUE,
to.data.frame = TRUE
)
read.spss()
函数输出一个检索所有特性的数据表。sav 文件,包括不同级别分类变量的名称和变量的特征。如果您需要关于该命令的更多信息,请参阅帮助文档(library(foreign)
然后是?read.spss
)。
感谢阅读。我希望本文能帮助您在 RStudio 中导入 Excel 文件。如果数据集被正确导入,学习如何操作它。
和往常一样,如果您有与本文主题相关的问题或建议,请将其添加为评论,以便其他读者可以从讨论中受益。
- 我知道可以直接将一个 Excel 导入到 R 中,而不用将其转换成 CSV 文件,例如用
{readxl}
包中的read_excel()
函数。然而,CSV 格式是标准格式,更重要的是,导入 CSV 不需要安装和加载软件包(这对初学者来说有时会很困惑)。 ↩︎
相关文章:
- 安装和加载 R 包的有效方法
- 我的数据符合正态分布吗?关于最广泛使用的分布以及如何检验 R 中的正态性的注释
- R 中的 Fisher 精确检验:小样本的独立性检验
- R 中独立性的卡方检验
- 如何在简历中创建时间线
原载于 2019 年 12 月 18 日 https://statsandr.com**T21。
如何用正则化方法改进神经网络
了解如何应用 L2 正则化和辍学的神经网络
Photo by Jessica Ruscello on Unsplash
您刚刚构建了您的神经网络,并注意到它在训练集上表现得非常好,但在测试集上却没有那么好。
这是过度拟合的标志。你的神经网络有很高的方差,它不能很好地概括未经训练的数据。
解决过度拟合有两种常见方法:
- 获取更多数据
- 使用正则化
获取更多的数据有时是不可能的,有时又非常昂贵。因此,正则化是减少过拟合从而提高模型性能的常用方法。
在这篇文章中, L2 正则化和退出将被介绍为神经网络的正则化方法。然后,我们将对每种方法进行编码,看看它是如何影响网络性能的!
我们走吧!
对于机器学习、深度学习和人工智能的实践视频教程,请查看我的 YouTube 频道。
L2 正则化
回想一下,在深度学习中,我们希望最小化以下成本函数:
Cost function
其中 L 可以是任意损失函数(如交叉熵损失函数)。现在,对于 L2 正则化我们增加了一个惩罚大权重的组件。
因此,等式变为:
L2 regularization
其中λ是正则化参数。注意增加了 Frobenius 范数,用下标 F 表示。这实际上相当于矩阵的平方范数。
现在,λ是一个可以调整的参数。如果λ的值较大,则较大的权重值将受到更多的惩罚。类似地,对于较小的λ值,正则化效果较小。
这是有意义的,因为成本函数必须最小化。通过添加权重矩阵的平方范数并将其乘以正则化参数,大的权重将被降低,以便最小化成本函数。
为什么正规化有效?
如前所述,添加正则化分量将使权重矩阵的值下降。这将有效地去相关神经网络。
回想一下,我们为激活函数提供了以下加权和:
Weighted sum
通过减少权重矩阵中的值, z 也将减少,这反过来减少了激活函数的效果。因此,一个不太复杂的函数将适合数据,有效地减少过度拟合。
辍学正规化
退出包括检查神经网络中的所有层,并设置保留或不保留某个节点的概率。
当然,输入层和输出层保持不变。
保持每个节点的概率设置为随机。您只需决定阈值:一个决定节点是否被保留的值。
例如,如果您将阈值设置为 0.7,则有 30%的概率会从网络中删除一个节点。
因此,这将产生一个更小、更简单的神经网络,如下所示。
Left: neural network before dropout. Right: neural network after dropout.
为什么退学有效?
从一个神经网络中随机移除节点来调整它可能看起来很疯狂。然而,这是一种广泛使用的方法,并且被证明可以极大地提高神经网络的性能。那么,为什么它的效果这么好呢?
丢失意味着神经网络不能依赖任何输入节点,因为每个节点都有被删除的随机概率。因此,神经网络不愿意给予某些特征高的权重,因为它们可能会消失。
因此,权重分布在所有要素上,使它们变得更小。这有效地缩小了模型并使其正规化。
正规化的实施
现在,让我们对一些样本数据实施丢失和 L2 正则化,以查看它如何影响神经网络的性能。
参考完整笔记本这里。
创建样本数据集
我们首先创建一个样本数据集。在导入必要的库之后,我们运行下面这段代码:
我们应该得到:
太好了!这是一个简单的随机数据集,有两个类,我们现在将尝试编写一个神经网络,它将对每个数据进行分类,并生成一个决策边界。
非正则化模型
现在,我们定义一个模型模板来适应正则化:
花时间阅读代码并理解它的作用。请注意对 L2 正则化有用的 lambd 变量。此外, keep_prob 变量将用于 dropout。
现在,让我们运行一个没有正则化的神经网络,作为基准性能。
我们得到了:
Baseline performance of a non-regularized model
还不错!让我们画出决策边界:
您应该会看到:
Decision boundary without regularization
在上面的图中,您会注意到模型过度拟合了数据的某些部分。我们将以此为基准,看看正则化如何提高模型的性能。
L2 正则化
在使用 L2 正则化之前,我们需要定义一个函数来计算适应正则化的成本:
最后,我们用正则化定义反向传播:
太好了!现在,我们可以使用我们的模型模板与 L2 正则化!将λ的值设置为 0.7,我们得到:
Decision boundary with L2 regularization
厉害!我们提高了测试精度,您会注意到模型不再过度拟合数据了!
现在,让我们看看辍学者是否能做得更好。
拒绝传统社会的人
首先,我们需要重新定义正向传播,因为我们需要随机消除某些节点的影响:
当然,我们现在必须定义辍学的反向传播:
太好了!让我们看看阈值为 0.8 时,模型在辍学情况下的表现如何:
Decision boundary with dropout
太神奇了!我们实现了更高的精度和下降率!
干得好!您了解了正则化如何改进神经网络,并且实现了 L2 正则化和剔除来改进分类模型!
在以后的文章中,我将展示如何通过选择正确的优化算法来进一步改进神经网络。
敬请关注,继续学习!
使用 Scikit Optimize 调整 XGBoost 超参数
XGBoost 不再是少数人能够理解和使用的外来模型。它已经成为许多场景中的比较基准。自从首次提出该算法的论文发表以来的三年半时间里,人们对 XGBoost 的兴趣也急剧增加。谷歌趋势表明,人们对 XGBoost 的兴趣目前正处于历史最高水平。
Relative popularity of XGBoost in the since April 2016
挑战是什么?
现在,虽然 XGBoost 在过去的几年里越来越受欢迎,但是一些挑战使得它有点难以使用。最坚定的一个是使用什么超参数值——估计器的数量应该是多少,应该允许的最大深度是多少,等等。XGBoost 之所以比线性/逻辑回归模型或决策树更难管理,是因为它比许多其他模型有更多的超参数。简单地手动调整它们需要大量的时间和耐心。你仍然不能确定你是否在朝着正确的方向前进。
有解决办法吗?
你可能会想,如果我们能够以某种方式自动化这种无聊又累人的调整超参数的仪式,我们的生活将会容易得多。如果你对此感到疑惑,那么请放心,因为,是的,我们有办法提高 XGBoost 模型的性能,而不需要做所有的手工劳动,只需让计算机为我们解决问题。
选择超参数的正确值的过程称为超参数调整,有预建的库可以为我们完成这项工作。所以我们需要做的就是写一些代码,给出一些输入值,让计算机算出最佳值。
我们是如何做到的?
在我们进入代码和弄脏我们的手之前,让我们在这里停留一分钟并且问我们自己——如果我们是一台计算机并且被给予同样的问题,我们将如何做它?
让我们好好想想。我假设在这种情况下我们只有两个超参数值,因为这样更容易可视化。我要做的第一件事是用两个超参数的任意随机值建立一个模型,看看我的模型表现如何。
我要做的下一件事是增加一个参数,保持一个参数不变,看看我的模型性能如何响应其中一个参数的增加。如果我的模型性能提高,这意味着我正在向正确的方向移动我的超参数。如果没有,我现在知道我需要降低这个超参数的值。在下一次迭代中,我将更改我的另一个超参数的值,并查看我的模型如何对该更改做出反应。我将这样做几次,一旦我看到我的模型对这些变化做出足够多的反应,我将开始同时改变两者。
因此,我们现在所做的是利用之前模型的输出,并相应地改变超参数的值。在下面的部分中,我们将使用一个专门开发的包来帮助我们做到这一点。
想法
在本教程中,我们将使用 scikit-optimize 包来帮助我们为模型选择合适的值。现在,为了能够使用这些算法,我们需要为它们定义一个搜索区域,比如搜索空间。想象一下,你需要寻找一个地区的最高点,一个朋友愿意为你做这项工作。为了让你的朋友能够有效地做到这一点,你必须告诉他你想让他搜索的区域。你必须定义一个你希望他花时间搜索的区域/空间。
skopt 和其他此类算法也是如此。在这种情况下,算法是您的朋友,您需要它来搜索最佳的超参数值集。为了使算法成功,你需要定义一个搜索区域。
这些是我们将要遵循的步骤
- 使用 sklearn 的
make_classification
功能创建虚拟数据集。我们将使用执行二元分类,因此我们的标签将包含 0 和 1 - 定义一个搜索空间/区域,您要在该空间/区域上建模以搜索最佳超参数值
- 定义一个用不同超参数值拟合模型的函数,并测量模型性能
- 定义您想要训练模型的次数
- 使用 skopt 的
gp_minimize
算法搜索我们的空间并给出结果
仅此而已。这就是你需要做的。现在让我们看一下代码。
代码
您将需要 skopt 包,您可以通过在命令行输入pip install scikit-optimize
来安装它
注意:代码框下面提供了所有代码片段的链接。如果有任何代码看起来不完整,点击 GitHub 链接找到完整的代码
- 进口
https://gist . github . com/vecto saurus/6a E1 b 455 c 7527 BF 25954 e 834 b 8b 49 a 89
- 创建数据集
https://gist . github . com/vecto saurus/a 53683 c 4d 6 FDE 396 ce 43 b 92 c 045 a5a 00
- 定义搜索空间。这里,我们通过提供每个超参数可以取的最小值和最大值来定义搜索空间。
https://gist . github . com/vecto saurus/DC 922 b 0 b 8d 9 db 080 BD 75b 736 c 2e 09 b 0 b
- 函数来拟合模型并返回模型的性能
https://gist . github . com/vecto saurus/73d 257 CB 0 be 61d 88 ab 788 bb 70 f 22 b 857
这里,在 return 语句中,我返回1 - test_score
而不是test_score
。这是因为 skopt 的gp_minimize
致力于寻找最小值。我们的目标是找到我们能得到的最大值f1_score
。所以通过让gp_minimize
最小化1 - test_score
,我们就最大化了test_score
- 运行算法
https://gist . github . com/vecto saurus/f 686 bfc 43 fdec 8 f 378d 0 eeae 074 E5 Fe 1
结果
https://gist.github.com/vectosaurus/2f6ff57ac4cb4e728d32c65a155ceb78
XGBoost 模型在第一次迭代中以test_score
开始,现在是0.762
,但是最终 F1 分数是0.837
,增加了超过 7%。
结论
虽然自动超调在许多情况下有助于提高模型性能,但仍有必要密切关注数据。在许多情况下,探索数据和工程信息变量会更加有效。
此外,重要的是要注意,我们为模型选择的搜索空间是有意义的。简单地声明一个非常大的空间会影响这些算法所能执行的搜索的质量。
超参数调整非常有效,但我们需要确保我们为它提供了足够公平的搜索空间和足够合理的迭代次数。自动化的超参数调整减少了人力,但并没有降低程序的复杂性。
如何在 Tensorflow 2.0 中改进训练您的深度神经网络
Taken from http://www.merzpraxis.de/index.php/2016/06/13/der-suchende/
当涉及到建立和训练深度神经网络时,你需要设置大量的超参数。正确设置这些参数对你的网的成功有巨大的影响,也对你花在加热空气上的时间,也就是训练你的模型有巨大的影响。其中一个你必须选择的参数是所谓的学习率(也称为更新率或步长)。在很长一段时间里,选择这种权利更像是试错法或黑色艺术。然而,有一种聪明而简单的技术可以找到一个合适的学习率,我猜这种技术通过在 fastai 中的使用变得非常流行。在本文中,我将向您简要介绍这种方法,并向您展示 Tensorflow 2 中的一个实现,它也可以通过我的回购获得。所以让我们开始吧。
问题是
学习率 l 是一个单一的浮点数,它决定了你向负梯度方向移动多远,以更新和优化你的网络。正如在介绍中已经说过的,正确地选择它极大地影响了你花在训练你的模型上的时间,直到你得到好的结果并停止咒骂。为什么会这样呢?如果你选择的太小,你的模型将需要很长时间才能达到最佳状态,因为你只需要一小步一小步的更新。如果你选择的太大,你的模型将会反弹,跳过最优值,最终无法达到最优值。
解决方案
莱斯利·n·史密斯提出了一个非常聪明和简单的方法,在短时间内系统地找到一个让你非常快乐的学习率。前提是你有一个模型,并且你有一个被分成 n 批的训练集。
- 你将你的学习初始化为一个小值 l = l_min ,例如 l_min =0.00001
- 你用一批训练集来更新你的模型
- 计算损失并记录损失和使用的学习率
- 你成倍地提高了当前的学习速度
- 如果学习率已经达到预定义的最大值 l_max 或者如果损失增加太多,则返回步骤 2 或者停止搜索
- 最佳学习速率是导致两次连续试验之间损失最大程度减少的速率。选择最佳学习率的另一种方法是找到导致最小损失的学习率,并将其降低一到两个数量级。
为了让这一切更加直观,我给你看了在对数标度上绘制的学习率的平滑损失。红线标记计算出的最佳学习率。
实施
由于我目前正在学习 Tensorflow 2 (TF2),我认为通过使用新的 TF2 概念实现学习率查找器来练习它是一个好主意。除此之外,我(希望你也是)现在有了所有我(或你)想要追求的即将到来的 TF2 项目的 LR Finder。在这里发布的代码中,我用步骤 1–6标记了相应的行,以引用上面的清单。这里显示的代码经过了一点简化和重构,以增加在介质上的可读性。你可以在我的 Github repo 上找到完整的代码以及一个小例子和绘图功能。
**from** dataclasses **import** dataclass, field
**from** typing **import** List**import** numpy as np
**import** tensorflow **as** tf
**from** tqdm **import** tqdm**def** lr_finder(
mdl: tf.keras.Model,
opt: tf.keras.optimizers.Optimizer,
lossf: tf.keras.losses.Loss,
dataset,
learn_rates: LrGenerator,
losses: SmoothedLoss,
) -> Lr:
# Step 1 & 4 init and decrease, Step 2 take batch
**for** lr, (source, target) **in** zip(learn_rates(), dataset):
tf.keras.backend.set_value(optimizer.lr, lr)
# Step 2 model update, Step 3 Calculate loss
loss = step(mdl, opt, lossf, source, target).numpy()
# Step 3 record losses
losses.update(loss)
# Step 5 check if done
**if** losses.no_progress:
**break****return** Lr(learn_rates, losses)**@tf.function**
**def** step(mld, opt, lossf, src: Tensor, trg: Tensor) -> Tensor:
**with** tf.GradientTape() **as** tape:
# Step 3 Compute loss
loss = lossf(trg, mld(src))
grads = tape.gradient(loss, mld.trainable_weights)
# Step 2 Update the model
opt.apply_gradients(zip(grads, mld.trainable_weights))
**return** loss**@dataclass**
**class** SmoothedLoss:
sm: float = 1
_losses:List[float]=field(init=False, default_factory=list)
_sm: List[float] = field(init=False, default_factory=list)
_avg: float = field(init=False, default=0)
_best_loss: float = field(init=False, default=None)**def** update(self, loss):
# Step 3 record losses
self._avg = self.sm * self._avg_loss + (1 - self.sm) * loss
smooth_loss = self._avg / (
1 - self.sm ** (len(self._sm) + 1)
)
self._best_loss = (
loss
**if** len(self._losses) == 0 or loss < self._best_loss
**else** self._best_loss
)self._losses.append(loss)
self._sm.append(smooth_loss)**@property**
**def** no_progress(self):
**return** self._sm[-1] > 4 * self._best_loss**@dataclass**
**class** LrGenerator:
min_lr: float
max_lr: float
n_steps: int
_lrs: List[float] = field(init=False)**def** __call__(self):
self._lrs = []
frac = self.max_lr / self.min_lr
**for** step **in** tqdm(range(self.n_steps)):
# Step 1 and 4 update lr and init
lr = self.min_lr*frac**(step/(self.n_steps - 1))
# Step 3 record learning rates
self._lrs.append(lr)
**yield** lr**@dataclass
class** Lr:
lr: LrGenerator
loss: SmoothedLoss
_opt_idx: int = field(init=False, default=None)**@property
def** opt_idx(self):
# Step 6 get best learning rate
cut = 3
**if** self._opt_idx **is** None:
sls = np.array(self.loss._smoothed_losses)
self._opt_idx = np.argmin(sls[1 + cut :] - sls[cut:-1])
**return** self._opt_idx + 1 + cut**@property
def** lr_opt(self):
# Step 6 get best learning rate
**return** self.lr._lrs[self.opt_idx]
结束了
感谢您关注我的小文章和我的第一个 TensorFlow 2 实现。如有任何问题、意见或建议,请随时联系我。
如何改进您的数据科学战略
这不仅仅是雇佣一名数据科学家和支付 Tableau 许可证的费用
Photo by Tabea Damm on Unsplash
创建有效的数据策略并不像雇佣一些数据科学家和数据工程师以及购买 tableau 许可那么简单。也不仅仅是用数据做决策。
创建有效的数据战略就是要创建一个生态系统,在这个生态系统中,获取正确的数据、指标和资源非常容易。这是关于发展一种文化,学会质疑数据,在做出最终结论之前,从多个角度看待一个商业问题。
我们的数据咨询团队与从价值数十亿美元的科技公司到医疗保健公司以及介于两者之间的几乎所有类型的公司都有过合作。我们已经看到好的、坏的和丑陋的数据被用于战略。我们想分享一些简单的变化,这些变化有助于改善贵公司的数据处理方法。
在集中和分散实践之间找到平衡
标准和过度集权不可避免地会拖团队的后腿。对表、数据库和模式进行小的更改可能会被迫经历一些过于复杂的过程,从而影响团队的工作效率。
另一方面,集中化可以更容易地实施新的战略变化,而不必去每个团队,然后强迫他们采取新的流程。
在我们看来,公司可以获得的最大优势之一是开发工具和策略,帮助在集中和分散之间找到一个合适的中间点。这通常包括创建标准来简化开发决策,同时提高管理每个数据团队需要执行的常见任务(如文档和数据可视化)的能力。同时分散通常特定于部门和领域的决策。
这里有一些例子,可以为非标准化的主题提供标准化的工具和过程。
为相似的度量创建 UDF 和库
在包括医疗保健、银行和市场营销在内的几个行业工作后,你会意识到许多团队都在使用相同的指标。
这可能是跨行业的,或者至少是跨内部团队的。问题是每个团队将不可避免地创建不同的方法来计算完全相同的数字。
这可能会导致重复的工作、代码和高管做出相互冲突的决策,因为顶线指标会发生变化。
您可以创建使用相同字段来计算正确指标的集中式库,而不是依赖每个团队来负责创建计算各种指标的过程。这使流程标准化,同时仍为最终用户提供足够的灵活性,使他们能够根据自己的特定需求开发报告。
这只有在指标使用一致的情况下才有效。例如,在医疗保健行业,每个患者每月的成本(PMPM)、再入院率或床位周转率等指标都是一致使用的。这些有时由 EMR(如 EPIC)计算,但仍可能由分析师针对更具体的情况再次计算。它也可能由外部顾问计算。
创建能够轻松完成这项工作的函数或库有助于提高一致性并节省时间。相反,让每个团队开发他们自己的方法,你可以简单地提供一个框架,使实现相同的度量变得容易。
自动化平凡但必要的任务
创建有效的数据策略就是让数据的使用和管理变得简单。
这个过程的一部分需要将所有数据团队需要做的普通任务自动化。
这方面的一个例子是创建文档。文档是帮助分析师理解他们正在使用的表格和流程的一个重要因素。拥有好的文档可以让分析师进行更好的分析。然而,文档经常被推迟到最后一分钟,或者根本不做。
与其强迫工程师记录每个新表,不如创建一个系统,定期自动抓取可用的数据库,并跟踪存在哪些表、谁创建了它们、它们有哪些列,以及它们是否与其他表有关系。
这将是一个由 devops 团队承担的项目,或者您也可以研究第三方系统,例如用于 SQL Server 的 dbForge 文档。这并没有涵盖所有内容,这个工具只适用于 SQL Server。但是一个类似的工具可以帮助简化很多人的生活。
团队仍然需要描述表和列是什么。但是,实际检查和设置基本信息的初始工作都可以自动跟踪。
这有助于减少必要但重复的工作,使每个人的生活变得更轻松。
提供更简单的方法来分享和跟踪分析
这是专门面向数据科学家的。
数据科学家通常会在 Jupyter 笔记本和 Excel 上工作,只有他们才能访问这些文件。此外,许多公司没有强制要求使用某种形式的存储库,如 git,以便数据科学家可以对他们的工作进行版本控制。
这限制了共享文件以及跟踪分析过程中可能发生的变化的能力。
在这种情况下,协作变得很困难,因为同事们经常被来回传递文件和自我版本控制所困扰。通常情况下,这些文件的后缀类似于 _20190101_final、_20190101_finalfile…
对于那些不明白的人,希望你永远也不会明白。
最重要的是,由于许多 python 脚本利用了多个库,所以当您在环境中安装所有正确的版本时,要确保这一点是很困难的。
老实说,所有这些小困难都可能因为故障排除而导致一两天的损失,这取决于您试图运行的分析的复杂程度。
但是,解决方法多的是!
实际上,有很多很棒的工具可以帮助您的数据科学团队进行协作。这包括像多米诺数据实验室这样的公司。
现在,您也可以随时使用 git 和虚拟环境,但这也要求您的数据科学家非常精通这些技术。情况并非总是如此。
同样,这允许您的团队独立工作,但也很容易分享他们的工作。
数据文化转变
当你试图创建一家更加数据驱动的公司时,增加新的库和工具并不是唯一需要发生的变化。一个更重要也更困难的转变是文化上的。
改变人们看待和处理数据的方式是一个非常具有挑战性的关键方面。这里有几个原因。
数据谎言
对于没有读过这本书的人来说,如何用统计数据撒谎,剧透一下,用数字来讲述你想要的故事真的很容易。
有很多方法可以做到这一点。
一个团队可以挑选他们想要的统计数据来帮助他们的议程取得成功。或者,如果你不考虑所有其他变量,一个研究团队可能会忽略混杂因素,并报告一些看起来令人震惊的统计数据。
作为一家数据驱动的公司,这意味着你需要发展一种文化,试图查看统计数据和指标,并确保没有任何东西干扰数字。这一点也不容易。说到数据科学和分析。
大多数度量和统计通常有一些规定,可能会否定它们试图表达的任何信息。这就是为什么创造一种关注指标并问为什么的文化是过程的一部分。如果只是简单地获得输出和 p 值。那么数据科学家就会失业,因为有很多第三方公司的产品可以找到最佳算法,为你进行特征选择。
但这并不是数据科学家的唯一工作。他们在那里质疑每一个 p 值,并真正挖掘他们所看到的数字的原因。
数据仍然杂乱无章
说实话,数据还是很乱。即使有了今天的现代 ERP 和应用程序,数据也是混乱的,有时坏数据会误导经理和分析师。
这可能是由很多原因造成的。应用程序如何管理数据,这些应用程序的系统管理员如何修改所述系统,等等。从业务流程的角度来看,即使是看似微不足道的变化也会对数据的存储方式产生重大影响。
反过来,当数据工程师提取数据时,由于错误的假设和有限的知识,他们可能无法准确地表示数据。
这就是为什么只有数字是不够的。团队还需要对创建所述数据的业务和过程有很好的理解,以确保他们不允许混乱的数据进入分析师直接使用的表中。
我们的观点是,数据分析师需要确信他们正在查看的数据正确地代表了他们相应的业务流程。如果分析师必须删除任何数据,或者一致地执行连接和 where 子句来准确地表示业务,那么数据就不是“自助”的。这就是为什么每当数据工程师创建新的数据模型时,他们都需要与业务部门密切合作,以确保收集正确的业务逻辑并在表的基础层中表示出来。
这样,分析师可以对他们的数据有近乎 100%的信任。
结论
归根结底,创建有效的数据文化需要自上而下和自下而上的思维转变。从执行层面来看,需要决定在哪些关键领域可以帮助简化数据访问。然后,团队可以开始工作,在实际使用数据做决策方面变得更加熟练。我们经常发现大多数团队花太多时间在需要完成但可以自动化的数据任务上。改进您公司的数据方法可以提供巨大的竞争优势,并让您的分析师和数据科学家能够从事他们都喜欢的项目,并帮助您提高利润!
如果你喜欢这篇关于数据科学的文章,那么也考虑一下这些文章吧!
大数据已经从仅仅是一个时髦词变成了一种必需品,高管们需要想出如何与之争论。今天…
www.acheronanalytics.com](http://www.acheronanalytics.com/acheron-blog/hadoop-vs-relational-databases) [## 使用 Python 抓取相遇 API
我们最近发布了一些你可以参与的项目的想法,添加到你的简历中,并帮助你更多地了解…
www.acheronanalytics.com](http://www.acheronanalytics.com/acheron-blog/using-python-to-scrape-the-meet-up-api) [## 自动化工作流程的 4 个简单 Python 想法-西雅图数据人
自动化。它应该可以消除工作。那么,为什么不帮助它呢?说实话,自动化甚至简单的任务…
www.theseattledataguy.com](https://www.theseattledataguy.com/4-simple-python-ideas-to-automate-your-workflow/) [## 软件工程师面试学习指南
这是一个软件工程学习指南,你可以用它来帮助自己准备面试。这是…
www.coriers.com](https://www.coriers.com/the-interview-study-guide-for-software-engineers/) [## Python 后端:Flask 对 Django
你的下一个项目适合做什么?
medium.com](https://medium.com/better-programming/python-backends-flask-versus-django-5de314fa70ff) [## 使用 Python 抓取相遇 API
我们最近发布了一些你可以参与的项目的想法,添加到你的简历中,并帮助你更多地了解…
开发到](https://dev.to/seattledataguy/using-python-to-scrape-the-meet-up-api-316p)
如何提高你的 kaggle 竞赛排行榜排名
美国有线电视新闻网失明检测新大楼的提示
在最近参加了 2019 年 APTOS 失明检测 Kaggle 比赛并获得前 32%的成绩后,我想分享一下我训练卷积神经网络的过程。我之前唯一的深度学习经验是完成 Deeplearning.ai 专业化,因此这是你阅读本文所需的全部内容。
本条的章节
- 竞争环境
- 写日志
- 获取更多数据
- 利用现有内核
- 预处理图像
- 训练是一个非常非常缓慢的过程(但是不要担心)
- 迁移学习
- 型号选择
竞争环境
我在过去的 2-3 个月里断断续续地参加了 Kaggle 上的 APTOS 2019 失明检测比赛,比赛要求你将人们眼睛的图像分为 5 类糖尿病视网膜病变严重程度。在本文的剩余部分,我将谈论一些你可以在任何 kaggle vision 竞赛中使用的技巧和诀窍,,因为我觉得我从这个竞赛中学到的东西基本上是普遍适用的*。*
记日志
像任何好的科学实验一样,我们一次改变一件事,并将我们的结果与我们的对照进行比较。因此,当训练 CNN(卷积神经网络)时,我们也应该这样做,并在日志中记录变化和结果。这是我在失明检测挑战赛中用过的。
My logbook for Kaggle APTOS Blindness Detection Challenge
我并不声称我在这里使用的精确的表格是理想的(远非如此),但是我发现至少能够识别每次我进行更改时,模型是否在以前的更改基础上有所改进是非常有用的。无论如何,我强烈建议你保持某种形式的日志,因为很难确定你所做的事情是否有效。
我对下一份比赛日志的一些想法是:
- 建立一个单一的基线模型来比较所有未来的变化
- 想出一堆您想要尝试的调整,并为每个调整独立地运行基线的修改版本,而不是以累积的方式。
- 尽可能长时间保持相同的(最小的)CNN 架构,因为这将使迭代更快,并且通过一些观察,许多超参数应该体面地转移到更大更复杂的模型。
获取更多数据
在你开始编码之前做一些研究,看看以前是否有类似的比赛,或者是否有类似标签的训练集的数据库可以使用。更多的数据永远不会对你的模型造成真正的伤害(假设标签的质量还不错),所以尽可能地获取更多的数据,但是不要忘记从提供给你的原始数据集中保留你的验证和测试集,否则你可能会以训练测试不匹配而告终*。*
利用现有内核
如果你是深度学习竞赛的新手(像我一样),你可能不想从头开始编写整个笔记本——特别是当别人可能已经为你的竞赛发布了一个入门内核时(为什么要重新发明轮子呢?).这可能会为您节省大量调试时间,并通过调整其他人的模型让您更快地学习新东西。
这是一个很好的启动内核,我在几乎所有的进一步试验中使用并改进了它。
下载数千个项目的开放数据集+在一个平台上共享项目。探索热门话题,如政府…
www.kaggle.com](https://www.kaggle.com/mathormad/aptos-resnet50-baseline)
**一个警告:**如果一个内核建议你的模型使用一些技术,你应该检查它们是否陈述了最终的性能提升,否则,在盲目地将它们合并到你自己的模型之前,要持怀疑态度并自己进行测试:)
预处理图像
**裁剪&其他增强:**这一步是必须的。训练图像可能处于非常原始的状态。例如,在失明检测挑战中,所有图像都以不同的比例裁剪,这意味着一个愚蠢的算法可能会过度适应眼睛周围的黑色空间,这在一个类别中比另一个类别中更普遍。
Source: https://www.kaggle.com/taindow/be-careful-what-you-train-on
因此,以稳健的方式裁剪图像和调整图像大小是这场竞赛的关键部分。也有许多图像增强技术,如随机裁剪,旋转,对比度和亮度等,我有不同程度的成功。
不均衡的职业:总有一些职业比其他职业有更多的训练例子,所以你需要在开始训练前解决这个问题。在小批量梯度下降过程中,过采样/欠采样以及混合 (Zhang 等人,2019)是一组行之有效的技术组合。
**预处理计算:**数据集通常会非常大,应用基本程序(如标准化尺寸和图像裁剪)应在单独的内核 t(或离线 dep)中完成。数据集的大小)并作为原始数据的修改版本重新上传——否则,您将不得不在模型的每个时期/运行时进行这种计算(这是对时间的极大浪费)。
训练是一个非常非常缓慢的过程
现在你已经写了你的第一个内核,你需要测试它!Kaggle 内核可以运行长达 9 个小时(内核时间限制可能因竞争而异),该网站也运行许多模型,因此在一天中的某些时间可能会比其他时间慢。我最好的建议是,首先在浏览器中快速运行 1 到 2 次,以确保你没有犯任何错误,然后获得几个你想同时测试的想法,然后点击提交所有想法,几个小时后再回来检查。注意,如果你点击提交而不是运行内核,你就不必让你的笔记本电脑一直运行:)。
迁移学习
你不会从头开始训练一个足够大的模型。通常情况下,我们只需要在 imagenet 或其他大型数据集上预先训练一个大型模型,并根据我们的目的对其进行微调。几乎在所有情况下,您都应该在微调期间解冻模型的所有层,因为结果可能是最稳定的。
这张图表很好地说明了这一点(Yosinski 等人,2014 年),其中两个网络在数据集 A 和 B 上进行训练,然后网络在第 n 层被切断,之前的层被冻结或微调(用+表示)。在第二幅图中可以看到结论,其中 to 线 AnB+的所有 7 层都经过了调整,产生了最佳的 top-1 精度。
(Yosinski et al. 2014)
型号选择
您可能最好从一个较小的模型(如 ResNet 50)开始,然后尝试一些较大的架构,如(Resnet-101、InceptionNets、EfficientNets)。所有这些网络都有可用的论文,在你继续使用它们之前绝对值得一读,尽管通常你应该期望用新的模型比旧的模型获得更好的准确性。
结束语
有了我上面提供的信息,你应该能在公共和私人排行榜上获得一个真正体面的分数。
我参加这项挑战的直觉告诉我,进入公开排行榜的前 30 名,就有很大机会进入私人排行榜的前 10 名,因为剩下的数据集存在不确定性。
在 APTOS 挑战赛中,排名前 32%和赢得第一名之间的差距比我的分数提高了不到 3%,所以继续调整你的模型吧!
参考
Yosinski,j .,Clune,j .,Bengio,y .和 Lipson,H. (2019)。深度神经网络中的特征有多大的可转移性?。[在线]arXiv.org。地点:【https://arxiv.org/abs/1411.1792】T2。
张,h .,西塞,m .,多芬,y .和洛佩斯-帕兹,D. (2019)。混乱:超越经验风险最小化。[在线]arXiv.org。可在:https://arxiv.org/abs/1710.09412【2019 年 9 月 8 日获取】。
如何通过课程学习提高您的网络性能
Elman 在 1993 年已经提出了课程学习的思想,Bengio 在 2009 年的几个任务中证明了课程学习可以提高网络性能。然而,这些天你很少听到关于它的消息,这就是为什么我决定写一篇关于它的文章。
课程学习描述了一种学习类型,在这种学习中,你首先从一项任务的简单例子开始,然后逐渐增加任务的难度。几十年来,我们人类一直在根据这一原则进行学习,但我们没有将它转移到神经网络,而是让它们从一开始就对整个数据集进行训练,尽管它有各种困难。
为了演示课程学习的效果,我将使用一个相当小的卷积神经网络,尝试将图像分为 10 类。数据集被称为 CIFAR-10,可以在这里找到:https://www.cs.toronto.edu/~kriz/cifar.html网络由两个卷积层组成,后面是一个具有 512 个神经元的全连接层和一个具有 10 个神经元的读出层。网络太小,无法实现 60%以上的性能,但这将更容易看到课程学习如何提高性能,以及如何通过使用这种技术从小型网络中挤出更多的准确性。
Network performance over time on the CIFAR-10 data set. Training with all classes at once for 5 epochs. Red lines mark the beginning of a new epoch. In the bottom right corner you can see some examples out of the data set.
当我们现在查看网络在各个类上的表现时,我们可以看到一些类似乎比其他类更难学。虽然网络在飞机、汽车、轮船或卡车等物体上取得了相当好的性能,但它与猫、狗、鹿和鸟进行了斗争。
接下来,我们想看看如果不从一开始就对所有的类进行训练,而是一步一步地介绍它们,网络性能会有什么变化。在这个实验中,我从十个类中的六个开始,然后在每个新的时期引入一个新的类。这意味着在五个时期之后,所有十个类都在数据集中。之后,网络继续训练另外 20 个时期,以达到稳定的性能。更多关于渐进学习过程和网络成长的信息可以在我的上一篇文章中找到。
当重复这个实验很多次时,每次以随机的班级顺序,人们可以观察到一些表现特别好的运行。如果你现在观察这些表现最好的网络训练,并绘制在运行中使用的课堂顺序与各自的课堂难度的关系,你可以观察到两者之间的显著负相关为-0.27,F(1,16.43),p<0.001。作为班级难度,我定义了一次正常训练结束时网络在班级上的表现(见上图)。
One dot represents the difficulty of a class shown at the respective point in time during the best performing runs. Class difficulty = the accuracy on this class at the end of a normal network training -> The higher the accuracy the lower the difficulty. Position 0–5 are equal since the network starts out training on six classes.
上图显示了具有最佳执行类顺序的运行如何倾向于首先显示简单类,而从不最后显示简单类。在上一个纪元中引入的所有职业都是普通网络努力学习的职业,因此看起来更难学习。
现在将这些结果再进一步,我们可以将难度递增的训练和难度递减的训练的网络性能进行比较。
Test accuracy distribution over a hundred runs for training with increasing and decreasing class difficulty.
结果显示了两种情况之间的非常显著的差异,其中,随着难度的增加而训练的网络在准确性方面具有大约 4%的领先。
可能最有趣的部分是将这些性能与从一开始就在所有类上训练的正常网络的性能进行比较。
Test accuracy distribution of 100 network trainings for continuous learning (increasing and decreasing difficulty) compared to a normal network training for an equal amount of epochs.
即使正常训练相对于连续学习有一点优势,因为后者在一些类上训练的次数较少,因为它们只是后来才引入的,但是以逐渐增加的难度训练的网络达到显著更高的性能,F(1,953.43),p <0.001.
It seems as if learning the broad concept on a few easy examples and only later on refining the concept with more complex examples gives the continuously learning network a distinct advantage over a network which needs to grasp the whole concept at once.
When thinking about real life this appears quite intuitive, one would not mix advanced calculus into a first grader’s math homework, but with neural networks this seems to be common practice. Of course it is an additional effort to determine individual class difficulties, but for reaching or exceeding benchmarks and deploying an optimal model this additional effort can
很容易值得。
代号:https://github . com/vkakerbeck/progressive-Growing-Networks
参考文献:
Bengio,Yoshua 等人(2009 年)。“课程学习”。载于:《第 26 届机器学习国际年会论文集》,第 41-48 页。刊号:0022–5193。多伊:10。1145 / 1553374 .1553380.arXiv: arXiv : 1011。1669v3。
埃尔曼,L (1993 年)。“神经网络中的学习和发展:从小处着手的重要性”。载于:第 48 页,第 71-99 页。
增加你的机器学习模型的影响
关于平衡努力
随着媒体的大肆宣传和学术机器学习社区的最新发展,有时感觉这就是最重要的事情:
或者,在例如用于自然语言处理的单词嵌入的情况下:
那有什么问题?
通常,行业机器学习项目并不基于像 MINST 这样固定的、预先存在的参考数据集。很多努力都花在了获取训练数据上和清理训练数据上和**。由于这些任务是高度具体的项目,不能一概而论,他们很少被谈论,也没有得到媒体的关注。**
后期建模步骤也是如此:如何将你的模型带入制作?模型输出将如何创造实际的商业价值?还有对了,这些问题不是应该事先就想好了吗?虽然服务工作流的模型在某种程度上是可转移的,但货币化策略通常是特定的,不会公开。
有了这些考虑,我们可以描绘一幅更准确的画面。这是真正影响你的机器学习项目的因素:
现在,我如何最好地增加模型的影响?
关键是平衡你的努力。更准确地说:注意在花费的时间和总体影响方面,哪个步骤产生的投资回报最高。这将随着你的进步而改变:一旦你充分改进了一个组件,在另一个组件上的工作将变得更加有效。请记住,您不需要在最终的执行顺序中这样做:货币化阶段,也就是上图中的最后一步,可能是您应该首先考虑的。
获得更多的训练数据或提高其质量可能比吹嘘使用最先进的深度学习架构更乏味,也没有那么迷人,但从整体模型性能来看,往往更有价值。如果你还不知道如何建立一个高效的机器学习系统,以及它将如何实际影响公司决策,就不要专注于花哨的技术。
那么,当开始一个新项目时,这意味着什么呢?你可以
- 把数据转储到 Keras。如果模型性能不令人满意,请使用更多的层。调整所有参数。
- 几周过去了。
或者你可以
- 想想这个项目将如何真正帮助你的公司。尽早让需要的人加入进来,让他们感受到努力的一部分。为所有步骤设计一个计划。确保一个关键决策者支持你。钻研数据,做一些可视化和清理,获得关于平均值、异常值、相关性、缺失字段和底层业务流程的良好感觉。尝试决策树或逻辑回归作为简单、可解释的基线模型。例如,使用云平台进行原型部署和测试您的工作流程。
- 从那里迭代。在每一步中,改进你认为目前在商业价值和时间方面能给你带来最高投资回报的组件。得到反馈。
- 你将有一个早期的原型展示。这将建立信任并解锁资源。进一步的渐进、平衡的改进确保你不会浪费时间拧紧错误的螺丝。
就是这样!感觉少了点什么?完全不同意?请在评论中分享你的观点!
如何初始化神经网络
权重初始化技术的实际应用
Image source: https://pixabay.com/photos/sport-tracks-running-run-sprint-1201014/
训练神经网络远不是一项简单的任务,因为最轻微的错误都会在没有任何警告的情况下导致非最佳结果。训练取决于许多因素和参数,因此需要深思熟虑的方法。
众所周知,训练的开始(即最初的几次迭代)非常重要。如果操作不当,结果会很糟糕——有时,网络甚至什么也学不到!因此,初始化神经网络权重的方式是良好训练的关键因素之一。
本文的目标是解释为什么初始化会产生影响,并给出有效实现它的不同方法。我们将通过实际例子来检验我们的方法。
代码使用了 fastai 库(基于 pytorch)。所有的实验笔记本都可以在这个 github 库中找到。
为什么初始化很重要?
神经网络训练基本上包括重复以下两个步骤:
- 前进的一步在于权重和输入/激活之间的大量矩阵乘法(我们称激活为将成为下一层输入的层的输出,即隐藏激活)
- 向后的步骤,包括更新网络的权重,以便最小化损失函数(使用参数的梯度)
在向前的步骤中,激活(然后是梯度)可以很快变得很大或很小——这是因为我们重复了许多矩阵乘法。更具体地说,我们可能会得到:
- 非常大的激活,因此大梯度射向无限
- 非常小的激活,因此梯度极小,由于数值精度,梯度可能被抵消为零
这两种影响对训练都是致命的。下面是在第一次向前传递时,使用随机初始化的权重进行爆炸的示例。
在这个特殊的例子中,平均值和标准偏差在第 10 层已经很大了!
让事情变得更加棘手的是,在实践中,即使在避免爆炸或消失效果的同时,经过长时间的训练,你仍然可以获得非最佳的结果。这在下面一个简单的 convnet 上有所说明(实验将在文章的第二部分详述):
请注意,默认的 pytorch 方法并不是最好的方法,随机初始化并不能学到很多东西(另外:这只是一个 5 层网络,这意味着更深层次的网络不会学到任何东西)。
如何初始化您的网络
回想一下,良好初始化的目标是:
- 获取随机权重
- 在第一个正向过程中,将激活保持在良好范围内(反向过程中的梯度也是如此)
什么是练好的靶场?定量地说,这意味着使矩阵与输入向量相乘的输出产生平均值接近 0 且标准偏差接近 1 的输出向量(即激活)。那么每一层将在所有层中传播这些统计数据。
即使在一个深度网络中,你也会在第一次迭代中获得稳定的统计数据。
我们现在讨论两种实现方法。
数学方法:明凯初始化
让我们想象一下这个问题。如果初始化的权重在训练开始时太大,那么每个矩阵乘法将指数地增加激活,导致我们所说的梯度爆炸。
相反,如果权重太小,那么每次矩阵乘法将减少激活,直到它们完全消失。
因此,这里的关键是缩放权重矩阵,以获得均值约为 0、标准差为 1 的矩阵乘法输出。
但是如何定义权重的范围呢?因为每个权重(以及输入)都是独立的,并且按照正态分布分布,所以我们可以通过计算得到帮助。
两篇著名论文基于这一思想提出了一个很好的初始化方案:
- “Xavier 初始化”,在 2010 年的论文中提出理解训练深度前馈神经网络的难度
- “明凯初始化”,2015 年在论文中提出,深入研究整流器:在 ImageNet 分类上超越人类水平的性能
实际上,这两种方案非常相似:“主要”区别在于明凯初始化考虑了每次矩阵乘法之后的 ReLU 激活函数。
现在,大多数神经网络使用 ReLU(或类似 leaky ReLU 的类似函数)。这里,我们只关注明凯初始化。
简化公式(对于标准 ReLU)是通过以下方式对随机权重(取自标准分布)进行缩放:
例如,如果我们有一个大小为 512 的输入:
此外,所有偏置参数应初始化为零。
注意,对于 Leaky ReLU,公式有一个额外的部分,我们在这里没有考虑(我们让读者参考原始论文)。
让我们看看这个方法在前面的例子中是如何工作的:
请注意,现在我们在初始化后获得了平均值为 0.64、标准偏差为 0.87 的激活。显然,这并不完美(怎么可能是随机数呢?),但比正态分布的随机权重好得多。
50 层之后,我们得到的平均值为 0.27,标准差为 0.464,因此不再有爆炸或消失的效果。
可选:明凯公式的快速解释
明凯的论文中提供了导致 math.sqrt 的神奇缩放数(2 /输入向量的大小)的数学推导。此外,我们在下面提供了一些有用的代码,读者可以完全跳过这些代码进入下一节。注意,代码要求理解如何做矩阵乘法以及什么是方差/标准差。
为了理解公式,我们可以考虑矩阵乘法结果的方差是什么。在本例中,我们将一个 512 矢量乘以一个 512x512 矩阵,得到一个 512 矢量的输出。
在我们的例子中,矩阵乘法输出的方差大约等于输入向量的大小。根据定义,标准差是它的平方根。
这就是为什么将权重矩阵除以输入向量大小的平方根(本例中为 512)会得到标准差为 1 的结果。
但是“2”的分子从何而来?这只是考虑到了 ReLU 层。
如你所知,ReLU 将负数设置为 0(只有 max(0,input))。所以,因为我们有以平均值 0 为中心的数字,它基本上消除了一半的方差。这就是为什么我们加一个分子 2。
明凯 init 的缺点是
明凯 init 在实践中非常有效,那么为什么要考虑另一种方法呢?事实证明,Kaming init 有一些缺点:
- 一层之后的平均值不是 0,而是大约 0.5。这是因为 ReLU 激活函数,它删除了所有的负数,有效地改变了它的平均值
- 明凯初始化只适用于 ReLU 激活函数。因此,如果你有一个更复杂的架构(不仅仅是 matmult → ReLU 层),那么这将不能在所有层上保持大约 1 的标准偏差
- 一层之后的标准偏差不是 1,而是接近 1。在深度网络中,这不足以使标准差始终接近 1。
算法途径:LSUV
那么,在不为更复杂的架构手动定制明凯初始化的情况下,我们能做些什么来获得一个好的初始化方案呢?
2015 年的论文展示了一种有趣的方法。它被称为 LSUV(层序单位方差)。
解决方案在于使用简单的算法:首先,用正交初始化来初始化所有层。然后,取一个小批量输入,并为每一层计算其输出的标准偏差。将每层除以产生的偏差,然后将其重置为 1。下面是论文中解释的算法:
经过一些测试,我发现正交初始化比在 ReLU 之前进行明凯初始化给出了相似(有时更差)的结果。
杰瑞米·霍华德在 fastai MOOC 中展示了另一种实现方式,它对权重进行了更新,以保持均值在 0 左右。在我的实验中,我还发现将平均值保持在 0 左右会得到更好的结果。
现在让我们比较这两种方法的结果。
初始化方案的性能
我们将在两个架构上检查不同初始化方案的性能:一个具有 5 层的“简单”convnet 和一个更复杂的类似 resnet 的架构。
任务是在Imagenet 数据集(Imagenet 数据集的 10 个类的子集)上进行图像分类。
简单的建筑
这个实验可以在这个笔记本里找到。请注意,由于随机性,每次的结果可能会略有不同(但不会改变顺序和整体情况)。
它使用一个简单的模型,定义为:
#ConvLayer 是一个 Conv2D 层,后跟一个 ReLU
nn。Sequential(ConvLayer(3,32,ks=5),ConvLayer(32,64),ConvLayer(64,128),ConvLayer(128,128),nn。AdaptiveAvgPool2d(1),Flatten(),nn。线性(128,data.c))
下面是 3 个初始化方案的比较:Pytorch 默认的初始化(它是一个明凯初始化,但有一些特定的参数),明凯初始化和 LSUV 初始化。
请注意,随机初始化的性能太差了,我们从下面的结果中删除了它。
【init 后的激活统计
第一个问题是在第一次迭代向前传递后的激活统计是什么?我们越接近平均值 0 和标准差 1,就越好。
该图显示了初始化后(训练前)每一层的激活状态。
对于标准差(右图),LSUV 和明凯初始值都接近 1(LSUV 更接近)。但是对于 pytorch 默认值,标准差要低得多。
但是对于平均值,明凯初始结果更差。这是可以理解的,因为明凯 init 没有考虑平均的 ReLU 效应。所以平均值在 0.5 左右而不是 0。
复杂架构(resnet50)
现在让我们检查一下在一个更复杂的架构上是否得到了类似的结果。
架构是 xresnet-50,在 fastai 库中实现。它比我们之前的简单模型多了 10 倍的层数。
我们将分两步进行检查:
- 没有规范化层:batchnorm 将被禁用。因为这一层将逐批修改 stats mini,所以它应该会降低初始化的影响
- 使用规范化图层:batchnorm 将被启用
第一步:没有 batchnorm 这个实验可以在这个笔记本里找到。
如果没有 batchnorm,10 个时期的结果是:
该图显示 LSUV 的精度(y 轴)为 67%,明凯初始化为 57 %, py torch 默认为 48%。差别是巨大的!
让我们在训练前检查激活统计:
让我们缩放以获得更好的比例:
我们看到一些层的 stats 为 0:这是 xresnet50 的设计,与 init 方案无关。这是论文中的一个技巧,用于使用卷积神经网络进行图像分类(在 fastai 库中实现)。
我们认为:
- Pytorch 默认初始化:标准差和均值接近于 0。这是不好的,显示了一个正在消失的问题
- 明凯·尼特:我们得到了一个很大的均值和标准差
- LSUV init:我们得到了很好的统计数据,虽然不完美,但比其他方案要好
我们看到,即使在 10 个完整的时期之后,这个例子的最佳初始化方案对于完整的训练给出了好得多的结果。这显示了在第一次迭代中保持各层良好统计的重要性。
步骤 2:使用 batchnorm 图层
这个实验可以在这个笔记本里找到。
因为 batchnorm 正在规范化一个层的输出,我们应该期望 init 方案的影响较小。
结果显示,所有 init 方案的准确率接近 88%。请注意,在每次运行时,最佳初始化方案可能会根据随机生成器而变化。
它表明 batchnom 层使网络对初始化方案不太敏感。
培训前的激活统计如下:
像以前一样,最好的似乎是 LSUV init(只有它能保持平均值在 0 左右,标准差接近 1)。
但是结果显示这对准确性没有影响,至少对于这个体系结构和这个数据集是这样。不过它证实了一件事:batchnorm 使网络对初始化的质量不太敏感。
结论
从这篇文章中要记住什么?
- 第一次迭代非常重要,会对整个培训产生持久的影响。
- 一个好的初始化方案应该在网络的所有层(对于第一次迭代)保持关于激活的输入统计(平均值为 0,标准偏差为 1)。
- 批处理层降低了神经网络对初始化方案的敏感性。
- 使用明凯 init + LSUV 似乎是一个不错的方法,尤其是当网络缺少标准化层的时候。
- 其他类型的架构在初始化方面可能有不同的行为。
如何在你的 Mac 上安装一个完全免费的 Windows 10 操作系统来获得乐趣和利润
创建免费虚拟机的完整初学者指南:轻松运行任意数量的操作系统进行黑客攻击、游戏、渗透测试、软件测试、调试等等。
Image by Ian Lindsay from Pixabay
你可以在你的 Mac 电脑上免费运行完全不同的操作系统。大概五分钟后就可以启动运行了。
想要一台运行 Windows 10 的机器?
搞定。
即使是最忠实的 Mac 粉丝在某些时候也可能想要或需要使用 Windows(或另一个操作系统)。你可能想测试一些在 Windows 下运行的很酷的工具或游戏。你可能迫切需要一个不同于你面前的操作系统。你可能需要检查一些有问题的软件,或者处理一个错误或病毒。
有可能是你真正开始玩游戏的时候了…
GIF via GIPHY
幸运的是,在你的 Mac 上安装一个免费的虚拟机并像运行其他应用程序一样运行它非常简单。一旦你知道你在做什么,只需要不到五分钟的时间!
关于虚拟机
无论您是对渗透测试、黑客攻击、软件调试感兴趣,还是只想(或需要)运行一些基于 Windows 的程序和游戏,虚拟机(VM)都是一个方便的东西。它们允许你在桌面上的一个窗口中安装和运行操作系统,如 Windows 或 Kali Linux 。
这个新的客户操作系统认为它运行在一台真正的电脑上,但它实际上是运行在你的 Mac 上的一个软件内部。该虚拟机与您计算机的其余部分“隔离”。这意味着它完全独立于你的电脑。您可以免受 bug、病毒和许多其他安全问题的侵害。
虚拟机允许你同时运行多个操作系统。您可以在一个操作系统上运行为另一个操作系统编写的软件,而无需重启。因为您可以配置您的虚拟硬件,您甚至可以安装一个旧的操作系统,如 d OS 或 OS/2。
您可以随时用“快照”保存计算机的状态,并在需要时恢复到该状态。这让你可以自由地试验你的环境。如果出现问题,无论是软件安装还是系统感染病毒,您都可以轻松切换回之前的快照。不需要持续的备份和恢复。
VirtualBox
尽管有很多流行的虚拟机程序,但是 VirtualBox 是完全免费的,开源的,非常棒。当然,有些细节,比如 3D 图形,在 VirtualBox 上可能不如在你付费的东西上那么好。如果你追求的是速度和图形,你可能会想看看付费版本。
我听说 Parallels Desktop 很棒,比 VirtualBox 快得多,但我自己并没有真正试过。如果你有喜欢的,在下面的评论里让人们知道吧!
那么什么是虚拟机呢?它是一种计算机文件(通常称为图像),其行为类似于实际的计算机。这就像你在自己的电脑里创造了一台电脑。它运行起来很像任何其他程序,但虚拟机与系统的其余部分是分开的。这意味着虚拟机内部的软件无法逃脱并篡改你的计算机。这使得它成为测试新版本、检查受感染数据、创建操作系统备份以及在最初不支持的操作系统上运行应用程序和软件的理想场所。
您甚至可以在同一台计算机上同时运行多个虚拟机。
Image by (Joenomias) Menno de Jong from Pixabay
我想要那个
我们将对安装带有扩展包的 VirtualBox 并运行 Windows 10 所需的绝对基础知识做一个简单的演练。这只是设置的一种方式。如果你感兴趣的话,你可以从这里得到更多的乐趣!
我们将要使用的程序是完全免费的,我们有使用它们的许可。(我把它放在这里是因为当你接近黑客世界时,事情会变得相当棘手。)我们将前往 Oracle 获取 VirtualBox 和 VirtualBox 扩展包。然后我们将前往微软获取我们想要使用的 Windows 版本。
步骤 1:下载 VirtualBox
如果你进入 VirtualBox ,你会看到一个巨大的绿色“下载 VirtualBox”按钮。继续点击或者前往 VirtualBox 下载页面为您的系统选择正确的 VirtualBox 版本。如果你在 Mac 上,你会点击 MacOsX 链接。
或者:
在下载页面上,您还会看到一个标题为“VirtualBox 6 . 0 . 8 Oracle VM Virtual Box 扩展包”的部分单击“所有支持的平台”下载扩展包。
第二步:抢到 Windows 10
你有几种方法可以在你的虚拟机上安装 Windows 10,但这是我发现的最简单的一种。它是由微软专门为测试目的而设计和发布的。如果您想要运行 Windows 10 和“选择平台”下的“VirtualBox”,请确保您选择了“MSEdge on Win10 (x64) Stable 1809”然后点击“下载。拉链"按钮!
****更新 * *这是一个完全免费的 Windows 10 版本,但是你并没有无限制、不受限制地使用这个软件。**这不是你可以永远无限制使用的无限制版 Windows。我不知道你在哪里可以找到这样的东西,但是如果你有,请告诉我们!
该软件由微软提供,仅供有限使用。该许可证的有效期为 90 天。你可以复制一份,用它来重新安装软件,90 天后就没问题了(这在官方文件中有明确说明)。如果你想在 90 天后继续使用该软件,请为此制作一份副本),但这不是完全版的 Windows 10,它可以永远免费使用,没有任何限制。这是微软提供的 Windows 10 的合法免费版本,您可以在有限的时间内用于有限的目的,并随时从网站或备份副本快速轻松地重新安装。
当然,这并不是在 VirtualBox 上安装 Windows 10 的唯一方式。对于初学者和开发人员来说,这是一种非常快速和方便的方式来访问和测试 Windows 10 所提供的大部分功能。
有些可选:取消归档
下载解压器也是有意义的。这是打开这些文件的快速、免费和强大的方法。在微软官方文档中也有推荐。你不需要使用它来打开 VirtualBox 或扩展包,但使用像这样的应用程序来提取 Windows 10 下载是一个好主意。
一旦你的下载准备好了,去你的下载文件夹。右键单击 VirtualBox 图标,转到“打开方式”,然后单击“取消归档”这将解压缩并打开您的文件。
步骤 3:安装 VirtualBox 和扩展包
您可以像安装任何程序或应用程序一样,直接将 VirtualBox 安装到应用程序文件夹中。当然,如果你想的话,你可以改变位置。然后按照安装程序的提示进行操作。
接下来,转到您的应用程序文件夹(或您为 VirtualBox 指定的位置),双击图标将其打开。
您可以像安装 VirtualBox 一样打开并安装您的扩展包。当您开始安装时,您会看到一个弹出窗口,让您知道您正在安装什么。点击“安装”
步骤 4:启动并运行您的操作系统
现在您已经安装了 VirtualBox,是时候创建虚拟机了。要做到这一点,你需要一个操作系统。我们将使用我们的 Windows 10 微软下载,但如果你进入这个,你有很多选择!
继续使用解压缩程序打开您的 Microsoft 下载。如果您想按原样使用,Windows 已经安装完毕,可以随时运行。为此,请单击“导入”您可以按原样导入它,然后随时修改您的设置。如果你没有不同的计划,就按现在的方式导入吧。
现在转到 VirtualBox 并单击“新建”这将打开一个向导,引导您完成安装。
首先,你需要给你的虚拟机一个名字。因为这很有趣,所以我强烈建议给你的虚拟机取一个描述性强、简单明了的名字。过一段时间后,他们开始看起来非常相似,这将为你节省一些严重的挫折。类似“Windows 10”或“MSEdge-Win10”的东西很有意义。
如果你选择了有创意的名字,并真正进入其中,你可能很难记住“松饼”运行的是 Windows 10,而“Tchotchke”运行的是 Kali Linux 等等。
Image by MrsBrown from Pixabay
指定您将运行的操作系统的类型(Microsoft Windows)和版本(Windows 10 64 位),然后单击“下一步”
现在你需要设置内存的大小。您正在指定有多少计算机内存将分配给虚拟机。VirtualBox 会自动让您知道所选操作系统的建议最小容量,但您可以根据需要增加或减少。
请记住,您只能使用系统实际拥有的内存量,将其设置为最大值并不是一个好主意。当您运行虚拟机时,将不会有任何空间留给您的常规操作系统使用!不要指定超出您能力范围的内容,尤其是当您认为可能会同时运行多个虚拟机时。不管怎样,你最好待在绿色区域。否则,您可能会面临一些严重的性能问题。
点击“继续”
现在你需要创建一个虚拟硬盘。选择一个选项并单击“创建”,然后浏览提示并再次单击“创建”。你需要一个虚拟硬盘来安装你的操作系统和其他程序。
虚拟硬盘最常见的格式是 VirtualBox 磁盘映像(VDI)。确保它至少有足够的空间来安装操作系统。请记住,您要安装的任何程序也会占用您的虚拟硬盘空间!
我选择了“动态分配”作为存储细节,但这可能不适合您。一个动态分配的文件会随着你存储数据而增长。它开始很小,但它会成长。另一方面,固定大小的文件将立即占据您指定的大小。尽管这种类型的文件最初会占用更多的空间,但它会产生较少的开销。这意味着它实际上稍微快一点。
单击“创建”创建您的新虚拟机!现在你会看到你的新机器列在你的 VirtualBox 窗口的左侧。
是时候开始操作系统安装了!配置好虚拟机后,安装向导将关闭,您将返回 VirtualBox 主窗口。双击左边的新机器(或者确保它已被选中,然后单击“开始”)。
要从映像文件(这就是我们有的)安装,请单击文件夹图标浏览您的文件。你正在寻找我们的微软下载。选择该文件并单击“开始”
现在您的安装将开始!一旦完成,你就可以开始了。
恭喜你!
你现在是一台运行在你的 Mac 上的 Windows 机器的骄傲的主人了!
在你设置的时候,确保你把你的虚拟机当成一台完全独立的计算机。这会帮助你避免沮丧。当你运行你的虚拟机时,它完全独立于你的真实计算机。您无权访问相同的文件和文件夹。即使你点击鼠标也不会在你的电脑和虚拟机之间来回移动,除非你这样设置。
最终细节
双击 VirtualBox 屏幕左侧的机器,或者在任何想要运行机器的时候单击机器并点击“开始”。
将会打开一个窗口,您将会看到全新的 Windows 机器。真正启动并运行可能需要几秒钟(或几分钟)。如果一开始感觉有点慢或者有故障,深呼吸几次。
一旦你的新 Windows 机器开始运行,继续点击窗口中的任何地方来唤醒它。它会要求您输入用户名和密码。你可以在官方安装文档中随时找到这些。(你的用户名是“IEUser”,密码是“Passw0rd!”但是你可以在控制面板的“用户帐户”下随时更改)
当你第一次启动你的机器时,窗口非常小。您可以按正常方式扩展窗口,但它不太可能会调整大小以适应最初的大小。你可以通过从视图菜单中选择“缩放模式”来实现。如果您想忽略纵横比,请在调整窗口大小时按住 shift 键。
首先,当你在虚拟机上工作时,它会“拥有”你的键盘和鼠标。您可以在窗口的右下角看到从虚拟机切换到常规操作系统所需的命令。在虚拟机运行时,您还可以选择在两者之间来回移动鼠标,方法是转到屏幕顶部的输入并选择“鼠标集成”
移动文件
在设置好我的虚拟机后,我需要快速抓取一些我下载到 Mac 上的文件和程序。这是一个小紧急情况,没有时间进行研究。这可能不是将您的信息从 Mac 转移到 Windows 机器的最佳方式(反之亦然),但我发现将我的文件上传到 OneDrive 是从 Mac 上获取我需要的内容的最简单、最快的方法。它已经安装好了,可以在 Windows 机器上运行了。注册 OneDrive 既快又免费。
这肯定不是唯一的解决方案,但如果你很着急,它就在这里。(如果你目前没有存储问题,Dropbox 也可以工作得很好……)
快照
VirtualBox 允许您复制虚拟机的确切状态。允许你在任何时候回到那个状态。这对于测试软件或其他配置非常有用。您可以通过点按“机器”菜单并选择“拍摄快照”来拍摄快照该快照将被添加到 VirtualBox 菜单左侧的虚拟机列表中。您可以通过右键单击快照并选择“恢复”来恢复快照恢复快照时,自创建快照以来对虚拟硬盘所做的任何更改都将丢失。
停工
关闭虚拟机时,您有几个不同的选项。每一种对机器的影响都有所不同。当您关闭虚拟机窗口时,您会看到几个选项。您可以选择:
- **保存机器状态。**这将虚拟机保存为您关闭时的状态。您正在运行的任何程序都将保存为其当前状态,当您再次启动机器时,一切都将恢复。
- **发出关机信号。**这将向虚拟机发送一个关机信号,它将像你按下物理计算机上的电源按钮一样关机。
- **关闭机器电源。**这将关闭机器的电源,就像切断了计算机的电源一样。什么都不会被保存。
你做到了!
恭喜你!!!你现在是一台免费 Windows 机器的骄傲拥有者,你可以在你的 Mac 上随时运行它!在这里你几乎可以做任何事情。开始玩吧!
和往常一样,如果你用这些信息做了什么惊人的事情,请在下面的评论中让每个人都知道,或者随时在 LinkedIn @annebonnerdata 上联系。
感谢阅读!如果你想接触或找到更多酷的文章,请来和我一起在内容简单!
如何在 Windows 环境下安装 OpenAI Gym
一步一步的指导如何建立和运行 OpenAI 健身房
这是关于强化学习和 OpenAI 健身房系列文章的第二篇。第一部分可以在这里找到。
介绍
OpenAI Gym 是一个非常棒的工具,它使业余和专业的计算机科学家有可能实验一系列不同的强化学习(RL)算法,甚至有可能开发他们自己的算法。
OpenAI Gym 旨在成为 RL 研究的标准化环境和基准,是一个 Python 包,包含一系列 RL 环境,从简单的“玩具”环境到更具挑战性的环境,包括模拟机器人环境和 Atari 视频游戏环境。
该软件包唯一的缺点是,尽管世界上超过 80%的台式机和笔记本电脑都运行 Windows 操作系统,但 OpenAI Gym 只支持 Linux 和 MacOS。
然而,仅仅因为 OpenAI Gym 不支持 Windows,并不意味着你不能让 OpenAI Gym 在 Windows 机器上工作。在这篇文章中,我将提供如何在我的 Windows 10 PC 上安装和运行 OpenAI Gym 的说明。
注意:这些指令足以让 OpenAI Gym 的算法、玩具文本、经典控制、Box2D 和 Atari 环境工作。OpenAI Gym 还包括 MuJoCo 和机器人环境,允许用户使用 MuJoCo 物理模拟器进行实验。然而,要运行这些环境,你还需要安装 MuJoCo 这将花费你至少 500 美元购买一年的许可证(除非你是学生)。
说明
这些说明假设您的计算机上已经安装了 Python 3.5+。
步骤 1:安装用于 Visual Studio 2017 的 Microsoft Visual C++构建工具
如果你的电脑上还没有,安装Microsoft Visual c++ Build Tools for Visual Studio 2017。这可以在这里免费下载。
您需要将页面向下滚动到“Visual Studio 2017 工具”部分。
步骤 2:安装所有必要的 Python 包
鉴于 OpenAI Gym 在 Windows 环境中不受支持,我认为最好将其设置在单独的 Python 环境中。这是为了避免潜在地破坏我的主要 Python 安装。
在 Conda 中,可以使用下面的命令(在终端或 Anaconda 提示符下)来实现这一点:
conda create -n gym python=3 pip
这个命令创建一个名为“gym”的 Conda 环境,它运行 Python 3 并包含 pip 。
如果您在创建 Conda 环境时没有安装 pip ,那么您试图在该环境中安装的任何包都将被全局安装到您的基本 Python 环境中,而不仅仅是本地安装到该环境中。这是因为在您的本地环境中不存在一个版本的 pip 。
要激活新的环境类型:
activate gym
接下来运行以下命令:
pip install gym
这是 OpenAI 健身房的最小安装。
conda install pystan
这是运行 ToyText 环境所必需的。
conda install git
pip install git+https://github.com/Kojoley/atari-py.git
这是运行 Atari 环境所必需的。
conda install swig
pip install Box2D
这是运行 Box2D 环境所必需的。
pip install gym[all]
这将安装剩余的 OpenAI Gym 环境。可能会出现一些错误,但请忽略它们。
pip install pyglet==1.2.4
pip install gym[box2d]
最后两行是必要的,以避免 Pyglet 和 Box2D 环境中可能出现的一些错误。
一旦你完成了这些,安装你希望在 Conda 环境中安装的任何其他 Python 包。
步骤 3:安装 Xming
在你的电脑上安装 Xming,可以从这里免费下载。
第四步:开始跑步
每次您想要使用 OpenAI Gym 时,在启动 Python IDE 之前,通过在 Windows 命令提示符下输入以下命令来启动 Xming running:
set DISPLAY=:0
第五步:测试
要测试新的 OpenAI Gym 环境,请运行以下 Python 代码:
如果一切都设置正确,应该会弹出一个窗口,显示在 Cart Pole 环境中进行的 1000 次随机操作的结果。
为了测试其他环境,将代码第 3 行中的“CartPole-v0”替换为环境名。比如《Taxi-v2》《太空入侵者-v 0》《lunar lander-v2》。
你可以在 OpenAI 健身房网站这里找到所有可用环境的名称和描述。
结论
如果你遵循了这些说明,你现在应该已经成功地在你的电脑上运行 OpenAI Gym 了。然而,现在它已经开始运行了,你用它做什么呢?
在我的下一篇文章中,我将介绍如何将这个令人兴奋的工具应用于强化学习问题。
想了解更多关于价值驱动的数据科学? 加入我的邮件列表,让我的最新文章和建议直接发送到你的收件箱。
如何在远程机器上安装 PySpark
简单的方法。
Spark, Wikipedia.
假设您想在使用 python 的机器上运行 Spark。要做到这一点,您需要在机器上运行 PySpark,并在 Jupyter 或 python 中使用它,这需要在您的 shell 中进行一些安装和调试。我使用下面的过程解决了这个问题,成功地安装了 PySpark 并在 Jupyter 实验室中运行了演示代码。此程序旨在使用股票张量流 1.14 引导映像在基于 Gloud 的机器上执行,但是,这些指令也应该在本地机器上工作。
安装 Java 1.8
- 网上说很多版本都有兼容性问题,所以请安装 java 1.8:
sudo apt 更新
2.检查您的 java 版本
java 版本
3.如果没有安装 Java,请执行以下操作
apt 安装 openjdk-9-jre-headless
4.验证 java 的版本
java 版本
5.您应该会得到与此类似的结果:
openjdk 版本" 1.8.0_222"
OpenJDK 运行时环境(build 1 . 8 . 0 _ 222–8u 222-b10–1 ~ deb9u 1-b10)
open JDK 64 位服务器 VM (build 25.222-b10,混合模式)
6.(可选)如果显示另一个版本的 java,请执行以下操作并选择指向 java-8 的版本。
sudo 更新-备选方案-配置 java
输出:
There are 2 choices for the alternative java (providing /usr/lib/java).Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/lib/java/java-11-openjdk-amd64/bin/java
1 /usr/lib/java/java-11-openjdk-amd64/bin/java
2 /usr/lib/java/java-8-openjdk-amd64/jre/bin/java Press <enter> to keep the current choice[*], or type selection number:
7.找到 java.home 在哪里
Java-XshowSettings:properties-version 2 > & 1 >/dev/null | grep ’ Java . home ’
8.(或者)您可以设置 JAVA_HOME
导出 JAVA _ HOME = " $(/myJavaHome/JAVA _ HOME-v 1.8)"
或者创建并添加到~/。bash _ profile
然后
来源。bashrc
此时,您应该已经有了 java_home 目录,您可以开始安装 PySpark,过程是类似的,因此,我们还需要找到 Spark 的安装位置。
安装 PySpark
- pip 安装以下项目:
pip3 安装 findspark
pip3 安装 pyspark
2.找到 pyspark 在哪里
pip3 显示 pyspark
输出:
名称:pyspark
版本:2.3.1
摘要:Apache spark Python API
主页:https://github.com/apache/spark/tree/master/python
作者:Spark 开发者
作者-邮箱:dev@spark.apache.org
许可:http://www.apache.org/licenses/LICENSE-2.0
位置:/usr/local/lib/Python 3.5/site-packages 需求:py4j
至此,我们已经拥有了所需的一切,只需在下面的代码中替换主目录指针并运行演示程序。
初始化:
下面是在您的代码中配置一切,使用之前为 PySpark & Java 找到的主目录信息。
导入 findspark
导入 OS
spark _ HOME = ’ mySparkLocation ’
JAVA _ HOME = ’ myJavaHome ’
OS . environ[’ JAVA _ HOME ']= JAVA _ HOME find spark . init(spark _ HOME = spark _ dir)
演示:
如果一切配置正确,这个演示将工作,祝你好运:)
从 pyspark.sql 导入 pyspark
导入 spark session
spark = spark session . builder . getor create()
df = spark . SQL(" select ’ spark ’ as hello ")
df . show()
spark . stop()
参考
Ori Cohen 博士拥有计算机科学博士学位,主要研究机器学习。他是 TLV 新遗迹公司的首席数据科学家,从事 AIOps 领域的机器和深度学习研究。
如何为 AWS Lambda 层安装 Python 包
关于如何使用 Docker 容器为 AWS Lambda 层构建 Python 包的指南。
Image Source: bvoyles4 from Pixabay (Modified by Author)
Lambda 及其层
当我第一次听说 AWS Lambda 时,我对它是什么感到非常困惑,并试图用它来训练一个简单的 ML 模型,但遇到了 5 分钟的执行限制。快进几年,我相信 Lambda 已经发展了很多,人们对事件驱动系统和无服务器计算的理解也是如此。它已经成为许多现代应用程序和数据架构师的一部分。
在 re:Invent 2018 上,Lambda 进行了大量的定制运行时改进,并将执行运行时限制增加到 15 分钟。 Lambda Layers 也发布了,它允许你共享公共依赖项,以简化 Lambda 部署规模和更新。然而,AWS 仍然没有解决友好步骤的需求,以引入非原生 python 包**,例如熊猫。**
引入外部包的麻烦方法…
目前,你要么压缩你的 Lambda 函数和 Linux 兼容的依赖项,要么上传你的依赖项作为 Lambda 层。如果你以前玩过 Google Cloud Functions 和 Azure Function,你会知道这就像在requirements.txt
中写一个愿望清单一样简单。
为了增加额外的复杂性,一些 Python 包需要编译 C 或 C++ 扩展(包如 Numpy 和 Pandas)。如果你想用你的 macOS 或 Windows 机器来pip install -t . pandas
然后为 Lambda 层压缩它们,这是一个亚马逊 Linux 环境,这可能有点麻烦。
有几种方法可以引入 Linux 兼容的依赖项,无论是通过无服务器还是使用 EC2 实例。现在,如果你以前读过我的一些博客,我真的很喜欢在黑客马拉松中使用 Lambdas,因为时间是关键,我想向你展示如何使用 Docker 将 Python 依赖作为 Lambda 层的最简单和最快的方式。
5 个简单的步骤:
1.建设
希望你已经设置了 Docker,但是如果你没有,那么一定要先设置。你要做的第一件事是使用一个 Amazon Linux 作为基本映像,并用几个实用程序、 python3.7 和 Virtualenv 创建一个 Dockerfile。
**FROM** **amazonlinux:2.0.20191016.0****RUN** yum install -y **python37** && \
yum install -y **python3-pip** && \
yum install -y **zip** && \
yum clean all**RUN** python3.7 -m pip install --upgrade pip && \
python3.7 -m pip install **virtualenv**
运行下面的命令来创建带有标签的 docker 文件。
usr> **docker build** -f **"<filename>.Dockerfile"** -t **lambdalayer:latest .**
2.奔跑
你应该可以通过做docker images
看到图像。在那之后,你想要撞击你的容器。
usr> **docker run** -it --name lambdalayer **lambdalayer:latest** **bash**
3.安装
在您的容器中创建一个新的虚拟环境来隔离您的 python 环境,并重用同一个容器,而不用担心全局安装破坏东西。您可以为每个依赖项创建一个容器,但是时间是关键…
bash> **python3.7** -m venv **pandas**
我把它命名为熊猫,你可以叫它任何你想要的名字,但是一定要激活它,把你的包安装到一个特定的文件夹中,然后再去激活它。
bash> **source pandas/bin/activate** (pandas) bash> pip install **pandas** -t **./python** (pandas) bash> deactivate
4.包裹
这些包及其依赖项应该已经安装在 python 文件夹(或您的特定文件夹)中。现在您可以将该文件夹压缩为python.zip
并退出容器。您需要将压缩文件夹复制到本地环境中,以便将其上传到 Lambda 图层或 S3。
bash> **zip** -r **python.zip** ./python/usr> **docker cp** lambdalayer:python.zip ./Desktop/
5.上传
如果你的压缩文件大于 50mb,那么你需要把它上传到 S3,而不是直接上传到 Lambda 层。一定要记录下 S3 对象的网址。
就这样,现在你有 Pandas(和 Numpy)作为你的 Python Lambda 的一部分作为一个层使用,如果你想创建一个部署包,那么一定要把你的 Lambda 函数代码作为一个.py
文件添加到压缩文件夹中。
λ层的限制
您需要了解一些限制,包括:
- 每个 Lambda 最多只能使用 5 层。
- 解压缩后的所有图层的大小不能超过 250mb。
- 层安装在函数执行环境中的/opt 目录中,因此如果您要有多个函数,请确保正确地对函数进行分层。
部署 Lambda
请随意查看我的文章关于如何使用无服务器或 AWS SAM 将 Lambda(和 Pandas)部署到 AWS。
关于我
我喜欢写媒体文章,并为知识共享社区做贡献。除了尝试新的食物配方,我还帮助企业构建云和数据解决方案。请随时与我联系并向我问好!
——李帝努·雅玛
如何安装 R 和 RStudio?
Photo by Cris DiNoto
R 和 RStudio 是什么?
稀有
统计程序 R 只不过是一种编程语言,主要用于数据操作和执行统计分析。在撰写本文时,这种语言是统计学中的主要程序之一,尽管不是统计学家使用的唯一编程语言。
为了使用 R,我们需要两样东西:
- 用于编写代码的文本编辑器
- 运行这段代码的地方
RStudio
这就是 RStudio 派上用场的地方。
RStudio 是 R. R 和 RStudio 协同工作的集成开发环境(IDE)。R 是一个运行你所有代码的程序,RStudio 是另一个可以让你以更舒适友好的方式控制 R 的程序。RStudio 的优势在于,它既提供了一个用于编写代码的强大文本编辑器,又提供了一个运行在该编辑器中编写的代码的地方。
出于这些原因,我强烈推荐使用 RStudio 而不是 R。我每天都使用 RStudio(而不是 R ),你会看到这个博客上所有的文章都是用 RStudio 写的。
请注意,RStudio 需要预先安装 CRAN 提供的 R 软件才能正常工作。仅仅在个人电脑上安装 RStudio 是不够的。请参阅下一节,了解如何安装两者。
如何安装 R 和 RStudio?
你可以在 https://cran.r-project.org/mirrors.html下载 R。选择离你的国家最近的 CRAN mirror 网站。如果您所在的国家有多个链接,只需选择一个:
Select the CRAN mirror site closest to your country
然后在标有“下载并安装 R”的框中(位于顶部),单击与您的操作系统(Windows、Mac 或 Linux)对应的链接:
Click on the link corresponding to your operating system
现在 R 已经安装在您的计算机上,您可以下载 RStudio 了。可以下载免费版的 RStudio(对绝大多数用户来说完全够用,包括我!)在他们的网站上。
RStudio 的主要组件
现在,这两个程序都已经安装在您的计算机上,让我们深入了解 RStudio 的主要组件。
默认情况下,RStudio 窗口有三个窗格:
- 控制台(红色窗格)
- 环境(绿色窗格)
- 文件、图、帮助等。(蓝色窗格)
RStudio window
控制台(红色窗格)是您可以执行代码的地方(稍后会有关于红色和蓝色窗格的更多信息)。默认情况下,文本编辑器不会自动打开。要打开它,点击文件>新建文件> R Script,或者点击左上角标有绿色小叉的按钮,然后点击 R Script:
New R script in RStudio
一个新的窗格(下面的橙色部分),也称为文本编辑器,将会打开,您可以在其中编写代码。代码将被执行,结果显示在控制台(红色窗格)中。
Write and execute your code in RStudio
请注意,您也可以在控制台(红色窗格)中编写代码。但是,我强烈建议在文本编辑器(橙色窗格)中编写代码,因为您可以保存在文本编辑器中编写的代码(并在以后再次执行),而不能保存在控制台中编写的代码。
要执行在文本编辑器(橙色窗格)中编写的代码,您有两种选择:
- 键入您的代码,然后按“运行”按钮(见下文)或使用键盘快捷键 CTRL+Enter(Mac 上为 cmd + Enter)。只有光标所在的代码块会被执行。
- 键入代码,在文本编辑器中选择要执行的部分,然后按“运行”按钮或使用键盘快捷键 CTRL+Enter(Mac 上为 cmd + Enter)。所有选择的代码将被执行
Run code in RStudio
例如,尝试在文本编辑器中键入1+1
,点击“运行”(或 CTRL/cmd + Enter)来执行。您应该会在控制台中看到结果2
,如下图所示:
Example of code executed in RStudio
文本编辑器和控制台是您最常用的窗格。然而,在使用 RStudio 时,其他两个窗格(前面介绍的蓝色和绿色窗格)仍然非常有用。
环境(绿色窗格)显示 RStudio 存储的所有值。例如,如果您键入并执行代码a = 1
,RStudio 将为a
存储值1
,如下图所示:
Environment pane in RStudio
这意味着您现在可以使用a
执行任何计算,因此如果您执行a + 1
,RStudio 将在控制台中呈现2
。在该窗格中,您还可以看到一个标签,其中包含所执行代码的历史记录和一个用于导入数据集的按钮(更多信息请参见在 RStudio 中导入数据集)。
最后一个窗格(蓝色)是你可以找到所有其他东西的地方,比如你的文件、图表、软件包、帮助文档等等。我在这里更详细地讨论了文件选项卡,所以让我们讨论一下其他选项卡:
- 绘图:您将看到渲染的绘图。例如,运行
plot(1:10)
,您应该会在这个选项卡中看到它。如果您绘制了多个图,您可以通过单击箭头在它们之间导航。您可以通过单击缩放在新窗口中打开绘图,并通过单击导出导出您的绘图。这些按钮位于绘图选项卡的正下方(见下图) - 软件包:在这里你可以看到所有已安装的软件包。r 只提供基本的功能,其他的都必须从包中安装。提醒一下 R 是开源的;每个人都可以编写代码并作为一个包发布。然后,您就可以免费使用这个包(以及这个包中内置的所有功能)。一些包是默认安装的,所有其他的包必须通过运行
install.packages("name of the package")
来安装(不要忘记在包的名字后面加上""
!).软件包安装后,您必须加载软件包,只有在它被加载后,您才能使用它包含的所有功能。要加载一个包,运行library(name of the package)
(这一次包名两边的""
是可选的,但是如果你愿意,仍然可以使用)。您还可以通过 packages 选项卡下的按钮来安装和加载软件包。为此,单击“软件包”下的“安装”按钮,键入要安装的软件包的名称,然后单击“安装”。您将看到代码出现在控制台中。要加载软件包,请在“软件包”窗口中找到您要加载的软件包(您可以使用搜索框),然后单击软件包名称旁边的复选框。同样,代码在控制台中运行。如果需要,请参见下图。请注意,您只需安装一次软件包、 1 ,但每次打开 RStudio 时都会加载软件包**。此外,请注意,安装软件包需要互联网连接,而加载软件包则不需要** - 帮助:为 r 编写的所有函数的文档。要访问函数的帮助,运行
help("name of the function")
或简单的?name of the function
。例如,要查看关于均值函数的帮助,运行?mean
。将光标放在某个函数上时,也可以按 F1
Plot buttons in RStudio
Step 1: click on the Install button
Step 2: type the name of the package and click on Install
Step 3: load your package by clicking on the box next to the package’s name
代码示例
现在您已经安装了 R 和 RStudio,并且知道了它的主要组件,下面是一些基本代码的例子。更多高级代码和分析在其他关于 R 的文章中介绍。
计算器
计算 5÷5
5 * 5## [1] 25
计算
1 / sqrt(50 * pi) * exp(-(10 - 11)^2 / 50)## [1] 0.07820854
如您所见,有些值(如π)是默认存储的,因此您不需要指定它的值。请注意,RStudio 区分大小写,但不区分空间。这意味着pi
与Pi
不同,但5*5
给出的结果与5 * 5
相同。
评论
要在代码中添加注释,请在代码前使用#
:
# A comment
# Another comment
1 + 1## [1] 2
存储和打印数值
注意,为了在对象内部存储一个值,使用=
或<-
是等效的。然而,我建议使用<-
来遵循 R 编程的准则。您可以随意命名您的对象(在我们的例子中是 A 和 B)。但是,建议使用简短的名称(因为您很可能会多次键入这些名称),并避免使用特殊字符。
A <- 5
B <- 6
存储值时,RStudio 不会将其显示在控制台上。要在控制台中存储并打印一个值,请使用:
(A <- 5)## [1] 5
或者:
A <- 5
A## [1] 5
向量
也可以通过函数c()
(c 代表合并)在一个对象中存储多个值。
A <- c(1 / 2, -1, 0)
A## [1] 0.5 -1.0 0.0
矩阵
或者通过matrix()
创建一个矩阵:
my_mat <- matrix(c(-1, 2, 0, 3), ncol = 2, nrow = 2)
my_mat## [,1] [,2]
## [1,] -1 0
## [2,] 2 3
您可以通过?matrix
或help("matrix")
访问该功能的帮助。请注意,在一个函数中,可以有多个由逗号分隔的参数。在matrix()
内部,第一个参数是向量c(-1, 2, 0, 3)
,第二个是ncol = 2
,第三个是nrow = 2
。对于 RStudio 中的所有函数,您可以通过函数内的顺序或参数名称来指定参数。如果您指定参数的名称,顺序不再重要,因此matrix(c(-1, 2, 0, 3), ncol = 2, nrow = 2)
相当于matrix(c(-1, 2, 0, 3), nrow = 2, ncol = 2)
:
my_mat2 <- matrix(c(-1, 2, 0, 3), nrow = 2, ncol = 2)
my_mat2## [,1] [,2]
## [1,] -1 0
## [2,] 2 3my_mat == my_mat2 # is my_mat equal to my_mat2?## [,1] [,2]
## [1,] TRUE TRUE
## [2,] TRUE TRUE
生成随机值
基于均值μ=400、标准差σ=10 的正态分布生成 10 个值:
my_vec <- rnorm(10, mean = 400, sd = 10)
# Display only the first 5 values:
head(my_vec, 5)## [1] 397.5906 394.1163 395.8203 395.1248 397.3691# Display only the last 5 values:
tail(my_vec, 5)## [1] 411.7824 402.6334 399.0726 399.9974 398.0901
你会有不同于地雷的价值,因为它们是随机产生的。如果你想确保总是有相同的随机值,使用set.seed()
(括号内有任何数字)。例如,对于下面的代码,无论何时何地运行,都应该有完全相同的值:
set.seed(42)
rnorm(3, mean = 10, sd = 2)## [1] 12.741917 8.870604 10.726257
情节
plot(my_vec,
type = "l", # "l" stands for line
main = "Plot title",
ylab = "Y-axis label",
xlab = "X-axis label"
)
这只是对 RStudio 可能性的非常有限的介绍。如果你想了解更多,我建议你阅读与 R 相关的其他文章,从如何导入 Excel 文件或如何操作数据集开始。
感谢阅读。我希望这篇文章能帮助你安装 R 和 RStudio。
和往常一样,如果您有与本文主题相关的问题或建议,请将其添加为评论,以便其他读者可以从讨论中受益。
相关文章:
- 安装和加载 R 包的有效方法
- 我的数据服从正态分布吗?关于最广泛使用的分布以及如何检验 R 中的正态性的注释
- R 中的 Fisher 精确检验:小样本的独立性检验
- R 中独立性的卡方检验
- 如何在简历中创建时间线
原载于 2019 年 12 月 17 日https://statsandr.com。
如何在 UBUNTU 18.04 上安装 TensorFlow GPU
在教授计算机和机器人如何看待世界、理解世界,并最终在物理和虚拟领域执行复杂任务的热潮中,人工智能领域的进展速度是最激烈的争论之一。这个行业发展的速度和目的通常不仅仅是通过实际的产品进步和研究里程碑来衡量,还通过人工智能领导者、未来学家、学者、经济学家和政策制定者的预测和表达的担忧来衡量。人工智能将改变世界——但如何以及何时改变仍然是个悬而未决的问题。
大多数已经在装有 Nvidia GPU 的台式机/笔记本电脑上训练机器学习模型的用户由于安装 TENSORFLOW 的 GPU 版本的困难而与 CPU 妥协。在对安装过程进行了一些研究后,我正在编写我在装有 nvidia 930MX 的笔记本电脑上尝试过的程序。
为什么是 TensorFlow? TensorFlow 是机器学习的端到端开源平台。它有一个全面、灵活的工具、库和社区资源的生态系统,让研究人员推动 ML 的最新发展,让开发人员轻松构建和部署 ML 驱动的应用程序。
让我们从安装过程开始
步骤 1: Nvidia 驱动程序
第一步是检查你是否安装了 nvidia 驱动程序。
您可以通过在终端中键入以下命令来检查。
英伟达-smi
如果你的系统已经检测到 nvidia 驱动,那么你会看到一些类似的输出。
nvidia output for my gpu drivers.
如果你还没有安装显卡驱动,我建议你从官方网站安装驱动,然后输入上面的命令重新检查。
可选的,如果你不能找到你的 gpu 的图形驱动程序,那么你可以尝试下面的过程。
转到软件和更新->附加驱动程序->在那里您可以找到您的驱动程序。选择驱动程序—使用 NVIDIA 驱动程序元包,然后单击应用更改。
Ubuntu 18.04 Additional Drivers settings
正如你可以检查有一个驱动程序安装的系统默认选项,但你可以看到我已经手动安装了我的图形驱动程序。我强烈建议手动安装 gpu 驱动程序。
如果你正试图安装来自。运行文件,然后你可能会面临与“新内核驱动程序”的冲突,不要强迫安装在这种情况下。先把司机加入黑名单。这是强制性的,因为它会阻止内核使用你的 gpu 资源。
将下面的命令加入黑名单。
回显选项 nouveau modeset = 0 | sudo tee-a/etc/modprobe . d/nouveau-kms . conf
之后,运行
sudo update-initramfs-u
要更新 initframs
,请再次尝试安装驱动程序。
步骤 2:安装 NVIDIA CUDA
CUDA 是 NVIDIA 开发的并行计算平台和编程模型,用于图形处理单元(GPU)上的一般计算。有了 CUDA,开发人员就可以利用 GPU 的强大功能,大幅提高计算应用的速度。
在 GPU 加速的应用中,工作负载的顺序部分在 CPU 上运行(针对单线程性能进行了优化),而应用的计算密集型部分在数千个 GPU 内核上并行运行。当使用 CUDA 时,开发人员使用 C、C++、Fortran、Python 和 MATLAB 等流行语言编程,并通过几个基本关键字形式的扩展来表达并行性。
访问 nvidia 官方网站为您的操作系统下载 cuda。
选择适当的操作系统版本、发行版、版本,并选择安装程序类型为 deb(本地)
你需要下载 cuda deb 文件(1.6GB)并按照上面提到的步骤安装。
第三步:安装深度神经网络库(cuDNN)
NVIDIA CUDA 深度神经网络库(cuDNN)是一个针对深度神经网络的 GPU 加速原语库。cuDNN 为标准例程提供了高度优化的实现,例如前向和后向卷积、池化、规范化和激活层。
全球深度学习研究人员和框架开发人员依赖 cuDNN 进行高性能 GPU 加速。这使得他们可以专注于训练神经网络和开发软件应用程序,而不是花时间在低级别的 GPU 性能调优上。cuDNN 加速了广泛使用的深度学习框架,包括 Caffe 、 Caffe2 、 Chainer 、 Keras 、 MATLAB 、 MxNet 、 TensorFlow 、 PyTorch 。要访问 NVIDIA 优化的深度学习框架容器,该框架已将 cuDNN 集成到框架中,请访问 NVIDIA GPU CLOUD 了解更多信息并开始使用。
转到https://developer.nvidia.com/cudnn并下载(需要登录和协议)。
登录并接受协议后。
根据上一步安装的 CUDA 版本选择合适的 cuDNN 开发者库(deb 文件)。
I have used cuDNN Developer Library for Ubuntu18.04 (Deb)
运行以下步骤来安装 cuDNN 库。
sudo dpkg-I</PATH/to/cud nn _ file . deb> 如果安装时出现 cupti 依赖项错误,则使用下面的命令安装 cupti 依赖项:
sudo apt-get install libcupti-dev
echo ’ export LD _ LIBRARY _ PATH =/usr/local/cuda/extras/CUPTI/lib64:$LD _ LIBRARY _ PATH '>>~/。bashrc
第四步:最后安装有 GPU 支持的 TENSORFLOW
pip install --upgrade tensorflow-gpu
步骤 5:检查安装
**验证 TensorFlow 安装:**请执行以下 Python 代码来验证您的 TensorFlow 安装:
python -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())
执行上述命令后,您将收到类似于我的输出的输出,如下所述。
2019-04-17 23:10:19.343549: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2019-04-17 23:10:19.377027: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2400000000 Hz
2019-04-17 23:10:19.377323: I tensorflow/compiler/xla/service/service.cc:150] XLA service 0x56231cab6c90 executing computations on platform Host. Devices:
2019-04-17 23:10:19.377360: I tensorflow/compiler/xla/service/service.cc:158] StreamExecutor device (0): <undefined>, <undefined>
2019-04-17 23:10:19.427725: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:998] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-04-17 23:10:19.428532: I tensorflow/compiler/xla/service/service.cc:150] XLA service 0x56231cbb9310 executing computations on platform CUDA. Devices:
2019-04-17 23:10:19.428551: I tensorflow/compiler/xla/service/service.cc:158] StreamExecutor device (0): GeForce 930MX, Compute Capability 5.0
2019-04-17 23:10:19.428797: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1433] Found device 0 with properties:
name: GeForce 930MX major: 5 minor: 0 memoryClockRate(GHz): 1.0195
pciBusID: 0000:01:00.0
totalMemory: 1.96GiB freeMemory: 1.50GiB
2019-04-17 23:10:19.428833: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1512] Adding visible gpu devices: 0
2019-04-17 23:10:19.429703: I tensorflow/core/common_runtime/gpu/gpu_device.cc:984] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-04-17 23:10:19.429717: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990] 0
2019-04-17 23:10:19.429744: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1003] 0: N
2019-04-17 23:10:19.429924: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/device:GPU:0 with 1307 MB memory) -> physical GPU (device: 0, name: GeForce 930MX, pci bus id: 0000:01:00.0, compute capability: 5.0)
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 7335559256733264271
, name: "/device:XLA_CPU:0"
device_type: "XLA_CPU"
memory_limit: 17179869184
locality {
}
incarnation: 5312720144392370303
physical_device_desc: "device: XLA_CPU device"
, name: "/device:XLA_GPU:0"
device_type: "XLA_GPU"
memory_limit: 17179869184
locality {
}
incarnation: 4529346810094966789
physical_device_desc: "device: XLA_GPU device"
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 1370750976
locality {
bus_id: 1
links {
}
}
incarnation: 2845160405845590596
physical_device_desc: "device: 0, name: GeForce 930MX, pci bus id: 0000:01:00.0, compute capability: 5.0"
]
结论
我真的希望这篇指南能帮助你在装有 nvidia 显卡的机器上安装 TensorFlow GPU。如果您在安装过程中发现任何困难,请告诉我。
谢谢;)
如何在 Python Pandas 中内插时间序列数据
Time Series Interpolation for Pandas: Eating Bamboo Now — Eating Bamboo Later (Photo by Jonathan Meyer on Unsplash)
注:熊猫 0.20.1 版(2017 年 5 月)更改了分组 API。这篇文章反映了更新版本的功能。
任何处理数据的人都知道现实世界中的数据通常是不完整的,清理数据会占用你大量的时间(有人知道 80/20 法则吗?).最近从 Pandas 搬到 Pyspark,我已经习惯了 Pandas 提供的便利,而 Pyspark 由于它的分布式特性有时会缺乏这些便利。我特别欣赏的一个特性是 Pandas 提供的内插(或填充)时间序列数据的直接方式。这篇文章旨在使用在一组房屋中收集的传感器读取数据的示例,以简单易懂的方式展示这种能力。这篇文章的完整笔记本可以在我的 GitHub 中找到。
准备数据和初步可视化
首先,我们用一些测试数据生成一个熊猫数据帧 df0。我们创建了一个包含两个房屋的模拟数据集,并使用 sin 和 cos 函数为一组日期生成一些传感器读取数据。为了生成缺失值,我们随机丢弃一半的条目。
data = {'datetime' : pd.date_range(start='1/15/2018',
end='02/14/2018',
freq='D')\
.append(pd.date_range(start='1/15/2018',
end='02/14/2018',
freq='D')),
'house' : ['house1' for i in range(31)]
+ ['house2' for i in range(31)],
'readvalue' : [0.5 + 0.5*np.sin(2*np.pi/30*i)
for i in range(31)]\
+ [0.5 + 0.5*np.cos(2*np.pi/30*i)
for i in range(31)]}df0 = pd.DataFrame(data, columns = ['readdatetime',
'house',
'readvalue'])# Randomly drop half the reads
random.seed(42)
df0 = df0.drop(random.sample(range(df0.shape[0]),
k=int(df0.shape[0]/2)))
生成的表格如下所示:
Raw read data with missing values
下图显示了生成的数据:一个 sin 和一个 cos 函数,两者都有大量缺失的数据点。
我们现在来看三种不同的内插缺失读取值的方法:前向填充、后向填充和内插。请记住,为每项任务选择合适的插值方法至关重要。特别是对于预测任务,我们需要考虑在进行预测时是否有插值数据。例如,如果你需要插值数据来预测天气,那么你不能用明天的天气来插值今天的天气,因为明天的天气还是未知的(合乎逻辑,不是吗?).
插入文字
为了对数据进行插值,我们可以使用 groupby()- 函数,然后是 resample() 。但是,首先我们需要将读取的日期转换为 datetime 格式,并将它们设置为数据帧的索引:
df = df0.copy()
df['datetime'] = pd.to_datetime(df['datetime'])
df.index = df['datetime']
del df['datetime']
因为我们想分别对每栋房子进行插值,所以在使用带有选项“D”的 resample() 函数将数据重新采样到每日频率之前,我们需要按“房子”对数据进行分组。
下一步是使用均值填充、前向填充或后向填充来确定新生成的网格应该如何填充。
平均值()
因为我们使用 mean() 方法进行严格的上采样,所以所有缺失的读取值都用 nan 填充:
df.groupby('house').resample('D').mean().head(4)
Filling using mean()
pad() —向前填充
使用 pad() 代替 mean() 向前填充 NaNs。
df_pad = df.groupby('house')\
.resample('D')\
.pad()\
.drop('house', axis=1)
df_pad.head(4)
Filling using pad()
bfill() —反向填充
使用 bfill() 代替 mean() 后向填充 NaNs:
df_bfill = df.groupby('house')\
.resample('D')\
.bfill()\
.drop('house', axis=1)df_bfill.head(4)
Filling using bfill()
插值()-插值
如果我们想要对缺失值进行插值,我们需要分两步来完成。首先,我们通过使用 *mean()生成底层数据网格。*这会生成以 NaNs 为值的网格。然后,我们通过调用 read value 列上的 interpolate() 方法,用插值填充 nan:
df_interpol = df.groupby('house')\
.resample('D')\
.mean()
df_interpol['readvalue'] = df_interpol['readvalue'].interpolate()
df_interpol.head(4)
Filling using interpolate()
可视化结果
最后,我们可以可视化三种不同的填充方法,以更好地了解它们的结果。不透明点显示原始数据,透明点显示插值。
我们可以看到,在上面的图中,间隙是如何用先前已知的值填充的,在中间的图中,间隙是如何用即将到来的现有值填充的,在下面的图中,差异是线性插值的。由于插值过程的线性,请注意插值线中的边缘。根据任务的不同,我们可以使用高阶方法来避免这些问题,但是对于这篇文章来说这样做太过分了。
Original data (dark) and interpolated data (light), interpolated using (top) forward filling, (middle) backward filling and (bottom) interpolation.
摘要
在这篇文章中,我们看到了如何使用 Python 的 Pandas 模块,通过回填、前向填充或插值方法来插值时间序列数据。
原载于 2019 年 1 月 14 日https://walken ho . github . io。
如何使用 scikit-learn 评估二元逻辑回归
为这个 python 函数添加书签,它使评估您的二进制分类器变得容易。
功能概述
逻辑回归因其可解释性而成为一个有价值的分类器。这个代码片段提供了一个剪切和粘贴功能,当逻辑回归用于二元分类问题时,该功能显示了重要的指标。这里的一切都是由 scikit-learn 提供的,但是如果没有这个助手函数,手动调用和可视化会非常耗时和重复。
***【evalBinaryClassifier()***将拟合的模型、测试特征和测试标签作为输入。它返回 F1 分数,并打印密集输出,包括:
- 标有数量和文本标签的完整混淆矩阵(例如“真阳性”)
- 两类预测概率的分布
- ROC 曲线,AUC,以及沿着混淆矩阵和分布所代表的曲线的决策点
- 精确度、召回率和 F1 分数
有关如何解释这些输出的说明,请跳到代码块后面的。
必需的进口:
例句用法:
输出:
代码
解释:
左图:混淆矩阵
混淆矩阵将模型做出的预测描述为正确或错误。它将这些与真实的真相进行比较。一个完美的模型只有真正的正面和真正的负面。一个完全随机的模型将有相似数量的所有 4 个类别。
如果你有一个阶级不平衡的问题,通常你会看到很多负面的(真的和假的)和很少正面的,反之亦然。(关于这方面的一个很好的例子,请看我关于预测颠覆的项目。)
中心图:预测的分布
中间的图表是正面结果的预测概率分布。例如,如果您的模型 100%确定样本为阳性,则它将位于最右侧的箱中。两种不同的颜色表示真实的类,而不是预测的类。一个完美的模型将显示绿色和红色分布之间没有任何重叠。一个完全随机的模型将会看到它们彼此完全重叠。
决策边界决定模型的最终预测。在 scikit-learn 中,默认的决策边界是. 5;也就是说,高于 0.5 的预测为 1(正),低于 0.5 的预测为 0(负)。这是理解你的模型和 ROC 曲线的一个重要细节。
右图:ROC 曲线
接收机工作特性曲线描述了所有可能的 决策界限。绿色曲线表示可能性,以及不同决策点的真阳性率和假阳性率之间的权衡。这两个极端很容易理解:您的模型可以对所有样本延迟预测 1,并获得完美的真阳性率,但它也会有 1 的假阳性率。类似地,你可以通过懒惰地预测所有事情都是负面的来将你的假阳性率降低到零,但是你的真阳性率也将是零。你的模型的价值在于它增加真阳性率比增加假阳性率更快的能力。
一个完美的模型应该是 y 轴上的一条垂直线(100%真阳性,0%假阳性)。一个完全随机的模型将位于蓝色虚线上(找到更多的真阳性意味着找到相同数量的假阳性)。
Left: a perfect model; Right: a purely random model
蓝点代表当前确定混淆矩阵的 0.5 决策边界。
当一种错误类型比另一种更糟糕时,更改这一点是调整模型敏感度的有效方法。举个例子,医疗保健充满了这样的决定:错误地诊断癌症要比错误地诊断健康好得多。在这种情况下,我们需要一个非常低的决策边界,也就是说,只有在我们非常确定的情况下,才预测一个阴性结果(没有癌症)。
如果使用相同的模型选择不同的边界(例如:0.3 而不是 0.5),蓝点将沿着绿色曲线向右上方移动。新的边界意味着我们将捕获更多的真阳性,也将捕获更多的假阳性。这也很容易想象为中间图表中的蓝线向左移动,直到它位于 0.3:边界右侧会有更多的“绿色”箱,但也会有更多的“红色”箱。
scikit-learn 没有调整决策边界的内置方法,但这可以通过对您的数据调用 predict_proba() 方法来轻松完成,然后根据您选择的边界手动编码一个决策。
这对你理解你的模型有帮助吗?还能改进吗?请告诉我,我很乐意收到你的来信!
如何在咨询公司面试
咨询公司寻找一种特殊的数据科学家。以下是你如何为他们的面试做准备。
经过一番催促,我们最终决定公开专业数据科学家和他们的学员之间关于 SharpestMinds 内部松弛的一些对话。我们希望这将让更多的人从 SharpestMinds 的专业知识中受益,即使他们不能直接进入社区。
一个公司需要解决的问题决定了他们问应聘者的面试问题。所以,如果你准备去一家公司面试,你会想确保你留出一些时间对这些问题进行研究,这样你就可以对这些问题做出有根据的猜测。
幸运的是,有很多公司都会遇到类似的问题,能够识别这些公司可以大大提高你为面试做好充分准备的机会。其中一类是咨询公司,这是上个月在sharpes mindsSlack 上通过一位匿名学员提出的话题,我们称她为狄奥多里克:
第一个答案是对预期结果的高度概括:
另一件要记住的重要事情是:应用研究和项目的重要性,正如夏普明德的校友(现在是 IQVIA 的数据科学家🚀) Karthik Viswanathan 指出:
狄奥多里克补充了更多的背景知识(注意,他是通过询问面试他的公司获得这些信息的——这总是一个好的步骤!):
SharpestMinds 的导师 Ryan Kingery 也顺道来访,对咨询公司提出了警告。虽然我个人没有他那么强烈的感觉,但我肯定从很多其他人那里听到过这种情绪,所以如果你正在考虑咨询角色,这是值得考虑的事情:
Alum(现在是数据科学家) Khain Win 也有一些关于咨询作为以用户为中心的活动的好建议…
…以及一些如何说面试官语言的好建议:
就这样结束了!
想要更多吗?
我们每隔几周发布一份时事通讯,其中包含关于如何在数据科学领域找到工作的对话和提示。你可以在 https://sharpestminds.substack.com/查看一个例子
可以在推特上关注 Jeremie()@ Jeremie charris)或者 sharpes minds(@ sharpes mindsai)。
原载于 2019 年 12 月 11 日https://blog.sharpestminds.com。