TowardsDataScience 博客中文翻译 2019(一百零七)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

用代码明确 NLP 的基本原理。

原文:https://towardsdatascience.com/clear-the-fundamentals-of-nlp-with-code-7d419daefccf?source=collection_archive---------31-----------------------

有空间的自然语言处理(第二部分)

使用 spacy 获得 NLP 基础知识的实践经验。

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

这是上一篇文章NLP 综合指南的延续。

在上一篇文章中,我介绍了什么是自然语言处理,什么是自然语言处理的子集(NLU 和 NLG)以及应用。

在这篇文章中,我将通过使用越来越流行的 spaCy 包和一些应用程序的实现,用代码演示 NLP 的基础。

为什么是 spaCy?

众所周知,斯坦福大学最著名的 NLTK 图书馆被人们使用了几十年。它是由研究人员和学者构建的,作为 NLP 系统的工具。NLTK 是为了支持教育和帮助学生探索想法而创建的。虽然,它对 NLP 系统很有效。这是一个字符串处理库,它返回字符串作为结果。

spaCy 是为 Matt Honnibal 在 Explosion AI 开发的“Python 中的工业强度 NLP”而打造的。主要用于生产环境及其极端的用户友好性。这是一种基于对象的方法,它返回对象而不是字符串和数组。

相对于 NLTK 的优势:

  • 它非常快,因为它是用 Cython 语言编写的。
  • 依存解析。
  • 它还提供了对更大的词向量的访问,这些词向量更容易定制。
  • 综合词向量。
  • 支持 GPU 加速。
  • 支持用户定义的深度学习网络。
  • 但是,与 NTLK 相比,在句子标记化方面非常慢

你将会学到什么。

  1. 符号化。
  2. 别说了。
  3. 词干化和词汇化。
  4. 依存解析。
  5. 词性标注。
  6. 组块。
  7. 实体识别。
  8. 词向量相似度。

先决条件

在开始之前,您需要在 pip 或 conda 的帮助下将它安装到您的环境中(如果您已经安装了的话)。我喜欢用 pip,所以用 pip 安装。

# Using pip
sudo pip install spacy# Using conda
conda install -c conda-forge spacy

您需要手动安装特定于语言的模型,因为它们不与 spaCy 库捆绑在一起。

  • en_web_core_sm = >
  • en_web_core_md = > 中型
  • en_web_core_lg = > 大号

其中“en”指的是英语,大小因其能够执行的应用而异,在我们的情况下,小型和中型封装是可以的。使用下面的命令下载和安装统计模型。最好为您的项目创建一个虚拟环境。

# Download Models
python3 -m spacy download en_web_core_[any size]

数据类型:Doc、Span、令牌。

  • Doc 对象包含关于文本的所有信息。提供对文本所请求的语言信息的访问的属性、方法和特性。

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

Source: spaCy.io

  • 文档的切片称为 span 对象,元素称为 Token 对象。它们只包含地址并指向 doc 对象中的数据。它们就像一个指针。

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

Source: Datacamp.com

1.符号化。

这是自然语言处理任务中的一个基本步骤。单词“标记化”描述了将文本分成单词、标点符号…etc 转换成令牌,对它进行处理后,结果存储在 Doc 对象中。

Tokenization

  • 这就是单词标记化。它是通过用空格、标点、符号和其他元素分隔单词的方式来执行的。
  • From isn ‘t = = > ’ is ‘,’ n t ‘和分隔’!’== >感叹,’ .'== >句号这都属于标点符号范畴。

2.别说了。

停止像这样的话,“一、是、上、为、我的、也、任何、只有、现在…etc" 由于它们对我们想要在处理之前丢弃它们的句子没有贡献意义,所以它们是在执行机器翻译&文本摘要、问答问题时不需要丢弃停用词的一些情况。

Stopwords Removal Script.

  • 标点符号不变
  • 换行符(\n)、特殊字符和标点符号应该手动删除。

3.词干化和词汇化。

词干化和词汇化都是指文本规范化,即我们将每个单词缩减为其词根或基本形式。

**举例:**Plays Played = =>Play(根形式)

== >词干通过截断与单词一起使用的后缀或前缀来输出单词,这种情况更糟,不能提供正确的基本形式,但有时会提供,但大多数情况下**会返回无效单词。**不幸的是,spacy 不提供词干功能。

示例:病历报告生成为病历报告,删除了后缀。

在某些情况下,学习让位于学习。

== >词汇化提供实际的词根,因为它使用词汇和词形分析来缩减输入文本。它返回一个真实的语言单词。

Lemmatization.

  • 可以看到“有”== >“有”和“发射”== >“发射”完成了。

4.依存句法分析

为了更好地理解每个词(如主语、宾语、动词)之间的关系,它为每个词加上了句法依存标签。

  • spaCy 库提供了一个奇妙的可视化工具,名为dispasy,用于将的依赖标签显示为图形。

Dependency_parsing.

  • 它用于语义分析,也用于检查语法错误。

5.词性标注

它分配词类标签,如名词、副词、形容词…句子中的每个单词。分配标签是必要的,因为它有助于区分不同上下文中相同标记或单词的含义。

举例:什么下一个?她坐在旁边她,

两者都有共同的词 next ,但是第一个是副词,第二个是介词。

POS_Tagging.

我们可以用两种不同的方式输出 POS 标签,要么通过**。pos_ attribute** 显示粗粒度的 pos 标签,表示完整的单词或**。tag_ attribute** 显示原始标签名称的缩写。

6.组块

组块是向句子添加句法结构和意义的过程,而词性标签描述动词、副词、形容词等,但它们不提供意义,组块是通过将词性标签作为输入并返回组块作为输出来执行的。它有助于提取用于命名实体识别的名词和动词短语组。

Noun phrase Chunking.

7.命名实体识别

命名实体识别也称为 Ner,用于将现实世界的对象标记为预定义的类别**,如名称、地点、事物、组织、数量、数字等。**spacy 统计模型能够识别多种命名或数值实体。您可以通过对大量数据进行训练来添加您的自定义类别。

Named Entity Recognition on Microsoft News.

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

NER Output.

  • 它的应用是在利用 NER 标签的搜索引擎中,该标签被识别用于有效的搜索。

8.词向量相似度

这是一个将单词转换成向量的过程,用于寻找同一棵树的单词之间的相似性。对于人类来说,很容易知道“狗”和“猫”之间的相似之处,因为它们都属于动物范畴。对于机器来说,他们找到了与向量的相似之处。它还用于句子和文档,以查找每个句子之间的相似性。它也被称为单词嵌入

Word vector similarity.

  • 这只是一个例子,我们可以用不同的统计模型来做更多的工作。
  • 词向量相似度的应用是推荐系统和机器翻译。

结论:

  • 许多 NLP 库表现良好,使用 spacy 的目的是使过程快速并简化任务,具有内置的词向量,并提供具有良好准确性的结果。
  • Spacy 有能力立即执行任务,但需要基本的理解。
  • 尝试调整预先训练好的模型
  • 如果任务不能很好地执行,为任务编写自己的自定义管道类。

我们已经看到了一些 NLP 任务的基础,但它们更多,我们只是触及了表面,对引擎盖下的过程有了深刻的理解,您可以做许多有趣的事情。

快乐学习:)

参考资料:

  1. 塞维多夫 Guts,https://www . slide share . net/Yuri Guts/natural-language-processing-NLP
  2. lahi ru Liyanapathirana,https://heart beat . fritz . ai/NLP-chronicles-intro-to-spacy-34949 f1 BC 118

清除“助推”周围的空气

原文:https://towardsdatascience.com/clearing-air-around-boosting-28452bb63f9e?source=collection_archive---------18-----------------------

了解获得最佳结果的当前定位算法

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

Clearing Photo by SpaceX on Unsplash

**注:**虽然这篇文章有点数学化,但只要阅读前两节,即简介历史就能理解BoostingGradient Boosting的核心工作。之后的部分是不同梯度提升算法的论文解释。

这是我来自Concepts类别的帖子中的一个,可以在我的 github repo 这里找到。

索引

  1. 简介
  2. 历史 ( 套袋随机森林助推梯度助推)
  3. AdaBoost
  4. XGBoost
  5. 灯 GBM
  6. CatBoost
  7. 延伸阅读
  8. 参考文献
***NOTE:*** This post goes along with ***Jupyter Notebook*** available in my Repo on Github:[[ClearingAirAroundBoosting](https://nbviewer.jupyter.org/github/PuneetGrov3r/MediumPosts/blob/master/Concepts/Boosting.ipynb)]

1)简介

^

Boosting 是一种集成元算法,主要用于减少监督学习中的偏差和方差。

今天,Boosting 算法是在各种各样的环境/问题中获得最先进结果的最常用算法之一。它已经成为任何机器学习问题或竞赛获得最佳结果的首选方法。现在,

  1. 助推算法取得如此巨大成功的背后原因是什么?
  2. 它是如何形成的?
  3. 未来我们能期待什么?

我会试着通过这篇文章回答所有这些问题,以及更多的问题。

2)历史

^

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

Photo by Andrik Langfield on Unsplash

助推是基于卡恩斯瓦兰特 (1988,1989)提出的问题:“一组弱学习者能创造出一个单独的强学习者?”。

Robert Schapire 在 1990 年的一篇论文中对 Kearns 和 Valiant 问题的肯定回答对机器学习和统计学产生了重大影响,最显著的是导致了 boosting 的发展。

与 Bagging 同时出现的还有其他一些集成方法,你可以说它们是现代梯度增强算法的子集,它们是:

  1. 打包(自举聚合):(即自举 +聚合) ^

Bagging 是一个集合元算法,有助于提高稳定性和准确性。它还有助于减少差异,从而减少过度拟合。

