Inspektera mellanliggande data under bearbetningen
Lär dig hur du inspekterar mellanliggande data under inläsning, bearbetning och modellträningssteg i ML.NET. Mellanliggande data är utdata från varje steg i maskininlärningspipelinen.
Mellanliggande data som den som representeras nedan och som läses in i en IDataView
kan inspekteras på olika sätt i ML.NET.
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
}
};
Konvertera IDataView till IEnumerable
Ett av de snabbaste sätten att inspektera en IDataView
är att konvertera den till en IEnumerable
. Konvertera en IDataView
för att IEnumerable
använda CreateEnumerable
-metoden.
Om du vill optimera prestanda ställer du in reuseRowObject
på true
. Om du gör det fylls samma objekt på ett lättsinnigt sätt med data för den aktuella raden eftersom det utvärderas i stället för att skapa ett nytt objekt för varje rad i datauppsättningen.
// 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);
}
Få åtkomst till specifika index med IEnumerable
Om du bara behöver åtkomst till en del av data eller specifika index använder CreateEnumerable
du och anger reuseRowObject
parametervärdet så att false
ett nytt objekt skapas för var och en av de begärda raderna i datauppsättningen. Konvertera IEnumerable
sedan till en matris eller lista.
Varning
Om du konverterar resultatet av CreateEnumerable
till en matris eller lista läses alla begärda IDataView
rader in i minnet, vilket kan påverka prestanda.
När samlingen har skapats kan du utföra åtgärder på data. Kodfragmentet nedan tar de tre första raderna i datamängden och beräknar det genomsnittliga aktuella priset.
// 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;
Granska värden i en enda kolumn
När som helst i modellskapandeprocessen kan värden i en enda kolumn i en IDataView
nås med hjälp av GetColumn
metoden. Metoden GetColumn
returnerar alla värden i en enda kolumn som en IEnumerable
.
IEnumerable<float> sizeColumn = data.GetColumn<float>("Size").ToList();
Inspektera IDataView-värden en rad i taget
IDataView
utvärderas lazily. Om du vill iterera över raderna i en IDataView
utan att konvertera till en IEnumerable
som visas i föregående avsnitt i det här dokumentet skapar du en DataViewRowCursor
med hjälp GetRowCursor
av metoden och skickar in DataViewSchema för din IDataView
som parameter. Om du sedan vill iterera över rader använder du MoveNext
markörmetoden tillsammans med ValueGetter
ombud för att extrahera respektive värden från var och en av kolumnerna.
Viktigt!
I prestandasyfte använder VBuffer
vektorer i ML.NET i stället för interna samlingstyper (det vill: Vector
, 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);
}
}
Förhandsgranska resultatet av förbearbetning eller träning på en delmängd av data
Varning
Använd Preview
inte i produktionskoden eftersom den är avsedd för felsökning och kan minska prestanda.
Modellskapandeprocessen är experimentell och iterativ. Om du vill förhandsgranska hur data skulle se ut efter förbearbetning eller träning av en maskininlärningsmodell på en delmängd av data använder du metoden Preview
som returnerar en DataDebuggerPreview
. Resultatet är ett objekt med ColumnView
och RowView
egenskaper som både är och IEnumerable
innehåller värdena i en viss kolumn eller rad. Ange antalet rader som omvandlingen ska tillämpas på med parametern maxRows
.
Resultatet av att inspektera en IDataView
skulle se ut ungefär så här: