我有一个关于训练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
,与已经标记为非女性的另一个接近。
答案 0 :(得分:0)
在.NET Core 3.1中使用Microsoft.ML.AutoML 0.17.2,并对包含null的数据集执行二进制分类实验,如果我清理null值,发现没有错误和合理的结果并将其替换为 any 字符串,其中包括空字符串。我当前的管道正在一次性完成所有文本列的功能-我不确定这与您正在做的事情是否有所不同:
var options = new TextFeaturizingEstimator.Options();
options.KeepNumbers = true;
options.WordFeatureExtractor = null;
options.CharFeatureExtractor = null;
...
var initializer = mlContext.Transforms.Conversion.ConvertType("Label", "Column1", Microsoft.ML.Data.DataKind.Boolean)
.Append(mlContext.Transforms.Text.FeaturizeText("Features", options, propertyNames));
var initializedData = initializer.Fit(trainDataView).Transform(trainDataView);
但是关键是,只要它不为null,它看起来就好像不在乎ML.NET。我尝试了许多填充值,例如“?”,“,”,“”和“ _”,使用“”得到了最合理的结果。希望这有道理并能帮助您解决一些问题。