TowardsDataScience 博客中文翻译 2016~2018(一百五十六)
超越单词表示的分布模型。
在任何基于现代机器学习的 NLP 流水线中,单词矢量化是一个典型的步骤,因为我们不能直接输入单词。在单词矢量化中,我们通常为单词分配一个 n 维向量,以捕捉其含义。因此,这是流水线中最重要的步骤之一,因为不好的表示会导致下游 NLP 任务的失败和意想不到的影响。
单词向量化最常用的一类技术是单词的分布模型。它基于一个假设,即单词的意思可以根据它出现的上下文来推断。大多数深度学习论文使用来自分布假设的词向量,因为它们是任务不变的(它们不是特定于任务的)和语言不变的(它们不是特定于语言的)。不幸的是,分布式方法并不是单词矢量化任务的灵丹妙药。在这篇博文中,我们强调了这种方法存在的问题,并提供了改进单词矢量化过程的潜在解决方案。
分布式模型存在以下问题:
- 稀有词:对于语料库中出现频率较低的词,他们没有学习到很好的表征。
- 混义:他们把一个词的所有义项混为一谈,比如“bank”这个词可以指“河岸”或“金融机构”。分布模型将这些解释合二为一。
- 词法缺失:他们在学习表征时没有考虑单词的词法。例如,单词“evaluate”和“evaluates”具有相似的意思,但是它们被视为两个独立的单词。
幸运的是,有大量的研究致力于解决这些问题。这些方法大致分为三大类,我们将按以下顺序进行探讨:
- 形态学敏感嵌入
- 将语言学或功能约束增加到单词嵌入中
- 处理词义。
形态学敏感嵌入
这类技术在学习嵌入时考虑了单词的形态。Fasttext 是这类技术的一个典型例子。它将单词视为字符 n 元语法表示的总和。例如,单词“where”表示为“< wh,whe,her,ere,re >”。每个字符 n 元语法被分配一个向量,该向量随后被用于计算上下文向量和目标向量之间的匹配分数:
当这种方法(sisg)在诸如德语(De)、法语(FR)、西班牙语(es)、俄语(RU)和捷克语(Cs)等形态学丰富的语言的语言建模任务上被评估时,它显示出在不使用预训练的词向量的情况下,以及在不使用子词信息(sg)的情况下预训练词向量的情况下,相对于 LSTM 的改进。
此外,fasttext 可以为从未出现在语料库中的单词提供嵌入,因为它将单词表示为已知字符 n 元语法的总和。在生命科学等领域,像这样的嵌入非常有用,因为语料库中的大多数单词都属于有限词汇量的未知类别(长尾现象)。
向单词嵌入灌输形态学的另一种方法是由 Morphfitting 提供的。在这项工作中,他们使用吸引-排斥方法对嵌入进行后处理,以吸引屈折形态学(单词形式表达有意义的句法信息,例如动词时态,而单词的语义没有任何变化的一组过程)并排斥派生形态学(语义发生变化的新单词的形成)。关于吸引-排斥方法的细节将在下一节讨论。
通过灌输形态学语言约束,Morphfitting 显示了在下表中给出的 10 个标准嵌入上 SimLex 和 SimVerb 的相关系数的增益。
将语言学或功能约束增加到单词嵌入中
用于单词空间特殊化的另一类方法是用语言/功能约束对单词嵌入进行后处理。在上一节中我们已经看到了这种方法的一个例子——morph fitting。在这一节中,我们将探讨嵌入特殊化-吸引-排斥的变形拟合中使用的方法。
吸引-排斥是一种后处理技术,它采用预先训练的嵌入,并根据语言约束对其进行特殊化。例如,在 morphfitting 中,语言约束以两组形式表示,如下所示:
表格的上半部分显示吸引集,矩阵的下半部分显示排斥集。使用这些集合,形成小批量,用于优化以下损失函数:
该损失函数中的第一项对应于吸引集,第二项对应于排斥集。第三项保持分布表示。此外,前两个术语还反复灌输反面例子,这是从段落模型中借鉴来的思想。前两项的成本函数由下式给出:
第三项 term 由下式给出:
人们可以使用吸引-排斥来灌输语言限制,这可以用吸引或排斥集来表示,例如“同义词和反义词”或“屈折和派生形态学”。或者,在语言约束不暗示相似或不相似的情况下,不能专门化嵌入,例如,类型“treat”的关系不能使用吸引-排斥来捕获。为了适应这样的功能关系,我们引入了另一种叫做功能改造的方法。
在功能改造中,关系的语义学习和词空间特殊化同时发生。这是通过用在优化过程中学习的函数替换来自吸引排斥的点积来实现的。
上述公式中的第一项保持分布嵌入,第二和第三项从知识图中吸取正(E+)和负(E-)关系,最后一项对学习的函数执行正则化。
通过预测两个实体 I,j 之间的关系 r,在 snomed-ct 上使用链接预测来测试所学语义在功能改造中的功效。跨四种功能改造的四种关系(“has 发现部位”、“has 病理过程”、“due to”和“cause of”)的结果如下所示:
关于功能改造的更多信息,请参考克里斯多佛·波茨的博客。如果你正在寻找功能或语言约束来专门化你的嵌入,在链接的开放数据云查看互联本体的优秀汇编。
上述方法更新了词汇资源中提供的单词的嵌入。如果你对专门化整个单词空间感兴趣,你可以使用 EMNLP 2018 论文中建议的 Adverserial Propagation(Adversarial Propagation and Zero-Shot Cross-language Transfer of Word Vector Specialization)作者Ivan vuli和Nikola mrk ii)来实现。
处理词义
最后,最后一类专门化技术通过考虑上下文或利用词义清单来考虑词义。让我们从前一类的方法开始——ELMO。
在 ELMO,单词是根据上下文进行矢量化的。因此,为了对单词进行矢量化,还需要指定单词出现的上下文。与那些不考虑上下文的矢量化技术相比,这种方法被证明是非常有效的。当比较来自 ELMO 的最近邻居(biLM)和 Glove 时,可以看到相同的例子:
ELMO 背后的基本思想是生成嵌入作为双向语言模型的层的内部状态和字符卷积网络的最终层表示的加权和。
来自 ELMO 的嵌入已经在三个下游任务班、SNLI 和 SRL 进行了测试,发现其提供了超过基线的显著增益:
想了解更多关于 ELMO 的信息,请参考 AllenNLP 的博客文章。
如果您对使用词汇资源从单词的分布表示中提取意义感兴趣,您可以使用 [DECONF](https: //pilehvar.github.io/deconf/) 。在这种方法中,穆罕默德·塔赫尔·皮莱赫瓦尔提出了一种机制,使用以下优化标准从分布式嵌入中压缩感知嵌入:
这里,第一项保持了对有义分布表示的接近,第二项使有义嵌入偏向更接近偏向词。从视觉上来说,这个过程可以通过下面的图片得到最好的描述。
在词汇术语的语义网络(使用词汇资源创建)上使用个性化页面排名算法来计算偏置单词集。
使用 Pearson 和 Spearman 相关性在四个单词相似性基准上评估 DECONF。发现在如下所示大多数任务中获得了最先进的结果。
结论
如果你没有足够的训练数据来从零开始学习单词嵌入,我强烈推荐使用上面提到的单词专门化方法来获得一些百分点。对于这个主题更严格的报道,我强烈推荐Ivan vuli在 ESSLLI 2018 上关于单词向量专门化的课。
数据能为你的创业做的最重要的事情
如何减少企业家在数据决策方面面临的认知负荷
Let the key, current, and future questions that you’ll need to answer be the guide for making the data decisions at your startup.
我与许多初创公司合作过,当涉及到数据时,企业家会面临一系列非常常见的问题:
(为表达观点而简化)
- 我们如何跟踪我们需要的核心业务指标?
- 我们应该如何/在哪里存储和组织我们的数据?
- 到目前为止,数据告诉了我们什么?
- 我们还应该追踪什么?
- 在内部和外部分享这些信息的最佳方式是什么?
- 关于我们的产品、业务、客户等数据,我们还能做些什么??
沿着“数据之路”走下去,并试图回答这些和其他问题(又名:做出数据决策)可能会令人望而生畏,对没有数据头脑的企业家来说有点可怕。在如此关注和强调处理数据的情况下,有一种“正确处理”和高效处理的隐性压力。
没有人想说,“天啊,如果我们当时知道我们现在知道的事情就好了…”
与此同时,除了导师、投资者和客户不断告诉他们戴上的不合适的数据帽子之外,许多企业家还戴着销售、营销、业务发展和产品的帽子。如果不在他们的工作范围内,这不是一个容易完成的角色,而且试图理解初创公司在数据之旅中面临的总体决策可能会令人生畏。
虽然上面列出的每个问题都值得单独研究,但企业家可以通过一个思维模式来整合和简化关于数据的问题、想法、想法和待办事项。(使用这种模式有助于减轻一些数据决策压力。)
(好的)数据只是回答关键、当前和未来问题的备忘单。
是的,就是这样。这听起来非常简单,确实如此,但是也很容易忽略所有数据的真正用途。
向后工作
如果我们看看上面的第 4 条——“我们还应该跟踪什么?”—在当今这个超级简单的数据生成的世界里,回答这个问题可能会非常困难。
“让我们追踪一切!”难道不是一个好的答案吗?因为这样做通常会让人不知所措、迷惑不解,而且成本高昂。
相反,你可以逆向工程,列出代表你的业务和产品你想要和需要回答的关键/当前/未来问题,将哪些清晰度指标包含在你的报告中。
企业家可以利用他们的创造力想出一个问题景观,而不是被眼前的数据导向挑战吓倒。
利用你所拥有的,做你擅长的,并利用这些来驾驭那些对你来说不那么容易的东西——比如学习什么是 ETL,以及 Luigi 不仅仅是任天堂的那个家伙。
需要注意的是,从答案通过关键/当前/未来问题到需要做出的数据决策的逆向工程不是一步到位的过程。这些问题可能来自内部或外部的利益相关者,并且在结构和重要性上有所不同,它们通常嵌套在更广泛的主题和业务核心问题中。
这可能是一件麻烦的事情,但是列出你所有的关键/当前/未来问题,并从那里逆向工程你的数据决策,对你和你的团队来说是一个很好的练习。
(这也是开发创业公司数据路线图的好方法。)
“什么是数据路线图?”我们先来回答这个问题。(而且我们不会把它算进 10。)
medium.com](medium.com/@markschind…)
磨练你的预测技能
确定对您的业务最重要的问题是事情变得有趣的地方:确定关键的和当前的问题可能有点简单,但是“未来的问题”呢?你怎么能预测未来并提前知道你需要回答什么问题呢?
成为一名好学生的最好步骤之一是学会预测考试问题,而成为一名成功企业家的最好步骤之一是预测你的投资者、客户和团队可能会问什么问题。
这样做你可能做不到 1.000,这只是成功退出的众多因素之一,但如果你能磨练这一技能,那么它可以让你把时间和精力集中在对你的业务有最大影响的追求上。
(在此插入俗气的“准备”引言或陈词滥调)
最后,预测客户和投资者的问题是很好的准备——没有什么比被一个你没有准备好或准备不足的问题弄得措手不及更糟糕的了。虽然许多企业家可能会在一次重要会议前考虑这一点,但为什么不从第一天就使用相同的方法呢?
它将关注并简化您的数据决策,并使重要会议的准备变得更加容易。
用 Python 实现上升趋势线指标——从获取数据到建模算法和实现解决方案——第 1 部分使用 REST API
最初发表于【softwarejargon.com】 在我的博客上找到这篇文章的更新版本【https://softwarejargon.com/blog】
要求—您应该熟悉以下主题:
- 使用过 python、对象、循环和数据类型。
- 对熊猫和图书馆有一些了解。
- 知道什么是技术分析。
希望更新您的技能或获得上述主题的介绍?我强烈推荐以下资源:
- 金融市场技术分析:交易方法和应用综合指南
- 熊猫图书馆文档。但是,如果你真的想以结构化的方式学习 Pandas 进行数据分析,我强烈推荐阅读 Python for Data Analysis:与 Pandas、NumPy 和 IPython 的数据角力
- 请求库文档
这是关于处理股票价格数据和用 Python 实现上升趋势线指标的系列文章的第一篇。完整系列将详细描述技术指标上升趋势线的实现。本文将描述解决方案中使用 REST API 的部分,这将为我们提供后续文章中需要的数据。
上升趋势线指示器的简要说明
在技术分析中,最著名和简单的技术指标是上升趋势分析。该指标本质上是一条直线,因此在查看图表时相对容易识别。图案是一条直线,至少要经过三个点。线的斜率必须增加,并且不能被图中更靠前的点打断。
上升趋势线表明;股价将继续高于趋势线,因此将继续上涨。如果在任何时候股价触及趋势线,并因此穿过趋势线;这预示着股票价格将有下跌的趋势。请参见下图。
如果你想学习更多关于指标和技术分析的知识。你可以在这里找到更多信息。
这就是我们将在本文中构建的内容
首先,你需要在你的机器上安装 Python。我建议安装蟒蛇;在我看来,在本地使用 python 最简单的方法。但是在本文中,我不会详细介绍开发环境的设置。然而,这个问题将会在一篇关于安装 Anaconda 和建立开发环境的独家文章中讨论。
本文的其余部分将关注:
- 如何连接到 Alphavantage REST API?
- 处理数据并将其放入熊猫数据框。
- 使用 pandas 数据框架,为实际分析做准备。
连接到 Alphavantage
首先你需要有一个 API 密匙。这可以通过访问以下链接获得:www.alphavantage.co/选择“立即获取免费 API 密钥”。
这里我假设您已经安装了 Anaconda 并创建了一个安装了 Python 2.7.xx 的环境。
您还必须在使用的环境中安装以下库:
- json
- 要求
- 熊猫
接下来创建。py 文件。创建以下内容。项目文件夹中的 py 文件:
- get _ historical _ data.py
- get_main_df.py
文件“get_historical_data.py”
首先,您需要导入我们将在 get_historical_data.py 文件中使用的所有必要的库。
然后,我们感兴趣的是创建一个新的类,它将包含连接到 REST API 和检索必要数据所需的所有必要方法。
我们将这个类命名为AlphaVantage。这个类需要一个__init__方法,该方法将在类的实例化时被调用。__init__方法应该如下所示:
现在我将逐行检查每一行代码。我们已经通过定义 inline 5 创建了一个类。在第 7 行,我们定义了__init__方法。该方法将接受三个参数,其中两个将具有默认值,这意味着它们在调用该类时是可选的。在__init__方法中,第 8 行到第 13 行之间定义了六个变量。
self.base_url包含值"https//www.alphavantage.co"。每次我们需要构建调用 REST API 的 url 时,都会用到这个值。self.default_endpoint包含值"/query"。这个值是我们将多次调用的 REST API 的端点之一。因此,我们想把它放在__init__方法中,从而避免多次定义它。self.api_key在这里,您需要输入从 Alphavantage 检索到的 API 密钥。self.symbol_code该变量的值由参数symbol_code设置,我们将在实例化该类时解析该参数。self.interval由参数interval设置,其默认值设置为"60min"。这个变量稍后将在调用 REST API 提供的一个端点时用作参数。self.outputsize是由参数outputsize设置的变量,其默认值也设置为"compact"。这个变量也将在以后调用 REST API 端点时用作参数。
到目前为止,我们已经包含了所有必要的库,定义了一个类,并在该类中创建了我们的__init__方法。现在我们将在 AlphaVantage 类中创建一个名为intraday的额外方法。
intraday方法不接受任何参数,除了self.如果你想了解self在 Python 中做了什么,我建议阅读这篇文章。
intraday方法的目的是用一些参数调用特定的端点,并以 JSON 的形式返回响应。为了调用 REST API,我们使用请求库,更具体地说,我们将使用requests.get()方法。这个方法有许多参数。我们将提供以下内容:
- 我们要调用的 url。我们在第 21 行构建 url,特别是部分
"{0}{1}".format(self.base_url, self.default_endpoint)。如你所见,我们使用了在__init__方法中定义的一些变量。 - 我们还必须提供 REST API 端点需要的参数。为此,我们将构建一个名为
parameters的字典,包含一些键和值。第 12 到 19 行定义了 dict 及其键和值。dict 中的键和值,每一个都代表一个参数,REST API 端点需要这个参数来响应期望的输出。
让我们来看看在我们的字典parameters中定义的一些参数。
"symbol"该键的值被设置为变量self.symbol。我们需要向端点提供这个参数,以便指定我们想要查看哪个公司的股票价格。"interval"该键的值被设置为变量self.interval,其值为"60min"。这意味着我们需要每小时一天的数据,每天有 24 个数据点。"outputsize"该键的值被设置为变量self.outputsize,其值为"compact"。简而言之,这意味着我们将收到我们请求的任何给定"symbol"的最新 100 个数据点。
如果您想了解这个特定端点的更多信息,以及 Alphavantage REST API 的一般信息。我建议看一下文档。
所以现在我们已经定义了方法intraday,其中我们调用了 Alphavantage REST API 中的一个特定端点。此外,我们还在 dict 中定义了所有必要的参数,并将 dict 作为参数提供给第 21 行的requests.get()方法。最后,我们方法的最后一部分,第 23 行,返回我们从调用的 REST API 收到的响应。
现在我们将在我们的类AlphaVantage中实现另一个叫做daily的方法。
这个方法和上一个很像。daily方法的目的是每天而不是当天返回股票价格数据。为此,这种方法与以前的方法相比有两个不同之处。在第 13 行,键"function"的值现在被设置为"TIME_SERIES_DAILY”,我们不再有键"interval"。其他一切都保持不变,因此这种方法不需要额外的解释。
最终的 get_historical_data.py 文件现在应该如下所示:
文件“get_main_df.py”
对于这个文件,你需要导入库pandas和json,此外你还需要从文件 get_historical_data.py 导入AlphaVantage类
我们现在对创建一个名为get_main_data_frame的新函数感兴趣。这个函数将包含我们在 get_main_df.py 文件中实现的所有逻辑。
我们想在函数中做的第一步是调用AlphaVantage类,以便获得一些我们可以使用的数据。我们将这个实例命名为historical_data_daily。
注意,我们还调用了方法daily(),它是在类AlphaVantage中实现的方法之一。这意味着我们将接收每日数据,而不是当天数据。
下一个代码片段包含大量代码,但是,主要重点是遍历调用 Alphavantage REST API 所收到的响应。
在第 15 和 16 行定义了两个空列表。list_keys将包含所有与我们相关的键,而list_historical_data_daily将包含我们想要处理的所有数据。在这里,我假设您有一些使用 dicts 和 JSON 数据的基本知识。
第 17 行和第 18 行遍历在键"Time Series (Daily)"中找到的所有键。我们找到的每个键都被附加到list_keys。在这种情况下,每个键实际上代表一个日期。
第 20 到 40 行做了几件事。首先,我们访问list_keys中每个键的数据,并将其赋给变量data。然后识别出四个数据点price_open、price_high、price_low和price_close。所有四个变量都将包含一个代表给定日期价格的数值。
接下来,用关键字定义字典。这将是我们每天想要保存的数据。dict 包含一个日期和一个符号,以及四个价格值。最后,该字典被附加到list_historical_data_daily。
可以在下一个代码片段中看到的代码的其余部分集中在与 pandas 一起工作,以便为进一步的分析准备数据。
我们要做的第一件事是将所有存储在list_historical_data_daily中的数据转换成熊猫数据帧。这是在第 15 行完成的。
- 第 20 行创建了字段
'date_str'。此字段源自“日期”字段。 - 第 21 行将字段
'date'设置为数据帧的新索引。 - 第 22 行对索引进行排序。默认排序是升序,这意味着最早的日期排在最前面。
- 第 24 行创建了字段
'price_close_lag'。本栏位显示前一天的收盘价数据。当我们在随后的文章中想要比较今天的价格和前一天的价格时,这将是有用的,以便确定价格的方向。 - 第 25 行创建了字段
'price_close_lag'。该字段显示明天的收盘价格数据。与前一个字段一样,该字段也将有助于后面的价格比较分析。 - 第 27 行创建了字段
'date_id'。该域从 1 开始递增一个 int 值。熊猫数据框按升序排序很重要。因此,以前索引是一个日期值,按升序排序。
最后返回名为df的数据帧。
最终的 get_main_file.py 文件现在应该如下所示:
希望这篇文章可以提供一些关于如何开始处理股票数据、从哪里获取数据以及如何开始准备数据以应用算法的想法。
下一篇文章的第 2 部分将关注技术指标上升趋势线的实现。我希望你准备好了,因为这将会有点复杂,但相反更令人兴奋。
如果你有兴趣了解我更多。请访问我在 LinkedIn 上的个人简介www.linkedin.com/in/vedranma…
感谢阅读。如果你对我写的关于机器学习和类似主题的未来帖子感兴趣,请在 Medium 和 LinkedIn 上关注我。更多文章即将发表。
使用 NLP 算法人性化客户投诉
Image Source: Adobe Stock
去年圣诞节,作为一名消费者,我经历了最令人沮丧的经历。我正在做一些最后一分钟的假日购物,在排了很长的队后,我终于到达了受祝福的收银台,却发现我的借记卡被封了。我能感觉到收银台的老太太眯着眼睛打量着我。感觉非常尴尬,我马上给银行打了电话。令我惊恐的是,他们告诉我,我的储蓄账户被黑了,几千美元已经不见了!
“天哪!这种事怎么会发生在我身上?”
最初的震惊平息后,我决定马上解决这个问题。我不得不拨打另一个号码,证明我的身份,并提出正式投诉,拿回我的钱希望渺茫。打了一个小时的电话后,我挂断了。我太生气了!五分钟后,我看到我的银行发来一条短信,问我:在我们银行工作开心吗?我的第一反应是一些措辞,然后是更多的沮丧和怀疑。
“他们怎么能这样问我?他们不知道刚刚发生了什么吗?他们只是假装关心我吗?对他们来说我只是一个数据点吗?沧海一粟?”
在众多的问题中,出现了一个明显的认识。我意识到,作为一名数据科学专业人员,我也在做同样的事情。在我的组织中,我们以同样的冷漠对待我们自己的客户投诉。只是另一个数据点;只是沧海一粟。我有什么不同吗?
我们需要人性化的客户数据。
即使在数据科学中,人类的情感也很重要,这一观点在我脑海中生根发芽。我开始痴迷于分析和解读客户投诉数据。在花了几个月的时间进行内部研究后,我们发现了一个鲜为人知的关于投诉叙述的非结构化数据源。举个例子,让我们来看一个向消费者金融保护局 (CFPB)登记的关于信用卡计划的实际投诉。
Anonymized Customer Complaint from CFPB Complaint Database (Image Source: Adobe Stock)
我打赌你读了 3-4 行后就不再读了,对吗?我们只是把这样的描述性叙述扔掉,仅仅是因为我们不知道该怎么处理它。传统的统计方法相当无用,我们之前的文本分析工作(也称为词云)没有产生任何可操作的消费者洞察。此外,我们通常会收到数以千计的此类投诉。因此,对如此庞大的数据进行全面分析被认为是不可能的。输入 NLP 算法!
自然语言处理
NLP 是机器理解和分析人类语言的能力。它是人工智能(AI)领域的一部分,与语言学有很大的重叠。
然而,自然语言是极其复杂的系统。想象一个人体。它由 11 个独立的系统组成(如神经系统、消化系统等。)相互协同工作。类似地,人类语言有几个子系统,如音韵学、形态学和语义学,它们彼此无缝协作。
不同子系统之间复杂的相互作用使得学习一门新语言变得困难。如果你的母语是英语,你可能需要 2000 多个课时才能说一口流利的普通话。那是几年的学习价值!这就是为什么与机器学习和人工智能的其他领域相比,NLP 的进展缓慢的原因。
NLP 流程:
典型的 NLP 流程有以下步骤:
**1)数据收集:**数据挖掘或 ETL (extract-transform-load)过程收集非结构化数据的语料库。
2)数据预处理:
3)特征工程:
- 单词嵌入:将文本转换成有意义的向量或数字数组。
- N 元语法:一元语法是文档中的一组单词;二元语法是文档中两个相邻单词的集合。
- TF-IDF 值:Term-Frequency-Inverse-Document-Frequency 是一个数字统计量,表示一个单词对文档集合中的一个文档有多重要。
4)自然语言处理算法的应用:
现在,我们来看几个关于实际客户投诉的真实案例研究。
案例研究#1:主题建模
**问题:**在提交投诉时,要求客户选择投诉类别或主题。然而,客户不知道商业术语,所以他们经常选择错误的类别。这对于我们来说是一个大问题,超过 20%的投诉被错误分类和错误发送。这导致了长时间的等待和客户投诉的不完全解决。
**解决方案:**我们利用 TF-IDF 和 LDA 等主题算法,根据投诉中使用的确切语言对客户投诉进行重新分类。如下图所示,原始主题(客户主导的)和新主题(NLP 推荐的)之间存在一些差异。特别是,NLP-themes 将“滞纳金”确定为客户投诉的主要原因(17%),大大高于之前的估计。
这种分析更快、更准确地确定了投诉的根本原因。尽管有了这一突破,我们仍在努力以 100%的准确率对投诉进行分类。有时,一个投诉有多个方面,可归因于几个类别,这导致不准确的分类和不适当的解决工作。为了提高准确性,我们使用余弦相似度度量标准构建了所有投诉的定制知识图或网络图,该度量标准可作为各个投诉之间的引力。此外,力定向图被用于更好的可视化。
Knowledge Graph based on ~18K complaints from CFPB Complaints Database (powered by Quid)
我知道你在想什么!是的,它看起来确实像一种奇怪的海洋珊瑚!但这个知识图中的每一个节点都是一个个体的抱怨。相似的投诉根据使用的确切语言聚集在一起,并用不同的颜色表示。通过这一分析,我们能够获得以下见解:
- 多个投诉主题:一个典型的投诉有 2 或 3 个不同的主题。通过知识图表示投诉可以更好地识别集群中的重叠主题和异常值。
- 中心主题与边缘主题:在上图中,“账户关闭”是一个中心主题,改善关闭体验可以让其他主题受益。相比之下,“社会保障”投诉存在于它们自己的岛屿上,因此需要用单独的解决策略来处理它们。
- 隐藏的主题:知识图可以揭示非结构化数据中隐藏的关系,并帮助识别新的主题。
**结果:**基于这些认识,我们确定“客户费用”是一个比以前认为的更大的问题。我们免除了大约 150 万客户的国外交易费用。我们还修改了滞纳金政策,实施了更多以客户为中心的标准,并免除了每年约 3 万名客户的滞纳金。这些努力最终使我们在过去 4 年中获得了最高的客户满意度得分和最低的投诉率。
案例研究#2:情感分析
**问题:**历史上,我们忽略了客户投诉中的潜在情绪。显然,投诉都与负面的客户体验有关,但重要的是要弄清楚客户是否在质疑某项政策,或者他们是否有原本应该避免的真正可怕的体验。本质上,我们需要量化客户的“恼火”因素,以优先处理和上报需要立即处理的投诉。
**解决方案:**对于情感分析,我们维护了一个标准的 NLP 工作流程,并增加了一些关键步骤。首先,有一个情感检测步骤,其中利用一个单词袋模型通过基于词汇的方法来确定文本是否属于客观事实或观点。其次,通过机器学习算法来确定情绪的极性(积极或消极)。我们测试了几种分类算法,包括随机森林、支持向量机和梯度推进。深度学习算法,特别是长短期记忆( LSTM )网络,能够忘记无关信息,也显示出很大的前景。一旦消费者情绪被汇总,它们就被映射回知识图,以便更好地可视化。
Sentiment Analysis based on ~18K complaints from CFPB Complaints Database (powered by Quid)
如你所见,“欺诈和身份盗窃”主题与最负面的消费者情绪相关。其他有问题的投诉主题是“商家纠纷”和“信用额度下降”。此外,通过开发一个情感仪表板,可以随时跟踪客户情感。这样做主要是因为业务主管喜欢仪表盘!下面是一个例子。
An Example of Sentiment Dashboard for Customer Complaints
**结果:**该分析促使我们对防欺诈计划进行了全面的审查和后续改进,并改进了商户争议/信贷实践。重要的是,采取这些措施来加强我们的客户倡导计划,使我们在 2018 年 J.D. Power 满意度调查中从第 7 名升至第 3 名。
吸取的教训:
**1)数据是我们最大的资产:**我们扔掉了投诉文本数据,但它变成了宝贵知识的金矿。我敢打赌,如果你足够努力地寻找,你会在自己的企业中发现这样的原石。
投诉=洞察力:客户投诉通常与很多耻辱联系在一起。我们不喜欢谈论抱怨,因为根据定义,这些都是失败的故事。这就是为什么,通常情况下,他们会被掩盖起来。重要的是要改变我们的态度,开始将投诉视为可操作的消费者洞察力的来源。
"你最不满意的顾客是你最大的学习来源."
比尔·盖茨
**3)人类的情感是非常强大的:**最好的品牌总是与他们的消费者联系在一起,并诉诸人类的情感。情感分析不仅是增强客户体验的强大工具,也是品牌管理、营销策略和新产品开发计划的强大工具。
**4) NLP 将是未来 AI 的基石:**随着 AI 的出现,预计到 2022 年,非结构化数据将占到数字宇宙中所有数据的 93%。NLP 算法将是释放非结构化数据真正潜力的关键,可以帮助企业为自己发展长期竞争优势。
最后,感谢我的同事 Jeorge Corotan 和 Anurag Setty 完成了这项惊人的工作并分享了我的困扰!请让我知道你是否有任何反馈,或者在下面分享你自己关于 NLP 算法的经验。
从 2018 年纽约人工智能峰会吸取的 5 个关键教训
炒作、现实、道德、颠覆等等…
2018 AI Summit, NYC, theaisummit.com/newyork/
本周早些时候,我很高兴参加了在纽约市雅各布贾维茨中心举行的 2018 年人工智能峰会(@ Business _ AI# AISummit)。这是一个会见领先的人工智能研究人员、思想领袖和同行的绝佳机会。
人工智能峰会:
现在是第三年,人工智能峰会是专注于企业人工智能应用的最负盛名的会议之一。3,000 多名与会者,300 多名发言人和 150 多场会议,峰会为每个人提供了一些东西。所有通常的嫌疑人都出席了,包括谷歌、亚马逊、微软,当然还有机器人索菲亚( @RealSophiaRobot ),汉森机器人的人工智能倡议。就连金融机构也以高盛、摩根大通、花旗、第一资本、美洲银行和巴克莱为代表。这些会议很好地结合了案例研究、商业见解和来自各个行业的技术解决方案。以下是我在峰会经历中的 5 个要点。
#1:我们超越了宣传
几年前,人工智能被认为是世界上所有问题的解决方案。它应该让世界变得更好,这样我们就可以永远幸福地生活下去!今年,我们听到了人工智能悲惨失败的故事,包括令人沮丧的故事在亚利桑那州坦佩发生的无人驾驶车祸,以及亚马逊 Alexa 在德国慕尼黑开始她自己的派对的欢乐。
另一个现实检验是人们意识到,人工智能的好坏取决于它可以从中学习的数据。一个接一个的演讲者指出,“人工智能战略”始于“数据战略”,我们需要以正确的顺序攀登“人工智能金字塔”。这种回归基础的支点表明,我们正处于拐点,并准备超越早期的人工智能宣传。
#2:“人工智能即服务”是一个令人兴奋的命题
AI 的民主化是会议最突出的主题之一。需要博士学位来构建机器学习算法的日子已经一去不复返了。随着云服务提供商的出现,强大的算法只是一个简单的 API 调用。这些解决方案大大降低了更大的商业社区的准入门槛。
“人工智能就是将不可描述的自动化”——Cassie Kozyrkov,谷歌
Cassie Kozyrkov(@ quae Sita)发表了一篇精彩的主题演讲,讲述了谷歌如何通过云计算和发展决策智能学科来实现人工智能的民主化。AWS 和微软 Azure 等其他云服务提供商展示了利用现成人工智能能力的强大解决方案。此外,来自 SingularityNET 的 Ben goertz El(@ bengoertz El)倡导“去中心化的人工智能”,将人工智能和区块链融合在一起,创造一个开放的市场。对于确保未来人工智能发展的民主化,这是一个有趣的提议。
#3:可解释的人工智能是真实存在的:
深度学习被誉为“黑盒”方法,但模型可解释性是一个活跃的研究领域。为了提高透明度和可解释性,分享了几个建立“玻璃盒子”模型的成功案例。这里有几个可解释人工智能领域的有趣项目:
- 反向时间注意力模型(RETAIN):RETAIN 模型的开发是为了帮助医生理解为什么一个模型可以预测有心力衰竭风险的患者。
- 局部可解释的与模型无关的解释( LIME ):一个在决策做出后提供解释的临时模型。
- 逐层相关性传播( LRP ):这对于计算机视觉通过在神经网络中运行反向传递来识别重要像素特别有用。
#4:金融机构颠覆的时机已经成熟
此次峰会有一个单独的“人工智能在金融”环节,来自全球银行和金融科技的演讲人讨论了金融领域的最新趋势。关键的人工智能用例包括欺诈/合规/网络防御的异常检测,机器人顾问的专家系统和聊天机器人/虚拟代理的客户体验。
“当我们考虑人工智能/人工智能时,它是关于消除摩擦,为客户提供无缝体验”——加文·迈克尔,花旗银行
特别是亚马逊连接和谷歌联络中心,我最近宣布了联络中心人工智能解决方案,承诺更高的效率和更低的运营成本。专家们一致认为,人工后台银行操作可能是人工智能投资在不久的将来的目标。
#5:负责任的人工智能势在必行
去年 7 月,技术界的两位最大人物就人工智能的未来展开了一场非常公开的争论。埃隆·马斯克认为人工智能将导致人类的灭亡,而马克·扎克伯格认为人工智能实际上将有助于进一步创新。两人在社交媒体上争斗,交换琐碎的言论,但本质上两人都代表了人工智能的对立双方:天启与涅槃。无论如何,商业界已经意识到,一般的或“类似人类”的智能要遥远得多,并将其努力集中在具有巨大就业增长潜力的特定领域有影响力的人工智能应用上。
“我们看到人工智能正在帮助人们的工作……同时也开辟了新的工作机会”——Beth Smith,IBM Watson
尤其是“负责任的人工智能”这一主题贯穿了每一次演讲。几位发言者谈到了将“信任”整合为工程原则之一,并将道德和价值观嵌入为人工智能交付成果的一部分。
“我们需要创造负责任的人工智能,这样我们才能给技术带来信任”——大卫·卡莫纳,微软
IBM 已经创建了 AIFairness360 ,这是一个开源工具包,用于减轻机器学习模型中不必要的偏见,以及对抗性鲁棒性工具箱,用于分析机器学习模型的攻击和防御方法。纽约市最近通过了第一项法案来检查政府机构中的“算法偏见”。在可预见的未来,负责任的人工智能可能会成为技术、社会学和政治讨论的焦点。
总的来说,这是一次了不起的学习经历,有精彩的演讲、演示和小组讨论。我真的很喜欢与其他人工智能专业人士互动,并能够在行业内建立有价值的联系。感谢 AI Summit(@ Business _ AI# AISummit)举办了一场现象级的大会!
咖啡势利和机器学习的故事
机器学习能帮助我们找到一杯完美的咖啡吗?
“Snobs come in all shapes and sizes. In the food world you’ll find some of the biggest snobs around, those who only eat the most hand-foraged or urban-farmed, artisanally crafted, truffled morsels. But no snob is more outrageously self-righteous than the coffee snob”
我们都有这样的朋友,那个令人讨厌的朋友,他认为自己比任何人都好。他们鄙视星巴克,大规模生产咖啡,一边喝着他们的早茶,一边大声宣称“葡萄酒的味道、馅饼皮和活泼的草莓酸味在舌头上跳舞”🙄。
嗯,就是我!
我决定将我对咖啡的热爱与我对机器学习的热情结合起来,尝试回答世界上最紧迫的问题之一:是什么造就了一杯完美的五星咖啡?
是什么造就了⭐️⭐️⭐️⭐️⭐️☕️那杯完美的五星咖啡?
第一步是获得一些数据。我使用一个名为 Selenium 的 Python 包来收集近 500 种咖啡、它们的评级、评论和许多其他细节的【mistobox.com (我使用的一种奇妙的咖啡订阅服务)。
痴迷于一杯咖啡需要考虑很多因素——原产国、品种、海拔、加工方法、烘焙方式、混合与单一产地,当然还有品尝记录。
这些特征中的任何一个能帮助预测哪种咖啡会获得五星评级吗——还是人们的口味太多样化了,以至于无法确定哪种咖啡胜出?
一旦我清理和组织了所有的数据,我就开始做探索性数据分析 ( EDA)。EDA 正在探索和可视化我们的数据,以帮助我们了解我们的数据是什么样的。有多少台烘烤机?一杯咖啡的平均等级是多少,什么应该被认为是一杯特别的咖啡?
我还使用了*自然语言处理(使用文本作为我们的输入特征,而不仅仅是数字),*使用用户留下的书面评论来创建额外的特征,从而为我们的数据集增加更多价值。我认为任何分数高于 80 分的咖啡都是“好”咖啡。
我认为任何分数高于 80 分的咖啡都是“好”咖啡。
机器学习(为了掩盖整个博士课程的知识价值)是指我们使用数学公式和大量数据来看看我们是否能发现模式并做出预测。它通常集中在这个问题:**给定输入 X,正确的预测 Y 是什么?**在这种情况下,假设一种咖啡有 X 个因素(国家、品种等),我们能否预测它是否会得分高于 4 星(我们的输出 Y)?
我尝试了几种流行的机器学习模型,最终使用了一种叫做随机森林的算法对我们的咖啡进行分类。随机森林模型的一个伟大之处在于,我们可以回顾过去,看看我们的模型在做出决策时发现哪些特征是重要的。
Feature importances of our model. Note that it could be important in determining a good or bad coffee.
该模型确定了四个最重要的特征,即海拔、价格、混合和埃塞俄比亚。这与我在 EDA 中观察到的情况非常吻合,生长在高海拔和更贵的咖啡比低海拔和更便宜的咖啡得分更高。埃塞俄比亚是我最喜欢的咖啡种植区,也比其他国家得分高。此外,混合咖啡比标有浓缩咖啡或单一产地的咖啡得分更低。
虽然我们的特性确实有意义,但我们仍然需要看看我们的模型实际上表现如何。我们的准确率是 76 分,这听起来还不错,直到我们考虑到 75%的咖啡被贴上“不太好”的标签。我们的模型甚至没有超过基线准确度(对于每一种咖啡,仅仅猜测是或否所得到的准确度分数),所以它实际上没有做得很好。
因此,虽然从准确性的角度来看这个项目不是很好,但它仍然是一个有趣的工作,也是一个很好的学习经历。似乎人们对咖啡的偏好差异太大,很难选出一个明确的赢家,还是我们没有足够的数据?
对你来说,怎样才是一杯完美的咖啡?你做过类似的项目吗?留言评论!
想看看我的代码或问我一个问题吗?看看我的 GitHub 或者和我在 LinkedIn 上聊天。
在新闻文章上使用情感分析的算法交易
嗯,我应该为我的考试而学习,但我很想在我休息的时候探索这个。我意识到,我可以使用我以前项目中的元素来做这件事。我之前写了关于通过网络抓取实现社交媒体竞赛自动化的文章,我还写了关于 T2 生成新加坡式文本信息的文章,我在那里处理文本数据。这一切是如何重叠的,难道不有趣吗?
算法交易
Algo trading 通过根据一套定义的规则快速准确地执行订单,实现了金融市场交易流程的自动化。它们消除了人为错误(假设算法是在没有人为错误的情况下开发的),也消除了根据情绪采取行动的危险。生产中使用的算法可能相当复杂,并且需要针对低延迟系统进行大量优化。
我将对一只股票实施一个非常基本的策略(基于趋势)。使用简单的技术指标,如均线,趋势跟踪策略通常简单明了。有趣的是,我们将在算法中加入与公司相关的新闻中的定性元素(讽刺的是,这是基于情感的行为)。
情感分析
情感分析或观点挖掘是指使用 NLP、文本分析和计算语言学来确定主观信息或作者/主题/话题的情绪状态。它通常用于评论,为企业节省了大量手动阅读评论的时间。
Why bother reading the entire description on www.comp.nus.edu.sg/programmes/… when you could just mine a sentiment score out of it?
Why should you dampen your mood from reading unconstructive comments on your FB page?
就像算法交易一样,情绪分析也可以作为一个领域深入发展。除了给出积极/消极的情绪,我们还可以理解文本有多主观,不同情绪的强度(兴奋、沮丧等)。),如何莎士比亚式或特朗普式的文本,等等。
方法学
脸书最近面临很多反弹,我认为观察股票如何随着新闻情绪波动会很有趣。
这个想法很简单。我们在商业时报上搜索任何与脸书相关的文章,挖掘文本,获得每天的总体情绪,如果情绪上升 0.5,就买入 10 股,如果情绪下降 0.5,就卖出。请记住,情绪范围从-1 到 1,0 是中性的,我们使用前一天的情绪在当天交易。
擦
与我之前关于网络抓取的文章类似,我使用了同样的想法,从搜索页面中提取 URL,并访问每篇文章来挖掘其前一天的情绪。
Scraping Business Times articles related to Facebook
情感存储在字典中,例如{datetime.date(2018,7,5):-0.59,...,}
VADER 情感分析
VADER(用于情感推理的效价感知词典)是一个预建的情感分析模型,包含在 NLTK 包中。它可以给出积极/消极(极性)以及文本的情感强度(强度)。它以规则为基础,严重依赖人类通过亚马逊机械土耳其人(Amazon Mechanical Turk)对文本进行评级。亚马逊机械土耳其人是一个众包电子平台,利用人类智能来完成计算机目前无法完成的任务。这实际上意味着其他人已经为我们做了建立情感词汇的脏活。对我们来说,这些是单词或任何文本形式的交流,通常根据它们的语义取向被标记为正面或负面)。
Throwback to the good old days of Human Calculators
文本的情感得分可以通过对文本中每个词的强度求和,然后归一化得到。维达的人类评分员使用 5 种试探法来分析情绪:
- 标点 —我爱披萨 vs 我爱披萨!!
- 大写 —我饿了!!vs 我饿了!!
- 程度修饰语(强化词的使用) —我要吃饭!!VS 我好想吃!!
- 连词(情感极性的转变,随后决定极性) —我爱披萨,但我真的讨厌必胜客(差评)
- 先于三元组(通过检查词汇特征之前的三元组来识别相反的极性——加拿大比萨饼其实并没有 那么好。
然而,VADER 专注于社交媒体和短文本,不像财经新闻,它们几乎是相反的。我在笔记本中加入了一大块内容,用来自其他来源/词典的词汇+情绪来更新 VADER 词典,例如拉夫兰-麦克唐纳金融情绪词汇列表。
有了这样一个简单的代码,我们可以很容易地从一篇文章中获得情感。
from nltk.sentiment.vader import SentimentIntensityAnalyzernltk.download('vader_lexicon')
sia = SentimentIntensityAnalyzer()
polarity_scores(passage)['compound']
执行战略
最后,通过使用 backtrader 包,我们有了一个方便的框架来回溯测试和编写我们的交易策略。我使用了文档中的快速入门代码作为基础,并对其进行了修改,以包括我们的情感分数。
我指定了从 Yahoo Finance 获取的“FB”股票源,设置了 10 万美元的初始金额,每笔交易 10 手的固定规模,0.1%的佣金,以及一个简单的策略,如果前一天的情绪得分比前一天增加 0.5,就买入,如果减少 0.5,就卖出。
结果
Results from backtest with Day, Close, Sentiment Score, Details of Trade
我以 10 万美元开始,以 99742 美元结束。哈哈。对此我什么都不会说。
From top to bottom panels: 1) Cash Value across time 2) Net Profit/Loss 3) Buy/Sell orders executed at Green/Red markers 4) Sentiment Score.
好吧,这个结果有点出乎意料,因为现实比我们的模型要复杂得多。注意当情绪得分波动时,交易是如何执行的。事实上,这个模型/我肯定非常愚蠢,我们总是落后,在“炒作”之后立即执行交易。但你可以看到这一点,我们肯定可以通过纳入更多的技术指标来建立战略,甚至通过在更多相关的金融新闻上训练我们自己的模型(可以使用 NLTK)来改善情绪分析。
我希望你们都喜欢这本书,这次我对可读性和简洁性更加谨慎了。如果您有任何意见、反馈和想法,请留下。我真的很感激。下次见!
在 LinkedIn 或通过 jasonyip184@gmail.com 与我进一步讨论!
参考文献
http://datameetsmedia . com/Vader-情操-分析-解释/
部署机器学习从未如此容易
使用 Google App Engine 快速启动您的 sklearn 代码并在云中运行🚀
对于数据科学从业者来说,第一次从概念验证到实际工作产品可能会令人望而生畏。幸运的是,不断发展的云服务可以提供帮助。迈出部署的第一步并不像过去那样困难。
在这篇文章中,我将通过一个基于 sklearn 框架的例子来演示如何借助谷歌应用引擎轻松实现这一点。
A bartender spraying a cloud of App Engine smoke on a whiskey drink, making it ready for serving
当谈到为公司的需求构建机器学习应用程序时,工程师可能会热衷于遵循某些最佳实践。我个人的灵感来自于谷歌的 ML 规则,特别是:
规则#4 :保持 模型简单 和 架构 正确
来自一个以研究为导向的学术背景,我承认这是一个我很容易忽略的规则。与研究环境不同,在公司工作会让机器学习工程师面对其他类型的利益相关者,主要是:
- :对于工程师来说,能够提出可解释的结果、可解释的算法以及能够就此进行交流是很重要的。无论是哪种情况,黑匣子被批准和实际使用的机会总是较小,因为在监控它们时会出现困难。
- 其他工程师 :对于机器学习模型来说,不仅要以离线模式运行来描述过去的事件,还要提供预测能力,这些可能需要与公司 IT 基础设施的其余部分进行通信(例如在电子商务平台上提供实时建议,或者在打车应用程序上提供驾驶员的预计到达时间)。实现这一点的一种方法是将每个模型视为一个微服务,并使其通过 REST API 接口进行通信。
基础设施即服务( IaaS )和平台即服务( PaaS )提供商的大规模增长,使得机器学习工程师更容易部署实时产品,并确保估计器管道的可靠性。
在您可以用来部署模型的云工具中,值得一提的有:
- 【亚马逊网络服务(AWS) :弹性容器服务,SageMaker,Lambda
- 【谷歌云平台(GCP) :计算引擎、App 引擎、云 ML、云功能
- 其他 : Heroku,Algorithmia
在这篇文章中,我将展示如何利用云服务部署和服务一个简单的机器学习模型。
我将重点介绍 PaaS Google App Engine,它是一个完全托管的多功能工具,允许工程师构建几乎任何类型的应用程序。App Engine 附带了大多数流行语言(Java、PHP、Node.js、Python、C#)的标准运行时。Net,Ruby,Go)。它还支持定制运行时的 Docker 容器部署。
该项目
它是关于基于 Python 包 sklearn 中可用的 20Newsgroups 公共数据集部署文本分类器。
该数据集由论坛文本消息组成,从 20 个论坛/主题中取样。主题被同等地表示,每个论坛消息被分配给恰好一个主题。
文本分类器被设计成将字符串列表作为输入,并为每个字符串返回前 3 个最可能的论坛主题,以及置信度得分。
哪些工具
虽然 Google Cloud ML 提供了 sklearn ,但是只支持纯 sklearn 模型。包装的 sklearn 型号尚不支持。
因此,我们将使用多功能工具 App Engine 来训练包装的文本分类器,将其二进制表示转储到 Google 云存储中,从那里加载并交付预测。
我们将使用 Python、Google Cloud Python SDK、Flask/Gunicorn 进行应用部署,使用 sklearn 进行模型规范。
基础设施
这是我们将要构建的云基础架构的概述。
because an article on Google Cloud is not really one without a flow chart
1 |设置您的 Google 云项目
为了能够在 GCP 上部署应用程序,您首先需要设置一个项目 。特别是,你必须安装谷歌云软件开发工具包(T21),它允许你从命令行与 GCP 服务进行交互。*
在撰写本文时,谷歌提供了 12 个月的试用期,价值 300 美元。更多信息 此处 。
2 |编写 sklearn-Flask 应用程序
完整的资源库可以在 Github 上找到。其组织结构如下:
*/
|_ core.py # sklearn estimator definition
|_ main.py # Flask app definition
|_ requirements.txt # Python dependencies
|_ app.yaml # AppEngine config file*
一些代码亮点
core.py为一个(文本矢量器,分类器)Pipeline定义一个包装器类。它的fit方法获取20 个新闻组数据集*,并在其上安装**一个 20 类分类器。*
Custom sklearn wrapped estimator
main.py定义烧瓶应用程序。特别是,它有两个处理器/fit和/predict以及一个初始化处理器_load_model。
-
_load_model检查在环境变量GCS_BUCKET和GCS_BLOB指定的路径下是否有模型二进制文件,如果有加载它: -
fit_model适合一个TextClassifier转储到谷歌云存储: -
predict_from_model返回基于文本输入参数的预测,假定TextClassifier已经预先加载到内存中:
3 |配置
AppEngine 服务的所需配置通过app.yaml文件进行通信。特别是,您可以指定运行时、环境变量、实例资源以及一个entrypoint。这个项目的entrypoint基于我们的 Flask 应用程序启动了一个 Gunicorn 服务器。
App Engine configuration
4 |部署
如果你已经安装了 Google Cloud SDK,你可以cd进入项目的根目录并调用
*$ gcloud app deploy*
如果部署成功,返回消息应该是这样的(注意项目名称):
*Deployed service [textclassifier] to [https://textclassifier-dot-*my-project-name*.appspot.com]You can stream logs from the command line by running: $ gcloud app logs tail -s textclassifier To view your application in the web browser run: $ gcloud app browse -s textclassifier*
让我们做些测试,好吗?或者
*curl*它喜欢贝克汉姆⚽️
我们使用优秀的命令行工具curl向我们刚刚部署的端点发出 HTTP 请求。
测试 1:训练模型并将其转储到 GCS
*curl --request GET [https://textclassifier-dot-*my-project-name*.appspot.com/fit](https://textclassifier-dot-*my-project-name*.appspot.com/fit)*
几秒钟后返回
*Model successfully fitted and dumped to gs://textclassifier/model.joblib*
测试 2:获得预测
输入字符串是
"My car wont start.""I have been having a sore throat for a month"
*content_type="Content-Type: application/json"
request="POST"
data='{"text":["My car wont start.", "I have been having a sore throat for a month"]}'
http="https://textclassifier-dot-sephora-analytics.appspot.com/predict"curl --header "$content_type" \ --request POST \ --data "$data" \ $http*
返回
*[ [ { "label" : "rec.autos" "score" : 0.20318951690486 }, { "label" : "rec.motorcycles", "score" : 0.0730013311549759 }, { "label" : "misc.forsale", "score" : 0.0593155469643825 } ],
[ { "label" : "sci.med", "score" : 0.119263497157416 }, { "label" : "sci.crypt", "score" : 0.0616682653727299 }, { "label" : "talk.politics.guns", "score" : 0.0599605990114599 } ]
]*
我们所看到的
我们在 sklearn 和 Flask 之上构建了一个简单的 Python 应用程序。我们使用 Google App Engine 进行模型部署和服务,使用 Google Cloud Storage 进行模型二进制存储。这个例子已经尽可能的通用,以适应其他的用例,所以你没有理由不…
开始建造🔨!
图片来源:Artem Pochepetsky和Annie SprattUnsplash
马尔科夫蓝调:使用 VLMMs 和 PST 为 12 小节蓝调人工生成的旋律
想象一下,当你感到穷困潦倒时,你唯一的解决办法就是沉浸在一些忧郁中。你拿出吉他,开始弹奏 12 小节蓝调,很快意识到如果你的生活依赖于它,你就不能即兴创作,甚至不能唱歌。你站起来,砸碎你的吉他,反复观看柯基犬的视频,让自己感觉更好。
有了可变长度马尔可夫模型(VLMMs)和预测后缀树(PST ),你再也不必经历这一悲剧事件。使用这些算法,你可以人工生成你自己的蓝调旋律,而不必担心你缺乏天赋!
动机
当在作曲过程中遵循基于规则的方法时,音乐创作本身可以是相当算法化的。音乐理论的数学本质允许在对某些音乐作品或流派建模时进行非常有趣的分析。这让我们可以训练算法,可以为我们生成音乐!
许多机器学习算法被用于模拟音乐的序列方面。简单的基于规则的编程和复杂的深度学习技术已经被用来人工生成听起来非常自然的歌曲。在这个项目中,我们设计了一个简单的方法来模拟和生成 12 小节蓝调旋律。
将音乐建模为马尔可夫链
为旋律建模的一个简单方法是将其视为马尔可夫链。一阶马尔可夫链具有下面的 马尔可夫性质 或 无记忆性质 。
Markov Property
这就是说,序列中下一个状态的概率只是有条件地依赖于当前状态。在一段旋律中,下一个音符的值只取决于当前的音符,而不考虑之前旋律的其余部分。
考虑一下的前两小节,玛丽有只小羊羔
First two bars of Mary Had A Little Lamb
在这种情况下,我们有三种可能的状态:G,A,b。我们可以简单地用马尔可夫链来模拟这个旋律。
如果我们相信这个序列遵循马尔可夫性质,我们可以创建下面的转移矩阵 A:
Transition Matrix of 1st two bars of Mary Had A Little Lamb
当看这个表时,我们感兴趣的是从状态 i → j 或行→列转换的概率。比如从音符 G 到音符 A 的概率是 1/3。 (即 P(A|G) = 1/3)
请注意,下一个状态 j 仅依赖于当前状态 I,而不考虑之前的所有状态(即 i-1,i-2,… i = 1)。
在忽略历史的情况下,一阶马尔可夫链当然是对旋律建模的一种非常幼稚的方法。实际上,序列中的音符不仅依赖于之前的音符,还依赖于之前的 L 音符。这就把我们引向了一个叫做高阶马尔可夫链的马尔可夫链的扩展。
高阶马尔可夫链使用这种有限存储器 L 的思想,其中序列中的下一个状态取决于当前状态和 L-1 个先前状态。在音乐中,如果我们设置 L=3,我们可以说下一个音符有条件地依赖于前面的三个音符。
这样够好了吗?
不要!L 阶马氏链的缺点是关键字有限。在一阶马氏链的类似情况下,我们不能假设下一个音符只是条件依赖于前一个固定长度的 L 个音符。实际上,下一个音符取决于*上下文、*或实际序列本身。
这激发了灵活内存的概念。在过去的不同部分影响未来的情况下,我们将上下文大小 L 设置为变量而不是有限的。比方说,我们有一段音乐,它的上升全音阶序列和琶音序列具有相同的最小值和最大值。我们可以假设,平均来说,全音阶序列的上下文会比琶音序列长。
可变长度马尔可夫模型
VLMMs 允许比马尔可夫链或高阶马尔可夫链更真实的序列建模。他们能够在序列中封装模式,这是以前的模型所缺乏的。为了训练 VLMM,我们必须指出 L 的最大上下文长度和要考虑的序列应该出现的最小次数(nmin)。本质上,我们存储的是 0
Suffix Tries → Suffix Trees →Prediction Suffix Trees
The data structure that efficiently builds and stores VLMMs is a 预测后缀树的所有 I 阶马尔可夫链。要建立理解的基础,我们必须描述一下后缀 Trie 。
回到玛丽有只小羊羔的前两小节,我们有这样的顺序: G→A→B→A→G→G→G→G
Suffix Trie for first two bars of Mary Had A Little Lamb
下面的后缀 trie 可以从这个序列中创建。构建这棵树相当简单。从序列的开头开始,为整个序列创建一个节点路径。然后从序列的第二个音符开始,为该后缀创建一个节点路径。如果还没有为给定的符号创建根节点的子节点,则添加该子节点。否则,沿着路径,直到给定的序列还没有出现在树中;然后将其添加到相应的节点。我们这样做,直到我们到达序列的最后一个音符。
Suffix Tree for first two bars of Mary Had A Little Lamb
后缀 trie 可以很容易地转换成后缀树。前面的后缀 trie 被转换成下面的后缀树。后缀 trie 和后缀树之间的唯一区别是,后者将非分支路径折叠成具有单个节点的单条边。
现在我们对后缀树有了一个概念,让我们来看一下预测/概率后缀树。考虑下面的后缀树。
Suffix tree for BANANA$
该树遵循香蕉来表示序列的结束,这样更容易在树中定位结束序列节点。现在,PST 不再像传统后缀树那样自顶向下存储序列,而是以不同的方式构建。
PST for BANANA, A, B, N) respectively. L = 3 and nmin = 1
出于视觉目的,当 PST 侧放时更容易观察。该树按原样从左→右读取,如果垂直显示,则从下→上读取。终端节点代表后缀的开始。从根开始的直接子代是每个后缀的最后一个符号。
该 PST 的最大 L = 3,nmin = 1。此外,每个节点还保存后缀中的下一个符号的概率,这取决于它之前的后缀路径。比如 P($|A-N) = 0.33。根 e 包含生成任何序列的第一个符号的概率。
注意:$不会作为节点出现在这个树中,因为它出现在序列的末尾,没有任何后续状态。此外,请记住,树将根据参数设置(即 L 和 nmin)而变化。增加 L 将创建具有更长路径的树,增加 nmin 将创建稀疏树。
PST 的平滑参数
当使用 VLMMs 进行分类时,避免对序列的训练集过度拟合是很重要的。此外,如果您的目标是人工生成,我们当前的 PST 将只生成它所输入的数据中的序列。为了解决这个问题,我们设置了任意序列的最小概率(ymin)。在下图中,我们设置 ymin = 0.01。
PST for BANANA$ with L = 3, nmin = 1 and ymin=0.01
该平滑参数的添加将减少分类模型的方差,使得它对模型未被训练的观察不敏感。该参数还允许在音乐生成的上下文中有一些艺术自由度。
修剪 PST
像在决策树中一样,我们有能力修剪我们的概率后缀树。我们的重点是从底层到根的子节点的序列分布。从终端节点开始,我们检查与没有前缀的上下文相比,具有这个前缀是否提供了关于最后符号的条件概率的更多信息。例如,与 A|A 相比,A|N-A 能为我们提供多少信息?为了正式确定是否修剪节点,我们执行以下计算。
Pruning equation
等等什么?这个看似复杂的方程,本质上很简单。我们来分解一下!
首先,分数确定后缀的概率分布是否与其父后缀相似,其中相似性由值 C 控制。参数 C 本质上约束了概率商。方括号外的大“I”是一个指示函数,如果计算结果为真,则产生 1,否则产生 0。指示器确定如果给定任何序列 c 和没有其第一个符号 suf(c) 的相同序列,在序列末尾的任何新符号的概率在两者之间是否会显著不同?然后我们加起来有多少新符号是真的(因此是求和符号)。如果对于至少一个新符号这是真的(≥1 项),那么我们将保留该节点。否则,修剪!
修剪将通过移除不提供显著信息增益的节点来减轻 PST 的复杂性(我们可以没有它们)。此外,如果您的 L、nmin 和 ymin 的初始设置创建了一个非常复杂的树,修剪将简化它!但是,您仍然应该花时间来适当地优化这些初始参数。
创作蓝调
马尔可夫链或 VLMMs 的结构本身并不复杂。困难在于试图实际定义什么是状态。到目前为止,我们只是在模型中使用旋律的音高值作为状态。下一节将揭示这种方法的缺点,并解释创建状态的更好的方法。然后,我们解释了一个旋律是如何产生的,并证明了 12 小节蓝调旋律使用多个 PST 模型的合理性。
编码状态
分析旋律序列时,考虑每个音符的音高和持续时间是很重要的。如果我们把音高和音长结合在一起,我们会有一个巨大的状态空间。例如,如果我们将粒度级别的持续时间视为至少 1/4(四分音符)的值,我们将有四种不同类型的持续时间值要考虑(即,1/4:四分之一、1/2:一半、3/4:点分四分之一和 1:整)。考虑到四个不同的持续时间值和 12 个音高,我们最终得到 48 个状态。进一步分解持续时间将会成倍地增加我们的状态空间。
为了简化我们的模型,并保持一个较小的状态空间,我们决定将各个时间段视为状态,而不是各个音符。我们把每首歌分解成持续一个酒吧⅛的时间段;一首 12 小节蓝调基本上包含 128 = 96 个事件。每个事件用音调值与二进制值的组合来编码(即,S =停留,L =离开)。*
All durations and encodings of note A
使用这种编码,我们总共有 26 种不同的状态!这来自 12 个不同的音高、1 个休止符和两个延音符号(即 _S 和 _L)。对于我们来说,生成所需长度的序列也容易得多。在具有相同长度的序列固有地具有不同持续时间的情况下,我们以前的方法会很困难。
数据集
歌曲的主体来自老式爵士乐标准假书,其中包括 20 世纪早期到中期的数百个爵士乐标准的铅表。标志性的 12 小节蓝调结构推动了低音线,刺激了架子鼓,触动了象牙,并拉伸了大多数歌曲的声带。在任何调中遵循 12 小节布鲁斯结构的任何线都包含在数据集中。
12-Bar Blues Chord Structure
手动对导音表进行数字编码,记录每个音符及其在旋律中各自的持续时间。我们的语料库继续增长,但目前有 22 个 12 小节蓝调旋律序列,每个序列包含 96 个事件!
建模方案
有了这组 12 小节的蓝调旋律以及编码状态的方法,我们应该如何构建模拟蓝调旋律的模型呢?
注意 12 小节蓝调的严格结构。几乎所有的和弦都不止出现一次。主和弦 I 在这个和弦进行中最多出现八次。此外,当有多个部分具有相同的基本和弦时,旋律的小部分肯定会重复。例如,在现代音乐中,韵文和合唱总是分别有相似的旋律。
如果我们要将原始的 12 小节蓝调分割成两小节部分,我们将得到以下小节序列。
12-Bar Blues Structure with two-bar segments
然后我们决定为每首歌的每两个小节建立一个单独的模型。这给了我们总共六个不同的模型。我们计算了六个部分的 PST 分布之间的成对散度测量。这类似于比较两个分布之间相似性的 KL 散度度量。在信息论中,KL 散度通常用于评估压缩某些文件并确保它包含与原始文件一样多的信息的效率。
在我们的例子中,成对散度的低值表示分布非常相似,反之亦然。这意味着我们可以在不丢失信息的情况下互换使用它们。热图显示,Ia、Ib、Ic 和 Id 部分具有相似的分布。因此,我们可以删除六个模型中的三个,只保留第一个 Ia 模型,将其视为通用 I 模型。
产生旋律
我们剩下三个模型:Ia、IV 和 v。要创建旋律,我们只需从每个模型生成一个两小节序列,并将它们连接在一起。多亏了我们的编码方法,生成双条码序列变得很容易!我们需要做的就是创建长度为 16 的序列,因为每个符号都有一个音高和 1/8 的持续时间值。I 模型的输出将重复四次,以模拟 12 小节蓝调的结构。瞧啊。我们有一段 12 小节的蓝调旋律。
让我们来点刺激的!使用 GarageBand,我添加了一个节奏部分,还将时髦的电脑发声旋律设置到了干净吉他乐器设置中。
摘要
这个项目描述了一种使用可变长度马尔可夫模型生成 12 小节蓝调旋律的方法。修剪的概率后缀树被很好地构造以适合 VLMM,这有助于我们分析和生成新的序列。我们用精心编码的 1/8 音符状态填充 PST,以考虑音高和持续时间。我们还证明了只需要 3 个不同的模型来生成完整的 12 小节旋律。
未来的工作
这种方法可以应用于任何遵循重复和弦进行的音乐流派。许多现代歌曲遵循类似的和弦结构,其旋律可以用 VLMMs 和 PST 来建模。我们甚至可以模拟不同的乐器部件,甚至和弦结构本身!VLMMs 也是 NLP 的很好的模型,所以创作歌词也是可能的。那我们就有了一个完全人工生成的乐队!
所有生成你自己旋律的数据和代码都可以在这里找到。下载回购协议后,只需运行 generateFunction 中的脚本。R 文件,用合适的参数调用 generateMelody() 函数。在 generated_melodies/wav/ 路径下会创建一个 wav 文件。保持原样或者添加到generated _ melodies/midi/blues _ backing 中的背景音轨。**
要进一步了解 VLMMs 和 PST,请参考本文件。用于构建 PSTs 的 R 包的文档在这里是。 这里有一个帮助理解 PST 和使用 R 包的指南。
如有任何问题,请随时联系我。希望你喜欢这篇文章!
搜索引擎和神经网络
在我们的生活中,没有一天我们不使用谷歌,“谷歌搜索”这个术语已经悄悄进入我们的生活,现在已经成为一种必需品。我们想到的第一个问题可能是谷歌是如何做到的?谷歌,作为一个已经进入如此多专业领域的公司,但对于一个门外汉来说,谷歌总是“搜索引擎”的同义词。搜索结果中的付费广告在公司收入中扮演着重要的角色。他们的搜索引擎有很多竞争对手,比如日本的雅虎,俄罗斯的 Yandex 等等,但是没有一家像谷歌一样吸引了全球的关注。那么这个搜索引擎背后是什么呢?它崛起了,它仍然是搜索引擎中最好的原因与它的底层架构有很大关系。它们背后的主要概念是什么?
信息检索就是这样一个概念,它涉及对搜索引擎的研究。
这是搜索术语时最相关结果的第一行。这来自它的维基百科页面,因为谷歌已经将维基百科整合到他们的搜索结果中。聪明的策略?当然,鉴于维基百科拥有所有常用词汇和技术的最可信数据集。
Google’s Result Page for ‘Information Retrieval”
这里可以清楚地看到 dictionary 元素的使用。他们有自己的字典,如果这个单词有共同的意义或者不是很多单词的组合,它会显示为第一个结果。基本上,如果与搜索的单词直接匹配,它会显示字典作为结果。在这种情况下,所有部分案例都将被忽略。例如,如果我在前面的查询中添加了单词 concept,那么字典结果不会显示出来。
Google’s Result Page for “information retrieval concept”
现在有一个不同的方法,显示了维基百科页面的预览。如果我们以这种方式继续下去,谷歌的搜索平台将有大量的东西可以探索。让我们回到这里的概念。信息检索:从网络上检索信息并与用户的查询相匹配的概念。给用户提供最相关的结果是搜索引擎行业的标准。我经常使用谷歌的“我感觉很幸运”来查询显而易见的问题的原因。那么他们用什么模型在我们的搜索结果中对页面进行排名呢?
PageRank:-以谷歌创始人之一拉里·佩奇命名的算法最初被称为 BackRub,当时它仍是斯坦福大学的一个研究项目,因为它用于跟踪反向链接以确定网站的重要性。这不是决定页面排名的唯一算法。有超过 250 个其他指标显然是一个秘密,所以我们每天得到的搜索结果是不掺杂的。
咖啡因升级:-推出于 2009 年,这次升级提高了获得搜索结果的速度和更新的索引架构。随着来自微软的 Bing 的竞争,他们转向了 Bigtable,公司的分布式数据库平台。
蜂鸟升级:-蜂鸟是世界上最小也是最快的鸟之一。为了证明这次升级的名称,谷歌在 2013 年增加了改进的功能,在搜索结果中包括网站的特定相关页面,而不是网站的主页。有一个明确的重点是人类搜索互动,从而使它成为一个更好的搜索引擎。
谷歌还做了许多其他改变,比如为用户提供更好的搜索引擎优化功能、知识图表(2012 年)、专用移动搜索结果(2016 年)等等。除了谷歌在他们的产品上所做的,搜索引擎还有其他的进步。从我收集的资源来看,其中最重要的是神经网络在网络搜索中的应用。神经网络已经存在了很长一段时间,但没有人想到过使用深度神经网络来改进搜索引擎,直到 2016 年发表了一篇题为“网络搜索的神经点击模型”的研究论文
用户行为是改进搜索引擎的关键部分。这就是点击模型发挥作用的时候了。下面是研究论文中的一部分,对其进行了总结
这些模型也称为点击模型,因为主要观察到的用户与搜索系统的交互涉及点击,这些模型用于点击预测,并且它们可以在我们没有真实用户进行实验或者因为害怕伤害用户体验而不愿意与真实用户进行实验的情况下提供帮助。点击模型还用于改进文档排名(即,从点击模型预测的点击中推断文档相关性)、改进评估度量(例如,基于模型的度量)以及通过检查点击模型的参数来更好地理解用户
点击模型的两种方法:
- PGM(概率图形模型):用户行为被表示为一系列可观察和隐藏的事件,如点击、跳过和文档检查。现在为了更好地理解,把一个事件想象成一个有向图。它有一些有向边形式的依赖关系。现在,在基于 PGM 的点击模型中,我们必须手动设置这些依赖关系的结构。不同的车型(UBM、DBN、CM 等)有不同的标准。下图清楚地证明了有向图的工作原理。
Cascade Click Model Representation(From this Survey)
- DR(分布式表示方法):在这里,用户行为被表示为向量状态,这些向量状态以他/她的信息需求和会话期间消耗的信息的形式捕获用户的行为。这让我们能够挖掘比 PGM 的二进制事件更复杂的模式。神经点击模型是基于这一概念的方法。该模型学习与传统点击模型中使用的概念相似的概念,并且它还学习其他不能手动设计的概念。
在这个神经点击模型中,用户行为被建模为用户信息需求的分布式表示的序列和用户在搜索期间消费的信息。与现有的点击模型相比,所提出的框架的主要优势是用户行为模式可以直接从交互数据中学习,这 允许我们捕获比 现有点击模型中硬编码的用户行为模式更复杂的用户行为模式。Yandex(俄罗斯流行的搜索引擎)的资源被用于评估该模型,并且在点击预测和相关性预测任务中有显著的改进。
Different configurations of NNs explained in the research paper
谷歌在这方面的进展如何?就像可口可乐的配方一样,谷歌搜索中的精确算法是一个秘密。尽管不可否认,他们从 2016 年开始在自己的架构中使用深度神经网络。这里有一篇连线文章更详细地讨论了这个话题。每个人都确信的一件事是,神经网络是信息检索中的下一件大事。从 WSDM 2018(网络搜索和数据挖掘)到 ECIR 2018(欧洲信息检索会议)的所有会议都有关于同一主题的演讲。
作为临别赠言,我想说这篇文章可能在你的脑海中引起了更多的疑问。这只是我在不久的将来将要做的一系列文章的介绍,这些文章将对包括神经点击模型在内的每个模型进行更深入的分析(以及代码片段)。
人体活动识别(HAR)教程(第 1 部分)
如何将 Keras 模型加载到您的 iOS 项目中的分步指南
Photo: a-image/Shutterstock
如果你想在任何 iOS 设备上快速部署神经网络,Keras 和苹果的 Core ML 是一个非常强大的工具集。大多数其他教程侧重于图像识别的流行的 MNIST 数据集。我们将超越这个广泛覆盖的机器学习例子。相反,您将学习如何处理时间分片的多维传感器数据。
更具体地说,我们将训练一个深度神经网络(DNN),以识别运动的类型(行走、跑步、慢跑等)。)基于来自围绕人的腰部携带的移动设备的一组给定的加速度计数据。在本教程中,我们将使用 WISDM 数据集( WISDM )。
本文介绍的方法应该适用于您在物联网(IOT)中可能遇到的任何其他传感器数据。本文将带您完成以下步骤:
- 从 WISDM 数据集中加载加速度计数据
- 将加速度计数据转换并重新格式化为时间片表示
- 可视化加速度计数据
- 重塑多维表格数据的形状,使其被 Keras 接受
- 将数据集分成训练集、验证集和测试集
- 在 Keras 中定义一个深度神经网络模型,该模型稍后可以由苹果的核心 ML 处理
- 为人体活动识别数据训练深度神经网络
- 使用学习曲线和混淆矩阵,对照测试数据验证训练好的 DNN 的性能
- 为核心 ML 导出训练好的 Keras DNN 模型
- 通过在 Python 中进行样本预测,确保核心 ML 模型被正确导出
- 在 Xcode 中创建一个游乐场,并导入已经训练好的 Keras 模型
- 使用 Apple 的核心 ML 库,以便使用 Swift 预测给定数据集的结果
执行本文中解释的所有步骤的先决条件(包括测试代码的版本号):
- Python(版本 3.6.5)
- Keras(版本 2.1.6)
- 张量流(版本 1.7.0)
- Coremltools(版本 2.0)
**不在本文讨论范围之内:**为这种类型的问题语句创建具有最高性能的完美机器学习模型不是本演练的重点。
您可能想知道为什么本文选择 Keras 而不是其他框架,即 TensorFlow。有两个主要原因:
- Keras 非常容易学习,并且拥有比 TensorFlow 更现代、更直观的 API,同时仍然在后端利用 TensorFlow 的功能
- 有多个 TensorFlow APIs 在尝试使用更方便的估算器 API(这也是 TensorFlow 团队推荐的——你可以在这里找到更多信息这里)时,我在将经过训练的估算器转换为核心 ML 时遇到了编译问题
概念概述
在我们介绍 Python 和 Xcode 中的不同步骤之前,让我们简要地看一下问题陈述和我们的解决方案。我们使用的数据集是从智能手机上采集的加速度计数据,不同的人在进行六种不同的运动(下楼、慢跑、坐着、站着、上楼、走路)时随身携带该智能手机。对于每个练习,测量 x、y 和 z 轴的加速度,并用时间戳和个人 ID 捕获。
有了这些可用的数据,我们想训练一个神经网络,以了解一个人携带智能手机是否正在进行这六种活动中的任何一种。一旦神经网络根据现有数据进行了训练,它应该能够在给定以前看不到的数据时,正确预测一个人正在进行的活动类型。
这个问题的解决方案是深度神经网络。基于可用的数据,它将学习如何区分六种活动中的每一种。然后,我们可以向神经网络显示新数据,它会告诉我们用户在任何特定时间点正在做什么。这个问题的解决方案如下图所示。
“Deep Neural Network Example” by Nils Ackermann is licensed under Creative Commons CC BY-ND 4.0
下面描述了解决机器学习问题的典型步骤。在整篇文章中,我们将经历一个非常相似的过程。
“Machine Learning Workflow” by Nils Ackermann is licensed under Creative Commons CC BY-ND 4.0
导入库
首先,我们需要导入所有必要的 python 库。如果您缺少其中一些,请使用 pip 安装程序安装它们。
导入库之后,让我们设置一些标准参数并打印出我们已经安装的 Keras 版本。WISDM 数据集包含六个不同的标签(楼下、慢跑、坐着、站着、上楼、走路)。因为我们将多次使用标签列表,所以我们为它们创建一个常量(标签)。下一个常量 TIME_PERIODS 存储时间段的长度。常量 STEP_DISTANCE 确定两个连续时间段之间的重叠量。
keras version 2.1.6
加载、检查和转换加速度计数据
接下来,你需要在这里下载的数据集并保存在本地。重要的文件是 WISDM_ar_v1.1_raw.txt,在进行导入之前,我们先定义几个方便的函数,以便读取数据和显示数据的一些基本信息。
数据成功加载到数据帧中。现在,我们可以显示数据帧的前 20 条记录,并进一步了解数据的分布情况。
Number of columns in the dataframe: 6
Number of rows in the dataframe: 1098203
正如我们所看到的,我们有更多关于步行和慢跑活动的数据,而不是其他活动。我们还可以看到有 36 个人参与了实验。
接下来,让我们来看看所有六个可能活动的三个轴的加速度计数据。数据以 20 赫兹的采样率记录(每秒 20 个值)。因为我们显示了前 180 条记录,所以每个图表显示了六个活动中每个活动的 9 秒间隔(计算:0.05 * 180 = 9 秒)。我们将使用两个函数(我从这里借用了)来绘制数据。
正如所料,与坐着相比,慢跑和散步等活动的加速度更高。在我们继续之前,我们将在数据帧中再添加一个名为“ActivityEncoded”的列,其中包含每个活动的编码值:下楼、慢跑、坐着、站着、上楼、散步
这是必要的,因为深度神经网络不能与非数字标签一起工作。有了 LabelEncoder,我们能够轻松地转换回原来的标签文本。
将数据分成训练集和测试集
将整个数据集分成训练集和测试集是很重要的。通常,您会看到数据分割方式上的错误。无论您决定如何分割数据,您都不希望来自测试集的信息渗透到您的训练集中。这可能对您的模型在训练期间的整体性能有很大帮助,然后根据测试集进行验证。但是你的模型不太可能很好地概括它还没有见过的数据。
分裂背后的想法是:我们希望我们的神经网络从几个经历过实验的人那里学习。接下来,我们想看看我们的神经网络预测以前没有见过的人的运动有多好。
要避免的数据分割
仅仅担心每个活动至少有几个示例记录是不够的。您将冒这样的风险:在训练集中,您可能有三个关于人 5 的活动“行走”的记录,而在测试集中,有一个关于人 5 的活动“行走”的记录。当然,在这种情况下,您的模型会表现得很好,因为它已经在训练期间看到了第 5 个人的移动模式。始终对 DNN 的性能持批评态度,这可能是因为一开始就进行了错误的数据分割。
更好的分割方法
在我们的例子中,让我们根据用户 id 进行划分。我们将保留 ID 为 1 到 28 的用户用于训练模型,ID 大于 28 的用户用于测试集。
规范化培训数据
接下来,我们需要在训练数据中标准化我们的特征。当然,有各种各样的方法来标准化。请记住,以后在向神经网络输入新数据时,您会使用相同的归一化算法。否则你的预测将会是错误的。除了标准化之外,我们还将对这三个特征进行舍入。
将数据重组为片段,并为 Keras 做准备
数据帧中包含的数据尚未准备好输入神经网络。因此,我们需要重塑它。让我们为此创建另一个名为“创建 _ 段 _ 和 _ 标签”的函数。该函数将接收数据帧和标签名称(我们在开始时定义的常量)以及每个记录的长度。在我们的例子中,让我们进行 80 步(参见前面定义的常数)。考虑到 20 Hz 的采样率,这等于 4 秒的时间间隔(计算:0.05 * 80 = 4)。除了对数据进行整形之外,该函数还会将要素(x-加速度、y-加速度、z-加速度)和标注(相关活动)分开。
现在,你应该在 x 列车和 y 列车上都有 20.868 的记录。x_train 中的 20.868 个记录中的每一个都是形状为 80x3 的二维矩阵。
x_train shape: (20868, 80, 3)
20868 training samples
y_train shape: (20868,)
为了构建我们的深度神经网络,我们现在应该存储以下维度:
- 时间段数:这是一个记录中的时间段数(因为我们希望有 4 秒的时间间隔,所以在我们的例子中这个数字是 80)
- 传感器数量:这是 3 个,因为我们只使用 x、y 和 z 轴上的加速度
- 类别数量:这是神经网络中输出层的节点数量。因为我们希望我们的神经网络预测活动的类型,我们将从我们之前使用的编码器中获取类的数量。
['Downstairs', 'Jogging', 'Sitting', 'Standing', 'Upstairs', 'Walking']
我们希望输入网络的数据是二维的(80x3)。不幸的是,Keras 和 Core ML 不能同时处理多维输入数据。因此,我们需要将输入层的数据“展平”到神经网络中。我们将输入一个包含 240 个值的列表,而不是一个形状为 80x3 的矩阵。
x_train shape: (20868, 240)
input_shape: 240
在继续之前,我们需要将所有特征数据(x_train)和标签数据(y_train)转换成 Keras 接受的数据类型。
我们几乎完成了数据的准备工作。我们需要做的最后一步是对我们的标签进行一次性编码。请只执行这一行一次!
New y_train shape: (20868, 6)
在 Keras 中创建深度神经网络模型
到现在为止,你已经完成了你这边所有的负重。数据以这样的格式准备好了,Keras 将能够处理它。我已经决定创建一个具有 3 个隐藏层的神经网络,每个隐藏层有 100 个完全连接的节点(可以随意改变网络的形状,甚至切换到更复杂的网络,如卷积神经网络)。
重要提示:正如您所记得的,我们已经将输入数据从 80x3 矩阵重新整形为长度为 240 的向量,以便 Apple 的 Core ML 可以稍后处理我们的数据。为了扭转这种情况,我们在神经网络中的第一层将把数据重塑为“旧”格式。最后两层将再次展平数据,然后运行 softmax 激活函数来计算每个类的概率。请记住,在我们的案例中,我们使用了六个类别(下楼、慢跑、坐着、站着、上楼、走路)。
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
reshape_2 (Reshape) (None, 80, 3) 0
_________________________________________________________________
dense_5 (Dense) (None, 80, 100) 400
_________________________________________________________________
dense_6 (Dense) (None, 80, 100) 10100
_________________________________________________________________
dense_7 (Dense) (None, 80, 100) 10100
_________________________________________________________________
flatten_2 (Flatten) (None, 8000) 0
_________________________________________________________________
dense_8 (Dense) (None, 6) 48006
=================================================================
Total params: 68,606
Trainable params: 68,606
Non-trainable params: 0
_________________________________________________________________
None
在 Keras 中拟合 DNN 模型
接下来,我们将使用之前准备的训练数据来训练模型。我们将定义一个关于训练准确性的早期停止回调监视器:如果训练在连续两个时期内未能提高,那么训练将以最佳模型停止。用于训练的超参数非常简单:我们将使用 400 个记录的批量大小,并将训练 50 个时期的模型。对于模型训练,我们将使用 80:20 分割来分离训练数据和验证数据。就这么简单。所以让我们继续训练我们的模型。不同的超参数有一些很好的解释,比如这里的和。
这款简单的 DNN 性能还可以。我们的验证准确率约为 74%。这肯定可以改进,也许通过进一步的超参数调整,特别是通过修改神经网络设计。在我们继续测试验证之前,我们将打印训练和验证数据集的学习曲线。
precision recall f1-score support
0.0 0.70 0.42 0.53 1864
1.0 0.98 0.98 0.98 6567
2.0 0.99 0.99 0.99 1050
3.0 0.99 0.99 0.99 833
4.0 0.66 0.63 0.64 2342
5.0 0.85 0.93 0.89 8212
avg / total 0.87 0.87 0.87 20868
对照测试数据进行检查
让我们继续这个模型,看看它在我们之前保留的测试数据中表现如何。在我们的例子中,我们将根据模型尚未看到的六个用户的运动来检查性能。
6584/6584 [==============================] - 1s 128us/step
Accuracy on test data: 0.76
Loss on test data: 1.39
测试数据的准确率为 76%。这意味着我们的模型对尚未见过的人有很好的推广性。让我们看看我们的模型在哪里错误地预测了标签。
precision recall f1-score support
0 0.61 0.27 0.37 650
1 0.80 0.95 0.87 1990
2 0.82 0.99 0.90 452
3 0.91 0.74 0.81 370
4 0.48 0.42 0.45 725
5 0.77 0.79 0.78 2397
avg / total 0.74 0.76 0.74 6584
正如您所看到的,模型的精度对于预测慢跑(1)、坐着(2)、站着(3)和行走(5)是很好的。该模型对于清楚地识别楼上和楼下的活动有问题。
当然,改进模型仍有很大的潜力,例如,通过使用更先进的神经网络设计,如卷积神经网络(CNN)或长短期记忆(LSTM)。我可能会在以后的文章中探讨这个问题。对于我们展示端到端流程的目的来说,这个结果已经足够好了。
冻结核心 ML 的 Keras 模型
如果您对该模型及其性能满意,您应该现在就将其转换,以便与 Core ML 一起使用。convert 函数只接受几个参数:
- 对您的 Keras 模型的引用
- 要为输入数据指定的名称;在我们的例子中,我们将加速度数据输入网络
- 要分配给输出的名称
- “人类可读的”标签名称;你可以再次使用我们在开始时定义的标签常数
input {
name: "acceleration"
type {
multiArrayType {
shape: 240
dataType: DOUBLE
}
}
}
output {
name: "output"
type {
dictionaryType {
stringKeyType {
}
}
}
}
output {
name: "classLabel"
type {
stringType {
}
}
}
predictedFeatureName: "classLabel"
predictedProbabilitiesName: "output"
将 Keras 预测与核心 ML 预测进行比较
在使用您的核心 ML 模型之前,让我们确保导出是成功的,并且当给定一个随机数据集时,我们的 Keras 模型和核心 ML 模型提供相同的预测。
Prediction from Keras:
Jogging
Prediction from Coreml:
Jogging
好消息!对于索引为 1 的记录,Keras 和 Core ML 都预测相同的标签,即慢跑。我们现在可以在任何 iOS 设备上使用我们的核心 ML 模型了。
总结和下一步
在本文中,您已经学习了如何加载和转换复杂的加速度计数据,并通过 Keras 中的深度神经网络运行它。您将训练好的模型导出到一个核心 ML 文件中。在我的下一篇文章中,我将向您介绍在一个简单的 Swift 程序中使用这一经过培训的核心 ML 模型的必要步骤。然后,您可以使用这些知识将 DNN 部署到任何 iOS 设备上。
本文的 Jupyter 笔记本可以在 github 上获得。
链接和参考
- 官方巨蟒网站
- 官方网站
- 官方 TensorFlow 网站
- 苹果官方核心 ML 文档
- 苹果官方 coremltools github 仓库
- 很好的概述来决定哪个框架适合你: TensorFlow 还是 Keras
- Aaqib Saeed 关于人类活动识别的卷积神经网络(CNN)的好文章(也使用 WISDM 数据集)
- 另一篇文章也使用了通过 TensorFlow 实现的 WISDM 数据集和由维尼林·瓦尔科夫撰写的更复杂的 LSTM 模型
放弃
本网站上的帖子是我个人的,不一定代表我的雇主的帖子、策略或观点。
使用 Keras 和 Core ML 的人体活动识别(HAR)教程(第 2 部分)
如何将 Keras 模型加载到您的 iOS 项目中的分步指南
Photo: a-image/Shutterstock
我之前的文章讲述了在 Python 中使用苹果的 Core ML 工具从 Keras 创建一个多维深度神经网络的核心 ML 文件(DNN)。如果你想知道如何在不创建完整的 iOS 应用程序的情况下,在 Swift 操场上快速测试这个模型,请继续阅读。本文将涵盖以下步骤:
- 将核心 ML 模型文件加载到 Xcode 中
- 检索生成的核心 ML 存根源和编译的核心 ML 模型
- 创建一个 Xcode 游乐场,并导入核心 ML 存根源和编译的核心 ML 模型
- 写几行 Swift 代码,以便对多维传感器数据进行预测
将核心 ML 文件加载到 Xcode 中
为了在 Swift 操场上使用任何 Core ML 模型,首先需要创建一个常规的 Xcode 项目(例如,单视图应用程序)。一旦项目被创建,搜索文件HARClassifier.mlmodel,这是你在我上一篇文章中作为最后一步创建的。将文件拖放到您创建的 Xcode 项目中。
Drag and drop the mlmodel file into Xcode
如果您单击 Xcode 中的HARClassifier.mlmodel,模型评估参数将与我们在 Keras 中定义的输入和输出相匹配:
- **输入:**这是一个包含 240 个条目的多数组(原始 80 x 3 矩阵的平面向量)
- **输出:**输出参数将六项活动中每一项的概率存储为字典;classLabel 参数是一个字符串,包含给定输入的最可能活动的名称
接下来,您需要两件工艺品来为您的游乐场做准备:
- **核心 ML 存根来源:**在“模型评估参数”部分上方,您将看到一个名为“模型类”的部分。核心 ML 模型的导入也创建了必要的 Swift 代码,以便在操场上使用该模型。如果单击类名 HARClassifier 旁边的箭头,您可以查看已生成的代码。
- **核心 ML 模型的编译版本:**继续构建并运行您的应用程序。一旦您的应用程序已经构建并且模拟器已经启动,您必须检索编译的
.mlmodelc文件。打开取景器并按下CMD-Shift-G,然后进入以下路径~/Library/Developer/Xcode/DerivedData。导航到为您的应用程序创建的文件夹。在那里,进入文件夹Build/Products/Debug-iphonesimulator,显示程序MediumHARTutorial的包内容(或者你给你的 Xcode 项目取的任何名字)。最后,在这里你会找到文件夹HARClassifier.mlmodelc。这是模型的编译版本。
Retrieve the model class and the compiled Core ML model
有了这两件艺术品,你现在就可以创建你的 Swift 游乐场了。
创建一个新的 Swift 游乐场
返回 Xcode,创建一个新的(空白)playground 文件。在 playground 中,将编译后的核心 ML 模型添加到Resources文件夹中,将 Swift 源文件添加到Sources文件夹中。
Add model class and compiled Core ML model to the playground
在导入核心 ML 模型期间创建的存根源都有一个内部保护级别。您需要将所有三个类及其成员都改为public(文件在本文末尾引用),以便在您的游戏中使用它们。生成的三个类是:
- 定义类型
MLFeatureProvider的模型预测输入的类。 - 定义类型
MLFeatureProvider的模型预测输出的类。 - 该类提供对核心 ML 模型的访问,主要用于通过
prediction函数进行推理。
做预测
现在,是时候在 Swift 中最终做出预测了。为此,您只需要几行代码。
实际上,您可以直接从加速度计加载传感器数据,并进行与训练期间相同的归一化预处理。出于简单的原因,您可以简单地将选定的传感器序列从 Python 复制并粘贴到 XCode 中,然后处理结果。
Swift Core ML example code to make predictions for accelerometer data
XCode Playground 中的输出显示了概率最高的预测标签以及所有其他标签的概率。
Predicted label: Upstairs
Probability per label: ["Sitting": 2.0439521186688125e-09, "Jogging": 0.00010426577500766143, "Upstairs": 0.49756348133087158, "Standing": 1.2845226184804437e-12, "Walking": 0.11116743087768555, "Downstairs": 0.39116477966308594]
摘要
在前一篇文章和本文中,我们经历了在 Keras 中创建机器学习模型、将其导入 Xcode 并使用 Swift 编程语言在 iOS 中进行预测的端到端过程。操场文件和 Jupyter 笔记本(来自上一篇文章)可以在 Github 上获得。
放弃
本网站上的帖子是我个人的,不一定代表我的雇主的帖子、策略或观点。
人类可解释的机器学习的重要性
可解释的人工智能(第一部分)
人类可解释机器学习和模型解释简介
介绍
本文是我针对 ***【可解释的人工智能(XAI)】***系列文章的第一篇。由机器学习和深度学习推动的人工智能领域在过去十年中经历了一些惊人的变化。最初只是一个纯学术和研究导向的领域,我们已经看到广泛的行业采用了不同的领域,包括零售,技术,医疗保健,科学和更多。数据科学和机器学习在 21 世纪的主要目标不再只是进行实验室实验来发表研究论文,而是转变为处理和解决现实世界的问题,自动化复杂的任务,让我们的生活变得更加轻松和美好。更多时候,机器学习、统计或深度学习模型的标准工具箱保持不变。像 胶囊网络 这样的新模式确实出现了,但行业采用同样的模式通常需要几年时间。因此,在行业中,数据科学或机器学习的主要关注点更多的是 【应用】 而不是理论,在正确的数据上有效应用这些模型以解决复杂的现实世界问题至关重要。
机器学习模型本身由一种算法组成,该算法试图从数据中学习潜在的模式和关系,而不是硬编码的固定规则。因此,向业务解释模型如何工作总是会带来一系列挑战。在该行业的一些领域,特别是在保险或银行等金融领域,数据科学家最终往往不得不使用更传统的机器学习模型(线性或基于树的模型)。原因是模型的可解释性对于解释模型所采取的每一个决策是非常重要的。但是,这通常会导致牺牲性能。这就是像集成和神经网络这样的复杂模型通常给我们更好和更准确的性能的地方(因为真实的关系在本质上很少是线性的)。然而,我们最终无法对模型决策做出正确的解释。为了解决和讨论这些差距,我将写一系列文章,在这些文章中,我们将深入探索可解释的人工智能(XAI)和人类可解释的机器学习的一些挑战。
本系列的大纲
我们将在这一系列文章中涉及的一些主要领域包括。
第 1 部分:人类可解释的机器学习的重要性
- 理解机器学习模型解释
- 机器学习模型解释的重要性
- 模型解释方法的标准
- 模型解释的范围
第 2 部分:模型解释策略
- 模型解释的传统技术
- 传统技术的挑战和局限
- 准确性与可解释性的权衡
- 模型解释技术
第 3 部分:动手模型解释——综合指南
- 关于使用最新的模型解释框架的实践指南
- 使用 ELI5、Skater 和 SHAP 等框架的特点、概念和示例
- 探索概念并观察它们的实际应用——特征重要性、部分相关图、替代模型、用石灰的解释和说明、SHAP 值
- 基于监督学习示例的机器学习模型解释
第 4 部分:实践高级模型解释
- 非结构化数据集上的动手模型解释
- 深度学习模型的高级模型解释
如上所述,这些内容将在本系列的几篇文章中涉及,以保持简洁和有趣,这样每个人都可以从每篇文章中获得一些关键的收获。
动机
作为该行业的一名数据科学家和该领域的指导人员,我看到数据科学仍然经常被视为一个黑匣子,能够表演魔术或炼金术,为人们提供他们想要的东西。然而,残酷的现实是,如果没有对机器学习模型或数据科学管道如何工作的合理理解,现实世界的项目很少会成功。考虑现实世界中的任何数据科学项目,通常会有业务方面和技术或解决方案方面。现在,数据科学家通常致力于构建模型并为业务提供解决方案。然而,企业可能不知道模型如何工作的复杂细节。但是由于这个模型最终会为他们做很多决定,他们有权利提出这个问题,“我怎么能相信你的模型?” 或者 “你的模型到底是怎么做决策的?”回答这些问题是数据科学从业者和研究人员多年来一直在尝试的事情。
数据科学从业者会知道,存在一个典型的 模型可解释性与模型性能的权衡 。这里要记住的一点是,模型性能不是运行时或执行性能,而是模型在做出决策时的准确性。有几种模型,包括简单的线性模型,甚至是基于树的模型,它们可以很容易地解释模型做出的决定,以达到特定的洞察力或预测,但您可能需要牺牲模型的性能,因为由于高偏差(线性模型)或高方差的内在问题,它们总是不会产生最佳结果,从而导致过度拟合(完全生长的树模型)。更复杂的模型,如集成模型和最近的深度学习模型家族,通常会产生更好的性能,但被视为黑盒模型,因为很难解释模型可能如何在幕后真正做出决策。
有些人可能会说,如果某样东西(暂时)运行良好,为什么要质疑它是如何工作的呢?然而,作为人类,逻辑和推理是我们在大多数决定中坚持的东西。因此,向人工智能(AI)决策的范式转变无疑会受到质疑。在许多现实世界的场景中,有偏见的模型可能会产生非常不利的影响。这包括 预测潜在罪犯 , 司法判决风险评分 ,信用评分、欺诈检测、健康评估、贷款借贷、自动驾驶以及其他许多模型理解和解释至关重要的领域。著名数据科学家和作家 Cathy O' Neil 在她广受好评的书中强调了这一点, 【数学毁灭的武器】 。
《摧毁数学的武器》已经入围国家图书奖!书籍简介:前华尔街…
weaponsofmathdestructionbook.com](weaponsofmathdestructionbook.com/)
著名研究员兼作家凯特·克劳福德(Kate Crawford)在 NIPS 2017 主题演讲中谈到了机器学习中偏见的含义及其对社会的影响的这些方面, 【偏见的麻烦】 。
感兴趣的读者还应该看看她在《纽约时报》上的著名文章,【人工智能的白人问题】 ,她向我们展示了机器学习应用的例子,包括图像分类、犯罪风险预测、送货服务可用性以及更多对黑人社区不利的结果。所有这些现实世界的场景都暗示了模型解释应该有多重要,以及我们是否想要利用机器学习来解决这些问题。
根据科技界一些知名人士的观点,人工智能对……构成了迫在眉睫的生存威胁
www.nytimes.com](www.nytimes.com/2016/06/26/…)
在过去的一年里,我看到了在解决行业问题的同时对模型解释的需求,在我写我最近的书‘用 Python 进行实用的机器学习’时也是如此。在这段时间里,我有机会与 DataScience.comT21的优秀员工互动,他们非常清楚机器学习模型中人类可解释性的必要性和重要性。他们一直在积极寻找解决方案,并开源了流行的 python 框架Skater。在这一系列的文章中,我们将深入研究溜冰者,并做一些实际的模型解释。除此之外,我们还将全面覆盖其他模型解释框架,如【ELI5】!**
理解机器学习模型解释
机器学习只是在最近几年才在行业中得到广泛采用。因此,模型解释作为一个概念仍然主要是理论性的和主观的。
任何机器学习模型的核心都有一个响应函数,该函数试图映射和解释自变量(输入)和因变量(目标或响应)之间的关系和模式。
当模型预测或发现我们的洞察力时,它会做出某些决定和选择。模型解释试图理解和解释响应函数做出的这些决定,即什么、为什么和如何。模型解释的关键是透明性、质疑的能力以及人类理解模型决策的容易程度。模型解释的三个最重要的方面解释如下。
- 驱动模型预测的因素是什么?我们应该能够查询我们的模型,并找出潜在的功能交互,以了解哪些功能在模型的决策制定策略中可能是重要的。这保证了模型的的公平性。
- ****为什么模型会做出某种决定?我们还应该能够验证和证明为什么某些关键特征会在预测过程中驱动模型做出某些决定。这保证了 问责 和模型的可靠性。
- 我们如何相信模型预测?我们应该能够评估和验证任何数据点,以及模型如何对其做出决策。对于关键的利益相关者来说,这应该是可演示的并且容易理解的,即模型如预期的那样工作。这保证了模型的 透明性 。
机器学习模型的可解释性通常也被称为人类可解释的解释(HII) 是人类(包括非机器学习专家)能够理解模型在其决策过程中所做选择(如何、为什么和什么)的程度。
当比较模型时,除了模型性能之外,如果一个模型的决策比另一个模型的决策更容易被人理解,则该模型比另一个模型具有更好的可解释性。
机器学习模型解释的重要性
当处理机器学习问题时,数据科学家往往倾向于关注模型性能指标,如准确度、精确度和召回率等(这无疑很重要!).这在大多数围绕数据科学和机器学习的在线竞赛中也很普遍。然而,指标仅仅讲述了模型预测决策的一部分。随着时间的推移,由于环境中各种因素导致的模型概念漂移,性能可能会发生变化。因此,最重要的是理解是什么驱动一个模型做出某些决定。
我们中的一些人可能会说,如果一个模型工作得很好,为什么还要深入挖掘呢?请始终记住,在现实世界中解决数据科学问题时,为了让企业信任您的模型预测和决策,他们会不断地问这个问题, “我为什么要信任您的模型?” 这很有道理。如果一个人患有癌症或糖尿病,如果一个人可能对社会构成风险,甚至如果一个客户会流失,你会对一个仅仅预测和做出决定的模型感到满意吗( 什么 )也许不是,如果我们能更多地了解模型的决策过程(为什么**如何 ),我们可能会更喜欢。这让我们更加透明地了解为什么模型会做出某些决定,在某些情况下什么可能会出错,随着时间的推移,这有助于我们建立对这些机器学习模型的一定程度的信任。**
本节的关键要点是,现在是我们停止将机器学习模型视为黑盒的时候了,我们不仅要尝试分析数据,还要尝试分析模型如何做出决策。事实上,通往这条道路的一些关键步骤是由著名的论文 “我为什么要相信你?”解释任何分类器的预测 作者:M. T. Ribeiro,S. Singh 和 C. Guestrin,SIGKDD 2016,其中他们引入了 LIME(局部可解释模型不可知解释)的概念,我们将在下一篇文章中详细介绍。
他们在论文中提到了一些值得记住的要点。
然而,理解预测背后的原因在评估信任时非常重要,如果一个人计划根据预测采取行动,或者在选择是否部署新模型时,信任是最基本的。
无论人类是直接使用机器学习分类器作为工具,还是在其他产品中部署模型,一个至关重要的问题仍然存在:如果用户不信任模型或预测,他们就不会使用它。
感兴趣的人也可以看看他们在 KDD 会议上关于模型解释的论文。
这是我们在本文中多次讨论过的内容,也是决定行业中数据科学项目成功与否的关键区别之一。这推动了围绕模型解释的需要和重要性的紧迫性。
机器学习模型解释方法的标准
有特定的标准可以用来对模型解释方法进行分类。克里斯托夫·莫尔纳尔(Christoph Molnar)2018 年的 《可解释的机器学习,让黑盒模型变得可解释的指南》 中提到了一个很好的指南
- ****内在的还是事后的?内在可解释性是指利用本质上可内在解释的机器学习模型(如线性模型、参数模型或基于树的模型)。事后可解释性是指选择和训练一个黑盒模型(集成方法或神经网络),并在训练后应用可解释性方法(特征重要性、部分相关性图)。在我们的系列文章中,我们将更多地关注事后模型可解释方法。
- ****特定于模型还是与模型无关?特定于模型的解释工具非常特定于固有的模型解释方法,这些方法完全依赖于基于每个模型的能力和特性。这可以是系数、p 值、与回归模型相关的 AIC 分数、来自决策树的规则等等。与模型无关的工具与事后方法更相关,可以用于任何机器学习模型。这些不可知的方法通常通过分析(和输入的扰动)特征输入和输出对来操作。根据定义,这些方法无法访问任何模型内部,如权重、约束或假设。
- ****本地还是全球?这个解释的分类讲的是解释方法是解释单个预测还是整个模型行为?还是范围介于两者之间?我们将很快更多地讨论全局和局部解释。
这并不是对可解释方法进行分类的一套详尽的标准,因为这仍然是一个新兴的领域,但这可以是比较和对比多种方法的一个很好的尺度。
机器学习模型解释的范围
我们如何定义可解释性的范围和界限?一些有用的方面可以是模型的透明性、公平性和责任性。全局和局部模型解释是定义模型解释范围的明确方式。
Summarizing Global and Local Interpretation (Source: DataScience.com)
全球诠释
这一切都是为了试图理解 “模型是如何做出预测的?” 和 “模型的子集如何影响模型决策?”。为了立刻理解和解释整个模型,我们需要全局可解释性。全局可解释性是指能够根据完整数据集上的因变量(响应变量)和独立变量(预测变量)之间的条件交互来解释和理解模型决策。试图理解特性的相互作用和重要性总是理解全局解释的一个好的步骤。当然,当试图分析交互时,在超过两个或三个维度之后可视化特征变得相当困难。因此,经常查看可能影响全局知识模型预测的模块化部件和特征子集会有所帮助。全局解释需要模型结构、假设和约束的完整知识。
本地解释
这都是为了试图理解 “为什么模型为单个实例做出特定的决策?” 和 “为什么模型会对一组实例做出具体的决策?” 。对于局部可解释性,我们不关心模型的内在结构或假设,我们把它当作一个黑盒。为了理解单个数据点的预测决策,我们特别关注该数据点,并查看该点周围的特征空间中的局部子区域,并尝试基于该局部区域理解该点的模型决策。局部数据分布和特征空间可能表现完全不同,并且给出与全局解释相反的更准确的解释。局部可解释模型不可知解释(LIME)框架是一种优秀的方法,可用于模型不可知的局部解释。我们可以使用全局和局部解释的组合来解释一组实例的模型决策。
模型透明度
这一切都是为了理解 “一个模型是如何从算法和特征中创建出来的?”。 我们知道,通常情况下,机器学习模型都是利用数据特征之上的算法来构建一种将输入映射到潜在输出(响应)的表示。模型的透明性可以试图理解更多的技术细节,如模型是如何构建的,以及什么可能影响它的决策。这可以是神经网络的权重、CNN 滤波器的权重、线性模型系数、决策树的节点和分裂。然而,由于企业可能不太精通这些技术细节,试图用不可知的局部和全局解释方法来解释模型决策有助于展示模型的透明性。
结论
模型解释是可以成就或破坏行业中真实世界机器学习项目的东西,并帮助我们向可解释的人工智能(XAI)迈进了一步。让我们努力实现人类可解释的机器学习和 XAI,为每个人揭开机器学习的神秘面纱,并帮助增加对模型决策的信任。
下一步是什么?
在本系列的第 2 部分中,我们将涉及可解释人工智能的以下方面,涉及机器学习模型解释。
- 模型解释的传统技术
- 传统技术的挑战和局限
- 准确性与可解释性的权衡
- 模型解释技术
感谢 马修【梅奥】 的编辑和转载本文于KD nuggets。
感谢所有在DataScience.com的出色的人们,特别是Pramit Choudhary为我构建了一个令人惊叹的模型解释框架,Skater为我提供了这个系列的一些精彩内容。
我在我的书中涵盖了很多机器学习模型解释的例子, 《用 Python 进行实用的机器学习》 。为了您的利益,代码是开源的!
如果你对我的文章或数据科学有任何反馈、评论或有趣的见解要分享,请随时通过我的 LinkedIn 社交媒体频道联系我。
** [## Dipanjan Sarkar -数据科学家-英特尔公司| LinkedIn
查看 Dipanjan Sarkar 在世界最大的职业社区 LinkedIn 上的个人资料。Dipanjan 有 5 份工作列在…
www.linkedin.com](www.linkedin.com/in/dipanzan…)**
具有人工智能的类人机器听觉(1/3)
Photo credit: Jonathan Gross
神经网络在实时音频信号处理中的应用
人工智能技术的重大突破是通过模拟人类系统实现的。虽然人工神经网络(NNs)是与实际人类神经元的功能方式仅松散耦合的数学模型,但它们在解决复杂和模糊的现实世界问题方面的应用已经非常广泛。此外,在神经网络中对大脑的结构深度进行建模,为学习更有意义的数据表示提供了广泛的可能性。
如果您错过了其他文章,请点击下面的链接了解最新情况:
背景:AI 在音频处理上的承诺 批评:CNN 和 spectrograms 做音频处理有什么问题? 第二部分 : 具有人工智能的仿人机器听觉(2/3)
在图像识别和处理方面,CNN视觉系统中复杂且更具空间不变性的细胞所带来的灵感也极大地改进了我们的技术。如果你对在音频频谱图中应用图像识别技术感兴趣,可以看看我的文章*“CNN 和频谱图在音频处理中有什么问题?” 。*
只要人类的感知能力超过机器,我们就能从理解人类系统的原理中获益。当谈到感知任务时,人类非常熟练,人类理解和人工智能现状之间的反差在机器听觉领域变得尤为明显。考虑到从人类视觉处理系统中获得灵感所带来的好处,我建议我们从具有神经网络的机器听觉中获得类似的过程。
An overview of the framework which will be proposed during this article series.
在本系列文章中,我将详细介绍与 奥胡斯大学 和智能扬声器制造商Dynaudio A/S合作开发的 AI 实时音频信号处理框架。它的灵感主要来自认知科学,认知科学试图结合生物学、神经科学、心理学和哲学的观点,以更好地了解我们的认知能力。
认知声音属性
也许声音最抽象的领域是我们人类如何感知它。虽然信号处理问题的解决方案必须在低水平的强度、频谱和时间属性的参数内操作,但最终目标通常是认知目标:以改变我们对信号所含声音的感知的方式来转换信号。
例如,如果希望通过编程来改变录制的语音的性别,那么在定义其低级特征之前,有必要用更有意义的术语来描述这个问题。说话者的性别可以被认为是一种认知属性,由许多因素构成:声音的音高和音色、发音差异、词汇和语言选择的差异以及对这些属性如何与性别相关的共同理解。
这些参数可以用较低层次的特征来描述,如强度、光谱和时间属性,但只有在更复杂的组合中,它们才能形成高层次的表示。**这形成了一个音频特征的层次结构,从中可以导出声音的含义*。*代表人类声音的认知属性可以被认为是声音强度、频谱和统计属性的时间发展的组合模式。
A hierarchy of features that can be used to derive meaning from digital audio.
神经网络擅长提取数据的抽象表示,因此非常适合检测声音的认知属性。为了建立一个用于此目的的系统,让我们检查声音在人类听觉器官中是如何表示的,我们可以用它来启发用神经网络处理声音的表示。
耳蜗表现
人类的听觉始于外耳,外耳首先由耳廓组成。耳廓充当了一种频谱预处理的形式,其中传入的声音根据其相对于听者的方向而被修改。然后,声音通过耳廓的开口进入耳道*,耳道进一步通过共振来修改传入声音的频谱属性,从而放大 1-6 kHz 范围内的频率[1]。*
An illustration of the human auditory system.
当声波到达耳道末端时,它们会刺激耳膜,听小骨(人体内最小的骨头)附着在耳膜上。这些骨头将压力从耳道传递到内耳中充满液体的耳蜗*。耳蜗在引导 NNs 的声音表达方面有很大的兴趣,因为这是负责将声振动转换成人类神经活动的器官。*
它是一个盘管,沿其长度被两层膜分开,这两层膜是赖斯纳膜和基膜*。沿着耳蜗的长度,有一排大约 3500 个内毛细胞[1]。当压力进入耳蜗时,它的两层膜被压下。基底膜在底部窄而硬,但在顶部松而宽,因此沿其长度的每个地方对特定频率的响应更强烈。*
简单来说,基膜可以被认为是一个连续的带通滤波器阵列,沿着膜的长度,用于将声音分离成它们的光谱成分。
An illustration of the human cochlea.
这是人类将声压转化为神经活动的主要机制。因此,有理由假设音频的频谱表示将有利于用人工智能对声音感知进行建模。由于沿着基底膜的频率响应呈指数变化[2],对数频率表示可能被证明是最有效的。一种这样的表示可以使用伽马通滤波器组来导出。这些滤波器通常应用于模拟听觉系统中的频谱滤波,因为它们近似人类听觉滤波器的脉冲响应,该脉冲响应来自测量的听觉神经纤维对白噪声刺激的响应,称为“revcor”函数【3】。
A simplified comparison between human spectral transduction and a digital counterpart.
由于耳蜗有大约 3500 个内毛细胞,人类可以检测到长度低至大约 2-5 ms 的声音间隙[1],分成 2 ms 窗口的 3500 个伽马通滤波器的光谱分辨率似乎是在机器中实现类似人类的光谱表示的最佳参数。然而,在实际场景中,我假设较低的分辨率仍然可以在大多数分析和处理任务中实现理想的效果,同时从计算的角度来看更可行。
许多用于听觉分析的软件库可以在线获得。一个著名的例子是 Jason Heeris 的 Gammatone 滤波器组工具包。它提供了可调节的滤波器,以及使用 gammatone 滤波器对音频信号进行类似声谱图分析的工具。
神经编码
当神经活动从耳蜗移动到听觉神经和上行听觉通路时,在到达听觉皮层之前,脑干核团中应用了许多过程。
这些过程形成了一个代表刺激和感知之间接口的神经代码。关于这些核的具体内部工作的许多知识仍然是推测性的或未知的,所以我将只在它们更高的功能水平上详细描述这些核。
A simplified illustration of the ascending auditory pathway (for one ear) and its assumed functions.
人类的每只耳朵都有一组相互连接的细胞核,但为了简单起见,我只展示了一只耳朵的流程。耳蜗核是来自听觉神经的神经信号的第一个编码步骤。它由各种具有不同属性的神经元组成,用于执行声音特征的初始处理,其中一些神经元指向与声音定位相关的上橄榄*,而其他神经元则指向通常与更高级特征相关的侧丘系和下丘[1]。*
J.J. Eggermont 在“在声音和感知之间:回顾对神经代码的搜索”中详细描述了来自耳蜗核的这种信息流如下:“腹侧[耳蜗核] (VCN)提取并增强在[听觉神经]纤维的放电模式中多路复用的频率和定时信息,并通过两条主要路径分发结果:声音定位路径和声音识别路径。VCN (AVCN)的前部主要服务于声音定位方面,其两种类型的浓密细胞为上橄榄复合体(SOC)提供输入,在此为每个频率分别绘制耳间时差(itd)和水平差(ILD)。**
声音识别路径所携带的信息是诸如元音的复杂频谱的表示。这种表现主要是由被称为“斩波器”()神经元的特殊类型单元在耳蜗腹侧核中产生的[4]。这些听觉编码的细节很难详细说明,但它们向我们表明,输入频谱的一种“编码”形式可以提高对低水平声音特征的理解,并使声音印象在 NNs 中的处理成本更低。**
频谱声音嵌入
我们可以应用无监督的自动编码器神经网络架构来尝试学习与复杂光谱相关的共同属性。就像单词嵌入,在代表声音精选特征的频谱中找到共性是可能的(或者一个更紧密浓缩的意为)。
自动编码器被训练成将输入编码成压缩表示,该压缩表示可以被重构回与输入具有高度相似性的表示。这意味着自动编码器的目标输出是输入本身[5]。如果一个输入可以在没有很大损失的情况下被重建,那么网络已经学会以这样一种方式对它进行编码,即压缩的内部表示包含足够多的有意义的信息。这种内部表现就是我们所说的嵌入。自动编码器的编码部分可以与解码器分离,以便为其他应用程序生成嵌入。
A simplified illustration of an autoencoder architecture for spectral sound embeddings.
嵌入还有一个好处,那就是它们通常比原始数据的维度更低。例如,自动编码器可以将总共有 3500 个值的频谱压缩成长度为 500 个值的向量。简而言之,这种向量的每个值可以描述更高级别的频谱因子,例如元音、刺耳或和谐度——这些只是示例,因为由自动编码器导出的统计公共因子的含义可能通常难以用简单的语言来标注。
在下一篇文章中,我们将通过增加内存来扩展这一思想,为音频频谱的时间发展产生嵌入。
这是我关于人工智能音频处理系列文章的第一部分。接下来,我们将讨论声音中感觉记忆和时间依赖性的基本概念。
如果你喜欢这篇文章,请随时关注并留下你的掌声。
参考
[1] C. J. Plack,《听觉》,第二版。心理学出版社,2014。
[2] S. J. Elliott 和 C. A. Shera,“作为智能结构的耳蜗”,智能材料。结构。,第 21 卷,第 6 期,第 64001 页,2012 年 6 月。
[3] A.M. Darling,“gammatone 滤波器的特性和实现:指南”,言语听力和语言,伦敦大学学院,1991 年。
[4] J. J. Eggermont,“在声音和感知之间:回顾对神经代码的研究。,“听到了。《研究报告》,第 157 卷,第 1-2 期,第 1-42 页,2001 年 7 月。
[5]t . p . Lilli rap 等,学习 AI 的深度架构,第 2 卷,第 1 期。2015.
具有人工智能的类人机器听觉(2/3)
Photo credit: rawpixel
记忆的重要性
嗨,欢迎回来!本系列文章详细介绍了我与奥胡斯大学和智能扬声器制造商丹拿合作开发的一个人工智能实时音频信号处理框架。
如果您错过了之前的文章,请点击下面的链接了解最新情况:
背景:AI 在音频处理上的承诺 批评:CNN 和 spectrograms 做音频处理有什么问题? 第一部分 : 具有人工智能(1/3)的仿人机器听觉
在前面的部分中,我们描绘了人类如何体验声音的基本原理,即在耳蜗中形成的光谱印象,然后由脑干核序列进行“编码”。这篇文章将探讨我们如何在产生频谱声音嵌入时将记忆与用于声音理解的人工神经网络相结合。
回声记忆
声音事件的含义在很大程度上源于频谱特征之间的时间相互作用。
这方面的一个证据是,人类的听觉系统根据时间背景以不同的方式对语音的相同音素进行编码[1]。这意味着一个音素 /e/ 在神经学上对我们来说可能意味着不同的东西,这取决于它之前的东西。
记忆对于进行声音分析至关重要,因为只有将“那一刻”的印象与之前的印象进行比较才是可能的,前提是它们确实存储在某个地方。
人类的短期记忆是由一系列整合了感觉记忆和工作记忆的成分组成的。在对声音感知的检查中,已经在人类中发现了听觉感觉记忆(有时也称为回声记忆)。c .阿兰等人。艾尔。将听觉感官记忆描述为*“听觉感知中的关键第一阶段,允许听者将传入的声音信息与先前听觉事件的存储表征进行整合”*【2】。
从计算上来说,我们可以把回声记忆看作是即时听觉印象的短暂缓冲。
关于回声记忆的持续时间一直存在争议。在纯音和口语元音掩蔽研究的基础上,D. Massaro 论证了大约 250 ms,而 A. Treisman 基于两耳分听实验论证了大约 4 秒[3]。为了将回声记忆的想法与神经网络相结合,我们可能不需要确定感觉存储的固定持续时间,但我们可以在几秒钟的范围内对记忆进行实验。
兜圈子
用数字光谱表示法实现感觉记忆可能相当简单。我们可以简单地分配一个循环缓冲器来存储先前时间步的预定数量的光谱。
An illustrated circular buffer for holding spectral memory (where t denotes the timestep).
循环缓冲区是一种数据结构,由一个被视为循环的数组组成,当数组长度达到后,其索引循环回 0[4]。
在我们的例子中,这可能是一个多维数组,其长度为所需的内存量,循环缓冲区的每个索引保存特定时间步长的完整频谱。计算新光谱时,会将它们写入缓冲区,如果缓冲区已满,则会覆盖最早的时间步长。
随着缓冲区的填充,两个指针被更新:一个尾指针标记最新添加的元素,一个头指针标记最老的元素,因此也是缓冲区的开始[4]。
下面是一个 Python 中循环缓冲区的例子,改编自埃里克·威瑟:
import numpy as npclass CircularBuffer():
# Initializes NumPy array and head/tail pointers
def __init__(self, capacity, dtype=float):
self._buffer = np.zeros(capacity, dtype)
self._head_index = 0
self._tail_index = 0
self._capacity = capacity # Makes sure that head and tail pointers cycle back around
def fix_indices(self):
if self._head_index >= self._capacity:
self._head_index -= self._capacity
self._tail_index -= self._capacity
elif self._head_index < 0:
self._head_index += self._capacity
self._tail_index += self._capacity # Inserts a new value in buffer, overwriting old value if full
def insert(self, value):
if self.is_full():
self._head_index += 1 self._buffer[self._tail_index % self._capacity] = value
self._tail_index += 1
self.fix_indices()
# Returns the circular buffer as an array starting at head index
def unwrap(self):
return np.concatenate((
self._buffer[self._head_index:min(self._tail_index, self._capacity)],
self._buffer[:max(self._tail_index - self._capacity, 0)]
)) # Indicates whether the buffer has been filled yet
def is_full(self):
return self.count() == self._capacity # Returns the amount of values currently in buffer
def count(self):
return self._tail_index - self._head_index
减少输入大小
为了以每时间步 5 ms 的分辨率存储完整的第二个频谱,需要容量为 200 个元素的缓冲器。这些元素中的每一个都包含一个频率幅度数组。如果需要类似人类的光谱分辨率,这些数组将包含 3500 个值。对于总共 200 个时间步长,要处理 700,000 个值。
如果传递给人工神经网络,长度为 700,000 个值的输入存在计算开销大的风险。这种风险可以通过降低光谱和时间分辨率或在内存中保持较短的光谱信息持续时间来减轻。
我们还可以从 Wavenet 架构中获得灵感,该架构利用扩展因果卷积来优化对原始样本音频中大量顺序数据的分析。正如 A. Van Den Oord 等人在中所解释的,“扩张卷积(也称为á trous,或带孔卷积)是一种卷积,其中通过跳过某个步长的输入值,在大于其长度的区域上应用滤波器” [5]。
假设最近输入的频率数据是瞬时声音分析的最大决定因素,那么扩展频谱缓冲器可能是减少计算内存大小的有用工具。
Two methods for dimensionality reduction with dilated spectral buffers (in this figure unrolled for clarity).
通过与原始缓冲区成比例地将新缓冲区中的每个时间步长扩大某个比例(例如, 2^t 的指数增加),维度可以显著减少,同时保持最近时间步长的光谱发展的高分辨率。可以通过简单地越来越向后查找单个值来从原始缓冲区获得扩展缓冲区的值,但是也可以通过提取持续时间内的平均或中值频谱来组合要折叠的时间步长的数量。
扩展光谱缓冲区背后的驱动概念是将最近的光谱印象保留在内存中,同时以有效的方式保留一些关于“大画面”上下文的信息。
下面是使用 Gammatone 滤波器组制作扩展频谱帧的简化代码片段。注意,这个例子使用离线处理,但是滤波器组也可以实时应用,将频谱帧插入到循环缓冲器中。
from gammatone import gtgram
import numpy as np
class GammatoneFilterbank:
# Initialize Gammatone filterbank
def __init__(self,
sample_rate,
window_time,
hop_time,
num_filters,
cutoff_low):
self.sample_rate = sample_rate
self.window_time = window_time
self.hop_time = hop_time
self.num_filters = num_filters
self.cutoff_low = cutoff_low # Make a spectrogram from a number of audio samples
def make_spectrogram(self, audio_samples):
return gtgram.gtgram(audio_samples,
self.sample_rate,
self.window_time,
self.hop_time,
self.num_filters,
self.cutoff_low) # Divide audio samples into dilated spectral buffers
def make_dilated_spectral_frames(self,
audio_samples,
num_frames,
dilation_factor): spectrogram = self.make_spectrogram(audio_samples)
spectrogram = np.swapaxes(spectrogram, 0, 1)
dilated_frames = np.zeros((len(spectrogram),
num_frames,
len(spectrogram[0])))
for i in range(len(spectrogram)):
for j in range(num_frames):
dilation = np.power(dilation_factor, j)
if i - dilation < 0:
dilated_frames[i][j] = spectrogram[0]
else:
dilated_frames[i][j] = spectrogram[i - dilation]
return dilated_frames
Result: Two examples of dilated spectral buffers visualized as a quadrilateral mesh.
嵌入缓冲区
在人类记忆的许多模型中,选择性注意被应用在感觉记忆之后,作为一种过滤器,以防止短期记忆中的信息过载【3】。由于人类的认知资源有限,将注意力分配给某些听觉以优化精神能量的消耗是有利的。
这个过程可以通过扩展自动编码器神经网络架构来实现。使用这种架构,可以将声音的感官记忆与选择性注意力的瓶颈结合起来,方法是向其提供扩展的频谱缓冲区以产生嵌入,而不是仅提供瞬时频率信息。为了处理顺序信息,可以使用一种称为序列到序列自动编码器的特殊类型架构【6】。
序列到序列( Seq2Seq )模型通常使用 LSTM 单位将一个数据序列(例如,一个英语句子)编码为一个内部表示,其中包含该序列作为一个整体的压缩“含义”。然后,这种内部表达可以被解码成一个序列(同样的句子,但以西班牙语为例)[7]。
以这种方式嵌入声音的一个特点是,它使得使用简单的前馈神经网络来分析和处理声音成为可能,这种网络运行起来更便宜。
在训练如下图所示的网络之后,右半部分(解码部分)可以被“切断”,从而生成用于将时间频率信息编码到压缩空间中的网络。Y. Chung 等人在这一研究领域取得了良好的成果。艾尔。通过应用 Seq2Seq 自动编码器架构[6],成功地生成了描述声音记录的顺序语音结构的嵌入。随着输入数据更加多样化,也有可能产生以更通用的方式描述声音的嵌入。
A simplified illustration of a sequential autoencoder which produces temporal sound embeddings.
用 Keras 倾听
使用上述方法,我们可以用 Keras 实现 Seq2Seq 自动编码器来产生音频嵌入。我称之为监听器 网络,因为它的目的是*“监听”传入的声音序列,并将其简化为更紧凑、更有意义的表示,以便我们进行分析和处理。*
为了训练这个网络,使用了来自 UrbanSound8K 数据集的约 3 小时的音频。该数据集包含一组分为不同类别的环境声音剪辑。使用 Gammatone 滤波器组处理声音,并将其分割成 8 个时间步长的扩展频谱缓冲区,每个缓冲区有 100 个频谱滤波器。
*from keras.models import Model
from keras.layers import Input, LSTM, RepeatVectordef prepare_listener(timesteps,
input_dim,
latent_dim,
optimizer_type,
loss_type):
*"""Prepares Seq2Seq autoencoder model
Args:* ***:param*** *timesteps: The number of timesteps in sequence* ***:param*** *input_dim: The dimensions of the input* ***:param*** *latent_dim: The latent dimensionality of LSTM* ***:param*** *optimizer_type: The type of optimizer to use* ***:param*** *loss_type: The type of loss to use
Returns:
Autoencoder model, Encoder model
"""* inputs = Input(shape=(timesteps, input_dim)) encoded = LSTM(int(input_dim / 2),
activation="relu",
return_sequences=True)(inputs) encoded = LSTM(latent_dim,
activation="relu",
return_sequences=False)(encoded) decoded = RepeatVector(timesteps)(encoded) decoded = LSTM(int(input_dim / 2),
activation="relu",
return_sequences=True)(decoded) decoded = LSTM(input_dim,
return_sequences=True)(decoded)
autoencoder = Model(inputs, decoded)
encoder = Model(inputs, encoded)
autoencoder.compile(optimizer=optimizer_type,
loss=loss_type,
metrics=['acc'])
return autoencoder, encoder*
对于我的数据,这段代码生成了下面的网络架构:
在 NVIDIA GTX 1070 GPU 上使用均方误差和 Adagrad 优化对这个监听器网络进行了 50 个时期的训练,达到了 42%的重建精度。训练花了一段时间,所以我很早就停止了,尽管进度似乎还没有停滞。我非常有兴趣看到这样一个具有更大数据集和更多计算能力的模型的性能。
这里当然有改进的空间,但是下面的图像显示了序列的粗略结构是在将输入压缩了 3.2 倍之后捕获的。
Some examples of original data and predictions by the autoencoder to illustrate reconstruction fidelity.
这是我关于神经网络音频处理系列文章的第二部分。在最后一篇文章中,我们将把这些概念用于创建一个分析音频嵌入的网络。
如果你喜欢这篇文章,请随时关注并留下你的掌声。
参考
*[1] J. J. Eggermont,**“在声音和感知之间:回顾对神经代码的探索。,"*听到。《研究报告》,第 157 卷,第 1-2 期,第 1-42 页,2001 年 7 月。
[2] C. Alain、D. L. Woods 和 R. T. Knight,“人类听觉感觉记忆的分布式皮层网络”,《大脑研究》,第 812 卷,第 1-2 期,第 23-37 页,1998 年 11 月。
*[3] A .温菲尔德,**《工作记忆和认知资源模型的进化》,*耳听。,第 37 卷,第 35S–43S 页,2016 年。
[4] “在嵌入式 C 中实现循环/环形缓冲区”,Embedjournal.com,2014。【在线】。可用:https://embed journal . com/implementing-circular-buffer-embedded-c/。
[5] A .范登奥尔德等人,“wave net:原始音频的生成模型。”
*[6] Y.-A. Chung、C.-C. Wu、C.-H. Shen、H.-Y. Lee 和 L.-S. Lee,**“音频词 2Vec:使用序列到序列自动编码器的音频段表示的无监督学习”,*国际语音通信协会年会论文集,2016 年,第 765-769 页。
[7] F. Chollet,《Keras 中序列对序列学习的十分钟介绍》,Blog.keras.io,2018。【在线】。可用:https://blog . keras . io/a-ten-minute-introduction-to-sequence-to-sequence-learning-in-keras . html
人文专业毕业生应该考虑数据科学
我的职业轨迹有些不寻常。早在 2009 年,我本科毕业,获得了古典语言学位,不久后又获得了同一领域的硕士学位,之后继续攻读博士学位。和大多数人文学科的研究生一样,我的计划是在大学里研究和教授我的专业领域。
但是我没有完成。相反,我进入了工业界,在过去的五年里,我逐渐占据了更多的定量职位,从研究分析师开始,最近开始担任数据科学家的角色。虽然从学术界到数据科学的转变对于 STEM 博士来说相当普遍,但对于具有人文背景的毕业生来说,这种情况要难得多。尽管如此,我怀疑我这种转变的动机,以及使之成为可能的技能,事实上是许多人文学科研究生所共有的。这篇文章旨在帮助任何有兴趣走类似道路的人。
为什么选择数据科学
在我攻读博士学位的第一年,我开始质疑我的职业选择,在很大程度上,我的担忧可能是所有领域的研究生的典型问题:我担心找学术职位的难度,担心毕业后我是否能住在我想住的地方,担心我的研究是否会被认真对待。
但是除了这些实际问题,我也开始思考人文学科对待研究的方式,以及它的认识论基础的有效性。像学术界的许多人一样,最初吸引我从事研究的是产生知识的前景,但在我学术生涯的几年中,人文学科提供的工具集开始让我觉得不足以完成这一目标。从我当时的观点来看,我的研究过程是基于批判性阅读、反思和写作,在产生独特而有趣的视角方面是有效的,但在创造关于世界的新知识方面却不是。
对于有这种担忧的人来说,有些自然的是,我开始寻找其他可以创造知识的框架,并很快被科学的定量方法所吸引,因为它们提供了一种客观性,这是我的研究中一直缺乏的。不久之后,我被基于证据的研究和可证伪假说的想法所说服,但我也怀疑人文学科的博士学位并不是探索这类方法的最佳场所,所以我将工业视为一个成长和锻炼我的定量研究技能的地方。
数据科学只是研究
在接下来的几年里,我学习了定量研究的专用工具:应用统计学、假设检验、编码和分布式计算。我喜欢技术主题,并且在我的各种角色中找到每一个深入研究它们的借口。但是,通常情况下,我发现自己使用的最适用和最重要的技能是我在人文学科研究生时学到的。阐明研究问题,交流假设,解决研究人员的主观性和证据的不确定性问题——这些是我作为一名行业研究人员面临的最困难的挑战。
的确,我需要了解统计学,以及如何编写代码来有效地履行这些职责,但是这些知识是已知的。事实证明,伟大的数据科学家和普通的数据科学家之间的区别在于研究人员处理同样的不确定性的能力,这种不确定性最初曾驱使我从人文学科转向定量研究。换句话说,科学方法论和人文学科有着同样的认识论问题——他们只是用不同的工具来解决这些问题。
一些实用的建议
我的经历让我相信,对于一名行业数据科学家来说,研究生人文学科的工作实际上是最有用的背景之一。虽然经常有很多人关注数据科学家是统计或编码方面的专家,但这些工具只是达到目的的一种手段——对于进行伟大的数据科学来说,它们是必要的,但还不够。如果你是一名人文学科的研究生,并且对数据感兴趣,我会对你在这个领域取得成功的能力充满信心,因为你的技术水平不高。具体来说,作为人文学科研究生的经历使你成为以下领域的专家:
- 深入主题,自学任何东西
- 陈述研究问题,并用证据支持你的答案
- 传达你的方法的限制和假设
在我看来,这些宽泛的研究技能比任何特定定量方法的细节知识更有价值(也更稀有)。重要的是,第一点意味着人文学科的研究人员可以根据需要随时学习任何特定的方法论。也就是说,从人文科学成功过渡到数据科学需要一些基础知识。
首要任务是建立概率统计知识。把这些工具想象成文学或社会政治理论的科学等价物:它们是抽象的方法,你应用于一个特定的领域,努力回答一个特定的问题。
我不喜欢大多数新数据科学家在学习统计学时通常采取的漫无目的的方法。经常有一个错误的焦点放在学习非常特殊的模型或技术上,因此浪费了大量的时间来努力理解高度专业化的主题,同时慢慢地吸收更基本的想法。相反,我会把我所有的精力放在理解概念上,这些概念使得统计数据对那些试图证明或否定他们想法的研究者来说是强有力的。仔细阅读 p 值和频率统计、贝叶斯推断和先验,理解这些如何应用到你的研究中。买一本书或者上一堂关于这些主题的基础课,但是不断地将你学到的东西和实际研究联系起来。
其次,获得编写代码(语言的典型选择是 Python 或 R ,以及 SQL )和可视化数据的基本知识。把这些看作是你进行研究所需的实用工具——在人文学科中,这就像学习一门外语或者测定一块陶器的年代一样。至于那些技巧,我认为最好通过在日常工作中使用它们来学习,而不是试图通过书本或课堂来建立一个全面的知识。从基础的在线课程开始,然后通过实践应用来提高。
真的,就是这样。在这两个领域打好基础,你就有 90%的机会成为功能数据科学家,剩下的就是边干边学了。实际上,我认为一个雄心勃勃的人文学科研究生可以在 3-6 个月内建立必要的统计和技术知识,从那里开始,问题只是找到一个可以让你继续学习的职位。我有一些资源可以让你开始另一个中型岗位这里。
如果你对这些感兴趣,并且有具体的问题,请给我留言。我期待着看到更多从事数据工作的人文学科同事。
大多数人都会犯的错误
在 11 月的第一周,美国总统大选之前,你认为克林顿获胜的可能性有多大?
在一个标准轮盘上,球落在红点上的几率是多少?
在俄亥俄州五月的任何一天,下雪的可能性有多大?
众所周知,概率思维很难。
如果你和大多数人一样(包括我自己),你对上面三个问题的回答可能分别接近 100%、50%和 0%。然而,考虑到美国第 45 任总统、轮盘赌上绿点的存在以及俄亥俄州在 5 月份多次降雪的事实,我们发现我们上面的“肯定会发生”、“抛硬币”和“不会发生”的预测不太准确。
你在这里并不孤单。
人类是如何思考的:
阿曼达·考克斯(Amanda Cox),《纽约时报》的编辑(我个人的数据可视化英雄),在我读研究生的时候,在俄亥俄州做了一次演讲。她提到人们不擅长概率性思维。特别是,她提到人类真的只考虑由 0、50 和 100%组成的概率度量。
Illustration of Amanda Cox’s description of the “human probability measure.” (Made using TikZ LaTeX package.)
当考克斯说人类是这样思考的时候,她的意思是我们通常把接近 50%的概率解释为 50%的可能性。例如,如果有人听说一名 NBA 球员的罚球命中率为 60%,他/她可能会说该球员投篮命中的可能性与投篮不中的可能性差不多。如上图所示,中间有黄色箭头;任何接近 50%的东西都会被简化为 50%。
任何显著大于 50%的可能性,我们都认为是确定的事情,称之为 100%可能。一个股票新手看到一份报告说谷歌的股票有 90%的可能会上涨,他可能会把大量的钱投入到这只股票中,认为他/她在这笔交易中不会有任何损失。这用顶部向上的绿色箭头表示;我们将所有远高于 50%的概率映射为“确定”或“几乎确定”。
任何远低于 50%的可能性,我们都认为它永远不会发生,所以我们认为特定事件发生的概率是 0%。这在上图中用红色箭头表示;我们经常认为这些事件“几乎不可能,不值得考虑。”
这听起来似乎过于简单,但它惊人地成立。例如,想想下雨的可能性:
- 如果你查看天气应用程序,发现明天下雨的可能性为 80%,你可能会认为肯定会下雨,所以你一定要带上雨伞。
- 如果应用程序告诉你下雨的几率是 40%,你就是在扔硬币决定下雨。我们这些厌恶风险的人会抢伞;你们中的那些人…嗯,像我一样,不会。
- 如果你读到下雨的可能性是 10%,你认为不会下雨,所以你甚至懒得在明天早上的清单上加上“雨伞”。
人类无时无刻不在评估事物。即使作为一名数据科学家,我也会进行四舍五入和估算,最终得到非常不精确的结果……所以这很正常,对吗?
嗯,是的。当我们从概率转向实际预测时,问题就出现了。
如果你的天气预报员说有 90%的可能性至少会有一英尺厚的雪,当只有一场小雪降临你的街道时,你可能会感到沮丧。我们将这 90%的预测视为必然,然后当这些预测变成我们认为几乎不可能的方式时,我们会感到委屈。
内特·西尔弗对概率的辩护
内特·西尔弗上周在推特上颇有争议地纠正了罗恩·福涅尔关于概率本质的观点。
Nate Silver vs. Ron Fournier Tweetstorm, April 23, 2017.
为了让你了解最新情况,Silver 发布了一篇关于詹姆斯·科米对 2016 年美国总统选举的影响的文章。Fournier 对此提出异议,认为 FiveThirtyEight 预测了克林顿的胜利,因此做出了“不正确”的预测。西尔弗反复回应说,福涅尔不是在进行概率性思考。
许多美国人对这次选举措手不及。根据纽约时报的结果总统预测,所有预测都相当确定希拉里将赢得选举。(补充说明:这一页上的可视化效果令人难以置信,我强烈建议看一看。)
New York Times’ The Upshot 2016 Presidential Predictions, November 8, 2016.
专家不是特别受欢迎——尤其是当他们的预测出错的时候。他们使得克林顿的胜利似乎不可避免。所以我们很容易挑他们的毛病,争辩说他们“错了”我们也有账单要付,有工作要做;我们怎样才能解析这些预测呢?
人类应该如何思考:
有两种解释事件发生概率的适当方法,这两种方法都是有效的:
- 从长远来看,这种事件发生的频率有多高?
- 你认为这件事会发生到什么程度?
第一种方法(称为频率主义方法)将通过说“如果选举一再发生,我们预计克林顿将赢得每 100 次选举中的 85 次”,或者大约每 6 次中的 5 次,来解读 NYT 的克林顿获胜概率。
第二种方法(称为贝叶斯方法)将通过说“纽约时报有 85%的把握克林顿将赢得选举”来解释 NYT 对克林顿获胜的概率这种方法更加主观,引起了贝叶斯反对者的愤怒。然而,这种方法并不依赖于 2016 年选举会像频繁主义者方法要求的那样一遍又一遍发生的想法。
虽然有大量关于解释概率的文献(“贝叶斯”和“频率主义者”这两个术语可能会引发数据科学爱好者和统计学课程幸存者的一些记忆),但你会注意到,这两种解释都没有说“特朗普不可能获胜”。
这里最重要的一点是,从概率跳到预测时要小心谨慎。据说 85%确定的事情并不意味着它是“确定的事情”
问问克林顿国务卿就知道了。
我要感谢我的朋友兼同事约瑟夫·尼尔森的编辑。你应该在媒介上认出他;他的帖子比我的好。
有人类在身边很方便
作为影子机器人公司的首席技术架构师,我一直在寻找令人兴奋的方法,让非机器人专家更容易抓取和操纵。示范教学是解决这一问题的众多方法之一。
Teaching by demonstration: folding paper. Research from the CITEC group at Bielefeld University.
这个想法很简单,你向你的机器人展示如何做某事——在我的例子中——如何抓住一个给定的物体。机器人将从演示中学习,完善它所展示的内容,直到它“工作”良好。
就我的目的而言,梦想的目标是展示一个足够好的抓取:手动塑造机器人手围绕物体,然后让机器人自己尝试几次,直到抓取真正稳定。这通常被称为一次性示范学习。
在这个故事中,我将集中在一个非常简单的方法来解决这个问题,使用贝叶斯优化。
抓取被认为是一种数学功能
贝叶斯优化是你工具箱中一个非常有用的工具,可以用来优化黑盒函数。有多种方法可以考虑抓取物体的问题。其中之一是将其视为一个函数优化问题:给定我的输入——例如,我每个关节的关节角度——我如何才能获得最高的输出——即最稳定的抓力。
Considering the grasp problem as a black box optimisation problem
客观地看,将抓取视为一个优化问题就像试图寻找风景中的最高峰一样。在抓取时,我经常寻找一个足够高且相当宽的峰,而不是一个又高又窄的峰。如果我的峰值太窄,那么我将很难准确地处于那个配置中,所有的不确定性加起来甚至是最先进的机器人。
In grasping, I’m often looking for peak #2 instead of peak #1. It is much easier to reach that peak in an uncertain world.
粗暴的方法
在我的抓取案例中,让我们记住我想找到最高的——也是最宽的——山峰,但是我不知道风景是什么样子。正如你在下面看到的,估算这一景观的一个非常简单的方法是在空间的任何地方取样。这意味着用关节目标的每一种可能的组合来抓取物体,并获得相关的抓取鲁棒性。即使它能很好地工作,但它肯定不是最佳方法。
Brute force sampling an unknown landscape. From left to right: my black box landscape / Brute sampling the landscape in a grid to estimate my landscape / The actual landscape with the stable region we are looking for at the top left.
在我当前的问题中,我也可以利用人类所展示的理解能力。以此为起点,我可以缩小搜索范围。如下图所示,我将只在附近寻找。如果我仍然在考虑一个蛮力的方法,这将意味着我需要少得多的样本来猜测我的风景的形状。
Restricting my search space.
更加智能地采样
尽管上面描述的搜索区域在我的图上看起来很小,但你必须记住我是在一个高维空间中:我有很多关节。所以探索那个地区会花很多时间。我们需要的是一种更好的方式来采样我的空间。
贝叶斯抽样是一种经过充分研究的方法,它可以最大限度地收集每次取样的信息。主要的想法是收集尽可能多的关于峰值的信息,同时不要花太多时间在抓地力不好的地方取样。
在这个方法中,我还可以调整在探索和开发上花费了多少努力。更多地关注开发——正如你在左图中看到的那样——将在峰值周围收集更多的数据。因此,这留下了更多的不确定性:我可能会错过一些峰值,但我最稳定的抓地力的联合目标将非常精确。如果我转而关注于探索——右边的图表——我将在我的空间周围收集更多的数据,减少我在任何地方的不确定性。但是我最稳定的把握的联合目标将会不那么精确。
Exploitation — on the right — vs. exploration — on the left. Red dots are samples taken, blue line is the actual function, green line is the approximation I built, blue surfaces represent the uncertainty. Source: bayesian-optimization library.
完善模拟中的把握
在模拟中运行优化非常类似于我用来收集数据集以预测抓取质量的过程。在模拟中,我用贝叶斯过程给我们的联合目标抓住我的对象,然后举起对象,并记录一个客观的抓住质量。这种抓握质量与手掌和物体之间距离的变化成比例。这是一个非常简单的想法:如果我移动手,并且抓握稳定,则物体随之移动!
对于贝叶斯优化的每一次迭代,我都使用新的联合目标进行采样。我的黑盒函数的输出是从摇动物体测量的抓握质量。这给了我一个新的黑盒函数值,减少了给定区域的不确定性!
在这个过程的最后,我们有了比最初更强有力的把握。我在 Shadow 的同事甚至在真实的机器人上测试了抓地力,正如你在下面看到的那样,它非常稳定。
Testing the refined grasp on the real robot — an early prototype of our Smart Grasping System.
如果你想看看用于此的代码,你可以在 github 上找到。
最后的话
如果我可以很容易地在模拟中导入对象,这个过程会非常好。在模拟层面上还有很多工作要做,才能有一个更接近真实机器人的模拟。这是一个很大的挑战,尤其是当你处理抓取和操作问题的时候。
这种优化也可以在真实的机器人上运行。为此,我需要能够在真实的机器人上复制我的客观抓握质量,这不是一个简单的任务。一旦抓地力预测算法工作良好,虽然…
利用人类的智慧来帮助机器人做得更好是推动事情向前发展的一个很好的方式。这项工作的大部分是由在 Shadow 实习的帕万完成的。谢谢帕万!
随时连接 上推特 !
可微分神经计算机(DNCs)——自然文章思考
2016 年 10 月 17 日
当我们将人工神经网络与冯·诺依曼 CPU 架构相比较时,人工神经网络(ann)中工作记忆的添加是一个明显的升级,并且是去年 NIPS 的 RAM(推理、注意力、记忆)研讨会中出现的一个(挤满了人)。显而易见和建筑然而是两回事..
谷歌 Deepmind 最近发表的关于可分化神经计算机(DNCs)的论文代表了在人工神经网络中添加工作记忆的旅程中又迈出了重要的一步,因此值得更深入地研究一下。
这是一个变化的时代
为了向新晋的诺奖得主鲍勃·迪伦致敬,我们用他 1964 年的经典书名来引起人们对目前神经网络格局重构的惊人变化的关注。
Movidius 被英特尔收购——他们的口号“物联网视觉传感”为他们的重点提供了线索——他们的 VPU 或视觉处理单元可以执行 TensorFlow 或 Caffe 神经网络模型。
英特尔自己正在为新的 x86 指令准备 Linux 内核,致力于在 CPU 而不是 GPU 上运行神经网络(英特尔在这一领域已经落后英伟达很长时间了)。
就采用和公共性能而言,英伟达仍然是明确的硬件领导者——他们在深度学习上下了很大的赌注,在今年的 GTC 2016 上,它是大会的基石——从 DGX-1 到CUDA 8/cud nn 5 . x版本。
最后,我们知道 Google 有他们自己的 TPU(张量处理单元),但不太了解它们,也不知道它们如何达到 GPU 或 CPU。
简而言之,硬件正在变形,以更有效地运行更大的神经网络,并使用更少的功率。现在每个主要的软件公司都与学术机构有联系,并积极致力于将深度学习/神经计算应用到他们的平台和产品中。
这种水平的硬件和软件活动在神经计算领域是前所未有的,而且没有减弱的迹象。那么,民主党全国委员会的文件如何在所有这些活动中发挥作用,如果有的话?
可微分神经计算机
那么,什么是 DNC 呢?分解这张纸,我们得到以下要点:
- 本质上,DNC“只是”一个递归神经网络(RNN)。
- 然而,该 RNN 被允许读取/写入/更新存储器(M)中的位置——RNN 存储大小为 W 的数据的向量或张量,其中 M 具有大小为 W 的 N 行,因此 M = N*W
- DNC 使用可区分注意力来决定从哪里读取/写入/更新内存中的现有行。这是一个关键点,因为这现在使得诸如随机梯度下降(SGD)的充分理解的学习算法能够用于训练 DNC。
- 存储体 M 是关联的——实现使用余弦相似性,从而支持部分匹配和精确匹配。
- 还有另一个数据结构(名为 L ),它独立于内存 m。L 用于通过记住内存读取和写入的顺序来提供临时上下文和链接。因此“L”只是一个链表,它允许 DNC 记住它向“M”读取或写入信息的顺序。
最后,我发现在论文中提到认知计算/生物合理性很有趣(在这个领域并不常见——20 世纪 90 年代连接主义与计算主义辩论的遗留物——多次提到 DNC 和海马体之间的相似性,或者突触如何编码时间上下文和链接。
下图摘自 Deepmind 的博客文章,清楚地显示了 RNN、读写头、N*W 内存(M)和编码 M,l 中的时间关联的链表
韦斯顿等人的记忆网络呢?
脸书的韦斯顿等人也一直在这一领域努力工作。下图来自他们 2016 年 6 月的 Arxiv 论文,这篇论文是追溯到 2014 年的一系列内存网络工作的最新成果,或许内存组件受到了早期关于 WSABIE 的工作的启发/激励。
Nature 论文更好地阐述了他们解决方案的通用性(涵盖文档分析和理解、对话、图形规划等。),但这并不一定意味着的方法更好。
影响和相关性
在我看来,DNCs / RAM 代表了自 LSTM 以来循环架构的最大进步。内存的增加,加上定义明确的机制来区分并训练它,显然提高了 rnn 执行更复杂任务的能力,如规划,正如关于 bAbl 数据集或伦敦地铁任务的论文所证明的那样。
业务应用程序可以充分利用 DNC 和类似的架构。规划或更好地理解大型文档的能力对于决策支持系统、数据分析、项目管理和信息检索具有重大意义。不难想象,比如 ElasticSearch 和 Solr 的 DNC 插件,或者微软 Project Server 的 DNC 版。
将软件支持与对张量中心运算的新兴本机 CPU 指令集支持相结合,再加上正在进行的 GPU 改进和 TPUs,神经计算的未来将越来越光明。
未来工作?
wino grad 的 SHRDLU 被广泛认为是人工智能的一个高点,于 1972 年达到,自那以来没有实质性的改进或复制(梁,2015 幻灯片 100–105)。《自然》杂志文章第三页引用的迷你 SHRDLU 方块拼图实验是否指向 Deepmind 的下一个实质性研究领域——提高 1972 年以来 SHRDLU 的性能?
最初发表于humphreysheil.com。
飓风佛罗伦萨——建立一个简单的风暴路径预测模型
Hurricane Florence (2018) — As seen from International Space Station (Credit: NASA)
飓风佛罗伦萨是 2018 大西洋飓风季的第一个主要飓风。8 月 30 日,从佛得角附近的源头开始,佛罗伦萨行进了近 4100 英里,于美国东部时间 9 月 14 日上午 7 点 15 分左右在北卡罗来纳州莱特斯维尔海滩附近登陆。这种缓慢移动的风暴最初被预测为 4 级飓风,阵风 140 英里/小时,然后以 1 级风暴的形式登陆。尽管减弱为 1 级风暴,佛罗伦萨仍然有足够的风速造成重大的生命损失,家庭和社区的破坏,财产损失,以及北卡罗来纳州沿海的其他经济损失。根据穆迪分析,佛罗伦萨的初步损失估计在 170-220 亿美元之间。由于佛罗伦萨历史上的降雨和洪水的影响仍在继续,预计佛罗伦萨的成本将大幅上调是合理的。
自 8 月 30 日成立以来,国家飓风中心 (NHC)一直在跟踪佛罗伦萨的路径,并发布关于飓风当前和预计路径的报告和建议。准确预测飓风的路径使我们能够制定减灾战略,最大限度地减少飓风的经济影响,拯救生命。NHC 保留了一份不同复杂程度和结构的预测模型列表,可以用来预测飓风的路径。
在这项研究中,我们将使用大西洋飓风数据库( HURDAT2 )建立一个简单的风暴路径预测模型。然后,我们将使用开发的模型对飓风佛罗伦萨路径进行集合预测,并将模型结果与佛罗伦萨经过的实际路径进行比较。在我们深入研究模型之前,让我们首先加载数据并进行一些探索性的数据分析。
Snapshot of Processed HURDAT Dataset
探索性数据分析
**低频率-高强度风暴:**Hurd at 数据集有 1792 个命名风暴。按类别绘制风暴计数显示频率分布遵循指数/负二项式分布。虽然有 1485 个 1 级风暴,但只有四个风暴的风速达到 5 级(>155 英里/小时)。
Count of Storms by Category
季节性:北大西洋季节通常发生在 6 月 1 日至 11 月 30 日之间。绘制飓风的季节分布图显示,9 月是最活跃的月份,在某些情况下,飓风季节早在 1 月就开始了。
Count of Storms by Month
**周期性:**平均每个季节有近 10 次风暴发生,2005 年是最活跃的季节,有 28 次风暴。数据显示,在过去的几十年里,飓风的频率和强度都有明显的增加。气候变化是我们在 2017 年目睹的飓风严重性增加和聚集效应的原因吗?绘制 10 年和 25 年的移动平均线显示了几十年的振荡。
Count & Moving Averages on Storm Frequency by Year
**风暴成因:**影响热带风暴发展的主要因素有:(1)温暖的海表温度,(2)大气不稳定,(3)高湿度,(4) 科里奥利力,(5)低垂直风切变,(6)预存扰动。从 HURDAT 数据集推断,大多数风暴起源于大西洋温暖的水域和 10 度以上的纬度。赤道纬度 10 度以内的地区不会受到科里奥利力的影响,科里奥利力是热带气旋形成的一个重要因素。
**历史风暴轨迹:**在 HURDAT 数据集中绘制历史风暴轨迹显示了飓风在热带地区生成后向西传播。北大西洋飓风的顺时针旋转和全球信风使飓风沿着副热带高压脊向西北方向移动。
**登陆风暴:**在大西洋盆地形成的风暴中,只有三分之一真正登陆。有时,飓风可以多次登陆,这取决于它们可能遵循的不可预测的轨迹(环形和发夹弯)。例如,卡特里娜飓风(AL122005)在佛罗里达州的哈兰代尔海滩首次登陆时为 1 级风暴,在密西西比州的格尔夫波特第二次登陆时为 3 级飓风。
Path of Storms Named “Katrina” in the HURDAT dataset
**风速与气压:**风速和气压是 HURDAT 数据库中提供的两个附加属性。等值线图显示风速和气压呈反向相关。
Wind Speed (left) and Pressure (right) Contour Maps
马尔可夫转移模型
构建马尔可夫转移模型有五个步骤:
- 创建覆盖建模领域的网格网络
- 将历史风暴轨迹覆盖在网格上,并计算转移概率矩阵
- 给定起源点,使用步骤 2 中开发的转移概率矩阵,预测风暴的下一个位置
- 使用步骤 3 中的预测位置来预测下一时间步的位置
- 重复步骤 4,重复预定的次数
2-D Histogram of Historical Location of Storms Overlaid on Computation Grid
验证模型
在使用该模型生成佛罗伦萨飓风的风暴轨迹之前,让我们验证一下安德鲁飓风(1992 年)的模型。下图显示了 Andrew 的实际路径(黑线),以及马尔可夫转移模型生成的路径集合(大小=10)。模拟轨迹形成的包络线与飓风安德鲁经过的实际路径吻合得很好。
Historical & Simulated Storm Tracks for Andrew (1992)
预测飓风佛罗伦萨的路径
大多数起源于佛得角的风暴向北弯曲,错过了美国。飓风佛罗伦萨(路径如下所示)采取了不同寻常的轨迹,没有向北弯曲,而是缓慢向西移动,在北卡罗来纳州登陆。
Actual Path and Wind Speed of Hurricane Florence (2018)
这项研究中开发的马尔可夫转移模型被用来预测佛罗伦萨从其起源点可能采取的合理路径。运行了十个模拟的集合,结果轨迹显示在下图中。第八次模拟的结果相当好地模拟了佛罗伦萨的路径和登陆位置。总之,马尔可夫转移模型是一种简单(有趣)的方法,可以用最少的数据(仅仅是起源点)来预测飓风的路径。
Historical & Simulated Storm Tracks for Florence (2018)
简单越好?—奥卡姆剃刀
这当然是一个非常简单的路径预测模型。但是简单总是更好吗?为了回答这个问题,为了提醒 2018 年大西洋飓风季节,我将使用这个简单的模型来预测任何新飓风的路径,并将结果与复杂的全球环流模型公布的轨迹进行比较。
要了解我们如何使用深度学习进行风暴路径预测,请参见我最新的博客:
每年 6 月 1 日到 11 月 30 日之间的时间窗标志着北大西洋飓风季节。在此期间…
medium.com](medium.com/@kap923/hur…)
哈维飓风保险技术案例研究;视觉智能正在改变索赔响应时间。
Hurricane Harvey as seen from the International Space Station
过去几周,前所未有的风暴袭击了美国和加勒比海地区,造成的损失估计高达数百亿美元。
根据美国国家海洋和大气协会(NOAA)的数据,自 1980 年以来,仅美国就经历了 212 次自然灾害,总损失达 1.2 万亿美元。
作为一名对金融科技感兴趣的风险投资者,我看到相当多的创新型保险科技初创企业希望成为保险业的下一个大事件。这些企业几乎没有一家专注于改善索赔管理。这是为什么呢?
或许索赔被认为是保险业最不“性感”的一面,如果你愿意的话,这是一种必要的邪恶。优秀的保险公司知道索赔经历是保险最重要的部分之一。毕竟,保险是在发生事故时赔偿损失的承诺。
自然灾害是残酷的。它们使人们变得脆弱和暴露,保险公司的快速解决方案对客户体验至关重要,有助于留住客户,还能节省保险公司的时间和资金。
说起来容易,但在哈维和伊尔玛飓风这样的大规模事件发生后,对索赔做出动态响应可不是一件容易的事。在相当长的一段时间内,人们通常不可能进入这些地区,此时风暴潮已经平息,索赔可能更难评估。
一家为保险公司积极应对这一挑战的公司是 Geospatial Insight 。venture one最近宣布对他们进行增长型股权投资,我和他们在英国的团队在一起。他们刚刚提供了关于飓风哈维的令人难以置信的详细视觉情报,使保险公司和他们的企业客户能够了解基层的情况,并对索赔迅速做出反应。
自然灾害发生后,保险公司可以通过采用视觉智能服务来应对三大挑战:
1)事件可能导致的大致总索赔额。
2)受事件影响的区域的准确地图,以防止欺诈性索赔。
3)索赔的近因与事件直接相关。
围绕机器学习、大数据和无人机等先进技术的可能性有很多炒作,但我很少看到它们如何结合起来带来好处的切实例子,所以这里有一个现实生活中的例子。
哈维飓风案例研究
8 月 25 日,4 级飓风哈维在德克萨斯州洛克波特附近登陆。
哈维造成了灾难性的洪水,在一些地区降雨量超过 50 英寸(美国热带气旋的记录)。哈维在 72 小时内覆盖了 20,000 多平方英里,转移了 30,000 人。
情境分析
第一步是对受灾地区进行初步评估,并对预期的保险客户需求进行快速审查。大休斯敦人口密集的住宅和商业区被设定。
大数据采集、处理&分析
尽管哈维在周五登陆,但在接下来的几天里,暴雨天气仍在持续。据估计,截至周三 30 日,令人难以置信的 24.5 万亿加仑的雨水从墨西哥湾倾泻到休斯顿和德克萨斯州南部。
为了获得尽可能全面的了解,对各种数据集进行了整理,包括地形数据、卫星图像、来自社交媒体的无人机镜头以及独立委托的轻型飞机和专业高分辨率相机图像。
该团队使用从空中和社交网络收集的数据来校准用于生成哨兵足迹的阈值。然后,Geospatial Insight 使用专有算法将检测到的积水区域聚类为洪水淹没区域
为了了解哈维对住宅和商业建筑的可能影响,我们将多个数据集结合起来,以深入了解洪水的范围。下面的彩色编码图像显示了不同的数据源。
蓝色来自美国国家海洋和大气协会(NOAA)的图像和使用 Midas 倾斜相机系统进行的航空勘测。
红色的是哨兵 1 号雷达卫星,它可以穿透云层识别积水区域。
黄色的小口袋来自 Geospatial Insight 的社交媒体抓取工具,用于查找事件的照片和视频,然后可以对这些照片和视频进行映射,以根据视频证据构建范围。通常,该团队使用他们的全球许可无人机运营商网络,按照商定的 SLA 使用无人机绘制洪水地区的地图,然而,由于紧急服务使用该空域进行救援等,无人机在此期间被禁止在休斯顿上空飞行。
像下面的例子这样的镜头被识别出来,然后飞行路线和洪水范围被专业地绘制出来。
为什么洪水如此严重?
你可以清楚地看到休斯顿西部的两个大型蓝色水库,10 号州际公路北部的 Addicks 和南部的 Barker。它们旨在保护休斯顿免受洪水的侵袭,两个大坝都通向布法罗湾。水库周围都是公园和住宅区,到周一晚上,水位已经达到创纪录的水平,在阿迪克斯(北部)测得 105 英尺,在巴克(南部)测得 99 英尺。
当地官员希望通过在周二和周三缓慢释放阿迪克大坝和巴克大坝的水来防止溢出。然而,风暴潮是如此之大,工程师们不得不提前通过大坝闸门放水,否则可能会溢出并对房屋造成进一步破坏。周一早上早些时候,已经向家庭发出了疏散警告,然而,周日晚上决定释放压力,许多居民被困在由此产生的海浪中。
利用视觉智能加速索赔
为了提供快速处理保险索赔所需的情报,地理空间洞察团队需要首先理解大量的非结构化数据。
不仅是各种图像源,还有保险客户的客户信息和企业责任数据,如员工的家庭住址,以映射受影响的客户和员工。
这些数据被快速映射,多个图像源被应用为图层,以允许企业客户通过地理空间洞察专用客户门户访问和理解信息。
上图显示了用黄色标识的索赔位置点的客户端门户。
高分辨率卫星图像可能是一个很好的指标,但它们是自上而下的视图,因此很难准确了解财产的损坏程度。需要倾斜角度的图像来帮助在广阔的区域内对此进行量化,因此 Geospatial Insight 委托了一架配备 Midas 5 相机的轻型飞机来绘制受灾最严重地区的高分辨率图像。
下图展示了这款相机如何能够同时捕捉四个方向的倾斜角度(以及俯视图)。
利用这种技术,可以对大面积地区进行高分辨率成像,然后绘制成地图,提供东、西、南、东、西四个方向的倾斜图像,以便准确分析已确定的索赔地点。
凭借这种分辨率和大量数据,地理空间洞察团队可以识别洪水的证据,如房屋外的残留水、沉积物和废物,即使洪水已经排干。下图是一个展示家居用品被处理的例子。你可以清楚地看到,与那些被风暴潮毁坏的游泳池相比,凸起的游泳池仍然保持干净和蓝色。
灾后重建
可悲的是,休斯顿的许多居民似乎没有保险,面临着在没有任何形式的保险赔付的情况下重建他们的生活。对于那些有保障的人来说,快速获得资金将会有所不同。
通过采用上述部署的技术,保险公司可以在帮助居民、企业和社区尽快恢复元气方面发挥重要作用。
— — — — — — — —
关于公司的更多信息,你可以访问www.geospatial-insight.com或者给我发消息,我很乐意为你介绍这个团队。
混合模糊名称匹配
介绍
我的工作场所使用大规模数据库,其中包含关于人的数据。对于数据库中的每个人,我们都有一个唯一的标识符,它由人的名字、姓氏和邮政编码组成。我们在数据库中保存了大约 500 万人,如果人名有一点变化,基本上可能会有重复。例如,罗布·罗森和罗伯特·罗森(邮政编码相同)将被视为两个不同的人。我想指出的是,如果我们为同一个人获得额外的时间,我们只需更新记录的时间戳,因此没有必要进行这种重复数据删除。此外,我还要感谢我的同事 Jonathan Harel,他在这个项目的研究中帮助了我。
问题是
我用不同的方法清理数据库。我将描述最有趣的一个,它在这种情况下对数据库进行了很好的重复数据消除。这里我们只尝试匹配两个拥有相同邮政编码的标识符。对于数据库的很大一部分,我们保存性别数据和年龄数据,但是这些信息经常丢失。所以我基本上只剩下真实的名字了。那么我怎么确定两个名字是同一个人的呢?
救援用的机器学习
这说起来容易做起来难。这里可以用来输入到机器学习模型中的特征到底是什么?
有些功能相对直观,有些则需要彻底研究。起初,我显然是在考虑某种字符串相似性(针对拼写错误等)。),也可能是我有名字和名字的昵称的情况(如 Ben/Benjamin)。我进行了数据探索,看看我是否能加强我的想法或找到名字相似性的其他想法。这是一个好的开始,但我需要更多。经过大量的研究,我找到了下面这些名字相似的例子:
Name Similarities
特征抽出
假设我有两个邮政编码相同的人,我想给他们的“接近”程度打分。如前所述,在某些情况下,我有年龄和/或性别的数据,但通常情况并非如此。当然,这也作为特征输入到模型中。所以对于这些想法中的每一个,我需要提取它们相应的特征(因此我选择了这个名字:“混合”):
- 对于昵称**,我收集了多个名字和昵称的大型列表,然后用这些数据创建了一个 Python 字典。给定两个名字,first_name1 和 first_name2,以及昵称字典,我构建了以下函数,该函数创建一个二元特征,如果一个人的名字是另一个人名字的昵称,则该特征标记为 1:**
def is_nickname(first_name1, first_name2, nickname_dict):
first_name1_dict_vals = nickname_dict.get(first_name1)
first_name2_dict_vals = nickname_dict.get(first_name2)
if first_name1_dict_vals:
if first_name2 in first_name1_dict_vals:
return 1
if first_name2_dict_vals:
if first_name1 in first_name2_dict_vals:
return 1
return 0
- 想法 e. 到 k. 也是基于脚本所做的测试的特性,以检查在某个比较中情况是否为真(或者“相对真实”,我们将在下面的代码中看到)。例如,以下代码检查两个全名的组成部分之间的相似性:
# Out of order components ('Diaz | Carlos Alfonzo', 'Carlos Alfonzo # | Diaz') / first_name_last_name_swap ('jesse | jones', 'jones | # jesse')full_name1_splits = re.split("\W+|_", full_name1)
full_name2_splits = re.split("\W+|_", full_name2)out_of_order_components_score =
len(Counter(full_name2_splits) & Counter(full_name1_splits)) / float(max(len(full_name1_splits), len(full_name2_splits)))
- 为了文本的相似性,我使用了 Jaro-Winkler 距离、 Hamming 距离、 Damerau-Levenshtein 距离以及常规的 Levenshtein 距离。这是在测试了可用于这种情况的大量不同算法之后完成的,其中上述算法执行得最好。下面是我用于这些特性的(部分)代码片段:
from pyjarowinkler.distance import get_jaro_distance
import editdistancejaro_score = get_jaro_distance(name1, name2)
levenshtein_distance_score = editdistance.eval(name1, name2)
- 为了语音相似性,我最终确定了 NYSIIS 和双变音算法。这些算法背后的想法是,它们为英语单词创建一种编码。然后,我使用两种不同编码之间的字符串距离(这里特别是 Levenshtein 距离)。例如,双变音输出主要编码和第二编码。姓名 Catherine 和 Kathryn 的编码是这样的:
Double Metaphone Algorithm Example
- 为了使用 NYSIIS 算法提取语音相似性特征,我使用了以下代码(在该算法中,每个给定的名字只有一种编码):
import editdistance
import fuzzynysiis_score = editdistance.eval(fuzzy.nysiis(name1), fuzzy.nysiis(name2))
有人有标签吗?
您现在可能已经在想:“这是一个分类问题吗?如果有,他从哪里有标注的数据?”
嗯,我不…实际上我自己给数据加了标签。我提取了匹配的案例(例如 Jennifer Williams/Jenny Williams;标记为 1),是“接近”匹配的情况(例如,唐·安德森/丹尼尔·安德森;标记为 0),并从数据中添加一个大的随机样本进行标记。“接近”匹配允许我建立一个健壮的模型,该模型可以很好地区分真实匹配和接近但实际上不匹配的匹配。这不是一件愉快的事,但它让这个项目变得可行:)
建立模型
我现在准备训练一个模型。当然,我已经将数据分割为一个训练(分割它也是为了超参数优化)和测试集。我最关心的是精确度。让我们回忆一下精度是什么:
Wikipedia
这样做的原因是,在两个实际上不是同一个人的人之间匹配比错过两个实际上是同一个人的人之间的匹配要糟糕得多。除内部使用外,我们拥有的数据用于向数据合作伙伴导出。因此,出于商业原因,我们倾向于尽可能减少误报。
我决定选择不需要对其功能进行任何缩放的模型,所以我主要尝试了 Random Forest、GBM 和 XGBoost。我还使用 sklearn 的 GridSearchCV 进行了超参数优化:
*import* numpy *as* np
*from* sklearn.ensemble *import* RandomForestClassifier
*from* sklearn.model_selection *import* GridSearchCV# Number of trees
n_estimators = [int(x) *for* x *in* np.linspace(start=5, stop=30, num=5)]
# Number of features to consider at every split
max_features = ['auto', 'sqrt']
# Maximum number of levels in tree
max_depth = [int(x) *for* x *in* np.linspace(3, 20, num=3)]
max_depth.append(None)
# Minimum number of samples required to split a node
min_samples_split = [2, 5, 10]
# Minimum number of samples required at each leaf node
min_samples_leaf = [1, 2, 4]
# Method of selecting samples for training each tree
bootstrap = [True, False]# Create the random grid
random_grid = {'n_estimators': n_estimators,
'max_features': max_features,
'max_depth': max_depth,
'min_samples_split': min_samples_split,
'min_samples_leaf': min_samples_leaf,
'bootstrap': bootstrap}
grid_search = GridSearchCV(RandomForestClassifier(random_state=0), param_grid=random_grid, scoring='precision', n_jobs=-1, verbose=5)
grid_search.fit(train_features, y_train)
注意,您可以改变 GridSearchCV 来根据精度分数进行优化,从而改变“score”参数。
初步结果
在第一次运行优化的模型后,我在测试集上获得了 0.85 的精度分数。这很好,但我仍然希望在这里接近完美。由于我的模型可以输出一个概率,我试图找到提高精度的最佳阈值。由于召回大幅减少,这里有一个权衡。我可以把门槛降低很多,但最终的匹配数接近于零。
我决定分析我的模型出了什么问题,检查是否有什么东西联系了大多数或者所有的假阳性。我发现,在很多情况下,年龄的影响太大了(注意:数据是在过去几年中收集的,因此预计年龄不会完全相同),例如:
False-Positive Example
那我在这里能做什么?我告诉模特他犯了一个大忌。我该怎么做?就像在现实世界中一样,我会一次又一次地告诉模型那是错的。我拿了大量的案例,其中年龄相似,并且其中一个名字是相同的(就像上面看到的)。这个思路可以认为类似于主动学习的概念。
决赛成绩
这对模型产生了巨大的影响。我设法在测试集上提高到 0.99 的精度,同时保持 0.8 的召回率。
在整个数据库上运行时,该模型发现了大约 50 毫米的匹配项,对数据库进行了 10%的重复数据删除!我当然没有检查所有这些匹配,但我随机选择了几千个,发现这里的精度也是大约 0.99。以下是一些很酷的配对例子:
Matches Achieved