TowardsDataScience 博客中文翻译 2021(三百四十三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

到目前为止我是如何(不正确地)使用朴素贝叶斯的——第 2 部分

原文:https://towardsdatascience.com/how-i-was-using-naive-bayes-incorrectly-till-now-part-2-d31feff72483?source=collection_archive---------14-----------------------

这篇文章旨在帮助你更好地理解朴素贝叶斯

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片和编辑归我姐姐(https://www.instagram.com/the_snap_artistry/)

这是第 1 部分的继续,

https://gautigadu091.medium.com/how-i-was-using-naive-bayes-incorrectly-till-now-part-1-4ed2a7e2212b

在这篇文章中,我将讨论以下内容(粗体)。如果你是朴素贝叶斯的新手或者想要快速复习,请查看我的笔记开始。

1。为什么在朴素贝叶斯中我们假设特征是条件独立的?

2。Sklearn 有 GaussianNB,MultinomialNB,CategoricalNB,BernoulliNB →给定的数据有类别,数值,二元特征你会选择哪个模型?

3。如何对文本数据从头实现多项式朴素贝叶斯,并用 Sklearn MultinomialNB 匹配结果?

4。如何对分类数据从头实现分类朴素贝叶斯,并用 Sklearn CategoricalNB 匹配结果?

5。如何对数值型数据从头实现高斯朴素贝叶斯,并用 Sklearn GaussianNB 匹配结果?

⑥。朴素贝叶斯的训练和测试→时间和空间复杂度有哪些?

7。朴素贝叶斯是否受到不平衡数据的影响,如果是,如何解决?

8。离群值是如何影响朴素贝叶斯的?

9。朴素贝叶斯可解释吗,我们能说出哪些特征帮助我们预测了一个特定的类吗?

10。如何避免朴素贝叶斯中的过拟合或欠拟合问题?**

让我们开始吧,

5。如何对数值型数据从头实现高斯朴素贝叶斯,并用 Sklearn GaussianNB 匹配结果?

  1. 预处理数据。
  2. 基于类别计算每个特征的均值和方差。
  3. 计算后验概率。

数据预处理

  • 我正在对目标变量进行一次性编码,就像我们在 MultinomialNB 和 CategoricalNB 实现中所做的那样。

基于类计算每个特征的均值和方差。

  • 首先,提取特定类别的数据点,然后计算每个特征的平均值和方差。
  • 我也在计算目标变量的数量,我们将很快用它来计算先验概率。

假设您正在对数据进行二元分类,以下是计算类 0 中要素 fj 的均值和方差的过程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于目标值计算特定特征的数据点的均值和方差。

计算后验概率

在高斯朴素贝叶斯中,似然性被假设为来自高斯分布,这意味着似然概率遵循以下等式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ref:https://sci kit-learn . org/stable/modules/naive _ Bayes . html # Gaussian-naive-Bayes

当我们在两侧应用对数时,我们得到以下关系:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将我们的结果与 Sklearn 进行比较:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上述代码的输出

答对了。!—结果匹配,您可以找到概率的最大值来获得预测类值。

5。朴素贝叶斯的训练和测试时间和空间复杂度是多少?

对于训练—我们需要计算 count_matrix 并存储所有可能的组合。在最坏的情况下,假设在 n 个数据点中,我们有 n 个类别(每个数据点有一个唯一的类别)、d 维以及 c 类。

那么时间复杂度是 O(ndc),空间复杂度也是一样的 O(ndc)我们要在内存中存储那些很多的组合。

在测试中,时间复杂度是 O(d*c ),只需获取并乘以每个类的所有 d 维表。

7。朴素贝叶斯是否受到不平衡数据的影响,如果是,如何解决?

是的,朴素贝叶斯受到不平衡数据的影响。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尽管似然概率在某种程度上是相似的,但是后验概率受到先验概率的严重影响。在上面的例子中,+ve 类的先验概率是-ve 类的 9 倍,朴素贝叶斯的这种差异造成了+ve 类的偏差。

一个简单的解决方案是忽略先验概率。(或)可以欠采样或过采样。

还有一个叫做 ComplementNB 的高级朴素贝叶斯,它是专门为处理不平衡数据而设计的,它也有一个 sklearn 实现。此外,检查这个研究论文

8。离群值是如何影响朴素贝叶斯的?

在类别中 NB →如果在测试数据中,如果我们得到了训练数据中没有的新类别。因此,这一类别将没有可能的概率,结果为零。为了避免这种零概率问题,我们做拉普拉斯平滑。

在高斯 B →中,剔除异常值是很重要的,一个异常值会影响均值和方差,因此,所有的似然概率都会受到影响。

在多项式中,最好删除出现频率非常低的单词,因为可能性概率非常小。

但是我在很多地方读到,如果你在文本数据中找到一个新单词,那么这个概率是零。

但是,当您将文本转换为矢量时,基本上是对训练数据执行 vectorizer.fit _ transform(),对 CV 和测试数据执行 vectorizer.transform()。因此,基本上 CV 和 test 的向量是使用训练的词汇生成的。那么,这种新词出现在文本数据中的情况是不可能的。测试数据的向量长度将与训练数据的向量长度完全相同。

9。朴素贝叶斯可解释吗,我们能说出哪些特征帮助我们预测了一个特定的类吗?**

根据似然概率,我们可以解释模型,似然概率越高,越有助于我们对其进行分类。

10。如何避免朴素贝叶斯中的过拟合或欠拟合问题?

NB 中唯一的超参数是 alpha →较高的 alpha 将给出几乎相同的概率→这是欠拟合,较低的 alpha 值将使模型欠拟合。(查看注释中的示例)

11。朴素贝叶斯是线性分类器吗,它能解决非线性的决策边界吗?

根据这篇研究论文,朴素贝叶斯是一个线性分类器,但是在对数尺度上。关于这一点的直觉解释如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

参赛作品:https://people.csail.mit.edu/jrennie/papers/icml03-nb.pdf

但是我试着用一个玩具数据集来验证这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我用高斯朴素贝叶斯拟合模型并绘制等高线,得到了一个清晰的非线性决策边界。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面是相同的输出,但使用对数标度。我甚至尝试使用 base-e,但是没有得到我期望的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对数标度输出

如果你们中的任何人对此有什么要分享的,请在这个帖子下评论。

非常感谢你💖阅读这篇文章,我希望你对朴素贝叶斯的工作原理有一个清晰而深刻的理解。

你可以在这个 GitHub 链接中找到完整的代码。你也可以在 LinkedIn 上和我联系。

参考资料:

  1. https://scikit-learn . org/stable/modules/naive _ Bayes . html # naive-Bayes
  2. 应用人工智能课程

我是如何在开源开发中浪费了两年时间

原文:https://towardsdatascience.com/how-i-wasted-two-years-in-opensource-development-9be71491ce62?source=collection_archive---------19-----------------------

让我成长的副业失败的故事

我是一个开源的爱。我在 2006 年开始开发一个开源项目,这是我职业发展的秘密。感谢我在这次旅行中所做的实验,我现在是一个更好的开发者,并且我对社区有所回报——几乎我希望如此。

我在这里写了我对开源作为公司和开发者成长的驱动力的看法,但那是另外一个故事了😄

在这篇文章中,我想谈谈我在一个名为 RawCms 的开源低代码平台上,从 2018 年开始的经历。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

善良好奇的 Unsplash 上的照片

项目的失败

该项目最初是一个辅助项目,旨在改进即将推出的 Asp.net 核心 3.1,并探索利用非结构化数据加速开发过程的机会。

在此期间,我遇到了许多挑战,最终我实现了一个可行的 POC。这是一个巨大的成果,我必须多次感谢伊曼纽·布卡雷利吉拉尔登戈以及所有其他二十多位贡献者。我们克服了所有的技术限制,并让它发挥作用。一些话题处于边缘,这让我参加了最重要的欧洲。网络会议来解释我们所学的知识。

此外,当我们意识到没有机会让它成长为一个真正的产品(没有赞助,也没有太多的社区支持)时,我们决定将这个项目存档,我开始回想我们已经做了什么。

我认为并且仍然认为这里的 t 不是产品定义中的漏洞。RawCms 的目标是做开发者将来真正需要的事情,但这太难理解了。解决了我们在这个过程中发现的所有的复杂性是伟大的,但是我们需要复杂性来对抗复杂性。这使得每个人都很难进入应用程序逻辑并做出贡献。

所有这些复杂性吓到了即将到来的开发者。

这可能就是为什么我们对这个项目的兴趣消失了,我们放弃了这个项目。如果一个开源项目的时间非常痛苦,那就很难向它捐赠。

在这一点上,在忘记这个项目之前,我想回顾一下,想想什么可行,什么不可行。

最后的结论是,我们选择了最差的技术来满足我们的需求。

为了说服我内心拒绝真相的那个人,我从头开始重新实施这个项目。我用 Symfony 而不是。Net 和我已经有了一个可用的 POC。还没有相同的特性集,但是我很确定在新的设置中,我们不会再发现任何问题。那教会了我很多。

我怎么能在两天内完成两年的事情呢?

这个问题的答案吓了我一大跳,我在想我错在哪里了。在接下来的部分,我会告诉你我犯了什么错误,以及我如何做得更好。

正确工作的工具

我不是最后一个到达的。Net 技术。我从 2005 年开始从事 it 工作,交付了许多大型企业项目,并受邀参加了许多会议来分享我的经验。但是我只是拿错了工具。我仍然认为。Net framework 可能是企业应用程序的最佳框架,在生产率和开发经验方面,C#语言没有对手。**问题是我选择它只是因为这是一个让我更有信心的框架。**对我来说,. Net 解决方案是最有机会成功的。我错了。自从我开始这个项目,我必须管理一些功能。Net 本身不支持,我不得不克服任何一个问题。我说的是管理非类型化数据(特别是在数据库映射和 GraphQL 中),拥有一个可插拔的架构并在其上嵌入一个模块化的 SPA。顺便说一下,当我试图用 Symfony 做同样的事情时,我发现它已经可以使用了。提到的每一个问题都是框架中包含的一个特性,所以我只需要把事情放在一起,而不是发明任何东西。为这项工作选择错误的工具是我的第一个错误。

坚持下去是邪恶的

犯错是人之常情,但坚持犯错却是恶魔之举!当我试图让事情运转起来时,我以自己的代价学到了这一点。这对我来说是一个巨大的教训。在巨大的困难面前,放弃并不总是一种软弱,有时也是聪明的证明。我没有在困难面前止步,我战胜了野兽,但是后来呢?完成这项工作的成本是巨大的,这意味着大量的时间和的努力毫无意义,除了一次美妙的经历和能力,让我(虚拟地)周游世界讲述我的故事。

我在这里学到的是,我们从来没有在一个问题面前投降,但当你是世界上唯一一个面对这种复杂性的人…

问问你自己问题出在哪里,是你自己还是你正在解决的事情?

在源代码之前传播愿景

我在这个项目中遇到的另一个大问题是,参与这个项目的学习曲线非常长。这对我来说非常痛苦,因为我必须花很多时间帮助贡献者建立他们的环境,理解如何实现任务,并在实现过程中帮助他们。问题是,在大多数情况下,他们不知道自己在做什么。他们大多是年轻开发人员学生,面对所有这些复杂性,他们迷失了方向。他们可能也不会理解为什么他们被要求做任何改变,最终的结果是很多第一次贡献者,我花了很多时间来介绍这个项目,但只完成了几个小任务。如果我们有一个更简单的系统,基于像 Symphony 这样的流行框架,并有一个他们可以找到答案的社区,这种情况就不会发生。所以,我从这个项目中学到的是分享你的愿景,并很好地解释项目的目标是什么。有贡献者是很好的,但是如果他们不能提供帮助,这个项目将会留在你的肩上,你工作的唯一成果就是培训人们去做一些他们很快就会放弃的事情。

带什么回家

为开源世界做贡献对我来说仍然很美好。想到我在 RawCMS 项目上浪费的时间,我一点也不觉得这是浪费。如果我想到切实的结果,是的,它是失败的。我花了很多时间,我只有一个没有用户的半工作项目。我没有赚到钱,也没有人对我所做的表示感谢。

这似乎是失败者的游戏,但我认为不是。我仍然相信开源贡献的价值。

我从这次经历中获得的真正价值是:

  • 学到了新的东西(非常前沿的话题),这将使我作为专业人士更有价值
  • 我被邀请参加许多国际会议来解释我所学到的东西
  • 帮助您的开发人员开始他们的开发之旅
  • 我遇到了很多像我一样相信开源精神的伟大的人
  • 回馈社会

嗯,看着所有这些无形的结果,我真的很高兴浪费了两年的业余时间来创建一个失败的项目!

参考

我是如何从学术顾问变成数据分析师的

原文:https://towardsdatascience.com/how-i-went-from-an-academic-advisor-to-a-data-analyst-e7a50742fe2?source=collection_archive---------29-----------------------

从大学零数学课到数据科学职业生涯

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

安德鲁·尼尔Unsplash 上拍照

有时候有人问我,我是如何从学术咨询职业转向数据分析的。在这篇文章中,我解释了我的职业生涯和数据之旅——包括我寻找的机会和我偶然发现的机会。

编程开端

在过去的几周里,我一直在反思我是如何开始这个编程和数据分析师之旅的,以及我选择学习的工具和原因。在我开始概述这篇博文之前,我认为我在 2017 年首次编写了任何东西。但是现在,我回忆起 2015 年的时候,我涉足了一些编程。我甚至不记得我用的是哪种语言(可能是 Java),只记得是通过一个自我指导的在线程序。我知道我想获得技术技能,但不知道我最终想如何应用这些技能,我相信我的编程工作只持续了几周到几个月。虽然我不太记得当时我为什么放弃了编程,但我可以想象如果我的工作成果不与具体的项目或目标相关联,我将很难继续下去。在那个时候,学习的结果与任何具体的东西都没有联系——只是与我想编程的短暂想法有联系。当我还是一名学术顾问的时候,这种“想要编程的事情”就发生了。经过几年的学术咨询和一两年成为程序员的渴望,我被提升为项目协调员。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

奥莱娜·谢尔坚科Unsplash 拍摄的照片

攻读数据分析学位

当我在 2015 年开始担任项目协调员时,我确实发展了一些技术数据技能——主要是使用 Excel 作为我的工具。我学了不同的 Excel 函数。我学习了数据透视表。虽然我仍然讨厌在 Excel 中创建可视化效果,但我也学会了如何创建它们。我最终参与的数据团队举办了几次 Excel 研讨会,我也参加了。尽管我所做的项目协调员工作不需要统计数据,但在给出一些令人信服的理由说明这些技能最终会对我的部门有用后,我被允许使用一些专业发展基金参加为期一周的统计会议。

但是,即使在学习和应用某些基本技术技能以及获得统计学概念的简短介绍(或再介绍)时,我知道我只是触及了我能从数据中做什么和学到什么的皮毛。我在 2017 年开始了一个统计证书项目,希望学习我在数据职业生涯中需要学习的东西。我最初的目标是完成应用统计学的四门课程证书。我的目标是每学期上一门课,慢慢地完成我的课程。对我来说重要的是,我可以保持我的常规爱好,并保持我的大部分日常事务不变。我的新课程必须适应我的生活,我不想做太多事情来适应我的课程生活。为了实现这一点,对我来说很重要的是,该计划是在线的,但在这种交付模式下有着稳固的声誉。

当我三门课程进入四门课程证书时,我觉得我有了这个伟大的工作-生活-学校平衡,我想继续学习。我计算了在数据领域获得硕士学位的潜在投资回报率,并决定继续攻读更高的学位——仍然每学期只上一门课(这是我做过的最好的事情!).当我选择研究生学位时,我有两个项目可以选择,我的证书课程可以转到:统计学硕士或数据分析硕士。我决定攻读数据分析硕士学位有两个主要原因。数据分析选项侧重于商业环境中的数据,包括预测分析和数据挖掘;这就是我感兴趣的。此外,从实践的角度来看,对于统计学项目,我必须修三门微积分课程。说白了就是‘不’和‘谢谢’。我记得在高中,在微积分预科之后,我可以选择微积分或者统计学,我选择了统计学。我也相信,是的,我本可以上三门微积分课,并且学得很好,因为我现在知道了我在高中时不知道的事情——我不能简单地通过潜移默化来学习东西,如果有些事情不容易,并不意味着那件事情不适合我。但尽管如此,我还是不想上三门微积分课,那样会耽误我拿到学位。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unsplash 上由 Carlos Muza 拍摄的照片

我的第一份数据分析师工作

在这些分析课程中,我使用了各种工具——包括 Minitab、SAS、KNIME 和我心爱的 r。虽然我使用了各种工具,但我只是触及了它们有用性的皮毛。直到我被提升为公司的数据分析师,我才开始深入了解一些技术工具,主要是 R 和 SQL。

事后看来,我组建团队的时机非常好。在我加入之前,该团队仅使用商业智能来提取数据。然而,在我加入团队前不久,我获得了直接从 SQL 数据库中提取数据的许可。该团队最近使用了这个数据库,这意味着可以访问比商业智能工具更多的数据。团队也是第一次学习 SQL。此外,该团队过去主要使用 SAS,但最近雇佣了一个懂 Python 的人,发现他们并不真正关心我们使用哪种编程语言或工具——至少对于特别分析来说是这样。所以我可以自由地使用 R——我已经在程序中熟悉了它——并乐于学习 SQL——除了 SELECT、FROM 和 WHERE 之外,我对 SQL 一无所知。

和我一起工作的数据团队非常棒,他们专注于打造一个强大的团队。和我一起工作的团队的第一个主管会问我,“你有什么想做的吗?”回答了这个问题,我开始了文本分析,在一些重要的,但以前从未涉及的定性数据中寻找主题。我从未从事过分析文本的工作,即使我把它作为一个项目提出来,但我从整洁的角度从整洁的文本挖掘中学到了文本分析。我从团队中一位更资深的成员对我的第一个数据项目的具体反馈中学到了如何讲述一个数据故事。我有机会自动化一些以前的手动流程。我也有机会管理一个出色的实习生。在管理实习生的过程中,我必须学会如何管理一个项目和一个人,让项目保持在一定范围内并向前发展。而且,通过阅读我的实习生的代码和我们互相交流想法,我学到了更多的技术技巧和选择。和我的实习生一起,我建立了一个预测模型。

随着时间的推移,我们作为一个数据团队在使用 SQL 方面变得更加成熟。我们开始创建有意义的 SQL 视图,这些视图可以连接到我们面向最终用户的商业智能工具。这些视图通常用于运营和跟踪关键指标。我们开始召开关于数据质量的会议,开发代码标准和代码库。我们通过午餐和学习非正式和正式地分享知识。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Charles DeluvioUnsplash 上拍摄的照片

自我导向学习

但是我也喜欢在业余时间学习。我参加了关于 R 和 SQL 的免费和便宜的在线自学课程。我看了教程。我不怕尝试。当我想不通的时候,我不认为我是一个失败者。嗯,有时候我可能确实认为自己是个失败者,但我坚持下来了。我要么找到一种不同的方法来做某事,要么阅读文档,要么在第二天早上神奇地修复它(如果可能的话,不要在午夜之后编码)。不管那是什么东西,最终能工作是一件非常愉快的事情。当我终于让我的第一个 R 闪亮仪表板开始工作时,凌晨 1 点我的客厅里一片欢腾。

四年后我获得了数据分析硕士学位。不久之后,我开始在 GitHub 上建立自己的个人项目组合,这样我就可以展示我在预测分析和使用代码提高效率方面的技能。

新工作和新知识

也许,部分是因为我在 GitHub 上的项目,我发现自己在另一个伟大的数据团队中,一个优先考虑学习和知识共享的团队。现在我正在学习其他伟大的工具,包括 Python 和 dbt。我对数据工程有了更深的理解,对一个数据分析师来说,在软件开发原则的框架下工作意味着什么。我也在学习和欣赏预测的概率方法。我也被挑战去更多地检查我的假设,去思考我的想法可能是错误的。在一个全新的行业——医疗保健技术——我正在学习做好这份新工作的重要背景。

我最近的个人项目融合了我正在学习的东西,包括 Python、测试和预测的概率方法。

即使我“了解”R 和 SQL,我仍然会定期学习一些新东西。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由基兰伍德Unsplash 上拍摄

没有什么是神奇的/你可以学到任何东西

虽然我认为在我开始编码之前,我可能已经在智力上知道‘没有什么是神奇的’,甚至可能是它让我认为学习编程是可能的,但在过去三年多的时间里学习这些不同的编程语言和工具让我从骨子里相信了这一点。我知道我并不总是相信我能学到任何东西。但我现在知道,如果我读足够多的书或看足够多的教程,那么我就能知道一些东西。如果我阅读,参加会议,再阅读同样的东西,那么我会知道得更多一点。因为没有什么是魔法。是的,如果我想学东西,我可以,因为我可以学任何东西。而且,如果你想学点什么,那么你可以学,因为你也可以学任何东西。

我已经提到了各种工具,任何看我的 Twitter 的人都会知道我对 R 的热爱根深蒂固。我确实认为与其他语言相比,这门语言有一些非常优雅的地方;例如,比起熊猫,我更喜欢 dplyr 套餐。然而,我相信所有的语言都有各自的长处和短处。不过,我最喜欢 R 的地方与语言本身无关。我喜欢 R 的热情社区,我相信 RStudio 的开发者为社区和语言的发展指明了方向,这是其他语言社区所缺乏的。也就是说,客观地说,了解 Python 可能会打开更多的职业机会——尽管我认为这取决于你在寻找什么类型的数据工作。

我认为建立和了解好的编程原则是对时间的最好利用,即使你并不总是在盛怒之下应用每一个原则。我认为 Python 的禅很好地确立了这些原则,并且适用于大多数语言。

如果你订阅了语言相对论,用某种语言说话或编程可能会让你以某种方式思考。想象一下,你可以用 R、Python 和 Julia(或其他语言)来解决一个问题。这创造了灵活性,并可能在解决问题的过程中培养一些创造力。事实是,就工具而言,特别是就 R 或 Python 而言,如果你幸运的话,最终可能会是 R、Python 和 SQL。

所以,如果你曾经想知道一个人如何从学术顾问变成数据分析师和数据开发员,这就是我如何做到的。

原载于 2021 年 5 月 8 日https://Whitney Michelle . netlify . app

我是如何从一名销售工程师成为深度学习/计算机视觉研究工程师的

原文:https://towardsdatascience.com/how-i-went-from-being-a-sales-engineer-to-deep-learning-computer-vision-research-engineer-8882272a1a6?source=collection_archive---------6-----------------------

当我的职业生涯转向 DL/ML/CV 时,我希望得到的指导、提示和建议。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

亚历山大·奈特Unsplash 上拍照

随着当前深度学习/机器学习的热潮,越来越多的人希望改变自己的领域,进入这个令人兴奋的领域。然而,对于任何不是来自这个领域的人来说,迈出第一步都是令人畏惧的。这就是为什么我想分享我作为深度学习/计算机视觉研究工程师从西门子医疗保健公司的大客户经理到成为辉固全球创新团队一员的历程。我先简单介绍一下我自己的背景,然后是我走到这一步的步骤。如果您想滚动并跳到您感兴趣的部分,下面是目录。

  • 介绍
  • 我从技术销售角色中学到的前 5 点
  • 硕士学位是转行的踏脚石
  • 编码/编程熟练程度
  • 学习触摸打字[可选但推荐]
  • 获取知识的在线大学课程或 MOOCs
  • 想获得一些实践经验
  • 谷歌 Colab 训练你的模型
  • 深度学习(计算机视觉)的库很少
  • 求职技巧
    ♀简历
    ♀LinkedIn
    ♀弥补经验差距
    ♀求职门户
    ♀直接在公司网站上申请
  • 结论

介绍

我在孟买大学获得了电子和电信工程学士学位。我是一个懂技术的人,热爱技术。在那些日子里,我对嵌入式系统充满热情,并与微控制器、传感器和致动器一起工作来构建东西。创建我自己的印刷电路板,焊接元件,编程控制器,与计算机接口等。对我来说超级刺激。我创建了一个关于微控制器和电子的博客,并且喜欢写关于概念和项目的技术文章。

毕业后很想加入行业做技术专业,做研发。然而,我没有在校园安置之外寻找工作。我得到了 TCS 的一份工作,但作为一家梦想中的公司,我得到了参加西门子校园招聘的机会。我设法通过了面试。虽然我已经表明我想做 R&D,他们没有为这种情况招聘。我得到了一份毕业实习工程师的工作,并接受了。它表示,最终发布将基于业务需求。

这个角色是一个技术销售角色,我完全惊呆了,因为我做梦都没想到会是这样。我仍然收到了 TCS 的邀请,并在考虑转行。然而,我最终还是加入了西门子。我必须说,事实证明这是一个好决定。这段经历让我在职业和个人方面都有所成长。我觉得每个人在职业生涯中都应该重点关注这五点。

我从技术销售角色中学到的前 5 点

  1. 软技能比你想象的更重要。口头和书面沟通技巧同等重要。你可能是个天才,但除非你能把自己的想法连贯地传达给人们,否则成功将极具挑战性。(这就是现实。)
  2. **无论你是哪个领域的专家。**无论你属于哪一个垂直领域,无论是商业、工程、研究还是任何其他领域,精通和了解你的工作都会让你脱颖而出。对你所做的事情充满激情在这里大放异彩,因为它让你在享受旅程的同时提升自己的技能。
  3. 不要害怕说出你的想法。如果你有想法,就说出来吧。
  4. 准时、尊重、专业和礼貌。
  5. 建立联系,拓展人脉。这是成长为专业人士的精髓。

尽管在一家很好的跨国公司有一份稳定的工作,我仍然渴望从事技术工作。我对机器学习很着迷,在 Coursera 上学习吴恩达的 ML 课程,同时学习诊断成像技术是如何工作的,这是我工作的一部分!我认为 masters 是运营商变革的逻辑路径。

硕士学位是转行的踏脚石

这是一个非常受欢迎的选择,全球各地的人都选择(我也选择)改变职业生涯,并转移到一个新的国家,那里有更多的机会。但是,在执行此操作时要非常小心。如果你刚刚完成本科课程,我建议你在攻读硕士学位之前先获得 1 到 2 年的软件开发经验,因为这会让找工作变得容易一些。和软件开发经验将有助于你了解这个行业是如何运作的。我在滑铁卢大学获得了硕士学位,因为那里的创新、研究和创业精神。你应该记住的几件事如下。

  • 不要以为你有一个硕士或硕士学位,公司就会蜂拥而至。

  • 至少在 DL/CV/ML 领域,试着做一个基于论文的硕士而不是一个基于正常项目/课程的硕士,因为这将允许你从事一个大项目。你在论文工作期间获得的经验远胜于任何课程项目(几乎在所有情况下)。**大学会支付你学习的费用。如果你要搬到一个新的国家,货币兑换可能会减少你的存款,你可能没有足够的资金,基于论文的硕士学位是你的带薪学习机会。据我所知,所有的 MASc 项目都是在加拿大资助的。这里列出了加拿大的一些实验室/教授(排名不分先后),你可以在决定攻读硕士学位时参考一下。

    【https://uwaterloo.ca/vision-image-processing-lab/】
    https://mila.quebec/en/
    https://www.trailab.utias.utoronto.ca/
    https://uwaterloo . ca/autonomous-vehicle-research-intelligence-lab/
    https://kimialab.uwaterloo.ca/kimia/
    https://www.cs.utoronto.ca/~fidler/
    https://www.gwtaylor.ca/**

  • 当你在攻读硕士学位时,请确保为你所学的每一门课程做一个项目。并且确保您正确地记录了它,并将其与代码一起放在您的 GitHub 个人资料中。如果您没有 GitHub 帐户,请立即创建。这就是公司寻找的东西。因为在见你之前或者在给你在线测试之前,它是你编程能力的一个很好的指示器。这些带有相应 GitHub 库的项目将会很好地融入你的简历,让你印象深刻。

  • 不要因为想要好成绩就去上简单的课程。参加你觉得与毕业后想做的工作相关的课程。挑战性的课程会让你有机会在有限的时间内成长和学到很多东西,这是我们在攻读硕士学位时获得的。舒适区里长不出什么有用的东西。

  • **在会议或期刊上发表关于你工作的论文。(不要求,但是如果可以的话请做。)**你可以先在 arXiv 上发布。因为如果你的作品很好,人们会开始引用你,你会利用这段时间直到出版。(注意:一些会议/期刊不接受在 arXiv 中发表的论文,因此请确保您事先了解您的目标出版物。)

编码/编程熟练程度

如果你想进入软件世界,编程技能是至关重要的。你需要精通解决编码挑战,因为每个公司都会扔给你一个。如果你是学生,你需要在毕业前的一个学期把你的数据结构和算法整理好。开始在竞争性编码网站上解决日常问题(下面列出了几个)。

事情就是这样。你需要能够在 windows 记事本或谷歌文档、白板上解决编码难题,并能够在整个面试过程中大声思考和有效沟通。这个步骤本身就有专门的书籍。因此,我不打算在本文中介绍如何做到这一点,因为这超出了它的范围。

通常,编程语言是你的选择,但是如果你的角色要求你必须精通某种语言,比如 C++,你将被要求用那种语言编程。

这一步需要时间、耐心、奉献、承诺、毅力和动力。请从今天开始,给自己一个良好的开端。

以下是一些你可以用来准备的资源。

  1. 破解编码采访
  2. https://www.hackerrank.com/——这是初学者友好型的。
  3. https://leetcode.com/—对 FAANG(脸书、亚马逊、苹果、网飞和谷歌)是强制性的
  4. 面向极客的计算机科学门户网站
  5. 技术招聘的编码测试和评估|编码信号
  6. https://www . coursera . org/specializations/data-structures-algorithms
  7. https://www.codechef.com/
  8. 【https://github.com/qiyuangong/leetcode 【LeetCode Python 解决方案】
  9. https://github.com/haoel/leetcode[leet code c++解决方案]
  10. https://github.com/keon/algorithms【各种算法的 Python 实现】

学习触摸打字[可选但推荐]

如果你用笔记本电脑或计算机工作,你将不得不使用键盘。这种技能可以让你专注于内容而不是敲击键盘,从而让你的生活变得更加轻松。如果你在打字时不必寻找按键,你将能够更快地编码。有几个这样的网站,但我将分享几个我自己用过的。

  1. https://www.typingclub.com/——学习触摸打字的绝佳选择。
  2. https://10fastfingers.com/typing-test/english——获得速度
  3. http://keybr.com/——学习触摸打字
  4. http://typeracer.com/——获得速度

获取知识的在线大学课程或 MOOCs

网上有数不清的课程,你可能会在选择时感到困惑。然而,记住一个好的项目比在线课程更有价值。但是,为了开始,你需要初始知识。我建议使用以下资源,但还有很多。随意探索互联网。(排名不分先后。)

  1. https://www.coursera.org/specializations/deep-learning——我向任何想在深度学习领域开始职业生涯的人推荐这个专业。通过吴恩达,他很好地解释了事情。
  2. https://www.coursera.org/learn/machine-learning——如果你想了解机器学习。
  3. https://www.youtube.com/playlist?list = pl 3 fw 7 Lu 3 i5 j vhm 8 ljyj-zlfqr F3 EO 8 syv—如果你想利用深度学习打入计算机视觉。
  4. 【https://atcold.github.io/pytorch-Deep-Learning/ —深度学习 NYU 课程(乐村)
  5. 【https://www.youtube.com/playlist? list = ploromvodv 4 rohcuxmzknm 7j 3 fvwbby 42 z—如果你想了解 NLP
  6. https://keras.io/examples/——如果你想从 Keras 开始,直接举例。快速原型化并了解不同的算法。**然而,请注意,由于其抽象程度,它在行业中(tf1 时代)是不被认可的。**一定要对至少 TensorFlow 或 PyTorch 感到舒服。
  7. https://py torch . org/tutorials/初学者/py torch _ with _ examples . html—py torch 的牛逼教程,他们官网还有很多。

这个列表可以一直列下去,GitHub 上有很多列表,这只是给你一些初步的指导。请记住,一旦你完成一门课程,就要自己建立一些项目或处理一些数据集。那是唯一有效的主动学习的方法。

想获得一些实践经验

https://www.kaggle.com/是一个将你新获得的深度学习技能应用于实际数据集的绝佳平台。有几种挑战可供你尝试并获得实践经验。您可以在内核上运行代码,这样您就不会受到硬件的限制。

谷歌 Colab 训练你的模型

训练深度学习模型需要 GPU,而https://colab.research.google.com/notebooks/intro.ipynb是一个获得免费计算资源的非常好的地方。你可以免费使用 GPU 和 TPU 内核。

深度学习(计算机视觉)的库很少

如果你想在这个领域工作,这些是你需要精通的典型库。

  1. https://pytorch.org/—深度学习
  2. https://www.tensorflow.org/—深度学习
  3. https://numpy.org/—使用矩阵的数值计算
  4. https://opencv-python-tutro als . readthedocs . io/en/latest/py _ tutorials/py _ tutorials . html—图像处理与计算机视觉
  5. 【https://pandas.pydata.org/】T4—处理表格数据
  6. https://matplotlib.org/——制作图表
  7. https://scikit-learn.org/stable/—机器学习算法

现在让我们假设你已经完成了上面所有的步骤,并准备去市场。下一步是找工作,这可能会让人望而生畏。由于我从销售角色转换到了研究工程师角色,我想我应该与你分享一些技巧。

求职技巧

如果你是一名新毕业生,这一步可能会感觉有点奇怪,因为你可能不知道它是如何工作的。概括地说,这将是以下几个方面。

  1. 获取知识,做项目,编码实践,通过实习,黑客马拉松,自由职业,为开源项目做贡献来获取经验。
  2. 打造你的简历
  3. 开始通过 LinkedIn 等在线门户网站搜索工作,并在线申请
  4. 一旦你接到电话,有几个步骤:(为了更深入的解释,我鼓励你阅读《破解编码面试》一书。)
    ·介绍/筛选电话——这将由人力资源部门来了解你。在这一步之后,您可能会遇到一个编码挑战。
    ·技术筛选——通常是编码挑战。可以离线、在线、随叫随到。
    ·技术面试——与技术团队的面试。可以是多轮。人力资源面试——与人力资源的最后一次面试。没有什么技术性的,只是交谈。薪资谈判到此结束。
    ·签署要约并加入!😃

让我们来看看我希望大家关注的几点。

简历

我怎么强调你简历的重要性都不为过。这是你得到面试电话的原因。请花些时间打造一份高质量的简历。写简历时需要考虑的几件事。(同样,网上有大量的文章告诉你怎么做。我只是给出最初的指导)

1.确保你绝对不要在简历中仅仅在你的经历部分陈述职位描述。

2.在你的经历描述中使用行动词汇、衡量标准和结果。类似于“我在项目 X 中做了这件事,导致 y%相对于度量标准 z 的直接改进,”提及你做了什么。不要写这是我们做的,写你的贡献。

3.请确保你的简历中没有错别字(有时我们会忘记基础)格式正确,字体大小易读。

4.我不知道业界对简历的长度有什么共识,但我遵循了 1 页的限制,采用了两栏的格式。

5.清楚地解释你的项目。保持简短,足以激发兴趣。一旦你和公司谈好了,就可以做详细的解释。

6.提供一个链接,链接到你的 LinkedIn、GitHub 个人资料以及你拥有的任何其他作品集、博客或网站。

我用过这个 LaTeX 模板:https://www . over leaf . com/LaTeX/templates/deedy-cv/bjryvfsjdyxz。随意使用 Word 或任何你觉得舒服的东西。

我分享我的简历以供参考,它给我带来了来自高通、AMD、华为和其他几家公司的电话。(我不是说这是一份模范简历。)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:作者

商务化人际关系网

请今天创建一个https://www.linkedin.com/个人资料,如果你还没有的话。这是非常重要的一步。正确填写您的个人资料。搜索如何制作一个令人印象深刻的 LinkedIn 个人资料,并让你的个人资料令人敬畏。并且开始联系你所在行业的人。对于乔布斯,我大量使用 LinkedIn。也许我可以成为你的第一个联系人?(我的 LinkedIn 个人资料

你可以直接在 LinkedIn 上联系人事经理、招聘经理或团队领导。不是每个人都会回复,但是觉得你的简介有趣的人一定会回复。不要低估这一步的力量。如果你发现一个招聘信息,就去找这家公司,找到潜在的招聘经理,然后和他谈谈。这是让你的个人资料受到关注的好方法。这表明你很感兴趣,并且付出了额外的努力。

不要害怕被拒绝,因为成功就在后面。为了找到适合我的工作,我已经参加了将近 15 次面试(也被拒绝了很多次)。所以继续努力吧!你能行的!

弥补缺乏经验的差距

你可能会想,如果我没有任何经验,我该如何开始呢?你可以采取以下步骤来获得经验。

  1. 实习:带薪(由你去实习[我猜这是在印度]或给你做实习)或不带薪,可以帮助你获得行业经验。下面是一个列表,你可能会找到一个。

    https://www . Forbes . com/sites/susanadams/2015/01/30/the-10-best-websites-for-finding-an-interstitution/?sh=25e96e8d1b44

  2. 参加黑客马拉松:这是获得经验、参与项目并有可能赢得奖金的好方法。有可能你会遇到赞助商的人并获得面试机会。
    https://mlh.io/seasons/na-2020/events

  3. 为开源项目做贡献:
    https://github . com/freeCodeCamp/how-to-contribute-to-open-source

  4. 自由职业者:
    https://www.upwork.com/

  5. 找写着新人/初学者的角色。如果你有另一个领域的经验,换个工作,你很可能需要重新开始。

工作门户

除了 LinkedIn 之外,这里还有几个门户网站可以帮助你找到工作。

  1. https://angel.co/jobs【创业公司】
  2. http://indeed.com/
  3. https://www.glassdoor.com/index.htm
  4. 【https://www.monster.com/】
  5. https://www.meetup.com/topics/job-search/

直接在公司网站上申请

所有公司都有职业页面。你可以直接在他们的网站上申请你感兴趣的职位。比如https://www.fugro.com/careershttps://careers.google.com/d/https://www.amazon.jobs/en/等。

结论

我们已经大致了解了你可以向深度学习/机器学习领域进行职业转变的步骤。这里要记住的最重要的一点是,无论你想做什么,都要“相信自己,相信自己有能力在任何情况下取得成功”。继续朝着你的目标努力,每天都朝着目标前进。你会成功的!如果你需要指导,请随时联系 LinkedIn,我很乐意与你聊天。

我是如何赢得吴恩达首届以数据为中心的人工智能竞赛的

原文:https://towardsdatascience.com/how-i-won-andrew-ngs-very-first-data-centric-ai-competition-e02001268bda?source=collection_archive---------8-----------------------

“数据增强”技术最具创新奖

推特上的公告

介绍

在过去的几个月里,我有巨大的机会参加了吴恩达的首届以数据为中心的人工智能竞赛。我很高兴也很感激能分享我是如何因为我的“数据提升”技术获得最具创新性的奖项的。

这场竞赛确实是独一无二的,不同于传统的人工智能竞赛,因为它严格地专注于如何改进数据,而不是模型,根据我自己的经验,模型通常是改进人工智能系统的最佳方式。

鉴于开源机器学习模型库的丰富性(包括预先训练的深度学习模型),模型方面或多或少是大多数商业应用程序的已解决问题。我们需要的是新的工具和创新技术来系统地改进数据,Andrew 将其称为烹饪一顿饭的高质量原料(训练一个模型)。

这篇博文的其余部分将由三个主要部分组成:

  1. 比赛概述
  2. 我的“数据提升”技术解决方案
  3. 这项技术的动机以及它如何推广到不同的应用

比赛概述

在这个竞赛中,参与者被给予从 1 到 10 的手写罗马数字的~3K 图像,我们的任务是优化模型在罗马数字分类中的性能。我们还得到一本包含 52 幅图像的标签书,作为我们自己实验的小测试集。本标签簿不用于最终评估。

模型结构保持固定(截止 ResNet50)并训练 100 个时期,而模型权重基于验证集的准确性在时期中选择。

虽然模型和训练过程是固定的,但我们可以自由地改进数据集,改变训练和验证数据的分割。我们也可以添加新的图像,但提交必须少于训练和验证分裂的 10K 图像组合。

在提交我们改进的数据集后,参与者将根据一组隐藏的测试图像进行评估。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

给定训练数据集中的示例

鉴于只允许少于 10K 图像的关键约束,参与者必须专注于在缺乏“大数据”的情况下获得“好数据”,根据 Andrew 的说法,这在更传统行业(例如,制造业、农业和医疗保健)的人工智能应用中非常常见。

点击此处了解竞赛规则的全部详情。

我的“数据提升”技术解决方案

在进入我的解决方案的关键之前,我做的第一件事是遵循修复标签和删除坏数据的常见做法。

为了简化这个工作流程,我编写了一个 Python 程序来评估一个给定的数据集(在将它输入到固定模型和训练过程中之后),并生成一个电子表格,其中包含每个图像的记录指标。

该电子表格包含每个图像的给定标签、预测标签(使用固定模型)和损失,这对于隔离不准确和边缘情况非常有用。下面的例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Python 生成的数据评估电子表格示例,用于简化以数据为中心的人工智能工作流

我最初使用这个电子表格来识别错误标记的图像和明显不是从 1 到 10 的罗马数字的图像(例如,在原始训练集中有一个心脏图像)。

现在来看一下**“数据增强”**技术。以下是高级步骤:

  1. 从训练数据中生成一个非常大的随机增强图像集(将这些图像视为“候选”图像源)。
  2. 训练初始模型并在验证集上进行预测。
  3. 使用另一个预训练模型从验证图像和增强图像中提取特征(也称为嵌入)。
  4. 对于每个错误分类的验证图像,使用提取的特征从增强图像集中检索最近的邻居(基于余弦相似性)。将这些最近邻增强图像添加到训练集中。我将把这个过程称为“数据提升”。
  5. 使用添加的增强图像重新训练模型,并在验证集上进行预测。
  6. 重复步骤 4-6,直到我们达到 10K 图像的极限。

参见下图中的迭代程序:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将来自训练集的增强图像作为来源的候选的“数据提升”过程

在上面的过程中需要注意一些事情:

  • 虽然我在这次比赛中使用了增强图像,但实际上我们可以使用任何大型图像集作为来源。
  • 我从训练集中生成了大约 100 万张随机增强图像,作为候选来源
  • 数据评估电子表格用于跟踪不准确性(错误分类的图像)和注释数据。或者,我也用 PostgreSQL 后端创建了一个 Label Studio 的实例,但是由于不必要的开销,我决定不在这次比赛中使用它。
  • 对于预训练的模型,我使用了在 ImageNet 上训练的 ResNet50。
  • 我使用了骚扰包来执行近似最近邻搜索。
  • 每个错误分类验证图像要检索的最近邻的数量是一个超参数。

从图像中提取特征的一个很酷的事情是,我们可以在 2D 用 UMAP 将它们可视化,以更好地理解训练和验证集的特征空间。在下面的可视化中,我们可以看到有趣的是,给定的训练数据分布与给定的验证数据不匹配。在特征空间的左下角有一个区域,我们没有验证图像。这表明,在运行上面的“数据提升”过程之前,有机会对训练和验证数据拆分进行重新洗牌。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由 ImageNet 上预训练的 ResNet50 提取的特征(又名嵌入)的 UMAP 2D 可视化

这项技术的动机以及它如何推广到不同的应用

举个例子,我的方法是由四件事激发和启发的:

  1. 我在的原创工作这篇博文来自 2019 年,在那里我通过从关键词标签中提取电影嵌入,并使用余弦相似性来找到彼此相似的电影,从而构建了一个电影推荐系统。
  2. 我之前使用预先训练的深度学习模型将图像表示为嵌入的经验。
  3. Andrej Karpathy演讲在 2019 年,他描述了如何有效地从特斯拉车队收集大量数据,并对其进行标记,以解决经常是边缘情况(分布的长尾)的不准确性。
  4. 我想开发一种以数据为中心的推进算法(类似于梯度推进),其中模型预测中的不准确性在每一步中通过自动获取与这些不准确性相似的数据来迭代解决。这就是为什么我称这种方法为“数据提升”。

当我最初考虑这种“数据提升”方法时,我需要弄清楚如何自动生成大量新的候选图像作为来源。我决定尝试随机扩充原始训练数据,以生成一大组扩充图像作为来源候选。

下一步,我利用预先训练的模型提取图像嵌入,用于计算图像之间的余弦相似性,以自动获取与验证集中错误分类的图像相似的增强图像。

这里,使用预训练模型进行一般特征提取是一种类型的迁移学习方法。我假设,通过以这种方式获取增强图像,我们可以提高模型从分布的长尾中学习模式的机会。正如 Andrej Karpathy 在 2019 年特斯拉自主日的演讲中所指出的:

“这都是关于长尾的”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

幻灯片由安德烈·卡帕西

此外,由于比赛有 10K 图像的数据大小限制,这种“数据增强”方法是一种在给定限制的情况下确定哪些随机增强图像最好包括在训练集中的方法。

我可以看到这种技术被推广到机器学习的不同应用中,我们可以访问:

  1. 预训练模型,用于提取实体的嵌入内容(例如图像、文本文档)
  2. 可供选择的大量候选数据(例如,特斯拉车队、网络上的大量文本、合成数据)

例如,我可以想象将这种技术推广到文本分类,其中我们使用预先训练的转换器模型(例如 Bert)来提取文本的嵌入。然后,我们可以从特定领域的验证集中找到与不准确相似的文本(假设在线上有大量可用的语料库)。

展望未来

我希望这篇博文能说服你加入这场以数据为中心的人工智能运动。未来有许多令人兴奋的工作来推动人工智能的更广泛采用,我相信对人工智能系统数据管理的一致关注将使我们实现这一目标。

如有任何问题或希望合作,请随时联系我们。你可以在 LinkedIn 或者 Twitter 上找到我。

特别感谢传奇吴恩达发起本次比赛。

如果我必须重新开始,我将如何学习数据科学的 Python

原文:https://towardsdatascience.com/how-i-would-learn-python-for-data-science-if-i-had-to-start-over-83fc40ab93ba?source=collection_archive---------0-----------------------

入门

另外 3 个技巧可以帮助你避免犯同样的错误

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

内森·齐曼斯基Unsplash 上拍摄的照片

我伸手去抓我的红牛又喝了一口。

我的眼睛因长时间盯着屏幕而布满血丝。

我筋疲力尽。但我必须这么做,我必须想清楚。

所以我翻了一页。

然后在我的笔记本上又写了几行。

‎….我又做了一次。

………………再来一遍。

……………………再次。

我已经在悉尼科技大学 11 号楼黑暗的角落里坐了 9 个小时了。

我面前的 MacBook。

Python 速成班在我右边。

在 Chrome 中打开了大约 87 个不同的标签

拼命想掌握 Python。

我太想得到它了。我想快速地学习它(不可否认,比可能的实际速度要快)。

我在研究我的硕士学位,并试图在工作中给我的客户带来一些硕士学位。却不知道自己到底在做什么。谈到数据科学和 ML,要学的东西实在太多了,更不用说 Python 了。

一定有更好的方法。

不幸的是,那时候,我什么都不知道。

三年过去了,有很多事情我会用完全不同的方式去做。在那段时间里,我成功地建立了大量的模型,启动(和崩溃)了一家初创公司,并成为了 IBM 的一名数据科学家,与一些令人惊叹的客户一起工作。

但是我总是回想起我花在自学编程上的那些周末。现在回想起来,是的,这是值得的…但我本可以用更有效的方式去做。

这正是我今天想和你谈的。

如果我必须重新开始的话,我会再次使用这个策略来学习机器学习和数据科学的 Python。

如果你更喜欢视频,我还做了一个 5 小时左右的速成课程,把所有这些都浓缩下来,但请继续关注我,我希望我能分享一些金块。

我认为,在开始学习之前,有 3 个关键因素是很重要的。

首先是 CRUD。

1.了解 CRUD

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:尼古拉斯·雷诺特

CRUD 代表创建、读取、更新和删除。这是一个通常与 SQL 联系在一起的概念。它指的是处理数据库记录所必需的核心操作。

然而!

同样的概念在编程时也很有用。如果你能理解如何用 Python 创建、读取、更新和删除一个对象,你就已经很好地理解了这个组件。我对此的唯一反对意见是,理解如何循环遍历组件也很重要,所以也许 CRUDL 是更好的初始化?我跑题了。

理解 CRUD 很重要,因为它为您应该能够应用于 Python 中的组件的操作奠定了基础。比方说,你想对列表应用 CRUD。

我们知道我们可以使用方括号中的序列创建列表。

# Creating a list
names = [‘neil armstrong’, ‘buzz aldrin’, ‘sally ride’, ‘yuri gagarin’, ‘elon musk’]

我们可以使用索引或打印功能阅读

# Printing a list
print(names)# Reading the first value
names[0]# Slicing a range
names[1:3]

为了让更新,你可以重新赋值,使用 insert 方法或者 append 方法。

# Update a single value
names[-1] = 'nicholas renotte'# Update by adding to the end of the list
names.append('elon musk')# Update by inserting at the start of the list
names.insert(0, 'richard branson')

最后但同样重要的是,它有助于理解如何删除

# Delete components from a list
**del** names[-2]

理解 CRUD 为您应该理解的每种数据类型的组件建立了一个心理框架。

2.习惯使用 Jupyter

当我刚开始用 Python 编程时,有很多 IDE 可供选择。但我希望我知道的一件事是,Jupyter 笔记本可能是开始时使用的最佳界面,尤其是在数据科学工作负载方面。

为什么?

它们为您提供了一个交互式环境来构建、探索和建模您的数据。我要大胆地说,没有什么比得上。还有其他选择,但 Jupyter 让它变得简单得可笑。

我发现为 Jupyter 提供一个稳定的操作环境的最简单的方法是使用 Anaconda

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:Anaconda

Jupyter 也有很多风格,它们都提供了相似的工作界面,但也有一些优缺点。为了一个允许你使用 GPU 和 TPU 的免费环境。看看谷歌 Colab :

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:谷歌

但是,当你最终得到那份甜蜜的数据科学工作时,也要做好灵活变通的准备。许多企业组织正在转向数据科学平台。我在日常工作中使用的是沃森工作室

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:IBM

3.在你认为自己准备好之前就开始做项目

太容易掉进教程陷阱了!

做辅导,一次又一次辅导,但从来没有真正开始做建筑材料。

我去过那里。你去过那里。我们都经历过!

打破常规的最好方法是开始用 Python 制作和打破东西。找一个简单到超出你技能范围的教程,试一试。

我一直想在无障碍领域做点什么,并决定在我的旅程中尽早尝试解决手语识别问题。

我觉得我还没到那一步。也就是说,处理超出你技能范围的事情会比其他任何事情都更有助于你加速!

好了,说够了“提示”。让我们来看本质。

你应该学什么?

下面的代码块突出显示了每个子主题的关键组件。在 YouTube 视频和这个 GitHub 报告中,它们都有大量的细节解释!

变量

将变量视为值和数据的占位符。它们使得在整个代码中重复引用可能需要的数据或值变得容易。

数据类型

Python 中有许多不同的数据类型。了解它们的属性有助于您 1)设置正确的数据类型,2)导航其属性,3)利用附加的方法。

