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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

卡格尔的新手之旅:成功与奋斗的故事

原文:https://towardsdatascience.com/a-novice-journey-in-kaggle-my-ups-and-downs-617bc129b401?source=collection_archive---------23-----------------------

查看一个非技术初学者通常在 Kaggle 中面临的斗争和挑战性经历,以及如何克服它们。

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

帕特里克·霍金斯在 Unsplash 上的照片

简介

并非所有的故事都是关于卡格尔的成功之旅。在这里,我想分享我自己的经历,成功,但主要是在 Kaggle 中的挣扎,希望像我这样的初学者知道挣扎,以及如何用勇气和毅力面对它。就像我相信的那样,

“如果你想跑得快,你可以自己跑。但如果你想跑得远,你需要和其他能支持你的人一起走。”

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

照片由 Unsplash 上的克里斯托弗辊拍摄

我加入了 M5 预测准确性与代数,统计和编程的基本知识。一开始,当知道其他竞争者在这些卡格尔比赛中表现得有多好时,我感到很害怕。但是,我鼓起勇气,努力完成这个项目。我的目的是了解端到端数据科学项目,以及有什么比加入 Kaggle 更好的方法。

一、掌握 Kaggle 特性

当你在竞争中工作时,你将被迫导航并掌握 Kaggle 的功能。以下是我学到的一些东西:

  • 创建笔记本——ka ggle 提供了一个更加灵活的平台,我可以在这个平台上编写代码和撰写工作内容,而无需任何 HTML 知识。就这么简单。
  • 笔记本版本 —每次您做出一些更改时,您所有的工作成果都会被保存,并且您可以查看您所做的所有更改。另外,你有你工作的全部历史,所以如果你想从过去检索一些东西,你可以只点击版本历史。
  • 外部数据可以轻松上传和添加。
  • 数据集和可视化是可下载的
  • RAM 容量大 —比赛中的数据大多文件大小较大;运行和处理它们将需要巨大的 RAM 容量。幸运的是,Kaggle 拥有多达 16 个 RAM,因此可以轻松运行和处理大型数据集。
  • 论坛 —我在论坛上获得了一些关于数据、分析和模型的最佳信息。很多人都在分享他们的见解和想法,并愿意向其他团队伸出援手。

从那以后,我开始适应在 Kaggle 和其他平台如 Google Collab 工作。

二。找到正确的方向很有挑战性

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

乔丹·罗兰Unsplash 上的照片

我所说的正确方向是指对案件的轮廓和我的预期产出有一个清晰的了解。我脑子里有我所有的输出,但是做工作来得到输出对我来说是个挑战。我知道这就像是一篇论文,但后来我意识到,我在解决一个不同的问题。独特的问题需要独特的解决方案。一种解决方案并不适合所有情况。

谢天谢地,我读了 Randy Lao 的 Medium 中的数据科学管道。这个管道对我来说是有用的,我也明白这一点,所以我遵循了它。以下是他的 Medium 帖子的摘录(https://Medium . com/breath-publication/life-of-data-data-science-is-ose Mn-f 453 E1 febc 10)

  1. 获取数据
  2. 擦除或清理数据
  3. 探索数据以识别重要的行为、趋势和见解。
  4. 为预测数据建模。
  5. 解释数据和结果。

三世。不要依赖别人的作品(发明自己)

我开始独立完成这个项目。刚开始还好,但在 EDA、机器学习之类的一些关键部分还是空白。我觉得我错过了什么。老实说,我研究了其他人的作品,以获得一些见解和灵感。这里有硬币的两面:

**好处:**因为 Kaggle 支持协作,所以检查他人的作品,做出一些反馈,并获得一些灵感是可以接受的。你可以获得一些有趣的见解和反馈,对你的项目有所帮助。

**坏消息:**对你在 Kaggle 看到的一切持保留态度。你可能会把自己封闭在他们所做的事情中,而不是发明自己的工作来解决问题。

我在这里的建议是查看论坛,从其他专业人士那里获得一些建议,并做一些研究。看别人的作品对我没有帮助;它只是阻碍了我的创造力。

四。每个问题都是独特的

仅仅因为这个模型或者 EDA 在其他项目中有效,并不意味着它在这里也有效(或者再次使用相同的模型是合适的)。我在 M5 艰难地学会了预测准确性。最初,我根据我在统计学方面的股票知识进行 EDA:相关性、统计汇总和基本图。

我意识到的一个事实是,每个问题都是独特的。我不应该像对待我过去的作品那样对待这个案子。在某个时候,我想不出还有什么可以给 EDA 的,就瘫痪了。

为了克服这一点,我休息了一会儿,并在日记中写下了围绕这个案例的想法(在我的案例中,是 M5 预测准确性的销售)。然后,我列出了所有我能想到的关于零售的问题,以及所有我想到的与之相关的问题。最终,我能够组织我的 EDA 并发现许多对销售数据的有趣见解——比我以前做的更好。

五、信息过载

当我在做 M5 预测时,我碰到了这些模型:ARIMA、零星需求、梯度推进、LightGBM 等。事实证明,理解这些模型背后的数学太难了——我求助于阅读这些模型在金融领域的应用。它使我能够很好地理解这些模型。

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

格伦·卡斯滕斯-彼得斯Unsplash 上拍摄的照片

用复杂的模型构建机器学习并不容易。我在这方面的学习经验是不要给自己过多的信息。我必须专注于我能够理解和构建的模型和解决方案,并将其放在我能够进一步理解的环境中(就我而言,是金融)。

六。有一个导师是一个很大的帮助。

我很幸运有一个伟大的导师和一个在我的旅程中给予支持和建议的社区。

我需要对我不知道的事情的指导和建议,我需要对我的工作的评论和反馈,这样我就知道我需要改进的地方。所有这些,我都是从我的导师那里得到的。老实说,挑战是艰难的,我面临的所有这些障碍可能已经迫使我放弃,但我的导师们推动我去完成挑战——在整个比赛中给予指导和支持。

与专业人士或从业者一起工作让我比独自一人走得更快。

我最大的体会是:如果你想走得快,你可以自己走,但如果你想到达更远的地方,你应该和其他人一起工作。

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

照片由 NeONBRANDUnsplash 上拍摄

最终注释

参加 Kaggle 比赛是一次艰难的旅程,需要耐心、勇气和努力。我了解了自己的优势和劣势,以及我可以进一步改进的地方,并设法从头到尾完成了 Kaggle 项目。即使我在决赛中没有取得好成绩,我也实现了 Kaggle 的目标,如果没有我的导师和社区的支持,我不可能做到这一点。我为此感谢他们,我将利用这次经历去做更多的项目,并在这个领域进一步发展自己。

谢谢你看完我的博文。我希望外面的初学者知道从事数据科学项目是一条艰难的道路。你必须有合适的资源和支持才能生存。从我的旅程中学习,祝你好运!

如果你想看我在 M5 预测准确性方面的工作,这里有链接: M5 预测—准确性® | Kaggle 。请随时给出您的意见和反馈!😃

单字符 MLflow 拉请求

原文:https://towardsdatascience.com/a-one-character-mlflow-pull-request-6d135437702d?source=collection_archive---------32-----------------------

上周,我受命为一个数据科学家团队编写一份关于最佳实践的文档,以协调使用 MLflow 的实验,这是一种跟踪数据科学实验参数和结果的工具。那时,我只使用了 MLflow 一天左右,所以任务主要是阅读文档和依靠我多年来在 Domino 数据实验室的经验,这是一个类似的专有数据科学平台。

我想引用的一个 MLflow 段落有一个小错别字:

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

:-\

不管出于什么原因,这个错别字让我想起了我和同事们的谈话,他们谈到为开源项目做贡献是多么的不容易。我记得我刚出道时的那种感觉。感觉对流行项目唯一“有价值”的贡献是发现革命性的变化,这最好留给“维护项目的专家”。

没有什么比这更偏离事实了。开源项目依靠个人的微小贡献而蓬勃发展,对于一个用心良苦的新人来说,没有什么改变是微不足道的。许多人的小额捐款使项目保持繁荣。欢迎大家参与。我决定使用 MLflow 错别字来演示一个众所周知的项目的量子变化,希望让我的同行更容易理解开源贡献。

变化来得很快,以这样的形式出现:

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

我打开了一个拉请求,礼貌地介绍自己是一个新的贡献者,并询问这种改变是否可以。有人指出,我需要遵循更多涉及提交的方向,我解决了这个问题。第二天,变更被批准并且被提交给 [master](https://github.com/mlflow/mlflow/blob/master/docs/source/tracking.rst#organizing-runs-in-experiments)

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

不要害怕打开一个开源项目的拉请求。和我一起工作过的人,以及我自己,已经对大项目做了局部的改变,并且因为不确定是否会有回报而搁置它们。这个故事的寓意不是搜索阅读材料并开始修复错别字,而是尝试将你在当地的贡献提交回master。您可能必须修正一个测试或者符合注释约定,但是这个迭代过程是一个重要的开发人员体验的一部分,并且会使您成为一个更强的技术贡献者。

MLflow 把我一个字的改动合并成了一个自述。你提交给你最喜欢的项目的任何更实质性的改变都有很大的机会被合并,并有希望成为你未来更多贡献的开始。

瑞安·迪夫 是 Corvus 保险公司的数据科学家。他还是一名物理学家、Linux 黑客和一名糟糕的咖啡师。

制作完美数据科学简历的一站式商店

原文:https://towardsdatascience.com/a-one-stop-shop-for-crafting-your-perfect-data-science-resume-3532a45f54f5?source=collection_archive---------22-----------------------

建立坚如磐石的投资组合所需要知道的

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

克里斯蒂娜·戈塔迪的图片(来源:Unsplash——感谢克里斯蒂娜!❤)

在过去的几年里,当我申请研究生院和 IT &数据科学工作时,我有好几份简历。看着我的简历从一堆不连贯的、随意散布的要点演变成一份写得很好的文件,让我获得了多个工作机会,这很有趣,也很有启发。

在这篇文章中,我将谈论一份写得合适的数据科学求职简历应该是什么样子,雇主喜欢(和不喜欢)简历上的什么,以及如何增加你获得梦想中的工作机会。我还附上了一份清单,你可以在点击提交申请按钮之前查看一下。

注意:这一建议适用于希望获得第一份全职工作的应届毕业生、希望获得实习机会的学生,或者职业生涯早期的申请者(毕业后有 2-3 年工作经验)。此外,观点可能会有所不同——如果您有任何可能对您有用的其他建议,我很乐意听到您的反馈:)

概述

我能给那些想改善简历的人的最好的一句话建议是:

保持简单,但信息量大!

这正是我的意思——你的简历不应该太长(不超过 1 页),也不应该太模糊,也不应该太详细。写一篇过于详细的文章和一张没有多少内容的空白纸之间有一个甜蜜点。

概括地说,你应该在简历中包括的部分有:

  • 专业(工作)经验(必选,第一)
  • 教育(必修,第二)
  • 奖项/出版物/会议讲座(可选,如有)
  • 项目(关于何时包含此项目,请参见下一节)
  • 技术技能(必填)

让我们一个一个地深入了解它们!

专业经验

职业经历(或工作经历)部分是简历中最相关的部分,它应该出现在文档的最顶端(在你的名字、LinkedIn 个人资料链接、电话号码、电子邮件地址之后)。

  • 注意标题格式。首先是职位,然后是公司名称,然后是括号中的月份/年份,例如数据科学家,Flyber(2016 年 9 月—2018 年 8 月)。如果你为一家被收购的初创公司工作,建议同时提及两家公司,例如 Flyber(被 MegaFlyber 收购)
  • 在这个标题的正下方,加上你工作的城市/州/国家(如果是一个偏远的位置,只需加上你居住的地点)。
  • 列出几个要点(最多 5-6 个)来概括你的成就。这些成绩应该是可操作的。例如,比较两者:“使用 scikit-learn 建立了一个预测和防止流失的逻辑回归模型。“vs .”研究、设计并开发了一种逻辑回归算法,该算法预测客户流失的准确率高达 85%,从而避免了每年 900 万美元的收入损失。
  • 请注意,第二行更具可操作性,即它清楚地显示了项目影响。此外,技术方法( scikit-learn )甚至没有在第二行中提到,而在第一句的开头就提到了。重点不是展示你知道scikit-learn——每个人都可以复制粘贴最先进的代码,但重要的是对业务、客户或员工的影响。因此,避免以“使用 Python/R/SQL to …”开头的句子,而是提供可操作的语句。面试官更关心业务影响,而不是技术方法。
  • 注: 影响可以用不同的方式衡量,不一定与收入挂钩。相反,它可以用客户体验(例如,2021 年正面评价数量增加 50%)、为员工或整个团队节约的(例如,每月 1000 小时)、内部流程改进(例如,与相邻团队更有效的沟通)等来表示。
  • 如果你需要帮助衡量影响,请你信任的人帮助你写这一部分。第二双眼睛有助于提升你的成就。
  • 使用一致的时态。我的推荐是不用提及人称代词的使用过去式,如进行常规 A/B 测试达到 XYZ;排查报告数据库中的数据异常等。
  • 总是按时间倒序列出你的工作经历。

教育

教育部分应该总是在职业经历之后。这一部分应该简短,比第一部分短得多。

  • 一般的指导原则是提及大学名称,然后是你获得的学位,然后是年份(不包括月份),例如:维尼拉大学,应用统计学硕士(2014–2016)。
  • 我强烈建议用一个要点(不要超过这个)来概述你参加的一些课程、你从事的一个研究项目或你写的一篇论文,例如完成了时间序列分析、数据挖掘和中级 Python 的课程,并进行了一个研究项目:{project_name + impact}。
  • 避免提及 MOOCs 和训练营。相信我,雇主并不在乎他们。唯一的例外是,如果你是一个职业转换者,你想强调你投入精力学习编程语言或数学/统计。
  • 一个常见的问题是是否要提及你的 GPA 。这取决于你。如果低,肯定不做。如果它相当高,那就去做你喜欢的事情,但是注意雇主越来越不关心它,而他们更关心有形的经验,比如实习和可操作的结果。GPA 低或不太知名的学校的申请人仍然可以同样成功,不应该灰心丧气。只要确保你用有见地的信息来强化你的简历。

技术

一个常见的技术简历错误是列出一系列你非常熟悉的技术技能,有些熟悉,并且用过一两次。避免这个。只列出你擅长使用的技能,并回答关于这些技能的面试问题。

一个不好的例子:

  • Python,R,SQL,NoSQL,Java,JavaScript,C++,C#,Visual Basic,Matlab,Octave,git,Hadoop,node.js,Tableau,Linux,Golang。

这种方法不会让你看起来很聪明,所以不要这样做。想一想——很难解释这种混乱,面试官不会真正知道你真正知道/不知道什么。

相反,一个更好的例子应该是:

  • Python ( pandas,numpy,scikit-learn,seaborn )
  • R ( dplyr,ggplot )
  • 一种数据库系统
  • (舞台上由人扮的)静态画面
  • 熟练使用基本的 git 命令

这告诉面试官你熟悉最相关的 Python 库(这对大多数 DS 工作来说很重要),你也知道一些 R / SQL / Tableau,并且你可以使用 git 。你甚至可以更进一步,针对每个要点,提及一个你应用了这些技能的项目(如果你在网上,添加链接将是一个很好的奖励)。

此外,技术技能应该放在简历的最后。为什么?因为数据科学家应该强调整体影响,而不是工具。工具只是达到目的的手段,目的才是最终的影响。出于这个原因,技术技能当然是相关的,但不应该过分强调(参见上面的职业经历部分,了解我对提及技术技能的想法)。

其他相关章节

如果您碰巧有以下任何一种情况:

  • 会议会谈
  • 研究论文和出版物
  • 奖项(竞赛、俱乐部等)

—在简历中提到它们也无妨。他们会很好地强化你的简历,让你从其他申请者中脱颖而出。如果你没有以上任何一项,那完全没问题,你不必担心。不是所有人都有时间和资源超越我们的教育和工作。但是如果你确实有这些,那就把它们包括进来。也要准备好谈论它们,因为你可能会被问到关于细节的问题。

但是我那些很棒的副业呢?

许多申请人都在考虑是否应该在简历中加入他们的个人项目。这是一个完全合理的问题,我会给出我的 2 美分。

如果你是一名职业转换者或正在寻找第一次或第二次实习的学生,强烈建议提及一两个你真正引以为豪的兼职项目。避开常见的项目,如使用 MNIST 数据集的数字识别、泰坦尼克号生存预测等。这会让你看起来没有创意。努力脱颖而出。想出一些更独特的东西,比如:

  • 收集自己的数据集,例如抓取网站或将多个大型数据源合并在一起——没有多少人会这么做,展示良好的数据清理&管理技能看起来棒极了。
  • 解决(或试图解决)一个更具挑战性的 Kaggle 问题,需要超越应用最先进的 ML 算法。
  • **指标& KPI 设计。**这是一个经常被低估的数据科学领域。人们经常谈论#ML、#AI、#transformers,但设计良好的指标和重要的 KPI 是一个功能良好的厨房的首要任务。例如,您可以包含一个链接,该链接指向您构建的仪表板,在该仪表板中您实现了自己设计的指标。
  • 包括一个到你的投资组合网站Github 简介的链接。列出项目而不引用源代码不是很有效。雇主喜欢从视觉上消化你的工作,拥有一个作品集也是缺乏相关工作经验的一个很好的代理(就我而言,尽管我缺乏行业工作经验,但在职业生涯早期拥有一个作品集帮助我获得了多个职位——我的面试官告诉我他们真的很喜欢我的博客)。建立一个强大的在线形象会让你从其他候选人中脱颖而出。

如果你有点经验丰富(例如,几个实习或一些全职经验),那么如果你开始列出你的项目,你可能会用尽空间。为了避免这一点,根本就不要提到项目。如果有一些空间,只选择 1 或 2 个你真正感到自豪的(并确保包括相关链接并提及影响)。

清单(点击提交前检查这些!)

  • 没有拼写/语法错误。三重检查。
  • 没有断开的链接。三重检查。
  • 一个专业的电子邮件地址(避免使用化名,如star_wars_fan@gmail.com)。如果你的名字很普通,在别名后面加一两个数字就可以了。
  • 没有照片或个人家庭住址。
  • 量化的结果和成就。避免含糊地陈述成就,而不注重效果。详见职业经历
  • 工作经历应包括服务的月份/年份。对于教育,提及年份就足够了。
  • 技术技能不应该看起来像一个洗衣单。提及你熟悉的库/包/环境,而不仅仅是 PythonSQL 。避免列举太多的技术技能。详见技术技能
  • 时态的一致性(例如,总是用过去式写)。
  • 最多 1 页。
  • 为标题加粗,使简历更具可读性。
  • 最重要的是: 保持简洁且信息量大! 设身处地为读者着想,试着看看自己写的东西是否清晰有见地。向某人寻求反馈。

奖励— 如果你想要一份免费的简历模板,请给我发电子邮件(dinajankovic93@gmail.com)来领取你可以编辑和使用的免费模板!

写一份好的简历需要时间、努力和毅力。随着时间的推移,你的简历会不断发展,最终会比以前获得更多的线索,这是完全可以预料的。毕竟享受有趣的学习体验!看着一份你 5 年前用过的、可能再也不会用的简历,会有一些美好的乐趣:)

如果你喜欢这篇文章,并想在新文章出现时得到通知,你可以在这里关注我。如果你想在 LinkedIn 上联系,请随时联系!

数据采样方法管窥

原文:https://towardsdatascience.com/a-peek-at-data-sampling-methods-5d7199c8aab8?source=collection_archive---------20-----------------------

确保你从数据中得出有效的结论

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

国家癌症研究所Unsplash 上拍摄的照片

抽样偏差是现实世界中最常见的偏差类型之一。当用于训练模型的数据不能反映模型在生产时将接收的样本的分布时,就会出现这种情况。

[## 处理数据项目中不同类型的偏差

towardsdatascience.com](/tackling-different-types-of-bias-in-data-projects-29e326660639)

一般来说,每当我们从事机器学习项目时,对将在生产环境中观察到的数据中各种属性的真实比例进行正确的研究是至关重要的。

此外,当我们实际处理一个问题并且数据集非常大时,处理整个数据集通常是不实际的,也没有必要,除非您希望在处理转换和特征工程发生时等待数小时。

一个更有效的策略是,从你的数据中抽取一个足够有用的样本来学习有价值的见解,这个策略仍然允许你从你的结果中得出有效的结论。这种技术被称为数据采样

什么是数据采样?

我们将来自较大人群的观察结果子集称为样本然而,取样是指我们的研究将从中收集数据的观察组。因此,数据采样可以定义为从业者用来选择代表较大总体的观察值子集的技术。

通常,与数据打交道的人(即数据科学家、数据分析师等。)使用数据采样技术将大型数据集减少到更小、更易管理的数据量,而不牺牲其洞察力的准确性。

有两种主要的数据采样策略:

  • 概率抽样涉及随机选择。数据中的所有观察值都有机会被选择,因此可以对整个群体进行强有力的统计推断。
  • 非概率抽样不涉及随机选择。相反,它是基于方便或其他标准。因此,无论构建了多少个样本,一些观察值都没有机会被选中。

非概率抽样方法的一个主要缺陷是它们包括非代表性的样本,并且重要的观察值可能被排除在样本之外。因此,通常建议首先考虑概率抽样方法,这也是我在本文剩余部分只关注这种抽样方法的原因。

概率抽样方法

如前所述,我们通常在因为数据太大以及其他原因(如时间、成本等)而无法研究整个人群的情况下利用数据采样方法。).

在这个演示中,我们将使用我用 Python 创建的合成数据——参见下面的代码。

import numpy as np
import pandas as pd# create synthetic data
id = np.arange(0, 10).tolist()
distance = np.round(np.random.normal(loc=100, scale =5, size=len(id)), 2)# convert to pandas dataframe
data = {"id":id, "distance": distance}
df = pd.DataFrame(data=data)df

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

作者图片

简单随机抽样

最直接的数据采样方法是简单的随机采样。本质上,子集是由从一个更大的集合中完全随机选择的观察值构成的;每个观察值都有相同的机会从较大的集合中被选中。

# simple sampling example
simple_random_sample = df.sample(n=5, random_state=24)
simple_random_sample

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

作者图片

简单随机抽样极其简单,易于实现。另一方面,我们仍有可能在样本数据中引入偏差。例如,考虑一个事件,其中我们有一个带有不平衡标签的大型数据集。通过执行简单的随机抽样,我们可能会意外地无法捕捉到足够多的样本来代表少数群体——如果我们能捕捉到任何一个的话。

间隔抽样

间隔抽样是一种技术,它通过定期从较大的集合中选择观测值来创建子集。例如,我们可以决定从更大的集合中选择每 31 个观察值。

# interval sampling example
idx = np.arange(0, len(df), step=2)
interval_sample = df.iloc[idx]
interval_sample

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

作者图片

如果观察值是随机的,那么间隔抽样通常会比简单的随机抽样返回更好的样本。然而,如果在我们的数据中有周期性或重复的模式,那么间隔抽样是非常不合适的。

分层抽样

分层随机抽样将较大的数据集分成称为分层的组。从这些组中,我们随机选择我们想要创建新子集的观察值。从每个阶层中选择的例子的数量与阶层的大小成比例。

from sklearn.model_selection import StratifiedKFold# dividing the data into groups
df["strata"] = np.repeat([1, 2], len(df)/2).tolist()# instantiating stratified sampling
stratified = StratifiedKFold(n_splits=2)1q
for x, y in stratified.split(df, df["strata"]):
    stratified_random_sample = df.iloc[x]stratified_random_sample

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

作者图片

这种抽样策略倾向于通过减少我们引入的偏倚来提高样本的代表性;在最坏的情况下,我们得到的样本质量不会比简单的随机抽样差。另一方面,定义地层可能是一项困难的任务,因为它需要对数据的属性有很好的了解。这也是目前最慢的方法。

巢式抽样法

当我们不知道如何定义数据的层次时,整群随机抽样是一个很好的选择。在决定了我们希望我们的数据具有的聚类数之后,我们将较大的集合分成这些较小的聚类,然后从它们当中随机选择以形成一个样本。

# cluster sampling example# removing the strata
df.drop("strata", axis=1, inplace=True)# Divide the units into 5 clusters of equal size
df['cluster_id'] = np.repeat([range(1,6)], len(df)/5)# Append the indexes from the clusters that meet the criteria
idx = []# add all observations with an even cluster_id to idx
for i in range(0, len(df)):
    if df['cluster_id'].iloc[i] % 2 == 0:
        idx.append(i)cluster_random_sample = df.iloc[idx]
cluster_random_sample

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

作者图片

整群抽样比其他概率抽样方法更节省时间和成本。但是,很难确保您的分类代表更大的集合,因此,与简单随机抽样等其他方法相比,它通常提供的统计确定性更低。

最后一个音符

在处理大型数据集时,数据采样是一种有效的技术。通过利用数据采样技术,我们可以对较大集合中较小的、更容易管理的子集进行采样,以执行我们的分析和建模,同时确保我们仍然可以从该子集得出有效的结论。在本文中,我们讨论了执行数据采样的两种主要方法,为什么从概率采样技术开始可能更好,并在 python 中实现了 4 种概率采样技术。

感谢您的阅读!

如果你喜欢这篇文章,请通过订阅我的**每周简讯与我联系。不要错过我写的关于人工智能、数据科学和自由职业的帖子。**

相关文章

** </7-common-gotchas-of-data-projects-62e8646552f2> [## 数据项目的 7 个常见问题

towardsdatascience.com](/7-common-gotchas-of-data-projects-62e8646552f2) **

粉红税探索性数据分析

原文:https://towardsdatascience.com/a-pink-tax-exploratory-data-analysis-94642f83d4c5?source=collection_archive---------16-----------------------

亚马逊上男女产品的购物比较

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

罗谢尔·布朗在 Unsplash 上的照片

为了纪念女性历史月,我想做一个与性别平等相关的探索性数据分析(EDA)项目。随着美国同工同酬日的到来,我立刻想到了粉红税。毕竟,没有什么比得到的报酬更少,而你的钱却花不完更让人愤怒的了,仅仅是因为你是一个女人。

什么是粉红税?

粉红税是销售给女性的产品比销售给男性的同等产品更贵的趋势。你有没有注意到粉红色的剃须刀要多花几分钱?还是说女性的除臭剂和男性的价格一样但是容器里的产品少?这是粉红税在起作用!如果你想更深入地了解粉红税,在维基百科上有自己的词条,这是一个很好的起点,在撰写本文时有 27 个参考文献。

根据《Bankrate.com》今年发表的一篇文章,以下是一些关于粉红税的最新事实:

  • 粉红税每年花费女性 1351 美元。
  • 粉红税从出生时就开始征收,因为除了颜色/营销之外,即使是同等的玩具,对女孩来说平均成本也更高。
  • 衣服、个人护理产品和服务都要缴纳粉红税。
  • 总的来说,女性为类似商品和服务支付的价格比男性平均高出 7%。

实验

我想亲眼看看在亚马逊上男性和女性商品的购物体验会有什么不同。女性是否面临着平均比男性更贵的产品选择?我开始为自己的小实验创建一些参数。

我决定把它限制在一套服装的范围内:t 恤、牛仔裤、袜子、内衣和运动鞋。这个想法是,一个男人和一个女人在亚马逊上买一整套衣服平均要花多少钱?我想强调的是,这并不是试图找到男女平等的产品,并对它们进行直接比较。相反,它是关于所呈现的整体购物选择。如果女性产品普遍更贵,那么从逻辑上来说,当男性和女性搜索相同的商品时,亚马逊上出现的产品对女性来说平均更贵。我选择亚马逊是因为它是一个非常受欢迎的购物网站,有很多产品。

我用添加了“男士”或“女士”的相同搜索词搜索每一件商品。以下是我做的搜索:

  • “男士纯白 t 恤”和“女士纯白 t 恤”
  • “男士粗斜纹棉布牛仔裤”和“女士粗斜纹棉布牛仔裤”
  • “男士内衣”和“女士内衣”
  • “男式水手袜”和“女式水手袜”
  • “男士帆布鞋”和“女士帆布鞋”

我注销了我的亚马逊账户,在一个隐姓埋名的 Chrome 窗口中进行了所有这些搜索,希望不会受到我的购买或搜索历史的影响。但我猜在这个数字世界里,没有人能保证我所说的搜索是完全公正的。

我记下了每次搜索的前 25 个项目的价格,包括男性和女性(每个项目 50 英镑)。我想这大概是人们在做出购买决定前合理浏览的商品数量。我跳过了任何特殊的赞助或促销产品,主要是因为这造成了混乱的重复,因为这些产品仍然出现在列表的某个地方(在所有情况下,“赞助”只是将一个项目推到了列表的顶部,但它仍然出现在前 25 名中),我想要 25 个独特的产品。

我还注意保持单位的一致性。例如,袜子、t 恤和内衣往往是成包的。我将所有价格计算为单位成本(一件 t 恤、一条内裤和一双袜子)。我还擅自跳过了我认为不适合搜索的任何产品。例如,当我搜索牛仔布牛仔裤时,会出现一些看起来像牛仔布的打底裤的搜索结果。由于打底裤和粗斜纹棉布牛仔裤是完全不同的产品,我干脆跳过了它们。

结果呢

我使用 Tableau Public 创建了本文中的可视化效果。你可以在我的 Tableau 公众号上找到这些。首先,让我们来看看不分性别的各类商品的平均价格。

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

作者图片

平均来说,运动鞋是最贵的,一双袜子是最便宜的。我承认,我完全预料到这条牛仔裤会是最贵的。也许这是个人偏见,觉得找到一条真正合身的牛仔裤有多难。

让我们来看看按性别细分的物品平均价格。

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

作者图片

我们可以看到,就帆布鞋和内衣而言,男性产品的平均价格高于女性。男式帆布鞋的平均价格为 3.61 美元,比女式帆布鞋贵 8.6%。男士内衣比女士内衣贵 1.49 美元或 44%。

其他产品对女性来说比男性更贵。女式牛仔裤平均比男式牛仔裤贵 5.24 美元,涨幅为 15%。女性白色 t 恤的平均价格是男性的两倍多,增长了 112%。虽然袜子的实际成本差异最小,但普通女袜的价格仍然高出近 26%。

有趣的是,在这一点上出现的假设可能解释与粉红税无关的价格差异。如果材料的数量是价格差异的原因,我们预计女性产品在大多数情况下肯定会比男性产品便宜。那肯定不能解释我们在这里看到的牛仔裤、衬衫或袜子。也许有些差异可能与捆绑销售产品有关。比如,如果男士衬衫和袜子有更多的散装货,单位价格会更便宜(这是我在收集数据时特别注意到的而不是)。

好了,现在让我们进入实验的真正问题。对于一个男人和一个女人来说,买一套完整的衣服平均要花多少钱?

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

作者图片

女性购买所有商品的平均成本为 97.84 美元,比男性的总成本高出 6.23 美元和 6.8%。总平均增幅为 6.8%,这与粉红色税导致女性为产品和服务平均多支付约 7%的估计相符。我认为很有趣的是,我们的最终数字会如此接近真实的平均值,即使这可能完全是由于偶然。

结论

