Opětovné trénování modelu
Naučte se přetrénovat model strojového učení v ML.NET.
Svět a její data se neustále mění. Modely se proto musí také měnit a aktualizovat. ML.NET poskytuje funkce pro přetrénování modelů, které používají naučené parametry modelu jako výchozí bod pro neustálé sestavování na předchozích zkušenostech, a ne vždy od začátku.
V ML.NET se dají přetrénovat následující algoritmy:
- AveragedPerceptronTrainer
- FieldAwareFactorizationMachineTrainer
- LbfgsLogisticRegressionBinaryTrainer
- LbfgsMaximumEntropyMulticlassTrainer
- LbfgsPoissonRegressionTrainer
- LinearSvmTrainer
- OnlineGradientDescentTrainer
- SgdCalibratedTrainer
- SgdNonCalibratedTrainer
- SymbolickéSgdLogisticRegressionBinaryTrainer
Načtení předem natrénovaného modelu
Nejprve načtěte předem natrénovaný model do aplikace. Další informace o načítání trénovacích kanálů a modelů najdete v tématu Uložení a načtení natrénovaného 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);
Extrahování předtrénovaných parametrů modelu
Po načtení modelu extrahujte naučené parametry modelu přístupem k Model
vlastnosti předtrénovaného modelu. Předtrénovaný model byl trénován pomocí lineární regresního modelu OnlineGradientDescentTrainer
, který vytvoří RegressionPredictionTransformer
výstup LinearRegressionModelParameters
. Tyto parametry modelu obsahují naučené předsudky a váhy nebo koeficienty modelu. Tyto hodnoty se používají jako výchozí bod nového přetrénovaného modelu.
// Extract trained model parameters
LinearRegressionModelParameters originalModelParameters =
((ISingleFeaturePredictionTransformer<object>)trainedModel).Model as LinearRegressionModelParameters;
Poznámka:
Výstup parametrů modelu závisí na použitém algoritmu. Například používá , zatímco LbfgsMaximumEntropyMulticlassTrainer výstupy MaximumEntropyModelParameters
.LinearRegressionModelParameters
OnlineGradientDescentTrainer
Při extrahování parametrů modelu přetypujte na příslušný typ.
Opětovné trénování modelu
Proces opětovného trénování modelu se neliší od trénování modelu. Jediným rozdílem je, že Fit
metoda kromě dat přebírá jako vstup i původní naučené parametry modelu a používá je jako výchozí bod v procesu opětovného trénování.
// 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);
V tomto okamžiku můžete model znovu natrénovaný uložit a použít ho ve své aplikaci. Další informace najdete v tématu uložení a načtení natrénovaného modelu a vytváření předpovědí pomocí trénovaných průvodců modelu .
Porovnání parametrů modelu
Jak poznáte, jestli k přetrénování skutečně došlo? Jedním ze způsobů by bylo porovnat, jestli se parametry přetrénovaného modelu liší od parametrů původního modelu. Následující ukázka kódu porovná původní hodnoty s přetrénovanými hmotnostmi modelu a vypíše je do konzoly.
// 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]}");
}
Následující tabulka ukazuje, jak může výstup vypadat.
Původní | Znovu natrénováno | Rozdíl |
---|---|---|
33039.86 | 56293.76 | -23253.9 |
29099.14 | 49586.03 | -20486.89 |
28938.38 | 48609.23 | -19670.85 |
30484.02 | 53745.43 | -23261.41 |