Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Die Konfusionsmatrix für ein Modell anzeigen
Eine Konfusionsmatrix ermöglicht es Ihnen, die Labels zu sehen, die Ihr Modell mit anderen Labels in Ihrem Modell verwechselt. Durch die Verwendung einer Konfusionsmatrix können Sie Ihre Verbesserungen auf das Modell konzentrieren.
Während der Modellbewertung erstellen Amazon Rekognition Custom Labels eine Verwechslungsmatrix, indem die Testbilder verwendet werden, um falsch identifizierte (verwechselte) Labels zu identifizieren. Amazon Rekognition Custom Labels erstellt nur eine Verwechslungsmatrix für Klassifizierungsmodelle. Auf die Klassifizierungsmatrix kann über die Übersichtsdatei zugegriffen werden, die Amazon Rekognition Custom Labels während des Modelltrainings erstellt. Sie können die Konfusionsmatrix in der Amazon Rekognition Custom Labels-Konsole nicht anzeigen.
Verwenden Sie eine Konfusionsmatrix
Die folgende Tabelle enthält die Konfusionsmatrix für das Beispielprojekt Raumklassifizierung. Bei den Spaltenüberschriften handelt es sich um die Bezeichnungen (Ground Truth-Labels), die den Testbildern zugewiesen wurden. Zeilenüberschriften sind die Labels, die das Modell für die Testbilder vorhersagt. Jede Zelle gibt den Prozentsatz der Vorhersagen für ein Label (Zeile) an, bei dem es sich um das Ground Truth-Etikett (Spalte) handeln sollte. Beispielsweise waren 67 % der Vorhersagen für Badezimmer korrekt als Badezimmer gekennzeichnet. 33 % Prozent der Badezimmer waren falsch als Küchen gekennzeichnet. Ein leistungsstarkes Modell weist hohe Zellenwerte auf, wenn das vorhergesagte Label mit dem Ground Truth-Label übereinstimmt. Sie können diese Werte als diagonale Linie vom ersten bis zum letzten vorhergesagten Wert und als Ground Truth-Labels erkennen. Wenn ein Zellenwert 0 ist, wurden keine Vorhersagen für das vorhergesagte Label der Zelle getroffen, bei der es sich um das Ground Truth-Labels der Zelle handeln sollte.
Anmerkung
Da Modelle nicht deterministisch sind, können die Werte der Konfusionsmatrix-Zellen, die Sie beim Training des Raumprojekts erhalten, von der folgenden Tabelle abweichen.
Die Konfusionsmatrix identifiziert Bereiche, auf die Sie sich konzentrieren sollten. Die Konfusionsmatrix zeigt beispielsweise, dass das Modell in 50 % der Fälle Ankleidezimmer mit Schlafzimmern verwechselt hat. In diesem Fall sollten Sie Ihrem Trainingsdatensatz weitere Bilder von Ankleidezimmern und Schlafzimmern hinzufügen. Überprüfen Sie auch, ob die vorhandenen Ankleidezimmer- und Schlafzimmerbilder die korrekten Label haben. Dies sollte dem Modell helfen, besser zwischen den beiden Labels zu unterscheiden. Informationen zum Hinzufügen weiterer Bilder zu einem Datensatz finden Sie unter Hinzufügen weiterer Bilder zu einem Datensatz.
Die Konfusionsmatrix ist zwar hilfreich, es ist jedoch wichtig, andere Metriken zu berücksichtigen. Beispielsweise haben 100 % der Vorhersagen das Label Grundriss korrekt gefunden, was auf eine hervorragende Leistung hinweist. Der Testdatensatz enthält jedoch nur 2 Bilder mit dem Label Grundriss. Es enthält auch 11 Bilder mit dem Label Wohnraum. Dieses Ungleichgewicht besteht auch im Trainingsdatensatz (13 Wohnraum-Bilder und 2 Ankleidezimmer-Bilder). Um eine genauere Bewertung zu erhalten, sollten Sie die Trainings- und Testdatensätze ausbalancieren, indem Sie weitere Bilder von unterrepräsentierten Labels hinzufügen (Grundrisse in diesem Beispiel). Informationen zur Anzahl der Testbilder pro Label finden Sie unter Zugreifen auf Bewertungsmetriken (Konsole).
Die folgende Tabelle ist ein Beispiel für eine Konfusionsmatrix, in der das vorhergesagte Label (auf der Y-Achse) mit dem Ground-Truth-Label verglichen wird:
Vorhergesagtes Label | Hinterhof | Badezimmer | Schlafzimmer | Ankleidezimmer | Eingang | Grundriss | Vorgarten | Küche | Wohnraum | Terrasse |
---|---|---|---|---|---|---|---|---|---|---|
Hinterhof | 75 % | 0% | 0% | 0% | 0% | 0% | 33% | 0% | 0% | 0% |
Badezimmer | 0% | 67% | 0% | 0% | 0% | 0% | 0% | 0% | 0% | 0% |
Schlafzimmer | 0% | 0% | 82% | 50 % | 0% | 0% | 0% | 0% | 9% | 0% |
Ankleidezimmer | 0% | 0% | 0% | 50 % | 0% | 0% | 0% | 0% | 0% | 0% |
Eingang | 0% | 0% | 0% | 0% | 33% | 0% | 0% | 0% | 0% | 0% |
Grundriss | 0% | 0% | 0% | 0% | 0% | 100 % | 0% | 0% | 0% | 0% |
Vorgarten | 25 % | 0% | 0% | 0% | 0% | 0% | 67% | 0% | 0% | 0% |
Küche | 0% | 33% | 0% | 0% | 0% | 0% | 0% | 88% | 0% | 0% |
Wohnraum | 0% | 0% | 18% | 0% | 67% | 0% | 0% | 12% | 91% | 33% |
Terrasse | 0% | 0% | 0% | 0% | 0% | 0% | 0% | 0% | 0% | 67% |
Abrufen der Konfusionsmatrix für ein Modell
Der folgende Code verwendet die DescribeProjectVersionsOperationen DescribeProjectsund, um die Zusammenfassungsdatei für ein Modell abzurufen. Anschließend wird die Zusammenfassungsdatei verwendet, um die Konfusionsmatrix für das Modell anzuzeigen.
Um die Konfusionsmatrix für ein Modell anzuzeigen (SDK)
-
Falls Sie dies noch nicht getan haben, installieren und konfigurieren Sie den AWS CLI und die AWS SDKs. Weitere Informationen finden Sie unter Schritt 4: Richten Sie das ein AWS CLI and AWS SDKs.
-
Verwenden Sie den folgenden Code, um die Konfusionsmatrix für ein Modell anzuzeigen. Geben Sie die folgenden Befehlszeilenargumente an:
-
project_name
— der Name des Projekts, das Sie verwenden möchten. Sie können den Projektnamen auf der Projektseite in der Amazon Rekognition Custom Labels-Konsole abrufen. -
version_name
– Die Versionsnummer des Modells, das Sie verwenden möchten. Sie können den Versionsnamen auf der Seite mit den Projektdetails in der Amazon Rekognition Custom Labels-Konsole abrufen.
# 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()
-