虽然这个 EDA 实验并不意味着是完美的、结论性的,或提出任何真正可行的建议,但采取一种实际操作的方法来比较男女产品价格是很有趣的。像任何好的探索性数据分析一样,这带来的问题比它回答的问题更多:

  • 这种差异实际上是显著的还是随机的?如果我们将样本数量从 25 个增加到 100 个或 1000 个,会发生什么?
  • 这种差异有多少是由于亚马逊算法造成的?在不同的日子结果会不同吗?
  • 如果我们在其他受欢迎的零售网站如沃尔玛或塔吉特百货重复这个实验,我们会发现类似的结果吗?
  • 如果我们看不同类型的物品,如个人护理品(肥皂、洗发水等),价格会有差异吗?)或娱乐项目(自行车、运动器材等。)?
  • 比较理发、按摩或汽车维修等各种服务的成本的好方法是什么?
  • 专注于比较更精确的产品等价物的实验会是什么样的?

如果你们中的任何人进行自己的实验来回答这些问题,我希望你能分享!只有通过解决粉红税,我们才能开始解决它,让每个人都能买得起产品。

在你走之前

美国女性同工同酬日是 2021 年 3 月 24 日,这一天女性最终与男性的收入持平。目前,女性的平均工资是男性的 0.82 美元。

让我们不要忘记美国其他的同酬日:

  • 亚裔美国人和太平洋岛民女性——2021 年 3 月 9 日
  • 母亲——2021 年 6 月 4 日
  • 黑人女性——2021 年 8 月 3 日
  • 美国土著妇女——2021 年 9 月 8 日
  • 拉丁女性——2021 年 10 月 21 日

请访问aauw.org了解更多信息。AAUW 网站是可以找到同酬信息的地方。

一个强大、简单、有趣的 python 分析器

原文:https://towardsdatascience.com/a-powerful-easy-and-enjoyable-python-profiler-12b792bc91d6?source=collection_archive---------12-----------------------

使用 VizTracer 和 Perfetto 轻松浏览代码执行时间表

在为训练模型处理数据或试图提高推理速度时,我经常面临需要修复的缓慢代码。我尝试了大多数 python 分析器,我真的很喜欢 VizTracer ,因为它非常容易使用,而且非常强大,因为你可以在代码执行时间线上放大和缩小。

要使用它,您只需导入一个“追踪器”并使用启动、停止和保存方法,如下所示:

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

它将保存一个包含代码执行时间线的 profile.json 文件。然后,您必须运行该命令(安装 viztracer 时会安装 vizviewer)

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

使用 AWSD 键可以在代码执行时间线中进行缩放/导航,这非常简单快捷。你也可以用鼠标。下面的视频展示了如何浏览我们创建的 profile.json 的示例。它由 Perfetto (由谷歌制造)提供支持,经过优化,甚至可以处理巨大的跟踪文件(多个 GB)。

我用 W 放大,用 S 缩小,用 A/D 向左/右移动,你可以看到主函数(outer_function)在顶部,然后是它正下方的 inner_function,然后是 time.sleep 调用。通过点击这些矩形中的一个,你可以看到关于这个函数调用的更多细节(持续时间,开始/结束时间,等等。).

通过单击并按住,您可以选择代码执行时间线的一部分并获得摘要。你将得到最长的函数,它被调用了多少次,等等。

跟踪变量

您还可以使用 VizCounter 类跟踪变量(假设您正在调试)。例如,我们将投掷一枚硬币,并使用以下代码跟踪正面、反面的数量以及正面的比例:

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

它通过“vizviewer profile2.json”命令生成:

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

我只展示了 VizTracer 的一小部分特性。你可以跟踪变量,分析多重处理/多线程程序,函数的入口,等等。更多信息见 VizTracer 。作者也在中等https://gaogaotiantian.medium.com/

自动驾驶汽车数据融合的实用探索

原文:https://towardsdatascience.com/a-practical-dive-into-data-fusion-for-self-driving-cars-7af71949133d?source=collection_archive---------33-----------------------

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

Unsplash更聪明地生活的照片

什么是数据融合?

数据融合 ,在抽象的意义上,指的是以 智能高效 的方式组合不同来源的信息,使得系统处理数据的性能优于只给出单一数据源的情况。

在本文中,我们将讨论数据融合如何以及为什么用于各种智能应用,特别是自动驾驶汽车。然后,我们将深入到一个关于自动驾驶汽车的 【稀疏】 数据融合的具体案例研究中,看看数据融合是如何在行动中使用的。

**数据融合的高级思想:**如果我有两个或更多的数据源,并且每个数据源都提供了 新奇预测性 信息来帮助我为我的智能系统做出更好的预测或控制决策,那么我就可以组合这些数据源来提高我的系统的性能。

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

数据融合背后的主要思想:结合不同的数据源,做出更明智的预测或决策。图片来源:作者。

请注意,我们并不局限于仅组合两种类型的数据源:通常,我们可以跨任何不同的数据源执行数据融合,只要它们是相互引用/校准的。

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

数据融合可以概括为组合 N 个不同的数据源,只要这些数据源中的每一个都相互参照/校准。

数据融合可以用在哪些学科?

当然这不是一个详尽的列表,但数据融合在以下领域得到了应用:

  1. 信号处理(匹配滤波、卡尔曼滤波、状态空间控制)。
  2. 机器人(感知,视觉-惯性里程计(VIO),光束调整[1])。
  3. 机器学习(语义分割、对象检测和分类、嵌入)。

更一般地说,数据融合可以用于我们使用数据进行预测或决策的任何领域。

使用数据融合的示例领域有哪些?

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

阿兰·范在 Unsplash 上的照片

同样,这个列表并不详尽,但希望能描绘出数据融合的可能性图景:

  1. 无人驾驶汽车(下文将详细讨论!)
  2. 遥感:不同形式的传感器数据,如 RGB激光雷达可以融合在一起,用于自动陆地勘测等任务。
  3. 机器人操纵:基于视觉的数据,如 RGB立体,可以与来自操纵器和致动器的里程计*数据融合,以提高机器人操纵任务的性能。*

我们如何在智能应用中有效利用数据融合?

一些形式的数据融合可能比其他更有效。当使用数据融合作为任何利用数据做出 预测决策 的智能系统的一部分时,需要考虑一些事项:

  1. 数据融合有哪些步骤可以进行 在线离线 可以执行哪些步骤?数据融合会导致显著的推理延迟吗?如果会,那么性能上的 X 因子改进值得这种额外的延迟吗?
  2. 多少在线计算能力(CPU,GPU 等。)我的数据融合管道的预处理后处理需要吗?
  3. 多少额外的计算能力(CPU、GPU 等)。)来使用来自我的数据融合管道的数据执行推理
  4. 需要多少额外的内存 (RAM)来处理和存储来自我的数据融合管道的数据?
  5. 如果我使用传感器进行数据融合(例如 RGB 摄像机、立体摄像机、激光雷达传感器、惯性测量单元(IMU)等)。),我的传感器之间是否需要任何额外的校准
  6. 我的数据集有多*?给定其他数据集,预测一个数据集有多难,反之亦然?这越困难,你就能从融合这些不同来源的数据中提取越多的信息。***

这些问题可以帮助您权衡不同数据融合方法的利弊,并允许您设计数据融合设置以实现最佳系统性能。

自动驾驶汽车的数据融合

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

自动驾驶汽车数据融合的例子: RGB 像素激光雷达点云的融合。图片来源:[2]。**

现在我们已经介绍了数据融合,让我们考虑如何将其应用到自动驾驶汽车领域。

数据融合是自主车辆和机器人的感知、目标检测、语义分割和控制中至关重要的子程序。这些和其他需要智能的任务依赖于以有意义的方式组合数据源,使自动驾驶汽车能够尽快做出明智的预测和决策。

自动驾驶汽车的数据融合使用了哪些类型的数据源?

自动驾驶汽车的一些数据源包括:

  1. ****RGB 像素:这些是来自安装在无人驾驶汽车上的摄像头的红色、绿色和蓝色像素强度。
  2. ****立体点云:这些点云使用立体深度相机表示物体在空间中的(x,y,z)位置。这些点是通过使用一对立体摄像机估计点的深度来找到的。
  3. ****激光雷达点云:类似地,这些点云使用激光雷达传感器表示物体在空间中的(x,y,z)位置。通过计算从激光雷达激光扫描返回到激光雷达传感器的返回时间来找到这些点。
  4. ****里程计:里程计数据通常由惯性测量单元和/或加速度计产生。该数据包含汽车的运动学和动力学信息,如速度、加速度和 GPS 坐标。

这些数据源是如何组合的?

关于如何将上述数据源用于基于数据融合的自动驾驶汽车应用的一些示例包括:

  1. 里程计数据与点云数据进行定位*。***
  2. RGB 数据与里程计数据用于解决光束调整问题【1】。**
  3. RGB点云数据创建一个 2D 密集图像带有四个通道 (R,G,B,D)——这通常被称为数字表面模型(DSM)。诸如对象检测和分类以及语义分割的任务可以利用这个 DSM。**
  4. RGB点云数据创建一个 3D 稀疏点云其中每个点都有 (x,y,z,R,G,B) 数据。诸如对象检测和分类以及语义分割的任务可以利用这种具有 RGB 特征的点云。

现在,我们已经介绍了一些自动驾驶汽车数据融合的数据源和应用的示例,让我们更深入地研究自动驾驶汽车数据融合的案例:用于语义分割激光雷达点云RGB 像素之间的稀疏数据融合。**

案例研究:稀疏数据融合

GitHub 库

在本案例研究中,我们没有将 RGB深度信息融合到具有多个通道的密集 2D 阵列中,而是采用相反的方法,用来自相应的共同参考的 2D 像素的 RGB 值来扩充与深度信息相对应的现有点云*。***

下图说明了这个稀疏数据融合过程。**

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

****稀疏数据融合:通过将点云返回的 (x,y,z) 坐标与对应的 (R,G,B) 空间同一共参照位置的信息串联起来,将 3D 点云数据与 2D RGB 图像数据进行融合。

为什么稀疏融合?

**对于每个智能系统来说,一个至关重要的问题是:为什么这很重要?一些提议的理由:

  1. 因为我们现在对一个 稀疏的 、3D 点云执行推断,而不是对一个 密集的 、2D 图像执行推断,所以我们不必对密集的、计算密集型的输入进行预测。虽然 GPU 和其他硬件加速技术已经能够显著加速图像上的密集卷积运算,但在大型图像上实时执行语义分割推理仍然是一个需要解决的重要问题。
  2. ***在 ***【密集融合】中,当我们将我们的点云(3D 点的点集)转换成深度图像(有时称为数字表面模型(DSM))时,我们固有地 丢失了关于这些激光雷达点云的精确 3D 结构的信息 。执行“ 【稀疏融合】 通过保留我们的数据的基于点的表示来保留这种精确的 3D 结构和信息。

请注意,我们承认这种“稀疏融合”方法的一个缺点是,我们没有利用所有的 RGB 像素。

问题陈述

有了要执行的融合任务类型的一些背景信息,我们现在准备正式定义我们的基于数据融合的语义分割任务。数学上:

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

这里, N 指我们点云中的点数, D 指每个点的维数;在这种情况下, D = 6 (3 代表 x,y,z ,3 代表 R,G,B)。

概略地,这个基于数据融合的语义分割问题可以被可视化为:

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

这是基于自动驾驶数据融合的语义分段应用程序的数据融合管道的高级概述。

现在我们已经设置了数据融合问题,让我们介绍一下我们将在案例研究中使用的自动驾驶数据集。

奥迪自动驾驶数据集(A2D2)

为了测试这种数据融合方法,我们利用了奥迪自动驾驶数据集(A2D2) [2]。该数据集通过安装在作者汽车上的 校准的 深度和光学传感器,捕捉 RGB 像素和点云返回之间的直接映射。

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

来自 A2D2 数据集的示例样本。左:激光雷达场景的点云表示。中间:场景的 RGB 图像表示。右:场景的语义标签表示——注意,不同的颜色表示场景中物体的不同地面真实类别,例如车辆、道路、树木或交通信号。图像源[2]。

更重要的是,我们利用这个数据集,因为由于[2]作者的校准工作,像素和点云返回之间存在直接映射 T32。值得注意的是,我们执行数据融合的能力取决于这种校准。

执行数据融合

这种直接映射允许我们将点云返回与 RGB 特征连接起来,使得每个点云点不再仅仅表示为 p = (x,y,z) ,而是表示为 p = (x,y,z,R,G,B) ,其中 R,G,B 值取自与给定激光雷达点共同参考的像素。

为了执行这个数据融合操作,我们在 Python torch中定义了一个自定义的DataLoader 类,当使用__get_item__方法从数据集中检索项目时,该类连接了(x, y, z)(R, G, B)特征。为了简洁起见,下面只提供了构造函数和采样方法,但是你可以在附录中找到完整的类,也可以在链接的 GitHub 库中找到:

你可以通过他们的校准文件在这里阅读更多关于 A2D2 的创造者是如何制作这张地图的。

学习架构:PointNet++

为了学习这个语义分割问题所需要的映射 f ,我们将使用 PointNet++ ,一个基于点集的深度卷积神经网络。然而,该网络不是在对应于 密集空间图像 的矩阵和张量上执行卷积,而是在点云的 点集空间 中执行高维点集卷积。****

下面,提供了[3]中提出的 PointNet++的架构。由于我们的任务集中于语义分割,我们将利用这种神经网络架构的基于分割的变体。

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

PointNet++架构。这种架构通过使用一组分层的点集卷积层改进了原始的点网架构[3]。图片来源:[3]。

稀疏数据融合在 PointNet++中的应用

对于这个数据融合任务,我们在每个点组合我们的空间 (x,y,z) 特征和我们的 (R,G,B) 特征,并使用这些连接的特征作为 PointNet++网络的输入。请注意, (R,G,B) 特征不以空间方式处理,即我们不计算像素值之间的“空间”相关性。

我们基于数据融合的语义分割系统如下图所示:

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

数据融合和语义分割管道,用于我们对自动驾驶汽车的稀疏数据融合案例研究。

为了训练网络,数据转换是离线执行的,以减少在线计算时间。然而,对于实时语义分割设置,该稀疏数据融合预处理步骤将需要实时或接近实时地执行。

实验设置和评估

为了测试该框架的有效性,我们评估了网络对每个激光雷达点云返回的语义标签进行正确分类的能力。具体而言,我们使用语义分割度量来测量该系统的分割性能,例如平均交集超过并集(mIoU)准确度度量,下面针对一系列点来定义,我们为这些点预测语义类别,并且我们为这些点定义了*不同的类别:*******

c : 的并集上的交集(IOU)

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

所有类的并的平均交集(mIOU):

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

所有类别的精确度:

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

我们评估了这种稀疏数据融合方法,用于:

  1. ****两个语义类:分割道路与非道路特征。
  2. ****六类:这包括按频率排列的“其他”、“道路”、“车辆”、“行人”、“道路/街道标志”、“车道”。请注意,“其他”的真正类别不是“其他”,它是我们在这个实验中聚合到单个“其他”类别中的其他类别之一。
  3. 55 个类:这将我们的语义分割问题扩展到一组更加多样化的语义类。

作为参考,下面提供了六类语义分割问题中每个主要类的相对比例:

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

“六类”语义分割问题中六个最常见类的类频率。图片来源:作者。

结果

下表给出了我们应用 PointNet++方法和稀疏数据融合技术的结果。请注意,随着我们减少地面等级的数量,我们的精确度和 mIoU 指标开始显著增加。

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

精确度和交集(IoU)指标的结果表。请注意以下缩写:wNLL:加权交叉熵,TL:迁移学习(增量迁移学习)。图片来源:作者。

局限性和未来工作

虽然这项工作证明了这个框架的初步可行性,但仍然有大量的额外研究可以扩展这个主题。

这项工作的一个建议延续旨在根据以下指标量化密集稀疏数据融合之间的性能差异:****

  1. 运行时性能
  2. 语义分割指标(如准确度、mIoU)
  3. 在线预处理和后处理时间

如果你有任何继续这项工作的想法,你想分享,请在下面留下回应!

回顾和总结

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

克里斯托弗·伯恩斯在 Unsplash 上拍摄的照片

在本文中,我们引入了 数据融合 的概念,作为通过 融合不同数据源 来提高智能系统性能的一种手段。我们讨论了一些使用数据融合的示例领域,特别关注数据融合在自动驾驶汽车上的应用。然后,我们深入研究了自动驾驶汽车的数据融合案例。

在案例研究中,我们讲述了为什么如何进行数据融合,并讨论了我们为什么能够进行数据融合。然后,我们讨论了数据融合在一个示例语义分割系统中的作用,并通过这个案例研究总结了系统性能和未来的工作。****

如果你想了解这个案例研究的更多信息,请查看我的 GitHub 知识库中关于 稀疏融合场景分割与 A2D2 的内容。

我希望你喜欢这篇文章,并感谢阅读:)请关注我更多关于强化学习、计算机视觉、编程和优化的文章!

感谢

感谢 A2D2 团队开源了他们的数据集,也感谢[3]的作者开源了 PointNet++神经网络架构。

参考

  1. 光束法平差——现代综合。视觉算法国际研讨会。施普林格,柏林,海德堡,1999。
  2. Geyer,Jakob 等人,《A2d2:奥迪自动驾驶数据集》arXiv 预印本 arXiv:2004.06320 (2020)。
  3. 郝、查尔斯·黎齐·易、苏·列奥尼达斯·吉巴斯。" PointNet++度量空间中点集的深度层次特征学习." arXiv 预印本 arXiv:1706.02413 (2017)。

附录:使用 PointNet++的 A2D2 数据融合数据集的 Python 类

Python 中 A/B 测试的实用指南

原文:https://towardsdatascience.com/a-practical-guide-to-a-b-tests-in-python-66666f5c3b02?source=collection_archive---------5-----------------------

实验和因果推理

数据科学家在实验前、实验中和实验后应遵循的最佳实践

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

照片由 niko photosUnsplash 上拍摄

介绍

随机对照试验(又名。A/B 测试)是建立因果推断的黄金标准。RCT 严格控制随机化过程,并确保在推广治疗前在协变量间的平均分布。因此,我们可以将治疗组和对照组之间的平均差异归因于干预。

A/B 检验是有效的,只依赖温和的假设,最重要的假设是稳定单位治疗值假设,SUTVA 。它指出,治疗和控制单位不相互作用;否则,干扰会导致有偏差的估计。我最新的博客文章讨论了它的来源和主要技术的应对策略。

作为一名数据科学家,我很高兴看到业界越来越多地采用实验和因果推理。《哈佛商业评论》最近发表了一篇题为“为什么商学院需要教授实验”的文章,强调了融入实验思维的重要性。与之相关的是,他们在另一篇论文中讨论了“在线实验的惊人力量”(Kohavi 和 Thomke,2017)。

A/B 测试大致可以分为三个阶段。

阶段 1 预测试:运行功效分析以确定样本大小。

第二阶段测试:关注关键指标。注意突然下降。

第三阶段后测:分析数据并得出结论。

今天的帖子分享了每个阶段的一些最佳实践,并通过一个假设的案例研究详细介绍了 Python 中的代码实现。

业务场景

抖音开发了一种新的动物过滤器,并希望评估其对使用者的影响。他们对两个关键指标感兴趣:

1.过滤器如何影响用户参与度(例如,花在应用上的时间)?

2.过滤器如何影响用户留存率(如活跃)?

也有一些限制。首先,抖音事先不知道它的性能,更喜欢小规模的研究,尽量少接触。这是理想的方法,因为如果关键指标直线下降(例如,治疗组的对话率为零),他们可以立即结束测试。

第二,这是一个及时的紧急问题,抖音希望在两周内得到答复。幸运的是,抖音已经阅读了我之前关于用户干扰的帖子,并正确地解决了 SUTVA 假设违反的问题。

公司决定聘请一小群非常有才华的数据科学家,你是负责模型选择和研究设计的团队领导。在咨询了多个利益相关者之后,您提出了一个 A/B 测试,并建议了以下最佳实践。

第 1 阶段预测试:目标、指标和样本量

测试的目标是什么?

如何衡量成功?

我们应该运行多长时间?

作为第一步,我们希望阐明测试的目标,并将其反馈给团队。如前所述,该研究旨在测量推出过滤器后的用户参与度和保留度。

接下来,我们转向指标,并决定如何衡量成功。作为一个社交网络应用,我们采用花在应用上的时间来衡量用户参与度和两个布尔变量,指标 1指标 2 (如下所述),分别表明用户在 1 天和 7 天后是否活跃。

剩下的问题是:我们应该运行测试多长时间?一个常见的策略是,一旦我们观察到有统计学意义的结果(例如,一个小的 p 值),就停止实验。公认的数据科学家强烈反对 p-hacking,因为它会导致有偏见的结果( Kohavi 等人 2020 )。与此相关的是,当 p-hacking 导致误报时,Airbnb 也遇到了同样的问题(Airbnb 的实验)。

相反,我们应该进行功效分析,并根据三个参数决定最小样本量:

  1. **显著性水平,**也称为α或α:当假设为真时拒绝零假设的概率。通过拒绝一个真正的零假设,我们错误地声称有一个效果,而实际上没有效果。因此,它也被称为假阳性的概率
  2. 统计功效:确实有效果时,正确识别效果的概率。功率= 1 — 第二类误差
  3. 最小可检测效应,MDE :为了找到一个广泛认同的 MDE,我们的数据团队与项目经理坐下来,决定最小可接受差异为 0.1。换句话说,用标准差衡量的两组之间的差异需要至少为 0.1。否则,该版本将无法补偿所产生的业务成本(例如,工程师的时间、产品生命周期等)。).例如,如果一个新的设计仅仅带来 0.000001%的提升,那么它就没有任何意义,即使它在统计上是显著的。

以下是这三个参数与所需样本量之间的双向关系:

  • 显著性水平降低→更大的样本量
  • 统计功效增加→更大的样本量
  • 最小可检测效应降低→更大的样本量

通常,我们将显著性水平设置为 5%(或 alpha = 5%),统计功效设置为 80%。因此,样本大小通过以下公式计算:

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

我自己的截图

其中:

  • σ:样本方差。
  • 𝛿:治疗组和对照组的差异(以百分比表示)。

为了获得样本方差( σ ),我们通常会运行一个 A/A 测试,该测试遵循与 A/B 测试相同的设计思路,只是对两组进行了相同的处理。

什么是 A/A 测试

将用户分成两组,然后对两组分配相同的处理。

下面是用 Python 计算样本大小的代码。

from statsmodels.stats.power import TTestIndPower# parameters for power analysis # effect_size has to be positiveeffect = 0.1
alpha = 0.05
power = 0.8# perform power analysis 
analysis = TTestIndPower()result = analysis.solve_power(effect, power = power,nobs1= None, ratio = 1.0, alpha = alpha)print('Sample Size: %.3f' % round(result))1571.000

我们需要 1571 个变量。至于我们应该运行多长时间的测试,这取决于应用程序收到多少流量。然后,我们将日流量平均分成这两个变量,等到收集到足够大的样本量(≥1571)。

如上所述,抖音是一个非常受欢迎的应用程序,拥有数百万的 dau。但是,我们专门针对试用新过滤器的用户。此外,最小接触法可能需要几天时间来为实验收集足够的观察数据。

最佳实践

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

埃尔卡里托在 Unsplash 上拍摄的照片

测试期间第 2 阶段:数据收集

我们推出测试并启动数据收集流程。在这里,我们模拟数据生成过程(DGP ),并人工创建遵循特定分布的变量。我们知道真实的参数,这在比较估计的治疗效果和真实的效果时很方便。换句话说,我们可以评估 A/B 测试的有效性,并检查它们在多大程度上导致无偏见的结果。

在我们的案例研究中,有五个变量需要模拟:

1\. userid2\. version3\. minutes of plays4\. user engagement after 1 day (metric_1)5\. user engagement after 7 days (metric_2)

#变量 1 和 2:用户标识和版本

我们有意创建 1600 个对照单位和 1749 个处理单位,以表示潜在的采样比率不匹配,SRM。

**# variable 1: userid** user_id_control = list(range(1,1601))# 1600 control
user_id_treatment = list(range(1601,3350))# 1749 treated**# variable 2: version** import numpy as np
control_status = [‘control’]*1600
treatment_status = [‘treatment’]*1749

#变量 3:播放时间

我们将变量 3(“上场时间”)模拟为正态分布,μ为 30 分钟,σ为 10。具体来说,对照组的平均值是 30 分钟,方差是 10。

概括地说,MDE 的效应参数计算为两组之间的差异除以标准偏差 (μ_1 — μ_2)/σ_squared = 0.1。根据公式,我们得到μ_2 = 31。方差也是 10。

# for control groupμ_1 = 30
σ_squared_1 = 10
np.random.seed(123)
minutes_control = np.random.normal(loc = μ_1, scale = σ_squared_1, size = 1600)# for treatment group, which increases the user engagement by 
# according to the formula (μ_1 — μ_2)/σ_squared = 0.1, we obtain μ_2 = 31μ_2 = 31σ_squared_2 = 10np.random.seed(123)minutes_treat = np.random.normal(loc = μ_2, scale = σ_squared_2, size = 1749)

#变量 4:1 天后的用户参与度,metric_1

我们的模拟显示,在 1 天(metric_1)后,对照组有 30%的活跃(真)用户和 70%的不活跃(假)用户,而治疗组分别有 35%的活跃用户和 65%的不活跃用户。

Active_status = [True,False]# control 
day_1_control = np.random.choice(Active_status, 1600, p=[0.3,0.7])# treatment
day_1_treatment = np.random.choice(Active_status, 1749, p=[0.35,0.65])

#变量 5:7 天后的用户参与度,metric_2

模拟数据显示,对照组的活跃用户率为 35%,而治疗组在 7 天后的活跃用户率为 25%。

# control 
day_7_control = np.random.choice(Active_status, 1600, p=[0.35,0.65])# treatment
day_7_treatment = np.random.choice(Active_status, 1749, p=[0.25,0.75])

真实数据包含一个相反的模式:治疗组在短期内表现更好,但对照组在一周后回来并脱颖而出。

让我们检查一下 A/B 测试是否拾取了反向信号。

final_data.head()

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

我自己的截图

完整的模拟过程,请参考我的Github

最佳实践

  • 在目睹了一些初步的积极效果后,不要过早地结束你的 A/B 测试。
  • 不要提前停车!
  • 禁止 p-hacking!
  • 相反,当达到最小样本量时就结束它。

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

拉扎·阿里在 Unsplash 上的照片

阶段 3 后测:数据分析

收集到足够的数据后,我们进入实验的最后一个阶段,即数据分析。作为第一步,检查每个变体中有多少用户是有益的。

# calculate the number of users in each version
final_data.groupby('version')['user_id'].count()

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

我自己的截图

这似乎是一个可疑的变异分裂:1600 个控制单位,但 1749 个治疗单位。治疗分配过程从表面上看是可疑的,因为分配给治疗的用户比控制组多。

为了正式检查 SRM,我们在治疗组和对照组的实际分割和预期分割之间进行卡方检验(科哈维等人 2020 )。

from scipy.stats import chisquare 
chisquare([1600,1749],f_exp = [1675,1675])Power_divergenceResult(statistic=6.627462686567164, pvalue=0.010041820594939122)

我们将 alpha 级别设置为 0.001 来测试 SRM。由于 p 值为 0.01,我们无法拒绝零假设,并得出没有 SRM 证据的结论。与我们的直觉相反,统计测试得出的结论是,治疗任务按预期进行。

画出每组上场时间的分布图

由于变量 minutes_play 是一个浮点数,我们必须在分组前将其四舍五入到最接近的整数。

%matplotlib inlinefinal_data[‘minutes_play_integers’] = round(final_data[‘minutes_play’])plot_df = final_data.groupby(‘minutes_play_integers’)[‘user_id’].count()# Plot the distribution of players that played 0 to 50 minutes
ax = plot_df.head(n=50).plot(x=”minutes_play_integers”, y=”user_id”, kind=”hist”)ax.set_xlabel(“Duration of Video Played in Minutes”)ax.set_ylabel(“User Count”)

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

我自己的截图

指标 1:a b 组的 1 天保留时间

# 1-day retention
final_data[‘day_1_active’].mean()
0.3248730964467005

一天之后,总体活跃用户率平均徘徊在 32.5%左右。

# 1-day retention by group
final_data.groupby(‘version’)[‘day_1_active’].mean()

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

我自己的截图

仔细一看,对照组有 29.7%的活跃用户,治疗组有 35%。

自然,我们对以下问题感兴趣:

治疗组较高的保留率是否具有统计学意义?

它的可变性是什么?

如果我们重复这个过程 10,000 次,我们至少观察到极值的频率是多少?

Bootstrap 可以回答这些问题。这是一种重采样策略,用替换数据重复采样原始数据。根据中心极限定理,重采样的分布意味着近似正态分布(查看我在 Bootstrap 上的其他帖子,在 R 或者 Python )。

# solution: bootstrap
boot_means = []# run the simulation for 10k times 
for i in range(10000):#set frac=1 → sample all rows
    boot_sample = final_data.sample(frac=1,replace=True).groupby (‘version’) [‘day_1_active’].mean() boot_means.append(boot_sample)# a Pandas DataFrame
boot_means = pd.DataFrame(boot_means)# kernel density estimate
boot_means.plot(kind = ‘kde’)

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

我自己的截图

# create a new column, diff, which is the difference between the two variants, scaled by the control groupboot_means[‘diff’]=(boot_means[‘treatment’] — boot_means[‘control’]) /boot_means[‘control’]*100boot_means['diff']

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

我自己的截图

# plot the bootstrap sample difference 
ax = boot_means[‘diff’].plot(kind = ‘kde’)
ax.set_xlabel(“% diff in means”)

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

我自己的截图

boot_means[boot_means[‘diff’] > 0]# p value 
p = (boot_means[‘diff’] >0).sum()/len(boot_means)
p
0.9996

在引导 10,000 次后,该治疗在 99.96%的时间内具有更高的 1 天保留率。

厉害!

测试结果与我们最初的模拟数据一致。

指标 7:a b 组的 7 天保留期

我们将同样的分析应用于 7 天指标。

boot_7d = []for i in range(10000):
      boot_mean = final_data.sample(frac=1,replace=True).groupby(‘version’)[‘day_7_active’].mean() boot_7d.append(boot_mean)

boot_7d = pd.DataFrame(boot_7d)boot_7d[‘diff’] = (boot_7d[‘treatment’] — boot_7d[‘control’])            /boot_7d[‘control’] *100# Ploting the bootstrap % difference
ax = boot_7d['diff'].plot(kind = 'kde')
ax.set_xlabel("% diff in means")

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

我自己的截图

# Calculating the probability that 7-day retention is greater when the gate is at level 30p = (boot_7d['diff']>0).sum()/len(boot_7d)1-p
0.9983

在 7 天的指标上,控件显然具有更好的用户保持率 99.83%的时间,也与原始数据一致。

1 天和 7 天指标之间的反向模式支持了新奇效应,因为用户被新设计激活和激起了兴趣,而不是因为变化实际上提高了参与度。新奇效应在消费者端 A/B 测试中很受欢迎。

最佳实践

  • SRM 是一个真正的问题。我们应用卡方检验对 SRM 进行正式测试。如果 p 值小于阈值(α = 0.001),随机化过程不会按预期进行。
  • SRM 会引入使任何测试结果无效的选择偏差。
  • 需要掌握三个基本的统计概念:SRM、卡方检验和 bootstrap。
  • 比较短期和长期指标以评估新颖性效果。

