ML.NET Cookbook --- 1.如何从文本文件中加载数据?

时间:2021-02-22 10:01:51

使用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
)