Cours
Cours
2023 — 2024
Table des matières
1 Introduction 4
1.1 C’est quoi l’apprentissage machine ? . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.1.1 Intelligence artificielle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.1.2 Pourquoi l’intelligence artificielle ? . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.3 Histoire de IA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.4 Turring Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.5 Chinese room . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.6 Fonction d’approximation . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.1.7 Stratégies d’IA Cas d’utilisation : Tic Tac Toe . . . . . . . . . . . . . . . . 6
1.1.8 Apprentissage machine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1.9 Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2 Science des données (data sciences) . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.1 Les données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3 L’algorithme d’apprentissage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3.1 C’est quoi l’apprentissage supervisé . . . . . . . . . . . . . . . . . . . . . . 11
1.3.2 C’est quoi l’apprentissage non supervisé . . . . . . . . . . . . . . . . . . . 11
1.3.3 C’est quoi l’apprentissage par renforcement . . . . . . . . . . . . . . . . . . 12
2 Avant de commencer 14
2.1 Préparation et Analyse de données . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.1.1 Les valeures manquantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.1.2 Les valeures dupliquées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1.3 Les valeures abirantes "Outlires" . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1.4 Encodage des valeures catégoriques vers numirique . . . . . . . . . . . . . 16
2.1.5 Analyse de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.2 La visualisation des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.3 Sélection des caractéristiques "Features Selection " . . . . . . . . . . . . . . . . . . 18
2.3.1 Sélection univariée «Univariate Selection, US» . . . . . . . . . . . . . . . . 19
2.3.2 Élimination récursive de caractéristiques "Recursive Feature Elimination,
RFE " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.3.3 Analyse des composants principaux "Principal Component Analysis, PCA" 20
2.3.4 Importance des caractéristiques "Feature Importance , FI" . . . . . . . . . 21
2.4 Normaliser et Standardiser des caractéristiques . . . . . . . . . . . . . . . . . . . . 22
2.4.1 MinMaxScaler (Méthode de Scaling) . . . . . . . . . . . . . . . . . . . . . 23
2.4.2 RobustScaler (Méthode de Scaling Statistique) . . . . . . . . . . . . . . . . 23
2.4.3 StandardScaler (méthode pour Standardiser) . . . . . . . . . . . . . . . . . 23
2.4.4 Normalizer (méthode pour normaliser) . . . . . . . . . . . . . . . . . . . . 24
2.5 La mesure des performances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1
2.5.1 Mesures de performance d‘un model de classification . . . . . . . . . . . . 24
2.5.2 ROC et AUC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.5.3 Matrice de confusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.5.4 Rapport de classification . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.5.5 Mesures de performance d ‘un model de régression . . . . . . . . . . . . . . 33
2.6 Underfitting and Overfitting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.7 Données asymétries « Umbalenced Data » . . . . . . . . . . . . . . . . . . . . . . 36
2.7.1 Intuition pour les données déséquilibrées . . . . . . . . . . . . . . . . . . . 36
2.7.2 Évaluer les modèles de classification asymétriques . . . . . . . . . . . . . . 37
2.7.3 Sous-échantillonnage de la classe majoritaire . . . . . . . . . . . . . . . . . 37
2.7.4 Sur-échantillonnage de la classe minoritaire . . . . . . . . . . . . . . . . . . 38
2.7.5 Algorithmes sensibles aux coûts ”Cost-Sensitive Algorithms” . . . . . . . . 39
3 Apprentissage supervisé 41
3.1 La régression linière simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.1.1 Comment fonctionne la régression linière simple . . . . . . . . . . . . . . . 41
3.1.2 Implémentation avec python . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.1.3 Implémentation avec scikit-learn . . . . . . . . . . . . . . . . . . . . . . . . 45
3.2 La régression linière multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.2.1 Le gradient descente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.2.2 Comment fonctionne la régression linière multiple . . . . . . . . . . . . . . 49
3.2.3 Implémentation avec python . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.2.4 Implémentation avec scikit-learn . . . . . . . . . . . . . . . . . . . . . . . . 51
3.3 La régression linière polynomial . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.3.1 Comparaison de la régression polynomiale et linéaire simple . . . . . . . . 54
3.3.2 Jouer avec le degré polynomial . . . . . . . . . . . . . . . . . . . . . . . . . 56
3.4 Régression logistique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
3.4.1 La solution est une régression logistique . . . . . . . . . . . . . . . . . . . 58
3.4.2 Algorithme d’apprentissage . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.4.3 Comment la régression logistique fonctionne . . . . . . . . . . . . . . . . . 60
3.4.4 Implémentation avec scikit-learn . . . . . . . . . . . . . . . . . . . . . . . . 62
3.5 KNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
3.5.1 Comment algorithme KNN fonctionne ? . . . . . . . . . . . . . . . . . . . . 67
3.5.2 Implémentation avec scikit-learn classification binaire . . . . . . . . . . . . 68
3.5.3 Implémentation avec scikit-learn classification multi classes . . . . . . . . . 69
3.5.4 Comment choisir la valeur optimale de K ? . . . . . . . . . . . . . . . . . . 70
3.6 Naive bayes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
3.6.1 Modèle discriminatif vs Modèle génératif . . . . . . . . . . . . . . . . . . . 72
3.6.2 Pourquoi le naive bays ? ? . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.6.3 Probabilités conditionnelles . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.6.4 Classification multi-classes avec Naive Bayes . . . . . . . . . . . . . . . . . 75
3.6.5 Exemple Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.6.6 Exemple sickit-learn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4
1.1.2 Pourquoi l’intelligence artificielle ?
— Progrès récents dans le domaine des algorithmes et de la structure des données
— Disponibilité des données
— Infrastructure et puissance de calcul (GPUs, TPUs, HPC, Cloud, etc )
1.1.3 Histoire de IA
— 1901-1933 : Principal component analysis ( K. Pearson, H. Hotelling). — 1943 : McCulloch
& Pitts : Boolean circuit model of brain.
— 1950 : Turing’s “Computing Machinery and Intelligence”
— 1955 : Support Vector Machine (Vapnik).
— 1955-2001 : Random Forest (L. Breiman).
— 1958 : Perceptron (F. Rosenblatt).
— 1965 : Robinson’s complete algorithm for logical reasoning — 1965 : Fuzzy Sets (L. Zadeh).
— 1970—90 : Knowledge-based approaches (Expert systems) — 1982 : Self Organized Map
( T. kohenen).
— 1986 : back propagation (E. Rumelhart , G. Hinton).
— 1986-1993 : Decision Tree : ID3, C4.5 (J.R Quinlin).
— 1997 : Long short-term memory (LSTM) (Hochreiter).
— 2001 : Convolutionnal Neural Network (Lecunn & Benejio ). — 2017 : Transformer (Ashish
Vaswani et. al).
— 2022 : The Forward-Forward Algorithm (G. Hinton).
Le temps mis par le juge pour deviner que la pièce A est l’ordinateur ?
- IA : opérer avec intelligence sur les données pour extraire les relations entre les entrées et les
sorties.
Version 2 : Stratégie
— A- Tenter de placer deux marques à la suite.
— B- si l’adversaire a deux marques à la suite, faire la 3ème place.
Classification
Dans l’apprentissage automatique et dans les statistiques, la classification est une approche d’ap-
prentissage supervisé dans laquelle le programme informatique apprend à partir des données
saisies, puis utilise cet apprentissage pour classer une nouvelle observation. Cet ensemble de
données peut simplement être bi-classe (comme identifier si la personne est un homme ou une
femme ou que le courrier est du spam ou non) ou il peut aussi être multi-classe. Voici quelques
exemples de problèmes de classification : reconnaissance de la parole, reconnaissance de l’écriture
manuscrite, identification bio métrique, classification de documents, etc.
Régression
Les modèles de régression sont utilisés pour prédire une valeur continue. Prédire les prix d’une
maison en fonction de ses caractéristiques telles que la taille, le prix, etc. est l’un des exemples
les plus courants de la régression. C’est une technique supervisée.
Réduction de la dimensionnalité
Le concept de valeurs manquantes est important à comprendre afin de gérer avec succès les
données. Si les valeurs manquantes ne sont pas gérées correctement par le chercheur, il peut
finir par tirer une inférence inexacte sur les données. En raison d’une mauvaise manipulation, le
résultat obtenu par le chercheur sera différent de ceux où les valeurs manquantes sont présentes.
Les valeures manquantes
import numpy as np
import pandas as pd
url = "/Users/macbookair/Documents/cours/cours apprentissage machine/datasets/iris.
csv"
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']#
les noms des colonnes
df = pd.read_csv(url, names=names) # charger le fichier csv
[Link]().sum()
#Autre methode
[features for features in [Link] if df1[features].isnull().sum()>0]
Cette méthode de prétraitement des données est couramment utilisée pour gérer les valeurs nulles.
Ici, nous supprimons soit une ligne particulière si elle a une valeur nulle pour une fonctionnalité
particulière et une colonne particulière si elle a plus de 75% de valeurs manquantes.
Supprimer les valeures manquantes
[Link](inplace=True)
[Link]().sum()
Cette stratégie peut être appliquée à une fonctionnalité qui a des données numériques comme la
colonne année ou la colonne objectif de l’équipe à domicile. Nous pouvons calculer la moyenne,
la médiane ou le mode de l’entité et la remplacer par les valeurs manquantes.
Remplacer les valeures manquantes
14
df['year'] = df['year'].replace([Link] , df['year'].mean())
df['year'] = df['year'].fillna(df['year'].mode()[0])
Exemple statisitque
Median = 190.
Q1 = 180.
Q3 = 204.
BoxPlot / Outlires
import numpy as np
import pandas as pd
Encodage
names = ['CustomerID','Genre','Age','Annual_Income','Spending_Score']
df = pd.read_csv("/Volumes/D/cours/cours_apprentissage_machine/datasets/[Link]")
[Link]()
df['Gender'].unique()
df['Gender'] = df['Gender'].map({'M':1 , 'F': 0})
df['Age'].unique()
df['Age'] = df['Age'].map({'0-17':1 ,'18-25': 2, '26-35': 3 ,'36-45': 4, '46-50': 5
, '51-55':6 , '55+':7})
df['City_Category'].unique()
df['Age']= label_encoder.fit_transform(df['Age'])
df['Age'].unique()
Pandas possède d’autre méthodes avancées comme le Groupby, le Table Pivot, etc.
Résultat :
On peut voir les scores pour chaque attribut et les 4 attributs choisis (ceux avec les scores les
plus élevés) : plas, test, masse et âge.
Résultat :
Num Features : 3
Selected Features : [ True False False False False True True False]
Feature Ranking : [1 2 3 5 6 1 1 4]
On peut voir que RFE a choisi les 3 principales fonctionnalités telles que preg, mass et pedi.
Celles-ci sont marquées true dans le tableau support_ et marquées d’un choix «1» dans le tableau
ranking_.
Résultat :
On peut voir que l’ensemble de données transformé (3 composantes principales) présente peu de
ressemblance avec les données source.
Résultat :
Vous pouvez voir que nous obtenons un score d’importance pour chaque attribut, plus le score
est grand, plus l’attribut est important. Les scores suggèrent l’importance des plas, de l’âge et
de la masse.
La matrice Confusion est l’une des métriques les plus intuitives et les plus simples utilisées pour
rechercher l’exactitude et la précision du modèle. Il est utilisé pour un problème de classification
où la sortie peut être constituée de deux types de classes ou plus.
la matrice de confusion est un tableau à deux dimensions («Réel» et «Prédit») et des ensembles
de «classes» dans les deux dimensions. Nos classifications réelles sont des colonnes et les prédites
sont des lignes.
1. True Positives (TP) : Les vrais positifs sont les cas où la classe réelle du point de données était
1 (True) et la prédite est également 1 (True).
2. True Negatives (TN) : Les vrais négatifs sont les cas où la classe réelle du point de données
était 0 (False) et la prédiction est également 0 (False)
3. False Positives (FP) : Les faux positifs sont les cas où la classe réelle du point de données est 0
(False) et la prédiction est 1 (True). False est parce que le modèle a prédit de manière incorrecte
et positif parce que la classe prédite était positive. (1)
4. False Negatives (FN) : Les faux négatifs sont les cas où la classe réelle du point de données
était 1 (Vrai) et la prédiction est 0 (Faux). False est dû au fait que le modèle a prédit de manière
incorrecte et négatif car la classe prédite était négative. (0)
Exemple d’une matrice de confusion dans un cas avec trois classes :
La précision dans les problèmes de classification est le nombre de prédictions correctes faites par
le modèle sur toutes les sortes de prédictions effectuées.
Quand utiliser l’accuracy : l’accuracy est une bonne mesure lorsque les classes de variables cibles
dans les données sont presque équilibrées.
Ex : 60% des classes de nos images de fruits sont des pommes et 40% des oranges. Un modèle
qui prédit si une nouvelle image est Pommes ou Orange, 97% de fois correctement est une très
bonne mesure dans cet exemple.
Quand NE PAS utiliser l’accuracy : l’acuracy ne doit JAMAIS être utilisée comme mesure lorsque
les classes de variables cibles dans les données constituent la majorité d’une classe.
Exemple : Dans un exemple de détection du cancer avec 100 personnes, seulement 5 personnes
ont un cancer. Disons que notre modèle est très mauvais et prédit chaque cas comme étant sans
cancer. Maintenant, même si le modèle est terrible pour prédire le cancer, l’accuracy d’un si
mauvais modèle est également de 95%.
Accuracy
import pandas
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
url = "[Link]
[Link]"
Précision
La précision est une mesure qui nous indique quelle proportion de patients pour lesquels nous
avons diagnostiqué un cancer ont effectivement eu un cancer. Les personnes prédites cancéreuses
sont les TP et les FP et les personnes atteintes d’un cancer sont les TP.
Recall et Sensitivity
Le Recall est une mesure qui nous indique quelle proportion de patients ayant un cancer a été
diagnostiquée par l’algorithme comme ayant un cancer.
Specificity : est une mesure qui nous indique quelle proportion de patients non atteints de cancer
a été prédite par le modèle comme non cancéreuse. Les négatifs actuelle (les personnes sans
cancer sont FP et TN) et les personnes diagnostiquées par nous qui n’ont pas le cancer sont TN.
(Remarque : la FP est incluse car la personne n’a pas réellement de cancer alors que le modèle
prédit.
F1 Score
Le F1 Score est la moyenne pondérée de la précision et du Recall. Par conséquent, ce score prend
en compte à la fois les faux positifs et les faux négatifs. Intuitivement, il n’est pas aussi facile à
comprendre que l’accuracy, mais F1 est généralement plus utile que l’accuracy, en particulier si
la répartition des classes est inégale. La précision fonctionne mieux si les faux positifs et les faux
négatifs ont un coût similaire. Si le coût des faux positifs et des faux négatifs est très différent,
il vaut mieux regarder à la fois Precision et Recall.
Evaluation Metrics
from [Link] import precision_recall_fscore_support as score
print('precision: {}'.format(precision))
print('recall: {}'.format(recall))
print('fscore: {}'.format(fscore))
print('support: {}'.format(support))
True Positive Rate = True Positives / (True Positives + False Negatives) = Sensitivity
False Positive Rate = False Positives / (False Positives + True Negatives)= Specifecity
Lorsque deux distributions se chevauchent, nous introduisons une erreur de type 1 et de type
2. Selon le seuil, nous pouvons les minimiser ou les maximiser. Lorsque l’AUC est de 0,7, cela
signifie qu’il y a 70% de chances que le modèle soit capable de distinguer la classe positive de la
classe négative.
pire situation. Lorsque l’AUC est d’environ 0,5, le modèle n’a aucune capacité de discrimination
pour distinguer la classe positive de la classe négative.
Selon le résultat obtenue on constate que la prédiction soit décalée de 426 (en moyenne) par
rapport à la vérité.
Un MAE de 426$ indique que nous devrions nous attendre, en moyenne, à un écart de 426$, ce
qui est assez élevé compte tenu de la fourchette de notre variable dépendante.
RMSE :
On note que le RMSE est plus grand que le MAE. Étant donné que la RMSE corrige la différence
entre les prédictions et la valeur réelle, toute différence significative est d’autant plus importante
qu’elle est équitablement calculée. RMSE est plus sensible aux valeurs aberrantes.
Sklearn regression metrics :
MAE RMSE
# Cross Validation Regression MAE
import pandas
from sklearn import model_selection
from sklearn.linear_model import LinearRegression
url = "[Link]
names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', '
PTRATIO', 'B', 'LSTAT', 'MEDV']
dataframe = pandas.read_csv(url, delim_whitespace=True, names=names)
array = [Link]
X = array[:,0:13]
Y = array[:,13]
seed = 7
kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = LinearRegression()
scoring = 'neg_mean_absolute_error'
results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("MAE: %.3f (%.3f)") % ([Link](), [Link]())
scoring = 'r2'
results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("R^2: %.3f (%.3f)") % ([Link](), [Link]())
Classe de majorité : Plus de la moitié des exemples appartiennent à cette classe, souvent le cas
négatif ou normal.
Classe minoritaire : moins de la moitié des exemples appartiennent à cette classe, souvent le cas
positif ou anormal.
0.99, 0.01
signifie que 99% des exemples appartiendront à la classe majoritaire et les 1% restants appar-
tiendront à la classe minoritaire.
Imbalanced classification problem
# plot imbalanced classification problem
from collections import Counter
from [Link] import make_classification
from matplotlib import pyplot
from numpy import where
# define dataset
X, y = make_classification(n_samples=1000, n_features=2, n_redundant=0,
n_clusters_per_class=1, weights=[0.99, 0.01], flip_y=0)
# summarize class distribution
counter = Counter(y)
print(counter)
# scatter plot of examples by class label
for label, _ in [Link]():
row_ix = where(y == label)[0]
[Link](X[row_ix, 0], X[row_ix, 1], label=str(label))
[Link]()
[Link]()
Une approche rapide et fiable consiste à supprimer au hasard des exemples de la classe majoritaire
pour réduire le déséquilibre à un rapport moins sévère ou même pour que les classes soient égales.
Undersampling the majority class
# example of undersampling the majority class
from collections import Counter
from [Link] import make_classification
from imblearn.under_sampling import RandomUnderSampler
# generate dataset
X, y = make_classification(n_samples=10000, n_features=2, n_redundant=0,
n_clusters_per_class=1, weights=[0.99, 0.01], flip_y=0)
# summarize class distribution
print(Counter(y))
# define undersample strategy
undersample = RandomUnderSampler(sampling_strategy=0.5)
# fit and apply the transform
X_under, y_under = undersample.fit_resample(X, y)
# summarize class distribution
print(Counter(y_under))
On peut combiner les deux techniques Précédente en utilisant la fonction SMOTEENN qui
combine à la fois le sur-échantillonnage SMOTE de la classe minoritaire et le sous-échantillonnage
Edited Nearest Neighbors de la classe majoritaire.
Undersampling and Oversampling
example of both undersampling and oversampling
from collections import Counter
from [Link] import make_classification
from [Link] import SMOTEENN
# generate dataset
X, y = make_classification(n_samples=10000, n_features=2, n_redundant=0,
n_clusters_per_class=1, weights=[0.99, 0.01], flip_y=0)
# summarize class distribution
print(Counter(y))
# define sampling strategy
sample = SMOTEENN(sampling_strategy=0.5)
# fit and apply the transform
X_over, y_over = sample.fit_resample(X, y)
# summarize class distribution
print(Counter(y_over))
41
On peut constater que la relation entre X et Y est presque linière. On peut dessiner une ligne en
diagonale en bas à gauche de l’intrigue vers le haut à droite pour décrire généralement la relation
entre les données.
Avec une régression linéaire simple, on peut modeler les données comme suit :
y = B0 + B1 * x
Il s’agit d’une ligne où y est la variable de sortie que nous voulons prédire, x est la variable
d’entrée que nous connaissons et B0 et B1 sont des coefficients dont nous avons besoin d’estimer
qui déplace la ligne.
Techniquement, B0 s’appelle l’interception car elle détermine où la ligne intercepte l’axe des y.
Dans l’apprentissage par machine, on appel cela le biais, car il est ajouté pour compenser toutes
les prédictions que nous faisons. Le terme B1 s’appelle la pente car il définit la pente de la ligne
ou comment x se traduit par une valeur y avant d’ajouter notre biais.
L’objectif est de trouver les meilleures estimations pour les coefficients pour minimiser les erreurs
dans la prédiction de y de x.
On peut commencer par estimer la valeur de B1 comme suit (Méthode des moindres carrées) :
Cov(x, y) SSxy
B1 = =
V ar(x, y) SSxx
B0 = ȳ − B1 x̄
B0 = ȳ + B1 x̄
X Y Predicted Y
1 1 1.2
2 3 2
4 3 3.6
3 2 2.8
5 5 4.4
Yi Pi Pi - Yi (Pi - Yi)2̂
1 1.2 0.2 0.04
3 2 -1 1
3 3.6 0.6 0.36
2 2.8 0.8 0.64
5 4.4 -0.6 0.36
Regression Simple
import numpy as np
import [Link] as plt
def main():
# observations
x = [Link]([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
y = [Link]([1, 3, 2, 5, 7, 8, 8, 9, 10, 12])
# estimating coefficients
b = estimate_coef(x, y)
print("Estimated coefficients:\nb_0 = {} \\nb_1 = {}".format(b[0], b[1]))
# plotting regression line
plot_regression_line(x, y, b)
if __name__ == "__main__":
main()
X = dataset['MinTemp'].[Link](-1,1)
y = dataset['MaxTemp'].[Link](-1,1)
#Data Plot
[Link](x='MinTemp', y='MaxTemp', style='o')
[Link]('MinTemp vs MaxTemp')
[Link]('MinTemp')
[Link]('MaxTemp')
[Link]()
#SGD Optimizer
#from sklearn.linear_model import SGDRegressor
#regressor = SGDRegressor(max_iter=10000, tol=0.1)
y_pred = [Link](X_test)
x ∈ Rd , y ∈ R
pour n exemples
Mathématiquement, on peut écrire la régression linière sous forme :
h(θ) = θ0 + θ1 x1 + θ2 x2 + ...... + θn xn
x0 = 1 → Intercept
h(θ) = θ0 x0 + θ1 x1 + θ2 x2 + ...... + θn xn
h(θ) = Σni=0 θi xi = θT X
Il existe des techniques qui calcule cout de model « MAE, RSE, etc », le gradient descente «mise
a jour de coef θ » :
α : Learning rate.
Les valeurs usuelles de Learning rate sont : 0.001, 0.003, 0.01, 0.03, 0.1, 0.3.
Note : il faut normaliser les données de chaque propriétés « Features » entre 0 – 1.
1 m (i)
θj = θj − α Σi=1 (hθ (x(i) ) − y (i) )xj
m
Nous obtenons la formule finale pour mettre à jour notre paramètre θj et obtenir la valeur
optimale de manière itérative.
Pour cette tâche, il existe un algorithme mathématique appelé descente de gradient Stochastique :
— Descente de gradient est le processus d’optimisation d’une fonction en suivant les gradients
de la fonction de coût.
θ = θ - learning_rate * error * x
θ est le coefficient ou le poids optimisé, learning_rate est un taux d’apprentissage (par exemple
0.01), l’erreur est l’erreur de prédiction pour le modèle sur les données attribuées au poids et x
est la valeur d’entrée.
X1 X2 Y
1 2 1
2 4 6
3 10 3
4 -6 4
5 4 5
6 3 6
7 1 2
Puisque on a deux attributs d’entrés (X1 et X2 ) et que nous souhaitons utiliser la régression
linéaire, on parle de régression linéaire multiple.
Avec une régression linéaire multiple, on va modéliser nos données comme suit :
y = θ0 + θ1 ∗ x1 + θ2 ∗ x2
θ= θ - learning_rate * error * x
θ0 = 0.0
θ1 = 0.0
θ2 = 0.0
Y = 0,0 + 0,0 * x1 + 0.0 *x2
Nous pouvons maintenant utiliser cette erreur dans notre équation pour la descente de gradient
pour mettre à jour les poids. Nous allons commencer par mettre à jour l’interception θ0 d’abord,
parce que c’est plus facile.
α = learning_rate = 0.01
θ0 (t+1) = θ0 (t) – α * error = 0 – 0.01 * -1= 0.01
Voyons maintenant comment mettre à jour la valeur de θ1 et θ2 . Nous utilisons la même équation
avec un petit changement. L’erreur est filtrée par l’entrée qui l’a provoquée. Nous pouvons mettre
à jour θ1 et θ2 en utilisant l’équation :
Donc le model devient : Y = 0,01 + 0,01 * x1 + 0.02 *x2 , on peut passer a la deuxième itération
concernant ligne 2 de notre DataSet, ainsi de suite jusqu ‘a une condition d’arrêt : nombre
d’epochs ( dans notre cas chaque epoch est équivalente a 7 itérations).
Regression Multiple
def predict(row, coefficients):
yhat = coefficients[0]
for i in range(len(row)-1):
yhat += coefficients[i + 1] * row[i]
return yhat
# Calculate coefficients
dataset = [[1, 1], [2, 3], [4, 3], [3, 2], [5, 5]]
l_rate = 0.001
n_epoch = 50
coef = coefficients_sgd(dataset, l_rate, n_epoch)
print(coef)
Note : il existe d’autre méthode d’apprentissage pour la régression linéaire : « Gardiant descent
, moindre carrée, etc. »
print([Link]())
y = dataset['quality'].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=0)
regressor = LinearRegression()
[Link](X_train, y_train)
df1 = [Link](25)
print(df1)
# Initialize SGDRegressor
sgd_regressor = SGDRegressor(
loss='squared_error',
penalty='l2',
alpha=0.0001,
# Make predictions
y_pred = sgd_regressor.predict(X_test_scaled)
# Print results
print("Coefficients:", sgd_regressor.coef_)
print("Intercept:", sgd_regressor.intercept_)
print("Mean Squared Error:", mse)
print("R-squared Score:", r2)
La régression polynomiale est une forme de régression linéaire où, en raison de la relation non
linéaire entre les variables dépendantes et indépendantes, nous ajoutons des termes polynomiaux
à la régression linéaire pour la convertir en régression polynomiale.
Supposons que nous ayons X comme donnée indépendante et Y comme donnée dépendante.
Avant d’introduire les données dans un mode de prétraitement, nous convertissons les variables
d’entrée en termes polynomiaux en utilisant un certain degré.
Prenons un exemple : ma valeur d’entrée est 35 et le degré d’un polynôme est 2 ; je vais donc
trouver 35 puissance 0, 35 puissance 1 et 35 puissance 2. Cela permet d’interpréter la relation
non linéaire dans les données. L’équation du polynôme devient quelque chose comme ceci.
avec x0 = 1.
Le degré d’ordre à utiliser est un Hyperparamètre, et nous devons le choisir judicieusement. Mais
l’utilisation d’un degré élevé de polynôme tente de overfit les données et pour des valeurs plus
petites de degré, le modèle tente de underfit. Nous devons donc trouver la valeur optimale d’un
degré.
SLR VS PR
import numpy as np
import [Link] as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from [Link] import PolynomialFeatures
from [Link] import r2_score
X = 6 * [Link](200, 1) - 3
lr = LinearRegression()
[Link](x_train, y_train)
y_pred = [Link](x_test)
print(r2_score(y_test, y_pred))
print(lr.coef_)
print(lr.intercept_)
PR Pipeline
from [Link] import StandardScaler
from [Link] import Pipeline
def polynomial_regression(degree):
X_new=[Link](-3, 3, 100).reshape(100, 1)
X_new_poly = [Link](X_new)
polybig_features = PolynomialFeatures(degree=degree, include_bias=False)
std_scaler = StandardScaler()
lin_reg = LinearRegression()
polynomial_regression = Pipeline([
("poly_features", polybig_features),
("std_scaler", std_scaler),
("lin_reg", lin_reg),
])
polynomial_regression.fit(X, y)
y_newbig = polynomial_regression.predict(X_new)
#plotting prediction line
[Link](X_new, y_newbig,'r', label="Degree " + str(degree), linewidth=2)
[Link](x_train, y_train, "b.", linewidth=3)
[Link](x_test, y_test, "g.", linewidth=3)
[Link](loc="upper left")
[Link]("X")
[Link]("y")
[Link]([-3, 3, 0, 10])
[Link]()
polynomial_regression(10)
x ∈ Rd , y ∈ {0, 1}
pour n exemples.
y (i) = 1 Positive example.
y (i) = 0 Negative example.
La régression logistique mesure la relation entre la variable dépendante (notre class, ce que
nous voulons prédire) et la ou les variables indépendantes (nos caractéristiques), en estimant les
probabilités à l’aide de sa fonction logistique sous-jacente.
Ces probabilités doivent ensuite être transformées en valeurs binaires pour pouvoir réellement
prédire. C’est la tâche de la fonction logistique, également appelée fonction sigmoïde. La fonction
Sigmoid est capable de prendre n’importe quel nombre réel et la mapper en une valeur comprise
entre 0 et 1, mais jamais exactement à ces limites. Ces valeurs comprises entre 0 et 1 seront
ensuite transformées en 0 ou 1 à l’aide d’un classifieur de seuil.
1
γ(t) =
1 + e−t
En régression linéaire, la sortie est la somme pondérée des entrées. La régression logistique est
une régression linéaire généralisée en ce sens que nous ne produisons pas directement la somme
pondérée des entrées, mais que nous la transmettons via une fonction qui peut mapper toute
valeur réelle comprise entre 0 et 1.
1
hθ (x) =
1 + e(−θT x)
Cost function
Gradient Descent
1 n (i)
θj := θj − αΣ [y (i) − hθ (x)].xj
n i=1
X1 X2 Y
2.7810836 2.550537003 0
1.465489372 2.362125076 0
3.396561688 4.400293529 0
1.38807019 1.850220317 0
3.06407232 3.005305973 0
7.627531214 2.759262235 1
5.332441248 2.088626775 1
6.922596716 1.77106367 1
8.675418651 -0.2420686549 1
7.673756466 3.508563011 1
Le modèle de régression logistique prend des entrées à valeur réelle et permet de prédire la
probabilité que l’entrée appartienne à la classe par défaut (classe 0).
Si la probabilité est > 0,5, nous pouvons considérer le résultat comme une prédiction pour la
classe par défaut (classe 0), sinon la prédiction concerne l’autre classe (classe 1).
Pour cet ensemble de données, la régression logistique a trois coefficients, tout comme la régression
linéaire, par exemple :
output = θ0 + θ1 ∗ x1 + θ2 ∗ x2
L’algorithme d’apprentissage consistera à découvrir les meilleures valeurs pour les coefficients
(θ0 , θ1 etθ2 ) sur la base des données d’apprentissage.
Contrairement à la régression linéaire, le résultat est transformé en probabilité en utilisant la
fonction logistique :
Nous pouvons estimer les valeurs des coefficients en utilisant la descente de gradient stochastique.
Il s’agit d’une procédure simple pouvant être utilisée par de nombreux algorithmes d’apprentis-
sage automatique. Cela fonctionne en utilisant le modèle pour calculer une prédiction pour chaque
instance de l’ensemble d’apprentissage et en calculant l’erreur pour chaque prédiction.
Nous pouvons appliquer la descente de gradient stochastique au problème de recherche des coef-
ficients pour le modèle de régression logistique comme suit :
Étant donné chaque instance de formation :
— Calculez une prédiction en utilisant les valeurs actuelles des coefficients.
— Calculez les nouvelles valeurs de coefficient en fonction de l’erreur dans la prédiction.
Le processus est répété jusqu’à ce que le modèle soit suffisamment précis ou pour un nombre
d’itérations fixe.
Donc commencent par la première itération en affectant 0,0 à chaque coefficient et en calculant
la probabilité que la première instance de formation appartienne à la classe 0.
Alpha est un paramètre que on doir spécifier au début du parcours d’entraînement. Il s’agit
du taux d’apprentissage et de la mesure dans laquelle les coefficientschangent ou apprennent à
chaque mise à jour, dans notre cas on va prendre alpha = 0.3.
Nous pouvons répéter ce processus et mettre à jour le modèle pour chaque instance du DataSet.
Une seule itération dans le DatSet d’apprentissage s’appelle une epoch, dans notre cas une epoch
est équivalente a 10 itérations (10 lignes de notre DataSet).
Le graphe ci-dessous montre l’accuracy du modèle sur 10 epochs.
θ0 = -0.4066054641
θ1 = 0,8525733164
θ2 = -1.104746259
donc maintenant on peut faire des prédictions via notre modele, si on prend des valeurs de la 9
éme ligne (x1 = 8.675418651 , et x2 = -0.2420686549) :
Logistic Regression
import pandas as pd
import numpy as np
import [Link] as plt
from sklearn.model_selection import train_test_split
from [Link] import StandardScaler
from sklearn.linear_model import LogisticRegression
from [Link] import confusion_matrix
from [Link] import accuracy_score
from [Link] import ListedColormap
# input
x = [Link][:, [2, 3]].values
# output
y = [Link][:, 4].values
sc_x = StandardScaler()
xtrain = sc_x.fit_transform(xtrain)
xtest = sc_x.transform(xtest)
classifier = LogisticRegression(random_state = 0)
[Link](xtrain, ytrain)
y_pred = [Link](xtest)
cm = confusion_matrix(ytest, y_pred)
for i, j in enumerate([Link](y_set)):
[Link](X_set[y_set == j, 0], X_set[y_set == j, 1],
c = ListedColormap(('red', 'green'))(i), label = j)
# Predictions
y_pred = sgd_binary.predict(X_test_scaled)
y_pred_proba = sgd_binary.predict_proba(X_test_scaled)[:, 1]
# Evaluation
print("Accuracy:", accuracy_score(y_test, y_pred))
print("\nConfusion Matrix:")
print(confusion_matrix(y_test, y_pred))
print("\nClassification Report:")
print(classification_report(y_test, y_pred))
# ROC Curve
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
roc_auc = roc_auc_score(y_test, y_pred_proba)
[Link](figsize=(8, 6))
[Link](fpr, tpr, color='darkorange', lw=2,
label=f'ROC curve (AUC = {roc_auc:.2f})')
[Link]([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
[Link]([0.0, 1.0])
[Link]([0.0, 1.05])
[Link]('False Positive Rate')
[Link]('True Positive Rate')
[Link]('Receiver Operating Characteristic (ROC) Curve')
[Link](loc="lower right")
[Link]()
print("\nFeature Importance:")
print(feature_importance)
# Predictions
y_pred = sgd_multi.predict(X_test_scaled)
if __name__ == "__main__":
main()
3.5 KNN
K-Nearest Neighbors “KNN”, est l’un des nombreux algorithmes (apprentissage supervisé) utilisés
dans l’exploration de données et l’apprentissage automatique, c’est un algorithme de classificateur
dans lequel l’apprentissage est basé sur la similarité des données (un vecteur). L’algorithme KNN
suppose que des objets similaires existent à proximité. En d’autres termes, des choses similaires
sont proches les unes des autres.
L’algorithme Lazy comme KNN ne comporte pas d’étape d’apprentissage. Tous les points de
données ne seront utilisés qu’au moment de la prévision. En l’absence d’étape de formation,
l’étape de prédiction est coûteuse. Un algorithme d’apprenant impatient apprend avec empresse-
ment pendant l’étape de formation. Pour rechercher des points similaires les plus proches, vous
devez calculer la distance entre les points à l’aide de mesures de distance telles que la distance
euclidienne, la distance de Hamming, la distance de Manhattan et la distance de Minkowski.
N-dimensional Manhattan distance
Exemple numérique
Nous disposons de données issues de l’enquête par questionnaire (pour demander l’avis des per-
sonnes) et de tests objectifs portant sur deux attributs (durabilité à l’acide et force) pour déter-
miner si un mouchoir en papier spécial est bon ou non. Voici quatre échantillons de formation.
À présent, l’usine fabrique un nouveau tissu qui répond aux tests de laboratoire avec X1 = 3
et X2 = 7. Sans autre enquête coûteuse, pouvons-nous deviner quelle est la classification de ce
nouveau tissu ?
1. Déterminer le paramètre K = nombre de voisins les plus proches Supposons utiliser K = 3
2. Calculez la distance entre l’instance de requête et tous les échantillons d’apprentissage. La
coordonnée de l’instance de requête est (3, 7), au lieu de calculer la distance calculée, la distance
carrée est plus rapide à calculer (sans racine carrée).
On trie la distance et déterminez les voisins les plus proches en fonction de la distance minimale
K-ième.
3. En Utilisant la majorité simple de la catégorie des voisins les plus proches comme valeur de
prédiction de l’instance de requête.
Nous avons 2 Good et 1 Bad, puisque 2> 1, puis nous concluons qu’un nouveau tissu de papier
qui a passé avec succès les tests de laboratoire avec X1 = 3 et X2 = 7 est inclus dans la catégorie
Good.
KNN Binaire
# Assigning features and label variables
# First Feature
weather=['Sunny','Sunny','Overcast','Rainy','Rainy','Rainy','Overcast','Sunny','
Sunny',
'Rainy','Sunny','Overcast','Overcast','Rainy']
# Second Feature
temp=['Hot','Hot','Hot','Mild','Cool','Cool','Cool','Mild','Cool','Mild','Mild','
Mild','Hot','Mild']
model = KNeighborsClassifier(n_neighbors=3)
#Predict Output
predicted= [Link]([[0,2]]) # 0:Overcast, 2:Mild
print(predicted)
KNN Multiple
#Import scikit-learn dataset library
from sklearn import datasets
#Load dataset
iris = datasets.load_iris()
print(iris.feature_names)
x = [Link][:, 0:4] # we only take the first four features.
y = [Link]
Il n’existe pas de méthodes statistiques prédéfinies pour trouver la valeur la plus favorable de K.
print(iris.feature_names)
x = [Link][:, 0:4] # we only take the first four features.
y = [Link]
error_rate = []
for i in range(1,40):
knn = KNeighborsClassifier(n_neighbors=i)
[Link](X_train,y_train)
pred_i = [Link](X_test)
error_rate.append([Link](pred_i != y_test))
[Link](figsize=(10,6))
[Link](range(1,40),error_rate,color='blue', linestyle='dashed',
marker='o',markerfacecolor='red', markersize=10)
[Link]('Error Rate vs. K Value')
[Link]('K')
[Link]('Error Rate')
print("Minimum error:-",min(error_rate),"at K =",error_rate.index(min(error_rate)))
acc = []
# Will take some time
from sklearn import metrics
for i in range(1,40):
neigh = KNeighborsClassifier(n_neighbors = i).fit(X_train,y_train)
[Link](figsize=(10,6))
[Link](range(1,40),acc,color = 'blue',linestyle='dashed',
marker='o',markerfacecolor='red', markersize=10)
[Link]('accuracy vs. K Value')
[Link]('K')
[Link]('Accuracy')
print("Maximum accuracy:-",max(acc),"at K =",[Link](max(acc)))
Formellement, c’est p(y|x; θ) où p peut être n’importe quel modèle de classification tel que le
modèle de régression logistique.
D’autre part, le modèle génératif est le modèle qui essaie d’abord d’apprendre à quoi chaque
objet peut ressembler. Ensuite, sur la base de l’entrée, il donne une probabilité que l’entrée soit
de cette classe. Il dispose des concepts sur ce à quoi l’objet pourrait ressembler. Il peut générer
une nouvelle image sur la base des connaissances passées.
L’exemple classique est le classificateur naïf de Bayes. Dans ce cas, nous avons une classe préa-
lable. Une distribution préalable est essentiellement la connaissance que nous supposons de la dis-
tribution des données. Nous supposons simplement que le modèle que nous sélectionnons comme
antérieur est un modèle approprié pour expliquer les informations cachées dans l’ensemble de
données. À partir de l’ensemble de données, nous pouvons savoir quels paramètres sont les mieux
adaptés au modèle que nous avons sélectionné. Avec un modèle antérieur de classe calculé, nous
pouvons utiliser la règle de Bayes pour calculer la probabilité d’appartenir à chaque classe, puis
choisir celle dont la valeur est la plus élevée. Parallèlement, avec une certaine antériorité, nous
pouvons générer un nouvel échantillon à partir du modèle antérieur, puis générer de nouvelles
caractéristiques sur la base de l’antériorité choisie. C’est ce qu’on appelle le processus génératif.
probabilité_conditionnelle ∗ probabilité_prieurs
probabilité_postérieure =
preuve
Si nous utilisons le théorème de Bayes comme classificateur, notre but, ou fonction objectif, est
de maximiser la probabilité postérieure.
Maintenant, parlons des composants individuels. Les prieurs représentent essentiellement notre
connaissance experte (ou toute autre connaissance préalable. Le terme d’évidence s’annule car il
est constant pour toutes les classes.
Il est temps de parler de la partie "naïve" du "classificateur naïf de Bayes". Ce qui le rend "naïf"
est que nous calculons la probabilité conditionnelle (parfois aussi appelée vraisemblance) comme
le produit des probabilités individuelles pour chaque caractéristique :
d
p(x|wj ) = p(1|wj ) ∗ ..... ∗ p(d|wj ) = p(xk |wj )
Y
k=1
Étant donné que cette hypothèse (l’indépendance absolue des caractéristiques) n’est probable-
ment jamais satisfaite dans la pratique, c’est la partie vraiment "naïve" de Bayes naïf.
P(eleve est une fille ET eleve pratique allmend)= P(eleve est une fille) * P(eleve pratique
allmend | eleve est une fille)
P(eleve est une fille ET eleve pratique allmend)= P(eleve pratique allmend ) * P(eleve est une
fille | eleve pratique allmend)
Calculons la probabilité suivante : Quelle est la probabilité qu’on tire au hasard un élève parlant
Allemand sachant qu’elle est une fille ? Selon la formule de Bayes on a :
P (B A) P (A|B) ∗ P (B)
T
P (Allmend|F ille) = P (B|A) = =
P (A) P (A)
P(A) est la probabilité de prendre au hasard une fille de la population des élèves de la classe. On
appelle P(A) la probabilité antérieure (prior probability).
cardinal(A) 14
P (A) = = = 0.4666
cardinal(Ω) 30
10
T
cardinal(B A)
P (B A) = = = 0.333
\
cardinal(Ω) 30
Ce qui donne :
10
0.333
P (B|A) = 30
= = 0.7143
14
30
0.4666
Note :
— le cardinal d’un ensemble est le nombre d’éléments dans ce dernier
— cardinal(Ω) représente l’ensemble des lycéens de notre exemple (l’univers de probabilités)
Avec notre jeu de données, on peut calculer facilement un certain nombre de probabilités :
cardinal(Banane) 500
P (Banane) = = = 0.5
cardinal(T ousf ruits) 1000
Calculons maintenant le terme : P(Long | Banane) : Probabilité que le fruit est long sachant qu’il
s’agit d’une banane.
cardinal(BananeEtLong) 400
P (Long|Bannane) = = = 0.8
cardinal(Banane) 500
Avec la même logique, on peut calculer les probabilités suivantes : P(Sucre | Banane) et P(Jaune
| Banane) . Je vous invite à les calculer comme guise d’entraînement. Maintenant, qu’on a toutes
nos probabilités utiles pour notre calcul, on peut calculer la probabilité suivante :
On remarque que la probabilité que notre fruit soit une banane P(Banane | long , jaune,sucre) est
largement plus grande que celle des autres probabilités. On classifie notre fruit inconnu comme
étant une banane.
Inconvénients :
— l’algorithme Naive Bayes Classifier suppose l’indépendance des variables : C’est une hy-
pothèse forte et qui est violée dans la majorité des cas réels.
Naive Bayes
# example of preparing and making a prediction with a naive bayes model
from [Link] import make_blobs
from [Link] import norm
from numpy import mean
from numpy import std
L’objectif de l’algorithme SVM est de créer la meilleure ligne ou limite de décision capable de
séparer l’espace à n dimensions en classes afin que nous puissions facilement placer le nouveau
point de données dans la bonne catégorie à l’avenir. Cette frontière de meilleure décision est
appelée un hyperplan.
SVM choisit les points/vecteurs extrêmes qui aident à créer l’hyperplan. Ces cas extrêmes sont
appelés vecteurs de support et, par conséquent, l’algorithme est appelé machine à vecteur de
support. Considérez le diagramme ci-dessous dans lequel deux catégories différentes sont classées
à l’aide d’une limite de décision ou d’un hyperplan :
— SVM linéaire : SVM linéaire est utilisé pour les données séparables linéairement, ce qui
signifie que si un ensemble de données peut être classé en deux classes en utilisant une
seule ligne droite, ces données sont alors appelées données séparables linéairement et le
classificateur est utilisé appelé classificateur SVM linéaire.
Hyperplan : il peut y avoir plusieurs lignes/limites de décision pour séparer les classes dans un
espace à n dimensions, mais nous devons trouver la meilleure limite de décision qui aide à classer
les points de données. Cette meilleure frontière est connue sous le nom d’hyperplan de SVM.
Les dimensions de l’hyperplan dépendent des entités présentes dans le jeu de données, ce qui
signifie que s’il y a 2 entités (comme indiqué sur l’image), alors l’hyperplan sera une ligne droite.
Et s’il y a 3 caractéristiques, alors l’hyperplan sera un plan à 2 dimensions.
Nous créons toujours un hyperplan qui a une marge maximale, c’est-à-dire la distance maximale
entre les points de données.
Support vectors :Les points de données ou vecteurs les plus proches de l’hyperplan et qui affectent
la position de l’hyperplan sont appelés vecteurs de support. Puisque ces vecteurs supportent l’hy-
perplan, donc appelé vecteur de support.
Donc, comme il s’agit d’un espace à 2 dimensions, en utilisant simplement une ligne droite, nous
pouvons facilement séparer ces deux classes. Mais plusieurs lignes peuvent séparer ces classes.
Considérez l’image ci-dessous :
Y = wT X + b → Y = w1 x1 + w2 x2 + ... + wn xn + b
Si slope = -1 et b = 0 :
" #
−1
w =
T
(3.1)
0
X = [−4, 0] (3.2)
wT X + b = 4 (3.3)
positif
Si slope = -1 et b = 0 :
" #
−1
w =
T
(3.4)
0
X = [4, 4] (3.5)
wT X + b = −4 (3.6)
négatif
|wT X + B0 |
d= (3.7)
||X||
x1 = w T X 1 + b = 1
x2 = wT X2 + b = −1
On va éliminer wT :
wT (X1 −X2 )
||w||
= ||w||
2 2
→ M ax( ||w|| ). ou bien M in(||w||), autre écriture maximiser 2/||w||2 ou bien
minimiser ||w||2 , (Hard Margine).
q
||w|| = (w12 + w22 + . . . .. + wn2 ).
wT X + b <= −1∀x ∈ c2 − − − − − − − ß−
Les nouvelles variables ζi ajoutent de la flexibilité pour les erreurs de classification du modèle :
X1 X2 Y
1 3 -1
2 1 -1
4 5 -1
6 9 -1
8 7 -1
5 1 1
7 1 1
9 4 1
12 7 1
13 6 1
S1 = (2, 1)
S2 = (8, 7)
S3 = (5, 1)
on augmenter les vecteures en ajoutant 1 : Bais/Inception.
S˜1 = (2, 1, 1)
S˜2 = (8, 7, 1)
S˜3 = (5, 1, 1)
Donc on peut construire un systeme d’équation lineaire :
α1 6 + α2 24 + α3 12 = −1
α1 24 + α2 114 + α3 48 = −1
α1 12 + α2 48 + α3 27 = +1
w = Σni αi S̃i
−17 1
w= (2, 1, 1) + (8, 7, 1) + (5, 1, 1)
6 6
−5, 66 + 1, 33 + 5
w = −2, 83 + 1, 16 + 1 (3.8)
−2, 83 + 0, 166 + 1
0, 667
w = −0, 667
(3.9)
−1, 664
— Favorise une grande marge entre les classes, améliorant ainsi la généralisation.
— Gère mieux les données bruyantes que les fonctions de perte 0/1 simples.
Limitations :
f (x) = w. ∗ x + b
For x1 = [2, 3] :
For x2 = [1, 1] :
For n=2 :
Interpretation :
— Both samples have a loss of 1.5, indicating they are misclassified or within the margin.
— f (x1 ) = −0.5 and f (x2 ) = 0.5 are not far enough from the margin (±1) for their respective
classes.
Compute Gradients :
We calculate the gradients for w and b to update the parameters using a method like gradient
descent.
Loss terms :
For x1 :
δL
δw
= −y1 ∗ x1 = −1 ∗ [2, 3] = [−2, −3]
δL
δb
= −y1 = −1
For x2 :
δL
δw
= −y2 ∗ x2 = −(−1) ∗ [1, 1] = [1, 1]
δL
δb
= −y2 = 1
∂
∂w
1
2
kwk2 =w
Combine Gradients
Combine the gradients for the two samples and add the regularization term. Assume C=1 :
∂Objective
∂b
= C. −1+1
n
=0
Update Parameters
Update w :
w =w−α∗ ∂Objective
∂w
= [1, −1] − 0.1 ∗ [1.5, −2] = [0.85, −0.8]
Update b :
b = b − α. ∂Objective
∂b
= 0.5 − 0.1 ∗ 0 = 0.5
Re-evaluate
After the update, recalculate f(x) and hinge loss for each sample. Repeat this process iteratively
until the loss is minimized.
Source Code :
# Initialize parameters
w = [Link]([1.0, -1.0]) # Weight vector
b = 0.5 # Bias
C = 1.0 # Regularization strength
learning_rate = 0.1 # Learning rate
hinge_loss /= n
grad_w /= n
grad_b /= n
# Update parameters
w -= learning_rate * grad_w
b -= learning_rate * grad_b
# Output results
print("Updated weights:", w)
print("Updated bias:", b)
print("Hinge loss after update:", loss)
On peut définir les support vecteurs par l’intermédiaire des multiplicateurs de Lagrange, à travers
une méthode d’optimisation : "Sequential Minimal Optimization".
Pour résoudre le problème de programmation quadratique ci-dessus avec des contraintes d’inéga-
lité, nous pouvons utiliser la méthode des multiplicateurs de Lagrange. La fonction de Lagrange
est donc (Dual forme) :
1 X
L(w, w0 , α) = ||w||2 + αi yi (wT xi + w0 ) − 1
2 i
∂L ∂L ∂L
= 0, = 0, =0
∂w ∂α ∂w0
et
∂L
=0→ αi y i = 0
X
∂w0 i
1 XX
Ld = − αi αk yi yk (xi )T (xk ) +
X
αi
2 i k i
L’avantage de ce qui précède est que nous disposons d’une expression pour w en termes de
multiplicateurs de Lagrange. La fonction objective ne comporte aucun terme. Un multiplicateur
de Lagrange est associé à chaque point de données. Le calcul de w0 est également expliqué plus
loin.
La classification de tout point de test x peut être déterminée à l’aide de cette expression :
y(x) = α i y i xT xi + w 0
X
Une valeur positive de y(x)implique que x appartient à 1 et une valeur négative signifie que x
appartient à -1.
Le problème dual est plus facile à résoudre puisqu’il ne comporte que les multiplicateurs de
Lagrange. En outre, le fait que le problème dual dépende des produits intérieurs des données
d’apprentissage est utile pour étendre les SVM linéaires à l’apprentissage de frontières non li-
néaires.
Kuhn-Tucker Conditions
En outre, les conditions de Karush-Kuhn-Tucker (KKT) sont satisfaites par le problème d’opti-
misation sous contrainte ci-dessus, comme indiqué ci-dessous :
αi ≥ 0
yi y(xi ) − 1 ≥ 0
αi (yi y(xi ) − 1) = 0
Les conditions KKT imposent que, pour chaque point de données, l’une des conditions suivantes
soit remplie :
Le multiplicateur de Lagrange est nul, c’est-à-dire que αi = 0. Ce point ne joue donc aucun rôle
dans la classification. OR
ti y(xi ) = 1 et αi > 0 : Dans ce cas, le point de données joue un rôle dans la détermination de la
valeur de w. Un tel point est appelé vecteur de support.
ts y(xs ) = 1
en nous donnant :
ts ( αi yi xTs xi + w0 ) = 1
X
L’algorithme SMO simplifié prend les paramètres α, αi et αj , et les optimise. Pour ce faire, nous
itérons sur tout αi , i = 1, . . . M. Si αi ne satisfait pas aux conditions de Karush-Kuhn-Tucker
dans une certaine tolérance numérique, nous sélectionnons αj au hasard parmi les m - 1 α res-
tants et optimisons αi et αj . La fonction suivante nous aidera à sélectionner j au hasard :
Si aucun des α n’est modifié après quelques itérations sur tous les αi , alors l’algorithme se ter-
mine. Nous devons également trouver les bornes L et H :
y (i) (Ei − Ej )
αj := αj −
η
d’ou,
Ek = f (x(k) ) − y (k)
η = 2 < x(i) , x(j) > − < x(i) , x(i) > − < x(j) , x(i) >
d’ou
< X, Y >= X.Y T = ΣXi Yi
Si cette valeur se trouve en dehors des limites L et H, nous devons réduire la valeur de αj pour
la ramener dans cette fourchette :
H if αj > H
αj = αj if H ≤ αj ≤ L
L if αj < L
Enfin, nous pouvons trouver la valeur de αi . Celle-ci est donnée par :
(old)
αi := α + y (i) y (j) (αj − αj )
Cet exemple vous montrera que le modèle n’est pas aussi complexe qu’il n’y paraît.
SOM Optimizer
import numpy as np
# Calculate E_j
f_j = [Link](alpha * y * [Link]([kernel(X[j], X[k]) for k in
range(m)])) + b
E_j = f_j - y[j]
# Compute L and H
if y[i] == y[j]:
L = max(0, alpha[j] + alpha[i] - C)
H = min(C, alpha[j] + alpha[i])
else:
L = max(0, alpha[j] - alpha[i])
H = min(C, C + alpha[j] - alpha[i])
# Compute eta
eta = 2 * kernel(X[i], X[j]) - kernel(X[i], X[i]) - kernel(X[j], X[
j])
if eta >= 0:
continue
# Update alpha[j]
alpha[j] -= y[j] * (E_i - E_j) / eta
alpha[j] = [Link](alpha[j], L, H)
# Update alpha[i]
alpha[i] += y[i] * y[j] * (alpha_j_old - alpha[j])
# Update b
b1 = b - E_i - y[i] * (alpha[i] - alpha_i_old) * kernel(X[i], X[i])
- y[j] * (alpha[j] - alpha_j_old) * kernel(X[i], X[j])
b2 = b - E_j - y[i] * (alpha[i] - alpha_i_old) * kernel(X[i], X[j])
- y[j] * (alpha[j] - alpha_j_old) * kernel(X[j], X[j])
b = b1 if 0 < alpha[i] < C else (b2 if 0 < alpha[j] < C else (b1 +
b2) / 2)
num_changed_alphas += 1
return alpha, b
# Example Usage
X=[Link]([[1,3],[2,1],[4,5],[6,9],[8,7],[5,1],[7,1],[9,4],[12,7],[13,6]])
y=[Link]([-1,-1,-1,-1,-1,1,1,1,1,1])
C = 1
tol = 1e-3
max_passes = 5
Linear SVM
import numpy as nm
import [Link] as mtp
import pandas as pd
#importing datasets
data_set= pd.read_csv('user_data.csv')
Donc, pour séparer ces points de données, nous devons ajouter une dimension supplémentaire.
Pour les données linéaires, nous avons utilisé deux dimensions x et y, donc pour les données non
linéaires, nous ajouterons une troisième dimension z. Il peut être calculé comme suit :
z = x2 + y 2
Alors maintenant, SVM divisera les ensembles de données en classes de la manière suivante.
Considérez l’image ci-dessous :
K(xi , xj ) = xTi xj
Le noyau polynomial :
Le noyau gaussien :
||x − y||2
K(xi , xj ) = exp( )
2σ 2
Le noyau sigmoïde :
K(xi , xj ) = tanh(αxT y + c)
url = "[Link] #
Assign colum names to the dataset
colnames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
# Read dataset to pandas dataframe
irisdata = pd.read_csv(url, names=colnames)
X = [Link]('Class', axis=1)
y = irisdata['Class']
#Polynomial Kernel
y_pred = [Link](X_test)
#Guassian Kernel
y_pred = [Link](X_test)
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
#Sigmoid Kernel
from [Link] import SVC
svclassifier = SVC(kernel='sigmoid')
y_pred = [Link](X_test)
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
Si nous comparons les performances des différents types de noyaux, nous pouvons clairement
voir que le noyau sigmoïde est le moins performant. Cela est dû au fait que la fonction sigmoïde
renvoie deux valeurs, 0 et 1, elle est donc plus adaptée aux problèmes de classification binaire.
Cependant, dans notre cas, nous avions trois classes de sortie.
Parmi le noyau gaussien et le noyau polynomial, nous pouvons voir que le noyau gaussien a
atteint un taux de prédiction parfait de 100 % tandis que le noyau polynomial a mal classé une
instance. Par conséquent, le noyau gaussien a légèrement mieux performé. Cependant, il n’y a
pas de règle absolue quant au noyau qui fonctionne le mieux dans chaque scénario. Il s’agit de
tester tous les noyaux et de sélectionner celui avec les meilleurs résultats sur votre jeu de données
de test.
Comme pour q :
h i
q = − 1......1
Comme Pour P :
y1 y1 φ(x1 , x1 ) . . . yN y1 φ(xN , x1 )
p= .. .. ..
.
. .
y1 yN φ(x1 , xN ) . . . yN yN φ(xN , xN )
φ(xm , xn ) = xTm ∗ xn
φ(xm , xn ) = (1 + xTm ∗ xn )d
n=1
0 ≤ αn ≤ C
Les conditions de la programmation quadratique se présentent sous la forme :
Gx ≤ h, Ax = b
b=0
αn ≤ C, − αn ≤ 0
G devient donc
1
0 ... 0
0
1 ... 0
..
... .. ..
. . .
0 ... 0 1
G=
−1 0 . . . 0
0 −1 . . . 0
. .. .. ..
. . . .
.
0 . . . 0 −1 rows=2N,cols=N
h devient donc
C
.
.
.
C
h= 0
.
.
.
0 rows=2N
N
W =
X
α n xn y n
n=1
et b :
i∈SV (yi − j∈SV (αj yj φ(xj , xi )))
P P
b=
len(SV )
class svm_reg :
def linear_kernal (self,x1 ,x2) :
return x1.T@x2
q = matrix(-1*[Link](n))
b = matrix(0.0)
A = matrix(Y*1.0,(1,n))
# Calculate b
self.b = [Link]([self.svs_y[i] - sum([alpha * y * [Link](x,self.svs_x
[i])
for alpha , y ,x in zip([Link] , self.svs_y , self.svs_x )] ) for i in
range(len(self.svs_x))])
class svm_class :
''' One vs all classifier , Uses set of svm_reg models for each class in the
output '''
def __init__(self,m_type : str = 'linear' , C : float = 6 ,param = 1 ) -> None:
self.C = C;
[Link] = param
self.m_type = m_type
def fit(self, X , Y) :
classes = set(Y)
models_dict = [Link](classes)
for cl in classes :
idxs = (Y== cl)
Y_modified =-1* [Link](len(Y))
Y_modified[idxs] = 1
models_dict[cl] = svm_reg(m_type= self.m_type ,C = self.C , param= self
.param)
models_dict[cl].fit(X,Y_modified.T)
self.models_dict = models_dict
def _predict(self,inpt) :
results_dict = [Link](self.models_dict.keys())
for cl in self.models_dict.keys() :
results_dict[cl] = self.models_dict[cl].predict(inpt)
#path = '[Link]
[Link]'
path = '[Link]'
data = pd.read_csv(path ,header= None);
[Link]()
input_data = [Link][:,0:34].copy()
output_data = [Link][:,34].copy()
output_data.replace('g',1 ,inplace=True)
output_data.replace('b',-1 ,inplace=True)
C = 1000
gamma = 0.1
model = svm_class(m_type='rbf' , C= C ,param= gamma)
x = [Link](input_train)
y = [Link](output_train)
[Link](x,y)
res_model = [Link]([Link](input_test))
print('Model accuracy =' , accuracy_score(res_model,output_test) *100)
Dans la littérature il existe pas mal d’algorithmes pour établissement d’un arbre de décision
citons : ID3, CART, C4.5.
ID3 (C4.5 / C 5) : ID3 a été développé en 1986 par Ross Quinlan. L’algorithme crée un arbre
multi-voies, trouvant pour chaque nœud la caractéristique catégorielle qui générera le gain d’in-
formation le plus important pour les cibles catégorielles. Les arbres sont cultivés à leur taille
maximale, puis une étape d’élagage est généralement appliquée pour améliorer la capacité de
l’arbre à généraliser aux données invisibles. (Entropie et Méthode Gain)
CART : CART est très similaire à C4.5, mais il diffère en ce sens qu’il prend en charge les va-
riables cibles numériques (régression) et ne calcule pas les ensembles de règles. CART construit
des arbres binaires à l’aide de la fonctionnalité et du seuil générant le gain d’informations le plus
élevé sur chaque nœud. (Index de Gini)
ID 3 exemple numérique
Le tableau suivant indique les facteurs décisionnels pour jouer au tennis à l’extérieur au cours
des 14 derniers jours.
Entropy(S) = Σ − p(I).logp(I)
Il y a 8 instances pour Weak Wind. La décision de 2 éléments est non et 6 éléments sont oui
comme illustré ci-dessous. Entropy(Decision|Wind=Weak) = – p(No) . log p(No) – p(Yes) . log
p(Yes)
Entropy(Decision|Wind=Weak) = – (2/8) . log(2/8) – (6/8) . log(6/8) = 0.811
Ici, il y a 6 instances pour Strong wind . La décision est divisée en deux parties égales.
Entropy(Decision|Wind=Strong) = – p(No) . log p(No) – p(Yes) . log p(Yes)
Entropy(Decision|Wind=Strong) = – (3/6) . log2(3/6) – (3/6) . log(3/6) = 1
On peut maintenant revenir à l’équation Gain (Decision, Wind).
Gain(Decision, Wind) = Entropy(Decision) – [ p(Decision|Wind=Weak) . Entropy(Decision|Wind=Weak)
] – [ p(Decision|Wind=Strong) . Entropy(Decision|Wind=Strong) ] = 0.940 – [ (8/14) . 0.811 ] –
[ (6/14). 1] = 0.048
Les calculs pour la colonne de Wind sont terminés. Maintenant, nous devons appliquer les mêmes
calculs aux autres colonnes pour trouver le facteur le plus déterminant dans la décision.
1. Gain(Decision, Outlook) = 0.246
2. Gain(Decision, Temperature) = 0.029
3. Gain(Decision, Humidity) = 0.151
Comme on le voit, le facteur de perspective sur la décision produit le score le plus élevé. C’est
pourquoi la décision de perspective apparaîtra dans le nœud racine de l’arbre.
Ici, il y a 5 instances pour les perspectives ensoleillées. La décision serait probablement de 3/5
non, 2/5 oui.
1. Gain(Outlook=Sunny|Temperature) = 0.570
2. Gain(Outlook=Sunny|Humidity) = 0.970
3. Gain(Outlook=Sunny|Wind) = 0.019
Maintenant, l’humidité est la décision car elle produit le meilleur score si les perspectives sont
ensoleillées.
À ce stade, la décision sera toujours No si Humidity est High.
Enfin, cela signifie que nous devons vérifier Humidity et décider si les perspectives sont Sunny.
On peut calculer les trois Gain de Outlook=Rain selon , Temperature, Humidity, Wind.
La construction de l’arbre de décision est donc terminée. On peut utiliser les règles suivantes
pour la prise de décision.
Arbre de decision
from [Link] import DecisionTreeClassifier # Import Decision Tree Classifier
La méthode du vote maximal est généralement utilisée pour les problèmes de classification. Dans
cette technique, plusieurs modèles sont utilisés pour faire des prédictions pour chaque point de
données. Les prédictions de chaque modèle sont considérées comme un "vote". Les prédictions
obtenues par la majorité des modèles sont utilisées comme prédiction finale.
Max Voting
from [Link] import VotingClassifier
model1 = LogisticRegression(random_state=1)
model2 = [Link](random_state=1)
model = VotingClassifier(estimators=[('lr', model1), ('dt', model2)], voting='hard'
)
[Link](x_train,y_train) [Link](x_test,y_test)
Comme pour la technique du vote maximal, plusieurs prédictions sont faites pour chaque point
de données dans le calcul de la moyenne. Dans cette méthode, nous prenons la moyenne des pré-
dictions de tous les modèles et l’utilisons pour faire la prédiction finale. Le calcul de la moyenne
peut être utilisé pour faire des prédictions dans les problèmes de régression ou pour calculer les
probabilités dans les problèmes de classification.
Par exemple, dans le cas ci-dessous, la méthode de calcul de la moyenne prendrait la moyenne
de toutes les valeurs.
Soit (5+4+5+4+4)/5 = 4,4
Il s’agit d’une extension de la méthode de calcul de la moyenne. Tous les modèles se voient attri-
buer des poids différents qui définissent l’importance de chaque modèle pour la prédiction. Par
exemple, si deux de vos collègues sont des critiques, tandis que d’autres n’ont aucune expérience
préalable dans ce domaine, les réponses de ces deux amis auront plus d’importance que celles des
autres personnes.
Le résultat est calculé comme suit : [(5*0,23) + (4*0,23) + (5*0,18) + (4*0,18) + (4*0,18)] = 4,41.
Weighted Average
model1 = [Link]()
model2 = KNeighborsClassifier()
model3= LogisticRegression()
[Link](x_train,y_train)
[Link](x_train,y_train)
[Link](x_train,y_train)
pred1=model1.predict_proba(x_test)
pred2=model2.predict_proba(x_test)
pred3=model3.predict_proba(x_test)
finalpred=(pred1*0.3+pred2*0.3+pred3*0.4)
L’idée derrière le bagging est de combiner les résultats de plusieurs modèles (par exemple, tous
les arbres de décision) pour obtenir un résultat généralisé. Voici une question : Si vous créez tous
les modèles sur le même ensemble de données et que vous les combinez, cela sera-t-il utile ? Il
y a de fortes chances que ces modèles donnent le même résultat puisqu’ils reçoivent les mêmes
données. Comment résoudre ce problème ? L’une des techniques est le bootstrapping.
Staking
Le Stacking est une technique d’apprentissage d’ensemble qui utilise les prédictions de plusieurs
modèles (par exemple, arbre de décision, knn ou svm) pour construire un nouveau modèle. Ce
modèle est utilisé pour faire des prédictions sur l’ensemble de test.
3. Le modèle de base (dans ce cas, l’arbre de décision) est ensuite ajusté sur l’ensemble des don-
nées de formation.
4. À l’aide de ce modèle, des prédictions sont faites sur l’ensemble de test.
6. les prédictions de l’ensemble d’entraînement sont utilisées comme caractéristiques pour construire
un nouveau modèle..
Le Boosting est un processus séquentiel dans lequel chaque modèle suivant tente de corriger les
erreurs du modèle précédent. Les modèles suivants dépendent du modèle précédent. Comprenons
le fonctionnement du boosting dans les étapes suivantes.
1. Un sous-ensemble est créé à partir de l’ensemble de données original.
2. Au départ, tous les points de données reçoivent la même pondération.
3. Un modèle de base est créé sur ce sous-ensemble.
4. Ce modèle est utilisé pour faire des prédictions sur l’ensemble des données.
5. Les erreurs sont calculées à partir des valeurs réelles et des valeurs prédites.
6. Les observations dont les prédictions sont erronées se voient attribuer une pondération
plus élevée. (Ici, les trois points bleu-plus mal classés auront une pondération plus élevée).
7. Un autre modèle est créé et des prédictions sont faites sur l’ensemble des données.(Ce
modèle tente de corriger les erreurs du modèle précédent).
8. De même, plusieurs modèles sont créés, chacun corrigeant les erreurs du modèle précédent.
9. Le modèle final (apprenant fort) est la moyenne pondérée de tous les modèles (apprenants
faibles).
Bagging algorithms
— Bagging meta-estimator
— Random forest
Boosting algorithms
— AdaBoost
— GBM
— XGBM
— Light GBM
— CatBoost
Bagging
# define dataset
X, y = get_dataset()
# get the models to evaluate
models = get_models()
# evaluate the models and store results
results, names = list(), list()
for name, model in [Link]():
# evaluate the model
scores = evaluate_model(model, X, y)
# store the results
[Link](scores)
[Link](name)
# summarize the performance along the way
print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))
# plot model performance for comparison
[Link](results, labels=names, showmeans=True)
[Link]()
Stacking
from numpy import mean
from numpy import std
from [Link] import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.linear_model import LogisticRegression
Boosting
# example of grid searching key hyperparameters for adaboost on a classification
dataset
from [Link] import make_classification
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.model_selection import GridSearchCV
from [Link] import AdaBoostClassifier
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15,
n_redundant=5, random_state=6)
# define the model with default hyperparameters
model = AdaBoostClassifier()
# define the grid of values to search
grid = dict()
#The number of trees can be set via the "n_estimators" argument and defaults to 50.
grid['n_estimators'] = [10, 50, 100, 500]
grid['learning_rate'] = [0.0001, 0.001, 0.01, 0.1, 1.0]
# define the evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# define the grid search procedure
grid_search = GridSearchCV(estimator=model, param_grid=grid, n_jobs=-1, cv=cv,
scoring='accuracy')
# execute the grid search
grid_result = grid_search.fit(X, y)
# summarize the best score and configuration
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
# summarize all scores that were evaluated
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
4.1 Kmeans
La classification K-means est un type d’apprentissage non supervisé, qui est utilisé lorsque vous
avez des données non étiquetées (c’est-à-dire des données sans catégories ou groupes définis). Le
but de cet algorithme est de trouver des groupes dans les données, avec le nombre de groupes
représentés par la variable K. L’algorithme fonctionne de manière itérative pour affecter chaque
point de données à l’un des K groupes en fonction des caractéristiques fournies. Les points de don-
nées sont regroupés en fonction de la similarité des fonctionnalités. Les résultats de l’algorithme
de regroupement des moyennes K sont :
— Les centroïdes des grappes K, qui peuvent être utilisés pour étiqueter de nouvelles données
— Étiquettes pour les données d’apprentissage (chaque point de données est attribué à un
seul cluster)
122
La deuxième étape consiste à attribuer K points aléatoires en tant que centroïdes. Ces points
K peuvent être des points du jeu de données ou extérieurs. Il y a une chose à noter cependant.
L’initialisation aléatoire des centroïdes peut parfois provoquer une interruption d’initialisation
aléatoire, ce que nous verrions bientôt dans cette section.
Dans la troisième étape, les points de jeu de données seraient alloués au centroïde le plus proche
d’eux.
La quatrième étape consiste à calculer le centroïde des groupes individuels et à y placer l’ancien
centroïde.
W CSS = ΣPi incluster1 distance(pi , c1 )2 + ΣPi incluster2 distance(pi , c2 )2 + ΣPi incluster3 distance(pi , c3 )2
Kmeans Sklearn
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import os
import [Link] as plt
import seaborn as sns
[Link](figsize=(10,5))
[Link](range(1, 11), wcss,marker='o',color='red')
[Link]('The Elbow Method')
[Link]('Number of clusters')
[Link]('WCSS')
[Link]()
si on ne connaît les Params de la distribution gaussienne (µ, σ 2 ), peut-on deviner si le point est
susceptible d’être a ou b ?
p(xi |b)p(b)
p(b|xi ) =
p(xi |b)p(b) + p(xi |a)p(a)
1 (xi − σb2 )
p(xi |b) = exp( )
2σb2
q
2πσ 2b
— Conniatre (µa , σa2 ) et (µb , σb2 ) pour deviner la source des points.
— Conniatre la source pour estimer (µa , σa2 ) et (µb , σb2 ).
L’algorithme d’expectation-maximisation, est une approche d’estimation du maximum de vrai-
semblance en présence de variables latentes.
L’algorithme EM est une approche itérative qui alterne entre deux modes. Le premier mode
tente d’estimer les variables manquantes ou latentes, appelées étape d’estimation ou étape E. Le
deuxième mode tente d’optimiser les paramètres du modèle pour mieux expliquer les données,
appelé étape de maximisation ou étape M.
EM Clustering
# example of a bimodal constructed from two gaussian processes
import numpy as np
import pandas as pd
from [Link] import GaussianMixture
import os
import [Link] as plt
import seaborn as sns
# fit model
model = GaussianMixture(n_components=4, init_params='random')
[Link](X)
# predict latent values
frame = [Link](X)
frame['cluster'] = yhat
[Link] = ['Age', 'Annual_Income', 'cluster']
color=['blue','green','red', 'black']
for k in range(0,4):
data = frame[frame["cluster"]==k]
[Link](data["Age"],data["Annual_Income"],c=color[k])
[Link]()
SOM est un type de réseau neuronal artificiel qui s’inspire également des modèles biologiques
des systèmes neuronaux des années 1970. Il suit une approche d’apprentissage non supervisé et
forme son réseau à l’aide d’un algorithme d’apprentissage compétitif. SOM est utilisé pour les
techniques de regroupement et de mise en correspondance (ou de réduction de la dimensionna-
lité) afin de mettre en correspondance des données multidimensionnelles avec des données de
dimension inférieure, ce qui permet de réduire des problèmes complexes pour en faciliter l’inter-
prétation. La SOM comporte deux couches, l’une étant la couche d’entrée et l’autre la couche de
sortie.
Algorithme
1. Initialisation des poids wij une valeur aléatoire peut être supposée. Initialiser le taux
d’apprentissage α.
2. : Calcul de la distance euclidienne quadratique.
D(j) = Σ(wij − xi )2
où i=1 à n et j=1 à m
3. : trouver l’indice J, lorsque D(j) est minimal, qui sera considéré comme l’indice gagnant.
4. : pour chaque j dans un voisinage spécifique de j et pour tous les i, calculer le nouveau
poids.
.
5. : Mettre à jour la règle d’apprentissage en utilisant :
α(t + 1) = 0, 5 ∗ t
.
6. : Test de la condition d’arrêt (Nombre d’iterations).
class SOM:
D0 = 0
D1 = 0
for i in range(len(sample)):
D0 = D0 + [Link]((sample[i] - weights[0][i]), 2)
D1 = D1 + [Link]((sample[i] - weights[1][i]), 2)
if D0 < D1:
return 0
else:
return 1
return weights
# Driver code
def main():
# Training Examples ( m, n )
T = [[1, 1, 0, 0], [0, 0, 0, 1], [1, 0, 0, 0], [0, 0, 1, 1]]
m, n = len(T), len(T[0])
# weight initialization ( n, C )
weights = [[0.2, 0.6, 0.5, 0.9], [0.8, 0.4, 0.7, 0.3]]
epochs = 3
alpha = 0.5
for i in range(epochs):
for j in range(m):
# training sample
sample = T[j]
if __name__ == "__main__":
main()
Nous avons initialisé au hasard les valeurs des poids (proches de 0 mais pas 0).
Pour déterminer la meilleure unité de correspondance, une méthode consiste à parcourir tous
les nœuds et à calculer la distance euclidienne entre le vecteur de poids de chaque nœud et le
vecteur d’entrée actuel. Le nœud dont le vecteur de poids est le plus proche du vecteur d’entrée
est désigné comme BMU.
distance = Σi=n
i=0 (Xi − Wi )
2
l’étape suivante consiste à calculer quels sont les autres nœuds qui se trouvent dans le voisinage
du BMU. Les vecteurs de poids de tous ces nœuds seront modifiés à l’étape suivante. on calcule le
rayon du voisinage, puis il suffit d’appliquer la méthode de Pythagore pour déterminer si chaque
nœud se trouve ou non à l’intérieur de la distance radiale.
On peut voir que le voisinage montré ci-dessus est centré autour de la BMU (point rouge) et
englobe la plupart des autres nœuds et le rayon du cercle.
−t
σ(t) = σ0 exp( )
λ
σ0 la largeur de la maille a t= 0
t le pas de temps actuel d’ou t = 0 ,1 2, ...n
λ constante temps
Au fil du temps, le voisinage se réduira à la taille d’un seul nœud, la BMU. Maintenant que
nous connaissons le rayon, il suffit d’itérer sur tous les nœuds du treillis pour déterminer s’ils se
trouvent ou non dans le rayon. Si un nœud se trouve dans le voisinage, son vecteur de poids est
ajusté comme suit à l’étape 4.
SOM Sklearn
import numpy as np
from [Link] import load_digits
from som import Som
from pylab import plot,axis,show,pcolor,colorbar,bone
digits = load_digits()
data = [Link]
labels = [Link]
som = Som(16,16,64,sigma=1.0,learning_rate=0.5)
som.random_weights_init(data)
print("Initiating SOM.")
som.train_random(data,10000)
print("\n. SOM Processing Complete")
bone()
pcolor(som.distance_map().T)
colorbar()
labels[labels == '0'] = 0
labels[labels == '1'] = 1
labels[labels == '2'] = 2
markers = ['o', 'v', '1', '3', '8', 's', 'p', 'x', 'D', '*']
colors = ["r", "g", "b", "y", "c", (0,0.1,0.8), (1,0.5,0), (1,1,0.3), "m", (0.4,0.6
,0)]
for cnt,xx in enumerate(data):
w = [Link](xx)
plot(w[0]+.5,w[1]+.5,markers[labels[cnt]],
markerfacecolor='None', markeredgecolor=colors[labels[cnt]],
markersize=12, markeredgewidth=2)
axis([0,[Link][0],0,[Link][1]])
show()
4.4 PCA
Une méthode d’apprentissage automatique importante pour la dimensionnalité est appelée ana-
lyse en composantes principales « Principal Component Analysis / PCA ».
C’est une méthode qui utilise de simples opérations matricielles d’algèbre linéaire et calcule une
projection des données d’origine dans le même nombre ou dans des dimensions inférieures.
La dimensionnalité fait référence au nombre de caractéristiques associées à chaque mesure de
données. Cela correspond aux colonnes d’une donnée tabulaire.
Lorsqu’un jeu de données est au-delà de la 2D ou de la 3D, il serait difficile de le visualiser. Mais
la plupart des ensembles de données utilisés pour l’analyse ont une très grande dimension, disons
des dizaines voire des centaines. Alors, comment gérons-nous ce scénario ? C’est là que le concept
de réduction de dimensionnalité entre en jeu.
La réduction de la dimensionnalité dans les statistiques et l’apprentissage automatique est le
processus par lequel le nombre de variables aléatoires considérées est réduit en obtenant un
ensemble de quelques variables principales.
La méthode PCA peut être décrite et mise en œuvre à l’aide des outils de l’algèbre linéaire.
PCA est une opération appliquée à un DataSet, représentée par une matrice A de n x m, qui
donne une projection de A que nous appellerons B.
X 4 8 13 7
Y 11 4 5 14
14 −11
!
−11 23
Etape 4
Valeurs propres et vecteurs propres
Valeur propre : det(S – λI) = 0 d’ou S = matrice cov , I matrice d’identité 2*2 .
14 − λ −11
det = =0
−11 23 − λ
deux racines.
λ1 > λ2
λ1 = 30, 38
et
λ2 = 6, 615
Vecteur propre de
λ1 : (S − λ1 I) ∗ e1 = 0
d’ou e1 matrice 2*1 [u1 ,u2]
14 − λ1 −11 u
∗ 1 =0
−11 23 − λ1 u2
−11, 38
u2 = u1
11
u2 = −1, 48u1
−11u1 + 11u1 = 0
Infinite de solutions
Donc si on prend u1 = t alors u2 = −1, 48 ∗ t
le vecteur propre de λ1 si on prend t = 11 est :
u1 = 11
et
u2 = −1, 48 ∗ 11 = −16.17
Normalisation de vecteur propre :
e1 :
11
q = 0, 55
(112 + (−16.17)2 )
−16.17
q = −0, 83
( (112 + (−16.17)2 )
de la même manier en calcule le vecteur propre de λ2 : e2 :
0,83 0,55
Etape 5
la nouvelle data set avec une seul dimension.
Propriété ex1 ex2 ex3 ex4
PC1 P11 P12 P13 P14
!
xi − moyenne(x)
P 11 = e ∗ T
yi − moyenne(y)
4−8
!
P 11 = [0, 55 − 0.83] ∗ = −4.305
11 − 8.5
PCA 1
from numpy import array
from numpy import mean
from numpy import cov
from [Link] import eig
# define a matrix
A = array([[1, 2], [3, 4], [5, 6]])
print(A)
# calculate the mean of each column
M = mean(A.T, axis=1)
print(M)
# center columns by subtracting column means
C = A - M
print(C)
# calculate covariance matrix of centered matrix
V = cov(C.T)
print(V)
# eigendecomposition of covariance matrix
values, vectors = eig(V)
print(vectors)
print(values)
PCA sKlearn
# Principal Component Analysis
from numpy import array
from [Link] import PCA
# define a matrix
A = array([[1, 2], [3, 4], [5, 6]])
print(A)
# create the PCA instance
pca = PCA(2)
# fit on data
[Link](A)
# access values and vectors
print(pca.components_)
print(pca.explained_variance_)
# transform data
B = [Link](A)
print(B)
PCA complet
import pandas as pd
import numpy as np
from [Link] import PCA
from sklearn import preprocessing
import [Link] as plt
x = [Link][:, features].values
y = [Link][:, ['target']].values
pca = PCA(n_components=2)
principalComponents = pca.fit_transform(x)
targetDataframe = df[['target']]
print(newDataframe)
[Link](principalDataframe.PC1, principalDataframe.PC2)
[Link]('PC1 against PC2')
[Link]('PC1')
[Link]('PC2')
print(pca.explained_variance_ratio_)
Ces valeurs montrent que la première composante principale PC1 explique 72,77% de la varia-
tion des données d’origine, tandis que la seconde composante principale explique 23,03 % de la
variation des données d’origine.
4.5 TSNE
Apprendre à visualiser des données de haute dimension dans un espace de basse dimension en
utilisant une technique non linéaire de réduction de la dimensionnalité.
Le t-SNE (t-distributed Stochastic Neighbor Embedding) est une technique non supervisée de
réduction de la dimensionnalité non linéaire pour l’exploration des données et la visualisation des
données à haute dimension. La réduction non linéaire de la dimensionnalité signifie que l’algo-
rithme nous permet de séparer des données qui ne peuvent pas être séparées par une ligne droite.
t-SNE donne une impression et une intuition sur la façon dont les données sont organisées dans les
dimensions supérieures. Il est souvent utilisé pour visualiser des ensembles de données complexes
en deux et trois dimensions, ce qui permet de mieux comprendre les modèles et les relations sous-
jacents dans les données.
1. L’algorithme t-SNE modélise un point sélectionné en tant que voisin d’un autre point
dans les dimensions supérieures et inférieures. Il commence par calculer une similarité par
paire entre tous les points de données dans l’espace à haute dimension à l’aide d’un noyau
gaussien. Les points éloignés les uns des autres ont une probabilité plus faible d’être choisis
que les points proches les uns des autres.
2. Ensuite, l’algorithme tente de cartographier les points de données à haute dimension dans
un espace à plus faible dimension tout en préservant les similitudes par paire.
4.5.3 Algorithme
1. Distribution de probabilité (Similarité dans une dimension supérieur) : Distribution de proba-
bilité qui représente les similitudes entre voisins.
la similarité du point de données xj avec le point de données xi est la probabilité conditionnelle
pj|i que xi choisisse xj comme voisin. A travers la distribution gaussien :
g(|xi − xj |)
Jusqu’à présent, nos clusters étaient étroitement liées au sein de leur groupe.
Que se passe-t-il si nous avons une nouvelle cluster comme celle-ci ?
g(|xi − xj |)
pi|j =
Σi6=j g(|xi − xj |)
C’est un bon endroit pour mentionner quepi|i est défini pour être égal à 0, et non à 1.
Σj pi|j = 1
Si nous prenons deux points et essayons de calculer la probabilité conditionnelle entre eux, les
valeurs de pi|j et pj|i seront différentes :
Le t-SNE atteint cet objectif en modélisant l’ensemble de données avec une distribution de pro-
babilité agnostique, en trouvant une approximation de dimension inférieure avec une distribution
qui correspond étroitement. Il a été introduit par Laurens van der Maaten et Geoffrey Hinton
dans leur article Visualizing High-Dimensional Data Using t-SNE.
Étant donné que nous souhaitons également capturer une éventuelle structure de cluster sous-
jacente, on définit une distribution de probabilités sur la courbe avec cette formule générale :
Eq 1 :
exp(−||xi − xj ||2 /2σi2 )
pi|j =
Σk6=j exp(−||xi − xk ||2 /2σi2 )
Qu’est-ce que la perplexité
La perplexité est une mesure de l’information. Dans le t-SNE, la perplexité est utilisée pour
La partie suivante du t-SNE consiste à créer un espace à faible dimension avec le même nombre
de points que dans l’espace d’origine. Les points doivent être répartis de manière aléatoire dans le
nouvel espace. L’objectif de cet algorithme est de trouver une distribution de probabilité similaire
dans un espace à faible dimension.
Eq 4 :
(1 + ||xi − xj ||2 )− 1
qi|j =
Σk6=l (1 + ||xk − xl ||2 )−1
Pour optimiser cette distribution, le t-SNE utilise la divergence de Kullback-Leibler entre les
probabilités conditionnelles pj|i et qj|i .
P (x)
C = DKL (P ||Q) = Σx∈X P (x) log( )
Q(x)
Dérivée de KL :
Eq 5 :
δC
= 4Σj (pij − qij )(yi − yj )(1 + ||xk − xl ||2 )−1
δyi
Tsne
rom [Link] import TSNE from [Link] import mnist from sklearn.
datasets import load_iris from numpy import reshape
import seaborn as sns import pandas as pd iris = load_iris()
x = [Link] y = [Link]
tsne = TSNE(n_components=2, verbose=1, random_state=123) z = tsne.fit_transform(x)
df = [Link]() df["y"] = y df["comp-1"] = z[:,0] df["comp-2"] = z[:,1]
Tsne
from [Link] import TSNE from [Link] import mnist from sklearn.
datasets import load_iris from numpy import reshape
import seaborn as sns import pandas as pd
(x_train, y_train), (_ , _) = mnist.load_data() x_train = x_train[:3000]
y_train = y_train[:3000]
print(x_train.shape)
# MNIST is a three-dimensional data, we'll reshape it into the two-dimensional one.
print(x_train.shape)
x_mnist = reshape(x_train, [x_train.shape[0], x_train.shape[1]*x_train.shape[2]])
print(x_mnist.shape)
tsne = TSNE(n_components=2, verbose=1, random_state=123) z = tsne.fit_transform(
x_mnist)
df = [Link]()
df["y"] = y_train
df["comp-1"] = z[:,0] df["comp-2"] = z[:,1]
[Link](x="comp-1", y="comp-2", hue=[Link](),
palette=sns.color_palette("hls", 10), data=df).set(title="MNIST data T-SNE
projection")
152
Q-value ou action-value (Q) : Q-value est similaire à valeur, sauf qu’il prend un paramètre sup-
plémentaire, l’action en cours a. Qπ (s, a) fait référence au retour à long terme d’une action
entreprenant une action sous la politique π à partir de l’état actuel s.
Trajectoire : une séquence d’états et d’actions qui influencent ces états.
5.1 Q-Learning
Q-Learning est une forme de base d’apprentissage par renforcement qui utilise les valeurs Q
(également appelées valeurs d’action) pour améliorer de manière itérative le comportement de
l’agent d’apprentissage.
Algorithme Q-Learning :
Nous pouvons voir cette fonction Q comme un lecteur qui fait défiler la Q-table pour trouver la
ligne associée à notre état et la colonne associée à notre action. Il renvoie la valeur Q de la cellule
correspondante. C’est la "récompense future attendue".
Pour mettre à jour la fonction Q (s, a), on utilise « the Bellman equation » :
La salle des objectifs est le numéro 5. Pour définir cette salle comme objectif, nous allons associer
une valeur de récompense à chaque porte (c’est-à-dire un lien entre les nœuds). Les portes qui
mènent immédiatement au but ont une récompense instantanée de 100. Les autres portes qui
ne sont pas directement connectées à la salle cible n’ont aucune récompense. Les portes étant à
double sens (0 à 4 et 4 à 0), deux flèches sont attribuées à chaque pièce. Chaque flèche contient
une valeur de récompense instantanée, comme indiqué ci-dessous :
On peut imaginer que notre agent comme un robot virtuel stupide qui peut apprendre par l’expé-
rience. L’agent peut passer d’une pièce à l’autre mais n’a aucune connaissance de l’environnement
ni quelle séquence de portes mène à l’extérieur. Supposons que nous voulions modéliser une sorte
d’évacuation simple d’un agent de n’importe quelle pièce du bâtiment. Supposons maintenant
que nous ayons un agent dans la salle 2 et que nous voulions que l’agent apprenne à atteindre
l’extérieur de la maison (5).
Nous allons commencer par définir la valeur du paramètre d’apprentissage Gamma = 0,8 et l’état
initial en tant que Salle 1. Initialise la matrice Q en tant que matrice à zéro :
Maintenant, imaginons ce qui se passerait si notre agent était à l’état 5. Regardez la sixième ligne
de la matrice de récompense R (c’est-à-dire l’état 5). Il y a 3 actions possibles : passer à l’état 1,
Q(1, 5) = R(1, 5) + 0, 8 ∗ M ax[Q(5, 1), Q(5, 4), Q(5, 5)] = 100 + 0, 8 ∗ 0 = 100
L’état suivant, 5, devient maintenant l’état actuel. Parce que 5 est l’état de l’objectif, nous avons
terminé un épisode. Le cerveau de notre agent contient maintenant une matrice Q actualisée :
Pour le prochain épisode, nous commençons par un état initial choisi au hasard. Cette fois, nous
avons l’état 3 comme notre état initial. Regardez la quatrième rangée de la matrice R ; il y a
3 actions possibles : passer à l’état 1, 2 ou 4. Par sélection aléatoire, nous choisissons d’aller à
l’état 1 comme action. Maintenant, nous imaginons que nous sommes dans l’état 1. Regardez la
deuxième rangée de la matrice de récompense R (c’est-à-dire l’état 1). Il y a 2 actions possibles :
passer à l’état 3 ou à l’état 5. Ensuite, nous calculons la valeur Q : Q (état, action) = R (état,
action) + Gamma * Max [Q (état suivant, toutes les actions)]
Nous utilisons la matrice Q mise à jour du dernier épisode. Q (1, 3) = 0 et Q (1, 5) = 100. Le
résultat du calcul est Q (3, 1) = 80 car la récompense est égale à zéro. La matrice Q devient :
Si l’agent en apprend davantage au fil des épisodes, il atteindra enfin les valeurs de convergence
dans la matrice Q comme :
Une fois que la matrice Q se rapproche suffisamment d’un état de convergence, nous savons que
notre agent a appris les chemins les plus optimaux vers l’état d’objectif. Tracer les meilleures
séquences d’états est aussi simple que de suivre les liens avec les valeurs les plus élevées dans
chaque état.
Q Learning
import numpy as np
environment = [(0,4),(4,3),(2,3),(1,3),(4,5),(1,5)]
## Rewards Matrix
R = [Link]([Link](shape=[states,actions]))
R = R * -1 # We assign -1 to every value
R[goal,goal] = 100
Q = [Link]([Link](shape=[states,actions]))
# Current State
def available_actions(state):
rewards_row_state = R[state,]
av_actions = [Link](rewards_row_state >= 0)[1] # In our case, any value ge 0 is a
possible action we can take from our current state
return av_actions
actions = available_actions(currentstate)
print("2) As we can see, the available actions from state {} is {} \n".format(
currentstate,actions))
# Lets say, we choose one action from the available actions, so we choose randomly
def choose_random_action(actions):
action = [Link](actions)
return action
action = choose_random_action(actions)
print("3) The action we have chosen to take is to go to {}, from state {} \n".
format(action,currentstate))
# we now have information about our current state, current action we are taking,
# and possible next states and actions we can take
gamma = 0.8
print("4) Here we have pause a little and introduce a hyper parameter called Gamma"
)
print(" Gamma is a paramter that is used to control if the model needs to focus on
immediate reward or future rewards \n")
def Q_update(state,action,gamma):
# First the max Q part
Max_Q = [Link](Q[action,])
Q[state,action] = R[state,action] + gamma * Max_Q
return Q
for i in range(100):
current_state = [Link]([0,1,2,3,4,5]) # Step 1
actions = available_actions(current_state) # Step 2
action = choose_random_action(actions) # Step 3
Q = Q_update(current_state,action,gamma) # Step 4
# We can normalize Q Matrix values for a better idea of what is going on
Q = Q/[Link](Q)*100
162
[Link]
PCA:[Link]
Qlearning:[Link]
Q-Learinig:[Link]
Simple_Q_Learner.ipynb Qlearning:[Link]
introduction-to-q-learning-with-python-and-open-ai-gym Qlearning:[Link]
[Link]/news/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc
Overfiting:[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link] https:
//[Link]/visualize-machine-learning-data-python-pandas Qlearning:
[Link]
[Link] https:
//[Link]/charel/learn-by-example-expectation-maximization https:
//[Link]/expectation-maximization-em-algorithm https://
[Link]/metrics-evaluate-machine-learning-algorithms-python https:
//[Link]/imbalanced-classification-with-python-7-day-mini-course
[Link] [Link]
t-sne-clearly-explained-d84c537f53a [Link]
[Link] [Link]
tour-of-ensemble-learning-algorithms/#:~:text=Ensemble%20learning%20refers%20to%
20algorithms,discussed%20and%20used%20in%20practice. [Link]
SVM-Implementation-Python-QuadraticProgramming/blob/master/svm_quad.ipynb