Entraîner un modèle Machine Learning avec 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’entraînement et d’évaluation de modèle qui fractionne les données en plusieurs partitions sur lesquelles elle entraîne plusieurs algorithmes. Cette technique améliore la robustesse du modèle en réservant des données à partir du processus d’entraînement. Outre améliorer les performances sur les observations invisibles, dans les environnements limités en données, cette technique peut être un outil efficace pour entraîner des modèles avec un jeu de données plus petit.
Données et modèle de données
Soient les données d’un fichier présentant la mise en forme suivante :
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 comme 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étraitez les données avant de les utiliser pour générer le modèle Machine Learning. Dans cet échantillon, les colonnes Size
et HistoricalPrices
sont combinées en un vecteur de caractéristiques unique, qui est généré dans une colonne nommée Features
à l’aide de la méthode Concatenate
. En plus d’obtenir les données dans le format attendu par les algorithmes ML.NET, la concaténation des 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 le faire pour chacune des colonnes.
Une fois les colonnes combinées en un vecteur unique, NormalizeMinMax
est appliqué à 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, vous pouvez entraîner le modèle. Tout d’abord, sélectionnez l’algorithme qui convient le mieux pour la tâche de machine learning à effectuer. La valeur prédite étant une valeur numériquement continue, la tâche est la régression. Un des algorithmes de régression implémentés par ML.NET est l’algorithme StochasticDualCoordinateAscentCoordinator
. Pour entraîner le modèle avec la validation croisée, utilisez la méthode CrossValidate
.
Notes
Bien que cet échantillon 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’anomalie.
// 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 :
- Elle partitionne les données en un nombre de partitions égal à 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 de 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. - Pour chacun des modèles, le modèle ainsi que ses métriques sont retournés.
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 respectivement accessibles à partir des propriétés Model
et Metrics
. Dans cet échantillon, la propriété Model
est de type ITransformer
, tandis que 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
concerné. 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 comporter cinq valeurs comprises entre 0 et 1, où plus une valeur est proche de 1, meilleure est la qualité. À l’aide de métriques telles que le coefficient de détermination, sélectionnez les modèles du plus au moins performant. Ensuite, sélectionnez le meilleur modèle avec lequel faire 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];