Partager via


Recycler un modèle

Apprenez à réentraîner un modèle Machine Learning dans ML.NET.

Le monde et ses données changent constamment. Ainsi, les modèles doivent également subir des changements et des mises à jour. ML.NET fournit des fonctionnalités à l’aide desquelles vous pouvez réentraîner des modèles à partir de paramètres de modèle appris. Ainsi, en vous appuyant en permanence sur l’expérience acquise, vous n’avez pas besoin de repartir de zéro à chaque fois.

Vous pouvez réentraîner les algorithmes suivants dans ML.NET :

Charger un modèle préentraîné

Tout d’abord, chargez le modèle préentraîné dans votre application. Pour en savoir plus sur le chargement de pipelines et de modèles d’entraînement, consultez Enregistrer et charger un modèle entraîné.

// 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);

Extraire les paramètres du modèle préentraîné

Une fois le modèle chargé, extrayez les paramètres du modèle appris en accédant à la propriété Model du modèle préentraîné. Le modèle préentraîné a été entraîné à l’aide du modèle de régression linéaire OnlineGradientDescentTrainer, qui crée un RegressionPredictionTransformer qui génère des LinearRegressionModelParameters. Ces paramètres de modèle contiennent le biais appris, et les pondérations ou les coefficients du modèle. Ces valeurs sont utilisées comme point de départ pour le nouveau modèle réentraîné.

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

Remarque

La sortie des paramètres du modèle dépend de l’algorithme utilisé. Par exemple, OnlineGradientDescentTrainer utilise LinearRegressionModelParameters, tandis que LbfgsMaximumEntropyMulticlassTrainer produit en sortie des MaximumEntropyModelParameters. Lors de l’extraction des paramètres du modèle, effectuez un cast vers le type approprié.

Recycler un modèle

Le processus de réentraînement d’un modèle ressemble beaucoup au processus d’entraînement d’un modèle. La seule différence est que la méthode Fit, en plus des données, prend en entrée les paramètres du modèle appris d’origine et les utilise comme point de départ dans le processus de réentraînement.

// 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);

À ce stade, vous pouvez enregistrer votre modèle réentraîné et l’utiliser dans votre application. Pour plus d’informations, consultez les guides Enregistrer et charger un modèle entraîné et Faire des prédictions avec un modèle entraîné.

Comparer les paramètres de modèle

Comment savoir si un réentraînement a eu lieu ? Une solution consiste à déterminer si les paramètres du modèle réentraîné sont différents de ceux du modèle d’origine. L’exemple de code suivant compare les pondérations du modèle d’origine à celles du modèle réentraîné et les envoie à la 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]}");
}

Le tableau suivant montre à quoi peut ressembler la sortie.

Original Réentraîné Différence
33039.86 56293.76 -23253.9
29099.14 49586.03 -20486.89
28938.38 48609.23 -19670.85
30484.02 53745.43 -23261.41