forked from fmny/Titanic
-
Notifications
You must be signed in to change notification settings - Fork 0
/
titanic.R
137 lines (98 loc) · 5.94 KB
/
titanic.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#lien
#http://apiacoa.org/blog/2014/02/initiation-a-rpart.fr.html
#les arbres de decision calculent des proba conditionnelles
#ici de deces ou de survie par rapport au sexe par exemple
#ratio de base:
#titanic 62% de morts
#homme:81% de morts
#Femme:27% de morts
#en fait l arbre calcul sur les données les probas conditionnelles calculees sur l echantillon
#avec comme variables explicatives l ensemble des données de la base mis en parametre
#ex: proba de décès selon le sexe, l age,... ce qui donne l arbre que l'on peut visualiser
#grace à la fonction prp
#Installation des packages
#install.packages("Rtools")
#install.packages("rpart")
#install.packages("rpart.plot")
library(rpart)
library(rpart.plot)
data(ptitanic)
setwd("C:\\Users\\Francis\\R_new\\titanic")
write.csv(ptitanic,file=".\\Data\\titanic.csv")
read.csv(file ="C:\\Users\\Francis\\R_new\\titanic\\Data\\titanic.csv" )
#Les donnees decrivent 1309 passagers selon 6 variables :
#pclass donne la classe tarifaire sur le bateau ;
#survided indique si le passager a survecu ;
#sex donne le genre du passager ;
#age donne l age du passager exprimé en années ;
#sibsp donne le nombre de frères, soeurs, mari ou epouse à bord ;
#parch donne le nombre d'enfants ou de parents à bord.
#Les trois dernières variables sont numériques alors que les trois premieres sont nominales.
#Il faut bien s'assurer que la représentation en R des variables respecte leur nature.
#Pour ce faire, on utilise :
lapply(ptitanic,class)
#La fonction lapply() permet d'appliquer une fonction à chaque élément d'une liste.
#Les trois variables nominales sont donc bien des factor.
#Pour les valeurs numériques, on obtient la classe labelled qui est specifique au package Hmisc.
#On peut verifier en supprimant cette classe que les variables correspondantes sont bien numériques,
#comme dans le code suivant :
attr(ptitanic$age,"class") <- NULL
class(ptitanic$age)
#Construction de l arbre complet
#La fonction de construction d un arbre s appelle rpart, comme le package.
#On l utilise en general avec l interface des formules de R, comme ci-dessous :
ptitanicTree <- rpart(survived~.,data=ptitanic)
#La formule utilisee survived~. indique qu on souhaite predire la variable survived en fonction de toutes les autres.
#Le principe general est que la (ou les) variable(s) a predire sont à gauche du symbole ~ alors que les variables predictives
#sont a droite du symbole. Ici, le point . permet d indiquer qu on souhaite utiliser toutes les variables des donnees comme predicteurs
#sauf les variables a predire (ce qui evite d avoir a ecrire la liste des predicteurs).
#On a utilise ici les parametres par defaut de la fonction rpart,
#ce qui ne conduit pas toujours a la solution desiree.
#En effet, rpart ne construit en general pas l arbre le plus complet possible, pour des raisons d efficacite.
#Il est rare en pratique qu un arbre tres profond qui ne réalise aucune erreur de classement sur les donnees d apprentissage soit le plus adapte.
#Il sur-apprend massivement, en general. Il n est donc pas tres utile de construire un tel arbre, puisqu on devra en pratique l elaguer.
#Cependant, il arrive sur des donnees de petite taille que les parametres par defaut de rpart soient trop conservateurs.
#Par exemple, rpart ne decoupe pas une feuille contenant 20 observations.
#De meme rpart demande une amelioration relative
#d au moins 1 % de la qualite d une partition pour effectuer un decoupage. Pour changer ces valeurs,
#il suffit d utiliser la commande rpart.
#control en precisant les elements a modifier. Le code suivant
#construit un arbre en continuant les decoupages dans les feuilles qui contiennent au moins 5 observations (parametre minsplit)
#et sans contrainte sur la qualité du découpage (parametre cp mis a 0).
#L arbre construit de cette facon est assez volumineux et contient
#65 feuilles.
ptitanicTree <- rpart(survived~.,data=ptitanic,control=rpart.control(minsplit=5,cp=0))
prp(ptitanicTree,extra=1) #graphe complet mais illisible
summary(ptitanicTree)
#Rem FM: minsplit =5, semble signifier que l'on ne redécoupe une branch+e
#en plusieurs feuilles que si celle-ci possède au moins 5 obs
#par défaut minsplit=20 si l'on ne le précise pas
plotcp(ptitanicTree)
#on voit le nombre de feuilles (65 feuilles) sur le plotcp
#Simplification
#Comme attendu, les performances s améliorent dans un premier temps quand on augmente le nombre de feuilles
#puis se degradent en raison du sur-apprentissage. On choisit en general la complexité qui minimise
#l erreur estimee, soit ici 11 feuilles
#0.0047= racine(0.008*0.0028) (moyenne geometrique des cp des lignes 5 et 6 de cptable) que l'on peut lire dans la table ptitanicTree$cptable
#Pour obtenir l arbre simplifie, on utilise la fonction prune, comme dans le code suivant :
#ptitanicTree$cptable
# CP nsplit rel error xerror xstd
#1 0.4240000000 0 1.000 1.000 0.03515762
#2 0.0210000000 1 0.576 0.576 0.02997570
#3 0.0150000000 3 0.534 0.568 0.02982506
#4 0.0090000000 5 0.504 0.524 0.02895237
#5 0.0080000000 9 0.468 0.534 0.02915746
#6 0.0028000000 10 0.460 0.490 0.02822371 #min de la std error
#7 0.0020000000 21 0.414 0.508 0.02861563
#8 0.0010000000 42 0.372 0.544 0.02935851
#9 0.0008000000 48 0.366 0.540 0.02927857
#10 0.0005000000 53 0.362 0.538 0.02923836
#11 0.0002857143 57 0.360 0.542 0.02931862
#12 0.0000000000 64 0.358 0.542 0.02931862
ptitanicSimple <- prune(ptitanicTree,cp=0.0047)
plotcp(ptitanicSimple) #le graphe optimal a 11 feuilles
prp(ptitanicSimple,extra=1)
ptitanicOptimal <- prune(ptitanicTree,cp=ptitanicTree$cptable[which.min(ptitanicTree$cptable[,4]),1])
plotcp(ptitanicOptimal) #le graphe optimal a 11 feuilles
prp(ptitanicOptimal,extra=1)
#le parametre extra=1 permet d'afficher le comptage des morts/vivants