{"id":572950,"date":"2025-06-04T05:37:21","date_gmt":"2025-06-04T04:37:21","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=pycharm&#038;p=572950"},"modified":"2025-06-04T05:37:31","modified_gmt":"2025-06-04T04:37:31","slug":"anomalieerkennung-mittels-machine-learning-in-python","status":"publish","type":"pycharm","link":"https:\/\/blog.jetbrains.com\/de\/pycharm\/2025\/06\/anomalieerkennung-mittels-machine-learning-in-python\/","title":{"rendered":"Anomalieerkennung mittels Machine Learning in Python"},"content":{"rendered":"<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537750\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/PC-social-BlogFeatured-1280x720-2x-2.png\" alt=\"Anomalieerkennung mittels Machine Learning in Python\" width=\"2560\" height=\"1440\" \/><\/figure>\n<p>Viele unserer Anwendungen wurden in den letzten Jahren durch die hohe Datenmenge vorangetrieben, die wir erheben und verarbeiten k\u00f6nnen. Nicht wenige sprechen davon, dass wir uns im Zeitalter der Daten befinden. Einer der wichtigsten Aspekte beim Bearbeiten einer so gro\u00dfen Datenmenge ist die <strong>Anomalieerkennung<\/strong> \u2013 darunter versteht man Prozesse, die es uns erm\u00f6glichen, Ausrei\u00dfer zu identifizieren, also Daten, die au\u00dferhalb der Erwartungen liegen und ein Verhalten aufweisen, das nicht der Norm entspricht. In der wissenschaftlichen Forschung k\u00f6nnten anomale Datenpunkte eine Ursache f\u00fcr technische Probleme sein und sie m\u00fcssen bei der Erstellung von Schlussfolgerungen verworfen werden. Sie k\u00f6nnten allerdings auch zu neuen Entdeckungen f\u00fchren.<\/p>\n<p>In diesem Blogbeitrag erfahren Sie, warum der Einsatz von Machine Learning f\u00fcr die Anomalieerkennung hilfreich ist, und Sie lernen die wichtigsten Techniken zur Erkennung von Anomalien mit Python kennen. Sie erfahren, wie man beliebte Methoden wie OneClassSVM und Isolation Forest implementiert, Sie sehen Beispiele f\u00fcr die Visualisierung dieser Ergebnisse und Sie werden verstehen, wie man sie auf reale Probleme anwendet.<\/p>\n<h2 class=\"wp-block-heading\">Wo wird Anomalieerkennung eingesetzt?<\/h2>\n<p>Anomalieerkennung ist ebenfalls ein wichtiger Bestandteil der modernen Business Intelligence, da sie Erkenntnisse dar\u00fcber liefert, was m\u00f6glicherweise schiefgehen k\u00f6nnte, und auch potenzielle Probleme identifizieren kann. Nachfolgend finden Sie einige Beispiele f\u00fcr den Einsatz von Anomalieerkennung im modernen Gesch\u00e4ftsleben.<\/p>\n<p><strong>Sicherheitswarnungen<\/strong><\/p>\n<p>Es gibt einige Angriffe im Bereich der Cybersicherheit, die durch Anomalieerkennung aufgedeckt werden k\u00f6nnen. So kann beispielsweise ein Anstieg des Anfragevolumens auf einen <a href=\"https:\/\/en.wikipedia.org\/wiki\/Denial-of-service_attack\" target=\"_blank\" rel=\"noopener\">DDoS-Angriff<\/a> hinweisen, w\u00e4hrend verd\u00e4chtiges Anmeldeverhalten (z.\u00a0B. mehrere fehlgeschlagene Versuche) mitunter auf unbefugten Zugriff hindeutet. Die Erkennung verd\u00e4chtigen Benutzer*innen-Verhaltens kann auf potenzielle Cybersicherheitsbedrohungen hinweisen und Unternehmen k\u00f6nnen entsprechend darauf reagieren, um Schaden zu verhindern oder zu minimieren.<\/p>\n<p><strong>Betrugserkennung<\/strong><\/p>\n<p>In Bezug auf Finanzorganisationen k\u00f6nnen beispielsweise Banken Anomalieerkennung nutzen, um verd\u00e4chtige Kontoaktivit\u00e4ten zu erkennen, die wom\u00f6glich auf illegale T\u00e4tigkeiten wie Geldw\u00e4sche oder Identit\u00e4tsdiebstahl hindeuten. Verd\u00e4chtige Transaktionen k\u00f6nnen auch ein Zeichen f\u00fcr Kreditkartenbetrug sein.<\/p>\n<p><strong>Beobachtbarkeit<\/strong><\/p>\n<p>Eine der g\u00e4ngigen Praktiken bei Webdiensten besteht darin, Metriken zur Echtzeitleistung des Dienstes zu erheben, wenn ein abnormales Verhalten im System auftritt. So kann beispielsweise eine Spitze in der Speicherauslastung darauf hindeuten, dass etwas im System nicht richtig funktioniert \u2013 Techniker*innen m\u00fcssen sich sofort darum k\u00fcmmern, um eine Betriebsunterbrechung zu vermeiden.<\/p>\n<h2 class=\"wp-block-heading\">Warum sollte man Machine Learning f\u00fcr Anomalieerkennung verwenden?<\/h2>\n<p>W\u00e4hrend klassische statistische Methoden ebenfalls Ausrei\u00dfer identifizieren k\u00f6nnen, hat Machine Learning im Bereich der Anomalieerkennung einen neuen Ma\u00dfstab gesetzt. Dank Machine-Learning-Algorithmen k\u00f6nnen komplexere Daten (z.\u00a0B. mit mehreren Parametern) gleichzeitig analysiert werden. Machine-Learning-Techniken bieten auch die M\u00f6glichkeit, kategoriale Daten zu analysieren, die mit herk\u00f6mmlichen statistischen Methoden, die eher f\u00fcr numerische Daten geeignet sind, nicht so einfach auszuwerten sind.<\/p>\n<p>H\u00e4ufig k\u00f6nnen diese programmierten Algorithmen zur Anomalieerkennung als Anwendung eingesetzt werden (weiterf\u00fchrend hierzu unser Tutorial <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/09\/how-to-use-fastapi-for-machine-learning\/\">FastAPI f\u00fcr Machine Learning<\/a>) und nach Bedarf oder in geplanten Intervallen ausgef\u00fchrt werden, um Anomalien zu finden. Dies erm\u00f6glicht es, umgehend Ma\u00dfnahmen im Unternehmen zu ergreifen und sie auch als Reporting-Tools f\u00fcr Business-Intelligence-Teams zu nutzen, um Strategien zu bewerten und anzupassen.<\/p>\n<h2 class=\"wp-block-heading\">Technik- und Algorithmustypen im Bereich der Anomalieerkennung<\/h2>\n<p>Man kann zwischen zwei grundlegenden Typen der Anomalieerkennung differenzieren: Ausrei\u00dfererkennung und Neuartigkeitenerkennung.<\/p>\n<p><strong>Ausrei\u00dfererkennung<\/strong><\/p>\n<p>Die Erkennung von Ausrei\u00dfern wird manchmal auch als <strong>unbeaufsichtigte<\/strong> Anomalieerkennung bezeichnet, da davon ausgegangen wird, dass es in den Trainingsdaten einige unerkannte (also nicht gekennzeichnete) Anomalien gibt. Der Ansatz darin besteht, unbeaufsichtigte Machine-Learning-Algorithmen zu verwenden, um diese herauszufiltern. Einige dieser Algorithmen sind etwa <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/outlier_detection.html\" target=\"_blank\" rel=\"noopener\">Einklassen-Support-Vektor-Maschinen (SVMs), Isolation Forest, Local Outlier Factor und Elliptic Envelope<\/a>.<\/p>\n<p><strong>Neuartigkeitenerkennung<\/strong><\/p>\n<p>Andererseits wird die Erkennung von Neuartigkeiten manchmal auch als <strong>semi-beaufsichtigte<\/strong> Anomalieerkennung bezeichnet. Da wir davon ausgehen, dass alle Trainingsdaten nicht nur aus Anomalien bestehen, werden sie alle als normal gekennzeichnet. Das Ziel ist es, zu erkennen, ob es sich bei neuen Daten um eine Anomalie handelt, die manchmal auch als Neuartigkeit bezeichnet wird. Die Algorithmen, die bei der Ausrei\u00dfererkennung eingesetzt werden, k\u00f6nnen auch f\u00fcr die Neuartigkeitenerkennung verwendet werden, vorausgesetzt, es gibt keine Anomalien in den Trainingsdaten.<\/p>\n<p>Neben der erw\u00e4hnten Erkennung von Ausrei\u00dfern und Neuartigkeiten ist auch h\u00e4ufig die Anomalieerkennung in Zeitreihendaten erforderlich. Da sich der Ansatz und die Technik, die f\u00fcr Zeitreihendaten verwendet werden, jedoch oft von den oben genannten Algorithmen unterscheiden, werden wir diese zu einem sp\u00e4teren Zeitpunkt im Detail besprechen.<\/p>\n<h2 class=\"wp-block-heading\">Code-Beispiel: Auffinden von Anomalien im Bienenstock-Datensatz<\/h2>\n<p>Im Rahmen dieses Blogbeitrags verwenden wir folgenden <a href=\"https:\/\/www.kaggle.com\/datasets\/vivovinco\/beehives\/data\" target=\"_blank\" rel=\"noopener\">Bienenstock-Datensatz<\/a> als Beispiel, um Anomalien in den Bienenst\u00f6cken zu erkennen. Dieser Datensatz enth\u00e4lt unterschiedliche Messungen des Bienenstocks (einschlie\u00dflich der Temperatur und der relativen Luftfeuchtigkeit) zu verschiedenen Zeiten.<\/p>\n<p>Hier stellen wir zwei ganz unterschiedliche Verfahren zur Entdeckung von Anomalien vor. Die verwendeten Methoden sind OneClassSVM (basiert auf der Support-Vektor-Maschinen-Technologie und dient dazu, Entscheidungsgrenzen festzulegen) sowie Isolation Forest (ein ensemblebasiertes Verfahren, das Random Forest \u00e4hnlich ist).<\/p>\n<h3 class=\"wp-block-heading\">Beispiel: OneClassSVM<\/h3>\n<p>In diesem ersten Beispiel verwenden wir die Daten von Bienenstock 17 unter der Annahme, dass die Bienen ihren Stock in einem konstant angenehmen Zustand f\u00fcr die Kolonie halten. Wir werden \u00fcberpr\u00fcfen, ob das zutrifft und ob es Zeiten gibt, in denen der Stock Anomalien in Bezug auf Temperatur und relative Luftfeuchtigkeit aufweist. Wir verwenden <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.svm.OneClassSVM.html\" target=\"_blank\" rel=\"noopener\">OneClassSVM<\/a>, um unsere Daten anzupassen und die Entscheidungsgrenzen in einem Streudiagramm zu betrachten.<\/p>\n<p>Das \u201eSVM\u201c in OneClassSVM steht f\u00fcr <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/svm.html#svm\" target=\"_blank\" rel=\"noopener\">Support-Vektor-Maschine<\/a> \u2013 ein beliebter Machine-Learning-Algorithmus zur Klassifizierung und Regression. W\u00e4hrend Support-Vektor-Maschinen verwendet werden k\u00f6nnen, um <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/svm.html#mathematical-formulation\" target=\"_blank\" rel=\"noopener\">Datenpunkte in hohen Dimensionen zu klassifizieren<\/a>, ist es uns m\u00f6glich, durch die Wahl eines Kernels und eines skalaren Parameters eine Entscheidungsgrenze zu definieren, welche die meisten Datenpunkte (normale Daten) einschlie\u00dft, w\u00e4hrend eine kleine Anzahl von Anomalien au\u00dferhalb der Grenzen verbleibt. Dies stellt die Wahrscheinlichkeit (nu) der Entdeckung einer neuen Anomalie dar. Die Methode zur Anwendung von Support-Vektor-Maschinen f\u00fcr die Anomalieerkennung wird in einem Paper von Scholkopf et al. mit dem Titel <a href=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/tr-99-87.pdf\" target=\"_blank\" rel=\"noopener\"><em>Estimating the Support of a High-Dimensional Distribution<\/em><\/a> behandelt.<\/p>\n<h4 class=\"wp-block-heading\"><strong>1. Jupyter-Projekt einrichten<\/strong><\/h4>\n<p>Wenn Sie ein <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/creating-and-running-your-first-python-project.html\" target=\"_blank\" rel=\"noopener\">neues Projekt<\/a> in PyCharm (Professional 2024.2.2) einrichten, w\u00e4hlen Sie <em>Jupyter<\/em> unter <em>Python<\/em> aus.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/de-de\/pycharm\/data-science\/\" target=\"\" rel=\"noopener\">Starten Sie mit PyCharm Pro kostenlos durch<\/a><\/div>\n<\/div>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537600\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/image-34.png\" alt=\"Jupyter-Projekt in PyCharm einrichten\" width=\"1592\" height=\"1292\" \/><\/figure>\n<p>Der Vorteil, ein <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/scientific-mode.html\" target=\"_blank\" rel=\"noopener\">Jupyter-Projekt<\/a> (fr\u00fcher auch Scientific-Projekt) in PyCharm zu verwenden, ist, dass eine Dateistruktur f\u00fcr Sie generiert wird \u2013 einschlie\u00dflich eines Ordners zum Speichern Ihrer Daten und eines Ordners f\u00fcr alle <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/jupyter-notebook-support.html\" target=\"_blank\" rel=\"noopener\">Jupyter Notebooks<\/a>. So k\u00f6nnen Sie alle Ihre Experimente an einem Ort aufbewahren.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537611\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/image-35.png\" alt=\"Jupyter-Projekte in PyCharm\" width=\"996\" height=\"886\" \/><\/figure>\n<p>Ein weiterer gro\u00dfer Vorteil ist, dass wir Diagramme sehr einfach mithilfe von <a href=\"https:\/\/matplotlib.org\/index.html\" target=\"_blank\" rel=\"noopener\">Matplotlib<\/a> darstellen k\u00f6nnen. Das sehen Sie in den folgenden Schritten.<\/p>\n<h4 class=\"wp-block-heading\"><strong>2. Abh\u00e4ngigkeiten installieren<\/strong><\/h4>\n<p>Laden Sie <a href=\"https:\/\/github.com\/Cheukting\/anomaly-detection\/blob\/main\/requirements.txt\" target=\"_blank\" rel=\"noopener\">requirements.txt<\/a> aus dem entsprechenden GitHub-Repo herunter. Sobald Sie die Datei im Projektverzeichnis abgelegt und in PyCharm ge\u00f6ffnet haben, werden Sie aufgefordert, die fehlenden Bibliotheken zu installieren.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537625\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/dependencies.png\" alt=\"Abh\u00e4ngigkeiten in PyCharm installieren\" width=\"1600\" height=\"524\" \/><\/figure>\n<p>Klicken Sie auf <em>Install requirements<\/em> (Abh\u00e4ngigkeiten installieren), um alle notwendigen Elemente zu installieren. F\u00fcr dieses Projekt verwenden wir Python 3.11.1.<\/p>\n<h4 class=\"wp-block-heading\"><strong>3. Daten importieren und pr\u00fcfen<\/strong><\/h4>\n<p>Sie k\u00f6nnen den <a href=\"https:\/\/www.kaggle.com\/datasets\/vivovinco\/beehives\/data\" target=\"_blank\" rel=\"noopener\">\u201eBeehives\u201c-Datensatz entweder bei Kaggle<\/a> oder aus diesem <a href=\"https:\/\/github.com\/Cheukting\/anomaly-detection\/tree\/main\/data\" target=\"_blank\" rel=\"noopener\">GitHub-Repo<\/a> herunterladen. Platzieren Sie alle drei CSV-Dateien im Ordner <em>Data<\/em>. F\u00fcgen Sie dann in main.py den folgenden Code ein:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd\n\ndf = pd.read_csv('data\/Hive17.csv', sep=\";\")\ndf = df.dropna()\nprint(df.head())<\/pre>\n<p>Klicken Sie abschlie\u00dfend auf die Schaltfl\u00e4che <em>Run<\/em> (Ausf\u00fchren) in der oberen rechten Ecke des Bildschirms. Unser Code wird dann in der Python-Konsole ausgef\u00fchrt, sodass wir einen Eindruck davon bekommen, wie unsere Daten aussehen.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537636\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/image-1.gif\" alt=\"Daten in PyCharm importieren\" width=\"1230\" height=\"938\" \/><\/figure>\n<h4 class=\"wp-block-heading\"><strong>4. Datenpunkte anpassen und in einem Diagramm untersuchen<\/strong><\/h4>\n<p>Da wir OneClassSVM aus scikit-learn verwenden werden, importieren wir dies zusammen mit DecisionBoundaryDisplay und Matplotlib mithilfe des folgenden Codes:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from sklearn.svm import OneClassSVM\nfrom sklearn.inspection import DecisionBoundaryDisplay\n\nimport matplotlib.pyplot as plt<\/pre>\n<p>Aus der Beschreibung der Daten wissen wir, dass die Spalte T17 f\u00fcr die Temperatur des Bienenstocks und RH17 f\u00fcr die relative Luftfeuchtigkeit desselben steht. Wir extrahieren den Wert dieser beiden Spalten als Eingabewert:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">X = df[[\"T17\", \"RH17\"]].values<\/pre>\n<p>Dann erstellen wir das Modell und passen es an. Beachten Sie, dass wir zun\u00e4chst die Standardeinstellung ausprobieren:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">estimator = OneClassSVM().fit(X)<\/pre>\n<p>Hiermit zeigen wir die Entscheidungsgrenze zusammen mit den Datenpunkten an:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">disp = DecisionBoundaryDisplay.from_estimator(\n    estimator,\n    X,\n    response_method=\"decision_function\",\n    plot_method=\"contour\",\n    xlabel=\"Temperature\", ylabel=\"Humidity\",\n    levels=[0],\n)\ndisp.ax_.scatter(X[:, 0], X[:, 1])\nplt.show()<\/pre>\n<p>Speichern Sie nun die \u00c4nderungen und klicken Sie erneut auf <em>Run<\/em> (Ausf\u00fchren). Sie werden sehen, dass das Diagramm in einem separaten Fenster zur \u00dcberpr\u00fcfung angezeigt wird.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537647\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/image-36.png\" alt=\"Datenpunkte in PyCharm anpassen und in einem Diagramm untersuchen\" width=\"1600\" height=\"1049\" \/><\/figure>\n<h4 class=\"wp-block-heading\"><strong>5. Feinabstimmung von Hyperparametern<\/strong><\/h4>\n<p>Wie das obige Diagramm zeigt, passt die Entscheidungsgrenze nicht besonders gut zu den Datenpunkten. Die Datenpunkte bestehen aus einer Reihe unregelm\u00e4\u00dfiger Formen anstelle eines Ovals. Zur Feinabstimmung unseres Modells m\u00fcssen wir <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.linear_model.SGDOneClassSVM.html\" target=\"_blank\" rel=\"noopener\">dem OneClassSVM-Modell einen bestimmten Wert f\u00fcr \u201enu\u201c und \u201egamma\u201c zuweisen<\/a>. Sie k\u00f6nnen es ruhig selbst ausprobieren \u2013 aber nach einigen Tests scheint es, dass \u201enu=0.1, gamma=0.05\u201c das beste Ergebnis liefert.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537777\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/fine-tune-hyperparameters.png\" alt=\"Feinabstimmung von Hyperparametern in PyCharm\" width=\"1274\" height=\"957\" \/><\/figure>\n<h3 class=\"wp-block-heading\">Beispiel: Isolation Forest<\/h3>\n<p><a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.ensemble.IsolationForest.html\" target=\"_blank\" rel=\"noopener\">Isolation Forest<\/a> ist eine <a href=\"https:\/\/scikit-learn.org\/stable\/api\/sklearn.ensemble.html\" target=\"_blank\" rel=\"noopener\">ensemblebasierte Methode<\/a> \u00e4hnlich der bekannteren<a href=\"https:\/\/scikit-learn.org\/stable\/modules\/ensemble.html#forest\" target=\"_blank\" rel=\"noopener\">\u201eRandom Forest\u201c<\/a>-Klassifikationsweise. Durch die zuf\u00e4llige Auswahl von Trennmerkmalen und entsprechenden Werten werden zahlreiche Entscheidungsb\u00e4ume erstellt. Die Pfadl\u00e4nge vom Baumstamm bis zur Abzweigung, welche die Entscheidung trifft, wird \u00fcber alle B\u00e4ume hinweg gemittelt (daher auch der Begriff \u201eforest\u201c\/Wald). Eine kurze durchschnittliche Pfadl\u00e4nge weist auf Anomalien hin.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537669\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/isolation-forest.png\" alt=\"Isolation Forest\" width=\"1600\" height=\"900\" \/>\n<figcaption class=\"wp-element-caption\"><em>Ein kurzer Entscheidungspfad deutet in der Regel auf Daten hin, die sich stark von den anderen unterscheiden.<\/em><\/figcaption>\n<\/figure>\n<p>Vergleichen wir nun das Ergebnis von OneClassSVM mit IsolationForest. Dazu erstellen wir zwei Diagramme der Entscheidungsgrenzen, die von den beiden Algorithmen festgelegt werden. In den folgenden Schritten bauen wir auf dem obigen Skript auf und verwenden dabei dieselben <a href=\"https:\/\/www.kaggle.com\/datasets\/vivovinco\/beehives\/data\" target=\"_blank\" rel=\"noopener\">Daten f\u00fcr Bienenstock 17<\/a>.<\/p>\n<h4 class=\"wp-block-heading\"><strong>1. IsolationForest importieren<\/strong><\/h4>\n<p>IsolationForest kann aus den Ensemble-Kategorien in Scikit-learn importiert werden:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from sklearn.ensemble import IsolationForest<\/pre>\n<h4 class=\"wp-block-heading\"><strong>2. Refactoring und Hinzuf\u00fcgen einer neuen Sch\u00e4tzfunktion<\/strong><\/h4>\n<p>Da wir nun zwei verschiedene Sch\u00e4tzfunktionen haben, sollten wir sie in einer Liste zusammenfassen:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">estimators = [\n    OneClassSVM(nu=0.1, gamma=0.05).fit(X),\n    IsolationForest(n_estimators=100).fit(X)\n]<\/pre>\n<p>Danach verwenden wir eine for-Schleife, um alle Sch\u00e4tzfunktionen durchzugehen.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">for estimator in estimators:\n    disp = DecisionBoundaryDisplay.from_estimator(\n        estimator,\n        X,\n        response_method=\"decision_function\",\n        plot_method=\"contour\",\n        xlabel=\"Temperature\", ylabel=\"Humidity\",\n        levels=[0],\n    )\n    disp.ax_.scatter(X[:, 0], X[:, 1])\n    plt.show()<\/pre>\n<p>Als letzten Schliff f\u00fcgen wir jedem Diagramm einen Titel hinzu, um die Kontrolle zu erleichtern. Dazu erg\u00e4nzen wir nach disp.ax_.scatter Folgendes:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">disp.ax_.set_title(\n        f\"Decision boundary using {estimator.__class__.__name__}\"\n    )<\/pre>\n<p>Sie werden feststellen, dass das Refactoring mit PyCharm dank der Auto-Completion-Vorschl\u00e4ge besonders einfach ist.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537733\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/image-40.png\" alt=\"Refactoring mit Auto-Completion in PyCharm\" width=\"1600\" height=\"628\" \/><\/figure>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537711\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/image-39.png\" alt=\"Auto-Completion in PyCharm\" width=\"1520\" height=\"546\" \/><\/figure>\n<h4 class=\"wp-block-heading\"><strong>3. Code ausf\u00fchren<\/strong><\/h4>\n<p>Wie zuvor m\u00fcssen Sie zum Ausf\u00fchren des Codes lediglich auf die Schaltfl\u00e4che <em>Run<\/em> (Ausf\u00fchren) in der oberen rechten Ecke klicken. Nachdem der Code ausgef\u00fchrt wurde, sollten wir zwei Diagramme erhalten.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537722\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/run-the-code.gif\" alt=\"Code in PyCharm ausf\u00fchren\" width=\"1056\" height=\"582\" \/><\/figure>\n<p>Mit der Vorschau auf der rechten Seite k\u00f6nnen Sie ganz einfach durch die beiden Diagramme bl\u00e4ttern. Wie Sie sehen k\u00f6nnen, ist die Entscheidungsgrenze bei der Verwendung verschiedener Algorithmen recht unterschiedlich. Im Rahmen der Anomalieerkennung lohnt es sich, mit verschiedenen Algorithmen und Parametern zu experimentieren, um jene Option zu finden, die f\u00fcr den jeweiligen Anwendungsfall am besten geeignet ist.<\/p>\n<h2 class=\"wp-block-heading\">N\u00e4chster Schritt: Anomalieerkennung in Zeitreihendaten<\/h2>\n<p>Falls es sich bei den Daten wie bei unseren Bienenstockdaten um eine Zeitreihe handelt, gibt es zus\u00e4tzliche Methoden, um Anomalien herauszufiltern. Da Zeitreihen Trends und Perioden umfassen, kann alles, was von diesbez\u00fcglichen Mustern abweicht, als Anomalie betrachtet werden. Beliebte Methoden zur Anomalieerkennung in Zeitreihen sind STL-Zerlegung und LSTM-Vorhersage.<\/p>\n<p>Erfahren Sie <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2025\/01\/anomaly-detection-in-time-series\/\" data-type=\"link\" data-id=\"https:\/\/blog.jetbrains.com\/pycharm\/2025\/01\/anomaly-detection-in-time-series\/\">in diesem Blogbeitrag<\/a>, wie Sie diese Methoden zur Erkennung von Anomalien in Zeitreihen verwenden k\u00f6nnen.<\/p>\n<h2 class=\"wp-block-heading\">Zusammenfassung<\/h2>\n<p>Die Anomalieerkennung hat sich als wichtiger Aspekt der Business Intelligence erwiesen. Die F\u00e4higkeit, Anomalien zu identifizieren und sofortige Ma\u00dfnahmen zu ergreifen, ist in einigen Gesch\u00e4ftsbereichen unerl\u00e4sslich. Der Einsatz eines geeigneten Machine-Learning-Modells zur automatischen Erkennung von Anomalien kann dazu beitragen, komplizierte und gro\u00dfe Datenmengen in kurzer Zeit zu analysieren. In diesem Blogbeitrag haben wir Ihnen gezeigt, wie Sie mithilfe von statistischen Modellen wie OneClassSVM Anomalien erkennen k\u00f6nnen.<\/p>\n<p>Um mehr \u00fcber die Verwendung von PyCharm f\u00fcr Machine Learning zu erfahren, lesen Sie bitte \u201e<a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2022\/06\/start-studying-machine-learning-with-pycharm\/\">Start Studying Machine Learning With PyCharm<\/a>\u201c (Einf\u00fchrung in Machine Learning mit PyCharm)und \u201e<a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/09\/how-to-use-jupyter-notebooks-in-pycharm\/\">How to Use Jupyter Notebooks in PyCharm<\/a>\u201c (Jupyter Notebooks in PyCharm).<\/p>\n<h2 class=\"wp-block-heading\">Anomalien mit PyCharm erkennen<\/h2>\n<p>Mit dem Jupyter-Projekt in PyCharm Professional l\u00e4sst sich Ihr Projekt zur Anomalieerkennung m\u00fchelos mit zahlreichen Datendateien und Notebooks strukturieren. Sie k\u00f6nnen Graphen erstellen, um Anomalien zu untersuchen, und Diagramme sind in PyCharm \u00e4u\u00dferst benutzerfreundlich. Weitere Funktionen, wie etwa Auto-Completion-Vorschl\u00e4ge, gestalten das Navigieren durch die Scikit-learn-Modelle und die Matplotlib-Diagrammeinstellungen besonders angenehm.<\/p>\n<p>Verbessern Sie Ihr Data-Science-Projekt mit PyCharm und sehen Sie sich die verf\u00fcgbaren <a href=\"https:\/\/www.jetbrains.com\/de-de\/pycharm\/data-science\/\" target=\"_blank\" rel=\"noopener\">Data-Science-Features<\/a> an, um Ihren Data-Science-Workflow zu optimieren.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/de-de\/pycharm\/data-science\/\" target=\"\" rel=\"noopener\">Starten Sie mit PyCharm Pro kostenlos durch<\/a><\/div>\n<\/div>\n<p>\u00a0<\/p>\n<p><strong>Autorin des urspr\u00fcnglichen Blogposts<\/strong><\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/CheukTingHo-Kimono-e1738750639162-200x200.jpg\" width=\"200\" height=\"200\" alt=\"Cheuk Ting Ho\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                            <h4>Cheuk Ting Ho<\/h4>\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":811,"featured_media":572952,"comment_status":"closed","ping_status":"closed","template":"","categories":[952,1401],"tags":[8670],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/pycharm\/572950"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/pycharm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/types\/pycharm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/users\/811"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/comments?post=572950"}],"version-history":[{"count":4,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/pycharm\/572950\/revisions"}],"predecessor-version":[{"id":572977,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/pycharm\/572950\/revisions\/572977"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media\/572952"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media?parent=572950"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/categories?post=572950"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/tags?post=572950"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/cross-post-tag?post=572950"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}