降维——主成分分析能提高分类模型的性能吗?
利用 PCA——降维技术提高 ML 模型的性能
奥拉夫·阿伦斯·罗特内在 Unsplash 上的照片
什么是 PCA?
主成分分析(PCA)是数据科学中一种常见的特征提取技术,它采用矩阵分解将数据的维度降低到较低的空间。
在现实世界的数据集中,数据中通常有太多的要素。要素数量越多,数据的可视化和处理就越困难。有时大多数特征是相关的,因此是多余的。因此,特征提取开始发挥作用。
关于数据:
本文使用的数据集是来自 UCI 机器学习知识库的电离层数据集。这是一个二元分类问题。有 351 个观察值和 34 个特征。
准备数据集:
- 导入必要的库并读取数据集
- 数据集预处理
- 标准化
(作者代码)
使用全部 34 个特征的逻辑回归 ML 模型:
训练数据有 34 个特征。
- 在对数据进行预处理后,使用逻辑回归算法对训练数据进行二值分类训练
- 微调逻辑回归模型以找到最佳参数
- 计算训练和测试准确度以及 f1 分数。
(图片由作者提供),34 个特征数据集的逻辑回归模型的 C 与 F1 得分图
- 使用 c=10**0 的 34 个特征训练 LR 模型
- 计算训练和测试准确度以及 f1 分数
(图片由作者提供),训练测试准确性和 F1 分数,混淆矩阵
通过训练具有 34 个特征的整个“X_train”数据获得的结果,
测试 f1 分数为 0.90,因为在混淆矩阵中观察到 14 个值被错误分类。
(作者代码)
使用主成分分析的特征提取;
为了使用 PCA 技术从数据集中提取特征,首先我们需要找到解释为维度减少的方差百分比。
Notations,
**λ:** eigenvalue **d:** number of dimension of original dataset
**k:** number of dimensions of new feature space
(图片由作者提供),解释的方差百分比与维度数量的关系图
- 从上面的图中可以看出,对于 15 个维度,解释的方差百分比为 90%。这意味着我们通过将较高的维度(34)投影到较低的空间(15)来保留 90%的方差。
(作者代码)
使用 PCA 的前 15 个特征训练逻辑回归 ML 模型:
现在 PCA 降维后的训练数据有 15 个特征。
- 在对数据进行预处理后,使用逻辑回归算法对训练数据进行二值分类训练
- 微调逻辑回归模型以找到最佳参数
- 计算训练和测试准确度以及 f1 分数。
(图片由作者提供),15 个特征数据集的逻辑回归模型的 C 与 F1 分数的关系图
- 使用 c=10**0 的 15 个特征训练 LR 模型
- 计算训练和测试准确度以及 f1 分数
(图片由作者提供),训练测试准确性和 F1 分数,混淆矩阵
通过用 15 个特征训练 PCA 数据获得的结果,
测试 f1 分数为 0.896,因为混淆矩阵中观察到 12 个值被错误分类。
比较上述两种模型的结果:
(图片由作者提供),训练测试准确性和 F1 分数,混淆矩阵
(作者代码)
使用原始数据+来自 PCA 的数据训练 LR 模型:
在连接具有 34 个特征的原始数据和具有 15 个特征的 PCA 数据之后,我们形成了具有 49 个特征的数据集。
- 在对数据进行预处理后,使用逻辑回归算法对训练数据进行二值分类训练
- 微调逻辑回归模型以找到最佳参数
- 计算训练和测试准确度以及 f1 分数。
(图片由作者提供),49 个特征数据集的逻辑回归模型的 C 与 F1 得分图
- 使用 c=10**0 的 15 个特征训练 LR 模型
- 计算训练和测试准确度以及 f1 分数
(图片由作者提供),训练测试准确性和 F1 分数,混淆矩阵
(作者代码)
从上述结果得出的结论:
(图片由作者提供),上述三种模型的准确度和 F1 得分结果
从上表中,我们可以观察到,
- 使用具有 34 个特征的原始预处理数据集训练的 LR 模型,我们得到 90%的 F1 分数。
- 使用 PCA 仅用提取的 15 个特征训练的 LR 模型,我们得到 89%的 F1 分数。
- 用上述两个数据的组合训练的 LR 模型,我们得到 92%的 F1 分数。
让我们观察上述 3 个模型的混淆矩阵结果的变化。
(图片由作者提供),上述三种模型的混淆矩阵
因此,我们得出结论,仅使用 PCA 提取的特征,仅使用来自原始数据的 50%数量的特征,我们得到少 1%的 F1 分数。但是,如果我们将两个数据结合起来,我们将改进 2%的指标,以获得 91%的最终 F1 分数。
点击下方获取代码:
编辑描述
colab.research.google.com](https://colab.research.google.com/drive/1hH5vJHNgCXohWhT5GXh5jzCasDtVxGHF?usp=sharing)
感谢您的阅读
数据可视化的降维:主成分分析与 TSNE、UMAP 和线性判别分析
使用 PCA、TSNE、UMAP 和 LDA 在 2D 和 3D 中可视化高维数据集
照片由 Unsplash 上的 Hin Bong Yeung 拍摄
在这个故事中,我们将介绍三种专门用于数据可视化 : **PCA、t-SNE、LDA 和 UMAP 的降维技术。**我们将使用手语 MNIST 数据集来详细探索它们,而不是深入研究算法背后的数学。
什么是降维?
许多机器学习问题涉及成千上万个特征,拥有如此大量的特征会带来许多问题,最重要的是:
- 使训练极其缓慢
- 很难找到好的解决方案
这就是所谓的 维数灾难 简而言之,降维就是将特征的数量减少到最相关的数量的过程。
降低维数确实会丢失一些信息,但是大多数压缩过程都会有一些缺点,即使我们训练得更快,我们也会使系统性能稍差,但这没关系!“有时降低维度可以过滤掉一些存在的噪音和一些不必要的细节”。
大多数降维应用用于:
- 数据压缩
- 降噪
- 数据分类
- 数据可视化
降维最重要的一个方面,就是 数据可视化。
降维的主要方法
降维的两种主要方法:投影和流形学习。
- **流形学习:**许多降维算法通过对训练实例所在的流形进行建模来工作;这叫做流形学习。它依赖于流形假设或假设,认为大多数真实世界的高维数据集都接近一个低得多的维流形,这种假设在大多数情况下是基于观察或经验,而不是理论或纯逻辑。[4]
现在,在开始解决用例之前,让我们简要地解释一下这三种技术。
主成分分析
最著名的降维“无监督”算法之一是 PCA(主成分分析)。
其工作原理是识别最接近数据的超平面,然后将数据投影到该超平面上,同时保留数据集中的大部分变化。
主成分
解释训练集中最大方差的轴称为 主成分 。
与该轴正交的轴称为第二主分量**。当我们追求更高的维度时,主成分分析会找到与其他两个分量正交的第三个分量,以此类推,为了可视化的目的,我们总是坚持 2 个或最多 3 个主分量。**
来源:Packt_Pub,via Hackernoon
选择正确的超平面非常重要,这样当数据投影到超平面上时,可以获得关于原始数据如何分布的最大信息量。
T-SNE(T-分布式随机邻居嵌入)
(t-SNE) 或T-分布式随机邻居嵌入于2008 由 ( 劳伦斯·范·德·马腾和杰弗里·辛顿)创建,用于降维,特别适合于高维数据集的可视化。
(t-SNE) 取一个高维数据集,把它还原成一个低维图,保留了很多原始信息。它通过在二维或三维地图中给每个数据点一个位置来做到这一点。这种技术发现数据中的聚类,从而确保嵌入保留了数据中的含义。t-SNE 减少维数,同时试图保持相似的实例接近,不相似的实例分开。[2]
要快速了解这种技术,请参考下面的动画(它摘自西里尔·罗桑特的精彩教程,我强烈推荐看看他的精彩教程。
链接:https://www . oreilly . com/content/an-illustrated-introduction-to-the-t-SNE-algorithm/
来源:西里尔·罗桑特,转自奥雷利
LDA ( 线性判别分析)
在模式分类的预处理步骤中,线性判别分析(LDA)是最常用的降维技术。****
目标是将数据集投影到具有良好类别可分性的低维空间上,以避免过拟合并降低计算成本。
一般的方法非常类似于 PCA,而不是找到使我们的数据方差最大化的分量轴, 我们另外感兴趣的是使多个类之间的间隔最大化的轴(LDA)【5】。
LDA 是“受监督的”并计算方向(“线性判别式”),这些方向将代表使多个类之间的间隔最大化的轴。
来源:https://sebastianraschka.com/Articles/2014_python_lda.html
UMAP(均匀流形近似和投影)
由 ( 利兰·麦金尼斯、约翰·希利、詹姆斯·梅尔维尔)于 2018 年创建的均匀流形逼近与投影、T15,是一种通用的流形学习与降维算法。****
UMAP 是一种 非线性 降维方法,对于可视化聚类或组数据点及其相对邻近度非常有效。
与 TSNE 的显著区别是可伸缩性**,它可以直接应用于稀疏矩阵,从而无需应用任何维数缩减,如 s PCA 或截断 SVD(奇异值分解)作为之前的预处理步骤*。*【1】**
简而言之,它类似于 t-SNE,但可能具有更高的处理速度,因此,更快,可能更好的可视化。(让我们在下面的教程中找出答案)
用例
现在,我们将浏览上述所有三种技术都将被应用的用例:具体来说,我们将尝试使用这些技术来可视化一个高维数据集:T 何手语-MNIST 数据集:
(手语-MNIST 数据集),截图自 kaggle.com
数据
****
训练数据的大小
唯一标签的数量
注意:有 25 个独特的标签代表不同手语的数量。现在为了更好的可视化(“在单个可视化中观察所有 24 个类是非常困难的”)和更快的计算。我只保留前 10 个标签,省略其余的。
实现绘图功能
数据标准化
实施 PCA
在应用 PCA 之后,与 x 数据的 784 个特征相比,数据的新维度现在只有 3 个特征。
维度的数量已经大幅减少,同时试图尽可能多地保留信息中的“变化”。
— PCA — 2D —
plot_2d(principalComponents[:, 0],principalComponents[:, 1])
作者图片
从 2D 图中,我们可以看到这两个部分肯定包含了一些信息,尤其是特定的数字,但显然不足以将它们区分开来。
— PCA— 3D —
plot_3d(principalComponents[:, 0],principalComponents[:, 1],principalComponents[:, 2])
作者图片
实施 t-SNE
需要注意的一点是, t-SNE 的计算开销非常大,因此在其文档中提到:
“如果特征的数量非常多,强烈建议使用另一种降维方法(例如,针对密集数据的 PCA 或针对稀疏数据的 TruncatedSVD)将维数减少到合理的数量(例如,50)。这将抑制一些噪声,并加快样本之间成对距离的计算。”[2]
因此,我应用了 PCA,选择保留原始数据中的 50 个主成分,以减少对更多处理能力的需求,并且如果我们考虑了原始数据,将需要时间来计算维度缩减。
这三种技术的速度将在以下章节中进一步详细分析和比较。
— t-SNE — 2D —
plot_2d(tsne[:, 0],tsne[:, 1])
作者图片
与 PCA 2d 结果相比,我们可以清楚地看到不同聚类的存在以及它们是如何定位的。
— t-SNE — 3D —
plot_3d(tsne[:, 0],tsne[:, 1],tsne[:, 2])
作者图片
实施 UMAP
UMAP 具有不同的超参数,这些参数会对生成的嵌入产生影响:
n_neighbors
该参数控制 UMAP 如何平衡数据中的本地和全局结构。n _ neighbours 的低值迫使 UMAP 关注非常局部的结构,而较高的值将使 UMAP 关注较大的街区。
min_dist
该参数控制允许 UMAP 将点打包在一起的紧密程度。较低的值意味着这些点将紧密地聚集在一起,反之亦然。
n_components
该参数允许用户确定降维空间的维度。
metric
此参数控制如何在输入数据的环境空间中计算距离。
更详细的信息,我建议查阅 UMAP 文档😕/umap-learn . readthedocs . io/en/latest/
UMAP(默认设置)
对于本教程,我选择保留默认设置 n_components ,我为 3d 空间图设置为 3。最好试验不同的超参数设置,以获得算法的最佳效果。
— UMAP— 2D —
plot_2d(reducer.embedding_[:, 0],reducer.embedding_[:, 1])
作者图片
我们可以清楚地看到,与 t-SNE 和 PCA 相比,UMAP 在分离数据点方面做得非常好。然而,从 2d 的角度来看,没有大的聚类充分地分隔符号,在其他部分也有相似的数据点聚集在一起。
— UMAP— 3D —
plot_3d(reducer.embedding_[:, 0],reducer.embedding_[:, 1],reducer.embedding_[:, 2])
作者图片
实施 LDA
— LDA— 2D —
plot_2d(X_LDA[:, 0],X_LDA[:, 1])
作者图片
利用 LDA,我们可以清楚地识别出这九个具有显著分离的集群的存在。如果使用 UMAP 和 SNE 霸王龙,我们几乎看不到聚类的主干,而使用 LDA,我们可以看到聚集在相同聚类区域的数据点的整个聚类。
— LDA— 3D —
plot_3d(X_LDA[:, 0],X_LDA[:, 1],X_LDA[:, 2])
作者图片
降维技术的比较:主成分分析 vs t-SNE vs UMAP vs LDA
作者图片
速度比较
注意:上表是考虑到 Kaggle 上使用 GPU 的内核的计算时间而构建的。
- PCA 不能很好地区分这些信号。PCA 的主要缺点是受数据中异常值的影响很大。PCA 是一种线性投影**,这意味着它不能捕捉非线性依赖关系,它的目标是找到使数据集中的方差最大化的方向(所谓的主成分)。**
- 与 PCA 相比,t-SNE 在可视化集群的不同模式方面做得更好(它试图保持拓扑邻域结构)。相似的标签被聚集在一起,即使有大量的数据点在彼此之上,当然也不足以期望聚类算法表现良好。
- UMAP 的表现优于 t-SNE 和 PCA ,如果我们观察 2d 和 3d 图,我们可以看到被很好分离的迷你星团。这对于可视化集群或组数据点及其相对接近度非常有效。然而,对于这个用例来说,肯定没有好到期望一个聚类算法来区分模式。 UMAP 比 t-SNE 快得多,后者面临的另一个问题是需要另一种降维方法优先,否则计算时间会更长。**
- 最后, LDA 在各方面都超过了之前所有的技术。出色的计算时间(第二快)以及证明我们所期望的分离良好的集群。
注意:LDA 比其他技术表现得更好并不奇怪,这正是我们所期望的。与 LDA 不同,PCA、TSNE 和 UMAP 是在不知道真实类别标签的情况下执行的。
总结
我们探索了四种用于数据可视化的降维技术:(PCA、t-SNE、UMAP、LDA)并尝试使用它们在 2d 和 3d 图中可视化高维数据集。
注意:很容易陷入认为一种技术比另一种技术更好的陷阱,最终没有办法将高维数据映射到低维,同时保留整个结构,总有一种技术与另一种技术相比的质量权衡。
再次感谢到达这里,希望这是一个信息丰富的职位!值得你花时间。还有许多其他变体和其他用例,我强烈鼓励您探索这一令人惊叹且发展良好的科学领域。
参考
[1]麦金尼斯和希利(2018 年)。UMAP:一致流形逼近和降维投影。ArXiv 电子印花。
[2]范德马滕,l . j . p . t-分布式随机邻居嵌入
t 分布随机近邻嵌入(t-SNE)是一种降维技术,特别适用于
lvd maten . github . io](https://lvdmaaten.github.io/tsne/)
[3]Kaggle.com. 2020。与 T-SNE 一起观想卡纳达语 MNIST。可在:https://www . ka ggle . com/parulpandey/visualizing-kannada-Mn ist-with-t-SNE获取
[4]通过 Scikit-Learn、Keras & Tensorflow 实践机器学习,作者 Aurelien Geron
[5]https://sebastianraschka.com/Articles/2014_python_lda.html**
降维取证
入门
何时应用哪种降维技术
照片由 Pixabay 上的路缘石拍摄,编辑为 me 😄
介绍
在我上一篇关于 Gap-Statistics 的博文中,我解释了大多数时候数据都有很多特征(数百个甚至有时数千个)。我们认为具有 100 个特征的数据集是 100 维的。所以每个特征代表数据集的一个维度。对于可视化数据来说,这是相当多的维度。我们不能只保留三个特征,不是吗?当然不是!一个例外是,100 个特征中有 98 个高度相关(通过热图找出),所以我们省略了 97 个,只取其中的一个。然后我们会得到一个三维数据集。
但这种可能性极小!
因此,我将介绍两个在处理数据时需要了解的重要主题:
- 1)维度的诅咒——更深入的解释
- 2)降维取证
1)维度的诅咒
直观但重要的是要知道,所有模式分析或数据探索任务的复杂性随着维度的增加而增加。
我们称这种复杂性的增加为维度的诅咒。通常一些特征是完全无用的或者高度相关的。因此,可以应用降维技术来去除尽可能多的维度。我们真的想处理尽可能低维度的数据。
在处理高维数据时,我们可以推断出三个问题:
第一期:
如何绘制三维以上的数据?
是的,我们甚至可以在 4D 或 5D 的空间里进行策划,但是升级很快。
从技术上讲,有一些方法可以做到这一点。例如,我们可以改变数据点的大小来可视化第四维,或者我们可以额外引入一些颜色作为第五维。但是你可以看到升级的速度有多快,我们作为人类再也不能从 5D 的情节中读到任何有价值的东西了。所以这基本上是没用的,因为主要的一点是我们想从这些可视化中获取信息。
第二个问题:
特征空间的细分随着维度的增加呈指数上升。
图 1)特征空间
在上图最右边的图中,我们看到,在三维空间中,我们已经有 27 个大小相等的细胞。对于 15 个特征(=15 个维度),我们最终将在特征空间中拥有 1500 万个大小相等的细胞(3^15)。随机森林需要大量的参数来适应这个高维特征空间。如果你知道随机森林是如何工作的,那么你就知道它将特征空间分割成不同的分类区域,如果它是随机森林分类器而不是随机森林回归器的话。但是其他分类方法也需要不可行的更多参数来适应这样的高维空间。
第三期:
这可能是最重要的,但也是最令人惊讶的问题:
维度越高,位于特征空间最外边界的数据点越多。
图 2)边界行为|来自 HTF 第 2.5 节
从上面的图 2 中我们可以看到计算的公式,其中数据位于特征空间中。 D 是尺寸的数量,而 ε 表示边界壳的极限。如果选择 ε 为 0.01,表示有多少个数据点位于特征空间的外侧 1% 。ε = 0.75 意味着有多少数据点位于特征空间的外部 75% 。上面的绿色圆圈代表特征空间,其中 ε 表示它总是从边缘开始向圆圈的中心移动。
因此,回到图 1 我们可以看到,对于 200 的维度,我们有 86% 的数据点位于特征空间的外层 1% 。而在 3D 空间中,3%的数据位于 1%的外壳上。
这太疯狂了,不是吗?
特征空间的稀疏性随着维度的增加而显著增加。我们将需要大量的新数据样本来维持特征空间的恒定密度。但是,除非你使用一些非常奇特的生成模型,如甘的模型,否则你无法轻松地生成新的数据样本。
2)降维取证
在这一节中,我们将介绍四种降维技术。我对它们中的每一个都进行了简要的概述,但是仅仅是为了理解如何执行取证。不是每种维度技术都适合每种数据分布。在选择四种方法中的一种时需要非常小心,因为如果你选择了错误的技术,你会惊讶地发现它并没有像预期的那样起作用。我们需要区分全局和局部降维技术。这是我们将要介绍的四种技术:
-
- PCA(全球)
-
- MDS(全球)
-
- ISOMAP(本地)
- 4)拉普拉斯特征映射(局部)
有更多的方法,但让我们把重点放在我认为基本上是主要的方法上。最先进的 t-SNE 没有包括在内,因为它会打破这个帖子的限制。
主成分分析
当您不知道需要使用哪种技术时,主成分分析(PCA)总是首选。对于许多数据科学家来说,这是一项繁重的工作,它通常会产生正确的结果,但也有失败的情况。我提到过 PCA 是一种全球性的技术。这意味着 PCA 仅通过矩阵乘法计算,然后将数据投影到新的轴上。
重要提示:投影的每一个轴都是相互正交的。因此,您可以将图 1 中的基本笛卡尔坐标系想象为投影轴。
基本步骤是:
- 将数据标准化为平均值 0(第 5 行)
- 对数据的协方差矩阵执行特征分解(第 9 行)
- 按照特征值的大小降序排列特征向量(第 11–15 行)
- 选择最大特征值的个数,将数据投影到特征向量上,将其作为新的轴。(第 19–21 行)
这四个步骤没什么特别的。它实际上只是几行 Python 代码:
92.46+0.00j% explained variance in vector 0
5.30+0.00j% explained variance in vector 1
1.72+0.00j% explained variance in vector 2
0.52+0.00j% explained variance in vector 3
你可以看到全局降维技术有另一个非常有用的特点,这是局部技术所没有的。全局方法揭示了在应用降维之后数据保留了多少差异。虹膜数据集是一个众所周知的尝试降维的数据集。它有四个维度,但只保留一个维度仍然保持数据总方差的 92.46% (从上面的灰色输出框“92.46+0.00j”->可以看出,这是一个复数表示)。这意味着 92.46%的信息仍然只保存在一个维度内。
图 3)我制作的 PCA 示例
左图显示了 PCA 的另一个例子。请注意每个红色数据点是如何投影到新的蓝色轴上的。这将保留红点所有位置信息的 96.62%。
图 4)我制作的 1D 主成分分析投影示例
我使用了具有两个不同聚类的数据集。在减少了从 2D 到 1D 的维度后,即使将它们投射到蓝色箭头上,星团之间仍然保持着距离。
结论:我们只能用 PCA 将数据线性投影到特征向量轴上。请记住这一点。你能想象 2D 数据分布很难线性映射并保留大部分信息吗?
2) MDS
经典的多维标度(MDS)将更简单,因为它非常类似于 PCA。MDS 和 PCA 之间的唯一区别是,MDS 将点之间的距离作为输入。如果欧几里德距离范数用于 MDS,它的行为 100%类似于 PCA 。因此,MDS 也能够测量保留了多少差异。保存的公式是:
图 5)方差的最大保存
请注意,d’(d 撇)是缩减的维度(例如 1D),d 是初始维度(例如 3D)。d* (d 星)是最佳降维。我们可以将所有的目标维度方差相加,然后除以 100,因为它从 100%方差开始。
图 6)弯头方法
当你阅读我上一篇关于差距统计的博文时,你会注意到上面的这个数字是多么的相似。肘方法可用于可视化方差如何随着维度的减少而缩小。x 轴表示维度的减少。例如,在 x=2 时,初始维度减少了两个维度,我们仍然保留了大约 80%的总方差。最大的差距表明我们的最佳缩减结果可能是在**只缩减两个维度,**因为我们通过缩减三个维度的初始数据丢失了如此多的方差。
当对 MDS 使用不同的距离度量时
- 欧几里德距离
- 曼哈顿距离
- 汉明距离
- LogFC
很难知道最佳指标是什么。当您确定全局降维技术足以完成您的任务时,您可以尝试许多不同的距离度量,并绘制肘方法图,以查看哪种最小维度可以保持最大的差异。
**结论:**由于使用欧几里德距离时 MDS 与 PCA 相同,所以可以直接选择 MDS 而非 PCA。然后你很快就能使用不同的测试距离指标。
PCA 和 MDS 的线性取证
图 7)线性取证
让我们看看上面图 7 中的数据分布。它看起来像蜗牛的壳。无论我们如何将数据投射到绿色的主成分线(或 MDS 线)上,我们都永远不能保留太多的方差。上图的右部显示了数据如何理想地投影到绿线上。这并没有给我们带来任何进展。
这同样适用于非常高维度的空间。我们真的无法想象 100 维的特征空间会是什么样子,但同样的原理也适用。有些分布不能用线性降维技术来解释。
因此,当我们看到降维揭示了对潜在数据聚类的零洞察时,如上所述,我们可以肯定 PCA 或 MDS 不是正确的选择。
3) ISOMAP
先说局部降维。我会给你算法,然后我会解释它:
- 使用 K 最近邻算法(kNN)定义局部邻域。
- 用欧几里得距离计算所有点到另一个点的距离,以得到我们的图在所有点之间的边。
- 使用 Dijktra 算法计算所有点到另一个点的最短距离。
- 使用此最短距离矩阵作为 MDS 算法的距离度量。
啊,我们亲爱的 MDS。这么有用!kNN 需要一个固定的超参数,即 K 的数量。问题是,我们不能真正知道 K 的最佳值是多少。因此,由于 kNN 的半径变得太大,局部邻域可能包括并不真正属于它的点,因为存在太稀疏的数据点。应用 Dijkstras 的算法并使用这个距离矩阵作为 MDS 的输入很简单,但是困难在于这四个步骤中的第一步。
ISOMAP 的全球取证
图 8)全球取证第 1 部分
让我们考虑一下图 8 最左侧上方底部开放的蛋形数据分布。如果我们能沿着绿线投影数据,那将是最好的降维映射。数据分布的本地结构将被保留。紫色圆圈表示两个本地邻域的例子。
你可以这样想象:
图 9)全球取证第 2 部分
这是最理想的情况。如果数据分布看起来像这样,它将完全工作。但是我已经提到了 ISOMAP 的问题行为。如果你仔细观察图 8 最右边的图,你会发现有两个新的蓝色数据点。这些可能是由于样本噪声造成的。这导致投射到绿线上的致命变化。
结论:由于 kNN,ISOMAP 对噪声样本非常敏感。因为 kNN 对于每个局部邻域的半径是不同的,因为它想要例如在它的局部邻域中找到 5 个点,而不管这些点位于多远或多近。这就产生了问题,并成为图 8 中 A 点到 B 点的桥梁,尽管这些点应该相距很远。
4)拉普拉斯特征映射
我也将从编写 LE 的基本算法开始,然后我将解释它:
- 定义局部邻域,并根据所有数据点构建邻接图。
- 测量图中各边的权重
- 对该图进行特征分解(如 PCA)。
- 像 PCA 一样,通过选择最大特征值的数量来执行低维嵌入,并且相对于它们相应的特征向量来映射数据。
邻接图基本上只是表示图中所有邻域点位置的矩阵(亲和矩阵),但是在一个矩阵内。这个亲和矩阵看起来像这样(它是二进制的,但是它也可以用除了二进制热核之外的其他核来计算):
拉普拉斯特征映射的全局取证
图 10)全球取证第 3 部分
W 表示二元亲和矩阵。上面的 W 是没有噪声的数据分布,而下面的 W 包括一些绿色噪声样本点。你可以看到,嘈杂的点想要再次创建一个从 A 到 B 的桥梁,但亲和矩阵阻止了这种情况的发生,因为紫色的局部邻域键在对角线上太强了。噪声对拉普拉斯特征映射没有影响。优化的目的是使局部邻域尽可能靠近(因此邻域的距离尽可能小)。
因此,对于拉普拉斯特征映射会有最小化问题,但是对于 PCA、MDS 和 ISOMAP 会有最大化问题(这三个想要最大化数据的方差信息)。
结论:LE 本质上更适合执行这种流形学习(=学习低维嵌入),因为它对于噪声数据分布更鲁棒。正如我们所知,数据中经常存在噪声。在所有情况下,LE 都优于 ISOMAP。
进一步的调查
最后,让我们考虑一些测试示例:
图 11)进一步调查
- 在第一个图中,我们可以很容易地拟合一条线或一个邻居通过。
- 对于第二个地块来说,附近可能会有问题,因此 LE 是安全的选择。
- 第三个图也将保留足够的方差,即使在拟合直线时也是如此。ISOMAP 和 LE 也没有问题,因为没有样本噪声和容易的局部邻域
- 最后一个例子用绿色显示地面实况。当我们想从中取样时,有噪声的样本可能会使地面实况向不希望的方向移动。这就是为什么我们真的想使用 LE,因为 ISOMAP 可能会受到噪声的负面影响,从而产生错误的降维。
我希望你发现这篇文章内容丰富!如果你有问题,可以给我发邮件。你可以在我的网站上找到我的邮箱地址。
参考
[1] Trevor Hastie,Robert Tibshirani 和 Jerome Friedman,统计学习的要素:数据挖掘、推理和预测 (2009)
这篇博文基于从弗里德里希·亚历山大大学埃尔兰根-纽伦堡的课程模式分析中获得的知识。我使用了 Christian Riess 博士演讲的部分内容来说明这篇文章的例子。所以所有权利归克里斯汀·里斯博士所有。
数据挖掘中的降维
大数据是具有多级变量的大规模数据集,并且增长非常快。体量是大数据最重要的方面。随着数据处理和计算机科学领域最近的技术进步,最近大数据在记录数量和属性方面的爆炸式增长给数据挖掘和数据科学带来了一些挑战。大数据中极大规模的数据形成多维数据集。在大型数据集中有多个维度,这使得分析这些维度或在数据中寻找任何类型的模式的工作变得非常困难。高维数据可以从各种来源获得,这取决于人们对哪种过程感兴趣。自然界中的任何过程都是许多不同变量的结果,其中一些变量是可观察或可测量的,而另一些是不可观察或可测量的。当我们要准确地获得任何类型的模拟数据时,我们就要处理更高维度的数据。
克林特·王茂林在 Unsplash 上拍摄的照片
降维是减少所考虑的随机变量或属性数量的过程。作为数据预处理步骤的一部分,高维数据约简在许多现实应用中是极其重要的。高维降维已经成为数据挖掘应用中的重要任务之一。例如,您可能有一个包含数百个要素(数据库中的列)的数据集。那么,降维就是通过组合或合并来减少数据属性的特征,这样就不会丢失原始数据集的许多重要特征。高维数据的一个主要问题是众所周知的“维数灾难”。如果我们想使用数据进行分析,这就促使我们降低数据的维度。
维度的诅咒
维数灾难指的是当对进行分类、组织和分析高维数据时出现的现象,这种现象在低维空间中不会出现,具体来说就是数据稀疏性和数据的“紧密性”问题。
获得的空间与总空间之间的差异(1/3、1/9、1/27)
上面的图表序列显示了当基础维度增加时数据的紧密性问题。随着上面看到的数据空间从一维移动到二维并最终移动到三维,给定的数据填充的数据空间越来越少。为了保持空间的精确表示所需的数据量随着维度成指数增长。
数据稀疏导致相似性降低
当维数增加时,随着稀疏度的增加,两个独立点之间的距离增加。这导致数据点之间的相似性降低,这将导致大多数机器学习和数据挖掘中使用的其他技术出现更多错误。为了进行补偿,我们将不得不输入大量的数据点,但是如果维数更高,这实际上是不可能的,即使有可能,效率也会很低。
为了克服上述高维数据带来的挑战,需要降低计划分析和可视化的数据的维度。
降维技术
基于特征选择或特征提取完成维度缩减。特征选择基于从可用测量中省略那些对类别可分性没有贡献的特征。换句话说,冗余和不相关的特征被忽略。另一方面,特征提取考虑整个信息内容,并将有用的信息内容映射到较低维度的特征空间。
人们可以将用于降维的技术区分为线性技术和非线性技术。但是这里将基于特征选择和特征提取的观点来描述这些技术。
特征选择技术
特征选择过程
作为一项独立的任务,特征选择可以是无监督的(例如方差阈值)或有监督的(例如遗传算法)。如果需要,还可以结合使用多种方法。
1)方差阈值
这种技术寻找给定特征的从一个观察到另一个观察的变化,然后如果根据给定的阈值,在每个观察中的变化没有不同,则导致该观察的特征被移除。变化不大的功能并没有增加多少有效信息。在建模过程开始时,使用方差阈值是一种简单且相对安全的降维方法。但是,如果您想要减少维度,这本身是不够的,因为它非常主观,您需要手动调整方差阈值。这种特性选择可以使用 Python 和 r 来实现。
2)相关阈值
这里考虑这些特征,并检查这些特征是否彼此紧密相关。如果是这样的话,那么这两个特性对最终输出的总体影响甚至与我们使用其中一个特性时得到的结果相似。你应该删除哪一个?你首先要计算所有的成对相关。然后,如果一对要素之间的相关性高于给定的阈值,您将移除与其他要素具有较大平均绝对相关性的要素。像前面的技术一样,这也是基于直觉,因此以不忽略有用信息的方式调整阈值的负担将落在用户身上。由于这些原因,具有内置特征选择的算法或像 PCA 这样的算法比这种算法更受欢迎。
3)遗传算法
它们是受进化生物学和自然选择启发的搜索算法,结合变异和交叉来有效地遍历大型解决方案空间。遗传算法用于寻找最佳二进制向量,其中每个比特与一个特征相关联。如果该向量的比特等于 1,则该特征被允许参与分类。如果该位为 0,则相应的特征不参与。在特征选择中,“基因”代表个体特征,“有机体”代表一组候选特征。“群体”中的每一种生物都根据适合度评分进行分级,例如在坚持组中的模型表现。最适合的生物生存并繁殖,如此重复,直到几代后种群收敛于一个解。在这里你可以对遗传算法有进一步的了解。
**[Start]** Generate random population of *n* chromosomes (suitable solutions for the problem)**[Fitness]** Evaluate the fitness *f(x)* of each chromosome *x* in the population**[New population]** Create a new population by repeating following steps until the new population is complete : **[Selection]** Select two parent chromosomes from a population according to their fitness (the better fitness, the bigger chance to be selected) **[Crossover]** With a crossover probability cross over the parents to form a new offspring (children). If no crossover was performed, offspring is an exact copy of parents. **[Mutation]** With a mutation probability mutate new offspring at each locus (position in chromosome). **[Accepting]** Place new offspring in a new population**[Replace]** Use new generated population for a further run of algorithm**[Test]** If the end condition is satisfied, **stop**, and return the best solution in current population**[Loop]** Go to step **2 [Fitness]**
这可以有效地从非常高维的数据集中选择特征,而穷举搜索是不可行的。但在大多数情况下,人们可能会认为这不值得争论,这取决于上下文,因为使用 PCA 或内置选择会简单得多。
4)逐步回归
在统计学中,逐步回归是一种拟合回归模型的方法,其中预测变量的选择是通过自动程序进行的。在每一步中,基于一些预先指定的标准,考虑将一个变量添加到解释变量集或从解释变量集中减去。通常,这采取一系列F-测试或t-测试的形式,但是其他技术也是可能的,例如调整的 R 2 、阿凯克信息准则、贝叶斯信息准则、马洛斯的 Cp 、按下或这里可以更好的理解逐步回归。
这有两种味道:向前和向后。对于向前逐步搜索,您开始时没有任何功能。然后,您将使用每个候选特征训练一个单特征模型,并保留具有最佳性能的版本。您将继续添加特性,一次添加一个,直到您的性能改进停止。向后逐步搜索是相同的过程,只是顺序相反:从模型中的所有特征开始,然后一次删除一个特征,直到性能开始显著下降。
这是一种贪婪算法,并且通常比诸如正则化等监督方法具有更低的性能。
特征提取技术
特征提取过程
特征提取是为了创建一个新的、更小的特征集,该特征集仍然捕获大部分有用的信息。这可以是有监督的(例如 LDA)和无监督的(例如 PCA)方法。
1)线性判别分析(LDA)
LDA 使用来自多个要素的信息创建一个新的轴,并将数据投影到新的轴上,以便最小化方差并最大化类平均值之间的距离。LDA 是一种监督方法,只能用于标记数据。它包含为每个类计算的数据的统计属性。对于单个输入变量(x ),这是每类变量的平均值和方差。对于多个变量,这是在多元高斯上计算的相同属性,即均值和协方差矩阵。LDA 变换也依赖于比例,因此您应该首先归一化您的数据集。
LDA 是有监督的,所以需要有标签的数据。它提供了各种变化(如二次 LDA)来解决特定的障碍。但是正在创造的新特征很难用 LDA 来解释。
2)主成分分析
PCA 是一种降维方法,它可以识别我们数据中的重要关系,根据这些关系转换现有数据,然后量化这些关系的重要性,以便我们可以保留最重要的关系。为了记住这个定义,我们可以把它分成四个步骤:
- 我们通过一个协方差矩阵 来识别特征之间的关系。
- 通过协方差矩阵的线性变换或特征分解,得到特征向量和特征值。
- 然后,我们使用特征向量将数据转换成主分量。
- 最后,我们使用特征值量化这些关系的重要性,并保留重要的主成分**。**
PCA 创建的新特征是正交的,这意味着它们是不相关的。此外,它们按照“解释方差”的顺序排列第一个主成分(PC1)解释了数据集中最大的方差,PC2 解释了第二大方差,依此类推。您可以通过根据累计解释方差限制要保留的主成分数量来降低维度。PCA 变换也依赖于比例,因此您应该首先归一化您的数据集。PCA 是寻找给定特征之间的线性相关性。这意味着,只有当数据集中有一些线性相关的变量时,这才会有所帮助。
主成分分析
3) t 分布随机邻居嵌入(t-SNE)
t-SNE 是一种非线性降维技术,通常用于可视化高维数据集。t-SNE 的一些主要应用是自然语言处理(NLP)、语音处理等。
t-SNE 通过最小化由原始高维空间中的输入特征的成对概率相似性构成的分布与其在缩减的低维空间中的等价物之间的差异来工作。t-SNE 然后利用 Kullback-Leiber (KL)散度来测量两种不同分布的不相似性。然后使用梯度下降最小化 KL 散度。
这里,低维空间使用 t 分布建模,而高维空间使用高斯分布建模。
4)自动编码器
自动编码器是一系列机器学习算法,可用作降维技术。自动编码器也使用非线性变换将数据从高维投影到低维。自动编码器是被训练来重建其原始输入的神经网络。基本上,自动编码器由两部分组成。
- 编码器:获取输入数据并进行压缩,以去除所有可能的噪音和无用信息。编码器级的输出通常被称为瓶颈或潜在空间。
- 解码器:将编码后的潜在空间作为输入,并尝试使用其压缩形式(编码后的潜在空间)再现原始自动编码器输入。
自动编码器的结构
在上图中,中间层代表数量较少的神经元中的大量输入特征,因此给出了密集且较小的输入表示。由于这是一种基于神经网络的特征提取解决方案,因此可能需要大量数据进行训练。
我希望你喜欢这篇文章,谢谢你的阅读!
利用 Python 实现高光谱图像的降维
初学者指南
高光谱图像的降维技术。
美国地质勘探局在 Unsplash 上拍摄的照片
本文详细介绍了高光谱图像降维技术的实现。
目录
- 高光谱图像简介
- 什么是降维?
- 降维需求
- HSI 上的降维
- 参考文献
超光谱图像(HSI)介绍
高光谱图像(HSI)提供了广泛的光谱信息,可用于解决各种问题,如作物分析、地质制图、矿产勘探等。由于数据中存在大量的波段,降维已经成为机器学习的一个重要方面。它通常被认为是解决分类和聚类等机器学习问题的预处理步骤。一般来说,任何分类和聚类算法的准确性都会受到维度或特征数量的影响。
降维技术用于减少数据集的维数,从而为分类器以低计算成本生成综合模型铺平了道路。因此,降维在提高高光谱图像像素分类精度方面变得越来越重要。
要更好地了解 HSI,请阅读下面题为“超光谱图像分析—入门”的文章。
使用 Python 进行高光谱图像分析的演练。
towardsdatascience.com](/hyperspectral-image-analysis-getting-started-74758c12f2e9)
什么是降维?
降维是减少数据集的维度或特征的过程。可以使用两种方法来减少数据集的维度。它们是:
- 功能选择
- 特征提取
特征选择是选择数据集特征维度的过程,该数据集为机器学习任务(如分类、聚类等)提供模式。这可以通过使用不同的方法来实现,如相关性分析、单变量分析等
特征提取特征提取是通过选择和/或组合现有特征来创建缩减的特征空间,同时仍然准确和完整地描述数据集而不丢失信息,从而发现新特征的过程。
基于准则函数和收敛过程,降维技术也分为凸和非凸两类。一些流行的降维技术包括 PCA、ICA、LDA、GDA、核 PCA、Isomap、局部线性嵌入(LLE)、Hessian LLE 等。
我们将使用主成分分析(PCA)来降低 HSI 的维度。
主成分分析
PCA 是一种线性无监督降维技术,可以描述为数据协方差矩阵的特征分解。它通过创建方差最大化的不相关要素来减少信息损失,从而提高可解释性。
为了理解主成分分析(PCA)背后的数学原理,请使用下面的教程:
斯坦福大学为“机器学习”课程制作的视频。在本模块中,我们将介绍主要…
www.coursera.org](https://www.coursera.org/lecture/machine-learning/principal-component-analysis-algorithm-ZYIPa)
需要降维
维数灾难指的是在高维空间中分类、分析数据时出现的现象,这种现象在低维空间中不会出现。随着维数或特征在最佳点之后增加,分类性能逐渐降低。
降维技术用于减少数据集的维数,从而为分类器以降低的计算成本生成综合模型铺平了道路。
HSI 上的降维
帕维亚大学数据集用于说明目的。在意大利北部帕维亚上空的一次飞行活动中,安明传感器拍摄到的 HSI 场景。光谱波段的数量为 103 个*,HSI 的大小为610340 像素,地物包含 9 个类。图像中的一些像素不包含信息,并且在分析之前必须被丢弃。
读取 HSI 数据
使用下面的代码从 SciPy 中的’ load_mat '函数读取帕维亚大学 HSI 的数据。
可视化数据
让我们来看看帕维亚大学高光谱影像的地面真相。
帕维亚大学 HSI 的基本事实—作者图片
让我们看看帕维亚大学 HSI 的几个乐队,这些乐队是随机挑选的。
Pavia 大学 HSI 样本带的可视化——图片由作者提供
主成分分析
让我们降低帕维亚大学 HSI 的维度。首先,我们要降多少维?。
使用解释的方差比图,我们可以选择要减少的最佳维数。图表的 x 轴代表主成分的数量,y 轴代表累计解释方差。*我们可以选择具有> 95%累积解释方差的成分数量。*在这种情况下,我们选择了 8 个主成分,也就是说,我们正在将帕维亚大学数据的维度减少到 8 个维度。
累积解释方差和组件数量之间的图表-按作者分类的图片
现在,我们知道应该减少多少个恒指数据维度。对 HSI 数据应用主成分分析(PCA)。下面的代码可以满足这个目的。
在减少数据的维度之后,为了将来的目的,添加类别标签。以下代码用于显示降维后的波段。
我们来看看帕维亚大学 HSI 用 PCA 降维后的八个波段。
应用主成分分析后条带的可视化—作者提供的图像
我编写的在 HSI 上执行 PCA 的整个代码被保存为一个 Colab 笔记本。请随意使用。
基于主成分分析的高光谱图像降维。
colab.research.google.com](https://colab.research.google.com/drive/1Lstx55MxHT8bpXlgnaXYloVCmagE_xC7?usp=sharing)
参考
编辑描述
link.springer.com](https://link.springer.com/chapter/10.1007%2F0-306-47815-3_5) [## sk learn . decomposition . PCA-sci kit-learn 0 . 23 . 1 文档
主成分分析。使用数据的奇异值分解进行线性降维…
scikit-learn.org](https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html)
降维:PCA 与自动编码器
主成分分析和自动编码器降维的比较
降维是一种减少特征空间的技术,以获得稳定且统计上合理的机器学习模型,避免维数灾难。降维主要有两种方法:特征选择和特征变换。
特征选择方法试图对重要特征进行子集划分,并移除共线或不太重要的特征。你可以在这里读到更多。
特征转换也称为特征提取,试图将高维数据投影到较低的维度。一些特征变换技术有 PCA ,矩阵分解,自动编码器, t-Sne , UMAP 等。
通过这篇博文,我打算深入研究 PCA 和自动编码器。我们将看到这两种技术的优点和缺点,并通过一个有趣的例子来清楚地理解它。该解决方案的完整源代码可以在这里找到。
你也可以在 Youtube 上找到我关于同一主题的视频。
我在 Youtube 上的同主题视频
主成分分析
主成分分析是一种无监督技术,将原始数据向高方差方向投影。这些高方差方向彼此正交,导致投影数据中的相关性非常低或几乎接近 0。这些功能转换是线性的,其方法是:
第一步: 计算 n 维组成的相关矩阵数据。相关矩阵的形状为 n*n。
第二步: 计算这个矩阵的特征向量和特征值。
第三步: 取特征值最高的前 k 个特征向量。
第四步: 将原始数据集投影到这 k 个特征向量中,得到 k 维,其中 k ≤ n。
自动编码器
Autoencoder 是一个无监督的人工神经网络,它将数据压缩到较低的维度,然后将输入重构回来。Autoencoder 通过更多地关注重要特征来消除噪声和冗余,从而在较低的维度中找到数据的表示。它基于编码器-解码器架构,其中编码器将高维数据编码为低维数据,解码器获取低维数据并尝试重建原始高维数据。
基本自动编码器的模式:维基百科
深度自动编码器的模式:维基百科
在上图中,X 是输入数据,z 是输入 X 的低维表示,X '是重构的输入数据。根据对激活功能的选择,较高维度到较低维度的映射可以是线性的或非线性的。
比较:PCA 与自动编码器
- PCA 是数据的线性变换,而 AE 可以是线性的或非线性的,这取决于激活函数的选择。
- PCA 非常快,因为存在可以快速计算它的算法,而 AE 通过梯度下降训练,并且相对较慢。
- PCA 将数据投影到彼此正交的维度中,导致投影数据中的相关性非常低或接近零。PCA 得到正交子空间,因为特征向量(数据投影到其上)来自应用于协方差矩阵(对称半正定)的特征分解,并且在这种情况下,特征分解产生正交特征向量。AE 转换数据不能保证这一点,因为它的训练方式仅仅是为了最小化重建损失。
- PCA 是输入空间到最大变化方向的简单线性变换,而 AE 是更复杂的技术,可以模拟相对复杂的关系和非线性。
- 一个经验法则可能是数据的大小。对于小数据集使用 PCA,对于相对较大的数据集使用 AE。
- PCA 超参数是“k ”,即投影数据的正交维数,而对于 AE,它是神经网络的架构。
- 具有单层和线性激活的 AE 具有与 PCA 相似的性能。称为深度自动编码器的具有多层和非激活功能的 AE 易于过拟合,并且可以通过规范化和仔细设计来控制。请参考下面两篇博客来了解更多。
在本教程中,我们将回答一些关于自动编码器的常见问题,我们将涵盖代码的例子…
blog.keras.io](https://blog.keras.io/building-autoencoders-in-keras.html) [## 不同类型的自动编码器
阅读时间:30 分钟自动编码器是一种人工神经网络,用于学习有效的数据编码
iq.opengenus.org](https://iq.opengenus.org/types-of-autoencoder/)
图像数据示例:了解 PCA 和自动编码器
让我们以下图为例,用这两种方法进行降维。
这幅图像的尺寸是 360 * 460。从另一个角度来看,它是一个包含 360 个数据点和 460 个特征/维度的数据集。
我们将尝试将维数从 460 减少到 10%,即 46 维,首先使用 PCA,然后使用 AE。再来看看重构和其他属性的区别。
使用主成分分析进行降维
pct_reduction = 0.10
reduced_pixel = int( pct_reduction* original_dimensions[1])#Applying PCA
pca = PCA(n_components=reduced_pixel)
pca.fit(image_matrix)#Transforming the input matrix
X_transformed = pca.transform(image_matrix)
print("Original Input dimesnions {}".format(original_dimensions))
print("New Reduced dimensions {}".format(X_transformed.shape))
输出
Original Input dimesnions (360, 460)
New Reduced dimensions (360, 46)
让我们检查来自 PCA 的新变换特征的相关性。
df_pca = pd.DataFrame(data = X_transformed,columns=list(range(X_transformed.shape[1])))figure = plt.figure(figsize=(10,6))
corrMatrix = df_pca.corr()
sns.heatmap(corrMatrix, annot=False)
plt.show()
变换特征的相关矩阵:PCA
相关矩阵显示新的变换特征彼此不相关,相关度为 0。原因是在 PCA 中将数据投影到正交维度中。
接下来,我们将尝试仅通过来自我们可用的缩减特征空间的信息来重建原始数据。
reconstructed_matrix = pca.inverse_transform(X_transformed)
reconstructed_image_pca = Image.fromarray(np.uint8(reconstructed_matrix))
plt.figure(figsize=(8,12))
plt.imshow(reconstructed_image_pca,cmap = plt.cm.gray)
重建图像:主成分分析
计算重建图像的 RMSE
def my_rmse(np_arr1,np_arr2):
dim = np_arr1.shape
tot_loss = 0
for i in range(dim[0]):
for j in range(dim[1]):
tot_loss += math.pow((np_arr1[i,j] - np_arr2[i,j]),2)
return round(math.sqrt(tot_loss/(dim[0]* dim[1]*1.0)),2)error_pca = my_rmse(image_matrix,reconstructed_matrix)
RMSE 是 11.84(越低越好)。
如果原始图像和重建图像之间没有差异,RMSE 将为 0。如果使用大约 120 个来自 PCA 的维度,则 RMSE 接近于 0。
使用具有线性激活的单层自动编码器进行降维
# Standarise the Data
X_org = image_matrix.copy()
sc = StandardScaler()
X = sc.fit_transform(X_org)# this is the size of our encoded representations
encoding_dim = reduced_pixel # this is our input placeholder
input_img = Input(shape=(img.width,))# "encoded" is the encoded representation of the input
encoded = Dense(encoding_dim, activation='linear')(input_img)# "decoded" is the lossy reconstruction of the input
decoded = Dense(img.width, activation=None)(encoded)# this model maps an input to its reconstruction
autoencoder = Model(input_img, decoded)#Encoder
encoder = Model(input_img, encoded)# create a placeholder for an encoded (32-dimensional) input
encoded_input = Input(shape=(encoding_dim,))# retrieve the last layer of the autoencoder model
decoder_layer = autoencoder.layers[-1]# create the decoder model
decoder = Model(encoded_input, decoder_layer(encoded_input))autoencoder.compile(optimizer='adadelta', loss='mean_squared_error')autoencoder.fit(X, X,
epochs=500,
batch_size=16,
shuffle=True)encoded_imgs = encoder.predict(X)
decoded_imgs = decoder.predict(encoded_imgs)
模型架构/摘要
让我们检查从 AE 出来的新变换特征的相关性。
df_ae = pd.DataFrame(data = encoded_imgs,columns=list(range(encoded_imgs.shape[1])))
figure = plt.figure(figsize=(10,6))
corrMatrix = df_ae.corr()
sns.heatmap(corrMatrix, annot=False)
plt.show()
变换特征的相关矩阵:AE
相关矩阵显示新的变换特征在某种程度上是相关的。皮尔逊相关因子偏离 0 很多。AE 训练的原因仅仅是为了最小化重建损失。
接下来,我们将尝试仅通过我们可用的缩减的特征空间来重建回原始数据。
X_decoded_ae = sc.inverse_transform(decoded_imgs)reconstructed_image_ae = Image.fromarray(np.uint8(X_decoded_ae))
plt.figure(figsize=(8,12))
plt.imshow(reconstructed_image_ae,cmap = plt.cm.gray)
重建图像:声发射
计算重建图像的 RMSE 。
error_ae = my_rmse(image_matrix,X_decoded_ae)
RMSE 是 12.15。接近 PCA 的 RMSE 11.84。具有单层和线性激活的自动编码器的性能类似于 PCA。
使用具有非线性激活的三层自动编码器进行降维
input_img = Input(shape=(img.width,))
encoded1 = Dense(128, activation='relu')(input_img)
encoded2 = Dense(reduced_pixel, activation='relu')(encoded1)
decoded1 = Dense(128, activation='relu')(encoded2)
decoded2 = Dense(img.width, activation=None)(decoded1)autoencoder = Model(input_img, decoded2)
autoencoder.compile(optimizer='adadelta', loss='mean_squared_error')autoencoder.fit(X,X,
epochs=500,
batch_size=16,
shuffle=True)
# Encoder
encoder = Model(input_img, encoded2)
# Decoder
decoder = Model(input_img, decoded2)encoded_imgs = encoder.predict(X)
decoded_imgs = decoder.predict(X)
模型架构/摘要
接下来,我们将尝试仅通过我们可用的缩减的特征空间来重建回原始数据。
X_decoded_deep_ae = sc.inverse_transform(decoded_imgs)reconstructed_image_deep_ae = Image.fromarray(np.uint8(X_decoded_deep_ae))
plt.figure(figsize=(8,12))
plt.imshow(reconstructed_image_deep_ae,cmap = plt.cm.gray)
计算重建图像的 RMSE 。
error_dae = my_rmse(image_matrix,X_decoded_deep_ae)
RMSE 是 8.57。相对于 PCA 的增益是 28 %,同时减少了相同数量的维数。
具有非线性激活的额外层的 Autoencoder 能够更好地捕捉图像中的非线性。与 PCA 相比,它能够更好地捕捉复杂的模式以及像素值的突然变化。尽管它伴随着相对较高的培训时间和资源的成本。
结论
通过这篇博文,我们深入研究了 PCA 和自动编码器。我们也看到了这两种技术的优缺点。这些概念在图像数据集上进行了尝试,其中具有额外非线性激活层的自动编码器优于 PCA,尽管代价是更高的训练时间和资源。该解决方案的完整源代码可以在这里找到。
如果你有任何疑问,请联系我。我很想知道你是否面临过高维度的问题,以及你尝试了哪些方法来克服它。
我的 Youtube 频道更多内容:
嗨,伙计们,欢迎来到频道。该频道旨在涵盖各种主题,从机器学习,数据科学…
www.youtube.com](https://www.youtube.com/channel/UCg0PxC9ThQrbD9nM_FU1vWA)
关于作者-:
Abhishek Mungoli 是一位经验丰富的数据科学家,拥有 ML 领域的经验和计算机科学背景,跨越多个领域并具有解决问题的思维方式。擅长各种机器学习和零售业特有的优化问题。热衷于大规模实现机器学习模型,并通过博客、讲座、聚会和论文等方式分享知识。
我的动机总是把最困难的事情简化成最简单的版本。我喜欢解决问题、数据科学、产品开发和扩展解决方案。我喜欢在闲暇时间探索新的地方和健身。关注我的 中 、Linkedin或insta gram并查看我的以前的帖子。我欢迎反馈和建设性的批评。我的一些博客-****
- 体验遗传算法的威力
- 每个数据科学家都应该避免的 5 个错误
- 以简单&直观的方式分解时间序列
- GPU 计算如何在工作中拯救了我?
- 信息论& KL 分歧第一部分和第二部分
- 使用 Apache Spark 处理维基百科,创建热点数据集
- 一种基于半监督嵌入的模糊聚类
- 比较哪个机器学习模型表现更好
- 分析 Fitbit 数据,揭开疫情封锁期间身体模式变化的神秘面纱
- 神话与现实围绕关联
- 成为面向业务的数据科学家指南
在 MNIST 数据集上使用 t 分布随机邻居嵌入(t-SNE)进行降维
应用 PCA (n_components = 50)和 t-SNE 后 MNIST 数据的 2D 散点图
我们很容易将二维或三维数据可视化,但一旦超出三维,就很难看到高维数据是什么样子了。
今天,我们经常处于这样一种情况,我们需要在具有数千甚至数百万维的数据集上分析和发现模式,这使得可视化有点挑战性。然而,一个绝对可以帮助我们更好地理解数据的工具是降维。
在这篇文章中,我将讨论 t-SNE,一种流行的非线性降维技术,以及如何使用 sklearn 在 Python 中实现它。我在这里选择的数据集是流行的 MNIST 数据集。
古玩目录
- 什么是 t-SNE,它是如何工作的?
- t-SNE 与 PCA 有何不同?
- 我们如何改进 t-SNE?
- 有哪些局限性?
- 接下来我们能做什么?
概观
t-分布式随机邻居嵌入,或 t-SNE,是一种机器学习算法,通常用于在低维空间嵌入高维数据[1]。
简单来说,SNE 霸王龙的方法可以分为两步。第一步是通过构建概率分布 P 来表示高维数据,其中相似点被选取的概率高,而不同点被选取的概率低。第二步是用另一个概率分布 Q 创建一个低维空间,它尽可能地保持 P 的性质。
在步骤 1 中,我们使用条件概率 p 来计算两个数据点之间的相似性。例如,给定 I 的 j 的条件概率表示 x_j 将被 x_i 挑选为其邻居,假设在以x _ I【1】为中心的高斯分布下,邻居与其概率密度成比例地被挑选。在步骤 2 中,我们让 y_i 和 y_j 分别是 x_i 和 *x_j,*的低维对应物。然后,我们认为 q 是被 y_i 挑选的 y_j 的类似条件概率,并且我们在低维图中采用了学生 t 分布。通过最小化来自 q 的概率分布 P 的kull back–lei bler 散度 来确定低维数据点的位置
关于 t-SNE 的更多技术细节,请查看本文。
我选择了 Kaggle ( link )的 MNIST 数据集作为这里的例子,因为它是一个简单的计算机视觉数据集,包含手写数字(0–9)的 28x28 像素图像。我们可以把每个实例想象成一个嵌入 784 维空间的数据点。
要查看完整的 Python 代码,请查看我的 Kaggle 内核。
事不宜迟,让我们进入细节!
探测
请注意,在最初的 Kaggle 竞赛中,目标是使用具有真实标签的训练图像来建立 ML 模型,该模型可以准确预测测试集上的标签。出于我们的目的,我们将只使用训练集。
像往常一样,我们首先检查它的形状:
train.shape
--------------------------------------------------------------------
(42000, 785)
有 42K 个训练实例。785 列是 784 像素值,以及“标签”列。
我们还可以检查标签分布:
label = train["label"]
label.value_counts()
--------------------------------------------------------------------
1 4684
7 4401
3 4351
9 4188
2 4177
6 4137
0 4132
4 4072
8 4063
5 3795
Name: label, dtype: int64
主成分分析
在实现 t-SNE 之前,我们先来试试 PCA,这是一种流行的线性降维方法。
标准化数据后,我们可以使用 PCA 转换数据(将“n_components”指定为 2):
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCAtrain = StandardScaler().fit_transform(train)
pca = PCA(n_components=2)
pca_res = pca.fit_transform(train)
让我们制作一个散点图来直观显示结果:
sns.scatterplot(x = pca_res[:,0], y = pca_res[:,1], hue = label, palette = sns.hls_palette(10), legend = 'full');
应用主成分分析后 MNIST 数据的 2D 散点图
如散点图所示,含有两种成分的五氯苯甲醚不足以提供关于不同标签的有意义的见解和模式。我们知道 PCA 的一个缺点是线性投影不能捕捉非线性相关性。现在让我们试试 SNE 霸王龙。
T-SNE 与sk learn
我们将使用 sklearn.manifold ( 文档)实现 t-SNE:
from sklearn.manifold import TSNEtsne = TSNE(n_components = 2, random_state=0)
tsne_res = tsne.fit_transform(train)
sns.scatterplot(x = tsne_res[:,0], y = tsne_res[:,1], hue = label, palette = sns.hls_palette(10), legend = 'full');
应用 t-SNE 后 MNIST 数据的 2D 散点图
现在我们可以看到,与主成分分析的结果相比,不同的聚类更加可分。以下是对该图的一些观察:
- 与“2”和“4”等其他聚类相比,“5”数据点似乎更加分散。
- 有几个“5”和“8”数据点类似于“3”
- 有两个“7”和“9”的集群,它们彼此相邻。
结合两者的方法
通常建议在应用 t-SNE 之前,使用 PCA 或 TruncatedSVD 将维数减少到合理的数量(例如 50)[2]。
这样做可以降低噪音水平并加快计算速度。
让我们先尝试主成分分析(50 个成分),然后应用 t-SNE。这是散点图:
应用 PCA(50 个成分)和 t-SNE 后 MNIST 数据的 2D 散点图
与之前的散点图相比,我们现在可以更好地分离出 10 个星团。以下是一些观察结果:
- 大多数“5”数据点不像以前那样分散,尽管有几个看起来仍然像“3”。
- 现在有一簇“7”和一簇“9”。
此外,这种方法的运行时间减少了 60%以上。
更多互动 3D 散点图,请查看这篇文章。
限制
以下是 SNE 霸王龙的一些局限性:
- 与主成分分析不同,t-SNE 的成本函数是非凸的,这意味着我们有可能陷入局部最小值。
- 类似于其他维度缩减技术,压缩维度的含义以及转换后的特征变得更难解释。
后续步骤
以下是我们接下来可以尝试的几件事:
- 超参数调整—尝试调整“困惑”并查看其对可视化输出的影响。
- 尝试其他一些非线性技术,如均匀流形近似和投影 (UMAP),这是 t-SNE 的推广,它基于黎曼几何。
- 根据转换后的数据训练 ML 模型,并将其性能与未经降维的模型进行比较。
摘要
让我们快速回顾一下。
我们在 MNIST 数据集上使用 sklearn 实现了 t-SNE。我们将可视化输出与使用主成分分析的输出进行了比较,最后,我们尝试了一种混合方法,该方法首先应用主成分分析,然后应用 t-SNE。
我希望你喜欢这篇博文,并请分享你的想法:)
看看我关于独立性卡方测试的另一篇文章:
[## Python 中独立性的卡方检验以及 IBM HR 分析数据集的示例
员工流失是否取决于因素“X”?
towardsdatascience.com](/chi-square-test-for-independence-in-python-with-examples-from-the-ibm-hr-analytics-dataset-97b9ec9bb80a)
参考
[1]https://en . Wikipedia . org/wiki/T-distributed _ random _ neighbor _ embedding
【2】https://sci kit-learn . org/stable/modules/generated/sk learn . manifold . tsne . html
PCA 降维:从基本思想到完全推导。
在本文中,我们将在一个简单的例子上建立一些关于维数约简和 PCA 的直觉,然后整理其背后的数学,并推导出一般情况下的算法。
主成分分析(PCA)是一种强大的算法,其思想是由卡尔·皮尔逊在 1901 年【1】为一个数据拟合问题提出的。与最小二乘回归不同,它不依赖于哪个变量是独立的,反映了变量之间的普遍关系。主成分分析有许多应用,如噪声过滤、特征提取或高维数据可视化,但最基本的应用是数据降维。在下面的帖子中,我将从这个角度描述 PCA。
内容
在本文中,我们将:
- 深入了解降维。
- 在 2d 和 3d 中几乎不用数学就能建立一些关于 PCA 的直觉。
- 推导一般情况下的主成分分解。
- 总结一下 PCA 降维算法。
- 看看它如何处理图像压缩。
降维的基本思想降维
一般意义上,降维是对原始M-维度数据N-维度子空间的一种表示,其中 N < M 。为了建立一些直觉,让我们从一个简单的例子开始。假设我们的数据是从汽车中的 GPS 传感器获取的坐标。假设它是真实世界的数据,所以它包含一些噪声。
图一。汽车坐标的二维数据,生成为 y=2*x +噪声。
因此,我们手头有二维数据,在这种情况下降低维度意味着找到数据的一维表示。这可以通过将每个点投影到一维子空间上来实现。不一定是正交投影。例如,让我们取由基向量***【b】***跨越的子空间并使用某种投影矩阵 P 来投影我们的数据。
图 2 我们以某种方式将数据投射到低维空间。低维坐标称为代码。然后,我们可以通过子空间基向量和编码将数据重构回原始维度。
现在,在子空间中,我们可以为每个数据点仅存储一个值——子空间 U 中对应的坐标λ。这些低维坐标称为 代码 。使用这些坐标λ和一个基向量 b 我们可以将数据重建回原始维度,结果称为 重建 。****
你可以在这里提到,重建的数据不同于原始数据,我们可以用原始点和重建点之间的欧几里德距离来衡量这种差异。我们可以看到降维是有一定代价的,我们要付出的代价是信息损失。但它仍然有一些意义:即使使用这样的随机投影,重建的数据也反映了原始数据的一些属性:我们仍然可以看到 X 和 Y 正相关,甚至重建数据的斜率也非常接近原始数据。
我们使用了一些随机的无动机的投射,所以问题是“我们能做得更好吗”?我们当然可以,这就引出了 PCA 算法。但首先,在一般情况下推导它之前,让我们对它建立一个更好的理解。
主成分直觉
在我们开始之前,让我们进行一个小的数据准备,让我们把我们的数据转移到中心(从每个维度减去平均值)。正如我们所见,这种转变似乎很有帮助。它不改变变量之间的关系,很容易回到原始数据,我们只需要添加相应变量的平均值。
图 3。数据居中:X_c= X -E[X],Y_c = Y -E[Y]。对于逆变换,我们保持 E[X]和 E[Y]。
所以现在我们要进行降维,保存尽可能多的信息。我们可以用重建误差来衡量信息损失,重建误差定义为原始数据和重建点之间的平均平方距离:
这里我们需要首先提到的是,我们应该使用正交投影,以便最小化原始点和投影点之间的距离。考虑图 4 的左图:正交投影(灰色)的距离总是小于非正交投影(橙色)的距离。这可以用三角形不等式来证明,稍后我们将从另一个角度再次看到它。
图 4。正交投影可以最小化距离。现在我们需要找到最佳拟合向量 b。
所以我们已经介绍了投影类型,现在我们需要找到这样一个向量*【b】*,它最小化 L 。从图 4 中可以明显看出 b2 比 b1 好,但是如何在所有的中找到最好的一个呢?
现在让我们稍微作弊一下,跳过大部分数学运算,通过旋转基向量并为每个向量【b】计算相应的重建误差,在数值上优化 L 。我还在右图中添加了投影点的方差,因此您可以注意到我们稍后将讨论的一个关键特性。
图 5 .我们旋转基向量 b 并将数据投影到相应的子空间上,然后计算重建误差 L 和投影方差 Var(λ)。
可以看出,通过这种方式,我们可以找到一个使重建误差最小化,同时使投影方差最大化的向量。这是一个重要的特性,所以让我们稍微关注一下:
- 跟随左边的动画:当我们向最优解移动时,投影(灰色)点试图尽可能远离原点。
- 这是因为正交距离的最小化与投影和原点之间距离的最大化是相同的。从任何蓝点到原点的距离保持固定,我们最小化正交距离(虚线),因为根据勾股定理,这与最大化从原点到投影点的距离是相同的。
- 投影的期望值为零(因为我们在开始时将数据居中),从原点到投影的距离最大化也会导致方差最大化。这是一个至关重要的特征,我们将在后面的一般推导中面对它。
还有一件事要讨论。让我们考虑子空间()U2**)正交,因为我们刚刚在下图上找到():**
图 6。我们找到的基本向量是我们数据的主要组成部分。主成分描述了大多数数据差异。
这些子空间上的投影是我们数据的主要组成部分。考虑图 6 中的投影方差:相应的子空间具有一个重要的性质,即第一投影包含大部分方差,而第二投影包含最小方差。它们一起描述了所有的数据差异。将总数据方差视为它们的总和,我们可以计算出子空间描述了 97.1%的数据方差,子空间 U2 描述了 2.9%。因此,如果我们降低维数,只保留在 U1 上的投影,信息损失将仅为 2.9%。**
让我们从一个稍微不同的角度来看看我们到目前为止所做的事情:我们用一种新的基来执行数据的正交分解,其方式是基向量之一跨越一个具有最大方差的子空间。根据正交分解定理我们总是可以通过某个子空间及其正交补来分解任何向量,并且在 PCA 中,我们正在搜索包含大部分数据方差的子空间。
比如在 3d 中我们可以找到 2d (一个平面)或者 1d (一条线)数据方差最大的子空间。考虑跨越具有最大方差的平面的两个基向量和与其正交的第三个基向量:
图 7。红线代表数据主成分。大多数数据方差可以用基于前两个主成分的平面来描述。
对于更高维度,很难绘制或想象所有这些,但想法是相同的:找到一个子空间(线、平面、超平面),其中包含大部分数据方差及其正交补。跨越这些子空间的向量是主分量。
一旦我们得到这个,我们就可以进入一个普通的案例。
一般情况 PCA 推导
假设我们有数据×数据** 由 N 个数据点组成,每个点都是一个 D 维向量:**
就像前面提到的例子一样,我们希望在另一个标准正交基中分解每个数据点,以使第一组分量包含大部分数据方差。我们可以这样写:
这里 b 是我们新的基向量,β是对应的坐标。我们希望找到这样的 b 和β,使得第一个 M 基向量所跨越的子空间上的投影包含大部分数据方差。让我们回顾一下例子:
- 在 2d M=1 中,我们找到了一个方差最大的子空间(一条直线),一个正交子空间包含最小方差。
- 在图 7 上的3dM = 2中,我们找到了一个方差最大的子空间(一个平面),它的正交补又包含最小的数据方差。
为了降维,我们去掉了具有最小方差的第二项,并用第一个 M 基向量来表示我们的数据:
注😗***【x 】仍然是一个 D 维度向量,但现在它生活在一个更小的子空间中,可以用 M 坐标描述在新的基础上***
我们的目标保持不变:最小化我们定义为原始点和重建点之间的均方距离的重建误差:
但是现在我们要推导出解析解。为此,让我们重写损失函数。首先,让我们用数据在相应基向量上的点积来表示投影坐标:
注: 一个人可以证明正交投影是最优解,考虑 L 关于β的偏导数并设为零,得到同样的结果。
使用β的表示,我们可以将 x 重写如下:*
我们可以基于同样的推理重写 x :
所以数据和重建的区别在于:
损失可以写成:
已知 b 是正交基的组成部分,得到如下:
然后我们可以重新排列总数,得到这个:
这里有一件好事:假设我们的数据居中,括号中的一项是协方差矩阵 S=Cov(X) ,所以我们可以这样写:
我们将最小化在 {M+1,D} 基础上预测的方差(这与在 {1,M} 基础上最大化的方差相同,在图 6 中概括结果)。
还有最后一步要走:我们要最小化 L 关于bb假设bb是一个标准正交基,它应该满足下面的等式:**
因此,我们手头有一个约束优化问题。这可以用拉格朗日法解决(如果你不熟悉,这里有一个伟大的来源):
为了找到 b 我们需要将拉格朗日的梯度设置为零,因此对于 b 的导数,我们得到:
最后,我们得到:
这就是协方差矩阵的特征向量问题!这意味着协方差矩阵的特征向量是主分量(注意,由于协方差矩阵的对称性,它们是正交的)。**
如果我们将它们代入损失函数的最终方程,我们也可以清楚地看到相应特征值的含义:
这意味着为了使 L 最小,我们应该取一个由具有最小特征值的 D-M 特征向量构成的子空间。换句话说,对应于第一个 M 个 最大特征值的特征向量跨越具有最大数据方差的子空间。因此,如果我们按特征值降序排列特征向量,第一个特征向量将代表最大数据方差的方向,第二个特征向量将代表来自其余正交方向的最大数据方差的方向,依此类推。
设置 M=0, 我们可以计算最大损耗。它等于所有特征值的总和(这是非常明显的,因为我们去掉了所有的主成分,即我们去掉了所有的信息)。这意味着我们可以计算每个主成分中包含的方差(信息)的比率,如下所示:**
这就很容易决定我们应该为降维留下多少组件。为了方便起见,我们可以绘制解释方差的比率(scree plot)及其累积比率。考虑我们已经在图 7 中看到的数据示例:
图 8 . 3D 数据示例的碎石图,第一主成分解释了约 65%的数据差异,第二主成分解释了约 25%,第三主成分解释了约 10%。
因此,对于这个例子,如果我们减少 1 维,去掉第三个主成分,我们将丢失大约 10%的信息(数据方差)。
现在我们准备定义一个用主成分分析进行降维的最终算法。
主成分分析的降维算法
最后是 PCA 算法,用于由数据点组成的数据 X ,其中每个点是一个 D 维向量:**
- 首先,我们需要集中我们的数据:
2.然后我们计算中心数据的协方差矩阵 S 并找到它的特征向量 b 和特征值λ。
3.按对应的特征值降序排列特征向量。
4.然后我们从第一个(M<【D】特征向量形成矩阵 B 并进行降维:**
5.对于逆变换,我们需要回到原始空间(寻找投影)并将数据从中心移回,加上平均值:
龟背竹压缩示例
我们已经做了很多工作,所以让我们玩得开心点。还记得特色图片中的龟背竹吗?让我们用 PCA 压缩它。它是[225,255,3] RGB 图像,因此我们可以分别对每个通道应用 PCA,并探索不同数量的主分量的解释方差。
图 9 解释了不同颜色通道的差异。
请注意,完全分解由 255 个分量组成,同时第一个分量解释了 40%以上的方差,前 40 个分量解释了大约 99%的方差。因此,我们可以使用大约 6 倍的较小表示来压缩图像,并且能够以接近零的损失来重建图像。让我们看看它是什么样子的:
图 10。使用 PCA 压缩的图像重建示例。
编后记
到目前为止,我们已经想出了一个基本的 PCA 算法,并用其中一种可能的方法推导出了它。除了基本 PCA,还有其他更具体的实现,如稀疏 PCA、鲁棒 PCA、内核 PCA 等。其中一个扩展是从称为概率 PCA 的潜在变量模型的角度来看的 PCA,我很想写一篇关于它的帖子。敬请关注更新。感谢阅读!
Power BI 中的直接查询—什么、何时以及为什么?
关于 DirectQuery 您想知道但不敢问的一切!导入模式的 Power BI 替代方案的最终指南
皮查拜在 Pexels.com 拍摄的照片
使用 Power BI 时,您需要首先做出以下决定:
一旦您计划获取一些数据,Power BI 会要求您选择数据连接模式。如果您已经阅读了这篇文章,或者更好,从这篇文章开始,您可能会熟悉导入选项,以及表格模型如何在 Power BI 的背景下支持您的查询并生成闪电般快速的报告。
在本文中,我想更深入地研究 DirectQuery 选项,因为我感觉这个选项仍然没有得到充分利用(不管是好是坏,我们将在本文中进行探讨)。
什么是 DirectQuery?
顾名思义,DirectQuery 是一种检索数据的方法,它在查询时间 直接从数据源 中提取数据!这句话的最后一部分掌握着关键—虽然导入模式将数据的快照存储在内存中,但 DirectQuery (DQ)不存储任何数据。对于每一个请求,它都直接进入数据源(在 99%的情况下是 SQL 数据库),并从那里提取数据。
因此,在查询执行之前、期间和之后,数据都驻留在其原始源中!
在与报表交互时,您的用户会生成一个查询(或者大多数情况下是一组查询),需要执行该查询才能满足请求。您可能还记得本文中的,表格模型由公式引擎(FE)和存储引擎(SE)组成。Formula Engine 接受请求,创建查询计划,然后根据您在 Import 和 DirectQuery 模式之间的选择,生成针对相应数据源的查询。
Pexels.com 上 Lum3n 的照片
您可能会注意到,当您选择 DQ 选项时,公式引擎会将 DAX“翻译”为 SQL,并将查询直接发送到数据源。
一旦选择了 DirectQuery 选项,Power BI 将不会从底层表中导入数据。它将只保存它们的元数据。
好消息是:您可以在 Power BI 中使用复合模型。简而言之,这意味着您可以在数据模型中结合 DQ 和导入模式,为每个表设置首选选项!
正如您可能看到的,一旦我使用 DQ 选项创建了 Power BI 数据模型,当我在 model 视图中打开我的数据时,在 Advanced 下,我可以选择对所选表应用哪种存储模式。重要提示:您可以从直接查询模式切换到导入模式,但不能从导入模式切换到直接查询模式!
双重模式就像一个混合体——导入模式和 DirectQuery 的结合。表中的数据被加载到内存中,但是在查询时,也可以直接从源中检索。
什么时候使用 DirectQuery?
老实说,这是一个“百万美元”的问题:)…而且,和大多数情况一样,唯一正确的答案是: 【看情况】 。但是,让我们看看这取决于什么!
乔治·贝克尔在 Pexels 上的照片
- 您需要“实时”或接近实时的数据吗?如果您对这些问题的回答是:是的,您应该考虑使用 DirectQuery 模式。为什么?因为,导入模式会保存数据的快照,并且需要定期刷新以获取最新数据。例如,如果您需要最大延迟为 1 分钟的数据,使用导入模式实际上是不可能的
- 您的数据模型规模大吗?我说的大,就是大!大到你无法在最大限度内容纳它。pbix 文件大小(专业版许可 1 GB,高级版/嵌入式版 10 GB)。假设您的用户需要在高粒度级别上分析十亿行表中的数据。您不能简单地将十亿行的表数据导入到表格模型中,相反,数据会保留在源中,并且在细化的结果返回到报表之前,您的聚合/计算会在源中执行
为什么(不)使用 DirectQuery?
如果您的工作负载需要上述场景之一(“实时”分析和/或过大的数据模型),DirectQuery 将是一个显而易见的选择。
但是,让我们研究一下在更频繁的情况下使用 DirectQuery 的一些一般优缺点:
使用 DirectQuery 时最重要的考虑是,整体用户体验几乎完全取决于底层数据源的性能。这意味着,如果您的源数据库没有针对分析工作负载进行优化(缺少索引;不适当的索引;数据建模不充分,以至于查询需要针对多个表),您的报表性能会很差!
此外,与报告并行交互的用户数量也会产生影响。想象一下这样一个场景,10 个人浏览带有 20 个视觉效果的报告页面——这将同时生成对底层数据源的 200 个查询!请记住,每个可视化将生成(至少)一个对数据源的查询!
此外,如果您有机会通过应用不同的技术来改善这两个方面,您还应该记住,有些事情是您无法控制的,例如:
- 源服务器的性能 —例如,如果在同一台服务器上运行数十种不同的工作负载,您将无能为力
- 网络延迟
优化数据源的技术
正如我上面提到的,有不同的技术可以提高数据源的性能(假设您可以访问底层数据源,并且可以应用结构性更改)。
皮查拜在 Pexels.com 拍摄的照片
- 添加合适的索引——支持你最详尽的查询。您应该考虑为大型分析工作负载创建列存储索引,但是设计良好的 B 树索引也应该提高性能
- 数据完整性到位 —确保维度表包含正确的键,并且这些键与事实表相关(每个事实表键值在维度表中都有相应的值)
- 在源数据库 中创建持久对象——这意味着,尝试物化所有的聚合、转换和计算,无论是在特殊的表中还是在索引视图中。这样,Power BI 可以从一个地方检索所有数据,而不是每次执行查询时都执行复杂的操作(比如多个表之间的连接)
- 使用源系统 中的数据表——每一个(合适的)数据模型都应该依赖一个单独的日期维度。确保您已经在数据库中建立了日期表
Power BI 和 DirectQuery 最佳实践
一旦您使用了 Power BI,在使用 DirectQuery 模式时,您应该坚持以下最佳实践:
- 避免复杂的 Power Query 转换 —每次将转换应用到数据模型时,Power Query 都会生成一个查询并将其发送到源数据库。假设我想用 783 替换我所有的 ProductKey 值 782。如果我在超级查询编辑器中这样做,会发生以下情况:
您可以看到 Power Query 为满足我们的请求而生成的 M 语句,但是如果您右键单击该步骤并选择 View Native Query 选项,您还可以看到将被发送到 SQL Server 数据库的 SQL 查询:
现在,对于这些简单的转换,Formula Engine 足够智能,可以在一次迭代中完成所有工作。但是,如果您执行一些更复杂的东西,打开 SQL Server Profiler 或 DAX Studio,看看有多少请求被发送到您的源数据库…
- 如果您需要使用 计算列 ,请尝试将它们的创建推送到源数据库并保持它们的持久性
- 避免复杂的 DAX 度量——由于您的 DAX 语句需要“翻译”成 SQL,请记住,此过程可能会产生昂贵的 SQL 查询。同样,只要有可能,在源端执行所有的计算
- 避免 GUID 列(唯一标识符)上的关系— Power BI 不支持这种数据类型,需要在查询执行期间应用一些数据转换,这会影响性能。解决方案是在 Power BI 生成自己的查询之前,在源数据库中转换这种数据类型
- 尽可能限制并行度—您可以定义 DQ 可以同时打开的最大连接数:
如果转到“选项”,在“当前文件”下,可以为每个数据源的最大连接数指定一个值(默认为 10)。
- 在 Power BI 报告中,几乎没有额外的优化选项:
这些选项中的大多数都是不言自明的。基本上,您可以限制切片器和过滤器,因为默认情况下,当您更改一个切片器值时,所有切片器都会生成对数据源的查询(即使是那些没有更改的数据)!
因此,您可以添加“应用”按钮,以便用户可以具体选择需要刷新的数据部分。当然,这将影响您的报表设计,因为您需要为这些按钮提供额外的空间:
你还应该仔细想想报表页面上的 视觉效果的数量 —视觉效果越多,数据检索所需的时间就越长。
最后,你应该 关闭视觉效果之间的交叉高亮和交叉过滤 ,因为这将减少生成的查询数量。您可以在整个报告级别上关闭这些功能(在选项- >查询缩减- >中,选中选项:默认情况下禁用交叉突出显示/过滤),或者仅针对特定视觉效果关闭这些功能。
还有一个非常重要的建议— 与您的用户 交谈,尝试向他们解释导入模式和 DirectQuery 之间的区别,他们使用这两种模式中的每一种可以获得什么好处,以及预计会有哪些缺点(尤其是在选择 DQ 模式时)。
结论
正如你自己可能得出的结论: 如果你正在考虑使用 DirectQuery,为工作选择正确的工具 是最好的建议。
在做出最终决定之前,请仔细评估您的潜在工作负载,并尝试确定导入和 DirectQuery 方法的所有优缺点。
感谢阅读!
订阅这里获取更多有见地的数据文章!
直接到熊猫数据框
使用 Chrome DevTools 和 Python 直接从远程 URL 下载和读取数据到熊猫数据框架的 3 分钟指南
挑战
对于新的数据科学家和软件开发人员来说,从远程 URL 下载数据通常是自动化的首要任务之一。例如,在下图中,我想下载并解析来自 Data.gov的每小时降水量 CSV 样本数据,并将其直接解析到熊猫数据帧中。
问题是不清楚如何找到下载按钮重定向到的 URL 路径。
查找远程 URL 路径
使用 Chrome DevTools(或类似工具)并遵循以下步骤,很容易找到远程 URL 路径。
- 导航到要下载数据的页面。
- 用右键打开 Chrome DevTools 检查或导航到 Chrome 菜单→更多工具→开发者工具。
- 在 Chrome 开发工具中导航到控制台。您可能会在控制台中看到文本,可以使用右键→清除控制台来清除。
- 打开控制台,点击下载按钮或类似按钮。
- 下载按钮重定向到的 URL 路径现在显示在控制台中。
使用 Chrome DevTools 控制台查找 URL 路径
直接下载数据到熊猫数据框
一旦找到远程 URL 路径,就很容易将数据读入 Pandas 数据帧。下面的代码演示了如何解析 CSV 文件,但是对于 JSON、Excel 和其他文件类型来说,这样做也很容易。
从远程 URL 直接读取数据到熊猫数据框
上述代码的输出
直接批量下载到熊猫数据框
通常你不会自动下载单个文件,而是从一个远程 URL 下载一批文件。例如,下图显示了温哥华国际机场每小时天气数据的下载门户。问题是下载时间为 1 个月,所以如果我想下载 1 年的数据,我需要下载 12 次。
让我们检查一下下载数据按钮使用 Chrome DevTools 控制台重定向的远程 URL。
注意,除了其他唯一标识符之外,还有下载年、月和日。因此,让我们编写一个简短的脚本来下载 1 年的数据,并将其合并到一个单一的熊猫数据帧中。
从远程 URL 读取多个文件的数据并合并
上述代码的输出
结论
Pandas 是任何数据科学家的必备工具,Chrome DevTools 是工具箱中的绝佳补充。按照上面的步骤,很容易将数据直接下载到 Pandas 数据框架中,并且很容易将其扩展到其他文件类型。
编码快乐!
脏数据—质量评估和清理措施
在《坏数据手册》一书中,伊森·麦卡勒姆说得对,“我们都说我们喜欢数据,但我们在乎的不是数据,而是我们从中获得的见解。”然而,数据分析师只能将 20%的时间投入到从数据中产生洞见的艺术和科学中。他们剩下的时间花在构建和清理数据上😫
为了最大限度地减少数据清理的时间投入,需要适用于不同行业、职能部门和领域的不同数据和业务用例的标准化框架和工具。
这个博客旨在让你具备构建和执行这种标准化数据质量框架所需的知识,这些框架适用于你的数据和用例。我们将重点关注:
- 数据质量和数据清理的基本概念,以及如何根据您的数据周期需求构建一个框架。
- 使用适合您的数据质量和清理流程的工具和技术快速跟踪执行。
I/什么是数据质量和数据清理?
数据质量 是通过检查不一致、不准确、不完整或不合理的数据值来评估数据质量的方法。
数据清洗 是根据数据的质量来修正数据的方法。
数据质量和清理方法循环运行,直到我们达到所需的数据质量状态。用例以及数据属性定义了这个过程的所有组成部分:比如要测量的数据度量或者检查的数量、需要的自动化程度、错误处理的复杂度等等。
例如,一个组织的销售数据每天为销售、营销和增长团队的多个仪表盘提供动力。这些团队中的每一个都依赖于底层数据的准确性。在这种情况下,流程应该包含所有可能的检查,维护可共享的数据质量报告,并运行日志来追溯错误。然而,如果我们使用除我们之外的任何人都不会使用的广告数据进行特定的分析,那么数据检查只需要应用于对该分析至关重要的表的相关列。
数据质量(DQ)指标
数据质量和清理都在一个共同的线程上运行,我们喜欢称之为数据质量 (DQ) 指标。它们奠定了评估质量和定义清洁措施的基础。每个指标就像一个 Q & A,每个响应都有一个相关的动作。
例如,X 列中缺失观测值的计数是一个 DQ 度量。此指标的值有助于评估数据质量,并相应地构建清理操作,例如用 X 的中值替换 X 中所有缺失的值。
II/如何建立数据质量和清理流程?
要构建您的数据质量流程,理解以下数据属性和相关用例至关重要,这些属性和用例决定了您的整个数据质量和清理过程。
- **模式:**数据的模式包括 R*C 矩阵形式的数据大小和列的数据类型(字符串、整数、日期等)。关于图式的有趣讨论在这里。
- **数据来源:**导入导出来源。例如:数据库、数据仓库、数据湖、API、设备文件、商业智能工具等。和文件扩展名,如。xlsx,。csv,。shp,。兽人,。拼花地板。pdf,。tiff 等。
- **数据上下文:**数据所有者、原始数据源(数据收集或进入系统的方式)、数据谱系、所有必需的列及其元单元、预期值或范围、相互关系等方面的数据上下文。越多越开心。
- **用例:**干净数据支持的用例的上下文。这是非常重要的,但困难和费时,所以要聪明。从业务涉众那里了解数据的主要用例,并相应地构建您的流程。
- **规模:**数据的规模包括过去、当前和未来数据表的规模,尤其是当数据更新且过程可重复时。
- **技术堆栈:**用户对工具的偏好,包括代码工具与非代码工具、开源软件与付费软件、所需的自动化水平、现有的数据工具&软件以及资源投资。
- **输出:**理想的输出结构。例如:干净数据表的结构,数据质量报告,错误表,日志等。
- **可重用性:**对数据质量可重用性水平的需求&清理代码,确定所需的自动化水平。人们可以使用 excel 清理静态数据表,编写快速代码来清理多个相似的文件,用 R/python 构建多用途黑盒库或函数,以便团队使用。
- **可重复性:**整个数据质量的可重复性&清洗过程取决于相同数据表的更新频率,例如,一家快速消费品公司的销售数据每天都会刷新。这包括选择工具来构建协调的数据清理工作流、数据质量分析或报告、错误处理、运行日志维护等。
III/确定数据质量(DQ)指标列表
它以一个简单的问题开始:这个数据集会出什么问题?模式、数据格式、数据上下文、用例以及输出:这些是数据&用例的属性,将有助于回答这个问题,并建立您的 DQ 度量的详尽列表。
根据我们的经验,我们将 DQ 指标分为三个级别:
级别 1 :不管数据集类型或用例的类型如何,都应该检查通用的 DQ 度量。几个例子:
- 数据类型/模式
- 缺少值
- 唯一主键
- 极端值
- 负值等。
点击 阅读更详细的一级 DQ 指标 。
级别 2 :不同数据集和用例的上下文检查。例如:
- 列关系-列应遵循其预期的关系,如人口普查数据文件中的人口列值不能小于家庭列值。
- 上下文数据范围-基于数据的上下文,测试期望值或值的范围,例如,如果数据是从 2014 年开始的,则日期不能在 2013 年之前。
级别 3 :比较检查,将数据表与理想或主数据表进行比较。
- 主匹配/实体解析-检查地理名称、产品名称、电子邮件域等实体。对照标准主文件剔除不良名称并用正确的名称替换它们。
IV/数据质量(DQ)指标的执行
除了一系列 DQ 度量标准,关于属性的知识,如可重用性、可重复性、规模和技术堆栈有助于执行 DQ 度量标准来评估质量,并相应地选择正确的工具集&技术来清理数据
为了更好地说明这一点,我们采用了三个场景,类似于我们过去遇到的场景,它们具有这些特征的不同组合,来演示不同的执行方法和手段。
[案例 1] —创建一次性仪表板来显示国家电力计划的进度
国家电力计划的数据是印度所有地区的月度时间序列数据。xlsx 格式(2 个小于 25k 行的文件& 15 列)。由于它是为一次性用例创建的(用于会议中的演示),所涉及的任务没有可重复性。然而,无论如何,该过程最好是可重复使用/可再现的,以便在达到最终期望输出之前考虑数据处理的多次迭代。
解决方案:
完成这项任务的最合适的工具可以是一个无代码开源工具,也可以是 R 中的一个脚本(由于我们对这种语言的熟悉程度),它将生成一个 CSV ,进而驱动一个 R 闪亮的仪表板。
我们使用 R 来评估数据质量,并为我们的 R shiny 仪表板生成干净的结构化文件。
链接到与其相应的 web 链接一起使用的 R/python 函数列表。
或者,您也可以使用:
- MS Excel:Excel 的宏功能可以自动执行可重复的功能,如找出缺失值、删除重复数据等。并安装额外的插件,如模糊的地理主匹配。
- Tableau : Tableau 既有可视化&数据清理工具——假设你愿意用 Tableau 代替 R shiny。你还是得做一场地理大师赛。
- 如果你喜欢无代码的方法,那么这是一个很好的选择,因为它将 UI 命令转换成 R 代码片段,可以存储并在以后使用。
[案例 2] —创建一个显示进度指标的控制面板,并使用通过卫星图像捕获的外部代理指标进行分析和验证。
在这种情况下,方案数据在村庄级别(60 万以上的印度村庄)持续 5 年,每月卫星图像的粒度是印度村庄的 10 倍。因此,数据量很大,输入数据格式多种多样—CSV 和地理空间栅格(图像),输出仪表板需要一个带有数据表的 shapefile,以便能够绘制地图,并且我们要求清理代码可重复使用。
解决方案:
在这种情况下,我们使用 R,因为它可以处理 CSV 以及空间矢量和栅格格式。我们也更喜欢使用 QGIS,因为它非常适合视觉验证。以下是除案例研究 1 中提到的检查之外,我们对卫星图像和地理标记村庄数据文件进行的一些额外检查。
将链接到与其对应的 web 链接一起使用的 R/python 函数列表。
或者,您也可以使用:
- Python:在这种情况下,使用 R 或 python 没有区别。它只是基于分析师的偏好和技能。
- ArcGIS:对于所有的空间/卫星操作和可视化来说,它是一个伟大的无代码选项,但它是一个付费许可软件。
加成:在 R-【https://atlan.com/courses/introduction-to-gis-r/】学习 GIS
[案例 3] —创建一个实时仪表盘,每月使用方案和卫星图像数据进行更新,无需任何人工干预。
在这种情况下,亮点是自动化的 ETL 工作流,它将为实时仪表板提供动力。除了我们在案例 I 和案例 II 中涉及的检查,我们还需要做出正确的决策,并对以下数据和用例属性执行:
- 全自动可重复和可重用流程,用于提取/导入数据、运行转换(数据结构化、DQ 指标、清理操作)以及在仪表板中加载/导出数据(ETL 工作流)。所有这些将以不同的频率运行(每周、每月和每年)。
- 通过 API(JSON 和 XML 格式)处理输入,过去的数据存储在 AWS cloud 和 mysql DB 中。
- 管理日益增长的 大规模数据(5 年内每月约 400 万行 x 400 列)和 DQ 指标。这是因为存在更多数量的方案,因此需要检查更多这样的 DQ 度量。
- 所需的输出不仅仅是每月的干净数据文件,还有错误日志、运行日志、数据质量报告和错误表。
- 改变技术堆栈以实现上述所有要点。
为实现这些特性而采取的附加措施列表-
将链接到 R/python 函数列表,这些函数与相应的 web 链接一起使用。
Docker 是一个开源工具,可以帮助开发一个与机器无关的应用程序或一组脚本。Docker 引入了容器概念,这是一个标准化的软件单元,允许开发人员将他们的应用程序与其环境隔离开来,解决了“但它可以在我的机器上工作”的头痛问题。由于我们的 ETL 过程是在我们的系统上构建的,但是应该在客户的系统上运行,所以需要对它们进行分类。点击了解更多关于 docker 的信息。
Apache Airflow 是支持该数据管道自动运行的系统,并向用户提供 UI 来查看日志、监控管道等。这是一个开源的工作流程管理工具,由 Airbnb 于 2008 年启动。在我们的例子中,每个方案都是一个独立的工作流或 DAG(直接无环图),每个都由不同的节点组成。每个节点执行一个步骤:从 API 获取数据、存储数据、检查数据、清理和转换数据,最后将最终输出写入指定的目的地。可以有多个输入和输出到达和去往不同的源。对于每个节点,我们可以跟踪它运行了多长时间,或者运行失败了多少次,等等。评估仪表板上的数据更新所需的净时间。
这种设置也有助于将项目轻松移交给其他团队,他们将来会负责监控和更新 scheme 的数据。要了解更多关于气流的信息,请查看这个博客:如何在 Apache Airflow 中创建工作流来跟踪印度的疾病爆发。此外,日志和警报在此设置中至关重要,因为它们有助于故障排除和准确识别问题所在的步骤。我们可以在 R 和 Python 中使用简单的、描述性的打印语句和其他日志库,如 log4r 、日志、 tryCatch 。
或者,现在市场上有一些有趣的工具可以帮助你用更少的资源更快地构建一个类似的过程
- Python:这是一种开源语言,可用于构建数据质量指标,并通过设置端到端 ETL 工作流来自动化其运行过程。虽然它适用于数据和用例规模不是如此之大的情况,但是没有资源编排或在外部机器上部署脚本,并且您或您的项目同事非常了解 python——那么 python 可以在某种程度上解决可重复性问题。查看这些关于这个主题的好文章,给 mac 或 linux 用户和 windows 用户。
- Alteryx :在 ETL 工具类别中,Alteryx 是市场上的一个既定名称。您可以使用大量可用于表格和空间数据的数据转换节点和质量度量来设置工作流,同时提供易于使用的错误处理和其他工作流管理流程。它有一些限制,如:与 Mac 或 Linux 不兼容(只有一个 Windows 兼容的桌面应用程序)或数据大小的挑战,这取决于您的 PC 或笔记本电脑在测试&构建工作流时的配置。根据您的预算和需求,您还可以查看类似的产品,如 Informatica 、 Talend 、datataiku等。
- Atlan : Atlan 是一个云优先的现代数据质量管理工具&。就构建和维护数据工作流而言,您几乎可以做上面讨论的所有事情——完全不需要了解 docker 或 apache airflow,也不需要工程师的帮助。您可以根据您的数据使用其数据质量&清理建议来测试数据质量,也可以使用其度量库定义您自己的自定义数据检查,或者使用 SQL、regex 等构建您自己的度量。虽然在图像数据上构建数据质量检查在该产品上还不可用。由于 Atlan 是作为 web 应用程序部署的,因此不存在操作系统兼容性问题。*免责声明:安基塔和我目前都在 Atlan 工作,所以不要质疑我们的偏见。*😛
五.结论
在这篇博客中,我们试图揭开数据清理和质量实际需要什么的神秘面纱,这样你就可以最大限度地利用你的时间。在开始分析或建模部分之前,列出数据质量指标及其相关的数据清理活动有助于预先发现数据问题并优化清理工作。对可用工具和产品的了解有助于您学习和选择适合您的技能和团队技术的工具和产品。
无论数据有多大,只有质量好,才能产生有用的见解。否则,就等于垃圾进,垃圾出。
来源:讲解 xkcd;许可证: CC BY-NC 2.5
接下来的步骤: 岗位数据清洗和质量是最期待的部分,数据分析,统计&机器学习。为了下一步,我们创建了一个关于统计和机器学习的 python 课程。
我们的 Github repo***‘简介 _ to _ Statistical _ Learning _ summary _ python’***总结本书《 统计学习简介》由 Daniela Witten、Trevor Hastie、Gareth M. James、Robert Tibshirani 编写,并将其变成一门 python 课程这本书的每一章都被翻译成一本 jupyter 笔记本 用概念总结、数据& python 代码来练习。
欲知该系列更多脉络,请通读其 简介 为好。
有趣的资源可以查看-
数据清洗概念-
- http://www . unofficialgogledatascience . com/2016/10/practical-advice-for-analysis-of-large . html
- http://2.droppdf.com/files/GU2nI/bad-data-handbook.pdf
- https://www . Reddit . com/r/data science/comments/fzweaf/my _ giant _ data _ quality _ check list/?UTM _ source = share&UTM _ medium = IOs _ app&UTM _ name = iossmf
数据清理工具列表-
- https://www.kdnuggets.com/software/data-cleaning.html
- https://www . analyticsvidhya . com/blog/2016/09/18-free-explorative-data-analysis-tools-for-people-dont-code-so-well/
数据清洗在 R-
- https://cran . r-project . org/doc/contrib/de _ Jonge+van _ der _ Loo-Introduction _ to _ data _ cleaning _ with _ r . pdf
- https://towards data science . com/data-cleaning-with-r-and-the-tidy verse-detecting-missing-values-ea23 c 519 BC 62
- R 中 dlookr 包的数据质量
- 汇总数据最喜欢的 R 包&R-汇总数据包-第 2 部分
***R-***中的错误处理
关于我们 :
我和我的合著者 Ankita mathur 花了 6 年多的时间共同致力于数据项目,从社会计划和跟踪仪表板到位置智能,并为国际慈善机构、非政府组织、国家中央政府机构和各种企业建立替代数据 API。
这些年来,我们发现了数据质量和清理过程的模式,这些模式帮助我们建立了框架和工具,以最大限度地减少我们的数据处理和清理时间,并在 SocialCops 运行这些大型项目。
在 2018 年初,我们意识到这些工具和框架可以被世界各地的数据团队使用。那时我们开始了与 Atlan 的旅程——构建工具来帮助数据团队减少他们在数据质量、清理、设置 ETL 流程方面的时间投资,并花费更多时间从他们的数据中找到有意义的见解。
作为我们社区努力的一部分,我们已经通过博客,课程,研讨会和实践研讨会帮助世界各地的数据团队建立他们的数据质量和清理流程。
特别感谢我们这个系列的杰出编辑——艾西瓦娅·比德卡尔🎉(并承诺再也不用“和”开头的句子🙈)
肮脏的科学:实践中的纪律
在数据科学中保持“科学”的挑战。
在没有某种方向的情况下探索原始数据就像在垃圾场翻箱倒柜。当然,垃圾场里可能有一件有价值的古董,你甚至可能会偶然发现它。话又说回来,你可能只是花一下午的时间来分类垃圾。另一方面,如果你有一个具体的问题,可以用各种部件解决,并且你知道要找什么,那么从垃圾中筛选是值得的。区别在于有一个明确的目标,所以很容易接受/拒绝许多项目,而不是评估每个项目的价值。
如果你在一个收集所有可能数据的组织中,你不会像一个穿着干净的白大褂做实验的科学家一样。你将分类垃圾,寻找零件,并(希望)将它们组装成有用的东西。虽然你不是一个纯粹的科学家,但科学方法将帮助你完成这个过程。如果你不愿意弄脏你的手,把你的期望工资减半,申请一些研究基金。
科学是一个过程
卡尔·萨根写道:“对我来说,把握宇宙的本来面目要比坚持妄想好得多,无论这种妄想多么令人满意和安心。”太多时候,我看到数据科学家和分析师无意中充当宣传机器,用数据编织故事,无意识地扩散证实和事后诸葛亮的偏见。在一个充满数据的世界里,声称“数据驱动”很容易,但现实是,如果没有纪律,它往往会让人们相信一堆热气腾腾的垃圾是一顿热腾腾的营养餐。
科学旨在解释和理解自然界。该过程的主要部分是获得准确的测量值,并对其进行分析以得出结论。当数据以这种方式被收集和分析时,它是非常强大的。想要成为数据驱动的组织应该努力使用更多基于证据的实践。这里强调的是努力,因为在实验室和真正的随机对照试验之外,科学标准通常是无法达到的。
扫地
没有背景和方法,数据不是证据,它只是原始信息,可能有用,也可能没用。作为数据科学家,我们面临的挑战是,在不产生不必要的摩擦的情况下,通过建立上下文来大致应用科学方法。这是一个很难把握的平衡,你不可能让每个人都开心,但这不是我的工作。工作就是用数据来解释和理解你周围的世界。
这已经够难的了,所以不要通过个人失败来重新发现科学方法。遵守纪律,相信 500 年的老流程。我试着记住这是一门肮脏的科学,永远不会是完全干净的。因此,与其拿着一个可能会让我因为拖慢一切而被解雇的标准,我不如把它当成扫地,这样其他的工作也能完成。推扫帚是遵循科学方法的步骤。
1.问题
永远从好奇开始。找出一个未知的因素来激励你的组织,比如为什么某些客户会重复购买。这也可以更具体,比如我们如何设计更好的注册体验或开发一个应用程序来激励健康的习惯。这一步的关键是清楚地识别未知并记录下来。这将为剩下的过程提供方向和动力。我们都有好奇的天性,所以要了解它。
2.假设
接下来,制定一个明确的假设。这相当于为上一步中确定的未知因素声明一个解释。假设应该写成类似“简化注册过程将提高转化率”的陈述形式。在写假设的时候,留意下一步,帮助收紧。例如,“注册过程太复杂”不会导致明显的预测,而“简化注册过程将提高转化率”会。
一个好的假设是可证伪的,这意味着证据可以反驳或证伪它。“一艘外星飞船坠毁在罗斯威尔”这一说法是不可证伪的,因为如果这不是真的,那就只是缺乏证据。然而,“从来没有飞船降落在罗斯威尔”是可证伪的。找到一艘宇宙飞船,这个陈述就被证明是错误的。太多的组织持有不可证伪的信念,如“人们忠于我们的品牌。”推行这些信念就像用糖果来安抚一个有不良行为的孩子。不要走捷径。做一名科学家。
3.预测
有了明确的假设,是时候把筹码放在桌子上做个预测了。接受假设的逻辑结果,并致力于有证据支持的结果。例如,“如果我们简化注册体验,转化率将至少提高 1%”是一个可以实际测试的预测。预测通常会映射到多个假设或解释,因此重要的是要具体,并将其与主要调查紧密联系起来。
在实践中,我们想要做出的预测通常无法正确测试,或者它们可能会构成政治挑战。这就是纪律至关重要的地方。写下预测,好像一切皆有可能,然后评估测试的可行性。不采取这一步是一个滑坡,因为它很快导致完全避免预测。由于缺乏时间、资源或我无法改变物理定律,我做出的绝大多数预测都不可能得到验证。尽管如此,我不会限制自己的想象力,把事情写下来。
4.实验
现在是时候投入一些时间和精力来进行一项实验了。这是获取知识的黄金标准,正确地使用它并不简单。例如,测试更简单的注册体验的影响需要设计新的体验,将其与当前体验并行部署,将新用户随机分配到不同的组,并跟踪每个组中的指标。这伴随着硬开发成本以及你传递的其他东西的机会成本。
有时,这些测试可以像改变按钮颜色或字体一样简单,但在我看来,在那里没有多少知识可以获得。像这样的快速 A/B 测试对微调很有帮助,但在解释或理解我们的世界方面,它们并没有给我们太多帮助。有意义的发现有巨大的成本和风险。我们不得不花费资源来获取知识,并冒着假设错误的风险。科学是艰难的,这通常是外界压力毒害过程的地方。
另一方面,对我们来说,并不是一切都是科学。让每个想法都经过严格的实验过程是疯狂的。有时候,简化注册体验并自信地交付会更好,因为这是合理的做法。竞争瞬息万变,能够辨别新知识相对于获取成本的价值是一项非常高级的技能。
5.分析
最后,数据!如果你做了定义一个明确的假设,做出一个可证伪的预测,并运行一个干净的实验,那么这应该像比较两个组的统计数据并分享结果一样简单。在这种情况下,挑战通常是解决模糊性,并向非技术人员传达统计概念。对于年轻的数据科学家和分析师来说,这是一个在商界崭露头角的好地方。然而,通常情况下,它并没有这么干净。
当你丢失了随机对照试验的重要组成部分时,事情就变得肮脏了。也许你不能随机分配小组,或者根本无法创建实验小组。你可能会被迫分析时间序列数据或寻找一个自然实验来检测预期的效果。无论如何,分析应该总是在预测之后进行。如果你不能进行实验,在你寻找证据之前,对证据会是什么样子做出硬性承诺,并对你做出的让步极其清楚。
统计学家常常以开发出越来越复杂的方法来处理像这样的混乱局面而自豪。这是我见过的最底层的竞争。有时候,数据就是不存在,不准确的结论比根本没有结论更糟糕。至少“我们不知道”是诚实的,并把问题留待进一步调查。你从一个干净的、适当的随机实验中得到的越多,你就应该越不舒服。也就是说,不要害怕弄脏你的手,试一试。只要诚实,通过记录必要的让步来保护你的正直。
结论
当不可能严格遵循科学方法时,我经常听到非常聪明的、有良好意愿的人说“有总比没有好”之类的话。我倾向于同意这种观点,但会使用更谨慎的语言:“更准确是首选,但并不总是可以达到的。”你愿意没有尺子还是一把随机不准确的尺子?没有尺子,我有一个适定的问题:找一把好的尺子。有了一个有缺陷的统治者,我可能会在没有意识到的情况下制造更大的问题。
科学的目标是解释和理解世界。科学的方法提供了明确的步骤来识别和获取必要的知识。在各种环境中应用它需要纪律和视角。对我们来说,科学是一个大部分但不总是有用的过程,能够区分这两者是一个独特的挑战。数据科学是一门肮脏的科学。现在拿起扫帚回去工作。
基于脑电时间序列分析的残疾诊断
一种关于如何通过使用卷积神经网络(CNN)分析脑电图(EEG)记录来识别儿童是否受到自闭症影响的研究方法。
(来源:http://epscicon . vidyacademy . AC . in/WP-content/uploads/2017/12/EEG . jpg)
介绍
儿童出生时可能会有残疾。在早期发现他们的问题可以在以后的生活中带来更持续的改善。这主要取决于神经可塑性(大脑在一生中自我重组的能力),这在我们生命的最初几年要高得多。
自闭症谱系障碍(ASD)是一种神经发育障碍。这些类型的疾病主要被认为是正常脑功能的破坏。在过去的几年里,有报道称越来越多的儿童出现这种症状。美国 2014 年的一项调查数据显示,与 2012 年进行的同一调查相比,增长了 16%。根据这项研究,美国约有 1/59 的儿童患有自闭症谱系障碍(“CDC 的自闭症和发育障碍监测(ADDM)网络”,[1])。
最近的研究表明,强化的早期开始干预方法可以导致这种情况的重大改善。因此,使用机器学习的早期检测可以在这一领域发挥至关重要的作用。
在这篇文章中,我将概述我采用的不同方法来分析标记的 EEG 数据(已经预处理),这些数据包含受 ASD 影响和不受 ASD 影响的儿童的脑电波记录。利用诸如、支持向量机(SVM) 、决策树、CNN 和 LSTM 的算法,已经有可能实现 96%以上的分类准确度。
机器学习
我一直在处理的数据集由 129 列组成。前 128 列代表信号采集期间使用的 128 个 EEG 通道,最后一列是数据标签(受自闭症影响或不受自闭症影响)。数据集的每 250 行代表一个时间序列重复。每个孩子的时间序列重复在 20 和 80 之间变化,取决于主题。数据集被证明是平衡的,包含 49.03%的无自闭症儿童的数据和 50.97%的自闭症儿童的数据。
数据预处理包括首先加载数据,将其标准化,然后针对输入和输出值将其分为训练集(70%)和测试集(30%)。为此,我使用了 python 库,如 pandas、numpy、matplotlib.pyplot、sklearn 和 itertools。所使用的 ML 模型试图仅使用单一的刺激重复来识别儿童是否受到 ASD 的影响。
获得的结果总结在表 1 中。
表 1: ML 分类精度。
决策树获得了最准确的结果。决策树是一种监督学习算法,可用于分类或回归任务。决策树与其他 ML 算法的区别在于它们能够使用倒置的树状表示来显示决策过程。在树中,每个节点代表数据集中的一个特征,每个分支代表一个决策规则,每个叶子代表一个决策结果。在这个实现中,我决定使用 CART(分类和回归树)算法实现,它利用基尼指数作为度量。
卷积神经网络(CNN)
为了提高分类性能,我决定使用 Keras Python 库设计一个 CNN 模型。CNN 是一类神经网络,通常用于图像识别/分类,但也可用于时间序列分析。这可以通过将时间序列转换成类似灰度图像的格式来实现。
图 1: CNN 的脑电图分析[2]
模型架构包括:
- 64 个滤波器的一个 2D 卷积层、5×5 的核大小、ReLU(校正线性单元,等式 1)函数和相同的填充。
- 另一个 2D 卷积层具有 32 个滤波器、5×5 的核大小、ReLU(校正线性单元)函数、相同的填充和 0.01 的 L2 正则化系数(以防止过拟合)。
- 2x2 大小的 2D 最大池层。
- 强度为 0.2 的丢弃层(为了避免过拟合数据)。
- 一个层首先将数据从三维展平为一维,然后另一个层压缩输入以提供给分类器 128 特征(总是使用 ReLU 函数和 L2 正则化)。
- 强度为 0.5 的第二脱落层。
- 最后,密集层(两个神经元)使用 Softmax 激活函数产生分类结果。在这种情况下,Softmax 函数(等式 2)将从神经元获取两个输入,并将它们转换为两个概率,这两个概率的总和为 1。较大概率被向上/向下舍入到 1 或 0,以表示 CNN 输出选择。
等式 1: ReLU 激活函数
等式 2: Softmax 函数
为了优化训练,采用 Adam(自适应矩估计)梯度下降算法,并用交叉熵函数计算模型损失。在二元分类的情况下,交叉熵函数可以通过使用等式 3 来计算。
等式 3:交叉熵函数
该模型在仅仅三十个训练周期中实现了 94.58%的总体验证准确率。
图 2: CNN 的准确性和损失
结论
本文证明了在预处理的 EEG 数据上使用 ML 和深度学习模型总体上可以获得良好的分类结果。作为这个项目的进一步发展,我还设法开发了一个 LSTM 模型,能够达到 96%以上的分类准确率。其他指标,如混淆矩阵、灵敏度、特异性和 AUC-ROC 曲线已被用于交叉验证这些模型的准确性。
此外,在预处理阶段应用自动编码器网络[3]来检查是否可以使分类更容易并加快模型训练时间也是有意义的。
本实验中需要考虑的一个问题可能是所用数据的可靠性(例如,数据是否收集正确,测量过程中记录的所有噪声是否已被正确过滤……)以及使用不同类型的 EEG Cap 或在不同实验室条件下收集的其他形式的数据,这些精度结果的可重复性如何。
当试图在医疗应用中使用人工智能时,必须获得高精度和可靠性。可解释的人工智能(创建能够解释自己分类决策过程的模型)可以帮助医生理解在决策时如何/是否使用人工智能。
此研究项目的完整在线图书版本可通过此链接获得。
我要感谢kou shik Maharatna教授给我这个机会开展这个项目。
联系人
如果你想了解我最新的文章和项目,请通过媒体关注我,并订阅我的邮件列表。以下是我的一些联系人详细信息:
文献学
[1]疾病控制和预防中心,国家出生缺陷和发育障碍中心,出生缺陷处。访问时间:【https://www.cdc.gov/ncbddd/autism/data.html】T22018 年 12 月。
[2]使用卷积神经网络的单次试验 EEG RSVP 分类,Jared Shamwell,Hyungtae Lee et al. 访问:https://www . spiedicallibrary . org/conference-proceedings-of-spie/9836/983622/Single-trial-EEG-RSVP-classification-using-convolutionary-neural-networks/10.11117/12.224172 . short?SSO = 12019 年 6 月。
[3]杰瑞米·乔登自动编码器简介。访问日期:https://www.jeremyjordan.me/autoencoders/2019 年 3 月。
令人失望的人工智能:使用 AWS 进行 OCR 和名人识别
或者当 AWS 把巫师误认为塞尔维亚足球运动员时。
据 Forbes 报道,到 2020 年,83%的企业工作负载将在云中,其中 41%在 AWS、谷歌云平台或微软 Azure 等公共平台上。在我最近作为数据科学家的一个项目中,我不得不开始习惯云计算、存储和部署。在这个方向上的另一个好的步骤可能是开始试验云服务,如图像识别、字符识别和语音识别,如果不只是为了了解它们提供的性能。
在黑客马拉松中测试 OCR 服务
测试提供光学字符识别的云服务是我几周前参加的一次黑客马拉松的主题,那是在我目前工作的公司。这让我有机会测试 AWS 的人工智能服务,主要集中在 OCR ( Textract,Rekognition ),但也有一些有趣的服务,如名人识别** ( Rekognition )。事实上,AWS Rekognition 应该是一个相当完整的服务,可以检测物体,识别人脸和检测文本。现实与此略有不同。**
关于 OCR 的一个小提示
OCR 代表系统将键入的、手写的或印刷的文本检测为机器编码的文本的能力,无论该文本是来自扫描的文档、文档的照片、标志还是照片中显示的其他类型的文本。它目前是一个热门话题,因为许多“老”机构(如政府机构、银行或保险)都致力于将所有文档(如可能包含印刷和手写字符的印刷合同)数字化。通常,OCR 可以分为两组:
- HCR :手写字符识别
- PCR :印刷字符识别
HCR 往往比 PCR 更具挑战性,原因很明显:大多数人的笔迹令人困惑。这种差异在我们体验的结果中也是显而易见的。
第一个失望:使用 AWS Textract 的 OCR
黑客马拉松旨在比较 AWS、谷歌视觉和微软 Azure 的人工智能服务在光学字符识别方面的表现。在 AWS 的一个数据工程项目中有了成功的经验,我选择了加入 AWS AI 服务团队。我很兴奋,期待亚马逊再次展示其世界领先的性能。以下是亚马逊对这项服务的承诺:
Amazon Textract 是一项从扫描的文档中自动提取文本和数据的服务。Amazon Textract 超越了简单的光学字符识别(OCR ),还可以识别表单中的字段内容和存储在表格中的信息。
示例发票上的 AWS Textract 结果(印刷字符识别)
由于 PCR 似乎是 Textract ( 扫描文件)的重点,我用我能在网上找到的一份发票样本进行了尝试。事实上,结果相当准确,除了一些拼写错误的单词。
Mnist 数据集的 AWS 文本摘要结果
由于 Textract 应该“超越 OCR ”,我希望它也能处理手写文本,比如众所周知的 MNIST 数据集。不幸的是,我错了。Textract 在手写字符识别方面做得很糟糕。
然而,Textract 似乎更像是一个 PCR 服务,而不是我们所期望的完整的 OCR 服务。然而,这就像三天前你在网站上订购了一台咖啡机,亚马逊却推荐给你另一台一样令人失望。
为了弄清楚我是错过了什么还是在 AWS 中选择了错误的服务,我进一步研究了云提供商的 OCR 选项。这时我发现 Rekognition 也应该检测文本。如果 Rekognition 是为了处理手写作业而创建的呢?
第二个失望:使用 AWS Rekognition 的 OCR
事实上,AWS Rekognition 也被认为擅长检测图片上的文本。亚马逊声称:
文本检测是 Amazon Rekognition 的一项功能,允许您检测和识别图像或视频中的文本,如街道名称、标题、产品名称、叠加图形、视频字幕和车辆牌照。文本检测专门用于处理真实世界的图像和视频,而不是文档图像。
同样,没有明确提到手写文本,但我不得不尝试一下。
同一 MNIST 数据集上自动气象站识别中的文本检测结果
结果比 Textract 提供的要好得多,尽管我们可以期待更好的结果。许多数字被误认为是字母,没有一行被完全准确地检测到(第 5 行几乎被检测到,但不知何故数字 2 根本没有被检测到)。令人惊讶的是,虽然我们预计亚马逊会提供出色的性能,但我的同事们发现,在 MNIST 数据集等手写内容上,谷歌视觉和微软 Azure 的表现优于 AWS(尽管我没有他们的结果来证明这一点)。
那么目标检测和名人识别呢?
为了克服 AWS 中的 OCR 所带来的失望,同时为了确保我们不会(再次)错过能够更好地执行此任务的服务,我们研究了 AWS 提供的其他服务。正如我在上面简要提到的,AWS Rekognition 服务的主要目的是检测目标,但它也可以识别成千上万的名人,在体育,政治等。由于我们在 OCR 上找不到其他服务,为了给自己留点娱乐,我们在 Rekognition 上尝试了名人识别选项。
第三个失望:亨利·卡维尔,《女巫》(The Witcher)和一个金发足球运动员。
AWS Rekognition 承认亨利·卡维尔。最初的照片来自托马斯·桑森/法新社 Getty Images
就像世界上其他成千上万的人一样,我最近在疯狂地看了《The Witcher》之后,成了亨利·卡维尔的超级粉丝。好的故事,好看的演员,魔术,龙,最重要的是,马(主要是罗奇,但至关重要的故事)。我完全被说服了。无论如何,当我们发现了名人识别软件,我的第一个想法是看看它是否会承认亨利·卡维尔是…嗯,亨利·卡维尔。没什么好惊讶的,确实如此!(耶,一个准确的探测!).
在第二个例子中,我想挑战这个系统,看看它是否能把巫师 T4 认出来,也就是亨利·卡维尔。老实说,我没想到它会起作用。他的头发颜色完全不同,长度也完全不同,眼睛颜色也不一样,他的脸甚至还做了额外的修饰,使它看起来更瘦更白。这对于一款人工智能车型来说是不公平的竞争,即便它的动力来自于巨头亚马逊。然而,我绝对没有准备好这个结果…
AWS Rekognition 把 Witcher 误认为塞尔维亚足球运动员。首张照片来自卡塔林凡尔纳/网飞
杜三·巴斯塔(见下文)是塞尔维亚的一名国际足球运动员,他和亨利·卡维尔和 The Witcher 没有任何关系(除了他是金发和长头发)。公平地说,我想被娱乐,我得到了一个很好的笑了这个。
杜三·巴斯塔,足球运动员,(据 AWS 报道)新任命的 Witcher
我把这项服务用在了《The Witcher》中亨利·卡维尔的其他几张照片上,脸上的照明效果更好,相机的角度也更好。在这些案例中,既没有名人面孔被认出,也没有发现塞尔维亚足球运动员。
另一张巫师的照片上写着“不认识任何名人”。最初的照片来自卡塔琳·凡尔纳/网飞
总之,我不认为 AWS 人工智能服务不可用,但与其他云提供商相比,它们在 OCR 方面肯定落后。这些结果对于手写字符识别来说是不够准确的,并且当检测扫描文档(PCR)中的文本时仍然可以改进。然而,我查询了几次 API,它检测文本的速度是惊人的。API 的可用性也是一个很大的优势。免费层允许每月分析 5000 张图像,之后,每张图像的价格仍然非常实惠,为每张图像 0.001 美元。
最重要的是,我必须承认名人识别服务是一个有趣的工具。同样有趣的是,当一个男人留着长长的金发时,人们很容易被弄糊涂。因为我相信我们只是触及了可能性的表面,所以我会很高兴地收到关于 AWS 服务的建议,无论是对其性能、结果还是任务的娱乐性而言,这些服务都是有趣的。
如果你喜欢这篇文章,请关注我的 Medium 和Twitter,以便在新文章发布时获得通知。
许多人希望有不同的职业道路,并希望过渡到数据科学家的职位,但这只是一个…
towardsdatascience.com](/how-to-make-a-successful-switch-to-a-data-science-career-537e55469af8) [## 向任何人解释版本控制的简单故事
让我们一起盖房子吧…用 git。
towardsdatascience.com](/a-simple-story-to-explain-version-control-to-anyone-5ab4197cebbc)
DiscoBERT:缩短你阅读时间的 BERT
使用 BERT 来总结那些你不想阅读的长文档
布雷迪·贝里尼在 Unsplash 上的照片
现在,世界联系如此紧密,我们不断受到来自各种不同来源的信息的轰炸,这可能会令人不知所措。社交媒体也改变了信息呈现给我们的方式,Instagram 和 Pinterest 等应用程序主要关注视觉内容,而不是文本。这使得当我们不得不阅读大段文字时,它就不那么吸引人了。
但是,如果这些大篇幅的文本可以转换成仅仅是关键点的摘要,那会怎么样呢?机器学习再次拯救了我们。
多年来,摘要一直是自然语言处理社区感兴趣的任务,有两种广泛使用的方法:抽象和提取。抽象方法侧重于理解整个文本并一次生成一个单词的摘要。另一方面,抽取式摘要侧重于从文本中选择重要信息(通常是句子),并将它们拼接在一起形成摘要。
抽象的摘要通常比提取的模型更简洁,但可能在语法上不正确,因为基于概率生成单词不是编写摘要的最直观的方式。然而,这两种方法都有一个共同的问题。他们无法跟踪文档中的长期上下文。例如,如果一篇新闻文章在第一段谈到了利奥·梅西,在第四段又提到了他,这两种方法都很难将这些提及的上下文联系起来。对于抽象模型(主要是 Seq2Seq 模型),这是因为 Seq2Seq 模型比其他模型更重视最近的单词,而提取模型通常意味着几个句子或一个段落,而不是整个文档。
微软 Dynamics 365 AI Research 的研究人员旨在通过提出他们自己的模型来改进这些摘要技术,用于文本提取的话语感知 BERT(disco BERT)。这个名字透露了一个事实,即它是一个提取模型,但有一个扭曲。与其他提取模型不同,DiscoBERT 提取基本话语单元 ( EDUs ,它们是句子的一部分),而不是句子用于其摘要。这有助于生成的摘要简洁,因为整个句子可能包含一些 EDUs 中不存在的无关信息。
它还通过创建文档的两个不同的图来解决长期上下文问题。第一张图,RST 图,是基于修辞结构理论。这一理论声称,文本的结构可以归结为一棵树的独立单元。以类似的方式,RST 图试图分析这些单位之间的依赖关系,并确定它们在句子中的作用。第二张图,共指图,着重于建立对贯穿全文讨论的关键实体(人、组织等)、事件和主题的理解。
通过这两个图表,DiscoBERT 了解了文本的重要区域是什么,并在此基础上对 edu 进行了排序。为了生成摘要,DiscoBERT 选择排名前 N 的 edu(也考虑了依赖关系)并按时间顺序将它们缝合在一起。
研究人员通过在两个新闻数据集上运行 DiscoBERT 来验证它,一个由来自纽约时报的文章组成,另一个来自 CNN 和 DailyMail,它们需要一个模型来总结每篇文章。DiscoBERT 在这两个数据集上实现了新的最先进的性能。
"大多数行业新闻应用在新闻推荐方面做得很好,但我们希望以一种更高效、更容易理解的方式发布新闻。微软动态 365 人工智能研究院高级首席研究经理刘晶晶说,他负责监督这个项目。所以,下次当你坐公交车想快速浏览每日新闻时,让 DiscoBERT 来帮你吧!
如果你想了解更多关于 DiscoBERT 的信息,这里有一个链接到论文,如果你想尝试训练它总结你的故事、报告等等,这里有一个链接到代码,点击这里查看更多我们的出版物和其他工作。
参考文献
1.威廉·C·曼和桑德拉·A·汤普森,1988,修辞结构理论:走向语篇组织的功能理论,《语篇研究的语篇跨学科期刊》,8(3):243–281。
2.徐,贾成,柘淦,于成,,话语感知的神经抽取文本摘要,计算语言学协会第 58 届年会论文集,第 5021–5031 页。2020.
使用 CloudWatch 警报、SNS 和 AWS Lambda 的不一致通知
由 Khadeeja Yasser 在 Unsplash 上拍摄的照片
警报的存在是为了在我们的系统以一种意外的方式运行时通知我们*,这保证了手动干预来纠正*。当我们在一个生产环境中有多个系统而一个错误没有被注意到时,后果可能是灾难性的。
当系统无法自动恢复,需要人工干预时,应发出警报。如果警报发生得过于频繁,可能会导致更长的响应时间,甚至被遗漏。
在本文中,我们将为 AWS Lambda 函数构建一个警报通知管道。为此,将使用 3 个 AWS 服务:AWS Lambda、简单通知服务(SNS)和 CloudWatch。目标是在触发 CloudWatch 警报时向不和谐频道发送通知。
使用 Lucidchart 设计:https://www.lucidchart.com
步骤 1 —云监控警报
选择指标
首先,您需要选择一个 CloudWatch 指标来观察警报。对于 Lambda 函数,有 3 种类型的指标:
- 调用度量:调用结果的二进制指示器。例子:调用,错误,死信错误,目的交付失败,节流。
- 性能指标:单次调用的性能细节。如:时长、迭代器。
- 并发度量:跨函数、版本、别名或 AWS 区域处理事件的实例数量的总数。示例:并发执行、ProvisionedConcurrentExecutions、ProvisionedConcurrencyUtilization、UnreservedConcurrentExecutions。
你可以在 AWS 开发者指南中阅读更多关于 AWS Lambda 指标的细节。
在这个例子中,我们将监控错误度量,即导致函数错误的调用次数。
图表度量
接下来,您需要为指定时间段内的数据聚合选择统计,即应用上面定义的度量的统计:样本计数、平均值、总和、最小值、最大值。我们将使用总和。
变量 period 表示应用上述统计数据的时间,单位为秒。我们将它设置为 **60s。**数据与指定阈值进行比较的周期数将被设置为 1,因为我们希望我们的错误指标仅在 1 分钟的间隔内进行评估。
情况
最后,您需要设置比较运算符,这是在比较指定的统计数据和阈值时使用的算术运算。支持的条件:
- GreaterThanOrEqualToThreshold
- 更大的阈值
- 小于阈值
- LessThanOrEqualToThreshold
我们将使用条件: GreaterThanThreshold ,阈值为 0 。
通知
正如本文开头提到的,CloudWatch 警报将触发一个 SNS 主题来通知警报何时处于ALARM
状态。
地形代码
下面的代码包含了上面讨论的所有设置。它还包含一些这里不会讨论的附加设置。您可以看到,我在变量alarms_actions
中添加了我们将在下一节中创建的 SNS 的 ARN,这意味着当 SNS 转换到ALARM
状态时,该警报将触发 SNS。
上面的代码允许您创建任意数量的 CloudWatch 警报。您只需编辑local.alarms_dimensions
:
步骤 2 —简单通知服务(SNS)
来自 AWS 文档:
Amazon Simple Notification Service(Amazon SNS)是一种 web 服务,用于协调和管理向订阅端点或客户端发送消息。它使您能够通过发布/订阅(发布/订阅)模式在系统之间进行通信
我们的 SNS 需要向 Lambda-Alarm 发布消息,然后 Lambda-Alarm 会向 Discord 通道发送一条自定义消息。
地形代码
在下面的代码中,我们为 SNS 主题订阅了 Lambda-Alarm,并在endpoint
参数中传递了 lambda ARN。
第 3 步—λ警报
当被 SNS 主题触发时,该 Lambda 将使用以下消息格式向不和谐频道发送警报:
不和谐频道截图
不和谐的网钩
首先,您需要在所需的频道中创建一个 Webhook。在编辑频道页面,你将进入整合,以及创建 Webhook。
不和谐频道设置截图
然后,您将复制 Webhook URL 并将其粘贴到您的 Lambda 代码中。
λ代码
下面的代码非常直观,不需要过多解释。你可以在 Discord 的开发者门户上获得关于通道对象的更多信息。
结论
在本文中,我们使用 CloudWatch Alarms、SNS 和 AWS Lambda 构建了一个警报通知系统。当我们的 lambda 中出现错误时,我们将在 Discord 通道中收到一条消息。
当然,您可以将 Lambda 警报与除 Discord 之外的其他服务集成在一起,例如:
- 任何电子邮件服务:Gmail,Outlook,雅虎等
- 松弛的
- 微软团队
你可以在这里查看完整代码!
参考
[## 基于静态阈值创建云观察警报
您为要观察的警报选择一个 CloudWatch 指标,以及该指标的阈值。警报进入警报状态…
docs.aws.amazon.com](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ConsoleAlarms.html) [## Discord 开发者门户-面向机器人和开发者的 API 文档
将你的服务与不和谐融为一体——无论是机器人、游戏还是你能想到的任何东西…
discord.com](https://discord.com/developers/docs/resources/channel#embed-limits) [## 使用 AWS Lambda 函数度量
当您的函数处理完一个事件时,Lambda 会将关于调用的指标发送到 Amazon CloudWatch。你…
docs.aws.amazon.com](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-metrics.html) [## 地形注册表
编辑描述
registry.terraform.io](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_metric_alarm)
使用 Python 探索 3D 点云处理
3D Python
教程简单地设置您的 python 环境,开始处理和可视化 3D 点云数据。重点介绍 Anaconda、NumPy、Matplotlib 和 Google Colab。
设置 python 环境的 5 步指南
- 我们需要建立我们的环境。我推荐下载 Anaconda Navigator ,它有一个简单的 GUI。
- 下载并安装后,创建一个环境(左边的第二个选项卡> create 按钮),它允许您指定 python 版本(最新版本即可)。当绿色箭头出现在它旁边时,您就知道它被选中了。
anaconda GUI——通过具有不同库/ Python 版本的环境管理独立项目
- 创建后,您可以链接所需的库,而不会发生冲突。非常得心应手!为此,只需在已安装的软件包中搜索软件包(如 NumPy,Matplotlib),如果没有弹出,则选择未安装,选中它们并单击应用安装它们。Numpy 和 Matplotlib 是标准库,将对这个项目和未来的项目有用。
在 conda 库包管理器中搜索库
- 您已经差不多设置好了,现在回到 Anaconda Home 选项卡,确保您处于正确的环境中(XXX 上的应用程序),然后您可以安装 Spyder 作为 IDE(集成开发环境)来启动您的代码项目。
🤓 注 : Spyder 对于任何初学 python 编码的业余爱好者来说都是最好的工具之一。另一个很棒的工具是 Jupyter,它可以很好地将交互式代码呈现给高层管理人员,以实现更好的可视化。我们将在以后的文章中探讨这一点以及 Google Colab。
- 一旦安装进度条完成,你就准备好了!您现在可以启动 Spyder 了。虽然 GUI 可能允许几种可能性,但要直接获得结果,首先要编写您的脚本(1),执行您的脚本(2)并在控制台中探索并与结果交互(3)。
Spyder Python 界面的 3 个基本元素
下载您的点云数据集
对于未来的实验,我们将使用一个采样点云,您可以从这个库免费下载。如果想在不安装任何东西的情况下提前可视化,可以查看 webGL 版本。
哥本哈根 Glyptotek 博物馆雕像的 3D 点云,用摄影测量法重建。数据集的获取扩展了本文的范围,将在另一篇文章中讨论。如果你想学习这些技术,你可以参观地理数据学院和三维重建器。
编队学习先进的点云处理和三维自动化。开发新的 python 地理数据技能和开源…
learngeodata.eu](https://learngeodata.eu/point-cloud-processor-formation/)
你的第一行代码
在 Sypder 中,让我们从使用一个非常强大的库开始:NumPy。您已经可以在脚本区域(左侧窗口)编写您的第一个短代码了:
1 import numpy as np
2 file_data_path=”E:\sample.xyz”
3 point_cloud= np.loadtxt(file_data_path, skiprows=1, max_rows=1000000)
此短代码(1)导入库 NumPy 以进一步用作短名称“NP”;(2)创建保存指向包含点的文件的字符串的变量;(3)将点云作为名为 point_cloud 的变量导入,跳过第一行(例如,保存点数),并设置运行测试的最大行数,而不会出现内存短缺。
现在,您可以运行您的脚本(绿色箭头),并在弹出窗口出现时将其保存为硬盘上的. py 文件。现在,您可以通过直接在控制台中写入以下内容来访问保存数据的实体的第一个点(point_cloud):
In: point_cloud[0]
然后,您将获得一个包含第一个点的内容的数组,在本例中是 X、Y 和 Z 坐标。
Out: array([0.480, 1.636, 1.085])
这是你使用 python 和点云的第一步。现在您已经知道如何加载点数据,让我们来看看一些有趣的过程。
提取所需的属性
我们有一个具有 6 个属性的点云:X,Y,Z,R,G,b。需要注意的是,当使用 NumPy 数组时,索引总是从 0 开始。因此,如果加载时没有字段名,那么获取第二个点就完成了:
In: point_cloud[1]
Out: array([0.480, 1.636, 1.085, 25, 44, 68])
如果我们想从那里获得红色®属性(NumPy“列”的索引是 3),我们可以这样做:
In: point_cloud[1][3]
Out: 25
如果我们想要提取点云中所有点的 Z 属性:
In: point_cloud[:,1]
Out: array([2.703, 2.716, 2.712, …, 2.759, 2.741, 2.767])
如果我们只想提取所有点的 X,Y,Z 属性:
In: point_cloud[:,:3]
Out: array([[4.933, 2.703, 2.194],
[4.908, 2.716, 2.178],
[4.92 , 2.712, 2.175],
…,
[5.203, 2.759, 0.335],
[5.211, 2.741, 0.399],
[5.191, 2.767, 0.279]])
恭喜你,你刚刚玩了多维索引👏。注意,在上面的例子:3]
中,第三列®被排除在选择之外。如果需要多次使用,每个结果都可以存储在变量中:
xyz=point_cloud[:,:3]
rgb=point_cloud[:,3:]
基于属性的数据分析
现在让我们来看一些有用的分析。如果你想知道你的点云的平均高度,你可以很容易地做到:
In: np.mean(point_cloud,axis=0)[2]
Out: 2.6785763
💡 提示: 这里将轴设置为 0 是要求独立查看每个“列”。如果忽略,则对所有值求平均值,如果设置为 1,将对每行求平均值。
如果现在您想要提取距离平均高度 1 米以内的点(我们假设该值存储在 mean_Z 中):
In: point_cloud[abs( point_cloud[:,2]-mean_Z)<1]
Out: array([…])
💡 提示: 在 python 中,以及一般的编程中,解决一个问题的方法不止一种。提供的是一种非常简短有效的方法,可能不是最直观的。尝试使用 for 循环来解决它是一个很好的练习。这样做的目的是在清晰度和效率之间取得良好的平衡,参见 PEP-8 指南 。
现在您知道如何设置您的环境,使用 Python、Spyder GUI 和 NumPy 进行编码工作。你可以加载点云并玩属性,但你可以尝试其他场景,如颜色过滤,点邻近…
基本 3D 可视化
对于这第一次 3D 点云绘图体验,我们将得到一个基本的库:Matplotlib。首先,我们将在初始脚本的导入部分添加包,以允许我们使用它们:
1 import numpy as np
2 import matplotlib.pyplot as plt
3 from mpl_toolkits import mplot3d
导入的依赖项的作用如下:
- 你已经知道这个了😉
matplotlib.pyplot
处理绘图mpl_toolkits.mplot3d
允许创建 3d 投影
从这里,我们可以添加之前探索过的代码:
4 file_data_path=”E:\sample.xyz”
5 point_cloud= np.loadtxt(file_data_path,skiprows=1)
6 mean_Z=np.mean(point_cloud,axis=0)[2]
7 spatial_query=point_cloud[abs( point_cloud[:,2]-mean_Z)<1]
8 xyz=spatial_query[:,:3]
9 rgb=spatial_query[:,3:]
🤓 注意 :我们通常会在编码时尝试增强可读性,如果你想要更好的指导方针,那么PEP-8是一个很好的资源。理想情况下,变量名应该小写,单词之间用下划线隔开。
你得到的是 4 个变量(xyz 和 rgb),基于空间查询过滤初始点云。现在让我们深入了解如何简单地绘制结果。首先,让我们创建一个 3d 轴对象。为此,我们将projection='3d'
传递给plt.axes
,后者返回一个Axes3DSubplot
对象。
10 ax = plt.axes(projection='3d')
这是我们将要绘画的空白画布。然后我们将绘制一个散点图,我们想给每个点分配一种颜色。这可能是一个非常繁琐的过程,下面的代码行简化了这一过程
11 ax.scatter(xyz[:,0], xyz[:,1], xyz[:,2], c = rgb/255, s=0.01)
如你所见,我们通过xyz[:,0]
、xyz[:,1]
、xyz[:,2]
将坐标 x、y、z 传递给函数;通过标准化到[0:1]间隔除以最大值,每个点的颜色通过c = rgb/255
;通过s = 0.01
显示屏幕上各点的尺寸。
最后,我们可以使用下面的命令绘制图表,并欣赏可视化效果:
12 plt.show()
💡 提示 :在 Spyder 4.1.2 及以上版本中,您可以在变量资源管理器窗口的 graph 选项卡中访问您的绘图,默认情况下会创建图像。如果你想创建一个交互式可视化,在启动脚本之前,键入 %matplotlib auto
切换到“自动”(即交互式)绘图。
完整的脚本可以在这里获得,并且可以在 Google Colab 上远程执行。
结论
您刚刚学习了如何导入、处理和可视化由数百万个点组成的点云,只需 12 行代码!干得好的👏。但这条路并没有到此为止,未来的帖子将深入点云空间分析、文件格式、数据结构、可视化、动画和网格划分。我们将特别关注如何管理大点云数据,如下面的文章中所定义的。
被称为点云的离散空间数据集通常为决策应用奠定基础。但是他们能不能…
towardsdatascience.com](/the-future-of-3d-point-clouds-a-new-perspective-125b35b558b9)
我的贡献旨在浓缩可操作的信息,以便您可以从零开始为您的项目构建 3D 自动化系统。你可以从今天开始在地理数据学院参加一个编队
编队学习先进的点云处理和三维自动化。开发新的 python 地理数据技能和开源…
learngeodata.eu](https://learngeodata.eu/point-cloud-processor-formation/)
3 向数据科学文章推荐
如果你有时间,我认为这些额外的资源值得一读,如果你曾经分别被 NumPy、Matplotlib 或者如果你在 Mac 上编码所困扰的话。
开始使用 NumPy 需要知道的一切
towardsdatascience.com](/the-ultimate-beginners-guide-to-numpy-f5a2f99aef54) [## 为赶时间的人准备的 Matplotlib 指南
Matplotlib 是一个常用的绘图库,但有时很难绘制自定义的绘图。这篇文章是一篇…
towardsdatascience.com](/all-your-matplotlib-questions-answered-420dd95cb4ff) [## 如何在 Mac 上成功安装 Anaconda(并让它实际工作)
正确安装 Anaconda 和修复可怕的“找不到 conda 命令”错误的快速而简单的指南
towardsdatascience.com](/how-to-successfully-install-anaconda-on-a-mac-and-actually-get-it-to-work-53ce18025f97)