在处理期间检查中间数据
学习如何在 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
方法并传入 IDataView
的 DataViewSchema 作为参数来创建 DataViewRowCursor
。 然后,若要循环访问各行,请使用 MoveNext
游标方法以及 ValueGetter
委托从每个列中提取相应的值。
重要
出于性能目的,ML.NET 中的向量使用VBuffer
而不是本机集合类型(即,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);
}
}
预览数据子集的预处理或训练结果
警告
请勿在生产代码中使用 Preview
,因为它专用于调试,可能会降低性能。
模型生成过程是实验性的和迭代的。 若要预览对数据子集预处理或训练机器学习模型后的数据,请使用可返回 DataDebuggerPreview
的 Preview
方法。 其结果为一个具有 ColumnView
和 RowView
属性的对象,这两个属性都是 IEnumerable
并包含特定列或行中的值。 使用 maxRows
参数指定要应用转换的行数。
检查 IDataView
的结果将与下面类似: