Microsoft.ML(类似python的包scikit-learn)

25 阅读3分钟

dotnet add package Microsoft.ML

///////////////////////////////////////////

  1. scikit-learn ≈ ML.NET(侧重传统机器学习:分类、回归、聚类、管道/预处理、模型持久化)。
  2. 深度学习对等物是 TensorFlow 或 PyTorch(ML.NET 通过 Microsoft.ML.TensorFlow / ONNX 支持推理)。
  3. 数据处理:pandas 常用于 Python,功能上和 ML.NET 的 IDataView 用途相近(注意 IDataView 是列式/延迟的)。
  4. AutoML:auto-sklearn / TPOT 类似于 Microsoft.ML.AutoML。AutoML 是机器学习中一个相对较新的领域,它主要将机器学习中所有耗时过程自动化,如数据预处理、最佳算法选择、超参数调整等,这样可节约大量时间在建立机器学习模型过程中。
  5. 互操作:两边常用 ONNX 作为模型交换格式。 ////////////////////////////////////////////////////////////////

ML.NET 是微软提供的一个开源、跨平台的机器学习框架,专为 .NET 生态(C#/F#/.NET Core/.NET)设计并以 NuGet 包形式分发。简要要点:

  • 定位:在 .NET 应用中训练、评估并部署机器学习模型(无需离开 .NET 语言栈)。
  • 支持任务:分类、回归、聚类、异常检测、推荐、排序、时间序列预测、以及通过 ONNX/TensorFlow 做图像/文本/深度学习推理。
  • 核心概念:
    • MLContext:入口上下文。
    • IDataView:高效的列式数据管道(类似 DataFrame,但延迟/流式)。
    • Estimator / Transformer:以管道方式构建数据转换与训练流程,使用 Fit() / Transform()
    • 模型保存/加载:mlContext.Model.Save / Load
    • PredictionEngine<TSrc,TDest>:单次预测(注意线程安全问题,生产可使用 PredictionEnginePool)。
  • 常见 NuGet 包:Microsoft.MLMicrosoft.ML.DataMicrosoft.ML.LightGBMMicrosoft.ML.TensorFlowMicrosoft.ML.OnnxTransformerMicrosoft.ML.AutoML 等。
  • 工具与生态:Visual Studio 的 Model Builder、ML.NET CLI、AutoML 帮助快速生成模型。
  • 适用场景:想在 .NET 项目里直接集成 ML 功能(轻/中量级模型、企业应用、嵌入式预测服务)。对于大规模深度学习训练,通常结合专用框架并通过 ONNX/TensorFlow 导入推理模型。

快速开始(安装 + 最小示例):

  • 安装:dotnet add package Microsoft.ML
  • 最小示例(概念):
var ml = new MLContext();
var data = ml.Data.LoadFromTextFile<MyData>("data.csv", hasHeader:true, separatorChar:',');
var pipeline = ml.Transforms.Concatenate("Features", "Feature1","Feature2")
               .Append(ml.BinaryClassification.Trainers.SdcaLogisticRegression());
var model = pipeline.Fit(data);

GitHub Copilot

简短说明这段代码在做什么:

  • var ml = new MLContext();
    创建 ML.NET 的运行上下文,后续所有操作(加载数据、构建管道、训练、评估)都通过它来协调。

  • var data = ml.Data.LoadFromTextFile<MyData>("data.csv", hasHeader:true, separatorChar:',');
    从 CSV 文件读入数据,返回一个延迟、列式的 IDataViewMyData 是用户定义的 POCO 类,用于映射 CSV 列(例如 public float Feature1 {get;set;}public float Feature2 {get;set;}public bool Label {get;set;}float Label)。hasHeader:true 表示文件首行是列名,separatorChar:',' 指定分隔符。

  • ml.Transforms.Concatenate("Features", "Feature1","Feature2")
    构建数据转换步骤,把多个特征列合并成一个名为 Features 的特征向量列(类型通常是 float[] / Vector<float>),供训练器使用。

  • .Append(ml.BinaryClassification.Trainers.SdcaLogisticRegression());
    在管道后追加二分类训练器(基于 SDCA 的逻辑回归)。训练器默认使用列名 Features 作为输入特征、列名 Label 作为标签(可通过参数修改)。

  • var model = pipeline.Fit(data);
    将整个管道在 data 上训练(Fit),返回一个 ITransformer(包括所有转换器和训练好的模型)。训练完成后可用此 model 执行预测、评估或保存到磁盘(ml.Model.Save)。

额外提示(简短):

  • 单次预测可用 ml.Model.CreatePredictionEngine<TSrc,TDest>(model)(非线程安全,生产建议用 PredictionEnginePool 或批量 Transform)。
  • 训练前可能还需做标量归一化、缺失值处理、类别编码等预处理,这些也放在管道里。