Nuevo entrenamiento de un modelo
Obtenga información sobre cómo volver a entrenar un modelo de Machine Learning en ML.NET.
El mundo y los datos alrededor de este cambian a un ritmo constante. Por lo tanto, los modelos también deben cambiar y actualizarse. ML.NET proporciona funcionalidad para modelos de nuevo entrenamiento mediante parámetros de modelo aprendidos como un punto inicial para compilar continuamente en la experiencia anterior, en lugar de hacerlo cada vez desde el principio.
Los algoritmos siguientes se pueden volver a entrenar en ML.NET:
- AveragedPerceptronTrainer
- FieldAwareFactorizationMachineTrainer
- LbfgsLogisticRegressionBinaryTrainer
- LbfgsMaximumEntropyMulticlassTrainer
- LbfgsPoissonRegressionTrainer
- LinearSvmTrainer
- OnlineGradientDescentTrainer
- SgdCalibratedTrainer
- SgdNonCalibratedTrainer
- SymbolicSgdLogisticRegressionBinaryTrainer
Carga del modelo previamente entrenado
En primer lugar, cargue el modelo previamente entrenado 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 del modelo previamente entrenado
Una vez que se ha cargado el modelo, extraiga los parámetros del modelo entrenado accediendo a la propiedad Model del modelo previamente entrenado. El modelo previamente entrenado se ha entrenado con el modelo de regresión lineal OnlineGradientDescentTrainer, que crea un objeto RegressionPredictionTransformer que genera LinearRegressionModelParameters. Estos parámetros del modelo contienen el sesgo aprendido, y pesos o coeficientes del modelo. Estos valores se usarán como punto inicial para el nuevo modelo entrenado.
// 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 el 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 como entrada los parámetros del modelo entrenado original y los usa como punto inicial en el proceso de nuevo entrenamiento.
// 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, se puede guardar el modelo que se ha vuelto a entrenar 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 saber si realmente se produjo el nuevo entrenamiento? Una manera sería comparar si los parámetros del modelo entrenado son diferentes a los del modelo original. El siguiente ejemplo de código compara el original con los pesos del modelo que se volvió a entrenar y los genera en 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 siguiente tabla se muestra el aspecto que podría tener 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 |