Машинное обучение на Java: обзор ключевых библиотек

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Машинное обучение на Java: библиотеки и инструменты

Хотя Python доминирует в сфере машинного обучения, Java остаётся востребованной платформой для создания промышленных ML-решений. Высокая производительность, строгая типизация, богатая экосистема для работы с большими данными (Hadoop, Spark) и широкое распространение в корпоративной среде делают Java отличным выбором для внедрения моделей машинного обучения в production. В этой статье мы рассмотрим ключевые библиотеки для машинного обучения на Java, их особенности и примеры использования.

1. Deeplearning4j (DL4J)

Deeplearning4j — самая популярная библиотека для глубокого обучения на Java. Она поддерживает нейронные сети различной архитектуры: сверточные (CNN), рекуррентные (RNN), LSTM, а также распределённое обучение на кластерах с Apache Spark и Hadoop.

Ключевые возможности:

  • Гибкий API для построения графов вычислений (ComputationGraph, MultiLayerNetwork)
  • Интеграция с Apache Spark для распределённого обучения
  • Поддержка GPU (CUDA) для ускорения вычислений
  • Импорт моделей из Keras и TensorFlow
  • Встроенные средства для загрузки и предобработки данных (DataVec)

Пример: простая нейронная сеть для классификации

import org.deeplearning4j.nn.conf.MultiLayerConfiguration;
import org.deeplearning4j.nn.conf.NeuralNetConfiguration;
import org.deeplearning4j.nn.conf.layers.DenseLayer;
import org.deeplearning4j.nn.conf.layers.OutputLayer;
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
import org.deeplearning4j.optimize.listeners.ScoreIterationListener;
import org.nd4j.linalg.activations.Activation;
import org.nd4j.linalg.dataset.DataSet;
import org.nd4j.linalg.factory.Nd4j;
import org.nd4j.linalg.lossfunctions.LossFunctions;

public class DL4JExample {
    public static void main(String[] args) {
        // Создание конфигурации сети
        MultiLayerConfiguration config = new NeuralNetConfiguration.Builder()
                .seed(123)
                .updater(new org.nd4j.linalg.learning.config.Adam())
                .list()
                .layer(0, new DenseLayer.Builder()
                        .nIn(2).nOut(10)
                        .activation(Activation.RELU)
                        .build())
                .layer(1, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)
                        .nIn(10).nOut(2)
                        .activation(Activation.SOFTMAX)
                        .build())
                .build();

        // Создание и обучение сети
        MultiLayerNetwork model = new MultiLayerNetwork(config);
        model.init();
        model.setListeners(new ScoreIterationListener(10));

        // Синтетические данные: 1000 примеров с 2 признаками
        DataSet data = new DataSet(
                Nd4j.rand(1000, 2),
                Nd4j.zeros(1000, 2).putColumn(0, Nd4j.rand(1000, 1).gt(0.5).castTo(org.nd4j.linalg.api.buffer.DataType.FLOAT))
        );

        for (int epoch = 0; epoch < 10; epoch++) {
            model.fit(data);
        }

        System.out.println("Обучение завершено!");
    }
}

2. Smile (Statistical Machine Intelligence & Learning Engine)

Smile — это быстрая и многофункциональная библиотека, охватывающая широкий спектр алгоритмов: от классической линейной регрессии до современных методов ансамблей и глубокого обучения. Особенность Smile — высокая производительность за счёт оптимизированных Java-реализаций и минимального количества зависимостей.

Ключевые возможности:

  • Алгоритмы классификации (SVM, Random Forest, KNN, Naive Bayes)
  • Кластеризация (K-Means, DBSCAN, GMM)
  • Снижение размерности (PCA, t-SNE, UMAP)
  • Работа с временными рядами и NLP
  • Визуализация (встроенная поддержка Swing и JavaFX)

Пример: классификация с использованием Random Forest

import smile.classification.RandomForest;
import smile.data.DataFrame;
import smile.data.type.DataTypes;
import smile.data.vector.DoubleVector;
import smile.data.vector.IntVector;
import smile.io.Read;

public class SmileExample {
    public static void main(String[] args) throws Exception {
        // Загрузка данных (пример: Iris dataset)
        DataFrame iris = Read.csv("iris.csv");
        // Разделение на признаки и метки
        double[][] features = iris.select("sepal_length", "sepal_width", "petal_length", "petal_width").toArray();
        int[] labels = iris.stringColumn("species").factorize().toIntArray();

        // Обучение Random Forest (100 деревьев)
        RandomForest model = RandomForest.fit(features, labels, 100);

        // Предсказание для нового образца
        double[] sample = {5.1, 3.5, 1.4, 0.2};                    

Рекомендаций