Ponowne trenowanie modelu
Dowiedz się, jak ponownie trenować model uczenia maszynowego w ML.NET.
Świat i jego dane stale się zmieniają. W związku z tym modele muszą również ulec zmianie i zaktualizować. ML.NET zapewnia funkcje ponownego trenowania modeli przy użyciu poznanych parametrów modelu jako punktu początkowego, aby stale opierać się na poprzednim środowisku, a nie rozpoczynać od podstaw za każdym razem.
Następujące algorytmy można ponownie trenować w ML.NET:
- AveragedPerceptronTrainer
- FieldAwareFactorizationMachineTrainer
- LbfgsLogisticRegressionBinaryTrainer
- LbfgsMaximumEntropyMulticlassTrainer
- LbfgsPoissonRegressionTrainer
- LinearSvmTrainer
- OnlineGradientDescentTrainer
- SgdCalibratedTrainer
- SgdNonCalibratedTrainer
- SymboliczneSgdTrenerBinarnejRegresjiLogistycznej
Ładowanie wstępnie wytrenowanego modelu
Najpierw załaduj wstępnie wytrenowany model do aplikacji. Aby dowiedzieć się więcej na temat ładowania potoków treningowych i modeli, zobacz Zapisywanie i ładowanie wytrenowanego modelu.
// 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);
Wyodrębnianie wstępnie wytrenowanych parametrów modelu
Po załadowaniu modelu wyodrębnij poznane parametry modelu, korzystając z właściwości Model
wstępnie wytrenowanego modelu. Model wstępnie wytrenowano, korzystając z modelu regresji liniowej OnlineGradientDescentTrainer
, który tworzy RegressionPredictionTransformer
i generuje LinearRegressionModelParameters
. Te parametry modelu zawierają wyuczone błąd i wagi lub współczynniki modelu. Te wartości są używane jako punkt wyjścia dla nowego przetrenowanego modelu.
// Extract trained model parameters
LinearRegressionModelParameters originalModelParameters =
((ISingleFeaturePredictionTransformer<object>)trainedModel).Model as LinearRegressionModelParameters;
Notatka
Dane wyjściowe parametrów modelu zależą od używanego algorytmu. Na przykład OnlineGradientDescentTrainer
używa LinearRegressionModelParameters
, podczas gdy LbfgsMaximumEntropyMulticlassTrainer wyprowadza MaximumEntropyModelParameters
. Podczas wyodrębniania parametrów modelu, zastosuj rzutowanie do odpowiedniego typu.
Ponowne trenowanie modelu
Proces ponownego trenowania modelu nie różni się od procesu trenowania modelu. Jedyną różnicą jest przekazanie dodatkowego argumentu do metody Fit(IDataView, LinearModelParameters): oryginalnych wyuczonych parametrów modelu.
Fit()
używa ich jako punktu początkowego w procesie ponownego trenowania.
// 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);
W tym momencie możesz zapisać przetrenowany model i użyć go w swojej aplikacji. Aby uzyskać więcej informacji, zobacz Zapisywanie i ładowanie wytrenowanego modelu i Tworzenie przewidywań przy użyciu wytrenowanego modelu.
Porównanie parametrów modelu
Jak sprawdzić, czy rzeczywiście doszło do ponownego trenowania? Jednym ze sposobów jest porównanie, czy parametry przetrenowanego modelu różnią się od parametrów oryginalnego modelu. Poniższy przykładowy kod porównuje oryginał z ponownie wytrenowanymi wagami modelu i wyprowadza je do konsoli.
// 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]}");
}
W poniższej tabeli przedstawiono, jak mogą wyglądać dane wyjściowe.
Oryginał | Ponowne trenowanie | Różnica |
---|---|---|
33039.86 | 56293.76 | -23253.9 |
29099.14 | 49586.03 | -20486.89 |
28938,38 | 48609.23 | -19670.85 |
30484.02 | 53745.43 | -23261.41 |