Kontrola průběžných dat během zpracování
Naučte se kontrolovat zprostředkující data během načítání, zpracování a trénování modelů v ML.NET. Průběžná data jsou výstupem každé fáze v kanálu strojového učení.
Vezměte v úvahu následující data o bydlení:
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
}
};
V ML.NET můžete zkontrolovat zprostředkující data, jako je tato, která jsou načtena do IDataView
různými způsoby, jak je popsáno v následujících částech.
Převod IDataView na IEnumerable
Jedním z nejrychlejších způsobů, jak zkontrolovat, IDataView
je převést ho na .IEnumerable
K tomuto převodu použijte metodu CreateEnumerable
.
Pokud chcete optimalizovat výkon, nastavte reuseRowObject
hodnotu true
. Tímto způsobem se stejný objekt líně naplní daty aktuálního řádku místo toho, aby se pro každý řádek v datové sadě vytvořil nový objekt.
// 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);
}
Přístup ke konkrétním indexům pomocí IEnumerable
Pokud potřebujete přístup jenom k části dat nebo konkrétních indexů, použijte CreateEnumerable
a nastavte hodnotu parametru reuseRowObject
tak, aby false
se pro každý požadovaný řádek v datové sadě vytvořil nový objekt. Potom převeďte pole IEnumerable
nebo seznam.
Upozorňující
Převod výsledku CreateEnumerable
do pole nebo seznamu načte do paměti všechny požadované řádky IDataView
, což může mít vliv na výkon.
Po vytvoření kolekce můžete s daty provádět operace. Následující fragment kódu vezme první tři řádky v datové sadě a vypočítá průměrnou aktuální cenu.
// 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;
Kontrola hodnot v jednom sloupci
V jakémkoli okamžiku procesu sestavování modelu je možné pomocí metody získat IDataView
přístup k hodnotám v jednom sloupci GetColumn
modelu. Metoda GetColumn
vrátí všechny hodnoty v jednom sloupci jako IEnumerable
.
IEnumerable<float> sizeColumn = data.GetColumn<float>("Size").ToList();
Kontrola hodnot IDataView po jednom řádku
IDataView
je lazičně vyhodnocen. Chcete-li iterovat přes řádky IDataView
bez převodu na tak IEnumerable
, jak je znázorněno v předchozích částech tohoto dokumentu, vytvořte DataViewRowCursor
pomocí GetRowCursor
metody a předání DataViewSchema vašeho IDataView
jako parametru. Pak k iteraci přes řádky použijte metodu MoveNext
kurzoru spolu s ValueGetter
delegáty k extrahování příslušných hodnot z každého sloupce.
Důležité
Pro účely výkonu používají vektory v ML.NET místo nativních typů kolekcí VBuffer
(to znamená Vector
a 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);
}
}
Náhled výsledku předběžného zpracování nebo trénování pro podmnožinu dat
Upozorňující
Nepoužívejte Preview
v produkčním kódu, protože je určený pro ladění a může snížit výkon.
Proces vytváření modelu je experimentální a iterativní. Pokud chcete zobrazit náhled toho, jaká data by vypadala po předběžném zpracování nebo trénování modelu strojového učení na podmnožině dat, použijte metodu Preview
, která vrací DataDebuggerPreview
. Výsledkem je objekt s vlastnostmi ColumnView
a RowView
, které jsou IEnumerable
a obsahují hodnoty v určitém sloupci nebo řádku. Zadejte počet řádků, na které se má transformace použít s parametrem maxRows
.
Výsledek kontroly IDataView
vypadá podobně jako na následujícím obrázku: