Sci-kit 学习的技巧和诀窍会让你大吃一惊!
“学习不是偶然获得的,必须用热情去追求,用勤奋去对待。”——阿比盖尔·亚当斯
阿娜斯·阿尔尚蒂的 Unsplash
我从我的同事那里收到很多问题,比如“sci-kit learn 中最常用的函数是什么,我们可以学习这些函数来尽快开始构建数据科学项目”,这迫使我思考,“他们是在阅读了 帕累托原理 后接近我还是什么?”。
我不能告诉你在这样的库中学习一些特定的函数,因为每一个都有它们的使用案例和重要性。
在本文中,我将讨论 sci-kit learn library 的一些提示和技巧,它们在任何与数据相关的项目中都非常有用。
这就是我们今天要讨论的:
- 使用带有分层参数的 test_train_split()函数。
- 何处不使用 values()函数。
- simple imputr()函数。
- 管道中的特征选择。
- 使用 K 折叠和带洗牌的分层折叠。
- 使用 AUC 进行分类。
- 四种方式监控流水线的步骤。
- CountVectorizer()和 make_column_transformer()。
- 处理 Joblib 函数()。
1.使用带有分层参数的 test_train_split()函数。
我们不能在回归和分类任务中使用具有相同参数的函数。
在分类问题中,我们寻找预测一些离散值,对吗?。我们也会意识到输出属性可能会有类不平衡。因此,在执行 train_test_split 操作时,分类比例不一定要保留在训练和测试数据中。
因此,为了解决这个问题,我们使用分层参数,如下图所示。
例如:
来源:我的图库
2。哪里不使用 values()函数?
在将系列或任何数据帧传递给 sci-kit learn 时,不需要使用 values 函数,因为它知道如何访问底层的 numpy 数组。
示例:
来源:我的图库
3.简单估算器()函数
在进行数据分析时,我们经常会遇到一些列或行缺少标记为**“nan”的标签。**为了处理这种问题,我们用列的平均值代替 nan 值,有时用最频繁出现的词代替。
对于所有这些任务,我们在 sklearn 中有一个函数 SimpleImput 。
请参见下面的例子以获得更多的理解。
举例:
来源:我的图库
4.管线中的特征选择:
通过以下方式将特征选择添加到管道非常容易:
- 通过使用 SelectPercentile 功能来保持最高得分特征。
- 在预处理之后、模型构建之前添加特征选择。
例如:
来源:我的图库
5.使用 K 折叠和带洗牌的分层折叠。
如果我们正在考虑使用交叉验证,并且我们的数据集不是任意排序的,我们可以使用洗牌来获得更好的结果。这里有更多关于洗牌的信息。
例子:
来源:我的图库
6.使用 AUC 进行分类
如果我们执行具有类别不平衡的二元分类,AUC 可以是有效的评估度量。
参见示例:
来源:我的图库
6.监控流水线步骤的四种方法。
有四种方法来监控机器学习流水线的各个步骤。请参见下面的例子以获得更多的理解。
例如:
来源:我的图库
8.CountVectorizer()和make _ column _ transformer()
如果我们想要向量化两个文本列并一次连接它们,请遵循以下步骤。
例如:
来源:我的图库
9.处理 Joblib 函数():
为了通过将我们的机器学习模型嵌入到任何实时 web 应用中来部署它,或者为了保存该模型以备后用,我们使用 sklearn 中可用的 joblib 函数。
参见下面的 E 示例:
来源:我的图库
在我们走之前…
本文到此为止。我相信今天你们都已经了解了 sci-kit learn library 的一些新特性和功能。我没有包括第 10 个和更远的,因为我将在下一篇文章中描述它们。
在此之前,我需要知道你对这篇文章是否有用的回应。请在下面的评论区发表评论,让我知道我是否遗漏了什么,以便我可以在下一篇文章中纠正它。
请跟随凯文·马卡姆先生,因为他经常发布这样的提示和技巧。
如果这篇文章对你有所帮助。请在这里支持我【https://www.buymeacoffee.com/shobhitsri】
谢谢你。
阅读和撰写 ML 研究论文的技巧
从几十次同行评审中获得的经验教训
凯文·Ku 在 Unsplash 上的照片
同行评议是科学界的一个主要过程,它总是在科学杂志或会议上发表论文之前进行。它的目标是接收同行研究者的反馈,这些研究者根据他们自己的经验分析你的工作,并根据一些标准如新颖性、技术正确性甚至可读性来判断它。
在与“AI”相关的领域(如计算机视觉、自然语言处理、语音处理等……)中,这一步往往会因为 arxiv.org 这样的工具而被延迟或完全跳过。Ariv 是一个预印本服务器,它的目标应该是新作品的早期传播和辩论,但许多论文在任何同行评审之前就放在那里变得非常受欢迎。有时根本没有同行评议。许多这样的论文确实是非常有价值的作品,但在某些情况下,一些想法在没有得到社区“绿灯”的情况下传播,并且有很好的理由。
这很糟糕吗?这样好吗?当然,arxiv 防止了一些可能阻碍年轻研究人员职业生涯的守门机制。另一方面,我们的世界充斥着论文,对于新的研究人员(或需要阅读它们的数据科学家/工程师)来说,很难区分好的和坏的工作。有这么多的文件,我们需要一种方法来缩小我们的重点。
在这篇文章中,我想分享我从同行评审中学到的论文写作/阅读的经验,当我说阅读时,我指的是评审。这是一个很好的练习,把你面对的所有论文,也是最受欢迎的论文,作为一个综述来阅读。它们并不提供已有的知识,通常需要几年时间,社区才能广泛地复制和再现实验以吸收新知识。所以,让怀疑和批评来预测你的热情。阅读会花更长的时间,但你会在这个过程中学到更多。
写作技巧
在接下来的部分,我描述了一篇论文需要分析的不同方面,这些方面也是你在会议同行评议中需要评估的。这些建议是四年写作和阅读的产物,得到被拒绝的论文,并根据审稿人的建议进行改进。我知道,与许多教授十年的经验相比,四年算不了什么。然而,这些都是从艰难的道路上得到的教训,我想我可以通过写下它们来让别人的生活变得更容易。讨论的观点对写作和阅读都有效,但写作显然更难,因此,我想在开始之前补充一些内容。
首先,英语和科技写作掌握的越多越好。良好的研究是论文被接受的必要条件,但这还不够。你的读者应该能够理解你所做的事情及其价值。读 讲 学 写试提高 继续。永远不要停止学习,永远不要认为自己的写作能力足够好。有说母语的人和你在同一个领域写作,有被训练成语言学家的研究人员,他们总会比你写得更好。幸运的是,这是一项持续进行的工作,如果一切顺利,当你再次阅读一年前的论文时,你会因写作问题而感到尴尬。要想提高得更快,不要局限于在研究工作结束时写论文。写草稿,提案,甚至博客(看我做什么,而不是看我说什么;) )最重要的是,接收反馈。当你的错误被指出并被纠正时,你就进步了。
第二,记住你的听众。你的论文应该遵循你正在撰写的会议/杂志的写作惯例,并且结果应该是正确的类型。例如,一项关于技术如何帮助翻译的研究很难在 EMNLP,上发表,但它将非常适合像 MT 峰会这样的机器翻译会议。同样,一个新的数据收集界面可能对许多任务非常有用,但除非它提出新的深度学习模型,否则它永远不会到达 NeurIPS 。或者说,机器学习会议比其他会议需要更多的数学写作。
第三,永远把你的读者放在心上。提醒你的读者并不在你的头脑中。你的读者不知道你知道什么,没有你的经验,不知道你写作时在想什么,更不知道你的假设。除非你把一切都写下来。然后,写论文不是自我庆祝。没有人读你知道你可以粉碎所有的竞争,打破最先进的结果。研究论文是交流新知识的一种方式,而你的读者正是需要这种方式。经常问自己为什么读者(和评论家)会对你的作品感兴趣,为什么他们会关心你的作品,你怎样才能让它变得更有趣。在企业界,最成功的公司是那些能够更好地理解客户需求并据此提出产品建议的公司。写作也需要同样的心态。
最后,科学写作不应该是无菌的。每当你写作时,给你的读者讲一个故事。如果你论文的每一部分都是独立的,而且大部分都是你的数字的轮廓,那么它可能是有用的参考,但不会让你的读者兴奋。一篇研究论文需要遵循一个类似于现代故事的进程:一个强大的敌人威胁要扰乱我们的生活(我们的问题);真的需要有人和他打一架(动机);出现一个能对敌的英雄(拟法);在他之前也有人尝试过,失败了(相关 woks);打斗发生(实验和结果);但是,由于我们是科学家,胜利被对战斗的分析所取代。最后,根据从分析中学到的经验,我们请求我们的社区加入我们的战斗,并承诺很快回来。当你写一个好的故事时,你创造了参与度,提供的不仅仅是信息。
研究论文的关键方面
新奇
新奇是科学中一个棘手的话题。研究显然必须产生新的知识,但这可能意味着不同的人有不同的想法,有时社区会以牺牲其他知识为代价高估一种知识,主要是因为研究趋势或当时被认为“困难”的东西。
最明显的例子发生在 NLP 会议(以及其他与“人工智能”相关的领域),当时每个人都开始使用深度学习。似乎唯一值得做的研究是为不同的任务提出新的深度学习拓扑。其他重要的领域,比如构建语言资源和评估系统质量,都被放到了次要的会议上。
我认为这个问题的出现是因为许多没有经验的评论者(像我一样)更感兴趣的是深度学习可能实现的东西,而不是实际上更好地理解一个问题以及如何解决它。这种态度导致了许多我们不再记得的论文被接受,可能是因为“新”方法与以前更简单的模型没有任何实质性的不同。
幸运的是,现在会议明确地鼓励他们的评论者对“可接受的”论文有更广阔的视野。事实上,新颖性可能意味着在两个不同的研究领域之间建立意想不到的联系,提出所需的语料库,更好的评估,甚至更好的是,为新的任务铺平道路。
新颖性与研究论文的内容密切相关。几年前,表明可以用深度学习做一些事情,然后用 RNNs、CNN 等等,是一个合理的研究问题。现在它不再被认为是有趣的了(假设你可以找到一个没有应用所有这些东西的任务)。
当你读一篇论文时,把它和以前的作品联系起来,试着理解它有多新颖。这个问题以前解决过吗?这篇论文提出了一种看待这个问题的新方法吗?资源是否有价值,建造方法是否有利于复制?
写作时,尽可能地突出论文的新颖性。如果你不做,别人也不会做。突出新鲜感也能给你提供故事线索。
清楚
内容质量在一篇研究论文中是绝对重要的,但是为了能够传达内容,它必须写得好。一篇好的论文有好的结构,便于阅读。摘要和引言以广泛的方式传达信息,并激励读者继续阅读。在中间必须清楚哪里可以找到你的假设,实验设置,实验,需要的背景以及它在当前文献中的位置。结论总结了论文,强调了研究结果以及为什么其中包含的研究是重要的。
摘要、引言和结论必须写得特别仔细,因为它们的目的是让读者相信这篇论文值得一读。
如果你是一个初学者写论文,最好的办法是坚持在你发表论文的地方使用与你相似的最常见的论文结构。随着时间和经验的积累,你会学会改变它以更好地适应你的论文,但在这一点上没有必要跑得太快。使用干净的结构,专注于你的写作。
良好的英语是第二点,也是更难的一点。语法要尽可能完美,句子要清晰简洁。避免泛泛而谈或模棱两可的陈述。清楚地解释你给出的数字和表格,不要做任何假设。再一次,记住:
读者不在你的头脑里。
如果你希望你的论文对同行研究人员来说是清楚的,首先请具有不同背景的人阅读,并告诉你他们发现什么不清楚。你会对实际的可读性感到惊讶。
阅读时,欣赏一篇写得漂亮的论文,或者只是把一篇写得不好的论文放在一边。如果你不能理解它所说的,或者如果内容太含糊,很可能对其他人来说很难阅读。这对于提供新知识是没有用的。
动机
一篇论文的引言必须提供一般的背景信息以及它所解决的科学问题,一些关于所使用的方法和手段的信息以及所有这些背后的动机。这部分在写论文的时候会被低估,可能是因为一个人假设它的价值是显而易见的,也可能是因为一个人认为一篇论文中真正需要的只是结果。事实证明,除非你在一个过度拥挤的领域做研究,否则你的读者不太可能知道它为什么重要。我有时会遇到论文被拒绝的情况,主要是因为它们没有很好的动机。
你可能会问,如果其中包含的研究是好的,为什么会如此重要。原因是,如果你不能解释解决一个问题的相关性,其他人怎么能知道这是一个问题呢?此外,任何发表地点的论文空间都是有限的。那么,在其他条件相同的情况下,一篇解决了一个引人注目的问题的论文会比另一篇动机可疑的论文更有价值。
我的建议是仔细思考为什么你的读者会觉得你的研究有趣,然后明确地写出来。如果动机与你的读者产生共鸣,并且解决方案很好,他们将成为你在这个星球上最大的粉丝,并争取让它被接受/知晓。相反的情况听起来会像:“方法是有趣的,结果是好的,是好的,但我为什么要关心?”。试着往好的方面想。
复习的时候,尽量谨慎一点。如果动机没有引起你的共鸣,那可能是因为你不理解要解决的问题。然而,如果论文不能以一种可理解的方式框定一般问题和其中所研究的方面,那么这是一个需要指出的问题。
假设
科学的支柱之一是可证伪的假设:在观察到一个现象后,我提出一个假设,并设计假设成立的实验。我希望我的假设没有被我的实验证明是错的,但将来可以被证明是错的/不完全的。
假设应该对一种现象给出解释,或者证明一项工程改进是合理的。在一篇论文中,应该从摘要开始清楚地陈述,并沿着论文重复。如果最成功的论文也是那些假设改变了我们看待问题的方式的论文,这就不是巧合了。注意力是你所需要的全部假设自我注意力在建模序列时比递归神经网络更有效;" BERT "假设大量未标记的文本数据可以为许多 NLP 任务的系统提供动力;提取神经网络中的知识“假设神经网络可以学习目标类之间的潜在关系,这些关系比原始数据本身对训练新模型更有用。他们现在都是科学界的常识,但他们的想法是通过他们强有力和简洁的信息传递的,而不仅仅是通过表格中的数字。相比之下,假设弱的论文将被视为“增量工作”,然后被移到较低的排名。
写作时,清楚地陈述你的假设,并确保你提出的方法与其一致。显然,这一部分应该在设计方法的时候就完成,而且比写论文要早得多,但是当你写的时候,是时候让你的读者明白这一点了。
阅读/复习时,问问自己假设是否清晰,是否有趣,实验是否与假设一致。如果方法和假设之间不一致,那么论文不是产生知识而是混乱。如果你觉得研究是好的,点击“拒绝”总是不好的,但是通过一个不成立的假设来证明的方法会导致错误的主张。当论文的标题与其内容不符或分析/结论突然提出主张时也是如此。在科学中,错误是可能发生的,但公开的错误主张是不可接受的。
数据集/评估
用于实验的数据集不是实验设计的次要选择。数据集体现了一组在研究过程中应该牢记的领域(或语言,用于语音和语言处理)、假设和偏见。数据集应该反映要研究的现象。一些研究工作使用真实任务的“代理”数据集,但这通常不是一个好主意。
机器翻译领域数据集问题的一个常见例子是关于低资源语言对的论文,我必须承认我犯了同样的错误。许多论文提出了针对低数据条件的方法,但随后在大型数据集的一个小(有时不是很小)子集上进行实验。然而,许多方法在这里似乎可以工作,只是因为小数据产生一个弱基线。此外,这种方法假设资源贫乏的语言和资源丰富的语言是相似的,只是词汇量较少。这主要是一厢情愿的想法,因为语言可以像你想象的那样多种多样。例如,“存在”和“拥有”的概念可以用许多不同的方式表达,如果要表达的话;不同的正式程度会导致完全不同的词汇;这些习惯用语确实与他们的文化有关;不同的书写系统,有时很多在一起。这些只是资源真正匮乏的语言所面临的挑战中的一部分,很难从小型数据集中学到。
一个不同的问题是评价问题。有时,研究人员急于对他们仍然不知道如何评价的问题提出新的解决方案。在这种情况下,建立一种评价方法比“新方法”更能培育研究领域。例如,“性别处于危险之中?在 MuST-SHE 语料库上评估语音翻译技术提出了一种可再现的方法来评估关于性别相关现象的语音翻译质量。构建包含手动注释的测试集所需的评估方法。还能做得更好吗?当然是的,但是我们仍然不知道怎么做。与之前关于翻译性别偏见的研究相比,该论文是一大进步,之前的研究只是简单地评估总体翻译质量,并将其作为任务的代理。
您是否希望解决一项任务,但现有的数据集/评估方法不够好?建立这些,你的工作将比使用超级复杂的神经网络来解决假问题更有价值。
记住,任何接近新研究领域的人都需要软件、数据集和自动评估。通过使访问这些资源变得容易,你可以在你的领域获得关注(和引用)。就我个人而言,人们开始在语音翻译领域注意到我,是因为我工作的代码和数据集。
在写论文时,确保你使用的数据集和评估方法与你想要解决的问题是一致的。
阅读论文时,确保引言/结论中的主张确实与实验发现相符。
基线
你的基线代表了你对工作的关注程度。一个强基线,可能比其他发表的结果更强,意味着你的方法提供的改进是可靠的。有时,它碰巧阅读或审查基线与 5 年前的结果具有竞争力的论文,并且他们绝对忽略了在此期间产生的所有改进。然后,尽管基线上的改进可能是有意义的,最终结果是不可靠的。原因是当应用于更强的基线时,许多方法或归纳偏差的贡献(就最终结果而言)趋于零。例如,很难理解在具有大量训练数据的神经机器翻译模型中嵌入预训练的价值,而当训练集很小时,它们非常有效。
写论文时,对你的基线表现出更多的爱,它会得到回报。更强的基线可以让你对一个问题有新的认识,并突出到目前为止解决问题的一些缺陷。弱基线只有在试图通过希望获得不了解你的领域的评论者来发表论文时才有用。请不要这样做。
当阅读一篇论文时,在被论文中闪亮的结果所震惊之前,检查它是否引用了同一领域的最新论文,并验证基线是否与其他研究一致。列出当前技术水平的表格通常是有价值的,但要经常仔细检查它是否真的是当前的技术水平。我看到一些论文排除了他们应该知道的结果(因为时间流逝和发表的论文数量很少)。这样,他们的结果看起来比实际情况好得多。这是一种非常糟糕的科学实践,一旦发现就应该立即停止。
结果/分析
这些结果对于像 NLP 这样的经验领域来说是一个重要的方面,但深度学习的采用迫使我们半信半疑地阅读它们。什么会出错?在检查基线是否令人信服之后,我们需要评估改进的实体。相对较小的改善,尽管在统计上是显著的,但仍然可能是由于随机性(如不同的随机种子,或者甚至是方法的不同实现)或者超参数的更好选择。仅仅通过阅读一篇论文,很难说出改进的原因是什么,所以我更喜欢专注于分析。如果分析可以显示假设和结果之间的一致性,那么我倾向于持积极的态度。如果分析显示了一些东西,只是因为它必须显示,那么论文的其余部分最好是真正好的。
然而,有时真的很难产生一个分析,可以显示一些有趣的研究。通常,发生这种情况是因为它涉及到理解网络权重内部发生了什么,这仍然是很难解释的。然后,我们被迫提供代理来获得关于我们的方法的一些见解。代理应该仍然与我们感兴趣的现象和模型有关。无论如何,如果你在读一篇论文,发现分析不令人满意,不要太消极,除非你能提出一个更有价值的分析。
写论文时,确保你的结果令人信服,遵循的程序与以前的研究相似,以便读者容易比较。
当阅读一篇论文时,试着弄清楚这些结果是否真的是由于所应用的方法或者其他不相关的因素。仔细阅读分析,理解它是否对所研究的现象有说服力。
结论
一篇科学论文写起来/读起来/审阅起来可能会很吓人,但随着时间的推移,实践和经验会让它变得更容易。幸运的是,许多论文遵循相同的结构,这使得阅读更容易,当他们不这样做时,要么他们特别好,要么他们特别差。这两种情况通常都很容易发现。如果你是写科学论文的新手,你可能想提高你的科学写作技巧。网络上到处都是资源,我链接的只是一个很小的样本。通过这种方式,我学到了许多有用的技巧和建议。如果你是评论的新手,最好通过评论已发表的论文并请更有经验的人来评论你的评论来做一些练习。我希望这篇文章能帮助你关注相关的方面,让你更容易理解一篇论文的价值,避免我开始时犯的一些错误。
学习一种模式来隔离包,同时扩展 Python 代码的功能。
towardsdatascience.com](/python-polymorphism-with-class-discovery-28908ac6456f) [## 科技博士让你在学术之外茁壮成长的 7 种方式
我从我的博士学位中学到了什么,为什么我会再做一次。
medium.com](https://medium.com/be-unique/7-ways-a-ph-d-in-tech-will-make-you-thrive-outside-academia-3a3ef7e49538) [## 同方差和混合效应模型
什么是同异方差,为什么异方差需要混合效应模型和一个真实的例子。
medium.com](https://medium.com/machine-translation-fbk/homoscedasticity-and-mixed-effects-models-f0f301700815)
中等会员
你喜欢我的文章吗?你是否正在考虑申请一个中级会员来无限制地阅读我的文章?
如果您通过此链接订阅,您将通过您的订阅支持我,而无需为您支付额外费用https://medium.com/@mattiadigangi/membership
作为数据科学家员工#1 的生存技巧
如何成为第一个在战场上的数据士兵
越来越多的企业正在向数据科学迈出第一步,许多企业希望在内部建立这种能力。这为数据科学家提供了充分的机会,让他们能够从一开始就参与进来,并在引导一个组织走向数据智能未来的过程中发挥作用。
我很幸运/自虐地在两家不同的公司做了这件事——一家网页设计公司和一家律师事务所。在这个过程中,我学到了很多关于我的领域如何更好地服务于其他领域的工作人员,并为公司带来价值。这并不容易,有时我会想念和我的同龄人一起工作的日子。但这种火的洗礼可以增强你的学习,拓宽你的技能,给你一个通过数据做出真正改变的机会。以下是我对成为“数据人”的一些机会和陷阱的看法。
Arnaud Mesureur 在 Unsplash 上拍摄的照片
你必须推销数据科学
数据科学是一个众所周知的名词,但是对于没有技术背景的人来说,有点抽象和神秘。你的新同事可能不会立即看到你的用处以及你的技能会如何帮助他们——他们习惯了自己做事的方式,如果有选择,大多数人会像以前一样愉快地继续下去。
—你必须成为一名销售人员,不仅仅是为了你自己的技能,而是为了整个数据科学领域—
这不是批评,这只是人之常情。你有责任证明数据科学如何让其他人受益。因此,你必须成为一名销售人员,不仅仅是为了你自己的技能,而是为了整个数据科学领域。
拓展战略将有助于提升你在企业中的形象,并开启关于你可以做出贡献的方式的对话。
- 写——承诺定期给整个公司发一封电子邮件,展示你的工作,让人们了解可能性,并邀请人们与你联系。这让您的工作范围更广,并让数据科学在人们的脑海中挥之不去。如果你觉得自吹自擂到这种程度不舒服,也许可以找一些其他学习技术的同事,把范围扩大一点。然而,你被带进来是有原因的,你的同事可能会喜欢有机会听到你正在做的有趣的工作。
- 网络——一对一的聊天是一种快速有效的了解他人世界的方式。在半个小时的专门补课时间里,你可以很好地了解某人的一天是什么样子,他们做的决定和他们使用的材料。这也是一个机会,让他们了解数据科学可能帮助他们的一些方式,并提出一些想法。确保做好准备,准备好一系列要问的问题,以及一些要点,说明你认为公司内部哪里有数据科学的机会。大多数情况下,没有什么会直接产生,但是通过在早期建立这些关系,并教育人们你所做的事情,你将更有可能在以后需要你的帮助时被想到。
- 出席 —没有什么能代替站在整个公司面前说“你好,我是理查德,这是我的工作”。只需一个简短的演示以及几分钟的问答时间,就能让你的名字与众不同,并建立对什么是数据科学的基本理解。如果可以的话,在你自愿做这件事之前等几个星期。你需要让演讲尽可能地与你的听众相关,而不是泛泛的数据科学之旅。展示你早期的工作并提出一些想法会让你变得平易近人、有用,并可能为接下来的几个月建立一连串的工作。
但是不要过度销售…
围绕数据科学和人工智能有很多炒作。所有行业的公司都渴望告诉世界他们在大数据上的投资以及它带来的所有好处。
承诺不可能的事情却做不到,这对任何人都没有好处
对于业外人士来说,这看起来像是魔术。脸书和谷歌近乎读心术的能力,加上人工智能在越来越多的任务中超越人类的故事,创造了一个神话,表明一切皆有可能。
在这种情况下,随着你渴望在你的新角色中留下深刻印象,很容易过度承诺。好的作品需要时间和细心的迭代。承诺不可能的事情却做不到,这对任何人都没有好处。一旦你让某人失望了,就很难再把他们赢回来,所以那些早期的作品对你来说至关重要。
数据科学很难,很耗时,而且经常令人沮丧,不能保证得到你想要的答案。交流你所在领域的局限性和交流机会同样重要。任何人都可以谈论天马行空的头脑风暴,但是你的专业知识将创造性思维与实际现实联系起来。通过诚实地说出你在一定时间内可以达到的目标,你可以建立信任的关系,通过这种关系你的技能可以真正发光。
学会说“不”
即使你在销售和教育人们数据科学方面做得非常出色,仍会有一些人将你放在普通的 it 岗位上。这可能意味着没有推动你或充分利用你的专长的请求来到你面前。例如,有人问我关于电脑无法启动、重置密码和编辑 WordPress 页面的问题。
当你是一个新角色,渴望显得有用和忙碌时,很容易接受不适合你的工作。因此,虽然平易近人和乐于助人很重要,但当一项工作最好由别人来做时,一定要果断和清晰地沟通。
有策略
在你开始考虑你希望在头 6-12 个月里能够实现的事情之前,仔细想想。提前咨询你的经理,从你面试前后的谈话中获得信息。当你开始一份新工作时,没有什么比有一个计划更能让你立足的了。你需要敏捷,因为随着你对业务了解的增加,优先级会改变,但是拥有一个项目想法的列表会帮助你快速获得动力。
在早期,你可能会注意到一堆你可以轻松贡献的东西。您的新同事将会开发出自己处理数据的方式。但是随着你的专业知识的注入,你可能会有很多方法可以快速改进事情。一些简单的事情,比如对某人的电子表格进行重组并添加一些方便的公式,或者编写一些 PowerShell 脚本来自动完成一项任务,都会对某人的工作周产生很大的影响。这些唾手可得的果实是立即证明你的价值并开始在企业内建立盟友网络的绝佳机会。
布瑞恩·洪在 Unsplash 上拍摄的照片
当然,你在组织中的主要赞助商可能已经迫不及待地想让你加入,有一长串的项目要启动。他们雇用你是因为他们看到了公司内部数据科学的潜力,并且渴望充分利用你的技能。对于你应该优先考虑什么,他们会有自己的想法,重要的是采纳他们的意见。但是他们也没有你的眼光去发现什么是可能的,什么是比他们想象的更困难的。所以,不要犹豫,积极主动,提出你自己的想法,尝试一起想出一个计划。
它可以是孤独的
当你在一家专门从事数据科学的公司或一个数据科学家团队工作时,当事情变得棘手时,你会有一个由同样书呆子气的同事组成的网络。每当你需要集思广益,设计解决方案或调试工作时,总有人能够理解并做出贡献。
然而,如果你是第一个在地面上的数据科学家,在开始时,你将是单枪匹马。你周围的人可能会在高层次上理解你,但是对于更深层次的东西,你只能靠自己了。当你与一个难题搏斗,却没有人给你出主意的时候,你通常会感到压力很大。因此,如果你能在企业中找到任何对数据科学感兴趣的人,并希望学习和参与其中,那么就鼓励和支持他们。
数据会很乱
在我早期职业生涯的大部分时间里,我被宠坏了,因为我只处理财务和销售数据的大数据仓库。我不必担心数据是如何到达那些表的。在以 DS#1 的身份进入一家小的网络开发机构后,我不得不迅速提高我的数据集成能力。一个项目的数据将以不同的格式分散在不同的平台上。我可能需要收集数据,在这里查询 MySQL,在那里查询 PostgreSQL,遍历分页的 API 请求或抓取网站内容,而不是简单地从几个表中进行选择。当然,每个系统都为其原始功能进行了完美的设计,但从数据科学的角度来看,将数据转换成我可以使用的形式需要更多的工作。
当您第一次浏览公司数据时,执行审计并绘制出信息存储位置图将是一个有用的参考。它还将为改善数据治理和评估数据质量创造机会。
注重质量,而不是数量
如果你的工作质量很高,人们会想要更多,需求很快就会超过一天中的工作时间。这是一个很好的问题,并引入了扩展团队的机会。
由于缺乏数据科学同行,确保工作质量变得更加困难。如果没有人能够理解和质疑你的模型,你就必须把你自己的措施落实到位,以保持高质量。设定标准,使用清单和严格的单元测试可以帮助你对你交付的工作感到舒适。但最好的建议可能是给自己更多的时间来完成事情,让自己正确地处理手头的任务,并进行彻底的测试。
积极保持你的技能
当你被其他数据科学家包围着,从事几十个不同的项目时,你会通过纯粹的潜移默化被动地学到很多东西。在了解有趣的新应用及其技术缺陷方面,饮水机和午餐时间的聊天是非常宝贵的。通过知识共享和内部培训进行更正式的学习也有助于不断发展和增加新技能。
作为 DS#1,这一切都落在你身上。虽然在一家新公司建立数据科学的日常工作肯定会让你忙得不可开交,但继续投资于你的技能并为你的职业生涯锦上添花也很重要。这意味着在朝九晚五之外,花时间在 MOOCs 上,跟上行业新闻,与你的专业同行进行社交。
重要的是不要脱离圈子
像 Meetup 这样的网站,以及脸书和 LinkedIn 群都是在你的城市结识志同道合者的好方法。重要的是,不要脱离圈子,错过你的同龄人兴奋的事情。通过每月参加一到两次活动,你将能够跟上行业的发展,避免在新角色中被孤立。
成为“万事通”
如果你在一家中大型科技公司工作,你会被各种各样的技术知识所包围,在数据科学和技术的许多不同领域都有明确的角色划分。如果你的专长在一个领域,你周围会有足够的支持让你专注于你擅长的领域。
然而,如果你是 DS#1,你将需要填写你的技能“栈”。你的新同事可能不知道什么是数据集成,所以他们肯定不会在意你是否有这方面的经验。使用“其他人用来处理那部分”是行不通的。因此,提升您在整个数据科学流程中的技能对于能够定期交付有价值的工作至关重要。
我作为 DS#1 的头几个月是一次严峻的考验,但我在那段时间学到的东西可能比我职业生涯中其他任何时候都多。
虽然有许多定义“数据科学流程”的尝试,但通常会引用以下组件:
- 数据收集/整合
- 数据清理
- 数据分析
- 系统模型化
- 解释
- 模型部署
为了更深入的解释,我推荐 Chanin Nantasenamat 的这篇文章。
适应文化
你可能会有一个与你共事的人非常不同的背景。这意味着他们的工作方式和你习惯的做事方式之间可能会有很大的文化差异。重要的是要融入工作文化,适应新环境,而不是像往常一样硬着头皮进去工作。
这可能涉及:
- 不同的着装要求
- 不同的质量控制标准
- 不同的工作节奏
- 更扁平或更等级化的文化
- 初级员工不同程度的自主权
- 流程驱动 vs 人员驱动
我们可能是“21 世纪最性感职业”的成员,像脸书和谷歌这样的公司为工作生活设定了新的标准。但是硅谷的方式并不是唯一的方式,一个方形的钉子将不会适合一个圆形的洞。你的工作只有通过对文化的敏感和让其他人容易从中受益才能带来价值。
从一家零售分析公司转向商业诉讼,让我印象深刻的一件事是节奏的变化。在零售业,一切都在以疯狂的速度前进,每周都有多项分析发生。当我到达律师事务所时,我会问人们什么时候想看到结果,最后期限是几个月,如果不是几年的话。与此同时,对我提供的分析的质量和信心的需求要高得多。如果我的工作要在法庭上被依赖,它需要绝对滴水不漏。
这导致了一个更慢的,更多考虑的,测试驱动的工作方法,严格的文档和清晰的质量标准交流。如果没有这种调整,我的同事们可能会觉得使用我的作品不太舒服。
概括起来
根据我在几家不同公司担任第一个数据科学家的经历,我希望你喜欢这些技巧。虽然有时会很困难,但进入数据科学的底层是一个有益的挑战,可以将你的技能推向更高的水平。我会把它推荐给任何人。
- 你必须推销数据科学
- 但是不要过度销售…
- 学会说“不”
- 有策略
- 这将是孤独的
- 数据会很乱
- 注重质量,而不是数量
- 积极保持你的技能
- 成为一个万事通
- 适应文化
构建可信数据科学组合项目的技巧和资源
了解不同的资源,让你的下一个作品集脱颖而出。
凯利·西克玛在 Unsplash 上的照片
介绍
投资组合项目是任何数据科学的关键。他们不仅向招聘人员展示你的工作、能力和优势,也是应用你所学知识的好方法。
不幸的是,许多人并没有真正把他们的投资组合项目做到最好。相反,他们写一些代码,放在 Github 上,可能写一篇关于它的文章,或者,他们做一个 Kaggle 竞赛,把代码放在 Github 上。
不幸的是,这不是创造投资组合项目的好方法。为什么?因为您创建的模型只是存在于笔记本中,因此您不了解模型部署。第二,大多数比赛都有干净的数据集供你使用,这与真实世界的数据形成了鲜明的对比,所以你并没有真正做获取数据的困难部分。
我这篇文章,我将与你分享以下内容:
- 如何为投资组合想出好主意?
- 在那里你可以找到下一个作品集项目的免费开放数据集
- 如何着手投资组合项目
- 为了充分利用你的作品集项目,需要采取的两个基本步骤
所以,坐下来,放松,享受这篇文章吧!
第一步:为投资组合项目想出好主意
由 Unsplash 上的absolute vision拍摄的照片
这可以说是投资组合项目中最难的部分,因为有时你可能拥有做一个项目的所有技能,但你不知道在哪里以及如何应用它!
技巧 1:获得灵感
一种方法是从人们已经完成的其他项目中获取灵感。以下是一些很好的例子:
- 斯坦福的 ML 类项目:这其实是斯坦福的机器学习类的作品。由一个项目组成,报告和海报可以在网上看到。这是我最喜欢的项目之一,因为这里的一些项目令人惊叹,他们也友好地提供了 Github 代码。
- 人工智能生成食谱:这个由德里克·贾制作的项目是一个很好的例子,展示了如何将你热爱的两件事结合成一个真正鼓舞人心的项目。
- 这个项目是一个很好的例子,并不是所有的投资组合项目都必须通过 Flask 部署或者制作成 Docker 映像。在这里,作者制作了一个 PyPi 包,帮助初学者选择项目的最佳模型。
- SnapStudy :不仅是一个很棒的想法,更是一个很棒的名字!这个项目允许用户拍下他/她的笔记,并自动生成抽认卡来帮助他们记忆!多酷啊!
- 股票交易机器人:这也是一个真正的端到端强化学习项目的好例子。包含了非常清晰的项目说明和信息,这是一个很好的例子,说明如何将强化学习知识应用到现实世界中。
技巧 2:头脑风暴,解决生活中的问题
由 Kelly Sikkema 在 Unsplash 上拍摄的照片
头脑风暴是为项目产生想法的一个非常强大的工具。科学证明,把事情写下来可以让你更有效率,我自己也经常对我在便利贴上写下的想法感到惊讶!。这篇教程是关于如何充分利用头脑风暴会议的完美指南。
另一种方法是找出你在日常生活中可能面临的问题,看看你能否利用数据科学解决这些问题。您可以提出以下问题:
- 我可以利用 NLP 为自己写文章吗?
- 我可以使用监督学习创建垃圾邮件分类器吗?
- 我可以创建一个应用程序来推荐我应该看的网飞电影吗?或者我该听什么 Spotify?
- 我可以创建一个应用程序,根据我喜欢的食物向我推荐食谱吗?
- 我可以创建一个可以阅读我的笔迹的 NLP 应用程序吗?
- 我能创造一个强化学习机器人来帮我交易股票吗?
诸如此类。重点是有很多事情可能会困扰你,但是不要抱怨它们,看看你是否可以利用 ML & Data 科学来提出创新的想法!
步骤 2:为你的作品集项目打开数据集
米卡·鲍梅斯特在 Unsplash 上的照片
任何项目最重要的部分都是数据。没有数据,其他一切都没用。然而,为您的项目找到正确的数据可能是一项艰巨的任务。这就是为什么我编制了一份免费、开放和高质量数据集的清单,供你在下一个作品集项目中使用。
事不宜迟,这里是免费开放数据集的列表:
- 五三八
- BuzzFeed 新闻
- 索克拉塔
- 牛逼数据
- 谷歌公共数据集
- Quandl
- Data.gov
- 学术洪流
- data.world
- AWS 公共数据集
- r/数据集
- 数据是复数
- 维基百科数据集
- IMF 数据
- 世界银行数据
- 美国宇航局数据集
- CERN 开放数据门户
- 全球健康观察数据仓库
这是我根据自己使用这些资源的亲身经历整理的清单。我鼓励你去看看,看看哪些是热门的,哪些不是。所以现在你肯定不能用“我找不到好的数据”这个借口了!
一旦您下载了数据集并准备好进行分析,请暂停片刻,并询问一些关键问题:
- 这个数据集是如何创建的?
- 数据从哪里来?
- 数据中存在哪些数据类型?
- 是否存在缺失值?如果是,他们是 MCAR、马尔还是马尔?
- 数据有分类值吗?
步骤 3:如何着手一个投资组合项目
Gary Bendig 在 Unsplash 上拍摄的照片
当我开始构建组合项目时,我通常会跳过所有的 EDA 和预处理,只运行一个 XGBoost 模型(是的,确实很愚蠢。)然而,我知道我需要遵循一个清晰的项目结构。然后就遇到了 CRISPDM 。
数据挖掘的跨行业标准流程
图片来自维基百科
跨行业数据挖掘标准流程(CRISPDM)是一个流程模型,描述了描述数据科学生命周期的 6 个步骤。它本质上帮助你计划、组织、构建、实施你的项目。
太好了。但是这些步骤真正涉及到什么呢?好问题。所以,让我们具体讨论一下!
CRISPDM 中涉及的步骤
在 Unsplash 上由 Ambrose Chua 拍摄的照片
1.业务理解/目标定义
在这里,您定义了项目的实际目标,以及您通过创建这个项目想要实现的目标。这可以分为 3 个阶段:
- **目标:**在这里,你定义项目的目标和你试图完成的任务。您还需要调查数据是否可以用来解决这个问题
- 资源评估:在这里,你调查项目所需的资源,以及从哪里和如何获得这些资源。你会在本地工作,还是在云上工作?您的数据需要从多个位置汇集吗?
- **工具评估:**在这里,您可以根据项目的目标,选择您认为最适合这个项目的最佳工具和技术
2.数据理解
好了,现在你已经理解了你想要达到的目标,你开始做你的分析。这些步骤可以分解为以下任务:
**数据收集:**从收集数据开始。您可以利用 REST API、数据仓库服务或其他方法来收集数据并将其整合到一个可用的数据集中
**数据描述:**从做一些 EDA 开始,查看数据的基本结构,对数据有一个感觉,并理解您正在处理的数据类型
**数据探索:**在这里,您可以更深入地研究您的数据。您开始执行更复杂的查询,在数据中寻找隐藏的模式,并试图找到数据中对当前问题有关键见解的方面
**数据评估:**你开始评估数据的质量。你会问这样的问题:
- 数据干净吗?
- 是否存在缺失值?
- 我需要删除一些功能吗?
- 我需要如何预处理我的数据?
- 是否需要功能缩放?
3.数据准备
这是您准备用于模型的最终数据的步骤。这里的阶段如下:
- **数据选择:**选择您将需要的数据,并从您的数据中移除不需要的特征。
- **数据清洗:**这个阶段通常是最长的。您可能需要估算、更正、删除和格式化值
- **数据构建:**特征工程。在这种情况下,您可以使用从数据分析中获得的见解来了解如何智能地利用现有要素来构建有望使您的模型受益的新要素。您可能还需要使用不同的转换来转换某些值
- **数据集成:**将不同的数据集组合在一起,形成一个完整的数据集
- **数据格式化:**您可能需要格式化某些值,例如,您可能想要将字符串和分类值编码/调整为数值,以便从特征中获得有用的信息
4.建模
可能是项目中最令人愉快和期待的部分。这个阶段分为 4 个部分:
- 选择建模技术:确定尝试哪些算法(如回归、神经网络)。这可以通过尝试几种基线方法并同时对它们进行评估来实现
- 生成测试设计:根据您的建模方法,您可能需要将数据分成训练集、测试集和验证集。您可能会决定使用交叉验证来更好地了解您的模型将如何推广到新数据。确保而不是在测试集上评估您的数据!
- 构建模型:听起来可能很迷人,但这可能只是执行几行代码,如“reg = LinearRegression()。fit(X,y)"。这也可以包括将一组模型组合在一起,称为集合。
- 评估模型:通常,多个模型相互竞争,数据科学家需要根据领域知识、预定义的成功标准和测试设计来解释模型结果。
- **调整模型:**选择理想模型后,您可能希望调整模型的参数,以获得与数据的最佳拟合。
5.估价
周期的这一阶段关注的是哪个模型最适合目标和项目,并计划接下来的步骤。这个阶段可以分为以下几个部分:
- **评估模型:**你可以根据你的领域问题使用不同的度量标准来调查,看看哪个模型表现最好。您必须选择最符合项目目标的模型。
- **复习项目:**这是重要的一步。你回顾整个周期,看看你是否可以做得更好。你做了彻底的 EDA 吗?是否选择了最佳功能?总结你的发现,并根据需要调整你的项目
- **确定后续步骤:**根据模型的性能以及它满足项目目标的程度,您可以决定继续进行部署,或者您可以回顾整个周期,看看您是否可以批准项目的某些方面。
部署
很抱歉打破你的幻想,但是一个模型对你笔记本里面的人来说不是很有用!您需要有一个部署模型的计划。其中涉及的步骤如下:
- **计划开发:**为您将如何部署模型开发一个清晰而简明的计划
- **计划监控和维护:**制定一个全面的监控和维护计划,以避免在模型的操作阶段(或项目后阶段)出现问题。
- **生成最终报告:**项目团队记录项目摘要,其中可能包括数据挖掘结果的最终演示。
- **回顾项目:**进行项目回顾,了解哪些进展顺利,哪些可以做得更好,以及将来如何改进。
这些原则将极大地帮助你清晰地构建你的投资组合项目,这样你就不会从一个阶段跳到另一个阶段。如果在任何阶段你不确定某件事,总是穿越回这个周期,看看你是否能改进什么。
为了充分利用您的项目,需要使用的 2 项关键资产
Silas k hler 在 Unsplash 上拍摄的照片
我把这两种方法作为它们自己的一部分的原因仅仅是因为我还没有看到足够的组合项目利用它们。这两种方法被低估了,但它们在以下方面有很大帮助:
- 排除故障
- 减少错误
关键资产 1:伐木
毫无疑问,我从未见过使用最少的策略是日志记录。它如此简单,却很少被使用。本质上,日志记录跟踪你的代码并且记录关键信息,如果你在项目中开始遇到问题,你可以通过查看这些信息。
我一直都在使用这个工具,并且我已经捕获了许多讨厌的 bug,否则这些 bug 就会进入产品中,并且会迫使我花费无数的时间来修复它们。如果你想学习如何使用日志记录,这里有一篇由 Real Python 撰写的关于日志记录的文章,老实说,这是你唯一需要阅读的教程,因为它非常全面。
关键资产 2:建立 CI/CD 渠道
这也是一个被严重低估和利用不足的策略。我怎么强调测试驱动开发的重要性和它所拥有的无数好处都不为过。建立稳固的 CI/CD 渠道有助于实现以下目标:
- 在 bug 投入生产之前尽早捕捉它们
- 如果有严重的错误,回滚到以前的代码
- 在开发的所有阶段跟踪您的代码
- 将项目的不同方面划分到不同的工作空间中,以便对过程的所有阶段进行单独的跟踪和评估。
就我个人而言,我喜欢在设置 CI/CD 管道时使用 Travis CI 和 Git。但是,您可以随意使用您想要的任何 CI 或 CD 工具。
结论
虽然没有人是完美的,但我相信一个人应该永远为之奋斗。在这里,我给出了让你的项目脱颖而出的技巧和资源,以及如何充分利用你的项目。我已经描述了应该执行的端到端循环,以及如何使用两种被低估的方法在下一个项目中真正达到最大效率。
我希望这篇文章以某种方式帮助了你,我希望你现在已经准备好构建有史以来最真实的投资组合项目了!确保不断更新更多内容,永远做最好的自己!
从 10 天的 ML 挑战看如何建立更好的深度学习模型
资料来源:tensorflow.org
这些建议是我在参加 10 天 ML 挑战赛时制定的,这是孟买的 T ensorFlow 用户组的一项精彩倡议,旨在鼓励人们更多地学习或实践 ML,而不一定是 TensorFlow。流程是这样的,你会在一天开始时被分配一项任务,你被期望完成任务并在推特上发布你的结果。任务可以是从预处理数据到构建模型到部署模型的任何事情。我建议你仔细检查挑战的任务,并亲自尝试,不管你是初学者还是实践者。我将继续分享我从这些任务中获得的主要收获。我所有的解决方案和挑战问题的陈述都是开源的-
TFUG 孟买发起的 ML 10 天的存储库。所有的代码将在每天 7 点左右被推送到回购处…
github.com](https://github.com/Rishit-dagli/10-Days-of-ML)
我的外卖
挑战最好的部分是,它不像一个核心竞争,而是一个促进学习的倡议,这意味着如果你不知道一个概念或有你无法修复的错误,你可以向这个精彩的社区提出并获得支持。这对初学者尤其起到了很大的作用。更好的一点是,你还会得到相关的链接来研究完成挑战所需的主题。
我所有相同的输出都可以在这个线程中得到
第一天
我们被要求为可用的新冠肺炎数据集制作一些交互式图表这里。首先你必须建立一个-
- 国家图表
- 日期图表
- 洲状图
这里的一个主要问题是数据集没有纬度或经度数据,您可以将这些数据传递到函数中来创建一个洲级图表。所以,我所做的是从 Kaggle 获得另一个国家和大陆数据集,并在我的原始数据集中添加一个名为“大陆”的列。这就解决了问题。有了这么多的数据,我看到一些人制作了巨大复杂的图表,由于这些图表的目的,简化事情和便于分析是一种挑战。你再也无法从中观察到任何模式。例如,一个简单的散点图向我展示了一些国家的增长率就像教科书上的指数图,所以我用ln(x1)
代替了特征x1
,它几乎是线性的!
制作更简单、更容易理解的图表,通过这些图表,你可以分析数据,发现一些事情或模式,而不是复杂的图表,这些图表没有太大意义,违背了原因。
第二天
第二天是关于特征工程和泰坦尼克号数据集的数据预处理,这里是。Titanic 是一个很好的候选对象,因为我们在 Titanic 数据集中看到了许多变化和低相关性特征,因此采用良好的特征工程和预处理策略非常重要。此外,你还可以做一些数据可视化。
特征工程是将原始数据转换为更好地代表预测模型潜在问题的特征的过程,从而提高对未知数据的模型准确性。
您可以在这个数据集本身中使用许多方法,如分类转换、分类列、热编码等等。自己尝试一下。
第三天
我们终于到了构建模型的部分,我们必须预测贷款状态、谷物评级以及为高级用户分析评论毒性的 NLP 任务。前两项任务非常简单,针对的是初学者,处理毒性数据非常棒。从 NLP 任务中得到的一个简单但有力的观察是,最好选择 RNN/ LSTM/ GRU 单位作为词汇量的倍数。
尝试选择你的递归层的单元数作为词汇大小的倍数,并尝试通过一个首选的相似性度量来选择你的嵌入维度。此外,不要简单地堆积你的循环层,而是尝试改进你的整体模型架构。选择嵌入维数为特征数的 4 次方根的倍数,模型做得很好。
第四天
我们最终在 Expedia 数据集上实现了无监督学习,这里是 T4。数据集非常大,有超过 2 GB 的数据,因此在受限环境下处理如此巨大的数据集时必须采取一些预防措施。你可以使用一些技巧来这样做,就像你应该清除你的中间张量和变量,你可以很容易地使用
del [variable_name]
您还应该尝试使用并行处理技术获取数据,同时使用预处理技术在 map 函数中运行它们,并充分利用您的 CPU 内核。在我的方法中,我已经使用云做了一些高成本的操作,比如 PCA 或 LDA,你也应该试着做同样的事情。你也不应该跳到像受限玻尔兹曼机器这样的算法上,在这种情况下,K-Means 和玻尔兹曼机器之间有大约 0.8%的精度差异,这里使用 K-Means 和简化你的算法比一点精度更有意义。
总是获取数据,并在一个
map
中并行地对其进行预处理。尽可能清除中间张量和变量,以释放内存,从而获得更好的性能。你应该总是喜欢简单而不是精确的小变化。
第五天
我们被要求为著名的狗和猫的数据集建立模型这里。这个想法是使用卷积神经网络或 CNN 来做同样的事情,并找出图像中的特征。我使用了两种方法来完成这项任务,一种是从初始数据集进行迁移学习,冻结一些层,并在此之下添加一些密集层。我重新训练了我在初始模型下面添加的层,并以良好的准确性结束。对于另一种从头开始构建网络的方法,我使用了几个卷积层和池层来完成这项工作。为了防止过度拟合,我还使用了正则化、去除图层和图像增强,这些都可以通过 tensor flow轻松实现。两者都存在于回购中。
你应该总是尝试使用正则化,放弃层和图像增强来克服过度拟合。也尝试使用奇数内核大小,如 3x3 或 5x5。不要只是不断增加你的通道数,你可能会得到更好的训练精度,但数据过拟合。总是从使用较小的滤波器开始是为了收集尽可能多的局部信息,然后逐渐增加滤波器宽度以减小生成的特征空间宽度来表示更多的全局、高级和代表性信息。
第六天
第六天我们有两项任务,为时尚 MNIST 制作模型,为预测肺炎制作 x 光图像。这又是一个图像问题,我们被期望使用 CNN。
如果数据集不像时尚 MNIST 那样复杂,就不要浪费时间制作一个 10 层左右的庞大模型架构。
X 射线肺炎问题有点棘手,我们还需要对数据进行一些特征工程。在研究这个问题时,我发现了一些非常有用的实验结果,我认为人们应该遵循这些结果。
批量规格化 一般必须在通过包含激活功能的层之后,在脱落层(如果有的话)之前,放置在架构中。sigmoid 激活函数是一个例外,其中您需要在激活前放置批处理规范化图层,以确保在应用函数前值位于 sigmoid 的线性区域内。K 在网络的初始阶段保持特征空间宽而浅,并在接近末端时使其变得更窄和更深。
(非常重要)将辍学层放在最大池层之后。如果放置在 Max-Pool 图层之前,则由 Dropout 移除的值可能不会影响 Max-Pool 图层的输出,因为它会从一组值中选取最大值,因此只有在移除最大值后,才能考虑移除要素依赖关系。
第七天
这都是关于 NLP 的,我们再次面临两个挑战,分析 IMDB 评论,这也是一个非常著名的数据集,以及通过 Twitter 数据集分析评论的情绪。
每个 LSTM 层都应该有一个下降层。该层将通过在训练期间忽略随机选择的神经元来帮助防止过度拟合,并因此降低对单个神经元的特定权重的敏感性。20%通常用作保持模型准确性和防止过度拟合之间的良好折衷。
这里的主要挑战是选择 LSTM/ GRU 单位的数量。我用 K-Fold 交叉验证来做到这一点,如果你不想深入研究它的工作原理,你可以用这个简化的结果
Nᵢ 是输入神经元的数量, Nₒ 是输出神经元的数量,ns 是训练数据中的样本数量,a 代表比例因子。
这里的 a 或α代表比例因子,通常在 2 到 10 之间。您可以将α视为每个神经元的有效分支因子或非零权重的数量。我个人建议您将α设置在 5 到 10 之间,以获得更好的性能。
这是我用嵌入式投影仪制作的一个很棒的可视化图像
IMDB 数据可视化
第八天
对可用的消费者投诉数据的文档或文本进行聚类这里是第 8 天的任务。任务是将投诉数据分成不同的类别。我尝试了许多不同的算法,如 K-Means、分层、模糊、密度聚类和受限机器,K-Means 再次给了我最好的结果。我使用肘方法和轮廓曲线,以了解相同的最佳集群数。我将再次举这个例子来说明人们应该选择简单而不是一点点性能。在这种情况下,亲和度级数给了我最好的 Fowlkeys-Mallows 分数,比 K-Means 分数稍高一点,所以我最终改用 K-Means。
在模型可解释性和性能或准确性之间的权衡中,您应该更喜欢小差异情况下的可解释性。
第九天和第十天
这些天是关于 TensorFlow JS 的,我们必须部署运行在浏览器本身的模型。如果你对 TF.js 了解不多,你可以在这里阅读我的博客
如果你是机器学习的初学者,并想开始在浏览器中开发模型,这是为…
medium.com](https://medium.com/analytics-vidhya/getting-started-with-deep-learning-in-browser-with-tf-js-1e949b911e31)
我们必须用 TF.js 构建一个我们选择的项目。这些天我构建了两个项目,一个实时文本情感分析器和一个可以确定你的姿势的 web 应用程序。姿态检测建立在 Posenet 模型之上。基于浏览器的推理或训练要小心谨慎,你不希望你的进程阻塞你的计算机或用中间变量填充它。这里的一个好主意是使用类似 Firebase 的东西来托管一个经过训练的模型,并从您的 web 应用程序调用它。当进行实时推理时,确实有许多预处理要做。您也不应该阻塞任何线程并异步运行您的流程,以便在您的模型被加载并准备就绪时不阻塞您的 UI。
我见过很少有人把他们所有的 JS 代码写在 HTML 本身的两个script
标签之间,或者把他们所有的代码放在一个单独的index.js
文件中,现在你只有一个包含所有代码的文件。从开发人员的角度来看,这是一个非常糟糕的方法,您应该尝试将代码分成一个文件,一个用于获取数据,另一个用于加载模型,另一个用于预处理,等等。这使得其他人理解你的代码变得非常容易。
使用奇妙的
tf.tidy
几乎是强制性的,它让您的运行时不受中间张量和其他变量的影响,这些变量可能是您为了获得最佳内存利用率和防止内存泄漏而创建的。异步运行你的进程,你可以简单地在定义函数时使用关键字 a
async
,在调用函数时使用关键字await
,这不会冻结你的 UI 线程,非常有用。我建议通过应用权重量化来缩小模型大小。通过量化模型权重,我们可以将模型的大小缩小到原始大小的四分之一。
结果
挑战赛的结果于 2020 年 4 月 9 日揭晓,我是获胜者之一😃。令我高兴的是,由于惊人的参与度,我还被提升为团队的导师。
感谢 Sayak Paul 、 Ali Mustufa Shaikh 、 Shubham Sah 、 Mitusha Arya 和 Smit Jethwa 在项目期间的指导。*
关于我
大家好,我是里希特·达利
如果你想问我一些问题,报告任何错误,建议改进,给我反馈,你可以发邮件给我
- 【rishit.dagli@gmail.com】
- hello@rishit.tech
TIQ 第 1 部分——如何用自动日期/时间摧毁您的 Power BI 模型
在 TIQ 系列的第一部分,找出为什么使用自动日期/时间是一个坏主意
TIQ 代表时间智商。由于“常规”智能通常被作为智商来衡量,而时间智能是数据建模中最重要的主题之一,我决定开始一个博客系列,将介绍一些基本概念、特定解决方案的利弊和要避免的潜在陷阱,一切都是为了增加你的整体 TIQ,并使你的模型在时间分析方面更加健壮、可伸缩和灵活
马克·尼尔在 Pexels 上的照片
如果您曾经执行过任何类型的数据分析,您肯定应该知道,分析不同时间段内的数字、识别一段时间内的趋势,或者根据特定事件发生的时间点评估各种 KPI,是每个 BI 项目的“面包和面包屑”。
你可以在不了解客户、地理位置、产品等细节的情况下偷偷摸摸(当然也强烈建议使用这些维度),但是不知道随着时间的推移会发生什么,你的整体分析就会受到影响。
因此,我真诚地将日期维度视为“威严”——在我看来,这是整个数据模型中最重要的维度!
当我最近写了关于创建一个自定义日期维度的文章时,我承诺我会专门写一篇文章来更深入地解释时间智能。
所以,这是时间智能主题系列的第一篇文章。
由于它的重要性,我将尝试提供一个日期维度的全面概述,它提供的明显好处,以及在 Power BI 中正确使用(不正确)时的潜在陷阱。
power BI——没有日期维度,我能偷偷通过吗?
答案很简单——当然,你可以!但是,你不应该。如果您的数据模型中没有使用日期维度,Power BI 不会让您失望。相反,它会“帮助”您,通过在模型中的每个日期列上自动创建日期层次结构!
哇,一开始听起来棒极了!既然 Power BI 可以为我构建一个单独的日期维度,我为什么还要浪费时间呢?保持关注,你很快就会发现为什么这不是你想要的结果。
打开新的 Power BI 文件时,在“文件”选项卡下,选择选项和设置,然后选择选项。在左侧的“全局”下,您会看到“时间智能”选项。
如果您选中新文件的自动日期/时间选项,则每次打开新的 Power BI 文件时,Power BI 都会自行处理日期。
另一个可以设置的地方是在左边的当前文件下,然后是数据加载。
让我简单解释一下当您选中此选项时,后台发生了什么:Power BI 将创建一个由年、季度、月和日期组成的日期层次结构,以便您可以在这四个粒度级别上分割数据。
我使用堆栈溢出数据库进行演示,因为它足够大,可以在启用自动日期时间时注意到我们的数据模型的行为。报告本身非常简单,包含两个卡片,显示我们模型的两个表中的许多行:
现在,当您在字段窗格中查看时,您会注意到日期类型的每一列都显示为一个层次结构。因此,我可以使用这些层次结构之一来分割数据:
每个关闭日期的帖子数量
“那有什么不对吗?”,你会问一个合理的问题。我得到了现成的解决方案,不需要编码、导入、扩展数据模型等。
Power BI 幕后
在我继续之前,让我们先来看看当我尝试使用我们的“Date”维度来计算堆栈溢出数据库中年初至今的帖子总数时,后台发生了什么:
如果您看一下自动创建的 DAX 代码,您会注意到我们的 CreationDate 列的不寻常的列引用:
Count Posts YTD =
IF(
ISFILTERED('Posts'[CreationDate]),
ERROR("Time intelligence quick measures can only be grouped or filtered by the Power BI-provided date hierarchy or primary date column."),
TOTALYTD([Count Posts], 'Posts'[CreationDate].[Date])
)
这意味着 Power BI 指向自动创建的层次结构的特定成员(在我们的例子中。[日期],但也可能是。[年份],。[季度]或。[月])。
尽管如此,计算在这里,一切看起来很好。但是,如果我想让我的用户能够在不同的日期对数据进行切片,该怎么办呢?或者,如果用户要求每周分析数据?财政年度?星期几?
弹性等于零!
使用我们的自动日期维度,这些都是不可能的!所以,忘掉灵活性吧,你得到的是年、季度、月和日期,仅此而已。不要误解我的意思,这对于我们说的 80%的分析来说是很好的,但是我们应该如何处理剩下的呢?
例如,如果我想比较一段时间内基于 CreationDate 和 LastActivityDate 的数据,并且希望有一个切片器来更方便地执行我的分析,该怎么办?
正如您所注意到的,只用一个切片器是不可能满足这个要求的。我们需要两个切片器,分别用于每个日期层次结构。现在,假设我们想要基于四五个不同的日期对数据进行切片。更不用说,如果你采用这种策略,你的报告会变得多么丑陋、反直觉和复杂。
我们不能用新的属性扩展日期维度,这是这种方法的最大限制。
用自动日期表格隐藏和寻找
为了对幕后发生的事情有一个大致的了解,我将展示 BI 需要什么样的能力来处理这个问题。对于每个日期列(在我们的 Posts 表中,我们有 5 列:ClosedDate、CommunityOwnedDate、CreationDate、LastActivityDate 和 LastEditDate),Power BI 创建了一个单独的日期表!
你不相信?请跟我来…
当您转到模型视图时,那里没有表。那么他们在哪里(如果他们真的存在的话)?
诀窍在于,这些表在默认情况下是隐藏的,在 Power BI 模型中是看不到的,正如这篇微软文章中的所描述的。
因此,让我们启动 DAX Studio 来支持我们搜索这些本地日期表。对于那些还不熟悉 DAX Studio 的人,我强烈推荐尝试一下——它有一大堆方便的功能,最重要的是,它是免费的!
我已经连接到我的 PBIX 文件,看:
在左边的“模型”下,你会看到一大堆日期表!!!谁创造了他们?我没有,正如你之前看到的。这些都是自动创建的数据表,BI 在后台创建这些数据表来实现时间智能计算。
数据模型的规模在增长…
不必说这些表是您的数据模型的一部分,即使您不是有意创建它们的。包含日期列的表越大,整个模型就越大。
我看到过许多例子,数据模型因为许多自动数据表而变得臃肿。
因此,在阅读了所有这些关于自动日期/时间功能的负面内容后,人们可以理解地问一个问题:
为什么这个自动日期/时间甚至存在于 Power BI 中,更不用说它是默认启用的了?!
照片由内森·考利拍摄
微软没有给出官方解释,但我认为这一决定背后的基本原理是 Power BI 作为一种自助式 BI 工具被推广。
我们不要忘记,有很多人根本不熟悉维度建模概念,更不用说通过编写 DAX 或 M 代码或使用数据仓库中现有的 SQL 日期维度来创建适当的日期维度了。他们需要 Power BI,他们使用 Power BI。
无论出于什么原因,自动日期/时间是 BI, 的一部分,只是不要使用它。
在 TIQ 系列的下一部分,我将讲述如何以适当的方式处理日期维度的可能解决方案。所以,敬请期待!
TIQ 第二部分—陛下:日期维度
Power BI 数据模型中的日期维度有什么特别之处?在 TIQ 系列的第二部分中找到答案
Pixabay 在 Pexels 拍摄的照片
TIQ 代表时间智商。由于“常规”智能通常被作为智商来衡量,而时间智能是数据建模中最重要的主题之一,我决定开始一个博客系列,将介绍一些基本概念、特定解决方案的利弊和要避免的潜在陷阱,一切都是为了增加你的整体 TIQ,并使你的模型在时间分析方面更加健壮、可伸缩和灵活
您可能还记得,在本系列的第一部分中,我强调了日期维度是数据模型中所有维度中最重要的。让我简单解释一下我对此的看法:你可以在不知道某个特定客户群是否购买你的产品的情况下做你的生意;你会莫名其妙地偷偷摸摸,不知道你卖了 100 单位的产品 X 还是 200 单位的产品 Y;但是,如果不知道一段时间内的总体趋势,你肯定会迷失在数据分析中。
我并不是想贬低所有维度的重要性。我会称日期维度为*【第一对】*,或者“第一对”。在这个意义上,我经常称日期维度为“威严”…
Giga-01 在 fotocommunity.de 拍摄的照片
回归基础——让您的模型像明星一样闪耀!
在对日期维度给予应有的关注之前,我们需要澄清为什么它被称为维度,以及从更广泛的角度来看这意味着什么。
说到数据建模,很少有被普遍接受的概念。其中之一就是维度建模,对于各种报表系统(如 Power BI)的数据建模尤为重要。简单地说,这个概念假设你有一个或多个事实表和至少一个,但通常是多个维度。
事实表存储有关已发生事件的数据—无论是销售交易、汇率、温度值…在大多数情况下,事实是可以以某种方式聚合的数值(总和、平均值、数量等)。)
然而,这些数字没有价值,除非我们把它们放到特定的环境中。比如说,我们想知道黑色产品的销售额。或者,我们希望看到每个月的毛利润。或者,我们希望分析与欧洲相比,我们在美国销售了多少台设备。
这里,维度开始发挥作用。最简单地说,维度是业务实体的描述性表示。听起来势不可挡?很少有基本的例子能在一分钟内理清头绪。
假设您有一个名为 Customer 的业务实体。你会用什么样的特征来描述客户?名,姓,她/他住的地方?性别,学历?你说得对,所有这些都可以用来描述一个客户。产品呢?类别、类型、颜色…只是你可以使用的一些属性。
日期维度是数据模型 中最一致的维度——虽然其他维度可以根据特定的报告需求进行不同的设置,或者可以在稍后阶段通过添加/删除属性来扩展/缩减,但是日期维度在每个数据模型中都或多或少是一致的!
理论上,你可以给一个产品添加无限数量的属性,而对于日期,你只能有一定数量的属性(即使你包括一些特定的东西,如工作日、公共假日等)。).这些属性有着完美的层次顺序:日期 2020 年 6 月 27 日将始终属于 2020 年、第二季度和六月,并且它将始终是星期六。您可以将产品 X 更改为属于奢侈品类别,而不是普通产品,但是对于日期,您不能应用相同的逻辑。
经过对维度的详细描述,我们的模型最终应该是这样的:
当您看一看这个图时,它为什么被称为星型模式就很明显了。我们在模型中间有一个事实表,不同的维度围绕着它,所以它让人想起一颗星星。每个维度和一个事实表之间只有一个关系。
不深入讨论其他数据建模技术的细节,例如雪花或平面(非规范化)表,因为这需要单独的系列文章,我只说在 Power BI 中创建数据模型时,推荐使用星型模式。
是什么让日期维度如此独特?
为了充分利用 Power BI 中强大的时间智能 DAX 函数,您的数据模型必须满足一些条件。主要的一条是: 你的模型中至少需要有一个日期表!
此外,表需要满足以下条件才能被视为日期表:
- 该表必须包含数据类型为日期或日期/时间的列(我们将该列称为日期列)
- 日期列必须有唯一的值
- 日期栏必须是连续的(不允许有遗漏的日期)
- 日期列中不允许有空值
- 最后,日期表必须标记为日期表
乍一看,在准备单独的日期表时,这看起来开销太大,特别是如果您还记得 Power BI 可以自动为您创建日期表,而无需您做出任何努力。
然而,就像在任何其他发展领域一样,在开始的时候,稍微多付出一点努力,就会让你在以后结出果实。从一开始就以正确的方式做事才是正道。创建一个单独的日期维度,并将该表标记为一个日期表,这将使您能够充分利用 Power BI,并在使用强大的 DAX 时间智能函数时为您提供最大的灵活性(在本系列的下一篇文章中会详细介绍)。
在 TIQ 系列的下一部分中,我将介绍在 Power BI 模型中创建全功能日期维度的所有现有技术,敬请关注!
如果你正在准备 DA-100 用 Power BI 分析数据考试,一定要查看我的成功经验的详细概述这里。
TIQ 第 3 部分—日期维度创建的最终指南
在 TIQ 系列的第三部分中,学习在 Power BI 中创建适当的日期维度的所有可用方法
Pixabay 在 Pexels 上拍摄的照片
TIQ 代表时间智商。由于“常规”智能通常被作为智商来衡量,而时间智能是数据建模中最重要的主题之一,我决定开始一个博客系列,将介绍一些基本概念、特定解决方案的利弊和要避免的潜在陷阱,一切都是为了增加你的整体 TIQ,并使你的模型在时间分析方面更加健壮、可伸缩和灵活
在本系列的第一部分解释了为什么在 Power BI 中使用自动日期/时间特性是合法的,但不是处理数据模型中日期的理想解决方案,并在第二部分强调了星型模式中日期维度的重要性之后,在本部分中,您将找到在数据模型中创建适当日期维度的各种解决方案。
解决方案 1: SQL
在大多数情况下,如果您连接到关系数据源,如 SQL Server、Oracle 或 MySQL,那么驻留在数据仓库中的数据模型很可能已经包含了日期维度。
在这个场景中,您只需将现有的日期维度导入到 Power BI 数据模型中,就万事俱备了。这种方法带来的好处是,在组织级别上确保关于时间处理的单一真实来源。
假设我正在连接到一个 Contoso SQL Server 数据库,该数据库保存着一家名为 Contoso 的虚构公司的销售数据。一旦我选择了在 Power BI 中获取数据并连接到 Contoso 数据库,我唯一需要做的事情就是选择 DimDate 表(以及我需要的其他表),并且我在 Power BI 数据模型中有了一个适当的日期维度!
这是 Power BI 数据模型中处理时间最简单、最常用的方式。
如果出于任何原因,您的数据仓库没有日期维度(老实说,您被卡车撞上的机会比找到没有日期维度的数据仓库的机会更多),您可以自己创建一个。网络上有多种现成的解决方案,例如 Aaron Bertrand 的这个,因此,如果您出于任何原因需要它,使用 SQL 的日历表可以在几分钟内创建。
解决方案#2: M(超级查询)
如果您没有现有的日期维度可以导入到您的数据模型中,您可以使用 Power Query 及其 M 语言快速轻松地创建一个全新的日期维度。
正如我在之前的一篇文章中已经提到的,关于各种权力查询技巧,网上有许多现成的解决方案。我从礼萨·拉德那里选了这个。
以下是如何使用 M 语言创建日期维度的分步说明。打开新的 Power BI 文件,并在获取数据下选择空白查询:
如果要创建高度灵活和自定义的日期维度,应该利用参数。因此,在“管理参数”下,选择“新参数”并将其设置如下:
定义日期维的开始年份后,对结束年份应用相同的步骤:
完成后,打开高级编辑器并粘贴以下脚本:
let
StartDate = #date(StartYear,1,1),
EndDate = #date(EndYear,12,31),
NumberOfDays = Duration.Days( EndDate - StartDate ),
Dates = List.Dates(StartDate, NumberOfDays+1, #duration(1,0,0,0)),
#"Converted to Table" = Table.FromList(Dates, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Renamed Columns" = Table.RenameColumns(#"Converted to Table",{{"Column1", "FullDateAlternateKey"}}),
#"Changed Type" = Table.TransformColumnTypes(#"Renamed Columns",{{"FullDateAlternateKey", type date}}),
#"Inserted Year" = Table.AddColumn(#"Changed Type", "Year", each Date.Year([FullDateAlternateKey]), type number),
#"Inserted Month" = Table.AddColumn(#"Inserted Year", "Month", each Date.Month([FullDateAlternateKey]), type number),
#"Inserted Month Name" = Table.AddColumn(#"Inserted Month", "Month Name", each Date.MonthName([FullDateAlternateKey]), type text),
#"Inserted Quarter" = Table.AddColumn(#"Inserted Month Name", "Quarter", each Date.QuarterOfYear([FullDateAlternateKey]), type number),
#"Inserted Week of Year" = Table.AddColumn(#"Inserted Quarter", "Week of Year", each Date.WeekOfYear([FullDateAlternateKey]), type number),
#"Inserted Week of Month" = Table.AddColumn(#"Inserted Week of Year", "Week of Month", each Date.WeekOfMonth([FullDateAlternateKey]), type number),
#"Inserted Day" = Table.AddColumn(#"Inserted Week of Month", "Day", each Date.Day([FullDateAlternateKey]), type number),
#"Inserted Day of Week" = Table.AddColumn(#"Inserted Day", "Day of Week", each Date.DayOfWeek([FullDateAlternateKey]), type number),
#"Inserted Day of Year" = Table.AddColumn(#"Inserted Day of Week", "Day of Year", each Date.DayOfYear([FullDateAlternateKey]), type number),
#"Inserted Day Name" = Table.AddColumn(#"Inserted Day of Year", "Day Name", each Date.DayOfWeekName([FullDateAlternateKey]), type text)
in
#"Inserted Day Name"
完成后,点击 Close&Apply,您的数据模型中就有了功能齐全的日期维度!此外,如果您将文件另存为。pbit (Power BI 模板文件),您可以轻松地更改要生成日期的时间段。
正如您可能已经注意到的,您只是定义了您想要的日期维度的开始和结束年份,而 M 负责处理所有其他事情——这多酷啊!
解决方案 3: DAX
最后,如果您喜欢使用 DAX 进行 Power BI 计算,也可以使用它来创建适当的日期维度。DAX 内置了函数 CALENDAR() 和 CALENDARAUTO() ,这些函数会为其他必要的属性做铺垫,比如周、工作日等。
在我指导您在哪里找到创建日期维度的最佳 DAX 脚本之前,我只想建议在大多数情况下避免使用 CALENDARAUTO() 函数,因为它从整个数据模型中获取最早的日期值,并扩展到整个数据模型中的最新日期!
这在某些有限的情况下可以很好地工作,但是在许多现实生活的场景中,比如当您导入关于客户的数据时,有些记录我们不知道客户的正确出生日期。然后,有人插入默认值 1900 年 1 月 1 日,如果您选择使用 CALENDARAUTO() 函数,Power BI 模型中的日期维度会突然从 1900 开始!
这里的关键是——您需要利用特定场景的处理,不要让 Power BI 搞乱您的数据模型。请记住,你是你的数据模型的老板!
正如我在上面承诺的,如果你决定使用 DAX 创建日期维度,不要再犹豫,使用 DAX 大师 Marco Russo 和 Alberto Ferrari 的解决方案。
关键要素—将日期维度标记为日期表
无论您选择哪种创建日期维度的解决方案(SQL、M 或 DAX ),都不要忘记最重要的一点——将这个表标记为一个日期表!这将使您能够充分利用日期维度,执行所有强大的 DAX 时间智能功能,而不必担心结果和性能。
为了被标记为日期表,一个表,或者更好地说,一个将被标记的列,必须满足几个条件:
- 每一行都包含唯一的值
- 不允许空值
- 包含连续的日期(不允许有间隔)
- 必须是日期数据类型
让我们看看如何通过几次点击将该表标记为日期表。右键单击日期维,将鼠标悬停在标记为日期表选项上,然后单击标记为日期表:
应会打开一个对话框,Power BI 将让您选择要在哪个列上应用标记:
Power BI 将自动识别正确数据类型的列,一旦您选择了该列,Power BI 将执行验证并通知您所选列是否验证成功。
如果一切正常,您应该会在日期列名称旁边看到一个小图标:
恭喜你!您已经完成了在数据模型中创建正确的、功能齐全的日期维度的所有必要步骤。
现在,我们已经为使用不同时间段操作数据奠定了基础,在本系列的下一部分中,我将介绍 DAX 中最重要的时间智能函数,以及如何使用它们来利用不同的现实场景。
TIQ 第四部分——在电力商业智能中保持时间智能
在 TIQ 系列的最后一部分,学习什么是时间智能,以及各种 DAX 时间智能函数之间的明显区别
TIQ 代表时间智商。由于“常规”智能通常被作为智商来衡量,而时间智能是数据建模中最重要的主题之一,我决定开始一个博客系列,将介绍一些基本概念、特定解决方案的利弊和要避免的潜在陷阱,一切都是为了增加你的整体 TIQ,并使你的模型在时间分析方面更加健壮、可伸缩和灵活
乔恩·泰森在 Unsplash 上拍摄的照片
亲爱的读者,我们即将结束这个系列。在详细解释了为什么可以、但不应该使用 Power BI 中的自动日期/时间特性之后,接着强调了数据模型中日期维度的重要性,在上一篇文章中,我已经为创建适当的日期维度提供了各种解决方案。
因此,现在是时候总结一些最常用的时间相关计算的例子以及它们之间的一些明显差异了。
什么是时间智能?
用最简单的方式,时间智能表示某种与日期相关的计算。不要把它和“时间”这个词混为一谈,当有人谈论“时间智能”的时候,不要期望把小时/分钟/秒/毫秒看作是最底层的粒度。
更合适的术语应该是“日期智能”,但是由于“时间智能”已经被普遍接受,所以让我们坚持这个命名约定。
安德里克·朗菲尔德在 Unsplash 上拍摄的照片
DAX 中所有时间智能函数的主要特征是,无论如何,它们都需要对日期或日期/时间数据类型的列进行操作。这意味着这些函数的输入参数之一需要是日期或日期/时间列。
此外,所有这些都会将您选择的日期转换为一些新的日期(无论是过去还是未来)。
最后但同样重要的是,时间智能函数支持将一天作为最低级别的粒度,这意味着您不能在小时/分钟/秒等计算中使用它们。
正确使用时间智能功能的检查表
- 正如在本系列的前几篇文章中所强调的,您应该创建一个单独的日期维度,遵循所有必要的规则(连续日期、唯一值、非空值等)。)
- 在数据类型为日期或日期/时间的列上创建日期维度和事实表之间的关系,而不是在代理键整数列上创建关系,除非您将日期维度标记为日期表(在这种情况下,在整数代理键上创建关系也是可以的)感谢 Derek van Leeuwen,MSc 发现了之前不精确的解释
- 不要在时间智能函数中使用事实数据表中的日期或日期/时间列(例如,不要使用示例 Contoso 数据库中事实在线销售表中的订单日期列)
- 始终在日期维度中创建全年值。这意味着,即使事实表中的最后一个订单是在 2013 年 9 月,日期维度也应该包括整个 2013 年,最后一个值是 12 月 31 日
- 如前一章所述,坚持将一天作为最低级别的粒度
最常见的时间智能功能
有几十种时间智能功能,但其中一些比另一些使用得更频繁。例如,几乎所有使用数字的 Power BI 报告都需要进行某种比较,以确定趋势。或者,显示累积值也是最重要的业务需求之一。
这些功能乍看起来很简单,但同时也相当强大。让我们来看看这个简单的例子,计算所选年份的运行总数。
在 Contoso 数据库中,我创建了一个计算销售额的度量值:
Sales Amt = SUM('Online Sales'[SalesAmount])
现在,让我们创建用于计算运行总数的度量:
Sales Amt YTD = CALCULATE('Online Sales'[Sales Amt],
DATESYTD(Dates[Date])
)
当我将这些度量值拖到报表中并选择 2009 年 1 月到 8 月的月份时,您可以立即注意到月份级别上的数字差异:
这很简单,但让我解释一下在销售金额本年迄今衡量计算的背景下发生了什么,因为这对于理解这里的整个逻辑非常重要。
超越基础
回想一下我上面提到的时移概念——这里,我们选择了 2009 年 1 月 1 日到 2009 年 8 月 31 日的日期。YTD 计算发生的情况是,过滤器上下文被更改为包括从 2009 年1 月 1 日到所选月份最后一天之间的日期,不管我们选择的是哪个月份!
看下面的例子会更清楚,我选择了 2009 年 3 月到 2009 年 8 月的几个月:
仔细看看标有红色的数值。无论我们选择三月来显示我们的数字, DATESYTD() 函数都会重置我们的过滤器,并包含年初的值。我们在表格中看不到它们,但它们包含在三月份的总数中,因为您可以很容易地与第一个截图进行比较。无论我们如何更改切片器中的选择,YTD 的总数保持不变。
我最喜欢 DAX 的一点是,你可以用多种不同的方式实现相同的目标。这也代表运行总计计算,因为除了 DATESYTD() ,您还可以使用 TOTALYTD() 函数。 TOTALQTD() 和 TOTALMTD() 的工作方式与相同,但粒度不同(分别为季度和月份)。
细节决定成败…
您还应该注意特定函数之间的细微差别,因为在一种情况下,它们可以给你完全相同的结果,但在其他一些情况下,它们的表现完全不同。
因此,如果您想要执行年度间的比较,您可以同时使用*sameperiodlastyre()*和 DATEADD() 函数,以及以下度量…
Sales Amount PY = CALCULATE(SUM('Online Sales'[SalesAmount]),
DATEADD(Dates[Date],-1,YEAR)
)Sales Amount PY Alt = CALCULATE('Online Sales'[Sales Amt],
SAMEPERIODLASTYEAR(Dates[Date])
)
…将返回相同的结果:
唯一的区别是 DATEADD() 为您提供了更大的灵活性,因为您可以根据自己的需要以及日期层次结构的不同级别(季度、月、日)来改变时间间隔,而 SAMEPERIODLASTYEAR() 仅绑定到上一年。 PARALLELPERIOD() 也非常相似,但仍然有很大的不同,就像我们为日期移动设置静态间隔一样:
Sales Amount PP = CALCULATE('Online Sales'[Sales Amt],
PARALLELPERIOD(Dates[Date],-12,MONTH)
)
但是,当我们将上次创建的度量值更改为…
Sales Amount PP = CALCULATE('Online Sales'[Sales Amt],
PARALLELPERIOD(Dates[Date],-1,YEAR)
)
…您可能认为-1 年相当于-12 个月…
然而,事实并非如此,因为 PARALLELPERIOD 将返回上一年的总销售额(切片器选择已被忽略):
我不想说:用 DATEADD() 不要用 PARALLELPERIOD() 。或者,避免使用 SAMEPERIODLASTYEAR() ,而是使用 DATEADD() 。所有这些函数在您的计算中都有它们的位置— 这里的关键接管是:当您选择时间智能函数来执行特定的时间计算时要小心!正如你已经看到的,在某些情况下,它们会返回相同的结果,但实际上,它们的行为完全不同。
结论
时间智能是 Power BI(以及一般的商业智能)中最重要的概念之一。因此,正如我大胆尝试的那样,在几篇博文中涵盖所有内容几乎是不可能的。但是,我真心希望现在一些基本的概念和思路更加清晰。
最后,我打赌你的 TIQ(时间智商)比你开始这个有趣的 TIQ 之旅时要高。
感谢阅读!
厌倦了数据质量讨论?
避免这些讨论的五个步骤
我参加过无数的会议,会上展示了各种分析的数据和结果。而且大多数会议都有一个共同点,数据质量正在受到的挑战,会议的大部分时间都用来讨论潜在的数据质量问题。本次会议的第一项跟进工作是验证未决问题,然后我们重新开始。听起来很熟悉?
可以不一样。在有些会议上,这些讨论并没有发生,或者可能已经开始了,但是很快就解决了。我见过并参与了一些。这种类型的会议有一个我反复看到的区别。提交数据的人没有掌握他们的数据,没有预料到和没有想得更远。
提出数据的人是 没有掌握自己的数据, 是 没有预见到*没有更进一步思考 。*
事实上,许多数据质量讨论实际上并不是数据质量问题,而是对数据含义的理解。例如它的层次或结构,以及度量标准的解释。当你不明白某件事的时候很容易指责数据质量*,但是通常是,问题出在别的地方。*******
当你不明白某件事的时候,很容易指责数据质量数据质量*,但是通常是,问题出在别的地方。*******
让我们假设你正在做一些探索性的数据分析,以便开始使用 AI 。成功的关键是真正理解你正在处理的数据。如果质量不符合标准,就让它符合标准,或者想办法处理数据。积极主动,然后它会发现这是一条很长的路。
1.从小处着手
这里的关键是随着这么多事情地开始变小。如果你在看一些特性,你可以深入了解这些特性的含义。如果你一开始就有几百个,那就更难了。让我们看看每个客户的产品数量,这显然是很少的。
如果你在看一小部分特性,你可以深入了解这些特性的含义
2.确保你理解你的数据
因为你从小开始,你才能够深挖。绘制相关图,查看频率,并阅读关于这些特性的文档。
因为你从小开始,所以你能够深挖并真正理解数据
在我们的例子中,我们基本上有两个特征要考虑,这两个特征实际上都有很大的讨论潜力。我曾经花了大约三个月的时间来定义什么是客户,当在 B2B 环境中工作时,这是一个特别困难的问题。根据您工作的公司,可能会使用不同级别的产品,其中每个产品都可能会引起不同类型角色的兴趣。产品经理与区域销售主管的兴趣层次不同。
3.验证数据质量
可能已经有了检查数据质量的标准方法,你应该理解并能够解释这些方法。我建议比通常的检查更进一步。检查不一致从业务的角度来看,你客户的大部分工作是“会计”吗?再想想,可能是下拉列表的顶选。另一个典型的质量问题是系统之间的不一致性。请确保您了解这些不一致之处、它们的驱动因素以及它们的含义。
它可能是下拉列表的顶部选项
4.预见问题
你可以预料到相当多的问题。你通常会被问到什么问题?向您的受众报告了哪些KPI?过去发生过哪些讨论?哪些词汇在日常讨论中使用?举例来说,这应该能让你很好地理解你所看到的产品划分(剧透一下,你的数据中可能没有划分)。确保你理解为什么以及如何使用它们的不同层次。
预测问题将允许您将从数据质量讨论中转移**
在我的例子中,有许多不同的产品层次结构(来自不同的系统),被不同的受众使用。我在仪表板中内置了这两个层次结构,并能够解释两者之间的重叠和差异。
如果你发现你的观众正在使用哪些系统,他们通常会看到哪些数据。与你信任的人进行预先讨论,检查数据和结果,找出所有可能的缺陷。
5.了解问题并解决它们
一旦你知道了存在的问题。是时候围绕他们开展工作了。一种方法是从源头解决问题。这可能不是您的工作,但对于后续项目来说可能是至关重要的,因为这些功能将会被用到。
如果你还在探索阶段,那么你可以考虑把问题和假设说清楚。关键在于你能够解释它们以及它们的含义,从而赢得听众的信任。
关键是你能够解释这些问题以及它们的含义来获得你的观众的信任。
你在想这是大量的工作?嗯再想一想,一旦这件事解决了,你就可以真正做你的工作了开始创造可行的见解,采取行动。
关于我:我是一名分析顾问,也是当地一所商学院“人工智能管理”研究的主任。我的使命是帮助组织利用人工智能创造商业价值,并创造一个数据科学家可以茁壮成长的环境。 报名参加我的 通迅 获取新的文章、见解,并祭上 AI 管理 这里 。
TL;博士:狄利克雷过程高斯混合模型变得容易。
聚类是数据科学家生活中的祸根。我们中有多少人花了很多个周日晚上,带着越来越多的担忧看着一个新的数据集,在 scikit-learn 中翻找算法,摸索距离度量和集群数等超参数,同时向偏见之神祈祷宽恕。解决办法?贝叶斯非参数,英雄,我们都值得,但我们都非常需要。
图片鸣谢:欧空局/哈勃& NASA
首先也是最重要的:聚类是生成的逆。
生成模型是给我们观察的模型。我们可以使用伯努利分布模型来生成硬币翻转观察。我们可以用泊松分布模型来模拟放射性衰变。我们可以用一个训练好的神经网络来生成古典音乐。模型越真实,这些观察结果就越接近现实。
高斯混合模型
下面是从四个独立的双变量正态分布中产生的 400 个样本的混合物,它们具有不同的平均值和相等的标准偏差。令人惊讶的是,这种混合高斯分布模型的名字叫做高斯混合模型。
K 均值聚类
使用 K-Means 算法和难以置信的 Sherlockesque 聚类数推理(核密度图字面上告诉你有 4 个聚类),我能够恢复生成模型并对下面的每个聚类进行颜色编码。恢复/群集是干净的,因为数据非常干净。每个高斯贡献了 100 个样本,所以我们不必担心混合概率。我选择了四个截然不同的高斯均值和一个小的标准差进行采样,这样我就不用担心分布重叠了。
在现实中,大自然永远不会对你这样,**永远不会对你这样,**永远不会对你这样,我们不能忽视我们对聚类数、混合概率和混合中每个高斯矩的估计的不确定性。那么,我们如何根据数据复杂性来扩展我们的聚类方法呢?
非参数模型
让我们区分一下参数化和非参数化模型。参数模型是我们可以用固定数量的参数写在一张纸上的模型。 y=mx + c 有两个固定参数( m 、 c ),因此是参数化的。
当适合数据集时,随机森林分类器可以采用 M 个参数( y , X ={x_{1},x_{2},…,x_{n}}),但是如果我们引入另一个特征 x_{n+1},则需要更多的K;随着数据复杂性的增加,模型也是如此。参数的数量没有上限,意味着对于足够复杂的数据,世界上没有足够的纸来写下完整的模型。这是一个非参数模型的例子。
谁在乎呢?事实证明,当我们对聚类数或混合概率的先验信念有限时,我们可以转向非参数化,并无限地考虑其中的许多。自然地,这些聚类中的许多是多余的,并且混合概率非常接近于 0* ,以至于我们可以忽略它们。令人难以置信的是,这个框架让数据决定最可能的集群数量。*
太酷了,我们怎么开始?首先,我们需要一种描述无限多个分布的混合的方法,这就是狄利克雷过程的用武之地。
狄利克雷过程
狄利克雷过程先验可以用足够多的数学术语来描述,使人退回到 K-Means,所以我将偏头痛,给一个直观的概述。
我们希望将混合概率𝜋={𝜋_{1 },𝜋_{2 },…𝜋_{*n }…}*分配给无限个聚类。我们知道, 𝜋 之和必须为 1,并且每个𝜋_{ i }都大于或等于 0。如果我们把 0 和 1 之间的概率想象成一根棍子,我们就在寻找打破这根棍子的方法,以便它准确地反映 GMM 中每个高斯的混合贡献。这种定义狄利克雷过程先验的方法被称为断棒过程,它本身具有贝塔分布先验。我强烈推荐在这里阅读统计细节。
断棒过程的图示。感谢http://blog . sha kirm . com/2015/12/machine-learning-the-trick-of-day-6-tricks-with-sticks/
在我们之前的例子中,我们有来自四个高斯人的相等贡献,所以 𝜋 = { 𝜋 _{1} = 0.25, 𝜋 _{2} = 0.25, 𝜋 _{3} = 0.25, 𝜋 _{4} = 0.25, 𝜋 _{5} = 0, 𝜋 *_{6} = 0,…,*我们打破了我们的棍子无数次,但概率密度只集中在前四个组成部分,允许我们截断无限分布。那么现在我们有了一个混合概率分配的非参数框架,我们如何将它拟合到数据中呢?
狄利克雷过程高斯混合模型
现在大揭秘:因为 𝜋 告诉我们每个高斯在我们的 GMM 中的相对贡献,它实际上是一个分布。每个𝜋 _{i} 对应一个唯一的高斯n(μ{ I },σ{ I })由均值 μ _ {i} 和协方差矩阵σ*{ I }参数化。如果我们让θ { I } =(μ_{ I },σ_{ I }*),我们的问题简化为给每个θ【t58 _ { I }分配一个概率𝜋 _{i} ,反映其对数据混合的贡献程度
给定一些 k 维多元高斯数据 **X,**我们从一个先验信念开始,即所有的 p( 𝜋) 都是同等可能的。然后,我们想使用我们的数据 X 来计算这个新的一切皆有可能的结构的可能性 p( X |𝜋)。最后,我们使用贝叶斯定理为模型后验 p(𝜋|x)∝p(**x |**𝜋)p(𝜋).更新我们的模型通常情况下,p(𝜋| X 涉及一些非常棘手的积分,所以我们依靠类似马尔可夫链蒙特卡罗采样或变分推断来近似 p(𝜋| X 。幸运的是,给定正确的先验选择,我们可以使用期望最大化 (EM)算法进行推理!让我们在 scikit-learn 中看看它的实际应用。
实施
首先,我们生成一些非常混乱的玩具 GMM 数据集,富含随机的潜在相关结构。使用 20 维、8 个分量的 GMM,根据从具有均匀先验的狄利克雷分布初始化的权重方案抽取 10,000 个样本(链接到代码这里)。
对前两个特征进行核密度估计,并不能告诉我们数据中潜在的聚类数,但确实揭示了惊人的异质性。
跨数据的前两个 PCA 分量的聚类散点图向我们显示了恢复一般模型可能有多困难:
使用 EM 算法拟合截断为 15 个分量的 DPGMM,我们看到大部分概率集中在前 8 个分量周围:
事实上,如果我们使用像kull back–lei bler 散度这样的度量,我们可以计算我们的估计参数和我们的数据集中的地面真实参数之间的距离的不对称度量:
每个估计的 DPGMM 聚类映射其自己唯一的基本事实聚类,相对于与其比较的其余基本事实聚类,具有非常小的 KL 散度。对于这种匹配,毫不奇怪,DPGMM 几乎完美地恢复了聚类,而 K-Means 分类器根据最大平均轮廓分数选择聚类数,努力恢复实际的聚类数。
请查看上面链接的代码,尝试用自己的数据实现它。祝好运,集群快乐!
TL;博士:高斯过程贝叶斯优化
数据科学家的难题:我们已经清理了数据,做出了建模假设,并急切地启动了 sklearn 所有阻挡在我们和 Kaggle 竞赛荣耀之间的都是这些讨厌的超参数。我们如何选择他们?
模型性能通常归结为三个关键因素:数据、模型的适当性和超参数的选择。我们可以将数据和模型类视为最棒的蓝莓松饼食谱中的配料,但即使是这些也无法挽救一个面包师在 300 摄氏度的烤箱中放置三个小时的产品。我们如何帮助他找到这些最佳设置?
超参数优化
优化模型超参数的艺术被称为超参数优化,你猜对了。在建模的这个阶段,我们提出了这样一个问题:选择什么样的模型设置可以在我的验证数据集上获得最佳性能?
**注意:**模型超参数应与模型参数相区别。模型参数是从数据中学习的,而超参数是由我们这些数据科学家选择的。例如,当拟合以下形式的线性模型时:
我们正在从我们的数据 y 和 X 中学习 β 。如果 X 包含许多具有潜在相关结构的特征,我们可能想要使用类似 L1、L2 或 elasticNet 正则化来减少过度拟合。
超参数优化帮助我们回答这样的问题:“我应该选择什么正则化方法?”以及“我应该为正则化参数设置什么值?”。我们可以通过询问“我需要多少棵树”来调整其他模型,如随机森林回归器以及“最大树深度应该是多少?”。
网格搜索
最简单的方法是使用每一个超参数组合来拟合我们的模型,并确定在拒绝验证集上提供最佳性能。这种方法被称为网格搜索优化,因为我们可以将每个组合想象为每个超参数值所跨越的网格上的一个点。
图一。两个回归模型类适合玩具数据。左图:使用 L1 比率和正则化参数调整的弹性网络回归。右图:使用最大树深度和树总数调整的随机森林回归。
上面是在一个玩具数据集上调整的两个模型类,该数据集有 100 个特征和 1000 个样本。在这种网格搜索中,每对超参数用于训练一个新模型,该模型具有在保留数据集上评估的验证性能。虽然这在弹性网模型中是相对可行的(图 1。左),在像随机森林回归(图 1)这样的非参数模型类的情况下,它的计算量非常大。对)。
网格搜索是一种确定性超参数调整方法:我们独立考虑每个超参数配置。对图 1 中表面的关键观察。他们是连续的和行为良好的(如果我们确定地知道曲面上的任何一点,我们就可以对它旁边的值进行合理的猜测)。因此,如果我们采用概率方法,我们可以近似图 1 中的表面。使用数量少得多的训练模型。这就是贝叶斯优化非常有用的地方。
贝叶斯优化
Bayes 规则让我们提出以下问题:我有一些关于我的误差表面看起来如何的先验信念,我有一个模型类和数据可以用来收集更多的证据,我如何使用新收集的证据更新我的误差表面以给我一个最优超参数的后验估计?
首先,我们需要一个灵活、可扩展且性能良好的模型来逼近我的回归模型相对于超参数的误差曲面。在贝叶斯优化中,这被称为代理模型。假设我们正在调优岭回归模型的 Lambda 超参数,它在 python 的 sklearn 实现中接受[0,1]中的值。
我们假设我们的验证误差是这个超参数的函数,但是不确定这个函数采取什么形式。由于我们还没有任何证据,我们可以从假设一个无信息结构开始,其中每个误差值都是从均值为 0、标准差为 1 的标准正态分布中独立提取的。这在图 2 中绘制在λ域上。下面。
您可以想象沿着 x 轴集合了无限数量的单个正态分布,阴影区域表示偏离以 0 为中心的平均值+/-1 个标准偏差。我们前面说过,当邻近的点已知时,我们对建议点的值的信心应该增加;我们需要将这种依赖性编码到协方差结构中。
这就是核函数特别有用的地方,它们测量任意两个给定点之间的相似性,并可用于在所有可能的协方差矩阵上建立先验分布。相似的 L1 比值比遥远值更可能具有相似的模型误差分布,并且这被编码在我们选择的核函数中。最棒的是,我们可以用它来建立函数的先验分布。这种结构有一个特殊的名字:高斯过程**(GP)先验。关于 GPs 的深入概述,包括不同类型的核函数及其在贝叶斯优化中的应用,可以在这里找到。**
我们将使用 Matern 内核作为代理函数协方差矩阵的先验。从我们的先验中采样值给出了线的分布:
为了更新我们的先验,我们可以从 Lambda 的随机样本开始,并用它来更新代理函数。在与之前相同的玩具数据集上拟合岭回归模型,我们可以计算λ= 0.1 时的决定系数;我们看到,与它相邻的点周围的不确定性大大降低:
理想情况下,我们希望下一个λ样本的决定系数期望值高于当前样本。这可以通过使用采集功能来实现,如预期改善 (EI)。我们可以从代理模型中直接计算出这个值,并使用它来提出下一个要评估的点。
我们可以在评估、取样、评估、取样之间反复,只要我们愿意。建模者决定准确性和计算量之间的权衡。以下是进一步四轮更新的图表:
****
仅经过五轮贝叶斯更新,我们看到我们的代理函数正在采取一个独特的形状。采集函数引导我们的优化远离过度正则化模型的较高λ值。
总结:使用高斯过程先验的贝叶斯优化是一个非常有用的工具,用于调整模型超参数,同时最小化整体计算开销。对于那些有兴趣阅读更多内容的人,我肯定会推荐彼得·弗雷泽关于这个领域的评论。 Thomas Huijskens 开发了一个优秀的 python 资源,用于使用预期改进的贝叶斯优化。
愿贝叶斯力量与你和你所有的努力同在。
TL;博士:拥有更多的赃物如何能让人工智能司机更安全
贝叶斯深度学习可以帮助捕捉传统方法通常忽略的不确定性属性。通过使用 SWAG 进行学习,我们表明可以训练自动驾驶员以更高的准确性做出更可靠的决策。
KITT OG 自动驾驶汽车
自动驾驶汽车曾经只是《霹雳游侠》等 20 世纪娱乐经典的主题。如今,谷歌有了 Waymo ,优步有了 XC90 SUV ,每辆现代特斯拉都配备了自己的、不那么啰嗦的 KITT 版本,名为 autopilot 。和普通司机一样,AI 司机的大脑也要有经验,反应快,最重要的是,自信。虽然我们可以通过更多的数据来改善体验,通过更强大的机器或更快的算法来提高速度,但我们如何衡量和调节我们的信心呢?
注意我说的调节并不一定是提高。这是因为自动驾驶司机的决定通常由某种深度学习模型驱动,而这种模型已经过于自信。驾驶并不是一项让过度自信有回报的活动;罕见的错误会带来毁灭性的后果。没有人说深度学习模型自大,它们只是大多数确定性函数,不能代表不确定性。这就是贝叶斯方法胜出的地方。
随机梯度下降
DNNs 非常强大的模型,在从语言翻译到图像分类的一系列预测任务中表现出卓越的性能。它们通常包含成千上万的参数,可以调整这些参数以从数据中学习复杂的模式。在监督学习中,目标是学习 p ( y | θ,X);我们搜索模型参数 θ ,连同我们的特征数据 X,可用于区分或预测我们的目标变量 y 中的观察值。对于任何 θ ,我们可以通过使用适当的损失度量来计算我们的模型代表数据的程度,例如在分类任务的负对数似然回归模型的情况下的均方误差(MSE)。
如果我们绘制*【L】*对 θ 的曲线,我们可以看到损耗幅度如何在参数空间内变化:
CIFAR10 数据集的 RESNET-20 损失面的可视化。鸣谢:铁木尔·加里波夫和同事们。
这张漂亮的插图放大了在 CIFAR10 数据集上训练的 RESNET-20 DNN 的高度非凸损失表面。(x,y)轴上的每个 θ 实质上代表一个新的模型,其误差由 z 轴上的 L 的高度跟踪;理想情况下,我们希望挑选 L 值最小的 θ 。随机梯度下降(SGD)就像一种全球定位系统,引导我们从最初的起始位置沿着最大下降的路径前进,直到我们到达许多局部最小值中的一个。对于那些不熟悉 SGD 的人,我强烈推荐从 Andrew NG 的精彩概述开始。
这种方法并非没有缺点:
- 有人认为传统的 SGD 只收敛到一组高性能网络的边界。小样本变化会导致训练和测试数据集之间的损失表面移动,从而将 θ 推离该边界,导致泛化能力差。
- SGD 通常与一个衰减学习率一起使用,以便收敛到一个最优 θ 。虽然这加快了推理的速度,但它并没有覆盖所有可能的解决方案。
- 当我们做出导致过度自信估计的预测时,我们忽略了与 θ 相关的不确定性。
我们怎样才能在不增加额外计算开销的情况下解决这些问题呢?
贝叶斯网络的 SWAG
SWAG 中的 SWA 代表 随机加权平均 g ,这是一种专门解决前两个缺点的方法。其思路是从一个预先训练好的解θ_ {pre}开始,然后把学习率推上去,利用 SGD 探索局部几何。在每一步 i 中,我们以恒定或循环的学习速率移动到权重空间 θ _{i} 中的新位置。恒定的学习速率产生一个新的解,我们连续地将它与我们的预训练解进行平均,以给出 SWA 解θ_ {SWA}。对于循环学习率,求解器“跳出”一个局部极小值,收敛到附近的另一个解;学习周期结束时的收敛解与训练解进行平均。作者表明,这种新的解决方案更有可能集中在一组广泛的高性能网络中,并强调了跨许多残差和图像分类网络的预测准确性的提高。
**Maddox 等人将该方法包装在贝叶斯魔术中,通过使用形式为N(**θ_ {SWA},σ)的多元高斯模型来近似局部误差表面,将 SWA 扩展到 SWA( G )。
****σ是一个协方差矩阵,它跟踪沿局部几何形状的变化,并使用沿 SWA 算法路径移动的每个新点 θ _{i} 进行更新。不幸的是,如果我们包含每个迭代 *i,那么计算σ是很昂贵的;*dnn 包含数百万个参数。作为速度黑客,作者使用全套迭代来仅更新σ中的对角线元素,使用 SGD 迭代中的最后 T 项来计算非对角线。
**现在来看最精彩的部分:我们不再只有对 θ、的一个选择,我们有了由N(θ_ {swa}、σ)给出的整个分布,它描述了围绕θ_ {swa}的几何特征。这让我们可以使用 贝叶斯模型平均 将不确定性直接建模到任何给定的预测中。原则上,这包括将 p ( y | θ,X )中的 θ 积分,得到p(y|X)。在实践中,这在计算上是难以处理的,所以我们通过蒙特卡罗采样来解决近似:采样θ_ {K} ~N(θ_ { swa },σ)K次,并平均 1/**K(**σp(y
SWAG 在图像分类、分割和回归任务上表现出了令人印象深刻的性能,但它在自动驾驶上又会如何呢?
带 SWAG 的自动驾驶
Udemy 早在 2016 年就推出了一款很棒的驾驶模拟器,可以用来手动收集训练数据和处理来自 python API 的 I/O。本实验中使用的网络架构和数据预处理步骤来自于 Manajit Pal 的一个很棒的教程,其中还包括一个链接,指向用于两个轨道之一的数据集。
本质上,该网络是一种改进的卷积神经网络,具有预测单一转向角的线性层。该网络将汽车驾驶员视角的右视图、中视图和左视图作为输入。因为这是一项回归任务,所以使用均方误差作为损失标准。所有代码都是用 python 编写的,使用 pytorch 和 Maddox 等人发布的 SWAG 训练报告进行推理。
使用 80:20 的种子随机分配将数据分成训练集和验证集。首先,使用传统的 SGD 在 60 个时期内训练初始网络,线性衰减的学习速率最初被设置为 0.1,持续 30 个时期,线性衰减至 0.00001,并在最后 6 个时期保持固定。在整个训练过程中,动量被设置为常数 0.9,其中 L2 正则化使用 0.0001 重量衰减来实现。通常在 40 个时期后观察到收敛。
然后 SWAG 再运行 60 个时期,更新每个时期 I 的循环学习率,如伊兹迈洛夫等人所述:
- t(I)=(mod(i1,c) + 1)/c,
- α(I)=(1t(I))α1+t(I)α2
使用基本学习率参数(α1,α2)= {(101,103),c 是设置为 5 个历元的周期长度。我记录了训练/验证 MSE,并将其转换为负对数可能性,以便于解释。我们可以对获得的协方差矩阵执行奇异值分解(SVD ),以将我们的验证集损失表面投影到由特征向量定义的二维平面上:
这里,v1、v2 表示在由前两个 SVD 特征向量跨越的低维平面中距 SWA 解的距离。这是一个非常低维的表示,但是非常好地捕捉了损失表面的几何形状!!我们看到,尽管我们的 SGD 解在 SWAG 3σ区域内(绿色虚线),但它与恰好位于宽损失边界正中心的 SWAG 平均解相差甚远。
最终的结论是,我们的 SGD 模型实现了 0.91±0.0115 的验证集 NLL,而 SWAG 构造具有更低的损失和更紧密的围绕 0.88±0.0094 的解决方案的置信界限。
由于该框架非常灵活,因此可以扩展到更复杂的自动驾驶网络,这些网络具有类似记忆的组件,如 LSTMs。但是现在,我希望我已经让你相信贝叶斯网络真的很神奇,并且对未来有很大的希望。
谷歌的协作环境为这个项目提供了动力,他们免费提供 GPU 时间,因此任何人都可以训练他们的模型!也感谢Marco Antonio Awada博士对信息几何及其在深度学习中的应用的大力指导。
TL;灾难恢复结构因果模型(Dag)变得简单
“吸烟与癌症有关”vs“吸烟致癌”,哪个更容易摇摆公众情绪?后者肯定;因果结论强于关联。我们拥有比以往更多的数据,但开发因果人工智能引擎仍然是一个重大挑战,我们在哪里?
先有鸡还是先有蛋?资料来源:publicdomainpictures.net
联想 vs 因果关系
简而言之:因果关系是那些在外部条件变化时保持不变的关系,无论如何关联都保持不变。
假设我们想了解一年中的哪一个月是冰淇淋需求增加的原因。相关性是一个简单的模型,其中观察到的冰淇淋需求被建模为一年中月份的线性函数**。**我们可以通过测量边际概率 P (冰淇淋 | 月)来表示这种关系。然而,一台机器如何仅凭联想就能确定是冰淇淋需求导致了一年中的哪一个月,还是相反?
它不能!这是因为我们无法在变化条件下验证 P (冰淇淋 | 月)。这就是所谓的关联模型的静态属性 ,包括但不限于关联和回归。
批判地说,朱迪亚·珀尔(现代因果理论之父)将我们温顺的“*相关性并不意味着因果关系”*重新表述为更严格的 “一个人不能仅仅从关联中证实因果关系的主张,即使是在群体水平上——在每一个因果结论的背后,必定存在一些在观察研究中不可检验的因果假设” 。这与我们将因果假设直接编码到数据收集过程中的实验形成对比。那么,我们如何验证“六月会导致更多的冰淇淋需求”这句话呢?
一些人通过简单地控制与治疗变量 x 和结果变量 y 相关的变量 Z 来宣称因果关系。例如,当检查六月( x )是否会导致冰淇淋需求激增( y )时,分析师可能会针对天气调整他们的模型。如果 (Z 和 x ) 和( Z 和 y )不是独立的, Z 就说是一个 混杂变量 。因此,如果我们考虑天气因素,我们的计算机可以使用更新的关联模型P’(y|x)来识别下面这些家伙之间的正确因果关系吗?
差得远,“控制Z”只是我们已经验证的因果假设的一个子集,仍然有太多的依赖和事情在发生!为了了解为什么会出现这种情况,我们可以用一种叫做有向无环图 的结构因果图来说明因果关系。
因果有向无环图
通俗地说,DAG 是一个没有圈的有向图:
这意味着从图中的任何节点开始,比如 D、D,没有任何路径可以将你带回到 D 。重要的是,它们可以用于编码因果模型的所有假设,这被称为因果 DAG。节点表示事件,有向边表示因果关系:E->-F 隐含 E 是因果 F 。因为图是无环的,没有事件能引起自身。事件由路径连接,有三种路径需要考虑。让我们从字母转移到我们的冰淇淋示例,以获得一些实际的上下文:
DAG 1:开放路径
****(1)开放路径:六月是气温升高的原因,而气温升高又是冰淇淋需求增加的原因。天气在六月和冰淇淋需求之间扮演着 T2 的中介角色。健康的经济也会导致冰淇淋需求的增加,但是由于没有箭头指向它,这一事件与月份或天气无关。
DAG 2:后门路径
(2)后门路径:这里两个变量共享同一个因果路径。在一个以农业为主的经济体中,气温升高可能会增加作物产量,从而提高经济健康水平,进而增加冰淇淋需求。更高的温度也让人们想吃更多的冰淇淋。因此,我们可以看到天气或一年中的月份如何成为农业和冰淇淋需求之间关系的混淆变量,因为两者之间存在关联。在因果 Dag 中,通过追踪后门路径总能找到混淆变量。
DAG 3:封闭路径
(3)封闭路径:**这里,一个变量有两个效应导入其中。更高的温度可能会使人们想开着空调汽车到处跑。此外,更健康的经济让汽车更实惠。后果如何?天气和通过更多驾驶传递的冰淇淋需求之间没有联系。驱动事件变量被称为碰撞器。
现在我们明白了为什么简单地“控制混杂变量”会产生误导。在模型(1)中,对天气的调节对应于对*中介的调节,*这关闭了路径,并且这歪曲了事件之间的关系。在模型(3)中,错误地控制一个碰撞器作为混杂因素,打开了一条从六月到通过驾驶的冰淇淋需求的路径,扭曲了整体关系。在实验设计中,这也是一个同样重要的考虑因素,研究天气对倾向于驾驶的人群中冰淇淋销售的影响选择偏差**。**
最重要的是,检查因果 Dag 可以指导我们选择混杂变量:为了在模型(2)中收集经济健康对冰淇淋销售的影响的无偏估计,控制天气似乎是一个不错的选择。
TL;博士:罗伯特·马丁的《干净的编码者》
布莱恩·戈夫在 Unsplash 上的照片
我刚刚读完罗伯特·c·马丁的《干净的程序员:职业程序员行为准则》。不可思议的书,全新的程序员,十分之十。我推荐给每一个日常写代码的人。
我决定做一些笔记,将书中的建议与我自己在数据科学和机器学习方面的一些经验结合起来。我试着把这些笔记写成可操作的形式,这样就很容易从中养成习惯。
- 负责
- 对自己的职业负责
- 当你打算重用代码时,使用 TDD
- 不要害怕说“不”
- 定义“完成”
- 通过给出时间估计来显示承诺
- 提供时间估计,而不是猜测
- 将大任务分解成几个小任务
- 使用 PERT 方法
- 请你的队友估计所需的时间
- 不要参加所有邀请你参加的会议
- 提供一个清晰的议程和一系列要实现的目标
- 会议期间做笔记
- 进行结对编程会话
- 开始使用番茄红素
让我们详细看看每一个。
职业化
这本书的细红线是在回答这个问题,“成为一名软件开发专业人员意味着什么?”。你自己也想一想。你能称自己为专业人士吗?为什么?如果不是,你和专业人士的区别是什么?
负责
我父亲总是告诉我,“工作吧,就像你拥有它一样。”如果公司是你自己的,你会写蹩脚的代码,做最少的工作来满足需求,或者做肤浅的分析吗?大概不会。在道德上有义务为自己的行为负责。
非专业人士要容易得多。非专业人士不必对他们所做的工作负责。
我们如何承担责任?罗伯特·马丁提出了几点:
- 不要损害功能。确保你的代码做了你想让它做的事情。
- 设计易于测试的解决方案。问问你自己,“如果我在一年内重构这段代码,会有多容易?”如果你有可靠的测试,你就不会害怕改变代码。
- 设计易于维护的解决方案。代码会随着时间而退化;维护它是你的责任。童子军规则:总是签入一个比你签出时更干净的模块。
对自己的职业负责
确保你有销路不是你雇主的责任。为你的事业努力。
- 每周花 n 个小时学习新东西。阅读博客帖子,细读 arxiv 论文,在 YouTube 上观看会议笔记,在 Twitter 或 LinkedIn 上关注顶级人工智能影响者——有无数种方法可以了解数据科学和机器学习领域正在发生的事情。但是尽量不要被噪音淹没。把学习时间当作对你的职业和未来的巨大投资。让你的生活成为一个不断学习的过程。
- 练习你的技能。贡献开放软件,做自己的宠物项目,参加机器学习比赛或者黑客马拉松。让练习技能成为每天的例行公事。
- 成为某人的导师。即使你确实知道这个话题,向别人解释也会使你的知识结构化。与某人合作或成为导师。为社区做贡献。
测试驱动开发
测试驱动开发(TDD)是一个软件开发过程,在这个过程中,程序员重复小周期的工作:为一个功能编写测试,编写这个功能,让这个功能通过测试。这种方法有多种好处;以下是几个例子:
- 通过编写更多的测试,您可以确保您的程序如您所愿。TDD 允许您捕捉 bug,并对您的代码更有信心。
- 久而久之,你的代码开始“发臭”,也就是说,代码质量下降。一个好的做法是不时地进行代码重构。但是你怎么能确定你的重构没有破坏代码呢?没有测试,就不可能确切知道。缺乏测试会阻止开发人员执行必要的重构(“如果我破坏了它,我需要修复它”)。
- TDD 迫使你正确地编写代码*。考虑一下为一个同时做多件事的函数编写测试(例如,拆分数据、归一化数据、训练模型以及计算分数)。那会很难。因此,您开始考虑是否可以将函数分解成几个更小的独立函数,这样测试会更容易。*
- 后来写的测试不如先写的测试深刻。
当你打算重用代码时,使用 TDD
数据科学家是否应该使用 TDD 并不是那么明显。有多种理由反对将 TDD 用于数据科学和机器学习任务:
- TDD 需要更多的时间。在某些情况下,数据科学团队需要快速迭代,而 TDD 会减慢这个过程。反驳论点一:你如何确定你迭代的结果是可靠的?一个管道可能会被拒绝,因为一个隐藏的错误使分数很低。当你发现这个 bug 的时候,你必须再次迭代,以确定结果。反驳论点二:现在写脏代码,将来会需要更多时间。在许多情况下,技术债务是可以避免的。
- 一些数据科学任务无法测试。反方:不能做所有的事情并不意味着我们不应该做任何事情。即使 10%的测试覆盖率也比 0%要好。
- 并不是每一段 DS 代码都投入生产,因此很多工作可能是无用的。反驳:如果它没有投入生产,并不意味着代码不会被重用。
- 数据科学家通常不是软件工程师,所以很少有人能写出合适的测试。反驳:开始做,熟能生巧。
自己决定用不用 TDD。
我为自己制定了一个简单的规则:如果我打算多次使用这段代码,我将首先编写测试。对于需要快速迭代的任务,使用眼球测试(例如,通过打印输出或绘图自己检查输出的完整性)。如果我们谈论生产,所有代码必须被测试。
说不和说是
不要害怕说“不”
-我们真的很喜欢你为我们设计的标志!但是我们的管理层有一些很棒的想法…
-没有。
管理层并不像你那样对你的领域有深刻的理解(这就是他们雇佣你的原因)。他们通常不明白一项任务要花多少时间,或者在一些任务上投入资源是否有意义。你的管理层指望你捍卫你的目标,而不只是同意他们所说的一切。要有主见。你和你的经理都需要通过谈判获得尽可能好的结果。我并不是说你应该总是说“不”,但是请记住,专业人士是不会同意的。
定义“完成”
了解你被期望做什么是至关重要的,尤其是在数据科学领域,分数的提高可能需要额外几周的工作。管理层的期望可能与你的计划不同,所以为了避免沮丧,讨论并定义什么是“完成”。如果你不确定什么时候可以说“完成了”,把任务分解成几个你确定的小任务。
通过给出一个时间估计来显示承诺
“我会尽力在下周末之前完成”——你觉得怎么样?这句话的意思可能会有所不同,从“如果有就好了;如果我有时间的话,我会做的,这取决于说这话的人。在某些情况下,这样的短语可能会被视为对完成任务的承诺,这可能会导致错误的承诺。对你的承诺要非常清楚,给予并且不要害怕询问估计的时间。
当你说你会做的时候
你是认真的
你真的做到了
你时不时会受到其他人的阻碍,或者因为意想不到的原因而无法完成任务。那很好。能做多少就做多少,专业一点。如果你不能及时完成项目,尽快通知利益相关者。
时间估计值
“完成这项任务需要五个工作日”——你这么说是什么意思?你的意思是:
我认为它可能需要五天。也许四个,也许六个。甚至可能是 10 年。但我最后的猜测是五天。
或者你实际上的意思更接近于:
不管要花多少钱,我都承诺在五天或更短的时间内完成它。我会加班;没有家人,没有朋友。五天,不能再多了。
提供时间估计,而不是猜测
企业将时间估计视为承诺,而开发人员倾向于将估计视为猜测。真正的软件开发人员会做出承诺,并努力实现它们。问题是,在现实中,我们不知道这项任务需要多少时间,因此我们需要估计。人们往往是糟糕的评估者。然而,有几种方法可以帮助我们提高估计值。
将大任务分解成几个小任务
假设你正在计划去巴哈马度假的预算。你需要多少?1k,3k,10k?你能确定吗?
你可能不能完全确定,但你仍然可以给出一个合理的估计。你所要做的就是得到一个往返的票价;你打算在食物、娱乐和礼物上花多少钱;等等等等,然后总结一下。这些估计也没那么难吧?时间规划也是如此。
把大任务分解成几个小任务,你是一举两得。首先,这种分解有助于理解任务所需的组件和整个架构。其次,它提高了估算的准确性:估算小任务所需的时间比大任务要容易得多。
使用 PERT 方法
为了提高估计的准确性,开始考虑时间估计不是一个单一的数字,而是几种情况:
● O :乐观——如果一切顺利,任务会很快完成。
● N :正常——这个估计有最大的成功机会(最可能的时间)。不是所有的事情都是完美的;将会出现一些错误和阻塞。
● P :悲观——事事不顺。最坏的可能,但也是可能的。
从左到右:乐观,正常和悲观的时间估计。使用过的照片,从左到右:在 Unsplash 上 Ishan @seefromthesky 的照片,在 Unsplash 上 Max Duzij 的照片,在 Unsplash 上 Josep Castells 的照片
给定这些估计值,并假设任务所需的时间可以用 beta 分布来描述,您可以计算:
- 任务的预期持续时间: m = (O + 4N + P) / 6 (天)
- 任务的标准差:σ=(P—O)/6(天)
一系列具有预期持续时间 m_i 和标准偏差 sigma_i 的任务所需的时间计算如下:
- 一系列任务的预期持续时间: M = m_1 + m_2 + … + m_n
- 一个任务序列的标准差:西格玛 = ( 西格玛 _1 ^ 2 + 西格玛 _2 ^ 2 + … + 西格玛 _n ^ 2 ) ^ 0.5
请你的队友估计所需的时间
1906 年,英国统计学家弗朗西斯·高尔顿参加了在普利茅斯的一个郡会,普利茅斯是德文郡南海岸的一个港口城市。他偶然发现了一个猜重量的彩票,参与者被要求猜屠夫斧头的重量。猜得最接近的人将会获奖。高尔顿要求彩票组织者写下参与者的猜测。
根据这些笔记,高尔顿发现 800 次猜测的平均值与斧头实际重量相差不到 500 克,这比获胜者的猜测要近得多。这有助于认知科学中的洞察力,即群体的个人判断可以建模为响应的概率分布,中间值集中在待估计量的真实值附近(参见群体智慧中的更多群体智慧示例)。
获得一项任务所需时间的更准确估计的最简单和最快的方法是独立地问你的队友,然后平均他们的答案。你不需要像在 ax 重量彩票中那样问 800 个人来得到一个可靠的预测。即使在几个同事的帮助下,最终的估计也会有更低的方差,因此估计会更准确(估计的误差包括偏差、方差和噪声;减少其中一个,你会得到更好的预测)。
混合估计似乎很熟悉?没错,这是人类版的随机森林
要进一步改进预测,您可以执行以下操作:
- 猜测完成任务所需的时间。假设你的估计是 7 天。
- 询问同事这项任务需要的时间是多还是少。找出他们的估计和你的估计之间的差异。将差值乘以一个小数字(如果你有一个庞大的部门,则为 0.01;0.5,如果你有一个小团队)并将这个结果添加到你的估计中。
- 重复直到收敛。
这种方法类似于梯度增强。理论上,它减少了估计的偏差。关于偏差-方差权衡、混合和增强的更多信息可以在统计学习介绍(第 2 章和第 8 章)中找到。
没错,这是人类的梯度推进
会议
工作日太短,你能投入编码的深度工作甚至更短。
不要参加所有邀请你参加的会议
管理你的时间是你的工作,而不是邀请你的人。有时候,最好进行一次简短的面对面的讨论,不要开太长的会议。
提供一个清晰的议程和一系列要实现的目标
这是一个简单而高效的提高会议效率的策略。你是要在会议中解决什么问题还是只是随意讨论?写下需要讨论的要点和应该做出的决定。让它变得可行。
会议期间做笔记
你还记得两个月前会议上的内容吗?我也没有。我不知道是否有人可以。也许有人可以,但他们最有可能是在拉斯维加斯算牌。
自己做笔记或者请别人在会议期间做笔记。写下最重要的陈述、共识和任务。在 Confluence 或 Google Docs 中公开共享您的笔记,这样那些没有参加会议的人仍然可以得到更新。
团队合作
进行结对编程会话
结对编程是指两个或两个以上(最好是两个)的人一起完成一项任务。通常,一个人编写代码,另一个人讨论问题并观察问题,如语法、逻辑或代码风格。结对编程有多种好处:
- 这可能是审查代码的最佳方式。
- 结对编程是在公司内部传递知识的最快方式。
- 结对编程有助于团队建设。
开始使用番茄红素
大约六个月前,我开始使用番茄工作法,我注意到专注于问题和跟踪每天的结果变得更容易了(每天站立也有帮助)。此外,将你的工作时间分成几个间隔更健康,这样你就可以从电脑前起来热身。
刮胡子,还是不刮胡子,这是个问题
使用深度学习对有胡须和无胡须的照片进行年龄分类
威廉.莎士比亚两幅画作的年代预测。在这种情况下,胡子不会改变年龄范围,尽管这幅画的平滑特征可能会妨碍模特的表现。原创图片分别来源于 Flickr 和pen light。
机器学习在计算机视觉中的应用是数据科学中一个不断发展的领域,一些有趣的问题已经用这些方法解决了。计算机视觉是识别偷猎者并将他们绳之以法,以及推动无人驾驶汽车的浪潮。在这篇文章中,我使用计算机视觉是出于一个更不相关的原因,即识别我有胡子和没有胡子的年龄。如果你对使用机器学习进行年龄预测感兴趣,我在之前的文章中加入了很多我的代码和推理。如果你对计算机视觉感兴趣,OpenCV 是必不可少的,有许多教程可以帮助你入门。本文的代码改编自 Adrian Rosebrock 的 pyimagesearch 教程。我还通过使用 Prerak Agarwal 的 TDS 帖子来训练我自己的模型。我改编的代码可以在 GitHub 上找到,尽管我建议从 Adrian 和 Prerak 上查看代码。由于 Tensorflow 的训练时间较长,我的脚本使用了预先构建的 CAFFE 模型。
为了训练用于分类任务(例如年龄预测)的任何模型,我们需要具有真实年龄的标记人脸数据。要使用 Tensorflow 训练自己的深度学习模型, Prerak 的 CoLab 笔记本是一个很好的起点。他首先创建均匀分布的标记的训练数据的年龄范围或箱。在我自己的模型训练中,我改变了箱子以更准确地表示发展阶段。例如,我将 10-20 岁这一大类分为 8-12 岁、13-16 岁和 17-25 岁。然而,在面部年龄数据集和 UTKFace 数据集的组合中,出现了 17-25 岁和 25-30 岁人群的富集。训练后,我在遗漏的测试数据集上测试了我的新深度学习模型,发现我的模型预测所有测试案例为 25–30。这可能是不平衡的训练数据的结果。我需要对我的训练数据进行降采样,以平衡我的类来处理这个问题。我没有继续摆弄自己的模型,而是求助于 Adrian 教程中预先训练好的模型。
为了实现年龄分类模型,必须首先找到图片中的所有人脸。OpenCV 有使用级联分类器的面部分类器演示。谢天谢地,面部检测模型已经创建好了。我们可以找到人脸,然后创建一个矩形框来突出显示我们的模型识别的“斑点”,以预测年龄和性别。斑点是图像的子部分的术语。我们的脚本通过网络向前运行新的 blob 预测,并获取最大预测分数。最大预测得分是分配给预测人脸的项。
运行年龄/性别预测脚本
要运行该脚本,只需从项目 Github 下载源代码和模型。需要安装 Opencv 来运行模型和脚本
pip install opencv-python
然后进入文件夹,摆弄一些照片。** 要分类的照片必须与 AgeGender.py 在同一个目录下才能打印输出文件。**
./AgeGender.py --input bearded_willy.jpg
这将输出文件 age-gender-out-beadled _ willy . jpg。打开该文件以查看分类性能。
忍受令人发指的毛发生长带来的瘙痒和斑斑驳驳,还是把刀片拿到脸上,以相反的方式终结它们,哪个更高尚?去理发,去刮胡子。
这个年龄分类系统是如何对我自己有胡子/没有胡子的图片起作用的。
我长着一张娃娃脸,没有胡子,模特预测我的年龄在 15-20 岁之间,然而,有胡子的我属于 25-32 岁之间。
这个年龄分类系统把我没有胡子的脸定为 15-20 岁。鉴于我现在已经快 30 岁了,我认为留胡子可以让未来的面部识别技术准确识别我的年龄范围。我的名字是科迪·格利克曼,可以在 T2 的 LinkedIn 上找到我。请务必查看下面的一些其他文章。
一步一步的教程,让你自己的美丽的图像
towardsdatascience.com](/creating-photo-mosaics-using-python-49100e87efc) [## 使用 Dash 和 SQL 快速浏览圣诞歌曲
使用 SQL 数据库创建 Dash 仪表板的简单项目
towardsdatascience.com](/dashing-through-christmas-songs-using-dash-and-sql-34ef2eb4d0cb) [## 使用 GitHub 创建漂亮的静态网页
查找模板和为静态网页创建表单的位置
towardsdatascience.com](/building-a-beautiful-static-webpage-using-github-f0f92c6e1f02)
要成为更好的数据科学家,你需要像程序员一样思考
拥有强大的编程技能将使你有能力探索数据科学的新领域。但是如何成为一个呢?
动机
随着您越来越多地参与数据科学,有时您需要实现研究论文中的新方法,或者为特定用途定制一个库。因此,对于一个数据科学家来说,成为一名优秀的程序员是非常重要的。
尽管我一直在使用 Python 的可视化和机器学习库,但对我来说,从理论上实现算法并开发 Django 应用程序是一项挑战。我花了一个多月的时间来实现 Voronoi 图。
给定美国医院的大型数据集,我们如何快速找到最近的医院?
towardsdatascience.com](/how-to-find-the-nearest-hospital-with-voronoi-diagram-63bd6d0b7b75)
但是就像人们常说的“成为一个好的编码者的最好方法是尝试从零开始实现一些算法”。实现算法后,我学会了调试代码和快速找到解决方案的基本策略。有了这些策略,与我过去的工作流程相比,我可以在更短的时间内达到同样的效果。这种能力让我有勇气探索更具挑战性的领域,创造创新产品。
我希望我即将分享的策略也能帮助你在数据科学的道路上成为一名更高效的程序员。
一次消除一个潜在错误
我过去做的事
当我的代码中出现错误时,如果代码很长,我可能会怀疑代码的不同部分可能是潜在的原因。代码的 10 个部分中可能只有 3 个部分导致了问题。但是因为我花了很多时间去修复每一个我怀疑的部分,所以我浪费了时间去修复不必要的部分。更糟糕的是,我还可能导致我的代码遇到更多的错误。
我的新方法
一次排除一个可能原因。再次运行代码,看看是否有效。如果没有,请排除下一个可能的错误。我经常惊讶于发现和修复错误的速度有多快。
停止尝试,开始尝试
我过去做的事
当用 Django 实现一个应用程序时,由于 Django 对我来说是新的,我在 Google 上搜索如何开发一个特定的功能。我对许多可供选择的方案感到困惑。经过近一个小时的寻找,最终一无所获。
我的新方法
我没有试图去寻找做某事的完整教程,而是挑选了一些旨在做类似任务的教程,并试图理解它为什么有效。然后我会从教程中挑选一些可能对我的代码有用的元素,并对其进行测试。通过这样做,我可以比严格遵循教程更快地创建个性化功能。
使用 Git Commit 保存工作
我过去做的事
在我的代码中引入更多元素后,我最终遇到了一些错误。我想回到代码运行时的状态,并从那里重新开始我的工作。但是我不记得为了恢复到那个状态,删除哪个代码,保留哪个代码。那时我才意识到用 git commit 保存我工作的不同状态是多么重要。
我的新方法
我保持着为我的项目创建 Github repo 的新习惯。然后使用克隆它
git clone url/of/yourgithubproject
我也提醒自己在成功开发某个特定功能后,保存工作的某个状态。这些是我最喜欢用来完成这项任务的命令行:
git add .
git commit -m "Add id"
然后我在 VSCode 中使用 Git Lens 在我的工作的不同提交之间来回切换。右键单击要返回的提交,然后选择切换到提交。当前文件将切换回这种状态。
检查完此状态后,如果您想要重置到此状态,只需右键单击提交,然后选择重置以提交。现在你又回到以前的状态了!最棒的是,如果你不喜欢你正在切换到的版本,你可以通过切换回你当前的分支很容易地切换回你当前的版本。
查看我关于 VSCode 的文章,了解使用该工具可以获得的更多生产力技巧:
[## 如何在数据科学项目中利用 Visual Studio 代码
直到发现一种新的有效方法,我们才意识到我们是多么低效
towardsdatascience.com](/how-to-leverage-visual-studio-code-for-your-data-science-projects-7078b70a72f0)
别想太多,试出来就好
我过去做的事
实现一个特定的任务有不同的方法,所以我试着在选项之间权衡,以得出最佳的实现。在许多情况下,我可能有一个特定功能的解决方案,但认为一定有更好的方法。我最终花了几个小时寻找替代解决方案,并对自己无法完成任何事情感到沮丧。
我的新方法
通过简单地实现我想到的第一个选项,我很快解决了一个特定的问题。一旦使功能工作,我可以寻找一个更好的,如果有必要的。
例如,我希望每次用户进入数据库时,都会创建具有新 id 的新数据。但是新数据不断得到 0 的 id,导致主键重复的错误。研究了几下一无所获,我问自己如果只是把当前的 id 0 加到数据的长度上会怎么样?随着数据的增加,id 也会增加,我再也不会出现重复的错误。像这样一个简单的解决方案是有效的!
旨在制造错误
我过去做的事
在测试代码的每个部分之前,我尝试开发一个长代码。我非常害怕如果不完善我的代码,我会遇到错误。当运行我的代码时,我最终得到了一堆错误,我不知道错误来自哪里。它可能是我的未测试代码的任何部分。
我的新方法
只是运行一小部分我已经实现的代码。当我有错误时,我知道下一步我需要处理什么来使整个代码工作。
认为这很容易
我过去做的事
想想我需要实施的所有步骤。当我知道我需要学习很多新的东西来完成这项工作时,我感到气馁。
我的新方法
我将复杂的实现分解成更小的容易理解的任务。在试图寻找完成任务的方法之前,我告诉自己,也许我已经具备了实现这个的条件。我只需要找到一种方法将我的旧知识应用于这个新问题。
这种想法防止我过度思考,并使我能够用我的知识创造。如果应用旧知识不起作用,至少我知道是什么使它不起作用。这将帮助我有效地过滤和缩小搜索范围。
结论
这些策略帮助我提高了我的编码技能。我希望你可以采用这些策略来改进你当前的编码实践。拥有一个好的编码方法会给你勇气和动力去尝试新的方法,用创新的方法解决挑战性的问题。
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 Twitter 上与我联系。
如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:
我努力为数据科学贡献时间。但是发现新的策略使我能够提高我的学习速度和…
towardsdatascience.com](/how-to-learn-data-science-when-life-does-not-give-you-a-break-a26a6ea328fd) [## 如何通过将自己置于合适的环境中来加速您的数据科学职业生涯
我感到增长数据科学技能停滞不前,直到我有了一个飞跃
towardsdatascience.com](/how-to-accelerate-your-data-science-career-by-putting-yourself-in-the-right-environment-8316f42a476c) [## 如何创建可重用的命令行
你能把你的多个有用的命令行打包成一个文件以便快速执行吗?
towardsdatascience.com](/how-to-create-reusable-command-line-f9a2bb356bc9) [## 使用这两个工具在您的机器学习项目中实现可重复性
你能打包你的机器学习模型,并根据你的需要挑选一个最好的吗?
towardsdatascience.com](/achieve-reproducibility-in-machine-learning-with-these-two-tools-7bb20609cbb8) [## 如何在不确定时期完成你的兼职项目
有什么方法可以让你在隔离期间工作得更有效率?
medium.com](https://medium.com/skilluped/how-to-finish-your-side-projects-in-times-of-uncertainty-d7af45330ac0)
蒸馏还是不蒸馏:伯特、罗伯塔和 XLNet
变形金刚是自然语言处理中无可争议的王者。但是周围有这么多不同的模型,很难只选择一个。希望这能有所帮助!
照片由维多利亚诺·伊斯基耶多在 Unsplash 拍摄
这已经有点老生常谈了,但是 Transformer 模型已经改变了自然语言处理。BERT(和他的朋友们)在几乎所有常见的 NLP 任务中都扫除了之前设定的基准。这种成功,以及随之而来的流行,已经见证了基于 BERT 架构和训练技术的一系列新模型(前面提到的朋友)的开发。事实上,我们有幸拥有如此多的新模型,以至于对于哪个模型应该用于哪个任务有些困惑。这个问题我已经被问过很多次了,但在大多数情况下,答案是明确的“视情况而定”。
考虑到这一点,我不会尝试选择最佳模型,而是将几种最常见的模型进行比较,特别是在最终精度和训练时间方面。因此,我将使用相同的超参数来训练所有模型,这意味着这不一定是每个(或任何)模型的最佳情况。然而,我希望这个比较能让你对每个型号在相同情况下的表现有一个的感受。
设置
环境
这个实验是使用简单的变形金刚库进行的,这个库的目的是使变形金刚模型简单易用。这个库建立在流行的拥抱脸变形金刚库之上。
如果你希望跟随实验,你可以在几个简单的步骤中准备好环境;
- 从这里安装 Anaconda 或 Miniconda 包管理器
- 创建新的虚拟环境并安装软件包。
conda create -n transformers python
conda activate transformers
如果使用 Cuda:
conda install pytorch cudatoolkit=10.1 -c pytorch
其他:
conda install pytorch cpuonly -c pytorch
- 如果您使用 fp16 培训,请安装 Apex。请按照这里的指示。(从 pip 安装 Apex 给一些人带来了问题。)
- 安装简单变压器。
pip install simpletransformers
请注意,我将同时使用 CUDA 和 FP16 培训(使用 Apex)。
数据
AG News 数据集用于训练和评估模型。准备好数据集;
- 从 Fast.ai 下载数据集。
- 提取
train.csv
和test.csv
并将它们放在目录data/
中。
使用的硬件
任何机器学习模型的训练时间将在很大程度上取决于所使用的硬件,因此您的里程数可能会有所不同!我附上了我用来对比的硬件。
在上面列出的两个 GPU 中,所有实验都只在 NVIDIA Titan RTX GPU 上运行。此外,这个 GPU 在实验期间执行的唯一任务是实验本身(包括操作系统 GUI 在内的一切都由 RTX 2080 处理),以确保所有模型在任何时候都可以访问相同的硬件资源。
模特们
我们将试用下面给出的模型。
- Bert-base-cased
12 层,768 隐,12 头,110M 参数。
接受过小写英文文本的训练。 - RoBERTa-base
12 层,768-隐藏,12 头,125M 参数
RoBERTa 使用 BERT-base 架构 - distil bert-base-uncased
6 层,768-隐藏,12 头,66M 参数
从 BERT 模型中提取的 distilbert 模型 bert-base-uncased 检查点 - xlnet-base-cased 12 层,768 隐,12 头,110M 参数。
XLNet 英文型号 - distilloberta-base 6 层,768 隐藏,12 头,82M 参数
distilloberta 模型是从 roberta 模型中提炼出来的 roberta-base 检查点。 - Bert-base-multilingual-cased 12 层,768-hidden,12 头,110M 参数。
使用最大的维基百科对前 104 种语言的大小写文本进行培训 - distilbert-base-Multilingual-cased 6 层,768 隐藏,12 头,134M 参数
多语言 distil bert 模型是从多语言 BERT 模型 BERT-base-Multilingual-cased check point 中提炼出来的。
超参数
成功训练一个好模型的一个重要部分是获得正确的超参数。根据我的经验,只要超参数值合理,大多数预训练的变压器模型都会收敛并给出良好的结果。因此,以下给出的值可被视为所有型号的合理默认值,而非针对任何特定型号的优化值。
对所选值的快速解释;
最大序列长度
变压器模型被限制为每个输入示例最多有个标记。令牌是模型词汇表中的一个“单词”(不一定是正确的英语单词)。任何输入文本都会被拆分,直到整个输入都由模型词汇表中的标记表示。如果结果表示包含的令牌数超过了允许的最大数量,它将被截断到最大长度。如果更短,它将被填充到最大长度。
由于 AG News 数据集中除了少数例子之外,其他例子的长度都小于 256 个标记,所以我决定使用这个值。请注意,增加最大长度会增加资源消耗。
训练时期的最大数量
很明显,每个模型将被训练最多 5 个时期,其中一个时期是所有训练数据的一次通过。
训练批量
培训期间将并行处理的示例数量。较大的批处理大小往往会减少训练时间(直到某个特定点,直到 GPU 的计算核心被完全利用),但会消耗更多的 GPU 内存。一般来说,使用 GPU 能够处理的最大批量是安全的。
学习率
控制在训练期间更新模型权重时的步长。
早期停止耐心
早期停止是一种用于防止机器学习模型过度适应训练数据的技术。一般的想法是,一旦模型停止提高其在验证/测试数据上的性能,就终止训练。耐心是在终止之前等待多少步。耐心为 3,如果连续 3 次评估损失没有改善,我们将终止培训。
人工种子
我们正在设置手动种子值4
,以确保结果可以重现。
代码
该脚本可用于在农业新闻数据集上训练每个模型。这还会将训练进度发送到 Weights & Biases 以便于可视化。您可以通过移除train_args
中的线路wandb_project
和wandb_kwargs
来禁用此功能。然后可以从文件x-y-training_progress_scores.csv
中获得训练进度,其中 x 和 y 分别是model_type
和model_name
。Tensorboard 也支持可视化(运行保存到runs/
)。
该脚本需要两个参数,model_type
和model_name
。这里,model_type
是 Transformer 架构,model_name
是该架构的特定预训练模型。下面的 bash 脚本将为这个实验中使用的每个模型运行训练。
方法
我们将在 AG News 数据集上训练每个模型,并比较它们的性能。
之前指定的超参数将用于每个模型。重要的是,我们将使用早期停止来确保模型不会过度适应训练数据,这使我们能够进一步了解每个模型收敛的速度。
用于评估的指标是马修斯相关系数 (MCC)。将每隔 1000 个训练步骤并在每个训练时期结束时计算评估数据集上的模型的 MCC 分数。
结果
给聪明人一个忠告:结果可能因所用的数据集和所选的超参数而异。这不是也不打算作为模型的决定性基准。
现在,我已经(希望)给出了足够的警告来保护自己免受热心学者的亵渎指控,让我们开始吧!
完成时间
首先,看一下每个模型的运行时间。请注意,这同时考虑了培训时间和培训期间执行评估所花费的时间。
此外,由于提前停止,更快达到峰值性能的模型将具有更短的运行时间。
绘制上述值:
运行时与模型
为了看到整个画面,重要的是要考虑到提前停止的影响。
关键要点:
- 对于给定的模型类型(提取模型、基本 BERT/RoBERTa 模型和 XLNet ),执行给定数量的训练步骤所花费的时间是相同的。这一点从每条线的梯度就可以看出来。
- 推理时间(在这种情况下为评估)遵循类似的模式,对于给定的模型类型,时间是相等的。从线的平坦(水平)部分可以观察到单次通过评估数据集所花费的时间。平坦部分越长,评估时间越长。
收敛步骤的数量也呈现出同样的趋势。
- 基本模型(bert-base-cased、bert-base-multilingual-cased、roberta-base)收敛最快(平均 8 500 步)。
- 接下来是经过提炼的模型,平均 10 333 步。
- XLNet 收敛于 11 000 步,与蒸馏模型相当。
绘制总步骤数:
最终性能
所有这些模型在 AG News 数据集上都表现得非常好。
差一点就打电话了。
如前所述,所有模型在测试数据上都表现出良好的性能,这证明了 Transformer 模型在 NLP 任务中的能力。
这些可视化(以及更多)可以在这里找到。
结论
虽然不同的 Transformer 模型在性能和训练时间方面存在明显的差异,但是最佳的选择通常取决于特定的数据集、任务和需求。
也就是说,我们可以得出一些通用的经验法则(拇指?).
- 与 BERT 和其他类似 BERT 的体系结构相比,XLNet 通常需要更多的资源,并且需要更长的时间来正确训练。
- XLNet 在推理方面也比较慢。
- 然而,当数据与预训练数据明显不同时,XLNet 表现得更好。
- 经过预先训练的变形金刚的精华版本通常非常接近原始模型的性能。在这种情况下,它们超过了原始模型,但这很可能是因为所选择的超参数值。
- 经过提炼的模型训练速度更快,推理速度也更快。
- 然而,提取的模型可能难以收敛于某些数据集,尤其是在任务复杂的情况下。
基于这些观察(以及我的个人经验),我通常会建议从精选模型开始,如果性能不令人满意,就转到基本模型和/或 XLNet。
这些模型的“大”版本是另一种选择,但我发现它们通常更难正确训练,而且由于它们的尺寸,肯定需要更长的时间来训练。
思想?经历?见解?如果你有,请分享!
对于每一个动作,并不总是有相反的相等的反应
让我们停止编造,成为更好的科学家。
Héizel Vázquez 插图
如果你在生活中接触过任何基础或初级物理学,你会听到这样的话:
每一个作用力总会有一个相等的反作用力。
这是牛顿第三定律的摘录,它说:
每一个作用力总有一个相等的反作用力:或者说两个物体之间的相互作用力总是相等的,并且指向相反的方向。
这里有一幅来自 1729 年翻译的《自然哲学的数学原理》的图片:
https://archive.org/details/bub_gb_Tm0FAAAAQAAJ/page/n63
你们中的大多数人可能都知道这一点,而且,我很肯定你已经听说过人们把这一点应用到生活中的每一件事情上。我是说一切。
让我给你看一些例子:
瑜伽:
【https://www.yoga-philosophy.com/eng/karmalaw.htm
这太尴尬了。
哦,我的:
https://www . jackcanfield . com/blog/using-the-law-of-attraction/
在心理学中(有很多这样的例子):
https://www . tandfonline . com/doi/full/10.1080/08870446 . 2011 . 613995
我可以继续,但我想你明白我的意思了。我们人类是将事物外推到新领域的专家。有许多科学论证被人们日复一日地使用,却不知道它们的含义和范围。
让我说清楚一点。牛顿说的是物体的运动,物理物体,而不是生命或感觉。我劝你读一下牛顿的原理,这样你就知道我的意思了。这是非常重要的,你应该知道一个科学论证意味着什么,以及它在哪里适用。它不能在任何地方使用。在牛顿写下他定义了物质、动量、力等等之前,他陈述了公理并解释了整个物理学理论。这个论点只适用于粒子,运动和力。
但更重要的是,我们调查了第三定律可以被打破的地方,这让它变得有点模糊。看一看:
牛顿第三定律被违反的情况有很多种。通常,动作-反应…
journals.aps.org](https://journals.aps.org/prx/abstract/10.1103/PhysRevX.5.011035) [## 物理学家展示了打破局部因果关系的新方法
2017 年 4 月 21 日,Phys.org,Lisa Zyga(phys . org)-物理学家首次通过实验证明了…
phys.org](https://phys.org/news/2017-04-physicists-violate-local-causality.html) [## 通过作用-反作用对称破缺的光学径向驱动加速
一个动作产生一个大小相等方向相反的反作用。然而,如果有可能两个身体中的一个拥有…
www.nature.com](https://www.nature.com/articles/nphys2777)
所以请不要再把第三定律的陈述当作“谋生的法则”
与数据科学的联系
Héizel Vázquez 插图
如果你在这里,你可能对数据科学感兴趣。链接是这样的:
不要用简单的论点在任何事情上寻找因果关系。
我们必须停止制造“简单”的模型,用“年龄”或“性别”这样的变量来解释复杂的事情。没那么容易。不要误解我,这只是一个开始,但如果我们想解决问题,我们需要深入挖掘。我们需要收集尽可能多的数据,并尽可能多地转换我们的数据,以找到尽可能有用的信息。
永远记住相关性并不意味着因果关系,对行动并不总是有简单的反应,并不是所有事情都是这样。
我们是科学家,如果你仍然不相信,请阅读这个:
第一部分:将科学引入讨论的重要性。
towardsdatascience.com](/https-towardsdatascience-com-on-data-and-science-e96849b5f363)
每一个问题都不能用一个线性或逻辑回归或有 20 个特征的神经网络来解决。如果你采用这种方法,你就是“数据技术员”,而不是数据科学家。如果我们想改变世界,我们必须超越直觉和常识,这也适用于数据科学。
等待更多关于这个主题的信息,并请写下你的想法。
为了得到一份数据科学方面的工作,我用 Python 构建了一个自定义的职位发布过滤器
找工作从来都不是一件小事。从来没有。
即使有像 Indeed 和 LinkedIn 这样的在线招聘平台的帮助,搜索的过程仍然需要大量的人工努力。不匹配的赞助帖子不断出现让你烦恼,当你尝试不同的搜索词时,同样的工作重复出现,只是进一步增加工作量。
此外,数据科学的范围如此之广,以至于它给搜索的难度增加了另一个乘数。用一个头衔“数据科学家”,你可以得到实际上截然不同的描述。
在 Unsplash 上由 Hitesh Choudhary 拍摄的照片
但是你想过让梦想的工作找到你吗?在经历了没完没了的搜索之后,我决定用 Python 开发一个工具来帮助有效地管理招聘信息,并优先考虑那些最匹配我的。
我们开始吧!
数据收集
第一件事是收集足够的与数据相关的招聘信息。在这里,我选择了 indeed.com,并使用了从“数据科学家”、“机器学习”到“数据分析师”和“数据可视化”的关键词。
为了指定我的偏好,我使用过滤器来限制工作地点和经验水平。下面是一个结果页面的 URL 的截图。
有了它,我们就可以构建代码来收集职位发布。要继续,请确保您已经下载了 Selenium 、 BeautifulSoup 和 ChromeDriver 并在您的机器中进行了配置。(请将文件“ chromedriver ”放在放 Jupyter 笔记本的同一个文件夹下。)
首先,我创建了一个工具来生成 URL 链接,这样当我想改变搜索设置时,就不需要打开一个新的标签页来访问了。
输入你的偏好和搜索词,你会得到用于网络搜索的链接:
我使用 Selenium 来处理 web 抓取任务,因为它执行得很好,尤其是当您必须与网页交互来获取信息时。
例如,每页上有 10 多张招聘信息卡,您需要单击每张卡片来导航到相应的职位描述。这种情况下,*。点击()*可以为我们调出内容。另外,在第二个结果页面上会出现一个弹出窗口,所以我添加了一行按 Esc(escape)键来关闭窗口。
我写了以下代码来检索利益信息:职位名称、地点、公司、职位描述、发布日期,如果是急招。我还在网上搜索工作 id,生成新的网址,引导我回到某些发布信息的网页。
数据处理
我针对不同的搜索词运行了上述代码,以收集一个职位发布池。然后我合并数据集并删除重复的。我从最初的 900 多条帖子中得到了总共 650 多条独特的评论。(无法想象我是怎么翻遍这么多职位描述的!)
数据集一览:
之后,我对日期和工作描述做了一些文字处理:
定制作业选择器
主菜来了:构建一个定制的工作选择器。我的方法如下:
- 根据我的技能组合创建有意义的指标。
- 通过给每个指标一个权重来量化,并计算总分。
我做的第一件事是制作一个包含我所有技能的表格。我想出了几个类别,并给它们添加了一些关键词(当然,根据你想找什么样的工作,你也可以有自己的版本)。该表将用于从工作描述中提取短语。
关键词表的外观:
我使用下面的代码创建单词列表进行匹配。
对于每个类别,我计算了我的列表中有多少关键词在每个职位描述中被提及。例如,在“机器学习”类别中,我列出了 8 个关键词。如果其中 3 个出现在某个工作描述中,那么标签“机器学习”的值将是 3。
在用技能组合标注了所有的招聘信息后,我创建了一些新的指标来做进一步的比较。这些指标是根据我的个人资料和工作偏好设置的。
位置
我住在旧金山,我更喜欢在湾区工作,以避免搬迁。所以我创建了一个名为 relocate 的标签,如果它的位置在湾区之外,就加上“1”。
发布日期
如果一份工作是新发布的(在过去 5 天内),它绝对值得申请,因为这意味着我的简历会有更高的曝光率。
程序设计语言
我还关心所需的编程语言。如果一个帖子没有指定 R、Python 或任何 DBMS 语言(如 SQL)中的任何语言,它可能不适合我,因为这份工作可能在数据科学领域太“商业”或太“核心”。
总发布分数
我构建了一个名为“ basic_analytics 的指标来标记最基本的技能,比如数据操作和数据可视化。
然后使用类似的方法,我为高级分析技能和专业技能创建了指标。
权衡不同的分析技能
量化一份工作与你匹配程度的一种方法是建立一个总体发布分数。一篇文章的总得分被定义为上述指标的加权和。同样,这是非常灵活的,重量可以根据您的需要进行调整。
我给予高级分析技能相对较高的权重,因为我更喜欢在机器学习算法和建模方面需要更多知识和实践的工作。
最后,我把帖子按总分排序。最终表格和显示分数分布的直方图:
下一步是什么?
有了这个方便的工具,我可以优先考虑得分较高的工作,并相应地准备我的简历。它更方便、省时,也让我的求职过程更容易管理。
您还可以利用这个脚本来定制您自己的作业选择器,并通过添加更多的特性使它达到更高的水平。(全码)
求职愉快!
查看我过去的博客:
—网络公众如何回应疫情
towardsdatascience.com](/twitter-sentiment-analysis-based-on-news-topics-during-covid-19-c3d738005b55)
意味着还是不意味着(这是中心趋势问题)
我一直是“数学小子”。作为一个年轻的女孩,我痴迷于乘法表,我喜欢学习函数和如何绘制它们。我总是特别迷恋概率和统计,甚至从年轻的时候。这始于简单概念的介绍,如平均值和中位数。
因为我很小就接触到这些术语,所以我总是把它们当作“婴儿用品”一笔勾销。我认为,随着我在数学和统计学方面的知识的深入,这些概念是不可能有用的。
剧透警告:哦,我错了。
所以我上了大学,学了更多的统计学和概率论,并很快意识到:a)如果使用正确,均值和中值可以讲述一个极其有力的故事;b)如果使用错误,或恶意使用,均值和中值可以讲述一个极其欺骗性的故事。
如果你还没有读过查尔斯·惠兰的《裸体统计数据》,我强烈推荐你去看看。他对均值为何会产生误导的解释改变了游戏规则。对于那些没有读过它的人,我会给你一个快速的纲要,有一个现代的转折。
误导手段的故事:3 个声音云说唱歌手和里尔·简自豪·韦特
假设有三个“崭露头角”的 Soundcloud 说唱歌手在一家咖啡店闲逛(因为这就是 Soundcloud 说唱歌手做的事情,咄)。为了更好地了解说唱歌手的知名度,我们可以确定每个说唱歌手在平台上有多少粉丝。然后,我们可以取这些值的平均值来了解说唱歌手之间的平均追随者数量。假设平均值为 2496。
突然,才华横溢、家喻户晓的说唱歌手利尔·简自豪·韦特冲进咖啡店,要了一杯燕麦牛奶拿铁(完全披露:不确定他点了什么咖啡……但燕麦牛奶拿铁很好喝)。总之,现在咖啡店里有 4 个说唱歌手。由于我们的人口已经改变,我们必须重新计算他们的追随者计数的平均值。
在短短几秒钟内,咖啡店内的平均 Soundcloud 粉丝数从 2071 增加到 481997!哇,那三个崭露头角的说唱歌手是不是突然爆红了?不要!里尔·简自豪·韦特刚刚出现,他的 240 万粉丝就把平均值从之前的值拉高了。
平均值对异常值很敏感…那么我们应该使用它吗?
显然,平均值会受到数据集中任何异常值的严重影响。当我大学毕业的时候,我发誓这已经被灌输到我的脑海里了。以至于,事实上,直到最近,我还真的认为这个方法不可信。我相信中位数是最好的汇总统计。
剧透警告#2:哦,我错了。
我再次感谢惠兰先生。他的书告诉我,均值不仅有用,而且在某些情况下,它们是更好地理解数据集的重要测量形式。
是的,均值容易受到异常值的影响。是的,中位数不容易受到离群值的影响。中位数赋予数据集中的每个观察值相等的权重,无论其大小如何。
然而,这实际上是中间派的最终垮台。播放戏剧性的音乐
“并非所有数据点都是平等的”
在我们的说唱歌手例子中,不可否认,中位数是更好的描述性统计。但这是因为我们想在调查他们的名气时平等地对待每个说唱歌手。
当处理并非所有数据点都是平等的数据集时,平均值会战胜中位数。Charles Wheelan 在他的书中用一个医学试验作为例子,很好地说明了这一点。
因为我的大脑喜欢看例子,所以我在每天阅读后花时间开发自己的场景,在这个场景中,平均值将击败中位数,成为最佳的描述性统计选择。
一个均值可能让你加薪(而中位数可能让你被解雇)的例子
假设你是一家电子商务公司的分析师。营销团队正在计划一项活动来接触您的现有客户,希望在这个低迷的季度增加收入。他们制作了一个精美的电子邮件模板,并把它发送给大约 50 万名忠实客户。
10 天过去了,每个人都迫不及待地想看到这个团队努力工作的结果。你开始提取数据,很自然地,你认为首先要用一些描述性的统计数据来总结数据。一种选择是找到收到活动电子邮件的每个客户花费的美元的主要趋势。
因为您听说平均值对异常值很敏感,所以您决定使用中位数作为您的中心趋势度量。你运行你的计算,你的结果是一个巨大的,巨大的,可怕的零。一无所获。什么?但是有成千上万的顾客使用了促销代码!!!你根本不可能将这些结果交付给营销团队(至少不会让一些人陷入困境)。
然后,你突然想到:均值呢?你重新计算,然后如释重负地松了一口气。收到活动电子邮件的每位客户平均花费 1.30 美元。这听起来好多了,尤其是因为每封邮件的成本大约是 0.008 美元。平均值更适合于在这个特定场景中获取这个特定指标。此外,您可以满怀信心地将这些成果交付给您的团队。
均值可能是更好选择的场景
正如我之前提到的,利用中位数来分析扭曲数据的想法已经深入我的大脑。但是,在阅读《赤裸裸的统计数据》之前,我从来不知道什么时候选择平均值作为集中趋势的衡量标准的经验法则。这里有两个总体特征,通常意味着均值可能是更好的选择:
- 我们不会因为失败而失去太多。
- 一小部分人(比如说,不到一半)取得了成功。事实上,我们甚至可能期待小的成功。
在我们的电子邮件示例中,两者都是 1。第二。都存在。我们不会因为失败而失去太多。如果他们忽略邮件,顾客就不会有危险。发送一封电子邮件的费用非常低。此外,通常只有一小部分人会对电子邮件营销活动做出回应。有人说“良好回复率”下降了 5–10%左右。
当我们试图使用这些类型场景的中位数时,我们可能会错过隐藏的见解。但是当我们使用均值时,我们可能会发现一些关于我们成功的秘密。
原载于 2020 年 9 月 6 日https://data dreamer . io。
提供还是不提供?星巴克的机器学习项目
寻找那些免费的咖啡奖励。 来源 Pikist 。
我将第一个承认,我是一个狂热的咖啡爱好者。但是,我并不局限于某一家连锁店。在我的手机上,我下载了咖啡豆、星巴克和 Dunkin 的应用程序。大多数时候,距离会决定我去哪家店。然而,随着我在每个连锁店获得越来越多的忠诚度积分,我会因为收到特别优惠通知而去某个特定的商店。
星巴克怎么知道什么时候给我发那些奖励?他们如何在买一送一、下一次订单减 2 美元或简单的奖励星级之间做出选择?
这是我在我的 Udacity 数据科学纳米学位的顶点项目中试图回答的问题。
如果你有兴趣跟随代码, 查看 Github 上的项目。
TL,DR:
- 在星巴克,女性平均比男性花更多的钱。
- 没有完全填写会员资料的用户通常花费较少,这表明他们也不会从“精酿饮料”相关优惠中受益(例如,尝试我们的新 venti magic unicorn frappuccino,添加额外的糖屑和仙粉,并获得额外的 20 颗星!).
- 提供折扣的优惠比买一送一的优惠更有可能成交。
- 为了获得最大的完成度,在你的分销计划中加入社交媒体。最成功和第二次最不成功的报价几乎在所有方面都是一样的,除了最成功的报价是通过社交媒体传播的,而另一个不是。
- 通过机器学习,我验证了社交媒体是一个影响要约是否会被完成的因素。
- 其他重要因素包括优惠持续时间、用户年龄和奖励金额。不重要的因素包括电子邮件、用户成为会员的时间以及他们的性别。
数据
为了完成该项目,星巴克向 Udacity 提供了 3 个关键数据集:
- portfolio:关于样本数据中提供的所有 10 个报价的数据
- profile:关于所有进行交易或提供通知的用户的数据
- 文字记录:关于所有已发生交易的数据,无论是购买还是与报价的交互
深入到这里的细微差别,关于每个数据集还有一些事情需要注意。投资组合指定了特定报价的发布渠道,包括电子邮件、手机、社交网络或网络。还有一个难度分数,完成报价必须花费的金额。还指定了奖励金额、到期前的持续时间和优惠类型。
个人资料包括用户的性别、收入、年龄和成为会员的日期。然而,一些人口统计数据丢失了。
抄本包括记录的事件和交易金额,或者要约是否被接收、查看或完成。
问题陈述
使用这些数据的目的是识别购买趋势和报价完成情况。理想情况下,通过这个项目,我将能够预测用户是否会因为收到报价而进入商店购买。
因此,需要记住一些注意事项。如果有人要进来买 10 美元的咖啡,不管有没有报价,我们都不一定要在 10 美元的购买报价上降低 2 美元。
此外,用户可能会在没有阅读甚至不知道要约存在的情况下完成要约。同样,在这些案例中,该提议没有达到其改变行为的目标。
因此,在解析数据时,我确保只有当用户查看了要约并在要约到期前完成了要约,才认为要约已完成。
数据清理
幸运的是,这些数据集没有太多清理工作要做。但是,为了便于分析,做了一些更改。
首先,offer id 是一个看似随机的长字符串。这些被简单的两个字符的代码所取代。第一个字母表示报价是信息性的、折扣的还是买一送一的(I、D 和 B)以及一个序列号。
接下来,使用虚拟变量重新映射了性别和 offer 分布方法等列。
还检查了数据的完整性和正确性。人们发现大量的年龄被输入为 118,这是一个明显的错误。这些值被替换为 NaN。
数据探索
在我们进入机器学习之前(我知道这是你们所有人在这里的目的),我从初步的数据探索开始。这有助于识别机器学习问题,验证从机器学习中得出的结论,并找到仅通过机器学习无法识别的数据集的基本统计描述符。
首先,我研究了每笔交易花费的金额。
正如经常光顾咖啡店的人所料,绝大多数交易都低于 8 美元。有趣的是,在 1-2 美元附近有一个大的峰值,也许这些人只是进去并得到一杯派克酒,还有房间。
接下来,我对用户人口统计数据感兴趣。我只考虑年龄和收入。
这看起来像是一个非常标准的用户群,尽管我原本预计年龄分布会有一个较低的峰值。
还有,对星巴克的 100 岁格莱美大声喊出来。
现在,任何去过星巴克的人都知道拿着星冰乐的少女的迷因。所以,我还想看看按性别划分的平均支出。有一些关于性别的“其他”数据,要么表示没有为该用户收集性别数据,要么表示用户识别为二进制之外的性别。区分这两者是很好的,但是,唉。
有意思。女性通常比男性多花 5 美元左右。由于每杯精酿饮料大约 5 美元,这表明女性比男性更经常购买多种饮料(可能是为家人或朋友购买)。
此图也让我们对“其他”类别有了一些了解。可能这些用户并没有完全注册成为会员,他们只是来买一杯黑咖啡,而不是对特别优惠的手工饮品特别感兴趣。
当然,这种独特的见解需要更多的数据来验证。
接下来,我对哪些报价最有可能完成感兴趣。提醒一下,这里的代码指的是优惠是直接折扣(即 10 美元订单减 2 美元)还是买一送一。也有信息提供,但这些只是通知用户新产品,例如,并没有行动。每份报价也以 4 种方式中的任何一种发布:电子邮件、手机、社交媒体或网络。
首先,重要的是要注意到每个提议被分发的次数大致相同,所以不存在偏见。最后两行在很大程度上也可以忽略,因为它们是信息提供,而不是折扣或 BOGOs。
从这一分析中得出的一些关键结论是,完成折扣的可能性比 BOGO 提供的更大。此外,所有表现最佳的产品都以各种可能的方式发布,尤其是社交媒体。当只有社交媒体被删除时,这些优惠就排在了最后,尽管它们也是折扣。
事实上,让我们比较一下 D3 和 D4。D3 是表现最好的,但除了一个关键因素:社交媒体,它几乎与 D4 相同。D3 也持续了几天时间,但考虑到表现最差的报价都不是在社交媒体上,这就很能说明问题。
机器学习
现在有趣的是,建立一个机器学习模型来预测哪些因素会增加要约完成率。
响应变量是报价是否成功,编码为 0 表示不成功,1 表示成功。如果要约在到期前被用户阅读并履行,则该要约被定义为成功。
这些是包含在机器学习算法中的因素,以及考虑的前 4 个交易的值。请注意,start_year 和 start_month 是指用户成为会员的时间。
完成了 25%的训练分割以建立机器学习管道。
有了这个,我就可以实现三种不同的方法了:
- 决策树分类器
- 逻辑回归
- 随机森林分类器
以下是每个型号的相关分数:
随机森林分类器
使用每个模型,我还能够确定哪些解释性因素对要约是否会被完成影响最大:
每个模型给出的结果略有不同,但总体来看,重要的因素包括报价持续时间、用户年龄和奖励金额。不重要的因素包括电子邮件、用户成为会员的时间以及他们的性别。随机森林模型还将社交媒体分布确定为一个重要因素,这一点我之前已经能够直观地识别出来。
结论
通过这个项目,我能够建立一个机器学习模型,并探索数据,以找到一些使要约更有可能成功的关键特征。
对数据集的一些改进将有助于完善我能够做出的预测。例如,如果有位置数据或更长的用户历史数据就好了。具体来说,看看总是点同样几样东西的用户是否会因为优惠而购买新的菜单项目会很有趣。这是该数据集的一个显著缺点,因为它没有具体说明具体购买了什么。
很有兴趣听听大家的想法!你有没有在你的星巴克应用程序(或其他商店的类似程序)上看到过似乎是为你量身定制的优惠?随着越来越多的数据可供用户使用,个性化服务似乎只会越来越频繁。