使用 Julia 语言和 Jupyter 笔记本开始数据可视化
使用 Julia 和 Jupyter,您几乎不需要任何编程知识就可以制作出令人印象深刻的数据可视化。
不久前,我写了一篇关于使用 Julia 和在线 Jupyter 笔记本环境 JuliaBox 进行数据可视化的文章。当时 JuliaBox 是一项免费服务;不幸的是,情况不再是这样了——它不贵,但也不是免费的。
这是那篇文章的一个新版本,你可以使用你自己的 Jupyter 笔记本环境(这个环境是免费的)。你需要安装 Jupyter 笔记本,Julia 语言,然后配置它们以便 Jupyter 了解 Julia。
如果这听起来很复杂,别担心,一点也不复杂。
Jupyter 笔记本
你首先需要的是一个 Jupyter 笔记本。如果你已经安装了,那就太好了。如果没有,你应该遵循这篇文章:
## 使用 Anaconda 为数据可视化设置 Jupyter 笔记本
(这篇文章关注的是 Python,但是因为 Jupyter 要求安装 Python,所以这里没有什么不相关的。)
朱莉娅
Julia 是一种相对较新的数据分析语言。它有一个高级语法,旨在易于使用和理解。有人称之为新 Python。
然而,与 Python 不同的是,它是一种编译语言,这意味着尽管它像 Python 一样容易编写,但它运行得更快,因为它被转换为更容易被计算机理解的低级代码。如果您必须处理需要大量处理的大型数据集,这非常有用。
与 Python 相比,Julia 对程序的布局也没有那么挑剔。
Julia 拥有现代编程语言的所有特性,但是在这里,我们将看看 Julia 的数据可视化能力。这些既令人印象深刻又易于使用。
一旦你安装了 Julia 和 Jupyter,你就可以创建运行 Julia 代码的 Jupyter 笔记本,执行它们并导出为 HTML。您可以将可视化保存为标准的 png 文件,并将其保存到您的文档中。
如果您想完成本文中的示例,可以下载数据文件和 Jupyter 笔记本,用于您自己的设置。我会把链接放在文章的最后。
安装 Julia
要安装 Julia,你需要去 https://julialang.org/的下载适合你操作系统的版本。安装很简单,只需按照说明操作。
一旦你安装了它,你需要做几件事情。因此,启动 Julia,您将在如下窗口中看到命令提示符:
第一件事是允许朱庇特和朱莉娅互相交谈。在提示符下键入此内容,然后按:
using Pkg
这告诉 Julia 您将使用包管理器。然后键入以下内容并点击:
Pkg.add("IJulia")
IJulia 是将 Jupyter 和 Julia 联系起来的包裹。您可能需要等待它下载和安装。
一旦你安装了 IJulia,你就可以用 Jupyter 打开一个新的笔记本,用 Julia 代替 Python。
现在你需要添加几个我们将在教程中用到的包。键入以下几行:
Pkg.add("Plots")
和
Pkg.add("CSV")
和
Pkg.add("DataFrames")
稍后您将会用到这些软件包。
现在,您可以通过执行以下命令来关闭 Julia:
exit()
或者简单地关上窗户。
现在你可以开始了!所以,使用 Julia 作为内核,启动一个 Jupyter 笔记本,开始行动吧。
朱莉娅·图斯
与大多数其他语言一样,Julia 依赖于特定专业用途的代码库。我们最初感兴趣的一个叫做图。这为我们提供了创建数据可视化的能力。
所以我们需要执行的第一段代码是这样的:
using Plots
当你在笔记本的代码单元中输入这个代码并按下 ctrl/enter 执行它时,它会告诉 Julia 加载我们将用来创建可视化的库。
当您第一次执行笔记本中的单元格时,可能需要一点时间来执行。这是因为 Julia 代码是在第一次执行时动态编译的。后续的代码运行要快得多。
可视化数据使您有机会深入了解数据元素之间的关系,从而…
projectcodeed.blogspot.com](https://projectcodeed.blogspot.com/2020/02/plotting-with-pandas-introduction-to.html)
你的第一次想象
我通常将不同的代码放入笔记本的新单元中。这意味着我只需要运行我需要的代码,而不是整个笔记本。我建议你也这样做,所以在一个新的单元格中我键入了下面的代码:
x = 1:10; y = rand(10); # These are the plotting data
plot(x,y, label="my label")
运行它产生了下图:
第一次朱莉娅可视化
令人印象深刻。让我解释一下这是怎么回事。
x = 1:10;y =兰特(10);#这些是绘图数据
这位代码创建两位数据,一位称为
x ,另一位称为 y 。 x 被赋予从 1 到 10 的数字范围的值,而 y 被赋予 10 个伪随机数的范围(每个伪随机数将具有 0 到 1 之间的值)。因此,我们在这里有一个图形的基础:一个范围从 1 到 10 的 x 轴和 x 轴上每个点的 y 值。
下一步很简单。
plot(x,y,label= “我的标签”)
这段代码调用一个函数来绘制图表,我们所做的就是给它 x 和 y 值——另外,我们还给它一个标签。
这很简单,但是,当然,我们真的想可视化一些真实的数据。
我有几个表,我在其他文章中用过。这是一组关于过去几十年英国伦敦天气的数据。我是从英国气象局提供的公共表格中推导出来的。
数据记录了每个月记录的最高温度、最低温度、降雨量和日照时数。我有两个文件,一个是完整的数据集,一个是 2018 年的,只有。它们是 CSV 格式的,就像您可以导入到电子表格中一样。
为了处理这些文件,我们需要另一个允许我们读取 CSV 文件的库。
我们可以看到在下一段代码中引用的库,即using CSV
,下面一行实际上是将数据读入变量d
,这是一个 DataFrame。
using CSV
d = CSV.read("london2018.csv", DataFrame)
运行代码的结果是,我们现在有了一个如下所示的数据表:
来自有意义数据的图表
我们下载的数据是一个表格,有 6 栏:Year
、Month
、Tmax
(最高温度)、Tmin
(最低温度)、Rain
(降雨量毫米数)和Sun
(日照时数)。
这是数据的子集(仅针对 2018 年),因此Year
列在所有行中具有相同的值。
条形图
所以,我们有的是 2018 年每个月的数据。如果我们想在柱状图中绘制每个月的最高温度,我们可以这样做:
bar(d.Month, d.Tmax)
bar 是一个绘制条形图的函数(还有什么?)并且我们提供了 x 和 y 轴的列。我们通过使用数据表的名称,后跟列的名称来实现这一点。这两个名字用一个点隔开。
这里,我们将列Month
作为 x 轴,将Tmax
作为 y 轴,因此我们在表格中绘制了 12 个月中每个月的最高记录温度。
将它放入一个新的代码单元并运行它,您会惊喜地(我希望)看到这个图表:
条形图
折线图
如果你想制作一个折线图,你可以做同样的事情,但是使用函数plot
plot(d.Month, d.Tmax)
折线图
如果您想在同一张图表上绘制最高和最低温度,您可以这样做:
plot(d.Month, [d.Tmax, d.Tmin], label=["Tmax","Tmin"])
请注意,d.Tmax
和d.Tmin
*,*这两个值在方括号中组合在一起,并用逗号分隔。这是向量或一维数组的符号。此外,我们还为线条添加了标签,这些标签以相同的方式分组。我们得到了这样一个图表:
散点图
或者散点图怎么样?散点图通常用于查看是否可以在数据中检测到模式。这里我们绘制了最高温度与日照时数的关系图。正如你所料,这是一种模式:一种明显的相关性——日照时间越长,气温越高。
scatter(d.Tmax, d.Sun)
圆形分格统计图表
我们拥有的数据并不适合被描绘成饼图,所以我们将再次生成一些随机数据— 5 个随机数。
x = 1:5; y = rand(5); # These are the plotting data
pie(x,y)
柱状图
现在,我们将加载更多的数据:
d2 = CSV.read("londonweather.csv"`, DataFrame)
这类似于我们一直使用的数据表,但更大,因为它涵盖了几十年的数据,而不仅仅是一年。这给了我们大量的降雨量数据,这样我们就可以看到伦敦在一段较长的时间内的降雨量分布。
histogram(d2.Rain, label="Rainfall")
这是结果。
保存图表
在 Jupyter 环境中看到这些图表当然很好,但是为了有用,我们需要能够保存它们以便在我们的文档中使用它们。
您可以像这样保存图表:
histogram(d2.Rain, label="Rainfall")
savefig("myhistogram.png")
运行此代码时,不会显示图表,但会以给定的文件名保存。
结论
我希望这是有用的——我们已经查看了 Julia Plots 中可用的基本图表。朱莉娅的故事远比我们在这篇短文中看到的要多,你也可以用情节做更多的事情,但我希望你已经发现这篇介绍已经激起了你探索更多的欲望。
下载
右键单击下面的三个链接下载文件,然后将它们复制到 Jupyter 将使用的目录中。然后在你的文件列表中打开 plotweatherjulia.ipynb 。
笔记本在这里: plotweatherjulia.ipynb
而数据文件在这里: london2018.csv 和 londonweather.csv
一如既往,感谢阅读。如果你想知道我什么时候发表新文章,请考虑在这里注册一个电子邮件提醒。
如果你不是一个媒体订阅者,那就注册吧,这样你就可以每月花 5 美元阅读尽可能多的文章。在这里注册我会赚一点佣金。
从深度学习开始
我对深度学习教育的动机、经历和未来计划。更新于 2023 年。
图片:大卫·库伯
我在 2023 年反思我在机器学习方面的旅程,我对自从我的第一篇文章以来发生的进步和演变感到惊讶。ChatGPT 和 Dalle-2 正在带来新一轮的创造力和创新,新的人工智能工具正在以令人难以置信的速度发布。
无论背景如何,机器学习和深度学习知识对每个人来说都变得越来越重要。现在,作为一名商业创新和设计思维教练,我相信设计思维和以人为中心的创新和增长方法将导致深度学习解决方案的发展,通过确保以将人类体验放在第一位的方式发展深度学习,推动业务增长和改善人们的生活。让我们努力让所有人都能接受这种教育。
我的第一篇文章介绍了机器学习的基础工作;学习 Python、探索性数据分析、机器学习实践和机器学习理论。我已经达到了很高的知识水平,是时候进入计划的下一阶段了。练习我的机器学习技能,进入深度学习。
这篇更新的文章涵盖了我的动机,深度学习的解释,理论和实践的推荐课程,云平台,人工智能治理和人工智能伦理。
为什么要深度学习?
我一直有强烈的持续学习的愿望,我把深度学习看作是新的挑战和成长的机会。
我认为深度学习是一种可以增强人类能力的工具,可以将理论转化为实践,用以人为本的价值观解决实际问题。
在我的深度学习教育之初,知道从哪里开始是相当令人生畏的。这是一个庞大的主题,很容易陷入困境,并对众多的主题和数学感到沮丧。关键是坚持不懈。
什么是深度学习?
深度学习的定义引发了很多争论。尽管如此,就目前而言,“深度学习是基于人工神经网络的更广泛的机器学习方法家族的一部分”。(维基百科)
近年来深度学习的爆发是由三件事促成的,即大量可用数据、计算能力的提高和算法创新。
深度学习的例子:
- 自动驾驶汽车,物体检测,决策。
- 物体分类,视觉搜索,人脸识别。
- 自然语言处理、垃圾邮件过滤器、Siri、Alexa 或谷歌助手。
- 大型语言模型。达尔-E 2。
- 医疗保健。核磁共振扫描,CT 扫描,记录分析。
神经网络是什么样子的?
谷歌开发了这个游乐场,你可以在浏览器中“修补”神经网络。查看操场 TensorFlow 网站。
来源维基百科。
我的深度学习方法
我的深度学习方法有三重,理解足够的理论来解释算法,学习编码,然后实践它们。这种方法让我进入了深度学习专业(理论),Fast。Ai(编码)和 Kaggle(实践)。
Coursera 上的 Deeplearning.ai 专业
吴恩达最初的机器学习课程清晰、结构良好,并且让数学变得可以理解。这让我有信心用吴恩达的最新专业来处理深度学习。
深度学习专业涵盖了神经网络的构建模块、卷积神经网络(例如图像识别、放射学成像)、序列模型(例如语音识别、聊天机器人、语言处理)、关于如何改进您的模型的建议(超参数调整)、构建您的深度学习项目和机器学习策略。
编程练习是用 Python 编写的,有助于阐明讲座的内容。你将建立一个神经网络,图像分类,面部识别,自然语言处理和触发词检测(例如嘿 Siri 或 Alexa)。用数学而不是编程库来构建神经网络提供了某种程度的理解,这是一些更实用的课程所没有涵盖的。虽然这种深度可能不是必需的,但了解幕后发生的事情是有用的。
在 16 周的时间里,这五门课程是分层进行的,但是你可以按照自己的进度来学习。这种专业化教授深度学习最重要和最基本的原则。如果你是一个严格的动手学习者,那么这个课程不适合你。这门课程中理论的融合是对实用的 Fast.ai 课程的补充。
面向编码人员的 Fast.ai 实用深度学习
fast . ai Coders v3 实用深度学习是一门免费的实践课程,旨在教人们用 Python、最先进的深度学习技术编写代码。Fast.ai 旨在通过免费课程、研究和社区让更多来自各种背景的人参与进来,让深度学习更容易使用。引用《斋戒》。Ai 网站。“我希望很多人会意识到,深度学习的最先进成果是他们可以实现的,即使他们不是斯坦福大学深度学习博士。”
Fast.ai 涵盖数据清洗、图像分类、多标签分类;分段 NLP 表格数据;协同过滤;嵌入,规范化,数据伦理和剩余网络。
没有正式的编程练习或测验。尽管如此,我们还是鼓励你根据课堂上学到的知识来设计你的项目。使用最新的艺术技术和内置的 Fast.ai 库,你会学到如何编写你的模型。fast.ai 库建立在开源 PyTorch 库之上。两节课之后,我在 AWS Sagemaker 上写了我的图像分类器。
有一个强大的社区来帮助你应对挑战,并对你的工作提出批评。如果你是一个实践型的学习者,这门课程是为你而设的,即使涉及了反向传播等技术,它们实际上是相对于基础数学而言的。
卡格尔
在深度学习专业化的中途,我休息了一下,并参加了 Kaggle 上的一些机器学习比赛。Kaggle 是一个数据科学社区,拥有强大的工具和资源来帮助您实现数据科学目标。
Kaggle 是测试你技能的好方法。每场比赛都有一个排行榜,个人或团队可以在这里相互竞争。此外,还有一些成功代码的例子,可以帮助您在这个数据科学的熔炉中发展技能。
有四个初学者比赛。数据分类:预测房价。使用手写数字的图像识别和自然语言处理来分析推特上的情绪。来自 Fast.ai 的杰瑞米·霍华德自己也是一名 Kaggle 大师,他建议“如果你很优秀,你应该进入比赛的前 10%”。
我的第一个分数让我进入了前 73%,这是我在长时间学习后的一次觉醒!经过深夜的反复尝试,我达到了我现在满意的分数水平!
- 机器学习分类介绍。前 5% 749/16523
- 高级回归技术预测销售价格最高 14% 605/4550
- 计算机视觉手写数字识别器前 16% 335/2230
- 预测推特结果的自然语言处理。前 44% 1472/3423
你能从 Kaggle 身上学到什么?
数据准备的重要性不可低估。学习如何清理数据、特征工程、变换、随机化、训练/测试分割对你的输出有巨大的影响。
你如何选择和训练合适的模型?不同的算法用于不同的任务。
评估和调整模型的技巧。关于选择正确指标和超参数调整艺术形式的建议
不要为了那 10%而掉进兔子洞
摘要
Deep learning.ai 和 Fast.ai 将一切解释得如此清楚,以至于你有足够的信心拿起代码和算法并开始使用它们。学习、实践和强化我的知识的最佳方式来自于在 Kaggle 的两门课程和数据科学竞赛之间的交替。
云平台
在某些时候,你的家用电脑将不会快到足以运行深度学习模型。这里有两个选项可以缓解这种情况。
首先,您可以降低模型的复杂性,减少训练数据集或微调参数和超参数。
第二,买个图形处理器。好消息是,您不需要购买 GPU,云中的每个人都可以使用企业级 GPU,但要小心成本!
Google CoLab :这是一个免费的平台,可以访问 Google 的计算、GPU 和 Python 库 Keras、TensorFlow、PyTorch 和 OpenCV。
Kaggle :拥有免费的编码环境,每月获得 30 个小时的 GPU 时间。对于初学者来说,这就足够了,在我看来。
Azure Studio :这消除了数据工程和 Python 编码的复杂性,给业余数据分析师和数据科学家一种更自然的方式来建立模型。Azure 将根据你的容量收费,因此为了降低成本,请确保关闭实例。
AWS sage maker——是一个多合一的人工智能平台。您可以使用 AWS 模型,构建您自己的模型或使用 AWS 托管您的模型。像 Azure 一样,您也可以获得企业级图形处理能力,并且根据处理单元和内存的类型,会有一定的成本。为了降低成本,请确保在完成时关闭实例。我创建了一个简单的 AWS Lambda 作业,以特定的时间间隔关闭我的笔记本。
Kaggle 和 AWS Sagemaker 最适合我的教育工作流程和体验。我在一台笔记本电脑上开发了代码,运行了一个小的训练/测试集,修复了错误,进行了调优,然后上传到两个平台中的任意一个,进行更大的训练/测试集和进一步的调优。
深度学习的设计思维
人工智能有可能极大地改善我们的生活。尽管如此,重要的是要记住,人工智能是人类为人类设计和创造的。设计思维是一种以人为中心的创新和发展方式。它基于对客户需求的理解、创造性想法的产生和快速原型制作。设计思维平衡合意性、可行性和生存能力,以确保深度学习解决方案对客户来说是合意的,在技术上是可行的,并且可以成为可行的、可持续的商业模式。这使得组织可以根据客户的需求而不是历史数据或高风险的赌注来做出决策。
它包括几个步骤,包括提出问题、与客户共情、构思、原型制作、测试、训练模型,以及持续评估和改进解决方案。当应用于深度学习管道时,设计思维确保重点应放在使用数据科学和深度学习来增强人类的能力和体验,以人为中心的设计原则和隐私及道德的重要性为指导。
人工智能治理和人工智能伦理
这里的课程会让你对机器学习和深度学习如何工作有深入的技术理解。当你开始在现实世界中进行机器学习和深度学习时,强大的治理和道德监督是无法在以后添加的。
有越来越多的工具和信息可以帮助组织理解和实施稳健的治理和道德监督。所有这些网站都有附加内容的链接。
世界经济论坛人工智能工具包
该工具包有关于治理、道德、风险、网络安全等方面的深入信息。该工具包详细介绍了采用人工智能的董事会责任。
有原则的人工智能有八个关键主题。隐私、问责制、安全和安保、透明度和可解释性、公平和不歧视、人的控制、职业责任和促进人的价值。
该团队致力于探索人工智能对现实世界的影响这一复杂的伦理和社会问题。
“通过对道德标准和安全的正确关注,我们有更好的机会发现人工智能的潜在好处。通过研究涉及人工智能的道德和社会问题,我们确保这些主题仍然是我们所做一切的核心。”(深以为然)。
接下来是什么?
在机器学习中,有一个概念叫做过度拟合,这是指你的模型与训练数据拟合得太好,无法对测试数据进行概括。换句话说,我该暂时把学习放在一边了。是时候专注于探索机器学习和深度学习的现实应用,以继续培养我的技能。
如果你想建立你的数字业务,请联系我这里david@davidkolbconsultancy.com或者发邮件给我这里大卫·库伯
从机器学习开始
我对机器学习教育的动机、经验和未来计划 2023 年更新。
图片:大卫·库伯
在我 2018 年休假结束时,我承诺继续探索新技术,我开始研究机器学习。
回想起来,我从未想过那段旅程会把我带到哪里。快进到今天,我已经完成了深度学习的课程,进入了一个简单机器学习竞赛的前 10%,并获得了 AWS 机器学习专业认证。这段经历既有挑战性又有收获,我渴望与那些刚刚开始 ML 旅程的人分享我的见解和成长。这是我 2022 年的原创文章。
我渴望更多地了解这个领域及其潜力,很快就被它的细节淹没了。机器学习是一个庞大的话题,知道从哪里开始是非常令人生畏的。你从数学还是代码开始?我需要博士学位吗?
在一次失败的开始后,我学到了三件事:不要试图学得这么快,从一些好的学习材料开始,练习,练习,再练习。这些都是比较明显的,但是在我渴望进步的时候,我忘记了这些学习原则。
人工智能无处不在,各公司都把自己的运营模式押在了这上面。人工智能将在夺走我们工作的同时丰富我们的生活,这是商业中最热门的话题,而且已经缺乏技能。我觉得是时候对这个领域有更好的技术理解了,从机器学习开始。
《人工智能的超能力》的作者李开复将当前的时刻描述为“实施的时代”,技术开始“溢出实验室,进入世界”找到正确水平的机器学习信息是困难的。要么是覆盖广义机器学习的高级文档,要么是详细的解释。它导致了许多孤立地难以理解的数学、长方程和机器学习概念。
为什么我想学习机器学习?
我一直有强烈的持续学习的愿望,我将机器学习视为新的挑战和增长机会。
使用机器学习作为增强人类能力的工具,将理论转化为实践来解决实际问题。
用 Python、Udemy 进行机器学习、数据科学和深度学习
新的!针对 2019 年冬季进行了更新,增加了关于特征工程、正则化技术和调整神经网络的额外内容…
www.udemy.com](https://www.udemy.com/course/data-science-and-machine-learning-with-python-hands-on/)
我开始上这门课是因为我以前上过弗兰克·凯恩的课,我喜欢实用的方法。他在亚马逊和 IMDB 的经历提供了可以应用机器学习的真实世界的例子。这门课程没有对机器学习算法进行学术的、深入的数学覆盖,重点是广泛的实践理解,以及它的应用。
这门课程将教你选择和清理数据的技术,监督和非监督的机器学习算法,如何评估指标,深度学习和神经网络。该课程确实提供了 Python 的概述,这就足够了,但是非编码人员应该在此之前考虑 Python 课程。弗兰克几乎涵盖了你在深入这个领域之前需要了解的所有话题。
密歇根大学 Python 专业应用数据科学
密歇根大学专业的 5 门课程通过 python 向学习者介绍了数据科学
www.coursera.org](https://www.coursera.org/specializations/data-science-python)
因为我是 Python 的新手,所以我参加了这个课程,以使我的 Python 技能适合数据科学。有一些 Python 专门化。由于我不想专注于某个特定的平台,这个平台吸引了我的注意力,因为它不是(IBM/Google/AWS)。这是一个五门课程的专业,侧重于编程,而不是理论或数学。
这门课程教会了我数据操作和数据清理技术,绘图和数据表示。它涵盖了机器学习,自然语言处理和社会网络,图论与 Python 库 scikit-learn,自然语言工具包(NLTK)和 NetworkX。
每门课程都建立在另一门的基础上,当你在这个系列中前进时,你将建立在这些技术之上。这些作业是相互评分的,让你从不同的角度看人们是如何处理同一个问题的。
Andrew NG 机器学习,斯坦福大学 Coursera
机器学习是让计算机在没有明确编程的情况下行动的科学。在过去的十年里…
www.coursera.org](https://www.coursera.org/learn/machine-learning)
我参加 Andrew NG 课程的动机是了解机器学习的本质以及算法背后的直觉。这门课程被认为是对机器学习背后的理论和概念的最好介绍之一。它涵盖了监督学习,非监督学习,深度网络和最佳实践,而不会让你被底层数学淹没。
完成这门课程不需要深入的线性代数或微积分知识。尽管如此,如果你想学习数学,这门课程将为进一步的训练提供基础。编程作业在 Octave 或者 Matlab。虽然用 Python 编写会更好,但编写一个实际的算法并看到它工作是非常令人满意的。这种详细程度有助于您更好地理解像 scikit-learn 这样的 Python 机器学习库。
这个球场周围有一个杰出的社区。这些论坛为你将会遇到的许多问题提供了详细的解释,这是对我所学的更实用的课程的完美补充。
你需要数学吗?
当我开始机器学习时,我的目标是学习足够的数学来理解和编码算法。我采取按需学习数学的方法,首先让自己熟悉算法,然后研究它们背后的数学,最后将算法翻译成代码。我最终理解了基本的线性代数和基本的微积分,理论和实践达到了平衡。
如果数学是一个挑战,从学习线性回归和逻辑回归算法开始。这些将向您介绍成本/损失函数和梯度下降,并为其他算法提供基础。一个很好的建议是在 Excel 中算出算法,这帮助我克服了一些更具挑战性的概念。
也就是说,数学只是机器学习整体应用的一部分。在这个行业多年,我倾向于同意,对于从业者来说,机器学习的主要先决条件是数据分析。这就是领域经验领域专业知识胜过数学的地方。能够识别问题、选择目标和指标、收集和清理数据构成了机器学习应用程序的大部分。
编程;编排
最初编码算法是令人沮丧的,但坚持下去,因为它有助于加强理解。如果你不熟悉 Python,我建议你从额外的课程开始。其中包括用于数据操作和分析的 pandas、用于多维数组和矩阵的 numpy 以及用于数据可视化的 matplotlib。这将为您完成上述课程奠定基础,并开始您的 Python 机器学习之旅。
以人为中心的人工智能
人工智能有可能极大地改善我们的生活。必须记住,人工智能是人类为人类设计和创造的。以人为中心的设计是一种将人放在设计过程最前沿的方法。当应用于人工智能时,这种方法可以确保人工智能产品和服务专注于人类的联系、体验和需求。
人类设计包括移情、定义、构思、原型和测试。这个过程鼓励协作、试验和迭代,以达到以人为中心的、创新的、可取的、可行的和可行的解决方案。
如果你想建立你的数字业务,请联系我这里大卫·库伯或者发电子邮件给我这里david@davidkolbconsultancy.com
下一步是什么?
你可以在下一篇博文中关注深度学习的进展。深度学习起步。
播客
为了补充我的学习,我使用这些音频播客。
机器学习指南,培训课程的绝佳补充。
数据怀疑论播客,涵盖机器学习概念的精美迷你剧集。
TWIML(本周机器学习),与行业从业者的良好对话。
网站
当你的 Python 代码不工作时的堆栈溢出
《媒体上的数据科学》有大量不同层次的机器学习主题的摘要。
Kaggle 是数据科学家和机器学习从业者的在线社区,你也可以参加他们的比赛来测试你的掌握程度。
3BLUE1BROWN 系列如果真的想深入线性代数和微积分的话。
Cassie Kozyrkov 在 Medium 上发表了关于机器学习的严肃观点。
汗学院对线性代数和微积分的另一种观点。
社会影响评价中的 GIS-云集成
从零开始…在疫情的中间。
现在我们开始看到隧道的尽头,经济和社会后果开始出现,不仅对经济的稳定,而且对我们的社会福利制度的稳定构成严重威胁。
回顾 2012 年,在完美经济风暴期间,我发起了一项提案,为马德里的一个相关非政府组织实施一个关于地理信息系统(GIS)的试点项目。
尽管 2012 年和 2020 年的危机起源不同,但两者在社会经济层面的影响可以作为案例研究。
数据库的管理、其与 GIS 平台(如 Esri 的 ArcGIS )的兼容性以及预测模型的开发是试点项目开发过程中出现的几个挑战之一。
在过去十年中,数据库管理和处理领域以及地理信息系统平台方面的技术进步取得了巨大进步,特别是结合了云平台等技术里程碑的发展。
地理信息系统平台已证明其在报告疫情演变能力方面的有用性。照片:克莱班克斯。去飞溅
现在,在新冠肺炎造成的复杂背景下,我想知道云平台的兴起如何帮助研究和分析疫情在社会经济层面的影响。
在云平台上开发的新应用能否为新冠肺炎社会经济影响的 GIS 研究中的大数据管理、预测分析、人工智能或人工智能提供解决方案?
社会影响评估中的地理信息系统(SIA)
由硬件、软件和地理参考数据集成的地理信息系统优化了与非营利组织活动的地理规划有关的问题的解决方案。
在这方面,地理信息系统支持该组织开展的咨询、分析和研究,缩短了分析人员在研究不平等和贫困问题上花费的时间。这优化了组织的生产力和效率。
在 2012 年经济危机最糟糕的时刻,许多慈善和非营利组织在缓冲西班牙经济危机的影响方面做了大量得到认可的工作。此外,对该国城市地区的贫困和社会不平等进行了许多研究。
这意味着这些组织必须在其不同的行政管理级别(如街道、社区、地区)处理大量数据。
这些组织每年生成的信息给分析人员带来了各种各样的困难,特别是在数据处理和解释方面。这主要是由于组织活动产生的数据的数量、异质性和多样性。
事实上,近年来出现了几个专门为非政府组织使用 GIS 技术的机构,以填补直到最近还不存在的空白。
我的建议侧重于为该组织的活动管理实施一个地理信息系统平台,包括其数据管理规划和外部开发战略。
在非政府组织内部管理和操作大量数据的过程中实施地理信息系统,有助于以更有效的方式优化宝贵的资源,并更好地了解其活动产生的信息。
此刻,全世界的注意力都集中在一件事上:新冠肺炎疫情。卡通正在适应它的…
www.cartong.org](https://www.cartong.org/)
除了优化信息和大数据的管理之外,GIS 为非政府组织提供的另一个好处是,从质量上提高了非政府组织宣传该地区慈善过程以及该组织所做的任何其他工作产生的影响和外联效益的能力。
在这方面,在采用 GIS 平台之前,在基于网络的 GIS 社会影响评估中有三个关键因素需要考虑**。**
通过识别管理和操作中的困难,优化组织的内部数据库,并通过促进持续更新,促进其在未来 GIS 项目中使用的标准化。
通过设计和实施与地图生成一样灵活的沟通策略**,加强组织工作的沟通,让更多潜在受众了解非政府组织所做工作的范围。**
在分析、管理和组织的数据生产过程中引入新的信息技术工具。地理信息系统将允许在第一阶段确定与该组织的数据管理有关的问题。
云的影响
从大数据和工业生产力解决方案到人工智能(AI)和机器学习(ML)应用的开发,云技术已经成为不同行业不同用途的关键基础设施。
例如,在教育部门,通过响应与在线教育相关的临时需求,大数据管理的发展显示了最相关的云平台特性之一,即灵活性**。**
此外,医疗保健等战略行业的大数据管理是云技术最有趣的方面之一。患者信息的保护和 GDPR 的实施直接影响到医院备份向云的渐进迁移,以及医院网络从云中生成的异构数据的管理。
除了灵活性,更值得注意的方面是云平台的可扩展性和可靠性**。这一点在管理大量异构数据时尤为明显,例如公共或私人医疗保健系统。医院备份迁移、客户行为预测模型开发、营销活动或零售消费者研究中的成本节约是一大优势。**
成本节约、灵活性、无缝维护和易于部署,使云平台成为社会经济、环境和战略基础设施管理等领域 GIS 分析发展的最佳选择。
云平台在 3D 制图的最新发展中展示了它们的潜力。来源:吉斯格罗
GISers 的新机遇
“云 GIS 可以定义为在可扩展的弹性环境中使用虚拟化平台或基础设施的下一代按需 GIS 技术”。
(相关: 云 GIS 定义 )
毫无疑问,云平台为现有技术和基于众所周知的概念(如 GIS)的新兴技术带来了新的机遇。
云技术彻底改变了 GIS 分析师的工作方式。尽管 GEO 部门在其工作流程中采用云平台的速度很慢,但大量 GIS 组织和咨询公司已经将项目转移到了云上。
在地图中生成的大数据现在可以在云中实时管理,由于有了云,最近只为桌面开发的工具现在可以在 Web-GIS 版本中使用。
许多在云中开发的应用程序现在允许管理大型 GIS 数据库存储。
例如,开发机载栅格技术的公司就属于这种情况,这些公司不仅将云作为向客户提供更快、更简单服务的基础,还将其作为在不同领域开发新的有用应用的结构,例如工程和复杂基础设施的维护。
GISGRO 智能易用的基础设施管理在线平台。使用 GISGRO 建立一个数字孪生…
www.gisgro.com](https://www.gisgro.com/?gclid=CjwKCAjwi_b3BRAGEiwAemPNUxEDd2gGX6SU6t8BdUrXjHf2a9xc7x26NaQ3rzOJMuBIi3nWBWtAfhoC5LcQAvD_BwE)
3D 建模技术广泛应用于灾害和应急管理,特别是在需要快速有效评估的世界偏远地区。
云-GIS 集成的其他优势:
处理大量数据、应用程序、地理空间分析的可能性,以及与其他用户实时共享它们的可能性。
**投资回报(ROI)优化。**共享和发布地图的时间更少,数据/地图始终可用;
能够选择各种部署、服务和业务模式以最适合组织的目标。
可用性 24H/7 :在未来的地理信息系统项目中,非政府组织将可以在任何时候访问从创建的图层生成的文件,以促进可用性。
在这一点上,实施云技术是有意义的。这将节省外包工作的成本,该机构在未来完全可以做得很好。
建议优先采用 GIS-云模型
在云平台中实施基于 web 的 GIS 之前,要考虑的最重要的方面总结如下:
a)组织活动领域的活动定义。这将允许管理层优化所需的潜在资源。
b)详细了解该组织的工作、空间和主题,详细描述该地区不同行政级别慈善流程的位置。
c)数据库的改进、同质化和标准化。由于数据量巨大,许多非营利组织发现他们的数据库缺乏管理。这不仅将迫使未来的研究,而且内部信息管理的重组。**
开始使用 Python 掌握机器学习的旅程
关于 ML 的一切
了解精通机器学习的基本要求
机器学习、深度学习、数据科学和人工智能(AI)是当今最常用的一些热门词汇。这些科目的受欢迎程度与日俱增。每个人都试图跳上炒作列车去探索这些领域。据《财富》杂志报道,统计数据显示,在过去的 4 年里,人工智能专家的雇佣量增长了 74%。人工智能被认为是当代人最热门的工作。这可能会导致观众心中产生许多疑问。
是什么让它如此受欢迎?这些字段是什么?什么是机器学习?我如何开始?为什么是 python?
我将在今天的文章中尝试回答所有这些问题,同时详细解释如何开始学习 python 和机器学习(ML)。然后我们会明白你如何调整和掌握你的机器学习技能。
**注意:**这将是我的“关于机器学习”课程的第一部分。但是,每个后续零件都将是独立零件。你可以根据你的方便以任何顺序阅读这个系列。我将在接下来的文章中尝试涵盖基础知识和大多数机器学习算法。要查看该系列的其他部分,您可以点击此处。
为什么 AI 这么受欢迎?
本杰明·戴维斯在 Unsplash 拍摄的照片
人工智能是当今发展最快的领域之一。人工智能的进步正在快速发展。不缺乏开放的职位以及职业机会。每个人都在大肆宣传人工智能将成为下一个大事件。正如现代人工智能最杰出的人物之一安德鲁·吴教授所言
“人工智能是新的电力。”
由于技术的进步和数据的丰富,现代人工智能领域有很多期望。我们有更高质量的图形处理器和更好的技术来计算复杂的过程。
这些字段到底是什么?
人工智能是一个广阔的领域。机器学习、数据科学、统计学、自然语言处理等主题都属于人工智能。深度学习是机器学习的一个子集。
人工智能是—
“能够执行通常需要人类智能的任务的计算机系统的理论和发展,如视觉感知、语音识别、决策和语言之间的翻译。”
要了解更多关于人工智能及其与宇宙的类比,你可以参考这里。在本文中,我们将更多地关注机器学习。我会尝试给出一个更直观的理解机器学习的方法。
什么是机器学习?
机器学习是程序自动学习和提高效率的能力,而无需显式编程。这意味着给定一个训练集,你可以训练机器学习模型,它将理解一个模型到底是如何工作的。在对测试集、验证集或任何其他看不见的数据进行测试时,模型仍然能够评估特定的任务。
让我们用一个简单的例子来理解这一点。假设我们有一个 30,000 封电子邮件的数据集,其中一些被分类为垃圾邮件,一些被分类为非垃圾邮件。机器学习模型将在数据集上训练。一旦训练过程完成,我们可以用一封没有包含在我们的训练数据集中的邮件来测试它。机器学习模型可以对以下输入进行预测,并正确分类输入的电子邮件是否是垃圾邮件。
机器学习方法主要有三种。我们将讨论每一种方法。然后,我将为每种方法列举一些例子和应用。
1。监督学习—
这是使用专门标记的数据集训练模型的方法。数据集可以是二元分类,也可以是多类分类。这些数据集将具有指定正确和错误选项或一系列选项的标注数据。在监督下,即在这些标记数据的帮助下,对模型进行预训练。这种学习可以分为两种算法——
- 分类:当输出有选择或特定类别时,这些算法是首选。垃圾邮件过滤的例子可以被认为是一个分类问题。
- 回归:当输出变量具有真实值时,算法是首选。这方面的一个例子是预测特定位置的房价。
**算法:**回归算法(线性回归)、决策树、随机森林和分类算法,如 K-最近邻(KNN)、支持向量机(SVM)、逻辑回归、朴素贝叶斯。
**应用:**垃圾邮件过滤,肿瘤分类(良性或恶性),用户评论分类为正面或负面评论。
2。无监督学习—
无监督学习是在未标记的数据集上训练模型。这意味着模型没有先验信息。它通过将相似的特征和模式组合在一起来训练自己。无监督学习的一个例子可以是狗和猫的分类。给我们的数据将是一个未标记的数据集,包含狗和猫的图像。无监督算法将发现模式中的相似性,并在不指定数据类型的情况下将狗和猫分别分组。有两种主要的聚类算法—
- 聚类:将相似的实体排列成一组簇。如前所述,这种将猫和狗等类别分组为簇的例子。另一个例子是根据具体数据确定癌症的阶段。
- 关联:在两个或多个类/用户之间关联相似的模式。这方面的一个例子是推荐系统,其中如果一个特定的人观看一部特定类型的电影,则基于观看了同一部电影的其他用户更喜欢观看的内容向用户给出推荐。另一个例子是,当亚马逊推荐购买了特定商品的买家也更喜欢购买其他类似的商品。
算法: K-means 聚类,主成分分析(PCA),奇异值分解(SVD),层次聚类。
**应用:**亚马逊、网飞、YouTube 等数字平台的推荐系统,脸书上的好友建议,异常检测。
3。强化学习—
根据维基 —
强化学习(RL)是机器学习的一个领域,涉及软件代理应该如何在环境中采取行动,以最大化累积回报的概念。强化学习是与监督学习和非监督学习并列的三种基本机器学习范式之一。
强化学习是一种试凑法模型。这是模型通过重复失败来学习的方法。当一个模型没有达到期望的结果时,该模型将重新训练。这可以应用于像下棋这样的概念,在玩了数百万局游戏后,模型将能够学习适当的模式和移动。一个更简单的例子是井字游戏。该模型可以在数百场比赛后学习每一条通往胜利的道路,一旦经过完美的训练,它将永远不会输掉一场比赛。
**算法:**基于策略、基于值、基于模型的强化学习算法。
**应用:**模型学习玩游戏像 flappy bird,工业自动化中的机器人技术,交通控制,基于深度学习的强化学习。
我如何开始?
如果你对如何开始你的机器学习之旅感到好奇,那么答案很简单。开始机器学习的最佳方式是探索和深入挖掘围绕机器学习的各种主题。重要的是要了解你是否对这个领域感兴趣和充满激情。机器学习需要编程技能、数学知识,最重要的是学习的意愿和坚持。有很多免费和付费的资源,从中你可以获得很多知识。
我强烈建议观众在 YouTube 上在线查看各种机器学习视频。查看免费代码和训练营也是一个好主意。我认为在开始学习在线付费课程之前,先看看免费的东西是个好主意。一旦你发现你真的喜欢机器学习,并有强烈的兴趣,我会强烈建议你先学习 Python,然后参加由 Andrew NG 在 Coursera 提供的斯坦福大学的机器学习课程。有大量的在线课程可供选择。只要相应地复习课程,并参加最适合你的任何机器学习课程。
为什么是 Python?
来源:照片由 Cookie 在 unsplash 上的 Pom
Python 是一种面向对象的高级编程语言,发布于 1991 年。Python 具有高度的可解释性和高效性。简单来说——Python 很神奇。我最初是从 C、C++和 Java 这样的语言开始的。当我终于遇到 python 的时候,我发现它相当优雅,简单易学,易于使用。Python 对于任何人来说都是最好的方式,即使是以前没有编程或编码语言经验的人也是如此。尽管有一些缺陷,比如被认为是一种“慢”语言,python 仍然是人工智能和机器学习的最佳语言之一。
尽管有像 R 这样的其他语言,Python 在机器学习中如此受欢迎的主要原因如下
- 如前所述,python 非常简单和一致。
- 与其他编程语言相比,受欢迎程度的快速增长。
- 与各种库和框架相关的丰富资源。我们将在本系列的下一部分进一步详细讨论这一点。
- 多功能性和平台独立性。这意味着 python 也可以导入用其他编程语言构建的基本模块。
- 伟大的社区和持续更新。总的来说,python 社区充满了令人惊奇的人,并且不断更新以改进 python。
要开始使用 python,可以从这里下载。
结论:
我希望你们都喜欢这本书。这将是我的“关于机器学习”系列教程的第 1 部分。我计划涵盖所有关于机器学习的主题。在本系列的下一部分,我们将回顾 python 及其库的所有基础知识。所有这些都是独立的部分,您可以随时查看它们。点击查看该系列的未来部分。谢谢大家坚持到最后,祝大家有美好的一天。
州名到州名缩写人行横道
图片来源:“Via Design Pickle”——更多关于属性。
我不得不第一百万次穿过州名和州名缩写。
概观
作为一名数据科学家、研究人员或任何类型的数据从业人员,您已经拥有或将最终拥有一个列出州名的数据集。但是,你需要州名缩写。或者可能正好相反。
对于初学者,甚至是中级数据专家来说,这可能是一项棘手而繁琐的任务。我花了一点时间来分享一个快速(并且在许多用例中容易应用)的方法来解决这个问题。
上面代码的输出。图片来源:“作者截屏”——更多关于属性。
警告
- 只有当负责 clerk.org 的法院的好书记官将 html 表放在适当的位置时,这段代码才会起作用。此外,该表仍然是指定位置的第一个可用表。
- 只有在 clerk.org 的表格准确无误的情况下,这个代码才会起作用。你应该四处找找其他的桌子。或者,将一个放在容易拿到的地方供自己使用。
- 此代码假设您已连接到互联网。
- 这段代码的预期功能还假设原始数据集正确且一致地拼写了每个状态。也没有其他印刷错误。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
adamrossnelson.medium.com](https://adamrossnelson.medium.com/membership)
感谢阅读
感谢阅读。把你的想法和主意发给我。你可以写信只是为了说声嗨。如果你真的需要告诉我是怎么错的,我期待着尽快和你聊天。Twitter:@ adamrossnelsonLinkedIn:Adam Ross Nelson 在 Twitter 和脸书: Adam Ross Nelson 在脸书。
田纳西州新冠肺炎分析
这是一篇让州领导和公民更好地了解田纳西州冠状病毒数据的文章,以及为什么严格遵守社交距离如此重要。有很多图表和表格!跟着我。
关于数据限制— 数据分析师总是不愿意使用他们知道不完整、不具代表性或存在固有缺陷的数据。缺乏全面的测试无疑使这些数据集有资格被谨慎对待。
该州确诊病例数量较低——原因如下
测试可用性滞后:根据 tn.gov 的数据,截至 2010 年 3 月 31 日营业结束时,田纳西州目前已经进行了大约每百万人 4011 次测试。Quest 官方表示,他们的平均测试处理时间为 4-5 天,然而,我的一名直系亲属在加州的一家医疗协会工作,负责联络医生和医院管理人员,他们表示测试处理积压了 10 天的等待时间。我的丈夫是当地呼叫中心的经理,他有一个阳性病例——一名被感染的员工在 10 天后终于收到了他的测试结果。像这样符合等待时间的轶事开始被全国性的报道所报道。
**即使我们没有获得数据,指数增长仍在发生:**这种滞后表明,在过去 10 天左右进行的任何测试实际上都没有实时报告,而是滞后 10 天。根据过去 24 小时内报告的病例数量,我们每天检测大约 1,000 人。1000 次测试乘以 10 天,等于 10000 次未报告的测试。目前大约有 10%的测试呈阳性,所以根据非常粗略的估计,这意味着在 3 月 27 日 20 日写这篇文章时,田纳西州可能有超过 2300 例病例,而不是该州报告的1321 例。但是事情是这样的,指数增长意味着案件会继续指数增长,而测试 不是 。
田纳西州活跃案例的增长率根据当前图表的线,不包括 3/31/20 处的急剧上升轨迹,当前增长率为. 2915。如果你应用简单的指数增长方程,它预测到 4 月 10 日有 33,000 个病例。增长率为 0.15(明显低于自病例 1 以来的大多数 24 小时内的增长率),预计到 4 月 10 日将有 30,000 例病例。虽然这确实是推测性的,但可以肯定的是,检测报告中的任何积压都意味着该州的实际确诊病例仅在积压开始的最后一天有效。
只有有共同症状的患者才会接受测试:你必须在有资格接受测试之前接受评估,而且评估仅基于最普遍或最严重的症状。这意味着,在任何给定的时间,可能会有几倍以上的轻微和不明原因的病例不符合检测条件——这些人,虽然他们自己不是一个问题——正在成为其余人口的疾病宿主。有几个突出的当地例子说明了这一点。回到 3 月 8 日,一名在& T 塔(蝙蝠侠大楼)的工作的员工被报道为一个积极的症状案例。这个人一定是在病毒传播的窗口期来工作的,因为在病例被确认后,他们关闭了大楼进行深度清洁。这意味着 4 天的测试过程,然后 5-14 天无症状,并能够摆脱病毒。这意味着,从 2 月中下旬开始的几天时间里,共用那栋大楼的 2000 名员工有一定的暴露机会。同样的场景在拥有 1500 多名员工的 Murfreesboro 的 State Farm 呼叫中心上演。测试呈阳性的人已经请了一周的病假——我个人对这种情况有所了解。有多少人被感染了?3 月 12 日,Gulch Crossing 办公大楼因一个阳性病例而被关闭进行清洁——这里住着 800 名工人。有多少像这样的场景在未经测试的情况下发生了?其他国家的数据显示我们很快就会知道。
作为一个州,我们没有获得任何这种数据,也没有用我们报告的数字来说明这一点,这意味着我们没有能力真正为峰值医疗利用率做好准备。
田纳西州的倍增时间平均为 2.75 天:倍增时间是一种控制疾病增长速度的方法。增长率是指数增长方程中的“r ”,它告诉你病毒传播的速度。即使我们在 27 日实际上有 1321 个病例,这意味着三天后我们将有 2600 个病例。六天后我们会有 5200 人。两周内,我们将有近 10,000 个案例。但问题是,在某个时候,速度会开始加快,你会得到更快的传播,因为越多的人被感染,就有越多的人感染其他人。是的,我们的自愿抑制措施肯定有缓解效果。但最重要的是,很可能是机缘巧合给了我们一个宽限期——春假和龙卷风使学校在李州长下达全州范围的命令之前关闭了。学校关闭可能是我们现在看到的抑制曲线的效果——记住所有的缓和都有 10-17 天的滞后。
图 1:包括田纳西州在内的 7 个州的活跃案例(橙色):
【https://github.com/nytimes/covid-19-data
在上面的图表中,田纳西州是橙色的,显示了几个类似的南部州,以及爆发时间晚几天的华盛顿和加利福尼亚。田纳西州的增长速度似乎比其他城市慢,原因更可能是 1)病毒在社区传播中的延迟引入,2)学校因龙卷风、春假和冠状病毒而产生的缓解效应,以及主要大学迅速停止校园课程。
图 2:学校关闭日期
数据来源于校区和大学网页。*表示威尔逊县学区因 2010 年 3 月 2 日的龙卷风停课一周
图 3:田纳西州的疫情曲线
https://github.com/nytimes/covid-19-data
上面显示了田纳西州孤立的疫情曲线——橙色是活跃病例,蓝色是每天的新病例。这条曲线与学校停课的时间框架相结合,证实了在中国湖北省和意大利看到的情况。抑制措施的所有效果从实施到看到活动案例下降有 12-14 天的延迟。请看以下来自中国和意大利的图片。
图 4:中国湖北省——全球疫情爆发的中心
图 5:意大利
红线表示颁布镇压措施的日期。蓝/黄条表示该国的活跃病例,深橙色表示每天的新病例。每次实施缓解措施后,大约需要 10-14 天才能看到每天新病例的减少。
在中国,每天新增病例开始下降后,又过了 12 天才看到实际活跃病例总数开始下降。
新冠肺炎和田纳西州及其他州的健康统计
图 6:11 个选定州实施缓解措施的新冠肺炎有效案例及日期
数据来源:【https://coronavirus.jhu.edu/map.html
浅黄色方框表示意大利在伦巴第地区发布停业和居家命令时的病例数。蓝色表示中国在湖北省发布关闭和居家命令时该省的人数。
图 7:美国 11 个州的死亡率
数据来源:https://coronavirus.jhu.edu/map.html
上表显示了这些州目前的死亡率——这通常是对流行病后的真实死亡率进行的回顾性校正。田纳西州极低的数字表明数据报告可能存在滞后,或者在用电高峰之前对相对较少的严重病例进行过度护理的能力。
图 8:美国 11 个州的增长率
数据来源:https://coronavirus.jhu.edu/map.html
上表显示了增长率,即代数指数增长方程中的变量“r”。当病例增长更快时,这个数字会更高。在其他国家,指数增长并没有减缓到持续低于 0.1,直到他们接近最大活跃病例。这意味着他们有效地限制了受感染的人群。不要指望很快在田纳西州或美国其他州看到这种行为。
图 9:美国 11 个州的翻倍时间
数据来源:https://coronavirus.jhu.edu/map.html
上表显示了以天为单位的倍增时间,每天使用增长率数字进行计算。翻倍时间是指以给定的速度将案例翻倍所需的时间。随着增长率上升,倍增时间下降。
图 10:美国 7 个州的年龄人口统计数据、新冠肺炎死亡率以及诊断为糖尿病的人口百分比
数据来源:Census.gov、、https://coronavirus.jhu.edu/map.html、https://www . americasheahelhtrankings . org/explore/annual/measure/Diabetes、https://memphischoard . com/select-Memphis/data-center/population/、https://www . kff . org/other/state-indicator/distribution-by-age/?current time frame = 0&sort model = % 7B % 22 solid % 22:% 22 location % 22,%22sort%22:%22asc%22%7D
上表显示了各相似州 50 岁以上和 65 岁以上的人口统计数据,包括田纳西州(橙色)以及新冠肺炎迄今为止的总死亡率(3/27/20)和各州糖尿病人口的百分比(这是增加新冠肺炎死亡率的一个风险因素)。
图 11:美国 7 个选定州的年龄人口统计、慢性阻塞性肺病和心脏病死亡率
数据来源:Census.gov、https://coronavirus.jhu.edu/map.html、https://www . americasheahelhtrankings . org/explore/annual/measure/Diabetes、https://memphischoard . com/select-Memphis/data-center/population/、https://www.cdc.gov/nchs/pressroom/stats_of_the_states.htm、https://www . kff . org/other/state-indicator/distribution-by-age/?current time frame = 0&sort model = % 7B % 22 solid % 22:% 22 location % 22,%22sort%22:%22asc%22%7D
上表显示了与左侧 y 轴相关联的彩色条中 50 岁和 65 岁以上人口的百分比。各种类似的州用田纳西(橙色)表示。较大的条形表示百分比超过 50,较小的条形表示百分比超过 65。当前新冠肺炎累积死亡率(2010 年 3 月 27 日)和每个州每 100,000 人的慢性阻塞性肺病和心脏病死亡率(两者都是增加新冠肺炎死亡率的风险因素)显示为与右侧 y 轴相关的线。田纳西州是慢性阻塞性肺病死亡率最高的地区,心脏病死亡率第二高。
图 12:特定州和国家的人口密度和 50 岁以上公民
数据来源:Census.gov、、、https://www . americasheahelhtrankings . org/explore/annual/measure/Diabetes、https://memphischoard . com/select-Memphis/data-center/population/、https://www.cdc.gov/nchs/pressroom/stats_of_the_states.htm、https://www . kff . org/other/state-indicator/distribution-by-age/?current time frame = 0&sort model = % 7B % 22 solid % 22:% 22 location % 22,%22sort%22:%22asc%22%7D
上图用彩色条显示了给定州和国家的人口密度。蓝线代表 50 岁以上人口的百分比,红线代表每个城市、州或国家 65 岁以上人口的百分比。根据目前可用的文献,从 40 岁开始死亡率增加。黄线表示新冠肺炎各城市、州或国家的当前累积死亡率(如有)。
图 13:根据中国湖北数据得出的按年龄统计的死亡率
数据来源:https://www . world ometers . info/coronavirus/coronavirus-age-sex-demographics/
该图显示了年龄人口统计在评估人群可能风险中的重要性。在中国观察到的死亡风险在 40 岁时增加一倍,并且从那里开始上升。
图 14:已患疾病者的死亡率
https://www . worldometers . info/coronavirus/coronavirus-age-sex-demographics/
该图显示了患有复杂先存疾病的患者的风险有多高,在评估人群风险时也必须考虑在内。疾病预防控制中心估计,大约 33.2% 的美国人口患有高血压,田纳西州高于全国平均水平 38.5% (2017)。
底线是,虽然自愿措施和学校关闭显然会对病例的增长产生抑制作用,但在这个国家有无数自私和粗心的人即使生病也去公共场合的例子,因为他们认为自己购物的权利比其他人生存的权利更重要。人群中风险最高的个体是我们中最脆弱的人群——温顺的人——我们的孕妇、我们敬爱的老人以及已经在与重大健康问题作斗争的人。
新的数据也表明,其他国家和纽约州的年轻人也未能幸免于重症监护室或死亡。纽约大约 25%的住院患者年龄在 20-40 岁之间,40%的患者年龄在 20-54 岁之间。我完全理解田纳西州是一个有自由主义价值观的保守州。但是有一些情况需要强有力的领导干预,数据响亮地显示这是时候了。越多不认真对待这一问题的人暴露出来,反过来又暴露了其他人,越多的脆弱人群将被感染和死亡。
绝对没有证据表明病毒的传播会以任何其他方式发展,但呈指数增长——除非实施严格的学校和企业关闭以及留在家中的命令。在田纳西州没有理由“等着瞧”。到我们“看到”的时候,至少 2 周内扭转趋势就太晚了。德国在 48 小时内增加了 20,000 个案例,这些案例都是建议性的,而不是强制性的限制。两周内会发生很多事。
我再次敦促你们实施更强有力的措施,要求非必要的企业关闭,人们呆在家里,并帮助医疗机构和必要的企业(实际上是必要的企业)为即将到来的疾病高峰做好准备。
最先进的图像分类算法:固定有效网络-L2
结合脸书和谷歌人工智能团队的 FixRes 和 EfficientNet
FixEfficientNet 是一种结合了两种现有技术的技术:脸书人工智能团队【2】的 FixRes 和谷歌人工智能研究团队首次提出的efficient net*【3】。FixRes 是 Fix Resolution 的简称,它试图为用于训练时间的 RoC(分类区域)或用于测试时间的 crop 保持固定的大小。EfficientNet 是 CNN 维度的复合缩放,提高了准确性和效率。本文旨在解释这两种技术,以及为什么它们是最先进的。*
FixEfficientNet 已于 2020 年 4 月 20 日与脸书人工智能研究团队的相应论文一起首次亮相[1]。该技术用于图像分类,是计算机视觉领域的一项任务。它目前是最先进的,在 ImageNet 数据集上具有最好的结果,480M 参数,前 1 名准确率为 88.5%,前 5 名准确率为 98.7%。
但是,让我们更深入一点,以便更好地理解这些组合技术:
理解修复
训练时间
在脸书人工智能研究团队提出 FixRes 技术之前,最先进的技术是从图像中提取随机的像素方块。这被用作训练时间的 RoC。(请注意,使用这种技术会人为增加数据量)。然后调整图像大小以获得固定大小的图像(=裁剪)。然后将其输入卷积神经网络[2]。
RoC =输入图像中的矩形/正方形
crop =使用双线性插值重新调整到特定分辨率的 RoC 像素
列车时间尺度增强
为了更好地理解 FixRes 到底做了什么,让我们来看看数学。改变输入图像中 RoC 的大小会影响给 CNN 的对象大小的分布。对象在输入图像中的尺寸为 r x r 。如果 RoC 现在被缩放,那么它被改变 s,并且对象的大小现在连续地是 rs x rs 。
对于增强,使用 PyTorch 的 RandomResizedCrop。输入图像的尺寸为H×W*,从中随机选择一个 RoC。然后这个 RoC 被调整到一个裁剪尺寸*
来源:作者图片。
输入图像( H x W )对输出的裁剪的缩放比例可由以下系数表示:
来源:作者图片。
测试时间
在测试时间,RoC 通常位于图像的中心,这导致所谓的中心裁剪*。来自训练时间和测试时间的两种裁剪具有相同的大小,但是它们来自图像的不同部分。这往往导致 CNN 的分布出现偏差[2]。*
测试时间尺度增强。
如前所述,测试增强不同于训练时间增强(关键词中心裁剪)。作物的大小
关于输入图像是正方形(H=W)的假设,测试增强的比例因子可以表示为
这有什么发现? 在 FixRes 开发出来之前,测试的预处理和训练时间是分开开发的,这导致了偏差。连续地,脸书人工智能团队试图找到一个解决方案,同时执行预处理,并以某种方式同步,这就是 FixRes 。
来源:作者图片。
如上所述的标准预处理通常会在训练时扩大 RoC而在测试时缩小 RoC。
FixRes 技术采用非此即彼的方法*。它或者降低训练时间分辨率并保持测试裁剪的大小,或者增加测试时间分辨率并保持训练裁剪的大小。目的是检索相同大小的对象(这里是乌鸦)以减少 CNN 中的尺度不变性[2]。这看起来像下面这样:*
来源:作者图片。
这导致对如何将数据馈送给 CNN 的两个影响:
- 图像中对象(此处为乌鸦)的大小因固定缩放而改变。
- 不同作物大小的使用对神经元被激活的方式和时间有影响。
变化激活统计的问题
Touvron 等人发现,更大的测试作物和最重要的对象大小的调整导致更好的准确性。然而,这是调整对象大小和改变激活统计之间的权衡。
测试表明,激活图随着图像分辨率的变化而变化。K_test = 224 导致 7×7 的地图,K_test = 64 导致 2×2 的地图,K_test = 448 导致 14×14 的地图。这表明激活分布在测试时变化,并且值在分类器范围之外[1]。
为了解决激活统计的变化问题,提出了两种解决方案:
- ***参数适应:*参数弗雷歇分布用于拟合平均池层。然后,通过标量变换将新分布映射到旧分布,并作为激活函数应用。
- ***微调:*应用校正的另一种方式是模型的微调。微调仅适用于 CNN 的最后几层。
在微调阶段,使用标签平滑[1]。
想看更多这样的故事?
开始使用
高效网络架构[3]
作者预先训练了几个模型,从这些模型中,L2 效率网显示出最好的结果。但是什么是效率网呢?
与大多数图像分类算法一样,有效网络也是基于细胞神经网络的。如果你不知道 CNN 是什么,点击这里。CNN 有三个维度:宽度、深度和分辨率。深度是层的数量,宽度是通道的数量(例如,传统的 RGB 将具有 3 个通道),分辨率是图像的像素。
EfficientNets 引入了复合缩放,它利用了所有三个维度:
宽度缩放 —可以通过增加图像的通道来增加宽度。然而,精度增益下降得相当快。
深度缩放 —是常规且最典型的缩放方式。通过增加深度,可以增加神经网络的层数。但是添加更多的层并不总是能提高网络的性能。大多数情况下,它需要更多的时间,但由于渐变消失,随着层数的增加,性能可能会停滞甚至下降。
分辨率缩放— 这意味着增加分辨率和像素数量,例如从 200x200 增加到 600x600。这种缩放的问题是,精度增益随着分辨率的提高而消失。直到某一点,你的精度可能会增加,但精度增量减少。
所有三个维度的升级会导致精度增量递减,并且所有三个维度的平衡缩放对于实现最佳精度结果是必要的。因此,建议采用复合缩放:
来源:作者图片。
ɸ指定可用的资源,而阿尔法、贝塔和伽玛负责资源的分配。
Touvron 等人[1]“使用神经结构搜索来开发新的基线网络,并将其放大以获得一系列模型,称为 EfficientNets。”神经架构搜索(NAS)优化了 FLOPS 和精度。
结论
这两种技术的结合产生了目前图像分类中最好的算法,领先于 EfficientNet Noisy Student。在效率和准确性方面,它都是当前领先的算法。由于其 98.7%的前 5 名准确度,仍有改进的可能性,但它已经相当准确了。因此,它仍然要等待,直到这是一种新的技术取代。
由于本文不包含任何实现,您可以使用作者的官方 Github 自行尝试:http://github.com/facebookresearch/FixRes.
作者[1]的预训练网络如下所示
github 回购截图。
我希望你能理解并喜欢它!
请继续关注 Marius Hucker 的新文章。如果您还没有注册,您将创建一个中型帐户…
medium.com](https://medium.com/subscribe/@hucker.marius)*
参考文献 :
[1]h .图夫龙、a .韦达尔迪、m .杜泽和 h .杰古(2020 年 b)。修正训练-测试分辨率差异。ArXiv:2003.08237 [Cs] 。http://arxiv.org/abs/2003.08237
[2]h .图夫龙、a .韦达尔迪、m .杜泽和 h .杰古(2020 年 a)。修复列车测试分辨率差异。ArXiv:1906.06423【Cs】。http://arxiv.org/abs/1906.06423
[3]谭,米,乐,张庆伟(2020).反思卷积神经网络的模型缩放。 ArXiv:1905.11946 [Cs,Stat] 。http://arxiv.org/abs/1905.11946
最先进的基础设施代码
萨阿德·萨利姆在 Unsplash 上拍摄的照片
Gruntwork 的最新抽象层将使您的生活更加轻松
开始
HashiCorp 在几年前推出 Terraform 时,已经彻底改变了代码基础设施。从那时起,Terraform 已经取代了特定于供应商的基础设施,成为像 AWS 的 CloudFormation 这样的代码解决方案。Terraform 抽象了云形成的复杂性,还提供了一个公共基础设施作为代码平台,以迁移到多云环境。一开始,Terraform 的规模变得非常复杂,维护基础架构的模块化方法并不容易,尤其是当您有许多不同的环境具有相似的基础架构时。
Gruntwork 的 Terragrunt 是 Terraform 的一个包装器,致力于解决您的 Terraform 状态管理和配置问题。它还解决了在不同环境中部署类似基础设施的一些问题。
[## 用例
Terragrunt 是 Terraform 的一个瘦包装器,它为使用多个 Terraform 模块提供了额外的工具。
davidbegin.github.io](https://davidbegin.github.io/terragrunt/use_cases/)
古老的原则“不要重复自己”是从良好的软件开发实践中借鉴来的,在良好的软件开发实践中,你创建一个你必须重复做的事情的函数或方法。等同于地形的是一个模块。模块是一段可重复的、独立的代码,可用于部署基础设施。给 这个 一个念。随着 Terraform 被各种规模和背景的工程团队广泛采用,Terragrunt 是一个很好的升级。
来自作者本人,Yevgeniy brik man——terra grunt 的联合创始人
现在……
虽然 Terragrunt 给了我们一些真正重要的功能,并且肯定是对 Terraform 的升级,但 Gruntwork 今天宣布了另一个升级。它只是另一个抽象层,可以防止你在设计 Terraform 模块或编写 Terraform 代码时做出错误的设计决策。
这种抽象将代码库的基础结构分为三个部分
- 模块目录 —通过组合数百个可重复使用、久经考验的模块来部署基础架构。模块可用于部署数据库或 EC2 服务器。例如,EC2 服务器的模块也可能有 IAM、安全组、DNS 记录设置。
- 服务目录 —这是两个新抽象层中的第一层。它在底层组合了许多模块,并为您提供了部署服务的选项。服务将包括地形代码、配置管理代码、日志记录&警报、安全性、自动化测试以及应用程序在生产环境中运行所需的任何其他内容。
- 架构目录 —这只是简单地部署了完整的堆栈,一切都已接入。类似于 AWS 的着陆区,这将建立安全基线。除此之外,它还将具备完整的网络、容器编排、存储、隐私、CI/CD、监控、警报、合规性,以及生产环境中运行的应用程序所具备的几乎一切。
Gruntwork 再次为现有的一系列产品增添了一个伟大的功能,使 SRE、DevOps 和 DataOps 的人们的生活变得轻松。唯一的问题(也是最大的问题)是,你必须有订阅计划才能访问代码。对于投资 IaC 的团队来说,订阅可能是值得的。此外,所有这些代码都完全独立于 Terragrunt,不会将您束缚在其中。它可以与 Terragrunt、Terraform Enterprise 和 Terraform Cloud 配合使用。你可以在这里查看订阅计划
为您的团队配置合适的计划。
gruntwork.io](https://gruntwork.io/pricing/?ref=service-catalog-announcement)
2020 年最先进的语言模型
突出显示最常见的 NLP 任务的模型。
自然语言处理(NLP)中有许多任务,语言建模,机器翻译,自然语言推理,问题回答,情感分析,文本分类,更多的 …由于不同的模型在不同的领域有所侧重和擅长,本文将重点介绍最常见的 NLP 任务的最新模型。
变压器
自从 Transformer 推出以来,它的变体已经应用于许多(如果不是全部)NLP 任务,实现了最先进的性能。在引入变压器之前,RNN 模型已经是用于序列建模和转导问题的最先进的结构。然而,鉴于 RNN 计算的顺序性质,训练期间的并行化主要受到限制,导致训练效率较低。作者提出了一种编码器-解码器结构,完全依赖于注意机制,而不使用递归结构。
变换器的编码器由 6 层组成,每层由一个多头自注意机制组成,后面是一个前馈网络。在每个子层之前和之后,添加剩余连接和 add & norm 层。解码器具有相同数量的 6 层。然而,在自关注层和前馈层之间插入了一个编码器-解码器关注层。注意遮罩用于隐藏后续位置的标记。
所使用的注意机制被称为缩放的点积注意,它通过来标准化逻辑,以防止由于 softmax 的小梯度而导致的缓慢收敛。此外,本文还提出了多头注意的概念,使得该模型能够关注来自不同表征子空间的信息。在最终分类层之前,来自所有子空间的隐藏状态然后被连接和投影。
在编码器自我关注层中,所有的键、值和查询都来自前一层,允许编码器关注前一层的所有位置。然而,由于注意屏蔽,解码器自我注意只注意到领先位置。另一方面,为了引起编码器-解码器的注意,从先前的解码器层提取查询,而键和值来自编码器隐藏状态。这允许解码器关注编码序列中的所有位置,这在序列到序列任务中是至关重要的。
为了注入相对或绝对的位置信息,位置编码被添加到输入嵌入中。理论上可以是学来的,也可以是固定的;然而,采用正弦位置编码是为了更容易学习和外推至更长的序列。
逐个组件的细分分析
towardsdatascience.com](/illustrated-guide-to-transformer-cf6969ffa067)
双向编码器表示转换器
语言模型传统上是单向的,在训练过程中只有先前时间步的单词是可见的。这是为了确保预测的单词不会间接“看到自己”然而,在许多句子级或标记级任务中,前向和后向上下文对于最佳性能都是必不可少的。
2018 年推出了双向编码器表示变压器( BERT )。它在转换器结构中利用屏蔽语言建模来促进双向表示训练。每个输入序列都以一个特殊的*【CLS】标记开始,其隐藏状态用于表示分类任务。对于句子对输入,添加了【SEP】*标记来指示单个句子之间的边界。每个标记的初始嵌入与片段嵌入和位置嵌入相加,作为变换器的输入。
BERT 模型包括两项预训练任务:
- 屏蔽语言模型。在预训练期间,随机选择所有标记中的 15%作为标记预测的屏蔽标记。然而,由于在微调期间不存在*【MASK】标记,这导致预训练和微调之间的不匹配。因此,在所有选择要屏蔽的令牌中,只有 80%被替换为【屏蔽】令牌。10%的时间令牌将保持不变,10%的时间由随机令牌替换。作者进行了烧蚀研究,以表明这样的置换率会产生最佳的下游性能。值得注意的是,通过【掩码】*的完全替换或通过随机令牌的完全替换导致次优性能。
- 下一句预测。对两个句子之间的关系进行建模至关重要,尤其是对于问答或自然语言推理等下游任务。因此,作者提出了下一个句子预测任务来分类一个句子是否是另一个句子的尾随句。当选择句子 1 和 2 进行句子对输入时,50%的情况下,句子 2 是跟在 1 后面的实际句子。另外 50%的时间,随机选择一个句子,作为反面样本。这个简单的任务导致了问答和自然语言推理任务的显著改善。
在预训练之后,通过简单地替换适当的输入-输出对,该模型在各种下游任务上被微调。对于标记级任务,例如序列标记或问题回答,每个标记的隐藏状态被提供给输出层。另一方面,*【CLS】*隐藏状态用于句子级别的任务,例如蕴涵和情感分析。
研究人员进一步探索专门针对文本分类的 BERT 微调,由三部分组成:
- 使用任务内或领域内的训练数据来进一步预训练 BERT
- 使用多任务学习进行微调(可选,如果相关任务可用)
- 针对目标任务微调 BERT
实现的方法包括长文本预处理、层的选择、层特定的学习速率调整、遗忘和少量学习。
XLNet
前述基于变换器的模型利用自动编码(AE)公式,而不是传统的自回归(AR)语言建模。由于 AE 模型不像 AR 模型那样分解正向产品中的概率,因此它们可以利用两个方向的上下文。因此,缩小了语言建模和实际下游任务之间的差距,后者通常需要双向信息。然而,由于真实数据中缺少*【MASK】*记号,这导致了预训练和微调之间的差异。此外,BERT 假设预测的记号是彼此独立的,这是过于简化的。
鉴于 AR 和 AE 语言模型的优缺点,XLNet被提出来利用它们的优点,同时最小化它们的局限性。与 AR 模型中使用固定的向前或向后因子分解不同,作者建议最大化因子分解顺序中每个可能排列的可能性。
因为相同的参数集用于所有排列,所以模型将总是能够访问全局环境。因此,它通过提取双向信息超越了传统的 AR 模型。此外,由于没有从损坏的数据重建,它避免了训练前微调差异的问题,以及独立性假设。值得注意的是,应用位置编码是为了保持原始序列顺序。置换只能通过在因式分解顺序中的后续标记上使用注意掩码来实现。
然而,所提出的公式导致变压器模型中两个矛盾的要求:
- 当在时间步长 t 进行预测时,隐藏表示 h(t) 应该只包含位置信息,而不包含内容信息
- 当在大于 t 的时间步长进行预测时, h(t) 包括令牌 t 的位置和内容
为了解决这个问题,使用了两个独立的流,即内容和查询表示。在计算上,查询流是可训练的,并且内容流用相应的单词嵌入来初始化。
大量的排列导致模型的训练收敛缓慢。因此,作者选择只预测因子分解顺序的最后一段。这样,由于不需要为前导记号计算查询表示,所以节省了速度和存储器。
那么,像 BERT 这样的深度学习模型到底能不能理解语言?Neptune 博客上的这篇文章描述了我们应该从三个方面来理解 NLP
- 概念界限
- 技术限制
- 评估限制
对 NLP 演示感兴趣吗?使用 TensorFlow.js 查看关于文本相似性的现场演示:
[## 使用 TensorFlow.js 通用句子编码器的文本相似性
从学者到构建相似句子分组网络应用的旅程
towardsdatascience.com](/how-to-build-a-textual-similarity-analysis-web-app-aa3139d4fb71)
最先进的 python 项目设置
为您的下一个 python 项目提供有见解的设置指南
Python 是发展最快的编程语言之一。它的工具正在快速发展以迎头赶上。我写 python 已经超过 10 年了,有时很难跟上所有的新工具。最近,我有机会(也有时间)评估其中一些新工具,这个领域的活动给我留下了深刻的印象。以下是我目前(2020 年 6 月)理想的 python 项目设置。
依赖管理: pipenv
python 中的依赖管理非常困难和复杂。过去,我曾使用 pip-tools 和 virtualenv 来管理(非常不成功)各种项目的依赖和 env。Pipenv 彻底改变了开发体验。它以更优雅的方式解决了这些问题。Pipenv 将 virtualenv 和依赖关系管理结合到一个简单易用的工具中。您基本上为每个 pipfile 获得了一个自动化的 virtualenv,同时也为确定性构建获得了一个锁文件。Pipenv 还提供了额外的安全性,因为它使用哈希来检查锁定的依赖关系。尽管一些基本的操作,比如添加和安装一个新的库非常慢,但是这些操作很少发生,所以它仍然比其他任何方法都好。
**更新:**结账诗词也是 pipenv 的改进版。
棉绒:薄片 8-黑色 + 或其他
Flake8 是最受欢迎的蟒蛇皮, black 是最固执己见且简单易用的蟒蛇皮。黑 linter 真的很好,真的是一个基本的蟒蛇林挺好。black 中缺少的两个特性是导入排序和查找未使用的导入/变量。Isort 解决了前者,flake8-black 解决了后者。这些工具提供了非常简单的 CLI 工具来自动修复大多数问题,这使得遵守 linter 规则变得非常容易。虽然我真的希望有一个工具可以将这三者结合起来。
静态类型检查器: mypy
Mypy 是最常见和最广泛使用的 python 静态类型检查器。尽管确保 python 代码定义了正确的类型是一项不小的工作,但这是完全值得的。该工具提供了许多选项来打开和关闭各种不同类型的检查。我真正欣赏的一点是只在任何新代码上运行检查器的选项,这使得将它添加到现有的 repo 并在项目中增量添加类型成为可能。
测试: pytest
这不应该是一个惊喜。Pytest 是最受欢迎的 python 测试框架,拥有超过 6000 个 github stars。Pytest 提供了更简单的接口和更少的样板代码。它速度快,稳定,功能丰富。
代码覆盖率:覆盖率
Coverage 是最常见的 python 覆盖工具,拥有超过 1000 颗 github 星。它与 pytest 配合得很好,并且可以选择仅对项目中任何新编写的代码执行覆盖率阈值。因此,在您现有的 python 项目中稳定地开始实施测试覆盖变得很容易。我在实施代码覆盖方面的唯一问题是,该工具只是以状态代码 2 退出,而没有打印任何可用的错误消息,这使得调试 CI 构建失败的原因变得非常混乱。
IDE: VSCode
这可能是最有争议的选择。紧随其后的是 Jetbrains 的 Pycharm。我两者都用过,最近转向了 VSCode,主要是因为它是免费的,并且有一组令人惊讶的扩展。您可以轻松地在 VSCode 中设置上述所有工具,并通过提交 git 中的设置与团队的其他成员共享这些工具(示例)。VSCode 还使得跨多种语言工作变得容易。Pycharm 不错,但是界面感觉有点笨重,过时,速度慢。此外,由于 jetbrains 试图为每种语言销售不同的编辑器,他们在 pycharm 中为其他语言提供的扩展无法提供与 VSCode 相同的无缝体验。迫不及待想试试 VSCode 和 github 一直在做的在线编辑器。
虽然我对上面的设置很满意,但有一件事我觉得还是有点乱:配置文件。Python 工具现在围绕着使用哪种配置文件格式而分散开来。似乎新的工具正在标准化。toml 配置文件,但现在我的 black、isort 和 coverage 配置在 pyproject.toml 中,flake8 配置在 setup.cfg 中,mypy 设置在 mypy.ini 中。如果我能把所有这些配置放在一个文件中就好了,我可以把它复制粘贴到我所有的项目中。
这里( link )是一个简单的库,上面所有的设置都是在这里配置的。请签出 makefile 并。github/workflows/unit _ tests . YAML 来检查我如何设置 CI。
机器学习和人工智能*行业的现状
在企业中大规模采用机器学习:ML 平台和 AutoML 【第一部分】
多少 ML 型号才算太多型号
TL;博士:
一般来说,企业和公司,甚至初创公司,都在努力运营和 生产 机器学习模型。
ML 模型封装了模式、规则和知识,实现了业务流程的自动化和优化。它们是数据驱动的应用和 AI*服务的重要组成部分,改善并经常取代传统的基于规则的业务流程,提高生产力和成果。
#MLSEV 机器学习学校—slide deckhttps://www . slide share . net/ed slide/Machine-Learning-platformization-automl-adopting-ml-at-scale-in-the-enterprise
从 2012 年到 2018 年,蓝筹技术公司实施了定制的内部使用的 ML 平台(即脸书的 FBLearning、优步的米开朗基罗、Twitter 的 Cortex、AirBnB 的 BigHead),其中许多平台主要基于开源包,并针对各自公司的特定用例进行了深度定制。
从那时起,行业内出现了企业级 ML 平台解决方案的强劲发展,包括来自现有供应商的解决方案(如亚马逊 Sagemaker、微软 Azure ML、谷歌云 ML 等)和该领域的挑战者(如 DataRobot、H2O、BigML、Dataiku)。现任供应商遵循增量战略方法,他们的 ML 服务产品位于现有云服务之上,作为另一个应用层,而不是挑战者采用的 ML 原生方法。
随着 ML 采用率的增加,许多企业正在迅速转向现成的数据科学&机器学习平台,以加快上市时间、降低运营成本并提高成功率(部署和运营的 ML 模型数量)。
鉴于目前的 ML 项目中只有一小部分,POC(概念证明)和模型达到生产和有意义的 ROI,ML 平台和 AutoML ( 自动化机器学习)正在成为增加 ML 模型快速原型和用例验证( ROI 验证)的首选工具。
结论:
- 尽管付出了巨大且不断增长的努力,包括过去几年公司对 ML 项目和计划的投资,只有一小部分 ML 模型进入生产并交付切实的成果。那些在许多情况下被证明是有利可图或非常有利可图的。在规模上, Pareto 原则适用于 20%的 ML 计划占 80%的收益,而许多 PoC 项目被放弃或冻结以待以后改进。
【市场更新:连线,文章-11 月-2020 年’公司都在争相使用人工智能——但很少有回报’】* - 证据表明,市场正在接近一个转折点,越来越多的公司倾向于购买(而不是构建)ML 平台和工具,考虑现成的供应商解决方案或混合方法而不是开源。
- **AutoML,以及 API,**是 ML 平台不可或缺的组成部分,以提高快速模型原型、ML 用例验证和部署能力。基本原理是通过增加 ML 候选用例的数量和成功率(在生产中部署的 ML 模型)来实现更好的 ROI(投资回报)。
- 数据(数量和质量— ML 就绪)、ML 技术债务、MLOps vs DevOps 以及企业 ML 流程和技能仍然是采用的主要障碍。尽管如此,传统的 ML 正在迅速超越炒作周期的顶峰,预计在企业中的主流采用只有 2-3 年的时间。
- 未来发展:除了深度学习,在未来十年,人工智能平台有望逐步融入知识表示、推理、规划和优化功能,为实现强大的人工智能铺平道路。
免责声明:本文中的术语 AI (人工智能)特指构建机器学习驱动的应用程序的能力,这些应用程序最终自动化和/或优化业务流程和不应与正式意义上的健壮或强大的人工智能相混淆,“至少在这十年和/或下一年不太可能发生的事情”(作者强调)
摘要
【1】释义&上下文【第一部分:本帖】
机器学习平台定义 ML 模型和应用程序是企业中的一级资产 ML 应用程序的工作流程 ML 算法概述 ML 平台的架构 ML 宣传周期的更新
【2】规模采用 ML
机器学习的问题 ML 系统中的技术债务多少个模型是过多的模型对 ML 平台的需求
[3]ML 平台的市场
ML 平台市场参考早期采用者定制构建与购买:投资回报率和技术债务 ML 平台供应商格局
[4]定制构建的 ML 平台
ML 平台市场参考—近距离观察脸书— FBlearner 优步—米开朗基罗 AirBnB—BigHead ML 平台化成为主流
[5]从 DevOps 到 mlop
devo PS**<>**ModelOps ML 平台驱动型组织领导力&问责制
[6]自动化 ML — AutoML
扩展 ML —快速原型制作和 AutoML 供应商比较 AutoML: OptiML
[7]ML 平台的未来发展
超越深度学习:知识表示、推理、规划和优化
1.定义和背景
T 这里的东西并不是作为一个独特的 ML 平台,产品或者服务。该行业仍然非常分散,术语“ML 平台”、“数据科学平台”或“AI*平台”多次互换使用。
然而,市场上不同的产品和服务有一些共同之处,总结如下:
ML 平台提供了构建 ML 解决方案(主要是预测性和规范性模型)所必需的高级功能。
ML 平台支持将这些解决方案整合到业务流程、基础设施、产品和应用中。
它支持不同技能的数据科学家(和其他利益相关者,如 ML 工程师、数据分析师和业务分析师/专家)在数据和分析管道中完成多项任务,包括以下所有领域:
ML 工作流—资源分配百分比
数据摄取数据准备和转换数据探索和可视化
特征工程
型号选择、评估和测试(以及 AutoML)
部署
监控和解释
维护和协作
作为工具、系统和服务的组合,ML 平台使实验和快速原型成为可能,但它们的 ROI 是在企业运营和业务流程的背景下实现的,远远超出了实验。
参考资料:
Poul Petersen,剖析一个端到端的 ml 应用程序https://www . slide share . net/bigml/ML sev-剖析一个 ML 应用程序
ML 平台研究报告 Papis.io
面向 ML & AI 的企业采用框架*
T 鉴于其在企业中的影响和投资回报率,ML 平台&工具及其产品、ML 模型和数据驱动的应用程序可被视为一流的企业资产。
麦肯锡的全球人工智能调查概述了人工智能*的企业自我报告影响及其优势。
然而,这不仅仅是技术的问题。流程、优先级和人员(领导和责任)在加入和成功部署 ML 驱动的应用和服务中也扮演着不可或缺的角色。
当涉及到 ML 应用程序时,不仅软件开发是不同的,将它们部署和集成到现有系统中也被证明是一个主要的挑战。考虑到 ML 软件开发中的许多差异(更多细节在第 5 节),DevOps 无法充分处理 MLOps(机器学习操作)。
ML 算法
对于数据科学家和领域专家来说,管理 ML 算法以及支持它们的计算和数据转换需求无疑是 ML 平台要解决的关键任务。快速试验并对给定数据集应用不同算法的能力是验证任何用例(假设验证)的关键。
Precisely AutoML(自动机器学习)为这一过程提供了进一步的自动化,使用不同的算法创建许多候选模型,并评估它们的性能,以向给定的预测目标提出最佳模型选项。
ML 算法——监督和非监督(由 BigML 公司提供的#MLSEV)
在实践中,企业中的绝大多数 ML 用例(想想营销、金融、人力资源、制造等)不需要深度学习或神经网络算法,除非有非凡的性能要求,或者在需要处理非结构化数据(例如视频、图像或声音)的特定用例中。
几乎 80–90%的用例利用传统的 ML 算法,如线性回归、逻辑回归、随机森林或集成,与更不透明的神经网络方法相比,它们提供了可靠的结果和进一步的可解释性。
Kaggle 的调查包括近 2 万名受访者(数据科学家是重要的一部分),是监控算法使用的良好代理:
蓝框:传统的 ML 算法-红框:CNN,RNN,DNN 和贝叶斯-来源:Kaggle 数据科学和 ML 2019 年的状态
参考资料:
Kaggle 的数据科学和 ML 现状调查【https://www.kaggle.com/kaggle-survey-2019
麦肯锡— 分析时代
ML 平台架构
或者定制的 ML 平台,开源包和技术是首选(例如优步的例子: HDFS 、 Spark 、 Samza 、 Cassandra 、 MLLib 、 XGBoost 和 TensorFlow ),决定了底层架构的大部分。
要解决的用例以及需要多少实时和静态数据建模是形成平台架构的其他因素。优步服务公司的实时需求(如预测乘车时间)不同于 AirBnB(如推荐者),在访问、处理数据要求和预计预测时间方面与 FICO(如信用评分)也有很大不同,因此具有非常独特的架构需求。
优步的 ML 平台—米开朗基罗,来源:优步工程https://eng . Uber . com/米开朗基罗-机器学习-平台/
例如,在优步的情况下,在线部署的模型无法访问存储在 HDFS 的数据,这使得很难从在线生产数据库中检索关键功能(例如,查询 UberEATS 订单服务以计算特定时间段内餐馆的平均用餐准备时间)。
优步的解决方案是预先计算并在 Cassandra 中存储那些所需的功能,以便满足预测时的延迟要求(来源:优步工程-米开朗基罗https://eng . Uber . com/米开朗基罗-机器学习-平台/ )。
C 商业 ML 平台,与定制的开源平台相反,旨在概括大量不同的 ML 问题和用例。他们的架构需要支持关键功能,同时允许通过抽象层进行充分的定制:
- 基础架构(云、混合和本地)的自动部署和自动扩展—分布式
- API — RESTful ML 服务—编程 API 化和集成
- 高级功能工程— DSL**
- 算法和模型的程序化使用
- ML 工作流的程序自动化定制— DSL
- 前端:可视化和界面
- 开发工具:绑定(Python,R,Java,C),库,CLI 工具
** DSL 域特定语言
ML 平台架构概述(BigML 公司提供)
使用 DSL 的 API 和编程自动化— 领域特定语言 —保证了一篇衍生文章。特别是 AutoML,将在本系列文章的第 7 节中讨论。
DSL 在 API 和计算基础设施之上提供了必要的抽象层次,以处理复杂性、自动化和定制。DSL 方法的例子有优步的用于特性选择和转换的 DSL(优步的 ML 平台—米开朗基罗)和 BigML 的用于 ML 工作流自动化的 DSL(whiz ML)。
参考资料:
优步工程-米开朗基罗https://eng . Uber . com/米开朗基罗-机器学习-平台/
Arxiv:关于机器学习和大数据的 DSL 的调查https://arxiv.org/pdf/1602.07637
PAPIS.io 会议录:机器学习 API 的过去、现在和未来http://proceedings.mlr.press/v50/cetinsoy15.pdf
用于 ML 工作流自动化的 DSL【https://bigml.com/whizzml
机器学习炒作周期的更新
随着企业和从业者走过在实践中应用 ML 的学习曲线,机器学习和深度学习作为技术都经历并超越了炒作周期的顶峰,迅速穿越了“幻灭之谷”(调整预期)。Gartner 的最新炒作周期报告反映了这一点,并预测主流采用将在未来 2-3 年内发生。
来源:Gartner 对 DS 和 ML 2019 的炒作周期
紧随其后,新的人工智能平台的功能,如 AutoML,MLOps,可解释的人工智能或强化学习,目前正在进入炒作曲线,迅速成为炒作。这些新的 ML 技术仍然不成熟,还没有准备好被主流或大规模采用。
造 vs 买
几年前,市场已经被分为开源和行业解决方案。
从 2012 年到 2018 年,蓝筹技术公司实施了定制的 ML 平台供内部使用(即脸书的 FBLearning、优步的米开朗基罗、Twitter 的 Cortex、AirBnB 的 BigHead,稍后在第 4 节中有更详细的分析)。
这些平台中有许多主要基于开源包,并针对这些公司的特定用例进行了深度定制。
尽管开源软件包固有的免费性质(购买的成本优势)和几乎无限的定制能力,但是开源的问题伴随着相关的隐藏技术债务,特别是胶水代码(更多细节见第 2 节机器学习系统中的隐藏技术债务)。 D. Sculley 等人,谷歌,NIPS 2015)。
从长远来看,正是配置、协调和整合不同开源包(胶合代码)的成本增加了成本,使得构建与购买的商业案例对行业解决方案更具吸引力。
该行业已经看到了企业级 ML 平台解决方案和 MLaaS(机器学习即服务或云 ML 服务)的强劲发展,现在该产品分为行业现任者(如亚马逊 Sagemaker、微软 Azure ML、谷歌云 ML 等)和挑战者(DataRobot、H2O、BigML、Dataiku 等)。
对许多企业来说,一个重要的关键驱动因素是**上市时间和竞争力。**由于他们难以通过传统的构建研发方法成功地扩展和获得足够多的 ML 模型,许多人迅速转向现成的数据科学&机器学习平台,以加速上市,降低运营成本并提高成功率(部署和运营的 ML 模型的数量)。
参考资料:
机器学习系统中隐藏的技术债务。 D. Sculley 等人,谷歌,NIPS 2015https://papers . NIPS . cc/paper/5656-hidden-technical-debt-in-machine-learning-systems . pdf
Gartner 的人工智能炒作周期https://www . Gartner . com/smarterwithgartner/top-trends-on-the-Gartner-Hype-Cycle-for-artificial-intelligence-2019/
【第一节结束】
这篇文章的配套幻灯片可以通过这个链接获得[ 在机器学习学校#MLSEV 的演讲—3 月 26 日 ]
关于作者:
状态、行动、奖励——强化学习背后的直觉
强化学习到底是什么,RL 算法在实践中是如何工作的?
2014 年,谷歌以 5 亿美元收购了一家名为 DeepMind 的英国初创公司。这是一个很高的价格,但仅从 DeepMind 产生的宣传效果来看,这项投资似乎已经获得了数倍的回报。ML 的研究人员知道 DeepMind 是因为它在深度强化学习领域的频繁突破。但该公司也吸引了公众的注意力,特别是由于它成功地构建了一种玩围棋的算法。考虑到 DeepMind 在该领域取得进展的频率——alpha go、AlphaGo Zero 和 AlphaZero 在过去几年中的进展——无论是从技术层面还是从影响的角度来看,都很难跟踪到底发生了什么。我打算这么做——提供 DeepMind 在围棋上的成功的高层次观点,并解释他们生产的不同版本的 AlphaGo 之间的区别。
RL 是什么?
与人类认知相比,机器学习是一个成熟的领域。这当然不是巧合。该领域中许多最受欢迎的任务(视觉、语音和自然语言处理)通常属于人类(或自然)智能的领域。由于算法“所做的”是模拟人类,因此自然会想到算法也“如何”模拟人类。因此,像“神经网络是由人脑启发的”这样的说法比比皆是(事实上,这种说法就像“飞机是由鸟启发的”一样正确)
强化学习特别适合这种比较。就其核心而言,任何强化学习任务都是由三个因素定义的——状态、行动和奖励。状态是任务的当前世界或环境的表示。动作是 RL 代理可以用来改变这些状态的事情。奖励是代理人因执行“正确的”行动而获得的效用。因此,状态会告诉代理当前所处的情况,而奖励会向代理发出信号,表明它应该向哪个状态努力。那么,我们的目标是学习一种“政策”,它会告诉你在每种状态下应该采取什么行动,以尽量获得最大回报。这个宽泛的定义可以用来适应我们每天执行的许多不同的任务。
当你开车时,状态是你的车和邻近车的位置和速度。你可以采取的行动是转动方向盘,踩油门或刹车。奖励取决于你在遵守交通规则的情况下多快到达目的地。
当你玩视频游戏(比如说《塞尔达传说》)时,状态就是你在屏幕上的任何信息——你的位置、附近角色或怪物的存在、你拥有的武器和物品。你的行动可以包括移动或攻击。您的奖励取决于您剩余的生命数量以及您从击败敌人中获得的任何金钱或物品。
塞尔达传说游戏状态。资料来源:Deepak Dilipkumar
让我们看一个更抽象的例子——申请研究生院。你所在的州是你目前的研究/工作概况,以及你拥有的关于不同学校的课程和教授的信息。你的行动可能是决定向谁要推荐信,在你的 SoP 上写什么,以及申请哪所学校。奖励当然是一封录取信(或者由于一封拒绝信而产生的负奖励)。
这些例子表明,从强化学习的角度来看,在不同的“具体性”水平上构建无数的任务通常是可能的。然而,重要的是要注意,对于不同的任务,状态、动作和奖励集的范围可能非常不同。例如,塞尔达游戏中的动作场景虽然很广泛,但显然比申请研究生院的动作场景要小一个数量级。这表明,当你已经清楚地定义了状态、奖励和受限的动作集时,将任务框架化为强化学习效果很好。这可以从 RL 成功完成的类任务中看出。
解决 RL 任务
解决 RL 任务的一种常见方法叫做“基于价值”。我们试图根据哪些状态可能带来高回报,给每个状态(或每个(状态,下一个行动)对)分配一个数字。这种将每个状态与特定数值联系起来的实体称为价值函数。如果我们以这种方式学习一个适当的值函数,那么从一个特定的状态,我们可以简单地选择很可能导致下一个高值状态的动作。所以我们现在把我们的任务简化为学习这个价值函数的问题。
为了理解这个学习过程可能是什么样子,让我们看一个更具体的例子——井字游戏。状态是当前的棋盘位置,动作是你可以放置“X”或“O”的不同位置,奖励是+1 或-1,取决于你是赢还是输。“状态空间”是特定 RL 设置中可能状态的总数。井字游戏有一个足够小的状态空间(一个合理的估计是 593 ),我们实际上可以使用一个表格记住每个状态的值。因此,这种方法被称为列表法。这在大多数应用程序中是不实际的(想象一下列出一个棋盘的所有可能的配置并给每个配置赋值),但是我稍后将回到如何处理这个问题。
我们首先给每个状态分配一些初始值,比如说所有状态都是 0(有更好的初始化策略,但是现在这样就可以了)。最初,我们的表格看起来是这样的(假设我们有一些对州进行编号或索引的方法):
然后,我们开始与对手玩井字游戏,我们遵循的一般规则是,在当前状态下采取的行动是导致下一个状态的行动,下一个状态的价值尽可能高。一开始,由于所有的州都有相同的价值,这就意味着只是从合法的行动中随机挑选。但是在几场比赛之后,你注意到当你到达这个位置(你是 X)时:
你得到+1 的奖励。那么与最终状态相关联的值必须是+1。因此,您更新了您的表(假设最终获胜位置的任意指数为 123):
现在,在接下来的几场比赛中,你看到你带领你到 123 的位置(假设这两个位置分别是 121 和 122)也有可能以高回报结束,只要你采取正确的行动:
因此,您再次更新了表格,注意到倒数第二个状态不一定有+1 的全部奖励,因为仍有可能走错一步,最终输掉或听成平局:
我不会进入实际的方程式,但是在一个高层次上,我们看到回报是一种从最终状态“流”回来的东西,并给最终状态赋予一个具体的值。因此,这些终端状态对于确保算法学习正确的值函数极其重要。我曾经有一个 bug,除了指示这些终端状态的标志之外,一切都按预期工作,算法最终几乎什么也没学到。
因此,如果有足够多的训练游戏,奖励会一直流回到最初的状态,并且你从头到尾都有一个好的策略!例如,进行这种“自举”的一种常见方式,即从紧随其后的状态的值中学习一个状态的值,称为时间差异学习。
延伸到国际象棋
比如说,这种策略在国际象棋中的效果如何?井字游戏有大约 600 个州。虽然很难计算国际象棋中状态的准确数量,但一个很好的上限似乎是 10⁴⁵ 。世界上所有的计算机都没有足够的内存来存储这么多的状态,所以将所有的值放在一个表中不再是一个好主意。我们如何处理这个问题?
让我们想想我们下棋。随着我们练习得越来越多,我们开始对某些状态有多“好”有了直观的理解。例如,尝试评估这种状态(白棋):
谁赢了?来源:chess.com
你可能知道白棋的位置更好。很可能你以前从未见过这种确切的董事会状态。尽管如此,你已经对象棋中什么构成了一种状态的“善”建立了直觉。你可能数了每一方剩下的棋子数,并注意到黑方有 2 个额外的棋子,而白方有一个额外的骑士和车,这给了那一方优势。如果你是一个更有经验的玩家,你可能已经看到了可能的下一步棋(比如白象可以拿下黑象)和双方控制的棋盘区域。
所以你肯定没有记住每一个可能的棋位的潜在价值——你已经学会了某种通用函数,将棋盘的状态映射到每个玩家的游戏价值。这正是我们希望 RL 的智能象棋算法通过一个叫做价值函数逼近的想法来做的。
首先,我们想出一种方法来表示游戏状态。对于井字游戏,我们可以枚举所有的状态,这意味着每个游戏状态都由一个数字表示。对于国际象棋,一个简单的方法是用一个数字(棋子→ 1,车→ 2 …)表示每一个棋子,然后有一个长度为 64 的列表,该列表编码每个位置上特定棋子的存在(比如说,0 表示空位置)。我们可以将它输入到我们的 RL 算法已经学习的价值函数中,它会吐出一个数字(代表“价值”)或者可能是一个概率(代表黑棋获胜的机会)。
现在实际的 RL 部分非常类似于我们对井字游戏所做的。我们玩了很多游戏,赢了就奖励算法,输了就惩罚算法,随着时间的推移,它将(希望)学习一个代表州值的好函数。唯一的变化是,我们不是从表中查找值,而是通过函数传递输入,并获得相应的值作为输出。有了这个,我们就可以通过观察每一个可能的合法走法所达到的状态来推导出一个下棋的策略,并通过我们的函数传递这些状态中的每一个,以查看哪一个具有最高的值!
这是用 RL 解决国际象棋问题的一种相当幼稚的方式,我们可以用一些复杂的想法来加速计算,改善学习,并最终做出更好的棋。这对于围棋来说尤其重要,因为围棋的状态空间比国际象棋还要大!这可能需要很长时间才能理解,所以我将在这里停下来,在下一篇博客文章中讨论一些关于 Go 的有趣想法。感谢阅读!
原载于 2018 年 3 月 3 日https://deepakdilipkumar . github . io。
Python 的静态代码分析
类型和样式检查、潜在的错误和代码复杂性
图片来自维基共享资源
静态代码分析查看代码而不执行它。它通常执行起来非常快,只需要很少的努力就可以添加到您的工作流程中,并且可以发现常见的错误。唯一的缺点是它不是为您的代码量身定制的。
在本文中,您将学习如何在 Python 中执行各种类型的静态代码分析。虽然本文主要关注 Python,但是任何编程语言都可以进行这种类型的分析。
代码复杂性
约翰·巴克利普在 Unsplash 上的照片
测量代码复杂度的一种方法是圈复杂度,也称为 McCabe 复杂度,定义见 A 复杂度测量:
CC = E - N + 2*P
其中 N 是控制流图中的节点数,E 是边数,P 是条件节点数(if 语句,while/for 循环)。
可以用 radon 在 Python 中计算:
$ pip install radon
$ radon cc mpu/aws.py -s
mpu/aws.py
F 85:0 s3_download - B (6)
F 16:0 list_files - A (3)
F 165:0 _s3_path_split - A (2)
F 46:0 s3_read - A (1)
F 141:0 s3_upload - A (1)
C 77:0 ExistsStrategy - A (1)
第一个字母表示块的类型(F 表示函数,C 表示类)。然后 radon 给出了行号**,类/函数的名称,一个等级 (A、B、C、D、E 或 F),以及实际的复杂度作为一个数字。通常,复杂度低于 10 是可以的。scipy 最复杂的部分复杂度为 61。**
除了 radon,还有各种其他的包和 Flake8 插件:
- flake 8-注解-复杂性:轻推你命名复杂类型
- flake 8-认知复杂性:验证认知功能的复杂性
- flake 8-expression-complexity:确保单个表达式不会太复杂;类似于函数/类的圈复杂度。
- flake8-functions :报告过长的函数和带有过多参数的函数
- mccabe :这被一些其他的工具和项目使用
- wily :跟踪、报告 Python 测试和应用程序复杂性的命令行应用程序。
- 氙:依靠氡
风格指南
让你的代码看起来更专业。猎人在 Unsplash 上比赛的照片
你可能听说过“pythonic 代码”这个词。这意味着不仅要编写正确的 Python 代码,而且要按照预期的方式使用语言特性(来源)。这肯定是一个固执己见的术语,但是有很多插件向您展示了社区中的大部分人认为 pythonic 是什么。
以类似于其他 Python 项目的风格编写代码是有价值的,因为人们会更容易阅读代码。这一点很重要,因为我们阅读软件的次数比编写软件的次数还要多。
那么,什么是 pythonic 代码呢?
先从 PEP-8 说起:它是 Python 社区在 2001 年编写并接受的一个风格指南。所以它已经存在了一段时间,大多数人都想跟随它。我见过大多数人不同意的主要部分是 79 的最大线长。我总是建议在你 95%的代码库中遵循这个建议。对此我给出了理由。
黑人项目的标志。图片来源:黑人投稿人
对于纯代码格式化,您应该使用自动格式化程序。我开始喜欢黑色的因为它不允许定制。黑色格式的代码看起来总是一样的。由于您不能自定义它,所以您不需要讨论它。它只是解决了风格冲突和争论的问题。Black 由 Python 软件基金会维护,可能是 Python 最常采用的自动格式化程序。
Google 的 yapf 是另一个自动格式化程序。
文档字符串
如果写得好,阅读手册会很有趣。千层面和烤肉卷有很好的文档。劳拉·德维尔德在 Unsplash 上拍摄的照片
对于文档字符串,有 PEP-257 。所有这些规则在社区中都被广泛接受,但是它们仍然允许各种各样的文档字符串。有三种常用的样式:
- NumpyDoc 风格文档字符串:由 Numpy 和 Scipy 使用。它以固定的顺序对某些指定的部分如
Parameters
和Returns
进行降价。 - Google 风格 docstrings:一种超薄格式,有
Args:
和Returns:
。 - 文档字符串:一种非常灵活的格式,使用重构的文本。
我喜欢 NumpyDoc 格式,因为它非常容易阅读,即使你只是在文本编辑器中使用它。Numpydoc 也得到了编辑器的良好支持。
这里你可以看到三者的对比:
def **get_meta_numpydoc**(filepath, a_number, a_dict):
"""
Get meta-information of an image. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Aenean commodo
ligula eget dolor. Aenean massa. Cum sociis natoque penatibus
et magnis dis
parturient montes, nascetur ridiculus mus. Parameters
----------
filepath : str
Get metadata from this file
a_number : int
Some more details
a_dict : dict
Configuration Returns
-------
meta : dict
Extracted meta information Raises
------
IOError
File could not be read
"""def **get_meta_google_doc**(filepath, a_number, a_dict):
"""Get meta-information of an image. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Aenean commodo
ligula eget dolor. Aenean massa. Cum sociis natoque penatibus
et magnis dis
parturient montes, nascetur ridiculus mus. Args:
filepath: Get metadata from this file.
a_number: Some more details.
a_dict: Configuration. Returns:
Extracted meta information: Raises:
IOError: File could not be read.
"""
def **get_meta_sphinx_doc**(filepath, a_number, a_dict):
"""
Get meta-information of an image. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Aenean commodo
ligula eget dolor. Aenean massa. Cum sociis natoque penatibus
et magnis dis
parturient montes, nascetur ridiculus mus. :param filepath: Get metadata from this file
:type filepath: str
:param a_number: Some more details
:type a_number: int
:param a_dict: Configuration
:type a_dict: dict :returns: dict -- Extracted meta information :raises: IOError
"""
薄片 8
正如阿尔贝托·吉梅诺指出的那样,你应该一直使用棉绒。他们可以检查你的风格,但更重要的是,指出潜在的错误。
是一个包装 PyFlakes、pycodestyle 和 McCabe 脚本的包装器。这是 Python 中林挺最常用的工具。Flake8 太棒了,因为它有太多的插件。我找到了 223 个名称中带有字符串“flake8”的包,并查看了其中的许多包。我还用 trove 分类器Framework :: Flake8
查看了包,发现了 143 个包,其中 122 个以flake8-
开头。只有 21 个包有 Flake8 框架的 trove 分类器,但没有以flake8-
开头,其中只有两个看起来很有趣。
边注:错别字抢注是每个开放包库都要与之斗争的问题(学士论文:编程语言包管理器中的错别字其中有的博文和一篇有趣的后续,学士论文:对包管理器的攻击)。Python 中有它造成伤害的例子( 2017 、 2017 、 2017 、 2019 、 2019 、 2019 )。有 pypi-scan 用于查找示例,还有 pypi-parker 用于防止常见的错别字。William Bengtsson 也做了一些类似的事情来加强 Python 社区对这个线程的防范。有关他的项目的更多信息,请参见下面他的文章。package parking 列出了 PyPI 上的软件包数量,我通过查找摘要“防止漏洞利用的软件包”来过滤它们。
威廉·本特森| @ _ _ 肌肉
medium.com](https://medium.com/@williambengtson/python-typosquatting-for-fun-not-profit-99869579c35d)
以下是一些有趣的 flake8 插件:
- 内聚:检查类内聚是否低于阈值。这表明功能应该从一个类中分离出来。
- flake8-assert-msg :确保 assert 语句有消息
- flake8-blind-except :防止口袋妖怪异常捕捉
- flake8-builtins :检查 python 内置的变量或参数。
- flake8-docstrings :增加 pydocstyle 支持
- flake8-isort :使用 isort 检查 python 文件上的导入是否按照您期望的方式排序
- flake8-logging-format :验证(缺少)日志格式字符串
- flake8-pytest-style :检查基于 pytest 的测试的常见风格问题或不一致之处
- flake 8-需求:检查/验证包导入需求。它报告缺失和/或未使用的项目直接相关性
- flake 8-graph QL:Lint graph QL 查询字符串
- 与黑色搭配很好🎉
- 模板 8-模拟:使用模拟来检查错误
- 检查 jupyter 笔记本
- flake8-pyi : Lint 存根文件
- flake8-variables-names :查找常见的“无意义”的变量名
- pep8 命名:对照 pep8 命名约定检查你的代码
- 熊猫兽医:固执己见的林挺为熊猫编码
- wemake-python-styleguide :一个固执己见的风格指南/检查器,看起来很受欢迎。不过,我以前没见过这个。
部分 Flake8 探矿者的替代品。它结合了多种工具,但是它很少被使用,因此不如 Flake8 灵活。
第八篇:安全性和缺陷
注意安全,注意警示标志。照片由特洛伊桥在 Unsplash 上拍摄
- flake8-bandit :安全测试
- 在你的程序中寻找可能的错误和设计问题——通常它是无声的,但是当它不是的时候你应该看一看🐻
- flake8-requests :检查请求框架的使用
Flake8:删除调试工件
这种情况在我身上发生过好几次:我在开发新功能或调试旧功能时添加了一些代码,但后来忘记删除了。它经常被评论者发现,但是没有必要用这个来分散评论者的注意力。
flake8-breakpoint 检查忘记的断点,而 flake8-print 会抱怨每一条打印语句。flake 8-调试器、 flake8-fixme 、 flake8-todo 走向相同。
皮林特
[pylint](https://pypi.org/project/pylint/)
是 Python 中分布最广的 linters 之一。pylint 的功能肯定与 Flake8 重叠,但有一个功能我很喜欢:检查代码重复❤
$ **pylint --disable=all --enable=duplicate-code .**
************* Module mpu.datastructures.trie.base
mpu/datastructures/trie/base.py:1:0: R0801: Similar lines in 2 files
==mpu.datastructures.trie.char_trie:85
==mpu.datastructures.trie.string_trie:138
string += child.print(_indent=_indent + 1)
return stringdef __str__(self):
return f"TrieNode(value='{self._value}', nb_children='{len(self.children)}')"__repr__ = __str__EMPTY_NODE = TrieNode(value="", is_word=False, count=0, freeze=True)class Trie(AbstractTrie):
def __init__(self, container=None):
if container is None:
container = [] (duplicate-code)
让死代码死去吧
肯尼·奥尔在 Unsplash拍摄的照片
谁没有做过:你删除了一个功能,但是代码可能是方便的。所以你把它注释掉。或者你在它周围加一个if False
块。有时通过添加您不需要的配置选项会更复杂。
最简单解决方案是通过一个简单、明确的提交来删除该特性。也许可以添加一个 git 标签,这样以后想再添加的时候就可以找到了。
还有一种代码是死的,但是你忘记了。幸运的是,您可以自动检测到它:
- flake 8-根除:查找注释掉的(或者所谓的“死的”)代码。
- vulture :查找 Python 程序中未使用的代码
第八篇:鼓励自己使用好的风格
让一个有经验的开发人员审查你的代码是很棒的。在最好的情况下,你会学到一些新的东西,你可以在所有进一步的项目中应用。有些插件就是这样。由布鲁克·卡吉尔在 Unsplash 上拍摄的照片
一些插件帮助我学习了一些关于 Python 的知识。例如,以下内容帮助我消除了一些小错误和不一致之处:
- 帮助你写出更好的理解清单/集合/字典——我喜欢这个😍
- flake8-executable :检查可执行权限和 shebangs 。文件应该要么是可执行的,有一个标签,要么是不可执行的,没有标签。
- flake8-raise :发现 raise 语句的改进
- flake8-pytest :使用 assert 代替 assertEqual
以下新风格的轻推插件旨在推动您使用现代风格的 Python:
- flake 8-path lib:path lib是在 Python 3.4 中加入的,我还是不太习惯。这个插件可能会在适当的时候提醒我使用它。
- flake8-string-format , flake8-printf-formatting , flake8-sts :字符串格式化。
这对我来说是最有价值的类别之一。如果你知道更多有助于使用新风格的插件,请告诉我😃
Flake8 元插件
马丁·托马斯通过 imgflip.com 创造形象
Flake8 有一些插件没有增加更多的林挺功能,但以另一种方式改进了 flake8:
- 薄片 8–颜色:薄片 8 的 ANSI 颜色高亮显示
- flake8-csv :生成 csv 格式的错误报告
- flake8-json :生成 json 格式的错误报告
- flake8-dashboard 和 flake8-html :生成 html 报告( dashboard demo
- flake8-immediate :直接打印错误,没有任何延迟
- flake8-strftime :检查特定于平台的 strftime 代码的使用
- flake8-SQL 和 py-find-injection :寻找 SQL 查询,并根据自以为是的风格检查它们
- flake8-tuple :检查(可能)非预期的单元素元组
有些插件人们可能出于法律原因需要,比如 flake 8-作者、flake 8-版权和 flake 8-许可证。
致 Flake8 插件作者:请确保你列出了你的插件引入的错误代码,并且至少给出了一些你的插件认为不好/好的例子。
类型注释和类型检查
VS 代码的 mypy 插件显示了一个类型问题。马丁·托马斯截图。
在 Python 中是可以的,但是需要你去做。它不是自动完成的。我写了一篇更长的文章,介绍了 Python 中的类型注释是如何工作的。有多种工具可以使用,但我推荐 mypy。您可以使用pytest-mypy
通过 pytest 运行它,或者使用flake8-mypy
通过 flake8 运行它,但是我更喜欢单独运行它。其主要原因是由 CI 管道给出的输出更干净。
您可以将类型检查(例如通过 mypy)集成到您的编辑器中,但是类型注释本身已经走了很长的路,因为它们记录了预期的内容。
程序包结构
托运之前,请检查您的包裹是否完好无损。托比·斯托达特在 Unsplash 上的照片
pyroma 评估 Python 项目符合 Python 打包生态系统最佳实践的程度。
以下是我项目的一些例子:
$ pyroma mpu
------------------------------
Checking mpu
Found mpu
------------------------------
Final rating: 10/10
Your cheese is so fresh most pe$ pyroma nox
------------------------------
Checking nox
Found nox
------------------------------
Your long_description is not valid ReST:
<string>:2: (WARNING/2) Explicit markup ends without a blank line; unexpected unindent.
<string>:3: (WARNING/2) Field list ends without a blank line; unexpected unindent.
<string>:4: (WARNING/2) Explicit markup ends without a blank line; unexpected unindent.
------------------------------
Final rating: 9/10
Cottage Cheese
------------------------------
下一步是什么?
在这个系列中,我们已经有了:
- 第 1 部分:Python 中单元测试的基础知识
- 第 2 部分:补丁、模拟和依赖注入
- 第 3 部分:如何用数据库、模板和受保护的页面测试 Flask 应用程序
- 第 4 部分: tox 和 nox
- 第 5 部分:结构化单元测试
- 第 6 部分:CI-管道
- 第 7 部分:基于属性的测试
- 第八部分:突变检测
- 第 9 部分:静态代码分析 — Linters、类型检查和代码复杂性
- 第 10 部分: Pytest 插件来爱
如果您对使用 Python 测试的其他主题感兴趣,请告诉我。
S3 上使用 SSL 的静态托管
上个月,我花了大量时间搜索 AWS 文档,试图找出如何:
- 主机静态内容…
- …在 S3 桶里…
- …使用自定义域名…
- 和 SSL (HTTPS)连接。
鉴于像雨果或杰基尔这样的静态站点生成器越来越受欢迎,这个看起来应该是一个简单的过程。
如果你在这里,你可能会发现这是而不是直截了当。你可能也从半打不同的 StackOverflow 问题和支离破碎的博客帖子中拼凑出了一个解决方案。所以:下面是我目前的剧本,关于如何在 AWS 上用 SSL 托管静态站点。
步骤 1:将域转移到 AWS / Route53
如果您打算从 S3 桶中提供静态内容,并且想要 SSL 支持,那么您将需要一个 CloudFront 发行版。(CloudFront 是亚马逊的 CDN 服务。)从技术上来说,你的域名注册并不一定要在亚马逊进行,这简化了几个步骤。因此,本行动手册的其余部分假设您能够并且愿意将您的域名转移到 AWS。
在 Route53 中转移域名→注册域名屏幕
从您的 AWS 控制台,前往 Route53 → Registered Domains,确认您的域名已经存在,或者点击 Transfer Domain 启动注册转移。**【备选路径:**在 Route53 中设置一个与您当前注册商的区域设置完全匹配的托管区域,并将域名服务器设置指向您的 Amazon 托管区域中NS
记录中列出的服务器。]
步骤 2:创建自定义域 SSL 证书
太好了!您的自定义域已准备好“安全”接下来,您需要从 AWS 证书管理器请求一个证书(在控制台服务列表中找到它)。这相当快,而且免费:
- 点击申请证书
- 选择请求公共证书(您想要一个可以被外界使用的证书)
- 在域名编辑框中输入两条记录:
yourdomain.com
和[www.yourdomain.com](http://www.yourdomain.com.)
T25。我们将在两个独立的 CloudFront 发行版上使用这个证书。**【替代路径:**如果您有其他用于访问静态内容的子域,您当然会希望在这里输入这些子域。] - 选择 DNS 验证(这让证书管理器通过在 Route53 中自动生成记录来验证您对域的使用)
- 如果您愿意,可以随意在证书中添加自定义标签。
- 点击审核,然后确认并请求。
发起证书请求后,您可以为每个证书路径向域的托管区域添加一个CNAME
记录。或者,更简单的是,只需点击按钮,让 AWS 为您插入记录。
步骤 3:设置您的 S3 时段内容
当我们等待 SSL 证书生成时(这可能需要几分钟),我们可以前往 S3 并设置我们的存储桶。你需要两个水桶:
mydomain.com
将包含您想要托管的所有静态内容;和www.mydomain.com
将流量重定向到mydomain.com
**【备选路径:**如果您希望从www.mydomain.com
获得流量服务,只需翻转下面的说明。]
输入您的域名作为存储桶的名称
首先,创建您的内容 S3 存储桶(上例中的mydomain.com
)。如果您愿意,可以使用您的域名作为 bucket 的名称,但是因为我们将在它前面放置一个 CloudFront 发行版,所以这不是一个技术要求。您不需要在 bucket 创建流程的下一个屏幕上配置任何特殊选项。
取消选中“阻止所有公共访问”以允许全世界访问您的内容
确保取消选中“阻止所有公共访问”,这样公共用户就可以看到您的内容。在几次由于开放的 S3 桶的安全设置不严而导致的公开(尴尬)数据泄露之后,亚马逊在这一步上提出了额外的警告和预防措施。然而,在这种情况下,你确实希望这些文件在互联网上到处泄露。
现在,为您的备用域名存储桶重复上述过程。此存储桶将用于将流量重定向到您的主域。
在将您的内容上传到您的主要静态托管桶之后,转到该桶的属性选项卡并编辑静态网站托管设置。您希望使用这个桶来托管一个网站,将索引文档设置为您的默认页面的文件名(例如index.html
)。此时,您可以使用静态托管设置中的端点进行测试。
在 S3 存储桶属性选项卡中找到静态网站托管设置
配置 S3 桶来托管一个静态网站
您的 S3 存储桶的最终配置任务是进入托管您的备用域存储桶(例如www.mydomain.com
)的属性的静态网站。您希望将请求重定向到您的主域,并将协议设置为https
(假设您希望所有重定向流量都被路由到 SSL 连接)。
配置辅助 S3 桶,通过 HTTPS 将流量重定向到主桶
步骤 4:创建 CloudFront 发行版
现在,您的公共证书应该可以使用了。对于这个用例,云前端是 DNS 记录、SSL 证书和 S3 桶之间的连接组织:
所有这些看似不必要的复杂性的原因是,CloudFront 可以处理与自定义域的 SSL 连接,但 S3 不能。(也许,有一天,AWS 会着手构建一个更简单的解决方案,而这篇文章会让人觉得古怪。)
我们将使用两个独立的 CloudFront 发行版:一个专门处理mydomain.com
,另一个处理www.mydomain.com
。您可以只使用一个响应两个名称的发行版来完成解决方案,但是客户端流量将根据原始请求显示为来自mydomain.com
或www.mydomain.com
。在双 CF 配置中,对二级域名的请求将一直流向二级 S3 存储桶(www.*
),然后被重定向到www
-自由路径。
因此:在 CloudFront 中,创建一个 Web 发行版。配置面板中有组设置:
- 来源域名表示内容的来源(来源)应该是什么。通过选择控件,您将看到可用作原点的可用 S3 桶的列表。选择
mydomain.com
。 - 限制 Bucket 访问:如果启用,该选项要求所有公共流量通过 CloudFront 路由。这并不是 CloudFront 的全部内容,但是如果您想“锁定”您的 bucket 并保证页面总是显示在自定义域名下,那么您会想要使用它。
- 查看器协议策略:设置为将 HTTP 重定向到 HTTPS 以强制所有连接使用 SSL。没有什么好的理由不这样做。
- 允许的 HTTP 方法:指定您的站点需要哪些 HTTP 方法。对于我的大多数被动内容网站,默认的 GET,HEAD 设置是检索内容所需要的,但是如果你有 POST 表单,那么你需要调整这个设置。
- 自动压缩对象:你想减少带宽吗?你当然知道!启用 gzip 压缩。
- 备用域名 : **非常重要:**您必须在这里输入
mydomain.com
或www.mydomain.com
,这取决于您正在设置的发行版。当客户端请求到达 Route53 并被路由到 CloudFront 进行分发时,CF 将验证请求的域是否在其域名列表和中,以及证书是否与该域匹配。 - SSL 证书:以上所有工作都归结于这一个设置。选择自定义 SSL 证书并选择您最近创建的 SSL 证书将其绑定到发行版。
- 默认根对象:存储请求的默认页面,如果请求 URL 中没有包含页面。使用相同的
index.html
风格的设置,在你的 S3 桶设置中使用。
现在,您可以单击创建分发版,并在 CloudFront 将您的内容复制到边缘节点时,对您的第二个分发版(对于[www.mydomain.com](http://www.mydomain.com))
)) 重复这个练习。
步骤 5:更新域区域设置
在您的 CloudFront 发行版建立起来之后,剩下唯一要做的事情就是为mydomain.com
更新 Route53 中的 DNS 设置:
- 为
mydomain.com.
更新或创建一个A
记录,它是mydomain.com.
的 CloudFront 发行版的别名 - 为
www.mydomain.com
更新或创建一个A
记录,该记录与www.mydomain.com
的分布有相似的别名。
派对时间
瞧啊。现在,您应该能够使用 HTTP 或 HTTPS 请求访问mydomain.com
和www.mydomain.com
,并在https://mydomain.com
被路由到由 S3 存储桶提供的同一个页面。(作为奖励,你有一个 CDN 做后盾。)
根据您决定如何将新内容复制到您的 S3 存储桶,您将需要调整您的发布过程,包括在新的或修改的文件上传后使mydomain.com
的 CloudFront 发行版无效。
动态世界中的静态机器学习模型
历史数据正被用于未来将工作的模型。当世界不断变化时,我们的模型保持不变。
克里斯·劳顿在 Unsplash 上的照片
如果你在学术界或工业界工作,你就要解决现实生活中的问题。我们研究的数据不是合成的,它们来自真实世界的读数。在我们的办公室工作时,从与我们的项目、业务或挑战相关的真实事件中抽象出来;我们往往会与我们正在解决的问题失去联系。很容易将项目视为数字。静态数值、字符串和无意义的 id。我们用二进制存储它们,与现实世界脱节。在这种情况下,很容易忘记现实世界是动态的,数据也是如此。当我们忽视或天真地忘记这一现实,并专注于我们心爱的 KPI 时,问题就开始出现了。这个故事是关于我们的机器学习模型如何保持静态,而数据却随着动态世界的变化而每天变化。
在我之前工作的一家公司发生了一次事故后,我开始对我的模特的表现的连续性有点着迷。简而言之,我们的一个直接负责关键引擎输出的模型开始预测荒谬的结果。最糟糕的是,我们没有发现问题,直到我们接到客户愤怒的电话,花了很长时间调试整个管道,才找到根本原因。该模型输出极高或极低的预测值。回想起来,我们发现堆栈中没有故障组件。没有 bug,没有错误。上游数据引起的问题。从上游消耗的数据,真实世界的读数,已经改变了。
模型是由世界快照建立的
如果您没有采用某种在线学习方式,即模型定期更新,那么您将使用历史数据。您使用数据存储中的一些数据并训练您的模型。你经常这么做。你获取历史数据,通过管道传输,得到你的模型。这里的关键词是历史性的。您处理的是已经过时的数据。回顾过去的同时,你也在为未来构建解决方案。
有了这些数据,你实际上是在世界的快照上开发了你的解决方案。原始数据,真实世界的读数代表快照。这个快照可以是几周、几个月或几年。快照越长越好。尽管如此,这并不能保证未来会遵循您快照中的相同行为。
当世界改变时,模型就会失效
当您处理历史数据时,您就与您的模型签订了合同。您向您的模型保证数据的属性不会改变。作为交换,模型给你一个准确的历史描述。你依赖于你的 KPI。当你超过一个门槛时,庆祝一下。将您的解决方案投入生产。当同样的模型还在那里时,你的合同仍然有效。
现实世界不断变化,我们的上游数据也是如此。如果你不采取额外的步骤,你的模型将会忽略这些变化。你的合同还在。随着变化,当一个重大事件发生时,或者随着时间的推移,您的上游数据开始变化。它可能会发生如此剧烈的变化,以至于上游数据在某个时候可能不再类似于您的模型所依据的历史数据。此时,你违反了你的契约,你的模型开始无声地失败。
演出的连续性
随着世界的变化,我们的数据也在变化,我们需要确保我们的模型仍然做得很好。即使我们可能不做任何事情来使模型走上正确的道路,我们也需要知道性能。为了确保我的模型的性能仍然令人满意,我倾向于进行以下检查。请注意,这些检查是为您所服务的模型/解决方案服务的。
1。上游数据检查
对于这一个,您根据您的项目定义哪个阶段是上游。这个想法是在进入模型之前观察任何阶段的数据,以做出预测。虽然是这种情况,但在将数据输入模型之前的最后阶段可能是一个很好的阶段。
该检查的目的是确保上游数据仍然类似于训练模型时使用的历史数据的分布或遵循相同的模式。一种简单但有效的方法是计算每个固定时间间隔的上游数据的分布,并将其与历史数据的分布进行比较。如果两个分布的相似性很接近,你就是绿色的。否则,您会发出警报,并让解决方案的所有者知道。
2。下游输出检查
下游检查背后的思想与上游数据检查非常相似。在这个例子中,不是检查上游,而是检查模型或服务的输出。与上游检查一样,您可以监控生产中模型输出的分布与历史数据输入时模型输出之间的相似性。监视两个分布之间的相似性,如果它开始偏离,就发出警报。
这两种检查很容易实现。您可以将它们放在一个实时监控仪表板中,或者只是在超过阈值时向存储库的所有者发送一封邮件。就像任何支票一样,知道它们的存在是件好事。
如果你对我在这个故事开始时提到的事件的结局感到好奇,让我继续。变化来自客户端。我们的阅读依赖于运行在客户端的复杂而冗长的框架配置列表。后来很明显,客户改变了一些主要的配置。这一变化对我们的读数影响很大,导致了上游数据的重大变化。因此,输入模型的新数据点与我们用于训练的数据完全不同。只有我们对数据进行一些检查,我们才能意识到这种变化,并采取一些措施使事情朝着正确的方向发展。幸运的是,这一事件没有对业务造成太大影响,几天后一切都恢复了正常。这个有价值的教训让我对我们模型的静态本质更加多疑,并且怀疑我的解决方案在产品中是否仍然如我预期的那样工作。
Python 中的静态类型
Python 初学者
轻松进行类型检查
由 Battlecreek 咖啡烘焙师在 Unsplash 上拍摄的照片
Python 是一种 动态 类型化语言。这意味着在给变量赋值时,没有必要声明变量的类型。例如,当你用字符串值'Tom'
初始化对象时,你不需要声明对象major
的数据类型为string
。
major = 'Tom'
在像 C 这样的 静态 类型化语言中,你必须声明一个对象的数据类型。字符串被声明为字符数组。
char major[] = "Tom";
用像 Python 这样的动态类型语言编码肯定更灵活,但是人们可能想要注释对象的数据类型并强制类型约束。如果一个函数只需要整数参数,那么向函数中抛出字符串可能会导致程序崩溃。
尽管这是动态类型的主要缺陷之一,Python 3 为程序员引入了几个注释工具来指定和约束对象的数据类型。
函数注释
让我们以一个非常简单的函数foo
为例:
def foo(n, s='Tom'):
return s*n
该函数以n
和s
为参数,返回s*n
。虽然它看起来像一个简单而无意义的乘法函数,但是请注意s
的默认值是'Tom'
,它是一个字符串,而不是一个数字。我们可能推断这个函数打算返回一个多次重复字符串s
的字符串,确切地说是n
次。
foo(3, 'Tom') # returns 'TomTomTom'
这个功能比较混乱。您可能想写冗长的注释和文档字符串,解释函数并指定参数和返回值的数据类型。
def foo(n, s='Tom'):
"""Repeat a string multiple times.
Args:
n (int): number of times
s (string): target string
Returns:
(string): target string repeated n times.
"""
return s*n
美国宇航局在 Unsplash 拍摄的照片
Python 为你使用符号:
和->
做 可选标注 提供了一种更简洁的方式。
def foo(n: int, s: str='Tom') -> str:
return s*n
函数foo
的注释可从函数的__annotations__
属性中获得。这是一个将参数名映射到它们的注释表达式的字典。这允许通过运行代码来手动类型检查,而不是自己查看源代码。非常方便。
foo.__annotations__
# {'n': int, 's': str, 'return': str}
可变注释
除了函数参数和返回值之外,还可以用某种数据类型来注释变量。你也可以注释变量而不用任何值初始化它们!
major: str='Tom' # type:str, this comment is no longer necessary
i: int
最好使用这种内置语法而不是注释来注释变量,因为注释在许多编辑器中通常是灰色的。
用于注释更高级类型的变量,如list
、dict
等。,你需要从模块typing
中导入它们。类型名称大写,如List
、Tuple
、Dict
等…
from typing import List, Tuple, Dictl: List[int] = [1, 2, 3]
t1: Tuple[float, str, int] = (1.0, 'two', 3)
t2: Tuple[int, ...] = (1, 2.0, 'three')
d: Dict[str, int] = {'uno': 1, 'dos': 2, 'tres': 3}
列表、元组或字典中的元素也可以被注释。那些大写的类型采用方括号[]
中的参数,如上所示。
List
接受一个参数,它是列表中所有元素的注释类型。固定大小元组中的元素可以逐个进行注释,而可变大小元组中的元素可以通过省略号...
进行注释。我们还可以在字典中指定键和条目的类型。
高级注释
我们提到过List
只取一个参数。注释一个混合了int
和float
元素的列表怎么样?Union
就是答案。
from typing import Union
l2: List[Union[int, float]] = [1, 2.0, 3]
它还支持任何用户定义的类作为注释中的类型。
class FancyContainer:
def __init__(self):
self.answer = 42fc: FancyContainer = FancyContainer()
一个 可调用的 也可以使用上述技术进行注释。可调用的是可以被调用的东西,就像函数一样。
from typing import Callable
my_func: Callable[[int, str], str] = foo
警告
首先,类型注释不能完全取代文档字符串和注释。出于可读性和再现性的目的,仍然需要对您的函数进行简要的描述和解释。启用类型注释可以避免让复杂的注释充满数据类型之类的信息。
第二,有件事我应该一开始就告诉你。Python 解释器实际上不会自动进行任何类型检查。这意味着那些注释在运行时没有任何作用,即使你试图传递一个“错误”类型的对象给一个函数。
那么你有没有浪费自己的时间去学习类型注释呢?号码
有许多 Python 模块可以在运行前强制执行这些约束。mypy 是目前最常用的类型检查器,没有运行时开销。
外卖
Python 中的类型注释有助于调试和可选的类型检查,后者模拟静态类型。它在项目开发中变得越来越流行,但在更普通的 Python 程序员中仍然很少见。
虽然没有注释并不一定会降低代码性能,但出于健壮性、可读性和可再现性的目的,它仍然被认为是一种良好的实践。
我们仅仅触及了 Python 中静态类型和类型注释的皮毛。Python 3.9 即将对变量注释进行一些升级,所以请继续关注注册我的时事通讯以接收我的新文章的更新。
连 Python 3.8 都没准备好?我掩护你。
[## Python 3.8 中针对 Python 新手的 6 项新特性
请做好准备,因为 Python 2 不再受支持
towardsdatascience.com](/6-new-features-in-python-3-8-for-python-newbies-dc2e7b804acc)
感谢阅读!你觉得这些功能有趣有用吗?下面留言评论!您可能还会发现以下文章很有用:
如何在运行时检查对象
towardsdatascience.com](/4-easy-to-use-introspection-functions-in-python-49bd5ee3a2e8) [## Python 初学者应该避免的 4 个常见错误
我很艰难地学会了,但你不需要
towardsdatascience.com](/4-common-mistakes-python-beginners-should-avoid-89bcebd2c628)
股票价格的统计分析
谷歌股价的简单统计分析
作者图片
股票市场总是被认为是对统计学的挑战。有人认为了解市场的统计数据可以让我们战胜市场并赚钱。现实可能大不相同。
在这篇文章中,我将向你展示谷歌股票价格的统计分析。
2008 年,为了获得理论物理学士学位,我必须分析股票价格,以检验股票市场模型的有效性。在本文的下一部分,我将向您展示一些使用 Python 对 Google 股票价格进行的分析。
代码可以在我的 GitHub 存储库中找到,这里:https://GitHub . com/gianlucamalato/machine learning/blob/master/Stock _ market _ analysis . ipynb
下载数据
首先,我们需要获得股票数据。我将使用 yfinance 库下载价格时间序列。
首先,我们必须安装这个库。
!pip install yfinance
然后我们可以导入一些有用的库。
import pandas as pd
import numpy as np
import yfinance
import matplotlib.pyplot as plt
from scipy.stats import skew,kurtosis,norm,skewtest,kurtosistest
from statsmodels.graphics.tsaplots import plot_pacf,plot_acf
我们现在可以得到 2015 年到 2020 年的谷歌价格数据。
name = 'GOOG'
ticker = yfinance.Ticker(name)
df = ticker.history(interval="1d",start="2015-03-15",end="2020-09-10")x = df['Close']
我们现在将使用 x 对象,它包含股票的每日收盘价。
每日收盘价
让我们画出每日收盘价。
作者图片
正如你所看到的,有一个相当不错的看涨趋势。有一些下降,但漂移似乎相当积极。
每日回报
当你对一只股票进行统计分析时,研究它的回报而不是价格本身是非常有用的。
从一天到另一天的回报是两天之间收盘价的百分比变化。
在 Python 中,series 对象有一个 pct_change 方法,允许我们计算这个量。该参数是要使用的滞后。在本文中,我将使用 1 天的滞后时间。
returns = x.pct_change(1).dropna()
结果是这样的:
第一个数字是 (x[1]-x[0])/x[0] ,第二个是 (x[2]-x[1])/x[1] 以此类推。
这是我们要分析的数据。
收益的概率分布
我们现在要计算一些关于收益概率分布的见解。
直方图和箱线图
让我们先做一个原始的回报直方图。
plt.hist(returns,bins="rice",label="Daily close price")
plt.legend()
plt.show()
作者图片
如你所见,它完全以零为中心,看起来是对称的。然而,我们可以看到这个直方图有似乎不可忽略的尾部。
让我们制作一个箱线图来更好地理解这个数据集的分布。
plt.boxplot(returns,labels=["Daily close price"])
plt.show()
如你所见,它充满了离群值。如果与分布总范围相比,四分位数范围(即盒子的高度)相当窄。这种现象被称为厚尾,在股票分析中非常常见。
主要观察点
让我们计算数据集的一些可观测量。
平均值为:
它非常类似于零,但它是正的这一事实解释了价格时间序列的正漂移。
现在让我们来看看标准差:
比平均值高了不止一个数量级。这显然是离群值的影响。在股票价格分析中,标准差是风险的度量,如此高的标准差是股票被视为风险资产的原因。
让我们来看看中位数:
与平均值相差不大,所以我们可能认为分布是对称的。
让我们检查分布的偏斜度,以便更好地评估对称性:
它是正的,所以我们可以假设分布是不对称的(即零偏度),并且右尾是一个不可忽略的权重。
如果我们对偏斜度进行测试,我们会发现:
非常低的 p 值表明分布的偏斜度不可忽略,因此我们不能假设它是对称的。
最后,我们可以测量峰度(scipy 对峰度进行归一化,因此对于正态分布,峰度为 0)
它和零有很大不同,所以分布和正态分布有很大不同。
峰度测试给出了这些结果:
同样,非常小的 p 值让我们拒绝峰度与正态分布相同(为 0)的零假设。
回报是正态分布的吗?
尽管统计上显著的高峰值和偏态值已经告诉我们收益不是正态分布的,但是 Q-Q 图会给我们图形上清晰的信息。
t = np.linspace(0.01,0.99,1000)
q1 = np.quantile(returns,t)
q2 = norm.ppf(t,loc=np.mean(returns),scale=np.std(returns))plt.plot(q1,q2)
plt.plot([min(q1),max(q1)],[min(q2),max(q2)])
plt.xlim((min(q1),max(q1)))
plt.ylim((min(q2),max(q2)))
plt.xlabel("Daily returns")
plt.ylabel("Normal distribution")
plt.show()
作者图片
直线是我们对正态分布的预期,而蓝线是我们从数据中得到的。很明显,我们的数据集的分位数不能与具有相同均值和标准差的正态分布的分位数相比。
因此,回报不是正态分布的,这使得像几何布朗运动(假设正态回报)这样的模型只是现实的近似。
波动聚类
一旦我们确定了收益概率分布的非正态性,让我们来看看原始的时间序列。
plt.plot(returns)
plt.xlabel("Time")
plt.ylabel("Daily returns")plt.show()
作者图片
很明显,有波动性高的时段,也有波动性低的时段。这种现象被称为波动聚集,在股票市场中非常普遍。实际上,标准偏差会随着时间的推移而变化,这使得时间序列变得不稳定。
仔细看看 20 天滚动标准差,就什么都清楚了。
plt.plot(returns.rolling(20).std())
plt.xlabel("Time")
plt.ylabel("20-days rolling standard deviation")
plt.show()
作者图片
很明显它不是一个常数值,但它有尖峰和振荡。分布的厚尾可能是由这些波动峰值引起的,这产生了不可忽略的异常值。
自相关函数
最后,我们可以绘制部分自相关函数,这使我们对时间序列的自相关性以及这种自相关性在某些 ARIMA 模型中用于预测目的的可能性有所了解。
plot_pacf(returns,lags=20)
作者图片
从这个图中可以清楚地看出,所有滞后之间没有很高的相关性。在 5 和 10 之间有一些滞后,显示了一些相关性,但与 1 相比,这是非常小的。
因此,我们很容易理解,使用一些 ARIMA 模型将是非常无用的。
结论
在本文中,我展示了一个简单的谷歌股票价格统计分析。回报不是正态分布的,因为它们是偏斜的,有厚尾。时间序列不是静态的,因为标准偏差随时间而变化。收益时间序列的自相关性在几乎任何滞后时间都很低,这使得 ARIMA 模型无用。
因此,使用统计学和机器学习来预测股票价格是一个巨大的挑战。使用 LSTM 模型已经取得了一些成果,但是我们还远远没有清楚地用一种赚钱的方式来模拟股票市场。
用一行代码进行统计和可视化探索性数据分析
NASA 数据集的例子
在我看来,探索性数据分析(EDA)是新数据集中机器学习建模最重要的部分。如果 EDA 没有正确执行,它会导致我们开始用“不干净的”数据建模,这就像一个雪球下山,越滚越大,越滚越坏。
良好的探索性数据分析的基本要素
探索性数据分析的深度可以是您希望或需要的深度,但基本分析需要包含以下要素:
- 第一个和最后一个值
- 数据集形状(行数和列数)
- 数据/变量类型
- 缺少值和空值
- 重复值
- 描述性统计(平均值、最小值、最大值)
- 变量分布
- 相关
我喜欢执行手动 EDA 来更好地了解我的数据,但几个月前,阿迪·布朗什坦向我介绍了熊猫概况。由于它需要相当长的处理时间,所以当我想快速浏览小数据集时,我会使用它,我希望它也能加速你的 EDA。
熊猫简介入门
在这次演示中,我将在 NASA 的陨石着陆数据集中进行 EDA。
你已经查过了吗?
好样的,易如反掌!
现在好戏开始了。
点击这里了解更多关于熊猫档案的信息:https://pandas-profiling.github.io/pandas-profiling/docs/
你喜欢这篇课文吗?你可能想查看一下 最好的免费数据科学电子书 。