如何基于ML.NET构建性别分类预测模型?
ML.NET 性别分类(male/female)模型构建指南
1. 定义数据模型类
先创建两个强类型类:一个映射输入数据集的结构,一个承载预测结果,这是ML.NET处理数据的基础要求。
// 输入数据类,对应数据集的每一列 public class GenderData { [LoadColumn(0)] // 对应第一列gender public string? Gender { get; set; } [LoadColumn(1)] // 第二列age public float Age { get; set; } [LoadColumn(2)] // 第三列county public string? County { get; set; } [LoadColumn(3)] // 第四列job public string? Job { get; set; } [LoadColumn(4)] // 第五列wage public string? Wage { get; set; } } // 预测结果类,包含输出的性别和置信度 public class GenderPrediction { // 最终预测的性别字符串(male/female) [ColumnName("PredictedLabel")] public string? PredictedGender { get; set; } // 对应两个性别的概率值 [ColumnName("Score")] public float[]? Probabilities { get; set; } }
2. 构建数据处理与训练管道
创建MLContext实例,然后搭建从数据清洗、特征工程到模型训练的完整流程,重点处理字符串标签和特殊格式的数值字段:
var mlContext = new MLContext(); // 加载数据集(假设是制表符分隔的文本文件,可根据实际调整路径和分隔符) IDataView data = mlContext.Data.LoadFromTextFile<GenderData>( path: "gender-data.txt", separatorChar: '\t', hasHeader: true); // 定义数据处理+训练管道 var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: nameof(GenderData.Gender)) // 处理带逗号的wage字段,转为浮点数 .Append(mlContext.Transforms.CustomMapping((GenderData input, out float wage) => wage = float.Parse(input.Wage?.Replace(",", "") ?? "0"), contractName: "WageParser")) .Append(mlContext.Transforms.CopyColumns(outputColumnName: "WageNum", inputColumnName: "wage")) // 将字符串标签转为ML.NET算法可识别的键类型 .Append(mlContext.Transforms.Conversion.MapValueToKey(outputColumnName: "Label", inputColumnName: "Label")) // 对类别型特征(county、job)做独热编码 .Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "CountyEncoded", inputColumnName: nameof(GenderData.County))) .Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "JobEncoded", inputColumnName: nameof(GenderData.Job))) // 合并所有特征到统一的Features列 .Append(mlContext.Transforms.Concatenate("Features", nameof(GenderData.Age), "WageNum", "CountyEncoded", "JobEncoded")) // 选择多分类训练器(适配双类别字符串标签场景) .Append(mlContext.MulticlassClassification.Trainers.SdcaMaximumEntropy(labelColumnName: "Label", featureColumnName: "Features")) // 将预测出的键类型标签转回原始字符串(male/female) .Append(mlContext.Transforms.Conversion.MapKeyToValue(outputColumnName: "PredictedLabel", inputColumnName: "PredictedLabel")); // 训练模型 ITransformer model = pipeline.Fit(data);
3. 创建预测引擎并执行预测
训练完成后,生成预测引擎,即可对未知数据(比如数据集里的???行)进行性别预测:
// 创建预测引擎 var predictor = mlContext.Model.CreatePredictionEngine<GenderData, GenderPrediction>(model); // 准备待预测的样本数据 var unknownSample = new GenderData { Gender = "???", Age = 44, County = "north", Job = "dev", Wage = "55,000" }; // 执行预测 GenderPrediction result = predictor.Predict(unknownSample); // 输出结果 Console.WriteLine($"预测性别:{result.PredictedGender}"); Console.WriteLine($"Male置信度:{result.Probabilities?[0]:P2}"); Console.WriteLine($"Female置信度:{result.Probabilities?[1]:P2}");
核心注意点
- 字符串标签转换:因为要输出
male/female字符串,必须通过MapValueToKey和MapKeyToValue完成标签与算法兼容格式的双向转换,这是区别于布尔值二分类的关键。 - 数据分隔符:示例数据集是制表符分隔,加载时要对应设置
separatorChar: '\t',如果是CSV格式则改为','。 - 算法选择:这里用多分类算法适配双类别场景,也可以将标签转为布尔值后用二分类算法,最终再转回字符串,两种方式都可行。
内容的提问来源于stack exchange,提问作者redoc01
相关产品推荐
相关产品推荐

