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
.
Le résultat de l’inspection d’un IDataView
ressemble à l’image suivante :