我有一个由第三方提供的具有任意字段名的字典数据;字段名称通常是明智的,但我需要选择关键信息(例如,名字,姓氏,地址行1,邮政编码)。在查看数据时,人脑只需使用字段名称就可以快速分辨出哪些字段是哪个字段,但是方差使得这很难编程逻辑-因此使用ML。
例如,地址字段的第一行可以命名为:
(是的,有时候我们也会遇到拼写错误!)
我用以下几列构建了一个.tsv训练模型:
AllFieldNames
是所有可用字段的逗号分隔列表。
然后我 Featureize 和前两个字段,并使用最后一个字段通过MulticlassClassification.Trainers.SdcaMaximumEntropy
进行训练。
这通常会产生良好的结果,但有时会猜测列表中没有的字段名称。为避免这种情况,我需要对该算法进行更好的解释,因此它知道预测时字段名称实际上是唯一可能的答案。
var pipeline = _mlContext.Transforms.Conversion.MapValueToKey(inputColumnName: "CorrectAnswer", outputColumnName: "Label")
.Append(_mlContext.Transforms.Text.FeaturizeText(inputColumnName: "LookingForField", outputColumnName: "LookingForFieldFeat"))
.Append(_mlContext.Transforms.Text.FeaturizeText(inputColumnName: "AllFieldNames", outputColumnName: "AllFieldNamesFeat"))
.Append(_mlContext.Transforms.Concatenate("Features", "LookingForFieldFeat", "AllFieldNamesFeat"))
.Append(_mlContext.MulticlassClassification.Trainers.SdcaMaximumEntropy("Label", "Features"))
.Append(_mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
var _trainedModel = trainingPipeline.Fit(trainingDataView);
_predEngine = _mlContext.Model.CreatePredictionEngine<ExtractField, Prediction>(_trainedModel);
var testModel = new ExtractField {
LookingForField = "postcode",
AllFieldNames = "addr1,post code,forename,last nam,post id"
};
var prediction = _predEngine.Predict(testModel);
// correct answer is
testModel.PredictedLabel.Should().Be("post code");
我需要确保预测始终是AllFieldNames
内部的值之一。目前,它大部分时间都只这样做。可能还会出现找不到该字段的情况-因此“无选择”也是有效值。
请问如何使用ML.NET多类分类来实现这一目标?