Тип ключа сопоставления исключений с прогнозируемой меткой - PullRequest
0 голосов
/ 16 февраля 2019

Я построил конвейер следующим образом:

// 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);

Iполучить исключение:

'Невозможно привязать столбец IDataView' PredictedLabel 'типа' Key 'к полю или свойству' PredictedLabel 'типа' System.String '.'

Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

Я думаю, что ваш класс предсказания имеет string PredictedLabel, в то время как я считаю, GetKeyValues ожидает ключевой столбец.

Для получения дополнительной информации о преобразованиях ключ-значение и значение-в-ключ см. Этот пример:https://github.com/dotnet/machinelearning/blob/master/docs/samples/Microsoft.ML.Samples/Dynamic/KeyToValueValueToKey.cs

0 голосов
/ 21 февраля 2019

Вот пример того, как вернуть предсказанную метку (в виде строки)

        // 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; }
    }

Надеюсь, это поможет!

0 голосов
/ 19 февраля 2019

То, что PredictAndMetadata был написан с идеей, что у вас есть мультиклассовый тренер в вашем конвейере, и он произведет вам столбец «PredictedLabel» с типом столбца «Метка».Я не вижу трейнера в вашем конвейере, я бы предположил, что он вообще отсутствует.

Вы делаете это:

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

Вы берете "Метку" типа string и конвертируете ее в "PredictedLabel "с типом Key.(Ключ в основном enum резервируется с помощью 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'.

В настоящий момент я не уверен, чего вы пытаетесь достичь с помощью этого кода,если вы можете описать, какую задачу вы пытаетесь решить, я могу вам в этом помочь.

...