Affichage de la matrice de confusion d’un modèle - Rekognition

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Affichage de la matrice de confusion d’un modèle

Une matrice de confusion permet de voir les étiquettes que le modèle confond avec d’autres étiquettes du même modèle. En utilisant une matrice de confusion, vous pouvez concentrer vos améliorations sur le modèle.

Lors de l’évaluation du modèle, Étiquettes personnalisées Amazon Rekognition crée une matrice de confusion à l’aide des images de test afin de détecter les étiquettes mal identifiées (confuses). Étiquettes personnalisées Amazon Rekognition crée uniquement une matrice de confusion pour les modèles de classification. La matrice de classification est accessible depuis le fichier récapitulatif créé par Étiquettes personnalisées Amazon Rekognition lors de l’entraînement du modèle. Il n’est pas possible d’afficher la matrice de confusion dans la console Étiquettes personnalisées Amazon Rekognition.

Utilisation d’une matrice de confusion

Le tableau suivant constitue la matrice de confusion de l’exemple de projet de classification d’images de pièces (projet Rooms). Les en-têtes de colonne représentent les étiquettes (étiquettes de vérité sur le terrain) attribuées aux images de test. Les en-têtes de ligne représentent les étiquettes que le modèle prédit pour les images de test. Chaque cellule représente le pourcentage de prédictions pour une étiquette (ligne) d’être l’étiquette de vérité sur le terrain (colonne). Par exemple, 67 % des prédictions sur les salles de bains ont été correctement étiquetées comme salles de bains. En revanche, 33 % des salles de bains ont été incorrectement étiquetées comme cuisines. Un modèle très performant possède des valeurs de cellules élevées lorsque l’étiquette prédite correspond à l’étiquette de vérité sur le terrain. Vous pouvez le voir grâce à la diagonale allant de la première à la dernière des étiquettes prédites et des étiquettes de vérité sur le terrain. Si la valeur d’une cellule est égale à 0, aucune prédiction n’a été faite pour l’étiquette prédite qui doit être l’étiquette de vérité sur le terrain de la cellule.

Note

Comme les modèles ne sont pas déterministes, les valeurs des cellules de la matrice de confusion obtenues lors de l’entraînement du projet Rooms peuvent différer de celles indiquées dans le tableau ci-dessous.

La matrice de confusion identifie les zones sur lesquelles il est nécessaire de se concentrer. Par exemple, la matrice de confusion montre que 50 % du temps, le modèle confond les placards et les chambres à coucher. Dans ce cas, vous devez ajouter de nouvelles images de placards et de chambres à coucher au jeu de données d’entraînement. Vérifiez également que les images existantes de placard et de chambre à coucher sont correctement étiquetées. Le modèle devrait ainsi mieux faire la différence entre les deux étiquettes. Pour ajouter de nouvelles images à un jeu de données, consultez Ajouter d'autres images à un jeu de données.

Bien que la matrice de confusion soit utile, il importe de prendre en compte d’autres métriques. Par exemple, 100 % des prédictions ont correctement identifié l’étiquette floor_plan, ce qui constitue une excellente performance. Cependant, le jeu de données des tests ne contient que 2 images avec l’étiquette floor_plan. Il contient également 11 images avec l’étiquette living_space. Ce déséquilibre est également présent dans le jeu de données d’entraînement (13 images living_space et 2 images closet). Pour obtenir une évaluation plus précise, équilibrez les jeux de données d’entraînement et de test en ajoutant davantage d’images d’étiquettes sous-représentées (plans de niveau dans cet exemple). Pour obtenir le nombre d’images de test par étiquette, consultez Accès aux métriques d’évaluation (console).

Étiquette de vérité sur le terrain
Étiquette prévue backyard (jardin arrière) bathroom (salle de bains) bedroom (chambre à coucher) closet (placard) entry_way (entrée) floor_plan (plan d’étage) front_yard (jardin avant) kitchen (cuisine) living_space (pièce de vie) patio
backyard (jardin arrière) 75% 0 % 0 % 0 % 0 % 0 % 33 % 0 % 0 % 0 %
bathroom (salle de bains) 0 % 67 % 0 % 0 % 0 % 0 % 0 % 0 % 0 % 0 %
bedroom (chambre à coucher) 0 % 0 % 82 % 50% 0 % 0 % 0 % 0 % 9 % 0 %
closet (placard) 0 % 0 % 0 % 50% 0 % 0 % 0 % 0 % 0 % 0 %
entry_way (entrée) 0 % 0 % 0 % 0 % 33 % 0 % 0 % 0 % 0 % 0 %
floor_plan (plan d’étage) 0 % 0 % 0 % 0 % 0 % 100 % 0 % 0 % 0 % 0 %
front_yard (jardin avant) 25% 0 % 0 % 0 % 0 % 0 % 67 % 0 % 0 % 0 %
kitchen (cuisine) 0 % 33 % 0 % 0 % 0 % 0 % 0 % 88 % 0 % 0 %
living_space (pièce de vie) 0 % 0 % 18 % 0 % 67 % 0 % 0 % 12 % 91 % 33 %
patio 0 % 0 % 0 % 0 % 0 % 0 % 0 % 0 % 0 % 67 %

Obtention de la matrice de confusion d’un modèle

Le code suivant utilise les opérations DescribeProjectset DescribeProjectVersions pour obtenir le fichier récapitulatif d'un modèle. Il utilise ensuite le fichier récapitulatif pour afficher la matrice de confusion du modèle.

Pour afficher la matrice de confusion d’un modèle (kit SDK)
  1. Si ce n'est pas déjà fait, installez et configurez les AWS CLI AWS SDK. Pour plus d’informations, consultez Étape 4 : Configuration des AWS SDK AWS CLI et.

  2. Utilisez le code suivant pour afficher la matrice de confusion d’un modèle. Fournissez les arguments de ligne de commande suivants :

    • project_name : nom du projet que vous souhaitez utiliser. Vous pouvez obtenir le nom du projet sur la page des projets de la console Étiquettes personnalisées Amazon Rekognition.

    • version_name : version du modèle que vous souhaitez utiliser. Vous pouvez obtenir le nom de la version sur la page des informations détaillées du projet de la console Étiquettes personnalisées 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()