Sdílet prostřednictvím


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 .

Objekt náhledu ladicího programu dat

Výsledek kontroly IDataView vypadá podobně jako na následujícím obrázku:

Zobrazení řádků náhledu ladicího programu dat