通常,为了在ML.NET中训练任何模型,您将经历三个步骤:
弄清楚训练数据如何以
IDataView
形式进入ML.NET。将“学习管道”构建为一系列基本的“运算符”(估计器)。
在管道上调用
Fit
以获得经过训练的模型。
示例文件[1]:
feature_0;feature_1;feature_2;feature_3;feature_4;feature_5;feature_6;feature_7;feature_8;feature_9;feature_10;target
-2.75;0.77;-0.61;0.14;1.39;0.38;-0.53;-0.50;-2.13;-0.39;0.46;140.66
-0.61;-0.37;-0.12;0.55;-1.00;0.84;-0.02;1.30;-0.24;-0.50;-2.12;148.12
-0.85;-0.91;1.81;0.02;-0.78;-1.41;-1.09;-0.65;0.90;-0.37;-0.22;402.20
在上面的文件中,最后一列(第12列)是我们预测的标签,前面所有的都是特征。
// 第一步:将数据加载为IDataView。
// 首先,我们定义加载器:指定数据列以及它们在文本文件中的位置。
// 将数据加载到数据视图中。但是请记住,加载器是延迟执行的,所以实际加载将在访问数据时发生。
var trainData = mlContext.Data.LoadFromTextFile<RegressionData>(dataPath,// 默认分隔符是tab,但数据集使用分号。separatorChar: ';'
);// 有时,当数据要在某个地方多次使用时,在首次访问后将数据缓存在内存中可以节省一些加载时间。缓存机制也是延迟执行的;它只在使用后才缓存东西。用户可以用“cachedTrainData”替换“trainData”的所有后续用法。
// 我们仍然使用“trainData”,因为提供相同缓存功能的缓存步骤将插入到所考虑的“管道”中。
var cachedTrainData = mlContext.Data.Cache(trainData);// 第二步:定义学习管道。// 我们用加载器的输出“启动”管道。
var pipeline =// 首先“规范化”数据(对于所有样本,重新缩放到-1和1之间)mlContext.Transforms.NormalizeMinMax("FeatureVector")// 我们增加了一个在内存中缓存数据的步骤,使得下游的迭代训练算法能够有效地对数据进行多次扫描。否则,下面的训练器将多次从磁盘加载数据。缓存机制使用按需策略。// 在任何下游步骤中访问的数据都将在首次使用后被缓存。通常,您只需要在可训练步骤之前添加一个缓存步骤,因为如果数据只扫描一次,则缓存没有帮助。如果用户没有足够的内存来存储整个数据集,则可以删除此步骤。请注意,在上游Transforms.Normalize步骤中,我们只扫描数据一次,因此添加缓存步骤是没有帮助的。.AppendCacheCheckpoint(mlContext)// 添加SDCA回归训练器。.Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Target", featureColumnName: "FeatureVector"));//第三步: 在管道上调用`Fit`
var model = pipeline.Fit(trainData);
参考资料
[1]
示例文件: https://github.com/dotnet/machinelearning/blob/main/test/data/generated_regression_dataset.csv