Introducción: ¿Por qué C# en el aprendizaje automático?
\nCuando se habla de aprendizaje automático (ML), lo primero que viene a la mente es Python con sus bibliotecas TensorFlow, PyTorch y scikit-learn. Sin embargo, el ecosistema .NET no se queda quieto. C# es un lenguaje potente y tipificado que se utiliza activamente en el desarrollo empresarial, y muchas empresas se preguntan: ¿se puede usar para tareas de ML?
\nEn este artículo analizaremos en la práctica cómo C# maneja el aprendizaje automático, cuáles son sus puntos fuertes y dónde se queda atrás respecto a Python. Aprenderá cómo entrenar un modelo simple en C# con ML.NET y si vale la pena migrar sus proyectos de ML a .NET.
\n\nML.NET: la herramienta principal de C# para ML
\nMicrosoft desarrolló el framework ML.NET: una biblioteca de aprendizaje automático de código abierto y multiplataforma que se integra completamente en el ecosistema .NET. ML.NET permite resolver tareas de clasificación, regresión, agrupamiento, ranking, así como trabajar con imágenes y texto.
\n\nEjemplo: predicción del precio de una casa
\nVeamos cómo se ve el código real en C# para una tarea de regresión. Supongamos que tenemos un archivo CSV con datos de casas (área, número de habitaciones, antigüedad y precio).
\nusing Microsoft.ML;\nusing Microsoft.ML.Data;\n\n// 1. Definimos las clases de datos\npublic class HouseData\n{\n public float Square { get; set; }\n public float Rooms { get; set; }\n public float Age { get; set; }\n public float Price { get; set; } // Variable objetivo\n}\n\npublic class HousePrediction\n{\n [ColumnName("Score")]\n public float PredictedPrice { get; set; }\n}\n\n// 2. Carga de datos y entrenamiento\nvar context = new MLContext();\nIDataView data = context.Data.LoadFromTextFile<HouseData>("house_data.csv", separatorChar: ',');\n\nvar pipeline = context.Transforms.Concatenate("Features", "Square", "Rooms", "Age")\n .Append(context.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));\n\nvar model = pipeline.Fit(data);\n\n// 3. Uso del modelo\nvar sampleData = new HouseData { Square = 120, Rooms = 3, Age = 10 };\nvar predictionEngine = context.Model.CreatePredictionEngine<HouseData, HousePrediction>(model);\nvar result = predictionEngine.Predict(sampleData);\n\nConsole.WriteLine($"Precio predicho: {result.PredictedPrice:F2}");\nComo puede ver, el código es legible, conciso y no requiere dependencias complejas. ML.NET maneja automáticamente la normalización, la codificación de características categóricas y la validación cruzada.
\n\nCapacidades clave de C# en ML
\n- \n
- Rendimiento: C# se compila a código máquina (a través de JIT o AOT), lo que proporciona un aumento de velocidad en comparación con Python interpretado. Para cargas de producción, esto puede ser crítico. \n
- Integración con el ecosistema .NET: Puede integrar fácilmente un modelo de ML en una aplicación web ASP.NET Core, una aplicación de escritorio WPF o un microservicio. No es necesario levantar un servidor ML separado en Python. \n
- Seguridad de tipos: Los errores relacionados con tipos de datos se detectan en tiempo de compilación, no en tiempo de ejecución como en Python. \n
- Soporte para ONNX: ML.NET puede cargar modelos en formato ONNX, lo que permite usar redes neuronales entrenadas en PyTorch o TensorFlow. \n
- AutoML: Herramienta integrada para la selección automática de algoritmos e hiperparámetros (clase
AutoMLExperiment). \n
Limitaciones de C# para el aprendizaje automático
\nA pesar de sus ventajas, C# todavía no puede competir con Python en varias áreas. Consideremos las principales limitaciones.
\n\n1. Selección limitada de bibliotecas
\nPython tiene docenas de bibliotecas maduras para ML: TensorFlow, PyTorch, JAX, scikit-learn, XGBoost, LightGBM. En .NET la selección es más modesta. ML.NET es el framework principal, y para aprendizaje profundo existen TensorFlow.NET y SciSharp, pero están