共计 2078 个字符,预计需要花费 6 分钟才能阅读完成。
ML.NET 框架概述
ML.NET 是微软为.NET 开发者提供的跨平台机器学习框架,它允许开发者在不离开 C# 生态的情况下实现机器学习任务。与 Python 生态相比,ML.NET 具有以下特点:

- 无需环境切换:直接在 Visual Studio 或 Rider 中开发,无需配置 Python 环境
- 强类型安全:利用 C# 的类型系统减少运行时错误
- 生产就绪:原生支持模型序列化和 ASP.NET Core 集成
- 性能优化:针对.NET 运行时进行了特定优化
不过需要注意的是,ML.NET 的算法库目前没有 Python 生态丰富,在遇到前沿算法需求时可能需要考虑 TensorFlow.NET 等方案。
实战:房价预测模型
1. 项目初始化
首先创建.NET 6 控制台项目,添加必要的 NuGet 包:
<PackageReference Include="Microsoft.ML" Version="2.0.0" />
<PackageReference Include="Microsoft.Data.Analysis" Version="0.20.0" />
2. 数据加载与清洗
使用 DataFrame API 加载 CSV 数据:
using Microsoft.Data.Analysis;
// 加载数据
var housingData = DataFrame.LoadCsv("housing.csv");
// 处理缺失值
housingData.FillNulls(-1, inPlace: true);
// 删除无关列
housingData.Columns.Remove("Id");
3. 特征工程
创建 ML.NET 数据处理管道:
var mlContext = new MLContext();
// 构建数据预处理管道
var dataProcessPipeline = mlContext.Transforms
.Concatenate("Features", "SquareFeet", "Bedrooms", "Location")
.Append(mlContext.Transforms.NormalizeMinMax("Features"))
.Append(mlContext.Transforms.Categorical.OneHotEncoding("Location"));
4. 模型训练
使用 FastTree 回归算法:
var trainer = mlContext.Regression.Trainers.FastTree(
new FastTreeRegressionTrainer.Options
{
NumberOfLeaves = 20,
MinimumExampleCountPerLeaf = 10,
LearningRate = 0.1
});
var trainingPipeline = dataProcessPipeline.Append(trainer);
var model = trainingPipeline.Fit(trainTestSplit.TrainSet);
5. 模型评估
计算评估指标:
var predictions = model.Transform(trainTestSplit.TestSet);
var metrics = mlContext.Regression.Evaluate(predictions);
Console.WriteLine($"MAE: {metrics.MeanAbsoluteError}");
Console.WriteLine($"RMSE: {metrics.RootMeanSquaredError}");
生产环境注意事项
模型序列化
使用以下方式序列化模型:
mlContext.Model.Save(model, trainTestSplit.TrainSet.Schema, "model.zip");
// 反序列化时确保特征 Schema 一致
var loadedModel = mlContext.Model.Load("model.zip", out var schema);
常见陷阱包括:
- 忽略特征 Schema 的变化
- 跨 ML.NET 版本不兼容
- 未考虑内存流式处理
训练模式选择
批量训练(Batch Learning) vs 在线学习(Online Learning):
- 批量训练:适合静态数据集,训练开销大但精度高
- 在线学习:适合数据流场景,支持渐进式更新
ML.NET 主要通过 mlContext.Data.LoadFromEnumerable 支持在线学习场景。
延伸思考
何时使用 TensorFlow.NET
考虑以下场景时建议迁移:
- 需要复杂神经网络架构
- 使用预训练模型(如 ResNet)
- 需要 GPU 加速训练
分布式训练建议
对于大规模数据集:
- 使用 ML.NET 的 TensorFlow 后端
- 考虑 Azure Machine Learning 服务
- 实现自定义 Parquet 数据分片
总结
通过本文的实战演练,我们完成了从数据加载到模型部署的完整流程。ML.NET 让 C# 开发者能够快速进入机器学习领域,虽然在某些高级场景下可能需要结合其他工具,但对于大多数业务需求已经足够强大。建议读者从这个小项目出发,逐步探索更复杂的应用场景。
正文完
