Node.js 中带空间的自然语言处理
在浏览器中使用 JavaScript 的自然语言处理有很多用例,但不幸的是,在这个领域没有多少工具。为了超越正则表达式和字符串操作,您需要利用一个好的 NLP 框架。SpaCy 自称为工业级自然语言处理,是一个流行的工具包,但它是一个 Python 库。这对那些只使用 JavaScript 的人来说是一个障碍。
SpaCy 的特点是神经网络模型、集成单词向量、多语言支持、标记化、词性标注、句子分割、依存解析和实体识别。SpaCy 拥有 92.6%的准确率,并声称是世界上最快的语法分析器。
一个名为 spacy-nlp 的 npm 包旨在通过向 node.js 公开 spacy 的自然语言处理能力来跨越这一障碍。
- 句法剖析
- 名词解析
- 动词解析
- 形容词解析
- 命名实体解析
- 日期解析
- 时间解析
一些可用的助手方法有:
- 拆分大文本
- 删除重复的字符串
- 字符串中的前 n 个单词
这个包最初是由华龙径创建的,后来我用它来扩展功能。这里可以找到分叉版。 Textalytic 也使用这个包与 Spacy 和其他 Python 自然语言处理框架接口。
装置
首先,推荐使用 Python3,但也可以使用 Python2。您需要首先通过 Python 包索引安装 SpaCy:
**python3 -m pip install spacy**
接下来,您需要通过 Python 安装 socketIO-client。该软件包用于促进内部跨语言交流。
**python3 -m pip install -U socketIO-client**
默认情况下,这个包使用 SpaCy 的 en_core_web_md 语言模型。要下载它,您需要运行以下命令:
**python3 -m spacy download en_core_web_md**
接下来,通过 NPM 安装软件包:
**npm install git+**[**https://github.com/jeffreyflynt/spacy-nlp.git**](https://github.com/jeffreyflynt/spacy-nlp.git)
在您的 JavaScript 文件中,您将导入包并使用公开 spacyIO 的 Python 客户端启动服务器。(默认端口为 6466)。
**const nlp = require("spacy-nlp");
const serverPromise = spacyNLP.server({ port: process.env.IOPORT });**
一些需要注意的事情
- 将空间加载到内存中可能需要 15 秒。
- 在应用程序的生命周期中,语言模型将留在内存中。(en_core_web_md —大小:91 MB)
- 如果你对应用程序的多个实例进行负载平衡,你会希望为每个
spacyNLP.server()
提供一个唯一的端口。
给我看一些例子
提取日期
假设您想从该文本中提取所有日期:
在这个共产主义国家已经饱受经济停滞之苦的时候,美国增加了对苏联的外交、军事和经济压力。1982 年 6 月 12 日,100 万抗议者聚集在纽约中央公园,呼吁结束冷战军备竞赛,特别是核武器。20 世纪 80 年代中期,新的苏联领导人米哈伊尔·戈尔巴乔夫(Mikhail Gorbachev)引入了改革(“重组”,1987 年)和开放(“开放”,约 1985 年)的自由化改革,并结束了苏联在阿富汗的参与。
输入您的文本并选择返回单词或只返回总数。返回的结果是:
- 1982 年 6 月 12 日
- 二十世纪八十年代中期
- 1987
- 1985
提取命名实体
或者您可能希望从该文本中提取所有命名实体:
冷战的第一阶段始于 1945 年第二次世界大战结束后的头两年。苏联巩固了对东方集团国家的控制,而美国开始了挑战苏联权力的全球遏制战略,向西欧国家提供军事和财政援助(例如,支持希腊内战中的反共一方)并创建了北约联盟。
这将返回:
- 冷战
- 第二次世界大战
- 苏维埃社会主义共和国联盟
- 东方集团
- 美国
- 苏维埃
- 西欧
- 希腊内战
- 北大西洋公约组织(North Atlantic Treaty Organization)
提取名词
你可以得到更细的粒度,提取一个文本中的所有名词。
【1941 年 6 月 22 日,欧洲轴心国发动了对苏联的入侵,开启了历史上最大的陆地战场,这使得轴心国,最关键的是德国国防军陷入了消耗战。第二次世界大战(通常缩写为 WWII 或 WW2),又称第二次世界大战,是一场从 1939 年持续到 1945 年的全球性战争。
这将返回:
- 能力
- 侵略
- 陆地
- 戏院
- 战争
- 历史
- 战争
- 消耗
- 战争
更多的例子可以在 Github 上找到,更多的方法将很快出现。
结论
上述方法是 NLP 管道的起点。人们可以发挥创意,将日期/时间解析与命名实体提取结合起来,构建演员/玩家事件的时间线。或者用一个 web scraper 来聚合提及,这种可能性是无穷无尽的。
我计划增加更多的功能,如训练模型,文本分类,句子分割,等等。欢迎任何反馈。
感谢阅读这篇文章。如果您有任何问题或意见,可以通过 Twitter @jeffrey_flynt 联系我。
张量流自然语言处理
Photo by Kelly Sikkema on Unsplash
嘿大家好!在这篇文章中,我试图总结 Deeplearning.ai 在 TensorFlow 中关于自然语言处理的课程。
第一周
在处理图片时,我们已经有了像素值,这些像素值就是数字。然而,在处理文本时,必须对其进行编码,以便神经网络能够轻松处理。
为了对单词进行编码,我们可以使用它们的 ASCII 值。然而,使用 ASCII 值限制了我们对句子的语义理解。
例如:-
在上面两个单词中,我们有相同的字母,因此有相同的 ASCII 值,但每个单词都有完全相反的意思。因此,使用 ASCII 值从单词中提取含义是一项艰巨的任务。
现在,我们不再用数字即 ASCII 值来标记每个字母,而是标记每个单词。在上面的句子中,我们已经标注了每个单词。唯一不同的是最后一个词。当我们只看标签时,我们观察到一种模式。
我们现在开始看到句子之间的相似之处。现在我们可以从中得出意义。从这里开始,我们可以开始训练一个能够理解句子意思的神经网络。
Tokenizer 将处理代码中的繁重工作。使用 tokenizer,我们可以标记每个单词,并提供句子中使用的单词的字典。我们创建了一个 tokenizer 实例,并将一个超参数 num_words 赋值为 100。这实际上是将最常见的 100 个单词进行记号化。对于上面的句子,这太大了,因为只有 5 个不同的单词。
使用 fit_on_texts() 方法对句子进行编码。
word_index 方法返回一个键值对字典,其中键是句子中的单词,值是分配给它的标签。人们可以通过印刷来阅读这本词典。
word_index 返回上述键值对。注意“我”已经被“我”代替了。这就是 tokenizer 所做的;它省略了标点符号。
以上句子的 word_index 返回以下词典。
注意,那条**‘狗!’**不会因为旁边有感叹号就被当作一个单独的词。相反,作为标点符号的感叹号被去掉,只包括单词。“你”是另一个新词,被赋予了新的价值。
将一组句子传递给***’ text _ to _ sequences()'***方法,根据传递给它的单词集将句子转换成它们的标签等价形式。
如果语料库缺少句子中存在的一个单词,则该单词在被编码为等价标签时被省略,而其余的单词被编码和打印。
例如:-在上面的 test_data 中,语料库中缺少了**‘真的’这个词。因此,在编码时,省略了单词‘真的’,取而代之的是编码句子‘我爱我的狗’。**
同样,对于第二个句子,单词语料库中缺少单词**‘loves’,‘manatee’。因此,编码的句子是‘我的狗我的’**。
为了克服上述示例中面临的问题,我们可以使用巨大的单词语料库,或者使用超参数***【oov _ token】并将其分配给某个值,该值将用于对语料库中以前未见过的单词进行编码。【oov _ token】***可以赋给任何东西,但是应该给它赋一个唯一的值,这样它才不会和原来的单词混淆。
以上代码片段的输出。注意, ’ < 00V > ’ 现在是 word_index 的一部分。句子中不存在的任何单词被替换为 ’ < 00V > ’ 编码。
当向神经网络输入训练数据时,必须保持数据的一致性。例如,在为计算机视觉问题输入图像时,所有输入的图像都具有相似的尺寸。
类似地,在 NLP 中,当以句子的形式输入训练数据时,使用填充来提供句子的一致性。
我们可以看到,在句子的开头生成了形式为**‘0’**的填充。参考最长的句子进行了填充。
如果要在句子后进行填充,可以将超参数设置为**【post】。通常参考最长的句子进行填充,但是可以提供超参数 maxlen 来覆盖它并定义句子的最大长度。现在,有了 maxlen 的知识,人们可能会想,如果只取了句子的一定长度,信息是否会丢失。这是真的,但人们可以指定从哪里单词被省略。将它设置为【post】**允许从句尾开始释放单词。
第二周
单词嵌入:**将单词和关联单词在多维空间中聚类为向量。**和词出现在一个句子中,意思相近的词往往彼此接近。**
Eg:- “电影本来是 沉闷 和 无聊 。”;“这部电影是 好玩的 和 刺激的 ”
现在想象一下,我们在一个更高维度的空间中获得一个向量,假设 16 个维度和单词一起被赋予相似的向量。久而久之,意思相近的词开始聚集在一起。单词的含义可以来自对数据集的标注。
所以以上面的句子为例,单词和 无聊 在负面评论中出现了很多,因此它们有相似的情感,并且它们在一个句子中出现得很近,因此它们的向量会相似。随着神经网络的训练,它可以学习这些向量,并将它们与标签相关联,以产生所谓的嵌入,即每个单词的向量及其相关的情感。**
相似的词在负面评论中出现很多————>相似的情绪
相似的单词在一个句子中彼此靠近出现— — →相似向量
现在,在构建神经网络时,我们使用嵌入层,该层给出 2D 数组形状的输出,其中句子的长度作为一个维度,嵌入维度(在我们的例子中为 16 个维度)作为另一个维度。
因此,我们使用展平层,就像我们在计算机视觉问题中使用它一样。在基于 CNN 的问题中,像素的 2D 阵列需要被展平以将其馈送到神经网络。在基于 NLP 的问题中,需要展平嵌入的 2D 阵列。
型号摘要:-
或者,我们可以使用GlobalAveragePooling1D层,其工作方式类似。
该模型的摘要现在看起来如下
现在模型更简单,因此速度更快。然而,经分析发现,上述模型虽然比 展平 模型更快,但精度稍低。
损失函数
为了理解损失函数,我们需要根据预测的置信度来处理它。因此,尽管准确预测的数量随着时间的推移而增加,但损失的增加意味着每次预测的可信度实际上降低了。我们需要探索训练集和验证集之间的损失差异。
我们现在尝试调整超参数
现在我们收到以下结果:-
我们注意到损失函数变平了,这比以前的结果好,但精度不高。
对超参数执行另一个调整,其中嵌入向量中使用的维数被改变。
****
得到的结果与前一个没有太大的不同。
总结最终代码:
我们首先通过提供 词汇大小 和 vocab (oov) 标记中的 来实例化一个标记化器。
接下来,我们使用*fit _ on _ texts()*方法对用于训练的句子进行分词。
word_index 让我们可以查看单个单词被编号或标记了什么。
*****text _ to _ sequences()*以数字格式对用于训练的整个句子进行编码。
接下来,我们通过指定 来填充序列,填充什么,填充是在句子之前还是之后,以及被填充句子的最大长度。
类似于编码训练句子,我们编码验证句子并填充它们。
现在我们创建一个名为label _ tokenizer的单独的标记器来标记标签,并将其安装在标签上进行编码。
现在,我们为训练标签和验证标签创建一个 numpy 编码标签数组。
该模型被创建并被训练 30 个时期。
****
使用下面的代码,可以绘制训练集和验证集的准确性和损失。
我们使用一个帮助函数来反转包含编码单词的字典,该函数有助于我们绘制嵌入。
****
我们创建矢量和元文件,并存储元数据和矢量嵌入。
我们可以在下面提到的链接中上传矢量化和元数据文件,并通过绘制在更高维度的空间中查看单词嵌入。
可视化高维数据。
projector.tensorflow.org](http://projector.tensorflow.org/)
第三周
在前几周,我们试图实现一个分类器,试图根据文本对句子进行分类。我们试图通过标记单词来做到这一点,并注意到我们的分类器未能获得任何有意义的结果。原因是当单词被分解成子单词时,很难理解单词的上下文。理解子词出现的顺序对于理解它们的意思是必要的。
例如:-
下图是斐波纳契数列的序列。
上述序列以循环方式工作,即
通过分析这种循环,我们可以确定数字的顺序。没有明确提到这个顺序。提供数据及其标签,并通过神经网络导出序列。
斐波纳契数列的递归函数可以用上图表示,其中 Xt 是数列的初始数字。该函数然后输出 yt,,即前两个数的和。总和值被带入下一次迭代,在那里它被加到第二个数字上并输出另一个值。序列继续。
展开后,上面的递归函数看起来像这样
X0 - > 1,2;f->(1+2);y0 - > 3
X1 - > 2,3;f->(2+3);y1 - > 5
X2 - > 3、5;f->(3+5);y2 - > 8
我们观察到, 电流输出高度依赖于紧接的前一步,并且如果序列特别大,则最不依赖于初始步骤 ,即 y2 高度依赖于前一步( X1,F,y1 )并且较少依赖于( X 0, F,y0 )。类似地, y1 高度依赖于前一个步骤( X 0, F,y0 ),如果它存在于序列中,那么它对初始步骤的依赖性会小一些。
这形成了递归神经网络(RNN)的基础。
这给文本分类带来了新的挑战。
假设在下面的例子中,我们需要预测 blue 后面的单词。
当看这个句子时,我们可以预测,当在上下文中谈论一个美丽的蓝色东西时,我们很可能指的是“天空”。
在这种情况下,帮助我们预测下一个单词的上下文单词与我们感兴趣的单词非常接近,即单词“blue”与我们感兴趣的单词“sky”相邻。
然而,我们也可能遇到预测感兴趣单词所需的上下文单词可能出现在句子开头的情况。在这里,RNN 的概念可能会失败,因为它试图通过考虑紧接在它前面的单词来预测感兴趣的单词。
例如:
在上面的句子中,我们可以观察到上下文单词“Ireland”在句子中出现得更早,而感兴趣的单词“Gaelic”出现得更晚。RNN 人最有可能通过考虑紧接在单词“盖尔语”之前的单词,即“说话”、“说话”、“如何”,来预测单词“盖尔语”;但这些单词都不会有助于“盖尔语”这个词的预测。
在这种情况下,我们需要修改 RNN。
LSTM(长短期记忆)
在这些类型的网络中,除了像在 RNN 中那样传递上下文之外,LSTM 还具有通过网络的称为 信元状态 的附加上下文管道。这有助于保持上下文与前面的令牌或后面的步骤相关,以克服上面示例中刚刚讨论的挑战
单元状态 可以是双向的,以便句子中后面出现的标记可以影响前面的标记。
在代码中实现 LSTMs
LSTM 层是使用上面的代码实现的。传递的参数是该层所需的输出数量。在这种情况下是 64 。
我们以双向格式包装 LSTM 层,它将使 单元格状态 向两个方向移动。
因此,模型摘要如下所示。
请注意,双向层的输出形状是 128 ,尽管我们已经将 64 作为参数传递。这是由于双向层有效地使 LSTM 层的输出加倍。
我们也可以堆叠 LSTM 层,但是我们需要确保return _ sequences = True存在。这使我们能够将当前 LSTM 图层的输出与下一个 LSTM 图层的输出进行匹配。
该模型的总结如下:
比较准确度和损耗
我们注意到 1 层 LSTM 网络的训练精度似乎不均匀,而 2 层 LSTM 网络的训练精度平滑得多。这种不均匀性的出现通常表明模型需要改进。
在绘制损失函数时,我们注意到类似的结果。1 层 LSTM 网络似乎具有锯齿状的表面,而 2 层 LSTM 网络具有平滑的表面。
当我们训练 50 个时代的网络时,我们注意到 1 层 LSTM 容易出现一些非常急剧的下降。即使最终的精度是好的,这些下降的存在使我们对模型产生怀疑。相比之下,2 层 LSTM 具有平滑的曲线,并且实现了类似的结果,但是因为它是平滑的,所以该模型更加可靠。
在绘制损失函数时,可以观察到类似的趋势。2 层 LSTM 网络的曲线看起来比 1 层 LSTM 网络平滑得多。两条曲线中的损耗都逐渐增加,并且需要密切监控,以检查其是否如所期望的那样在以后的时期变平。
比较非 lstm 和 lstm
i) Without LSTM
ii) With LSTM
当使用池化和扁平化的组合时,我们很快达到了 85%的准确率,然后它变平了。验证集有点不太准确,但是曲线看起来与训练准确性同步,在 80%的准确性处变平。
另一方面,当在网络中使用 LSTM 层时,我们很快就达到了 85%的准确率,并继续上升到 97.5%。验证集的准确率提高到 82.5%,但随后下降到 80%,与之前的网络相似。精确度的下降暗示着某种过度拟合肯定正在发生。要解决这个问题,需要对模型进行一点调整。
当比较损失函数时,观察到类似的趋势。培训损失迅速下降,然后趋于平缓。验证准确性似乎表现类似。而在 LSTM 网络中,训练精度下降得很好,但是验证精度增加了,从而暗示了模型中可能发生的可能的过度拟合。直观地说,这意味着当模型的准确性增加时,对它的信心减少了。
使用卷积层
在网络中应用了卷积层,现在单词将按照滤波器的大小分组,即 5 个和卷积将被学习,它们可以将单词分类映射到期望的输出。
过滤器数量->128;过滤器尺寸- > 5
我们观察到,我们的模型甚至比以前的模型表现得更好,在训练集上接近 100%的准确性,在验证集上接近 80%的准确性,但与以前一样,我们在验证集上的损失增加,表明过度拟合,因此预测置信度下降。
如果我们回到我们的模型,探索卷积层的参数,我们会注意到每组 5 个字有 128 个滤波器。
在查看模型摘要时,我们注意到句子的输入长度是 120 并且过滤器大小是 5 ,因此前面的 2 个单词和后面的 2 个单词被去掉,留给我们的句子大小是 116 。因为我们使用了一个 128 卷积,所以我们得到了 (116,128) 的输出维数。
第四周
标记器被初始化,并以由 “\n” 分隔的句子的形式提供数据。然后将句子转换成小写字母,并使用拆分方法检索单个句子,并将其作为列表项存储在 【语料库】 列表中。使用 fit_on_texts 方法对列表中的单词进行标记和标注。数据中存在的总唯一字存储在变量 total_words 中。额外的 1 是因为 oov_token 的存在。
上面突出显示的代码给出了下面的输出。检索并编码 语料库 列表中的第一行文本。
下一个循环将整个编码句子分解成一个n _ gram _ sequence,并将每个序列添加到input _ sequences列表中。
下图中的"**输入序列"**中的每一行都是一个 n_gram_sequence。
然后,我们试图通过遍历所有可用的输入序列来确定最大句子的长度。
一旦确定了最大句子的长度,我们就用prepad输入序列。
上面的代码给出了下面的输出。
我们预填充上述输入序列的原因是,我们可以将整个训练数据放在每个输入序列的左侧,而将代表它的标签放在右侧。在这种情况下,由于我们预测每个句子末尾的单词,我们将每个输入序列的最后一个单词视为要预测的目标标签。
现在,我们开始分离输入序列,收集最后一个单词之后的所有编码单词作为模型的输入,最后一个编码单词作为目标标签,并将它们存储在单独的列表中,如下所示。
由于这是一个多类分类模型,我们使用下面的代码对其进行编码。
如前所述,给定编码的句子,直到倒数第二个编码单词的所有编码单词被存储为模型的输入 X 。在如下所示的情况下,所有编码字直到 69 被存储为 X ,最后一个编码字 70 被存储为标签。
标签的一键编码如下图所示 Y 。第 70 个元素存储为 1 ,因为编码标签与之对应,其余为 0 。
问题的模型如下所示。我们使用 adam 优化器,因为它碰巧在这种情况下表现得特别好。
上述模型的性能精度绘制如下。
我们注意到,某些已经被预测到的单词在最后往往会重复出现。这是因为模型中使用的 LSTM 层是单向的,并且同一个单词一旦被预测就继续向前传递,从而影响句子中稍后被预测的单词。
为了克服上述问题,我们使用双向 LSTM 层,使得即使在目标单词影响预测之后,单词仍然存在。
包含双向层的精度绘制如下。
包含双向层的输出如下所示。我们观察到单词的重复确实继续存在,但是它的频率降低了。也就是说,下面的文本是一首诗的一部分,其中的单词需要押韵,因此必须遵循一定的顺序。因此,重复可能不是由于模型中的错误,而是由于句子的固有结构。
我们现在尝试通过给它一组初始单词来生成一首诗。
因为单词 Laurence 不在语料库中,所以它没有被编码。
在填充句子之后,我们以下面提到的一个序列结束。
试图预测输入句子后面的大量单词是不可取的,因为最初预测的单词本身是基于某种概率的。随着更多的单词被预测,概率持续降低,因此预测的质量持续恶化,直到预测的单词不再相关并且作为输出出现乱码。
解决上述问题的方法是使用更大的单词库。
我们知道这样一个事实,Adam optimizer 在这类问题中表现良好。为了更好地进行调优,我们可以显式地实例化优化器,并用学习率进行实验。
由于英语的单词比单个字母多,我们可以通过提供编码的字母来训练模型,并训练它预测下一个字母。这样,我们就不必担心拥有一个超大的文本语料库。**
感谢您阅读本博客。我希望听到你对此的想法。
自然语言理解——对话代理的核心组成部分
摘要
BI Intelligence, https://i.insider.com/5970ca60552be5ad008b56ce?width=600&format=jpeg&auto=webp
我们生活在一个信息应用处理我们各种日常活动的时代,事实上,这些应用已经超过了社交网络,正如 BI Intelligence 报告中所指出的那样。除了这一点之外,消息平台的消费预计在未来几年将进一步显著增长;因此,在人们积极参与的情况下,这是不同企业获得关注的巨大机会。
在这个即时满足的时代,消费者希望公司能够毫不拖延地对他们做出快速反应,当然,这需要公司花费大量的时间和精力来雇佣和投资他们的员工。因此,现在是任何组织考虑与最终用户保持联系的新方法的时候了。
许多正在经历数字化转型的组织已经开始利用人工智能的力量,如人工智能辅助的客户支持系统、使用人工智能辅助面试的人才筛选等。甚至还有许多对话式人工智能应用程序,包括 Siri、谷歌助理、个人旅行助理,这些应用程序可以个性化用户体验。
概述
有两种创建对话代理的方法,即基于规则和自学习/机器学习。对于基于规则的方法,您可以使用正则表达式来创建一个简单的聊天机器人。
在这篇文章中,我将向你展示如何使用机器学习和单词向量来将用户的问题分类成意图。除此之外,我们还将使用一个预建的库来识别文本中的不同实体。这两个组件属于自然语言理解,在设计聊天机器人时非常关键,以便用户可以从机器获得正确的响应。
自然语言理解
NLU(自然语言理解)是自然语言处理的重要组成部分,它允许机器理解人类语言。这有两个重要的概念,即意图和实体:
我想订一张从 A 到 c 的机票。
Intent: 在这种情况下,最终用户的目标是预订从一个地点(A)到另一个地点©的航班。因此,这个问题的目的或意图是“预订票”。
**实体:**这个查询中有两个概念/实体;出发城市(A)和目的地城市(B)。
总而言之,意向“保留票”具有以下实体:
出发城市
目的城市
我们现在可以使用这些信息为我们的用户提取正确的响应。
作为本教程的一部分,我们将使用聊天机器人语料库(https://github.com/sebischair/NLU-Evaluation-Corpora),由 206 个问题组成,由作者标记。数据有两种不同的意图(出发时间和查找连接)和五种不同的实体类型。在本帖中,我们将使用问题和意图进行意图分类。然而,当涉及到实体时,我们不会训练我们的自定义实体,相反,我们将利用预先训练的命名实体识别器从文本中提取实体。当然,可以使用不同的算法来训练自定义实体,但是我们可以稍后再研究它。
第 1 部分:意图分类
为了将用户的话语分类为一个意图,我们可以利用正则表达式,但是当规则很容易定义时,它工作得很好。
我们现在将转向机器学习方法来对用户的话语进行分类;这是一个有监督的文本分类问题,我们将利用训练数据来训练我们的模型来对意图进行分类。
这里的一个重要部分是理解单词向量的概念,以便我们可以将词汇中的单词或短语映射到实数向量,从而使相似的单词彼此接近。例如,单词“冰川”的矢量应该接近单词“山谷”的矢量;出现在相似上下文中的两个单词有相似的向量。因此,单词向量可以捕捉单词集合中的上下文含义。
Please use this link to play with : http://projector.tensorflow.org/
我们将利用 Python 中的 Spacy 包,它自带了加载训练向量的内置支持。经过训练的向量包括 word2vec、glove 和 FastText。
如果我们谈论 word2vec,它有两种风格,连续词包(CBOW)和跳格模型。
http://idli.group/Natural-Language-Processing-using-Vectoriziation.html
连续单词包(CBOW)试图使用相邻单词来猜测单个单词,而 skip gram 使用单个单词来预测其在窗口中的相邻单词。
简要细节
输入以一个热向量的形式输入到网络。
隐藏层是神奇的部分,这就是我们想要的。隐藏层权重矩阵是我们感兴趣的词向量,它只是作为一个查找表,因为当你在输入词的一个热向量和隐藏层的权重矩阵之间应用点积时,它将挑选对应于 1 的矩阵行。(注意:根据词汇量的大小,单词向量的维数通常在 100 到 300 之间)
输出部分是 Softmax 函数,它给出了目标单词的概率。
我们不会深入讨论与此相关的更多细节。
使用预训练的单词向量训练意图分类器
第一步:加载数据
df=pd.read_excel(“Chatbot.xlsx")
queries=np.array(df['text'])
labels=np.array(df['intent'])
Image by author
步骤 2:加载预训练的空间 NLP 模型
Spacy 是 Python 的一个自然语言处理库,带有内置的单词嵌入模型,它使用 300 维的手套单词向量
# spacy NLP Model
nlp = spacy.load(‘en_core_web_lg')
n_queries=len(queries)
dim_embedding = nlp.vocab.vectors_length
X = np.zeros((n_queries, dim_embedding))
第三步:预处理——词向量
现在,如果我们在查询部分看到包含以下内容的数据:
print(queries)
Image by author
为了训练模型,我们需要使用 Spacy 预训练模型将这些句子转换为向量。
for idx, sentence in enumerate(queries):
doc = nlp(sentence)
X[idx, :] = doc.vector
Image by author
现在,我们已经将句子转换为向量格式,可以将其输入到机器学习算法中。
步骤 4:使用 KNeighborsClassifier 的训练模型
#########Splitting Part###########
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.30, random_state=42)
Image by author
#############Training Part###########
from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=1)
neigh.fit(X_train,y_train)
我们来评价一下。
###########Evaluating##############
print("Accuracy on Test Set: ",np.count_nonzero(neigh.predict(X_test)==y_test)/len(y_test))
让我们检查一下示例查询
请注意,这是正确地标识了 FindConnection 意图。您可以尝试不同的变体来测试这一部分。
恭喜你,我们已经成功构建了我们的意图分类器,它可以理解用户话语的目的。现在机器知道了用户问题的目的,它需要提取实体来完整地回答用户试图问的问题。
第 2 部分:实体识别
实体提取帮助我们计算出正确的字段,以便用户可以从机器得到正确的响应。例如,分类为 FindConnection 的查询“从 olympia einkaufszentrum 到 hauptbahnhof”有两个实体:olympia einkaufszentrum(起始位置)和 hauptbahnhof(目的地位置)。
在从文本中识别出意图和实体之后,我们可以生成一个查询,该查询可以从数据库中获取响应。
EXAMPLE SQL to FETCH from the database:
SELECT ___ FROM CONNECTIONS
WHERE START_LOCATION=‘olympia einkaufszentrum’
AND END_LOCATION=‘hauptbahnhof’
__________
FURTHER CONDITIONS IF REQUIRED
___________
这只是 SQL 的一个例子,向您展示了意图和实体对于为用户提取正确响应的重要性。
为了识别实体,我们将使用 Spacy 命名实体识别,它已经支持实体类型,如 PERSON、FAC(建筑物、机场、高速公路)、ORG(公司、组织)、GPE(县、州、城市)等。要查看更多的实体类型,请参考此链接:【https://spacy.io/api/annotation
doc = nlp('from olympia einkaufszentrum to hauptbahnhof')
for ent in doc.ents:
print(ent.text,ent.label_)
Image by author
正如你所看到的,斯帕西·NER 已经从文本中识别出了这两个实体。但是,这个库只支持基本的实体,如人、位置等。在我们的例子中,olympia einkaufszentrum 应被标记为起点位置,hauptbahnhof 应被标记为终点位置。
我们还可以训练自定义实体来支持我们的问题。有各种实体提取器可用,如 CRFEntityExtractor、MitieEntityExtractor、EntitySynonymMapper 等,通过它们可以训练您的自定义实体。你甚至可以用自定义实体来训练 NER 空间。这由你来决定。
结论
在这篇文章中,我们看到了自然语言理解的一个重要概念,它可以推断出最终用户的意思。更准确地说,它是自然语言处理的理解部分,可以消化、理解文本以向最终用户输出相关的响应。意图和实体是 NLU 的两个重要组成部分,我们看到了如何使用 Spacy 和 scikit-learn 的简单方法来执行意图分类和实体识别。有各种支持 NLU 的聊天机器人平台,包括 RASA NLU,Dialog Flow,IBM Watson,Amazon Lex。从文本中提取意图和实体,拉莎·NLU 将是一个很好的起点。
除了自然语言理解,其他几个组件在构建人工智能辅助的聊天机器人中也很重要。你需要探索槽填充部分,内存元素和更多来创建一个好的工作对话代理。
参考
[1]https://medium . com/bhavaniravi/entity-extraction-除雾-rasan Lu-part-3-13a 460451573
【2】https://github.com/sebischair
【3】https://repl.it/@just_a_girl/Datacamp-Using-Spacy-for-NLP
【4】https://www.datacamp.com/community/tutorials
【5】https://www . SIG dial . org/files/workshop/conference 18/proceedings/pdf/sigdial 2
基于序列对序列模型的自然语言理解
如何预测客户询问背后的意图?Seq2Seq 型号说明。使用 Keras 在 ATIS 数据集上演示槽填充。
自然语言理解(NLU),对话式人工智能(聊天机器人、虚拟助理、增强分析)背后的技术通常包括意图分类和槽填充任务,旨在为用户话语提供语义工具。意图分类侧重于预测查询的意图,而槽填充提取查询中的语义概念。例如,用户查询可以是“给我找一部史蒂文·斯皮尔伯格的动作片”。这里的目的是“寻找电影”,而槽是值为“动作”的“类型”和值为“史蒂文·斯皮尔伯格”的“导演”。
意图分类是预测意图标签的分类问题,而槽填充是标记输入单词序列的序列标记任务。在研究中,通常会发现使用基于递归神经网络(RNN)的方法,特别是门控递归单元(GRU)和长短期记忆(LSTM)模型,在意图分类和槽填充方面的最新表现。
本文处理槽填充任务。我们首先介绍机器翻译任务,以激励序列到序列模型,这已经统治了神经机器翻译的世界多年。我们用序列到序列模型来解决槽填充的任务。该方法是从理论上提出的,并使用 ATIS 数据集进行了实践,该数据集是一个广泛用作意图分类和缝隙填充任务的标准基准数据集。
迷失在翻译中
古老的语言
语言翻译很难,不仅仅是对人类。过去,我们使用基于规则的机器翻译,让语言学家在词汇、句法或语义层面创建和维护将源语言文本转换成目标语言的规则。后来,统计机器翻译更倾向于使用统计模型来学习翻译给定的大量例子。给定源语言的文本,例如法语 (f) ,在目标语言中最有可能的翻译是什么,例如英语 (e) ?在平行语料库上训练翻译模型 p(f|e) ,并且仅在目标语料库(英语)上计算语言模型 p(e) 。
尽管统计机器翻译方法有效,并被 IBM 和 Google 等大公司应用和商业化多年,但它局限于翻译的短语,失去了目标文本的广泛本质。此外,统计方法需要仔细调整翻译管道中的每个模块。
回到过去,传统的基于短语的翻译系统通过将句子分解成多个组块并逐个短语地翻译它们来完成工作。这种方法造成了不流畅的翻译。
神经机器翻译于 2014 年问世,引入了使用神经网络模型来学习机器翻译的统计模型。从那时起,我们不必计算条件概率的规则。网络学习它们的权重,发现所有的规则和概率,语言学家和统计学家将花费巨大的精力来编码。
在我们的上一篇文章中,我们展示了递归神经网络,尤其是 LSTMs 如何在 20 年中根据时间步长 t-1 的前一个元素来预测时间步长 t 的序列元素。递归神经网络也能帮助语言翻译吗?
厌倦了德法数据集?看看 Yemba,脱颖而出。力学的 LSTM,GRU 解释和应用,与…
towardsdatascience.com](/lstm-based-african-language-classification-e4f644c0f29e)
直接使用 LSTM 将一系列单词从一种语言映射到另一种语言很快就会遇到问题。要使单个 LSTM 工作,您需要输入和输出序列具有相同的序列长度,而对于翻译来说,这种情况很少发生。例如,两个单词的英语短语“正在播放”被翻译成一个单词的德语短语“spielt”
序列对序列学习
前一节介绍的问题的最佳解决方案是编码器-解码器架构,即所谓的序列到序列学习和神经网络,以及将源文本编码为内部固定长度表示(称为上下文向量)的能力。一旦编码,不同的解码系统可以用来翻译成不同的语言。
Sutskever 等人,2014 , Cho 等人,2014 发明了这种方法。Sutskever 的模型在 2014 年获得了 34.81 的 BLEU 分数,与统计机器翻译系统为英法翻译开发的 33.30 的基线分数相比,这是一个巨大的飞跃。这是神经机器翻译系统在大规模问题上胜过基于短语的统计机器翻译基线的第一个例子。Sutskever 的模型被用来对最佳翻译名单进行重新评分,并将分数提高到 36.5 分,接近当时的最佳成绩 37.0 分。 BLEU 算法(双语评估替补)通过比较候选译文和参考译文之间的 n 元语法数量来评估译文的质量。Sutslever 的模型是在数据集中 1200 万个句子的子集上训练的,包括 3.48 亿个法语单词和 3.04 亿个英语单词。
编码器和解码器通常是 LSTMs 或 gru 的层。虽然不建议太深入,但 Google Translate 使用的是 ca。7 层。很少有博客建议将单词以相反的顺序输入网络以提高性能。在许多实际情况下,在编码器中使用双向架构,通过使用以正常顺序从原始句子学习的层和以单词的相反顺序从原始句子学习的另一层。来自两层的上下文向量被连接以产生唯一的上下文向量,该上下文向量被馈送到解码器中。
在一个对话代理的例子中,输入序列“你好吗”首先通过使用一个预训练嵌入或通过在我们的数据集上训练我们自己的嵌入被转换成单词嵌入。
理解书面单词:温习 Word2vec、GloVe、TF-IDF、单词袋、N-grams、1-hot 编码…
towardsdatascience.com](/representing-text-in-natural-language-processing-1eead30e57d8)
嵌入向量的大小通常为 200 或 300。这样的向量通过编码器的 LSTM 单元,以创建它的较小维度的表示。该表示然后被转发到解码器网络,该解码器网络生成其自己的表示输出“我很好”的序列。
因为编码器和解码器都是递归神经网络,每个时间步,其中一个 rnn 做一些处理,它根据它的输入和它看到的以前的输入更新它的隐藏状态。编码器的输入是来自输入句子的当前单词的矢量嵌入,例如“Je suis étudiant”。编码器的隐藏状态是先前单词的记忆表示。最后一个隐藏状态实际上是传递给解码器的上下文,它自己生成一个序列,表示输出“我是学生”。
(source: Jay. Alammar, 2018)
上下文是一个数字向量。其大小通常是编码器 RNN 中隐藏单元的数量。下面,我们展示了一个大小为 4 的示例向量,但是上下文向量的大小通常是 256、512 或 1024。
(source: Jay. Alammar, 2018)
编码器-解码器架构中使用的 RNNs 模型可以是单向或双向的、单层或多层的、简单的普通 RNN 或 LSTM 或 GRU。下面我们展示一个使用 LSTM 作为循环单元的深度多层单向 RNN 的示例。这里,“”表示解码过程的开始,而“”告诉解码器停止。
解码人类意图
在本节中,我们将实现一个用于自然语言理解的序列到序列模型。通常,这涉及两个任务:意图检测(ID)和槽填充(SF)。前者试图将用户话语分类为意图。后者试图找到这种意图的“论据”是什么。
探索数据集
我们在著名的 ATIS 数据集(航空旅行信息系统)上训练我们的模型。Pickle 格式的数据集的预处理版本从这个库获得。数据集包含旅行者提交给信息系统的查询。用户的意图以及话语被标记(槽填充)。
下面的代码片段将字典和张量中的训练数据存储在单独的变量中。它还显示了几个查询示例、它们的词向量、意图、槽和槽向量。
下面我们用一个漂亮的布局展示了每个意图类的查询示例。
ATIS Intent Dataset
例如,让我们考虑用户查询“我想在上午 838 从波士顿起飞,并在上午 11:10 到达丹佛”。该模型应该将该用户查询分类为“飞行”意图。它还应该解析查询,识别并填充理解查询所需的所有槽。虽然单词“我”、“想要”、“飞”、“从”、“在”、“到达”、“在”、“该”有助于理解意图的上下文,但是模型应该正确地标记实现用户的飞行意图中的目标所需的实体。分别是“波士顿”作为出发城市(B-fromloc.city)、“上午 8:38”作为出发时间(B-departy _ time . time)、“丹佛”作为目的地城市(B-toloc.city_name)、“11:10”作为到达时间(B-arrival _ time . time)以及“早晨”作为一天中的到达时段(B-arrival _ time . period _ of _ day)。下图显示了 129 个插槽类别中的一些。
您可能已经注意到,查询文本已经被标记化,ATIS 数据集中也提供了词汇表。查询有一个开始(“BOS”)和结束(“EOS”)标记,如下所示。
创建张量
我们通过将每个查询向量和槽向量填充到最大长度来创建张量。我们为目标槽提供两个张量。一个是教师张量,它迫使解码器遵循正确的输出时隙。另一个是真正的目标张量,它定义了给定教师张量时解码器应该输出什么。两者之间唯一的区别是目标张量只是左移了一个槽标签的教师张量。这个技巧被用于序列到序列模型的英语到西班牙语翻译(来源)。输入和目标张量都具有形状(无,48)。
换句话说,为了计算词汇表的大小,我们将训练和测试词汇表结合起来。输入词汇有 943 个单词,而输出词汇有 129 个单词。
为槽填充建立 Seq2Seq 模型
seq2seq 模型是在编码器和解码器中使用 GPU 就绪的 LSTM 创建的。输入通过一个编码器模型,该模型给出形状 (batch_size,max_length,hidden_size) 的编码器输出和形状 (batch_size,hidden_size) 的编码器隐藏状态。编码器和解码器都使用嵌入层来投影句子,以学习用户查询的有意义的表示,该表示被馈送到具有 1024 个单元的单向 LSTM 层。
训练 Seq2Seq 模型
因为我们的目标(槽向量)不是一次性编码的,所以我们使用稀疏分类交叉熵作为损失函数。利用 Adam 作为 50 个时期的优化器,我们使用 3982 个训练样本和 996 个验证样本。在训练数据上准确率高达 98%,验证准确率略低于 96%。验证准确性在 45 年左右开始趋于平稳,表明该模型不再真正推断,并开始过度拟合。
Seq2Seq 模型的推理
预测将需要两个独立于训练的模型。我们需要打破编码器和解码器的机制。然后,我们通过编码器运行整个输入序列,然后通过解码器一步一步地预测来创建输出。
下面我们看到为一个看不见的查询预测的槽填充。该模型通过将“最便宜的航班”标识为 B-cost_relative slot,将“波士顿”标识为 B-fromloc.city_name,将“旧金山”标识为 B-toloc.city_name,从而很好地理解了自然语言文本。
我们现在使用 BLEU 算法(双语评估替角)在完整的测试数据集上评估训练的模型,该算法用于通过比较预测的槽填充和真实的槽填充之间的 n-grams 的数量来测量翻译的质量。
下面的结果表明,总的来说,该模型表现非常好,特别是在比较预测槽和真实槽之间的 4-gram 组时。69%的 BLEU 分数是可接受的结果。
结论
在这篇文章中,我们看了自然语言理解,特别是在槽填充的特殊任务。我们介绍了序列数据处理和语言翻译的当前方法。由于在 ATIS 数据集上关于航班请求的几个模型的实际实现,我们展示了序列到序列模型如何在空位填充任务上实现 69%的 BLEU 分数。
最近,提出了几种用于意图分类和槽填充的联合学习方法,以利用注意机制并提高相对于独立模型的性能(郭等人,2014;哈卡尼-图尔等人,2016;刘和巷,2016;咕等, 2018 )。
谢谢你读到这里。在下一篇文章的中,我们用注意力方法改进了我们的序列对序列模型。继续读!
测试动手策略以解决注意力问题,从而改进序列到序列模型
towardsdatascience.com](/practical-guide-to-attention-mechanism-for-nlu-tasks-ccc47be8d500)
先天与后天。在人工智能中。
https://en.wikipedia.org/wiki/Francis_Galton
当查尔斯·达尔文的堂兄弗朗西斯·高尔顿爵士在 19 世纪晚期普及“先天与后天”这个术语时,他当然在思考人类的行为在多大程度上由遗传基因决定,在多大程度上由他们一生的经历决定。这位著名的优生学家研究了人类的特征,并开发了回归的统计概念(大量用于机器学习),作为他改善人类基因库的探索的一部分,并得出结论,人类在很大程度上是其遗传的结果。
虽然高尔顿的提议,比如付钱给名门望族的个人让他们一起生孩子,并不赞成今天的平等主义社会,但是先天与后天的概念仍然是很多争论的主题。在 2007 年由史蒂芬·列维特和史蒂芬·都伯纳合著的有趣的书《魔鬼经济学》中,有人声称在你的房子里放 50 本书可以提高孩子 5%的考试成绩。100 本书进一步提高了 5%。这是养育帮助孩子的明显迹象。但是同样的研究也表明实际阅读和书籍之间没有关联。该理论认为,买书的父母通常是那些将智力基因传递给孩子的人——是天性,而不是后天培养。
人工智能怎么样?
但是,在人工智能中,先天与后天又如何呢?问这样的问题有意义吗?大自然没有进化出人工智能软件。它不会繁殖和传递有利于生存的特征。培育对一台机器来说意味着什么?
自然
AI 软件可能并不处于自我繁殖和进化以及适者生存的阶段,但在人类程序员的帮助下,它最有可能展现出一个进化物种的一些属性。人工智能算法的一个竞争领域是 kaggle 网站。Kaggle 为数据科学家举办比赛,试图编写最好的人工智能,做出最好的预测。数据科学家在这些比赛中相互竞争,获胜者可以赚取巨额金钱。有多大?例如,国土安全部举办了一场奖金为 150 万美元的竞赛,以提高国土安全部威胁识别算法的准确性。
很少有数据科学家自己编写真正原创的算法。相反,大多数人正在结合现有的开源代码,为他们的特定任务制定最佳算法。随着新的开源算法的发布,如果它们成功了,那么越来越多的 kaggle 竞赛项目将使用它们,而较弱的算法的受欢迎程度会下降。好的算法增强,弱的算法忽略。一个著名的例子是陈天琦在 2014 年创建的 xgboost。它是一种梯度推进算法,允许将许多弱算法组合在一起以获得好的结果。它支持正则化的能力使它明显优于早期的算法,现在它可以说是 kagglers 使用的最流行的算法。
这与动物的适者生存有明显的相似之处——最强的算法继续被广泛使用,而较弱的算法成为孤立的 git 库。最强的算法得到大量的拉取请求,并得到增强,变得更强,而弱的算法则无人维护。这是自然推动人工智能向前发展的一个明显例子。
培育
我们已经看到自然选择是如何让最好的人工智能代码茁壮成长,而最弱的代码死亡。培育人工智能怎么可能行得通?在人类中,养育是通过父母为孩子树立榜样来实现的。这可以是良性行为,比如吃光你的蔬菜或读书(或者只是拥有书籍),也可以是不良习惯,比如吸烟。研究表明,如果父母吸烟,青少年吸烟的可能性是 T2 的两倍,而其他研究表明,孩子吃足够蔬菜的最强预测因素是他们的父母也吸烟。但是这怎么能适用于 AI 呢?
今天的人工智能主要是通过机器学习来实现的。在这里,计算机算法被输入带标签的数据,以建立一个世界的模型。或者至少是世界的一小部分。比如我们教机器,猫长这样,狗长那样。或者我们告诉它谁拖欠贷款,谁没有,以及这些人的家庭特征。计算机被告知过去发生了什么,以便它能预测未来会发生什么。这应该允许我们建立一个真实的世界模型。我们从未来的决策中去除人类的个人意见。我们基于过去发生的事实,而不是我们自己习得的偏见。鉴于人工智能只有在我们对数据进行训练的情况下才能建立一个有用的世界模型,它似乎更强烈地依赖于我们如何培养它——我们教给它关于世界的什么。
偏向
但如果过去告诉它的东西有一些偏差,会发生什么呢?一些影响世界的人性弱点。在上面的例子中,有人必须决定什么是猫,什么是狗。也许有些照片贴错了标签。
如果只是一些随机的错误,可能没什么大不了的。但如果更恶意呢?当在英国监狱工作的囚犯将历史人口普查数据数字化时,他们进入了执法人员不喜欢的职业。不仅仅是罪犯也会这么做。大多数图片标签是由人们在网上完成的。想想你在社交媒体上看到的一些人,告诉我你不能想象他们中的任何一个人为了寻求刺激而贴错标签。
或者也许我们的数据集已经为猫和狗训练好了,但是当我第一次给它看一只羊时会发生什么呢?甚至第一百次?它会给它贴上猫或狗的标签,因为这就是它所接受的全部训练。这类似于 2015 年谷歌开始给黑人贴上“大猩猩”的标签。谷歌本来没打算这么做,但是对黑人缺乏足够的图像识别训练,导致它无法正常学习。
2015 年,一名黑人软件开发者在推特上发文称谷歌的照片服务将照片标记为…
www.wired.com](https://www.wired.com/story/when-it-comes-to-gorillas-google-photos-remains-blind/)
另一个可能发生的问题是无意中使用了图像中的背景信息。来自弗吉尼亚大学的维森特 more 发现,如果照片是在厨房里拍摄的,他的图像识别人工智能更有可能猜出某人是一名女性。将这两者结合起来,麻省理工学院的 Joy Buolamwini 在 2018 年 2 月发现,虽然 IBM、微软和旷视科技可以在 99%的情况下正确识别白人男性的性别,但他们只能在 35%的情况下正确识别深色皮肤的女性。
性别分类的交叉准确性差异
gendershades.org](http://gendershades.org/overview.html)
贷款违约用例呢?在训练这样的系统时,银行会通过传递过去的贷款来训练算法,并让它学习好贷款和坏贷款的样子。像照片这种棘手的东西不在其中。它使用冷酷的事实。但是如果银行过去在发放贷款时有偏见,人工智能也会有同样的偏见。想象一下,银行过去主要向 40 岁以上的人发放贷款,算法要学习好的借款人年龄都在 40 岁以上。这个算法会有年龄偏差,因为这是我们训练它的依据。直到 1980 年,英国银行还可以拒绝向女性贷款,除非她们有男性担保人。如果没有这些贷款发生的过往数据,人工智能不会认为这是一个有效的选择
当然,我们可以很容易地修正这种偏见。我们只是不告诉算法申请人的年龄或性别。不幸的是,今天的机器学习算法在从数据中挑选线索方面非常惊人。你叫诺曼吗?这一数字在 20 世纪 20 年代达到顶峰,此后一直稳步下降。好的,我们会去掉的。也许你有一个 aol.com 的电子邮件地址。哎呀——这是一个赠送。你有多少份工作,是自己的还是租来的,你有车吗,你打高尔夫吗?所有表明一个年龄段比另一个年龄段的可能性更大的事情。
亚马逊最近试图使用人工智能来改善其招聘流程。这个想法是通过让人工智能查看过去成功聘用的人,并挑选看起来像这样的新候选人,来自动化简历筛选。他们给它输入了 10 年的数据,发现它总是选择男人而不是女人。名字被删除,运动和俱乐部被隐藏。当这些消失时,像语言这样的东西被人工智能选中了——男性比女性更经常使用像“处决”和“俘虏”这样的词。亚马逊最终放弃了这个项目,再也没有用它来雇佣任何人。
[## 亚马逊杀死了一个 AI 招聘系统,因为它无法阻止工具的歧视…
据报道,亚马逊不得不废除一个性别歧视的基于机器学习的招聘系统,因为它偏爱男性候选人。
fortune.com](http://fortune.com/2018/10/10/amazon-ai-recruitment-bias-women-sexist/)
公平
单就 AI 而言偏见不一定是问题。我天生不喜欢进入有饥饿狮子的房间,但大多数人会认为这是完全合理的。我也不喜欢雇佣幼儿园的孩子去扫烟囱,也不喜欢给那些主动给我发邮件的尼日利亚王子们寄钱。大多数人认为这些偏见是合理的。它们并非不公平——在所有这些情况下,我都面临着不小的风险。当我们认为偏见是不公平的时候,人工智能中的偏见问题就出现了。
人工智能的问题在于,公平是人类的产物。我们已经决定了一系列不公平的歧视(性别、愤怒、年龄、宗教),但仍有一些被认为公平的歧视,如智力和犯罪。机器怎么会知道区别呢?简单的答案是,我们需要少关注闪亮的新算法(自然),多关注我们训练系统的方式(培育)。
大自然的模式正在改变:探索 32 年的社区科学数据
三十多年来,拉蒂默记录了大自然的秘密
Photo by Landon Martin on Unsplas
拉蒂默记录了蝴蝶抵达、花朵开放和鸟儿出现的时间。这些自然观察和更多的观察都被细致地记录下来,包括日期、时间和地点。这是他在美国明尼苏达州北部农村沿着 100 英里的路线投递邮件时的一个爱好,并在他最后一个信封投递后很快成为一种生活方式。这些类型的观察,称为物候学,被拉蒂默恰当地定义为与气候相关的事件的节律性生物性质。
“物候学是与气候相关的事件的有节奏的生物学性质。~约翰·拉蒂默"
或者换句话说,物候学是研究由环境因素驱动的季节性植物和动物活动。几千年来,一个物种的物候通过自然选择进化,以适应环境条件并最大限度地适应环境。这个渐进的过程使得物种能够很好地适应它们的自然环境。自然科学的一个重点领域是确定变化的气候条件将如何改变物候,物候变化对物种适应性的影响——也许最重要的是——物候变化将如何改变物种的相互作用。
Retired postoffice employee and long-time community scientist John Latimer. For over 32 years Latimer has collected thousands of observations on bird and insect migrations, flowering patterns and tree leaf drop that are now publicly available for you to explore. Photograph by David J. Weston
我们可以用一个野生鸟类的例子来简要说明物候学和物种相互作用的概念。鸟蛋必须在食物(如昆虫)充足时孵化。因此,幼体出生的时间和昆虫的数量已经共同进化成同步的,或者说匹配的。如果气候变化改变了这些环境线索,那么鸟类的物候就会改变,但是鸟类捕食的昆虫的物候又会如何呢?孵化出的幼体和昆虫的数量会继续匹配吗?或者气候变化会改变它们,并且会使高度共同进化的捕食者-猎物的相互作用不匹配吗?
拉蒂默是日益壮大的社区科学运动的一部分。代表那些通常没有被训练成科学家,但是仍然为科学和人类做出贡献的人。
然而,似乎缺少的是关于如何使用和分析社区科学数据的更广泛的讨论。
一个复杂的问题是数据的巨大剪切。仅拉蒂默一人就记录了大约 104,840 个条目!再者,数据质量如何,谁来分析?合乎逻辑的答案是公共机构的科学家和教授,然而资金和资源的限制往往使这几乎不可能。正是带着这样的想法,我产生了下面的问题:
“基于社区的数据分析是科学领域的下一个重大转变吗?”
我最近接触到的 Medium 的开放数据科学社区和的出版物提供了一个关于这个问题的有趣视角,因为它表明并不缺少渴望使用新数据集的有才华的数据科学家。
作为这个小社区基础科学实验的开始,我提供访问 Latimer 的数据和初始exemplarR 代码 。
这绝不是详尽的,因为目的是向数据科学家介绍环境数据,反过来,向社区科学家介绍 r。
人们希望这种握手能够转化为使用开放数据和复杂分析的协作。
数据初看和数据合成
安装下面的 R 库并加载它们。
*install.packages(c(‘lubridate’, ‘tidyverse’))
library(tidyverse)
library(lubridate)*
将数据读入 R datphen<-read.csv(“Latimer_Cleaned_1.csv”)
并查看一下head(datphen)
。数据令人印象深刻!在 32 年的时间里,拉蒂默人工收集了 10,484 次物候观测数据。除了记录的日期,拉蒂默和同事南宁加还增加了 9 个其他变量(如属、种、俗名、生活型等。)总共 104,840 个观察值。这只是一个开始,我们的数据集将在 2016 年停止,而拉蒂默将继续记录物候观测,直到今天!
数据是典型的“日期”格式。然而,科学家通常使用儒略日格式来提供从每年 1 月 1 日开始的连续天数。每一年将包含 365 天,如果是闰年,则为 366 天。
*datphen$date<- as.Date(datphen$date, "%m/%d/%y")*
快速浏览一下数据可以发现,拉蒂默并没有每天记录观察结果。这是有道理的,因为植物在冬天处于休眠状态,鸟类季节性迁徙。
这些数据包括对植物、鸟类和其他动物的观察。要对观察到的植物种类有所了解,请使用以下方法:
*datphen2 %>% select(common_name, lifeform, event) %>% filter(lifeform == "PLANTS" & event =="FLOWERING") %>% group_by(common_name) %>% tally() %>% arrange(-n)*
这会生成一个表格,其中包含植物的通用名和 Latimer 对该物种的观察次数。下面是前 10 个条目的表格。
从上表中我们可以看出,有些物种的观测值很多,而有些物种的观测值较少。下面我们使用下面的代码来可视化拉蒂默在 32 年的数据收集过程中对每个物种的观察次数。
*a<-datphen2 %>% select(common_name, lifeform, event) %>% filter(lifeform == "PLANTS" & event =="FLOWERING") %>% group_by(common_name) %>% tally() %>% arrange(-n)ggplot(a, mapping = aes(x = reorder(common_name, -n), y = n)) +
geom_bar(stat = "identity") +
geom_hline(yintercept = 15, color="lightblue") +
theme(axis.text.x=element_blank(),
axis.text.y=element_text(size=16),
axis.title=element_text(size=16,face="bold"),
plot.title = element_text(size=22),
axis.ticks.x=element_blank()) +
labs(title = "Observations per plant species over 32 years", x = "Plant Species", y = "Number of observations per species")*
仅就植物而言,拉蒂默就记录了令人印象深刻的 392 种物种——如上面水平 x 轴上的条形数所示。然而,每个物种的观测数量差异很大。为了确保我们对每个物种都有足够的观察来检测物候变化,我们将分析限制在那些有 15 个或更多观察值的物种(观察值在上图蓝线以上的物种),这导致了 76 个物种。
从选出的 76 个物种中,我们将对每个物种拟合一个线性回归模型,以确定开花时间物候的变化是否与一年中的变化一致。
为线性回归循环和图形准备数据:
*#subset species that have 15 or more years of flowering observations # Prep or tidy the data for lm model fittingb<- a %>% filter(n >= 15)
c<-b %>% select(common_name)
lm.data<-inner_join(c, datphen2, by = "common_name") %>% filter(event =="FLOWERING") #%>% group_by(common_name) %>% distinct(year, .keep_all = TRUE)lm.data$year<-as.numeric(lm.data$year)*
以下代码显示了如何通过所有 76 个物种连续运行一个线性模型(即循环),并巧妙地提取模型斜率和 p 值,以识别候选物种供进一步研究。
*library(broom)#run an lm model across all rows, genotypes
lm.results<- lm.data %>% group_by(common_name) %>% do(fitdata = lm(julian ~ year, data = .))#getting tidy data output from model run
lmSlopePvalue <- tidy(lm.results, fitdata) %>% select(common_name, term, estimate, p.value) %>% filter(term =="year")lmRsquare <- glance(lm.results, fitdata) %>% select(common_name, r.squared)lmtidyoutput<-left_join(lmSlopePvalue, lmRsquare, by = c("common_name" = "common_name"))*
回归分析显示,76 个物种中有 10 个物种的 p 值< 0.05. Meaning that there is a significant relationship between when Latimer noticed first flowering (Julian day) for a given species, and the year the observations were recorded (year). Interpreting significance and ensuring that model assumptions are met should be further 被调查,超出了本文的范围。
为了绘制所有重要的物种,按照 R 笔记本中所示准备数据,并运行以下功能:
*#Looping graph function for phenology relationshipplant.species <- function(df, na.rm = TRUE, ...)
# create list to loop over
plant_list <- unique(df$common_name)
# create for loop to produce ggplot2 graphs
for (i in seq_along(plant_list)) {
# create plot for each specis in df
plot <-
ggplot(subset(df, df$common_name==plant_list[i]),
aes(y= julian, x= year, group = common_name)) +
geom_point(size=4, colour = "dark blue")+
geom_smooth(method = lm) +
theme(axis.text=element_text(size=12),
axis.title=element_text(size=16,face="bold"),
axis.text.x = element_text(angle = 90, vjust = 0.5),
legend.text=element_text(size=16)) +
ggtitle(paste(plant_list[i]))
print(plot)
}
}*
结果:
上面的代码示例以及在 R 笔记本中详细描述的代码示例可用于调查 Latimer 数据集中的其他植物和动物物种。下面的三个图表被选择来显示物候的各种趋势。例如,黑眼灯心草似乎每年都在同一时间出现,尽管当时的天气条件很好。记住天气变化会在短时间内局部出现,从几分钟到几小时到几天;而气候是鳄龙-长期区域和全球平均值。因此,如果明尼苏达州北部正在经历气候变化,黑眼灯心草迁徙的早期阶段似乎不会受到影响。
与灯心草相反,下面显示的植物显示了开花时间的趋势。假所罗门印章显示,在观察到的年份中,该地点的开花日反应延迟,而白杨显示了较早的开花日物候。请注意,白杨图左侧的观察值比右侧少。排除早年会怎样?你有没有得到同样的趋势——提示,请看 R 笔记本。
最终想法:
忘掉任何提到“气候”这个词的帖子似乎都带有的政治意味吧。相反,这意味着向数据科学界介绍拉蒂默毕生的工作。我鼓励你对这些数据形成自己的看法。数据是否足够完整,足以构建稳健的模型?应该使用什么模型,哪些额外数据会有所帮助,例如,与天气相关的变量?或者说,我们应该把物候学留给专业的科学家吗?你准备好为这项事业做出贡献并开始记录你自己的物候数据了吗?
对于社区科学家来说,参与全球数据科学社区能学到什么?你准备好以记录物候的同样热情来看待你的数据了吗?
采访快结束时,我不得不问拉蒂默,是什么驱使着他。为什么他不顾明尼苏达州严寒的气候条件,记录了 30 多年的数据。他的回答很简单:
发现的喜悦,以及对每天都有新发现的期待。
也许基于社区的数据分析是科学领域的下一个重大转变——只有时间能证明,但对拉蒂默来说,这真的无关紧要。他要下床,漫步树林,继续记录大自然的秘密。
关于作者:
韦斯顿最早的记忆中充满了大自然的图像。在专业上,他着迷于宿主-微生物组的相互作用,对能源解决方案和环境以及所有与开放分析相关的事情充满热情。就个人而言,他是一个想当农民的人,和一个了不起的配偶一起抚养三个了不起的孩子。
致谢:
这个故事是由约翰·拉蒂默的辛勤工作促成的,他在过去的 35 年里热切地记录着大自然的秘密。
将拉蒂默的数据翻译并注释成电子表格的艰巨任务是由真正的物候学专家克劳迪娅·南宁加完成的。
非常感谢那些在知识共享许可下制作了白杨、假所罗门海豹和 Junco 照片的人。
感谢克里斯汀·卡布高的精心剪辑和溢美之词。
用数据科学导航媒体泡沫
通过在世界不同地方生活的经历,我意识到每个人对正在发生的事情的看法是不同的,这主要是因为他们所处的媒体泡沫。我在不同媒体泡沫的地方阅读的新闻报道越多,我就越能通过阅读新闻报道对媒体的偏见变得敏感。这种文化层面造成了人与人之间的脱节。
但除了文化方面,很明显美国目前是如何被左右政治光谱分割的。我认为协同过滤系统影响了它,它使人们与不同意他们观点的信息分离,有效地将他们隔离在他们自己的文化或意识形态泡沫中。
Image attributed to DuckDuckGo
我的目标
我认为,对于人们来说,了解不同的媒体泡沫对任何给定话题的叙述会有所帮助。这促使我创建了一个新闻推荐平台,提供不同出版物的叙述。
但在我开始之前,我如何从经验上证明媒体来源有自己的偏见?
为了回答这个问题,我从两个不同的来源收集了一个数据集:
- 卡格尔
- 哈佛数据世界
我的数据集包括来自 18 个不同出版物的 146,394 篇文章。出版物包括:美国保守派、美国自由派、欧洲、俄罗斯报纸。
通过研究数据集,我提出了以下假设。
假设
我的第一个假设是,报纸有自己的偏见,神经网络可以仅凭文本预测任何文章的发表。
因此,上面的陈述意味着,如果不同的新闻媒体以一致可预测的方式报道主题,神经网络将能够预测文本来自哪个出版物,这可能导致出版物出现偏差的概率很高。
在我的情况下,作为神经网络,我将使用长短期记忆网络(LSTM)。
什么是 LSTM?
LSTM 网络是一种特殊的递归神经网络(RNN),能够学习长期依赖关系。
RNN 有能力理解先前事件的推理,并以此来告知后来的事件。
Christopher Olah 写了一个很棒的博客,解释了 LSTM 是如何工作的,我会在参考资料中包含链接。
为什么是 LSTM?
在我的例子中,根据文本预测出版物是一个序列分类问题,LSTM 网络是解决这个问题的最先进的方法。
将 LSTM 网络应用于各种问题已经取得了令人难以置信的成功:语音识别、语言建模、翻译、图像字幕。
流程
下面是使用 LSTM 模型的过程:
为了进一步解释什么是标记化单词以及如何为建模准备数据,我决定包含代码。我使用 NLTK 的包标记器对单词进行了标记。Tokenizer 将文章拆分成标记化的句子,并将标记化的句子转换成序列格式。
当数据准备好适合模型时,我将我的数据分为训练和测试,并将测试集用作验证集。我用 Keras 的框架建立了 LSTM 模型。Keras 内置指标是一个准确度分数。为了确保我的类是平衡的,我手动计算了精确度、召回率和 f1 分数,我将把它们作为额外的指标添加到我的模型中。请参考下面的代码。
将我的数据拟合到模型中后,我的模型给出了以下结果:
我的模型的预测有 73%是正确的,我的 F1 分数是 75%,这意味着我的模型上的所有类都是平衡的。
因为我的模型返回了成功的结果,所以我能够证明我的假设。根据我的假设,神经网络确实可以预测一篇文章的出版,仅基于其文本,这可以表明每个出版物都有可检测的语言偏见。
因此,我受到鼓励,继续推进我的新闻推荐平台。
新闻推荐平台
下面的例子展示了推荐平台的用法。主题是生殖权利立法。
受到质疑的那段文字来自福克斯新闻频道的文章,他们在文章中描述了生孩子对老年人来说是一种经济价值。
结果下面的另一段文字,是我的推荐平台的结果之一,来自《纽约时报》的文章。正文指出,孩子需要情感和物质资源,不是每个人都能负担得起的。我展示这个例子是为了理解阅读不同的视角来理解问题是多么有价值。
流程
平台的过程很简单,因为平台上的推荐是基于余弦相似度的。
余弦相似度是一种度量标准,用于衡量文档的相似程度,而不考虑其大小。在数学上,它测量的是在多维空间中投影的两个向量之间的角度余弦。余弦相似性是有利的,因为即使两个相似的文档相距欧几里德距离很远(由于文档的大小),它们仍有可能更靠近在一起。角度越小,余弦相似度越高。
但在我将数据拟合成余弦相似度之前,我必须经历两个步骤:
首先,使用 Countvectorizer 获得每篇文章中的单词数。它的输出是一个稀疏矩阵。
第二,使用非负矩阵分解(NMF)来分解高维向量并将它们转换成低维向量。
我将这两个步骤分别应用到查询(您输入到平台中的文章或主题)和数据框中。余弦相似性连接查询和数据集以提供推荐。
请参见下面的代码:
烧瓶应用
作为一名数据科学家,我的大部分工作都是在 Jupyter 笔记本上完成的。为了让人们使用我的工作,我决定使用 Flask 应用程序创建一个 web 应用程序。Flask 是一个轻量级的开源 web 应用程序框架。
为了连接我在 Jupyter notebook 中运行的模型和数据,我使用了 pickle 库。Pickle 允许我保存 NMF 模型、数据和计数矢量器,我可以在我的 Flask 应用程序中运行它们。
Pickle Rick from Rick & Morty and Flask logo
下面是 Flask APP 的搭建过程。
我不会在这里发布代码,因为你可以在我的 GitHub 库的 flask app 文件夹中找到所有代码。
下面的视频举例说明了我的应用程序是如何工作的。我使用了 Vox 报纸的文本,只是为了展示你如何从不同的出版物中获得相似的文章推荐,基于你正在寻找的信息。
该应用程序还提供了每篇文章的情感评分,你可以点击出版物访问原始网站。
未来的工作
- 公开部署应用程序—应用程序的重量是 30GB,所以我需要找到一种方法来获得一个可以容纳它的开源域或云存储。
- 通过自动抓取新文章来更新模型。
- 将应用程序部署为 Chrome 扩展。
参考
了解 https://colah.github.io/posts/2015-08-Understanding-LSTMs/ LSTM 网络—
谨防网上“过滤泡沫”——https://www . ted . com/talks/Eli _ pariser _ deep _ online _ filter _ bubbles/抄本?language=en
GitHub 知识库
https://github.com/AisOmar/Media_bubbles
在 Python 中导航 NaNs 的地狱
了解 nan 并在您的数据中轻松处理它们的摘要。
Photo by Chris Ried on Unsplash
我 最近有很多 NaNs 引起的头痛。每个程序员都知道它们是什么,以及它们为什么会发生,但在我的情况下,我并不知道它们的所有特征,或者说还不够好来阻止我的努力。为了找到解决方案并避免令人头疼的问题,我进一步研究了 Python 中 NaNs 值的行为。在 Jupyter Notebook 里摆弄了几个语句之后,我的结果相当令人吃惊,也极其混乱。这是我用 Numpy 的 np.nan 得到的。
np.nan in [np.nan]
是True
到目前为止还好,但是…
np.nan == np.nan
是False
啊?还有…
np.nan is np.nan
是True
那么 Python 中的 NaNs 到底是怎么回事?
简短介绍
NaN 代表**不是一个数字,是一种常见的缺失数据表示。**它是一个特殊的浮点值,不能转换为除 float 以外的任何其他类型。甚至在 Python 存在之前,它就由用于算术运算的二进制浮点 I EEE 标准 (IEEE 754)引入,并在遵循该标准的所有系统中使用。NaN 可以被视为某种数据病毒,会感染它所涉及的所有操作。
无对南
None 和 NaN 听起来相似,看起来相似,但实际上很不一样。None 是一个 Python 内部类型,可以认为它等同于 NULL。[None](https://www.w3schools.com/python/ref_keyword_none.asp)
关键字用于定义空值,或者根本没有值。None 不同于 0、False 或空字符串。它是自己的数据类型(NoneType ),并且只有 None 可以是… None。数值数组中的缺失值为 NaN,而对象数组中的缺失值为 None。最好通过使用foo is None
而不是foo == None which brings
来检查无。我们回到上一个问题,我在 NaN 操作中发现了特殊的结果。
南不等于南
起初,读到np.nan == np.nan
是False
会引发困惑和沮丧的反应。这看起来很奇怪,听起来真的很奇怪,但如果你稍微思考一下,逻辑就会开始出现,甚至开始变得有意义。
尽管我们不知道每个 NaN 是什么,但不是每个 NaN 都是一样的。
让我们想象一下,我们看到的不是 nan 值,而是一群我们不认识的人。他们对我们来说是完全陌生的人。陌生人对我们来说都是一样的,也就是说我们把他们都描述成陌生人。但是,现实中并不意味着一个不认识的人就等于另一个不认识的人。
离开我这个奇怪的比喻,回到 Python, NaN 不能等于它自己,因为 NaN 是失败的结果,但是失败可以以多种方式发生。一次失败的结果不能等于任何其他失败的结果,未知值也不能彼此相等。
平等与身份
现在,要理解np.nan in [np.nan]
为什么是True
,我们得看看相等和相同的区别。
平等
等式指的是大多数 Python 程序员都知道的“==”这个概念。这用于询问 Python 该变量的内容是否与另一个变量的内容相同。
num = 1
num2 = 1num == num2
最后一行将导致True
。两个变量的内容相同。如前所述,一个 NaN 的内容永远不等于另一个 NaN 的内容。
身份
当你问 Python 一个变量是否与另一个变量相同时,你就是在问 Python 这两个变量是否共享相同的标识。Python 为每个创建的变量分配一个 id ,当 Python 在一个操作中查看变量的身份时,会比较 id。然而,np.**nan**
是一个单一的对象,它总是有相同的 id,不管你把它赋给哪个变量。
import numpy as np
one = np.nan
two = np.nan
one is two
np.nan is np.nan
是True``one is two
也是True
。
如果使用id(one)
和id(two)
检查one
和two
的 id,将显示相同的 id。
np.nan in [np.nan]
之所以是True
是因为 Python 中的 list 容器在检查相等之前先检查身份 。然而,根据它们是如何被创造出来的,它们有不同的“味道”。float(‘nan’)
用不同的 id 创建不同的对象,所以float('nan') is float('nan')
实际上给了假!!稍后我们将再次提到这些差异。****
对付南而不头痛
最初,完整的 nan 概念可能很难理解,也很难处理。令人欣慰的是, pandas 和 numpy 在处理 nan 值方面非常出色,它们提供了几个函数,可以轻松地选择、替换或删除变量中的 nan 值。
测试值是否为 nan
正如我所说的,每当你想知道一个值是否是一个 nan,你不能检查它是否等于 nan。然而,有许多其他的选择可以做到这一点,我提出的并不是唯一的选择。
import numpy as np
import pandas as pdvar = float('nan')var is np.nan #results in True
#or
np.isnan(var) #results in True
#or
pd.isna(var) #results in True
#or
pd.isnull(var)#results in True
pd.isnull
& pd.isna()
表现一致。熊猫提供了。isnull()函数,因为它是 Python 中 R 数据帧的改编版。在 R 中,null 和 na 是两种不同的类型,具有不同的行为。
除了 numpy 和从 Python 3.5 开始,你也可以使用math.**nan**
。我在本文中同时写 nan 和 NaN 的原因(除了我缺乏一致性)是值不区分大小写的事实。float(‘nan’)
或float(‘NAN’)
都会产生相同的结果。
import math
var = float('nan')
math.isnan(var) #results in True
小小警告:
import math
import numpy as np
math.nan is math.nan #results in True
math.nan is np.nan #results in False
math.nan is float('nan') #results in False
因为math.nan
、np.nan
和float('nan')
都有不同的 id,所以这些语句为假。他们没有相同的身份。
对于数据帧
import pandas as pddf = pd.DataFrame(some_data)df.dropna()
#will drop all rows of your dataset with nan values.
#use the subset parameter to drop rows with nan values in specific columnsdf.fillna()
#will fill nan values with the value of your choicedf.isnull()
#same as pd.isnull() for dataframesdf.isna()
#same as pd.isna() for dataframes
不幸的是,我并不认为熊猫文档在丢失数据文档方面非常有用。然而,我真的很欣赏这篇摘自 Python 数据科学手册 的,它很好地概述了如何处理 Pandas 中的缺失数据。
需要注意什么
type error:“float”对象不可迭代
虽然非类型错误非常清楚,但是由 nan 值引起的错误可能会有点混乱。Nan 值经常会导致错误(更具体地说是 TypeErrors ),这将涉及到它们的类型“ float ”。错误消息可能会令人惊讶,尤其是当您认为您的数据绝对没有浮点数时。您的数据帧可能看起来不包含任何浮点,但实际上,它确实包含。它可能有你不知道的 nan 值,你只需要去掉你的 NaN 值就可以消除这个错误!
作为一名数据科学家和 Python 程序员,我喜欢分享我在这一领域的经验,并将继续撰写关于 Python、机器学习或任何有趣的发现的文章,这些发现可能会使其他程序员的生活和任务变得更容易。在Medium或Twitter上关注我,以获得关于 Python &数据科学的任何未来文章的通知!
或者如何向你的家人或任何与技术世界脱节的人解释数据科学。
towardsdatascience.com](/explaining-data-science-to-your-grandma-f8345621483d)
导航超参数空间
开始应用机器学习有时会令人困惑。有许多术语需要学习,其中许多术语的使用并不一致,尤其是从一个研究领域到另一个领域——其中一个术语可能意味着两个不同领域中的两种不同事物。
今天我们来讲一个这样的术语:模型超参数。
参数 vs .超参数:有什么区别?
让我们从最基本的区别开始,即参数和超参数之间的区别。
模型参数是模型内部的属性,并且是在训练阶段学习到的,并且是模型进行预测所需要的。
另一方面, 模型超参数不能在训练期间学习,而是预先设定。它们的值可以使用经验法则或试错法来设置;但事实上,我们无法知道特定问题的最佳模型超参数— ,因此我们调整超参数以发现具有最佳性能的模型参数。
在某种程度上,超参数是我们可以用来调整模型的旋钮。
超参数调谐
也叫超参数优化,是 为一个特定的学习算法 寻找性能最好的超参数集合的问题。
这是一个重要的步骤,因为使用正确的超参数将会发现模型的参数,从而产生最巧妙的预测;这也是我们最终想要的。
这种性质的优化问题有三个基本组成部分:(1)一个目标函数,这是我们想要最大化或最小化的模型的主要目的;(2)控制目标函数的一组变量**;(3)一组约束,允许变量取某些值,同时排除其他值。**
因此,优化问题是找到最大化或最小化目标函数同时满足约束集的一组变量值。
解决优化问题有不同的方法,也有许多实现这些方法的开源软件选项。在本文中,我们将探索网格搜索、随机搜索和贝叶斯优化。
网格搜索
也被称为参数扫描 *,*它被认为是最简单的超参数优化算法。它包括彻底搜索手动指定的一组参数,这意味着为指定子集的所有可能组合训练模型。
如果模型可以快速训练,这种方法可能是一个很好的选择,否则,模型将需要很长时间来训练。这就是为什么不认为使用网格搜索来调整神经网络的超参数是最佳实践。
一个流行的实现是 Scikit-Learn 的 GridSearchCV 。其他实现还有 Talos ,一个包括用于 Keras 和 H2O 的库,一个为不同的机器学习算法提供网格搜索实现的平台。
随机搜索
随机搜索背后的思想与网格搜索非常相似,除了它不是穷尽搜索手动指定参数集的所有可能组合,而是选择组合的随机子集来尝试。**
这种方法大大减少了运行超参数优化的时间,但是有一个警告:没有保证会找到最优的超参数集。
一些流行的实现有 Scikit-Learn 的RandomizedSearchCVhyperpt和 Talos 。
贝叶斯优化
我们已经确定随机搜索和网格搜索建立在相似的想法上,它们的另一个共同点是不使用以前的结果来通知每个超参数子集的评估**,并且反过来**、它们花费时间评估不到最优选项**。**
相比之下,贝叶斯优化会跟踪过去的评估结果,使其成为一种自适应的优化方法。寻找满足目标函数的变量的值是一种 强有力的策略,该目标函数评估 是昂贵的。在某种程度上,当我们需要最小化我们在试图 找到全局最优 时所采取的步骤的数量时,贝叶斯技术是最有用的。
贝叶斯优化结合了关于目标函数的先验信念(【f】),并使用从***【f】***中提取的样本更新先验,以获得更好地逼近的后验概率(f)*——*马丁·克拉瑟(2018)贝叶斯优化。
为了实现这一点,贝叶斯优化利用了另外两个概念:一个代理模型和一个获取函数**。第一个是指用于 逼近目标函数 的概率模型,第二个是用于 确定采样域内的新位置 ,在该位置最有可能对当前最佳评估结果进行改进。这是贝叶斯优化模型效率背后的两个关键因素。**
替代模型**有几种不同的选择,最常见的有 高斯过程、随机森林回归和树 Parzen 估计器 。至于采集函数,最常见的有最大概率改善,置信上限 。******
一些流行的实现有Scikit-Optimize贝叶斯优化SMAC兰香MOEhyperpt。**
结论
超参数优化对于机器学习任务来说是一件大事。这是提高模型性能的重要一步,但不是实现这一目标的唯一策略。
在我们探索的所有方法中,不同的从业者和专家会根据他们的经验提倡不同的方法,但是他们中的许多人也会同意实际上取决于数据、问题和其他项目考虑因素。最重要的一点是,这是寻找最佳表演模特的关键步骤。****
在可解释的海洋中航行
设定正确的路线并负责任地驾驶
本文由Joy rim chala和Shir Meir Lador合著。
设定正确的路线
近年来复杂机器学习(ML)模型的快速采用给当今公司带来了新的挑战:如何解释、理解和解释这些复杂模型预测背后的推理。将复杂的人工智能系统视为可信赖的黑盒而不进行健全检查已经导致了一些灾难性的结果,正如最近在 GenderShades 中披露的性别和种族偏见所证明的那样。
随着 ML 辅助预测更深入地整合到高风险决策中,如医疗诊断、累犯风险预测、贷款审批流程等。了解 ML 预测的根本原因变得至关重要。如果我们知道某些模型预测反映了偏见,并且不符合我们的最佳知识和社会价值观(如平等机会政策或结果公平),我们可以检测这些不良的 ML 缺陷,防止部署此类 ML 系统,并纠正模型缺陷。
The GenderShades study reported noticeable differences in gender classification accuracy of widely used face detection algorithms including Microsoft Cognitive Services Face API, FACE++, and IBM watson visual recognition. There’s a large gap in gender misclassification rates among different subgroups, with the largest gap of 34.4% observed between a lighter skinned male face compared to darker skinned female face.
我们在 Intuit 的使命是为全世界的繁荣提供动力。为了帮助小企业和个人增加成功的几率,在过去几年中,Intuit 一直在其平台和解决方案中注入人工智能和人工智能。作为 Intuit 的数据科学家,我们拥有独特的特权和权力来开发 ML 模型,这些模型做出的决策会影响人们的生活。有了这种权力,我们也有责任确保我们的模型符合最高标准,不以任何方式进行歧视。*“不妥协的诚信”*是 Intuit 的核心价值观之一。随着我们成为一个人工智能/人工智能驱动的组织,机器可理解性已经成为 Intuit 人工智能/人工智能产品的优先事项。
今年,Intuit 在 KDD 2019 举办了一场可解释的人工智能研讨会( XAI 2019 )。我们从此次研讨会中获得了许多宝贵的经验,并将开始将其融入我们的产品和服务战略中。
理解可解释性的当前状态
可解释性是一个活跃的研究领域,下面提供的描述旨在提供该领域当前状态的高度概括。根据被解释的模型是(a)黑盒(不可理解)还是(b)玻璃盒(可理解),可解释性方法分为两大类。在下一节中,我们将解释和比较每种方法。我们还将描述如何使用可理解的模型来更好地理解我们的数据。然后,我们将回顾一种检测任何用例(罗生门曲线)的高性能可理解模型的方法。最后,我们将比较局部和全局解释以及基于特征和基于概念的解释。
黑匣子:
黑盒可解释性方法试图解释已经存在的 ML 模型,而不考虑模型的内部工作(即,学习的决策函数)。这类可解释性方法是模型不可知的,可以轻松地与各种 ML 模型集成,从基于决策树的模型到复杂的神经网络⁴⁵。应用黑盒可解释性并不要求 ML 从业者创建和训练模型的方式有任何改变。由于这个原因,黑盒可解释性方法在 ML 从业者中享有更广泛的采用。黑盒可解释性方法也被称为“事后”可解释性,因为它们可以用于在训练和部署后询问 ML 模型,而无需任何训练程序的知识。黑盒可解释性方法的例子包括石灰、 Shapley⁶、 综合渐变 ⁷、深度提升 ⁸等。事后模型解释是解释的代理。以这种方式得出的解释不一定保证对人友好、有用或可行。
玻璃盒子:
具有可理解的 ML 模型的玻璃盒子方法要求模型在前面是“可解释的”(也称为“预先的”)⁰。这种方法的优点是,ML 从业者可以轻松地梳理出模型解释,检测数据和/或标记缺陷,并且在某些情况下,如果模型决策与从业者的价值观或领域知识不一致,可以编辑模型决策。微软研究院高级首席研究员、KDD·XAI 2019 主题演讲人之一 Rich Caruana ,展示了他的团队如何基于广义可加模型(GAMs) 构建了一个高度准确、可理解、可编辑的 ML 模型,并将其应用于肺炎病例的死亡率预测 。这个版本,也被命名为 GA2M(或 “GAM on steroids” ),通过梯度增强而不是原始版本中的三次样条进行优化,并实现了与现代 ML 模型(如随机森林或梯度增强树)相当的结果。
使用可理解的模型
卡鲁阿纳分享了他的团队如何使用可理解的模型来更好地理解和纠正他们的数据。例如,可理解模型了解到一条规则,即有哮喘病史的肺炎患者死于肺炎的风险低于普通人群。这一规则是违反直觉的,但反映了训练数据中的真实模式:有哮喘病史并表现出肺炎症状的患者通常不仅被送入医院,而且直接被送入重症监护室。哮喘性肺炎患者接受的积极治疗非常有效,与普通人群相比,降低了他们死于肺炎的风险。因为这些患者的预后好于平均水平,根据数据训练的模型错误地认为哮喘降低了死亡风险,而事实上哮喘患者的风险要高得多(如果不积极治疗的话)。
如果更简单、更易懂的模型可以学习违反直觉的关联——例如,患有哮喘意味着更低的肺炎风险——更复杂的基于神经网络的算法可能也能做到这一点。即使我们可以从数据中去除哮喘偏见,还有哪些不正确的事情被了解到?这是统计混淆的经典问题:当一个变量(在我们的例子中,治疗强度)同时与因变量和自变量相关时,会导致虚假关联。治疗强度受哮喘变量的影响,从而降低死亡风险。
这一观察说明了模型可理解性在高风险决策中的重要性。捕捉数据中真实但虚假的模式或特质的模型——如肺炎例子中的虚假关联或社会偏见——可能会产生导致不良后果(如虐待患者)的预测。当前的 ML 模型被训练为最小化训练数据的预测误差,而不是与任何人类直觉和概念一致,因此不能保证模型将与人类的价值观一致。通常,在人类管理的数据集上训练的 ML 模型将反映数据中的缺陷或偏差 。一个可理解的模型允许这些缺陷在模型验证期间出现。
目前,只有一小部分算法——即基于决策树的模型和广义加性模型(gam)——是可理解的。基于决策树的模型和 gam 不用于 ML 应用(如计算机视觉、自然语言处理和时间序列预测),因为这些模型的最佳可能版本目前不能在复杂的基于深度神经网络的模型的最先进水平上执行。
为任何用例检测高性能的可理解模型
当我们能够在同等性能的可理解和黑盒模型之间进行选择时,最佳实践是选择可理解的那个 ⁴ 。我们如何知道对于一个特定的应用程序是否存在一个高性能的可理解的模型?杜克大学计算机科学教授、数理统计研究所(IMS)2019 年研究员(也是 KDD XAI 2019 的小组成员)辛西娅·鲁丁提出了一种诊断工具,称为“罗生门曲线”、 ⁵ ,可以帮助 ML 从业者回答这个问题。
我们先定义几个术语。“罗生门效应”指的是这样一种情况,在这种情况下,存在许多不同的、几乎同样准确的描述来解释一种现象。“罗生门效应”一词源自一部受欢迎的日本电影(罗生门),这部电影以涉及不同角色对同一事件进行自私描述的情节而闻名。在模型类中所有可能模型的假设空间上定义的*“罗生门集”,是训练性能接近类中最佳模型的 ML 模型的子集。“罗生门比率”是罗生门集的基数除以所有可能模型的基数(精确度不同)。因此,为每个 ML 任务/数据集对唯一地定义了“罗生门比率”*。当罗生门比率较大时,存在几个同样高精度的 ML 模型来解决该 ML 任务。罗生门集合中的这些高精度模型中的一些可能具有期望的属性,例如可理解性,并且寻找这样的模型可能是值得的。因此,罗生门比率作为最大似然问题简单性的指标。
在她的 KDD 2019 主题演讲中,Rudin 介绍了*“罗生门曲线”* ⁵ (见下图),这是一条连接模型类层次结构的对数罗生门比率的诊断曲线,其复杂性随着经验风险(模型类上的错误率界限)的增加而增加。
Left figure : Empirical Rashomon sets are defined for each ML task/dataset pair and class of model (hypothesis space). Rashomon curves connect the Rashomon ratio of increasingly complex model classes as a function of empirical risk (the observed error of a particular model class). The horizontal part of the Γ-shape corresponds to a decrease in the empirical risk (increase in model accuracy) as we move through the hierarchy of hypothesis spaces (H1 on the top right to H7 on the bottom left). The length of arrow delta is the generalization error. If the ML problem is too complex for a model class considered, only the horizontal part of the Rashomon curve is observed. This is an indication that the model class considered is not complex enough to learn the training data well. On the other hand, if the ML model class considered is too complex for the training data, only the vertical part of the Rashomon curve is observed. Right Figure: The state-of-the-art for the various public ML problems/datasets on their own Rashomon curve, indicating whether it’s likely to be too complex or too simple for the given ML task/dataset pairs.
当解决一个 ML 问题时,人们可能会考虑从简单到复杂的模型(假设)类的模型类层次结构。起初,模型类对于 ML 任务来说仍然过于简单,并且模型的错误率随着复杂性的增加而不断降低。该观察对应于沿着罗生门曲线的水平部分从右向左移动。在这种情况下,罗生门体积以与所有可能模型的所有集合的体积大约相同的速率增长(具有不同的精度)。在 ML 模型类开始变得对 ML 任务太复杂的情况下,模型错误率保持不变。这相当于从顶部到底部遍历罗生门曲线的垂直部分。在这种情况下,所有可能模型的集合超过了罗生门集合,罗生门比率急剧下降。罗生门曲线的转折点(“罗生门肘”)是较低复杂性(较高的对数罗生门比率)和较高准确性(较低的经验风险)的最佳结合点。因此,在模型类的层次结构中,落在罗生门弯头附近的那些可能具有适当的复杂度水平,以实现高精度与期望属性(如概化和可解释性)之间的最佳平衡。
本地与全球解释
可解释性方法可以提供两种类型的解释:局部和全局 ⁶ 。本地解释描述了模型如何对单个数据实例进行分类,并回答了诸如*“哪个(些)数据元素对分类输出最负责?”*在图像分类中,这相当于识别哪个像素负责“猫”图像类别预测,以及负责多少。局部解释对于围绕单个数据点研究 ML 决策是至关重要的。
LIME [local interpretable model-agnostic explanations taken from [2]]. The original model’s decision function is represented by the blue/pink background, and is clearly nonlinear. The bright red cross is the instance being explained (let’s call it X). Perturbed instances are sampled around X and are weighted according to their proximity to X (weight here is represented by size). Original model predictions are calculated on these perturbed instances. These are used to train a linear model (dashed line) that approximates the model well in the vicinity of X. Note that the explanation in this case is not faithful globally, but it is faithful locally around X.
This figure illustrates a local explanation of Google’s Inception neural network on some arbitrary image. (4) keep as explanations of the parts of the image that are most positive toward a certain class. In this case, the classifier predicts Electric Guitar, even though the image contains an acoustic guitar. The explanation reveals why it would confuse the two: the fretboard is very similar.
另一方面,全局解释试图提供模型如何为整个对象类或数据集生成预测的整体概括,而不是集中在单个预测和数据点上。
The plots above demonstrate global explanations for a model trained on the census income dataset to predict the income level for adults, based on demographic features. The left figure (calculated using InterpertML) shows the score predicted by a GA2M model as a function of age. This directly illustrates the age contribution to the model. The right figure shows the mean absolute score of each feature to the model (aka feature importance).
两种最流行的全局解释技术是特征重要性和部分依赖图。特征重要性提供了一个分数,表明每个特征在模型构建中的有用性或价值。在基于决策树的模型中(如随机森林或梯度推进),在决策树中用于做出关键决策的特征越多,其相对重要性就越高。部分相关性图(PDP)显示了目标变量和一组“目标”特征之间的相关性,忽略了所有其他特征(“补充”特征)的值。直观上,我们可以将部分相关性解释为作为“目标”特征的函数的预期目标响应。部分相关图有助于我们理解特定特征值如何影响预测,这对模型和数据调试很有用,如 所示。
基于特征与基于概念的解释
早期的可解释性方法依赖于使用输入特征来构建解释。这种方法被称为基于特征的解释。基于特征的解释的一个关键困难是,大多数 ML 模型对特征(如像素值)进行操作,这些特征不符合人类容易理解的高级概念。在她的 KDD XAI 2019 主题演讲中,谷歌大脑的高级研究科学家 Been Kim 指出,基于特征的解释应用于最先进的复杂黑盒模型(如 InceptionV3 或 GoogleLeNet )可能会产生不合理的解释 ⁷ ⁸ 。更重要的是,对于输入特征具有高维数的 ML 问题的基于特征的解释不一定导致人类友好的解释。
Testing with concept activation vectors (TCAV) quantitatively measures how a “concept” (defined by a collection of inputs) is learned by a trained model by quantifying sensitivity of a model prediction class along the direction of concept activation vectors (CAVs). CAVs are defined per layer and per concept by training a linear classifier [such as support vector machine (SVM)] over the activation states of a layer of a pre-trained network using a collection of “concept-defining” inputs vs. random inputs (CAV testing inputs). These CAV testing inputs can be constructed post-hoc and do not need to be part of the training/evaluation and target task-specific datasets. TCAV can be used with both black box complex models as well as interpretable models. TCAV is currently publicly available at : https://github.com/tensorflow/tcav
基于概念的可解释性基于人类定义的概念构建解释,而不是基于特征和内部模型(激活)状态的输入表示。为了实现这一点,输入特征和模型内部状态以及人类定义的概念分别在两个向量空间中表示:(Em)和(Eh)。这两个向量空间之间的函数映射(如果存在的话)提供了一种从输入特征和 ML 模型内部状态中提取人类定义的概念的方式。
在她的主题演讲中,Kim 介绍了概念激活向量(TCAV)测试,这是一种在人类定义的概念空间(Eh)和模型内部状态(Em) ⁹ 之间进行定量翻译的程序。TCAV 需要两个主要成分:(1)包含概念的输入和负样本(随机输入),以及(2)测试概念的预训练 ML 模型。为了测试训练的 ML 模型捕获特定概念的程度,在训练的 ML 模型的子组件(层)上推断包含概念的输入和随机输入。然后,训练诸如支持向量机的线性分类器,以区分由包含概念的输入和随机输入引起的网络激活。这种训练的结果是概念激活向量(CAV)。一旦定义了 CAV,就可以为属于一个类的每个实例计算沿着 CAV 的类概率的方向导数。最后,一个类的“概念重要性”被计算为该类中被包含输入的概念相对于随机输入积极激活的实例的分数。这种方法允许人类询问模型是否“学习”了特定的可表达概念,以及学习得如何。
例如,人类可以使用 TCAV 询问计算机视觉模型“X”如何学习关联医生图像中的“白大褂”或“听诊器”的概念。为了做到这一点,人类测试人员可以首先收集一组包含白大褂和随机图像的图像,然后对这组图像应用预训练的“X”来获得预测,并计算“白大褂”概念的 TCAV 分数。该 TCAV 分数量化了在图像分类任务中“白大褂”的概念对于“医生”类别的预测的重要性。TCAV 是一种示例驱动的方法,所以它仍然需要仔细选择概念数据实例作为输入。TCAV 还依赖人类来生成要测试的概念,并让概念可以在概念输入中表达出来。
Example of a realistic use of TCAV to quantify how much the concepts of “white coat,” “stethoscope,” and “male” are important for an image classification model for a positive prediction of the “doctor” class.
像 TCAV 这样基于概念的可解释性方法是提取“人类友好”的 ML 解释的一个步骤。对于模型预测是否明智,以及它们是否符合我们的积极价值观,这取决于今天的 ML 从业者做出负责任和正确的判断。纠正训练有素的黑盒 ML 模型中的缺陷取决于我们,TCAV 可以帮助说明缺陷在哪里。
我们能做得更好吗?
作为一个人工智能实践者的社区,我们有责任清楚地定义我们希望可解释的人工智能成为什么,并建立指导方针,以产生考虑到使用什么条信息、如何(以什么方式)以有益(而不是有害或滥用)的方式构建可解释性,以及何时(在什么情况/背景下和向谁)交付它的解释。虽然今天可解释的人工智能方法有助于查明 ML 系统中的缺陷,但我们面前还有很多工作要做。
现在,这里有一些将可解释性带到当今实践最前沿的技巧:
- 尽可能选择易于理解的模型。
- 使用易懂的模型和当地的解释,确保模型和数据符合你的领域知识和社会价值观。
- 衡量机器学习模型的性能,以确保决策符合社会价值观(例如,当建模数据包括受保护的群体时,优化一致性和平等机会以及准确性) ⁰ 。
- 将因果关系构建到模型解释中 。
- 衡量解释的有用性和可操作性 。
结束语
在短短的几年时间里,可解释的人工智能作为一个领域已经走了很长的路。作为本次研讨会的共同组织者,我们有幸见证了对 ML 中可解释性的巨大热情。对我们所有人来说,可解释性可能是我们的“正北”为了人类的利益,我们如何通过确保“我们的价值观一致,我们的知识得到反映”来负责任地使用 ML。这超出了获得最终用户信任或获得狭义公平的范围。我们希望将可解释性与社会价值观结合起来,为那些生活和生计与多发性硬化症接触或受其影响的人造福。
承认
我们要感谢及时帮助审查 XAI·KDD 研讨会论文的志愿者团体。我们也非常感谢我们的研讨会发言人和小组成员分享他们的知识,智慧和精彩的内容。
参考资料:
【1】Joy Buolamwini,Timnit Gebru。性别差异:商业性别分类的交叉准确性差异。【2018 年 PMLR 第一届公平、问责和透明会议论文集 81:77–91。
[2]马尔科·图利奥·里贝罗、萨梅尔·辛格和卡洛斯·盖斯特林。机器学习的模型不可知可解释性。 arXiv 预印本 arXiv:1606.05386 ,2016。
*[3]露丝·C·方和安德里亚·韦达尔迪。通过有意义的扰动对黑盒的可解释的解释。*2017 年 IEEE 计算机视觉国际会议(ICCV)论文集第 3429–3437 页。
*[4]彼得·达布考斯基和亚林·加尔。黑盒分类器的实时图像显著性。*神经信息处理系统进展(NIPS) 2017,第 6967–6976 页。
*[5]春-常昊、埃利奥特·克里奇尔、安娜·戈登堡和大卫·杜文瑙德。通过反事实生成解释图像分类器。*载于2019 年第三届学习表征国际会议(ICLR)论文集。
6 Scoot Lundberg 和 Su-In Lee。解释模型预测的统一方法。于 神经信息处理系统进展,2017 。
[7]穆昆德·孙达拉扬,安库尔·塔利,奇奇扬。*深度网络的公理化属性。*载于《第 34 届国际机器学习大会(ICML)论文集》2017 年第 70 卷,第 3319–3328 页。
[8]两代情·什里库马尔、佩顿·格林赛德、安舒尔·昆达耶。*通过传播激活差异学习重要特征。*ICML 2017 与 PMLR 第 70 卷第 3145–3153 页。
[9]基姆、辛西娅·鲁丁和朱莉·沙阿。*贝叶斯案例模型:基于案例推理和原型分类的生成方法。*在 NIPS 2014 中,第 1952–1960 页。
[10] B .乌斯顿和 c .鲁丁。可解释线性分类的方法和模型。arXiv:1405.40472014。**
[11]特雷弗·哈斯蒂·罗伯特·蒂布拉尼。广义可加模型:一些应用。美国统计协会杂志 1987 年 82:398,371–386。
*【12】里奇·卡鲁阿纳,保罗·科赫,尹娄,马克·斯特姆,约翰内斯·戈尔克,小糯米·埃尔哈达德。*可理解的医疗保健模型:预测肺炎风险和住院 30 天再入院。第 21 届 ACM SIGKDD 知识发现和数据挖掘国际会议论文集第 1721–1730 页。
[13] Yair Horesh,Noa Haas,Elhanan Mishraky,Yehezkel S. Resheff,Shir Meir LadorPaired-Consistency:一种基于示例的模型不可知方法,用于机器学习中的公平性正则化。于*arXiv:1908.02641*,2019。**
14 辛西娅·鲁丁。停止解释高风险决策的黑盒机器学习模型,转而使用可解释的模型。载于《自然机器智能》(2019)第 1 卷,第 206–215 页。
*[15] Semenova、Lesia 和 Cynthia Rudin。*罗生门曲线和体积研究:机器学习中泛化和模型简单性的新视角。arXiv 预印本 arXiv:1908.01755 ,2019。
[16]金,后土和多希-维勒兹,终曲。迈向可解释机器学习的严谨科学。于arXiv:1702.08608,2017。**
[17]朱利叶斯·阿德巴约,贾斯汀·吉尔默,迈克尔·穆勒,伊恩·古德菲勒,莫里茨·哈特,被金。显著图的完整性检查。在neur IPS 2018。**
[18]杨和 Been Kim BIM:用地面真值对可解释性方法进行量化评估。在arXiv:1907.09701,2019。
[19] Been Kim、Martin Wattenberg、Justin Gilmer、Carrie Cai、James Wexler、Fernanda Viegas 和 Rory Sayres。特征归因之外的可解释性:用概念激活向量进行定量测试(TCAV)。在 ICML 2018, 第 2673–2682 页 。
**[20]汤米·雅各布拉·大卫·阿尔瓦雷斯-梅利斯。用自解释神经网络实现健壮的可解释性。于 arXiv:1806.07538 ,2018。
[21] Yash Goyal,Uri Shalit,Been Kim。用因果概念效应(CaCE)解释量词。在arXiv:1907.07165,2019。
*[22]伯克·乌斯顿,亚历山大·斯潘赫,刘洋。线性分类中的可操作追索权。在 2019 年公平、问责和透明会议(FAT)会议记录中,第 10–19 页 。
NBA 全明星球迷投票与球员价值(VORP):谁真的值得成为全明星首发?
作为本月早些时候我的帖子的后续,其中 比较了赢份额和上场时间 等游戏内指标中领先的全明星投票接受者,我今天写的是关于哪些球员(根据 1 月 10 日**NBA 报道的球迷投票结果)目前被预测为全明星冷门,哪些可能不是最值得全明星首发的球员。
在这份报告中,我将比较球员的球迷投票和他们的 VORP,或替换球员的价值(定义如下),这是一个有用的高级指标,可以估计每个球员对他们球队的价值。没有一个标准可以完全理解一个球员的价值,但是 VORP 提供了一个很好的指示。
注意,粉丝投票占流程的 50%。剩下的 50%的加权全明星投票被委托给 NBA 球员和媒体。这个规则的改变是几年前做出的,目的是帮助最值得的球员获得全明星首发的荣誉,但是球迷的投票仍然占加权投票的很大一部分。
我来看看全明星投票的四个部分(东部联盟后卫、东部联盟前场、西部联盟后卫和西部联盟前场)的以下指标:
- 超过替补球员的价值(VORP):篮球参考 将 VORP 定义为一个衡量每个球员对球队的整体贡献的标准,衡量的是理论上的“替补球员”会提供什么,其中“替补球员”被定义为拿最低工资的球员或者不是球队轮换中的正常成员。
-VORP 排名 :每个玩家由 VORP 排名,从高到低决定哪个玩家的 VORP 最高。
-
上场分钟 :本赛季(截至 2019 年 1 月 11 日)的上场分钟数。
-
全明星投票 :
o 绿色的 条 表示基于球迷投票,目前处于全明星首发位置的球员。
o
东部会议守卫
预计全明星首发(基于球迷投票)
东部的首发后卫和他们的 VORP 截然相反。凯里·欧文的 VORP 2.6 的成绩令人印象深刻,比紧随其后的东部后卫高出 0.5,显然他赢得了比赛的首发位置。另一方面,未来的名人堂成员德韦恩·韦德(Dwayne Wade)管理着一个可怜的. 1 VORP,只排在第 39 位,然而他的遗产使他的投票数上升到前 2 位。
谁应该首发(以 VORP 为准)
虽然我不怪球迷多愁善感,但基于本·西蒙斯 2.1 的 VORP,他应该和欧文一起首发。他在粉丝投票中排名前 6,但在第二首发位置的投票中落后于德韦恩·韦德。
气泡上的气泡上的**
肯巴·沃克的赛季在 VORP 排名第三,在投票中也是前六名之一,但是如果他想在这场大赛中首发,他需要与媒体和他的队友和解。
东部联盟前场
预计全明星首发(基于球迷投票)
扬尼斯·阿德托昆博,又名希腊怪胎,以领先的 3.8 VORP,比第二名高出 1 分,碾压东部联盟前场。
科怀·伦纳德和乔尔·恩比德分别拥有第四和第五高的 VORPs,但发现自己目前处于首发位置,因为在粉丝投票中名列前三。**
【VORP】谁应该首发
单从 VORP 来看,詹尼斯应该会和尼古拉·武切维奇和布雷克·格里芬一起进入首发阵容。尽管拥有第二好的 VORP,奥兰多的尼古拉·武切维奇在球迷投票中甚至没有进入前 6 名,这使得全明星首发不太可能。布雷克·格里芬通过增加一个越来越有效的三分球彻底改变了他的比赛,并在他的新家接受了他的领导角色,产生了第三高的 VORP,但目前在球迷投票中排名前三。**
其他玩家的注意事项
杰森·塔图姆的第二季无论如何都不算差,但从他轰动的新秀赛季开始,表现出了生产力的下降。他的 VORP 目前是 0.6,与上赛季他以 1.8 的 VORP 成绩结束比赛时相差甚远。尽管前场球员 VORP 排名第 30,但他目前在投票中排名前 6。文斯·卡特在仅仅 660 分钟的比赛中拥有 0.0 的 VORP,但仍然是前场领袖之一。
西部联盟前场球员
预计全明星首发(基于球迷投票):
正如他们在他因伤缺席期间所见证的那样,很容易看出勒布朗·詹姆斯对一支多年未能进入季后赛的湖人队的重要性。然而,特别是由于前面提到的伤停补时,勒布朗发现自己的 VORP 排名第三。不过,看到国王再次领先粉丝投票并不奇怪。保罗·乔治在西部前场球员中拥有第二多的选票。他对 OKC 的成功起了很大作用,即使面对威斯布鲁克糟糕的投篮,但乔治只有第五高的 VORP。排在第 13 位的是卢卡·东契奇,尽管他是年度最佳新秀,但还没有全明星级别的 VORP。然而,球迷们对东契奇感到兴奋,他已经向达拉斯展示了未来几年的期望,他目前在球迷投票中保持着前 3 名的位置,这使他在全明星赛中处于有利的位置。
谁应该首发(以 VORP 为准)
除了詹姆斯,安东尼·戴维斯和尼古拉·约基奇都属于开球时的场地。超级巨星,潜在的交易目标,安东尼·戴维斯以 4.0 的 VORP 领先所有前场球员。这两支球队正在努力在一个满载的西部联盟中生存,但安东尼·戴维斯荒谬的比赛水平仍然让鹈鹕队在几场比赛之内成为第八种子。他是粉丝投票的前六名之一,但不是前三名,需要帮助才能获得首发位置。掘金的尼古拉·约基奇拥有第二高的 VORP,但在球迷投票中甚至没有进入前 6 名。他为西部领先的丹佛掘金队效力,但这仍然不足以让他得到球迷应有的关注。
西域都护府
预计全明星首发(基于球迷投票):
斯蒂芬·库里和德里克·罗斯目前被设定为预计的西部首发前锋(根据目前的球迷投票统计),尽管他们分别拥有第 4 和第 16 名最佳前锋,并且本赛季比其他精英后卫多打了数百分钟。**
******【VORP】谁应该首发
詹姆斯·哈登传奇般的赛季至今和灼热的 4.4 VORP 不足以使他成为全明星首发,如果粉丝投票保持原样,他将不得不依靠媒体和球员投票。达米恩·利拉德拥有第二高的 VORP,但目前在粉丝投票方面不在前两名之内。
上泡
尽管拉塞尔·维斯特布鲁克经历了历史上糟糕的投篮赛季,但他仍然拥有第三高的 VORP,显示了他在球场上的积极影响。他在粉丝投票中是前 6 名,但不是前两名。
其他玩家注意
上赛季克莱·汤普森的受欢迎程度已经进入了前 6 名,尽管 VORP 排名第 65 位,VORP 排名惊人的 0.1。
感谢您阅读我最新的数据贴。 点击这里我的第一篇 NBA 全明星帖子,比较全明星投票和上场时间以及赢球份额 。请继续关注我的后续帖子,在那里我将看看哪些值得的玩家目前发现自己在外面观望。作为一名产品营销和数据分析专业人士,我对数据支持的讲故事充满热情。这些数据新闻帖子是我将真实数据与我个人的不同兴趣整合起来的方式,这些兴趣包括从旅行和娱乐到经济和社会问题的任何事情。
如果您有任何评论、故事想法或预期的数据项目,请随时发送电子邮件至 dwpwriting <邮箱至> gmail < dot > com,访问我的网站至dwpeterson.com,或通过LinkedIn联系我。**
NBA 全明星投票与场上表现:哪些球员真正属于全明星赛?
这篇文章分析了迄今为止获得全明星投票最多的 NBA 球员,并将其与他们在球场上的表现进行了比较。
周四,NBA 发布了首届 2019 NBA 全明星投票结果。因为报道的总数是基于球迷的投票,所以有一种固有的偏见倾向于那些知名度更高、过去更成功的球员,或者是在大市场的球员。在今天的报道中,我将通过几个场上指标(上场时间和提前获胜份额统计)来比较这些票数领先的人,以了解这些潜在的全明星球员中谁属于这场大赛,以及谁在场上每分钟获得的票数最多。
在接下来的帖子里,我会看看哪些值得的玩家发现他们自己在看外面。这篇文章着眼于第一轮投票结果,并使用了从1 月 4 日开始的球员数据。
每分钟得分票数(2018-2019 赛季): 谁是每分钟得分最高的全明星球员?
不出所料,勒布朗·詹姆斯进军大市场并没有影响他的人气。詹姆斯在所有投票接受者中领先,本赛季每分钟获得 919.7 票。有点令人惊讶的是,扬尼斯·阿德托昆博(每分钟 851 票)和凯里·欧文(每分钟 828 票)获得票数的速度比斯蒂芬·库里(每分钟 816 票)快。
尽管詹姆斯·哈登的表现超凡脱俗,但他每分钟仅获得 429 张选票,在榜单上仅排在第 14 位。
在名单的底部,华盛顿奇才队的后场约翰·沃尔和布拉德利·比尔分别获得每分钟 49 票和 43 票。
这可能是一个很好的时机来提一下,德马库斯·考辛斯以 92,977 张选票名列前茅,尽管今年到目前为止没有参加一场比赛。
(会议)每分钟收到的投票数
即使吉米·巴特勒和科怀·莱昂哈德转投东部联盟,勒布朗的西部之旅也推动了西部联盟的优势。再一次,尽管本赛季打了 0 分钟,德马库斯·考辛斯获得的票数超过了 7 名东部球员。
**全明星投票 vs 赢股:**这些潜在的全明星球员在球场上对球队的实际影响如何?
赢股是一种玩家统计,试图将团队成功的功劳分配给团队中的个人。关于赢股更深入的解释可以在 这里 找到。
这个散点图比较了每个顶级投票接受者的全明星投票数和他们对自己团队的估计价值。
**为球队的成功做出巨大贡献并获得大量全明星投票的球员:**正如你在散点图中看到的,这些超级巨星为他们的球队创造了非凡的价值(赢得 4.8+的股份),迄今为止已获得超过 500,000 次全明星投票。安东尼·戴维斯在赢得份额(6.7)方面领先,但在多数投票中排名第十。
**被低估的高影响力玩家:**赢得份额高但票数低的玩家。尽管他们为球队的成功做出了很大的贡献,但像凯尔·洛瑞(多伦多)、布雷克·格里芬(底特律)、德马尔·德罗赞(圣安东尼奥)和达米恩·利拉德(波特兰)这样的小市场明星发现自己也在这个名单上。
**被高估的低影响力球员:**这些球员的投票受欢迎程度目前超过了他们在球场上的影响力。常年全明星如拉塞尔·维斯特布鲁克和克莱·汤普森,以及罗伊候选人卢卡·东契奇发现自己在这个名单上。
**在球场上影响力低、投票率低的球员:**这个群体是一个大杂烩,既有低迷时期的前全明星球员(克里斯·保罗、德雷蒙德·格林和戈登·海沃德),也有由于市场大而投票率高的优秀球员(但不是全明星球员)(湖人队的朗佐·鲍尔和凯尔·库兹马,凯尔特人队的戈登·海沃德和艾尔·霍福德)。
感谢您阅读我最新的数据帖子。请继续关注我的后续帖子,在那里我将看看哪些值得的玩家目前发现自己在外面观望。作为一名产品营销和数据分析专业人士,我对数据支持的讲故事充满热情。这些数据新闻帖子是我将真实数据与我个人的不同兴趣整合起来的方式,这些兴趣包括从旅行和娱乐到经济和社会问题的任何事情。
如果您有任何评论、故事想法或预期的数据项目,请随时发送电子邮件至 dwpwriting <至> gmail < dot > com 或通过LinkedIn联系我。
NBA 数据分析:改变游戏
三点射击和数据可视化工具
“分析是我们现在做的几乎所有事情的一部分”——NBA 专员亚当·席尔瓦
如果你是 NBA 的粉丝,你会很清楚 NBA 正在经历一场巨大的变革。比赛本身也在改变,因为球队正在发现新的方法来制定策略,以克服平庸的障碍,成为争夺冠军的球队。成为冠军争夺者的这一“过程”在很大程度上是由于数据分析。尽管备受争议,但它已被证明是将过去的平庸球队转变为竞争者的有效策略。
就在十年前,只有几支 NBA 球队在他们的前台办公室里有分析部门。今天,几乎所有 NBA 球队的前台都有数据分析师员工。利用数据分析是一种趋势,渗透到这项运动的每个方面,从新秀球探,发现被低估的球员,计算有效投篮,三分球的崛起,等等。所有这些都是为了打造一支冠军球队。
尽管这场革命很酷,但它不会没有批评者。查尔斯·巴克利等许多前玩家是数据分析的坚定反对者。
达里尔·莫雷-休斯顿火箭队
真正推动数据分析驱动篮球的个人之一是达里尔·莫雷,他自 2007 年以来一直是休斯顿火箭队的总经理。
因为莫雷的背景是统计学而不是篮球,他受到了评论员和球迷的批评,他们厌倦了莫雷和他的休斯顿火箭队重复的比赛风格。这种玩法是数据驱动的。
但是尽管有这些批评,火箭在最近几年已经证明了他们是强大的对手和竞争者。在 2017-2018 赛季,尽管有伤病,火箭队还是进入了西部决赛。在同一个赛季,他们创造了单赛季三分球数量的历史记录,同时在人才济济的西部联盟中排名第一。
正如你在上面看到的,休斯顿的投篮选择开始变得可预测了。
三分球的改编
数据分析改变篮球比赛的最大方式之一是三分球尝试的增加。分析师们研究了比赛和投篮,以确定哪些投篮更有可能推动球队取得胜利。
其中一个分析是,很多球员都投了远距离低效的 2 分球。由于缺乏成为一个篮子的可能性,整个联盟的分析师和教练组开始鼓励他们球队的射手在三分线上投更多的球。从统计学上来说,一个相当不错的射手有 35%的几率会投中。如果一个射手投了 3 次球,其中一次成功了,那么这份财产就值了。
主要的收获是,从 3 点线上的额外点获得的 50%的回报使得长距离的尝试是值得的。下面,你可以查看 1998-2017 年平均每场 3 分出手次数的时间线。
斯蒂芬·库里和金州勇士队
另一支从早期就大量采用数据分析的球队是金州勇士队。在过去的 5 年里,他们都进入了 NBA 总决赛。勇士队一贯使用的方法之一是三分球。
Source: Welcome to Smarter Basketball
在美国广播公司转播总决赛期间发布的一张图表显示了库里领先他的同龄人有多远。库里在季后赛中的三分球已经超过了 1980 年整个 NBA 的三分球数。
在 2015 年季后赛中,金州勇士队的斯蒂芬·库里在季后赛系列赛中的三分球比 1980 年 NBA 季后赛的所有球员都多。这并不是将 1980 年的球员归类为天赋较低,而是代表了篮球运动在过去十年中发生了多么彻底的变化。
数据可视化工具和视频跟踪
现在数据分析趋势中出现的一个更酷的东西是正在被创建和调整以收集和可视化数据的技术。
NBA 与一家名为 STATS 的公司合作,在每个篮球馆安装 6 个摄像头,以每秒 25 帧的速度跟踪球员和裁判的动作,以获得最具分析性的数据,供球队和 NBA 进行分析。
这个系统的好处是数不胜数的,对于一个推动球队找到最好的竞争策略的联盟来说。
Source: Analyzing NBA Basketball Data with R
有了这项技术,教练团队可以跟踪和分析比赛,根据他们将要对阵的球队或球星调整他们的防守和进攻策略。这些数据让玩家在如何根据对手和个人健康状况调整比赛和努力方面拥有优势。
金州勇士队在过去 5 年中如此成功的原因之一是他们愿意让他们的关键球员休息,如斯蒂芬·库里,T2 减少受伤的可能性,T4 确保球员可以打得更久。
这项技术有助于追踪球员最佳投篮的位置。我在研究中发现了以下网站,完全被玩家信息的详细程度所折服。
这是斯蒂芬·库里在球场某些区域投篮时与联盟其他球队的差距。显然,斯蒂芬·库里更喜欢在三分线和内线投篮。
最后的反思和笔记
当团队考虑将数据分析纳入他们的战略时,他们需要明智地制定决策。策略不是简单的投三分。如果你没有一个能有效投三分球的球员,你就不会成功。
“……团队取得了不同程度的成功。如果没有合适的球员来采用重分析的策略,团队很容易无法实现预期的结果。虽然三分球可能更有效率,但如果一支球队没有任何优秀的三分球手,这种策略仍然会让他们失败。”
也就是说,这种策略在大学篮球赛中也被采用。在 2018 年的三月疯狂中,维拉诺瓦大学打破了一场比赛中最多三分球的四强记录。
许多评论员是数据分析驱动篮球的坚定批评者。如前所述,NBA 鼓励球队在他们的策略中使用数据分析。但 NBA 和球队(特别是休斯顿火箭队)一直因重复的比赛风格和不受欢迎的方法而受到批评。为了避免重复的比赛风格,使比赛成为一场 3 分的比赛,一些人说要把 3 分线推得更远,让比赛变得更困难。
不管用什么方法,在 NBA 总裁亚当·席尔瓦的领导下,我毫不怀疑 NBA 正在考虑每一种可能的方式来保持篮球运动对球迷的吸引力。我确信联盟也在使用数据分析来应对这一挑战。
NBA 对进一步将分析纳入其系统持非常开放的态度。他们实际上在今年九月有一个黑客马拉松。
如果你是一名学生,一名 NBA 球迷,并且正在寻找挑战,我强烈建议你尝试一下。
来源
随着 NBA 经历其分析革命,大数据的兴起正在使旧学派与新学派对立起来。在…
www.theatlantic.com](https://www.theatlantic.com/entertainment/archive/2015/06/nba-data-analytics/396776/) [## 大联盟图表
编辑描述
bigleaguegraphs.com](https://bigleaguegraphs.com/nba/shot-charts) [## 篮球
流动数据
flowingdata.com](https://flowingdata.com/tag/basketball/) [## 数据分析让 NBA 变得面目全非
这不是你父母的国家篮球协会。它甚至不是你哥哥的。在过去的…
qz.com](https://qz.com/1104922/data-analytics-have-revolutionized-the-nba/) [## 莫雷球:休斯顿火箭队和分析
概述休斯顿火箭队如何将篮球分析带到一个新的水平,并上升到 NBA 的顶端…
digital.hbs.edu](https://digital.hbs.edu/platform-digit/submission/moreyball-the-houston-rockets-and-analytics/) [## 职业队篮球运动员追踪| SportVU |统计
SportVU 帮助 NBA 跟踪球员的运动,以提高他们的比赛水平。体育大学篮球运动员跟踪系统可以…
www.stats.com](https://www.stats.com/sportvu-basketball/)
NBA MVP 预测模型
根据团队和个人的成功计算价值
Art Credit to The Ringer NBA Show
最有价值球员奖是美国国家篮球协会(NBA)的最高个人荣誉。它是由媒体成员根据相对开放的价值定义投票产生的。煽动球迷和媒体成员之间关于价值在篮球比赛中真正意味着什么的对话(和激烈的争论)是故意主观的。
然而,这些年来,两个主要的叙事一直是“最佳球队的最佳球员”(即 2018:詹姆斯·哈登, 2016:斯蒂芬·库里)或拥有历史数字(即 2017:拉塞尔·维斯特布鲁克, 2014:凯文·杜兰特)。使用这两个叙述作为标准,我开始创建一个统计模型来评估一个玩家的价值基于他们对团队胜利和整体个人产出的贡献。
我的目标是建立一个模型,可以准确地从过去 10 个赛季(我的训练数据)中授予 MVP,以便对 2019 年做出可靠的预测。最终的目的不是创造一个客观的价值真相,而是通过一致的统计镜头来看待 MVP 竞赛,这些镜头反映了每年相同的标准。
模型摘要
= . 5()±5(总统计 )
如上所述,玩家的总价值是基于他们的胜利贡献和总统计的平均水平。
**注:这不是一个经过统计测试的模型。50/50 重量是一个理论起点。当我在更多的 MVP 比赛中加载和测试该模型时,我调整了权重,看看它会如何影响结果。最终,我以 50/50 的权重结束,以最大限度地提高十年间模型的准确性。
赢得贡献细分
=影响等级影响质量***
影响程度 = ( 队胜 * 比赛场次 /82 * 分钟 /48 * 使用率 /100)
影响质量= . 4(VORP+赢得份额) + .2( 净价)
1.影响程度
首先,我想通过比赛和上场时间以及使用率来衡量一个球员对球队胜利的影响程度(高或低)。从数学上来说,这里最重要的数字是团队的胜利。所有其他变量作为评估玩家对这些胜利的影响的比率。
用法在这里可能看起来有争议,但是我想衡量一个球队与他的队友相比有多依赖一个控球球员。例如在 2016 年,金州勇士队赢得了 73 场常规赛的纪录。他们的 3 名最佳球员分别是斯蒂芬·库里、克莱·汤普森和德雷蒙德·格林,他们都打了大约 80 场比赛,平均每场上场 34 分钟。在这种情况下,使用率是队友之间影响力的关键区分因素。
虽然统计数据通常倾向于后卫和持球者——本赛季使用率前 20 名中有 90%都不是中锋,但像乔尔·恩比德、安东尼·戴维斯和德马库斯·考辛斯(阿喀琉斯受伤前)这样的精英大个子由于他们出色的技术一直排在使用率前 10 名。稍后再讨论这个问题。
2.影响质量
接下来,我想测量球员在球场上的冲击质量(好或坏)。这是迄今为止构建模型最困难的方面。与棒球不同,没有一个被篮球界广泛接受的综合统计数据来衡量球员的影响力。因此,我使用了公众可以访问的多个高级统计数据的加权值。下面是他们的意思的快速总结。
- *:衡量一名球员的相对影响力(方框加/减),根据上场时间与联盟平均水平进行调整。(注:自 2006 年以来,除了 5 次之外,VORP 的联盟领袖每年都获得 MVP)***
- 净等级 :玩家每 100 次拥有产生多少进攻(进攻等级)和玩家每 100 次拥有放弃多少防守(防守等级)之间的点数差
使用赢球份额和 VORP 是因为要区分一个球员相对于队友的贡献(赢球份额)和对联盟其他成员的贡献(VORP)。净评级被包括在内,以区分球员在球场上的整体输出,并帮助调整等式,以有利于上场时间较短的球员,而 VORP 和 Win Share 对此进行了处罚。
权重的值有些随意,是在一系列反复试验后确定的,以最大限度地提高模型的准确性。尽管如此,净评级的权重较低的原因是它严重偏向大个子,并且它的部分计算(防守评级)也用于计算防守胜利份额,这是胜利份额的一部分。
总统计(单个输出)计算
( 分 *** 真投篮%+1.5(助攻 ) + 1.2( 篮板)+3(盖帽
我想让这个输出尽可能简单,借用了幻想篮球的权重。我添加的几个调整是乘(TS %)对抗得分。这让我可以排除像投篮,罚球,三分球和投篮这样的数据。虽然人们在评估 MVP 时会考虑这些数据,但我觉得(得分 TS%)是一种衡量得分产出与效率的简洁方法。最后一个单位 25 是一个标量,我用来使最终值接近 win 贡献值(也是为了最大化整体模型的准确性而选择的)。*****
我想在这里回到使用率,因为当评估总统计数据时,它严重倾向于大个子(净评分也是如此,但这更多地归因于中锋在防守中的作用)。2019 年,鲁迪·戈贝尔和安德烈·德拉蒙德在个人产出方面分别排名第五和第六,超过了保罗·乔治(第九)和达米恩·利拉德(第十四)。这也是为什么我在赢球贡献公式中使用来平衡总统计中大个子的偏见。
对照过去十年的 MVP 测试模型
在预测 2019 MVP 之前,我想根据过去 10 个赛季评估模型的结果和固有偏差。这是一次有趣的回忆之旅,展示了随着时间的推移,全联盟对分析的认知和接受的总体变化。
(注:所有数据来源于 篮球-参考 )
2017–2018
- 达米恩·利拉德是前五名中唯一的遗漏(第四名实际与第七名预测)
- 这里唯一的主要偏差是卡尔-安东尼·唐斯,他没有获得 MVP 的实际票数,而他的队友吉米·巴特勒(实际第 10 对预测第 22)被认为是明尼苏达成功的主要原因,尽管他错过了 23 场比赛
2016–2017
- 一场历史上难分胜负的 MVP 比赛,但是模型显示拉塞尔·维斯特布鲁克以微弱优势胜出
- 斯蒂芬·库里被投票者低估(第六名实际对第三名预测),可能是因为在 2016 年休赛期增加了凯文·杜兰特****
2015–2016
- 在打破常规赛 73 胜的记录后,斯蒂芬·库里在实际投票和预测投票中获得了压倒性的胜利(联盟历史上第一个一致通过的 MVP
- 尽管实际排名略有偏差,但模型第一次预测出了正确的前 5 名球员
- 科怀·伦纳德获得预测第五对实际第二尽管赢得了年度最佳防守球员,可能是因为相对不引人注目的总数据(21 分,6.8 个篮板和 2.6 次助攻)****
2014–2015
- 在预测排名和实际投票中,斯蒂芬·库里对詹姆斯·哈登的微弱优势(库里:1198 对哈登:936 )(哈登将获得一个仅由球员投票的非官方 MVP 奖项
- 这里最大的遗漏是勒布朗·詹姆斯(实际第三对预测第六),因为他的标准低于标准(在 VORP 第六,从克里夫兰的缓慢开始******
2013–2014
- 凯文·乐福,另一个被这个模型高估的明尼苏达大个子(第 11 实际 vs .第 3 预测),发布了一个惊人的个人统计赛季(在 VORP 联盟中排名第 3仅次于勒布朗和 KD)
- 本赛季的年度最佳防守球员乔吉姆·诺阿是最大的遗漏(实际第四对预测第十),可能是因为他缺乏进攻能力,导致公牛队获得 48 胜
2012–2013
- 卡梅隆·安东尼是一个重大的遗漏(实际第 3 对预测第 15th】),尽管他是 54 胜尼克斯队的最佳球员(影响水平:12.11,联盟第 5)由于低于标准的先进指标(在 VORP 第 33,赢得份额第 14th】)而在中遭受胜利质量****
- 总的来说,随着时间的推移,由于缺乏公众意识和对这些指标的接受,该模型将低估具有较差高级统计数据的球员*(而实际投票者可能会高估他们)***
2011 年至 2012 年
- 在一个锁定的缩短赛季中,布雷克·格里芬是最大的惊喜参赛。虽然他的个人数据(20.7 分,10.9 个篮板)很稳定,但他可能没有得到任何实际的选票,因为他的“ Lob City ”队友克里斯·保罗是球队的焦点**
- 最大的遗漏是科比·布莱恩特* ( 实际排名第 4,预测排名第 19),他在 2013 年遭遇了与卡梅隆·安东尼类似的问题,成为一名高产量、低效率的球员(影响力水平 : 12.82,联盟排名第 4)(VORP 联盟第 25,赢球份额联盟第 35)***
2010–2011
- 该模型的第一个 MVP 预测错误发生在 2011 年,此前勒布朗·詹姆斯于 2010 年决定加入迈阿密热火**
- 这场失利的主要原因是德里克·罗斯是芝加哥谦逊的家乡后卫。而勒布朗在当时被认为是这个国家最大的体育恶棍
- 然而,罗斯在的影响力水平上确实比勒布朗有优势,正如我们已经看到的那样,这与 2015 年之前的实际投票有很强的相关性(我将在后面介绍这一年的重要性)**
- 最后,保罗加索尔很可能取代队友的位置,而科比布莱恩特* ( 第四名实际与第七名预测:影响水平:14.13,联盟第三),延续了该模型高估高效大个子而不是他们的边锋队友的趋势***
2009–2010
- 一个没有重大失误的赛季,尽管这个模型继续低估科比的价值,但这次只是轻微低估!(第三实际与第六预测
2008–2009
- 另一个准确的赛季,尽管在顺序上有小错误,但模型预测了正确的前 5 名球员
- 一个绝对具有历史意义的赛季,由勒布朗·詹姆斯创造,他创造了 NBA 历史上最高的 13 分,仅次于迈克尔·乔丹**
2018–2019 MVP 预测
…最后是对今年比赛的预测(这可能也是大多数读者所期待的)
该模型显示詹姆斯·哈登是预测的赢家,基于更高的影响水平*(更多的比赛,更多的上场时间,更高的使用率)和更高的总数据 (36 分/场,联盟历史上第八高的得分赛季,仅次于威尔特·张伯伦,埃尔金·贝勒和乔丹,十年来第五高的总数据)。结果类似于拉塞尔·维斯特布鲁克 2017 年的胜利,尽管他的胜利较少,但总统计数据更好,但他击败了詹姆斯·哈登***
然而,我认为詹尼斯很可能仍然是最有希望赢得 MVP 的人,因为两个因素,叙事和防守。在叙事方面,詹尼斯是众所周知的“街区新人”,受到媒体和粉丝的喜爱(类似于 2011 年的德里克·罗斯),而哈登,现任获胜者,可能会遭受选民疲劳和对他的比赛风格的总体负面情绪。**
在防守方面,有 2016 年科怀·伦纳德和 2014 年乔吉姆·诺阿(两人都是年度最佳防守球员)被低估的例子。今年,Giannis 也在该奖项的争夺中(防守禁区正负排名联盟第二,防守胜率排名第三)。虽然这两个统计数据都被纳入了模型的计算中,但不难想象公众对詹尼斯的防守影响和整体叙事的看法将他推过了哈登。
结论
这个模型的创建和测试是一个有趣的思考练习,测试了我的统计学和篮球观点。在我对篮球价值的先入为主的观念和模型告诉我的东西之间,以及根据十年的结果对其进行改造,这是一件非常有趣的事情。以下是我的一些结束语:
- 如前所述,2015 年是 NBA 意义重大的一年。金州勇士队成为第一支赢得总冠军的跳投球队,并帮助改变了全联盟对分析的看法。结果反映了该模型对科比和卡梅隆-安东尼等球员的一贯低估;高使用率、低效率的得分手仍然打 【英雄球】 而不是 【莫雷球】 。
- 这个模型高估了像凯文·乐福、卡尔-安东尼·唐斯和布雷克·格里芬这样的大人物,这很有趣,因为这些球员能够出乎意料地进入前 5 名,这是因为他们同时拥有良好的统计数据和有利的先进统计数据。虽然传统智慧会把一些成功放在他们更具控球优势的队友身上,但这让我质疑这些大个子是真的被低估了,还是有利形势和统计数据的产物。**
- 最后,低估防守是一种偏见,这种偏见不仅反映在这个模型中,而且贯穿于整个篮球运动。其中一部分原因是由于缺乏可靠的(和公开的)个人球员的防守统计数据。虽然这肯定会有助于模型(以及一个衡量公众情绪/叙事的分数),我不知道它会在多大程度上影响球迷对进攻的总体偏好。防守可能会赢得冠军,但一般不会上头条或者吸引赞助。老实说,我不知道任何数量的分析是否会改变这一点。
参考
完整的数据集,包括从 2019 年到 2009 年的球员统计数据,如果你有兴趣深入挖掘的话
使用数据科学和线性回归预测 NBA 薪资
用 Python 构建线性回归机器学习模型预测 NBA 球员工资的简要指南
这个项目旨在探索如何利用各种各样的 NBA 统计数据来预测一名 NBA 球员从 1995 年到 2017 年的工资。我对这个项目的目标是:
- 发现哪些统计数据是 NBA 球员工资的最佳预测指标
- 使用机器学习模型预测 NBA 薪资
- 根据给定的和预测的薪水,确定哪些球员被高估和低估了
- 确定哪些球队在从他们的球员身上获取价值方面是最好的和最差的,以及这是否与一个球队赢得的比赛数量有关
数据
我得到了我的主要数据,一个从 1950 年开始的大约 50 个 NBA 球员的统计数据和工资信息的数据库。数据的链接可以在这里找到。我决定只使用 1995 赛季开始的数据,因为 1950 年的 NBA 与 21 世纪的 NBA 有很大不同。我选择 1995 年,因为这是第一年有两支新球队加入,使球队总数达到 29 支(第 30 支球队,夏洛特山猫队,于 2004 年加入)。
我使用的另外两个数据源,工资帽信息和每个赛季的球队胜率,都来自篮球参考,并被复制到一个 Excel 电子表格中,然后我将其导入到一个 Dataframe 中。
数据确实需要清理一点:总的统计数据,如上场时间或总得分,被他们的每场比赛当量所取代,以使统计数据标准化,假设该球员在那个赛季参加了超过一定数量的比赛(如果没有,他就被从数据集中删除)。此外,有许多球员没有列出该赛季的工资信息,因此被从数据集中删除。
The first five data points
哪些统计数据?
看了数据之后,一个早期的问题出现了。在过去的 20 年里,NBA 的平均工资大幅上涨。
解决方案是通过将工资数据作为联盟工资帽的百分比来标准化工资数据,工资帽是一个球队在给定赛季中可以花在球员身上的总工资限额。工资帽随着球员工资的上涨而上涨。
从那时起,是时候探索工资和统计数据之间的关系了。我从数据集中所有统计数据的关联热图开始。
不幸的是,由于统计数据的数量,从这些数据中没有获得多少有用的信息。因此,我切换到了 8 个统计数据的相关热图,这 8 个统计数据的皮尔逊 r 值最高。
然后,我将统计数据分成三个子类别:基本、普通和高级。基本的统计数据只包括球员的位置、年龄和上场时间。普通球迷会理解常规的统计数据:场均得分,场均篮板,投篮命中率等等。创建了高级统计数据来更详细地评估玩家的表现,其中一些包括玩家效率评级(PER)和获胜份额(WS)。
在统计数据被拆分后,我用同样的方法找到了每个角色中与薪水最相关的 8 个统计数据,并为它们创建了热图和散点图。
Heat map (left) and scatter plots (right) for advanced statistics
每个字符中的一些统计数据之间存在一些多重共线性,因此在分析后,一些统计数据被从前 8 位中删除。
机器学习模型
下一步是确定哪一个统计子类是工资的最佳预测者。为了实现这一点,为三个子类别中的每一个创建了线性回归机器学习模型,将数据分成训练和测试数据,并进行交叉验证。结果是,统计的常规子类别是最好的模型,其均方根误差(RMSE)为 6.46(三者中的最低值),r 为 0.466(三者中的最高值)。下面是剩余价值的图表——每个球员工资的实际工资上限百分比和预测百分比之间的差异。正残差值表示实际值大于预测值。
球员估价
常规线性模型用于预测数据集中每个球员的工资。然后,将这些预测与球员的实际工资进行比较,在数据框中创建一个残差栏,然后根据残差进行排序。下面重点介绍了前 25 名最被低估和最被高估的球员。
The most undervalued players according to the model
Some of the most overvalued players, according to the model
The model states that Michael Jordon in 1997 was the most overvalued player in the last 22 years.
看着这些数据,我开始质疑这个模型。最被高估的球员名单中充满了全盛时期的超级巨星,他们因为自己的能力而获得高薪,包括空前伟大的迈克尔·乔丹。高估和低估球员的统计数据有助于解释发生了什么。
Averages for most undervalued players
Averages for most overvalued players
最被低估的球员大多是年轻的、冉冉升起的新星,他们仍在新秀合同中,因此不会占用太多的工资帽空间。最被高估的球员大多是在他们的最佳巨星时期,他们得到相应的报酬。
认识到这一点后,我决定将残差标准化,将它们除以每个玩家的上限百分比,得到一个残差%。这更好地说明了谁被高估了,谁被低估了。
The new and improved most undervalued players
该模型对最被高估的球员极为不利,预测他们应该接受球队工资帽的负百分比,也就是说,球员应该为打球的特权向球队付费。即便如此,这也有助于确定哪些球员最被高估。
我的最后一项任务是将球员的价值与他们效力的球队联系起来,以及这与球队表现之间的关系。我将球员按球队分组,根据每个球员的平均实际支出百分比与平均预测百分比计算出每个球队的平均百分比百分比,并将过去 22 年的平均获胜次数作为一个附加类别添加进来。
The top section of the data grouped by team
在此基础上,我绘制了剩余百分比与每个团队平均获胜次数的散点图。令我惊讶的是,高估球员的球队通常比低估球员的球队更成功。
问题和潜在改进
我遇到的一个无法解决的问题是来自数据集。有球员通过交易或其他方式在赛季中期更换球队的情况,因此该球员在数据集中有几行(每次一行,一行显示年度总统计数据),但工资相同。我删除了每个球员的“总数”行,并希望其他行包含类似的统计数据,以免扭曲数据。
包括沙奎尔·奥尼尔在内的一些高知名度球员的薪水值缺失,不得不从数据集中删除。工资范围两端的玩家为机器学习模型提供了有价值的信息。此外,一些薪金数据不正确。数据显示卡梅隆·巴尔斯托在 2015 年赚了 1900 万美元,而实际上他赚了不到 100 万美元。
我的项目中的另一个问题是使用的时间段。NBA 在过去的 22 年里经历了巨大的变化,而我的分析没有反映出这一点。近年来,球队给球员提供的薪水比过去几年更多地基于先进的统计数据。此外,球员合同也发生了变化。1995 年,没有最高合同额,球员可以被自己的球队签下任何金额,即使超过工资帽。1997 年,迈克尔·乔丹挣了 3300 万美元,超过了工资帽允许芝加哥公牛队花在整个 T2 队的费用。联盟在接下来的几年里引入了最高合同来防止这种合同。这种新旧合同的混合让我的模型认为,20 世纪 90 年代末和 21 世纪初的超级巨星都签了不合理的大合同,因为最近一批超级巨星赚不到那么多钱。如果把重点放在更近的时间段,这个项目本可以做得更好。
我做了一个假设,所有的球队都会平等地重视球员,因此没有在线性回归模型中使用 team 作为统计数据。在未来的项目中,观察单个球队对球员工资的影响会很有趣。
结论
从我的分析中得出的两个主要结论如下:
- 显而易见,得分更多、投篮次数更多的球员将获得更高的薪水,这就是为什么常规子类别比高级模型产生的模型更好,而高级模型是我认为将产生最佳模型的子类别。
- 那些对球员的估价高于市场价值的球队实际上取得了更多的团队成功。这最有可能导致这些球队中明星球员的出现,而该模型倾向于认为这些球员被高估了。
使用地理空间数据的最近邻分析
关于如何在 Python 中查找空间数据的最近邻的指南
Photo by Franck V. on Unsplash
查找一个对象与另一个对象的最近邻是一项常见的空间数据分析任务。例如,确定离家最近的服务点是一个优化问题,需要使用空间数据执行最近邻分析。
在本教程中,我们使用芝加哥市的自行车共享数据集执行最近邻分析。数据集由两个独立的文件组成。第一个是自行车站点,第二个是随机生成的点。我们想要确定哪个站靠近第二个数据集中的任意给定点——随机生成的点。随机生成的数据集可以表示真实情况,其中骑车人想要确定哪个自行车站离停放自行车最近。
探索数据
我们使用 pandas 读取数据,并调用第一个数据帧stations
,其中包含站点名称、容量和坐标等属性。
stations = pd.read_csv(“data/stations.csv”)
stations.head()
Bike stations
第二个表保存随机生成的点。我们称之为数据帧points
。我们在这个表中只有三列,id 和 X 和 y 的坐标。
points = pd.read_csv(“data/points.csv”)
points.head()
Random points
要执行任何地理处理任务,包括本教程中的最近邻分析,我们需要使用 Geopandas 将数据转换为地理数据框架。这将允许我们计算 Geopandas 中可用的任何地理处理任务以及我们想要使用的任何 pandas 方法。
以下函数将两个数据集转换为 Geopandas 地理数据框架。这将创建一个存储几何图形的附加列。我们还为数据集构建了一个坐标参考系统,在本例中,EPSG:4326。
def create_gdf(df, x=”xcoord”, y=”ycoord”):
return gpd.GeoDataFrame(df,
geometry=gpd.points_from_xy(df[y], df[x]),
crs={“init”:”EPSG:4326"})stations_gdf = create_gdf(stations)
points_gdf = create_gdf(points)
现在,让我们使用 follow Python 库可视化地图中的数据。
m = folium.Map([41.805379, -87.601501], tiles=”CartoDb dark_matter”)locs_stations = zip(stations_gdf.ycoord, stations_gdf.xcoord)locs_points = zip(points_gdf.ycoord, points_gdf.xcoord)for location in locs_stations:
folium.CircleMarker(location=location,
color=”red”, radius=4).add_to(m)for location in locs_points:
folium.CircleMarker(location=location,
color=”white”, radius=2).add_to(m)m
下图显示了红色的station_gdf
和白色的points_gdf
。目标是为随机生成的点找出最近的站。
Map — Bike stations in Red & random points in white
在下一节中,我们将使用 Geopandas 和 Shapely 功能执行最近邻分析。
表演最近邻
我们想找到离其他随机点最近的自行车站。我们可以使用 Shapely function nearest_points
功能找出最接近每个位置的几何图形,并在此过程中保存其他属性,例如,车站的名称。这里,我们使用caclulate_nearest
函数,该函数接受目的地(station_gdf
)和我们希望从该数据集存储的值(车站名称)。
def calculate_nearest(row, destination, val, col=”geometry”): # 1 - create unary union
dest_unary = destination[“geometry”].unary_union # 2 - find closest point
nearest_geom = nearest_points(row[col], dest_unary) # 3 - Find the corresponding geom
match_geom = destination.loc[destination.geometry
== nearest_geom[1]] # 4 - get the corresponding value
match_value = match_geom[val].to_numpy()[0] return match_value
我们将该函数应用于第二个数据集points_gdf
以导出每个随机点的最近几何图形(从station_gdf
中)以及最近几何图形的站名。
# Get the nearest geometry
points_gdf[“nearest_geom”] = points_gdf.apply(calculate_nearest, destination=stations_gdf, val=”geometry”, axis=1)# Get the nearest Bike station name
points_gdf[“nearest_station”] = points_gdf.apply(calculate_nearest, destination=stations_gdf, val=”name”, axis=1)points_gdf.head()
输出是下表,其中有我们在上面创建的两个附加列。
现在,points_gdf
里既有nearest_station
又有nearest_geom
。例如,在id
2 中,我们可以看到最近的车站是林肯大道&百丽平面大道站。我们需要验证我们的结果,让我们从geometry
和nearest_geom
创建一个线地理数据框架,这有助于我们直观地探索数据。
# Create LineString Geometry
points_gdf[‘line’] = points_gdf.apply(lambda row: LineString([row[‘geometry’], row[‘nearest_geom’]]), axis=1)# Create Line Geodataframe
line_gdf = points_gdf[["id", "nearest_station", "line"]].set_geometry('line')# Set the Coordinate reference
line_gdf.crs = crs={"init":"epsg:4326"}
我们有目的点station_gdf
,最近点points_gdf
,现在还有连接两个数据集的line_gdf
。让我们在一个情节中想象它们。
m = folium.Map([41.805379, -87.601501],zoom_start = 12,
tiles=”CartoDb dark_matter”)locs_stations = zip(stations_gdf.ycoord, stations_gdf.xcoord)locs_points = zip(points_gdf.ycoord, points_gdf.xcoord)for location in locs_stations:
folium.CircleMarker(location=location,
color=”red”, radius=8).add_to(m)for location in locs_points:
folium.CircleMarker(location=location,
color=”white”, radius=4).add_to(m)folium.GeoJson(line_gdf).add_to(m)m.save(“map2.html”)m
借助下图所示的地图,您可以轻松浏览数据集并查看每个点的最近站点之间的连接。
Nearest neighbour Visualization
地图用红色圆圈显示自行车站点,用白色显示随机点,用蓝色显示连接线。您可以在附带的笔记本中进一步探索交互式地图。最终结果是准确的,并且可以在您选择的任何其他数据集中复制。
结论
在本教程中,我们讲述了如何使用 Geopandas 执行最近邻分析,以及如何使用芝加哥自行车站执行 Shapely 分析。我们还探索了如何使用 leav 轻松构建和可视化分析结果。
本教程的代码可以在 Github 资源库中找到:
查找一个对象与另一个对象的最近邻是一项常见的空间数据分析任务。例如,确定…
github.com](https://github.com/shakasom/NearestNeighbour-Analysis)
Google Colab 笔记本可以从这里直接访问:
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
github.com](https://github.com/shakasom/NearestNeighbour-Analysis/blob/master/NNA.ipynb)
NEAT:神经进化的一种令人敬畏的方法
神经进化可以优化和进化神经网络结构,NEAT 算法是第一个显示它是一种可行方法的算法之一!
神经进化的世界
最近,我读了很多关于神经进化的书。从高层次来看,这个想法非常简单。与其让神经网络依赖于固定的结构,为什么不允许它通过遗传算法来进化呢?对我来说,这很有意义。通常,在使用神经网络时,人们会选择一种可能基于经验证据工作的结构。但它是可以使用的最佳结构吗?没办法确定。
在我的阅读中,我看到了一篇名为通过增强拓扑进化神经网络的论文,该论文讨论了增强拓扑的神经进化算法,更普遍的说法是 NEAT。虽然这篇论文发表于 2002 年,并且仅仅关注于逐节点和逐连接地进化密集神经网络,但是这篇论文是我深入研究神经进化的一个关键起点,也是我打算在本文中讨论的一篇论文!
现在,您可能想知道,如果该算法只进化密集的神经网络,并且必须专门进化节点之间的连接,那么它如何仍然有用。这也是我早期思考的问题。但事实是,我们通过梯度下降和反向传播在训练神经网络方面取得的进展不必为了神经进化过程而放弃。其实两者是可以互补的。最近的论文甚至强调了使用 NEAT 和 NEAT-like 算法来进化神经网络结构,然后使用反向传播和梯度下降来优化这些网络的方法,我认为这是一个越来越相关和重要的领域。
但是现在,不多说了,扩充拓扑的神经进化:
拓扑的神经进化问题
在 NEAT 之前,有一些在进化网络拓扑方面的尝试取得了一定的成功,但是,他们发现了一系列问题,在该技术实际上可以做任何令人难以置信的有用的事情之前,需要克服这些问题。使 NEAT 及其论文如此有趣的是它对这些问题提出的一些解决方案,这些解决方案今天仍然使这篇论文有意义!
编码
在生物学中,我们有基因型和表现型。基因型是生物的遗传表现,表型是生物的实际物理表现。进化算法总是在很大程度上反映生物学,神经进化在这方面也不例外。
编码的问题来自于我们希望如何在我们的算法中代表个体的基因。我们对个体进行编码的方式为我们的算法如何处理关键的进化过程铺平了道路:选择、突变和交叉(也称为重组)。任何编码都可以分为两类,直接编码和间接编码。
直接编码将明确指定关于个人的一切。如果它代表一个神经网络,这意味着每个基因将直接链接到网络的某个节点、连接或属性。这可以是 1 和 0 的二进制编码,图形编码(通过加权连接来链接各个节点),或者更复杂的编码。关键是基因型和表现型之间总会有非常明显和可读的直接联系。
间接编码正好相反。间接编码倾向于指定用于创建个体的过程的规则或参数,而不是直接指定结构可能看起来像什么。因此,间接编码要紧凑得多。另一方面,为间接编码设置规则可能会导致搜索空间中的严重偏差,因此,在没有关于如何使用编码的大量知识的情况下,很难创建间接编码。
因此,NEAT 算法选择了直接编码方法。它们的表示比简单的图形或二进制编码稍微复杂一点,但是仍然很容易理解。它只有两个基因列表,一系列节点和一系列连接。为了直观地看这是什么样子,我这里有一张来自原始论文的图片:
输入和输出节点在节点基因列表中没有进化。可以添加或删除隐藏节点。至于连接节点,它们指定了连接进出的位置、此类连接的权重、连接是否启用以及创新数(我们将在下一节讨论)。
变化
简而言之,突变既可以改变现有的连接,也可以给网络增加新的结构。如果在起始节点和结束节点之间添加了新的连接,它会被随机分配一个权重。
如果添加了一个新节点,它将被放置在两个已经连接的节点之间。先前的连接被禁用(尽管仍然存在于基因组中)。先前的开始节点以旧连接的权重链接到新节点,而新节点以权重 1 链接到先前的结束节点。这被发现有助于减轻新结构添加的问题。
竞争公约
进化神经网络拓扑的另一个大问题是被 NEAT 论文称为“竞争约定”的东西。这个想法是,仅仅盲目地跨越两个神经网络的基因组可能会导致网络发生可怕的变异和失去功能。如果两个网络都依赖于网络外的中心节点,我们就有问题了。
不仅如此,基因组可以有不同的大小。我们如何比对看起来不明显兼容的基因组?在生物学中,这是通过一个叫做同源的概念来解决的。同源性是基于特定特征的匹配基因的染色体排列。一旦发生这种情况,与染色体盲目混合在一起相比,交叉发生的错误几率会小得多。
NEAT 通过使用历史标记来解决这个问题(如上所示)。通过用一个历史数字标记新的进化,当需要交叉两个个体时,可以用更少的机会创建没有功能的个体。每个基因都可以被排列和(潜在的)交换。每当一个新的节点或新类型的连接出现时,一个历史标记就被分配了,当繁殖我们的两个个体时,允许容易的排列。点击此处查看:
物种形成
NEAT 提出的一个非常有趣的观点是,大多数新的进化都不是好的进化。事实上,在任何权重优化发生之前添加新的连接或节点通常会导致表现较差的个体。这使得新的结构处于不利地位。我们如何保护新的结构,并让它们在我们完全从人群中消除之前优化?纯净意味着物种形成。
物种形成只是根据拓扑和连接的相似性将种群分成几个物种。如果竞争约定问题仍然存在,这将很难衡量!然而,由于 NEAT 在其编码中使用了历史标记,这就变得更容易衡量了。论文中给出了一个决定如何进行物种分化的函数,但需要注意的重要部分是,种群中的个体只需与该物种中的其他个体竞争。这允许新的结构被创造和优化,而不用担心它会在被真正探索之前被淘汰。
不仅如此,NEAT 还通过一种叫做显性健身分享的方式向前迈进了一步。这意味着个体分享他们在物种间的表现,促进更高性能的物种,尽管仍然允许其他物种在进化之前探索他们的结构优化。
最小结构
NEAT 论文的一个大目标是为进化网络创建一个框架,允许最小的网络进化。作者不想创造一种算法,先找到好的网络,然后在事后减少节点和连接的数量。相反,我们的想法是建立一个算法,从最少的节点和连接开始,随着时间的推移,当且仅当它被认为是有用和必要的时候,才逐渐变得复杂。
NEAT 通过启动所有没有隐藏节点的网络,建立了他们的算法来进化最小网络。初始种群中的每个个体都只是输入节点、输出节点,以及它们之间的一系列连接基因。这本身可能不一定行得通,但当与物种形成的想法结合起来时,这被证明是进化最小但高性能网络的一个强有力的想法。
那么效果如何呢?
早在 2002 年,当这个算法被提出时,它是一个新颖的想法。他们需要证明它甚至可以做基本的事情。为了证明其有效性,作者首先测试的事情之一是它是否能进化出 XOR 函数。显然是这样的,否则我们很可能根本不会讨论这个算法。
他们演示的另一项任务是极点平衡控制任务。如果你不熟悉,这是一个任务,其中有一个模拟环境,允许控制算法移动一辆车。与手推车相连的是一根杆子。控制算法的目标是尽可能长时间地平衡这个极点。这项任务有几种变化,也进行了评估,如双极平衡任务(现在有两个极点!)和双极平衡任务,其中没有给控制算法任何关于极点的速度信息。NEAT 非常成功地完成了这项任务的所有变化!
包扎
现在你已经熟悉了进化神经网络的简洁算法!希望在读完这篇文章后,你会认为这是一个很酷的神经进化方法,并明白为什么它是神经进化中的一个突破。
但这仅仅是开始。我鼓励你通读这篇论文,如果你想了解更多关于算法的细节(包括它们如何具体地进行物种形成过程),或者更好的是,查看你最喜欢的编程语言的代码库!
除了 NEAT 之外,还有更多变体,例如 HyperNEAT 、 ES-HyperNEAT 和 CoDeepNEAT 等等,我希望在不久的将来能够谈到这些变体!所有这些都是对 NEAT 的很好的补充,我鼓励你也去探索一下。
和往常一样,如果你有问题或者我错过了什么,请告诉我!我仍然非常了解这方面的内容,并且很乐意谈论更多(你可以通过 Twitter 联系到我)!
人工智能和机器人学对可解释性的需求
(Source = https://www.datanami.com/2018/05/30/opening-up-black-boxes-with-explainable-ai/)
介绍
人工智能(AI)在过去几年中取得的突破使计算机有可能执行使用传统软件编程不可能完成的任务。这些进步现在为我们打开了一个人工智能潜在应用的全新世界,如机器人、金融和医学。现代人工智能应用的例子有:手写识别、语音识别、人脸识别、计算机视觉等
人工智能在决策应用(如就业)中的使用最近引起了个人和当局的一些关注。这是因为,当使用深度神经网络时,当前不可能(至少在完全程度上)理解算法在必须执行预定任务时执行的决策过程。由于决策过程缺乏透明度,公众可能会对模型本身的可信度产生困惑。因此,为了防止在人工智能模型中出现任何形式的偏见,对可解释人工智能的需求正在成为下一个预定的进化步骤。
人工智能和机器人
传统编程和人工智能之间的一个主要区别是,非人工智能程序是违背一组指令编写的。相反,人工智能模型无需显式编程即可学习。因此,这可以使我们执行用传统编程看起来不可能的任务。机器学习是最常用的人工智能工具之一。目前如何使用 ML 的一些例子可以是:
- 通勤时的预测
- 视频监控
- 垃圾邮件和恶意软件过滤
- 搜索引擎结果提炼
- 产品推荐
- 在线欺诈检测
机器学习还可以潜在地用于增强工业机器人系统的能力。因为最近的发展,特别是在强化学习和深度学习方面,清楚地表明在这个领域有巨大的潜力。
有两种主要类型的机器人。传统机器人是一种能够执行重复性高度专业化任务的机器(例如工业机器人)。相反,智能机器人能够从周围环境中提取信息,以便做出有意义的决定(例如基于行为的机器人)。
机器学习可以应用于机器人学的四个主要领域[1]:
- 视觉=物体的检测和识别
- 抓取=确定抓取物体的最佳方向和位置
- 运动控制=避障和互动
- 数据=找到模式以决定采取最佳行动
机器学习如何提高机器人系统性能的两个例子是多机器人系统和集群。这是因为这两类机器人的主要目的是通过集体行为来执行复杂的任务。使用传统编程对集体行为进行编程可能会成为一项极具挑战性的任务,而使用机器学习(例如强化学习)可以使它变得更容易,并可能导致我们无法想到的更具创新性的解决方案。多机器人系统和集群之间的主要区别在于,前者具有环境的全局知识,并且可以具有集中式架构,而后者不具有环境的全局知识,并且使用分散式架构。
机器学习的一个子领域是深度学习(DL),它在机器人系统中有非常重要的应用。例如,使用多层人工网络的 DL 算法已经设法在诸如图像识别的任务中表现得令人难以置信地好,这些任务在机器人系统视觉中具有非常重要的应用。DL 算法的一个问题是,目前,我们不能完全跟踪算法在必须做出决策时做出的决策过程(因此需要可解释的人工智能)。
Figure 1 — Relationship between AI-ML-DL (Image Reproduced from [2])
伦理学
可解释人工智能(XAI)的主要目标是让机器解释自己,并减少有偏见的算法的影响(图 2)。道德在人工智能中越来越重要的一个例子可以在谷歌承诺在实施人工智能算法时遵循的道德原则清单中看到[3]。谷歌决定发布这些原则,以澄清在哪些领域实现人工智能会变得危险,并确认其对生产人工智能自我解释算法的兴趣。
Figure 2 — Explainable AI Revolution (Image Reproduced from [4])
在过去的几年里,首批 XAI 车型已经开始研发。一些最成功的是:反向时间注意模型(RETAIN),局部可解释模型不可知的解释(LIME)和分层相关性传播(LRP) [5]。这些列出的用于产生可解释模型的方法现在仍然不能产生详尽的结果,因此该领域的研究仍然需要进一步发展。
联系人
如果你想了解我最新的文章和项目,请通过媒体关注我,并订阅我的邮件列表。以下是我的一些联系人详细信息:
文献学
[1]将人工智能和机器学习应用于机器人,机器人行业应用。(访问:https://www . Robotics . org/blog-article . cfm/Applying-Artificial-Intelligence-and-Machine-Learning-in-Robotics/103)2019 年 1 月
[2]深度学习系列 1:深度学习入门— Dhanoop Karunakaran —中级。(访问:https://medium . com/intro-to-artificial-intelligence/deep-learning-series-1-intro-to-deep-learning-abb 1780 ee20)2019 年 1 月
[3]谷歌的人工智能——我们的原则——谷歌人工智能。(访问:https://ai.google/principles/)2019 年 1 月
[4]可解释的人工智能(XAI)——David Gunning 先生——DARPA。(访问:https://www . DARPA . mil/program/explaible-artificial-intelligence)2019 年 1 月
[5]对可解释人工智能的介绍,以及我们为什么需要它——帕特里克·费里斯——中等。(访问:https://medium . freecodecamp . org/an-introduction-to-explable-ai-and-why-we-need-it-a 326417 DD 000)2019 年 1 月