Trainieren und Auswerten eines ModellsTrain and evaluate a model

Erfahren Sie, wie Sie mit ML.NET Machine Learning-Modelle erstellen, Metriken erfassen und die Leistung messen können.Learn how to build machine learning models, collect metrics, and measure performance with ML.NET. Obwohl dieses Beispiel ein Regressionsmodell trainiert, sind die Konzepte für einen Großteil der anderen Algorithmen anwendbar.Although this sample trains a regression model, the concepts are applicable throughout a majority of the other algorithms.

Aufteilen von Daten für Training und TestsSplit data for training and testing

Mit einem Machine Learning-Modell sollen Muster innerhalb von Trainingsdaten erkannt werden.The goal of a machine learning model is to identify patterns within training data. Diese Muster werden zum Treffen von Vorhersagen mit neuen Daten verwendet.These patterns are used to make predictions using new data.

Die Daten können durch eine Klasse wie HousingData modelliert werden.The data can be modeled by a class like HousingData.

public class HousingData
{
    [LoadColumn(0)]
    public float Size { get; set; }

    [LoadColumn(1, 3)]
    [VectorType(3)]
    public float[] HistoricalPrices { get; set; }

    [LoadColumn(4)]
    [ColumnName("Label")]
    public float CurrentPrice { get; set; }
}

Dafür müssen die folgenden Daten vorhanden sein, die in eine IDataView geladen werden.Given the following data which is loaded into an IDataView.

HousingData[] housingData = new HousingData[]
{
    new HousingData
    {
        Size = 600f,
        HistoricalPrices = new float[] { 100000f ,125000f ,122000f },
        CurrentPrice = 170000f
    },
    new HousingData
    {
        Size = 1000f,
        HistoricalPrices = new float[] { 200000f, 250000f, 230000f },
        CurrentPrice = 225000f
    },
    new HousingData
    {
        Size = 1000f,
        HistoricalPrices = new float[] { 126000f, 130000f, 200000f },
        CurrentPrice = 195000f
    },
    new HousingData
    {
        Size = 850f,
        HistoricalPrices = new float[] { 150000f,175000f,210000f },
        CurrentPrice = 205000f
    },
    new HousingData
    {
        Size = 900f,
        HistoricalPrices = new float[] { 155000f, 190000f, 220000f },
        CurrentPrice = 210000f
    },
    new HousingData
    {
        Size = 550f,
        HistoricalPrices = new float[] { 99000f, 98000f, 130000f },
        CurrentPrice = 180000f
    }
};

Verwenden Sie die TrainTestSplit-Methode, um die Daten in Trainings- und Testsätze aufzuteilen.Use the TrainTestSplit method to split the data into train and test sets. Das Ergebnis ist ein TrainTestData-Objekt, das zwei IDataView-Member enthält, eines für den Trainings- und das andere für den Testsatz.The result will be a TrainTestData object which contains two IDataView members, one for the train set and the other for the test set. Der Prozentsatz der Datenaufteilung wird durch den testFraction-Parameter bestimmt.The data split percentage is determined by the testFraction parameter. Der folgende Ausschnitt enthält 20 Prozent der Originaldaten für den Testsatz.The snippet below is holding out 20 percent of the original data for the test set.

DataOperationsCatalog.TrainTestData dataSplit = mlContext.Data.TrainTestSplit(data, testFraction: 0.2);
IDataView trainData = dataSplit.TrainSet;
IDataView testData = dataSplit.TestSet;

Vorbereiten der DatenPrepare the data

Die Daten müssen vor dem Training eines Machine Learning-Modells vorverarbeitet werden.The data needs to be pre-processed before training a machine learning model. Weitere Informationen zur Datenaufbereitung finden Sie im Anleitungsartikel für die Datenaufbereitung sowie in transforms page.More information on data preparation can be found on the data prep how-to article as well as the transforms page.

Bei ML.NET-Algorithmen gibt es Einschränkungen hinsichtlich der Eingabespaltentypen.ML.NET algorithms have constraints on input column types. Außerdem werden für Ein- und Ausgabespaltennamen Standardwerte verwendet, wenn keine Werte angegeben werden.Additionally, default values are used for input and output column names when no values are specified.

Arbeiten mit erwarteten SpaltentypenWorking with expected column types

Die Machine Learning-Algorithmen in ML.NET erwarten als Eingabe einen Float-Vektor mit bekannter Größe.The machine learning algorithms in ML.NET expect a float vector of known size as input. Wenden Sie das VectorType-Attribut auf Ihr Datenmodell an, wenn alle Daten bereits im numerischen Format vorliegen und gemeinsam verarbeitet werden sollen (z.B. Bildpunkte).Apply the VectorType attribute to your data model when all of the data is already in numerical format and is intended to be processed together (i.e. image pixels).

Wenn die Daten nicht alle numerisch sind und Sie unterschiedliche Datentransformationen auf jede der Spalten einzeln anwenden möchten, verwenden Sie die Concatenate-Methode, nachdem alle Spalten verarbeitet wurden, um alle einzelnen Spalten zu einem einzigen Featurevektor zu kombinieren, der an eine neue Spalte ausgegeben wird.If data is not all numerical and you want to apply different data transformations on each of the columns individually, use the Concatenate method after all of the columns have been processed to combine all of the individual columns into a single feature vector that is output to a new column.

Das folgende Ausschnitt kombiniert die Spalten Size und HistoricalPrices zu einem einzigen Featurevektor, der in eine neue Spalte namens Features ausgegeben wird.The following snippet combines the Size and HistoricalPrices columns into a single feature vector that is output to a new column called Features. Da es einen Unterschied in den Skalierungen gibt, wird NormalizeMinMax auf die Spalte Features angewendet, um die Daten zu normalisieren.Because there is a difference in scales, NormalizeMinMax is applied to the Features column to normalize the data.

// Define Data Prep Estimator
// 1. Concatenate Size and Historical into a single feature vector output to a new column called Features
// 2. Normalize Features vector
IEstimator<ITransformer> dataPrepEstimator =
    mlContext.Transforms.Concatenate("Features", "Size", "HistoricalPrices")
        .Append(mlContext.Transforms.NormalizeMinMax("Features"));

// Create data prep transformer
ITransformer dataPrepTransformer = dataPrepEstimator.Fit(trainData);

// Apply transforms to training data
IDataView transformedTrainingData = dataPrepTransformer.Transform(trainData);

Arbeiten mit standardmäßigen SpaltennamenWorking with default column names

ML.NET-Algorithmen verwenden standardmäßige Spaltennamen, wenn keine Namen angegeben sind.ML.NET algorithms use default column names when none are specified. Alle Trainer haben einen Parameter namens featureColumnName für die Eingaben des Algorithmus und gegebenenfalls auch einen Parameter für den erwarteten Wert namens labelColumnName.All trainers have a parameter called featureColumnName for the inputs of the algorithm and when applicable they also have a parameter for the expected value called labelColumnName. Standardmäßig sind das die Werte Features bzw. Label.By default those values are Features and Label respectively.

Durch die Verwendung der Concatenate-Methode während der Vorverarbeitung zum Erstellen einer neuen Spalte mit dem Namen Features muss der Name der Featurespalte nicht in den Parametern des Algorithmus angegeben werden, da er bereits in der vorverarbeiteten IDataView vorhanden ist.By using the Concatenate method during pre-processing to create a new column called Features, there is no need to specify the feature column name in the parameters of the algorithm since it already exists in the pre-processed IDataView. Die Bezeichnungsspalte ist CurrentPrice, aber da das ColumnName-Attribut im Datenmodell verwendet wird, benennt ML.NET die CurrentPrice-Spalte in Label um, sodass der labelColumnName-Parameter dem Estimator des Machine Learning-Algorithmus nicht mehr bereitgestellt werden muss.The label column is CurrentPrice, but since the ColumnName attribute is used in the data model, ML.NET renames the CurrentPrice column to Label which removes the need to provide the labelColumnName parameter to the machine learning algorithm estimator.

Wenn Sie die standardmäßigen Spaltennamen nicht verwenden möchten, übergeben Sie die Namen der Feature- und Bezeichnungsspalten als Parameter bei der Definition des Estimators des Maschine Learning-Algorithmus, wie im nachfolgenden Ausschnitt gezeigt:If you don't want to use the default column names, pass in the names of the feature and label columns as parameters when defining the machine learning algorithm estimator as demonstrated by the subsequent snippet:

var UserDefinedColumnSdcaEstimator = mlContext.Regression.Trainers.Sdca(labelColumnName: "MyLabelColumnName", featureColumnName: "MyFeatureColumnName");

Trainieren des Machine Learning-ModellsTrain the machine learning model

Sobald die Daten vorverarbeitet sind, verwenden Sie die Fit-Methode, um das Machine Learning-Modell mit dem StochasticDualCoordinateAscent-Regressionsalgorithmus zu trainieren.Once the data is pre-processed, use the Fit method to train the machine learning model with the StochasticDualCoordinateAscent regression algorithm.

// Define StochasticDualCoordinateAscent regression algorithm estimator
var sdcaEstimator = mlContext.Regression.Trainers.Sdca();

// Build machine learning model
var trainedModel = sdcaEstimator.Fit(transformedTrainingData);

Extrahieren von ModellparameternExtract model parameters

Nachdem das Modell trainiert wurde, extrahieren Sie die gelernten ModelParameters zur Überprüfung oder für das erneute Training.After the model has been trained, extract the learned ModelParameters for inspection or re-training. Die LinearRegressionModelParameters stellen den den Trend und die erlernten Koeffizienten oder Gewichtungen des trainierten Modells bereit.The LinearRegressionModelParameters provide the bias and learned coefficients or weights of the trained model.

var trainedModelParameters = trainedModel.Model as LinearRegressionModelParameters;

Hinweis

Andere Modelle haben für ihre Aufgaben spezifische Parameter.Other models have parameters that are specific to their tasks. So stellt beispielsweise der K-Means-Algorithmus Daten in einen Cluster basierend auf Schwerpunkten bereit, und der KMeansModelParameters enthält eine Eigenschaft, die diese erlernten Schwerpunkte speichert.For example, the K-Means algorithm puts data into cluster based on centroids and the KMeansModelParameters contains a property that stores these learned centroids. Um mehr zu erfahren, lesen Sie die Microsoft.ML.Trainers-API-Dokumentation, und suchen Sie nach Klassen, die ModelParameters in ihrem Namen enthalten.To learn more, visit the Microsoft.ML.Trainers API Documentation and look for classes that contain ModelParameters in their name.

Bewerten der ModellqualitätEvaluate model quality

Um die Auswahl des leistungsstärksten Modells zu erleichtern, muss die Leistung anhand von Testdaten bewertet werden.To help choose the best performing model, it is essential to evaluate its performance on test data. Verwenden Sie die Evaluate-Methode, um verschiedene Metriken für das trainierte Modell zu messen.Use the Evaluate method, to measure various metrics for the trained model.

Hinweis

Die Evaluate-Methode liefert unterschiedliche Metriken, je nachdem, welche Machine Learning-Aufgabe durchgeführt wurde.The Evaluate method produces different metrics depending on which machine learning task was performed. Um mehr zu erfahren, lesen Sie die Microsoft.ML.Data-API-Dokumentation, und suchen Sie nach Klassen, die Metrics in ihrem Namen enthalten.For more details, visit the Microsoft.ML.Data API Documentation and look for classes that contain Metrics in their name.

// Measure trained model performance
// Apply data prep transformer to test data
IDataView transformedTestData = dataPrepTransformer.Transform(testData);

// Use trained model to make inferences on test data
IDataView testDataPredictions = trainedModel.Transform(transformedTestData);

// Extract model metrics and get RSquared
RegressionMetrics trainedModelMetrics = mlContext.Regression.Evaluate(testDataPredictions);
double rSquared = trainedModelMetrics.RSquared;

Im vorherigen Codebeispiel:In the previous code sample:

  1. Das Testdataset wird unter Verwendung der zuvor definierten Datenaufbereitungstransformationen vorverarbeitet.Test data set is pre-processed using the data preparation transforms previously defined.
  2. Das trainierte Machine Learning-Modell wird verwendet, um Vorhersagen zu den Testdaten zu treffen.The trained machine learning model is used to make predictions on the test data.
  3. Bei der Evaluate-Methode werden die Werte in der Spalte CurrentPrice des Testdatasets mit der Spalte Score der neu ausgegebenen Vorhersagen verglichen, um die Metriken für das Regressionsmodell zu berechnen, von dem das Bestimmtheitsmaß in der rSquared-Variablen gespeichert wird.In the Evaluate method, the values in the CurrentPrice column of the test data set are compared against the Score column of the newly output predictions to calculate the metrics for the regression model, one of which, R-Squared is stored in the rSquared variable.

Hinweis

In diesem kleinen Beispiel ist das Bestimmtheitsmaß eine Zahl, die aufgrund der begrenzten Größe der Daten nicht im Bereich von 0-1 liegt.In this small example, the R-Squared is a number not in the range of 0-1 because of the limited size of the data. In einem realen Szenario sollten Sie mit einem Wert zwischen 0 und 1 rechnen.In a real-world scenario, you should expect to see a value between 0 and 1.