Udostępnij za pośrednictwem


Inspekcja danych pośrednich podczas przetwarzania

Dowiedz się, jak sprawdzać dane pośrednie podczas ładowania, przetwarzania i trenowania modelu w ML.NET. Dane pośrednie to dane wyjściowe każdego etapu w potoku uczenia maszynowego.

Weź pod uwagę następujące dane mieszkaniowe:

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
    }
};

W ML.NET można sprawdzić dane pośrednie, takie jak te załadowane do IDataView na różne sposoby, zgodnie z opisem w poniższych sekcjach.

Konwertowanie elementu IDataView na element IEnumerable

Jednym z najszybszych sposobów inspekcji obiektu IDataView jest przekonwertowanie go na IEnumerableelement . Aby wykonać tę konwersję, użyj metody CreateEnumerable.

Aby zoptymalizować wydajność, ustaw wartość reuseRowObjecttrue. W ten sposób leniwie wypełnia ten sam obiekt danymi bieżącego wiersza, w przeciwieństwie do tworzenia nowego obiektu dla każdego wiersza w zestawie danych.

// 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);
}

Uzyskiwanie dostępu do określonych indeksów za pomocą funkcji IEnumerable

Jeśli potrzebujesz dostępu tylko do części danych lub określonych indeksów, użyj CreateEnumerable i ustaw wartość parametru reuseRowObject na false , aby nowy obiekt został utworzony dla każdego żądanego wiersza w zestawie danych. Następnie przekonwertuj IEnumerable obiekt na tablicę lub listę.

Ostrzeżenie

Konwertowanie wyniku CreateEnumerable na tablicę lub listę ładuje wszystkie żądane wiersze IDataView do pamięci, co może mieć wpływ na wydajność.

Po utworzeniu kolekcji można wykonywać operacje na danych. Poniższy fragment kodu pobiera pierwsze trzy wiersze w zestawie danych i oblicza średnią bieżącą cenę.

// 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;

Sprawdzanie wartości w jednej kolumnie

W dowolnym momencie procesu tworzenia modelu można uzyskać dostęp do wartości w jednej kolumnie obiektu IDataView przy użyciu GetColumn metody . Metoda GetColumn zwraca wszystkie wartości w jednej kolumnie jako IEnumerable.

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

Sprawdzanie wartości IDataView po jednym wierszu jednocześnie

IDataView jest oceniana leniwie. Aby iterować wiersze elementu IDataView bez konwersji na element IEnumerable , jak pokazano w poprzednich sekcjach tego dokumentu, utwórz obiekt DataViewRowCursor przy użyciu GetRowCursor metody i przekazując element DataViewSchema elementu IDataView jako parametr. Następnie, aby iterować wiersze, użyj MoveNext metody kursora wraz z ValueGetter delegatami, aby wyodrębnić odpowiednie wartości z każdej z kolumn.

Ważne

W celach wydajności wektory w ML.NET używają VBuffer zamiast natywnych typów kolekcji (czyli Vector i 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);
    }
}

Podgląd wyniku wstępnego przetwarzania lub uczenia na podzbiorze danych

Ostrzeżenie

Nie używaj Preview kodu produkcyjnego, ponieważ jest przeznaczony do debugowania i może zmniejszyć wydajność.

Proces tworzenia modelu jest eksperymentalny i iteracyjny. Aby wyświetlić podgląd, jak dane będą wyglądać po zastosowaniu wstępnego przetwarzania lub trenowaniu modelu uczenia maszynowego na podzbiorze danych, użyj metody Preview, która zwraca DataDebuggerPreview. Wynikiem jest obiekt z właściwościami ColumnView i RowView, które są zarówno IEnumerable, jak i zawierają wartości w określonej kolumnie lub wierszu. Określ liczbę wierszy, do których ma być stosowane przekształcenie za pomocą parametru maxRows .

Obiekt podglądu debugera danych

Wynik inspekcji IDataView jest podobny do poniższego rysunku.

Widok wiersza podglądu debugera danych