C# 机器学习:.NET 功能与局限概述

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

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

开始课程

介绍:C#在机器学习领域能与Python匹敌吗?

机器学习(ML)世界长期以来几乎被Python独占。海量的库(scikit-learn、PyTorch、TensorFlow)、活跃的社区以及丰富的学习资源使Python成为无可争议的领导者。然而,使用C#和.NET平台的开发者常常会思考:能否用熟悉的工具来处理机器学习任务?答案是肯定的,但存在某些限制条件。

本文将探讨.NET生态系统为机器学习提供了哪些工具、它们的优势所在,以及C#在哪些方面仍落后于Python。本文既适用于希望进入ML领域的.NET开发者,也适用于正在考虑其他方案的AI数据科学家。



ML.NET:微软原生库

C#进行机器学习的核心工具是ML.NET。这是一个由微软为.NET生态系统开发的开源跨平台库,允许直接在C#应用中嵌入机器学习模型,无需转向Python。



ML.NET的主要特性

  • 训练与推理:ML.NET支持从零开始训练模型以及加载预训练模型。
  • 常见任务:分类、回归、聚类、排序、异常检测、文本情感分析。
  • 自动化机器学习(AutoML):内置自动选择最优算法和超参数的机制。
  • ONNX集成:支持开放神经网络交换格式,可导入PyTorch或TensorFlow模型。


示例:用ML.NET预测房价(回归)

来看一个简单的例子——根据面积预测房价。首先定义数据类:

public class HousingData{    public float Size { get; set; }    public float Price { get; set; }}

public class PricePrediction{ [ColumnName("Score")] public float Price { get; set; }}

接下来编写训练代码:

using Microsoft.ML;

var context = new MLContext();var data = context.Data.LoadFromTextFile<HousingData>("housing.csv", separatorChar: ',');

var pipeline = context.Transforms.Concatenate("Features", new[] { "Size" }) .Append(context.Regression.Trainers.Sdca(labelColumnName: "Price"));

var model = pipeline.Fit(data);

var predictionEngine = context.Model.CreatePredictionEngine<HousingData, PricePrediction>(model);var prediction = predictionEngine.Predict(new HousingData { Size = 75f });

Console.WriteLine($"Predicted price: {prediction.Price:F2}");

如你所见,这个API对.NET开发者来说非常直观。但需要明确的是:ML.NET在深度学习(神经网络)方面不如Keras或PyTorch灵活。



TensorFlow.NET与SciSharp技术栈

针对C#的深度学习任务,有一个TensorFlow.NET项目(TF.NET)。这是原始TensorFlow的.NET绑定,允许用C#创建、训练和运行神经网络。与SciSharp库(Keras.NET、NumSharp、Pandas.NET)结合使用,就能在.NET环境中构建类似Python的技术栈。



示例:用TensorFlow.NET构建简单神经网络

using Tensorflow;using static Tensorflow.Binding;using NumSharp;

// 创建简单的Sequential模型var model = keras.Sequential();model.add(keras.layers.Dense(128, activation: "relu", input_shape: new Shape(784)));model.add(keras.layers.Dense(10, activation: "softmax"));

// 编译模型compile(options: optimizer: "adam", loss: "categorical_crossentropy", metrics: new[] { "accuracy" });

// 加载MNIST数据(通过NumSharp)var (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data();x

博客

书籍推荐