使用ML.NET训练模型时,在空字符串上使用占位符

问题描述

我有一个关于训练ML.NET的问题,该机器可以预测名字是否为女性。可以使用以下管道来训练模型:

var mlContext = new MLContext();
IDataView trainingDataView = mlContext.Data.LoadFromEnumerable(trainingData);
var dataPrepPipeline = mlContext
    .Transforms
    .Text
    .FeaturizeText("FirstNameFeaturized","FirstName")
    .Append(mlContext.Transforms.Text.FeaturizeText("MiddleNameFeaturized","MiddleName"))
    .Append(mlContext.Transforms.Text.FeaturizeText("LastNameFeaturized","LastName"))
    .Append(mlContext.Transforms.Concatenate(
        "Features","FirstNameFeaturized","MiddleNameFeaturized","LastNameFeaturized"))
    .Append(mlContext.Transforms.NormalizeMinMax("Features","Features"))
    .AppendCacheCheckpoint(mlContext);

var prepPipeline = dataPrepPipeline.Fit(trainingDataView);
var preprocessedData = prepPipeline.Transform(trainingDataView);

var trainer = dataPrepPipeline.Append(mlContext
    .BinaryClassification
    .Trainers
    .AveragedPerceptron(labelColumnName: "IsFemale",numberOfIterations: 10,featureColumnName: "Features"));

ITransformer trainedModel = trainer.Fit(preprocessedData);

我从代码中遗漏了trainingData。该模型如下所示:

public class Person
{
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public bool IsFemale { get; set; }
}

然后我从某个地方(数据库,csv等)获取人员列表,并将其转换为Person个对象。

在将人员转换为Person的过程中,我使用的代码如下:

var trainingData = new List<Person>();
trainingData.AddRange(persons.Select(p => new Person
{
    IsFemale = p.IsFemale,FirstName = p.FirstName ?? "unknown",MiddleName = p.MiddleName ?? "unknown",LastName = p.LastName ?? "unknown"
}));

您可能想知道为什么在其中一个名称部分为空的情况下插入unknown。之所以这样做,是因为如果任何属性为null,构建ML.NET管道都会失败。

这是我的问题。将名称部分设置为unknown时,我会怀疑这会产生不良的模型。示例:如果我有一个名字为Thomas的男性,而我没有其他部分,那将产生Thomas unknown unknown。如果缺少中间名和姓氏,这是否会增加其他人被归类为非女性的可能性?假设我们有一个名为Anna的人,而我们没有其他部分。这将产生Anna unknown unknown,与已经标记为非女性的另一个接近。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)