使用ML.NET中的TextLoader
扩展方法从文本文件中加载数据。你需要知道在文本文件中数据列在那里,它们的类型是什么,在文本文件中什么位置可以找到它们。
请注意:对于ML.NET只读取文件的某些列, 或多次读取同一列, 是完全可行的。
示例文件:
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
在ML.NET中提供了三种方法读取文本数据:
//方法一:
// 创建一个新的上下文环境,它可用于程序的异常跟踪和日志记录。
var mlContext = new MLContext();
// 创建一个reader(数据阅读器):在阅读器中定义数据列和它们所在文本文件中的位置
var reader = mlContext.Data.CreateTextReader(ctx => (
// 一个布尔列作为 'target label'.
IsOver50K: ctx.LoadBool(0),
// 三个文本列.
Workclass: ctx.LoadText(1),
Education: ctx.LoadText(2),
MaritalStatus: ctx.LoadText(3)),
hasHeader: true);
// 使用Read方法读取文件内容
var data = reader.Read(dataPath);
如果在程序编译的时候,数据的结构太复杂,你也可以通过动态类型的API进行转换:
//方法二:
// 创建上下文环境
var mlContext = new MLContext();
// 创建一个reader(数据阅读器):在阅读器中定义数据列和它们所在文本文件中的位置
var reader = mlContext.Data.CreateTextReader(new[] {
// 一个布尔列作为 'target label'.
new TextLoader.Column("IsOver50K", DataKind.BL, 0),
// 三个文本列.
new TextLoader.Column("Workclass", DataKind.TX, 1),
new TextLoader.Column("Education", DataKind.TX, 2),
new TextLoader.Column("MaritalStatus", DataKind.TX, 3)
},
// 文件中第一行为表头
hasHeader: true
);
// 使用Read方法读取文件内容
var data = reader.Read(dataPath);
你也可以创建一个数据模型的类,基于这个类来读取数据。
//方法三:
// 定义数据模型类
private class InspectedRow
{
[LoadColumn(0)]
public bool IsOver50K { get; set; }
[LoadColumn(1)]
public string Workclass { get; set; }
[LoadColumn(2)]
public string Education { get; set; }
[LoadColumn(3)]
public string MaritalStatus { get; set; }
public string[] AllFeatures { get; set; }
}
private class InspectedRowWithAllFeatures : InspectedRow
{
public string[] AllFeatures { get; set; }
}
// 创建上下文环境
var mlContext = new MLContext();
// 读取数据
var data = mlContext.Data.ReadFromTextFile<InspectedRow>(dataPath,
// First line of the file is a header, not a data row.
hasHeader: true
)