条件和循环

条件是重要的,它们允许你运行你的数据通过门和检查,以确定值是否满足某些条件。循环帮助您遍历序列,以便您可以重复执行某些操作。

数学运算符

理解基本的数学运算符是很有用的,但是请注意,您会发现自己使用的许多常见的包(例如 Numpy 和 Pandas)也有本地数学运算符。

功能

将你的代码包装在一个函数中允许你将事情模块化,这意味着你不需要经常重写相同的代码。我发现自己写了很多函数,尤其是在数据预处理工作流方面。

班级

老实说,在我的日常工作中,我并不需要用到太多的类。然而,我发现在构建定制神经网络模型和层时,它们几乎无处不在,尤其是那些具有多个输入和预测头的模型和层。

模块和包

啊,模块和包。*这些允许你利用全世界 Python 开发者的集体智慧。*你会发现自己使用的一些最常见的包是请求熊猫NumpyScikit-LearnTensorFlowNLTK

文件和错误处理

将数据写到磁盘或将数据保存到文件中尤其有用,尤其是在自然语言处理领域。错误处理在任何地方都很方便,尤其是在编写生产级代码的时候。

感谢阅读

仅此而已。

我祈祷你会发现这很有用,如果你有任何关于学习 DS、ML 或 DL 的建议,我很乐意听听!关键是开始,不要害怕迈出第一步。

我每周都会在我的 YouTube 频道上发布一些新的 ML 和 DS 内容,希望能和你们大家联系。

我如何克服对数学的恐惧来学习数据科学

原文:https://towardsdatascience.com/how-im-overcoming-my-fear-of-math-to-learn-data-science-b71838461c43?source=collection_archive---------9-----------------------

办公时间

恐惧不是不追求激情的理由,尤其是如果恐惧只是你的幻觉

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由来自 Pexels山姆·里恩拍摄

作为一个高中数学不及格的人,我觉得自己特别有资格写这篇文章。

我对数据科学世界了解不多,直到我偶然发现了 Medium 并发现了《走向数据科学》出版物。从我读的第一篇文章开始,我就被迷住了。

数据科学将我所热爱的技术与科学、商业、医学、工程以及你能想到的任何其他领域结合在一起。作为一个试图进入环境咨询领域的人,我知道数据科学可能是我达成交易的箭筒中的一支箭。

我知道我至少要尝试一下数据科学。

然而,有一件事抑制了我的兴奋:对数学的深刻理解和/或自学高级微积分、线性代数和统计学的能力的要求。

正如我上面提到的,我高中数学不及格。我一开始就没有做好。

当我浏览列出成为一名数据科学家需要多少数学知识的文章时,我开始不知所措。一般来说,这些文章列出了微积分,微积分,多变量微积分,三角学,线性代数,微分方程和统计学。

关于我的一个奇怪的事实是,我并不是天生数学不好。我只是不擅长不实用或不实用的数学。出现在统计、物理、化学或微积分中的数学,我处理起来没有问题。老实说,我真的很擅长这个。但是涉及到更抽象的应用,比如数论和微分方程,我就搞砸了。

正因为如此,我害怕成为这位全能的数据科学家应该学习的数学。

直到我看到这篇文章:

https://www.sharpsightlabs.com/blog/math-for-data-science/

这个发现。

当我第一次读到这个标题时,我认为它是亵渎神明的。当时,我认为任何声称数据科学不需要太多数学知识的人只是在寻找那些 clickbait 视图。

