C# para aprendizaje automático: revisión de capacidades y limitaciones de .NET

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿Puede C# competir con Python en ML?

El mundo del machine learning (ML) se ha asociado durante mucho tiempo exclusivamente con Python. La enorme cantidad de bibliotecas (scikit-learn, PyTorch, TensorFlow), una comunidad activa y la abundancia de materiales educativos han convertido a Python en el líder indiscutible. Sin embargo, los desarrolladores de C# y la plataforma .NET a menudo se preguntan: ¿se puede usar la herramienta habitual para tareas de ML? La respuesta es sí, se puede, pero con ciertas salvedades.

En este artículo, analizaremos qué herramientas proporciona el ecosistema .NET para machine learning, cuáles son sus fortalezas y dónde C# todavía está por detrás de Python. El artículo será útil tanto para desarrolladores .NET que deseen ingresar al mundo del ML, como para científicos de datos que busquen alternativas.



ML.NET: la biblioteca nativa de Microsoft

La principal herramienta para machine learning en C# es ML.NET. Es una biblioteca multiplataforma, open-source, desarrollada por Microsoft específicamente para el ecosistema .NET. Permite integrar modelos de ML directamente en aplicaciones de C# sin necesidad de cambiar a Python.



Características clave de ML.NET

  • Entrenamiento e inferencia: ML.NET admite tanto el entrenamiento de modelos "desde cero" como la carga de modelos preentrenados.
  • Tareas típicas: Clasificación, regresión, agrupamiento, ranking, detección de anomalías, análisis de sentimiento de texto.
  • AutoML: Mecanismo integrado para la selección automática del mejor algoritmo e hiperparámetros (Automated Machine Learning).
  • Integración con ONNX: Soporte para el formato Open Neural Network Exchange (ONNX) para importar modelos de PyTorch o TensorFlow.


Ejemplo: predicción de precio (regresión) con ML.NET

Consideremos un ejemplo simple de entrenamiento de un modelo para predecir el costo de una vivienda basado en el área. Primero, definimos la clase de datos:

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

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

Ahora escribimos el código de entrenamiento:

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($"Precio predicho: {prediction.Price:F2}");

Como puede ver, la API es intuitiva para un desarrollador .NET. Sin embargo, es importante entender: ML.NET no admite deep learning (redes neuronales) con tanta flexibilidad como Keras o PyTorch.



TensorFlow.NET y SciSharp Stack

Para tareas de deep learning en C#, existe el proyecto TensorFlow.NET (TF.NET). Es un binding de .NET al TensorFlow original, que permite crear, entrenar y ejecutar redes neuronales en C#. Junto con las bibliotecas SciSharp (Keras.NET, NumSharp, Pandas.NET), forma un análogo del stack de Python para .NET.



Ejemplo: red neuronal simple con TensorFlow.NET

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

// Creamos un modelo Sequential simplevar model = keras.Sequential();model.add(keras.layers.Dense(128, activation: "relu", input_shape: new Shape(784)));model.add(keras.layers.Dense(10, activation: "softmax"));

// Compilaciónmodel.compile(optimizer: "adam", loss: "categorical_crossentropy", metrics: new[] { "accuracy" });

// Carga de datos MNIST (a través de NumSharp)var (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data();x

Blogs

Book Recommendations