Introducción: C# en el Mundo del Machine Learning
El mundo del machine learning (ML) está fuertemente asociado con Python: TensorFlow, PyTorch, scikit-learn — estas son las herramientas principales de un científico de datos. Sin embargo, el ecosistema .NET y el lenguaje C# ofrecen un camino alternativo. La plataforma ML.NET de Microsoft permite integrar ML directamente en aplicaciones empresariales C# sin reescribir código en Python. Pero, ¿qué tan práctico es esto? En este artículo, examinaremos las capacidades reales, las limitaciones y escribiremos código C# funcional para machine learning.
En el sitio web pythonlib.ru, a menudo hablamos de Python, pero hoy veremos la tarea desde una perspectiva diferente. C# es un lenguaje fuertemente tipado y de alto rendimiento, y su uso para ML puede estar justificado en entornos corporativos donde ya existe código .NET heredado.
Capacidades Clave de ML.NET: ¿Qué Puede Hacer C#?
ML.NET es una biblioteca multiplataforma de código abierto. Soporta algoritmos clásicos: regresión, clasificación, agrupamiento, así como deep learning mediante integración con TensorFlow y ONNX.
1. Clasificación de Texto (Análisis de Sentimiento)
El ejemplo más popular es el análisis de sentimiento. ML.NET permite entrenar un modelo en C# sin llamar a scripts externos.
using Microsoft.ML;using Microsoft.ML.Data;
// 1. Definir esquema de datospublic 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. Cargar datos y entrenar el modelovar 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. Hacer una predicciónvar predictionEngine = context.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);var result = predictionEngine.Predict(new SentimentData { Text = "C# is great for ML!" });Console.WriteLine($"Sentimiento: {(result.Prediction ? "Positivo" : "Negativo")}");Este código es completamente autónomo. No necesitas Python, ni solicitudes REST a servicios externos. Todo funciona dentro de un solo proceso .NET.
2. Integración con TensorFlow y ONNX
Si necesitas una red neuronal (por ejemplo, para reconocimiento de imágenes), ML.NET puede cargar un modelo preentrenado de TensorFlow o ONNX y usarlo para inferencia.
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" });Un matiz importante: entrenar una red neuronal compleja en C# actualmente es imposible — necesitas usar Python para eso. Pero cargar y usar un modelo ya preparado es un escenario 100% funcional.
Limitaciones de C# para ML: ¿Por Qué Python Sigue Siendo Mejor?
A pesar de todas las ventajas, C# pierde frente a Python en varios aspectos clave.
1. Comunidad y Tamaño de las Bibliotecas
La cantidad de paquetes NuGet para ML es cientos de veces menor que en PyPI. Si necesitas algo no estándar (por ejemplo, un nuevo algoritmo de un artículo de 2024), lo más probable es que solo esté disponible en Python. ML.NET se actualiza una vez por trimestre, mientras que scikit-learn y PyTorch se actualizan casi continuamente.
2. Entrenamiento de Modelos
ML.NET maneja bien tareas con datos tabulares (regresión, clasificación). Pero para