Ein Modell neu trainieren
Erfahren Sie, wie Sie ein Machine Learning-Modell in ML.NET neu 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 die Umschulung von Modellen mithilfe von gelernten Modellparametern als Ausgangspunkt, um kontinuierlich auf früheren Erfahrungen aufzubauen, anstatt jedes Mal von Grund auf neu zu beginnen.
Die folgenden Algorithmen können in ML.NET neu trainiert werden:
- AveragedPerceptronTrainer
- FieldAwareFactorizationMachineTrainer
- LbfgsLogisticRegressionBinaryTrainer
- LbfgsMaximumEntropyMulticlassTrainer
- LbfgsPoissonRegressionTrainer
- LinearSvmTrainer
- OnlineGradientDescentTrainer
- SgdCalibratedTrainer
- SgdNonCalibratedTrainer
- SymbolicSgdLogisticRegressionBinaryTrainer
Laden eines vortrainierten Modells
Laden Sie zunächst das vortrainierte Modell in Ihrer Anwendung. Weitere Informationen zum Laden von Schulungspipelines 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
Nachdem das Modell geladen wurde, extrahieren Sie die gelernten Modellparameter, indem Sie auf die Eigenschaft Model
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 neu trainierte Modell verwendet.
// Extract trained model parameters
LinearRegressionModelParameters originalModelParameters =
((ISingleFeaturePredictionTransformer<object>)trainedModel).Model as LinearRegressionModelParameters;
Anmerkung
Die Ausgabe der Modellparameter hängt vom verwendeten Algorithmus ab. Beispielsweise verwendet OnlineGradientDescentTrainer
LinearRegressionModelParameters
, während LbfgsMaximumEntropyMulticlassTrainerMaximumEntropyModelParameters
ausgibt. Beim Extrahieren von Modellparametern wird die Umwandlung in den entsprechenden Typ verwendet.
Ein Modell neu trainieren
Der Prozess zur Umschulung eines Modells unterscheidet sich nicht von der Schulung eines Modells. Der einzige Unterschied besteht darin, dass Sie ein zusätzliches Argument an die Fit(IDataView, LinearModelParameters) Methode übergeben: die ursprünglich gelernten Modellparameter. Fit()
nutzt sie als Ausgangspunkt für den erneuten Trainingsprozess.
// 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 neu trainiertes Modell speichern und in Ihrer Anwendung verwenden. Weitere Informationen finden Sie unter Speichern und Laden eines trainierten Modells und Erstellen von Vorhersagen mit einem trainierten Modell.
Modellparameter vergleichen
Wie wissen Sie, ob die Umschulung tatsächlich erfolgt ist? Eine Möglichkeit besteht darin, zu vergleichen, ob sich die Parameter des neu trainierten Modells von denen des ursprünglichen Modells 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 |