Entrenamiento de un modelo de Machine Learning mediante la validación cruzada
Aprenda a usar la validación cruzada para entrenar modelos de aprendizaje automático más sólidos en ML.NET.
La validación cruzada es una técnica de entrenamiento y evaluación de modelos que divide los datos en varias particiones y entrena varios algoritmos en estas particiones. Esta técnica mejora la solidez del modelo manteniendo los datos del proceso de entrenamiento. Además de mejorar el rendimiento en observaciones no vistos, en entornos restringidos a datos puede ser una herramienta eficaz para entrenar modelos con un conjunto de datos más pequeño.
Los datos y el modelo de datos
Dados los datos de un archivo que tiene el formato siguiente:
Size (Sq. ft.), HistoricalPrice1 ($), HistoricalPrice2 ($), HistoricalPrice3 ($), Current Price ($)
620.00, 148330.32, 140913.81, 136686.39, 146105.37
550.00, 557033.46, 529181.78, 513306.33, 548677.95
1127.00, 479320.99, 455354.94, 441694.30, 472131.18
1120.00, 47504.98, 45129.73, 43775.84, 46792.41
Los datos se pueden modelar mediante una clase como HousingData
y cargarlos en un IDataView
.
public class HousingData
{
[LoadColumn(0)]
public float Size { get; set; }
[LoadColumn(1, 3)]
[VectorType(3)]
public float[] HistoricalPrices { get; set; }
[LoadColumn(4)]
[ColumnName("Label")]
public float CurrentPrice { get; set; }
}
Preparación de los datos
Preprocese los datos antes de usarlos para compilar el modelo de Machine Learning. En este ejemplo, las columnas Size
y HistoricalPrices
se combinan en un único vector de característica, que se genera en una nueva columna denominada Features
mediante el método Concatenate
. Además de preparar los datos en el formato esperado por los algoritmos de ML.NET, la concatenación de columnas optimiza las operaciones posteriores en la canalización al aplicar la operación una sola vez a la columna concatenada, en lugar de aplicar la operación a cada columna por separado.
Una vez que las columnas se combinan en un único vector, NormalizeMinMax
se aplica a la columna Features
para obtener Size
y HistoricalPrices
en el mismo intervalo entre 0 y 1.
// Define data prep estimator
IEstimator<ITransformer> dataPrepEstimator =
mlContext.Transforms.Concatenate("Features", new string[] { "Size", "HistoricalPrices" })
.Append(mlContext.Transforms.NormalizeMinMax("Features"));
// Create data prep transformer
ITransformer dataPrepTransformer = dataPrepEstimator.Fit(data);
// Transform data
IDataView transformedData = dataPrepTransformer.Transform(data);
Entrenamiento de modelos con validación cruzada
Una vez que los datos se hayan preprocesado, es el momento de entrenar el modelo. En primer lugar, seleccione el algoritmo que se alinea más estrechamente con la tarea de aprendizaje automático que se va a realizar. Dado que el valor previsto es un valor numérico continuo, la tarea es regresión. Uno de los algoritmos de regresión implementados por ML.NET es el algoritmo de StochasticDualCoordinateAscentCoordinator
. Para entrenar el modelo con validación cruzada, use el método CrossValidate
.
Nota
Aunque en este ejemplo se usa un modelo de regresión lineal, CrossValidate es aplicable a todas las demás tareas de aprendizaje automático de ML.NET excepto la detección de anomalías.
// Define StochasticDualCoordinateAscent algorithm estimator
IEstimator<ITransformer> sdcaEstimator = mlContext.Regression.Trainers.Sdca();
// Apply 5-fold cross validation
var cvResults = mlContext.Regression.CrossValidate(transformedData, sdcaEstimator, numberOfFolds: 5);
CrossValidate
realiza las siguientes operaciones:
- Divide los datos en un número de particiones igual al valor especificado en el parámetro
numberOfFolds
. El resultado de cada partición es un objetoTrainTestData
. - Un modelo se entrena en cada una de las particiones mediante el estimador de algoritmo de aprendizaje automático especificado en el conjunto de datos de entrenamiento.
- El rendimiento de cada modelo se evalúa mediante el método
Evaluate
en el conjunto de datos de prueba. - El modelo junto con sus métricas se devuelven para cada uno de los modelos.
El resultado almacenado en cvResults
es una colección de objetos CrossValidationResult
. Este objeto incluye el modelo entrenado, así como las métricas que son accesibles por las propiedades Model
y Metrics
respectivamente. En este ejemplo, la propiedad Model
es de tipo ITransformer
y la propiedad Metrics
es de tipo RegressionMetrics
.
Evaluación del modelo
Se puede acceder a las métricas de los distintos modelos entrenados a través de la propiedad Metrics
del objeto CrossValidationResult
individual. En este caso, se accede a la métrica R-Cuadrado y se almacena en la variable rSquared
.
IEnumerable<double> rSquared =
cvResults
.Select(fold => fold.Metrics.RSquared);
Si inspecciona el contenido de la variable rSquared
, la salida debe ser de cinco valores que van de 0 a 1, donde más cerca de 1 significa mejor. Con métricas como R-Squared, seleccione los modelos de mejor a peor rendimiento. A continuación, seleccione el modelo superior para realizar predicciones o realizar operaciones adicionales con.
// Select all models
ITransformer[] models =
cvResults
.OrderByDescending(fold => fold.Metrics.RSquared)
.Select(fold => fold.Model)
.ToArray();
// Get Top Model
ITransformer topModel = models[0];