一、ML.NET 是什么:.NET 生态的跨平台机器学习框架
ML.NET 是微软推出的一款开源、跨平台机器学习框架,专门为 .NET 开发者设计。它的核心目标是让熟悉 C# / F# 的工程师不需要学习 Python,也能在自己的 .NET 应用中直接构建、训练、部署和消费自定义机器学习模型。根据官方 README 的描述,ML.NET 提供了从文件和数据库加载数据、数据转换、上百种内置训练算法(分类、回归、聚类、推荐、时序预测、异常检测)的完整流水线,并且可以直接在 .NET 应用中消费 TensorFlow 和 ONNX 模型。
与 Python 生态(scikit-learn、PyTorch)相比,ML.NET 的差异化优势在于:它与 .NET 运行时深度集成。开发者可以用同一种语言(C#)、同一个工程体系(NuGet、MSBuild、Visual Studio)完成从数据处理到模型上线的全过程,不需要在 Python 与 C# 之间来回切换,也不需要把模型通过 ONNX 等中间格式导出。对于已经基于 .NET 构建了 ERP、CRM、电商、银行核心系统的企业而言,这意味着机器学习能力可以无缝嵌入现有业务代码。
ML.NET 支持的典型场景包括:情感分析、垃圾邮件分类、价格预测、销量预测、客户分群、推荐系统、异常检测(如信用卡欺诈)、图像分类(通过接入 TensorFlow 模型)。版本徽章:
二、环境准备:.NET SDK 与操作系统要求
2.1 运行时要求
| 组件 | 要求 | 说明 |
|---|---|---|
| .NET | .NET 6 / 7 / 8 / 9 | 主包 targets .NET Standard 2.0,兼容旧版 |
| 操作系统 | Windows / Linux / macOS | 全平台;ARM64、Apple Silicon、Blazor WebAssembly 也支持 |
| 架构 | 64-bit 全平台;32-bit 仅 Windows | TensorFlow 与 LightGBM 相关功能不支持 32-bit |
| 开发工具 | Visual Studio 2022 / VS Code + C# Dev Kit | 推荐 VS 2022 with ML.NET Model Builder |
2.2 安装 .NET SDK
如果还没有 .NET SDK,先从 官方下载页 安装 .NET 8 LTS:
# Windows: 下载 installer 后一路下一步
# macOS
brew install --cask dotnet-sdk
# Ubuntu
sudo apt-get update && sudo apt-get install -y dotnet-sdk-8.0
# 验证
dotnet --version
# 期望输出: 8.0.xxx2.3 准备训练数据
ML.NET 支持从 CSV、TSV、SQL Server、SQLite、JSON、Azure 表存储等多种来源加载数据。最简单的入门方式是准备一个 CSV 文件,例如情感分析数据 sentiment.csv:
Sentiment,Text
1,"今天天气真好"
0,"这产品烂透了"
1,"客服很耐心,点赞"
0,"发货慢,包装破损"三、安装方式:NuGet 包、Model Builder 与源码
3.1 通过 .NET CLI 安装 NuGet 包
# 创建控制台项目
dotnet new console -n MlNetDemo
cd MlNetDemo
# 安装核心包
dotnet add package Microsoft.ML
# 可选:训练器扩展(LightGBM、FastTree 等)
dotnet add package Microsoft.ML.FastTree
# 可选:文本分析
dotnet add package Microsoft.ML.TextAnalysis
# 可选:TensorFlow 集成
dotnet add package Microsoft.ML.TensorFlow
# 可选:ONNX 集成
dotnet add package Microsoft.ML.OnnxTransformer
# 可选:自动机器学习(AutoML)
dotnet add package Microsoft.ML.AutoML主包 Microsoft.ML 面向 .NET Standard 2.0,因此可以被 .NET Framework 4.6.1+、.NET Core 2.0+、Unity 等兼容实现引用。
3.2 通过 Visual Studio NuGet Package Manager 安装
在解决方案上右键 → Manage NuGet Packages → 浏览 Microsoft.ML → 安装。这种方式适合不熟悉命令行的开发者,Visual Studio 会自动处理依赖还原。
3.3 使用 Model Builder(可视化建模)
Visual Studio 2022 提供了 Model Builder 扩展,可以在不写训练代码的情况下,通过 GUI 选择场景、数据、算法,自动生成训练代码与模型文件。安装方式:在 Visual Studio Installer 中勾选".NET 桌面开发"工作负载,然后在扩展市场搜索"ML.NET Model Builder"。
3.4 每日构建版本(预发布)
微软在 Azure DevOps 上提供每日构建的 NuGet 源:
<!-- nuget.config -->
<configuration>
<packageSources>
<add key="dotnet-libraries" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-libraries/nuget/v3/index.json" />
</packageSources>
</configuration>3.5 源码编译(贡献者)
git clone https://github.com/dotnet/machinelearning.git
cd machinelearning
./build.sh
# Windows
.\build.cmd四、快速上手:训练一个情感分析模型
4.1 完整训练代码
using Microsoft.ML;
using Microsoft.ML.Data;
// 1. 定义输入输出数据模型
public class SentimentData
{
[LoadColumn(0)] public bool Label { get; set; }
[LoadColumn(1)] public string SentimentText { get; set; }
}
public class SentimentPrediction
{
[ColumnName("PredictedLabel")] public bool Prediction { get; set; }
public float Probability { get; set; }
public float Score { get; set; }
}
// 2. 创建 MLContext(所有 ML.NET 操作的入口)
var mlContext = new MLContext(seed: 1);
// 3. 加载数据
var data = mlContext.Data.LoadFromTextFile<SentimentData>(
path: "sentiment.csv",
separatorChar: ',',
hasHeader: true);
// 4. 定义训练管道:文本特征化 + 二分类训练器
var pipeline = mlContext.Transforms.Text.FeaturizeText("Features", nameof(SentimentData.SentimentText))
.Append(mlContext.BinaryClassification.Trainers.SdcaLogisticRegression(
labelColumnName: "Label",
featureColumnName: "Features"));
// 5. 训练
var model = pipeline.Fit(data);
// 6. 保存模型
mlContext.Model.Save(model, data.Schema, "sentiment_model.zip");
// 7. 用模型做预测
var predictor = mlContext.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);
var test = new SentimentData { SentimentText = "今天客服非常耐心,体验很好!" };
var result = predictor.Predict(test);
Console.WriteLine($"预测结果: {(result.Prediction ? "正面" : "负面")}, 置信度: {result.Probability:P2}");4.2 关键概念解释
MLContext 是 ML.NET 的"全局入口",类似 PyTorch 的 torch 模块,所有数据加载、转换、训练、保存都通过它完成。ITransformer 是训练后的模型对象,可以序列化为 .zip 文件在生产环境加载。PredictionEngine 是单条数据预测的便捷封装,但不是线程安全的,生产环境应该用 PredictionEnginePool(在 ASP.NET Core 中通过依赖注入注册)。
五、进阶配置:算法选择、AutoML 与外部模型
5.1 内置训练器一览
| 任务类型 | 常用训练器 | 适用场景 |
|---|---|---|
| 二分类 | SdcaLogisticRegression / FastTree / LbfgsLogisticRegression | 情感分析、垃圾邮件 |
| 多分类 | SdcaMaximumEntropy / FastTreeOva | 意图识别、品类分类 |
| 回归 | Sdca / FastTree / LbfgsPoissonRegression | 价格、销量预测 |
| 聚类 | KMeans | 客户分群 |
| 推荐 | MatrixFactorization / FieldAwareFactorizationMachine | 商品推荐 |
| 时序预测 | SsaForecasting | 销量、流量预测 |
| 异常检测 | RandomizedPca / OneSvd | 信用卡欺诈、设备故障 |
5.2 AutoML 自动选算法
ML.NET 提供 Microsoft.ML.AutoML 包,可以在给定时间内自动搜索算法与超参数:
var experiment = mlContext.Auto().CreateBinaryClassificationExperiment(maxExperimentTimeInSeconds: 60);
var result = experiment.Execute(
trainData: trainSplit,
validationData: testSplit,
labelColumnName: "Label");
var bestModel = result.BestModel;
Console.WriteLine($"最佳算法: {result.BestTrainerName}, AUC: {result.BestRun.ValidationMetrics.AreaUnderRocCurve:P2}");5.3 消费 TensorFlow / ONNX 模型
当团队已经有 Python 训练好的 Keras 或 PyTorch 模型时,可以把它转成 ONNX 后在 ML.NET 中调用:
// 接入 ONNX 模型
var pipeline = mlContext.Transforms.ApplyOnnxModel(
modelFile: "resnet18.onnx",
outputColumnNames: new[] { "output" },
inputColumnNames: new[] { "input" });六、生产部署:Web API、模型版本与性能
6.1 在 ASP.NET Core 中部署
// Program.cs
builder.Services.AddPredictionEnginePool<SentimentData, SentimentPrediction>()
.FromFile(modelName: "sentiment", filePath: "sentiment_model.zip", watchForChanges: true);
// Controller
[ApiController]
[Route("api/[controller]")]
public class PredictController : ControllerBase
{
private readonly PredictionEnginePool<SentimentData, SentimentPrediction> _pool;
public PredictController(PredictionEnginePool<SentimentData, SentimentPrediction> pool) => _pool = pool;
[HttpPost]
public IActionResult Predict([FromBody] string text)
{
var pred = _pool.Predict("sentiment", new SentimentData { SentimentText = text });
return Ok(new { pred.Prediction, pred.Probability });
}
}PredictionEnginePool 是微软为生产环境设计的线程安全预测器池,内部复用 PredictionEngine 实例,避免每次请求都新建对象的开销。
6.2 Docker 部署
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
COPY bin/Release/net8.0/publish/ ./
ENTRYPOINT ["dotnet", "MlNetDemo.dll"]6.3 性能调优要点
- 用 Pool 而不是 new:PredictionEngine 创建开销大,务必用 Pool;
- 批处理预测:离线场景用
mlContext.Data.LoadFromEnumerable+model.Transform批量推理,比逐条 Predict 快 10 倍以上; - 选择轻量训练器:生产打分优先 Sdca / Lbfgs 线性模型,FastTree 精度高但推理慢;
- 模型剪裁:用
mlContext.Model.ConvertToOnnx导出 ONNX,再用 ORT 跑量化推理。
6.4 典型生产场景
电商评论情感分析:把模型嵌入 ASP.NET Core 后台服务,每条新评论实时打分,差评自动触发工单。银行反欺诈:用异常检测模型实时评估每笔交易,可疑交易自动冻结。制造业设备预测性维护:用 SSA 时序预测传感器读数,提前预警故障。
七、常见问题 FAQ 与报错处理
Q1:Could not load file or assembly 'Microsoft.ML'
原因:NuGet 包还原失败。执行 dotnet restore,或删除 obj/bin 目录后重新还原。如果是从旧版本升级,注意主包从 1.x 到 2.0 有 breaking changes。
Q2:PredictionEngine 多线程并发报错
PredictionEngine 不是线程安全的。生产环境必须用 PredictionEnginePool,详见 6.1 节示例。
Q3:训练时内存溢出
大数据集不要全部加载到内存。用 mlContext.Data.LoadFromTextFile 的懒加载模式,或分批读取。对超过 1000 万行的数据集,建议先采样做特征工程,再在全量上训练。
Q4:模型在开发机上正常,部署到 Linux 后报错
常见原因:Linux 上缺少 libgomp1(OpenMP 运行时)。执行 apt-get install libgomp1。TensorFlow 相关功能还需要额外的原生库。
Q5:如何选择训练算法
简单规则:小数据集(<10 万行)用线性模型(Sdca / Lbfgs);大数据集或非线性关系用 FastTree;特征维度极高(文本、词袋)先用线性模型起步。拿不准就用 AutoML 跑 60 秒,让它帮你选。
Q6:ML.NET 与 Python ML 库是什么关系
ML.NET 是独立框架,不依赖 Python。但它可以消费 TensorFlow、ONNX 模型,所以团队可以用 Python 训练复杂深度模型,再用 ML.NET 在 .NET 业务系统中部署。
Q7:如何获取帮助
- 官方文档:docs.microsoft.com/dotnet/machine-learning
- 示例仓库:dotnet/machinelearning-samples
- GitHub Issues:dotnet/machinelearning/issues
- 发布说明:release notes
项目地址:github.com/dotnet/machinelearning | 开源协议:MIT | 适用场景:.NET 业务系统内嵌机器学习、情感分析、价格预测、异常检测、推荐系统。