Dela via


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 reuseRowObjecttrue. 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 .

Förhandsgranskningsobjekt för datafelsökare

Resultatet av att inspektera en IDataView skulle se ut ungefär så här:

Datafelsökarens förhandsgranskningsradvy