Compartilhar via


Inspecionar dados intermediários durante o processamento

Saiba como inspecionar os dados intermediários durante as etapas de treinamento de modelo, processamento e carregamento. Dados intermediários são a saída de cada estágio no pipeline de aprendizado de máquina.

Dados intermediários como aqueles representados abaixo que são carregados em um IDataView podem ser inspecionados de várias maneiras no 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
    }
};

Converter IDataView em IEnumerable

Uma das maneiras mais rápidas de inspecionar um IDataView é convertê-los em um IEnumerable. Para converter um IDataView em IEnumerable, usar o método CreateEnumerable.

Para otimizar o desempenho, defina reuseRowObject como true. Fazer isso preencherá lentamente o mesmo objeto com os dados da linha atual conforme eles estão sendo avaliados, em vez de criar um novo objeto para cada linha no conjunto de dados.

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

Acessando índices específicos com IEnumerable

Se você precisar apenas de acesso a uma parte específica dos dados ou índices, use CreateEnumerable e defina o valor do parâmetro reuseRowObject como false para que um novo objeto seja criado para cada uma das linhas solicitadas no conjunto de dados. Em seguida, converta a IEnumerable em uma matriz ou lista.

Aviso

Converter o resultado de CreateEnumerable em uma matriz ou lista carregará todas as linhas IDataView solicitados na memória, o que pode afetar o desempenho.

Quando a coleção tiver sido criada, você poderá executar operações nos dados. O snippet de código a seguir usa as três primeiras linhas no conjunto de dados e calcula o preço médio atual.

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

Inspecionar valores em uma única coluna

Em qualquer ponto no processo de criação de modelo, os valores em uma única coluna de um IDataView podem ser acessados usando o método GetColumn. O método GetColumn retorna todos os valores em uma única coluna como um IEnumerable.

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

Inspecione valores IDataView uma linha por vez

IDataView é avaliado lentamente. Para iterar sobre as linhas de uma IDataView sem a conversão em um IEnumerable conforme demonstrado nas seções anteriores deste documento, criar um DataViewRowCursor usando o método GetRowCursor e passar o DataViewSchema do seu IDataView como um parâmetro. Em seguida, para iterar sobre linhas, use o método de cursor MoveNext junto com delegados ValueGetter para extrair os respectivos valores de cada uma das colunas.

Importante

Para fins de desempenho, vetores no ML.NET usam VBuffer, em vez de tipos de coleção nativos (ou seja, 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);
    }
}

Visualização de resultado do pré-processamento ou do treinamento em um subconjunto dos dados

Aviso

Não use Preview em código de produção porque ele se destina a depuração e pode reduzir o desempenho.

O processo de criação de modelo é experimental e iterativo. Para visualizar como seria a aparência dos dados após o pré-processamento ou treinar um modelo de machine learning em um subconjunto dos dados, use o método Preview que retorna um DataDebuggerPreview. O resultado é um objeto com propriedades ColumnView e RowView que são ambas um IEnumerable e contêm os valores em uma determinada coluna ou linha. Especifique o número de linhas às quais aplicar a transformação com o parâmetro maxRows.

Data Debugger Preview Object

O resultado de inspecionar um IDataView teria uma aparência semelhante à seguinte:

Data Debugger Preview Row View