Azure Kubernetes 服务如何执行零停机更新?
诺德伍德主题公司在 Unsplash 上拍摄的照片
本文给出了工作流的概述,并演示了如何通过 python 更新已部署的模型
机器学习模型有一个生命周期,这个周期的一部分是再培训/重新部署。模型需要更新的原因有很多(例如,特征漂移、协变量和目标之间的不同关系、改进、定期刷新等)。假设模型是Azure Kubernetes Services(AKS)中的一个实时应用,我们如何在不中断服务的情况下更新模型?
假设 :熟悉 Azure 机器学习软件开发包(SDK)和 Kubernetes 。
来源:史蒂文·洛艾萨
Kubernetes 更新工作流
Kubernetes 提倡部署模型的零停机更新。换句话说,建模服务不会被更新中断,它将继续处理请求而不会出错。
更新以分阶段的方式执行,以确保应用程序不受影响。假设您已经在 Azure Kubernetes 集群上部署了容器映像(模型)的第一个版本。您已经开发了模型的第二个版本,现在准备更新现有的 web 服务。
- 创建一个图像并将更新提交给 web 服务(下面是 Python 示例)。
- 由于这是一个渐进的展示 版本 2 创建了一个 新 pod,并将其添加到负载平衡器。
- 映像版本为#1 的 pod 将被删除,负载平衡器将停止向 Pod 发送请求。尽管 pod 被删除,但它仍保持活动状态,以完成它仍在处理的任何请求(默认的终止宽限期为 30 秒【1】)。
- 重复,直到部署中的所有单元都有映像的版本#2。
来源:史蒂文·洛艾萨
Python 实现
现在您已经理解了在 AKS 上更新图像的概念,我们将讨论如何通过 python 实现它。代码和配置文件位于 GitHub 上。
前置条件
- AML 工作区,计算实例,AKS 推理群集
- 已部署的 AKS 服务
- 该模型的新版本
更新方法有许多可以改变的参数【4】,默认设置为无,保持不变。当更新建模服务时,我包括推理配置(指定环境和评分脚本的路径)、模型、自动缩放和内存。
下面是azure_utils.py
中定义的AmlUtility
类。该类有几个函数来加载配置文件、设置环境、定义推理配置、加载新模型和部署更新。
在终端上运行的示例脚本来自存储实用程序脚本的目录,它是:
python azure_util.py --config_path config.json --service_name current_deployment_name --new_model model_name:2
只要没有错误,当建模服务更新完成时,终端上的日志将会显示。
结论
这篇文章是为了教育目的。更新产品建模服务很可能超出了数据科学家的权限范围。停机会带来成本,因此更新和最小化成本最好留给其他专业团队。但是在开发阶段,当您迭代不同的版本时,这仍然是一个有用的特性。
一如既往地感谢您的阅读。你可以在 LinkedIn 上找到我!
参考
【2】:https://www.youtube.com/watch?v=mNK14yXIZF4
https://kubernetes.io/docs/concepts/workloads/pods/
附录
未来相关文章
- 在 AML 中注册模型
- 在 AK 上部署模型并在本地调试
- 通过 ModelDataCollector()进行日志记录
问题
我在测试AksWebservie.update()
【4】时遇到的两个问题:
- 关于第 #3 点,您可能会看到一个“ 错误:副本在回复前关闭连接”。 发生这种情况是因为在 pod 被完全删除之前请求没有完成。**解决方案:**配置 pod 的终止宽限期,这可能超出了数据科学家的范围。【3】
- 如果映像通过 ModelDataCollector 转储日志,您可能会在部署过程中丢失日志。我没有找到与此问题相关的文档。**解决方案:**在非高峰时段更新映像,以最大限度地减少请求日志的丢失。
转行成为数据科学家是什么感受?
为什么我很高兴我做到了
伊恩·施耐德在 Unsplash 上拍摄的照片
近年来,数据科学获得了极大的普及。越来越多的企业投资于数据科学,这使得对数据科学家的需求保持在当前的高水平。
两年前,我决定转行,最终目标是成为一名数据科学家。这是一个艰难的决定,因为我已经在不同的领域有了 6 年的专业工作经验。
尽管面临不可避免的挑战,我还是做了那个决定,花了将近两年的时间找到了我的第一份工作,成为一名数据科学家。在这篇文章中,我将分享我得到这份工作之前和之后的经历。
我的故事有两个方面。一个是关于在获得相当多的经验后改变职业。另一个是关于在当前竞争激烈的就业市场中找到一份数据科学家的工作。
职业转变
我首先想到的是浪费职业生涯的想法,这让我感到非常担忧。这是 6 年的努力工作和奉献。无论我在职业生涯中做什么,我都尽力超越标准。
然而,数据科学带给我的似乎比职业生涯更有吸引力。我将学习许多新概念和工具,然后有机会运用我的新技能来解决各种各样的问题。这正是我在工作中所羡慕的。
让我失去工作动力的是一遍又一遍的做同样的任务。作为一名数据科学家,我不会面临这样的问题,因为
- 数据科学仍然是一个不断发展的领域,新的工具和技术很快就会被引入,
- 数据科学涵盖许多不同行业的广泛应用,因此问题的多样性非常高。
穆罕默德·阿里扎德在 Unsplash 上拍摄的照片
因此,我在地平线上看到的是一个充满乐趣和兴奋的繁华小镇。这让我更容易做出决定,并朝着成为数据科学家的目标前进。
转行的成本其实取决于你对职业的期望。如果学习新事物和解决不同类型的问题听起来很有趣,那么改变一下是值得的。需要强调的是,这也很大程度上取决于你目前的工作。
从技术角度来看,我在成为数据科学家之前的经验不会是一项宝贵的资产。作为一名数据科学家,我可以利用其中的一小部分。然而,我已经准备好去学习达到我的目标所需要的一切。
从积极的方面来看,在专业的工作环境中工作让我更容易适应新工作。能够顺利过渡到协作工作环境也是一项重要技能。
找到第一份工作
在找到第一份工作之前,你可能会遇到一些挑战。在做决定和投入时间和精力之前,最好先了解他们。
首先,就业市场的竞争越来越激烈。是的,对数据科学家的需求很高。然而,有抱负的数据科学家的数量也在迅速增加。你应该意识到找工作并不像表面上看起来那么容易。
另一个挑战是在没有工作经验的情况下证明自己的技能。在大多数申请中,我甚至无法通过第一步,也无法获得技术面试。我觉得人力资源专业人士没有考虑我的简历,因为我缺乏该领域的工作经验。
我得到了很少的技术面试,而且我大部分都做得很好。这让我很开心,也让我有动力通过技术面试。这是一个好迹象,表明我走在正确的道路上,并提高了我的知识。
这篇文章的目的不是关于你应该学什么。有大量的资源、文章和博客文章解释了数据科学家所需的按需技能。因此,我跳过这一部分。
在花了将近两年时间后,我找到了第一份工作,成为一名数据科学家。新工作的第一天,我感到如释重负。我不确定这是因为完成了一个长期目标还是因为有机会解决有趣的问题。不管是什么,它让我很开心。
我没花多长时间就开始着手这些项目。这进一步激励我开始做出贡献。我参与的越多,学到的新工具和技术就越多。
如果你是一名数据科学家,我认为永远不会有你没有新东西可学的时候。我发现这是成为数据科学家的绝佳理由。
如果你担心等级制度和初级-高级的东西,在漫长的职业生涯后,你可能会有一段艰难的时间从初级开始。我一点也不介意。作为一名数据科学家,工作的满足感是如此吸引人,以至于我不在乎这些小问题。
结论
我试图分享我转行成为一名数据科学家的经历。这花了我将近两年的时间,所以有很多要谈的。长话短说,我很高兴我做了这个决定。
就业市场的竞争比表面上看起来更加激烈。因此,你应该准备好接受挑战。当你找到第一份工作时,你所牺牲的一切都会得到回报。至少对我来说是这样。
感谢您的阅读。如果您有任何反馈,请告诉我。
在《代码之夏》中,开源对一个组织的贡献如何?
为开源做贡献的乐趣
想为开源做贡献却不知道从何下手?
我在这里分享我作为 让我们成长更多 SOC 2021 的积极参与者为开源做出贡献的经历。
之前我已经通过参加 DigitalOcean 举办的Hacktoberfest2020进入了开源的世界。当我看到我的第一个拉取请求被合并时,我欣喜若狂!!这也是我第一次获得关于版本控制系统 Git 和 GitHub 的实际操作经验。
Roman Synkevych 在 Unsplash 上拍摄的照片
然而,在最初的推动之后,我失去了为开源做贡献的动力,因为我参与了其他各种领域的学习。虽然我继续使用 Git 和 GitHub 用于我自己的目的,比如我的个人项目和客户,但完全脱离了开源。
然后,在七月的一个晴朗的日子里,我开始了解让我们成长得更快,它为开源贡献者提供了什么,以及加入并成为他们开源社区的参与者是多么容易。我是通过他们在 LinkedIn 上的帖子得到这些信息的。
我在 https://letsgrowmore.in/访问了他们的官方网站,真的被他们的原则、意识形态和帮助整个学生群体、提升他们的目标所感动。这是一个“由学生创建并为学生服务”的组织。
我下定决心不要失去这个千载难逢的机会,并重拾对开源项目的热爱和热情。我很快在他们的官方网站上填写了参与者角色的注册表格,并祈祷一切顺利。
终于,经过一周的等待,我收到了我的选择邮件!!
我一读完这封邮件,就迅速跳转到他们的网站,浏览了他们的整个项目列表,找到了每一个项目的描述,还留意了每个项目所需的技术堆栈。
起初,我沮丧地意识到大多数项目都是 web 开发,需要 JavaScript 和 TypeScript 知识。我完全没有这些编程语言的知识或经验。
但是当我注意到一个应用程序开发项目时,我仍然没有失去希望,继续寻找,尽管它是基于或使用 Flutter 进行开发和生产的,而且我对它有非常基本的了解。
Artur Shamsutdinov 在 Unsplash 上拍摄的照片
当这个项目已经开始并且已经进行了将近一半的时候,我加入了这个项目。因此,大多数简单的或第一个问题要么已经解决,要么有人被指派或正在处理这些问题。
我获得的知识和剩余的时间太少,不足以对一个颤振项目做出贡献。
我变得沮丧,责怪自己为什么不早点开始,质疑自己选择这么难的项目的选择。
几天过去了,我变得越来越焦躁不安。然后,我想,为什么不访问一次项目列表,看看是否有我没有注意到的项目。就在我打开我的笔记本电脑时,我在他们的 不和谐 频道中收到通知,他们的一位导师告诉我,一个新项目已经添加,正在积极寻找贡献者来完成!!
令我惊讶的是,这纯粹是关于数据结构和算法的话题。这是一个我非常感兴趣的话题,我对此也有足够的了解,并且非常有信心为之做出贡献。
克里斯·里德在 Unsplash 上拍摄的照片
我检查了他们的 GitHub 库,查看了他们的问题列表。我精通并有信心为 Java 做出贡献。因此,我专门寻找那些要求或需要这种技术堆栈的主题。
最后,我找到了一个,没有再浪费时间,我请求项目管理员把这个问题分配给我。
他是一个不错的人,在几个小时内就分配了这个问题,但给出的最后期限是一天!!
我开始争分夺秒地完成工作。写完整个代码后,我通过测试用例来运行它,在尝试了几个小时后,它成功了!!然后我修复了所有的拼写错误,检查是否有任何类型的代码重复,并检查我所有的变量/字段和函数/方法名称是否遵循了正确的命名约定。接下来是正确的文档!!
在完成并检查了所有任务之后,我终于创建了一个拉请求。
令我惊讶的是,我的拉取请求被合并了,我不必做任何进一步的更改!!我的代码遵循了项目管理员制定的所有规则和条例,也很干净,没有任何代码重复,并且有很好的文档记录。
这是我对开源项目的第二次贡献,也是我参与https://letsgrowmore.in/的全部经历。
希望你们都能发现我的经历提供了足够的信息,并激励你们为开源项目做出贡献,并加入一些促进开源项目并鼓励其他人参与其中的优秀组织!!
最后,永远记住, “每一个小小的贡献都是有价值的!!从代码到无代码,从改进文档到修复错误,编写代码来创建和/或修改功能。”
Python 垃圾收集是如何工作的?
不幸的是,此时此地,我在 Pixabay 的旅程结束了
保持 Python 对象被引用,否则它们将被释放到内存中。
每种编程语言都有其特定的垃圾收集机制。这是指那些未使用的变量,它们仍然占据内存中的一些空间,最终将被删除。这对于更有效地利用存储空间是很重要的。
你有没有想过 Python 垃圾收集是如何工作的?特别是,Python 如何知道一个对象变得无用?在本文中,我将演示这种机制。将使用一些内置功能,如id()
和getrefcount()
。
显示内存地址
图片来自 Pixabay
在我们继续垃圾收集机制之前,有必要建立内存地址的概念。别担心,不一定要深潜。我将演示如何使用id()
函数,这就足够了。
首先,让我们定义两个 Python 列表。就内容而言,它们可以完全相同。
a = [1, 2, 3]
b = [1, 2, 3]
显然,变量 a 和 b 是一样的。但是,这是否意味着这两个变量指向同一个内存地址呢?不。我们来验证一下。
id(a)
id(b)
id()
函数会给我们一个对象的“身份”,用整数表示。如图所示,整数是不同的。所以,变量 a 和 b 指向不同的内存地址,尽管此刻它们是相同的。
如果我们创建另一个变量 a1,并让 a1 = a,就不会创建新的对象。相反,a1 将指向与 a 相同的内存地址。
有道理,这就是为什么当我们改变 a 时,a1 也会被更新。
参考计数
图片来自 Pixabay
现在我们可以讨论最重要的概念——引用计数。
基本上 Python 中的引用计数表示对某个对象的引用次数。这很重要,因为垃圾收集机制依赖引用计数来决定对象是应该保留在内存中还是应该释放在内存中。
也就是说,当对象的引用计数等于零时,它将被释放。非常直观合理的,当一个对象没有任何引用的时候,就意味着这个对象被抛弃了,没有用了。
那么我们如何获得引用计数呢?事实上,它可以被设计成一个内部机制,而不是简单地向开发者展示。但是,Python 实际上在sys
模块中提供了一个名为getrefcount()
的内置函数,可以方便地查询对象的引用计数。
要使用这个功能,我们需要从sys
模块中导入它。这是 Python 3 的任何版本都内置的,所以您不需要下载或安装任何东西就可以使用它。
from sys import getrefcount
然后,让我们使用这个函数来查询引用计数。
a = [1, 2, 3]
print(getrefcount(a))
在这个例子中,我创建了一个变量a
,并为它分配了一个简单的 Python 列表。然后,getrefcount()
函数显示这个对象的引用计数是 2。
但是等等,为什么是 2?请看看下面的图表。
事实上,当我们使用getrefcount()
函数查询一个对象的引用计数时,该函数必须建立对该对象的引用。这就是引用计数为 2 的原因。表示变量a
和函数getrefcount()
都在引用列表[1, 2, 3]
。
什么会增加引用计数?
图片来自Pixabays . Hermann&f . Richter
现在我们已经了解了引用计数以及如何查询一个对象的引用计数,但是什么会导致引用计数发生变化呢?以下操作将使引用计数增加 1。
1。创建对象并将其赋给一个变量。
这已经在前面的部分中演示过了。当我们创建 Python 列表对象[1, 2, 3]
并将其赋给变量a
时,列表对象[1, 2, 3]
的引用计数被设置为 1。
2。该对象被分配给另一个变量。
当对象被赋给另一个变量时,引用计数将加 1。但是,请注意,这并不意味着以下内容。
a = [1, 2, 3]
b = [1, 2, 3] # This will NOT increase the reference count
这已在第 1 节中讨论过。虽然列表相同,但它们是不同的对象。要增加引用计数,我们可以执行以下操作。
a = [1, 2, 3]
b = a
3。对象作为参数在函数中传递。
当我们使用函数getrefcount(a)
时,情况正是如此。变量a
作为参数被传递到函数中,因此它肯定会被引用。
4。对象被追加到容器类型中。
容器类型可以是列表、字典或元组,如下例所示。
my_list = [a]
什么会减少引用计数?
现在,让我们来看看将减少引用计数的场景。
1。该对象已从函数范围中删除。这通常发生在函数完成执行时。
如果我们尝试在函数执行期间打印引用计数,就可以验证这一点。所以,我们可以这样设计实验。
def my_func(var):
print('Function executing: ', getrefcount(var))my_func(a)
print('Function executed', getrefcount(a))
但是为什么引用计数是 4 而不是 3 呢?这就涉及到 Python 的另一个概念,就是“调用栈”。
当在 Python 中调用一个函数时,一个新的帧被推送到调用栈上用于它的本地执行,并且每次函数调用返回时,它的帧被弹出调用栈。
这个概念不在本文中展开,因为它超出了讨论范围。如果您不熟悉调用堆栈,我可以告诉您的是,您看到的带有回溯和行号的错误消息正是来自调用堆栈。
因此,在执行my_func()
期间,引用计数为 4。在它被执行之后,引用计数被减少回 2。
2。当引用对象的变量被删除时。
这个很好理解。当我们使用del
命令删除变量时,该变量将不再引用该对象。
请注意,如果我们在这种情况下删除变量a
,对象的引用计数将变为 0。这正是垃圾收集将释放该对象的场景。然而,这也意味着我们不能再使用getrefcount()
函数来检查引用计数。
3。当引用该对象的变量被赋予另一个对象时。
这种情况可能会更频繁地发生。当一个变量被赋予另一个对象时,当前对象的引用计数将减一。当然,新对象的引用计数会增加。
4。当对象从容器中移除时。
当对象被追加到容器中时,引用计数将+1。相反,当它被移除时,引用计数将为-1。
当然,如果我们删除容器,引用计数也会减少。
一个特例
请注意,只有一般对象可以通过这种方式进行调查。这意味着当值是一个文字常量,比如数字123
或字符串'abc'
时,我们确实有特殊的情况。
如上所示,引用计数可能是意外的。在我的例子中,我使用 Google Colab,这样环境可以被共享,这导致了如此大的引用计数。
另一个值得一提的重要因素是,文字常量保证位于相同的内存位置。
因此,只要在某处使用了数字123
,引用计数就可能增加。即使我们只有一个变量引用它,引用计数也可能更多。
摘要
图片来自 Pixabay 的 Innova Labs
在本文中,我介绍了 Python 中的垃圾收集机制。这是对象的引用计数。
以下操作将增加对象的引用计数:
- 创建对象并将其赋给一个变量。
- 该对象被分配给另一个变量。
- 对象作为参数在函数中传递。
- 对象被追加到容器类型中。
相反,以下操作将减少对象的引用计数:
- 该对象已从函数范围中删除。这通常发生在函数完成执行时。
- 当引用对象的变量被删除时。
- 当引用该对象的变量被赋予另一个对象时。
- 当对象从容器中移除时。
https://medium.com/@qiuyujx/membership
如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)
k-Means 算法是如何工作的?
查看无监督学习模型背后的数学和伪代码
本文是我正在撰写的关于机器学习关键理论概念的系列文章的延续。本系列其他文章在我的 页面 均有。
由 Karen Vardazaryan 在 Unsplash 拍摄的照片
无监督 学习又称模式 识别,是一种试图在数据集中寻找内在模式的方法,没有明确的方向或终点,以标签的形式存在。在口语中,在监督学习问题中,我们可能会告诉模型“从一组输入到确切的期望输出(在分类中)或尽可能接近输出(在回归中)找到最佳的一般路径”。然而,在一个无监督的学习问题中,在没有我们明确的输出的情况下,我们将告诉一个模型“揭示数据中一些隐藏的关系,这些关系乍看起来可能不明显,并使用这些关系来区分不同的组”。
无监督学习的好处之一是,它帮助我们发现潜在 变量。潜在变量是在我们的数据集中不明显的变量。它们隐藏在我们的数据集中,通常通过以某种数学方式组合多个特征来推断或产生。在不知道预期目标是什么来影响模型的情况下,它以更抽象的方式查看数据集,找到可能比监督学习问题中找到的关系更健壮的关系。
k 均值
K-Means 聚类将采用一组变量并找到 K 个聚类或组。这些聚类是不同的,但是它们中的数据点是相似的。这个想法是,我们能够将我们的数据集划分为 K 个组,这可能会告诉我们更多关于它们的隐含特征。每个聚类完全由其中心或平均值 mu_k 定义。
在机器学习工作流程的探索性数据分析阶段,这是一个很好的方法,因为它让我们有机会获取空白的、新鲜的数据集,并允许模型为我们提供一些指示,告诉我们在哪里可以找到有趣的关系。
模型的数学符号及其输出如下所示
作者图片
K-Means 从绘制 n 维空间中的所有数据点开始,其中 n 是我们拥有的特征变量的数量。例如,3 个特征将被绘制在 3D 图上,4 个特征将被绘制在 4 维空间上,以此类推…通过这种可视化,模型将试图在数据中分配点,我们的意思是,在中间有相似数据点的明显分组。迭代地,该模型将继续改进平均值,使用最小化类内距离和最大化类间差异的成本函数。
K-Means 算法的伪代码如下:
1 .随机初始化 mu _ k
2。相对于 r_nk 最小化 J,而不改变 mu_k
3。相对于 mu_k 最小化 J,不改变 r_nk
4。重复直到两个最小值收敛
考虑到我们已经初始化了平均值。我们现在将把它和我们的数据一起绘制在图表上,并根据它最接近的平均值给每个实例分配一个类。这是我们在步骤 2 中最小化的方法。其概念是,我们将转到第 3 步,试图找到一个更好的均值,然后返回第 2 步,看看这个新的均值如何改变 r_nk 值。正如步骤 4 告诉我们的,我们继续这个序列,直到我们找到收敛。
要显示步骤 2 的符号:
作者图片
在上面图像的第二部分,我们说如果 j 值(由我们测量的聚类平均值决定)返回最小距离,即我们将把这个实例 x_n 分配到的聚类,我们将把 r_nk 分配为 1。
第三步涉及到我们试图最小化我们每个集群的平均值。这是一个二次函数,我们可以从等式中看出。因此,我们可以通过微分使 J 最小化,将解设为 0 并求解。
作者图片
下图显示了典型的 k-means 聚类算法的演变。我们可以看到我们的迭代算法将如何收敛到 2 个不同集群的最优解。
【https://stanford.edu/~cpiech/cs221/handouts/kmeans.html
K-Means 的一些特性是我们应该注意的,如下所示:
- 因为优化算法的可微性,我们保证了收敛,但是我们遇到了达到局部最小值而不是全局最小值的问题,并且因为这个…
- …我们很大程度上依赖于初始平均值来找到全局最小值
- 很难定义集群的最佳数量,因此这可能需要一些微调和迭代
- K-Means 是一种昂贵的算法,因为每次迭代需要 K*N 距离比较
- 每个实例都被分配给一个集群,并且只分配给一个集群,如果我们有一些实例可能属于多个集群,这可能会有问题
- 距离计算对异常值很敏感
肘法
我们可以更详细地讨论其中的一点。我们如何选择最佳的聚类数 K?肘法就是我们这样做的。通常,当我们增加聚类时,我们会期望成本函数 J 下降,因为每次我们添加另一个均值时,它都会缩短到某些实例的距离。然而,这里有一个权衡,随着我们继续添加更多的聚类均值,过度拟合我们的数据的可能性就越高。这是可以理解的,因为我们在不断增加聚类的数量,以便更好地适应我们的训练数据,而没有注意到这个模型可能如何对我们的测试数据进行操作。记住这一点很重要,我们需要一个可以通用的解决方案,因此不是一个过于固定的训练数据,而是一个可以适应不同的未知输入并仍然给我们带来好结果的解决方案。
作者图片
肘部是我们开始看到回报率递减的点。我们增加另一个集群的好处与我们模型增加的复杂性不成比例。我们将通过对不同数量的集群进行一系列模拟,绘制它们的成本函数并观察图表来找到这个瓶颈,我们希望图表看起来类似于上面的图表。
这就是你对 k 均值的总结。我希望在以后的文章中更详细地介绍更多的概念,所以请密切关注这些概念!如果你对我以前的文章感兴趣,也可以关注我的页面。在那之前,✌️.
你的智能手表怎么知道你站着呢?
用简单的统计预测方法打开智能手表/智能手机健身功能的黑匣子。
在过去的几年里,我们看到了由臭名昭著的苹果手表引领的智能手表销量的突然激增。这个利基市场的持续增长似乎与现代社会对健康/健身日益增长的关注相一致(如本文 IDTechEx 文章所示),因此,我们看到每一次软件迭代或每一次新推出的产品都增加了越来越多的健康相关功能。
由于手表的大部分功能看起来就像是在你眼前表演的魔术(这个小东西怎么知道我什么时候躺下或者什么时候在走路?),这似乎是一个很好的数据科学练习,可以更深入地研究这个问题,看看至少其中一些函数是如何工作的。
深入挖掘
如何为此目的获取信息?
为了更好地理解这个问题,有必要知道什么可以用于这个目的。可穿戴设备使用传感器来“理解”用户的当前状况。角速度传感器(陀螺仪)和加速度传感器(加速度计)是最常见的运动和位置检测传感器。让我们尝试使用简单的方法重新创建一个身体位置预测器!
数据集
关于这一点的数据在 UCI 机器学习知识库中提供,更具体地说,在使用智能手机的人类活动识别数据集中提供,该数据集由 30 名志愿者构建,他们使用连接到他们的智能手机进行 6 种活动(行走、上楼、下楼、坐着、站着和躺着),以通过加速度计和陀螺仪捕捉信息。数据集包含以下属性:
- 来自加速度计的三轴加速度(总加速度)和估计的车身加速度。
- 陀螺仪的三轴角速度。
- 具有时域和频域变量的 561 特征向量。
- 它的活动标签。
- 进行实验的受试者的标识符。
让我们来看看数据是如何处理的。
通过存储库下载数据很简单,但它是以一种已经处理过的模式出现的。在数据集文件夹中,已经有包含 train (x_train 具有[7352,561]的形状,y_train 具有[7352,1]的形状)和测试分割的子目录。包含标签索引值的. txt 文件和包含训练/测试拆分中列的索引值的. txt 文件。对于本文和接下来的分析,我们组合所有处理的信息,最终得到一个形状为[10299,562]的数据帧,如下所示:
生成的数据帧。作者
请注意,已经为[-1,1]范围内的要素做好了准备,如下图所示:
功能列的最大值和最小值。作者
知道了这些值带,我们就可以看看特性列是如何表现的(至少是 562 中的一些)。为了对此有一个感觉,我们通过绘制它们的核密度估计(KDE)来看看我们的数据的 8 个随机选择的列的分布。
8 个随机选择的列的核分布。作者
查看 KDE 图,可以看到在这个随机样本中,我们有不同表现的变量。一些以高斯形式分布,一些更接近帕累托分布,这对于预测模型来说似乎很好。现在,我们检查随机列中现有的相关性,考虑到这个数据集的创建,这是完全自然的。
列相关矩阵。作者
查看这个由 10 个随机选择的列组成的相关矩阵,我们注意到,陀螺仪和加速度计注释的大多数信息似乎有很强的关系,为了确保这一点,有一组 15 个随机 10 列的相关图,最终看起来都与上面所示的类似。通过这些关系,可以观察到,即使对于无法承受超级复杂计算的系统,也有可能开发出良好的预测算法(以至于即使是低端智能手表市场也有这种功能)。
系统模型化
对于这种类型的预测,我们必须使用不需要高度计算能力的分类算法。这可以通过利用称为逻辑回归的广义线性回归方法来实现。这种建模技术将我们的输出限制在[0,1]的范围内,由于这个原因,给解释这个结果的人一种概率方法来得到函数的结果。输出被置于 0 和 1 之间的事实是输出通过受人喜爱的 Sigmoid 函数传递的直接结果,如下所示:
具有示例阈值的 Sigmoid 图。作者
请注意,x 轴上的所有值都被“挤压”到 y 轴上的[0,1]范围内。利用这种回归技术,我们可以说,在这些范围之间确定的预测值是它属于某一类的概率。
知道了哪种模型最适合我们,我们将数据以 66/33 的比例分成训练集和验证集,将训练集的 561 个特征(陀螺仪和加速度计信息)的 6900 个示例留给训练集,将相同数量的外生变量的 3399 个示例留给验证集。由于类别似乎有点不平衡,我们采用分层分割法,在分割数据时考虑了类别分布。用于拆分的代码示例如下。
strat_shuf_split = StratifiedShuffleSplit(n_splits=1,
test_size=0.33,
random_state=19)feature_cols = data.columns[:-2]
train_idx, test_idx = next(strat_shuf_split.split(data[feature_cols], data.Activity))x_train = data.iloc[train_idx][feature_cols]
y_train = data.iloc[train_idx]['Activity']x_test = data.iloc[test_idx][feature_cols]
y_test = data.iloc[test_idx]['Activity']
拟合
为了简单起见,没有做额外的工程来准备我们的特性,因为它们看起来已经适合预测了。当植入可穿戴设备中时,在数据准备步骤中利用的任何额外的计算量都可能导致较慢的预测器。了解这一点后,下一步是使用 LibLinear 解算器拟合逻辑回归模型,解算器选择的原因是 LibLinear 只有 O(n)复杂度,而其他选择(如 sklearn 中的 LinearSVC 解算器)具有 O(n)复杂度,因此需要使用计算资源。三行简单的代码就完成了拟合。
logistic = LogisticRegression(solver='liblinear')
fitted_lgstc = logistic.fit(x_train, y_train)preds = fitted_lgstc.predict(x_test)
评估
预测输出是一个长度为 3999 的数组,数组中的每个值都是通过模型的要素的标签编码预测活动。
对于模型质量检查,我们使用 F1 分数和混淆矩阵(理解预测的直观方式)。
F1 比分
F1 分数是精度和召回率之间的调和平均值,这是分类器的两个最重要的指标。
精度 TP/(FP+TP)是衡量一个类中有多少预测值实际上来自该类的指标(如果模型只预测一个类的示例,并且该指标的值为 1 是正确的,则该指标并不可靠)。
位置预测模型的精度。作者
召回率 TP/(TP + FN)是一个度量值,它告诉我们有多少实际的真值被预测为真,由于向有偏差的模型打开了一扇门,因此也不那么稳健,一旦模型预测了一个类的所有值,我们就会得到一个召回率值。
回忆一下位置预测模型。作者
F1 分数为我们提供了一种数学方法,可以将两种指标结合起来,而不会偏向每一种指标。出于这个原因,我们来看看我们的模型得分。
F1 分数。作者
请注意,对于这样一个简单的技术,分数是很大的,表明在建模技术的所有真阳性中,我们正确地预测了一个非常好的数量,而没有偏向于预测该类的全部或非常少。
混乱矩阵
预测的混乱矩阵。作者
混淆矩阵从视觉上确认了 f1 得分指标已知的内容。该模型在大部分时间内都正确处理了所有的类,只是在处理坐着和躺着的类 3 和 4 时有点混乱
结论
用简短的技术术语来说,这基本上是你的手表或手机如何知道你的位置。利用陀螺仪和加速度计传感器创建特征,并将这些特征传递到预先训练的位置模型中,有点像本文中讨论的简单模型。每隔几分钟进行一次预测,就有可能开发出位置计时器,用来提醒用户每隔几分钟移动一点,计算步数以及现代可穿戴设备中广泛使用的许多其他健康/运动功能。
代号
此分析中使用的完整代码可在 此处 获得
来源
https://www.iotforall.com/sensors-that-matter-wearables https://www.idtechex.com/en/research-report/wearable-sensors-2021-2031/780
https://archive . ics . UCI . edu/ml/datasets/Human+活动+识别+使用+智能手机
https://machine learning mastery . com/how-to-model-human-activity-from-smart phone-data/
引文
达维德·安吉塔、亚历山德罗·基奥、卢卡·奥内托、哈维尔·帕拉和豪尔赫·雷耶斯-奥尔蒂斯。使用智能手机进行人类活动识别的公共领域数据集。第 21 届欧洲人工神经网络、计算智能和机器学习研讨会,ESANN 2013。2013 年 4 月 24 日至 26 日,比利时布鲁日。
如何下载子编辑评论
安妮·斯普拉特在 Unsplash 上的照片
从 NLP 和分析任务的特定子编辑中下载所有评论。🖇github:pistocop/subreddit-comments-dl
这个故事是一个更大项目的一部分:“利用 Reddit 评论和 ML 技术创建一个产品知识库”,敬请关注!
🏃TL;速度三角形定位法(dead reckoning)
赶时间?运行这段代码!
💡确保正确设置“< … >”参数!
👨🏫介绍
假设你想做一个市场调查,也许是在某个特定的领域,比如某辆特定的自行车,某个特定的政党,甚至是在 Gamestop 事件前几周 wallstreetbets 上发生了什么。
对于这种特定的任务,分析用户评论可能是一个很好的机会,从 reddit 获取这些评论是一个快速而聪明的想法,因为这些社交评论的质量很好( OpenAI 也用它来训练 GPT 模型)。
是的,确实有一个选择是从 pushshift 下载Reddit 的最新转储,但是获得> 15Gb 的数据以使用少于 100Mb 的数据并不是每个人都可行的方法。我们需要完成的任务也不需要来自 reddit 的新数据,因为 pushshift 转储每月进行一次。
最后但同样重要的是,如果我们能够避免占用无用的 Pushshift 带宽,这是一件好事,例如,我们将使用的代码被定制为调用 Pushshift 最少次数。
因此,让我们探索一种从特定子编辑中收集评论的方法,如果我们需要,可以使用时间约束,以一种简单快捷的方式。
🎯主项目
本文探讨了一个更大项目的一个组成部分,该项目旨在利用 reddit 的评论来构建产品知识库。简而言之,这是一个更大链条的第一环:
主体建筑概述——作者形象
🛂恢复凭据
首先我们需要一个 reddit 上的账号和一些账号参数: reddit_id 和 reddit_secret 。查看下一个表,了解如何检索这些参数。
带链接的原始表格可在pistocop.dev/posts/subreddit_downloader/获得
还在纠结reddit_id
和reddit_secret
怎么走?
看看这篇好文章:
🚀下载数据
我们假设 python3 已经安装并运行在您的电脑上
在凭证检索之后,让我们使用src
文件夹下的脚本subreddit_downloader.py
来面对数据下载部分。
脚本的其他参数有:
--output-dir
→可选输出目录【默认:。/data/]--batch-size
→每次请求提交“batch _ size 默认值:10]--laps
→请求提交“batch _ size”Reddit 的次数[默认值:3]--utc-after
→获取该 UTC 日期之后的提交--utc-before
→在此 UTC 日期之前获取提交内容
例如,这是从AskReddit和 News 下载投稿和相关评论的基本用法:
用不同的 subreddit 和不同的时间范围,重复上述过程任意多次。
💡提示:使用一些在线工具,比如 EpochConverter 来计算你想要的 UTC 时间
🏗构建数据集
下载完成后,我们可以创建一个机器可读的数据集,以后可以用于分析、机器学习和许多其他目的。
要构建新的数据集,只需运行 dataset_builder.py 脚本,进度条将显示构建过程中的状态。构建完成后,您可以在数据集文件夹下检查您的结果:每当您构建一个新的数据集时,脚本都会创建一个新的文件夹。
**💡如果您使用不同的
*--output-dir*
参数运行 subreddit 下载脚本,请相应地更改 dataset_builder.py*--input-dir*
参数
🎭输出文件格式
创建的数据集采用 CSV 格式,并遵循以下结构:
📌结论
在本文中,我们看到了如何使用 praw 和 pushshift API 从特定的子编辑中收集数据。这种介绍希望成为一个更雄心勃勃的项目的第一项任务,该项目侧重于建立一个特定产品或实体的知识库。如果你感兴趣的话,我们会在下一篇文章中用变形金刚从评论中提取信息!
📖词汇表
- reddit 网站上专注于某个特定主题的部分
- 提交:出现在每个子编辑中的帖子。当你打开一个 subreddit 页面,你看到的所有帖子。每个提交都有一个*评论树*
- 评论:Reddit 用户在提交下的子编辑
- 中编写的文本。这个库的主要目标是收集属于子编辑的评论
✍笔记
- 在幕后,脚本使用 pushshift 来收集提交 id,使用 praw 来收集提交的评论
——使用这种方法,我们需要更少的数据给pushshift
——由于使用了 praw API,需要 reddit 凭证 - 关于
--help
命令下的subreddit_downloader.py
脚本的更多信息
毕业后立即找到一份数据科学家的工作有多容易?
办公时间
简答:没那么容易!
我们都有过这样的经历:被数据科学家职位的众多职位空缺以及称之为 21 世纪最性感工作的时髦词汇弄得眼花缭乱。那么,这种宣传达到预期了吗?
让我分享一下我在这方面的想法和经验,因为我最近刚从机器学习硕士学位毕业,并且我积极参与了几个月的求职工作。经过一番挣扎和几次拒绝之后,我的申请终于得到了一些肯定的答复。我会谈谈那几个月紧张的求职过程,以及我是如何找到工作的。
声明:这些是我的个人观点,可能反映也可能不反映实际情况。写这篇文章的目的是分享我的故事以及一些可能让你找工作更容易的提示和技巧。
早点开始。
我给出的第一条建议是尽早开始,最好是毕业前 3-4 个月。这不是必须的,但它帮助我没有太大的压力,因为我确保我有足够的时间准备我的简历、求职信和其他相关的博客。
我在法国获得了硕士学位,因为这是一个物价昂贵的国家,毕业后失业对我来说是不可持续的。可能不是每个阅读这篇文章的人都这样,但是尽早开始通常是个好主意。动手吧!
我在 2021 年 7 月底毕业,所以我早在 4 月中旬就开始准备我的简历和其他文件。我在五月初开始申请工作。
不要在求职信上睡觉。
我相信求职信和一份好的简历一样重要。确保你花了大量的时间来准备它。保持求职信相对简短,易于阅读。首先简单介绍一下你自己,然后用一段开场白说明你如何适合这个职位。然后你可以继续解释你有什么技能,以及这些技能(还有你的成就)如何让你非常适合这份工作。
当你写简历的时候,确保你没有任何拼写错误,并且在谈论你的教育背景之前从工作经历/实习经历开始。此外,在简历中添加一些你在机器学习方面的著名项目,不要忘记提到你是否参加过任何 Kaggle 比赛。
像你硕士项目中的成绩一样突出你的成就是一个好主意。请随意把你的爱好写在简历里,简历会简要介绍你的个性。由于招聘人员以不会在简历上花太多时间而闻名,所以你最好把简历的长度控制在一页以内。
一致性是关键。
在我找工作的过程中,我发现在不同的平台上拥有一个一致的和最新的总体概况是必要的。我的意思是,当你在简历中提到你的 LinkedIn 和 GitHub 个人资料时,确保用你在简历中使用的相同信息更新它们。
其实你可以在你的 LinkedIn 和 GitHub 里面对项目和实习做更多的阐述。有一些 CV 制作网站会让你选择在你的项目旁边添加超链接,这将带你到相应的 GitHub 库。我真的很喜欢这个功能。
对工作职位进行调查。
更多地了解工作角色和公司会给你在面试中带来很大的优势,你可以很容易地用你的准备给他们留下深刻印象。
此外,你还可以利用该职位的职位描述来微调你的简历和求职信。例如,如果工作是 NLP,你可以用这些信息在简历中突出你的 NLP 项目和你的技能。这一点很重要,因为考虑到一页简历的空间限制,这种微调会让招聘人员关注他们感兴趣的项目。
这似乎是显而易见的,但我见过许多学生使用通用简历和求职信来申请各种职位。
利用远程面试成为你的优势。
来自 Pexels 的 Vanessa Garcia 的照片
自从疫情以来,许多面试都是通过视频会议进行的,如果你仔细想想,你实际上可以利用这一点进行有效的面试。
用你在简历中提供的所有信息准备一些关于你自己的幻灯片/演示。你可以使用屏幕共享选项来展示幻灯片,并向面试官解释你的技能。我尝试了多次,面试官对这个想法印象深刻,他们更愿意和我交谈。
以前,我会做一个关于我自己的口头介绍,并希望面试官在我谈论我的技能时看一下我的简历。随后,面试官会在某个时候失去注意力,因为我很自然地兴奋地详细解释了我的实习工作。事先准备一些有趣的幻灯片,帮助我解决了这个问题,实际上你可以用这个来创新。比如,添加一些额外的信息,告诉你如何利用你的机器学习技能来改善公司的服务或产品。同样,你需要对公司做一些研究来实现这一点。
扩大你的搜索范围。
安娜·涅克拉舍维奇摄于佩克斯
根据你的兴趣、优势以及特定主题的背景,你可以从公司通常发布的不同职位中进行选择。不要把自己局限于一个普通的数据科学家角色,花一些时间去理解不同数据科学角色的细微差别,这些角色通常有许多重叠。这样的例子包括数据科学家、数据工程师、机器学习工程师、数据分析师等等。问题是,这些角色没有严格的界限,他们分享许多相互重叠的技能。
根据我的观察,公司喜欢在他们为数据科学家发布的工作邀请中包括数据工程师的职责。(这可能是因为公司不希望为多个职位雇佣多人,而是希望由一个人来处理。在我看来在创业公司中更常见)。此外,也有公司提供数据科学家的职位,但工作描述更倾向于数据分析师的职责。
我的硕士课程更侧重于对机器学习算法的详细理解,而不仅仅是应用它们来解决问题,并对其进行了研究。所以在找工作的过程中,我的目标是数据科学家、ML 工程师等适合我的职位,以及一些基于研究的职位。拥有更广泛的选择增加了我获得这份工作的机会。
我还观察到,应用程序的成功取决于您的目标领域。假设你有银行业的机器学习实习经验,那么你在类似领域的工作申请将有更高的机会被选中。再说一遍,这是一个显而易见的问题,只是把它放在那里。
理想情况下,仔细思考你的个人资料,了解哪种数据科学角色更适合你。互联网上有几篇文章可以帮助你了解不同数据科学职位所需的技能。
跨国公司与初创企业
我曾想过哪种公司会更好地对待你的申请,并给你一个快速的回复。在我找工作的过程中,我在跨国公司和创业公司都有过糟糕的经历,我从未收到他们的回复(甚至没有一封拒绝邮件!).
但有时我会得到一家跨国公司和一家初创公司的快速回应。我想这取决于你的简历对目标公司的吸引力。以我的情况来说,我也申请了研究实验室,也给了我很好的回应。
我找工作时用的工具。
这可能是这篇文章最吸引眼球和最有趣的部分。以下是我在求职申请中使用过的一些工具和网站:
- 简历😦【https://novoresume.com/】T2)这是我常用的简历制作网站,如果你只是在制作一页纸长度的简历,它是免费的,对我来说非常完美。此外,您可以在项目中添加超链接,这很方便。我发现任何一份简单的简历都可以胜任这份工作,你所要关注的就是你要放进去的内容。
记住,招聘人员不会花太多时间阅读精心制作的简历,而且你必须在接到面试电话前浏览 ATS 软件。 - 求职信:我浏览了网上的几封求职信。我的建议是,使用这些信件只是为了信件的结构和内容,你应该根据你的个人资料制作一封个性化的信件。你可以遵循我在求职信中提到的建议。
- 求职门户网站:起初我在 LinkedIn 上申请,但后来我开始使用一些选项,比如 Indeed、Glassdoor 和我大学的就业中心(在 JobTeaser 上)。如果你有兴趣申请基于研究的工作,EURAXESS 是一个很好的选择。我的大部分求职都以欧洲为中心,更侧重于法国。
- 编码和概念 : YouTube 是在很短的时间内重温机器学习概念的救星。我用 Kaggle,HackerRank 和 LeetCode 来练习我的编码技巧。也许我之前提到过这一点,但是保持你的 GitHub 档案的更新,用你在简历中展示的相关项目的整洁文档。
- 动力和健康:只是一个友好的提醒,要注意你的健康,不要压力太大(我知道说起来容易做起来难,但是是的!).
一些激励的话。
照片由 Prateek Katyal 从 Pexels 拍摄
我只是想在找工作的过程中加入一些“BTS”时刻。在我申请工作的头两个月,我甚至连面试的机会都没有。我相信大多数时候我的申请都没有通过 ATS 软件。我反复修改了我的简历和求职信很多次,增加了质量。
我经常收到这样或那样的电子邮件,内容如下:
“虽然你的经历给我们留下了深刻的印象,但我们真诚地感到遗憾,我们现在不能录用你。”
随意询问你被拒绝的原因(如果你有可能的话),以了解你应该关注你的申请的哪一部分。我在狩猎快结束时意识到了这一点。哦好吧:')
有一段时间,我不得不接受 3 次面试,还做了一个案例研究,结果却收到了一封拒绝邮件。这一次,我记得就这个决定征求反馈意见,结果公司完全无视了我。像这样的事情可能会发生,所以我觉得最好将你的期望保持在最低水平,享受这个过程,而不是专注于结果。迟早有一天,你会挖到金子。耐心点!
随着我的毕业日期越来越近,尽管压力很大,我还是尝试制作高质量的应用程序(根据我几个月来收集的所有经验),最终,我成功地找到了一个非常适合我的资料的数据科学家职位。
最后,我很高兴与社区分享我的经验。我目前是一个写作中等帖子的初学者,但我希望我的每个新帖子都能提供高质量的内容。
如果你已经看到了这篇文章,感谢你的阅读和关注。我希望你觉得这篇文章内容丰富,如果你有任何问题,请随时通过 LinkedIn 、 Twitter 或 GitHub 联系我。
使用基于 MATLAB 的小波分析进行信号去噪的效果如何?
我们检验了用小波分析滤除时间序列数据中噪声的可行性。
斯蒂芬·克拉克莫在 Unsplash拍摄的照片
小波分析可视为傅立叶分析的一般形式。傅立叶变换常用于信号去噪。尽管如此,这种方法最大的缺点是信号需要稳定。我们现实世界中的大多数测量都不是静态的。此外,在基于傅立叶的去噪中,我们应用低通滤波器来去除噪声。然而,当数据具有高频特征时,如信号中的尖峰或图像中的边缘,低通滤波器会将其平滑掉。
这里,基于小波的方法可能有一些优点。小波查看多分辨率窗口中的信号。它将信号中的特征定位到不同的尺度。我们可以利用这一点,保留重要信号,消除不均匀噪声。我已经在之前的文章中介绍了使用小波进行多分辨率分析的基础知识。
小波去噪
当我们对时间序列进行小波变换时,它将信号特征集中在几个大的小波系数中。一般而言,数值较小的系数被视为噪声。理论上,我们可以缩小这些系数,或者干脆去掉它们。
获取真实世界的信号
在这种情况下,我将下载记录大地震的地震时间序列。我将使用Obspy
模块从 IRIS 下载数据。有关如何使用 Obspy 下载波形的详细信息,请参见我的上一篇文章。我将下载位于(北纬 38.1689,西经 117.8497)的任意选定事件“2020-05-15 Mww 6.5 Nevada”的波形。
这将 mseed 数据保存到脚本目录以及“流”的绘图中。我还对信号进行了高通滤波,以获得时间序列的高频部分。
内华达 2020 年 5 月 15 日 Mww 6.5 II-PFO 垂直分量波形(图片由作者提供)
将 mseed 转换为 mat 格式
现在,我们想让数据 MATLAB 可读。我写了一个实用程序来将任何 mseed 格式的数据转换成 mat 格式。我将在这种情况下使用它。
使用 MATLAB 的 2020 年 5 月 15 日 Mww 6.5 Nevada II-PFO 垂直分量波形(图片由作者提供)
基于非抽样小波变换的信号去噪
我将使用 Matlab 函数wdenoise
通过sym4
和db1
小波将信号降噪到 9 级。wdenoise
使用带有柯西先验的经验贝叶斯方法对信号降噪。
使用 sym4 对地震时间序列进行降噪处理(图片由作者提供)
在上面的代码中,我通过设置名称-值对“DenoisingMethod”、“BlockJS”,使用级别 9 使用块阈值对地震时间序列进行降噪。我用了小波sym4
。
与原始时间序列相比,信号强度的最终差值为82.5786
。
此外,我使用不同的小波db1
尝试相同的过程。
使用 db1 的去噪地震时间序列(图片由作者提供)
这使得信号强度与原始时间序列相比的差值为34.5294
。因此,我们发现小波sym4
中的差异是显著的。我们还可以使用其他几个参数,包括级别。
对于“sym4”小波,我尝试将级别更改为 2、5、10,并得到 SNR 分别为 82.7493、82.5789、82.5786。不同电平的 SNR 之间的微小差异可能表明,在这种情况下,高频噪声量并不过量。让我们尝试使用有噪声的合成数据来验证这一假设(在这种情况下,我们将拥有完全的控制权)。
基于四级近似的小波重构(图片由作者提供)
完整的 MATLAB 代码
clear; close; clc;
wdir='./';
fileloc0=[wdir,'II-PFO-BHZ'];
fileloc_ext = '.mat';
fileloc = [fileloc0 fileloc_ext];
if exist(fileloc,'file')
disp(['File exists ', fileloc]);
load(fileloc);
all_stats = fieldnames(stats);
all_data = fieldnames(data);
for id=1
%% read data and header information
stats_0 = stats.(all_stats{id});
data_0 = data.(all_data{id});
sampling_rate = stats_0.('sampling_rate');
delta = stats_0.('delta');
starttime = stats_0.('starttime');
endtime = stats_0.('endtime');
t1 = datetime(starttime,'InputFormat',"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
t2 = datetime(endtime,'InputFormat',"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
datetime_array = t1:seconds(delta):t2;
%% Plot waveforms
fig = figure('Renderer', 'painters', 'Position', [100 100 1000 400], 'color','w');
plot(t1:seconds(delta):t2, data_0, 'k-')
title([stats_0.('network'),'-', stats_0.('station'), '-', stats_0.('channel')])
axis tight;
print(fig,[fileloc0, '_ts', num2str(id),'.jpg'],'-djpeg')
data_double = double(data_0);
%% Using sym4
[XDEN,DENOISEDCFS] = wdenoise(data_double,9,'Wavelet','sym4','DenoisingMethod','BlockJS');
close;
fig2=figure('Renderer', 'painters', 'Position', [100 100 1000 400], 'color','w');
plot(data_double,'r')
hold on;
plot(XDEN, 'b')
legend('Original Signal','Denoised Signal')
axis tight;
hold off;
axis tight;
print(fig2,['denoise_signal_sym49','.jpg'],'-djpeg')
snrsym = -20*log10(norm(abs(data_double-XDEN))/norm(data_double))
%% Using db1
[XDEN_db1,DENOISEDCFS2] = wdenoise(data_double,9,'Wavelet','db1','DenoisingMethod','BlockJS');
close;
fig3=figure('Renderer', 'painters', 'Position', [100 100 1000 400], 'color','w');
plot(data_double,'r')
hold on;
plot(XDEN_db1, 'b')
legend('Original Signal','Denoised Signal')
axis tight;
hold off;
axis tight;
print(fig3,['denoise_signal_db1','.jpg'],'-djpeg')
snrdb1 = -20*log10(norm(abs(data_double-XDEN_db1))/norm(data_double))
end
end
含噪合成数据的小波去噪
这个例子是从 MATLAB 的例子中派生出来的。在上述情况下,对于相同的数据,我得到 sym4 和 db1 小波的 SNR 分别为 9.6994 和 9.4954。这也显示了 sym4 的显著差异。请注意,“sym4”在大多数情况下都能很好地工作,这可能是它被采用为缺省值的原因。
MATLAB 生成的合成数据小波去噪(图片由作者提供)
结论
我们已经了解了如何从 mseed 下载地震波形,将其转换为 mat 格式,然后使用小波分析进行去噪。我们首先对高频地震时间序列进行小波去噪,但重构后,视觉上差别并不明显。但是从信噪比上,我们可以看出区别。我们还绘制了不同尺度下的小波系数。此外,我在一个合成时间序列上展示了小波去噪的工作原理。
参考
1. Wu, W., & Cai, P. (n.d.). Simulation of Wavelet Denoising Based on MATLAB — 《Information and Electronic Engineering》2008 年 03 期. Retrieved May 18, 2021, from https://en.cnki.com.cn/Article_en/CJFDTotal-XXYD200803017.htm
2. MATLAB
原载于 2021 年 5 月 18 日 http://www.earthinversion.comhttps://www.earthinversion.com/techniques/how-effective-is-the-signal-denoising-using-the-matlab-based-wavelet-analysis/。
企业应用程序用户界面需要如何改变以适应机器学习的可能性
我的计划是让人工智能变得简单,而不是复杂,让数百万商业软件用户学会与会思考的机器和软件机器人共存。
自从我 21 年前开始从事技术工作以来,商业软件看起来几乎没有什么变化。字段一个挨着一个,一些表格里有所有的数据。和按钮来做一些事情。
不可否认,从基于客户端的应用到网络已经有了转变——但是对用户体验的真正影响仍然主要是表面的。只要看看下面,我相信你知道我在说什么。这些大家都看了一遍又一遍。
我自己公司的会计系统 Netvisor 的新发票视图的截图看起来像所有其他的企业应用程序。(作者截图。)
我们经历了比我职业生涯中经历过的更剧烈的变化。甚至比诺基亚的灭亡还要严重,这在我的祖国显然是一件大事。
迄今为止,一个商业应用中的一个字段几乎只有两种状态:填充的和空的。看看下面的例子,这个字段有值或者没有值。****
这是田地的样子。(作者插图)
没有介于两者之间的东西,也没有办法指出可能的东西,但不能 100%确定。不确定性。或者概率。你可能会问,为什么这很重要!
照片由 Hitesh Choudhary 在 Unsplash 上拍摄
进入机器学习。
这不是一篇关于人工智能给企业带来的机会的文章,因为你肯定已经阅读了关于这个主题的文章。我说的是所有商业应用的用户界面的根本变化,不管是什么用例。它可以是 SAP、Salesforce、QuickBooks 或 Basware。
企业越来越多地采用技术,如 RPA 或智能自动化,以利用人工智能的力量实现流程自动化。这些过程通常表现为上述业务软件中的一系列动作。例如,读取来自供应商的发票,根据主数据映射其数据,决定一些会计参数(如我在前面的示例字段中的 GL 代码),审查/批准内容,并将发票输入 ERP 系统。
我已经参与了多个这样的自动化项目,并且出现了一个共同的问题。当使用机器学习来预测过程中需要的一些值时,商业应用程序中没有“本机”方式来表明这些值带有不确定性。
自动化与人类用户一起工作,因为不可能有 100%的无接触自动化。关键概念是 信心和阈值:ML 对自己的结果有多确定,以及组织设定的“足够确定”的界限是什么。
例如,软件机器人可能使用机器学习来预测发票最可能的总账代码,结果可能是"该发票应计入总账代码 GL-4100100;置信度为 0.78。“在这种情况下,如果公司将自动化进程的阈值设置为 0.8,而无需人工审查,那么这种特殊情况最终会被应付账款部门的人员查看。
股票摄影师显然没有认真对待他们的应付账款工作。Mikhail Nilov 摄于 Pexels 。
现在,在大多数企业应用程序界面中,没有办法向用户传达预测值的置信度。次优的解决方案通常是 RPA 工程师最终将额外的机器学习输出数据写入一些注释或评论字段,用户需要在那里寻找它们。
如果我们真的构建用户界面来适应一些字段由用户填写,一些由 ML 填写的事实,并创建一种方法来表明字段中的置信度,会怎么样?
让我通过一些例子来阐述这一点。请记住,我不是一个用户界面设计师,所以下面的插图仅仅是概念。我希望它们能引发设计师的兴趣,让它们有一天成为现实!
人类填充值与 ML 预测
无论是软件机器人还是 API 在预测后操纵值,今天,结果看起来就像有血有肉的用户会输入它一样。就像你在上面的例子中看到的那样。
人类操作员将受益于字段中值的来源的即时视觉提示。在我下面的例子中,机器预测的字段显示为蓬松的灰色粗笔画,而人类输入的“事实”保留标准的实心黑色笔画。
机器 vs 人类填充的领域。(作者插图)
置信度和阈值的指示
在自动化工作流中,置信度阈值决定了哪些值是自动使用的,哪些值是由用户检查的。
我发现信心和门槛一般不太好理解。所以我们的工作就是让它们变得容易理解。
**问题来自于这样一个事实,即各个领域的正确阈值可能大相径庭。总帐代码与利润中心不同。因此,显示任意的置信度值,如 0.9221434 或 0.732123,对用户来说并没有太大的意义,但这是你在评论栏中最常看到的。
如果我们用简单的交通灯来表示自信会怎么样?
信心和门槛的红绿灯。(作者插图)
所提出的方法故意省略了实际值;它只显示颜色:绿色表示置信度大于所选阈值,黄色表示接近阈值,红色表示远低于阈值。
通过将阈值配置移动到由自动化专业人员控制的设置,他们能够调整过程值,而最终用户不会看到任何变化。
接受和拒绝预测值
让我们假设进行了上述 GL 代码预测,并且置信度低于阈值。所以我们的案子需要重审。在当前的模型中,机器和人输入的字段是相等的,没有直接和简单的指示已经做了什么。也许用户需要手动编写审计跟踪,这很容易扼杀自动化的整个想法!
查看接受/拒绝按钮。(作者插图)
我建议应该有一种简单的方法,只需点击一下鼠标就可以接受或拒绝该值,并将其更改为“已审核”状态。这种方法没什么用处。首先,现在可以安全地将低置信度值写入字段来帮助我们人类。辅助自动化带来了好处,因为通常即使是较低置信度的预测也可能是正确的。第二,评论“点击”可以作为新的训练数据点立即反馈给机器学习。
可解释的人工智能—已解释。
这一特定 GL 代码预测背后的因素是什么?为什么总是出错?下一个最佳选择是什么?有时候,比字段值更多的信息是有意义的。
对于那些时刻,我们需要一个工具提示(到现在为止,我已经用尽了我所有的设计技巧😬).
可解释性的工具提示。(作者插图)
像 Aito.ai 这样的机器学习平台为预测背后的主要因素提供了一个简单的视图——哪些特征具有积极的升力和消极的升力。
然而,我们不应该陷入这样一个陷阱,即认为应付账款部门的用户重视科学方法。我们需要一些可以理解的东西,如上图所示,加号和减号来表示预测的主要贡献者。
类似地,工具提示可以容纳下一个最佳预测,可以很容易地将该值转换到字段中。可能性是无限的!
我在上面提议的不仅仅是 UI 上的小改动。我认为可用性和可理解性是更广泛使用人工智能的基本因素。
作为这些系统的设计者和创造者,我们有责任确保我们不会增加更多的复杂性,而是利用这个机会来简化工作,让每天使用这些系统的数百万人更加愉快。
我希望在这一点上你和我是一致的!
自从 1999 年以来,我一直从事企业软件工作。目前,我是位于芬兰赫尔辛基的一家名为 Aito.ai 的智能自动化公司的执行董事长兼 CPO。
脸书、Airbnb 和优步如何从复杂的数据环境中做出数据驱动的决策
大型科技公司的数据发现方法
莉娜·席尔瓦诺娃在 Unsplash 上的照片
许多大型科技公司做出非常重要的决策,决定如何通过数据为客户提供最佳服务。随着这些公司规模的增长,其数据环境的复杂性也在增长,导致它们变得越来越难以驾驭。
数据发现是在这些环境中找到相关的高质量数据的过程。
在本文中,我们将了解脸书、Airbnb 和优步如何定义其业务环境中的数据发现问题,以及他们如何通过自己的内部平台独特地解决这些问题。
这些公司都在其平台上发表了一篇文章。如果您对某个特定的方法感兴趣,我建议您阅读整篇文章,因为它们有关于其实现和方法的更多细节,这超出了本文的范围。
脸书定义了数据发现
https://engineering.fb.com/2020/10/09/data-infrastructure/nemo/
脸书为数十亿依赖高质量服务的人提供服务。为了确保有意义的体验,团队需要高效地找到相关和准确的信息。发现问题由此产生:
- 相关的表可能有一个晦涩难懂或无法描述的名称
- 不同的团队有重叠的数据集
不同的团队知道他们想用数据展示什么,并且数据在某处是可用的。数据发现平台帮助这些团队尽快找到正确的数据。
脸书的解决方案:尼莫
为了以简单快捷的方式解决这些问题,脸书开发了一个名为 Nemo 的平台。
“每次我们需要做出决策时,都要通过数据专家来查找必要的数据,这是不可扩展的。所以我们建立了 Nemo,一个内部数据发现引擎。Nemo 允许工程师快速发现他们需要的信息,并对结果的准确性充满信心。”
凭借超过 12 种不同类型的数据工件,Nemo 极大地减轻了脸书数据工程师寻找高质量数据的痛苦,并将他们的数据搜索成功率提高了 50%以上。随着数据类型的多样性增加了近三倍,查询数量增加了一倍,该系统已经能够扩展。
新系统利用了脸书的系统 Unicorn 来有效搜索社交图,以帮助提高平台的可扩展性。Nemo 还允许通过过滤表的使用、隐私限制和数据的新近性来进行更精细的搜索。此外,引擎可以通过向工程师提供相关的数据表来解析和回答问题。最后,系统基于数据质量、新近性、使用和沿袭对表进行排名。
Airbnb 定义了数据发现
https://medium.com/airbnb-engineering/democratizing-data-at-airbnb-852d76c51770
与脸书类似,Airbnb 在过去几年中经历了数据量和数据格式多样性的巨大增长。
“我们已经看到了数据量和内部数据资源数量的爆炸式增长:数据表、仪表盘、报告、指标定义等。”
他们指出,虽然这是一个增长的信号,表明他们在基于数据的决策方面的大量投资,但这也带来了新的挑战。具体来说,数据源在质量、复杂性、相关性和可信度方面各不相同。很难找到优化所有这些参数的数据。
Airbnb 对导致其数据环境中的主要痛点的两个主题进行了分类:
- 数据环境太难驾驭,经常需要用户询问其他人在哪里可以找到合适的资源
- 由于缺乏上下文和元数据,很难相信数据。
这些问题导致用户避开资源并创建自己的额外资源,从而导致更加混乱的数据环境。
Airbnb 的另一个问题是数据被本地化到特定的团队。这使得团队对数据缺乏全局背景的短视观点。这导致了缺少上下文的更糟糕的下游可视化。许可规则阻碍了数据的共享和理解,使问题变得更加严重。
“对整个数据生态系统的理解,从事件日志的生成到其在可视化中的使用,比其各个部分的总和提供了更多的价值。”
Airbnb 的解决方案:Dataportal
“数据门户的首要目标是使数据民主化,并通过帮助数据探索、发现和信任,使 Airbnb 员工能够了解数据。”
Dataprotal 的目标是为所有员工提供一个框架,让他们能够轻松地找到数据,并确信这些数据是可信的,并且与他们的问题相关。
数据门户有 4 个组件:
- 搜索
- 上下文和元数据
- 以员工为中心的数据
- 团队为中心的数据
搜索功能允许员工搜索日志模式、数据表、图表、仪表板、员工和团队。该平台利用所有可用的元数据来建立上下文和信任。该平台还使用 PageRank 和数据生态系统的网络表示来提供高度相关的搜索结果。
正如问题公式中提到的,Airbnb 认为,对于交付高质量的数据发现平台来说,上下文极其重要。数据门户允许用户查看谁创建了资源,谁使用了资源,以及资源是何时创建和/或更新的。
该平台还包括所有员工的用户资料。任何员工都可以搜索由任何其他员工创建、使用或喜爱的表。
团队有自己的类似于员工的页面,显示他们正在交互和创建的数据。
这种方法很有趣,它将数据发现平台视为一个社交网络。这个平台对于 Airbnb 来说是必要的,因为他们扩大了规模,并大大减少了数据环境的混乱。
美国宇航局在 Unsplash 拍摄的照片
优步定义了数据发现
https://eng.uber.com/databook/
与 Airbnb 类似,优步高度重视数据的背景,以做出更好的数据驱动型决策。
“然而,大数据本身不足以利用洞察力;为了高效和有效地使用,优步规模的数据需要环境来做出业务决策和获得洞察力。”
随着优步每天的出行量增长到 1500 万次,全球每月有 7500 万活跃乘客和 18000 名员工,他们的数据也变得越来越复杂。优步在 2015 年开始建立一个数据发现平台,使用手动维护的静态 HTML 表格。这显然是不可扩展的。
“在这种规模和增长速度下,一个用于发现所有数据集及其相关元数据的强大系统不仅仅是一件好事:它对于让数据在优步变得有用是绝对不可或缺的。”
优步的解决方案:数据手册
Databook 自动生成关于表的元数据,以提供关于数据质量和数据含义的上下文。该平台强调四个组成部分:
- 可扩展性:易于向表中添加新的元数据、存储和实体
- 可访问性:所有元数据都可以通过编程方式访问
- 可伸缩性:支持大量并发读取请求
- 电源:支持跨多个数据中心的读写请求。
Databook 从接收多个来源作为输入开始(包括 Cassandra、Hive、Vertica 等。),存储元数据,并通过可通过 Databook UI 访问的 RESTful APIs 输出信息。
Databook 利用了用户不需要实时查看元数据变化的事实,并将元数据存储在 Databook 体系结构本身中。这为用户提供了更快的读取吞吐量(该平台的主要目标之一)。
他们还以模块化的方式设计了系统,将请求服务层和数据收集层分离开来,这样它们就可以单独计算。
有两种方法可以通过 Databook 访问元数据,RESTful API 和可视化界面。
优步决定使用 Elasticsearch 作为 Databook 的搜索功能。它们允许用户在许多不同的维度上进行搜索,如名称、所有者、列等。
托拜厄斯·菲舍尔在 Unsplash 上的照片
结论
随着许多顶级科技公司继续高度重视做出数据驱动的决策,并继续扩大规模,数据发现平台变得越来越必要。在这些公司的规模下是无法手工输入信息的。
虽然脸书、Airbnb 和优步对这个问题采取的方法略有不同,但它们都强调几个方面:
- 数据的上下文对于整个过程非常重要。
- 数据发现平台是大规模做出基于数据的决策所必需的。
- 数据的可信度、相关性和新近性都是在数据搜索排名中应该考虑的重要因素。
看到表现最佳的企业如何处理如此大规模的数据问题是非常有趣的。如果你觉得这些信息有趣或有用,还有大约 13 篇文章描述了大型科技公司如何处理数据发现问题这里(除了其他机器学习和数据科学主题)。
感谢您阅读这篇文章。
我们离开发真正的智能还有多远?
关于人工智能进展的发人深省的信息
人工智能的发明理念是机器将模仿人类大脑的认知功能,即大脑学习和解决问题的能力。图灵测试被用来确定计算机是否能像人类一样思考。经过几十年的人工智能发明(20 世纪 50 年代),我们已经做到了吗?人工智能的当前状态是什么?为了实现这个目标,我们还需要做什么?继续阅读,找到这些问题的答案。
人工智能进化
我们可以认为纽厄尔和西蒙在 1955 年开发的程序是第一个人工智能程序。第一个人工神经网络,称为感知器,是由心理学家弗兰克·罗森布拉特于 1958 年发明的。为什么这么多年来我们没有看到人工智能惊人的进步?这主要是因为缺乏人工智能程序所需的处理能力和内存。
当我们有足够的处理能力和内存时,我们看到了 IBM 的深蓝在 1977 年压倒国际象棋冠军的演变。这主要归功于记忆和计算能力,当然不是因为学习。此后,在 2011 年,我们看到 IBM Watson 战胜了人类世界冠军 Jeopardy。这也减少了对学习的依赖。2017 年,阿尔法戈人工智能赢得了一个三场比赛的系列赛,对手是世界上最好的围棋手。在 AlphaGo 中,创作者将深度学习的直觉力量与 GOFAI(传统人工智能)的逻辑力量结合在一起。)所以,你可能会说,有了深度学习,人工智能至少有了一些学习过程。
所以,现在让我们试着理解我们所说的学习是什么意思。
什么是学习?
你有没有想过一个孩子是如何学会接住抛向空中的球的?如果我要求你为这种活动开发一个人工智能模型,你的方法大多是数学方法,即计算抛射体的轨迹路径。你认为孩子的大脑会做所有这些数学运算吗?事实上,这个孩子从来没有学过抛射体方程。关于孩子如何学习的问题,我们有答案吗?
现在,让我们考虑一下人工智能模型,它们已经向我们展示了在现实世界中做一些好的预测的辉煌成功,并且理解它们的局限性。
https://medium.com/subscribe/@profsarang
少数人工智能成功案例
我们已经在经典的人工智能和人工神经网络/DNN 细分市场中看到了许多人工智能的成功案例。我现在将引用一些故事来衡量人工智能发展的当前水平。
估计房价
这是一个在机器学习教学中广泛使用的例子。我们将这个模型建立在回归的基础上——一个被充分研究过的统计问题。这个模型所做的推论并不比人类的能力更好,只是它做预测的速度比人类快得多。
计算机视觉
人工智能在计算机视觉中最公认的成功是对象检测,我们使用预先训练的 DNN 模型来检测各种对象。然而,这种模型可以检测的对象列表仍然非常有限。作为一个人,你注意到了电脑桌上的车钥匙和餐桌上的可乐罐。我们的物体探测人工智能模型不具备这些能力。他们不能探测到任何任意的物体,而人脑却能轻易做到。
考虑人脸检测。今天的人工智能模型可以将一个以前认识的人(该模型是为其训练的)识别到新的集体照片中。一个人每天看到很多人,还记得他们——“嘿,我以前见过你。”这些人工智能模型可以将一个只看过一次的人的图像与面前的人联系起来吗?
语音识别
这是我们看到人工智能技术取得巨大成功的另一个领域。我们在日常生活中使用 Alexa 和 Siri,在与外国人交谈时使用谷歌翻译应用程序。语音合成和文本到语音转换现在已经不是问题了。一个人在听了一次一个人的声音后,会把这个声音和这个人联系起来,即使他离得很远,过了很多很多天也是如此。我们的语音识别模型有这种能力吗?
因此,今天的人工智能模型还不够通用。因此,我们引入一般智能。
人工通用智能(AGI)
我们今天实践中的人工智能模型被训练来解决一个特殊的问题。打败 AlphaGo 棋手的模型不知道棋局是怎么下的。我们称这个 AI 弱 AI 或者狭义 AI 。弱人工智能是指任何只能解决一个问题的程序。这没有一般的认知能力,也不体验人类心灵的意识。现在,新名词来了——AGI。这个术语仍然是假设性的。这是创造一个智能代理的概念,它可以理解和学习任何人类可以执行的智力任务。我们也称 AGI 为强 AI 或者全 AI 。那么,我们离发展 AGI 还有多远?
人脑模拟器
蓝色大脑是 2005 年 5 月启动的一个项目,该项目使用基于 IBM 蓝色基因设计的超级计算机来理解对人类认知的见解,并根据神经元的突触连接来模拟神经元的行为。
到 2013 年,日本和德国的研究人员使用当时第四快的超级计算机模拟了 1%的人脑。该模拟模型包括由 10.4 个突触连接的 17.3 亿个神经细胞。该程序使用了 82,944 个处理器,花了 40 分钟在真实的生物时间内完成了 1 秒钟的神经活动模拟。
2013 年,欧盟资助了人类大脑项目(HBP),这是一项为期 10 年的研究计划,在欧洲各地雇用了 500 名科学家,从事神经信息学、大脑模拟、HPAC(高性能分析和计算)、医学信息学、神经形态(大脑启发)计算和神经机器人学方面的工作。
总结想法
考虑到以上所有事实,我们可以得出结论,我们离开发真正的智能还很远。问题是,我们是否完全理解了“智力”这个词的含义?根据 Gartner 2021 年对人工智能的炒作周期显示 AGI 处于创新触发水平。所以,AGI 仍然领先很多很多年。在开发出具有完全人类智能的机器人之前,我们只能拭目以待。因此,让我们不要害怕机器人接管人类,至少在不久的将来。
https://medium.com/@profsarang/membership
熊猫读拼花文件(带箭头)vs. CSV 多快?
理解大数据
重点研究使用 PyArrow 读取拼花文件与使用 Pandas 读取相同 CSV 文件的速度比较
图片来源: Pixabay
为什么用拼花地板代替 CSV?
因为你可能希望读取大数据文件的速度比熊猫的内置函数快 50 倍!
逗号分隔值(CSV)是一种广泛用于数据分析的平面文件格式。它操作简单,在中小型数据环境中运行良好。然而,当您处理较大文件的数据时(也许还要为基于云的存储付费),有一些很好的理由转向使用 列数据存储原则 的文件格式。
阿帕奇拼花地板是这些类型中最受欢迎的一种。下面的文章讨论了其中的一些优势(相对于使用传统的基于行的格式,例如平面 CSV 文件)。
https://blog.openbridge.com/how-to-be-a-hero-with-powerful-parquet-google-and-amazon-f2ae0f35ee04
简言之,
- 由于是面向列的,Parquet 将所有高效的存储特性(例如,块、行组、列块)都带到了表中
- Apache Parquet 是使用 Google 的分解和组装算法从头开始构建的
- Parquet 文件的设计考虑到了复杂的嵌套数据结构。
- Apache Parquet 支持非常高效的压缩和编码方案。可以使用各种巧妙的方法来压缩一个 parquet 文件,例如(a)字典编码,(b)位打包,©游程编码。
图片来源:作者出品(自有版权)
当您必须从磁盘或云存储中存储和读取大型数据文件时,Parquet 文件是一个很好的选择。对于用 Python 进行数据分析,我们都广泛使用熊猫。在本文中,我们将展示在读取大文件的内容时,与使用 CSV 文件和 Pandas 相比,使用 Parquet 文件和 Apache Arrow 会给您带来令人印象深刻的速度优势。特别是,我们将讨论,
- 文件大小
- 正在读取的列数
- 文件的稀疏性(缺少值)
阅读用箭头
PyArrow 是 Apache Arrow 框架的 Python 绑定(API)。根据他们的网站——Apache Arrow 是 内存分析 的开发平台。它包含一系列技术,使大数据系统能够快速处理和移动数据。它为平面和分层数据指定了一种标准化的 语言无关的列内存格式 ,为现代硬件上的高效分析操作进行了组织
这些特性使得 Apache arrow 成为增长最快的分布式内存数据分析框架之一。首先,它是一个理想的内存传输层,用于读取或写入 Parquet 文件中的数据。
对 Parquet 文件使用 PyArrow 可以在读取大型数据文件的速度方面带来令人印象深刻的速度优势,并且一旦读取,内存中的对象可以很容易地转换为常规的 Pandas 数据帧。
要了解更多关于 PyArrow 的完整特性,请参考 Apache 文档。
py arrow/拼花组合有多快?
这篇文章的代码是 在我的 Github repo 这里。
各种尺寸的 CSV 和拼花文件
首先,我们创建各种填充了随机生成的浮点数的 CSV 文件。我们还将它们转换成压缩的拼花文件。所有文件都有 100 列,但行数不同,因此文件大小也不同。
完成此过程后,目录可能看起来像这样。
在大型数据文件的读取速度方面,对 Parquet 文件使用 PyArrow 可以带来令人印象深刻的速度优势
熊猫 CSV vs. Arrow 拼花阅读速度
现在,我们可以编写两小段代码来使用 Pandas read_csv
和 PyArrow 的read_table
函数读取这些文件。我们还监控读取文件所需的时间,并以比率的形式对它们进行比较。结果如下所示,
尽管趋势有所起伏,但很明显,PyArrow/Parquet 组合在较大的文件中表现出色,即随着文件大小的增长,以 Parquet 格式存储数据并使用 PyArrow 读取会更有利/更快。
对于一个 100 MB 的文件,该比率增长到大于 10,即读取速度比快 10 倍!对于 GB 大小的文件,优势可能更大。
使用 Arrow 读取少量列要快得多
接下来,我们展示更酷的东西。通常,我们可能不需要从列存储文件中读取所有的列。例如,我们可以对数据应用一些过滤器,并只选择选定的数据进行实际的内存处理。
现在,对于 CSV 文件或常规 SQL 数据库,这意味着我们从所有数据中选择特定的行。然而,对于列数据库,这实际上意味着选择特定的列。
让我们看看,当我们只从 Parquet 文件中读取一小部分列时,我们是否在读取速度方面增加了优势。这是我们分析的结果,
当我们读取很小一部分列时,比如说< 10 out of 100, the reading speed ratio becomes as large as > 50,即**,与常规的 Pandas CSV 文件读取**相比,我们获得了 50 倍的加速。对于大部分列,加速逐渐减弱,并稳定在一个稳定的值。
当我们只从 Parquet 文件中读取一小部分列时,我们在读取速度方面增加了优势
PyArrow(拼花)读取速度随文件的稀疏性而变化
接下来,我们看看稀疏性对 Parquet 文件读取速度的影响。在许多情况下,数据可能非常稀疏,即没有记录任何值。这在传感器驱动的数据分析中很常见,例如,各种传感器以不同的频率和间隔记录数据,并且数据矩阵的大部分被 NaN 值填充。
在我们的分析中,我们人为地将 Numpy NaN 值注入到一个固定大小的文件中,以 Parquet 格式保存它们,并使用 PyArrow 读取它们。结果如下所示。显然,稀疏文件被 PyArrow 读取的速度要比密集数据文件快得多。根据我们可能遇到的数据类型,这种行为可以为我们所用。
摘要
在本文中,我们重点分析了 Pandas/CSV 和 Apache Arrow/Parquet 组合的阅读速度。
我们展示了 Apache Arrow 如何在读取速度上比 Pandas CSV 有显著优势,以及这如何随着数据集的大小而变化。
我们还展示了对于这种类型的面向列的文件格式,读取一小部分列本来就更快。
最后,我们还通过 Apache 箭头展示了稀疏性对读取速度的影响。越稀疏的文件读取速度越快。
喜欢这篇文章吗?成为 中等会员 继续 无限制学习 。如果你使用下面的链接, ,我会收到你的一部分会员费,而不会对你产生额外的费用 。
https://medium.com/@tirthajyoti/membership
特征选择如何提升高维数据的性能
选择最佳性能特征的降维基本指南
特征选择是端到端数据科学模型开发管道的重要组成部分。数据科学家需要特别关注用于训练健壮的数据科学模型的功能集。数据越多,模型越健壮,但这适用于实例的数量,而不适用于特征的数量。
原始数据集包含许多需要从训练数据集中排除的冗余要素。对文本特征进行矢量化后,模型的维数增加了很多。处理高维数据集会导致维数灾难的问题。有多种技术可以降低数据集的维度,或者只选择对给定问题陈述表现最佳的最佳特征集。
在我之前的一篇文章中,我讨论了 7 种选择最佳性能特性的技巧。
在本文中,我们将讨论如何在一行 Python 代码中使用统计技术来选择性能最佳的特性。
想法:
Scikit-learn 带有一个**feature_selection**
模块,提供各种功能来执行特性选择。一些特征选择功能是:
- 【SelectFromModel】:基于权重重要性选择特征的元变换器。
- Select kbest:根据评分函数的 k 个最高分选择特征。
- Select percentile:根据得分函数中最高分的百分位数选择特征。
还有很多。
**SelectKBest**
和**SelectPercentile**
选择重要特征的原理是一样的,但是**SelectKBest**
取输入参数,如顶部特征的数量来选择,而**SelectPercentile**
取特征的百分位数来保留。
用法:
**SelectKBest**
和**SelectPercentile**
根据要保留的特征的数量或百分比选择性能最佳的特征。使用诸如卡方或任何其他统计测试的评分函数来计算表现最佳的特征。
卡方函数是一种统计技术,用于计算具有非负特征值的独立要素与目标类之间的卡方得分。现在可以使用**SelectKBest**
和**SelectPercentile**
功能使用卡方得分来选择顶级特征。
我将使用一个带有二进制目标类的样本文本数据集。使用 Tf-Idf 矢量器将文本特征矢量化成具有 21,156 个特征的稀疏矩阵。
我们可以使用**SelectKBest**
和**SelectPercentile**
函数降低稀疏矩阵的维数,使用**chi2**
作为评分函数。
(作者代码)
使用百分位参数为 10 的**SelectPercentile**
函数拟合具有 21,156 个特征的 Tf-Idf 矢量化数据后,特征的数量减少到 2,115 个特征。
现在的问题是,如果我们使用上面讨论的技术降低数据的维度,我们是否必须对模型的性能做出妥协。我们来比较一下同一个机器学习模型在不同百分位值(特征选择后的特征数)下的性能。
(图片由作者提供),在具有不同数量的特征的特征选择管道之后,数据集的模型性能图。
从上面的图中,我们可以观察到,对于 7,500 个特征之后的数量,我们得到了几乎相似的性能指标(AUC-ROC 得分、精确度和召回率)。对于近 5 到 10 个减少的特征,我们获得了高精度和 AUC-ROC 分数(在图中的黑框中突出显示)。
使用管道自动选择特征:
人们可以在端到端的模型开发管道中实现特征选择组件,以自动化特征选择工作流。
(作者代码)
结论:
特性选择是 scikit-learn 包中的一个方便的函数,它可以在一行 Python 代码中执行特性选择。也可以改变评分函数(chi2 测试)作为**SelectKBest**
和**SelectPercentile**
函数的参数。
可以对 scikit-learn 管道实现特性选择功能,以自动化特性选择工作流程。
参考资料:
1 Scikit-learn 文档:https://sci kit-learn . org/stable/modules/feature _ selection . html
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一小部分会员费,不需要你额外付费。
https://satyam-kumar.medium.com/membership
感谢您的阅读
傅立叶变换如何加速 CNN 的训练
深度学习实践者如何受益于 200 年前的一项发现
介绍
如果你学过泰勒级数,你就会明白用一个有限的简单项级数来逼近一个复杂函数是多么有用。傅立叶级数是将一般函数分解为正弦波叠加(振幅/时间→安培/频率)的另一个例子,这使其特别适合物理时间序列、信号处理和其他波形数据。
尽管图像看起来不完全像“波形”,但傅立叶变换仍然在深度学习最有价值的创造之一——卷积神经网络中找到了重要的应用。
定义
考虑一个复杂的 2π周期函数 f(x ),其中 f(x+2π)=f(x ),我们的目标是将其分解为周期正弦曲线的总和,同时保持 f 的周期性,这是信号数据的一个关键特征。我们知道 cos x 的周期为 2π,但类似于所有功率的单项式如何以不同的位移和幅度组合在一起,我们可以对不同周期和幅度的正弦项进行同样的处理。具体来说,我们将对以下形式进行加权求和
其中每个正弦波的周期为 2π/n,失调为δn,傅里叶分析的目标是发现这些系数。要深入探究为什么它会收敛,请点击这里查看我的完整报告(https://michaelsuntech.files.wordpress.com/2020/11/wim.pdf)。
探测
给定一个在有限区间[t1,T2]上的复杂周期函数 g,它可以表示一个(周期)噪声信号,傅立叶级数理论允许我们把它分解成有限 N 项的和,其形式为
然而,每个“纯”信号都有固定的幅度、偏移和频率,分别由 a_n、δ_n 和 n 得出,n 越高,频率越高。
g 在[-π,π]上的傅里叶变换,定义为
其中 f 代表频率,在分解产生高振幅的频率处产生强有力的尖峰。使我们能够将其应用于现实生活问题的结果是 g 和 hat(g)之间的双射,这使我们能够对 hat(g)进行手术,并仍然恢复原始 g,这在上下文中可能是从歌曲中编辑出单个频道。这个的时间复杂度是多少?
实际上,g 将以固定的采样率产生,并产生一个矢量
离散傅立叶变换是
这可以通过矩阵乘法 hat(g)(x)=Wx 来简洁地概括,使得
在实践中,执行矩阵乘法具有复杂性 O(N ) ,这是一个昂贵的过程,但它可以通过快速傅立叶变换极大地简化为 O(N log N) (传说它首先由高斯发现用于心算,但直到一百年后才发表)。我来演示一下!设 N = 2N’。假设我们想计算
观察
我们分开的地方
事实上,在所有 k 上的这个操作可以以矩阵块的形式计算,
在哪里
因此
让上面写为
我们确实可以证明,WLOG 0≤ i ≤N’-1
回想一下对角矩阵——向量乘法只取 O(N),所以将 T(N)表示为计算 W_N g(x)所需的计算量,我们可以建立递归关系 T(N)= O(N)+2T(N’)+O(N)= O(N)+2T(N’),通过主定理,这足以得出 T(N)=O(N log N) 。FFT 运算的一个惊人特征是它的几乎同义的逆运算,
我们可以展示
凭借事实 w^{n}=1,因此
w^{l-k}=1 当且仅当 l=k,所有其他 l 的和为 0,这是傅立叶级数中的一个常见技巧。表示这种相反
作为“傅立叶算子”,我们有
这里还有一些我们可以用傅立叶算子做的技巧。
等同于
其中(Rx)k=x{N-k}。现在,我们将看到 FFT 在机器学习中的应用。如果我们让∙,*表示卷积
当表示 a=F_N(x),b=F_N(y)时,我们有
这个操作,看起来只是一个噱头,显示了 x 和 y 在傅立叶域内的点积是 x 和 y 的傅立叶域的卷积。毫不奇怪,当 x,y∈ℝ^{N× N}表示样本图像和滤波器以执行卷积步骤 x*y 时,这一属性在 2D 中也成立,这是训练 CNN 的重要计算步骤,CNN 是深度学习最新进展背后的模型架构。
图 1:花费 O(N K),一个昂贵的操作(来源)
在 2D,傅立叶运算的开销为 O(N log N )=O(N log N)。通常,滤波器 w∈ℝ^K× K 是图像上的一个滑动窗口,总共 N (K,k)个卷积,花费 O(N K)。然而,通过将 w 填充为大小 N× N 并计算
图 2:前后(编辑自来源
其中∙的成本为 O(N),整个操作现在只需要 O(N log N)!
结论
得益于此,机器学习研究人员报告了训练时间的显著减少( 55s→ 0.4s???)具有改进的 O(N K )→ O(N log N)卷积步骤,我们要感谢大约 200 年前的傅立叶发现。
流行的疯狂动物城迷因
参考
https://michaelsuntech.files.wordpress.com/2020/11/wim.pdf
【https://sites.math.washington.edu/~morrow/464_12/fft.pdf
https://arxiv.org/pdf/2003.12621.pdf
https://predictive programmer . com/namespace-convolatile-neural-network-architectures-1/(图 1)
https://docs.gimp.org/2.8/en/plug-in-convmatrix.html(图二)
甘如何学习:一个简单的介绍
深度学习基础
生成对抗网络的学习、理论和应用
作者图片
简介
在我以前的文章中,我谈到了一般的生成方法,以及是什么让生成器网络如此强大。在这篇文章中,我想更深入地研究生成性对抗网络(GANs)的内部运作。为了确保您完全理解它们,我将浏览 GANs 论文的原始伪代码并解释 GANs 的损失函数,然后我将向您展示我自己实现的结果。最后,我将解释如何通过 DCGANs 论文的建议来改进 GANs,这是该研究领域的一篇关键论文。
甘斯人如何学习
生成方法是一个非常强大的工具,可以用来解决许多问题。他们的目标是生成可能属于训练数据集的新数据样本。生成方法可以通过两种方式做到这一点,通过学习数据空间的近似分布,然后从中采样,或者通过学习生成可能属于该数据空间的样本(避免近似数据分布的步骤)。
作者图片
上面你可以看到 GANs 的架构图。GANs 由两个网络(生成器和鉴别器)组成,这两个网络本质上是相互竞争的;这两个网络有对立的目标。
生成器试图最大化欺骗鉴别器的概率,使其认为生成的图像是真实的。鉴别器的目标是正确地将真实数据分类为真实的,将生成的数据分类为假的。这些目标用网络的损失函数来表示,这些损失函数将在训练期间被优化。
在 GANs 中,发电机的损失函数最小化,而鉴别器的损失函数最大化。生成器试图最大化鉴别器的误报样本数,鉴别器试图最大化其分类精度。
伪代码由伊恩·j·古德菲勒等人编写, 生成对抗网络【1】
在上面的伪代码中,对于每个时期,对于每个批次,计算鉴别器和发生器的梯度。鉴别器的损失由真实数据集的正确分类样本数的对数和虚假数据集的正确分类样本数组成。我们希望最大化这一点。生成器的损失函数由鉴别器正确分类假图像的次数组成,我们希望最小化这一点。
目标自然是相反的,因此用于训练网络的梯度也是如此。这可能会成为一个问题,我将在后面讨论这个问题。
一旦训练结束,发电机就是我们唯一关心的了。生成器能够接收随机噪声向量,然后它将输出最可能属于训练数据空间的图像。请记住,即使这有效地学习了随机变量(z)和图像数据空间之间的映射,也不能保证两个空间之间的映射是平滑的。gan 不学习数据的分布,他们学习如何生成类似于属于训练数据的样本。
应用
让我们来看一个简单 GAN 的应用。训练数据由来自 MNIST 数据集的手写数字组成。假设我需要更多的手写数字来训练其他机器学习/统计模型,那么可以使用 GANs 来尝试生成更多的数据。
作者图片
看看这个训练数据。正如你所看到的,有些数字对人类来说甚至很难读懂。机器真的很难处理非结构化数据(典型的例子:图像和文本)。计算机只看到像素值,很难教会它一个手写数字是什么排列顺序组成的。
生成随机样本
作者图片
如您所见,生成的数据看起来像手写的数字。该模型已经学习了手写数字图像中的一些模式,并由此能够生成新的数据。
我们可以在模型学习时查看生成的样本的 GIF(GIF 可能不会在 medium 应用程序上显示,所以我建议使用浏览器来查看)。
作者 GIF
生成器模型从随机权重开始,生成的图像看起来像随机噪声。随着损失函数的优化,生成器在欺骗鉴别器方面变得越来越好,最终产生的图像看起来更像手写数字,而不是随机噪声。
图像间采样
可以做的一件有趣的事情是拍摄两张生成的图像,并对它们之间的空间进行采样。这两个生成的图像具有两个相应的随机向量,这两个随机向量已经被馈送到生成器。我可以将这两个向量之间的空间离散化,本质上通过这两个向量之间的分布画一条线。然后我可以对这条线进行采样,并将这些点输入到我的生成器中。
作者图片
在这里,我看到了一个生成的“4”和一个生成的“8”之间的空间。开始的数字是左上角的“4 ”,这个数字实质上会转化为右下角的“8”。
尽管生成器不能保证在输入空间和数据空间之间产生平滑的映射(我们生成的样本不逼近密度函数),但您可以看到两幅图像之间的过渡仍然非常平滑。有趣的是,在“4”变成“8”之前,它首先转变为“9”,这意味着在数据空间中,数字“9”位于“4”和“8”之间。
作者图片
这是另一个例子,这次数字“6”变成了“3”。您可以简单地看到生成的样本看起来像一个“5”。
甘斯的弊端
作者图片
GANs 的一个主要缺点是,如前所述,鉴别器和发生器具有相反的目标,因此具有相反的符号梯度。可以看出,当优化 GAN 时,将不会达到最小值。相反,优化算法将在鞍点结束。
GANs 的另一个常见问题是,在训练这些模型时,鉴别器很容易压倒生成器。鉴别器只是变得太好太快,生成器无法学习如何生成欺骗鉴别器的图像。直觉上这是有意义的,分类任务总是比生成器学习如何生成新样本的任务更容易。
DCGANs 和消失渐变
深度卷积 gan 是解决这一问题的一种方法。第一个主要建议是使用 LeakyReLU 作为鉴别器的激活函数。这有助于解决渐变消失的问题。当训练任何种类的神经网络时,都会出现消失梯度问题,如果梯度太小,它们可能会“陷入”这种消失状态,并且由于它们接近于零,因此很难在训练中使用它们。LeakyReLU 通过始终更新模型的权重来减少这种情况的发生,即使激活很小。
作者图片
DCGANs 论文中的其他技巧已经成为训练神经网络时的常见做法,例如在卷积层之后使用批量归一化层,以及避免使用过多的密集层,而使用卷积层。
结论
在这篇文章中,我介绍了 GANs 如何工作以及他们如何学习的理论。然后,我展示了用 python 实现 GANs 的简单结果。最后,我强调了 GANs 的一些缺点,以及如何解决这些缺点。
支持我
希望这对你有所帮助,如果你喜欢它,你可以跟随我!
您也可以成为 中级会员 使用我的推荐链接,访问我的所有文章以及更多:https://diegounzuetaruedas.medium.com/membership
你可能喜欢的其他文章
参考
1 Goodfellow,I .、Pouget-Abadie,j .、Mirza,m .、Xu,b .、Warde-Farley,d .、Ozair,s .、a .和 Bengio,y .,2014 年。生成性对抗网络。康乃尔大学https://arxiv.org/abs/1406.2661 T2。
你的宏基因组宁滨结果有多好?
实践教程
评估宏基因组宁滨结果的策略和工具
自然环境,如湖水、土壤和人体的生态位(肠道、皮肤等)。)是数万亿微生物的家园。这些微观社区是复杂多样的,我们可以通过研究它们的组成和相互作用来了解它们的影响。如果你看过我的关于软件工具用于宏基因组的无参考宁滨的文章,你可能知道在过去的几十年中有不同的方法被开发来执行宏基因组宁滨,其中你将序列放入对应于不同分类组(种、属等)的箱中。).
我们如何评价宏基因组宁滨工具产生的结果?
在这篇文章中,我将介绍一些工具和技术来评估从无参考宁滨工具获得的宁滨结果。这些工具很受欢迎,因为它们提供了识别尚未在可用参考数据库中发表的新物种的优势。
聚类分析
宏基因组宁滨工具使用不同的聚类方法,您可以使用以下流行的评估指标来评估最终的宁滨结果。
- 精确
- 回忆
- f1-分数
- 调整后的兰德指数
你可以从我的评估聚类结果中阅读更多关于如何计算这些标准的细节。
与其自己想出评估脚本,还不如用已经发布的流行软件工具和软件包来评估宏基因组宁滨的结果。让我们浏览其中的几个,并详细了解如何安装和运行它们。
琥珀
宏基因组分箱评估(AMBER)【1】是一个用来评估和比较从宏基因组基准数据集重建的基因组的软件包。AMBER 要求用户提供与宁滨结果一起入库的序列的基本事实注释。AMBER 可以接收来自不同工具的多个宁滨结果,并提供各种评估指标的可视化,包括完整性、纯度、F1 值、ARI、污染(可视为与纯度相反)、准确度和分级分数。
琥珀怎么安装?
琥珀可以在 https://github.com/CAMI-challenge/AMBER 的GitHub 上免费获得。您可以使用以下命令下载代码。
git clone [https://github.com/CAMI-challenge/AMBER.git](https://github.com/CAMI-challenge/AMBER.git)
你也可以按照https://github.com/CAMI-challenge/AMBER#steps提供的步骤安装 AMBER。
如何经营琥珀?
在运行 amber 之前,你必须根据 CAMI 宁滨生物箱格式格式化地面实况注释和宁滨结果。你可以按照https://github.com/CAMI-challenge/AMBER#input的指示格式化你的结果。
例如,如果您在 FASTA 文件中有每个箱的宁滨结果,那么您可以运行以下命令来根据 CAMI 宁滨生物箱格式进行格式化。
AMBER/src/utils/convert_fasta_bins_to_biobox_format.py *.fa -o my_bins.tsv
准备好文件后,您可以运行 AMBER。
amber.py -g amber_ground_truth_1000_bins.tsv maxbin2_bins.tsv metawatt_bins.tsv concoct_bins.tsv solidbin_bins.tsv busybee_bins.tsv -l "MaxBin2, MetaWatt, CONCOCT, SolidBin, BusyBee Web" -o AMBER_Result
注意:您可以在普通的台式机上运行 AMBER,内存为 8–16 GB,没有任何问题。
琥珀色输出
在您的输出文件夹AMBER_Result
中,您可以找到评估结果的最终报告(index.html
),如图 1 所示,对应于我们之前使用的示例命令。
图 1:琥珀色结果示例(作者截图)
如果你点击Plots
标签,你可以看到不同的图,如图 2 所示。
图 axample 琥珀色结果的不同图(作者截图)
CheckM
CheckM [ 2 ]是一种用于评估从宏基因组学分析中回收的基因组质量的工具。与 AMBER 不同,CheckM 不需要任何基础事实注释作为输入,因此可以用于分析真实世界的宏基因组数据,其中实际的分类组成未知。CheckM 使用单拷贝标记基因来评估宁滨结果的完整性、污染性和异质性。
如何安装 CheckM?
您可以遵循 CheckM wiki(https://github.com/Ecogenomics/CheckM/wiki)上为安装提供的步骤。
你还必须从 https://data.ace.uq.edu.au/public/CheckM_databases/下载 CheckM 数据库。
成功安装 CheckM 后,您可以在宁滨结果中提供 bin 的 FASTA 文件,并按如下方式运行 CheckM。
checkm lineage_wf -t 56 -x fasta path/to/bins path/to/outputcheckm analyze -t 56 -x fasta checkm_data_2015_01_16/hmms/phylo.hmm path/to/bins path/to/outputcheckm qa -t 56 --out_format 1 -f path/to/output/result.txt checkm_data_2015_01_16/hmms/phylo.hmm path/to/output
CheckM 输出
在您的输出文件夹中,可以在文件result.txt
中找到 CheckM 输出。这个文件将如图 3 所示。
图 3:示例 CheckM 输出(作者截图)
注意:根据我在大型宏基因组数据集上运行 CheckM 的经验,我发现在一台 16 GB 内存的普通桌面计算机上运行 CheckM 是一个挑战。所以我建议把它安装在至少有 64 GB 内存的机器上。
GTDB-Tk
基因组分类数据库工具包(GTDB-Tk) [ 3 ]允许用户获得细菌和古细菌基因组的分类任务。GTDB-Tk 可用于获得基于每个箱中最丰富的分类组(达到物种水平)的宁滨结果的分类注释。与 CheckM 类似,您只需要向 GTDB-Tk 提供 bin。
如何安装 GTDB-Tk?
https://github.com/Ecogenomics/GTDBTk的 GitHub 上免费提供 GTDB-Tk。你可以遵循https://ecogenomics.github.io/GTDBTk/的维基中提供的安装步骤。
如何经营 GTDB-Tk?
我将使用classify_wf
命令将每个 bin 分类到一个分类组。您可以从https://eco genomics . github . io/GTDBTk/commands/classify _ wf . html中了解有关该命令的更多信息。
gtdbtk classify_wf --genome_dir path/to/bins --extension fasta --cpus 56 --out_dir path/to/output
注意:安装和构建 GTDB 数据库需要大量内存。根据我安装 GTDB-Tk 并在大型宏基因组数据集上运行它的经验,我建议将其安装在至少有 256 GB 内存的服务器上。
GTDB-传统知识产出
成功运行classify_wf
命令后,您将获得一个.tsv
文件,其中包含每个 bin 的分类注释。
最后的想法
AMBER、CheckM 和 GTDB-Tk 是宏基因组学分析中用来评估宁滨结果有多好的一些流行工具。AMBER 需要基础事实注释来进行评估,而 CheckM 和 GTDB-Tk 不需要这样的基础事实注释。琥珀更适合模拟或模仿数据集,其中地面真相是可用的。然而,CheckM 和 GTDB-Tk 可以用来评估模拟和真实数据集。
希望这篇文章对你有用,尤其是对那些刚接触宏基因组学的生物信息学领域的人。您可以试用这些工具并观察它们的输出。
感谢您的阅读!
干杯!
参考
1迈耶等人。铝,琥珀:评估宏基因组 BinnERs(https://doi.org/10.1093/gigascience/giy069)
[2]帕克斯等人阿尔·切克姆:评估从分离物、单细胞和宏基因组中回收的微生物基因组的质量(【https://doi.org/10.1101/gr.186072.114】T2
[3]肖梅尔等人。阿尔,GTDB-Tk:用基因组分类数据库对基因组进行分类的工具包(【https://doi.org/10.1093/bioinformatics/btz848】T4)
你可能也会发现这些文章很有趣。
https://medium.com/computational-biology/software-tools-for-reference-free-binning-of-metagenomes-f2d26b27eef2 https://medium.com/computational-biology/metagenomics-who-is-there-and-what-are-they-doing-9ea71f03eeee https://medium.com/computational-biology/marker-genes-and-gene-prediction-of-bacteria-5fa4cb7802f3
你的 NLP 模型到底有多好?
如何评价亚马逊 SageMaker 为拥抱脸的变形金刚模型处理工作的 NLP 模型
安托万·道特里在 Unsplash 上拍摄的照片
这是怎么回事?
NLP 项目(或任何 ML 项目,就此而言)的管道由几个步骤组成,包括数据处理、模型训练和部署。在模型培训和部署之间应该涉及的另一个步骤是模型评估。只有在评估了新训练的模型之后,我们才应该考虑下一步,这可能涉及注册和/或部署模型,或者,如果模型性能很差,则使用不同的/更多的数据对其进行重新训练:
NLP 项目管道(图片由作者提供)
亚马逊 SageMaker 最近推出了拥抱脸处理作业,这是专门为拥抱脸的变形金刚模型设计和优化的。加工作业可用于各种任务:数据预处理或后处理、特征工程、数据验证和模型评估。
在这篇博文中,我们将深入探讨列表中的最后一项任务——模型评估。我们将了解模型评估的挑战,以及我们如何利用 SageMaker 处理作业来克服这些挑战。
为什么这很重要?
NLP 模型评估可能是资源密集型的,尤其是对于从 GPU 加速中受益匪浅的 Transformer 模型。因此,如果我们在没有 GPU 的机器上运行,评估可能需要几个小时,尤其是在测试数据集很大的情况下。事实上,我们将确切地看到在我的笔记本电脑(没有 GPU)上进行模型评估需要多长时间。相比之下,我们将看到,我们可以加快这一进程高达 267(!)次通过使用 SageMaker 的拥抱脸处理作业。
这些处理作业不仅通过使用按需计算资源实现了更快的模型评估,而且 SageMaker 生态系统中的紧密集成也允许将这一步骤无缝集成到端到端的 NLP 管道中。
先决条件
本教程的 Github repo 可以在这里找到。它包含一个用于与 SageMaker 处理作业交互的笔记本,以及两个评估脚本—一个用于评估本地机器(如个人笔记本电脑)上的模型,另一个用于 SageMaker 处理作业。
我们还需要一个经过训练的 Transformer 模型和一个相应的测试数据集。理想情况下,您可以使用自己的模型和测试数据,但是如果您没有现成的模型和测试数据,您也可以在 Github repo 中找到模型和测试数据。
(回购中的模型是一个基于 DistilBERT 的二元分类模型,已经过微调,可以检测电影评论中的正面和负面情绪。数据集格式为 HuggingFace 的数据集 。)
如何使用培训师 API 评估变压器模型
拥抱脸的教练 API 通常用于训练模型,但它也使评估一个已经训练好的模型变得非常简单和直接。我们只需要用我们想要评估的模型调用训练器 API,指定测试数据,以及我们想要计算的度量的定义来评估模型:
局部评估模型
通过使用 Github repo 中的脚本evaluate-local-HF . py,我们现在可以在任何我们想要的地方评估模型。事实上,我在我的笔记本电脑(没有 GPU)上运行了这个脚本,看看需要多长时间。但是:测试数据由大约 15K 条记录组成,在 NLP 项目中的记录数量很容易达到数百万条的今天,这实际上并不算多。然而,它仍然足以让我的笔记本电脑忙碌几个小时。因此,我没有使用整个测试数据集,而是将其精简到只有 100 条记录:
100 条记录的运行时间(图片由作者提供)
结果表明,处理 100 条记录大约需要 68 秒,每批 8 条记录大约需要 5.3 秒(或每条记录 0.66 秒)。将此推断到 15K 记录的整个数据集意味着模型评估将在我的笔记本电脑上花费大约 3 小时。
Sagemaker 为拥抱脸处理作业
SageMaker 处理允许我们按需配置 GPU 机器,并且只在评估模型所需的时间内配置。为此,我们使用稍微修改的评估脚本,它可以与处理作业交互。这一次,我们将对整个测试数据集进行评估,即大约 15K 条记录。
为了设置模型评估,我们使用 SageMaker Python SDK 来设置处理作业:
我们还需要告诉处理器在哪里可以找到模型和测试数据:
然后我们可以开始模型评估:
一旦运行完成,我们可以在 S3 的指定输出文件夹中的 JSON 文件中找到评估结果(在我们的例子中,该文件将被称为 evaluation.json ):
对 S3 的评价结果(图片由作者提供)
打开这个文件为我们提供了我们在 compute_metrics() 方法中指定的评估指标,以及来自处理作业的一些其他指标:
评估指标(图片由作者提供)
事实上,评估结果告诉我们,处理作业每秒运行 177 个样本。如果您还记得,我的笔记本电脑每秒运行 0.66 个样本,这意味着处理工作比我的笔记本电脑快 267 倍!我们还可以通过查看处理作业的日志来确认这一点:
SageMaker 上的运行时间(图片由作者提供)
正如我们所看到的,在一个大约有 15K 记录的数据集上评估该模型只需要 85 秒的处理工作。
结论
在这篇博文中,我们学习了如何使用 Amazon SageMaker 处理作业来评估基于 Hugging Face 的 Transformer 模型的 NLP 模型。我们看到,在 SageMaker 上按需使用 GPU 计算基础设施非常简单,并且显著加快了模型评估的速度。
下一步可能是捕获整个 NLP 项目生命周期,包括端到端管道中的模型评估,并将其自动化,从而为 NLP 任务构建可扩展的 CI/CD 管道。
格陵兰有多绿?
我花了一天时间学习使用 Python 进行卫星图像分析的基础知识
我想在一天内完成的事情:
1.了解如何从免费资源下载数据
2.哪些 python 库可用于卫星影像分析
3.熟悉词汇
4.对下载的数据运行真实场景。在这种情况下,我们将使用 NDVI 检查格陵兰岛的绿色植被。
我一直在与一个潜在的油气能源客户互动,我为他开发了一个关于在石油钻井现场使用声音数据的概念验证。下周我还有一次会议,会上将讨论卫星图像数据的使用案例。因此,我决定今天花点时间快速学习 GIS 数据分析的基础知识,这样我就不会在下周的会议中触及皮毛。
当我想到卫星图像分析时,一系列复杂的预建软件浮现在我的脑海中,需要一些培训研讨会才能掌握,但我只想投资一天,不想花任何不必要的钱。于是,我调用了我的两个朋友——鸭鸭 Go + Python。
下载数据
有许多免费资源,人们可以很容易地从那里下载数据。我试过 https://scihub.copernicus.eu/dhus/的和 https://earthexplorer.usgs.gov/的。
在这两个网站中创建您的帐户,并准备好下载数据。这两种工具的基本原理是相同的:
- 在您想要分析的地理区域上创建您选择的多边形。
- 选择需要感测数据的日期间隔。
- 根据云量进一步过滤(低于 10%是理想的)
- 选择卫星——我用的是 Sentinel2
与其让我喋喋不休地谈论如何下载数据,不如看看这个 YouTube 视频,她在引导你开始方面做得很好。
作者提供的图片(哥白尼中心,我只选择了 Sentinel 2 作为数据并过滤了日期)
在我看来,Copernicus Open Access Hub 在下载数据方面要快得多,因为地球探测器即使下载一个 1GB 的小文件也要花很长时间(肯定与他们的 FTP 设置有关)。
一旦你下载了数据并解压后,你会看到。蒂芙还是。JP2 的文件在你的文件夹里。这些是您将使用的主要文件。
作者图片
上面是下载数据的文件夹树,R10m、R20m、R60m 是文件夹,其中. jp2 和。tif/。tiff 文件将被定位。(请注意,我已经在这里将文件夹重命名为 Nuuk,将被下载的文件夹将有一些长的字母数字名称,指示卫星、观看周期等)
稍微讲一下哨兵-2
Sentinel 2 由欧洲航天局于 2015 年发射,主要关注植被、土地覆盖和环境监测。
Sentinel-2 的数据是多光谱的,有可见光、近红外(NIR)和短波红外光谱(SWIR)的 13 个波段。Sentinel-2 数据是免费的,刷新频率很高,每 5 天刷新一次,这使它成为环境相关学术工作的理想和最新资源。
- 10 米处的 4 个波段:蓝、绿、红和近红外。
- 20 米处的 6 个波段:4 个窄带用于植被表征(705 纳米、740 纳米、783 纳米和 865 纳米),2 个较大的 SWIR 波段(1,610 纳米和 2,190 纳米)用于雪/冰/云检测或植被水分胁迫评估等应用。
- 60 米处的 3 个波段:主要用于云筛选和大气校正(443 纳米用于气溶胶,945 纳米用于水蒸气,1375 纳米用于卷云探测)。
来源-美国地质勘探局(https://custom-scripts . sentinel-hub . com/custom-scripts/sentinel-2/bands/)
问题陈述
丹麦的自治领土格陵兰岛大部分时间都被冰覆盖着;大多数人口居住在首都努克附近。在夏季,一些植物以绿色覆盖物的形式出现。在这项工作中, 我们将选取整个努克地区,分析夏季的绿色植被。
写入
一旦我们有了数据,我们需要一些可以帮助我们阅读它们的库。Python 提供了一些不错的库来帮助完成这项工作: Earthpy、Rasterio、ArcGIS、Satpy、Fiona、GDAL 等等
在本案例研究中,我们将使用 rasterio 和 earthpy。
#Importsimport rasterio
from rasterio import plot
%matplotlib inline
import matplotlib.pyplot as plt
from glob import glob
import numpy as np
import earthpy.plot as ep
import earthpy.spatial as es
给出 IMG 数据/R60m 文件夹的路径,并使用 glob 读取文件。
path = "Nuuk/Granule/Nuuk/IMG_DATA/R60m/"
bands = glob(path+"/*B?*.jp2")
bands.sort()
bands
len(bands) # This will yeild 11 in this case.
按作者分类的图片(Sentinel 数据中所有 jp2 文件的列表)
Earthpy 提供了一些快速技巧,可以帮助我们可视化数据中的所有波段。
array_stack, meta_data = es.stack(bands, nodata=-9999)titles = ['Aerosol', 'Blue', 'Green', 'Red', 'Vegetation Red Edge_0.70', 'Vegetation Red Edge_0.74','Vegetation Red Edge_0.78', 'Water Vapour', 'SWIR_1.6', 'SWIR_2.1', 'NIR']
上面的“标题”列表与波段在我们的波段对象中出现的顺序一致。
让我们画出所有的哨兵波段
ep.plot_bands(array_stack, cmap = "terrain", title = titles)
按作者分类的图像(数据中出现的所有 11 个波段)
这里不同的图像肯定是有区别的,有几个比较亮,有几个比较暗。
条带包含红色、蓝色、绿色数据;我们可以创建一个 RGB 图像来看看它是什么样子的。
ep.plot_rgb(array_stack, rgb=(3, 2, 1), stretch=True, str_clip=0.2, figsize=(10, 16))
Nuuk 的 RGB(图片由作者提供)
band2, band3, band4 = array_stack[1:4]def plot_mult_axis():
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(12, 4))
plot.show(band2, ax=ax1, cmap='Blues')
plot.show(band3, ax=ax2, cmap='Greens')
plot.show(band4, ax=ax3, cmap='Reds')
fig.tight_layout()plot_mult_axis()
b、G 和 R 绘制在单个轴上。(R 看起来像橙色)图片作者
NDVI ( 归一化差异植被指数)
NDVI 是一种基于植物如何反射不同光波的植物健康指标。这是通过测量植物强烈反射的近红外线和吸收的红光之间的差异来实现的。NDVI 的范围总是从-1 到+1。
由于植物的表面反射特性,NDVI 度量可以用于识别地形中的绿色斑块。
NDVI 接近 1 可能意味着密集的植被,而-1 可能意味着水,冰或一些噪音。
我们数据中的波段 4 对应于红色,波段 8 对应于 NIR。
band4 = rasterio.open(path+"T22WDS_20200831T150809_B04_60m.jp2")
band8 = rasterio.open(path+"T22WDS_20200831T150809_B8A_60m.jp2")red = band4.read(1).astype('float64')
nir = band8.read(1).astype('float64')
ndvi=np.where(
(nir+red)==0.,
0,
(nir-red)/(nir+red))
让我们创建一个空的 tiff 图像,并将 NDVI 数据保存在其中。
ndviImage = rasterio.open('ndvi.tiff','w',driver='Gtiff',
width=band4.width,
height = band4.height,
count=1, crs=band4.crs,
transform=band4.transform,
dtype='float64')
ndviImage.write(ndvi,1)
ndviImage.close()
是时候分析 NDVI 的形象了
ndvi = rasterio.open('ndvi.tiff')
fig = plt.figure(figsize=(15,10))
plot.show(ndvi, cmap="RdYlGn")
作者图片(NDVI 为格陵兰首都努克创作)
这看起来不错。这些照片是在 7 月拍摄的,当时努克周围的冰正在融化,黄色的是海洋,红色的是内海或残留的冰——这是正确的描述。
同样,我们可以查看修正的归一化差异水指数。
MNDWI = (SWIR - GREEN)/(SWIR + GREEN)
它可以像 NDVI 一样容易地计算出来。
band3 = rasterio.open(path+"T22WDS_20200831T150809_B03_60m.jp2")
band11 = rasterio.open(path+"T22WDS_20200831T150809_B11_60m.jp2")green = band3.read(1).astype('float64')
swir = band11.read(1).astype('float64')
mndwi=np.where(
(green+swir)==0.,
0,
(swir-green)/(swir+green))#Create an empty TFF file and write the data of mndwi object to itmndwi_Image = rasterio.open('mndwi.tiff','w',driver='Gtiff',
width=band3.width,
height = band3.height,
count=1, crs=band3.crs,
transform=band3.transform,
dtype='float64')
mndwi_Image.write(mndwi,1)
mndwi_Image.close()# Open the filemndwi = rasterio.open('mndwi.tiff')
fig = plt.figure(figsize=(15,10))
plot.show(mndwi)
MNDWI for Nuuk(图片由作者提供)
图片左边的海水是绿色的,内陆的水颜色较深,用紫色表示。
许多其他指数可以计算,如粘土指数,亚铁指数,水分指数等;我没有计算它们,因为它们不会给这个博客增加任何价值。
这项工作的数据和代码可以在我的 Github 这里获得。
格陵兰看起来很绿
我开始分析的所有问题都已经得到了回答。
1。了解如何从免费资源下载数据
有很多方法可以下载卫星图像数据,如哥白尼中心,地球探索,谷歌地球引擎等。
2。卫星影像分析有哪些 python 库可用?
如果您想使用 python,有许多独立维护的库可以帮助您入门卫星影像分析领域。我会推荐使用 Rasterio,Earthpy,GDAL 作为开始。
3。熟悉词汇
每个领域都有一个学习曲线,这个领域也是如此,还有一个密集的领域,但没有一个领域像火箭科学双关语:D一样
4。对下载的数据运行真实场景。在这种情况下,我们将使用 NDVI 检查格陵兰岛的绿色植被。
在尝试了几个小时后,我找不到任何可以覆盖整个格陵兰岛的多边形,这是有意义的,因为格陵兰岛不是一个可以在一张照片中捕捉到的小岛。我发现一个多边形覆盖了整个努克和一些周边地区。这足以让我对数据分析有所了解。
我们能够进行端到端的分析,包括下载数据、读取数据、处理数据、使用数据生成我们想要的功能。
我认为上述工作的一个直接应用是测量几年来 NDVI 季节的差异,并了解冰川和冰的融化是如何为植被提供新的牧场的。在这一点上,我们已经意识到了气候变化和相关的问题,但是如果有人是一个不相信的人,并且想要自己检查一下,那么上面描述的道路将是一条合适的道路。
请让我知道任何意见和反馈。
参考资料:
https://earthobservatory.nasa.gov/features/MeasuringVegetation
Python Pandas 与 R 数据表的分组方式
举例说明
美国不同城市的平均房价是多少?一家店不同产品组的总销售额是多少?不同公司的平均工资是多少?
只要我们有适当的数据,所有这些问题都可以通过分组操作来回答。大多数数据分析库和框架都实现了一个函数来执行这样的操作。
在本文中,我们将比较两个最流行的数据分析库在涉及分组的任务方面的差异。第一个是 Python 熊猫,第二个是 R 数据表。
我们将使用 Kaggle 上提供的墨尔本房屋数据集作为示例。我们首先导入库并读取数据集。
# pandas
import pandas as pd
melb = pd.read_csv("/content/melb_data.csv")# data.table
library(data.table)
melb <- fread("datasets/melb_data.csv")
前 5 行数据(图片由作者提供)
让我们从找到每种房屋类型的平均房间数开始。Pandas 提供了groupby
函数,用于对观察值(即行)进行分组。
# pandas
melb[["Type","Rooms"]].groupby("Type").mean() Rooms
Type
h 3.405189
t 2.944260
u 2.061948
我们选择“类型”和“房间”列,并根据“类型”列对房屋(即行)进行分组。因为在 type 列中有 3 个不同的值,所以我们最终有 3 个组。最后,我们对每组应用均值函数,得到房间的平均数。
如果我们不选择列并直接应用groupby
函数,Pandas 会计算所有数字列的平均值。有一个更实际的方法来解决这个问题,我们将在下面的例子中讨论。
下面是我们如何对数据表进行同样的操作:
# data.table
melb[, .(mean(Rooms)), by=Type] Type V1
1: h 3.405189
2: t 2.944260
3: u 2.061948
直觉是一样的,但语法是不同的。by
参数用于选择用于分组的列。数据表可以用逗号分隔不同类型的操作。例如,如果我们需要传递一个条件来过滤行,我们把它放在方括号内的第一个逗号之前。
对于第二个示例,我们计算每个地区的平均房价,并为聚合列指定一个名称。
# pandas
melb.groupby("Regionname", as_index=False).agg(
avg_house_price = ("Price", "mean")
)
(图片由作者提供)
这次我们使用了命名聚合,因此我们不必选择任何列。聚合的类型和要聚合的列在agg
函数中指定。我们还可以为聚合列指定一个定制的名称。
as_index
参数用于为组创建一个列。否则,它们将被表示为数据帧的索引。
下面是数据表版本:
# data.table
melb[, .(avg_house_price = mean(Price, na.rm = TRUE)), by=Regionname]
(图片由作者提供)
数据表语法变化不大。我们刚刚添加了na.rm
参数,因为 price 列中缺少值。我们需要在计算平均值之前去掉它们。否则,所有聚合值都变成 NA。
这两个库都允许嵌套分组,因此我们可以基于多个列对观察结果进行分组。让我们找出每个地区每种类型的平均房价。
# pandas
melb.groupby(["Regionname", "Type"], as_index=False).agg(
avg_house_price = ("Price", "mean")
)[:5]
(图片由作者提供)
我们使用一个列表将多个列传递给groupby
函数。代码末尾的 5 限制了要显示的行数。
# data.table
melb[, .(avg_house_price = mean(Price, na.rm = T)), .(Regionname, Type)][1:5]
(图片由作者提供)
您可能已经注意到,我们不一定要使用by
关键字。数据表的标准结构语法允许它知道哪些列用于分组。
就像我们可以按多个列分组一样,我们可以为每个组计算多个聚合。此外,它们不必是相同类型的聚合。
例如,我们可以计算每种房屋类型的平均房间数量,并计算每组中的房屋数量。
# pandas
melb.groupby("Type", as_index=False).agg(
avg_number_of_rooms = ("Rooms", "mean"),
number_of_houses = ("Rooms", "count")
)
(图片由作者提供)
# data.table
melb[,
.(avg_number_of_rooms = mean(Rooms), number_of_houses = .N)
, Type]
(图片由作者提供)
让我们以一个稍微复杂一点的例子来结束。我们首先根据条件过滤观察值(即行),然后应用分组操作。最后,我们基于聚合列对结果进行排序。
# pandas
melb[melb.Price > 1000000].groupby("Type").agg(
avg_distance = ("Distance", "mean"),
number_of_houses = ("Distance", "count")
).sort_values(by="avg_distance")
(图片由作者提供)
# data.table
melb[Price > 1000000,
.(avg_distance = mean(Distance),
number_of_houses = .N)
, Type][order(avg_distance)]
(图片由作者提供)
过滤是预期的第一个操作。sort_values
和order
函数分别对熊猫和数据表进行排序。默认情况下,它们都按升序排序。为了按降序排序,我们可以将熊猫的参数ascending
设置为 false。如果我们在列名前添加一个减号,数据表将按降序排序。
结论
根据列中不同的值或类别对观察值进行分组,然后应用一些聚合,这对探索性数据分析至关重要。
因此,数据分析和操作库提供了灵活的功能来处理这些操作。我们已经做了几个例子来演示如何用 pandas 和数据表库进行分组。
感谢您的阅读。如果您有任何反馈,请告诉我。