我是如何学习数据科学的线性代数、概率和统计的
我是如何没能学好数据科学的数学,以及我是如何理解线性代数、概率、贝叶斯定理、概率密度函数和基本统计的
蒙帕纳斯火车站事故,来源:维基媒体
背景
这正是一年后我的数据科学之旅的样子。
是的,新年快乐:-)
说到为数据科学学习数学,一切都以失败开始和结束。我相信我并不孤单,许多从数据科学起步的人都有同样的经历。如果要用一个词来形容我为数据科学学习数学的努力,那就是:
作者图片
没有学到你需要的东西,尤其是当没有明确的数据科学道路时,会导致挫败感。至少我明确了我的目标:
- 学习我需要的数学知识,仅此而已
- 我的背景是什么,我有什么经验,或者缺乏什么,都无关紧要。如果我只是渴望学习数据科学的数学,那么我应该能够做到
- 更多地关注行为特征,特别是态度和坚持,而不是掌握某个特定的数学题目。
数学是一门可怕的学科。我们人类有情感和欲望,而数学是基于逻辑和方法的。有了人工智能,也许有可能给机器注入一些情感,但数学没有它们的位置。我们的头,我们的感情在学习数学的时候受伤了。至少这是我对数学的一贯看法。一件古老而可怕的事情。
当我们不懂数学,没有天才般的智商时,我们该怎么办呢?我们做这些事情:
- 买一本书
- 开始 MOOC
- 努力工作
- 如果你失败了,你会更加努力
- 如果你再次失败,你会更加努力
- 你一次又一次地失败。你越来越努力地工作,耗尽了你的意志力,有一天你开始相信自己不是“数学型”的人
我做到了。
更加努力的工作导致了更多的失望,更多的挫折,最终导致愤怒****自卑。当谈到数据科学的数学时,我为我需要学习的每个主题重复了这个故事,线性代数,统计,概率,线性回归和梯度下降。这就是“我学习数学的故事”。直到现在。
对于一个完全的初学者来说
如果你是一个完全的初学者,那么根据我的经验,我建议你按以下顺序进行:
- 学习 Python 编程
- 学习惯用的 pythonic 方法(例如,列表理解、生成器等。)
- 学习熊猫
- 使用熊猫清理和争论一些数据集
- 学习 Matplotlib
- 绘制一些数据集
- 结合你对熊猫和 Matplotlib 的了解。争论数据集并绘制它们
- 对于机器学习,做 2-3 个小项目,如 Iris flower、Boston housing、wine classification 和 Titanic dataset 等。
你看,开始学习数据科学不需要数学。
这将花费你 3-4 个月的时间(有些人可以在一个月内完成,但我和树懒是朋友)
一只树懒(Bicho-pre guia 3)由丹妮拉·马拉希洛拍摄,来源:维基媒体
数据科学不需要很多数学知识
我猜一个人的经历应该不足以让你相信我们不需要太多数据科学的数学。
因此,我找到了一篇由夏普视觉实验室的乔希·埃布纳撰写的不错的博文。他解释了初级和高级数据科学家之间的区别,数据科学基础技能所需的数学知识,数据科学理论和实践之间的区别,等等。你应该读一下:
https://www.sharpsightlabs.com/blog/math-for-data-science/
蒂姆·霍普的一点建议怎么样?在成为数据科学家之前,他是一名数学专业的学生,也是一名数学博士。他当然知道数据科学需要多少数学知识。简答:不多,不到 10%:
https://tdhopper.com/blog/how-i-became-a-data-scientist/
这是他在 YouTube 上的演讲。
不,你不需要太多的数学,你需要一些,只是某些特定的主题。你可以每周在这里做一个要点:
- 学习基础代数(仅特定主题)
- 学习概率(仅限特定主题)
- 学习统计学(仅限特定主题)
- 学习线性代数(仅限某些专题)
- 学习线性回归
Rebecca Vickery 列出了数据科学领域需要学习的数学主题:
这就是这篇文章的什么。接下来,我们将谈论为什么和如何。
线性代数
我学会了如何用熊猫清理数据集。我学会了如何使用 matplotlib 创建可视化。然后我做了 Iris 和波士顿住房项目,然后我没有选择机器学习,而是直接开始了面向程序员的实用深度学习,这是一本非常棒的书。我决定一遍又一遍地阅读这本书,并将永远追随。我喜欢实用的学习方法,不浪费时间,也不指望你能记住研究生院的教学大纲。杰瑞米·霍华德以这种实用的方式授课。在成功 10 天后,我带着这本书建立了熊探测模型,并将其部署在 binder 上,当我遇到这个问题时,我遇到了一个障碍:
(train _ x[0]*权重。t)。sum() +偏差
那是什么**。T** ?
这是我的第一反应。我在 Fast AI 论坛上发布了同样的内容,并得到了一个很好的回复。向量是垂直堆叠的,但它需要处于水平位置。这应该解决了我的问题,但是当我搜索向量的时候,事情变得更复杂了。通常,当我们需要一个矢量时,我们只需这样做:
将 numpy 作为 np 导入
np.array([1,2,3])
我得到了一个矢量,很简单。对吗?
没有。
我查了一个向量在数学中是怎么呈现的,很奇怪。那天,我几乎所有关于“数学中的向量”的搜索都显示了一个向量,看起来像这样:
来自维基百科的矩阵
你可以在这里亲眼看到。现在,这击中了我的头。我想,如果这是向量在数学中默认的样子,那么我们为什么不在计算机科学中默认地做同样的事情。为了获得数学的默认外观,我为什么要这样做:
np.array([1,2,3])。整形(3,1)
下一个问题:为什么这个创建一个矢量,那个创建 ***。**t长得一样?*究竟什么是转置?为什么大多数向量在 math 中是垂直堆叠的,而在编程库中却不是?
我也不知道如何做矩阵乘法。因此,我决定先学习什么是转置、矩阵乘法等,然后再继续学习,而不是在接下来的章节中费力地阅读这本书。数据科学所需的所有线性代数都可以从这些好地方学到:
- 线性代数从瑞奇伽
- 线性代数从潜入深度学习
- 来自帕布鲁·卡塞雷斯的线性代数。(最全。我做了 70%,因为我想学习某些主题。它有很多理论,我认为它包含了你需要知道的足够多的东西,即使是深度学习)
- 来自深度学习书籍的线性代数
第四个是我卡住的地方。对我来说太高级了。所以,我留着以后用。
机器学习失败
数据科学作为一个领域还不成熟,因此还没有直接通向数据科学的道路。这与计算机编程、软件工程和 web 开发等领域形成了对比。这三个领域都相当成熟,如果你在任何一个领域需要帮助来建立自己的事业,那么这里有足够的帮助。你需要做的就是去寻找它。数据科学还没有那么发达。一个人必须通过阅读文章、博客和观看视频来不断更新自己。我也一样。也正因为如此,我才知道,在你理解机器学习之前就做深度学习,可能会导致一场“等待发生的灾难”。你需要理解 b/w 线性回归和逻辑回归的区别,以及为什么对于一个特定的问题你会选择其中的一个。如果你不知道,就不要去构建深度学习模型。对我来说很有意义。
于是,我开始了机器学习。
来源:维基媒体
我开始学习线性回归,然后被统计数据重创。我无法把题目的不同部分联系起来。就像 SQL 一样,我已经学习了五遍什么是“模式”和什么是 A/B 测试,然后又忘记了同样的五遍。我参加了宾夕法尼亚州立大学在线的统计,当我试图从其他地方学习更多的统计数据时,我又被一个叫做…
我对概率的感觉
概率是现实生活中用得非常多的东西(就像统计学一样)。而概率思维是不容易得来的。2020 年,我三次尝试学习贝叶斯定理,但三次都放弃了。我花了日日夜夜和周末试图理解贝叶斯定理,但它就像一个我永远无法解开的谜。这一次我更饿了,因为一切都取决于它:
- 我从程序员实用深度学习开始,在卡住了。T
- 学习线性代数
- 开始机器学习,陷入线性回归
- 统计学是答案,这让我陷入了概率
- 概率令人沮丧(想想贝叶斯定理)
- 回到我开始的地方。看不懂数学。冰冻的
5 名建筑工人在 10 天内建造了一堵 10×10 英尺的墙。假设 3 名工人花了 7 天时间把它漆成黄色,那么柏林的西红柿价格与斯德哥尔摩的价格完全相同的概率是多少?
是的,每当我失败时,我就是这样看待贝叶斯定理的。当挫折没有被赋予一个授权的意义时,它会让你变得愚蠢。哈里森·简斯马的博客文章拯救了我。我强烈推荐你阅读他的博客文章。他准确地描绘了一个智力一般的人试图自学数据科学的心理状态:
新方法
所以你看,我背着所有的包袱。我需要更多的渴望和动力来打破所有这些“学不会数学”和“我总是陷入贝叶斯定理”等等的枷锁。我看到的唯一方法就是挑战我的能力极限。在人工智能时代,个人生活和职业生活之间的界限已经模糊。无论我们在其中一个做什么,都会对另一个产生你无法想象的影响。我需要新的思维,新的学习方法。我需要给学习赋予新的意义。**我希望数据科学学习的每一个方面都是一次愉快的经历,一次我可以在未来珍藏为美好回忆的经历。**我问自己:
在我的个人生活中,最后几个月我是如何自娱自乐的?我在哪里找到了快乐?
我喜欢看《纸牌屋》、《套装》、《龟壳里的幽灵》、《亿万富翁》、《星球大战》。我疯狂地看了许多季/卷。我决定用整整一周的时间,从周一到周日,疯狂地看,疯狂地读,疯狂地练习概率。但在此之前,我想看看能不能同时一起学统计和概率。这就是我如何得到…
Udacity 体验
我开始了 Udacity 的《统计学导论》免费 MOOC 课程,因为它拥有人们需要的所有统计学和概率。它看起来短小精悍,符合数据科学家的数学方法。这很好,但在第 16 章(33%)之后,我放弃了。问题是,尽管这种 MOOC 切中要害,但它假定了一种自然的数学直觉。尽管 Udacity 说这是一个初级 MOOC,但我发现一个人需要非常聪明,并且有非常好的数学直觉才能通过它。就像我一开始说的,我不是天才,我只是你在街上找到的另一个人。因此,对于 MOOC 的每个部分,我都不得不花两倍或四倍的时间从 MOOC 之外的多种资源中搜索和学习。这是促使我产生“狂看”想法的经历之一。无论如何,你可以试试 MOOC,它的理论更少,而且在每个视频的结尾都有一些很好的问题需要解决。如果可以的话,我强烈建议你去做
适应我的新方法
我想到了一个新计划:
我不会看数学课本。我也不会做任何 MOOC】。原因是:这两者都来自于为研究生学习(3+年)设计的学术标准。学术界的人已经是他们学科的专家了,他们已经教授这些学科很多年了,因此关于这些学科的 MOOCs 书籍至少需要一两个学期。如果一个人对这些科目一无所知,也没有一两个学期来学习,那该怎么办?
在第四次工业革命中,我们所有人都试图进入数据科学领域。我们时间紧迫,我们没有 3 年时间。我们需要尽快起床开始生产东西(我上一份工作已经过去一年了)。这就是为什么我们必须想出新的学习方法来满足 21 世纪的商业需求。卡梅隆·沃伦在他的博客文章《不要做数据科学》中对此做了更好的解释:
老实说,我非常尊重学术界。一些最伟大的发现来自学术机构。事实上,我仍然渴望成为学术界的一名研究人员,主要是因为它不是由商业利益操纵的。我想读硕士,然后读机器学习的博士(甚至可能是两个博士)。我认为人类的发展依赖于学术界,正如它依赖于企业带来技术来解决问题一样。也就是说,每件事都有时间和地点,现在我需要的是快速但基本的学习。
不要追随你的激情
我不追随我的激情。我花了很多年试图找到我的激情。经历了一次又一次的失败后,我明白了一个人不能纯粹基于自己的激情来选择职业。这是一个艰难而痛苦的教训,它与通常的激励帖子和常识背道而驰。那你接下来要做的。阅读卡梅隆·沃伦所说的:
https://medium.com/@camwarrenm/how-to-figure-out-what-your-passionate-about-a23d59c0163d
我是如何学习的
- 如果我对一个地方的东西不了解,我就辞职去第二个地方。我不会花几个小时在同一篇文章、博客或视频上努力工作,而是专注于手头的主题,这让我变得灵活。我使用一个又一个资源,直到我有了概念/想法。
- 我练题。我们不能通过阅读和理解来学习数学。我们需要把它应用到问题上。mathisfun.com 的有一个问题列表和答案。这是我用来练习贝叶斯定理的
我想我找到了我的 42 。这个方法对我很有效。它可能对你有效,也可能对你无效,但除非你尝试一周,否则你不会知道。我读过数百篇关于如何学习数据科学的数学的博客文章,其中许多不起作用,但也有一些起作用。最终,我找到了自己的路。我没有通过思考找到我的学习之路。我尝试了很多次,失败了很多次。所以,你必须不断尝试,直到你成功。给一个新方法几天或更长的时间,而不是几周或几个月。一周没问题。
可能性
我从贝叶斯定理开始,但最终我沉迷于观看、阅读和实践许多统计学和概率的概念。以下是我用来学习条件概率和贝叶斯定理的资源:
- 艾迪·吴的离散随机变量。总共 3 个视频(这包括预期值)
- 来自艾迪·吴的排列组合
- 来自马里奥数学辅导的排列组合
- 来自数学的贝叶斯定理很有趣
- 条件概率、贝叶斯定理和其他来自 Investopedia
- 来自 zedstatistics 的概率分布(用梯度来解释)
- 来自的概率密度函数(PDF)由 Michael 解释(用代数和图形解释)
- 迈克尔解释的中的累积分布函数(CDF)
- 来自杰森·吉普森的mathtutordvd.com的离散概率分布(关于什么是离散概率分布的最佳视频)
- 一篇关于 PDF vs PMF 的出色的 StackExchange 帖子
- Math insight 链接关于 PDF 的想法来自我上面提到的 StackExchange 帖子
- 麻省理工开放式课程PDF 讲座(在 StackExchange 帖子中提到)
现在我可以用费曼技术解释所有关于 PDF 的内容了:-)。
我不是唯一一个理解这个学习原则的人。肯·吉在他的 YouTube 视频中提出了一个类似的计划:
YouTube 上的肯·吉
如果您正在开始您的数据科学之旅,这是一个非常好的视频。可能会让你少受几个月的折磨。继续,看它,然后回到这里
统计和线性回归
最后,当我在圣诞节假期写这篇博客的时候,我也疯狂地看了 StatQuest 的的统计基础的文章。
他的线性回归和线性模型播放列表就是我现在正在看的。这个家伙很擅长解释东西,他不浪费任何时间,他让事情切中要害,并确保在前进之前进行审查,所有这些几乎没有任何代码。他力求清晰和基本,这是学习任何东西的全部意义。到目前为止,Josh 对对数和线性回归的介绍是我见过的最好的。你会喜欢他的鼓、小鼓和三鼓:-)
提醒你一下,统计学习介绍提到线性回归是前提条件。所以我想在我拿起这本书之前读完它是个好主意。那本书几乎被称为机器学习算法的圣经。
战胜对数学的恐惧
这是一件大事。有很多学习者害怕数学。即使我们不需要知道很多数学知识,但是对数学的恐惧仍然不让我们理解和掌握我们需要学习的任何主题。他们认为自己没有数学头脑。成为像乔治·康托(Georg Cantor)这样的天才和创建数学实体以及能够理解并使用数学作为解决问题的工具/模型是两件非常不同的事情,前者是来自宇宙(或上帝)的礼物,而后者是一套技能。我明白我们都不是天才,也不是优秀的哈佛或牛津毕业生。这个限制我们也无能为力。毫无疑问,我们可以在“态度”和“能力”方面做些什么,以获得数学技能。我们可以反复灌输数学思维作为我们性格的一部分。看看这些视频,改变你对数学以及你能学什么或不能学什么的看法:
列表 A:
数学魔法师的任意 10 个你喜欢的视频(我看过 30+)。从这些开始:
- 自学数学的三个技巧
- 6 个鲜为人知的理由为什么自学是数学成功的关键
- 为什么有些人学数学这么快
- 如何克服数学失败
列表 B:
- 学数学需要什么?去生活吗?米洛斯拉夫·洛夫里奇
- 一旦掌握了最好的学习技巧,任何人都可以成为数学人
- 你如何擅长数学,以及其他关于学习的令人惊讶的事实
- 我们教育系统的有趣故事
只有当你有兴趣了解印度的教育系统是如何运作的时候,才看最后一个。这就是我所研究的,所以我有一点偏见把它包括在这里。顺便说一下,这是一个有趣的视频。
列表 C:
拿起一个你一直想学的数学题目,去数学很有趣阅读它,完成所有的练习。相信我,通过这样做,你会立刻消除一半的恐惧。这些解释如此简单、容易和基本,以至于不管你的年龄或背景如何,你都能看穿数学。
如何不忘记你所学的东西
当你通过阅读、观察和解决问题来学习上述所有内容时。在一周左右的时间里,你会很快忘记其中的 80-90%。使学习永久化的唯一方法是:
- 每天在工作中使用它
- 按照固定的时间表复习
而#1 可能不太可能,因为您正忙于构建数据科学项目。我可以对第二点说同样的话。是的,你可以像我在学生时代制定的固定时间表一样复习:
- 在周末之前复习本周所学的内容
- 每周修改+前几周
- 在月底复习你学过的东西
- 每月修订+前几个月
这在学校行得通,但现在在专业工作环境中却行不通。现在唯一对我有效的方法是方法 1。自学成为数据科学家的魔咒是,学的东西都用不上。于是我只好想出方法三利用 的费曼手法 。
- 一旦你学会了一个话题。接下来使用费曼技巧
- 将主题的标题放在列表中
- 在周末,检查你的清单,用费曼技巧解释清单上的所有话题
我认为你不需要每月修改。
这种方法的好处
这种狂欢-* +费曼技巧的方法有几个好处:
- 你不需要等很久。你节省了很多时间,因为你不需要阅读整本数学书或进行 MOOC,这两者都需要几个月的时间。
- 你只学习你需要的东西。数据科学不是数学。不要忘记行业、商业价值、投资组合准备、GitHub 存在、商业利益相关者以及使用数据讲故事。你不能用“全面学习数学”来代替那些。
- 你的重点仍然是真正的工作
- 你学会了如何解释。这是一项非常有用的技能,可以让你在工作场所表达自己的观点,同时尊重你周围的每个人。这在面试中也是有益的。
- 既然你已经掌握了某些数学主题背后的基本概念,你就可以在空闲时间探索和学习细节,如果你没有时间紧迫的话。就业后,如果微积分激发了你的好奇心,或者你的领域需要这方面的专业知识,你甚至可以制定一个 3 年或 5 年的计划来掌握微积分。
这些好处看起来微不足道,但却是决定你是否会成功的主要因素。
收场白
祝你学习顺利,希望你继续坚持。数据科学很难,但肯定是你力所能及的。这可能需要时间,但所有有价值的职业都需要时间。
2020 年将作为疫情年、封锁和面具年、动摇全球各国基石的一年载入史册。它没有放过任何人,无论是雇员还是雇主,无论是政府还是公众,无论是黑人还是白人,无论是热爱上帝的人还是无神论者。这是我有生以来第一次在国际层面上看到如此的恐惧和浩劫。这让我想起了一句中国古话“天下一家”。我们突然被抛进了一个的黑暗时代。就好像一些反乌托邦的科幻小说正在变成现实。
虽然这是一幅暗淡的画面,但历史上第一次,这样一个黑暗的事件将全世界的科学家团结在一个统一战线之下:将人类从这一危险中拯救出来。全球无数科学家孜孜不倦地研发疫苗。最后,已经生产了不止一种而是两种疫苗,2021 年还会有更多。如果我们有能力承受并走出这个疫情,那么对数学的恐惧只是人类大脑能力所能处理的一件小事。让我们带着*“我将打破学习数据科学的任何障碍”*的信念迈进 2021 年。你需要拥有这个。这个世界上没有什么事情是不可能的,学习数据科学的数学,磨练你的软技能,以及制作一个令人印象深刻的数据科学投资组合都不在其中。 愿原力与你同在
我如何创建我的第一个 R 函数
以及如何也能做到:一个真实世界的例子。
学习 R 是一件非常痛苦的事情——学习曲线很陡,可能会让人不知所措。让我回到这个令人谦卑的旅程的是这样一种能力:只需要为某件事做一次,然后根据需要重复做多次。我热爱效率,所以我坚持不懈。今天我遇到了一个乏味的烦恼,通过创建一个函数,我可以在几分钟内解决它。
形势
我正在寻找一个新的公寓,并试图比较价格。幸运的是(谢谢,COVID),一些单位正在提供一两个月的免费(!)的租金。这是一个极好的消息,但是很难比较价格。
我在做什么
当我看到有打折租金的房源时,我会打开我的计算器应用程序,然后:
- 免费月数(折扣)*月租金(基本租金)
- 最短租赁期限(通常为 12 个月)*月租金(基本租金)
- 从#2 中减去我从#1 中得到的,然后除以最短租期要求
如果我这样做一次,甚至两次,也不会那么糟糕。但是当我第三次尝试时,我开始感到沮丧。我知道我每次想要执行的确切步骤,但是我不得不手动执行每一个步骤——讨厌!
救援功能!
r 函数基础
第一次用 R 写函数时,我真的很害怕,但这有助于一点一点地分解它。请记住,函数会很快变得复杂,但我们会尽可能保持简单。
在最基本的情况下,R 中的函数具有这样的结构:
创造于碳。
不太吓人吧?功能实际上只是:
- 您的函数(myfunction)的名称
- 输入或执行您的功能所需的数据(输入)
- 您希望完成的步骤
函数的一个例子是 mean()。当你想计算平均值时,R 知道把所有的数字相加,然后除以有多少个数字。我们可以直接使用均值函数,而不必自己将数字相加,然后进行除法运算。因为我也有每次都想重复的固定步骤,所以函数是一个很好的解决方案。
我的 R 函数
让我们回到我的租赁示例,确定输入和要完成的步骤。
我需要计算我的有效租金的输入是基本租金、折扣(提供的免费月数)和期限(通常为 12 个月)。
我希望完成的步骤是:将基本金额乘以期限长度减去基本金额乘以折扣。然后我想用它除以期限,看看在应用折扣后,每个月我将有效支付多少。
我将调用这个函数 myrent,并告诉它我们需要三个输入:基本租金(base)、免费月数(discount)和租赁期限(term)。
我们还没有告诉 R 这些输入(基数、折扣和期限)是什么意思。我们也可以使用 x,y,z,我们现在所做的就是告诉它,我们将需要这三条信息,然后我们将对它们做些什么。
现在是步骤。我们将友好地告诉我们的朋友(我笑了)我们想要完成的步骤,并把它们放在{}内。
事情进展顺利!最后一步,我们需要让 R 告诉我们,在完成我们指定的步骤后,它计算了什么。所以我们要让 R 打印(baseterm-basediscount)/term 的答案“result”。
瞧,我们已经准备好使用我们的功能了!!!比方说,我看到了一套月租 2000 美元的公寓(是的,我也很难过,DC 房产真是个混蛋),他们提供 12 个月的免费租赁。
既然我们已经创建了函数,我们要做的就是使用“myrent”调用它,并输入每个输入(基本、折扣和期限)。
就这样,我们信任的伙伴给了我们[1] 1833.333.
这意味着,如果固定租金是每月 2000 美元,并且有两个免费月的折扣,我将在 12 个月内每月支付 1833.33 美元。我现在可以很容易地将它与每月 1920 美元的公寓进行比较,该公寓提供一个月的免费折扣。神奇!
继续用你的头撞墙,这样会好很多!
作者: 詹娜·伊格尔森我的背景是工业组织心理学,我在人物分析中找到了自己的家。数据使我的作品变得生动。我主要使用 Power BI,但我也喜欢涉足其他工具。我很想听到更多关于你的旅程!在此评论或在推特上评论联系我。
如何使用 AWS Secrets Manager 在 Python 中管理凭证
在 Python 中访问凭证的平台无关方式
照片由 Kat Jayne 从 Pexels | 品牌内容披露
E 尽管 AWS 通过 IAM 角色实现了细粒度的访问控制,但有时在我们的脚本中,我们需要使用与 AWS 无关的外部资源的凭证,如 API 密钥、数据库凭证或任何种类的密码。有无数种方法可以处理这种敏感数据。在本文中,我将向您展示一种使用 AWS 和 Python 来管理它的极其简单而有效的方法。
目录:
管理凭证的不同方式
描述用例
实现— PoC 展示此方法
∘ 创建 API 密钥
∘AWS secrets manager
∘使用 awswrangler
∘ 使用检索到的凭证获取股票市场数据
∘ AWS AWS 机密管理器的好处
与 AWS 机密管理器的潜在风险
结论
管理凭据的不同方式
根据您的执行平台 m (Kubernetes、本地服务器、分布式云集群)或版本控制托管平台( Github、Bitbucket、Gitlab、Gitea、SVN……),您可以使用不同的方法来管理机密访问数据。以下是我到目前为止听到的处理凭据的最常见方法的列表:
- 环境变量,
- 作为 CI/CD 部署的一部分接收凭证,
- 利用开发工具中的特定插件。无服务器凭证插件,摄取 Pycharm 中运行/调试配置中的环境变量,
- 在工作流程编排解决方案中存储凭据。气流连接或提督秘笈,
- 将凭证存储为 Kubernetes 或 Docker secrets 对象
- 利用工具,如 HashiCorp Vault 。
以上所有解决方案都是完全可行的,但是在本文中,我想通过利用 AWS Secrets Manager 来演示一个替代解决方案。该方法将是安全的(使用 AWS KMS 加密),并且无论您是在本地、在 AWS Lambda 中还是在独立服务器上运行 Python 脚本,只要您的执行平台被授权访问 AWS Secrets Manager,该方法都将以相同的方式工作。
我们的使用案例
我们将执行以下步骤:
- 在 Alpha Vantage 平台上创建一个 API key ,这样我们就可以从这个 API 中获取股市数据。
- 将 API 密钥存储在 AWS Secrets Manager 中,
- 仅使用两行 Python 代码,在我们的脚本中检索这个 API 键
- 使用该键获取最新的苹果股票市场数据
- 构建 AWS Lambda 函数,并在那里测试相同的功能。
实施—展示此方法的概念验证
创建 API 密钥
如果你想跟进,去https://www.alphavantage.co/拿你的 API 密匙。
Alpha Vantage —作者图片
AWS 机密管理器
首先,确保您为 AWS CLI 配置了能够与 AWS Secrets Manager 交互的 IAM 用户。然后,您可以在您的终端中使用以下简单命令存储秘密:
要查看它是否有效,您可以使用以下命令列出您帐户中的所有秘密:
如果你的证书以后发生变化( ex。如果您更改了密码,更新凭证就像下面的命令一样简单:
使用awswrangler
检索凭证
AWS Secrets Manager 允许将凭证存储在一个 JSON 字符串中。这意味着一个单独的秘密可以保存您的整个数据库连接字符串,即您的用户名、密码、主机名、端口、数据库名称等。
awswrangler 包提供了一种方法,将这些数据反序列化到一个 Python 字典中。当与**kwargs
结合使用时,您可以将字典中的所有凭证直接解包到执行身份验证的 Python 函数中。
我的 requirements.txt 如下(使用 Python 3.8 ):
然后,要检索使用 AWS CLI 存储的秘密,您只需要这两行:
使用检索到的凭证来获取股票市场数据
有一个方便的 Python 包叫做 pandas_datareader ,它允许轻松地从各种来源检索数据并将其存储为 Pandas dataframe。在下面的例子中,我们正在检索过去两天的苹果股票市场数据(当天)。请注意,我们正在从 AWS Secrets Manager 传递 API 密钥,以便与 Alpha Vantage 数据源进行认证。
这是我得到的一个数据框架:
苹果股票市场数据——图片由作者提供
使用凭据的 AWS Lambda 函数
既然我们能够在本地机器上访问凭证,下一步就是在 AWS Lambda 中做同样的事情,以证明这个方法是平台不可知的,并且可以在任何可以运行 Python 的环境中工作。
**边注:**我正在使用一种新的替代方式,用一个 Docker 容器映像来打包 AWS Lambda 函数。如果你想了解更多,可以看看我之前的文章中更详细的讨论。
我使用以下 docker 文件作为我的 AWS Lambda 函数的基础:
src 目录中的脚本 lambda.py 如下所示:
为了构建代码并将其打包到 Docker 容器中,我们使用以下命令:
最后,我们构建一个 ECR 存储库,并将映像推送到 ECR:
**注意:**用您的 AWS 帐户 ID 替换 123456789。此外,相应地调整您的 AWS 区域——我使用的是 eu-central-1 。
我们现在准备在 AWS 管理控制台中构建和测试我们的 AWS Lambda 函数。
使用 AWS Secrets Manager 为 API 密钥检索部署 AWS Lambda 图片由作者提供
了解我们的 Lambda 函数
如果您正在运行多个 Lambda 函数工作负载,那么考虑使用一个可观察性平台是有益的,它将帮助您保持所有无服务器组件的概览。在下面的例子中,我使用 Dashbird 来获得关于上面执行的 Lambda 函数的附加信息,例如:
- 每个特定函数调用的执行持续时间,
- 寒冷开始了,
- 内存利用率,
- 调用次数和错误百分比,
- …还有更多。
使用 Dashbird 调试并了解 AWS Lambda 函数调用——图片由作者提供
你可以在上面的图像中看到,第一个函数执行有一个冷启动。第二个用了 100%的内存。这些见解帮助我通过增加分配的内存来优化资源。在随后的调用中,我的函数运行得更快了,并且没有用尽总内存容量。
AWS Secrets Manager 的优势
希望您可以看到使用这个 AWS 服务存储和检索您的敏感数据是多么容易。以下是这种方法给你带来的好处:
- 安全性 —使用 AWS KMS 对凭证进行加密
- 一个集中存放所有凭证的地方 —如果您决定将所有凭证存放在这里,您将获得一个存放所有凭证的地方。获得授权后,您还可以在 AWS 管理控制台中查看和更新机密。
- 可访问性&独立于平台的凭证存储 —我们可以从本地机器、无服务器功能或容器、甚至本地服务器访问机密,前提是这些计算平台或进程被授权访问 AWS Secrets Manager 资源。
- 跨编程语言的可移植性 — AWS 为各种语言提供 SDK,这样你就可以使用 Java、Node.js、JavaScript、Go、C++、。NET 等等。
- AWS CloudTrail 集成 —当启用 CloudTrail 跟踪时,您可以跟踪谁在何时访问了特定凭证,这为您提供了关于资源使用情况的审计跟踪。
- 访问控制的粒度 —我们可以轻松地将特定凭证的权限授予特定用户,从而更容易了解谁可以访问什么。
AWS Secrets Manager 的潜在缺点
我有一个政策,总是不加粉饰地提供任何技术的利弊。这些是我到目前为止看到的在企业范围内使用此服务管理凭据的风险或缺点:
- 如果您将所有凭证存储在一个位置,并且您没有根据最小特权原则授予访问权限,即某个超级用户可以访问所有凭证,那么当该超级用户的凭证被泄露时,您就有暴露所有机密的风险。这是唯一正确的,如果你不恰当地使用服务,但是为了完整起见,我还是想把它包括进来。
- 费用——由于你每月为每个秘密付费,你必须意识到,如果你使用该服务存储大量凭证,价格可能会增加。
- 信任 —仍然很难让一些 it 经理相信云服务在正确配置的情况下会比本地资源更安全。话虽如此,许多 IT 经理仍然不信任任何云供应商,不会向他们吐露秘密。
- 您的执行平台必须能够访问秘密管理器本身。这意味着您要么需要配置一个 IAM 角色,要么需要以其他方式存储这个秘密。这并不是一个真正的缺点或风险,而是简单地说,您需要意识到对 Secrets Manager 的访问也需要以某种方式进行额外的管理。
结论
在本文中,我们研究了用 Python 脚本管理凭证的 AWS Secrets Manager。我们可以看到使用 AWS CLI 来放置、更新或列出秘密是多么容易。然后,我们看了看如何使用 Python,通过包 awswrangler 只用两行代码就能访问这些凭证。此外,我们将脚本部署到 AWS Lambda 来证明这个方法是平台无关的。作为一个额外的部分,我们研究了如何使用 Dashbird 为我们的 Lambda 函数增加可观测性。最后,我们讨论了 AWS Secrets Manager 作为一种企业级凭证管理方式的优缺点。
我如何将我的数据科学博客从 Pelican 迁移到 Hugo
你也可以!
卡尔·海尔达尔在 Unsplash 上拍摄的照片
动机
鹈鹕的问题
我使用 Pelican 作为我的数据科学博客的框架已经有一段时间了。它对我很有效,尽管总有一些小故障让我感觉不稳定。它从来没有让我感到完整和满足。以下是一些重要的例子:
小社区和小众定位
鹈鹕的群体比雨果小得多。它有 10.4k 颗星星,而 GitHub 上有 51.4k 颗星星。在静态站点生成器社区上,Pelican 是一个利基。已经知道 Python 的人可能想试试(像我!),但是具有更好理解和编程技能的其他人可能更喜欢其他选项。如果你遇到一些奇怪的问题,一个更小的社区会有更少的主题,更少的插件,更少的支持。这正是我的经历。
缺乏令人满意的主题
很难找到我目前的主题既美观又实用。首先,没有多少选择。
难以解决的小故障
我花了相当大的力气才让一切都运转起来。谷歌分析,Disqus,Jupyter 笔记本支持,目录,阅读时间等。在这个过程中,我几乎没有得到任何帮助,因为根本没有多少人使用它。所以我必须深入研究源代码来解决一个小问题。这并不是说这个过程不值得花时间(对我这个程序员来说,这个过程很有挑战性,也很有教育意义),而是为什么我必须在可以照料花朵的时候挖出石头?
速度,速度,速度
当谈到编程语言的速度时,Python 坐在“最慢”的一端,而 Go(几乎)在顶端。我能告诉你的是:它确实显示了现场发电速度。Pelican 需要几秒钟来渲染我所有的文章(20+),而 Go 只需要几毫秒。Go 的另一个好处是,它可以实时更新网站,而 Pelican 会稍微落后一些。当你做了一个小的改动,需要重新生成整个站点才能看到更新的版本时,这一点就更明显了。我们的时间太宝贵了,不能浪费,即使是几秒钟也会积累很多。
为什么是雨果
并发和速度
H ugo 自诩为“世界上最快的网站建设框架”,我完全明白这是为什么。Golang 由 Google 开发,用于解决他们的代码效率问题,并以其强大的并发能力而闻名。这对雨果来说很适用。Hugo 站点的标准构建时间是 100 毫秒,而另一个静态站点生成器是 10 秒。如果你关心速度,那么你一定会喜欢雨果。
良好的社区支持
Hugo 在 GitHub 上的开源项目目前显示的是 54.4k 的星星。这是一个相当大的数字。许多人使用 Hugo 作为个人/商业博客的首选框架。这意味着当有疑问时,更容易搜索类似的问题。此外,Hugo 官方论坛的回应时间相对较短,因为你的问题框架非常精确。Hugo 也有很好的文档,如果你实现了一个新特性,你可以很容易地找到你想要的。
曝光完毕
Golang 作为一种服务器端语言,在过去几年里越来越受到后端开发人员的青睐。这是一门值得花时间学习的语言。与 Hugo 合作不可避免地会让你接触到围棋,当你建立自己的网站并开始学习围棋时,你可能会学到一些东西。
主题,很多主题
不用再看官方的雨果主题网站。这些是免费的。也有一些网站提供付费的高级主题,你可以决定是否值得。无论是免费的还是付费的,Hugo 主题社区都非常活跃,有很多选项可供选择。
平滑学习曲线
一些静态站点生成器,比如 Gatsby,你需要对 React 有很深的理解才能使用它。对雨果来说,你真的不必先学习围棋,尽管知道一些围棋会让你更顺利地加快速度。
我的第一个 Hugo 网站
照片来自https://themes.gohugo.io/hugo-theme-stack/
E 理论制造的充足。让我们开始讨论细节。我将按时间顺序组织这一部分,以展示通常是如何完成的流程,我遇到的一些问题,以及我如何解决它们。
从快速入门开始
最简单也是最好的(至少对我来说)开始迁移的方法是按照官方的快速启动从零开始建立一个新站点。它相对容易遵循,甚至没有很多步骤。如果你知道一点命令行和 Git 会有帮助,但不是必需的。Hugo 自带强大直观的 CLI 界面,即使不太懂命令行,也能毫不费力地完成教程。例如,建立站点仅仅是:
快速启动将为您选择一个主题(anake)您可以稍后轻松地将其更改为您自己的选择。最终的网站看起来会像这个这个。
选择一个主题
选择主题大多是主观的。选择你想要的任何东西。一些看起来对你有吸引力并满足你所有实用需求的东西将是一个好的开始。只是不要花太多时间来确定你的“完美伴侣”,有这么多选择,你可能会在确定一个你真正感到舒服的之前转换多次。我的是栈。对于你的第一个站点,一定要看一下主题文档,因为你肯定需要多次阅读来根据你的喜好进行调整。
配置和调整
有趣的部分来了,修修补补!对一些人来说,调整一个主题让它为你工作是令人畏惧的,但是对我来说,这是令人畏惧和令人兴奋的。感觉就是解谜。你从主题文档、Hugo 文档、YouTube 视频和 stack overflow 中获得线索,然后把所有的片段放在一起。完成后,你会自我感觉良好!
克隆、子模块和配置
首先,git 将主题克隆到本地驱动器:
这有助于将主题添加为子模块。这样使用 Git 更容易管理。如果你想把你的站点放在 Netlify 上,你将需要它用于将来的部署。一旦主题文件夹安全地放在你的本地驱动器上,你只需要对配置文件做一些小的调整就可以了。有两种方法可以做到这一点。一个简单的方法是改变你当前的config.toml
文件:
但是如果你阅读了主题文档,建议的是简单地从主题示例站点复制config.yaml
文件,因为还有其他部分的配置你需要得到正确的,从主题默认配置文件开始更容易。一旦完成,你的简单网站将开始看起来像这样:
来自 https://themes.gohugo.io/hugo-theme-stack/的照片
电影《阿凡达》
现在,为了让主题为你所用,你需要解决一些小细节。首先引起我注意的是醒目的占位符“150x150”头像:
图片来自https://themes.gohugo.io/hugo-theme-stack/
必须先处理掉它!查看文档,头像需要放在网站根目录下assets
文件夹下的某个地方(我放在img
子文件夹下)。然后换config.yaml
告诉 Hugo 去哪里找:
网站自动重新加载,头像更新到我不太好看的照片:
作者照片
Favicon
当你拥有它时,你永远不会注意到它。但是如果它不在那里,它的缺失会永远抓住你。让我们直说吧。我的网站还没有图标,所以我需要创建一个。一个快速的方法是使用 favicon.io 。它可以让你用一张图片、几个字符或者你喜欢的表情符号来生成你的 favicon。为了简单起见,我决定用我的名字。如果不满意,你可以随时修改。用户界面如下所示:
图片来自 favicon.io
下载完 favicon 资源文件后,下一步是确定将它们放在哪里。查看主题文档,没有提到它应该放在哪个文件夹下。如果官方文档不足,查找信息的最佳方法是什么?当然是 GitHub!通常,人们会抱怨开源项目的 GitHub 缺乏信息,并提交问题。让我们看看是否能在那里找到任何线索。经过一番搜索,主题的 GitHub 页面可以找到这里在回购内搜索“favicon”,啊哈,我们有 12 个与之相关的问题:
照片来自https://github.com/CaiJimmy/hugo-theme-stack
圈出的问题(虽然是中文的)是我们需要的,它指引我们到/static
文件夹来放置图标。我把它放在/static/img/
下面。然后更新config.yaml
:
重新装弹,有效!
作者照片
前页
前事是你帖子的元数据。它包含您可以使用的各种预定义变量,或者如果您愿意,您可以自定义自己的变量。这一切都非常灵活。其中,title
、date
、description
、categories
、tags
、image
最为重要。categories
和tags
也决定了如何组织你的内容。
内容组织和特征图像
主题允许两种方式来组织你的内容:类别和标签。要做到这一点,只要把它们包含在你的前面就行了,就像这样:
image: 9-things-i-learned-from-blogging-on-medium-for-the-first-month.jpeg
title: “9 Things I Learned from Blogging on Medium for the First Month “
description: “Why Medium is a good platform to exchange ideas”
slug: 9-things-i-learned-from-blogging-on-medium-for-the-first-month
date: 2019–10–04T20:56:10.704Z
categories: Machine Learning
tags:
- “Machine Learning”
- “Blogging”
- “Medium”
该主题将收集你所有文章中定义的所有类别/标签,并将它们放在相关的“类别”和“标签”页面中。您还可以为每个类别或标签提供一个特征图像。只需在/content/
下创建categories
和tags
文件夹,在每个文件夹中,为每个类别或标签创建一个子文件夹,在子文件夹下放入_index.md
文件和一张图片(比如说ML.jpg
)。在_index.md
文件中,放一个前置事件变量image
并指向图像ML.jpg
。像下面这样:
作者照片
配置完成后,它应该如下所示:
照片来自https://themes.gohugo.io/hugo-theme-stack/
短代码—图像标题
通常情况下, Markdown 文件中的图像应该是这样的:
![Image]{URL}
但不幸的是,这对于图像标题来说效果不佳。经过几次尝试和错误之后,我发现 Hugo shortcode figure
工作得很好:
看起来是这样的:
作者照片
既然重要的部分都已经完成了,是时候写一个脚本将我的基于 Pelican 的 Markdown 文件转移到基于 Hugo 的文件了。
编写从鹈鹕到雨果的迁移脚本
阿文已经想出了制作这个主题的所有细节,现在是时候把我为鹈鹕量身定做的帖子转移到更适合雨果的地方了。这可以通过一些 Python 脚本轻松完成。我使用了来自 GitHub repo 的代码作为基础,并根据我的需要进行了修改。代码非常简单明了。它读取旧 Markdown 文件的每一行,使用 regex 搜索短语,并需要相应地更新和修改每一行,主要是前端内容、图像和视频链接。
值得注意的几点:
- 该脚本将删除输出文件夹(Hugo 内容文件夹)中的所有内容,并从源文件夹中重新生成它们。
- 前事:大量使用正则表达式替换元数据。例如从“标题”到“标题”,“副标题”到“描述”,日期格式等。
- 图片:提取 Medium CDM URL,下载图片,放在 post 子文件夹下,这样特征图片就可以工作了。为了更好的字幕,其他图像被放入了一个 Hugo shortcode。
- YouTube :提取视频 ID,放入
{{youtube}}
Hugo shortcode。它非常有效。
将我的新媒体帖子转移到 Hugo markdown
我有一些中型职位尚未转移到我的鹈鹕博客,所以需要另一个脚本。不用自己写。我使用了来自 GitHub repo 的 Python 脚本。你需要使用 Medium 的导出服务将你所有的帖子放入一个 zip 文件,然后使用脚本将它们转换成 Hugo markdown。由于帖子不多,我做了一些手动调整,为每篇文章创建子文件夹,这样特写图像就可以工作了。
来自 https://github.com/chamilad/medium-to-hugo的照片
在 Netlify 上切换回购
最后,我们得到了我们需要的一切,现在是时候把网络生活从鹈鹕变成雨果了。激动人心!首先,我为 Hugo 网站创建了一个回购,这里。然后,登录我的网络生活账户,进入我的网站,点击SIte Settings
:
图片来自 netlify.com
选择Build & Deploy
选项卡,然后点击Edit Settings
,像这样:
图片来自 netlify.com
选择Link to a different repository->
,会出现一个向导屏幕,在这里你可以选择你的 Hugo 库。这样做,并做一些基本的构建设置。其中,注意构建命令只是简单的hugo
。值得注意的一点是雨果版本。Netlify 上的默认 Hugo 版本不够高,无法正确构建我的站点,我遇到了许多奇怪的错误。我找到了在我的站点根目录下添加一个netlify.toml
的解决方案,并在其中分配 Hugo 版本。你可以在找到参考指南。完成所有设置后,新的构建将生成新的站点。
总体感觉
哦,这是一篇很长的帖子。我很感激能走到这一步的人。我希望这篇长文对你的雨果之旅有所帮助。最后,我想分享一下我对整个过程的总体感受:
- 这并不难,但需要烫平一些皱纹。(也是好玩的部分?)
- 主题采用需要最长的时间。文档会有所帮助,但通常并不完整。GitHub 问题帮助很大。
- 有很多非常善良的人写了脚本来自动化迁移。使用它们,但是不要犹豫根据你的需要修改它们。一点点编程大有帮助,尤其是当你有很多文章的时候。
加成
YouTube 系列 我用来学习 Hugo 基础知识的,都是一口大小的。
觉得这篇文章有用?在 Medium 上关注我(wayofnumbers.com)或者你可以在 Twitter @lymenlee 或者我的博客网站上找到我。你也可以看看我下面最受欢迎的文章!
我如何监控与 Prometheus 和 Grafana 的 SSH 会话
这是时间的问题,而不是事情是否会发生。最好做好准备。
如果尽管采取了所有安全措施,如高级配置、非对称加密和端口敲门,但攻击者还是获得了对我的一台云服务器的访问权限,该怎么办?
我如何以及何时才能发现?难道我不想尽早知道我的一个服务器被入侵了吗?
我不断地问自己这些问题,并决定用 Prometheus 和 Grafana 创建一个监控活跃用户会话的解决方案。我的目标是在我的一台服务器上创建了一个新的用户会话(例如 SSH)时,立即收到通知。当然,这不会阻止攻击者访问系统,但至少会暴露他们的活动。
你可以在下图中看到最终的结果。这是我的 Grafana 实例的截图。每当我登录到我的系统时,该图显示一条红线,因为触发了一个警报,在我注销后显示一条绿线。每一个状态变化都会触发一个电子邮件通知。
显示数据库服务器上活动用户会话的 Grafana 面板
这是我开源软件家族的最新成员的故事。为 UNIX 系统上的活跃用户提供的 Prometheus exporter。
如果你已经熟悉普罗米修斯和格拉法纳或者想直接跳转到导出器的实现细节, 点击这里 。
问题是
我们公司大约在四年前(2017 年)开始采用弹性计算。我很幸运地成为了我们的第一批用户——当时——破坏了在日常业务中使用云基础设施的计划。直到我建立了自己的私有云服务器,我才最终意识到,是的,公共云服务器往往是公开的——对互联网上的任何人都是公开的。
这在工作中没什么大不了的,因为消费服务不同于提供服务。我不必担心我们工作中的虚拟机的安全性,因为有另一个团队负责它。亚马逊网络服务(AWS)显然在很久以前就了解了这一点,并发布了它所谓的共享责任模型。这个模型是关于 AWS 和它的客户在一个亚马逊乐于提供其服务器和服务的世界中的责任。虽然 AWS 负责对服务器的物理访问,但客户必须负责对存储在其虚拟机上的数据的虚拟访问。
现在,由于显而易见的原因,我们无法物理访问 AWS 的服务器并插入以太网电缆,因此我们使用 SSH 等工具和协议通过公共互联网访问我们的云服务器。尽管有办法在 AWS 或 Azure 等云提供商上创建私有和混合网络,但这些功能可能只是愿意花费时间和金钱来构建此类网络的企业客户的一种选择。
作为一名热爱软件开发的软件架构师,我决定在去年夏天的这个时候开始开发我的第一个软件即服务(SaaS)产品。由于对维护物理硬件不感兴趣,我也决定购买一些云服务器。
因此,我阅读了几篇关于配置 OpenSSH 和 fail2ban 的文章,以丢弃来自尝试使用 OpenSSH 登录但失败的 IP 的所有流量。然而,我仍然对我的服务器的暴露有不好的感觉。因此,我计划长期接收某种形式的电子邮件通知,只要用户通过 SSH 登录。但是监控系统还没有到位。
对于每个有全职工作的人来说,兼职的时间是有限的,你可能也经历过这种情况。所以直到今年 3 月,我才最终能够用 Prometheus 和 Grafana 搭建起监控基础设施。
解决方案
**Prometheus 和 Grafana 是用于监控和警报的开源工具的经典组合,抽象出存储和可视化指标的复杂性。**两个系统一起可以从服务(Prometheus)收集和接收指标,并可视化指标、聚合和派生(Grafana)的当前和历史状态。此外,这两个系统实际上都可以定义某些阈值和条件,这些阈值和条件将通过电子邮件、Slack、Discord 等方式触发通知。他们需要提供的功能是数据。
数据提供者可以是配备有 Prometheus 库的应用程序,也可以是 Prometheus 生态系统中的导出器。导出器是一个独立的应用程序,它从另一个工具甚至主机上收集指标,并通过 HTTP 端点公开这些指标。
因为我想从操作系统中收集指标,所以编写一个导出器是可行的方法。缺失的部分是一个 UNIX 命令,它返回当前登录用户的一些信息。快速的谷歌搜索会产生各种各样的命令,如 w 、 who 和 users 。
在这些命令中,我发现w
命令最有吸引力,因为它不仅返回当前登录用户的名称,还返回每个用户的名称
- IP 地址,
- 登录的时间,
- 当前进程的名称。
对于我想要实现的目标和最后一个缺失的拼图,这是一些非常有用的信息。因此,为了在用户登录我的服务器时收到来自监控系统的通知,我需要
- 调用 w 命令并解析输出,然后
- 使用简单的服务器应用程序通过 HTTP 导出指标。
实施
正如普罗米修斯本身就是用围棋打造的一样,很多出口商也是用围棋打造的。然而,我更熟悉 NodeJs,所以我选择用 NodeJs 实现这个导出器。
解析w
命令的输出就像遍历输出的每一行,并将每一列的值与标题行的对应列进行匹配一样简单。您可以在下面看到的函数期望以字符串的形式接收命令的输出,并返回一个数组,该数组包含每个登录用户的零个或多个对象。
为了提取每个用户的活动会话数,我进一步将数组简化为一个对象。一个对象,包含每个活动用户名的键,值为与该用户关联的所有会话。
为了向 Prometheus 服务器公开收集的指标,我选择使用open telemetry Prometheus-exporter包。这个包已经包含了一个PrometheusExporter
服务器实现、一个 HTTP 端点和一个MeterProvider
来创建度量并更新它们的值。
然后我必须把所有的部件粘在一起
- 出口服务器,
- 配置和命令行选项,
- 并将收集和解析的
w
命令输出到位。
您可以在这里查看最终结果:
https://github.com/stfsy/prometheus-what-active-users-exporter/blob/master/lib/index.js
收尾工作
在我对云机器的第一次测试中,我意识到我没有足够关注一个重要的方面。时间。
我在上面提到过,Prometheus 通常从已知的服务器、服务和导出器收集指标。它通过为每个作业调用配置的指标端点来实现这一点。因此,一个作业配置必须至少包含
- 目标机器的主机名,
- 目标应用程序的端口,
- 和指标端点的路径。
此外,用户可以配置刮擦间隔,该间隔定义 Prometheus 从已配置的端点获取指标的频率。默认情况下,该间隔为一分钟。
我还在导出器中使用了一个可配置的时间间隔。这个时间间隔定义了导出器调用w
命令并解析其输出的频率。此外,还有每个活动用户会话的持续时间。
为了捕获尽可能多的用户会话,**导出器和 Prometheus 本身的抓取间隔需要尽可能小。**理想情况下,也可以流式传输w
命令的输出,以便在新结果可用时立即获取,而不是轮询它。
我决定做以下事情:
- 降低导出程序的默认抓取时间间隔,以捕捉持续时间超过五秒的用户会话。
- 将每个收集的用户会话缓存 60 秒(忽略用户注销的时间),以便 Prometheus 有足够的时间从导出器获取指标。
仅此而已。我已经在生产中使用该导出器几周了,它工作得很好。活动的 SSH 会话——目前为止只有我发起的会话——确实会产生电子邮件通知。
你可以在这里查看导出器的源代码。如果你对使用导出器感兴趣,请查看库的自述文件以获得安装说明。导出器的每个版本都包含 Linux 和 Alpine Linux 的可执行文件以及各自的 SHA256 校验和。
即使我用 NodeJS 实现了导出器,您也不必担心安装和更新运行时。相反,您可以从的最新版本下载二进制文件并立即使用,因为我将导出器编译成了适用于 Linux 和 Alpine Linux 的单一可执行文件。
判决
几天的工作,但值得花时间来获得更多关于我的云服务器上的活动的透明度。我将导出器添加到我所有的云服务器中,并在我的 Grafana 仪表板中为它们创建了一个面板和一个警报。当我把它编译成一个可执行文件时,在 UNIX 系统上安装它只需要几行代码。
我在我的 GitHub 帐户上发布了源代码和二进制文件,请随意查看。
https://github.com/stfsy/prometheus-what-active-users-exporter/
感谢阅读。如果您有任何反馈或进一步的想法,您可以通过 Twitter @stfs y 联系我
我,一个卑微的工程师,如何处理冒名顶替综合症
作者图片
办公时间
让我在这篇文章的开始说,冒名顶替综合症已经被大量详细地讨论过了,我可能没有什么新的东西可以添加到讨论中,所以让我在这里停下来,感谢您的阅读,很抱歉浪费了您的时间。
阿克汉姆。虽然已经有很多克服冒名顶替综合症的建议,但我发现它通常属于以下两类:
- 你!冒名顶替者?!不会吧!别再这么想了!
- 假装直到你成功。如果你保持自信,总有一天你会的。
第一个角度显然是无用的,第二个,我认为,既不可能也不可取。
热门话题:你无法成功假装自信。不是说可以就没用了。研究表明,在让人们认为你知道自己在做什么的时候,自信比实际能力更有说服力。过分自信会让你在生活中走得更远。但是同样的研究表明,仅仅假装自信是不够的。你必须真的相信它——你必须“诚实地过度自信”在为《大西洋》杂志撰写的一篇精彩文章中,凯蒂·凯和克莱尔·希普曼写下了他们对信心研究员卡梅隆·安德森的采访:
真正的过度自信不仅仅是虚张声势。安德森认为,极度自信的人不会疏远他人的原因是他们没有假装。他们真诚地相信自己是好的,这种自信就是他们所遇到的。他告诉我们,虚假的自信是行不通的。[……]大多数人在一英里外就能看出虚假的自信。
"大多数人在一英里之外就能看出虚假的自信。"这是在实验室里得到证实的结果,也是我在自己的生活中无数次验证的结果。
如果你以写软件为生,那么你可能会花很多时间与那些狂热地争论最佳键盘快捷键的人打交道,你会认为他们是在为自己的博士论文辩护。最重要的是,如果你是一名女性,你可能还会花很多时间让人们相信你真的知道如何编码。结合这两点和编程实际上很难的事实,难怪我们很多人都觉得自己是骗子。我第一次知道这种感觉的名字是在 2013 年,当时我是一名大学二年级学生,我拿到了脸书·首席运营官·雪莉·桑德伯格的新书《向前一步》。多亏了那本书,我(和许多其他人)开始问自己,“问题是我是个冒名顶替者,还是我有冒名顶替综合症?”
对我来说,很难举出一个女性软件工程师不经常对此感到惊讶的(当然许多男性也是这样——但我发现这种情况更少)。但这就是事情变得复杂的地方,因为当你知道自己可能患有冒名顶替综合症时,你会觉得有必要消除它。你得出的结论是,你内心的不安是错误的——你内心的不安全感是一种错觉——你不应该再让你的直觉来指导你的行动。取而代之的是,你启用手动覆盖,以你认为一个自信的人会做的方式行动。您可以通过列出您的凭据来开始对话;你找一切机会给你的母校起名;你在社交媒体上发布你的所有荣誉。(我对所有这些事情都感到内疚。)这感觉像是在吹牛,但很难说,因为这不正是患有冒名顶替综合症的人会想的吗?
但我认为这种自我推销听起来很空洞。与此同时,在我们丢证书的过程中,我们经常无法在那些确实会影响人们对我们看法的情况下表现出自信。例如,我倾向于给出一个观点,然后马上用“但是我不知道我在说什么”和“但是你绝对应该谷歌一下。”这种顶嘴绝对会让我看起来不太称职。
换句话说,当我们强迫自己忽略“错觉”,即骗子综合症时,我们最终会表现得不像人类——对其他人来说也不真实。同时,我们未能解决问题的根源。
那么解决办法是什么呢?对我来说,答案是专注于获得“真正的自信”——我的大脑和我的直觉都认为我应该拥有的那种自信。我做到这一点既不是通过每天对自己重复肯定“你在 Python 开发方面很棒”,也不是通过回到学校攻读博士学位。但以下是对我有效的方法。
校准你自己
关于舞蹈家弗雷德·阿斯泰尔,鲍勃·瑟夫斯有一句名言:
当然他很棒,但是不要忘记金格尔·罗杰斯做他做的每一件事,向后,穿着高跟鞋。
这很可能是真的,不管你有多合格,如果你没有合适的条件——如果你不够高,不够男性,不够自信,不够有魅力——你必须加倍努力才能让人们意识到这一点。如果他们意识到的话。
但是我们大多数人不会一夜之间从笨手笨脚变成金格尔·罗杰斯。我们什么都不知道就开始了我们的职业生涯,最初几年像新手一样挣扎,最终学到足够的东西称自己为专家。然而,我们很少知道在任何时候我们属于那个光谱(此外,专业知识是相对的,不是吗?).
这让我想到,我们所有人肯定都在暗自思考:“有些认为自己是骗子的人实际上是骗子!我怎么能确定我不是他们中的一员?”
所以我的第一条建议是,如果可以的话,试着以某种客观的方式回答这个问题:与我的同龄人相比,我有多能干?这种问题不会出现在任何关注健康的自助书籍中,但对我来说,它非常有帮助(并不是因为我是某个了不起的 10 倍程序员)。
疯狂分析的软件开发领域有工具可以做到这一点。我认识的一个工程经理有一个仪表板,分析所有团队成员的代码提交,并计算他们的相对生产率(我很高兴他不是我的经理)。我并不是建议你用这个奥威尔式的标准来衡量你的自我价值,但是如果你至少有一些客观衡量你地位的方法,你可以更好地识别你的不安全感是来自想象的还是真实的表现差异。这一点非常重要,尤其是在科技领域,因为不客观的衡量标准比比皆是。
要成为一名成功的程序员,你不需要有计算机科学的大学学位,但走传统的大学路线确实给了我一个不可替代的视角:亲眼看到我看待自己的方式与我的同学——他们最终会成为我的同事——看待和谈论自己的方式之间的差异。
大二转到计算机科学,我已经“落后”了。我的很多同学从子宫里就开始编码了。这个领域很广阔,我不知道人们大部分时间都在谈论什么:Arch Linux?λ函数?emacs?神经网络?让我害怕的不仅仅是行话。也是因为我的同学有如此强烈的意见!为什么我放弃 Macbook Pro 而选择一台操作系统不能休眠或播放音频的电脑如此重要?为什么我必须在 70 年代建造的没有图形用户界面的文本编辑器中编写代码?我不知道,但我确信这是合法程序员所做的。
“你没有意识到的是,”我的朋友雷蒙德说,他是一个比我大两岁的早熟的程序员,“他们把所有的时间都花在争论他们一无所知的事情上。”我花了三年的 CS 教育才意识到,我的许多同学确实是在随便地胡说八道,而且真的没有任何好的理由用 emacs 写代码。(#vim4life)
和你一起通宵学习的同学比和你的同事更容易成为好朋友。正因为如此,我一次又一次地看到这种模式:一个朋友详细而权威地谈论量子计算,但进一步询问后发现他们的全部背景知识归结为四条推特。他们对于为了争论一个话题而必须了解多少的标准比我低得多。这给我的印象是比实际情况“落后”得多。
轶事的复数形式不是数据,但数据确实支持这种跨越性别界限的“信心差距”。在实验室中,女性认为她们在考试中的表现比男性差,即使她们的分数相同。在一项研究中,女性只有在认为自己符合 100%的工作条件时才会申请晋升;男性在 60 岁时申请。这种现象是心理学中最容易重复的结果之一。
我永远记得大三申请实习的时候,我当时的男朋友找到我,沮丧地告诉我他申请 Android 开发人员的职位被拒绝了。
“但是弗兰克*,”我说,“你对 Android 开发一无所知。”
对此他回答道:
“没有这份工作,我怎么学习?”
当我的女同事被问及是否能完成一项任务时,我看到了另一种常见的变体。在一次会议上,一位项目经理问(我们团队中唯一的另一位)女工程师,她是否能开发出一个功能。
“也许吧?我不知道…我从来没有做过这样的工作。我得问问我的经理。”
我一生中从来没有听到一个男同事说过这样的话。这并不是说我的男同事声称他们可以做任何事情。只是他们通常把责任推到其他地方——复杂的软件或不称职的同事——而不是他们自己。但更多的时候,他们只是说是,认为无论他们不知道什么,他们都可以在工作中学习。
不幸的是,我不能给你一个确切的公式来学习如何积累,但我会说我做过的最有用的“校准练习”是成为一名面试官。在 OkCupid 的第一份工作中,我经常查看求职者的简历,他们列出了“大规模训练和部署神经网络”或“从零开始构建编译器”等成就,但当手指敲击键盘时,他们无法编写一个for
循环来拯救自己的生命。
换句话说,如果你让你对别人的看法被那些能说会道的人左右,你很容易觉得自己比实际情况落后了很多。这样,找到一个更具体的衡量标准——无论是代码行的提交、绩效评估,还是与你的经理的坦诚对话——都会很有用。也许没有一个衡量标准是完美的,但它们合在一起可以描绘出一幅更清晰的画面。
当然,在这个校准练习的最后,你可能会学到一些你不喜欢的东西。也许这意味着你需要花时间积累经验或努力学习来提升你的技能。没什么丢人的。这是一个可行的见解。如果你发现你真的不擅长某件事,尽管你很努力,那也没关系。我从来没有对自己不擅长的工作感到开心过。但是我在这些角色上呆的时间比我应该呆的时间长,因为我花了太多的时间去思考我只是得了冒名顶替综合症。对我来说,正确的做法一直是转向更适合我优势的东西。或者,当然,你可以简单地说去他妈的竞争——你喜欢你所做的工作,这才是最重要的。
言之凿凿
将你的能力与你的同行进行对比是很重要的,这不仅是为了让你知道你有多“好”,也是为了让你了解你的同行(有时是你的竞争对手)是如何表现自己的。不,你不会想在简历上撒谎说你是 C#专家,而你所写的只是“你好,世界”但与此同时,如果就业市场上的每个人都把自己列为只有一年经验的有经验的 C#开发人员,难道你不应该把这作为自己的标杆吗?事实上,如果你不这样做——如果你把自己放在一个更高的标准上——你可能会无意中误导人们认为你没有实际能力,因为你使用了不同的尺度。
作者图片
过度推销自己的能力是不明智的,而且让人感觉“恶心”但是当你真正理解像你这样有能力的人是如何表现自己的时候,你会发现你说话自然会更自信,因为你觉得这是你应得的。
关于说话的话题,这里有另一个建议:不要不必要的贬低自己。如上所述,我永远不会建议某人试着让自己听起来比实际上更有知识。但这并不意味着你应该刻意去抹杀自己的可信度。
我经常感到内疚,因为我太害怕被“发现”,所以当我说这样的话时,
“我有 8 年的 Python 经验,”
我还加上一句:
“但我对 Flask 或 Django 或如何创作 pip 包一无所知,也不知道 Python 3 和 Python 2 的区别,而且我从未使用过collections
包,有时当我笑得太厉害时,我会有点尿裤子。”
我的未婚夫曾经向他的父亲寻求建议,约一个“配不上他”的女孩出去他的父亲回答道:
“让她自己去想吧。”
对我和我交谈过的许多女性来说,我们非常害怕说出一些最终被证明是错误的话,以至于我们愿意一开始就牺牲自己的可信度来避免这种可能性。这是不必要的。如果你说错了,有人会查出来纠正你,也可能不会。了不起。只是不要在 Twitter 上尝试这个。
你很聪明,即使你不知道 Kubernetes
也许这是最重要的提示。
在这篇文章的大部分时间里,我建议了一些让你感觉不那么像骗子的方法——改变你对自己的看法,以及你向他人展示自己的方式。但是当然,人们对你的看法有很多是你无法控制的,尤其是涉及到偏见的时候。作为一名从事技术工作的女性,我总是努力让人们相信我有能力,而他们的反应总是让我感觉不那么好。此外,抛开性别歧视不谈,科技行业充斥着很多混蛋,还有更多人不是混蛋,但偶尔说话像他们一样。我不知道如何改变这一点。
但我确实认为,当你在和一个混蛋说话时,认识到这一点是有价值的,这样你就不会把这当成自己的一个缺点。你不可能理所当然地走到 TCP/IP 的发明者温顿·瑟夫面前,期望就网络协议进行一场你无法完全理解的辩论。但是不管你对一个主题了解多少,你总是值得像一个聪明人一样被谈论。当我想知道一个同事是否在用高人一等的口气和我说话时,我会问自己,“如果我是理查德·费曼,这个人会这样和我说话吗?”因为理查德·费曼不知道库伯内特,但你永远不会像他是一个倒霉的傻瓜一样向他解释一些事情。
当然,当你发现自己被人以高人一等的姿态说话时,你就没什么可做的了。但是有时候识别出你不能改变的事情会给你更多的时间去关注你能改变的事情。
但是我知道什么?
—
非常感谢萨拉·罗宾逊和阿努·斯里瓦斯塔瓦,我的两位聪明又体贴的同事对这篇文章的反馈。
【https://daleonai.com】原载于 2021 年 3 月 9 日https://daleonai.com/my-take-imposter-syndrome-tech*。关注*dale quark @了解更多。
我是如何通过 2023 年更新的 AWS 认证机器学习专业的
我参加 2020 年 AWS 认证的动机和经历,更新至 2023 年
照片大卫·库伯
我为什么要开始机器学习教育?
AWS 认证的机器学习专业不是我第一次接触机器学习。为了找出为什么我认为让自己通过这些艰难的考试会很有趣,看看我之前关于机器学习和深度学习的文章。本文是关于 AWS 机器学习专业,我的学习路径和考试。本文包括 2023 年关于成长思维在 AWS 考试准备中的重要性以及常见挑战和解决方案的更新。
AWS 机器学习专业是我参加过的最具挑战性的考试之一,也是最有收获的考试。这很艰难,所以当你经过的时候这是一种奇妙的感觉。根据最近的技术进步,比如 ChatGPT 和 DALL-E 2,反思我的成就,我为自己的成就感到自豪。随着尖端人工智能创新以似乎不可能停止的速度出现,我们正在进入一个创造力和商业创新的新时代。
机器学习正在被各种行业采用,比如金融服务,数字银行利用机器学习来改善服务,创造更个性化的银行体验。然而,将使用这些技术的人的需求和经验放在首位是至关重要的。通过整合以人为本的设计原则,我们可以确保机器学习创新能够提高使用机器学习的人们的生活和体验。
https://medium.com/swlh/how-to-build-a-bank-a99a7f346f0d
成长心态在 AWS 考试准备中的重要性
像 AWS 机器学习专业这样具有挑战性的考试需要技术和心理准备。这里有一些小技巧可以帮助你自信地、有韧性地进行考试准备。
- 接受挑战:不要回避困难的话题。挑战提供了学习和成长的机会。与其因失败而气馁,不如把它当作一个从错误中学习并改进方法的机会。
- 接受反馈:反馈是学习和成长的有用工具。乐于接受他人的反馈,包括同龄人和导师。使用反馈来确定需要改进的地方并调整您的方法。
- 保持动力:设定可实现的目标,将你的学习计划分解成可管理的部分,并跟踪你的进展,可以帮助你保持动力。我使用 Trello 板和白板来跟踪我在考试领域的进展,并完成课程中具有挑战性的部分。
- 练习,练习,练习:熟能生巧,你练习得越多,考试那天你就会感觉越舒服和自信。使用在线资源、模拟考试和实践经验来巩固你的知识和技能。我参加了多次模拟考试,直到我确信我已经掌握了主题。此外,我挑战自己建立一个从记忆到实践的机器学习管道。
每个人的学习历程都是独一无二的;对一个人有效的不一定对另一个人有效。所以要大胆尝试不同的途径和方法,直到找到最好的。
我为什么选择 AWS 平台?
我选择 AWS 是因为我已经很熟悉它了。我曾在大型企业中使用 AWS 将工作负载迁移到云中,并在初创企业中从头开始构建云原生银行。我在 FastAI、斯坦福和 Coursera 的课程中使用过 SageMaker 这样的产品。然而,似乎 AWS 应该是我的第一个特定于平台的认证。
你需要学习哪些课题?
用亚马逊的话说,AWS 认证的机器学习——专业认证“验证候选人针对给定业务问题设计、实施、部署和维护机器学习(ML)解决方案的能力。”为了涵盖所有这些,考试分为四个领域。百分比是考试中该领域所占的比重。
领域 1 是数据工程 20%:这涵盖了 AWS 大数据堆栈;包括流数据工具(Glue & Kinesis)、存储(S3 & RDS)和分析(Kinesis & Athena)。该领域展示了这些组件如何适应 Sagemaker 生态系统。
领域 2 是探索性数据分析 24%:这包括如何为建模、特征工程和数据分析准备数据,如何处理缺失值、不平衡数据和标准化。这不是 AWS 特有的,需要更广泛的探索性数据分析知识。
领域 3 建模 36%:这是考试中最重要的部分,需要对 SageMaker 模型和 AWS 机器学习产品有广泛的了解。这个领域包括为业务问题选择合适的模型、训练模型、超参数调整、模型演化等等。
领域 4 是机器学习实施和操作 20%:这涵盖了使用 SageMaker 的解决方案的安全性、部署和优化。
我是如何学习这些话题的?
由于我以前有过机器学习的经验,我的偏好是找到一些课程,帮助我专注于我需要温习的 AWS 领域以及任何需要填补的空白。而不是从头学起。我发现的最好的方法是弗兰克·凯恩的实践课程,链接在评论部分。我以前上过弗兰克的课,我喜欢他脚踏实地的风格。他在 AWS 和 IMBD 有职业生涯,很容易将机器学习概念与现实世界的例子联系起来。如果你没有任何机器学习知识,这将是一个挑战。弗兰克在他的讲座中证实了这一点。
与实际的考试领域相似,Frank 的课程分为四个部分。还有几个实验室,您可以亲自试用这些工具。与其他学习平台不同,您需要一个 AWS 帐户。AWS 免费层将有助于最小化成本,但请记住关闭并删除您启动的任何构建。如果你用 GPU 创建一个机器学习训练环境,如果你忘记关闭环境,这可能会非常昂贵。
弗兰克也有单独的模拟考试。这有助于证明你的知识,并对问题的格式有所了解。除了 Frank 的模拟考试,还有 Abhishek Singh 在 Udemy 上的两个模拟考试值得参加。这些都是很方便的工具,可以帮助我找出知识上的差距,突出需要更多学习的地方。无论你从事哪种学习,模拟考试都是一个很好的资源。
除了课程之外,为了更深入地了解产品,我建议阅读 AWS 文档,观看 AWS 视频,并在 AWS 上创建自己的环境。有大量内容涵盖 SageMaker、机器学习管道、数据分析等。
常见挑战和解决方案
在学习 AWS 认证机器学习专业考试时,克服技术困难的最佳方法之一是从入门课程或教程开始。在我以前关于机器学习和深度学习的文章中,我为希望在这些概念上建立强大基础的初学者分享了一些很好的资源。机器学习起步。深度学习起步。
备考学习时的另一个挑战是资源成本,主要是在使用 AWS 机器学习产品时。为了帮助最小化这些成本,仔细计划你的学习方法并有效地使用 AWS 免费层是一个好主意。此外,您可以考虑使用替代的开源工具来完成特定的任务。例如,我创建了一个 Lambda 作业来每隔几个小时关闭 AWS Sagemaker 实例,以避免它们长时间运行。
通过对 AWS 认证机器学习专业考试的学习方法进行战略性和深思熟虑,你可以克服这些挑战,并在这个令人兴奋和快速增长的领域取得成功。
考试是如何格式化的?
考试本身长达 3 小时,由 65 道题组成。许多是基于场景的。比如说。你在一家医疗保健公司工作,需要调整一个机器学习模型。什么参数会帮助你做到这一点?另一个例子是,您正在开发一个金融服务领域的欺诈系统。你将如何评估一个模型的有效性?最后一个例子是什么样的 AWS Kinesis 产品组合将允许您流式传输数据和创建可视化。与所有 AWS 考试一样,总有两个答案看起来很合适,请确保您仔细阅读了它们。我花了整整 3 个小时完成考试。考试技巧 101,总是标出你不确定的问题,这样你就可以很容易地回到这些问题上,并给自己时间在最后检查它们。利用你所有的时间。没有直接的编码问题,但是您可能必须选择何时使用正确的库。比如 Scikit-learn,MLlib 或者 TensorFlow。
我在家监考的经历。
由于英国的封锁,考试是在家监考的。该软件监测您的计算机的桌面,网络摄像头的视频和音频。我不确定一个人是否能坐完整场考试,但确实有人在聊天中出现了。稍后会详细介绍。考试期间,不能有任何食物、饮料、计算器、纸或笔。考试软件中有一个白板,我最初担心没有计算器是没有根据的。
因为这是我的第一次家庭监考,有一个学习曲线,它不是没有问题。几天前进行一次测试,检查摄像头、麦克风和操作系统的性能。我的第一个挑战是固定的 iMac 网络摄像头。不可能为了检查工作空间而移动它,所以我买了一个便宜的独立网络摄像头。第二个挑战是 Wi-Fi。我有很好的 Wi-Fi,但在一次尝试中似乎失败了。建议是把你的电脑和宽带连接起来。一旦我解决了技术问题,监考系统运行良好,我更喜欢这种考试方式,而不是去考试中心。
一旦考试完成,你将在几分钟内知道你是否通过。请注意,通过或失败屏幕并不是考试的结束!!记得在庆祝之前合上最后一页,假设你通过了。庆祝前我没有合上最后一页,这是一个相当焦虑的监考突然出现在聊天室指示我这样做。
可解释的人工智能
可解释的人工智能(XAI)是机器学习的一个新兴趋势,专注于使机器学习模型更加透明和可解释。通过提供对人工智能模型如何工作及其输出背后原因的见解,XAI 需要为机器学习模型提供透明度和可解释性,确保它们产生合乎道德和无偏见的结果。AWS 提供了几个 XAI 工具,如亚马逊 SageMaker Clarify,以帮助用户识别和减轻机器学习模型中的偏见和其他道德问题。此外,通过了解人工智能模型如何做出决策以及促成这些决策的因素,用户可以就其人工智能模型的部署和使用做出更明智的决策。
艾伦理学
关于在商业环境中实施机器学习的伦理考虑和挑战的更深入的资源,请参考我以前的文章,名为开始深度学习。
总结
回顾我获得 AWS 认证机器学习专业认证的历程,我可以自信地说,这是一次具有挑战性但又有益的经历。通过这个过程,我对 AWS 产品和服务有了深入的了解,并扩展了我的机器学习知识,同时提高了我的 python 编码技能。三个小时的考试很紧张,但这是一个检验我所有技能的绝佳机会。
在通过考试后的两年里,我继续在各种场合应用我的知识,这在我的职业发展中证明了难以置信的价值。我很感激这段经历,从那以后,我一直在追求其他的认证,这些认证进一步扩展了我的知识和技能。
追求 AWS 机器学习专业认证是对我个人和职业发展的重大投资。我向所有对提升机器学习知识和技能感兴趣的人强烈推荐它。
您准备好通过满足客户的需求和员工的期望来释放更大的价值了吗?保持联系,重新引入数字化创新和增长的人际关系、体验和需求。
请在这里联系我大卫·库伯或者在这里给我发邮件david@davidkolbconsultancy.com
我是如何通过 GCP 专业 ML 工程师认证的
Billy Huynh 在 Unsplash 上拍摄的照片
如果你遵循这个学习计划,你也能做到
介绍
2020 年,谷歌云平台发布了其最新认证:专业 ML 工程师认证。
当 2021 年开始时,我决定试一试,尽管谷歌建议在参加考试前有 3 年以上的实践经验,而且我实际上从未在现实生活中与 GCP 共事过。但是为什么要这么做呢?嗯,不考虑证书本身,我真的认为准备工作本身会让我了解 GCP 如何工作以及如何在其上进行机器学习的许多细节。此外,由于我每天都在使用 ML,我认为这只是一个让它适应 Google 平台的问题。
尽管我花了近 3 个月的时间来准备,我可能可以在更短的时间内完成,但我最终比考试所需的时间更长,做了大量的 MOOCs 和 Qwiklabs,还通过一本书进行了学习。
我只是告诉你我个人的故事来表明,即使你没有太多的 GCP 经验,仍然有可能在合理的时间内学会它,至少足以通过认证考试。我会建议一个短得多的学习路线,然后展示我做的额外的东西,我认为这些东西对获得认证是不必要的,但如果你只是对学习 GCP 感兴趣,那可能会有用。
学习轨迹
基础知识
- 快速浏览一下考试指南和样题,以便在学习的时候知道要找什么。
- 这个关于机器学习的速成班,如果你需要复习的话
- 参加这个课程是为了理解主要的 GCP 工具以及如何将它们应用到 ML 问题中(如果你已经熟悉 GCP,跳过这个)
- 参加本课程以了解张量流的基础知识(如果您熟悉张量流,请跳过本课程)
进入细节
- 阅读文档(不要关注代码,而是更多地关注何时使用哪个工具)。阅读整个 GCP 文档可能需要很长时间,因此,请关注以下特定领域:
- ML API—视觉、自然语言、视频和语音转文本(了解他们每个人能做什么,也了解他们不能做什么)
- AutoML (了解何时应该使用 AutoML 而不是 ML APIs)
- AI 平台(这是最重要的部分。重点关注如何提高性能、如何使用 TPU 和 GPU 等加速器、如何进行分布式培训和服务以及不同的可用工具,如假设工具)
- 推荐 AI (有 3 种型号类型。了解何时使用它们)
- TPU(知道何时以及如何使用它们)
- TensorFlow (不背代码,但是如何提高性能)
- BigQuery ML (了解所有可用的算法)
额外的东西
所有这些都是可选的,特别是如果你已经熟悉 GCP 的话。如果你不是,而且你有时间,它可能会帮助你学习一些额外的细节,但我不会说这是至关重要的。
- 课程 MLOps 基础学习更多关于人工智能平台管道和 Kubeflows 的知识
- 课程GCP tensor flow 端到端机器学习
- 本书谷歌云平台上的数据科学提供一些动手编程的经验
如果你经历了所有这些,你可能已经涵盖了大部分考试内容,应该可以开始了。现在,让我们来看一些额外的提示,它们可能会帮助你专注于正确的事情。
额外提示和注意事项
一般
- 用于流数据的典型大数据管道:
发布/订阅- >数据流- >大查询或云存储
- 批量数据的典型大数据管道:
发布/订阅- >云运行或云功能- >数据流- >大查询或云存储
- 默认使用通用 API(视觉、视频智能、自然语言……)。仅当您有自定义需求(自定义标签等)时才使用 AutoML。)
- 要去除敏感数据,您可以使用 BigQuery、云存储、数据存储或数据丢失保护(DLP)进行编辑、标记或哈希处理
- TensorBoard 和 TensorFlow 模型分析之间的差异:前者在训练期间基于小批量进行评估,而后者在训练之后进行评估,可以在数据切片中进行,并且基于全部数据
- AI 解释:有了表格数据,你可以对大的特征空间使用有形状的或综合的成分;对于图像,可以使用集成渐变进行像素级解释,或者使用 XRAI 进行区域级解释。
- 什么时候在 TFX 上空使用库伯气流?当您需要 PyTorch、XGBoost 或者您想要对流程的每一步进行 dockerize 时
- Keras:默认使用顺序 API。如果您有多个输入或输出、图层共享或非线性拓扑,请更改为函数式 API,除非您有 RNN。如果是这种情况,Keras 子类代替
- 优化张量流流水线的 3 种方法:预取、交错和缓存
- 写这篇文章的时候发现这个网站有 5 个例题,有些是我考试的时候看到的。由于这是一个相当新的认证,除了谷歌提供的问题之外,不容易找到其他问题的例子,但随着时间的推移,应该会变得更容易
大查询 ML
- 它支持以下类型的模型:线性回归、二元和多元逻辑回归、k 均值、矩阵分解、时间序列、提升树、深度神经网络、AutoML 模型和导入的张量流模型
- 使用它进行快速简单的建模、原型制作等。
储存;储备
选择用于分析的存储:
- 结构化数据:毫秒级延迟的 Bigtable,秒级延迟的 BigQuery
- 非结构化:默认情况下使用云存储,移动设备使用 Firebase 存储
催速剂
- 在 CPU、TPU 和 GPU 之间选择:
对于快速原型、简单/小型模型或如果您有许多 C++自定义操作,请使用 CPUs 如果你有一些定制的 C++操作和/或中大型模型,使用 GPU 使用 TPU 进行大型矩阵计算,无需定制张量流运算和/或训练数周或数月的超大型模型
- 要提高 TPU 上的性能:如果数据预处理是一个瓶颈,则作为一次性成本离线进行;选择适合内存的最大批量;保持每个内核的批处理大小不变
神经网络
反向传播中的常见陷阱及其解决方案:
- 消失渐变->使用 ReLu
- 分解渐变->使用批量标准化
- ReLu 层正在消亡->学习率降低
对于多类分类,如果:
- 标签和概率是互斥的,使用soft max _ cross _ entropy _ with _ logits _ v2
- 标签是互斥的,但不是概率,使用sparse _ soft max _ cross _ entropy _ with _ logits
- 标签不是互斥的,使用sigmoid _ cross _ entropy _ with _ logits
结论
我希望这篇文章能帮助你以更有效的方式准备认证,重点放在什么是重要的。显然,只有认证是不够的,你实际上必须知道如何在实践中使用 GCP 的 ML。因此,一旦你获得了你的认证,我建议你尝试一些 Qwiklabs 或平台上的一些个人兼职项目,以获得实践经验(但我向你保证,准备好考试将会产生巨大的差异)。
如果你正在准备 GCP ML 工程师认证,你可能会发现阅读这篇关于特征工程的文章很有用:
你只需花 7 分钟就能读完整本书,最终,你会对特性工程的基础有一个清晰的理解,这真的能帮助你获得认证。
如果你想进一步讨论,请随时在 LinkedIn 上联系我,这将是我的荣幸(老实说)。
我如何通过 Python 将我的 PL SQL 程序发布为 REST API
关于 Python、基于令牌的身份验证和 REST API,您需要知道的一切
费尔南多·巴西在 Unsplash 上的照片
Sudha 是一名 IT 专业人员,在 SQL、PLSQL、数据库和 ERP 应用程序方面拥有数十年的经验。她一直享受着开发新应用程序和增强本地应用程序的生活。然而,它即将改变。
她的雇主正在将一些应用程序迁移到基于云的应用程序中。随着这种转变的进行,一些本地应用程序将不得不与基于云的应用程序进行近乎实时的交互。虽然有中间件可以使本地 API 与基于云的 REST API 进行交互,但 Sudha 在想,为什么她不能将本地机器上的经典程序发布为 REST API。
这可能发生在 Sudha 身上:应用程序开发人员或机器学习专业人员:参与集成不同的系统。
如果你有同样的困境,这篇文章是给你的。
在本文中,我将解释什么是 REST API,以及如何将一个经典的 PLSQL 程序转换成 REST API。虽然本文讨论的是 PLSQL 程序,但是这里解释的步骤和概念可以用于任何其他程序。
好吧,让我们从基础开始!
数据编码
你看过电影美丽心灵吗?
在这部电影中,主角解码了敌人的加密电讯信息。敌人发来的信息以这样一种方式被解码,它对任何非预期的接收者都没有任何意义。但是消息的预期接收者将知道破译它的算法,并从中获得真正的含义。
我们举个例子。考虑编码的消息是“Byoot fqtsbyq”。你能理解它的意思吗?除非您知道消息已经使用下面的映射表进行了编码。
(图片由作者提供)
现在你可以很容易地将信息解码为“你好兄弟”。
计算机在通信(以及安全存储数据)的同时,也使用特定的算法对数据进行编码。数据编码有以下优点
- 它保证了传输的安全性。
- 一些算法可以减小原始消息的大小。编码信息比原始信息小得多,易于传输。
代币
令牌是编码数据。基于令牌的安全在当代安全体系结构中非常流行。虽然有几种基于令牌的安全技术,但我将带您了解开放标准和流行的技术 Json Web Tokens (JWT)。
JWT 编码和解码数据的方式很有趣。但在我去之前,我想问你一个问题。
计算机使用预先定义的算法对数据进行编码。这些算法被很好地发表。如果黑客闯入通信网络并访问正在传输的令牌,他/她可以使用相同的算法解码令牌并改变令牌。计算机如何保护令牌?
你有什么建议?
好吧,这里有一个选项可以使这种基于令牌的通信变得安全。
- 包括用于对令牌内的数据进行编码的算法的名称:由于存在成千上万种公开的算法,所以不可能对令牌进行解码,除非你知道用于对令牌进行编码的算法,或者拥有尝试使用所有这些算法对令牌进行解码的超高速计算机。
- 添加签名:随着主要内容添加一个独特的签名。只有发送和接收计算机知道签名。这样,即使令牌被黑客攻击和更改,签名也不会匹配,接收方计算机将理解令牌被修改,并且不会处理数据。
这两个特点是 JWT 的关键因素。JWT 令牌包含三个部分。顾名思义,每个部分都包含 JSON 格式的数据。
- 头:头包含算法的名称和令牌类型的类型。
- 有效载荷:有效载荷包含要传输的数据。您可以在有效载荷部分自由添加想要传输的数据。
- 签名:此部分包含一个唯一的签名。在客户端和服务器通信的情况下,服务器向客户端分配唯一的签名并通知客户端。客户端必须将此签名添加到它发送给服务器的每个令牌中,否则,服务器将不会接受该令牌。
令牌还可以包含像到期时间这样的附加信息,这将使令牌在到期后无效。
基于令牌的通信
既然已经了解了令牌的基本知识,那么让我们来了解基于令牌的通信是如何在客户机和服务器之间发生的。
下图显示了客户端和服务器通过 JWT 进行通信的步骤。
客户端和服务器之间基于 JWT 的通信(图片由作者提供)
- 客户端通过用户 id、密码和任何其他此类身份验证机制来访问服务器。
- 服务器验证用户凭证。
- 服务器为通过身份验证的客户端创建一个带有特定签名(也称为密钥)的令牌。
- 服务器将令牌发送给客户端。
- 此后,客户机将令牌包含在对服务器的任何未来请求中。服务器在处理任何客户端请求之前验证令牌。
这是对客户机和服务器之间基于令牌的通信如何工作的高级描述。
让我们看看它现在工作。
上面的代码将创建一个 JWT 令牌
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJIZWxsbyBXb3JsZCBKV1QiOiJGaXJzdCBQYXlsb2FkIn0._Ah6WeQCLy2DwhzcBjv6tmT2aZNinZ2Ikxm_fe1ePFI
请注意,令牌由三部分组成,用“.”分隔如果你复制这个令牌并粘贴到 jwt.io 网站上的编码框中,它会将其解码为相同的消息。
jwt.io 上的 JWT 示例
注意,上面写着“无效签名”。键入 Secretkey123:此令牌的密钥和消息无效签名将被替换为已验证签名。
现在它说“签名验证”。这就是客户端和服务器之间通信的安全方式。
下面是解码相同编码令牌的 Python 代码。
REST API
既然您已经了解了基于令牌的通信是如何工作的,那么是时候了解 REST API 了。
和之前一样,我会从一个问题开始。你是怎么找到这篇文章的?
你在 Medium.com 找到的。这里 medium.com 是域名。你可以认为这是存储这篇文章的计算机的地址。如果你输入 www.medium.com/…和文章细节,你就会看到这篇文章。
在计算机之间的通信中发生了以下步骤。
- 您在计算机浏览器(客户端)上输入了网址。
- 当您的计算机连接到互联网时,调制解调器开始寻找具有www.medium.com域信息的计算机
- 您的计算机(客户端)连接到 medium.com 计算机(服务器),并在您的浏览器中打开请求的页面。
现在,假设你正在编写一个调用网址的程序,不是在浏览器中,而是直接在程序中。假设,你有一个 python 程序,你写 http://www.medium.com,程序直接连接到服务器(步骤 3)。
这就是表述性状态转移(REST)的工作方式。在这种情况下,服务器将只允许某些页面(例如/thisarticle)给某些经过身份验证的用户,甚至允许特定的经过身份验证的用户修改某些页面上的某些信息。
REST API 中通信的一个关键方面是方法。该方法可以被认为是指示通信目的的参数。
- GET:客户端正在从服务器获取信息。
- POST:客户端正在向服务器添加新数据。
- PUT:客户机正在修改服务器上的现有数据。
- 删除:客户端正在删除服务器上的现有数据。
让我们建造它!
既然您已经理解了基于令牌的身份验证和 REST API 的基础知识,那么是时候从 PLSQL 程序和 Python 开发 REST API 了。
如果你想了解 PLSQL、Oracle 数据库和 Python 是如何协同工作的,我推荐你阅读我下面的文章。
Python 和 Oracle 数据库。没有数据科学家能做到的组合… |作者 Sanjay Singh |走向数据科学
Python 有一个用于连接 Oracle 数据库的内置库 cx_Oracle。下面的代码片段显示了如何使用 cx_Oracle 库连接 Oracle 数据库。用您的数据库详细信息替换下面代码中的 userid、密码、主机、端口和服务名。
PLSQL 是 SQL 的过程扩展。我有一个简单的 PLSQL 函数 EMPFUNCT。它将年龄作为参数,并返回年龄大于所提供参数值的雇员人数。
可以通过数据库连接游标中的 callfunc 方法在 Python 应用程序中调用 PLSQL 程序,如下面的代码片段所示。
在上面的代码 PLSQL 函数中,使用参数值 20 调用 EMPFUNCT。它返回 21,表明 EMP 表包含 21 名年龄超过 20 岁的雇员。
如何发布这个和 REST API 一样的 PLSQL 函数?
cx_Oracle 库方便了 Python 程序与 Oracle 数据库及其对象如 PLSQL 程序的连接。然而,要将 PLSQL 程序发布为 REST API,需要将其公开为 web 服务器上的服务。
如果你想知道什么是网络服务,这里有一个来自维基百科的简短解释
web 服务是运行在计算机设备上的服务器,通过网络监听特定端口的请求,提供 Web 文档(HTML、JSON、XML、Images),并创建 Web 应用服务,用于解决 web (www、internet、HTTP)上的特定领域问题。
Python 有一个非常有用的框架 Flask,这是一个 web 服务开发框架。如果您使用的是 Anaconda 发行版,Flask 已经为您安装好了。
下面的代码片段展示了如何使用 Flask 框架将同一个 PLSQL 函数 EMPFUNCT 发布为 REST API。
执行上面的代码将显示下面的结果
如果你打开浏览器,输入http://127 . 0 . 0 . 1:5002/empageenq?empage=20 您将获得与调用参数值为 20 的 EMPFUNCT 函数相同的结果。
调用 REST API get 方法
现在,PLSQL 函数 FUNCT 被公开为 REST API,任何其他系统都可以像其他 REST API 一样调用它,只要它可以访问发布该 API 的系统,并且提供访问的方法之一是通过 Python JWT 令牌。
结论
一个 PLSQL 程序可以通过 Python 库 cx_Oracle 和 Flask 框架发布为 REST API。在本文中,我已经向您介绍了将简单的 PLSQL 程序发布为 REST API 的步骤,可以通过 GET 方法访问 REST API。使用相同的步骤,您还可以将 PLSQL 函数增强为 POST 和其他 REST API 方法。
期待大家的建议,也很乐意回答大家的问题。
参考文献:
JSON Web Token 教程及 Python-DEV 社区中的示例
REST API 101:什么是 REST API,它是如何工作的?|邮差博客
如何在 Python 中使用 API(初学者指南)【Python API 教程】(rapidapi.com)
通过四个简单步骤将机器学习模型部署为 REST API |迈向数据科学
通过四个简单步骤将机器学习模型部署为 REST API |迈向数据科学
我如何在第一次 Kaggle 比赛中名列前 25%
Boris Stefanik 在 Unsplash 上拍摄的照片
写这篇文章的动机
这篇文章中分享的学习是从我的第一次 Kaggle 比赛表格游乐场系列中排名前 25%(在 1728 名参与者中排名# 447)中收集的——2021 年 1 月。我的表现远远超出了我最初的预期。这是一个惊喜,因为 a)我 6 年前就停止了以写代码为生,b)从我开始学习数据科学的旅程到现在仅仅 5 个月。
这篇文章是我反思成功经验的结果。我想和其他早期的 Kaggle 人分享这些经验,这样你就可以提高你在 ka ggle 比赛中的表现。
关于你
我相信你会从中获益匪浅
另一方面,如果你正在寻找 Kaggle 竞赛入门的基础知识,我在这里找到了有用的资源。
提高高尔夫比赛成绩的四点建议
- 了解数据集
- 从一个简单的模型开始
- 到处学习。开放
- 运用科学方法
本文的其余部分包含了对这四个建议的详细解释,以及我在 2021 年 1 月的 Kaggle 竞赛表格游戏系列中的截图和代码片段。参加竞赛、下载数据集并在阅读过程中尝试代码片段会很有启发性。
建议 1:了解数据集
在 Kaggle 竞赛中取得成功的第一步是对数据集有一个很好的理解。需要注意的是,学习数据集的来龙去脉是一个持续的过程,当您尝试不同的模型时,您的知识会随着时间的推移而增加。然而,即使在训练第一个模型之前,执行某种形式的初步数据分析以了解您正在处理的数据仍然是至关重要的。
无需编写任何代码,理解数据集的最快方法是导航到 Data 选项卡。在这里,您可以看到哪些变量是连续的或分类的,查看每个变量的分布并研究数据描述(平均值、标准差、最小值、最大值等)。
Kaggle 竞赛空间中的数据选项卡。图片是来自 kaggle.com 的截图
无需编写任何代码,理解数据集的最快方法是导航到 Data 选项卡。
从这个数据集中可以看出以下三点
- 该数据集中的所有要素都是连续的
- 所有特征似乎都经过了最小-最大归一化,即最小值接近 0,最大值接近 1。由于特征已经被缩放,这将节省我们一些时间
- 特征 cont5 的分布非常向左倾斜。这可能有助于检查我们的性能在应用了一个能量转换(比如 Box-Cox 方法)之后是否有所提高
该数据集中的所有要素都是连续的。图片是来自 kaggle.com 的截图
特征 cont5 的分布向左倾斜。图片是来自 kaggle.com 的截图
理解数据集的更全面的方法是执行探索性数据分析(EDA)。有很多令人难以置信的资源,如这个、这个和这个深入研究这个主题。然而,利用 Kaggle 竞赛中的数据部分来获得对数据集的初步理解的方法,对于像我们这样的初学者来说,即使不是更好,也是同样好的第一步。这是因为数据部分已经包含了非常丰富的数据信息。
建议 2:从简单的模型开始
现在我们对数据集有了初步的了解,让我们来训练一个简单的模型。从简单模型开始有以下好处
- 更简单的模型更容易理解和解释
- 更简单的模型可以作为很好的基线模型。点击此处阅读更多关于基准模型的信息。当在后期阶段训练更复杂的模型时,我们可以确定相对于基线模型,增加的复杂性层是否会提高准确性
- 更简单的模型可以让我们省去超参数%20are%20derived%20via%20training.&text=Given%20these%20hyperparameters%2C%20the%20training,the%20parameters%20from%20the%20data.)调整的麻烦,而无需完全理解数据集的细微差别以及模型如何与之交互。更复杂的模型往往包含几个超参数选择。直接进入这些复杂模型的一个大挑战是,它很难(如果不是不可能的话)确定观察到的结果是由糟糕的模型选择还是次优超参数选择引起的
更简单的模型更容易理解,并作为良好的基线模型来更好地为自己定位。
以下部分包含两个简单的初步模型的详细信息——决策树和随机森林,在表格游乐场系列——2021 年 1 月数据集上训练。
简单模型#1:决策树
下面的部分训练了一个决策树,其停止标准为:最大叶子节点数= 4。它计算误差并可视化树。
from sklearn.tree import DecisionTreeRegressor#Creating a Decision tree -- with stopping criteria (max leaves = 4)m = DecisionTreeRegressor(max_leaf_nodes=4)
m.fit(X_train, y_train);#Creating a function to check the root mean squared error of the model (m_rmse)def r_mse(pred,y):
return round(math.sqrt(((pred-y)**2).mean()), 4)def m_rmse(m, xs, y):
return r_mse(m.predict(xs), y)
让我们打印均方根误差
print ("training error", m_rmse(m, X_train, y_train))
print ("test error", m_rmse(m, X_test, y_test))
作者图片
训练集上的 RMSE 误差是 0.728172。测试集上的误差是 0.725077。我们可以将此视为基线模型的性能。
让我们将决策树(我们的基线模型)可视化,以了解哪些列/特性是重要的
最大叶节点数= 4 的决策树。作者图片
从上面的树形图可以清楚地看出,cont3、cont2 和 cont7 是最重要的 3 个特性。
简单模型#2:随机森林
现在我们已经训练了一个基线模型,并且在测试集上建立了一个基线性能 0.725077,让我们进入一个稍微复杂一点的模型。在本节中,我们将训练一个随机森林模型。随机森林算法是一个集合或一组更小和不太精确的决策树。随机森林模型使用一种称为打包的技术来组合这些不太准确的决策树(也称为弱学习器)。fast . ai MOOC 的第 7 课对随机森林算法背后的概念和实现进行了出色而实用的深入探讨。
**在数据集上实现随机森林模型的预期行为:**由于随机森林是更复杂的模型,我们应该期望看到更低的错误,即相对于决策树模型而言,性能有所提高
from sklearn.ensemble import RandomForestRegressordef rf(xs, y, n_estimators=40, max_samples=50000,
max_features='sqrt', min_samples_leaf=5, **kwargs):
return RandomForestRegressor(n_jobs=-1, n_estimators=n_estimators,
max_samples=max_samples, max_features=max_features,
min_samples_leaf=min_samples_leaf, oob_score=True).fit(xs, y)mrf = rf(X_train, y_train)
现在让我们打印随机森林模型的均方根误差
作者图片
**观察到的行为:**我们注意到该模型的测试误差为 0.706288,低于决策树算法的测试误差(0.725077)。因此,我们观察到的行为与预期行为一致。
让我们想象一下随机森林模型认为重要的特性。
#visualising the importance of the features def rf_feat_importance(m, df):
return pd.DataFrame({'cols':df.columns, 'imp':m.feature_importances_}
).sort_values('imp', ascending=False)def plot_fi(fi):
return fi.plot('cols', 'imp', 'barh', figsize=(12,7), legend=False)plot_fi(fi[:14]);
按重要性排序的特征-随机森林算法。作者图片
有趣的是,随机森林和决策树算法一致认为 cont3 和 cont2 是最重要的两个特征。
建议三:处处学习,开放
在投入时间了解数据集并训练简单模型后,我们现在准备评估更复杂的模型在我们的数据集上的表现。
参加 Kaggle 竞赛最有收获的一个方面是有机会向其他参与者学习。代码和讨论部分(下面的截屏)提供了可能的解决方案的代码遍历和关于应该遵循什么方法的高级建议。它们是产生新想法的不可思议的资源,这些新想法是关于选择哪些模型以及哪些超参数选择是可用的。
Kaggle 竞赛空间中的代码和讨论部分。图片是来自 kaggle.com 的截图
讨论区的许多帖子都是由经验丰富的 Kagglers 和经验丰富的数据科学家撰写的。因此,阅读这些帖子并尝试解决方案将会给你的时间带来很好的投资回报。我发现非常有帮助的两个帖子是加布里埃尔·普雷达T4 的提高你排行榜位置的技巧和高拉夫·拉杰什·萨哈尼的用 LightGBM 详述 eda。后者是一个 Python 笔记本,可以在代码部分找到。它启发我在数据集上尝试 LightGBM 模型。
Kaggle 竞赛空间中的代码和讨论部分是产生新想法的极好资源,有助于决定接下来要尝试哪些模型
在尝试任何新模式之前,对其工作原理有一个初步的了解是有益的。一个对我很有用的方法是从官方文档开始阅读,直到它不再有意义。在这一点上,我会暂停阅读官方文档,尽可能多地阅读对概念和实现提供良好解释的文章。然后我会回到官方文档来完善我的理解。
现在,我们将在数据集上实现一个 LightGBM 模型。
**预期行为:**由于 LightGBM 模型比我们的基线决策树更复杂,我们应该可以看到通过 RMSE 误差测量的改进性能
import lightgbm as lgbLGB = lgb.LGBMRegressor(random_state=33, n_estimators=5000, min_data_per_group=5, boosting_type='gbdt',
num_leaves=246, max_dept=-1, learning_rate=0.005, subsample_for_bin=200000,
lambda_l1= 1.07e-05, lambda_l2= 2.05e-06, n_jobs=-1, cat_smooth=1.0,
importance_type='split', metric='rmse', min_child_samples=20, min_gain_to_split=0.0, feature_fraction=0.5,
bagging_freq=6, min_sum_hessian_in_leaf=0.001, min_data_in_leaf=100, bagging_fraction=0.80)m_LGB = LGB.fit(X_train, y_train)
让我们打印 LightGBM 模型的均方根误差
print ("training error", m_rmse(m_LGB, X_train, y_train))
print ("test error", m_rmse(m_LGB, X_test, y_test))
作者图片
**观察到的行为:**我们注意到 LightGBM 模型的测试误差为 0.694172,低于决策树算法的测试误差(0.725077)。因此,我们观察到的行为与预期行为一致。
让我们想象一下 LightGBM 模型认为重要的特性。
#view the importance of the featureslgb.plot_importance(m_LGB, ax=None, height=0.2, xlim=None, ylim=None,
title='Feature importance', xlabel='Feature importance', ylabel='Features',
importance_type='split', max_num_features=None,
ignore_zero=True, figsize=None, dpi=None, grid=True, precision=7)
作者图片
有趣的是,cont3 和 cont2 并不属于 LightGBM 模型的最重要特性。
这一部分的关键是,通过开放和从不同来源(如 Kaggle 论坛、官方文档和博客帖子)学习,你可以提高你在竞赛排行榜上的排名
建议 4:运用科学的方法
数据科学领域在不断发展。实现预期结果的方法可能有无数种。在这种情况下,当可能性无限时,很容易迷失在细节中,看不到主要目标,在我们的情况下,主要目标是提高我们在竞赛排行榜上的排名,同时增加我们的知识。解决这类歧义的一个有用方法是将科学方法应用到我们的工作中。我们从一个假设开始,对我们的模型进行测试以证明/否定它,得出结论并记录结果。需要注意的重要一点是一次测试一个假设。这将有助于我们更清楚地评估变革的影响。
下一节将进一步阐述这一点。我们将把科学方法应用于一个基于我们对 cont5 列的观察的假设。
假设:对特征 cont5 应用变换会提高我们模型的性能吗?
在这篇文章的前面,我们观察到 cont5 特性的分布非常偏向左边。一种可能性是数据的底层分布可能是正常的,但是为了帮助公开它,可能需要转换。
这是 box-cox 方法可能派上用场的一个领域。这是一种数据变换方法,可以执行一系列幂变换,如取观察值的对数或平方根,以使分布更正态。这是进一步阅读关于转换数据以符合正态分布的极好资源。
现在,我们将使用 box-cox 方法转换列 cont5,并将其用作 LightGBM 模型的一个特性。
**预期行为:**由于 Cont5 是 LightGBM 模型中第二重要的列,对其进行转换以使其分布更加正常可能会提高性能。
from scipy.stats import boxcoxtrain_df['cont5'] = boxcox(train_df['cont5'], 0)target = train_df.pop('target')X_train, X_test, y_train, y_test = train_test_split(train_df, target, train_size=0.80)#remove the id columns
X_train.pop('id')
X_test.pop('id')import lightgbm as lgbLGB = lgb.LGBMRegressor(random_state=33, n_estimators=5000, min_data_per_group=5, boosting_type='gbdt',
num_leaves=246, max_dept=-1, learning_rate=0.005, subsample_for_bin=200000,
lambda_l1= 1.07e-05, lambda_l2= 2.05e-06, n_jobs=-1, cat_smooth=1.0,
importance_type='split', metric='rmse', min_child_samples=20, min_gain_to_split=0.0, feature_fraction=0.5,
bagging_freq=6, min_sum_hessian_in_leaf=0.001, min_data_in_leaf=100, bagging_fraction=0.80)m_LGB_box_cox = LGB.fit(X_train, y_train)
让我们打印模型的均方根误差
作者图片
变换特征后的误差 cont5 为 0.695321。这略高于未变换的 LightGBM 模型的误差 cont5 (0.694172)。因此,我们可以得出结论,在列 cont5 上使用 box-cox 方法不会提高我们模型的性能。虽然这种方法没有提高我们模型的性能,但我们确实学到了一些有价值的新东西。
从这一部分学到的关键是,遵循科学方法将有助于我们保持纪律性,从而增加我们成功的几率。这种方法的关键原则是一次测试一个变化,以便我们可以清楚地评估我们的假设对性能的影响,从而评估我们在排行榜上的位置。
下面是我在比赛过程中跟踪进度的截图。我维护了一个电子表格,其中记录了所有的更改以及模型在训练和测试数据集上的性能。此外,我跟踪了提交后收到的分数。这有助于我保持在正确的轨道上,并清楚地评估什么有效,什么无效。
作者图片
我希望这篇文章对你有用。快乐的旅行!
代码和确认
你可以在这里查看的完整代码。
感谢萨米尔·马德哈万、萨普塔里什·达塔和达薇亚·约瑟夫的宝贵反馈。
与我联系
领英:https://www.linkedin.com/in/anandkumarravi/
GitHub:https://github.com/Anandravi87
推特:https://twitter.com/Anand_1187
我如何将 100 多个 ETL 重新设计到 ELT 数据管道中
提升您的数据管道!
作者图片
大家:数据工程师是做什么的?我:我们建造管道。
大家:你是说像水管工?
类似的东西,但不是水通过管道流动,数据通过我们的管道流动。
数据科学家构建模型,数据分析师向利益相关者传达数据。那么,我们需要数据工程师做什么?
他们不知道,没有数据工程师,模型甚至不会存在。不会有任何数据需要交流。数据工程师建立仓库和管道,让数据在组织中流动。我们把这些点联系起来。
数据工程师是 2019 年增长最快的工作,同比增长 50%,高于数据科学家的工作增长,达同比 32%。
因此,我在这里介绍数据工程师的一些日常任务。数据管道只是其中之一。
ETL/ELT 管道
ETL —提取、转换、加载
ELT —提取、加载、转换
这些是什么意思,它们之间有什么不同?
在数据管道世界里,有一个源和一个目的地。在最简单的形式中,源是数据工程师获取数据的地方,目的地是他们希望数据加载到的地方。
通常情况下,在这两者之间的某个地方需要对数据进行一些处理。这可能是由多种原因造成的,包括但不限于
- 数据存储类型的差异
- 数据的目的
- 数据治理/质量
数据工程师将数据处理称为转换。这是他们施展魔法将各种数据转换成他们想要的形式的地方。
在 ETL 数据管道中,数据工程师在将数据加载到目的地之前执行转换。如果表之间存在关系转换,那么这些转换发生在数据源内部。在我的例子中,来源是一个 Postgres 数据库。因此,我们在源中执行关系连接以获得所需的数据,然后将其加载到目标中。
在 ELT 数据管道中,数据工程师将数据加载到目的地 raw 中。
然后,它们在目的地内部执行任何关系转换。
在本文中,我们将讨论我是如何将我组织中的 100 多条 ETL 管道转换成 ELT 管道的,我们还将讨论我这样做的原因。
我是如何做到的
最初,管道是使用 Linux cron 作业运行的。Cron 作业就像传统的任务调度程序,它们使用 Linux 终端进行初始化。它们是最基本的编排节目的方式,没有任何功能,比如—
- 设置依赖关系
- 设置动态变量
- 建立联系
作者图片
这是第一件要做的事情,因为它引起了太多的问题。我们需要扩大规模。要做到这一点,我们必须建立一个适当的工作流程管理系统。
我们选择了阿帕奇气流。我都写在这里了。
气流最初是由 Airbnb 的家伙们创建的,开源的。它也被像 Twitter 这样受欢迎的公司用作他们的管道管理系统。你可以阅读上面所有关于气流的好处。
解决这个问题后,我们必须改变提取数据的方式。团队建议**将我们的 ETL 管道重新设计成 ELT 管道。**更多关于我们为什么后来这么做的信息。
作者图片
这是重新设计前的管道示例。我们处理的来源是一个 Postgres 数据库。因此,为了以预期的形式获得数据,我们必须在源数据库中执行连接。
Select
a.user_id,
b.country,
a.revenue
from transactions a
left join users b on
a.user_id = b.user_id
这是在源数据库中运行的查询。当然,我已经将示例简化为最简单的形式,实际查询超过 400 行 SQL。
查询结果保存在一个 CSV 文件中,然后上传到目的地,在我们的例子中是一个 Google Bigquery 数据库。这是它在阿帕奇气流中的样子—
这是 ETL 管道的一个简单例子。它按预期工作,但是团队已经意识到将其重新设计成 ELT 管道的好处。稍后会详细介绍。
作者图片
这是重新设计后的管道示例。观察桌子是如何被带到目的地的。在成功提取了所有的表之后,我们在目的地执行关系转换。
--transactions
Select
*
from transactions --
Select
*
from users
这是在源数据库中运行的查询。大多数提取都使用没有任何连接的“Select ”语句*。对于追加作业,我们包括 where 条件以正确分离数据。**
类似地,查询结果保存在 CSV 文件中,然后上传到 Google Bigquery 数据库。然后,我们通过**在 Apache Airflow 中设置依赖关系,为转换作业创建了一个单独的 dag。**这是为了确保在运行转换作业之前,所有提取作业都已完成。
我们使用**气流传感器设置相关性。**你可以在这里读到它们。
我为什么这么做
马库斯·温克勒在 Unsplash 上的照片
现在你已经理解了我是如何做到的,我们继续讨论为什么 —
为什么我们要将所有的 ETL 重新写入 ELT 管道?
费用
运行我们的旧管道耗费了我们团队的资源,特别是时间、精力和金钱。
为了理解事情的成本方面,你必须理解我们的源数据库(Postgres)是在 2008 年建立的一台古老的机器。它是在内部托管的。它还运行旧版本的 Postgres,这使得事情变得更加复杂。
直到最近几年,组织才意识到需要用于数据科学家和分析师的集中式数据仓库。这是他们开始在 cron jobs 上建立旧管道的时候。随着作业数量的增加,它耗尽了机器上的资源。
以前的数据分析师编写的 SQL 连接也随处可见。在一些管道中,单个查询中有超过 20 个连接,我们接近 100 多个管道。我们的任务在午夜开始运行,通常在下午 1-2 点结束,这相当于大约 **12 个多小时,**这是绝对不能接受的。
对于那些不知道的人来说,SQL 连接是需要运行的最耗费资源的命令之一。随着连接数量的增加,查询的运行时间会成倍增加。
作者图片
自从我们迁移到 Google Cloud,这个团队就明白 Google Bigquery 在计算 SQL 查询方面的速度非常快。你可以在这里 阅读所有关于它的 。
https://cloud.google.com/blog/products/bigquery/anatomy-of-a-bigquery-query
因此,关键是在源代码中只运行简单的“Select *”语句,并在 Google Cloud 上执行所有的连接。
这使得我们的数据管道的效率和速度提高了一倍多。
可量测性
昆腾·德格拉夫在 Unsplash 上的照片
随着企业规模的扩大,他们的工具和技术也在扩大。
通过迁移到谷歌云,我们可以轻松扩展我们的机器和管道,而不用太担心。
Google Cloud 利用云监控,这是一个收集 Google Cloud 技术(如 Google Cloud Composer、Dataflow、Bigquery 等)的指标、事件和元数据的工具。您可以监控各种数据点,包括但不限于—
- 虚拟机的成本
- 谷歌大查询中每个查询的成本
- Google Bigquery 中运行的每个查询的大小
- 数据管道的持续时间
这让我们的监控变得轻而易举。因此,通过在 Google Bigquery 上执行所有转换,我们能够在扩展时准确地监控查询大小、持续时间和成本。
即使我们增加我们的机器大小、数据仓库、数据管道等,我们也完全了解随之而来的成本和收益,并在需要时完全控制其开启和关闭。
这已经并将会使我们免除许多令人头痛的事情。
结论
费尔南多·巴西在 Unsplash 上拍摄的照片
如果你一直读到这里,你一定对数据情有独钟。
应该的!
我们已经做了 ETL 和 ELT。谁知道在未来我们会建造什么样的管道?
在这篇文章中,我们谈到了—
- 什么是 ELT/ETL 数据管道?
- 我如何重新设计 ETL 来实现 ELT 管道
- 我为什么这么做
像往常一样,我引用一句话作为结束。
数据是新的科学。大数据掌握着答案—彼得·盖尔辛格
订阅我的时事通讯,保持联系。
你也可以通过 我的链接 注册一个中等会员来支持我。你将能够从我和其他不可思议的作家那里读到无限量的故事!
我正在撰写更多关于数据行业的故事、文章和指南。你绝对可以期待更多这样的帖子。在此期间,你可以随时查看我的其他 文章 来暂时填补你对数据的饥渴。
感谢 的阅读!如果你想和我联系,请随时通过 nickmydata@gmail.com 联系我或者我的 LinkedIn 个人资料 。你也可以在我的Github中查看之前写的代码。
我如何加快我的功率 BI 报告 5 倍
你的 Power BI 报告很慢?检查如何通过应用一些简单的技巧来显著加快速度,同时保留原始的报告外观
你能看出下面两份报告的不同之处吗?
作者图片
是啊,我也不能!
但是,这两份报告有很大的不同!如果我告诉你右边的报告比左边的快 5 倍呢?你会相信我吗?没有吗?然后继续读下去,我会告诉你这怎么可能…
这一切是如何开始的…
我正在读 Chris Hamill 的一篇很棒的博文,他解释了如何在保持相同视觉效果的同时替换报告中的一些视觉效果。因此,我立即尝试将类似的技术应用到我之前创建的一个报告中。
您在上图左侧看到的报告页面显示了一些与客户支持中心绩效相关的数字。有一大堆与聊天、调查、电话、电子邮件等相关的指标。
然而,这个报告页面需要大量的时间来渲染和加载。罪魁祸首是大量的卡牌视觉效果(总共 21 张)。由于 Power BI 背后的公式引擎是单线程工作的,正如在这篇文章中详细解释的那样,对于每一个卡片视觉,一个新的查询正在生成,并且直到前一个查询完成后才能执行!
性能分析器捕获的时间最好地反映了这一点。Performance Analyzer 是 Power BI 中一个非常强大的内置特性,它让您能够很好地了解幕后发生的事情。您还可以使用外部工具来获取报告指标,比如 DAX Studio。
让我们打开性能分析器,看看在原始报告版本中到底发生了什么:
作者图片
这个报告页面花了 3 秒多的时间来渲染!对于不太大的数据量来说,这是不可接受的。让我们按总时间降序排列各个计时,看看是什么使我们的报告变慢:
作者图片
您可以看到,我们的两个显卡分别以 3238 和 3149 毫秒保持领先。然而,一旦我们展开来看这些数字的细节,我们可以注意到视觉的“其他”部分几乎占了总时间的 99%!
那个“其他”甚至是什么意思?!
“Other”显示了特定的 visual 在执行该 visual 的 DAX 查询之前必须在执行队列中等待多长时间!因为我的报告包含 30 多个视觉效果,其中 21 个是卡片视觉效果,所以其中一些必须等待其他人完成才能执行任何操作。
因此,DAX 查询在这里不是问题,正如您所看到的,这两个视图执行 DAX 查询只花了 4 毫秒。即使我按 DAX 查询对时间排序,我也能看到最长的 DAX 查询只用了 34 毫秒:
作者图片
优化报告
关注 Power BI 社区中所有伟大专家的博客并尽可能多地向他们学习是多么重要,这一点我怎么强调都不为过。
克里斯·哈米尔的博客给了我灵感,让我试图优化我的原始报告。出发点是试图减少我的报告页面上的视觉效果。因为我确认 DAX 查询不是问题,所以我的想法是减少“其他”计时。
用形状创建背景
我做的第一件事是从报告中删除我所有的形状(矩形等)。).你如何实现这一点?您可以简单地在 PowerPoint 中创建您的背景布局,并将其保存为图像!
作者图片
这是我在 PowerPoint 中创建的布局,用来“模仿”原始页面的外观。将其存储为图像:
作者图片
并将此图片作为您报告的背景图片!就这么简单!
作者图片
魔法来了…
现在最有趣的部分来了…我们如何替换现有的卡片视觉效果,同时保持原始版本的“外观和感觉”?
这就是克里斯的戏法登上舞台的地方。我只是把我的计算放在矩阵视觉中,用一个单独的矩阵视觉代替单独的卡片视觉。并且,经过一些调整和格式化,得到了(几乎)相同的报告外观!
您应该做的第一件事是将样式设置为“无”,删除列标题和行标题的轮廓,并关闭自动调整列宽:
作者图片
“格式”窗格下的“字段格式”属性中需要关键格式,您应该在其中设置适当的颜色、字体、字体大小等。按照原始报告的模式。
作者图片
您也不应该忘记拉伸单个矩阵字段,以取代它们在“卡片”形状中的位置。
系好安全带!
现在,让我们检查一下最重要的事情——不要忘记,我们开始整个过程是为了提高我们报告的性能。
因此,我将再次打开 Performance Analyzer,现在打开我修改后的报告,并检查指标:
作者图片
哦,我的天啊!我的报告中两个最慢的视觉效果现在需要大约 0.6 秒才能显示出来! 相比原版的 3 秒,快了 5 倍!!!
现在,你可以注意到“其他”计时从大约。3000 ms 到 300 以下!最后,我们的报告中的视觉效果的数量通过将它们移动到用 PowerPoint 创建的背景图像中而显著减少。
但是,这里的关键接管是:我们实际上没有改变报告的原始外观——我们只是显著地改进了底层流程!因此,对于我们的用户来说,一切都是一样的,只是他们现在会更快地看到数字!您知道当您的用户更快地获得结果时意味着什么——“用户会喜欢您”😃
结论
这里有两个主要的收购:
- 如果您的报告运行缓慢,有多种方法可以检查原因:使用 Performance Analyzer 或 DAX Studio 来确定是否可以应用一些额外的步骤来改进报告
- 关注 Power BI 专家的博客和视频。那里有太多的东西要学,你总能找到自己作品的灵感
最后一点:如果你需要对垂直放置的卡片视觉效果进行类似的改进, Chris Hamill 的博客也解释了如何实现这一点。
感谢阅读!
我如何教我的空调一些希伯来语
思想和理论
故事时间-不是你通常的“如何做”的文章
谁能想到空调能学会语言?(图片:pixabay.com)
这是我在教另一个神经网络如何绘画时的一个附带项目。我刚刚收到一个闪亮的新智能家居传感器作为礼物,承诺它应该在我下班或从健身房回来时打开我家的空调。
这是一个很棒的玩具,有一个非常时尚的应用程序可以从我的手机上控制它。但是我发现主要的缺点是我总是忘记在开车回家之前按下“开”按钮。作为一个懒惰的人,我从来不会在高速公路边停下来按那个按钮。所以我就在想:“如果我只是教那个空调识别我的语音呢”?
Sensibo IoT 传感器可以让你从手机上切换与空调有关的任何事情。(图片:截图,在合理使用下)
通过查阅这些 Sensibo 家伙的公开文档,我能够大致了解他们的传感器是如何工作的。当用户点击应用程序中的按钮时,手机会向远处的 Sensibo 服务器发送一个所谓的 HTTP 请求。当你想看最新的 Instagram 或在 YouTube 上发表新评论时,你的浏览器也会为你发送同样的信息。然后,服务器通过第二个 HTTP 请求命令传感器向空调发送匹配的命令,这是通过使用与遥控器中相同的红外线发射器来完成的。以上所有这些意味着我只需要编写自己的“按钮点击”应用程序,而不是等待我的手指点击,它会听我的声音来切换空调。
我开始设计一个能让我做到这一点的系统。过去一年练习机器学习让我明白,我要训练一个自己的模型。但我也需要手机上的那个模型。我不打算付钱给任何人把它存储在云中,并收取高昂的费用来访问它,所以投票很快就投给了本地部署的模型。问题是,我的手机是一个 5 年的老古董,即使在我买它的时候,它的硬件也被认为是薄弱的一面。所有那些在巨型 GPU 上运行的具有数十亿参数的新的花哨模型在这里都不会工作。我需要简单的东西。所以我开始阅读所有我能找到的文献。
事实证明,很大比例的语音识别模型会听用户说话,并尝试将语音分类为完整的单词。但是任何一种语言的单词量总是一个很大的数字。为什么不用更小的语音单位呢?我在想音素。音位是构成人类语言的最基本单位之一。每一个独特的声音都被认为是一个音素,不管你有多少种拼写方法。例如,英语估计有 171,000 个单词,但只有 42 个音素。
为了从这一点上跟随我,你需要知道一些数学知识。最后一段的意思是,如果一个模型想要对一个英语单词进行分类,输出层(分类层)需要至少 171,000 个不同的输出。想想权重矩阵的大小和输出向量的维数。如果用同样的模型来分类音素,这个数字会减少到 42。记住,简单的矩阵乘法的时间复杂度是 O(n3),想想音素分类器比单词分类器快多少。
接下来:似乎很多处理语音的模型更喜欢从频谱图中学习,而不是从原始音频中学习。最近有一些成功的模型在没有光谱图的情况下也能工作(例如,查看脸书的 wav2vec 2.0),但这些仍然是模型大小和推理时间的顶级优势。如果用户在空调做任何事情之前等了太久,他只会停好车,然后点击正常按钮。
本质上,频谱图是原始音频信号上的变换函数的结果,该变换函数创建矩阵,其中每个列向量表示原始信号的特定帧内的离散频率仓的幅度。如果上面这段话对你来说是中文(直到最近对我来说是),你不必太担心。当我们说话时,我们的声带振动空气产生声音。手机麦克风将这些振动转换为电振幅读数(振幅=我们刚才说话的声音有多大),并将其存储在一个数组中。创建一个光谱图将阵列转换成图像。为什么这对我们有好处?原始音频只给我们振幅,而频谱图也给我们信号的频率。更好的是——由于光谱图是矩阵,它们也可以显示为图像。这意味着我们可以使用图像处理领域的方法来分析我们的声音。整洁!
同一声谱图的三种不同振幅和音高的再现(图片由作者提供)
当涉及到机器学习时,这些方法中最重要的一种叫做卷积层。用于编写模型的现代编程库将它们分解成层。层就像乐高积木模型一样。卷积图层使用同名的数学运算(不完全相同,但很相似)来分析影像数据。它们的力量来自一种叫做“不变性”的数学属性。卷积对于图像特征的位置是不变的。这意味着无论我们试图预测或分析什么样的图像,它在图像中的位置对最终结果的影响都很小。卷积层可以找到一只狗,无论它位于图像中的什么位置。在我们的例子中,它可以找到一个音素,不管它在声谱图中的位置。
这对我们有好处,因为我们会找到所有的音素,但不是最好的,因为我们不知道它们的顺序。卷积对位置的不变性意味着它们不能有效地确定音素顺序,这使得“poultry”(pl-tri)和“triple”(tri-pl)可以有效地互换。为了克服这一点,我们用一种叫做“递归神经网络”的东西对卷积输出进行序列建模。递归神经网络(RNNs)通常要么读取一系列输入,要么产生一系列输出(有时两者都有)。它们的优势来自一个简洁的设计特征,即先前的输入影响下一个输出。这与标准神经网络形成对比,在标准神经网络中,每个输入独立于序列的其余部分。这一特点使他们在过去 35 年的研究中非常突出,显示出非常好的结果。
最近的研究试图将两者结合起来。当应用于这个项目时,它的工作方式如下:我们获取卷积层的输出,它是一个与输入频谱图维数相同的矩阵,并将其拆分为一系列列向量。每个列向量按顺序被馈送到 RNN 层,该层应该使用它们来以正确的顺序输出音素。结合卷积层和递归层的模型被称为卷积递归神经网络(CRNNs)。
还有其他一些构建模块用于构建模型,即注意模块、序列间 RNNs 和门控递归单元(GRUs),但这些实际上只是描述上述组件的更好实现的术语。如果你真的对它们感兴趣,你可以谷歌一下这些术语,这可能会为你提供大量的资源。这也是分享完整模型的地方,对于那些技术导向的人来说,可以通过以下链接获得一个 Google Collaboratory 笔记本:
对于那些没有打开 Colab 笔记本链接的人来说,这是模型的层图。(图片由作者提供)
既然我们已经设计了模型,我们需要训练它。问题是,希伯来语没有太多公开的语音数据。这就是音素再次派上用场的地方:即使在一个小的语音数据集中,我们将一种给定语言的每个单词记录一次,整个音素集将重复一百次。事实上,我们也许可以用一个足够小的数据集来工作,我们可以自己创建。
三天来,我在房子里走来走去,录下自己重复同样的语音命令,让周围的人都抓狂。对于我的研究来说,这已经足够了,尽管对于任何严肃的项目,你肯定希望一些朋友添加他们自己的录音(这有助于模型推广到未知的声音)。这产生了大约 45 分钟的音频,我按照发音(同一个文件中的相同单词)进行了分组,并相应地进行了标记。然后,我编写了一些代码,从文件中提取语音命令,将它们转换为频谱图,并将其分组为训练集和测试集。当添加一些背景噪声的频谱图(以教导模型将语音与静音分开)时,这产生了大约 3450 个用于训练的频谱图。如果你以前训练过一个模型,你会知道这不是很多数据。
然后是训练。我尝试了许多我认为很酷的增强,但最终只是降低了模型的准确率。最后,我只是在未扩充的数据集上训练了 1200 个时期,只花了不到半个小时。这意味着我可以快速尝试新的配置、数据集和超参数,并检查哪些最适合我。一旦我选择了我最喜欢的,我就计算科学家用来检查他们的模型是否健康的所有指标数据,一旦指标给我开了绿灯,我就开始编写移动应用程序。
检查指标是否正常对于模型的健康很重要。在这张图片中:一个称为混淆矩阵的度量,显示了模型在测试集中犯最多错误的地方。理想的混淆矩阵是全黑的,除了主对角线是全白的。(图片由作者提供)
如果你记得从这篇文章开始,我的手机是一个机器人。这意味着应用程序需要用 Java(或 Kotlin)编写。问题是,几乎整个数据科学生态系统都是围绕 Python 构建的。模型是用 python 写的,预处理管道是用 Python 写的,科学编程方法和线性代数例程是用 C 写的,带有 Python 包装器,所有的东西都是用 Python 写的——而这些在 Java 中都没有。
我不得不花数周时间从头开始写所有的东西。大多数程序员只会在 GitHub 或 Maven central 中搜寻别人编写的包和库。但是从我的经验来看,它们从来没有像你自己的代码那样运行得那么快,那么无缝。
我写的应用程序实际上只是一个语音激活的按钮应用程序。它通过手机的麦克风收听,检测语音,将其转换为声谱图,并通过模型转发。如果输出是可理解的,一个适当的 HTTP 请求将被发送到 Sensibo 服务器,然后激活我的物联网传感器,就像他们自己的应用程序一样。
在对本文描述的整个过程进行了大量的微调和一些技巧之后,我成功地将语音转换为音素的时间减少到了 1810 毫秒以下。在较新的手机(不是我的古董设备)上,预测时间要好得多(通常不到 1 秒),这对任何实际需要来说都绰绰有余。
所有的语音处理都是在本地进行的,这与普通的语音识别助手不同,后者会将你的声音发送到服务器并等待回答。而且真的管用!助手们从来不擅长识别我的声音,现在我终于有了一个专门为我调整的应用程序,用我的母语。最后,检查 APK 的细节(这是每个 Android 应用程序的文件扩展名),结果整个东西只有 35 MB 重,其中模型只有 1217 KB。多酷啊。
最终 APK 的文件组成。(图片由作者提供)
我的项目绝对只是一个展示,而不是一个商业化的产品。我认为在这个领域做一些进一步的研究会很好,因为我仍然有一些公开的问题想要回答。模型的伸缩性如何?你能教它多少不同的命令?一旦我们增加更多的扬声器,对准确度会有什么影响?还可以应用哪些巧妙的技巧来减少模型的内存和磁盘空间需求?有没有任何数据扩充可以用于这种模型,而不会显著损害实时准确率?在准确度损失太大而无法进行正确的语音识别之前,我们可以将训练集和测试集的大小减少多少?
许多问题要回答,还有许多工作要做。但是在过去的几个月里,和我的朋友开玩笑真的很有趣,我正忙着教我的空调说希伯来语:)
来自 Android 应用程序的截图(图片由作者提供)
欢迎在下面的评论中问我任何问题。如果你对所有无聊的细节感兴趣,实际上有一篇我写的研究论文和附带代码,你可以在那里查看。当然,如果你读到这里,感谢你阅读我的故事!
我如何自学 Tableau
Tableau 是一款世界一流的数据分析和可视化软件,让您轻松查看和理解您的数据。
我是一名质量分析师,后来成为了数据分析师。几年前,在组织的一次重组中,工作中出现了一个利用现有数据分析质量的机会,我不假思索地抓住了这个机会。
接下来我所知道的是,由于我作为测试人员的产品知识,我能够很好地使用一次性数据转储并在 Google sheets 中使用它构建仪表板。在看到我的进展后,我问我的主管我是否可以拥有 Tableau 许可证密钥和对我们组织的数据仓库的读取权限,以便我可以接触到公司中更广泛的受众,并标准化使用 google sheets 构建的仪表板。他同意了。
就在那里。我自学了如何编写合适的 SQL 查询来获取数据,并从 Tableau 仪表板开始。我记得我想在他们的网站上使用画面教程,顺便说一句,非常详细和有用,但是我从来没有找到专门的时间。
下面是一些实际上帮助我自学使用 Tableau 的数据可视化艺术的东西。
1。使用可用/预先存在的 Tableau 仪表盘
在尝试使用现有仪表板进行分析时,我经常需要理解底层数据并添加新的过滤器来进一步剖析趋势。所以,我从服务器上下载了一份拷贝,试图理解原作者是如何组织它的。
这确实有助于我理解计算字段、筛选器类型和显示筛选器的不同选项。
如果您没有访问任何仪表板的权限,您可以通过从 Tableau Public 下载仪表板来实现这一点(稍后将详细介绍)。
2.Tableau 在线社区
每当我想用我不知道的数据做一些事情,无论是混合不同的来源,使用选择性过滤器,动作过滤器,LOD 表达式,我都在 Tableau 论坛上搜索。我会说我总能找到那个问题。因此,要么我会使用答案来了解如何做我想要做的事情,要么我会知道它不被支持,以及实现类似结果的变通办法。我在论坛上问过问题,论坛上的人真的很有帮助。以下是社区论坛的链接:
3.实践
当时我参与了一项相当激烈的活动,每周与首席执行官和副总裁开会,介绍我的发现。由于我还不知道任何其他分析数据的方法,我尝试了很多东西。我指的是很多。有时,即使在今天,当我看着那时候的旧仪表板时,我也会印象深刻。当然,所有东西都在 NDA 名下,所以我不能在网上任何地方发表,但这仍然让我感到自豪。
4.Tableau 公共
最初的几个月后,我迷上了 Tableau。我喜欢用交互式数据可视化来讲故事。因此,我一直在寻找新的和酷的方法来可视化数据。Tableau 有一个公共画廊,来自世界各地的作家在这里发表他们的作品。这是一个学习使用 tableau 可以完成什么的好方法。我仍然记得第一个让我惊讶并激起我好奇心的是《泰坦尼克号》中的克里斯·洛夫。这是,即。
还有很多更棒的可视化技术。你可以在这里关注那些定期发表作品的作者,并向专家们学习这门手艺。
5.舞台表演比赛
从公众画廊中的一个 viz 下的演职员表中,我开始了解改头换面星期一。这是一个由 vizwiz 组织的竞赛,你得到一个数据集,你需要构建可视化来发现洞见。全球各地的人们都参与其中,你会看到很多可以从中获得灵感的作品。
6.其他资源
有一个叫#datafam 的 Twitter 群组句柄。这个组合太棒了。你一定要跟随他们来获取你每天的灵感,并了解数据可视化世界中正在发生的事情。
VizWiz 的创始人 Andy Kriebel 也有一个 youtube 频道,他在那里发布视频来提高你在 tableau 的职业生涯。你可以关注他的 youtube 频道了解更多信息。
https://www.youtube.com/c/AndyKriebel/featured
我希望这些信息有助于你学习 Tableau,并有一天成为一名数据分析师。
感谢阅读,快乐学习!
如果你喜欢你刚刚读到的,请看看我的其他文章。也可以考虑在Twitter或者 T ableau 公众 上关注我。
我是如何过渡到数据科学的&在一次数据科学职位面试中获得了纽约时报、Capital One、Linkedin、Twitter、脸书、埃森哲、政治和其他人的关注。
办公时间
在 Unsplash 上由Christina @ wocintechchat.com拍摄的照片
在我上面提到的公司中,我和每家公司的招聘人员都进行了交谈,其中一半的公司我进行了编码练习,这意味着我和招聘经理进行了面试,还有一些公司进入了最后一轮面试。在获得数据科学硕士学位后,在所有这些面试之后,我得到了两份工作邀请,并获得了大幅加薪。自从我作为 Python 初学者在 上写了我的第一篇中型博客文章以来,已经过去了 3.5 年,我从哪里开始 ?尽管我知道我的学习永远不会停止,有时我觉得我还有很多要走,但回头看看我在过去的 3.5 年里走了多远还是很好的。我决定写一写过去几年的事情,以举例说明我是如何从营销职业过渡到数据科学的。
当你阅读这篇文章时,请记住这是我的旅程,不是每个人看起来都一样,但希望这将帮助任何试图向数据科学过渡的人。你不必做我做的每一件事,但我希望这有助于描绘一幅画面,或激励你做一些能帮助你脱颖而出的事情。我将坚持两个主题,而不是步骤:可信度和曝光度。他们也可以按顺序进行,因为我发现,一旦你建立了一些信誉,你就更有信心建立关系网,并从那里开始创造(甚至被要求这样做)一些曝光。
可信度
人们会雇用你,要么是因为你已经完成了类似的任务,要么是因为你有能力和理解力快速学习完成规定的任务。在我的职业生涯中,有几次我被聘用到一个我从未做过的领域工作,但由于我的分析思维和快速学习能力,我得到了信任。但是,有一些经验会让你脱颖而出。我说的不是在一些荒谬的职位描述中看到的一些入门级职位所需的 5-10 年经验。如果你能展示出你有能力完成这些任务,即使你需要一些指导或脱离以前的例子,这对公司来说是非常有吸引力的。然而,有些公司需要的不仅仅是这些。在数据科学中,我们应该在建立一些可信度之后才肩负起解释、编码和咨询的责任,如果不是的话就叫 与统计数字 (这是一本书)。数据科学角色旨在帮助解决复杂的问题,这些问题有时(如果不是一直)会对公司及其客户产生一些财务影响,而我们这些数据科学家有责任确保我们向公司和数据本身提出正确的问题。
我做了以下几件事来建立一些可信度:
- 编码训练营:我在 2018 年的大会上做了一个数据科学训练营,我所在的创业公司同意支付一半的费用。我认为这激发了他们开始他们的职业发展预算,因为在他们为自己的职业发展提供 1000 美元后不久。如果你的公司能为此买单,那就太好了!我知道不是每个人都有能力自己支付,特别是在开始的时候,学生贷款是我们国家的一种疾病……这就引出了我的第二点,如果你有能力的话:
- 一些课程作业,甚至可能是文凭。我今年完成了数据科学硕士学位,这对建立信誉和建立关系网有很大帮助。如果你负担不起重返学校的费用,我会在社区大学上一些课,或者在 Coursera 或 Udemy 上一些课程,这些课程更便宜,更偏远,而且可以自定进度。钱可能是一个障碍,但你必须利用你所拥有的,图书馆的书是免费的。在学校,他们会教你你编写的模型背后的理论和数学,而我发现这些在新兵训练营里是没有的。显然,新兵训练营可以更短,更便宜,你必须投入更多的时间去读研。最后,如果你知道模型背后的数学,你可以很容易地解释为什么使用数学来展示支持向量机可以处理数据中的异常值,而逻辑回归却不能。这就是我回到学校的原因,我想了解黑匣子在做什么,并能够评估输出,而不是猜测为什么 KNN 在较小的数据和大量 K 邻居的情况下表现如此糟糕,因为维数灾难。或者为什么线性回归是一个非常有偏差的模型,我应该在大多数情况下用它来进行推断而不是预测。
- 认证。我是 AWS 机器学习认证的。在公司,我现在他们给人们一点小奖励,并支付参加认证考试的费用。
- 一份书面记录。或者在这种情况下是数字文件记录。我三年前开始写作,我不像我的数据科学朋友 Nicole 那样经常发表文章,并且在媒体上有超过 1K 的追随者。然而,在上面提到的其中一家公司的一次面试中,招聘经理说他读了我关于评估 NLG 推文的马尔可夫模型与 GPT-2 模型的博文,他们很高兴能采访我。这不是一个采访,但也展示了如何写在媒体上让许多人找到你的工作,甚至通过谷歌搜索。当我使用 Google Sheets API 时,一位 Google 产品经理在阅读了我的一篇早期博客文章后,想和我谈谈。现在,在写了几篇文章后,与其他文章相比并不多,但我有几篇文章定期从谷歌获得 SEO 流量,并有超过 5000 的浏览量。
- 创造。我记得在阿里·斯皮特尔的博客中的一篇博文上看到了布鲁姆的分类学链接。她是我尊敬的人,也是我学习的最佳参考。就像在布鲁姆的分类法中,她应用了许多更高的支柱来达到知识。她不断地创造,这是学习的最高形式。当我在纠结一个新概念的时候,我会努力记住这个框架。在研究生院,我会做笔记,为金字塔底部的考试制作抽认卡,但是我的项目和交付成果帮助我进入了金字塔的中间。有时我会创造一些东西来展示我对手头问题的理解程度。无论是一篇研究论文,一个编码笔记本,甚至是建立一个模型并评估它,都帮助我获得了关于我的领域的知识。我强烈推荐在你的 Github 上展示你创造甚至评估的东西。我有几个项目和代码,但我在 2021 年剩下的时间里的主要目标是有几个带有适当文档和可再现性的编码项目。
范德比尔特大学教学中心的照片https://CFT . Vanderbilt . edu/guides-sub-pages/blooms-taxonomy/
- Linkedin 个人资料上的关键词。显然,你不应该在 Linkedin 上谎报你的技能,但你必须聪明地选择词汇。在阅读了一些工作描述后,你可能会有一个想法,如果你试图区分自己是数据科学家还是数据工程师,你会使用像建模评估还是数据管道这样的东西。作为一名数据科学家,你可能被期望做一些数据工程,但是如果你想要专注于数据科学的角色,你希望使用比 ETL 更多的数据科学关键词。参见我在 上的帖子,你应该在数据科学面试中问他们的问题 才能知道区别。随着数据科学行业开始发展,一些角色,如机器学习工程师与数据科学家重叠。特别是如果一个公司使用 Auto ML,他们可能只需要一个懂一点统计学和数学的软件工程师来做数据科学。
一旦我开始从我投入的工作中,从阅读文章、书籍和上学中,对自己的可信度有了一点信心;我准备开始做一些曝光。
- 口语/教学。*古训,谓那些不能的人;“,*教显然是错误的。为了教会你必须知道你在做什么。没有人指望你成为任何方面的专家,但是如果你能教别人你所学的东西,不仅能巩固知识,还能帮助缓解骗子综合症。我记得当我学习所有不同的 Python 或 R 包时,如使用 Pandas 或 DPLYR 进行数据挖掘和转换,或使用 Matplotlib/Seaborn/gg plot/Plotly 进行可视化(有如此多的数据 viz 库和现在的交互式仪表板,如 Bokeh、Dash 和 Shiny),web 抓取(Beautiful Soup 或 Rvest),这一切都感觉势不可挡。为了加强我的学习,我会立即报名参加一个编写 Python 代码的女性聚会,并自愿去教书。这包括创建一个 PowerPoint 和代码,让其他人亲自跟随和调试。我还必须用语言引导人们。这对我的冒名顶替综合症真的很有帮助,这是我写的第一批帖子之一。几年后,我仍在苦苦挣扎,我知道很多有才华的人,比如高端公司的数据科学经理,比如我面试过的那些公司,有时也很痛苦。
- 推荐。我的一份兼职数据科学工作来自一份给招聘经理的推荐信。推荐人是我志愿教授编码社区的一个人。这让我想到了你为获得曝光率而做的下一件事,每个人都喜欢的词;网络。在你们一起工作或保持联系后,人际关系网可以让你获得推荐。在我工作过的这家初创公司,高管团队在招聘过程中是透明的,尽管推荐人约占招聘来源的 10%,但他们至少占他们提供的人员的 1/3。在 Capital One,他们每天收到数百份申请,直到一位老同事向我推荐,一位招聘人员才伸出手来开始面试(我很高兴地告诉大家,我进入了最后一轮,那是一场历时 5 小时的艰苦面试;最后,它没有工作,但我认为这是最好的。
- 出版物。这有点难以实现,所以这不是一个要求,但它不仅有助于建立信誉,而且有利于曝光,因为有时你在会议上介绍你的工作,如果你的工作很好,许多人会传阅你的工作。我目前正试图发表一些我在研究生院期间作为研究助理所做的工作。
- 成为一个机构的董事会成员或研究员。我两者都是;我的研究生院要求我成为一名数据科学研究员,最近我被邀请加入一个我非常珍视的组织的董事会,该组织鼓励女孩在年轻时编写代码,名为布尔女孩。
我希望这有助于任何考虑过渡到数据科学的人,甚至有助于过渡到不同职业的框架。有哪些相似之处或你做的不同之处?
我如何使用人工智能来帮助我朋友的 YouTube 频道
利用深度学习优化 YouTube 缩略图
最近,我有机会拜访了迈克尔·彭斯瑞克和他的家人。这让我开发了一个优化 YouTube 缩略图的人工智能工具,目标是超越 YouTube 算法。
关于这是如何发生的,迈克尔经营着一个非常成功的 YouTube 频道,名为自己动手,跟踪他的家人和朋友在城堡和园丁小屋的翻新进展。迈克尔邀请我去帮助装修,作为回报,他们会让我住在城堡的一个房间里。这是一次不可思议的经历,我非常感谢迈克尔邀请我和他的家人作为如此伟大的东道主,我想尽我所能帮助他们。这激励我尝试将我的数据科学背景应用到 Michael 的 YouTube 频道中。他很友好地与我分享了他的分析数据,我最终深入研究了他的渠道覆盖范围、参与度和受众统计数据。
这个过程涉及到对 YouTube 算法的大量研究,它是如何工作的,以及它如何与迈克尔的内容和他的订户群进行交互。YouTube 已经创建了一个由内容创作者组成的复杂生态系统和一个先进的推荐系统,所以我知道我很难为迈克尔的频道增加价值,因为他已经是自己内容和 25 万订户感兴趣的内容的专家。
【https://www.youtube.com/c/DoingItOurselvesOfficial
尽管如此,我还是想试着提供一些建议,虽然我不会涵盖我在这个过程中发现的所有细节,但我想谈谈要点;这涉及到 YouTube 算法的总体特征,以及我通过评估迈克尔的 YouTube 分析学到的一些更好的细节。最后,我将谈谈这是如何导致我提到的人工智能工具的发展的。
众所周知,YouTube 视频成功的主要衡量标准是浏览量。作为一名数据科学家,我喜欢优化单值指标,因为这让我更容易专注于一个非常复杂的问题。我们所要做的就是探索影响视图计数的不同变量。
首先,我想看看流量来源数据;观众从哪里来?对我来说,作为一个小型内容创作者,我的频道mindoftata有一个关于用人工智能制作音乐的相对流行的视频,标题中有一个知名的开源软件,大约 66%的观看次数是由搜索该软件的人驱动的,即 YouTube 搜索。然而,对于像迈克尔这样已经建立了订户基础的内容创作者来说,他的大多数观点将来自“浏览功能”类别,在那里他的新视频会出现在人们的主页上。这将主要包括他的订户,但也可以包括过去喜欢过他的内容或类似内容的其他人。
mindoftataYouTube Analytics。图片作者。
因为这是最大的一个类别,所以我想集中我的大部分精力。它也回答了我们第一个关于如何获得更多浏览量的问题:获得更多浏览量的方法是让 YouTube 在主页上向更多人展示你的视频。只要你有一个适度有趣的缩略图和标题,那么凭借 YouTube 上的大量用户,一些人最终会点击它。这让我们把研究问题缩小到:
我们如何说服 YouTube 算法向更多人展示一个视频?
这让事情变得有点复杂。这相当于问 YouTube 的算法是如何工作的,有很多人已经花了很多时间来弄清楚这个问题。关于算法的复杂性和它是如何工作的,整本书都可以被创作出来,但是我想对这个据我所知还没有被探索的领域做出独特的贡献。因此,我将进一步缩小研究问题的范围,并专注于算法的一个特定方面:印象点击率。那么是什么说服一个人去点击一个特定的视频呢?这是 YouTube 成功的一个必不可少的要素,因为拥有高点击率只是算法用来确定一个视频是否好,是否值得推送给更多人的因素之一(显然,以平均观看时长衡量的内容质量也是一个重要的指标)。点击率还具有几乎完全取决于 6 个因素的优势:
- 缩略图
- 标题
- 视频长度
- 视图的数量
- 这段视频是最近发布的
- 人们对频道内容和质量的现有看法
这些功能作为一个整体构成了一个相当复杂的变量集,使其不可能优化,但我们可以专注于这些变量中的一个,这最终给了我我的人工智能项目的想法…在这一点上,缩略图是说服某人点击视频的主要因素,这是相当普遍的知识。大红色箭头、圆圈、人脸、重叠文本以及缩略图中引人入胜的内容描述等特征都对人们是否决定点击视频产生了巨大影响。我还想到,神经网络可以识别所有这些特征,我既有缩略图,也有来自迈克尔 YouTube analytics 的印象点击率数据,所以我为什么不建立一个工具,将迈克尔的缩略图作为输入,并学习预测点击率?这样一个项目的结果将是一个模型,可以区分具有高“可点击性”和低“可点击性”的缩略图。
所以我开始研究这个模型。我从“自己动手”频道的页面上抓取了 YouTube 的缩略图,并确保图像标题被恰当地标注,这样我就可以将它们映射到 YouTube analytics 的点击率上。
我发现的第一件事是因为我开始使用主分析页面的平均点击率,但我注意到许多迈克尔最受欢迎的视频的点击率实际上低于预期。所以我调查了一下,结果发现如果一个视频的点击率很高,那么 YouTube 算法就更有可能更大力地推送该视频,直到该视频达到向所有对其感兴趣的人显示的饱和点,点击率开始下降。在这一点上,该算法决定向人们推荐更多相关的视频。所以实际上,我最终调出了点击率时间序列数据,并分离出峰值率,这通常发生在视频发布的第一天或前几天。
YouTube 分析点进时间序列。图片作者。
使用 FastAI,我编写了一个模型,仅从缩略图预测峰值点击率;我没有在模型中加入任何其他变量,部分原因是我想保持它作为一个简单的概念证明,但也因为用有限的数据训练一个关于标题“可点击性”的模型是困难的。即使是缩略图,在我的模型开始识别“可点击”的特征和误差达到合理水平之前,我必须在 20 个时期内进行训练。这意味着模型建成后将大量修改,特别是做自己风格的缩略图。
我把误差降到了 2.90%,考虑到平均峰值点击率约为 12%正负 5%的标准差,这似乎相当不错,而且我也没有纳入标题数据或其他因素。这个错误百分比也来自验证集,因为数据有限,我无法保留一个重要的测试集。然而,我在迈克尔最近的几幅缩略图上测试了这个模型,到目前为止,它似乎对峰值点击率给出了相当可靠的预测。在让这个模型达到一个相当不错的程度后,我围绕它建立了 widget 应用程序功能,并通过 Heroku 发布了一个公共版本。所以你可以在这里查看这个应用程序:http://thumbnailpredict.herokuapp.com/如果你有兴趣的话。
最好的情况是,这个工具可以给一些人一点优势,让他们了解如何开发“可点击”的缩略图。如果您正在为一个视频的两个或多个缩略图争论不休,它会特别有帮助。它肯定不会神奇地为你制作一个伟大的缩略图,或者一个伟大的标题。我认为这种人工智能应用程序可以观看你的内容,并开发出一个会引起很多关注的缩略图和标题,这是完全可行的,但需要几个月的时间来开发,并需要访问更多的 YouTube 数据。
在这个过程中,我学到了一些非常重要的东西;缩略图和标题确实很重要,但是一个好的缩略图和一个普通的缩略图之间的差异(假设你仍然准确地表示了内容)在视图中占大约 25%的差异。显然,这个值的范围很大,只是一个粗略的估计,但关键是,尽管 25%的浏览量差异非常显著,但它表明 YouTube 增长的秘密不只是一个好的缩略图和标题那么简单。事实上,从我的研究来看,潜在的最关键因素是人们对频道的看法和内容的质量。这绝不是一个简单的理解和预测的指标。这需要对 YouTube 生态系统有相当的了解;营销、媒体、粉丝参与,以及其他各种未提及的有助于 YouTube 增长的因素。
[1]:迈克尔·彭斯瑞克(2021 年 11 月)。 自己动手 YouTube Analytics。
释放数据的力量,找到完美的度假目的地
使用数据分析的力量来决定你下一步要去哪里旅行!
由 Unsplash 上的 Karsten Winegeart 拍摄
有了 COVID 疫苗和更好的卫生措施,事情在大多数方面都开始“恢复正常”,各国都在大力投资旅游部门的激励措施,特别是在欧洲部分地区,疫情的控制力略强一些。
虽然个人安全和健康是最重要的,但很快就能回去旅行和参观新的地方将是令人惊讶的。所以,如果你像我一样喜欢旅行和数据分析,留下来,我会告诉你我如何使用天气数据来决定我的下一个旅行目的地,剧透一下,这应该是一个温暖而美丽的地方。让我们开始吧!
我是如何做到的
我尝试应用我在所有数据分析过程中使用的大致相同的方法,特别是对于面向地理的数据,并且可以自由地做我想做的事情,因为没有一个假设要测试,也没有一个类要预测。当然,这不是一个严格的项目,团队或公司依赖于它的结果,但仍然,设定清晰的目标并使用领域的知识来获得有用的结果是很好的。
至于我们将使用的数据,如你所知,天气可以定义你享受休闲旅行的程度虽然完美天气的定义可能因你问的人而异,但温和的气温和无雨无雾构成了享受那些渴望已久的假期的完美环境。我将使用 R 和 GSODR 包,它从世界各地的气象站检索天气每日数据。
这个项目有 5 个主要阶段:
- 缩小区域范围,获取数据
- 缩小日期范围,过滤数据
- 定义标准
- 可视化和比较地点
- 显示结果并选择一个或多个地点
做完这些,剩下的唯一一步就是打包行李走人了!😎
- 该地区
我当时就知道我想去意大利,所以把范围缩小到一个国家既简单又有用。作为十九世纪去巴西的意大利人的后裔。对许多令人惊奇的地方做一点研究,可能会发现我有足够的理由。因此,意大利,我们走吧!
但不要这么快,让我们先检查我们的可用数据。我们的数据中有 308 个气象站,遍布意大利。这是一件很棒的事情,有更多的数据来找到完美的地点。
意大利的全天候气象站[图片由作者提供]
并不是所有的站点都有当前的数据,我们只想要最近的信息来确定最佳的观赏地点——你知道,气候变化是一个问题,所以旧的数据可能会与最近几年的数据非常不同。
Obs:有很多方法可以找到离某个城市或景点最近的气象站,比如说,可以同时比较巴塞罗那、罗马、巴黎和米兰的天气。做起来很简单。
2.日期
你可能有一周的假期,你可能在一家廉价航空公司找到了很多机票,或者你在日期范围上有一些灵活性。下一个合乎逻辑的步骤是过滤您获得的历史数据,这些数据完全基于您可用的天数或周数,以便更好地了解过去几年的天气情况。
我的日期现在相当灵活,所以我决定检查 10 月的整个月。该月的一小部分数据如下所示:
获得的数据中最感兴趣的字段的快照[图片由作者提供]
我们将使用这些字段来确定好天气的感觉:
- PRCP:那天的降雨量
- I_FOG: "1 "如果当天有雾
- 最低和最高:最低和最高温度
3.对你来说好天气是什么感觉?
通过风、温度、雾、雨和雪等属性,我们可以使用大量因素来确定天气最适宜的城市。在这里做自己的事,选择自己最喜欢的。我有四个条件:
- 无雨
- 没有雾
- 最低气温超过 10 摄氏度
- 最高温度可达 30 摄氏度。
4.比较和分析位置
根据上面的标准,让我们根据 Belokurows 系数,找出拥有最佳天气天数最多的城市(气象站)。😅
天气最好的意大利城市[图片由作者提供]
上表中的数字显示了过去 10 月 3 个月中平均满足每个条件的天数。根据我的标准,这些是过去 3 年里 10 月份天气最好的 10 个城市。在意大利地图上绘制城市,我们得到这样的结果:
根据我的看法,意大利十大天气城市[图片由作者提供]
不足为奇的是,大多数城市都位于沿海,而且更靠南,靠近巴里、巴勒莫和那不勒斯等天堂般的地方。
5.选择最佳城市
根据汇总的数据和前 10 名的排名,我选择了周围基础设施良好的城市,即靠近大城市的城市,这意味着更实惠的住宿地点和交通方式。较小的夏卡、克罗托内、卡坦扎罗、安科纳和格罗塔格里被过滤掉了,然后我会仔细看看另外 5 个。
看看巴勒莫、巴里和迪森萨诺,这里的气温变化很大,尤其是巴勒莫的高温和迪森萨诺的低温。
三个城市十月的天气[图片由作者提供]
虽然所有进入前十的城市都很棒,但很难找到不喜欢左边两个城市(车站)及其周围地区的地方。
天气最好的两个城市[图片由作者提供]
Civitavecchia 是我分析得最透彻的城市中天气最稳定的城市,虽然它主要是作为一个邮轮港口,但它有博物馆、一座 16 世纪的堡垒和令人惊叹的古代遗迹可供参观。它靠近罗马也没有坏处,这使它成为那些通过意大利首都到达意大利的人的一个好去处。
现在,女士们,先生们,我敢说你有任何关于 T2 卡普里岛 T3 的坏话。这是一个因其高档酒店和购物而闻名于世的岛屿,更棒的是,它还有铁蓝色的海水和崎岖的地貌(见下图)。我想对于像我这样预算紧张的人来说,住在这里可能有点贵(更不用说破产的 AF 了),但它周围的那不勒斯地区肯定会提供更多实惠的选择和许多值得一看的好地方。
希望你喜欢这篇文章。我很快会在 Github 上分享代码和数据,如果你有任何问题,请告诉我。
到目前为止,我是如何(不正确地)使用朴素贝叶斯的——第 1 部分
这篇文章旨在帮助你更好地理解朴素贝叶斯。
图片和编辑归我姐姐(https://www.instagram.com/the_snap_artistry/)
就像朴素贝叶斯做了一个天真的假设,我们给模型的特征是独立的,我也做了几个关于 NB 如何工作的天真假设。
- 我假设多项式函数适用于任何给定的数据。(无论我有什么数据,我都用这个)→ 在下面的帖子中详细解释了为什么这是一个不好的做法。
- 高斯朴素贝叶斯假设特征是高斯的。→ 不假设特征为高斯分布,而是假设似然概率遵循高斯分布。
- 在多项式和分类中,似然概率的计算是相同的。在多项式中,分母是特定类别中的单词总数,而在分类中,分母是特定类别中数据点的总数。
- 用 python 从头开始实现朴素贝叶斯非常困难。→ 实现多项式朴素贝叶斯只需要 15 行代码。
以下是据我所知的事情,可以让你深入了解朴素贝叶斯:
如果你是朴素贝叶斯的新手或者想要快速复习,请查看我的笔记开始。
1。为什么在朴素贝叶斯中我们假设特征是条件独立的?
②。Sklearn 有 GaussianNB,MultinomialNB,CategoricalNB,BernoulliNB →给定的数据有类别,数值,二元特征你会选择哪个模型?**
3。如何对文本数据从头实现多项式朴素贝叶斯,并用 Sklearn MultinomialNB 匹配结果?
4。如何对分类数据从头实现分类朴素贝叶斯,并用 Sklearn CategoricalNB 匹配结果?
5.如何对数值型数据从零开始实现高斯朴素贝叶斯,并用 Sklearn GaussianNB 匹配结果?
6。朴素贝叶斯的训练和测试→时间和空间复杂度有哪些?
7。朴素贝叶斯是否受到不平衡数据的影响,如果是,如何解决?
8。离群值是如何影响朴素贝叶斯的?
9。朴素贝叶斯可解释吗,我们能说出哪些特征帮助我们预测了一个特定的类吗?
10.朴素贝叶斯是线性分类器吗,它能解决非线性的决策边界吗?
11。如何避免朴素贝叶斯中的过拟合或欠拟合问题?
在这篇文章中,你会找到前 4 个问题的所有答案(粗体),因为文章越来越长,我把这些问题移到了第 2 部分,你可以在这里查看链接。
https://gautigadu091.medium.com/how-i-was-using-naive-bayes-incorrectly-till-now-part-2-d31feff72483
我们开始吧,
1。为什么在朴素贝叶斯中我们假设特征是条件独立的?
这是朴素贝叶斯方程,用于计算给定输入 X 的目标值的后验概率(不假设任何条件独立性)
假设您有三个特征,那么为了计算可能性概率,您必须遵循以下步骤。
假设您的训练数据只有三个数据点(0,1,0),(1,0,0)和(1,0,1),目标值分别为 0,0 和 1。现在让我们在假设和不假设条件独立的情况下计算似然概率
如果没有条件独立性,我们得到的似然概率为零——但是为什么呢?
因为我们没有足够的数据组合来帮助我们计算可能性。
那么,你至少需要多少个数据点呢?
假设我们正在求解二元分类,并且输入也是二元要素。假设我们有 3 个特征,那么输入 X 的所有可能值可以有 222 = 8 个组合,我们需要这 8 个组合用于每个类 8*2 = 16。
对于 d 维数据,我们需要有 2^(d+1)数据点。如果 d = 30,则接近 5000 亿个数据点。这实际上是不可行的。
有了条件独立,这就变成了 2d 组合。仅通过一个简单的假设,时间复杂度显著降低。
2。Sklearn 有 GaussianNB,MultinomialNB,CategoricalNB,BernoulliNB →给定的数据有类别,数值,二元特征你会选择哪个模型?
这是我忽略的一点,我通常在给定任何类型的数据时应用多项式 NB,但当我了解每种算法时,我明白每种算法都需要不同类型的数据。
高斯 B →当你有连续的特征。
当你有分类数据时。
多项式 lNB →应用于文本数据。
那么,假设您的数据具有连续特征、分类特征和文本数据,您将使用什么算法?
每个算法的基本假设是,它假设特征是有条件独立的。拟合 categoricalNB 上的分类特征、GaussianNB 上的连续特征和 MultinomialNB 上的文本数据,获得每个模型的似然概率(对于每个数据点,现在我们将有 3 个似然概率),并将它们相乘以获得总体似然概率。
注意:你必须将先验概率乘以最终似然概率,才能得到最终后验概率
3。如何对文本数据从头实现多项式朴素贝叶斯,并用 Sklearn MultinomialNB 匹配结果?
步骤:
- 使用 BOW 将数据转换成矢量。
- 根据类别计算计数。
- 计算所有的似然概率。
- 计算先验概率。
- 计算后验概率。
让我们取一个样本数据:
- 使用计数矢量器将文本转换成弓形:
这是简单明了的。
2。基于类别计算计数
- 首先,对目标值进行一次性编码。我在这里使用 LabelBinarizer。检查以下代码中的示例输出。
- 现在 y 的形状将是(n_classesn_datapoints),X 的形状是(n_datapointsn_features)。
要获得基于类的计数,将 y 的转置与 x 相乘就足够简单了。
对 count_matrix 的工作方式感到困惑,让我们举个例子来说明一下:
希望上面的例子是清楚的,如果不是的话,试着在一张纸上做来理解矩阵乘法。
3。计算概率:
例如,为了计算 P(‘are’/y='question '),我们使用下面的公式。添加拉普拉斯平滑以避免零概率情况。
计算特征对数概率的步骤:
- 我们已经有了计数→只需给它们加上α进行拉普拉斯平滑。
- 现在,对这个按行计算总和,以获得特定类中的单词数。
当α= 1 时:
- 将 count_matrix 中的所有值加 1。
- 计算逐行求和。根据分母的公式,我们必须加上 21*alpha (21 个唯一的单词),我们这样做了吗?
是的,在每个值的分子中,我们都添加了 alpha,所以当我们做 sum 时,我们基本上是在做 row sum (count_matrix)+ 21*alpha。
4.计算先验概率:
这是算法中最简单的一步,下面的代码不言自明。
4。预测功能:
现在,我们有了概率和一个查询点。我们可以简单地用矩阵乘法计算概率和查询点的加权和。
包装所有的代码,
最终输出
让我们将我们的结果与 sklearn 的实现进行比较
显示我们的结果与 Sklearn 多项式匹配的输出
只用了 15 行代码,我们就实现了“朴素贝叶斯分类器”。
4.如何对分类数据从头实现分类朴素贝叶斯,并用 Sklearn CategoricalNB 匹配结果?
- 对数据进行预处理。
- 基于类别计算每个特征的计数/存在。
- 计算似然概率。
- 计算先验概率。
- 计算给定查询点的后验概率→预测函数
在这个练习中,我采用简单的分类数据:
Dataframe 对象的头。
数据预处理:
- 使用顺序编码将分类数据转换为数字形式。这些特征被转换为有序整数。这将为每个要素生成一列整数(0 到 n _ categories-1)。
- 对目标值应用一键编码(就像我们在多项式 NB 中所做的那样)
X,y,classes = preprocess()
X.shape, y.shape
编码后的输出形状为:X →((18,3),y → (18,2))
2。基于类别计算每个特征的计数/存在。
下面是一个例子,我们将努力实现每一个功能。
我们在这一部分的主要目的是为每个特征生成这个计数矩阵。
- 对于每个要素-从数据中提取该列-X _ feature
- 对于一个类→确定该类在哪里为零,在哪里为一,并将其转换为布尔值。
- 现在屏蔽你的输入特征,做简单的计数。
Count_matrix 将以这种方式给出输出,对于 2D 数组的每个特征(第一行对应于 No,第二行对应于 Yes)。
3。计算可能性概率:
这类似于我们在这里为多项式 b 所做的
- 对于每个特征,如果提供的话,我们将增加 alpha(拉普拉斯平滑)。
- 进行逐行求和,如上图所述。
- 求对数-概率-对数(数/数)→对数(数)-对数(数)。
4。计算先验概率:
这与多项式 inb 非常相似,是算法中最简单的一步。
5.计算后验概率:
- 从每个特性中获取相应的 log_probs。
- 将这些概率与先验概率相加,得到最终的后验概率。
根据 category_id 提取单元格
比较 Sklearn 和我们手工实现的结果。
答对了。!
对于剩余的问题,请查看下面链接中的第 2 部分:
https://gautigadu091.medium.com/how-i-was-using-naive-bayes-incorrectly-till-now-part-2-d31feff72483
非常感谢你💖阅读这篇文章,我希望你对朴素贝叶斯的工作原理有一个清晰而深刻的理解。
你可以在这个 GitHub 链接中找到完整的代码。你也可以在 LinkedIn 上和我联系。