Plusieurs modèles de natures différentes prédisent chacun une réponse, puis on les fait voter. En vote dur, la majorité l'emporte ; en vote souple, on fait la moyenne des probabilités. C'est la façon la plus simple de combiner des modèles, sans rien apprendre de plus.
Trois correcteurs lisent le même chiffre mal écrit. Ils ne se trompent pas sur les mêmes copies, donc l'avis de la majorité est plus sûr que celui de chacun pris seul.
Par exemple une régression logistique, une SVM et une Random Forest, sur les mêmes données. Plus leurs erreurs sont différentes, plus le vote est utile.
En vote dur, chaque modèle donne une classe. En vote souple, chaque modèle donne une probabilité pour chaque classe.
Vote dur : la classe la plus citée gagne. Vote souple : on fait la moyenne des probabilités et on retient la plus haute. On peut donner plus de poids à un modèle réputé meilleur.
Chaque chiffre d'un formulaire, d'un chèque ou d'un bon de livraison est une petite image de 8 × 8 pixels, soit 64 pixels notés de 0 (blanc) à 16 (noir). Et l'étiquette : le chiffre écrit, de 0 à 9.
Le vote donne le chiffre et, en vote souple, une probabilité moyenne. Les lectures peu sûres partent en vérification humaine, les autres sont saisies automatiquement.
Sur ce découpage, le vote dur (98,9 %) et le vote souple (98,7 %) dépassent chacun des trois modèles, dont le meilleur, la SVM, lit 98,3 %. Ce gain n'est pas garanti : on le vérifie par validation croisée.
Pas d'hyperparamètre propre au vote, mais trois choix de conception. En R, le vote se code en quelques lignes ; en Python, VotingClassifier le fait.
Trois à cinq modèles de familles différentes : linéaire, noyau, arbres, voisins. La diversité compte plus que la performance individuelle de chacun.
Le vote dur compte les classes. Le vote souple moyenne les probabilités et tient compte de la confiance de chaque modèle ; il demande des modèles qui produisent des probabilités, comme une SVM avec probability=True.
Des poids par modèle, égaux par défaut. On peut favoriser le meilleur modèle, mais des poids réglés trop finement sur les mêmes données font perdre la simplicité du vote.
# Lecture de chiffres manuscrits : Voting en R
library(randomForest)
library(e1071)
library(nnet)
chiffres <- read.csv("chiffres_manuscrits.csv")
chiffres$chiffre <- factor(chiffres$chiffre)
set.seed(42)
idx <- sample(nrow(chiffres), round(0.7 * nrow(chiffres)))
train <- chiffres[idx, ]
test <- chiffres[-idx, ]
# Pixels toujours vides retirés : inutiles, et gênants pour la SVM
pixels <- names(train)[1:64][apply(train[, 1:64], 2, var) > 0]
formule <- reformulate(pixels, response = "chiffre")
# Trois modèles qui se trompent différemment
foret <- randomForest(formule, data = train, ntree = 300)
svm_rbf <- svm(formule, data = train, probability = TRUE)
logit <- multinom(formule, data = train, maxit = 300, MaxNWts = 2000, trace = FALSE)
# Vote souple : moyenne des probabilités, colonnes alignées sur les mêmes classes
p_foret <- predict(foret, test, type = "prob")
p_svm <- attr(predict(svm_rbf, test, probability = TRUE), "probabilities")[, colnames(p_foret)]
p_logit <- predict(logit, test, type = "probs")[, colnames(p_foret)]
classes <- colnames(p_foret)
print(sapply(list(foret = p_foret, svm = p_svm, logit = p_logit),
function(p) round(mean(classes[max.col(p)] == test$chiffre), 3)))
vote <- classes[max.col((p_foret + p_svm + p_logit) / 3)]
cat("Vote souple :", round(mean(vote == test$chiffre), 3), "\n")
# Lecture de chiffres manuscrits : Voting en Python
import pandas as pd
from sklearn.ensemble import VotingClassifier, RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
chiffres = pd.read_csv("chiffres_manuscrits.csv")
X = chiffres.drop(columns="chiffre")
y = chiffres["chiffre"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)
# Trois modèles qui se trompent différemment
modeles = [("logit", make_pipeline(StandardScaler(), LogisticRegression(max_iter=2000))),
("svm", make_pipeline(StandardScaler(), SVC(probability=True, random_state=42))),
("foret", RandomForestClassifier(n_estimators=300, random_state=42))]
# Vote souple : moyenne des probabilités des trois modèles
vote = VotingClassifier(estimators=modeles, voting="soft")
vote.fit(X_train, y_train)
# Taux de bonne lecture sur les images jamais vues
for nom, modele in vote.named_estimators_.items():
print(nom, round(modele.score(X_test, y_test), 3))
print("vote souple", round(vote.score(X_test, y_test), 3))
dur = VotingClassifier(estimators=modeles, voting="hard").fit(X_train, y_train)
print("vote dur", round(dur.score(X_test, y_test), 3))
Le vote souple est en général préférable quand les modèles donnent des probabilités bien calibrées, car un modèle très sûr de lui pèse plus qu'un modèle hésitant. Le vote dur est plus robuste si certains modèles donnent des probabilités peu fiables. Le plus sûr est de comparer les deux par validation croisée.
Le voting combine les prédictions avec une règle fixe : majorité ou moyenne. Le stacking entraîne un modèle supplémentaire qui apprend comment combiner les prédictions. Le stacking peut faire mieux, mais demande une validation croisée soignée et davantage de données.
Trois à cinq suffisent en général. Un nombre impair évite les égalités en vote dur à deux classes. Ajouter des modèles semblables à ceux déjà présents n'apporte presque rien : c'est la diversité des erreurs qui fait la force du vote.
Un méta-modèle apprend le poids de chaque modèle. Plus fin, plus coûteux, plus exposé au surapprentissage.
Voir la fiche → le même modèle, dupliquéUn seul type de modèle entraîné sur des tirages différents, puis un vote. Le principe de la Random Forest.
Voir la fiche → un vote d'arbresDes centaines d'arbres qui votent. Souvent un bon candidat parmi les modèles de base d'un vote.
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