Volver a entrenar un modelo

Obtenga información sobre cómo volver a entrenar un modelo de Machine Learning en ML.NET.

El mundo y sus datos cambian constantemente. Por lo tanto, los modelos también deben cambiar y actualizarse. ML.NET proporciona funcionalidad para volver a entrenar modelos mediante parámetros de modelo aprendidos como punto de partida para crear continuamente la experiencia anterior en lugar de empezar desde cero cada vez.

Los algoritmos siguientes se pueden volver a entrenar en ML.NET:

Carga del modelo entrenado previamente

En primer lugar, cargue el modelo entrenado previamente en la aplicación. Para obtener más información sobre la carga de modelos y canalizaciones de entrenamiento, consulte Guardar y cargar modelos entrenados.

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

Extracción de parámetros de modelo previamente entrenados

Una vez cargado el modelo, extraiga los parámetros del modelo aprendido accediendo a la propiedad Model del modelo previamente entrenado. El modelo entrenado previamente se entrenó mediante el modelo de regresión lineal OnlineGradientDescentTrainer, que crea un RegressionPredictionTransformer que genera LinearRegressionModelParameters. Estos parámetros del modelo contienen el sesgo aprendido, y pesos o coeficientes del modelo. Estos valores se usan como punto de partida para el nuevo modelo reentrenado.

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

Nota:

La salida de los parámetros del modelo depende del algoritmo utilizado. Por ejemplo, OnlineGradientDescentTrainer usa LinearRegressionModelParameters, mientras que LbfgsMaximumEntropyMulticlassTrainer genera una salida MaximumEntropyModelParameters. Al extraer parámetros del modelo, se convierte al tipo adecuado.

Volver a entrenar un modelo

El proceso para volver a entrenar un modelo es similar al de entrenamiento de un modelo. La única diferencia es que el método Fit además de los datos también toma los parámetros del modelo aprendido original como entrada y los usa como punto de partida en el proceso de reentrenamiento.

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

En este momento, puede guardar el modelo reentrenado y usarlo en la aplicación. Para obtener más información, vea las guías Guardar y cargar un modelo entrenado y Realizar predicciones con un modelo entrenado.

Comparar parámetros del modelo

¿Cómo sabe si se ha producido un nuevo entrenamiento? Una manera sería comparar si los parámetros del modelo reentrenado son diferentes a los del modelo original. El ejemplo de código siguiente compara el original con los pesos del modelo reentrenados y los envía a la consola.

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

En la tabla siguiente se muestra el aspecto de la salida.

Original Vuelto a entrenar Diferencia
33039.86 56293.76 -23253.9
29099.14 49586.03 -20486.89
28938.38 48609.23 -19670.85
30484.02 53745.43 -23261.41