了解如何生成文本分类项目
自定义文本分类项目是用于生成、训练、改进和部署分类模型的工作区。 可以通过两种方式处理项目:通过语言工作室和通过 REST API。 语言工作室是将在实验室中使用的 GUI,但 REST API 具有相同的功能。 无论喜欢哪种方法,开发模型的步骤都是相同的。
Azure AI 语言项目生命周期
- 定义标签:了解要分类的数据,确定要分类到的可能的标签。 在我们的电子游戏示例中,标签为“动作”、“冒险”、“策略”等。
- 标记数据:标记现有数据,并指定每个文件的标签。 标记数据非常重要,因为这是模型学习如何对将来文件进行分类的方式。 最佳做法是使标签之间具有明显的差异,以避免歧义,并提供每个标签的良好示例以供模型学习。 例如,我们会将“Quest for the Mine Brush”标记为“冒险”,将“Flight Trainer”标记为“动作”。
- 训练模型:使用标记的数据训练模型。 训练将教会模型应将各类型的电子游戏的摘要标记为哪种流派。
- 查看模型:模型训练完成后,查看模型的结果。 根据测试数据的精准率和召回率,在 0 到 1 之间对你的模型评分。 记下哪种流派的游戏表现不佳。
- 改进模型:通过查看哪些分类未能评估到正确的标签来改进模型,查看标签分布,并找出要添加哪些数据,从而提高性能。 例如,你可能会发现模型混合了“冒险”和“策略”游戏。 尝试找到每个标签的更多示例,将其添加到数据集,以重新训练模型。
- 部署模型:模型可以按预期运行后,部署模型,使其可通过 API 提供。 模型可能被命名为“GameGenres”,部署后可用于对游戏摘要进行分类。
- 对文本进行分类:使用模型对文本进行分类。 实验室介绍如何使用 API,并且你可以查看 API 参考
如何拆分数据集用于训练
标记数据时,可以指定希望每个文件所属的数据集:
- 训练 - 训练数据集用于实际训练模型;提供的数据和标签被输入到机器学习算法中,以教会模型将哪些数据分类到哪个标签。 训练数据集将是这两个数据集中较大的数据集,建议为大约 80% 的标记数据。
- 测试 - 测试数据集是标记数据,用于在完成训练后验证模型。 Azure 将获取测试数据集中的数据,将其提交给模型,并将输出与标记数据的方式进行比较,以确定模型的执行情况。 通过此比较可得出对模型的评分方式,并帮助你了解如何提高预测性能。
在“训练模型”步骤中,对于如何训练模型,有两个选项。
- 自动拆分 - Azure 获取所有数据,随机将其拆分为指定的百分比,并将其应用于模型训练。 如果数据集较大,数据自然更一致,或者数据分布广泛涵盖类,则此选项是最佳选择。
- 手动拆分 - 手动指定每个数据集中应包含的文件。 提交训练作业时,Azure AI 语言服务会告诉你数据集的拆分和分布。 此拆分最适合用于较小的数据集,可以确保提供类的正确分布和数据变化,从而正确训练模型。
若要使用自动拆分,请在标记数据时将所有文件放入训练数据集中(此选项为默认选项)。 若要使用手动拆分,请在数据标记期间指定哪些文件应位于测试数据集与训练数据集中。
部署选项
通过 Azure AI 语言,每个项目都可创建多个模型和多个部署,并且每一个都有自己唯一的名称。 优点包括可以执行以下操作:
- 并排测试两个模型
- 比较数据集拆分对性能的影响
- 部署模型的多个版本
注意
每个项目的部署名称上限为十个
在部署过程中,可以为部署的模型选择名称,然后可以在提交分类任务时选择该名称:
<...>
"tasks": [
{
"kind": "CustomSingleLabelClassification",
"taskName": "MyTaskName",
"parameters": {
"projectName": "MyProject",
"deploymentName": "MyDeployment"
}
}
]
<...>
使用 REST API
借助可用于 Azure AI 语言服务的 REST API,可按照 Language Studio 提供用户界面来生成项目的相同方式对 Azure AI 语言项目进行 CLI 开发。 在本模块的实验室中进一步探讨语言工作室。
使用 API 的模式
对于大多数调用,Azure AI 语言服务的 API 以异步方式运行。 在每个步骤中,我们首先向服务提交请求,然后通过后续调用与服务进行核对,从而获取状态或结果。
对于每个请求,都需要一个标头才能对请求进行身份验证:
密钥 | 值 |
---|---|
Ocp-Apim-Subscription-Key |
Azure AI 语言资源的密钥 |
提交初始请求
提交请求的 URL 因你所执行的步骤而异,但所有 URL 都以 Azure AI 语言资源提供的终结点为前缀。
例如,若要训练模型,需要为 URL 创建 POST,如下所示:
<YOUR-ENDPOINT>/language/analyze-text/projects/<PROJECT-NAME>/:train?api-version=<API-VERSION>
占位符 | 值 | 示例 |
---|---|---|
<YOUR-ENDPOINT> |
用于 API 请求的终结点 | https://<your-custom-resource>.cognitiveservices.azure.com |
<PROJECT-NAME> |
项目名称(值区分大小写) | myProject |
以下正文将附加到请求:
{
"modelLabel": "<MODEL-NAME>",
"trainingConfigVersion": "<CONFIG-VERSION>",
"evaluationOptions": {
"kind": "percentage",
"trainingSplitPercentage": 80,
"testingSplitPercentage": 20
}
}
密钥 | 值 |
---|---|
<YOUR-MODEL> |
模型名称。 |
trainingConfigVersion |
用于训练模型的模型版本。 |
runValidation |
用于对测试集运行验证的布尔值。 |
evaluationOptions |
指定评估选项。 |
kind |
指定数据拆分类型。 如果使用自动拆分,则可以是 percentage ,如果手动拆分数据集,则可以是 set |
testingSplitPercentage |
仅当 type 为“百分比”时才需要整数字段。 指定测试拆分。 |
trainingSplitPercentage |
仅当 type 为“百分比”时才需要整数字段。 指定训练拆分。 |
对上述请求的响应将是 202
,表示请求成功。 从响应头中抓取 location
值,该值类似于以下 URL:
<ENDPOINT>/language/analyze-text/projects/<PROJECT-NAME>/train/jobs/<JOB-ID>?api-version=<API-VERSION>
密钥 | 值 |
---|---|
<JOB-ID> |
请求的标识符 |
此 URL 用于在下一步中获取训练状态。
获取训练状态
若要获取训练状态,请使用请求响应标头中的 URL 来提交 GET 请求,该请求与提供我们的 Azure AI 语言服务密钥用于身份验证的标头相同。 响应正文将类似于以下 JSON:
{
"result": {
"modelLabel": "<MODEL-NAME>",
"trainingConfigVersion": "<CONFIG-VERSION>",
"estimatedEndDateTime": "2023-05-18T15:47:58.8190649Z",
"trainingStatus": {
"percentComplete": 3,
"startDateTime": "2023-05-18T15:45:06.8190649Z",
"status": "running"
},
"evaluationStatus": {
"percentComplete": 0,
"status": "notStarted"
}
},
"jobId": "<JOB-ID>",
"createdDateTime": "2023-05-18T15:44:44Z",
"lastUpdatedDateTime": "2023-05-18T15:45:48Z",
"expirationDateTime": "2023-05-25T15:44:44Z",
"status": "running"
}
训练模型可能需要一些时间,因此请定期检查此状态 URL,直到响应 status
返回 succeeded
。 训练成功后,可以查看、验证和部署模型。
使用已部署的模型
使用模型对文本进行分类与上述模式相同,使用 POST 请求提交作业,使用 GET 请求检索结果。
提交文本进行分类
若要使用模型,请将 POST 提交到以下 URL 中的 analyze 终结点:
<ENDPOINT>/language/analyze-text/jobs?api-version=<API-VERSION>
占位符 | 值 | 示例 |
---|---|---|
<YOUR-ENDPOINT> |
用于 API 请求的终结点 | https://<your-custom-resource>.cognitiveservices.azure.com |
重要
请记得将资源密钥包含在 Ocp-Apim-Subscription-Key
的标头中
以下 JSON 结构将附加到请求:
{
"displayName": "Classifying documents",
"analysisInput": {
"documents": [
{
"id": "1",
"language": "<LANGUAGE-CODE>",
"text": "Text1"
},
{
"id": "2",
"language": "<LANGUAGE-CODE>",
"text": "Text2"
}
]
},
"tasks": [
{
"kind": "<TASK-REQUIRED>",
"taskName": "<TASK-NAME>",
"parameters": {
"projectName": "<PROJECT-NAME>",
"deploymentName": "<DEPLOYMENT-NAME>"
}
}
]
}
密钥 | 值 |
---|---|
<TASK-REQUIRED> |
要请求的任务。 对于多个标签项目,该任务为 CustomMultiLabelClassification ;对于单个标签项目,为 CustomSingleLabelClassification |
<LANGUAGE-CODE> |
语言代码,例如 en-us 。 |
<TASK-NAME> |
任务名称。 |
<PROJECT-NAME> |
项目名称。 |
<DEPLOYMENT-NAME> |
部署名称。 |
对上述请求的响应将是 202
,表示请求成功。 在响应头中,查找类似于以下 URL 的 operation-location
值:
<ENDPOINT>/language/analyze-text/jobs/<JOB-ID>?api-version=<API-VERSION>
密钥 | 值 |
---|---|
<YOUR-ENDPOINT> |
用于 API 请求的终结点 |
<JOB-ID> |
请求的标识符 |
此 URL 用于获取任务结果。
获取分类结果
在上一个请求中向终结点提交 GET 请求,并使用相同的标头进行身份验证。 响应正文将类似于以下 JSON:
{
"createdDateTime": "2023-05-19T14:32:25.578Z",
"displayName": "MyJobName",
"expirationDateTime": "2023-05-19T14:32:25.578Z",
"jobId": "xxxx-xxxxxx-xxxxx-xxxx",
"lastUpdateDateTime": "2023-05-19T14:32:25.578Z",
"status": "succeeded",
"tasks": {
"completed": 1,
"failed": 0,
"inProgress": 0,
"total": 1,
"items": [
{
"kind": "customSingleClassificationTasks",
"taskName": "Classify documents",
"lastUpdateDateTime": "2022-10-01T15:01:03Z",
"status": "succeeded",
"results": {
"documents": [
{
"id": "<DOC-ID>",
"class": [
{
"category": "Class_1",
"confidenceScore": 0.0551877357
}
],
"warnings": []
}
],
"errors": [],
"modelVersion": "2022-04-01"
}
}
]
}
}
对于提交的每个文档,分类结果位于项数组的 results
对象中。