Machine Learning en Go (Golang): bibliotecas y herramientas para desarrollo
Aunque Python sigue siendo el lenguaje dominante en el mundo del machine learning (ML), Go (Golang) está ganando popularidad gracias a su rendimiento, facilidad de despliegue y excelente soporte para concurrencia. Go es ideal para crear servicios ML de alta carga, procesamiento por lotes de datos e integración de modelos en entornos de producción. En este artículo, exploraremos las bibliotecas clave para machine learning en Go, sus capacidades y ejemplos de uso.
¿Por qué Go para machine learning?
Go no pretende reemplazar a Python en la fase de investigación, pero ofrece ventajas únicas en la etapa de explotación de modelos:
- Rendimiento: Lenguaje compilado, cercano en velocidad a C/C++, sin sobrecarga de intérprete.
- Facilidad de despliegue: Un solo binario sin dependencias, ideal para microservicios y contenedores.
- Concurrencia integrada: Gorutinas y canales permiten procesar flujos de datos y entrenar modelos en paralelo de manera eficiente.
- Tipado estático: Menos errores en tiempo de ejecución, algo crítico para sistemas en producción.
1. Gorgonia — framework para deep learning
Gorgonia es el equivalente de TensorFlow y PyTorch en Go. Proporciona herramientas para construir y entrenar redes neuronales, incluyendo diferenciación automática, soporte para GPU (a través de CUDA) y optimización de grafos de computación.
package main
import ( "fmt" "gorgonia.org/gorgonia" "gorgonia.org/tensor")
func main() { g := gorgonia.NewGraph()
// Definimos los datos de entrada (matriz 2x3) x := gorgonia.NewMatrix(g, tensor.Float64, gorgonia.WithName("x"), gorgonia.WithShape(2, 3))
// Definimos los pesos (matriz 3x2) w := gorgonia.NewMatrix(g, tensor.Float64, gorgonia.WithName("w"), gorgonia.WithShape(3, 2))
// Operación de multiplicación de matrices a, _ := gorgonia.Mul(x, w)
// Aplicamos la sigmoide sigmoid := gorgonia.Must(gorgonia.Sigmoid(a))
// Creamos una VM para ejecutar el grafo machine := gorgonia.NewTapeMachine(g) defer machine.Close()
// Rellenamos con datos gorgonia.Let(x, tensor.New(tensor.WithBacking([]float64{1, 2, 3, 4, 5, 6}), tensor.WithShape(2, 3))) gorgonia.Let(w, tensor.New(tensor.WithBacking([]float64{0.1, 0.2, 0.3, 0.4, 0.5, 0.6}), tensor.WithShape(3, 2)))
// Ejecutamos el grafo if err := machine.RunAll(); err != nil { fmt.Println(err) return }
fmt.Println("Resultado de la sigmoide:", sigmoid.Value())}Cuándo usarlo: Para crear redes neuronales personalizadas, investigación y experimentos, cuando se necesita control total sobre el grafo de computación.
2. GoLearn — biblioteca de propósito general
GoLearn ofrece un amplio conjunto de algoritmos de machine learning: clasificación (kNN, Random Forest), regresión, clustering (k-means) y preprocesamiento de datos. Sigue los principios de scikit-learn, lo que la hace intuitiva para desarrolladores familiarizados con Python.
package main
import ( "fmt" "github.com/sjwhitworth/golearn/base" "github.com/sjwhitworth/golearn/knn" "github.com/sjwhitworth/golearn/evaluation")
func main() { // Cargamos los datos (CSV) rawData, err := base.ParseCSVToInstances("iris.csv", true) if err != nil { fmt.Println(err) return }
// Creamos un clasificador k-NN (k=3, distancia euclidiana) cls := knn.NewKnnClassifier("euclidean", 3)
// Dividimos en train/test (80/20) trainData, testData := base.InstancesTrainTestSplit(rawData, 0.20)
// Entrenamos el modelo cls.Fit(trainData)
// Predecimos predictions, err := cls.Predict(testData) if err != nil { fmt.Println(err)