Partilhar via


Inspecionar dados intermediários durante o processamento

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

Dados intermediários como o representado abaixo, que é carregado em um IDataView pode ser inspecionado de várias maneiras em 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 para IEnumerable

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

Para otimizar o desempenho, defina reuseRowObject como true. Isso preencherá preguiçosamente o mesmo objeto com os dados da linha atual enquanto ele está sendo avaliado, 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);
}

Acesso a índices específicos com IEnumerable

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

Aviso

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

Uma vez que a coleção tenha sido criada, você pode executar operações nos dados. O trecho de código abaixo pega as três primeiras linhas do 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 do processo de construção do modelo, os valores em uma única coluna de um IDataView podem ser acessados usando o GetColumn método. O GetColumn método retorna todos os valores em uma única coluna como um IEnumerablearquivo .

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

Inspecionar valores IDataView uma linha de cada vez

IDataView é avaliada preguiçosamente. Para iterar sobre as linhas de um IDataView sem converter em um IEnumerable , como demonstrado nas seções anteriores deste documento, crie um DataViewRowCursor usando o GetRowCursor método e passando o DataViewSchema de seu IDataView como um parâmetro. Em seguida, para iterar sobre linhas, use o MoveNext método cursor junto com ValueGetter delegados para extrair os respetivos valores de cada uma das colunas.

Importante

Para fins de desempenho, os vetores em ML.NET uso VBuffer em vez de tipos de coleção nativos (ou seja, Vectorfloat[], ).

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

Visualizar o resultado do pré-processamento ou treinamento em um subconjunto dos dados

Aviso

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

O processo de construção do modelo é experimental e iterativo. Para visualizar a aparência dos dados após o pré-processamento ou o treinamento de um modelo de aprendizado de máquina em um subconjunto dos dados, use o Preview método que retorna um DataDebuggerPreviewarquivo . O resultado é um objeto com ColumnView e RowView propriedades que são 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 maxRows parâmetro.

Objeto de visualização do depurador de dados

O resultado da inspeção de um IDataView seria semelhante ao seguinte:

Vista de linha de pré-visualização do depurador de dados