ML.NET是微软为.NET开发者打造的跨平台机器学习框架,允许开发者使用C#语言完成从数据处理到模型部署的全流程机器学习工作,无需切换到Python等其他语言生态。它支持分类、回归、聚类等多种常见机器学习任务,同时可以调用已有的TensorFlow、ONNX模型,适配大部分业务场景的智能化需求。

环境准备与项目创建
首先需要在开发环境中安装.NET SDK,建议版本为.NET 6及以上。打开Visual Studio或者命令行工具,创建一个新的控制台应用项目,然后添加ML.NET的NuGet包。执行以下命令安装核心依赖:
dotnet add package Microsoft.ML
安装完成后,就可以在项目中引入ML.NET的命名空间开始开发了。
基础机器学习任务实现步骤
以经典的鸢尾花分类任务为例,演示完整的ML.NET使用流程。首先需要定义数据模型类,用于映射输入数据和预测结果。
1. 定义数据模型
创建两个类,分别用于输入数据的加载和预测结果的输出:
using Microsoft.ML.Data;
// 输入数据模型,对应鸢尾花的四个特征和一个标签
public class IrisData
{
[LoadColumn(0)]
public float SepalLength { get; set; }
[LoadColumn(1)]
public float SepalWidth { get; set; }
[LoadColumn(2)]
public float PetalLength { get; set; }
[LoadColumn(3)]
public float PetalWidth { get; set; }
[LoadColumn(4)]
public string Label { get; set; }
}
// 预测结果模型
public class IrisPrediction
{
[ColumnName("PredictedLabel")]
public string PredictedLabel { get; set; }
}
2. 加载数据与初始化上下文
ML.NET的所有操作都基于MLContext类,它是整个框架的入口,负责创建数据加载器、训练器、评估器等组件。首先初始化上下文并加载数据集:
using Microsoft.ML;
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
// 初始化ML上下文
var mlContext = new MLContext(seed: 0);
// 加载数据集,假设数据文件为iris-data.txt,每行格式为:花萼长度,花萼宽度,花瓣长度,花瓣宽度,品种
var dataPath = "iris-data.txt";
var data = mlContext.Data.LoadFromTextFile<IrisData>(dataPath, separatorChar: ',', hasHeader: false);
// 将数据拆分为训练集和测试集,80%用于训练,20%用于测试
var splitData = mlContext.Data.TrainTestSplit(data, testFraction: 0.2);
var trainData = splitData.TrainSet;
var testData = splitData.TestSet;
}
}
3. 构建训练管道
训练管道定义了从数据预处理到模型训练的完整流程,这里需要将特征列合并为一个特征向量,然后选择分类训练器:
// 构建训练管道
var pipeline = mlContext.Transforms.Concatenate("Features", nameof(IrisData.SepalLength), nameof(IrisData.SepalWidth), nameof(IrisData.PetalLength), nameof(IrisData.PetalWidth))
.Append(mlContext.Transforms.Conversion.MapValueToKey("Label"))
.Append(mlContext.MulticlassClassification.Trainers.SdcaMaximumEntropy())
.Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
// 训练模型
var model = pipeline.Fit(trainData);
4. 模型评估
使用测试集评估模型的准确率,判断训练效果是否符合预期:
// 用测试集做预测
var predictions = model.Transform(testData);
// 评估模型
var metrics = mlContext.MulticlassClassification.Evaluate(predictions);
Console.WriteLine($"模型准确率:{metrics.MicroAccuracy:F4}");
5. 模型保存与预测
训练好的模型可以保存到本地,后续部署时直接加载使用,无需重新训练:
// 保存模型到本地文件
mlContext.Model.Save(model, trainData.Schema, "iris-model.zip");
// 加载模型并做单条预测
var loadedModel = mlContext.Model.Load("iris-model.zip", out var modelInputSchema);
var predictionEngine = mlContext.Model.CreatePredictionEngine<IrisData, IrisPrediction>(loadedModel);
// 构造一条测试数据
var testSample = new IrisData
{
SepalLength = 5.1f,
SepalWidth = 3.5f,
PetalLength = 1.4f,
PetalWidth = 0.2f
};
var result = predictionEngine.Predict(testSample);
Console.WriteLine($"预测品种:{result.PredictedLabel}");
常见问题说明
- 数据集格式需要和数据模型的定义匹配,列的顺序、类型要对应,否则会出现加载错误
- 如果任务类型不同,比如做房价预测这类回归任务,只需要替换训练器为
mlContext.Regression.Trainers下的对应方法即可 - 生产环境部署时,可以将模型保存为文件,在服务启动时加载,避免每次请求都重新训练
总结
ML.NET降低了C#开发者使用机器学习的门槛,通过简单的几步操作就能完成模型训练和部署。实际开发中可以根据业务需求调整数据处理逻辑和训练器参数,适配不同的场景。如果需要处理更复杂的任务,还可以结合ML.NET的自动机器学习功能,自动选择最优的模型和参数组合。