{"id":591174,"date":"2025-08-12T05:22:21","date_gmt":"2025-08-12T04:22:21","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=pycharm&#038;p=591174"},"modified":"2025-08-12T05:22:30","modified_gmt":"2025-08-12T04:22:30","slug":"detection-des-anomalies-par-machine-learning-avec-python","status":"publish","type":"pycharm","link":"https:\/\/blog.jetbrains.com\/fr\/pycharm\/2025\/08\/detection-des-anomalies-par-machine-learning-avec-python\/","title":{"rendered":"D\u00e9tection des anomalies par machine learning avec 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\/08\/PC-social-BlogFeatured-1280x720-2x-3.png\" alt=\"D\u00e9tection des anomalies par machine learning avec Python\" width=\"2560\" height=\"1440\" \/><\/figure>\n<p>Depuis plusieurs ann\u00e9es, la plupart de nos applications sont pilot\u00e9es par les volumes consid\u00e9rables de donn\u00e9es que nous collectons et traitons. Certains d&#8217;entre nous parlent de l&#8217;\u00e8re des donn\u00e9es. L&#8217;un des aspects essentiels du traitement d&#8217;un tel volume de donn\u00e9es est la <strong>d\u00e9tection des anomalies<\/strong>, \u00e0 savoir un ensemble de processus qui permettent d&#8217;identifier les valeurs aberrantes, comme les donn\u00e9es qui sont au-del\u00e0 des limites des pr\u00e9visions et qui d\u00e9montrent qu&#8217;un comportement est en dehors des normes. En termes de recherche scientifique, les points de donn\u00e9es anormaux peuvent \u00eatre source de probl\u00e8mes techniques et devoir \u00eatre supprim\u00e9s lorsque vous \u00e9tablissez des conclusions ou, au contraire, peuvent d\u00e9boucher sur de nouvelles d\u00e9couvertes.<\/p>\n<p>Dans cet article de blog, nous allons voir pourquoi l&#8217;utilisation du machine learning pour la d\u00e9tection des anomalies est utile et explorer les techniques cl\u00e9s pour d\u00e9tecter les anomalies avec Python. Vous allez d\u00e9couvrir comment impl\u00e9menter des m\u00e9thodes populaires, telles que OneClassSVM et Isolation Forest, voir des exemples de m\u00e9thodes de visualisation des r\u00e9sultats et comprendre comment les appliquer \u00e0 des probl\u00e8mes r\u00e9els.<\/p>\n<h2 class=\"wp-block-heading\">Dans quel cas la d\u00e9tection des anomalies est-elle utilis\u00e9e\u00a0?<\/h2>\n<p>La d\u00e9tection des anomalies constitue \u00e9galement une facette fondamentale de la business intelligence moderne, car elle permet de comprendre ce qui pourrait mal se passer et d&#8217;identifier les probl\u00e8mes potentiels. Voici quelques exemples de d\u00e9tection des anomalies dans les entreprises modernes.<\/p>\n<p><strong>Alertes de s\u00e9curit\u00e9<\/strong><\/p>\n<p>Certaines cyber-attaques peuvent \u00eatre d\u00e9tect\u00e9es via la d\u00e9tection des anomalies. Par exemple, un pic du volume de requ\u00eates peut signaler une <a href=\"https:\/\/en.wikipedia.org\/wiki\/Denial-of-service_attack\" target=\"_blank\" rel=\"noopener\">attaque DDoS<\/a>, tandis que des comportements suspects de connexion, tels que des \u00e9checs r\u00e9p\u00e9titifs, peuvent indiquer un acc\u00e8s non autoris\u00e9. La d\u00e9tection de comportements suspects peut refl\u00e9ter des menaces de cybers\u00e9curit\u00e9 et les entreprises peuvent agir en cons\u00e9quence pour \u00e9viter les dommages ou les minimiser.<\/p>\n<p><strong>D\u00e9tection des fraudes<\/strong><\/p>\n<p>Dans les organisations financi\u00e8res, par exemple, les banques peuvent utiliser la d\u00e9tection des anomalies pour mettre en \u00e9vidence les activit\u00e9s suspectes sur un compte, ce qui peut indiquer des activit\u00e9s ill\u00e9gales, telles que le blanchiment d&#8217;argent ou le vol d&#8217;identit\u00e9. Les transactions suspectes peuvent \u00e9galement \u00eatre le signe d&#8217;une fraude \u00e0 la carte bancaire.<\/p>\n<p><strong>Observabilit\u00e9<\/strong><\/p>\n<p>L&#8217;une des pratiques les plus courantes pour les services web consiste \u00e0 collecter des m\u00e9triques de performances en temps r\u00e9el du service en cas de comportement anormal du syst\u00e8me. Par exemple, un pic d&#8217;utilisation de la m\u00e9moire peut signifier qu&#8217;une partie du syst\u00e8me ne fonctionne pas correctement et que le service technique doit y rem\u00e9dier imm\u00e9diatement pour \u00e9viter une interruption de service.<\/p>\n<h2 class=\"wp-block-heading\">Pourquoi recourir au machine learning pour la d\u00e9tection des anomalies\u00a0?<\/h2>\n<p>Les m\u00e9thodes statistiques traditionnelles permettent de trouver les anomalies, mais l&#8217;utilisation du machine learning en a v\u00e9ritablement r\u00e9volutionn\u00e9 la proc\u00e9dure. Gr\u00e2ce aux algorithmes de machine learning, des donn\u00e9es plus complexes (notamment avec des param\u00e8tres multiples) peuvent \u00eatre analys\u00e9es en une seule op\u00e9ration. Les techniques de machine learning permettent \u00e9galement d&#8217;analyser des donn\u00e9es cat\u00e9goriques qui sont difficiles \u00e0 traiter avec les m\u00e9thodes statistiques traditionnelles, plus adapt\u00e9es aux donn\u00e9es num\u00e9riques.<\/p>\n<p>Le plus souvent, ces algorithmes de d\u00e9tection des anomalies sont programm\u00e9s et peuvent \u00eatre d\u00e9ploy\u00e9s sous forme d&#8217;application (voir notre tutoriel <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/09\/how-to-use-fastapi-for-machine-learning\/\">FastAPI pour le machine learning<\/a>) et ex\u00e9cut\u00e9s \u00e0 la demande ou \u00e0 des intervalles sp\u00e9cifiques pour rechercher les anomalies. Cela signifie qu&#8217;ils peuvent d\u00e9clencher des actions imm\u00e9diates au sein de l&#8217;entreprise, voire \u00eatre utilis\u00e9s comme outils par les \u00e9quipes de business intelligence, afin de v\u00e9rifier et d&#8217;ajuster les strat\u00e9gies.<\/p>\n<h2 class=\"wp-block-heading\">Types de techniques et d&#8217;algorithmes de d\u00e9tection des anomalies<\/h2>\n<p>La d\u00e9tection d&#8217;anomalie peut \u00eatre divis\u00e9e en deux grandes cat\u00e9gories\u00a0: la d\u00e9tection des anomalies et la d\u00e9tection des nouveaut\u00e9s.<\/p>\n<p><strong>D\u00e9tection des anomalies<\/strong><\/p>\n<p>La d\u00e9tection des anomalies est parfois appel\u00e9e d\u00e9tection d&#8217;anomalies <strong>non supervis\u00e9e<\/strong>, car il est admis que les donn\u00e9es d&#8217;entra\u00eenement contiennent un certain nombre d&#8217;anomalies non d\u00e9tect\u00e9es, et donc non \u00e9tiquet\u00e9es, et que la meilleure approche consiste \u00e0 employer des algorithmes de machine learning non supervis\u00e9s pour les identifier. Une partie de ces algorithmes incluent <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/outlier_detection.html\" target=\"_blank\" rel=\"noopener\">les SVM (Support Vector Machines) \u00e0 classe unique, Isolation Forest, LOF (Local Outlier Factor) et EE (Elliptic Envelope)<\/a>.<\/p>\n<p><strong>D\u00e9tection des nouveaut\u00e9s<\/strong><\/p>\n<p>De son c\u00f4t\u00e9, la d\u00e9tection des nouveaut\u00e9s est parfois appel\u00e9e \u00ab\u00a0d\u00e9tection d&#8217;anomalies <strong>semi-supervis\u00e9e<\/strong>\u00a0\u00bb. Dans la mesure o\u00f9 nous partons de l&#8217;hypoth\u00e8se selon laquelle les donn\u00e9es d&#8217;entra\u00eenement ne contiennent pas seulement des anomalies, elles sont toutes \u00e9tiquet\u00e9es comme normales. L&#8217;objectif est de d\u00e9terminer si les nouvelles donn\u00e9es constituent une anomalie ou non, ce qui est parfois appel\u00e9 une nouveaut\u00e9. Les algorithmes intervenant dans la d\u00e9tection des anomalies peuvent \u00e9galement \u00eatre utilis\u00e9s pour la d\u00e9tection des nouveaut\u00e9s, \u00e0 condition que les donn\u00e9es d&#8217;entra\u00eenement ne contiennent pas d&#8217;anomalies.<\/p>\n<p>En dehors de la d\u00e9tection des anomalies et des nouveaut\u00e9s que nous venons de voir, il est \u00e9galement tr\u00e8s courant de proc\u00e9der \u00e0 la d\u00e9tection des anomalies dans les s\u00e9ries chronologiques. Toutefois, dans la mesure o\u00f9 l&#8217;approche et la technique appliqu\u00e9es aux s\u00e9ries chronologiques diff\u00e8rent des algorithmes mentionn\u00e9s ci-dessus, nous allons les examiner plus en d\u00e9tail ult\u00e9rieurement.<\/p>\n<h2 class=\"wp-block-heading\">Exemple de code\u00a0: recherche d&#8217;anomalies dans l&#8217;ensemble de donn\u00e9es Beehives<\/h2>\n<p>Dans cet article de blog, nous allons utiliser cet <a href=\"https:\/\/www.kaggle.com\/datasets\/vivovinco\/beehives\/data\" target=\"_blank\" rel=\"noopener\">ensemble de donn\u00e9es Beehives<\/a> comme exemple pour d\u00e9tecter les anomalies au niveau des ruches. Cet ensemble de donn\u00e9es fournit diff\u00e9rentes mesures de la ruche (avec notamment la temp\u00e9rature et l&#8217;humidit\u00e9 relative) \u00e0 diff\u00e9rents moments.<\/p>\n<p>Dans cet article, nous allons voir deux m\u00e9thodes tr\u00e8s diff\u00e9rentes de d\u00e9couverte des anomalies. Il s&#8217;agit de OneClassSVM, qui est bas\u00e9e sur la technologie SVM (support vector machine), que nous allons utiliser pour dessiner des fronti\u00e8res de d\u00e9cision, et Isolation Forest, qui est une m\u00e9thode d&#8217;ensemble similaire \u00e0 Random Forest.<\/p>\n<h3 class=\"wp-block-heading\">Exemple\u00a0: OneClassSVM<\/h3>\n<p>Dans ce premier exemple, nous allons utiliser les donn\u00e9es de la ruche 17 et faire l&#8217;hypoth\u00e8se que les abeilles maintiennent la temp\u00e9rature de la ruche \u00e0 un niveau constant et adapt\u00e9 \u00e0 la colonie. Nous pourrons v\u00e9rifier cette pr\u00e9misse et d\u00e9terminer si la ruche est expos\u00e9e \u00e0 des anomalies de temp\u00e9rature et d&#8217;humidit\u00e9 relative. Nous allons utiliser <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.svm.OneClassSVM.html\" target=\"_blank\" rel=\"noopener\">OneClassSVM<\/a> pour ajuster le mod\u00e8le aux donn\u00e9es et examiner les fronti\u00e8res de d\u00e9cision sur un nuage de points.<\/p>\n<p>Le SVM de OneClassSVM se rapporte \u00e0 <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/svm.html#svm\" target=\"_blank\" rel=\"noopener\">support vector machine<\/a>, qui est un algorithme populaire de machine learning pour la classification et les r\u00e9gressions. La m\u00e9thode SVM permet de <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/svm.html#mathematical-formulation\" target=\"_blank\" rel=\"noopener\">classer les points de donn\u00e9es dans les dimensions \u00e9lev\u00e9es<\/a>, en choisissant un noyau et un param\u00e8tre scalaire pour d\u00e9finir une fronti\u00e8re. Nous pouvons cr\u00e9er une fronti\u00e8re de d\u00e9cision incluant la plupart des points de donn\u00e9es (donn\u00e9es normales), tout en conservant un petit nombre d&#8217;anomalies en dehors des fronti\u00e8res pour repr\u00e9senter la probabilit\u00e9 (nu) de d\u00e9couverte d&#8217;une nouvelle anomalie. La m\u00e9thode d&#8217;utilisation de SVM pour la d\u00e9tection d&#8217;anomalie est couverte par une publication de Scholkopf et al. intitul\u00e9e <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> (en anglais uniquement).<\/p>\n<h4 class=\"wp-block-heading\"><strong>1. Cr\u00e9er un projet Jupyter<\/strong><\/h4>\n<p>Lors de la cr\u00e9ation d&#8217;un <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/creating-and-running-your-first-python-project.html\" target=\"_blank\" rel=\"noopener\">projet<\/a> dans PyCharm (Professional 2024.2.2), s\u00e9lectionnez <em>Jupyter<\/em> dans la section <em>Python<\/em>.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/fr-fr\/pycharm\/data-science\/\" target=\"\" rel=\"noopener\">Essayer PyCharm Pro gratuitement<\/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=\"Cr\u00e9ation d'un projet Jupyter dans PyCharm\" width=\"1592\" height=\"1292\" \/><\/figure>\n<p>L&#8217;avantage de l&#8217;utilisation d&#8217;un <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/scientific-mode.html\" target=\"_blank\" rel=\"noopener\">projet Jupyter<\/a> (ce que l&#8217;on appelait pr\u00e9c\u00e9demment un projet scientifique) dans PyCharm r\u00e9side dans le fait que la structure de fichiers est g\u00e9n\u00e9r\u00e9e automatiquement, ce qui inclut deux dossiers, un pour stocker vos donn\u00e9es et un autre pour stocker tous les <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/jupyter-notebook-support.html\" target=\"_blank\" rel=\"noopener\">notebooks Jupyter<\/a>, afin de conserver toutes vos exp\u00e9riences au m\u00eame endroit.<\/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=\"Projets Jupyter dans PyCharm\" width=\"996\" height=\"886\" \/><\/figure>\n<p>Un autre avantage consid\u00e9rable est que vous pouvez rendre les graphiques tr\u00e8s facilement avec <a href=\"https:\/\/matplotlib.org\/index.html\" target=\"_blank\" rel=\"noopener\">Matplotlib<\/a>. Vous verrez cela dans les instructions ci-dessous.<\/p>\n<h4 class=\"wp-block-heading\"><strong>2. Installation des d\u00e9pendances<\/strong><\/h4>\n<p>T\u00e9l\u00e9chargez le fichier <a href=\"https:\/\/github.com\/Cheukting\/anomaly-detection\/blob\/main\/requirements.txt\" target=\"_blank\" rel=\"noopener\">requirements.txt<\/a> depuis le r\u00e9f\u00e9rentiel GitHub voulu. Lorsque vous le placez dans le r\u00e9pertoire du projet et l&#8217;ouvrez dans PyCharm, une invite vous demande d&#8217;installer les biblioth\u00e8ques manquantes.<\/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=\"Installation des d\u00e9pendances dans PyCharm\" width=\"1600\" height=\"524\" \/><\/figure>\n<p>Cliquez sur <em>Install requirements<\/em> et toutes les d\u00e9pendances seront install\u00e9es automatiquement. Dans ce projet, nous utilisons Python 3.11.1.<\/p>\n<h4 class=\"wp-block-heading\"><strong>3. Importation et inspection des donn\u00e9es<\/strong><\/h4>\n<p>Vous pouvez t\u00e9l\u00e9charger <a href=\"https:\/\/www.kaggle.com\/datasets\/vivovinco\/beehives\/data\" target=\"_blank\" rel=\"noopener\">l&#8217;ensemble de donn\u00e9es \u00ab\u00a0Beehives\u00a0\u00bb depuis Kaggle<\/a> ou ce <a href=\"https:\/\/github.com\/Cheukting\/anomaly-detection\/tree\/main\/data\" target=\"_blank\" rel=\"noopener\">r\u00e9f\u00e9rentiel GitHub<\/a>. Placez les trois CSV dans le dossier <em>Data<\/em>. Ensuite, dans main.py, saisissez le code suivant\u00a0:<\/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>Enfin, appuyez sur le bouton <em>Run<\/em> dans le coin sup\u00e9rieur droit de l&#8217;\u00e9cran, ce qui ex\u00e9cute le code dans la console Python et permet d&#8217;avoir un aper\u00e7u de nos donn\u00e9es.<\/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=\"Importation des donn\u00e9es dans PyCharm\" width=\"1230\" height=\"938\" \/><\/figure>\n<h4 class=\"wp-block-heading\"><strong>4. Ajustement et inspection des points de donn\u00e9es sur un graphique<\/strong><\/h4>\n<p>Dans la mesure o\u00f9 nous utilisons OneClassSVM de scikit-learn, nous allons l&#8217;importer avec DecisionBoundaryDisplay et Matplotlib en utilisant le code ci-dessous\u00a0:<\/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>Conform\u00e9ment \u00e0 la description des donn\u00e9es, nous savons que la colonne T17 repr\u00e9sente la temp\u00e9rature de la ruche, tandis que RH17 refl\u00e8te son humidit\u00e9 relative. Nous allons extraire la valeur de ces deux colonnes en tant qu&#8217;entr\u00e9e\u00a0:<\/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>Ensuite, nous allons cr\u00e9er et ajuster le mod\u00e8le. Il est \u00e0 noter que nous allons essayer les param\u00e8tres par d\u00e9faut en premier\u00a0:<\/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>Ensuite, nous allons afficher la fronti\u00e8re de d\u00e9cision, ainsi que les points de donn\u00e9es\u00a0:<\/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>Maintenant, enregistrons et appuyons \u00e0 nouveau sur <em>Run<\/em>, ce qui affiche le trac\u00e9 dans une autre fen\u00eatre o\u00f9 vous pouvez l&#8217;inspecter.<\/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=\"Ajustement et inspection des points de donn\u00e9es sur un graphique dans PyCharm\" width=\"1600\" height=\"1049\" \/><\/figure>\n<h4 class=\"wp-block-heading\"><strong>5. Optimisation des hyperparam\u00e8tres<\/strong><\/h4>\n<p>Comme le d\u00e9montre le trac\u00e9 ci-dessus, la fronti\u00e8re de d\u00e9cision ne suit pas les points de donn\u00e9es. Les points de donn\u00e9es consistent en deux formes irr\u00e9guli\u00e8res au lieu d&#8217;un ovale. Pour optimiser notre mod\u00e8le, nous devons fournir des valeurs <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/generated\/sklearn.linear_model.SGDOneClassSVM.html\" target=\"_blank\" rel=\"noopener\">\u00ab\u00a0nu\u00a0\u00bb et \u00ab\u00a0gamma\u00a0\u00bb sp\u00e9cifiques au mod\u00e8le OneClassSVM<\/a>. Vous pouvez faire un essai, mais apr\u00e8s deux ou trois tentatives, il semble que \u00ab\u00a0nu=0.1, gamma=0.05\u00a0\u00bb donne le meilleur r\u00e9sultat.<\/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=\"Optimisation des hyperparam\u00e8tres dans PyCharm\" width=\"1274\" height=\"957\" \/><\/figure>\n<h3 class=\"wp-block-heading\">Exemple\u00a0: 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> est une <a href=\"https:\/\/scikit-learn.org\/stable\/api\/sklearn.ensemble.html\" target=\"_blank\" rel=\"noopener\">m\u00e9thode bas\u00e9e sur un ensemble<\/a>, similaire \u00e0 la m\u00e9thode de classification <a href=\"https:\/\/scikit-learn.org\/stable\/modules\/ensemble.html#forest\" target=\"_blank\" rel=\"noopener\">Random Forest<\/a> qui est plus populaire. La cr\u00e9ation au hasard de fonctionnalit\u00e9s et de valeurs de s\u00e9paration cr\u00e9e de nombreux arbres d\u00e9cisionnels, et la moyenne de la longueur du chemin entre la racine et les n\u0153uds d\u00e9cisionnels de l&#8217;ensemble des arbres sera calcul\u00e9e, d&#8217;o\u00f9 le terme \u00ab\u00a0forest\u00a0\u00bb. Un chemin moyen court d\u00e9note des anomalies.<\/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>Un chemin d\u00e9cisionnel court refl\u00e8te g\u00e9n\u00e9ralement des donn\u00e9es qui sont tr\u00e8s diff\u00e9rentes des autres.<\/em><\/figcaption>\n<\/figure>\n<p>D\u00e9sormais, nous allons comparer le r\u00e9sultat de OneClassSVM avec IsolationForest. Pour ce faire, nous allons cr\u00e9er deux trac\u00e9s de fronti\u00e8res de d\u00e9cision g\u00e9n\u00e9r\u00e9s par les deux algorithmes. Dans les \u00e9tapes suivantes, nous allons d\u00e9velopper le script ci-dessus en utilisant toujours les <a href=\"https:\/\/www.kaggle.com\/datasets\/vivovinco\/beehives\/data\" target=\"_blank\" rel=\"noopener\">donn\u00e9es de la ruche\u00a017<\/a>.<\/p>\n<h4 class=\"wp-block-heading\"><strong>1. Importation d&#8217;IsolationForest<\/strong><\/h4>\n<p>IsolationForest peut \u00eatre import\u00e9 depuis les cat\u00e9gories d&#8217;ensemble de Scikit-learn\u00a0:<\/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. Refactorisation et ajout d&#8217;un nouvel estimateur<\/strong><\/h4>\n<p>Dans la mesure o\u00f9 nous aurons deux estimateurs diff\u00e9rents, nous allons les placer dans une liste\u00a0:<\/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>Ensuite, nous allons utiliser une boucle for pour traiter tous les estimateurs.<\/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>Pour donner une touche finale, nous allons aussi donner un titre \u00e0 chacun des graphiques pour simplifier l&#8217;inspection. Pour ce faire, nous allons ajouter ce qui suit apr\u00e8s disp.ax_.scatter\u00a0:<\/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>Vous trouverez peut-\u00eatre que la refactorisation avec PyCharm est tr\u00e8s simple gr\u00e2ce aux suggestions de saisie semi-automatique propos\u00e9es.<\/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=\"Refactorisation au moyen de la saisie semi-automatique dans 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=\"Saisie semi-automatique dans PyCharm\" width=\"1520\" height=\"546\" \/><\/figure>\n<h4 class=\"wp-block-heading\"><strong>3. Ex\u00e9cution du code<\/strong><\/h4>\n<p>Comme pr\u00e9c\u00e9demment, l&#8217;ex\u00e9cution du code se fait par simple pression du bouton <em>Run<\/em> dans le coin sup\u00e9rieur droit. Apr\u00e8s avoir ex\u00e9cut\u00e9 le code, nous devons obtenir deux graphiques.<\/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=\"Ex\u00e9cution du code dans PyCharm\" width=\"1056\" height=\"582\" \/><\/figure>\n<p>Vous pouvez parcourir rapidement les deux graphiques en utilisant l&#8217;aper\u00e7u situ\u00e9 \u00e0 droite. Comme vous pouvez le voir, la fronti\u00e8re de d\u00e9cision est tr\u00e8s diff\u00e9rente en cas d&#8217;utilisation de diff\u00e9rents algorithmes. Lors de la d\u00e9tection d&#8217;anomalies, il est recommand\u00e9 d&#8217;essayer diff\u00e9rents algorithmes et param\u00e8tres pour trouver celui qui est le mieux adapt\u00e9 au cas \u00e9tudi\u00e9.<\/p>\n<h2 class=\"wp-block-heading\">\u00c9tape suivante\u00a0: d\u00e9tection d&#8217;anomalies dans les s\u00e9ries chronologiques<\/h2>\n<p>En pr\u00e9sence de donn\u00e9es semblables aux donn\u00e9es de la ruche, qui forment une s\u00e9rie chronologique, il existe d&#8217;autres m\u00e9thodes permettant d&#8217;identifier les anomalies. Dans la mesure o\u00f9 les s\u00e9ries chronologiques comportent des tendances et des p\u00e9riodes, tout ce qui n&#8217;entre pas dans ce sch\u00e9ma peut \u00eatre consid\u00e9r\u00e9 comme une anomalie. Les m\u00e9thodes populaires de d\u00e9tection des anomalies dans les s\u00e9ries chronologiques incluent la d\u00e9composition STL et les pr\u00e9visions LSTM.<\/p>\n<p>D\u00e9couvrez comment utiliser ces m\u00e9thodes pour d\u00e9tecter des anomalies dans des s\u00e9ries chronologiques <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\/\">dans cet article de blog<\/a>.<\/p>\n<h2 class=\"wp-block-heading\">R\u00e9sum\u00e9<\/h2>\n<p>La d\u00e9tection des anomalies est devenue un aspect important de la business intelligence et il est essentiel d&#8217;\u00eatre en mesure d&#8217;identifier des anomalies et de prendre des mesures imm\u00e9diates dans certains secteurs d&#8217;activit\u00e9. L&#8217;utilisation d&#8217;un mod\u00e8le de machine learning adapt\u00e9 pour d\u00e9tecter les anomalies permet d&#8217;analyser des gros volumes de donn\u00e9es complexes tr\u00e8s rapidement. Dans cet article de blog, nous avons vu comment identifier les anomalies avec des mod\u00e8les statistiques, tels que OneClassSVM.<\/p>\n<p>Pour en savoir plus sur l&#8217;utilisation de PyCharm pour le machine learning, consultez les articles \u00ab\u00a0<a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2022\/06\/start-studying-machine-learning-with-pycharm\/\">Commencer l&#8217;\u00e9tude du machine learning avec PyCharm<\/a>\u00a0\u00bb et \u00ab\u00a0<a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/09\/how-to-use-jupyter-notebooks-in-pycharm\/\">Comment utiliser les notebooks Jupyter dans PyCharm<\/a>\u00a0\u00bb dans notre blog.<\/p>\n<h2 class=\"wp-block-heading\">D\u00e9tecter les anomalies avec PyCharm<\/h2>\n<p>Le projet Jupyter de PyCharm Professional permet d&#8217;organiser facilement votre projet de d\u00e9tection des anomalies avec de nombreux fichiers de donn\u00e9es et notebooks. La g\u00e9n\u00e9ration de graphiques permet d&#8217;inspecter les anomalies, d&#8217;autant plus que les trac\u00e9s sont tr\u00e8s accessibles dans PyCharm. D&#8217;autres fonctionnalit\u00e9s, telles que les suggestions de saisie semi-automatique, permettent de naviguer dans tous les mod\u00e8les Scikit-learn et les param\u00e8tres de tra\u00e7age Matplotlib tr\u00e8s facilement.<\/p>\n<p>Boostez vos projets de science des donn\u00e9es en utilisant PyCharm et d\u00e9couvrez les <a href=\"https:\/\/www.jetbrains.com\/fr-fr\/pycharm\/data-science\/\" target=\"_blank\" rel=\"noopener\">fonctionnalit\u00e9s de science des donn\u00e9es<\/a> offertes pour simplifier votre workflow de science des donn\u00e9es.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/fr-fr\/pycharm\/data-science\/\" target=\"\" rel=\"noopener\">Essayer PyCharm Pro gratuitement<\/a><\/div>\n<\/div>\n<p>\u00a0<\/p>\n<p><em>Auteur de l\u2019article original en anglais :<\/em><\/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":813,"featured_media":591177,"comment_status":"closed","ping_status":"closed","template":"","categories":[952,1401,2347],"tags":[8670],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/pycharm\/591174"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/pycharm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/pycharm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=591174"}],"version-history":[{"count":4,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/pycharm\/591174\/revisions"}],"predecessor-version":[{"id":591201,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/pycharm\/591174\/revisions\/591201"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/591177"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=591174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=591174"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=591174"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=591174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}