CapyMOA: Effizientes Maschinelles Lernen für dynamische Datenströme

Van-Gogh-inspired digital painting in wide format showing the CapyMOA capybara logo centered within a circular blue frame, surrounded by swirling blue and golden data streams under a glowing night sky, with a distant city skyline and a small humanoid robot observing the scene.
© Illustration generated using ChatGPT by OpenAI

Maschinelles Lernen ist nicht länger auf statische Datensätze beschränkt. Viele moderne Problemstellungen — von Energieprognosen und Betrugserkennung bis hin zu Sensoranalytik und Cybersicherheit — basieren auf kontinuierlichen Datenströmen. Diese Daten treffen instanzweise ein, verändern sich im Zeitverlauf und unterliegen häufig einer Konzeptdrift, wodurch klassische Batch-Lernverfahren ungeeignet werden.

Dieser Beitrag richtet sich an ML-Praktiker*innen und angewandt Forschende, die mit dynamischen Datenströmen arbeiten und hochdurchsatzfähige, adaptive Lernverfahren benötigen – und dabei MOA-Performance in Python nutzen möchten, ohne Abstriche bei der Benutzerfreundlichkeit zu machen.

Es handelt sich um den abschließenden Beitrag unserer Stream-Mining-Reihe und baut auf den Grundlagen der vorherigen Artikel „Lernen aus Datenströmen: Grundlagen des Stream Learning“, „Grünes Online-Lernen mit Heterogenen Ensembles“ und „Streaming Gradient Boosting: Online Learning neu gedacht“ auf, mit dem Fokus darauf, wie diese Konzepte in der Praxis zusammenwirken.

Zur Bewältigung dieser und weiterer Herausforderungen wurde CapyMOA entwickelt. CapyMOA ist eine Open-Source-Python-Bibliothek für Datenstromlernen und Online Continual Learning (OCL). Die erste öffentliche Version wurde im Mai 2024 veröffentlicht. CapyMOA verfolgt das Ziel, die Effizienz von MOA, die Zugänglichkeit von Python sowie die für moderne Streaming-Anwendungen erforderliche Flexibilität zu vereinen.

MOA war die erste breit etablierte Open-Source-Bibliothek für Datenstromlernen. Ursprünglich um 2007 in Java implementiert, wird sie bis heute aktiv genutzt und weiterentwickelt.

Warum CapyMOA?

Bestehende Werkzeuge gehen unterschiedliche Kompromisse ein:

MOA (Java) ist äußerst effizient, jedoch weniger zugänglich für Python-zentrierte Workflows.
River ist benutzerfreundlich, vollständig in Python implementiert, stößt jedoch bei hochdurchsatzfähigen Datenströmen an Performancegrenzen.
Scikit-Multiflow schloss einige dieser Lücken, wird jedoch nicht mehr aktiv weiterentwickelt.

Für Anwender*innen resultiert daraus häufig ein Zielkonflikt zwischen Performance, Usability und langfristiger Wartbarkeit. CapyMOA überbrückt diese Welten durch drei zentrale Säulen:

1. Effizienz

CapyMOA kombiniert native Python-Implementierungen mit dem Zugriff auf optimierte Java-Algorithmen aus MOA über eine moderne Python-API. Wo sinnvoll, werden ausgereifte MOA-Implementierungen mittels JPype mit minimalem Overhead eingebunden, während zugleich ein eigenes, wachsendes Ökosystem an Methoden für das Datenstromlernen bereitgestellt wird.

Dies ermöglicht MOA-Performance, ohne eine einzige Zeile Java-Code schreiben zu müssen.

Benchmark comparing CapyMOA against other data stream libraries
Abbildung 1: Benchmark-Vergleich von CapyMOA mit anderen Bibliotheken für Datenstromlernen. © 2024 CapyMOA Developers. Quelle: CapyMOA GitHub-Repository.

Warum das in der Praxis relevant ist:

Effizienz ist beim Data Stream Lerning von entscheidender Bedeutung, da Modelle unter Zeit- und Ressourcenbeschränkungen kontinuierlich eintreffende Daten verarbeiten müssen. Schnellere Implementierungen ermöglichen es Forschenden und Praktiker*innen, mit längeren und realistischeren Datenströmen zu arbeiten, eine größere Anzahl von Experimenten durchzuführen und die Rechenkosten zu senken. Dies macht eine groß angelegte Bewertung und Bereitstellung insbesondere in ressourcenbeschränkten Umgebungen besser realisierbar. CapyMOA bietet diese Effizienz und bleibt dabei vollständig in Python-basierte Workflows integriert.

2. Interoperabilität

CapyMOA lässt sich nahtlos integrieren mit:

  • MOA-Algorithmen (automatisch eingebunden)
  • scikit-learn-Modellen
  • PyTorch-Komponenten

Dies ermöglicht hybride Ansätze, die traditionelle Online-Modelle mit Deep Learning kombinieren – besonders nützlich für Online Continual Learning. Diese Interoperabilität ist entscheidend für angewandte ML-Teams, die bereits auf scikit-learn oder PyTorch setzen und bestehende Pipelines auf Streaming-Szenarien ausweiten möchten, anstatt alles von Grund auf neu aufzubauen.

Capybara chilling.
Capybara chilling. © 2026 CapyMOA Developers. Source: CapyMOA GitHub repository

3. Zugänglichkeit

    Die API ist so konzipiert, dass sie für normale Benutzerinnen intuitiv zu bedienen ist und gleichzeitig die Flexibilität bietet, die fortgeschrittene Benutzerinnen wie Forschende und Entwickler*innen benötigen. Dies spiegelt sich in Funktionen wie den folgenden wider:

    Zugänglichkeit bedeutet hier nicht übermäßige Vereinfachung. Es bedeutet vielmehr, Boilerplate-Code für einfache Aufgaben – wie das schnelle Benchmarking von Driftdetektoren – zu reduzieren und gleichzeitig die volle Kontrolle über fortgeschrittene Workflows zu behalten, wie z. B. die Erstellung von Pipelines mit Online-Vorverarbeitung, mehreren Driftdetektoren und benutzerdefinierten Metriken.

    Lernen aus Datenströmen mit CapyMOA

    Die meisten Stream-Learning-Pipelines folgen dem Test-dann-Trainieren-Zyklus:

    • Die nächste Instanz abrufen
    • Eine Vorhersage treffen
    • Den Lerner trainieren
    • Metriken aktualisieren

    CapyMOA abstrahiert dies in präsequenzielle Bewertungsfunktionen, wodurch Boilerplate-Code reduziert und die Bewertung über Algorithmen hinweg standardisiert wird. Diese Abstraktion gewährleistet eine konsistente Bewertung über Modelle und Experimente hinweg.

    Beispiel: Hoeffding-Baum auf dem Strom-Datensatz

    from capymoa.datasets import Electricity
    from capymoa.classifier import HoeffdingTree
    from capymoa.evaluation import prequential_evaluation
    
    stream = Electricity()
    ht = HoeffdingTree(schema=stream.get_schema(), grace_period=50)
    
    results = prequential_evaluation(stream=stream, learner=ht, window_size=4500)
    
    print(results.cumulative.accuracy())
    

    Metric-Fenster werden automatisch in einem Pandas DataFrame gespeichert und können mit folgendem Befehl visualisiert werden:

    from capymoa.evaluation.visualization import plot_windowed_results
    plot_windowed_results(results, metric="accuracy")

    Beispiel: Online-Bagging für den Stromdatensatz

    Natürlich ist es weiterhin möglich, die Schleife zu steuern und explizit zu bewerten, wie im folgenden Beispiel gezeigt.

    from capymoa.datasets import Electricity
    from capymoa.evaluation import ClassificationEvaluator
    from capymoa.classifier import OnlineBagging
    
    elec_stream = Electricity()
    ob_learner = OnlineBagging(schema=elec_stream.get_schema(), ensemble_size=5)
    ob_evaluator = ClassificationEvaluator(schema=elec_stream.get_schema())
    
    for instance in elec_stream:
        prediction = ob_learner.predict(instance)
        ob_learner.train(instance)
        ob_evaluator.update(instance.y_index, prediction)
    
    print(ob_evaluator.accuracy())

    Diese Flexibilität ermöglicht es Benutzer*innen, bei Bedarf Abstraktion gegen detaillierte Kontrolle einzutauschen. Weitere Informationen hierzu im CapyMOA-Notizbuch.

    Schemas und Instanzen: Datenkonsistenz durch Design

    Im Gegensatz zu Frameworks, die auf Python-Dictionaries basieren, erzwingt CapyMOA ein Schema für jeden Stream. Dies vermeidet stille Fehler, gewährleistet stabile Langzeitexperimente und sorgt für Kompatibilität zwischen Python- und Java-Komponenten. Unabhängig davon, ob eine CSV- oder ARFF-Datei geladen oder auf synthetische Generatoren zurückgegriffen wird, enthält jede Instanz strukturierte Metadaten, wodurch die Interoperabilität über die gesamte Pipeline hinweg zuverlässig und automatisch gewährleistet ist.

    Bei lang andauernden Stream-Experimenten können kleine Inkonsistenzen die Ergebnisse unbemerkt ungültig machen. In einer auf Dictionaries basierenden Instanzdarstellung kann beispielsweise das Fehlen eines Merkmals mehrdeutig sein: Es kann auf einen fehlenden Wert hinweisen oder darauf, dass das Merkmal nicht mehr existiert. Mit expliziter Schema-Verfolgung wird diese Unterscheidung klar – das System kann erkennen, ob sich der Merkmalsatz selbst geändert hat oder ob einfach ein Wert fehlt. Dadurch kann sich der Lerner (oder andere Komponenten in der Pipeline) entsprechend an die Schemaentwicklung anpassen. Die Schema-Durchsetzung macht solche Änderungen daher explizit und reproduzierbar, was sowohl in der Forschung als auch in der Produktion ein entscheidender Vorteil ist.

    Concept Drift: Ein First-Class Citizen

    CapyMOA bietet ein komplettes System für die Arbeit mit Drift:

    • Drift-Simulation mit DriftStream, AbruptDrift und GradualDrift
    • Integration mit Bewertungs- und Visualisierungstools
    • Native Unterstützung für klassische und moderne Drift-Detektoren

    Beispiel: Aufbau eines Streams mit einer abrupten und einer allmählichen Drift

    from capymoa.stream.drift import DriftStream, AbruptDrift, GradualDrift
    from capymoa.stream.generator import SEA
    from capymoa.evaluation.visualization import plot_windowed_results
    
    stream_sea2drift = DriftStream(
        stream=[
            SEA(function=1),
            AbruptDrift(position=5000),
            SEA(function=3),
            GradualDrift(position=10000, width=2000),
            # GradualDrift(start=9000, end=12000),
            SEA(function=1),
        ]
    )
    
    OB = OnlineBagging(schema=stream_sea2drift.get_schema(), ensemble_size=10)
    
    results_sea2drift_OB = prequential_evaluation(
        stream=stream_sea2drift, learner=OB, window_size=100, max_instances=15000
    )
    
    print(
        f"The definition of the DriftStream is accessible through the object:\n {stream_sea2drift}"
    )
    plot_windowed_results(results_sea2drift_OB, metric="accuracy")

    Die Plots zeigen automatisch die Driftpositionen an und helfen Forschenden dabei, zu diagnostizieren, wann und warum Modelle Probleme haben. Dadurch wird Drift nicht nur erkennbar, sondern auch interpretierbar – ein entscheidender Schritt hin zu vertrauenswürdigen adaptiven Systemen.

    CapyMOA accuracy over time for Online Bagging.
    Genauigkeit im Zeitverlauf für Online-Bagging. © 2026 CapyMOA Developers. Quelle: CapyMOA-Website

    Weitere Informationen hierzu im CapyMOA-Notizbuch.

    Pipelines: Modular, flexibel und bereit für AutoML

    Streaming-Pipelines sind bekanntermaßen schwierig, da Transformationen den Zustand über die Zeit hinweg beibehalten müssen. CapyMOA führt ein flexibles Pipeline-System ein, das Folgendes unterstützt:

    • Feature-Scaler
    • Drift-Detektoren
    • Inkrementelle Lerner
    • Benutzerdefinierte Komponenten über PipelineElement
    • Multi-Detektor-Pipelines (z. B. ABCD + ADWIN)

    Dieses Design ermöglicht Experimente mit komplexen adaptiven Pipelines unter Beibehaltung der Korrektheit über einen längeren Zeitraum. Es legt auch den Grundstein für AutoML für Datenströme, indem es Pipelines dynamisch auswählt und anpasst, wenn sich die Daten ändern.

    Beispiel: Normalisierung anwenden und Rauschen hinzufügen

    from capymoa.stream.preprocessing import MOATransformer
    from capymoa.stream.preprocessing import ClassifierPipeline
    from moa.streams.filters import AddNoiseFilter, NormalisationFilter
    
    elec_stream = Electricity()
    
    # Creating the transformers
    normalisation_transformer = MOATransformer(
        schema=elec_stream.get_schema(), moa_filter=NormalisationFilter()
    )
    add_noise_transformer = MOATransformer(
        schema=normalisation_transformer.get_schema(), moa_filter=AddNoiseFilter()
    )
    
    # Creating a learner
    ob_learner = OnlineBagging(schema=add_noise_transformer.get_schema(), ensemble_size=5)
    
    # Creating and populating the pipeline
    pipeline = (
        ClassifierPipeline()
        .add_transformer(normalisation_transformer)
        .add_transformer(add_noise_transformer)
        .add_classifier(ob_learner)
    )
    
    # Creating the evaluator
    ob_evaluator = ClassificationEvaluator(schema=elec_stream.get_schema())
    
    while elec_stream.has_more_instances():
        instance = elec_stream.next_instance()
        prediction = pipeline.predict(instance)
        ob_evaluator.update(instance.y_index, prediction)
        pipeline.train(instance)
    
    ob_evaluator.accuracy()

    Weitere Informationen hierzu im CapyMOA-Notizbuch hier und hier.

    Online Continual Learning (OCL): Über das klassische Stream Learning hinaus

    Das traditionelle Stream Learning behandelt Konzeptdrift, geht jedoch in der Regel davon aus, dass überwachte Labels zeitnah eintreffen. OCL hingegen befasst sich mit:

    • Inkrementellen Aufgaben
    • Domänenverschiebungen
    • Spärlichen oder verzögerten Labels
    • Speicherbeschränkungen

    CapyMOA integriert OCL nativ und ermöglicht es sowohl klassischen Online-Modellen als auch neuronalen kontinuierlichen Lernern, auf demselben Bewertungsrahmen zu arbeiten.

    Diese einheitliche Behandlung von Stream Learning und kontinuierlichem Lernen ist noch selten und positioniert CapyMOA an der Schnittstelle zweier schnell wachsender Forschungsbereiche – als eines der ersten vollständig integrierten Frameworks, das Stream Learning und Online Continual Learning miteinander verbindet.

    Beispiel: Ausführung von Experience Replay

    from capymoa.ann import Perceptron
    from capymoa.classifier import Finetune
    from capymoa.ocl.strategy import ExperienceReplay
    from capymoa.ocl.datasets import TinySplitMNIST
    from capymoa.ocl.evaluation import ocl_train_eval_loop
    import torch
    _ = torch.manual_seed(0)
    scenario = TinySplitMNIST()
    model = Perceptron(scenario.schema)
    learner = ExperienceReplay(Finetune(scenario.schema, model))
    results = ocl_train_eval_loop(
        learner,
        scenario.train_loaders(32),
        scenario.test_loaders(32),
    )
    print(f"{results.accuracy_final*100:.1f}%")

    Weitere Informationen hierzu im CapyMOA-Notizbuch.

    Zusammenfassung

    CapyMOA versteht sich als moderne Grundlage für Forschung und Praxis im Bereich des adaptiven maschinellen Lernens. Durch die ausgewogene Kombination von Effizienz, Interoperabilität und Benutzerfreundlichkeit bietet es eine Plattform, auf der:

    • Forschende schnell neue Algorithmen entwickeln und testen können.
    • Praktiker*innen robuste, leistungsstarke Tools für Echtzeitdaten nutzen können.
    • Studierende anhand klarer, einfacher Beispiele Konzepte des Stream Learning erlernen können.

    Im Zuge der Weiterentwicklung von CapyMOA sind unter anderem eine tiefere OCL-Integration, verbesserte Drift-Diagnosen, erweiterte Deep-Learning-Pipelines und eine erweiterte Unterstützung für Clustering und Anomalieerkennung geplant.

    Dr. Heitor Murilo Gomes

    Heitor Murilo Gomes ist Senior Lecturer für Künstliche Intelligenz an der Victoria University of Wellington, wo er das Adaptive AI Lab leitet und als Vorsitzender der New Zealand AI Olympiad (NZAIO) fungiert.Vor seinem Wechsel an die Victoria University of Wellington war er Senior Research Fellow und Co-Direktor des AI Institute an der University of Waikato. Seine Forschung umfasst sowohl grundlegende als auch angewandte Methoden des Maschinellen Lernens für Datenströme, darunter […]

    Weitere Blogartikel