在处理期间检查中间数据

学习如何在 ML.NET 中的加载步骤、处理步骤和模型培训步骤期间检查中间数据。 中间数据是机器学习管道中每个阶段的输出。

可以在 ML.NET 中以各种方式检查加载到 IDataView 中的如下所示的中间数据。

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

将 IDataView 转换为 IEnumerable

检查 IDataView 的最快方法之一是将其转换为 IEnumerable。 若要将 IDataView 转换为 IEnumerable,请使用 CreateEnumerable 方法。

若要优化性能,请将 reuseRowObject 设置为 true。 如果这样做,将在评估当前行的数据时延迟填充相同的对象,而不是为数据集中的每一行创建一个新对象。

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

使用 IEnumerable 访问特定索引

如果只需要访问部分数据或特定索引,请使用 CreateEnumerable 并将 reuseRowObject 参数值设置为 false,以便为数据集中每个请求的行创建一个新对象。 然后,将 IEnumerable 转换为数组或列表。

警告

CreateEnumerable 的结果转换为数组或列表会将所有请求的 IDataView 行加载到内存中,这可能会影响性能。

创建集合后,可以对数据执行操作。 下面的代码片段获取数据集中的前三行并计算当前的平均价格。

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

检查单个列中的值

在模型生成过程中的任何时候,都可以使用 GetColumn 方法访问 IDataView 的单个列中的值。 GetColumn 方法将单个列中的所有值都返回为 IEnumerable

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

一次检查一行 IDataView 值

IDataView 延迟求值。 若要循环访问 IDataView 的各行,而不按本文档前面部分所示转换为 IEnumerable,请通过使用 GetRowCursor 方法并传入 IDataViewDataViewSchema 作为参数来创建 DataViewRowCursor。 然后,若要循环访问各行,请使用 MoveNext 游标方法以及 ValueGetter 委托从每个列中提取相应的值。

重要

出于性能目的,ML.NET 中的向量使用VBuffer而不是本机集合类型(即,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);
    }
}

预览数据子集的预处理或训练结果

警告

请勿在生产代码中使用 Preview,因为它专用于调试,可能会降低性能。

模型生成过程是实验性的和迭代的。 若要预览对数据子集预处理或训练机器学习模型后的数据,请使用可返回 DataDebuggerPreviewPreview 方法。 其结果为一个具有 ColumnViewRowView 属性的对象,这两个属性都是 IEnumerable 并包含特定列或行中的值。 使用 maxRows 参数指定要应用转换的行数。

数据调试器预览对象

检查 IDataView 的结果将与下面类似:

数据调试器预览行视图