介绍:机器学习世界中的 C#
机器学习(ML)世界与 Python 紧密相关:TensorFlow、PyTorch、scikit-learn——这些都是数据科学家(data scientist)的基本工具。然而,.NET 生态系统和 C# 语言提供了一条替代路径。微软的 ML.NET 平台允许将 ML 直接集成到 C# 业务应用程序中,而无需将代码重写为 Python。但这有多实用呢?在本文中,我们将分析实际能力、限制,并用 C# 编写可运行的机器学习代码。
ML.NET 的关键能力:C# 能做什么?
ML.NET 是一个跨平台的开源库。它支持经典算法:回归、分类、聚类,以及通过集成 TensorFlow 和 ONNX 实现深度学习。
1. 文本分类(情感分析 Sentiment Analysis)
最流行的例子是情感分析。ML.NET 允许在 C# 中训练模型,而无需调用外部脚本。
using Microsoft.ML;using Microsoft.ML.Data;
// 1. 定义数据模式public class SentimentData{ public string Text { get; set; } public bool Label { get; set; }}
public class SentimentPrediction{ [ColumnName("PredictedLabel")] public bool Prediction { get; set; } public float Probability { get; set; }}
// 2. 加载数据并训练模型var context = new MLContext();IDataView data = context.Data.LoadFromTextFile<SentimentData>("data.tsv", separatorChar: '\\t');
var pipeline = context.Transforms.Text.FeaturizeText("Features", nameof(SentimentData.Text)) .Append(context.BinaryClassification.Trainers.SdcaLogisticRegression());
var model = pipeline.Fit(data);
// 3. 进行预测var predictionEngine = context.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);var result = predictionEngine.Predict(new SentimentData { Text = "C# is great for ML!" });Console.WriteLine($"Sentiment: {(result.Prediction ? "Positive" : "Negative")}");这段代码完全自包含。你不需要 Python,不需要对外部服务的 REST 请求。一切都在一个 .NET 进程内运行。
2. 与 TensorFlow 和 ONNX 集成
如果你需要神经网络(例如,用于图像识别),ML.NET 可以加载预训练的 TensorFlow 或 ONNX 模型,并将其用于推理(inference)。
var pipeline = context.Transforms.LoadImages("Image", folder, "ImagePath") .Append(context.Transforms.ResizeImages("Image", 224, 224)) .Append(context.Transforms.ExtractPixels("Input", "Image")) .Append(modelTensorFlow);
var prediction = pipeline.Fit(data).CreatePredictionEngine<ImageData, ImagePrediction>(data);var result = prediction.Predict(new ImageData { ImagePath = "cat.jpg" });一个重要细节:在 C# 中训练复杂的神经网络目前还不可能——为此需要使用 Python。但加载和使用现成模型是 100% 可行的方案。
C# 用于 ML 的局限性:为什么 Python 仍然更好?
尽管有诸多优点,C# 在几个关键方面不如 Python。
1. 社区和库的规模
用于 ML 的 NuGet 包数量比 PyPI 少数百倍。如果你需要一些非常规的东西(例如,2024 年论文中的新算法),很可能只有 Python 才有。ML.NET 每季度更新一次,而 scikit-learn 和 PyTorch 几乎是持续更新。
2. 模型训练(Training)
ML.NET 在处理表格数据任务(回归、分类)方面表现出色。但对于