K 最近邻 (k-NN) 算法 - Amazon SageMaker
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

K 最近邻 (k-NN) 算法

Amazon SageMaker k 最近邻 (k-NN) 算法是一个基于索引的算法。它使用非参数化方法来进行分类或回归。对于分类问题,算法查询最接近采样点的 k 个点,并返回其分类最常用的标签作为预测标签。对于回归问题,算法查询最接近采样点的 k 个点,并返回其特征值的平均值作为预测值。

使用 k-NN 算法的训练过程有三个步骤:采样、维度缩减和索引构建。采样过程可减少初始数据集的大小,这样可放到内存中。对于维度缩减,算法将减少数据的特征维度,以便减少 k-NN 模型占用的内存和降低推理延迟。我们提供了两种维度缩减方法:随机投影和快速 Johnson-Lindenstrauss 变换。通常情况下,您可以对高维 (d > 1000) 数据集使用维度缩减,以避免“诅咒维度”,后者会损害随着维度增加而变得稀疏的数据的统计分析。k-NN 训练的主要目标是构建索引。该索引能够有效地查找尚未确定其值或分类标签的点与用于推理的 k 个最近点之间的距离。

k-NN 算法的输入/输出接口

SageMaker k-NN 支持训练和测试数据通道。

  • 对要采样并构建到 k-NN 索引中的数据使用训练通道

  • 使用测试通道可以向日志文件发送分数。分数按照每个小批量一行的方式列出:分数的 classifier 代表准确率,regressor 代表均方误差。

对于训练输入,k-NN 支持 text/csvapplication/x-recordio-protobuf 数据格式。对于输入类型 text/csv,第一个 label_size 列解释为相应行的标签向量。您可以使用文件模式或管道模式,针对格式为 recordIO-wrapped-protobufCSV 的数据训练模型。

对于推理输入,k-NN 支持 application/jsonapplication/x-recordio-protobuftext/csv 数据格式。text/csv 格式接受 label_size 和编码参数。它采用值为 0 的 label_size 和 UTF-8 编码。

对于推理输出,k-NN 支持 application/jsonapplication/x-recordio-protobuf 数据格式。这两种数据格式还支持详细输出模式。在详细输出模式中,API 为搜索结果提供从最小到最大排序的距离向量,以及标签向量中的对应元素。

对于批量变换,k-NN 支持对输入和输出使用 application/jsonlines 数据格式。示例输入如下所示:

content-type: application/jsonlines {"features": [1.5, 16.0, 14.0, 23.0]} {"data": {"features": {"values": [1.5, 16.0, 14.0, 23.0]}}

示例输出如下所示:

accept: application/jsonlines {"predicted_label": 0.0} {"predicted_label": 2.0}

有关输入和输出文件格式的更多信息,请参阅k-NN 训练输入的数据格式(对于训练)、k-NN 请求和响应格式(对于推理)和k-NN 示例笔记本

k-NN 示例笔记本

有关使用 SageMaker k 最近邻算法从地质和森林服务数据预测荒野覆盖类型的示例笔记本,请参阅 K 最近邻 Covertype

使用 Jupyter 笔记本实例运行 SageMaker 中的示例。要了解如何在 SageMaker 中创建和打开 Jupyter 笔记本实例,请参阅 使用 Amazon SageMaker 笔记本实例。创建笔记本实例并将其打开后,选择 SageMaker Examples (CloudWatch 示例) 选项卡以查看所有 SageMaker 示例笔记本的列表。在 Amazon 算法简介 部分中查找 K 最近邻笔记本。要打开笔记本,请单击其 Use (使用) 选项卡,然后选择 Create copy (创建副本)

k-NN 算法的 EC2 实例建议

使用 k-NN 算法进行训练的实例建议

开始时,尝试在 CPU 上运行训练,例如使用 ml.m5.2xlarge 实例;或者在 GPU 上运行,例如使用 ml.p2.xlarge 实例。

使用 k-NN 算法进行推理的实例建议

来自 CPUs 的推理请求通常具有比来自 GPUs 的请求更低的平均延迟,因为使用 GPU 硬件时会对 CPU 到 GPU 的通信产生税费。但是,对于GPUs较大的批处理, 通常具有更高的吞吐量。