Машинное обучение на Go: обзор библиотек для Golang
Хотя Python остаётся королём машинного обучения, Go (Golang) всё чаще используется для production-систем, микросервисов и высоконагруженных приложений, где важны скорость, параллелизм и простота развёртывания. В этой статье мы разберём ключевые библиотеки для машинного обучения на Go, их возможности, примеры кода и сценарии использования.
Почему Go для ML?
Go не пытается заменить Python в исследовательской работе. Его сильные стороны — интеграция с инфраструктурой, низкое потребление памяти, встроенная поддержка конкурентности (goroutines) и компиляция в один бинарник. Это идеальный выбор для:
- Сервисов предсказаний (inference) на базе обученных моделей
- Обработки потоковых данных в реальном времени
- Сборки пайплайнов данных с высокой пропускной способностью
1. Gorgonia — фреймворк для нейронных сетей
Gorgonia — аналог TensorFlow и PyTorch на Go. Позволяет создавать и обучать нейронные сети с автоматическим дифференцированием.
Установка:
go get gorgonia.org/gorgonia
Пример: простая логистическая регрессия
package main
import (
"fmt"
"gorgonia.org/gorgonia"
"gorgonia.org/tensor"
)
func main() {
g := gorgonia.NewGraph()
// Входные данные (матрица 4x2)
x := gorgonia.NewMatrix(g, tensor.Float64, gorgonia.WithShape(4, 2), gorgonia.WithName("x"))
// Веса
w := gorgonia.NewMatrix(g, tensor.Float64, gorgonia.WithShape(2, 1), gorgonia.WithName("w"))
// Смещение
b := gorgonia.NewScalar(g, tensor.Float64, gorgonia.WithName("b"))
// Линейный слой: y = x*w + b
xw, _ := gorgonia.Mul(x, w)
y, _ := gorgonia.Add(xw, b)
// Функция активации (сигмоида)
activated, _ := gorgonia.Sigmoid(y)
machine := gorgonia.NewTapeMachine(g)
// Заполнение данных
gorgonia.Let(x, tensor.New(tensor.WithBacking([]float64{1,2,3,4,5,6,7,8}), tensor.WithShape(4,2)))
gorgonia.Let(w, tensor.New(tensor.WithBacking([]float64{0.5, -0.2}), tensor.WithShape(2,1)))
gorgonia.Let(b, 0.1)
if err := machine.RunAll(); err != nil {
fmt.Println(err)
}
fmt.Printf("Результат: %v\n", activated.Value())
}
2. GoLearn — классические алгоритмы ML
GoLearn (golearn) — библиотека с реализацией KNN, деревьев решений, случайного леса, линейной регрессии и кластеризации. API напоминает sklearn.
Установка:
go get -u github.com/sjwhitworth/golearn
Пример: K-ближайших соседей (KNN)
package main
import (
"fmt"
"github.com/sjwhitworth/golearn/base"
"github.com/sjwhitworth/golearn/evaluation"
"github.com/sjwhitworth/golearn/knn"
)
func main() {
// Загрузка данных (CSV)
rawData, err := base.ParseCSVToInstances("iris.csv", true)
if err != nil {
panic(err)
}
// Создание KNN с k=3 и евклидовой метрикой
cls := knn.NewKnnClassifier("euclidean", 3)
// Разделение на train/test
trainData, testData := base.InstancesTrainTestSplit(rawData, 0.67)
// Обучение
cls.Fit(trainData)
// Предсказание
predictions, err := cls.Predict(testData)
if err != nil {
panic(err)
}
// Оценка точности
accuracy, err := evaluation.GetAccuracy(testData, predictions)
fmt.Printf("Точность: %.2f%%\n", accuracy*100)
}
3. Goml — лёгкие модели для быстрой интеграции
Goml предоставляет простые реализации линейной и логистической регрессии, наивного Байеса и нейронных сетей с минимальным кодом.
package main
import (
"fmt"
"github.com/cdipaolo/goml/base"
"github.com/cdipaolo/goml/text"
)
func main() {
// Данные для классификации текста
X := [][]float64{
{1, 0, 1, 0},
{0, 1, 0, 1},
{1, 1, 0, 0},
}
Y := []float64{0,