Ripetere il training di un modello
Informazioni su come ripetere il training di un modello di Machine Learning in ML.NET.
Il mondo e i relativi dati cambiano costantemente. Di conseguenza, è necessario modificare e aggiornare anche i modelli. ML.NET offre funzionalità per ripetere il training dei modelli usando i parametri del modello appreso come punto di partenza per continuare a sfruttare le esperienze precedenti anziché iniziare ogni volta da zero.
In ML.NET è possibile ripetere il training degli algoritmi seguenti:
- AveragedPerceptronTrainer
- FieldAwareFactorizationMachineTrainer
- LbfgsLogisticRegressionBinaryTrainer
- LbfgsMaximumEntropyMulticlassTrainer
- LbfgsPoissonRegressionTrainer
- LinearSvmTrainer
- OnlineGradientDescentTrainer
- SgdCalibratedTrainer
- SgdNonCalibratedTrainer
- SymbolicSgdLogisticRegressionBinaryTrainer
Caricare il modello con training preliminare
Carica prima il modello con training preliminare nell'applicazione. Per altre informazioni sul caricamento di pipeline e modelli di training, vedere Salvare e caricare un modello sottoposto a training.
// 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);
Estrarre i parametri del modello con training preliminare
Dopo aver caricato il modello, estrai i parametri del modello appreso accedendo alla proprietà Model
del modello con training preliminare. Il modello con training preliminare era stato sottoposto a training usando il modello di regressione lineare OnlineGradientDescentTrainer
che crea una classe RegressionPredictionTransformer
che restituisce LinearRegressionModelParameters
. Questi parametri del modello contengono la distorsione e i pesi o i coefficienti appresi del modello. Questi valori verranno usati come punto iniziale per il nuovo modello.
// Extract trained model parameters
LinearRegressionModelParameters originalModelParameters =
((ISingleFeaturePredictionTransformer<object>)trainedModel).Model as LinearRegressionModelParameters;
Nota
L'output dei parametri del modello dipende dall'algoritmo usato. Ad esempio OnlineGradientDescentTrainer
usa LinearRegressionModelParameters
, mentre LbfgsMaximumEntropyMulticlassTrainer restituisce MaximumEntropyModelParameters
. Quando si estraggono i parametri del modello, eseguire il cast al tipo appropriato.
Ripetere il training di un modello
Il processo di ripetizione del training di un modello non è diverso da quello di training di un modello. L'unica differenza sta nel fatto che oltre ai dati, il metodo Fit
acquisisce anche i parametri del modello appreso originale come input e li usa come punto di partenza nel processo di ripetizione del training.
// 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);
A questo punto, puoi salvare nuovamente il modello sottoposto a training e usarlo nell'applicazione. Per altre informazioni, vedere salvataggio e caricamento di un modello sottoposto a training ed eseguire stime con guide al modello con training.
Confrontare i parametri del modello
Come si può verificare che il training sia stato effettivamente ripetuto? Un modo per verificarlo è confrontare i parametri del modello di cui si è ripetuto il training con quelli del modello originale e vedere se sono diversi. Il codice di esempio seguente confronta i pesi del modello originale con quelli del modello di nuovo sottoposto a training e li visualizza nella console.
// 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]}");
}
La tabella seguente illustra il possibile output.
Originale | Training ripetuto | Differenza |
---|---|---|
33039.86 | 56293.76 | -23253.9 |
29099.14 | 49586.03 | -20486.89 |
28938.38 | 48609.23 | -19670.85 |
30484.02 | 53745.43 | -23261.41 |