Classifications/catégorisations
sous R
L'essentiel de cette page
Les classifications ou catégorisations sont des méthodes dites supervisées. On attribue à des classes déjà existantes des individus non encore catégorisés. Beaucoup de méthodes !
La méthode SVM permet de modéliser une méthode d'attribution à des classes en identifiant des frontières entre les groupes existant : très efficace.
Les arbres de décisions ne sont pas toujours efficaces mais permettent d'avoir un modèle simple explicatif (idéal pour un industriel !)
Les randoms forest (forêts aléatoires) est une extension des arbres de décision beaucoup plus efficace dans ses prédictions. Elle a l'avantage de renseigner précisément sur les variables qui jouent sur la distinction des groupes tout en ayant l'inconvénient d'être non-explicable (modélisation trop complexe)
La régression logistique permet de classifier les données à séparer sur 2 classes. Cette méthode donne des résultats équivalents aux classifieurs naïfs bayésiens.
On notera que certaines méthodes de regroupement se prêtent à la classification telles les K-means ou le mélange de gaussiennes.
1- Méthode SVM
Voici une ébauche de code à mettre au propre qui explique comment utiliser un fichier modèle synth2 pour l'apprentissage, comment utiliser predict() ensuite pour faire des regroupements et utiliser un modèle synth pour estimer la fiabilité des prédictions...
# install.packages("e1071")
library(e1071)
data(iris)
# Ajuste un modèle SVM en utilisant toutes les variables indépendantes dans iris2 pour prédire la variable dépendante Sepal.Length
model <- svm(Species ~ ., iris , cross = 10)
# Utilise le modèle pour prédire les valeurs de la variable dépendante pour toutes les observations dans iris, sauf la variable dépendante elle-même
mypred <- predict(model, subset(iris, select = - c(Species)))
# Compiler mypred
mypred<- colnames(mypred)[apply(mypred,1,function(x){which(x==max(x))})]
# Comparaison entre réalité et théorie
table(iris$Species,mypred)
mypred
setosa versicolor virginica
setosa 50 0 0
versicolor 0 48 2
virginica 0 2 48
2- Arbres de décision
Les arbres de décision permettent d'avoir un modèle simple pour comprendre comment catégoriser, idéal en industrie !
Exemple 1 - Avec {rpart}
install.packages("rpart.plot")
install.packages("rpart")
library(rpart)
model<-rpart(Species~.,data=iris,control=rpart.control(minsplit = 5,cp=0))
library(rpart.plot)
rpart.plot(model)
Faire et contrôler la prédiction
predict(model,iris)->prediction
prediction <- colnames(prediction)[apply(prediction,1,function(x){which(x==max(x))})]
table(prediction,iris$Species)
Exemple 2 - Avec {tree} - que je recommande moins
data(iris)
install.packages("tree")
library("tree")
arbre<-tree(factor(iris$Species)~. ,
data=iris,
control=tree.control(nobs=150,mincut=2, minsize=7)
)
plot(arbre)
text(arbre,pretty=0) #
3- Forêts aléatoires ou random forest
Les forêts aléatoires (random forest) permettent de faire des prédictions pour classifier des données. Il est très efficace mais complexe à interpréter car il est basé sur le bootstrap puisqu'il va réaliser un très grand nombre d'arbres de décisions en tirant au sort individus et variables. Cela permet de voir des variables pertinentes qui pourraient être masquées par une autre.
Grand intérêt : cette méthode nous donne quelles variables peuvent avoir une importance pertinente dans une classification, même localement (ce que ne verrait pas une régression).
Attention : la variable catégorielle doit obligatoirement avoir été définie en facteur avec la fonction factor() ou as.factor().
Les données (exemple)
data(iris)
iris[sample(1:150,10),1]<- NA # On ajoute ici des données manquantes pour montrer un exemple d'imputations lorsqu'on fait des forêts aléatoires sur un jeu de données à trous.
Compléter les données manquantes s'il y en a (optionnel)
library(randomForest)
iris2 <- rfImpute(Species~ ., data = iris)
Réaliser les arbres de décisions
Attention : il faut modéliser les classes uniquement en fonction de variables de type numérique ou facteur.
Remarque : on peut aussi indiquer le paramètre na.action = na.roughfix pour remplacer les NA par la valeur médiane de la variable (si on ne veut pas faire d'imputation)
model <- randomForest(Species ~ ., data = iris2)
# Remarque : factoriser Species si cela ne marche pas
model <- randomForest(factor(iris2$Species) ~ ., data = iris2)
print(model )
Visualiser les résultats
varImpPlot(model ) # Importance des différentes variables sur la classification (plot)
model$importance # Importance des différentes variables sur la classification
On voit ainsi que la variable Petal.Length est idéale pour séparer les espèces d'iris.
Comme pour chaque modèle, il est ensuite possible de faire des prédictions pour classifier de nouvelles données :
predict(model,iris2)
4- Régression logistique
Régression logisitique
data(iris)
iris <- iris[51:150,]
iris$Species = as.factor(as.character(iris$Species))
reg <- glm(Species ~ ., data = iris, family = binomial(logit))
reg
summary(reg)
prediction <- predict(reg,iris)
prediction <- ifelse(prediction>0.5,"virginica","versicolor")
table(prediction,iris$Species)
5- Classifieur naïf bayésien
data(iris)
iris <- iris[51:150,]
iris$Species = as.factor(as.character(iris$Species))
library(e1071)
model <- naiveBayes(Species~.,data=iris)
predict(model,iris)->prediction
tempdf <- data.frame("test" = iris$Species,prediction)
tempdf <- table(tempdf)
tempdf <- round(prop.table(tempdf ), 2) ; print(tempdf )
6- Réseaux de neurones
Cela fait toujours rêver de faire des réseaux de neurones, mais, même si cette technique de classification marche bien, elle est peu utilisée en recherche car correspondant à une boîte noire, un modèle non explicable.
# Charge le jeu de données Iris intégré dans R
data(iris)
# Affiche le jeu de données Iris dans une fenêtre de visualisation
View(iris)
# Installe le package 'neuralnet' pour les réseaux de neurones
install.packages("neuralnet")
# Charge le package 'neuralnet'
library(neuralnet)
# Entraîne un réseau de neurones sur le jeu de données Iris avec 2 neurones dans la couche cachée
# La sortie est non-linéaire (classification) et le modèle est formé pour prédire 'Species' à partir des autres colonnes (.)
iris.nn <- neuralnet(Species~., data=iris, hidden=2, linear.output=F)
# Affiche un graphique du réseau de neurones formé
plot(iris.nn)
# Utilise le modèle entraîné pour prédire les espèces à partir des caractéristiques (colonnes 1 à 4)
# Les prédictions sont stockées dans 'sortie'
predict(iris.nn, iris[,1:4], type="class") -> sortie
# Arrondit les prédictions à l'entier le plus proche (cette étape pourrait ne pas être nécessaire pour les prédictions de type classe)
round(sortie, 0)
# Définit une fonction pour identifier l'indice de la valeur maximale dans un vecteur
func <- function(x) {
return(which(x == max(x)))
}
# Applique la fonction 'func' à chaque ligne de 'sortie' pour obtenir les indices des prédictions maximales
apply(sortie, 1, func) -> indices
# Convertit les indices en facteurs pour correspondre aux classes prévues
factor(indices) -> indices
# Ajuste les niveaux du facteur pour correspondre aux noms des espèces dans le jeu de données original
levels(indices) <- levels(iris$Species)
# Affiche les indices (prédictions des espèces en tant que facteurs)
indices
# Crée une table de contingence pour comparer les prédictions avec les vraies espèces, permettant d'évaluer la performance du modèle
table(indices, iris$Species)