【问题标题】:How to generate dynamically the Data Model Class in ML.Net?如何在 ML.Net 中动态生成数据模型类?
【发布时间】:2021-08-31 02:46:18
【问题描述】:

我是 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 为数据模型自动创建我的类之后,它必须被编译,但我已经编译了所有文件,这意味着我需要以某种方式重新编译...

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

提前感谢您的回答

【问题讨论】:

    标签: c# class datamodel ml.net ml.net-model-builder


    【解决方案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.Analysis NuGet 包,它提供了一种使用 LoadCsv 方法加载 CSV 数据的简单方法。

    var dataFrame = DataFrame.LoadCsv(FILE_PATH);
    

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

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

    var data = (IDataView)dataFrame;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多