AutoML 予測モデルを評価する

このページでは、AutoML 予測モデルの評価方法について説明します。

Vertex AI では、モデルのパフォーマンスを判定するためのモデル評価指標(適合率や再現率の指標など)が提供されます。Vertex AI では、評価指標の計算にテストセットが使用されます。

モデル評価指標の使い方

モデル評価指標は、テストセットに対するモデルのパフォーマンスを定量的に測定します。これらの評価指標をどのように解釈し、使用するかは、ビジネスニーズや、どのような問題をモデルのトレーニングで解決するかによって異なります。たとえば、偽陽性の許容範囲が偽陰性の許容範囲よりも低い場合もあれば、その逆の場合もあります。このような質問に対する答えは、どの指標を重視するかによって変わります。

Vertex AI から返される評価指標

Vertex AI からは、適合率、再現率、信頼度しきい値など、さまざまな評価指標が返されます。返される評価指標は、モデルの目標によって異なります。たとえば、画像分類モデルと画像オブジェクト検出モデルでは、異なる評価指標が返されます。

Vertex AI から各目標に対して提供される評価指標は、スキーマ ファイルによって決まります。

スキーマ ファイルは、Cloud Storage 上の gs://google-cloud-aiplatform/schema/modelevaluation/ からダウンロードできます。

予測モデルの評価指標は次のとおりです。

  • MAE: 平均絶対誤差(MAE)とは、ターゲット値と予測値との間の平均絶対差のことです。この指標の範囲はゼロから無限大までで、値が小さいほど高品質のモデルであることを示します。
  • RMSE: 二乗平均平方根誤差(RMSE)とは、ターゲット値と予測値の平均二乗誤差の平方根です。RMSE は MAE よりも外れ値の影響を受けやすいため、大きな誤差が心配な場合は RMSE のほうがより便利な評価指標といえます。MAE と同様に、値が小さいほど高品質のモデルであることを示します(0 は完全な予測因子を表します)。
  • RMSLE: 二乗平均対数平方誤差の指標は、RMSE と似ていますが、予測値と実測値に 1 を加えた自然対数を使用する点が異なります。RMSLE は、過剰予測よりも過小予測に重いペナルティを与えます。小さい予測値の差よりも大きい予測値の差のペナルティが重くならないようにする場合にも、この指標を使用することをおすすめします。この指標の範囲はゼロから無限大までで、値が小さいほど高品質のモデルであることを示します。RMSLE 評価指標は、すべてのラベルと予測値が負でない場合にのみ返されます。
  • r^2: r 2 乗(r^2)は、ラベルと予測値間のピアソン相関係数の 2 乗です。この指標の範囲は 0~1 で、値が高いほどモデルが高品質であることを示します。
  • MAPE: 平均絶対誤差率(MAPE)は、ラベルと予測値の間の平均絶対パーセント誤差です。この指標の範囲はゼロから無限大までで、値が低いほど高品質のモデルであることを示します。
    ターゲット列に 0 の値が含まれている場合、MAPE は表示されません。この場合、MAPE は未定義です。
  • WAPE: 加重絶対パーセント誤差(WAPE)とは、観測された値全体を通じた、モデルによって予測された値と観測された値との全体的な差です。RMSE と比較すると、WAPE では個々の差ではなく全体的な差に重点が置かれます。個々の差に重点を置くと、小さい値や断続的な値に大きな影響を受けることがあります。値が小さいほど、高品質のモデルであることを示します。
  • RMSPE: 平均二乗パーセント誤差の平方根(RMPSE)は、RMSE を、絶対数に対する割合ではなく、実際の値に対する割合として示したものです。値が小さいほど、高品質のモデルであることを示します。
  • 分位数: 観測値が予測値を下回る可能性を表すパーセント分位数です。たとえば、0.2 分位数は、観測値が予測値よりも低くなる可能性が 20% であることを示します。最適化目標に minimize-quantile-loss を指定した場合、Vertex AI からこの指標が提供されます。
  • 観測された分位数: 特定の分位数について、実際の値が予測値を下回った割合を示します。最適化目標に minimize-quantile-loss を指定した場合、Vertex AI からこの指標が提供されます。
  • スケールド ピンボールロス: 特定の分位数における、スケーリングされたピンボールロス。値が小さいほど、該当の分位数において高品質のモデルであることを示します。最適化目標に minimize-quantile-loss を指定した場合、Vertex AI からこの指標が提供されます。

評価指標の取得

モデルに関する評価指標の集合セットを取得できますが、目的によっては、特定のクラスやラベルに関する評価指標を取得することもできます。特定のクラスやラベルに関する評価指標は、評価スライスとも呼ばれます。以下のコンテンツでは、Google Cloud Console または API を使用して評価指標の集合セットと評価スライスを取得する方法を説明します。

Cloud Console

  1. Google Cloud Console の Vertex AI セクションで、[モデル] ページに移動します。

    [モデル] ページに移動

  2. [リージョン] プルダウンで、モデルが配置されているリージョンを選択します。

  3. モデルの一覧からモデルをクリックすると、モデルの [評価] タブが開きます。

    [評価] タブでは、モデルの評価指標の集合セット(平均適合率再現率など)を確認できます。

    モデルの目標に評価スライスが含まれる場合は、コンソールにラベルの一覧が表示されます。次の例に示すように、ラベルをクリックすると、そのラベルの評価指標を表示できます。

    コンソールでラベルを選択する

