提高亚马逊 Comprehend 中自定义分类模型的预测质量
提升亚马逊 Comprehend 自定义分类模型预测质量
人工智能(AI)和机器学习(ML)已经在企业和政府组织中广泛应用。自然语言处理(NLP)和用户友好的AI/ML服务(如Amazon Textract、Amazon Transcribe和Amazon Comprehend)的进步使得处理非结构化数据变得更加容易。组织机构已经开始使用像Amazon Comprehend这样的AI/ML服务构建带有非结构化数据的分类模型,以获得之前无法获得的深度洞见。尽管您可以使用预训练模型来获得最小的努力,但是如果没有适当的数据整理和模型调优,无法实现完整的AI/ML模型的优势。
在本文中,我们将解释如何使用Amazon Comprehend构建和优化自定义分类模型。我们使用Amazon Comprehend自定义分类来构建一个多标签自定义分类模型,并提供有关如何准备训练数据集和调整模型以满足准确性、精确度、召回率和F1分数等性能指标的指南。我们使用Amazon Comprehend模型训练输出结果中的混淆矩阵来调整模型性能,并指导您改进训练数据。
解决方案概述
该解决方案介绍了使用Amazon Comprehend构建优化的自定义分类模型的方法。我们经过多个步骤,包括数据准备,模型创建,模型性能指标分析和基于分析的推理优化。我们使用Amazon SageMaker notebook和AWS Management Console来完成其中的一些步骤。
我们还介绍了在数据准备、模型构建和模型调优过程中的最佳实践和优化技术。
先决条件
如果您没有SageMaker笔记本实例,可以创建一个。有关说明,请参阅创建Amazon SageMaker Notebook实例。
准备数据
在此分析中,我们使用来自Kaggle的有毒评论分类数据集。该数据集包含6个标签,共158,571个数据点。然而,每个标签只有不到10%的总数据作为正例,其中两个标签只有不到1%。
我们将现有的Kaggle数据集转换为使用管道(|)分隔标签的Amazon Comprehend两列CSV格式。Amazon Comprehend预期每个数据点至少有一个标签。在该数据集中,我们遇到了几个不属于任何提供的标签的数据点。我们创建了一个名为干净(clean)的新标签,并将那些不是有毒的数据点分配为该标签的正例。最后,我们按照80/20的比例将策划好的数据集分割成训练集和测试集。
我们将使用Data-Preparation notebook。以下步骤使用Kaggle数据集并为我们的模型准备数据。
- 在SageMaker控制台中,在导航窗格中选择Notebook instances。
- 选择您配置的笔记本实例,然后选择Open Jupyter。
- 在New菜单中,选择Terminal。
- 在终端中运行以下命令以下载此文章所需的工件:
cd SageMaker
wget https://aws-ml-blog.s3.amazonaws.com/artifacts/amazon-comprehend-improve-prediction-quality/comprehend-blog-artifacts.zip
unzip comprehend-blog-artifacts.zip
rm comprehend-blog-artifacts.zip
mkdir assets
- 关闭终端窗口。
您应该看到三个笔记本和 train.csv 文件。
- 选择笔记本 Data-Preparation.ipynb。
- 运行笔记本中的所有步骤。
这些步骤将准备原始的 Kaggle 数据集,用作策划的训练和测试数据集。策划的数据集将存储在笔记本和 亚马逊简单存储服务 (Amazon S3) 中。
在处理大规模多标签数据集时,请考虑以下数据准备准则:
- 数据集每个标签至少需要有10个样本。
- Amazon Comprehend 接受最多100个标签。这是一个可提高的软限制。
- 确保数据集文件以 正确格式 进行格式化,具有适当的分隔符。不正确的分隔符可能导致空白标签。
- 所有数据点必须有标签。
- 训练和测试数据集应具有每个标签的平衡数据分布。不要使用随机分布,因为它可能会给训练和测试数据集引入偏差。
构建自定义分类模型
我们使用在数据准备步骤中创建的策划的训练和测试数据集来构建我们的模型。以下步骤创建了一个 Amazon Comprehend 多标签自定义分类模型:
- 在 Amazon Comprehend 控制台上,选择导航窗格中的 自定义分类。
- 选择 创建新模型。
- 对于 模型名称,输入 toxic-classification-model。
- 对于 版本名称,输入 1。
- 对于 注释和数据格式,选择 使用多标签模式。
- 对于 训练数据集,输入策划的训练数据集在 Amazon S3 上的位置。
- 选择 提供的测试数据集,并输入策划的测试数据在 Amazon S3 上的位置。
- 对于 输出数据,输入 Amazon S3 的位置。
- 对于 IAM 角色,选择 创建 IAM 角色,将名称后缀指定为 “comprehend-blog”。
- 选择 创建 开始自定义分类模型的训练和模型创建。
以下屏幕截图显示了 Amazon Comprehend 控制台上的自定义分类模型详细信息。
调整模型性能
以下屏幕截图显示了模型性能指标。其中包括精确度、召回率、F1 分数、准确率等关键指标。
在模型训练和创建完成后,它将生成 output.tar.gz 文件,其中包含来自数据集的标签以及每个标签的混淆矩阵。为了进一步调整模型的预测性能,您需要了解每个类别的预测概率。为此,您需要创建一个分析作业,以识别 Amazon Comprehend 为每个数据点分配的分数。
完成以下步骤创建分析作业:
- 在 Amazon Comprehend 控制台上,选择导航窗格中的 分析作业。
- 选择 创建作业。
- 对于 名称,输入 toxic_train_data_analysis_job。
- 对于 分析类型,选择 自定义分类。
- 对于 分类模型和飞轮,指定 toxic-classification-model。
- 对于 版本,指定 1。
- 对于 输入数据 S3 位置,输入策划的训练数据文件的位置。
- 对于 输入格式,选择 每行文档一个。
- 对于 输出数据 S3 位置,输入位置。
- 对于 访问权限,选择 使用现有的 IAM 角色 并选择之前创建的角色。
- 选择 创建作业 开始分析作业。
- 选择 分析作业 查看作业详细信息。请记下作业详细信息下的作业 ID。我们将在下一步中使用作业 ID。
重复步骤开始分析作业的策划测试数据。我们使用分析作业的预测输出来了解模型的预测概率,请记下训练和测试分析作业的作业 ID。
我们使用Model-Threshold-Analysis.ipynb笔记本在所有可能的阈值上测试输出,并根据预测概率使用scikit-learn的precision_recall_curve
函数对输出进行评分。此外,我们可以计算每个阈值的F1分数。
我们需要Amazon Comprehend分析作业的作业 ID 作为Model-Threshold-Analysis笔记本的输入。您可以从Amazon Comprehend控制台获取作业 ID。执行Model-Threshold-Analysis笔记本中的所有步骤以观察所有类别的阈值。
请注意,随着阈值的增加,精确度也会增加,而召回率则相反。为找到两者之间的平衡,我们使用F1分数,在其曲线上可见峰值的位置。F1分数的峰值对应于可以提高模型性能的特定阈值。请注意,除了威胁标签的阈值约为0.04之外,大多数标签的阈值都在0.5左右。
然后我们可以使用这个阈值来对表现不佳的特定标签进行优化,因为默认的0.5阈值不能满足要求。通过使用优化阈值,模型在测试数据上对威胁标签的结果从0.00提高到了0.24。我们使用F1分数的最大值作为阈值的基准,以确定正面和负面的标签,而不是所有标签都使用常规基准值(像0.7以上)。
处理未平衡类别
对于不平衡的数据集来说,另一种有效的方法是过采样。通过对不平衡类别进行过采样,模型可以更经常地看到不平衡类别,并强调这些样本的重要性。我们使用Oversampling-underrepresented.ipynb笔记本来优化数据集。
对于这个数据集,我们测试了模型在评估数据集上的性能如何随着提供更多样本的而改变。我们使用过采样技术增加不平衡类别的出现次数以改善性能。
在这个特定案例中,我们测试了10、25、50、100、200和500个正例。请注意,虽然我们重复了数据点,但通过强调不平衡类别的重要性,我们在本质上改善了模型的性能。
成本
使用Amazon Comprehend时,您根据处理的文本字符数量付费。详细费用请参考Amazon Comprehend定价。
清理
在你完成尝试这个解决方案后,请清理你的资源,以删除在这个例子中部署的所有资源。这样可以避免在你的账户中持续发生费用。
结论
在本文中,我们提供了数据准备、使用预测概率进行模型调优以及处理少数类别数据的技巧的最佳实践和指导。您可以使用这些最佳实践和技巧来提高您的亚马逊Comprehend自定义分类模型的性能指标。
有关亚马逊Comprehend的更多信息,请访问亚马逊Comprehend开发者资源,以找到视频资源和博客文章,并参考AWS Comprehend常见问题。