Les arbres de décision de Ross Quinlan : C4.5 date de 1993, C5.0 est sa version plus rapide et plus complète. Ils découpent les données selon le gain d'information et savent livrer le modèle sous forme de règles si / alors. On les utilise quand la décision doit pouvoir être relue et appliquée par le terrain.
Un jeu des 20 questions : à chaque tour, on pose la question qui réduit le plus l'incertitude sur la réponse finale.
L'entropie mesure à quel point partants et fidèles sont mélangés dans un groupe. Un groupe pur a une entropie nulle.
Pour chaque variable et chaque seuil, on calcule la baisse d'entropie obtenue, le gain d'information. C4.5 le divise par l'information du découpage lui-même (ratio de gain) pour ne pas favoriser les variables à nombreuses modalités.
L'arbre complet est ensuite élagué pour retirer les branches peu fiables. Chaque chemin de la racine à une feuille devient une règle, que C5.0 simplifie encore.
Ancienneté, nombre d'appels au support, montant mensuel, type de contrat, incidents des 3 derniers mois. Et la colonne à prédire : le client est-il parti ?
Le modèle produit une poignée de règles du type « contrat mensuel et moins de 4 mois d'ancienneté : risque de départ ». Sur le jeu d'exemple, les clients qui ont appelé le support au moins 6 fois partent à 64 %, contre 22 % en moyenne.
Une règle qui touche 50 clients à 65 % de départs vaut plus pour l'action qu'une exactitude globale. On regarde aussi le rappel : combien de partants les règles attrapent-elles au total ? Il reste souvent faible, et c'est le prix de la simplicité.
Noms donnés pour R (C50). En Python, il n'existe pas d'implémentation de référence de C5.0 : scikit-learn propose un arbre CART avec le critère d'entropie.
Nombre minimum de clients par feuille. Le réglage principal : trop bas, l'arbre apprend le bruit ; entre 20 et 50 sur quelques milliers de lignes, les règles restent solides.
rules = TRUE livre le modèle sous forme de règles indépendantes plutôt que d'arbre. Souvent plus court et plus facile à valider avec le métier.
Nombre de modèles boostés. 1 par défaut ; 10 ou plus améliore la performance mais on perd la lisibilité d'un modèle unique.
Matrice de coûts des erreurs. Rater un partant coûte plus cher que d'appeler un fidèle : la déclarer pousse le modèle à produire plus de règles « départ ».
# Churn clients : C5.0 en R
library(C50)
clients <- read.csv("clients_churn.csv")
clients$churn <- factor(clients$churn, levels = c(0, 1), labels = c("fidele", "parti"))
clients$contrat <- factor(clients$contrat)
set.seed(42)
idx <- sample(nrow(clients), round(0.7 * nrow(clients)))
train <- clients[idx, ]
test <- clients[-idx, ]
# rules = TRUE : le modèle est livré sous forme de règles si / alors
modele <- C5.0(churn ~ anciennete + appels_support + montant + contrat + incidents_3m,
data = train, rules = TRUE, control = C5.0Control(minCases = 30))
print(summary(modele)) # affiche les règles, leur couverture et leur fiabilité
# Matrice de confusion sur les clients jamais vus
pred <- predict(modele, test)
print(table(prevu = pred, reel = test$churn))
print(C5imp(modele, metric = "usage"))
# Churn clients : arbre à gain d'information (esprit C4.5) en Python
import pandas as pd
from sklearn.tree import DecisionTreeClassifier, export_text
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
clients = pd.read_csv("clients_churn.csv")
X = pd.get_dummies(clients[["anciennete", "appels_support", "montant", "contrat", "incidents_3m"]], dtype=float)
y = clients["churn"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# criterion="entropy" : découpage au gain d'information, comme C4.5
# (scikit-learn reste un CART binaire : ni ratio de gain ni élagage pessimiste)
modele = DecisionTreeClassifier(criterion="entropy", max_depth=3, min_samples_leaf=30, random_state=42)
modele.fit(X_train, y_train)
# Les règles si / alors, lisibles par un conseiller
print(export_text(modele, feature_names=list(X.columns)))
# Matrice de confusion sur les clients jamais vus (lignes = réel)
print(confusion_matrix(y_test, modele.predict(X_test)))
C4.5 choisit ses découpages avec le ratio de gain, crée une branche par modalité d'une variable catégorielle et élague avec une estimation pessimiste de l'erreur. CART utilise le plus souvent l'indice de Gini, découpe toujours en deux et élague par validation croisée. Les deux donnent des arbres de qualité comparable.
C'est la baisse d'entropie obtenue en découpant un groupe selon une variable. Plus les sous-groupes sont purs, plus le gain est élevé. C4.5 le corrige par le ratio de gain, car le gain brut favorise les variables qui ont beaucoup de modalités, comme un identifiant.
Pas avec scikit-learn, qui n'implémente que CART. Le critère criterion="entropy" reprend le gain d'information, mais sans ratio de gain, sans découpage multiple ni règles. Pour le vrai C5.0, le package C50 de R reste la référence.
Découpages toujours en deux, critère de Gini par défaut. C'est l'arbre de scikit-learn et de rpart.
Voir la fiche → l'arbre des statisticiensDécoupe selon des tests du khi-deux, en plusieurs branches à la fois. Très utilisé en études marketing.
Voir la fiche → plus précise, moins lisibleDes centaines d'arbres qui votent. Gagne en performance, perd les règles.
Voir la fiche →Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.
Nous utilisons des cookies de mesure d'audience et de suivi publicitaire pour comprendre la fréquentation du site et l'efficacité de nos annonces. Rien n'est déposé sans votre accord. En savoir plus