Machine Learning mit Java

Warum sich Java und KI nicht ausschließen

Einleitung

KI und Java – geht das?

  • Machine Learning (ML) wird sehr häufig mit Python durchgeführt

  • (Java)-Backends können "KI"-Funktionalitäten bereitstellen. Bsp: ChatGPT

  • Wie?

    • Training in Java

    • Importierung eines Models

Warum (kein) Java?

✅ Pro❌ Kontra

Große Anzahl stabiler Bibliotheken (z. B. Deeplearning4j, Weka, Tribuo)

Weniger Ressourcen & Community-Beiträge im Vergleich zu Python

Einfach in bestehende Java-Backends integrierbar

Weniger Beispiele & Tutorials verfügbar

Gute Performance und Skalierbarkeit

Entwicklung ist teils aufwendiger als in Python

ChatGPT ist keine Hilfe

Der Iris Datensatz

Species

Iris Species

Sepal und Petal

Sepal und Petal

CSV

CSV Sample

Decision Tree

Baumstruktur

Decision Tree Struktur

Splits

Decision Tree Split

Gute und schlechte Splits

Guter vs. schlechte Split

Umsetzung

Smile-Library für Java

Architektur

Quarkus Architektur

Repository - Overview

@ApplicationScoped
public class DecisionTreeRepository {
    private DecisionTree model;

    private Map<String, Integer> speciesMap = new HashMap<>();

    public void setSpeciesMap(Map<String, Integer> map) {
        this.speciesMap = map;
    }

    public String getSpeciesLabel(int code) {
        // Reverse lookup (inefficient for large maps, but fine here)
        return speciesMap.entrySet()
                .stream()
                .filter(entry -> entry.getValue() == code)
                .map(Map.Entry::getKey)
                .findFirst()
                .orElse("Unknown");
    }

    public void train(List<Iris> irisList) {
        Formula formula = Formula.lhs("species");
        DataFrame data = DataFrame.of(Iris.class, irisList);

        // Hyperparameters can be set here
        DecisionTree.Options options = new DecisionTree.Options();

        model = DecisionTree.fit(formula, data, options);
    }

    public int[] predict(DataFrame input) {
        if (model == null) {
            throw new IllegalStateException("Model is not trained yet.");
        }
        return model.predict(input);
    }
}

Live-Demo

Random Forest

Theorie

Random Forest Illustration

Mehrere Decision Trees ⇒ Random Forest

Umsetzung

Decision Tree als Basis und folgende einfache Anpassung:

//Austauschen
private DecisionTree model; // von
private RandomForest model; // durch

Live Demo

Neural Network

Implementierung mit DeepLearning4J

Aufbau

Neuronales Netzwerk Illustration

Klassifizierung

Klassifizierung mit NN

Umsetzung

    private MultiLayerConfiguration getModelConfiguration() {
        return new NeuralNetConfiguration.Builder()
                .seed(123)
                .l2(0.0005)
                .weightInit(WeightInit.XAVIER)
                .activation(Activation.RELU)
                .updater(new Nesterovs(0.02, 0.9))
                .list()
                .layer(new DenseLayer.Builder().nIn(4).nOut(10).build())
                .layer(new OutputLayer.Builder(LossFunctions.LossFunction.MCXENT)
                        .nIn(10).nOut(3)  // 3 output classes: Setosa, Versicolor, Virginica
                        .activation(Activation.SOFTMAX)
                        .build())
                .setInputType(InputType.feedForward(4))  // 4 input features
                .build();
    }

Import von Modellen

Idee

  • Modell wird in Python erstellt

  • Soll später in einer Java-Anwendung genutzt werden

  • Ziel: Kein Neutraining, kein externer Server – direkt im Java-Code nutzbar

Was ist PMML?

  • PMML = "Predictive Model Markup Language"

  • Eine standardisierte Textdatei (XML), die ein trainiertes Modell beschreibt

  • Kann von vielen Programmiersprachen gelesen werden – z.B.: Java, C++, Go

  • Erspart doppelte Arbeit oder komplizierte Übersetzungen

Wie funktioniert’s?

  • Modell in Python trainieren (zB.: Decision Tree)

  • Modell in PMML-Datei umwandeln (mit einem Hilfsprogramm wie sklearn2pmml)

  • PMML-Datei in Java-Projekt einfügen

  • Java-Programm liest die Datei und kann damit Vorhersagen machen

Vorteile

  • Kein Modell-Neuaufbau in Java nötig

  • Funktioniert auch mit vielen anderen Sprachen

  • Klare Trennung zwischen "Trainieren" (Python) und "Benutzen" (Java)

Fazit

Performance

Performance

Wann nimmt man was?

  • Java: Performance und Trainingszeit ist wichtig

  • Python: Einfach und schnell zu implementieren

Quellen