在 bagging 中,如果我们有 N 个数据点,并且我们想要制作“m”个模型,那么我们将从数据“m”次中取出数据的一些部分【主要是(1–1/*e*) ≈63.2% 】,并且重复其中的一些行,以使它们的长度等于 N 个数据点(尽管它们中的一些是冗余的)。现在,我们将在这些“m”个数据集上训练这些“m”个模型,然后获得“m”组预测。然后我们汇总这些预测,得到最终的预测。

它可以与神经网络、分类和回归树以及线性回归中的子集选择一起使用。

2.随机森林 : ^

随机森林(或随机决策森林)方法是一种通过构建大量决策树来操作的集成学习方法。它有助于减少决策树模型中常见的过度拟合(具有高深度值)。

随机森林结合了“装袋”思想和随机选择特征,以构建一个决策树集合来对抗方差。正如在 bagging 中一样,我们为决策树制作了自举训练集,但是现在对于我们在树生成过程中制作的每个分裂,我们只选择了特征总数的一小部分【主要是√nlog2(n)】。

这些方法,自举和子集选择,使得树彼此更加不相关,并且有助于更大程度地减少方差,从而以更一般化的方式减少过拟合。

3。助推 : ^

上述方法使用互斥模型的平均值,以减少方差。助推有点不一样。Boosting 是一种顺序集成方法。对于总数为“n”的树,我们以顺序方法添加树预测(即,我们添加第二个树来提高第一个树的性能,或者您可以说尝试纠正第一个树的错误,等等)。我们所做的是,从目标值中减去第一个模型的预测乘以一个常数(0<λ≤1),然后将这些值作为目标值,我们拟合第二个模型,依此类推。我们可以把它看作:新的模型试图纠正以前的模型/以前的模型的错误。升压几乎可以用一个公式来概括:

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

Boosting Formula

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

Example: Predicting if someone will like computer games. [Source: XGBoost docs]

即最终预测是所有模型预测的总和,每个模型都乘以一个小常数(0<λ≤1)。这是看待 Boosting 算法的另一种方式。

因此,实际上我们试图从每个学习者(都是弱学习者)那里学习关于目标的少量信息,这些学习者试图改进先前的模型,然后将它们相加以获得最终的预测(这是可能的,因为我们仅拟合先前模型的残差)。所以,每个顺序学习者都试图预测:

(initial predictions) — (λ * sum_of_all_predictions_of_previous_learners)

基于它们的性能,每个树预测器也可以具有不同的λ值。

4。渐变增强: ^

在梯度增强中,我们采用一个损失函数*,它在每个拟合周期被评估(就像在深度学习中一样)。Jerome H. Friedman 关于梯度推进的第一篇论文关注的是最终函数的加法展开,类似于我们上面看到的。*

我们首先预测一个目标值(比如,γ),一个给出最小误差的常数(即第一次预测是F0 = γ)。之后,我们根据之前的输出计算数据集中每个点的梯度。因此,我们用预测和先前模型的所有输出的总和之间计算的误差来计算误差函数的梯度,w.r.t .先前模型的所有输出的总和,在平方误差的情况下将是:

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

gradient w.r.t. sum of all values for that data point (i.e. ith gradient)

这样我们就有了以前模型所有输出的梯度。

为什么我们要这样计算梯度?

在神经网络中,根据所有参数(即所有神经节点)计算梯度是很简单的,因为神经网络在所有层中都是线性的(或其梯度易于计算的某个函数)组合,所以利用反向传播*(根据所有参数)计算梯度并更新它们更容易。但是在这里,我们不能根据决策树的任何参数(如深度、叶子数量、分裂点等)计算输出的梯度,因为这并不简单(实际上是抽象的)。*

J.H. Friedman 对每个输出使用误差梯度(误差函数),并使模型适合这些梯度。

这对获得更好的模型有什么帮助?

每个输出所代表的梯度 w.r.t .是我们应该向哪个方向移动以及移动多少,以获得特定数据点/行的更好结果,将树拟合问题转换为优化问题。我们可以使用任何类型的损失函数,它是可微分的,并且可以根据我们手头的任务进行定制,这在正常的助推中是不可能的。例如,我们可以将 MSE 用于回归任务,将 Log Loss 用于分类任务。

这里如何使用渐变来获得更好的效果?

与 Boosting 不同,在 Boosting 中,在ith迭代中,我们学习了输出(目标)的某个部分,而(i+1)th树将尝试预测剩下要学习的部分,即我们拟合残差,在这里,在梯度 Boosting 中,我们计算所有数据点/行的梯度,这告诉我们想要移动的方向(负梯度)和移动量(可以认为是梯度的绝对值),并在这些梯度上拟合树。

*These gradients, based on our loss function (chosen to optimize our problem better than others), reflect change we would want for our predictions. For example in convex loss functions we will get some multiple to some multiple of exponential increase in gradients with increase in residuals, whereas residuals increase linearly. Therefore getting better convergence time. Depends on loss function and optimization method.*

这些给了我们数据点的梯度区域,这些区域将需要类似的更新,因为它们将具有类似的梯度。现在,我们将找到该区域的最佳值,该值将给出该区域的最小误差。(即采油树装配)

之后,我们将这些预测与之前的预测相加,得到这一阶段的最终预测。

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

Where γjm is prediction for jth region for mth tree and Jm is number of regions for mth tree. So adding γ, for that region found by tree fitting, times identity, giving 1 iff that data point is in current region…

这为我们提供了每个数据点/行的新预测。

正常提升和梯度提升之间的基本区别在于,在正常提升中,我们将下一个模型拟合到残差,而在梯度提升中,我们将下一个模型拟合到残差的梯度。Err… GradientBoosting 实际上使用了一个损失函数,因此我们将下一个模型拟合到该损失函数的梯度(其中我们通过使用以前的预测来找到梯度)。

***NOTE BEGIN***

对此可能的进一步改进:

当前的梯度增强库远不止于此,例如:

  1. 树形约束(如max_depth,或num_leaves等)
  2. 收缩(即learning_rate)
  3. 随机抽样(行二次抽样、列二次抽样)[在树和叶级别]
  4. 惩罚学习(L1回归、L2回归等)[这将需要一个修改的损失函数,并且用正常的增强是不可能的]
  5. 还有更多…

这些方法(其中一些)在称为 随机梯度 Boosting 的 Boosting 算法中实现。

***NOTE END***

3) AdaBoost

^

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

Photo by Mehrshad Rajabi on Unsplash

这是第一个在 ML 世界引起巨大反响的 Boosting 算法。它是由 Freund 和 Schapire (1997)开发的,这里的是论文。

除了顺序添加模型预测(即提升)之外,它还会为每个预测添加权重。它最初是为分类问题而设计的,它们增加了所有错误分类样本的权重,减少了所有正确分类的数据点的权重(尽管它也可以应用于回归)。因此,下一个模型必须更多地关注权重较大的例子,而不是权重较小的例子。

它们也有一个常数来收缩每棵树的预测,其值在拟合期间计算,并取决于拟合后得到的误差。误差越大,该树的常数值越小。这使得预测更加准确,因为我们从不太准确的模型中学到的东西更少,而从更准确的学习者那里学到的东西更多。

它最初用于两类分类,并选择输出为{-1,+1},其中:

  1. 它从每个数据点的相等权重开始= 1/N(其中,N:数据点的数量),
  2. 然后,它使用初始权重(初始时相同)将第一分类模型h_0(x)拟合到训练数据,
  3. 然后,它计算误差,并基于此更新所有数据点的权重(即,我们增加错误分类的权重并减少正确分类的权重)。总误差在计算用于预测特定树的收缩常数时也变得有用。(即我们计算常数,比如说α,它对于大误差来说是小的,反之亦然,并且在收缩和重量计算中都使用)**

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

4.最后,当前回合的预测在与α相乘后被添加到先前的预测中。因为它最初被分类为+1 或-1,所以它将最后一轮后的预测符号作为最终预测:

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

where α_i is ith constant (prev. point) and h_i is ith model predictions

(AdaBoost 不是基于梯度的)

4) XGBoost

^

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

Photo by Viktor Theo on Unsplash

XGBoost 试图改进以前的梯度增强算法,以提供更好、更快和更通用的结果。

它对梯度增强使用了一些不同的和一些新的附加物,例如:

a)规则化学习目标:

与许多其他目标函数的实现一样,这里它建议向损失函数添加一个额外的函数,以惩罚模型的复杂性(如 LASSO、Ridge 等),称为正则化项*。这有助于模型不过度拟合数据。*

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

Some loss function + (Some regularization function to control complexity of model)

现在,对于本质上是附加的梯度增强,我们可以将我们的第‘t’个预测写为F_t(x) = F_t-1(x) + y_hat_t(x),即,这舍入了预测加上所有先前预测的总和。损失函数:

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

其中经过 泰勒级数近似后的 可以写成:

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

where g_i and h_i are gradient and hessian of loss function. i.e. 1st order and 2nd order differentiation of loss function

为什么要到二阶?

仅具有一阶梯度的梯度增强面临收敛问题(收敛仅在小步长下可能)。这是损失函数的很好的近似,加上我们不想增加计算量。

然后,通过使损失函数的梯度等于零来找到损失函数的最佳值从而通过损失函数找到用于进行分裂的函数。(即分割后损失变化的函数)**

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

Found by putting above formla’s differentiation equal to zero. [Optimal Change value]

b)收缩和列子采样:

它还为每棵树增加了收缩,以减少特定树的影响,并对列进行子采样,以防止过度拟合并减少方差,如历史部分所述。

c)不同的分割查找算法:

梯度增强算法遍历所有可能的拆分,以找到该级别的最佳拆分。然而,如果我们的数据非常大,这可能是一个昂贵的瓶颈,因此许多算法使用某种近似或其他技巧来寻找,不是最好的,而是特别好的分割。因此,XGBoost 查看特定特性的分布,并选择一些百分点(或分位数)作为分割点。

***Note:**
For approximate split finding these methods are also used, instead of percentile method:
1) By constructing approximate histogram of gradient statistics.2) By using other variants of binning strategies.*

它建议选择一个值,姑且称之为q,现在从[0,100]的分位数范围中,几乎每第q个分位数值被选择作为用于分裂的候选分裂点。大致会有100/q个候选点。

它还增加了稀疏感知分裂发现,这在稀疏大数据数组中很有帮助。

d)为了提高速度和空间效率:

它建议将数据分成,内存中的块。每个块中的数据以压缩列(CSC) 格式存储,其中每一列按照对应的特征值进行存储*。因此,对块中的列进行线性搜索就足以获得该块的该列的所有拆分点。*

块格式使得在线性时间中找到所有分裂变得容易,但是当轮到获得这些点的梯度统计时,它变成梯度统计的非连续获取(因为梯度仍然是先前的格式,其中块值具有指向它们的梯度的指针),这可能导致高速缓存未命中。为了克服这个问题,他们为梯度累积设计了一个缓存感知算法。其中,每个线程都有一个内部缓冲区。这个缓冲区用于以小批量的方式获取渐变并累积它们,而不是从这里访问一些渐变,然后从那里按顺序访问一些渐变。

找到最佳的块大小也是一个问题,它可以帮助最好地使用并行性,并最大限度地减少缓存未命中。

*它还提出了一种叫做**块分片的东西。*它在多个磁盘上交替写入数据(如果你有那些的话)。因此,当它想要读取一些数据时,这种设置可以帮助同时读取多个数据块。例如,如果您有 4 个磁盘,那么这 4 个磁盘可以在单位时间内读取 4 个数据块,从而提供 4 倍的加速。

5)灯光 GBM

^

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

Photo by Severin D. on Unsplash

本文提出了两种技术来加速整个升压过程。

*对于第一种,它提出了一种方法,在这种方法中,他们不必使用特定模型的所有数据点,而不会损失太多的信息增益。它被命名为**基于梯度的单侧采样(GOSS)。*在其中,他们计算损失函数的梯度,然后按绝对值排序。它还证明了具有较大梯度值的值对信息增益的贡献更大,因此它建议对于该特定模型忽略许多具有低梯度的数据点。

因此,对于特定模型,取顶部梯度的一些部分和剩余部分的不同部分(随机地来自剩余梯度),将一些低权重应用于随机梯度组,因为它们具有较低的梯度值,并且不应该对我们的当前模型有太大贡献。

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

Get gradients of loss, sort them, take top gradient set and random from rest, reduce weight of random ones, and add this model to previous models’ set.

这里需要注意的一点是,LightGBM 使用基于直方图的算法,将连续的特征值存储到离散的容器中。这加快了训练速度,减少了内存使用。

此外,他们使用了一种不同的决策树,这种决策树优化叶子的方式,而不是普通决策树的深度方式。(即,它列举所有可能的叶子并选择具有最小误差的一个)

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

对于第二种方法,提出了一种将多个特征组合起来使成为一个新特征的方法,从而在不损失太多信息的情况下降低了数据的维数。这种方法被称为独家功能捆绑(EFB) 。它说,在高维数据的世界中,有许多列是互斥的。怎么会?因为高维数据具有许多高度稀疏的列,所以数据中可能存在许多同时不取任何值的列(即,大多数时间它们中只有一个取非零值,即互斥)。因此,他们建议将这些特征捆绑成一个,在一些预先指定的值以上没有冲突(即,对于许多点,它们在相同的数据点没有一些非零值。即它们不是完全互斥的,而是在某种程度上互斥的)。仍然为了区分来自不同特征的每个值,它提出给来自不同特征的值添加不同的常数,因此来自一个特征的值将在一个特定的范围内,而来自其他特征的值将不在该范围内。例如,假设我们有 3 个特征要组合,并且都在 0-100 之间。因此,我们将第二个特征加上 100,第三个特征加上 200,得到 3 个特征的三个范围,分别等于[0,100]、[100,200]和[200,300]。并且在基于树的模型中,这是可接受的,因为它不会通过分裂影响信息增益。

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

Find binRanges for all features to combine, make a new bin with values equal to bin_value + bin_range.

制作这些包实际上是 NP 难问题,类似于图着色问题,也是 NP 难问题。因此,在图着色问题中,它选择了一个好的近似算法,而不是最优解。

虽然这两种方法是本文的主要亮点,但它也提供了对梯度提升算法的改进,如子采样、最大深度、学习速率、叶子数等。,这是我们在上面讨论过的。

总的来说,这是一篇非常数学化的论文。如果你对样张感兴趣,你应该看看这篇论文

6)催化增强

^

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

Photo by Alex Iby on Unsplash

本文重点研究增压遭受的问题之一,即泄漏,目标泄漏。在 Boosting 中,许多模型对训练样本的拟合依赖于目标值(用于计算残差)。这导致测试集中目标值的移动,即预测移动。因此,它提出了一种绕过这个问题的方法。

另外,还提出了一种将分类特征转换为目标统计量(TS) 的方法(如果做错会导致目标泄漏)。**

它提出了一种叫做有序推进的算法,有助于防止目标泄露,以及一种处理分类特征的算法。虽然两者都使用了一种叫做的排序原则

首先,用于将分类特征转换成目标统计量(TS) 。如果你知道分类特征的均值编码目标编码*,特别是 K 重均值编码,这将很容易理解,因为这只是一个小小的扭曲。他们所做的是避免目标泄漏,但仍然能够进行目标编码,对于第 I 个元素,他们在数据集中取其上的(i-1)个元素,以获得该元素的特征值(即,如果 7 个元素在第 I 个元素之上,与第 I 个元素属于同一类别,则他们取这些值的目标平均值,以获得第 I 个元素的特征值)。*

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

Average target values if i,j belong to same category, only if in this iteration’s random permutation that element is above ith element (if condition in statement). ‘a’ and ‘p’ are parameters to save eq from underflowing.

其次,为了证明算法的预测偏移*,提出了一种算法,他们称之为有序提升。在每次迭代中,它独立地对新的数据集D_t进行采样,并通过将当前模型应用于该数据集并拟合新的模型来获得未偏移残差(因为这是足够/在某种程度上(依赖于)不同的数据集)。实际上,他们将新的数据点添加到先前的点上,因此,它至少为当前迭代中添加的新数据点提供了未偏移的残差。*

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

For i=1…n, from random permutation r, compute avg(gradient if it belongs to same leaf) only if from permutation r is that leaf point present above 2^(j+1) th point. [Update Model by adding new preds]

有了这个算法,如果有“n”个例子,我们可以制作“n”个模型。但我们只做log_2(n)型号,出于时间考虑。因此,这样一来,第一个模型适合 2 个示例,然后第二个模型适合 4 个示例,依此类推。

CatBoost 也使用了一种不同的决策树,叫做遗忘树*。在这样的树中,在树的整个级别上使用相同的分裂标准。这样的树是平衡的,不容易过度适应。*

在不经意树中,每个叶索引可以被编码为长度等于树深度的二进制向量。这一事实在 CatBoost 模型评估器中被广泛使用:它首先将所有浮点型特征和所有一位热编码特征二值化,然后使用这些二值特征来计算模型预测。这有助于快速预测。

7)进一步阅读

^

  1. 特雷弗·哈斯蒂;罗伯特·蒂布拉尼;杰罗姆·弗里德曼(2009 年)。 统计学习的要素:数据挖掘、推理和预测 (第二版。).纽约:斯普林格。(国际标准书号 978–0–387–84858–7)
  2. 所有引用

8)参考文献

^

  1. 维基百科——助推
  2. 特雷弗·哈斯蒂;罗伯特·蒂布拉尼;杰罗姆·弗里德曼(2009 年)。 统计学习的要素:数据挖掘、推断和预测 (第二版。).纽约:斯普林格。(国际标准书号 978–0–387–84858–7)
  3. 论文— 助推法简介—约夫·弗罗因德、罗伯特·e·沙皮雷 (1999) —阿达助推法
  4. 论文— XGBoost:一个可扩展的树增强系统—陈天琦,Carlos Guestrin (2016)
  5. 堆栈交换—需要帮助理解 XGBoost 的适当拆分点建议
  6. 论文— LightGBM:一种高效的梯度推进决策树—柯,孟等
  7. 论文— CatBoost:具有分类特征的无偏增强—普罗霍伦科娃、古塞夫等人 — v5 (2019)
  8. 论文— CatBoost:支持分类特征的梯度增强—谷林埃尔绍夫多罗古什
  9. 论文— 使用不经意树增强 LambdaMART—Modr y,Ferov (2016)
  10. YouTube — CatBoost —新一代梯度增强—安娜·维罗妮卡·多罗古什
  11. 渐变增强算法简介 —机器学习掌握
*Suggestions and reviews are welcome.
Thank you for reading!*

签名:

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

清理人工智能周围的水。

原文:https://towardsdatascience.com/clearing-the-water-around-a-i-5ca596dad1b9?source=collection_archive---------20-----------------------

大数据还是大炒作?

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

今天几乎每个人都经历过一些关于人工智能的影响和新想法。大多数公司、银行、零售店等都在关注人工智能将如何扩大他们的市场,并引领他们走向更成功的冒险。我敢肯定,你们都曾经与没有人工智能技术知识的人进行过或听过一次对话,担心地谈论他们的生活将如何被它改变。我现在正坐在华尔街旁的早餐店里,写下这篇文章并体验着它。想象一下,几个经典的纽约高管在谈论他们已经开始在公司实施的人工智能战略;“这比我们想象的要好得多,我不知道发生了什么,我只是希望我们能够尽快开始裁员”。

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

如今,许多初创公司都在试图给人工智能一记耳光,旨在获得大量资金,而且通常都能成功。这个领域被人们视为今天的“淘金热”,但公众对其运作方式的理解模糊不清(双关语)。

算法是乐高积木

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

“算法是一组逐步执行的指令,非常明确,即使像计算机这样头脑简单的东西也能遵循它们。”

就其本身而言,除了仅仅从声音上打动或恐吓人们之外,算法本身并不比电锯聪明。(人工智能用 Destin 、SmarterEveryDay 解决电锯回扣问题)

试着一遍又一遍地想一件事做得非常好的事情。这对于排序数字列表或在互联网上搜索龙之母的图片非常有用。

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

但是一旦我们开始以聪明的方式将许多算法链接在一起,我们就可以开始玩人工智能了:人工智能只是特定领域智能行为的幻觉。想想人类的进化,一旦我们的原始祖先开始集体工作来完成他们的目标,我们是如何真正开始进化的。几乎就像大自然可能是我们的参数,生存是我们的主要目标。

屏幕后面发生了什么

让我们用一个人工智能的例子,这个例子目前每天被使用数百万次,让人们可以访问他们正在寻找的任何信息。

“好的谷歌,附近哪里有最好的泰国菜?”

  1. 一种特定的算法会将我记录的原始声波转换成数字信号。
  2. 另一种算法将试图把我问题的数字信号翻译成一串英语音素:感知上不同的声音(besté-[taį]-·福伊德)。串音位的过程对单个单词来说是合理的,但对句子来说是极其困难的。这种算法使用语言学方法来寻找“独特的单位声音”,利用一些有趣的语言学理论。
  3. 下一个算法将把这些音素“besté-[taį]-·福伊德”分割成它认为我说的单词。它很可能只是我的句子的一部分,它可以最好地解释,就像“最好的泰国菜”。结果将被发送到搜索引擎。
  4. 搜索引擎是对解释的字符串进行研究的关键部分。SE 本身只是一个巨大的管道,由一系列其他算法组成,处理查询并返回答案。
  5. 你猜对了,我的问题的这个答案将会进入另一个算法,将我的回答格式化成一个连贯的英语句子。
  6. 最后,最后一个算法将以非机器人、类似人类的方式用言语表达那句话;“我在你附近找到了几个亚洲地方.”

这几乎是每个人工智能系统如何工作的概念:在街道上导航的自动驾驶汽车,扫描你客厅的 Roombas,社交媒体反馈和建议,在线广告网络等等。

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

总结

对人工智能所做的事情和我所解释的内容的简单理解,遵循上面相同的“算法流水线”。

A.接受来自特定域的数据。

B.执行一系列计算。

C.给出我们的预测或决定。

人工智能算法的两个区别

  1. 这些算法通常处理概率,而不是处理确定性,就像说“我 91%确定 x 发生了”而不是“x 发生了”。
  2. 不同于传统算法(程序员提前修复那些指令,以便它运行并知道它在做什么),人工智能算法指令是由算法本身学习的。它直接从“训练数据”(这使它能够看到每一个类别的数千到数百万个例子)中做到这一点,并学会区分输入和输出。

结论

人工智能正在迅速发展,它在未来的应用几乎是不可避免的。随着越来越多的数据变得可用,硬件技术不断进步,以及我们是否有有道德意识的人帮助设计它,我们可能会也可能不会打开潘多拉的盒子。对于人工智能来说,程序员的角色不是“告诉”算法做什么,而是找到方法告诉它“如何”训练自己做什么:通过数据和概率规则。

作品引用

波尔森,尼古拉斯 g 和詹姆斯·斯科特。“介绍。”AIQ:人和机器如何一起变得更聪明。纽约:圣马丁出版社,2018 年。

发展中地区的气候变化和粮食短缺:Python 中的分析

原文:https://towardsdatascience.com/climate-change-and-food-scarcity-in-developing-regions-an-analysis-in-python-d8ca5ec5f496?source=collection_archive---------22-----------------------

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

Photo by Pixabay on Pexels

今天讨论的最重要的环境问题之一是全球变暖。这是由于气候变暖对农作物产量、天气模式、海平面、野火事件和生态系统的影响。自 19 世纪 50 年代有记录以来,全球气温上升的速度比任何时候都快,预计到本世纪末气温将再上升 1.8 至 5.8 摄氏度。全球变暖是由二氧化碳、甲烷、水蒸气、含氯氟烃和一氧化二氮等温室气体的排放造成的。

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

Source

这些气体对气候有隔离作用,导致大气吸收热量,使地球变暖。这些气体中有许多是从工厂化农业、汽车尾气、飞机尾气和化石燃料开采中释放出来的。

如果我们不尽快解决气候变化问题,生态系统将继续被破坏,海平面将继续上升,农作物产量(粮食产量)将减少。关于粮食生产,由于气候变暖,作物杂草、昆虫和虫害预计将会增加。

气候变化可能会对发展中国家产生不利影响,那里的粮食产量下降可能会导致营养不良、人口流离失所以及因过度拥挤导致的疾病传播。

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

Source

此外,世界卫生组织(世卫组织)声称对于传染病来说,气候变化是一个威胁倍增器:

它应对现有的威胁——无论是霍乱爆发、寨卡病毒向新地理区域的传播,还是干旱带来的严重营养不良——并增强这些威胁。风险是熟悉的,但它们的影响在频率和严重性上被放大了。气候变化会扩大传染病的分布,特别是由蚊子和其他媒介传播的疾病,并引发其他疾病的出现。尼帕病毒和汉坦病毒作为人类病原体的出现被追溯到极端天气事件,这些事件迫使动物宿主离开它们的生态位并入侵人类住区。

耶鲁气候连线还指出:

此外,气温上升会改变对一些病原体和毒素的暴露。考虑一下:生蚝中的沙门氏菌、弯曲杆菌、副溶血弧菌,以及真菌毒素真菌,它们都有可能在更温暖的环境中茁壮成长。大气中更多的二氧化碳也会减少某些作物中的膳食铁、锌、蛋白质和其他常量和微量营养素。

鉴于气候变化对粮食生产和疾病传播的未来影响,关于气候变化影响的公众教育至关重要。在本帖中,我们将对 ourworldindata.org提供的数据中心提供的公共气候变化数据和全球农作物产量数据进行简单的探索性分析。在另一篇文章中,我们将仔细研究一些传染病数据。

我们从导入 python 库 Pandas 开始:

import pandas as pd

我们要看的第一个数据集是每年的全球气温数据。我们可以将数据读入 dataframe 并打印前五行:

df_global_temp = pd.read_csv("annual_temp.csv")
print(df_global_temp.head())

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

接下来,我们可以过滤我们的数据,以便我们只获得与 NASA GISTEMP 源相对应的记录:

df_global_temp = df_global_temp[df_global_temp['Source'] == 'GISTEMP'].reset_index()[["Source", "Year", "Mean"]]
print(df_global_temp.head())

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

接下来,我们可以绘制年平均温度与时间的关系图。接下来,我们导入 python 可视化软件包“seaborn ”,并绘制时间序列的线图:

import seaborn as sns
sns.set()
sns.lineplot(df_global_temp['Year'], df_global_temp['Mean'])
plt.ylabel("Mean")
plt.title("Average Global Mean Temperature")

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

接下来我们可以看看 ourworldindata.org 提供的全球大米和小麦年产量。让我们将“rice-yield.csv”数据读入数据帧,并查看前五行:

df_rice = pd.read_csv("rice-yields.csv")
df_rice.head()

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

我们还可以观察一组独特的区域:

from collections import Counter
print(set(df_rice['Entity'].values))
print("NUMBER OF REGIONS: ", len(set(df_rice['Entity'].values)))

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

Countries in the Rice Yield Data set

总共有 148 个地区。知道发展中地区更容易遭受气候变化带来的风险,缩小我们的范围将是有益的。《时代》杂志称,尼日利亚、海地、也门、菲律宾和斐济将面临气候变化带来的最严重后果。

考虑到这一点,我们可以从尼日利亚的水稻生产开始:

df_rice = pd.read_csv("rice-yields.csv")
df_rice = df_rice[df_rice['Entity']=='Nigeria'].reset_index()[["Entity", "Code", "Year", ' (tonnes per hectare)']]
print(df_rice.head())

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

接下来,我们可以绘制 1960 年至 2014 年尼日利亚的水稻产量:

sns.lineplot(df_rice['Year'], df_rice[' (tonnes per hectare)'])
plt.ylabel("Rice Production in Nigeria (tonnes per hectare)")
plt.title("Annual Rice production in Nigeria")

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

接下来,我们可以叠加全球年平均温度和尼日利亚的水稻产量:

sns.set()
sns.lineplot(df_global_temp['Year'], df_global_temp['Mean'])
plt.ylabel("Mean")
plt.title("Average Global Mean Temperature and rice production in Nigeria")

sns.lineplot(df_rice['Year'], df_rice[' (tonnes per hectare)'])
plt.ylabel("Mean temperature/tonnes per hectare rice in Nigeria ")

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

有趣的是,1987 年至 2006 年间,尼日利亚的水稻产量似乎大幅下降。

我们也可以看看海地的水稻产量:

df_rice = pd.read_csv("rice-yields.csv")
df_rice = df_rice[df_rice['Entity']=='Haiti'].reset_index()[["Entity", "Code", "Year", ' (tonnes per hectare)']]
print(df_rice.head())

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

我们可以看它上面覆盖的气候数据:

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

海地的水稻产量似乎也略有下降。

我们也可以看看尼日利亚同样的小麦生产地块:

df_wheat = pd.read_csv("wheat-yields.csv")
df_wheat = df_wheat[df_wheat['Entity']=='Nigeria'].reset_index()[["Entity", "Code", "Year", ' (tonnes per hectare)']]
print(df_rice.head())
sns.set()
sns.lineplot(df_global_temp['Year'], df_global_temp['Mean'])
plt.ylabel("Mean")
plt.title("Average Global Mean Temperature and wheat production in Nigeria")sns.lineplot(df_wheat['Year'], df_wheat[' (tonnes per hectare)'])
plt.ylabel("Mean temperature/tonnes per hectare wheat in Nigeria ")

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

同样,随着全球年气温的上升,尼日利亚的小麦产量似乎有下降趋势。

在这一点上,从数据中得出任何结论都需要更详尽的分析,但到目前为止,我们的分析似乎与文献中报道的一致。我们将在这里结束我们的分析,但请随意查看其他地区的作物产量以及 datahub 上提供的一些其他气候变化数据。

如前所述,除了影响农作物产量,科学家认为气候变化对传染病的传播也有影响。在下一篇文章中,我们将分析公开发布的传染病数据和气候变化数据,看看我们是否发现了任何趋势。这篇文章中的数据集和代码可以在 GitHub 上找到。感谢您的阅读!

气候变化怀疑论——及其与英国退出欧盟的怪异联系

原文:https://towardsdatascience.com/climate-change-and-its-weird-connection-to-brexit-8247a243d815?source=collection_archive---------13-----------------------

有一个相当可靠的共识(62/38 ),即气候变化正在发生,这是由于人类活动。

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

如果你把范畴扩大到“环境”,关注做得是否足够,或者暗示有一个权衡,那么结果会逐渐变得更加平衡。

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

可能有些人已经在看这些图表了,他们想知道假设他们抓住了与气候变化怀疑论相同的东西是否合理——它们确实是不同的问题,涉及完全不同的辩论。所以,让我们看看气候变化问题的答案与英国选举研究数据集有什么关联/反关联(你不需要阅读/理解下面图表中的每个变量——但如果你想要一个部分解释者,在我之前的博客文章中有所涉及):

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

  • 这两个问题——环境保护和环境增长——确实与气候变化怀疑论有很强的关联
  • 毫不奇怪,气候变化怀疑论与喜欢(认为他们有能力/擅长处理‘最重要的问题’)绿党/他们的领导人是不相关的
  • 令人惊讶的是每一个其他高正/负相关变量都与直接相关(“你在欧元中投了哪一票?”)或间接向英国退出欧盟(“你对川普/海外援助/移民有什么感觉?”这三者都与 euref 投票密切相关)
  • 如果你想知道这有多不可能,我对英国选举研究数据集的处理创建了约 6800 个变量,其中约 5%直接/间接与英国退出欧盟有关。所以,不太可能。

那么,气候变化怀疑论对 euRef 投票的瓦解是什么样的呢?

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

如果你看看每个离开和留下的分布,而不是每个气候变化类别中的差异,这就不那么明显了(几乎大多数离开者认为气候变化正在发生,并且是由人类造成的)。

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

但也许这是某种侥幸的模式,只适用于这一个问题?号码

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

好吧,这有点奇怪——但也许这只是与绿色政治的混淆——例如,绿党反对英国退出欧盟,支持移民,可能不喜欢川普。也许如果我们控制人们对绿党的看法,这种模式就会消失?

下面是针对气候变化怀疑论(相信人类创造的气候变化← →不相信气候变化)回归英国选举研究数据集中所有变量(除了上面提到的另外两个变量)的结果。

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

这是一种非常非常懒惰的方法(如上所述,如果你想要更多关于图表如何制作/如何阅读的细节,部分解释者在此 )—我没有将它缩小到一个单独的波,所以你可以看到在不同的波中问的同一个问题——但是你可以看到那些明显相互混淆的变量(无论你是否喜欢 2017 年以及 2016 年的绿色)如何抑制彼此的影响。

值得注意的是,这看起来多么像一份懒惰的刻板印象清单(我再次强调,这是一个基于 6800 个变量的完全自动化的过程)——特朗普支持、同性恋恐惧症、拒绝外国援助、拒绝专家、支持紧缩、支持传统性别角色、相信英国无需做出任何让步就能获得完全的“单一市场”准入。当然,还有《每日邮报》的读者!

显然,文化战争的东西(值得注意的是,有政党标记在那里,但没有左右经济分裂)。英国不是美国——你可以看到核心保守党投票偏向气候变化怀疑论——以及一些保守派精英(马特·雷德利/尼格尔·劳森)的反映……但我不认为你可以认为这是政党层面创造的东西,并通过党派之争传播给选民。

除了注意到这可能与心理倾向有关——就像对紧缩、移民、特朗普、性别角色、同性恋的态度一样——至少与明确的意识形态一样,很难知道如何处理这一点。

对于这些情绪,我们只知道两件事是肯定的:

  • 他们可以很快改变
  • 没有人确切知道是什么改变了他们

对这篇文章的早期评论(嗯,评论)提出了这样一个问题:所有这些事情是否仅仅是“正确”的问题。根据之前的文章,人们对“正确”的理解总是含糊不清——这是政治指南针上的细分(警告这张图表是一种实验性的——就像“还不是很好”——通过只显示上部轮廓(峰值),x 标记每个类别的平均值,在一个图表上获得几个重叠分布的方法):

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

附录——应 Leo Barasi 的要求,我添加了环境增长和环境保护的回归分析(但我删除了与绿党相关的变量):

  • 值得强调的是,这些都是快速运行(将安排更深入的版本在夜间运行),由于我已经排除了许多最佳预测因素,这些模型只能解释一小部分差异……但是天啊,这真的很明显
  • 更新:跑步现在是慢版本(R /variance 解释约 25–30%—考虑到我们已经剔除了所有绿党变量,这还不错)
  • 要明确的是——并在某种程度上先发制人统计学家的蔑视——这些回归模型的目的是探索性分析。统计学家中有一种并非完全不公平的趋势,认为机器学习是不专业的统计——这是真的,因为机器学习模型让人们想象他们可以跳过模型生成/分析步骤。但是,只要你认为这是对“相关变量”的详尽分解,你就没问题。

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

Believes Climate Change Happening and Caused By Humans ← → Believes Climate Change Not Happening

  • expect access/negotiationSpecifics _ None =英国将在英国退出欧盟之后获得完全的单一市场准入(/不做任何让步)
  • redistCon =受访者认为保守党倾向于再分配的地方
  • 普通劳动人民没有得到他们应得的国家财富

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

Measures to protect environment: Not gone nearly far enough ← → Gone much too far

  • 无电子参与:2 =签署请愿书,7 =出于道德原因购买/拒绝购买产品
  • house build……在英国选举研究问卷 pdf 中缺失——与 councilHouse 密切相关……也不在 pdf 中!不得不礼貌地问 BES 团队。

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

Economic Growth vs Environmental Protection: Economic growth should have priority ← → Protecting the environment change should have priority

  • 性别差异很有意思——这也解释了威权主义等级预测优先考虑经济增长的模式,但有一个元素(al4 =审查)预测优先考虑环境,因为在 al4 上有很强的性别差异(有理由将其从 al_scale 中删除)
  • 优先考虑经济增长会产生收入效应(尽管很小)
  • 报纸读者群“无”效应很难解读——大多数报纸给你一个优先考虑经济增长的理由了吗,还是说它与不读报纸有关?(注意之前的博客显示,不看报纸的读者在价值观上不会偏离大众

Python 笔记本(相当清晰)

气候热图变得简单

原文:https://towardsdatascience.com/climate-heatmaps-made-easy-6ec5be0be6ff?source=collection_archive---------19-----------------------

用熊猫和海牛调查古气候数据

不久前艾德·霍金斯博士,恰好是气候螺旋的创造者,向世界发布了从 1850 年到 2017 年全球年气温的变暖条纹图。这个概念很简单,但也非常丰富:每个条纹代表一年的温度,随着时间序列的推移,任何人都可以非常明显地看到变化。

从本质上讲,这些条纹一起构成了一个热图,而热图很容易通过Seaborn的一点帮助来制作。这里的目的是扩展几个世纪的变暖条纹,从稍微不同的角度来看温度变化,但为此你需要数据。

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

The original Warming Stripes made by Dr. Ed Hawkins

穴居人的气候

顾名思义,古气候学是一种专注于遥远时代气候条件的研究——从几个世纪前到我们星球出现后的第一个千年。

你可能会疑惑:我们怎么才能知道?这有点复杂,但古气候学通过使用被称为代理的数据,树木年轮、冰芯、珊瑚和其他自然资源中包含的温度降雨量的间接测量数据而繁荣发展,这些数据被仔细分析以提供良好的气候信息重建。

你可以去很多地方下载古气候时间序列,但是你的第一站应该是 NOAA 的国家环境信息中心(NCEI)数据库。对于喜欢气候的科学家和数据来说,这是一座金矿(但不是唯一的一座)。

把所有的放在一起

您将使用的数据代表了从 1000 年到 1998 年北半球温度的时间序列重建,这在 Mann、Bradley 和 Hughes (1999) 的开创性工作中有所展示。你可能从曲棍球棒图中知道这一点,但是现在你将有机会在这里制作你自己的版本的图。

首先,导入常见的疑点:

读取文件

使用Pandas可以通过read_csv()读取包含时间序列的文本文件:

delim_whitespace=True参数识别由空格分隔的数据列,使用header=None您对Pandas说您的数据没有标题,也没有特定的列名,因此数据文件中的时间序列如下所示:

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

Two simple columns

这些列由索引号识别,第一列为“0”(年份列),第二列为“1”(温度数据)。好消息是Pandas允许您用任何您喜欢的str名称来重命名列,例如:

你自己的曲棍球棒

一个令人惊叹的Seaborn功能是可以根据不同的喜好为您的图形设置stylecontext,例如:

虽然有许多选项,但所选的styleticks和上下文talk,也从Matplotlib参数中定义了lines.linewidth。查看[Seaborn](https://seaborn.pydata.org/tutorial/aesthetics.html) 文档了解更多信息。

样式准备好了,是时候用SeabornMatplotlib的组合来绘制你的曲棍球棒图了:

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

The Hockey Stick, right at the end (where we are now)

上面发生了什么事?你用sns.lineplot()绘制温度数据就像你用Matplotlib中的标准plt.plot()一样,而红色和蓝色阴影区域在axvspan()的帮助下(带着诗意的许可)代表了中世纪温暖期小冰期。任何接触过Matplotlib的人都熟悉set_xlabel()set_ylabel()函数,但是在这里你可以看到它们也可以很好地处理$\degree$符号的 LaTeX。

别再打曲棍球了,条纹在哪里?

古气候条纹

将原始变暖条纹作为热图来看,图表没有显示任何颜色条,也没有轴标签和刻度,因此抑制这些以保持您自己的条纹的保真度是很重要的。为此,Seaborn提供了足够多的选项来做一个好的近似。

需要注意的一点是,Seaborn需要一个 2D 数组作为输入数据,而您的时间序列是一个简单的 1D 数组:

解决这个问题的一个方法是使用NumPy并用[np.newaxis](https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.indexing.html#numpy.newaxis)创建一个新的维度。解决了这个问题,制作自己的条纹就很容易了:

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

How comparable is the Hockey Stick era to the last 1000 years?

使用sns.heatmap()你的论点是:

  • data:温度时间序列mbh99
  • cmapcbar:来自[Matplotlib](https://matplotlib.org/examples/color/colormaps_reference.html) seismic颜色图(其他酷的有:RdYlBu_r、地震、coolwarm、bwr、RdBu_r)和False来抑制颜色条
  • vminvmaxcenter:绘制颜色的最小(-.4)和最大(. 1)极限,而红色和蓝色在 0°处发散。
  • xticklabelsyticklabels:所有False使条纹可见

你在这里,你自己的温暖条纹。很容易,不是吗?

结论

古气候学是对遥远时期气候的研究,从几个世纪前到地球诞生的最初几天。NCEI 的古气候数据库允许任何人下载来自不同研究的几个数据集,例如 Mann、Bradley 和 Hughes(1999),但是你也可以从许多其他人那里获得数据。

只需一点点PandasSeaborn你就可以读取数据并为你感兴趣的任何时间序列制作热图,比如你在这里使用的,并制作你自己版本的变暖条纹(以及许多其他东西)。玩得开心!

PS:就在这里,你可以很容易地获得源代码和数据

参考

[1]m . e . Mann、r . s . Bradley 和 m . k . Hughes(1999 年)。过去一千年北半球的温度:推论、不确定性和局限性。 地球物理研究快报26 (6),759–762。

通过编码一路攀升

原文:https://towardsdatascience.com/climb-your-way-through-coding-15bfc2c81df0?source=collection_archive---------30-----------------------

学习新事物可能很难。不,我不是说记住新的东西。真正的学习只有真正的理解才能实现。有时候,人们需要一点时间来理解一个新概念。这并不是说没有听到新的想法或知道它是有意义的,但让一切都到位可能不会马上发生。对我来说,这通常发生在我能以不同的方式看待这个主题,将我已经理解的东西联系起来,并看到相似之处的时候。我发现这是最有效的学习方法之一。找到背后的逻辑,然后想办法把这种逻辑表现为熟悉的东西。说到这里,是时候讲故事了。

大约一年半前,我开始玩抱石。我很快(也很高兴)意识到,这不仅仅是力量的问题,还需要平衡、灵活性和解决问题的能力。我学到的最重要的一个方面是如何使用你的能量。更具体地说,如何保存你的能量。使用你的肌肉需要很大的努力,所以试图支撑自己或解决问题会很快让你疲惫不堪。你必须让每个动作都有价值,使用力量、运动和杠杆的正确组合来让你到达下一个支点,当你到达那个支点时,你想停止使用你的能量。你可以让你的重量沉入你的脚,你的手臂伸出来,这样你就不会太用力了(考虑做一个引体向上——你可以让自己在底部悬挂的时间比你在中间的时间长得多)。

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

Extended arms, resting — Photo by yns plt on Unsplash

这是你一直想回到的地方。它主要是试图处于这种放松的状态,在重要的部位爆发一些能量。这真的提醒了我,这篇文章也有一个观点,我可能也应该回到这个观点上来,在我失去所有人之前,我漫谈我有多么喜欢攀岩。

我最近在大会上完成了数据科学沉浸式项目。虽然它涵盖了成为“数据科学家”意味着什么的许多领域,但一切都是通过编码实现的,主要是用 Python。在我的一生中,我对编程有一些简单的经验,但只知道一些基础知识,从未构建过任何有意义的东西。所以在 GA,当我开始真正学习如何编码,以及什么是好的编码的基础时,一个熟悉的主题出现了。重点是构建能够采取经常执行的复杂操作并在一个步骤中完成这些操作的功能。有一句话不断被重复——“战略懒惰”

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

Functions! (Well, methods. The functions of classes!) — Photo by Chris Ried on Unsplash

您打算运行相同的代码来收集新数据吗?让它成为一个功能!你会做同样的图,只是改变数据吗?让它成为一个功能!你不想一遍又一遍地输入同样的东西。它不仅是你已经完成的一个动作,而且会开始占用你很多时间。而且动作越复杂,占用的时间就越多,你在这一块出错的几率就越大。当然,您可以多次复制和粘贴某些内容,但是此时,您开始占用文档中的宝贵空间,并且随着复杂性的增加,您也开始浪费存储空间。因此,一方面,不想输入不必要的东西是“懒惰”,但实际上最终会帮助你——这是“战略”部分。

这让我们回到抱石。在你开始攀登之前,你必须确保你已经看到了完整的路线。弄清楚你的起点,知道终点在哪里,知道你对中间所有步骤的计划是什么。一旦你爬上那面墙(或岩石),时钟就已经开始了。现在开始考虑你在做什么已经太晚了,因为你的能量已经在减少了。这在编码时同样重要,尤其是在数据科学问题上。如果你只是假设,或者根本不考虑目标,一头扎进去,你可能会发现自己在项目进行到一半时,意识到你构建的东西是不必要的,或者你很容易就能构建出必要的东西,但却没有意识到。因此,当我听说“战略懒惰”时,我可以看到这不是不想做工作,而是保存你的能量,并有效地利用你的努力。

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

You could be climbing AND coding! Terrible Wi-Fi though.

所以现在当我看着一个编码目标时,我试着把这个过程想象成一个抱石问题——我确信我能轻松完成哪些部分?哪些部分是我要纠结的?我在哪里可以看到事情可能会出错?然后,我就可以知道应该把精力放在哪里,知道哪些简单的部分可以很容易地自动化,哪些困难的部分需要我的全部注意力和技能。我知道这不是一个完美的比喻,也不是每个人都这么看,但当我在搞清楚一个项目,或者对眼前的事情感到有点气馁时,我可以用它。所以前进吧,找到你的隐喻!用新的不同的方式看待事物!你可能会建立一些新的联系,并开始以你以前从未有过的方式理解。

用网络浏览器自动化和 R 攀登惠特尼山

原文:https://towardsdatascience.com/climbing-mt-whitney-with-web-browser-automation-and-r-b11dcf9353b2?source=collection_archive---------25-----------------------

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

Mt Whitney by Dan Eckert

惠特尼山是美国境内最高的山,你需要一个许可证才能攀登它。这些许可证是有限的。但有时,有人会归还他的许可证。它将出现在许可证网站 recreation.cov 上。我想得到其中的一个,并会告诉你如何。

我的一个朋友有两周的时间去申请惠特尼山的许可证。直到他提出这次旅行,我才真正了解这座山。惠特尼山位于加利福尼亚州,海拔 4421 米。因为每年都有很多人想去那里。美国农业部林务局决定限制徒步登山的许可数量。要获得许可,你只需登录这个网站,查看你和#徒步旅行者的约会是否有空。

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

Mt. Whitney permit website (2019 Oct 3rd)

你会很快注意到,如果你不是一个早起的人,你想要约会的所有许可都消失了。现在你有三个选择。一,辞职不爬山。第二,每天自己查看网站,看看是否有新的或退回的许可证。第三,让一个机器人或浏览器自动为你检查许可。我的朋友决定问我第三种选择。由于我对硒元素有一些经验(最近刚刚在 EARLconf 展示),我想尝试这种方法。

遵循本教程所需的知识

RSelenium 和 docker 入门

首先,我想在云上运行我的机器人。此外,我想获得一个可复制的环境。所以我决定遵循 RSelenium 的小插图方法。这意味着为硒使用 docker 容器。所以我的第一个任务是旋转两个 docker 容器。第一个应该运行 Selenium,第二个应该运行 R 和 python 来访问它。

旋转硒容器很简单:

docker run -d -p 4445:4444 --name seleniumcontainer --net mynet selenium/standalone-chrome

我在 docker 容器之间使用了一个名为mynet的共享网络。这允许两个 docker 容器在网络中找到彼此,甚至通过名字。

第二个 docker 容器必须由三个文件组成。

  1. 执行我的硒元素调用
  2. sendmail.py从 python 发送电子邮件
  3. DockerFile建造码头集装箱

docker 文件需要看起来像这样:

https://gist.github.com/zappingseb/6d65f7d27ce85185c785613f83a8036f

我使用了tidyverse docker 容器并安装了 RSelenium 包。另外,我安装了 python secure-smtplibemail。我还在 docker 容器中添加了一个 cronjob。该 cronjob 将通过以下方式每 12 小时运行一次网络爬虫:

RUN apt-get update && apt-get -y install cron
RUN echo "0 */12 * * * root Rscript /tmp/run_tests.R" >>   
  /etc/crontab
RUN service cron start

现在我想旋转 docker 容器。但是我的sendmail.pyrun_tests.R文件不见了。让我们来创造它们

用砷来爬许可证

要使用 RSelenium,您首先需要连接到 Selenium 服务器。它在另一个 docker 容器中运行。要连接到它,请运行:

remDr <- remoteDriver(remoteServerAddr = "seleniumcontainer", browserName = "chrome")

只要容器在mynet.内运行,名称seleniumcontainer将被自动识别,两步将进入惠特尼山许可证网站。打开浏览器并导航到网站:

remDr$open()
remDr$navigate("https://www.recreation.gov/permits/233260/")

使用许可表单

更难的是找到可以点击的元素。首先,我注意到我需要点击选项“所有路线”,这是下拉菜单中的第三个选项:

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

Mt Whitney dropdown menu HTML code

该选项可通过其id访问。这个 id 是division-selection。通过用id点击元素,下拉菜单将打开。下拉菜单打开后,您需要点击网站上的第三个option元素。通过这 4 行代码,您可以使用 RSelenium 实现它:

el_1 <- remDr$findElements("id", "division-selection")el_1[[1]]$clickElement()el_2 <- remDr$findElements("css selector", "option")el_2[[3]]$clickElement()

如您所见,findElements返回了一个包含所需属性的 webElements 列表。clickElement是这样一个 webElement 的方法,基本上会点击元素。

这是浏览器自动化步骤中最简单的部分。更难的部分是输入徒步旅行者的数量。更改它们最安全的方法是不仅在文本字段中键入内容,而且使用 javascript 来更改它的值。字段number-input-将用于此。

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

Mt Whitney numeric input

为了改变这个值,我使用了下面的代码:

el_3 <- remDr$findElements("id", "number-input-")# executing a javascript piece to update the field value
remDr$executeScript("arguments[0].setAttribute('value','1');"), list(el_3[[1]]))# clearing the element and entering 1 participant
el_3[[1]]$clearElement()el_3[[1]]$sendKeysToElement(list("1"))

你可以清楚地看到我想要一张进山的许可证。javascript 片段运行在 webElement 本身上,它存储在el_3[[1]]中。对于硒元素,我更喜欢用remDr$findElements方法寻找元素。之后,如果我确定只有一个元素,我就取第一个。方法clearElementsendKeysToElement删除旧值并输入所需值。sendKeysToElement的 API 有点奇怪,因为它需要一个键列表,而不是一个字符串。但是一旦使用了,就很容易保存你的代码。

与许可证日历交互

在这些步骤之后,带有许可的日历被激活。我想在 2019 年 10 月拿到许可证。所以我需要点击“下一步”,直到 10 月份到来。

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

Mt Whitney next button

我使用while命令构建了一个循环来执行这个任务

# Get the initial month shown
month_elem <- remDr$findElements("css selector", ".CalendarMonth_caption strong")
month <- month_elem[[1]]$getElementText()# Loop to until the October calendar is shown
while(!grepl("October", month)) {

  el_4 <- remDr$findElements("css selector", ".sarsa-day-picker-
    range-controller-month-navigation-button.right")
  el_4[[1]]$clickElement() Sys.sleep(1)
  month_elem <- remDr$findElements("css selector", 
    ".CalendarMonth_caption")
  month <- month_elem[[2]]$getElementText()}

包含月份的元素有标签class="CalendarMonth_caption"><strong>...</。我用 CSS 选择器访问了这个。单击 next 按钮,它有一个特定的 CSS 类,一个新的日历名称会显示出来。我花了一段时间才发现旧的日历月并没有消失。现在必须检查第二个元素的名称。所以我用新显示的日历标题覆盖了month变量。

从日历中导出第一个可用日期

作为人类,找到一个空闲的日子很简单。只要看看日历,搜索里面有 A 的蓝色方框:

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

Calendar with available day at Mt Whitney

对于电脑来说,没那么容易。就我而言,我只有一个问题要回答。2019 年 10 月第一次爬惠特尼山是什么日期?

day_elem <- remDr$findElements("css selector", ".rec-available-day")
if (length(day_elem) < 1) {
  earliest_day <- "NODAY"
} else {
  earliest_day <- strsplit(
    day_elem[[1]]$getElementText()[[1]],
    split = "\n")[[1]][1]
}

因此,我搜索任何带有类rec-available-day的条目。为了防止出现任何条目,我获取了第一个条目的文本,并获取了换行符之前的所有字符。这提取了日期的数字。现在,把这个包起来,发一封电子邮件,注明日期:

fileConn<-file("/tmp/output.txt")writeLines(paste0("The earliest day for Mnt Whitney in ", month[[1]], " is: ", earliest_day, "th of October 2019.\n\n-------------------\n"))close(fileConn)# Write an email from output.txt with python
system("python /tmp/sendmail.py")

激活 docker 容器

脚本完成后,我将所有文件打包在我的 GitHub 存储库中(zappingseb/mtwhitney) 。他们将通过每 12 小时发一封电子邮件来帮助我。从那里,我回到我的 docker 服务器,git 克隆了存储库。然后,我可以运行以下命令来启动 docker 容器:

docker build --net mynet --name mtwhitney -f Dockerfile .

并通过连接到 docker 容器来测试脚本一次:

docker run -it mtwhitney /bin/bash

并使用以下命令运行脚本:

sudo Rscript /tmp/run_tests.R

我收到一封邮件。收到邮件后,我确信脚本会运行,并使用Ctrl + pCtrl + q断开连接。

学习

写这篇文章真的让我收到了一封电子邮件,里面有一个免费的位置和攀登惠特尼山的许可:

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

email from Browser Automation

浏览器自动化对这样的用例很有帮助。它帮助我获得了许可证。我没有通过每隔几秒钟浏览网站或查看具体日期来过度设计它。这更像是一个有趣的项目。你可以想出很多办法让它变得更好。例如,如果有日期,它可以发送电子邮件。但是我想每 12 小时获取一次日志文件,看看是否出了什么问题。

在抓取过程中,网站更新了一次。所以我收到了来自我的刮刀的错误信息。我把脚本改成了这篇博文中的脚本。如果你明天想刮掉惠特尼山的书页,这个剧本可能不起作用。Recreation.gov 可能已经换了网站。

我使用浏览器测试来使我的 R-shiny 应用程序更安全。我在一个受监管的环境中工作,这些测试让我节省了很多时间。这一次,如果没有像 RSeleniumshinytest 这样的好工具,我会花时间进行点击测试。尝试一下,享受你的浏览器为你做的工作。

相关文章

作者注:您也可以用纯 python 代码完成所有这些工作。我只是更熟悉硒元素和 tidyverse docker 容器。这让我的生活更轻松。

临床数据科学导论

原文:https://towardsdatascience.com/clinical-data-science-an-introduction-9c778bd83ea2?source=collection_archive---------10-----------------------

临床数据科学

超越统计测试和 p 值。

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

Photo by Hush Naidoo on Unsplash

介绍

关于

临床研究//流行病学 是对患者进行研究以探讨新疗法或改进现有疗法的领域。在这个过程中,收集并生成了大量需要处理的数据。这篇文章的目的是分享一些来自 数据科学 的技术,供临床使用。此外,还介绍了一个案例研究,该案例研究已在科学杂志上发表。请注意,大多数提到的方面当然不限于临床领域,在其他地方也可能遇到。

一些定义

首先,我们来分享一些临床研究中经常用到的表达式的定义(摘自维基百科)。

生物标志物 :某种生物状态或状况的可测量指标。通常测量和评估生物标记来检查正常的生物学过程、致病过程或对治疗干预的药理学反应。

主要结果 :一个临床终点,该终点提供了足够的证据,以支持治疗的监管声明的方式充分描述了治疗的临床效果。重要的是,主要结果是“硬的”,即可测量和明确定义的标准,如干预或缓解(疾病的体征和症状减少或消失)后 30 天内死亡。

次要结果 :治疗的额外临床特征,但其本身不能令人信服具有临床意义的治疗效果。次要结果与主要结果相关,并支持研究的成功。它们可以是“软的”,例如从一到五的范围内患者感知的疼痛。

替代终点 :特定治疗效果的衡量标准,可能与真实临床终点相关,但不一定有保证关系。美国国立卫生研究院将替代终点定义为“旨在替代临床终点的生物标志物”。

通常,人口统计学属性(年龄、性别、种族)、生物标记(血红蛋白、心率、白细胞)和治疗参数(剂量、频率)是特征(自变量),结果/终点是输出(因变量)。

数据管理

是否允许(以及如何)处理患者数据的问题经常出现,因此对所谓的【GCP】良好临床实践进行一些评论可能会有所帮助。 临床试验 的工作方式是,一个 赞助商 (例如一家制药公司)就试验/研究的内容写一份建议书,然后该建议书必须得到某个 伦理委员会 的批准。一旦主办方获得开展研究的许可, 研究者 (例如医院的医生)就可以开始招募患者进行临床试验。(请注意,有可能成为申办者-研究者、,这是医院研究小组的情况。)医生必须向他们的病人详细说明这项研究,它对社会的益处,以及一些潜在的风险。他们不被允许为他们的参与支付报酬,但是那些参与的人可以以其他方式得到补偿。签署 知情同意书 的患者同意参与并提供其数据,这些“受试者”随后会收到一个患者识别号。将名/姓映射到患者识别号的字典必须安全存储。患者将接受研究护士和医生的检查,他们将收集数据并将其存储在数据库中。请注意,这些患者可能只去医院一次或几次(纵向研究),他们可以随时离开研究。数据收集过程非常昂贵,因为这些数据是通过实验产生的。此外,由于参与可能会给患者带来压力,研究人员必须确保他们生成/收集的数据是高质量的。

数据分析

一旦从 群组 中收集到足够数据,就可以开始分析了。在谈论数据科学方法及其挑战之前,应该说明在流行病学研究中通常是如何进行分析的。

经典方法

让我们假设这项研究是在 肺病学 进行的,该小组希望调查“运动”对肺功能的影响,即运动(例如每周花在耐力运动上的时间)是使肺“变好”还是“变坏”。肺功能肺活量测定法确定,并提供1 秒用力呼气容积(FEV1) ,其将被定义为结果。因为它是一个连续变量,所以会进行一些回归,这可能是线性的。将对群组的子集进行采样,例如,那些在某些特征中没有缺失值/异常值的患者,或者那些在输出值的某个范围内的患者(并且将绘制哪些患者被包括在模型中的流程图,以便清楚其对谁有效);人口是非常明确的。接下来,医生将解释模型中必须包括哪些其他效应以校正 FEV1 的变化(即已知效应)。例如,与不吸烟/没有哮喘/没有暴露于污染的人相比,吸烟/患有哮喘/暴露于环境污染的人将具有较低的 FEV1。将执行 (线性)回归 (使用这几个标准化的连续变量和分类变量),并根据其大小(和符号)比较系数,以讨论相对影响。

或者,有两个亚组,例如体检时间少于两小时的亚组和体检时间超过两小时的亚组。每个亚组在测量的 FEV1 方面具有平均值和标准误差,并且执行 学生 t 检验 / 曼-惠特尼 U 检验 ,并且检查 p 值 是否低于 0.05(对应于 95% 置信区间 )。如果是,结果被认为是统计显著的,即存在影响。

以上是来自 【生物】统计 的一些标准方法。人们可能会对提前选择变量的事实感到惊讶,因为无法以这种方式发现意外情况,因为永远不知道(完全)要将哪些变量包括在结果“校正”的集合中。然而,收集许多生物标志物还不是普遍的做法。一方面,这种情况正在慢慢改变,人们正在讨论更系统地收集数据。另一方面,在收集了大量数据的情况下,人们希望应用机器学习方法。

数据科学方法

在传统方法中,一切都是明确定义和预先选择的,与此相反,数据科学方法更加开放。公式化的问题是一样的,但是所有的变量都包括在内,人口不必分层。我们来看一个来自 肾脏病 的例子。有一组 慢性肾脏疾病 患者,即肾脏停止工作而需要 肾脏替代疗法(透析) 的人,并且观察到一些患者在治疗开始后死亡。还不完全清楚为什么会发生这种情况,即调查患者死亡率是任务。也许治疗过程还没有优化,也许这取决于患者。然而,我们的想法是开发一个具有尽可能少的不相关变量的模型,同时仍然保持模型的性能。关于每个患者的人口统计学、治疗参数和实验室值的一些数据可以作为时间序列获得(通常,这样的问题由 生存分析/卡普兰-迈耶估计 来回答)。

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

Figure 1: Reported causes of death as 1-grams in a word cloud. (image by author)

让我们在不多谈数据预处理的情况下提及一些可能遇到的问题,因为已经有其他文章讨论过了。

  1. 可能没有时间开发新的东西,所以最好使用标准库,如 PandasScikit-LearnMatplotlib
  2. 数据集可能是倾斜的,例如,20%的正类,80%的负类。作为性能标准,准确度将不起作用,更合理的是在网格搜索中最大化(作为一个或多个超参数的函数)。此外,存在许多必须首先移除的,例如通过计算 标准分数 并移除极值。****
  3. 删截 是最具挑战性的方面之一,因为删截患者的结果未知。为了解决这个问题,这个问题可以定义为在透析开始后存活一定时间的概率,在这种情况下,是 5 年(包括不同时间间隔的敏感性分析)。通过计算平均值中值统计数据,假设每个组都来自多维分布(这也可以仅从死亡前最后几个月的数据中得出,人们必须尝试什么效果最好)。只有在这五年的时间内具有已知结果的患者将被包括在内,标记为 y=0(存活)和 y=1(死亡)。然而,这样做去除了时间成分并显著缩小了数据集,并且是 选择偏差 的来源。
  4. 不是每个变量都适用于每个人。此外,测量间隔不规则。重要的是只保留那些定期测量的数据,以避免潜在的偏差(由于 插补 缺失值)。
  5. 需要一种存在若干相关或冗余特征的数据挖掘方法。计算 相关系数 有助于识别冗余变量。
  6. 将结果传达给一群不熟悉数学和算法并且已经建立了方法的人是另一个挑战。因此,使用可解释的算法或使用额外的模型检查技术更容易,例如 【置换重要性】【部分相关性】随机森林 是一个伟大的算法,因为它具有高度的可解释性,并且不需要担心特征工程。此外,在现代实施方式中,还有内置的过配合 / 欠配合防止功能。
  7. 可能存在 采样偏差 ,例如,队列中年龄较大的患者多于年龄较小的患者,这可能导致错误的结论。如果总的来说有更多的老年患者,那么可以预料会有更多的患者死亡。这可能是最大的困难,因为你永远不知道一个效果是自然发生的,还是因为你的采样不好。

**** [## 偏见如何扭曲你的预测

理解数据及其分布是精确模型的关键。

towardsdatascience.com](/how-sampling-biases-might-be-ruining-your-predictions-f9e021d79723)****

在具有总共 105 个变量的随机森林的第一次运行之后,获得了以降序 特征重要性 排列的长列表。

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

Figure 2: Feature importance of the thirty most importance variables. (image by author)

这些变量中很可能有一些是相互关联的。此外,随着重要性的降低,一个特性对整体性能的贡献也在减少。您可以设置一个最小重要性阈值,在此阈值之后,功能将变得不相关,或者固定功能的数量(并让它来确定阈值),这两种方法是等效的,因此在这种特定情况下将保留 20 个最相关的功能。此外,在相关特征集合中(根据等级相关性,阈值在+/- 0.7 以上/以下),保留具有较高临床相关性的那些特征。

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

Figure 3: Correlations among the 20 most important features. (image by author)

此外,去除由非均匀采样(采样偏差)产生的变量也很重要。例如,如果队列中年龄比年轻患者大得多,就很难对患者的年龄对死亡的影响做出说明。也许更年轻的患者离开研究是因为他们优先接受器官移植。必须仔细检查这些变量,因为它们会导致错误的结论。**

最终模型包含 12 个特征,预测准确率为 80%。最好计算一个 ROC 曲线 来展示性能(另一个选项是构建 混淆矩阵);在这种情况下,曲线下的面积应该与精度相对应。该模型比随机猜测要好,因为曲线在对角线上方。理想情况下,应将模型性能与某些 黄金标准 进行比较(如果有),因为只有这样才能真正评估性能。如果还没有可用的黄金标准,甚至比随机猜测稍微好一点的表现就足够了——理论上。模型未能预测一些病例,因此可能没有足够的信息来预测所有的死亡。或者,一些样本可能与疾病完全无关(通常,应该记录某人死亡的原因)。

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

Figure 4: ROC curve for performance estimation of the final model. (image by author)

另一种表示这两个组(并观察它们的可区分性)的方式是通过降维方法绘制它们,例如 t 分布随机邻居嵌入 。点的大小与白蛋白水平成反比,因为这是最重要的特征。较大的点在第一次透析后五年内死亡的概率较高。我们看到脆弱的病人倾向于聚集,他们与强壮的病人重叠。一种可能的解释是,这些健壮的病人有死亡的危险。还可以看出,一些死亡发生在更类似于健壮状态的状态。这可能意味着未记录的任何类型的事故都可能包含在数据集中。此外,没有明显的异常值。**

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

Figure 5: Dimensionality reduction by t-distributed stochastic neighbor embedding with the features of the final model. (image by author)

下图显示了模型中变量的最终列表。 白蛋白 的相关性在 20 世纪 90 年代就已为人所知,并且证明该方法是可行的。注意,这种方法也可以用于 生物标志物发现 。虽然白蛋白被证明在这种特定情况下(血液透析)是一个很好的标志,但值得一提的是,它不是一个非常特异的 死亡标志,因为它暗示了一系列其他可能的病理,如脱水、高血压、糖尿病、营养不良、肝损伤等。**

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

Figure 6: Importance of features in the final model. (image by author)

通过计算特征的部分相关性来观察效应发生的方向也是令人感兴趣的。对于白蛋白,我们看到较低的值会增加死亡的概率,并且这个阈值与之前报道的一致。人们现在可以想出给病人提供白蛋白的主意,但这只有在这是死亡的根本原因而不仅仅是症状的情况下才会起作用。但总的来说,这将是一种开发个性化治疗/疗法的方法。**

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

Figure 7: Partial dependence of albumin on death. (image by author)

在临床研究领域,尽可能精确地工作是很重要的。尽管医生已经对自己的工作持怀疑态度,但也应该这样做。如果得出错误的结论,人们可能会想出可能伤害患者的治疗/程序。然而,如果工作做得好,许多生命可以被挽救——例如通过创建有用的应用来预测病人的状态

网络空间的克隆人战争

原文:https://towardsdatascience.com/clone-wars-in-cyberspace-the-contest-between-facebook-google-twitter-and-linkedin-to-create-6d2a9bc0f718?source=collection_archive---------29-----------------------

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

Photo by Greg Ortega on Unsplash

看似相似的造型

脸书、谷歌、Twitter 和 LinkedIn 之间创造完美复制品的竞赛

QUT 商学院广告、营销和公共关系高级讲师 Edwina Luck 博士共同撰写。

你有没有想过自己有没有二重身?双胞胎吗?和你有相同 DNA 的人?这是一个很有趣的问题,可能属于科幻电影或书籍。《银翼杀手 2049》中的一个概念,而不是我们 2019 年的现实。但是许多人没有意识到他们有一个替身的可能性很大。在征服网络空间的战争中,脸书、谷歌、Twitter 和/或 LinkedIn(即将推出)上的一种算法可能已经创造出了你的完美复制品。

在线克隆人并不是什么新鲜事。多年来,脸书、谷歌和 Twitter 一直在各自的广告平台上竞争创造相似的受众。脸书广告公司宣布在 2013 年 3 月发布他们的 长相相似的观众 专题,而 Twitter 广告公司在同年 12 月推出了他们的 量身定制的观众 ( 一个非常相似的专题)。然后,谷歌广告也抄袭了脸书,在 2015 年发布了他们的 客户匹配 功能。今年 1 月,LinkedIn 宣布他们正在研究长相相似的受众,这是脸书广告平台的关键特征之一。

相似的观众是通过一种叫做相似建模预测分析方法创造的,这种方法使用机器学习根据当前和历史数据预测未来的结果。例如,机器学习可以根据客户购买的内容、购买时间,甚至他们在社交媒体上发布的内容来预测客户的行动。脸书提供了一门 15 分钟的免费课程,帮助广告商学习何时以及如何利用长相相似的观众,尽管他们的一些预测方法被发现与 shady Cambridge Analytica 使用的(他帮助唐纳德·川普赢得了 2016 年美国总统大选)非常相似。同样,谷歌正在把机器学习放到每一个广告客户的手中,推特也在使用机器学习首先为你展示最好的推文。

然而,关于这些公司如何制作相似的模型,明显缺乏透明度,这就是为什么人们通常不太理解。据、大同陈在雅虎开发了一个模仿系统!优于其他方法 50%以上,在线广告中使用的系统可分为三种类型:

简单的基于相似性的相似系统

通过比较种子用户(例如您的客户)与可用用户(例如不是你的客户的脸书用户)来判断哪一个用户更受欢迎,或者哪一个用户具有更多的定量属性,或者这两个用户是否相同。相似度是用距离度量计算的,距离度量是 python(编程语言,不是 snake)中用于度量相似度的机器学习算法。

基于回归的相似系统

一种基于逻辑回归寻找相似物的统计方法,逻辑回归是一种机器学习分类算法,用于预测事件发生的概率。在基于回归的系统中,算法的目标是预测种子用户(例如银行客户)将执行期望的结果(例如注册定期存款)基于以前的数据(例如他们的年龄、工作、婚姻状况等)。

基于分段近似的相似系统

一种分段方法,通过基于用户特征(如兴趣类别)创建分段来查找相似部分。例如,如果用户喜欢 NBA 比赛,则该用户被认为属于体育部分。基于分段近似的系统的一般思想是找到与种子用户“共享”尽可能多的顶部分段的可用用户。

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

Image: Dataaspirant.com

来自经验丰富的独立科学家的文章可能是最容易看到机器学习预测能力的方式。在他们的教程中,我们如何在一个小时内建立图书推荐系统第二部分-k 最近邻和矩阵分解,高级数据科学家 Susan Li 开发了一个系统,根据共同的图书评级在亚马逊上找到相似人群的聚类,并预测他们会对其他书籍感兴趣。

Susan Li 的系统结合了 K 近邻矩阵分解两种算法,前者假设相似的事物彼此靠近,后者是一种协作过滤技术,其原理是对某种项目有相同兴趣的人也会对其他某种项目有相同兴趣。实验结果表明,李的图书推荐系统比亚马逊的更准确,因为它的所有建议都是恐怖小说。在下图中,你可能会注意到亚马逊推荐了 6 本斯蒂夫·金的恐怖小说和一本道格拉斯·亚当斯的科幻喜剧小说,这种组合对恐怖小说迷来说可能有点奇怪。

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

Image: Susan Li

至于长相相似的受众在广告定位中的未来,也不清楚。或许这些关于从社交网络系统通信中确定用户个性特征的全球专利和来自脸书的特征以及来自谷歌的分级行为特征提供了一些线索,让我们知道他们将会走上哪一个方向。

秘密数据科学家——他们是谁?

原文:https://towardsdatascience.com/closet-data-scientists-who-are-they-b22219f8c759?source=collection_archive---------8-----------------------

“今天我们将活在当下,除非不愉快,在这种情况下我会吃一块饼干”——饼干怪兽

如果你认为你已经准备好职业转换到人工智能,请阅读这篇文章

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

你白天有工作。你把业余时间花在大规模开放在线课程(MOOCs)和在 Jupyter 笔记本上运行机器学习(ML)模型上。你梦想在数据科学领域工作。你在谷歌上搜索“数据科学家的技能集”,疯狂地试图核对清单上的每一项。

是的,我在和你说话,秘密数据科学家。

在压缩技术浪潮的时代学习技能

人工智能(AI)领域发展如此之快,以至于数据科学技能集的增长速度超过了特朗普对全球经济的威胁。

Google 的精选片段来自搜索“数据科学家技能集”产生统计R/PythonETL数据角力与探索ML 算法高级机器学习(深度学习)大数据处理框架数据可视化。KDnuggests 发表了“成为数据科学家所需的 9 项必备技能”,提出前述技能是必修的,也是成为数据科学家的先决条件。

究竟怎样才能成为一名成熟的数据科学家呢?

回答:你没有。我确信公司有数据科学团队是有原因的。

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

Source: [1] Accenture (AI: The Momentum Mindset) — Compressing Technology Waves

随着技术浪潮的压缩,公司对新技术做出反应的时间越来越少。“坐以待毙”的心态不再是“安全”的方法,因为公司有可能成为人工智能的落后者。俗话说“一旦落后,就再也回不去了”。

同样,对于我们这些试图进入人工智能领域的秘密数据科学家来说,我们需要理解并接受这一点:

人工智能的发展速度超过了我们的速度。

每天都有研究进展和新技术出现。一个新的最先进的(SOTA)语言模型可能会出现,加入木偶家族(包括像 ELMoBERTBig BIRD ),或者一个新的 SOTA 图像分类器可能会被创建,它可以更准确地对图像进行分类,或者用更少的标记图像获得类似的结果。

从业者自己也明白 AI 可以有多广阔。他们不指望你知道一切。他们在寻找随着技术进步能够掌握必要技能的人。

最好的数据科学家是那些不断用人工智能的最新进展更新自己,并学习完成工作所需的技能的人。

也就是说,有些事情你必须做对…

围绕我上一篇关于我的人工智能之旅的文章,一个反复出现的回应是关于“我需要知道什么”才能被认为“足够好”来从事数据科学工作。对于那些试图转行的人来说,这个问题可能会让人感到更加畏缩(尤其是对于那些没有技术背景的人)。

我是这样看的。

做一个基本的婊子

钉牢你的基础。这是最简单的,但是大多数人都做不好。

你不需要知道从简单的线性回归到 GPT-2 的一切。然而,你确实需要理解使那些传统的 ML 模型工作的数学概念(例如,随机森林的或朴素贝叶斯分类器的最大似然估计)。此外,了解传统模型(如主成分分析)与神经网络模型(如剔除批量归一化)的不同正则化方法。

了解基础知识不仅仅是能够背诵准确度、精确度或召回率的公式,而是知道哪种度量在哪种情况下更合适。这不是关于理解什么是过度拟合,而是理解为什么会发生并且能够假设哪种正则化方法会工作得最好。这不是在数据集上应用不同的模型并获得最高的准确性,而是评估和解释为什么某些模型比其他模型更好。你知道要点了。

展示你的兴趣

人工智能领域的职业生涯绝非易事。如果你正从一个完全不同的领域过渡到几乎没有重叠技能的领域,请准备好证明你为什么能够胜任数据科学家的角色。你的简历应该证明这一点可以让你获得面试机会,但是要准备好详细阐述这些项目。大多数面试都是从技术测试开始的(通常是基于编码的),所以在像 LeetcodeHackerrank 这样的网站上温习你的编码技能。

如果你不知道,完成 MOOCs 并在样本数据集上应用模型是 而不是 相当于展示兴趣。最低限度,从前到后完成一个学校或个人项目。这包括获取数据(例如网络搜集)、数据聚合和清理、特征工程、模型构建、模型评估以及理想情况下在平台上部署(例如网络或移动设备)。

在解释这些项目时,清楚地表达出来是很重要的。从项目背后的动机开始,然后是一个高层次的解释,生产模型所涉及的工具和步骤。之后,找出你在项目中最大的收获和最大的挑战,以及你是如何解决它们的。准备好面试官可能会问你的任何问题。面试官通常希望更详细地了解项目的某些部分,尤其是当他们闻到血腥味时(通常是当你掩饰项目的重要方面时)。

在你感兴趣的领域保持最新

总是知道你感兴趣的特定领域的最新发现和研究。

如果你申请的是一个专门从事自然语言处理的职位,这意味着你要了解向量空间模型和单词嵌入等基础知识。与 SOTA 语言模型保持同步也很重要,比如伯特GPT-2 能够区分和解释这些模型的差异也是一个巨大的优势,因为它展示了你阅读研究论文的能力。在人工智能领域,这是一项有价值的基本技能。

如果你申请的是专门研究计算机视觉的角色,一定要了解各种知名深度学习架构的演变。其中包括像 AlexNetVGGGoogleNetResNetDenseNet 这样的网站。物体检测和语义分割也是好知道的(即过食YOLOSSDFPNR-CNN快 R-CNN快 R-CNN屏蔽 R-CNN )。当然,像迁移学习这样的概念也是深度学习的基础。

读,读,读

人工智能阅读和编码一样多。

作为从业者,了解您感兴趣的领域中的最新技术是非常重要的。不要阅读和筛选每天发表的数百篇研究论文,而是在社交媒体上关注相关的人工智能思想领袖或研究人员。Twitter 通常是一个很好的来源(这基本上是我拥有 Twitter 账户的唯一原因)。

收拾好你的行李,是时候搬出衣橱了

当你认为自己还没准备好的时候,你已经准备好了

从个人经验来看,在你没有准备好的时候进行面试有助于你了解你处于信心-专业知识曲线的哪一部分(或者更正式地称为邓宁-克鲁格效应)。

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

Dunning-Kruger Effect (Source: The Business Times [5])

这是一种认知偏差,当人们没有足够的相关知识来准确判断自己的能力时,他们往往会出现这种偏差。换句话说,就是当 愚蠢的人认为自己 聪明的时候。

是真的。我以为我已经准备好成为一名数据科学家了。但是一种叫做现实的东西给了我一记耳光,让我意识到我是多么无知。

话虽如此,但你不一定要成为穿白色衣服的人(从图中)才能开始申请人工智能相关的工作。你只需要而不是成为穿蓝色制服的人。对自己的技能有自知之明,知道如何提升自己,总比痴心妄想好。

迈出信仰的一大步

最后,做好每次面试的准备。

每一次面试都是获得理想工作的机会。不要退而求其次。面试失败总比不尝试好。每一次面试都让你更近一步。

由于人工智能研究人员似乎有一种趋势,即以芝麻街布偶命名他们的语言模型,或许值得借鉴该剧试图灌输给儿童的一些教训。在最近的一集里,布偶艾比·卡达比的兄弟鲁迪弄乱了他正在画的一幅画,并对自己非常不满。他得到了胡珀商店老板艾伦的鼓励,并最终受到启发创作了一幅新画。Kate 的这篇文章[3]完美地总结了它(阅读它以获得灵感!)——“失败”是一种被遗忘的技能。你会意识到,为孩子准备的课程也会对成年人产生巨大的影响。

如果所有这些都失败了,记住奥斯卡说的话——“狗屎可能会更糟”。

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

万事如意!

大卫

阅读更多关于我从金融职业到人工智能的转变。

[## 两年前我不知道如何写代码。现在我是一名 AI 工程师。

我最原始的旅程

towardsdatascience.com](/i-had-no-idea-how-to-write-code-two-years-ago-now-im-an-ai-engineer-13c530ab8227)

支持我! —如果你喜欢我的内容并且没有订阅 Medium,请考虑支持我并通过我的推荐链接在这里(注:你的一部分会员费将作为推荐费分摊给我)。

参考

[1] AI:动量思维方式—https://www . Accenture . com/_ ACN media/pdf-73/Accenture-strategy-AI-Momentum-Mindset-exec-summary-POV . pdf
【2】Dunning-Kruger 效应—https://www . business times . com . SG/brunch/not-so-blindness-ignition-The-Dunning-Kruger-Effect-at-work
【3】《芝麻街》在强调一种被遗忘的技能:失败——

基于生成对抗网络的服装和颜色提取

原文:https://towardsdatascience.com/clothes-and-color-extraction-with-generative-adversarial-network-80ba117e17e6?source=collection_archive---------12-----------------------

在这篇文章中,我将讨论使用生成对抗网络(GAN)从图像中提取衣服和颜色。

让我们简要回顾一下本文中使用的关键概念。

一些关键概念:

**图像分割:**在计算机视觉中,图像分割是将数字图像分割成多个片段(像素组)的过程。分割的目标是将图像的表示简化成更有意义和更容易分析的东西。

细分过程中有两个粒度级别:

  • 语义分割 —对图像中的物体特征进行分类,并将像素集划分为与现实世界类别相对应的有意义的类别。
  • 实例分割 —识别图像中每个对象的每个实例,而不是像语义分割那样对每个像素进行分类。例如,它不是将九把椅子归类为一个实例,而是识别每把椅子(见下图)。

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

Semantic Segmentation vs Instance Segmentation (source)

神经网络是一种计算学习系统,它使用一个功能网络来理解一种形式的数据输入,并将其转换为所需的输出,通常是另一种形式。人工神经网络的概念是受人类生物学和人类大脑神经元共同运作以理解人类感官输入的方式的启发。

生成对抗网络(GAN) 是一种特定类型的神经网络(由Ian good fellow及其同事于 2014 年发明),由两个网络组成:生成器部分和鉴别器部分。在训练过程中,这些网络相互竞争,从而相互提高。训练过程从随机噪声开始,生成器从噪声中生成输出(因为输入是一些随机数据,所以初始输出也有噪声)。鉴别器将输出与来自数据集的数据进行比较,并意识到它与来自原始数据集的片段相差甚远,因此它向生成器返回否定结果。随着时间的推移,发生器根据从鉴频器收集的反馈产生更好的输出。最后,鉴别者发现很难理解生成器产生的输出是原始的还是伪造的。该训练过程的关键点是找到训练集的概率密度函数,并使用该函数生成数据集中不存在的新片段。

GAN 有许多有趣的应用:文本到图像,图像到图像的翻译,图像分辨率增强,检测假画,假面生成器(NVIDIA)等。

在这篇文章中,我将重点介绍图像到图像的翻译。

服装分割模型

对于训练过程我已经使用了服装公司解析(CCP)数据集 其中包含:

  • 2,098 张高分辨率街头时尚照片,共 59 个标签
  • 各种各样的风格、配饰、服装和姿势
  • 所有图像都带有图像级注释
  • 1000 多张图像带有像素级注释

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

Clothing Co parsing dataset

出于训练目的,仅使用 1000 个逐像素分割的图像。作为一个网络模型,我在 Keras 中使用了 GAN 的 pix2pix 实现,来自下面的 repo source 。我稍微修改了一下初始代码。模型的输入/输出大小为 256x256(输入图像分辨率)。为了更好的质量,我把这个尺寸改成了 512x768。

我为什么决定使用 GAN 网络?分割任务也可以由 CNN 来完成。但与 CNN 相比,GAN 模型可以从数据缺乏中学习,并产生更好的结果。在训练过程中,生成器从训练集中看到原始图像及其成对的逐像素分割版本。

首先,我尝试用原始的 CCP 数据集训练网络,这意味着 59 个类。实验失败了,因为不同类型的衣服在数据集中的分布是不同的,并且训练集包含每个类的少量实例。比如裤子/裤子的数量在 400 左右,而 t 恤的数量不到百件。因此,不平衡的小数据集导致推理模式下分割质量差。然后我尝试将一些类别合并在一起(裤子/长裤/牛仔裤,所有类型的鞋子,所有类型的包包等等。).这一步将类的数量减少到了 29 个,但是分割的质量仍然不尽如人意。

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

Segmentation results for 29 classes

最后,我成功地建立了“四类”模型:背景、皮肤、头发以及人身上的所有衣服和配饰。这种数据集是平衡的,因为训练集中的所有图像都包含所有四个类的实例(几乎所有图像都有头发)。该模型为 1k 图像训练了 3000 个历元。

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

Sample image from dataset for “four classes”

在用数百张图像进行推理模式测试时,我意识到该模型对背景很敏感:非模糊背景的输入图像,衣服和背景具有相似的颜色。这些都是失败的例子。对于人工神经网络模型,失败的情况是正常的,因为它不像人脑那样学习东西。因为网络从形状、颜色和许多对人类来说不明显的特征中学习,我们不能肯定地预测它在不同情况下会如何工作。

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

Left couple: background is not blurred, right couple: background is similarly colored to clothes

但是我们的模型对于背景模糊的图像非常有效:

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

Positive results

那么如何才能解决这个问题呢?我尝试手动将原始图像的背景替换为纯色,并意识到使用这种输入,模型会产生更好的结果。但是这项工作如何实现自动化呢?面罩-RCNN 来救援了!

Mask R-CNN 是对象检测算法 fast R-CNN 的扩展,增加了一个额外的 Mask 头。额外的蒙版头允许我们按像素分割每个对象,也可以在没有任何背景的情况下单独提取每个对象。

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

A sample mask R-CNN output trained on COCO-dataset (source)

我要用 mask-RCNN 模型生成的一个 Mask(针对一个人)。

我在 keras 中使用了以下 mask-rcnn 的实现: 来源

因此,在将输入图像输入到我们的模型之前,预处理工作已经完成。首先,使用 Mask-RCNN 模型及其产生的掩模从输入图像中分割出人。有了这个遮罩,我们可以用纯色替换所有不属于这个人的像素。在我们的例子中,它是灰色的。我尝试了 3 种颜色(黑色、白色、灰色)作为背景,只有灰色通过了测试(我不清楚为什么会这样,这太神奇了!希望很快找到答案)。

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

因此,不是将原始图像提供给模型,而是提供背景改变的版本作为输入。

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

From left to right: original image, segmentation result by our model, result after preprocessing with Mask-RCNN model. (case1 image source)

模型用例

到目前为止一切顺利。但是我们如何使用这些按像素分割的图像呢?

可以从图像中裁剪出衣服,除此之外还可以得到衣服的主色,以及皮肤和头发的颜色。从分割的图像中对不同类别的分割过程是通过颜色阈值处理来完成的,因此我们得到它们的掩模。为此,我使用了 HSV(色调、饱和度、值)颜色空间。我们使用这个空间而不是 RGB 的原因是因为 HSV 空间描述颜色的方式与人眼感知颜色的方式相似。在 RGB 颜色空间中,所有三个分量都与颜色光相关,但是在 HSV 空间中,色调变化相对小于外部闪电的变化。例如,两种红色可能具有相似的色调值,但 R、G 和 B 值完全不同。

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

Use-cases of model result (image source)

参考文献:

https://missing link . ai/guides/神经网络-概念/实例-分割-深度学习/

https://deepai . org/machine-learning-glossary-and-terms/neural-network

https://medium . com/@ fractal dle/mask-r-CNN-un mask-c 029 aa 2f 1296

云运行:通过 HTTP 请求的数据集摘要

原文:https://towardsdatascience.com/cloud-run-dataset-summaries-via-http-request-9b5fe24fe9c1?source=collection_archive---------38-----------------------

使用熊猫轮廓

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

Google Cloud Run 为运行无状态容器提供了一个托管平台。随着计算基础架构得到管理,它可以自动扩展以响应用户流量的增加。云运行服务通过 HTTP 请求或异步事件(如发布/订阅消息)接收 web 流量。这个项目使用 Cloud Run 来运行一个无状态容器,该容器使用 Pandas profiling 来显示结构化 CSV 数据集的汇总统计信息。CSV 文件通过 HTTP 请求传递给容器。首先,启动 Google Cloud Shell 实例,通过运行: git clone [https://github.com/dvdbisong/google-cloud-run.git](https://github.com/dvdbisong/google-cloud-run.git.) 来拉资源库。

目录

应用程序代码

文件app.py中的应用程序代码包含使用 Flask web 框架编写的 Python 代码,该框架通过路径/profile在端口 8080 上通过 HTTP 接收结构化的(格式良好的)CSV 文档,并返回包含数据集摘要分析的网页。数据集汇总统计数据是用pandas-profiling包生成的。代码在pandas-profile目录下,可以在谷歌代码编辑器(云壳的一个组件)上查看。

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

View the app.py file on Google Code Editor (Cloud Shell).

创建容器图像

docker 文件概述了创建容器映像的方法。对于这个项目,我们将基于官方 Python 映像构建 docker 文件。Dockerfile 指定了构建映像时要安装在容器上的相关包。**使用谷歌代码编辑器,**导航至pandas-profile查看 docker 文件。

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

View the Dockerfile on Google Code Editor (Cloud Shell).

为了完整起见,下表总结了 docker 文件中使用的命令。

+------------+-----------------------------------------------------+
| **Command**    | **Description** |
+------------+-----------------------------------------------------+
| **FROM**       | The base Docker image for the Dockerfile.           |
| **RUN**        | It execute commands on top of the current image as  |                              |              new layers.                                         |
| **COPY**       | Copies files from the local machine to the          |
|              container filesystem.                               |
| **CMD**        | Specifies the command to execute when running the   |   |              container. This command is overridden if another    |   |              command is specified at runtime.                    |
| **WORKDIR**    | Set working directory of the container.             |
| **ENV**        | Set Environment variable as a key-value pair that   | |              will be available in the container after building.  |
+------------+-----------------------------------------------------+

使用云构建构建映像,并上传到容器注册中心

Cloud Build 是一项 GCP 服务,用于自动化代码工件的部署,作为 CI/CD 管道的一部分。这里,Cloud Build 用于构建 Docker 映像,作为一系列构建步骤,完成的映像被推送到 Google 容器注册表。以下代码使用云构建构建映像,并将映像上传到容器注册。从目录pandas-profile运行这段代码。

gcloud builds submit --tag gcr.io/ekabasandbox/dataset-profile

其中,

  • ekabasandbox为 GCP 项目 ID,
  • dataset-profile为图像名称。
    确保根据需要修改这些参数。

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

Building Image with Cloud Build.

要查看 Google 容器注册表上的图像,请运行以下代码:

gcloud container images list

使用云运行部署容器

下一步将把映像部署到 Cloud Run 并运行容器。使用下面的代码部署到云运行。选择部署托管云运行计算的区域(最好是us-central1)。当提示输入服务名时,接受缺省值,并响应y以允许未经身份验证的调用。

gcloud beta run deploy --image gcr.io/ekabasandbox/dataset-profile --platform managed --memory 2Gi

当容器被部署时,我们得到消息:

Service [**dataset-profile**] has been deployed and is serving traffic at [**https://dataset-profile-4fa5lgaxpq-uc.a.run.app**](https://dataset-profile-4fa5lgaxpq-uc.a.run.app/)

打开服务 URL 以查看部署的容器。

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

Home Page of Deployed Application Container.

在 Google 云存储上公开数据集

我们将作为 HTTP 请求传递给 Cloud Run 上的应用程序的数据集存储在 Google 云存储中。对于此项目,通过编辑对象权限使数据集可公开访问。添加一个新的名称设置为allUsersUser实体。

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

Make Dataset on GCS publicly available.

检索数据集摘要

要使用pandas profiling检索数据集摘要,将公共数据集 URL 从 Google 云存储传递到路径/profile并获取变量data。放在一起我们就有了 URL [https://dataset-profile-4fa5lgaxpq-uc.a.run.app/profile?data=https://storage.googleapis.com/ekaba-test-data/crypto-markets-1.csv](https://dataset-profile-4fa5lgaxpq-uc.a.run.app/profile?data=https://storage.googleapis.com/ekaba-test-data/crypto-markets-1.csv)

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

Dataset Summary with Pandas Profile.

结论

本文提供了在 Cloud Run 上构建和部署无状态容器化应用程序的演练。在本例中,我们使用 Python pandas-profiling包实现了一个简单的应用程序,为结构化 CSV 数据集生成探索性数据分析输出。像这样的应用程序使得用最少的努力理解更多关于数据集的信息变得非常容易。最后,确保删除云运行服务,以及云容器注册表中不再需要的图像。

聚类分析:创建、可视化和解释客户群

原文:https://towardsdatascience.com/cluster-analysis-create-visualize-and-interpret-customer-segments-474e55d00ebb?source=collection_archive---------1-----------------------

客户细分

探索聚类分析的方法,通过降维使聚类可视化,通过探索有影响力的特征来解释聚类。

虽然我们已经看到大量有监督的机器学习技术在组织中使用,但这些方法通常都有一个大问题;对标记数据的需求。幸运的是,有许多无监督的方法可以将数据聚类到以前看不到的组中,从而从您的客户中提取新的见解。

本文将指导您了解客户聚类的细节。请注意,我不仅会向您展示您可以使用哪个 sklearn 软件包,更重要的是,如何使用它们以及需要注意什么。

和往常一样,数据相对简单,你可以跟着笔记本到这里。它包含来自电信公司的客户信息,通常用于预测客户流失:

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

聚类算法

有许多无监督聚类算法,尽管它们在某些情况下各有所长,但我将讨论两种常用的算法。

k 均值聚类

根据我的经验,这是目前最常用的数据聚类算法。k-Means 从选择你可以自己设定的随机中心开始。然后,所有数据点都根据它们的欧几里德距离被分配到最近的中心。接下来,计算新的中心并更新数据点(见下面的 gif)。这个过程一直持续到聚类在迭代之间没有变化。

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

An animation demonstrating the inner workings of k-means — Courtesy: Mubaris NK

在上面的例子中,三个聚类中心开始时彼此非常接近。这通常不是很好,因为它将很难找到集群。相反,您可以使用 k-means++ 来改进中心的初始化。它从一个初始中心开始,并确保所有后续中心都足够远。这优化了中心的选择和创建。

然后,您可以使用所谓的方法来确定最佳的 k 簇。当选择一系列聚类时,您希望找到收益递减点。您可以通过在 X 轴上绘制聚类数,在 Y 轴上绘制惯性(类内平方和标准)来实现这一点。然后选择 k 来找到折弯:

import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.cluster import KMeansscores = [KMeans(n_clusters=i+2).fit(df).inertia_ 
          for i in range(10)]
sns.lineplot(np.arange(2, 12), scores)
plt.xlabel('Number of clusters')
plt.ylabel("Inertia")
plt.title("Inertia of k-Means versus number of clusters")

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

你可以看到橙色广场的转弯处。因此,我们选择 k=4 个使用 k-均值生成的聚类。

需要注意的一点是,由于 k-Means 通常使用欧几里德距离来计算距离,由于维数灾难,它在高维数据集上工作得不好。这个诅咒在某种程度上说明了高维空间中的欧几里德距离没有什么意义,因为它们通常非常接近。

我们使用的数据有点高维,因为我们有 27 个特征。

一个解决方案是使用余弦距离,它在高维空间中工作得更好。因为余弦距离和欧几里德距离对于归一化向量是线性连接的,所以我们可以简单地归一化我们的数据。

from sklearn import preprocessingnormalized_vectors = preprocessing.normalize(df)
scores = [KMeans(n_clusters=i+2).fit(normalized_vectors).inertia_  
          for i in range(10)]
sns.lineplot(np.arange(2, 12), scores)
plt.xlabel('Number of clusters')
plt.ylabel("Inertia")
plt.title("Inertia of Cosine k-Means versus number of clusters")
plt.savefig("intertia_cosine_kmeans.jpg", dpi=300)

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

k-Means 在计算上非常昂贵。这种方法的更快速的替代方法是微型批次装置桦木。这两种方法都可以更快地生成聚类,但是这些聚类的质量通常低于 k-Means 生成的聚类。

基于密度的噪声应用空间聚类

聚类也可以基于数据点的密度来完成。一个例子是基于密度的带噪声应用的空间聚类(DBSCAN ),如果数据点足够密集,它就对数据点进行聚类。DBSCAN 通过扫描邻域来识别集群并扩展它们。如果它找不到任何可以添加的点,它就简单地移动到一个新的点,希望它能找到一个新的集群。任何缺少足够的邻居进行聚类的点都被归类为噪声:

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

An animation demonstrating the inner workings of DBSCAN — Courtesy: dashee87

k-means 的不同之处在于,DBSCAN 不要求您指定聚类数。DBSCAN 的两个主要参数是构成聚类的最小点数(minPts)和邻域的大小(eps)。

你通常不希望minPts很小,因为会产生噪声簇。根据经验,最好至少将minPts设置为数据中的要素数。eps有点难以优化,可能需要 k 距离图来找到正确的值。使用小值通常是首选。

DBSCAN 的替代方案是光学器件,其性能与 DBSCAN 相似,但不需要明确设置eps

评估集群

下一步是执行实际的聚类,并尝试解释聚类的质量及其内容。

剪影分数

要开始评估集群,您首先需要了解构成一个好的集群的要素。尽管存在许多定义和方法来评估聚类,但最常用的方法之一是计算所谓的轮廓得分。

轮廓分数基于聚类之间和聚类内的距离来度量聚类之间的可分性。它为每个样本计算平均类内距离(**a**)和平均最近类距离(**b**),前者是类内的平均距离,后者是样本和它不属于的最近类之间的距离。那么,一个样本的轮廓系数就是**(b - a) / max(a, b)**

让我们计算前面提到的所有方法的轮廓分数:

from sklearn.metrics import silhouette_score# Prepare models
kmeans = KMeans(n_clusters=4).fit(df)
normalized_vectors = preprocessing.normalize(df)
normalized_kmeans = KMeans(n_clusters=4).fit(normalized_vectors)
min_samples = df.shape[1]+1 
dbscan = DBSCAN(eps=3.5, min_samples=min_samples).fit(df)# Print results
print('kmeans: {}'.format(silhouette_score(df, kmeans.labels_, 
                                           metric='euclidean')))
print('Cosine kmeans:{}'.format(silhouette_score(normalized_vectors,
                                          normalized_kmeans.labels_,
                                          metric='cosine')))
print('DBSCAN: {}'.format(silhouette_score(df, dbscan.labels_, 
                                           metric='cosine')))

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

看到基于余弦的 k-Means 优于 k-Means 并不奇怪,因为我们在数据中有大量的特征(27)。有趣的是,DBSCAN 同样表现出色。

然而,尽管客观的测量是首选的,我相信当涉及到无监督聚类时,直观地检查聚类是评估它们的最好方法之一。千万不要盲从客观的衡量标准。确保你总是检查到底发生了什么!

因此,接下来是在 2d 和 3d 中可视化集群的方法。

可视化集群

为了可视化聚类,可以使用最流行的降维方法之一,即主成分分析和 t-SNE。

主成分分析

PCA 的工作原理是使用正交变换将相关要素转换为一组线性不相关要素的值。剩下的是包含最大可能方差的特征。要深入了解 PCA,请参见这篇文章。

然后我们可以在 3d 中可视化我们的数据:

pca_df = prepare_pca(2, df, normalized_kmeans.labels_)
sns.scatterplot(x=pca_df.x, y=pca_df.y, hue=pca_df.labels, 
                palette="Set2")

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

尽管 PCA 可能已经成功地降低了数据的维数,但它似乎不能非常直观地可视化聚类。高维数据经常出现这种情况,它们通常聚集在同一点周围,PCA 提取该信息。

相反,我们可以使用一种称为 t-SNE 的算法,这种算法专门用于创建数据的直观表示/可视化。

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

t-SNE 是一种用于可视化高维数据的算法。它使用点之间的局部关系来创建低维映射,这导致捕获非线性结构。

它从创建概率分布(即高斯分布)开始,该概率分布规定了相邻点之间的关系。然后,它使用学生 t 分布构建一个尽可能接近该分布的低维空间。现在你可能想知道为什么它在这一步使用了学生 t 分布。嗯,高斯分布有一个短尾巴,把附近的点挤压在一起。如果使用学生 t 分布,则尾部更长,点更容易分离。

让我们在 3d 中实现 t-SNE,看看我们是否能更好地可视化集群:

tsne_3d_df = prepare_tsne(3, df, kmeans.labels_)
tsne_3d_df['normalized_kmeans'] = normalized_kmeans.labels_
tsne_3d_df['dbscan'] = dbscan.labels_plot_animation(tsne_3d_df, 'kmeans', 'kmeans')
plot_animation(tsne_3d_df, 'normalized_kmeans', 'normalized_kmeans')
plot_animation(tsne_3d_df, 'dbscan', 'dbscan')

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

Euclidean k-Means (LEFT), Cosine k-Means (MIDDLE), DBSCAN, (RIGHT)

t-SNE 为数据提供了更加直观的可视化表示。从动画中可以看出,余弦 k 均值和 DBSCAN 似乎都创建了逻辑聚类。

解释集群

现在,我们已经对客户进行了细分,如果我们知道每个集群的独特之处就好了。这将帮助我们了解我们拥有哪些类型的客户。

一种方法是简单地绘制所有变量,并查看聚类之间的差异。然而,这种方法在处理 10 个以上的变量时会失败,因为它很难可视化和解释:

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

解决方案是选择一个变量子集,在一定程度上,这些变量在定义集群时很重要。我想在这里演示两种方法,即平均组之间的方差和通过预测建模提取特征重要性。

变量内和聚类间的方差

在群集任务中变量重要性的一个假设是,如果按群集排序的变量的平均值彼此之间显著不同,则该变量在创建群集时可能是重要的。

我们首先根据生成的聚类汇总数据,并检索每个变量的平均值:

from sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler()
df_scaled = pd.DataFrame(scaler.fit_transform(df))
df_scaled['dbscan'] = dbscan.labels_df_mean = (df_scaled.loc[df_scaled.dbscan!=-1, :]
                    .groupby('dbscan').mean())

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

Groupby of clusters generated by DBSCAN averaged per variable

我忽略了-1 簇,因为它被 DBSCAN 定义为噪声。为了便于可视化,数据在 0 和 1 之间缩放。

接下来,我简单地计算每个变量内聚类之间的均值方差,并选择方差最大的前 7 个变量:

results = pd.DataFrame(columns=['Variable', 'Var'])
for column in df_mean.columns[1:]:
    results.loc[len(results), :] = [column, np.var(df_mean[column])]
selected_columns = list(results.sort_values(
        'Var', ascending=False,
    ).head(7).Variable.values) + ['dbscan']tidy = df_scaled[selected_columns].melt(id_vars='dbscan')
sns.barplot(x='dbscan', y='value', hue='variable', data=tidy)

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

您现在可以更清楚地看到集群之间的差异。例如,在群集 0 中,您可以看到每个人都没有互联网服务,而大多数其他群集包含有互联网服务的人。此外,我们可以看到,集群 2 仅包含同时拥有光纤和电话服务的人,这意味着这些服务要么是一起购买的,要么是同一套餐。

注意:我没有考虑标准偏差、偏斜度和峰度,这些在比较变量时很重要。上面的方法只是选择变量的第一步。

随机森林特征选择

最后,我们可以使用聚类作为目标变量,然后应用随机森林来了解哪些特征在聚类的生成中是重要的。这种方法需要更多的工作,因为您必须检查模型的准确性,以准确提取重要的特征。

在本例中,我将跳过这一步,因为我们正在处理不平衡的目标和多个类:

from sklearn.ensemble import RandomForestClassifier
X, y = df.iloc[:,:-1], df.iloc[:,-1]
clf = RandomForestClassifier(n_estimators=100).fit(X, y)data = np.array([clf.feature_importances_, X.columns]).T
columns = list(pd.DataFrame(data, columns=['Importance', 'Feature'])
           .sort_values("Importance", ascending=False)
           .head(7).Feature.values)tidy = df_scaled[columns+['dbscan']].melt(id_vars='dbscan')
sns.barplot(x='dbscan', y='value', hue='variable', data=tidy)

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

我们可以看到,与我们之前进行的方差分析相比,选择了相似的特征。由于这种方法需要更多的验证工作,我建议使用前面描述的方差法。

感谢您的阅读!

希望本文能帮助您理解聚类算法背后的原理,最重要的是如何应用它们。

如果你像我一样,对人工智能、数据科学或心理学充满热情,请随时在 LinkedIn 上添加我,或者在 Twitter 上关注我。

有代码的笔记本可以在这里找到。

聚类分析:无监督算法的理论和实现

原文:https://towardsdatascience.com/cluster-analysis-theory-and-implementation-of-unsupervised-algorithms-87823c4c5e03?source=collection_archive---------21-----------------------

包括 k-means、分层和 DBSCAN 的优缺点

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

Photo by Arnaud Mariat on Unsplash

简单地说,聚类就是根据某些属性分离观察值。用更专业的术语来说,聚类是一种无监督的机器学习算法,是一种将观察值(数据)以相似的观察值彼此更接近的方式分组的过程。这是一种“非监督”算法,因为与监督算法(如随机森林)不同,你不必用标记的数据来训练它,而是将你的数据与一些指令(如你想要的聚类数)一起放入“聚类机器”,机器将找出其余的,并根据底层模式和属性对数据进行聚类。

李·RCT(1981):

聚类分析是一种新发展起来的面向计算机的数据分析技术。它是许多研究领域的产物:统计学、计算机科学、运筹学和模式识别。

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

What does it mean for data to be clustered?

本文的目的是强调一些行业应用,并讨论最常用的聚类算法的优缺点。在第二部分中,我将演示 K-means 聚类的一个实现,作为 Python 环境中的一个例子。最后,我将为数据科学家留下一些额外的技术笔记。

行业应用

为什么聚类在统计学和机器学习领域如此受欢迎?这是因为在广泛的商业应用案例中,聚类分析是一种强大的数据挖掘工具。这里只是众多应用中的几个:

  • 探索性数据分析(EDA) :聚类是最基本的数据分析技术的一部分,用于理解和解释数据,并开发对数据特征和模式的初步直觉。
  • 统计分析:常用于识别同一变量在不同样本中的(不)相似性(如 A 城市vsB 城市儿童的数学成绩)。
  • 城市规划:集群有助于识别具有相似特征的家庭和社区,以实施适当的社区发展政策。
  • **异常检测:**保险行业使用聚类来识别异常和潜在的欺诈交易。
  • **客户细分:**聚类广泛用于开发营销策略,例如,针对不同类别的客户进行不同种类的促销。
  • 计算机视觉:在计算机视觉/图像分割中,聚类用于根据模式识别过程将数据划分为不相交的组。
  • 在生物学中:聚类是遗传学和分类学分类以及理解现存和灭绝生物进化的基本工具。
  • 和许多其他的:聚类有广泛的其他应用,如建筑推荐系统、社会媒体网络分析、土地利用分类中的空间分析等。

许多不同的聚类算法

聚类算法家族有几种变体:K-means、hierarchical、DBSCAN、spectral、gaussian、birch、mean shift 和 affinity propagation 就是其中的一些。下面,我将重点介绍前三种算法的一些要点,它们是最常用的算法。

K-表示:首先,“ K 表示你想要的集群数。也就是说, K = n 表示要识别的聚类的数量 n 。还有一种叫做“质心”的东西,它是一个假想的/人为的数据点(数据点的平均值),每个数据聚类都围绕着它进行分区。因此 K = 2 意味着该算法将把观测值(数据)分成两个群,使得质心和观测值之间的距离最小化。

优点:简单易懂,易于实现

缺点:有时难以选择K*;离群值可以在它们的方向上拖动质心;缩放数据可以改变群集*

**层次聚类:**层次聚类以两种不同的方式工作:第一种称为“自下而上”或聚集聚类,其中每个观察值得到自己的聚类,然后每对聚类合并在一起形成另一个聚类,以此类推。另一个(又名)。“自上而下”或分裂聚类)的工作方向相反,,所有的观测值都是从一个集群开始,然后重复划分成更小的集群大小。

优点:易于实现;通过查看树状图,很容易确定聚类的数量;比 K-均值聚类更具信息量

缺点:对异常值高度敏感;对于大型数据集可能非常耗时

DBSCAN: 于 1996 年提出,它是一种基于密度的算法,在给定最小点数的情况下,根据观测值彼此的接近程度对它们进行聚类。它需要两个参数:(I)ε(ε)—确定点应该在一个聚类中的半径;以及(ii) minPts —指定形成密集空间/聚类的最小点数。有趣的是,1996 年提出该算法的论文获得了 2014 年 KDD 大会的“时间检验奖”。

优点*:与 K-means 和层次聚类不同,DBSCAN 在异常值存在的情况下是健壮的;因此可以用于异常(即异常值)检测。*

缺点:i t 对参数值比较敏感( ε min pts);无法在变化的数据密度中正确识别任何群集。

5 步实施

实现聚类算法的整个过程非常简单,因为与其他受监督的机器学习算法相比,在过程和参数调整中需要较少的人工决策。在这一节中,我将使用sklearn库演示 Python 环境中的 K-means 集群实现。

第一步。安装依赖关系

基本上你需要三个库:pandas处理数据,seaborn可视化,sklearn输入预处理和建模。

# to import and work with data
import pandas as pd 
# to visualize data and results
import seaborn as sns
import matplotlib.pyplot as plt 
# to pre-process model inputs
from sklearn import preprocessing 
# clustering algorithm
from sklearn.cluster import KMeans

第二步。数据

我在这个演示中使用的数据是著名的 iris 数据集。我之所以选择这个数据集,是因为在散点图中可以很容易/直观地将聚类分开。

在许多情况下,导入数据后,您可能需要做一些处理,如编码分类变量等。还需要确保没有NaN价值观。

# import data
df = pd.read_csv("iris.csv")
df.head()

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

# select data
df = df[["petal_length", "petal_width"]]# see if there's NA values
df.isna().sum()

第三步。准备模型输入

选择数据集后,接下来以模型可以使用的方式预处理/格式化输入。在这个阶段会发生两件事:所选特征的标准化(减少数据的可变性)和将数据框转换成numpy数组。

# data normalization
df = preprocessing.scale(df)
df = pd.DataFrame(df)# input
import numpy as np
X = df.iloc[:, [0,1]].values

第四步。确定集群数量

在 K-means 算法中,你需要定义你想要的聚类数。所谓的“肘法可以通过最小化误差平方和来帮助确定。

##########################
# The "elbow" method #
##########################k_range = range(1,10)
sse = []
for k in k_range:
    km = KMeans(n_clusters = k)
    km.fit(X)
    sse.append(km.inertia_)plt.xlabel("K")
plt.ylabel("Sum of squared errors")
plt.plot(k_rng, sse, marker='o')

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

第五步。模型实现

一旦您在上一步中确定了唯一需要的参数,您就可以拟合模型,在二维图中可视化聚类数,并进一步分析以回答您正在寻找的研究问题。

# model
km = KMeans(n_clusters = 3)
y_km=km.fit_predict(X)# plot the 3 clusters
plt.scatter(
    X[y_km == 0, 0], X[y_km == 0, 1],
    s=50, c='lightgreen',
    marker='s', edgecolor='black',
    label='cluster 1'
)plt.scatter(
    X[y_km == 1, 0], X[y_km == 1, 1],
    s=50, c='orange',
    marker='o', edgecolor='black',
    label='cluster 2'
)plt.scatter(
    X[y_km == 2, 0], X[y_km == 2, 1],
    s=50, c='lightblue',
    marker='v', edgecolor='black',
    label='cluster 3'
)

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

# value counts in different clusters
frame = pd.DataFrame(X)
frame['cluster'] = y_km
frame['cluster'].value_counts()

数据科学家的技术笔记

  1. 就像其他机器学习算法一样,如果有分类特征,就需要用数字特征编码。
  2. 需要重申的是,聚类算法对尺度敏感,因为该算法使用欧几里德距离。因此,请确保输入数据经过适当的预处理。
  3. 请注意,与监督分类实现不同,在监督分类实现中,模型首先被拟合,然后用于预测,在聚类中,模型拟合和预测一起发生(因此使用了fit_predict())
  4. 如果您对 K-means 实现中的哪些有效哪些无效感兴趣,请查看这个 StackOverflow 页面
  5. 如果你对rstat感兴趣,你可以看看这个 UC 商业分析页面,里面有代码和一些有用的讨论。

群集地球仪

原文:https://towardsdatascience.com/clustered-globe-e5c54b42de16?source=collection_archive---------22-----------------------

Ep。3:将我们的活动分组到度假目的地

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

Our output today; clustered holiday destinations all over the globe; Read below for the clustering details

之前我们已经测量了并且分类了我们的活动,现在我们有了一个粗略的想法,从我们的个人兴趣出发,什么是最好的活动。但是一个单一的活动值得我们稀缺的假期时间依赖它吗?在两周假期的其他日子里,我们应该告诉家人做什么?事实上,一项活动可能还不足以决定我们的下一个度假目的地。为了真正确定目的地,我们必须确定彼此在合理旅行时间内的活动组。换句话说:是时候对我们的地理数据进行聚类分析了!

聚类分析聚类是对一组对象进行分组的任务,使得同一组中的对象(称为聚类)彼此之间比其他组(聚类)中的对象更加相似(在某种意义上) —维基百科

我们的方法

  1. 探索不同的聚类算法及其与我们的问题相关的优缺点
  2. 设置聚类过程中使用的约束和变量(即距离、最小/最大活动等)。)
  3. 将聚类算法应用于我们的数据,以每个活动和一个聚类之间的一对一关系进行存储
  4. 将我们的集群可视化在地图上,与我们的评分标准相结合,能够对集群进行相互比较

数据

我们今天进行聚类所需的数据是地理数据,即每个活动的经度和纬度。由于我们已经在第 1 集中使用谷歌地图的地理编码 API 导出了这些数据,因此不再需要提取更多数据来完成我们的任务。

聚类算法

对数据应用任何聚类分析的最大缺陷是选择了错误的聚类算法。有许多具有不同属性的不同算法用于计算形成聚类的数据点组。每个问题都不一样,每个算法都会得出不同的结果。因此,无论何时开始聚类分析,重要的是从评估最常见的聚类算法的优缺点开始。不要对每个问题都应用你最熟悉的算法,因为它不一定能给你最优的解决方案。

在本文中,我不会深入讨论每种聚类算法,只分析哪种算法最适合我们的问题。为了更好地阅读这个主题,以及我们今天将要探索的算法,我向推荐乔治·赛义夫的这篇文章。

我个人喜欢图表比较,所以作为第一步,在图 1 中,你会发现我们的问题的关键属性的非常简化的比较,对于以下算法: K-MeansMean-ShiftDBSCAN期望最大化凝聚层次聚类。请注意:

  • 仅比较解决我们问题的直接要求的特征(不比较许多其他聚类算法属性)。
  • 如果您认为我们忽略了一个非常适合我们问题的基本聚类算法,请告诉我。

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

Fig. 1 Comparing our requirements against clustering algorithms

让我们逐一分解并解释我们的需求:

  • **聚类数:**一些聚类算法要求事先知道聚类数,然后将所有数据点分配给给定的聚类数。然而,在我们分析的这一点上,我们没有从我们的活动中得到的集群数量的有价值的估计。因此,我们正在寻找一种算法,从数据中推导出聚类数。匹配算法:均值漂移、DBSCAN、凝聚分层
  • **噪声处理:**并非所有的数据点都被认为是聚类的一部分。对于一些算法,最好在应用聚类之前从数据集中去除噪声,而其他算法有一种在过程中定义噪声的方法。在我们的例子中,我们不想删除噪音,而是希望标记它。我们可以在一个偏僻的地方举办一个很棒的独立活动,它不会是任何度假目的地的一部分,但仍然希望它被标记为离群目的地。为此,我们需要一个处理噪声的算法。匹配算法:Mean-Shift,DBSCAN
  • 时间复杂度 : 在此阶段不太重要,因为我们只会以非常低的频率执行聚类,并且我们的数据集估计不会以非常快的速度增长。然而,如果我们的活动数据集确实增长了,并且一个 O(n)算法变得难以管理,我们仍然希望防止在以后的阶段不得不重构一切。在我们的例子中,我们的目标是尽可能获得最好的时间复杂度。从 O(n)算法(或更差的算法)我们认为聚类不适合我们的问题。匹配算法:K 均值、期望最大化、DBSCAN
  • **阈值:**一些聚类算法的性质提供了参数,利用这些参数来操纵聚类过程并为聚类边缘设置一些边界。这在我们的案例中非常重要,因为我们希望设置一些阈值,以确定在假日期间可管理的集群规模。例如,查看第 1 章中坐标上的散点图,很容易看出大多数聚类算法会将整个欧洲聚类在单个聚类中。很难在一个假期内完成。因此,我们需要能够设置一些指导原则,例如我们考虑形成单个集群的阈值。匹配算法:均值漂移、DBSCAN、期望最大化

在这五个选项中,只有 DBSCAN 聚类算法符合我们问题的所有条件(尽管在时间复杂度上仍然只能获得中等分数),最重要的是,它所需的参数非常适合我们想要的聚类。因此,我们将继续使用 DBSCAN,如果我们无法获得所需的聚类结果,我们可以继续探索亚军算法:均值漂移。

设置约束&变量

首先,我们要设置我们要聚类的细节的边界。在这个阶段,我希望将各个国家分开,只将活动集中在一个国家内。因此,根据集群的性质,小国可能会成为一个单一的集群。尽管在*“真实世界”*中可能存在跨境度假目的地,但我们仍然能够在该过程的后续步骤中通过组合相邻集群来形成这些目的地。

此外,具体到 DBSCAN,我们必须定义两个**变量。**由于 DBSCAN 是一种基于密度的聚类算法,它需要一个 epsilon 和一个聚类的最小群体,以准确定义它应该寻找的密度。

**ε😗*在我们的例子中,我们可以使用这个ε变量来定义我们愿意在一个完整的假期内在活动之间旅行的距离范围。但是,由于距离将从坐标中提取,因此所需的实际输入值将是线性距离,而不是行驶距离。

让我们在这一点上非常务实,并说我们不想浪费一整天的时间开车去参加下一个假期活动,我们愿意覆盖的最大值大约是半天。假设它转换成 500 公里的最大量;考虑到是 1.4 基准,这将产生 357 km 的线性距离,我们将输入该距离作为初始ε变量。

最小活动人口: 我们希望在单个集群中的最小活动数量与假期的实际持续时间直接相关(这将是稍后阶段的必需参数)。但是我们可以在执行算法的时候过滤活动的数量。因此,对于聚类过程,我们应该选择最少数量的活动来填充假期的最短持续时间。

我们要考虑的最短可能持续时间是一个周末假期。三天以及同等的最低活动量。自动意味着,如果在 epsilon 距离内只有两个或更少的活动,这些活动将被视为异常值,而不是任何度假目的地的一部分。

应用聚类算法

最后,是时候开始有趣的事情了,将 DBSCAN 聚类应用到我们的数据集。我们将使用 python 和 scikit learn 集群包进行实际实现。

作为聚类的一个例子,我们将选择美国。一个主要活动分散在各地的大国:

Interactive Chart #1 All major activities in the USA in our data-set

现在让我们应用 DBSCAN 聚类算法,将 500 km 的旅行距离作为 epsilon 要求,将三个活动作为一个聚类中所需的最小人口。

集群名称以国家 ISO 代码开头,然后是该国家内的集群编号,最后是集群中的活动编号。请注意’ -1 '指的是离群值。

Interactive Chart #2 All major activities clustered into holiday destinations

这看起来更像是我们可以去的实际目的地。在这种情况下,聚类产生了 7 个目的地聚类:

  • 中东有 27 项重大活动(从芝加哥到新奥尔良(!))
  • 东北部有 26 项重大活动(从波斯顿到 DC)
  • 佛罗里达有 22 项主要活动
  • 西南部有 17 项主要活动(从洛杉矶到布鲁斯峡谷 NP)
  • 夏威夷群岛有 5 大活动
  • 旧金山有 4 大活动
  • 科罗拉多有 3 大活动

另外 7 项活动没有进入任何类别,被视为异常值。一些精彩刺激的公路旅行!集群的大小在此时并不重要,因为这将在稍后阶段进行微调,届时假期将会开始起作用。

对变量如何影响聚类感到好奇?请参见下面的矩阵,其中有三个不同的行程距离作为ε变量(250、 500 和 700)和三个最低人口要求(1、 3 、5):

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

Minimum Population Requirement: 1 ; Travel Distance for Epsilon: 250, 500, 750 km respectively ; No outliers

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

Minimum Population Requirement: 3; Travel Distance for Epsilon: 250, 500, 750 km respectively ; Outliers in green, green and orange respectively

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

Minimum Population Requirement: 5; Travel Distance for Epsilon: 250, 500, 750 km respectively ; Outliers in green, green and orange respectively

总的来说,趋势很明显:移动距离越短,意味着聚类越多越小,离群值也越多。而更大的移动距离意味着更大的集群和更少的集群。此外,更少的最小总体意味着更少的异常值和更多的(小)聚类,而更高的最小总体自动导致更多的异常值和更少的聚类。

对于探索美国的度假目的地,我们对变量的选择(中间的一个)似乎是一个非常合理的结果;很好地平衡了聚类数、聚类大小和离群值的数量。

但是世界其他地方呢?让我们在下面的交互式图表中探索一下。一定要放大图片探索集群,在这些 248 不同的度假目的地中找到一颗宝石!

Interactive chart #3 All clustered activities globally created with plotly

按照我们的逻辑,许多较小的国家(因此基本上西欧和南欧的所有国家)将是每个国家一个集群(除了岛屿目的地),但是较大的国家已经被很好地分成多个目的地。总的来说,这正是我们现阶段的目标;让我们能够开始分析目的地,而不是单一的活动。

添加分数并可视化

既然我们已经有了度假目的地,我们可以添加回我们在第 1 章中基于活动评论创建的评分标准。让我们从十大度假目的地及其主要城市(活动数量)开始:

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

Chart #1 Top 10 cluster with their main city based on weighted scoring measure

好吧,看来我们一定要把科罗拉多放在我们遗愿清单的首位!有趣的是,在伊瓜苏瀑布附近的巴西和阿根廷,这两个国家都排在前 5 名。最后,复活节岛也是得分很高的度假目的地。可能不是第一个想到的地方?

最后,我们希望看到全球每个度假目的地的加权平均得分,就像我们在第 1 章中列出所有活动一样。请注意,聚类的大小指的是包含的活动数量和评分标准的颜色填充的暗度(越暗越好):

Interactive chart #4 All our global clusters with their average score

今后,我们将把这些度假目的地作为我们的分析对象,不再详细讨论作为目的地的单一活动和/或国家。

感谢您阅读今天的文章,下次我们将解决 TSP 问题,并为每个目的地创建优化的道路旅行!

关于我自己的更多信息请随时查看我的 LinkedIn

使用 BigQuery k-means 聚类 4000 个堆栈溢出标签

原文:https://towardsdatascience.com/clustering-4-000-stack-overflow-tags-with-bigquery-k-means-ef88f902574a?source=collection_archive---------16-----------------------

如何将 4,000 多个活动堆栈溢出标签分组到有意义的组中?对于无监督学习和 k-means 聚类来说,这是一个完美的任务——现在您可以在 BigQuery 中完成所有这些任务。让我们找出方法。

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

Visualizing an universe of tags

费利佩·霍法 是谷歌云的开发者倡导者。在这篇文章中,他与谷歌的无服务器数据仓库big query合作,对 Stack Overflow 发布的数据集运行 k-means 聚类,该数据集每季度刷新一次并上传到谷歌的云。你可以在这里 这里 查看更多关于使用堆栈溢出数据和 BigQuery 的信息。

4000+标签很多

这些是自 2018 年以来最活跃的堆栈溢出标签——它们很多。在这张图片中,我只有 240 个标签——你如何对其中的 4000 多个进行分组和分类?

# Tags with >180 questions since 2018 
SELECT tag, COUNT(*) questions 
FROM `fh-bigquery.stackoverflow_archive.201906_posts_questions`
  , UNNEST(SPLIT(tags, '|')) tag 
WHERE creation_date > '2018-01-01' 
GROUP BY 1 
HAVING questions>180 ORDER BY 2 DESC

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

提示:共现标签

让我们找到通常搭配在一起的标签:

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

这些分组是有意义的:

  • “javascript”与“html”相关。
  • “蟒蛇”和“熊猫”有关系。
  • c# '与’相关。网络。
  • “typescript”与“angular”相关。
  • 等等…

因此,我将获取这些关系,并将其保存在一个辅助表中,外加每个标签发生关系的频率百分比。

CREATE OR REPLACE TABLE `deleting.stack_overflow_tag_co_ocurrence`
AS
WITH data AS (
  SELECT * 
  FROM `fh-bigquery.stackoverflow_archive.201906_posts_questions`
  WHERE creation_date > '2018-01-01'
), active_tags AS (
  SELECT tag, COUNT(*) c
  FROM data, UNNEST(SPLIT(tags, '|')) tag
  GROUP BY 1
  HAVING c>180
)
SELECT *, questions/questions_tag1 percent
FROM (
    SELECT *, MAX(questions) OVER(PARTITION BY tag1) questions_tag1
    FROM (
        SELECT tag1, tag2, COUNT(*) questions
        FROM data, UNNEST(SPLIT(tags, '|')) tag1, UNNEST(SPLIT(tags, '|')) tag2
        WHERE tag1 IN (SELECT tag FROM active_tags)
        AND tag2 IN (SELECT tag FROM active_tags)
        GROUP BY 1,2
        HAVING questions>30
    )
)

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

现在准备好一些 SQL 魔术。BigQuery ML 在热编码字符串方面做得很好,但是它不能像我希望的那样处理数组(请继续关注)。因此,我将首先创建一个字符串,该字符串将定义我想要查找共现的所有列。然后我可以用这个字符串得到一个巨大的表,当一个标签和主标签同时出现至少一定的百分比时,这个表的值为 1。让我们先看看这些结果的一个子集:

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

你在这里看到的是一个共现矩阵:

  • “javascript”显示了与“php”、“html”、“css”、“node.js”和“jquery”的关系。
  • “android”显示了与“java”的关系。
  • “机器学习”显示了与“python”的关系,但不是相反。
  • “多线程”显示了与“python”、“java”、“c#”和“android”的关系
  • 除了“php”、“html”、“css”和“jquery”,这里的“单元测试”几乎与每一个专栏都有关系。

您可以使用百分比阈值来降低或增加这些关系的敏感度:

SELECT tag1 
,IFNULL(ANY_VALUE(IF(tag2='javascript',1,null)),0) Xjavascript
,IFNULL(ANY_VALUE(IF(tag2='python',1,null)),0 ) Xpython
,IFNULL(ANY_VALUE(IF(tag2='java',1,null)),0) Xjava
,IFNULL(ANY_VALUE(IF(tag2='c#',1,null)),0) XcH
,IFNULL(ANY_VALUE(IF(tag2='android',1,null)),0) Xandroid
,IFNULL(ANY_VALUE(IF(tag2='php',1,null)),0) Xphp
,IFNULL(ANY_VALUE(IF(tag2='html',1,null)),0) Xhtml
,IFNULL(ANY_VALUE(IF(tag2='css',1,null)),0) Xcss
,IFNULL(ANY_VALUE(IF(tag2='node.js',1,null)),0) XnodeDjs
,IFNULL(ANY_VALUE(IF(tag2='jquery',1,null)),0) Xjquery
,SUM(questions) questions_tag1
FROM `deleting.stack_overflow_tag_co_ocurrence`
WHERE percent>0.03
GROUP BY tag1
ORDER BY questions_tag1 DESC 
LIMIT 100

k-均值聚类时间

现在—不使用这个小表,让我们用 BigQuery 用整个表来计算 k-means。通过这一行,我创建了一个一次性的编码字符串,以后我可以用它来定义 4,000+列,我将把它们用于 k-means:

one_hot_big = client.query("""
SELECT STRING_AGG(
  FORMAT("IFNULL(ANY_VALUE(IF(tag2='%s',1,null)),0)X%s", tag2, REPLACE(REPLACE(REPLACE(REPLACE(tag2,'-','_'),'.','D'),'#','H'),'+','P')) 
) one_hot
FROM (
  SELECT tag2, SUM(questions) questions 
  FROM `deleting.stack_overflow_tag_co_ocurrence`
  GROUP BY tag2
  # ORDER BY questions DESC
  # LIMIT 10
)
""").to_dataframe().iloc[0]['one_hot']

在 BigQuery 中训练 k-means 模型非常简单:

CREATE MODEL `deleting.kmeans_tagsubtag_50_big_a_01`
OPTIONS ( 
    model_type='kmeans',
    distance_type='COSINE',
    num_clusters=50 )
AS
WITH tag_and_subtags AS (
    SELECT tag1, %s
    FROM `deleting.stack_overflow_tag_co_ocurrence`
    WHERE percent>0.03
    GROUP BY tag1
)
SELECT * EXCEPT(tag1)
FROM tag_and_subtags

现在我们等待 BigQuery 向我们展示我们的训练进度:

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

当它完成时,我们甚至得到了对我们模型的评估:

戴维斯-波尔丁指数 : 1.8530
均方差 : 0.8174

绩效说明

我们真的需要 4000 个独热编码维度来获得更好的聚类吗?结果证明 500 个就够了——我更喜欢这个结果。它还将在 BigQuery 中训练模型的时间从 24 分钟减少到 3 分钟。只有 30 个维度的情况下,同样的时间会减少到 90 秒,但我更喜欢 500 个维度的结果。下面有更多关于超参数调整的信息。

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

戴维斯-波尔丁指数 : 1.6910
均方差 : 0.52332

为结果做好准备:50 个集群是…

现在是时候看看我们的成果了。我甚至会找出一些我感兴趣的标签:在每个集群中,googleamazonazure是如何表示的?这些是 k-means 聚类发现的 50 个组——给定我们在本文前面做的相关标签的 1-hot 编码。一些结果很有意义——而另一些则让我们深入了解了任何堆栈溢出标签的主流技术。命名每个质心总是一个挑战。在这里,我使用了前 5 个质心权重向量-见下文。

**centroid 45: amazon-web-services, aws-lambda, amazon-s3, amazon-ec2, python**
-----
amazon-web-services, amazon-s3, aws-lambda, amazon-ec2, amazon-dynamodb, terraform, aws-sdk, amazon-cloudformation, amazon-redshift, aws-api-gateway, amazon-cognito, boto3, cloud, alexa, amazon-rds, amazon-elastic-beanstalk, amazon-ecs, alexa-skills-kit, amazon-cloudfront, serverless, aws-cli, amazon-iam, amazon-cloudwatch, elastic-beanstalk, amazon-sqs, serverless-framework, amazon-athena, aws-amplify, aws-appsync, amazon-sns, alexa-skill, amazon-route53, amazon, amazon-kinesis, amazon-sagemaker, autoscaling, amazon-elb, amazon-ses, aws-cognito, aws-iot, terraform-provider-aws, api-gateway, amazon-vpc, aws-serverless, aws-codepipeline, aws-codebuild, amazon-rds-aurora, bitnami, amazon-lex, aws-step-functions, aws-code-deploy, aws-iam, aws-fargate, dynamodb-queries, boto

amazon: amazon-cognito, amazon-ses, amazon-redshift, aws-lambda, amazon-ecs, amazon-s3, amazon-web-services, amazon-athena, aws-api-gateway, amazon-rds, amazon, amazon-cloudfront, amazon-lex, aws-iot, amazon-elb, aws-code-deploy, amazon-cloudwatch, aws-cli

**centroid 17: android, java, android-layout, android-recyclerview, kotlin** -----
android, json, xml, kotlin, android-studio, android-recyclerview, android-layout, android-fragments, xslt, serialization, android-intent, retrofit2, android-activity, android-room, nullpointerexception, retrofit, gson, android-volley, textview, android-viewpager, xml-parsing, recycler-adapter, android-edittext, android-sqlite, protocol-buffers, xsd, deserialization, android-constraintlayout, android-asynctask, fragment, android-architecture-components, android-livedata, imageview, scrollview, android-databinding, android-glide, android-animation, xquery, xslt-1.0, android-jetpack, android-manifest, navigation-drawer, adapter, bottomnavigationview, xslt-2.0, android-toolbar, onclicklistener, android-tablayout, android-cardview, android-spinner, android-adapter, picasso, android-linearlayout, transformation, android-drawable, android-architecture-navigation, android-imageview, android-custom-view, json-deserialization, android-view, android-actionbar, searchview, biztalk, android-coordinatorlayout, android-lifecycle, android-softkeyboard, floating-action-button, recyclerview-layout, swipe, android-relativelayout, android-xml, android-collapsingtoolbarlayout, android-button, android-scrollview, saxon, android-nestedscrollview, android-styles, xml-namespaces, xsl-fo, android-fragmentactivity, android-dialogfragment, android-viewholder, xml-serialization

**centroid 7: android, java, javascript, ios, python** -----
android-gradle, bluetooth, rx-java2, build.gradle, dependencies, rx-java, google-play, sdk, android-ndk, corda, video-streaming, android-emulator, libgdx, android-webview, apk, location, java-native-interface, google-play-services, dagger-2, adb, codenameone, android-8.0-oreo, google-places-api, android-notifications, android-studio-3.0, broadcastreceiver, speech-recognition, arcore, sharedpreferences, streaming, gps, android-service, version, coordinates, androidx, native, sms, here-api, android-camera, android-permissions, uri, android-mediaplayer, locale, vert.x, exoplayer, google-maps-markers, settings, alarmmanager, spinner, proguard, okhttp3, text-to-speech, okhttp, updates, android-camera2, android-source, whatsapp, nfc, share, inputstream, google-fabric, xmpp, calculator, manifest, wifi, mpandroidchart, android-9.0-pie, rx-android, call, android-workmanager, mp4, hls, video-processing, release, barcode, android-support-library, alertdialog, android-viewmodel, dji-sdk, barcode-scanner, filepath, sip, google-cloud-messaging, gradle-plugin, android-arrayadapter, screen, payment, toolbar, google-play-console, dagger, mp3, indexoutofboundsexception, ejabberd, httpurlconnection, libraries, android-proguard, coroutine, h.264, simpledateformat, jacoco, background-process, rtsp, offline, root, sensor, splash-screen, android-bluetooth, android-testing, android-resources, android-tv, emulation, android-bitmap, android-listview, multipart, chromecast, android-broadcastreceiver, video-capture, google-maps-android-api-2, pojo, android-canvas, visibility, broadcast, google-play-games, dao, kotlin-android-extensions, avd, lint, android-jobscheduler, android-library, kotlinx.coroutines, firebase-mlkit, expandablelistview, obfuscation, android-contentprovider, appcelerator, mvp, live-streaming, in-app-billing, android-context, audio-streaming, arabic, android-alertdialog, kotlin-coroutines, zxing, android-videoview, fingerprint, braintree, audio-recording, deprecated, job-scheduling, android-wifi, wear-os, bottom-sheet, android-things, device, marker, right-to-left, google-login, mobile-application, media-player, countdowntimer, opengl-es-2.0, nullable, face-detection, exoplayer2.x, android-8.1-oreo, beacon, drawable, gradlew, mapbox-android, classnotfoundexception, parcelable, android-keystore, voice-recognition, toast, aar, google-places, android-theme, android-progressbar, paging, accelerometer, playback, gradle-kotlin-dsl, samsung-mobile, photo, ibeacon, android-appcompat, noclassdeffounderror, branch.io, rtmp, sceneform, foreground-service, google-cast, appcelerator-titanium, android-widget, logcat, android-pendingintent, android-fileprovider, android-gps, sha1, jodatime, android-sensors, android-appbarlayout, surfaceview, mpeg-dash, android-mvvm

google: google-maps-android-api-2, google-play-services, google-fabric, google-places, google-places-api, google-play-console, google-cast, google-login, google-maps-markers, google-play-games, google-play, google-cloud-messaging

**centroid 28: angular, typescript, javascript, angular6, angular5** -----
angular, typescript, angular6, angular5, rxjs, angular-material, angular7, service, observable, routing, angular-cli, components, angular-reactive-forms, karma-jasmine, primeng, ag-grid, angularfire2, angular-material2, ngrx, reactive-programming, httpclient, angular-ui-router, angular-routing, lazy-loading, rxjs6, ngfor, angular-forms, angular-httpclient, angular2-routing, angular-components, angular-router, rx-swift, ng-bootstrap, angular2-forms, angular-universal, angular2-template, angular-services, angular-directive, material, angular4-forms, ngx-bootstrap, typescript2.0, angular2-services, ngrx-store, subscription, rxjs5, angular2-directives, ngrx-effects, angular-material-6, angular-cli-v6, angular-http-interceptors, redux-observable, subscribe, angular-pipe, angular-promise, angular2-observables, reactivex, angular-ngmodel, angular-cdk, tsconfig

**centroid 20: apache-spark, java, scala, hadoop, python** -----
apache-spark, scala, pyspark, apache-kafka, hadoop, apache-spark-sql, hive, cassandra, apache-flink, jupyter, hdfs, bigdata, playframework, spark-streaming, sbt, apache-nifi, hiveql, apache-kafka-streams, akka, hbase, pyspark-sql, mapreduce, kafka-consumer-api, rdd, spark-dataframe, amazon-emr, yarn, user-defined-functions, parquet, cassandra-3.0, cluster-computing, avro, databricks, apache-kafka-connect, aws-glue, spark-structured-streaming, flink-streaming, kerberos, apache-zookeeper, sqoop, confluent, presto, kafka-producer-api, impala, akka-stream, hadoop2, apache-spark-mllib, traits, apache-zeppelin, cloudera, datastax, apache-storm, distributed-computing, akka-http, data-modeling, apache-spark-dataset, guice, google-cloud-dataproc, gatling, jmx, hortonworks-data-platform, apache-pig, apache-spark-ml, oozie, azure-databricks, scalatest, cql, playframework-2.6, datastax-enterprise, phoenix, confluent-schema-registry, mesos, implicit, implicit-conversion, ksql, scala-collections, spark-submit, hdinsight, ambari

google: google-cloud-dataproc
amazon: amazon-emr, aws-glue
azure: azure-databricks

**centroid 12: bash, python, linux, shell, java** -----
macos, ubuntu, ansible, ssh, raspberry-pi, terminal, vim, raspberry-pi3, subprocess, environment-variables, centos, console, command-line-interface, pipe, arguments, jq, homebrew, iot, applescript, printf, escaping, sftp, windows-subsystem-for-linux, raspbian, exec, redhat, stdout, zsh, alias, wget, eval, paramiko, filenames, glob, command-line-arguments, stdin, remote-access, sudo, file-permissions, slurm, putty, gpio, tar, tmux, rsync, expect, ksh, jsch, scp, ssh-tunnel, cat, portforwarding, openssh

**centroid 8: c#, .net, asp.net-core, .net-core, java** -----
logging, exception, error-handling, azure-functions, reflection, configuration, azure-cosmosdb, f#, logstash, exception-handling, azure-web-sites, elastic-stack, azure-service-fabric, console-application, try-catch, wix, azure-application-insights, nunit, core, autofac, xunit, dapper, nest, nhibernate, dotnet-httpclient, nlog, httpwebrequest, serilog, log4net, inversion-of-control, identity, unity-container, webclient, blazor, .net-standard-2.0, system.reactive, clr, type-inference, asp.net-core-signalr, asp.net-core-identity, app-config, masstransit, fluentd, google-cloud-stackdriver, winston, .net-framework-version, ninject, .net-core-2.0, claims-based-identity, syslog, kestrel-http-server

google: google-cloud-stackdriver
azure: azure-cosmosdb, azure-web-sites, azure-functions, azure-application-insights, azure-service-fabric

**centroid 18: c#, asp.net, asp.net-mvc, asp.net-core, entity-framework** -----
c#, asp.net, .net, asp.net-mvc, asp.net-core, .net-core, entity-framework, linq, asp.net-web-api, model-view-controller, iis, entity-framework-core, dependency-injection, razor, asp.net-core-2.0, asp.net-core-mvc, wcf, entity-framework-6, json.net, kendo-ui, asp.net-core-webapi, webforms, asp.net-mvc-5, identityserver4, asp.net-identity, asp.net-web-api2, asp.net-core-2.1, asp.net-mvc-4, signalr, odata, kendo-grid, automapper, c#-4.0, web-config, razor-pages, windows-services, moq, ado.net, aspnetboilerplate, ef-code-first, ef-core-2.0, asp.net-core-2.2, linq-to-sql, asp-classic, umbraco, ef-core-2.1, asp.net-ajax, ef-migrations, iis-8, connection-string, windows-authentication, linq-to-entities, repository-pattern, swashbuckle, npgsql, iis-7, dbcontext, hangfire, iis-10, iis-express, model-binding, ef-core-2.2, windows-server-2012, signalr-hub, iis-7.5, linq-to-xml

**centroid 10: c#, azure, python, java, javascript** -----
azure, botframework, azure-sql-database, bots, azure-storage, chatbot, timeout, azure-storage-blobs, report, ssrs-2012, azure-data-factory, telegram-bot, azure-web-app-service, expression, azure-logic-apps, ibm-watson, refactoring, domain-driven-design, azureservicebus, gzip, azure-resource-manager, azure-iot-hub, twilio-api, azure-data-factory-2, azure-data-lake, vpn, azure-virtual-machine, microsoft-teams, luis, string-formatting, game-physics, google-assistant-sdk, ssrs-2008, game-development, ads, mesh, windows-7, virtual-reality, vuforia, microsoft-cognitive, azure-webjobs, azure-keyvault, azure-api-management, credentials, directx, facebook-messenger, collision-detection, arm-template, sprite, rdlc, game-engine, azure-search, azure-eventhub, physics, azure-blob-storage, desktop-application, factory, software-design, hololens, u-sql, installer, collision, azure-cli, reporting, google-home, azure-table-storage, azure-cognitive-services, unityscript, startup, azure-bot-service, mysql-connector, ienumerable, qnamaker, instantiation, builder, ssrs-tablix, azure-cosmosdb-sqlapi, azure-stream-analytics, quaternions, reportviewer, skype, azure-machine-learning-studio, azure-servicebus-queues, skype-for-business, ssrs-2008-r2, azure-virtual-network, win-universal-app, azure-log-analytics, unity5, csom, dialogflow-fulfillment

google: google-assistant-sdk, google-home
azure: azure-webjobs, azure-log-analytics, azure-virtual-machine, azure-sql-database, azure-api-management, azure-iot-hub, azure-web-app-service, azure-data-factory-2, azure-table-storage, azure-servicebus-queues, azure-bot-service, azure-virtual-network, azure-data-factory, azure-cognitive-services, azure-blob-storage, azure-storage-blobs, azure-logic-apps, azure-resource-manager

**centroid 44: c#, javascript, java, oauth-2.0, php** -----
api, authentication, security, facebook, oauth-2.0, spring-security, cookies, jwt, azure-active-directory, cors, postman, microsoft-graph, login, oauth, microservices, active-directory, ldap, jhipster, authorization, passport.js, keycloak, token, azure-ad-b2c, single-sign-on, passwords, sharepoint-online, telegram, spring-security-oauth2, single-page-application, linkedin, google-signin, openid-connect, session-cookies, owin, csrf, auth0, google-oauth2, saml, access-token, linkedin-api, laravel-passport, saml-2.0, google-authentication, xss, azure-powershell, adal, basic-authentication, azure-ad-graph-api, session-variables, msal, oidc, openid, express-session, bearer-token, logout, refresh-token

google: google-authentication, google-signin, google-oauth2
azure: azure-ad-graph-api, azure-active-directory, azure-powershell, azure-ad-b2c

**centroid 19: c#, visual-studio, visual-studio-2017, .net, xamarin.forms** -----
visual-studio, xamarin, xamarin.forms, visual-studio-2017, xaml, uwp, azure-devops, xamarin.android, build, reporting-services, tfs, ssis, xamarin.ios, nuget, visual-studio-2015, msbuild, crystal-reports, windows-installer, nuget-package, mono, cross-platform, azure-pipelines-release-pipeline, .net-standard, mvvmcross, visual-studio-2019, visual-studio-2010, c++-cli, visual-studio-2013, sql-server-data-tools, roslyn, resharper, publish, mstest, .net-assembly, visual-studio-2012, azure-devops-rest-api, tfs2017, azure-pipelines-build-task, visual-studio-mac, tfs2018, tfsbuild, visual-studio-extensions, visual-studio-debugging, visual-studio-app-center, csproj, tfs2015, vsix, azure-mobile-services, picker, tfvc, xamarin.uwp

azure: azure-devops, azure-devops-rest-api, azure-pipelines-release-pipeline, azure-mobile-services, azure-pipelines-build-task

**centroid 36: c#, wpf, winforms, javascript, vb.net** -----
wpf, vb.net, winforms, user-interface, listview, charts, events, mvvm, datatable, checkbox, data-binding, datagridview, timer, sapui5, gridview, combobox, binding, drag-and-drop, menu, datagrid, knockout.js, popup, window, textbox, styles, treeview, listbox, telerik, uwp-xaml, devexpress, resources, vb6, user-controls, prism, viewmodel, controls, datetimepicker, webbrowser-control, cefsharp, panel, contextmenu, windows-10-universal, wpfdatagrid, windows-forms-designer, custom-controls, wpf-controls, richtextbox, clickonce, observablecollection, picturebox, mvvm-light, gdi+, menuitem, backgroundworker

**centroid 2: c++, c, python, linux, java** -----
c++, c, c++11, templates, assembly, cmake, gcc, memory, opengl, arduino, makefile, visual-c++, boost, c++17, lua, compiler-errors, x86, linux-kernel, memory-management, compilation, memory-leaks, operating-system, io, c++14, fortran, arm, serial-port, cuda, char, language-lawyer, segmentation-fault, clang, linker, stack, gdb, garbage-collection, macros, stl, g++, kernel, embedded, byte, malloc, shared-libraries, out-of-memory, nodes, processing, usb, x86-64, stm32, double, cython, buffer, pthreads, mips, signals, operator-overloading, runtime, gtk, llvm, driver, include, opengl-es, cygwin, operators, bit-manipulation, structure, overloading, nasm, precision, gnu-make, ros, gstreamer, mingw, const, variadic-templates, eigen, heap, gtk3, embedded-linux, esp8266, linux-device-driver, compiler-construction, warnings, cpu, cross-compiling, clion, qt-creator, profiling, ctypes, std, codeblocks, intel, return-value, system, newline, sdl-2, microcontroller, system-calls, pass-by-reference, valgrind, boost-asio, reverse-engineering, dynamic-memory-allocation, move, linker-errors, googletest, c-preprocessor, heap-memory, static-libraries, function-pointers, sdl, template-meta-programming, benchmarking, arduino-uno, libcurl, interrupt, vtk, x86-16, compiler-optimization, constants, stdvector, 64-bit, binaryfiles, bit, swig, quicksort, shared-memory, eclipse-cdt, constexpr, primes, bitwise-operators, x11, shared-ptr, clang++, glfw, binary-search, header-files, singly-linked-list, arduino-esp8266, ld, i2c, main, multiple-inheritance, gnu, smart-pointers, ram, simd, declaration, esp32, preprocessor, elf, undefined-behavior, bison, qtquick2, sfinae, variadic-functions, mingw-w64, unique-ptr, avr, masm, free, typedef, doubly-linked-list, generic-programming, compiler-warnings, glibc, kernel-module, move-semantics, auto, bootloader, c-strings, inline-assembly, ncurses, mmap, stdmap, glm-math, qmake, bit-shift, endianness, cpu-registers, template-specialization, pid, operator-precedence, memory-address

google: googletest

**centroid 24: css, html, javascript, bootstrap-4, angular** -----
html, css, jquery, html5, css3, bootstrap-4, twitter-bootstrap, flexbox, sass, datatables, highcharts, html-table, twitter-bootstrap-3, layout, frontend, datepicker, drop-down-menu, css-grid, bootstrap-modal, momentjs, responsive-design, modal-dialog, dropdown, grid, responsive, tabs, font-awesome, navbar, carousel, media-queries, themes, tooltip, alignment, overflow, less, css-position, react-bootstrap, border, accordion, dt, css-transforms, angular-ui-bootstrap, nav, z-index, grid-layout, utc, reactstrap, vertical-alignment, pseudo-element, linear-gradients, mixins, collapse, popover, angular-datatables, angular-flex-layout, centering

**centroid 31: delphi, c++, c#, winapi, windows** -----
delphi, winapi, dll, mfc, com, firemonkey, firebird, c++builder, delphi-10.2-tokyo, pinvoke, pascal, indy

**centroid 25: django, python, django-models, django-rest-framework, python-3.x** -----
django, django-models, django-rest-framework, django-views, django-forms, django-templates, django-admin, django-queryset, django-orm, django-urls, django-2.0, django-serializer, django-allauth, django-filter, django-class-based-views, django-migrations, serializer

**centroid 34: docker, kubernetes, python, google-cloud-platform, java** -----
docker, go, kubernetes, elasticsearch, google-cloud-platform, docker-compose, google-app-engine, dockerfile, deployment, rabbitmq, google-cloud-storage, yaml, airflow, google-kubernetes-engine, containers, kibana, google-compute-engine, google-cloud-dataflow, drupal, virtual-machine, apache-beam, openshift, prometheus, ibm-cloud, grpc, docker-swarm, kubernetes-helm, grafana, gcloud, traefik, google-cloud-datastore, kubectl, load-balancing, google-cloud-sql, kubernetes-ingress, monitoring, google-cloud-pubsub, istio, minikube, nginx-reverse-proxy, speech-to-text, alpine, docker-machine, filebeat, google-translate, google-speech-api, iptables, stackdriver, docker-volume, docker-container, azure-aks, nginx-ingress, daemon, google-cloud-vision, google-vision, azure-kubernetes, google-cloud-composer, openshift-origin, kubeadm, dataflow, amazon-eks, service-accounts, rancher, docker-registry, docker-image, nfs, google-cloud-speech, kops, jupyterhub, rbac, google-cloud-endpoints, standard-sql, google-cloud-build, docker-networking

google: google-cloud-build, google-cloud-datastore, google-speech-api, google-cloud-dataflow, google-cloud-storage, google-cloud-platform, google-kubernetes-engine, google-cloud-sql, google-cloud-speech, google-compute-engine, google-cloud-composer, google-cloud-endpoints, google-cloud-vision, google-vision, google-cloud-pubsub, google-translate, google-app-engine
amazon: amazon-eks
azure: azure-aks, azure-kubernetes

**centroid 21: excel, vba, excel-vba, c#, python** -----
excel, vba, excel-vba, google-sheets, ms-access, excel-formula, powerbi, outlook, sharepoint, ms-word, access-vba, office365, apache-poi, sap, dax, formatting, pivot-table, office-js, runtime-error, match, powerpoint, outlook-vba, formula, access, row, vsto, ssas, multiple-columns, powerquery, spreadsheet, vlookup, average, extract, userform, unique, ms-office, excel-2010, word-vba, ms-access-2010, excel-2016, rows, ms-access-2016, onedrive, openxml, powerbi-desktop, copy-paste, transpose, conditional-formatting, office-addins, office-interop, epplus, xlsxwriter, interop, phpspreadsheet, paste, shapes, offset, powerpivot, win32com, powerbi-embedded, export-to-excel, python-docx, countif, array-formulas, autofill, powerpoint-vba, activex, ms-access-2013, solver, m, business-intelligence, xls, ado, ssas-tabular, adodb, xlrd, delete-row, sumifs, openxml-sdk, excel-interop, add-in, excel-2013, worksheet, excel-addins

google: google-sheets

**centroid 4: git, github, jenkins, python, docker** -----
git, jenkins, github, jenkins-pipeline, gitlab, continuous-integration, sonarqube, bitbucket, jenkins-plugins, gitlab-ci, devops, azure-pipelines, svn, version-control, phpstorm, webhooks, repository, travis-ci, jekyll, artifactory, atom-editor, jira, pipeline, github-pages, teamcity, slack, push, gitlab-ci-runner, git-bash, github-api, continuous-deployment, branch, nexus, circleci, workflow, git-merge, diff, jenkins-groovy, clone, git-submodules, gitignore, atlassian-sourcetree, pull-request, bitbucket-pipelines, patch, commit, git-branch, versioning, mercurial, gnupg, git-commit, gerrit, rebase, open-source, githooks, allure, ssh-keys, git-push

azure: azure-pipelines

**centroid 33: java, hibernate, spring, spring-boot, jpa** -----
hibernate, jpa, spring-data-jpa, spring-data, solr, orm, transactions, spring-batch, wildfly, mapping, many-to-many, lucene, h2, entity, liquibase, jpql, ejb, hql, multi-tenant, persistence, spring-data-rest, hibernate-mapping, eclipselink, querydsl, one-to-many, spring-transactions, hikaricp, criteria, hibernate-criteria, gorm, ehcache, jpa-2.0, criteria-api, entitymanager, transactional

**centroid 39: java, python, c#, node.js, android** -----
http, ssl, sockets, curl, server, networking, websocket, encryption, https, socket.io, proxy, openssl, tcp, ssl-certificate, cryptography, http-headers, certificate, localhost, udp, mqtt, connection, client, ip, reverse-proxy, network-programming, aes, rsa, port, tls1.2, chat, client-server, lets-encrypt, cloudflare, haproxy, real-time, virtualhost, wireshark, keystore, ipc, x509certificate, zeromq, bouncycastle, django-channels, tcpclient, http-proxy, serversocket, telnet, cryptojs, public-key-encryption, private-key, tcp-ip, x509, client-certificates, certbot, tor, multicast

**centroid 30: java, rest, spring, spring-boot, javascript** -----
java, spring-boot, spring, rest, maven, eclipse, spring-mvc, tomcat, jsp, jdbc, web-services, soap, servlets, swagger, jackson, java-ee, thymeleaf, netbeans, web-applications, apache-camel, architecture, salesforce, spring-webflux, jersey, httprequest, jax-rs, wsdl, http-post, multipartform-data, tomcat8, soapui, response, resttemplate, cxf, httpresponse, rest-assured, api-design, struts2, soap-client, jstl, restsharp, spring-rest, spring-test, spring-restcontroller, jax-ws, put, endpoint, http-status-codes, struts, spring-web

**centroid 22: java, spring-boot, spring, maven, eclipse** -----
gradle, intellij-idea, neo4j, jsf, jar, grails, jboss, spring-cloud, spring-integration, jaxb, internationalization, log4j, eclipse-plugin, swagger-ui, jms, websphere, ant, activemq, vaadin, spring-kafka, pom.xml, log4j2, project-reactor, weblogic, java-11, netty, jetty, maven-3, javamail, crud, java-9, spring-cloud-stream, couchbase, ibm-mq, weblogic12c, datasource, glassfish, hazelcast, logback, osgi, hybris, openapi, project, maven-plugin, netflix-eureka, mybatis, cloudfoundry, reactive, eclipse-rcp, swagger-2.0, slf4j, netflix-zuul, quartz-scheduler, jetbrains-ide, spring-boot-actuator, lombok, spring-jdbc, sonarqube-scan, war, cdi, javabeans, tomcat7, interceptor, swt, java-10, freemarker, spring-boot-test, aop, jdbctemplate, dependency-management, spring-cloud-config, aspectj, spring-aop, flyway, amqp, classpath, spring-jms, jackson-databind, spring-cloud-dataflow, spring-websocket, spring-amqp, pivotal-cloud-foundry, spring-cloud-netflix, cucumber-jvm, executable-jar, spring-integration-dsl, swagger-codegen, tomcat9, spring-data-redis, javadoc, jndi, consul, intellij-plugin, dto, maven-surefire-plugin, hystrix, stomp, bean-validation, gateway, mapstruct, birt, spring-tool-suite, properties-file, jackson2, camunda, springfox, spring-data-neo4j, spring-rabbitmq, spring-session, pydev, xtext, servlet-filters, payara, code-formatting, spring-cloud-gateway

**centroid 15: javascript, angular, android, typescript, visual-studio-code** -----
ionic-framework, npm, visual-studio-code, ionic3, google-maps, cordova, debugging, electron, nativescript, ionic4, ionic2, meteor, autocomplete, geolocation, cordova-plugins, markdown, vscode-settings, phonegap, ide, webstorm, vscode-extensions, decorator, editor, ionic-native, onesignal, keyboard-shortcuts, angular2-nativescript, xdebug, hybrid-mobile-app, intellisense, nativescript-angular, tslint, remote-debugging, html-framework-7, breakpoints, syntax-highlighting, vscode-debugger, pylint, ibm-mobilefirst, jsdoc, nativescript-vue, prettier, windbg, phonegap-plugins, code-snippets, inappbrowser, phonegap-build

google: google-maps

**centroid 42: javascript, html, c#, android, python** -----
unity3d, image, tkinter, svg, animation, canvas, three.js, chart.js, scroll, 3d, html5-canvas, camera, geometry, css-animations, bitmap, rotation, aframe, icons, glsl, shader, fabricjs, rendering, webgl, css-transitions, transform, png, scrollbar, transition, textures, blender, html2canvas, drawing, mask, linechart, draw, jquery-animate, angular-animations, konvajs, raycasting, webvr

**centroid 43: javascript, html, jquery, css, reactjs** -----
d3.js, leaflet, google-maps-api-3, magento, magento2, ethereum, jquery-ui, cakephp, jinja2, primefaces, extjs, ember.js, fullcalendar, maps, ckeditor, mapbox, solidity, materialize, jquery-select2, dialog, angularjs-directive, recaptcha, openlayers, coldfusion, polymer, gis, react-apollo, styled-components, tinymce, progress-bar, geojson, javascript-events, position, apollo-client, undefined, addeventlistener, sharepoint-2013, semantic-ui, amcharts, web-deployment, joomla, settimeout, render, p5.js, openstreetmap, element, instagram-api, parent-child, liquid, mapbox-gl-js, focus, angularjs-ng-repeat, setinterval, react-admin, alert, polygon, dom-events, web-component, textarea, react-select, href, web3, contact-form-7, zoom, facebook-javascript-sdk, refresh, graphql-js, overlay, height, slick, content-security-policy, jqgrid, html5-audio, delay, anchor, blogger, html-select, child-process, jquery-plugins, width, html-lists, kendo-asp.net-mvc, loading, zurb-foundation, id, bind, whitespace, dropzone.js, onchange, semantic-ui-react, owl-carousel, media, video.js, hide, netlify, background-color, sticky, geocoding, native-base, webpage, inline, tampermonkey, slick.js, form-data, padding, ternary-operator, event-listener, facebook-messenger-bot, underscore.js, formik, jquery-validate, quill, dc.js, highlight, react-table, electron-builder, bulma, jquery-selectors, fullscreen, multi-select, innerhtml, slideshow, parallax, draggable, footer, styling, react-component, jquery-mobile, selector, swiper, infinite-scroll, contenteditable, sidebar, jquery-ui-datepicker, mobx-react, form-submit, shadow-dom, backbone.js, each, margin, html-form, mathjax, jquery-ui-autocomplete, viewport, c3.js, adsense, sweetalert2, web-development-server, keypress, jquery-ui-sortable, facebook-php-sdk, sweetalert, center, font-awesome-5, react-proptypes, placeholder, summernote, font-face, react-context, web-frontend, ref, css-float, parent, wysiwyg, getelementbyid, font-size, higher-order-functions, lifecycle, dropzone, partial-views, asyncstorage, wai-aria, spfx, custom-element, jstree, bootstrap-datepicker, line-breaks, react-dom, fancybox, css-tables, stylesheet, react-google-maps, react-leaflet, timepicker, option, facebook-marketing-api, gsap, crossfilter, draftjs, directive, fixed, show-hide

google: react-google-maps, google-maps-api-3

**centroid 1: javascript, python, html, java, android** -----
wordpress, woocommerce, javafx, swing, google-bigquery, button, google-api, video, google-analytics, plugins, kivy, youtube, onclick, calendar, dynamics-crm, youtube-api, widget, background, slider, radio-button, event-handling, save, amp-html, compression, google-tag-manager, javafx-8, click, hover, fxml, analytics, display, firebase-analytics, mouseevent, resize, background-image, size, listener, google-analytics-api, cross-domain, toggle, jpeg, google-data-studio, google-adwords, rgb, submit, gif, pixel, crop, gallery, tiff, thumbnails, image-resizing, exif, user-experience, src, pillow

google: google-adwords, google-bigquery, google-api, google-tag-manager, google-data-studio, google-analytics-api, google-analytics

**centroid 26: javascript, reactjs, node.js, typescript, react-native** -----
javascript, node.js, reactjs, firebase, react-native, flutter, firebase-realtime-database, webpack, dart, redux, google-cloud-firestore, ecmascript-6, react-redux, firebase-authentication, google-cloud-functions, jestjs, promise, async-await, react-router, firebase-cloud-messaging, import, push-notification, dialogflow, material-ui, module, react-navigation, react-native-android, expo, fetch, gulp, mocha, firebase-storage, actions-on-google, create-react-app, enzyme, material-design, jsx, flutter-layout, lodash, babel, navigation, es6-promise, node-modules, apollo, state, npm-install, babeljs, eslint, gatsby, react-native-ios, javascript-objects, react-router-v4, next.js, yarnpkg, webpack-4, react-hooks, redux-form, prestashop, firebase-security-rules, flowtype, react-router-dom, typescript-typings, webpack-dev-server, antd, redux-saga, redux-thunk, router, package.json, react-native-flatlist, firebase-admin, react-props, react-native-navigation, mobx, firebaseui, es6-modules, firebase-hosting, aurelia, pm2, immutability, serverside-rendering, action, setstate, gruntjs, requirejs, ecmascript-5, flutter-dependencies, ssr, react-native-firebase, angular-dart, es6-class, require, laravel-mix, arrow-functions, react-native-maps, npm-scripts, flutter-animation, workbox, firebase-cli, destructuring, babel-loader, immutable.js, minify, browserify, node-sass, nodemon, firebase-security, angularfire, reducers, loader, bower

google: google-cloud-functions, actions-on-google, google-cloud-firestore

**centroid 13: javascript, selenium, google-chrome, html, selenium-webdriver** -----
selenium, google-chrome, selenium-webdriver, xpath, dom, google-chrome-extension, firefox, caching, automation, iframe, selenium-chromedriver, mobile, browser, internet-explorer, safari, webdriver, css-selectors, google-chrome-devtools, webrtc, progressive-web-apps, service-worker, local-storage, internet-explorer-11, html5-video, microsoft-edge, ignite, phantomjs, chromium, cross-browser, webdriverwait, capybara, screenshot, cpu-architecture, mobile-safari, firefox-addon, webkit, geckodriver, firefox-webextensions, google-chrome-headless, browser-cache, webdriver-io, v8, specflow, selenium-grid, html-agility-pack, memcached, guava, devtools, cucumber-java, headless, domdocument, extentreports, selenium-ide, watir, cache-control, google-chrome-app, browser-automation, rselenium, mozilla

google: google-chrome, google-chrome-headless, google-chrome-devtools, google-chrome-app, google-chrome-extension

**centroid 6: javascript, vue.js, vuejs2, vuex, webpack** -----
vue.js, express, vuejs2, axios, vue-component, vuex, vuetify.js, xmlhttprequest, vue-router, nuxt.js, fetch-api, vue-cli, vue-cli-3, store, nuxt, bootstrap-vue, vue-test-utils, element-ui, vee-validate

**centroid 40: mongodb, node.js, javascript, python, express** -----
mongodb, qt, mongoose, graphql, pyqt5, pyqt, mongodb-query, aggregation-framework, discord, qml, qt5, nosql, discord.js, discord.py, aggregate, ejs, handlebars.js, pymongo, backend, schema, mongoose-schema, mean-stack, sails.js, pug, nestjs, loopbackjs, pyqt4, spring-data-mongodb, multer, geospatial, mean, fs, aggregation, lookup, loopback, apollo-server, parse-server, pyside2, bcrypt, mongodb-.net-driver, document, pyside, qt-designer, mongoengine, body-parser, discord.py-rewrite, projection, mern, mongoose-populate, qthread, mlab, joi, passport-local, pyqtgraph, bson, sharding, express-handlebars

**centroid 5: multithreading, java, python, concurrency, c++** -----
multithreading, asynchronous, parallel-processing, concurrency, multiprocessing, callback, queue, celery, jvm, task, python-asyncio, synchronization, dask, python-multiprocessing, thread-safety, locking, mpi, openmp, singleton, pickle, python-multithreading, opencl, future, threadpool, mutex, task-parallel-library, tornado, deadlock, aiohttp, atomic, wait, executorservice, semaphore, completable-future, handler, goroutine, channel, race-condition, volatile, pool, runnable, java-threads, synchronous, async.js, producer-consumer, synchronized, java.util.concurrent, blocking

**centroid 11: oracle, sql, plsql, oracle11g, database** -----
oracle, plsql, stored-procedures, oracle11g, triggers, db2, oracle12c, sql-server-2014, oracle-sqldeveloper, oracle-apex, cursor, database-trigger, apex, oracle10g, sqlplus, oracle-apex-5.1, procedure, dynamic-sql, cx-oracle, oracle-adf, oracleforms, hierarchical-data, plsqldeveloper, oracle-apex-5

**centroid 38: pdf, html, python, php, c#** -----
pdf, merge, webview, printing, fonts, r-markdown, download, base64, puppeteer, itext, hyperlink, latex, export, blob, imagemagick, ocr, pdf-generation, adobe, jspdf, pdfbox, itext7, embed, docx, digital-signature, wkhtmltopdf, fpdf, mpdf, tcpdf, dompdf, ghostscript, acrobat, pypdf2, reportlab

**centroid 9: php, laravel, laravel-5, mysql, javascript** -----
php, laravel, ajax, laravel-5, codeigniter, validation, eloquent, session, file-upload, model, pagination, codeigniter-3, laravel-5.6, controller, laravel-5.5, migration, upload, laravel-5.7, laravel-blade, laravel-5.4, relational-database, laravel-5.2, php-7, relationship, lumen, middleware, php-7.2, octobercms, guzzle, image-uploading, laravel-5.8, algolia, query-builder, phpexcel, jobs, laravel-query-builder, laravel-5.3, roles, artisan, laravel-nova, php-carbon, laravel-4, laravel-5.1, homestead, pusher, laravel-eloquent, blade, laravel-routing, laravel-dusk, relation, shared-hosting, eager-loading

**centroid 47: php, wordpress, javascript, woocommerce, python** -----
google-apps-script, email, notifications, google-drive-api, paypal, stripe-payments, gmail, smtp, attributes, wordpress-theming, google-calendar-api, google-visualization, google-oauth, google-sheets-api, product, phpmailer, youtube-data-api, advanced-custom-fields, gmail-api, hook-woocommerce, outlook-addin, metadata, google-sheets-formula, cart, html-email, google-app-maker, hook, exchangewebservices, payment-gateway, custom-post-type, exchange-server, checkout, e-commerce, sendgrid, field, content-management-system, nodemailer, categories, gsuite, google-form, admin, mailchimp, comments, web-hosting, outlook-web-addins, orders, wordpress-rest-api, customization, imap, google-docs, rss, custom-wordpress-pages, custom-taxonomy, shortcode, outlook-restapi, email-attachments, google-sheets-query, mailgun, google-api-php-client, woocommerce-rest-api, wordpress-gutenberg, google-apis-explorer, attachment, gmail-addons, price, sendmail, icalendar, blogs, registration, custom-fields, multisite, google-admin-sdk, shipping, gravity-forms-plugin, google-api-client, archive, pagespeed, smtplib, mime, meta, google-api-nodejs-client, contact-form, taxonomy, google-api-python-client, account, stock

google: google-sheets-api, google-docs, google-oauth, google-apps-script, google-sheets-query, google-sheets-formula, google-api-php-client, google-api-nodejs-client, google-visualization, google-admin-sdk, google-calendar-api, google-apis-explorer, google-api-python-client, google-form, google-app-maker, google-api-client, google-drive-api

**centroid 23: postgresql, sql, python, javascript, mysql** -----
sqlite, flask, sqlalchemy, hyperledger-fabric, odoo, hyperledger, elixir, blockchain, hyperledger-composer, flask-sqlalchemy, sequence, couchdb, psycopg2, psql, postgis, pyodbc, knex.js, plpgsql, jsonb, jooq, typeorm, postgresql-9.5, ecto, postgresql-10, marshalling, connection-pooling, postgresql-9.6, database-replication, unmarshalling, pgadmin-4, pgadmin, recursive-query, postgresql-9.4, crosstab, go-gorm, database-backups, postgresql-9.3, rds, heroku-postgres

**centroid 35: python, java, c++, c#, windows** -----
windows, powershell, batch-file, ffmpeg, audio, cmd, windows-10, path, stream, directory, process, vbscript, prolog, ftp, time-complexity, copy, command, zip, file-io, ocaml, scheduled-tasks, storage, big-o, binary-search-tree, registry, scheme, binary-tree, text-files, dynamic-programming, rename, exe, echo, command-prompt, hashtable, powershell-v3.0, filereader, batch-processing, wmi, stack-overflow, file-handling, windows-server-2016, windows-server-2012-r2, bufferedreader, taskscheduler, fstream, hyper-v, readfile, depth-first-search, fibonacci, ifstream, backtracking

**centroid 3: python, java, javascript, arrays, c#** -----
arrays, string, list, function, loops, csv, algorithm, dictionary, performance, for-loop, file, sorting, class, object, if-statement, oop, haskell, recursion, pointers, variables, generics, java-8, matrix, rust, filter, optimization, indexing, math, lambda, arraylist, inheritance, input, multidimensional-array, search, random, vector, data-structures, time, struct, types, methods, while-loop, foreach, design-patterns, dynamic, functional-programming, collections, java-stream, sas, parameters, enums, nested, interface, constructor, linked-list, syntax, casting, tree, hashmap, binary, properties, scope, reference, type-conversion, floating-point, iterator, null, tuples, static, format, set, conditional, iteration, range, switch-statement, return, append, numbers, boolean, output, int, concatenation, polymorphism, hex, compare, initialization, namespaces, integer, pattern-matching, grouping, logic, key, filtering, parameter-passing, list-comprehension, apply, subset, global-variables, slice, vectorization, conditional-statements, combinations, scanf, java.util.scanner, character, lapply, comparison, this, 2d, override, counter, numpy-ndarray, permutation, user-input, rounding, nested-loops, abstract-class, instance, reduce, prototype, itertools, global, reverse, subclass, comparator, key-value, increment, min, infinite-loop, contains, do-while, associative-array, mergesort, abstract, indexof, break, bubble-sort

**centroid 48: python, java, javascript, r, php** -----
typo3, wso2, clojure, sublimetext3, drupal-8, acumatica, jframe, docusignapi, teradata, emacs, netsuite, karate, verilog, jasper-reports, marklogic, sparql, vhdl, sympy, autodesk-forge, knitr, erlang, yocto, tcl, odoo-11, cakephp-3.0, mule, phoenix-framework, drupal-7, integration, racket, netlogo, autohotkey, uml, drools, node-red, stata, magento-1.9, common-lisp, aem, opencart, abap, line, python-sphinx, jtable, yii, pentaho, wagtail, coq, regex-lookarounds, slack-api, bioinformatics, openstack, perl6, antlr4, awt, rcpp, upgrade, tweepy, jpanel, macos-high-sierra, documentation, jsonschema, actionscript-3, vmware, wildcard, microsoft-dynamics, prestashop-1.7, typo3-8.x, zend-framework, lisp, gwt, elasticsearch-5, distance, smartcontracts, talend, wso2-am, slim, sfml, message-queue, computer-science, scenebuilder, yii2-advanced-app, rdf, inno-setup, fpga, flask-wtforms, bitcoin, clipboard, special-characters, unreal-engine4, hana, preg-replace, gdal, flash, nginx-config, wso2esb, system-verilog, arangodb, wso2is, netbeans-8, uuid, graphviz, liferay, omnet++, spatial, encode, powershell-v4.0, paypal-sandbox, http2, dynamics-365, local, ip-address, servicestack, hdf5, firewall, kdb, executable, linear-programming, add, orientdb, angularjs-scope, cplex, pymysql, xpages, phaser-framework, maya, powershell-v2.0, nginx-location, adfs, limit, abstract-syntax-tree, variable-assignment, elementtree, wav, mouse, splunk, asterisk, pandoc, publish-subscribe, simulink, webassembly, packages, complexity-theory, ansible-2.x, python-decorators, preg-match, regex-negation, minecraft, spotfire, nested-lists, pcre, gfortran, percentage, matching, monads, jbutton, gsub, numba, sitecore, watson-conversation, dropwizard, edit, frequency, vulkan, cdn, mime-types, wrapper, php-curl, jersey-2.0, scapy, converters, zapier, attributeerror, elm, console.log, web3js, kentico, moodle, intervals, anylogic, multilingual, logical-operators, glm, vlc, owl, autodesk-viewer, dojo, z3, arcgis, classloader, pyomo, sybase, antlr, md5, indexeddb, powerapps, data-conversion, http-status-code-403, web-worker, external, alfresco, airflow-scheduler, finance, typo3-9.x, cpu-usage, pouchdb, ibm-midrange, ping, truffle, qemu, dask-distributed, selection, apache-httpclient-4.x, jsonpath, sha256, coding-style, polymer-2.x, zipfile, vps, symbols, mediawiki, calculation, okta, smarty, blueprism, netcdf, zend-framework3, genetic-algorithm, snmp, repeat, plesk, signature, doxygen, qgis, dlib, jena, ckeditor4.x, tortoisesvn, face-recognition, message, number-formatting, dropbox, lm, default, spss, perforce, assert, uart, acl, symlink, suitescript2.0, kendo-ui-angular2, getter-setter, jira-rest-api, crm, sleep, indentation, prompt, analysis, lme4, ironpython, latitude-longitude, grammar, dotnetnuke, cqrs, gaussian, regex-greedy, koa, yum, numerical-methods, haskell-stack, scala-cats, hugo, rpc, priority-queue, openldap, popen, shapefile, var, partition, record, combinatorics, ada, nio, pentaho-data-integration, appium-ios, scheduling, pyautogui, snakemake, production-environment, lwjgl, computational-geometry, scaling, tabulator, lifetime, naming-conventions, jsf-2, lotus-notes, javac, numeric, odoo-8, modeling, salesforce-lightning, silverstripe, bookdown, websphere-liberty, virtualization, wxwidgets, ramda.js, hapijs, reload, marklogic-9, snapshot, hierarchy, server-side, cakephp-3.x, prestashop-1.6, schedule, unix-timestamp, difference, ontology, readline, configuration-files, opendaylight, block, wolfram-mathematica, rpm, logstash-grok, currency, mount, remote-server, destructor, nsis, captcha, feathersjs, code-generation, hardware, django-2.1, suitescript, typoscript, jython, trim, distributed-system, zabbix, vaadin8, nodemcu, magento2.2, string-matching, shuffle, ckeditor5, mixed-models, fedora, ipv6, new-operator, ember-data, llvm-clang, exit, webcam, str-replace, large-data, simplexml, rules, elasticsearch-aggregation, rhel, dsl, ethernet, event-sourcing, vimeo, hashset, date-formatting, zlib, standards, bamboo, converter, liferay-7, file-get-contents, solrcloud, servicenow, logstash-configuration, xhtml, virtual, pywin32, equals, intersection, micronaut, production, cs50, fopen, elasticsearch-6, lazy-evaluation, server-sent-events, extbase, translate, python-module, tabular, libreoffice, sml, private, apostrophe-cms, tostring, bitbake, actionlistener, restore, activiti, mypy, opencart-3, janusgraph, rank, multiplication, keyword, archlinux, optaplanner, imagick, informix, flex-lexer, photoshop, pyaudio, openlayers-3, reset, sentry, umbraco7, messaging, lotus-domino, fiddler, interactive, jlabel, folium, bigcommerce, transparency, nullreferenceexception, operator-keyword, tracking, keyboard-events, twitter-oauth, static-methods, polymer-3.x, prisma, mule-esb, string-comparison, counting, layout-manager, gherkin, inner-classes, docker-for-windows, checksum, imagemagick-convert, connect, php-7.1, sublimetext, wso2carbon, python-telegram-bot, react-native-router-flux, desktop, paypal-rest-sdk, php-5.6, division, typeclass, identityserver3, mapbox-gl, wix-react-native-navigation, sample, point-clouds, web-audio, vertica, java-time, mosquitto, dllimport, dump, covariance, cytoscape.js, cgal, r-package, installshield, eigen3, point-cloud-library, ngx-datatable, sampling, vapor, clojurescript, auto-increment, overlap, ibm-cloud-infrastructure, echarts, web-audio-api, hp-uft, office365api, ngx-translate, shortcut, paho, ember-cli, rfid, applet, swap, predicate, host, detox, cas, jsf-2.2, trigonometry, sandbox, beagleboneblack, filestream, numpy-broadcasting, xsd-validation, fgets, ghc, serenity-bdd, spi, duration, jna, unzip, fiware, rhel7, long-integer, pentaho-spoon, cpython, crystal-lang, assertion, string-concatenation, compatibility, java-module, fluid, meta-tags, wildfly-10, hashicorp-vault, apache-karaf, roblox, gurobi, install4j, development-environment, static-analysis, ffi, h5py, django-authentication, urlencode, directx-11, salt-stack, r-raster, pseudocode, hsqldb, django-celery, fatal-error, pywinauto, peewee, p2p, tinymce-4, mysql-5.7, openlayers-5, vis.js, palindrome, angular-template, resteasy, kable, quickbooks, monaco-editor, rdp, solrj, file-transfer, language-agnostic, mustache, java-7, naudio, velocity, wikidata, copy-constructor, countdown, wtforms, montecarlo, wso2ei, sitemap, stringbuilder, geoserver, joomla3.0, symbolic-math, bytecode, high-availability, sharepoint-2010, assign, semantic-web, rtf, vmware-clarity, odoo-12, informatica, volume, jit, monogame, super, eof, syncfusion, rust-cargo, dataweave, stack-trace, browser-sync, arduino-ide, blogdown, communication, rider, favicon, fill, processbuilder, biginteger, labview, resampling, normal-distribution, linear, angular4-router, hierarchical-clustering, drag, modbus, diagram, word, org-mode, admin-on-rest, equation, webrequest, tinkerpop3, restful-authentication, lib, tizen, user-agent, survival-analysis, point, fragment-shader, tableau-server, ansible-inventory, delete-file, code-injection, clickhouse, text-editor, kettle, angularjs-material, date-range, rpy2, complex-numbers, graphene-python, coded-ui-tests, midi, programming-languages, web-push, pine-script, equality, holoviews, sapply, quotes, jtextfield, emscripten, sas-macro, angular-http, varnish, phalcon, typing, freeze, opentok, password-protection, anonymous-function, resolution, remote-desktop, cryptocurrency, hpc, default-value, tsc, multiline, chromium-embedded, treemap, substitution, arm64, shutil, supervisord, at-command, interpreter, packet, google-search, dynamics-crm-online, can-bus, neo4j-apoc, ranking, httpserver, gsm, freebsd, centos6, yield, c++-winrt, fread, anypoint-studio, jboss7.x, type-hinting, wixcode, epoch, uninstall, autoit, smartcard, wikipedia, angular-service-worker, cosine-similarity, protege, schema.org, typescript-generics, dropbox-api, verification, composition, windows-server, using, hmac, dry, ag-grid-angular, median, messenger, rethinkdb, thingsboard, xilinx, named-pipes, office-ui-fabric, dynamics-crm-365, heroku-cli, date-format, imputation, jfreechart, wiremock, packaging, outliers, target, typo3-7.6.x, ngrok, audit, models, jboss-eap-7, moving-average, 32bit-64bit, strapi, views, silverstripe-4, rasa-core, content-type, event-loop, textinput, smoothing, surface, explode, getusermedia, 7zip, confidence-interval, watch, freertos, zend-framework2, circular-dependency, qliksense, repeater, cjk, clock, django-testing, pic, csrf-protection, shopping-cart, encapsulation, paypal-ipn, json-ld, cobol, key-bindings, relative-path, hashcode, thrift, bing-maps, localdate, dicom, netezza

google: google-search

**centroid 37: python, machine-learning, tensorflow, python-3.x, keras** -----
tensorflow, numpy, keras, machine-learning, opencv, matlab, deep-learning, scikit-learn, image-processing, neural-network, scipy, nlp, pytorch, computer-vision, conv-neural-network, lstm, data-science, regression, classification, dataset, gpu, nltk, google-colaboratory, linear-regression, artificial-intelligence, object-detection, cluster-analysis, generator, spacy, interpolation, logistic-regression, svm, data-analysis, tesseract, random-forest, tensorflow-datasets, bazel, signal-processing, recurrent-neural-network, opencv3.0, fft, tensorboard, gensim, sparse-matrix, word2vec, cv2, h2o, cross-validation, tensor, caffe, xgboost, reshape, reinforcement-learning, stanford-nlp, linear-algebra, k-means, tensorflow-estimator, prediction, rnn, keras-layer, pca, probability, curve-fitting, decision-tree, text-mining, tensorflow-serving, loss-function, object-detection-api, google-cloud-ml, metrics, mathematical-optimization, image-segmentation, matrix-multiplication, autoencoder, tensorflow-lite, r-caret, text-classification, sentiment-analysis, scikit-image, convolution, training-data, categorical-data, tensorflow.js, knn, mnist, valueerror, sklearn-pandas, gradient-descent, weka, yolo, python-tesseract, word-embedding, feature-extraction, tokenize, emgucv, feature-selection, predict, coreml, similarity, normalization, one-hot-encoding, backpropagation, convolutional-neural-network, ode, lda, tf-idf, openai-gym, image-recognition, theano, naivebayes, rasa-nlu, detection, grid-search, data-mining, differential-equations, layer, torch, roc, mxnet, camera-calibration, topic-modeling, cudnn, kaggle, confusion-matrix, tensorflow2.0, doc2vec, distributed, embedding, tfrecord, recommendation-engine, multilabel-classification, ner

google: google-colaboratory, google-cloud-ml

**centroid 46: python, php, apache, python-3.x, ubuntu** -----
apache, nginx, .htaccess, web, url, pip, anaconda, redirect, pycharm, dns, ubuntu-16.04, permissions, url-rewriting, package, mod-rewrite, installation, conda, centos7, ubuntu-18.04, debian, virtualenv, python-import, install, apache2, url-redirection, vagrant, webserver, virtualbox, cpanel, gunicorn, digital-ocean, http-status-code-404, config, hosting, subdomain, systemd, uwsgi, wamp, nvidia, setuptools, ubuntu-14.04, mod-wsgi, pipenv, url-routing, mamp, httpd.conf, environment, query-string, seo, wsgi, subdirectory, setup.py, wampserver, permalinks, pypi, apache2.4, lamp, apt, http-status-code-301, miniconda, http-redirect

**centroid 50: python, python-3.x, python-2.7, pandas, javascript** -----
python, python-3.x, pandas, dataframe, python-2.7, web-scraping, datetime, parsing, beautifulsoup, post, python-requests, scrapy, request, pygame, python-3.6, pandas-groupby, encoding, unicode, get, utf-8, twitter, character-encoding, header, python-3.7, web-crawler, python-imaging-library, pyinstaller, spyder, tags, export-to-csv, typeerror, odoo-10, openpyxl, jsoup, regex-group, python-3.5, ascii, series, urllib, wxpython, lxml, turtle-graphics, xlsx, rvest, nan, argparse, python-2.x, mysql-python, datetime-format, kivy-language, emoji, importerror, screen-scraping, scrapy-spider, pyserial, html-parsing, python-xarray, flask-restful, tkinter-canvas, cheerio, frame, odoo-9, cx-freeze, twisted, tk, python-datetime, python-unicode, decoding, httr, tkinter-entry, timedelta

**centroid 16: python, unix, bash, sed, linux** -----
regex, linux, bash, shell, unix, perl, awk, sed, text, replace, split, cron, command-line, grep, scripting, sh, find, substring, filesystems, notepad++, fork, posix, scheduler, cgi, delimiter, text-processing, aix, cut, solaris

**centroid 29: r, python, ggplot2, plot, matplotlib** -----
r, matplotlib, ggplot2, dplyr, shiny, jupyter-notebook, plot, graph, time-series, statistics, colors, plotly, julia, rstudio, graphics, seaborn, cypher, tidyverse, bokeh, data-visualization, bar-chart, label, networkx, histogram, ipython, purrr, tidyr, visualization, gremlin, gnuplot, influxdb, igraph, shinydashboard, legend, heatmap, octave, graph-theory, simulation, data-manipulation, correlation, raster, plotly-dash, statsmodels, data-cleaning, na, matlab-figure, mutate, scatter-plot, boxplot, multi-index, stringr, dashboard, forecasting, scale, lubridate, r-plotly, missing-data, graph-databases, arima, pie-chart, graph-algorithm, jupyter-lab, axis, geopandas, shiny-server, distribution, breadth-first-search, sparklyr, bayesian, lag, sf, tibble, subplot, matplotlib-basemap, xts, contour, plyr, anova, axis-labels, shortest-path, shiny-reactivity, ggmap, dijkstra, figure, rlang, facet, ggplotly, zoo

**centroid 49: ruby, ruby-on-rails, ruby-on-rails-5, javascript, activerecord** -----
ruby-on-rails, postgresql, ruby, heroku, redis, ruby-on-rails-5, yii2, hash, activerecord, routes, shopify, ruby-on-rails-4, rspec, rubygems, devise, chef, ruby-on-rails-3, bundle, rails-activestorage, associations, rails-activerecord, puppet, ruby-on-rails-5.2, metaprogramming, rspec-rails, activeadmin, bundler, coffeescript, shopify-app, sidekiq, carrierwave, passenger, sinatra, simple-form, nokogiri, cloudinary, capistrano, puma, webpacker, mongoid, actioncable, erb, haml, rake, paperclip, factory-bot

**centroid 41: sql, sql-server, mysql, database, postgresql** -----
sql, mysql, sql-server, database, tsql, date, mysqli, join, select, group-by, mariadb, sequelize.js, pdo, phpmyadmin, sql-server-2008, data.table, count, sql-server-2012, xampp, database-design, duplicates, view, sum, timestamp, pivot, foreign-keys, sql-update, mysql-workbench, timezone, tableau, insert, ssms, odbc, constraints, sql-server-2016, etl, subquery, max, syntax-error, left-join, case, database-connection, decimal, inner-join, prepared-statement, full-text-search, database-migration, sql-order-by, query-optimization, sql-server-2008-r2, sql-server-2017, sql-insert, union, backup, aggregate-functions, where, partitioning, common-table-expression, distinct, query-performance, concat, oledb, innodb, replication, window-functions, sql-injection, mdx, primary-key, greatest-n-per-group, where-clause, database-performance, sql-delete, data-warehouse, rdbms, sql-like, database-administration, ddl, entity-relationship, bulkinsert, ssis-2012, calculated-columns, resultset, derby, database-schema, sql-server-2005, create-table, database-normalization, temp-tables

**centroid 14: swift, ios, xcode, objective-c, android** -----
ios, swift, xcode, objective-c, uitableview, swift4, iphone, uicollectionview, facebook-graph-api, realm, bluetooth-lowenergy, twilio, core-data, cocoa, admob, cocoapods, alamofire, arkit, swift3, crash, uiview, tableview, localization, keyboard, autolayout, sprite-kit, frameworks, uiviewcontroller, augmented-reality, uikit, wkwebview, scenekit, accessibility, closures, in-app-purchase, instagram, xcode10, uinavigationcontroller, avfoundation, uibutton, apple-push-notifications, uiscrollview, uitextfield, delegates, crashlytics, app-store, uicollectionviewcell, ios11, protocols, macos-mojave, ios12, xcode9, storyboard, uinavigationbar, qr-code, uilabel, uiimageview, uitabbarcontroller, ipad, optional, decode, uiimage, cell, metal, segue, mapkit, deep-linking, swift4.2, parse-platform, codable, spotify, uitextview, avplayer, itunesconnect, facebook-login, gradient, touch, audiokit, cocoa-touch, textfield, assets, ios-simulator, uistackview, uisearchbar, uiwebview, grand-central-dispatch, firebase-dynamic-links, watchkit, voip, nslayoutconstraint, fastlane, uiimagepickercontroller, iphone-x, nsattributedstring, interface-builder, viewcontroller, uipickerview, nsuserdefaults, core-bluetooth, decodable, xctest, extension-methods, apple-watch, nsurlsession, core-location, code-signing, navigationbar, uialertcontroller, orientation, uigesturerecognizer, objectmapper, swift-playground, keychain, core-graphics, xib, uisearchcontroller, lldb, swift-protocols, avaudioplayer, tvos, cloudkit, shadow, appdelegate, contacts, statusbar, swift4.1, testflight, mkmapview, ios-autolayout, uibezierpath, gesture, uipageviewcontroller, health-kit, uitabbar, cllocationmanager, calayer, xcuitest, provisioning-profile, icloud, uicollectionviewlayout, geofire, uistoryboard, metalkit, pdfkit, plist, uiviewanimation, swifty-json, collectionview, uibarbuttonitem, ipa, xcode-ui-testing

**centroid 32: symfony, php, symfony4, javascript, mysql** -----
forms, symfony, symfony4, composer-php, twig, doctrine, annotations, doctrine-orm, phpunit, symfony-3.4, translation, autowired, symfony-forms, sonata-admin, api-platform.com, fosuserbundle, swiftmailer, data-annotations, sonata

**centroid 27: testing, java, javascript, unit-testing, automated-tests** -----
angularjs, unit-testing, testing, groovy, junit, jmeter, protractor, mockito, automated-tests, jasmine, mocking, cucumber, appium, pytest, testng, robotframework, integration-testing, cypress, performance-testing, android-espresso, code-coverage, e2e-testing, junit5, chai, python-unittest, junit4, sinon, karma-runner, ui-automation, load, appium-android, nightwatch.js, load-testing, tdd, katalon-studio, testcafe, jest, bdd, spock, powermockito, powermock, codeception, jmeter-plugins, rpa, qa, cucumberjs, jmeter-4.0, angular-test, robolectric

完整代码

我用来创建和显示先前结果的代码:

clusters = 50
percent = '01'
one_hot_dimensions = 500model = 'deleting.kmeans_tagsubtag_%s_big_a_%s_%s' % (clusters, percent,one_hot_dimensions)
clusters_temp_table = 'deleting.clusters_%s_result_a_%s_%s' % (clusters, percent, one_hot_dimensions)one_hot_p = client.query("""
SELECT STRING_AGG(
  FORMAT("IFNULL(ANY_VALUE(IF(tag2='%%s',1,null)),0)X%%s", tag2, REPLACE(REPLACE(REPLACE(REPLACE(tag2,'-','_'),'.','D'),'#','H'),'+','P')) 
) one_hot
FROM (
  SELECT tag2, SUM(questions) questions 
  FROM `deleting.stack_overflow_tag_co_ocurrence`
  GROUP BY tag2
  ORDER BY questions DESC
  LIMIT %s
)
""" % one_hot_dimensions).to_dataframe().iloc[0]['one_hot']client.query("""
CREATE OR REPLACE MODEL `%s` 
OPTIONS ( 
    model_type='kmeans',
    distance_type='COSINE',
    num_clusters=%s )
ASWITH tag_and_subtags AS (
    SELECT tag1, %s
    FROM `deleting.stack_overflow_tag_co_ocurrence`
    WHERE percent>0.%s
    GROUP BY tag1
)SELECT * EXCEPT(tag1)
FROM tag_and_subtags""" % (model, clusters, one_hot_p, percent)).to_dataframe()df = client.query("""
CREATE OR REPLACE TABLE %s
ASWITH tag_and_subtags AS (
    SELECT tag1, MAX(questions) questions, %s
    FROM `deleting.stack_overflow_tag_co_ocurrence`
    WHERE percent>0.%s
    GROUP BY tag1
)SELECT centroid_id
, STRING_AGG(tag1, ', ' ORDER BY questions DESC) tags
, ARRAY_TO_STRING(ARRAY_AGG(IF(tag1 LIKE '%%google%%', tag1, null)  IGNORE nulls LIMIT 18), ', ') google_tags
, ARRAY_TO_STRING(ARRAY_AGG(IF(tag1 LIKE '%%amazon%%' OR tag1 LIKE '%%aws%%', tag1, null)  IGNORE nulls LIMIT 18), ', ') amazon_tags
, ARRAY_TO_STRING(ARRAY_AGG(IF(tag1 LIKE '%%azure%%', tag1, null)  IGNORE nulls LIMIT 18), ', ') azure_tags
, COUNT(*) c
FROM ML.PREDICT(MODEL `%s` 
  , (SELECT * FROM tag_and_subtags )
)
GROUP BY 1
ORDER BY c DESC""" % (clusters_temp_table, one_hot_p, percent, model)).to_dataframe()df = client.query("""
SELECT centroid_id, c, yep, tags
    , IFNULL(google_tags, '') google_tags
    , IFNULL(amazon_tags, '') amazon_tags
    , IFNULL(azure_tags, '') azure_tags
FROM `%s` 
JOIN (
  SELECT centroid_id
    , STRING_AGG(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(feature,'_','-'),'D','.'),'H','#'),'P','+'), 'X', ''), ', ' ORDER BY numerical_value DESC  LIMIT 5) yep
  FROM ML.CENTROIDS(MODEL `%s`
  )
  GROUP BY 1
) 
USING(centroid_id)
ORDER BY yep
""" % (clusters_temp_table, model)).to_dataframe()for index, row in df.iterrows():
    print('centroid %s: %s\n-----' % (row['centroid_id'],  row['yep']))
    print(row['tags'])
    print()
    if row['google_tags']:
        print('google: %s' % row['google_tags'])
    if row['amazon_tags']:
        print('amazon: %s' % row['amazon_tags'])
    if row['azure_tags']:
        print('azure: %s' % row['azure_tags'])
    print('\n')

注意,我用ML.CENTROIDS()连接了我的结果——这给了我每个质心的最高区分发生标签——即使它们不是每个聚类的一部分。

这就是一切

你对结果感到惊讶吗?或者惊讶于使用 BigQuery 运行 k-means 建模是多么容易?或者好奇我为什么选择distance-type: 'COSINE'这个问题?现在轮到你玩了:)。

查看 BigQuery 建模文档k-means 教程

拉克的思想

你会如何选择最佳参数?检查 Lak Lakshmanan 帖子的超参数调整。Lak 也有一些有趣的想法,通过矩阵分解来减少聚类的维数——但我们将把它留到以后的文章中。作为未经测试的预览:

一旦你发现 tag1 和 tag2 同时出现,就把它当作一个推荐问题,也就是 tag1 在 90%的时间里喜欢 tag2。然后,可以做矩阵分解:

CREATE OR REPLACE MODEL deleting.tag1_tag2
OPTIONS ( 
 model_type='matrix_factorization',
 user_col='tag1', item_col='tag2', rating_col='percent10' )
AS
SELECT tag1, tag2, percent*10 AS percent10
FROM advdata.stack_overflow_tag_co_ocurrence

通过这个矩阵分解,您将得到 tag1_factors 和 tag2_factors,它们本质上是从数据中学习到的标签的嵌入。将这些连接起来,然后进行聚类…

SELECT feature, factor_weights
FROM ML.WEIGHTS( MODEL deleting.tag1_tag2 )
WHERE processed_input = 'tag1' and feature LIKE '%google%'

想要更多吗?

我是 Felipe Hoffa,谷歌云的开发者倡导者。给我发推文 @felipehoffa ,我之前在medium.com/@hoffa上的帖子,以及所有关于reddit.com/r/bigquery上的 BigQuery 包括预测栈溢出何时回复

原载于 2019 年 7 月 24 日https://stack overflow . blog

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值