1

我建立了这样的管道:

// PurchaseData.TrainingInputColumnNames is string[] containing the input column names
var predictColumn = nameof(PurchaseData.Brand);
var dataProcessPipeline = mlContext.Transforms.Categorical.OneHotEncoding(nameof(PurchaseData.CurrentBrand))
    .Append(mlContext.Transforms.Categorical.OneHotEncoding(nameof(PurchaseData.Gender)))
    .Append(mlContext.Transforms.Concatenate(DefaultColumnNames.Features, PurchaseData.TrainingInputColumnNames))
    .Append(mlContext.Transforms.Conversion.MapValueToKey(outputColumnName: DefaultColumnNames.Label, inputColumnName: predictColumn))
    .Append(mlContext.Transforms.Normalize())
    .Append(mlContext.Transforms.Conversion.MapKeyToValue(("PredictedLabel", DefaultColumnNames.Label)))
    .AppendCacheCheckpoint(mlContext)


IEstimator<ITransformer> trainer = null;
trainer = mlContext.MulticlassClassification.Trainers.StochasticDualCoordinateAscent
    (
    featureColumn: DefaultColumnNames.Features,
    l2Const: 0.0001f, 
    l1Threshold: null,                    
    maxIterations: 200
    );

var trainingPipeline = dataProcessPipeline.Append(trainer);        

var trainedModel = trainingPipeline.Fit(trainingDataView);

和一个预测类

public class PurchaseDataPrediction
{
    public float[] Score;
    public string PredictedLabel;        
}

当我尝试使用解码标签时

// https://github.com/dotnet/machinelearning/blob/master/test/Microsoft.ML.Tests/Scenarios/Api/Estimators/PredictAndMetadata.cs
VBuffer<ReadOnlyMemory<char>> keys = default;
predictionEngine.OutputSchema[nameof(PurchaseDataPrediction.PredictedLabel)].GetKeyValues(ref keys);

我得到了例外:

“无法将“Key”类型的 IDataView 列“PredictedLabel”绑定到“System.String”类型的字段或属性“PredictedLabel”。

我究竟做错了什么?

4

3 回答 3

2

这是一个如何获取预测标签的示例(作为字符串)

        // Create Estimator
        var pipe = mlContext.Transforms.Concatenate("Features", "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")
            .Append(mlContext.Transforms.Normalize("Features"))
            .Append(mlContext.Transforms.Conversion.MapValueToKey("Label", "IrisPlantType"), TransformerScope.TrainTest)
            .AppendCacheCheckpoint(mlContext)
            .Append(mlContext.MulticlassClassification.Trainers.StochasticDualCoordinateAscent())
            .Append(mlContext.Transforms.Conversion.MapKeyToValue(("PredictPlant", "PredictedLabel")));

        // Train the pipeline
        var trainedModel = pipe.Fit(trainData);

        // Make predictions
        var predictFunction = trainedModel.CreatePredictionEngine<IrisDataWithStringLabel, IrisPredictionWithStringLabel>(mlContext);
        IrisPredictionWithStringLabel prediction = predictFunction.Predict(new IrisDataWithStringLabel()
        {
            SepalLength = 5.1f,
            SepalWidth = 3.3f,
            PetalLength = 1.6f,
            PetalWidth = 0.2f,
        });

        // Outputs string : "Iris-setosa" as the prediction
        Console.WriteLine(prediction.PredictPlant);

请注意培训师在管道中的指定位置。此外,在MapKeyToValue中指定的位置和参数

正在使用的预测类与您在上面的示例中的类似:

    private class IrisPredictionWithStringLabel
    {
        [ColumnName("Score")]
        public float[] PredictedScores { get; set; }

        public string PredictPlant { get; set; }
    }

希望能帮助到你!

于 2019-02-20T21:44:45.210 回答
1

该 PredictAndMetadata 是根据您在管道中拥有多类培训师的想法编写的,它将为您生成具有“标签”列类型的“PredictedLabel”列。我没有在您的管道中看到培训师,我认为它根本不存在。

你这样做:

.Append(mlContext.Transforms.Conversion.MapKeyToValue(("PredictedLabel", DefaultColumnNames.Label)))

您获取字符串类型的“标签”并将其转换为键类型的“PredictedLabel”列。(密钥基本上是用 uint 备份的枚举)。

public class PurchaseDataPrediction
{
    public float[] Score;
     public string PredictedLabel;
}

但是您的结果类型定义具有 PredictedLabel 的字符串类型。在 DataView 中,您有 Key (uint)。

这正是异常所说的:

Can't bind the IDataView column 'PredictedLabel' of type 'Key' to field or property 'PredictedLabel' of type 'System.String'.

目前我不确定你想用这段代码实现什么,如果你能描述你想解决什么样的任务,我可以帮助你。

于 2019-02-19T20:35:15.797 回答
0

我认为您的预测类有string PredictedLabel,而我相信GetKeyValues期待一个关键列。

有关 key-to-value 和 value-to-key 转换的更多信息,请参阅此示例: https://github.com/dotnet/machinelearning/blob/master/docs/samples/Microsoft.ML.Samples/Dynamic/KeyToValueValueToKey。 CS

于 2019-02-19T21:31:02.877 回答