TowardsDataScience 博客中文翻译 2020(三百五十五)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

可解释的监控:停止盲目飞行,监控你的 AI

原文:https://towardsdatascience.com/explainable-monitoring-stop-flying-blind-and-monitor-your-ai-4e27898f1b9?source=collection_archive---------47-----------------------

数据科学团队发现可解释的监控对于管理他们的人工智能至关重要

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

照片由布鲁斯·沃林顿

我们生活在一个前所未有的时代,短短几周时间,全球许多人和企业的生活发生了翻天覆地的变化。随着新冠肺炎在全球展开翅膀,夺走生命,我们看到失业率和小企业破产率创下新高。

那么,这种低迷如何影响一个 正在使用 AI 的企业

如今,AI 越来越多地被各行各业的公司应用,但 AI 并不是最容易操作的技术。大多数生产人工智能系统是随着时间的推移有机积累的专有、开源和基于云的技术的拼凑物。然而,在过去的几年里,出现了基于 GUI 的人工智能工具和开源库,以帮助不太倾向于内部构建、成功训练和部署人工智能模型的企业。

随着这些工具的出现,公司已经意识到培训和部署人工智能只是第一步- 然后他们必须监控和管理他们部署的模型,以确保无风险和可靠的业务成果。随着更高性能的黑盒模型的兴起,治理这些模型的需求变得更加必要,也更具挑战性。越来越多的公司认识到:

“训练和部署 ML 模型是相对快速和廉价的,但是随着时间的推移维护、监控和治理它们是困难和昂贵的。”

事实上,由于部署后输入数据的变化,模型的性能会随着时间的推移而降低,因此模型需要持续监控,以确保它们在生产中的保真度。虽然许多现有的监控技术提供了实时问题可见性,但它们通常不足以识别复杂人工智能系统中问题的根本原因。

缺乏反馈回路

大多数组织在发现生产 ML 系统的问题时已经太晚了,损害已经造成。在某些情况下,生产问题可能持续存在而未被发现,直到由 ML 系统驱动的最终业务指标下降。

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

今天的大部分人工智能是不受监控的(图片由作者提供)

企业可以通过监控领先指标(包括预测和特征漂移以及输入数据错误)来提前发现潜在问题,而不是依赖下游业务指标作为上游模型性能问题的指标。跟踪这些领先指标并能够识别意外变化,使 ML Ops 团队能够实时进行调查,而不是在事后进行调查。但是仅仅跟踪正确的度量标准只能解决一半的问题。一旦检测到转移,应尽快进行调查或根本原因分析。为了确保快速准确的根本原因分析,人工智能可解释性可用于帮助确定问题的根本原因以及应采取的行动过程(例如,根据新数据重新训练模型,修复数据管道)。

结合起来,跟踪模型性能问题的领先指标,利用 AI 可解释性帮助从业者理解问题背后的“为什么”,构成了一种新的范式,称为可解释的 ML 监控。

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

一个可解释的监控系统的架构(图片由作者提供)

传统监控解决方案中的差距

今天,有两种主要的方法来监控生产软件:

  • DevOps 使用服务或基础架构监控来获得广泛的运营可见性和服务运行状况。
  • 业务所有者通过遥测技术监控业务指标,以跟踪业务运行状况。

不幸的是,这些方法不适合 ML 系统,ML 系统的性能与传统软件系统的性能不同,具有不确定性,取决于各种因素,如季节性、新用户行为趋势以及通常非常高维的上游数据系统。例如,当新的假日季节到来时,一个功能完善的广告模型可能需要更新。类似地,一个在美国被训练用来显示内容推荐的模型,对于国际注册用户来说可能不太好。

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

AI 的出现带来了对模型性能监控的需求(图片由作者提供)

模型监控的独特挑战

**1。模型衰减。**与其他软件不同,ML 模型的性能会随着时间而衰减。对正确模型结果的监控,当可用时,提供即时的业务影响变更通知。能够监控模型衰退将帮助我们知道是否是时候刷新模型了。

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

模型性能随时间漂移(图片由作者提供)

**2。数据漂移。**尽管 ML 模型是用特定数据(如年龄 20-60 岁)训练的,但它们在生产中可能会遇到不同的数据(如年龄 60-80 岁),因此会做出次优预测。

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

漂移的类型(图片由作者提供)

**3。数据完整性。**业务数据是动态的,其构成也在不断变化。这可能会对 ML 模型产生不利的性能影响,尤其是对于自动化数据管道。在已部署的人工智能系统中,数据不一致常常会被忽视。

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

特征分布截图(图片由作者提供)

**4。离群值。**部署的 ML 模型可能会遇到远离训练分布的数据。这些异常值会导致难以全局调试的孤立的性能问题。实时查明这些问题有助于立即解决问题。检测异常值是一个具有挑战性的问题,因为有多种技术可以应用,并且多年来已经得到了很好的研究。它在 ML 模型性能的环境中变得更具挑战性,因为我们需要将异常值作为跨大量变量的多变量分析问题进行研究,并查看其对模型行为的影响,即确定它是否会导致模型行为异常。

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

模型监控截图(图片由作者提供)

5。****。即使在监测数据变化后,尽管进行了模型验证,但其对保护组的真实影响可能会发生变化,即 ML 模型在部署后可能会出现偏差。第一道防线可能是在训练过程中丢弃受保护的属性(例如,种族、性别等),但是由于与受保护的属性高度相关的其他特征,模型也可能表现出偏差。我们需要的是围绕公平性的模型的连续跟踪,其中这些度量是动态和实时计算的。偏见的定义(机会均等、结果均等等)可能因组织和问题的不同而不同,因为公平没有统一的定义。因此,我们应该能够支持一个可插拔的策略,并持续执行它来检测任何潜在的偏见问题。如果检测到偏差,深入分析原因以确定模型是否需要更换或是否存在数据管道问题非常重要。

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

车型评测截图(图片由作者提供)

什么是可解释的监控?

强大的人工智能监控系统需要与服务基础设施的模型集成,以防范上述 5 种运营挑战。它允许用户轻松查看实时监控的输出,以发现 KPI 和其他问题,或者对警报采取行动。调查已标记的操作性 ML 问题通常需要付出大量努力。ML 模型的黑盒性质使得 ML 开发人员很难理解和调试它们。

一个可解释的 ML 监控系统扩展了传统监控,提供了具有可操作步骤的深度模型洞察。通过监控,用户可以了解问题驱动因素、根本原因,并分析模型以防止问题重复出现。这有助于节省大量时间。

我们认为这样的系统应该展示 3 个关键特性:

综合。一个可解释的 ML 监控系统应该覆盖模型性能和性能指标本身的所有主要指标。除了统计上的全面,一个理想的可解释的 ML 监控系统为技术(模型开发者,ML Ops)和非技术(分析师,企业所有者)利益相关者提供直观的用户界面。

可插拔。团队应该能够将监控系统与现有数据和人工智能基础设施以及最常见的开源 ML 框架(Scikit-Learn、PyTorch、Tensorflow、Spark 等)相集成,以快速看到可操作的结果。

可操作的。用户应该能够获得生产问题背后的可操作的见解。带有更深入分析的实时解释对于快速揭示模型行为的“为什么”和“如何”至关重要。获得大量警报会产生噪音,因此系统允许用户进行必要的控制,以便只为需要采取行动的班次配置警报,这一点非常重要。

与人工智能相关的金融风险是巨大的。信任是赌注的一部分,失去比得到更容易。我们已经看到像新冠肺炎这样的黑天鹅事件会给企业带来什么。如果你的人工智能产品不受监控,你可能会向你的客户传达错误的决策。可见性,因此,将是极其重要的!

这就是为什么我们决定开始提琴手。AI 并提供了我们认为可以帮助弥合差距的系统。欢迎发送电子邮件至 info@fiddler.ai ,了解更多信息。

原载于 2020 年 4 月 13 日https://blog . fiddler . ai**

可解释的建议——为什么打开黑匣子很重要

原文:https://towardsdatascience.com/explainable-recommendations-why-opening-black-boxes-matters-bd5754af63a2?source=collection_archive---------29-----------------------

可解释推荐系统介绍

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

无论是线上还是线下的市场,都充满了你可以购买的商品。扎里亚·赖特在 Unsplash 上的照片

这篇文章是我关于可解释建议系列文章的第一部分,基于我的 BSc 论文 第二部分 展示了一个可解释的电影推荐系统的实现,而 第三部分 讨论了事后可解释性在数据科学中的应用。

推荐系统帮助用户发现新的项目,并且它们已经在包括视频流、电子商务和社交媒体的各种应用中得到了越来越多的使用。推荐系统可以使用多种技术来构建,但是在这里我将集中讨论使用潜在因素模型(LFM)的协同过滤。协同过滤方法基于用户先前的评级产生推荐,其理论是,如果用户 AB 过去喜欢相似的项目,那么 A 很可能也会喜欢被B【1】【2】高度评级的其他项目。解释 LFM 如何工作超出了这篇博文的范围,但简单地说,它们将已知评分的稀疏矩阵分解为一组具有维度 d 的常见用户和项目因素。然后,这些因素可以被视为具有 d 维的向量,允许我们通过计算它们的向量的点积来预测用户 u 将给予项目 i 的评分。

LFM 可以由各种矩阵分解模型产生,例如 SVD。由于这些因素是从数字用户评级中学习的,而不参考项目本身,它们不直接映射到任何可解释的因素或类别——因此 LFM 被称为不可解释的黑盒模型。无法解释的模型是一个问题,原因有很多,也许最重要的原因是缺乏信任。如果系统不能告诉它的用户为什么做出一个特定的决定,为什么用户要相信这个决定呢?除了信任之外,表 1 显示了之前为可解释性确定的七个解释标准[4]。在医疗行业等领域,证明模型所做决策的合理性尤为重要,因为不正确的决策可能会带来灾难性的后果。虽然推荐系统通常用于不太严肃的应用,如在线商店和社交网络,但让推荐具有可解释性仍然很重要,因为已经证明用户更喜欢他们认为透明的推荐[5]。

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

表 1: 评价推荐系统可解释性的七个标准。改编自表 15.1,Tintarev,n .,& Masthoff,J. (2011)。设计和评估推荐系统的解释。《推荐系统手册》(第 479-510 页)。马萨诸塞州波士顿斯普林格。

对可解释建议的研究主要集中在两种方法上,嵌入式和事后解释[6]。在嵌入式方法中,解释生成与推荐模型本身集成在一起,而在事后方法中,不可解释的推荐在由原始模型通过白盒解释生成器生成后变得可解释。嵌入式方法的一个例子是显式矩阵分解(EMF ),其中 LMF 中的因素不是自动学习的,而是从文本用户评论中收集的。该系统为用户对每个项目特征的关心程度以及该特征对每个项目的描述程度构建矩阵。然后可以使用这些矩阵构建 LFM。通过简单地检查哪些因素项目和用户得分最高,该系统容易被解释和说明,同时在预测准确性方面保持良好的性能。[7]

事后解释器可以通过从推荐模型的输入和输出中提取逻辑关联规则来构建。提取的规则具有{X => Y}的形式,其中 X 是用户体验偏好的项目,Y 是推荐。问题中的关联规则可以用文字表达为“因为你喜欢 X,所以我们推荐 Y”。通过将两个模型产生的推荐标记为“可解释的推荐”,关联规则与黑盒模型相结合[8]。

嵌入式解释自然倾向于具有良好的可解释性,因为解释和推荐模型是不分离的。与事后方法不同,嵌入式解释不是模型不可知的,需要特定类型的模型(如 LFM)或领域(如学术研究论文或文本评论)才能发挥作用,因此灵活性较低。

可以用定量和定性的方法对这些解释进行评估。定量方法评估系统的客观的、可测量的特征,例如生成解释所花费的时间、可解释的建议的准确性以及可解释的建议的份额。最后一个指标被称为模型保真度,它被认为是某些事后解释的关键指标之一[8]。还应该对这些解释进行定性评估。这通常是通过使用一个或多个解释标准(表 1)作为度量标准[4]的用户研究或 A/B 测试来完成的。例如,如果解释的目标是增加用户对系统的信任,用户研究可以比较一组看到解释的用户是否比只看到建议的控制组对系统更信任。

亚马逊在他们的系统中使用了多种解释。首先,一些推荐被标上一个句子,描述它是如何被发现的,例如“购买了这个商品的顾客也购买了…”。亚马逊还为用户引入了一项功能,可以影响一项购买对他们推荐的影响程度,或者是否应该完全过滤掉。这种解释提高了系统的可检查性,并且可以用于过滤掉作为礼物购买的物品。用户还可以看到他们之前的哪些购买或评级影响了推荐。[9]

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

Amazon.com 解释了为什么向作者推荐类别“咖啡、茶和饮料”,包含作者在过去购买的物品。该小部件还允许排除一个项目(例如,如果它是一个礼物或者用户不喜欢它),从而提高系统的可检查性。

脸书有一个解释功能,告诉用户为什么他们会看到一个帖子,以及为什么帖子会以原来的方式排序。用户还可以看到为什么向他们显示广告的详细信息,包括广告制作者如何与他们的个人数据进行交互的时间表。通过发布这一功能,脸书希望增加其产品的透明度,并帮助用户控制自己的新闻,即提高产品的可审核性。[10]此外,中国电子商务平台京东使用特征-观点对的词云作为解释,作为显式矩阵分解研究的一部分,这是一种基于内容的解释。研究人员发现,看到新解释的用户的点击率(CTR)明显高于那些收到一般“人们也看过……”解释或根本没有解释的用户。[7]

虽然可解释的建议在过去几年的研究中受到越来越多的关注,但很少有解决方案被部署到工业生产中。本系列的下一部分将介绍我使用两个事后解释器实现的一个可解释的电影推荐系统,包括离线评估和通过用户研究的评估,以及如何将解释部署到实际系统中的讨论。

以下参考资料与这篇文章的内容直接相关。我的论文中列出了整个项目的完整参考书目。

[1]:y .科伦和 r .贝尔(2015)。协同过滤的进展。在推荐系统手册(第 77–118 页)中。马萨诸塞州波士顿斯普林格。

[2]:里奇,f .,罗卡奇,l .,&沙皮拉,B. (2011)。推荐系统介绍手册。在推荐系统手册(第 1–35 页)。马萨诸塞州波士顿斯普林格。

[3]:y .科伦、r .贝尔和 c .沃林斯基(2009 年)。推荐系统中的矩阵分解技术。电脑,(8),30–37。

[4]:廷塔列夫,n .,&马斯托夫,J. (2011)。设计和评估推荐系统的解释。在推荐系统手册(第 479–510 页)中。马萨诸塞州波士顿斯普林格。

[5]: Sinha,r .,Swearingen,k .:透明度在推荐系统中的作用。摘自:计算系统中人的因素会议,第 830–831 页(2002 年)

[6]:王,x,陈,y,杨,j,吴,l,吴,z .,&谢,x(2018,11 月)。用于可解释推荐的强化学习框架。在 2018 IEEE 数据挖掘国际会议(ICDM) (第 587–596 页)。IEEE。

[7]:张,杨,赖,高,张,米,张,杨,刘,杨,马等(2014 年 7 月)。基于短语级情感分析的可解释推荐的显式因素模型。《第 37 届国际 ACM SIGIR 信息检索研究与发展会议论文集》(第 83-92 页)。ACM。

[8]:皮克,g .,&王,J. (2018 年 7 月)。推荐系统潜在因素模型的事后可解释性。《第 24 届 ACM SIGKDD 知识发现和数据挖掘国际会议论文集》(第 2060–2069 页)。ACM。

[9]:Amazon.com。(2010).完善你的推荐。检索 2019 年 10 月 2 日,来自https://www . Amazon . com/gp/help/customer/display . html/ref = HP _ 16465201 _ FAQ _ recommendations?nodeId=13316081

[10]: Sethuraman,R. (2019 年 3 月 31 日)。为什么我会看到这个?我们有一个答案给你。检索于 2019 年 10 月 2 日,发自 https://newsroom.fb.com/news/2019/03/why-am-i-seeing-this/。

用 SHAP 解释 CNN 生成的土壤地图

原文:https://towardsdatascience.com/explaining-a-cnn-generated-soil-map-with-shap-f1ec08a041eb?source=collection_archive---------28-----------------------

这是我致力于深度学习在土壤科学中的应用的系列文章的第四篇。这是一个正在进行的系列,到目前为止还包括:

[## 深度学习和土壤科学-第 1 部分

预测土壤性质的土壤光谱。根据光谱图预测多种土壤特性的多任务卷积神经网络。

towardsdatascience.com](/deep-learning-and-soil-science-part-1-8c0669b18097) [## 深度学习和土壤科学—第二部分

使用上下文空间信息的数字土壤制图。从点信息生成土壤图的多任务 CNN。

towardsdatascience.com](/deep-learning-and-soil-science-part-2-129e0cb4be94) [## 深度学习和土壤科学—第 3 部分

土壤光谱学与迁移学习。将大陆土壤光谱模式“本地化”到国家范围。

towardsdatascience.com](/deep-learning-and-soil-science-part-3-c793407e4997)

在我之前的一篇文章中,我解释了如何使用空间模型来生成地图。我还介绍了使用多任务卷积神经网络(CNN)来更好地表示土壤形成过程的复杂性。CNN 使用点状土壤观测周围的像素窗口作为输入,而不是截取其位置的单个像素,以结合空间背景。此外,由于其多任务设计,该模型能够同时预测多种土壤属性,并考虑到它们之间的相互作用。与更传统的 ML 模型(立体树模型)相比,这两个新特征的引入产生了大约 30%的误差减少。

你可能知道深度学习如何在许多领域表现出优异的性能,但与此同时,它们也引起了人们对其可解释性和潜在偏见的担忧,特别是因为这些类型的算法开始被应用于在具有高度人类影响的领域中辅助决策。

为了解决可解释性问题,在这篇文章中,我展示了我最新研究的一些结果,在这些研究中,我应用 SHAP 解释了一个用于数字土壤制图的多重谈话 CNN。主要目的是证实模型捕捉了目标土壤特性和用于训练模型的协变量之间的合理关系。

博弈论与 SHAP 价值观

从博弈论的角度来看,建模可以被视为一个合作游戏,其中预测者(代理或参与者)战略性地相互作用,以实现预测输出的目标。因此,每个代理都会收到与其贡献成比例的支付。

SHAP 是一种逼近每个预测因子的边际贡献的方法。关于如何估计这些值的详细信息,您可以阅读我的出版物 Lundberg 和 Lee (2017)的原始论文,或这篇文章中的直观解释塞缪尔·马赞蒂

为了进行分析,我使用了 Scott Lundberg 的 shap python 库,他是该方法的创造者之一。

模型描述

讨论中的模式是一个多任务 CNN,被训练来同时预测智利五个深度间隔(0-5、5-15、15-30、30-60 和 60-100 厘米)的土壤有机碳(SOC)含量。为了训练 CNN,我使用了形状为(29,29,5)的 3D 阵列,代表每个观察点周围的 29x29 像素窗口,用于解释 SOC 的空间分布的五个协变量。这个简单模型中包含的五个协变量是:海拔、坡度、地形湿度指数(TWI)、长期年平均温度(MAT)和年总降水量(TAP)。

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

图 1 。多任务网络的结构。“共享层”表示所有深度范围共享的层。每个分支(每个深度范围一个)首先将信息展平为 1D 阵列,随后是一系列 2 个全连接层和大小=1 的全连接层,这对应于最终预测。

结果

本地和全球解释

如果你熟悉 SHAP,你可能见过下面的一些图。首先,我们可以通过每个协变量的贡献获得局部解释(单个预测)。在下图中,我们可以看到两种不同观测的力图:顶部面板对应于海拔和坡度具有负作用(它们促进侵蚀)的山区。底部面板对应于相反情况的山谷。两个观测都位于智利南部,与中部和最北部地区相比,那里更冷更湿的条件促进了有机碳的积累,因此温度和降水的贡献是积极的。

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

**图二。**两个不同样本的力图。图中显示了正(绿色)和负(紫色)的总贡献,它们使 SOC 含量偏离了预期的基本 SOC 值(整个数据集的预测平均值)。

考虑到协变量对所有样本的贡献,使用 SHAP 也可以获得模型的全局解释。下图显示了每个协变量的相对重要性,其中气候对地形相关协变量的影响更大(SHAP 值范围更广)。这是一个国家 SOC 模型,智利有很强的南北气候梯度,所以 TAP 和 MAT 的影响最大也就不足为奇了。在更局部的层面上,地形开始发挥重要作用。下图显示的另一件事是,有机碳与降水量呈正相关,与温度呈负相关,这也是一种预期行为。

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

**图 3。**CNN 模型的每个协变量和土壤深度区间的 SHAP 值。TAP:年总降水量;MAT:年平均温度;地形湿度指数。

相互作用

还可以进一步检查特定协变量的影响,并评估模型是否捕捉到了它们之间的相互作用。例如,温度的积极贡献在 4 至 8℃之间达到峰值,而负面贡献在 12℃以上。鉴于该国的气候条件,MAT 贡献的减少与降水量的减少相关,这在高温地区(图 4a)更为突出,那里的碳输入量低。降水量的贡献(图 4b)显示了一个确定的趋势,在⁻大约 1000mm 年时,基本上是恒定的负响应,在⁻大约 1400mm 年时开始增加,变成正响应。该模型还捕捉到了有机碳含量和海拔之间的反比关系(图 4c ),鉴于该国的地形,较高的值通常与较陡的地形相关。一般来说,这种影响在 TAP 高于 400 毫米/年⁻的地区会加剧。

对于温度和降水,其贡献变为正值的阈值(分别约为 12°c 和 1400 毫米/年⁻)与该国境内的一个重要区域(南纬 38°左右)相一致,在该区域,砖红壤(“火山”土壤)变得更加普遍,土壤水分状况从干旱变为湿润(变得更加湿润),与有机碳含量的急剧增加相关。就似乎改变了海拔(大约 400 毫米/年⁻)贡献行为的 TAP 阈值而言,它大致对应于该国干旱和半干旱地区之间的过渡(变得更加湿润),在这种情况下,水的侵蚀过程开始变得更加重要。

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

