Dela via


Träna en modell igen

Lär dig hur du tränar om en maskininlärningsmodell i ML.NET.

Världen och dess data förändras ständigt. Därför måste modeller också ändras och uppdateras. ML.NET tillhandahåller funktioner för omträning av modeller med inlärda modellparametrar som utgångspunkt för att kontinuerligt bygga vidare på tidigare erfarenheter i stället för att börja från grunden varje gång.

Följande algoritmer kan tränas om i ML.NET:

Läsa in förtränad modell

Läs först in den förtränad modellen i ditt program. Mer information om hur du läser in träningspipelines och modeller finns i Spara och läsa in en tränad modell.

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

Extrahera förtränad modellparametrar

När modellen har lästs in extraherar du inlärda modellparametrar genom att Model komma åt egenskapen för den förtränad modellen. Den förtränade modellen tränades med hjälp av den linjära regressionsmodellen OnlineGradientDescentTrainer, som skapar en RegressionPredictionTransformer som matar ut LinearRegressionModelParameters. Dessa modellparametrar innehåller modellens inlärda bias och vikter eller koefficienter. Dessa värden används som utgångspunkt för den nya omtränad modellen.

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

Kommentar

Modellparametrarnas utdata beror på vilken algoritm som används. Till exempel OnlineGradientDescentTrainer använder LinearRegressionModelParameters, medan LbfgsMaximumEntropyMulticlassTrainer matar ut MaximumEntropyModelParameters. När du extraherar modellparametrar ska du ställa in till lämplig typ.

Träna en modell igen

Processen för omträning av en modell skiljer sig inte från träningen av en modell. Den enda skillnaden är Fit att metoden utöver data även tar de ursprungliga inlärda modellparametrarna som indata och använder dem som utgångspunkt i omträningsprocessen.

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

Nu kan du spara din omtränad modell och använda den i ditt program. Mer information finns i spara och läsa in en tränad modell och göra förutsägelser med en tränad modellguider .

Jämför modellparametrar

Hur vet du om omträningen verkligen skedde? Ett sätt är att jämföra om den omtränad modellens parametrar skiljer sig från den ursprungliga modellens. Följande kodexempel jämför originalet med de omtränada modellvikterna och matar ut dem till konsolen.

// 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]}");
}

I följande tabell visas hur utdata kan se ut.

Original Omtränad Differens
33039.86 56293.76 -23253.9
29099.14 49586.03 -20486.89
28938.38 48609.23 -19670.85
30484.02 53745.43 -23261.41