Visualización de la matriz de confusión en un modelo - Rekognition

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Visualización de la matriz de confusión en un modelo

Una matriz de confusión le permite ver las etiquetas que el modelo confunde con otras etiquetas del modelo. Al utilizar una matriz de confusión, puede ajustar más el modelo y mejorarlo.

Durante la evaluación del modelo, Etiquetas personalizadas de Amazon Rekognition crea una matriz de confusión al utilizar las imágenes de prueba para identificar etiquetas mal identificadas (confusas). Etiquetas personalizadas de Amazon Rekognition solo crea una matriz de confusión para los modelos de clasificación. Se puede acceder a la matriz de clasificación en el archivo de resumen que Etiquetas personalizadas de Amazon Rekognition crea durante el entrenamiento del modelo. No es posible ver la matriz de confusión en la consola de Etiquetas personalizadas de Amazon Rekognition.

Uso de una matriz de confusión

La siguiente tabla es la matriz de confusión del proyecto de ejemplo con clasificación de imágenes de habitaciones. Los encabezados de las columnas son las etiquetas (etiquetas con datos reales) asignadas a las imágenes de prueba. Los encabezados de fila son las etiquetas que el modelo predice para las imágenes de prueba. Cada celda es el porcentaje de predicciones de una etiqueta (fila) que debe ser la etiqueta de datos reales (columna). Por ejemplo, el 67 % de las predicciones para los baños se etiquetaron correctamente como baños. El 33 % de los baños se etiquetaron incorrectamente como cocinas. Un modelo de alto rendimiento tiene valores de celda altos cuando la etiqueta pronosticada coincide con la etiqueta de datos reales. Puede verlas como una línea diagonal desde la primera hasta la última etiqueta pronosticada y las etiquetas de datos reales. Si el valor de una celda es 0, no se ha realizado ninguna predicción en la etiqueta de predicción de la celda, que debe ser la etiqueta de datos reales de la celda.

nota

Como los modelos no son deterministas, los valores de las celdas de la matriz de confusión que se obtienen al entrenar el proyecto Habitaciones pueden variar de los de la siguiente tabla.

La matriz de confusión identifica las áreas en las que centrarse. Por ejemplo, la matriz de confusión refleja que el 50 % de las veces el modelo confundió armarios con dormitorios. En esta situación, se deben agregar más imágenes de armarios y dormitorios al conjunto de datos de entrenamiento. Compruebe también que las imágenes de armarios y dormitorios existentes estén bien etiquetadas. Esto debería ayudar al modelo a distinguir mejor entre las dos etiquetas. Para agregar más imágenes a un conjunto de datos, consulte Añadir más imágenes a un conjunto de datos.

Aunque la matriz de confusión es útil, es importante tener en cuenta otras métricas. Por ejemplo, el 100 % de las predicciones detectaron correctamente la etiqueta plano_planta, lo que indica un rendimiento excelente. Sin embargo, el conjunto de datos de prueba solo tiene 2 imágenes con la etiqueta plano_planta. También hay 11 imágenes con la etiqueta sala_estar. Este desajuste también se encuentra en el conjunto de datos de entrenamiento (13 imágenes con sala_estar y 2 imágenes de armarios). Para lograr una evaluación más precisa, equilibre los conjuntos de datos de entrenamiento y de prueba añadiendo más imágenes de etiquetas infrarrepresentadas (planos de planta en este ejemplo). Para obtener el número de imágenes de prueba por etiqueta, consulte Acceso a las métricas de evaluación (consola).

La siguiente tabla es un ejemplo de matriz de confusión en la que se compara la etiqueta pronosticada (en el eje y) con la etiqueta de verdad fundamental:

Etiqueta pronosticada terraza baño dormitorio armario camino_entrada plano_planta patio_delantero cocina sala_estar patio
terraza 75% 0% 0% 0% 0% 0% 33% 0% 0% 0%
baño 0% 67% 0% 0% 0% 0% 0% 0% 0% 0%
dormitorio 0% 0% 82% 50% 0% 0% 0% 0% 9% 0%
armario 0% 0% 0% 50% 0% 0% 0% 0% 0% 0%
camino_entrada 0% 0% 0% 0% 33% 0% 0% 0% 0% 0%
plano_planta 0% 0% 0% 0% 0% 100% 0% 0% 0% 0%
patio_delantero 25% 0% 0% 0% 0% 0% 67% 0% 0% 0%
cocina 0% 33% 0% 0% 0% 0% 0% 88% 0% 0%
sala_estar 0% 0% 18% 0% 67% 0% 0% 12% 91% 33%
patio 0% 0% 0% 0% 0% 0% 0% 0% 0% 67%

Cómo obtener la matriz de confusión en un modelo

El código siguiente utiliza las DescribeProjectVersionsoperaciones DescribeProjectsy para obtener el archivo de resumen de un modelo. Tras esto, este utiliza el archivo de resumen para mostrar la matriz de confusión del modelo.