这篇文章怎么可能宣扬与我读过的所有这些广受欢迎的文章完全相反的东西呢?我读到的一切都是错误的信息吗?

当我继续阅读这篇文章时,我注意到作者做了一个我读过的关于这个主题的任何其他文章都没有做的区分:理论数据科学和实践数据科学之间是有区别的。

简而言之,的文章解释了理论数据科学(通常由学者实践)与实践数据科学(通常由行业专业人士实践)之间的巨大差异。一般来说,学术界使用的数据科学比行业中使用的数据科学更注重数学。

虽然的作者承认,你需要的数学水平将取决于你作为数据科学家的资历水平(初级还是高级),但更有说服力的因素之一是你将在学术界还是工业界工作。当然,根据你将要进入的行业,你可能需要比其他行业更多的数学知识。然而,这种数学水平仍然比你在学术界工作时要低得多。

作者进一步解释了基础数据科学技能,包括数据操作、数据可视化和探索性数据分析,实际上并不需要太多数学知识。收集和清理数据并制作散点图或直方图的过程几乎不需要高级水平的数学,甚至可以使用你在高中学到的数学技能来完成(在作者看来)。

当谈到数据科学的基石之一机器学习时,作者解释了如何存在一种误解,即优秀的机器学习实践者必须对数学有高级的理解。这种误解是不真实的,因为作者描述了他个人知道的几位机器学习从业者没有受过高等数学培训,但仍然在苹果和美国银行等大公司工作。那些从业者在理论知识上的不足,通过他们应用数学技术的能力来弥补。

此外,与其他数据科学应用一样,您打算在上练习机器学习的设置也有所不同。在学术界或工业界工作将影响你创建成功的机器学习模型所需知道的数学量。

作者使用了阅读学术机器学习论文与查看由行业专业人士创建的机器学习模型的结果的例子。机器学习论文将包括大量的高级数学,而实际模型可能只涉及基本的统计学、线性代数和微积分——也就是你在大学本科阶段可能学到的数学水平。

通过大胆地声明数据科学和机器学习实践不需要多年密集的专业数学学习,作者为像我这样的后起之秀数据科学从业者敞开了大门,否则他们可能会因为害怕数学而另眼相看。

那么,要开始学习并成为一名称职的数据科学家,你实际上需要哪些数学技能呢?作者推荐了五个简单的数学领域,让你集中精力学习:

  1. 基本图表和图形。
  2. 功能。
  3. 基础代数。
  4. 基本统计。
  5. 基本数学符号。

对于有抱负的初级数据科学家来说,这个数学能力列表足以解决你将遇到的任何问题。我读过很多次有经验的数据科学家如何重视回归基础,使用最简单的解决方案来解决问题。这些简单的解决方案可能涉及使用 Excel 电子表格和一些简单的算法来产生结果。换句话说,并不是每个数据科学问题都需要微分方程、复杂的机器学习模型和人工智能。

这将如何改变我学习数据科学的方式。

回到 2020 年 12 月,我发表了一篇文章,强调了我在 2021 年学习数据科学的新年决心。在那篇文章中,我强调了我为自己创建的学习课程。当时,我对数据科学的理解是由顶级高级数据科学家撰写的文章推动的,这些文章包括数学能力的洗衣单,每个人如果想成为数据科学家,都应该知道这些能力。

现在,读完那篇文章后,我更倾向于重组我的课程,专注于更实用的技能,特别是描述性和推断性统计、基础微积分和基础数据科学能力。简而言之,我的课程中的数学部分看起来会更像这样:

数学

  • 有限数学
  • 描述和推断统计
  • 结石
  • 算法/技术:线性回归、逻辑回归、支持向量机、决策树、神经网络、正则化和主成分分析

此外,我将专注于直接学习不同的数据科学和机器学习算法。虽然知道为什么某样东西会起作用很重要,但我在过去的数学教育中也学到,只要理解某样东西如何起作用就可以了。因此,我不会陷入几个月的数学学习中,而是将重点放在如何使用特定的算法、何时使用它,以及它将产生的结果上。这种实用的数学学习方法将减少噪音,简化我对最重要细节的理解。在某个时候,是时候学习为什么要学习这个算法了,但是在那之前,我只要知道如何正确地应用这个算法就可以了。

基本上,我把我的注意力集中在最重要的概念上。我想专注于清理和操作数据、可视化数据以及执行探索性数据分析。通过专注于四项基础数据科学技能,我将在行业领域具有竞争力,不是作为一名数据科学家,而是作为一名能够应用数据科学原理解决问题的人。

最后的想法。

作为一个之前因为对数学能力缺乏信心而害怕从事专业的人,我觉得从各个角度看待任何学科都很重要。

就数据科学而言,每个人都如此痴迷于在“数据科学家”的头衔下工作,以至于他们试图学习复杂的数学,让自己陷入了痛苦的世界。事实上,大多数害怕数学但希望成为从业者的人应该更多地关注于学习该行业的实践方面,然后将其应用于“数据科学家”领域之外的角色。事实一次又一次地证明,学习技术技能的人会在工作中获得加薪,只是因为他们能够实际应用他们所学的知识,为公司带来好处。

因此,也许我们这些害怕数学的人的目标是成为数据科学的实践者,能够在我们给定的专业背景下清理、操作、可视化和分析数据的人,并且不必在我们无法经常理解的主题中经历数月的培训。通过了解数据科学的基本方面,我们可以产生影响,不管我们是否会微分方程。

朱莉娅如何完善多重派遣

原文:https://towardsdatascience.com/how-julia-perfected-multiple-dispatch-16675db772c2?source=collection_archive---------19-----------------------

让我们看看 Julia 语言是如何让多重调度变得完美的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

介绍

虽然 Julia 编程语言是新的,而且不太受欢迎,但至少现在,这并不妨碍该语言取得一些相当惊人的成就。Julia 编程语言比许多用户或观众所理解的要独特得多,因为它有自己的范例。在我看来,这种范式棒极了,我真的爱上了编程语言中奇妙的类型系统和参数多态性。朱莉娅计算公司称这种模式为

“多种调度模式”

好吧,这不是最有创意的命名,但有很多很好的理由使用这种范式,以及随之而来的 Julia 编程语言。对我来说,多重分派是一种非常自然的编程方式,尤其是在科学计算方面。除此之外,这种语言还做了几件事情,使得多重分派比以前任何语言都要好。在我们进入多重分派之前,还有一件事;本文中的所有示例都来自我目前正在发布的一个包,它是一个面向对象的 DataFrames 包,在 Julia 中的 DataFrames.jl 和 Pandas.py 等选项之间架起了一座桥梁。如果您想了解更多关于这个包的信息,贡献或支持它(谢谢),您可以在这里查看这个包:

https://github.com/ChifiSource/OddFrames.jl

关于多重分派的更多信息

在我们讨论 Julia 语言全面扩展并与多重分派协同工作的伟大之处之前,让我们先来了解一下多重分派到底是什么。多重分派是一个通用的编程概念,最初是为了解决函数式编程范例中的一个问题而引入的。这个问题就是有太多的方法名,当方法不是我们正在处理的类型的私有方法时,我们必须对每种类型有一个单独的调用,即使这些函数做同样的事情。

例如,假设我们有自己的函数式编程语言,我们想得到一个可迭代数组的长度,我们可以调用:

length(array)

现在让我们假设我们也想获得字符串中字符的长度——因为函数式编程主要关注声明式编程,更重要的是——全局编程,我们只能有一个长度的定义。因为我们已经在阵列上使用了这个定义,所以我们需要更改这个函数的别名:

length_str(string)

不用说,在方法调用中指定要传递什么类型只是程序员、方法和类型之间一种单调乏味的交互。这就是多重调度的用武之地。对于多重分派,可以专门定义方法来处理所提供的参数类型,就像我们前面的例子一样:

length(array)
length(string)

我们需要做的就是将我们要写入的特定类型添加到我们的方法定义中,以便于实现这一点。如果你想更多地了解为什么多重派遣如此酷,以及关于这个主题的更多技术细节,我有一篇更详细的文章,你可以在这里阅读:

此外,那是两年前发表的——为什么。

单行定义

一行定义无疑使多重分派变得很方便。在 Julia 中,功能键是可选的。每当我们在别名后面加上括号时,Julia 就能看出我们在调用一个方法,例如

example()

如果我们运行这个函数,我们会得到与没有括号时相同的错误,但是会有一个堆栈跟踪,因为 Julia 编译器现在已经注意到我们不一定是在全局范围内工作,因为它已经评估出我们是在使用一个有自己范围的函数。这是一个有趣的区别,看看这个:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

所有这些不仅可以在一行中快速创建函数,还可以在一行中更改函数调用。考虑 OddFrames.jl 中的以下示例,其中定义了将成为我们的类型的子代的函数:

head(x::Int64) = _head(labels, columns, coldata, x)head() = _head(labels, columns, coldata, 5)# Dropdrop(x) = _drop(x, columns)drop(x::Symbol) = _drop(x, labels, columns, coldata)drop(x::String) = _drop(Symbol(x), labels, columns, coldata)dropna() = _dropna(columns)dtype(x::Symbol) = typeof(coldata[findall(x->x == x, labels)[1]][1])dtype(x::Symbol, y::Type) = _dtype(columns[findall(x->x == x,labels)[1]], y)

在许多这样的例子中,我们看到论点从第一个到第二个定义发生了变化。在第一个实例中,我们将数据从类型提供给函数,同时提供值。在第二个实例中,我们为 x 提供了一个默认值,所以没有输入参数。这些例子的可贵之处在于,在我们实际提供它们之前,有些输入参数甚至需要更改。例如,考虑 dtype()函数。

dtype(x::Symbol) = typeof(coldata[findall(x->x == x, labels)[1]][1])

在这个例子中,如果我们简单地提供符号来获取数据类型,我们将会遇到一个巨大的问题。因为我们需要的符号不仅在不同的数据数组中,而且我们也不知道在哪个数组中!幸运的是,我们可以在一行中完成所有的编写工作,最终的代码看起来非常干净!

构造器

在 Julia 编程语言中,我最喜欢的多重分派实现可能是 dispatch。考虑我们的不可变 OddFrame 的构造函数(我选择它是因为它要短得多。)

struct ImmutableOddFrame <: AbstractOddFramelabels::Array{Symbol}columns::Array{Any}coldata::Array{Pair}head::Function

这就是所谓的外部构造函数。我们可以直接调用这个外部构造函数,返回的将始终是 ImmutableOddFrame 类型。但是,为了进行这样的调用,我们需要提供

  • 标签
  • 科尔达塔

全靠我们自己。我们到底该怎么做?特别是考虑到 head()是一个函数。为了使用这种类型,我们真的要编写自己的函数吗?当然不是。此外,这种类型内部的数据本质上只供实际模块以这种方式使用,而不是供最终用户使用。最终用户只需要提供一些更高级的声明性数据。例如,他们希望从中加载数据的文件的文件路径:

function OddFrame(file_path::String)# Labels/Columnsextensions = Dict("csv" => read_csv)extension = split(file_path, '.')[2]labels, columns = extensions[extension](file_path)

这都是通过分派完成的,内部构造函数和外部构造函数的调用本质上是相同的——只是传递的类型不同。不用说,这将构造函数带到了一个全新的水平!如果你想了解更多关于构造函数的知识,你可以阅读这篇文章或者观看这个视频:

结论

不用说,Julia 已经完全改变了游戏,不仅仅是在软件的多个调度应用程序的小得多的世界里,而且是在整个编程的世界里!多分派范式确实将多分派编程带到了一个全新的水平。随着构造者能力的提高,这一概念得到了极大的发展。从整篇文章来看,在这里影响最大的可能是构造函数。非常感谢你的阅读,它对我来说真的很重要!我希望这篇文章有意思,并让您对多分派范例有更多的了解——这太棒了!

知识图如何解决机器学习问题

原文:https://towardsdatascience.com/how-knowledge-graphs-solve-machine-learning-problems-d2f0da031cd5?source=collection_archive---------20-----------------------

人脑使用的概念和知识图是一样的,它的名字就是一个参照系

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

哈尔·盖特伍德在 Unsplash 上拍摄的照片

**数据表示和数据本身是成功设计和运行机器学习模型的主要前提。**作为基于人工智能的系统的输入的数据,例如非基于人工智能的系统的输入信号,通常与其他数据元素相关。不正确的数据收集和表示类似于从数据中提取错误的特征,这就是为什么 AI 项目作为一个产品没有达到成熟的状态。一个很好的例子是从自动驾驶汽车的各种传感器收集的数据,这些数据在时间或空间域中彼此相关,对这些数据的分析有助于更精确地预测人工智能组件中可能发生的事件。

什么是知识图?

图包含由边连接的节点,它是网络的可视化表示。图通过边来描述节点之间的关系。图形使网络形象化;例如,互联网是以用户计算机为节点,以网络协议交互为边的网络。另一个例子是像脸书这样的社交网络,其中节点是人,边是他们之间的友谊。

知识图以图形的形式表示知识。一个知识图使用一个图形结构的数据模型或拓扑来整合人工智能领域知识表示和推理中的数据。基于知识的人工智能( KBAI )有助于使人工智能算法的学习过程更加高效和有效。知识图通过收集信息并将其集成到图形化结构拓扑中来生成新知识。来自不同来源的所有数据被链接并呈现,以更快地解决一个新问题。

知识图的典型应用

像谷歌这样的搜索引擎是知识图表最常见的用途之一,它有一个知识引擎来回答你的问题或提供可能回答你的问题的链接。

另一个应用是像 Alexa 或 Siri 这样的对话式 AI,它回答你的问题比聊天机器人更高级,旨在回答特定的问题。

像 Linkedin 这样的社交网络将职业世界中不同属性的人或公司联系在一起。此类网络中节点的属性或能力会影响图中节点之间的关系。

知识图提供的新知识是什么?

一个知识图可以组合许多数据源;例如, KBpedia 是一个开源的知识图,结合了维基百科、维基数据等七个不同的数据源。知识图的一个重要属性是给出数据的上下文。将以某种方式相互关联的不同数据类型组合起来,并将其集成到一种表示形式中,可以为算法提供新的信息,从而做出更好的决策和预测。

**许多统计分析可以应用到知识图上,以发现新的有用信息。例如,找到图中最有影响力的节点会影响其他节点,是网络中的关键参与者。**许多分析的中心性,如“中间中心性”,它决定了网络中玩家将采取的最短路径,或“特征向量中心性”,它决定了连接到许多其他玩家的连接节点的程度,可以在知识图上进行调查。

视觉化的表现提供了对关系以及网络如何在知识图中发展的更好理解。可视化有助于分析图形中不同的聚类如何相互关联,以及图形如何在时域中发展。我们可以在时间域中跟踪图表演变背后的故事,如果有必要,采取正确的行动来影响图表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

JJ 英Unsplash 上拍照

知识图是机器学习模型训练过程中的一个重要因素

向数据添加上下文:

当我们提供应用程序需要的所有相关数据作为模型的输入时,机器学习模型的性能就会提高。给数据一个上下文作为知识图最重要的特征增加了提供给模型的收集数据的信息价值。仅仅给机器学习算法喂数据还不足以成就一个成熟的产品。自动驾驶项目中的许多要求只能通过人工智能解决方案来满足,因为人类的感知在自动驾驶汽车中不再可用。人工智能需要理解可靠感知算法的背景,而不仅仅是获得关于在很短时间内发生的单个场景的信息作为输入。

整合一切可用资源:

在谷歌引入知识图之前,搜索是基于字符串搜索算法的,这意味着你必须输入所有文本、数字和符号的组合才能找到你想要的结果。但是现在,谷歌搜索 AI 引擎根据你之前的搜索和知识图中可用和链接的有价值信息来预测你的需求。

知识融合:

为训练 AI 应用程序而收集的数据有不同的类型和存储格式。我们应该首先将同一上下文中彼此相关的各种数据集成到一个数据库中,以便以有意义的方式访问它。知识融合是强制性的,因为您有多个数据源,例如,合并两个数据元素,一个是布尔类型,另一个是文本。应用各种来源的数据对于理解人类智能至关重要。

参考帧:

**杰夫·霍金斯在他的书《一千个大脑》中介绍了一种新的人类智力理论;人类为周围的世界创造了一个参照系,并通过运动不断更新。这个理论完全符合知识图的概念。**人脑的行为就像一个知识图谱。人作出新的决定是从参考新大脑皮层中已经创建的知识图开始的。构建像人类一样有能力的智能的第一步是为 AI 系统提供正确的数据,并定期更新它作为人类的参考框架,以确保所需应用程序的所有相关数据的可用性。

**https://medium.com/@bhbenam/membership **

学习奖励功能是如何出错的

原文:https://towardsdatascience.com/how-learning-reward-functions-can-go-wrong-6e794e42f4fc?source=collection_archive---------16-----------------------

从人工智能安全的角度看强化学习主体学习奖励函数的风险

强化学习(RL)是人工智能最有前途的子领域之一,其应用范围从自动驾驶汽车到股票交易,不一而足。RL 方法的一个众所周知的弱点是,研究人员必须定义一个对应于代理目标的奖励函数。对于复杂的目标,这可能很难,错误的奖励不仅会导致糟糕的表现,还会导致不安全的行为。因此,从 Google 的 DeepMind over OpenAI 到斯坦福大学的 CHAI,各种组织都致力于将奖励功能作为学习过程的一部分,而不是在训练前指定的超参数。然而,仅仅因为学习了一个目标并不意味着它与人类的意图一致。

本文将总结一些目前关于奖励函数学习过程及其安全性的研究。我将首先回顾一下指定报酬函数的传统方法的已知风险和局限性。然后,我将简要介绍一些通过学习奖励函数来克服这些挑战的方法。随着这些预备工作的进行,我将讨论学习奖励函数是如何出错的,并解释学习奖励函数过程的理想属性,这些属性是由 FHI、MIRI 和 DeepMind 的研究人员在最近的工作中定义的。随后,我将把这样的过程称为“奖励学习过程”。

本文假设读者对强化学习有基本的了解。如果你是这个领域的新手,可以在 OpenAI 的 Spinning Up【1】上找到一个很好的介绍。

1.动机:规范游戏

特别是在机器学习和强化学习(RL)中,解决问题的典型工作流包括两个阶段。首先,程序员定义目标。然后,优化算法试图找到最佳可能的解决方案。在 RL 的情况下,目标和解决方案由奖励函数和策略给出。这种方法带来的风险是,目标的定义可能无法准确地捕捉人的意图。这可能会导致一个满足目标的人工智能系统以不良的方式行为,即使训练它的算法实现得完美无缺。在人工智能安全社区,这样的系统会被称为“错位”。

