Introdução: Por que C# no aprendizado de máquina?
\nQuando se fala em aprendizado de máquina (ML), o primeiro que vem à mente é o Python com suas bibliotecas TensorFlow, PyTorch e scikit-learn. No entanto, o ecossistema .NET não está parado. C# é uma linguagem poderosa e tipada, amplamente utilizada no desenvolvimento corporativo, e muitas empresas se perguntam: é possível usá-la para tarefas de ML?
\nNeste artigo, analisaremos na prática como o C# lida com aprendizado de máquina, quais são seus pontos fortes e onde ele perde para o Python. Você aprenderá como treinar um modelo simples em C# usando ML.NET e se vale a pena migrar seus projetos de ML para .NET.
\n\nML.NET: a principal ferramenta C# para ML
\nA Microsoft desenvolveu o framework ML.NET — uma biblioteca de código aberto e multiplataforma para aprendizado de máquina, totalmente integrada ao ecossistema .NET. O ML.NET permite resolver problemas de classificação, regressão, clusterização, ranqueamento, além de trabalhar com imagens e texto.
\n\nExemplo: previsão do preço de uma casa
\nVamos ver como é o código real em C# para uma tarefa de regressão. Suponha que temos um arquivo CSV com dados sobre casas (área, número de cômodos, idade e preço).
\nusing Microsoft.ML;\nusing Microsoft.ML.Data;\n\n// 1. Definindo as classes de dados\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; } // Variável alvo\n}\n\npublic class HousePrediction\n{\n [ColumnName("Score")]\n public float PredictedPrice { get; set; }\n}\n\n// 2. Carregando dados e treinando\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. Usando o 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($"Preço previsto: {result.PredictedPrice:F2}");\nComo você pode ver, o código é legível, conciso e não requer dependências complexas. O ML.NET lida automaticamente com normalização, codificação de atributos categóricos e validação cruzada.
\n\nPrincipais capacidades do C# em ML
\n- \n
- Desempenho: C# é compilado para código nativo (via JIT ou AOT), proporcionando ganho de velocidade em comparação com o Python interpretado. Para cargas de produção, isso pode ser crítico. \n
- Integração com o ecossistema .NET: Você pode facilmente incorporar um modelo de ML em uma aplicação web ASP.NET Core, aplicação desktop WPF ou microsserviço. Não é necessário levantar um servidor ML separado em Python. \n
- Segurança de tipos: Erros relacionados a tipos de dados são detectados em tempo de compilação, e não em tempo de execução como no Python. \n
- Suporte a ONNX: O ML.NET pode carregar modelos no formato ONNX, permitindo o uso de redes neurais treinadas em PyTorch ou TensorFlow. \n
- AutoML: Ferramenta embutida para seleção automática de algoritmos e hiperparâmetros (classe
AutoMLExperiment). \n
Limitações do C# para aprendizado de máquina
\nApesar das vantagens, o C# ainda não consegue competir com o Python em várias áreas. Vamos analisar as principais limitações.
\n\n1. Seleção limitada de bibliotecas
\nO Python possui dezenas de bibliotecas maduras para ML: TensorFlow, PyTorch, JAX, scikit-learn, XGBoost, LightGBM. No .NET, a escolha é mais modesta. O ML.NET é o framework principal, e para aprendizado profundo existem TensorFlow.NET e SciSharp, mas eles