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 :

  1. 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 objet TrainTestData.
  2. 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.
  3. Les performances de chaque modèle sont évaluées à l’aide de la méthode Evaluate sur le jeu de données de test.
  4. 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];