Entraîner un modèle Machine Learning à l’aide de la validation croisée
Découvrez comment utiliser la validation croisée pour entraîner des modèles Machine Learning plus robustes dans ML.NET.
La validation croisée est une technique d’apprentissage et d’évaluation de modèle qui fractionne les données en plusieurs partitions et entraîne plusieurs algorithmes sur ces partitions. Cette technique améliore la robustesse du modèle en conservant les données du processus d’entraînement. En plus d’améliorer les performances sur les observations invisibles, dans les environnements limités par les données, il peut s’agir d’un outil efficace pour les modèles d’apprentissage avec un jeu de données plus petit.
Données et modèle de données
Données fournies à partir d’un fichier au format suivant :
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
Les données peuvent être modélisées par une classe telle que HousingData
et chargées dans 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; }
}
Préparer les données
Prétraiter les données avant de les utiliser pour générer le modèle Machine Learning. Dans cet exemple, les colonnes Size
et HistoricalPrices
sont combinées en un seul vecteur de caractéristique, qui est généré dans une nouvelle colonne appelée Features
à l’aide de la méthode Concatenate
. En plus d’obtenir les données dans le format attendu par ML.NET algorithmes, la concaténation de colonnes optimise les opérations suivantes dans le pipeline en appliquant l’opération une fois pour la colonne concaténée au lieu de chacune des colonnes distinctes.
Une fois les colonnes combinées en un seul vecteur, NormalizeMinMax
est appliquée à la colonne Features
pour obtenir Size
et HistoricalPrices
dans la même plage comprise entre 0 et 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);
Entraîner le modèle avec la validation croisée
Une fois les données prétraitées, il est temps d’entraîner le modèle. Tout d’abord, sélectionnez l’algorithme qui s’aligne le plus étroitement avec la tâche machine learning à effectuer. Étant donné que la valeur prédite est une valeur numériquement continue, la tâche est la régression. L’un des algorithmes de régression implémentés par ML.NET est l’algorithme StochasticDualCoordinateAscentCoordinator
. Pour entraîner le modèle avec validation croisée, utilisez la méthode CrossValidate
.
Remarque
Bien que cet exemple utilise un modèle de régression linéaire, CrossValidate s’applique à toutes les autres tâches de Machine Learning dans ML.NET à l’exception de la détection d’anomalies.
// 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
effectue les opérations suivantes :
- Partitionne les données en un certain nombre de partitions égales à la valeur spécifiée dans le paramètre
numberOfFolds
. Le résultat de chaque partition est un objetTrainTestData
. - Un modèle est entraîné sur chacune des partitions à l’aide de l’estimateur d’algorithme Machine Learning spécifié sur le jeu de données d’entraînement.
- Les performances de chaque modèle sont évaluées à l’aide de la méthode
Evaluate
sur le jeu de données de test. - Le modèle ainsi que ses métriques sont retournées pour chacun des modèles.
Le résultat stocké dans cvResults
est une collection d’objets CrossValidationResult
. Cet objet inclut le modèle entraîné ainsi que les métriques qui sont à la fois accessibles sous forme de propriétés Model
et Metrics
respectivement. Dans cet exemple, la propriété Model
est de type ITransformer
et la propriété Metrics
est de type RegressionMetrics
.
Évaluer le modèle
Les métriques des différents modèles entraînés sont accessibles via la propriété Metrics
de l’objet CrossValidationResult
individuel. En l’occurrence, la métrique du coefficient de détermination est accessible et stockée dans la variable rSquared
.
IEnumerable<double> rSquared =
cvResults
.Select(fold => fold.Metrics.RSquared);
Si vous inspectez le contenu de la variable rSquared
, la sortie doit être de cinq valeurs comprises entre 0 et 1, plus près de 1 signifie le mieux. À l’aide de métriques telles que R-Squared, sélectionnez les modèles parmi les meilleurs au pire des performances. Sélectionnez ensuite le modèle supérieur pour effectuer des prédictions ou effectuer des opérations supplémentaires.
// Select all models
ITransformer[] models =
cvResults
.OrderByDescending(fold => fold.Metrics.RSquared)
.Select(fold => fold.Model)
.ToArray();
// Get Top Model
ITransformer topModel = models[0];