Partage via


Inspecter les données intermédiaires pendant le traitement

Découvrez comment inspecter les données intermédiaires pendant les étapes de chargement, de traitement et d’entraînement du modèle dans ML.NET. Les données intermédiaires sont les résultats de chaque étape dans le pipeline Machine Learning.

Tenez compte des données de logement suivantes :

HousingData[] housingData = new HousingData[]
{
    new HousingData
    {
        Size = 600f,
        HistoricalPrices = new float[] { 100000f ,125000f ,122000f },
        CurrentPrice = 170000f
    },
    new HousingData
    {
        Size = 1000f,
        HistoricalPrices = new float[] { 200000f, 250000f, 230000f },
        CurrentPrice = 225000f
    },
    new HousingData
    {
        Size = 1000f,
        HistoricalPrices = new float[] { 126000f, 130000f, 200000f },
        CurrentPrice = 195000f
    },
    new HousingData
    {
        Size = 850f,
        HistoricalPrices = new float[] { 150000f,175000f,210000f },
        CurrentPrice = 205000f
    },
    new HousingData
    {
        Size = 900f,
        HistoricalPrices = new float[] { 155000f, 190000f, 220000f },
        CurrentPrice = 210000f
    },
    new HousingData
    {
        Size = 550f,
        HistoricalPrices = new float[] { 99000f, 98000f, 130000f },
        CurrentPrice = 180000f
    }
};

Dans ML.NET, vous pouvez inspecter les données intermédiaires comme celles-ci chargées dans un IDataView de différentes façons, comme décrit dans les sections suivantes.

Convertir IDataView en IEnumerable

Un des moyens les plus rapides pour inspecter un IDataView consiste à le convertir en un IEnumerable. Pour effectuer cette conversion, utilisez la méthode CreateEnumerable.

Pour optimiser les performances, définissez reuseRowObject sur true. Cette opération remplit paresseusement le même objet avec les données de la ligne actuelle lors de son évaluation, au lieu de créer un nouvel objet pour chaque ligne du jeu de données.

// Create an IEnumerable of HousingData objects from IDataView
IEnumerable<HousingData> housingDataEnumerable =
    mlContext.Data.CreateEnumerable<HousingData>(data, reuseRowObject: true);

// Iterate over each row
foreach (HousingData row in housingDataEnumerable)
{
    // Do something (print out Size property) with current Housing Data object being evaluated
    Console.WriteLine(row.Size);
}

Accéder à des index spécifiques avec IEnumerable

Si vous devez uniquement accéder à une partie des données ou à des index spécifiques, utilisez CreateEnumerable et définissez la valeur du paramètre reuseRowObject sur false afin qu’un objet soit créé pour chaque ligne demandée dans le jeu de données. Convertissez ensuite le IEnumerable en tableau ou liste.

Avertissement

La conversion du résultat de CreateEnumerable en tableau ou liste charge toutes les lignes de IDataView demandées en mémoire, ce qui peut affecter les performances.

Une fois la collection créée, vous pouvez effectuer des opérations sur les données. L’extrait de code suivant prend les trois premières lignes du jeu de données et calcule le prix actuel moyen.

// Create an Array of HousingData objects from IDataView
HousingData[] housingDataArray =
    mlContext.Data.CreateEnumerable<HousingData>(data, reuseRowObject: false)
        .Take(3)
        .ToArray();

// Calculate Average CurrentPrice of First Three Elements
HousingData firstRow = housingDataArray[0];
HousingData secondRow = housingDataArray[1];
HousingData thirdRow = housingDataArray[2];
float averageCurrentPrice = (firstRow.CurrentPrice + secondRow.CurrentPrice + thirdRow.CurrentPrice) / 3;

Inspecter les valeurs d’une colonne spécifique

À n’importe quel point du processus de génération de modèle, les valeurs d’une colonne spécifique d’un IDataView sont accessibles à l’aide de la méthode GetColumn. La méthode GetColumn retourne toutes les valeurs d’une colonne spécifique sous la forme d’un IEnumerable.

IEnumerable<float> sizeColumn = data.GetColumn<float>("Size").ToList();

Inspecter les valeurs d’IDataView une ligne à la fois

IDataView est évalué tardivement. Pour effectuer une itération sur les lignes d’un IDataView sans opérer de conversion en IEnumerable comme illustré dans les sections précédentes de ce document, créez un DataViewRowCursor en utilisant la méthode GetRowCursor et en passant le DataViewSchema de votre IDataView comme paramètre. Ensuite, pour effectuer une itération sur les lignes, utilisez la méthode de curseur MoveNext avec des délégués ValueGetter pour extraire les valeurs respectives de chacune des colonnes.

Important

À des fins de performances, les vecteurs de ML.NET utilisent VBuffer au lieu des types de collection natifs (autrement dit, Vector et float[]).

// Get DataViewSchema of IDataView
DataViewSchema columns = data.Schema;

// Create DataViewCursor
using (DataViewRowCursor cursor = data.GetRowCursor(columns))
{
    // Define variables where extracted values will be stored to
    float size = default;
    VBuffer<float> historicalPrices = default;
    float currentPrice = default;

    // Define delegates for extracting values from columns
    ValueGetter<float> sizeDelegate = cursor.GetGetter<float>(columns[0]);
    ValueGetter<VBuffer<float>> historicalPriceDelegate = cursor.GetGetter<VBuffer<float>>(columns[1]);
    ValueGetter<float> currentPriceDelegate = cursor.GetGetter<float>(columns[2]);

    // Iterate over each row
    while (cursor.MoveNext())
    {
        //Get values from respective columns
        sizeDelegate.Invoke(ref size);
        historicalPriceDelegate.Invoke(ref historicalPrices);
        currentPriceDelegate.Invoke(ref currentPrice);
    }
}

Aperçu du résultat du prétraitement ou de l’entraînement sur un sous-ensemble des données

Avertissement

N’utilisez pas Preview dans le code de production, car celui-ci est destiné au débogage et peut réduire les performances.

Le processus de génération de modèle est expérimental et itératif. Pour afficher un aperçu de l’apparence des données après le prétraitement ou l’apprentissage d’un modèle Machine Learning sur un sous-ensemble des données, utilisez la méthode Preview, qui retourne une DataDebuggerPreview. Le résultat est un objet avec des propriétés ColumnView et RowView qui sont à la fois un IEnumerable et contiennent les valeurs d’une colonne ou d’une ligne particulière. Spécifiez le nombre de lignes auxquelles appliquer la transformation à l’aide du paramètre maxRows.

Débogueur de données : aperçu de l’objet

Le résultat de l’inspection d’un IDataView ressemble à l’image suivante :

Débogueur de données : aperçu de la vue de ligne