C# (.NET) 机器学习:面向开发者的库概览
尽管 Python 仍然是机器学习的王者,但 .NET 生态系统为将 ML 模型集成到企业应用、Web 服务和桌面解决方案中提供了成熟且强大的工具。在本文中,我们将介绍 C# 的三个关键库:ML.NET、Accord.NET 和 TensorFlow.NET。您将了解如何根据任务选择合适的库,并看到代码示例。
1. ML.NET — 微软的原生库
ML.NET 是一个跨平台的开源库,专为 .NET 开发。它允许您在不切换到 Python 的情况下创建、训练和部署机器学习模型。支持分类、回归、聚类、排序、异常检测甚至推荐系统。
主要功能:
- 内置数据转换器(归一化、独热编码、从文本和图像中提取特征)。
- AutoML — 自动选择算法和超参数。
- 将模型导出为 ONNX 格式,用于跨平台使用。
- 通过 TensorFlow 和 ONNX Runtime 支持 GPU。
示例:文本情感二分类
using Microsoft.ML;using Microsoft.ML.Data;
public class SentimentData{ public string Text { get; set; } public bool Label { get; set; }}
public class SentimentPrediction{ public bool PredictedLabel { get; set; } public float Probability { get; set; }}
var context = new MLContext();var data = context.Data.LoadFromTextFile<SentimentData>("data.csv", separatorChar: ',');
var pipeline = context.Transforms.Text.FeaturizeText("Features", nameof(SentimentData.Text)) .Append(context.BinaryClassification.Trainers.SdcaLogisticRegression());
var model = pipeline.Fit(data);var engine = context.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);
var prediction = engine.Predict(new SentimentData { Text = "This product is amazing!" });Console.WriteLine($"Prediction: {prediction.PredictedLabel}, Probability: {prediction.Probability}");何时使用: 如果您的应用已经基于 .NET,并且您需要无需外部依赖即可无缝集成 ML。
2. Accord.NET — 经典的科学计算库
Accord.NET 是一组用于信号处理、统计和机器学习的框架。它包含 50 多种算法:从线性回归到深度神经网络。该库在 ML.NET 出现之前被广泛使用,并且对于需要精细调整的任务仍然很受欢迎。
主要功能:
- 灵活的模型:SVM、随机森林、K-Means、隐马尔可夫模型。
- 内置图像和音频处理方法(滤波器、边缘检测器、FFT)。
- 支持核方法和概率模型。
- 与 Math.NET Numerics 集成,用于高级数学运算。
示例:使用 SVM 对鸢尾花进行分类
using Accord.MachineLearning.VectorMachines;using Accord.MachineLearning.VectorMachines.Learning;using Accord.Statistics.Kernels;
// 加载数据(经典鸢尾花数据集)double[][] inputs = // ... 特征矩阵(4列)int[] outputs = // ... 类别标签(0,1,2)
var teacher = new MulticlassSupportVectorLearning<Gaussian>(){ Learner = (param) => new SequentialMinimalOptimization<Gaussian>() { Complexity = 100, Tolerance = 1e-5 }};
var machine = teacher.Learn(inputs, outputs);int[] predicted = machine.Decide(inputs);
double error = new ZeroOneLoss(outputs).Loss(predicted);Console.WriteLine($"错误率: {error:P}");何时使