You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 17:57:23