

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 分析和可视化
<a name="data-wrangler-analyses"></a>

Amazon SageMaker Data Wrangler 包含内置分析，只需点击几下即可帮助您生成可视化和数据分析。您还可以使用自己的代码创建自定义分析。

通过在数据流中选择一个步骤，然后选择**添加分析**，可以将分析添加到数据框中。要访问您创建的分析，请选择包含该分析的步骤，然后选择分析。

所有分析都是使用包含 10 万行数据的数据集生成的。

您可以将以下分析添加到数据框中：
+ 数据可视化，包括直方图和散点图。
+ 数据集的快速摘要，包括条目数、最小值和最大值（对于数字数据）以及最频繁和最少的类别（对于分类数据）。
+ 数据集的快速模型，可用于为每个特征生成重要性得分。
+ 目标泄漏报告，您可以使用该报告来确定一个或多个特征是否与目标特征密切关联。
+ 使用自己的代码进行自定义可视化。

可通过以下部分了解有关这些选项的更多信息。

## 直方图
<a name="data-wrangler-visualize-histogram"></a>

使用直方图可以查看特定特征的特征值计数。您可以使用**着色方式**选项检查特征之间的关系。例如，以下直方图显示了 2009-2019 年亚马逊畅销书的用户得分分布情况，按类型着色。