**图 4。**SHAP 值和所选协变量之间的相关性图。a)SHAP 值和年平均温度(MAT)之间,显示与年总降水量(TAP 色标);b)SHAP 值和年总降水量之间的关系,显示与年平均温度的相互作用(色标);以及 c)SHAP 值和海拔之间的关系,显示了与年总降水量(色标)的相互作用。

空间解释

因为我们讨论的是一个包含每个样本周围环境的空间模型,所以我们也可以从空间上评估贡献。下图显示了与图 2 相同的两个位置,但这次分解了每个像素的贡献。解释是一样的,但理论上,我们应该能够识别更有影响力的景观的具体特征。

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

**图五。**两个不同样本(来自图 2 的相同样本)中每个协变量的 SHAP 值的空间分布。

也许对我来说最有趣的输出(我主要使用地图)是可以聚集本地空间贡献来显示更一般的空间解释并进一步证实之前的解释。下图显示了 SHAP 值的地图,其中可以区分靠近海岸的山谷,与周围区域相比,该山谷具有较低的坡度和坡度以及较高的 MAT。与预期的平均输出相比,这些条件对模型输出有负面影响。当然,即使这些趋势在有机碳过程方面有意义,它们也可能与人类活动(农业)的影响相互作用,这在该模型中没有考虑。

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

**图六。**CNN 模型中每个协变量的 SHAP 值的空间分布。每个像素的值是该像素被用作上下文的所有实例的平均值(对于 29×29 的上下文窗口高达 841 次)。TAP:年总降水量;MAT:年平均温度;地形湿度指数。

最后的话

这项研究的结果表明,有可能在数字土壤制图中建立可解释的深度学习模型,通常被视为黑盒的复杂模型可以使用 SHAP 值进行检查。这不仅对于证实模型被适当地训练以及它捕获目标属性和预测器之间的合理关系是必要的,而且它也是导致知识发现的过程的基本部分。

引用

关于这项工作的更多细节可以在相应的论文中找到。

帕达里安,j .麦克布拉特尼,A. B .和米纳斯尼,B. 2020。数字土壤制图卷积神经网络的博弈论解读,土壤讨论,https://doi.org/10.5194/soil-2020-17.

注 04/04/2020: 该文件尚未被接受,正在接受公众审查和讨论。欢迎您参与这一过程。

参考

  • Lundberg,S.M .和 Lee,S.I .,2017 年。解释模型预测的统一方法。在:神经信息处理系统进展 30 *。*第 4765-4774 页。

向孩子们解释人工智能

原文:https://towardsdatascience.com/explaining-ai-to-children-c9b2ecab1ffc?source=collection_archive---------36-----------------------

如何让我们的年轻一代为明天的挑战做好准备!

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

伯纳德·赫曼特在 Unsplash 上的照片

向儿童解释人工智能音频版

人工智能(AI)可能会让许多人望而生畏,更不用说孩子了。正因为如此,用他们能理解的具体例子来解释它是很重要的。这可以通过三个简单的步骤轻松实现;给人工智能下一个定义,提供例子并给他们指出可以探索的有趣资源。

首先,我们从定义开始。人工智能可以被定义为一个计算机程序,它能够执行一项需要智能的任务。这项任务通常是人类或智能动物能够完成的,例如学习、计划、解决问题等。

第二,展示 AI 最明显的例子是在游戏中。孩子们是玩游戏的专家,这可能是任何年龄的孩子最喜欢的活动。

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

照片由基里尔·沙尔科夫斯基Unsplash 拍摄

一个有趣且无需介绍的经典游戏无疑是吃豆人。游戏发生在一个迷宫里。玩家控制吃豆人,吃豆人的任务是吃掉迷宫中所有的点,同时避开四个彩色的幽灵。有意思的是,四个鬼都有自己的人格,由中央 AI 系统控制。Blinky(红色)是领导者,并始终遵循吃豆人。Pinky (pink)是一个缓慢的幽灵,它试图通过预测 Pac-Man 可能去的地方来伏击他。Inky(青色)是一个害羞的幽灵,倾向于跟随 Blinky。最后,克莱德(橙色)是一个胆小鬼幽灵,它在吃豆人接近时逃跑了。吃豆人是一个简单的游戏,但人工智能的行动可以在实践中看到,很容易理解。在大多数游戏中都可以找到类似的 AI 机制。在足球游戏中,如国际足联,对方球队是由人工智能控制的。在模拟游戏如“模拟人生”中,大多数其他角色都由人工智能处理。几乎所有的游戏都使用人工智能!

最后,在理解了它是什么并意识到我们都经常使用它之后,也是时候享受它的乐趣了。网上有大量资源可供教育者和孩子们使用。以下是一些最有趣的不完全列表:

与机器聊天

  • 伊莱扎是第一批被创造出来的聊天机器人之一(1964)。它有些受限;不过,和它聊天还是挺好玩的。可以在这里访问https://tinyurl.com/AIEx-Eliza
  • Mitsuku 是目前存在的最先进的聊天机器人之一。它获得了各种奖项,可以谈论大多数话题。它可以位于 https://tinyurl.com/AIEx-Mitsuku这里

处理语言的机器

  • 情感分析器将一个典型的句子作为输入。然后它决定了这个句子是正面的、负面的还是中性的意思。该计划可以在这里找到https://tinyurl.com/AIEx-Sentiment
  • Thing Translator 给一个物体拍照,用自然语言(如西班牙语、意大利语等)给我们描述。)我们的选择。这个演示可以在https://tinyurl.com/AIEx-Translator找到

参见的机器

  • 句子生成器获取一个图像作为输入,并为该图像创建一个标题。它通过理解组成图像的对象并给它们一个标签来做到这一点。演示可以在这里访问https://tinyurl.com/AIEx-See
  • 表情符号寻宝游戏使用人工智能通过移动设备的摄像头来识别现实世界中的表情符号。游戏可以在这里玩https://tinyurl.com/AIEx-Emoji

玩机器

  • 快,画!是一种游戏,用户必须画一些东西,人工智能必须猜它是什么。游戏可以在这里玩https://tinyurl.com/AIEx-Draw
  • 这张智能纸展示了一个程序如何玩井字游戏,并通过遵循简单的规则而获胜。游戏的说明可以在https://tinyurl.com/AIEx-TicTacToe找到

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

科林·阿姆斯特朗在 Unsplash 上拍摄的照片

人工智能非常有趣,教授人工智能的资源在网上随处可见。此外,在过去几个月里,马耳他大学信息通信技术学院人工智能系发布了一本题为“教育中的人工智能——教师和年轻人实用指南”的书。在教育部的支持下,这本书免费分发给所有学校。它包含如何向任何年龄的儿童教授人工智能概念的进一步例子和有趣的练习。马耳他教师联盟也组织了一个关于"教室中的人工智能"的短期课程,旨在帮助教育工作者理解人工智能,并随后在课堂上使用它。有很多资源可以让你在课堂上开始使用人工智能。

人工智能很可能是人类发明的最强大的工具。它被许多人戏称为新的电力。正因为如此,设计未来的唯一途径就是从事 AI 工作。这就是为什么我们必须教导年轻一代接受它,并把它作为一种工具。只有这样,我们才有希望让我们的年轻一代为明天的挑战做好准备!

原载**马耳他教师联盟**。请在下面留下你的想法。如果你喜欢这篇文章,请跟我来🐦推特,🔗领英📷 Instagram 或者😊脸书。****

** [## 140 个网站帮助您的孩子学习几乎任何东西!

优质教育可以是免费的,网络上充满了免费资源。

medium.com](https://medium.com/@alexieidingli/140-websites-to-help-your-child-learn-almost-anything-55474d54a420) [## 冠状病毒封锁下的儿童有趣的人工智能活动

冠状病毒正使整个地球陷入停顿,因为孩子们将有充足的时间在家与他们的…

towardsdatascience.com](/fun-artificial-intelligence-activities-for-kids-under-coronavirus-lockdown-7177969a2ba1) [## 使用人工智能提升我们的教育系统和劳动力

在任何国家,最重要的资源是人力资本。熟练的劳动力和运转良好的教育系统…

towardsdatascience.com](/boosting-our-educational-system-and-our-workforce-using-ai-a676afacb9cd)

阿列克谢·丁力教授 是马耳他大学的 AI 教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他出版了几本同行评审的出版物,并且是马耳他的一部分。由马耳他政府成立的人工智能工作组,旨在使马耳他成为世界上人工智能水平最高的国家之一。**

向管理层解释人工智能用例——我的四个关键信息

原文:https://towardsdatascience.com/explaining-an-ai-use-case-to-management-my-four-key-messages-e6f4583a0d82?source=collection_archive---------77-----------------------

你在你的组织中负责启动人工智能项目吗?你需要向管理层解释你的人工智能用例吗?

在之前的帖子中,我已经写了我如何一步一步地进行填鸭式管理。一旦他们理解了人工智能的要点,而我有一个人工智能用例要在内部追求。是时候召开第一次会议来介绍我的用例了。在这次会议中,我保持简单,我用四个关键信息来解释用例。

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

Austin DistelUnsplash 上拍摄

信息 1:一句话的解决方案

我用一句话写下解决方法。我的解决方案到底能做什么?一句一句写下来的过程有助于我找到正确的解释,让他们更容易理解。我确保把重点放在事情的商业方面。

一个很好的例子:“自动接受/拒绝信贷申请”

一个不好的例子:“预测还贷的逻辑回归”

想想你的经理会怎么想。在第一个例子中,他会想“太好了。我可以节省成本”。在第二个例子中,他会认为“嗯,有趣”。

信息 2:这个人工智能项目的好处

第二步,我讲这个项目的好处。收益可以是硬性因素,如节省时间、提高投资回报率、节约成本或降低某种风险。有时候利益是软性的,这也没关系。为了让我的管理层对一个用例真正感兴趣,我一定要提到他们与奖金挂钩的 KPI。

信息 3:这个项目需要的数据

人工智能项目需要数据,但我的管理层可能没有完全理解这一点,或者没有想到那么远。在这一步,我告诉他们我将需要什么数据,数据来自哪里,以及获取这些数据的难易程度。这真的让我的案子生动起来。一旦他们理解了什么将进入模型,它也开始对管理层变得有形。我发现这种方法引发了具体的讨论,并帮助他们想出其他我可能能够纳入的想法。

信息 4:关键成功因素

我们都经历过,管理层对我们期望过高。在大多数人工智能项目中,都会遇到障碍。我会思考前面的这些障碍,并将它们转化为关键的成功因素。项目的第一阶段是我为管理层设定正确期望的时候。当出现我事先预料到的问题时,这将极大地帮助我。

当我第一次与管理层一起启动一个人工智能项目时,这是我得到的四个关键信息。大多数时候,一次会面是不够的,我会经历一系列的互动,直到信息落地。当消息到达后,就该进行下一步了。

耐心点,这可能比你预期的要长。

关于我:我是一名分析顾问,也是当地一所商学院“人工智能管理”研究的主任。我的使命是帮助组织利用人工智能创造商业价值,并创造一个数据科学家可以茁壮成长的环境。 在这里报名我的简讯。

解释“黑箱”ML 模型——SHAP 的实际应用

原文:https://towardsdatascience.com/explaining-blackbox-ml-models-practical-application-of-shap-f05f986863cf?source=collection_archive---------44-----------------------

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

在真实数据集上训练“黑盒”GBM 模型,并使其可以用 SHAP 解释。

动机

GBM 模型已经作为强大的模型经受了战斗的考验,但是由于缺乏可解释性而被玷污了。通常,数据科学家会查看可变重要性图,但这不足以解释模型是如何工作的。为了最大化模型用户的采用,使用 SHAP 值来回答常见的可解释性问题,并建立对模型的信任。

在这篇文章中,我们将在一个简单的数据集上训练一个 GBM 模型,你将学习如何解释这个模型是如何工作的。这里的目标不是解释数学是如何工作的,而是向非技术用户解释输入变量如何与输出变量相关,以及如何进行预测。

我们正在使用的数据集是由 ISLR 提供的广告数据集,你可以获得在 d6t GitHub 上使用的代码。

首先,构建高效的数据科学工作流

正如在数据科学家犯的 10 大编码错误中所解释的,为了创建高效的数据科学工作流,我们将使用文件管理器 d6tpipe 和工作流管理器 d6tflow

api = d6tpipe.APIClient()
pipe = d6tpipe.Pipe(api, 'intro-stat-learning')
pipe.pull()

预处理工作流:

**class** **TaskProcessRawData**(d6tflow.tasks.TaskPqPandas): **def** run(self):
        df = pd.read_csv(pipe.dirpath/'Advertising.csv', usecols=[1,2,3,4])
        self.save(df)@d6tflow.requires(TaskProcessRawData)
**class** **TaskFeatures**(d6tflow.tasks.TaskPqPandas):

    **def** run(self):
        df = self.inputLoad()
        df['target']=df['Sales']
        df['radio']=-df['radio'] *# force negative relationship*
        df['tv_radio']=df['TV']*df['radio'] *# interaction effect*
        self.save(df) 

第二,不要在对模型应该做什么没有直觉的情况下建立模型

正如在数据科学家犯下的十大统计错误中所解释的,你想要对模型应该如何工作形成一种经济直觉。

广告数据集显示销售是电视、广播和报纸广告支出的函数。通过观察散点图,我们可以看出电视和广播是有效的营销渠道,因为销售与这些渠道的支出密切相关。但是注意,广播有负面影响,而电视有正面影响(NB 我们强行与广播建立了负面关系)。报纸似乎只有很小的影响。

sns.lmplot(x="value", y="target", col="variable", data=dfp)

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

现在训练一个“黑盒”ML 模型

GBM 模型已经作为强大的模型经受了战斗的考验,但由于缺乏可解释性而受到了污染。让我们训练模型,看看我们如何解释它。我们将使用 LightGBM

m_lgbm = lightgbm.LGBMRegressor()
m_lgbm.fit(df_trainX,df_trainY)

为什么可变重要性图不起作用

顾名思义,变量重要性图告诉您输入和输出变量之间的关系强度。但是要信任一个模型,用户通常想知道更多:影响是积极的/消极的,线性的/非线性的?是否有成功/失败的时候?他们想看看这个模型是否符合他们的经济直觉。

在我们的例子中,重要性图并没有显示报纸消费与我们确定的负相关。这将使模型用户感到困惑,他们不会相信仅基于该图的模型。

lightgbm.plot_importance(m_lgbm)

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

与 SHAP 一起解释模型

SHAP 让你可以看到每个输入对输出变量的方向性影响,这给了模型用户关于模型如何工作的重要直觉。

如您所见,该模型确实显示了电视支出越高,销售额越高;广播支出越高,销售额越低。这符合我们的直觉,让模型用户相信你的模型做了正确的事情。

explainer = shap.TreeExplainer(m_lgbm, df_trainX)
shap_values = explainer.shap_values(df_trainX)shap.summary_plot(shap_values, df_trainX)

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

您还可以研究散点图中的“拟合”值,以更详细地显示输入和输出变量之间的关系。这对于更复杂的关系和理解交互效应是有用的。

在这种情况下,关系是线性的,电视和广播之间存在交互作用(您可以通过运行 OLS 并包含tv_radio变量来确认)。

**for** col **in** cfg_col_X:
    shap.dependence_plot(col, shap_values, df_trainX)

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

部分依赖情节呢?

那些也有用。优点是它们的输出与实际的目标变量具有相同的规模。这与 Shapley 值不同,Shapley 值显示了相对于平均预测的边际影响。

plot_partial_dependence(m_lgbm, df_trainX)

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

解释最新的预测

这是实践中经常遇到的另一个问题:您已经训练了模型,并使用最新数据进行了预测。模型用户不仅想知道预测值,还想知道为什么模型会做出这样的预测。SHAP 可以解释单个预测,也可以解释每个输入变量如何影响整体预测。

这里我们可以看到最新的预测值是【13.18】。电视提高了这一预测,而广播则降低了这一预测。报纸几乎没有影响。这符合我们的预期。

shap.force_plot(explainer.expected_value, shap_values[-1,:], df_trainX.iloc[-1,:])

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

从哪里了解更多信息?

了解 SHAP

构建高效的数据科学工作流

利用 Databolt 加速数据科学

  • https://github.com/d6t/d6t-python
  • 【https://www.databolt.tech/

如何向朋友和家人解释数据科学

原文:https://towardsdatascience.com/explaining-data-science-to-friends-and-family-15af317ec3ed?source=collection_archive---------33-----------------------

当数据科学家谈论他们的职业时

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

车头拍摄

Y 你在谈话中提到了你作为数据科学家的工作;几乎是瞬间,一种尴尬的感觉开始从你的胃里升起。当你提到你的职业时,你要为几乎总是被问到的问题做好准备。尽管之前已经回答过这个问题很多次了,你仍然觉得你的听众离开时困惑多于知情。当你站在那里考虑这一次不同的回答方式时,这个人提出了一个问题:

那么,数据科学家是做什么的呢?

现在怎么办?你仍然希望保持他们的兴趣,不要用技术细节来烦他们。你也不想给人一种“我认为我比你聪明”的印象,给人一种居高临下或居高临下的感觉。那怎么办呢?怎么简单解释什么是数据科学家?我们退一步,先解释一下什么是数据科学。

面向所有人的数据科学

如果你需要向普通人解释数据科学家的职业,你可能首先需要解释什么是数据科学。数据科学可以简单地描述为一种科学地测试数据以获得洞察力和结论的方法。用于测试这些数据的方法和技术是大量的,但对于主题的简要描述来说可能不是必需的。

解释数据科学

数据科学大量涉及编码,通常使用 Python 或 T9 的编程语言,但最近主要是 Python。它与统计分析和建模有关。有了这两个统计概念,就可以用正确的数据做出结论和应用。

数据科学中的“数据”

什么是正确的数据?这个数据是如何实现的?大多数数据来源来自公司或个人管理的大型数据库。如今,许多企业一直在利用数据科学来分析他们的大量数据,以便做出战略决策或获得对自己业务的洞察力。

其他数据记录可以从一个名为“ web-scraping 的过程中收集,该过程涉及使用一种编程语言,在这个特定情况下是 Python,来导航到不同的网站。在每个网站上,可以从网页上的各个部分获取数据。

当我们拥有所有需要的数据时,我们就可以继续使用数据科学来分析这些数据并从中得出结论。

让数据科学变得有趣

好了,现在你知道了数据科学基础的解释,让我们试着让它听起来更有趣。你可以将人们的注意力引向人工智能AI 。作为一名数据科学家,你主要关心的问题之一是与人工智能合作。大多数人听说过人工智能,并对这个想法超级着迷,这要感谢科幻媒体,如终结者系列。人工智能是当今的一个热门词汇,仅仅提到你处理它的应用肯定会引起一些人的惊讶。

随着人工智能的应用,你可以更深入地研究数据科学剧本,并提出机器学习。机器学习是另一个将迅速抓住人们注意力的时髦词,因为他们中的许多人也听说过这个概念。

人工智能和机器学习的这些流行语可能能够抓住人们的注意力,但你的大部分观众可能甚至不知道它实际上是什么。许多人听说过这些术语,但是你又一次陷入了试图在简短的对话中解释一个复杂主题的困境。

你也许可以简化人工智能和机器学习,只要说它是计算机自动化和推进现代技术的应用。总而言之,这些概念应该能够独立成为引人注目的话题,足以吸引所有从事数据科学家职业的人。

数据科学家如何帮助一家公司?

另一个可能出现的问题是,你如何为公司的底线做出贡献。我们简要地讨论了数据科学家如何处理公司的大型数据库。你可以提出,作为一名数据科学家,你在公司的主要角色是如何对公司多年来收集的数据提出可行的见解。

这家公司收集的数据范围广泛,从客户对服装的偏好到他们是否在特定节目中点击“下一集”。这些数据包含大量需要处理的信息,这正是您作为数据科学家的职责所在。

您能够将这些数据处理成可展示的东西。你将会以这样一种方式展示它,在这种方式下,你和公司可能会在数据中发现以前可能没有注意到的新关系。根据这些关系,公司可以做出一些战略决策来增强或减弱数据中的这些联系。另一件你可以为公司提供价值的事情是通过开发从检测欺诈交易到预测销售价格的应用程序。

最终,数据科学家在公司的未来决策中扮演着重要的角色。大多数大公司近年来收集了如此多的数据,以至于他们需要数据科学家来帮助组织和分析这些数据。随着越来越多的数据被创建和收集,对数据科学家的需求也将持续增长。

结束语

如您所见,有许多方法可以消除数据科学复杂主题的复杂性。这可能听起来令人生畏和困惑,但如果你把它分解成更小的部分,它似乎更容易消化。机器学习和人工智能等数据科学中更具传统吸引力的部分肯定会吸引一大批人。每个人每天都在使用技术,都会对这两个术语有所了解。

只要你不表现出居高临下的姿态,你应该能够毫不费力地向普通人解释数据科学和你的职业。希望现在你不会纠结于描述你对家人和朋友做了什么。也许你甚至可以激励他们中的一些人成为数据科学家!

解释 DBSCAN 集群

原文:https://towardsdatascience.com/explaining-dbscan-clustering-18eaf5c83b31?source=collection_archive---------2-----------------------

使用 DBSCAN 识别员工子组

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

图片由 Ishan @seefromtheskyUnsplash 上拍摄

带噪声应用的基于密度的空间聚类(DBSCAN) 是一种无监督聚类 ML 算法。无监督的,因为它不使用预先标记的目标来聚类数据点。聚类是指试图将相似的数据点分组到人工组或聚类中。它是 KMeans 和层次聚类等流行聚类算法的替代方法。

在我们的示例中,我们将检查由 15,000 名员工组成的人力资源数据集。该数据集包含员工工作特征,如工作满意度、绩效得分、工作量、任职年限、事故、晋升次数。

在我的上一篇文章中,我们研究了 KMeans 聚类算法,我强烈建议您阅读(链接)。您将能够了解 KMeans 如何对数据进行聚类。

KMeans vs DBSCAN

KMeans 特别容易受到离群值的影响。当算法迭代通过质心时,在达到稳定和收敛之前,离群值对质心的移动方式有显著影响。此外,KMeans 在准确聚类数据方面存在问题,因为聚类的大小和密度不同。K-Means 只能应用球形聚类,如果数据不是球形的,其准确性会受到影响。最后但同样重要的是,KMeans 要求我们首先选择我们希望找到的集群的数量。下面是 KMeans 和 DBSCAN 如何分别对同一个数据集进行聚类的示例。

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

另一方面,DBSCAN 不需要我们指定集群的数量,避免了离群值,并且可以很好地处理任意形状和大小的集群。它没有质心,聚类是通过将相邻点连接在一起的过程形成的。

DBSCAN 是如何施展魔法的?

首先,让我们定义ε和**最小点,**应用 DBSCAN 算法时的两个必需参数,以及一些附加术语。

  1. **ε(ɛ)😗*邻居的最大半径。如果数据点的相互距离小于或等于指定的ε,则它们将是有效的邻居。换句话说,它是 DBSCAN 用来确定两个点是否相似并属于同一个点的距离。较大的ε将产生较宽的聚类(包含更多的数据点),而较小的ε将构建较小的聚类。一般来说,我们更喜欢较小的值,因为我们只希望数据点之间的距离在ε范围内。太小,你将开始把有效的集群分成越来越小的集群。太大的话,您会将有效的集群聚合成 2 到 3 个大规模集群,几乎没有业务洞察力。
  2. 最小点(minPts): 一个邻域半径内的最小个数据点(即ε),以将该邻域视为一个聚类。请记住,初始点包含在 minPts 中。较低的 minPts 有助于该算法构建更多具有更多噪声或离群值的聚类。较高的 minPts 将确保更健壮的集群,但是如果它太大,较小的集群将被并入较大的集群。

如果“最小点”= 4,在ε距离内的任何 4 个或更多的点将被认为是一个群集。

附加术语

**核心点:**核心数据点在其ε距离内至少有 minPts 个数的数据点。

我一直认为 DBSCAN 需要第三个名为“core_min”的参数,它将决定一个邻域点簇被认为是有效簇之前核心点的最小数量。

**边界点:**边界数据点在郊区,因为它们在附近(即 w/in 核心点的ε距离)但小于所需的 minPts。

**离群点:**这些点不是邻域的一部分(即大于ε距离)并且不是边界点。这些点位于低密度区域。

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

首先,选择在其ε半径内至少有 minPts 的随机点。然后,评估核心点邻域内的每个点,以确定其附近是否有ε距离内的 min pts(min pts 包括点本身)。如果该点满足 minPts 标准,则它成为另一个核心点,并且集群扩展。如果一个点不满足 minPts 标准,它就成为边界点。随着过程的继续,一个链开始发展,因为核心点“a”是“b”的邻居,而“b”是“c”的邻居,等等。聚类是完整的,因为它被边界点包围,因为在ε距离内没有更多的点。选择新的随机点,并且重复该过程以识别下一个聚类。

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

如何确定最佳ε值

用于估计最佳ε值的一种方法是使用最近邻距离。如果您还记得,最近邻是一种受监督的 ML 聚类算法,它根据新数据点与其他“已知”数据点的距离对其进行聚类。我们在标记的训练数据上训练 KNN 模型,以确定哪些数据点属于哪个聚类。然后,当我们将该模型应用于新数据时,该算法会根据到已训练聚类的距离来确定新数据点属于哪个聚类。我们必须先验地确定“k”参数,该参数指定在将新数据点分配给聚类之前,模型将考虑多少个最近或最近的相邻点。

为了确定最佳ε值,我们计算每个点与其最近邻点之间的平均距离。然后,我们绘制一个 k 距离图,并选择图表“肘部”处的ε值。在 y 轴上,我们绘制了数据集中所有数据点的平均距离,在 x 轴上绘制了这些数据点。

如果ε选得太小,大部分数据将不会被聚类,而高ε值的聚类将合并,并且大多数数据点将在同一聚类中。一般来说,ε值越小越好,根据经验,只有一小部分点应该在彼此的距离之内。

如何确定最优 minPts

通常,我们应该将 minPts 设置为大于或等于数据集的维数。也就是说,我们经常看到人们将特性的数量乘以 2 来确定它们的 minPts 值。

很像用于确定最佳ε值的“肘方法”, minPts 试探法并非 100%正确。

DBSCAN 集群评估

**剪影法:**该技术衡量聚类之间的可分性。首先,找出每个点和一个聚类中所有其他点之间的平均距离。然后它测量每个点与其他簇中每个点之间的距离。我们减去两个平均值,然后除以较大的平均值。

我们最终想要一个高(即。最接近 1)的分数,其将指示存在小的群内平均距离(紧密的群)和大的群间平均距离(充分分离的群)。

**视觉聚类解释:**一旦你获得了你的聚类,解释每个聚类是非常重要的。这通常是通过将原始数据集与聚类合并并可视化每个聚类来完成的。每个聚类越清晰和明显越好。我们将在下面回顾这个过程。

DBSCAN 的优点

  • 不需要我们预先确定像 KMeans 这样的集群的数量
  • 像冠军一样处理异常值
  • 可以将高密度数据分成小簇
  • 可以聚集非线性关系(查找任意形状)

DBSCAN 的缺点

  • 努力在不同密度的数据中识别聚类
  • 会受到高维数据的困扰
  • 对ε和最小点参数非常敏感

我们群集吧!

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.offline as pyo
pyo.init_notebook_mode()
import plotly.graph_objs as go
from plotly import tools
from plotly.subplots import make_subplots
import plotly.offline as py
import plotly.express as px
from sklearn.cluster import DBSCAN
from sklearn.neighbors import NearestNeighbors
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCAplt.style.use('fivethirtyeight')
from warnings import filterwarnings
filterwarnings('ignore') with open('HR_data.csv') as f:
    df =  pd.read_csv(f, usecols=['satisfaction_level', 'last_evaluation', 'number_project',
       'average_montly_hours', 'time_spend_company', 'Work_accident',
       'promotion_last_5years'])
f.close()

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

1.标准化

由于数据集中的要素比例不同,我们需要对整个数据集进行标准化。换句话说,数据集中的每个要素都有其数据的唯一量值和范围。满意度增加一分并不等于上次评估增加一分,反之亦然。由于 DBSCAN 利用点之间的距离(欧几里德距离)来确定相似性,因此未缩放的数据会产生问题。如果一个要素的数据具有较高的可变性,则距离计算将更容易受到该要素的影响。通过缩放我们的特征,我们将所有的特征对齐到平均值为 0,标准偏差为 1。

scaler = StandardScaler()
scaler.fit(df)
X_scale = scaler.transform(df)df_scale = pd.DataFrame(X_scale, columns=df.columns)
df_scale.head()

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

2.特征约简

一些算法(如 KMeans)发现,如果数据集具有太多的特征(即高维度)。高维不一定意味着成百上千的特征。即使 10 个特征也可能产生精度问题。

特征或维度减少背后的理论是将原始特征集转换成较少的人工导出的特征,这些特征仍然保持原始特征中包含的大部分信息。

最流行的特征减少技术之一是主成分分析或 PCA。主成分分析将原始数据集缩减为特定数量的特征,称为主成分。我们必须选择我们希望看到的主成分的数量。我们在我关于 KMeans 集群的文章中讨论了特性缩减,我强烈建议您看一下( LINK )。

首先,我们需要确定适当数量的主成分。似乎 3 个主成分解释了大约 75%的方差。

pca = PCA(n_components=7)
pca.fit(df_scale)
variance = pca.explained_variance_ratio_ var=np.cumsum(np.round(variance, 3)*100)
plt.figure(figsize=(12,6))
plt.ylabel('% Variance Explained')
plt.xlabel('# of Features')
plt.title('PCA Analysis')
plt.ylim(0,100.5)plt.plot(var)

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

现在我们知道了保持特定方差百分比所需的主成分数,让我们对原始数据集应用一个三成分 PCA。请注意,第一个主成分占原始数据集方差的 26%。在本文的剩余部分,我们将使用“pca_df”数据帧。

pca = PCA(n_components=3)
pca.fit(df_scale)
pca_scale = pca.transform(df_scale)pca_df = pd.DataFrame(pca_scale, columns=['pc1', 'pc2', 'pc3'])
print(pca.explained_variance_ratio_)

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

在 3D 空间中绘制我们的数据,我们可以看到 DBSCAN 的一些潜在问题。如果您还记得 DBSCAN 的一个主要缺点,那就是它无法准确地对不同密度的数据进行聚类,从下图中,我们可以看到两个密度非常不同的独立聚类。在应用 DBSCAN 算法时,我们可能能够在数据点的较低聚类中找到聚类,但是在较高聚类中的许多数据点可能被归类为异常值/噪声。这当然完全取决于我们对ε和最小点值的选择。

Scene = dict(xaxis = dict(title  = 'PC1'),yaxis = dict(title  = 'PC2'),zaxis = dict(title  = 'PC3'))trace = go.Scatter3d(x=pca_df.iloc[:,0], y=pca_df.iloc[:,1], z=pca_df.iloc[:,2], mode='markers',marker=dict(colorscale='Greys', opacity=0.3, size = 10, ))
layout = go.Layout(margin=dict(l=0,r=0),scene = Scene, height = 1000,width = 1000)
data = [trace]
fig = go.Figure(data = data, layout = layout)
fig.show()

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

3.DBSCAN 聚类

方法 1

在我们应用聚类算法之前,我们必须使用上面讨论的“肘方法”来确定适当的 epsilon 级别。看起来最佳的ε值大约是 0.2。最后,由于我们的数据有 3 个主要成分,我们将把最低分标准设为 6。

plt.figure(figsize=(10,5))
nn = NearestNeighbors(n_neighbors=5).fit(pca_df)
distances, idx = nn.kneighbors(pca_df)
distances = np.sort(distances, axis=0)
distances = distances[:,1]
plt.plot(distances)
plt.show()

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

将ε设置为 0.2 并将 min_samples 设置为 6 导致了 53 个聚类,轮廓得分为-0.521,以及超过 1500 个数据点被认为是异常值/噪声。在一些研究领域中,53 个聚类可能被认为是信息丰富的,但我们有一个 15,000 名员工的数据集。从业务的角度来看,我们需要一个可管理的集群数量(即 3-5 个),可以用来更好地了解工作场所。此外,轮廓得分为-0.521 表示数据点的聚类不正确。

查看下面的 3D 图,我们可以看到一个包含大部分数据点的聚类。出现了一个较小但重要的集群,但剩下 52 个更小的集群。从业务角度来看,这些集群并不能提供很多信息,因为大多数员工只属于两个集群。组织希望看到几个大的集群,以便确定它们的有效性,但是也能够针对集群的员工参与一些组织活动(即培训增加、薪酬变动等。).

db = DBSCAN(eps=0.2, min_samples=6).fit(pca_df)
labels = db.labels_# Number of clusters in labels, ignoring noise if present.
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
n_noise_ = list(labels).count(-1)print('Estimated number of clusters: %d' % n_clusters_)
print('Estimated number of noise points: %d' % n_noise_)
print("Silhouette Coefficient: %0.3f" % metrics.silhouette_score(pca_df, labels))

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

Scene = dict(xaxis = dict(title  = 'PC1'),yaxis = dict(title  = 'PC2'),zaxis = dict(title  = 'PC3'))labels = db.labels_trace = go.Scatter3d(x=pca_df.iloc[:,0], y=pca_df.iloc[:,1], z=pca_df.iloc[:,2], mode='markers',marker=dict(color = labels, colorscale='Viridis', size = 10, line = dict(color = 'gray',width = 5)))
layout = go.Layout(scene = Scene, height = 1000,width = 1000)
data = [trace]
fig = go.Figure(data = data, layout = layout)fig.update_layout(title='DBSCAN clusters (53) Derived from PCA', font=dict(size=12,))
fig.show()

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

接近 2 号

我们不使用“肘方法”和最小值试探法,而是采用迭代方法来微调我们的 DBSCAN 模型。当我们将 DBSCAN 算法应用于数据时,我们将遍历一系列ε和最小点值。

在我们的示例中,我们将以 0.1 的间隔迭代范围为 0.5 至 1.5 的ε值,以及范围为 2 至 7 的最小点值。for 循环将使用这组值运行 DBSCAN 算法,并为每次迭代生成聚类数和轮廓分数。请记住,您需要根据您的数据调整您的参数。您可能会在一组参数上运行此代码,并发现产生的最佳轮廓分数为 0.30。您可能希望增加ε值,以便将更多的点包含到一个簇中。

pca_eps_values = np.arange(0.2,1.5,0.1) 
pca_min_samples = np.arange(2,5) 
pca_dbscan_params = list(product(pca_eps_values, pca_min_samples))pca_no_of_clusters = []
pca_sil_score = []
pca_epsvalues = []
pca_min_samp = []for p in pca_dbscan_params:
    pca_dbscan_cluster = DBSCAN(eps=p[0], min_samples=p[1]).fit(pca_df)
    pca_epsvalues.append(p[0])
    pca_min_samp.append(p[1])pca_no_of_clusters.append(
len(np.unique(pca_dbscan_cluster.labels_)))
    pca_sil_score.append(silhouette_score(pca_df, pca_dbscan_cluster.labels_))pca_eps_min = list(zip(pca_no_of_clusters, pca_sil_score, pca_epsvalues, pca_min_samp))pca_eps_min_df = pd.DataFrame(pca_eps_min, columns=['no_of_clusters', 'silhouette_score', 'epsilon_values', 'minimum_points'])pca_ep_min_df

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

我们可以看到,通过迭代我们的ε和最小值,我们已经获得了大量的聚类和轮廓分数。ε得分在 0.9 和 1.1 之间开始产生可管理数量的聚类。将 epsilon 增加到 1.2 及以上会创建太少的集群,没有太多的商业意义。此外,这些簇中的一些可能只是噪声(即-1)我们一会儿就会谈到。

同样重要的是要理解,增加ε会减少聚类的数量,但是每个聚类也会开始包含更多的异常值/噪声数据点。存在一定程度的收益递减。

为了简单起见,让我们选择 7 个集群,并检查集群分布情况。(ε:1.0 & min pts:4)。

指出运行这一串代码时肯定会遇到的一个常见错误也很重要。有时当你设置好你的参数(即 eps_values 和 min_samples)太宽,for 循环最终将得到仅产生一个聚类的 eps_values 和 min_samples 的组合。但是,Silhouette_score 函数要求至少定义两个分类。您需要限制您的参数来避免这个问题。

在上面的例子中,如果我们将 epsilon 参数范围设置为 0.2 到 2.5,则最有可能产生一个聚类并最终导致错误。

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

您可能会问自己“我们不是应该获得 7 个集群吗?”。答案是“是”,如果我们查看唯一的标签/聚类,我们会看到每个数据点有 7 个标签。根据 Sklearn 文档,标签“-1”相当于一个“嘈杂”的数据点,它没有被聚类到 6 个高密度集群中的任何一个。我们自然不希望将“-1”的任何标签视为一个集群,因此,它们被从计算中移除。

db = DBSCAN(eps=1.0, min_samples=4).fit(pca_df)
labels = db.labels_# Number of clusters in labels, ignoring noise if present.
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
n_noise_ = list(labels).count(-1)print('Estimated number of clusters: %d' % n_clusters_)
print('Estimated number of noise points: %d' % n_noise_)
print("Silhouette Coefficient: %0.3f" % silhouette_score(pca_df, labels))

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

set(labels)

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

查看六个 DBSCAN 衍生的集群的 3D 图,看起来接近图顶部的密度较低的集群尽管密度较低,但并没有对 DBSCAN 造成太大的问题。如果您还记得,DBSCAN 很难正确地对各种密度的数据进行聚类。顶部星团和大得多的底部星团之间的距离很可能大于我们的ε值 1.0。

也就是说,数据集包含额外的高密度聚类,但我们的ε和最小值太大。底部聚类包含至少两个高密度聚类,然而,由于底部聚类的强密度,降低ε和最小点值将简单地创建许多更小的聚类。这也是 DBSCAN 的主要缺点。我一直认为 DBSCAN 需要第三个参数“min_core”,它将决定一个簇被认为是有效簇之前的最小核心点数。

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

Scene = dict(xaxis = dict(title  = 'PC1'),yaxis = dict(title  = 'PC2'),zaxis = dict(title  = 'PC3'))# model.labels_ is nothing but the predicted clusters i.e y_clusters
labels = db.labels_trace = go.Scatter3d(x=pca_df.iloc[:,0], y=pca_df.iloc[:,1], z=pca_df.iloc[:,2], mode='markers',marker=dict(color = labels, colorscale='Viridis', size = 10, line = dict(color = 'gray',width = 5)))
layout = go.Layout(scene = Scene, height = 1000,width = 1000)
data = [trace]
fig = go.Figure(data = data, layout = layout)fig.update_layout(title="'DBSCAN Clusters (6) Derived from PCA'", font=dict(size=12,))
fig.show()

在我们开始之前,让我们快速统计一下每个集群中的员工数量。看起来第 0 类包含了大部分的数据点,这些数据点提供的信息并不多。事实上,如果我们使用ε值为 0.5 且最小点数为 5 来运行该算法,将会产生 63 个分类,分类 0 仍将包含 99%的雇员人口。

np.unique(labels, return_counts=True)

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

摘要

DBSCAN 是一种密度聚类算法,常用于非线性或非球形数据集。ε和最小点是两个必需的参数。ε是需要被认为足够“相似”以开始聚类的附近数据点内的半径。最后,最小点是需要在半径内的最小数量的数据点(即ε)才能被认为是一个集群。

在我们的示例中,我们试图根据 15,000 名员工的工作特征对他们的数据集进行聚类。我们首先对数据集进行标准化,以缩放特征。接下来,我们应用主成分分析,以便将维度/特征的数量减少到 3 个主成分。使用“肘法”,我们估计ε值为 0.2,最小点值为 6。使用这些参数,我们能够获得 53 个聚类、1,500 个异常值和-0.52 的轮廓得分。不用说,结果并不乐观。

接下来,我们尝试了一种迭代方法来微调ε和最小点参数。我们决定ε值为 1.0,最小点数值为 4。该算法返回 6 个有效聚类(一对一聚类),只有 7 个异常值,以及 0.46 的可观轮廓分数。但是,在绘制派生的分类时,发现第一个分类包含 99%的雇员。再次从业务的角度来看,我们希望我们的集群分布更加均匀,以便为我们提供关于员工的良好见解。

似乎 DBSCAN 不是这个特定数据集的最佳聚类算法。

这个相同的数据集使用 KMeans 进行聚类,并产生更加平等和明确的聚类(链接)。

人工智能的可解释性(以及它对教育人工智能的意义)

原文:https://towardsdatascience.com/explaining-educational-ai-c5f175850f0b?source=collection_archive---------39-----------------------

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

可解释性”——自从宣布人工智能以来,这个词已经出现在许多与技术相关的新闻报道中,对普通用户来说更有意义。我会回到为什么这很重要。

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

前几天我读了一篇关于我们如何信任他人的研究论文,这给我留下了一个有趣的想法。这篇论文(你可以在这里找到)的结论是,人们更信任不考虑后果就合作的人。

本质上,这意味着当人们盲目信任他人时,我们更容易信任他们。这是有道理的,谁会希望他们的朋友在伸出援手之前权衡利弊,或者一个商业伙伴考虑把你排除在外的得失呢?没有人。

但现在想想这如何转化为人工智能。

人工智能正是这么做的,它计算。它接收信息,并根据这些信息做出最佳决策。这项研究表明,当一个人这样做的时候,我们不会那么信任他们……那么我们为什么要信任完全这样做的人工智能呢?

简短的回答是:我们没有。

这项研究本质上告诉我们,我们自己被编程为不相信任何人或任何事来衡量它的选择,而不是本能地站在我们一边。但是 AI 没有本能。它拥有不能做任何事情的算法 但是 权衡它的选择。

所以我们就不能相信 AI?

我们可以。人工智能有巨大的潜力,如果我们正确使用它,它可以让我们在很多事情上做得更好。在过去,我谈过一点信息技术在教育中的潜在用途;在课堂上或去高校协助讲师。然而,这两个建议都需要对所使用的人工智能或技术有一定程度的信任。

所以,我相信你们中有些人会想"为什么这是一个问题?我们已经在生活中使用人工智能,即使它不是完全可信的,“还有一些人在想”我不信任人工智能,你在说什么?“这两个观点都很有道理,但都需要一点视角的转变。

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

Andrei Elekes 好心提供的 Gif

当然,我们可能已经在使用人工智能,就像可口可乐公司使用人工智能来规划其自动售货机的最佳位置,但这是不同的。我们可能会相信人工智能会做出这样的决定,或者我们可能会接受我们不需要相信它,因为它只是一台自动售货机。这和允许机器决定你孩子的教育没有任何相似之处

我最近看到的另一个有趣的研究是专门针对完全初学者的编程教学/学习。它专注于在不同的代码片段中寻找所谓的“信标”。当我们谈论计算机科学教育时,信标指的是可以帮助读者轻松识别其功能的特定代码行。

这篇研究是关于在向新学生介绍编程时突出正确方向的重要性。

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

用于确定信标的热图(摘自上面链接的论文)

这真的很有趣,因为将这项研究与人工智能相结合可以为学生定制一些课程。如果人工智能可以确定哪些线应该作为信标加以强调,它可能会彻底改变计算机科学的教学方式,并使该领域可以面向一大批学习风格不同的学生,这些学生可能与计算机科学中使用的传统教学方法不兼容。

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

听起来很神奇,对吧?

也许吧。但是,如果人工智能开始向学生展示错误的信标,会发生什么?如果结果证明它对一些学生强调什么做出了错误的决定呢?然后,学生们努力学习,并强调他们课程中错误的部分来练习。

所以…我们到底该不该相信 AI?

这不是一个容易回答的问题。我能给出的最好答案是肯定的,但有一些警告。至少这只是我的看法,但请听我说完。

我们可以用人工智能做令人惊奇的事情,但我们需要小心使用它。我们应该专注于确保我们理解人工智能的决策过程,然后才允许它负责像教育这样的大事情。所以这又回到了可解释性。

如果我们想要信任一个 AI,我们首先应该了解它是如何思考的。如果我们可以信任它如何做决定,那么也许我们可以信任它所做的决定,即使我们无法跟随它在特定决定上的“思维过程”。

我们能做些什么来实现这一点?

在个人层面上,我们都应该努力学习人工智能是如何工作的。这不仅仅局限于在 IT 行业工作或者觉得自己擅长数学或计算机的人;这适用于每个人。有一个很棒的(免费!赫尔辛基大学关于人工智能的在线课程,我强烈推荐给任何从零开始或者有一点经验的人。

你永远不知道,当你在学习可以做什么的时候,你可能会得到一点灵感。如果你这样做了,试试甲骨文的云试验吧。

人工智能无处不在,未来几年它只会变得更大。我们应该拥抱变化,但我们永远不应该忘记关注它。这是新的一年,新的十年;为什么不把这当成你了解这个迷人领域的机会呢?你永远不知道,它可能会在几年后教你的孩子!

解释 K 均值聚类

原文:https://towardsdatascience.com/explaining-k-means-clustering-5298dc47bad6?source=collection_archive---------1-----------------------

比较主成分分析和 t-SNE 降维技术在聚类识别雇员子群时的作用

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

埃里克·穆尔在 Unsplash 上拍摄的照片

今天的数据有各种形状和大小。NLP 数据包含书面文字,时序数据跟踪随时间推移的顺序数据移动(即股票),允许计算机通过例子学习的结构化数据,以及允许计算机应用结构的未分类数据。无论你拥有哪一个数据集,你都可以确定有一个算法可以破解它的秘密。在本文中,我们想要介绍一个名为 KMeans 的聚类算法,它试图发现隐藏在数据集中的隐藏子群。此外,我们将检查降维对从 KMeans 获得的聚类质量有什么影响。

在我们的示例中,我们将检查由 15,000 名员工组成的人力资源数据集。该数据集包含员工工作特征,如工作满意度、绩效得分、工作量、任职年限、事故、晋升次数。我们将应用知识手段来发现相似的员工群体。

聚类与分类有何不同?

分类问题会有我们试图预测的目标标签。著名的数据集如 Titanic 和 Iris 都是分类的首选,因为它们都有我们试图预测的目标(即幸存下来的还有物种)。此外,分类任务要求我们将数据分为训练和测试,其中分类器根据训练数据进行训练,然后通过测试数据集来衡量其性能。

在处理聚类问题时,我们希望使用算法来发现数据中有意义的组。也许我们正试图发现客户群或识别数据中的异常。无论哪种方式,该算法在很少人为干预的情况下发现了这些群体,因为我们没有目标标签可以预测。

也就是说,我们可以通过首先识别组/聚类,然后构建监督模型来预测聚类成员,从而将非监督聚类算法与监督算法结合起来。

K-Means 是怎么施展魔法的?

在其核心,KMeans 试图将数据组织到指定数量的集群中。 不幸的是,由我们来决定我们希望找到的集群的数量 ,但恐怕我们没有工具来协助这个过程。KMeans 的目标是识别 相似的 数据点 并将它们聚类在一起,同时尝试 尽可能远离每个聚类 。它的“相似性”计算是通过两点之间的欧几里德距离或普通直线来确定的( Wiki )。欧几里德距离越短,点越相似。

首先,用户(即。您或我)确定 KMeans 需要查找的聚类数。聚类的数量不能超过数据集中要素的数量。接下来,KMeans 将为每个质心选择一个随机点。质心的数量等于所选簇的数量。质心是围绕其构建每个聚类的点。

第二,计算每个点和每个质心之间的欧几里德距离。每个点最初将根据欧几里德距离被分配给最近的质心/聚类。每个数据点可以属于一个聚类或质心。然后,该算法对每个聚类的欧几里德距离(每个点和质心之间)进行平均,并且该点成为新的质心。这个平均聚类内欧几里得距离并分配新质心的过程重复进行,直到聚类质心不再移动。下面的动画显示了这个过程,如果需要,刷新页面。

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

http://shabal.in/visuals/kmeans/6.html

选择初始质心

我们需要知道 KMeans 如何选择初始质心,以及这会产生什么问题。如果没有我们的干预,KMeans 将随机选择初始质心,这最终会在相同的数据上产生不同的聚类。从下面的图中,我们可以看到在两种不同的情况下运行 KMeans 算法会产生不同的初始质心。在第一次和第二次运行 KMeans 之间,相同的数据点被分配给不同的聚类。

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

第一次初始化

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

第二次初始化

不要害怕,Sklearn 是我们的后盾!Sklearn KMeans 库有一些参数,比如“n_int”和“max_iter ”,可以缓解这个问题。“n_int”参数决定了 KMeans 随机选择不同质心的次数。“Max_iter”决定了将运行多少次迭代。迭代是寻找距离、取平均距离和移动质心的过程。

如果我们将参数设置为 n_int=25,max_iter=200,则 Means 将随机选择 25 个初始质心,并运行每个质心多达 200 次迭代。这 25 个质心中最好的将成为最终的聚类。

Sklearn 还有一个“int”参数,它将随机选择第一个质心,并定位所有离第一个质心最远的数据点。然后,第二个质心被分配在那些远点附近,因为它们不太可能属于第一个质心。Sklearn 默认选择“int=kmeans++”,这应用了上述逻辑。

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

如何确定聚类数?

“您提到了需要选择集群的数量……。?我们如何做到这一点?”

领域知识:通常我们在收集数据集的领域拥有一定水平的知识和经验。这种专业知识可以让我们设定我们认为存在于一般人群中的聚类数。

假设检验:设定一个特定的聚类数也可以作为我们可能有的某个假设的检验。例如,在分析营销数据时,我们有一种预感,有 3 个客户群非常可能、可能和不可能购买我们的产品。

数据是预先标记的:有时候我们分析的数据带有预先标记的目标。这些数据集通常用于有监督的 ML 问题,但这并不意味着我们不能对数据进行聚类。预先标记的数据是唯一的,因为您需要从初始分析中移除目标,然后使用它们来验证模型对数据的聚类效果。

肘方法:这是一种非常流行的迭代统计技术,通过对一系列聚类值实际运行 K-Means 算法来确定最佳聚类数。对于 KMeans 的每次迭代,肘形法计算每个点到其指定质心的距离平方和。每次迭代都要经过不同数量的集群。结果是一个折线图,显示每个聚类的平方距离之和。我们希望选择折线图肘部的聚类数或最小距离平方和(即。惯性)。距离平方和越小,意味着每个分类中的数据分组越紧密。

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

缩放:标准化

KMeans 对比例非常敏感,要求所有要素的比例相同。KMeans 会将更多的权重或重点放在方差较大的特征上,这些特征会对最终的聚类形状产生更大的影响。例如,让我们考虑一个汽车信息数据集,如重量(lbs)和马力(hp)。如果所有汽车之间的重量差异较大,平均欧几里得距离将会受到重量的更大影响。最终,重量比马力更能影响每个集群的成员。

高维度

诸如 KMeans 之类的聚类算法很难准确地聚类高维数据(即功能太多)。我们的数据集不一定是高维的,因为它包含 7 个要素,但即使是这个数量也会给 KMeans 带来问题。我建议你探索一下维度的诅咒以获得更多细节。正如我们前面看到的,许多聚类算法使用距离公式(即欧几里德距离)来确定聚类成员资格。当我们的聚类算法有太多的维度时,成对的点将开始有非常相似的距离,我们将不能获得有意义的聚类。

在这个例子中,我们将在运行 K-Means 聚类算法之前比较 PCA 和 t-SNE 数据简化技术。让我们花几分钟来解释 PCA 和 t-SNE。

主成分分析

主成分分析(PCA)是一种经典的方法,我们可以用它将高维数据降低到低维空间。换句话说,我们根本无法精确地可视化高维数据集,因为我们无法可视化 3 个要素以上的任何内容(1 个要素=1D,2 个要素= 2D,3 个要素=3D 绘图)。PCA 背后的主要目的是将具有 3 个以上特征(高维)的数据集转换成典型的 2D 或 3D 图,供我们这些虚弱的人使用。这就是低维空间的含义。PCA 背后的美妙之处在于,尽管减少到低维空间,我们仍然保留了原始高维数据集的大部分(+90%)方差或信息。来自我们原始特征的信息或差异被“挤压”到 PCA 所称的主成分(PC)中。第一台 PC 将包含原始特征的大部分信息。第二台电脑将包含第二大信息量,第三台电脑包含第三大信息量,依此类推。PC 是不相关的(即正交的),这意味着它们都包含独特的信息片段。我们通常可以“挤压”大多数(即 80–90 %)的信息或包含在原始特征中的变化分解成几个主要成分。我们在分析中使用这些主要成分,而不是使用原始特征。这样,我们可以仅用 2 或 3 个主成分而不是 50 个特征进行分析,同时仍然保持原始特征的 80–90%的信息。

让我们来看看 PCA 是如何变魔术的一些细节。为了使解释变得简单一点,让我们看看如何减少具有两个特征的数据集(即 2D)在一个主成分(1D)。也就是说,将 50 个特征缩减为 3 或 4 个主成分使用了相同的方法。

我们有一张体重和身高的 2D 图。换句话说,我们有一个 7 人的数据集,并绘制了他们的身高与体重的关系。

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

首先,PCA 需要通过测量每个点到 y 轴(身高)和 x 轴(体重)的距离来确定数据的中心。然后计算两个轴的平均距离(即身高和体重)并使用这些平均值将数据居中。

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

然后 PCA 将绘制第一主成分(PC1)或最佳拟合线,其最大化体重和身高之间的方差或信息量。 它通过最大化投影到最佳拟合线上的点到原点的距离来确定最佳拟合线(即下面蓝光)。 它对每个绿点都这样做,然后它对每个距离进行平方,去掉负值,并对所有值求和。最佳拟合线或 PC1 将具有从原点到所有点的投影点的最大距离平方和。

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

现在,我们只需将轴旋转到 PC1 现在是 x 轴的位置,我们就完成了。

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

如果我们想要将 3 个特征减少到两个主要成分,我们将简单地在 2D 空间中放置一条与我们的最佳拟合线垂直的线(y 轴)。为什么是垂直线?因为每个主分量与所有其他特征正交或不相关。如果我们想要找到第三个主分量,我们将简单地找到另一条到 PC1 和 PC2 的正交线,但是这次是在 3D 空间中。

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

从下面的柱状图可以看出,我们最初是从一个包含 5 个要素的数据集开始的。记住主成分的数量总是等于特征的数量。然而,我们可以看到,前 2 个主成分占原始 5 个特征中包含的方差或信息的 90%。这就是我们如何确定主成分的最佳数量。重要的是要记住 PCA 经常用于可视化非常高维的数据(即数以千计的特征),因此,您将最常看到 2 或 3 个主成分的 PCA。

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

t 分布随机邻居嵌入(t-SNE)

就像 PCA 一样,t-SNE 提取高维数据,并将其简化为低维图形(通常为二维)。这也是一个很好的降维技术。与主成分分析不同,t-SNE 可以降低非线性关系的维数。换句话说,如果我们的数据具有这种“瑞士滚”非线性分布,其中 X 或 Y 的变化与其他变量的恒定变化不一致。PCA 不能够准确地将这些数据提取到主成分中。这是因为 PCA 试图通过分布绘制最佳拟合线。在这种情况下,T-SNE 将是一个更好的解决方案,因为它根据点之间的距离计算相似性度量,而不是试图最大化方差。

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

让我们来看看 t-SNE 是如何将高维数据空间转换成低维空间的。它通过观察距离(想想欧几里德距离)来看局部或附近点之间的相似性。彼此相邻的点被认为是相似的。然后,t-SNE 将每对点的相似性距离转换成每对点的概率。如果在高维空间中两个点彼此靠近,它们将具有高概率值,反之亦然。这样,选择一组点的概率与它们的相似性成比例。

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

假设的高维空间

然后将每个点随机地投影到低维空间中。对于这个例子,我们在 1 维空间中绘图,但是我们也可以在 2 维或 3 维空间中绘图。为什么是 2d 还是 3d?因为那些是我们(人类)唯一能想象的维度。记住 t-SNE 首先是一个可视化工具,其次是一个降维工具。

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

随机投影到一维空间

最后,t-SNE 在低维空间中计算相似性概率得分,以便将这些点聚集在一起。结果是我们下面看到的一维图。

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

关于 t-SNE,我们需要讨论的最后一件事是“困惑”,这是运行算法时需要的参数。“困惑”决定了一个空间有多宽或多紧 t-SNE 捕捉到了点与点之间的相似之处。如果你的困惑是低的(也许 2),t-SNE 将只使用两个相似的点,并产生一个有许多分散集群的情节。然而,当我们将困惑度增加到 10 时,SNE 霸王龙会将 10 个相邻点视为相似,并将它们聚集在一起,从而形成更大的点群。有一个收益递减点,在这个点上,困惑会变得太大,我们会得到一个有一两个分散集群的地块。在这一点上,t-SNE 错误地认为不一定相关的点属于一个集群。根据最初发表的论文(链接),我们通常将困惑度设置在 5 到 50 之间。

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

困惑太低

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

困惑太高

t-SNE 的主要限制之一是它的高计算成本。如果你有一个非常大的特征集,最好先用主成分分析将特征数量减少到几个主成分,然后用 t-SNE 进一步将数据减少到 2 或 3 个聚类。

L 让我们回到克迈斯………

k 均值聚类评估

当使用无监督的 ML 算法时,我们经常不能将我们的结果与已知的真实标签进行比较。换句话说,我们没有测试集来衡量我们模型的性能。也就是说,我们仍然需要了解 K-Means 如何成功地对我们的数据进行聚类。通过查看肘形图和我们选择的聚类数,我们已经知道数据在我们的聚类中包含的紧密程度。

***剪影法:*该技术衡量聚类之间的可分性。首先,找出每个点和一个聚类中所有其他点之间的平均距离。然后它测量每个点与其他簇中每个点之间的距离。我们减去两个平均值,然后除以较大的平均值。

我们最终想要一个高(即。最接近 1)的分数,其将指示存在小的群内平均距离(紧密的群)和大的群间平均距离(充分分离的群)。

***视觉聚类解释:*一旦你获得了你的聚类,解释每个聚类是非常重要的。这通常是通过将原始数据集与聚类合并并可视化每个聚类来完成的。每个聚类越清晰和明显越好。我们将在下面回顾这个过程。

我们群集吧!

下面是分析计划:

  1. 使数据标准化
  2. 对原始数据集应用 KMeans
  3. 通过主成分分析的特征约简
  4. 将 KMeans 应用于 PCA 主成分分析
  5. 基于 t-SNE 的特征约简
  6. 将 KMeans 应用于 t-SNE 聚类
  7. 比较主成分分析和 t-SNE 均值聚类
*import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import seaborn as sns
import plotly.offline as pyo
pyo.init_notebook_mode()
import plotly.graph_objs as go
from plotly import tools
from plotly.subplots import make_subplots
import plotly.offline as py
import plotly.express as pxfrom sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from sklearn.metrics import silhouette_score%matplotlib inline
from warnings import filterwarnings
filterwarnings('ignore')with open('HR_data.csv') as f:
    df =  pd.read_csv(f, usecols=['satisfaction_level', 'last_evaluation', 'number_project',
       'average_montly_hours', 'time_spend_company', 'Work_accident','promotion_last_5years'])
f.close()df.head()*

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

这是一个相对干净的数据集,没有任何缺失值或异常值。我们看不到任何需要编码的混合型特征、奇数值或罕见标签。要素也具有较低的多重共线性。让我们继续扩展我们的数据集。

1.标准化

如上所述,数据的标准化最终将使所有特征达到相同的尺度,并使平均值为零,标准偏差为 1。

*scaler = StandardScaler()
scaler.fit(df)
X_scale = scaler.transform(df)df_scale = pd.DataFrame(X_scale, columns=df.columns)
df_scale.head()*

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

2.原始数据集上的 KMeans

让我们利用肘方法来确定 KMeans 应该获得的最佳集群数。看起来 4 或 5 个集群是最好的,为了简单起见,我们选择 4 个。

*sse = []
k_list = range(1, 15)for k in k_list:
    km = KMeans(n_clusters=k)
    km.fit(df_scale)
    sse.append([k, km.inertia_])

oca_results_scale = pd.DataFrame({'Cluster': range(1,15), 'SSE': sse})
plt.figure(figsize=(12,6))
plt.plot(pd.DataFrame(sse)[0], pd.DataFrame(sse)[1], marker='o')
plt.title('Optimal Number of Clusters using Elbow Method (Scaled Data)')
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')*

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

让我们对请求 4 个集群的原始数据集应用 KMeans。我们取得了 0.25 的剪影分数,这是低端。

*df_scale2 = df_scale.copy()kmeans_scale = KMeans(n_clusters=4, n_init=100, max_iter=400, init='k-means++', random_state=42).fit(df_scale2)print('KMeans Scaled Silhouette Score: {}'.format(silhouette_score(df_scale2, kmeans_scale.labels_, metric='euclidean')))labels_scale = kmeans_scale.labels_
clusters_scale = pd.concat([df_scale2, pd.DataFrame({'cluster_scaled':labels_scale})], axis=1)*

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

使用 PCA 将数据集减少为 3 个主要成分,我们可以将 KMeans 衍生的聚类绘制成 2D 和 3D 图像。PCA 可视化倾向于围绕一个中心点聚集聚类,这使得解释困难,但是我们可以看到聚类 1 和 3 与聚类 0 和 2 相比具有一些不同的结构。然而,当我们将集群绘制到 3D 空间中时,我们可以清楚地区分所有 4 个集群。

*pca2 = PCA(n_components=3).fit(df_scale2)
pca2d = pca2.transform(df_scale2)plt.figure(figsize = (10,10))
sns.scatterplot(pca2d[:,0], pca2d[:,1], 
                hue=labels_scale, 
                palette='Set1',
                s=100, alpha=0.2).set_title('KMeans Clusters (4) Derived from Original Dataset', fontsize=15)plt.legend()
plt.ylabel('PC2')
plt.xlabel('PC1')
plt.show()*

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

*Scene = dict(xaxis = dict(title  = 'PC1'),yaxis = dict(title  = 'PC2'),zaxis = dict(title  = 'PC3'))labels = labels_scaletrace = go.Scatter3d(x=pca2d[:,0], y=pca2d[:,1], z=pca2d[:,2], mode='markers',marker=dict(color = labels, colorscale='Viridis', size = 10, line = dict(color = 'gray',width = 5)))layout = go.Layout(margin=dict(l=0,r=0),scene = Scene, height = 1000,width = 1000)data = [trace]fig = go.Figure(data = data, layout = layout)
fig.show()*

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

3.通过主成分分析的特征约简

首先,让我们确定我们需要的主成分的最佳数量是多少。通过检查每个主成分包含的方差,我们可以看到前 3 个主成分解释了大约 70%的方差。最后,我们再次应用主成分分析,将我们的数据集减少到 3 个主成分。

*#n_components=7 because we have 7 features in the dataset
pca = PCA(n_components=7)
pca.fit(df_scale)
variance = pca.explained_variance_ratio_var = np.cumsum(np.round(variance, 3)*100)
plt.figure(figsize=(12,6))
plt.ylabel('% Variance Explained')
plt.xlabel('# of Features')
plt.title('PCA Analysis')
plt.ylim(0,100.5)plt.plot(var)*

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

*pca = PCA(n_components=3)
pca_scale = pca.fit_transform(df_scale)pca_df_scale = pd.DataFrame(pca_scale, columns=['pc1','pc2','pc3'])print(pca.explained_variance_ratio_)*

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

每台电脑解释的差异百分比

4.将 k 均值应用于 PCA 主成分分析

现在,我们已经将 7 个要素的原始数据集减少到只有 3 个主成分,让我们应用 KMeans 算法。我们再次需要确定集群的最佳数量,而 4 似乎是正确的选择。重要的是要记住,我们现在使用 3 个主成分而不是最初的 7 个特征来确定最佳聚类数。

*sse = []
k_list = range(1, 15)for k in k_list:
    km = KMeans(n_clusters=k)
    km.fit(pca_df_scale)
    sse.append([k, km.inertia_])

pca_results_scale = pd.DataFrame({'Cluster': range(1,15), 'SSE': sse})
plt.figure(figsize=(12,6))
plt.plot(pd.DataFrame(sse)[0], pd.DataFrame(sse)[1], marker='o')
plt.title('Optimal Number of Clusters using Elbow Method (PCA_Scaled Data)')
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')*

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

现在我们准备将 KMeans 应用于 PCA 主成分。我们可以看到,通过传递 KMeans 低维数据集,我们能够将轮廓得分从 0.25 提高到 0.36。查看 2D 和 3D 散点图,我们可以看到聚类之间的区别有了显著改善。

*kmeans_pca_scale = KMeans(n_clusters=4, n_init=100, max_iter=400, init='k-means++', random_state=42).fit(pca_df_scale)
print('KMeans PCA Scaled Silhouette Score: {}'.format(silhouette_score(pca_df_scale, kmeans_pca_scale.labels_, metric='euclidean')))labels_pca_scale = kmeans_pca_scale.labels_
clusters_pca_scale = pd.concat([pca_df_scale, pd.DataFrame({'pca_clusters':labels_pca_scale})], axis=1)*

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

*plt.figure(figsize = (10,10))sns.scatterplot(clusters_pca_scale.iloc[:,0],clusters_pca_scale.iloc[:,1], hue=labels_pca_scale, palette='Set1', s=100, alpha=0.2).set_title('KMeans Clusters (4) Derived from PCA', fontsize=15)plt.legend()
plt.show()*

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

5.基于 t-SNE 的特征约简

当我们将维数减少到 3 个主成分时,我们可以看到 KMeans 对数据进行聚类的能力有了明显的提高。在本节中,我们将再次使用 t-SNE 缩减我们的数据,并将 KMeans 的结果与 PCA KMeans 的结果进行比较。我们将减少到 3 个 t-SNE 组件。请记住,t-SNE 是一个计算量很大的算法。使用’ n_iter '参数可以减少计算时间。此外,您在下面看到的代码是“困惑”参数多次迭代的结果。任何超过 80 的困惑倾向于将我们的数据聚集成一个大的分散的集群。

*tsne = TSNE(n_components=3, verbose=1, perplexity=80, n_iter=5000, learning_rate=200)
tsne_scale_results = tsne.fit_transform(df_scale)tsne_df_scale = pd.DataFrame(tsne_scale_results, columns=['tsne1', 'tsne2', 'tsne3'])plt.figure(figsize = (10,10))
plt.scatter(tsne_df_scale.iloc[:,0],tsne_df_scale.iloc[:,1],alpha=0.25, facecolor='lightslategray')
plt.xlabel('tsne1')
plt.ylabel('tsne2')
plt.show()*

下面是将我们的原始数据集缩减为绘制在 2D 空间中的 3 个 t-SNE 分量的结果。

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

6.将 KMeans 应用于 t-SNE 聚类

对于我们的 KMeans 分析来说,4 似乎又是一个神奇的聚类数。

*sse = []
k_list = range(1, 15)for k in k_list:
    km = KMeans(n_clusters=k)
    km.fit(tsne_df_scale)
    sse.append([k, km.inertia_])

tsne_results_scale = pd.DataFrame({'Cluster': range(1,15), 'SSE': sse})
plt.figure(figsize=(12,6))
plt.plot(pd.DataFrame(sse)[0], pd.DataFrame(sse)[1], marker='o')
plt.title('Optimal Number of Clusters using Elbow Method (tSNE_Scaled Data)')
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')*

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

将 KMeans 应用于我们的 3 t-SNE 衍生组件,我们能够获得 0.39 的轮廓得分。如果您还记得从 KMeans 获得的 PCA 的 3 个主成分的轮廓分数是 0.36。一个相对较小的改进,但仍然是一个进步。

*kmeans_tsne_scale = KMeans(n_clusters=4, n_init=100, max_iter=400, init='k-means++', random_state=42).fit(tsne_df_scale)print('KMeans tSNE Scaled Silhouette Score: {}'.format(silhouette_score(tsne_df_scale, kmeans_tsne_scale.labels_, metric='euclidean')))labels_tsne_scale = kmeans_tsne_scale.labels_
clusters_tsne_scale = pd.concat([tsne_df_scale, pd.DataFrame({'tsne_clusters':labels_tsne_scale})], axis=1)*

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

对 SNE 霸王龙的解释可能有点违反直觉,因为 SNE 霸王龙星团的密度(即低维空间)与原始(高维空间)数据集中的数据关系不成比例。换句话说,我们可以从 k 均值聚类中获得高质量的密集聚类,但 t-SNE 可能会将它们显示为非常宽的聚类,甚至显示为多个聚类,尤其是当困惑度太低时。在阅读 t-SNE 图时,密度、聚类大小、聚类数量(在同一个 k 均值聚类下)和形状真的没有什么意义。对于同一个 KMeans 聚类,我们可以有非常广泛、密集甚至多个聚类(尤其是当困惑度太低时),但这与聚类的质量无关。相反,SNE 霸王龙的主要优势是每个克曼星团的距离和位置。彼此靠近的集群将彼此更加相关。然而,这并不意味着彼此远离的集群在比例上是不同的。最后,我们希望看到使用 t-SNE 显示的 k 均值聚类之间的某种程度的分离。

*plt.figure(figsize = (15,15))
sns.scatterplot(clusters_tsne_scale.iloc[:,0],clusters_tsne_scale.iloc[:,1],hue=labels_tsne_scale, palette='Set1', s=100, alpha=0.6).set_title('Cluster Vis tSNE Scaled Data', fontsize=15)plt.legend()
plt.show()*

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

*Scene = dict(xaxis = dict(title  = 'tsne1'),yaxis = dict(title  = 'tsne2'),zaxis = dict(title  = 'tsne3'))labels = labels_tsne_scaletrace = go.Scatter3d(x=clusters_tsne_scale.iloc[:,0], y=clusters_tsne_scale.iloc[:,1], z=clusters_tsne_scale.iloc[:,2], mode='markers',marker=dict(color = labels, colorscale='Viridis', size = 10, line = dict(color = 'yellow',width = 5)))layout = go.Layout(margin=dict(l=0,r=0),scene = Scene, height = 1000,width = 1000)data = [trace]fig = go.Figure(data = data, layout = layout)
fig.show()*

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

7.比较 PCA 和 t-SNE 衍生的 k 均值聚类

盯着 PCA/t-SNE 图并比较评估指标(如轮廓得分)将为我们提供从 KMeans 导出的聚类的技术视角。如果我们想从业务的角度理解集群,我们需要对照原始特性检查集群。换句话说,什么类型的雇员组成了我们从 KMeans 获得的集群。这种分析不仅有助于指导业务和潜在的持续分析,还能让我们深入了解集群的质量。

让我们首先将 KMeans 集群与原始的未缩放特征合并。我们将创建两个独立的数据框。一个用于 PCA 导出 k 均值聚类,一个用于 t-SNE k 均值聚类。

*cluster_tsne_profile = pd.merge(df, clusters_tsne_scale['tsne_clusters'], left_index=True, right_index=True )cluster_pca_profile = pd.merge(df, clusters_pca_scale['pca_clusters'], left_index=True, right_index=True )*

让我们通过基于每个单独的特征来比较聚类,从聚类的单变量回顾开始。

*for c in cluster_pca_profile:
    grid = sns.FacetGrid(cluster_pca_profile, col='pca_clusters')
    grid.map(plt.hist, c)*

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

*for c in cluster_tsne_profile:
    grid = sns.FacetGrid(cluster_tsne_profile, col='tsne_clusters')
    grid.map(plt.hist, c)*

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

满意度 X 上次评估

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

当我们从双变量的角度来研究集群时,真正的乐趣就开始了。当我们检查员工满意度和最后的评估分数时,我们可以看到从我们的主成分得到的 KMeans 聚类更加明确。我们将把我们对满意度和绩效之间的二元关系的检验集中在从 PCA 得到的聚类上。

聚类 0 代表最大数量的员工(7488),他们平均对工作相对满意,表现得分范围很广。因为这个集群代表了将近 50%的人口,所以我们看到如此大范围的满意度和绩效分数也就不足为奇了。还有一个规模较小但很明显的非常满意的高绩效员工群体。

集群 1 代表了劳动力的关键部分,因为这些是非常高绩效的员工,但不幸的是,员工满意度极低。事实上,集群 1 代表了 20%的劳动力,这只会增加情况的严重性。不满意的员工面临更大的自愿离职风险。他们的高分不仅表明了他们的熟练程度,也表明了他们潜在的机构知识。失去这些员工会导致组织知识和绩效的显著下降。看到组织级别(即经理、董事、执行董事)。失去大部分高级管理人员是一个重大问题。

第 2 组似乎代表了满意度较低的低绩效员工。同样,不满意的员工面临更高的自愿离职风险,由于他们的低绩效评估,我们可能会将这些员工视为“建设性离职”。换句话说,这些员工的自愿离职实际上可能对组织是一件好事。我们必须从两个不同的角度来看待这些结果。首先,这些雇员占总人口的 25%以上。如果这些员工中有很大一部分辞职,组织可能很难拥有足够的员工来成功履行其职能。其次,如此大比例的人不满意和表现不佳充分说明了组织的招聘、管理和培训功能。这些员工可能是组织计划不完善的结果。如果公司能更深入地探究是什么让这些员工不满意和表现不佳,那将会给自己带来巨大的好处。

最后,聚类 3 仅包含 2%的人口,并且没有可辨别的分布。我们需要一个更大的数据集来充分发掘这些员工。

*plt.figure(figsize=(15,10))
fig , (ax1, ax2) = plt.subplots(1,2, figsize=(20,15))
sns.scatterplot(data=cluster_pca_profile, x='last_evaluation', y='satisfaction_level', 
                hue='pca_clusters', s=85, alpha=0.4, palette='bright', ax=ax1).set_title(
    '(PCA) Clusters by satisfaction level and last_evaluation',fontsize=18)sns.scatterplot(data=cluster_tsne_profile, x='last_evaluation', y='satisfaction_level', 
                hue='tsne_clusters', s=85, alpha=0.4, palette='bright', ax=ax2).set_title('(tSNE) Clusters by satisfaction level and last evaluation', fontsize=18)*

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

满意度 X 平均每月小时数

非常有趣的是,满意度和绩效得分之间的二元关系几乎等同于满意度和每月平均工作时间。同样,从 PCA 得到的 k 均值聚类明显更加明显,让我们将注意力集中在 PCA 特征上。

看起来,PCA 集群 0 中的员工不仅表现出色,而且平均每月工作时间也很长。总的来说,这些结果是有希望的,因为大多数员工总体上是快乐的,表现令人钦佩,并且工作时间很长。

集群 1 员工再次不满意,平均每月工作时间最长。如果你还记得的话,这些人也是非常优秀的员工。这些长时间的工作很可能会对他们的整体工作满意度产生影响。请记住,第 1 类员工中有一个人数较少但正在崛起的群体,他们总体上感到满意,表现非常好。在我们的数据集中可能不止有 4 个聚类。

集群 2 的员工不仅表现不佳,而且平均月工作时间也最低。请记住,这个数据集可能有点失真,因为一个月工作 160 小时被视为全职。

最后,聚类 3 再次没有出现在图中。

*plt.figure(figsize=(15,10))
fig , (ax1, ax2) = plt.subplots(1,2, figsize=(20,15))
sns.scatterplot(data=cluster_pca_profile, x='average_montly_hours', y='satisfaction_level', 
                hue='pca_clusters',s=85, alpha=0.4, palette='bright', ax=ax1).set_title(
    '(PCA) Clusters by Satisfaction Level and Average Monthly Hours',fontsize=18)sns.scatterplot(data=cluster_tsne_profile, x='average_montly_hours', y='satisfaction_level', 
                hue='tsne_clusters', s=85, alpha=0.4, palette='bright', ax=ax2).set_title(
    '(tSNE) Clusters by Satisfaction Level and Average Monthly Hours', fontsize=18)*

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

满意度 X 花在公司的时间(任期)

当我们继续我们的二元图时,我们比较了满意度和在公司或任期内花费的时间。不足为奇的是,PCA 主成分的 k 均值聚类要明显得多。t-SNE 图与 PCA 图的形状相似,但其聚类更加分散。通过查看 PCA 图,我们发现了一个关于 0 类或绝大多数(50%)员工的重要发现。群组 0 中的员工主要在公司工作了 2 到 4 年。这是一个相当常见的统计数据,因为随着任期的增加,延长任期(即 5 年以上)的员工数量将会减少。此外,他们的总体高满意度表明平均任期可能会增加,因为满意的员工不太可能辞职。

分类 1 有点难以描述,因为它的数据点分散在两个不同的分类中。总的来说,他们的任期在 4 到 6 年之间变化不大,然而,他们的满意度却相反。有一个集群是高工作满意度和一个更大的集群与非常低的工作满意度。看起来集群 1 可能包含两个不同的雇员组。那些对工作很开心又很不满意的人。也就是说,尽管他们的满意度不同,但他们的工作表现、平均每月工作时间和任期都更高。看起来第一组要么快乐要么不快乐,都是非常努力和忠诚的员工。

聚类 2 遵循与上述图相同的模式。他们不仅对工作不满意,而且平均任期也是最低的。然而,重要的是要记住这些员工占组织的 26%。失去这些员工中的很大一部分会产生问题。最后,不满意的员工不太可能参与组织公民行为,如利他主义、尽责、乐于助人,而更有可能参与反生产的工作行为,这可能会产生有毒的文化。从任期、公司级别、离职率、地点和工作类型等方面剖析这些员工将非常有助于诊断问题和制定行动计划。

最后,第三组仍然过于分散,无法为我们提供任何有用的信息。根本没有足够的员工来识别任何有用的模式。

*plt.figure(figsize=(15,10))
fig = plt.subplots(1,2, figsize=(20,15))
ax1 = sns.catplot(data=cluster_pca_profile, x='time_spend_company', y='satisfaction_level', 
                hue='pca_clusters', jitter=0.47, s=7, alpha=0.5, height=8, aspect=1.5, palette='bright')
ax2 = sns.catplot(data=cluster_tsne_profile, x='time_spend_company', y='satisfaction_level', 
                hue='tsne_clusters', jitter=0.47, s=7, alpha=0.5, height=8, aspect=1.5, palette='bright')
ax1.fig.suptitle('(PCA) Clusters by satisfaction level and time_spend_company', fontsize=16)
ax2.fig.suptitle('(t-SNE) Clusters by satisfaction level and time_spend_company', fontsize=16)
plt.close(1)
plt.close(2)*

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

满意度 X 项目数量

然而,五氯苯甲醚衍生的聚类再次优于 SNE 霸王龙,只是略微领先。集群 0 继续遵循类似的趋势,总体上快乐的员工有平均数量的项目。没什么可过分兴奋或担心的。这可能为组织的员工指出理想的项目数量。

集群 1 的员工也在跟随他们的趋势,我们在之前的图表中已经看到了这一点。看到项目数量时,非常不满意正在极其努力地工作的员工。如果你还记得的话,这个小组在这个月也工作了很长时间。我们再一次看到一个较小但明显的满意的员工团队在平均数量的项目上工作。这与我们在满意度 X 任期、平均每月工作时间和上次评估分数中看到的趋势相同。肯定还有另一群非常满意和努力工作的员工。在招聘方面更深入地了解这些员工(即来源、招聘人员)、管理实践、薪酬,可能会导致对成功的招聘和雇用实践的洞察。这些见解也可能有助于组织了解如何转化表现不佳的员工。

集群 2 也在跟随它的趋势。不太满意的员工在很少的项目上工作。这种趋势在所有满意的双变量关系中都可以看到。

第三组太小,无法看出任何明显的趋势。

*plt.figure(figsize=(15,10))
fig = plt.subplots(1,2, figsize=(20,15))
ax1 = sns.catplot(data=cluster_pca_profile, x='number_project', y='satisfaction_level', 
                hue='pca_clusters', jitter=0.47, s=7, alpha=0.5, height=8, aspect=1.5, palette='bright')
ax2 = sns.catplot(data=cluster_tsne_profile, x='number_project', y='satisfaction_level', 
                hue='tsne_clusters', jitter=0.47, s=7,alpha=0.5, height=8, aspect=1.5, palette='bright')
ax1.fig.suptitle('(PCA) Clusters by Satisfaction Level and Number of Projects', fontsize=16)
ax2.fig.suptitle('(t-SNE) Clusters by Satisfaction Level and Number of Projects', fontsize=16)
plt.close(1)
plt.close(2)*

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

8.摘要

我们当然可以继续检查每个聚类和我们的特征之间的二元关系,但我们看到了一个明确的趋势。以下是我们敦促您检查的其余关系图。

本文的目的是检验不同降维技术(即主成分分析和 t-SNE)将对 KMeans 产生的聚类质量产生影响。我们检查了一个相对干净的人力资源数据集,包括超过 15,000 名员工及其工作特征。从最初的 7 个特征,我们设法将数据集减少到 3 个主要成分和 3 个 t-SNE 成分。我们的轮廓分数范围从 0.25(未缩减数据集)到 0.36(主成分分析)和 0.39 (t-SNE)。通过目测,PCA 和 t-SNE 衍生的 KMeans 聚类与未简化的原始 7 个特征相比,在数据聚类方面做得更好。直到我们开始比较主成分分析和 t-SNE 均值聚类在员工工作特征方面的差异,我们才发现了显著的差异。PCA 方法提取的聚类似乎产生更清晰和明确的聚类。

从商业的角度来看,如果没有对 PCA KMeans 聚类进行总结,我们会对读者造成伤害。

聚类 0: 该聚类包含数据集中的大多数员工(50%)。这个集群主要包含普通员工。他们的工作满意度保持在一个平均水平,他们的月工作时间有一个很大的范围,但没有延伸到极限。他们的表现也是如此,因为他们大多保持着令人满意的成绩。这些员工参与的项目数量平均也在 3 到 5 个之间。我们看到的这些员工的唯一异常值是他们在公司相对年轻的任期(2-4 年)。这些结果并不罕见,因为即使是拥有足够员工的组织也会在许多因素上遵循高斯分布。随着样本量的增加,我们在统计上将有更高的概率选择位于分布中间的员工,离群值对分布的拉动将越来越小(即回归到平均值)。很容易理解为什么 KMeans 创建了这个员工集群。

集群 1: 有时,这群员工有一定的双重性或并列性。一方面,我们看到了一群非常不满意的员工,他们取得了绝对惊人的绩效分数,工作时间非常长,管理着大量的项目,任期超过平均水平,并且零事故发生。换句话说,对组织不满的非常努力和有价值的员工。如果这些员工开始流动,公司将在生产力和知识方面遭受重大损失。

另一方面,我们看到了一个较小但明显的非常满意的员工群体,他们有着惊人的绩效分数、高于平均水平的项目数量、每月工作时间和任期。无论如何,公司有幸拥有模范员工。满意度无疑是分裂因素,因为当我们将团队的表现与任期甚至项目数量进行比较时,这两个独特的团队往往会合并。

看起来还有其他员工没有被 KMeans 识别出来。对于 KMeans 算法来说,也许 5 个甚至 6 个聚类可能是更好的标准。

聚类 2: 虽然这个聚类没有像聚类 0 那样被很好地定义,但是我们能够在数据中看到一个明确的趋势。平均而言,这些员工对公司并不十分满意。他们的表现通常处于较低水平。他们在最少的项目上每月工作最少的时间。他们的任期平均在 3 年左右。

集群 3: 最后,集群 3 的员工约占数据集的 2%,这使得几乎不可能在数据中识别出任何可辨别的趋势。

*plt.figure(figsize=(15,10))
fig = plt.subplots(1,2, figsize=(20,15))
ax1 = sns.catplot(data=cluster_pca_profile, x='Work_accident', y='satisfaction_level', 
                hue='pca_clusters', jitter=0.47, s=7, alpha=0.3, height=8, aspect=1.5, palette='bright')
ax2 = sns.catplot(data=cluster_tsne_profile, x='Work_accident', y='satisfaction_level', 
                hue='tsne_clusters', jitter=0.47, s=7, alpha=0.3, height=8, aspect=1.5, palette='bright')
ax1.fig.suptitle('(PCA) Clusters by Satisfaction Level and Work Accident', fontsize=16)
ax2.fig.suptitle('(t-SNE) Clusters by Satisfaction Level and Work Accident', fontsize=16)
plt.close(1)
plt.close(2)*

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

*plt.figure(figsize=(15,10))
fig = plt.subplots(1,2, figsize=(20,15))
ax1 = sns.catplot(data=cluster_pca_profile, x='number_project', y='last_evaluation', 
                hue='pca_clusters', jitter=0.47, s=7, alpha=0.4, height=8, aspect=1.5, palette='bright')
ax2 = sns.catplot(data=cluster_tsne_profile, x='number_project', y='last_evaluation', 
                hue='tsne_clusters', jitter=0.47, s=7, alpha=0.4, height=8, aspect=1.5, palette='bright')
ax1.fig.suptitle('(PCA) Clusters by Last Evaluation and Number Projects', fontsize=16)
ax2.fig.suptitle('(t-SNE) Clusters by Last Evaluation and Number Projects', fontsize=16)
plt.close(1)
plt.close(2)*

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

*plt.figure(figsize=(15,10))
fig , (ax1, ax2) = plt.subplots(1,2, figsize=(20,15))
sns.scatterplot(data=cluster_pca_profile, x='average_montly_hours', y='last_evaluation', 
                hue='pca_clusters', s=85, alpha=0.3, palette='bright', ax=ax1).set_title(
    '(PCA) Clusters by Last Evaluation and Average Montly Hours',fontsize=18)sns.scatterplot(data=cluster_tsne_profile, x='average_montly_hours', y='last_evaluation', 
                hue='tsne_clusters', s=85, alpha=0.3, palette='bright', ax=ax2).set_title(
    '(tSNE) Clusters by Last Evaluation and Average Montly Hours', fontsize=18)*

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

*plt.figure(figsize=(15,10))
fig = plt.subplots(1,2, figsize=(20,15))
ax1 = sns.catplot(data=cluster_pca_profile, x='time_spend_company', y='last_evaluation', 
                hue='pca_clusters', jitter=0.47, s=7, alpha=0.5, height=8, aspect=1.5, palette='bright')
ax2 = sns.catplot(data=cluster_tsne_profile, x='time_spend_company', y='last_evaluation', 
                hue='tsne_clusters', jitter=0.47, s=7, alpha=0.5, height=8, aspect=1.5, palette='bright')
ax1.fig.suptitle('(PCA) Clusters by Last Evaluation and Time Spend Company', fontsize=16)
ax2.fig.suptitle('(t-SNE) Clusters by  Last Evaluation and Time Spend Company', fontsize=16)
plt.close(1)
plt.close(2)*

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

*plt.figure(figsize=(15,10))
fig = plt.subplots(1,2, figsize=(20,15))
ax1 = sns.catplot(data=cluster_pca_profile, x='Work_accident', y='last_evaluation', 
                hue='pca_clusters', jitter=0.47, s=7, alpha=0.4, height=8, aspect=1.5, palette='bright')
ax2 = sns.catplot(data=cluster_tsne_profile, x='Work_accident', y='last_evaluation', 
                hue='tsne_clusters', jitter=0.47, s=7, alpha=0.4, height=8, aspect=1.5, palette='bright')
ax1.fig.suptitle('(PCA) Clusters by Last Evaluation and Work Accident', fontsize=16)
ax2.fig.suptitle('(t-SNE) Clusters by Last Evaluation and Work Accident', fontsize=16)
plt.close(1)
plt.close(2)*

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

*plt.figure(figsize=(15,10))
fig = plt.subplots(1,2, figsize=(20,15))
ax1 = sns.catplot(data=cluster_pca_profile, x='number_project', y='average_montly_hours', 
                hue='pca_clusters', jitter=0.47, s=7, alpha=0.5, height=8, aspect=1.5, palette='bright')
ax2 = sns.catplot(data=cluster_tsne_profile, x='number_project', y='average_montly_hours', 
                hue='tsne_clusters', jitter=0.47, s=7,  alpha=0.5, height=8, aspect=1.5, palette='bright')
ax1.fig.suptitle('(PCA) Clusters by Number Project and Average Montly Hours', fontsize=16)
ax2.fig.suptitle('(t-SNE) Clusters by Number Project and Average Montly Hours', fontsize=16)
plt.close(1)
plt.close(2)*

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

*plt.figure(figsize=(15,10))
fig = plt.subplots(1,2, figsize=(20,15))
ax1 = sns.catplot(data=cluster_pca_profile, x='number_project', y='time_spend_company',
                hue='pca_clusters', jitter=0.4, s=30, alpha=0.2, height=8, aspect=1.5, palette='bright')
ax2 = sns.catplot(data=cluster_tsne_profile, x='number_project', y='time_spend_company', 
                hue='tsne_clusters', jitter=0.4, s=30, alpha=0.2, height=8, aspect=1.5, palette='bright')
ax1.fig.suptitle('(PCA) Clusters by Number Project and Time Spend Company', fontsize=16)
ax2.fig.suptitle('(t-SNE) Clusters by Number Project and Time Spend Company', fontsize=16)
plt.close(1)
plt.close(2)*

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

*plt.figure(figsize=(15,10))
fig = plt.subplots(1,2, figsize=(20,15))
ax1 = sns.catplot(data=cluster_pca_profile, x='Work_accident', y='number_project',
                hue='pca_clusters', jitter=0.45, s=30, alpha=0.2, height=8, aspect=1.5, palette='bright')
ax2 = sns.catplot(data=cluster_tsne_profile, x='Work_accident', y='number_project', 
                hue='tsne_clusters', jitter=0.45, s=30, alpha=0.2, height=8, aspect=1.5, palette='bright')
ax1.fig.suptitle('(PCA) Clusters by Number Project and Work Accident', fontsize=16)
ax2.fig.suptitle('(t-SNE) Clusters by Number Project and Work Accident', fontsize=16)
plt.close(1)
plt.close(2)*

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

*plt.figure(figsize=(15,10))
fig = plt.subplots(1,2, figsize=(20,15))
ax1 = sns.catplot(data=cluster_pca_profile, x='time_spend_company', y='average_montly_hours', 
                hue='pca_clusters', jitter=0.47, s=7, alpha=0.4, height=8, aspect=1.5, palette='bright')
ax2 = sns.catplot(data=cluster_tsne_profile, x='time_spend_company', y='average_montly_hours', 
                hue='tsne_clusters', jitter=0.47, s=7, alpha=0.4, height=8, aspect=1.5, palette='bright')
ax1.fig.suptitle('(PCA) Clusters by Time Spend Company and Average Monthly Hours', fontsize=16)
ax2.fig.suptitle('(t-SNE) Clusters by  Time Spend Company and Average Monthly Hours', fontsize=16)
plt.close(1)
plt.close(2)*

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

*plt.figure(figsize=(15,10))
fig = plt.subplots(1,2, figsize=(20,15))
ax1 = sns.catplot(data=cluster_pca_profile, x='Work_accident', y='average_montly_hours', 
                hue='pca_clusters', jitter=0.47, s=7, alpha=0.4, height=8, aspect=1.5, palette='bright')
ax2 = sns.catplot(data=cluster_tsne_profile, x='Work_accident', y='average_montly_hours', 
                hue='tsne_clusters', jitter=0.47, s=7, alpha=0.4, height=8, aspect=1.5, palette='bright')
ax1.fig.suptitle('(PCA) Clusters by Work Accident and Average Monthly Hours', fontsize=16)
ax2.fig.suptitle('(t-SNE) Clusters by Work Accident and Average Monthly Hours', fontsize=16)
plt.close(1)
plt.close(2)*

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

*plt.figure(figsize=(15,10))
fig = plt.subplots(1,2, figsize=(20,15))
ax1 = sns.catplot(data=cluster_pca_profile, x='Work_accident', y='time_spend_company', 
                hue='pca_clusters', jitter=0.45, s=40, alpha=0.2, height=8, aspect=1.5, palette='bright')
ax2 = sns.catplot(data=cluster_tsne_profile, x='Work_accident', y='time_spend_company', 
                hue='tsne_clusters', jitter=0.45, s=40, alpha=0.2, height=8, aspect=1.5, palette='bright')
ax1.fig.suptitle('(PCA) Clusters by Work Accident and Time Spend Company', fontsize=16)
ax2.fig.suptitle('(t-SNE) Clusters by Work Accident and Time Spend Company', fontsize=16)
plt.close(1)
plt.close(2)*

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

向迈克尔·斯科特解释线性回归

原文:https://towardsdatascience.com/explaining-linear-regression-to-michael-scott-973ed050493c?source=collection_archive---------53-----------------------

如果我能在办公室的一个场景中总结出统计学对我的意义,那就是这个:

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

来源: Wiffle Gif

公式、希腊符号、复杂名称之间(均方根对数误差,有人吗?!),我发现核心概念变得难以理解或学习起来令人生畏。这篇文章的目标是让你直观地了解线性回归如何工作如何解释一个回归公式、r 用来表示什么。我的目标是不要像迈克尔那样,而要像奥斯卡那样,在这集有趣又有启发性的节目中,他教迈克尔什么是预算盈余。

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

来源: Tumblr

什么是线性回归,我们如何计算回归公式?

以奥斯卡为例,我将提出一个场景,我们正在经营一个柠檬水摊位,并希望找到最完美的配方来最大限度地提高销售额。假设我们要研究的第一个变量是甜度(每罐方糖),我们想了解它是否是售出杯子数量的良好预测指标。

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

我们收集了一罐柠檬水中的方糖数量以及从该罐中售出的玻璃杯数量的观察数据。来源:作者。

乍一看,甜度和售出的玻璃杯之间似乎存在正线性关系,越甜的柠檬水通常售出的玻璃杯越多。然而,我们无法评估甜度对销售量的预测效果,也无法预测加入超过 6 块方糖后售出的玻璃杯数量。这就是线性回归(有时称为普通最小二乘回归)的用武之地。

线性回归通过可用的数据点绘制最佳拟合直线,最佳拟合定义为最小化每个点和直线之间的距离总和。然后,我们可以使用这条线,根据添加的方糖数量来预测未来的销售,并了解销售数量的变化有多少可以归因于甜味。

线性回归的通用公式是 **y = mx + b,**其中 y 是 y 轴上的高度,m 是直线的斜率,x 是 x 轴上的位置,b 是直线与 y 轴相交的点。回归线的一个好的起始坐标是(x 平均值,y 平均值)。

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

趋势线的起始坐标是(3,18)-平均值 x 和平均值 y。该线从这里开始,因为该线的其余部分是通过绘制远离平均值的标准偏差来创建的。来源:作者。

接下来,我们找到穿过平均值的直线的斜率。这可以通过将 y 的标准偏差除以 x 的标准偏差 (std y / std x) 来实现,在我们的示例中,这给出了 5.18。

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

观测数据的汇总统计。来源:作者。

标准差告诉我们所有点和样本平均值之间的平均距离,所以用 y 标准值除以 x 标准值,就可以知道 x 轴上每变化一个单位,y 轴上平均可以变化多少个单位。此时,我们有一个工作版本的斜率(5.18),但如果我们将它乘以相关系数(5.18 x 0.88 = 4.55),它会更好地拟合这些点。这是因为 5.18 的斜率假设甜度和销售量之间存在完美的线性关系,但我们已经可以通过散点图看出这种关系并不遵循完美的直线。将斜率乘以关系的强度将使斜率更接近数据点。

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

我用蓝色的原始斜率(假设完全线性关系)和绿色的乘以相关系数的斜率绘制了回归线。两条趋势线都相当不错,但是你可以看到绿线更接近黄色的观察数据点。来源:作者。

希望你没有放弃这个柠檬水摊,决定只在 Instagram 上卖 Fit Tea,因为我保证我们快完成了。当我们第一次开始计算斜率时,你会记得我们的第一个点是(3,18)红色的。但是,我们创建的回归线都不经过这条线。那是因为我们还需要计算直线(b)的截距,这样会移动整条直线。

我们可以通过将已知的坐标(3,18)代入回归公式,求解 b。

18.29 = 4.55(3) + b

18.29 = 13.67 + b

b = 4.62

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

来源:作者。

这就是我们得到的——柠檬水甜度和售出杯数之间的线性回归,手工计算!(好吧——Google sheets,但在一个有 R 和 scikit-learn 的世界里,这还不如手工操作。)

解释回归公式

现在我们已经计算了公式,我们可以继续这个公式对我们的柠檬水摊位的影响。斜率(m)可以解释为x 每变化 1 个单位,y 就有 m 个变化。在我们的例子中,这意味着一罐柠檬水中多加一块方糖会多卖出 4.55 杯,多加两块方糖会多卖出 9.1 杯,依此类推。对于一块方糖来说,这是一个不错的投资回报!

y 截距(b)可以解释为当 x 等于 0 时 y 等于什么**。在我们的例子中,这意味着即使柠檬水中没有糖,我们也能卖出 4.62 杯柠檬水(也许有人在烤鲑鱼,在紧要关头需要柠檬汁?)**

从我们的柠檬水摊例子中,你可能已经知道解释回归公式有一些限制。即使一个公式在数学上行得通,你也需要考虑你试图预测的真实世界的背景。糖可能与柠檬水的销量成正相关,直到它达到某一点,之后它会迅速下降,因为柠檬水变得太甜了。

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

这张 GIF 有些令人不安,但这就是人们对你的柠檬水的感觉,如果你只根据线性回归来决定放多少糖# truthhacks # LizzosLinearRegression Source:Giphy

还有一点需要考虑的是,你可以把负的 x 值代入公式,得到对 y 的预测,但是在现实世界中,没有负方糖这种东西。

用 r 评估模型性能

在这一点上,基于散点图可视化,我们对模型的表现有了一个大致的概念。但是,如果我们想要量化性能并与其他模型进行比较,我们可以使用 r 值。r 有时被称为决定系数。

r 测量 y 中方差的百分比,可以通过 x 上的回归来解释,并且可以通过平方皮尔逊相关系数来获得。在我们的例子中,0.88 = 0.77,这意味着售出的柠檬水的 77%的差异可以单独归因于甜味!

在我们的例子中,我们只模拟了一个因变量(柠檬水甜度)的影响。然而,在具有多个变量的更复杂的模型中,一次添加一个变量并测量 r 的变化是理解每个变量在预测因变量中的重要性的好方法。

结论和附加资源

我希望你觉得这篇文章有趣又有启发性——至少,你喜欢我的 gif!我知道网上有很多线性回归教程,但我注意到其中很多都专注于在 Python / R 中实现回归,或者如何简单地应用公式。我觉得缺乏对这个概念的直观理解,想写一篇文章让你更好地理解为什么这个公式有效。

如果你还在寻找额外的材料来更好地理解这个概念,我建议看看汗学院关于二元数值数据的整个系列。它比我的文章更深入,甚至有练习题供您浏览。

快乐学习!

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

奥斯卡出局。来源:期限

用石灰解释机器学习分类器

原文:https://towardsdatascience.com/explaining-machine-learning-classifiers-with-lime-def5adaacfea?source=collection_archive---------39-----------------------

石灰在实践中的效果如何?

机器学习算法可以在分类、预测、异常检测和许多其他难题中产生令人印象深刻的结果。理解结果的基础通常是复杂的,因为许多算法是黑盒,很难看到它们的内部工作。可解释的 AI 是一个术语,指的是为 ML 算法输出提供人类可理解的解释的技术。

可解释的人工智能很有趣因为 许多 原因包括能够推理所使用的算法,我们用来训练它们的数据,以及更好地理解如何使用这些算法测试系统。

LIME局部可解释的模型不可知解释是最近似乎在该领域受到关注的一种技术。LIME 的想法是给它一个单独的数据点,以及要使用的 ML 算法,它将尝试为该特定数据点的 ML 算法的输出建立可理解的解释。如“因为发现此人打喷嚏咳嗽(datapoint 特征),所以很大概率是得了流感(ML 输出)”。

有大量介绍性的 文章 围绕石灰但我觉得我需要一些更具体的东西。所以我在几个分类器和数据集/数据点上尝试了一下。本文讨论了这些结果。

对于不耐烦的人,我可以总结石灰似乎很有趣,并在正确的方向上前进,但我仍然发现解释细节令人困惑。这并没有让我对解释很有信心。对于易于理解和高可信度的解释,似乎还有很多路要走。

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

如果故事很枯燥,给自己拿一杯酸橙饮料,继续读下去。图片来自 PixabaySteve buiss NNE

实验设置

概观

本文的实验分为三个部分。首先,我尝试使用 LIME 来解释专门为表格数据设计的三种不同 ML 算法的输出。第二,我尝试解释一般神经网络架构的输出。第三,我尝试了一个与前两个问题相反的回归问题,前两个问题检查了一个分类问题。这三个部分都使用 LIME 来解释一些数据点,每个数据点都来自不同的数据集。

反转值

作为一个小实验,对于我实验中的每个 ML 算法,我选取了一个被 LIME 评为对数据点的解释有较高贡献的单一特征,并反转(或改变)了它们的值。然后,我在相同的数据点上重新运行了 ML 算法和 LIME,改变了单个值,并比较了解释。

在大多数情况下,反转特征是二元分类特征(在一种情况下,分类具有 4 个可能的值),使得反转过程变得明显(例如,将性别从男性变为女性或者相反)。这样做的目的只是为了查看更改石灰权重较高的要素的值是否会导致 ML 算法输出和相关石灰权重变量重要性的较大变化。

数据集和要素

不同部分使用的数据集:

  • 《泰坦尼克号》:一个特定的人有哪些特征可以被归类为幸存者?
  • 心脏病 UCI :什么特征导致一个特定的人被归类为有心脏病风险?
  • 艾姆斯房屋数据集:哪些特征对预测房价有积极影响,哪些有消极影响?

树提升分类器

应用的算法:

  • 泰坦尼克号:来自 LGBM,CatBoost,XGBoost 的分类器
  • 心脏病 UCI: Keras 多层感知器神经网络架构
  • Ames 住房数据集:来自 XGBoost 的回归量

我在表格数据中看到的一些最流行的分类器是基于梯度增强决策树的分类器; LGBMCatboostXGBoost 。还有很多其他的方法,我有时也会用到,比如朴素贝叶斯、随机森林和逻辑回归。然而,LGBM、Catboost 和 XGBoost 是我最近经常首先尝试的表格数据。因此,在这一节中,我尝试使用 LIME 来解释这些 ML 算法的一些数据点。我希望对其他最大似然算法的类似评估应该遵循一个非常相似的过程。

对于这一部分,我使用的是 Titanic 数据集。这个数据集的目标是预测谁能在海难中幸存,谁不能。其特点:

  1. 存活 : 0 =否,1 =是
  2. pclass :车票等级(1 =第一,2 =第二,3 =第三)
  3. 年龄:以年为单位的年龄
  4. sibsp :泰坦尼克号上的兄弟姐妹/配偶数量
  5. 泰坦尼克号上父母/孩子的数量
  6. :票号
  7. 票价:客运票价
  8. 舱室:舱室编号
  9. 已装船:装船港(C =瑟堡,Q =皇后镇,S =南安普顿)

实际的笔记本代码在我的 GithubKaggle 笔记本上都有。

三个提升模型(LGBM、Catboost、XGBoost)中的每一个都以特征权重的形式提供对其内部统计数据的访问。详情查看部分文章文档。与 LIME 试图解释的单一数据点相反,这些类型的模型特征权重在所有数据点上提供了模型工作的更全面的视图。在下文中,我将展示这些特征权重,以便进行比较。

然而,也有一些非常好的批评使用这些类型的分类器内部统计进行特征重要性,注意到与其他技术如排列重要性和 drop-column 重要性进行比较可能也是有意义的。因此,我还计算了这里三个助推器中每一个的排列重要性,以及随后的 Keras NN 分类器。

LGBM

来自分类器/排列的特征权重

下图说明了当我通过分类器feature_importances_属性在 Titanic 数据集上训练模型时,模型本身给出的权重。

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

LGBM 报告了特征重要性。图片作者。

而下图所示的是 SKLearn 的置换重要性函数对同一分类器给出的。

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

排列重要性算法报告的特征重要性。图片作者。

比较上面的两种——基于模型统计的权重和基于排列的权重,它们的排名有很大的不同。接下来要记住一些有趣的事情。

数据点 1

下图说明了我在 Titanic 数据的测试集中选择的第一个数据点的 LIME 解释(图来自 LIME 本身):

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

用原始值(左)和一个反转值(右)解释单个数据点的分类。图片作者。

该图显示了同一数据点的两个版本。左边的是数据集的原始数据。右边的那个把性别属性改成了异性。这是我之前提到的高排名石灰功能的反转。如图所示,LIME 将其列为该数据点的最高等级特性。

现在,将这两个数据点变量的这些时间可视化/解释与上面的全局特征重要性(来自模型内部统计和排列得分)进行比较。由 LIME 呈现的顶级特征与由作为顶级特征的全局置换重要性给出的那些特征非常匹配。事实上,这几乎是一个精确的匹配。

除此之外,图的左边说明了我对石灰的一个主要困惑。该数据点的分类器预测为:

  • 未能幸存:71%的可能性
  • 幸存几率:29%

我希望石灰特征权重显示出最高的贡献,然后是未幸存的分类。但是它显示出幸存的权重更高。到目前为止,“性别=男性”似乎是 LIME 给出的任何变量中最重的权重,它显示为指向幸存的。类似地,左图中的总体石灰特征权重为

  • 未存活:0.17+0.09+0.03+0.00=0.29
  • 幸存值:0.31+0.15+0.07+0.03+0.02+0.01 = 0.59

有趣的是未幸存的权重合计出了幸存的准确预测值。我可能认为我看问题的方式是错误的,但是我尝试用其他数据点做进一步的解释,似乎表明情况并非如此。从上图的右边开始。

上图的右侧,性别颠倒,也显示了作为最高 contibutor 的性别属性。但现在,这个头衔已经升得很高了。所以或许正说明了一个女主有更高的生存变化?我不知道,但可以肯定的是分类器的预测变成了:

  • 未存活:43%
  • 幸存率:57%

类似地,乘客等级( Pclass )值已经从生存加权跃升为非生存加权。在反向情况下,石灰要素权重的总和总体上看起来没有太大的不同,但是预测发生了相当大的变化。我本来希望有简单易懂的解释,但它似乎很复杂。

数据点 2

测试集中第二个数据点的时间解释:

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

用原始值(左)和一个反转值(右)解释单个数据点的分类。图片作者。

对于这一点,左侧原始数据点的 ML 预测似乎更强烈地表明预测的存活机会很低(未存活为 81%),但是石灰特征权重甚至更强烈地指向相反的方向(石灰权重几乎所有特征值都有助于存活)。

另一方面,该图的右侧,性别值反转,提供了石灰重量与实际预测的相当好的匹配。石灰算法和最大似然算法的权重存活率都较高,比率相对接近。但与这里的原始数据点(性别未倒置,左侧)相比,无论如何都不一致。对于原始数据点,石灰权重与预测值不匹配,而对于改变后的数据点,预测值接近。

当然,右边的图说明了我的改变有多愚蠢(只颠倒了性别)。我不会期望的结合发生在真实数据中。但是,不管某些值组合是否合理,我希望解释能同样好地反映预测。毕竟,LIME 旨在用给定的特征来解释给定的预测,不管这些特征有多疯狂。

有趣的一点是,在这两种情况下,性别似乎总是对生存有很大影响。也许这是由于其他特征值的组合学,但是考虑到时间权重与预测似乎在数据点之间有所不同,我不太确定。如果这个值在两种情况下都表示高存活率,为什么它会有很高的解释力呢?假设所有(两个)值都表示相同的结果(而其他值没有变化)?

Catboost

来自分类器/排列的特征权重

基于模型内部的模型特征权重:

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

Catboost 报告了功能重要性。图片作者。

基于排列:

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

排列重要性算法报告的特征重要性。图片作者。

有趣的是,烤干显示负贡献。

数据点 1

使用 Catboost 的第一个数据点:

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

用原始值(左)和一个反转值(右)解释单个数据点的分类。图片作者。

在这种情况下,LIME 似乎将雄性列为未存活,而雌性列为存活,两者的权重都非常高。当然,这是针对单个数据点的,因此也取决于其他变量的具体值。在这种情况下,存活的对未存活的的总权重对于石灰对 ML 分级机来说并不太远。然而,性别变化对毫升产量的影响很小,而对石灰产量的影响很大。同样,似乎不太一致。

与上面的 LGBM 情况/部分相反,在这种情况下(对于 Catboost ),顶级石灰特征实际上似乎几乎完全遵循来自模型内部统计的全局特征权重。对于 LGBM 来说,情况正好相反,他们不遵循内部权重,而是遵循排列权重。令人困惑,尽管一个是特定于数据点的,另一个是全局的。

数据点 2

使用 Catboost 的第二个数据点:

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

用原始值(左)和一个反转值(右)解释单个数据点的分类。图片作者。

在这种情况下,LIME 为幸存于的方的变量赋予了非常高的权重,而实际的分类器几乎完全预测了非幸存。并没有让我感到非常自信。

XGBoost

来自分类器/排列的特征权重

基于模型内部统计的模型特征权重:

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

XGBoost 报告了功能重要性。图片作者。

基于排列:

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

排列重要性算法报告的特征重要性。图片作者。

数据点 1

为 XGBoost 解释的第一个数据点:

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

用原始值(左)和一个反转值(右)解释单个数据点的分类。图片作者。

在这种情况下,左边的一个似乎表明未能幸存的权重相当大,但实际预测在幸存未能幸存上相当平均。在右侧,权重与预测更符合石灰要素权重,似乎与预测相匹配。

至于来自模型内部和排列的时间权重和全局权重,在这种情况下,它们似乎是混合的。一些顶级特征与模型内部的顶级全局特征权重共享,一些与排列共享。

与前面的部分相比,石灰权重与模型和排列权重似乎无处不在。在内部特征权重的情况下,这可能与不同 ML 算法的一些属性有关,以及 LIME 如何考虑单个数据点与全局整个模型。然而,我希望 LIME 在排列权重方面更加一致,因为该算法在分类器之间是相同的。

数据点 2

第二个数据点:

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

用原始值(左)和一个反转值(右)解释单个数据点的分类。图片作者。

在这里,左边的石灰数字似乎表明更多的生存对重量,和非生存在实际的 XGBoost 预测。在右边,权重和预测似乎又更加一致了。不是很一致。

解释 Keras NN 分类器

本节使用不同的数据集克利夫兰心脏病风险。在这种情况下,反转变量不是性别,而是 cp 变量,因为在我查看的数据点上,它似乎是石灰得分最高的分类变量。这个 cp 变量也有 4 个值,而不是 2 个,但是无论如何,我希望改变一个高分变量来显示一些影响。

特点:

  1. 年龄:以年为单位的年龄
  2. 性别 : (1 =男;0 =女性)
  3. cp :胸痛类型(4 个值)
  4. trestbps :入院时的静息血压,单位为毫米汞柱
  5. 胆固醇:血清胆固醇,单位为毫克/分升
  6. 空腹血糖:空腹血糖> 120 毫克/分升
  7. 静息心电图:静息心电图结果(数值 0,1,2)
  8. *达到最大心率
  9. *运动诱发心绞痛:(1 =是;0 =否)
  10. oldpeak :运动相对于休息诱发的 ST 段压低
  11. 斜率:运动 ST 段峰值的斜率
  12. 荧光镜染色的主要血管数量(0-3)
  13. thal : 3 =正常;6 =修复缺陷;7 =可逆转缺陷

排列的特征权重

作为一个通用的神经网络框架,Keras 不提供基于模型内部统计的特征权重,这与上面的 boosters 等特定算法相反。但是基于置换的特征加权总是一个选项:

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

排列重要性算法报告的特征重要性。图片作者。

训练曲线

训练曲线总是很好看,所以开始吧:

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

模型精度与训练时期的损失。图片作者。

数据点 1

LIME 为 Keras 解释的第一个数据点:

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

用原始值(左)和一个改变的值(右)解释单个数据点的分类。图片作者。

这一个几乎完全预测了两个数据点都没有风险。然而,石灰重量似乎完全表明了患心脏病的风险。 cp (胸痛)值从 0 到 1 的变化已经将变量从顶级特性列表中完全删除。然而,石灰重量仍然严重显示在心脏风险侧,而 ML 算法预测几乎完全在无风险侧。非常不一致。

与全局排列权重相比,石灰权重共享相同的前 1-2 个特征,在较低等级的特征中有一些变化。

数据点 2

LIME 为 Keras 解释的第二个数据点:

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

用原始值(左)和一个改变的值(右)解释单个数据点的分类。图片作者。

在这种情况下,两边的预测和石灰重量更为混杂。右侧似乎在无风险的一侧比左侧有更多的权重,然而 ML 算法预测在相反的方向上有更多的偏移,朝向心脏风险的一侧。

在这种情况下,这些特征与第一个数据点完全不同,也与排列重要性给出的全局权重完全不同。这可能不是一个问题,因为 LIME 旨在解释单个数据点,而不是全局模型。然而,我确实看到了一个问题,那就是不能以任何合理的方式将石灰重量映射到预测。至少不是一贯如此。有时石灰重量与预测一致,通常不一致,有时则完全相反。

解释 XGBoost 回归变量

本节使用的艾姆斯住宅数据集中的特征:

  • 销售价格——以美元为单位的房产销售价格。这是你试图预测的目标变量。
  • 实用程序:可用的实用程序类型
  • 总体质量:整体材料和表面质量
  • GrLivArea:地面以上居住面积平方英尺
  • 外部质量:外部材料质量
  • 功能:家庭功能评级
  • 厨房质量
  • 壁炉质量
  • 车库汽车:车库在汽车容量中的大小
  • YearRemodAdd:改造日期
  • 车库面积:车库的面积,以平方英尺为单位

数据点 1

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

解释单个数据点回归预测值的时间。图片作者。

正如一篇 Python 数据文章所讨论的,LIME 结果对于分类的推理似乎比回归更直观。对于回归,它应该显示特征值如何影响预测回归值的一些相对值。在这种情况下,这将是预测特定特征值如何影响房价的方式。

但是,这其中的含义有点不清楚。例如,什么东西的权重为正意味着什么?还是消极?关于什么?什么是基线,或者什么是衡量标准?对解释回归模型进行更彻底的评估将是有趣的,但至少可以应用石灰。就像分类一样,结果可能会更直观一些。

数据分布

出于兴趣,这里描述了上面显示的特性的数据分布。

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

不同变量的数据分布。图片作者。

也许可以对特征值分布如何与这些变量的石灰权重相关进行一些分析,并使用这些分析作为进一步分析与预测价格相关的石灰结果的手段。也许有一天有人会…🙂

结论

与模型内部统计给出的所有全局特征权重以及基于排列的权重相比,我在本文中展示的结果通常共享一些顶级特征。并且使用相同的算法比较不同数据点的解释,看起来有一些变化,其中特征时间在每个数据点中排名最高。总的来说,考虑到石灰应该是什么,这一切都是有意义的。解释单个数据点,其中全局重要特征可能经常(并且平均来说应该)排名靠前,但是单个数据点可能有所不同。

一般来说,时间可视化似乎是可视化数据点的特性重要性的好方法。我喜欢这些特性在一个方向相对于另一个方向的权重。尝试接近一个点的值来得出一个解释的想法似乎也有道理。然而,我在实验中看到的许多结果似乎不太合理。呈现的石灰重量似乎经常与 ML 算法的实际预测相反。

我试着在网上寻找这方面的见解,这本书的第章对石灰的局限性进行了很好的讨论,也许它解释了一些问题。这本书的章节最后说在使用石灰时要非常小心,以及石灰参数如何影响结果和给出的解释。这似乎与我在上面看到的一致。

我发现的许多文章(有些在开头有链接)提供了一个例子,或者一些来自 LIME papers 的图表,并且简单地掩盖了对结果的解释,很少提供对它如何在更大规模上表现的见解。对我来说,找到一些符合假设的例子并使技术看起来很好似乎很简单。这在学术界是很常见的,你想展示你研究的好结果。然而,如果我真的尝试使用它,这并不一定符合我的期望。在我的实验中,我得到了我在这里展示的结果,在这里,我无法在整个数据集中自信地将 LIME 结果与分类器输出进行匹配。

更有用的可能是理解其局限性,而不是期望 LIME(或任何其他技术)在每种情况下都能完美工作。当结果看起来与展示(广告)材料不同时,我有一种感觉,也许零件展示是精心挑选的。我自己也从事过研究,石灰是研究的成果,这当然是它的工作方式。你不会因为没有展示出好的结果,或者没有展示出你的方法中的问题而被接受论文或者获得资助和任期。但是不讨论它们会使我们更难找到实用的工作技术。

总的来说,有了这些结果,除了一些实验,我不会真的使用石灰。主要是因为我看不出自己有多信任这些类型的结果,不管销售论点如何。但总的来说,这似乎是一项有趣的工作,我喜欢其中隐含的想法。也许这将有助于产生对我更好的其他新的可解释的人工智能技术。沿着这些思路,也很高兴看到这些类型的方法被集成为 ML 平台产品和服务的一部分。

类似的方法还有其他有趣的方法。SHAP 是一个似乎很受欢迎的,Eli5 是另一个。有人甚至说 LIME 是 SHAP 的一个子集,它应该比 LIME 采用的采样方法更完整。也许有一天值得努力做一个比较…

如果你对我错过了什么有什么想法,或者可以做得更好,很高兴听到:)。

这次到此为止。干杯。

原载于 2020 年 6 月 10 日 http://swenotes.wordpress.com**的

解释公平的衡量标准

原文:https://towardsdatascience.com/explaining-measures-of-fairness-f0e419d4e0d7?source=collection_archive---------27-----------------------

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

Scott Lundberg/Corgarashu-Adobe Stock

公平和偏见

通过将现代可解释的人工智能方法应用于公平测量,避免机器学习中公平度量的黑盒使用。

这篇实践文章将可解释的人工智能与公平性度量联系起来,并展示了现代可解释性方法如何增强量化公平性度量的有用性。通过使用 SHAP (一个流行的可解释的人工智能工具),我们可以分解公平的衡量标准,并为模型的每个输入特征之间的任何观察到的差异分配责任。解释这些量化的公平度量可以减少依赖它们作为不透明的公平标准的趋势,相反,促进它们作为理解模型行为如何在群体之间不同的工具的明智使用。

量化的公平度量标准试图给机器学习中的公平定义带来数学上的精确性【1】。然而,公平的定义深深植根于人类的伦理原则,等等价值判断,这些价值判断通常关键取决于使用机器学习模型的背景。这种对价值判断的实际依赖在量化公平测量的数学中表现为有时相互不相容的公平定义之间的一组权衡【2】。由于公平性依赖于上下文相关的价值判断,将量化的公平性指标视为不透明的公平性黑盒度量是危险的[ 3 ],因为这样做可能会模糊这些重要的价值判断选择。

