异常映射键类型到预测标签
Exception mapping key type to predicted label
我构建了一个这样的管道:
// 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);
还有一个预测class
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);
我得到异常:
'Can't bind the IDataView column 'PredictedLabel' of type 'Key' to field or property 'PredictedLabel' of type 'System.String'.'
我做错了什么?
PredictAndMetadata 是根据您的管道中的 Multiclass 训练器编写的,它将为您生成类型为 "Label" 的 "PredictedLabel" 列。
我在您的管道中没有看到培训师,我认为它根本不存在。
你这样做:
.Append(mlContext.Transforms.Conversion.MapKeyToValue(("PredictedLabel", DefaultColumnNames.Label)))
您将字符串类型的 "Label" 转换为 Key 类型的 "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'.
目前我不确定你想用这段代码实现什么,如果你能描述你想解决什么样的任务,我可以帮助你。
我认为您的预测 class 有 string PredictedLabel
,而我相信 GetKeyValues
需要一个关键列。
有关键到值和值到键转换的更多信息,请参阅此示例:
https://github.com/dotnet/machinelearning/blob/master/docs/samples/Microsoft.ML.Samples/Dynamic/KeyToValueValueToKey.cs
下面是一个如何取回预测标签(作为字符串)的示例
// 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
中指定的位置和参数
正在使用的预测 class 与上面示例中的预测类似:
private class IrisPredictionWithStringLabel
{
[ColumnName("Score")]
public float[] PredictedScores { get; set; }
public string PredictPlant { get; set; }
}
希望对您有所帮助!
我构建了一个这样的管道:
// 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);
还有一个预测class
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);
我得到异常:
'Can't bind the IDataView column 'PredictedLabel' of type 'Key' to field or property 'PredictedLabel' of type 'System.String'.'
我做错了什么?
PredictAndMetadata 是根据您的管道中的 Multiclass 训练器编写的,它将为您生成类型为 "Label" 的 "PredictedLabel" 列。 我在您的管道中没有看到培训师,我认为它根本不存在。
你这样做:
.Append(mlContext.Transforms.Conversion.MapKeyToValue(("PredictedLabel", DefaultColumnNames.Label)))
您将字符串类型的 "Label" 转换为 Key 类型的 "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'.
目前我不确定你想用这段代码实现什么,如果你能描述你想解决什么样的任务,我可以帮助你。
我认为您的预测 class 有 string PredictedLabel
,而我相信 GetKeyValues
需要一个关键列。
有关键到值和值到键转换的更多信息,请参阅此示例: https://github.com/dotnet/machinelearning/blob/master/docs/samples/Microsoft.ML.Samples/Dynamic/KeyToValueValueToKey.cs
下面是一个如何取回预测标签(作为字符串)的示例
// 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
中指定的位置和参数正在使用的预测 class 与上面示例中的预测类似:
private class IrisPredictionWithStringLabel
{
[ColumnName("Score")]
public float[] PredictedScores { get; set; }
public string PredictPlant { get; set; }
}
希望对您有所帮助!