![\[Data Wrangler 管理控制台中的柱状图表示例。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/studio/mohave/histogram.png)


您可以使用**划分方式**功能为一个列中的每个值创建另一个列的直方图。例如，下图显示了用户对亚马逊上畅销书的评论的直方图（如果按年份划分）。

![\[Data Wrangler 管理控制台中的柱状图示例。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/studio/mohave/review_by_year.png)


## 散点图
<a name="data-wrangler-visualize-scatter-plot"></a>

使用**散点图**功能可以检查各特征之间的关系。要创建散点图，请选择要在 **X 轴**和 **Y 轴**上绘制的特征。这两列都必须是数字类型的列。

您可以通过额外的列为散点图着色。例如，以下示例显示了一个散点图，该散点图将 2009 年至 2019 年间亚马逊上畅销书的评论数量与用户得分进行了比较。散点图按书籍类型着色。

![\[Data Wrangler 管理控制台中的散点图示例。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/studio/mohave/scatter-plot.png)


此外，您还可以按特征划分散点图。例如，下图显示了按年份划分的相同评论与用户得分散点图的示例。

![\[Data Wrangler 管理控制台中的分面散点图示例。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/studio/mohave/scatter-plot-facet.png)


## 表摘要
<a name="data-wrangler-table-summary"></a>

使用**表摘要**分析可以快速总结数据。

对于包含数值数据（包括日志和浮点数据）的列，表摘要会报告每列的条目数 (count)、最小值 (min)、最大值 (max)、均值和标准差 (stddev)。

对于包含非数值数据的列，包括带有字符串、布尔值或 date/time 数据的列，表格摘要会报告条目数（计数）、频率最低的值（最小值）和最频繁的值（最大值）。

## 快速模型
<a name="data-wrangler-quick-model"></a>

使用**快速模型**可视化可以快速评估数据并为每个特征生成重要性得分。一个[特征重要性得分](http://spark.apache.org/docs/2.1.0/api/python/pyspark.ml.html#pyspark.ml.classification.DecisionTreeClassificationModel.featureImportances)指明特征在预测目标标签方面的有用性。特征重要性得分介于 [0, 1] 之间，数字越高表示该特征对整个数据集更重要。在快速模型图表的顶部，有一个模型得分。分类问题显示 F1 得分。回归问题有均方差 (MSE) 得分。

创建快速模型图表时，您可以选择要评估的数据集，以及要比较特征重要性的目标标签。Data Wrangler 会执行以下操作：
+ 推断目标标签的数据类型以及所选数据集内的每个特征的数据类型。
+ 确定问题类型。根据标签列中不同值的数量，Data Wrangler 确定这是回归还是分类问题类型。Data Wrangler 将分类阈值设置为 100。如果标签列中存在超过 100 个不同的值，Data Wrangler 会将其归类为回归问题；否则，会将其归类为分类问题。
+ 预处理特征和标签数据以供训练。所使用的算法要求将特征编码为向量类型，将标签编码为双精度类型。
+ 使用 70% 的数据训练随机森林算法。Spark [RandomForestRegressor](https://spark.apache.org/docs/latest/ml-classification-regression.html#random-forest-regression)'s 用于训练回归问题的模型。[RandomForestClassifier](https://spark.apache.org/docs/latest/ml-classification-regression.html#random-forest-classifier)用于训练模型以解决分类问题。
+ 使用剩余 30% 的数据评估随机森林模型。Data Wrangler 使用 F1 得分评估分类模型，并使用 MSE 得分评估回归模型。
+ 使用基尼重要性方法计算每个特征的特征重要性。

下图显示了快速模型特征的用户界面。

![\[Data Wrangler 管理控制台中快速模型功能的用户界面示例。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/studio/mohave/quick-model.png)


## 目标泄漏
<a name="data-wrangler-analysis-target-leakage"></a>

当机器学习训练数据集内存在与目标标签密切相关但在真实世界数据中不可用的数据时，就会发生目标泄漏。例如，您的数据集内可能有一列作为您要在模型中预测的列的代理。

使用**目标泄漏**分析时，可以指定以下内容：
+ **目标**：这是您希望机器学习模型能够预测的特征。
+ **问题类型**：这是您正在处理的 ML 问题类型。问题类型可以是**分类**，也可以是**回归**。
+  （可选）**最大特征数**：这是要在可视化中显示的最大特征数，它显示了按目标泄漏风险排序的特征。

为了进行分类，目标泄漏分析使用接收者操作特征下的区域，或者对每一列使用 AUC - ROC 曲线，直到达到**最大特征数**。对于回归，使用确定系数或 R2 指标。

AUC - ROC 曲线提供了一个预测指标，该指标使用交叉验证为每列单独计算，样本最多约为 1000 行。得分为 1 表示完美的预测能力，这通常表示目标泄漏。得分为 0.5 或更低，表明该栏中的信息本身无法提供预测目标的任何有用信息。尽管一列本身可能无法提供信息，但与其他特征一起使用时可用于预测目标，但如果得分较低，可能表示该特征是多余的。

例如，下图显示了糖尿病分类问题的目标泄漏报告，即预测一个人是否患有糖尿病。AUC - ROC 曲线用于计算五个特征的预测能力，所有特征都被确定为不受目标泄漏的影响。

![\[Data Wrangler 管理控制台中的目标泄漏报告示例。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/studio/mohave/target-leakage.png)


## 多重共线性
<a name="data-wrangler-multicollinearity"></a>

多重共线性是指两个或多个预测变量相互关联的情况。预测变量是数据集内用来预测目标变量的特征。当您具有多重共线性时，预测变量不仅可以预测目标变量，还可以相互预测。

您可以使用**方差膨胀系数 (VIF)**、**主成分分析 (PCA)** 或 **Lasso 特征选择**作为数据中多重共线性的度量。有关更多信息，请参阅下列内容。

------
#### [ Variance Inflation Factor (VIF) ]

方差膨胀系数 (VIF) 是衡量变量对之间共线性的指标。Data Wrangler 返回一个 VIF 得分，以此来衡量变量彼此之间的紧密关系。VIF 得分是一个大于等于 1 的正数。

得分为 1 表示该变量与其他变量不相关。得分大于 1 表示相关性更高。

理论上，您可以获得一个值为无穷大的 VIF 得分。Data Wrangler 将高得分限制为 50。如果您的 VIF 得分大于 50，则 Data Wrangler 会将得分设置为 50。

您可以使用以下准则来解释 VIF 得分：
+ VIF 得分小于或等于 5 表示变量与其他变量之间具有中度相关性。
+ VIF 得分大于或等于 5 表示变量与其他变量高度相关。

------
#### [ Principle Component Analysis (PCA) ]

主成分分析 (PCA) 测量数据在特征空间中沿不同方向的方差。特征空间由用于预测数据集内目标变量的所有预测变量构成。

例如，如果您想要预测谁在*泰坦尼克号皇家邮轮*撞上冰山后幸存下来，那么您的特征空间可以包括乘客的年龄、性别以及他们支付的票价。

PCA 从特征空间生成有序的方差列表。这些方差也称为奇异值。方差列表中的值大于或等于 0。我们可以使用这些值来确定我们的数据中存在多少多重共线性。

当数字大致相等时，数据中很少出现多重共线性情况。当值之间存在很多可变性时，我们就会有许多多重共线性情况。在执行 PCA 之前，Data Wrangler 会将每个特征标准化，实现平均值为 0，标准差为 1。

**注意**  
在这种情况下，PCA 也可以称为奇异值分解 (SVD)。

------
#### [ Lasso feature selection ]

Lasso 特征选择使用 L1 正则化技术，只包含数据集内预测性最高的特征。

对于分类和回归，正则化技术会为每个特征生成一个系数。系数绝对值为该特征提供了重要性得分。重要性得分越高，表示对目标变量的预测性越强。一种常见的特征选择方法是使用 lasso 系数为非零值的所有特征。

------

## 检测时间序列数据中的异常
<a name="data-wrangler-time-series-anomaly-detection"></a>

您可以使用异常检测可视化来查看时间序列数据中的异常值。要了解决定异常的因素，您需要明白，我们将时间序列分解为预测项和误差项。我们将时间序列的季节性和趋势视为预测项。我们将残差视为误差项。

对于误差项，您可以指定阈值，当残差远离平均值的偏差标准数达到该阈值时，便会将其视为异常。例如，您可以将阈值指定为 3 个标准差。任何距离平均值大于 3 个标准差的残差均为异常。

您可以使用以下步骤执行**异常检测**分析。

1. 打开 Data Wrangler 数据流。

1. 在您的数据流中，在**数据类型**下，选择 **\$1**，然后选择**添加分析**。

1. 对于**分析类型**，选择**时间序列**。

1. 对于**可视化**，选择**异常检测**。

1. 对于**异常阈值**，选择将某个值视为异常的阈值。

1. 选择**预览**以生成分析的预览。

1. 选择**添加**，将转换添加到 Data Wrangler 数据流中。

## 时间序列数据中的季节性趋势分解
<a name="data-wrangler-seasonal-trend-decomposition"></a>

您可以使用季节性趋势分解可视化，来确定时间序列数据中是否存在季节性。我们使用 STL（使用 LOESS 进行季节性趋势分解）方法进行分解。我们将时间序列分解为季节性、趋势和残差成分。这一趋势反映了该系列的长期进展。季节性成分是在一段时间内重复出现的信号。从时间序列中删除趋势和季节性成分后，您就获得了残差。

可以使用以下步骤执行**季节性趋势分解**分析。

1. 打开 Data Wrangler 数据流。

1. 在您的数据流中，在**数据类型**下，选择 **\$1**，然后选择**添加分析**。

1. 对于**分析类型**，选择**时间序列**。

1. 对于**可视化**，请选择**季节性趋势分解**。

1. 对于**异常阈值**，选择将某个值视为异常的阈值。

1. 选择**预览**以生成分析的预览。

1. 选择**添加**，将转换添加到 Data Wrangler 数据流中。

## 偏差报告
<a name="data-wrangler-bias-report"></a>

您可以使用 Data Wrangler 中的偏差报告，来发现数据中的潜在偏差。要生成偏差报告，必须指定要预测的目标列或**标签**，以及要检查偏差的**分面**或列。

**标签**：您希望模型进行预测的特征。例如，如果您在预测客户转化率，则可以选择一个列，其中包含客户是否已下订单的数据。您还必须指定此特征是标签还是阈值。如果指定标签，则必须指定数据中*积极结果*应该是什么样的。在买家转化示例中，积极结果可能是订单列中的 1，表示买家在过去三个月内下订单的积极结果。如果指定阈值，则必须指定定义积极结果的下限。例如，如果您的客户订单列包含去年下的订单数，则可能需要指定 1。

**分面**：您要检查偏差的列。例如，如果您尝试预测客户转化率，您的分面可能是客户的年龄。您之所以选择这个分面，是因为您认为自己的数据偏向于某个年龄组。您必须确定分面是以值还是阈值来衡量。例如，如果您希望检查一个或多个特定年龄，则可以选择**值**并指定这些年龄。如果想要查看某个年龄组，可以选择**阈值**，然后指定要检查的年龄阈值。

选择特征和标签后，可以选择要计算的偏差指标类型。

要了解更多信息，请参阅[为训练前数据中的偏差生成报告](https://docs.aws.amazon.com/sagemaker/latest/dg/data-bias-reports.html)。

## 创建自定义可视化
<a name="data-wrangler-visualize-custom"></a>

您可以向 Data Wrangler 流添加分析，来创建自定义可视化。您的数据集以及您应用的所有变换，都可以 [Pandas DataFrame](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html) 的形式提供。Data Wrangler 使用 `df` 变量来存储数据框。可以通过调用变量来访问该数据框。

必须提供输出变量 `chart`，以便存储 [Altair](https://altair-viz.github.io/) 输出图表。例如，您可以通过以下代码块，使用泰坦尼克号数据集创建自定义直方图。

```
import altair as alt
df = df.iloc[:30]
df = df.rename(columns={"Age": "value"})
df = df.assign(count=df.groupby('value').value.transform('count'))
df = df[["value", "count"]]
base = alt.Chart(df)
bar = base.mark_bar().encode(x=alt.X('value', bin=True, axis=None), y=alt.Y('count'))
rule = base.mark_rule(color='red').encode(
    x='mean(value):Q',
    size=alt.value(5))
chart = bar + rule
```

**要创建自定义可视化，请执行以下操作：**

1. 在包含要可视化的变换的节点旁边，选择 **\$1**。

1. 选择**添加分析**。

1. 对于**分析类型**，选择**自定义可视化**。

1. 在**分析名称**中指定名称。

1. 在代码框中输入您的代码。

1. 选择**预览**以预览可视化。

1. 选择**保存**以添加可视化。

![\[如何在 Data Wrangler 管理控制台中添加可视化示例。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/studio/mohave/custom-visualization.png)


如果您不知道如何在 Python 中使用 Altair 可视化包，可以使用自定义代码片段来协助您开始入手。

Data Wrangler 有一系列可搜索的可视化代码片段。要使用可视化代码片段，请选择**搜索示例代码片段**，然后在搜索栏中指定查询。

下面的示例使用**分仓散点图**代码片段，其中绘制了一个双维度直方图。

这些代码片段包含注释，有助于您了解需要对代码进行哪些更改。您通常需要在代码中指定自己的数据集的列名。

```
import altair as alt

# Specify the number of top rows for plotting
rows_number = 1000
df = df.head(rows_number)  
# You can also choose bottom rows or randomly sampled rows
# df = df.tail(rows_number)
# df = df.sample(rows_number)


chart = (
    alt.Chart(df)
    .mark_circle()
    .encode(
        # Specify the column names for binning and number of bins for X and Y axis
        x=alt.X("col1:Q", bin=alt.Bin(maxbins=20)),
        y=alt.Y("col2:Q", bin=alt.Bin(maxbins=20)),
        size="count()",
    )
)

# :Q specifies that label column has quantitative type.
# For more details on Altair typing refer to
# https://altair-viz.github.io/user_guide/encoding.html#encoding-data-types
```