完整的模拟过程请参考我的 Github

结论

A/B 测试需要广泛的统计知识和对细节的仔细关注。有成千上万种方法可以破坏你的测试结果,但只有一种方法可以正确地做到。遵循实验前、中、后描述的最佳实践,为实验的成功做好准备。

Medium 最近进化出了自己的 作家伙伴计划 ,支持像我这样的普通作家。如果你还不是订户,通过下面的链接注册,我会收到一部分会员费。

https://leihua-ye.medium.com/membership

进一步阅读

用曲奇猫测试手机游戏 A/B

喜欢读这本书吗?

请在 LinkedInYoutube 上找到我。

还有,看看我其他关于人工智能和机器学习的帖子。

对抗性鲁棒性实用指南

原文:https://towardsdatascience.com/a-practical-guide-to-adversarial-robustness-ef2087062bec?source=collection_archive---------34-----------------------

我们正在进入计算机系统威胁建模的新时代

简介 机器学习模型已被证明容易受到敌对攻击,这种攻击包括在测试期间添加到输入中的扰动,旨在欺骗模型,而这些扰动通常是人类察觉不到的。在这份文件中,我强调了几种产生对抗性例子的方法和评估对抗性鲁棒性的方法。

背景
下面是伊恩·古德费勒论文中的典型例子。

(解释和利用对立的例子 (ICLR 2015)伊恩·j·古德菲勒,黄邦贤·施伦斯,克里斯蒂安·塞格迪)

虽然对抗性机器学习仍然是一个非常年轻的领域(不到 10 年),但围绕攻击此类模型并找到其漏洞的论文和工作已经出现了爆炸式增长,变成了防御者和攻击者之间名副其实的军备竞赛。攻击者本质上占了上风,因为破坏东西比修理东西容易。与对抗性 ML 的一个很好的类比是 50 年代的密码学:研究人员不断尝试复杂的方法来保护系统,研究人员不断尝试破解它们,直到他们发明了一种复杂的算法,这种算法可能在计算上过于昂贵而无法破解(DES)。

为此,让我们尝试定义一个模型上的敌对样本是什么样子的。数学上,让我们假设我们有一个带有输入 x 的模型 f ,它可以产生一个预测 y. 然后,模型 f 和输入 x 的对立示例 d 可以定义为:

  • f(x+d)!= y ,意味着加到 x 上的扰动 d 不会产生与 x 相同的预测
  • L(d) < T ,其中 L 是测量 d范数的某个通用函数,其中 T 是该范数的某个上界。

基于上述参数,有一大类算法可用于产生这种扰动。大体上,它们可以用下图来划分。

基于(1)对模型的梯度访问和(2)用于生成样本的规范的不同对立示例的分类。这捕获了几乎所有的攻击,但绝不是一个详尽的列表(图片由作者制作)

我们对对手的威胁建模如下:

  1. **梯度访问:**梯度访问控制谁可以访问模型 f 和谁不可以。
    白盒对手通常可以完全访问模型参数、架构、训练例程和训练超参数,并且通常是文献中使用的最强大的攻击。白盒攻击通常使用梯度信息来寻找对立的例子。
    黑盒对手很少甚至没有访问模型参数的权限,模型被抽象为某种 API。黑盒攻击可以使用基于非梯度的优化方法发起,例如(1)遗传算法,(2)随机搜索和(3)进化策略。就计算资源而言,它们通常效率不高,但却是最现实的对手类别。
  2. **扰动界:**扰动界决定了扰动 d 的大小,通常用一些数学范数如 Lp 范数来度量。
    **L0 范数:**L0 范数有界攻击通常涉及修改模型输入信号的一定数量的特征。L0 范数有界攻击通常非常真实,可以在真实世界的系统上发起。一个常见的例子是在停车标志上添加一个贴纸,可以迫使自动驾驶汽车不要减速——所有的背景都被保留下来,只有一小部分环境被修改。
    L1 范数:L1 范数有界攻击涉及总扰动值的的上限。这种攻击相当罕见。
    L2 范数:L2 范数有界攻击涉及扰动的上限欧几里德距离/毕达哥拉斯距离d .由于 L2 范数在线性代数和几何中的数学相关性,L2 范数有界攻击被非常普遍地使用。
    L_infinity 范数:L _ infinity 范数有界攻击涉及扰动最大值的上界,是最先被发现的攻击。在所有攻击中,无限攻击是研究最多的,因为它们在鲁棒性优化中的简单性和数学便利性。

在非常高的层次上,如果我们使用 Lp 范数作为鲁棒性度量,我们可以有 8 种不同类型的攻击(2 x 4)在下面突出显示。还有其他几种特定于域的方法来量化扰动 d 的幅度,但上述方法可以推广到所有输入类型。注意,下面引用的攻击严格针对图像,但是一般原理可以应用于任何模型 f.

按(1)梯度访问和攻击规范类型(作者制作的图像)分类的常见对抗示例的示例

结论:

随着机器学习模型越来越多地嵌入到我们周围的产品和服务中,它们的安全漏洞和威胁变得越来越重要。我们已经强调了对手可能对预先训练的模型发起敌对攻击的不同方法,但是随着我们找到更多的例子,我们将确保再写一篇文章并分享这些发现。

[1] Modas 等人, SparseFool:几个像素造成很大的不同 ,【CVPR】2019
【2】paper not 等人, ***针对机器学习的实用黑盒攻击,***ASIA CCS 2017
【3】Sharma 等人, ***EAD:对深度神经网络的弹性网攻击。***AAAI-2018
【4】卡里尼等, ***走向评估神经网络的鲁棒性,***IEEE Security&Privacy,2017
【5】马德瑞等, ***走向抗对抗性攻击的深度学习模型,***ICLR 2018
【6】古德费勒等, 解释与治理一种基于进化的针对神经网络的对抗性攻击, arxiv 预印本:
【8】Croce 等人, Sparse-RS:查询高效的稀疏黑盒对抗性攻击的通用框架, ECCV 关于真实世界中对抗性鲁棒性的第 20 次研讨会
【9】Alzantot 等人, GenAttack:具有梯度的实用黑盒攻击

使用 PyCaret 的 ARIMA 模型实用指南—第 3 部分

原文:https://towardsdatascience.com/a-practical-guide-to-arima-models-using-pycaret-part-3-823abb5359a7?source=collection_archive---------8-----------------------

理解差异术语

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

塞德里克·韦舍Unsplash 拍摄的照片

📚介绍

在本系列的前一篇文章中,我们看到了趋势项对 ARIMA 模型输出的影响。本文将着眼于“差异”术语“d ”,并了解它是如何建模的以及它代表了什么。

📖建议的先前阅读

本系列以前的文章可以在下面找到。我建议读者在继续阅读本文之前先浏览一遍。本文建立在前几篇文章中描述的概念的基础上,并重用了其中的一些工作。

使用 PyCaret 的 ARIMA 模型实用指南—第 1 部分

使用 PyCaret 的 ARIMA 模型实用指南—第 2 部分

ARIMA 模型中的 1️⃣“差异-d”概述

在很高的层次上,差异意味着时间序列在任何给定时间点的值取决于前一时间点的值。差值“d = 1”意味着任何时间点的值取决于前一时间点(由等式 1 给出)。ε项表示无法建模的噪声项。

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

d=1 的 ARIMA 方程(图片由作者使用https://latex2png.com/)

**重要提示:**使用等式 1 生成时间序列的过程也称为“随机漫步”。大多数股票数据都遵循这种模式。如果你仔细观察,你会意识到当这被正确建模时,未来点的最佳预测与最后已知点相同。因此,使用 ARIMA 等传统方法的股票价格模型不会产生“有用”的模型。我们真的需要一个模型来告诉我们明天的股价会和今天的股价一样吗?

2️⃣️用 PyCaret 理解差项

👉步骤 1:设置 PyCaret 时间序列实验

为了更好地理解这个概念,我们将使用来自pycaret游乐场的随机行走数据集。详细内容可以在本文的 Jupyter 笔记本中找到(可在文章末尾找到)。

*#### Get data from data playground ----*
y = get_data("1", **folder="time_series/random_walk"**)exp = TimeSeriesExperiment()
exp.setup(data=y, seasonal_period=1, fh=30, session_id=42)exp.plot_model()

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

随机漫步数据集[图片由作者提供]

👉步骤 2:执行 EDA

诊断时间序列是否由随机游走过程生成的经典方法是查看 ACF 和 PACF 图。ACF 图将显示扩展的自相关性[1]。PACF 图应显示滞后= 1 时的峰值,且峰值大小应非常接近 1。所有其他的滞后都将是微不足道的。您可以将 PACF 幅度视为等式 1 中滞后值 y(t-1)的系数。我将在另一篇文章中详细介绍这一点。

exp.**plot_model(plot="acf")**
exp.**plot_model(plot="pacf")**

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

随机游走数据集 ACF 图[图片由作者提供]

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

随机游走数据集 PACF 图[图片由作者提供]

👉第三步:理论计算

对于随机游走模型,我们可以使用等式 1 来指导我们计算理论值。本质上,下一个时间点被预测为最后一个“已知”时间点。对于样本内预测(即,对训练数据集的预测),这将在每个时间点改变,因为 t = 1 时的最后已知点与 t=10 时的最后“已知”点不同(假设 t = 1 和 t = 10 都在样本内)。

对于样本外预测(即未知交叉验证/测试数据集中的预测),最佳未来预测将是最后一个已知数据点。不管我们对未来的预测有多远,这都是一样的。这是随机游走的样本内和样本外预测之间的一个重要区别。

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

理论样本内(训练)和样本外(测试)预测[图片由作者提供]

👉第四步:用 PyCaret 建立模型

**#### Random Walk Model (without trend) ----**
model3a = exp.create_model(
    "arima",
    **order=(0, 1, 0),**
    seasonal_order=(0, 0, 0, 0),
    trend="n"
)

👉第五步:分析结果

我们将重用我们在以前的文章中创建的相同的助手函数来分析结果。

**summarize_model**(model3a)

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

随机漫步模型统计摘要[图片由作者提供]

统计总结显示,创建的模型是一个SARIMAX(0,1,0)模型,它与我们希望用d=1构建模型的愿望相匹配。残差σ2(未解释的方差)是 0.9720,代表等式 1 中的epsilon项。

**get_residual_properties**(model3a)

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

模型残差[图片由作者提供]

查看模型残差,我们可以看到残差确实具有 0.9720 的方差,这与统计汇总相匹配。接下来,让我们绘制预测图,并与我们的理论框架进行比较。

**plot_predictions**(model3a)

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

样本外预测[图片由作者提供]

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

缩小样本预测[图片由作者提供]

样本外预测与我们的理论计算相符。即预测与最后已知的数据点(在这种情况下是点 309 处的值)相同。在pycaret中放大交互图的能力使分析结果变得容易,并对模型的工作获得更好的直觉。

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

样本内预测[图片由作者提供]

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

放大样本预测[图片由作者提供]

同样,我们也可以观察样本内预测。放大图显示,任何给定时间点的预测都与最后一个已知点相同。并且由于最后已知的数据点从一个时间点变化到下一个时间点,样本内预测也从一个点变化到下一个点。这也符合我们的理论计算。

👉第六步:检查模型是否合适

这也是引入“模型拟合”概念的好时机。检查模型的拟合度实质上意味着检查模型是否从时间序列中获取了所有“信息”。当模型残差不具有任何趋势、季节性或自相关性时,即残差是“白噪声”时,这是正确的。pycaret提供了一个非常方便的功能来检查模型是否合适。我们可以通过将模型传递给check_stats方法/函数来检查模型残差的白噪声特性,如下所示。

exp.**check_stats**(model3a, test="white_noise")

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

模型剩余白噪声测试[图片由作者提供]

第 4 行和第 5 行证实了残差确实是白噪声,因此模型很好地捕获了来自时间序列的信息。

🚀结论

希望这个简单的模型已经为我们理解 ARIMA 模型中“差项— d”的内部运作打下了良好的基础。在下一篇文章中,我们将看到如何将“差异”术语“d”与本系列上一篇文章中所学的“趋势”组件结合起来。在那之前,如果你愿意在我的社交渠道上与我联系(我经常发布关于时间序列分析的文章),你可以在下面找到我。暂时就这样了。预测快乐!

🔗领英

🐦推特

📘 GitHub

喜欢这篇文章吗?成为 中等会员 继续 无限制学习 。如果您使用下面的链接, ,我会收到您的一部分会员费,而不会对您产生额外的费用

https://ngupta13.medium.com/membership

📗资源

  1. Jupyter 笔记本 内含本文代码

📚参考

[1] 时间序列探索性分析|自相关函数

使用 PyCaret 的 ARIMA 模型实用指南—第 4 部分

原文:https://towardsdatascience.com/a-practical-guide-to-arima-models-using-pycaret-part-4-d595da232540?source=collection_archive---------13-----------------------

结合“趋势”和“差异”术语

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

马库斯·斯皮斯克在 Unsplash 上的照片

📚介绍

在本系列的前几篇文章中,我们分别看到了趋势项和差异项对 ARIMA 模型输出的影响。本文将着眼于这两个术语的组合效果以及它们是如何建模的。

📖建议的先前阅读

本系列以前的文章可以在下面找到。我建议读者在继续阅读本文之前先阅读这些内容。本文建立在前几篇文章中描述的概念的基础上,并重用了其中开发的框架。

使用 PyCaret 的 ARIMA 模型实用指南—第二部分(趋势术语)

使用 PyCaret 的 ARIMA 模型实用指南—第 3 部分(差异项)

1️⃣将“差异-d”项与趋势分量相结合

当开发具有趋势和差异项的 ARIMA 模型时,模型方程表示如下(对于 d = 1)。

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

带趋势项的 d=1 的 ARIMA 方程(图片由作者使用https://latex2png.com/)

读者会注意到,这是本系列前几篇文章中的差异和趋势术语的简单线性组合。和以前一样,用户可以选择指定如何对趋势进行建模。有 3 种方法可以对其建模— (1)仅使用截距项“a”,(2)仅使用漂移项“b”,或者(3)同时使用截距项和漂移项。我们将在本文中看到这三个例子。

另一个有趣的观察结果是,如果重新排列等式,如等式 2 所示,趋势项的系数(“a”和“b”)可以通过对数据的一阶差分进行线性回归拟合来获得。我们将使用这个等式来开发模型参数“a”和“b”的理论框架。

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

趋势项重排后的 d=1 的 ARIMA 方程(图片由作者使用https://latex2png.com/)

2️⃣️使用 PyCaret 理解趋势项和差异项的组合效应

👉步骤 1:设置 PyCaret 时序实验

设置与上一篇文章(描述了差异术语)中的设置相同。详细信息可在本文的 Jupyter 笔记本中找到(可在本文末尾找到)。

*#### Get data from data playground ----*
y = get_data("1", **folder="time_series/random_walk"**)exp = TimeSeriesExperiment()
exp.setup(data=y, seasonal_period=1, fh=30, session_id=42)

👉第 2 步:执行 EDA

我们将跳过本文中的 EDA,因为我们已经在本系列的上一篇文章中执行了它。

👉第 3 步:理论计算

如上所述,我们将使用等式(2)来确定该 ARIMA 模型的模型系数。我们还将模拟三种不同的 ARIMA 模型变体。每个模型将包含第一个差异项和上述趋势选项之一。为了帮助进行理论计算,我们重复使用了前一篇文章中的框架(它只包含第一个差异项),但此外,我们还对残差进行了线性回归。

***# Get Train & Test Data Properties***
y_train **=** exp**.**get_config("y_train")
y_test **=** exp**.**get_config("y_test")***# Compute theoretical prediction for ARIMA(0,1,0)x(0,0,0,0)*** train_data **=** pd**.**DataFrame({"y":y_train})
train_data['preds'] **=** y_train**.**shift(1)
train_data['split'] **=** "Train"

test_data **=** pd**.**DataFrame({'y': y_test})
test_data['preds'] **=** y_train**.**iloc[**-**1]
test_data['split'] **=** "Test"

data **=** pd**.**concat([train_data, test_data])
data['residuals'] **=** data['y'] **-** data['preds']

(1)方法 1:d = 1、trend = “c” 的 ARIMA 模型

y_for_lr **=** data**.**query("split=='Train'")['residuals']**.**dropna()
y_for_lr**.**mean()***>>> 0.020172890811799432***

因此,对于 d=1 且趋势= "c “的模型,我们预计” c "的值= 0.02017。

(2)方法 2:d = 1、trend = "t "的 ARIMA 模型

y_for_lr **=** data**.**query("split=='Train'")['residuals']**.**dropna()
X_train **=** np**.**arange(1, len(y_for_lr)**+**1)**.**reshape(**-**1, 1)

reg **=** LinearRegression(fit_intercept**=False**)**.**fit(X_train, y_for_lr)
print(f"Expected Intercept: {reg**.**intercept_}")
print(f"Expected Slope: {reg**.**coef_}")***>>> Expected Intercept: 0.0
>>> Expected Slope: [0.00018524]***

对于 d=1 且趋势= "t “的模型,我们预计漂移” b "的值= 0.00018524。

(3)方法 3:d = 1、trend = "ct "的 ARIMA 模型

y_for_lr **=** data**.**query("split=='Train'")['residuals']**.**dropna()
X_train **=** np**.**arange(1, len(y_for_lr)**+**1)**.**reshape(**-**1, 1)

reg **=** LinearRegression(fit_intercept**=True**)**.**fit(X_train, y_for_lr)
print(f"Expected Intercept: {reg**.**intercept_}")
print(f"Expected Slope: {reg**.**coef_}")***>>> Expected Intercept: -0.03432448539897173
>>> Expected Slope: [0.0003516]***

对于 d=1 且趋势= “ct “的模型,我们预期常数” a” = -0.0343 和漂移" b "的值= 0.0003516。

👉第 4 步:建模

现在,我们已经讨论了理论计算,让我们使用 PyCaret 构建这些模型,并在实践中观察它们的输出。

**# Model with d = 1 and Trend = "c" ----**
model3b **=** exp**.**create_model(
    "arima",
    order**=**(0, 1, 0),
    trend**=**"c"
)**# Model with d = 1 and Trend = "t" ----** model3c **=** exp**.**create_model(
    "arima",
    order**=**(0, 1, 0),
    with_intercept**=True**, trend**=**'t'
)**# Model with d = 1 and Trend = "ct" ----** model3d **=** exp**.**create_model(
    "arima",
    order**=**(0, 1, 0),
    trend**=**"ct"
)

👉第 5 步:结果分析

我们将重复使用我们在上一篇文章中创建的帮助器函数来分析结果。

(1)方法 1:d = 1、trend = "c "的 ARIMA 模型

**summarize_model**(model3b)
**get_residual_properties**(model3b)

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

模型 3B 统计摘要[作者图片]

统计概要显示,创建的模型是一个带有“截距”项的SARIMAX(0,1,0)模型。该模型的截距值为 0.0202,与我们的理论计算相符(注意,上面的显示显示了四舍五入的结果)。残差 sigma2(无法解释的方差)为 0.9788,代表等式 1 中的epsilon项。

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

模型 3B 残差[作者图像]

查看模型残差,我们可以看到残差的方差确实为 0.9788,这与统计汇总相符。接下来,让我们绘制预测图,并将其与我们的理论框架进行比较。

**plot_predictions**(model3b)

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

基于样本预测的 3B 模型[作者图片]

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

模型 3B 样本内预测[作者图片]

由于计算预测值的方程(方程 1)比以前的文章更复杂,所以我构建了一个小型 excel 计算器来计算理论预测值(列“Pred(计算)”),并将它们与模型预测值(列“Pred”)进行比较。它们完全匹配(“匹配”列)。此外,请注意,上面的计算器包含样本内点(例如,索引 0、1、2、3、4……),以及样本外预测(索引 310、311、312……)。PyCaret 中的交互式绘图使用户可以非常容易地放大和验证各个时间点的值,以交叉检查答案。

**注意:**我只展示了样本内和样本外预测的一小部分。读者可能希望延伸到更多的点,以加强他们的理解。excel 可以在本文的末尾(在“参考资料”一节中)找到。

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

模型 3B 理论预测计算[图片由作者提供]

(2)方法二:d=1 且 trend = “t” 的 ARIMA 模型

**summarize_model**(model3c)
**get_residual_properties**(model3c)

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

模型 3C 统计摘要[图片由作者提供]

统计汇总显示,创建的模型是一个带有“漂移”项的SARIMAX(0,1,0)模型。模型的漂移值 0.0002 与我们的理论计算相匹配(注意,上面显示的是四舍五入后的结果)。残差σ2(未解释方差)为 0.9781,代表等式 1 中的epsilon项。

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

模型 3C 残差[图片由作者提供]

查看模型残差,我们可以看到残差确实具有 0.9781 的方差,这与统计汇总相匹配。接下来,让我们绘制预测图,并将其与我们的理论框架进行比较。

**plot_predictions**(model3c)

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

从样本预测中模拟 3C[图片由作者提供]

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

模型 3C 样本内预测[图片由作者提供]

同样,excel 计算器用于对照模型输出检查理论预测(这次使用斜率项“b”来匹配理论“漂移”值)。同样,由“Pred(计算)”列表示的理论预测(样本内和样本外)与由“Pred”列表示的模型输出相匹配。

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

模型 3C 理论预测计算[图片由作者提供]

(3)方法三:d=1 且 trend = “ct” 的 ARIMA 模型

**summarize_model**(model3d)
**get_residual_properties**(model3d)

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

模型 3D 统计摘要[图片由作者提供]

统计概要表明,所创建的模型是一个既有“截距”又有“漂移”项的SARIMAX(0,1,0)模型。模型中的值(截距=-0.0343 和漂移= 0.0004)与我们的理论计算相匹配(注意,上面显示的是四舍五入的结果)。残差σ2(未解释方差)为 0.9778,代表等式 1 中的epsilon项。

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

3D 残差模型[图片由作者提供]

查看模型残差,我们可以看到残差确实具有 0.9778 的方差,这与统计汇总相匹配。接下来,让我们绘制预测图,并将其与我们的理论框架进行比较。

**plot_predictions**(model3d)

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

样本预测的 3D 模型[图片由作者提供]

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

模型 3D 样本内预测[图片由作者提供]

同样,excel 计算器用于对照模型输出检查理论预测(这次使用截距项“a”和斜率项“b”)。同样,由“Pred(计算)”列表示的理论预测(样本内和样本外)与由“Pred”列表示的模型输出相匹配。

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

模型 3D 理论预测计算[图片由作者提供]

🚀结论

现在我们有了。我们将乐高风格的积木(“趋势”和“差异”术语)组合成一个更复杂的模型。希望这个简单的框架为我们理解这些术语在 ARIMA 模型中如何相互作用打下了良好的基础。在下一篇文章中,我们将看到季节参数“s”和季节差异“D”的影响。在那之前,如果你愿意在我的社交渠道上与我联系(我经常发布关于时间序列分析的文章),你可以在下面找到我。暂时就这样了。预测快乐!

🔗 LinkedIn

🐦推特

📘 GitHub

喜欢这篇文章吗?成为 中等会员 继续 无限制学习 。如果你使用下面的链接, ,我会收到你的一部分会员费,而不会给你带来额外的费用

https://ngupta13.medium.com/membership

📗资源

  1. Jupyter 笔记本 包含这篇文章的代码
  2. Excel 计算器 进行理论预测。

用 Python 实现随机森林分类器的实用指南

原文:https://towardsdatascience.com/a-practical-guide-to-implementing-a-random-forest-classifier-in-python-979988d8a263?source=collection_archive---------0-----------------------

用 sklearn 构建咖啡评级分类器

随机森林是一种监督学习方法,这意味着我们的输入和输出之间有标签和映射。它可以用于分类任务,如根据花瓣长度和颜色等测量结果确定花的种类,也可以用于回归任务,如根据历史天气数据预测明天的天气预报。顾名思义,随机森林由多个决策树组成,每个决策树输出一个预测。在执行分类任务时,随机森林中的每个决策树都会为输入所属的一个类投票。例如,如果我们有一个关于花的数据集,并且我们想要确定一种花的种类,那么随机森林中的每棵决策树将投票选出它认为一种花属于哪个种类。一旦所有的树都得出结论,随机森林将计算哪个类(物种)拥有最多的投票,这个类将是随机森林输出的预测。在回归的情况下,随机森林将平均每个决策树的结果,而不是确定最多的投票。因为随机森林利用多个学习者(决策树)的结果,所以随机森林是一种集成机器学习算法。集成学习方法减少了方差并提高了其组成学习模型的性能。

决策树

如上所述,随机森林由多个决策树组成。决策树根据数据的特征将数据分成小组。例如,在花卉数据集中,特征将是花瓣长度和颜色。决策树将继续把数据分成组,直到一个标签(一个分类)下的一小组数据存在。一个具体的例子是选择吃饭的地方。人们可能会细读 Yelp 并根据关键决策找到一个吃饭的地方,比如:这个地方现在开门了吗,这个地方有多受欢迎,这个地方的平均评分是多少,我需要预订吗。如果这个地方是开放的,那么决策树将继续下一个特征,如果不是,决策结束,模型输出“不,不要在这里吃”。现在,在下面的要素中,模型将确定一个地方是否受欢迎,如果该位置受欢迎,模型将移动到下一个要素,如果不受欢迎,模型将输出“不,不要在这里吃”-与之前的过程相同。从本质上讲,人们可以把决策树想象成一个流程图,它根据数据绘制出可以做出的决策,直到得出最终结论。决策树基于测量信息增益的纯度度量来确定在哪里分割特征。在分类的情况下,它根据基尼指数或熵作出决定,在回归的情况下,根据残差平方和作出决定。然而,这其中的数学问题超出了这篇博文的范围。本质上,这些 metics 测量的是信息增益,衡量我们能够从一条数据中收集多少信息。

随机森林逻辑

随机森林算法可以描述如下:

  1. 假设观测值的数量为 N。这 N 个观测值将被随机抽样并替换。
  2. 假设有 M 个特征或输入变量。将在每个节点从特征总数 M 中随机选择一个数字 M,其中 m < M。这 M 个变量的最佳分割用于分割节点,并且该值随着森林的增长而保持不变。
  3. 森林中的每棵决策树都增长到最大程度。
  4. 该林将基于该林中的树的聚合预测来输出预测。(多数票或平均票)

数据探索

在本帖中,我们将利用随机森林来预测咖啡的杯数。咖啡豆被专业地分为 0-100 分。该数据集包含咖啡豆的总杯突点以及咖啡豆的其他特征,如原产国、品种、风味、香味等。这些特征中的一些将被用于训练随机森林分类器,以基于它接收的总杯突点来预测特定豆的质量。本演示中的数据来自 TidyTuesday 存储库,下面是数据的预览。

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

为了保证模型的安全性,我们将对该数据集进行子集划分,以包含咖啡的属性列,这些属性包括但不限于:品种、原产国、酸度、酒体和甜度。此外,我们将删除任何包含 nan(非数字/缺失)值的行。

coffee_df = coffee_ratings[['total_cup_points',
                            'species',
                            'country_of_origin',
                            'variety',
                            'aroma',
                            'aftertaste',
                            'acidity',
                            'body',
                            'balance',
                            'sweetness',
                            'altitude_mean_meters',
                            'moisture']]
coffee_df = coffee_df.dropna()

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

从上面我们可以看到,数据不仅包含数值,还包含分类值,如物种、原产国和品种。我们可以通过使用 sklearn 包提供的 OrginalEncoder 函数将这些映射成数值。例如,有两种咖啡:阿拉比卡和罗布斯塔。代码将为这些分配数值,例如 Arabica 映射到 0,而 Robusta 映射到 1。对于其他变量,将遵循类似的逻辑。

from sklearn.preprocessing import OrdinalEncoder
ord_enc = OrdinalEncoder()
coffee_df["species"] = ord_enc.fit_transform(coffee_df[["species"]])
coffee_df["country_of_origin"] = ord_enc.fit_transform(coffee_df[["country_of_origin"]])
coffee_df["variety"] = ord_enc.fit_transform(coffee_df[["variety"]])

既然所有的数据都是数字,我们可以生成图表来观察不同特征之间的关系。一个有用的图表是显示特征的边缘和联合分布的 pairplot。我们放弃了

import seaborn
seaborn.pairplot(coffee_df.drop('total_cup_points', axis = 1))

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

我们可以看到分布是很难看到的。在某些情况下,分布是完全二元的,如特定的,或非常偏斜的,如平均高度。此外,一些数值变量,如香气和酸度,各包含一个 0 值,这是数据中的异常值,我们将把它们过滤掉并重新绘制 paitplot。

coffee_df = coffee_df[coffee_df['aroma']>0]
coffee_df = coffee_df[coffee_df['acidity']>0]seaborn.pairplot(coffee_df)

下面我们可以更清楚地看到联合分布。图的第一列表示特征如何与目标变量total_cupping_points相关。我们可以看到从aromabalance的特征似乎与接收到的total_cupping_points有很强的关系。此外,我们在配对图的对角线上看到的边际分布在很大程度上似乎是正态分布的。

我们可以为探索性数据分析(EDA)生成的另一个图是关联矩阵,它将显示特征之间的关联。我们也可以通过 seaborn 软件包来实现这一点。

seaborn.heatmap(coffee_df.corr(),
                xticklabels=coffee_df.columns,
                yticklabels=coffee_df.columns)

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

我们可以看到,从aromasweetness特征之间呈正相关,与品种之间呈负相关,与altitude_mean_metersmoisture也呈负相关。

数据扩充

如果我们观察总杯数评级的分布,我们可以看到这些值是连续的,而不是离散的,例如对餐馆的星级评级,一星、二星等。在这个项目中,我将把拔罐评级分为三类:低、中、好。这可以通过根据我们下面看到的分布设置阈值来实现。在某个阈值内的任何东西都将被标记为坏的、一般的或好的。更准确地说,我将把低于第 75 百分位的定义为“低”,第 75 和第 90 百分位之间的定义为“一般”,前 10 百分位的定义为“好”。当然,在数据集中,这些标签将是数字的。坏的将被标为 1,一般的标为 2,好的标为 3。

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

这就是阈值的计算方法。我们将从 numpy 调用 percentile 函数,并输入一个包含代表分界点的百分点的列表。

rating_pctile = np.percentile(coffee_df['total_cup_points'], [75, 90])# The percentile thresholds are
array([83.58, 84.58])

然后,我们使用这些阈值在数据帧中创建一个名为n_rating的新列,代表使用基于以上定义的百分比系统的新标签系统对咖啡的评级。

coffee_df['n_rating'] = 0
coffee_df['n_rating'] = np.where(coffee_df['total_cup_points'] < rating_pctile[0], 1, coffee_df['n_rating'])
coffee_df['n_rating'] = np.where((coffee_df['total_cup_points'] >= rating_pctile[0]) & (coffee_df['total_cup_points'] <= rating_pctile[1]), 2, coffee_df['n_rating'])
coffee_df['n_rating'] = np.where(coffee_df['total_cup_points'] > rating_pctile[1], 3, coffee_df['n_rating'])

下面我们可以观察到由 out 阈值给出的评级的新分布。大多数咖啡评级属于“低”类(准确地说是 75%的数据),只有少数咖啡评级为“好”。

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

此时,数据几乎可以用于建模了。我们现在需要将数据分成训练集和测试集。训练集将用于训练随机森林分类器,而测试集将用于评估模型的性能-因为这是它以前在训练中没有见过的数据。这里 75%的数据用于训练,25%的数据用于测试。

X = coffee_df.drop(['total_cup_points', 'n_rating', 'sweetness', 'species', 'altitude_mean_meters'], axis = 1)
y = coffee_df['n_rating']
training, testing, training_labels, testing_labels = train_test_split(X, y, test_size = .25, random_state = 42)

接下来,我们将缩放数据,这将是我们所有的功能相同的比例,这有助于确保具有较大值的属性不会过度影响模型。sklearn 中的[StandardScaler](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html)主要计算每个要素的 z 得分,确保数据集中的每个要素的均值为 0,方差为 1。

# Normalize the data
sc = StandardScaler()
normed_train_data = pd.DataFrame(sc.fit_transform(training), columns = X.columns)
normed_test_data = pd.DataFrame(sc.fit_transform(testing), columns = X.columns)

为了子孙后代,我们可以绘制另一个 pairplot,看看归一化是否强调了特征之间的关系。数据归一化后,咖啡属性从aroma到平衡的关系为clearer。由于椭圆联合分布,这些变量之间似乎存在着弦关系。

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

构建随机森林

现在数据准备好了,我们可以开始编码随机森林了。我们可以用两行代码实例化并训练它。

clf=RandomForestClassifier()
clf.fit(training, training_labels)

然后做预测。

preds = clf.predict(testing)

然后快速评估它的性能。

print (clf.score(training, training_labels))
print(clf.score(testing, testing_labels))1.0
0.8674698795180723

score方法让我们了解随机森林对给定数据的平均准确性。在第一次调用中,我们在训练数据上评估它的性能,然后在测试数据上评估。该模型在训练数据上的准确率为 100%,在测试数据上的准确率较低,为 86.75%。由于训练精度如此之高,而测试又不是那么接近,所以可以肯定地说,该模型过度拟合了——该模型对训练数据的建模太好了,没有概括出它正在学习的东西。把它想象成记忆一个测试的答案,而不是真正学习那个测试的概念。我们将在后面讨论如何减轻这个问题。

我们可以用来评估模型性能的另一个工具是混淆矩阵。混淆矩阵显示了实际类别和预测类别的组合。矩阵的每一行代表预测类中的实例,而每一列代表实际类中的实例。这是一个很好的方法来衡量模型是否能解释类属性的重叠,并理解哪些类最容易混淆。

metrics.confusion_matrix(testing_labels, preds,  labels = [1, 2, 3])

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

第一列代表评级为“低”的咖啡,第二列代表评级为“一般”的咖啡,第三列代表评级为“好”的咖啡。矩阵对角线上的数字 183、19 和 14 代表模型准确分类的咖啡数量。非对角线值代表错误分类的数据。例如,11 种应该被标记为“低”分的咖啡被标记为“一般”。

我们可以从随机森林中获得的另一个有趣的洞察力是探索模型“认为”在确定总杯突点中最重要的特征。

pd.DataFrame(clf.feature_importances_, index=training.columns).sort_values(by=0, ascending=False) 

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

我们可以看到balanceaftertasteacidity似乎对一杯咖啡获得的总杯数贡献很大。

调整随机森林

当我们在上面的clf=RandomForestClassifier()中实例化一个随机森林时,森林中的树的数量、用于分割特征的度量等参数采用在[sklearn](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html)中设置的默认值。然而,这些默认值通常不是最佳的,必须针对每个用例进行调整。要调整的参数可以在sklearn 文档中找到。调整这些参数的一种方法是执行随机网格搜索。我们定义了一个值的范围,代码可以从中随机挑选,直到找到一组性能最好的值。首先,我们定义搜索算法将搜索的值。

# Number of trees in random forest
n_estimators = np.linspace(100, 3000, int((3000-100)/200) + 1, dtype=int)
# Number of features to consider at every split
max_features = ['auto', 'sqrt']
# Maximum number of levels in tree
max_depth = [1, 5, 10, 20, 50, 75, 100, 150, 200]# Minimum number of samples required to split a node
# min_samples_split = [int(x) for x in np.linspace(start = 2, stop = 10, num = 9)]
min_samples_split = [1, 2, 5, 10, 15, 20, 30]
# Minimum number of samples required at each leaf node
min_samples_leaf = [1, 2, 3, 4]
# Method of selecting samples for training each tree
bootstrap = [True, False]
# Criterion
criterion=['gini', 'entropy']random_grid = {'n_estimators': n_estimators,
#                'max_features': max_features,
               'max_depth': max_depth,
               'min_samples_split': min_samples_split,
               'min_samples_leaf': min_samples_leaf,
               'bootstrap': bootstrap,
               'criterion': criterion}

这实际上创建了一个可供选择的值字典:

{'n_estimators': array([ 100,  307,  514,  721,  928, 1135, 1342, 1550, 1757, 1964, 2171,
        2378, 2585, 2792, 3000]),
 'max_depth': [1, 5, 10, 20, 50, 75, 100, 150, 200],
 'min_samples_split': [1, 2, 5, 10, 15, 20, 30],
 'min_samples_leaf': [1, 2, 3, 4],
 'bootstrap': [True, False],
 'criterion': ['gini', 'entropy']}

接下来,我们可以开始搜索,然后在随机搜索中找到的参数上安装一个新的随机森林分类器。

rf_base = RandomForestClassifier()
rf_random = RandomizedSearchCV(estimator = rf_base,
                               param_distributions = random_grid,
                               n_iter = 30, cv = 5,
                               verbose=2,
                               random_state=42, n_jobs = 4)rf_random.fit(training, training_labels)

我们还可以查看随机搜索找到的参数值:

rf_random.best_params_{'n_estimators': 2171,
 'min_samples_split': 2,
 'min_samples_leaf': 2,
 'max_depth': 200,
 'criterion': 'entropy',
 'bootstrap': True}

从这里我们可以再次评估模型

print (rf_random.score(training, training_labels))
print(rf_random.score(testing, testing_labels))0.9825970548862115
0.8714859437751004

我们现在看到培训分数不到 100%,测试分数是 87.25%。该模型似乎不像以前那样过度拟合。

既然我们已经从随机网格搜索中获得了参数值,我们可以将它们作为网格搜索的起点。原则上,网格搜索的工作方式类似于随机网格搜索,因为它将搜索我们定义的参数空间。然而,它不是搜索随机值,而是搜索参数空间中所有可能的值。这种计算可能是昂贵的,因为随着更多的参数和这些参数的搜索值的增加,搜索增长得非常快。这就是为什么我们首先执行随机网格搜索。我们节省了计算能力,只有当我们有了一个好的起点时,才进行精细的方法搜索。实例化网格搜索也类似于实例化随机网格搜索。

param_grid = {
    'n_estimators': np.linspace(2100, 2300, 5, dtype = int),
    'max_depth': [170, 180, 190, 200, 210, 220],
    'min_samples_split': [2, 3, 4],
    'min_samples_leaf': [2, 3, 4, 5]
}

然后我们可以重新训练另一个随机森林。

# Base model
rf_grid = RandomForestClassifier(criterion = 'entropy', bootstrap = True)
# Instantiate the grid search model
grid_rf_search = GridSearchCV(estimator = rf_grid, param_grid = param_grid, 
                          cv = 5, n_jobs = 8, verbose = 2)
grid_rf_search.fit(training, training_labels)

并查看它发现的最佳参数集

best_rf_grid = grid_rf_search.best_estimator_grid_rf_search.best_params_{'max_depth': 170,
 'min_samples_leaf': 2,
 'min_samples_split': 2,
 'n_estimators': 2100}

我们可以看到它找到的结果与随机网格搜索找到的结果相差不远。现在我们可以评估这个模型,以确定它的准确性和性能。

print (grid_rf_search.score(training, training_labels))
print(grid_rf_search.score(testing, testing_labels))0.9839357429718876
0.8714859437751004

我们看到它的表现与随机搜索网格非常相似,因为它的参数没有偏离我们最初开始时的参数太远。

此外,我们还可以查看模型认为最重要的特征。Balanceaftertasteacidity仍然是排名前三的功能,只是权重略有不同。

最后,我们可以查看最终模型的混淆矩阵。看起来和以前一样。

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

在本文中,我们对 TidyTuesday 的咖啡数据集进行了一些探索性的数据分析,并构建了一个随机森林分类器,将咖啡分为三组:低、中、好。这些等级决定了咖啡应该得到多少杯点。一旦我们建立了一个初始分类器,我们调整它的超参数,以确定我们是否可以进一步提高模式的性能。

线性回归实用指南

原文:https://towardsdatascience.com/a-practical-guide-to-linear-regression-3b1cb9e501a6?source=collection_archive---------4-----------------------

从 EDA 到特征工程再到模型评估

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

线性回归备忘单(作者图片来自原始博客

线性回归是负责数值预测的典型回归算法。它不同于分类模型,如决策树、支持向量机或神经网络。简而言之,线性回归找到自变量和因变量之间的最佳线性关系,然后做出相应的预测。

我估计大多数人在数学课上都频繁遇到过函数 y = b0 + b1x 。基本上是简单线性回归的形式,其中 b0 定义截距 b1 定义直线的斜率。我将在“模型实现”一节中解释算法背后的更多理论,本文的目的是走向实用!如果您想访问代码,请访问我的网站

定义目标

我在这个练习中使用 Kaggle 公共数据集“保险费预测”。数据包括自变量:*年龄、性别、bmi、孩子、吸烟者、*地区、目标变量——费用。首先,让我们加载数据,并使用 df.info() 对数据进行初步检查

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from pandas.api.types import is_string_dtype, is_numeric_dtypedf = pd.read_csv('../input/insurance-premium-prediction/insurance.csv')
df.info()

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

关键要点:

  1. 分类变量:性别、吸烟者、地区
  2. 数字变量:年龄、体重指数、孩子、费用
  3. 1338 条记录中没有缺失数据

探索性数据分析

EDA 对于调查数据质量和揭示变量之间隐藏的相关性是必不可少的。在本练习中,我将介绍与线性回归相关的三种技术。要全面了解 EDA,请查看:

1.单变量分析

使用直方图显示数值变量,使用条形图显示分类变量的数据分布。

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

单变量分析(图片由作者提供)

为什么我们需要单变量分析?

  • 确定数据集是否包含异常值
  • 确定是否需要数据转换或特征工程

在这种情况下,我们发现“费用”遵循幂律分布,这意味着作为特征工程步骤的一个步骤,需要进行对数变换,以将其转换为正态分布。

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

2.多变量分析

当想到线性回归时,我们能想到的第一个可视化技术是散点图。通过使用单行代码 sns.pairplot(df) 绘制目标变量与自变量的关系,潜在的线性关系变得更加明显。

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

配对图(图片由作者提供)

现在,添加分类变量作为图例怎么样?

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

色调=性

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

色调=区域

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

色调=吸烟者

从吸烟者与非吸烟者分割的散点图中,我们可以观察到吸烟者(蓝色)的医疗费用明显较高。这表明“吸烟者”这一特征可能是费用的一个强有力的预测因素。

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

3.相关分析

相关性分析检查变量对之间的线性相关性。这可以通过结合 corr()函数和 sns.heatmap()来实现。

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

相关性分析(图片由作者提供)

注意,这是在分类变量编码之后(如“特征工程”一节),因此热图中不仅显示数字变量。

为什么我们需要相关性分析?

  • 识别独立变量之间的共线性-线性回归假设独立要素之间没有共线性,因此如果存在共线性,则必须删除一些要素。在这个例子中,没有一个独立变量与另一个高度相关,因此不需要删除任何变量。
  • 识别与目标密切相关的独立变量——它们是强有力的预测因素。再一次,我们可以看到“吸烟者”与费用相关。

特征工程

EDA 带来了一些关于什么类型的特征工程技术适合数据集的见解。

1.对数变换

我们发现目标变量“费用”是右偏的,服从幂律分布。由于线性回归假设输入和输出变量之间存在线性关系,因此有必要对“费用”变量进行对数变换。如下图,应用 np.log2() 后数据趋于正态分布。除此之外,剧透一下,这个转换确实把线性回归模型得分从 0.76 提高到了 0.78。

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

转型前的“费用”

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

转型后的“费用”

2.编码分类变量

机器学习算法的另一个要求是将分类变量编码成数字。两种常见的方法是一热编码和标签编码。如果你想了解更多的区别,请查看:“特征选择和机器学习中的 EDA”。

这里我比较一下这两者的实现和结果。

  • 一个热编码
df = pd.get_dummies(df, columns = cat_list)

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

一个热编码结果

  • 标签编码

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

标签编码

然而,这两种方法都导致模型得分为 0.78,这表明选择任何一种都不会在这个意义上产生显著差异。

模型实现

简单的线性回归, *y = b0 + b1x,*预测一个自变量 x 和一个因变量 y 之间的关系,例如,经典的身高-体重相关性。随着更多特征/独立变量的引入,它演变成多元线性回归 y = b0 + b1x1 + b2x2 + … + bnxn,这不能容易地使用二维空间中的线来绘制。

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

简单线性回归(图片由作者提供)

我从 scikit-learn 应用了 LinearRegression() 来实现线性回归。我指定了 normalize = True ,这样独立变量将被规范化并转换成相同的标度。scikit-learn 线性回归利用普通最小二乘法找到拟合数据的最佳直线。因此,由系数 b0,b1,b2 … bn 定义的线使观测目标和预测值之间的残差平方和最小(图中的蓝线)

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

线性回归模型(图片作者提供)

实现非常简单,并返回一些属性:

  • model.coef_:系数值— b1,b2,b3 … bn
  • model.intercept_:常量值— b0
  • model.score:有助于评估模型性能的预测的确定性 R 平方(在模型评估部分有更详细的描述)

我们先用系数值粗略估计一下特征重要性,并可视化。不出所料,吸烟者是医疗费用的主要预测因素。

sns.barplot(x = X_train.columns, y = coef, palette = "GnBu")

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

回想一下,我们已经对目标变量进行了对数转换,因此不要忘记使用 2**y_pred 来恢复到实际预测费用。

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

模型评估

线性回归模型可以通过可视化误差分布进行定性评估。也有定量的措施,如平均误差,均方误差,RMSE 和 R 平方。

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

模型评估(图片由作者提供)

1.误差分布

首先,我使用直方图来可视化误差的分布。理想情况下,它应该多少符合正态分布。非正态误差分布可能表明存在模型未能提取的非线性关系,或者需要更多的数据转换。

2.RMSE 的梅、姆塞

平均绝对误差(MAE):误差绝对值的平均值

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

均方误差(MSE):均方误差的平均值

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

均方根误差(RMSE):平方误差平均值的平方根

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

这三种方法都是通过计算预测值ŷ和实际值 y 之间的差值来测量误差的,因此差值越小越好。主要区别是 MSE/RMSE 惩罚大的误差并且是可微的,而 MAE 是不可微的,这使得它很难应用于梯度下降。与 MSE 相比,RMSE 取平方根,从而保持原始数据比例。

3.r 平方——决定系数

r 的平方或决定系数是一个介于 0 和 1 之间的值,表示模型所解释的实际目标变量的变化量。r 平方定义为 1 — RSS/TSS,1 减去残差平方和(RSS)与总平方和(TSS)之比。更高的 R 平方意味着更好的模型性能。

残差平方和(RSS)

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

RSS(图片由作者提供)

总平方和(TSS)

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

TSS(图片由作者提供)

在这种情况下,R 的平方值为 0.78,表明模型解释了目标变量中 78%的变化,这通常被认为是一个好的比率,没有达到过度拟合的水平。

希望你喜欢我的文章:)。如果你想阅读我更多关于媒体的文章,我将非常感谢你的支持,注册媒体会员

带回家的信息

本文提供了实现线性回归的实用指南,介绍了模型构建的整个生命周期:

  1. EDA:单变量分析,散点图,相关分析
  2. 特征工程:对数变换,分类变量编码
  3. 模型实现:scikit learn LinearRegression()
  4. 模型评估:平均误差、均方误差、RMSE、R 平方

如果您对视频指南感兴趣:)

https://www.youtube.com/watch?v=tMcbmyK6QiM

更多这样的文章

原载于 2021 年 9 月 18 日 https://www.visual-design.net**的

AWS Sagemaker 中的 MLOps 实用指南—第一部分

原文:https://towardsdatascience.com/a-practical-guide-to-mlops-in-aws-sagemaker-part-i-1d28003f565?source=collection_archive---------3-----------------------

如何在 AWS Sagemaker 中实现 CI/CD 模型开发和评估管道?

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

梵高,文森特。星夜。(来源

这个指南是我自己在 AWS 上寻找一个完整的端到端的模型开发、评估和部署工作的挫折的结果。我在那里看到的所有指南和教程都只覆盖了一部分,而没有完全联系起来。我想写一些东西,帮助人们了解构建模型和部署模型的完整工作,以便前端开发人员可以在他们的网站和应用程序上访问它。

所以,让我们开始吧!

我将本指南分为两部分。

1.使用 AWS Sagemaker Studio 进行模型开发和评估。

2.使用 AWS Lambda 和 REST API 的模型部署

先决条件:

AWS 账户——运行整个教程的费用不到 0.50 美元,所以不要担心。

对 Python 的理解——如今大部分机器学习工作都是用 Python 完成的。

耐心——失败是成功最重要的先决条件,所以继续尝试,直到成功。

第 1 部分:模型开发

我们将在 Sagemaker Studio 中建立一个项目来构建我们的开发管道。

1.登录您的 AWS 账户,从服务列表中选择 Sagemaker

2.选择 Sagemaker 工作室并使用快速启动创建工作室。

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

使用快速启动选项设置 sagemaker studio。(图片由作者提供)

一旦工作室准备就绪,用你刚刚创建的用户打开工作室。创建应用程序可能需要几分钟的时间,但是一旦一切就绪,我们就可以创建项目了。需要理解的是,我们只能创建一个工作室,但是该工作室中有多个用户,并且每个用户都可以在该工作室中创建多个项目。

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

Sagemaker 控制面板。(图片由作者提供)

3.从左侧导航栏中选择 Sagemaker 组件和注册表,并选择创建项目。

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

创建项目选项。(图片由作者提供)

默认情况下,Sagemaker 提供了可用于构建、评估主机模型的模板。我们将使用一个这样的模板,并修改它以适应我们的用例。

4.从列表中选择用于模型开发、评估和部署的 MLOps 模板并创建一个项目。

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

Sagemaker 项目模板。(图片由作者提供)

一旦您的新项目被创建,您将发现 2 个预构建的存储库。第一个定义您的模型开发和评估,另一个将您的模型构建到一个包中,并将其部署到一个端点以供 API 使用。在本指南中,我们将修改第一个模板来运行我们自己的用例。

5.克隆第一个存储库,这样我们就可以修改我们需要的文件。

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

项目存储库。(图片由作者提供)

我们将要处理的用例是一个客户流失模型,用于预测客户将来是否会退订服务。由于本笔记本背后的想法是学习云中的模型开发和部署,所以我不会深入研究数据,而是直接进入管道开发。

这是我们刚刚克隆的存储库的文件结构,现在让我们看一下将要使用的一些文件。

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

存储库文件结构。(图片由作者提供)

文件夹 pipelines 包含创建我们的模型开发管道所需的文件,默认情况下,该管道被命名为鲍鱼。

pipeline.py 定义了我们管道的组件,目前,它是用默认值定义的,但是我们将为我们的用例更改代码。

preprocess.py 和 evaluate.py 定义了我们需要在管道中为预处理和评估步骤执行的代码。

codebuild-buildspec-yml 创建并编排管道。

您可以将更多步骤添加到 pipeline.py 和相应的处理文件中,模板还定义了一个 test 文件夹和一个 test_pipelines.py 文件,该文件可用于构建单独的测试管道。

6.将文件夹鲍鱼重命名为客户流失code build-build spec-yml文件中进行更改以反映这一更改。

**run-pipeline --module-name pipelines.customer_churn.pipeline \**

7.我们需要将数据下载到我们默认的 AWS s3 存储桶中以供使用,我们可以使用笔记本来完成这项工作。从 studio 中的文件选项卡在存储库中创建一个新的笔记本,选择一个带有基本数据科学 python 包的内核,然后将下面的代码粘贴到单元格中并运行。

**!aws s3 cp s3://sagemaker-sample-files/datasets/tabular/synthetic/churn.txt ./
import os
import boto3
import sagemaker
prefix = 'sagemaker/DEMO-xgboost-churn'
region = boto3.Session().region_name
default_bucket = sagemaker.session.Session().default_bucket()
role = sagemaker.get_execution_role()
RawData = boto3.Session().resource('s3')\
.Bucket(default_bucket).Object(os.path.join(prefix, 'data/RawData.csv'))\
.upload_file('./churn.txt')
print(os.path.join("s3://",default_bucket, prefix, 'data/RawData.csv'))**

现在我们需要修改 pipeline.py、evaluate.py 和 preprocess.py 中的代码来满足我们的需求。

8.出于指南的目的,从链接中复制代码以更新 pipeline.py、preprocess.py 和 evaluate.py 中的代码,但确保仔细阅读代码以更好地理解细节。

一切就绪,一旦我们更新了这 3 个文件中的代码,我们就准备好运行我们的第一个管道执行,但是当我们尝试实现 CI/CD 模板时,这将在我们提交和推送代码后自动完成。

9.从侧面导航栏中选择 GIT 选项卡,然后选择您已经修改的文件以添加到暂存区,并将更改提交和推送至远程存储库。

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

提交更改并将代码推送到远程。(图片由作者提供)

现在转到项目页面上的pipeline选项卡,选择您创建的管道以检查运行的执行情况,您应该会发现一个成功的作业在我们克隆库时自动执行,另一个作业将处于执行状态,您刚刚通过推送代码执行了该作业,现在双击该作业以查看管道图和更多详细信息。

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

管道的“执行”选项卡。(图片由作者提供)

万岁!!恭喜你刚刚完成了你的第一份培训工作。

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

管道图。(图片由作者提供)

除非出了差错,你应该看到你的工作**成功了,**但是记住如果它很容易,任何人都会做。失败是走向成功的第一步。

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

通往成功的道路是崎岖的。(图片由作者提供)

管道完成后,它将创建一个模型并将其添加到您的模型组中,因为我们已经在管道中添加了一个“手动”模型批准条件,所以我们需要选择模型并手动批准它,以创建一个可用于推理的端点。

10.转到项目主页上的模型组选项卡,选择已经创建的模型,您可以查看指标页面来查看评估阶段的结果。

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

您的模型的度量。(图片由作者提供)

11.如果您对指标满意,您可以选择右上角的批准选项来批准模型。

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

模型批准页面。(图片由作者提供)

当我们的第二个存储库出现时,一旦您批准了在第二个存储库中定义的模型部署管道,它将执行以部署和托管一个新的端点,我们可以使用它从我们的 API 进行推理。

结论

我试图让本指南保持使用 Sagemaker 的观点,因为它很长,而且还有第 2 部分要写。这里的目标是通过实现一个简单的项目来快速概述 Sagemaker 的不同组件。我给读者的建议是,不要一步一步地遵循指南,用你自己的想法和步骤进行实验,你会经常失败,但你会学到很多东西,这就是议程。希望你喜欢阅读这个指南,就像我喜欢把它放在一起一样。欢迎在评论中提出任何建议或反馈,我们很乐意听到它们。

AWS Sagemaker 中的 MLOps 实用指南—第二部分

使用 AWS Sagemaker 的 MLOps 实用指南—第二部分

原文:https://towardsdatascience.com/a-practical-guide-to-mlops-using-aws-sagemaker-part-ii-c5159b4b51aa?source=collection_archive---------16-----------------------

如何使用 AWS lambda 和 REST API 部署您的模型供全世界使用。

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

文森特·梵高的《罗讷河上的星夜》(来源)

在我们开始之前,我强烈建议你阅读第一部分,如果你还没有这样做的话。在本指南中,我们将介绍如何部署您的模型,以便前端开发人员可以在他们使用 REST API 的应用程序中使用它,而不必太担心底层细节。

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

我们需要构建一个管道,将用户的 Web 浏览器(左)连接到我们的模型端点(右)。(图片由作者提供)

由于我们已经在前一部分开发和部署了模型端点,我们将从开发 lambda 函数开始。

AWS 函数

AWS Lambda 是一种无服务器计算服务,允许您运行代码,而无需配置或管理服务器、创建工作负载感知集群扩展逻辑、维护事件集成或管理运行时。

通过使用 AWS Lambda 函数,我们可以避免设置专用服务器来监控传入的请求和执行代码。这样做有很多好处,比如每次 lambda 函数被传入的请求触发时,我们只需支付计算费用,而不是专用的服务器。

按照步骤创建一个 lambda 函数来处理传入的请求。

  1. 登录 AWS 控制台,从服务列表中选择 lambda。

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

Lambda function dashboard 显示您使用了多少存储和其他统计数据。(图片由作者提供)

2.创建一个新的 lambda 函数开始编码。

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

Lambda 函数允许您将简单的代码包部署到无服务器环境中。(图片由作者提供)

3.添加模型端点的名称作为环境变量,方法是单击 configuration 选项卡并添加一个新变量,使用关键字“ENDPOINT_NAME”和值作为开发的端点的名称。

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

添加端点名称作为环境变量将有助于我们将来在开发更好的模型时自动化这个过程。(图片由作者提供)

4.将下面的代码放入代码编辑器中,确保您将变量“**bucket”**的值替换为您自己的变量,以便它指向您在模型开发期间保存转换的位置。

注意:您可以在第 1 部分开始时创建的笔记本中找到 s3 的位置。

import os
import json
import boto3
import pickle
import sklearn
import warnings
warnings.simplefilter("ignore")# grab environment variables
**ENDPOINT_NAME** = os.environ['ENDPOINT_NAME']
**runtime**= boto3.client('runtime.sagemaker')
**bucket** = "sagemaker-ap-south-1-573002217864"
**key** = "cust-churn-model/transformation/transformation.sav"
s3 = boto3.resource('s3')def lambda_handler(event, context):

    payload = process_data(event)
    response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME,
                                       ContentType='text/csv',
                                       Body=payload)
    result = json.loads(response['Body'].read().decode())
    predicted_label = 'True' if result > 0.39 else 'False'

    return predicted_labeldef process_data(event):
    trans = pickle.loads(s3.Object(bucket, key).get()['Body'].read())
    event.pop('Phone')
    event['Area Code'] = int(event['Area Code'])
    obj_data = [[value for key,value in event.items() if key in trans['obj_cols']]]
    num_data = [[value for key,value in event.items() if key in trans['num_cols']]]

    obj_data = trans['One_Hot'].transform(obj_data).toarray()
    num_data = trans['scaler'].transform(num_data)

    obj_data = [str(i) for i in obj_data[0]]
    num_data = [str(i) for i in num_data[0]]

    data = obj_data + num_data
    return ",".join(data)

5.在我们执行 lambda 函数之前的最后一步,lambda 函数使用 vanilla python3 来执行,默认情况下没有安装任何库,如 Pandas、NumPy 或 sklearn。因此,我们需要添加一个 sklearn 层,以便可以加载我们的转换。

现在,我将不会进入如何创建和添加一个层的细节,因为这是一个单独的主题,你可以在这里找到更多的细节。

一旦完成,我们就准备好测试我们的 lambda 函数,选择测试下拉菜单来配置一个测试用例,并将下面的输入数据粘贴到其中来运行测试。

{
  "State": "SC",
  "Account Length": "15",
  "Area Code": "836",
  "Phone": "158-8416",
  "Int'l Plan": "yes",
  "VMail Plan": "no",
  "VMail Message": "0",
  "Day Mins": "10.018992664834252",
  "Day Calls": "4",
  "Day Charge": "4.226288822198435",
  "Eve Mins": "2.3250045529370977",
  "Eve Calls": "0",
  "Eve Charge": "9.97259241534841",
  "Night Mins": "7.141039871521733",
  "Night Calls": "200",
  "Night Charge": "6.436187619334115",
  "Intl Mins": "3.2217476231887012",
  "Intl Calls": "6",
  "Intl Charge": "2.559749162329034",
  "CustServ Calls": "8"
}

6.一旦您运行测试,lambda 函数将通过转换将输入数据运行到我们已经部署的端点,以获得对数据的响应。

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

如果一切顺利,您将看到模型的响应。(图片由作者提供)

构建 REST API

API 是一组用于构建和集成应用软件的定义和协议。它有时被称为信息提供者和信息用户之间的契约—建立消费者所需的内容(调用)和生产者所需的内容(响应)。

在我们的例子中,lambda 函数是生产者,它使用模型端点来预测消费者提供的输入*(调用)*的分数,消费者可以是前端开发人员开发的任何 web 应用程序。

  1. 从 AWS 服务列表中选择“【API Gateway】,选择****【创建 API】**选项,创建一个新的 REST API。

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

使用 REST API,我们可以将模型提供给前端应用程序。(图片由作者提供)

2.从 API 列表中选择 REST API 并点击 build。

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

构建一个新的 REST API。(图片由作者提供)

3.选择新的 API,给它一个好听的名字,然后创建。确保将端点类型保留为区域。

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

将端点类型保留为区域。(图片由作者提供)

4.点击动作下拉菜单,选择 “创建资源”。 创建新资源。接下来,再次单击 Actions 并创建一个新的 Post 方法。

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

5.一旦你创建了一个 Post 方法 你会得到一个选项来将这个方法与你创建的 lambda 函数集成,输入你的 lambda 函数的名字继续。

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

确保你所有的项目(lambda,API,Sagemaker studio,s3)都在同一个区域。(图片由作者提供)

一旦创建了 API,就需要部署它。正如你所看到的,仪表板显示了你的 API 的架构,以及它是如何集成到你的 lambda 函数中的。

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

与 lambda 函数一起部署的 API 结构。(图片由作者提供)

6.您可以通过点击动作选项卡并选择部署 API 选项来部署 API。这将为您提供一个链接,您可以使用它向您的模型端点发送 Post 请求。

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

确保在复制调用 URL 之前选择 post 方法。(图片由作者提供)

将这一切结合在一起

现在是测试我们的模型结果是否可以通过我们的部署公之于众的时候了。我们可以使用 Postman 来测试我们的 API。

在 Postman 中创建一个新的测试,粘贴您从 REST API 中创建的链接,选择 Body 作为输入类型,选择 POST 作为请求类型,并提供输入数据。

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

Postman 可用于在部署到生产环境之前测试您的 API。(图片由作者提供)

一旦你点击发送,它将发送一个请求给你的 API,API 将把请求传递给 lambda 函数以获得响应。

万岁!!您已经构建了一个完整的端到端的模型部署管道。

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

响应将由 Postman 连同一些统计数据一起提交。(图片由作者提供)

结论

总之,我们有。

  1. 在 AWS 上构建了完整的 CI/CD 兼容模型开发管道。
  2. 使用 AWS lambda 函数执行预处理来访问模型端点。
  3. 构建了一个 REST API 来向前端应用程序公开我们的模型。
  4. 使用 Postman 测试我们的管道。

在这个阶段,你应该花点时间回顾一下你做过的所有事情,并试着想出新的很酷的实验来做得更好。

如果你觉得我的工作有帮助,这里是你可以做的。

发表评论让我知道你的想法,或者如果你发现任何问题。

与你的朋友分享这篇文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值