Para mostrar la matriz de confusión de un modelo (SDK)
  1. Si aún no lo ha hecho, instale y configure el AWS CLI y el AWS SDKs. Para obtener más información, consulte Paso 4: Configura el AWS CLI y AWS SDKs.

  2. Utilice el siguiente código para ver la matriz de confusión de un modelo. Indique los siguientes argumentos de línea de comandos:

    • project_name: el nombre del proyecto que desea usar. Puede obtener el nombre del proyecto en la página de proyectos en la consola de Etiquetas personalizadas de Amazon Rekognition.

    • version_name: la versión del modelo que desea utilizar. Puede obtener el nombre de la versión en la página de detalles del proyecto en la consola de Etiquetas personalizadas de Amazon Rekognition.

    # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 """ Purpose Shows how to display the confusion matrix for an Amazon Rekognition Custom labels image classification model. """ import json import argparse import logging import boto3 import pandas as pd from botocore.exceptions import ClientError logger = logging.getLogger(__name__) def get_model_summary_location(rek_client, project_name, version_name): """ Get the summary file location for a model. :param rek_client: A Boto3 Rekognition client. :param project_arn: The Amazon Resource Name (ARN) of the project that contains the model. :param model_arn: The Amazon Resource Name (ARN) of the model. :return: The location of the model summary file. """ try: logger.info( "Getting summary file for model %s in project %s.", version_name, project_name) summary_location = "" # Get the project ARN from the project name. response = rek_client.describe_projects(ProjectNames=[project_name]) assert len(response['ProjectDescriptions']) > 0, \ f"Project {project_name} not found." project_arn = response['ProjectDescriptions'][0]['ProjectArn'] # Get the summary file location for the model. describe_response = rek_client.describe_project_versions(ProjectArn=project_arn, VersionNames=[version_name]) assert len(describe_response['ProjectVersionDescriptions']) > 0, \ f"Model {version_name} not found." model=describe_response['ProjectVersionDescriptions'][0] evaluation_results=model['EvaluationResult'] summary_location=(f"s3://{evaluation_results['Summary']['S3Object']['Bucket']}" f"/{evaluation_results['Summary']['S3Object']['Name']}") return summary_location except ClientError as err: logger.exception( "Couldn't get summary file location: %s", err.response['Error']['Message']) raise def show_confusion_matrix(summary): """ Shows the confusion matrix for an Amazon Rekognition Custom Labels image classification model. :param summary: The summary file JSON object. """ pd.options.display.float_format = '{:.0%}'.format # Load the model summary JSON into a DataFrame. summary_df = pd.DataFrame( summary['AggregatedEvaluationResults']['ConfusionMatrix']) # Get the confusion matrix. confusion_matrix = summary_df.pivot_table(index='PredictedLabel', columns='GroundTruthLabel', fill_value=0.0).astype(float) # Display the confusion matrix. print(confusion_matrix) def get_summary(s3_resource, summary): """ Gets the summary file. : return: The summary file in bytes. """ try: summary_bucket, summary_key = summary.replace( "s3://", "").split("/", 1) bucket = s3_resource.Bucket(summary_bucket) obj = bucket.Object(summary_key) body = obj.get()['Body'].read() logger.info( "Got summary file '%s' from bucket '%s'.", obj.key, obj.bucket_name) except ClientError: logger.exception( "Couldn't get summary file '%s' from bucket '%s'.", obj.key, obj.bucket_name) raise else: return body def add_arguments(parser): """ Adds command line arguments to the parser. : param parser: The command line parser. """ parser.add_argument( "project_name", help="The ARN of the project in which the model resides." ) parser.add_argument( "version_name", help="The version of the model that you want to describe." ) def main(): """ Entry point for script. """ logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") try: # Get the command line arguments. parser = argparse.ArgumentParser(usage=argparse.SUPPRESS) add_arguments(parser) args = parser.parse_args() print( f"Showing confusion matrix for: {args.version_name} for project {args.project_name}.") session = boto3.Session(profile_name='custom-labels-access') rekognition_client = session.client("rekognition") s3_resource = session.resource('s3') # Get the summary file for the model. summary_location = get_model_summary_location(rekognition_client, args.project_name, args.version_name ) summary = json.loads(get_summary(s3_resource, summary_location)) # Check that the confusion matrix is available. assert 'ConfusionMatrix' in summary['AggregatedEvaluationResults'], \ "Confusion matrix not found in summary. Is the model a classification model?" # Show the confusion matrix. show_confusion_matrix(summary) print("Done") except ClientError as err: logger.exception("Problem showing confusion matrix: %s", err) print(f"Problem describing model: {err}") except AssertionError as err: logger.exception( "Error: %s.\n", err) print( f"Error: {err}\n") if __name__ == "__main__": main()