JavaScript para aprendizaje automático: posibilidades y limitaciones en la práctica
\n\nMuchos desarrolladores están acostumbrados a pensar que el aprendizaje automático es prerrogativa de Python. De hecho, el ecosistema de Python con las bibliotecas TensorFlow, PyTorch y Scikit-learn domina en este ámbito. Sin embargo, JavaScript (especialmente en el entorno Node.js) también ofrece herramientas interesantes para ML. En este artículo, analizaremos qué se puede hacer con JavaScript, dónde están sus límites reales y cómo usar las bibliotecas disponibles en la práctica.
\n\n¿Por qué JavaScript para ML? Escenarios principales
\n\nLa principal ventaja de JavaScript es su versatilidad. Si su equipo ya escribe en JS y no tiene recursos para aprender Python, puede implementar modelos ML simples directamente en Node.js. Los escenarios de uso principales son:
\n\n- \n
- Aprendizaje automático en el navegador — ejecución de modelos directamente en el cliente (por ejemplo, TensorFlow.js en el navegador). Es ideal para tareas con datos confidenciales (medicina, finanzas). \n
- Soluciones de servidor — Node.js maneja bien predicciones simples, clasificación de texto o análisis de sentimiento. \n
- Prototipado y aprendizaje — para experimentos rápidos y demostración de conceptos. \n
- Integración con el ecosistema web — si su proyecto ya está en Node.js, no necesita levantar un microservicio Python separado. \n
Ejemplo práctico: clasificación de números con Brain.js
\n\nBrain.js es una de las bibliotecas más simples para redes neuronales en JavaScript. No requiere GPU y es ideal para entrenamiento en CPU. Veamos un ejemplo de reconocimiento de dígitos escritos a mano (versión simplificada de MNIST).
\n\nPrimero, instalamos la biblioteca:
\nnpm install brain.js\n\nAhora escribimos el código para entrenar una red neuronal que reconozca los dígitos 0 y 1 basándose en imágenes binarias de 4x4 píxeles:
\n\nconst brain = require('brain.js');\n\n// Creamos una red neuronal con una capa oculta\nconst net = new brain.NeuralNetwork({ hiddenLayers: [3] });\n\n// Datos de entrenamiento: 16 entradas (4x4), 1 salida (0 o 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] }, // otro 0\n { input: [0,0,0,0, 0,0,1,0, 0,1,1,0, 0,0,0,0], output: [1] } // otro 1\n];\n\n// Entrenamos la red\nnet.train(trainingData, {\n iterations: 2000,\n errorThresh: 0.005,\n log: true,\n logPeriod: 500\n});\n\n// Probamos\nconst testData = [0,0,0,0, 0,1,1,0, 0,1,1,0, 0,0,0,0]; // parece un 0\nconst result = net.run(testData);\nconsole.log(`Resultado: ${result[0] > 0.5 ? '1' : '0'} (confianza: ${result[0].toFixed(3)})`);\n\nEste ejemplo muestra lo rápido que se puede entrenar una red simple. Sin embargo, para el reconocimiento real de MNIST se necesitaría una arquitectura más profunda y miles de ejemplos.
\n\nTensorFlow.js: una herramienta potente para Node.js
\n\nTensorFlow.js es un puerto del popular framework a JavaScript. Admite tanto el navegador como Node.js. Aquí hay un ejemplo de regresión lineal para predecir precios de bienes raíces (simplificado):
\n\nconst tf = require('@tensorflow/tfjs-node');\n\n// Datos: área (m²) -> precio ($)\nconst xs = tf.tensor2d([50, 60, 70, 80, 90], [5, 1]);\nconst ys = tf.tensor2d([150000, 180000, 210000, 240000, 270000], [5, 1]);\n\n// Creamos el modelo\nconst model = tf.sequential();\nmodel.add(tf.layers.dense({ units: 1, inputShape: [1] }));\n\n// Compilamos\nmodel.compile({ optimizer: 'sgd', loss: 'meanSquaredError' });\n\n// Entrenamos\nasync function train() {\n await model.fit(xs, ys, { epochs: 100 });\n \n // Predicción para una casa de 75 m²\n const prediction = model.predict(tf.tensor2d([75], [1, 1]));\n prediction.print(); // ~225000\n}\n\ntrain();\n\nTensorFlow.js da acceso a la mayoría de