根据奖励函数得分很高但与程序员的意图不一致的代理行为通常被称为“规范游戏”[14]。规范博彩【9】有许多著名的例子。在的一个例子,OpenAI 的研究人员在关于摩托艇比赛的游戏《CoastRunners》上训练了一个 RL 代理。在一个错误指定奖励的教科书例子中,游戏不奖励沿着轨迹前进的代理人,而是奖励击中沿着轨迹布置的目标。代理人利用了这一点,找到了一种在不完成比赛的情况下达到目标的策略。

规范游戏不仅是性能问题,也是安全问题,因为模型误解人类意图是人工智能对齐问题的核心。

2.奖励学习

至少从 90 年代开始,随着逆向强化学习【15】的引入,研究人员已经在寻求更好的方法来指定目标。就像一般的人工智能研究一样,自 2010 年代初以来,人工智能研究正在经历复兴,对学习奖励功能的探索也是如此。最近获得大量关注的一大类方法利用了“人在回路中”的思想。潜在的想法很简单:评估观察到的行为是否正确(大概)比明确指出正确的行为看起来像什么更容易。因此,有理由预期,由人类对代理行为的评估比由奖励函数对代理行为的评估更不容易出错。此外,可以在训练过程中使用人的反馈来调整目标,而不是在训练过程之前且独立于训练过程的阶段中指定目标。

多个研究议程集中在这个想法的不同的、更具体的实现上。在 DeepMind 的奖励模型【13】研究方向中,目标采取奖励模型的形式。这个模型是用人工评估代理行为的监督学习来训练的。奖励模型的早期成功之一包括使用 900 条人类反馈训练一个代理做后空翻。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个训练有素的代理人使用人类反馈和奖励模型做后空翻。来源:【2】

从长远来看,DeepMind 希望能够以一种迭代放大【7】的形式递归应用奖励模型。这个想法是重复使用在之前的迭代中训练过的模型和人类反馈来训练一个更好的模型。

其他研究调查了代理人和人类之间更复杂的相互作用。除了接收人类的反馈,代理可能被允许提问,或者人类可能展示期望的行为。允许这种互动的形式主义的一个例子是合作逆向强化学习【12】。这里的目标是一个奖励函数,关键是,只有人知道,而代理人不知道。反过来,人类被建模为环境的一部分,代理可以与它进行交互,以做出关于奖励的推断。代理保持一定程度的不安全感,这种不安全感只能通过与人类互动来降低。因此,代理人被激励采取减少不确定性的行动,如询问澄清性问题,避免可能伤害人类或导致低回报的鲁莽行动。

将所有这些研究方向与传统培训范式区分开来的因素是,不再有两个截然不同的阶段:首先指定目标,然后优化以解决它。相反,有各种各样的互动模式:对环境起作用的时期可能穿插着调整目标的行动,如提问或观察人类行为。柴创造了一个统称为“辅助游戏”的术语,用来描述允许这种交互模式的问题公式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

人工智能标准模型中的交互模式。来源:【10】

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

辅助游戏中可能的互动模式。来源:【10】

3.学习奖励函数的风险

当然,辅助游戏并不是解决人工智能定位问题的灵丹妙药。在 DeepMind 的《从人类偏好中学习》一文中,研究人员发现,智能体可能会学习只在人类观察者看来正确的行为。例如,一个应该学会抓住一个物体的智能体反而学会了把它的手臂放在相机和物体之间,这样它就看起来只是在抓住它【2】

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个特工学会了看起来像是在抓一个物体。来源:【2】

研究人员通过添加视觉线索来帮助人类确定物体是否被抓住,从而解决了这个问题。然而,一般来说,代理人操纵他们的奖励学习过程的结果的可能性仍然是一个问题。问题归结为一个简单的事实,即代理人必须从它可以操纵的环境中推断出它的回报函数。正如人工智能安全研究员斯图亚特·阿姆斯特朗所说,将奖励功能作为学习过程的一部分是一个巨大的变化,类似于从“如果你不知道什么是对的,就在这个只读列表中查找”到“如果你不知道什么是对的,就在这个读写列表中查找”【5】

我们如何更正式地推理奖励学习的风险?理想情况下,我们希望有一个通用的数学模型,用学习奖励函数的过程来扩展普通 RL 框架。幸运的是,这正是阿姆斯特朗等人在他们 2020 年的论文“在线学习奖励函数的陷阱”[3]中所做的。最简单的形式是,他们的形式主义将奖励学习过程建模为一个简单的函数,从行为和状态的历史到奖励函数的概率分布。换句话说,一个奖励学习过程给出了一个规则,通过这个规则,代理形成了它对正确的奖励函数的信念,给定了它已经采取的行动和迄今为止它已经观察到的关于环境的情况。阿姆斯特朗等人谈到“在线”学习,因为奖励功能是在学习策略的同时学习的,就像在援助博弈框架中一样,而不像传统的范式。利用他们的形式主义,他们得出了学习过程的两个重要性质:“可触发性”和“影响性”。

可装配性

可触发性的概念来自于我们不希望代理能够影响学习过程的结果。代理人影响学习过程的结果意味着什么,可以用“父母职业指导游戏”的例子来说明。在这个游戏中,代理人扮演一个决定走哪条职业道路的孩子的角色。要做到这一点,它可以要求它的母亲或父亲告诉它要么成为一名银行家或医生。有两个潜在的奖励函数:R[B]将奖励代理成为银行家,R[D]将奖励它成为医生。代理可以采取行动 M 询问母亲或 F 询问父亲。对于父母中的任何一方,环境决定了他们告诉代理人是医生(状态 D)还是银行家(状态 B)。反过来,这会使代理人采用相应的奖励函数。换句话说,历史 MD 和 FD 将使代理 100%确定 R[D]是正确的奖励函数,而历史 MB 和 FB 导致对 R[B]的 100%信任。如果代理人不能影响它对奖励函数的最终信念,这个博弈就是可触发的。然而,正如许多读者所注意到的那样,他们可能在孩童时期就有操纵父母的行为,但事实可能并非如此。作为一个简单的例子,考虑这样一种情况,即母亲总是回答 B,父亲总是回答 d。代理人的行动将导致对其奖励功能的不同最终信念。形式上,回报函数 R 的期望值取决于代理采取的行动 a:E[R | a = M]= R[B]和 E[R | a=F] = R[D]。对于可装配性,我们希望这种期望独立于代理的策略。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“职业指导”游戏中学习过程的可能结果。来源:作者生成

如果期望得到的奖励函数独立于代理的策略,那么奖励学习过程是不可触发的。

值得注意的是,奖励函数的期望值与代理人的信念有关。最终,代理人将根据其对奖励函数的信念采取行动。如果智能体不能将自己的信念推向 R[B]或 R[D],那么学习过程就是不可触发的。

但是不可质疑就足够了吗?一个主体能影响一个学习过程而不操纵他对奖励函数分布的最终信念吗?事实证明它可以,这就是为什么我们需要更强的不可波动性!

影响力

和以前一样,我将用一个例子来解释影响的概念。在“国际象棋游戏”中,一个代理人将学习下一盘棋,并且必须弄清楚它希望白棋还是黑棋赢。对于它的奖励函数,代理可以采用 R[W]或 R[B],分别奖励白棋和黑棋的胜利。通过投掷一枚偶数硬币来决定代理人站在哪一边。如果结果是正面(状态 H),则代理玩黑色,否则(状态 T)它玩白色。此外,在掷硬币之前,代理可以选择采取相反的行动 INV。如果它不采取相反的行动,那么在抛硬币之后,奖励函数就像人们所期望的那样:如果代理人出白牌,奖励函数为 R[W],如果代理人出黑牌,奖励函数为 R[B]。然而,如果它采取了相反的行动,那么奖励是反向的:代理人在玩黑色时将有奖励函数 R[W],反之亦然!只要我们假设硬币是偶数,这并不改变对奖励函数的期望:不管代理人是否拿了 INV,都有 50%的机会得到任一奖励函数。然而,采用 INV 将导致代理更容易满足的奖励函数,同时不会导致期望的行为。学习过程是可以影响的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“棋局”的可能结果。来源:作者生成

如果代理人的行为对产生的奖励函数没有因果影响,奖励学习过程是不受影响的。奖励函数只取决于环境——取决于“世界上的事实”。

更正式地说,要使奖励学习过程不受影响,它必须以如下方式工作:主体对它所处的环境有初始信念(先验)。它还对奖励函数的形状有信念,这取决于它对环境的信念。给定历史,代理可以更新其关于环境的信念(产生后验分布)。这些更新的信念又可以用于计算关于奖励函数的更新的(后验)信念。因此,奖励函数不再是历史的直接函数,而是环境的函数。

从可触发到不可影响

显然,不可波动性和不可聚合性是奖励学习过程的理想属性。因此,很自然地要问它们是如何相关的,以及我们是否能从那些缺乏这些属性的过程中创造出不可影响或不可触发的过程。

幸运的是,这篇论文的一些主要结果是关于可触发过程和不可影响过程的关系。例如,他们证明了每个不可影响的偏好学习过程也是不可触发的。此外,一个不可触发的学习过程是否不可影响取决于它对进一步信息的反应【4】

一个重要的结果是,通过使用反事实的方法,即使是可触发的学习过程也可以变得不受影响。例如,如果代理人的正确奖励是“一小时内在这张纸上写了什么”,那么这是有影响的:代理人本身可以在纸上写任何值。如果我们把奖励指定为“如果我们没有让你兴奋,一个小时内这张纸上会写些什么”,那么学习过程就变得不可影响。让一个人明白这是如何正式运作的并不是一件小事,我计划写一篇后续文章解释反事实方法的细节

不可流动性的极限

不可影响的学习过程可以总结为迫使主体真正了解外部世界。然而,这并不意味着使每个学习过程不受影响就解决了对齐问题。当设计一个学习过程时,你应该记住两个限制。

首先,仅仅因为一个学习过程不受影响并不意味着它是好的。举一个简单的例子,如果一个学习过程是恒定的,并且总是返回相同的回报函数,这将使它不受影响。此外,你可以对一个合理的不可影响的学习过程应用某些排列,从而获得一个仍然不可影响但远不如人意的学习过程。因此,如果“弄清楚人类想要什么并去做”是不可改变的,那么“弄清楚人类想要什么并做相反的事情”也是如此。

相反,学习过程可能是好的,但不可能不受影响。这就是对齐税的概念发挥作用的地方,它描述了在使人工智能安全和健壮以及经济竞争力之间的权衡。在尊重人工智能安全最佳实践的同时改进当前最先进的人工智能技术可能是不可行的。例如,任何涉及人类反馈的东西通常都是可触发的。这包括我们前面讨论的“人在循环中”的方法!那么,为什么我在不可挑战性和不可波动性上花了这么多时间,而这些概念似乎并不适用于奖励学习中一些最有前途的方法呢?这是因为即使我们可能永远无法实现学习过程的完全不受影响,这个概念也不是没有价值的。如果进一步的研究侧重于量化和控制操纵,这将有助于减少对准税,并使人工智能研究人员处于更好的位置,使他们的人工智能既有竞争力又安全。

[1]阿奇姆·乔希,RL 中的关键概念,OpenAI Spinning Up,2018,https://Spinning Up . open ai . com/en/latest/Spinning Up/RL _ intro . html

[2] Amodei 等人,从人类偏好中学习,OpenAi,2017 年 6 月 13 日,https://open ai . com/blog/deep-reinforcement-Learning-from-Human-Preferences/

[3] Armstrong 等人,在线学习奖励函数的陷阱,Arxiv,2020 年 4 月 28 日,https://arxiv.org/abs/2004.13654

[4]阿姆斯特朗·斯图尔特,为什么不可质疑几乎意味着不可影响,LessWrong,2021 年 4 月 9 日,https://www . less wrong . com/posts/lpjjwdbxr 88 gzcyk 2/learning-and-manipulating-learning

[5]阿姆斯特朗·斯图尔特,奖励函数学习:价值函数,LessWrong,2018 年 4 月 24 日,https://www . less wrong . com/posts/55 hjdq 5y 7 dv 3s 4h 49/Reward-function-Learning-The-value-function

[6]克里斯蒂安诺·保罗,保罗·克里斯蒂安诺:人工智能校准中的当前工作,有效利他主义论坛,2020 年 4 月 3 日,https://Forum . Effective al truism . org/posts/63 STB tw 3 waw 6k 45 dy/Paul-Christiano-Current-work-in-AI-alignment

[7] Christiano Paul & Amodei Dario,用迭代放大学习复杂目标【OpenAI.com ,2018 年 10 月 22 日,https://openai.com/blog/amplifying-ai-training/

[8] Clark Jack & Amodei Dario,野外的错误奖励功能,OpenAi.com,2016 年 12 月 21 日,https://openai.com/blog/faulty-reward-functions/

[9] Davidson Russel,规范 AI 中的游戏:主列表https://Russell-Davidson . arts . mcgill . ca/e706/Gaming . examples . in . AI . html

[10]Flint Alex,我们对柴 1500 字以下研究议程的看法,AlignmentForum,2020 年 6 月 17 日,https://www . alignment forum . org/posts/qpoa 5a zsediva 4x ja/Our-take-on-CHAI-s-research-agenda-in-under-1500 字

[12]Arxiv.org,2016 年 6 月 9 日,https://arxiv.org/abs/1606.03137,哈德菲尔德-梅内尔·迪伦等,合作逆强化学习

[13]雷科 1 月,通过奖励建模的可扩展代理对齐,DeepMind 安全研究@Medium,2018 年 11 月 20 日,https://deepmindsafetyresearch . Medium . com/Scalable-agent-alignment-via-reward-modeling-BF 4 ab 06 DFD 84

[14] Krakovna 等人,*规范游戏:人工智能独创性的另一面,*DeepMind.com,2020 年 4 月 21 日https://deep mind . com/blog/article/Specification-gaming-the-flip-side of-AI-injury

[15] Russel Stuart,*逆向强化学习算法,*第十七届机器学习国际会议论文集,2000,https://ai.stanford.edu/~ang/papers/icml00-irl.pdf

线性回归的实际工作原理——理论和实现

原文:https://towardsdatascience.com/how-linear-regression-actually-works-theory-and-implementation-8d8dcae3222c?source=collection_archive---------33-----------------------

我们推导出最大似然估计并实现它

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一条符合某些数据的直线,同时也显示了不确定性。图片作者。

内容

这篇文章是我将要发表的一系列文章的一部分。你可以通过点击这里在我的个人博客上阅读这篇文章的更详细版本。下面你可以看到该系列的概述。

1.机器学习导论

2。回归

3.分类

设置和目标

在这篇文章中,我们将学习线性回归,这对于很多机器学习来说是必不可少的**,因此理解起来会非常有益。**

给定一个具有相应目标变量 tN 输入变量 x 的训练数据集,线性回归的目标是构造一个函数 h ( x ),该函数为 x 的新值产生 t 的预测值。

用于回归的最简单的线性模型被称为线性回归,其中的预测是由

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一项通常称为截距偏差参数,并允许 h 适应数据中的固定偏移。如果我们引入 1 作为每个输入变量 x 的第一个元素,我们可以用向量符号重写(1)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在本系列的第一篇文章中,我们回顾了带有一维输入变量的多项式回归。现在,我们只是做线性回归(不是多项式),但我们允许我们的输入变量是 D 维的,因此它成为一个向量,而不是一个标量。然而,为了直观起见,让我们坚持使用同一个示例数据集:

import numpy as npx = np.array([-1, -0.8, -0.6, -0.4, -0.2, 0, 0.2, 0.4, 0.6, 0.8, 1])
t = np.array([-4.9, -3.5, -2.8, 0.8, 0.3, -1.6, -1.3, 0.5, 2.1, 2.9, 5.6])N = len(x)

因为我们的输入变量是一维的,我们的参数向量 w 是二维的,因为它有一个偏差权重和一个输入变量权重。

为了确保我们也能找到偏差参数,我们必须在 x 中引入一列 1。我们可以通过下面的代码片段做到这一点

X = np.column_stack([np.ones(N), x])

衍生和培训

那么,**我们如何训练模型呢?**我们将研究两种不同的方法来推导训练该模型的方法。

回想一下训练(或学习)指的是估计我们模型的参数的过程,所以当我们问如何训练模型的时候,就和问如何估计 w 的值是一样的。

普通最小二乘法

就像我们在第一篇文章的中所做的那样,我们定义了一个目标函数,它根据误差来计算我们的模型的性能,然后我们根据我们的参数来最小化这个误差。

这意味着我们会找到导致误差最小的参数。我们将使用相同的目标函数,误差平方和(SSE),定义为

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们希望找到使 E 最小的 w 的值

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意(2)是参数 w 的二次函数。因此,它相对于 w 的偏导数在 w 中是线性的,这意味着存在唯一的最小值。这是凸函数的一个性质。

如果我们评估网格中参数 w 的值的目标函数,那么我们可以用等高线图说明我们的目标函数具有唯一的最小值。如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

十字位于我们的目标函数的最小值——这个坐标对应于为我们的数据集产生最小 SSE 的参数值。图片作者。

但是我们如何找到最小的 T2 呢?

我们通过求导,设置导数等于 0,并求解函数变量来找到函数的最小值。为了便于记法,让我们所有的输入变量都用 X 表示,具有 N 行(每个输入变量一行)和 D +1 列(每个特征一行,偏差一行),即,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

并且让 t 表示我们的目标变量的列向量。我们现在可以将(2)改写为

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我们现在对 w 求导,我们得到

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将这个值设为 0,我们就可以解出 w

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是我们对参数的估计值

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最大概似法

然而,选择 SSE 作为目标函数似乎有点武断——例如,为什么不直接选择误差的总和呢?为什么我们要把它们弄成方形?

为了说明为什么这是一个好的选择,以及为什么这个解决方案是有意义的,我们将从概率的角度使用最大似然估计(MLE) 导出同样的解决方案

为了做到这一点,我们假设目标变量 t 是由我们的函数 h ( xw )加上一点噪声给出的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中我们假设 ϵ 正态分布,均值为 0,标准差 σ

这就让我们说,给定一个输入变量 x ,对应的目标值 t 正态分布,均值 h ( xw ),标准差 σ ,即:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们花点时间了解一下到底是怎么回事。