API

評価指標を取得するための API リクエストはデータ型や目標ごとに同じですが、その出力は異なります。以下のサンプルでは、同じリクエストが使用されていますが、レスポンスが異なっています。

集約型のモデル評価指標の取得

集約型のモデル評価指標は、モデル全体に関する情報を提供します。特定のスライスに関する情報を表示するには、モデル評価スライスを一覧表示します。

集約型のモデル評価指標を表示するには、projects.locations.models.evaluations.get メソッドを使用します。

お使いの言語または環境に対応するタブを選択してください。

REST とコマンドライン

リクエストのデータを使用する前に、次のように置き換えます。

  • LOCATION: モデルが保存されているリージョン。
  • PROJECT: プロジェクト ID またはプロジェクト番号。
  • MODEL_ID: モデルの ID。
  • PROJECT_NUMBER: プロジェクトのプロジェクト番号(レスポンスに表示される)。
  • EVALUATION_ID: モデル評価の ID(レスポンスに表示される)。

HTTP メソッドと URL:

GET https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/models/MODEL_ID/evaluations

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

次のコマンドを実行します。

curl -X GET \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/models/MODEL_ID/evaluations"

PowerShell

次のコマンドを実行します。

$cred = gcloud auth application-default print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method GET `
-Headers $headers `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/models/MODEL_ID/evaluations" | Select-Object -Expand Content

次のような JSON レスポンスが返されます。

単一のスライスに関する指標の取得

単一のスライスに関する評価指標を表示するには、projects.locations.models.evaluations.slices.get メソッドを使用します。スライス ID が必要になります。これは、すべてのスライスを一覧表示するときに提供される ID です。次のサンプルは、すべてのデータ型と目標に適用されます。

REST とコマンドライン

リクエストのデータを使用する前に、次のように置き換えます。

  • LOCATION: モデルが配置されているリージョン。たとえば、us-central1 などです。
  • PROJECT: プロジェクト ID またはプロジェクト番号。
  • MODEL_ID: モデルの ID。
  • EVALUATION_ID: 取得する評価スライスを含むモデル評価の ID。
  • SLICE_ID: 取得する評価スライスの ID。
  • PROJECT_NUMBER: プロジェクトのプロジェクト番号(レスポンスに表示される)。
  • EVALUATION_METRIC_SCHEMA_FILE_NAME: 戻り値となる評価指標を定義するスキーマ ファイルの名前(classification_metrics_1.0.0 など)。

HTTP メソッドと URL:

GET https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/models/MODEL_ID/evaluations/EVALUATION_ID/slices/SLICE_ID

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

次のコマンドを実行します。

curl -X GET \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/models/MODEL_ID/evaluations/EVALUATION_ID/slices/SLICE_ID"

PowerShell

次のコマンドを実行します。

$cred = gcloud auth application-default print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method GET `
-Headers $headers `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/models/MODEL_ID/evaluations/EVALUATION_ID/slices/SLICE_ID" | Select-Object -Expand Content

次のような JSON レスポンスが返されます。

Java

Vertex AI 用のクライアント ライブラリをインストールして使用する方法については、Vertex AI クライアント ライブラリをご覧ください。詳細については、Vertex AI Java API のリファレンス ドキュメントをご覧ください。


import com.google.cloud.aiplatform.v1.ModelEvaluationSlice;
import com.google.cloud.aiplatform.v1.ModelEvaluationSlice.Slice;
import com.google.cloud.aiplatform.v1.ModelEvaluationSliceName;
import com.google.cloud.aiplatform.v1.ModelServiceClient;
import com.google.cloud.aiplatform.v1.ModelServiceSettings;
import java.io.IOException;

