蒙特卡罗方法
强化学习之旅
使用机器学习来表示、探索和解决真实世界的场景。
欢迎来到我的强化学习研究的另一个章节。到目前为止,我们已经奠定了强化学习的基础,使用有限马尔可夫决策过程(MDP)来描述已知的环境。这一切都很好,直到我们遇到一种情况,环境的一切都不为人所知。这更有趣,因为它更真实,更接近真实生活环境(如果事情像 gridworld 一样简单就好了)。像往常一样,我会在这个博客的底部发布资源。让我们开始吧。
蒙特卡罗 (MC)方法不需要知道整个环境才能找到最佳行为。术语“蒙特卡罗”广泛用于任何包含显著随机成分的估计方法。在我们的例子中,他们所依赖的是经验,即状态、行动和奖励的重复序列,来自与环境的互动。我们将这些互动分成集,以便能够定义这些序列的开始和结束。我们可以使用上一篇博客中的相同概念来评估一项政策,但区别是关键:上一次我们是基于对 MDP 的了解来计算价值函数,而这次我们是从 MDP 的样本回报中学习价值函数。正如我们之前所做的,我们将从计算固定的任意策略π的值函数和动作-值函数开始,然后转向策略改进,然后转向控制问题及其通过一般策略迭代的解决方案。
回想一下,一个状态的价值是从该状态开始的预期累积未来贴现回报。根据经验来估计,我们可以简单地平均访问该州后观察到的回报。根据大数定律,当观察到许多回报时,平均值将最终收敛到期望值。现在,这个平均值既可以从第一次访问到特定状态获得,也可以从每次访问的获得。这两种 MC 方法非常相似,但有细微的差别。先来看看初诊 MC 预测。
http://incompleteideas.net/book/RLbook2018.pdf
让我们用一个真实世界的情况来帮助实现这一点。21 点是一种大多数人都熟悉的纸牌游戏,并且简单易学。在每一轮开始时,玩家和庄家都发两张牌。直到回合结束,玩家只能看到一张庄家的牌。游戏的目标是让牌的价值尽可能高,但不超过 21。所有的面牌都算 10,一张 a 可以算 1 或者 11。玩家可以“打”,收到另一张牌,或“坚持”,停止接受牌,开始发牌。庄家按固定的策略出牌:他坚持任何 17 或以上的数目,否则就打。如果庄家“破产”,或超过 21,玩家获胜。否则,结果(赢、输或平)取决于谁更接近 21 岁。
一个重要的注意事项是,如果玩家持有一张可以算作 11 而不会破产的王牌,那么这张王牌被认为是可用的。在这种情况下,它总是被计为 11,因为计为 1 将使和等于或小于 11,这是玩家每次都应该碰到的。因此,玩家根据以下观察做出决定:他当前的总和(12–21),庄家的出牌(a-10),以及他是否有可用的 a。这总共有 200 种可能的状态。
我们可以认为这是一个插曲式的有限 MDP,每一轮都是一个插曲。赢、输、抽分别给予+1、-1、0 的奖励。一轮中的所有奖励都是零,这意味着这些最终奖励被视为回报:
在我们的例子中,我们不贴现,所以 γ = 1。
假设我们有一个策略,如果玩家的和是 20 或 21,那么这个策略就有效,否则就无效。为了找到状态值函数,我们可以模拟许多遵循策略的游戏,并对每个状态的回报进行平均。
通过蒙特卡罗策略评估我们给定策略计算机的近似状态值函数
从上面的图表中可以看出,当玩家总数达到或超过 20 时,该值会大幅上升,随着玩的游戏越来越多,其他州的值会变平。有一个可用的 ace 是非常罕见的,所以需要更多的剧集来获得更准确的价值函数,如左边的图表所示。
现在让我们继续使用蒙特卡罗估计进行控制,或者近似最优策略。主要思想与动态编程相同:通用策略迭代(GPI)。策略评估完全如上所述进行,并且通过使策略相对于当前值函数(现在是动作值函数)变得贪婪来进行策略改进。当模型不可用时,就需要行动价值函数,因为我们需要估计每个行动的价值来提出政策建议。因此,我们着眼于估计 q⁎ 。对于动作值函数 q ,对应的贪婪策略是选择具有最大动作值的动作的策略:
在 gridworld 中执行 GPI 时,我们使用了值迭代,在策略改进的每一步之间只迭代一次策略评估。对于蒙特卡罗策略迭代,每集后观察到的回报用于策略评估,然后在该集期间访问的所有州改进策略。
为了确保探索,蒙特卡洛中使用了两种方法:政策内方法和政策外方法。策略上的方法评估或改进用于制定决策的策略,策略外的方法评估或改进不同于用于生成数据的策略。在 on-policy 控制方法中,策略通常是软,这意味着对于所有状态和动作而言
【π(a | s)】>0,但是逐渐向确定性最优策略转变。我们接下来要看的 on-policy 方法将采用一个 ε-greedy 策略,这意味着我们将随机选择一个概率很小的动作 ε 。一项 ε-greedy 政策的美妙之处在于它的概念和实施是多么简单,以及它在保证我们取得进展,变得更好或与我们开始时的政策一样好时是多么有效。这被称为政策改进定理:
因此,事不宜迟,下面是一个基于策略的首次访问无模型蒙特卡罗控制算法的伪代码:
http://incompleteideas.net/book/RLbook2018.pdf
在将该算法实现到我们的 21 点环境中并模拟 500,000 集时,蒙特卡罗算法通过迭代更新的动作值函数为我们找到最优策略,这也收敛到最优;见下图。
既然我们已经讨论了政策上的学习,让我们继续讨论政策外的学习。记住,这意味着我们评估一个目标策略 π(a|s) ,同时遵循一个单独的行为策略 b(a|s) 。代理采用这种学习方式有几个原因。一个是代理可以通过观察其他代理来学习,比如人类。代理可以观察一个人如何执行某项任务,并从该经验中学习/改进它。策略外学习的另一个非常重要的动机是,我们想要找到一个最优的、确定性的策略,它根本不探索,但是我们需要探索行为来找到它。通过非策略学习,我们可以在遵循一个策略的同时学习多个策略。
我们现在要学习的技术是重要抽样,这是一种在给定另一个样本的情况下估计一个分布的期望值的方法。我们通过获得重要性抽样比率将其应用于非策略学习,重要性抽样比率是根据它们在目标和行为策略下出现的轨迹的相对概率的加权回报。它可以表示为
p 是状态转移概率函数。请注意,尽管这些概率通常是未知的(因为我们正在讨论一个未知的环境),但它们的分子和分母是相同的,因此相互抵消。这一点很重要,因为这意味着重要性抽样比率仅依赖于两个策略和序列,而不依赖于 MDP。
所以,我们试图估计目标政策下的预期收益,但只有来自行为政策的收益 Gₜ ,这就有了错误的预期。通过引入重要性抽样比率,它将收益转换为正确的期望值:
跨剧集边界对时间步长进行编号变得很方便,这意味着如果第一集在时间 10 结束,则下一集在 t=11 开始。也就是说,我们可以使用时间步数作为特定情节中特定步骤的参考。对于每次访问方法,我们可以将访问状态 s 的所有时间步长集合表示为 T(s) ,我们将在下面使用。对于首次访问方法, T(s) 将仅包括在剧集中首次访问 s 的时间步长。我们还将 T(t) 表示为时间 t 之后的第一次终止时间, Gₜ 表示从 t 到 T(t) 之后的返回。使用简单的平均值,重要性抽样通过按重要性抽样比率缩放回报并平均结果来估计价值函数:
即普通重要性抽样,但以下练习将使用加权重要性抽样,它使用加权平均值:
或者如果分母为零,则为零。这两种重要抽样的区别在于它们的偏差和方差。普通重要性抽样是无偏的,但通常具有无限的方差,在实践中,这种方差导致目标和行为策略努力寻找共同点。这就是为什么加权估计量通常是首选的原因。
那么,如果我们能够在一集接一集的基础上实现蒙特卡罗预测方法会怎么样呢?这叫做增量实现。我们通过平均回报来做到这一点,但对于非政策的加权重要性抽样方法,我们如何做到这一点呢?我们必须对收益进行加权平均。
如果我们有一个返回序列 G₁ , G₂ ,…, Gₙ₋₁ ,它们都从同一个州开始,并且每个都有一个相应的随机权重 Wᵢ ,我们希望估计
并在我们获得额外回报 Gₙ 时更新它。我们还必须维护每个州的第一个 n 个返回的权重的累计和 Cₙ 。 Vₙ 的更新规则是
和
其中 C₀ ≐ 0 。
因此,这篇博客文章的最后伪代码显示了一种基于 GPI 和加权重要性抽样的非政策蒙特卡罗控制方法,估计了 π⁎ 和 q⁎ 。目标策略π是相对于 Q 的贪婪策略,行为策略 b 是ε——软保证每对状态和动作的返回次数无限次。即使根据策略 *b、选择动作,策略π在所有遇到的状态下收敛到最优,策略b、*b 可以在情节之间/情节内改变。
http://incompleteideas.net/book/RLbook2018.pdf
在将该算法应用于 21 点示例时,最优值函数的图表看起来当然与上面的相同,所以我不会再贴出来。这是蒙特卡罗方法中非常令人兴奋的 GPI,接下来我将使用时间差异学习以及 Q 学习来看预测和控制!
非常感谢你的阅读,我期待冒险继续。
“我只得到这一个我们称之为生活的数据流”——大卫·西尔弗
资源
YouTube 上 David Silver 的 RL 课程
强化学习 GithubbyDenny britz
时差学习
强化学习之旅
通过经验引导优化价值函数。
欢迎来到我的强化学习研究的下一个激动人心的章节,在这一章中,我们将讨论时差学习。和往常一样,我会在文章底部链接到那些教导和指导我的资源。
在我的前两篇帖子中,我们谈到了动态规划 (DP)和蒙特卡洛 (MC)方法。时差学习是这两种思想在几个方面的结合。像 MC 一样,TD 直接从经历事件中学习,不需要环境模型。像 DP 一样,TD 学习可以从不完整的剧集中发生,利用一种叫做 bootstrapping 的方法来估计该剧集的剩余回报。基本上,它是对价值函数进行猜测,采取一些步骤,然后进行另一次猜测,朝着这个新的猜测更新我们的原始猜测。
其中 Gₜ 是返回,而 α 是恒定步长参数。我们查看估计值和回报之间的误差项,并在误差方向上更新我们的价值函数。TD 学习最简单的版本是 TD(0)或一步 TD ,在一步之后向估计收益更新价值函数。这个估计,就像贝尔曼方程一样,由两部分组成:直接回报加上下一步的贴现值。现在,我们可以用这个估计回报代替我们的真实回报 Gₜ ,得出一个估计的、有偏差的算法。
让我们用一个例子来看看 TD 方法是如何证明优于 MC 方法的。这个例子的想法是预测下班回家需要多长时间。这是状态、时间和预测的顺序。
我们如何根据经验的轨迹更新我们的价值函数?下面的可视化说明了 MC 和 TD 方法之间的区别。
蒙特卡罗(左)与时间差分(右)方法
在左边,我们看到 MC 方法推荐的改变。因为我们基于实际结果更新每个预测,所以我们必须等到最后,看到总时间用了 43 分钟,然后返回到那个时间更新每一步。有了 TD learning,如上图右侧所示,在每一步,迈出一步后,我们可以立即更新前一步。
TD 学习的一个主要优点是,它甚至在不知道最终结果的情况下也能学习。毕竟,一个代理完全有可能接收到不完整的序列,甚至在没有最终结果的连续环境中工作。
通过在我们的控制循环中用 TD 代替 MC,我们得到了强化学习中最著名的算法之一。这个想法叫做 Sarsa 。我们从 Q 值开始,将 Q 值稍微移向我们的 TD 目标,即奖励加上下一个状态的贴现 Q 值减去我们开始时的 Q 值。
Sarsa 使用五元组中的每个元素来描述从一个状态-动作对到下一个状态-动作对的转换。开始知道它的名字是从哪里来的了吗?
让我们看一下用于策略 TD 控制的 Sarsa 算法的伪代码:
http://incompleteideas.net/book/RLbook2018.pdf
为了实现这一点,我们来看一个可能很熟悉的例子,Windy Gridworld。Windy Gridworld 与我们在以前的帖子中了解并喜欢的 Gridworld 是一样的,但有一点不同:网格中间有一股侧风!
风的强度因柱子而异,由每根柱子下面的数字表示。强度表示采取行动后向上移动的单元格数量。例如,如果在目标右侧的单元格中,采取向左移动的动作会将您置于目标正上方的空间中。
需要注意的一件重要事情是,蒙特卡罗方法在这里可能不起作用,因为可能会找到一个策略,使代理停留在同一个空间,从而有效地使下一集永不结束。使用 Sarsa 让我们在插曲中了解到这样的政策是糟糕的,并将尝试其他的东西。
下一次,我将深入到非策略 TD 控制的 Q-learning 中,我们将独立于遵循的策略来逼近最优状态值函数,类似于非策略 MC 方法。非常感谢您的阅读,我期待着在这个迷人的机器学习子领域学到更多。
资源
YouTube 上大卫·西尔弗的 RL 课程
强化学习 Github 由 dennybritz
我的数据科学之旅
照片由 Unsplash 上的 Mantas Hesthaven 拍摄
在我辞职去参加编码训练营 12 个月后,是时候回顾一下了
自从我辞去前一份工作参加一个全职的数据科学训练营以来,大约有 12 个月了。一段时间以来,我一直想写一篇“我是如何在这里结束的”的帖子,但随着时间的推移,我想推迟,直到我工作了一段时间。过了一段时间后,回顾会变得更加尖锐和诚实——在这一点上,更容易将信号从噪音和情绪中分离出来。
我为什么辞职?
2019 年 3 月,我离开了 robo-advisor(为个人和 401k 计划参与者提供自动化投资建议)的一份轻松工作,在那里我没有付出多少努力,就能赚到很多钱。我为什么要做这种事?三个原因:
- 缺乏成长:我的工作变得很容易。没有明显的成长和学习的机会。我公司的产品系列稳定,现金流为正,没有尝试新事物的欲望。
- **觉得工资过高:**这一开始听起来并不是什么坏事。我的意思是谁不想得到过高的报酬?但随着时间的推移,尤其是当一个行业的竞争压力增加时,薪酬过高的人最先被裁掉。事实上,在我最终辞职前的几个月,我刚刚躲过了一轮裁员。
- **我想重塑品牌:**我住在湾区,这里一切都是科技。尽管我可以编写一些代码,并且知道如何处理 SQL 查询,但我被贴上了财务人员的标签,很少引起招聘人员的注意。如果我丢了工作,我将很难在湾区找到另一份类似的工作。
所以我辞职了。当我把这个消息告诉我的老板时,他真的很惊讶。他很友好地提出,如果我想在集训营结束后回来的话,他可以保留我的位置,我几乎接受了。但我想要一个新的开始,所以我最终说不。如果有一份工作让我有可能回去,那么我担心我会被吸引到阻力最小的那条路上。
训练营
2019 年愚人节,我开始了我的训练营。老实说,这是非常有趣的 12 周。那段时间,我交了新朋友,做了各种激情项目,开了博客。
老实说,我从训练营没学到多少东西。在我职业生涯的大部分时间里,我一直在从事各种定量工作,所以我已经相当熟悉统计学和数据处理。
我从训练营学到的主要东西是:
- 自然语言处理(NLP): 虽然我对定量数据很熟悉,但对文本数据进行处理和运行算法对我来说是陌生的。了解到 NLP 的主要目标是将单词(通过词频表达)提取到能够最好地解释文档之间差异的主题(可以认为是趋势)中,这很有趣。因此,就像在线性回归中搜索最能解释目标变量差异的特征集一样,在 NLP 中,您试图确定最能解释文档差异的主题集。当然不同的是线性回归是有监督的,主题建模(使用 NLP)是无监督的。
- **无监督学习:**起初,我对无监督学习感到困惑。从金融(我们总是试图预测未来)的角度来看,一个模型没有目标变量似乎有点奇怪。但是如果我们得到的只是一个大的文本文档语料库,那么就真的没有目标变量了。这就是无监督学习的用武之地。它筛选噪音和混乱,并试图确定趋势。这些趋势是主题,一旦发现,可以在其他模型中用作关键输入。无监督学习的另一个很酷的例子是聚类分析。当你对你的数据一无所知时,就开始把它们分成相似的组,研究每组的特征以及各组之间的区别。我意识到,无监督学习产品的主要目的是作为其他机器学习模型的重要输入,而不是作为最终结果。
我还会参加训练营吗?是的,马上。我知道这要花很多钱(12 周 17000 美元),并且需要你放弃工作几个月。但这很有趣,可能是我最后一次参加类似学校的环境(打出来感觉很难过)。
如果不去训练营,我能得到现在的工作吗?是的,我可能有。与此同时,训练营的结构、同龄人的决心以及没有工作都是我离开、提高面试技巧和找工作的巨大动力。
训练营是否帮助我获得了面试机会并最终找到了工作?不,我自己完成了所有的招募工作。我的一些同学通过我们的职业顾问找到了工作,但总的来说,每个人都是自己招聘的。总的来说,这可能是我对数据科学训练营的主要抱怨——他们使用光鲜的就业统计数据来吸引人,但没有传达的是,这些统计数据更能反映学生自己的动力和努力,而不是训练营对招聘人员的吸引力。不要误会,训练营在教授学生数据科学方面做得很好。但数据科学家的市场远没有他们营销手册上描述的那么深入和受欢迎。
工作
事实上,过去的一年让我对自己有了更多的了解。我以前的工作对我来说变得太容易了,以至于我已经忘记了奋斗和伸展是什么感觉。在怀疑的时刻,我甚至担心我是否还能做到。这就是为什么不管结果如何,我很高兴我能够鼓起勇气抓住机会,尝试一下这段旅程。
训练营结束后,我相对较快地找到了工作。我面试了 3 家公司(都是数据科学职位) :一家银行、一家咨询公司和一家金融科技初创公司。最终,我幸运地收到了这三家公司的邀请(我接受了金融科技初创公司的邀请)。我的面试经历是不典型的(我只完成了一个带回家的,令人惊讶的是从来没有被要求做任何 SQL),所以我真的没有什么太深刻的见解要说。作为求职建议的替代,我将给出一些择业建议:
- 去最需要你的地方:这是我现在的老板在我试图决定去哪里工作时给我的建议,现在回想起来,它听起来确实是真的。我们倾向于选择最有品牌声望或支付最高的公司。但一旦蜜月期结束,我发现我个人的工作满意度与解决难题(和学习)、打造酷产品和服务以及成为高贡献团队的重要成员联系最紧密——而这只有在你工作的公司非常需要你的技能时才会发生。
- 避开喜欢开会的公司:我喜欢目前工作的一点是会议很少。是的,我偶尔会和队友一起编程序,和老板讨论想法等等。,但当快速聊天就足够了,那么这就是我们要做的。我曾经在一些公司里,每次讨论,不管多么琐碎,都必须在一个有六个与会者的会议室里进行,并且持续至少一个小时。那些经历让我坚信那些不能工作的人,会遇到。的确,我们偶尔会受益于将所有利益相关者聚集在一个房间里,以便敲定一条商定的前进道路。但那是例外;大多数时候,会议是一个放松、上网、假装我们很忙的借口。
最后,我想补充一点,人们认为数据科学家做的和他们实际做的是有差异的。每个人都想谈论的工作的性感方面是机器学习和人工智能。但那只是工作的一小部分。在我不训练和拟合模型的大部分时间里(构建和拟合一个模型真的不需要那么长时间),我都在寻找和清理数据,或者头脑风暴,思考我需要什么数据以及我应该使用什么方法来解决我的公司面临的问题。对于这些,领域知识和动态学习的能力实际上比机器学习算法的百科知识更有用。最后,我想给大家列出一系列我认为每个优秀的数据科学家都必须具备的品质:
- 建立稳健简单的模型的能力,这些模型能够很好地概括样本数据。
- 识别模型在何种情况下可能会崩溃或表现不佳的直觉。
- 注重细节,保持足够的怀疑态度,以便能够嗅出不良数据(和故障模型)。
- 了解推动企业竞争优势、利润和现金流的杠杆。
- 将看似复杂的问题分解成关键部分的能力。
- 能够并愿意以简单明了的方式交流复杂的话题。
我加速 Python 的旅程:设置 GoLang 开发环境和基准测试
我们的旅程从安装 GoLang 开始。我们用 GoLang IDE,以及一些相关的工具和软件包创建一个开发环境。接下来,我们列出了 19 个“免费”资源和 5 本“非免费”书籍来学习 GoLang 语言。最后**、我们对Python sk learnk means到 GoLang kmeans 实现进行基准测试。我们将一起确定 GoLang kmeans 实现是否有效,以及它是否比Python sk learnk means 更快。**
资料来源:联合国人类住区规划署
我过去的旅程(此部分可选)
开始学习机器学习,在 2011 年,用一种很棒的语言叫做 R 。我在机器学习的理论和实践方面进展顺利。我认为“进展良好”的感觉是相对于过去的四次“重组”而言的
1.在我的第一个实验粒子物理职业生涯之后,我重新进入了人工智能领域。
2.AI 1.0 的泡沫破灭 1985 年,我通过学习算法、C、C++、分布式计算,重新装备成了 IT(信息技术)架构师。
3.我在 1993 年迷上了 Oak ,它后来在 1994 年被称为 Java 。我想,“这是一种用于 N 服务器分布式计算的语言。”我错了。原来是 Scala 。(IMHO,我很接近了。)我成了 CORBA 的拥护者,又一个泡沫破灭,这一阶段修图的最后部分。
4.自然,从 1997 年到 2000 年 Web 1.0 泡沫破裂,下一次“重组”是学习然后建立网站。
在 2012 年底,我开发了一个房地产应用程序,它可以改进邮件活动。我使用了一种叫做 R 的脚本语言,但是在钻研机器学习和深度学习的时候遇到了很多阻力。
由于这种阻力,我在 2013 年底尝试了 Python ,并一直留在 Python ,因为我更深入地了解了机器学习,然后是深度学习,然后是NvidiaGPU,然后是云计算。
我的新目标
我有一个问题,我想我与机器学习(ML)社区的很大一部分人都有这个问题。
我需要一种方法来加速我的 Python 机器学习解决方案,以便将其投入生产。
或者
Python 对于生产机器学习应用来说太慢了。我需要放弃 Python。
我决定做的是:
学习 GoLang 。
它几乎和 C 一样快。它被宣传为易学,因为它有一个类似 C 的语法。对并发性有语言级别的支持。它是静态类型的,但也包括垃圾收集。
这是值得注意的,因为它是在 Windows、Mac、Linux 和其他平台上。它支持新的多核架构。
GoLang 是开源并且有一个不断增长的贡献者社区。
对我来说,重要的是 GOLang 在 Google 的生产中使用了很多年。另外,我要求 GOLang 可以调用 Python 。我的基于 Python 的 ML 内核的包装器是我的快速生产运行时解决方案。
本文的其余部分是我建立 GoLang 开发环境的旅程。后面的文章详细介绍了如何使用 GoLang 和 Python 作为机器学习生产应用的双动力组合。
准备开始:设置您的 Go 开发环境
最好的开始方式是在源头:https://golang.org。
在这里,我下载了 MacOS 10.14 的二进制发布安装程序go 1 . 14 . 4 . Darwin-amd64 . pkg*。6.也有针对 Windows 和 Linux 的下载。*
我双击了驻留在我的Mac 下载文件夹中的 go . 1 . 14 . 4 . Darwin-amd64 . pkg。然后,我按照弹出的安装向导的指示进行操作。
注: Go 安装需要所选目标磁盘上的 350 MB 空间。
注:根据您计算机上的安全设置,安装过程中可能会要求您输入密码。
注意:安装后,最后的操作是“将安装程序移到垃圾箱吗?”我点击了,是的。
设置您的 GoLand IDE
我选择的 Python 交互式开发环境(IDE)是 PyCharm 。我欣赏的关于 PyCharm IDE 是它几乎完全自动化了我的 Python 开发管道,只需点击几下鼠标。
这种偏见导致我寻找 GoCharm。原来 PyCharm 背后的公司 JetBrains 称他们的GoLangIDEGoLand。
有一个方便的按钮可以下载 GoLand 的安装。从下载中,我双击了驻留在我的Mac 下载文件夹中的 goland-2020.1.3dmg、。然后,我按照弹出的安装向导的指示进行操作。**
安装过程中把图标 GoLand 放到我的工具栏里。我双击了 GoLand 图标。
发射时的初始 GoLand 屏幕。瑞秋·科特曼的动画
接下来,我点击了New Project:
在戈兰创建第一个项目。瑞秋·科特曼的动画
我的第一个围棋程序
你知道我的第一个 GoLang 节目是什么吗?
*package main
import "fmt"
func main() {
fmt.Printf("hello world")
}*
如果你猜对了Hello World
,你就对了!通过点击 GoLand 教程“The hitchicker ’ s Guide to GoLand”,将Hello World
代码放入我的第一个项目 awesomeProject1 。
注:我用的是 GoLand 的社区版。
*然后,我在 **GoLand 跑了Hello World
。*有效!
运行“开始构建学习开始…”
我继续浏览剩下的戈兰教程,“戈兰搭便车指南”如果你一直在使用 PyCharm ,本教程是对 GoLand 的快速介绍。
如果你对 PyCharm 不感兴趣,你可能想使用其他的 IDE。我可以推荐一下 VSCode ,另一个流行的多语言支持 IDE。
在下一部分,我列出了一些学习资源。我用过的。
学习资源
当你开始学习一门新语言时,你必须有原始文档。然而,我建议你不要在这里开始学习…
Go 编程语言是一个开源项目,旨在提高程序员的工作效率。围棋富有表现力,简洁…
golang.org](https://golang.org/doc/)
如果你想要五到十分钟的时间来学习 GoLang 或者现在需要一些话题,我推荐你
理解 Go 编程语言的教程列表,通过基本示例深入语言规范
medium.com](https://medium.com/rungo/go-introductory-tutorials-896aeda0fb8a)
在“你必须拥有”的清单上应该有另外 12 种在网上可以免费获得的 GoLang 资源:
- 围棋之旅;
- 学习围棋:面向各层次程序员的 30 大围棋教程;
- Golang 教程系列;
- 围棋教程和课程;
- 以身作则;
- Gophercises;
- 围棋练习;
- 围棋学习完全指南;
- 必备围棋 是一本关于围棋编程语言的免费书籍;
- 如何写 Go 代码?
- Go 并发模式
- 边学边考
GOLang 包列表(进口!)可以在这里找到:
标准库▹这些包是 Go 项目的一部分,但是在主 Go 树之外。它们是在…下开发的
golang.org](https://golang.org/pkg/)
另外,你可以在这里找到 GOLang 包:
Go 1.13 API 文档,包含即时搜索、离线支持、键盘快捷键、移动版本等。
devdocs.io](https://devdocs.io/go/#subrepo)
这些包是 Go 项目的一部分,但是在主 Go 树之外。它们是在比 Go 内核更宽松的兼容性要求下开发的。用“去拿安装它们。
我发现对机器学习有用的包:
- 【https://github.com/pa-m/sklearn
- https://github.com/pa-m/randomkit
- https://github.com/pa-m/optimize
书籍(非免费)
表演
选择 GoLang 的两大原因是
- 简单易学的语法
- 比 Python 更快
就我所知 C ,第一个理由就满足了。我发现 GOLang 在基本构造上与 C 相似,有一点点 Python 的味道,以及并发中的新功能。
不知道 **GoLang、**作者的心态(我去查维基版。),我的偏见让我相信 GoLang 是对 C 的重大改写,以适应分布式计算。
至于第二个原因,我查看了各种基准测试,结果显示 GoLang 比 Python 快 30 到 50 倍。
包和模块
我花了大约四个小时阅读 GoLang 的包和模块。然而,我需要做的是:
go get “github.com/pa-m/sklearn/base”
go get “github.com/pa-m/sklearn/cluster”
go get “github.com/pa-m/sklearn/dataset”
我认为 GoLang 已经发展到包可以归结为这些规则:
- 全局变量是骆驼大小写的。它们是变量,从它的包中对外公开。
- Packages 是由
package <name>.
设置的文件顶部的名字。该文件中指定的所有函数和全局变量都在 package<name>.
中 - 你可以用命令
go get <URL-for-package-file>
将这个包加载到你 GoLang 环境(类似于pip install <package-name>
)。 - 您可以使用您的
package main
文件中的语句import (<URL-for-package-file>)
访问<package-name>
中的定义。
对集群例程 kmeans 的 GoLang 实现的调用结果是:
package main
import (
"fmt"
"github.com/pa-m/sklearn/cluster"
"github.com/pa-m/sklearn/datasets"
"time"
)
func main() {
start := time.Now()
_ = start
kmeansBlobs()
fmt.Printf("elapsed %s s\n", time.Since(start))
}
func kmeansBlobs(){
X,Y := datasets.MakeBlobs(&datasets.MakeBlobsConfig{
NSamples: 10000,
Centers: 10,
ClusterStd: 0.5})
kmeans := &cluster.KMeans{NClusters: 10}
start := time.Now()
_ = start
kmeans.Fit(X, nil)
kmeans.Predict(X, Y)
fmt.Printf("elapsed %s s\n", time.Since(start))
}
另外,你可以浏览一下关于 GoLang 包和模块的内容,因为你很有希望使用GoLang。 GoLand 在 run: 上为您设置本地GOROOT
和GOPATH
GoLandGoLangkmeams-blogs . go 的运行
基准
我们在 Python 和 GoLang kmeans 实现上执行基准测试。以上**给出了 GoLang 实现。Python 的实现就是 :**
from sklearn.cluster import KMeans
def km():
kmeans = KMeans(n_clusters=N_CLUSTERS)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)
对于k 均值 实现,聚类的点数( n_p )从100
到70,000
不等。
Python-sklearn-Kmeans 与 GoLang-Kmeans (Y=MS)对比表,X =点数。
Python-sklearn-Kmeans 对 GoLang-Kmeans (Y=MS)乘以 X =点数。
通过观察,我们观察到 GoLang-kmeans 实现上升为*O(n), 而Python-sk learn-k means实现上升为 O(log(n))。*
Python-sk learn-k means实现使用cy thoncallouts(C语言)对整体速度和特殊算法进行微调以实现O(log(n))。******
我很惊讶地看到 GoLang-kmeans 实现比 P ython-sklearn-kmeans 实现要快 N < 10,000 点。
我的好奇心被触发;你或我应该试试:
- 解释 GoLang-kmeans 实现和 Python-sklearn-kmeans 在低 N 个数据点时的速度结果。
- 使用GPU有多容易?对性能有影响吗?
- 在没有性能增强的情况下, Python-kmeans 实现的速度有多快?
- GoLang-kmeans 的实现会因为并发性的增强而加速吗?是 1/ O(n 核) 更快?
结论
我喜欢我与 GoLang 和 GoLand 的生产力。我准备从社区升级到专业版 GoLand。
****我对 GoLang 和 Python kmeans 实现的速度并不感到惊讶。 Python sklearn 使用 cython、和**log(N)**
算法进行了高度优化。
我预计其他领先的 Python 机器学习包从切换到 GoLang 中受益很少或根本没有。 XGBoost 在一个 C++ 实现之上有一个 Python API,并且是并发的。 Lightgbm 给出与 XGBoost 相似的结果,并且通常比 XGBoost 更快。
我希望加速的地方是用 GoLang 代码替换围绕 ML 内核的 Python 无关预处理和后处理代码。
但是当有 GPU(加速)和云计算(可扩展性)和量子计算(在不久的将来大规模加速)的时候,为什么还要费心去加速 Python(T21)呢?)?
以下是我的推理。有一些现有的和未来的设备,比如几十亿部智能手机、无人机、电源插座( IoT )和其他设备,它们可能不想接入互联网,也不想拥有 GPU 也没有互联网接入(云)。
鉴于这种推理和 70 年的计算历史,对更快程序的需求一直存在,并且已经尝试了不同的方法。
如果说 Python 用 C 是为了更好的性能,那么或许 GoLang 可以用 Python 来交付生产机器学习。****
我旅程的下一步
我用 Docker 换 Python 。太棒了。 GoLang 版本多,包多。我想为不同的戈朗环境一个码头工人形象。
Python 2.x 到 Golan g 有一个翻译器。如果能找到一个 Python 3.x 到 Golang 的翻译器就太酷了。
我确定有办法从 Python 调用 Golang ,从 Golang 调用 Python 。我还需要安全的呼叫机制。
Python 有开发工具,有持续集成/持续部署的自动化部署( CI/CD )。 GoLang 有什么开发工具?我们已经遇到了 GoLand ,一个全面的 IDE。
这里使用的所有代码都可以在https://github.com/bcottman/GoApplication找到。
我希望这些博客“我的加速 Python 的旅程”对你的 Python 和 GoLang 编码和规划有用。我喜欢写它们。我更喜欢思考 Python 和 GoLang 可能的未来。请让我知道你对这些事情的想法。*
我的 TensorFlow 认证开发者之旅
这篇帖子是关于我如何通过 TensorFlow 开发者证书考试的。此外,它是关于我的机器学习之旅和我对机器学习驱动的软件开发的看法。
作者:安德烈·巴拉诺夫斯基
关于我
我是一个企业软件开发人员,正在跳上机器学习的列车。在过去的 15 年里,我一直在做独立的甲骨文咨询,主要与甲骨文开发者工具和 Java 相关。我喜欢与社区分享我的知识,从 2006 年到 2020 年,我发布了 1030 个带有示例代码的博客条目,其中大部分都与 Oracle 技术相关。我的博客在 Oracle 社区中很有名,我是 Oracle 开创性的大使和大会发言人(从 2007 年到 2018 年,我每年都在旧金山的 Oracle Open World 和 Oracle Code One 大会上发言)。当我在 2004 年攻读硕士学位时,我正在研究支持向量机和神经网络。然而,我转到了企业领域,开始使用 Oracle 工具。那是我在甲骨文工作的一段美好时光,作为一名独立顾问,我周游世界,结识了许多优秀的人,并在加拿大、美国、南非、香港、沙特阿拉伯、俄罗斯和欧洲国家工作过。2017 年末,我决定改变我的工作方式,开始开发自己的产品 Katana ML(带机器学习的业务自动化)。从那以后,我决定特别关注开源和 TensorFlow。获得 TensorFlow 开发者证书有助于更接近我从传统编程转向成为机器学习开发者的目标。
为什么是机器学习?
我为什么决定投身机器学习?我相信机器学习是未来的编程模式。这是我的主要原因。当然,它不会取代所有传统的编程用例,但它开启了一种全新的构建软件的方式。请看 Laurence Moroney 的精彩解释图,摘自他的 Youtube 视频— 机器学习基础:Ep #1 —什么是 ML?:
这张图表总结了传统编程和机器学习之间的主要区别。完美的例子——用传统的编程方法,你可以计算一个人何时在走路、跑步或骑自行车(使用速度)。但是怎么算一个人是不是在打高尔夫呢?这就是机器学习优势发挥作用的地方——它可以处理这些复杂的情况,否则根本不可能编写代码。这个例子来自 Laurence Moroney 视频— 机器学习基础:Ep #1 —什么是 ML?:
我是如何准备考试的
你的第一站应该是 TensorFlow 认证项目网站。在那里你会找到考生手册。这份文件列出了通过考试所需的所有技能。这个列表很长,但是不要害怕——这是可行的。
我不是在为备考做微观规划,我不太喜欢使用各种规划应用程序。我更喜欢遵循我脑海中的高层次计划,相当方便:)
我的高层次计划是,我严格遵循该计划(我应该提到,我已经在 TensorFlow 工作了 2 年)来成功通过考试:
- 阅读弗朗索瓦·乔莱的一本书——《用 Python 进行深度学习》(也有第二版,将于今年晚些时候完成,现在以 MEAP 的名字出版)
- 阅读 Aurélien Géron 的书—
使用 Scikit-Learn、Keras 和 TensorFlow 进行机器学习,第二版 - 在 Coursera 上学习劳伦斯·莫罗尼教授的实践专业化课程中的张量流
- 在 Coursera 上学习劳伦斯·莫罗尼教授的 TensorFlow:数据和部署专业化课程
- 浏览谷歌的机器学习速成班
证书网站强烈推荐第 3 项。如果你没有时间阅读第一和第二本书,我建议你也仔细阅读第四和第五项。你应该仔细阅读 Coursera 上的资料。不要跳,跳过任何笔记本。不要复制粘贴代码,从头开始学习自己实现用例。这在考试的时候会有帮助。
仅仅通过考试并不是唯一的目标。我正在仔细学习,并花了相当多的时间来提高我的张量流技能,这是我参加考试的主要目的(非常好的学习动机)。
在准备考试的时候用 PyCharm 编写代码。如果你对 PyCharm 很有信心,这在考试中肯定会有帮助。PyCharm 提供了 API 自动完成功能,这是一件大事——它将加速您的编码并减少错误。
在我有信心参加考试之前,我花了大约 6 周的时间集中学习。我没有全职学习,我也有工作。我帮忙照看我 9 个月大的儿子,你可能知道——有时候会很忙:)
考试
完成准备后,我没有马上去考试。我计划在接下来的三四天里参加一场考试。我是故意这样做的,把知识沉淀在脑子里,带着一个新鲜的头脑去考试。
在考试期间,我在使用 Python 或 PyCharm IDE 时没有遇到任何问题。我在我的 MacBook Pro CPU(2.4 GHz 8 核英特尔酷睿 i9)和 64 GB RAM 上运行训练,没有使用 Colab GPU。
你有五个任务,在考试中建立五个模型。考试时间为 5 小时。当您通过用于 TensorFlow 认证的 PyCharm 插件启动考试时,时间计数器会立即启动。任务从最简单到最复杂排序。你的作业会被相应地评分,最简单的任务得分较少。
任务 1 :我很快实现了,提交了——但是评分结果并不完美。我调整了一些调整(我不会深入细节,因为这是不公平的),重新提交保存的模型,并获得了最高分
任务二:我被这个任务卡住了。它应该不太复杂,但我在模型训练中不断出错。在某个时刻,我想——好吧,也许我考试会不及格。但后来我设法找到了一个变通办法,训练了模型,并从评分员那里得到了最高分。我看了看时间计数器,还剩 3.5 小时。这意味着我在前两项任务上花了 1.5 小时
任务 3 :这个任务对我来说比较顺利,我重拾了信心——我仍然有机会通过考试。然而,模型训练的准确率并没有像我希望的那样快速提高。在这个任务上花了 30 分钟后,我决定切换到任务 4 和 5。这时,还剩 3 个小时。我在任务 4 和任务 5 上花了 1.5 小时,然后回到任务 3。在这个任务上工作了 30 多分钟后,我设法找到了解决方案,此时模型训练的准确性开始迅速提高。然而,我仍然没有从评分员那里得到最高分。我意识到训练需要运行更长时间,以获得更好的模型准确性。还剩 55 分钟,我将模型配置为训练 40 分钟(在这一点上我是在冒险,如果训练因任何原因失败,我将没有机会再次运行它)。幸运的是,培训按时完成,我还有 10 分钟提交模型。这次我取得了好成绩,提交了我的作品
任务 4 :在 45 分钟内完成该任务,实现模型,并获得评分员的最高分
任务 5 :与任务 4 类似,45 分钟完成模型,提交给评分员,获得最高分
下一刻,我收到了一封邮件,正文是——“恭喜你,你通过了 TensorFlow 开发者证书考试!”
摘要
我是一名软件开发人员,决定进入机器学习领域。如果你像我一样——一个想投身机器学习的软件开发人员,希望这篇文章能给你动力。花时间学习,努力工作——会有回报的。
从人工智能开始
我的 ML 之旅—第一/四部分
机器学习——它是什么,为什么重要,以及如何开始
作者图片
4 月的一个决定性的日子,我决定投身于机器学习(在此之前我甚至不知道这个领域包含什么)。也许我很无聊。我可能在寻找除应用开发之外的事情做,这是我从 2018 年开始做的。四个月,很多个通宵之后,感觉自己开悟了!今天,我是一名 TensorFlow 认证的开发人员和谷歌云认证的专业机器学习工程师(我知道这有点拗口),同时还是一名谷歌认证的助理 Android 开发人员(我从 2018 年开始就是一名)。
我想写下我的经历和旅程已经有一段时间了。你看,自从我 7 月份拿到 TensorFlow 开发者证书以来,我的 LinkedIn DMs 上就充斥着各种各样的问题(从我如何准备考试到如何打入 AI 领域)。随着时间的推移,我开始注意到这些问题中的一些固定模式和相似之处。在某个时候,我意识到每个人脑子里都有差不多一样的问题。
我患有冒名顶替综合症,非常严重。我经常问自己,作为一个新手,如何在网上写出有价值的东西。我看过很多由非常有经验和能力的人写的博客,有些人有几十年的经验。我亲眼目睹了由开发软件的工程师们撰写的包含代码片段的深度文章。我想知道我的旅程对任何人来说有什么意义。
然后我突然想到!我意识到什么需要存在,但还没有。这是一种以人为本的方法来回答人们对这个领域的疑问。大多数人似乎只会谈论AI 有多棒,AI 有多 AI 有多未来,以及你做一个 AI 工程师能赚多少钱。大多数博客都为你提供一些关于框架或工具的教程。
但是我还没有看到一个帖子说为什么我的生活会因为学习这些而变得更好,为什么这个世界需要更多的人在这个领域工作。我们现在有过剩的失业工程师,不是吗?
这个四部分系列的第一部分将解决所有这些问题。我不想告诉你那些你可以通过谷歌搜索得到的信息。从经验上来说,我想向你展示我走过的路程,让你自己形成结论。
它无处不在,我是说无处不在
这听起来可能有点老生常谈,但我还是要说——AI 是未来。
抱歉,我收回那句话。
人工智能是我们当今现实的一部分。就像氧气一样。即使你没有意识到,你也在消费它。不过,没必要惊慌;世界末日还没有开始。
如果你和大多数人一样,你有一部智能手机。你的相机应用程序可能正在使用人工智能来拍摄人像模式照片。人工智能算法控制着你电池耗尽的速度,你在抽屉顶部看到的应用程序,以及更新应用程序的最佳时间。你知道并喜爱的谷歌产品——搜索、地图、GBoard 等。是由人工智能驱动的。你已经生活在科幻现实中了;你只是还没有意识到。
我们目前的教育体系是一个年轻人被推进计算机科学领域的体系,不管他们是否喜欢。因此,人们似乎普遍排斥科技职业。然而,人工智能是不同的,因为它是一种工具,而不是一种技术。你的激情在于唱歌吗?人工智能是你的职业。跳舞呢?写作?心理学?金融?交易?有一种方法可以将人工智能应用于其中。这意味着人工智能模糊了非技术职业和技术职业之间的界限。你可以对烹饪充满热情,同时仍然是人工智能社区的一部分。对于两类人来说,这是一个极好的消息——那些被迫从事科技职业但有其他兴趣的人,以及那些在非科技领域工作并希望提升工作方式的人。
我听到的另一个常见的抱怨来自那些“不想整天坐在电脑前的小隔间里写代码”的人。我也有好消息。在人工智能领域,你可能需要编写总共 25-50 行代码,这可能需要你在电脑前坐大约半个小时。当然,在这半个小时之后可能会有几个小时的思考时间,但是你可以用这段时间去闻一闻玫瑰花香或者做些别的事情。
我遇到的最后一个担忧是 ML 是否过于数学化。对此,我说,这取决于你。如果你在一个需要你使用特定工具和框架的领域工作,那么你就不需要关心它们背后复杂的数学。如果你想进入一个以研究为基础的领域,你需要学习线性代数、微积分和概率。
还不服气?
也许你属于以下两类中的一类:
- 总的来说,你对技术感兴趣,但不知道 ML 是否适合你。我建议遵循我的一个月策略——涉足计算机科学的任何领域(比如嵌入式系统),列出在精通该领域之前你必须查阅的所有资源,然后预算一个月来做这件事。如果你喜欢你做的事情,再坚持一个月。如果你不喜欢,那就转移到另一个领域(比如物联网),等等。一直这样做,直到找到自己喜欢的。如果 ML 是/不是你的那杯茶,你会用这个方法发现。预算中的一个月是承诺期,不管你有多不喜欢你正在做的事情,你都不能放弃。如果不出意外,你将在一年内探索 12 个领域,这本身就很棒了。
- 你对技术不感兴趣,但发现自己被推进了这个领域。进入 AI!想办法让你的兴趣领域(比如说摄影)关于 AI。也许创建一个工具,自动编辑你拍的照片,让它看起来更好?你的想象力和决心是这里唯一的限制。
“我的笔记本电脑就是垃圾!”
这似乎是很多想进入人工智能领域的人非常关心的问题。然而,从我的经验来看,到目前为止,每个接近我的人都有比我更好的电脑(我的电脑是华硕 X556UQK,配有第七代英特尔 i7 处理器、Nvidia 940MX GPU、8 GB 内存和 1 TB 硬盘)。
你还觉得不确定吗?你知道你可以用 Google Colab 在云上进行人工智能编程吗?你知道谷歌云平台和其他竞争平台(微软 Azure 和亚马逊 AWS)为你提供了可以按需利用的低成本云资源吗?你在这里没什么好害怕的。
如果你有预算,你可以买一台游戏笔记本电脑(这些电脑也可以用来开发人工智能应用)。还有 Lambda Labs Tensorbook ,一款为深度学习工程师打造的笔记本电脑(也是我梦想中的笔记本电脑)。
你已经过时了
这是你作为一个 AI 工程师会面临的问题。这个领域非常新,发展非常快,每一天都有变化。你今天所擅长的将在半年内变得过时。在这个领域取得成功需要你致力于成为一个终身学习者。如果你害怕改变,就不要在人工智能领域寻找职业生涯(更多内容将在第四部分讨论)。
吃太多不好吗?
当我第一次踏上与 AI 的旅程时,我不知道从哪里开始!有许多课程来自 Coursera、Udacity、Udemy、EDX、YouTube、Fast.ai、Nvidia、英特尔、其他在线网站、在线博客、教练中心、大学和公司内部培训。我发现可供选择的资源数量之多令人望而生畏,选择正确的资源有着巨大的压力(其中一些选项可能非常昂贵)。数周的研究让我最终选择了这条路。在本系列的下一部分中,了解我的学习之旅、一路上获得的认证以及我犯的错误!
第一部:一个卑微的开始与艾
如果你喜欢你所读的,请分享这篇文章。订阅接收关于未来文章的通知。如果你有问题,建议,或者反馈,就在评论里讨论吧!
本文原载此处。
TensorFlow 开发者证书
我的曼梯·里之旅——第二/四部分
TensorFlow 开发者证书——有用性、准备和时间承诺
作者图片
2020 年 3 月, TensorFlow 团队发布了 TensorFlow 开发者证书。这一基础证书允许 ML 从业者证明他们拥有在入门级 ML 角色中取得成功所需的技能。对于外行来说,TensorFlow 是谷歌的一个开源机器学习框架。除了作为一个强大的数值计算软件,ML 开发人员和研究人员可以快速构建和部署生产级 ML 模型。
作者图片
在这个四部分系列的第二部分中,我将与你分享我的学习之路,这样你也可以从对 ML 一无所知开始,以在这个领域获得入门级工作的技能结束。我还将分享获得认证的优势,以及认证是否对你有用,是否值得你花费时间和金钱。
一张证书到底值多少钱?
关于证书在求职者的简历中是否有用,科技界存在激烈的争论。有些人认为他们完全没用,重要的是重大项目、美妙的实习经历以及在行业岗位上的成功历史。其他人认为,它们有助于证明申请人在该领域有一些经验,可以提高候选人的就业能力。我认为任何一方都没有错。
我相信证书确实有它的位置。以我的经验来看,获得某方面的认证总能为我打开机会之门。例如,我的大学委托我构建多个官方 App,并允许我在 2018 年创办移动应用开发俱乐部;在这方面,我已经成为谷歌认证的 Android 助理开发人员,这是一个巨大的信誉助推器。自从我获得 TensorFlow 开发者证书以来,我的 LinkedIn 个人资料获得了巨大的关注,各行各业的人都给我发消息,征求我的建议和意见。这个证书也为我的简历增添了精彩的一笔。这让我可以马上和招聘人员谈论一些事情。
我认为仅仅有证书就足够了吗?肯定不是。但如果我说获得认证并没有提高我的职业生活质量,那我就是在撒谎。你在想是否适合你?在这篇文章结束时,你将更好地准备做出决定。
你是视觉学习者吗?
科技领域的另一个激烈辩论是,是从教科书还是在线视频中学习。一些人认为没有什么能打败一本好的老式教科书的全面性和彻底性。其他人说,在线课程和视频提供了一种现代的、图形化的、个性化的学习材料消费方式。
我对此的看法很明确——我完全赞成后者。ML 概念倾向于用图形来最好地解释,因为它们涉及到大量的精神可视化来处理。例如,当通过丰富的动画演示时,我发现理解卷积滤波器如何在图像的像素上移动要比在静态教科书中容易得多,静态教科书将一切留给想象力。
此外,正如我在第一部分提到的,这个领域发展得太快了。虽然在线课程可能会定期更新,以反映最新的内容和趋势,但教科书可能会在发布几个月后就过时了。推而广之,今天市场上的大多数书籍可能已经过时,或者至少不包含最新和最更新的信息。
“我不知道从哪里开始!”
我刚开始的时候也不知道。正如我在本系列的第一部分中提到的,有太多的资源可用,而关于选择的指导太少。然而,在经历了这个过程并做了我的研究之后,我写了这一节,所以我相信这条路对大多数初学者来说是最好的。
请注意,我绝不受任何人赞助或隶属于任何人;我在这里推荐的一切都来自我的研究和经验。此外,我对你在考试中的表现不负任何责任,按照下面的步骤操作需要你自担风险。
作者图片|保存到你的电脑。可能会帮你组织准备!
第 0 步:学习人工智能
当我开始我的旅程时,我跳过了这一步,后来我后悔了。请查看 Coursera 和 deeplearning.ai 的 AI for Everyone 课程。这个简单、非技术性的课程非常引人注目,让剩下的旅程更加顺畅。我后来选了这门课,但它应该是我事后做的第一件事。
第一步:Python
你习惯用 Python 编码吗?在开始之前,我对 Python 不熟悉,还有点害怕。来自 Java/C++的括号世界,不得不学习 Pythonic 式的做事方式的想法让我害怕。然而,我从 Udacity 开始使用 Python Nanodegree 进行人工智能编程,并感到非常自信(尽管需要一段时间来适应)。然而,我建议考虑 Udacity 的免费Python 编程入门课程,因为它包含的内容与 Nanodegree 中的几乎相同。如果你心中有任何其他首选资源,请随意考虑。如果你熟悉 Python,你可以完全跳过这一步。
第二步:深度学习基础
我看到许多人犯的一个常见错误是,他们跳过这一步,直接进入下一步;因此,他们对欣赏深度学习所需的基本原理的理解很少甚至没有。我推荐 Coursera 和 deeplearning.ai 的深度学习专业化,培训师吴恩达是一位出色的讲师,他成功地将多年的经验提炼为单一的专业化。
在这门对初学者友好的课程中,你将学习到所有的理论概念(加上大量的实践实验),这将为以后的一切打下基础。
第三步:用 TensorFlow 应用深度学习
拿 Coursera 和 deeplearning.ai 的 TensorFlow in Practice 专业证书(以前叫 TensorFlow in Practice Specialization)来说,这是 tensor flow 开发者证书页面官方推荐的资源。在这里,您将获得优秀、实用、真实的 TensorFlow 实践经验,并为通过考试做好充分准备。讲师劳伦斯·莫罗尼和吴恩达非常出色地讲述了这些内容,最终会让你充满自信。
该页面还列出了一个替代项目,来自 Udacity 的深度学习 TensorFlow 简介课程,但如果你打算在某个时候进行考试,我不建议你这样做。
第四步:TensorFlow 开发者证书
此时,你要做好充分的准备去参加考试;在接下来的章节中会有更多的介绍。
第五步:一些更高级的话题
这可能被看作是一个可选的步骤,但我推荐它。以 Coursera 和 deeplearning.ai 的tensor flow:Data and Deployment Specialization为例。该专业涵盖了一些特定的主题,其中一些可能与你不太相关(如在网络浏览器、移动设备和物联网设备上部署模型),但包含某些部分(如构建数据管道和联合学习),我不建议你错过。
那么,这需要什么呢?
- 时间——一般来说,我建议你为每个专业投入最多一个月的时间,每天大约 2 小时的学习时间。
- 课程费用 -你可以选择审核课程,这样你就可以免费获得课程资料,但最终不会获得 Coursera 证书;或者花钱从事专业研究。在我看来,就你所得到的而言,这些费用是合理的。
- 考试费用——在撰写本文时,考试费用为 100 美元。你所得到的价格合理吗?我相信是这样的,但是你必须自己决定(在下一节中会有更多的介绍)。
- 奉献精神——很多。尤其是如果编程对你来说是新的。东西坏掉并停止工作,你可能会发现自己熬夜调试代码。软件的安装本身就是一个挑战。
我的一些经验提示:
- 多次阅读 TensorFlow 考生手册以熟悉考试。请注意,除了手册中提到的以外,关于考试本身的一切都是保密的。
- 我怎么强调这一点都不为过。如果你运行的是 Windows 10,考试前暂停自动更新。你需要做的最后一件事是,一旦你开始模型训练,你的计算机就开始运行后台更新!
- 考试前先熟悉一下 PyCharm。确保你对此感到满意。在上面运行一些代码,以确保一切按预期运行。
对你有什么好处?
首先,你会得到一张证书和一枚徽章。
你也会被添加到认证目录。
你将有东西与招聘人员谈论,添加到你的简历,把你的电子邮件签名,并改善你的 LinkedIn 个人资料。你的技能将被验证为这个领域的入门级角色,你会对自己的进步充满信心。
但是,请注意,证书本身可能不足以帮助你脱颖而出;项目、实习和工作经验都是为了这个。此外,该证书在您收到后的三年内到期,您必须支付费用并重新认证才能保留该头衔。如果你是业内资深人士,这个认证可能对你没什么用。
如果你选择不参加这次考试,你可能会很高兴地知道,根据官方网站,未来将发布更多的高级认证考试。我呢,考完了,连一次都没后悔过。
我参加了另一个可能感兴趣的认证考试——谷歌云专业机器学习工程师考试。在这个系列的下一部分中会有更多的介绍!
第二部分:TensorFlow 开发者证书
如果你喜欢你所读的,请分享这篇文章。订阅接收关于未来文章的通知。如果你有问题,建议,或者反馈,就在评论里讨论吧!
本文原载此处。
云专业 ML 工程师
我的曼梯·里之旅——第三/四部分
ML 工程,以及谷歌云专业机器学习工程师考试
作者图片
谷歌云平台 (GCP)是谷歌提供的一套云服务,运行在支持谷歌应用的相同底层架构上。这些服务为客户(独立用户和组织)提供了对强大的基础架构、无服务器工具和企业级软件的访问,而安装和管理的开销时间最少。GCP 为微软的 Azure 和亚马逊的 AWS 平台提供了竞争。
虽然 GCP 有大量功能可以支持许多不同的工业应用,但我们关心的用例是人工智能。因此,我们将在本文中研究该平台提供的人工智能相关工具。
此外,谷歌云为开发人员、工程师和架构师提供了各种认证途径,以展示他们在云上构建的能力。8 月,谷歌发布了云专业机器学习工程师 (PMLE)考试,测试模式,我参加了并成功通过。截止 2020 年 10 月 15 日,考试不再公测;即每个人都可以使用它。本文将涵盖考试准备、培训和认证的相关成本以及获得认证的利弊。
作者图片
虽然人们可以以项目的形式展示他们使用 TensorFlow 的技能,但在使用云时几乎不可能展示同样的能力;毕竟,一个人如何展示他们使用工具的能力?因此,我强烈建议你考虑参加这个考试,即使你可能并不想参加 TensorFlow 开发者证书考试。
开发者还是工程师?
根据 Google 的说法,只有 5%的生产 ML 系统包含 ML 代码。建立和训练一个模型是必不可少的,但是还有许多其他的过程组成了一个 ML 管道。这些可能包括但不限于数据收集、数据验证、特征提取、模型验证、模型部署和模型自动化。
作者图片|基于图片此处
如果到目前为止您已经阅读了本系列,那么您现在将会意识到 ML 不仅仅是构建一个 Keras 模型并在您的笔记本电脑上对其进行训练。
这就是做一个 ML 开发者和 ML 工程师的区别。
你不能称自己为 ML 工程师,除非你对 ML 管道中的每个阶段都了如指掌,而不仅仅是建模。这些技能很重要,因为如果没有人能使用它做任何事情,那么在你的笔记本电脑上有一个训练有素的 Keras 模型是没有用的。
谷歌云平台提供了什么
那么,GCP 提供了什么工具来缓解这些担忧呢?下面让我们来看看其中的一些,特别是从 ML 工程师的角度来看:
- Google 云存储为您提供了存储大量结构化和非结构化数据的能力。
- Pub/Sub 允许您让客户端(比如物联网设备)将数据发布到主题中,这些主题可以从其他 GCP 工具订阅和传输。
- DataFlow 是 Apache Beam 的一个实现,它允许您在模型训练之前预处理批处理和流式数据,也可以用于对模型预测结果进行后处理。
- DataPrep 为您提供了一种图形化可视化数据的方法,并在幕后使用数据流执行任何指定的转换。
- BigQuery 让您能够针对大量结构化数据编写 SQL 查询,并从中快速学习模式。
- AI 平台笔记本、作业和模型让你有能力快速实验、训练和部署模型(这是你现在必须非常熟悉的部分)。
- KubeFlow Pipelines 作为 Kubernetes 上的一层实现,允许您编写可移植的、平台无关的 ML 代码,这些代码可以在任何地方运行和部署,包括您的笔记本电脑或不同的云提供商。
- Cloud Composer 是 Apache Airflow 的一个实现,它为您提供了一种协调调度和编排所有其他 GCP 组件的方法。
GCP 还提供解决方案,让你不用写任何代码就能使用人工智能。这些允许你毫不费力地创建 ML 系统,它非常强大,但是可能没有你需要的定制功能。
GCP 最好的一点是整个生态系统是多么的统一。每个服务都可以很好地与其他服务协同工作,从而允许您在构建管道时轻松地将一系列服务串联起来。
“我从哪里开始?”
考试的细节是完全保密的。下面的内容不是暗示考试内容,而是指导你学习成为一名成功的 ML 工程师所需的材料。这恰好是考试测试你的内容。
请注意,我绝不受任何人赞助或隶属于任何人;我在这里推荐的一切都来自我的研究和经验。此外,我对你在考试中的表现不负任何责任,按照下面的步骤操作需要你自担风险。
根据 PMLE 页面,该考试的推荐培训是 Coursera 的 GCP 大数据和机器学习基础课程,Coursera 的机器学习与 TensorFlow on GCP 专业化,以及 Coursera 的高级机器学习与 TensorFlow on GCP 专业化。
作者图片|保存到你的电脑。可能会帮你组织准备!
在撰写本文时,上述课程的部分内容已经过时。这些专业化最初于 2018 年发布,此后发生了很多变化。如果我的观察是正确的,它们将在未来的几个月/几年内被修改。在那之前,你需要知道的是:
- 如果您遵循了本系列前一部分中的学习路径,您可以有效地跳过这些专门化中的大部分张量流部分。他们使用 TensorFlow 1.x,我们目前使用 2.x,这改变了我们在 TensorFlow 中的许多做事方式。但是,您仍然必须彻底了解估计器,因为从今天起, Keras 模型不支持分布式训练和 TFX (如果您听不懂我说的话,不要担心,一旦开始,您就会懂了)。
- 在GCP上用 TensorFlow 进行高级机器学习,可以完全避开第一门课;这只是对 GCP 上用 TensorFlow 进行机器学习所涉及的课程的一个回顾。
- 如果您遵循了本系列前一部分中的学习路径,在GCP tensor flow 高级机器学习中,您可以跳过第三个课程的大部分(仅完成第 2 周,从更深入更快,直到周末),第四个课程的大部分(仅完成 AutoML 和 DialogFlow 部分),以及第五个课程的大部分(仅完成第 1 周至因子分解方法和第 2 周的构建端到端推荐系统部分)。
- 请注意,这些专业中的许多实验已经过时,因此可以跳过。
然而,如果你想要 Coursera 的课程和专业证书,你不能跳过任何东西。
“需要什么?”
- 我建议你为每个专业准备一个月的预算,每天投入大约 2-3 个小时的学习。
- 课程费用- 你可以选择旁听课程,这样你就可以免费获得课程资料,但最终不会获得 Coursera 证书;或者花钱从事专业研究。在我看来,就你所得到的而言,这些费用是合理的。
- 考试费用- 考试的零售费用是 200 美元。你得到的价格合理吗?我相信是这样的,但是你必须自己决定(在下一节中会有更多的介绍)。
- 奉献- 很多吧。并不是所有的事情都有很好的记录和解释。你可能会发现你的理解中有相当大的差距,这需要花很多个晚上来阅读。
为什么要经历这些?
你将获得一张证书,证明你有能力使用谷歌云产品构建有效的 ML 解决方案。
你还会被添加到 Google Cloud 证书持有者目录。
你可以在这里和这里阅读所有其他福利。
但是,请注意,证书本身可能不足以帮助你脱颖而出;项目、实习和工作经验都是为了这个。此外,该证书在您收到后的两年内到期,您必须付费并重新认证才能保留该头衔。值得吗?你现在有你需要决定的了。请注意,微软的 Azure 和亚马逊的 AWS 平台也提供类似的认证考试。
在这个系列的下一个也是最后一个部分,我们将看看为什么人工智能如此重要,如何利用它有所作为,以及它如何有时会令人沮丧。
第三部分:云专业 ML 工程师
如果你喜欢你所读的,请分享这篇文章。订阅接收关于未来文章的通知。如果你有问题,建议,或者反馈,就在评论里讨论吧!
本文原载此处。
机器学习之旅
我与曼梯·里的旅程——第四部分
下一步,以及为什么这个过程有时会令人沮丧
作者图片
我认为许多人已经错过了计算机科学的要点。我们生活在这样一个世界里,年轻人相信科技行业是有利可图的,因为这个领域有很多高薪、稳定的工作。当这些人进入就业市场时(在大学学习过过时或不相关的内容后,他们可能首先被迫加入),他们会受到粗暴的冲击;他们不具备行业知识,因此必须花费自己的时间、金钱和精力来武装自己以适应现实世界。现在我知道事情在最近发生了变化。不是每个人都是这种条件反射的受害者。然而,我想花点时间来解决这些问题,并解释人工智能是如何与众不同并产生影响的,不仅对我们的职业生涯,而且对我们的生活质量。
我还想借此机会谈谈我在这一领域发现的不足之处,以及如何改进这些不足之处的一些想法。最后,我想讲述一下我在过去几个月中面临的一些挑战,以及我是如何克服这些挑战的。
真正的问题是
当你想到技术时,你会想到什么?生活在这个科幻小说般的世界里,你是否充满了激情、兴奋和惊奇?成为未来创造者的想法是否让你感到兴奋和鼓舞?或者你充满了恐惧,想着在你那毫无生气的显示器前再坐一天,做一份你不喜欢的平凡的工作,为了一份充其量是可管理的,最差是微薄的薪水?这两种思维方式本身都不会错。然而,我发现缺乏的不是这个系统本身,而是它所创造的期望。
我在我们的社会中观察到的一个最大的缺陷是职业分为技术和非技术类别。许多人认为,技术工作需要数小时无意识、静止不动的编码,而非技术工作需要冒险和令人兴奋的任务,报酬也不高。而且很长一段时间,可能都是这样。然而今天,我相信这两个世界之间的界限正在消失,未来所有的工作都在某种程度上涉及这两种任务。
我在本系列的第一部分中谈到了这一点;你可以将人工智能应用到任何领域,彻底改变传统的做事方式。这意味着你不必为了科技职业而放弃你的爱好/激情/副业;你可以用技术增强它们*。这也意味着机会的数量实际上是无限的!更重要的是,学习所需的技能从未如此简单;你不需要一个昂贵的学位就能胜任;在 Coursera 上进行几周的密集学习就足够了(如果你阅读了本系列的其他部分,你可能已经意识到了)。*
我认为现在是时候了,作为一个社会,我们应该走出用金钱来定义成功的僵化思维。取而代之的是,把成功作为一种衡量标准,让自己找到新的和创新的方法去做旧的和平凡的事情。我相信,这是这个世界迫切需要的,而且在我看来,从长远来看,这将带来更多的财富。
古怪,但合乎道德
那么,你如何寻找创新的方法呢?古怪点!想想那些听起来很荒谬,但在技术上是可能的事情*。想造一辆火星车?给狗装上微型摄像机,这样你就可以生成大量的运动数据!(当然,不伤害狗)。你是钢琴家吗?创造一个和你一起玩的机器人!也许你是一个跑步者;创建一个应用程序,帮助你逐步增加你的距离和更好地计时。你会注意到,只要稍加思考,可能性是无穷无尽的,不管你是谁。*
建造人们会使用的东西。我怎么强调这有多重要都不为过。举一个我生活中的例子——当我获得 Android 应用程序开发认证时,我喜欢成为一名移动应用程序开发人员,但当我为我的大学创建了一个数千人使用的官方应用程序时,我喜欢成为一名应用程序开发人员。如果你像我一样,你可能会发现自己更被冲击力而不是技术所吸引,这没关系。
当涉及到人工智能时,伦理是一个重要的问题。请始终确保您的想法从一开始就考虑到数据隐私和道德。谷歌在这方面有一些很棒的资源。
后续步骤
因此,您已经完成了本系列其他部分的所有课程。你觉得自己知识渊博,但仍不完全自信。以下是您可以采取的一些后续步骤:
- 找一份相关的工作或实习。
- 做一个个人项目/增强你的副业。
- 为开源项目做贡献。
- 参加在线竞赛; Kaggle 在这点上很优秀。
- 寻找你感兴趣的更高级、更小众的课程(例如,AI at the Edge)
- 搜索那些提供挑战你的高级课程的大学。
- 成为一名作家,在 ML online 上发布您的旅程…
最大的挑战
每隔一天,就会有新的发现。新的研究论文正在不断拓展人工智能的能力。今天可能是业内最热门的东西,明天可能会被弃用。你可能一年都不接触这门学科,一旦回来就什么都不懂了。
作为一名人工智能开发者,这是一个合理的挑战。你永远也学不够。你永远不能停止学习*。这在传统的软件编程中可能是可能的,但在这里不可能。这是一个真正的挑战,尤其是如果你不想学习新事物的话。在进入人工智能之前,确保你对这个事实感到舒服。好的一面是,在线教育通常非常实惠。*
有时候有点令人沮丧
正如标题所示,旅程并不总是舒适的。正如在第一部分中提到的,可用的资源太多了,而关于选择最佳资源的指导太少了(尽管我希望到目前为止我已经为您提供了重要的指导)。软件的安装有时会令人头疼。你今天学到了一些东西,但却不得不在 6 个月后重新学习。许多最新工具的适当文档可能很少,您将不得不自己修复损坏的东西。有时你的代码因为一些愚蠢的原因而无法运行,你不得不花一整晚的时间来修复它(只是意识到你在某个地方漏掉了一个括号)。
传统的基于行业的职业仍在发展。许多顶级公司要求求职者拥有“5 年以上的经验”,使用一种仅推出 3-4 年的工具(从个人经验来说);这使得新生进入这个行业变得更加困难。大学课程仍在发展,教师自己也不得不从头开始学习所有这些概念。
*也就是说,这是否意味着不值得努力开始?**不!*作为一名 AI 从业者,你将站在现代技术的巅峰,创新的火炬手,变革的领导者。最初的挑战可以很快克服,当学习过程不再令人生畏,开始变得愉快时,你将无法停止(我认为是六个月到一年)。随着就业市场的开放和世界走向人工智能,这个领域将会有大笔资金。
这一天很快就要来临了,没有(至少是基本的)人工智能知识不是一个选择。从现在开始,你将在这场革命中领先一步。当这是一个选择的时候,现在就要学会,因为很快就不会了。😃
第四部分:机器学习之旅
如果你喜欢你所读的,请分享这篇文章。订阅接收关于未来文章的通知。如果你有问题,建议,或者反馈,就在评论里讨论吧!
本文原载此处。
我的机器学习模型表现很好,但我希望它失败
探索数据科学家的伦理责任
来源:图片 via Pikist 在知识共享许可下。
我是 Metis 数据科学训练营的应届毕业生,在那个项目中,我们的一个项目专注于建立一个分类模型。我们可以选择任何我们选择的数据集来工作,在我的情况下,我选择使用疾病控制中心 2007-2016 年的国家健康和营养检查调查(NHANES)结果,并训练一个模型来预测一个人是否患有高血压(二元分类:是或否)。我在我的机器学习模型中测试了一系列 28 个变量,包括人口统计数据、饮食习惯、酒精摄入量、活动水平、职业等。在测试了各种模型之后,我选择了一个逻辑回归模型,它使用了 5 个变量、过采样,并将阈值设置为 0.34,从而将我的目标召回率提高到 0.899。我构建了一个漂亮的 Tableau 图形来表示我的发现,这样,我在技术上实现了我的目标:分类模型完成。检查。
对于数据科学社区的人来说,这可能不是一项突破性的工作。对于数据科学社区之外的人来说,你可能会想(如果我还没有失去你的话),“我不知道什么是逻辑回归模型或者你在那之后说的任何事情。”不管你的观众是谁,我都明白。但是我的模型的技术细节不是我想谈论的。
我想谈谈为什么我希望我的模型失败。
为什么?
在我的模型中,五个变量中有四个是在意料之中的。首先是年龄,这是不幸但不可避免的。年龄越大,患高血压的几率就越高。然后,体重、的增加、酒精摄入和吸烟都增加了预测高血压的机会,这可能很难,但可以由个人控制或改变。
但让我困惑的是模型的第五个变量。这个变量是一个特殊的少数民族——如果一个人是这个民族的,他就会有更高的血压。我觉得没有必要在这里说种族,因为我不想这篇文章是关于我(白人妇女)谈论另一个种族。那不是我的位置,也不是我应得的平台。如果你真的想知道,用谷歌很快就能找到答案,因为我看到了我的模型的结果,并搜索了让人们处于高血压风险的因素,以检查我的变量(并希望能告诉我为什么我的种族变量是错的)。
我想谈的是如何看待我的模型中的种族变量,以及在这种情况下数据科学家的责任。有可能在种族和高血压之间有一种基因联系——这本身是令人悲伤的——但也有可能它代表了这个种族面临的许多其他可能导致高血压的社会问题。那是…真的很难过。即使这个特定的模型不是这样,这种相同的思路也可以应用于任何一个模型,在这个模型中,由于历史上对种族的压迫,种族作为一个变量出现。
当数据科学家看到他们的模型结果代表更大的社会问题时,他们会怎么做?
有些人可能认为这不是数据科学家的责任,而是其他人的责任,数据科学家只是构建东西。我不太同意这一点,并认为有义务做得更多,但我也不知道这看起来像什么。所以我想在这里提出这个问题,因为我相信这应该是一个更广泛的对话。对我来说,很难将这种模式视为“完成”并继续前进。我对我在建模方面的技术工作感到自豪,但不能说我对展示这些发现感到自豪。我很难过,很生气,也很不舒服。
也许我的机器学习模型很简单,但它提出的道德问题很复杂。
我鼓励并希望对这篇文章的评论。如前所述,我不是带着答案来的;我来这里是为了开始一场对话,希望你能加入进来,这样我们就能一起努力找到解决方案。
这款机型的完整代码可以在 github 上的 这里 找到。
我的营销分析技术堆栈
寻找适合您业务的产品
*miro.com 流量(按作者)
我在一个有点有趣的地方。在 covid 疫情期间,我发现自己的角色发生了变化,从利用分析来增加收入,转变为专注于在我们的创意中、在我们的许多营销渠道中寻找见解,并通过少花钱或不花钱来实现这一点。我写这篇日记,也是为了与他人分享我发现的有用的东西。
谈到分析,我是自学的,或者更确切地说是通过互联网学习的。从我作为营销人员的早期开始,我就很幸运地为拥有丰富数据的公司工作。跨部门共享这些数据帮助我做出最佳、最明智的决策,以推动我们想要的结果。看到数据驱动的营销部门的力量,我开始专注于寻找更多的方法来做得更好。它始于创收渠道、电子邮件、付费数字和付费社交。由于目前缺乏广告支出,我一直专注于推动一些非收入驱动计划的洞察力。作为一个团队,我处理过程中的所有角色,数据收集,数据清理和可视化。我需要找到尽可能自动化的方法,以确保我可以不断更新我所创建的内容,并继续为团队构建更多内容。
在这里,我将向您介绍我们现有的解决方案、我选择它们的原因,以及一些如何使用它们的示例。
数据准备—表格准备
我为建立我们的社交媒体数据集的 Tableau 准备流程。
Tableau Prep 是一个非常强大的工具,它是我开始旅程的一个好地方。事实上,如果我有升级的平台,允许我通过 Tableau 服务器设置自动运行流,我会更多地使用它。但这目前不在预算中,所以我每天使用它来运行上述流程,该流程对来自 4 个社交媒体平台的数据进行标准化/合并,加上附加的情感数据和定制标签,以构建我们的社交媒体洞察仪表板。这是一个大电梯,大约需要 30 分钟处理。我们将在后面的文章中详细讨论该报告。
数据准备— Google 脚本
Google Scripts 是一个免费的工具,我用它来移动数据并同时清理数据。你需要对 javascript 有一个基本的了解,但是一旦你了解了,你就可以做任何事情。不是服务器端程序员我经常遇到的一个问题是自动化我编写的函数。Google Scripts 解决了这个问题,它允许我创建触发器来自动执行脚本。
数据准备/来源— Zapier
一个 Zap 寻找一封电子邮件,并自动保存附件到谷歌驱动器
从我有权获取报告的来源获取数据,但不在我管理的仓库或存储环境中,Zapier 对我帮助很大。最著名的是 Adobe Analytics。我目前使用 Zapier 从 Adobe Analytics 获取自动发送的报告,并将附件保存到 Google drive。
数据源—网络数据库
快速网络主题分析
我们使用 Netbase 有两个目的。监控围绕我们品牌的对话,并将情感数据添加到我们自己的社交媒体帖子中。无论如何,这都不是一个便宜的工具,然而,我们公司跟踪谈话和情绪的目标使我们能够为购买做商业案例。通过连接到 API,我已经能够为每天更新的报告自动收集数据。
数据源— RapidAPI
我只是在刮 RapidAPI 的表面。我的用例是从抖音收集见解。由于没有官方 API,我使用 RapidAPI + Google 脚本为我们的渠道和我们的竞争对手收集数据。
数据源/存储— Improvado
最初,当我创建社交媒体报告时,我从脸书& Twitter 本地导出数据,并使用 Netbase 导出 Instagram insights。这变成了一个乏味的日常过程,但是一旦我们能够证明报告的价值,我就能够让 Improvado 的支出得到批准,以自动化这个过程,并把我自己解放出来,致力于建立新的见解,而不是保持以前的见解与时俱进。
数据存储— Tableau 服务器
我使用 Tableau 服务器来存储与我们的 Tableau 准备流程相关的数据。当您使用 Tableau Prep 时,您实际上没有其他选择。
数据存储— Google Drive/Sheets
对于较小的数据集或构建概念证明时,我一直使用 Google Drive 和 Google Sheets 来存放数据。一些好处是,我可以与同事共享对文件的访问,我还可以使用 Zapier 将文件推送到这里,并使用 Google 脚本操纵这些文件。
数据存储—谷歌云 SQL
一旦我证明了数据集的价值,并确保它是干净的,并且处于最终形式,那么将它从 Google Sheet 转移到像 SQL 这样的真正数据库是有意义的。有很多方法可以选择,我使用的是 Google Cloud SQL ,因为它可以通过 Google 脚本轻松访问和操作。另外,在承担任何费用之前,它给了我 300 美元的信用额度,以向公司展示价值。这是一个很棒的视频,它帮助我建立并更新了我的第一个谷歌云 SQL 数据库。
数据源—谷歌自然语言应用编程接口
我们总是希望为我们的内容创作者提供有价值的见解。我目前正在使用谷歌自然语言 API 来识别我们网站上文章中的实体。希望这将取代标记内容以创建片段的手动过程。你也可以用它来识别情绪。
数据可视化工具— Tableau
Tableau 是我们所有其他工作的终点。我通常会创建两种类型的报告。可以提供高级见解的高管级报告,可以通过电子邮件提供,无需登录;交互式报告,允许数据所有者挖掘自己的见解。
什么适合你?
有大量的选择可供选择。花点时间确定适合您预算和需求的解决方案。此外,如果你在为一家负责任的企业工作,你必须先证明自己的价值,然后才能获得财政支持。随着您的成长,准备好多次构建和重建。这可能同时是一个令人愉快和疯狂的过程,只是不要忘记全程记录下来。
我的 NLP 学习之旅
开始用文本数据处理项目的指南。
当你阅读标题时,我将与你分享我惊人的学习之旅,它始于一年前我在 NLP 领域做毕业设计的时候。在开始这个项目之前,我对自然语言处理(NLP)领域的了解还不够多。
“永远不要后悔你的过去。
更确切地说,像老师一样接受它。”——罗宾·夏尔马。
介绍
通常在执行分析时,许多数据是数字的,例如销售数字、物理测量、可量化的类别。计算机非常擅长处理直接的数字信息。然而,我们如何处理文本数据呢?
作为人类,我们可以看出文本文档中有过多的信息。但是计算机需要专门的处理技术来理解原始文本数据。我们知道,文本数据是高度非结构化的,可以使用多种语言!
这就是为什么 NLP 试图使用各种技术来创建文本数据的结构。
在这篇文章中,我想概述一下在学习 NLP 技术时我必须知道的一些主题。我注意到许多其他帖子都涉及到同样的事情,但是写下我的学习之旅帮助我组织我所知道的事情。
目录
- 工业中的自然语言处理
- 文本预处理
- 计算语言学和单词嵌入
- 深度学习的基础
- 面向自然语言处理的深度学习
工业中的自然语言处理
我们可以注意到文本数据无处不在。这就是为什么自然语言处理负责大量的应用。
在这一部分,我列出了其中一些应用:
- NLP 启用了一些有用的功能,如自动更正、语法和拼写检查,以及自动完成。
- 提取和总结信息:NLP 可以从各种文本源中提取和综合信息。
- 情感分析(电影、书籍和产品评论)。
- 聊天机器人:是使用自然语言处理的算法,能够理解你的查询,并充分、自动和实时地回答你的问题。
- 自动翻译是 NLP 的一个巨大应用,它使我们能够克服与来自世界各地的个人交流的障碍,并理解用外语编写的技术手册。
可以查看我之前的文章 这里 我在哪里做过 NLP 相关的项目。
文本预处理
这一节是关于熟悉和熟悉基本的文本预处理技术。
从多个来源加载文本数据:
在这一部分,我将向你展示如何打开不同来源的文本文件,如 CSV 文件,PDF 文件等。
正则表达式:
正则表达式(有时称为 regex)允许用户使用几乎任何类型的规则搜索字符串。例如,在字符串中查找所有大写字母,或者在文档中查找电话号码。正则表达式必须能够过滤出任何你能想到的字符串模式。使用 Python 的内置**re**
库来处理它们。更多信息见文档。
大多数行业仍然使用正则表达式来解决问题,因此我们不能忽视它的重要性。它们通常是数据清理的默认方式。知道了它们的适用性,了解它们并恰当地使用它们是有意义的。
让我们看一些使用**re**
的代码示例
Spacy vs NLTK:
我将稍微介绍一下**nltk**
和**spacy**
,它们都是 NLP 中最先进的图书馆,以及它们之间的区别。
Spacy**😗*是一个开源的 Python 库,可以解析并“理解”大量文本。针对特定语言(英语、法语、德语等)提供不同的型号。).旨在通过最有效地实现常用算法来处理 NLP 任务。
NLTK**😗*自然语言工具包是一个非常流行的开源。最初发布于 2001 年,比 Spacy(2015 年发布)要老很多。它也提供了许多功能,但实现效率较低。
→对于许多常见的 NLP 任务,Spacy 更快、更有效,代价是用户不能选择算法实现。然而,Spacy 并不包括一些应用程序的预创建模型,比如情感分析,这通常更容易用 NLTK 来执行。
**空间安装和设置:**安装分为两步。首先,使用**conda**
或**pip**
安装 SpaCy。接下来,根据语言下载您想要的特定型号。更多详情,请访问此 链接 。
从命令行或终端:
conda install -c conda-forge spacy
or
pip install -U spacy
接下来,**python -m spacy download en_core_web_sm**
符号化:
处理文本的第一步是将所有的部分(单词和标点)分割成“记号”。这些标记在 Doc 对象内部进行了注释,以包含描述性信息。与句子分割一样,标点符号也很有挑战性。作为一个例子,英国应该被认为是一个令牌,而“我们”应该被分成两个令牌:“我们”和“'的”。对我们来说幸运的是,SpaCy 将隔离那些不构成单词组成部分的标点符号。句子末尾的引号、逗号和标点符号将被分配给它们的标记。但是,作为电子邮件地址、网站或数值的一部分存在的标点符号将作为令牌的一部分保留。这里有一个例子,你可以运行它,看看结果。
命名实体:
超越了令牌,命名实体增加了另一层上下文。语言模型认为某些单词是组织名称,而其他单词是位置,还有一些组合与金钱、日期等有关。命名实体可以通过ents
访问。
词干:
词干提取是对相关单词进行编目的一种粗略方法;它基本上是从末尾直到词干截断字母。这在大多数情况下工作得相当好,但不幸的是,英语有许多需要更复杂过程的例外。SpaCy 没有包含词干分析器,而是选择完全依赖于词汇化。我们将在下一部分讨论引理化的优点。相反,我们将使用另一个名为**nltk**
的 NLP 库。
词汇化:
与词干化相反,词汇化不仅仅是减少单词,而是考虑一种语言的全部词汇,对单词进行词法分析。“was”的引理是“be”,“mice”的引理是“mouse”。此外,“meeting”的引理可能是“meet”或“meeting ”,这取决于它在句子中的用法。
变元化比简单的词干化提供了更多的信息,这就是 Spacy 选择变元化而不是词干化的原因。我们应该指出,尽管词汇化查看周围的文本来确定给定单词的词性,但它并不对短语进行分类。
import spacy
nlp = spacy.load('en_core_web_sm')text = nlp(u"I am a runner always love running because I like to run since I ran everyday back to my childhood")for token in text:
print(token.text, '\t', token.pos_, '\t', token.lemma, '\t', token.lemma_)
#### ----> In the above sentence, running, run and ran all point to the same lemma run. ####
停止单词:
停用词是指像“a”和“the”这样出现频率很高的词,它们不像名词、动词和修饰语那样需要彻底标记。SpaCy 拥有一个大约 305 个英语停用词的内置列表。
之后,我们可以将所有这些技术结合在一起,如果我们需要纠正拼写,删除多余的空格或标点符号等,我们可以添加更多的技术。建立一个文本规范化和预处理我们的文本数据。
“数据清理和准备是数据科学过程的关键步骤”
图片:来源
计算语言学和单词嵌入
在这一部分,我将讨论几个主题,例如:
- 提取语言特征
- 向量空间中的文本表示
- 主题建模
提取语言特征
- 使用空间进行词性标注:
有些看起来完全不同的词,意思却几乎一样。相同的单词以不同的顺序排列可以表达完全不同的意思。然而,我们需要看这个词的词性,而不仅仅是这个词。这正是 Spacy 的设计目的:你放入原始文本并得到一个 Doc 对象,它带有各种注释。
名词、动词、形容词等词性标签,以及复数名词、过去式动词、最高级形容词等细粒度标签。
回想一下,您可以通过索引位置获得特定的标记。
- 使用
token.pos_
查看粗略位置标签 - 使用
token.tag_
查看细粒度标签 - 使用
spacy.explain(tag)
查看任一类型标签的描述
注意‘token . pos’和‘token . tag’返回整数散列值;通过添加下划线,我们得到了等价的文本。更多详情和信息,可以查看 这里 。
结果是:
Visualizing POS: SpaCy 提供了一个出色的可视化工具,名为displaCy
。
#Import the displaCy library
from spacy import displacy#Render the dependency parse immediately inside Jupyter:
displacy.render(doc, style='dep', jupyter=True, options={'distance': 110})
POS 文档可视化
- NER 使用空间:
命名实体识别(NER):寻找非结构化文本中的命名实体并将其分类到预定义的类别中,如人名、组织、位置、医疗代码、时间表达式、数量、货币值、百分比等。Spacy 有一个“ner”管道组件,它标识符合一组预定命名实体的令牌跨度。
结果:
Spain - GPE-Countries, cities, states next April - DATE-Absolute or relative dates or periods the Alhambra Palace - FAC-Buildings, airports, highways, bridges, etc.
欲了解更多关于命名实体识别请访问此 链接 。
向量空间中的文本表示
- 单词的离散表示:
假设我们有一门拥有 10 个单词的语言。
V = {cat*, car, ship, city, man, laptop, word, woman, door, computer*}
我将“笔记本电脑”和“汽车”这两个词表示如下:
我们可以看到,所有的条目都是*“0”,除了单词“laptop”= 1 的索引,单词“car”也是如此。我们称那些向量为 10 个单词的**【one-hot】***表示。
离散表示的问题是,它可能无法捕获特定于领域的语义。换句话说,我们无法捕捉表示中的语义相似性和关联性。例如,家和住所是相似的,所以应该彼此靠近。但在按字母顺序组织的英语词典中,它们却相距甚远。
- 作为分布式表示的神经单词嵌入:
一个单词将由其相邻单词的平均值来表示。为每个单词构建一个 密集向量 。例子:hello=[0.398, -0.678, 0.112, 0.825, -0.566]
。我们称这些单词嵌入为或单词表示。
Word2vec 模型是一个处理文本的两层神经网络。它的输入是一个文本语料库,输出是一组向量。Word2vec 的目的和用途是将向量空间中相似词的向量分组。给定足够的数据、用法和上下文,Word2vec 可以根据过去的表现对单词的意思做出高度准确的猜测。这些猜测可以用来建立一个单词与其他单词的关联(例如,“男人”对“男孩”,“女人”对“女孩”)。给定一个中心词,它可以预测周围的词,反之亦然。
它以两种方式中的任何一种来实现,使用上下文来预测目标单词(这种方法被称为连续单词包,或 CBOW )或使用单词来预测目标上下文,这被称为 skip-gram 。
主题建模:
主题建模允许我们通过将文档聚集成主题来分析大量文本。我们将从检查潜在的狄利克雷分配如何尝试为文档集发现主题开始。
- 【潜在狄利克雷分配法】 :
深度学习的基础
深度学习是 NLP 最近发展的核心。从谷歌的 BERT 到 OpenAI 的 GPT-2,每个 NLP 爱好者都应该至少对深度学习如何为这些最先进的 NLP 框架提供动力有一个基本的了解。
在我们直接进入神经网络之前,我们需要首先了解单个组件,例如单个“神经元”。
人工神经网络有生物学基础!让我们看看如何用一种被称为感知器的人工神经元来模仿生物神经元。
人工神经元也有输入和输出!这个简单的模型被称为感知器。
输入将是特征值,它们乘以一个权重。这些权重最初是随机生成的。
然后这些结果被传递给一个激活函数(有许多激活函数可供选择,我们将在后面详细介绍)。现在,我们的激活函数将非常简单…如果输入的和是正回报,1 如果和是负输出 0。
因此,有一个可能的问题。如果原始输入从零开始会怎样?
那么任何权重乘以输入仍然会得到零!我们可以通过添加一个偏置项来解决这个问题,在这种情况下,我们选择 1。
神经网络简介:
我们已经看到了单个感知器的行为,现在让我们将这个概念扩展到神经网络的想法!!
我们来看看如何连接多个感知机。
图片:来源
多重感知器网络:
-输入层(来自数据的真实值)。
- 2 个隐藏层(输入和输出之间的层(3 层或更多层是“深度网络”)】
- 1 个输出层(输出的最终估计)
关于之前的激活函数:这是一个非常戏剧性的函数,因为微小的变化没有反映出来。所以,如果能有一个更动态的函数就好了。
让我们再讨论几个激活功能:
ReLu 因其简单性和前向与后向计算容易,在许多情况下具有最佳性能。但是,在某些情况下,其他激活函数会给我们带来更好的结果,例如当我们希望我们的输出在[0,1]
之间压缩时,会在最后一层使用Sigmoid。DL 库为我们内置了这些函数,因此我们不必担心必须手动实现它们!!
现在我们已经了解了神经网络理论的基础,我们可以进入更高级的话题了。
面向自然语言处理的深度学习
在我们看到深度学习基础知识的简要概述后,是时候将事情提升一个档次了。深入了解高级深度学习概念,如递归神经网络(RNNs)、长短期记忆(LSTM)等。这些将帮助我们掌握行业级的 NLP 用例。
**递归神经网络:**专门设计用于处理序列数据。让我们想象一个序列[1,2,3,4,5,6]
,你可以问的问题是:你能预测一个类似的序列移动一步到未来吗??像那个[1,2,3,4,5,6,7]
。
最终,有了 RNN,我们可以做到这一点。
RNN 直觉:
- 序列到序列 : 是关于训练模型将序列从一个领域(例如英语中的句子)转换到另一个领域中的序列(例如翻译成法语的相同句子)。我们可以用它来进行机器翻译或问答任务。
- **序列到向量:**情绪得分你可以输入一个单词序列,可能是一段电影评论,然后请求返回一个向量,指示它是否是积极的情绪,例如他们是否喜欢这部电影。
- Vector to sequence: 可能只是为一个单词提供一个种子,然后得到一个完整的高概率序列短语序列。(exp: word=Hello,为你生成的序列= How are you)。
RNN 建筑
现在我们已经了解了基本的 RNNs,我们将继续了解一种称为 LSTM(长短期记忆单位)的特殊细胞结构。生成有意义的文本是必要的,因为我们希望网络不仅知道最近的文本,还知道它看到的文本的整个历史。
长短期记忆(LSTM):
RNN 面临的一个问题是,过一段时间后,网络将开始“忘记”最初的输入,因为信息在通过 RNN 的每一步都会丢失。因此,我们的网络需要某种“长期记忆”。
LSTM 分部帮助解决这些 RNN 问题。
让我们来看看 LSTM 细胞是如何工作的!记住,这里会有很多数学!查看资源链接获得完整的分解!
在这里,我们可以看到整个 LSTM 细胞似乎如此复杂,当我们看到它的格式。然而,当你把它分解成几个部分时,它就没那么糟糕了。
在此图中,每条线都承载一个完整的向量,从一个节点的输出到其他节点的输入。粉色圆圈代表逐点操作,如向量加法,而黄色方框是学习过的神经网络层。行合并表示连接,而行分叉表示其内容被复制,并且副本被移动到不同的位置。
lst ms 的关键是单元格状态,即贯穿图表顶部的水平线。
GRU:LSTM 的另一个变种。这是最近在 2014 年左右推出的,它最终通过将遗忘门和输入门合并为一个名为更新门的门来简化事情。此外,它合并了单元格状态和隐藏状态,并做了一些其他更改。
下一步是什么?
在本文中,我想从零开始,只介绍 NLP 中的基本技术和一些高级技术。但是,我不能跳过基本概念就跳到更高级的话题。下一次,我们将探索现代 NLP 技术,如迁移学习,NLP 快速进步的原因。敬请关注!!!
结论
"让你做的每一件事都像有所不同一样."威廉·詹姆斯
如果你正在读这篇文章,这是我的一篇较长的文章;我想为你陪我到最后而热烈鼓掌。本文通过一些例子介绍了我在 NLP 领域的学习历程,我相信这些例子会给你一个关于如何开始处理文本文档语料库的好主意。正如我所说的,我将在以后的文章中介绍迁移学习技巧。同时,请随时使用下面的评论部分让我知道你的想法,或者问你对这篇文章的任何问题。
快乐阅读,快乐学习,快乐编码。
在你离开之前:
你可以在这里找到我之前与 NLP 领域相关的项目。
参考资料:
[1] Sainbayar Sukhbaatar,Arthur Szlam,Jason Weston,Rob Fergus。端到端存储网络。 2015 年。
[2] D. Bahdanau、K. Cho 和 Y. Bengio。通过联合学习对齐和翻译的神经机器翻译。 2016。
[3] I.Sutskever、O.Vinyals 和 Q.Le (2014 年)。用神经网络进行序列对序列学习。神经信息处理系统进展(NIPS 2014)。
[4]米科洛夫,托马斯;等人向量空间中单词表示的有效估计。2013.
[5]利维,奥默;戈德堡,Yoav 达甘,伊多。 利用从单词嵌入中吸取的经验教训提高分布相似度 。 2015 年。
我对当前数据科学行业的观察和职业建议
大海的观点
我自己的简短简历。我是一名 1 岁的数据科学家,在新加坡工作。没有计算机科学或统计学学位,我花了 3 年时间追求数据科学的职业生涯,然后我得到了一份全职的 DS 工作。在这篇博客中,我想分享我对数据科学行业的理解,并给热衷于从事 ds 职业的朋友们一些建议。这里表达的观点代表我自己,是基于我的工作经验、社交网络以及我阅读的书籍和文章而给出的。
1.数据科学家的头衔正在经历一场“膨胀”。
由于近年来对人工智能和大数据的关注越来越多,越来越多的公司声称他们正在他们的产品中采用人工智能技术,并寻求雇用数据科学家。但是,一个公司是否需要很多数据科学家,“数据科学家”真的在做实际的数据科学工作吗?“科学家”的头衔听起来很好听,但大多数数据科学家的日常工作与实际的科学家相去甚远,例如在研究所从事前沿研究课题的统计学家和物理学家。因此,对于热衷于从事 ds 职业的朋友们,第一个建议是,不要被花哨的标题所迷惑。有必要了解 DS 的角色,选择最适合自己兴趣和实力的工作。
了解 DS 的生命周期,找到您的兴趣和优势
有几个朋友问我,数据科学家平时的日常工作是什么?被称为 21 世纪最性感的工作,数据科学家实际上不是一个独立的工作,而是需要各种角色之间的广泛合作。很好地理解典型 DS 生命周期中的不同角色非常有帮助。
图 1 典型的数据科学生命周期
图 1 给出了典型数据科学生命周期中的常见角色。一般来说,数据科学家的主要职责是开发具有适当算法和工具的机器学习模型,以解决特定的商业问题,如欺诈检测和需求预测。在下游,机器学习工程师将原型模型从笔记本带到生产中。以上所有的角色在一个 DS 项目中都是不可或缺的。在创业公司,有可能一个人需要承担多个角色。
以下博客详细介绍了不同项目阶段涉及的各种数据相关角色。
扩展数据科学领域的实地指南
towardsdatascience.com](/which-flavor-of-data-professional-are-you-5e01375584ce)
2.不同公司的数据科学家的价值由他们带来的业务影响来衡量。
作为各种 IT 专业人士的新宠之一,数据科学家被认为具有超强的赚钱能力。然而,事实并非如此,至少在东南亚是如此。图 2 显示了新加坡和旧金山的数据科学家和软件工程师的平均年薪对比。
图 2 数据科学家和软件工程师的薪资对比
新加坡数据科学家和软件工程师的薪酬差距比旧金山小得多。这表明 SEA 中的 DS 产业还不成熟。大多数中小企业不能理解 DS 和 ML 技术的能力。他们不知道 DS 功能可以实现什么,也不知道如何建立 DS 员工队伍。
对薪酬差距较小的另一种解释是,SEA 中的数据科学家带来的业务影响有限。就工作的复杂性和技术技能的要求而言,数据科学家和软件工程师可能同样具有挑战性。对于大多数 IT 公司来说,开发人员永远是他们技术团队的中坚力量。没有开发人员的贡献,他们的产品无法生存,而他们的数据科学家在理想情况下可能会将利润提高 5%。你能看出这里的区别吗?
因此,我想在这里给出的第二个建议是,当你选择一份 DS 工作时,评估你作为一名数据科学家能够给企业带来的职位和潜在影响。
在选择 DS 工作时,评估您作为数据科学家的职位以及您可以为企业带来的潜在影响。
你可以问自己几个问题。
- DS 是公司产品的核心技术吗?
- 作为一名数据科学家,你会参与产品或内部使用的系统的开发吗?
- 你将处理什么样的问题和项目?是你喜欢的吗?
答案没有对错好坏之分。这完全取决于你的兴趣所在。
3.DS 的研究和实验性质使它具有挑战性,但也令人着迷。
如果你到了这里,我希望你没有因为前两个观察而对追求 DS 望而却步。当你开始处理现实世界的问题时,DS 就变得很吸引人,例如用户行为、营销策略、各种可能影响收入的因素。当数据科学家开发的应用程序能够预测用户的未来决策并推动销售增长时,他们最有成就感。如果没有繁琐的数据处理、大量的研究和重复的实验,这是无法实现的。当商业目标实现后,所有的努力都是值得的。
另外,DS 需要更多的商业思维和创造力。如何将问题框定,使其可用现有数据解决?模型应该使用什么样的特征?应该使用什么指标来衡量绩效?这些问题都不容易回答。这就是领域知识在 DS 工作中扮演重要角色的原因。这也是数据科学家和开发人员的区别。
知道了它的利弊,如果它是你喜欢的东西,那就瞄准它,下定决心去努力。有大量的资料介绍如何为 DS 职业做准备。这里我只做一个快速的总结。
- 为技术技能做准备:数学、编程、机器学习。
- 建立 DS 项目组合。竞赛和自发项目是一个很好的起点。
- 阅读并与 DS 人员交谈,了解该技术如何应用于不同行业。
下面的博客给出了自学 DS 的实用指南。我曾经被各种资源淹没:在线课程、书籍、竞赛平台。正确的方法是为每个主题找一个好的材料,并坚持下去。熟能生巧。
一个完整的学习路径,包括不花你一分钱的资源
towardsdatascience.com](/how-to-learn-data-science-for-free-eda10f04d083)
谢谢你的阅读。我欢迎反馈和建设性的批评,您可以通过 LinkedIn 联系我。
我的奥德赛,寻找最流行的 Python 函数
我们都喜欢 Python,但是我们多久使用一次这些强大的功能呢?一篇关于我寻找答案的文章
在 Pythonrepositories 中提到最多的 Python 函数是通过 GitHub 提交计算的。作者图片
介绍
有一天,当我通过 map()运行 zip()和一些列表时。我无法停止注意这些年来我的 Python 风格发生了多大的变化。
我们以前都问过自己这个问题,其他人用这种美丽的语言做什么?他们用什么功能?
作为一名数据科学家,我的目标是更容易衡量的东西。GitHub 提交中提到最多的 Python 功能是什么?
在下面的文章中,我将
- 讨论这样一个问题的局限性,以及我用了多少方法都没能找到答案
- 展示我如何从 GitHub 收集数据
- 最重要的是,教你如何用酷的赛车吧来吸引普通读者
限制
最初,我开始这个项目是为了弄清楚 Python 函数被调用的频率。很快我们注意到,在 Github 上,你可以很快找到它。使用搜索功能!
GitHub 上 print()函数的数量,图片由作者提供
问题解决了!
嗯,不完全是…
问题是这些结果是不稳定的。通过多次调用这个搜索,我们可以得到任意数量的结果!这意味着当再次调用它时。
GitHub 上再次调用 print()函数的数量,图片由作者提供。
我们得到一个非常不同的结果…
Github API
GitHub 有一个神奇的搜索 API!
问题解决了!
嗯,不完全是…
这里的问题是,他们只提供代码的前 34k 结果或类似这样的结果,在相当长的时间内试图从中获得一些有用的东西。我不得不意识到他们不会允许我这样做。遗憾的是,我们的问题无法用简单的方法来回答。
通过提交的 Github 搜索功能
过了一段时间后,我发现在 Python 语言中可以通过提交和时间进行搜索!
问题解决了!
嗯,不完全是…
虽然这种搜索方式似乎相当可靠。它会产生很多假阳性。例如,它将显示提交到只提交一点点 Python 的存储库。在某种意义上,提交可以包括单词或函数。
虽然这并不理想,但我决定采用这种方法,因为它允许随着时间的推移进行比较。此外,我尝试了我能想到的所有其他方法,如果你找到了更好的方法,请在评论中告诉我。总的来说,这个数据必须带着许多怀疑,但我希望它能给我们一些有价值的教训。最肯定的是,它创造了一个杀手情节;)
数据收集
我们有找到答案的近似方法。现在,我们要做的就是调用 GitHub API!
问题解决了!
嗯,不完全是…
问题似乎是这个 API 应该更多地用于你的存储库内部的实际搜索。GitHub 似乎对他们返回给你的链接数量有硬性限制。他们似乎寻找了 X 秒钟,然后停下来,并返回他们到目前为止得到的任何东西。这很有意义,因为处理如此大量的数据非常昂贵。可悲的是,这也让我们寻找答案的旅程变得更加艰难。
由于我们拒绝放弃,我们决定调用他们的网站,并从返回的 HTML 解析答案!虽然这既不优雅也不简单,但我们不是懦夫。
让我们建立我们的联系。链接示例可能如下所示
[https://github.com/search?q=**{function}**%28+language%3A**{Language}**+type%3Acommits+committer-date%3A%3C{**before_year**}-01-01&type=commits](https://github.com/search?q=len%28+language%3APython+type%3Acommits+committer-date%3A%3C2000-01-01&type=commits)
示例链接,作者图片
如我们所见,我们主要寻找三样东西。
function: What function do we want to know about? e.g. len()
language: What programming language? e.g. Python
before_year: Before what year? e.g. 2000
当把这些参数输入 GitHub 时,它会告诉我们在那个日期之前已经提交了多少函数!
在调用这个链接之后,它返回给我们一个 HTML 文件,我们可以过滤这个文件来得到我们的答案。做这些事情的代码可以是
import urllib.requestlanguage='Python'
befor_year=2000# create the url using a year and a language
url_base = *f"https://github.com/search?l=Python&q={search_term}%28+language%3A{language}+type%3Acommits+committer-date%3A<{befor_year}-01-01&type=commits"*fp = urllib.request.urlopen(url_base)
byte_html = fp.read()
org_html = byte_html.decode("utf8")
fp.close()
例如,为了过滤结果 HTML,我们可以使用 regex。我们也可以使用 BeautifulSoup 或者其他一些可爱的 HTML 解析库,但是使用 regex 会大大简化本文的可读性。在这种特定的情况下,我们只关心一个数字,这使得简单地寻找那个数字更快。
import re
find_count = re.compile(r'([0**-**9,]+) (available|commit)')
上面的正则表达式“find_count”查找字符串“44,363 commits”。使用匹配组(“()”中的所有内容),我们可以从字符串“44,363”中提取数字组合。
快速完成这项工作的完整代码是,
正如我们所看到的,我们迭代所有的术语和年份,为每个函数收集一个数据点。然后我们从 HTML 中解析结果并存储它。剩下的整个过程是为了确保我们遵守 GitHub 的速率限制,不会被禁止累积我们的数据!
GitHub 似乎并不喜欢我们一直调用他们相对昂贵的功能;)这个我跑了 20 年,20 个函数,用了 80 多分钟,我觉得挺惊讶的。
最后,我们已经收集了我们想要的数据,现在可以用一些很酷的图来炫耀了!
形象化
我们现在有了一个大致如下的数据框架,
date,print(),len(),join()
2000-01-01,677545,44165,23534
2001-01-01,859815,66593,40032
2002-01-01,1091170,93604,59618
2003-01-01,1391283,117548,80327
2004-01-01,1755368,152962,125238
2005-01-01,2049569,185497,173200
每年每个函数提交的函数数量。这个数据集合特别易于可视化。
要把数据随时间可视化,我觉得赛车吧是最酷的。虽然它们可能不是信息最丰富的,但它们看起来令人难以置信!
我们需要的是一个 CSV,对于每个日期,有几个类别。一旦我们有了这样一个 CSV,我们就可以很容易地使用奇妙的 bar_chart_race 库。
注意:当通过 pip 安装时,这个库似乎没有完全更新,所以通过 github 安装
python -m pip install git+[https://github.com/dexplo/bar_chart_race](https://github.com/dexplo/bar_chart_race)
现在,剩下要做的就是将我们的 CSV 传递给函数,创建一个漂亮的 gif。
def plot_search_term_data(file):
*"""
This function plots our df* ***:param*** *file: file name of the csv, expects a "date" column
"""* df = pd.read_csv(file).set_index('date')
bcr.bar_chart_race(
df=df,
filename=file.replace('.csv', '.gif'),
orientation='h',
sort='desc',
n_bars=len(df.columns),
fixed_order=False,
fixed_max=True,
steps_per_period=10,
period_length=700,
interpolate_period=False,
period_label=
{'x': .98, 'y': .3, 'ha': 'right', 'va': 'center'},
period_summary_func=
lambda v, r: {'x': .98, 'y': .17,
's': f'Calls{v.sum():,.0f},
'ha': 'right', 'size':11},
perpendicular_bar_func='median',
title='Most Mentioned Python Functionality Over Time',
bar_size=.95,
shared_fontdict=None,
scale='linear',
fig=None,
writer=None,
bar_kwargs={'alpha': .7},
filter_column_colors=False)
在 Pythonrepositories 中提到最多的 Python 函数是通过 GitHub 提交计算的。作者图片
结论
我们已经看到了如何使用 regex 而不是通常的 bs4 直接从 HTML 收集数据。虽然这种方法不应该用于更重要的项目,但是对于像这样的简单任务,这种方法是必须的。我们还看到,最突出的数据源可能并不总是有效的。
最后,我们发现了一个新的可爱的图书馆和如何创建美丽的赛车酒吧,将捕获您的观众的兴趣!
如果你喜欢这篇文章,我会很高兴在 Twitter 或 LinkedIn 上联系你。
一定要看看我的 YouTube 频道,我每周都会在那里发布新视频。
整个代码
我成为认证解决方案架构师的途径
这是我如何在 28 小时的准备时间内成为认证解决方案架构师的故事
菲德尔·费尔南多在 Unsplash 上的照片
介绍
大家好,我叫 Philipp,在一家科技孵化创业公司担任机器学习工程师。在工作中,我为金融科技和保险公司设计并实现了云原生机器学习架构。
我在两年半前开始使用 AWS。从那以后,我已经使用 AWS 服务在私人和工作中构建了许多项目。最喜欢 aws 的无服务器服务。对我来说,无服务器优先总是适用的。
总之我有几年的 AWS 专业和兼职经验,但是没有证书。我知道实践经验和知识比证书更重要。但是有时候你需要一张纸来证明。
放弃
这篇文章不会展示每个人如何在 30 小时的学习中获得认证。而是应该激励其他和我有同样经历但是太懒的人。
证书
因此,几周前,我决定参加“AWS 认证解决方案架构师——SAA 助理-C02”认证。
“AWS 解决方案架构师-助理 SAA-C02”证书验证了在 AWS 上设计和部署动态可扩展、高度可用、容错和可靠的应用程序的能力。考试时间为 130 分钟,由 65 道题组成。
研究
首先我研究了一下,考试标准是什么。根据AWSSolution _ Architect-_ Associate _ SAA-C02 _ Exam _ Blue _ Print,它由这 4 个主题组成。
第二,我研究了在线课程和总结/小抄。我很快找到了一个在线课程,因为我已经熟悉了云专家。在谷歌搜索了一番后,我找到了贾延德拉的博客,几乎每个话题都有一份备忘单。
研究
最初,我看了一位云专家的“AWS 认证解决方案架构师助理 SAA-C02”课程。由于我的经验,我以 2 倍的速度观看了课程。每一集包含一个实验室,我后来都独立实现了。
在我完成课程后,我参加了一个云专家的模拟考试,获得了 78 分。因此我预约了 3 天后的实习。在这 3 天里,我每天学习 4 个小时,做了 10 次模拟考试,用小抄学习。
学习路径概述
学习路径
我总共花了 7 周零 28 小时完成了“AWS 认证解决方案架构师-助理 SAA-C02”证书。
考试
考试当天,我参加了最后一次模拟考试,并做了 a cloud guru 课程的每个测验。我在家通过 PearsonVue 参加考试。作为一名模范考生,我提前满足了所有要求,为考试做好了准备。入住非常容易,导师也很和蔼。大约花了 10 分钟才开始。
我花了 80 分钟完成并通过了考试。
学习
实践考试是好的,但由于 AWS 发展如此之快,他们不一定要准确。就我而言,我有大约 8 到 10 个关于存储网关、efs、fsx 的问题,而在模拟考试中这些问题要少得多。我从中得到的教训是,我应该少做一次模拟考试,多读一些文档。
我学到的第二件事是,对自己能力的肯定是一件值得骄傲的事情。
如果你有任何问题,随时联系我。你可以在 Twitter 和 LinkedIn 上与我联系,或者给我写一封电子邮件。
原载于 2020 年 10 月 24 日https://www . philschmid . de。
我挑选的 48 个高级数据库系统面试问题
适用于中高级受访者
旧的数据库系统,美好的往昔——照片由 Unsplash 上的 Kolar.io 拍摄
除了知道如何查询,你还应该了解一些数据库系统的知识。这是意料之中的,面试的时候经常会出现这些知识问题。在这里,我试着挑选我最喜欢的高级数据库系统面试问题。重点是“高级”,我假设您熟悉数据库基础知识,所以我跳过诸如什么是 DBMS 之类的基本问题。什么是 SQL?什么是交易?或者要求您运行一些基本的查询。我也尽我所能的把这些问题分类,归类,让学习更容易。
我希望这篇文章短小精悍,但结果并非如此。所以,我希望你做好长时间阅读的准备。如果你想通过数据库系统面试,你必须开始花时间做功课,我相信这篇文章是一个很好的起点。
我试图删除不必要的细节,只解释必要的内容。但是,当问题本身很有趣,值得多读的时候,我提供了一些补充材料的链接。
好的。我们开始吧。
一般问题
#1 传统的基于文件的系统有哪些问题使得 DBMS 成为更好的选择?
一个主要问题是准入。在没有索引的情况下,你唯一的选择就是全页扫描,速度超级慢。
另一个问题是冗余和不一致。文件有许多重复和冗余的数据,如果你改变其中的一个,你可能会使它们都不一致。保持文件的一致性是非常昂贵的。
另一个问题是缺乏并发控制。因此,一个操作可能会锁定整个页面,而在 DBMS 中,允许对单个文件执行多个操作。
数据隔离、完整性检查、事务的原子性和安全问题是传统的基于文件的系统的一些其他问题,DBMSs 为这些问题提供了一些很好的解决方案。
#2 有哪些开源和商业关系型 DBMSs 的例子?
对于开源 RDBMS,三种流行的软件是 MySQL、PostgreSQL 和 SQLite。对于商业 RDBMSs,您可以提到 Oracle、Microsoft SQL server、IBM DB2 和 Teradata。
#3 什么是数据库模型?列举几个常见的数据库模型?
数据库模型是数据库的逻辑结构,描述存储和访问数据的关系和约束。一些常见的数据库模型包括:
- 关系模型
- 层次模型
- 实体关系模型
- 文档模型
- 面向对象(OO)模型
#4 如何选择数据库模型?
在某种程度上,这取决于您的应用程序,每个数据库模型都有自己的优势。例如,文档模型适用于文本或半结构化数据。另一方面,如果您有原子数据,关系模型是您的最佳选择。
这也取决于你使用的数据库管理系统。许多数据库管理系统只适用于一种特定的模型,用户没有其他选择。
#5 什么是 ER 建模?
实体关系是一种建模形式,它试图模仿现实世界中实体之间存在的关系。在 ER 建模中,实体是真实世界的某个方面,例如事件、地点、人员,而关系,顾名思义,是这些实体之间的关系。
在 ER 建模中,所有实体都有它们的属性,这些属性在现实世界中可以被看作是对象的特征。例如,如果 employee 是一个实体,那么该雇员的姓名就是它的属性之一。
作为 ER 建模的示例,我们可以对员工之间的一种关系形式建模如下:两个实体,即主管和员工,以及一种关系,即主管。你可以像这样对你的整个组织建模。
员工的 ER 模型
#6 什么是 NoSQL?
NoSQL 指的是为一些特定的数据模型而构建的一组数据库,例如图形、文档、密钥对和宽列。与关系数据库不同,NoSQL 数据库具有灵活的模式。NoSQL 数据库因其易开发性、功能性和大规模性能而得到广泛认可。与 SQL 数据库不同,许多 NoSQL 数据库可以跨数百或数千台服务器进行水平扩展。
与传统的关系数据库相比,NoSQL 系统被认为是非常年轻的。然而,由于许多创新和性能改进,它们的受欢迎程度正在上升。
除了这些系统的所有好处之外,值得一提的是,NoSQL 数据库通常不能提供与关系数据库相同的数据一致性。这是因为 NoSQL 系统牺牲了 ACID 属性来支持速度和可伸缩性。
如果你想了解更多关于 NoSQL 数据库的信息,这里有一个极好的来源。
#7 什么是交易的 ACID 属性?
酸代表 A 富, C 协调, I 溶解, D 耐久。为了维护数据库的一致性,在事务之前和之后,必须满足这四个条件。下面,我试着简单描述一下这个概念。
**原子性:**又称“全有或全无法则”。基本上,要么存储事务的所有部分,要么不存储任何部分。不允许部分交易。例如,如果一个交易是从一个账户取钱并存入另一个账户,那么它的所有部分都必须完成,这样数据库才能保持一致。如果我们部分地做这个交易,那么我们就使我们的数据库不一致。
**一致性:**对这一术语的定义没有共识。一般来说,您可以这样看,在事务之前,数据库是一致的,在事务之后,它也必须保持一致。
**隔离:**我们同时运行许多事务,每个事务的中间状态必须对其他事务不可见。例如,在我为原子性描述的转账交易中,其他交易必须要么看到一个帐户中的钱,要么看到另一个帐户中的钱,而不是两个都看到。换句话说,如果我们让事务彼此完全隔离,那么事务就必须看起来是串行运行的,而不是并发运行的。
**持久性:**当事务成功提交时,它必须持久化(存储在磁盘上),并且不能撤销,即使在崩溃的情况下也是如此。
#8 数据抽象的不同层次是什么?
DBMS 中的数据抽象是对用户隐藏不相关细节的过程。一般来说,数据抽象有三个层次。1)物理层,其是最低层,是数据存储描述,该层由 DBMS 管理,并且该层的细节通常对系统管理员、开发者和用户隐藏;2)描述数据库和不同字段之间关系的概念或逻辑层。开发人员和系统管理员在这一层工作;3)仅描述部分数据库的外部或视图级别。例如,查询的结果是视图级别的数据抽象。用户通常在这一层工作,表模式及其物理存储的细节对他们是隐藏的。
存储管理
#9 列式和基于行的数据库有什么区别?
基于行的数据库将数据逐行存储在磁盘上,而列数据库将数据逐列存储。每种方法都有自己的优点。前者对于行上的操作非常快速和高效,而后者对于列上的操作非常快速和高效,例如为列的子集聚集大量数据。
通常需要整行的操作是写操作,如INSERT
、DELETE
、UPDATE
。需要列的操作通常是读操作,如SELECT
、GROUP BY
、JOIN
等。
一般来说,列数据库是分析操作理想选择,行数据库是事务处理的理想选择。
#10 什么是 OLTP 和 OLAP 及其区别?
OLTP 和 OLAP 都是在线处理系统。OLTP 代表“在线事务处理”,它是一个管理面向事务的应用程序的系统,OLAP 代表“在线分析处理”,它是一个管理分析查询的系统。
这两个系统的主要区别在于,OLTP 是一个写入密集型系统,而 OLAP 是一个读取密集型系统。这种差异对它们的实施有重大影响。例如,对于 OLTP 系统来说,采用适当的并发控制非常重要,而这在读取量大的操作中并不是主要问题。这两个系统之间的另一个区别是,OLTP 查询通常很简单,返回的记录数量相对较少,而 OLAP 查询非常复杂,涉及许多复杂的连接和聚合。
另一个区别是,由于 OLTP 系统的实时性,它们通常采用分散式架构来避免单点故障,而 OLAP 系统通常采用集中式架构。
此外,在大多数 DBMSs 中,OLTP 是基于行的数据库,而 OLAP 是列数据库。
#11 什么是正常化和去正常化?
规范化是将数据组织到多个表中以最小化冗余的过程。去正常化是相反的过程。它将规范化的表合并到一个表中,以便数据检索变得更快。规范化的主要优点是可以更好地利用磁盘空间。规范化后,维护数据库的完整性也更容易。
JOIN 是允许我们反转规范化并创建数据的非规范化形式的操作。
#12 什么是数据仓库?
它是从不同来源收集(提取、转换和加载)数据并将它们存储到一个数据库中的过程。您可以将数据仓库视为一个中央存储库,数据从事务系统和其他关系数据库流入其中。它可以关联广泛的业务数据,以提供对组织绩效的更深入的管理洞察。数据仓库是商业智能的核心,商业智能是用于数据分析和报告的系统。
该数据库与标准操作数据库分开维护。它们是两个独立的系统,后者经过优化,可以快速准确地更新实时数据,而前者最适合离线操作,可以长期查看数据。
数据库
并发控制
克里斯·萨博尔在 Unsplash 上的照片
并发控制是 DBMS 中确保同时操作不会相互冲突的过程。
#13 什么是数据库锁及其类型?
一般来说,可以说锁主要用于确保只允许一个用户/会话更新特定的数据。这里我描述了两种类型的锁:共享锁(S)和排他锁(X)。这些锁可以保存在表、页、索引键或单独的行上。
**共享锁:**当一个操作请求一个表上的共享锁时,如果被授予,这个表就可以被读取。这个锁可以与其他读操作共享,并且它们可以同时读这个表。
**排他锁:**当一个操作请求一个表上的排他锁时,如果被授予,就拥有对该表写的排他权。如果其他操作请求对该锁定的表进行访问,将会被阻止。
锁兼容性矩阵
对于锁还有另一个相关的概念,叫做意向(I)锁。我们有意向共享锁(IS)和意向排他锁(IX)。这些锁允许更细粒度的并发控制。从技术上讲,我们不需要它们。s 和 X 锁足够了,但是对查询优化有帮助。关于意向锁的更多细节通常超出了高级问题的范围。
#14 什么是“锁升级”?
数据库锁可以存在于行、页或整个表或索引中。当事务正在进行时,事务持有的锁会占用资源。锁升级是指系统将多个锁合并到一个更高级别的锁中(例如将多个行锁合并到一个页面或将多个页面合并到一个完整的表中),通常是为了恢复大量细粒度锁占用的资源。
#15 什么是“锁争用”?
当多个操作请求一个表上的排他锁时,就会发生锁争用。在这种情况下,操作必须在队列中等待。如果您遇到长期锁争用,这意味着您的数据库的某些部分是热的,您必须进一步划分这些数据块,以允许更多的操作同时获得独占锁。锁争用可能是扩展数据库的瓶颈。
#16 什么是“僵局”?
死锁是指一些事务无限期地等待对方放弃锁的情况。通常,有两种方法来解决这个问题,一种是惰性方法,这意味着什么都不做,如果发生了,那么检测它并重新启动一个操作来解开死锁。另一种方法是主动的,这意味着防止死锁的发生。如果你想了解更多关于死锁预防的知识,请点击这里阅读。
#17 什么是隔离级别?
隔离是酸性的第三个字母。有了这个属性,我们的目标就是让所有的事务彼此完全隔离(可序列化)。然而,有些应用不需要完全隔离。因此,我们定义了一些没有完全隔离严格的其他隔离级别。一般来说,定义了五个隔离级别。
Read Uncommitted: 根本没有锁。并发事务可以读取其他事务的未提交数据,也可以写入这些数据。在数据库术语中,他们说 DBMS 允许脏读。
**读提交:**在这个级别,DBMS 不允许脏读。在此级别,每个事务持有当前行的读/写锁,只有在提交更改时才会释放。这种隔离级别仍然允许不可重复的读取,这意味着事务在读取同一行时返回不同的值。如果你看看下面的图片,会更清楚。很明显,不允许脏读,但是不可重复的读仍然存在。
提交读隔离级别的示例
**可重复读取:**正如您之前看到的,“提交读取”隔离级别的问题是“不可重复读取”。为了避免不可重复的读取,每个事务必须对它们读取的行持有读锁,对它们写入的行持有写锁(例如,插入、更新和删除),直到它们提交更改。这种隔离级别是可重复读取的。
但是,在这个隔离级别中仍然有一个场景,它会使数据库不一致。如果我们向表中插入或删除新行,然后进行范围查询,那么结果将会不一致。看下面的例子。事务 1 中的同一个查询返回两个不同的结果。这种情况被称为“幻像读取”。
**可序列化:**这是最高的隔离级别。正如您在“可重复读取”中看到的,幻像读取可能会发生。为了防止幻影读取,我们必须持有整个表的锁,而不是行的锁。下图是迄今为止所有隔离级别的总结。
**快照:**这个隔离级别不同于我目前描述的其他隔离级别。其他的是基于锁和块的。这个不用锁。在此隔离级别中,当事务修改(即插入、更新和删除)行时,已修改行的提交版本将被复制到临时数据库(tempdb)并接收版本号。这也称为行版本控制。然后,如果另一个会话试图读取已修改的对象,该对象的已提交版本将从 tempdb 返回给该操作。
如果我描述的快照隔离听起来与其他隔离级别有根本的不同,那是因为它确实不同。其他隔离级别基于悲观的并发控制模型,但快照隔离基于乐观的模型。乐观模型假设冲突很少发生,并决定不阻止它们,如果它们发生了就处理它们。它不同于悲观模型,悲观模型确保无论如何都不会发生冲突。
访问方法
访问方法是支持快速访问行/列子集的组织技术或数据结构。一些最常见的数据结构是哈希表和 B 树的变体。
#18 什么是哈希及其优缺点?
哈希是一种查找技术。基本上,这是一种将键映射到值的方法。散列函数将字符串转换成通常较短的固定长度的值,然后这些值可以用作存储原始元素的索引。
如果我们使用一个好的哈希函数,哈希可以用来在一个常数时间内索引和检索数据库中的项目,这比其他的查找技术要快。
优势:
- 哈希表是点查找(也称为等式查询)的理想数据结构,尤其是当数据库很大时,因为无论输入大小如何,您都可以在恒定的时间内搜索、插入和删除数据。
缺点:
- 有些情况下,哈希不一定是最佳选择。例如,对于小数据,好的散列函数的成本使得散列比简单的顺序搜索更昂贵。
- 另一种情况是范围扫描操作(也称为范围查询),对于这种操作,B+树是一种理想的数据结构。
- 另一种情况是寻找子字符串或前缀匹配,哈希对于这些操作基本上是无用的。
- 哈希的另一个缺点是可伸缩性。随着数据库的增长,哈希表的性能会下降(更多的冲突和更高的冲突解决成本,例如,添加更多的存储桶或重新散列现有项目)
#19 什么是 B+树及其优缺点?
B+树是 B 树家族中的一种数据结构。这种数据结构及其变体在索引方面非常流行。该树是自平衡树,并且有适当的机制来确保节点至少是半满的。在 B+树中,数据存储在叶节点中,并且叶节点彼此顺序链接。叶节点之间的这些顺序链接允许在不遍历树结构的情况下顺序访问数据。这种顺序访问允许快速有效的范围扫描。
B+树允许在对数时间内进行搜索、顺序访问、插入和删除。在这个回答的最后,可以找到一个 B+树样本可视化。如果你有兴趣,你可以通过这个可视化工具为自己绘制一个(这里)。
通常,在数据库系统中,B+树数据结构与哈希表进行比较。所以,在这里我试着解释一下 B+树相对于哈希表的优缺点。B+树的优点是在范围查询和搜索子字符串中,使用 LIKE 命令。另一方面,对于等价查询,哈希索引优于 B+树。B+树的另一个优点是它可以很容易地随着数据增长,因此,它更适合在磁盘上存储大量数据。
一个常见的后续问题是,B+树和二叉查找树(BST)之间有什么区别?B+ tree 是 BST 的推广,它允许树节点有两个以上的子节点。
如果有人问你 B 树和 B+树的区别,你可以提两点。首先,在 B+ three 中,记录只存储在叶子中,内部节点存储指针(key)。与 B+树不同,在 B 树中,键和记录都可以存储在内部节点和叶节点中。第二,a B+树的叶节点是链接在一起的,而在 B 树中,它们是不链接的。你可以在下面的例子中看到这两个不同之处。
b 树可视化
B+树可视化
#20 聚集索引和非聚集索引有什么区别?
索引用于加速查询过程。没有它们,DBMS 需要执行全表扫描,这非常慢。
聚集索引与数据的物理存储相关。基本上,我们要求 DBMS 按列对我们的行进行排序,并按照这个顺序物理存储它们。如您所见,每个表只能有一个聚集索引。聚集索引允许我们非常快速地检索数据,因为它提供了快速的顺序扫描。您可以创建自定义的聚集索引,也可以让 DBMS 使用主键自动为您创建聚集索引。
相比之下,非聚集索引与物理存储无关。这些索引基于列进行排序,并存储在不同于表的位置。您可以将这些索引想象成一个包含两列的查找表。一列是一个表列的排序形式,另一列是它们在内存中的物理地址(行地址)。对于这些索引,如果我们寻找一个记录,我们首先在查找表中搜索它的索引,然后我们到物理内存中获取与该行地址相关的所有记录。
总之,非聚集索引比聚集索引慢,因为它们涉及额外的查找步骤。此外,由于我们需要存储这些查找表,我们需要额外的存储空间。另一个区别是,我们可以为每个表创建一个聚集索引,而非聚集索引的数量可以根据我们的需要而定。
操作员执行
由塞巴斯蒂安·莱昂·普拉多在 Unsplash 上拍摄的照片
#21 什么是相关和非相关子查询?
就相互依赖而言,有两种类型的子查询,一种是内部查询依赖于外部查询的值,我们称这种查询为“相关”查询,另一种是内部和外部查询相互独立,我们称之为“非相关”查询。
不用说,相关子查询非常慢,因为它要求内部子查询对外部查询中的每一行运行一次。
#22 有哪些不同的 JOIN 算法?
有三种主要的算法来执行连接。这里我试着简单描述一下,并提及它们的优点。
- 嵌套循环:它将外部表和内部表的所有值相互比较。这是唯一能够交叉连接(多对多连接)的算法。在没有更好的算法的情况下,它可以作为一个后备选择。
- 散列连接:这是最通用的连接方法。简而言之,它构建两个输入中较小的一个内存哈希表,然后读取较大的输入并探测内存哈希表以找到匹配。哈希联接只能用于计算等值联接。它通常比嵌套循环更有效,除非连接的探测端非常小。
- 排序-合并连接:该算法首先根据连接属性对两个表进行排序。然后找到第一个匹配项,向下滚动两个表,合并匹配属性的行。
#23 什么是存储过程?
你可以把它当作一个半程序。执行特定任务的一组 SQL 语句。如果这个任务是一个常见的任务,那么我们可以将查询存储到一个过程中,并在需要时执行它,而不是每次都运行查询。下面是一个结构简单的程序。
CREATE PROCEDURE <Procedure-Name> AS
Begin
<SQL STATEMENT>
End
创建一个过程后,无论何时需要,我们都可以使用 execute 命令来执行它
EXECUTE <Procedure-Name>
存储过程有很多好处。主要的一点是 SQL 代码的可重用性。如果该过程是常用的,它有助于避免多次编写代码。另一个好处是当我们使用分布式数据库时,它减少了通过网络发送的信息量。
#24 什么是数据库触发器?
触发器是一个存储过程,在事件发生之前/之后自动运行。这些事件可以是 DML、DDL、DCL 或数据库操作,如登录/注销。通用触发器语法如下:
CREATE [ OR ALTER ] TRIGGER [ Trigger_name ]
[BEFORE | AFTER | INSTEAD OF]
{[ INSERT ] | [ UPDATE ] | [ DELETE ]}
ON [table_name]
AS
{SQL Statement}
触发器的一些应用有:检查事务的有效性、实施参照完整性、事件记录、自动生成一些派生列以及用户登录前/后的安全授权。
如果你被问到触发器和存储过程的区别,你可以提到触发器不能被自己调用。它们在事件期间被调用。相比之下,存储过程是一个独立的查询,可以独立调用。
查询规划和优化
阿尔瓦罗·雷耶斯在 Unsplash 上拍摄的照片
查询规划和优化是许多 RDBMSs 的一个特性。查询优化器试图通过考虑可能的查询计划来确定执行给定查询的最有效方式。
什么是执行计划?
执行计划是对数据库引擎为有效运行查询而计划执行的操作的描述。您可以将它视为 DBMS 查询优化器的一个视图,DBMS 查询优化器基本上是一个寻找实现查询的最有效方法的软件。执行计划是对性能不佳的查询进行故障排除的主要手段。
阅读执行计划,理解它并根据计划排除故障是一门艺术。因此,如果你想了解更多,一个很好的参考是这里。
#26 什么是查询优化?
SQL 是一种声明性语言,而不是过程性语言。基本上你告诉数据库管理系统你想要什么,但你没有说如何得到这些结果。这要靠数据库管理系统来解决。DBMS 可以采用多种查询策略来获得正确的结果。但是,这些执行计划会产生不同的成本。查询优化器的工作是比较这些策略,并选择预期成本最低的策略。在这种情况下,成本是 I/O 和处理成本的加权组合。I/O 成本是从磁盘访问索引和数据页的成本。
#27 提几个提高查询性能的最佳实践?
这是一个普遍的问题,实际上有许多方法可以提高查询性能。这里我只提几个。
- 避免在单个查询中使用多个连接
- 使用连接代替子查询。
- 对常用数据和更复杂的查询使用存储过程。
- 使用 WHERE 表达式尽可能限制结果的大小。
这里是回答这个问题的另一本好书。
故障修复
崩溃恢复是回滚到一致且可用的状态的过程。这是通过撤销未完成的事务并重做崩溃发生时仍在内存中的已提交事务来实现的
#28 什么是预写日志?
在 DBMSs 中,恢复管理和维护原子性和持久性的实际技术是使用预写日志(WAL)。使用 WAL,所有的更改首先被写入一个日志,然后日志本身必须被写入一个稳定的存储器,然后更改才被允许被物理地应用。这就是它被称为预写日志的原因。一个简单的技术,保证当我们从崩溃中回来的时候,我们仍然可以弄清楚我们在崩溃之前正在做什么,并从我们停止的地方继续。
什么是检查点?
检查点与基于日志的恢复系统相关。为了在崩溃后恢复数据库,我们必须重做所有的日志记录。但是如果我们从头开始重做所有的日志记录,那么恢复一个数据库将花费很长时间。所以,一段时间后我们必须忽略一些记录。检查点是我们出于恢复目的决定忽略它们之前的记录的点。如您所见,通过使用检查点,DBMS 可以减少在崩溃时重启数据库的工作量。
分布式系统
什么是分布式数据库?
分布式数据库是多个相互连接的数据库的集合,这些数据库在物理上分布在不同的位置。几乎在所有情况下,这些物理上分离的数据库都具有无共享的架构,并且彼此独立。然而,DBMS 以一种对用户/应用程序显示为单个数据库的方式逻辑地集成数据。
#31 什么是数据库分区?
分区是将非常大的表分成多个较小的可管理的部分的过程。分区的一些好处包括更快的查询、更快的数据加载和更快的旧数据删除。分区的好处受到分区键和粒度选择的限制。
有两种方法可以对表进行分区:水平和垂直。垂直分区将不同的列放入不同的分区,而水平分区根据分区键将行的子集放入不同的分区。例如,公司的销售记录可以根据销售日期进行水平划分。
#32 什么是数据库分片?
本质上,分片是一种水平分区架构。每个碎片都有相同的模式和列,但是有不同的行,并且它们是相互独立的。
分片的主要好处是可伸缩性。借助自动分片架构,您可以根据需要随时向堆栈中添加更多机器,并降低现有机器的负载,从而提高流量和处理速度。它对成长期的应用程序非常有吸引力。
如果想了解更多,可以参考这篇文章(此处)。
SQL 相关问题
#33 什么是不同类型的 SQL 语句?
SQL 语句是高级指令,每条语句负责一项特定的任务。这些陈述通常可以分为五类:
- 数据定义语言(DDL)
*这一系列 SQL 命令用于定义数据库模式。
*例子包括CREATE
、DROP
、ALTER
- 数据操作语言(DML)
*这一系列 SQL 命令用于修改表中的数据。
*例子包括INSERT
、UPDATE
、DELETE
- 数据查询语言(DQL)
*这一系列 SQL 命令对现有的表执行查询。
*例子包括SELECT
- 数据控制语言(DCL)
*这一系列 SQL 命令处理权限和许可。
*例子包括GRANT
、REVOKE
- 事务控制语言(TCL)
*这一系列 SQL 命令用于处理事务。
*示例包括COMMIT
、ROLLBACK
、SAVEPOINT
、
*只有在有 OLTP 操作的情况下才需要这些命令。
# 34 DDL 和 DML 的区别是什么?
他们关系密切。DDL 负责定义表的结构,基本上是什么允许进入表,什么不允许。DDL 可以看作是一组塑造表结构(模式)的规则。在 DDL 定义了模式之后,DML 的工作就是用数据填充表。
#35 标量函数和聚合函数有什么区别?
这两个函数都返回单个值,不同之处在于输入,标量函数对单个值进行操作,而聚合函数对一组值进行操作。我试着用一个例子来说明两者的区别。比如像ISNULL()
、ISNUMERIC()
、LEN()
这样的字符串函数就是标量函数。它们输入单个值并返回单个值。另一方面,AVG()
、MAX()
、SUM()
是聚合函数,它们输入多个值并输出单个值。
#36 什么是数据库视图?
视图是一个虚拟的表。这个虚拟表可以临时保存 SQL 查询的结果,以供将来参考。您可以将它视为一个命名查询,以后可以通过它的名称来引用它,而不必重新编写整个查询。视图的一个优点是,不用创建一个全新的表来存储查询结果,而是创建一个视图来节省磁盘空间。
#37 视图和物化视图有什么区别?
视图结果不存储在磁盘上,每次运行视图时,我们都会得到更新的结果。但是,在物化视图中,事情就不一样了。我们将结果存储在磁盘上,并采用某种机制来保持它们的更新(也称为视图维护)。
当视图被频繁访问时,物化视图是有益的。这样,我们不需要每次都运行它。然而,物化视图有存储成本和更新开销。
#38 什么是常见的餐桌用语(CTE)?
CTE 可被视为临时视图或“内嵌”视图。换句话说,CTE 是一个临时结果集,您可以在另一个SELECT
、INSERT
、UPDATE
或DELETE
语句中引用它。我之所以说 CTE 是一个临时视图,是因为它只能被附加到它的查询使用,而不能在其他地方被引用。
CTE 用WITH
算子定义。下面是 CTE 的简单蓝图。您可以只使用一个WITH
来定义多个 cte,它允许您简化复杂的查询。
不是我最喜欢的,气人,但他们经常被问到
# 39 DROP 和 TRUNCATE 命令有什么区别?
DROP 将整个表删除,并且不能回滚。另一方面,TRUNCATE 会删除该表中的所有行。使用 TRUNCATE,表定义(模式)仍然存在,如果需要,我们可以在将来插入数据。
#40 删除和截断命令有什么区别?
DELETE 和 TRUNCATE 属于两个不同类别的 SQL 命令,前者属于 DML,后者属于 DDL。换句话说,前者在行级别上操作,而后者在表级别上操作。TRUNCATE 一次删除表中的所有行。DELETE 也可以做到这一点,但是它会一行一行地删除它们,这样会花费太多的时间。如果使用 TRUNCATE,则不能回滚数据,但使用 DELETE,可以回滚删除的行。
#41 主键和外键有什么区别?
这些关键字是交叉引用不同表的非常重要的工具。它们也有助于参照完整性。然而,它们在性质上是不同的。一个表只有一个主键。主键 1)可以唯一地标识表中的记录;2)不能接受空值;3)对于大多数 DBMSs,默认情况下,是聚集索引。与主键不同,一个表可以有多个外键。外键 1)是另一个表中的主键;2)不能唯一标识表中的记录;3)可以接受空值,4)不会自动索引。由用户为其创建索引。
# 42 WHERE 和 HAVING 从句有什么区别?
这两个子句都用于通过提供一些条件从结果集中筛选行来限制结果集。然而,有一点不同。WHERE 子句扫描原始数据(逐行)以检查条件并对其进行筛选,但让扫描聚合结果以检查条件并对其进行筛选。因此,在 SQL 查询中,HAVING 位于GROUP BY
之后。总之,WHERE 过滤原始数据,而 HAVING 过滤经过处理的数据。
#43 什么是函数依赖?
如果其中一个属性唯一地标识另一个属性,则表的属性在功能上是相关的。通过一个例子,它变得更加清晰。假设我们有一个带有属性的雇员表:Id、姓名和年龄。在这里,雇员 Id 唯一地标识雇员姓名,因为如果我们知道雇员 Id,我们就可以唯一地说出他/她的姓名。函数相关性用箭头→表示。所以,在这种情况下,我们可以用Id -> Name
来表示
#44 什么是不同的归一化类型?
正常化有许多级别。正如我前面解释的,规范化的目标是避免冗余和依赖。但是,这个目标不是一步就能实现的。每一个规范化步骤(类型)都让我们更接近我们的目标。
我们从非规范化形式的数据(UNF)开始,在 UNF 中,单元格可以有多个值(非原子的),如果我们将这些值分成多个单元格,以确保每个表格单元格都有一个值,并删除重复的行以确保所有记录都是唯一的,那么我们将 UNF 转换为第一范式(1NF)。
下一步是引入主键和外键。在这一步中,我们进一步划分 1NF 表,创建新表,并通过主键和外键连接它们。如果在这些新表中,所有非键属性都完全依赖于主键,那么我们就达到了第二范式(2NF)
虽然有了 2NF,我们已经大大减少了冗余和依赖性,但仍有很大的改进空间。下一步是移除传递性函数依赖,这基本上意味着这样一种情况:如果我们更改一个非键列,我们可能会导致另一个非键列发生更改。为了理清这些非键列,我们必须创建一个单独的表。当我们没有传递函数依赖时,我们就达到了第三范式(3NF)。
在几乎所有的数据库中,3NF 是一个我们无法将数据库进一步分解成更高形式的规范化的点。但是,在一些复杂的数据库中,有些情况下您可以实现更高形式的规范化。
更高形式的规范化是 Boyce-Codd 范式(BCNF)、4NF、5NF 和 6NF,我不想讨论它们。如果你有兴趣了解更多关于这些更高形式的规范化,你可以从维基百科的数据规范化页面阅读它们(此处)。
#45 什么是不同的诚信规则?
有两种类型的完整性规则,如果我们遵守它们,我们可以维护我们的数据库一致性。实体规则和参照规则。实体规则与我们的主键相关,如果我们将一列作为主键,那么它不能有任何空值。引用规则与我们的外键相关,我们的外键必须具有空值,或者它们的值必须是另一个表的主键。
#46 什么是 DML 编译器?
它是一个翻译器。它将 DML 查询从高级语句转换为可由查询评估引擎执行的低级指令。
#47 什么是光标?
光标是一种工具,用户可以使用它来以逐行的方式返回结果。这与典型的 SELECT 语句不同,后者返回整个结果集。通常,我们对完整的行集感兴趣,但是有些应用程序,尤其是那些交互式和在线的应用程序,并不总是能够有效地将整个结果集作为一个单元。这些应用程序喜欢逐行处理数据。游标允许它们执行这种逐行操作。
你可以在下面的例子中看到使用光标的整个过程。
#48 什么是基数?
数据库系统上下文中的基数意味着“唯一性”。例如,当我们说一个列的基数较低时,这意味着它有许多重复值。
参考
- 数据工程师必读的五本书 ( 链接)
- 实施数据治理:实现合规性和数据驱动洞察的分步指南 ( 链接)
- 数据目录:开启商业洞察力的钥匙 ( 链接)
- 元数据管理:数据治理的关键组件 ( 链接)
- 确保数据质量:最佳实践、挑战和解决方案 ( 链接)
- 数据安全:数据工程师的基本考虑 ( 链接)
- 数据完整性与数据质量 ( 链接)
- 探索使用数据集成 API 的好处和挑战 ( 链接)
- 数据处理的发展:ETL 与 ELT——哪一个适合您的业务需求? ( 链接)
- 数据编排 101:了解不同类型的工具及其用例 ( 链接)
- 数据网格:实现以产品为中心的数据架构的概念和最佳实践 ( 链接)
- 从头开始设计数据仓库:技巧和最佳实践 ( 链接)
- 查询优化 101:技术和最佳实践 ( 链接)
- 我挑选的 48 个高级数据库系统面试问题 ( 链接)
- ACID 属性:深入研究数据库系统事务 ( 链接)
- 机器学习模型开发、部署和维护的最佳实践 ( 链接)
- 边缘计算和机器学习:释放实时数据分析的潜力 ( 链接)
- GraphQL 和机器学习:如何构建更好、更智能的应用 ( 链接)
- 特征库:类固醇上的特征工程,缩放机器学习的关键 ( 链接)
- 使用 BigQuery ML 简化机器学习:全面概述 ( 链接)
我希望你喜欢读这篇文章。如果你愿意支持我成为一名作家,考虑报名参加成为一名媒体成员。每月只需 5 美元,你就可以无限制地使用 Medium。
我的灵活推荐 Python 代码
我的额外定制 Python 代码,使您能够基于 Surprise library 的 K-Nearest neighborhood 样式模型运行更灵活的推荐。
照片由merit Thomas在 Unsplash 上拍摄
在我的上一篇博文中,我详细讨论了如何使用惊奇库在 Python 中使用推荐系统,从数据处理到预测和前 N 名推荐。如果你不熟悉这个主题,我建议你先阅读这篇文章,作为对协同过滤推荐系统的介绍,我不会重复其中的段落让你厌烦。
我在开始我的上一篇文章时打了一个比方,蛋糕店里的纸杯蛋糕排起了长队,作为一个消费者,由于资源有限,你无法尝试所有的蛋糕,因此推荐系统非常重要。继续这个类比,如果在我们分析了所有可用的纸杯蛋糕后,有人想出了一个额外的纸杯蛋糕,我们宁愿产生结果而不是重新开始整个过程。(我真的很期待我能弄清楚如何继续类比,以及什么样的封面图片将符合我接下来要写的基于模型的推荐系统的逻辑…)
在使用 Surprise 时,我不喜欢的一点是,为了给新用户做推荐,你必须将用户的评级添加到大量的训练数据中,然后重新拟合你的整个模型。其原因是预测模型建立在相同的类结构之上,对于使用矩阵分解的更复杂的模型,重新拟合是唯一的选择。
在这篇文章中,我将展示如何在不重新运行模型的情况下进行推荐。我们将构建一个推荐器类
- 使用 Surprise library 在大群体中只需计算一次参数,
- 当您输入新的单个用户评级时,返回推荐项目的有序列表。
我们关注的是KNNWithMeans
模型,这是在我的项目中导致最高RMSE
分数的模型类型,但是该方法也可以很容易地针对KNNBasic
或KNNWithZScores
模型进行调整。你可以在我的 GitHub repo 里找到整个项目的代码。
数学背景
正如我提到的,我不想重复我以前的帖子,但我认为有一个关于KNNWithMeans
模型背后的数学公式的快速提醒是很好的。 rᵤᵢ 是用户 u 对项目 i 的评分, μᵢ 是对项目*I【nᵤᵏ(i】所有评分的平均值)是用户 u 评分的项目中“最接近I】*项目的最大 k 数。
surprise 的 KNNWithMeans 模型中的估计用户评分
计划
我们将利用这一事实来估计用户 u 将如何基于他们的其他评价来评价项目 i ,我们需要的是:
- 其他项目的平均评分,或μᵢ;
- 物品之间的相似性,或者说 sim ( i,j )。
我们将创建一个名为KNNWithMeans_Recommender
的类,它有三个参数:
sim_dataframe
:一个pandas
DataFrame
对象,一个带有项目间相似性的方阵。我们不关心使用哪种方法,可以是cosine
、pearson
或MSD
。列名应该与索引名(项目的名称)相同,顺序相同。average_ratings_by_item
: apandas
Series
,每个项目的平均评分,其中指数为项目名称。这将提供KNN
模型的“带手段”部分。k_factor
:一个整数,用于限制我们在评估评级时考虑的相邻项目的数量。
我们稍后将研究如何创建这些参数,现在,我们将重点放在推荐器类上。当我们初始化一个对象时,保存这些参数就是全部了。
该类将有两个功能:estimate_all_for_user
和estimate_item
。
默认情况下,当我们与类交互时,我们将使用estimate_all_for_user
。它将有一个参数,user_input_dict
,这是一个字典,其中条目名称是键,等级是值。(后面我们会看到一个例子。)该函数遍历用户没有评级的项目,并使用estimate_item
函数来估计评级。该函数将返回一个字典,其中键是项目名称,值是估计的评级。
另一个函数,estimate_item
将基本上是我们前面看到的数学公式,使用相似性和每个项目的平均评分。
密码
下一个块包含我们刚刚描述的类的 Python 代码。
请注意,考虑到我们刚刚讨论了结构,我省略了上面要点中的大部分文档字符串和注释。如果你确实想使用代码,我建议从我的 GitHub repo 中复制原文。(有一些命名上的区别,我的项目本来是一个 boardgame 推荐系统,所以“物品”和“游戏”是可以互换使用的。)
如何使用—输入参数
首先,我们将讨论如何为我们的KNNWithMeans_Recommender
对象创建所需的参数。
先说average_ratings_by_item
,我们需要一个pandas
Series
,其中项目名称是指标,评分是数值。我认为您不能从surprise
库中生成这个,但是您可以简单地使用groupby
方法,假设您在一个名为df
的对象中有所有的评级:
avg_ratings_by_item = \
df.groupby('item_name').mean()['rating'].copy()
sim_dataframe
稍微复杂一点。我打算先把所有东西都保存在一个文件里,这样以后更容易利用。我们需要两样东西:相似性和项目名称。
在surprise
中,kNN 类型的模型有一个sim
方法,该方法将以numpy
array
格式返回相似性矩阵,不包含索引。我使用numpy
将它保存在一个名为 pearson_sim 的csv
文件中。
my_sim_option = {'name':'pearson', 'user_based':False}
model = KNNWithMeans(sim_options = my_sim_option, verbose = False)
model.fit(trainsetfull)np.savetxt('./results/pearson_sim.csv', model.sim, delimiter=',')
需要注意两件事:
- 在上面的代码中,我使用了
pearson
相似度,但是还有其他可用的相似度,参见文档。我使用了pearson
,因为这导致了我的项目中最高的RMSE
分数。 - 对于这一步,你从惊喜库中使用哪个 KNN 模型可能并不重要,相似性是以同样的方式计算的。为了保持一致,我们可以使用
KNNWithMeans
。
下一步是获取项目名称,它们将被用作索引和列名。我们可以使用惊喜库的all_items
和to_raw_iid
功能(再次请参考我之前的帖子了解详情)。
trainsetfull_iids = list(trainsetfull.all_items())
iid_converter = lambda x: trainsetfull.to_raw_iid(x)
trainsetfull_raw_iids = list(map(iid_converter, trainsetfull_iids))
我还将这些保存在一个csv
文件中:
with open('./results/item_ids_for_sim_matrix.csv', 'w') as f:
writer = csv.writer(f)
writer.writerows(zip(trainsetfull_raw_iids, trainsetfull_iids))
然后在项目的后期,我将这两个文件,评级和项目列表合并到一个名为pearson_sim
的DataFrame
中。这将是我们创建推荐对象时要传递的参数。
pearson_sim = \
pd.read_csv('./results/pearson_sim.csv', header = None)sim_matrix_itemlist = \
pd.read_csv(
'./results/item_ids_for_sim_matrix.csv', header = None)pearson_sim.columns = sim_matrix_itemlist[0]
pearson_sim.index = sim_matrix_itemlist[0]
将结果保存在文件中并将它们组合起来并不是最有效的解决方案,但是我发现这是一种干净的结构,可以方便地在过程的不同区域处理这些结果。
如何使用—预测
好了,有趣的部分来了!
首先,我们需要导入该类,假设您将文件命名为 recomm_func.py:
from recomm_func import kNNWithMeans_Recommender
然后,您可以通过传递我们刚刚讨论过的两个输入参数和一个用于k_factor
的整数来初始化一个新对象:
recommender = kNNWithMeans_Recommender(
pearson_sim, average_ratings_by_item, 10)
正如我提到的,我用这个项目来建立一个棋盘游戏推荐器,一个用户输入的例子是,如果你喜欢棋盘游戏,你可以看到这个测试用户更喜欢欧洲风格的标题:
user_input = {
'Le Havre': 8,
'Concordia': 9,
'The Castles of Burgundy': 8,
'Mansions of Madness: Second Edition': 5,
'Kingdom Death: Monster':6
}
estimate_all_for_user
方法返回一个包含所有项目和估计评分的字典,下面块中的下一行根据评分对它们进行排序,这样我们可以很容易地确定推荐给用户的前 N 个游戏。
estimated_ratings = recommender.estimate_all_for_user(user_input)sorted_ratings = \
sorted(estimated_ratings.items(), key=lambda x: x[1])
通过对 sorted_ratings 进行切片,我们可以获得前 10 个推荐:
sorted_ratings[-10:]
将返回以下列表:
[('Agricola', 7.436929246134879),
('Agricola (Revised Edition)', 7.456466489174002),
('Through the Ages: A New Story of Civilization', 7.46818223297934),
('Orléans', 7.4808225652209),
('Terra Mystica', 7.498203401133102),
('Terraforming Mars', 7.5063889188525685),
('Gaia Project', 7.621611348138763),
('Puerto Rico', 7.665136353318606),
('Great Western Trail', 7.786750410443334),
('Brass: Birmingham', 7.82265622044594)]
再一次,作为一个桌游爱好者,这些建议对我这个特定的测试用户来说是有意义的。
通过从前面分割sorted_ratings
列表,该代码还可以用于制作反推荐,即用户可能不喜欢的项目。如果你对其他不同的测试用户推荐感兴趣,请查看这款 Jupyter 笔记本的结尾。
结论
这就结束了我们在定制推荐功能上的工作。在我看来,一旦建立起来,这个类使用起来真的很方便,而且它使我的项目的代码结构更加精简。一个额外的优势是,你可以利用从早期阶段保存的惊喜库的结果,而不必依赖于当前环境中的库。
我希望你觉得它有用,请随意在你的项目中使用代码,如果你遇到任何问题,请告诉我。
参考
[## 欢迎使用“惊喜”文档!-惊喜 1 文档
如果您对惊喜感到陌生,我们邀请您看一看入门指南,在那里您会找到一系列…
surprise.readthedocs.io](https://surprise.readthedocs.io/en/stable/index.html) [## 如何使用 Python Surprise 构建基于内存的推荐系统
使用 Python 中的 Surprise 库实现 kNN 风格推荐引擎的分步指南,来自 data…
towardsdatascience.com](/how-to-build-a-memory-based-recommendation-system-using-python-surprise-55f3257b2cf4)
我的蟒蛇熊猫小抄
作为一名数据科学家和软件工程师,我每天都在使用熊猫的功能
一位导师曾经告诉我,软件工程师就像索引而不是教科书;我们不会记住所有的东西,但是我们知道如何快速查找。
能够快速查找和使用函数,可以让我们在编写代码时达到一定的流程。所以我创建了这个函数清单,我每天都用它来构建网络应用和机器学习模型。
这不是一个全面的列表,但是包含了我最常用的函数,一个例子,以及我对什么时候它最有用的见解。
内容: 1)设置
2)导入
3)导出
4)查看和检查
5)选择
6)添加/删除
7)合并
8)过滤
9)分类
10)聚集
11)清洗
12)其他
13)结论
1)设置
如果你想自己运行这些例子,从 Kaggle 下载动漫推荐数据集,解压后放到你 jupyter 笔记本的同一个文件夹里。
接下来运行这些命令,你应该能够复制我的以下任何函数的结果。
import pandas as pd
import numpy as npanime = pd.read_csv('anime-recommendations-database/anime.csv')
rating = pd.read_csv('anime-recommendations-database/rating.csv')anime_modified = anime.set_index('name')
2)导入
加载 CSV
将 CSV 直接转换为数据框。有时从 CSV 加载数据也需要指定一个encoding
(即:encoding='ISO-8859–1'
)。如果您的数据框包含不可读字符,这是您应该尝试的第一件事。
另一个类似的函数叫做 excel 文件的pd.read_excel
。
anime = pd.read_csv('anime-recommendations-database/anime.csv')
从输入的数据构建数据框架
当您想要手动实例化简单数据时非常有用,这样您就可以看到数据在管道中流动时是如何变化的。
df = pd.DataFrame([[1,'Bob', 'Builder'],
[2,'Sally', 'Baker'],
[3,'Scott', 'Candle Stick Maker']],
columns=['id','name', 'occupation'])
df.head()
复制数据框
当您想要在保留原始数据框副本的同时对数据框进行更改时,此功能非常有用。加载完所有数据帧后立即copy
是一个很好的做法。
anime_copy = anime.copy(deep=True)
3)出口
保存到 CSV
这会转储到与笔记本相同的目录中。我只保存下面的前 10 行,但你不需要这样做。同样,df.to_excel()
也存在,功能基本相同,为 excel 文件。
rating[:10].to_csv('saved_ratings.csv', index=False)
4)查看和检查
获取顶部或底部n
记录
显示数据框中的第一个n
记录。我经常在笔记本的某个地方打印一个数据框的顶部记录,这样如果我忘记了里面的内容,我就可以参考它。
anime.head(3)
rating.tail(1)
计算行数
这本身不是一个 pandas 函数,但是len()
计算行数,并且可以保存到一个变量中并在其他地方使用。
len(df)
#=> 3
计算唯一的行
对列中的唯一值进行计数。
len(ratings['user_id'].unique())
获取数据框信息
有用的获得一些一般信息,如标题,值的数量和列的数据类型。一个类似但不太有用的函数是df.dtypes
,它只给出列数据类型。
anime.info()
获取统计数据
如果数据框包含大量数值,这将非常有用。了解评级列的平均值、最小值和最大值可以让我们了解数据框的整体外观。
anime.describe()
获取值的计数
获取特定列的值的计数。
anime.type.value_counts()
5)选择
获取列的值列表或系列
如果您需要将列中的值放入X
和y
变量中,这样您就可以适应机器学习模型,那么这种方法是有效的。
anime['genre'].tolist()
anime['genre']
动漫【流派】。tolist()
动漫[‘流派’]
获取索引值列表
从索引创建值列表。注意我在这里使用了anime_modified
数据框,因为指数值更有趣。
anime_modified.index.tolist()
获取列值列表
anime.columns.tolist()
6)添加/删除
用设定值追加新列
当我在两个独立的数据帧中有测试和训练集,并希望在组合它们之前标记哪些行与哪些集相关时,我有时会这样做。
anime['train set'] = True
从列的子集创建新的数据框
当您只想保留大型数据框中的几列,而不想指定要删除的每一列时,这种方法非常有用。
anime[['name','episodes']]
删除指定的列
当您只需要删除几列时非常有用。否则,把它们都写出来会很乏味,我更喜欢前一个选项。
anime.drop(['anime_id', 'genre', 'members'], axis=1).head()
添加包含其他行总和的行
我们将在这里手动创建一个小数据框,因为这样更容易查看。这里有趣的部分是df.sum(axis=0)
,它将各行的值相加。或者,df.sum(axis=1)
将各列的值相加。
当计算计数或平均值时,同样的逻辑也适用,即:df.mean(axis=0)
。
df = pd.DataFrame([[1,'Bob', 8000],
[2,'Sally', 9000],
[3,'Scott', 20]], columns=['id','name', 'power level'])df.append(df.sum(axis=0), ignore_index=True)
7)合并
连接两个数据帧
如果您有两个具有相同列的数据框,并且想要合并它们,请使用此选项。
在这里,我们将一个数据帧一分为二,然后将它们重新组合在一起。
df1 = anime[0:2]df2 = anime[2:4]pd.concat([df1, df2], ignore_index=True)
合并数据帧
当您有两个数据框并且想要在一列上连接时,这类似于 SQL 左连接。
rating.merge(anime, left_on=’anime_id’, right_on=’anime_id’, suffixes=(‘_left’, ‘_right’))
8)过滤
检索具有匹配索引值的行
anime_modified
中的索引值是动漫的名称。请注意我们如何使用这些名称来获取特定的列。
anime_modified.loc[['Haikyuu!! Second Season','Gintama']]
按编号索引值检索行
这与之前的功能不同。使用iloc
,第一行的索引为0
,第二行的索引为1
,以此类推……即使您已经修改了数据框,并且现在在索引列中使用字符串值。
如果您想要数据框中的前 3 行,请使用此选项。
anime_modified.iloc[0:3]
获取行
检索列值在给定列表中的行。anime[anime[‘type’] == 'TV']
在匹配单个值时也有效。
anime[anime['type'].isin(['TV', 'Movie'])]
切片数据帧
这就像分割一个列表。对数据帧进行切片,以获取指定索引之前/之间/之后的所有行。
anime[1:3]
按值过滤
过滤满足条件的行的数据框。请注意,这将保持现有的索引值。
anime[anime['rating'] > 8]
9)分类
排序值
按列中的值对数据框排序。
anime.sort_values('rating', ascending=False)
10)聚集
分组和计数
计算列中每个不同值的记录数。
anime.groupby('type').count()
Groupby 和聚合列的方式不同
注意,我添加了reset_index()
,否则type
列将成为索引列——我建议在大多数情况下也这样做。
anime.groupby(["type"]).agg({
"rating": "sum",
"episodes": "count",
"name": "last"
}).reset_index()
创建数据透视表
对于从数据框中提取数据子集来说,没有比数据透视表更好的了。
请注意,我已经对数据框进行了严格的过滤,这样可以更快地构建数据透视表。
tmp_df = rating.copy()
tmp_df.sort_values('user_id', ascending=True, inplace=True)
tmp_df = tmp_df[tmp_df.user_id < 10]
tmp_df = tmp_df[tmp_df.anime_id < 30]
tmp_df = tmp_df[tmp_df.rating != -1]pd.pivot_table(tmp_df, values='rating', index=['user_id'], columns=['anime_id'], aggfunc=np.sum, fill_value=0)
11)清洁
将 NaN 单元格设置为某个值
将NaN
值的单元格设置为0
。在这个例子中,我们创建了与之前相同的数据透视表,但是没有fill_value=0
,然后使用fillna(0)
来填充它们。
pivot = pd.pivot_table(tmp_df, values='rating', index=['user_id'], columns=['anime_id'], aggfunc=np.sum)pivot.fillna(0)
12)其他
对数据帧进行采样
我一直用这个从一个大的数据框架中抽取一个小样本。它允许随机重新排列行,同时保持索引。
anime.sample(frac=0.25)
迭代行索引
迭代数据框中的索引和行。
for idx,row in anime[:2].iterrows():
print(idx, row)
启动 jupyter 笔记本
以非常高的数据速率限制启动笔记本电脑。
jupyter notebook — NotebookApp.iopub_data_rate_limit=1.0e10
13)结论
我希望这也能成为你的参考指南。随着我发现更多有用的熊猫功能,我会不断更新。
如果有任何你离不开的功能,请在下面的评论中发表!