テキスト分類プロジェクトを構築する方法を理解する

完了

カスタム テキスト分類プロジェクトは、分類モデルを構築、トレーニング、改善、デプロイするためのワークスペースです。 プロジェクトは、Language Studio と REST API の 2 つの方法で処理できます。 Language Studio は GUI であり、このラボで使用しますが、REST API にも同じ機能があります。 どちらの方法を選択しても、モデルを開発する手順は同じです。

Azure AI Language プロジェクト ライフ サイクル

Diagram that shows a life cycle with steps to define labels, tag data, train model, view model, improve model, deploy model, and classify text.

  • ラベルの定義: 分類するデータを理解し、分類したいラベルの候補を特定します。 このビデオ ゲームの例では、"アクション"、"冒険"、"戦略" などのラベルになります。
  • データのタグ付け: 既存のデータにタグまたはラベルを付け、各ファイルがどのラベル (1 つまたは複数) に分類されるかを指定します。 データのラベル付けは、ご自分のモデルが将来のファイルを分類する方法を学習する方法であるため、重要です。 ベスト プラクティスは、あいまいさを避けるためにラベル同士の違いを明確にし、ラベルごとに適切な例を提供してモデルが学習できるようにすることです。 たとえば、ゲーム "Quest for the Mine Brush" には "冒険"、"Flight Trainer" には "アクション" のラベルを付けます。
  • モデルのトレーニング: ラベル付けされたデータを使用してモデルをトレーニングします。 トレーニングで、どの種類のビデオ ゲームの概要にどのジャンルのラベルを付けるべきかをモデルに教えます。
  • モデルの表示: モデルをトレーニングしたら、モデルの結果を表示します。 モデルは、テストしたデータの精度とリコールに基づいて、0 から 1 の間でスコア付けされます。 どのジャンルがうまく機能しなかったかに注目します。
  • モデルの改善: 適切なラベルに評価できなかった分類を確認してモデルを改善し、ラベルの分布を確認し、パフォーマンスを向上させるために追加するデータを見つけます。 たとえば、モデルが "冒険" ゲームと "戦略" ゲームを混同していることに気付くかもしれません。 モデルの再トレーニングのために、各ラベルの例をもっと探してデータセットに追加してみてください。
  • モデルのデプロイ: モデルが要望どおりに機能したら、API を使って利用できるようにモデルをデプロイします。 たとえば、モデルの名前が "GameGenres" で、デプロイ後にゲームの概要を分類するために使用できます。
  • テキストの分類: モデルを使用してテキストを分類します。 このラボでは、API の使用方法について説明します。API リファレンスを参照することもできます

トレーニング用にデータセットを分割する方法

データにラベルを付ける際、ファイルごとに、どちらのデータセットにするかを指定できます。

  • トレーニング - トレーニング データセットは、モデルを実際にトレーニングするために使用されます。提供したデータとラベルが機械学習アルゴリズムに送られ、どのデータをどのラベルに分類する必要があるかをモデルに教えます。 2 つのデータセットのうち、トレーニング データセットの方を大きくし、ラベル付きデータの約 80% にすることをお勧めします。
  • テスト - テスト データセットは、トレーニング後にモデルを検証するために使用されるラベル付きデータです。 Azure によって、テスト データセット内のデータが取得され、モデルに送信されます。その出力を、ご自分がデータにラベル付けしたものと比較して、モデルがどの程度機能しているかを判断します。 その比較結果から、モデルでどのようにスコア付けされているかがわかり、予測パフォーマンスを向上させる方法を知るのに役立ちます。

モデルのトレーニング ステップの際、モデルをトレーニングする方法に 2 つのオプションがあります。

  • 自動分割 - Azure によって、すべてのデータが取得され、指定したパーセンテージにランダムに分割され、モデルのトレーニングに適用されます。 このオプションは、データセットが大きい場合、データの整合性が自然に高い場合、またはデータの分布がクラスを広範囲にカバーしている場合に最適です。
  • 手動分割 - 各データセットに含めるファイルを手動で指定します。 トレーニング ジョブを送信すると、データセットの分割と分布が Azure AI Language サービスから通知されます。 この分割は、モデルを正しくトレーニングするために、クラスとデータのばらつきが確実に正しく分布するように、より小さなデータセットで使用するのが最適です。

自動分割を使用するには、データにラベルを付けるときにすべてのファイルを "トレーニング" データセットに配置します (このオプションは既定です)。 手動分割を使用するには、データのラベル付けの際に、テストすべきファイルとトレーニングすべきファイルを指定します。

配置オプション

Azure AI Language を使用すると、各プロジェクトで複数のモデルと複数のデプロイの両方を作成でき、それぞれに独自の一意の名前を付けることができます。 ベネフィットには、次の機能が含まれます。

  • 2 つのモデルを並べてテストする
  • データセットの分割がパフォーマンスに与える影響を比較する
  • モデルの複数のバージョンをデプロイする

注意

1 つのプロジェクトにつき、デプロイ名は 10 個までです

デプロイの際に、デプロイするモデルの名前を選択できます。この名前は、後で分類タスクを送信するときに選択できます。

<...>
  "tasks": [
    {
      "kind": "CustomSingleLabelClassification",
      "taskName": "MyTaskName",
      "parameters": {
        "projectName": "MyProject",
        "deploymentName": "MyDeployment"
      }
    }
  ]
<...>

REST API を使用して

Azure AI Language サービスで利用可能な REST API を使用すると、プロジェクトを構築するためのユーザー インターフェイスが Language Studio から提供されているのと同じように、Azure AI Language プロジェクトの CLI 開発を行うことができます。 Language Studio については、このモジュールのラボでさらに詳しく説明します。

API を使用するパターン

Azure AI Language サービスの API は、ほとんどの呼び出しで非同期的に動作します。 各ステップで最初にサービスに要求を送信し、次に状態または結果を取得するために後続の呼び出しを介してサービスに確認します。

要求ごとに、要求を認証するためのヘッダーが必要です。

キー Value
Ocp-Apim-Subscription-Key Azure AI Language リソースのキー

最初の要求を送信する

要求を送信する URL は、どのステップを実行しているかによって異なりますが、すべてに、Azure AI Language リソースから提供されるエンドポイントをプレフィックスとして付けます。

たとえば、モデルをトレーニングするには、次のような 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 typepercentage の場合のみ、必須の整数フィールド。 テストの分割を指定します。
trainingSplitPercentage typepercentage の場合のみ、必須の整数フィールド。 トレーニングの分割を指定します。

上記の要求に対する応答は、202 になり、要求が成功したことを意味します。 応答ヘッダーから location 値を取得します。これは次の URL のようになります。

<ENDPOINT>/language/analyze-text/projects/<PROJECT-NAME>/train/jobs/<JOB-ID>?api-version=<API-VERSION>
キー
<JOB-ID> 要求の識別子

この URL は、次のステップで、トレーニングの状態を取得するのに使用します。

トレーニング状態の取得

トレーニングの状態を取得するには、要求応答のヘッダー内の URL を使用して、認証用の Azure AI Language サービス キーを提供するのと同じヘッダーを指定して、GET 要求を送信します。 応答本文は、次の 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"
}

モデルのトレーニングには時間がかかる場合があるため、応答 status から succeeded が返されるまで定期的にこの状態 URL をチェックします。 トレーニングが成功したら、モデルを表示、検証、デプロイできます。

デプロイしたモデルを使用する

テキストの分類にモデルを使用する場合も、上記と同じパターンに従い、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 オブジェクト内にあります。