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 IEnumerable
arquivo . 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 IEnumerable
arquivo .
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, 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);
}
}
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 DataDebuggerPreview
arquivo . 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.
O resultado da inspeção de um IDataView
seria semelhante ao seguinte: