JavaScript para aprendizado de máquina: possibilidades e limitações na prática
\n\nMuitos desenvolvedores estão acostumados a pensar que aprendizado de máquina é prerrogativa do Python. De fato, o ecossistema Python com as bibliotecas TensorFlow, PyTorch e Scikit-learn domina esta área. No entanto, JavaScript (especialmente no ambiente Node.js) também oferece ferramentas interessantes para ML. Neste artigo, vamos explorar o que pode ser feito com JavaScript, onde estão seus limites reais e como usar as bibliotecas disponíveis na prática.
\n\nPor que JavaScript para ML? Cenários principais
\n\nA principal vantagem do JavaScript é a versatilidade. Se sua equipe já programa em JS e você não tem recursos para aprender Python, é possível implementar modelos simples de ML diretamente no Node.js. Os principais cenários de uso são:
\n\n- \n
- Aprendizado de máquina no navegador — execução de modelos diretamente no cliente (por exemplo, TensorFlow.js no navegador). Ideal para tarefas com dados confidenciais (medicina, finanças). \n
- Soluções no servidor — Node.js lida bem com previsões simples, classificação de texto ou análise de sentimento. \n
- Prototipagem e aprendizado — para experimentos rápidos e demonstração de conceitos. \n
- Integração com o ecossistema web — se seu projeto já está em Node.js, não é necessário criar um microsserviço Python separado. \n
Exemplo prático: classificação de números com Brain.js
\n\nBrain.js é uma das bibliotecas mais simples para redes neurais em JavaScript. Ela não requer GPU e é ideal para treinamento em CPU. Vamos ver um exemplo de reconhecimento de dígitos manuscritos (versão simplificada do MNIST).
\n\nPrimeiro, instale a biblioteca:
\nnpm install brain.js\n\nAgora, escreva o código para treinar a rede neural a reconhecer os dígitos 0 e 1 com base em imagens binárias de 4x4 pixels:
\n\nconst brain = require('brain.js');\n\n// Criando uma rede neural com uma camada oculta\nconst net = new brain.NeuralNetwork({ hiddenLayers: [3] });\n\n// Dados de treinamento: 16 entradas (4x4), 1 saída (0 ou 1)\nconst trainingData = [\n { input: [0,0,0,0, 0,1,1,0, 0,1,1,0, 0,0,0,0], output: [0] }, // dígito 0\n { input: [0,0,0,0, 0,0,1,0, 0,0,1,0, 0,0,0,0], output: [1] }, // dígito 1\n { input: [0,0,0,0, 1,1,1,0, 0,1,1,0, 0,0,0,0], output: [0] }, // outro 0\n { input: [0,0,0,0, 0,0,1,0, 0,1,1,0, 0,0,0,0], output: [1] } // outro 1\n];\n\n// Treinando a rede\nnet.train(trainingData, {\n iterations: 2000,\n errorThresh: 0.005,\n log: true,\n logPeriod: 500\n});\n\n// Testando\nconst testData = [0,0,0,0, 0,1,1,0, 0,1,1,0, 0,0,0,0]; // parece 0\nconst result = net.run(testData);\nconsole.log(`Resultado: ${result[0] > 0.5 ? '1' : '0'} (confiança: ${result[0].toFixed(3)})`);\n\nEste exemplo mostra como é rápido treinar uma rede simples. No entanto, para reconhecimento real do MNIST, seria necessária uma arquitetura mais profunda e milhares de exemplos.
\n\nTensorFlow.js: uma ferramenta poderosa para Node.js
\n\nTensorFlow.js é uma versão do popular framework para JavaScript. Ele suporta tanto o navegador quanto o Node.js. Aqui está um exemplo de regressão linear para prever preços de imóveis (simplificado):
\n\nconst tf = require('@tensorflow/tfjs-node');\n\n// Dados: área (m²) -> preço ($)\nconst xs = tf.tensor2d([50, 60, 70, 80, 90], [5, 1]);\nconst ys = tf.tensor2d([150000, 180000, 210000, 240000, 270000], [5, 1]);\n\n// Criando o modelo\nconst model = tf.sequential();\nmodel.add(tf.layers.dense({ units: 1, inputShape: [1] }));\n\n// Compilando\nmodel.compile({ optimizer: 'sgd', loss: 'meanSquaredError' });\n\n// Treinando\nasync function train() {\n await model.fit(xs, ys, { epochs: 100 });\n \n // Previsão para uma casa de 75 m²\n const prediction = model.predict(tf.tensor2d([75], [1, 1]));\n prediction.print(); // ~225000\n}\n\ntrain();\n\nTensorFlow.js dá acesso à maioria