0

我是 C# 和 ML.Net 的初学者,我正在努力在 ML.Net 中加载数据,为此我将一些数据存储在 .csv 文件中。第一步是为数据模型创建一个类,如下所示:

public class ModelInput

 [ColumnName("sepallength"), LoadColumn(1)]
 public float Sepallength { get; set; }
 [ColumnName("sepalwidth"), LoadColumn(2)]
 public float Sepalwidth { get; set; }
 [ColumnName("petallength"), LoadColumn(3)]
 public float Petallength { get; set; }
 [ColumnName("petalwidth"), LoadColumn(4)]
 public float Petalwidth { get; set; }
 [ColumnName("variety"), LoadColumn(5)]
 public string Variety { get; set; }

因此,在加载 .csv 文件之前,我需要将我的 .csv 第一行中的所有功能存储在此类中。我还需要知道由特征(字符串、浮点数、日期时间等)表示的变量的类型,以及在我的 .csv 中表示该特征的列。

创建此类后,我将使用以下简单的代码行从 .csv 加载数据:

var myData = mlContext.Data.LoadFromTextFile<ModelInput>("Iris.csv",
hasHeader: true, separatorChar: ',');

所以这个命令使用我首先为数据模型创建的类。

问题是:我想做我在动态方法中描述的第一步,因为在加载我的 .csv 文件之前,我需要已经知道我的 .csv 的结构并实现该类。但是如果我不知道呢?(例如,如果有人想加载自己的文件怎么办?)

我的想法是编写一些脚本,第一次读取我的 .csv 文件并创建一个 .cs 文件并用我的课程所需的代码填充这个文件,因此该脚本将取决于我的 .csv 和还有他们的变量类型(甚至其他东西......)

但是我想知道我的想法的可行性,因为在通过读取 .csv 为数据模型自动创建我的类之后,它必须被编译,但我已经编译了所有文件,这意味着我需要以某种方式重新编译...

这是正确的方法还是我错过了更容易的东西?

预先感谢您的回答

4

1 回答 1

1

如果您需要在没有输入模式类的情况下加载数据,实际上有几种方法可以做到这一点。

推断列 AutoML

您可以使用Microsoft.ML.AutoML允许您使用该InferColumns方法的包。

var inference = context.Auto().InferColumns(FILE_PATH, labelColumnName: LABEL_NAME, separatorChar: ',');

从这里你有两个属性,TextLoaderOptions你可以将它们传递到context.Data.CreateTextLoader

var loader = context.Data.CreateTextLoader(inference.TextLoaderOptions);

然后,使用加载器,您可以将文件加载到IDataView.

var data = loader.Load(FILE_PATH);

数据帧 API

DataFrame API 带有Microsoft.Data.AnalysisNuGet 包,它提供了一种使用该方法加载 CSV 数据的简单LoadCsv方法。

var dataFrame = DataFrame.LoadCsv(FILE_PATH);

这为您提供了一个DataFrame对象,您可以使用它对数据进行一些处理和分析,类似于您可以在 Python 中使用 pandas 库执行的操作。但是,请注意,这个库处于非常早期的阶段,所以你现在可以用它做什么有点有限。

DataFrame对象与 兼容,IDataView您可以对其进行显式转换。

var data = (IDataView)dataFrame;

您可以将其用于任何 ML.NET 操作。

于 2021-06-19T13:05:19.913 回答