下图说明了(3)告诉我们的内容。我们正在估计一些参数 w ,因此我们的目标变量 t 遵循围绕 h 输出值的正态分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

目标变量如何遵循估计函数周围的正态分布的图示。图片作者。

我们现在可以使用整个数据集, Xt ,通过假设我们的数据点是独立于(3)得出的,来写出似然函数。然后,对于所有输入和目标变量对,似然函数变成(3)的乘积,并且是 wσ 的函数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在我们想要最大化可能性,这意味着我们想要确定使(4)最大化的参数 wσ 的值。这看起来很难,但是我们可以用一个小技巧让它变得更简单。由于对数是单调递增的函数,对数似然性最大化等价于似然性最大化

取可能性的对数给了我们

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在很明显为什么 SSE 目标函数是一个好的选择——( 5)的最后一项是唯一依赖于 w 的部分,并且与 SSE 相同。

由于第一项不依赖于 w ,我们可以省略它,并且由于关于 w 的似然函数的最大值不会随着正常数的缩放而改变,那么我们看到最大化似然等价于最小化 SSE 目标函数

因此, w 的最大似然估计与我们之前的推导相同

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以使用 w 的最大似然解的结果来找到噪声参数 σ 的值。如果我们在对数似然中插入对 w 的最大似然估计,求导数,并将其设为 0,那么我们可以求解 σ

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Python 实现

因为我们现在有了一个概率模型,我们做出的预测是在 t 上的概率分布,而不仅仅是点估计。这是通过将最大似然解中的 wσ 代入(3)来完成的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以用下面的代码片段找到 wσ

w = np.linalg.inv(X.T @ X) @ X.T @ t
sigma_sq = sum((t - X @ w)**2) / len(t)

下面是我们根据 w 以及不确定性参数 σ估算的直线图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由我们的估计参数和不确定性生成的线图。图片作者。

摘要

  • 我们可以通过普通最小二乘法最大似然估计找到线性回归的参数。
  • 通常在线性回归中,我们有一个不与输入相乘的标量参数,称为截距偏差
  • 估计参数的值的过程被称为训练或学习过程。
  • 由于对数是一个单调递增的函数,因此最大化似然函数与最大化对数似然函数相同。

Python 中的列表如何在内部优化以获得更好的性能

原文:https://towardsdatascience.com/how-lists-in-python-are-optimised-internally-for-better-performance-847c8123b7fa?source=collection_archive---------13-----------------------

python 内部实现及其优化的精确指南

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

洛杉矶复活节Unsplash 拍摄的照片

本文为合著,Muhammad Abutahir为*,你可以在*LinkedIninsta gram上找到他。

名单!python 编程语言中最常用的数据类型之一,也是每个 Python 爱好者最喜欢的数据类型之一。Python 列表的操作极其简单,而且本质上非常灵活。

Python 列表不像数组那样严格,列表是异构的,这意味着你可以在列表中存储不同数据类型的元素。列表的内部实现被设计成一种程序员友好的数据类型。原因是列表的可变性,因为它允许你对它们执行任何操作,比如添加单个元素、添加多个元素、删除操作等等!

列表在内部是如何工作的?

列表在后台使用可变长度数组,可变长度数组是数组的变体,其大小最初没有指定,或者其长度或大小是在运行时设置的,您也可以将它们称为自动数组。

这个实现是在 CPython 中完成的。还有其他变体,如 JPython 和 IronPython。就性能而言,它们之间可以有些许的差异,但是我要说的是 CPython。

让我们看看 CPython 中列表的基本结构。

这里的PyObject **ob_item;是指向列表元素的指针。这向我们解释了列表在内部存储指向元素的指针,而不是元素本身!这反过来又向我们解释了名单的异质性。也就是存储不同数据类型的元素,比如列表中的列表、字符串、数字以及任何你想到的东西。

如果我问你一个问题,比如‘空列表的大小是多少?’。最常见的答案是零!但是记住,大小和长度是两回事。如果我们检查一个空列表的大小,我马上会给你们看,结果是 40。这可能有多种原因,如变量的初始大小、垃圾收集选项的内存、内置函数的内存,尽管在调用它们时在堆栈内存中给了它们空间,但仍然有一些变量,等等。

创建一个名为 list 的空列表并检查其大小

这与我们使用内置的list()创建空列表的情况相同。__sizeof__()是一个以字节为单位返回对象大小的函数。

现在,如果我们通过将元素放在[]中直接创建一个列表,我们得到的大小是 8 个字节乘以元素总数,记住PyObject **ob_item;每次存储占用 8 个字节。这与您存储的元素的数据类型无关。

创建一个空列表和第二个列表来显示大小比较

在上面这段代码中,我创建了一个包含两个元素的列表,一个是数字,另一个是字符串,但是我们得到的是 56,即 40+8+8。抽象地说,我们可以想象上面的代码是如何在内存中演示的,如下图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由作者 Muhammad Abutahir 创建的图像:显示列表的内存分配

然而,当我们尝试使用用于向列表添加单个元素的append()时,会发生一些不同的事情。看看这个。

在过度分配期间创建一个空列表并填充以显示大小

哇!72?所以我们只是添加了一个元素,它必须是 48 **40+8!**但为什么是 72?那就像 **40+32。**这个我们赶紧了解一下。

列表中的性能优化

CPython 实现了过度分配的概念,这仅仅意味着如果您使用append()extend()insert()向列表中添加元素,它会给您 4 个额外的分配空间,最初包括指定元素的空间。我们称之为列表的调整大小,它发生在运行时。最初分配了 4 个空间,包括用于元素的空间,并以模式 8、16、25、35…等等继续。这样调整大小是为了提高性能。稍后我将向您展示如何通过这样做来提高性能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由作者 Muhammad Abutahir 创建的图像:显示列表中的超额分配

参考前面的代码,我们在其中使用append()向列表添加了一个元素。这是我们如何可视化 CPython 的过度分配概念。我已经展示了不可访问的浅绿色方框,虽然它们仍然存在,但是我们可以在__sizeof__()的帮助下看到内存,这就是我们得到 72 的原因,即 40+8+8+8+8!

现在,当我们追加更多的元素时,首先填充分配的空间,然后根据特定的模式调整大小。让我们看看同样的extend().

创建一个空列表并填充它以显示已填满的过量分配的内存

正如你所看到的,我添加了 3 个元素,但大小仍然是 72。这是因为已经分配的空间被填满了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由作者 Muhammad Abutahir 创作的图片:展示如何填补过度分配

这种过度分配是有原因的。当使用内置函数将新元素添加到列表中时,函数list_resize()被隐式调用,该函数在 CPython 中实现,每次添加新元素时都必须调用该函数,为了避免调用太多次,指定了一个调整大小模式,该模式以1.125 * new_size +3的方式计算,当元素多于 9 个时,数字 3 增加到 6。

现在,如果你试图在列表中添加一个新元素,列表会再次被过度分配,你会得到一个新的大小,请看下面的代码。

附加的最后一个值根据大小模式增加大小

如您所见,前面的空间被填满了,当您创建一个新元素时,大小从 72 增加到 104。因此,通过避免重复调用list_resize(),我们降低了堆栈内存和时间方面的成本,因此这很重要。

结论

在本文中,我深入讨论了 Python 中列表的内部实现和优化。非常聪明的是,程序员在我们需要的地方使用惊人的想法来提高性能,因为 python 与其他编程语言相比非常慢,因此采取这些类型的步骤可以减少程序员的大量痛苦。

说完这些,感谢大家阅读本文, 快乐学习!

LSTM & T-CNN 真正能记住的依赖长度是多少?

原文:https://towardsdatascience.com/how-long-dependencies-can-lstm-t-cnn-really-remember-7095509afde8?source=collection_archive---------12-----------------------

提示和技巧

免责声明:本文假设读者拥有 LSTM 和 CNN 神经网络的模型直觉和架构背后的初步知识。

LSTMs 是广泛用于顺序建模任务的技术,例如语言建模和时间序列预测。这样的任务通常有长期模式和短期模式,因此学习这两种模式对于准确的预测和估计是很重要的。基于变压器的技术正在兴起,这种技术有助于对长期依赖关系进行建模,远远优于 LSTMs。然而,由于数据密集型培训要求和部署复杂性,变压器无法用于所有应用。在这篇文章中,我将比较 LSTM 和 T-CNN 在长期信息学习方面的差异。

让我们开始…

技术 TLDR

LSTM 是一种长短期记忆神经网络,广泛用于学习序列数据(NLP,时间序列预测等…).由于递归神经网络( RNN )存在消失梯度问题,阻碍网络学习长时间尺度相关性,而 LSTM 通过引入遗忘门、输入门和输出门来减少这一问题。有了这些门,它就有了代表长期记忆的细胞状态,而隐藏状态则代表短期记忆。遗憾的是,LSTM 仍然不是保留长期信息的完美解决方案,因为遗忘之门倾向于从之前的步骤中移除这样的模式(信息衰减)——如果模式对于 50 步来说不重要,我为什么要保留它?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

香草 LSTM。作者图片

幂律遗忘门控 LSTM (pLSTM) 是最近由英特尔和约翰·霍普斯金的研究人员开发的。尽管 LSTM 有所改进,但遗忘机制表现出信息的指数衰减,限制了他们捕捉长时间信息的能力。可以阅读 论文 进行详细讲解。总之,由于信息衰减遵循 LSTM 的指数模式, pLSTM 给遗忘门增加了一个衰减因子 p,这使得 LSTM 可以控制信息衰减速率,帮助它更好地学习长期依赖关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

pLSTM。图像 src

时间 CNN (T-CNN) 是简单的 1D 卷积网络,可以应用于时间序列数据而不是图像数据。已知这些层具有时间属性,以学习数据中的全局和局部模式。卷积层还有助于改善模型延迟,因为预测可以并行化,不需要按顺序进行。由于 CNN 可能是因果性的,这意味着每个预测只能依赖于它以前的预测,因此没有来自未来的泄漏。使用深度神经网络和扩张卷积的组合,TCN 构成非常长的有效历史大小。T-CNN 有几种变体,如基于注意力的 CNN,将 LSTM 与 CNN 结合起来,融合其他类型的架构,然而,在这篇文章中,我将坚持使用普通的 T-CNN,以使它对我的读者简单,TCNN 的变体本身可以是一篇单独的博客文章。可以阅读 论文 进行详细解释。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因果卷积与标准卷积构成了 T-CNN 的基础。作者图片

合成数据

让我们从一个简单的加法函数开始:

y = f(xⁿ)+ f(x)

人们可以设计他们自己的功能,但是现在,让我们用这个。我们的假设是,序列越长,LSTM 应该越难记住 X⁰值,例如,具有 2 的序列是第 1 和第 2 个元素的相加,而 100 的序列是第 1(0)和第 100(或-1)个元素的相加。序列越大,LSTM 需要携带信息的步骤就越多。

按作者分类的数据生成器

LSTM 模型建筑

我创建了一个香草 LSTM 架构,并用超参数和堆叠 LSTM 层进行实验,以验证我们的假设

香草 LSTM 建筑和作者培训

CNN 模型架构

我创建了一个普通的 T-CNN 架构,并用超参数如内核大小、过滤器和卷积数来验证我们的假设

作者的香草 T-CNN 架构和培训

模型性能结果

MSE 是评估非偏斜数据的一个很好的方法,但是不太容易解释(除了数学家可以!).为了简化,我们可以看一下当 X 中的一个改变时,Y 的百分比变化。由于合成函数是相加的,将 X 中的一个改变 N 个百分点,应该会有 y 的 N/2 个百分点的变化,其次我们可以看看 致盲 。当我们将任一个 X 设为 0 时,我们可以测量 Y 是否等于非零 X 的 MSE。理论上,MSE 应该是 0.0

按作者的度量

结果和结论

我分别对 X[0]和 X[-1]应用了 50%的变化,以了解 Y 中的变化,并计算第 0 个变化列和第-1 个变化列。高达 68 个序列长度 LSTM 能够记住从时间序列开始的先前信息,但最终在第 69 个序列长度时忘记,而 CNN 仍然能够做出准确的预测,这仅仅是因为我增加了内核大小,以便它有机会查看序列的初始和结束值。盲法显示了相同的结果。当序列长度 69 的第 0 个值设置为 0 时,MSE 跳到 0.251%。总的来说,LSTM 似乎对-1 的变化比对 0 的变化更敏感。[ 这些结果会随着不同的数据大小和函数而变化,但信息是明确的“LSTMs 并不真的长!”]

按作者列出的结果

这些结果与 pLSTM 作者在他们的信息衰减部分描述的路径相同

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

pLSTM 的信息衰减作者

在本文中,我没有与 pLSTM 进行比较,因为目前还没有可用的开源实现,不过,我将在下一篇博客中跟进我自己的 pLSTM 实现。

** 在这里 ,你可以找到**链接 的完整代码。

预测范围应该有多长?

原文:https://towardsdatascience.com/how-long-should-the-forecast-horizon-be-2f24a6005b89?source=collection_archive---------10-----------------------

作为需求计划员,您只能关注有限的预测范围。应该是多长时间?

预测只能帮助你做出正确的供应链决策。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:https://commons . wikimedia . org/wiki/File:Conquistadores _ 654 . jpg

让我们假设你是一名供应计划员。您的主要供应商向您报价 3 个月的提前期,而您每月都下订单。

从技术上讲,你在当月的第一天下订单(这里是 M1)。订单接收发生在月初(它们不能用于履行前一个月的订单)。换句话说,你将在 M1 的第一天下订单,在 M4 的第一天收到订单。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你希望供应链的需求规划人员通过提供有用的需求预测来支持你

你是否应该要求他们关注以下内容:

  • 预测 M+1?
  • 预测 M+2?
  • 预测 M+3?
  • 预测 M+4?
  • 预测 M+1 到 M+3?
  • 预测 M+1 到 M+4?
  • 预测 M+1 到 M+6?

我在 LinkedIn 上做了一个调查,得到了这些答案:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我同意 38%的投票者的观点:你应该着眼于 5 个月的时间范围(可能稍微长一点)。我想这个答案对许多规划者来说是违反直觉的,因为 34%的人只对 M3 最大值感兴趣。

为了解释我对地平线的选择(M1 对 M5),让我们先来看看这个理论,然后用一个例子来说明它。

理论:库存优化、交付周期和审查周期

库存优化理论告诉我们,定期库存补充策略应该在 L+R(提前期+审查期)的风险范围*内得到保护。

*风险范围:收到订单(来自供应商)所需等待的最长时间。在此期间,您的库存有被耗尽的风险。在定期补货政策中,我们有风险期=提前期+审查期。我在我的书库存优化中介绍了这个概念。

我们之前的例子是 4 个月:3 个月的交付周期加上 1 个月的评审期。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

交付时间、审查期和风险范围

这是一个违反直觉的答案。大多数供应计划员会关注 M+3 预测或累计 M+1 到+3 预测,而不是累计 M+1 到+4 预测。

例子

让我们举个例子。我们稍后将讨论 M5 和 M6。

让我们想象一下下图中突出显示的订单和需求计划。绿色表示即将收到的订单,红色表示需求预测。在下订单时(就在 M1 刚开始的时候),我们的库存水平是 150 件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

订单和需求计划

假设我们希望在收到新订单之前,每月以 100 件的库存水平完成。通过这样定义我们的库存目标,它将对应于安全库存的定义。

**举个例子。**在 M1 结束时,我们预计库存为 150–50 = 100 件(=起始位置-预期需求)。然后我们会收到之前 40 台的订单,达到 140 台,开始在 M2 生产。

查看下图,我们计算出,到 M3 结束时,我们预计库存为 70 件。这比我们 100 件的目标低了 30 件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于 3 个月的交付周期,订单 1(我们现在正在制作)将无法及时到达,无法在接下来的 3 个月内改变任何事情。我们唯一能影响的是 M4 年末的股票水平。

如下图所示,现在订购 80 件,我们将确保 M4 期末的库存为 100 件(起始= 70+80;消费= 50;剩余库存= 100)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们现在需要订购 80 台才能达到 M4 年底的库存目标。

哪个预测最重要?

看上面的图,我们意识到改变 M1 到 M4 的预测将会改变我们应该订购的数量。

**示例:**如果您的需求计划员通过将预期需求从 75 件更改为 100 件来更新 M2 预测,您也应该做出反应,将订单增加 25 件。

这意味着从 M1 到 M4 的任何时期对确定您的订单金额都同样重要。

展望未来

让我们回顾一下到目前为止的故事。

我们需要向我们的供应商发出月度订单,供应商的报价是提前 3 个月。我们意识到,为了决定现在订购多少,我们必须关注未来 4 个月的需求预测。

但是,实际上,这并不是全部情况。

最佳服务水平和风险

库存优化科学告诉我们,我们需要根据盈利能力和风险来优化服务水平。基本上,你需要平衡库存过多和不足的风险和成本。

让我们想象两个简单(极端)的场景:

  • 案例# 1:M5 的预期需求为 1000 件。
  • 方案# 2:M5 的预期需求为 0 件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

场景 1 和 2(看看 M5)

我们最初假设我们希望以 100 件的安全库存完成 M4。显然,如果我们不希望在 M4 之后有任何销售(场景 2),以 100 件的库存结束 M4 将不是一个明智的决定。另一方面,如果我们预计在 M5 销售 1000 件(场景 1),我们可以为 M4 留出更大的安全边际(因为过时或长期剩余的风险较低)。

合作

通过向您的供应商提供更长远的观点,您可以帮助他们缩短交货时间、降低成本并增加库存。

更进一步#1:提前期的概率预测

在最近的一篇文章中,我展示了概率预测比点预测(更)相关和有用。

  • 点预测:将未来与单一预期结果联系起来,通常是一个平均预期值(不要与最有可能的结果混淆)。我们预测下个月会卖出 1000 件。
  • 概率预测:分配不同事件发生的概率。

如果你想正确评估你需要多少库存(并优化安全库存和服务水平),你需要得到一个在这个风险范围内会发生什么的概率视图。

基本上,我们应该着眼于 L+R 上的需求分布,而不仅仅是 L+R 上的点预测。

请注意,M1 到 M4 的需求分布通常不同于 M1、M2、M3 和 M4 的需求分布之和。但那是后话了。

更进一步#2:销售损失与延期交货

延期交货的库存策略(所有超额需求都保留到有存货可用)不同于销售损失的策略(所有超额需求都损失)。

  • 销售损失:当你缺货时,你的客户(通常)会取消订单。你需要注意风险范围内可能发生的任何短缺。所以你需要对每个月的期间可能发生的事情有一个详细的了解(除了对整个地平线有一个好的预测之外)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

销售损失:如果 M1 需求增加 150 件(至 200 件),对订单的影响只是增加+75 件,因为失去了 M1 和 M2 的过剩需求。

销售损失在 B2C/快速消费品中很常见,这使得需求规划者很难估计真实需求

  • 延期交货:在库存短缺的情况下,你的客户会保留他们的订单,等待再次有货。在这种情况下,如果您错过了风险范围内的任何库存,对订单需求没有影响:总需求不会受到影响。然后,您可以关注从 M1 到 M4 的累计预测,而不是每个月的单独预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

延交订单:如果 M1 需求增加 150 件(达到 200 件),对订单的影响是增加+150 件(80+150=230),因为所有的过剩需求都延交了。

  • 在大多数供应链中,一些客户会保留他们的订单(或再订购),而一些会直接去竞争。为了优化您的订单数量,您必须估计在风险范围内发生销售损失的可能性。

结论

总之,最佳实践是专注于在风险范围(交付周期加审查周期)加上几个周期内预测需求(以了解库存过多/过少以及与供应商合作的风险)。

行动呼吁

如果您正在管理需求规划流程,我建议您修改您正在跟踪的预测 KPI。单纯看 M+1 或 M+2 是不够的。

👉我们在 LinkedIn 上连线吧!

感谢

斯蒂芬·德·科克

关于作者

icolas Vandeput 是一名供应链数据科学家,擅长需求预测和库存优化。他在 2016 年创立了自己的咨询公司 SupChains ,并在 2018 年共同创立了 SKU 科学——一个快速、简单、实惠的需求预测平台。尼古拉斯对教育充满热情,他既是一个狂热的学习者,也喜欢在大学教学:自 2014 年以来,他一直在比利时布鲁塞尔为硕士学生教授预测和库存优化。自 2020 年以来,他还在法国巴黎的 CentraleSupelec 教授这两门课程。他于 2018 年出版了 供应链预测的数据科学(2021 年第 2 版)和 2020 年出版了 库存优化:模型与模拟

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

机器学习如何为你推荐电影

原文:https://towardsdatascience.com/how-machine-learning-recommends-movies-for-you-6f418f26bcb2?source=collection_archive---------21-----------------------

以实用的方式介绍人口统计过滤、基于内容的过滤和协作过滤

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Unsplash 上的 Thibault Penin 拍摄

在本文中,我们来讨论一个项目,该项目阐述了机器学习算法如何通过使用推荐系统来推荐你可能想要观看的下一部电影。这种方法不仅可以用于电影内容,还可以用于为每个用户特别选择的其他数字对象,例如,书籍、网页、音乐、消息、产品、约会偏好,当然还有已经被几家公司广泛执行以改善其数字平台内的客户体验的电影。

本项目将实施三种类型的推荐系统,分别是:

  • 人口统计过滤为具有相似人口统计背景的用户提供相似的电影,这些电影受欢迎且评价良好,而不考虑类型或任何其他因素。因此,由于它没有考虑每个人的个人爱好,所以它提供了一个简单但易于实现的结果。
  • 基于内容的过滤考虑对象的内容,在电影的情况下,可以是演员、导演、描述、流派等。所以会给用户更贴近个人喜好的电影推荐。
  • 协同过滤关注用户的偏好数据,并在此基础上通过与其他用户具有相似偏好的历史电影进行匹配来推荐电影,并且不需要电影元数据。

在了解了推荐系统的机制之后,让我们使用 TMDB 的电影数据集来启动我们的第一个推荐系统项目,该数据集可以通过 Kaggle 这里下载。这个数据集包含两组文件,分别是演职员表文件和电影文件。演职员表文件大小为 38MB,具有 4 个特征,即电影 ID、标题、演职人员姓名(屏幕成员)和工作人员姓名(后台成员)。另一方面,大小为 5.4MB 的电影文件包含更多功能,即电影的预算、类型、主页、ID、关键字、原文、原标题、制作公司、制作国家、上映日期、收入、运行时间(分钟)、状态(已上映或传言)、标语、标题、平均投票和投票计数。

像往常一样,首先,我们需要导入几个启动库,如下所示:

import numpy as np
import pandas as pd

如果你正在使用 Google Colab,不要忘记将电影和演职员表文件上传到 Colab,如下所示:

from google.colab import files
uploaded = files.upload()

然后使用 Pandas 的 read 函数将这些文件分配给变量,并读取它们的大小:

credits = pd.read_csv('tmdb_5000_credits.csv')
movies = pd.read_csv('tmdb_5000_movies.csv')
print(credits.shape)
print(movies.shape)

正如我们在下面看到的,两个文件都有 4803 个数据,其中 4 个特征用于演职员表文件,20 个特征用于电影文件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为有两个文件,我们应该根据它们的电影 ID 合并这些文件。但是在合并之前,让我们将演职员表文件的“电影 ID”列更改为“ID ”,因此,当合并时,它们将具有相同的“ID”特征,然后检查新合并文件的大小。

credits.columns = ['id','tittle','cast','crew']
movies= movies.merge(credits,on='id')
print(movies.shape)

现在,我们新的合并文件包含 23 个特征,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

人口统计过滤

据我们所知,人口统计过滤是最简单的推荐系统之一,它只为用户提供最好的评级和最受欢迎的电影。然而,虽然这可能很简单,但我们仍然需要适当的公式来计算最佳评级的电影,因为有些电影有 9.0 评级,但只有 5 票,所以对于其余评级略低但票数多得多的电影来说,这是不公平的。

IMDB 提供了计算电影分级的最佳公式,在这里有明确的表述。它基本上考虑了投票数、需要考虑的最低投票数、平均投票数和平均评分,最终得出一个公式如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中:

  • W =加权评级
  • v =电影的投票数
  • m =需要考虑的最低票数
  • R =电影评分的平均数
  • C =总体数据的平均票数

因此,我们需要确定这些元素中的每一个,以便获得 w。数据集中已经提供了投票数(v)和平均投票数(R ),因此,我们不需要进一步计算这些变量。接下来,我们需要找出 C,它是所有投票的平均值,可以通过以下函数确定:

C= movies['vote_average'].mean()

如果我们试着打印出 C 的值,我们会得到 6.092…如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来,我们需要确定 m,这是一部电影被认为是推荐所需的票数。我们可以将其设置为任何数字,但是,假设在我们的算法中,我们将它设置为 85%作为我们的截止值,这意味着要被考虑,该电影需要有超过整体电影 85%的票数。让我们来看看:

m= movies['vote_count'].quantile(0.85)

正如我们在下面看到的结果,为了让一部电影被推荐,它必须至少有 1301 票。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过使用 m 的值,我们可以如下消除评级数量低于 1301 的电影:

demograph_movies = movies.copy().loc[movies['vote_count'] >= m]

现在我们可以看到 4803 部电影中只有 721 部的票数超过 1301。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

找出所有元素后,让我们通过定义其函数来创建 IMDB 加权评级公式,如下所示:

def weighted_rating(a, m=m, C=C):
  v = a['vote_count']
  R = a['vote_average']
  return (v/(v+m) * R) + (m/(m+v) * C)

然后,我们可以通过创建一个名为“score”的新特性,将 IMDB 公式的结果插入到人口统计推荐文件中

demograph_movies['score'] = demograph_movies.apply(weighted_rating, axis=1)

之后,我们需要根据加权评分对电影进行降序排序。

demograph_movies = demograph_movies.sort_values('score', ascending=False)

现在,让我们通过使用我们刚刚构建的 IMDB 公式,根据我们的人口统计推荐算法来看看前 10 部电影是什么:

demograph_movies[['title', 'vote_count', 'vote_average', 'score']].head(10)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结果《肖申克的救赎》高居榜首,紧随其后的是《搏击俱乐部》和《低俗小说》。他们确实是伟大的电影,然而,这个推荐系统适用于所有人,不管用户的类型或其他因素偏好,因此,它被认为是远非完美的。

基于内容的过滤

与人口统计过滤不同,基于内容的过滤在向用户推荐电影之前会考虑电影中的每个元素,如电影的描述、类型、演员、工作人员等。这样,用户将更有可能收到与他们喜爱的电影更一致的推荐。

基于电影描述的推荐

让我们从提供具有相似描述的电影推荐开始,在电影数据集中,存储在“概览”功能中的数据可以通过这里找到:

movies['overview'].head(10)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为我们在这里处理句子,所以采用一种叫做 TF-IDF 的 NLP(自然语言处理)技术是更明智的,TF-IDF 是术语频率-逆文档频率的简称。TF-IDF 所做的是,通过使用以下公式查找 TF 和 IDF 来分析每个单词的重要性:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后 TF-IDF 可以通过简单地将 TF 和 IDF 的结果相乘得到,因此:

TF-IDF = TF*IDF

TF-IDF 计算由 Scikit-Learn 库提供,可通过以下代码导入:

from sklearn.feature_extraction.text import TfidfVectorizer

在执行 TF-IDF 之前,我们需要执行必要的 NLP 预处理任务,例如通过分配一个新变量来删除停用词(没有意义的词,例如,“a”、“the”、“but”、“what”、“or”、“how”和“and”)。

tfidf = TfidfVectorizer(stop_words='english')

我们还需要用一个空字符串替换 NaN:

movies['overview'] = movies['overview'].fillna('')

然后,我们可以将 TF-IDF 矢量化应用于电影概览,并检查其大小:

tfidf_overview = tfidf.fit_transform(movies['overview'])
tfidf_overview.shape

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如我们在上面看到的,在“概览”功能中有超过 20,000 个单词用于描述 4803 部电影。

因为我们已经为概览的句子计算了 TF-IDF 矢量化,所以我们现在可以找出两部电影之间的相似性,这实际上有几种方法,如欧几里德、皮尔逊相关和余弦相似性。但是考虑到简单性,我们会使用余弦相似度,余弦相似度可以通过使用 sklearn 库中的 linear_kernel()函数获得。

首先,我们需要从下面的 sklearn 导入线性内核:

from sklearn.metrics.pairwise import linear_kernel

然后我们可以通过它找出余弦相似度。

cos_sim = linear_kernel(tfidf_overview, tfidf_overview)

通过这种方式,我们发现了电影描述之间的相似性。然而,在我们创建一个基于描述的相似性返回电影推荐的函数之前,我们需要如下设置每个标题中的索引:

indices = pd.Series(movies.index, index=movies['title']).drop_duplicates()

然后,我们可以根据他们的描述开始构建电影推荐功能,如下所示:

def des_recommendations(title, cos_sim=cos_sim):
    idx = indices[title]
    sim_scores = list(enumerate(cos_sim[idx]))
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
    sim_scores = sim_scores[1:16]
    movie_indices = [i[0] for i in sim_scores]
    return movies['title'].iloc[movie_indices]

在上面的基于描述的推荐算法中,首先,我们根据电影的标题获得电影的索引,然后收集具有相似余弦相似性结果的电影,然后按照降序对电影进行排序,然后将结果的数量设置为 15,然后获得推荐电影的索引,最后,根据所述方法向我们展示前 15 部电影。

来试试小黄人的电影推荐:

des_recommendations('Minions')

我们得到以下卡通/儿童电影作为推荐:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我们尝试黑暗骑士:

des_recommendations('The Dark Knight')

我们得到的推荐大多是另一部蝙蝠侠电影:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我认为这种类型的推荐系统将能够提供比人口统计过滤系统更相关的推荐。

协同过滤

与基于内容的过滤不同,基于内容的过滤只根据其他电影的元素为我们推荐电影,协同过滤将为用户提供更多的个人体验,因为它将用户的评级考虑在内。在继续之前,我们首先需要了解两种类型的协同过滤,即基于用户的过滤和基于项目的过滤。正如我们从他们的名字中看到的,基于用户的过滤基于用户评估评分的相似性,另一方面,基于项目的过滤基于项目评估他们评分之间的相似性。此外,用户和项目之间的相似性可以根据皮尔逊相关和余弦相似性公式来计算。

因此,CF 可以预测用户对某部电影的喜欢程度,即使用户尚未对其进行评级。接下来,为了开始 CF 项目,我们需要从 Kaggle 这里的下载另一个数据集,特别是“ratings_small.csv”数据集,因为之前的数据集不包含用户 ID 功能,而这在 CF 项目中是必不可少的。

ratings = pd.read_csv('ratings_small.csv')

我们还需要导入 scikit-surprise 库来利用它的 SVD 和其他功能。如果你还没有安装惊喜,你可以运行下面的代码:

pip install surprise

然后,我们可以导入惊喜库:

from surprise import Reader, Dataset, SVD
from surprise.model_selection import cross_validate

因为我们正在处理大量基于用户和产品的数据,所以我们需要通过实施奇异值分解(SVD)来降低可扩展性和稀疏性问题的可能性,我们将能够通过评估 RMSE(均方根误差)和平均绝对误差(MAE)来检查数据集性能。注意:RMSE 和 MAE 的值越低,表明数据集的性能越好。

reader = Reader()
data = Dataset.load_from_df(ratings[['userId', 'movieId', 'rating']], reader)
svd = SVD()
cross_validate(svd, data, measures=['RMSE', 'MAE'], cv=5)

我们可以看到,实施奇异值分解后,MAE 和 RMSE 的结果都小于 1,在可接受的范围内:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

既然它表现不错,那我们就来训练一下我们的数据:

train = data.build_full_trainset()
svd.fit(train)

让我们检查用户 ID 为 1:

ratings[ratings['userId'] == 1]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们用电影 ID 302 对用户 ID 1 进行预测:

svd.predict(1, 302, 3)

我们得到了 2.87 的评估评级预测

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论

人口统计、基于内容和协作是非常不同的推荐系统,它们通过考虑不同的元素来操作,然而,人口统计被认为是其他推荐系统中最简单的,但是基于内容和协作给出更个性化的电影推荐。

谢谢你的阅读,我希望你喜欢它。

家庭——有什么比拥有两辆电动汽车更好?

原文:https://towardsdatascience.com/how-many-electric-cars-should-a-family-own-aa7c146ebae4?source=collection_archive---------25-----------------------

我们展示了一个家庭如何优化 CO₂排放和车队的日常可用性。解决方案出人意料。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Denys Nevozhai 在 Unsplash 上拍摄的照片

已经有大量研究比较了电动汽车(也称为“BEV”)和内燃机汽车(ICE)的温室气体排放和成本。对于需要两辆车的社区(例如家庭或住户)的问题的优化研究较少。

为了填补这一空白,也出于自身利益,我们为这项研究详细模拟了一个现实场景

我们优化以下两个标准以达成一个平衡可行的解决方案:

  • 气候足迹。在整个生命周期中(包括汽车和电池生产、燃料供应等),CO₂的排放量应降至最低。).
  • 日常可用性。充电和加油意味着时间和物流的损失。因此,我们的解决方案应该只需要每年几天的时间,就可以每天给车辆充电/加油一次以上。

由于整个研究有点复杂,我们将从头开始:首先是结果和影响,然后是假设和模拟的细节。

内容

  • 研究结果
  • 模拟:假设
  • 模拟:细节
  • 模拟:结果
  • 胜利者
  • 总结和展望

研究结果

正如所承诺的,我们从结果开始。细节和假设将随后。以下是主要发现:

  • 在现实假设下,一个家庭/住户的最佳使用一辆电动车和一辆柴油车
  • 如果每天的距离很短或者如果一次充电最多可以覆盖的距离,那么电动车应该总是首选用于日常使用。
  • 由于电池是 CO₂-intensive 生产的,电动车应该有而不是小电池(例如 45 千瓦时)。
  • 与使用两辆电动汽车相比,如果其中一辆汽车有内燃机,一天内第二次加油/充电的需求会大大减少**(减少到百分之一)。**

如果电动汽车主要用于短距离和中距离,大多数充电可以在家中自己的车库中进行。这样可以节省时间和金钱。对于私人光伏(PV)系统的所有者来说,CO₂可以降低得更多。

另一个有趣的发现是:

  • 使用两辆电动汽车,都有一个大电池,导致我们的场景相当差的碳足迹。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

夏洛特·斯托在 Unsplash 上的照片

你对我们如何得到这些结果感到好奇吗?接下来的部分将让您深入了解细节…

模拟:假设

对于我们的模拟,我们必须做一些假设。假设的一部分是基于文献研究,第二部分是关于被调查情景的定义。在任何情况下,仿真模型可以快速且容易地适应变化的参数。

为了获得可比较的结果,我们将我们的分析建立在紧凑型车的基础上。该级别还包括目前在欧洲占据最大市场份额的车型(大众高尔夫,大众 ID.3)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们已经为模拟程序编写了一些代码。将来更改参数可以不费吹灰之力。照片由阿诺·弗朗西斯卡Unsplash 拍摄

所以让我们一个一个地检查假设:

每单位能源的 CO₂排放量

  • 每度电 0.468 千克 CO₂。
  • 每升汽油含 3.140 千克 CO₂。
  • 每升柴油含 3.310 千克 CO₂。

第一个假设基于欧洲电力组合“eu 2014”(1)。由于电动汽车在行驶过程中不会排放任何温室气体,因此排放的气体完全是用于提供能源的废气。为了公平的比较,这些不能被忽略。

在燃料生产过程中,内燃机的排放量也因 CO₂负荷而增加,以计算总排放量(2)。

汽车生产和处置的 CO₂排放

根据(1),生产小型汽车的温室气体排放量如下:

  • 一辆电动汽车(bev)8,110 公斤 CO₂。
  • 汽油车 7,425 千克 CO₂
  • 柴油车为 7,609 千克 CO₂

对于电动汽车,每千瓦时的电池尺寸增加了一个额外的 145 公斤 CO₂。因此,容量为 50 千瓦时的电池需要额外的 7,250 千克 CO₂用于生产和处理电池。

消费

对于油耗值,为了保持一致,我们使用了相同的来源(1)。以下是假设,通常单位为升或千瓦时每 100 公里:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据 ifeu 模型(1),紧凑型车辆的消耗量。电动车= BEV。混合类别对应于 30%的城市、40%的郊区和 30%的公路。

