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, os vetores em 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
.
O resultado de inspecionar um IDataView
teria uma aparência semelhante à seguinte: