Partager via


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 :

  1. 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 objet TrainTestData.
  2. 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.
  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. 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];