构建ML.NET多类分类器时如何指定有效值?

时间:2019-06-17 18:20:40

标签: c# ml.net

我有一个由第三方提供的具有任意字段名的字典数据;字段名称通常是明智的,但我需要选择关键信息(例如,名字,姓氏,地址行1,邮政编码)。在查看数据时,人脑只需使用字段名称就可以快速分辨出哪些字段是哪个字段,但是方差使得这很难编程逻辑-因此使用ML。

例如,地址字段的第一行可以命名为:

  • address1
  • add1
  • addr1
  • 寻址第1行
  • address_lin_1
  • 地址行-#1

(是的,有时候我们也会遇到拼写错误!)

我用以下几列构建了一个.tsv训练模型:

  1. LookingForField
  2. AllFieldNames
  3. CorrectAnswer

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多类分类来实现这一目标?

0 个答案:

没有答案