C# 用于机器学习:能力与局限

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么在机器学习领域使用C#?

机器学习(ML)领域通常与Python、R和Julia紧密相关。然而,使用C#和.NET平台的开发者常常会问:能否用熟悉的语言来构建智能系统?答案是肯定的,但需要留意一些限制。C#并非数据科学的主流选择,但.NET生态提供了强大的工具,例如ML.NET、TensorFlow.NET,以及对ONNX的支持。本文将探讨C#在机器学习方面提供了哪些能力,在哪些场景下使用它是合理的,以及在哪些情况下使用Python会更合适。



C#在机器学习中的能力

1. ML.NET —— 微软原生框架

ML.NET 是一个跨平台的开源机器学习框架,专为.NET生态打造。它允许你将ML模型嵌入C#和F#应用程序中,而无需学习Python。ML.NET支持:

  • 分类与回归(例如情感分析、价格预测)。
  • 聚类与排序。
  • 推荐系统与异常检测。
  • 图像处理(通过与TensorFlow集成)。

训练文本情感分类模型的简单示例:

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; }}

var context = new MLContext();var data = context.Data.LoadFromTextFile<SentimentData>("data.csv", separatorChar: ',');var pipeline = context.Transforms.Text.FeaturizeText("Features", "Text") .Append(context.BinaryClassification.Trainers.SdcaLogisticRegression());var model = pipeline.Fit(data);var predictionEngine = context.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);var prediction = predictionEngine.Predict(new SentimentData { Text = "Это отличный продукт!" });Console.WriteLine(prediction.PredictedLabel); // True (положительная тональность)

ML.NET非常适合将ML集成到企业级.NET应用程序中,例如CRM、ERP或基于ASP.NET Core的Web服务。



2. 与TensorFlow和ONNX的集成

C#可以通过TensorFlow和ONNX格式使用来自Python世界的预训练模型。这允许直接在.NET应用程序中使用强大的神经网络(例如ResNet、BERT)。

加载用于图像识别的ONNX模型示例:

using Microsoft.ML.OnnxRuntime;using Microsoft.ML.OnnxRuntime.Tensors;

var session = new InferenceSession("model.onnx");var input = new DenseTensor<float>(new float[1 * 3 * 224 * 224], new[] { 1, 3, 224, 224 });var inputs = new List<NamedOnnxValue>{ NamedOnnxValue.CreateFromTensor("input", input)};using var results = session.Run(inputs);var output = results.First().AsTensor<float>();Console.WriteLine($"Predicted class index: {output.ArgMax()}");

因此,你可以在Python中训练模型,然后在生产环境中用C#进行部署。



3. 性能与类型安全

C#是一种编译型语言,支持JIT编译(或通过Native AOT实现预先编译)。它提供了:

  • 高性能——在推理速度至关重要的任务中(例如实时系统)。
  • 强类型——运行时错误更少,这对于企业级ML解决方案至关重要。
  • 异步与多线程——对async/await和任务并行库(TPL)的内置支持,用于处理大量数据。


4. Visual Studio中的数据科学工具

C#可用的工具包括:

博客

书籍推荐