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 !

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)