通常,当我们构建实验时,我们希望确保“到某一时刻”的数据处理产生我们想要的结果。对于ML.NET来说,这不是很容易做到的:因为所有的ML.NET操作都是延迟执行的,所以我们构造的对象只是数据的“承诺”。
我们需要创建游标并扫描数据以获得实际值。一种方法是使用模式理解[1]并将数据映射到用户定义的IEnumerable
对象中。
另一种允许您检查中间数据的机制是GetColumn<T>
扩展方法。它允许您以IEnumerable
的形式查看一列数据的内容。
以下是所有这些操作:
示例文件[2]:
Label Workclass education marital-status
0 Private 11th Never-married
0 Private HS-grad Married-civ-spouse
1 Local-gov Assoc-acdm Married-civ-spouse
1 Private Some-college Married-civ-spouse
// 将数据加载到数据视图中。
var data = mlContext.Data.LoadFromTextFile<InspectedRow>(dataPath,// 文件的第一行是标题,而不是数据行。hasHeader: true
);// 开始创建我们的处理管道。现在,让我们把所有的文本列连接在一起。
var pipeline = mlContext.Transforms.Concatenate("AllFeatures", "Education", "MaritalStatus");// 转换数据。
var transformedData = pipeline.Fit(data).Transform(data);// “transformedData”是数据的“承诺”。让我们实际加载它。
var someRows = mlContext// 转换为用户定义类型的可枚举项。.CreateEnumerable<InspectedRowWithAllFeatures>(transformedData, reuseRowObject: false)// 取几个值作为数组。.Take(4).ToArray();// 提取“AllFeatures”列。这将取出整个数据集:确保只取几行,以防数据集太大。与静态API类似,只是您必须指定列名和类型。
var featureColumns = transformedData.GetColumn<string[]>(transformedData.Schema["AllFeatures"])
参考资料
[1]
模式理解: https://github.com/dotnet/machinelearning/blob/main/docs/code/SchemaComprehension.md
[2]示例文件: https://github.com/dotnet/machinelearning/blob/main/test/data/adult.tiny.with-schema.txt