如何用 SHAP 来解释模型公平性的度量

本文不是关于如何选择模型公平性的“正确”度量,而是关于解释您正在使用的任何度量。哪个公平指标最合适取决于你的具体情况,例如适用什么法律,机器学习模型的输出如何影响人们,以及你对各种结果和权衡的价值。在这里,我们将使用经典的人口均等指标,因为它很简单,并且与不同影响的法律概念密切相关。人口统计奇偶校验表明,机器学习模型的输出在两个或更多个群体之间应该是相等的。人口统计学上的奇偶差异是两组样本之间模型结果差异的度量。

*由于 SHAP 将模型输出分解为与原始模型输出具有相同单位的要素属性,因此我们可以首先使用 SHAP 将模型输出分解为每个输入要素,然后使用每个输入要素的 SHAP 值分别计算该要素的人口统计奇偶差异(或任何其他公平性度量)。*因为 SHAP 值的总和等于模型的输出,所以 SHAP 值的人口统计奇偶差异的总和也等于整个模型的人口统计奇偶差异的总和。

在各种模拟场景中,SHAP 公平的解释是什么样的

为了帮助我们探索解释量化公平指标的潜在效用,我们考虑一个基于信用核保的简单模拟场景。在我们的模拟中,有四个驱动贷款违约风险的潜在因素:收入稳定性、收入金额、支出约束和一致性。这些潜在的因素没有被观察到,但它们不同程度地影响着四个不同的可观察到的特征:工作经历、报告的收入、信用查询和逾期付款。使用这种模拟,我们生成随机样本,然后训练一个非线性 XGBoost 分类器来预测违约概率(查看本文的笔记本版本获取相关的 Python 代码)。同样的过程也适用于 SHAP 支持的任何其他模型类型,只要记住对更复杂的必然模型的解释隐藏了更多的模型细节。

通过在完全指定的模拟中引入性别特定的报告错误,我们可以观察到这些错误引起的偏差如何导致男女之间的人口统计均等差异。在我们的模拟案例中,真实的标签(如果有人将拖欠贷款)在统计上与性别无关。因此,发现男性和女性之间的任何差异意味着一个或两个群体由于特征测量误差、标签误差或模型误差而被错误地建模。如果您预测的真实标签(可能不同于您可以访问的训练标签)在统计上不独立于您正在考虑的敏感特征,那么即使是没有错误的完美模型也无法通过人口统计奇偶校验。在这些情况下,公平性解释可以帮助您确定哪些人口统计差异来源是有效的,因此应该保留在模型中,哪些来源是无效的,应该移除。

场景 A:无报告错误

我们的第一个实验是一个简单的基线检查,我们避免引入任何性别特定的报告错误。虽然我们可以使用任何模型输出来衡量人口统计的均等性,但我们使用来自二元 XGBoost 分类器的连续对数优势分数。正如预期的那样,这一基线实验的结果是男性和女性的信用评分之间没有显著的人口统计学差异。我们可以通过将女性和男性的平均信用评分之间的差异绘制成条形图,并注意到零接近误差范围(注意,负值意味着女性的平均预测风险低于男性,正值意味着女性的平均预测风险高于男性):

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

现在,我们可以使用 SHAP 在模型的每个输入要素中分解模型输出,然后计算归因于每个要素的组件的人口统计奇偶差异。如上所述,由于 SHAP 值总和等于模型的输出,因此每个要素的 SHAP 值的人口统计奇偶差异总和等于整个模型的人口统计奇偶差异。这意味着下面的条形之和等于上面的条形(我们的基线情景模型的人口奇偶差异)。

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

情景 B:对妇女收入的低报偏见

在我们的基线场景中,我们设计了一个模拟,其中性别对模型使用的任何特征或标签都没有影响。在方案 B 中,我们在模拟中引入了女性收入的低报偏差。这里的重点不是真实世界中女性收入被低报有多现实,而是我们如何识别性别偏见的引入并理解其来源。通过绘制女性和男性之间平均模型输出(违约风险)的差异,我们可以看到,收入少报偏差已经产生了显著的人口统计均等差异,女性现在比男性有更高的违约风险:

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

如果这是一个真实的应用程序,这种人口统计奇偶差异可能会触发对模型的深入分析,以确定是什么导致了差异。虽然这一调查具有挑战性,仅给出一个单一的人口统计学差异值,但给出基于 SHAP 的每个要素的人口统计学差异分解就容易多了。使用 SHAP,我们可以看到有一个来自报告的收入特征的重大偏见,这增加了女性比男性不成比例的风险。这使我们能够快速识别哪个特征具有导致我们的模型违反人口统计均等性的报告偏差:

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

在这一点上,重要的是要注意我们的假设是如何影响 SHAP 公平解释的。在我们的模拟场景中,我们知道女性实际上与男性具有相同的收入特征,因此当我们看到报告的收入特征对女性的偏差低于男性时,我们知道这是来自报告的收入特征中的测量误差偏差。解决这个问题的最佳方法是找出如何消除该特征的测量误差。这样做可以创建一个更准确的模型,而且人口差异也更小。然而,如果我们假设女性实际上比男性挣得少(因此这不仅仅是一个报告错误),那么我们就不能“修正”报告的收入特征。相反,我们必须仔细考虑如何最好地解释两个受保护群体之间违约风险的实际差异。仅仅使用 SHAP 公平解释是不可能确定这两种情况中哪一种正在发生的,因为在这两种情况下,报告的收入特征将导致男女预测风险之间观察到的差异。

情景 C:对妇女逾期付款的低报偏见

为了验证 SHAP 人口统计均等解释能够正确地检测差异,无论效果的方向或来源特征如何,我们重复了之前的实验,但是我们引入了妇女迟付率的低报偏差,而不是收入的低报偏差。这导致了模型输出的显著人口统计学平价差异,现在女性的平均违约风险低于男性:

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

正如我们所希望的那样,SHAP 的解释正确地强调了延迟支付的特征是该模型的人口均等差异的原因,以及影响的方向:

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

情景 D:女性违约率的低报偏差

上面的实验集中在为特定的输入特征引入报告错误。接下来,我们考虑当我们通过对女性违约率的低报偏差在培训标签上引入报告错误时会发生什么(这意味着女性的违约率比男性低)。有趣的是,对于我们的模拟场景,这在模型的输出中没有导致显著的人口统计奇偶差异:

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

在 SHAP 的解释中,我们也看不到任何人口均等差异的证据:

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

场景 E:女性违约率的低报偏差,取 2

起初,当我们引入女性违约率的低报偏差时,可能会令人惊讶地发现,人口统计学上的均等差异并没有产生。但这是因为我们的模拟中的四个特征都没有与性别显著相关,所以它们都不能有效地用于模拟我们引入训练标签的偏见。如果我们现在为模型提供一个与性别相关的新特征(品牌 X 购买分数),那么我们会看到人口统计奇偶差异出现,因为该特征被模型用来捕获训练标签中的性别特定偏差:

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

当我们解释与 SHAP 的人口统计平价差异时,我们看到,正如预期的那样,品牌 X 购买分数特征驱动了差异。在这种情况下,这不是因为我们在如何测量品牌 X 购买分数特征方面存在偏差,而是因为我们在训练标签中存在偏差,该偏差被任何与性别充分相关的输入特征捕获(因此可以作为性别的代理):

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

场景 F:梳理多重漏报偏见

当报告偏差的原因只有一个时,那么模型输出的经典人口统计奇偶检验和人口统计奇偶检验的 SHAP 解释都捕捉到了相同的偏差效应(尽管 SHAP 解释通常具有更大的统计意义,因为它隔离了导致偏差的特征)。但是,当一个数据集中出现偏差的原因有多种时,会发生什么呢?在这个实验中,我们引入了两个这样的偏见,一个是对女性违约率的低报,另一个是对女性工作经历的低报。这些偏差往往会在全球平均值中相互抵消,因此对模型输出的人口统计均等测试显示没有可测量的差异:

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

然而,如果我们看看 SHAP 对人口均等差异的解释,我们会清楚地看到两种(抵消)偏见:

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

确定多种潜在的抵消偏差影响可能很重要,因为虽然平均而言,对男性或女性没有不同的影响,但对个人有不同的影响。例如,在这个模拟中,没有在品牌 X 购物的女性将得到比她们应该得到的更低的信用分数,因为在工作历史报告中存在偏见。

引入受保护的特征如何有助于区分标签偏差和特征偏差

在情景 F 中,我们能够区分出两种不同形式的偏差,一种来自工作经历的少报,另一种来自违约率的少报。然而,来自违约率低报的偏差并不归因于违约率标签,而是归因于碰巧与性别相关的品牌 X 购买分数特征。这仍然给我们留下了一些关于人口统计奇偶差异的真实来源的不确定性,因为归因于输入要素的任何差异都可能是由于该要素的问题,或者是由于训练标注的问题。

事实证明,在这种情况下,我们可以通过将性别作为一个变量直接引入模型来帮助区分标签偏见和特征偏见。引入性别作为输入特征的目的是使标注偏差完全落在性别特征上,而不影响特征偏差。因此,我们可以通过比较上面的场景 F 和下面的新场景 G 来区分标签偏差和特征偏差。当然,这造成了比以前更大的人口统计均等差异,但这没什么,因为我们的目标不是减轻偏见,而是理解偏见:

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

SHAP 对方案 G 的解释表明,方案 F 中曾经与品牌 X 购买分数特征相关联的所有人口统计均等差异现在已经移动到性别特征,而方案 F 中与工作经历特征相关联的任何人口统计均等差异都没有移动。这可以解释为情景 F 中归因于品牌 X 购买分数的所有差异都是由于标签偏见,而情景 F 中归因于工作经历的所有差异都是由于特征偏见。

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

注意,将受保护特征引入模型以将标签偏差与特征偏差分开的技巧依赖于将几乎所有标签偏差置于受保护特征上的模型训练过程。这适用于默认的 XGBoost 模型,但如果您在 XGBoost 中打开按列子采样,则不会发生这种情况,因为这将强制在与受保护要素相关的要素之间共享偏差(对于岭回归补偿线性模型也会发生类似的信用扩散效应)。

结论

公平是一个复杂的话题,干净的数学答案几乎总是带有警告,并取决于假设或价值判断。这意味着,尤其重要的是,不要仅仅将公平指标作为黑盒使用,而是要寻求理解这些指标是如何计算的,以及您的模型和训练数据的哪些方面正在影响您观察到的任何差异。使用 SHAP 分解量化的公平性度量可以减少它们的不透明性。我希望这里展示的公平性解释能够帮助您更好地处理公平性评估中固有的潜在问题,从而帮助您在现实环境中使用公平性度量时减少意外后果的风险。

精确和召回:你应该使用哪一个?

原文:https://towardsdatascience.com/explaining-precision-vs-recall-to-everyone-295d4848edaf?source=collection_archive---------12-----------------------

数据科学概念

精确度、召回率、准确度和 F1 分数之间的差异

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

Unsplashengin akyurt 拍摄的照片

随着你在数据科学的不同方面取得进展,你会遇到各种用于评估机器学习模型的评估指标。为了确定机器学习模型的有效性,必须对其进行评估。不评估机器学习模型,就无法运行它。可用于验证模型的评估指标有:

  • 精确
  • 回忆
  • F1 分数
  • 准确(性)

每个指标都有自己的优点和缺点。确定使用哪一个是数据科学过程中的重要一步。

在这里注册一个中级会员,可以无限制地访问和支持像我这样的内容!在你的支持下,我赚了一小部分会费。谢谢!

评估指标

我们将解释上面列出的评估指标之间的差异。但是首先,为了理解这些指标,你需要知道什么是 假阳性和假阴性 以及两者之间的区别。请参阅下面的文章,了解两者之间的区别:

[## 假阳性还是假阴性:哪个更糟?

解释第一类和第二类错误

towardsdatascience.com](/false-positives-vs-false-negatives-4184c2ff941a)

为了计算不同的评估指标,您需要知道假阳性(FP)、假阴性(FN)、真阳性(TP)和真阴性(TN) 的数量。了解它们之间的区别也是有帮助的。

准确(性)

让我们从四个评估指标中最简单的一个开始——准确性。准确性是对我们的模型在观察总数中正确预测的观察数的简单衡量:

准确度= (TP + TN) / (TP + TN + FP + FN)

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

照片由 Igal NessUnsplash 上拍摄

