XLM——增强跨语言语言模型的 BERT
跨语言语言模型预训练
注意模型,尤其是 BERT,在自然语言处理中,无论是在分类还是翻译任务中,都取得了令人鼓舞的结果。脸书·艾的一篇名为《XLM》的新论文提出了一个改进版本的 BERT,以在两种类型的任务中实现最先进的结果。
XLM 使用一种已知的预处理技术(BPE)和一种具有 BERT 的双语训练机制,以便学习不同语言中单词之间的关系。在跨语言分类任务(15 种语言的句子蕴涵)中,该模型优于其他模型,并且当预训练模型用于翻译模型的初始化时,显著提高了机器翻译。
背景
XLM 基于几个关键概念:
2017 年发明的变形金刚引入了一种注意力机制,可以同时处理整个文本输入,以学习单词(或子单词)之间的上下文关系。转换器包括两个部分——编码器,用于读取文本输入并生成其横向表示(例如,每个单词的向量),以及解码器,用于根据该表示生成翻译后的文本。关于变形金刚的深入评论可以在这里找到。
虽然 vanilla Transformer 只有每个单词的有限上下文,即只有每个单词的前身,但在 2018 年,BERT 模型向前迈进了一步。它使用转换器的编码器来学习语言模型,方法是屏蔽(丢弃)一些单词,然后尝试预测它们,允许它使用整个上下文,即被屏蔽单词左右的单词。
由于注意力模块中所有标记的并发处理,该模型需要关于每个标记的位置的更多信息。通过基于其位置(例如正弦函数)向每个记号添加固定值(称为位置编码的步骤),网络可以成功地学习记号之间的关系。我们对 BERT 的总结可以在这里找到。
2018 年, Lample et al. 提出了结合 Transformers 和基于统计短语模型(PBSMT)的翻译模型。后者是不同语言中成对短语的概率表。本文中的一个重要概念是回译,即把一个句子翻译成目标语言,然后再回到源语言。这个概念使得能够以监督的方式使用单语数据集,单语数据集比双语数据集更大、更常见。Lample 等人的结论之一是,标记嵌入的初始化对于模型的成功非常重要,尤其是在使用回译时。虽然作者使用 FastText 使用了“简单”的单词嵌入,但他们认为“更强大的语言模型可能会进一步改善我们的结果”。
XLM 是如何运作的
该论文提出了两个创新的想法——一种新的用于多语言分类任务的 BERT 训练技术和使用 BERT 作为机器翻译模型的初始化。
用于分类的跨语言 BERT
Tough BERT 接受过 100 多种语言的训练,它并没有针对多语言模型进行优化——大多数词汇没有在语言之间共享,因此共享的知识是有限的。为了克服这一点,XLM 对伯特做了如下修改:
首先,它不使用单词或字符作为模型的输入,而是使用字节对编码(BPE ),将输入拆分为所有语言中最常见的子单词,从而增加语言之间的共享词汇。这是一种常见的预处理算法,在这里可以找到它的摘要。
其次,它以两种方式升级了 BERT 架构:
- 每个训练样本都由两种语言的相同文本组成,而在 BERT 中,每个样本都是从一种语言构建的。与在 BERT 中一样,该模型的目标是预测屏蔽的标记,但是,在新的架构中,该模型可以使用一种语言的上下文来预测另一种语言的标记,因为不同的单词是每种语言中的屏蔽单词(它们是随机选择的)。
- 该模型还分别接收语言 ID 和每种语言中的标记顺序,即位置编码。新的元数据帮助模型学习不同语言中相关标记之间的关系。
升级后的 BERT 被称为翻译语言建模(TLM),而具有 BPE 输入的“普通”BERT 被称为屏蔽语言建模(MLM)。
完整的模型是通过训练 MLM 和 TLM 并在他们之间交替来训练的。
Comparison of a single language modeling (MLM) similar to BERT, and the proposed dual-language modeling (TLM). Source: XLM
为了评估该模型的贡献,本文使用包含 15 种语言句子的 XNLI 数据集,给出了该模型在句子蕴含任务(句子间关系分类)上的结果。在所有配置中,该模型明显优于其他著名模型,如 Artetxe et al. 和 BERT——仅在英语上训练,在所有配置上测试(Zero-Shot),在翻译成英语的数据上训练(Translate-Train),在英语上训练,在翻译的数据上测试(Translate-Test)。这些结果被认为是最先进的。
Comparison of XNLI results (accuracy) of prominent models in different training and testing configurations. Each column represents a language. Source: XLM
用 MLM 初始化翻译模型
本文介绍了 BERT 的另一个贡献,更准确地说是 MLM 模型的贡献——作为一种更好的初始化技术用于 Lample et al. 翻译模型。不是使用快速文本嵌入,而是从预训练的 MLM 中获取标记的初始嵌入,并馈送到翻译模型中。
通过使用这些嵌入来初始化翻译模型(使用 Transformer)的编码器和解码器的令牌,翻译质量提高了 7 BLEU,如下表所示。
Translation results with different initialization techniques. CLM stands for Causal Language Modeling in which a given word is trained based only on the previous words and not using the masking technique. Source: XLM
注意:该论文还表明,训练跨语言语言模型对低资源语言非常有益,因为它们可以利用来自其他语言的数据,特别是主要由于 BPE 预处理而类似的语言。这个结论和 Artetxe 等人的结论类似(我们的总结可以在这里找到)。
计算注意事项
模型是在 PyTorch 中实现的,可以在这里找到,包括预训练的模型。训练是用 64 个 Volta GPUs 完成语言建模任务,8 个 GPU 完成翻译任务,尽管持续时间没有规定。在论文的第 5.1 节和第 5.2 节中可以找到确切的实施细节。
结论
正如最近的许多研究一样,这篇论文展示了语言模型和迁移学习,特别是 BERT,在许多 NLP 任务中提高性能的能力。通过使用简单而智能的 BERT 调整,它可以胜过其他跨语言分类模型,并显著改善翻译模型。
有趣的是,本文中使用的翻译模型和用于初始化的 MLM 模型都是基于 Transformer 的。可以肯定的是,我们会看到更多这种组合,比如使用新的 Transformer-XL 进行初始化。
要了解最新的深度学习研究,请订阅我在 LyrnAI 上的简讯
XLNet——一个聪明的语言建模解决方案
创建捕捉深层双向上下文的单词表示
Language modeling with a deep model — the challenge and a solution
TL;速度三角形定位法(dead reckoning)
通过在大型语料库中预测每个单词在其句子上下文中的概率分布,对语言中单词序列的概率分布进行无监督学习,已经被证明对于创建模型和单词表示是有用的,然后可以针对下游 NLP 任务对这些模型和单词表示进行微调。在为下游语法和语义任务微调模型时,两个因素似乎对提高性能起着关键作用:
- 一个词的表征是否捕捉到了该词在句子中的全部语境? 全语境是句子中一个单词前后的整个单词序列*(双向语境)*
- 模型是否是多层的,以输出一个单词的多个表示,每层一个?已经发现,来自模型的不同层的单词的表示对于下游的句法和语义任务是有用的
满足这两个设计因素提出了一个挑战*(下面详细描述)*,XLNet 通过一个巧妙的解决方案解决了这个问题。这使得 XLNet 在某种程度上比先前的现有技术模型 BERT 执行得更好,该模型满足上述两个要求,但有一些不足。然而,与 BERT 相比,XLNet 需要更多的计算能力和内存 (GPU/TPU 内存)。减少计算/内存需求等方面的改进是否会使 XLNet 在实际意义上足够好,以取代 BERT 在所有 NLP 任务中的优势,仍有待观察。)。
创建深度双向上下文表示的挑战
语言建模,本质上是通过在大型语料库中预测单词在句子上下文中的概率分布来学习语言中单词序列的概率分布,可以通过多种方式完成,如下图所示
- 通过从左到右或从右到左扫描句子,使用前面的所有单词预测下一个单词。
- 使用句子中单词周围的所有单词预测单词。
在上面的任何一种情况下,都要考虑句子中单词的顺序*(或位置)**(忽略位置会将其退化为单词袋模型,如 word2vec、Glove 等。)*
在下游任务中,利用单词周围的所有单词来预测单词的模型往往比单侧上下文预测模型做得更好,正如人们直观地预期的那样——双向上下文比仅来自一侧的上下文拥有更多的信息。
预测单词在句子中的位置,如下图所示,比如单词“times”涉及*(不考虑语言模型类型),为其计算一个向量作为其邻居的函数,但不包括其本身(如果我们包括单词本身,预测就变得微不足道)。学习过程本质上是“拖动”那些相邻的向量,使得计算的向量(预测)在那个位置更接近实际的单词向量。代表“时间”的单词 vector 反过来又涉及到对它的邻居的预测,例如“阿拉斯加”。因此,在一般意义上,训练过程部分地基于它们的位置,以不同的数量拖动一起出现的单词,并且该过程(神奇地)倾向于将语义上接近的单词一起带到高维空间(该过程与 word2vec 之类的* 单词袋模型中发生的事情惊人地接近,尽管在这种模型中不考虑位置 )。此外,该模型在训练期间学习参数,使其能够为句子中的单词创建上下文敏感的嵌入,包括在训练期间从未见过的单词(在像 BERT 和 XLNet 这样的模型中)。
Language modeling choices — one-sided context vs full context of both sides to predict a word
然而,如果我们向模型添加多个层来创建单词的深层表示,那么训练一个使用来自两侧的上下文的模型会带来挑战。这在下面基于注意力的模型的图示中是显而易见的——使用单词两侧的上下文来预测单词将间接使得能够从第二层起看到单词本身。
例如,在基于注意力的模型的第 1 层中,“时间”的向量的组成是其所有邻居的加权和,不包括其自身。即第一层的输出计算为“时间”(黄色显示)不包括“时间”。然而,在第 2 层中,来自第 1 层的隐藏状态的加权和间接包括“时间”的向量,通过与“黄色”向量相邻的所有隐藏状态向量(为了避免混乱,只有一个间接路径显示为红色)
The problem of using bidirectional context in a multilayered setting — Prediction of vector for word “times” can see the vector for “times” indirectly from layer 2 onwards — the red arrow path is one example of the “times” vector indirectly seeing itself
我们可以通过在层 1 中为“时间”选择隐藏状态周围的隐藏状态的子集,来避免字预测在多层模型中间接看到自身的问题,使得它们不依赖于“时间”的字向量。这种手工制作的实例如下所示
A hand crafted dependency path where a token’s prediction (“times”) does not see itself in a multilayered model
然而,为了在单词“times”的预测中捕获整个双向上下文,我们需要双向上下文的更多子集来训练模型,其中单词看不到它自己。
XLNet 通过巧妙地选择像上面手工制作的这样的子集上下文来解决这个问题,这样一个单词在被预测时就不会“看到自己”。在上面的例子中,我们有 9 个单词*(现在假设这些单词没有被进一步分成子词,也就是说它们在词汇表中是存在的)*。我们有 9 个!排列——362,880。如果我们从这个排列中取样,选择一个排列,比如 612934578,然后应用下面的规则
- 从序列 612934578 中一次选取一个数字,并通过仅使用序列中在该数字之前的所有字向量来计算该位置的第 1 层向量(即,字 6 和 1 用于计算 2,字 6、1、2 和 9 用于计算 3 等等)。)
- 为了说明挑选标记 5(“时间”)作为要预测的标记,使用在上面排列顺序中在它之前的所有标记,即单词 6、1、2、9、3 和 4,来计算“时间”的向量。
- 现在应用与上面相同的程序来计算第二层向量。例如,对应于 612934 处的令牌的层 1 中的那些向量输出以及“时间”的层 1 中的隐藏状态,来计算“时间”的层 2 向量。
- 通过使用不允许在置换序列*(注意,该置换序列可以包括句子中预测单词两侧的单词)*中位于它之前的单词看到它的规则,并且只有在置换序列中位于它之前的那些单词才被单词在其预测中使用,该模型确保预测的单词永远不会被间接看到,而不管模型中的层数如何。
要注意的一个关键点是,置换序列仅用于决定向量计算中涉及哪些记号。句子中单词的顺序是不变的——每个单词的位置都是由一个相对位置编码方案固定的*(我们稍后将回到这一点)*。
总之,通过使用单词的双向上下文的子集来预测单词在句子中的位置,并考虑到使用上面的排列扫描规则单词本身是看不见的,我们可以避免单词在多层上下文中看见自己。然而,这种方案要求我们采样足够多的排列,以便我们充分利用双向上下文。这在计算上仍然很昂贵,所以只对句子中单词的子集进行预测*(这是模型中的超参数K)*——在论文中,句子中大约 1/6 (~16%)的单词被预测。有趣的是,这与 BERT 中预测的句子中的单词数量大致相同。
然而,BERT 通过屏蔽/破坏那些预测的单词来避开这个问题。在每一层对句子中所有单词的计算预测是 BERT 中几个常数的矩阵乘法。相比之下,XLNet 必须对它采样的每个置换和置换序列中的每个位置进行乘法运算。
BERT corrupts/replaces ~15% of tokens with another token [mask]. In the illustration “time” is replaced by “[mask]”. The prediction of “time” cannot see it either directly or indirectly since it has been replaced. The hidden states adjacent to the yellow shaded vector in layer 1 see all the word vectors including the masked one in the input — it is not explicitly shown to avoid clutter
然而,BERT 的屏蔽方法有几个缺点,这是 XLNet 中没有的。
- 如果“New”和“York”在上面的句子中被屏蔽,那么“New”的预测将独立于“York ”,反之亦然。虽然这看起来像是一个人为的例子,但 XLNet 并没有做出这样的假设,这可能是它在某些任务中表现优于 BERT 的部分原因。这也许是 XLNet 在答案是短语的问答任务中表现更好的原因之一。
- 另一个是“屏蔽”标记是人为引入输入的标记,它只在训练期间出现,而不是微调。所以这里有一个差异。
基于置换的依赖规则来捕获双向上下文可能是 XLNet 的独特之处。它还利用先前的 work Transformer XL 来处理长句,通过跨固定段转移状态*(做了微小的修改以确保位置信息是相对的而不是绝对的)*。XLNet 缓存段中的图层状态,以便在后续段中重用。这使得 XLNet 能够处理任意长的句子。相比之下,BERT 只能处理固定长度的数据段。尽管人们可以在 BERT 中选择任意长的固定长度段,但由于 GPU/TPU 内存要求,这变得不切实际。
最后,这是基于置换的依赖性规则的实现细节-为了使用在置换序列中位于单词之前的项来预测单词,需要将被预测的目标位置的位置信息纳入预测中,以使用相同的邻居集合来消除两个位置处的预测的歧义。此外,虽然用于预测位置的隐藏状态向量不能包括该位置处的单词向量,但是我们还需要一个在预测其他向量时包括该位置的隐藏状态向量。这需要模型为每个位置学习两个向量,h 和 g,如下所示。 h 是下面层中的字向量和其他隐藏状态向量的函数。 g 是隐藏状态向量和预测单词的位置信息的函数。
The figure above from XLNet paper shows the computation of the hidden states for a word that looks at itself in addition to a subset of its neighbors. Note these vectors are not predicted. They are used in the computation of the hidden vectors g, taking into account not to include hidden state vectors that see that see the word being predicted. This is accomplished using the permutation sequence rule described earlier
The figure above from XLNet paper shows computation of the hidden vectors “g” that are predicted. Note g1 in layer 1 is only dependent on its position info (w) and not its vector x1. Also g1 in layer 2 is dependent on hidden states h2 h3 and h4, all of which did not see x1 because of the permutation order 3,2,4,1. 1 cannot be seen by 3,2,4 because they precede it in the sequence 3,2,4,1
试用模型
考虑到在评估任务上微调模型所需的计算和内存资源*(具有足够板载内存的 GPU/TPUs),这可能对我们许多人来说有点挑战,这与 BERT (我们可以在单个 GPU 机器上对 BERT 进行微调,以完成 NER 任务,平均大约需要一两个小时)。有一个笔记本来测试分类任务上的模型(我只能在批量为 2 的情况下运行它,并获得 90%的准确率——他们报告在批量为 8 的情况下准确率为 92%)。最近有一个 pytorch 版本,这将有助于理解这个模型是如何工作的。*
奇怪的是,像 NER *(BERT 是 NER 目前的最新技术)*这样的序列标记任务没有基准测试结果——也许我们很快就会看到一些标记任务的结果。
下面的部分可以跳过。
为什么单词不能在预测中看到自己?
仅使用左侧上下文预测下一个单词的语言模型的最大似然估计(例如,给定单词“Alaska 大约是 12”,预测“times”)。
Equation from XLNet paper. This essentially says find those parameters theta, that maximizes the probability of the word “times” given “Alaska is about 12”.
需要注意的关键点是,h 的计算是“times”之前所有单词的函数,而不是它本身。如果我们在 h 的计算中也包括“时间”,模型可以轻松地学习,给定 e(xt)是“时间”的嵌入。
BERT 的屏蔽目标不包括单词本身,而仅包括替换的屏蔽标记。然后,给定损坏的句子“阿拉斯加比纽约大大约 12[mask]”(假设只有一个令牌被屏蔽),它预测实际的单词“times”
Equation from XLNet paper. The BERT objective. mt is 1 only for masked tokens in a sentence which is about 15% of words. Note H includes all words but the predicted word is replaced by the mask token. e(xt) is the embedding for the word “times”. The goal is to choose theta so that H(x^) is close to the embedding for “times” given all the words in the corrupted sentence.
本质上,BERT 通过用屏蔽的标记替换预测的单词并在训练过程中重建它们,绕过了看见本身的问题。然而,H 的计算包括仅在预训练期间出现的掩码标记。
XLNet 每次预测单词时都使用双向上下文的子集,但通过确保“g”的计算只包括看不到被预测单词的标记来避免“看到自己”的问题 (g 是它周围的标记子集和预测单词位置的函数)。同样,很容易看到,如果 g 是被预测单词的函数,学习问题变得微不足道,给定 e(x)包括要预测的标记的嵌入。
Equation from XLNet paper. XLNet prediction of token at a position.
上式中的 g 计算如下
Equation from XLNet paper. The highlighted state vector must be a strict inequality in the subscript — must be a typo (unless I am missing something very basic). Updated 11 July 2019. One of the paper authors confirmed this was a typo and said it will be fixed in a revision (thank you Zhilin for responding to my mail)
参考
- XLNet:面向语言理解的广义自回归预训练,杨等,2019 年 6 月
- Transformer-XL:超越定长语境的专注语言模型,戴子航等,2019 年 1 月
- BERT:用于语言理解的深度双向转换器的预训练,Devlin 等人,2018 年 10 月
- 基于 BERT 模型的回顾
- 解构伯特
手动从 Quorahttps://qr.ae/TWtVmo(自动导入因故失败)
XLNET 深入浅出的解释!!
在这篇文章中,我很高兴带你了解谷歌大脑和 CMU 最近发表的自然语言理解算法——XLNET。该算法是 NLP 中的一个突破,因为它在 20 个不同的任务中超过了最先进的 BERT 算法。来吧,让我们探索这种新算法能为世界带来什么!!
这篇文章的结构如下-
- 通过伯特简介,
- 理解伯特的缺点
- 了解变压器架构
- 深入 XLNET
伯特建筑
BERT 代表“来自变压器的双向编码器表示”。它是一种神经网络架构,可以使用转换器对文本数据中的双向上下文进行建模。
什么是双向的?
- 传统方法在给定前“n”个记号的情况下预测当前记号,或者在给定当前记号之后的所有记号的情况下预测当前记号。
- 在预测当前标记时,没有一种方法一次获取前一个和下一个标记。
- BERT 克服了这个缺点,因为它考虑了前一个和下一个标记来预测当前标记。这个属性被称为“双向的”。
双向性是通过一种叫做“屏蔽语言建模”的现象实现的。该模型是预先训练的,可以用于一套令牌和句子级别的任务。
什么是蒙面语言建模(MLM)?
为了实现双向表示,输入句子中 15%的标记被随机屏蔽。变压器被训练来预测屏蔽字。例如,考虑句子——“猫坐在墙上”。伯特的输入将是“面具上的猫”。
BERT 也适用于下一个句子预测任务,因为它是用成对的句子预先训练的,其中句子 B 有 50%的时间跟随 A,而其他时间不跟随。一旦该模型被预先训练,它就被微调用于特定的应用,例如问题回答、句子完成、检查两个句子的语义等价等。
伯特的缺点
BERT 算法有两个主要的局限性。他们是
- BERT 用掩码破坏输入,并且遭受预训练-微调差异。在实际应用中,我们没有被屏蔽的输入。伯特在现实中是如何处理的还不清楚。
- BERT 忽略了屏蔽位置之间的相关性。例如,考虑句子“纽约是一座城市”,输入给 BERT 的是“[MASK] [MASK]是一座城市”。伯特的目标是
log p(New |是城市)+ log p(York |是城市)
从上面的函数可以看出,学习“New”和“York”之间没有依赖关系。因此,BERT 可以得出类似“新旧金山是一座城市”的预测。
变压器架构
XLNET 将最先进的自回归模型 Transformer-XL 的思想整合到预训练中。Transformer 是 google 用于语言翻译的模型。基本都是围绕着“注意力”展开的。这是一个编码器-解码器模型,其中你将一个序列映射到另一个序列——英语到法语。要将英语中的句子翻译成法语,解码器需要查看整个句子以在任意时间点选择性地从中提取信息(因为英语中的标记顺序不需要与法语中的相同)。因此,编码器的所有隐藏状态对于解码器都是可用的。
解码器如何知道在任何一点应该查找哪个隐藏状态?
它通过加权编码器的每个隐藏状态。权重由简单的前馈神经网络确定。在本文的术语中,这些被称为注意力权重,或值。这里有一个链接到注意力权重的精彩解释。本文中使用的一些术语是
- Query (Q) —解码器的隐藏状态。
- Keys (K) —编码器的隐藏状态。
- 值(V) —处理查询时的注意力权重。
两个重要的东西从 Transformer-XL 集成到 XLNET 中。
- 位置编码——跟踪每个标记在序列中的位置(在后面的章节中将会知道为什么我们要这样做)
- 段重现(segment recurrence )-缓存每层内存中第一个段的隐藏状态,并相应地更新注意力。它允许每个段重用内存。
现在,我们好钻研 XLNET:)
XL net——NLU 的广义自回归模型
XLNET 是一个广义的自回归模型,其中下一个令牌依赖于所有先前的令牌。XLNET 是“通用的”,因为它通过一种称为“置换语言建模”的机制来捕获双向上下文。它集成了自回归模型和双向上下文建模的思想,同时克服了 BERT 的缺点。它在 20 个任务上超过了 BERT,通常在问题回答、自然语言推理、情感分析和文档排序等任务上超过 BERT 很多。
置换语言建模(PLM)
PLM 是通过对句子中所有可能的单词排列训练一个自回归模型来捕捉双向上下文的思想。XLNET 不是固定的左右或左右建模,而是在序列的所有可能排列上最大化期望对数似然。在期望中,每个位置学习利用来自所有位置的上下文信息,从而捕获双向上下文。不需要[屏蔽],输入数据也不会被破坏。
上图展示了 PLM。假设我们正在学习 x3(句子中第三个位置的标记)。PLM 训练了一个自回归模型,其中包含句子中标记的各种排列,因此在所有这些排列结束时,我们将学习 x3,给定句子中的所有其他单词。在上图中,我们可以看到下一层仅将置换序列中 x3 之前的标记作为输入。这样也实现了自回归。
【XLNET 和 BERT 的比较
例如,考虑“纽约是一个城市”这一行,我们需要预测“纽约”。让我们假设当前的排列是
伯特将彼此独立地预测记号 4 和 5。而 XLNET 作为一个自回归模型,按照序列的顺序进行预测。即首先预测令牌 4,然后预测令牌 5。
在这种情况下,XLNET 将计算
log P(New | 是座城市 ) + log P(York | New,是座城市)
而伯特会减少到
log P(New | 是城市 ) + log P(York | 是城市)
XLNET 是如何用变压器实现的?
我们看到 transformer 查看整个句子的隐藏表示来进行预测。为了实现 XLNET,转换器被调整为只看要预测的之前的标记的隐藏表示。回想一下,当输入模型时,我们嵌入了每个标记的位置信息。假设如果要预测令牌 3,则后续层
- 无法从输入层访问令牌 3 的内容。
- 能不能只访问它之前的令牌的内容,只访问令牌 3 的位置信息。
当计算关注度时,根据上述原理更新 Q、K 和 V。
使用 XLNET 进行的实验
以下是本文作者测试 XLNET 的数据集。
- RACE 数据集—来自英语考试的 100K 个问题,XLNET 在准确性上超过最佳模型 7.6 个点。
- SQuAD —阅读理解任务— XLNET 比 BERT 高出 7 分。
- 文本分类——在各种数据集上明显优于 BERT(更多详细信息,请参见论文)。
- GLUE 数据集—包含 9 个 NLU 任务—纸上报告的数字,XLNET 优于 BERT。
- ClueWeb09-B 数据集——用于评估文档排序的性能,XLNET 优于 BERT。
结论
我希望你喜欢阅读这篇博客。如果你有任何问题,请在下面发表。
原载于 2019 年 8 月 1 日【https://medium.com】。
XY 宇宙:深度强化学习的 2D 粒子生存环境
我们在这里提供 XY 宇宙:一个 2D 粒子生存环境,通过避免与“坏”粒子碰撞来训练你的深度强化学习代理尽可能长时间地存活。媒介和“坏”粒子被限制在一个 2D 盒中,以固定的恒定速度运动,并与盒壁发生弹性碰撞。提供了深度 Q-网络代理 Python 实现,以便立即使用和演示该环境。代理奖励方案是:每个时间步长+1,每个“坏”粒子碰撞-100。插曲结束条件是:代理与任何“坏”粒子碰撞。这个生存环境的灵感来自卡帕西的水世界环境。
DQN agent surviving in the XY Universe particle environment
DQN 的阶段性奖励和损失:
Fig 1: Epsilon-greedy agent rewards vs episodes
Fig 2: Epsilon-greedy agent loss vs episodes
XY 宇宙生存粒子环境和 DQN 实现可以在这里找到:
https://github.com/ankonzoid/XY_universe
更多我关于机器学习、深度学习、强化学习的博客、教程、项目,请查看我的 中 和我的 Github 。
# yellow vests:Twitter NLP 分析
关于法国最大的社会运动,目前的观点是什么?
Photo by Randy Colas on Unsplash
内容:
- 介绍
- 社会运动的起源、兴衰
- 词类分析:数据科学过程
- 词类分析:结论
- 情感分析
- 奖金部分:热门推文!
介绍
Photo by Norbu Gyachung on Unsplash
如果你不是法国居民,你可能在推特上或通过去年的新闻听说过这一趋势。这场所谓的**“黄背心运动”在 2019 年 11 月 16 日庆祝了一周年,但与这些社会抗议**相关的法国舆论已经不能像一年前那样描述了。
然而,随着即将到来的养老金制度改革,法国铁路工人、空中交通管制员、教师和公共部门工作人员再次走上街头抗议…
穿着这些黄色背心的法国人还觉得有希望吗?他们是通过还是反对这场运动来表达愤怒?他们厌倦了吗?
发现下面的 NLP 分析!(文末奖金!)
起源
这一切**始于 2018 年 10 月,**当时法国政府突然提高燃料价格,引发大规模抗议,因此创造了社会、财政、民主和经济诉求的理想民粹主义运动。
社交媒体上的一切都像病毒一样传播开来,暴徒们开始在每个周六走上街头。该运动于 2018 年 11 月 17 日达到最高参与率**,超过 130 万黄背心**。
秋天
Photo by Koshu Kunii showing a bank forced to close its doors on a Saturday due to violent protestations
然而人们开始被这股黄色浪潮惹恼了。宣言变得过于暴力,黄背心活动家无法就他们的宣言达成共识,最终法国政府采取了一些(非常轻微的)行动将这场运动陷入僵局。2019 年 5 月只有 4 万只。
新崛起?
每周六参与率暴跌,新闻掉了这个话题…直到 2019 年 12 月 5 日工会安排了新的全国会议。2019 年 9 月,法国政府宣布了一项针对每个社会阶层的大规模养老金改革。很快,推特上出现了#黄背心,活动人士在周六重新确定了他们的每周约会,直到 12 月 5 日的全国大罢工。
使用 Python 上的 P lotly 库,我们可以根据**“Le Nombre Jaune”估计**(法国脸书小组试图估计参与者数量)**与法国政府估计,可视化去年黄背心的参与率。*点击【播放】*按钮!
12 月 5 日:社会运动的重生?
为什么是这个特殊的日子?这是由所有最大的法国工会策划的,作为纪念 24 年前人们再次走上街头抗议另一项养老金改革(流产)的方式。
12 月 5 日星期四**,许多罢工计划在公共交通、教育、医院和电力服务进行。我们将通过词类分析看到# 5 decembre(# 12 月 5 日)和# GilletsJaunes(# yellow vets)之间的高度相关性。**
# YellowVests 运动的词类分析:数据科学过程
Photo by Nicole Edelbrock on Unsplash
我们利用 Tweepy 库和 Python 上的 Twitter API,在 11 月 29 日至 12 月 2 日的关键时段(高峰活动时段)收集了 4000 条推文(每天 1000 条推文)。
…然后我们必须清理数据,以便通过卷积神经网络模型正确处理数据(删除提及,url,#…),我们能够调用这个模型多亏了 Spacy 库和它的法语包。
最后,我们使用 Plotly 库,将 3 个不同词类中最常用的 20 个词可视化,这 3 个词类是:、【名词】、【动词】和【ADJ】。****
#YellowVests 运动的词类分析:我们能得出什么结论?
Photo by Koshu Kunii on Unsplash
鉴于我们获得的自然语言处理结果,我们决定实现最常见采购订单的词云可视化,这样我们可以更好地得出结论。(图形是交互式的,因此如果文字没有完全显示在屏幕上,您可以浏览文字)
井…那么我们能看到什么呢?**
表演并被倾听
出人意料的是,法国人通过“Partir”(= Leave)、“Veut”(= Want)、“Mettre”(= Set)、“Prendre”(= Take)、“Agit”(= Act)和“défendre”(= Defend)等动词来表达采取行动和实施变革的意愿。但是我们也可以注意到像“Comprendre”(=理解)、“Travailler”(=工作)、“Lire”(=阅读)甚至“Eviter”(=避免)这样的词是非常重要的,它们表明法国人民在采取行动之前需要听到政府的声音。
国家的呼唤
快速浏览一下最常用的形容词,就能明显看出全国性的关注和全国性的运动号召,感谢大写的‘Fran ais’(=法语)、‘gréviste’(=醒目)、‘générale’(=整体)、‘Public’甚至‘GRAND’(=大)!
12 月罢工相关性和意志,使运动持续下去
看看最热门的名词,事情变得与 12 月的大规模罢工非常相关(我们在上面提到过):“运动”(=运动)、“死亡”(= 12 月)、“再培训”(=养老金)和“改革”(=改革)是最常用的词之一…
法国推特用户在撰写‘gouvernement’(=政府)、‘république’(=法兰西共和国)或‘Police’(=警察部队)时,也直接针对政府甚至系统本身。最后但并非最不重要的是,顶级名词分析还揭示了法国民族主义的名词槽,如’人民’(=国家),‘支付’(=国家),甚至’街’(=街道)。
最后,我们不得不通过以下词语提到当时的词汇领域:‘Jour’(= Day)、‘Mois’(= Month)、‘ère’(= Era)和‘vie’(= Life),突出了追求这一运动的意愿,或许为法国社会创造一个新时代?
情感分析
现在让我们深入到推特情绪分析中,试着解读人们对这场大规模社会运动的感受。使用 Textblob 库及其情感估计模型,我们可以估计熊猫数据帧中每条推文的“极性”:也就是说一个介于-1(非常负面)和 1(非常正面)之间的数值。
给定我们 4000 条推文的样本,我们选择通过删除不相关的推文进行情感分析,将我们的数量减少到 2733 条推文(例如,包含太多“停用词”的字符串,也就是不相关的词,或者字符串长度为< 4)。
下面是 tweets 长度的分布图**:取值范围很广,但是我们可以看到长度通常在 30 到 230 个字符之间**。
惊喜!
如果你要求任何人对#YellowVests tweets 进行分类或描述,那应该是“**愤怒、愤怒、仇恨、反抗”**或任何与负面评论相关的词(所以让我们说一个从-1 到-0.01 的值,前者代表高度负面评论)。
Photo by Adrien prv on Unsplash
但是你猜怎么着, TextBlob 模型向我们展示了一个相反的趋势!如果你看一下极性的意思是,它是正的,等于+0.05,而你本可以期待一个负值!
积极的感觉?
在获得每条推文的极性后,我们选择应用一个简单易行的分类器:
- 极性在-1 和-0.0001 之间的推文被归类为“从中性到非常负面的”情绪。意思是非常负面或非常负面的评论。
- 极性在 0.0001 和 1 之间的推文被分类为“从中性到非常积极的评论,意味着一些善意的评论到非常积极的评论”
- 极性为 0.0000 的推文被分类为“误分类”(被算法遗漏。
因此,很容易绘制一个直方图来显示情绪分布并呈现主要趋势:大多数推文被归类为“中性到积极”,少数被链接到负面类别。
不幸的是,766 条推文没有被模型分类,因为 TextBlob 对于法语来说并不聪明。
**注意:**我们可以使用 Texblob 模型中的 naive Bayes 分类器将每条推文分类为“积极”、“消极”或“中性”,但同样,它在法语中并不那么有效
奖金部分
Photo by Ray Hennessy on Unsplash
**感谢你坚持到最后:)**我们希望你通过这次文本挖掘学到了一些东西或感到惊讶!为了奖励你,下面是我们在分析过程中发现的前 3 条负面和正面评论:
前 3 个正向推文(极性= 1.0)
- "Les #GiletsJaunes,ce people sorti de l ’ ombre pour se serrer Les coudes et dir stop aux unjustices"(= " # yellow vests,那些走出阴影的人团结在一起,制止不公正现象")
- 马克龙先生的使命是一个幻想,她是一个假设(=马克龙的辞职是一种幻想,现在是一种假设”)
- “05 年全国大规模集会,不为 DANS 和 GES 议会服务!在 EST LÀ!!全国团结工会!!!”(=“大规模的民族融合第五次毫无保留的游行队伍中!我们到了!!!民族团结!!!!!")
前 3 条负面推文(极性= -1.0)
- “你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看,你看, " (= “你会看到,他们会非常愚蠢,那些#黄背心,他们明天会封锁炼油厂”)
- Quand I vois Macron,j’ai envie de chier。 " (= "看到【总统】马克龙,我就想拍个 s*** ")
- ” Eh le macronard!你对这个结论有什么看法?事实上,这是一个很大的问题。请相信,您的全部追求都是为了达到目标。 " (= "嘿,马克龙纳德!你是通过怎样的心理扭曲得出这个结论的?不管是谁干的,他肯定是个大混蛋(或者不是)。你的仇恨,你对马克龙的完全屈服使你失去了所有的客观性”)
Yelp 最好的卷饼
分类和情感分析—第 1 部分
这是一个三部分的项目,与 Yelp 的开放数据集一起工作,一个 “用于学习的通用数据集。 “在第 1 部分中,我们将加载一些大规模的 JSON 文件,过滤它们以减小它们的大小,探索我们的评论数据子集并讨论标记化!第二部分 这里的 。第三部分 这里的 。如果你对代码感兴趣,你可以在这里找到它。
数据
Yelp 维护并分发了一个用于学习的大规模开放数据集,专门用于 NLP 问题。该数据集包含各种信息,包括入住数据、照片和业务属性。然而,我们在这里最感兴趣的是评论的集合。这个数据集来自几个包含不同信息的 JSON 文件,包含近 30 万家企业的 700 万条评论。哇!
这是一个令人尴尬的大量数据,所以我们将与一个较小的评论子集一起工作,以最大限度地减少计算时间。这个子集将是所有对墨西哥和 Tex-Mex 餐馆的评论,因为我喜欢墨西哥卷饼。相当随意,但这将大大减少计算时间,并确保比我们与瑜伽馆或电影院等不同企业合作时更标准化的语料库。
要获得这些评论,需要做一些预处理工作。包含所有 700 万条评论的 JSON 文件没有任何关于企业名称或类别的信息,只有一个唯一的企业 ID。为了获得与 Mexican 和 Tex-Mex 餐馆相关的业务 id 列表,我们必须查阅包含所有业务属性信息的 JSON 文件。将这个 JSON 文件直接加载到 pandas 数据框架将允许我们按业务类别进行过滤。在这里,不出所料,“墨西哥”和“得克萨斯-墨西哥”。这样做将为我们提供一个超过 4000 家企业的列表,现在是所有餐馆。很简单,从我们开始的 30 万家企业中精简出来。JSON 文件包含了 700 万条评论。
这个文件的庞大规模需要一种不同于处理业务属性的策略。试图将所有 700 万个文件直接加载到一个数据帧甚至一个字典列表中会导致内存错误(至少对于我的 8gb ram)。另一种策略是打开文件,逐个读取对象,并检查内存中的当前对象是否符合特定标准。在这种情况下,标准是将业务 id 与上面创建的列表相匹配。如果有匹配,我们将把 JSON 对象(一个字典)追加到一个列表中。然后,可以将这个字典列表推送到数据帧中。这是一个缓慢的过程,但我不确定在处理大文件时有没有更好的解决方案(如果你有不同的想法,请在评论中告诉我)!无论如何,在处理结束时,我们会得到一个数据帧,其中包含 Yelp 开放数据集中所有墨西哥和 Tex-Mex 餐馆的所有评论。
这个过程的最后一步是在这个项目的第 3 部分中分离一组评论来进行情感分析。因为我们对使用情感分析来识别被低估的墨西哥卷饼感兴趣(稍后会有更多内容),所以我们会找出所有专门提到“墨西哥卷饼”这个词的评论。使用 pandas 的矢量化字符串函数,这是微不足道的。所有这些操作的最终结果是包含独特评论集的两个数据框架。有 51,764 条评论提到了墨西哥卷饼,另有 328,932 条评论提到了墨西哥餐馆和得克萨斯-墨西哥餐馆。仍然是一个大的评论集,但比最初的 700 万更容易管理。
视觉探索
该项目的这一部分的目标是建立一个分类器,根据评论的文本正确预测给定的 Yelp 星级。为了更好地理解我们所做的工作,让我们看一些有助于描述数据的图表。首先,我们将通过星级检查评论的数量,看看我们是否有一个均等的分布(图 1)。正如我们在下面看到的,5 星评论的数量让其余的星级相形见绌。这可能意味着该数据集将受益于对多数类的欠采样。现在我们只需要记住这些信息。
Figure 1: Number of reviews binned by stars
我们可能感兴趣的另一个关系是文本长度和星级之间的关系。正如 Austin McCartney and co., 分类器的性能随着文本长度的减少而降低。查看与上面相同的 5 个容器,我们可以看到文本长度因星级而异,但差异并不大(图 2)。无论如何,这是很难改变的。继续前进。
Figure 2: Mean length of reviews binned by stars
既然我们对评论长度和星级数的分布有了一些直觉,接下来让我们看看构成这近 330,000 条评论的餐馆。以下是获得评论最多的 15 家餐馆的名单。对于我们这里的目的,单个链的评论都加在一起(图 3)。不出所料,连锁餐厅占据了前 15 名的大部分,但还没有到可能会出现问题的程度。在所有的评论中,只有大约 2%的评论是针对墨西哥薄饼的。
Figure 3: Top 15 restaurants garnering reviews (here, all Chipotles and all Taco Bells)
上面的列表也很有趣,因为它似乎偏向于美国西部的餐馆。具体来说,我知道“Barrio Queen”是亚利桑那州一家受人尊敬的传统墨西哥餐厅,“Tacos el Gordo”是加利福尼亚州一家备受推崇的主流餐厅,“Nacho Daddy”是内华达州一家玉米片冠军餐厅。我们之前可能认为 Yelp 的这个数据集包括了这个国家的很大一部分,但是我们最好仔细看看城市和州的分布,看看我们在做什么(图 4,图 5)。正如我们所见,拉斯维加斯和亚利桑那州的一些城市有很好的代表性,亚利桑那州餐馆的评论数量让其他州相形见绌。在这个项目的扩展中将我们的评论绑定到这些位置可能会很有趣,但是现在没有必要担心这个奇怪的餐馆样本。
Figure 4: Top 15 cities represented
Figure 5: Reviews binned by state
鉴于我们所拥有的数据,以及项目第一部分的简单最终目标,让我们将 5 星评级系统分为两类。这将是好评论(5 和 4 星)和坏/中性(1,2 或 3 星)评论。这将使分类更简单。执行这个操作很简单,然后我们得到了 115,787 个差评和 213,145 个好评。这种不平衡可能意味着我们的分类器在对好评进行分类时会表现得更好,但没有必要进行纠正。
清理一些文本
分析文本的第一步是清理文本。这可能涉及各种不同的步骤,但这里会很简单。我们将利用内置函数的自然语言工具包(NLTK)。所有的评论都包含在一个数据框架中,这个过程很容易用 pandas apply 方法实现。为了了解这个过程的输入和输出,我们可以看看下面的图 6。我们从最初的评论开始,将所有大写字母转换为小写字母,将文本转换为字符串列表,然后最终删除停用词(常见的单词)和标点符号(注意评论末尾的感叹号和笑脸已经消失)。
Figure 6: Steps in the cleaning and tokenizing process.
N-grams
一旦矢量化,上面生成的单词列表可用于机器学习模型中进行分类。然而,简单地使用单词作为特征必然会消除伴随单词排序而来的所有信息。这就是 n-grams 发挥作用的地方。N-gram 是从给定的文本序列构造的 N 个项目的连续序列。这些可以是二元模型(2 个单词)、三元模型(3 个单词)等。给定上面图 6 中单词标记的最终列表,二元模型表示将是下面图 7 中复制的元组列表。
Figure 7: Bigram representation of the sentence constructed in figure 6
使用 n-gram 表示的最大缺点是训练词汇的规模变得巨大。我们稍后会谈到它,但是通过向量化训练语料库构建的二元模型的词汇表超过 300 万个唯一术语。正如我们所料,使用三元模型或四元模型只会使这个问题更加复杂。当然,最终的终点将是训练语料库中表示的每一个独特的句子和一个完美的过度拟合模型。使用二元模型不会发生这种情况,而且我们将获得比使用单个单词更好的分类性能结果(相信我,我已经检查过了)。它还允许我们执行功能选择步骤。所有伟大的东西,让我们开始吧!跟我来第二部分这里。
是的,众议员 Borowicz 调用是不寻常的
星期一,爸。州众议员斯蒂芬妮·博罗维奇在众议院发言时做了祈祷,她甚至在说“阿门”之前就开始引起反弹这场祈祷恰逢该州首位穆斯林女性代表宣誓就职,被批评者贴上了仇视伊斯兰和排外的标签。
是什么引起了如此大的争议?
批评者充满了对以色列友好的特朗普政府的宽恕和赞扬,他们说,这种祈祷更像是针对民主党人的政治声明,而不是祈祷。
但是这次祈祷和平常有什么不同吗?
而绝大多数的调用在 Pa。众议院 chamber 来自基督徒,对 2013 年以来超过 400 次调用的分析表明,大多数发言者避免使用公开的基督教名字称呼上帝。相反,大多数人使用更通用的名字,如“主”和“父亲”例如,不到 30%的调用包含单词“Jesus”甚至一次(不到 5%的调用不止一次)——Borowicz 在她有争议的调用中使用了 13 次。
Data: Session journals from the PA House of Representatives website.
Chart by Jared Whalen
观看下面视频中的祈祷。
方法论
使用可用的 PA 众议院会议日志(2013-2018 年 6 月)和 Borowicz 的祈祷文转录,我提取了祈祷文,并对祈祷文中上帝的常见名称进行了词频分析。
工具
Adobe —将 pdf 转换为纯文本
R —文本分析和可视化
Illustrator —完成设计润色
独立图表
Data: Session journals from the PA House of Representatives website.
Chart by Jared Whalen
将莱昂纳多·达芬奇的 5 种最佳技术应用到您的数据中
Disagreement if this is Leonardo da Vinci’s self-portrait — but most believe it is.
你可以用数据创造迷你杰作
达芬奇是有史以来最有影响力的艺术家之一。虽然最出名的是《蒙娜丽莎》和《最后的晚餐》这两幅作品,但他自学了许多其他学科,比如《T4》中的医学、科学、建筑,甚至是战争发明。
今天,您可以将他对细节的热爱、对世界的好奇心和灵感之美应用到您的数据通信中。
技巧 1:展示数据的灵魂
达芬奇被描述为历史上最有天赋和创造力的人之一。500 多年前,他出生在意大利托斯卡纳的芬奇镇。他出生在文艺复兴时期,这是中世纪开始向现代世界过渡的时期。
在他的一生中,达·芬奇写日记,记录草图、想法和提醒。从这些笔记本中,我们能够研究他的思维模式。从达芬奇身上,我们可以拥抱好奇心、系统思维、对细节的热爱,甚至冒险。
“一个好的画家有两个主要的绘画对象——人和他灵魂的意图。前者容易,后者难,因为它必须通过手势和肢体的运动来表达。”
Vitruvian Man (Public Domain)
他的维特鲁威人画的是一个站在一个圆圈和一个正方形内的人,显示了他对比例的理解。达芬奇被描述为非常英俊,非常迷人。这幅画被认为是一幅自画像。
想想这可能如何应用于数据——每天我们都必须展示数据并解释其含义。我们的工作是通过使用机器学习和数据可视化技术来展示数据的灵魂。
技巧二:达芬奇喜欢细节
为了保持艺术的准确性,达芬奇解剖了人类和动物的身体。当他致力于获得更精确的艺术作品时,他画的内脏器官和身体肌肉结构是已知的最早的一些画。这是一些第一张解剖图——当你看他的作品时,请注意面部和身体的细节是如何表现的。
这是我们数据通信的目标——展示整体和细节,让观众了解整个画面。类似于达芬奇——这意味着你理解数据的基本原理或剖析。这就是你如何传达你在数据中发现的丰富见解。
技巧 3:运用系统思维
系统思维是理解碎片如何影响整体的能力。达芬奇看到了自然界的模式,并以多种方式应用这些模式。通过对解剖学的研究,他对齿轮和杠杆的工作原理有了新的认识。他将概念相互联系并将这些想法应用到其他领域的能力增强了他解决问题的能力。
Systems Thinking applied to a Wheel
同样的系统思考过程也可以应用于数据通信。通过思考应用于整个流程或组织的业务问题,您可以更好地理解每个问题或见解将如何改变整个流程。
在 数据分析——系统思考 的帖子中,作者提出了当分析师不考虑单一指标的影响时,他们会如何引发问题。不考虑上游和下游方法,很容易分离出那个值,但是这是危险的!这些指标是一个更大系统的一部分,改变一个指标会对其他指标产生连锁反应。当你想到系统时,考虑你的见解是否有价值。
达芬奇对每个元素的观察和思考就是我们应该如何思考我们的数据通信。
技巧 4:用视觉思考来获得即时效果
Photo by Pavel Nekoranec on Unsplash
在他的一个笔记本中,达·芬奇注意到绘画如何优于写作,因为绘画可以在瞬间交流,而一首诗可能需要几个小时才能说完。这正是我们今天对数据可视化的看法!
这些视觉思维没有一个比我们从《蒙娜丽莎》中学到的更清晰。学者们评论了蒙娜丽莎的微笑。她是微笑还是悲伤?如果你把注意力集中在嘴巴上,看起来她可能只是在微笑。当你抽离并注意到她的眼睛时,她很明显在微笑,甚至在你穿过房间时注视着你。
达芬奇的 sfumato 技术,模糊了线条和边界,为他的作品带来了现实主义。他认为人们看到的不是清晰的线条,而是模糊的烟雾。他说这种技术是“没有线条或边界的,以烟雾的方式或在焦平面之外”。翻译过来,sfumato 来源于意大利语中的烟。
他分析了关于人脸的一切,以便更好地理解如何绘画。在他的杰作《蒙娜丽莎》中,他解剖了人的面部以了解与嘴唇相关的肌肉。达芬奇想用他的作品产生影响。他想移动查看器,这正是我们在数据通信中想要的。冲击!
技巧 5:发现意想不到的见解
如果你去意大利米兰旅行,你可以看到达芬奇最著名的画作之一——《最后的晚餐》。这幅作品被画在圣玛丽亚教堂的墙上。这幅画描绘了《新约》中的一个故事,基督和他的 12 个追随者一起吃了最后一顿饭。达芬奇想要捕捉基督透露他会被餐桌上的某个人出卖的那一刻。
Image by JaneB12 — Pixabay
对细节的关注是你能找到洞察力的地方。请注意,基督以开放的肢体语言坐在桌子的中央。整个图像以他为中心,拱门甚至看起来像是他的头顶。达芬奇确保每个门徒对基督的陈述有不同的反应——许多人问,“是我吗?“看这些脸——他们表现出担忧、震惊、愤怒和困惑。
叛徒犹大(基督左边第二个)正在远离基督。在犹大面前,有一个撒盐的容器。将盐洒在桌子上通常被认为是不祥之兆。这些是他加入的一些细节,为他的画增加了意义的深度。
众所周知,达芬奇会花几个小时观察人们,这样他就可以在笔记本上捕捉他们的表情。他会详细研究这个主题,并画出许多草图。
在左图中,你可以看到他的素描最后的晚餐。在这幅素描中,他考虑把犹大放在桌子的对面。他多次画出这些数字,以确保他的信息得到传达。在我们的世界中,我们称之为迭代。
同样的勤奋让数据通信脱颖而出。达芬奇注重表情、餐桌布置以及房间的细节。您的详细信息将来自您搜索数据以找到最有影响力的结果时的数据。
在你的工作中运用这些技巧
达芬奇于 1519 年在法国去世,享年 72 岁,当时他正在为法国国王服务。他将因对艺术和科学的巨大影响而被人们铭记。在他的一生中,达芬奇影响了包括米开朗基罗和拉斐尔在内的一代艺术家。
今天,您可以将他对细节的热爱、对世界的好奇心和灵感之美应用到您的数据展示中,打造出真正的杰作。
当向您的组织引入分析策略时,它可能会因为领导者不…
www.zencos.com](https://www.zencos.com/blog/organizational-change-toward-analytics-strategies-mistakes/) [## 为什么数据可视化会失败?
简单…伪装成有用见解的图表
towardsdatascience.com](/why-do-data-visualizations-fail-39fd29172d7a)
让我们连线—跟我来!
又一个全栈数据科学项目
一脆-DM 实现
Photo by rawpixel.com from Pexels
简介
几年前,当我在华盛顿特区搜索数据科学会议时,我第一次遇到了“全栈数据科学”这个术语。
作为一名软件开发背景的人,我非常熟悉全栈开发人员这个术语,但是全栈数据科学听起来很神秘。
随着越来越多的公司将数据科学&机器学习纳入其传统软件应用,术语全栈数据科学现在比历史上任何时候都更有意义。
软件开发方法经过多年的精心开发,以确保在较短的周转时间内实现高质量的软件应用。不幸的是,传统的软件开发方法在数据科学应用的环境中并不适用。
在这篇博文中,我将强调跨行业数据挖掘标准流程(CRISP-DM ),以开发一个可行的全栈数据科学产品。
我坚信一句谚语,“布丁的好坏,在于吃的过程。”因此,我通过应用 CRISP-DM 方法实现了 Starbucks challenge,作为本文的姊妹项目,并在本文的多个地方被提及。
Starbucks 数据集概述
星巴克使用模拟程序生成了数据集,该程序模拟了人们如何做出购买决定以及促销优惠如何影响这些决定。
模拟中的每个人都有一些影响他们购买模式的隐藏特征,并与他们的可观察特征相关联。人们执行各种事件,包括接收报价、打开报价和进行购买。
简单来说,没有特定的产品需要跟踪。只记录每笔交易或报价的金额。
有三种类型的优惠可以发送:
- 买一送一(BOGO)
- 折扣,和
- 信息
在 BOGO 优惠中,用户需要花费一定的金额来获得与该阈值金额相等的奖励。
收到折扣后,用户将获得相当于消费金额一小部分的奖励。
在信息提供中,没有奖励,但也没有要求用户花费的金额。优惠可以通过多种渠道提供。
主要任务是使用数据来确定哪些人群对每种类型的优惠最敏感,以及如何最好地展示这些优惠。
数据挖掘(CRISP-DM)的跨行业标准流程是什么?
跨行业数据挖掘标准流程(CRISP-DM)方法是一个开放的标准流程,描述了数据挖掘专家使用的传统方法。
CRISP-DM 是一个循环过程,分为六个阶段。
- 业务理解
- 数据理解
- 数据准备
- 建模
- 评估
- 部署
Cross-Industry Standard Process for Data Mining (CRISP-DM) By Kenneth Jensen
商业理解
侧重于从业务角度理解项目目标和需求,然后将这些知识转化为数据挖掘问题定义和初步计划。
对于当前场景,我们将:
- 对多变量频率分布进行探索性数据分析。
- 建立一个机器学习模型,预测某人是否会对某个提议做出回应。
- 建立一个预测个人最佳报价的机器学习模型。
- 建立预测购买习惯的机器学习模型。
数据理解
数据理解阶段有两种练习方式:
- 从现有的数据收集开始,并继续进行熟悉数据的活动,以发现对数据的初步见解,或检测感兴趣的子集,以形成对隐藏信息的假设。
- 识别特定的有趣问题,然后收集与这些问题相关的数据。
从业务到数据理解阶段的转化不是线性的;相反,它是循环的。
在这个项目中,我们将只利用星巴克提供的数据,因为在数据的固有限制下工作很有挑战性。因此,我们正在练习第一种方法。
Starbucks 在三个 json 文件中分发了数据:
- portfolio . JSON——包含报价 id 和每个报价的元数据(持续时间、类型等)。)
- profile.json —每个客户的人口统计数据
- 抄本. json —交易记录、收到的报价、查看的报价和完整的报价
数据准备
数据准备阶段包括从初始原始数据构建最终数据集的所有活动。数据准备是 80%的过程。
数据争论和数据分析是 CRISP-DM 模型的数据准备阶段的核心活动,也是第一个逻辑编程步骤。数据争论是一个循环的过程,我们经常需要一次又一次地重新审视这些步骤。
数据角力是独立于语言和框架的,没有一个正确的方法。对于姊妹项目,我选择 Python 作为编程语言,Pandas 作为数据操作框架。
根据经验,我将分两步处理数据争论:
- 评估数据——在这一步中,我们将对数据进行语法和语义检查,找出数据中的任何问题以及潜在的修复方法。
- 清理数据——在这一步中,我们实施评估阶段的数据修复。我们还运行小单元测试,以确保数据修复按预期工作。
我对 Starbucks 提供的所有三个数据源进行了数据辩论。
数据角力— portfolio.json
从视觉和程序性评估来看,投资组合数据集只有十行,没有缺失数据。
但是,数据不是机器学习友好的结构。我们将对“channels”和“offer_type”列应用 one hot 编码方法。
Data Wrangling — portfolio.json
数据角力— profile.json
根据目测评估,在轮廓数据集上:
- “成为成员”列不是日期时间格式。
- 如果缺少年龄信息,则默认使用“118”填充年龄
Age frequency distribution —before data wrangling
根据程序性评估,在轮廓数据集上:
- 性别和收入列有缺失数据。
- 缺少性别和收入信息的相同列的年龄值为“118”
在清理阶段对配置文件数据集实施以下修复:
- 删除缺少值的行,这将隐式删除年龄为“118”的行
- 将成为成员转换为熊猫日期时间数据类型。
数据不是机器学习友好结构。我将创建一个新的 ML 友好熊猫数据框,并做如下修改:
- 对性别列应用一种热编码方法。
- “成为成员”列拆分为年、月、日列,删除“成为成员”列
Data Wrangling — profile.json
一旦数据争论步骤完成,就没有丢失值的行(隐式删除年龄为‘118’的行))
Age frequency distribution — after data wrangling
数据角力—抄本. json
从视觉和程序性评估来看,抄本数据集中没有数据问题。
然而,没有定义促销是否影响了用户的数据。只有在个人观看广告后进行交易之后,用户才被认为受到促销的影响。我们将应用多种数据转换来提取这些信息。
Data Wrangling — transcript.json
现在我们已经清理了所有三个数据帧,让我们合并成一个数据帧。
Data Wrangling — consolidation
探索性数据分析—多变量频率分布
从文字记录数据中,我们识别出五种事件:
- 收到报价
- 报价已查看
- 报价完成
- 交易(购买)
- 受影响(仅当在查看报价后购买时)
从干净数据推断的特征在相应的可视化下面提到。
Event Distribution by Gender
- 注册为男性的个人资料交易次数最多。
- 注册为女性的个人资料很可能会受到晋升的影响。
Event Distribution by Income
- 数据集中的个人在 3 万到 12 万的收入范围内。
- 数据集中的大多数人年收入不到 8 万英镑。
- 大多数交易是由年收入低于 8 万英镑的个人进行的。
Event Distribution by Offer Type
- BOGO 优惠有较高的影响力。
- 信息优惠的影响可以忽略不计。
即使从数据探索中获得的知识并不多,但它已经产生了一个关键的洞察力— 目标类别不平衡 。主要是在处理分类模型时,这些信息对于决定应该使用什么评估度量是至关重要的。
建模和评估
建模不是必要步骤,完全取决于项目的范围。对于这个项目,我将建立一个机器学习模型:
- 预测某人是否会对提议做出回应。
- 预测个人的最佳报价。
- 预测购买习惯。
三个模型都是在集合模型上训练的。
对于分类模型,由于目标类别的不平衡,我们将使用精度、召回率和 F1 分值作为评估指标。
对于回归模型,我们将使用均方差和 R2 值作为评估指标。
预测某人是否会受到要约的影响
Model for predicting whether or not someone will be influenced by an offer
我采用了网格搜索来寻找产生高 F1 分数值的模型。学习率约为 1.87 的 AdaBoostClassifier 和 10 个估计器在训练和测试数据集上都产生了 0.87 的合并 F1 分数,实现了偏差(欠拟合)和方差(过拟合)之间的正确平衡。
Precision, Recall and F1-score for training and testing data sets
并非数据集中的所有特征都被用来进行预测。我们可以从模型的角度获得每个特征的权重。权重将在 0 到 1 的范围内,并且所有特征的总权重将加起来为 1。
Feature Importance for model to predict influence
预测一个人是否受促销影响的模型高度依赖于消费金额。这种模式高度依赖于行动(购买)之后。因此,我们不能使用这种模式。理想情况下,我们需要收集更多的数据来解决这个问题。由于我只处理星巴克提供的数据,我无法设计出想要的模型。
预测个人最佳报价
Model for predicting the best offer for an individual
我采用了网格搜索来寻找产生高 F1 分数值的模型。不幸的是,F1 可以达到的最高综合分数是“0.2”。
收集更多数据应该有助于提高 F1 分数,但由于我只在所提供的数据范围内工作,我无法部署这一模型。
Precision, Recall and F1-score for training and testing data sets
预测购买习惯
Model for predicting the purchasing habits
我采用了网格搜索来寻找产生合适的 R2 和 MSE 值的模型。学习率为 0.1 的 GradientBoostingRegressor 使用 100 个估计量,为训练和测试数据集产生了大约 0.32 的 R2 分数和大约 2300 的 MSE,实现了偏差(欠拟合)和方差(过拟合)之间的正确平衡。
R2 & MSE for training and testing data sets
Feature Importance for model to predict amount
与用于预测个人是否会受到影响的模型不同,预测购买力的模型依赖于多个特征,并且没有一个特征是事实属性。
我将在 Web 应用程序中使用这个模型来进行预测。
部署
通常,这意味着将模型的代码表示部署到应用程序中,以便对新出现的未知数据进行评分或分类。
重要的是,代码表示还必须包括建模前的所有数据准备步骤,以便模型能够以与模型开发期间相同的方式处理新的原始数据。
我已经创建了 web 应用程序,它将利用数据分析和预训练模型来预测个人资料和优惠代码组合的购买金额。
在 自述文件中提到了启动 web 应用程序所需遵循的步骤的完整描述。MD 文件。
以下是来自网络应用的截图:
数据集概述
预测金额
路径:http://0 . 0 . 0 . 0:3001/predict _ AMT
结论
- 与传统的软件开发相反,实现业务需求并不总是可行的。有时更多的数据会有所帮助,但在我们目前的情况下,我们将在所提供的数据范围内工作。
- 测试集的评估是建模阶段的一部分;这在现实世界中并不常见。由于这个项目没有专门的测试人员,建模和评估是同时进行的。在任何时候,测试数据都不会暴露给预训练的模型。
- 此分析的源代码托管在 GIT 上。
参考文献
另一篇卡尔曼滤波解释文章
是时候知道那些更新的方程式从何而来了
“[A Puzzle without a picture](http://A puzzle without a picture)” (who needs a picture when you have the Kalman Filter updating equations?)
T 网上有很多解释卡尔曼滤波器的文章,其中很多都相当不错。他们使用自主机器人和传感器作为激励的例子,有很好的视觉效果,并以直观的方式介绍模型方程和更新。但是我看到的每一个都没有解释卡尔曼增益矩阵和它的来源。
我最喜欢的例子是数学堆栈交换上这个备受推崇的答案:
begingroup$我敢贴链接到我的解释:http://david.wf/kalmanfilter/有很多不同的…
math.stackexchange.com](https://math.stackexchange.com/questions/840662/an-explanation-of-the-kalman-filter)
它非常棒,直到作者准备解释卡尔曼增益矩阵,而不是以“未完待续……”(那是 2014 年)。失望的读者乞求几天才能得到其余的答案,但他们永远也得不到。
因此,欢迎阅读另一篇卡尔曼滤波解释文章,区别在于这篇文章包含了更新方程的“友好”推导,一直到最后。这是一个贝叶斯解释,但只需要粗略了解后验概率,依赖于多元高斯的两个属性,而不是特定的贝叶斯结果。作为一个奖励,这个解释将向我们展示卡尔曼滤波器是如何“最优”的,因为它的本质就是。
推导过程
由于 Medium 的排版限制,下面的嵌入式笔记本提供了推导过程。我的贡献最多是一个简洁的介绍;我迷失了,直到我找到 Simo srkk 的幻灯片,Simo srkk是一名研究人员,他后来写了一本关于贝叶斯过滤和平滑的更一般主题的书。
对推导的思考
我希望你已经完成了上面的讨论(感谢对不顺利部分的反馈)。最后,是后路:
该符号与维基百科上的更新方程略有不同,但您可能会发现平均值与“更新(后验)状态估计值”相同方差看起来不像“更新的(后验的)估计协方差”,但是在下面的段落中注意公式如何“进一步简化”看起来相似的东西。
最佳性
“ Bayes 动作是“最小化损失函数的后验期望值”的规则使未知参数的期望均方误差损失最小化的贝叶斯动作,即均方误差,就是后验分布的均值。在本文中,后验分布的平均值是状态的卡尔曼滤波更新方程;这个更新方程是一个最小均方误差估计量,因为它是一个后验均值。
最后的想法
在推导过程中,我假设现有的贝叶斯结果将适用,进一步简化它。测量模型看起来像一个以 x_t 为β的回归,但我找不到贝叶斯线性回归公式来拟合。我注意到“设计”矩阵 H 的行不是独立的观察值,我也想不出一种方法将它转换成一个有一个观察值的多元回归。如果有一种方法可以缩短现有共轭结果的推导过程,请在评论中分享。
对于符号,我特意选择不使用维基百科文章中的 k | k- 1 符号,因为我发现很容易混淆我实际使用的数量。然而,在完成推导之后,我可以理解它确实允许更少的符号,并且强调了在更新步骤中数量的演变。
每当我在这样的事情上分心时(我确实分心了),总会有这样一个问题:这是否值得。在这种情况下,我认为是。我觉得我对多元高斯在卡尔曼滤波器构造中的广泛作用有了更好的理解。我有一个卡尔曼滤波先验的更好的概念,它不仅包含了到前一状态的信息,还包含了来自状态空间模型的信息,以便更进一步。我可能对选择卡尔曼滤波器实现中的状态向量和方差矩阵的初始值有更好的直觉(我们会看到)。我希望你也认为这是值得的,不管怎样,请在评论中告诉我!
MATLAB 中的 YOLO 物体检测,从头到尾
在 MATLAB 中下载并实现 YOLO 目标检测网络
当我在寻找一种快速计算 3D 打印皮肤器官中生物细胞的方法时,约瑟夫·雷德蒙的 YOLO 算法引起了我的注意。YOLO 算法的优点是能够在单个图像中识别和定位多个(在我的实现中多达 49 个)对象,这使得它成为对显微镜图像中的细胞进行计数的理想框架。然而,在我能够训练一个类似 YOLO 的细胞检测网络之前,我需要在 MATLAB 中实现我在这个项目中使用的原始 YOLO。我原以为这是一个相当简单的任务,结果却有点像逆向工程。虽然可以从 Mathworks 下载 YOLO,但是实现的细节却很少。
如果您对 Matlab 中的对象检测感兴趣(并且有合适的工具箱),本文提供了一个诀窍,以及对 YOLO 的行为和使用的一些见解。如果你对 YOLO 完全陌生,这里有 YOLO 的原始论文,后面是吴恩达的精彩描述,可以帮助你入门。
1.下载 YOLONET 并为回归进行修改
可从 Mathworks 获得的 YOLO 网络在可用于对象检测之前需要修改。您将下载的网络包含分类算法的最终图层;分类层和 softmax 层。然而,YOLO 实际上是一种 CNN 回归算法。输出应该是 0 和 1 之间的数字的数组或向量,其编码图像中检测到的对象的概率和边界框信息,而不是一系列的 1 和 0
最后两层需要用一个回归层代替。此外,为了与最初的 YOLO 论文(见上文)保持一致,最后一个泄漏的 ReLu 传递函数需要用一个标准(非泄漏?)ReLu。以下代码下载网络,修改图层,并将修改后的网络保存到 MATLAB 中的当前文件夹。
Creating the yolo network in MATLAB
2.通过网络运行图像并检查输出向量
为了测试我对 YOLO 的实现,我调用了我视觉艺术能力的最高水平,拍了一张快照,其中包含了 YOLO 接受过训练的四个物体——椅子、狗、盆栽植物和沙发。这是我的测试图像:
Still Life with Chair, Stella the Dog, Potted Plant, and Sofa. James Browning. 2018. Digital Image.
因为 YOLO 是一个回归网络,我们将使用函数预测而不是分类。图像像素需要缩放到[0,1],图像需要调整到 448x448 像素。如果您的图像是灰度的(即单通道),它需要扩展到 3 个通道。以下代码预处理图像(您需要在 MATLAB 当前文件夹中提供您自己的图像),对其应用回归网络,并绘制生成的 1x1470 输出向量。在这一部分代码中,我们还为包含对象的单元格定义了一个概率阈值(0.2 似乎效果很好),并为非最大值抑制定义了一个超过联合阈值的交集,这两者我们稍后都会用到。
Running a test image through the network
值得看一看 YOLO 算法的输出向量。您可以通过注意到索引 1–980 大约每 20 个位置出现一个峰值来对输出进行反向工程,对应于 YOLO 已经被训练的 20 类对象,索引 981–1079 包含一些峰值,对应于在我的测试图像中少数可识别对象(4)的概率,而索引 1080–1470 是相当随机的,这是您从边界框坐标中所期望的。
The raw 1x470 output of our modified YOLO network when shown an image of Stella the Dog.
在通过网络运行了几十个简单的图像之后,例如在图像的一侧包含一个单独的高个子的图像,我能够如下解码 YOLO 算法的输出。我只保证它在没有生命、生计、个人财产或任何最有价值的东西受到威胁的情况下是准确的…
YOLO output key. Hard won. Wish I could figure out a way of monetizing it.
3.重塑输出矢量并查找包含对象的像元
现在我们有了 YOLO 算法输出的关键,我们可以开始将 1x1470 输出向量转换成覆盖在测试图像上的边界框的过程。作为第一步,我决定将 1x1470 向量转换为 7x7x30 数组,其中前两个维度对应于 YOLO 将图像划分成的 7x7 个单元,最后一个维度包含定义每个单元的概率和边界框的 30 个数字。这样做之后,我们可以画一个简单的图,显示可能包含对象的单元格。将下面的图与原始测试图像进行比较,我们看到该算法似乎正在检测椅子、狗和沙发,但似乎没有检测到盆栽植物。
Reshaping the output vector into a 7x7x30 array
Yellow cells on the left contain an object in the image of Stella the Dog on the right. So far so (kind of) good.
4.打印边界框和类别标签
现在我们有了一个漂亮的 7x7x30 输出数组,我们可以在原始图像上绘制边界框和类标签。我们现在将利用代码前面的 probThresh 变量。您需要调整这个值以获得最佳效果,但是我发现 0.2 似乎对各种图像都很有效。下面的代码我就不多说了,只说有点繁琐,让我头疼。
Displaying bounding boxes
Too many sofas, not enough potted plants.
5.非最大抑制
正如你在上面看到的,我们的测试图像有两个直接的问题:1)沙发被标记了两次,2)盆栽没有被标记。椅子和狗斯特拉被完美分类。我们将使用非最大抑制来纠正第一个问题(沙发太多),并忽略第二个问题。实际上,左上角的物体严格来说并不是盆栽植物,它是一瓶水中的几根常青树枝,我称之为曼哈顿圣诞树。我不是一个和算法争论语义的人。
如果出现以下情况,非最大抑制将移除边界框 A:
- 它与边界框 B 的并集交集(IOU)高于定义的阈值
- 边界框 A 和 B 包含相同类别的对象
- 边界框 A 包含对象的概率比框 B 低
代码如下:
Voila! Viola! (is something I imagine luthiers say a lot)
就是这样!MATLAB 中的实时统一目标检测。对羊有效吗?当然啦!它对人、狗和羊有效吗?不…
这里有一个关于迷人的、及时的、不断发展的 YOLO/人工智能羊难题的简短讨论:
我最近在 MATLAB 上改编了约瑟夫·雷德蒙的 YOLO 算法(到目前为止没有非最大值抑制),度过了一个有趣的小时…
towardsdatascience.com](/yolo-is-sheep-obsessed-environmental-context-in-unified-object-detection-91160dafa618)
YOLO(你只看一眼)
一个实时物体检测算法的简单说明!
King Aragorn before a charge against the Orcs of Mordor
西雅图人,想象一下这个场景:
这是一个温暖的夏日午后,在绿湖公园。公园里到处都是其他人,他们试图在我们相对短暂的夏天吸收所有他们能得到的阳光。你躺在草地上,努力抚平前一周长途跋涉后晒黑的皮肤。当你在读你最喜欢的书时,你听到了集体的叫喊声。!!!“来自你附近的一个群。在你的眼角,你看到一个小球向你走来,随着每一毫秒的流逝,它突然变得越来越大。本能地,你放下书,并能够找到球,并在它击中你之前接住它!太棒了!
教一台机器如何“看”这个世界不是一件容易的事情。这可不是把相机连上电脑那么简单。我们只需要几分之一秒的时间来观察、识别、分析、分类,并最终根据我们的视觉采取行动(在这种情况下,举起你的手来预测流氓球的路径)。但是对于一台机器来说,重建人类视觉不仅仅是一个动作,它实际上是一系列动作。计算机视觉(CV)是一个不断发展和不断变化的跨学科计算机科学领域,它专注于如何使计算机能够像地球上的生命体一样感知世界。
在过去的几年里,硬件和软件都取得了进步。图像分割、面部识别和模式检测是计算机视觉的一些例子。在这篇博文中,我希望简单概述一下 YOLO(You Only looking Once),这是一种快速实时多目标检测算法,它是由来自华盛顿大学的 Redmon 等人在这篇 2015 年的论文中首次概述的(go DAWGS!)自其最初出现以来已经提出了许多改进。
首先,下面是 YOLO v2 的 youtube 视频。
来自 YOLO git hub 的自述:
你只看一次(YOLO)是一个用于检测 Pascal VOC 2012 数据集上的对象的系统。它可以检测 20 个帕斯卡对象类别:
人
鸟、猫、牛、狗、马、羊
飞机、自行车、船、公共汽车、汽车、摩托车、火车
瓶子、椅子、餐桌、盆栽、沙发、电视/显示器
很酷,对吧?但是什么?怎么会?
“你只看一次”是一种利用单个卷积网络进行对象检测的算法。与其他逐位扫描图像的对象检测算法不同,该算法获取整个图像并
…将对象检测重新构建为单个回归问题,直接从图像像素到边界框坐标和类别概率。
简而言之,无需深入细节,您可以获取一个图像输入,在 SxS 网格上将其分割,通过神经网络来创建边界框和类预测,以确定最终的检测输出。它首先在整个数据集上训练多个实例,然后在现实生活的图像和视频上进行测试。
为了计算边界框,YOLO 实现了两个关键的后处理步骤:IoU(在并集上相交)和 NMS(非最大值抑制)。
IoU 是机器预测的边界框与实际对象的边界框匹配的程度。以下面的汽车图片为例:
car
紫色的框是计算机认为的汽车,而红色是汽车的实际边界框。两个盒子的重叠给了我们借据。
The shaded yellow is our IoU
下面是 NMS 如何运作的一个简单例子。对象检测算法经常会有过度识别某个对象的问题,在这种情况下,奥黛丽·赫本的脸。 非最大抑制(NMS)已经广泛应用于计算机视觉的几个关键方面,并且是许多检测方法中不可或缺的一部分,可能是边缘、拐角或物体检测[1–6]。它的必要性源于检测算法定位感兴趣的概念的不完善的能力,导致在真实位置附近的几个检测的组。【NMS】确保我们在人脸所属的所有候选细胞中识别出最佳细胞。NMS 没有确定图像中她的脸部有多种情况,而是选择确定同一物体的概率最高的方框。
An example of NMS
利用 IoU 和 NMS,它可以极快地预测图像中的各种物体。通过在训练和测试期间查看整个图像,它隐式地编码了关于类的上下文信息以及它们在它所看到的图像中的外观。然而,YOLO 的一个缺点是无法检测太靠近或太小的多个对象,就像下面的例子中,建筑结构下的人群没有被 YOLO 分类。
via TechnoStacks
这项技术在现实生活中如何实施的一个很好的例子就是汽车视觉!当一辆汽车在街上行驶时,它“看到的”是不断变化的,通过快速 YOLO 算法,汽车将能够快速识别下面的骑车人。通过其他传感器来检测骑自行车的人有多远,汽车就能够采取必要的行动来阻止或避开骑自行车的人或其他汽车或物体,以避免碰撞!
我希望这个对 YOLO 算法的高水平概述已经激发了你对计算机视觉技术现状的兴趣。如果你有兴趣了解更多进一步的研究,请查看约瑟夫雷德蒙和他在 YOLO 和其他计算机视觉项目上的持续工作!
YOLO——你只能看一次
YOLO!!!那么我们只活一次吗?我确实不知道。我知道的是我们只需要看一次。等等什么?
没错。如果您想要检测和定位图像中的对象,则不需要经历提出感兴趣区域、对它们进行分类和校正它们的边界框的整个过程。如果你还记得我以前的文章,这正是 RCNN 和更快的 RCNN 这样的模型所做的。
我们真的需要所有的复杂性和计算吗?如果我们想要一流的精度,我们当然会这么做。幸运的是,有另一种更简单的方法来完成这项任务,只需处理图像一次,并立即输出预测。这些类型的模型被称为单触发探测器。
https://www.youtube.com/watch?v=yQwfDxBMtXg
单发探测器
我们没有一个专门的系统来提出感兴趣的区域,而是有一组预定义的框来寻找对象,这些对象被转发到一堆卷积层来预测类得分和边界框偏移。然后,对于每个框,我们预测多个边界框,并为每个边界框分配一个置信度得分,我们检测位于该框中心的一个对象,并输出每个可能类别的一组概率。一旦我们有了所有这些,我们简单地,也许是天真地,只保留具有高置信度得分的盒子。这很有效。实际上取得了令人印象深刻的成果。为了更好地阐述整个流程,让我们使用一个最流行的单次检测器,称为 YOLO。
你只看一次(YOLO)
到目前为止,这个模型已经有了 3 个版本,每个新版本都在速度和准确性方面有所提高。基于输入大小和类别定义预定义像元的数量和每个像元的预测边界框的数量。在我们的例子中,我们将使用用于评估 PASCAL VOC 数据集的实际数字。
首先,我们将图像划分为 13x13 的网格,总共得到 169 个单元。
对于每一个单元,它预测 5 个具有置信度得分的边界框(x,y,w,h ),它检测一个对象,而不管框的数量和 20 个类别的 20 个概率。
总共,我们有 1695=845 个边界框,并且该模式的输出张量的形状将是(13,13,55+20)= (13,13,45)。YOLO 模型的全部本质就是建立这个(13,13,45)张量。为此,它使用一个 CNN 网络和两个完全连接的层来执行实际的回归。
在仅保留具有高置信度得分(高于诸如 0.3 的阈值)的边界框之后,提取最终预测
https://pjreddie.com/darknet/yolo/
因为模型可能会输出相同对象的重复检测,所以我们使用一种称为非最大抑制的技术来消除重复。在一个简单的实现中,我们通过置信度对预测进行排序,当我们迭代它们时,我们只保留每个类的第一次出现。
就实际模型而言,该架构非常简单,因为它只包含卷积层和池层,没有任何花哨的技巧。我们使用多重损失函数来训练该模型,该函数包括分类损失、定位损失和置信度损失。
最新版本的 YOLO 引入了一些特殊的技巧来提高准确性,减少训练和推理时间。一些例子是批量标准化、锚盒、维度集群等等。如果你想了解更多的细节,你绝对应该查看一下最初的论文。
此外,为了深入研究代码并在实践中尝试 YOLO 模型,请查看 Github 中这两个令人敬畏的存储库( repo1 和 repo2 )。
YOLO 的强大之处不在于其惊人的准确性或其背后非常巧妙的想法,而在于其高超的速度,这使其成为嵌入式系统和低功耗应用的理想选择。这就是为什么自动驾驶汽车和监控摄像头是它最常见的真实世界用例。
随着深度学习继续与计算机视觉一起发挥作用(它肯定会这样),我们可以期待更多的模型为低功耗系统量身定制,即使它们有时会牺牲准确性。别忘了整个物联网之类的东西。这才是这些车型真正出彩的地方。
如果你有任何想法、评论、问题或者你只是想了解我的最新内容,请随时在Linkedin,Twitter,insta gram,****
原载于 2019 年 5 月 13 日https://sergioskar . github . io。**
Yolov2 用于从视频中检测物体
在本文中,我们将探讨如何使用 yolov2、darkflow 从网络摄像头、视频文件和 youtube 视频中检测物体
下面的阅读将有助于你对Yolo——你只看一次
从 CNN 到面具 R-CNN 和 Yolo 第 1 部分
从 CNN 到 Mask R-CNN 和 Yolo Part 2
使用 Yolov v3 进行物体检测
必需的库
- Python 3.5 或更高版本
- Tensorflow:我用过 CPU 版本
- OpenCV
- VC++ build 14
下载使用 keras 实现的 Yolo 代码
我们将使用暗流回购,可以从这里下载:https://github.com/thtrieu/darkflow
放下预先训练好的重量
重量可以从https://pjreddie.com/darknet/yolov2/下载
https://pjreddie.com/darknet/yolov2/
我创建了一个名为 bin 的新文件夹,并将下载的权重放在那里,如下所示
构建代码
构建代码有三种选择。
选项 1:
python setup.py build_ext --inplace
选项 2: pip 在开发模式下全局安装暗流
pip install -e .
选项 3:全球安装 pip
pip install .
对我来说,选项 2 和 3 效果不错。
我们现在准备处理图像或视频文件。
使用 Yolo 处理视频文件
我们将使用 COCO 数据集上预先训练的权重在 80 个类上处理视频。
我们将使用以下工具探索视频中的对象检测
- 网络摄像机
- 可见文件
- 传输 Youtube 视频
网络摄像机
所需库
import numpy as np
import time
import cv2
from darkflow.net.build import TFNet
import matplotlib.pyplot as plt
创建使用选项定义的暗流模型实例
options = {
'model': 'cfg/yolo.cfg',
'load': 'bin/yolov2.weights',
'threshold': 0.3
}
tfnet = TFNet(options)
从网络摄像头检测物体
创建一个 VideoCapture 的实例,参数为设备索引或视频文件的名称。将 0 作为摄像机的设备索引
cap = cv2.VideoCapture(0)
一旦创建了 VideoCapture 实例,您就可以逐帧捕获视频。最后不要忘记释放捕获并销毁所有窗口。
我们为框架创建一个随机颜色列表
colors=[tuple(255 * np.random.rand(3)) for i in range(5)]
我们将首先使用 cap.isOpened() 检查 VideoCapture 是否已初始化。如果 cap.isOpened()不为真,则使用 cap.open() 打开它。
我们设置了一个无限循环,并使用 cap.read()逐帧读取视频。cap.read()返回布尔值。如果帧读取正确,cap.read(0 返回 True。
对于每一帧,我们使用暗流实例 tfnet 来预测对象。我们提取左上、右下和标签来绘制边界框,标签显示在边界框的顶部。
我们使用 cv2.imshow()在窗口中显示该帧。
我们还设置当用户点击“q”时中断循环。
最后,我们通过释放摄像机并销毁所有窗口来清理视频捕获
**while(cap.isOpened()):**
stime= time.time()
**ret, frame = cap.read()**
**results = tfnet.return_predict(frame)**
if ret:
for color, result in zip(colors, results):
**tl = (result['topleft']['x'], result['topleft']['y'])
br = (result['bottomright']['x'], result['bottomright']['y'])
label = result['label']**
**frame= cv2.rectangle(frame, tl, br, color, 7)
frame= cv2.putText(frame, label, tl, cv2.FONT_HERSHEY_TRIPLEX, 1, (0,0,0), 2)**
** cv2.imshow('frame', frame)**
print('FPS {:1f}'.format(1/(time.time() -stime)))
**if cv2.waitKey(1) & 0xFF == ord('q'):
break**
else:
break
**cap.release()
cv2.destroyAllWindows()**
从视频文件中检测目标
从视频文件中检测对象的代码基本相同,唯一的变化是我们向 VideoCapture 提供了一个视频文件名。
要退出并释放捕获,请按 q
import cv2
from darkflow.net.build import TFNet
import matplotlib.pyplot as plt
import numpy as np
import timeoptions = {
'model': 'cfg/yolo.cfg',
'load': 'bin/yolov2.weights',
'threshold': 0.3
}
tfnet = TFNet(options)**cap = cv2.VideoCapture('video.mp4')**
colors=[tuple(255 * np.random.rand(3)) for i in range(5)]while(cap.isOpened()):
stime= time.time()
ret, frame = cap.read()
results = tfnet.return_predict(frame)
if ret:
for color, result in zip(colors, results):
tl = (result['topleft']['x'], result['topleft']['y'])
br = (result['bottomright']['x'], result['bottomright']['y'])
label = result['label']
frame= cv2.rectangle(frame, tl, br, color, 7)
frame= cv2.putText(frame, label, tl, cv2.FONT_HERSHEY_TRIPLEX, 1, (0,0,0), 2)
cv2.imshow('frame', frame)
print('FPS {:1f}'.format(1/(time.time() -stime)))
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
从 youtube 视频中检测物体
要阅读 youtube 视频,我们需要安装两个库
- Pafy : Python 库,用于下载 YouTube 内容和检索元数据**。**
- youtube_dl : 允许从 YouTube.com 和其他视频网站下载视频
在 Anaconda 提示符下安装库
pip install pafy
pip install --upgrade youtube_dl
导入所需的库
import pafy
import cv2
from darkflow.net.build import TFNet
import matplotlib.pyplot as plt
import numpy as np
import time
使用 pafy 下载带有元数据的 youtube 视频
**url = '**[**https://www.youtube.com/watch?v=_iiOEQOtBlQ**](https://www.youtube.com/watch?v=eWZscjTlZKg)**'
vPafy = pafy.new(url)
play = vPafy.getbest(preftype="webm")**
print(play.url)
最后,我们进行视频捕获,并将 youtube 视频的元数据作为参数传递给视频捕获。其余的代码保持不变
**options = {
'model': 'cfg/yolo.cfg',
'load': 'bin/yolov2.weights',
'threshold': 0.3
}**
**tfnet = TFNet(options)**
**cap = cv2.VideoCapture(play.url)**
colors=[tuple(255 * np.random.rand(3)) for i in range(5)]
while(cap.isOpened()):
stime= time.time()
ret, frame = cap.read()
results = tfnet.return_predict(frame)
if ret:
for color, result in zip(colors, results):
tl = (result['topleft']['x'], result['topleft']['y'])
br = (result['bottomright']['x'], result['bottomright']['y'])
label = result['label']
frame= cv2.rectangle(frame, tl, br, color, 7)
frame= cv2.putText(frame, label, tl, cv2.FONT_HERSHEY_TRIPLEX, 1, (0,0,0), 2)
cv2.imshow('frame', frame)
print('FPS {:1f}'.format(1/(time.time() -stime)))
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
参考资料:
[## Pafy 文档- pafy 0.3.70 文档
这是 Pafy 的文档——一个 Python 库,用于下载 YouTube 内容和检索元数据快速入门…
pythonhosted.org](https://pythonhosted.org/Pafy/) [## 视频入门- OpenCV-Python 教程 1 文档
学会看视频,显示视频,保存视频。学会从相机捕捉并显示它。你会学到这些…
opencv-python-tutro als . readthedocs . io](https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html)
刷牙可能比你想象的更“忙”
利用数据科学的力量实现日常生活活动(ADL)的价值
你醒了。你刷牙。听起来很平凡。但是像刷牙这样的活动会产生大量的数据。有了这些数据,我们可以看到,即使是像刷牙这样平凡的活动也可能是“忙碌”或“忙乱”的活动。在这篇文章中,我们将使用数据科学来看看刷牙和走路相比有多忙
在数据科学世界中,诸如刷牙、爬楼梯、梳头、下楼、喝水、躺下、走路等日常活动被称为日常生活活动(ADL)。利用诸如腕戴式加速度计之类技术,可以非常精确地测量这些活动
在本文中,我们将分析这样一个加速度计数据集,看看数据科学如何帮助我们回答一些关于日常活动的有趣问题。
要说明的数据集
此处使用的数据集来自 UCI 数据集(Dua,d .和 Graff,C. (2019))。UCI 机器学习知识库[http://archive . ics . UCI . edu/ml]。加州欧文:加州大学信息与计算机科学学院)
数据集包含从腕戴式加速度计收集的数据。加速度计是一种用于测量加速力的机电设备。加速度是速度变化的度量,或速度除以时间。加速度计可以测量三个方向的加速度。对于一个人来说,X 方向是沿前后方向的加速度。Y 方向是侧向加速度,Z 方向是上下方向的加速度
Accelerometer direction from human perspective
问题:日常活动数据是什么样的
我们知道自己所有的活动,比如刷牙或走路。但是加速度计的数据是什么样的呢?为了直观显示这些数据,我们可以用线图来绘制。在下图中,我们看到行走和刷牙活动在 X,Y,Z 方向上的加速度。
Accelerometer data while walking
我们观察到 X 方向的图形比 Y 方向有更多的变化。这是因为当我们走路时,我们不怎么侧向移动
刷牙的加速度图如下所示。
Accelerometer data while brushing teeth
我们看到,与走路相比,刷牙的图形在某些部分非常密集。这是因为与行走相比,刷牙活动具有更大的加速度
问题:数据能证明刷牙是比走路更快的活动吗
为了回答这个问题,我们需要了解如何衡量“快”。当数据是一个时间序列时,“牢度”可以用频率来衡量。频率是单位时间内重复事件发生的次数。
从步行的角度来看,频率意味着在给定时间内行走的步数。从刷牙的角度来看,频率意味着在给定时间内刷的次数。
将时间序列数据转换成频率可以通过称为傅立叶变换的算法。
为简单起见,我们只考虑 X 方向的加速度计数据。让我们获取 X 方向的行走加速度计数据,并使用傅立叶变换算法将其转换为频率。结果看起来像这样
Fourier transformation of walking data
对于行走时间序列数据,傅立叶变换表明,出现的频率大部分是低频。这意味着在行走过程中,在给定时间内走的步数相对较少。
傅立叶变换也给出了频率的振幅。振幅是频率的大小。对于行走来说,这可能与步伐的大小有关。例如,你可以在给定的时间内走 5 大步或 5 小步。频率相同(5 步),但小步走的幅度小于大步走的幅度
对刷牙的类似分析表明,存在低频和高频。
Fourier Transformation of brushing data
正如我们看到刷牙涉及高频率,我们可以得出结论,刷牙比走路快
问题:与走路相比,刷牙有多“忙”
数据证明刷牙比走路更快。但是与走路相比,刷牙有多“忙”或“忙乱”
为了回答这个问题,我们需要一个表示活动“繁忙”程度的数字。一种可能的方法是既看到频率的振幅,也看到频率的长度。从行走的角度来看,这意味着一个人走得有多快,走多长时间以及步子的长度。从刷牙的角度来看,这意味着一次刷牙的速度有多快,每次刷牙的时间有多长。从数据科学的角度来看,这被称为频率的次方。还需要计算所有频率的功率。计算频率功率的算法叫做韦尔奇算法****
频率与功率的关系曲线被称为频谱图
Power Spectrogram of Walking and Brushing
频谱曲线下的总面积也是所有频率的总功率。曲线下的面积可以用辛普森法则计算。
我们看到行走的总动力是 13.5,刷牙的总动力是 95.1。所以刷牙是 95.1 / 13.5 = 7 倍“忙”然后走路
所以下一次当你刷牙的时候,即使你仍然很困,你仍然比在花园里散步还要“忙”7 倍
额外资源
网站(全球资讯网的主机站)
你可以访问我的网站进行零编码分析。https://experiencedatascience.com
请订阅每当我发布一个新的故事时,请保持通知。
[## 每当 Pranay Dave 发表文章时,您都会收到电子邮件。
每当 Pranay Dave 发表文章时,您都会收到电子邮件。通过注册,您将创建一个中型帐户,如果您还没有…
pranay-dave9.medium.com](https://pranay-dave9.medium.com/subscribe)
你也可以通过我的推荐链接加入 Medium。
[## 通过我的推荐链接加入 Medium—Pranay Dave
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
pranay-dave9.medium.com](https://pranay-dave9.medium.com/membership)
Youtube 频道
这里是我的 Youtube 频道的链接
【https://www.youtube.com/c/DataScienceDemonstrated
你在推特上说什么就是什么
通过 Twitter 使用检测社交媒体中的抑郁症
通过分析社交媒体帖子中的语言标记,有可能创建一个深度学习模型,该模型可以比传统方法更早地让个人了解他或她的心理健康。
超过 3 亿人患有抑郁症,其中只有一小部分人接受了适当的治疗。抑郁症是全球残疾的主要原因,每年有近 80 万人死于自杀。自杀是 15-29 岁人群的第二大死因。抑郁症的诊断(和随后的治疗)经常被延迟、不精确和/或完全错过。
事情不一定是这样的。
社交媒体为转变早期抑郁症干预服务提供了前所未有的机会,特别是在年轻人中。
每秒钟,Twitter 上大约有 6000 条推文,相当于每分钟发送 35 万条推文,每天 5 亿条推文,每年约 2000 亿条推文。
皮尤研究中心指出,目前,72%的公众使用某种类型的社交媒体。
Photo by rawpixel.com from Pexels
因为抑郁症是一种经常需要自我报告症状的疾病,社交媒体帖子提供了丰富的数据和信息来源,可用于训练有效的模型。
抑郁检测
这个想法是创建一个项目,旨在捕捉和分析与抑郁症状的发作和持续相关的语言标记,以便建立一个可以有效预测抑郁的算法。推进推文中的语言标记可以用来构建统计模型的想法,这些模型可以检测甚至预测抑郁症,可以补充和扩展传统的诊断方法。
建立一种可以分析表现出自我评估抑郁特征的推文的算法,可以让个人、父母、护理人员和医疗专业人员分析社交媒体帖子,以寻找语言线索,这些线索标志着精神健康状况恶化,远远早于传统方法。分析社交媒体帖子中的语言标记可以进行低调的评估,这种评估可以补充传统服务,并允许更早地意识到抑郁迹象。
Photo by Úrsula Madariaga from Pexels
虽然之前许多关于抑郁症相关社交媒体帖子的研究都依赖于脸书,但很少有人关注 Twitter 内容。然而,这两个平台之间的关键差异导致了独特的不同内容,而 Twitter 内容具有独特的价值。
虽然脸书用户经常用真名向朋友和家人发帖,但 Twitter 用户经常使用假名,更有可能与他们从未见过面的用户联系。这允许一种更匿名的交流方式,它可以提供一种对个人思想和经历的更少偏见的描述。
Twitter 还提供了通常不太可能参与心理健康相关研究的广大用户群体,以及广泛的公共可用信息,提供了克服传统数据收集方法的一些限制的方法。
语言和活动的变化一直与社交媒体上的活动变化相关。社交媒体帖子中使用的情感语言和语言特征已被证明可以表明重度抑郁症的情感特征。人们一贯使用 Twitter 等社交媒体平台,以书面形式分享他们的想法和观点。
Twitter 上的帖子对分析特别有用,因为它们最常见于日常活动和事件中。这为捕捉与个人的思维、情绪、社交、交流和活动相关的行为属性提供了丰富和一致的方法。
Photo by Adrien Olichon from Pexels
在过去的几年里,人们对使用社交媒体作为公共卫生工具的兴趣越来越大,从识别流感症状的传播到基于 Twitter 帖子建立对疾病的见解。然而,使用社交媒体分析行为健康障碍的研究仍处于起步阶段。
Park 等人*(见下文参考文献)*,发现了人们在社交媒体上发布自己抑郁甚至治疗的证据。Eichstaedt 等人在病历中发现脸书语可以预测抑郁症。De Choudhury 等人研究了新妈妈产后变化的语言和情绪相关因素,并建立了一个统计模型,仅使用产前观察来预测极端的产后行为变化。Reece 等人开发了计算模型来预测 Twitter 用户中创伤后应激障碍的出现。这突出了社交媒体作为关于当前或未来抑郁症发作可能性的信号来源的潜力。
该项目旨在扩大基于社交媒体的心理健康措施的范围,并使用已证明抑郁症和特定语言特征之间相关性的现有研究,以建立一种可以预测基于文本的抑郁症迹象的算法。
使用语言标记作为分析和诊断抑郁症的工具具有巨大的潜力。即使不使用复杂的模型,抑郁症也能很快在文本中显现出来。仅仅通过收集、清理和处理可用数据,视觉分析就可以阐明随机推文和具有抑郁特征的推文之间的差异。
一旦这个项目的推文被清理,通过用清理过的推文创建一个单词云,就很容易看出两个数据集之间的差异。这两个数据集之间的差异显而易见:
随机推文
有抑郁特征的推特
语言分析在精神健康领域的潜力不能被夸大。通过分析一个人的话语,你可以清楚而有价值地了解他或她的精神状态。
即使是对社交媒体最简单的分析,也能让我们前所未有地了解个人的想法和感受,并导致对心理健康更深入的理解和治疗。
构建模型
在决定研究心理健康和社交媒体之间的联系后,开始这一过程的最有效方式显然是专门关注心理健康的一个领域和一个社交媒体平台。因为抑郁症是一个如此广泛的问题,所以关注抑郁症及其相关研究是最有意义的。
虽然脸书已经被反复研究过,也有大量关于使用脸书帖子来检测和分析心理健康的信息,但 Twitter 似乎是一个更有趣的使用平台。推特和脸书的帖子有着本质的不同。他们更匿名,更短,更快,更有可能在整个白天和晚上快速制作。此外,Twitter 数据很容易作为现有数据集获得,如果需要的话,很容易抓取甚至流式传输。
Photo by Kat Jayne from Pexels
一旦决定使用 Twitter,找到(或创建)最佳数据就是下一个需要解决的问题。现有的数据集包含随机推文和针对情绪分析的推文,但情绪分析本身与抑郁症分析不是一回事。
因为没有公开可用的包含“抑郁”推文的数据集,很明显我必须创建自己的数据集。我想到的第一个方法是使用 Tweepy ,但是 Tweepy 需要一个开发者账户,这意味着用户需要申请一个 Twitter 开发者账户。我想确保这个模型可以被任何有兴趣的人轻易复制。
经过进一步研究, TWINT 竟然是最优解。TWINT 允许任何用户以各种方式搜索和抓取推文,并收集和存储它们。
当时的问题变成了,是什么让 发了一条表示抑郁的推文?一些研究论文着眼于抑郁症的词汇标记,它们都同意一些观点。患有抑郁症的人经常下意识地使用非常特定的语言标记来表示抑郁。建立一个包含这些术语的字典并给它们单独的权重是可能的,但在阅读了一些与抑郁症、心理健康和语言学相关的论文后,很明显抑郁症是最常自我报告的,至少在最初是自我评估的。因此,如果一个人说她抑郁,那她极有可能就是抑郁。
Photo by Alexander Krivitskiy from Pexels
此外,像“绝望”、“孤独”和“自杀”这样的词总是与患有抑郁症的人联系在一起,就像人们提到特定的药物治疗一样,甚至一般是“抗抑郁药物”。虽然有可能建立包含抑郁症特有的所有词汇特征的字典,包括特定术语、人称代词使用的增加、宗教参考的增加、一天中的时间分析等等,但似乎通过抓取按非常特定的术语搜索的推文,这些推文可能包含一个好的模型需要学习的所有词汇特征,并变得既健壮又准确。
在使用 TWINT 随机收集了 24 小时的推文后,这些数据被合并成一个数据集。这些推文被手动清理(例如,删除提及经济和环境而不是情绪抑郁的内容),然后被清理和处理。
下一个问题涉及分类器的选择。有很多方法可以分析这些信息,但现实是心理健康,特别是抑郁症,是一个主观而复杂的话题。虽然有可能根据一条推文来量化一个人的抑郁程度,但对于这个项目来说,唯一真正重要的问题是,一个人是否表现出抑郁的语言标记?知道了这个问题和精神疾病的主观本质,二元分类模型对这个项目来说是最有意义的。
虽然逻辑回归模型作为基准模型是有意义的,但长期短期记忆网络(LSTM)模型最终成为手头项目最稳健的模型。递归神经网络允许信息从网络的一个步骤传递到另一个步骤,是序列、列表和其他语言处理问题的理想选择。LSTM 能够学习长期的依赖关系,并且在各种各样的问题上工作得非常出色。虽然 rnn 在长期依赖性方面有困难,但是 LSTMs 被明确地设计来避免长期依赖性问题。
增加一个卷积层也是有意义的。卷积神经网络(CNN)非常适合从数据中学习空间结构,并从传递到 LSTM 层的顺序数据中学习结构。
利用 Word2vec 也使得模型更加健壮。Word2vec 是一个处理文本的双层神经网络。它的输入是一个文本语料库,输出是一组向量。它把文本变成深度网可以理解的数字形式。Word2vec 在 vectorspace 中将相似单词的向量组合在一起。它能够从数学上发现相似之处。给定足够的数据、用法和上下文,它可以根据过去的表现高度准确地猜测单词的意思。这些猜测可以用来建立一个单词与其他单词的联系。Word2vec 神经网络的输出是一个词汇,其中每个项目都有一个向量,可以输入到深度学习网络中。
LSTM + CNN 模型接受一个输入,然后输出一个数字,代表该推文表明抑郁症的概率。该模型接受每个输入句子,用其嵌入内容替换它,然后通过卷积层运行新的嵌入向量。卷积层将它从顺序数据中学习到的结构传递到 LSTM 层。然后,LSTM 层的输出被输入到密集模型中进行预测。
一旦设计并构建了模型,问题就变成了优化模型以获得最佳结果。最初,该模型遭受过拟合,如图所示。然而,通过降低模型的复杂性和增加漏失,实现了更稳健的模型,并且消除了过度拟合的证据。
该模型的数据分为 60%的训练集、20%的验证集和 20%的测试集。测试集一直保持独立,直到最后,以确保模型的准确性。通过查看准确性和分类报告来分析最终结果。
选择最终的架构、参数和超参数是因为它们在所有尝试的组合中表现最佳。LSTM 模型接受标记化的推文,并将它们送入嵌入层,以获得嵌入向量。该模型接受一个输入,然后输出一个数字,代表该推文表明抑郁症的概率。该模型接受每个输入推文,用其嵌入内容替换它,然后通过卷积层运行新的嵌入向量,这非常适合从数据中学习空间结构。卷积层利用这一点,从顺序数据中学习结构,然后将其传递到标准 LSTM 层。LSTM 层的输出被输入到用于预测的密集模型中。该模型具有嵌入层、卷积层和密集层,并且在第一层中使用最大池、0.5 的下降、二进制交叉熵损失、Nadam 优化器和 ReLu 激活函数,在密集层中使用 sigmoid 激活函数。准确性和损失被记录和可视化,并与基准逻辑回归模型进行比较。
成功!
该模型具有 97%的准确性,证明是一个准确且稳健的模型,对于进一步的开发和使用应该是有效的*。*
Photo by Marcin Dampc from Pexels
感谢阅读!和往常一样,如果你用这些信息做了什么酷的事情,请在下面的评论中让每个人都知道,或者联系 LinkedIn !
寻找更多的想法?
通过清理和预处理您的数据,让您的模型从不起眼到令人惊叹
towardsdatascience.com](/ultimate-beginners-guide-to-scraping-and-cleaning-twitter-data-a64e4aaa9343) [## 数据科学入门终极指南
我是如何在不到 6 个月的时间里获得数据科学工作机会的
towardsdatascience.com](/the-ultimate-guide-to-getting-started-in-data-science-234149684ef7) [## 现在如何开始数据科学:10 篇顶级文章和一个想法
今年对于网络来说是艰难的一年。
towardsdatascience.com](/how-to-get-started-in-data-science-now-10-top-articles-and-one-idea-d9d28ee34cca)
参考
在此了解更多信息!
抑郁症是一种世界范围内的常见疾病,有超过 3 亿人受到影响。抑郁症不同于…
www.who.int](https://www.who.int/news-room/fact-sheets/detail/depression) [## Twitter 使用统计
平均每秒钟,大约有 6000 条推文在 Twitter 上发布(在这里可视化它们),这相当于超过…
www.internetlivestats.com](https://www.internetlivestats.com/twitter-statistics/) [## 美国社交媒体用户的人口统计和采用情况
更多信息:互联网/宽带|移动技术今天,大约 70%的美国人使用社交媒体…
www.pewinternet.org](https://www.pewinternet.org/fact-sheet/social-media/) [## 用推特数据预测精神疾病的发病和病程
我们开发了计算模型来预测推特上抑郁症和创伤后应激障碍的出现…
www.nature.com](https://www.nature.com/articles/s41598-017-12961-9) [## 用于传染病爆发早期检测的社交网络传感器
目前检测传染病爆发的方法提供了关于传染病过程的同期信息。
journals.plos.org](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0012948) [## 脸书语在医疗记录中预测抑郁症
抑郁症是致残和可治疗的,但诊断不足。在这项研究中,我们表明,同意分享的内容…
www.pnas.org](https://www.pnas.org/content/115/44/11203) [## 通过社交媒体预测产后情绪和行为的变化——微软研究
我们认为社交媒体是一个很有前途的公共卫生工具,重点是使用 Twitter 帖子来建立…
www.microsoft.com](https://www.microsoft.com/en-us/research/publication/predicting-postpartum-changes-emotion-behavior-via-social-media/) [## 用推特数据预测精神疾病的发病和病程
我们开发了计算模型来预测推特上抑郁症和创伤后应激障碍的出现…
www.nature.com](https://www.nature.com/articles/s41598-017-12961-9) [## 利用神经网络和语言学元数据早期检测抑郁症的迹象…
抑郁症被列为全球残疾的最大原因,也是自杀的主要原因。还是…
www.groundai.com](https://www.groundai.com/project/utilizing-neural-networks-and-linguistic-metadata-for-early-detection-of-depression-indications-in-text-sequences/)
你可以用 tkinter 管理雪茄
用例
下面是如何使用 Python 最流行的 GUI 包 tkinter 创建数据管理系统
Photo by Joris Visser on Unsplash
愿你长命百岁。
我的一个好朋友是雪茄爱好者。他有一个 excel 电子表格来管理他的雪茄(顺便说一句,这个电子表格太棒了——方块会改变颜色,让他知道某个盒子已经准备好让他抽了)。但也有一些问题,比如输入不标准,现在他的收藏越来越多,不方便了解他的收藏,等等。所以我决定用 Python 为他创建一个雪茄管理系统,以便更好地组织和分析他壮观的收藏。
在我们开始之前,这里有一些基本的环境信息:
IDE:Jupyter Lab 包: tkinter,pandas Python 版本: 3.7 硬件:Macbook Pro 13”(2018)
在设计方面,原型 1.0 系统主要分为两个部分:记录维护和总结概述。我们有用于记录维护的导入数据和插入数据选项;查看数据、摘要图表和准备吸烟选项以进行摘要概述。
主要的
首先,让我们导入tkinter
和pandas
包并设置main
函数。在main
功能中,将根据用户从菜单中的选择调用其他功能。
main function
菜单
下一步是使用tkinter
在menu
功能中设置菜单。for
循环用于从菜单选项列表中提供文本参数。我选择了Radiobutton
而不是常规的Button
,因为Radiobutton
一次只允许用户选择一个Radiobutton
。indicatoron
(代表“指示器开启”)选项设置为 0(默认为 1),这意味着没有单独的单选按钮指示器。因此,我们可以让Radiobutton
看起来像一个普通的按钮,而不是让Radiobutton
有包含空白的圆孔。
menu function
Radiobutton with indicatoron set to 0
对于tkinter
中的配色方案,这个图表是一个很好的参考。
tkinter color chart
输入数据
因为我们的用户已经有了很好的数据集合,所以让用户导入他的原始数据集。在import_cigar
功能中,用户可以从计算机中选择一个文件并完成导入。如果雪茄 _ 文件. xlsx 已经存在,这个新文件将与它串接;如果雪茄 _ 文件. xlsx 不存在,它将被创建,来自用户选择文件的数据将被添加到其中。
import_cigar function
Select a file
cigar folder
插入数据
用户也可以通过选择“1”来插入新的雪茄记录。从菜单中插入“。该功能通过tkinter
中的Label
和Entry
模块实现。一旦用户填写完该表格并点击“OK”按钮,记录将自动保存到雪茄 _ 文件. xlsx 中作为新的一行。
insert_cigar function
图像数据
如果用户想查看完整的数据,他们可以选择“2。查看”选项,并快速查看数据。
view_cigar function
简单图表
charts_cigar function
我在这里只创建了两个简单的图表,但重点是我们手中有plt
或其他软件包的能力来创建可视化并使用tkinter
显示它们。
Simple Cigar Charts
准备好抽烟了吗
最后,我们来找准备抽的雪茄吧!真正的规则比这更复杂,但是现在,我们只能说如果雪茄在雪茄盒里超过 3 年,它就可以抽了。
Ready to Smoke Cigars
所以,这是目前的原型 1.0!这个系统远非完美,有许多功能在未来会很好。但是我在大多数 GUI 应用程序中体验了tkinter
的乐趣,我的重点更多的是尝试不同类型的模块,而不是让它们变得漂亮。总的来说,我对这个强大的软件包很满意。它提供了许多可以玩的模块,而且非常容易使用。但是也有令人失望的地方,比如缺乏稳定性和可扩展性。
最后,这似乎是老生常谈,但是—
在
*tkinter*
中使用循环来精简你的代码。
cigar.py
感谢阅读。如果你想试试看,请看完整代码cigar.py
。如果你有任何意见或反馈,我期待着听到他们。
资源
通过深度学习,你现在可以用别人的声音说话了
想获得灵感?快来加入我的 超级行情快讯 。😎
文本到语音(TTS)合成指的是文本到音频的人工转换。人类仅仅通过阅读来完成这项任务。一个好的 TTS 系统的目标是让计算机自动完成这项工作。
当创建这样一个系统时,一个非常有趣的选择是选择哪个声音用于生成的音频。应该是男的还是女的?声音大还是声音小?
这在使用深度学习进行 TTS 时曾经是一个限制。你必须收集文本-语音对的数据集。录制该讲话的扬声器组是固定的——您不能拥有无限个扬声器!
所以,如果你想创造你的声音,或者其他人的声音,唯一的方法就是收集一个全新的数据集。
来自谷歌的人工智能研究昵称 声音克隆 使得计算机使用任何声音大声朗读成为可能。
声音克隆是如何工作的
很明显,为了让计算机能够用任何声音大声朗读,它需要以某种方式理解两件事:它在读什么和它如何读。
因此,谷歌的研究人员设计的声音克隆系统有两个输入:我们想要阅读的文本和我们想要阅读文本的声音样本。
例如,如果我们想让蝙蝠侠念出“我爱披萨”这句话,那么我们会给系统两个东西:写着“我爱披萨”的文本和蝙蝠侠声音的简短样本,这样它就知道蝙蝠侠应该是什么声音了。输出应该是蝙蝠侠说“我爱披萨”的声音!
从技术角度来看,该系统被分解为 3 个连续的组件:
(1)给定我们希望使用的语音的小音频样本,将语音波形编码成固定维度的向量表示
(2)给定一段文字,也将其编码成矢量表示。将语音和文本的两个向量合并,解码成一个声谱图
(3)使用声码器将声谱图转换成我们可以听到的音频波形。
Simplified version of the system. Original source
在本文中,这三个部分是独立训练的。
在过去的几年里,文本到语音系统在深度学习社区中得到了很多研究关注。事实上,有许多基于深度学习的文本到语音转换的解决方案都非常有效。
这里的关键是,系统能够从语音中获取扬声器编码器学习的“知识”,并将其应用到文本中。
语音和文本分别编码后,在公共嵌入空间中组合,然后一起解码生成最终的输出波形。
克隆声音的代码
感谢人工智能社区中开放源代码思想的美丽,在这里有一个公开的语音克隆实现!这是你如何使用它。
首先克隆存储库。
git clone [https://github.com/CorentinJ/Real-Time-Voice-Cloning.git](https://github.com/CorentinJ/Real-Time-Voice-Cloning.git)
安装所需的库。确保使用 Python 3:
pip3 install -r requirements.txt
在自述文件中,您还可以找到下载预训练模型和数据集的链接,以试用一些样本。
最后,您可以通过运行以下命令打开 GUI:
python demo_toolbox.py -d <datasets_root>
下面有一张我的照片。
正如你所看到的,我已经把我想让电脑在右边读的文本设置为:“你知道多伦多猛龙队是篮球冠军吗?篮球是一项伟大的运动。”
您可以单击每个部分下的“随机”按钮,随机选择语音输入,然后单击“加载”将语音输入加载到系统中。
数据集选择您将从中选择语音样本的数据集,说话者选择正在说话的人,话语选择由输入语音说出的短语。要听听输入的声音,只需点击“播放”。
一旦你按下“合成和语音编码”按钮,算法就会运行。一旦完成,你会听到输入扬声器大声朗读你的文本。
你甚至可以录下自己的声音作为输入,但点击“录制一个”按钮,这是一个非常有趣的游戏!
进一步阅读
如果你想了解更多关于算法如何工作的信息,你可以阅读谷歌的官方 NIPS 论文。在这里有一些更进一步的音频样本结果。我会高度克隆存储库,并尝试这个可怕的系统!
喜欢学习?
在 twitter 上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!也在 LinkedIn 上和我联系吧!
你不一定要被闪电击中才能赢得彩票
Photo by Michael D on Unsplash
几周前,在一次演讲中,有人问了我以下问题:
“靠玩彩票谋生的可能性有多大?”
你觉得不是很高?
在 2005 年,一群麻省理工学院的学生聚在一起,成立了一个赌博集团。他们找到了他们想赌的游戏,计算了赔率,并以自己的方式赢得了数百万美元的利润。对我们的问题说“是”的有力证据,他们是怎么做到的?
我们来谈谈几率吧
每当强力球的巨大体积跨越 5 亿美元大关时,文章就像雨后的毒菌一样冒出来,大声宣布彩票中奖的几率,嘲笑每个争相购买彩票的人。为了好玩,它们还包括你更有可能获胜的事情的概率,比如被闪电击中,被鲨鱼咬,或者被自动售货机压死。它们是有趣的读物,当你拿出一小部分辛苦赚来的钱去买彩票时,你会暗自发笑,因为“嘿,你永远不知道。”
但是如果你知道呢?更重要的是,你怎么知道?这些几率从何而来?嗯,如果你知道一点概率的话,计算中彩票的几率实际上是非常容易的。让我们来一次概率之旅,好吗?
我们用来计算彩票赔率的公式非常简单。它叫做二项式系数,看起来像这样:
The ! stands for factorial, not “Shout N really loud” — Pat Colburn, my 7th grade math teacher
忽略左边的大括号,关注右边实际的数学部分。二项式系数允许从更大的一组数字中计算出所有可能的数字组合。 n 代表较大的一组数字, x 代表我们希望从较大的一组数字中选出的较小的一组数字的大小。例如,如果我们要玩强力球,你必须先从 69 个可用号码中选择 5 个,然后从 26 个可能的强力球号码中选择 1 个。计算正确选择前 5 个数字的概率的公式是这样开始的:
If you’re wondering what happened, the 64!s cancel out.
这告诉我们,你有 11,238,513 个 5 个数字的可能组合,其中只有一个组合是正确的,因此我们得到正确的 5 个数字的概率是 11,238,513 中的 1。对于剩下的最后一个强力球,赔率的计算更简单,26 个号码中你只需要 1 个,所以我们的赔率是 26 个中的 1 个。要计算得到所有 5 个数字加上正确的强力球的总几率,我们只需将这些几率相乘,如下所示:
Or, 0.00000034223% for those that prefer seeing percentages
因此,为了赢得巨额头奖,你需要从 292,201,338 个可能的数字组合中选择幸运的 1,然后你就可以开始生活了!看起来有点渺茫,不是吗?有好消息和坏消息!多买彩票可以增加胜算!(注:多打不会增加赔率,但是多买某个抽奖的票 会增加那些赔率 !)
Powerball odds and prizes
例如,如果您购买了 2 张门票,那么您的赔率将是 292,201,338 张中的 2 张,或 146,100,669 张中的 1 张。你已经成功地把你的机会减半了!如果你买了 10 张彩票,那么你的赔率就会变成 29,220,134 中的 1!坏消息是,即使有十张票,赔率仍然不会给你带来任何好处。在玩强力球时,增加你在现实世界中的胜算的唯一方法是购买更多的门票。如果你买了 100,000 张票,你将成功地把你的赔率降低到 2,922 中的 1。然而,坏消息是,你已经支付了 20 万美元的门票,并花了几个小时填写这些表格,以确保你不会重复数字,并意外破坏了辛苦赢得的机会!你可能会因为匹配 4 和 5 而赢得一些较小的奖励,但对于较低的匹配,这些奖励会急剧下降,如果你只匹配了其中的 4 个数字,你最终会净损失。
那么这一切有什么意义呢?我们已经计算了几率,看起来他们真的很差劲。这个博客的重点不就是用概率来玩彩票吗?如果我给你看的只是你可能会输的方式,那还有什么意义呢?每个彩票都是不同的,基于组织的目标和游戏的受欢迎程度。如果你找到了正确的游戏规则和赔率,你可以让这为你工作。
玩正确的游戏
2005 年,一群麻省理工学院的学生发现了他们的游戏。这个游戏的名字是马萨诸塞州现金彩票,其特色是一个被称为“滚下来”的规则。在滚下型游戏中,累积奖金通常以固定金额为上限。在马萨诸塞州,上限设定为 200 万美元。如果累积奖金增长到 200 万美元或以上,并且没有人赢,整个累积奖金将“滚下”到较低等级的比赛,通常以奖金的形式支付给每一个连续等级的比赛。因此,举例来说,如果在没有头奖得主的情况下触发了 200 万美元的滚动,彩票将分解这 200 万美元,并将其支付给在他们已经有权获得的奖金基础上匹配 3、4 或 5 个号码的玩家。这使得这个游戏非常有吸引力,因为在滚下来的过程中,你可能会增加 550%的回报,而仍然不必击败更长的累积奖金赔率。
让我们看看那些赔率,好吗?Winfall 游戏要求你从 46 个可能的数字中选择 6 个。由于我们方便的二项式系数公式告诉我们,你有***【1】9,366,819 的几率赢得头奖。**然而,对于 6 个中的 5 个,你的胜算更大,1370754 个中的 1 个。如果你得到了 6 分中的 4 分?163185 人中的 1 人。让我们不要忘记通过购买更多的票来增加我们成功机会的策略。如果我们买了 500 张票,我们会增加成功的机会,比如说, 中的118,734** 换 6 张票, 1 中的2742换 5 张票, 1 让我们来看看这可能会如何发展:*
Special thanks to Brian, Rob and Yish for helping me figure out the math.
如你所见,即使我们买了 5000 张彩票,我们中头奖的几率仍然很低,但是 2、3、4 和 5 张彩票看起来相当不错!在普通彩票中,这并不意味着什么,安慰奖通常很低,不值得额外购买彩票。然而,随着滚动下降,每张票承载着更多的潜在利润!从 2,000,000 美元的累积奖金按比例分配到较低的层级,将导致 13,000 到 11,000 倍于您的门票初始成本的支出,具体取决于您匹配了多少张彩票!知道了这一点,学生们相应地加倍努力,以确保他们能够承受的赔率。他们不是为了头奖而射击,而是为了更容易的低挂水果,仍然疯狂盈利的 3,4 和 5 匹配。这些提供了更好的赔率,学生们只在滚降期玩,这时他们可以最大化他们赌注的利润。
下面是马萨诸塞州监察长办公室对这个麻省理工学院团体的博彩策略进行的统计:
Total profit of $25,640 less expenses, for the week of Feb 8th.
看那个!中奖的 5 张彩票将返回 22,096 美元,其中 1 张不仅可以支付中奖彩票的费用,还可以支付超过 11,000 张其他未中奖彩票的费用。一个中奖的 4 选将覆盖超过 400 个失败者,一个中奖的 3 选将覆盖 13 个失败者。赢家的潜在交易量加在一起,将超过潜在输家,在下跌触发的那一周,他们的净收益估计为 25,640 美元!
使用这种策略,据估计麻省理工学院集团在 6 年的运营中赚了大约 800 万美元,产生了大约 15-20%的投资回报。然而,这并不全是娱乐和游戏。大量的时间和精力不仅花费在购买这些成千上万的彩票上,还花费在费力地手工填写算法生成的号码,然后手工检查每张彩票以找出中奖者。
最终,这种特殊的肥缺结束了,它必须结束。当时的彩票官员满足于对他们的游戏不同寻常的受欢迎程度睁一只眼闭一只眼,因为彩票受益于门票销售。无论支付多少,持有彩票的组织仍然通过设计赚钱。然而,一旦关于这些辛迪加的消息传出,大量的宣传就来了,随着这些宣传的增加,他们的大下注习惯降低了单个玩家获胜的几率(事实并非如此)的看法降低了其他玩家的受欢迎程度。普通玩家只是觉得他们的门票购买只对少数有组织的玩家有利,他们有时间和资源来提高他们的赔率。
此外,宣传还吸引了其他志同道合的辛迪加的注意,减少回报带来了潜在支出的减少,因为它们以更多的方式分享。到 2011 年,官员们开始通过减少大量购票的规则,最终在 2012 年完全关闭了这项运动。
那么我们学到了什么?
有了正确的赔率和正确的游戏,我们知道你可以在彩票中获利。一旦数学问题解决了,只要你愿意投入时间和工作,而且大部分工作只是关于人力,你靠买彩票谋生的几率实际上是相当可观的。
这背后实际上有更多的数学计算,计算每张票的期望值,找到正确的数字组合来进一步增加你的胜算。但是,通过在一场比正常支付更好的游戏中控制赔率为 2、3、4 或 5,麻省理工学院的学生能够确保他们赢的赔率超过 45 分之一,即使它不是头奖。这远远好于比方说,在一手扑克的开局中拿到一张皇家同花顺(649,739 中的 1),与超级模特约会(88 万中的 1),被闪电击中(100 万中的 1),或者被鲨鱼攻击(1150 万中的 1)。
来源:
我知道。彩票中奖开启了全新生活的大门。一种你永远不用担心债务的生活…
lotterycodex.com](https://lotterycodex.com/how-to-win-the-lottery-mathematically/)
https://www . mass . gov/files/documents/2016/08/vv/lottery-cash-winfall-letter-July-2012 . pdf
http://www . Fla lottery . com/expt kt/PWR ball-odds . pdf # target text = power ball % 20 error % 20 by % 20 multiplying % 20 these,或%201%20chance%20in%20579.76。&target text = Step %201% 3A %20 计算% 20 数字,从% 2069% 20 唯一% 20 数字中提取% 20。
https://www.lotteryusa.com/powerball/
在 LinkedIn 上与我联系!
[## 汉密尔顿·张,CRPC·CSPO-熨斗学校-纽约,纽约| LinkedIn
具有财务规划背景的数据科学家和机器学习工程师。我有专家级的知识…
www.linkedin.com](https://www.linkedin.com/in/hamilton-chang-crpc%C2%AE/)**
你不需要很多机器学习的专业知识就可以开始
机器学习的个人方法👩🏻🚀 👨🏻🚀 🚀
Photo by Tim Mossholder on Unsplash
不要害怕从机器学习(ML)开始,不需要几年的理论学习就能入门。但是你必须学习很多年才能始终保持在当前技术的顶端。
我知道你和每个人可能有不同的学习方式。这篇文章应该揭开你如何开始机器学习的过程,没有太多压倒性的技术术语。我建议你遵循我的文章,自己实现所有的事情。
当你开始学习机器学习时,会有大量的信息冲击着你。
Photo by Michael D Beckwith on Unsplash
人工智能、准确性、激活函数、反向传播、批量、偏差、聚类、混淆矩阵、卷积层、数据分析、决策树、深度学习、密集、维度、估计器、假阴性、假阳性、假阳性率、特征、特征列、特征交叉、特征工程、特征提取、特征集、特征规格、特征向量、前馈神经网络、少击学习、全 softmax、全连接层、生成式对抗网络(GAN)、泛化、泛化曲线、广义线性模型、生成模型、生成器、梯度、梯度裁剪、梯度下降、图形、地面实况、组 隐藏层、分层聚类、铰链损失、超参数、超平面、图像识别、不平衡数据集、推理、输入函数、输入层、可解释性、Keras、核支持向量机(KSVMs)、k 均值、k 中值、标签、带标签的示例、层、学习率、线性回归、逻辑回归、损失、损失曲线、机器学习、矩阵分解、均方误差(MSE)、小批量、MNIST、模型、模型函数、模型训练、多类分类、NaN 陷阱、自然语言理解、欠采样负类、神经网络、神经元、N 优化器、离群值、输出层、过拟合、过采样、熊猫、参数、参数更新、感知器、性能、困惑、管道、池化、正类、精度、预测、预测偏差、预制估计器、预训练模型、分位数存储、随机森林、等级、召回、推荐系统、递归神经网络、回归模型、强化学习、缩放、scikit-learn、半监督学习、sigmoid 函数、softmax、稀疏表示、平方损失、步长、步长、监督机器学习、张量、张量板、张量流、张量流服务、张量处理 示例,训练,迁移学习,三元模型,真阴性(TN),真阳性(TP),真阳性率(TPR),欠拟合,无标签示例,无监督机器学习,上加权,验证集,权重,宽度
构建您自己的文档
如果你不能马上知道所有的答案,那完全没问题🤯像编程一样,你总是可以使用文档来获得你所需要的信息。
技巧 1:建立自己的文档来解决这个机器学习术语列表,并在学习时添加您的个人笔记。
如果你对一个题目不理解,或者你觉得不够自信,就记笔记。
看看我的机器学习笔记,了解一下我在说什么。每当你纠结于一个术语或者你有一个问题的时候,添加一页。你的未来你会感谢你的。
My machine learning notebook notion.so
我知道对于你应该如何开始仍然没有明确的答案,但是我们将很快改变它。
学习 Python
你可能知道,如果你想做机器学习,开发专业知识是必须的。Python 总是一个好的选择,如果你想在云中训练你的模型,有一个大的社区,大量的工具和例子以及广泛的支持。
技巧 2:熟悉 Python,使用 TensorFlow 创建机器学习模型。
获取您自己的数据
到目前为止,你知道如何管理学习过程,以及你想使用哪种语言。下一步是什么?没错,数据我们需要数据,而且我们需要大量的数据。
在网上几乎所有的入门示例中,你都会用到一个常见的 MNIST 数据集,要么是时尚数据集(由 Zalando Research 的研究人员制作),要么是数字数据集。如果你在其中一个上训练一个模型,你可能会达到相当好的结果,但是你错过了很多练习。
相反,创建您自己的数据集,您将学习如何收集、存储和处理大型数据集。
Data example
技巧 3:学习如何处理自己的数据是一项重要的技能,在现实世界的应用程序中是必需的。从一个简单的例子开始,收集带有相应标签的文本,并将其保存在 csv 中。这可能是来自 StackOverflow 的带有相应标签的文本。基于给定的文本,你想要预测编程语言。有这么多可能性,选一个吧。
学会理解你的数据
从数据集中提取洞察有助于理解数据。这是在 Jupyter 笔记本上熟悉熊猫和剧情的绝佳时机。
问问你自己你想知道的关于数据集的任何事情。
- 我的数据集中有什么样的数据?
- 有多少节课?
- 数据是如何平衡的?
- 以及更多的问题,要有创意
环境
一切从你的机器学习环境开始。这可以在您的本地机器上,也可以在云中。你的机器学习环境是那种你安装所有你需要的工具的地方。
其中一个本地环境是用于数据科学和机器学习的 Anaconda。或者,如果您喜欢免费使用且无需设置的基于云的环境,请使用联合实验室。
使用现有技术
我希望你在开始在 TensorFlow 中构建定制的机器学习模型之前使用 AutoML。你可能会问*“为什么是 AutoML 或者什么是 AutoML”,这是很好的问题。*
使用 AutoML,您可以在几个小时内归档好的机器学习结果,而不是几周或几个月。AutoML 去掉了一堆需要时间和知识的步骤。
例如数据分割(训练和测试)、编码、嵌入、评估不同架构、超参数调整等等,所有这些都是自动完成的。有不同类型的 AutoML 产品,为了简单起见,我们保持简单,继续使用 Google AutoML 。
这听起来很简单,上传你的训练数据,开始训练,抓住一个☕,直到训练结束。
如果完成了,您可以评估结果,这是一个很好的学习不同评估指标的机会,如精确度和召回率,或者如何解释混淆矩阵。更好的是,你已经有了一个生产就绪的机器学习模型。谷歌为你提供了一个直接的端点来进行预测。
谷歌提供不同类型的 AutoML 产品 AutoML 自然语言、AutoML 视觉、AutoML 翻译、AutoML 表格更多即将推出
ヽ(•‿•)ノ.
[## 云自动|自动|谷歌云
谷歌云提供安全、开放、智能和变革性的工具,帮助企业实现现代化,以适应当今的…
cloud.google.com](https://cloud.google.com/automl/docs/)
有一件事你也要考虑。真的需要训练一个机器学习模型吗?或者,您可以使用现有的 API 和预先训练的模型来解决您的问题吗?有很多现成的API可以使用。
技巧 4:如果你想解决一个问题,AutoML 或预先训练的 API 应该是首选产品。
预处理
如果 Google AutoML 或预先训练的 API 不符合您的需求,您仍然可以使用 TensorFlow 或 Keras 中的自定义机器学习模型。
不幸的是,你不能简单地使用你收集的数据,并开始训练一个机器学习模型。在数据准备好使用之前,需要预处理步骤。预处理取决于您使用的数据。对于文本,您需要与图像不同的预处理。
- 清理数据应该是第一个预处理步骤,回到我们的 StackOverflow.csv 示例,也许有些行没有文本?没有标签、不需要的特殊字符或其他类型的文本。清理这些数据可能会提高模型的性能。
- 打乱你的数据有各种各样的原因,通常我们的数据是像 StackOverflow.csv 一样排序的,它可能是基于编程语言排序的。我们希望进行洗牌,以确保我们的训练和测试数据集代表数据的总体分布。还有更多原因,正如第一条建议中提到的,我相信随着时间的推移,你会了解所有的原因。
- 将数据分成两组,训练和测试。根据经验,80%是训练数据,20%是测试数据。
- 嵌入和编码是另一个重要的部分,如果你谷歌一下,听起来可能会很混乱。为了让您对嵌入和编码有一个简单的理解,可以把它想象成一种以或多或少智能的方式将文本转换成数字的方法。
技巧五:数据预处理是必要的步骤,本身就是一个完整的章节。在继续之前熟悉数据预处理,并使用 TensorFlow 训练您的自定义模型。你猜怎么着…你可以利用你在挖掘数据时获得的洞察力。
构建您的张量流模型
我们已经到了可以用 TensorFlow 训练自定义模型的地步。这是迄今为止最复杂和耗时的部分,我说的是几天到一个月的范围。
第一步是消费数据,这取决于你使用的框架。TensorFlow、TensorFlow Hub 模块或 Keras。不要太担心路上会学到的不同类型。
在这之后,你必须选择一种算法,这是了解不同类型的算法的时候,如何以及何时使用它们,它们有什么不同。
下一步是训练我们的模型,虽然对小数据集和简单模型的训练可能在您的笔记本电脑上表现良好,但其他人需要大量的处理能力。为此,您可以利用在云中训练您的模型。
技巧六:使用 TensorFlow 的前几步是最难的,不要放弃,继续。构建自己的项目可以让你从中获得最大收益。当您构建项目时,请阅读 TensorFlow 文档并熟悉该框架。
评估你的机器学习模型
还缺少最后也是最重要的一步。模型评估,您的模型解决问题的效果如何?该模型是否也适用于以前未见过的数据,也称为泛化?理解你的结果是很重要的,仅仅有分类的准确性是不足以评估一个模型的。
技巧 7:熟悉不同的评估指标,了解如何以及何时使用它们。使用不同的指标,如混淆矩阵、F1 分数等等。
将您的模型投入生产
根据您想要解决的问题,不需要达到 100%的准确性。想想你的模型如何帮助解决一个问题,或者节省时间、金钱,或者自动化一个过程。如果你能以 80%的准确率解决一个高度消耗时间的过程,你可能已经节省了很多钱。
您的模型训练已经完成,结果看起来足以解决问题,现在该怎么办?现在是将您的模型投入生产的时候了。给人们使用它的机会。你可以像 TensorFlow ModelServer 或者 Google AI 平台一样以不同的方式托管模型。
最后一个技巧:顺理成章地为你的所有项目创建一个 GitHub 库。这是建立自己投资组合的最佳方式。更重要的是,您将在其他项目中重用大量代码。
如果你在 ML 的第一年有这种感觉。要意识到在某一点上你有足够的知识来自信地构建 ML 产品。
下一步是什么?
这还不是全部,我将与你分享例子和进一步的帖子,给你一些实践经验。如果你不想错过,就在 Twitter 上关注我吧。
- 收集数据集
- 数据集预处理
- 谷歌汽车
- Keras 命名实体抽取用 Google AI 平台训练和部署
- 库贝弗洛
感谢阅读。
非常感谢您的反馈和问题,您可以在 Twitter 上找到我@ HeyerSascha。
关于作者
Sascha HeyerIo Annotator 的创始人一个用于文本和图像的 AI 注释平台
,它提供了几种图像和文本注释工具。
成为数据科学家不需要硕士学位
我是如何做到的
Photo by Honey Yanibel Minaya Cruz on Unsplash
下面是我的(怪异)故事,关于我如何在没有攻读硕士学位的情况下成为一名数据科学家。
我没有为下面列出的任何资源支付报酬。我只是分享我所做的。
关于机器学习、深度学习和人工智能的实践视频教程,请查看我的 YouTube 频道。
大学
我在麦吉尔大学注册了化学工程。它是加拿大顶尖大学之一,在世界范围内享有相当好的声誉。
我选择化学工程是因为我对清洁能源技术充满热情(现在仍然如此)。我致力于开发一种更清洁、更可持续的能源生产方式。
不幸的是,这个项目没有达到我的期望。很少有课程涉及这个话题,职业前景大多是大石油公司(或者至少,那是我当时看到的)。
简单地说,我一点也不喜欢我的学位。
我觉得我不会去任何地方追求化学工程,我试图找到一个新的领域。
我的一个朋友是一名网络开发人员,他甚至开办了自己的网络开发公司。他看起来很成功,他对它的热情激励我去看看。
在大学期间学习 web 开发
所以我在完成化学工程学士学位的同时,开始学习网页开发。
我首先开始阅读 MDN 的 web 开发指南。我立刻喜欢上了它。非常枯燥,但是我在阅读文档和自己尝试的过程中学到了很多东西。
然而,我想提高我的技能,所以我参加了柯尔特·斯蒂尔的【Web 开发人员训练营】 。我读过许多关于这门课程的精彩评论,我认为花几美元试试是值得的。
原来是一门很神奇的课程!我非常喜欢,学到了很多东西。我利用这门课程建立了一个简单的小项目组合,并在大学的招聘会上向招聘人员展示了它们。
这就是我如何找到我的第一份网页开发工作的。
我欣喜若狂!我设法自己涉足了技术领域。所有的面试官都问我为什么要从化学工程转到编程,我必须向他们证明我拥有所需的技能,而计算机科学或软件工程专业的学生只需出示简历。
2017 年 12 月,我完成了学士学位,我有了一份有保证的工作,将于 2018 年 7 月开始工作。
在大学毕业和我的新工作之间
2018 年 1 月到 2018 年 7 月,我是自由的!
没有学校,没有工作,只有 6 个月的放松,等待开始我作为一名网站开发员的新工作。
但是,我根本做不到什么都不做。
这时候我才知道对数据科学家的狂热。无论在哪里,我都读到这是最性感的工作,诸如此类。
我想我得去看看。
我在 Dataquest 上开始学习数据科学。他们的方法更适合我的学习风格,因为我有很多空闲时间,我知道我可以很快完成课程。
事实上,我在两个月内填满了整个数据科学家和数据工程师的路径。
在我看来,这种经历是惊人的。我学到了很多东西,并且您可以完成许多项目,这将构建一个非常坚实的数据科学组合。然而,对我来说主要的缺点是我不明白我申请的是什么。它成功了,但是我缺乏算法背后的理论。
因此,我选了吴恩达的机器学习课程。同样,我听说过这个课程,我认为它可能是 Coursera 上评分最高的课程之一。
我非常喜欢它,并且学到了更多机器学习背后的数学知识。然而,我不喜欢这门课是用 Matlab/Octave 教授的,所以很难翻译我用 Python 学的东西。我学到了很多关于机器学习的基础知识,但我仍然觉得自己缺乏一些知识。
边工作边学习数据科学
2018 年 7 月,开始新工作。我非常兴奋,但我在学习更多的 web 开发和数据科学之间徘徊。
于是我开始利用业余时间(下班后)做数据科学。
我决定看《统计学习导论》这本书。一个朋友推荐了这本书,说是最好的数据科学入门。我试了一下,又惊又喜!阅读这本书实际上是令人愉快的。
我在学习中非常认真。我做笔记,通过构建非常小的项目,强迫自己应用 Python 中的每个算法。这真的帮助我掌握了大多数传统的机器学习算法,最重要的是,我对自己的技能有了信心。
然后,奇怪的事情发生了
我在工作的时候浏览脸书(是的,在工作中,我承认),我看到了加拿大最大的银行之一的数据科学家职位的广告。广告简单地说:
我们在找数据科学家!参加测验!
我以为我没什么可失去的。我参加了测验,得了 11/13。连我都对我的分数印象深刻!
一周后,我得到一个电话面试。一个小时后(告诉面试官我是如何从化学工程转到编程的),招聘人员决定进行最后一步。
最后一步是完成一个数据科学项目,并将其提交给高级数据科学家。
我决定重做一个我在学习 Dataquest 时完成的项目,并提交了它。
一周后,我得到了一份工作,我接受了。
2019 年 1 月,我开始了数据科学家的新工作。
自 2019 年 1 月以来
从那以后,学习和工作机会成倍增加。我可以与非常聪明和积极的人合作,公司鼓励我们学习、探索、实验和创新。
我觉得自己很幸运能在这种类型的组织中工作,我也很自豪自己学会了数据科学并获得了相关技能,从而找到了一份工作。
现在,深度学习是一个自然的下一步,我现在已经在努力了。
你也能做到吗?
有了正确的态度和心态,是的。我坚信任何人都能做到。我远非例外。
我这样做是因为它符合我的个性和我的学习风格。我可以:
- 按照我自己的进度学习
- 学习足够让我理解的理论
- 完成许多项目以获得实践经验
然而,也有许多缺点:
- 我不知道我是否在学习正确的东西
- 我不知道数据科学课程的结构
- 我必须对自己的技能充满信心,并完成许多项目来证明我可以成为一名数据科学家
我所做的很难。你必须对一个主题充满热情和自律,才能完成我所做的事情。
然而,我发现这种方式绝对是最有益的。
那么,我需要硕士学位才能成为数据科学家吗?
不。我认为公司不再看重文凭,而是寻找有技能的人。
最后,真正重要的是你的技能。
无论你是否决定攻读硕士学位,都要意识到这只是达到相同结果的不同方式。在任何情况下,确保你获得以下技能:
- 精通 Python 和 SQL
- 学习一些火花
- 学习软件开发最佳实践
- 了解版本控制
- 一些集装箱化是一个很好的奖励
- 做一个优秀的演示者
如果你是一名有抱负的数据科学家,我祝你好运!我绝对热爱这个领域,我认为我在网上上的课确实有助于热爱和理解这个领域。
最后,关键是对一个主题充满激情,并愿意与尽可能多的人分享你的激情。那么,机会就来了。
祝你大获成功!
你可能就要死了,而你自己都不知道。
—智能脑肿瘤检测和诊断
我认为很明显,医学成像完全改变了医疗保健领域的面貌,为早期检测、诊断和治疗的新形式开辟了一个领域。这有助于预防和优化病人护理。
这项技术是我们非常依赖的。它让我们能够在考虑患者护理的情况下做出明智的决定。但是我们能让它变得更好吗?🤔
围绕脑肿瘤诊断的当前医疗实践仅仅依赖于医生的经验和知识,以及他们对 MRI(磁共振成像)的解释。
然而,我们经常看到被误诊为脑瘤的案例,导致不正确的治疗,或者更糟糕的是,根本没有治疗。
这可能是由临床医生的失误造成的,但此外,我们可以通过改进我们非常依赖的系统来防止这些误诊病例!
生活在一个不断发展的世界,为什么我们仍然依赖过时的医学成像方法作为挽救病人生命的重要方法?
疯了吧!
以此为例。
随着新的发展和广泛的研究,我们开始了解我们误诊儿童某些癌症脑瘤是多么普遍。一些患有这些特殊罕见肿瘤的儿童得到了错误的诊断,在某些情况下,得到了错误的治疗。
有兴趣了解这个故事的更多内容:https://www . Fred hutch . org/en/news/center-news/2018/10/pediatric-brain-cancer-missionary . html
现代医学的目标是减轻所有患者的疼痛和痛苦,努力促进疾病预防。
医疗保健是帮助每个人实现四大目标:预防过早死亡和残疾、维持和提高生活质量、个人成长和发展以及善终。
在诊断过程中,需要有某种改变来帮助医生,允许更快更准确地做出决定,并适当地突出受影响的大脑区域。
哦,等等!💡
— We can be friends if you like Aladdin 🙈
医学成像是医疗保健领域的一项重大进步,改变了我们看待人体和治疗患者的方式。但是,即使是我们最可靠的系统,如核磁共振扫描,也会遗漏一些重要的细节,从而完全改变患者护理的方向。
MRI 是广泛用于诊断各种组织异常的医疗技术,包括脑肿瘤的检测和诊断。计算机化医学图像分割的积极发展在科学研究中发挥了至关重要的作用,帮助医生理解和可视化异常,以采取必要的步骤,通过快速决策进行优化治疗。
常规的 MRI 扫描系统是医疗技术领域的巨大进步和发展,每年拯救数百万人的生命。然而,由于检测模型不完善,许多人仍然被误诊,甚至失去了生命。
**问题:**那么,我们该如何解决这个问题呢?
答:晚期脑肿瘤从 MRI 图像中分割
My first reaction when learning about MRI Segmentation
没事,放松。别担心,我抓住你了。
我向你保证,脑瘤分割并没有看起来那么复杂。但是在我们开始思考它是什么和它是如何工作的之前,让我们后退一步,从整体上理解脑瘤。
保持简单;
肿瘤基本上是身体任何部位不受控制的细胞生长,而脑肿瘤是这些异常细胞在大脑中的聚集或聚集。
肿瘤可以通过生长和挤压大脑的关键区域造成局部损伤。如果它们阻塞了大脑周围的液体流动,也会引起问题,这会导致颅骨内的压力增加。如果没有检测和治疗,某些类型的肿瘤可以通过脊髓液扩散到大脑或脊柱的远处。
脑瘤分为或 继发性 。
原发性脑瘤起源于你的大脑。而继发性脑瘤(转移)是生长在大脑内的肿瘤,它是由恶性肿瘤 ( 癌症)在身体其他地方的扩散引起的。
- 恶性肿瘤更危险,因为它可以快速生长,并可能生长或扩散到大脑的其他部分或脊髓。恶性肿瘤有时也被称为脑癌。转移性脑瘤总是恶性的,因为它们已经从身体的其他癌症区域扩散到大脑。
- 良性原发性脑瘤不是癌症。良性肿瘤可以通过生长和压迫大脑的其他部分造成损害,但它们不会扩散。在某些情况下,良性肿瘤会转变成恶性肿瘤。
关键要点 →肿瘤是坏的*(用你的🧠买吧)***
只是为了显示这些脑瘤的严重性,它们可以影响我们大脑的每一个部分。喜欢每一个零件。听神经瘤中心、胶质瘤中心、脑膜瘤中心、转移性脑肿瘤中心、神经纤维瘤中心、垂体瘤中心等。只是源于大脑不同区域的几种类型的肿瘤,具有不同的症状和有害的,甚至致命的影响。
**—提供了关于这些领域的更多信息,请随时查看并了解更多信息😉
既然你已经对什么是脑瘤有了一个高层次的理解,让我们开始理解分割过程以及它如何完全改变当前的检测和诊断方法。
把我们的大脑一点点拆开̶s̶e̶g̶m̶e̶n̶t̶a̶t̶i̶o̶n̶一点点
在高级中,脑肿瘤分割包括从健康脑组织中提取肿瘤区域。图像分割的目标是将图像分成一组语义上有意义的、同质的、不重叠的区域,这些区域具有相似的属性,如亮度、深度、颜色或纹理。
Looking something like that👆
然而,精确和有效的肿瘤分割仍然是一项具有挑战性的任务,因为肿瘤可能具有不同的大小和位置。它们的结构通常是非刚性的,形状复杂,具有各种各样的外观特性。
分割结果是标识每个同质区域的标签图像或描述区域边界的一组轮廓。这就是我们如何检测分割成像组中的不规则性以识别肿瘤。
Figure 1 — CNN Process Scheme
但是让我们把事情搞清楚。MRI 分割在实践中并不新鲜,它已经存在很多年了,但是我们需要了解与当前分析和诊断方法相关的挑战*,以使它** 比现在更好。*
对于必须手动提取重要信息的临床医生来说,分析这些庞大而复杂的 MRI 数据集已经成为一项繁琐而复杂的任务。这种手动分析通常很耗时,并且由于各种操作者之间或操作者内部的可变性研究而容易出错。
脑 MRI 数据分析中的这些困难需要发明计算机化的方法来改进疾病诊断和测试。如今,用于 MR 图像分割、配准和可视化的计算机化方法已经被广泛用于辅助医生进行定性诊断。
深度学习已进入聊天
深度学习 — WHA!?怎么!?
My Brain when trying to understand Deep Learning in Tumour Segmentation
那么深度学习究竟如何将 应用 到大脑分割和 有什么好处 ?
“深度学习和传统机器学习最重要的区别就是它在数据规模增大时的表现。”
当接受利用人工智能进行大脑分割的挑战时,数据需要通过 MRI 扫描充分准确地预测脑肿瘤,这将需要吨的数据。
处理这种数据的能力绝对是一个挑战,不仅需要获得患者扫描的能力,还需要计算能力,才能真正成功地进行预测和诊断。
与在医学成像上训练机器学习模型相关联的一些主要挑战是获取每个数据集、获得患者批准以及由专家对图像进行后期分析的高成本。
为了用有限的数据构建医疗机器学习系统,研究人员应用了广泛的数据增强,包括拉伸、灰度缩放、应用弹性变形等,生成了大量的合成训练数据。
在遵循这些原则的过程中,我们看到了从患者磁共振图像中识别异常组织的巨大优势和进步:
基于准确性、灵敏度、特异性和 dice 相似性指数系数,对所提出的技术的实验结果进行了评估,并验证了对磁共振脑图像的性能和质量分析。实验结果达到了 96.51%的准确度、94.2%的特异性和 97.72%的灵敏度,证明了所提出的技术用于从脑 MR 图像中识别正常和异常组织的有效性。
—利用深度学习进行肿瘤检测和诊断的实验结果
*【https://www.ncbi.nlm.nih.gov/pubmed/28367213 *
关键问题是在非常早期阶段检测出脑肿瘤,以便采取适当的治疗措施。基于这些信息,可以决定最合适的治疗、放射、手术或化疗。因此,很明显,如果在肿瘤的早期阶段准确地检测到肿瘤,则肿瘤感染患者的存活机会可以显著增加。
Hmmm。节省时间和生命的更好的医学成像系统?!
DOPE!
想跟我一起踏上旅程吗!
领英:https://www.linkedin.com/in/alim-bhatia-081a48155/