Introduction à l'apprentissage supervisé
Introduction à l'apprentissage supervisé
Etienne Birmelé
Automne 2020
2
Table des matières
1 Introduction 5
1.1 Apprentissage supervisé . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Critères de qualité d’une règle de prédiction . . . . . . . . . . . . 7
1.3 Sur-apprentissage et ensemble test . . . . . . . . . . . . . . . . . 8
1.4 Validation croisée . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.5 Cas particulier d’une prédiction binaire : critères de qualité et
courbes ROC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.6 Selection vs Prediction et cas de la grande dimension . . . . . . . 17
2 Méthodes d’arbres 19
2.1 Arbres de décision/classification/régression . . . . . . . . . . . . 19
2.2 Forêts aléatoires . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3
4 TABLE DES MATIÈRES
10 TP4 - SVM 73
10.1 Avec le package e1071 . . . . . . . . . . . . . . . . . . . . . . . . 73
10.2 Avec caret . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Introduction
5
6 CHAPITRE 1. INTRODUCTION
## # A tibble: 200 x 5
## sex BMI temperature CRP infected
## <chr> <dbl> <dbl> <int> <dbl>
## 1 M 26.6 37.2 11 0
## 2 M 19.5 37.9 9 0
## 3 F 27.4 37.3 5 0
## 4 M 19.1 36.4 8 0
## 5 F 21.3 36.5 13 0
## 6 F 24.3 37.0 8 0
## 7 M 23.2 37.5 13 0
## 8 M 31.7 37.0 11 0
## 9 F 19.8 37.4 11 0
## 10 F 25.8 38.0 10 0
## # ... with 190 more rows
Remarque : Le jeu ayant été simulé pour les besoins de l’exemple, la règle
finalement générée ne sera pas forcément pertinente. En réalité, la règle utilisée
est Température > 38.5 et CRP>12
1.2. CRITÈRES DE QUALITÉ D’UNE RÈGLE DE PRÉDICTION 7
𝑅 = argmin𝑓(𝑅(𝑋), 𝑌 )
𝑅∈ℛ
L’ensemble des observations (𝑋, 𝑌 ) prises en compte pour réaliser cette minimi-
sation est l’ensemble d’apprentissage.
Exemple : Un critère utilisé très fréquemment et quelle que soit le type de
la variable à prédire 𝑌 est l’erreur quadratique moyenne. Pour un ensemble
d’apprentissage de taille
1 𝑛
𝑓(𝑌 𝑝𝑟𝑒𝑑 , 𝑌 𝑜𝑏𝑠 ) = ∑(𝑌 𝑝𝑟𝑒𝑑 − 𝑌𝑖𝑜𝑏𝑠 )2 ∝ ‖𝑌𝑖𝑝𝑟𝑒𝑑 − 𝑌𝑖𝑜𝑏𝑠 ‖2
𝑛 𝑖=1 𝑖
𝑇 ≤ 𝑠1 𝑇 > 𝑠1
𝑌 =1 𝑌 =0 𝑌 =1
𝑌 =0 𝑌 =1
8 CHAPITRE 1. INTRODUCTION
Dans ce cas, (𝑌 𝑝𝑟𝑒𝑑 − 𝑌 𝑜𝑏𝑠 )2 vaut 0 quand on prend la bonne décision, 1 sinon,
et l’écart quadratique moyen est simplement le taux de mal classés. La question
qui se pose ici est comment parcourir intelligemment tout ou partie de l’espace
des règles possibles pour déterminer la meilleure.
𝑅 = argmin‖𝑅(𝑋) − 𝑌 ‖2 = argmin‖𝑅(𝑋) − 𝑌 ‖2
𝑅∈ℛ 𝑅∈ℛ4
#Apprentissage des cinq modèles (de 0 à 4 variables prises en compte) et calcul des err
model2 <- glm(infected~temperature+CRP,family=binomial(link="logit"),data=learningdata)
1.4. VALIDATION CROISÉE 9
On détermine les erreurs moyennes pour chacun des modèles et chacun des
jeux de données (apprentissage et test). Leurs évolutions quand on augmente la
dimension du modèles illustrent le phénomène de sur-apprentissage. Ici, à partir
de la troisième variable, on s’améliore sur le jeu d’apprentissage mais on perd
en potentiel de prédiction en général : il faut donc s’arrêter au modèle à deux
variables.
learning test
0.24
0.22
0.20
error
0.18
0.16
0.14
0 1 2 3 4 0 1 2 3 4
k
Suuposons que plusieurs règles apprises aient besoin d’être comparées. Cela
peut par exemple être le cas lorsque la famille de règle considérée dépend d’un
paramètre qu’on ne peut pas (ou ne veut pas) règler via un maximum de vrai-
semblance.
𝑇 ≤ 𝑠1 𝑇 > 𝑠1
𝑌 =1 𝑌 =0 𝑌 =1
𝑌 =0 𝑌 =1
Il faut alors décider des valeurs des différentes constantes. On peut de plus
vouloir comparer d’autres modèles issus d’architectures d’arbres différentes, ou
de stratégies de modélisation différentes (régression logistique par exemple).
La stratégie consistant à comparer tous les modèles candidats sur le jeu test
n’est pas valide car le jeu test sert alors à déterminer la règle, et ne peut plus
servir d’étalon pour estimer le pouvoir de généralisation.
— pour chaque fold 𝐹𝑖 , on apprend la règle sur tous les individus ne faisant
pas partie de 𝐹𝑖 , et on réalise une prédiction pour les individus de 𝐹𝑖
Etape 2 : Pour tout pli 𝐹𝑖 , les modèles sont appris sur tous les individus du jeu
d’apprentissage n’appartenant pas à 𝐹𝑖 , puis l’erreur de prédiction est évaluée
sur les individus de 𝐹𝑖 .
learningerrors <- tibble(k0=rep(NA,dim(learningdata)[1]),k1=k0,k2=k0,k3=k0,k4=k0) #contient les e
for (i in 1:nfold){
ldata <- learningdata %>% filter(fold!=i) #new learningdata: all folds but i
tdata <- learningdata %>% filter(fold==i) #new test data: fold i
## # A tibble: 1 x 5
## k0 k1 k2 k3 k4
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.241 0.186 0.159 0.164 0.166
## [1] 0.1522159
Remarques :
Dans le cas d’une variable 𝑌 ∈ {0, 1}, d’autres critères sont couramment utilisés.
Par analogie avec le problème médical, on parle d’individu positif quand 𝑌 = 1
et d’individu négatif quand 𝑌 = 0.
Plus précisément, pour une règle de décision donnée, chaque individu appartient
à l’une des quatre catégories suivantes
1.5. CAS PARTICULIER D’UNE PRÉDICTION BINAIRE : CRITÈRES DE QUALITÉ ET COURBES ROC13
𝑌 𝑝𝑟𝑒𝑑 = 0 𝑌 𝑝𝑟𝑒𝑑 = 1
𝑣𝑟𝑎𝑖
𝑌 =0 Vrai négatif (𝑇 𝑁 ) Faux positif (𝐹 𝑃 )
𝑌 𝑣𝑟𝑎𝑖 = 1 Faux négatif (𝐹 𝑁 ) Vrai positif (𝑇 𝑃 )
+Precision.
𝑇𝑃
proportion des vrais positifs parmi les positifs 𝑇 𝑃 +𝐹 𝑃
## [1] 0.3875
Moins de la moitié des vraies infections sont détectées.
Par contre, la sensitivité est bonne :
14 CHAPITRE 1. INTRODUCTION
TN/(TN+FP)
## [1] 0.9833333
Moins de 5% des gens ne souffrant pas d’une infection seront traités à tort.
2. le critère Accuracy peut être trompeur dans le cas d’un faible nombre de
positifs dans la population. Prenons le cas d’un maladie touchant 1 des
individus. Déclarer tout le monde sain donne alors un score de 99 de bien
classés, ce qui est excellent mais totalement inutile !
3. les autres critères doivent être pris par paires : si on veut simplement
éviter les faux positifs, il suffit de déclarer tout le monde négatif, et
inversement. On cherche donc généralement à maximiser conjointement
la spécificité et la sensitivité, ou la précision et le rappel (cf courbes ROC
et PR plus bas).
Ces indicateurs sont une alternative pour comparer des méthodes différentes sur
des jeux de données quand la variable d’intérêt est binaire, et que les différentes
méthodes comportent des paramètres qu’il faut régler.
Considérons une méthode de classification en deux classes, qui dépend d’un para-
mètre. La courbe ROC est une courbe obtenu en traçant la courbe paramétrique
du True positive rate en fonction du False positive rate.
1.00 35.9
37
37.4
37.8
38.2
0.75
true_positive_fraction
38.4
38.8
0.50
39.3
0.25 39.7
0.00 Inf
On y voit que si on choisit une telle règle avec une limite de 38.5, on aura
plus de 60% des infections qui seront détectées mais près de 30% des patients
non-infectés qui seront déclarés positifs.
L’idéal serait évidemment d’avoir une valeur du paramètre qui ne fasse aucune
erreur, ce qui correspondrait à une courbe passant par le coin supérieur gauche
du cadran.
En pratique, les courbes ROC sont en fait surtout utilisées pour comparer des
méthodes entre elles.
1.00
0.75
type
crp
0.50
y
logistic
temp
0.25
0.00
Dans ce cas, on voit que la fonction logistique a une courbe ROC plus haute
que les autres, et s’approchant plus du point optimal. La conclusion est que le
modèle logistique est sans doute préférable ici, avec un seuil à fixer de façon à
choisir un des points de la courbe proche du point optimal.
Interprétation : L’aire sous la courbe ROC, appelée AUC (Area Under the
Curve) est parfois utilisée comme critère de qualité d’une méthode de classifica-
tion. Considérons le vecteur des individus classés suivant 𝑌 𝑝𝑟𝑒𝑑 . L’AUC corres-
pond alors à la probabilité, quand on tire un vrai positif et un vrai négatif au
hasard, que le premier soit bien avant le second dans le classement.
Une alternative à la courbe ROC est la courbe Precision-Recall. Elle est moins
utilisée mais constitue une meilleure solution dans le cas des variables mal équi-
librées, c’est-à-dire avec une faible proportion d’individus tels que 𝑌 = 1.
Dans ce cas, les courbes vont toutes du coin en haut à gauche vers celui en bas
à droite, et une courbe est d’autant meilleure qu’elle se rapproche du point en
haut à droite.
1.6. SELECTION VS PREDICTION ET CAS DE LA GRANDE DIMENSION17
1.00
0.75
type
crp
0.50
y
logistic
temp
0.25
0.00
Méthodes d’arbres
𝑇 ≤ 𝑠1 𝑇 > 𝑠1
𝑌 =1 𝑌 =0 𝑌 =1
𝑌 =0 𝑌 =1
19
20 CHAPITRE 2. MÉTHODES D’ARBRES
𝐼𝐺𝑖𝑛𝑖 (𝑆) = ∑ 𝑝𝑘 (1 − 𝑝𝑘 )
𝑘
Cet indice est un indice d’impureté, dans la mesure où il d’autant plus petit
que l’une des classes est largement majoritaire dans l’ensemble (on montre sans
mal qu’il est nul si l’ensemble est pur et maximal si toutes les classes sont
équireprésentées).
— Critère de séparation
L’algorithme parcourt l’ensemble des variables possibles et l’ensemble
(discrétisé) de leurs valeurs possibles, et choisit le couple (Variable,Seuil)
qui sépare 𝑆 en (𝑆1 , 𝑆2 ), de tailles 𝑛1 et 𝑛2 de façon à maximiser
2.2. FORÊTS ALÉATOIRES 21
𝑛1 𝑛2
𝐼(𝑆) − 𝐼(𝑆1 ) − 𝐼(𝑆2 ) dans le cas de la classification
𝑛1 + 𝑛 2 𝑛1 + 𝑛 2
𝑣𝑎𝑟(𝑌 (𝑆)) − 𝑣𝑎𝑟(𝑌 (𝑆1 )) − 𝑣𝑎𝑟(𝑌 (𝑆2 )) dans le cas continu
2.1.2 Elagage
Les opérations précédentes peuvent être répétées si besoin jusqu’à n’obtenir que
des noeuds purs, c’est-à-dire tels que 𝐼(𝑆) = 0 sur toutes les feuilles. On risque
cependant alors de se retrouver en situation de sur-apprentissage.
Plusieurs manières d’éviter cela ont été développées, divisées en deux familles :
— early stopping ou pre-pruning : le but est d’arrêter la construction de
l’arbre avant qu’il devienne trop grand. On peut pour cela fixer un seuil
non nul pour le critère d’impureté.
Le package rpart propose par exemple cette approche avec un seuil (le
paramètre cp) fixé par validation croisée.
— post-pruning : on construit l’arbre total puis on ressupprime les branches
n’apportant pas d’amélioration du critère visé. L’approche early-stopping
est cependant préférée en général.
2.2.1 Principe
Le principe est très simple, à savoir qu’une forêt aléatoire est un ensemble
d’arbres de décision/classification/régression donnant chacun une prédiction. La
prédiction finale est obtenue
22 CHAPITRE 2. MÉTHODES D’ARBRES
1. bootstrap des individus : chaque arbre est appris non pas sur toutes
les données du jeu d’apprentissage mais sur un échantillon bootstrap de
celui-ci
2. sous-échantillonnage des variables : A chaque séparation de noeud,
toutes les 𝑝 variables ne sont pas prises en compte, mais seulement un
√
sous-échantillon aléatoire de 𝑓(𝑝) d’entre elles. En pratique, 𝑓(𝑝) = 𝑝
est souvent utilisé, mais 𝑓(𝑝) paut aussi être considéré comme un para-
mètre à régler.
Une mesure de l’importance des variables a également été proposée dans le cadre
des forêts aléatoires.
Considérons une variable d’intérêt V. Pour chaque arbre de la forêt, on peut
considérer l’ensemble 𝒜 des individus out-of-bag. En permutant les valeurs de
𝑉 parmi les individus de 𝒜, on obtient un jeu de données dans lequel 𝑉 n’a
2.2. FORÊTS ALÉATOIRES 23
2.2.4 Conclusion
Les forêts aléatoires sont un net gain par rapport à un arbre seul en termes de
stabilité, permettent la sélection de variables grâce à la mesure d’importance et
offrent souvent un meilleur contrôle du sur-apprentissage et donc une meilleure
prédiction. Tout cela se fait cependant au détriment de l’interprétabilité de la
méthode.
24 CHAPITRE 2. MÉTHODES D’ARBRES
Chapitre 3
3.1 Contexte
Le problème de la régression, équivalent au modèle linéaire gaussien, s’écrit
comme
2. Quel que soit le nombre de variables ayant réellement une influence non
nulle sur 𝑌 , tous les coefficients de 𝛽 sont non-nuls. Il y a donc risque
de sur-apprentissage. De plus, dans le cas de la grande dimension (plus
de variables explicatives potentielles que d’observations), l’estimateur du
maximum de vraisemblance 𝛽 = (𝑋 ′ 𝑋)−1 𝑋 ′ 𝑌 n’est pas défini.
3. Suite au point précédent, il est important de procéder à de la sélection
de variables en choisissant le variables à garder.
4.
25
26 CHAPITRE 3. MODÈLES LINÉAIRES PÉNALISÉS
La première possibilité pour effectuer une régression pénalisée est d’utiliser une
pénalité de type Ridge. L’idée est de forcer le vecteur de coefficients 𝛽 à être
borné en norme 𝐿2 . Intuitivement, les problèmes de colinéarité sont alors réglés
par le fait qu’une variable ne peut ‘attirer’ les coefficients des variables qui lui
sont corrélées que dans une certaine mesure.
knitr::include_graphics('fig/[Link]')
3.2. REGRESSION PÉNALISÉE 27
28 CHAPITRE 3. MODÈLES LINÉAIRES PÉNALISÉS
𝜕𝑓
= −2𝑋 ′ (𝑌 − 𝑋𝛽) + 2𝜆𝛽
𝜕𝛽
𝜕2𝑓
= 2(𝑋 ′ 𝑋 + 𝜆I𝑝 )
𝜕𝛽 2
qui est définie positive, si bien qu’il s’agit d’un minimum local.
De plus, la fonction 𝑓(𝛽) est strictement convexe comme somme d’une fonc-
tion convexe et d’une fonction strictement convexe. Le minimum local est donc
unique et global.
Remarques :
1. Validation croisée
2. Stability selection : dans le cas de la grande dimension, on effectue un
grand nombre d’apprentissage sur des sous-échantillonages (80% des don-
nées par exemple) et on garde les variables appraissant dans plus de la
moitié des échantillons. On peut ensuite réaliser un apprentissage en pe-
tite dimension sur les variables sélectionnées.
3.2.2 LASSO
D’un point de vue géométrique, la forme des boules de la norme 1 va faire que
de les solutions auront de nombreux coefficients nuls en grande dimension.
knitr::include_graphics('fig/[Link]')
30 CHAPITRE 3. MODÈLES LINÉAIRES PÉNALISÉS
𝑞
𝐺𝐿
Trouver 𝛽 = 𝑎𝑟𝑔𝑚𝑖𝑛‖𝑌 − 𝑋𝛽‖22 + 𝜆( ∑ ‖𝛽𝑞 ‖22 )
𝛽 𝑖=1
3.3.1 Principe
3.3.2 Exemple
0e+00
−4e−04
L1 Norm
plot([Link])
0 12 17 20 23 22 22
0.02
Coefficients
0.01
0.00
−0.01
L1 Norm
3.3. APPROCHES PÉNALISÉES POUR LA CLASSIFICATION 33
plot([Link])
0 42 59 77 90 97
0.010
0.005
Coefficients
0.000
−0.005
L1 Norm
## [1] 0.1353255
[Link] <- glmnet([Link]$X,[Link]$Y,family="binomial",alpha=.5,nlambda=1,lam
## # A tibble: 18 x 3
## proba[,"s0"] MAP[,"s0"] truth
## <dbl> <dbl> <dbl>
## 1 0.373 0 1
## 2 0.993 1 1
## 3 0.998 1 1
## 4 0.168 0 0
## 5 0.752 1 1
## 6 0.603 1 1
34 CHAPITRE 3. MODÈLES LINÉAIRES PÉNALISÉS
## 7 0.141 0 0
## 8 0.821 1 1
## 9 0.787 1 1
## 10 0.795 1 1
## 11 0.144 0 0
## 12 0.860 1 1
## 13 0.983 1 1
## 14 0.997 1 1
## 15 0.194 0 1
## 16 0.178 0 1
## 17 0.572 1 1
## 18 0.741 1 1
confusionMatrix(data=as_factor(predictions_hard),as_factor([Link]$Y-1))
La méthode des 𝑘 plus proches voisins, désignée le plus souvent par kNN pour 𝑘-
Nearest Neighbours est sans doute la méthode d’apprentissage conceptuellement
la plus simple.
Le principe est, pour un point pour lequel une décision est à prendre, de sélec-
tionner les 𝑘 points les plus proches dans le jeu d’apprentissage et de faire une
prédiction
35
36 CHAPITRE 4. MODÈLES BASÉES SUR LES DISTANCES
[Link] 3.5
3.0
2.5
2.0
5 6 7
[Link]
Avantages :
Inconvénients :
— Nécessite de garder toutes les données en mémoire pour faire une prédic-
tion (on ne peut pas seulement garder la règle, comme dans le cas d’un
arbre de décision ou d’un modèle linéaire)
— Très sensible au fléau de la dimension : quand le nombre de variables
explicatives (dimension de 𝑋) devient grand, la distance est un outil dont
il faut se méfier. Par exemple, quelques calculs élémentaires montrent
que quand cette dimension devient très grande, des points tirés de façon
équiprobable dans [0, 1]𝑑 sont essentiellement équidistants et tous très
proches du bord !.
4.2. MÉTHODES SVM 37
𝑑
𝑓(𝑥) = ∑ 𝑤𝑗 𝑥𝑗 + 𝑏 =< 𝑤, 𝑥 > +𝑏
𝑗=1
1.5
[Link]
1.0
0.5
Dans de tels cas, le nombre de séparateurs possibles est alors infinis et il convient
de définir un critère de qualité pour définir le meilleur, qui sera retenu. Le critère
retenu est alors la marge du séparateur, définie par
𝑓 ∗ = argmax 𝑀 𝑎𝑟𝑔𝑒(𝑓)
Vecteurs support :
Il est à noter que les éléments les plus proches de l’hyperplan 𝐻 ∗ dans chacune
des deux classes sont à même distance de 𝐻 ∗ (sinon, l’hyperplan pourrait être
légèrement décalé de façon à augmenter sa marge, ce qui contredirait la définition
de 𝑓 ∗ ). Les vecteurs les plus proches de 𝐻 ∗ sont appelés vecteurs supports.
1.5
[Link]
1.0
0.5
Dans cet exemple, en admettant que l’hyperplan indiqué est optimal, il y a trois
vecteurs supports (un point bleu et deux points rouges).
4.2. MÉTHODES SVM 39
Il est à noter :
𝑤 1
𝑑(𝑥, 𝐻) = | < 𝑥 − 𝑝(𝑥), >|= | < 𝑥, 𝑤 > − < 𝑝(𝑥), 𝑤 > |
‖𝑤‖ ‖𝑤‖
Optimisation :
Le problème s’écrit alors
1
Trouver 𝑤∗ = argmin ‖𝑤‖2 tel que ∀𝑦𝑖 = 1, < 𝑤, 𝑥𝑖 > +𝑏 ≥ 1
2
∀𝑦𝑖 = −1, < 𝑤, 𝑥𝑖 > +𝑏 ≤ −1
𝑛
1
𝐿(𝑤, 𝑏, 𝛼) = ‖𝑤‖2 − ∑ 𝛼𝑖 [𝑦𝑖 (< 𝑤, 𝑥𝑖 > +𝑏) − 1]
2 𝑖=1
où
40 CHAPITRE 4. MODÈLES BASÉES SUR LES DISTANCES
𝑛
𝜕𝐿
(𝑤, 𝑏, 𝛼) = 0 ⇒ 𝑤 = ∑ 𝛼𝑖 𝑦𝑖 𝑥𝑖
𝜕𝑤 𝑖=1
𝑛
𝜕𝐿
(𝑤, 𝑏, 𝛼) = 0 ⇒ ∑ 𝛼𝑖 𝑦𝑖 = 0
𝜕𝑏 𝑖=1
1
𝑄(𝛼) = ‖𝑤‖2 − < 𝑤, 𝑤 > − ∑ 𝛼𝑖 𝑦𝑖 𝑏 + ∑ 𝛼𝑖
2 𝑖 𝑖
𝑛
1
= ∑ 𝛼𝑖 − ∑ 𝛼 𝛼 𝑦 𝑦 < 𝑥 𝑖 , 𝑥𝑗 >
𝑖=1
2 1≤𝑖,𝑗≤𝑛 𝑖 𝑗 𝑖 𝑗
𝑛
1
Trouver 𝛼∗ = argmax(∑ 𝛼𝑖 − ∑ 𝛼 𝛼 𝑦 𝑦 < 𝑥𝑖 , 𝑥𝑗 >)
𝛼 𝑖=1
2 1≤𝑖,𝑗≤𝑛 𝑖 𝑗 𝑖 𝑗
𝑛
sous la contrainte 𝛼𝑖 ≥ 0 et ∑ 𝛼𝑖 𝑦𝑖 = 0
𝑖=1
1 𝑛
2. 𝑤∗ par la formule 𝑤∗ = 2 ∑𝑖=1 𝛼∗𝑖 𝑦𝑖 𝑥𝑖
3. 𝑏∗ par la formule 𝑦𝑠 (< 𝑤∗ , 𝑥𝑠 > +𝑏∗ ) = 1 valable pour tout vecteur
support.
2.5
2.0
[Link]
1.5
1.0
3 4 5 6 7
[Link]
Dans la plupart des cas, les données ne sont pas linéairement séparables, c’est-
à-dire qu’aucun hyperplan ne permet de séparer parfaitement l’ensemble
d’apprentissage.
Dans ce cas, on introduit, pour des valeurs de 𝑤 et de 𝑏 données, une pénalité
pour chaque sommet
Cette pénalité est nulle, pour les points qui sont bien classés, avec une distance
l’hyperplan supérieure à 𝑓𝑟𝑎𝑐1‖𝑤‖ : dans le cas séparable, elle est nulle pour
tout le monde.
Par contre, elle est non nulle pour les points situés dans la bande centrale (dis-
tance à l’hyperplan inférieure à la marge) et les points mal classés.
Le problème considéré est alors
42 CHAPITRE 4. MODÈLES BASÉES SUR LES DISTANCES
𝑛
Trouver 𝑤∗ = argmin‖𝑤‖2 + 𝐶 ∑ 𝜉𝑖 tel que ∀𝑖, 𝜉𝑖 ≥ 0
𝑖=1
∀𝑖, 𝑦𝑖 (< 𝑤, 𝑥𝑖 > +𝑏) ≥ 1 − 𝜉𝑖
Il se résout de la même manière que dans le cas précédent. Il est à noter que le
constante 𝐶 est à choisir et fait office de paramètre de régularisation (plus 𝐶
est petit, plus on impose la séparation).
[Link] Noyaux
Définition :
Théorème 1 (Mercer). Soit 𝒳 un compact dans R𝑑 et 𝐾 ∶ 𝒳 × 𝒳 → R une
fonction symétrique (càd K(x,y)=K(y,x)). On suppose aussi que ∀𝑓 ∈ 𝐿2 (𝒳),
∫𝒳 𝐾(𝑥, 𝑦)𝑓(𝑥)𝑓(𝑦)𝑑𝑥𝑑𝑦 ≥ 0 (condition de Mercer).
Alors il existe un espace de Hilbert ℋ et 𝜙 ∶ 𝒳 → ℋ tel que ∀𝑥, 𝑦 ∈ 𝒳,
𝐾(𝑥, 𝑦) =< 𝜙(𝑥), 𝜙(𝑦) >
La fonction 𝐾(𝑥, 𝑦) s’appelle **noyau** positif défini.
Exemples :
— Noyau linéaire : 𝐾(𝑥, 𝑥′ ) =< 𝑥, 𝑥′ >
′
— Noyau exponentiel : 𝐾(𝑥, 𝑥′ ) = 𝑒−𝛾‖𝑥−𝑥 ‖
′ 2
— Noyau gaussien : 𝐾(𝑥, 𝑥′ ) = 𝑒−𝛾‖𝑥−𝑥 ‖
Interprétation : Le noyau peut être vu comme une mesure de similarité : plus
𝑥 et 𝑥′ sont semblables, plus la valeur du noyau est grande.
Il a de plus l’avantage, via le théorème de Mercer, de représenter le produit sca-
laire dans un espace de dimension plus grande où les nuages seront peut-être plus
faciles à séparer linéairement. Or, les méthodes SVM vues précédemment n’uti-
lisent la structure de l’espace que via les produits scalaires : utiliser un noyau
va donc permettre d’utiliser les méthodes SVM dans l’espace ℋ, en remplaçant
𝑥 par 𝜙(𝑥), et ce sans avoir besoin de déterminer ℋ et 𝜙.
ou encore
𝑛
1
Trouver 𝛼∗ = argmax( ∑ 𝛼𝑖 𝛼𝑗 𝑦𝑖 𝑦𝑗 𝐾(𝑥𝑖 , 𝑥𝑗 ) − ∑ 𝛼𝑖 )
𝛼 2 1≤𝑖,𝑗≤𝑛 𝑖=1
𝑛
sous les contraintes 𝐶 ≥ 𝛼𝑖 ≥ 0 et ∑ 𝛼𝑖 𝑦𝑖 = 0
𝑖=1
Réseaux de neurones
feed-forward et
apprentissage profond
Ce chapitre du cours est en majeure partie issu du cours de Julie Delon, merce
à elle de m’avoir permis de l’utiliser.
𝑦 ̂ = 𝑓(𝑤′ 𝑥)
où
— 𝑤 est le vecteur des coefficients du modèle
— x est obtenu en prenant en compte le variables prédictives et en ajoutant
un 1 afin que le coefficient 𝑤0 permette la preise en compte d’un offset ;
— 𝑓 est une fonction de liaison, par exemple l’identité dans le cas des mo-
dèles gaussiens ou la fonction logistique inverse pour le modèle logistique
(éventuellement couplée à un seuillage si on veut une prédiction en 0/1)
L’espace des fonctions candidates parmi lesquelles optimiser est par conséquent
limité : la contrainte 𝑓 −1 (𝑦) est linéaire est en effet très forte.
Le but d’un réseau de neurones est de représenter une fonction 𝑦(𝑥;
̂ 𝑤) plus
générale que dans le modèle linéaire et d’apprendre la valeur du vecteur de
45
46CHAPITRE 5. RÉSEAUX DE NEURONES FEED-FORWARD ET APPRENTISSAGE PROFOND
x1
x2
avec 𝑔 une fonction non linéaire, par exemple la fonction Rectified Linear Unit
ou ReLU
ReLU(𝑥) = 𝑚𝑎𝑥(0, 𝑥)
Le graphe liant les variables intervenants dans ce réseau peut se dessiner ainsi
5.1. RÉSEAUX DE NEURONES : MODÉLISATION 47
Figure 5.1 – La fonction 𝑅𝑒𝐿𝑈 (𝑥) = max(0, 𝑥). Cette fonction est recomman-
dée comme fonction d’activation par défaut dans les réseaux de neurones.
W1 W2
x1 z1 ReLu a1
x2 z2 ReLu a2
[1] [1]
𝑊11 𝑊12
et elle dépend des paramètres 𝑊 [1] = ( [1] [1] ) et 𝑊
[2]
= (𝑊1[2] [2]
𝑊2 ).
𝑊21 𝑊22
Le numéro entre crochets dans la notation 𝑊 [1] désigne la couche sur laquelle
on se trouve.
48CHAPITRE 5. RÉSEAUX DE NEURONES FEED-FORWARD ET APPRENTISSAGE PROFOND
Représenter la fonction binaire XOR (ou exclusif) par un réseau à deux couches
n’est pas très complexe et une solution peut être trouvée intuitivement. Dans
les cas réels, on peut avoir des données massives et de grande dimension, que
l’on cherche à approcher par un réseau profond dépendant de plusieurs millions
de paramètres. Dans ce type de cas, déterminer le bon jeu de paramètres est
donc beaucoup moins évident.
avec 𝑊 [1] une première matrice de poids de taille 𝑛[2] × 𝑝, 𝑏[1] un vecteur d’offset
de taille 𝑛[2] × 1 et 𝑔[1] une fonction d’activation, généralement non linéaire
(lorsqu’on écrit 𝑔[1] (𝑧) avec 𝑧 un vecteur, cela signifie que 𝑔[1] est appliquée à
toutes les coordonnées de 𝑧).
La 𝑘𝑒𝑚𝑒 couche s’écrit alors en fonction de la précédente comme
avec 𝑊 [𝑘] une matrice de poids de taille 𝑛[𝑘+1] × 𝑛[𝑘] , 𝑏[𝑘] un vecteur d’offset de
taille 𝑛[𝑘+1] × 1, et ainsi de suite jusqu’à la couche de sortie 𝑙
Fonctions d’activation
Les fonctions 𝑔[𝑘] sont appliquées sur les noeuds intermédiaires du réseau. Elle
permettent au modèle de capturer des non linéarités dans les relations entre les
données. Voici quelques exemples de fonctions d’activation que l’on trouve dans
la littérature
— la fonction tanh et la fonction logistique 𝜎(𝑧) = 1+𝑒1 −𝑧 ont été très long-
temps plébiscitées comme fonctions d’activation pour les réseaux de neu-
rones ; ces deux fonctions présentent le défaut d’avoir une dérivée quasi-
ment nulle dès que 𝑧 s’éloigne trop de 0, on verra que cela peut être un
handicap pour entraîner le réseau ;
5.1. RÉSEAUX DE NEURONES : MODÉLISATION 49
Forward Propagation.
Le processus consistant à évaluer la fonction 𝑦(𝑥;
̂ 𝑊 ; 𝑏) dans un réseau feedfor-
ward est appelé Forward Propagation, puisqu’il consiste à propager l’information
de gauche à droite dans le réseau. C’est ce processus qui permet à un réseau de
neurones de faire des prédictions à partir de données.
Justification biologique.
On parle de réseaux de neurones car ces réseaux sont en partie inspirés par les
neurosciences, chaque noeud du réseau jouant un rôle ‘analogue’ à celui d’un
neurone dans le cerveau. Si de nombreux articles font des parallèles entre les
deux, la comparaison a ses limites : les réseaux de neurones que l’on étudie
et utilise actuellement en informatique sont extrêmement simplistes si on les
compare au cerveau humain… L’intelligence artificielle n’est pour l’instant pas
aussi intelligente que les médias veulent le croire.
Le théorème suivant~ ? ? dit qu’un réseau feedforward à deux couches avec une
sortie linéaire et une fonction d’activation 𝑔 bornée croissante, continue (non
constante) peut approcher aussi finement que l’on veut n’importe quelle fonction
continue sur l’hypercube [0, 1]𝐷 du moment qu’il a suffisamment de neurones
sur sa couche intermédiaire.
Théorème 2 (Théorème d’approximation universel). Soit 𝑔 une fonction non
constante, bornée et croissante et continue. L’ensemble des fonctions sur l’hy-
percube [0, 1]𝐷 de la forme
𝑦(𝑥) = 𝜃𝑇 𝑔 (𝑊 𝑥 + 𝑏)
Sous des conditions un peu plus fortes sur 𝑔, on peut approcher n’importe quelle
fonction mesurable sur l’hypercube. En d’autres termes, on peut approcher aussi
finement que l’on veut n’importe quelle fonction sur un compact en dimension
finie avec un réseau de neurones à deux couches suffisamment grand. Le problème
est que la taille de la couche intermédiaire nécessaire peut-être tellement grande
que le réseau n’est pas utilisable ou optimisable en pratique. Or, en pratique,
il est souvent beaucoup plus utile d’utiliser des réseaux moins larges mais plus
profonds.
Deep learning.
Pendant longtemps, on se contentait d’utiliser des réseaux de neurones à
quelques couches, donc peu profonds, pour des raisons de temps de calcul. On
se contentait en général d’une quinzaine de couches au maximum. Les réseaux
de neurones modernes doivent un partie de leur succès retentissant dans de
nombreux domaines (image, son, vidéo, médecine, etc) au fait qu’ils utilisent
de très nombreuses couches, on parle alors d’apprentissage profond (ou deep
learning). Certains de ces réseaux peuvent avoir des milliers de couches, et
des millions de neurones. Pour entraîner de tels réseaux, qui dépendent de
milliers ou dizaines de milliers de paramètres, il faut des bases massives de
données d’entraînement. Le succès actuel des réseaux de neurones profonds est
en grande partie dû à l’utilisation de ces immenses masses de données.
Les réseaux de neurones et en particulier les réseaux profonds permettent de
construire des fonctions extrêmement sophistiquées des données d’entrée, à par-
tir des paramètres entre les noeuds du réseau. On parle aussi de representa-
tion learning. Ces paramètres sont appris automatiquement à partir d’une base
d’apprentissage. Cette délicate étape d’optimisation est l’objet de la prochaine
section.
1 𝑀
ℒ(𝑊 ) = ̂ (𝑚) , 𝑊 ) − 𝑦(𝑚) ‖2 .
∑ ‖𝑦(𝑥
2 𝑚=1
𝑀
ℒ(𝑊 ) = − ∑ (𝑦(𝑚) 𝑙𝑛𝑦(𝑥
̂ (𝑚) , 𝑊 ) + (1 − 𝑦(𝑚) )𝑙𝑛(1 − 𝑦(𝑥
̂ (𝑚) , 𝑊 ))) .
𝑚=1
Remarquons qu’en général, la fonction de perte ℒ(𝑊 ) n’est pas une fonction
convexe des poids, elle peut donc être très difficile à optimiser. En pratique, on
l’optimise quand même par descente de gradient, en faisant donc comme si elle
était convexe.
L’optimisation du réseau se fait par descente de gradient, avec les étapes sui-
vantes :
𝜕ℒ
∇ℒ = { [𝑘]
}
𝜕𝑊𝑗𝑖
𝑖,𝑗,𝑘
[𝑘] [𝑘] 𝜕ℒ
𝑊𝑗𝑖 ⟵ 𝑊𝑗𝑖 − 𝛼 [𝑘]
𝜕𝑊𝑗𝑖
Remarques :
— On peut aussi utiliser un algorithme de gradient conjugué ou du quasi-
newton pour cette optimisation, ce qui permet d’assurer que la fonction
de perte décroît à chaque itération (ce n’est pas le cas avec une descente
de gradient simple).
— Comme la fonction ℒ n’est pas convexe en 𝑊 , il peut être nécessaire de
relancer l’algorithme avec plusieurs initialisations différentes et de choisir
le résultat optimal.
Pour entraîner les réseaux de neurones sur de très grandes bases de données,
on peut utiliser une méthode de descente de gradient séquentielle, aussi appelée
descente de gradient stochastique. Le principe est de décomposer la fonction
d’erreur sous la forme
𝑁
ℒ(𝑤) = ∑ ℒ𝑛 (𝑤)
𝑛=1
Cette mise à jour est répétée soit en choisissant 𝑛 au hasard, soit dans un ordre
prédéfini. On cycle sur les valeurs de 𝑛 et on recommence quand les 𝑁 données
ont toutes été utilisées. Chaque cycle sur l’ensemble des données est appelé une
époque (en anglais epoch).
On peut réinterpréter cette méthode comme une descente avec une version brui-
tée du gradient à chaque étape. Si on suppose que ∇ℒ(𝑤) varie lentement, une
époque est quasiment équivalente à une descente dans la direction −∇ℒ(𝑤) avec
le poids 𝛼.
Ce type de méthode a la bonne propriété de pouvoir échapper au minima locaux,
puisqu’un point stationnaire par rapport à 𝐿 n’est généralement pas stationnaire
pour ℒ𝑛 . Elle s’adapte aussi bien à l’apprentissage online, pour lequel les don-
nées ne sont pas toutes disponibles en même temps.
5.2. OPTIMISATION DU RÉSEAU 53
𝜕𝐿
Dans ce qui suit, on fera un léger abus de notation et on écrira 𝜕ℎ𝑗 pour désigner
𝜕𝑓
le gradient 𝜕ℎ𝑗 . La dérivation en chaîne s’écrira donc
𝑛
𝜕𝐿 𝜕𝐿 𝜕ℎ𝑗
=∑ ,
𝜕𝑥𝑖 𝑗=1
𝜕ℎ𝑗 𝜕𝑥𝑖
1 𝑀
ℒ(𝑊 ) = ̂ (𝑚) , 𝑊 ) − 𝑦(𝑚) ‖2 .
∑ ‖𝑦(𝑥
2 𝑚=1
En dérivant, on a pour tout 𝑖, 𝑗, 𝑘
𝑀
𝜕ℒ 𝜕𝑦̂
[𝑘]
̂ (𝑚) , 𝑊 ) − 𝑦(𝑚) ,
= ∑ < 𝑦(𝑥 [𝑘]
>. (5.4)
𝜕𝑊𝑗𝑖 𝑚=1 𝜕𝑊𝑗𝑖
[𝑙] [𝑙−1]
en gardant en tête que 𝑧𝑗 et 𝑎𝑖 sont ici des fonctions de (𝑥(𝑚) , 𝑊 ). Ainsi,
pour tous les poids de la dernière couche 𝑙,
𝑀
𝜕ℒ [𝑙−1]
[𝑙]
̂ (𝑚) , 𝑊 ) − 𝑦(𝑚) , 𝑔′ (𝑧 [𝑙] (𝑥(𝑚) , 𝑊 ))𝑎𝑖
= ∑ < 𝑦(𝑥 (𝑥(𝑚) , 𝑊 ) > .
𝜕𝑊𝑗𝑖 𝑚=1
𝜕ℒ
Regardons maintenant comment calculer [𝑘] pour les autres couches du réseau.
𝜕𝑊𝑗𝑖
𝜕 𝑦̂
Grâce à l’équation~(5.4), on sait qu’il suffit de calculer [𝑘] . Remarquons que
𝜕𝑊𝑗𝑖
[𝑘] [𝑘]
la sortie 𝑦(𝑥,
̂ 𝑊 ) de dépend des poids 𝑊𝑗𝑖 et de 𝑏𝑗 qu’à travers la valeur de
[𝑘]
𝑧𝑗 . En d’autres termes, il existe 𝑓 telle que
[𝑘] [𝑘′ ] [𝑘′ ]
𝑦(𝑊
̂ ) = 𝑓(𝑧𝑗 , {𝑊𝑗′ 𝑖′ , 𝑏𝑗′ }(𝑖′ ,𝑗′ ,𝑘′ )≠(𝑖,𝑗,𝑘) ).
On rappelle que
[𝑘] [𝑘] [𝑘−1] [𝑘]
𝑧𝑗 = ∑ 𝑊𝑗𝑖 𝑎𝑖 + 𝑏𝑗 .
𝑖
Avec le même abus de notation que plus haut, la dérivée de 𝑦 ̂ par rapport au
[𝑘] [𝑘]
poids 𝑊𝑗𝑖 et à l’offset 𝑏𝑗 s’écrit donc
[𝑘]
𝜕𝑦̂ 𝜕𝑦̂ 𝜕𝑧𝑗 𝜕𝑦̂ [𝑘−1] 𝜕𝑦̂ 𝜕𝑦̂
[𝑘]
= [𝑘] [𝑘]
= 𝑎
[𝑘] 𝑖
, et [𝑘]
= [𝑘]
.
𝜕𝑊𝑗𝑖 𝜕𝑧𝑗 𝜕𝑊𝑗𝑖 𝜕𝑧𝑗 𝜕𝑏𝑗 𝜕𝑧𝑗
[𝑘−1] [𝑘−1]
Comme les valeurs 𝑎𝑖 = 𝑔(𝑧𝑖 ) sont connues, ces équations permettent de
calculer le gradient de 𝑦 ̂ et donc de ℒ par rapport aux paramètres du réseau
(les 𝑊 et les 𝑏) très simplement si on connaît déjà le gradient de 𝑦 ̂ par rapport
[𝑘]
aux valeurs 𝑧𝑗 .
𝜕 𝑦̂
Montrons maintenant que calculer les dérivées partielles [𝑘] se fait également
𝜕𝑧𝑗
très simplement en propageant les valeurs de la couche de sortie vers la couche
[𝑘] [𝑘+1]
d’entrée. Remarquons que 𝑦 ̂ ne dépend de 𝑧𝑗 qu’à travers les valeurs 𝑧𝑙 des
[𝑘]
neurones de la couche 𝑘 + 1 à laquelle le neurone 𝑧𝑗 est connecté. Or,
[𝑘+1] [𝑘] [𝑘]
𝑧𝑙 = ∑ 𝑊𝑙𝑖 𝑔(𝑧𝑖 ).
𝑖
On en déduit que
[𝑘+1]
𝜕𝑦̂ 𝜕𝑦̂ 𝜕𝑧𝑙 𝜕𝑦̂ [𝑘+1] [𝑘]
[𝑘]
=∑ [𝑘+1] [𝑘]
=∑ [𝑘+1]
𝑊𝑙𝑗 𝑔′ (𝑧𝑗 ).
𝜕𝑧𝑗 𝑙 𝜕𝑧𝑙 𝜕𝑧𝑗 𝑙 𝜕𝑧𝑙
𝜕 𝑦̂
Ainsi, si on connaît toutes les dérivées partielles [𝑘+1] pour la couche 𝑘 + 1,
𝜕𝑧𝑙
𝜕 𝑦̂
on peut calculer toutes les dérivées partielles [𝑘] pour la couche 𝑘 par simple
𝜕𝑧𝑗
5.3. RÉGULARISATION 55
5.3 Régularisation
Remarque : on a
∇ℒ𝑅 (𝑊 ) = ∇ℒ(𝑊 ) + 𝜆𝑊 ,
donc la descente de gradient devient
∇ℒ𝑅 (𝑊 ) ≃ 𝐻(𝑊 − 𝑊 ∗ ) + 𝜆𝑊 ,
ℒ𝑅 (𝑊 ) = ℒ(𝑊 ) + 𝜆‖𝑊 ‖1 .
Remarque : on a
1
ℒ𝑅 (𝑊 ) ≃ ℒ(𝑊 ∗ ) + ∑ ( 𝐻𝑖𝑖 (𝑊𝑖 − 𝑊𝑖∗ )2 + 𝜆|𝑊𝑖 |) .
𝑖
2
𝜆
max(𝑊𝑖∗ − 𝐻𝑖𝑖 , 0) si 𝑊𝑅∗ ≥ 0
(𝑊𝑅∗ )𝑖 = { 𝜆
max(𝑊𝑖∗ + 𝐻𝑖𝑖 , 0) si 𝑊𝑅∗ < 0.
SuperLearner : un exemple
d’Ensembl Learning
Les chapitres précédents ont exposé des méthodes très différentes d’apprentis-
sage ayant chacune leurs avantages et leurs défauts en termes d’interprétabilité,
de prédiction, de sélection de variables ou de temps de calcul.
Le choix de la famille d’algorithmes retenue peut être guidé par la modélisa-
tion du problème, la volonté de privilégier l’un des aspects cités ci-dessus, ou
simplement la comparaison de la qualité de la prédiction à l’aide de validation
croisée.
Une autre option peut être de faire collaborer les différentes familles d’algo-
rithmes en les combinant soit via une combinaison linéaire, soit via un vote
majoritaire. On parle alors d’Ensembl Learning (c’est une idée que nous avons
déjà rencontrée au sujet des forêts aléatoires).
59
60CHAPITRE 6. SUPERLEARNER : UN EXEMPLE D’ENSEMBL LEARNING
Commençons par une version simple, où aucun screening n’est spécifié (toutes les
variables sont retenues) et suels des algorithmes par défaut intègrent le librairie,
par exemple la moyenne, les régressions pénalisées, les forêts alétoires et le svm
linéaire.
sl = SuperLearner(Y = y_train, X = x_train, family = binomial(),
[Link] = c("[Link]", "[Link]", "[Link]","[Link]"))
sl
##
## Call:
## SuperLearner(Y = y_train, X = x_train, family = binomial(), [Link] = c("[Link]"
## "[Link]", "[Link]", "[Link]"))
6.2. UN EXEMPLE D’UTILISATION 63
##
##
## Risk Coef
## SL.mean_All 0.2508233 0.0000000
## SL.glmnet_All 0.1281099 0.2225097
## SL.ranger_All 0.1260757 0.2900443
## SL.svm_All 0.1226410 0.4874460
La colonne Risk donne le risque quadratique moyen associé à chaque algorithme
(par validation croisée), la colonne Coef le poids attribué à chaque algorithme
dans la méthode d’ensemble.
6.2.3 Prédiction
Une fonction predict existe, qui permet de donner une prédiction sur tout nouvel
individu, à la fois par la méthode d’ensemble et pour chacune des méthodes
utilisés. Affichons ces prédictions pour les trois premiers individus de l’ensemble
test, d’abors pour la méthode d’ensemble
test_pred <- predict(sl,x_test)
test_pred$pred[1:3]
summary(cv_sl)
##
## Call:
## [Link](Y = y_train, X = x_train, V = 10, family = binomial(), [Link] =
## "[Link]", "[Link]", "[Link]"))
##
## Risk is based on: Mean Squared Error
##
## All risk estimates are based on V = 10
##
## Algorithm Ave se Min Max
## Super Learner 0.13539 0.0131236 0.080959 0.18890
## Discrete SL 0.13894 0.0136349 0.087475 0.19305
## SL.mean_All 0.25178 0.0019204 0.246564 0.26625
## SL.glmnet_All 0.13476 0.0141777 0.071440 0.20874
## SL.ranger_All 0.12961 0.0115004 0.087475 0.16820
## SL.svm_All 0.13176 0.0141141 0.064106 0.19305
plot(cv_sl) + theme_bw()
6.2. UN EXEMPLE D’UTILISATION 65
SL.ranger_All
SL.svm_All
SL.glmnet_All
Method
Super Learner
Discrete SL
SL.mean_All
Des variables peuvent sélectionnées, soit à travers des fonctions existantes (cf
listWrappers(), par exemple [Link] qui ne garde que les variables dont la
corrélation avec 𝑦 est en valeur absolue d’au moins 0.1 ) soit en en créant par
soi-même.
Si par exemple on souhaite voir si l’âge, le sexe et le cholesterol suffisent
my_screening <- function (Y, X, family, obsWeights, id, ...) {
the_vars <- c("age", "sex",
"chol")
whichVariable <- colnames(X) %in% the_vars
return(whichVariable)
}
##
## Call:
## SuperLearner(Y = y_train, X = x_train, family = binomial(), [Link] = c("SL.my_tr
## rpart_algorithms$names))
##
##
## Risk Coef
## SL.my_tree_All 0.5701754 0.04916744
## SL.rpart_1_All 0.1907092 0.54295653
## SL.rpart_2_All 0.1926907 0.17593411
## SL.rpart_3_All 0.1944610 0.23194193
## SL.rpart_4_All 0.1944610 0.00000000
Chapitre 7
TP 1 : Manipulation de
données et validation
croisée
1. Stocker le jeu de données dans un objet de type tibble et afficher les cinq
premières lignes à l’aide de la fonction slice()
2. Afficher la première ligne de chaque mois grâce aux fonctions group_by()
et slice()
3. Supprimer les lignes ayant ayant au moins une donnée manquante
4. A l’aide de la fonction summarise, déterminer la mediane du vent, puis,
en ajoutant la fonction group_by(), la médiane du vent par mois.
5. A l’aide des fonctions filter et select, afficher le taux d’ozone et la vitesse
du vent des jours ayant une température d’au moins 90.
6. A l’aide de la fonction mutate(), ajouter une variable high qui vaut 1
pour les jours ayant un taux d’ozone d’au moins 60, et 0 sinon.
67
68CHAPITRE 7. TP 1 : MANIPULATION DE DONNÉES ET VALIDATION CROISÉE
Les questions ci-dessous peuvent être traités soit méthode par méthode avec les
packages adaptés (rpart pour l’algorithme CART, ranger ou randomForest pour
les forêts aléatoires), soit de façon unifiée avec le package caret.
8.1 CART
2. Apprendre un arbre de classification pour la prédiction des individus à
risque. Le représenter.
3. Relancer plusieurs fois le codes des questions précédentes et comparer les
arbres. Commenter.
69
70 CHAPITRE 8. TP2 - MÉTHODES D’ARBRES
Chapitre 9
Faire de même avec une régression lasso et une régression elastic-net de para-
mètre 𝛼 = .5. Comparer les différents graphes et commenter.
5. Quel autre paramètre pourrait-on régler par validation croisée afin d’élar-
gir la famille de modèles considérés ?
71
72 CHAPITRE 9. TP3 - MODÈLES LINÉAIRES PÉNALISÉS
TP4 - SVM
library(tidyverse)
library(caret)
library(e1071)
library(kernlab)
73
74 CHAPITRE 10. TP4 - SVM
[Link] 6
target
4 no
yes
11.1 Exercice 1
1. Montrer qu’il n’est pas possible de définir cette fonction à partir d’un
modèle linéaire.
2. Montrer qu’il est existe de multiples façon d’y arriver à l’aide du réseau
de neurones suivant
75
76 CHAPITRE 11. TP5 - RÉSEAUX DE NEURONES
x1
x2
11.3 Exercice 3
On propose dans ce qui suit de créer et d’entraîner un réseau très simple à deux
couches et 𝑑 = 3 neurones. Ce réseau prend un scalaire 𝑥 en entrée et donne un
scalaire 𝑦 en sortie.
La première couche du réseau est représentée par une matrice de poids 𝑊 [1]
de taille 3 × 1 et un vecteur d’offset 𝑏[1] à 3 lignes. On utilise une fonction
11.3. EXERCICE 3 77
TP 1 : Manipulation de
données et validation
croisée - Corrigé
1. Stocker le jeu de données dans un objet de type tibble et afficher les cinq
premières lignes à l’aide de la fonction slice()
## # A tibble: 5 x 6
## Ozone Solar.R Wind Temp Month Day
## <int> <int> <dbl> <int> <int> <int>
## 1 41 190 7.4 67 5 1
## 2 36 118 8 72 5 2
## 3 12 149 12.6 74 5 3
## 4 18 313 11.5 62 5 4
## 5 NA NA 14.3 56 5 5
79
80CHAPITRE 12. TP 1 : MANIPULATION DE DONNÉES ET VALIDATION CROISÉE - CORRIGÉ
## # A tibble: 5 x 6
## # Groups: Month [5]
## Ozone Solar.R Wind Temp Month Day
## <int> <int> <dbl> <int> <int> <int>
## 1 41 190 7.4 67 5 1
## 2 NA 286 8.6 78 6 1
## 3 135 269 4.1 84 7 1
## 4 39 83 6.9 81 8 1
## 5 96 167 6.9 91 9 1
## ou drop_na()
## # A tibble: 1 x 1
## Wind_median
## <dbl>
## 1 9.7
airquality %>% group_by(Month) %>%
summarise(Wind_median_bymonth=median(Wind))
## # A tibble: 13 x 2
## Ozone Wind
## <int> <dbl>
## 1 71 13.8
## 2 97 6.3
## 3 97 5.7
## 4 89 10.3
## 5 110 8
## 6 76 9.7
## 7 118 2.3
## 8 84 6.3
## 9 85 6.3
## 10 96 6.9
## 11 78 5.1
## 12 73 2.8
## 13 91 4.6
## # A tibble: 111 x 7
## Ozone Solar.R Wind Temp Month Day high
## <int> <int> <dbl> <int> <int> <int> <dbl>
## 1 41 190 7.4 67 5 1 0
## 2 36 118 8 72 5 2 0
## 3 12 149 12.6 74 5 3 0
## 4 18 313 11.5 62 5 4 0
## 5 23 299 8.6 65 5 7 0
## 6 19 99 13.8 59 5 8 0
## 7 8 19 20.1 61 5 9 0
## 8 16 256 9.7 69 5 12 0
## 9 11 290 9.2 66 5 13 0
## 10 14 274 10.9 68 5 14 0
## # ... with 101 more rows
for (i in 1:nfold){
ldata <- learningdata %>% filter(fold!=i) #new learningdata: all folds but i
tdata <- learningdata %>% filter(fold==i) #new test data: fold i
## # A tibble: 1 x 5
## k0 k1 k2 k3 k4
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1041. 464. 410. 401. 383.
Au vu de l’erreur quadratique par validation croisée, on choisit le
modèle le plus complet
Comment évaluer l’erreur quadratique moyenne de la méthode choisie ?
** En l’évaluant sur le jeu test**
finalmodel <- lm(Ozone~Temp+Wind+Solar.R+Month,data=learningdata)
testpredict <- predict(finalmodel,newdata=testdata,type="response")
mean((testpredict-testdata$Ozone)^2)
## [1] 588.5533
Sa racine carrée est plus facilement interprétable, car dans la bonne unité de
mesure
sqrt(mean((testpredict-testdata$Ozone)^2))
## [1] 24.26012
Il suffit de reprendre les codes précédents en remplçant glm par lm et Ozone par
high
84CHAPITRE 12. TP 1 : MANIPULATION DE DONNÉES ET VALIDATION CROISÉE - CORRIGÉ
Chapitre 13
Les questions ci-dessous peuvent être traités soit méthode par méthode avec les
packages adaptés (rpart pour l’algorithme CART, ranger ou randomForest pour
les forêts aléatoires), soit de façon unifiée avec le package caret (se baser sur
la page [Link] à
adapter à la méthode utilisée).
library(tidyverse)
library(caret)
library(rpart)
library(randomForest)
library([Link])
#pour la suite, il faut que target soit un facteur pour que caret comprenne qu'on fait de la clas
heartdata <- heartdata %>% mutate(target=[Link](ifelse(target==0,"no","yes")))
inTrain <- createDataPartition( #fonction de caret qui sélectionne les indices des individus à
85
86 CHAPITRE 13. TP2 - MÉTHODES D’ARBRES - CORRIGÉ
y = heartdata$target,
p = .75,
list = FALSE
)
#dans l'aide de createDataPartition, on remarquera qu'on peut de même créer des échanti
13.1 CART
Apprentissage
cartFit <- train(
target ~ .,
data = hearttraining,
method = "rpart",
tuneLength = 15, #donne le nombre de valeurs à essayer pour chaque paramètre à fare v
trControl = ctrl,
metric = "ROC"
)
plot(cartFit)
13.1. CART 87
0.80
ROC (Repeated Cross−Validation)
0.75
0.70
0.65
0.60
Complexity Parameter
Le modèle ayant la meilleure prédiction par validation croisée est celui pour
cp=0, c’est-à-dire aucune pénalisation
ca>=0.5 thal>=2.5
exang>=0.5 oldpeak>=0.9
no yes
oldpeak>=0.7 thal>=2.5 no yes
yes no yes
no
ou, pour obtenir un meilleur rendu (en utilisant le package [Link])
[Link](decisiontree)
88 CHAPITRE 13. TP2 - MÉTHODES D’ARBRES - CORRIGÉ
yes
0.54
100%
yes cp < 1 no
no yes
0.27 0.80
49% 51%
ca >= 1 thal >= 3
yes yes
0.54 0.54
22% 11%
exang = 1 oldpeak >= 0.9
no yes
0.26 0.78
10% 12%
oldpeak >= 0.7 thal >= 3
Pour finir, regardons les performances de l’arbre ainsi appris sur le jeu test
cartPred <- predict(cartFit,hearttest)
# avec option type="prob" si on veut les probs d'appartenance. Ici, la classe de plus g
confusionMatrix(data=cartPred,hearttest$target)
## Prevalence : 0.4533
## Detection Rate : 0.3200
## Detection Prevalence : 0.4000
## Balanced Accuracy : 0.7798
##
## 'Positive' Class : no
##
trControl = ctrl,
metric = "ROC"
)
## note: only 12 unique complexity parameters in default grid. Truncating the grid to 1
## Warning in [Link](x, y, weights = w, ...): The metric "ROC" was not in
## the result set. Accuracy will be used instead.
plot(rfFit)
Accuracy Out of Bag Resampling
0.835
0.830
0.825
0.820
0.815
2 4 6 8 10 12
##
## Kappa : 0.5652
##
## Mcnemar's Test P-Value : 0.4533
##
## Sensitivity : 0.7059
## Specificity : 0.8537
## Pos Pred Value : 0.8000
## Neg Pred Value : 0.7778
## Prevalence : 0.4533
## Detection Rate : 0.3200
## Detection Prevalence : 0.4000
## Balanced Accuracy : 0.7798
##
## 'Positive' Class : no
##
5. Quelles sont les variables les plus importantes pour la prédiction du risque
cardio-vasculaire ?
varImp(rfFit)
## rf variable importance
##
## Overall
## thalach 100.00
## ca 91.22
## cp 83.05
## oldpeak 79.63
## thal 70.39
## age 62.67
## chol 53.98
## trestbps 46.92
## exang 46.39
## slope 25.79
## sex 20.29
## restecg 10.35
## fbs 0.00
Les détails sur la détermination de ces coefficients sont donnée sur [Link]
.[Link]/caret/[Link] (première entrée pour une recherche
“caret variable importance”). Pour le cas d’arbres de classification, elles sont
déterminées comme vu en cours (différence de prédiction entre version réelle et
permutée de la variable d’intérêt, normalisée par l’écart-type puis modifiée pour
que la variable la plus importante soit à 100).
Interprétation : si thalach a un indice d’importance de 100, l’âge en a un de
92 CHAPITRE 13. TP2 - MÉTHODES D’ARBRES - CORRIGÉ
56
La version non ramenée à un maximum de 100 peut s’obtenir
varImp(rfFit,scale=FALSE)
## rf variable importance
##
## Overall
## thalach 14.402
## ca 13.241
## cp 12.163
## oldpeak 11.711
## thal 10.490
## age 9.470
## chol 8.322
## trestbps 7.390
## exang 7.319
## slope 4.598
## sex 3.871
## restecg 2.558
## fbs 1.191
Interpretation : Considérons trois jeux de données 𝐽1 , 𝐽2 , 𝐽3 , thalach étant
prise en compte dans 𝐽3 mais pas dans les deux autres. Le gain en terme de
critère (ici Accuracy) entre 𝐽1 et 𝐽3 est en moyenne 14 fois plus grand que la
différence entre 𝐽1 et 𝐽2 .
Chapitre 14
1. Récupérer les données [Link] disponibles sur Moodle. Elles sont issues
du package [Link] mais modifiées pour supprimer les gènes appa-
raissant en double dans les données initiales. Elles comprennent la mesure
de l’expression d’un peu moins de 2000 gènes sur 62 échantillons de tissus
du colon, ainsi que de l’information concernant le statut tumoral ou non
dudit tissu.
library(tidyverse)
library(caret)
library(glmnet)
#pour la suite, il faut que tumoral soit un facteur pour que caret comprenne qu'on fait de la cla
colondata <- colondata %>% mutate(tumoral=[Link](ifelse(tumoral==0,"no","yes")))
inTrain <- createDataPartition( #fonction de caret qui sélectionne les indices des individus à
y = colondata$tumoral,
p = .75,
93
94 CHAPITRE 14. TP3 - MODÈLES LINÉAIRES PÉNALISÉS - CORRIGÉ
list = FALSE
)
#dans l'aide de createDataPartition, on remarquera qu'on peut de même créer des échanti
vers une solution qui est mauvaise, ce qu’indique d’ailleurs le message d’aver-
tissement. Ceci est dû au fait que le problème est en grande dimension (1911
variables pour àun peu plus de quarante observations dans l’ensemble d’appren-
tissage). Il faut donc également recourir à la sélection de variables.
Faire de même avec une régression lasso et une régression elastic-net de para-
mètre 𝛼 = .5. Comparer les différents graphes et commenter.
[Link] <- colontrain %>% select(tumoral) %>% [Link]()
[Link] <- colontrain %>% select(-tumoral) %>% [Link]()
[Link] <- glmnet([Link],[Link],family = "binomial",alpha=0)
plot([Link])
−2e−04
−6e−04
L1 Norm
[Link] <- glmnet([Link],[Link],family = "binomial",alpha=1)
plot([Link])
96 CHAPITRE 14. TP3 - MODÈLES LINÉAIRES PÉNALISÉS - CORRIGÉ
0 14 17 23 23 26
0.010
Coefficients
0.000
−0.010
L1 Norm
[Link] <- glmnet([Link],[Link],family = "binomial",alpha=0.5)
plot([Link])
0 34 47 55 65 79 83 91
0.010
0.005
Coefficients
0.000
−0.005
L1 Norm
## [1] 0.07565021
[Link] <- glmnet([Link],[Link],family="binomial",alpha=1,nlambda=1,lambda=[Link]$lamb
## # A tibble: 15 x 3
## proba[,"s0"] MAP[,"s0"] truth[,"tumoral"]
## <dbl> <dbl> <dbl>
## 1 0.107 0 0
## 2 0.979 1 1
## 3 0.995 1 1
## 4 0.666 1 1
## 5 0.818 1 1
## 6 0.859 1 1
## 7 0.174 0 0
## 8 0.867 1 1
## 9 0.419 0 0
## 10 0.118 0 1
## 11 0.970 1 1
## 12 0.139 0 0
## 13 0.829 1 0
## 14 0.680 1 1
## 15 0.903 1 1
confusionMatrix(data=as_factor(results$MAP),as_factor(results$truth))
## Accuracy : 0.8667
## 95% CI : (0.5954, 0.9834)
## No Information Rate : 0.6667
## P-Value [Acc > NIR] : 0.07936
##
## Kappa : 0.7
##
## Mcnemar's Test P-Value : 1.00000
##
## Sensitivity : 0.8000
## Specificity : 0.9000
## Pos Pred Value : 0.8000
## Neg Pred Value : 0.9000
## Prevalence : 0.3333
## Detection Rate : 0.2667
## Detection Prevalence : 0.3333
## Balanced Accuracy : 0.8500
##
## 'Positive' Class : 0
##
*On lance 𝐵 bootstrap, on apprend sur chacun d’eux un modèle lasso avec trop
de gènes (en divisant par exemple le 𝑙𝑎𝑚𝑏𝑑𝑎 selectionné par validation croisée
par 2) et on regarde quels sont les gènes les plus fréquemment sélectionnés).
B=100 # nombre de bootstraps
npatients <- dim([Link])[1]
selected <- rep(0,dim([Link])[2]) # comptage du nombre de fois où chaque gène est séle
for (b in 1:B){
#echantillon bootstrap
bootsample <- sample(1:npatients,npatients,replace=TRUE)
[Link] <- [Link][bootsample,]
[Link] <- [Link][bootsample,]
#apprentissage
[Link] <- glmnet([Link],[Link],family="binomial",alpha=1,nlambda=1,lambda=.
#recuperation des identites des coefficients non nuls
selectedgenes <- [Link]$beta@i
for (i in selectedgenes){
selected[i] <- selected[i] +1
}
}
#restriction du jeu d'apprentissage aux genes étant sélectionnés au moins 1/4 du temps
selection <- which(selected>B/4)
14.1. AVEC GLMNET 99
5. Quel autre paramètre pourrait-on régler par validation croisée afin d’élar-
gir la famille de modèles considérés ?
100CHAPITRE 14. TP3 - MODÈLES LINÉAIRES PÉNALISÉS - CORRIGÉ
#pour la suite, il faut que target soit un facteur pour que caret comprenne qu'on fait
heartdata <- heartdata %>% mutate(target=[Link](ifelse(target==0,"no","yes")))
inTrain <- createDataPartition( #fonction de caret qui sélectionne les indices des in
y = heartdata$target,
p = .75,
list = FALSE
)
#dans l'aide de createDataPartition, on remarquera qu'on peut de même créer des échanti
trControl = ctrl,
metric = "ROC"
)
plot(glmFit)
Regularization Parameter
0.00263001563835564 0.0263001563835564
0.0046769026577682 0.046769026577682
0.00831683969906551 0.0831683969906551
0.0147896647934425 0.147896647934425
ROC (Repeated Cross−Validation)
0.9
0.8
0.7
0.6
0.5
Mixing Percentage
Les différentes couleurs correspondent à des valeurs différentes de 𝜆, l’abscisse
au coefficient 𝛼
plot(glmFit$finalModel)
102CHAPITRE 14. TP3 - MODÈLES LINÉAIRES PÉNALISÉS - CORRIGÉ
0 11 13 13
1.0
0.5
Coefficients
0.0
−0.5
−1.0
−1.5
0 2 4 6
L1 Norm
glmPred <- predict(glmFit,hearttest)
# avec option type="prob" si on veut les probs d'appartenance. Ici, la classe de plus g
confusionMatrix(data=glmPred,hearttest$target)
library(tidyverse)
library(caret)
library(e1071)
library(kernlab)
data(iris)
irisdata <- as_tibble(iris)
#pour la suite, il faut que target soit un facteur pour que caret comprenne qu'on fait de la clas
irisdata <- irisdata %>% mutate(target=[Link](ifelse(Species=="virginica","yes","no"))) %>%
#puis on sélectionne les variables demandées
select(c([Link],[Link],target))
inTrain <- createDataPartition( #fonction de caret qui sélectionne les indices des individus à
y = irisdata$target,
p = .75,
list = FALSE
)
#dans l'aide de createDataPartition, on remarquera qu'on peut de même créer des échantillons boot
105
106 CHAPITRE 15. TP4 - SVM - CORRIGÉ
6
[Link]
target
4
no
yes
2.0 o o
oo o
yes
o
[Link]
1.5 oo
o o o
oo o
o
o oo
1.0 oo
no
0.5
oo
oo
oo
o o
2 3 4 5 6
[Link]
confusionMatrix(data=gaussianpred,iristest$target)
##
## 'Positive' Class : no
##
plot(gaussiansvm,iristest)
2.0 o o
oo o
yes
o
[Link]
1.5 oo
o o o
oo o
o
o oo
1.0 oo
no
0.5
oo
oo
xo
o
o o
2 3 4 5 6
[Link]
data(iris)
irisdata <- as_tibble(iris)
#pour la suite, il faut que target soit un facteur pour que caret comprenne qu'on fait de la clas
irisdata <- irisdata %>% mutate(target=[Link](ifelse(Species=="versicolor","yes","no"))) %>%
#puis on sélectionne les variables demandées
select(c([Link],[Link],target))
inTrain <- createDataPartition( #fonction de caret qui sélectionne les indices des individus à
y = irisdata$target,
p = .75,
list = FALSE
)
110 CHAPITRE 15. TP4 - SVM - CORRIGÉ
#dans l'aide de createDataPartition, on remarquera qu'on peut de même créer des échanti
6
[Link]
target
4 no
yes
Cette fois-ci, les données ne sont pas linéairement séparables, la version linéaire
ne devrait pas aussi bien fonctionner.
#apprentissage des modèles
linearsvm <- svm(formula = target~.,
data = iristraining,
type = 'C-classification',
kernel = 'linear')
confusionMatrix(data=linearpred,iristest$target)
2.5 o x
o
x
2.0 x
yes
o o
o oo o o
o o
[Link]
o
1.5 o
x
x x
o oxx
x
1.0 o o
no
0.5
o
o
xo
xx
o o
2 3 4 5 6
[Link]
confusionMatrix(data=gaussianpred,iristest$target)
##
## 'Positive' Class : no
##
plot(gaussiansvm,iristest)
2.5 o o
x
o
2.0 o
yes
o o
o xo o o
o o
[Link]
o
1.5 o
o o
o ooo
o
1.0 o o
no
0.5
o
ooo
oo
o o
2 3 4 5 6
[Link]
#pour la suite, il faut que target soit un facteur pour que caret comprenne qu'on fait de la clas
heartdata <- heartdata %>% mutate(target=[Link](ifelse(target==0,"no","yes")))
inTrain <- createDataPartition( #fonction de caret qui sélectionne les indices des individus à
y = heartdata$target,
p = .75,
list = FALSE
)
114 CHAPITRE 15. TP4 - SVM - CORRIGÉ
#dans l'aide de createDataPartition, on remarquera qu'on peut de même créer des échanti
SVM linéaire
svmLinearFit <- train(
target ~ .,
data = hearttraining,
method = "svmLinear",
#tuneLength = 5, #donne le nombre de valeurs à essayer pour chaque paramètre à fare v
trControl = ctrl,
metric = "ROC",
preProcess = c("center","scale"),
tuneGrid = [Link](C = seq(0.1, 2, length = 19))
)
plot(svmLinearFit)
15.2. AVEC CARET 115
ROC (Repeated Cross−Validation)
0.900
0.899
0.898
0.897
Cost
svmLinearFit
## sigma C
## 1 0.05160797 0.25
svmRadialFit
16.1 Exercice 1
1. Montrer qu’il n’est pas possible de définir cette fonction à partir d’un
modèle linéaire.
Alors
𝛾 = 0 pour 𝑥1 = 0, 𝑥2 = 0
𝛼 + 𝛾 = 1 pour 𝑥1 = 1, 𝑥2 = 0
𝛽 + 𝛾 = 2 pour 𝑥1 = 0, 𝑥2 = 1
𝛼 + 𝛽 + 𝛾 = 0 pour 𝑥1 = 1, 𝑥2 = 1
119
120 CHAPITRE 16. TP5 - RÉSEAUX DE NEURONES - CORRIGÉ
2. Montrer qu’il est existe de multiples façon d’y arriver à l’aide du réseau
de neurones suivant
x1
x2
1 −1 1
Une solution possible est 𝑊 [1] = ( ) et 𝑊 [2] = ( ).
−1 1 1
1
𝑘 −𝑘
Tout choix de la forme 𝑊 [1] = ( ) et 𝑊 [2] = ( 𝑘1 ) est solution pour
−𝑘 𝑘 𝑘
𝑘 > 0.
16.3 Exercice 3
On propose dans ce qui suit de créer et d’entraîner un réseau très simple à deux
couches et 𝑑 = 3 neurones. Ce réseau prend un scalaire 𝑥 en entrée et donne un
scalaire 𝑦 en sortie.
La première couche du réseau est représentée par une matrice de poids 𝑊 [1]
de taille 3 × 1 et un vecteur d’offset 𝑏[1] à 3 lignes. On utilise une fonction
d’activation tanh. A la sortie de la première couche on observe donc
x y
z1 tanh
x z2 tanh y
z3 tanh
𝑀
̂ (𝑚) , 𝑊 [1] , 𝑏[1] , 𝑊 [2] , 𝑏[2] ) − 𝑦(𝑚) ‖2 .
ℒ(𝑊 [1] , 𝑏[1] , 𝑊 [2] , 𝑏[2] ) = ∑ ‖𝑦(𝑥
𝑚=1
Notons 𝑦[𝑚]
̂ ̂ (𝑚) , 𝑊 [1] , 𝑏[1] , 𝑊 [2] , 𝑏[2] )
= 𝑦(𝑥
Les équations qui régissent le réseau et qu’il va falloir dériver sont alors
16.3. EXERCICE 3 123
ℒ = ∑(𝑦[𝑚] − 𝑦(𝑚) )2
𝑚
[1] [2]
𝑦[𝑚] = ∑ 𝐴𝑗𝑚 𝑤𝑗 + 𝑏[2]
𝑗
[1] [1]
𝐴𝑗𝑚 = 𝑡𝑎𝑛ℎ(𝑍𝑗𝑚 )
[1] [1] [1]
𝑍𝑗𝑚 = 𝑤𝑗 𝑥(𝑚) + 𝑏𝑗
En dérivant la première,
𝜕ℒ
= 2(𝑦[𝑚]
̂ − 𝑦(𝑚) )
𝜕 𝑦[𝑚]
̂
Le vecteur gradient des dérivées par rapport aux 𝑦[𝑚] est donc 𝑔𝑟𝑎𝑑𝑦 = 2(𝑦𝑝𝑟𝑒𝑑 −
𝑦)
𝜕ℒ 𝜕ℒ 𝜕 𝑦[𝑚]
̂ [1]
[2]
=∑ [2]
= ∑ 2(𝑦[𝑚]
̂ − 𝑦(𝑚) )𝐴𝑗𝑚
𝜕𝑊𝑗 𝑚
𝜕 𝑦[𝑚]
̂ 𝜕𝑊 𝑚
𝑗
Le vecteur ligne des trois dérivées partielles vérifie donc 𝑔𝑟𝑎𝑑𝑊 2 = (𝐴[1] 𝑔𝑟𝑎𝑑𝑦 )′ .
𝜕ℒ 𝜕ℒ 𝜕 𝑦[𝑚]
̂
[2]
== ∑ [2]
= ∑ 2(𝑦[𝑚]
̂ − 𝑦(𝑚) )
𝜕𝑏 𝑚
𝜕 𝑦[𝑚]
̂ 𝜕𝑏 𝑚 𝑗
𝜕ℒ [2]
= 2(𝑦[𝑚]
̂ − 𝑦(𝑚) )𝑊𝑖
𝜕𝐴𝑖𝑚
𝜕ℒ 𝜕ℒ 𝜕𝐴𝑖𝑚 𝜕ℒ
= = (1 − 𝐴2𝑖𝑚 )
𝜕𝑍𝑖𝑚 𝜕𝐴𝑖𝑚 𝜕𝑍𝑖𝑚 𝜕𝐴𝑖𝑚
[1]
𝜕ℒ 𝜕ℒ 𝜕𝑍𝑗𝑚 𝜕ℒ
[1]
=∑ [1] [1]
=∑ [1]
𝑥(𝑚)
𝜕𝑊𝑗 𝑚 𝜕𝑍𝑗𝑚 𝜕𝑊𝑗 𝑚 𝜕𝑍𝑗𝑚
[1]
𝜕ℒ 𝜕ℒ 𝜕𝑍𝑗𝑚 𝜕ℒ
[1]
=∑ [1] [1]
=∑ [1]
𝜕𝑏𝑗 𝑚 𝜕𝑍𝑗𝑚 𝜕𝑏𝑗 𝑚 𝜕𝑍𝑗𝑚
x=seq(from=-1,to=1,[Link]=30)
y=x^2
plot(x,y)
16.3. EXERCICE 3 125
1.0
0.8
0.6
y
0.4
0.2
0.0
for(i in 1:10000){
y_pred = prediction(x,w1,b1,w2,b2)
y_pred = prediction(x,w1,b1,w2,b2)
y_pred
ggplot(plot_data, aes(x)) +
geom_line(aes(y = y, colour = "y")) +
geom_line(aes(y = y_pred, colour = "y_pred"))
16.3. EXERCICE 3 127
1.00
0.75
colour
0.50 y
y
y_pred
0.25
0.00
y_pred = prediction(x,w1,b1,w2,b2)
ggplot(plot_data, aes(x)) +
geom_line(aes(y = y, colour = "y")) +
geom_line(aes(y = y_pred, colour = "y_pred"))
128 CHAPITRE 16. TP5 - RÉSEAUX DE NEURONES - CORRIGÉ
25
20
15
colour
y
y
y_pred
10
8. Utiliser le même réseau pour les fonctions 𝑓(𝑥) = 𝑐𝑜𝑠(𝑥) sur le même
intervalle.
x=seq(from=-3.14,3.14,by=0.1)
y=cos(x)
rate=.001
for(i in 1:10000){
y_pred = prediction(x,w1,b1,w2,b2)
On peut maintenant faire des prédictions sur par exemple l’intervalle [−5, 5]
tx <- seq(from=-5,to=5,by=.01)
ty <- prediction(tx,w1,b1,w2,b2)
ggplot(plot_data, aes(x)) +
geom_line(aes(y = y, colour = "y")) +
geom_line(aes(y = y_pred, colour = "y_pred"))
130 CHAPITRE 16. TP5 - RÉSEAUX DE NEURONES - CORRIGÉ
1.0
0.5
colour
0.0
y
y
y_pred
−0.5
−1.0
Une fois de plus, on observe une très bonne prédiction sur l’intervalle sur lequel
on a appris mais elle ne se généralise pas au-delà.
[1]
𝜕ℒ 𝜕ℒ 𝜕𝐴𝑖 𝜕ℒ
[1]
= [1] [1]
= [1]
1𝑍 [1] >0
𝜕𝑍𝑖 𝜕𝐴𝑖 𝜕𝑍𝑖 𝜕𝐴𝑖 𝑖
Le gradient suivant 𝑍 [1] est donc simplement obtenu à partir du gradient suivant
𝐴[1] en annulant les coordonnées pour lesquelles 𝑍 [1] est négatif.
w1 = matrix(runif(n=3,-1,1),3,1) #w1 vecteur colonne
b1 = matrix(runif(n=3,-1,1),3,1) #b1 vecteur colonne
w2 = matrix(runif(n=3,-1,1),1,3) #w2 vecteur ligne
b2 = runif(n=1,-1,1)
x=seq(from=-3.14,3.14,by=0.1)
y=cos(x)
rate=.005
16.3. EXERCICE 3 131
for(i in 1:100000){
y_pred = prediction(x,w1,b1,w2,b2)
#print(i)
#print(y_pred)
On peut maintenant faire des prédictions sur par exemple l’intervalle [−5, 5]
tx <- seq(from=-5,to=5,by=.01)
ty <- prediction(tx,w1,b1,w2,b2)
ggplot(plot_data, aes(x)) +
geom_line(aes(y = y, colour = "y")) +
geom_line(aes(y = y_pred, colour = "y_pred"))
1.0
0.5
colour
0.0 y
y
y_pred
−0.5
−1.0
library(keras)
library(ggplot2)
133
134CHAPITRE 17. TP6 - RÉSEAUX DE NEURONES - CLASSIFICATION ET KERAS
0.5
0.0
y
x2
0
1
−0.5
−1.0
Il existe plusieurs packages spécialisés pour éviter de coder les réseaux de neu-
rones à la main, la plupart sous Python : Tensorflow, Theano, Keras, Pytorch
(voir [Link] pour une liste de
librairies spécialisées en deep learning). On se propose d’utiliser keras, également
disponible sous R, pour recoder le réseau précédent.
0.8
0.6
loss
0.4
data
training
validation
0.75
accuracy
0.50
0.25
0.00
0 10 20 30 40 50 60
epoch
# prediction
#model %>% predict_classes(xgrid) -> ygrid
r = seq(0,1,by=1/(N-1)) # radius
t = seq(j*4,(j+1)*4,by=4/(N-1)) + runif(N)*0.2 # theta
X[ix,1] = r*sin(t)
X[ix,2] = r*cos(t)
y[ix] = j
}
0.5
y
3.0
2.5
x2
0.0
2.0
1.5
1.0
−0.5
−1.0
−0.5 0.0 0.5 1.0
x1
139