例如,假设我们有一台机器可以对水果进行分类,看它是不是苹果。在数百个苹果和桔子的样本中,机器的精确度将是它正确分类为苹果的苹果数量和它分类为非苹果的桔子数量除以苹果和桔子的总数。只要苹果和橘子的数量相同,这就是一个简单有效的测量方法。否则,我们可能不得不使用不同的评估标准。

精确

精度是对我们的模型正确预测的观察值与正确和不正确预测值之比的度量。这里的观察意味着我们试图预测的事情。

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

李仁港Unsplash 上拍照

精度= TP / (TP + FP)

使用我们的苹果和橙子的例子,precision 将测量正确分类的苹果的数量除以正确标记为苹果的苹果和错误标记为苹果的橙子的数量。换句话说,精度衡量了我们分类的苹果中有多少实际上是橙子。**

回忆

召回是对我们的模型在观察总量中正确预测的观察数量的度量。在这里,观察也意味着我们试图预测的事情。

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

Benjamin Wong 在 Unsplash 上拍摄的照片

召回= TP / (TP + FN)

在我们的苹果和橘子的例子中,召回测量正确标记的苹果数量除以存在的苹果总量。换句话说,回忆衡量的是在整个水果样本中我们可能漏掉了多少个苹果。

F1 分数

如果我们把注意力放在一个分数上,我们可能会忽略另一个分数。为了解决这个问题,我们可以使用 F1 分数,它在精确度和召回分数之间取得了平衡。要计算 F1 分数,您需要知道精确度和召回分数,并将它们输入到以下公式中:

F1 得分= 2 (精确度召回率)/(精确度+召回率)

使用我们的苹果和橘子的例子,F1 分数将计算精度和召回之间的平衡。它将测量被错误分类为苹果的桔子的数量(假阳性)和没有被正确分类为苹果的苹果的数量(假阴性)。

使用哪个指标?

在构建和评估机器学习模型时,您必须能够确定要使用的最有效的评估指标。最合适的度量标准完全取决于问题。

不是准确性

大部分时间你会处理 不平衡 数据集。使用我们的苹果和橘子的例子,在现实世界中,你很可能会有一个不平衡的样本,可能是 1 比 3 的苹果和橘子。在这种情况下,使用准确性作为评估标准是不合适的,因为准确性会歪曲我们模型的有效性。

如果数据集是真正平衡的,那么准确性可能是最合适的度量标准。然而,大多数时候情况并非如此。

不平衡数据的度量

由于您最有可能处理不平衡的数据,因此精确度和召回率(以及 F1 分数)将是您的首选评估指标。使用哪一个将再次完全取决于您的模型的目标。

有毒的苹果

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

照片由玛利亚·特内娃Unsplash 上拍摄

假设我们试图检测一个苹果是否有毒。在这种情况下,我们希望减少假阴性的数量,因为我们希望不遗漏该批次中的任何毒苹果。回忆将是这里使用的最佳评估指标,因为它衡量了我们可能遗漏了多少毒苹果。我们并不太在意给苹果贴上有毒的标签,因为我们宁愿安全也不愿后悔。

股票投资

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

杰米街Unsplash 上拍摄的照片

抛开苹果的例子,假设我们开发了一个机器学习模型,来确定一只股票是否是一个好的投资。如果我们要把我们的全部净值都投入到这只股票中,我们最好希望我们的模型是正确的。精度将是这里使用的最佳度量,因为它决定了我们模型的正确性。只要我们的钱流向了由我们的模型正确预测的升值股票,我们就可以承受错过一些有利可图的股票投资。

如果您想了解使用精选评估指标预测股票投资未来的真实机器学习模型,请查看以下文章:

[## 教机器像沃伦·巴菲特一样交易股票,第二部分

利用机器学习进行股票基本面分析

medium.com](https://medium.com/better-programming/teaching-a-machine-to-trade-stocks-like-warren-buffett-part-ii-5d06427b13f7)

F1 成绩?

有时候,最大化模型的精确度和召回分数是最好的。我们什么时候想最大化这两个分数?如果我们希望我们的模型是正确的,不会错过任何正确的预测。基于这一事实,你可能会得出这样的结论:F1 分数是最值得使用的分数。虽然 F1 分数在精确度和召回率之间取得了平衡,但它并没有优先考虑其中一个。有时,根据我们面临的问题,优先考虑一个可能是最好的。

结论

正如您在本文中所了解到的,有几种不同的评估指标可用于您的机器学习模型。每种度量标准都有其特定的优点和缺点。由您决定使用哪一个来评估您的模型。在本文结束时,我们希望您了解了使用哪种评估指标以及何时应用它们。

在 Twitter 上关注我:@Marco_Santos

基于 AWS DeepRacer 为初学者讲解强化学习

原文:https://towardsdatascience.com/explaining-reinforcement-learning-for-beginners-based-on-aws-deepracer-efcefff65a9b?source=collection_archive---------38-----------------------

高级别解释强化学习如何在自主赛车中与神经网络一起工作

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

雅罗米尔·卡万Unsplash 上拍摄

在本文中,我们将讨论以下主题:

1.什么是强化学习?

2.什么是 DeepRacer?

3.强化学习在 DeepRacer 中的应用

4.为什么我们需要强化学习?

5.强化学习算法的一部分

6.解释学习过程

1.什么是强化学习?

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

强化学习的基础(作者图片)

强化学习是一种通过经验学习的机器学习算法。这个算法告诉代理在一个封闭的环境中应该采取哪一组动作来完成一个任务。之后,代理人会因为这些行为获得可量化的奖励。此奖励是一个数字分数,用于衡量这些行动相对于总体目标的调整程度。粗略地说,代理人在算法的指导下,反复尝试不同的动作集,试图使收到的总回报最大化。在每组试验之后,该算法“学习”哪些动作比其他动作更有效,并根据这些发现调整其下一次试验。这个过程持续分配的时间或试验次数。因此,该算法将能够告诉代理采取哪些行动,以获得更高的奖励。

如果这听起来像一个游戏,你没有错;强化学习遵循同样的原则!这就是为什么它被成功地用于玩游戏,如围棋和国际象棋,或视频游戏,如超级马里奥,或星际争霸,击败职业选手。其他应用包括算法交易、机器人或动态定价。

例如,想象我们决定使用强化学习来玩超级马里奥。代理(马里奥图标)观察环境(玩家可以在屏幕上看到的关卡的一部分)并执行动作(前进、后退或跳跃)。每次试炼后,它会收到一份奖励,奖励是根据它在关卡中的进度而定。

2.什么是 DeepRacer?

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

DeepRacer 赛车参加 2020 年 5 月资格赛(图片由作者提供)

让我们看看 AWS DeepRacer 中是如何引入强化学习原理的。亚马逊网络服务(AWS) DeepRacer 是一辆自动驾驶的赛车,它在云中的数字模拟器中接受强化学习训练。强化学习“教”汽车(也就是代理)如何在赛车道上驾驶。代理的目标是在尽可能快的时间内完成多圈。这个简短的背景将是后面几章的基础。如果您需要进一步的信息,您可以访问这里

3.强化学习在 DeepRacer 中的应用

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

凯特琳·威尔森Unsplash 上拍摄

DeepRacer 使用两个神经网络应用了一种特定的强化学习方法。这个算法帮助代理(汽车)在每次试验中选择最佳行动。在强化学习中,每次试验都被称为一个情节。从形式上来说,一个情节是特定状态下的动作组合。把动作想象成汽车做出的决定。状态是赛车在赛道内的位置。一旦赛车离开划定的赛道或跑完一圈,每集就结束了。

在 DeepRacer 电路中,它的(x,y)坐标描述了数百万种可能的汽车状态。每个动作都是将代理从一种状态移动到另一种状态的原因。在我们的例子中,一个动作是转向角和油门的组合。

强化学习算法执行一些计算(我们将在后面解释),并告诉汽车采取特定的行动(例如,以 0.5 米/秒的速度行驶,向左转向 30 度)。汽车执行这个动作几毫秒,然后到达另一个状态。在这个新状态中,代理执行另一个计算并决定一个动作。这个过程反复发生,直到汽车完成这一集。

该算法基于奖励函数决定采取哪些行动。这个奖励函数对代理在每个动作中的表现进行评级,就像学生在测试中被评级一样。我们必须设置奖励函数,它引导代理人实现期望的目标。在我们的例子中,我们希望赛车完成赛道(目标#1)并快速完成(目标#2)。

奖励函数使用参数来反映这些目标,这些参数是每个状态中可测量的因素。一个简单的奖励函数可以包括进度(轨迹完成的百分比)和速度参数。这样,汽车离终点线越近(目标 1),越快(目标 2),奖励越高。在 DeepRacer 中,算法从虚拟环境中接收这些和其他参数(例如,转向或距离赛道中心的距离)。该算法在告诉汽车采取何种行动之前测量这些参数,反映了与环境的互动。然后,这些参数的值将被有选择地放置在一个奖励函数中,该函数将返回一个数字,对代理的行为进行评级。根据我们的目标,我们必须选择将哪些参数添加到奖励函数中,以及它们将对奖励的大小产生什么影响。

4.为什么我们需要强化学习?

学习过最优化问题的人应该对最大化奖励函数很熟悉。对于一些优化问题,你可以得到一组全局的行动,在给定的一组约束条件下,最大化代理人可以得到的奖励。但是在 DeepRacer 的情况下,我们没有标准的优化问题,因为有几乎无限数量的动作和状态的组合。这就是为什么不可能通过执行所有可能的组合并查看哪一个是最好的来强行得出最佳答案。

在某种程度上,强化学习是关于教代理如何执行最佳的“猜测”应该采取什么行动,这可能会给出很高的回报。通常,我们从强化学习算法中所能获得的最多的是局部奖励最大值。由于我们无法有效地尝试所有组合,因此我们无法得出这是代理可以获得的全球最高奖励的结论。

5.强化学习算法的一部分

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

强化学习算法的部分内容(图片由作者提供)

当我们谈到强化学习时,有几种不同的算法。在本文中,我们将重点讨论强化学习的神经网络应用。该算法结合了两个神经网络来学习采取哪些行动:T2 政策网络 T3 和 T4 价值网络 T5。如果你不明白什么是神经网络,那么我强烈推荐观看来自 3Blue1Brown 的视频,尽管它们对于理解接下来的内容并不必要。

价值网络的目标是基于之前的试验产生“猜测”。在这种情况下,一个“猜测”是在一个特定的行动后得到的预期奖励。想象一下,汽车可以采取三种可能的行动。然后,这个网络根据过去的经验,估计采取这些行动的预期回报。理解价值网络如何做到这一点超出了本文的范围。为简单起见,我们将动作空间定义为汽车在给定状态**下可能采取的所有动作的组合。**例如,假设汽车处于状态(S39),动作空间为 3。那么,价值网络的一个输出可以是:(A1,A2,A3) = (10,100,5)。

政策网络将价值网络产生的“猜测”转化为行动。它将使用采取每项行动的预期回报,并应用一种叫做政策梯度的方法,将它们转化为概率。这些概率是给定状态下动作的分布。采取行动的预期回报越高,可能性就越大。我们将这些概率称为**策略。**回到我们之前在 S39 中的例子,策略可以是:(A1,A2,A3) = (0.2,0.7,0。1). A2 的概率更高,因为采取 A2 的预期回报比其余行动更高。

6.解释学习过程

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

安妮·斯普拉特在 Unsplash 上拍摄的照片

学习的过程包括两个阶段:探索阶段调整阶段,依次重复几次。

在**探索阶段,**策略网络将使用价值网络提供的“猜测”来评估给定状态下的策略。使用这些相同的猜测,它将运行 x 量的试验(例如,10.000 次),进行不同的动作组合,并在每集之后接收奖励。在每个状态中,代理可能执行一个动作或另一个动作,遵循由策略设置的概率分布。

再回到我们以前的例子:(A1,A2,A3) = (0.2,0.7,0。1) 中的 S39 **。**在所有情节中,代理到达 S39,其中 20%做出 A1 决定,70% A2 决定,10% A3 决定。注意,策略网络将永远不会输出某些动作(例如(A1,A2,A3) = (0,1,0)),而是输出一个概率,以允许代理探索回路并尝试每一个动作,即使模型预测低的预期回报。这是因为这些预期回报只不过是基于经验的“猜测”,因此可能是错误的。

请注意,在第一个探索阶段,价值网络将没有经验,并将对所有行动给予相同的预期回报。然后政策网络会把这些预期回报转化为等概率。在每个状态中,汽车将以相等的概率执行任何动作,并移动到另一个状态。因为这是第一次探索,没有积累经验,大多数剧集都以脱离轨道和相对较低的回报而告终。

在这个探索阶段结束后,将开始调整阶段。价值网络将汇编和汇总从这些试验中获得的所有回报,并调整在给定状态下执行每个特定行动的预期回报。这些新的“猜测”将反馈给政策网络,并改变采取特定行动的可能性。这将增加给予较高回报的行动的概率,同时减少导致较差回报的行动的概率。然后,代理将开始探索和调整阶段的第二次迭代。这个过程可以重复几次。

技术提示:概率增加/减少的大小将取决于:(a)在那些经历中预期的回报和获得的回报之间的差异,以及(b)政策梯度。策略梯度是强化学习的基础部分。策略网络创建一个代理函数,它近似依赖于策略变化的奖励函数的行为。简而言之,它估计了政策变化对预期回报的影响。然后算法计算策略,使期望回报最大化。为了做到这一点,我们计算这个替代函数的梯度,它将表明在调整阶段旧政策变化的方向和大小。在 DeepRacer 的情况下,策略梯度应用了一种叫做近似策略优化(PPO) 的方法。这种方法与其他方法的不同之处在于它的简单性和易于实现。此外,PPO 设置了一个上限,以避免基于几个事件的重大政策调整。关于 PPO 如何详细工作的更多信息,你可以阅读 Jonathan Hui 的这篇文章。

主要思想是,一旦我们这样做几次,我们将增加导致更高回报的行动的概率。然后,随着探索和调整阶段的每一次迭代,该算法通过采取导致更好回报的行动来不断提高其回报。因此,经过几个小时的训练,我们的赛车完成了一个快速圈速!

如果你想了解更多关于自动驾驶赛车和 DeepRacer 的内容,你可以看看这个高级指南,我的团队成员,丹尼尔建造。他收集了我们从参加 AWS-Formula 1 赛事中获得的所有见解,实现了前 1%的排名。

最后,我要感谢娜塔莉亚·科查金娜丹尼尔·冈萨雷斯帮助我创作了这篇文章,还要感谢我们的教授乔迪·宁阿尔贝托·卢比奥校对了这篇文章。最后,感谢 ESADE 商学院允许像这样的内容创作成为我们商业分析硕士课程的一部分。

向你的隔壁邻居解释强化学习

原文:https://towardsdatascience.com/explaining-reinforcement-learning-to-your-next-door-neighbor-256d2e279f8a?source=collection_archive---------69-----------------------

强化学习的直观介绍

强化学习是机器学习的一个非常有趣的子领域。而其他 ML 技术依赖于静态输入输出对来学习隐藏的规则,然后将这些规则应用于看不见的数据以获得可能的结果。强化学习算法往往会随着时间的推移自动学习最佳决策。

RL 技术广泛用于解决难题和开发能够在数百种不同的游戏中击败人类的智能代理。除此之外,RL 还有多种实际应用,例如

  1. 机器人技术:工业自动化
  2. 开发学生培训系统
  3. RL 基础 神经架构搜索 (NAS)

让我们了解一下 RL 是如何工作的—

= >为了帮助您了解内容:-

  1. 如果我们有其他 ML 技术,为什么还要使用 RL?
  2. 什么是强化学习?
  3. 强化学习的并发症。
  4. 结论

1.如果我们有其他 ML 技术,为什么要使用 RL?

机器学习技术,如监督学习、非监督学习,从给定的潜在历史数据中学习,然后被部署来产生关于看不见的(未来)数据的结果。这种模型的好坏取决于给定的训练数据的质量。当/如果一些新的看不见的(训练集中不存在的新的各种数据)例子出现时,这些模型会突然失效。

基于强化学习的算法能够解决这样的问题。RL 模型以这样的方式设计,即它们学习数据随时间的变化并保持高性能。让我们了解更多关于 RL 的知识—

2.什么是强化学习?

基于 RL 的算法学习随着时间自动做出最佳决策。它从过去的错误中学习,并试图在未来的每个时间点做出最佳决策。这种从经验中学习的方法与人类学习和成长的方式非常相似。这个想法让 RL 更接近人工智能的目的。让我们深入了解 RL 的更多细节——

希望大家能回忆起以前的喂蛇游戏,如果没有,那么下面的视频一定会提醒你——

https://gfycat.com/wildunevenhackee

现在让我们写下五个神奇的词,整个 RL 将围绕这五个词展开—

代理

b. 环境

c 。动作

d. 观察

e. 奖励

让我们来理解这五个与喂蛇游戏有关的术语。

代理和环境

每一个 RL 问题都可以分解成两个主要的模块— 1 .代理 2 .环境。代理是可以做一些事情(一组明确定义的事情)的东西,我们的 RL 算法的目标是教会这个代理以某种方式做那些事情,以实现特定的目标(由求解器定义)。除了代理,其他的都叫环境。代理在环境中执行所有的活动,并在每个步骤中不断改变环境的状态。

例子:关于蛇的游戏

在这里——蛇是媒介,整个绿色游乐场和诱饵/食物是环境。这条蛇可以做事情,它可以走直线,左转,右转。求解者可以定义一个目标,比如“吃尽可能多的诱饵”或“吃 100 个诱饵”。现在,我们训练有素的工作 RL 算法应该指导这条蛇采取适当的行动,以便实现求解器的目标。

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

https://it next . io/reinforcement-learning-with-q-tables-5f 11168862 c8

行动、观察和奖励

正如所讨论的,RL 代理做某些事情,并且可以在每一步改变环境的状态。这些东西的一个明确定义的集合被称为给定代理的动作空间。在每一步,代理从动作空间中选择一个动作(随机地——如果没有实现 RL 算法)并执行它。

这种行为可能以某种方式改变环境,而这种由行为引起的环境变化被称为观察。每一个行动步骤都与一些奖励(即一个标量值——2、5、100……任何东西)和观察。奖励是由问题解决者定义的,这样更多的奖励会使代理更接近目标。

总结:-在每一步,代理将执行一个动作并获得一些奖励,并记录观察结果。这里——我们的 RL 算法的主要目标是帮助代理在每一步选择最佳行动,以便每次都能获得良好的回报,并最终完成目标。

(从过去的行动中)收集的观察和奖励有助于 RL 算法理解环境并为代理决定下一个最佳行动。大多数情况下,使用某种监督学习算法来决定最佳移动。通常,来自游戏的观察是环境的屏幕截图,因此深度学习算法(卷积神经网络)被非常频繁地使用。

例子:关于蛇的游戏

在我们的喂蛇游戏中,RL 算法应该在每一步给蛇指令(直走,左转,右转)。这些命令应该帮助蛇吃足够的诱饵,这样我们的目标就完成了。RL 模型需要记住一点——蛇在完成目标前不能死,否则——游戏 overr .一旦我们的游戏结束, 插曲 完成,我们需要重新开始。

插曲

只是 RL 词汇表中用来定义任务结束的另一个术语。如果你的插曲在完成目标之前结束,那么你的 RL 算法需要更多的调整/训练/增强。

强化学习太酷了!

为什么我们不在所有的 ML 问题中应用 RL?

我想现在每个人都很清楚 RL 是怎么运作的了。这个概念看起来非常简单和直观,但是在实现这样的算法时,我们遇到的障碍确实很少。让我们更多地了解它们——

3.RL 的并发症

下面列出了一些使基于 RL 的模型开发变得复杂的事情——

假设我们的代理不断犯错,却没有获得任何奖励。现在,对这种错误的观察是没有结果的,可能不会向代理人显示如何进一步赢得奖励。代理可能会在这种情况下遭受损失,而 RL 可能无法解决这种情况。

**二。**假设你正在编写一个 RL 算法来下 棋并获胜。现在,国际象棋是一种不同的挑战性游戏,你的棋步在开始时可能没有意义,但深入下去可能会有很大的不同。在这样的问题中,你无法决定每一步的回报。这里不能写奖励函数。奖励只有一个——赢得游戏,只有在游戏结束时你才能得到它。这使得 RL 代理很难在每一步选择最佳行动。

在进入第三个复杂问题之前,让我先介绍两个更重要的术语——

探索/开发的故事

想象一下,你最近搬到了一个新的城市,你的房子周围有数以千计的晚餐地点。每天晚上,你都有一个选择,比如——我今天应该探索一个新的地方吗?还是吃弗雷迪好吃的鸡翅?现在你已经知道弗雷迪餐厅很不错,再去那里吃一次也未尝不可。但是如果你不去探索新的餐馆,你将永远不会发现更有趣的地方,甚至是最好的地方。这也是有代价的——在找到一个好地方之前,你可能需要去很多不好的地方,而且你可能真的找不到一个好地方。这种情况在现实生活中可能会非常频繁地出现。比如——换工作,换智能手机品牌……等等。

三。强化学习中的探索/利用困境

RL 代理也面临这样的情况,探索是必要的,因为一个好的奖励可能在未探索的地方等着,并且利用已经研究过的行为(通过观察)是必要的,否则你的代理就像随机一样好。求解器总是需要在这两者之间找到一个平衡,以便设计一个高效的 RL 代理。

4.结论

是的,这些并发症一直存在,现在仍然存在。但由于研究人员的固执,基于 RL 的算法已经随着时间的推移取得了巨大的进步。强化学习作为一个研究领域正变得越来越有趣和活跃。是时候找到一些相关的业务问题,并开始使用基于 RL 的算法有效地解决它们了。

参考文献:

  1. 了解自:拉潘,M. (2018)。深度强化学习实践。英国伯明翰:Packt 出版公司。
  2. 【GIF 来自:https://gfycat.com/wildunevenhackee
  3. 图片来自:https://it next . io/reinforcement-learning-with-q-tables-5f 11168862 c8

感谢阅读!请分享您的反馈/意见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值