被遗忘的算法
用 Streamlit 探索蒙特卡罗模拟
乔纳森·彼得森在 Unsplash 上拍摄的照片
TL;博士—当我们谈论机器学习时,我们经常会想到有监督和无监督的学习。在本文中,我想讨论一个经常被遗忘但同样强大的算法:蒙特卡罗模拟。我将分享一个通用的设计框架和一个交互式工具的营销应用程序。最后,你也可以在文末找到一个不错的模拟工具列表。
免责声明: 此非 Streamlit 赞助。我交替使用数据科学和机器学习。
喜欢读什么? 跟我上 中LinkedInTwitter。查看我的《 用机器学习影响 》指南。它有助于数据科学家更好地交流。**
不配的那个
在最近的机器学习(ML)兴起中,监督和非监督学习算法,如深度学习的分类和 KNN 的聚类,得到了大多数的关注。当这些算法从热情的社区获得谄媚的赞美时,同样强大而优雅的东西平静而安静地坐在黑暗的角落里。它的名字是蒙特卡洛**——原子物理学、现代金融和生物医学研究以及赌博领域被遗忘且不配的英雄(或者是恶棍,取决于你对这些事情的看法)。**
注:为了简洁起见,我将监督和非监督学习方法称为“ML 算法”,将蒙特卡罗方法称为“模拟”。
简短的历史
斯坦尼斯劳·乌拉姆、恩利克·费密和约翰·冯·诺依曼——洛斯阿拉莫斯的天才们——在 20 世纪 30 年代发明、改进并推广了蒙特卡罗方法,为了一个不那么高尚的事业(提示:这不是为了炸弹)*。观看视频了解更多信息。*
蒙特卡洛模拟简史(YouTube)
蒙特卡洛模拟是什么?
如果要我用一句话来总结蒙特卡洛模拟,那就是:假装十亿次,直到我们知道真实情况。
在技术(也是更严肃的)层面上,蒙特卡罗方法的目标是在给定各种输入、不确定性和系统动态的情况下,逼近对结果的 期望。这个视频为感兴趣的人介绍了一些高级数学。
蒙特卡洛近似, YouTube
为什么使用模拟?
**如果我要强调模拟相对于 ML 算法的一个(过于简化的)优势,那就是:探索。我们用模拟来理解任何规模的任何系统的内部运作(例如,世界、社区、公司、团队、个人、车队、汽车、车轮、原子等。)
通过模拟虚拟地重新创建一个系统,我们可以计算和分析假设的结果,而无需实际改变世界或等待真实事件的发生。换句话说,模拟允许我们提出大胆的问题和制定策略来管理各种未来结果,而没有太多的风险和投资。
何时使用模拟,而不是 ML?
知名仿真专家 Benjamin Schumann 认为,仿真是过程驱动,而 ML 是以数据为中心。为了产生好的模拟,我们需要理解系统的过程和基本原理。相比之下,我们可以通过使用来自数据仓库的数据和一些现成的算法,使用 ML 创建相当好的预测。
换句话说,创建好的模拟通常在经济上和认知上更加昂贵。我们为什么要使用模拟?
好吧,考虑三个简单的问题:
- 您的数据仓库中有代表业务问题的数据吗?
- 你有足够的这些数据——数量上和质量上的——来建立一个好的 ML 模型吗?
- 预测比探索更重要吗(例如,提出假设问题并制定策略来支持业务决策)?
如果你的答案是否定的,那么你应该考虑使用模拟而不是最大似然算法。
如何设计一个蒙特卡罗模拟?
要创建蒙特卡洛模拟,至少需要遵循 3 个步骤:
模拟过程,作者的分析
如您所见,创建蒙特卡洛模拟仍然需要数据,更重要的是,需要对系统动态的一些理解(例如,销售量和价格之间的关系)。要获得这样的知识,通常需要与专家交谈、研究流程和观察真实的业务操作。
又一个模拟器
要了解基本概念是如何实现的,你可以去 另一个模拟器——这是我用 Streamlit 开发的一个交互工具。****
在欢迎页面上,您可以尝试各种输入设置,并观察结果如何根据您应用的功能而变化。
欢迎页又一个模拟器,作者的作品
除了基本示例,该工具还包括 4 个案例研究,讨论各种设计技术,如影响图、灵敏度分析、优化以及将 ML 与模拟相结合。
例如,在 CMO 的例子中,我讨论了如何使用影响图来帮助设计一个模拟来解决广告预算分配问题。
影响图,作者作品
最后,你将接替首席营销官(CMO)的数据科学家职位。你的目标是帮助 CMO 决定在广告上花多少钱,探索各种场景,并想出在不同的不确定性下最大化回报的策略。
广告预算分配,作者的工作
我希望这些例子能说明蒙特卡罗模拟是如何工作的,与最大似然算法相比,它在允许我们探索方面的优势,以及如何用不同的设计技术设计有用的模拟。
一些案例研究仍在积极进行中。在这里 注册 以便在他们准备好的时候得到通知。
综上
我希望这篇文章提供了对蒙特卡罗方法的另一种看法;在今天的 ML 讨论中,我们经常忘记这样一个有用的工具。模拟有许多传统 ML 算法无法提供的优势——例如,在巨大的不确定性下探索大问题的能力。
在即将发表的文章中,我将讨论如何在真实的商业环境中结合 ML 和模拟以获得两个世界的最佳效果,以及如何阐明不同模拟场景的含义。
敬请关注我上中 ,LinkedIn,或Twitter。****
直到下一次,
伊恩
如果你喜欢这篇文章,你可能也会喜欢这些:
每个懒惰的全栈数据科学家都应该使用的 5 套工具
towardsdatascience.com](/the-most-useful-ml-tools-2020-e41b54061c58) [## 12 小时 ML 挑战
如何使用 Streamlit 和 DevOps 工具构建和部署 ML 应用程序
towardsdatascience.com](/build-full-stack-ml-12-hours-50c310fedd51) [## ML 和敏捷注定的联姻
如何在 ML 项目中不应用敏捷
towardsdatascience.com](/a-doomed-marriage-of-ml-and-agile-b91b95b37e35) [## 数据科学很无聊
我如何应对部署机器学习的无聊日子
towardsdatascience.com](/data-science-is-boring-1d43473e353e) [## 抵御另一个人工智能冬天的最后一道防线
数字,五个战术解决方案,和一个快速调查
towardsdatascience.com](/the-last-defense-against-another-ai-winter-c589b48c561) [## 人工智能的最后一英里问题
许多数据科学家没有充分考虑的一件事是
towardsdatascience.com](/fixing-the-last-mile-problems-of-deploying-ai-systems-in-the-real-world-4f1aab0ea10) [## 我们创造了一个懒惰的人工智能
如何为现实世界设计和实现强化学习
towardsdatascience.com](/we-created-a-lazy-ai-5cea59a2a749)
流行工具
当我讨论模拟时,许多人询问关于工具的建议。这是我知道的工具列表,选择适合你的目的的。享受吧。
- AnyLogic (这大概是仿真专业人士的必备工具;免费增值)
- Simio (免费增值)
- 亚赛 (Excel 插件,免费)
- 甲骨文水晶球(免费增值)
- SimPy (Python 包,免费)
- Hash (在编写本报告时以秘密模式启动。相当坚实的创始团队。大概是免费增值)
参考
决策树的历史——http://pages . stat . wisc . edu/~ loh/Tree progs/guide/loh isi 14 . pdf
聚类历史—https://link . springer . com/chapter/10.1007/978-3-540-73560-1 _ 15
结婚时间模拟与 ML——https://www . Benjamin-Schumann . com/blog/2018/5/7/结婚时间模拟模型与机器学习
仿真分类—https://gamingthepast . net/theory-practice/Simulation-design-guide/
什么是蒙特卡洛,它是如何运作的——https://www.palisade.com/risk/monte_carlo_simulation.asp******
如何设计更丰富的可视化效果
用静态可视化更有效地向观众传播信息的 5 个技巧
数据可视化是成为数据科学家的必备技能。大多数时候,我们完全专注于学习如何使用可视化工具,我们没有停下来思考在制作可视化时我们应该遵循的设计原则和良好实践。可视化提供了一目了然的关键见解,它们比原始数据更有效地传达了一个想法。这主要是因为人脑无法同时处理大量数据。然而,仅仅向观众提供视觉效果是不够的,还必须进行适当的设计。可视化设计极大地影响了信息传达给观众的速度。出于这个原因,从布局到颜色、标签和背景的每个元素都必须经过挑选,以便于信息的传输。
本文简要解释了最重要的设计原则以及如何应用它们来使可视化更具知识性和更易于处理。我们将一步一步地重新设计视觉效果,这样你就可以了解这些原则是如何帮助你更有效地理解信息的。此外,我们提供了对 Github 库的访问,在那里你可以找到这篇文章中使用的代码。
顺便提一下,我想提一下,本文中解释的所有技术都是针对静态可视化的。这些可视化可以在印刷报纸、静态报告或公司演示中找到。它们只关注特定的数据故事,观众无法实时修改。相反,交互式可视化允许用户通过与数据交互来回答问题。因此,应该使用其他原则和工具来设计它们。
照片由absolute vision在 Unsplash 上拍摄
假设你是一名数据记者**,你正在写一篇关于马竞自 2011 年 12 月迭戈·西蒙尼加盟以来的表现的文章。你想传达给观众的关键信息是马竞的防守比它的直接对手强得多。为此,您执行以下可视化操作,该操作描述了过去 10 个赛季西班牙顶级球队的进球情况。**
在这里,你有一个特定的信息要传达给你的读者。然而,这种可视化并不能一目了然地传达这一信息。但是,你如何改进这种形象化,不仅更快而且更有效地向观众传达信息呢?接下来,我将向你展示 5 种技术,你可以将它们应用到你的可视化中,使它们更具知识性。我们开始吧!💜
“卓越的图形能够在最短的时间内,用最少的笔墨,在最小的空间里,向观众传达最多的思想。”
爱德华·塔夫特[1]
1.数据-油墨比
****数据-油墨比率是由爱德华·塔夫特在八十年代早期引入的概念,指的是显示实际数据的绘图油墨与可视化中使用的总油墨(数据-油墨+非数据油墨)的比例。
数据-油墨比率=数据-油墨/总油墨
根据 Tufte 的说法,设计可视化时的一个关键方面是获得高数据-墨水比率。为了实现这一目标,我们必须强调包含信息的元素(在这种情况下是剧情的线),并尽量减少那些没有给观众带来任何信息且专门用于装饰目的的元素。非数据墨水包括(1) 3D 和阴影效果,(2)框架,(3)网格线,(4)边框和(5)背景。当这些元素对可视化没有任何价值时,它们应该被删除,这样最重要的信息就突出来了。****
现在,是时候应用 Tufte 的设计原则和减少非数据墨水出现在我们的可视化中了。在这种特殊情况下,我们只需移除顶部和右边界。然而,如果您的可视化包含上述元素中的另一个,您应该认真考虑消除它。
2.颜色
误用颜色是制作可视化效果时的一个常见问题,因为它通常用于美学目的而非信息目的。色彩在讲故事中起着关键作用,可以战略性地用于指示观众往哪里看**【2】。**
在最初的情节中,所有的线条都有明亮的颜色,并且都在平等地争夺观众的注意力。为了克服这个缺点,上面的视觉效果被重新设计,除了我们想要强调的红色的之外,所有的线都使用了灰色,给观众一个在哪里看的提示。****
的颜色有的含义 与之相关的。因此,在设计可视化效果时,重要的是要记住颜色可以唤起某些情绪并相应地使用它们来避免误解【2】。红色通常与危险和谨慎的感觉联系在一起,并与消极的结果联系在一起。由于这个原因,当涉及到可视化时,必须谨慎使用它。然而,这种情况是一个例外,因为你可能知道,足球队也有代表性的颜色。任何熟悉西班牙足球联赛的读者都会将红色与马德里竞技联系在一起,因此,在这种情况下,使用另一种颜色(而不是红色)可能会产生误导。
此外,我们还可以将灰色用于次要元素,如标题、标签和轴,以使我们的数据更加突出**。**
3.行距
前注意属性帮助我们快速识别视觉效果中的某个元素【3】,而无需我们有意识的行动。这是通过修改一个特定元素的外观来实现的,使它从其余的数据中突出出来。这些属性是有效的,因为我们的大脑能够立即注意到环境中的差异。在前面的部分中,我们只使用了颜色(红色对灰度)作为预先注意的属性来突出显示可视化的特定行;然而,你可以用更多的预先注意属性来吸引观众的注意力。
Colin Ware 将前注意属性分为 4 大类[5]:
- 颜色:这个类别包括两个属性(1)颜色色相和(2)颜色强度。色调用于区分类别,而颜色强度可以携带数值[2]。
- 形式:我们可以改变一个元素的形式,比如它的大小、长度、曲率,或者方向,如果我们想要强调它。****
- ****空间位置:该视觉编码包括 2D 定位、立体深度、凹凸定位【6】等属性。
- ****运动:这种前注意属性在交互式可视化中特别有用,可以吸引观众的注意力。
正如我之前提到的,前注意属性可以一起使用;例如,我们不仅可以改变元素的颜色**,还可以改变元素的形状(线宽),以更有效地吸引查看者的注意力,如下图所示。**
4。直接贴标
大多数可视化工具,如 Matplotlib 或 Seaborn,默认情况下都提供了一个图例来表示可视化中的数据序列。然而,使用图例有一个缺点。查看者必须不断地在图例和图表之间来回扫描,这是一个非常耗时的可视化过程。或者,对于线图,我们可以直接标记数据序列,而不是提供颜色编码的图例,如下所示。这样做,我们使图表更清晰,更容易理解。
现在,最后一次修改:标题:)
5.标题和副标题
我们可以有策略地使用标题来描述我们想要传达给读者的主要思想,而不仅仅是像我们最初做的那样给出一个无聊的数据描述。在这种特殊的情况下,我们希望观众不要认为马德里竞技队拥有西班牙联赛中最好的防守,因此我们将这一想法放在可视化的标题上,使读者一眼就能理解图形的主要信息。此外,我们提供与副标题上的数据相关的补充信息**,以确保可视化的正确解释。最后,我们在左边对齐标题和副标题。通过这样做,我们可以确保读者首先关注这些信息。**
瞧啊。现在,我们有了一个更引人注目的视觉效果,可以有效地传达一个特定的想法!看出区别了吗😉
以前
在…之后
Github 知识库
下面的 Github 库包含一个 Jupyter 笔记本,在这里你可以找到所有用于创建可视化的代码。
** [## amandaiglesiasmoreno/可视化
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
github.com](https://github.com/amandaiglesiasmoreno/visualizations)
好消息是,我没有使用复杂的工具来制作这些可视化效果。一切都是用 Matplotlib 完成的。💛
有趣的视频
在 Youtube 上观看了一系列关于数据可视化的视频后,我决定写这篇文章。这些视频让我认真地重新考虑了我到目前为止进行可视化的方式,并让我学会了许多有趣的数据可视化技术,我肯定会将这些技术应用到我未来的图表中。这些视频由谷歌数据分析师科尔·努斯鲍默解说,并基于她的书用数据讲故事:商业人士数据可视化指南。
它们只持续一个半小时,所以不要犹豫去看它们!💜
-
整理你的可视化数据
-
巧用色彩
-
你看到了吗?对比的力量
数据可视化清单
在写这篇文章的时候,我看到了斯蒂芬妮·常青树和安·k·埃莫里创建的一个非常有用的清单。您可以使用此列表作为开发高效数据可视化的指南💙。
参考
[1]爱德华·塔夫特。定量信息的可视化显示。第二版,美国图形出版社,1991 年。
[2]科尔·努斯鲍默。巧用色彩【视频文件】。2015 年 10 月 1 日【引自 2020 年 10 月 30 日】。可用从:https://www.youtube.com/watch?v=AiD6etOB6qI&t = 1200s。
[3] Udacity。atributos Pre-aten ao[视频文件]。2015 年 2 月 23 日【引用于 2020 年 10 月 30 日】。可用从:https://www.youtube.com/watch?v=AiD6etOB6qI&t = 1200s。**
[4]科尔·努斯鲍默。用数据讲故事:商业专家数据可视化指南。第一版,美国威利,2015。
[5]科林·韦尔。信息可视化:设计感知。第三版,爱思唯尔,1999 年。
[6]巴勃罗·埃尔南德斯。了解大脑是如何工作的!;2020 年 2 月 13 日[引用于 2020 年 10 月 31 日]。来自:https://www.diabetesaustralia.com.au/gestational-diabetes
感谢你阅读❤️
阿曼达·伊格莱西亚斯**
如何用 Python 设计专业的维恩图
使用 matplotlib-venn 绘制时尚专业的维恩图的快速指南
两个都没有反应。来源:作者
上周,我为我的 Python 课程设计了一些阅读材料。讲座主题是 Python 集 。
为了说明一些功能,我想画出 维恩图 。是的,你经常在数据演示中发现的重叠圆形图。
来源:吉菲
我对用于设计专业外观维恩图的开源工具的搜索引导我找到了像 Canva、 元图表 和 Creately 这样的工具。虽然它们有吸引人的设计,但没有一个具备所需的优雅,而且很少可以定制。
在谷歌搜索深处的某个地方,我遇到了 matplotlib-venn ,并爱上了它。
matplotlib-Venn库允许你完全定制你的文氏图,从圆的大小到边框类型和线宽。这是使用该库生成的样本图。
由作者生成并清理。代码来源于图书馆主页。
在将这个库用于多个项目之后,我决定分享我通过本教程所学到的东西。我将解释如何使用matplotlib-Venn创建你自己的专业维恩图。
设置
本教程中的所有例子都是在运行 Python 3.7 的 Jupyter 笔记本上测试的。我们将在本教程中使用 matplotlib-venn。
本教程有一个附带的 Jupyter 笔记本这里 。
维恩图介绍
文氏图 是用来描绘不同组或集合之间的逻辑关系的图示。
每个组用一个圆来表示。每个圆圈的大小对应于群体的大小/重要性。
这些圆之间的重叠表示两个集合之间的交集。因此,这些图对于识别每个集合之间的共享元素特别有用。
让我们看一个例子来更好地说明。假设你有一群选修多门课程的学生。这些科目中有两门是英语和法语。
English = {**'John'**, 'Amy', 'Howard', 'Lucy', **'Alice'**, 'George', 'Jacob', 'Rajesh', 'Remy', 'Tom'}French = {'Arthur', 'Leonard', 'Karan', 'Debby', 'Bernadette', **'Alice'**, 'Ron', 'Penny', 'Sheldon', **'John'**}
两个科目各有十名学生。爱丽丝和约翰都学英语和法语。
文英语和法语课。来源:作者
现在,我们将使用维恩图来可视化这些集合。
两个圆圈一样大。这是因为这两个集合有相同数量的学生。
两个圆之间的重叠部分包含两个对象:爱丽丝和约翰。
现在,我们了解了什么是维恩图,让我们用 Python 来设计一些。
如何使用 Python 创建维恩图?
第一步,导入需要的库:matplotlib-Venn和 matplotlib 。然后,我们定义希望绘制的集合:
最后,我们将使用 matplotlib-venn 的[**venn2**](https://python-graph-gallery.com/170-basic-venn-diagram-with-2-groups/)
函数绘制我们的文氏图:
venn2([English,French])
输出:
Venn 由 venn2 函数绘制。来源:作者
该函数将两个集合的列表作为参数,并绘制所需的文氏图。
我们还可以给剧情和单个圈子添加标签。
输出:
三组维恩图
现在,让我们再考虑两个科目:数学和理科。
Math = {'Amy', 'Leo', 'Ash', 'Brandon', 'Sara', 'Alice', 'Ron', 'Annie', 'Jake', 'Zac'}
Science = {'Dexter', 'Geeta', 'James', 'Charles', 'Sammy', 'Brandon', 'Aayush', 'Josephy', 'Casey', 'Will'}
我们现在将绘制一个包含三组内容的维恩图:英语、法语和数学。我们使用[venn3](https://pypi.org/project/matplotlib-venn/)
函数来实现这一点:
输出:
正如所料,这三个集合之间存在重叠。所有布景都有共同的爱丽丝。
现在,让我们考虑用科学而不是数学作为第三套。
输出:
我们看到,科学是一个 不相交的集合 ,与其他圆圈没有任何重叠。
假设有一门叫做消防安全的必考科目,每个人都必须参加。我们可以通过取一个 集合所有科目的 来定义它。
输出:
使用组的大小
有时我们没有现成的定义。我们只知道这些集合的大小以及它们之间的重叠量。在这样的情况下,我们使用 子集参数 :
subsets
是一个包含三个值的元组:
- 包含在集合 A 中,但不包含在集合 B 中
- 包含在集合 B 中,但不包含在 A 中
- 集合 A 和 B 的交集
venn2(subsets = (50, 20, 10), set_labels = ('Set A', 'Set B'))
你可以在这里 找到更多使用子集 的细节和例子。
改变颜色和透明度
虽然默认颜色(红色和绿色)适合大多数情况,但是您可以根据自己的方便选择不同的颜色。
set_colors
参数允许我们设置组的颜色。
alpha
参数允许我们控制透明度。
venn2([English, French], set_labels = ('English Class', 'French Class'), set_colors=('darkblue', 'yellow'), alpha = 0.8);
输出:
使用设置颜色和阿尔法。来源:作者
添加自定义边框
我们还可以在维恩图中添加自定义边框。我们通过在原始轮廓上叠加定制轮廓来实现这一点。
我们使用**venn2_circles**
和**venn3_circles**
绘制这个轮廓。看一看:
图表周围的额外粗轮廓。来源:作者
我们还可以分别使用linewidth
和linestyle
参数选择边框的宽度和样式。
宽度为 3 且样式为虚线的轮廓。来源:作者
更多的例子可以在 这里找到 。
使用 Id 进行自定义
我们也可以使用它们的 id 访问维恩图的每个元素。
下图显示了 2 组和 3 组文氏图中每个区域的 id。
您可以使用**get_patch_by_id**
方法自定义图表中每个区域的颜色。我们还可以使用**get_label_by_id**
方法定制每个区域的文本。
看一看:
来源:作者
请注意,交叉区域现在是紫色的,左边的圆圈上写着“新文本”。
更多关于定制的细节可以在 这里 。
结论
matplotlib-Venn库允许你完全定制你的文氏图,从圆的大小到边框类型和线宽。它可以用来制作二组和三组维恩图。
建议不要设计超过三组的维恩图。这仍然是一个 打开的问题库里的 。
你可以在这本附带的 丘比特笔记本 中找到所有的片段。
希望你觉得这个教程有用。
Chaitanya Baweja 渴望用工程解决方案解决现实世界的问题。在 Twitter 和 Linkedin 上关注他的旅程。
使用 Python、SQL 和 Tableau 创建实时群组
队列是在选定时期内具有共同特征的一群人,如 2019 年 6 月毕业的硕士生或在美国出现首例新冠肺炎后报名参加网飞免费试用的用户。
有几个队列变异,但假设只有两个队列。在三月或四月注册网飞的用户。随着时间的推移,在分析群组中用户的行为之后,我们可以了解群组的“质量”,例如订阅、客户终身价值或每个用户每天观看的平均时间。
虽然《网飞》的下载和订阅数量因爆发而增加,但群组分析有助于我们进行比较,并提供更多关于用户“享受”或哪部电影有助于留住客户的见解。
群组分析对于理解几代人在特定时期的行为也很重要,比如像新冠肺炎这样的外部冲击。
在社会隔离时期,人们花更多的时间在社交媒体上。下面你会看到在互联网上消费内容时,不同代人(群体)之间的差异。
在本文中,我们将分析一个来自 UCI 的著名在线零售数据集,并了解如何在离线(Python)和在线(SQL-Tableau stack)中设计群组分析。
【http://archive.ics.uci.edu/ml/datasets/Online+Retail/
Python 部分(离线)
数据集包含客户 id、国家、价格、数量等,但我们只需要 customer id 和 InvoiceDate 列。
首先,我们丢弃重复的值并删除缺失的值。然后,我们使用 transform 函数找到每个用户的第一个订单日期,并计算下一个订单日期之间的日期差。
我们将 999 设置为第一个订单日期的虚拟,因为这些订单不计入留存而计入流失。
我们可以很容易地使用数据透视表创建群组,并在右侧添加“总计”列。根据客户第一次购买或注册的时间对他们进行分组是很常见的。
(对于 Tableau 中的离线分析,我们将数据框保存为 excel 格式。)
478 名客户在 2011 年 11 月下了第一笔订单。其中 144 名用户在同一个月再次订购,13 名用户在下个月(2011-12 年)再次订购。
321%的顾客不再订购。这就是为什么我们把 999 作为第一批订单的虚拟订单。
我们根据用户数量来标准化群组表,因为更常见的是以百分比来分析群组。
SQL 部分(在线)
让我们假设 online_retail 模式下的“orders”表中的数据集和每个用户购买的一条记录。我们在 Python 部分中使用 SQL 中的 first_value 函数计算第一个订单日期。
然后,我们使用 datediff()函数计算订单日期之间的日期差,并使用 case when 为第一个订单设置 999。现在,我们准备连接到 Tableau 中的数据源,并在下面的 Tableau 视频之后分析群组。
画面部分(在线)
如果您有任何问题,可以通过 Twitter 或 LinkedIn 联系我。
越狱
我们应该如何设计推荐系统
TL;博士——我们被 YouTube 或亚马逊等公司设计的推荐算法所禁锢。这些算法产生了难以逃脱的回音室。我想要能带来刺激的东西,更重要的是,在不剥夺便利的同时还能掌控一切。在这篇文章中,我想介绍一下我用 Streamlit 构建的独立电影应用 YAME 。我用它作为例子来讨论为未来设计更好的机器学习系统的原则。
免责声明: 本文不是由 Streamlit 或我工作的任何公司赞助的。所有观点都是我自己的。
喜欢读什么? 跟我上 中LinkedIn,或者*Twitter*。**
仓鼠、飞轮和魔法
推荐系统驱动互联网。公司设计推荐算法来吸引你的注意力。这些算法推动你的手指滚动,就像一只仓鼠在飞轮上(或下面)。对仓鼠来说,这可能很有趣,但对人类来说,这似乎是个陷阱。
当你看着屏幕时,你的头脑(或手指)释放出人类发明的最强大的魔法:股票价格。你的关注推高了设计飞轮的公司的价格,即脸书、亚马逊、网飞和谷歌(简称 F.A.N.G)。一切都很好,对吗?尤其是对那些拥有这些股票的人来说。今年圣诞节一切都变了。
截至 2020 年 1 月 20 日,雅虎财经
高度个性化的监狱
*圣诞节期间,我重新看了一遍我最喜欢的电视节目《T2 越狱》,突然意识到:虽然我在身体上是自由的,但我被数字化囚禁了。我对我的社交媒体订阅源 — **显示的话题不再那么好奇,这些订阅源是根据我的兴趣定制的。*真是讽刺。
对于《越狱》的主角迈克尔·斯科菲尔德来说,他的牢房是这样的:
对我(和我们中的许多人)来说,当我去 YouTube 时,我的牢房看起来是这样的:
作者分析,2020 年 1 月 17 日— Youtube 登陆页面
好吧,我的牢房没有马天如的那么吓人。是的,我会收到基于我(和我妻子)感兴趣的高度个性化的内容。然而,还有两个问题。
***首先,事情变得无聊。*由于效用的急剧减少,我对相同的内容越看越不感兴趣。事实上,我经常花更多的时间寻找有趣的内容,而不是实际观看建议。
第二,用户不能轻易(也不能真正)探索。YouTube 或 Instagram 等平台确实提供探索功能,如 YouTube 的趋势和 Instagram 的探索订阅。但是,这些功能并没有提供简单的用户界面,无论是有意还是无意,以允许用户真正探索。具有讽刺意味的是,内容仍然主要取决于你的历史观和平台想要推广什么以获得更高的广告收入。
作者分析,2020 年 1 月 20 日——Youtube 趋势页面
作者分析,2020 年 1 月 20 日-Instagram Explore Feed
现在我们被困住了。社交平台用源源不断的个性化信息创造了美丽迷人的墙。但是当我们试图越过那堵墙窥视时,我们会意识到这是一个无边的陷阱。
和 YAME 一起越狱
我想出去!我想利用科技带来的便利探索更多。如果我愿意的话,我想选择呆在我的牢房里(不是每个人都想或需要一直满足他们的好奇心)。我想控制我所看到的东西。
*但是,我知道我不是迈克尔·斯科菲尔德,我们也不是在电影里。所以,我们不要拆掉并重新设计 YouTube、网飞或 Instagram。相反,让我们通过专注于一个特定的用例来一次迈出一小步:**找到一部好电影来看。*这成了我持续的痛点。
考虑到这一点,我创建了一个名为 YAME 的小应用。它代表又一部电影探索者。YAME 是您在工作日、周末、约会夜或家庭聚会时寻找好电影的唯一应用程序。
YAME 有一个设计原则:通过在便利和控制之间取得平衡来为用户提供选择。所以,YAME 有三个特性:
- ***“今日精选”*来自 58,000 多部电影,跨越时间和流派
- 根据年份和流派过滤
- 智能探索让用户决定
***便利:*登陆页面有五部系统推荐的电影。它每天更新。该算法跨年份、跨流派挑选电影;它试图做到不偏不倚。
特点一:今日精选
一些控制:如果你不喜欢你看到的或者只是想知道那里有什么,你可以使用左边的面板选择年份和流派。
特点 2:选择方便
更多控制而不牺牲便利:**如果你真的想要别的东西,你可以基于探索你今天用一个简单的界面感受 有多“冒险”。这个 UI 允许用户有一个 选项来选择 。用户可以决定他们想看什么,而不会认知超载。
功能 3:智能探索:用户定义的探索
有兴趣或需要为这个周末挑选一部电影吗?这里 可以试试 YAME 。它对网络和手机都很友好。
有了 YAME,至少,我希望提供一个有用的和周到的工具,这样你就可以和你的朋友和家人(或独自)度过一段美好的时光。我希望这篇文章能让你更加意识到数字监狱对你好奇心和智力健康的影响。
超越亚美
从更大的角度来看,我想敦促设计和机器学习(ML)社区重新思考推荐系统如何更好地服务于用户,同时平衡与广告商或商家的利益。考虑到所有相互竞争的优先事项和利益,这是一个棘手的问题。
出于娱乐目的拥有不太理想的推荐系统相对来说是良性的,但是当这些系统被用来影响观点和社会运动时,后果就要严重得多了。今天, YouTube 推荐算法已经在分化和激进我们的社区。
我认为核心问题是推荐系统已经从你我这样的用户手中夺走了选择的权力。推荐算法和用户界面让我们很难选择我们想看的,很难选择我们想探索的,更重要的是,选择我们想的。**
我们需要重新平衡。尽管创建一个最大化每个人利益的解决方案是困难的,而且经常是不可能的,这里是给设计师和 ML 实践者的一个建议:让我们至少给用户提供可访问的选项来选择。这可以体现在用户体验、算法设计或两者之中。
同时,如果你喜欢并想支持 YAME,请查看我的Patreon页面。支持将用于支付运行和改进 YAME 的费用(如服务器、网站等)。).
祝你快乐,下次再见。你可以在中LinkedIn,或者Twitter上找到我。****
伊恩
如果你喜欢这篇文章,你可能也会喜欢这些……
每个懒惰的全栈数据科学家都应该使用的 5 套工具
towardsdatascience.com](/the-most-useful-ml-tools-2020-e41b54061c58) [## 数据科学很无聊
我如何应对部署机器学习的无聊日子
towardsdatascience.com](/data-science-is-boring-1d43473e353e) [## 被遗忘的算法
用 Streamlit 探索蒙特卡罗模拟
towardsdatascience.com](/how-to-design-monte-carlo-simulation-138e9214910a) [## 我们创造了一个懒惰的人工智能
如何为现实世界设计和实现强化学习
towardsdatascience.com](/we-created-a-lazy-ai-5cea59a2a749) [## ML 和敏捷注定的联姻
如何在 ML 项目中不应用敏捷
towardsdatascience.com](/a-doomed-marriage-of-ml-and-agile-b91b95b37e35) [## 你被解雇了
如何发展和管理一个快乐的数据科学团队
towardsdatascience.com](/i-fired-a-data-scientist-a137fca5b80e) [## 抵御另一个人工智能冬天的最后一道防线
数字,五个战术解决方案,和一个快速调查
towardsdatascience.com](/the-last-defense-against-another-ai-winter-c589b48c561) [## 人工智能的最后一英里问题
许多数据科学家没有充分考虑的一件事是
towardsdatascience.com](/fixing-the-last-mile-problems-of-deploying-ai-systems-in-the-real-world-4f1aab0ea10)****
如何摧毁 DeepMind 研究测验
DeepMind 是一家前沿的英国人工智能(AI)公司,旨在解决人工通用智能(AGI)。当他们的围棋程序 AlphaGo 击败了世界冠军 Lee Sedol 时,他们成了家喻户晓的名字。
在 Unsplash 上拍摄的 ThisisEngineering RAEng
小测验
注:我在 2019 年 6 月通过了研究小测验。从现在到那时,他们的采访内容可能已经改变了(不过我对此表示怀疑)。
DeepMind 的研究工程职位技术性很强。为了确保候选人有很强的技术背景,他们进行了一次两小时的测验。
测验由四部分组成:计算机科学、数学、统计和机器学习。问题的范围如此之广,这需要几乎包罗万象的知识。
准备小测验似乎让人不知所措。更糟糕的是,他们给出的准备材料清单包括两本教科书,三门在线课程,以及剑桥大学一年级数学和统计学课程的课堂笔记链接。
看两本厚厚的教材已经不现实了。在下面的部分,我会告诉你实际上需要做些什么来破坏这个测验。
准备
提交完学士论文后,我有一个月的时间准备小考。为了找出最有效的准备方式,我向在 DeepMind 工作的人和之前做过测试的人征求了意见。
我的大部分准备工作都集中在 Goodfellow 等人的深度学习书籍上。我还看了 David Silver 的强化学习(RL)课程,但这并不是必需的,因为测验的 RL 部分是可选的。
我创建了一个 Anki deck 来帮助我记忆面试所需的一切。创建和记忆这个套牌让我对深度学习的基础有了深刻的欣赏和理解。
要获得 DeepMind Anki deck 的副本,请从我的 Google Drive 下载。
我的 DeepMind Anki 卡组中的示例卡
计算机科学
对于计算机科学的问题,我会建议你复习计算机科学学位的标准内容。
测验的这一部分要求具备标准计算机科学学位主题的知识,如线程、数据结构、死锁、排序算法、编程范例和网络。还是那句话,你只需要知道如何定义事物。因此,没有必要阅读整个 CLRS 。
来自我的 DeepMind Anki Deck 的计算机科学卡示例
数学
数学问题侧重于线性代数、微积分和数值方法的概念。这一轮你还得手动微分或积分一个方程。所以,记得温习一下链条规则和零件整合。
为了复习代数、微积分规则、三角恒等式,我推荐阅读拉马尔大学的数学笔记并回答问题。笔记内容全面,制作精良。它们使得快速学习概念并付诸实践变得容易。
为了培养对线性代数概念的卓越直觉,我强烈推荐观看 3Blue1Brown 的《线性代数的本质》。有一个坚实的线性代数基础将使学习机器学习概念的数学变得容易得多。
来自我的 DeepMind Anki 卡组的线性代数卡
统计学和机器学习
我与一位前 DeepMind 研究工程师交谈过,他们告诉我阅读深度学习的书籍。
按照他的建议,我读了这本书,并在卡片上加了一张卡片,用来回答任何可以被称为“是什么”的问题。
这一部分的问题从定义一个特定的矩阵及其属性到解释不同的架构如何工作。
DeepMind Anki 牌组中的一张牌
结论
在我为小测验学习的一个月里,我学到了很多。当我通过测验时,我很高兴。但是知道我对我的领域有了全新的理解,感觉好多了。
不幸的是,我没能通过最后一次面试(现场前),但我在所有的面试中都有很好的经历。
我希望我的 Anki deck 或本文中的链接内容能帮助你在 DeepMind 的面试过程中取得成功。或者,任何其他基于机器学习的面试过程,你在未来的角色。
奥马尔·里德——你可以在 LinkedIn 和 T2 的 Twitter 上找到我。
Reddit 资源
来自 Reddit 用户的过去的问题
Reddit 上的一般讨论
如何检测和处理多重共线性
关于识别和修复数值变量多重共线性的详细说明
照片由 Jaxon Lott 在 Unsplash 上拍摄
多重共线性是需要排除的主要假设之一,以获得任何回归模型的更好估计 ✌️
在本文中,我将通过一个示例数据集来介绍多重共线性的影响、如何识别以及何时解决这个问题。
👉什么是相关性?
两个变量之间的相关性可以用范围在-1 到 1 之间的相关系数来衡量。如果值为 0,则两个变量是独立的,没有相关性。如果测量值非常接近这些值中的一个,则表示线性关系,并且彼此高度相关。这意味着一个变量的变化与其他变量的显著变化相关联。
相关性可以用皮尔逊相关系数和斯皮尔曼秩序系数来计算。
👉什么是多重共线性?
当回归分析中的独立变量之间存在高度相关性时,会发生多重共线性,这会影响对结果的整体解释。它降低了系数的功效,削弱了统计测量以信任 p 值来识别显著的独立变量。因此,我们无法检验自变量对因变量的个别解释。
👉何时修复多重共线性?
好消息是修复多重共线性并不总是强制性的。这完全取决于回归模型的主要目标。
多重共线性的程度会极大地影响 p 值和系数,但不会影响预测和拟合优度检验。如果您的目标是执行预测,并且没有必要理解自变量的重要性,则没有必要解决多重共线性问题。
👉如何检验多重共线性?
- 相关矩阵/相关图
- 变动通货膨胀系数(VIF)
相关图可用于确定两个独立变量之间的相关性或双变量关系,而 VIF 用于确定一个独立变量与一组其他变量的相关性。因此,为了更好地理解,最好使用 VIF。
VIF = 1 →不相关
VIF = 1 比 5 →中度相关
VIF > 10 →高度相关
让我们从代码开始……
这是数据集[ 房屋销售 ]的链接
数据集中的要素如下。销售价格是目标变量,其余为独立特征。
数据集的前几行
用数值变量识别多重共线性
现在我们将计算每个独立变量的 VIF 分数。
def vif_scores(df):
VIF_Scores = pd.DataFrame()
VIF_Scores["Independent Features"] = df.columns
VIF_Scores["VIF Scores"] = [variance_inflation_factor(df.values,i) for i in range(df.shape[1])]
return VIF_Scoresdf1 = df.iloc[:,:-1]
vif_scores(df1)
每个独立功能的 VIF
大多数变量的 VIF 分数都高于 10。如果我们使用此数据集构建回归模型,单个系数和 p 值将受到很大影响。我们将继续讨论如何解决这个问题。
修复多重共线性—丢弃变量
我们将考虑删除具有高 VIF 值的房间的特征*室内(平方英尺)*和 #,因为相同的信息被其他变量捕获。此外,它还有助于减少数据集中的冗余。
让我们比较一下去掉 VIF 值前后的 VIF 值。
突出显示的特征被移除并计算 VIF 分数
从上文中,我们可以注意到,在去掉高价值(室内(平方英尺)和房间数量)【VIF 特征】后,其他变量的 VIF 得分也降低了。
修复多重共线性—组合变量
接下来,我们可以观察到床的数量和洗澡的数量可以合并为一个变量,这有助于我们从这两个变量中获取更多信息。
*df5 = df4.copy()
df5['Total Rooms'] = df4.apply(lambda x: x['# of Bed'] + x['# of Bath'],axis=1)
X = df5.drop(['# of Bed','# of Bath'],axis=1)
vif_scores(X)*
床的数量和浴室的数量组合成一个单一的功能房间总数
从上面,我们可以注意到所有三个变量(公寓费、税和总房间数)都达到了令人满意的 VIF 值,我们可以进一步建立回归模型。
总结
在本文中,我们学习了如何识别和修复回归分析中数值的多重共线性问题。这是一个迭代过程,我们还需要领域知识来决定对哪些变量采取适当的行动。还有其他技术,如 PCA 和正则化方法也可以解决这个问题。
请访问我的 GitHub 链接获取完整的[ 代码
感谢阅读,快乐学习!🙂
如何检测人工智能中的偏差
偏见
检测数据中常见的(认知)偏差
随着人工智能解决方案在我们的日常生活中变得更加根深蒂固,人工智能偏见在过去几年中一直是一个热门话题。作为一个转行做数据科学的心理学家,这个话题很贴近我的内心。
为了防止人工智能模型出现偏差,人们首先必须意识到各种偏差的存在。
在中,为了发现偏见,人们必须意识到它的存在。
为了做到这一点,本文将指导你在开发人工智能的不同阶段发现许多常见和不常见的偏见。这些阶段包括:
- 数据收集
- 数据预处理
- 数据分析
- 建模
希望了解你可能遇到的偏见将有助于你开发更少偏见的人工智能解决方案。
1.什么是偏见?
偏见被认为是对一个想法或事情的不成比例的倾向或偏见。偏见通常被认为是在人类的背景下,但它可以存在于许多不同的领域:
- 统计数据 —例如,统计数据的系统失真
- 研究—例如,偏向于发表某些有意义的实验结果
- 社会科学 —例如,对某些人群的偏见
在本文中,我们将结合(认知)偏见可能出现的几个领域,以了解偏见如何进入人工智能。
下面,我将介绍人工智能发展的常见阶段,并确定检测偏差的步骤。
2.数据收集
数据收集是你会发现偏见的第一个也是最常见的地方之一。最大的原因是数据通常是由人类收集或创建的,这使得错误、异常值和偏差很容易渗入数据中。
数据收集过程中发现的常见偏差:
**Selection Bias**
—以样本不代表总体的方式选择数据
例如,在许多社会调查研究中,研究人员利用学生作为参与者来测试他们的假设。学生显然不能代表一般人群,可能会使研究结果产生偏差。
选择偏差
**The Framing Effect**
—带有特定倾向的调查问题。
如下图所示,如果这个问题是正面的,人们更有可能拯救 200 条生命,相比之下有 33%的机会拯救所有人。
72%的参与者在积极的框架下选择了治疗 A(“拯救 200 条生命”),当同样的选择出现在消极的框架下(“400 人会死”)时,这一比例下降到了 22%。
**Systematic Bias**
—这是一个一致的、可重复的误差。
这通常是设备故障的结果。纠正这种错误很重要,因为错误很难检测。对机械或工艺的良好理解是必要的。
系统误差
**Response Bias**
— 参与者对问题回答不准确或错误的一系列偏差。
问卷中经常出现回答偏差。由于这些都是由参与者填写的,人类的偏见很容易在数据中找到自己的位置。例如,**Social Desirability Bias**
指出,人们很可能会在他们的反应中否认不受欢迎的特征。这可以通过强调好的行为或理解坏的行为来实现。类似地,**Question Order Bias**
指出人们可能会根据问题的顺序不同地回答问题。
了解您如何设计收集流程会对您将要收集的数据类型产生重大影响,这一点很重要。如果不小心,你的数据会强烈偏向某些群体。任何由此产生的分析都可能是有缺陷的!
3.数据预处理
处理数据时,可以采取许多步骤来为分析做准备:
**Outlier Detection**
您通常希望移除异常值,因为它们可能会对某些分析产生不相称的影响。在所有人都在 20 到 30 岁之间的数据集中,年龄为 110 岁的人很可能不太能代表数据。
**Missing Values**
如何处理某些变量的缺失值会引入偏差。如果您要用平均值填充所有缺失的值,那么您是有目的地将数据推向平均值。这可能会让你偏向某些行为更接近平均值的群体。
**Filtering Data**
我见过很多次这种情况,数据被过滤得太多,几乎不能代表目标人群。这就介绍了,在某种程度上,**Selection Bias**
到你的数据。
4.数据分析
当开发一个人工智能解决方案时,最终的产品可能是一个模型或算法。然而,在数据分析中也很容易发现偏差。通常,我们在数据分析中会看到以下偏差:
**Misleading Graphs**
—歪曲数据的扭曲图表,从而可能从中得出不正确的结论。
例如,在报告分析结果时,数据科学家可以选择从 0 开始绘制图表的 y 轴。虽然这不会在数据本身中引入偏差,但随着差异变得更加明显,可能会出现明显的**Framing**
(见下图)。
如果 Y 轴从 0%开始,作物产量的差异似乎很小。然而,简单地将其更改为从 70%开始会导致看似不同的观点,而结果实际上是相同的。
如果你想了解更多关于误导性图表的影响,强烈推荐《如何用统计数据撒谎》这本书!
**Confirmation Bias**
——倾向于关注证实自己先入之见的信息。
假设你相信癌症和喝酒有很大的关系。当你进行分析时,你只是通过不考虑任何混淆变量来确认这个假设。
确认偏差
这可能看起来像一个极端的例子,你永远不会做的事情。但现实是,人类天生就有偏见,很难改变这一点。这种事发生在我身上的次数比我愿意承认的次数还要多!
5.建模
当谈到人工智能中的偏见时,人们通常指的是以某种方式偏向某一群人的人工智能系统。一个很好的例子是亚马逊创建的雇佣算法 ,它显示了**Gender Bias**
的决策。他们用于该算法的数据主要由担任技术职务的男性组成,这导致该算法倾向于将男性作为高潜力候选人。
这是一个典型的**Garbage-in-Garbage-out Phenomenon**
的例子,你的人工智能解决方案和你使用的数据一样好。这就是为什么在开始数据建模之前检测数据中的偏差如此重要。
让我们来了解一下在创建预测模型时经常看到的几种偏见:
**Bias/Variance Trade-Off**
——在偏差(模型的基本假设)和方差(使用不同数据时预测的变化)之间的权衡。
具有高方差的模型将过于关注训练数据,并且不能很好地概括。高偏差,另一方面,假设数据总是以相同的方式运行,这很少是真的。当增加你的偏差时,你通常会降低你的方差,反之亦然。因此,我们经常寻求平衡偏差和方差。
展示了偏差和方差之间权衡的影响。
**Concept Drift**
—目标变量的统计特性随时间以不可预见的方式变化的现象。
假设您创建了一个模型,可以预测在线商店中客户的行为。这个模型开始时很棒,但是一年后它的性能就下降了。一年来,顾客的行为发生了变化。客户行为的概念已经改变,并对您的模型质量产生负面影响。
解决方案可以简单地是用新数据频繁地重新训练你的模型,以便与新的行为保持同步。然而,一个全新的模型可能是必要的。
随着时间的推移和新数据的添加,原始数据(左)与概念漂移(右)的对比。
**Class Imbalance**
——(目标)类别出现频率的极度不平衡。
假设你想分类一张图片是包含一只猫还是一只狗。如果你有 1000 张狗的图片,只有 10 张猫的图片,那么就有一个**Class Imbalance**
。
阶级不平衡的结果是模型可能偏向多数阶级。由于数据中的大多数图片都是狗的,因此模型只需要总是猜测“狗”就可以达到 99% 的准确性。现实中,模型还没有学会猫和狗图片的区别。这可以通过选择正确的验证措施来补救(例如,平衡准确度或 F1 分数代替准确度)。
6.下一步是什么?
在阅读了你的人工智能解决方案中的所有这些潜在偏见之后,你可能会想:
“但是我如何从我的解决方案中消除偏见呢?”—你
我认为要解决偏见,你需要了解它的来源。知道是成功的一半。之后,就要靠你自己想办法消除或处理这种特定的偏见了。例如,如果您发现问题源于数据中的选择偏差,那么最好添加额外的数据。如果类别不平衡使您的模型更偏向于多数群体,那么您可以研究重新采样的策略(例如,SMOTE)。
注:关于常见认知偏差的互动概述,请参见这一惊人的可视化。
如果你和我一样,对人工智能、数据科学或心理学充满热情,请随时在 LinkedIn 上添加我。
如何在 MLOps 监控中检测模型漂移
Adrià Tormo 在 Unsplash 上拍摄的照片
人工智能在各行各业的采用率都在迅速上升。随着新冠肺炎的出现,消费者和企业对数字技术的采用在 T4 的八周时间内已经向前跨越了五年。然而,部署 ML 的复杂性阻碍了 AI 系统的成功。MLOps,特别是 ML 模型的生产面临的挑战与 DevOps 监控出现之前困扰软件的挑战相似。
ML 中的运营挑战
与传统代码不同,ML 模型是独特的软件实体,由于部署后输入到模型中的数据的变化,其性能会随着时间而波动。因此,成功的人工智能部署需要持续的 ML 监控,以在持续的基础上重新验证其商业价值。
ML 团队可以使用模型性能指标,如 AUC、precision、recall 等。监控生产模型的实时性能。然而,这些指标需要这些实时预测的“基础事实”或标签。虽然标签在训练数据集中总是可用的,但是对于给定的用例,它们可能不总是在生产中可用。例如,当一个模型对贷款风险进行预测时,贷方将只知道贷款是否违约或在贷款期限内是否得到全额偿付。在没有这些输入的情况下,或者为了补充这些性能指标的可见性,监控生产特征和预测分布的变化可以用作性能问题的领先指标和故障排除工具。
已部署模型中的数据更改(图片由作者提供)
什么是漂移
漂移是实体相对于基线的变化。数据漂移是模型漂移的基础,被定义为数据分布的变化。在生产 ML 模型的情况下,这是实时生产数据和基准数据集(可能是训练集)之间的变化,基准数据集代表模型打算执行的任务。由于现实世界的变化,随着时间的推移,生产数据可能偏离或偏离基线数据。预测值的漂移是概念漂移或数据完整性问题的一个很好的代理,并且可以通知模型重新训练节奏
最大似然漂移的类型 根据所比较的数据分布,可能有四种类型的漂移
- 概念漂移或 P(Y|X)的变化是模型输入和输出之间实际关系的变化。概念漂移的一个例子是,当宏观经济因素使贷款风险更高,有资格获得贷款的标准更高。在这种情况下,以前被认为有信誉的收入水平不再有信誉。
- 预测漂移或 P(Y hat 预测|X)的变化是模型预测的偏移。例如,当你的产品在更富裕的地区推出时,有更大比例的值得信赖的应用程序。您的模型仍然有效,但是您的企业可能还没有为这种情况做好准备
- 标签漂移或 P(Y 地面真实值)的变化是模型输出或标签分布的变化
- 特征漂移或 P(X)的变化是模型输入数据分布的变化。例如,所有申请人的收入增加了 5%,但经济基本面是一样的。
概念漂移本质上是真实决策边界和学习决策边界之间的差异。需要重新学习数据,以保持先前状态的错误率和准确性。如果地面实况标签可用并且足够实时,性能漂移是这种情况的最强指示器。在缺乏实时地面实况的情况下,预测和特征分布的漂移通常预示着世界上的重要变化。然而,与性能漂移不同,这些量可能会相对于精确建模的决策边界漂移(下面称为“虚拟漂移”)。在这种情况下,模型性能将保持不变。
漂移的原因 生产模型中出现漂移有多种原因。
1.当外部性导致数据分布发生真正的变化时。这可能需要具有更新的代表性训练集的新模型。
- 基本事实或输入数据分布的变化,如由于疫情、在新市场推出产品等而改变客户偏好。
- 有一个观念的转变。例如,竞争对手推出了一项新服务
2.当存在数据完整性问题时。这需要进一步的人体调查。
- 正确的数据在源处输入,但由于错误的数据工程而被错误地修改。例如,债务收入比值和年龄值在模型输入中互换。
- 来源处输入的数据不正确。例如,由于前端问题,网站表单接受将字段留空。
如何计算数据漂移
测量漂移有两种技术
- 统计:这种方法使用统计指标。这种方法的一个关键优势是用户对这些指标的理解,这些指标已经在多个行业中使用,尤其是金融和银行业。它们还有一个额外的好处,就是实现起来更简单。
- 人口稳定指数 ,流行于金融服务业,是衡量两个人口样本之间人口稳定性的指标。
人口稳定指数(参考)
- kull back–lei bler(或 KL)散度是衡量一个概率分布与第二个,参考概率分布如何不同的指标。
参考:维基百科
- Jensen-Shannon(或 JS)散度是衡量两个概率分布之间相似性的一种方法。它基于 KL 散度,有一些显著的不同,包括它是对称的,并且它总是有一个有限的值。
参考:维基百科
- Kolmogorov-Smirnov 检验 (或 KS 检验)是连续(或不连续)一维概率分布相等的非参数检验,可用于比较样本与参考概率分布(单样本 K–S 检验),或比较两个样本(双样本 K–S 检验)
参考:维基百科
2.基于模型的:这种方法使用一个模型来确定给定点或点群与参考基线之间的相似性。虽然使用基于 ML 的技术可以给出更准确的漂移图像,但是解释该技术的基础对于形成直觉来说可能是一个挑战。
如何识别漂移的原因
没有正确的工具来监控预测和特征漂移可能是乏味的。负责维护生产模型的数据科学家或 ML 工程师必须使用上述技术之一,不断将选定的实时流量窗口与基线进行比较。
捕捉到模型输出中的漂移后,下一步是确定哪些特征导致了漂移。很多时候,输入要素可能会漂移很多,但它可能不会在模型输出中造成有意义的漂移(即伪漂移),因为该要素在模型中的重要性较低。识别漂移来源包括评估要素相对于其输入重要性的潜在漂移。
在 Fiddler,我们使用 JS-Divergence 和可解释的人工智能来帮助在几个步骤中识别和排除预测和特征漂移
确定数据漂移原因(作者截图)
- 步骤 1 :快速识别实时模型输出中的预测漂移,与训练或基线集进行比较,用您在生产数据漂移阈值方面的领域知识来补充 JS-Divergence。
- 步骤 2 :再次使用 JS-Divergence,向下钻取到所选的时间窗口,查看底层特征的漂移。使用可解释性查看漂移特征的特征重要性,并只关注那些有意义的影响,过滤掉虚假漂移。
- 第三步:比较数据分布,查看实际差异,围绕模型再训练的需要形成直觉。
- 步骤 4 :进一步分析受影响的流量切片,了解漂移的性能
总之,数据变化可能是模型衰退的主要指标,因为 ML 模型是概率性的,并使用历史示例为高性能而训练。监控 ML 模型中的数据漂移有助于 ML 团队在生产中的性能问题上保持领先,可解释的 AI 通过提供强大的诊断工具来补充这一点,只需点击一下鼠标就可以找到任何可疑的时间片。
用 Python 和 YOLO 进行对象检测
使用网络摄像头的计算机视觉
摘要
在本文中,我将展示如何使用计算机视觉,并通过几行代码获得许多乐趣。
计算机视觉是人工智能领域,研究计算机如何从数字图像或视频中获得高层次的理解,以产生数字或符号信息。
计算机视觉的主要任务是图像分类和目标检测。第一种识别图像是关于什么的,并用标签对其进行分类。最好的例子是对狗和猫的照片进行分类。但是如果任务是数一张照片里有多少只狗和猫呢?这将是一个目标检测问题。对象检测处理在数字图像和视频中检测某类语义对象的实例。
(你只看一次)是最快的,因此也是使用最多的实时物体检测系统。基本上,它将单个神经网络应用于整个图像,将其划分为多个区域,然后网络预测每个区域的边界框和概率。在这篇文章中,我将使用一个预训练的 YOLO 模型来进行对象检测,因此,如果你想了解更多关于神经网络结构以及如何训练它,我建议阅读原始论文。
设置
有几种方法可以将预训练的模型用于计算机视觉,最流行的框架是 Tensorflow 和 Keras。不过我觉得 ImageAI 对于我这种懒程序员来说是最方便的工具。这个包促进了深度学习和计算机视觉的使用,因为它提供了非常强大和简单的功能来执行对象检测和图像分类。
首先,我会从这里下载预先训练好的 YOLO 的重量(文件“yolo.h5”),并将该文件存储在我电脑的某个文件夹中。
**modelpath = "mycomputer/myfolder/yolo.h5"**
然后,我可以使用 ImageAI 非常容易地加载模型:
**from **imageai** import Detectionyolo = Detection.**ObjectDetection**()
yolo.setModelTypeAsYOLOv3()
yolo.setModelPath(modelpath)
yolo.loadModel()**
现在模型已经可以进行预测了,我们只需要数据。我将使用来自我的网络摄像头的实时视频流来为模型提供真实世界的图像。
你可以用 OpenCV 包访问你的设备摄像头,它提供了一个视频捕捉对象,处理与打开和关闭网络摄像头相关的一切。
**import **cv2**cam = cv2.**VideoCapture**(0) #0=front-cam, 1=back-cam
cam.set(cv2.CAP_PROP_FRAME_WIDTH, 1300)
cam.set(cv2.CAP_PROP_FRAME_HEIGHT, 1500)**
预测
现在我们可以开始和 YOLO 一起玩了。该模型将用于逐帧预测摄像机捕捉到的图像,直到循环被中断。
**while True: **## read frames**
ret, img = cam.read() **## predict yolo**
img, preds = yolo.**detectCustomObjectsFromImage**(input_image=img,
custom_objects=None, input_type="array",
output_type="array",
minimum_percentage_probability=70,
display_percentage_probability=False,
display_object_name=True) **## display predictions**
cv2.imshow("", img) **## press q or Esc to quit**
if (cv2.waitKey(1) & 0xFF == ord("q")) or (cv2.waitKey(1)==27):
break**## close camera**
cam.release()
cv2.destroyAllWindows()**
好玩吧。这个模型也做得很好,尽管它把一个橙子识别为一个“运动球”。
我使用的最小百分比概率为 0.70,这意味着只有当模型至少有 70%的把握时,我们才能检测到物体。降低该值会显示更多的对象,而增加该值可确保检测到精度最高的对象。
********
我希望你喜欢它!如有问题和反馈,或者只是分享您感兴趣的项目,请随时联系我。
👉我们来连线👈
本文是 Python 系列 CV 的一部分,参见:
**** [## 用 Python 进行图像分类:CNN 与变形金刚
计算机视觉&用卷积神经网络、迁移学习、ViT、TensorFlow 和 HuggingFace 进行解释
pub.towardsai.net](https://pub.towardsai.net/image-classification-with-python-cnn-vs-transformers-fe509cbbc2d0) [## 使用 Python 和 OCR 进行文档解析
使用计算机视觉从任何类型的文档中检测和提取文本、图形、表格
towardsdatascience.com](/document-parsing-with-python-ocr-75543448e581)****
如何识别 R 回归模型上的异常观察值?
兰迪·法特在 Unsplash 上的照片
在这篇文章中,我将讨论一些在回归分析中如何检测异常观察值的方法。作为一个分析师,你可能要考虑筛选不寻常的观察值,这将帮助你得到一个全面的回归模型。不寻常的观察结果需要进一步调查,要么是因为它们与其他观察结果不同,要么是因为它们对模型的结果产生了不成比例的影响。
我将回顾三种不同寻常的观察结果:
极端值
高杠杆观察
有影响的观察
为了便于说明,我将使用 R 样本数据(state.x77)。这个数据集为我们提供了美国 50 个州的人口数量、平均收入、文盲率、气温和谋杀率等信息。
来自 R 的 state.x77 样本数据
使用下面的代码,我想建立一个回归模型,该模型可以根据某些州的人口、收入、文盲率和温度来预测这些州的谋杀率。同样,我们将应用 汽车 包为我们的数据扯皮。
# How to Identify Unusual Observations in Regression?
# Created by Michaelino Mervisianoinstall.packages(“car”)
library(“car”)states <- as.data.frame(state.x77[,c(“Murder”, “Population”,”Illiteracy”, “Income”, “Frost”)])
View(states) fit <- lm(Murder ~ Population + Illiteracy + Income + Frost, data=states)
summary(fit)
从总结函数中,我们发现我们的模型确实是显著的,F 统计量的 p 值<为 0.05。从 t 检验中,我们还发现文盲率和人口规模对预测一个州的谋杀率有重要意义。接下来,我们将调查在我们的模型中是否有不寻常的观察
> summary(fit)Call:
lm(formula = Murder ~ Population + Illiteracy + Income + Frost,
data = states)Residuals:
Min 1Q Median 3Q Max
-4.7960 -1.6495 -0.0811 1.4815 7.6210Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.235e+00 3.866e+00 0.319 0.7510
Population 2.237e-04 9.052e-05 2.471 0.0173 *
Illiteracy 4.143e+00 8.744e-01 4.738 2.19e-05 ***
Income 6.442e-05 6.837e-04 0.094 0.9253
Frost 5.813e-04 1.005e-02 0.058 0.9541
— -
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 2.535 on 45 degrees of freedom
Multiple R-squared: 0.567, Adjusted R-squared: 0.5285
F-statistic: 14.73 on 4 and 45 DF, p-value: 9.133e-08
异常值
回归模型不能很好地预测异常值。它们要么有非常大的正残差,要么有非常大的负残差。如果模型低估了响应值,那么它将由正残差表示。另一方面,如果模型高估了响应值,那么它将由负残差指示。
从我们的回归模型示例中,我们可以通过使用 Q-Q 图开始研究异常值观察。下面的代码有助于您绘制和发现潜在的异常值。内华达州(第 28 次观察)和罗德岛州(第 39 次观察)被检测为潜在的异常值。
> qqPlot(fit,labels=row.names(states), id.method=”identify”,
simulate=TRUE, main=”Q-Q Plot”)
Nevada Rhode Island
28 39
应用 outlierTest 函数帮助我们确认潜在的异常值是否确实是异常值。统计检验表明,内华达州不可否认地被检测为异常值,p 值= 0.048。
> outlierTest(fit)
rstudent unadjusted p-value Bonferroni p
Nevada 3.542929 0.00095088 0.047544
Q-Q 图也证实了内华达有一个大的正残差。意味着我们的模型低估了这个州的谋杀率。你可以发现内华达州的谋杀率是 11.5%,而模型预测只有 3.9%。我们清楚地知道,与其他州相比,内华达州确实不同。
> states[“Nevada”,]
Murder Population Illiteracy Income Frost
Nevada 11.5 590 0.5 5149 188> fitted(fit)[“Nevada”]
Nevada
3.878958
因此,您可以删除这个观察结果,并重新运行测试来查看是否存在其他异常值。作为一名分析师,你可能想知道为什么内华达州的谋杀率很高。也许你可以把这个问题发到 Quora 上,让我知道你是否有答案😉
高杠杆点
当我们将其与其他预测值进行比较时,如果观察值类似于异常值,则它们将被视为高杠杆点。严格地说,它们具有不常见的预测值组合,而响应值对确定杠杆作用的影响较小。
您可以通过查看模型中估计的参数数量与样本大小的比率来计算高杠杆观察值。如果观察值的比率大于平均比率的 2 -3 倍,则该观察值被认为是高杠杆点。我个人喜欢用这个简单的函数来识别高杠杆的观测值。
highleverage <- function(fit) {
p <- length(coefficients(fit))
n <- length(fitted(fit))
ratio <-p/n
plot(hatvalues(fit), main=”Index Plot of Ratio”)
abline(h=c(2,3)*ratio, col=”red”, lty=2)
identify(1:n, hatvalues(fit), names(hatvalues(fit)))
}
highleverage(fit)
高杠杆点
上图显示阿拉斯加和加利福尼亚的比例最高。这意味着如果我们将这两种状态的预测值与其他状态进行比较,这两种状态是非常不寻常的。原因如下:
对于阿拉斯加来说,该州的收入比其他州高得多,但人口较少,气温较低。
对于加州来说,这个州的人口比其他州多得多,同时收入更高,气温也更高。
与其他 48 个州相比,这两个州确实很特别。有一点要记住,并非所有高杠杆的观察都是有影响力的观察。这将取决于他们是否是离群值。
有影响的观察
对模型参数值具有不成比例影响的观察值可以被认为是有影响的观察值。例如,如果您删除一个观察,那么它会显著地改变您模型。那个单一的观察一定是有影响力的观察。因此,检查我们的数据是否包含有影响的点是很重要的。
根据我的经验,有两种有效的方法来识别有影响的观察结果:
1。 厨师的距离
下面的代码提供了一种方法来计算截止值,并为我们的每次观察绘制库克距离。该图显示阿拉斯加、夏威夷和内华达是有影响的观察点。移除这 3 个状态将对我们的回归模型中的截距和斜率值产生重大影响。
cutoff <- 4/(nrow(states)-length(fit$coefficients)-2)
plot(fit, which=4, cook.levels=cutoff)
abline(h=cutoff, lty=2, col=”red”)
每次观察的库克距离图
我需要强调的是,上面的图确实有助于识别有影响的观察,但是它没有给出关于这些观察如何影响模型的额外信息。这就是为什么增加的变量图可以成为我们挖掘更多信息的一个选项。
2。 增加了可变地块
附加变量图的工作原理是绘制每个预测变量与响应变量和其他预测变量的关系图。可以使用 car 包中的 avPlots() 函数轻松创建。
library(car)
avPlots(fit, ask=FALSE, id.method=”identify”)
从下图中,每个图中的直线是该预测变量的实际回归系数。我们可以通过想象如果代表观察结果的点被移走,线会如何变化来观察有影响的观察结果的影响。
添加了变量图
现在,我们将把来自异常值、高杠杆和有影响的观察的所有信息合并到一个单一的信息图中。我个人发现 influencePlot() 是一个非常方便的函数来表示这些不寻常的观察问题。
library(car)
influencePlot(fit, id.method=”identify”, main=”Influence Plot”, sub=”Circle size is proportional to Cook’s distance”)
影响图
上图方便地总结了我们的最终裁决。这是:
内华达州和罗德岛州是异常值。
加利福尼亚、华盛顿、纽约和夏威夷是高杠杆观察点
阿拉斯加是有影响力的观测地
我希望你发现这篇文章是有用的,并与他人分享
干杯,
米夏里诺·梅尔维西亚诺
如何开发信用风险模型和记分卡
使用 Python 进行统计信用风险建模、违约概率预测和信用记分卡开发的演练
我们都知道,并保持跟踪,我们的信用评分,不是吗?这个非常重要的数字从 20 世纪 50 年代就存在了,它决定了我们的信用度。我想我们都有一个基本的直觉,如何计算信用评分,或哪些因素影响它。参考我以前的文章,了解更多关于信用评分的细节。
在本文中,我们将详细介绍用 Python 开发数据驱动的信用风险模型的步骤,以预测违约概率(PD)并为现有或潜在的借款人分配信用评分。我们将使用高度可解释、易于理解和实施的记分卡来确定信用评分,使计算信用评分变得轻而易举。
在进行这个案例研究时,我将假设自己具备 Python 知识,并对某些统计和信用风险概念有基本的理解。
我们有很多要讲的,所以让我们开始吧。
初步数据探索和分割
我们将使用 Kaggle 上提供的一个与美国 P2P 贷款机构 Lending Club 发放的消费者贷款相关的数据集。原始数据包括 2007 年至 2014 年间发放的超过 45 万笔消费贷款的信息,其中有近 75 个特征,包括当前贷款状态以及与借款人及其支付行为相关的各种属性。参考数据字典了解每列的详细信息。
这里解释的概念和总体方法也适用于公司贷款组合。
最初的数据研究揭示了以下内容:
- 18 个要素的缺失值超过 80%。考虑到缺失值的高比例,任何估算它们的技术都很可能导致不准确的结果
- 某些与信用风险无关的静态特征,如
id
、member_id
、url
、title
- 其他预期仅在借款人违约时填充的前瞻性特征,如
recoveries
、collection_recovery_fee
。因为我们的目标是预测未来的违约概率,所以在我们的模型中包含这些特征是违反直觉的,因为这些特征在违约事件发生之前不会被观察到
我们将放弃上述所有功能。
识别目标变量
基于数据探索,我们的目标变量似乎是loan_status
。快速看一下它的独特价值和它们所占的比例也证实了这一点。
图 1:默认值的分布
基于领域知识,我们将具有以下loan_status
值的贷款归类为违约(或 0):
- 注销
- 默认
- 后期(31-120 天)
- 不符合信贷政策。状态:已关闭
所有其他值将被分类为好(或 1)。
数据分割
现在让我们将数据分成以下几组:训练(80%)和测试(20%)。我们将对训练测试执行重复的分层 k 折叠测试,以初步评估我们的模型,而测试集将保持不变,直到最终的模型评估。这种方法遵循最佳的模型评估实践。
上面的图 1 向我们展示了我们的数据,正如预期的那样,严重偏向于优质贷款。相应地,除了随机混合抽样之外,我们还将对训练/测试分割进行分层,以便测试集中的好贷款和坏贷款的分布与分割前数据中的分布相同。这是通过train_test_split
功能的stratify
参数实现的。
在任何数据清理或缺失值插补之前拆分我们的数据,可以防止任何数据从测试集泄漏到训练集,并导致更准确的模型评估。详情请参考我之前的文章。
到目前为止所做工作的代码片段如下:
数据清理
接下来是一些必要的数据清理任务,如下所示:
- 从
emp_length
列中删除文本(如年份)并将其转换为数字 - 对于所有带日期的列:将它们转换为 Python 的
datetime
格式,创建一个新列作为模型开发日期和相应日期特性之间的差异,然后删除原始特性 - 从
term
列中删除文本并将其转换为数字
我们将为上述每个任务定义助手函数,并将它们应用于训练数据集。拥有这些助手函数将帮助我们在测试数据集上再次执行这些相同的任务,而无需重复我们的代码。
特征选择
接下来,我们将执行特征选择,使用类别特征的卡方检验和数值特征的 ANOVA F 统计来确定最适合二元分类问题的特征。请参考我以前的文章,了解关于这些特征选择技术的更多细节,以及为什么不同的技术被应用于分类变量和数值变量。
根据我们对分类特征的卡方检验,p 值按升序排列如下:
图 2:卡方检验的 p 值
为了简单起见,我们将只保留前四个特性,而去掉其余的。
34 个数值特征的方差分析 F 统计显示了从 23,513 到 0.39 的大范围 F 值。我们将保留前 20 个特性,并可能回来选择更多特性,以防我们的模型评估结果不够合理。
接下来,我们将计算所选的前 20 个数字特征的成对相关性,以检测任何潜在的多重共线性变量。这些成对相关的热图将两个特征(out_prncp_inv
和total_pymnt_inv
)识别为高度相关。因此,对于我们的模型,我们也将删除它们。
图 3:成对相关
接下来,我们将简单地将所有要删除的特性保存在一个列表中,并定义一个函数来删除它们。这些特征选择技术的代码如下:
一键编码和更新测试数据集
接下来,我们将创建四个最终分类变量的虚拟变量,并通过迄今为止应用于训练数据集的所有函数来更新测试数据集。
关于我们创建虚拟变量的方式,请注意以下几点:
- 我们将对所有变量使用特定的命名约定:原始变量名、冒号、类别名
- 一般来说,为了避免多重共线性,通过
pd.get_dummies
的drop_first
参数去掉一个哑变量。但是,我们在这个阶段不会这样做,因为我们需要所有的虚拟变量来计算我们的类别的证据权重(WoE)和信息值(IV)——稍后会详细介绍。稍后,我们将为每个类别删除一个虚拟变量 - 我们也不会直接在我们的训练数据中创建虚拟变量,因为这样做会丢弃分类变量,这是我们进行 WoE 计算所需要的。因此,我们将创建虚拟变量的新数据框架,然后将其连接到原始训练/测试数据框架。
接下来,我们将通过传递到目前为止定义的所有函数来更新测试数据集。在创建虚拟变量之后,要特别注意重新索引更新的测试数据集。让我用一个实际的例子来解释一下。
考虑一个名为grade
的分类特征,其在预分割数据中具有以下唯一值:A、B、C 和 D。假设 D 的比例非常低,并且由于训练/测试分割的随机性,在测试集中没有选择在grade
类别中具有 D 的观测值。因此,grade
在训练数据中的虚拟变量将是等级:A、等级:B、等级:C 和等级:D,但是等级:D 不会被创建为测试集中的虚拟变量。我们将无法在测试集上应用拟合的模型来进行预测,因为缺少模型预期呈现的特征。因此,我们重新索引测试集,以确保它与训练数据具有相同的列,任何缺少的列都添加 0 值。0 值非常直观,因为在任何测试样本中都不会观察到该类别。
WoE 宁滨和特征工程
基于 WoE 为所有数字和分类变量创建新的分类特征是开发信用风险模型之前最关键的步骤之一,也是非常耗时的。GitHub 和其他地方提供了特定的定制 Python 包和函数来执行这个练习。然而,我更喜欢手动操作,因为它让我有更多的灵活性和对过程的控制。
但什么是悲哀和四?
证据权重(WoE)和信息价值(IV)用于特征工程和选择,并广泛用于信用评分领域。
WoE 是一种独立变量相对于目标变量的预测能力的度量。它衡量一个特定的特征在多大程度上可以区分目标类别,在我们的例子中,就是好客户和坏客户。
IV 根据我们的功能的相对重要性对它们进行排序。
根据 Baesens 等人和 Siddiqi 的研究,WOE 和 IV 分析使人们能够:
- 考虑每个变量对结果的独立贡献
- 检测线性和非线性关系
- 根据单变量预测强度对变量进行排序
- 可视化变量和二元结果之间的相关性
- 无缝比较连续变量和分类变量的强度,而不会产生虚拟变量
- 无缝处理缺失值,无需插补。(注意,我们到目前为止还没有估算任何缺失值,这就是原因。在 WoE 特征工程步骤中,缺失值将被指定为一个单独的类别)
- 评估缺失值的预测能力
证据权重
计算 WoE 公式如下:
正的 WoE 值意味着好客户的比例大于坏客户的比例,反之亦然。
WoE 特征工程的步骤
- 计算分类变量的每个唯一值(bin)的权重,例如 grad:A、grad:B、grad:C 等。
- 基于连续变量的分布和唯一观测值的数量,将连续变量归入离散的箱中,可能使用
pd.cut
(称为精细分类) - 计算连续变量的每个衍生箱的权重
- 一旦为分类特征和数值特征的每个箱计算了权重,就按照以下规则组合箱(称为粗分类)
与合并 WoE bins 相关的规则
- 每个箱应该具有至少 5%的观察值
- 对于好的和坏的贷款,每个箱应该是非零的
- 每个类别的悲哀应该是不同的。相似的组应该被聚集或组合在一起。这是因为有着相似悲哀的箱子有着几乎相同的好的或坏的贷款比例,意味着相同的预测能力
- WOE 应该是单调的,即随着仓的增加或减少
- 缺失值被单独入库
上述规则已被普遍接受,并在学术文献中有详细记载。
为什么离散化数字特征
数值特征的离散化或宁滨通常不推荐用于机器学习算法,因为它经常导致数据丢失。然而,我们的最终目标是最终基于信用评分模型创建一个记分卡。通过按照记分卡标准对新的未经训练的观察(例如,来自测试数据集的观察)进行分类来利用记分卡。
考虑到我们没有对连续变量进行分类,那么我们将只有一个具有相应系数/权重的收入类别,并且所有未来的潜在借款人将在该类别中被给予相同的分数,而不管他们的收入如何。但是,如果我们将收入类别离散化为离散的类别(每个类别具有不同的权重),从而产生多个类别,则潜在的新借款人将根据其收入被分类到其中一个收入类别中,并相应地进行评分。
自 20 世纪 60 年代 FICO 首次开发商业记分卡以来,连续变量的 WoE 宁滨已成为一种既定的行业实践,并有大量文献支持它。将文献中的连续特征离散化的一些其他理由是:
- 考虑到高昂的货币和非货币错误分类成本,法律上通常要求记分卡易于被外行人解读(这是巴塞尔协议、几乎所有央行和各种贷款实体提出的要求)。这很容易通过没有任何连续变量的记分卡来实现,所有变量都是离散化的。高分或低分的原因很容易理解并向第三方解释。与更复杂的模型相比,所有这些都使得记分卡更容易获得最终用户的“认可”
- 记分卡的另一个法律要求是,它们应该能够区分低风险和高风险 observations⁴.WoE 宁滨负责这一点,因为 WoE 正是基于这一概念
- 单调性。宁滨算法期望以这样一种方式在条柱上划分输入数据集,即如果你从一个条柱沿同一方向走到另一个条柱,信用风险指标会发生单调变化,即如果你的收入发生变化,信用评分不会突然增加。这源于一个潜在的假设,即在全球非单调 relationship⁵的情况下,预测变量可以将较高的风险与较低的风险分开
- 逻辑回归模型的一个基本假设是所有特征与目标变量的对数优势(logit)具有线性关系。收入 38000 美元的人和收入 39000 美元的人有区别吗?很有可能不是,但是把收入当作一个连续变量来做这个假设。通过基于 WoE 进行分类,我们可以让我们的模型决定是否存在统计差异;如果没有,它们可以合并在同一个类别中
- 缺失值和异常值可以单独分类,也可以与最大或最小的条柱组合在一起-因此,无需假设来估算缺失值或处理异常值
信息价值(四)
IV 计算如下:
根据 Siddiqi 的说法,按照惯例,信用评分中 IV 的值解释如下:
注意当使用二元逻辑回归模型时,IV 仅作为特征选择和重要性技术有用。
我们数据的特征工程和 IV 计算
理论讲够了,现在让我们为我们的训练数据计算 WoE 和 IV,并执行所需的特征工程。我们将定义如下三个函数,每个函数用于:
- 计算并显示分类变量的 WoE 和 IV 值
- 计算并显示数值变量的 WoE 和 IV 值
- 将权重值绘制在箱柜上,以帮助我们可视化权重和组合相似的权重箱柜
应用于分类特征grade
时,这两个函数的输出示例如下所示:
WoE 和 IV 值
悲哀情节
一旦我们计算并可视化了 WoE 和 IV 值,接下来是最繁琐的任务,即选择要组合的仓,以及是否丢弃给定 IV 的任何特征。到目前为止,我们剩下的入围功能将以下列方式之一进行处理:
- 给定离散和单调的 WoE 并且没有任何缺失值:
grade
、verification_status
、term
,不需要组合 WoE 箱或创建单独的缺失类别 - 将具有非常低观测值的 WoE 箱与相邻箱组合:
home_ownership
、purpose
- 将具有相似 WoE 值的 WoE 箱组合在一起,潜在地具有单独的缺失类别:
int_rate
、annual_inc
、dti
、inq_last_6mths
、revol_util
、out_prncp
、total_pymnt
、total_rec_int
、total_rev_hi_lim
、mths_since_earliest_cr_line
、mths_since_issue_d
、mths_since_last_credit_pull_d
- 忽略具有低或非常高 IV 值的特征:
emp_length
、total_acc
、last_pymnt_amnt
、tot_cur_bal
、mths_since_last_pymnt_d_factor
请注意,对于带有异常值的某些数字特征,我们将在排除它们后计算并绘制 WoE,这些特征将被分配到它们自己的单独类别中。
一旦我们探索了我们的特性并确定了要创建的类别,我们将使用 sci-kit learn 的[BaseEstimator](https://scikit-learn.org/stable/modules/generated/sklearn.base.BaseEstimator.html)
和[TransformerMixin](https://scikit-learn.org/stable/modules/generated/sklearn.base.TransformerMixin.html)
类定义一个自定义的“transformer”类。像其他 sci-kit learn 的 ML 模型一样,这个类可以根据我们的要求在数据集上进行转换。这个类的另一个显著优势是,它可以作为 sci-kit learn 的[Pipeline](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html)
的一部分,使用重复分层 k-Fold 交叉验证来评估我们的训练数据。以这种结构化的方式使用管道将允许我们执行交叉验证,而不会在训练和测试折叠之间有任何潜在的数据泄漏。
请记住,到目前为止我们已经使用了所有的虚拟变量,因此我们还将使用自定义类为每个类别删除一个虚拟变量,以避免多重共线性。
与 WoE 和 IV 相关的三个函数和 transformer 类的代码如下:
模特培训
最后,我们来到了涉及一些实际机器学习的阶段。我们将在我们的训练集上拟合一个逻辑回归模型,并使用[RepeatedStratifiedKFold](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RepeatedStratifiedKFold.html)
对其进行评估。注意,我们已经将LogisticRegression
类的class_weight
参数定义为balanced
。这将迫使逻辑回归模型使用成本敏感学习来学习模型系数,即,在模型训练期间惩罚假阴性多于假阳性。成本敏感学习对于不平衡数据集是有用的,这通常是信用评分的情况。参考我以前的文章了解不平衡分类问题的更多细节。
我们的评估指标将是受试者操作特征曲线下面积(AUROC),这是一个广泛使用和接受的信用评分指标。RepeatedStratifiedKFold 将在保留类不平衡的同时拆分数据,并多次执行 k 倍验证。
在对我们的训练集执行 k-folds 验证并对 AUROC 感到满意后,我们将在整个训练集上拟合管道,并创建一个包含特征名称和从模型返回的系数的汇总表。
预测时间
这一切都归结为:应用我们训练的逻辑回归模型来预测测试集的违约概率,这种方法迄今为止还没有使用过(除了一般的数据清理和特征选择任务)。我们将把预测的违约概率与实际类别一起保存在一个单独的数据框架中。
接下来,我们将绘制 ROC 曲线,PR 曲线,并计算 AUROC 和 Gini。我们的 AUROC on 测试集得出 0.866,基尼系数为 0.732,两者都被认为是相当可接受的评估分数。我们的 ROC 和 PR 曲线大概是这样的:
测试集上预测和模型评估的代码是:
记分卡开发
我们的难题的最后一部分是创建一个简单、易于使用和实施的信用风险记分卡,它可以由任何外行人使用来计算个人的信用评分,给出关于他和他的信用历史的某些必需信息。
还记得在模型训练阶段创建的汇总表吗?我们将把我们从模型中遗漏的所有参考类别附加到它上面,系数值为 0,还有另一列用于原始特征名称(例如,grade
代表grade:A
、grade:B
等)。).
然后,我们将确定记分卡应该给出的最低和最高分数。作为起点,我们将使用与 FICO 相同的分数范围:从 300 到 850。
逻辑回归模型为每个特征类别返回的系数然后通过简单的算术被缩放到我们的信用评分范围。这里的一个额外步骤是通过进一步缩放来更新模型截距的信用评分,该评分将被用作每次评分计算的起点。
在此阶段,我们的记分卡将如下所示(分数-初步列是计算分数的简单舍入):
根据您的情况,您可能需要手动调整随机类别的分数,以确保任何给定情况下的最小和最大可能分数保持在 300 和 850 之间。这里会涉及到一些尝试和错误。
计算测试集的信用分数
一旦我们有了最终的记分卡,我们就可以为测试集中的所有观察计算信用分数了。请记住,我们的训练集和测试集是虚拟变量的简单集合,用 1 和 0 表示观察值是否属于特定的虚拟变量。例如,在下图中,观察值 395346 的等级为 C,拥有自己的家,其验证状态为源已验证。
因此,在对我们的测试集进行某些调整后,信用分数是通过测试集和每个类别的最终分数之间的简单矩阵点乘来计算的。考虑上述观察结果,以及我们记分卡中截距和等级类别的以下最终得分:
直观地说,观察 395346 将从截距得分 598 开始,并由于属于等级:C 类别而获得 15 个附加分。类似地,观察 3766583 将被分配 598 加 24 的分数,因为其属于等级:A 类。我们将使用矩阵点乘跨所有特征类别自动进行这些计算。最终信用分数是适用于观察的每个特征类别的单独分数的简单总和。
设置贷款审批截止时间
那么,我们如何确定应该批准和拒绝哪些贷款呢?什么是理想的信用评分分界点,即信用评分高于该分界点的潜在借款人将被接受,而低于该分界点的借款人将被拒绝?这个分界点还应该在预期的贷款批准率和拒绝率之间达到一个微妙的平衡。
为了找到这个临界值,我们需要回到 ROC 曲线的概率阈值。请记住,ROC 曲线绘制了 0 到 1 之间所有概率阈值的 FPR 和 TPR。因为我们的目标是最小化 FPR,同时最大化 TPR,所以曲线的左上角概率阈值就是我们要寻找的。这个理想的阈值是使用尤登 J 统计量计算出来的,这是 TPR 和 FPR 之间的一个简单差异。
在我们的例子中,理想的概率阈值是 0.187。所有预测概率高于此值的观察值都应归类为违约,反之亦然。起初,与更直观的概率阈值 0.5 相比,这个理想阈值似乎是违反直觉的。但是请记住,我们在拟合逻辑回归模型时使用了class_weight
参数,该模型对假阴性的惩罚多于假阳性。
然后,我们计算这个阈值点的标度分数。如下面的代码示例所示,我们还可以根据 ROC 曲线计算每个阈值的信用评分以及预期的批准和拒绝率。这可以帮助企业根据他们的需求进一步手动调整评分截止值。
与记分卡开发相关的所有代码如下:
结论
好了,现在你有了—一个完整的工作 PD 模型和信用记分卡!完整的笔记本可以在 GitHub 上的这里找到。如果需要澄清或有其他疑问,请随意使用它或发表评论。
一如既往,如果您想讨论任何与数据分析、机器学习、金融分析或财务分析相关的问题,请随时联系 me 。
下次见,摇滚起来!
参考
[1] Baesens,b .,Roesch,d .,和 Scheule,H. (2016 年)。信用风险分析:SAS 中的测量技术、应用和实例。约翰·威利父子公司。
[2]n . Siddiqi(2012 年)。信用风险记分卡:开发和实施智能信用评分。约翰·威利父子公司。
[3]托马斯、埃德尔曼和克鲁克(2002 年)。信用评分及其应用。
[4] Mays,E. (2001 年)。信用评分手册。格兰莱克出版公司。
[5] Mironchyk,p .和 Tchistiakov,V. (2017 年)。信用风险建模的单调最优宁滨算法。
如何用 Python 开发优化模型
使用 Python 和 PuLP 的线性编程演练
在给定的情况下,如稀缺资源的分配,确定如何以最佳方式设计和操作系统,通常需要在决策中利用定量方法。数学优化是在特定情况下决定最佳行动的主要方法之一。它包括通过从允许的集合中系统地选择输入值并计算目标函数值来最大化或最小化真实函数。
优化的一些使用案例包括:
- **产品计划和库存控制:**计划订单的发放,同时避免缺货和超出产能限制
- **路线决策:**确定最具成本效益的路线的过程
- **包装问题:**在不超出容量的情况下,确定包装方式,同时最小化自由空间
- **资源计划:**确定每个项目和所需资源的数量
- **排班:**如排班工人的班次
- **选址问题:**在保证需求的同时,将运输成本降至最低的设施布局。
在本文中,我将演示一些优化问题的解决方案,利用线性编程,并使用 Python 中的 PuLP 库。
线性规划处理在决策变量上服从线性等式/不等式约束的情况下优化线性目标函数(例如最大利润或最小成本)的问题。
线性规划有三个组成部分:
- **决策变量:**决策者可以直接控制的变量。
- **目标函数:**以数学方式表达最大化或最小化数量的线性函数。
- **约束:**表示对决策变量的限制的等式或不等式的数学表达式。
让我们看一些例子。你可以查看我的 GitHub 上的 Jupyter 笔记本来获得完整的分析。
1.资源计划示例
面包店每天都做蛋糕和馅饼。它可以在一天内制作总共 30 个项目,至少必须为其计划的客户制作 5 个蛋糕和 10 个馅饼。每个蛋糕的利润是 1.5 美元,每个馅饼的利润是 2 美元。应该生产多少才能使利润最大化?
这个例子很简单,意味着它不需要我们使用 PuLP 或 Python 的任何功能,但它是理解概念的一个很好的练习。
问题的目标函数是利润最大化:
最大利润= 1.5C + 2P
受以下限制:
C >= 5,P >= 10,
但是并不是所有的问题都像这个问题一样简单,如果我们想要计算复杂问题的每个决策变量的每个约束,我们可能会遇到严重的时间问题。😅
让我们看另一个例子:
面包店在一个月的每一天都制作蛋糕和馅饼。有:1 个烤箱,2 个面包机,1 个包装打包机,一个月只工作 22 天。蛋糕需要用烤箱烤 1 天,馅饼需要 0.5 天。每个面包师需要为蛋糕工作 0.5 天,为馅饼工作 2 天。包装工需要为蛋糕工作 1 天,为馅饼工作 0.5 天。每个蛋糕的利润是 15 美元,每个馅饼的利润是 12 美元。在给定的条件下,利润最大化应该生产多少?
为了解决这个问题使用纸浆,我们将遵循共同的建模过程。
1.导入纸浆并初始化模型:
在
LpProblem()
方法中,我们定义了问题名称和目标函数的含义,目标函数可以是“LpMaximize”或“LpMinimize”。
2.定义决策变量:
在LpVariable()
方法中,我们为变量定义了一个名字,下界和上界的值,以及可以是‘整数’、‘二进制’或‘连续’的类别类型。因为我们想要一个整数值来表示蛋糕和馅饼的数量,所以我们选择 integer。
3.定义目标函数:
import pulp
from pulp import *model = LpProblem('Maximize Bakery Profits', sense= LpMaximize)
使用+=
将目标函数添加到初始化的模型中
4.定义约束条件:
C = LpVariable('C', lowBound=0, upBound=None, cat='Integer')
P = LpVariable('P', lowBound=0, upBound=None, cat='Integer')
使用+=
将约束添加到初始化的模型中。注意,约束不同于目标函数,因为它们在右边有(不)等式。
5.求解模型
model += 15 * C + 12 * P
调用求解方法model.solve()
检查解决方案的状态LpStatus[model.status]
model += 1 * C + 0.5 * P <= 30
model += 0.5 * C + 2 * P <= 60
model += 1 * C + 0.5 * P <= 22
打印优化的决策变量C.varValue
- 打印优化的目标函数
value(model.objective))
- 2.调度示例
- 一家邮局正在招聘邮递员,要求连续工作 5 天,然后休息 2 天。目标是雇佣最少数量的工人,每天所需的邮递员数量估计为:星期一:25,星期二:32,星期三:22,星期四:18,星期五:24,星期六:12,星期日:14。雇佣邮递员的最低数量是多少?
- 为了解决这个问题,我们需要写下每天需要开始工作的工人数量的限制,例如:x_0 是星期一开始工作的工人数,x_1 是星期二开始工作的工人数,以此类推。这样做,我们可以从周一到周五存储 x_0,从周二到周六存储 x_1,因为他们需要连续工作 5 天。
#Results1
Optimal
Produce 8.0 Cake
Produce 28.0 Pie
456.0
模型约束的图示
状态:最优
工人 __0 = 7.0
工人 __1 = 7.0
工人 __2 = 0.0
工人 __3 = 0.0
工人 __4 = 10.0
工人 __5 = 0.0
工人 __6 = 8.0
正如解决方案所建议的,我们总共需要雇用 32 名邮递员,其中 7 名在星期一开始工作,另外 7 名在星期二,10 名在星期五,8 名在星期天。
3.位置问题示例
#Initialize model
model = LpProblem("Minimize Number of Workers", LpMinimize)#Define decision variables
days = list(range(7))
x = LpVariable.dicts('workers_', days, lowBound=0, upbound=None, cat='Integer')#Define model
model += lpSum([x[i] for i in days])# Define constraints
model += x[0] + x[3] + x[4] + x[5] + x[6] >= 25
model += x[0] + x[1] + x[4] + x[5] + x[6] >= 32
model += x[0] + x[1] + x[2] + x[5] + x[6] >= 22
model += x[0] + x[1] + x[2] + x[3] + x[6] >= 18
model += x[0] + x[1] + x[2] + x[3] + x[4] >= 24
model += x[1] + x[2] + x[3] + x[4] + x[5] >= 12
model += x[2] + x[3] + x[4] + x[5] + x[6] >= 14# Solve model
model.solve()#Print model status
print('Status:', LpStatus[model.status])#Print solution variables
for variable in model.variables():
print ('{} = {}'.format(variable.name, variable.varValue))
假设您需要优化一家制造公司在 5 个销售地点的供应链网络,以最低的成本满足各个地点的需求。您可以决定每个地点的工厂规模,选项有低容量和高容量。一种可能性是在每个地区建立一个工厂,其优点是运输成本低,缺点是生产计划的规模要满足当地需求,不能利用规模经济。另一种可能性是建立一些具有规模经济优势的制造工厂,但需要较高的运输成本。给定每个位置的估计需求、从一个工厂到另一个工厂的可变运输成本、拥有工厂的固定成本(基于工厂规模)以及基于工厂规模的生产能力(低产能为 500,高产能为 1500)。你会如何用最小的成本解决这个问题?
需求栏显示每个地点的估计需求
列 A 到 E 显示了从索引中的位置到列中的每个位置的运输成本(即,从工厂 B 到工厂 D 的运输成本是 14)
“高 C”和“低 C”列显示了在每个位置拥有高容量和低容量工厂的固定成本(即,在位置 E 拥有低容量工厂的固定成本为 6500 美元)
- 为了解决这个问题,我们首先需要初始化我们的模型和决策变量。有两个决策变量;
- 在工厂 I 生产并运送到工厂 j 的生产数量(连续变量)
- 生产工厂的生产能力(二进制变量:如果生产能力为 s 的位置 I 的工厂开放,则为 1;如果工厂关闭,则为 0)
约束条件包括:
- 总产量必须等于总需求
- 总产量可以小于或等于总生产能力
#Initialize model
model = LpProblem('Facility Location Problem', LpMinimize)#Define decision variables
loc = ['A', 'B', 'C', 'D', 'E']
size = ['Low_C','High_C']x = LpVariable.dicts('production_', [(i,j) for i in loc for j in loc], lowBound=0, upBound=None, cat='Continuous')
y = LpVariable.dicts('plant_', [(i,s) for s in size for i in loc], lowBound=None, upBound=None, cat='Binary')#Define model
model += (lpSum([fix_cost.loc[i,s] * y[(i,s)] for s in size for i in loc]) + lpSum([var_cost.loc[i,j] * x[(i,j)] for i in loc for j in loc]))
因为 solve()方法返回 1,所以解是最优的,我们可以打印结果。
- 结果:
- 从结果中可以看出,该模型建议在地点 C 开设一个低产能工厂,在地点 A、D 和 e 开设高产能工厂。地点 B 的需求建议由地点 C 提供。这样做,我们可以实现最小成本$58850.9。
# Define constraints
for j in loc:
model += lpSum([x[(i, j)] for i in loc]) == demand.loc[j,'Demand']for i in loc:
model += lpSum([x[i, j] for j in loc]) <= lpSum([capacity.loc[i,s] * y[i,s] for s in size])
# Solve
model.solve()
对模型和解决方案进行健全性检查
# Results for production quantities
[{'prod':'{} to {}'.format(i,j), 'quantity':x[(i,j)].varValue}
for i in loc for j in loc]# Results for plant capacities based on location
[{'lowCap':y[(i,size[0])].varValue, 'highCap':y[(i,size[1])].varValue}
for i in loc]# Objective Value
print('Objective = ', value(model.objective))
工作流程图
prod quantity
A to A 145.4
A to B 0.0
A to C 0.0
A to D 0.0
A to E 1219.6
B to A 0.0
B to B 0.0
B to C 0.0
B to D 0.0
B to E 0.0
C to A 0.0
C to B 84.1
C to C 156.4
C to D 176.8
C to E 0.0
D to A 0.0
D to B 0.0
D to C 0.0
D to D 1500.0
D to E 0.0
E to A 0.0
E to B 0.0
E to C 0.0
E to D 0.0
E to E 1500.0 lowCap highCap
A 0.0 1.0
B 0.0 0.0
C 1.0 0.0
D 0.0 1.0
E 0.0 1.0Objective = 58850.9
一旦您调用了求解方法model.solve()
并打印了解的状态LpStatus[model.status]
,您可以收到以下结果。
**最优:**模型和约束运行良好,解决方案可行。您可以通过检查变量是否在预期范围内来继续。
**不可行:**没有可行的解。您可以回过头来查看约束条件。
**无界:**意味着目标函数是无界的,并且趋于无穷大。你可以回头回顾一下目标函数。
- **未定义:**最优解可能存在,但可能没有找到。可以考虑复习一下模型。
- **未解决:**解决问题前的状态。可以考虑复习一下模型。
- 如果模型状态为最佳,您可以继续并检查结果是否在预期范围内。如果是,那么模型就完成了。
- 高级主题:敏感性分析
- 如果您想要回答一些业务问题,例如如果需求增加一个单位,成本会增加多少,换句话说,需要多少利润来弥补这样的成本增加,您可以检查双值。如果您想了解约束条件是否有约束力,以及如果没有约束力,哪一个约束条件在未来需求增长的生产能力中有空间,您还可以检查每个约束条件的松弛度。
双值表示约束右侧每个单位变化的目标函数变化量。因此,如果地点 A 的需求增加 1 个单位,总成本将增加 8 美元,如果地点 B 的需求增加 1 个单位,总成本将增加 13 美元,依此类推。
每个限制的时差表示每个限制未使用的资源量。如果松弛值等于 0,则约束是绑定的,如果松弛值大于 0,则意味着它不是绑定的。在示例中,我们可以看到约束条件 C6 和 C8 没有约束力,这意味着它们没有充分利用其生产能力。在位置 A 有增加 135 产量的空间,在位置 C 有增加 82.7 产量的空间。
我希望您喜欢这些例子,并发现这篇文章对您的线性编程之旅很有用。
# Print Dual Value and Slack[{'name':name, 'dual value':c.pi, 'slack': c.slack}
for name, c in model.constraints.items()]name dual value slack
C1 8.0 -0.0
C2 13.0 -0.0
C3 8.0 -0.0
C4 10.0 -0.0
C5 12.0 -0.0
C6 0.0 135.0
C7 -7.0 -0.0
C8 0.0 82.7
C9 -7.0 -0.0
C10 -6.0 -0.0
如果你喜欢这篇文章,你可以 在这里阅读我的其他文章和 关注我上媒如果有任何问题或建议,请告诉我。✨
喜欢这篇文章吗? 成为会员求更!
I hope you enjoyed following the examples and found the article useful in your journey towards linear programming.
If you liked this article, you canread my other articles hereand follow me on Medium.Let me know if you have any questions or suggestions.✨
Enjoy this article? Become a member for more!
如何用三个简单的步骤区分梯度下降目标函数
拿起笔和纸
在 Unsplash 上拍摄的 ThisisEngineering RAEng
如今,我们可以了解通常为学术团体保留的领域。从人工智能到量子物理学,我们可以浏览互联网上的大量信息并从中受益。
然而,信息的可用性有一些缺点。我们需要意识到大量未经证实的来源,充满了事实错误(这是一个完全不同的讨论主题)。更重要的是,我们可以习惯于通过谷歌搜索来轻松获得答案。因此,我们经常认为它们是理所当然的,并在没有更好理解的情况下使用它们。
我们自己发现事物的过程是学习的一个重要部分。让我们参加这样一个实验,计算一个线性回归的梯度下降算法背后的导数。
一点点介绍
线性回归是一种统计方法,可以用来模拟变量之间的关系[1,2]。它由一个线性方程描述:
线方程(图片由作者提供)。
我们有两个参数θ₀和θ₁和一个变量x。有了数据点,我们可以找到最佳的参数来拟合我们的数据集线。
将直线拟合到数据集(图片由作者提供)。
好,现在梯度下降[2,3]。它是一种迭代算法,广泛用于机器学习(有许多不同的风格)。我们可以用它来自动找到我们生产线的最佳参数。
为此,我们需要优化由以下公式定义的目标函数:
线性回归目标函数(图片由作者提供)。
在这个函数中,我们迭代数据集中的每个点 (xʲ,yʲ) 。然后我们为 xʲ 计算一个函数 f 的值,以及当前的θ参数(θ₀、θ₁)。我们取一个结果,然后减去 yʲ。最后,我们将它平方并加到总和中。
然后在梯度下降公式(每次迭代更新θ₀和θ₁)中,我们可以在方程的右边找到这些神秘的导数:
梯度下降公式(图片由作者提供)。
这些是目标函数Q(θ)的导数。有两个参数,需要计算两个导数,每个θ一个。让我们继续,用 3 个简单的步骤来计算它们。
第一步。链式法则
我们的目标函数是一个复合函数。我们可以认为它有一个*【外层】功能和一个【内层】*功能[1]。为了计算复合函数的导数,我们将遵循链式法则:
链式法则公式(图片由作者提供)。
在我们的例子中, “outer” 部分是关于将括号内的所有内容( “inner function” )提升到 2 次方。根据规则,我们需要将*“外部函数”的导数乘以“内部函数”*的导数。看起来是这样的:
将链式法则应用于目标函数(图片由作者提供)。
第二步。权力规则
下一步是计算幂函数的导数[1]。让我们回忆一下一个导数幂律公式:
幂律公式(图片由作者提供)。
我们的*【外函数】*只是一个二次幂的表达式。所以我们把 2 放在整个公式之前,剩下的就不做了( 2 -1 = 1 ,表达式的一次幂就是那个表达式)。
在第二步之后,我们有:
将幂法则应用于目标函数(图片由作者提供)。
我们还需要计算一个*【内函数】*(公式右侧)的导数。让我们进入第三步。
第三步。常数的导数
最后一条规则是最简单的。它用于确定常数的导数:
常数的导数(图片由作者提供)。
作为常数意味着,没有变化,常数的导数等于零[1]。例如f’(4)= 0。
记住这三条规则,让我们来分解一下*“内在功能”*:
内函数导数(图片由作者提供)。
我们的梯度下降目标函数的棘手之处在于 x 不是一个变量。 x 和 y 是来自数据设定点的常数。当我们寻找我们生产线的最佳参数时,θ₀和θ₁是变量。这就是为什么我们计算两个导数,一个关于θ₀,一个关于θ₁.
让我们开始计算相对于θ₀的导数。这意味着θ₁将被视为常量。
相对于θ₀的内部函数导数(图片由作者提供)。
你可以看到常数部分被设置为零。θ₀怎么了?因为它是一个一次幂的变量( a =a ),所以我们应用了幂法则。这导致θ₀被提升到零的幂。当我们将一个数提升到零的幂时,它等于 1 ( a⁰=1 )。就是这样!我们对θ₀的导数等于 1。
最后,我们得到了关于θ₀:的整体导数
关于θ₀的目标函数导数(图片由作者提供)。
现在是时候计算关于θ₁的导数了。这意味着我们把θ₀视为一个常数。
关于θ₁的内部函数导数
与前面的例子类似,θ₁被视为一个一次幂的变量。然后,我们应用了一个幂法则,它将θ₁减少到 1。然而θ₁乘以 x ,所以我们最终得到的导数等于x
关于θ₁的导数的最终形式如下:
关于θ₁的目标函数导数(图片由作者提供)。
完全梯度下降配方
我们计算了梯度下降算法所需的导数!让我们把它们放在它们该在的地方:
包含目标函数导数的梯度下降公式(图片由作者提供)。
通过做这个练习,我们对公式的起源有了更深的理解。我们并不把它当作我们在旧书中找到的魔咒,而是积极地经历分析它的过程。我们把这个方法分解成更小的部分,我们意识到我们可以自己完成计算,然后把它们放在一起。
时不时抓起笔和纸,解决一个问题。你可以找到一个你已经成功使用的公式或方法,并试图通过分解它来获得更深层次的洞察力。它会给你很大的满足感,激发你的创造力。
参考书目:
- K.a .斯特劳德,德克斯特 j .布斯,工程数学,ISBN:978–0831133276。
- Joel Grus,从头开始的数据科学,第二版,ISBN:978–1492041139
- 乔希·帕特森,亚当·吉布森,深度学习,ISBN:978–1491914250
抛弃 Excel!Python 入门
熊猫流行 excel 的一行程序
约瑟夫·陈(Joseph Chan)在 Unsplash 上拍摄的照片:Excel 是这位甜美的女士第一次实习时发明的
Excel 过去是,现在是,将来也永远是一个优秀的工具。它的精巧令人敬畏,优雅超越贝拉·哈迪德。自从 python 出现以来,人们很难忽视它提供的易用性和灵活性。该说的都说了,该做的都做了,继续前进仍然是最大的数据优势。因此,不管你是哪种类型的数据人,或者即使你只是偶尔使用它,习惯 python 也是值得的(它是免费的)。你会问为什么是 Python?
- 如果能够超越就像组装宜家家具,那么能够 python 就像做木匠。你可以创造更多的奇迹。
- 因为其他人都在这么做。
- 用乔治·马洛里的话说,因为它就在那里。
让我们从一些基本功能开始。为了简单起见,我们只谈熊猫图书馆。启动 python 并执行以下操作:
import pandas as pd
之后,将所有文件读入文件名变量:
file1 = pd.read_excel(‘path/to/your/file1.xlsx’)
Excel: VLOOKUP
**熊猫等同:**合并
使用 VLOOKUP,您可以尝试从另一个文件中的一个 excel 列中查找一个值。您将首先:
a.在所需的列上按字母顺序对两个文件进行排序
b.使用公式:
=VLOOKUP(A2, Area in columns, column to be returned,FALSE)
来获得输出。
熊猫的对等词是一个更简单、更容易理解的合并词。这与在所需的公共列上连接数据集是一样的。在将文件 1 和 2 作为文件 1 和文件 2 导入和读入后,它是一条语句:
file1 = file1.merge(file2[['columns', 'you', 'want', 'to' ,'return']], how=’left’,on=’common-column-to-look-for’)
瞧啊。
现在保存您的结果:
pd.to_excel('save/here/path/filename.xlsx')
COUNTIF
熊猫等值: value_counts()
通常,您会希望计算一个列中某个元素的出现次数。在 excel 中,您可以这样做:
=COUNTIF(area-to-search,value-to-search-for)(#and drag it down)
接下来,您将删除重复项以获取值计数。
在 pandas 中,您可以使用下面的一个命令行程序来实现这一点:
file1[‘Column which needs counting’].value_counts()
瞧啊。
value_counts()结果
整齐
**pandas equivalent:**str . strip()
在大多数文件中,看不见的空白是一种真正的痛苦。在 excel 中,我们创建一个新列并应用公式
= TRIM('cell which needs trimming') #and drag it down
对熊猫来说,这又是一句俏皮话:
file1.column_that_needs_stripping = file1.column_that_needs_stripping.str.strip()
删除所有空间
**pandas equivalent:**str . replace(" “,”")
通常,修剪是不够的。整个列中都有不需要的空间。我习惯于在 excel 中选择列,搜索和替换空格。
Pandas 提供了一个简单的解决方案来替换列的所有字符串中的空格:
file1[‘column_to_delete_all_spaces’] = file1[‘column_to_delete_all_spaces’].str.replace(" ","")
串联
熊猫等值: +
字符串连接是 excel 中另一种流行的方法。假设您想要连接多个单元格,您可以在 excel 中这样做:
= CONCATENATE(Cell1,Cell2,Cell3,Cell4……)
找到每一个单元格并把它打下来真的很乏味。熊猫也为此提供了一个优雅的俏皮话,如下:
file1['new_column']= file1['first_col'] +’if_space_or_other_string_needed_here’+ file1['second_column']
CountA
熊猫当量:。notnull()。总和( )
Excel 的 CountA 对选定区域中所有非零单元格进行计数,并返回所有包含某些值的单元格。
= COUNTA(range)
计算非零值的 pandas 等价的一行程序如下:
file1[‘column_to_count’].notnull().sum()
相反,如果您想获得所有为 null 的列值,您可以将 notnull 更改为 isnull,瞧!
file1[‘column_to_count’].isnull().sum()
IFERROR
**熊猫等同:**菲尔娜( )
通过定义一个错误填充值,可以用 IFERROR 在 excel 中处理诸如零除法错误之类的错误。
= IFERROR(Formula that might have an error, “Value to return if error occurs”)
在 pandas 中,您可以通过使用 fillna()来完成这种错误处理
file1 = file1.fillna('Value_you_want_to_fill')
左/右
在 excel 中,您可以使用以下公式提取左侧 n 个数字或字母:
= LEFT(Cell, number of digits you want)
= RIGHT(Cell, number of digits you want)
与此相对应的熊猫如下。将“:”符号读作直到或从:
left_five_digits = file1['column'].str[:5]right_five_digits = file1['column'].str[-5:]
#the minus indicates 5 from the end, without minus, it means 5 from left
这些是我每天经常在 excel 中使用的函数,现在我经常在 python 中以惊人的速度使用它们。我希望这本书能激励你做出改变,因为每一秒都是值得的。
如何——抛弃 Ubuntu,转而使用 Arch Linux 作为深度学习工作站
我为什么要抛弃 Ubuntu?
你们中的大多数人可能在他们的工作站上使用 Ubuntu,这对于没有经验的用户来说很好。我在使用 Ubuntu 和 Tensorflow/CUDA 时遇到的一个问题是,处理 CUDA、cudnn、Tensorflow 等不同的驱动程序和版本是一件非常困难的事情。我不知道你,但一旦我有了一个工作 Tensorflow 1.15 或 2.0 环境,我通常不会再碰它,因为害怕弄乱这个神圣的配置。
使用不同的程序,如果能像使用 Google Colab 一样,在两个最常用的 TensorFlow 版本 1.15 和 2.0 之间进行切换,那就太好了,但是安装不同的 TensorFlow 版本通常会再次搞乱我的系统。
此外,Arch 一直在我的任务清单上,因为它是你能得到的最“准系统”的 Linux 发行版,这意味着与 Ubuntu 这样的“更高抽象”相比,你更接近于硬件。用他们自己的话说,Ubuntu 是为了“开箱即用,让新用户的安装过程尽可能简单”而构建的,而 Arch Linux 的座右铭是“定制一切”。与 Ubuntu 相比,更接近硬件拱门的方式要快得多(比 Windows 领先几英里),代价是更多的终端使用。
当我在过去几周使用 Arch 时,RAM 的使用通常比 Ubuntu 少一半,安装机器学习包也很容易。我可以让 TensorFlow 1.15 和 2.0 一起工作,在 Anaconda 环境中切换版本。此外,该系统工作非常稳定,因为我使用的是 Linux 的 LTS(长期支持)内核,并且通常著名的 AUR(Arch 中的用户定制包)的更新比 Debian (Ubuntu)包提前一个月发布。
总而言之,我只能照原样推荐建立一个 Arch Linux 深度学习站:
- 更快,像包会装超级快,深度学习超级增压,…
- 更稳定
- 与 Ubuntu 相比,更容易在 TensorFlow 版本之间切换。
我将把操作方法分成两部分,第一部分是“如何安装 Arch Linux”,第二部分是“如何安装深度学习工作站包”。
对于一般的“如何安装 Arch Linux”,请阅读本文。
如果 Arch 目前太复杂,你可以试试 Manjaro ,它是 Arch 的一个用户友好版本,尽管我不能保证所有的包都一样工作,因为它们略有不同。总之,它应该是一样的。
我在考虑创建一个现成的安装映像(iso 或 img),如果有足够多的人感兴趣,请在下面留下评论或给我发消息!
在新的 Arch Linux 安装上安装深度学习(TensorFlow、CUDA、CUDNN、Anaconda)设置
一旦你完成了拱门的安装(唷!)让我们先更改一些设置,让我们的系统工作得更稳定。
1.切换到最快的镜像
软件从所谓的“镜像”下载,镜像是包含所有 Arch 库的服务器。如果没有自动完成,可能会出现您的服务器尚未优化的情况。因此,我们将安装一个名为“reflector”的小工具来查找并保存速度最快的服务器
安装反射器,使用
须藤 pacman -S 反射器
查找并下载最好的服务器
反射器–verbose-l 20-n 20–排序速率–save/etc/pacman . d/mirror list
检查输出是否有意义,例如,域是否靠近您的位置。如果没有,您可以添加国家标签以获得更精确的结果,例如德国和奥地利:
reflector -c "AT,DE "-verbose-l 20-n 20-sort rate-save/etc/pacman . d/mirror list
更新您的安装
须藤 pacman -Syyu
2.改变桌面环境
如果你正在使用 Manjaro 或者选择了 Ubuntu 上的“Gnome”桌面环境,考虑改变它可能是值得的,因为众所周知 Gnome 比 Chrome 消耗更多的 RAM,而且我们的深度学习设置肯定需要 RAM。
如果你喜欢 Gnome,可以跳过这一步。另外,我可以推荐 Xfce 桌面,因为它是轻量级和丰富功能的良好结合。
下载 Xfce
sudo pacman-S xfc E4 xfc E4-goodies lxdm
Lxdm 是一个显示管理器,允许您使用多个桌面。
注销当前会话,然后按 Alt + F2(如果无效,则按 Alt + F3)获得一个终端。首先禁用 Gnome,然后“激活”Xfce:
停用并卸载 gnome:
sudo systemctl 禁用 GDM
sudo pacman-R gnome-extras
激活 Xfce
sudo systemctl 使能 lxdm
sudo systemctl 启动 lxdm
如果新的 Xfce 桌面确实打开了,只需登录并浏览,如果没有,尝试重启(sudo 重启)。如果没有帮助,继续哭,在地板上打滚,然后给我发消息或评论。
3.安装 LTS(长期支持)Linux 内核以获得更好的稳定性
Arch 以非常接近当前的 Linux 内核而闻名,如果你总是想要最新的包和 Linux 特性,这是一个好主意,但如果你正在构建一个深度学习工作站,这是一个坏主意。
这就是为什么我转而使用 LTS 内核的原因,它基本上比新版的 Linux 内核获得了更多的支持,也更加稳定。
幸运的是,在 Arch 中切换内核非常容易。首先,我们将下载内核,然后告诉引导管理器选择哪个内核。
首先下载 LTS 内核:
sudo pacman-S Linux-lts Linux-lts-headers
看看您当前的内核版本:
ls -lsha /boot
一个内核应该被命名为 vmlinuz-linux.img 和 initramfs-linux.img(您当前的版本), LTS 的内核也是如此,末尾带有-lts。
如果您看到两个内核,现在可以删除旧的内核:
sudo pacman -R linux
现在一个更高级的部分是你需要告诉你的引导装载程序选择哪个内核。问题是你用的是哪个 bootloader,但大多数情况下是 Grub。如果你遵循我的 Arch 安装教程,你的引导程序是 systemd-boot。
我的建议是尝试 Grub 的说明,如果不工作,继续其他的。
更改 LTS linux 内核的 Grub 引导加载程序
grub-mkconfig-o/boot/grub/grub . CFG
如果您看到一个错误,继续下一个引导加载程序,否则重新启动(sudo 重新启动)。
更改 LTS linux 内核的 syslinux 引导加载程序
编辑配置文件:
sudo nano/boot/sys Linux/sys Linux . CFG
只需将"-lts "添加到 vmlinuz-linux.img 和 initramfs-linux.img 中,它们就是 vmlinuz-linux-lts.img 和 initramfs-linux-lts.img
更改 LTS linux 内核的 systemd-boot 引导加载程序
如果你来自我的 Arch 安装指南,这是你的引导程序。
编辑配置文件:
sudo nano/boot/loader/entries/arch . conf
只需将"-lts "添加到 vmlinuz-linux.img 和 initramfs-linux.img 中,它们就是 vmlinuz-linux-lts.img 和 initramfs-linux-lts.img
4.安装 yay,一个安装 AUR 软件包的简单方法
你应该更喜欢使用超快的 pacman 来安装大多数软件包,但是 Arch 的一个惊人之处在于用户创建了数百万个超级容易安装的自定义软件包。你基本上可以在这个回购里找到任何你能想到的方案。
安装 git SVC
sudo pacman-S git
mkdir ~/tmp
git 克隆https://aur.archlinux.org/yay-git.git~/tmp/yay
CD ~/tmp/yay
makepkg-si
现在你可以浏览 https://aur.archlinux.org/packages/所有的 AUR 套餐,或者直接输入:
yay -S【包装】
来安装它。
5.最后,运行 TensorFlow 1.15 和 2.0 的真实 cuda、cudnn、anaconda 安装
安装 Nvidia 驱动程序,cuda,cudnn 与一个简单的命令
sudo pacman-S NVIDIA NVIDIA-utils cuda cud nn
这需要一些时间,所以喝杯咖啡或者继续下一步
下载 Anaconda,我喜欢 Miniconda:
wgethttps://repo . anaconda . com/miniconda/miniconda 3-latest-Linux-x86 _ 64 . sh~/
使其可执行并安装
cd ~/
chmod +x ./Miniconda。sh
。/Miniconda*。sh*
一切都保持默认。
来源。/bash_profile
重启你的系统
sudo 重启
安装 tensorflow
现在是决定 TensorFlow 用于 CPU 还是 GPU 的时候了。我将继续使用 GPU 选项,但如果您想运行 CPU 版本,只需从包名中删除“-gpu”即可。
为 Tensorflow 2.0 创建一个 anaconda 环境
conda create–name TF 2.0
conda activate TF 2.0
conda install pip
conda install tensor flow-GPU pandas numpy
搞定了。现在用以下命令检查结果:
python
从 tensorflow.python.client 导入 device _ lib
device _ lib . list _ local _ devices()
如果结果显示这样的设备名称,您就完成了!
2018–05–01 05:25:25.929575:I tensor flow/core/common _ runtime/GPU/GPU _ device . cc:1356]找到具有属性的设备 0:名称:GeForce GTX 3080 10GB 主要:…
为 Tensorflow 1.15 创建一个 anaconda 环境
conda deactivate
conda create–name TF 1.15
conda activate TF 1.15
conda install pip python = = 3.7
conda install tensor flow-GPU = = 1.15
并再次检查是否一切正常,您的 gpu 是否被识别:
python
从 tensorflow.python.client 导入 device _ lib
device _ lib . list _ local _ devices()
6.在一台设备上切换 TensorFlow 1.15 和 TensorFlow 2.0!
只是梦想成真在我看来,只要选择 1.15 版本与
康达激活 tf1.15
和 TensorFlow 2.0 版本
康达激活 tf2.0