Teilen über


Untersuchen von Zwischendaten bei der Verarbeitung

Erfahren Sie, wie Sie Zwischendaten während des Ladens, Verarbeitens und Trainings des Modells in ML.NET überprüfen können. Zwischendaten werden in den einzelnen Phasen in der Machine learning-Pipeline ausgegeben.

Zwischendaten, wie die unten dargestellten, die in eine IDataView geladen werden, können in ML.NET auf verschiedene Weise überprüft werden.

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

Konvertieren von IDataView in IEnumerable

Eine der schnellsten Möglichkeiten, eine IDataView zu überprüfen, ist die Konvertierung in IEnumerable. Zum Konvertieren einer IDataView in IEnumerable verwenden Sie die CreateEnumerable-Methode.

Um die Leistung zu optimieren, legen Sie den Wert von reuseRowObject auf true fest. Dadurch wird das gleiche Objekt bei der Auswertung verzögert mit den Daten der aktuellen Zeile ausgefüllt, anstatt für jede Zeile im Dataset ein neues Objekt zu erstellen.

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

Zugreifen auf bestimmte Indizes mit IEnumerable

Wenn Sie nur Zugriff auf einen Teil der Daten oder bestimmte Indizes benötigen, verwenden Sie CreateEnumerable und setzen Sie den Parameterwert reuseRowObject auf false, damit für jede der angeforderten Zeilen im Dataset ein neues Objekt erstellt wird. Konvertieren Sie IEnumerable anschließend in ein Array oder eine Liste.

Warnung

Durch die Konvertierung des Ergebnisses von CreateEnumerable in ein Array oder eine Liste werden alle angeforderten IDataView-Zeilen in den Speicher geladen, wodurch die Leistung beeinträchtigt werden kann.

Nachdem die Sammlung erstellt wurde, können Sie Vorgänge für die Daten ausführen. Der folgende Codeausschnitt umfasst die ersten drei Zeilen des Datasets und berechnet den durchschnittlichen aktuellen Preis.

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

Überprüfen von Werten in einer einzelnen Spalte

Mit der GetColumn-Methode kann zu jedem beliebigen Zeitpunkt im Modellerstellungsprozess auf Werte in einer einzelnen Spalte einer IDataView zugegriffen werden. Die GetColumn-Methode gibt alle Werte in einer einzelne Spalte als IEnumerable wieder.

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

Zeilenweises Überprüfen von IDataView-Werten

IDataView wird verzögert ausgewertet. Um die Zeilen einer IDataView zu durchlaufen, ohne die Konvertierung in IEnumerable durchzuführen, wie in den vorangegangenen Abschnitten dieses Dokuments demonstriert, erstellen Sie ein DataViewRowCursor unter Verwendung der GetRowCursor-Methode, und übergeben Sie das DataViewSchema Ihrer IDataView als Parameter. Um Zeilen zu durchlaufen, verwenden Sie die MoveNext-Cursormethode zusammen mit ValueGetter-Delegaten, um die entsprechenden Werte aus einzelnen Spalten zu extrahieren.

Wichtig

Aus Leistungsgründen verwenden Vektoren in ML.NET VBuffer anstelle von nativen Sammlungstypen (d. h. 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);
    }
}

Anzeigen einer Vorschau des Ergebnisses der Vorverarbeitung oder des Trainings für eine Teilmenge der Daten

Warnung

Verwenden Sie Preview nicht im Produktionscode, da dies für das Debugging vorgesehen ist und die Leistung beeinträchtigen kann.

Der Modellerstellungsprozess ist experimentell und iterativ. Um eine Vorschau anzuzeigen, wie die Daten nach der Vorverarbeitung oder dem Training eines Machine Learning-Modells für eine Teilmenge der Daten aussehen würden, verwenden Sie die Preview-Methode, die ein DataDebuggerPreview zurückgibt. Das Ergebnis ist ein Objekt mit den Eigenschaften ColumnView und RowView, die beide ein IEnumerable sind und die Werte aus einer bestimmten Spalte oder Zeile enthalten. Geben Sie die Anzahl der Zeilen an, auf die die Transformation mit dem maxRows-Parameter angewendet werden soll.

Data Debugger Preview Object

Das Ergebnis der Überprüfung einer IDataView würde etwa wie folgt aussehen:

Data Debugger Preview Row View