如何在ML.Net中动态生成数据模型类



我是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第一行的所有功能存储在此类中。我还需要知道由功能(字符串、浮点、DateTime…(表示的变量类型,以及在我的.csv.中表示该功能的列

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

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

因此,此命令使用我首先为数据模型创建的类。

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

我的想法是写一些脚本,第一次读取我的.csv,创建一个.cs文件,并用我的类所需的代码填充这个文件,所以脚本将取决于我在.csv中的功能,以及它们的变量类型(甚至其他东西…(

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

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

提前感谢您的回答

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

推断列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包,它提供了一种使用LoadCsv方法加载CSV数据的简单方法。

var dataFrame = DataFrame.LoadCsv(FILE_PATH);

这为您提供了一个DataFrame对象,您可以使用它对数据进行一些处理和分析,类似于使用Python中的pandas库。然而,请注意,这个库还处于非常早期的阶段,因此您现在可以使用它做的事情有点有限。

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

var data = (IDataView)dataFrame;

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

相关内容

  • 没有找到相关文章

最新更新