Entrenamiento de un modelo de aprendizaje automático con validación cruzada
Obtenga información sobre cómo usar la validación cruzada para entrenar modelos de aprendizaje automático más eficaces en ML.NET.
La validación cruzada es una técnica de evaluación de modelos y entrenamiento que divide los datos en diversas particiones y entrena varios algoritmos en estas particiones. Esta técnica mejora la estabilidad del modelo que contiene datos del proceso de entrenamiento. Además de mejorar el rendimiento en observaciones no vistas y en entornos con limitaciones de datos, puede ser una herramienta eficaz para el entrenamiento de modelos con un conjunto de datos más pequeño.
Los datos y el modelo de datos
Dados los datos desde 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 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
Procese previamente los datos antes de usarlos para compilar el modelo de aprendizaje automático. En este ejemplo, las columnas Size
y HistoricalPrices
se combinan en un vector de característica única, que se muestra en una nueva columna denominada Features
con el método Concatenate
. Además, para obtener 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 aplicando la operación una vez para la columna concatenada, en lugar de cada una de las columnas independientes.
Una vez que se han combinado las columnas en un vector único, 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 se han procesado previamente los datos, es hora de entrenar el modelo. En primer lugar, seleccione el algoritmo que mejor se adapte a la tarea de aprendizaje automático que debe realizarse. Dado que el valor de predicción es un valor numérico continuo, la tarea es la regresión. Uno de los algoritmos de regresión implementados por ML.NET es el algoritmo StochasticDualCoordinateAscentCoordinator
. Para entrenar el modelo con la validación cruzada, use el método CrossValidate
.
Nota
Aunque en este ejemplo se usa un modelo de regresión lineal, la validación cruzada se aplica a las demás tareas de aprendizaje automático en 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
lleva a cabo las operaciones siguientes:
- Divide los datos en un número de particiones iguales al valor especificado en el parámetro
numberOfFolds
. El resultado de cada partición es un objetoTrainTestData
. - Se entrena un modelo en cada una de las particiones con el estimador del algoritmo de aprendizaje automático especificado en el conjunto de datos de entrenamiento.
- El rendimiento de cada modelo se evalúa con el método
Evaluate
en el conjunto de datos de prueba. - El modelo, junto con sus métricas, se devuelve 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 desde las propiedades Model
y Metrics
respectivamente. En este ejemplo, la propiedad Model
es de tipo ITransformer
y la propiedad Metrics
es de tipo RegressionMetrics
.
Evaluar el modelo
Las métricas de los diferentes modelos entrenados se pueden acceder a través de la propiedad Metrics
del objeto CrossValidationResult
individual. En este caso, la métrica de R cuadrado se accede y almacena en la variable rSquared
.
IEnumerable<double> rSquared =
cvResults
.Select(fold => fold.Metrics.RSquared);
Si examina el contenido de la variable rSquared
, la salida debe tener cinco valores comprendidos entre 0 y 1, donde el valor más cercano a 1 es mejor. Mediante métricas como R cuadrado, seleccione los modelos de mejor a peor rendimiento. A continuación, seleccione el mejor modelo con el que realizará predicciones u operaciones adicionales.
// Select all models
ITransformer[] models =
cvResults
.OrderByDescending(fold => fold.Metrics.RSquared)
.Select(fold => fold.Model)
.ToArray();
// Get Top Model
ITransformer topModel = models[0];
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente las Cuestiones de GitHub como mecanismo de retroalimentación para el contenido y lo sustituiremos por un nuevo sistema de retroalimentación. Para más información, consulta:Enviar y ver comentarios de