0

我试图将我的模型从 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到我的 exisitng 中pipeline?我需要做什么,var data从 0.6 版到 0.5 版pipeline

4

1 回答 1

1

我认为这些LearningPipelineAPI 与新的静态类型 API(例如TextLoader.CreateReader)不兼容。这本食谱有助于展示用于训练的新 API,以及使用模型进行预测等其他场景。测试也可能有助于二元分类。

特别是对于您的代码,我相信培训代码看起来像:

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);
于 2018-10-08T00:18:01.087 回答