我是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.Analysis
NuGet包,它提供了一种使用LoadCsv
方法加载CSV数据的简单方法。
var dataFrame = DataFrame.LoadCsv(FILE_PATH);
这为您提供了一个DataFrame
对象,您可以使用它对数据进行一些处理和分析,类似于使用Python中的pandas库。然而,请注意,这个库还处于非常早期的阶段,因此您现在可以使用它做的事情有点有限。
DataFrame
对象与IDataView
兼容,您可以对其进行显式强制转换
var data = (IDataView)dataFrame;
您可以将其用于任何ML.NET操作。