1. Einleitung
Machine Learning (ML) ist in den letzten Jahren Bestandteil von zahlreichen neuen Apps. Deshalb stellt sich die Frage wie KI in (Java)-Anwendungen integriert werden können. Kann ML in Java funktionieren? Ist Python überlegen? Fakt ist das Training von sogenannten Modellen wird häufig mit Python durchgeführt, aber auch Java bietet Möglichkeiten, ML-Modelle zu erstellen und in Anwendungen zu integrieren.
1.1. KI und Java – geht das?
Obwohl Python in der Machine Learning-Community dominiert, gibt es zahlreiche Libraries, welche nicht nur gut instandgehalten (maintained) werden, sondern auch vergleichbare Funktionen wie Python-Libraries zur verfügung stellen.
Da viele Backends in Java bereits vorhanden sind, würde eine Integration so erleichtert werden.
Was ist möglich mit Java?
-
Training von ML-Modellen direkt in Java.
-
Integration von bestehenden Modellen (z.B.: aus Python) in Java-Anwendungen.
1.2. Warum (kein) Java?
Hier eine Gegenüberstellung der Vor- und Nachteile, wenn man sich für oder gegen Java entscheidet.
✅ 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 |
¹ Libraries, welche aktuell gehalten werden und nicht nur von einer einzelnen Person entwickelt werden.
2. Der Iris-Datensatz
Der Iris-Datensatz ist ein klassisches Beispiel für das Training von ML-Modellen. Er hat Daten über mehrere Blumenmerkmale, welche es ermöglicht die Blumenart zu bestimmen.
2.1. Species
Hier sehen wir eine Übersicht der verschiedenen Iris-Arten, die im Datensatz enthalten sind.

3. Decision Tree
Ein Decision Tree ist ein weit verbreitetes Modell für Klassifizierungsprobleme. In den folgenden Abschnitten erklären wir die Funktionsweise von "Entscheidungsbäumen".
3.1. Baumstruktur
Ein Decision Tree ist eine if-Bedingung welche weitere enthält und so eine Aussage trifft.

3.2. Splits
Ein Split teilt den Datensatz in zwei Teile basierend auf einer Bedingung. Die Qualität des Splits ist entscheidend für die Genauigkeit des Modells.

3.3. Gute und schlechte Splits
Nicht alle Splits sind gleich gut. Ein schlechter Split führt zu einer niedrigen Modellgenauigkeit. Hier sehen wir den Unterschied zwischen guten und schlechten Splits.

3.4. Umsetzung mit der Smile-Library für Java
Die Smile-Library ist eine leistungsstarke Java-Bibliothek für maschinelles Lernen, die auch Decision Trees unterstützt.
@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) {
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);
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);
}
}
4. Random Forest
5. Neural Network
Neurale Netze sind eine der fortschrittlichsten Methoden im maschinellen Lernen. Sie eignen sich hervorragend für komplexe Klassifizierungsaufgaben.
5.1. Aufbau
Neurale Netze bestehen aus vielen Schichten, die zusammenarbeiten, um Muster in den Daten zu erkennen.

5.2. Klassifizierung
Hier ein Beispiel für die Klassifizierung von Iris-Blumen mit einem Neuronalen Netzwerk.

5.3. Umsetzung mit DeepLearning4J
DeepLearning4J ist eine populäre Java-Bibliothek für Neuronale Netzwerke.
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();
}
6. Import von Modellen
Ein häufiger Use Case ist das Importieren von Modellen, die in anderen Programmiersprachen wie Python erstellt wurden.
6.1. Idee
In diesem Fall erstellen wir ein Modell in Python und importieren es in eine Java-Anwendung. Dies ermöglicht es, das Modell ohne Neutraining zu verwenden.
6.2. Was ist PMML?
PMML (Predictive Model Markup Language) ist ein standardisiertes Format zum Austausch von ML-Modellen zwischen verschiedenen Programmiersprachen.
-
Eine PMML-Datei beschreibt das trainierte Modell und kann von vielen Programmiersprachen gelesen werden, einschließlich Java, C++, Go.
-
PMML ermöglicht die Trennung zwischen dem Trainieren des Modells (z. B. in Python) und der Verwendung des Modells (z. B. in Java).
7. Fazit
Machine Learning mit Java ist eine mächtige, wenn auch anspruchsvollere Methode im Vergleich zu Python. Es bietet hohe Performance und Skalierbarkeit, ist jedoch nicht so einfach zu implementieren.