Introdução: O C# Pode Competir com o Python em ML?
O mundo do aprendizado de máquina (ML) há muito tempo é associado exclusivamente ao Python. Uma vasta quantidade de bibliotecas (scikit-learn, PyTorch, TensorFlow), uma comunidade ativa e uma abundância de materiais educacionais tornaram o Python o líder indiscutível. No entanto, desenvolvedores que trabalham com C# e a plataforma .NET frequentemente se perguntam: posso usar uma ferramenta familiar para tarefas de ML? A resposta é sim, você pode, mas com algumas ressalvas.
Neste artigo, veremos quais ferramentas o ecossistema .NET oferece para aprendizado de máquina, quais são seus pontos fortes e onde o C# ainda fica atrás do Python. O artigo será útil tanto para desenvolvedores .NET que desejam entrar no mundo do ML quanto para cientistas de dados que consideram alternativas.
ML.NET: Biblioteca Nativa da Microsoft
A principal ferramenta para aprendizado de máquina em C# é o ML.NET. É uma biblioteca de código aberto e multiplataforma desenvolvida pela Microsoft especificamente para o ecossistema .NET. Ela permite incorporar modelos de ML diretamente em aplicações C# sem a necessidade de migrar para o Python.
Principais Recursos do ML.NET
- Treinamento e Inferência: O ML.NET suporta tanto o treinamento de modelos do zero quanto o carregamento de modelos pré-treinados.
- Tarefas Comuns: Classificação, regressão, agrupamento, ranqueamento, detecção de anomalias, análise de sentimento em texto.
- AutoML: Um mecanismo integrado para seleção automática do melhor algoritmo e hiperparâmetros (Aprendizado de Máquina Automatizado).
- Integração com ONNX: Suporte ao formato Open Neural Network Exchange (ONNX) para importar modelos do PyTorch ou TensorFlow.
Exemplo: Previsão de Preços (Regressão) com ML.NET
Vamos ver um exemplo simples de treinamento de um modelo para prever preços de imóveis com base na área. Primeiro, defina a classe de dados:
public class HousingData{ public float Size { get; set; } public float Price { get; set; }}
public class PricePrediction{ [ColumnName("Score")] public float Price { get; set; }}Agora, vamos escrever o código de treinamento:
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($"Preço previsto: {prediction.Price:F2}");Como você pode ver, a API é intuitiva para um desenvolvedor .NET. No entanto, é importante entender: o ML.NET não suporta aprendizado profundo (redes neurais) com tanta flexibilidade quanto o Keras ou o PyTorch.
TensorFlow.NET e a Pilha SciSharp
Para tarefas de aprendizado profundo em C#, existe o projeto TensorFlow.NET (TF.NET). Trata-se de uma vinculação .NET ao TensorFlow original, permitindo criar, treinar e executar redes neurais em C#. Juntamente com as bibliotecas SciSharp (Keras.NET, NumSharp, Pandas.NET), forma-se um análogo da pilha Python para .NET.
Exemplo: Rede Neural Simples com TensorFlow.NET
using Tensorflow;using static Tensorflow.Binding;using NumSharp;
// Criar um modelo Sequential simplesvar model = keras.Sequential();model.add(keras.layers.Dense(128, activation: "relu", input_shape: new Shape(784)));model.add(keras.layers.Dense(10, activation: "softmax"));
// Compilação do modelomodel.compile(optimizer: "adam", loss: "categorical_crossentropy", metrics: new[] { "accuracy" });
// Carregar dados MNIST (via NumSharp)var (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data();x