Python_ML
Python_ML
Cours de Python
24-05-2025
TABLE DES MATIÈRES
1 Introduction 6
Introduction 6
4 Bibliothèques essentielles 30
4.1 NumPy : Tableaux ndarray . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.1.1 Générateurs de tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.1.2 Attributs utiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.1.3 Méthodes importantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.1.4 Initialisation personnalisée avec colonne de biais . . . . . . . . . . . . . . . . . . . 31
4.1.5 Indexing et Slicing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.1.6 Indexation booléenne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.1.7 Exercices avec solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.2 Statistiques NumPy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.3 Opérations linéaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.4 Exercice : Standardisation de matrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.5 Numpy et Broadcasting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.6 Matplotlib : Graphiques de Base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.7 Matplotlib : Top Graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.7.1 Graphique de Classification avec Scatter() . . . . . . . . . . . . . . . . . . . . . . . 42
4.7.2 Graphiques 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.8 Histogrammes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.9 Graphiques ContourPlot() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.9.1 Imshow() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.10 Machine Learning avec SciPy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.10.1 Interpolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.10.2 Optimisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.10.3 curve_fit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.10.4 Minimisation 1D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.10.5 Minimisation 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.11 Traitement du signal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.12 Transformation de Fourier (FFT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.13 Traitement d’images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.14 Application : Traitement d’images (cas réel) . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.15 Pandas (les Bases) et Analyse du Titanic . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.15.1 Chargement des données dans un DataFrame Pandas . . . . . . . . . . . . . . . . . 62
4.15.2 Nettoyage des données avec drop(), dropna() et fillna() . . . . . . . . . . . . . . . . 63
4.15.3 Analyse avec groupby() et value_counts() . . . . . . . . . . . . . . . . . . . . . . . 64
4.16 Exercice : Transformation des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.17 Pandas et séries temporelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.17.1 Travailler avec des séries temporelles . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.17.2 Utilisation de resample() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.17.3 Utilisation de agg() pour des statistiques multiples . . . . . . . . . . . . . . . . . . 71
4.17.4 Moyennes mobiles et moyennes mobiles exponentielles (EWM) . . . . . . . . . . . 72
4.17.5 Comparaison de deux séries temporelles . . . . . . . . . . . . . . . . . . . . . . . . 73
4.18 Exercice et Solution : Stratégie de trading simple . . . . . . . . . . . . . . . . . . . . . . . 74
4.19 Visualisation de Données avec Seaborn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.19.1 Prise en main de Seaborn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.19.2 Pairplot() : La vue d’ensemble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
4.19.3 Visualiser des catégories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
4.19.4 Visualisation de Distributions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5 Machine Learning 80
5.1 Apprentissage Supervisé avec Sklearn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.1.1 Régression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.1.2 Classification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.1.3 Prédiction de survie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.2 Sklearn : Sélection de Modèle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.3 Train Test Split . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.4 Validation Set Approach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6 Conclusion 130
1 Introduction
Bienvenue dans ce cours complet de Python appliqué au Machine Learning. Que vous soyez
étudiant, passionné de data science ou professionnel souhaitant acquérir de nouvelles compétences, ce
cours a été conçu pour vous offrir un apprentissage progressif, clair et motivant.
Python est aujourd’hui le langage de prédilection dans le domaine de l’intelligence artificielle, de
la science des données et du développement logiciel. Sa syntaxe simple, sa grande communauté et son
écosystème riche en bibliothèques en font un outil puissant pour manipuler des données, visualiser des
résultats et construire des modèles prédictifs.
Ce cours vous propose une immersion pratique et structurée, depuis les fondamentaux jusqu’aux
techniques de Machine Learning les plus utilisées. Vous apprendrez à écrire du code propre et efficace, à
exploiter des bibliothèques comme NumPy, Pandas ou Scikit-learn, et à créer vos premiers modèles
d’apprentissage automatique.
Pourquoi suivre ce cours ?
— Pour acquérir une base solide en Python, indispensable pour évoluer dans le monde de la data.
— Pour maîtriser les outils incontournables utilisés dans les entreprises, les laboratoires de recherche
et les start-ups.
— Pour comprendre les mécanismes derrière les algorithmes de Machine Learning et savoir les mettre
en œuvre dans des projets concrets.
Le cours est divisé en trois chapitres, chacun construit pour renforcer vos compétences de manière pro-
gressive :
1. Python - Les bases : Variables, opérations, structures de données, conditions, boucles et fonc-
tions.
2. Bibliothèques essentielles : NumPy pour les calculs numériques, Pandas pour la manipulation
de données, Matplotlib pour la visualisation et Scikit-Learn pour le Machine Learning.
3. Machine Learning : Concepts clés (surapprentissage, biais-variance, validation croisée), princi-
paux algorithmes (régression, classification, clustering) et applications pratiques.
À la fin de ce cours, vous serez en mesure de :
— Écrire des scripts Python efficaces
— Manipuler et analyser des jeux de données
— Créer, entraîner et évaluer des modèles de Machine Learning
Alors, prêt(e) à découvrir la puissance de Python et à plonger dans le monde passionnant
du Machine Learning ? Commençons cette aventure ensemble !
Anaconda est une distribution Python gratuite et open-source qui facilite la gestion des packages
et des environnements virtuels. Pour configurer un environnement de travail pour ce cours, suivez
les étapes ci-dessous :
1. Téléchargez et installez Anaconda depuis https://www.anaconda.com/download/
2. Ouvrez Anaconda Prompt (ou Terminal sur macOS/Linux)
3. Exécutez les commandes suivantes pour créer et configurer votre environnement :
1 conda create -n jupyter_env python =3.9
2 conda activate jupyter_env
3 conda install -c conda - forge notebook =6.4.12 j u p y t e r _ c o n t r i b _ n b e x t e n s i o n s
4 jupyter contrib nbextension install -- sys - prefix
Kaggle offre une alternative en ligne gratuite avec accès à des accélérateurs GPU et TPU, sans
nécessiter d’installation locale.
Google Colab est une autre plateforme en ligne qui permet d’exécuter du code Python dans un
navigateur sans configuration locale, avec accès à des GPU et TPU gratuits.
1. Accédez à https://colab.google/
2. Connectez-vous avec votre compte Google
3. Créez un nouveau notebook
4. Pour activer les accélérateurs :
— Accédez à "Exécution" dans le menu
— Sélectionnez "Modifier le type d’exécution"
— Choisissez le type d’accélérateur souhaité (None, GPU, ou TPU)
Google Colab est particulièrement utile pour :
— Les débutants qui ne souhaitent pas configurer un environnement local
— Les projets nécessitant des ressources de calcul importantes
— La collaboration en temps réel
— Le partage facile des notebooks
Les notebooks Colab peuvent être sauvegardés directement sur Google Drive, ce qui facilite l’or-
ganisation et l’accès aux projets depuis n’importe quel appareil.
Note importante : Pour les exercices nécessitant des ressources de calcul importantes
(notamment en Deep Learning), l’utilisation d’un accélérateur (GPU/TPU) via Kaggle
ou Google Colab est fortement recommandée.
Explication
La division entière (//) est particulièrement utile lorsqu’on travaille avec des tableaux NumPy,
car elle permet de manipuler les indices sans générer d’erreurs liées aux nombres fractionnaires.
Par exemple, si vous devez diviser un tableau en deux parties égales, l’opérateur // garantit que
vous obtiendrez un indice entier.
Explication
Les opérations de comparaison et de logique utilisées ensemble permettent de construire des struc-
tures algorithmiques de base (if/else, while, etc.). Elles sont essentielles pour créer des conditions
qui déterminent le flux d’exécution d’un programme.
3.2 Fonctions
En Python, les fonctions sont des blocs de code réutilisables qui exécutent une tâche spécifique. Il
existe deux façons principales de définir des fonctions :
Explication
Les fonctions lambda sont utiles pour les opérations simples qui ne nécessitent pas de bloc de
code complet. Elles sont souvent utilisées comme arguments pour des fonctions de traitement de
données comme map(), filter() ou les méthodes de tri.
Voici un exemple concret - une fonction qui calcule l’énergie potentielle d’un corps :
1 # Fonction qui calcule l ’ nergie potentielle d ’ un corps
2 def e_potentielle ( masse , hauteur , g =9.81) :
3 energie = masse * hauteur * g
4 return energie
5
6 # Ici g a une valeur par d f a u t , donc nous ne sommes pas o b l i g s de lui donner une
valeur
7 resultat = e_potentielle ( masse =10 , hauteur =10)
8 print ( resultat ) # R s u l t a t : 981.0
Explication
Les paramètres avec des valeurs par défaut (comme g=9.81 dans cet exemple) sont optionnels lors
de l’appel de la fonction. Si aucune valeur n’est fournie, la valeur par défaut sera utilisée. Cela
rend les fonctions plus flexibles et permet de simplifier les appels lorsque des valeurs standards
sont couramment utilisées.
Solution
1 def e_potentielle ( masse , hauteur , e_limite , g =9.81) :
2 energie = masse * hauteur * g
3 return energie > e_limite
4
5 resultat = e_potentielle ( masse =10 , hauteur =10 , e_limite =800)
6 print ( resultat ) # R s u l t a t : True ( car 981.0 > 800)
Explication
Dans cette version modifiée de la fonction, nous ajoutons un paramètre e_limite et nous utilisons
une expression de comparaison pour retourner directement un booléen. La fonction retourne True
si l’énergie calculée est supérieure à la limite, et False dans le cas contraire. Cette technique est
couramment utilisée dans le traitement de données pour filtrer ou classifier des valeurs selon des
seuils définis.
Explication
Note importante : Une condition est respectée si et seulement si elle correspond au résultat booléen
True.
1 valeur = -2
2 print ( valeur < 0) # Le r s u l t a t de cette comparaison est True
3 if valeur < 0:
4 print ( ’ n g a t i f ’) # Ce bloc est e x c u t car la condition est True
Cela permet de développer des algorithmes avec des mélanges d’opérations logiques et d’opérations de
comparaisons. Par exemple : si il fait beau et qu’il fait chaud, alors j’irai me baigner
1 x = 3
2 y = -1
3 if ( x > 0) and ( y > 0) :
4 print ( ’x et y sont positifs ’)
5 else :
6 print ( ’x et y ne sont pas tous les 2 positifs ’) # Ce bloc est e x cut
Implémentez la suite de Fibonacci [0, 1, 1, 2, 3, 5, 8, 13, 21, ...] qui part de 2 nombres a=0 et
b=1, et qui calcule le nombre suivant en additionnant les 2 nombres précédents.
Indices :
— Pour cet exercice vous aurez besoin d’une boucle while
— Vous pouvez imprimer cette suite jusqu’à atteindre un nombre n que vous aurez choisi
— Dans Python il est possible de mettre à jour 2 variables simultanément sur la même ligne :
a, b = b, a+b
Solution
1 def fibonacci ( n ) :
2 # Retourne une liste contenant la suite de Fibonacci jusqu ’ n
3 a = 0
4 b = 1
5 print ( a ) # Affiche le premier nombre de la suite (0)
6 while b < n :
7 print ( b ) # Affiche le nombre actuel
8 a , b = b , a + b # Calcule le nombre suivant
9
10 fibonacci (1000) # Affiche la suite jusqu ’ ce que la valeur d p a s s e 1000
Explication
Cette implémentation de la suite de Fibonacci utilise une boucle while pour générer et afficher
les nombres jusqu’à ce qu’ils dépassent la valeur n spécifiée.
L’utilisation de l’affectation multiple a, b = b, a+b est un exemple de syntaxe élégante en Py-
thon qui permet d’échanger des valeurs sans utiliser de variable temporaire. Cette technique est
particulièrement utile pour la suite de Fibonacci où chaque nouveau terme est la somme des deux
précédents.
Cette séquence apparaît fréquemment dans la nature et dans diverses applications mathématiques.
En informatique, elle est souvent utilisée comme exemple pour introduire la récursivité, même si
cette implémentation utilise une approche itérative plus efficace.
Explication
1 # SLICING [ d b u t ( inclus ) : fin ( exclus ) : pas ]
2 print ( ’ s q u e n c e c o m p l t e : ’ , villes )
3 print ( ’ index 0 -2: ’ , villes [0:3]) # Les 3 premiers lments
4 print ( ’ index 1 -2: ’ , villes [1:3]) # Du 2 me au 3 me lment
5 print ( ’ ordre inverse : ’ , villes [:: -1]) # Toute la s q u e n c e en ordre inverse
Explication
Explication
Les méthodes les plus couramment utilisées sur les listes sont :
— append() : ajoute un élément à la fin de la liste
— insert() : insère un élément à une position spécifique
— extend() : ajoute tous les éléments d’une liste à la fin d’une autre
— sort() : trie les éléments de la liste (modifie la liste originale)
— remove() : supprime la première occurrence d’un élément
— pop() : supprime et renvoie un élément à un index donné
La fonction enumerate est très utile pour extraire à la fois les éléments d’une liste et leurs index. C’est
une fonction très utilisée en data science.
1 for index , element in enumerate ( villes ) :
2 print ( index , element )
La fonction zip est aussi très utile pour itérer à travers 2 listes en parallèle. Si une liste est plus courte
que l’autre, la boucle for s’arrête à la liste la plus courte.
1 liste_2 = [312 , 52 , 654 , 23 , 65 , 12 , 678]
2 for element_1 , element_2 in zip ( villes , liste_2 ) :
3 print ( element_1 , element_2 )
Explication
enumerate() et zip() sont deux fonctions extrêmement utiles en Python pour le traitement de
listes :
— enumerate() retourne des paires (index, valeur) pour chaque élément de la liste
— zip() combine des éléments de même position provenant de plusieurs listes
Ces fonctions permettent d’écrire un code plus élégant et plus efficace, en évitant les index manuels
et les boucles imbriquées.
Solution
1 def fibonacci ( n ) :
2 a = 0
3 b = 1
4 fib = [ a ] # C r a t i o n d ’ une liste fib avec le premier lment
5 while b < n :
6 a, b = b, a+b
7 fib . append ( a ) # Ajoute la nouvelle valeur de a la fin de fib
8 return fib
9
10 print ( fibonacci (1000) ) # Affiche la liste c o m p l t e des nombres de Fibonacci jusqu
’ 1000
Explication
Explication
Explication
La méthode pop() permet de retirer une clé d’un dictionnaire tout en retournant la valeur associée :
1 # Supprime la c l ’ abricots ’ et stocke sa valeur
2 abricots = inventaire . pop ( " abricots " )
3 print ( inventaire ) # Ne contient plus de c l ’ abricots ’
4 print ( abricots ) # Contient la valeur a s s o c i e ’ abricots ’
Explication
Solution
1 def trier ( classeur , valeur ) :
2 if valeur >= 0:
3 classeur [ ’ positifs ’ ]. append ( valeur )
4 else :
5 classeur [ ’ n g a t i f s ’ ]. append ( valeur )
6 return classeur
7
8 # Test de la fonction
9 classeur = { ’ n g a t i f s ’ :[] , ’ positifs ’ :[]}
10 print ( trier ( classeur , 9) ) # Ajoute 9 la liste des positifs
11 print ( trier ( classeur , -3) ) # Ajoute -3 la liste des n g a t i f s
12 print ( trier ( classeur , 0) ) # Ajoute 0 la liste des positifs
Explication
Explication
Explication
Explication
La syntaxe des dictionary comprehensions est similaire à celle des list comprehensions, mais utilise
des accolades {} et spécifie à la fois une clé et une valeur :
{clé: valeur for variable in itérable if condition}
Cette technique permet de créer des dictionnaires de manière concise et efficace, en évitant les
boucles explicites et les affectations répétitives.
Solution
1 dictionnaire = { k : k **2 for k in range (1 , 21) }
2 print ( dictionnaire )
Explication
Cette solution utilise une dictionary comprehension pour créer un dictionnaire en une seule ligne :
— k sert à la fois de clé dans le dictionnaire et de variable d’itération
— k**2 calcule le carré de chaque nombre comme valeur associée
— range(1, 21) génère tous les nombres de 1 à 20 inclus
Les comprehensions constituent un outil puissant en Python pour l’analyse de données et le trai-
tement de collections d’éléments, permettant d’écrire du code à la fois concis et performant.
Explication
Explication
Explication
Explication
Explication
Solution
1 # Solution non optimale
2 with open ( ’ fichier . txt ’ , ’r ’) as f :
3 liste = f . read () . splitlines ()
4
5 print ( liste )
Explication
Les deux solutions accomplissent la même tâche, mais la seconde utilise une list comprehension
pour un code plus concis :
— La première solution utilise read().splitlines() pour lire tout le fichier et le diviser en
lignes
— La seconde itère directement sur le fichier (qui est itérable ligne par ligne) et applique
strip() pour éliminer les espaces et retours à la ligne superflus
— La list comprehension offre une syntaxe plus élégante et souvent plus performante
Dans des applications réelles traitant de grands fichiers, on préférerait généralement la seconde
approche car elle consomme moins de mémoire en traitant les lignes une par une plutôt qu’en
chargeant tout le fichier d’un coup.
Explication
Explication
Bien que ces modules soient utiles pour des calculs simples, en data science, on préférera gé-
néralement utiliser leurs équivalents dans le package NumPy, qui offre des performances bien
supérieures pour les calculs sur de grandes quantités de données.
9
10 # G n r e une liste de 10 nombres a l a t o i r e s entre 0 et 99
11 print ( random . sample ( range (100) , 10) )
12
13 print ( ’ liste de d p a r t ’ , liste )
14 random . shuffle ( liste ) # M l a n g e les lments d ’ une liste
15 print ( ’ liste m l a n g e ’ , liste )
Explication
Explication
Solution
1 import random
2 import statistics
3
4 def m o y e n n e _ a l e a t o i r e () :
5 # G n r e 10 nombres a l a t o i r e s entre 1 et 100
6 nombres = [ random . randint (1 , 100) for _ in range (10) ]
7
8 # Calcule et retourne leur moyenne
9 moyenne = statistics . mean ( nombres )
10
11 print ( f " Nombres g n r s : { nombres } " )
12 print ( f " Moyenne : { moyenne } " )
13
14 return moyenne
15
16 # Test de la fonction
17 m o y e n n e _ a l e a t o i r e ()
Explication
Explication
Ce code montre la création d’une classe Vehicule avec des attributs (couleur, vitesse, roues)
définis dans la méthode spéciale __init__().
— self fait référence à l’objet courant.
— On crée un objet avec Vehicule(...).
— On accède aux méthodes via objet.méthode().
Explication
4 Bibliothèques essentielles
Python dispose d’un écosystème très riche de bibliothèques scientifiques. Dans ce chapitre, nous al-
lons nous concentrer sur NumPy, une bibliothèque fondamentale pour la manipulation de données
numériques, notamment les tableaux multidimensionnels appelés ndarray.
Explication
Les fonctions de création de tableaux sont très pratiques pour générer rapidement des structures
de données : constantes (zeros, ones), aléatoires (randn, rand, randint) ou structurées (eye,
arange, linspace).
Explication
Ces attributs permettent d’explorer la structure des tableaux NumPy. size donne le nombre total
d’éléments, shape donne les dimensions, et shape[0] est très utile pour connaître le nombre de
lignes dans un tableau 2D.
Explication
Les méthodes comme reshape, ravel et squeeze sont utiles pour adapter la forme des tableaux
selon les besoins du traitement. La fonction concatenate permet d’assembler plusieurs tableaux
le long d’un axe (lignes ou colonnes).
Explication
Cette fonction génère une matrice de taille (m, n+1) avec une colonne supplémentaire remplie de
1. Cette colonne de biais est très utilisée dans les modèles de Machine Learning, notamment pour
ajouter un biais dans les calculs linéaires.
Explication
L’indexation et le slicing dans NumPy fonctionnent comme avec les listes Python. On peut accéder
à un élément avec la notation A[i, j], et à un sous-tableau avec des tranches : A[i:j, k:l]. Il
est aussi possible d’assigner une valeur à une région entière du tableau.
Explication
L’indexation booléenne permet de sélectionner les éléments répondant à une condition. Ici, tous
les éléments inférieurs à 5 sont remplacés par 4. Très utile pour filtrer et modifier des données de
manière vectorisée.
Explication
On utilise ici un slicing pour cibler les 4 cases centrales (lignes 1-2 et colonnes 1-2) et les remplir
avec des 1.
Exercice 2 : Remplir le tableau de "1" une ligne sur deux, une colonne sur deux
1 C = np . zeros ((5 , 5) )
2 C
3
4 # SOLUTION
5 C [::2 , ::2] = 1
6 C
Explication
Avec le slicing ::2, on sélectionne une ligne sur deux et une colonne sur deux. Cela crée un motif
en damier.
Exercice 3 : Sur une image, ne garder que le centre et remplacer les pixels > 150 par 255
1 from scipy import misc
2 import matplotlib . pyplot as plt
3
4 face = misc . face ( gray = True ) # Image en niveaux de gris
5 plt . imshow ( face , cmap = plt . cm . gray )
6 plt . show ()
7
8 face . shape # Dimensions de l image
9
10 # SOLUTION
11 x , y = face . shape
12 zoom_face = face [ x //4 : -x //4 , y //4 : -y //4] # Zoom au centre
13 zoom_face [ zoom_face > 150] = 255 # Pixels >150 deviennent blancs
14
15 plt . imshow ( zoom_face , cmap = plt . cm . gray )
16 plt . show ()
Explication
Cet exercice combine le slicing et l’indexation booléenne sur des images. On extrait le centre de
l’image puis on transforme les pixels les plus clairs (valeurs >150) en blanc pur (255).
Échantillon : v
n u n
1 X 1 X
et s = t
u
s2 = (xi − x̄)2 (xi − x̄)2
n−1 i=1
n − 1 i=1
Figure 3 – image
Méthode argsort()
1 A = np . random . randint (0 , 10 , [5 , 5])
2 print ( A )
3 print ( A . argsort () )
4 print ( A [: ,0]. argsort () )
5 A = A [ A [: ,0]. argsort () , :]
6 print ( A )
Génère une matrice aléatoire 5x5, trie chaque ligne, puis trie la matrice entière selon la première colonne.
Calcule la matrice de corrélation pour les lignes et une corrélation spécifique entre deux colonnes.
Insère un NaN, calcule la proportion de NaN et la moyenne sans les prendre en compte.
Calcule le déterminant, l’inverse, les valeurs propres et les vecteurs propres d’une matrice.
Explication
Dans ce premier exemple, nous ajoutons un scalaire à un tableau 2x3. Le broadcasting s’applique
ici, où le scalaire 3 est "étendu" sur chaque élément du tableau A, résultant en un tableau où
chaque élément est augmenté de 3. Le résultat est donc un tableau 2 × 3 de 4.
1 # Exemple 2 : Broadcasting d ’ un tableau avec un tableau ayant des dimensions compatibles
2 A = np . ones ((2 , 3) ) # Un tableau 2 x3 de 1
3 B = np . ones ((2 , 1) ) # Un tableau 2 x1 de 1 , sera tendu sur 3 colonnes
4 print ( A + B ) # R s u l t a t : chaque colonne de B est tendue sur A
Explication
Dans ce deuxième exemple, le tableau B a une dimension 2 × 1, ce qui signifie qu’il n’a qu’une
colonne. Ce tableau sera étendu sur les trois colonnes de A. Par conséquent, chaque élément de la
colonne de B sera ajouté à chaque colonne correspondante de A, produisant un tableau 2 × 3 de
2.
1 # Exemple 3 : Broadcasting d ’ un tableau 2 x2 avec un tableau 2 x3
2 A = np . ones ((2 , 3) ) # Un tableau 2 x3 de 1
3 B = np . ones ((2 , 2) ) # Un tableau 2 x2 de 1
4 print ( A + B ) # R s u l t a t s non compatibles , va lever une erreur
Explication
Explication
1 plt . scatter (X , y )
2 plt . show ()
Explication
Ce graphique montre les points individuels de la courbe en utilisant un graphique de type scatter.
Chaque point est représenté par une marque individuelle sans ligne reliant les points.
Styles Graphiques Il existe plusieurs styles à ajouter aux graphiques. Voici les plus importants à
retenir :
— c : couleur de la ligne
— lw : épaisseur de la ligne (pour les graphiques plot)
— ls : style de la ligne (pour les graphiques plot)
— size : taille du point (pour les graphiques scatter)
— marker : style des points (pour les graphiques scatter)
— alpha : transparence du graphique
1 plt . plot (X , y , c = ’ red ’ , lw =4 , ls = ’ -- ’ , alpha =0.8)
2 plt . show ()
Figure 6 – Graphique avec des styles personnalisés : ligne rouge, épaisseur de 4, et ligne en pointillé.
Explication
Ce graphique applique plusieurs styles à la courbe. La couleur de la ligne est rouge, l’épaisseur de
la ligne est définie à 4, le style de la ligne est pointillé, et la transparence de la ligne est réduite à
80% avec alpha=0.8.
Cycle de vie d’une figure Pour créer des figures proprement, on doit suivre le cycle de vie suivant :
1 plt . figure ( figsize =(8 , 6) ) # Taille de la figure
2 plt . plot (X , X **2 , label = ’ quadratique ’) # Premier graphique
3 plt . plot (X , X **3 , label = ’ cubique ’) # D e u x i m e graphique
4 # Information s u p p l m e n t a i r e
5 plt . title ( ’ figure 1 ’) # Titre
6 plt . xlabel ( ’ axe x ’) # L g e n d e de l ’ axe x
7 plt . ylabel ( ’ axe y ’) # L g e n d e de l ’ axe y
8 plt . legend () # L g e n d e des courbes
9
10 plt . savefig ( ’ figure . png ’) # Sauvegarde la figure dans le r p e r t o i r e de travail
11 plt . show () # Affiche la figure
Figure 7 – Exemple de figure avec deux courbes : une quadratique et une cubique.
Explication
Ce graphique montre deux courbes, une quadratique et une cubique, sur la même figure. Nous
avons ajouté des titres et des légendes aux axes pour rendre le graphique plus lisible. Enfin, nous
avons sauvegardé l’image sous le nom figure.png.
Subplots Les subplots sont utilisés pour afficher plusieurs graphiques sur une même figure.
1 plt . subplot (2 , 1 , 1) # Premier subplot (2 lignes , 1 colonne , premier graphique )
2 plt . plot (X , X **2 , c = ’ red ’)
3 plt . subplot (2 , 1 , 2) # D e u x i m e subplot (2 lignes , 1 colonne , d e u x i m e graphique )
4 plt . plot (X , X **3 , c = ’ blue ’)
5 plt . show ()
Figure 8 – Exemple de subplots montrant deux graphiques sur une même figure.
Explication
Ici, deux sous-graphiques sont créés sur une figure en utilisant la fonction subplot. Le premier
graphique montre la courbe quadratique, et le deuxième montre la courbe cubique. Les subplots
sont disposés verticalement avec 2, 1 dans subplot.
Méthode orientée objet Voici un exemple de création de subplots en utilisant la méthode orientée
objet.
1 fig , ax = plt . subplots (2 , 1 , sharex = True ) # Partage le m m e axe x pour les subplots
2 ax [0]. plot (X , X **2 , label = ’ quadratique ’)
3 ax [1]. plot (X , np . sin ( X ) , label = ’ sinus ’)
4 plt . show ()
Figure 9 – Exemple de graphique utilisant la méthode orientée objet avec deux subplots partageant le
même axe.
Explication
Cet exemple montre l’utilisation de la méthode orientée objet avec fig et ax pour créer deux
subplots. Les deux courbes partagent le même axe x, ce qui permet de mieux comparer les deux
graphiques.
Exercice et Solution Créez une fonction graphique qui permet de tracer sur une seule et même figure
une série de graphiques issue d’un dictionnaire contenant plusieurs datasets :
1 def graphique ( dataset ) :
2 for label , data in dataset . items () :
3 plt . plot ( data , label = label )
4 plt . legend ()
5 plt . show ()
6
7 # Voici le dataset u t i l i s
8 dataset = { f " experience { i } " : np . random . randn (100) for i in range (4) }
9 graphique ( dataset )
Explication
Cette fonction graphique prend un dictionnaire où chaque clé représente un label et chaque valeur
est un dataset. Elle trace chaque dataset sur la même figure, et ajoute une légende pour chaque
courbe.
Explication
Ce graphique permet de visualiser la relation entre la première variable (x[ :, 0]) et toutes les
autres, colorées par classe. Cela aide à détecter les séparabilités visuelles.
4.7.2 Graphiques 3D
1 from mpl_toolkits . mplot3d import Axes3D
2
3 ax = plt . axes ( projection = ’3 d ’)
4 ax . scatter ( x [: , 0] , x [: , 1] , x [: ,2] , c = y )
Explication
Affiche les données dans un espace 3D, utile pour visualiser les relations entre 3 variables.
1 f = lambda x , y : np . sin ( x ) + np . cos ( x + y )
2
3 X = np . linspace (0 , 5 , 50)
4 Y = np . linspace (0 , 5 , 50)
5 X , Y = np . meshgrid (X , Y )
6 Z = f (X , Y )
7
8 ax = plt . axes ( projection = ’3 d ’)
9 ax . plot_surface (X , Y , Z , cmap = ’ plasma ’)
10 plt . show ()
Explication
Trace une surface 3D définie par une fonction mathématique. Cela est utile pour l’analyse de
surfaces continues.
4.8 Histogrammes
1 x = np . random . randn (1000)
2
3 plt . figure ( figsize =(12 , 3) )
4 plt . subplot (121)
5 plt . hist (x , bins =10)
6 plt . title ( ’ bins =10 ’)
7 plt . subplot (122)
8 plt . hist (x , bins =50)
9 plt . title ( ’ bins = 50 ’)
10 plt . show ()
Explication
Permet de visualiser la distribution d’un jeu de données en ajustant le nombre de classes (bins).
Explication
1 from scipy import misc
2 face = misc . face ( gray = True )
3
4 plt . figure ( figsize =(12 , 4) )
5 plt . subplot (121)
6 plt . imshow ( face , cmap = ’ gray ’)
7 plt . subplot (122)
8 plt . hist ( face . ravel () , bins =255)
9 plt . show ()
Explication
Explication
Les courbes de niveau (contours) représentent les lignes de même valeur d’une fonction 2D. Utile
pour l’analyse topographique ou de champs scalaires.
4.9.1 Imshow()
1 plt . figure ( figsize =(12 , 3) )
2
3 X = np . random . randn (50 , 50)
4 plt . subplot (131)
5 plt . imshow ( X )
6 plt . title ( ’ random normal ’)
7
8 from sklearn . datasets import load_iris
9 iris = load_iris ()
10 X = iris . data
11 y = iris . target
12
13 plt . subplot (132)
14 plt . imshow ( np . corrcoef ( X .T , y ) )
15 plt . title ( ’ Iris C o r r l a t i o n ’)
16
17 X = np . linspace (0 , 5 , 100)
18 Y = np . linspace (0 , 5 , 100)
19 X , Y = np . meshgrid (X , Y )
20 f = lambda x , y : np . sin ( x ) + np . cos ( y )
21
22 plt . subplot (133)
23 plt . imshow ( f (X , Y ) )
24 plt . colorbar ()
25 plt . title ( ’f (x , y ) = sin ( x ) + cos ( y ) ’)
Explication
imshow() affiche une matrice comme une image. Très utile pour visualiser des matrices de corré-
lation, des fonctions ou des images brutes.
4.10.1 Interpolation
Interpoler un signal est parfois très utile s’il vous manque des données dans un Dataset. Mais c’est
une technique dangereuse, qui peut parfois transformer la réalité des choses !
1 # C r a t i o n d ’ un Dataset
2 x = np . linspace (0 , 10 , 10)
3 y = np . sin ( x )
4 plt . scatter (x , y )
Explication
Cette partie crée un jeu de données simple avec 10 points répartis uniformément entre 0 et 10,
et calcule le sinus de ces valeurs. Le résultat est affiché sous forme de points dispersés avec
plt.scatter().
Explication
La fonction interp1d de SciPy permet de créer une fonction d’interpolation à partir de points
discrets. Le paramètre kind=’cubic’ spécifie une interpolation cubique qui génère une courbe
lisse passant par tous les points originaux. Cette technique est particulièrement utile pour estimer
des valeurs entre des points connus ou pour reconstruire un signal continu à partir d’échantillons.
4.10.2 Optimisation
On trouve beaucoup de fonctions dans le module optimize. Certaines permettent de faire des mini-
misations locales ou globales, d’autres permettent de développer des modèles statistiques avec la méthode
des moindres carrés. On trouve également des fonctions pour faire de la programmation linéaire.
4.10.3 curve_fit
1 # C r a t i o n d ’ un Dataset avec du bruit " normal "
2 x = np . linspace (0 , 2 , 100)
3 y = 1/3* x **3 - 3/5 * x **2 + 2 + np . random . randn ( x . shape [0]) /20
4 plt . scatter (x , y )
Explication
Ici, nous créons un ensemble de données qui suit une fonction polynomiale de degré 3 avec un
bruit gaussien ajouté. Le bruit est divisé par 20 pour le réduire et rendre la tendance principale
plus visible. Ce type de dataset est courant dans les problèmes d’ajustement de courbe.
1 # D f i n i t i o n d ’ un m o d l e statistique s e n s " coller " au dataset ci - dessus
2 def f (x , a , b , c , d ) :
3 return a * x **3 + b * x **2 + c * x + d
4
5 from scipy import optimize
6
7 # curve_fit permet de trouver les p a r a m t r e s du m o d l e f g r c e la m t h o d e des
moindres c a r r s
8 params , param_cov = optimize . curve_fit (f , x , y )
9
10 # Visualisation des r s u l t a t s
11 plt . scatter (x , y )
12 plt . plot (x , f (x , params [0] , params [1] , params [2] , params [3]) , c = ’g ’ , lw =3)
Explication
La fonction curve_fit permet d’ajuster un modèle mathématique à des données. Elle utilise
la méthode des moindres carrés pour trouver les paramètres optimaux qui minimisent l’erreur
quadratique entre les prédictions du modèle et les données observées. Dans cet exemple, nous
ajustons un polynôme de degré 3 aux données bruitées. Le résultat params contient les coefficients
optimaux du polynôme, tandis que param_cov donne la matrice de covariance des paramètres,
utile pour estimer leur incertitude.
4.10.4 Minimisation 1D
La fonction optimize.minimize est utile pour trouver un minimum local dans une fonction à N
dimensions.
1 # D f i n i t i o n d ’ une fonction 1 Dimension
2 def f ( x ) :
3 return x **2 + 15* np . sin ( x )
4
5 # Visualisation de la fonction
6 x = np . linspace ( -10 , 10 , 100)
7 plt . plot (x , f ( x ) )
Explication
Nous définissons une fonction 1D qui combine un terme quadratique et un terme sinusoïdal,
créant ainsi plusieurs minima locaux. Ce type de fonction est un bon exemple pour illustrer les
algorithmes d’optimisation.
Explication
4.10.5 Minimisation 2D
1 # D f i n i t i o n d ’ une fonction 2 D . X est un tableau numpy 2 - Dimensions
2 def f ( x ) :
3 return np . sin ( x [0]) + np . cos ( x [0]+ x [1]) * np . cos ( x [0])
4
5 # G n r a t i o n de la fonction sur un espace 2 D
6 x = np . linspace ( -3 , 3 , 100)
7 y = np . linspace ( -3 , 3 , 100)
8 x , y = np . meshgrid (x , y )
9
10 # Visualisation de la fonction
11 plt . contour (x , y , f ( np . array ([ x , y ]) ) , 20)
Explication
Ici, nous définissons une fonction à deux variables pour illustrer la minimisation multidimension-
nelle. La fonction meshgrid permet de créer une grille 2D pour évaluer notre fonction sur tout un
domaine. La visualisation par courbes de niveau (contour) nous permet d’identifier visuellement
les bassins d’attraction et les minima locaux.
Explication
Pour la minimisation 2D, le principe est similaire à la minimisation 1D, mais le point initial x0 et
le résultat sont maintenant des vecteurs à 2 dimensions. La fonction optimize.minimize utilise
par défaut la méthode BFGS (Broyden-Fletcher-Goldfarb-Shanno), un algorithme d’optimisation
quasi-newtonien qui approxime le Hessien de la fonction pour trouver efficacement le minimum
local. La visualisation montre le chemin entre le point initial et le minimum local trouvé.
Explication
Ici, nous créons un signal qui combine une tendance linéaire (x), une composante sinusoïdale
(4*np.sin(x)) et un bruit aléatoire. Ce type de signal est courant dans de nombreuses applications
scientifiques où une tendance à long terme peut masquer des oscillations d’intérêt.
Explication
Explication
Nous générons ici un signal composé de trois ondes sinusoïdales de fréquences différentes (1, 5 et
10), auquel nous ajoutons un bruit aléatoire d’amplitude maximale 10. Ce type de signal représente
un cas classique où la transformation de Fourier permet d’extraire les composantes périodiques
cachées dans un signal bruité.
Explication
Explication
Le filtrage spectral est réalisé en éliminant les composantes fréquentielles dont l’amplitude est
inférieure à un certain seuil (ici 400). Cette technique, appelée seuillage, permet d’éliminer le
bruit de faible amplitude tout en conservant les principales composantes du signal. La puissance
de l’indexation booléenne de NumPy rend cette opération extrêmement concise et efficace.
1 # Trans format ion de Fourier inverse : g n r e un nouveau signal temporel depuis le
spectre f i l t r
2 f il te r ed _s i gn a l = fftpack . ifft ( fourier )
3
4 # Visualisation des r s u l t a t s
5 plt . figure ( figsize =(12 , 8) )
6 plt . plot (x , y , lw =0.5 , label = ’ signal originel ’)
7 plt . plot (x , filtered_signal , lw =3 , label = ’ signal f i l t r ’)
8 plt . legend ()
9 plt . title ( " Comparaison du signal original et f i l t r " )
10 plt . xlabel ( " Temps " )
11 plt . ylabel ( " Amplitude " )
12 plt . show ()
Explication
Figure 32 – Comparaison entre le signal original bruité et le signal reconstruit après filtrage
Explication
Nous créons ici une image binaire simple avec un carré blanc au centre et des artefacts aléatoires
(pixels blancs) dispersés dans l’image. Cette situation est analogue à une image contenant du bruit
de type "sel et poivre", un problème courant en traitement d’images.
Explication
L’opération de binary_opening est une combinaison séquentielle d’une érosion suivie d’une dila-
tation. L’érosion élimine les pixels isolés et réduit les formes, tandis que la dilatation agrandit les
formes restantes. Cette opération est particulièrement efficace pour éliminer les petits artefacts
ou bruits tout en préservant les structures principales de l’image. Dans notre exemple, les pixels
blancs isolés sont supprimés, mais le carré central est préservé.
Explication
Nous chargeons une image de bactéries et la convertissons en niveaux de gris en ne conservant que
le premier canal de couleur. Cette préparation de l’image est une étape courante en traitement
d’images biologiques, où l’on s’intéresse principalement à l’intensité plutôt qu’à la couleur.
1 # Copie de l ’ image , puis c r a t i o n d ’ un histogramme
2 image_2 = np . copy ( image )
3 plt . hist ( image_2 . ravel () , bins =255)
4 plt . title ( " Histogramme des i n t e n s i t s de pixels " )
5 plt . xlabel ( " I n t e n s i t " )
6 plt . ylabel ( " Nombre de pixels " )
7 plt . show ()
Explication
L’histogramme nous permet d’analyser la distribution des intensités de pixels dans l’image. Cette
visualisation est cruciale pour déterminer un seuil approprié pour la binarisation de l’image. La
méthode ravel() transforme l’image 2D en un vecteur 1D, ce qui est nécessaire pour créer l’his-
togramme.
Explication
La binarisation transforme notre image en niveaux de gris en une image binaire (noir et blanc) en
appliquant un seuil. Tous les pixels dont l’intensité est inférieure à 0.6 sont mis à True (blanc),
les autres à False (noir). Cette étape simplifie considérablement l’image et facilite l’identification
des objets d’intérêt, dans ce cas les bactéries.
1 # Morphologie u t i l i s e pour enlever les artefacts
2 open_image = ndimage . bina ry_ope ning ( image )
3
4 plt . imshow ( open_image )
5 plt . title ( " Image a p r s nettoyage morphologique " )
6 plt . show ()
Explication
Comme dans l’exemple précédent, nous utilisons l’opération d’ouverture binaire pour nettoyer
l’image des petits artefacts qui pourraient être confondus avec des bactéries. Cette étape est
essentielle pour améliorer la précision de l’analyse quantitative qui suivra.
Explication
Figure 39 – Image segmentée avec chaque bactérie identifiée par une couleur différente
1 # Mesure de la taille de chaque groupe de label_images ( fait la somme des pixels )
2 sizes = ndimage . sum ( open_image , label_image , range ( n_labels + 1) )
3
4 # Visualisation des r s u l t a t s
5 plt . figure ( figsize =(10 , 6) )
6 plt . scatter ( range (1 , n_labels + 1) , sizes [1:])
7 plt . xlabel ( ’ B a c t r i e ID ’)
8 plt . ylabel ( ’ Taille relative ( pixels ) ’)
9 plt . title ( ’ Distribution des tailles de b a c t r i e s ’)
10 plt . grid ( True , alpha =0.3)
11 plt . tight_layout ()
12 plt . show ()
Explication
Finalement, nous mesurons la taille de chaque région identifiée en comptant le nombre de pixels
qu’elle contient. La fonction ndimage.sum() effectue cette opération efficacement en utilisant
l’image étiquetée comme masque. Le graphique résultant montre la distribution des tailles de bac-
téries, ce qui peut être utilisé pour des analyses statistiques ou pour identifier des sous-populations
dans l’échantillon. Notez que nous excluons l’identifiant 0 qui correspond généralement à l’arrière-
plan.
Explication
Nous importons ici les bibliothèques fondamentales pour l’analyse de données en Python : NumPy
pour les opérations numériques, Matplotlib pour la visualisation, et Pandas pour la manipulation
et l’analyse des données tabulaires.
Explication
Pandas offre plusieurs méthodes pour charger des données depuis divers formats. Ici, nous utilisons
read_excel() pour charger le célèbre jeu de données du Titanic. La méthode shape retourne
les dimensions du DataFrame (nombre de lignes et de colonnes), tandis que head() affiche les
premières lignes (15 dans ce cas) pour un aperçu rapide des données.
Explication
La méthode info() fournit un résumé concis du DataFrame, montrant les types de données
de chaque colonne, le nombre de valeurs non nulles, et l’utilisation de la mémoire. Cette vue
d’ensemble est essentielle pour identifier rapidement les colonnes avec des valeurs manquantes et
comprendre la structure des données.
1 data . describe ()
Explication
La méthode describe() calcule des statistiques descriptives pour chaque colonne numérique :
nombre d’observations, moyenne, écart-type, minimum, maximum, et quartiles. Cette vue d’en-
semble statistique est fondamentale pour comprendre la distribution des variables et détecter
d’éventuelles anomalies ou valeurs aberrantes.
Explication
Le nettoyage des données est une étape cruciale dans tout projet d’analyse. Ici, nous utilisons
drop() pour supprimer les colonnes non pertinentes pour notre analyse, en spécifiant axis=1
pour indiquer que nous supprimons des colonnes. Ensuite, dropna() avec axis=0 élimine toutes
les lignes contenant au moins une valeur manquante. La méthode shape confirme la nouvelle taille
du DataFrame après ces opérations.
Figure 44 – DataFrame après suppression des colonnes non pertinentes et des lignes avec valeurs man-
quantes
1 data [ ’ age ’ ]. hist ()
Explication
Explication
La méthode groupby() est l’une des fonctionnalités les plus puissantes de Pandas pour l’analyse
exploratoire. Elle permet de diviser les données en groupes selon une ou plusieurs variables, puis
d’appliquer diverses fonctions d’agrégation comme mean(). Ici, nous calculons la moyenne des
variables numériques pour chaque sexe, ce qui révèle notamment les différences de taux de survie
entre hommes et femmes.
Explication
Nous pouvons également effectuer des groupements plus complexes, comme ici par sexe et classe.
Cette analyse révèle comment le taux de survie varie non seulement selon le sexe, mais aussi selon
la classe sociale, mettant en évidence les intersections de ces facteurs.
Explication
La méthode value_counts() compte les occurrences de chaque valeur unique dans une série.
Ici, nous l’utilisons pour déterminer combien de passagers voyageaient dans chaque classe, ce qui
donne un aperçu de la répartition sociale à bord du Titanic.
Explication
En combinant le filtrage conditionnel (data[’age’] < 18) avec value_counts(), nous pouvons
effectuer des analyses plus spécifiques. Ici, nous examinons la répartition par classe des passagers
mineurs, révélant ainsi comment les enfants étaient distribués dans les différentes classes sociales.
Explication
La méthode map() permet d’appliquer une fonction à chaque élément d’une série. Ici, nous défi-
nissons une fonction category_ages() qui convertit l’âge numérique en catégories d’âge. Cette
transformation est utile pour les analyses qui nécessitent des groupes d’âge plutôt que des valeurs
continues.
1 data [ ’ sex ’ ]. astype ( ’ category ’) . cat . codes
Explication
Pour certaines analyses statistiques ou algorithmes de machine learning, il est nécessaire de conver-
tir les variables catégorielles en codes numériques. Ici, nous convertissons d’abord la colonne
’sex’ en type catégoriel avec astype(’category’), puis accédons aux codes numériques avec
cat.codes. Cette méthode attribue automatiquement un entier unique à chaque catégorie.
Explication
Lors du chargement de données temporelles avec Pandas, deux paramètres sont particulièrement
importants : index_col=’Date’ spécifie que la colonne "Date" doit être utilisée comme index, et
parse_dates=True indique à Pandas de convertir ces valeurs en objets datetime. Cette configura-
tion nous permet d’exploiter pleinement les fonctionnalités de Pandas pour les séries temporelles.
Explication
1 bitcoin . index
Explication
L’examen de l’index d’un DataFrame temporel nous permet de comprendre sa structure, sa fré-
quence et sa plage de dates. Nous pouvons voir que l’index est bien un DatetimeIndex, ce qui
confirme que Pandas a correctement interprété nos dates.
Explication
L’indexation temporelle permet des sélections intuitives de périodes avec la notation slice
(’start’:’end’). Ici, nous extrayons et visualisons les prix de clôture du Bitcoin de 2017 à
2019, ce qui nous permet d’analyser l’évolution du marché pendant cette période spécifique.
Explication
La méthode resample() est essentielle pour l’analyse des séries temporelles, car elle permet de
modifier la fréquence des données. Ici, ’M’ indique un rééchantillonnage mensuel, où chaque point
représente la dernière valeur du mois. Cette technique est utile pour réduire le bruit et observer
les tendances à plus long terme.
Explication
Explication
Explication
Explication
Pandas génère automatiquement un graphique avec des sous-tracés pour chaque statistique calcu-
lée par agg(). Cette visualisation permet de comparer facilement différentes mesures statistiques
sur la même période, révélant par exemple comment l’écart-type (volatilité) évolue par rapport à
la moyenne des prix.
Explication
Les moyennes mobiles sont des outils essentiels pour lisser les fluctuations à court terme et révéler
les tendances. La méthode rolling() calcule une moyenne mobile simple, avec options comme
center=True qui aligne la fenêtre au centre de la période plutôt qu’à la fin. La méthode ewm()
(Exponentially Weighted Moving average) donne plus de poids aux observations récentes, avec
alpha contrôlant ce biais : une valeur élevée donne plus d’importance aux données récentes.
1 plt . figure ( figsize =(12 , 8) )
2 bitcoin . loc [ ’ 2019 -09 ’ , ’ Close ’ ]. plot ()
3 for i in np . arange (0.2 , 1 , 0.2) :
4 bitcoin . loc [ ’ 2019 -09 ’ , ’ Close ’ ]. ewm ( alpha = i ) . mean () . plot ( label = f ’ ewm { i } ’ , ls = ’ -- ’ ,
alpha =0.8)
5 plt . legend ()
6 plt . show ()
Listing 104 – Effet du paramètre alpha sur les moyennes mobiles exponentielles
Explication
Cette visualisation explore l’impact du paramètre alpha sur les moyennes mobiles exponentielles.
Des valeurs d’alpha plus élevées produisent des moyennes qui réagissent plus rapidement aux
changements récents, tandis que des valeurs plus faibles donnent un lissage plus important. Le
choix optimal d’alpha dépend de l’application spécifique et du compromis souhaité entre réactivité
et stabilité.
Figure 61 – Effet de différentes valeurs d’alpha sur les moyennes mobiles exponentielles
Explication
Pour comparer deux séries temporelles, nous commençons par charger les données d’Ethereum
de manière similaire à celles du Bitcoin. La fonction pd.merge() combine les deux DataFrames
en utilisant les dates comme clé de jointure, avec how=’inner’ pour ne conserver que les dates
présentes dans les deux jeux de données. L’option subplots=True crée un graphique par série,
facilitant la comparaison visuelle des tendances entre Bitcoin et Ethereum.
Listing 106 – Implémentation d’une stratégie de trading basée sur les extremums glissants
Explication
Cet exercice implémente une stratégie de trading simple basée sur des seuils adaptatifs. Nous
calculons le maximum et le minimum glissants sur une fenêtre de 28 jours, en utilisant shift(1)
pour ne considérer que les données disponibles à chaque point de décision (évitant ainsi le biais
d’anticipation). Les signaux d’achat sont générés lorsque le prix actuel dépasse le maximum récent
(potentielle tendance haussière), et les signaux de vente lorsque le prix tombe sous le minimum
récent (potentielle tendance baissière). La visualisation en deux parties permet d’observer simul-
tanément l’évolution des prix et les signaux générés par la stratégie. Ce type d’analyse est un
exemple simple d’application des séries temporelles à la finance quantitative.
Figure 63 – Stratégie de trading basée sur les extremums glissants appliquée au Bitcoin en 2019
Explication
Seaborn intègre plusieurs jeux de données prêts à l’emploi, comme le célèbre jeu de données Iris
utilisé ici. La méthode load_dataset() simplifie l’accès à ces données d’exemple, idéales pour
explorer les fonctionnalités de visualisation de la bibliothèque.
Explication
La fonction pairplot() est un outil puissant qui crée une matrice de graphiques montrant les
relations entre toutes les paires de variables numériques. Le paramètre hue colore les points selon
une variable catégorielle, permettant de visualiser rapidement comment les différentes espèces
d’iris se distinguent selon leurs caractéristiques. Cette visualisation est particulièrement utile pour
explorer les corrélations multivariées et identifier des motifs de séparation entre catégories.
Explication
Le jeu de données Titanic est couramment utilisé pour l’analyse de données catégorielles. Nous
préparons les données en supprimant certaines colonnes redondantes et en éliminant les lignes
contenant des valeurs manquantes avec dropna(). Cette étape de nettoyage est essentielle pour
garantir des visualisations fiables et interprétables.
Explication
La fonction catplot() est spécialisée dans la visualisation des relations entre variables catégorielles
et numériques. Ici, nous examinons la distribution des âges selon le statut de survie et le genre.
Ce type de graphique permet d’identifier rapidement des tendances démographiques, comme la
priorité donnée aux femmes et aux enfants lors de l’évacuation du Titanic.
Explication
Les boîtes à moustaches (boxplots) sont idéales pour comparer des distributions numériques. Ici,
nous analysons la relation entre l’âge et le prix du billet, avec une stratification par genre. Ce
graphique révèle non seulement les tendances centrales, mais aussi la dispersion et les valeurs
aberrantes dans chaque groupe, offrant une vision complète de la distribution des tarifs selon l’âge
et le genre des passagers.
Explication
La fonction distplot() combine un histogramme avec une estimation de densité par noyau
(KDE), offrant une représentation complète de la distribution d’une variable numérique. Cette
visualisation de la distribution des tarifs du Titanic révèle une forte asymétrie positive, avec de
nombreux passagers ayant payé des tarifs bas et quelques-uns des tarifs très élevés.
1 sns . jointplot ( ’ age ’ , ’ fare ’ , data = titanic , kind = ’ hex ’)
Explication
La fonction jointplot() crée une visualisation qui combine un nuage de points central avec des
histogrammes marginaux, permettant d’examiner simultanément la distribution conjointe et les
distributions marginales de deux variables. L’option kind=’hex’ génère un graphique hexbin,
particulièrement adapté pour visualiser des densités dans des jeux de données volumineux en
évitant la surcharge visuelle. Cette visualisation révèle la relation complexe entre l’âge et le tarif
payé par les passagers du Titanic.
Explication
La fonction heatmap() est idéale pour visualiser des matrices de données, en particulier des ma-
trices de corrélation. Les couleurs représentent l’intensité des corrélations entre paires de variables,
facilitant l’identification rapide des relations fortes ou faibles. Cette carte thermique des corréla-
tions dans le jeu de données Titanic permet d’identifier quelles variables sont les plus liées au taux
de survie et entre elles.
5 Machine Learning
Le Machine Learning (apprentissage automatique) consiste à développer un modèle mathématique à
partir de données expérimentales. Il existe plusieurs types d’apprentissage :
— Apprentissage supervisé
— Apprentissage non supervisé
— Apprentissage par renforcement
5.1.1 Régression
1 import numpy as np
2 import matplotlib . pyplot as plt
3 import seaborn as sns
4
5 np . random . seed (0)
6 m = 100 # c r a t i o n de 100 chantillons
7 X = np . linspace (0 , 10 , m ) . reshape (m ,1)
8 y = X + np . random . randn (m , 1)
9 plt . scatter (X , y )
Explication
Pour illustrer la régression linéaire, nous générons un jeu de données synthétique avec une relation
linéaire entre X et y, à laquelle nous ajoutons un bruit gaussien. La visualisation sous forme
de nuage de points permet d’observer cette relation linéaire bruitée, typique des problèmes de
régression réels.
1 from sklearn . linear_model import L i n e a r R e g r e s s i o n
2
3 model = L i n e a r R e g r e s s i o n ()
4 model . fit (X , y ) # e n t r a n e m e n t du m o d l e
5 model . score (X , y ) # valuation avec le coefficient de c o r r l a t i o n
6 model . predict ( X )
7
8 plt . scatter (X , y )
9 plt . plot (X , model . predict ( X ) , c = ’ red ’)
Explication
5.1.2 Classification
1 titanic = sns . load_dataset ( ’ titanic ’)
2 titanic = titanic [[ ’ survived ’ , ’ pclass ’ , ’ sex ’ , ’ age ’ ]]
3 titanic . dropna ( axis =0 , inplace = True )
4 titanic [ ’ sex ’ ]. replace ([ ’ male ’ , ’ female ’] , [0 , 1] , inplace = True )
5 titanic . head ()
Explication
Pour notre exemple de classification, nous utilisons le célèbre jeu de données du Titanic. Nous
sélectionnons les variables les plus pertinentes pour prédire la survie des passagers : la classe
(pclass), le sexe (sex) et l’âge (age). Nous nettoyons les données en supprimant les lignes avec
des valeurs manquantes et en encodant la variable catégorielle sex en valeurs numériques.
1 from sklearn . neighbors import K N e i g h b o r s C l a s s i f i e r
2
3 model = K N e i g h b o r s C l a s s i f i e r ()
4 y = titanic [ ’ survived ’]
5 X = titanic . drop ( ’ survived ’ , axis =1)
6
7 model . fit (X , y ) # e n t r a n e m e n t du m o d l e
8 model . score (X , y ) # valuation
Explication
Pour la classification, nous utilisons l’algorithme des k plus proches voisins (KNN) implémenté
dans la classe KNeighborsClassifier. Nous séparons les données en features X et labels y, puis
entraînons le modèle. La méthode score() calcule la précision du modèle sur les données d’entraî-
nement. Notez que dans un contexte réel, il serait préférable de diviser les données en ensembles
d’entraînement et de test pour évaluer correctement les performances du modèle.
Explication
Nous créons une fonction utilitaire survie() qui prédit la probabilité de survie d’un passager en
fonction de sa classe, son sexe et son âge. La fonction utilise predict() pour obtenir la prédiction
binaire (0 ou 1) et predict_proba() pour obtenir les probabilités associées à chaque classe. Par
défaut, la fonction prédit la survie d’un homme de 26 ans voyageant en 3ème classe.
Exercice
Écrire un code qui permet de trouver la meilleure valeur du paramètre n_neighbors pour le modèle
KNeighborsClassifier. Dans sklearn, il est possible de faire cela avec la classe GridSearchCV. Mais
il peut également être utile de savoir écrire soi-même ce genre de code de recherche.
Solution
1 # SOLUTION
2 score = []
3 best_k = 1
4 best_score = 0
5 for k in range ( best_k , 30) :
6 model = K N e i g h b o r s C l a s s i f i e r ( n_neighbors = k )
7 model . fit (X , y )
8 score . append ( model . score (X , y ) )
9
10 if best_score < model . score (X , y ) :
11 best_k = k
12 best_score = model . score (X , y )
13 print ( best_k )
14 plt . plot ( score )
Explication
Cette solution implémente une recherche manuelle du meilleur hyperparamètre n_neighbors pour
l’algorithme KNN. Pour chaque valeur de k de 1 à 30, nous entraînons un nouveau modèle et en-
registrons sa précision. Nous gardons trace du k donnant la meilleure précision. Le graphique
montre l’évolution de la précision en fonction du nombre de voisins, ce qui aide à comprendre le
compromis entre sous-ajustement et sur-ajustement. Notons que cette approche utilise les mêmes
données pour l’entraînement et l’évaluation, ce qui peut conduire à du sur-ajustement ; une vali-
dation croisée serait plus appropriée dans un contexte réel.
Explication
Nous utilisons ici le célèbre jeu de données Iris, intégré à scikit-learn. La fonction load_iris()
charge les données sous forme de tableau :
— iris.data contient les caractéristiques (features)
— iris.target contient les classes (étiquettes)
La visualisation permet d’observer la séparation naturelle des classes selon deux caractéristiques :
la longueur et la largeur du sépale.
Figure 76 – Distribution des trois espèces d’iris selon les caractéristiques des sépales
Explication
Train-test split
model.fit(X_train, model.score(X_test,
y_train) y_test)
1 # En pratique :
2 plt . figure ( figsize =(12 , 4) )
3 plt . subplot (121)
4 plt . scatter ( X_train [: , 0] , X_train [: , 1] , c = y_train , alpha =0.8)
5 plt . title ( ’ Train set ’)
6 plt . subplot (122)
7 plt . scatter ( X_test [: , 0] , X_test [: , 1] , c = y_test , alpha =0.8)
8 plt . title ( ’ Test set ’)
Explication
Explication
Explication
Figure 82 – Courbes de validation montrant les performances sur les ensembles d’entraînement et de
validation
5.7 GridSearchCV
GridSearchCV construit une grille de modèles avec toutes les combinaisons d’hyperparamètres pos-
sibles définies dans param_grid.
Explication
Explication
Explication
La fonction learning_curve évalue les performances du modèle avec des sous-ensembles croissants
des données d’entraînement :
— train_sizes spécifie les proportions des données à utiliser (de 10% à 100%)
— Les courbes permettent de détecter le sur-apprentissage ou sous-apprentissage
— Un écart important entre les scores d’entraînement et de validation indique un sur-
apprentissage
— Des scores faibles sur les deux ensembles suggèrent un sous-apprentissage
Figure 87 – Courbes d’apprentissage montrant l’évolution des performances en fonction de la taille des
données
Explication
Divise les données en 5 sous-ensembles (ou folds). À chaque itération, un fold est utilisé pour le
test, et les autres pour l’entraînement.
1 # Cross - validation avec Leave - One - Out
2 c ro ss _ va l_ s co r e ( estimateur , X_train , y_train , cv = LeaveOneOut () )
Explication
Chaque exemple devient un fold. Cela signifie que si vous avez n données, il y aura n itérations.
À chaque itération, une seule donnée est utilisée pour le test, et le reste pour l’entraînement.
Explication
Divise aléatoirement les données en ensembles d’entraînement et de test, répété 4 fois. Chaque
fois, 20% des données sont utilisées pour le test, et le reste pour l’entraînement.
Explication
L’erreur quadratique moyenne est une métrique couramment utilisée pour évaluer la performance
des modèles de régression en apprentissage automatique.
n
1X
MSE = (yi − ŷi )2 (1)
n i=1
où :
— n : Nombre de données (échantillons).
— yi : Valeur réelle (observée) pour l’échantillon i.
— ŷi : Prédiction du modèle pour l’échantillon i.
Exercice
1
MSE = [(3 − 4)2 + (5 − 4)2 + (2 − 3)2 ]
3
1
= · (1 + 1 + 1)
3
=1
Explication
Plus facile à interpréter que le MSE, c’est la racine carrée de l’erreur quadratique moyenne.
v
u n
√ u1 X
RMSE = MSE = t (yi − ŷi )2 (2)
n i=1
Exercice
Considérons un nouvel ensemble de valeurs réelles et prédites :
Solution
1. Calcul des erreurs :
— Pour y1 = 10, ŷ1 = 8 : erreur = (10 − 8)2 = 22 = 4
— Pour y2 = 12, ŷ2 = 15 : erreur = (12 − 15)2 = (−3)2 = 9
— Pour y3 = 14, ŷ3 = 13 : erreur = (14 − 13)2 = 12 = 1
2. Calcul du MSE :
4+9+1
MSE =
3
14
=
3
≈ 4.67
3. Calcul du RMSE :
√
RMSE = MSE
√
= 4.67
≈ 2.16
5.11.2.1 Interprétation
— MSE : La valeur de MSE est d’environ 4.67, exprimée dans les unités au carré de la variable
cible.
— RMSE : La valeur de RMSE est d’environ 2.16, ce qui est plus facile à interpréter car elle
est dans les mêmes unités que les valeurs réelles.
5.11.2.2 Conclusion Cet exemple montre comment le MSE et le RMSE peuvent avoir des
valeurs différentes, mais ils mesurent tous deux la même chose : l’erreur entre les valeurs prédites
et réelles. Le RMSE est souvent préféré pour son interprétabilité directe, tandis que le MSE peut
être utilisé pour des analyses plus techniques.
Explication
Erreur absolue moyenne. Utilise la valeur absolue au lieu du carré, donc moins sensible aux grandes
erreurs. Donne une vision globale des écarts moyens.
n
1X
MAE = |yi − ŷi | (3)
n i=1
Exercice
Solution
1. Calcul des erreurs absolues :
— Pour y1 = 10, ŷ1 = 8 : erreur absolue = |10 − 8| = |2| = 2
— Pour y2 = 12, ŷ2 = 15 : erreur absolue = |12 − 15| = | − 3| = 3
— Pour y3 = 14, ŷ3 = 13 : erreur absolue = |14 − 13| = |1| = 1
2. Calcul du MAE :
2+3+1
MAE =
3
6
=
3
=2
Explication
5.11.3.2 Interprétation Le MAE est une mesure de l’erreur moyenne entre les valeurs
réelles et les valeurs prédites. Dans cet exemple, le MAE est de 2, ce qui signifie qu’en
moyenne, les prédictions sont à 2 unités de la valeur réelle.
5.11.3.3 Conclusion Le MAE donne une compréhension de l’amplitude moyenne des
erreurs. Contrairement au MSE et RMSE, il n’élève pas les erreurs au carré, ce qui fait
qu’il est moins sensible aux grandes erreurs individuelles.
Explication
Le coefficient de détermination, noté R2 , est une mesure statistique qui évalue l’efficacité d’un
modèle de régression linéaire. Il quantifie la proportion de la variance de la variable dépendante
qui est expliquée par les variables indépendantes.
SSrésidu
R2 = 1 − (4)
SStotal
5.12.1.1 Propriétés de R2
— Valeurs possibles : R2 varie entre 0 et 1.
— Interprétation : Plus R2 est proche de 1, meilleure est l’adéquation du modèle aux don-
nées.
— Limites : L’ajout de variables peut artificiellement augmenter R2 . Pour remédier à cela,
on utilise souvent le R2 ajusté.
Explication
La précision et le rappel sont deux métriques essentielles pour évaluer la performance des modèles
de classification.
5.12.2.3 Importance du Compromis Ces deux métriques sont souvent utilisées ensemble
pour donner une vue d’ensemble sur la performance du modèle, en particulier à travers la courbe
précision-rappel.
5.12.3 F1-score
Explication
Le F1-score est une métrique essentielle pour évaluer la performance des modèles de classification,
en particulier dans les cas où les classes sont déséquilibrées. Il représente un compromis entre la
précision et le rappel.
5.12.3.2 Interprétation
— Valeurs possibles : Le F1-score varie entre 0 et 1. Un score de 1 indique une précision et
un rappel parfaits.
— Utilisation : Il est particulièrement utile dans des contextes tels que la détection de fraudes
ou la classification de maladies.
Explication
5.12.3.3 Comparaison des Métriques Voici un tableau récapitulatif des différentes mé-
triques discutées :
Explication
Solution
Rappel
T P0
Rappel0 =
T P0 + F N0
8
=
8+0
= 1.00
F1-score
2 × (Précision0 × Rappel0 )
F 10 =
Précision0 + Rappel0
2 × (1.00 × 1.00)
=
1.00 + 1.00
= 1.00
Rappel
T P1
Rappel1 =
T P1 + F N1
9
=
9+0
= 1.00
F1-score
2 × (Précision1 × Rappel1 )
F 11 =
Précision1 + Rappel1
2 × (0.82 × 1.00)
=
0.82 + 1.00
2(0.82)
=
BDCC-S3-2024-2025 1.82 97 Mohamed Ouazze
≈ 0.90
5 MACHINE LEARNING
Solution
5.13.2.5 Conclusion Ces calculs montrent comment évaluer les performances d’un modèle de
classification en utilisant une matrice de confusion pour extraire des métriques clés telles que la
précision, le rappel et le F1-score pour chaque classe.
Explication
Solution
À partir de cette matrice, nous pouvons calculer plusieurs métriques importantes pour chaque
classe.
2. Rappel :
T PPomme 50 50
RappelPomme = = = ≈ 0.94 (9)
T PPomme + F NPomme 50 + 3 53
3. F1-score :
2 × (0.91 × 0.94) 2 × 0.8554
F 1Pomme = = ≈ 0.92 (10)
0.91 + 0.94 1.85
5.14.2.5 Conclusion Cet exemple illustre comment les concepts de TP, FP, FN et TN peuvent
être utilisés pour évaluer les performances d’un modèle de classification multi-classes à l’aide d’une
matrice de confusion, en calculant les métriques clés pour chaque classe.
Explication
Le prétraitement des données représente parfois jusqu’à 80% du travail d’un data scientist. Une
étape clé consiste à convertir les variables qualitatives (catégorielles) en valeurs numériques
exploitables par les algorithmes de machine learning.
Explication
Explication
Solution
1. Utilisation de LabelEncoder
1 import numpy as np
2 from sklearn . preprocessing import LabelEncoder
3
4 # D o n n e s de d p a r t
5 y = np . array ([ ’ chat ’ , ’ chien ’ , ’ chat ’ , ’ oiseau ’ ])
6
7 # C r a t i o n de l ’ encodeur
8 encoder = LabelEncoder ()
9
10 # Apprentissage des classes et tr ansfor mation
11 enc oded_l abels = encoder . fit_transform ( y )
12
13 print ( enc oded_l abels )
14
Résultat :
array([0, 1, 0, 2], dtype=int64)
Chaque animal est associé à un entier :
— chat → 0
— chien → 1
— oiseau → 2
2. Décodage inverse (reconnaître les classes)
1 # D c o d a g e inverse
2 dec oded_l abels = encoder . i n v e r s e _ t r a n s f o r m ( np . array ([0 , 0 , 2]) )
3 print ( dec oded_l abels )
4
Résultat :
array([’chat’, ’chat’, ’oiseau’], dtype=’<U6’)
Cela permet de retrouver les classes originales à partir des indices numériques.
Solution
Contrairement à LabelEncoder, OneHotEncoder transforme chaque catégorie en un vecteur bi-
naire.
1 from sklearn . preprocessing import OneHotEncoder
2
3 # Reshape des d o n n e s ( OneHotEncoder attend des d o n n e s 2 D )
4 X = y . reshape ( -1 , 1)
5
6 # C r a t i o n de l ’ encodeur
7 oneh ot_enc oder = OneHotEncoder ()
8
9 # Transf ormati on des d o n n e s
10 encoded_data = one hot_en coder . fit_transform ( X )
11
12 # Conversion du r s u l t a t en tableau NumPy
13 result_array = encoded_data . toarray ()
14
15 print ( " R s u l t a t en tableau NumPy : " )
16 print ( result_array )
Résultat obtenu :
1. 0. 0. 0. 1.
0. 1. 0. 0. 1.
1. 0. 0. 0. 1.
0. 0. 1. 1. 0.
Chaque ligne représente une instance, chaque colonne une catégorie :
— 1 signifie présence de la classe,
— 0 signifie absence.
5.15.5 Résumé
Explication
L’encodage est une étape fondamentale avant d’entraîner un modèle de Machine Learning.
5.16 Normalisation
Explication
La normalisation est une technique utilisée pour ajuster les valeurs des données afin qu’elles
soient dans une plage commune, souvent entre 0 et 1. C’est crucial pour les algorithmes de machine
learning sensibles à l’échelle des données.
Explication
5.16.2 MinMaxScaler
Solution
Le MinMaxScaler réduit les données dans une plage donnée (par défaut entre 0 et 1), selon la
formule :
X − Xmin
Xscaled =
Xmax − Xmin
Exemple :
Pour des âges [20, 30, 40, 50, 60], l’âge 30 serait normalisé comme suit :
30 − 20 10
Xscaled = = = 0.25
60 − 20 40
Solution
Le StandardScaler transforme les données pour qu’elles aient :
— une moyenne de 0,
— un écart-type de 1.
La formule est :
X −µ
Xstandardisé =
σ
où :
— X : valeur originale
— µ : moyenne
— σ : écart-type
Exemple :
Pour des âges [20, 30, 40, 50, 60] :
20 + 30 + 40 + 50 + 60
µ= = 40
5
r
(20 − 40)2 + (30 − 40)2 + (40 − 40)2 + (50 − 40)2 + (60 − 40)2
σ= ≈ 14.14
5
Pour l’âge 30 :
30 − 40
Xstandardisé = ≈ −0.707
14.14
Application sur le dataset Iris :
1 # S ta n da rd i sa ti o n
2 X_stdscl = Stand ardSca ler () . fit_transform ( X )
3
4 # Visualisation
5 plt . scatter ( X [: , 2] , X [: , 3] , label = ’ Original ’)
6 plt . scatter ( X_stdscl [: , 2] , X_stdscl [: , 3] , label = ’ S t a n d a r d i s ’)
7 plt . legend ()
8 plt . title ( " St andard Scaler " )
9 plt . show ()
5.16.4 RobustScaler
Solution
Le RobustScaler est une méthode plus robuste face aux valeurs aberrantes (outliers). Il utilise
la médiane et l’écart interquartile (IQR) pour transformer les données.
La formule est :
X − médiane
Xrobust =
IQR
où :
IQR = Q3 − Q1
(Q1 = 25% percentile, Q3 = 75% percentile)
Exemple :
Pour des âges [20, 30, 40, 50, 1000] :
— Médiane = 40
— Q1 = 30
— Q3 = 50
— IQR = 50 - 30 = 20
Pour l’âge 30 :
30 − 40
Xrobust = = −0.5
20
5.16.5 Conclusion
Explication
Explication
Exemple :
(x0 , x1 , x2 ) pour les valeurs suivantes [1, 2, 0.5]
x0 x1 x2
1 1 1
1 2 4
1 0.5 0.25
1 from sklearn . preprocessing import P o l y n o m i a l F e a t u r e s
2 from sklearn . linear_model import L i n e a r R e g r e s s i o n
3
4 m = 100
5 X = np . linspace (0 , 4 , m ) . reshape (( m , 1) )
6 y = X **2 + 5* np . cos ( X ) + np . random . randn (m , 1)
7
8 model = L i n e a r R e g r e s s i o n () . fit (X , y )
9 y_pred = model . predict ( X )
10
11 plt . scatter (X , y )
12 plt . plot (X , y_pred , c = ’r ’ , lw =3)
Le code ci-dessus génère des données X avec une relation quadratique, ajoutée à une composante
aléatoire (bruit) dans y. Un modèle de régression linéaire est ensuite ajusté aux données (X, y),
et la prédiction est tracée avec la ligne rouge pour comparer la sortie du modèle avec les points
de données réels.
Explication
Ici, la transformation polynomiale est appliquée avec un degré de 3, ce qui crée des caractéristiques
supplémentaires (x2 , x3 , etc.). Le modèle de régression linéaire est maintenant ajusté sur ces
nouvelles caractéristiques polynomiales, ce qui permet au modèle de capturer une relation plus
complexe entre les données.
5.18 Discrétisation
La discrétisation est le processus de transformation de données continues (c’est-à-dire des données
numériques qui peuvent prendre une large gamme de valeurs) en catégories ou classes distinctes. Cela
consiste à diviser une variable continue en plusieurs intervalles ou bins (groupes) pour la rendre plus facile
à traiter, en particulier dans des modèles qui fonctionnent mieux avec des données catégorielles.
Explication
Le Binarizer transforme les valeurs continues en 0 ou 1 en fonction d’un seuil défini. Dans cet
exemple, les valeurs de X supérieures ou égales à 3 sont transformées en 1, et les autres en 0. Cela
permet de convertir une variable continue en une variable binaire.
Résultat :
X Discretized
0.0 0
0.56 0
1.11 0
1.67 0
2.22 0
2.78 0
3.33 1
3.89 1
4.44 1
5.0 1
1 K B i n s D i s c r e t i z e r ( n_bins =6) . fit_transform ( X ) . toarray ()
Le KBinsDiscretizer divise les données en 6 groupes égaux, transformant ainsi les valeurs conti-
nues en vecteurs binaires où chaque colonne représente un intervalle dans lequel la valeur d’origine
se situe. C’est une manière de convertir des variables continues en variables catégorielles avec
plusieurs classes.
Résultat :
1.0 0.0 0.0 0.0 0.0 0.0
1.0 0.0 0.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0 0.0 0.0
0.0 0.0 1.0 0.0 0.0 0.0
0.0 0.0 1.0 0.0 0.0 0.0
0.0 0.0 0.0 1.0 0.0 0.0
0.0 0.0 0.0 0.0 1.0 0.0
0.0 0.0 0.0 0.0 1.0 0.0
0.0 0.0 0.0 0.0 0.0 1.0
0.0 0.0 0.0 0.0 0.0 1.0
5.19 Pipelines
Une pipeline (pipeline de machine learning) est une série d’étapes ou de transformations appliquées
aux données, suivies d’un modèle d’apprentissage automatique. Elle permet de simplifier et d’automatiser
le processus de préparation des données, de transformation et de modélisation, tout en s’assurant que
toutes les étapes nécessaires sont correctement enchaînées.
Explication
Dans ce code, un pipeline est créé avec make_pipeline en enchaînant deux étapes :
StandardScaler() pour la normalisation des données et SGDClassifier() pour l’apprentissage
supervisé. Le modèle est ensuite ajusté et évalué sur les ensembles d’entraînement et de test.
Résultat :
Score : 0.9736842105263158
Explication
1 from sklearn . m od el _ se le c ti on import GridSearchCV
2
3 model = make_pipeline ( P o l y n o m i a l F e a t u r e s () ,
4 Sta ndardS caler () ,
5 SGDClassifier ( random_state =0) )
6
7 params = {
8 ’ p o l y n o m i a l f e a t u r e s _ _ d e g r e e ’: [2 , 3 , 4] ,
9 ’ s g d c l a s s i f i e r _ _ p e n a l t y ’: [ ’ l1 ’ , ’ l2 ’]
10 }
11
12 grid = GridSearchCV ( model , param_grid = params , cv =4)
13 grid . fit ( X_train , y_train )
Dans ce code, nous utilisons GridSearchCV pour tester différentes combinaisons d’hyperparamètres
pour les caractéristiques polynomiales et le classificateur SGD. Nous cherchons les meilleures
configurations de modèle en utilisant la validation croisée (cv=4).
Résultat du GridSearchCV :
Explication
5.21.1 make_column_selector
make_column_selector est une fonction utilisée pour sélectionner des colonnes d’un DataFrame
en fonction de leur type (numérique, catégorielle, etc.). Elle est utile pour spécifier dynamiquement
quelles colonnes transformer dans un pipeline.
5.21.2 make_union
make_union permet de combiner plusieurs transformations dans une seule étape de pipeline. Elle
applique les transformations spécifiées à toutes les colonnes et les fusionne ensuite dans une seule
sortie.
5.21.3 Pipelines avec nettoyage de données
— SimpleImputer : dans sklearn.imputer on a cette méthode qui remplace les valeurs
manquantes par une valeur statistique.
1 Imputer = SimpleImputer ( m issing _value s = np . nan , strategy = ’ ’)
2 # strategy = [ mean , median , most_frequent .. ]
3
— KNNImputer : remplace toutes les valeurs manquantes par les valeurs du plus proche
voisin.
— MissingIndicator : parfois l’absence de données est une information en soi et représente
une caractéristique.
Explication
1 from sklearn . impute import SimpleImputer
2 from sklearn . preprocessing import StandardScaler , OneHotEncoder
3 from sklearn . pipeline import make_pipeline
4 from sklearn . compose import C o l u m n T r a n s f o r m e r
5 from sklearn . linear_model import SGDClassifier
6 from sklearn . m od el _ se le c ti on import t r a i n _ t e s t _ s p l i t
7 import pandas as pd
8
9 # Exemple de DataFrame
10 data = {
11 ’ column1 ’: [1 , 2 , 3 , 4 , 5 , None , 7] ,
12 ’ column2 ’: [2 , 3 , 4 , None , 6 , 7 , 8] ,
13 ’ column3 ’: [ ’A ’ , ’B ’ , ’A ’ , ’B ’ , ’A ’ , ’A ’ , ’B ’] , # Colonne c a t g o r i e l l e
14 ’ column4 ’: [ ’X ’ , ’Y ’ , ’X ’ , ’Y ’ , ’X ’ , ’X ’ , ’Y ’] , # Autre colonne c a t g o r i e l l e
15 ’ target ’: [0 , 1 , 0 , 1 , 0 , 1 , 0]
16 }
17
18 # C r e r un DataFrame
19 df = pd . DataFrame ( data )
20
21 # S p a r e r les c a r a c t r i s t i q u e s ( X ) et la cible ( y )
22 X = df . drop ( ’ target ’ , axis =1)
23 y = df [ ’ target ’]
24
25 # Variables n u m r i q u e s et c a t g o r i e l l e s
26 numeric_vars = [ ’ column1 ’ , ’ column2 ’]
27 c a t e g o r i ca l _ v a r s = [ ’ column3 ’ , ’ column4 ’]
28
29 # Pipeline pour les variables n u m r i q u e s
30 n u m e r i c _ pi p e l i n e = make_pipeline (
31 SimpleImputer () , # Imputer les valeurs manquantes
32 Stan dardSc aler () # Normalisation des d o n n e s n u m r i q u e s
33 )
34
35 # Pipeline pour les variables c a t g o r i e l l e s
36 c a t e g o r i c a l _ p i p e l i n e = make_pipeline (
37 SimpleImputer ( strategy = ’ most_frequent ’) , # Imputer les valeurs manquantes avec
la m o d a l i t la plus f r q u e n t e
38 OneHotEncoder () # Encoder les variables c a t g o r i e l l e s
39 )
40
41 # P r p r o c e s s e u r utilisant C o l u m n T r a n s f o r m e r
42 preprocessor = C o l u m n T r a n s f o r m e r (
43 transformers =[
44 ( ’ num ’ , numeric_pipeline , numeric_vars ) , # Applique la pipeline des
variables n u m r i q u e s
45 ( ’ cat ’ , categorical_pipeline , c a t e g o r i c a l _ v a r s ) # Applique la pipeline des
variables c a t g o r i e l l e s
46 ]
47 )
48
49 # M o d l e de machine learning avec le p r p r o c e s s e u r
50 model = make_pipeline (
51 preprocessor , # Appliquer le p r p r o c e s s e u r avant d ’ e n t r a n e r le m o d l e
52 SGDClassifier () # M o d l e d ’ apprentissage ( ici , SGDClassifier )
53 )
54
55 # Diviser les d o n n e s en ensembles d ’ e n t r a n e m e n t et de test
56 X_train , X_test , y_train , y_test = t r a i n _ t e s t _ s p l i t (X , y , test_size =0.3 ,
random_state =42)
57
58 # E n t r a n e r le m o d l e
59 model . fit ( X_train , y_train )
60
61 # valuer le m o d l e sur les d o n n e s de test
62 accuracy = model . score ( X_test , y_test )
63 print ( f " Accuracy sur les d o n n e s de test : { accuracy :.2 f } " )
Explication
Dans cet exemple, nous construisons un pipeline complet pour traiter un dataset hétérogène.
Le préprocesseur utilise ColumnTransformer pour appliquer des transformations différentes aux
variables numériques et catégorielles. Pour les variables numériques, nous imputons les valeurs
manquantes et standardisons les données, tandis que pour les variables catégorielles, nous imputons
les valeurs manquantes avec la modalité la plus fréquente et appliquons un encodage one-hot. Les
étapes clés sont :
1. Séparation des variables numériques et catégorielles
2. Création de pipelines spécifiques pour chaque type de variable
3. Combinaison des pipelines avec ColumnTransformer
4. Intégration du préprocesseur dans un pipeline final avec le modèle
Ce type de pipeline est particulièrement utile pour les datasets du monde réel qui contiennent
souvent différents types de variables et des valeurs manquantes.
Explication
Explication
Cette méthode élimine les variables dont la variance est inférieure à un certain seuil. Pour effectuer
des prédictions, un estimateur a besoin d’informations qui varient en accord avec la variable target.
1 from sklearn . f e a t u r e _ s e l e c t i o n import V a r i a n c e T h r e s h o l d
2 from sklearn . datasets import load_iris
3
4 iris = load_iris ()
5 X = iris . data
6 y = iris . target
7
8 plt . plot ( X )
9 plt . legend ( iris . feature_names )
Explication
Résultat :
array([0.68112222, 0.18871289, 3.09550267, 0.57713289])
Maintenant, appliquons un seuil de variance pour sélectionner les caractéristiques :
1 selector = V a r i a n c e T h r e s h o l d ( threshold =0.2)
2 selector . fit ( X )
Résultat :
VarianceThreshold(threshold=0.2)
Voyons quelles caractéristiques ont été sélectionnées :
1 selector . get_support ()
Résultat :
Résultat :
array([’sepal length (cm)’, ’petal length (cm)’, ’petal width (cm)’], dtype=’<U17’)
Explication
Résultat :
array([0.68112222, 0.18871289, 3.09550267, 0.57713289])
La méthode VarianceThreshold a éliminé la caractéristique sepal width (cm) car sa variance
(0.189) est inférieure au seuil fixé (0.2). Les trois autres caractéristiques ont été conservées car
leurs variances sont supérieures au seuil. Cette méthode est utile pour éliminer les caractéristiques
qui varient peu et qui, par conséquent, apportent peu d’information au modèle.
5.22.2 SelectKBest
Explication
Cette méthode sélectionne les K variables dans X dont le score du test de dépendance avec y est
le plus élevé.
Exemple : la fonction chi2(x,y) retourne deux tableaux numpy :
1. Les scores des variables (plus le score est élevé, plus la variable est significative)
2. Les p-valeurs (probabilité que la relation observée soit due au hasard)
1 from sklearn . f e a t u r e _ s e l e c t i o n import SelectKBest , chi2 , f_classif
2
3 chi2 (X , y )
Résultat :
Résultat :
array([’petal length (cm)’, ’petal width (cm)’], dtype=’<U17’)
SelectKBest avec f_classif a sélectionné les deux caractéristiques ayant les scores F les plus
élevés : petal length (cm) et petal width (cm). Ces scores F indiquent que ces caractéristiques
ont une forte relation statistique avec la variable cible. La fonction f_classif utilise le test
ANOVA F pour évaluer la relation entre chaque caractéristique et la cible.
Explication
Cette méthode sélectionne les variables en se basant sur le coefficient d’un estimateur en l’en-
traînant de manière récursive. Elle élimine les variables selon les coefficients les plus faibles
de l’estimateur.
1 from sklearn . f e a t u r e _ s e l e c t i o n import RFECV
2 from sklearn . linear_model import SGDClassifier
3
4 selector = RFECV ( SGDClassifier ( random_state =0) , step =1 , m i n _ f e a t u r e s _ t o _ s e l e c t =2 ,
cv =5)
5 selector . fit (X , y )
6 print ( selector . ranking_ )
7 print ( selector . grid_scores_ )
Résultat :
[2 1 1 1]
[0.8 0.84666667 0.77333333]
Les caractéristiques sélectionnées :
1 np . array ( iris . feature_names ) [ selector . get_support () ]
Résultat :
array([’sepal width (cm)’, ’petal length (cm)’, ’petal width (cm)’], dtype=’<U17’)
RFECV (Recursive Feature Elimination with Cross-Validation) a attribué des rangs aux caractéris-
tiques (le rang 1 indique les caractéristiques sélectionnées et les rangs supérieurs indiquent l’ordre
d’élimination). Ici, sepal length (cm) a été éliminée (rang 2), tandis que les trois autres caracté-
ristiques ont été conservées. grid_scores_ montre les scores de validation croisée pour différents
nombres de caractéristiques. Dans ce cas, les meilleurs résultats ont été obtenus avec 3 caractéris-
tiques (score de 0.847). RFECV utilise la validation croisée pour déterminer automatiquement le
nombre optimal de caractéristiques à conserver.
5.22.4 SelectFromModel
Explication
Cette méthode préentraîne un estimateur et examine ses coefficients pour identifier les variables
importantes. Elle est plus compatible avec les modèles qui développent une fonction paramétrée
(avec des coefficients ou des noms de caractéristiques). Les modèles comme KNN sont incompa-
tibles car ils sont paramétrés avec les échantillons déjà vus et non avec des coefficients explicites.
1 from sklearn . f e a t u r e _ s e l e c t i o n import S e le ct F ro mM o de l
2
3 X = iris . data
4 y = iris . target
5 selector = S el e ct Fr o mM od e l ( SGDClassifier ( random_state =0) , threshold = ’ mean ’)
6 selector . fit (X , y )
7 selector . estimator_ . coef_
Résultat :
Résultat :
array([’petal length (cm)’, ’petal width (cm)’], dtype=’<U17’)
Explication
K-Means est un algorithme de clustering qui cherche à partitionner les données en K groupes
distincts en minimisant la variance intra-cluster.
1 import numpy as np
2 import matplotlib . pyplot as plt
3 from sklearn . datasets import make_blobs
4 from sklearn . cluster import KMeans
5
6 # G n r a t i o n de d o n n e s
7 X , y = make_blobs ( n_samples =100 , centers =3 , cluster_std =0.4 , random_state =0)
8 plt . scatter ( X [: ,0] , X [: ,1])
Explication
1 model = KMeans ( n_clusters =3)
2 model . fit ( X )
3 model . predict ( X )
4 plt . scatter ( X [: ,0] , X [: ,1] , c = model . predict ( X ) )
5 plt . scatter ( model . c l u s t e r _ c e n t e r s _ [: ,0] , model . c l u s t e r _ c e n t e r s _ [: ,1] , c = ’r ’)
6 model . score ( X )
Figure 99 – Clusters identifiés par K-Means (points rouges = centres des clusters)
Explication
Figure 100 – Graphique de la méthode du coude montrant l’inertie en fonction du nombre de clusters
Explication
Le coude dans le graphique indique généralement le nombre optimal de clusters, où ajouter plus
de clusters n’améliore pas significativement la qualité du clustering.
Explication
Isolation Forest est un algorithme de détection d’anomalies basé sur l’isolation des observations
aberrantes par rapport au reste des données.
1 from sklearn . ensemble import I so l at io n Fo re s t
2
3 X , y = make_blobs ( n_samples =50 , centers =1 , cluster_std =0.1 , random_state =0)
4 X [ -1 ,:] = np . array ([2.25 , 5])
5 plt . scatter ( X [: ,0] , X [: , 1])
Explication
1 model = Iso l at i on Fo r es t ( contamination =0.01)
2 model . fit ( X )
3 plt . scatter ( X [: ,0] , X [: , 1] , c = model . predict ( X ) )
Explication
Explication
Application de l’Isolation Forest sur le jeu de données des chiffres manuscrits pour identifier les
chiffres atypiques.
1 from sklearn . datasets import load_digits
2 digits = load_digits ()
3 images = digits . images
4 X = digits . data
5 y = digits . target
6 plt . imshow ( images [0])
Explication
1 model = I so l at i on Fo r es t ( random_state =0 , contamination =0.02)
2 model . fit ( X )
3 outliers = model . predict ( X ) == -1
4
5 plt . figure ( figsize =(12 , 3) )
6 for i in range (10) :
7 plt . subplot (1 , 10 , i +1)
8 plt . imshow ( images [ outliers ][ i ])
9 plt . title ( y [ outliers ][ i ])
Explication
L’Isolation Forest identifie les chiffres manuscrits qui sont les plus difficiles à reconnaître ou qui
présentent des caractéristiques atypiques par rapport aux autres échantillons de la même classe.
Figure 104 – Les 10 premières anomalies détectées dans le jeu de données Digits
Explication
5.23.5.1 Visualisation 2D
1 from sklearn . decomposition import PCA
2
3 model = PCA ( n_components =2)
4 model . fit ( X )
Résultat :
PCA(copy=True, iterated_power=’auto’, n_components=2, random_state=None,
svd_solver=’auto’, tol=0.0, whiten=False)
1 x_pca = model . transform ( X )
2 plt . scatter ( x_pca [: ,0] , x_pca [: ,1] , c = y )
Figure 105 – Projection des données Digits sur les deux premières composantes principales
Explication
1 plt . figure ()
2 plt . xlim ( -30 , 30)
3 plt . ylim ( -30 , 30)
4
5 for i in range (100) :
6 plt . text ( x_pca [i ,0] , x_pca [i ,1] , str ( y [ i ]) )
Figure 106 – Affichage des étiquettes des 100 premiers points dans l’espace PCA
Explication
Compression de données
1 n_dims = X . shape [1]
2 model = PCA ( n_components = n_dims )
3 model . fit ( X )
4
5 variances = model . e x p l a i n e d _ v a r i a n c e _ r a t i o _
6
7 meilleur_dims = np . argmax ( np . cumsum ( variances ) > 0.90)
8
9 plt . bar ( range ( n_dims ) , np . cumsum ( variances ) )
10 plt . hlines (0.90 , 0 , meilleur_dims , colors = ’r ’)
11 plt . vlines ( meilleur_dims , 0 , 0.90 , colors = ’r ’)
Explication
1 model = PCA ( n_components =0.99)
2 model . fit ( X )
Résultat :
PCA(copy=True, iterated_power=’auto’, n_components=0.99, random_state=None,
svd_solver=’auto’, tol=0.0, whiten=False)
1 X_compress = model . fit_transform ( X )
2 X_decompress = model . i n v e r s e _ t r a n s f o r m ( X_compress )
3
4 plt . subplot (1 , 2 , 1)
5 plt . imshow ( X [0 ,:]. reshape ((8 ,8) ) , cmap = ’ gray ’)
6 plt . title ( ’ originel ’)
7 plt . subplot (1 , 2 , 2)
8 plt . imshow ( X_decompress [0 ,:]. reshape ((8 ,8) ) , cmap = ’ gray ’)
9 plt . title ( ’ C o m p r e s s ’)
Figure 108 – Comparaison entre une image originale et sa version compressée/décompressée par PCA
Explication
L’apprentissage d’ensemble (Ensemble Learning) combine plusieurs modèles pour améliorer les
performances de prédiction. Ces techniques permettent de réduire la variance, le biais et d’amé-
liorer la généralisation des modèles.
1 import numpy as np
2 import matplotlib . pyplot as plt
3 from sklearn . datasets import make_moons
4 from sklearn . m od el _ se le c ti on import t r a i n _ t e s t _ s p l i t
5 from matplotlib . colors import List edColo rmap
6
7 def p l o t _ d e c i s i o n _ b o u n d a r y ( clf , X , y , axes =[ -1.5 , 2.45 , -1 , 1.5] , alpha =0.5 ,
contour = True ) :
8 h = .02
9 x_min , x_max = X [: , 0]. min () - .5 , X [: , 0]. max () + .5
10 y_min , y_max = X [: , 1]. min () - .5 , X [: , 1]. max () + .5
11 xx , yy = np . meshgrid ( np . arange ( x_min , x_max , h ) ,
12 np . arange ( y_min , y_max , h ) )
13
14 Z = clf . predict_proba ( np . c_ [ xx . ravel () , yy . ravel () ]) [: , 1]
15 Z = Z . reshape ( xx . shape )
16 plt . contourf ( xx , yy , Z , alpha =.5)
17
18 plt . scatter ( X [: ,0] , X [: ,1] , c =y , alpha =0.8 , edgecolors = ’k ’)
19
20 X , y = make_moons ( n_samples =500 , noise =0.3 , random_state =0)
21 plt . scatter ( X [: ,0] , X [: ,1] , c =y , alpha =0.8)
22 X_train , X_test , y_train , y_test = t r a i n _ t e s t _ s p l i t (X , y , test_size =0.3 ,
random_state =0)
Le jeu de données make_moons génère deux classes en forme de croissants de lune. Le paramètre
noise=0.3 ajoute du bruit pour rendre la classification plus difficile, créant ainsi un problème
non-linéaire qui permet de bien comparer les différentes techniques d’ensemble.
Explication
Le Voting Classifier combine les prédictions de plusieurs modèles différents selon une règle de vote
majoritaire (vote dur) ou une moyenne des probabilités prédites (vote souple).
1 from sklearn . linear_model import SGDClassifier
2 from sklearn . tree import D e c i s i o n T r e e C l a s s i f i e r
3 from sklearn . neighbors import K N e i g h b o r s C l a s s i f i e r
4 from sklearn . ensemble import V o t i n g C l a s s i f i e r
5
6 model_1 = SGDClassifier ( random_state =0)
7 model_2 = D e c i s i o n T r e e C l a s s i f i e r ( random_state =0)
8 model_3 = K N e i g h b o r s C l a s s i f i e r ( n_neighbors =2)
9 model_4 = V o t i n g C l a s s i f i e r ([( ’ SGD ’ , model_1 ) ,
10 ( ’ Tree ’ , model_2 ) ,
11 ( ’ KNN ’ , model_3 ) ] ,
12 voting = ’ hard ’)
13
14 for model in ( model_1 , model_2 , model_3 , model_4 ) :
15 model . fit ( X_train , y_train )
16 print ( model . __class__ . __name__ , model . score ( X_test , y_test ) )
SGDClassifier 0.8266666666666667
DecisionTreeClassifier 0.8533333333333334
KNeighborsClassifier 0.8066666666666666
VotingClassifier 0.8666666666666667
Le VotingClassifier combine trois classifieurs différents (SGD, Decision Tree, et KNN) et utilise
un vote majoritaire (voting=’hard’) pour faire ses prédictions. On observe souvent que l’ensemble
offre des performances supérieures ou égales au meilleur classifieur individuel, ce qui démontre
l’avantage de combiner plusieurs modèles.
5.24.2 Bagging
Explication
Le Bagging (Bootstrap Aggregating) entraîne plusieurs instances du même modèle sur différents
sous-ensembles des données d’entraînement générés par échantillonnage avec remise.
1 from sklearn . ensemble import BaggingClassifier , R a n d o m F o r e s t C l a s s i f i e r
2
3 model = B a g g i n g C l a s s i f i e r ( ba se_est imator = K N e i g h b o r s C l a s s i f i e r () ,
4 n_estimators =100)
5 model . fit ( X_train , y_train )
6 model . score ( X_test , y_test )
0.8733333333333333
1 model = R a n d o m F o r e s t C l a s s i f i e r ( n_estimators =100)
2 model . fit ( X_train , y_train )
3 model . score ( X_test , y_test )
0.8866666666666667
1 p l o t _ d e c i s i o n _ b o u n d a r y ( model , X_train , y_train )
5.24.3 Boosting
Explication
Le Boosting entraîne séquentiellement une série de modèles faibles, chaque nouveau modèle se
concentrant sur les erreurs des modèles précédents.
1 from sklearn . ensemble import AdaBoostClassifier , G r a d i e n t B o o s t i n g C l a s s i f i e r
2
3 model = A d a B o o s t C l a s s i f i e r ( n_estimators =100)
4 model . fit ( X_train , y_train )
5 model . score ( X_test , y_test )
0.8666666666666667
1 p l o t _ d e c i s i o n _ b o u n d a r y ( model , X_train , y_train )
5.24.4 Stacking
Explication
Le Stacking combine plusieurs modèles en entraînant un méta-modèle qui apprend à intégrer les
prédictions des modèles de base.
1 from sklearn . ensemble import S t a c k i n g C l a s s i f i e r
2
3 model = S t a c k i n g C l a s s i f i e r ([( ’ SGD ’ , model_1 ) ,
4 ( ’ Tree ’ , model_2 ) ,
5 ( ’ KNN ’ , model_3 ) ] ,
6 f in al _ es ti m at o r = K N e i g h b o r s C l a s s i f i e r () )
7 model . fit ( X_train , y_train )
8 model . score ( X_test , y_test )
0.8733333333333333
1 p l o t _ d e c i s i o n _ b o u n d a r y ( model , X_train , y_train )
StackingClassifier combine les trois classifieurs précédents (SGD, Decision Tree, et KNN) en
utilisant un classifieur KNN comme méta-modèle. Contrairement au VotingClassifier qui utilise
un vote simple, le stacking apprend à combiner les prédictions des modèles de base de manière
optimale.
La frontière de décision montre comment le modèle de stacking peut capturer des structures
complexes dans les données en tirant parti des forces de chaque classifieur de base.
6 Conclusion
Explication
Dans ce cours, nous avons exploré les principaux aspects de l’apprentissage automatique, en cou-
vrant à la fois des techniques supervisées et non-supervisées. Nous avons étudié :
— Les algorithmes de classification et de régression
— Les méthodes de sélection de caractéristiques (RFE, SelectFromModel)
— Les techniques de clustering (K-Means)
— La détection d’anomalies (Isolation Forest)
— La réduction de dimension (PCA)
— Les méthodes d’ensemble (Voting, Bagging, Boosting, Stacking)
Ces techniques constituent la base de l’apprentissage automatique classique. Elles offrent une
grande variété d’outils pour aborder différents types de problèmes et de données.
Dans le prochain cours, nous aborderons le deep learning, qui étend ces concepts avec des archi-
tectures de réseaux de neurones plus complexes capables de modéliser des fonctions hautement
non-linéaires et de traiter des données structurées comme les images, le texte et les séries tempo-
relles.
Le deep learning nous permettra d’explorer :
— Les réseaux de neurones multicouches (MLP)
— Les réseaux de neurones convolutifs (CNN) pour le traitement d’images
— Les réseaux récurrents (RNN, LSTM, GRU) pour les séquences
— Les techniques de transfer learning et d’apprentissage par renforcement
Les techniques apprises dans ce cours resteront pertinentes même dans le contexte du deep learning,
car elles offrent souvent des solutions plus interprétables, plus rapides à entraîner et parfois plus
performantes sur des problèmes où les données sont limitées ou la structure est simple.
Félicitations ! Vous avez désormais terminé ce cours complet sur l’apprentissage au-
tomatique classique. Vous êtes maintenant capable d’écrire des programmes efficaces et
performants en utilisant les principales techniques du domaine. Ce n’est qu’un début
dans votre parcours en intelligence artificielle, mais vous disposez déjà des fondamentaux
essentiels pour résoudre de nombreux problèmes concrets.
Si vous avez des questions ou besoin de précisions sur les concepts abordés, n’hésitez pas
à me contacter sur LinkedIn : Mohamed Ouazze.
Vos retours sont précieux et contribueront à l’amélioration continue de ce cours.