储蓄中的情感和习惯
首次探究木星关于储蓄行为的丰富数据
是什么让人们储蓄更多?
这个问题与普通人、金融技术专家、资产管理公司、银行和政策制定者息息相关。这是木星试图解决的核心问题,我们将定期分享我们所学到的东西。有些人可能认为这有风险,但我们相信开放性和我们的执行能力,所以我们愿意承担风险。
我们仍处于非常早期的阶段,所以我们的样本并不庞大,但它是非常精细的,包含了数百个实验。所以这将是几篇文章中的第一篇。总结其三个要点:
- 情感:如果你给人们储蓄带来直接和即时的回报,即使很小而且主要是情感上的回报,你会大大增加他们对未来提示做出反应或提出储蓄的机会,你会使他们更有可能成为经常储蓄者。
- 习惯:一个人是否会对储蓄的提示做出反应的最强有力的预测因素是他们之前积极储蓄的频率,也就是说,自发(如果被提示)储蓄已经成为一种习惯的程度。我们相信这不仅仅是获得了先前存在的特征。
- 什么不起作用:令人惊讶的是,与情绪和习惯因素相比,金钱奖励的大小没有影响。一个月中的某一天确实很重要,但是比我们预期的要少得多。此外,如果执行得好,诱导主动习惯要比说服人们进行自动被动储蓄容易得多,而且通过创造情感承诺和培养习惯,可以在以后产生显著的积极溢出效应。
数据
木星关心用户隐私。因此,我们的数据湖不包含用户的人口统计数据(只有一个单独的反欺诈系统包含)。除了 Jupiter 应用程序之外,它也不包含任何关于用户财务生活的信息。
我们所拥有的是关于 Jupiter 用户行为的极其丰富的匿名数据——在上线的几个月里,大约每个用户有 1000 个数据点,有近 1000 个活跃的储户。
在这些数据点中有超过 300 个实验的结果,这些实验使用信息和提示来诱导人们存更多的钱。这些实验涉及 20 多个维度,包括六种不同的游戏、社交暗示、奖励大小、反应时间、措辞、渠道等等。因此,我们的样本仍然局限于一个维度,但来自一个系统,该系统旨在捕捉运行实验中的行为、速度和变化的特殊粒度。
模特们
木星试图让人们存更多的钱。我们的方法与采取行动紧密相连。所以我们建立了两个机器学习模型来预测:
- ***立即存钱:*如果我们现在给你一个给定的“奖励”——玩游戏(有奖品)的机会、直接奖励、一定量的忠诚度积分——你有可能在接下来的 24-48 小时内存钱(固定在目标余额或目标存钱金额上)吗?
- ***节省频率:*如果我们为你提供一些内容、提升和其他关注的组合,你会成为一个更频繁的节省者吗?
目前,我们使用的模型是相当标准的回归器和增强的树木/森林(抱歉违反了“假装你有疯狂惊人的人工智能模型”的创业宣传代码——如果你现在还不知道,99%的模型是一个可能只有 5 行的笔记本,包括“ import sklearn ”)。
我们在我们的完整数据上训练模型,经过一点清理,例如,移除内部用户,并排除板载增强和消息(因为出于这个目的,我们对用户后来的行为感兴趣)。这些模型达到了 0.7 的精确度水平,低于简单的任务或具有巨大数据集的任务,但高于脸书的仇恨言论标记。
结果呢
在训练模型之后,我们使用“ SHAP(ley)值和决策树重要性分数来理解不同特征的相对重要性。“特征”意味着用户的一些特征——他们打开 Jupiter 应用程序的次数,或者他们打开帐户的时间,或者他们最后一次保存的时间,等等。重要性分数和 SHAP 值然后告诉我们,“这个特定特征对这个预测有多大影响?”
在预测模型上,当训练为梯度增强树时:
- 在之前,用户保存了多少次的功能重要性得分为 5**
- 用户在过去要求提升的次数有多少,特性重要性得分为 4
- 这个月的某一天——我们对最有可能发生的事情的假设(想想发薪日)——仅排在第三位,得分为 2
- 没有其他功能比这些更重要。
有些是我们没有预料到的。事实证明,货币回报与所需储蓄规模的比率 根本没有特征重要性。支付的原始金额也是如此。我们还没有测试极端值——很有可能微小的支出或极端的储蓄-支出比率会产生影响。但我们大约一半的提升已经在 AUM 上以 1%的费用洗了脸,即储蓄::奖励比率超过 100(通常通过使用游戏锦标赛和其他“前 N”类型的提升来实现)。
因此,在一个合理且成本有效的奖励范围内,用户之前获得情感回报的频率,以及有多少储蓄正在成为一种习惯,对他们是否能被诱导再次储蓄最重要。
这是针对时间点建模的。当我们转向频率模型,即预测用户是否会随着时间的推移而变得有价值时,我们有类似的结果。为此,我们根据储蓄频率将用户分为五类,然后使用他们其他非储蓄行为的频率,该模型预测每个用户属于哪个类别。我们发现:
- 总的来说,三个主要的预测因素是:用户兑换 boost 的频率,用户打开 Jupiter 应用程序的频率,以及他们是否赢得了锦标赛游戏。没有其他特征是接近的。
- 当我们深入研究最高频率类别的预测因素时,我们发现同样的模式在重复,尽管还有一个特征:用户使用应用内消息的频率
- 几个月前,我们花了很大力气说服用户设置自动定时保存。我们只有不到 10 个人。在频率最高的类别(每月 3 次以上储蓄)中,我们有 90 多次储蓄者(约 10%),在次高类别(每月约 2-3 次储蓄)中还有 120 次。
这里的一个问题可能是,我们是否只是在寻找一些先天的、隐含的特征,即“高度倾向于储蓄”。如果我们有一个更精简的数据集,并以更少的方式使用它,我们会更不自信。但是:
- 我们无论如何也想不出存钱的癖好会以某种方式导致某人在触屏游戏中赢得锦标赛
- SHAP 值在重要特征上非常不对称,即未保存对增压响应的负面影响远不如保存为正面影响
- 不清楚为什么在查看频率类别时,原始的应用程序参与人数会很重要(一个“重度节省者”只会在他们想要节省时打开应用程序,而不是一直打开,或者至少可能会这样做)
- 如果预先存在的储蓄倾向占主导地位,我们希望看到用户形成一小部分清晰分离的集群,这很容易通过终生储蓄来预测。我们发现了相反的情况(后面会有更多的介绍)。
- 如果我们添加或删除预先存在的保存和之前的 boost 兑换,精确度会改变约 0.1,这是一个很大且有意义的变化,但不会大到怀疑标签被泄露。
- 最后,结果与我们的定性体验相符——用户评论说,“这让我爱上了存钱”,当我们最近做了一组简短但深入的用户调查时,用户愿望清单中的重点不是自动存钱功能或原始回报,而是与提升相关的功能。
未来地
未来还有更多值得探索。我们才刚刚开始理解用户行为的聚类。
当我们运行 K-means 时,我们找到了大约 8-10 个簇的最佳数量,但是我们仍然需要理解那些簇是什么(简单的低维表示的投影不是直接直观的)。我们还将询问随着时间的推移行为的微小变化,以及储户之间联系的任何见解(通过 Jupiter 的“储蓄伙伴”功能)。
与此同时,我想说的是,与之前的情感联系相比,“理性”的支付比率是如此的无关紧要,这让我们感到非常惊讶。我们几乎同样感到惊讶的是,一旦人们有了情感联系并对这一行为有所放松,他们会比建立自动化的、被动的投资更容易进行无计划的、自发的储蓄。
几十年来,改善金融安全的整个理论和实践一直专注于让人们变得善良——从他们的储蓄中建立一个自动扣除,当他们看到他们的余额时,每年有一点情感回报。这并没有改变任何地方的储蓄率。也许是时候换个思路了?
新冠肺炎期间情绪高涨
超过 1 亿条推文的情感检测
我通过我之前发布的情绪检测神经网络运行了 1 亿条与 COVID 相关的推文。我不会试图解释这些结果背后的原因,因为这是一个充满相关性的领域,Twitter 的美国偏见,当然还有一个非常复杂的系统。然而,一些非常有趣的模式出现了!此外,很明显,这种算法可以用于解决其他问题:一种通用的方法,可以自动检测 Twitter 上针对特定主题的情绪变化,这可能具有强大的商业应用。
在你看到观想之前,有一些快速注释:
- 每种情绪都有一个“截止点”——你只能看到每种情绪图表的上半部分。这显示了推特上展示的过度的情绪。这些情绪一年到头都在发生,只是少于年平均水平。
- Twitter 非常以美国为中心。美国用户比其他国家的用户多得多。以及比大多数人更高的死亡率。这就是为什么我在底部添加了美国新冠肺炎死亡率的数字。
作者图片
人们首先可以看到 Twitter 经历的清晰的情绪阶段。随着美国发布居家命令,短暂的困惑和娱乐很快被关心、恐惧和感激所取代。随着事情开始陷入混乱,我们开始看到一些沉重的负面情绪:愤怒、烦恼、尴尬、失望,甚至更糟:越来越厌恶。许多这些情绪可能是那些因拒绝认真对待危机而感到羞耻的人的结果。
其次,两极分化的情绪是一件事!也许特别是在像美国这样的两党制民主国家,或者是像 Twitter 这样用来表达观点的平台。这在两种相互冲突的情绪中显而易见:“赞同”与“不赞同”通常是相互关联的,除了在五月初。然后发生了什么?同样,恐惧和感激似乎是相互关联的。
相对而言,所有情绪中最强烈的是困惑和感激。困惑的早期峰值绝对有意义,但人们只能对感恩做出理论。例如,也许暑假已经到来,人们在春天呆在家里后,真的不认为这个夏天是理所当然的!
那么,我们能从中学到什么呢?
从全球福祉的角度来看,随着现实的到来,情绪在过去几个月中明显变得更加消极:世界(几乎以任何方式)都没有准备好面对这样的全球疫情。除了一些赞同之外,推特上没有任何压倒性的积极情绪模式。是个发泄的地方。所以,当你进入 Twitter 的回音室时,明智地这样做吧!这是一个愤怒的地方。上网的时候要照顾好自己,记住世界的情绪不好。除此之外,我不建议从数据显示的相关性中得出任何强有力的结论。
从技术角度来看,请看下面提供的源代码。这种类型的 twitter 情绪检测可以应用于其他事情,并实现自动化。想看到人们对某个标签的态度发生变化吗?当情绪转向你的公司或运动队时,你想接电话吗?用 CNN 和 Twitter 的 API 实现自动化。在此基础上应用一些简单的异常检测,以提醒您公关灾难,甚至是随着全球情绪的转变投资特定领域的机会。
更多信息:技术警告
- 一些可以被神经网络检测到的情绪从未真正出现过峰值——比如“欲望”和“爱”。我已经把他们排除在观想之外了。
- 我没有通过这个模型运行完整的一亿条推文——我从每天的 2000 条推文中随机抽取了一些英文推文。
- 我的神经网络是在 reddit 数据集上训练的。由于不同的人口统计数据和每个平台的典型用途,情绪检测结果会略有不同。
- 这些推文被预选为与新冠肺炎相关的推文。因此,这些并不是整个世界的情感,而只是那些与以新冠肺炎为中心的标签结合起来表达的情感
更多信息:代码和数据
代号: GitHub 。这段代码并不打算开箱即用:您需要使用类似 Hydrator 的东西自己获取 tweets。如果您的 python 版本与我的不同,神经网络 pickle 可能无法加载。
数据 : 新冠肺炎死亡率
数据 : 新冠肺炎推文
利用数据科学留住员工
蒂姆·莫斯霍尔德在 Unsplash 上的照片
雇佣和留住顶尖人才是一项极具挑战性的任务,需要资金、时间和技能。小企业主将 40%的工作时间花在不产生任何收入的任务上,比如招聘新员工。
在本文中,我们将实施数据科学技术来改善人力资源部门。
我们将预测公司中哪些员工更愿意离开公司。
因此,在本案例研究中,我们将了解以下几点。
- 员工为什么要离职?
- 他们为什么想留下来?
- 怎样才能让他们有动力?
还有更多…😃
我们已经从 kaggle.com 获得了将用于本案例研究的数据集。
以下是相同内容的链接:https://www . ka ggle . com/pavansubhasht/IBM-HR-analytics-attraction-dataset
我们知道 Python 是一个非常有用的数据分析工具。我们将用它来回答上述问题。
你可以在我的 GitHub 上获得完整的 python 代码:https://GitHub . com/Tariqueakhtar/Machine-Learning/tree/master/HR _ Department _ Solution
让我们直接从数据中获得一些见解。
数据汇总
我们的数据总共包含 35 个特征,每个特征有 1470 个数据点
总共 35 个特征,每个特征包含 1470 个数据点(图片由作者提供)
让我们看看有多少员工离开了公司!
16%的员工离开了组织(图片由作者提供)
16%的员工离开了组织。
深入挖掘数据后,我们得到了以下发现。
1。年龄与流失分析
年龄与损耗(图片由作者提供)
29 岁和 31 岁的人离开公司的频率更高。虽然 18 至 23 岁年龄组的雇员人数较少,但该年龄组的自然减员率也很高。此外,随着年龄的增长,离开公司的机会减少。
2.婚姻状况与摩擦
婚姻状况与摩擦(图片由作者提供)
与已婚和离异员工相比,单身员工更倾向于离职
3.工作角色与自然减员
工作角色与人员流失(图片由作者提供)
与其他工作相比,销售代表和实验室技术员更倾向于离开。
4.工作投入与流失
工作投入与流失(图片由作者提供)
参与度较低的员工往往会离开公司。如果你注意到 job incidence = 1,那么与该类别下的总人口相比,它的自然减员更多。
5.经验与损耗
有经验与损耗(图片由作者提供)
经验不足(工作级别低,即工作级别=1)倾向于离开公司。
6.离家的距离与损耗
有经验与损耗(图片由作者提供)
远离办公室(超过 10 公里)的人更有可能离开公司。你可以注意到,在 x 轴 10 点之后,红线在蓝线之上,即离家的距离。
7 .。现任经理任职年限与自然减员
现任经理的几年与自然减员(图片由作者提供)
与现任经理相处时间短的员工更有可能离开公司。您可以注意到,x 轴起点的红线在蓝线之上,即现任经理的年数。然而,随着我们增加年数,蓝线倾向于取代红线,这意味着当你超过 4 到 15 年时,实际倾向于留在公司的员工数量多于实际离开公司的员工数量。
8.总工作年数与自然减员
总工作年限与自然减员(图片由作者提供)
在公司工作时间较短(0 至 6 年)的员工往往会离开公司。您可以注意到,在 x 轴的起点,即总工作年限,红线在蓝线之上。然而,当你超过 6 年,你会发现蓝线倾向于取代,这意味着员工倾向于留在你增加总工作年限。
9。性别与月收入
性别与月收入(图片由作者提供)
你可以看到,男性和女性的平均工资几乎相当,这实际上是一件好事。
对于任何公司来说,性别薪酬平等都是至关重要的事情。实际上,通过观察箱线图,似乎这里的女性实际上比男性得到的报酬更多。
10.M 月收入与工作角色
月收入与工作角色(图片由作者提供)
上面的方框图显示,担任经理的员工往往得到更多,这显然是有道理的。看起来,如果你是研究科学家和实验室技术员,这两种工作的工资范围几乎是一样的。
如果你做的是销售代表的工作,与经理和研究主管相比,你的收入要少得多。人力资源也介于两者之间。
结论:
您可以看到使用不同图表和可视化的数据分析如何帮助获得许多问题的答案。
这种分析将有助于公司制定一些员工政策,并在需要时进行修改。即便如此,这也将有助于制定一些新员工参与计划,帮助员工呆得更久。
参考:https://www . ka ggle . com/pavansubhasht/IBM-HR-analytics-attraction-dataset
雇佣一个人到底要花多少钱?雇用一名员工的成本远不止是简单地输出…
toggl.com](https://toggl.com/blog/cost-of-hiring-an-employee)
感谢阅读!!!
员工流失 Catboost 和 Shap 如何帮助您了解它!
了解 Scikit 和 Catboost 模型的使用如何帮助您处理不平衡的数据集,以及为什么 SHAP 是解释人工智能预测的伟大工具。
劳拉·戴维森在 Unsplash 上的照片
如何同时探索和解决两个关键问题?
- 第一种和就业一样古老:人们决定离开他们的雇主去寻找更好的工作。)工作。
- 第二个出现在过去几年:能够以一种可以理解的方式解释极其复杂的人工智能模型是如何做出预测的。
为了探究这两个问题,我们需要一些工具和数据:
- 由于没有公开共享的关于员工辞职的真实数据集,我们将使用 IBM 数据科学团队创建的数据集来推广 Watson。在 Kaggle 这里有。
- 本文使用的代码和笔记本(文末链接)是用 Google Colab 创建的。这对开发人员来说是一个很好的资源,免费提供 GPU 和 TPU 访问,以及最新的 Python 库和在需要时安装“外来”包的可能性。
- Google Colab 确实嵌入了很多 Python 包,但是我们需要安装 CatBoost (我们的分类器)和 SHAP (我们的解释器):
!pip install shap
!pip install catboost
数据探索
在导入这个用例所需的库之后,我们可以观察到数据集由 1470 个条目组成,其中有 9 个分类特征和 25 个数字特征。
import pandas as pdfrom imblearn.under_sampling import ClusterCentroids
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrixfrom catboost import CatBoostClassifierimport shap# The following lines should be used only on Google Colab
# to connect to your Google Drivefrom google.colab import drive
drive.mount('/content/drive')
第 9 列“EmployeeNumber”对于每个雇员都是唯一的,因此我们将使用它作为我们的 Pandas 数据框架的索引。在读取 CSV 文件时,由于“index_col=9 ”,此指令得以通过:
df = pd.read_csv("./WA_Fn-UseC_-HR-Employee-Attrition.csv", **index_col=9**)df.info()
整个数据集中没有缺失的信息…这显然是一个合成的数据😅。
在我们进入建模阶段之前,我建议做一些改进:
- 让我们创建两个字典,根据它们的基数(0,1,2)将“是/否”列转换为“0/1”和旅行频率类别。
yes_no_to_0_1_dict = {"Yes": 1, "No": 0}
business_travel_dict = {"Non-Travel": 0,
"Travel_Rarely": 1,
"Travel_Frequently": 2}df = df.replace({"Attrition":yes_no_to_0_1_dict})
df = df.replace({"OverTime":yes_no_to_0_1_dict})
df = df.replace({"BusinessTravel":business_travel_dict})
2)“employee count”、“StandardHours”和“Over18”列是稳定的(即列中有一个唯一值),我们可以简单地删除它们,因为它们不会给模型带来任何有用的信息。
df.columns[df.nunique()==1]**Index(['EmployeeCount', 'Over18', 'StandardHours'], dtype='object')**df = df.drop(["EmployeeCount","StandardHours","Over18"], axis=1)
机器学习算法无法处理分类特征,因此我们还需要借助 pd.get_dummies() 指令将它们转换为数值向量:
df = pd.get_dummies(df)# This instruction can be used before and after the use of
# get_dummies to see changes on the dataset
df.filter(like="Marital").sample(10, random_state=22)
" df.filter 的结果(like = " Marital ")。sample(10,random_state=22) 【前后】PD . get _ dummies()
大多数员工会在雇主那里呆一段时间,辞职率很低,但结果是,在收集减员数据时,你会比离职者获得更多关于员工的信息…
df["Attrition"].value_counts()Attrition
0 1233
1 237
Name: Attrition, dtype: int64
只有 16%的数据集对应于已经离开公司的员工,这显然是一种“不平衡”的情况。为什么这是一个问题?
这里的主要风险是,算法更有可能推断出从多数类继承的模式,而感兴趣的类通常是较小的一个(例如:癌症诊断、垃圾邮件或欺诈检测、员工流失等。).
分类器的默认优化度量通常默认设置为“准确性”(=正确预测/总预测),但是,对于不平衡的数据集,无用的模型仍然可以实现非常高的准确率。
例如,让我们考虑一个用不平衡数据集(10 000 封邮件中的 100 封垃圾邮件)训练的垃圾邮件检测系统。如果该模型试图最大限度地提高其准确性,它最终可以预测所有的电子邮件为“非垃圾邮件”,这将导致 99%的准确性…但您将无法检测到任何垃圾邮件!
对于此用例,建议考虑的优化指标是“召回”,因为它将评估对人群中实际上已经辞职(真阳性)的人的检测:
回忆=真阳性/(真阳性+假阴性)
模型培训—第一轮
创建我们的训练和测试数据集后:
X = df.drop("Attrition", axis=1)
y = df["Attrition"]X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=22)
我们训练我们的模型,而没有关于不平衡情况的任何特定预防措施:
model = CatBoostClassifier(iterations=500,
verbose=100,
eval_metric="Recall")model.fit(X_train, y_train)
让我们显示培训和测试阶段的困惑矩阵:
我们可以观察到召回率的真正下降,在训练和测试阶段之间从 90%下降到 19%!
模型训练—第二轮(使用班级权重)
向模型“教导”它需要更加关注少数群体的一种方式是引入“类权重”。
由于这种方法,当模型未能检测到真正的肯定(离开者)时,我们可以给模型分配更强的惩罚。因此,我们指定 1:5 的比率,这意味着错误的辞职检测惩罚将比错误的员工检测惩罚重 5 倍:
class_weights = dict({0:1, 1:5})model = CatBoostClassifier(iterations=500,
verbose=100,
eval_metric="Recall",
class_weights=class_weights)model.fit(X_train,y_train);
再次使用混淆矩阵,我们可以看到模型预测的真正改进,因为测试数据集上的召回分数从 19%增加到 39%,而准确性保持稳定:
模型训练—第 3 轮(使用欠采样)
另外两种方法可以完成类权重的使用:
1/过采样少数类
第一种方法依赖于诸如 SMOT(合成少数过采样技术)之类的技术,其中基于现有的少数类生成新数据。
例如,在一个非常简化和“一维”的方式,SMOT 创造了新的个人,把他们放在少数阶级点之间的“连接线”上。
SMOT 方法:初始不平衡人口
SMOT 方法:新生成数据的表示
2/欠采样多数类
假设许多员工都有相同的个人资料(例如:已婚男性,在会计部门工作 20 年以上,辞职率极低)。减少他们代表的数量来帮助模型理解辞职的真正影响参数是否有意思?当然!这正是欠采样技术所能提供的。
在本例中,我们将使用“ClusterCentroids”方法,该方法将:
1 -在多数类中创建聚类,其中个体具有相似或相近的属性
2 -用相应的质心替换每个聚类的个体。
cc = ClusterCentroids()X_cc, y_cc = cc.fit_resample(X, y)X_train, X_test, y_train, y_test = train_test_split(X_cc, y_cc)
再次使用混淆矩阵,我们可以观察到训练和测试阶段的召回率现在都是 100%,这意味着在多数类中有许多具有相同特征的个体,现在被他们的质心所代替:
注意:该模型的“卓越”表现是由于我们正在处理合成数据,这些数据比真实数据随机性更小。
用 SHAP 解释预测
现在我们有了一个关于真阳性检测的健壮模型,从人力资源的角度来看,理解为什么模型认为一个雇员有很大的可能性辞职或不辞职将是有趣的。
定型模型上的“feature_importances_”属性是在宏观级别上了解哪些参数对预测起着重要作用的最直接的方法。
如 Scikit 学习文档 所述:“一个特性的重要性被计算为该特性所带来的标准的(标准化)总缩减。这也被称为基尼系数。”
feat_imp = pd.DataFrame(model.feature_importances_, index=X.columns, columns=["Importance"])feat_imp.sort_values(by="Importance", ascending=False).head(15)
模型的 15 个 mot 影响参数
然而,它并没有指出每个参数对估计概率有正面还是负面的影响…这种影响也可能因每个样本的特征而异。
这就是最初创作于 2017 年的 SHAP(SHapley Additive explaints)进入游戏的地方!
SHAP 已经被设计,使用博弈论,以确定什么是模型中每个功能的边际贡献。如果您想进一步研究其计算机制,快速搜索数据科学将回答您的所有问题。
他们在使用 SHAP 时有许多好处,这里举几个:
1/你可以为每一个人找出在预测中起最重要作用的参数:
# Overall calculation of the SHAP model and values
shap_explainer = shap.TreeExplainer(model)
shap_values = shap_explainer.shap_values(X)#
Employee_ID = 1shap.initjs()
index_choice = df.index.get_loc(Employee_ID)
shap.force_plot(shap_explainer.expected_value, shap_values[index_choice], X.iloc[index_choice])
上图中显示的重要信息有:
- 基值(3.362) 代表员工辞职的平均概率。这是模型中所有参数的平均贡献。我们可以把它当作一个基线。
- 个体值(5.31) 代表员工#1 离开公司的概率,高于基线(又名“基础值”)。
- 红色参数显示哪些特征使员工更有可能离职:没有股票期权计划、定期加班、单身等。参数离单个值越近,它们在预测中的作用就越大(图表上每个参数的宽度也提供了这种“重要性”信息)。
- 蓝色参数解释了她档案中的哪些元素降低了辞职的可能性:在当前职位上 4 年,与同一位经理共事 5 年,等等。
现在让我们看看员工 2。由于高绩效评级、股票期权计划以及在同一位经理手下工作了 7 年,他的辞职概率“低于平均水平”( 3.10 )。
2/您可以显示整个群体(按个人相似度、辞职概率或原始排序排序)
shap.initjs()
shap.force_plot(shap_explainer.expected_value, shap_values, X)
3/你可以专注于某个具体特征的影响。下面的图表显示,年轻确实增加了辞职的可能性,直到一个人到了 40 岁,年龄开始发挥相反的作用。
4/并且明显地比较所有参数的各自贡献:
在我们结束这篇文章之前,有一些评论:
- 像往常一样,模型的稳健性将高度依赖于输入数据的质量。掌握相关的、最新的、有背景的员工信息将有助于你更好地理解辞职因素。
- 第 3 轮中的完美回忆分数是由于员工的档案是通过公式和算法创建的,这使得他们很容易预测另一种算法!即使我们可以确定员工离职的趋势,这仍然是每个人的复杂决策过程,可能没有数据集可以完全捕捉到!
那都是乡亲们!😀
使用过的完整笔记本储存在这里的 Google Colab/Drive 上。
数据科学、机器学习和创新
pl-bescond.medium.com](https://pl-bescond.medium.com/pierre-louis-besconds-articles-on-medium-f6632a6895ad)
按行业和城市分列的就业增长趋势:数据研究
根据劳动统计局的报告,就业市场继续增长。然而,无论是在国家层面还是在地方层面,并非所有行业都以同样的速度增长。这份报告(由美国社区调查的 2017 年县商业模式数据集提供支持)考察了最大的大都市区顶级就业部门的就业增长情况。
这里有一些高层次的见解, 但是到这里来使用我的免费 Tableau 仪表板,进一步了解不同的行业、领域和其他就业趋势 。
按城市/大都市区划分的最集中行业( 查看仪表盘 )
哪个行业的单位面积雇佣人数最多?
当观察每个顶级市场的顶级行业时,医疗保健和社会援助部门占据了市场的最大份额,包括占大费城地区的 19.3%。有几个主要地区与这一趋势不同,如华盛顿 DC 和圣何塞,专业、科学和技术服务分别占所有工作岗位的 21%和 13%)。住宿和餐饮服务占圣地亚哥就业的 14%,奥兰多的 16%。
按地区划分的最集中行业(与全国平均水平相比)( 查看仪表盘 )
与全国平均水平相比,一个行业在一个地区的就业集中度如何?
现在,我们将某个行业在该地区的就业集中度与该行业的全国平均就业水平进行比较。
软件出版在多个主要市场中被过度指数化,在旧金山(+高于全国平均水平 380%)、圣何塞(+622%)和西雅图(+597%),软件出版就业超过全国平均水平 380%。大学是匹兹堡(+187%)和圣路易斯(+106%)指数最高的行业。波士顿(+269%)和费城(+225%)的投资组合管理指数过高。与此同时,DC 和巴尔的摩的计算机系统设计服务指数过高(分别为+485%和+276%)。
分行业就业增长( 查看仪表盘 )
在全国范围内,哪些行业增长最快?
根据这组数据,在过去的五年里,总就业率增长了 9.3%。某些部门的增长一直高于平均水平。当看全国总数时,专业贸易承包商(+27%)、建筑(+25%)和餐馆(+20%)出现了大幅增长。与此同时,废物管理(-1.6%)和行政服务(-2.1%)在过去 5 年中有所缩减。对于食品行业来说,这也是一个不错的五年,食品服务和饮料场所(+19.6%)、全方位服务餐馆(+15.5%)和有限服务餐馆(+24.7%)的就业人数连续五年增长。
行业就业增长高于或低于全国平均水平的地理视图( 查看仪表板 )
Color: Green = Area 的部门工作比例高于美国平均水平。红色=该地区的部门工作比例低于美国平均水平
区域气泡尺寸基于区域(所有行业)的员工总数
我将在下面展示几个主要行业作为例子, 但请到这里使用我的免费 Tableau 仪表盘来进一步了解不同的行业、领域和其他就业趋势 。
健康护理
在最大的市场中,东北部的医疗保健就业指数过高,但密西西比以西的主要市场的医疗保健就业指数往往偏低。
信息
只有少数市场的信息就业指数过高,但它分散在全国各地。然而,中北部市场(包括芝加哥、明尼苏达、底特律和克利夫兰等主要地区)在该行业中指数偏低。
零售业
在全国范围内,零售贸易几乎完全在最大的市场中指数化不足,而在较小的市场中指数化过度。
制造业
与信息中的地理趋势相反,芝加哥、明尼苏达、底特律和克利夫兰等主要中北部地区的制造业工作指数过高,而沿海主要市场(佛罗里达以外)的制造业工作指数往往过低。
建设
西部、中部和南部地区的建筑业就业指数往往过高,而东北部地区的集中度较低。
感谢您阅读我最新的数据帖子。作为一名产品营销和数据分析专业人士,我对数据支持的讲故事充满热情。这些数据新闻帖子是我将真实数据与我个人的不同兴趣整合起来的方式,这些兴趣包括从旅行和娱乐到经济和社会问题的任何事情。
如果您有任何评论、故事想法或预期的数据项目,请随时发送电子邮件至 dwpwriting <邮箱至> gmail < dot > com,访问我的网站至【dwpeterson.com,或通过LinkedIn联系我。
通过 BigQuery 和 Data Studio 实现苹果移动趋势报告
让我们为苹果移动报告的数据提供超级动力:世界各地的决策者已经在使用 BigQuery 和 Data Studio 来应对当前的危机。借助本文中的工具,我们将帮助他们充分利用这个数据集和我们的工具。
更新 2020 年 4 月 24 日:分步视频
查看我与Yufeng的实时聊天,了解使用 Data Studio 进行 BigQuery 的最佳实践:
样本结果
这个数据集的官方苹果仪表盘显示了这样的结果:
在这里,我们将构建一个 Data Studio 仪表板,在这里我们可以看到如下所示的相同数据:
你可以看到:
- 趋势噪音更小(7 天平均值)。
- 突出显示国家和城市的地图。
- 显示数据摘要的表格,包括每个地区流量减少 25%以上的第一天。
- 允许您可视化其他交通类型(驾驶、公交、步行)的交互式控件。
请注意我对这些图表中曲线的所有分析仅供我们娱乐。对于世界各地正在发生的事情的真正建议和分析,去找一个真正的公共卫生专家。这篇文章的目标是我们如何充分利用现有的工具,这样我们就可以帮助领域专家完成他们的工作。#负责任地
比较新加坡、东京、米兰、旧金山和纽约
- 在这 5 个城市中,米兰是第一个在苹果移动性报告中大幅下降的城市:2 月 28 日。
- 新加坡的跌幅更早(2 月 9 日),但远没有米兰大。直到 3 月下旬和 4 月,政府才不得不采取更严厉的措施。
- 东京的交通流量并没有明显下降——只是在 4 月初情况恶化后,曲线才下降。
- 旧金山和纽约表现出相似的曲线,旧金山在步行方面领先纽约 5 天,在开车方面领先纽约 2 天。
比较美国城市
- 旧金山和纽约有相似的曲线(旧金山几天前放弃了)。
- 西雅图、芝加哥和迈阿密有相似的曲线。
- 亚特兰大的交通流量比其他城市下降得少。
交通流量没有大幅下降的城市
一些城市没有看到任何有意义的(7 天平均值<75%) drop in traffic.
We can see some of these cities here (with San Francisco for comparison):
Latin America vs Barcelona
- 巴塞罗那的下跌比拉美其他城市更早(3 月 15 日)也更深。仍在进行中。
- 你可以看到布宜诺斯艾利斯对拉美的反应最强烈。
- 圣地亚哥、布宜诺斯艾利斯和圣保罗在同一天下跌了 25%以上:3 月 19 日。
- 哥伦比亚表现出最不深刻的反应(但你应该考虑到我们在这里是把城市比作一个国家)。
- 墨西哥城是最后一个做出反应的城市:3 月 20 日。
- 圣地亚哥和圣保罗正在引领“恢复正常”。这将如何获得回报?
—
让我们回顾一下这是如何建立的。
背景
在分享这个数据集的过程中,苹果做了一些伟大的事情:
- 你可以看到世界各地的城市和国家是如何应对危机的。您可以将这些数字与实际措施和案例进行比较,看看反应的效果如何。
- 他们发布每日 CSV,同时为任何寻求快速结果的人提供一个交互式仪表盘。
COVID-19 国家/地区和城市的移动趋势。报告每天发布,反映对…的要求
www.apple.com](https://www.apple.com/covid19/mobility)
改进的机会:
- 我们希望将该数据集与其他表连接起来。谷歌的公共数据集项目已经在 BigQuery 中收集了越来越多的新冠肺炎相关数据集。
- 他们的官方仪表盘显示了很多日常噪音。我们可以用 7 天平均值来代替吗?
- **可以用 SQL 对城市进行排名吗?**例如,哪些城市是第一批颁布居家政策的城市?哪些城市还没有这样做?哪些城市出现了明显的政策反弹?
- 我们能让地理信息更清晰吗?每一行仅通过城市名称来标识地理位置——这在我们需要地理定位数据时没有帮助。我们可以用一些 SQL 来改进这一点。
- 找到下载每日 CSV 的网址并不容易。
- 他们的数据不整齐。每天拥有一个专栏并不是处理数据集的最佳方式,因此需要进行一些清理。我之前的帖子展示了如何用 SQL 中的逆透视 UDF 来改进这些表。
[## 如何用 SQL 和 BigQuery 将多个列拆分成整齐的一对
这篇文章是写给任何在 CSV 中处理时间序列的人的,每天都有一个新的专栏。处理整齐的数据是…
towardsdatascience.com](/how-to-unpivot-multiple-columns-into-tidy-pairs-with-sql-and-bigquery-d9d0e74ce675)
操作方法
( github 回购最新)
在 BigQuery 中加载和更新每日文件
使用一些curl
和jq
魔法——因为没有直接的方法来获得下载 url:
x=$(curl -s [https://covid19-static.cdn-apple.com/covid19-mobility-data/current/v1/index.json](https://covid19-static.cdn-apple.com/covid19-mobility-data/current/v1/index.json))
url=$( echo [https://covid19-static.cdn-apple.com`jq](https://covid19-static.cdn-apple.com`jq) -n "$x" |jq -r '.basePath'``jq -n "$x"|jq -r '.regions."en-us".csvPath'
`)
curl -s $url -o /tmp/latestAppleCovidData.csv
bq load --autodetect --replace fh-bigquery:temp.latestAppleCovidData /tmp/latestAppleCovidData.csv
转换成整齐的数据
CREATE OR REPLACE TABLE
`fh-bigquery.public_dump.applemobilitytrends_initial`
OPTIONS (
description="[https://www.apple.com/covid19/mobility](https://www.apple.com/covid19/mobility)"
) ASSELECT geo_type, region, transportation_type, unpivotted.*
FROM `fh-bigquery.temp.latestAppleCovidData` a
, UNNEST(fhoffa.x.cast_kv_array_to_date_float(
fhoffa.x.unpivot(a, '_2020'), '_%Y_%m_%d')) unpivotted
转换成整洁的数据,并添加有用的列
CREATE OR REPLACE TABLE
`fh-bigquery.public_dump.applemobilitytrends`
OPTIONS (
description="[https://www.apple.com/covid19/mobility](https://www.apple.com/covid19/mobility)"
) ASWITH data AS (
SELECT geo_type, region, transportation_type, unpivotted.*
, LEAST(-1 + value/100, 0.2) percent
FROM `fh-bigquery.temp.latestAppleCovidData` a
, UNNEST(fhoffa.x.cast_kv_array_to_date_float(
fhoffa.x.unpivot(a, '_2020'), '_%Y_%m_%d')) unpivotted
), annotated_data AS (
SELECT *
, -1+EXP(AVG(LOG(1+percent)) OVER(PARTITION BY geo_type, region, transportation_type ORDER BY date
rows between 6 preceding and current row)) avg7day
, geo_type||transportation_type||region series_id
FROM data
)SELECT *, ROW_NUMBER() OVER(ORDER BY current_percent) rank
FROM (
SELECT *
, (SELECT percent
FROM annotated_data
WHERE a.series_id=series_id
AND date=(SELECT MAX(date) FROM annotated_data)
) current_percent
, (SELECT MIN(date) FROM annotated_data WHERE a.series_id=series_id AND avg7day<-.25) first_drop_date
FROM annotated_data a
)
这个查询中有一些有趣的技巧:
- 带
OVER(... rows between 6 preceding and current row)
的 7 日移动平均线。 - 使用
-1+EXP(AVG(LOG(1+percent))
代替传统平均值的平方平均值来舍入异常值。 - 一些值在前一天大幅跃升至 100%以上。我们用
LEAST(-1 + value/100, 0.2)
统治他们。 - 带有自连接的子查询得到第一天的流量低于基本流量的 75%。
- 我们用
geo_type||transportation_type||region
创建了一个系列 id,以便于自连接。
重要注意事项
为什么苹果会允许访问这些数据?
根据他们的使用条款:
当新冠肺炎被世界卫生组织定义为疫情时,您可以使用本网站上提供的移动趋势报告,包括对其的任何更新(统称为“苹果数据”),但仅限于协调对新冠肺炎公共卫生问题的回应(包括公共政策的制定)所合理需要的时间。
确保阅读他们页面上的全部条款。我写这篇文章的目的是帮助任何使用苹果发布的数据的人协调和改善他们社区对这场危机的反应。世界各地的许多团体已经在为此目的使用 BigQuery 和 Data Studio,在这里我尽我所能为他们节省时间并获得更好的结果。
#负责任地
在创建任何新的与新冠肺炎相关的仪表板之前,请确保阅读Amanda Makulec在您创建另一个关于新冠肺炎的图表之前的十个考虑事项:
总结一下——# viz responsible;这可能意味着根本不在公共领域发布你的可视化。
medium.com](https://medium.com/nightingale/ten-considerations-before-you-create-another-chart-about-covid-19-27d3bd691be8)
交互式仪表板
查看互动数据工作室仪表盘。
后续步骤
待定:
- 一个很好的连接来消除城市和国家的歧义。
- 与其他数据集的有趣连接。
了解我的 Data Studio 和 BigQuery 最佳实践
太平洋标准时间周五中午,YouTube 直播。了解一些使用 Data Studio 和 BigQuery 的最佳实践。跟我一起作为嘉宾上郁风 G 节目的:
[## 与玉凤一起冒险-与 Felipe Hoffa 一起生活:使用 Data Studio 和 BigQuery
在这次冒险中,裕丰虚拟主持费利佩·霍法(应大众要求回来!)探索 Data Studio 集成…
www.meetup.com](https://www.meetup.com/Live-with-Google-Cloud-Developer-Relations/events/270186183)
(太平洋标准时间中午 12 点,美国东部时间下午 3 点,伦敦时间晚上 8 点)
想要更多吗?
查看谷歌的公共数据集项目,其特色是在 BigQuery 中收集了越来越多的新冠肺炎相关数据集:
数据在调查、研究和应对突发公共卫生事件的能力中始终发挥着至关重要的作用
cloud.google.com](https://cloud.google.com/blog/products/data-analytics/free-public-datasets-for-covid19)
我是 Felipe Hoffa,谷歌云的开发者倡导者。关注我 @felipehoffa ,在medium.com/@hoffa找到我之前的帖子,在reddit.com/r/bigquery找到所有关于 BigQuery 的帖子。
通常我会写更长的帖子,但是今天让我给你一个快速的指引。先看看我是如何提取数据的…
towardsdatascience.com](/coronavirus-interest-inwikipedia-by-language-1b3e6562040d) [## 如何用 SQL 和 BigQuery 将多个列拆分成整齐的一对
这篇文章是写给任何在 CSV 中处理时间序列的人的,每天都有一个新的专栏。处理整齐的数据是…
towardsdatascience.com](/how-to-unpivot-multiple-columns-into-tidy-pairs-with-sql-and-bigquery-d9d0e74ce675)
用 IBM Watson AutoAI 增强公民数据科学家的能力
利用人工智能来自动化机器学习任务并增强模型生命周期管理
为什么我们需要关心 AI 自动化?
过去几年数据科学领域最重要的发展之一是自动化人工智能(AutoML)解决方案,它使业务分析师和 IT 专业人员能够在很少或没有数据科学编码经验的情况下执行复杂的机器学习活动。AutoAI 通过在数据科学和人工智能项目中使用人工智能自动化来完成关键的机器学习任务,使数据科学家能够更快、更有效地开展项目。
最近的统计数据显示,尽管机器学习和数据科学社区对角色的需求激增。Kaggle & KD Nuggets 上 50%的数据科学家受访者表示,他们在 ML 方法方面的经验不足 2 年,编码经验也是如此。
使用机器学习方法有多少年的经验?来源:KD 掘金调查
Auto AI 提供自动特征工程、模型验证、模型调整、模型选择和部署、机器学习可解释性、时间序列和模型评分的自动管道生成,为公司提供可扩展的可定制数据科学平台,满足各行业各种用例的需求。
特征工程是高级数据科学家用来从算法中提取最准确结果的有力武器。Auto AI 采用一套算法和特征转换来为给定数据集自动设计新的高价值特征。
吴恩达已经在特征工程中引入了自动化人工智能的概念
“到 2020 年,公民数据科学家的数量将比专家数据科学家的数量增长快五倍。组织可以使用公民数据科学家,在一定程度上填补数据科学家短缺和高成本导致的机器学习人才缺口。”
**资料来源:Gartner:**10 大战略技术趋势
Watson Studio 中的 AutoAI 工具会自动分析您的数据,并为您的预测建模问题生成定制的候选模型管道。这些模型管道是在 AutoAI 分析数据集并发现最适合您的问题设置的数据转换、算法和参数设置时迭代创建的。结果显示在排行榜上,显示根据问题优化目标排列的自动生成的模型管线。
AI 设计 AI
人工智能自动化可以改变业务流程的工作方式。神经网络和机器学习算法可以说是数据科学家目前可用的最强大的工具。然而,虽然只有一小部分数据科学家拥有从头创建高性能神经网络所需的技能和经验,但同时需求远远超过供应。
因此,即使在概念验证阶段,大多数企业也很难快速有效地获得一种新的神经网络,这种网络在架构上是定制设计的,以满足其特定应用的需求。因此,通过为给定数据集自动设计神经网络架构来弥合这一技能差距的技术正变得越来越重要。
深度学习(depth)在神经网络中的进化来源:IBM
AI 优化 AI
使用人工智能设计和优化人工智能模型为人工智能技术的发展带来了一种新的和急需的能力。例如,复杂网络的参数调整可能非常耗时,容易出错,并且可能无法随时间和资源而调整。神经网络的规模和复杂性不断增长,因此有必要自动化最佳参数选择的过程,以确保机器学习过程以准确和最佳的方式生成预测结果。
使用 AutoAI 优化神经网络参数来源:IBM
艾治艾
60 %的公司认为监管约束是实施人工智能高效和自动化政策的障碍。无需昂贵的数据科学资源,在生产应用中手持多个人工智能模型:
1.当涉及到模型 验证时,如果人工智能模型符合法规并且将在部署之前实现预期的业务成果,将会面临多重挑战
2.难以跟踪和测量部署下的业务成功指标。
3.持续业务监控和合规性的资源密集型和不可靠流程
4.业务用户不可能将微妙的领域知识反馈到模型生命周期中
Watson AutoAI 的功能
- 自动化数据准备
大多数数据集包含不同的数据格式和缺失值,正如我们所知,大多数标准的机器学习算法都没有缺失值。AutoAI 应用各种算法或估计器来分析、清理和准备用于机器学习的原始数据。它根据数据类型(如分类或数值)自动检测和分类特征。最重要的要求之一是变量缩放,以确保大多数变量被同等缩放,并减少机器学习偏差。根据分类,它使用超参数优化来为您的数据确定缺失值插补、特征编码和特征缩放的最佳策略组合。
2。自动化特征工程
特征工程试图将原始数据转换成最能代表问题的特征组合,以实现最准确的预测。AutoAI 使用一种独特的方法,以结构化、非穷举的方式探索各种特征构造选择,同时使用强化学习逐步最大化模型准确性。这导致数据转换的优化序列,最匹配模型选择步骤的算法。
IBM Watson Studio 中的自动 ML 演示
3。超参数优化
超参数优化流程优化了最佳性能模型 bia 算法管道。AutoAI 使用一种新颖的超参数优化算法,针对机器学习中典型的模型训练和评分等代价高昂的函数评估进行了优化。这种方法能够快速收敛到一个好的解决方案,尽管每次迭代的评估时间很长。
4。自动型号选择
下一步是自动选择与您的数据匹配的模型。AutoAI 使用一种新颖的方法,能够针对数据的小子集对候选算法进行测试和排序,逐渐增加最有希望的算法的子集大小,以达到最佳匹配。这种方法在不牺牲性能的情况下节省了时间。它能够对大量候选算法进行排序,并为数据选择最佳匹配。
Titanic 数据集中的模型管道比较来源:IBM
IBM 的人工智能开发自动化战略
1。转移学习
迁移学习 (TL)是许多深度学习应用的重要组成部分。迁移学习是机器学习(ML)中的一个研究问题,它专注于存储在解决一个问题时获得的知识,并将其应用于另一个不同但相关的问题。例如,在学习识别汽车时获得的知识可以应用于识别卡车。
这主要是由于深度学习系统中训练产品的规模;它们非常庞大,需要大量的资源。有许多预先训练的模型可用于各种平台和任务,如 MobileNet、Tensorflow 的 Yolo 等。
2。神经网络架构搜索
神经架构搜索(NAS)只是自动化管道的一个组成部分,旨在找到合适的架构来训练深度学习模型。这种搜索本身是一项计算密集型任务,已经引起了深度学习社区的极大兴趣。
因此,在神经结构搜索方法的发展中出现了热潮,给该领域留下了许多竞争的选择,很少或没有对已开发的方法进行整合,并且缺乏帮助从业者选择适当方法的指南。在我们的调查中,我们通过对现有景观的极其彻底的分析来解决这一差距。我们提供了一种形式主义,它统一了大量的现有方法,并批判性地检验了不同的方法。这清楚地强调了有助于神经架构搜索的设计和成功的不同组件的好处,同时也揭示了当前架构搜索趋势中的一些误解。
强化学习中的神经架构搜索来源:IBM
3。模型管道优化&部署
当 AutoAI 生成模型时,有两个不同的视图,通过它们可以直观地显示这些管线的创建进度。它们是进度图和关系图,如下图所示。您可以看到,AutoAI 已经选择 XGB、随机森林和决策树分类器作为这个用例中性能最好的算法。在数据预处理之后,AutoAI 识别前三个执行算法,并且对于这三个算法中的每一个,AutoAI 生成以下管道:自动模型选择(管道 1)、超参数优化(管道 2)、自动特征工程(管道 3)、超参数优化(管道 4)。
图显示了这些管道之间的关系图来源:IBM
每个模型管道都根据各种指标进行评分,然后进行排名。二元分类模型的默认排名度量是 ROC 曲线下的面积,多类分类模型的默认排名度量是准确度,回归模型的默认排名度量是均方根误差(RMSE)。排名最高的管道显示在排行榜中,因此您可以查看有关它们的更多信息。排行榜还提供了在查看后保存精选模型管道的选项。
渠道排行榜来源:IBM
免责声明: 此处表达的部分观点仅代表本文作者的观点,不一定代表 IBM 公司的观点。部分内容。博客上的是版权和所有权利保留-但是,除非另有说明-根据 IBM 公司。
模拟具有长短期记忆的 PID 控制器:第 1 部分
使用温度控制实验室创建比例-积分-微分控制器数据
你曾经对一个想法感到非常兴奋吗?也许这是你正在处理的一个新的 DIY 项目,或者是工作中一个很酷的任务。也许你和我一样疯狂,想要徒步穿越太平洋山顶小径(因为我很快就要搬到西雅图,所以我忍不住对飞往圣地亚哥然后步行回家的想法感到兴奋)。嗯,这个项目对我来说是其中一个想法,我希望你喜欢这个旅程!
在我开始之前,我想提醒你这是一个相当广泛的项目,所以我把它分成几个部分。它们将如下:
- 使用温度控制实验室创建比例-积分-微分控制器数据(本文)
- 在 Keras 中训练一个长短期记忆神经网络,以模拟 PID 控制器
- 用 LSTM 控制温控实验室
- 用 LSTM 控制器代替 PID 控制器进行温度控制的实际应用
项目框架
有一天,在做一个工作项目时,我看到一篇介绍了一个新颖想法的论文。一些研究人员有想法使用神经网络来模拟模型预测控制(MPC)策略的行为。这个想法是,一些 MPC 问题在计算上非常昂贵,但是行为是可预测的;**如果我们可以通过训练深度神经网络来模拟这种行为,那么理论上,我们可以用更快的机器学习模型来取代计算量大的 MPC。**该过程中唯一计算量大的部分是模型训练。
最棒的是,我在办公桌前测试了这个想法。温度控制实验室被完美地设计成这种问题的原型。我在之前的一篇文章中介绍了 TCLab 和一些基本的异常检测,你可以用机器学习来做这些。如果你是对外汉语实验室的新手,你可以看看我的文章,或者看看 APMonitor.com的丰富资源。
所以我决定尝试一下:我想调整一个比例-积分-微分(PID)控制器,这样我就可以在 TCLab 上设置一个温度,控制器会调整加热器,直到它达到设定值。然后,我想看看我能否用一个长短期记忆神经网络来模拟这种行为。如果这个原型成功了,它将不仅为提高计算速度打开大门,也为异常检测等应用打开大门。
这个系列是关于机器学习的,所以如果你不熟悉 PID 控制器或控制理论,那也没关系;我们将重点介绍几个亮点,以便您了解背景。在 APMonitor.com有一些惊人的资源可以帮助你理解 PID 控制器以及如何调整它们。这些控制器在工程行业中无处不在,因此其潜在应用非常广泛。
PID 控制器概述
控制系统无处不在。想想你的恒温器:你所要做的就是输入温度,不知何故,它知道什么时候打开和关闭暖气,以保持你的房子在那个温度(当然,除了房间总是一个冰盒……)。它是怎么做到的?控制系统可以分为三个部分:传感器(读取房间温度的东西),执行器(打开冷气或热气的空调或炉子),控制器(恒温器中的计算机,是操作背后的大脑)。传感器数据输入控制器,然后控制器告诉执行器做什么。
PID 控制器无处不在是有原因的:它们简单明了且极其有效,尤其是当与一个一阶加死区(FOPDT)模型配对时。在我们的 TCLab 中,它将温度设定点和温度传感器之间的差值(在下面的等式中表示为 e(t ))作为输入,并输出一个加热器值(下面标记为 output,或 OP ),使温度接近设定点。顾名思义,有一个比例,积分和导数部分。
K_c、τ_I 和τ_D 称为调谐常数,决定控制器的行为。您可以 g 为您的 TCLab 生成阶跃响应,然后以图形方式获得 PID 控制器的调谐参数。对于我的 TCLab,一些有效的调优参数是 K_c = 6.0、τ_i =75.0 和τ_d = 0.0。您的可能会有所不同,因为每个 TCLab 的行为略有不同。现在让我们来看看 PID 控制器的代码。我放在函数pid(sp,pv,pv_last,ierr,dt)
里了。
第一部分是加载您的调优参数和其他常数:
# PID Parameters
Kc = 6.0
tauI = 75.0 # sec
tauD = 0.0 # sec# PID coefficients in terms of tuning parameters
KP = Kc
KI = Kc / tauI
KD = Kc * tauD
# OPbias for controller (initial heater)
op0 = 0# upper and lower bounds on heater level
ophi = 100
oplo = 0
然后,我们要计算设定值(sp)和温度(也称为过程变量,pv)之间的误差:
# calculate the error
error = sp - pv
积分部分通过数值计算,将之前的误差与当前的时间步长误差相加:
# calculate the integral error
ierr = ierr + KI * error * dt
最后,控制器的导数部分(也是数值计算)如下所示:
# calculate the measurement derivative
dpv = (pv - pv_last) / dt
现在将所有这些放在一起,我们可以计算 PID 输出(op):
# calculate the PID output
P = KP * error
I = ierr
D = -KD * dpv
op = op0 + P + I + D
最后,为了确保我们考虑了 0 到 100 之间的加热器限值,我们添加了一个防复位饱和条件:
# implement anti-reset windup
if op < oplo or op > ophi:
I = I - KI * error * dt
# clip output
op = max(oplo,min(ophi,op))
那还不算太糟!如果没有别的,你学会了如何编程一个 PID 控制器功能,这是非常有用的工业控制器。
从 PID 控制器生成数据
现在我们需要在 TCLab 上实际运行 PID 控制器。我们将设置几个数组来存储数据,并运行控制器 90 分钟,以确保我们有足够的数据。我们将间歇性地改变温度设定值,这样我们就能很好地混合稳态和瞬态行为。以下是我的设置:
##### Set up run parameters ###### Run time in minutes
run_time = 90.0# Number of cycles
loops = int(60.0*run_time)# arrays for storing data
T1 = np.zeros(loops) # measured T (degC)
error_sp = np.zeros(loops) # Setpoint error
Q1 = np.zeros(loops) # Heater values
tm = np.zeros(loops) # Time# Temperature set point (degC)
with tclab.TCLab() as lab:
Tsp1 = np.ones(loops) * lab.T1# vary temperature setpoint
end = 30 # leave 1st 30 seconds of temp setpoint as room temp
while end <= loops:
start = end
# keep new temp set point value for anywhere from 4 to 10 min
end += random.randint(240,600)
Tsp1[start:end] = random.randint(30,70)
画出你预期会发生的事情从来都没有坏处。在 90 分钟的过程中,我们打算让 PID 控制器设置加热器,使温度遵循以下曲线:
作者的情节
我们都准备好了!在我写的另一篇文章中,我详细介绍了如何在 TCLab 上运行,但是这个应用程序稍微高级一些。最值得注意的是,我们在每个时间步调用我们的pid(sp,pv,pv_last,ierr,dt)
函数来返回加热器输出,以便我们保持在正确的温度。我们每秒都在更新这个。PID 在计算上并不太昂贵,所以它可以在这段时间内很容易地解决。
# Run test
with tclab.TCLab() as lab:
# Find current T1, T2
print('Temperature 1: {0:0.2f} °C'.format(lab.T1))
print('Temperature 2: {0:0.2f} °C'.format(lab.T2)) # Integral error
ierr = 0.0
# Integral absolute error
iae = 0.0 start_time = time.time()
prev_time = start_time for i in range(loops):
# Delay 1 second
if time.time() > prev_time + 1.0:
print('Exceeded cycle time by ',
time.time()-prev_time-1.0)
else:
while time.time() < prev_time + 1.0:
pass
# Record time and change in time
t = time.time()
dt = t - prev_time
prev_time = t
tm[i] = t - start_time # Read temperatures in Kelvin
T1[i] = lab.T1 # Integral absolute error
iae += np.abs(Tsp1[i]-T1[i]) # Calculate PID output
[Q1[i],P,ierr,D] = pid(Tsp1[i],T1[i],T1[i-1],ierr,dt) # Write heater output (0-100)
lab.Q1(Q1[i])
让我们来看看控制器是如何工作的:
作者的情节
相当整洁!我们希望红线(温度传感器)跟随黑线(温度设定点)。蓝色显示加热器如何调整,以使传感器与设定值相匹配。我们总是可以针对不同的性能调整 PID 参数,但我们希望进入机器学习部分,因此对于这个练习来说,这是完美的。我不知道你,但我们甚至还没有开始机器学习,但仅仅是在我们的办公桌上编程我们自己的控制器就已经很令人兴奋了!
最后的想法…暂时的
首先,你可以从 Github 下载代码。这个练习在很大程度上依赖于 TCLab,但我希望将来添加一些带有原始数据的替代笔记本,这样您就可以在没有原始数据的情况下运行代码。
我们可以设计一个装置来控制温度,这有多棒?有这么多的应用——想想你的恒温器,或者烤箱,甚至是一个别致的烧烤架。更不用说反应器温度或进料流温度的工业应用。你能想到这种控制器的其他应用吗?
感谢您耐心阅读这篇介绍性文章,尤其是如果您从未见过控制器的话。我知道我承诺了一些机器学习应用,这正是我们正在努力的。我们将在下一节(2020 年 10 月)深入探讨这一问题。不过,如果有什么不同的话,我觉得理解机器学习应用程序背后的背景很重要。这不仅使它们与我们的工作或日常生活相关,而且也为更深刻的见解打开了大门。我很高兴听到这可能会给你带来什么想法!
模拟具有长短期记忆的 PID 控制器:第 2 部分
使用温度控制实验室在 Keras 中训练长短期记忆神经网络以仿真 PID 控制器
欢迎来到这个激动人心的项目的第 2 部分!到目前为止,结果看起来很好,现在我们可以进入我们试图完成的内容了:用 LSTM 模拟 PID 控制器的行为。简要回顾一下,以下是我们到目前为止所探索的内容以及我们的发展方向:
- 使用温度控制实验室创建比例积分微分控制器数据
- 在 Keras 中训练一个长短期记忆神经网络来模拟 PID 控制器(本文)
- 用 LSTM 控制温控实验室
- 用 LSTM 控制器代替 PID 控制器进行温度控制的实际应用
如果你想自己运行这段代码,可以在 Github 上找到。它严重依赖于在您的计算机上使用 TCLab 设备,但最终我计划生成数据并添加一些笔记本,这样您也可以作为一个独立的项目来运行它。当然,我总是鼓励你看看你能从中吸取什么原则,并把它们应用到你自己的项目中。
用 LSTM 模拟 PID 行为
完成最后一段后,我们有一些数据要处理,我们想看看 LSTM 是否能模拟 PID 控制器的行为。有一些关于 LSTMs 如何工作的优秀文章,所以如果您以前没有使用过它们,我会向您推荐这些文章。这里是我在研究它们背后的一些数学知识时去的地方之一,而这篇是一篇关于数据科学的精彩文章,向我介绍了它们是如何用 Python 和 Keras 实现的。这里有另一个有视频的很棒的教程。像往常一样,APMonitor.com是所有与机器学习和过程控制相关的丰富资源。
LSTMs 由于其多功能性,已经成为所有类型的机器学习模型的流行方法。我在序列预测任务、自然语言处理和异常检测中使用过它们;其他人已经找到了从图像处理到语音识别的应用。它与标准递归神经网络的区别在于其细胞存储单元的存在,这有助于解决消失梯度问题。
LSTMs 在这类问题上工作得很好,因为我们想记住控制系统中以前发生过什么。如果我们只是将设定点从 35°C 更改为 70°C,我们知道加热器将被置于最大温度一段时间,以达到该设定点。然而,如果我们只是从 45°C 降至 42°C,或者在 55°C 保持稳定一段时间,控制器将不得不做出不同的解释。
在仿真 PID 控制器的情况下,我们希望输入一个数据窗口,例如温度、设定点、误差或加热器值,并预测下一个加热器值应该是多少,以达到所需的设定点。这个预测是模拟具有给定调谐常数的 PID 控制器将会给我们的输出。当然,如果调谐常数改变,我们不再看到相同类型的控制器行为。这是一个有趣的想法,可以在第 4 部分中探讨。
模型特征和预处理
第一步是查看哪些特性对输入模型有用。直观地说,PID 控制器将传感器温度和设定点之间的误差作为输入,因此我们的 LSTM 很可能需要这些。Scikit-learn 有很多有用的特性选择模型来帮助我们理解一些好的输入。让我们使用SelectKBest
方法来缩小我们的选择范围。我们有传感器温度、设定值和加热器输出;我们还将导出误差,并将它们传递给SelectKBest
函数:
# Create new feature: setpoint error
df['err'] = df['Tsp'] - df['T1']# Load possible features
X = df[['T1','Tsp','err']]
y = np.ravel(df[['Q1']])# SelectKBest feature selection
bestfeatures = SelectKBest(score_func=f_regression, k='all')
fit = bestfeatures.fit(X,y)
plt.bar(x=X.columns,height=fit.scores_)
绘制结果显示Tsp
(设定点温度)和err
(设定点和传感器之间的误差)是迄今为止最重要的特征,这验证了我们的直觉。
作者的情节
对于 LSTM,我将使用 Keras 和 Tensorflow 后端;我发现这是一种直观有效的建模方式。在构建模型之前,我需要缩放数据并将其格式化为 LSTM 期望的样子。在这种情况下,我将采用我的Tsp
和err
特征,并以这样一种方式排列它们,即过去的 15 个时间点作为输入来预测加热器输出Q1
。一定要留出一些数据来测试模型性能。
X = df[['Tsp','err']].values
y = df[['Q1']].values# Scale data
s = MinMaxScaler()
Xs = s.fit_transform(X)# Each input uses last 'window' number of Tsp and err to predict the next Q1
X_lstm = []
y_lstm = []
for i in range(window,len(df)):
X_lstm.append(Xs[i-window:i])
y_lstm.append(y[i])# Reshape data to format accepted by LSTM
X_lstm, y_lstm = np.array(X_lstm), np.array(y_lstm)# Split into train and test
Xtrain, Xtest, ytrain, ytest = train_test_split(X_lstm,y_lstm,test_size=0.2,shuffle=False)
训练 LSTM
我们可以查看大量的超参数来优化 LSTM 与 PID 控制器的保真度。我通常会使用一个非常有用的 Python 包,名为 Hyperopt 来调优这些,尤其是对于一个非常复杂的问题。以下是一些运行良好的超参数:
window = 15
layers = 2
batch_size = 100
drop = 0.1
units = 100
现在,我们准备构建 LSTM 模型。有很多关于如何做到这一点的教程,所以我将继续展示代码,然后评论几个亮点。
# Keras LSTM model
model = Sequential()if layers == 1:
model.add(LSTM(units=units,
input_shape=(Xtrain.shape[1],Xtrain.shape[2])
)
)
model.add(Dropout(rate=drop))
else:
# First layer specifies input_shape and returns sequences
model.add(LSTM(units=units,
return_sequences=True,
input_shape=(Xtrain.shape[1],Xtrain.shape[2])
)
)
model.add(Dropout(rate=drop))
# Middle layers return sequences
for i in range(layers-2):
model.add(LSTM(units=units,return_sequences=True))
model.add(Dropout(rate=drop))
# Last layer doesn't return anything
model.add(LSTM(units=units))
model.add(Dropout(rate=drop))model.add(Dense(1))
model.compile(optimizer='adam', loss='mean_squared_error')es = EarlyStopping(monitor='val_loss',
mode='min',
verbose=1,
patience=25
)result = model.fit(Xtrain, ytrain,
verbose=0,
validation_split=0.2,
callbacks = [es,TqdmCallback(verbose=1)],
batch_size=batch_size,
epochs=350)# Show results
epochs = es.stopped_epoch
plt.semilogy(result.history['loss'],label='loss')
plt.semilogy(result.history['val_loss'],label='val_loss')
plt.legend();
构建 LSTM 和 Dropout 图层后,我们有一个值为 1 的Dense
图层,因为模型仅预测 1 个输出值。我们使用adam
优化器和mean_squared_error
作为损失函数。我喜欢留出一些训练数据来用validation_split
参数进行验证。这使我能够监控一组单独数据的损失,如果我的损失达到稳定状态,就提前停止模型训练(你可以用patience
参数调整它达到稳定状态后等待的时间),这可以防止模型过度拟合。TqdmCallback
是一个方便的进度条,比起 Keras 自带的默认进度条,我更喜欢它。最后,最好绘制损失函数,以确保训练损失和验证损失都呈现总体下降趋势。训练 LSTM 需要一点时间,但我们不会处理大数据集,所以这不是禁止性的。
测试 LSTM
在我们使用 LSTM 控制 TCLab 之前,我们希望确保它的行为近似于 PID 控制器的行为。这不仅对于健全性检查很重要,而且也是一个重要的安全问题。你能想象在一个你不确定能否工作的反应器上使用温度控制器吗?如果没有达到预期效果,出现失控反应,可能会造成大混乱。
幸运的是,我们已经准备了一些样本数据,都是 LSTM 期望输入的正确格式。我们只需要看到,给定输入,来自 LSTM 的预测加热器输出与 PID 控制器将做的一致。请务必撤消数据的缩放,以便我们获得真实值。
# Predict using LSTM
yp_s = model.predict(Xtest)# Unscale data
Xtest_us = s_x.inverse_transform(Xtest[:,-1,:])
ytest_us = s_y.inverse_transform(ytest)
yp = s_y.inverse_transform(yp_s)# Derive Tsp (setpoint) and T1 (sensor) from X data
sp = Xtest_us[:,0]
pv = Xtest_us[:,0] + Xtest_us[:,1]
这就是我们所看到的:
作者的情节
太神奇了!您可以看到设定值和 T1 数据(我们从中得出误差),以及来自 PID 控制器的实际数据。绿色显示的是在给定完全相同的输入数据集的情况下,LSTM 的表现。看起来它非常逼真地遵循了 PID 控制器的行为,所以我有信心把它作为代理控制器来试用,只需要一次调整。请注意,LSTM 输出有时会超出加热器限定的范围[0,100]。当我们把它作为控制器编码时,我们必须记住裁剪结果。
最后的想法
我们已经有了一个工作的 LSTM 模型,下一步是把它编码成控制器。这是一个相当大的项目,所以我们将把它留到本系列的下一篇文章中(2020 年 10 月)。在此之前,请确保保存您的模型和用于预处理的任何参数。
# Save Keras LSTM model
model.save('pid_emulate.h5')# Save preprocessing parameters
model_params = dict()
model_params['Xscale'] = s_x
model_params['yscale'] = s_y
model_params['window'] = windowpickle.dump(model_params, open('model_params.pkl', 'wb'))
现在我们有了。我们成功地训练了一个 LSTM 模型来模拟 PID 控制器的行为。下一个重要的步骤是将它投入使用。
模拟具有长短期记忆的 PID 控制器:第 3 部分
用 LSTM 控制温度控制实验室
Johannes Plenio 在 Unsplash 上拍摄的照片
欢迎来到这个项目的第 3 部分!现在,你的雇主正在看着你的结果,说“那又怎么样?”你已经做了很多跑腿的工作,但是到目前为止,它只是在电脑上看起来不错。嗯,这是“那又怎样”的部分。这就是我们最终实现这个 LSTM 神经网络来模拟 PID 控制器行为的地方。简单回顾一下,我们已经走过的路和将要去的地方如下:
- 使用温度控制实验室创建比例积分微分控制器数据
- 在 Keras 中训练一个长短期记忆神经网络,以模拟 PID 控制器
- 用 LSTM 控制温度控制实验室(本文)
- 用 LSTM 控制器代替 PID 控制器进行温度控制的实际应用
和往常一样,你可以自由地自己运行代码,最好是和温度控制实验室一起运行,这样你就可以看到实时数据。
最后一次检查
虽然我们上次检查了 LSTM 控制器的输出,但我们还是想先练习安全。我们不想在运行像反应堆温度这样敏感的东西时调试我们的控制回路。因此,首先,我们将保留我们的 PID 控制器,但也计算 LSTM 控制器输出。这使我们能够看到我们编程的 LSTM 控制器与 PID 控制器相比做了什么,并对其进行调试。
到目前为止,您对此已经很熟悉了,但是设置跑步只需要做一些调整:
#### Set up run ##### Import model and model parameters
model = load_model('pid_emulate.h5')
model_params = pickle.load(open('model_params.pkl', 'rb'))s_x = model_params['Xscale']
s_y = model_params['yscale']
window = model_params['window']# Run time in minutes
run_time = 30.0# Number of cycles
loops = int(60.0*run_time)# arrays for storing data
T1 = np.zeros(loops) # measured T (degC)
Qpid = np.zeros(loops) # Heater values for PID controller
Qlstm = np.zeros(loops) # Heater values for LSTM controller
tm = np.zeros(loops) # Time# Temperature set point (degC)
with tclab.TCLab() as lab:
Tsp = np.ones(loops) * lab.T1# vary temperature setpoint
# leave 1st window + 15 seconds of temp set point as room temp
end = window + 15
while end <= loops:
start = end
# keep new temp set point value for anywhere from 4 to 10 min
end += random.randint(240,600)
Tsp[start:end] = random.randint(30,70)# leave last 120 seconds as room temp
Tsp[-120:] = Tsp[0]
您将注意到的第一件事是,我们从训练运行中加载了模型和预处理参数。这些匹配很重要,否则结果会很糟糕,或者根本不起作用。我跑了 30 分钟,因为我只需要看到足够多的东西来确信它是可行的,而不是试图生成足够多的高质量数据来训练 LSTM。我还有两个独立的加热器阵列,一个存储 PID 输出,一个存储 LSTM 输出。最后,在最后 2 分钟,我把我的温度设定值调回到室温。通常你不需要担心这个,但是因为我连续做了两次测试,这使得第二次测试从接近室温开始,而不需要在两次测试之间额外等待几分钟。
我们编写的控制回路将与 PID 控制器相同(如果需要,请参见第 1 部分复习),只是现在我们还想看看 LSTM 控制器会输出什么。我已经把它放在一个函数lstm(T1_m,Tsp_m)
中,但是我建议先把它直接放在代码中以便调试。T1_m
是 LSTM 模型传感器 1 的温度,我们将在每个时间点读取,而Tsp_m
是 LSTM 模型的设定点温度。让我们来看看我们用它做什么。
首先,计算误差,确保它与我们在第二部分中训练 LSTM 时计算的方法相同。
# Calculate error (necessary feature for LSTM input)
err = Tsp_m - T1_m
接下来,我们需要将现有的数据转换成 LSTM 所期望的格式,因此用与第 2 部分相同的方式将其放入一个数组中,对其进行缩放和整形。
# Format data for LSTM input
X = np.vstack((Tsp_m,err)).T
Xs = s_x.transform(X)
Xs = np.reshape(Xs, (1, Xs.shape[0], Xs.shape[1]))
现在我们有了输入数据,我们可以调用model.predict()
函数来获得加热器输出。回想一下,这是一个缩放值,对我们的实际加热器没有多大用处,所以我们取消了对真实值的缩放。
# Predict Q for controller and unscale
Q1c_s = model.predict(Xs)
Q1c = s_y.inverse_transform(Q1c_s)[0][0]
最后,正如我们在第 2 部分培训时注意到的,有时 LSTM 会预测有效[0,100]范围之外的值,因此我们将只限制可能的输出值。
# Ensure Q1c is between 0 and 100
Q1c = np.clip(Q1c,0.0,100.0)
我希望你能明白我为什么决定在安装之前测试和调试它!
当我们在控制回路中时,最后要做的一件事。回想一下,我们指定了一个特定的数据点窗口作为 LSTM 输入的历史。我们必须等到有了那个数量的数据点,才能向 LSTM 控制器输入任何东西。这是这个模拟器的一个潜在的缺点,也是为什么你想保持窗口适当低的一个原因。然而,在最初的窗口期过后,事情就一帆风顺了。下面是控制循环中的最终实现:
# Run LSTM model to get Q1 value for control
if i >= window:
# Load data for model
T1_m = T1[i-window:i]
Tsp_m = Tsp[i-window:i]
# Predict and store LSTM value for comparison
Qlstm[i] = lstm(T1_m,Tsp_m)
我还保存了一些控制器行为的快照,并把它们放入视频中。让我们看看它是如何工作的。
作者的情节
相当惊人!请记住,蓝线(PID)是真正控制加热器,绿色(LSTM)只是作为参考。它不完全匹配,我也不一定期望它匹配。LSTM 控制器看起来更倾向于降低加热器值,这可能会导致现实生活中的超调量增加。它通常也会有较低的输出,但由于高温往往更危险,我很高兴看到它更保守。总的来说,看起来我们已经编程正确,所以我相信 LSTM 运行加热器输出值来控制温度。让我们看看接下来会是什么样子。
用 LSTM 控制
现在,我们期待已久的!让我们把控制器交给 LSTM。这里真的没有什么新东西,但是为了完整起见,这里是我的代码看起来像使用 LSTM 来控制加热器输出,模拟 PID 控制器的行为。
# Run test
with tclab.TCLab() as lab:
# Find current T1, T2
print('Temperature 1: {0:0.2f} °C'.format(lab.T1))
print('Temperature 2: {0:0.2f} °C'.format(lab.T2)) start_time = time.time() for i in tqdm(range(loops)):
# Delay 1 second
if time.time() > prev_time + 1.0:
print('Exceeded cycle time: ',time.time()-prev_time-1.0)
else:
while time.time() < prev_time + 1.0:
pass # Record time
t = time.time()
tm[i] = t - start_time # Read temperature (C)
T1[i] = lab.T1 # Run LSTM model to get Q1 value for control
if i >= window:
# Load data for model
T1_m = T1[i-window:i]
Tsp_m = Tsp[i-window:i]
# Predict and store LSTM value for comparison
Qlstm[i] = lstm(T1_m,Tsp_m) # Write heater output (0-100)
lab.Q1(Qlstm[i])
我们表现如何?
作者的情节
哇哦。我不知道你怎么想,但这是令人兴奋的事情。我们成功地复制了具有 LSTM 神经网络的 PID 控制器的行为,并能够实时地将它用于全新的数据来控制温度。这就是机器学习如此令人兴奋的原因!
最后的想法
当然,你可能会注意到一些需要改进的地方。控制器在运行中期很难将温度一直提高到 70°c。我们总是可以调整 LSTM 模型中的超参数,并且拥有更多训练数据也无妨(还有什么其他想法可以提高 LSTM 控制器对 PID 控制器的保真度?).但是即使 LSTM 控制器与 PID 控制器不完全匹配,它仍然完成了模拟行为的目标,这本身就是令人兴奋的!
此时,你的老板还在疑惑“那又怎样?”如果 PID 控制器已经做了我们想要的事情,这又有什么意义呢?这就是我们接下来要做的,所以请留下来进行一些更刺激的探索吧!像往常一样,在这里随意跟随代码,希望在您自己的 TCLab 上,您可以在您的办公桌上运行!
模拟具有长短期记忆的 PID 控制器:第 4 部分
用 LSTM 控制器代替 PID 控制器进行温度控制的实际应用
照片由 Unsplash 上的 Tasos Mansour 拍摄
这是这个有趣项目的最后一部分!在这里,我们将看到使用 LSTM 来仿真 PID 控制器的一些实际应用,以及一些潜在的缺点。如果您还没有阅读本系列的前几篇文章,我强烈建议您回去看看,这样您就可以有一些背景知识了。当然,这个项目的巧妙之处在于,你可以在自己的温度控制实验室设备上运行所有的代码,模拟你可能在真正的炼油厂或化工厂看到的东西。因此,这里有一个快速回顾这一系列,然后我们将开始!
- 使用温度控制实验室创建比例积分微分控制器数据
- 在 Keras 中训练长短期记忆神经网络,以模拟 PID 控制器
- 用 LSTM 控制温控实验室
- 用 LSTM 控制器代替 PID 控制器进行温度控制的实际应用(本文)
改变 PID 调节参数
如果您熟悉 PID 控制器,在问题设置期间,您可能想知道的第一件事是,如果您更改调整参数,会发生什么情况?回想一下 PID 控制器方程:
如果我们改变 K_c、τ_I 或τ_D,加热器输出也会改变,然后我们训练的 LSTM 不再与输出匹配。人们可能会认为这是一个巨大的缺点——如果我们改变 PID 控制器的调整参数,我们将不得不重新训练 LSTM 来模拟新的行为(回到第 2 部分)。另一方面,我们可以利用这一点。一旦 PID 控制器被调整到一个系统,我们很少需要改变调整参数,因此 PID 行为的改变可能表明来自外部的恶意攻击(或潜在的内部攻击,如不满的员工)。
突然,我们有了一个现成的异常检测方法。我们可以像在第 3 部分中所做的那样进行检查,在那里我们运行 PID 之外的控制器,但是也检查 LSTM 输出以确保它们是相似的。如果不是,那么我们知道有什么东西使 PID 控制器出了问题,我们可以调查并修复它。
让我们来看看我们的设置,现在应该很熟悉了,但是有一些变化:
#### Set up run ##### Import model and model parameters
model = load_model('pid_emulate.h5')
model_params = pickle.load(open('model_params.pkl', 'rb'))s_x = model_params['Xscale']
s_y = model_params['yscale']
window = model_params['window']# Run time in minutes
run_time = 45.0# Number of cycles
loops = int(60.0*run_time)# arrays for storing data
T1 = np.zeros(loops) # measured T (degC)
Qpid = np.zeros(loops) # Heater values for PID controller
Qlstm = np.zeros(loops) # Heater values for LSTM controller
tm = np.zeros(loops) # Time
t_pid = np.zeros(loops) # Time to compute PID controller output
t_lstm = np.zeros(loops) # Time to compute LSTM controller output
Q2 = np.zeros(loops)# Time range to introduce anomaly (turn on heater 2, change PID tuning constants)
start_anom = int(0.7*loops)# Heater 2 turned on during anomaly window
Q2[start_anom:] = 80# Temperature set point (degC)
with tclab.TCLab() as lab:
Tsp = np.ones(loops) * lab.T1# vary temperature setpoint
end = window + 15 # leave 1st window + 15 seconds of temp set point as room temp
while end <= start_anom:
start = end
# keep new temp set point value for anywhere from 4 to 10 min
end += random.randint(240,600)
Tsp[start:end] = random.randint(30,70)
while end <= loops:
start = end
# keep new temp set point value for anywhere from 4 to 10 min
end += random.randint(240,600)
Tsp[start:end] = random.randint(30,50)
像往常一样,我们导入我们的模型和附带的参数,设置运行时间,启动数组来存储数据,并创建一个设定点配置文件。还有几件事需要指出。我们有t_pid
和t_lstm
,稍后我们将使用它们来为控制器计时。我们有start_anom
变量,我用它来表示数据的异常部分应该何时开始。注意,我还为 heater 2 ( Q2
)设置了一个数组,稍后我们将使用它进行另一个测试。最后,在数据的异常部分,我将加热器的设定点保持在稍低的位置——它将在较高的温度下工作,但当温度保持较低时更容易看到。
我还对pid(sp,pv,pv_last,ierr,dt)
函数进行了修改,因此它现在将调谐“常数”作为附加输入(Kc,tauI,tauD)
。这将让我们在运行中途改变 PID 控制器输出。
最后,下面是我们运行模拟时的代码:
# Run test
with tclab.TCLab() as lab:
# Find current T1, T2
print('Temperature 1: {0:0.2f} °C'.format(lab.T1))
print('Temperature 2: {0:0.2f} °C'.format(lab.T2)) # Integral error
ierr = 0.0
# Integral absolute error
iae = 0.0 start_time = time.time()
prev_time = start_time for i in tqdm(range(loops)):
# Delay 1 second
if time.time() > prev_time + 1.0:
print('Exceeded cycle time')
else:
while time.time() < prev_time + 1.0:
pass
# Record time and change in time
t = time.time()
dt = t - prev_time
prev_time = t
tm[i] = t - start_time # Read temperature (C)
T1[i] = lab.T1 # Integral absolute error
iae += np.abs(Tsp[i]-T1[i]) # Perturb PID tuning parameter
if i > start_anom:
Kc, tauI, tauD = 3.0*Kc0, 0.5*tauI0, tauD0 + 2.0
else:
Kc, tauI, tauD = Kc0, tauI0, tauD0
# Calculate PID output (and time)
t0_pid = time.time()
[Qpid[i],P,ierr,D] = pid(Tsp[i],T1[i],T1[i-1],ierr,dt,
Kc=Kc,tauI=tauI,tauD=tauD)
tf_pid = time.time() # Write heater output (0-100)
lab.Q1(Qpid[i])
# Run LSTM model to get Q1 value for control
if i >= window:
# Load data for model
T1_m = T1[i-window:i]
Tsp_m = Tsp[i-window:i]
# Predict and store LSTM value for comparison
t0_lstm = time.time()
Qlstm[i] = lstm(T1_m,Tsp_m)
tf_lstm = time.time()
# Save controller times
t_pid[i] = tf_pid - t0_pid
t_lstm[i] = tf_lstm - t0_lstm
里面有很多,但从第三部看起来应该很熟悉。主要区别是当我们的时间计数超过我们的start_anom
规格时,我们改变 PID 调节参数的行:Kc, tauI, tauD = 3.0*Kc0, 0.5*tauI0, tauD0 + 2.0
。您还会注意到这里有一些时间记录,我们将在下一节中讨论。
运行后,我们可以绘制结果,并将其放入视频中进行可视化。让我们看看发生了什么!
正如我们在第 3 部分中看到的,LSTM 输出非常类似于 PID 输出,在瞬态时间范围内有明显的例外。正如所料,当 PID 调节参数改变时,这种情况会突然改变。你会注意到,由于 PID 控制器是实际写入输出的控制器,加热器输出也开始变得不稳定,温度开始波动得更大。
我们可以很容易地绘制出Qpid
和Qlstm
之间的误差,并使用它来检测异常行为。这种情况下有备份也很方便;如果我们注意到 PID 控制器开始表现异常,我们可以迅速将控制切换到 LSTM 控制器,只需将lab.Q1(Qpid[i])
改为lab.Q1(Qlstm[i])
。非常巧妙的是,最初可能被认为是缺点的东西实际上变得非常有用!
计算时间
如果你还记得,我们开始这个项目的主要原因是来自一篇论文讨论使用神经网络来模拟模型预测控制器,其想法是神经网络将比控制器更快。从上次我们计算 LSTM 和 PID 控制器的运行中,我们方便地节省了每个控制器所花费的时间。让我们看看结果如何:
print('LSTM:',t_lstm.mean())
print('PID:',t_pid.mean())>>> LSTM: 0.03118442685515792
PID: 2.043927157366717e-05
老实说,这正是我所期望的。PID 实际上比 LSTM 快得多,尽管 LSTM 控制器的计算时间仍不到 1 秒。使用 PID 控制器是有原因的,那是因为它们速度快,在解决一些控制问题时表现得相当好。但是,如果你有一个更复杂的控制器,假设模型输入和参数是相似的,我们可能期望 LSTM 控制器每次计算只需要几分之一秒。因此,虽然它实际上比 PID 控制器有时间上的优势,但仍然有一些用途(请查看 2020 年 11 月的一篇关于更复杂的控制器以及 LSTM 控制器在这种情况下如何有优势的额外文章)。
使用加热器 2 模拟额外的异常
最后,让我们再来看看如何使用 LSTM 控制器来检测其他类型的异常。我们将模拟炼油厂的环境条件不再标准的情况。也许这是良性的,如不同的天气,或者是恶意的,如针对工厂另一部分的网络攻击(甚至是这个特定的过程)。控制器的行为会有什么不同?
让我们通过打开加热器 2 一部分时间来模拟这一异常事件。虽然加热器 2 与加热器 1 上的传感器在物理上是分开的,但它仍然足够近,足以影响我们试图控制的加热器 1 周围的条件。我们的 LSTM 控制器是根据在标准室温下运行的一组特定数据进行训练的,所以如果我们打开加热器 2,就会出现 LSTM 控制器没有被训练来控制的情况。类似于改变 PID 调节参数的情况,这最初看起来像是使用 LSTM 控制器的失败。然而,如果我们的工厂有一个精心控制的周围环境,那么我们希望控制器表现一致;任何偏离都表明有异常情况发生。
这里看一下运行的代码(回想一下,我们已经在初始设置中指定了Q2
参数)。
# Run test
with tclab.TCLab() as lab:
# Find current T1, T2
print('Temperature 1: {0:0.2f} °C'.format(lab.T1))
print('Temperature 2: {0:0.2f} °C'.format(lab.T2)) start_time = time.time()
t = start_time for i in tqdm(range(loops)):
# Delay 1 second
if time.time() > t + 1.0:
print('Exceeded cycle time by ',time.time()-t-1.0)
else:
while time.time() < t + 1.0:
pass # Record time and change in time
t = time.time()
tm[i] = t - start_time # Read temperature (C)
T1[i] = lab.T1 # Run LSTM model to get Q1 value for control
if i >= window:
# Load data for model
T1_m = T1[i-window:i]
Tsp_m = Tsp[i-window:i]
# Timer for LSTM controller output
t0_lstm = time.time()
# Predict and store LSTM value for comparison
Qlstm[i] = lstm(T1_m,Tsp_m)
tf_lstm = time.time() # Write heater output (0-100)
lab.Q1(Qlstm[i])
lab.Q2(Q2[i])
这一切现在看起来可能都很熟悉,只有最后两行是明显的例外:我们已经将控制权交给了 LSTM,并且我们还在中读取了 Q2 值。运行模拟后,我们可以再次绘制结果,并将其放入动画中。
很有意思。请注意,一旦我们打开 Q2,温度往往会超过设定值,控制器无法正确解释这种超调。这是因为控制器没有被训练去考虑来自附近加热器的额外热量。
这让我有了一个想法,但我想我会让你尝试一下,现在你知道如何设置 TCLab,训练一个 LSTM,并用它运行温度控制模拟。你能利用从本系列中学到的技巧来设置一个控制系统,打开两个加热器,并试图将两个温度控制在某个设定值吗?这将是多输入多输出(MIMO)控制器。为了找到正确的方向,请访问位于 APMonitor.com 的 MIMO 实验室。
最后的想法
这使我们得出了这个项目的结论。我们从一个基本的 PID 控制器开始,生成一些数据,使用这些数据训练一个自动 LSTM 来模拟 PID 控制器,将控制交给 LSTM,然后查看一些有用的应用,例如检测各种异常和潜在的计算时间节省。
你表现如何?你像我一样对这个项目感到兴奋吗?你还能想到这方面的其他应用吗?我很高兴听到对需要更多澄清的领域的建议。感谢您关注这个项目,我期待着未来的互动。如果你喜欢这个,请随时在 LinkedIn 上与我联系。
闪电强化学习
用 PyTorch 闪电建造 DQN
本文着眼于将 PyTorch Lightning 用于强化学习(RL)这一激动人心的领域。在这里,我们将使用经典的 CartPole gym 环境来构建一个标准的深度 Q 网络(DQN)模型,以说明如何开始使用 Lightning 来构建您的 RL 模型。
在本文中,我们将涵盖:
- 什么是闪电,为什么我们要在 RL 中使用它
- 标准 DQN 模型概述
- 利用闪电建造 DQN 的步骤
- 结果和结论
如果你想直接跳到代码,你可以在 PyTorch Lightning 示例页面中找到示例,或者点击下面的 colab 图标查看交互式 colab 笔记本!
闪电是什么?
Lightning 是一个最新的 PyTorch 库,它干净地抽象和自动化了 ML 模型中所有的日常样板代码,允许您关注实际的 ML 部分(有趣的部分!) .如果你还没有看过,我强烈推荐你看看闪电团队发表的一些很棒的文章
[## 从 PyTorch 到 py torch Lightning——一个温和的介绍
这篇文章对使用 PyTorch 和 PyTorch Lightning 实现的 MNIST 进行了对比。
towardsdatascience.com](/from-pytorch-to-pytorch-lightning-a-gentle-introduction-b371b7caaf09)
除了自动化样板代码之外,Lightning 还充当了一种风格指南,用于构建干净且可重复的 ML 系统。
这很有吸引力,原因如下:
- 通过抽象出样板工程代码,识别和理解 ML 代码就容易多了。
- Lightning 的统一结构使得构建和理解现有项目变得容易。
- Lightning 自动化的代码是由经过全面测试、定期维护并遵循 ML 最佳实践的高质量代码构建的。
DQN
在我们进入代码之前,让我们快速回顾一下 DQN 是做什么的。DQN 通过学习在特定状态下采取每个行动的价值来学习给定环境下的最佳策略。这些被称为 Q 值。
最初,代理对其环境的了解非常差,因为它没有太多的经验。因此,它的 Q 值将非常不准确。然而,随着时间的推移,代理探索它的环境,它学习更准确的 Q 值,然后可以做出好的决定。这允许它进一步改进,直到它最终收敛于一个最优策略(理想情况下)。
我们感兴趣的大多数环境,如现代视频游戏和模拟,都太复杂和太大,无法存储每个状态/动作对的值。这就是为什么我们使用深度神经网络来近似这些值。
代理的一般生命周期描述如下:
- 代理获取环境的当前状态,并通过网络传递它。然后,网络输出给定状态下每个动作的 Q 值。
- 接下来,我们决定是使用我们的代理认为网络给出的最佳动作,还是采取随机动作来探索更多。
- 动作被传递给环境,我们得到反馈,告诉代理它处于下一个状态,在前一个状态中采取前一个动作的奖励,以及情节是否在该步骤结束
- 我们以元组(状态、动作、奖励、下一个状态、完成)的形式获取在最后一步中获得的经验,并将其存储在代理存储器中。
- 最后,我们从代理人的记忆中抽取一小批重放体验的样本,并使用这些过去的体验来计算代理人的损失
这是对 DQN 所做工作的高度概括。要了解更多信息,有很多关于这个流行模型的免费资源,比如 PyTorch 示例。如果你想了解更多关于强化学习的一般知识,我强烈推荐马克西姆·拉潘的最新著作深度强化学习手把手第二版
点亮 DQN
启蒙时代是一场知识和哲学运动,主导了思想世界
让我们来看看组成 DQN 的各个部分
**模型:**用来近似我们的 Q 值的神经网络
**重放缓冲区:**这是我们代理的内存,用于存储以前的经历
**代理:**代理本身与环境和重放缓冲区进行交互
**闪电模块:**处理代理的所有培训
模型
对于这个例子,我们可以使用一个非常简单的多层感知器(MLP)。所有这一切意味着,我们没有使用任何像卷积或递归层,只是正常的线性层花式。这样做的原因是由于 CartPole 环境的简单性,任何比这更复杂的都是多余的。
重放缓冲器
重放缓冲区相当简单。我们需要的只是某种类型的数据结构来存储元组。我们需要能够对这些元组进行采样,并添加新的元组。这个缓冲区基于 Lapins replay buffer 在这里找到,因为它是我迄今为止发现的最干净和最快的实现。看起来像这样
但是我们还没完。如果您以前使用过 Lightning,那么您会知道它的结构是基于这样一种思想:创建数据加载器,然后在后台使用它将小批量数据传递给每个训练步骤。对于大多数 ML 系统(如监督模型)来说,这是如何工作的是非常清楚的,但是当我们正在生成数据集时,它是如何工作的呢?
我们需要创建自己的 IterableDataset,它使用不断更新的重放缓冲区来采样以前的体验。然后,我们将小批经验传递给 training_step,用于计算我们的损失,就像任何其他模型一样。除了不包含输入和标签,我们的迷你批处理包含(状态、动作、奖励、下一个状态、完成)
您可以看到,在创建数据集时,我们传入 ReplayBuffer,然后可以对其进行采样,以允许数据加载器将批处理传递给 Lightning 模块。
代理人
代理类将处理与环境的交互。代理主要执行 3 种方法
get_action: 使用传递的ε值,代理决定是使用随机动作,还是采取网络输出中 Q 值最高的动作。
play_step: 在这里,代理通过从 get action 中选择的动作在环境中执行单个步骤。在从环境获得反馈之后,体验被存储在重放缓冲器中。如果环境完成了该步骤,环境将重置。最后,返回当前奖励和完成标志。
**重置:**重置环境并更新存储在代理中的当前状态。
闪电模块
现在,我们已经为 DQN 设置了核心课程,我们可以开始考虑培训 DQN 代理了。这就是闪电出现的地方。我们将通过构建一个 Lightning 模块,以一种清晰、结构化的方式设计我们所有的培训逻辑。
Lightning 提供了许多钩子和可覆盖的函数,允许最大的灵活性,但是我们必须实现 4 个关键方法来使我们的项目运行。那就是下面的。
- 向前()
- 配置优化器
- train_dataloader
- 训练 _ 步骤
有了这 4 个方法,我们可以很好地训练我们将遇到的任何 ML 模型。除了这些方法之外,任何需要的东西都可以很好地适应 Lightning 中剩余的钩子和回调。要获得这些可用钩子的完整列表,请查看 Lightning 文档。现在,让我们看看填充我们的闪电方法。
初始化
首先,我们需要初始化我们的环境、网络、代理和重放缓冲区。我们还调用了 populate 函数,它首先会用随机体验填充重放缓冲区(populate 函数在下面的完整代码示例中显示)。
向前
我们在这里所做的是包装我们的主要 DQN 网络的转发功能。
失败
在我们开始训练代理之前,我们需要定义我们的损失函数。这里使用的损失函数基于 Lapan 的实现,可以在这里找到。
这是将我们的 DQN 网络的当前状态动作值与下一个状态的预期状态动作值进行比较的简单均方误差(MSE)损失。在 RL 我们没有完美的标签可以借鉴。相反,代理从目标值中学习它期望下一个状态的值是什么。
然而,通过使用相同的网络来预测当前状态的值和下一个状态的值,结果变成了不稳定的移动目标。为了解决这个问题,我们使用一个目标网络。该网络是主网络的副本,并定期与主网络同步。这提供了一个暂时固定的目标,以允许代理计算更稳定的损失函数。
如您所见,状态动作值是使用主网络计算的,而下一个状态值(相当于我们的目标/标签)使用目标网络。
配置优化器的
这是另一个简单的附加功能,只需告诉 Lightning 在 backprop 期间将使用什么优化器。我们将使用标准的 Adam 优化器。
列车数据加载器
接下来,我们需要向 Lightning 提供我们的训练数据加载器。如您所料,我们初始化了之前创建的 IterableDataset。然后像往常一样将它传递给数据加载器。Lightning 将在训练期间提供批次,并将这些批次转换为 PyTorch 张量,并将其移动到正确的设备。
训练步骤
最后,我们有培训步骤。在这里,我们放入了每个训练迭代要执行的所有逻辑。
在每次训练迭代中,我们希望代理通过调用前面定义的 agent.play_step()并传入当前设备和 epsilon 值来遍历环境。这将返回该步骤的奖励以及该集是否在该步骤结束。我们将阶梯奖励添加到总剧集中,以便跟踪该代理在该剧集中的成功程度。
接下来,使用闪电提供的当前迷你批,我们计算我们的损失。
如果我们已经到达一集的结尾,由 done 标志表示,我们将使用剧集奖励更新当前的 total_reward 变量。
在该步骤结束时,我们检查是否到了同步主网络和目标网络的时间。通常使用软更新,其中仅更新一部分权重,但是对于这个简单的例子,进行完全更新就足够了。
最后,我们需要返回一个包含 Lightning 将用于反向传播的损失的字典,一个包含我们想要记录的值的字典(注意:这些必须是张量)和另一个包含我们想要在进度条上显示的任何值的字典。
差不多就是这样了!我们现在有了经营 DQN 代理商所需的一切。
运行代理
现在剩下要做的就是初始化并适应我们的 Lightning 模型。在我们的主 python 文件中,我们将设置种子,并提供一个 arg 解析器,其中包含我们希望传递给模型的任何必要的超参数。
然后在我们的 main 方法中,我们用我们指定的参数初始化 DQNLightning 模型。接下来是闪电训练器的设置。
这里我们设置训练器使用 GPU。如果您无法访问 GPU,请从 Trainer 中删除“GPU”和“distributed_backend”参数。这个模型训练非常快,即使使用 CPU,所以为了看到闪电在行动中,我们将关闭早期停止。
最后,因为我们使用的是 IterableDataset,所以需要指定 val_check_interval。通常,此间隔是根据数据集的长度自动设置的。但是,IterableDatasets 没有 len 函数。因此,我们需要自己设置这个值,即使我们没有执行验证步骤。
最后一步是在我们的模型上调用 trainer.fit()并观察它训练。下面你可以看到完整的闪电代码
结果
大约 1200 步后,您应该看到代理的总奖励达到最高分 200。为了看到被绘制的奖励度量,旋转 tensorboards。
tensorboard --logdir lightning_logs
在左边你可以看到每一步的回报。由于环境的性质,这将始终是 1,因为代理人获得+1 的每一步,杆没有下降(这是他们所有的)。在右边,我们可以看到每集的总奖励。代理人很快达到最大回报,然后在很棒的剧集和不太棒的剧集之间波动。
结论
现在,您已经看到了在强化学习项目中利用 PyTorch Lightning 的力量是多么简单和实用。
这是一个非常简单的例子,只是为了说明闪电在 RL 中的使用,所以这里有很大的改进空间。如果你想把这段代码作为模板,试着实现你自己的代理,这里有一些我会尝试的东西。
- 降低学习率,或者更好的是,通过在 configure_optimizer 方法中初始化学习率调度器来使用它。
- 提高目标网络的同步速率,或者使用软更新而不是完全更新
- 在更多步骤的过程中使用更平缓的ε衰减。
- 通过在训练器中设置 max_epochs 来增加训练次数。
- 除了在 tensorboard 日志中跟踪总奖励外,还可以跟踪平均总奖励。
- 使用 test/val Lightning hook 添加测试和验证步骤
- 最后,尝试一些更复杂的模型和环境
我希望这篇文章是有帮助的,将有助于启动您自己的项目与闪电。编码快乐!
在零售银行中实现数据和人工智能:客户分析
客户分析路线图,利用数据驱动的用例来增强客户个性化&体验
在当今互联的数字世界中,银行和金融服务提供商面临着满足并超越客户期望的挑战。金融机构必须专注于与客户互动,以保持竞争力和相关性。数据科学解决方案帮助金融机构实现数字化转型,重新定义客户关系。客户洞察提供关于客户的深刻知识,以优化与客户的每次互动。
客户往往会更快地对个性化和实时服务做出响应,这是一个重要的因素,为那些采用传统供应商的数据和人工智能驱动能力的银行带来了差异化优势,这些供应商往往会适应更好的个人偏好,甚至利用拥有高度客户信任和理解的金融中介。这类玩家吸引消费者的部分原因是他们能够为活跃客户群中的某些部分定制产品。
银行业采用数据科学的水平仍然很低
由于不断变化的客户行为、激烈的竞争、更严格的法规和数字差异,银行在保持盈利能力方面面临着诸多挑战
在人工智能时代采用新的银行模式
Wipro 在进行的一项调查显示,人工智能为何是银行业的未来,因为它为客户体验、欺诈管理和运营带来了先进的数据分析能力。人工智能算法在几秒钟内完成反洗钱活动,否则需要几个小时甚至几天。人工智能还使银行能够以创纪录的速度管理海量数据,从中获得有价值的见解。人工智能机器人、数字支付顾问和生物识别欺诈检测机制等功能可以为更广泛的客户群提供更高质量的服务。所有这些都转化为收入增加、成本降低和利润增加。
AI 正在通过以下方式加强银行在客户个性化领域的竞争力:
增强的客户体验:基于过去的互动,人工智能对客户及其行为有了更好的理解。这使得银行能够通过添加个性化功能和直观的交互来定制金融产品和服务,以提供有意义的客户参与并与其客户建立牢固的关系。
**预测客户行为和反应:**人工智能通过分析过去的行为来预测未来的情景,帮助银行预测未来的结果和趋势。这有助于银行识别欺诈、检测反洗钱模式并向客户提出建议。同样,人工智能能够在海量数据中检测可疑的数据模式,以进行欺诈管理。此外,通过其关键的推荐引擎,AI 研究过去以预测数据点的未来行为,这有助于银行成功地进行追加销售和交叉销售。
有效的决策:像人类专家一样思考和反应的认知系统,根据可用数据实时提供最佳解决方案。这些系统在其称为知识库的数据库中保存了专家信息。银行家利用这些认知系统做出战略决策。
人工智能技术释放银行业数据的力量
传统的金融服务商业模式正处于显微镜下。对于许多金融机构来说,在当今的低利率环境下,持续盈利是一个挑战。来自新市场进入者的竞争也产生了新的破坏层,而客户体验和参与度却跟不上精通数字技术的消费者不断增长的期望。
许多金融机构已经采取了裁员和战术性成本削减措施。然而,可持续的绩效需要战略的转变——一种由新技术增强的战略。
数字时代的成功要求银行挖掘他们已经拥有的大量隐藏财富:数据。认知系统和人工智能技术可以帮助银行释放数据的力量,揭示关于企业、客户和竞争对手的见解。认知系统不断地构建知识和学习,理解自然语言,比传统的可编程系统更自然地与人类进行推理和交互。
客户 360:了解客户 DNA
全方位了解客户活动的各个方面以及与银行的合作将有助于实现全面的方法。下图提供了一些应该纳入的关键数据域。
数据集市构建 360 度客户分析视图来源:Shamli Prakash
以可扩展、分阶段的方式构建这一客户 360°数据集市是许多客户分析用例的基础,如倾向建模、交叉销售/追加销售建议、客户终身价值等。customer 360 方法整合了所有客户数据领域,包括人口统计信息、交易数据、产品所有权、客户互动、客户服务、活动响应、定价和宏观经济数据。
特征工程是使用数据的领域知识来创建使机器学习算法工作的特征的过程。它在定义和创建捕捉客户行为的数据元素方面起着关键作用。为此,额外的特征被创建为这些数据域的组合(例如,滚动月平均值、虚拟变量等)。)
IBM 数据和人工智能路线图——客户分析阶梯
银行意识到,在当今市场中保持竞争力的关键步骤之一是通过与客户建立高质量、个性化的关系来提高参与度。
这个想法是分析客户体验,并根据客户的兴趣和偏好进行个性化。人工智能在理解客户行为模式方面取得了重大进展,将客户个性化带到了一个全新的水平。
数据科学家还可以建立模型,研究客户的行为,发现客户需要财务建议的情况。预测分析工具和高级数字交付选项的结合有助于完成这项复杂的任务,在最合适的时间引导客户找到最佳的金融解决方案,并根据消费习惯、社会人口趋势、相关需求和其他偏好建议个性化的产品。
客户分析之旅-个性化策略
在下一节中,概述了在整个成熟生命周期中利用数据分析的结构化客户互动之旅,从使用动态细分技术了解客户行为的基础开始,到在整个生命周期中跟踪客户,并通过个性化的活动和促销奖励他。
a .了解你的客户:行为细分
客户细分是根据共同特征将客户分成不同群体的过程,这样公司就可以有效而恰当地向每个群体进行营销。细分(如行为细分)或特定特征(如人口统计)有不同的变化。
客户细分旨在改善客户服务,提高客户忠诚度,留住客户,这对银行业来说非常必要。
市场细分使得营销人员能够通过了解同质特征来更有效地定制他们的营销工作,以锁定目标客户。这些工作可能涉及到沟通和产品开发。具体来说,细分有助于零售银行:
- 客户特征分析,以便我们能够专注于最高价值、最活跃、最懂数字的客户。
- 创建并传达有针对性的营销信息,这些信息将引起特定客户群体的共鸣,但不会引起其他人的共鸣(相反,其他人将收到根据他们的需求和兴趣定制的信息)。
- 根据细分市场选择最佳沟通渠道,可能是电子邮件、社交媒体帖子、广播广告或其他方式。
- 确定改进产品或新产品或服务机会的方法。
- 通过剖析见解建立更好的客户关系。
- 改善客户服务,根据细分结果提供个性化服务和产品。
- 追加销售和交叉销售其他产品和服务。
行为细分解决方案-统计聚类
b .确定你的客户:目标产品营销
的关键是提供适合特定客户需求和偏好的个性化服务。数据分析使我们能够创建个性化营销,在正确的时间通过正确的设备向正确的人提供正确的产品。数据挖掘广泛用于目标选择,以识别新产品的潜在客户。
数据科学家利用行为、人口统计、历史交易和产品所有权数据来构建倾向模型,预测客户对促销或优惠做出反应的概率。因此,银行可以进行高效、个性化的拓展,改善与客户的关系。
目标营销的模型评估比较:倾向建模来源:IBM
c .吸引客户:交叉销售/追加销售模式
交叉销售或追加销售模型是二进制概率算法,用于识别那些最有可能对报价做出反应的客户,或专注于保留活动的客户。基于现有的统计客户细分,可以在同类细分中开发倾向模型,以测量对特定产品活动(例如新的信用卡活动)的反应倾向
该模型可以应用于特定的客户群,并且客户可以利用输出以及活动资格标准来导出新的定制活动策略。倾向模型的主要优势在于,考虑到营销活动和采购成本,它们可以洞察更合适的客户群,并提高相对于基线随机目标的产品转化率(提升)
来自目标交叉销售分析的增量收入来源:IBM
d .让客户满意:下一个最佳行动
客户优惠亲和力(也称为下一个最佳行动)是一种预测分析形式,有助于营销人员及其组织更好地判断客户产品亲和力和交易行为,并引导营销工作与客户建立联系以达成交易。
当公司利用实时营销工具时,次佳报价是最成功的。公司需要了解最新的客户行为、需求和趋势,以便将“最佳”放在下一个最佳报价中。下一个最好的提议是“为客户增加最多价值的提议——以他们整体预期的客户终身价值的增加来衡量。”
由次优产品战略推动的营销活动来源:IBM
在当今互联的数字世界中,银行和金融服务提供商面临着满足并超越客户期望的挑战。金融机构必须专注于与客户互动,以保持竞争力。
e .关注你的客户:留住客户
当客户结束与企业的关系时,客户流失是决定企业收入的最基本因素之一。我们需要知道你的哪些客户是忠诚的,哪些客户有流失的风险,你需要从客户的角度了解影响这些决策的因素。留住最赚钱的客户可能是企业的最佳策略之一。
虽然保留现有客户并因此增加他们的终身价值是每个人都承认的重要事情,但当银行一开始没有看到客户流失时,他们对客户流失几乎无能为力。这就是在正确的时间预测客户流失变得重要的地方,尤其是当没有明确的客户反馈时。早期和准确的客户流失预测使 CRM 和客户体验团队在与客户接触时更具创造性和主动性。
下面的 SPSS Modeler 界面解释了如何建立一个机器学习模型,并使用它来预测客户是否有流失的风险。这是一个完整的数据科学项目,您可以将您的模型发现用于以后的规范性分析或有针对性的营销。
使用 SPSS Modeler Flow 的客户流失预测模型
提取有意义的预测洞察的关键是尽可能准确地定义问题陈述构建块。在客户流失的情况下,首先要定义什么被认为是“流失事件”。
一般来说,客户流失是指在给定时间内观察到的客户不活跃或不参与的程度。这在数据中以各种形式表现出来,例如账户行为的新近性或账户余额的变化。例如,在 HNW(高净值)客户的情况下,根据特定时期的资产下降率来定义客户流失是有用的。
可能有这样一种情况,客户在账户操作方面可能非常活跃,但在过去六个月中实际上已经提取了超过 50%的资产。
识别流失事件关键模型导向的流失倾向仪表板
确定客户流失是在产品层面(客户可能会放弃某一特定产品,如停止使用信用卡)还是在关系层面(客户可能会放弃银行本身)进行定义是至关重要的。当在关系级别分析数据时,您可以更好地理解客户的观点。例如,从一个人的储蓄账户中提取过多的钱可能是购买房子的首付或支付大学学费。这种对客户生活事件的洞察非常有力,不仅可以防止客户流失,还可以交叉销售补充产品,从而进一步加强关系。
f .跟随你的客户:生活事件预测
金融服务提供商可以利用客户数据,包括人口统计、行为和营销数据,以及细粒度的交易数据,来预测例如四种不同的客户生活事件:搬迁、Sudies、婚姻、孩子出生、新关系和关系结束。
结果表明,衍生的客户生活事件模型对生活事件的预测明显优于随机猜测,尤其是在结合细粒度交易和聚合数据的情况下。与基于生活事件预测和分类的模型相比,纳入定义明确的交易数据的新近性、频率和货币(RFM)价值信息也显著提高了性能。
生活事件预测分析仪表板来源:IBM 数据科学精英
g .重视你的客户:终生价值
客户终身价值 e (CLTV)是“客户产生的未来利润的贴现值”,然而,许多 CLTV 模型的重点是在收入方面。这是因为收入比成本更难预测,所以更需要一个模型来预测它(并且知道一个客户将产生的收入可以告知你在该客户身上的花费)。这些类型的模型通常被称为“客户资产模型”。
CLTV 可以分解成不同的顾客价值组成部分
。在这个框架中,CLTV 模型通常限制了表征客户行为的三个潜在(未观察到的)参数:
- 寿命:客户与公司保持关系的时期
- **购买率:**该参数对应于客户在给定时间内的购买次数
- **货币价值:**模型的这一部分涉及为每个未来交易分配一个货币单位
在非合同环境中,这些参数是不可观察的。概率模型将帮助我们在客户层面约束这些参数,并对未来的购买和价值做出推断。
h .奖励你的客户:活动&忠诚度分析
事实是,分析一直是银行忠诚度和奖励计划战略的重要组成部分,银行可以为每个客户建立档案计划,确定哪些客户是有利可图的,了解哪些激励方法最有可能对每个客户成功,然后量身定制相关计划。
文章称,建立在“智能和反应灵敏的技术平台”上的忠诚度和回报分析为银行提供了 360 度的客户视图,提供了见解,使他们能够不断微调这些计划,使它们更具相关性,对特定客户更具吸引力。
活动分析利用 Unica 环境中的交叉销售倾向模型来源:IBM
通过使用分析在正确的地点和时间生成所有必要的洞察,银行可以创建符合其客户群多样性和特征的奖励计划。
然而,银行要做的不仅仅是为客户选择正确的内容和奖励,它还必须确保这些客户无论何时、何地、通过他们选择的任何设备参与和进行交易。参与的关键是定期和定制的客户沟通,这可以带来更成功和更有利可图的关系。
更精确的细分,提供个人优惠,并通过高级营销分析创建有针对性的电子邮件活动。这加快了上市时间,提高了响应率,并提高了营销支出的回报。
沃森银行客户分析
IBM Watson Customer Insight for Banking使用结合预测和认知能力的高级预建行业特定分析模型。该解决方案支持动态行为细分,以发现可操作的客户洞察,使银行能够创建个性化的销售产品和营销活动。该解决方案提供了直观的用户界面和专为业务线用户设计的特定于角色的控制面板。
沃森客户洞察使银行能够通过客户分析更好地洞察客户需求来源:IBM
- 基于客户行为的动态细分
- 通过根据每个客户的行为确定他们的参与度,确定购买或交叉销售/追加销售的倾向。
- 预测客户生活事件:为您的客户预测潜在的生活事件,以提供主动的个性化体验
- 通过预测流失风险,提高留住利润最高的客户的能力。
- 识别高利润客户,以留住、营销和开发新产品。
**IBM Acoustic Analytics(前身为沃森 CX 分析公司)**根据对各接触点客户的洞察,帮助您做出更明智、更快速的营销和客户体验决策。声学旅程分析让您能够可视化您的客户通过设备、渠道和接触点与您的品牌互动的旅程。
Journey Analytics 提供了各个层面的见解,从公司范围的汇总一直到单个用户的体验。它有助于您从整体上了解客户旅程,而不必使用单独的工具来检查渠道和会话数据。您从分析中获得的知识可以帮助您改善业务成果,推动转化,并提供一致和令人满意的客户体验。
Journey Analytics 中基于角色的仪表板可以轻松直观地识别重要趋势,然后更深入地挖掘客户行为的原因。您还可以确定客户的问题所在,然后重放单个客户会议,以了解问题的确切根源。
IBM Watson 客户体验分析仪表板来源:IBM
免责声明: 此处表达的部分观点仅代表本文作者的观点,不一定代表 IBM 公司的观点。博客上的部分内容是版权所有,除非在 IBM Corporation 下另有说明,否则保留所有权利。
支持各种类型的医疗保健数据来构建 10 大 DL 应用
探索医疗保健中的 7 种数据类型、深度学习技术和顶级应用,以应用深度学习
尽管医疗保健行业价值**【1】8 万亿美元,但只有 20%的人能够获得高质量的医疗保健。世界人口正在老龄化。迫切需要基于价值的医疗保健[2]。医疗保健行业正朝着数据驱动的方式发展。如今,个人健康和人口医疗保健数据的数量正在快速增长。医疗保健行业存在资源和准入限制。一方面,病理学家、放射科医生和其他临床医生短缺,另一方面,手术和疾病(如癌症)的数量在增加。解决这个问题的唯一方法是通过技术。**
在这篇文章中,重点是:
有哪些不同类型的医疗保健数据
哪种深度学习(DL)技术用于医疗保健和
我们如何利用这些数据和技术来构建医疗保健领域的 10 大应用
让我们从不同类型的数据开始,我们使用这些数据来建立真实世界的机器学习/深度学习模型。深度学习是机器学习的一个子集。深度学习不需要以提供更多数据来建立模型为代价来手工制作特征。
有 7 种类型的数据即, 数值、分类、文本、图像、视频、语音和信号 不考虑领域来构建深度学习模型。表 1 总结了来自医疗保健领域的不同数据类型。根据数据类型,预处理步骤可能会有所不同。然后,我们总结了每种类型的医疗数据基于深度学习的医疗应用。
表 1:数据和医疗保健应用的类型
接下来,我总结了各种类型的深度学习技术,以及我们如何在医疗保健应用中使用这些技术,并在表 2 中给出了具体示例。这些技术包括简单的前馈网络、卷积神经网络(CNN)到递归神经网络(RNN)以及最新的注意力网络。
表 2:深度学习技术的类型和在医疗保健中的应用
寻找深度学习在医疗保健中的应用的另一个维度是基于医疗保健系统的各个阶段,如表 3 所示。预防胜于治疗。DL 在医疗保健系统的早期和晚期都起着重要的作用[3]。
表 3:健康序列和深度学习应用
在这种背景下,让我们使用前面描述的各种类型的数据来研究医疗保健领域的 10 大深度学习应用:
- 医学影像:
- 卷积神经网络( CNN ) 2D/3D 在医学成像中发挥着重要作用[4]
- 我们利用 CNN 的进展来阐述医学成像中的分类、对象检测和分割类问题
- 这涉及到对大量图像的处理,提炼其对信息的理解和解释
- 迁移学习 来自 AlexNet,GoogleNet 帮助构建了很多图像分类问题
- DL 模型被移植到计算机断层摄影(CT)、磁共振成像(MRI)盒中,以识别重建图像 的 质量,并检查任何问题,例如运动检测
- 实时图像重建—可以更好地重建 CT 中的图像。这可以减少患者的辐射暴露。
2.更快的诊断:
- 分析医学图像/数据通常是一项困难且耗时的任务
- GPU 加速 DL 自动分析 并提高诊断人员的准确性
- DL 帮助医生 更好地分析疾病 并为患者提供最好的治疗
- 可以充当第二客观意见
3.早期检测/预警:
- DL 模型是通过访问来自各种设备(如移动应用程序、手表和观察模式)的连续数据而构建的
- 疾病可以在更早的时候 检测出来,例如在定期健康检查期间(可以在疾病发展之前采取纠正措施)
- 尽早发现症状,并根据需要建议去看医生/进行诊断测试,而不是定期检查
4.提高效率@放射科:
-
放射科医生可以花更多的时间与患者在一起,而不是医疗报告,包括远程放射学
-
工作流程 改进 以放射学为服务
-
没有因疲劳或其他原因造成的误诊
5.个性化治疗:
- 每个人的健康建议和疾病治疗都是根据他们的 病史 、过去的状况、饮食、压力水平&类似患者量身定制的
- 根据一个人的病史优化治疗方案
6.基因组学——精准医学:
- 了解基因组并帮助患者了解可能影响他们的疾病
- 遗传因素 喜欢突变导致疾病
- 大量的计算工作,但活跃的研究领域可以改变未来药物的使用方式[5,6]
7.药物发现:
- 更快地关联、吸收和连接现有数据,以帮助 发现数据池中的模式
- 加快临床试验研究。药物发现可能需要长达 10 年的时间,而使用 DL 和 ML 方法可以大大缩短时间。[7]
- 多样化的数据集 避免不平衡数据带来的偏差。我们可以使用最新的技术,如生成对抗网络(GAN)来处理数据中的不平衡[8]
8.机器人手术:
- 我们知道外科手术中精确的重要性,比如癌症治疗
- DL 模型有助于外科医生获得更精确的细节[9]
9.人群健康:
- 基于 人口数据趋势 汇集的消费者数据建立模型
- 我们可以与政府合作,收集大规模的数据,并建立基于数字图书馆的模型
10.信息提取:
- 从使用自然语言处理(NLP)的临床笔记到 匿名化、标注再到做语义分析和推理
- 使用图像字幕技术生成报告
- 使用提取的信息构建多模态聊天机器人
接下来,让我们看看实施这些顶级 DL 应用程序所面临的挑战,并讨论未来的范围。
挑战:
我们听到的一个常见问题是“深度学习有效,但仍被视为黑盒 ”。 即它是如何以及为什么工作的?这对数据科学家和临床医生都很重要。可解释人工智能(XAI)的最新发展有助于建立对深度学习模型产生的结果的信任。我计划发表另一篇关于 XAI 的文章,所以不在这里讨论这些话题。
深度学习处于采用周期的早期阶段,然而,技术的成熟度并不是采用的唯一因素。我们需要建立对技术的信任,应该能够重现临床验证的结果。这可以增加医生对该技术的接受度。
尽管担心会被替代,但实际上这项技术将补充医生的不足。很少有更多的挑战,例如:
- 质量的可及性和建模数据的多样性
- 跨国家/医院的数据访问问题
- 特定地区的数据驻留和隐私法律也限制了患者数据的共享,如通用数据保护法规(GDPR)
- 来自监管环境的批准
未来范围:
我们期待通过 FDA 的批准,使用深度学习模型成为主流。正如预防胜于治疗一样,我们可以想到 左移 的策略来减轻损害。如果一个被保险人生病了,这是医院的收入来源。然而,我们发现保险公司有一种新的创收方式。向人收取保险费,保护人不生病是新现象。
随着技术的进步,我们预计医生会广泛接受深度学习模型和人工智能。“通过软件进行诊断的第二意见可能会在 10 年内成为一种趋势”——Narayana Health 董事长 Devi Shetty 博士。
期待生活在一个更美好的世界,通过科技获得可负担的医疗保健。
参考文献:
[1]https://www . health care . digital/home/tag/% 248% 20 trillion % 20 health care % 20 industry
[2]https://abcnews.go.com/Health/Healthday/story?id=4509618&page = 1
[3]https://www . NVIDIA . com/content/g/pdf/Deep-learning-Journey-in-health care . pdf
[4]https://www . science direct . com/science/article/ABS/pii/s 1361841517301135
[5]https://www . frontier sin . org/articles/10.3389/fgene . 2019.00049/full
[7]https://www . science direct . com/science/article/pii/s 1359644617303598
https://arxiv.org/pdf/1803.01229.pdf
[9]https://emerj . com/ai-sector-overviews/machine-learning-in-robotics/
****【https://www.youtube.com/watch?v=_1US0QwENEY ****
请分享您的宝贵意见和建议。感谢阅读。快乐学习。
发现自然语言处理模型中的编码语言知识
深度学习模型中发现编码语言知识的“探针”的背景、调查和分析
本文作者为 凯于尔福尔杜 和 阿米特谢思 。本文详细阐述了更广泛的封面故事 “现代 NLP 的兴起和可解释性的需要!”在 Embibe,我们在搭建 NLP 平台解决学术内容众多问题的同时,迫切需要开放性问题的答案。
现代 NLP 模型(伯特、GPT 等)通常以端到端的方式训练,精心制作的特征工程现在已经灭绝,这些 NLP 模型的复杂架构使其能够学习端到端的任务(例如,情感分类、问题回答等)。)而没有明确指定特性[2]。语言特征(如词性、共指等)在经典的自然语言处理中起着关键的作用。因此,理解现代 NLP 模型如何通过“探究”它们所学习的东西来做出决策是很重要的。这些模型会从未标记的数据中自动学习语言特征吗?我们如何解释现代 NLP 模型的能力?让探测。
到探头就是调查。由马库斯·温克勒在 Unsplash 上拍摄的照片
语言学:背景
语言知识是自然语言处理的一个重要方面。我们可以从以下几个方面来考虑,
- 句法:分析句子的结构和单词的连接方式。
- 形态学:研究单个单词的内部结构,以及新单词是如何由这些基本单词的变体形成的。
- 音系学:对构成语言基本成分的语音系统的研究。
- 语义:处理单个单词和整个文本的意思。
图一。一份来自克什米尔的十七世纪 桦树皮手稿pāṇini’s 语法论著(图片来源:https://en.wikipedia.org/wiki/Panini*)*
在统计方法和经典机器学习中,解决任何与自然语言处理相关的问题都涉及推导上述语言知识。因此,研究界关注了许多与语言知识相关的任务。我们可以看到如下几个例子:
图 2:一句话中的语言学知识举例。(图片来自 其他文章 )
- 词性:词的句法范畴,即名词、动词、形容词、代词等。
- 成分树(或短语结构语法):短语结构规则考虑到句子结构是以成分为基础的,一棵解析树将这些成分排列成具有成分关系的树形结构。
- 依存树(或称依存文法):依存文法规则认为句子结构是以依存为基础的,依存解析树将单词排列成有依存关系的树形结构。
- 共指:两个词或短语与共同所指物之间的关系。
- 引理化:使用形态分析去除前缀或后缀后,导出基本引理词。
以上是几个与语言学知识相关的重要任务的例子,其中词性主要处理句法知识,依存树,共指对进一步理解语义很重要,词条化是形态学的例子。
许多其他任务进一步分析句子的语言属性,如语义角色、语义原型角色、关系分类(词汇和语义)、主语名词、主要助动词、主谓一致等。
现代自然语言处理模型
现代 NLP 模型要么基于 LSTM,要么基于变压器。ELMO 和乌尔菲特是基于 LSTM 架构的语言模型的例子。相反,伯特[1]和 GPT 是基于语言模型的变形金刚架构的例子。对于研究的其余部分,让我们以“BERT”为例作为参考。
- BERT 模型以屏蔽词预测和对大量未标记数据的下一句预测为目标进行预训练。
- 预训练的 BERT 模型通过使用特定于任务的层对其进行扩展来进行微调,这些特定于任务的层用于具有有限标记数据的任务,如“情感分析”、“文本分类”或“问题回答”。
由预训练的 BERT 模型产生的表示对相关信息进行编码,这使得能够利用非常有限的标记数据进行特定于任务的微调。问题是,
BERT 中编码了哪些语言学知识?
因此,一系列研究试图了解神经网络中捕捉的是哪种语言信息。不同方法中最常见的主题可以分为*“探针**”(或探测分类器、诊断分类器、辅助预测任务),它探测神经网络的内部机制如何分类(或执行)辅助语言任务(或探测任务,或辅助任务)。*
图三。伯特模型上探针的示意图。它展示了如何使用注意机制将输入令牌置于连续的层中。显示了两种类型的探针,(1)基于表征的,和(2)基于注意力的。注意,这个图是为了更广泛的说明,所以没有显示像 CLS 和 SEP 这样的特殊标记。
“探针”是如何工作的?
- 探针是浅层神经网络(通常是一个分类器层),插在为主要任务训练的神经网络的中间层或注意力头的顶部。探针有助于调查不同的层或注意力头捕捉到了什么信息。使用辅助任务来训练和验证探测器,以发现是否捕获了这种辅助信息。
- 图 3 示出了如何将探测分类器插入不同层或注意力头的顶部,以发现与不同层和注意力头的辅助任务相关的编码信息。
- 比方说,我们想要调查来自 BERT 模型的编码表示是否捕获语言信息,如“如果一个动词是助动词”或“如果一个短语是主语名词”。助动词是助动词,主语名词是充当主语的名词短语。这些任务可以被框定为探头的“辅助任务”。例如,在句子“孩子们整天在玩板球”——是“是助动词,”玩是主动词,“孩子们是主语名词,“板球是宾语名词。
- 如果探测分类器不能很好地完成语言信息的辅助任务,这意味着这种信息没有被编码在模型的内部表示中,这也是可能的,因为它可能不需要解决模型的主要目标。
“探索”与微调或多任务学习有什么不同?
表 1。探针 vs 微调 vs 多任务学习
- “探针”是 而不是 与对下游任务的微调有关,无论是在目标上还是在方法上。
- 表 1 显示了对比情况。
- “探针”是为了发现编码的语言知识,而微调和多任务学习在一个或多个主要任务上训练模型。
图 4。多任务学习与探究
- 如图 4 所示,“探针”可以访问模型内部但不能更新模型参数,另一方面,微调和多任务学习不访问模型内部,但它们可以更新模型参数。
- 就复杂性而言,“探针”应该是浅层的(即模型顶部的单层分类器),而微调和多任务学习可以根据下游任务的复杂性堆积深层[7][8]。
什么是不同类型的“探针”?
这些探测分类器可以基于它们利用什么样的神经网络机制来探测语言知识而被分类。这些主要是
- ***内部表示:*在来自不同层的内部表示之上构建一个小型探测分类器,以分析不同层编码了什么语言信息。
- ***注意力权重:*探测分类器建立在注意力权重之上,以发现注意力权重模式中是否存在潜在的语言现象。
(A)基于“探测”的内部表示:
相当多的技术正在探索在像 BERT 这样的模型的不同层次上,有多少语言知识被编码在内部表示中。让我们来看几个例子。
***(A.1)边缘探测:*Tenney 等人[4][5]提出的框架旨在探测编码在模型的上下文化表示中的语言知识。
- 对于词性、成分、依存关系、实体、语义角色标记、语义原型角色和共指消解等辅助任务,它比较了伯特、GPT、ELMO 和科夫等模型的上下文化表示的性能。
- 边缘探测将结构化预测任务分解成一种通用格式,其中探测分类器从句子中接收一个文本区间(或两个区间),并且必须预测诸如成分或关系类型等标签。从那些目标区间内的令牌的每令牌嵌入中。
- BERT-Large 模型的辅助任务总体性能的宏观平均值为 87.3,,而使用非情境化表示的基线探测器达到了 75.2 。因此,大约 20%的额外语言知识作为语境化的一部分被注入。
(A.2) BERT 重新发现经典的 NLP 管道 : Tenny 等人【3】【9】进一步分析了语言学知识从何而来。
- ***重心:*重心反映了参与计算不同层的内部表示的标量混合(加权池)的平均层。对于每一项任务,直观地说,我们可以解释为更高的重心意味着该任务所需的信息被更高层所捕获。
- ***期望层:*用不同层的内部表示的标量混合来训练探针分类器。层 I 的贡献(或差异分数)通过取用层 0 至层 I 训练的探测器的“性能”与用层 0 至层 i-1 训练的探测器的“性能”之差来计算。期望层是对每一层的差异分数的期望。
图 5:探头性能,以及图层对辅助任务的贡献(图片来源, Tenney 等人*【5】)*
- 在图 5 中,行标签是探测语言知识的辅助任务。每个任务的探测分类器的 F1 分数在前两列中提到,其中 l=0 表示辅助任务在非上下文表示上的表现,l=24 表示通过混合来自 BERT 模型的所有 24 层的上下文表示的辅助任务表现。预期层以紫色显示(重心以深蓝色显示)。
- 预期层是最大的额外语言知识的来源。可以看出,关于句法任务的语言知识是在最初几层获得的,而关于语义任务的语言知识是在后来几层获得的。
(B)基于注意力权重的“探针”:
“伯特在看什么?对 BERT 注意力的分析”,Clark 等人[2]探讨了 BERT 中语言知识的注意力权重。有趣的是,我们注意到特定的注意头是如何表达语言现象的,而注意头的组合可以预测语言任务,如与艺术表现水平相当的依存语法。
(B.1)具体注意事项
- 从图 6 中可以看出,BERT 中的特定注意力中心表达特定的语言现象,其中一个标记根据注意力中心表达的语言关系参与其他标记。
图 BERT 中特定注意头表达的语言现象。(图片来源: 克拉克等人*【3】)*
- 上面显示了六种不同注意力的可视化效果。BERT 基本模型有 12 层,每层有 12 个注意头。图 5 中左上的图表示第 8 层中的第 10 个注意头。客体关注其名词的模式是显而易见的。同样,在第 8 层的第 11 个注意头中,名词修饰语(限定词等。)正在关注他们的名词。同样,我们可以注意到其他情节中的注意头是如何表达语言知识的。
表 2:特定注意头的依存关系分类精度。克拉克等人【3】
- 注意到注意力头作为现成的探测分类器的表现真是令人惊讶。
如表 2 所示,对于每个依存关系,特定注意头如何实现预测依存标记的分类性能。对于行列式(det)、直接宾语(dobj)、所有格词(poss)、被动助词(auxpass)等情况,与基线模型(预测最佳固定偏移量处的令牌)相比,性能增益是巨大的 (~100%) 。
(B.2)注意力头部组合
表 3:不同基线和探测技术的性能。UAS 是用于依存首部令牌预测的未标记附件分数。克拉克等人【3】
- 在直接采用注意力权重的线性组合以及具有非上下文嵌入(如 GloVe)的注意力权重上训练的探测分类器,给出了与依赖于内部上下文表示的相对复杂的模型相当的性能,用于依存性解析任务。
- 同样,关于共指、消解任务的实验也显示了类似的潜力。也就是说,我们可以得出结论,BERT 中的注意机制也编码和表达语言现象。
探索“探针”
既然我们已经了解了基于表征的探针和基于注意力权重的探针,以使用辅助任务来发现编码的语言知识,那么询问更深层次的问题将会很有趣:
- 模型越大,对语言知识的编码越好吗?
- 如何检查模型对语言知识编码的泛化能力?
- 我们能否解码语言学知识,而不是依赖浅层探针分类器标签?
- 探针有哪些局限性,如何得出结论?
- 我们能注入语言学知识吗?
- 编码语言知识能捕捉意义吗?
- 编码的语言学知识对于自然语言理解来说足够好吗?
让我们在下一篇文章*“超越**分析 NLP 模型的编码语言能力&中进一步阐述上述问题。(即将推出)*
参考文献:
- Devlin 等人《BERT:用于语言理解的深度双向转换器的预训练》。NAACL 2019。
- Belinkov 等人“神经语言处理中的分析方法:调查”,ACL 2019
- 凯文·克拉克,乌尔瓦什·汉德尔瓦尔,奥默·利维,克里斯多佛·d·曼宁,“伯特在看什么?伯特注意力分析”,2019
- 伊恩·坦尼,迪潘詹·达斯,艾莉·帕夫利克,《伯特重新发现经典 NLP 流水线》,2019
- Tenney 等人“你从上下文中学到了什么?语境化词语表征中的句子结构探索”,ICLR 2019
- 阿迪等“使用辅助预测任务对句子嵌入的细粒度分析”,ICLR 2017
- Stickland 等人“BERT 和 PALs:多任务学习中高效适应的投射注意层”,ICML 2019
- 周等《极限-BERT:语言学告知多任务 BERT》,2019
PyTorch 多步时间序列预测的编解码模型
丹尼尔·利维斯·佩鲁西在 Unsplash 上的照片
编码器-解码器模型已经提供了像语言翻译等的序列到序列 NLP 任务的最新结果。多步时间序列预测也可以被视为 seq2seq 任务,为此可以使用编码器-解码器模型。本文提供了一个编码器-解码器模型来解决 Kaggle 的时间序列预测任务,以及获得前 10%结果的步骤。
解决代码可以在我的 Github repo 中找到。模型实现的灵感来自于 Pytorch seq2seq 翻译教程,时间序列预测思想主要来自于类似竞赛的 Kaggle 获奖解决方案。
使用编码器-解码器架构进行时间序列预测的教程- gautham20/pytorch-ts
github.com](https://github.com/gautham20/pytorch-ts)
使用的数据集来自过去的 Kaggle 竞赛— 商店商品需求预测挑战,给定 10 家不同商店的 50 种商品过去 5 年的销售数据(从 2013 年到 2017 年),预测未来 3 个月(2018 年 1 月 1 日到 2018 年 3 月 31 日)每种商品的销售额。这是一个多步多站点时间序列预测问题。
比赛
提供的功能非常少:
有 500 个独特的商店商品组合,这意味着我们预测 500 个时间序列。
随机选择 10 件商品的销售图
数据预处理
特征工程
深度学习模型善于自己发现特征,因此可以将特征工程保持在最低限度。
从图中可以看出,我们的数据具有每周和每月的季节性和每年的趋势,为了捕捉这些,向模型提供了日期时间特征。为了更好地捕捉每个项目销售的年度趋势,还提供了年度自相关。
这些功能中有许多实际上是循环的,为了向模型提供这些信息,对日期时间功能应用了正弦和余弦转换。这里可以找到为什么这是有益的详细解释— 编码循环连续特征— 24 小时时间
月份特征的正弦和余弦变换
所以最终的特性如下所示。
数据缩放
神经网络期望所有特征的值都在相同的尺度上,因此数据缩放成为强制性的。每个时间序列的值被独立地标准化。每年的自相关和年份也被归一化。
序列构建
编码器-解码器模型将一个序列作为输入,并返回一个序列作为输出,因此我们拥有的平面数据帧必须转换成序列。
输出序列的长度固定为 90 天,以满足我们的问题要求。输入序列的长度必须根据问题的复杂性和可用的计算资源来选择。对于这个问题,选择 180 (6 个月)的输入序列长度。通过对数据集中的每个时间序列应用滑动窗口来构建序列数据。
数据集和数据加载器
Pytorch 提供了方便的抽象——数据集和数据加载器——将数据输入模型。数据集将序列数据作为输入,并负责构建要提供给模型的每个数据点。它还处理提供给模型的不同类型的特征的处理,这部分将在下面详细解释。
使用 dataloader 将数据集中的数据点一起批处理并提供给模型。
模型架构
编码器-解码器模型是用于解决序列间问题的递归神经网络(RNN)的一种形式。编码器-解码器模型可以直观地理解如下。
编码器-解码器模型由两个网络组成——编码器和解码器。编码器网络学习(编码)输入序列的一个表示,它捕捉其特征或上下文,并给出一个向量。这个向量被称为上下文向量。解码器网络接收上下文向量,并学习从中读取和提取(解码)输出序列。
在编码器和解码器中,编码和解码序列的任务由一系列循环单元处理。解决方案中使用的循环单元是门控循环单元(GRU ),以解决短期记忆问题。关于这一点的更多信息可以在 LSTM 和 GRU 的插图指南中找到。
下面给出了解决方案中使用的模型的详细架构。
编码器
编码器网络的输入具有*(序列长度,n _ 值)*的形状,因此序列中的每一项由 n 个值组成。在构造这些值时,不同类型的特征被不同地对待。
时间相关特性 —这些是随时间变化的特性,例如销售和日期时间特性。在编码器中,每个顺序的时间相关值被馈送到 RNN 单元。
数字特征 —不随时间变化的静态特征,如序列的年度自相关。这些特征在整个序列中重复出现,并被输入 RNN。重复输入和合并值的过程在数据集中处理。
分类特征 —商店 id 和商品 id 等特征可以通过多种方式进行处理,每种方式的实现可以在 encoders.py 中找到。对于最终的模型,分类变量是一次性编码的,在序列中重复,并输入到 RNN 中,这也在数据集中处理。
具有这些特征的输入序列被送入递归网络— GRU 。下面给出了所使用的编码器网络的代码。
解码器
解码器从编码器接收上下文向量,此外,解码器的输入是未来日期时间特征和滞后特征。模型中使用的滞后特征是前一年的值。使用滞后特征背后的直觉是,考虑到输入序列限于 180 天,提供超过此时间范围的重要数据点将有助于模型。
与直接使用循环网络(GRU)的编码器不同,解码器通过解码器单元循环构建。这是因为从每个解码器单元获得的预测作为输入传递到下一个解码器单元。每个解码器单元由一个 GRUCell 组成,其输出馈入一个提供预测的全连接层。来自每个解码器单元的预测被组合以形成输出序列。
编码器-解码器模型
编码器-解码器模型是通过将编码器和解码器单元封装到一个模块中来构建的,该模块处理二者之间的通信。
模特培训
该模型的性能高度依赖于围绕优化、学习率计划等所采取的训练决策。我将简要地介绍一下它们。
- 验证策略— 由于我们的数据与时间相关,因此跨部门培训-验证-测试分割不起作用。依赖于时间的训练-验证-测试分离提出了一个问题,即模型不是在最近的验证数据上训练的,这影响了模型在测试数据中的性能。
为了应对这一问题,一个模型根据 2014 年至 2016 年的 3 年历史数据进行训练,并预测 2017 年的前 3 个月,用于验证和实验。最终模型根据 2014 年至 2017 年的数据进行训练,并预测 2018 年的前 3 个月。基于从验证模型训练中获得的知识,在没有验证的情况下以盲模式训练最终模型。 - 优化器 —使用的优化器是 AdamW,它已经在许多学习任务中提供了结果的状态。关于 AdamW 更详细的分析可以在 Fastai 中找到。探索的另一个优化器是 COCOBOptimizer ,它不明确地设置学习率。在用 COCOBOptimizer 进行训练时,我观察到它比 AdamW 收敛得更快,尤其是在初始迭代中。但是最好的结果是通过使用 AdamW 和一个周期学习获得的。
- 学习率调度—1 使用周期学习率调度器。通过使用用于循环学习的学习率查找器来确定循环中的最大学习率。使用的学习率查找器的实现来自库— pytorch-lr-finder 。
- 使用的损失函数是均方误差损失,它不同于完井损失— SMAPE 。MSE 损失提供了比使用 SMAPE 更稳定的收敛。
- 编码器和解码器网络使用了独立的优化器和调度器对,从而提高了结果。
- 除了权重衰减之外,在编码器和解码器中都使用了丢弃来对抗过拟合。
- 构建了一个包装器来处理训练过程,能够处理多个优化器和调度器、检查点和张量板集成。这方面的代码可以在 trainer.py 中找到。
结果
下面的图显示了模型对 2018 年前 3 个月的预测,针对商店的单个商品。
通过绘制所有项目的平均销售额和平均预测来消除噪声,可以更好地评估该模型。下面的图来自验证模型对特定日期的预测,因此可以将预测与实际销售数据进行比较。
来自编码器-解码器模型的结果将在竞赛排行榜中提供前 10%的排名。
为了达到这个结果,我做了最小的超参数调整,所以还有更多改进的余地。还可以通过探索注意机制来进一步改进模型,以进一步增强模型的记忆。