共计 1938 个字符,预计需要花费 5 分钟才能阅读完成。
为什么选择 ML.NET?
对于.NET 开发者来说,ML.NET 提供了与 C# 生态无缝集成的机器学习能力。相比 Python 的 scikit-learn 或 TensorFlow,它的优势在于:

- 原生支持.NET 类型系统,无需数据格式转换
- 与 Visual Studio 深度整合,享受智能提示和调试支持
- 可直接嵌入现有.NET 应用,避免跨语言调用开销
- 支持 ONNX 模型互操作,兼顾灵活性
特别适合需要将机器学习快速集成到企业级.NET 应用中的场景,比如:
- 销售预测模块嵌入 ERP 系统
- 客户分群功能集成到 CRM
- 实时异常检测植入 IoT 解决方案
实战:房价预测模型
1. 环境准备
首先通过 NuGet 安装必要包:
// 在 Package Manager Console 运行
Install-Package Microsoft.ML
Install-Package Microsoft.ML.LightGBM
2. 数据加载与清洗
// 定义数据模型
public class HousingData
{[LoadColumn(0)] public float Size;
[LoadColumn(1)] public int Bedrooms;
[LoadColumn(2)] public float Price;
}
// 创建 MLContext
var mlContext = new MLContext(seed: 0);
// 加载数据
IDataView data = mlContext.Data.LoadFromTextFile<HousingData>(
path: "housing.csv",
hasHeader: true,
separatorChar: ',');
// 数据清洗示例:过滤异常值
var cleanData = mlContext.Data.FilterRowsByColumn(
data,
"Price",
lowerBound: 50000,
upperBound: 1000000);
3. 特征工程
// 构建处理管道
var pipeline = mlContext.Transforms
.Concatenate("Features", "Size", "Bedrooms")
.Append(mlContext.Transforms.NormalizeMinMax("Features"));
// 执行转换
ITransformer preprocessor = pipeline.Fit(cleanData);
IDataView transformedData = preprocessor.Transform(cleanData);
4. 模型训练
// 拆分训练测试集
var trainTestSplit = mlContext.Data.TrainTestSplit(transformedData, testFraction: 0.2);
// 选择算法
var trainer = mlContext.Regression.Trainers.LbfgsPoissonRegression();
// 训练
var model = trainer.Fit(trainTestSplit.TrainSet);
5. 模型评估
// 预测测试集
var predictions = model.Transform(trainTestSplit.TestSet);
// 计算指标
var metrics = mlContext.Regression.Evaluate(
predictions,
labelColumnName: "Price");
Console.WriteLine($"MAE: {metrics.MeanAbsoluteError}");
Console.WriteLine($"R²: {metrics.RSquared}");
避坑指南
处理欠拟合
当 R²值低于 0.6 时:
- 检查特征相关性
- 尝试添加多项式特征
- 换用更复杂的算法(如 LightGBM)
生产环境部署
- 使用
mlContext.Model.Save保存管道和模型 - 在 API 项目中使用
PredictionEnginePool实现线程安全预测 - 监控输入数据分布偏移
进阶思考
- 创建自定义转换器需要实现
IEstimator<ITransformer>接口,适合处理领域特定的特征工程 - 当需要与 Python 生态交换模型时,导出 ONNX 格式可实现跨平台兼容
完整示例代码
GitHub 仓库 包含可运行的解决方案,包含:
- 示例数据集
- 单元测试
- Docker 部署配置
总结
通过这个端到端的示例,我们实践了 ML.NET 的核心工作流。相比 Python 生态,在.NET 中使用机器学习虽然社区资源较少,但开发体验更加一致。对于已经在使用 C# 的团队,这可能是性价比更高的选择。
下一步可以尝试:
- 集成 AutoML 自动调参
- 开发 Blazor 前端展示预测结果
- 探索时间序列预测等更复杂的场景
正文完
