Introdução: C# no mundo do machine learning
O mundo do machine learning (ML) está fortemente associado ao Python: TensorFlow, PyTorch, scikit-learn — essas são as principais ferramentas de um data scientist. No entanto, o ecossistema .NET e a linguagem C# oferecem um caminho alternativo. A plataforma ML.NET da Microsoft permite integrar ML diretamente em aplicações de negócios em C#, sem reescrever o código em Python. Mas quão prático é isso? Neste artigo, vamos analisar as capacidades reais, as limitações e escrever código funcional em C# para machine learning.
No site pythonlib.ru, falamos frequentemente sobre Python, mas hoje vamos olhar para o problema de outra perspectiva. C# é uma linguagem fortemente tipada e de alto desempenho, e seu uso para ML pode ser justificado em ambientes corporativos onde já existe código legado em .NET.
Principais capacidades do ML.NET: o que o C# pode fazer?
ML.NET é uma biblioteca multiplataforma de código aberto. Ela suporta algoritmos clássicos: regressão, classificação, clusterização, bem como deep learning através da integração com TensorFlow e ONNX.
1. Classificação de texto (Sentiment Analysis)
O exemplo mais popular é a análise de sentimento. O ML.NET permite treinar um modelo em C# sem chamar scripts externos.
using Microsoft.ML;using Microsoft.ML.Data;
// 1. Definindo o esquema de dadospublic 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. Carregando os dados e treinando o 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. Fazendo uma prediçãovar predictionEngine = context.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);var result = predictionEngine.Predict(new SentimentData { Text = "C# is great for ML!" });Console.WriteLine($"Sentiment: {(result.Prediction ? "Positive" : "Negative")}");Este código é completamente autossuficiente. Você não precisa de Python, nem de requisições REST para serviços externos. Tudo funciona dentro de um único processo .NET.
2. Integração com TensorFlow e ONNX
Se você precisar de uma rede neural (por exemplo, para reconhecimento de imagens), o ML.NET pode carregar um modelo pré-treinado do TensorFlow ou ONNX e usá-lo para inferência.
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" });Uma observação importante: o treinamento de redes neurais complexas em C# ainda não é possível — para isso, você precisa usar Python. No entanto, carregar e usar um modelo pronto é um cenário 100% funcional.
Limitações do C# para ML: por que Python ainda é melhor?
Apesar de todas as vantagens, o C# perde para o Python em vários aspectos-chave.
1. Tamanho da comunidade e bibliotecas
O número de pacotes NuGet para ML é centenas de vezes menor do que no PyPI. Se você precisar de algo não convencional (por exemplo, um novo algoritmo de um artigo de 2024), provavelmente só existe em Python. O ML.NET é atualizado trimestralmente, enquanto scikit-learn e PyTorch são atualizados quase continuamente.
2. Treinamento de modelos (Training)
O ML.NET lida muito bem com tarefas em dados tabulares (regressão, classificação). Mas para