将来自新TextLoader的“数据”添加到现有的管道中(0.6版)

时间:2018-10-07 14:16:54

标签: c# ml.net

我正在尝试将模型从ML.NET 0.5改进到0.6,我有一个问题。

我从ML.NET Cookbook复制粘贴的示例中说:

// Create a new environment for ML.NET operations. It can be used for 
exception tracking and logging, 
// as well as the source of randomness.
var env = new LocalEnvironment();

// Create the reader: define the data columns and where to find them in the 
 text file.
 var reader = TextLoader.CreateReader(env, ctx => (
    // We read the first 11 values as a single float vector.
    FeatureVector: ctx.LoadFloat(0, 10),
    // Separately, read the target variable.
    Target: ctx.LoadFloat(11)
    ),
    // Default separator is tab, but we need a comma.
    separator: ',');


// Now read the file (remember though, readers are lazy, so the actual 
reading will happen when the data is accessed).
var data = reader.Read(new MultiFileSource(dataPath));

所以我开始将其实现到我的模型中:

using System;
using Microsoft.ML.Legacy;
using Microsoft.ML.Legacy.Data;
using Microsoft.ML.Legacy.Transforms;
using Microsoft.ML.Legacy.Trainers;
using Microsoft.ML.Legacy.Models;
using Microsoft.ML.Runtime.Data;

public static PredictionModel<CancerData, CancerPrediction> Train()
    {
        var pipeline = new LearningPipeline();
        //0.6 way to upload data into model
        var env = new LocalEnvironment();
            var reader = Microsoft.ML.Runtime.Data.TextLoader.CreateReader(env, ctx => (
            FeatureVector: ctx.LoadFloat(0, 30),
            Target: ctx.LoadText(31)
                ),
            separator: ';');

        var data = reader.Read(new MultiFileSource("Cancer-Train.csv"));

        //pipeline.Add(new TextLoader("Cancer-Train.csv").CreateFrom<CancerData>(useHeader: true, separator: ';'));
        pipeline.Add(new Dictionarizer(("Diagnosis", "Label")));
        pipeline.Add(data); //dont work, i just write it to show you what i want to do

        //below the 0.5 way to load data into pipeline!
        //pipeline.Add(new ColumnConcatenator(outputColumn: "Features",
        //    "RadiusMean",
        //    "TextureMean",
        // .. and so on...
        //    "SymmetryWorst",
        //    "FractalDimensionWorst"));
        pipeline.Add(new StochasticDualCoordinateAscentBinaryClassifier());
        pipeline.Add(new PredictedLabelColumnOriginalValueConverter() { PredictedLabelColumn = "PredictedLabel" });
        PredictionModel<CancerData, CancerPrediction> model = pipeline.Train<CancerData, CancerPrediction>();

        model.WriteAsync(modelPath);
        return model;

    }

问题是,如何将var data添加到我的现有pipeline中?我需要做什么,才能从0.6版本的var data到0.5 pipeline的作品?

1 个答案:

答案 0 :(得分:1)

我不认为LearningPipeline API与新的静态类型化API(例如TextLoader.CreateReader)兼容。 cookbook有助于显示用于培训的新API以及其他场景,例如使用模型进行预测。 This测试对于二进制分类也可能会有所帮助。

具体来说,对于您的代码,我相信培训代码应类似于:

var env = new LocalEnvironment();
var reader = Microsoft.ML.Runtime.Data.TextLoader.CreateReader(env, ctx => (
FeatureVector: ctx.LoadFloat(0, 30),
Target: ctx.LoadBool(31)
    ),
separator: ';');

var data = reader.Read(new MultiFileSource("Cancer-Train.csv"));

BinaryClassificationContext bcc = new BinaryClassificationContext(env);

var estimator = reader.MakeNewEstimator()
    .Append(row => (
        label: row.Target,
        features: row.FeatureVector.Normalize()))
    .Append(row => (
        row.label,
        score: bcc.Trainers.Sdca(row.label, row.features)))
    .Append(row => (
        row.label,
        row.score,
        predictedLabel: row.score.predictedLabel));

var model = estimator.Fit(data);