Compartir a través de


Inspección de los datos intermedios durante el procesamiento

Obtenga información sobre cómo inspeccionar los datos intermedios durante los pasos de entrenamiento del modelo, procesamiento y carga en ML.NET. Los datos intermedios son el resultado de cada fase de la canalización de aprendizaje automático.

Los datos intermedios, como los representados a continuación, que se cargan en un IDataView, pueden inspeccionarse de varias maneras en 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
    }
};

Conversión de IDataView en IEnumerable

Una de las formas más rápidas de inspeccionar una clase IDataView es convertirla en una clase IEnumerable. Para convertir una clase IDataView en IEnumerable, utilice el método CreateEnumerable.

Para optimizar el rendimiento, establezca reuseRowObject en true. De esta forma, se rellenará de forma diferida el mismo objeto con los datos de la fila actual a medida que se evalúa, en lugar de crear un nuevo objeto para cada fila del conjunto de datos.

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

Obtener acceso a índices específicos con IEnumerable

Si solo necesita acceder a parte de los datos o a índices específicos, use CreateEnumerable y establezca el valor del parámetro reuseRowObject en false para que se cree un objeto por cada una de las filas solicitadas del conjunto de datos. Después, convierta IEnumerable en una matriz o lista.

Advertencia

Al convertir el resultado de CreateEnumerable en una matriz o lista, se cargarán todas las filas de IDataView solicitadas en la memoria, lo que puede afectar al rendimiento.

Cuando se haya creado la colección, podrá realizar operaciones en los datos. El siguiente fragmento de código toma las tres primeras filas del conjunto de datos y calcula el promedio de precio actual.

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

Inspección de valores de una sola columna

En cualquier momento del proceso de compilación del modelo, se puede acceder a los valores de una sola columna de una IDataView con el método GetColumn. El método GetColumn devuelve todos los valores en una sola columna como una IEnumerable.

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

Inspección de valores de IDataView fila por fila

IDataView se evalúa de forma diferida. Para recorrer en iteración las filas de una IDataView sin convertirla en una IEnumerable como se ha mostrado en las secciones anteriores de este documento, cree una clase DataViewRowCursor usando el método GetRowCursor y pasando la clase DataViewSchema de su IDataView como parámetro. Luego, para recorrer las filas en iteración, utilice el método de cursor MoveNext junto con delegados de ValueGetter para extraer los valores correspondientes de cada una de las columnas.

Importante

A efectos de rendimiento, los vectores en ML.NET utilizan VBuffer en lugar de los tipos de colección nativos (es decir, 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);
    }
}

Vista previa de los resultados de preprocesamiento o entrenamiento en un subconjunto de los datos

Advertencia

No use Preview en código de producción porque está pensado para depuración y puede reducir el rendimiento.

El proceso de compilación de modelos es experimental e iterativo. Para obtener una vista previa de los datos después del preprocesamiento o entrenamiento de un modelo de Machine Learning en un subconjunto de los datos, utilice el método Preview que devuelve una DataDebuggerPreview. El resultado es un objeto con las propiedades ColumnView y RowView que son ambas una IEnumerable y contienen los valores de una fila o columna en particular. Especifique el número de filas a las que se aplicará la transformación con el parámetro maxRows.

Data Debugger Preview Object

El resultado de inspeccionar una IDataView tendría un aspecto similar al siguiente:

Data Debugger Preview Row View