Ein Modell neu trainieren

Erfahren Sie, wie ein Machine Learning-Modell in ML.NET erneut trainieren.

Die Welt und ihre Daten ändern sich ständig. Daher müssen auch Modelle geändert und aktualisiert werden. ML.NET bietet Funktionen für das erneute Trainieren von Modellen unter Verwendung erlernter Modellparameter als Ausgangspunkt, um kontinuierlich auf früheren Erfahrungen aufzubauen, anstatt jedes Mal bei null anzufangen.

Die folgenden Algorithmen sind in ML.NET erneut trainierbar:

Laden eines vortrainierten Modells

Laden Sie zunächst das vortrainierte Modell in Ihrer Anwendung. Weitere Informationen über das Laden von Trainingspipelines und -modellen finden Sie unter Speichern und Laden eines trainierten Modells.

// Create MLContext
MLContext mlContext = new MLContext();

// Define DataViewSchema of data prep pipeline and trained model
DataViewSchema dataPrepPipelineSchema, modelSchema;

// Load data preparation pipeline
ITransformer dataPrepPipeline = mlContext.Model.Load("data_preparation_pipeline.zip", out dataPrepPipelineSchema);

// Load trained model
ITransformer trainedModel = mlContext.Model.Load("ogd_model.zip", out modelSchema);

Extrahieren von vortrainierten Modellparametern

Sobald das Modell geladen ist, extrahieren Sie die erlernten Modellparameter, indem Sie auf die Model-Eigenschaft des vortrainierten Modells zugreifen. Das vortrainierte Modell wurde mit dem linearen Regressionsmodell OnlineGradientDescentTrainer trainiert, das eine RegressionPredictionTransformer-Klasse erstellt, die LinearRegressionModelParameters ausgibt. Diese Modellparameter enthalten den erlernten Trend und die Gewichtung oder die Koeffizienten des Modells. Diese Werte werden als Ausgangspunkt für das neue, erneut trainierte Modell verwendet.

// Extract trained model parameters
LinearRegressionModelParameters originalModelParameters =
    ((ISingleFeaturePredictionTransformer<object>)trainedModel).Model as LinearRegressionModelParameters;

Hinweis

Die Ausgabe der Modellparameter hängt vom verwendeten Algorithmus ab. Beispielsweise verwendet OnlineGradientDescentTrainerLinearRegressionModelParameters, während LbfgsMaximumEntropyMulticlassTrainerMaximumEntropyModelParameters ausgibt. Beim Extrahieren von Modellparametern wird die Umwandlung in den entsprechenden Typ verwendet.

Ein Modell neu trainieren

Der Prozess des erneuten Trainierens eines Modells unterscheidet sich nicht von dem des Trainierens eines Modells. Der einzige Unterschied besteht darin, dass die Fit-Methode zusätzlich zu den Daten auch die ursprünglich erlernten Modellparameter als Eingabe übernimmt und sie als Ausgangspunkt für das erneute Training verwendet.

// New Data
HousingData[] housingData = new HousingData[]
{
    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
    }
};

//Load New Data
IDataView newData = mlContext.Data.LoadFromEnumerable<HousingData>(housingData);

// Preprocess Data
IDataView transformedNewData = dataPrepPipeline.Transform(newData);

// Retrain model
RegressionPredictionTransformer<LinearRegressionModelParameters> retrainedModel =
    mlContext.Regression.Trainers.OnlineGradientDescent()
        .Fit(transformedNewData, originalModelParameters);

An diesem Punkt können Sie Ihr erneut trainiertes Modell speichern und in Ihrer Anwendung verwenden. Weitere Informationen finden Sie unter Speichern und Laden eines trainierten Modells und Treffen von Vorhersagen mit einem trainierten Modell.

Vergleichen von Modellparametern

Woher wissen Sie, ob das Modell wirklich erneut trainiert wurde? Eine Möglichkeit wäre, zu vergleichen, ob sich die Parameter des erneut trainierten Modells von denen des Originalmodells unterscheiden. Das folgende Codebeispiel vergleicht das Original mit den Gewichtungen des erneut trainierten Modells und gibt sie in der Konsole aus.

// Extract Model Parameters of re-trained model
LinearRegressionModelParameters retrainedModelParameters = retrainedModel.Model as LinearRegressionModelParameters;

// Inspect Change in Weights
var weightDiffs =
    originalModelParameters.Weights.Zip(
        retrainedModelParameters.Weights, (original, retrained) => original - retrained).ToArray();

Console.WriteLine("Original | Retrained | Difference");
for(int i=0;i < weightDiffs.Count();i++)
{
    Console.WriteLine($"{originalModelParameters.Weights[i]} | {retrainedModelParameters.Weights[i]} | {weightDiffs[i]}");
}

In der folgenden Tabelle wird gezeigt, wie die Ausgabe aussehen kann.

Ursprünglich Erneut trainiert Unterschied
33039,86 56293,76 -23253,9
29099,14 49586,03 -20486,89
28938,38 48609,23 -19670,85
30484,02 53745,43 -23261,41