Condividi tramite


Esaminare i dati intermedi durante l'elaborazione

Di seguito viene descritto come esaminare i dati intermedi durante il caricamento, l'elaborazione e i passaggi di training del modello in ML.NET. I dati intermedi corrispondono all'output di ogni fase della pipeline di Machine Learning.

Dati intermedi come quelli rappresentati di seguito che vengono caricati in un'interfaccia IDataView possono essere esaminati in vari modi in 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
    }
};

Convertire IDataView in IEnumerable

Uno dei modi più rapidi per esaminare un'interfaccia IDataView consiste nel convertirla in un'interfaccia IEnumerable. Per convertire IDataView in IEnumerable, usare il metodo CreateEnumerable.

Per ottimizzare le prestazioni, impostare reuseRowObject su true. Questa operazione popolerà lo stesso oggetto in modo differito con i dati della riga corrente quando viene valutata anziché creare un nuovo oggetto per ogni riga nel set di dati.

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

Accesso a indici specifici con IEnumerable

Se è sufficiente accedere a una parte dei dati o a indici specifici, usare CreateEnumerable e impostare il valore del parametro reuseRowObject su false, in modo che venga creato un nuovo oggetto per ogni riga richiesta del set di dati. Quindi, convertire IEnumerable in una matrice o in un elenco.

Avviso

Poiché la conversione di CreateEnumerable in una matrice o elenco caricherà in memoria tutte le righe di IDataView richieste, le prestazioni potrebbero risentirne.

Dopo aver creata la raccolta, sarà possibile eseguire operazioni sui dati. Il frammento di codice riportato di seguito prende le prime tre righe del set di dati e calcola il prezzo medio corrente.

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

Esaminare i valori in una singola colonna

In qualsiasi momento del processo di creazione del modello, è possibile accedere ai valori in una singola colonna di un elemento IDataView tramite il metodo GetColumn. Il metodo GetColumn restituisce tutti i valori in una singola colonna come IEnumerable.

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

Esaminare i valori IDataView una riga alla volta

L'interfaccia IDataView viene valutata in modo differito. Per scorrere le righe di un'interfaccia IDataView senza eseguire la conversione in IEnumerable, come illustrato nelle sezioni precedenti di questo documento, creare una classe DataViewRowCursor usando il metodo GetRowCursor e passare la classe DataViewSchema di IDataView come parametro. Quindi, per scorrere le righe, usare il metodo MoveNext del cursore insieme ai delegati ValueGetter per estrarre i rispettivi valori da ognuna delle colonne.

Importante

Ai fini delle prestazioni, i vettori in ML.NET usano VBuffer invece dei tipi di raccolta nativi , ovvero 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);
    }
}

Anteprima dei risultati di pre-elaborazione o di training su un subset di dati

Avviso

Non usare Preview nel codice da usare in ambienti di produzione perché è destinato al debug e può ridurre le prestazioni.

Il processo di creazione dei modelli è sperimentale e iterativo. Per visualizzare in anteprima come si presenteranno i dati dopo la pre-elaborazione o il training di un modello di Machine Learning su un subset di dati, usare il metodo Preview che restituisce una classe DataDebuggerPreview. Il risultato è un oggetto con le proprietà ColumnView e RowView che sono entrambe IEnumerable e che contengono i valori in una particolare colonna o riga. Specificare il numero di righe a cui applicare la trasformazione con il parametro maxRows.

Oggetto di anteprima debugger dati

L'analisi di un elemento IDataView avrebbe un aspetto simile al seguente:

Visualizzazione righe di anteprima debugger dati