将每千瓦时或每公里的排放量数据乘以消耗量就可以得出每公里的 CO₂排放量。这样就可以很容易地比较不同使用领域的车型(“道路类型”):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不同车辆类别和道路类型的每公里 CO₂排放量。

场景的定义

我们模拟的场景大致代表了一个家庭典型的日常流动性。我们假设每年有几次长途旅行(如假期)和大量的短途旅行。

下表定义了这方面的详细信息。道路类型下面的数字就是所谓的“汽车日”。“城市”下方第一个单元格中的数字 100 被解释为每年有 100 天需要一辆行驶总距离为 5-10 公里的汽车,主要是“城市”。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个路线区域和道路类型一年内的出行次数。例如,假设在 5 天内完成 200-300 公里的旅程,主要是在高速公路上。

总的来说,这意味着每年 385 个“汽车日”行驶 27,625 公里。如果无车日的数目作为进一步的参数被给定为 20,则恰好一辆车或两辆车都在使用的日子分别是 325 和 40。

快速检查显示正确:20 x 0+ 325 x 1 + 40 x 2= 385。

对于我们的模拟,我们当然可以根据需要调整该部分中的所有参数。

模拟:细节

为了得到可靠的结果,我们使用了所谓的“蒙特卡罗”模拟。基本上,在 10 年的时间里,我们每天随机确定是否有 0、1 或 2 辆车在使用,以及哪些日常路线必须行驶。

使用编程语言 R ,这可以通过使用:

## Decide on 0, 1, 2-car days by Monte Carlo. 
nDays = 365 * years
dayType = sample(
 0:2, size=nDays, replace=TRUE, 
 prob=carDayDistribution[c("zeroCarDays","oneCarDays","twoCarDays")]
)

例如,所谓的 2 辆车一天所需的日工作量可能如下所示:

  • 路线 A: 7 公里,市区。
  • B 路线:980 公里,高速公路。

“随机”是指平均而言,场景部分中显示的表的分布是复制的。然而,10 年后,高速公路或城市出行仍然会更多甚至更少。

根据模拟运行的 2 种汽车类型(BEV、汽油、柴油),将在一天内选择使用其中一种汽车。
我们的决策标准(每天)如下:

  • 如果只有一条路可走,我们选择 CO₂排放量最低的车。假设每天最多可以行驶 1 次充电/加油。
    否则,我们选择行驶里程更长的车辆。
  • 如果有两条路线要行驶,我们选择的路线要使汽车每天的 CO₂排放量最小。如果其中一辆车需要充电或加油不止一次,我们会为行驶里程较长的车辆分配较长的距离。

顺便说一句,我们并不假设充值发生在 0%,但在 20%;)同样,我们使用矢量化代码:

**## 1-Car-Days.**
nOneCar = sum(dayType == 1) 
# Get n tracks as a data.frame including driveType and km. 
tracks = getTravelRequests(nOneCar, carDaysData) 
CO2_carA_track1 = CO2_per_km[tracks$driveType,fuelTypeA] * tracks$km
CO2_carB_track1 = CO2_per_km[tracks$driveType,fuelTypeB] * tracks$km
...
selected_car = ifelse(
  (CO2_carA_track1 <= CO2_carB_track1) & (tracks$km<=rangeA), "A", 
  ifelse(
    (CO2_carB_track1 <= CO2_carA_track1) & (tracks$km<=rangeB), "B",
    ifelse(
      rangeA >= rangeB, "A", 
      "B"
    )
  )
)**## 2-Car-Days.**
nTwoCars = sum(dayType == 2)
... 

因此,该规则是确定性的,并且相对简单。正如你所看到的:CO₂最小化的组合,但避免了“连续加油日”。

由于电池大小是决定性的,我们使用以下 5 种汽车类型:

  • 45 千瓦时的 BEV
  • 60 千瓦时的 BEV
  • 85 千瓦时的 BEV
  • 55 升油箱的汽油
  • 带 55 升油箱的柴油发动机

顺便说一句,内燃机的油箱大小并不真正影响结果。

模拟:结果

对于两种车型的每种组合(甚至是两次相同的车型),进行了 50 次持续时间为 10 年的模拟。该模拟为我们提供了车辆生产、使用和处置过程中 CO₂总消耗量的详细信息。它还给出了单次充电/加油不够用的“汽车日”数。

CO₂消耗量(整个汽车寿命)的表格有些令人惊讶。很明显 2 款汽油车表现很差(69.5t)。但是 2 个 2 个大电池的 bev 也远远落后(66.7t):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

各种车辆组合的 CO₂排放量,单位为千克(50 次模拟的平均值,每次 10 年)。绿色表示 4 个最佳值(低于 60 吨 CO₂),橙色表示 2 个最差值(高于 65 吨 CO₂).

如果电池容量保持较小(60 千瓦时,45 千瓦时更好),那么 2 个 bev 的组合是环保的。但是,即使一辆 45 千瓦时的柴油 BEV 仍然低于 60 吨 CO₂.

但是哪些组合适合日常使用呢?这就是下表告诉我们的。实际上,包括至少一个柴油或汽油发动机的所有组合将在 10 年内管理最多一次需要不止一次充电/加油的行程:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

需要多次充电/加油的行程次数(平均 50 次模拟,每次 10 年)。如果<10, in orange if > 150 显示为绿色。

如果你选择两杯饮料,情况就完全不同了。在这种情况下,需要更频繁地充电,在 10 个模拟年内平均 100 到 200 次,也就是说每年 10 到 20 次。

获胜者

我们的获胜者就这样被确定了。两个表中只有一个组合显示绿灯:

如果你正在寻找一个实用的解决方案,你的车队中应该有一辆带小电池(例如 45kWh)的 BEV 以及一辆内燃机** 车辆(例如柴油)。**

为了获得最佳值,BEV 的范围足够的所有路线当然应该用 BEV 驱动。

对于获胜的解决方案,我们自然希望更详细一些,并给出 50 次模拟运行之一的额外关键数字。在下表中,第 1 行显示了汽车“A”(BEV)的汇总,第 2 行显示了汽车“B”(diesel)的汇总。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“成功解决方案”的详细信息。汽车类型,燃料类型,总公里数,汽车天数,平均。每辆车每天行驶的公里数,燃油消耗量和燃油产量的 CO₂,最大行驶天数。1 充电/燃料,CO₂用于汽车生产,CO₂用于电池生产,CO₂总排放量。

可以看出,BEV 行驶了 3293 次,行程 40.6 公里,而 diesel 平均行驶了 530 次,行程 242 公里。

BEV 产生 8.1 吨 CO₂用于汽车生产,6.5 吨用于电池,11.0 吨用于能源供应。总计25.7 吨
柴油则需要 7.6t CO₂用于汽车的生产,尾气和能源供应共 24.0t,总计 31.5t

两个值之和甚至低于 50 次模拟的平均值(59.7t)。这是因为模拟的本质也考虑了散射。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

瑞尼尔·卡尔在 Unsplash 上拍摄的照片

摘要

我个人从这项研究中的收获是:

  • 就气候平衡和日常使用的适宜性而言,电动和柴油车辆的组合为我们的场景实现了最佳结果。
  • 100%电动或 100%内燃机都不会产生好的结果。
  • 必须批判地看待大电池的趋势。如果你拥有一个不止一辆车的车队,你有很多优化的选择。装有小电池的 BEV 通常能显著改善气候平衡。

观点

许多参数,如使用的电力组合、燃料消耗等。,可以快速改变。我们不排除在不久的将来用修改的参数更新现有模拟的可能性。

我们还考虑将模拟在线作为一个小型网络应用程序,这样每个人都可以模拟他们自己的场景——从而为他们自己和环境得出最佳的行动建议。

来源

(1)Agora Verkehrswende(2019):Klimabilanz von elektroautoos。einflussfaktoren und Verbesserungspotenzial。

(2) Auke Hoekstra,innovationorigins (2020 年):汽油和柴油的二氧化碳排放量将增加

一个神经网络有多少个神经元?

原文:https://towardsdatascience.com/how-many-neurons-for-a-neural-network-2107627f7869?source=collection_archive---------28-----------------------

让我们看看如何找到神经网络的最佳神经元数量

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

神经网络是机器学习的一个迷人领域,但它们有时很难优化和解释。事实上,他们有几个超参数。要调整的最常见的超参数是隐藏层中神经元的数量。让我们看看如何为我们的数据集找到神经网络的最佳神经元数量。

什么是神经网络?

神经网络是一种特殊的模型,它试图捕捉特征和目标之间的相关性,根据神经元层转换数据集。有几本书是围绕神经网络写的,给你一个这种模型的完整概述不在本文的范围之内。我只能说,神经网络是由几层神经元组成的。每个神经元获得一些输入,转换它们并返回一个输出。一个神经元的输出可以成为下一层神经元的输入,以此类推,构建越来越复杂的体系结构。

第一层称为输入层,由神经元构成,它返回特性本身的值。然后,第一层的每个神经元与隐含层的所有神经元相连,隐含层负责网络的学习能力。隐藏层之后可以是其他几个隐藏层,这是典型的深度学习网络。最后,将最后一个隐藏层的输出提供给给出结果(即目标变量的值)的输出层。

从最简单的形式来看,神经网络只有一个隐藏层,如下图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

输入层的神经元数量等于特征的数量。根据目标变量定义输出层的神经元数量。这就出现了为隐藏层找到正确数量的神经元的问题。

少数可能会产生欠拟合,因为网络可能无法正确学习。高数值可能会产生过度拟合,因为网络从训练数据中学到了太多东西,而没有进行归纳。因此,必须有一个中间数量的神经元来确保良好的训练。

如何优化神经元的数量

程序非常简单,它使用交叉验证:

  • 设置若干神经元
  • 在 k 倍交叉验证中计算某些性能指标的平均值
  • 用不同数量的神经元重复这个过程
  • 选择在 k 倍交叉验证中使平均值最大化的神经元数量

交叉验证很重要,因为使用它我们可以确保模型不会过拟合或欠拟合。

这个过程非常类似于超参数调整,因为隐藏层中的神经元数量实际上是要调整的超参数。

现在让我们看看如何在 Python 中应用这个过程。

Python 中的示例

在这个例子中,我将展示如何使用 scikit-learn 库优化 Python 中的神经元数量。在现实生活的例子中,您可能会使用 Keras 来构建您的神经网络,但概念是完全相同的。你可以在我的 GitHub 库中找到代码。

我将使用 scikit-learn 中包含的乳腺癌示例数据集。

首先,我们来导入一些有用的库。

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.metrics import roc_auc_score

然后,我们可以加载数据集,并将其分成训练集和测试集。

X,y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

现在,我们必须定义我们的模型。对于这个例子,我将使用一个简单的多层感知器,只有一个隐藏层。为了简单起见,构造函数的所有参数都保持标准值。我只是设置了随机状态,以保证结果的重现性。

在将数据集提供给神经网络之前,不要忘记缩放您的要素。为了简单起见,我将使用 scikit-learn 中的 Pipeline 对象,然后应用标准化。关于缩放技术的更多信息,你可以参考我之前的博客文章和我的预处理课程

model = Pipeline([
                  ('scaler',StandardScaler()),
                  ('model',MLPClassifier(random_state=0))
])

现在,我们必须通过搜索最佳数量的神经元来优化我们的网络。请记住,我们会尝试几种可能的数字,并在交叉验证中计算绩效指标的平均值。最大化这样一个值的神经元的数量就是我们正在寻找的数量。

为此,我们可以使用 GridSearchCV 对象。由于我们正在处理一个二元分类问题,我们要最大化的度量是 AUROC。我们将以 2 为步长从 5 个神经元跨越到 100 个神经元。

search = GridSearchCV(model,
   {'model__hidden_layer_sizes':[(x,) for x in np.arange(5,100,2)]},
   cv = 5, scoring = "roc_auc", verbose=3, n_jobs = -1

)

最后,我们可以搜索神经元的最佳数量。

search.fit(X_train, y_train)

搜索结束后,我们得到最好的平均分数,即:

search.best_score_# 0.9947175348495965

神经元的最佳数量是:

search.best_params_# {'model__hidden_layer_sizes': (75,)}

最后,我们可以在测试数据集上计算这种模型的 AUROC,以确保我们没有过度拟合我们的数据集。

roc_auc_score(y_test,search.predict_proba(X_test)[:,1])# 0.9982730973233008

我们获得的值仍然很高,因此我们非常确定优化的模型已经从它携带的信息中学习了训练数据集。

结论

优化神经网络可能是一项复杂的任务。在本文中,我解释了一种优化神经元数量的可能方法,但同样的概念甚至可以应用于其他超参数(如激活函数、最小批量、时期数、学习速率)。请记住,超参数的数量越多,优化速度越慢。

如果你想了解更多关于神经网络的知识,加入我的 Python 在线课程监督机器学习。

原载于 2021 年 5 月 10 日 https://www.yourdatateacher.com**的

你需要多少样品?

原文:https://towardsdatascience.com/how-many-samples-do-you-need-simulation-in-r-a60891a6e549?source=collection_archive---------23-----------------------

R 中的模拟

在水产养殖中,实验是在装有鱼的水槽中进行的。这些鱼是单独测量的,这是一项乏味而又紧张的工作。我被要求计算一个人需要采集多少鱼的样本才能维持相当于一个完整样本实验的能量

为了检测整体效果,我使用了来自 ANOVAF 值。从这种模型中获得的任何 p 值表明,在包含多个处理的实验中,任何处理之间是否存在任何’显著性’差异。“显著性”的极限通常设置为 0.05,这意味着我们接受每 20 次重复试验中 1 次的 5%1 型错误假阳性率(这里不深入探讨 Frequentist 理论)。

为了尝试回答最初的问题,我收到了一个数据集,其中包含了对各种处理的每缸鱼的观察结果。根据频率理论,我们知道获得显著 p 值的能力——如果真的存在的话——取决于均值、标准差和样本大小。平均值和标准差用于计算处理内的变异系数,以及处理间的效应大小。在这个例子中,效果大小是处理之间的差异,通过标准偏差进行校正。

对于这个练习,我使用了 R 编程语言,但它可以很容易地在 SASPython 或任何其他选择的编程语言中复制。

让我们加载我认为我会需要的库。

然后,让我们导入数据并查看一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里,您可以看到按治疗和按坦克划分的数据分布。下面的代码显示每个容器包含 35 个观察值。

# A tibble: 12 x 2
   Tank  no_rows
   <fct>   <int>
 1 120        35
 2 121        35
 3 122        35
 4 123        35
 5 125        35
 6 126        35
 7 127        35
 8 128        35
 9 129        35
10 132        35
11 133        35
12 137        35

用于测试当前功率(事后)的模型和度量分别是 ANOVA 和 f 检验。f 检验寻找所有处理之间的差异,以说明在给定假阳性率的情况下,它们是处理之间的差异。

结果、显著性和 F 值显示在下面的代码中。

Call:
lm(formula = gain ~ Diet, data = ARCdata)Residuals:
     Min       1Q   Median       3Q 
-204.067  -48.865   -4.894   45.291 
     Max 
 213.933Coefficients:
            Estimate Std. Error
(Intercept) 290.7048     6.9934
DietB       -12.6381     9.8901
DietC       -15.9836     9.9139
DietD         0.2087     9.9139
            t value Pr(>|t|)    
(Intercept)  41.569   <2e-16 ***
DietB        -1.278    0.202    
DietC        -1.612    0.108    
DietD         0.021    0.983    
---
Signif. codes:  
  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05
  ‘.’ 0.1 ‘ ’ 1Residual standard error: 71.66 on 414 degrees of freedom
  (2 observations deleted due to missingness)
Multiple R-squared:  0.01037, Adjusted R-squared:  0.003198 
F-statistic: 1.446 on 3 and 414 DF,  p-value: 0.2289[1] 0.2288678
[1] 1.445967

为了获得事后功耗分析,我需要查看获得有效 p 值的概率(p < =0.05)。我应用了 bootstrapping(替换重采样)来估计总体均值和标准差(sd)。一旦我有了总体均值和标准差,我就可以模拟 1000 次试验,并观察总体中达到的“功效”。

在下面的代码中,您可以看到总体均值标准差与样本均值和标准差之间的差异结果。这通常被称为“偏差”,给出了样本数据对模拟有用程度的一个很好的近似值。

 120          121          122          123          125 
 0.020574286 -0.086813862  0.085062857 -0.243245714  0.185080000 
         126          127          128          129          132 
-0.052434286  0.195677143 -0.005534286 -0.153240000  0.114102857 
         133          137 
 0.044703253  0.031260000 120       121       122       123       125       126       127 
-1.318715 -1.472052 -1.720122 -1.763247 -1.601380 -1.356375 -1.600663 
      128       129       132       133       137 
-1.624573 -1.583112 -1.250887 -1.307703 -1.889067

然后,我开始模拟 10k 新试验,使用总体均值和标准差,寻找每罐使用 35 个样本时的功效。

apply(x, 2, FUN = power)
V1                39.21

正如你所看到的,结果并不是很好,根据人口值显示了 39%的事后权力。这意味着,在当前实验中发现的效应大小不允许每个鱼缸取样少于 35 条鱼。不会,除非我们能增加差异的影响大小。

为了模拟这种情况,我们需要使用总体平均值、标准偏差、变异系数,并通过增加单次治疗的平均值来扩大效应大小。在这里,我选择了治疗 D(及其坦克 121,126,129)。

print(popcv<-(popsd/popmean))
      120       121       122       123       125 
0.2036404 0.2273521 0.2912939 0.2887722 0.2576816 
      126       127       128       129       132 
0.2100662 0.2421316 0.2734029 0.2557708 0.2290366 
      133       137 
0.2546334 0.2381327

上面的代码很难理解,但是我主要做的是让 R 创建一个数组,在这个数组中,当改变一个效果大小和每个鱼缸中鱼的数量的矩阵时,F 值和 p 值被存储。

上面是一些数据争论,以产生我想要的图表,使用变量’权力’,’ N ‘,和’ es '。下面是生成图表的代码,如果您看到图表,它应该是不言自明的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显示模拟结果的图表。变化的变量是影响大小和鱼的数量。曲线并不平滑,因为仅使用了 1000 个样本,这在 i7 上花费了大约 60 分钟。

上图清楚地显示了功效是效果大小和鱼样本数量的函数。为了达到 80%的力量,你需要有一个特定的效果大小,没有多少鱼可以抵消这一点。因此,当设计一个实验时,你需要尽你所能创造必要的效果来从噪音中检测信号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值