Тип ключа сопоставления исключений с прогнозируемой меткой
Я построил трубопровод так:
// 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);
Я получаю исключение:
'Невозможно привязать столбец IDataView'PredictedLabel'типа'Key'к полю или свойству'PredictedLabel'типа'System.String'.'
Что я делаю неправильно?
3 ответа
Вот пример того, как вернуть предсказанную метку (в виде строки)
// 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; }
}
Надеюсь, поможет!
Это PredictAndMetadata было написано с идеей, что у вас есть Multiclass trainer в вашем конвейере, и он будет производить столбец "PredictedLabel" с типом столбца "Label". Я не вижу тренера в вашем конвейере, я бы предположил, что его нет вообще.
Вы делаете это:
.Append(mlContext.Transforms.Conversion.MapKeyToValue(("PredictedLabel", DefaultColumnNames.Label)))
Вы берете "Метку" типа string и конвертируете ее в столбец "PredictedLabel" с типом Key. (Ключ в основном enum с резервной копией uint).
public class PurchaseDataPrediction
{
public float[] Score;
public string PredictedLabel;
}
Но у вашего определения типа результата есть строковый тип для PredictedLabel. В то время как в DataView у вас есть ключ (Uint).
И это именно то, что говорит исключение:
Can't bind the IDataView column 'PredictedLabel' of type 'Key' to field or property 'PredictedLabel' of type 'System.String'.
В настоящий момент я не уверен, что вы пытаетесь достичь с помощью этого кода, если вы можете описать, какую задачу вы пытаетесь решить, я могу помочь вам с этим.
Я думаю, что ваш класс предсказания имеет string PredictedLabel
пока я верю GetKeyValues
ожидает ключевой столбец.
Для получения дополнительной информации о преобразованиях ключ-значение и значение-ключ см. Этот пример: https://github.com/dotnet/machinelearning/blob/master/docs/samples/Microsoft.ML.Samples/Dynamic/KeyToValueValueToKey.cs