public class GetModelEvaluationSliceSample {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    // To obtain evaluationId run the code block below after setting modelServiceSettings.
    //
    // try (ModelServiceClient modelServiceClient = ModelServiceClient.create(modelServiceSettings))
    // {
    //   String location = "us-central1";
    //   ModelName modelFullId = ModelName.of(project, location, modelId);
    //   ListModelEvaluationsRequest modelEvaluationsrequest =
    //   ListModelEvaluationsRequest.newBuilder().setParent(modelFullId.toString()).build();
    //   for (ModelEvaluation modelEvaluation :
    //     modelServiceClient.listModelEvaluations(modelEvaluationsrequest).iterateAll()) {
    //       System.out.format("Model Evaluation Name: %s%n", modelEvaluation.getName());
    //   }
    // }
    String project = "YOUR_PROJECT_ID";
    String modelId = "YOUR_MODEL_ID";
    String evaluationId = "YOUR_EVALUATION_ID";
    String sliceId = "YOUR_SLICE_ID";
    getModelEvaluationSliceSample(project, modelId, evaluationId, sliceId);
  }

  static void getModelEvaluationSliceSample(
      String project, String modelId, String evaluationId, String sliceId) throws IOException {
    ModelServiceSettings modelServiceSettings =
        ModelServiceSettings.newBuilder()
            .setEndpoint("us-central1-aiplatform.googleapis.com:443")
            .build();

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (ModelServiceClient modelServiceClient = ModelServiceClient.create(modelServiceSettings)) {
      String location = "us-central1";
      ModelEvaluationSliceName modelEvaluationSliceName =
          ModelEvaluationSliceName.of(project, location, modelId, evaluationId, sliceId);

      ModelEvaluationSlice modelEvaluationSlice =
          modelServiceClient.getModelEvaluationSlice(modelEvaluationSliceName);

      System.out.println("Get Model Evaluation Slice Response");
      System.out.format("Model Evaluation Slice Name: %s\n", modelEvaluationSlice.getName());
      System.out.format("Metrics Schema Uri: %s\n", modelEvaluationSlice.getMetricsSchemaUri());
      System.out.format("Metrics: %s\n", modelEvaluationSlice.getMetrics());
      System.out.format("Create Time: %s\n", modelEvaluationSlice.getCreateTime());

      Slice slice = modelEvaluationSlice.getSlice();
      System.out.format("Slice Dimensions: %s\n", slice.getDimension());
      System.out.format("Slice Value: %s\n", slice.getValue());
    }
  }
}

Node.js

Vertex AI 用のクライアント ライブラリをインストールして使用する方法については、Vertex AI クライアント ライブラリをご覧ください。詳細については、Vertex AI Node.js API のリファレンス ドキュメントをご覧ください。

/**
 * TODO(developer): Uncomment these variables before running the sample
 * (not necessary if passing values as arguments). To obtain evaluationId,
 * instantiate the client and run the following the commands.
 */
// const parentName = `projects/${project}/locations/${location}/models/${modelId}`;
// const evalRequest = {
//   parent: parentName
// };
// const [evalResponse] = await modelServiceClient.listModelEvaluations(evalRequest);
// console.log(evalResponse);

// const modelId = 'YOUR_MODEL_ID';
// const evaluationId = 'YOUR_EVALUATION_ID';
// const sliceId = 'YOUR_SLICE_ID';
// const project = 'YOUR_PROJECT_ID';
// const location = 'YOUR_PROJECT_LOCATION';

// Imports the Google Cloud Model Service client library
const {ModelServiceClient} = require('@google-cloud/aiplatform');
// Specifies the location of the api endpoint
const clientOptions = {
  apiEndpoint: 'us-central1-aiplatform.googleapis.com',
};
// Specifies the location of the api endpoint
const modelServiceClient = new ModelServiceClient(clientOptions);

async function getModelEvaluationSlice() {
  // Configure the parent resource
  const name = `projects/${project}/locations/${location}/models/${modelId}/evaluations/${evaluationId}/slices/${sliceId}`;
  const request = {
    name,
  };

  // Get and print out a list of all the endpoints for this resource
  const [response] = await modelServiceClient.getModelEvaluationSlice(
    request
  );

  console.log('Get model evaluation slice');
  console.log(`\tName : ${response.name}`);
  console.log(`\tMetrics_Schema_Uri : ${response.metricsSchemaUri}`);
  console.log(`\tMetrics : ${JSON.stringify(response.metrics)}`);
  console.log(`\tCreate time : ${JSON.stringify(response.createTime)}`);

  console.log('Slice');
  const slice = response.slice;
  console.log(`\tDimension :${slice.dimension}`);
  console.log(`\tValue :${slice.value}`);
}
getModelEvaluationSlice();

Python

Vertex AI 用のクライアント ライブラリをインストールして使用する方法については、Vertex AI クライアント ライブラリをご覧ください。詳細については、Vertex AI Python API のリファレンス ドキュメントをご覧ください。

from google.cloud import aiplatform

def get_model_evaluation_slice_sample(
    project: str,
    model_id: str,
    evaluation_id: str,
    slice_id: str,
    location: str = "us-central1",
    api_endpoint: str = "us-central1-aiplatform.googleapis.com",
):
    """
    To obtain evaluation_id run the following commands where LOCATION
    is the region where the model is stored, PROJECT is the project ID,
    and MODEL_ID is the ID of your model.

    model_client = aiplatform.gapic.ModelServiceClient(
        client_options={
            'api_endpoint':'LOCATION-aiplatform.googleapis.com'
            }
        )
    evaluations = model_client.list_model_evaluations(parent='projects/PROJECT/locations/LOCATION/models/MODEL_ID')
    print("evaluations:", evaluations)
    """
    # The AI Platform services require regional API endpoints.
    client_options = {"api_endpoint": api_endpoint}
    # Initialize client that will be used to create and send requests.
    # This client only needs to be created once, and can be reused for multiple requests.
    client = aiplatform.gapic.ModelServiceClient(client_options=client_options)
    name = client.model_evaluation_slice_path(
        project=project,
        location=location,
        model=model_id,
        evaluation=evaluation_id,
        slice=slice_id,
    )
    response = client.get_model_evaluation_slice(name=name)
    print("response:", response)

次のステップ