Régression logistique multinomiale en R : classification multiclasse avec nnet

Étendez la régression logistique à trois classes ou plus — ajustez, lisez les log-cotes par rapport à la classe de référence, prédisez les probabilités et évaluez l’exactitude

Un guide pratique de la régression logistique multinomiale en R pour la classification multiclasse : étendez la régression logistique ordinaire à trois classes de résultat ou plus avec nnet::multinom(). Découvrez comment le modèle choisit une classe de référence et rapporte les log-cotes de chaque autre classe par rapport à elle, comment prédire les probabilités de classe et la classe prédite, et comment évaluer l’exactitude sur l’ensemble de test avec une matrice de confusion multiclasse. Traité de deux façons — la voie classique nnet::multinom() et le workflow moderne tidymodels multinom_reg() évalué avec yardstick — et comparé à l’analyse discriminante. Sur les données iris intégrées.

Date de publication

25 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • La régression logistique multinomiale étend la régression logistique ordinaire (binaire) aux résultats comportant trois classes ou plus — en prédisant l’une de plusieurs catégories, et pas seulement oui/non.
  • Elle fonctionne en choisissant une classe de référence et en ajustant un ensemble distinct de coefficients de log-cotes pour chaque autre classe par rapport à cette référence. Avec trois espèces et setosa comme référence, vous obtenez une équation pour versicolor vs setosa et une pour virginica vs setosa.
  • L’outil R standard est nnet::multinom(). Il renvoie des probabilités de classe (une par classe, dont la somme vaut 1) via la fonction softmax ; la classe prédite est simplement celle qui a la probabilité la plus élevée.
  • Jugez-la sur un ensemble de test mis de côté : l’exactitude globale plus une matrice de confusion multiclasse qui montre quelles classes sont confondues — bien plus instructive qu’un simple chiffre d’exactitude.
  • Deux voies, un même modèle : le classique nnet::multinom(Species ~ ., data = train), ou le workflow moderne tidymodels (multinom_reg() |> set_engine("nnet")) évalué avec yardstick.
  • Pour les problèmes multiclasses, l’analyse discriminante est souvent préférée (plus stable lorsque les classes se séparent nettement) ; la régression logistique multinomiale est le choix naturel quand vous voulez lire les log-cotes et que les classes ne satisfont pas l’hypothèse de normalité de l’analyse discriminante.
Obtenez le livre — Machine Learning Essentials (PDF)

Introduction

Vous disposez de mesures sur un lot de fleurs d’iris — longueur du sépale, largeur du sépale, longueur du pétale, largeur du pétale — et vous voulez une règle qui prédit laquelle des trois espèces est chaque fleur. La régression logistique ordinaire est l’outil naturel pour un résultat à deux classes (positif/négatif, résiliation/maintien), mais elle s’arrête là : elle modélise une seule log-cote et ne peut séparer que deux groupes.

La régression logistique multinomiale est l’extension à trois classes ou plus. Au lieu d’une seule équation de log-cotes, elle en ajuste plusieurs — une pour chaque classe mesurée par rapport à une unique classe de référence — et les combine via la fonction softmax en un ensemble de probabilités de classe dont la somme vaut un. La classe prédite est celle qui a la probabilité la plus élevée. C’est la généralisation la plus directe de la régression logistique à un problème multiclasse, et elle conserve la grande vertu de la régression logistique : chaque coefficient est un effet de log-cotes interprétable.

Cette leçon est l’extension multiclasse de la régression logistique. Si votre résultat n’a que deux classes, ou si vous voulez interpréter des odds ratio et des p-value, commencez par la régression logistique dans le pilier Biostatistique. Ici, nous ajustons le modèle multiclasse de deux façons — le classique nnet::multinom() et le moderne workflow tidymodels — lisons les coefficients par rapport à la classe de référence, prédisons les probabilités et la classe, et évaluons l’exactitude avec une matrice de confusion multiclasse. Nous concluons en la comparant à l’analyse discriminante, l’autre outil de travail pour les classes multiples.

NoteQuand y recourir

Recourez à la régression logistique multinomiale lorsque votre résultat comporte trois catégories non ordonnées ou plus (espèce, choix de produit, sous-type de maladie) et que vous voulez un modèle dont vous pouvez lire les coefficients comme des log-cotes par rapport à une classe de référence. Pour deux classes, utilisez la régression logistique simple. Lorsque les classes se séparent nettement et que les prédicteurs sont approximativement normaux au sein de chaque classe, l’analyse discriminante est souvent plus stable — la régression multinomiale est le choix quand vous tenez à l’interprétation en log-cotes ou que ces hypothèses de normalité ne tiennent pas.

Les données

Nous utilisons le jeu de données intégré iris — 150 fleurs, 50 de chacune des trois espèces (setosa, versicolor, virginica), chacune avec quatre mesures : Sepal.Length, Sepal.Width, Petal.Length et Petal.Width. Le résultat Species a trois classes, ce qui en fait l’exemple multiclasse classique.

Nous séparons en un ensemble d’entraînement (80 %, pour l’ajustement) et un ensemble de test (20 %, mis de côté pour juger le modèle honnêtement), stratifié sur Species afin que chaque ensemble conserve l’équilibre de 1/3 par espèce, et fixons une graine pour la reproductibilité :

library(rsample)
data("iris")

# 150 flowers, 3 species (50 each), 4 continuous predictors
set.seed(123)
split      <- initial_split(iris, prop = 0.80, strata = Species)
train_data <- training(split)
test_data  <- testing(split)

c(train = nrow(train_data), test = nrow(test_data))
train  test 
  120    30 
head(iris, 4)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa

Environ 120 fleurs pour apprendre, 30 mises de côté pour faire office de juge — un petit problème à trois classes, propre.

Ajustez-la à la manière classique : nnet::multinom

L’outil R standard est nnet::multinom(). L’interface par formule est exactement celle que vous connaissez de glm() : le résultat à gauche, les prédicteurs à droite. La fonction ajuste le modèle multiclasse et affiche sa progression d’entraînement (mise en silence ici avec trace = FALSE) :

library(nnet)
library(rsample)
data("iris")

set.seed(123)
split      <- initial_split(iris, prop = 0.80, strata = Species)
train_data <- training(split)

# Fit the multinomial model: Species (3 classes) from the four measurements
model <- multinom(Species ~ ., data = train_data, trace = FALSE)
model
Call:
multinom(formula = Species ~ ., data = train_data, trace = FALSE)

Coefficients:
           (Intercept) Sepal.Length Sepal.Width Petal.Length Petal.Width
versicolor    44.88584    -50.14588   -125.0783     191.7161    76.71824
virginica   -132.54466    -62.24794   -142.1385     224.9369   155.84279

Residual Deviance: 3.261719 
AIC: 23.26172 

Lisez la sortie. multinom() choisit la première espèce par ordre alphabétique — setosa — comme classe de référence, puis rapporte une ligne de coefficients par autre classe. Il y a donc deux lignes :

  • versicolor — les log-cotes d’être versicolor plutôt que setosa, à mesure que chaque prédicteur change.
  • virginica — les log-cotes d’être virginica plutôt que setosa.

Chaque ligne n’est qu’une équation de régression logistique : une ordonnée à l’origine plus un coefficient pour chaque mesure. Le modèle a, en effet, ajusté deux régressions logistiques binaires à la fois, toutes deux par rapport à la même référence, et les a liées de sorte que les trois probabilités de classe somment toujours à un.

Interprétez les coefficients (par rapport à la classe de référence)

Chaque coefficient est un effet de log-cotes par rapport à la classe de référence setosa. Le signe et la taille sont ce que vous lisez :

library(nnet)
library(rsample)
data("iris")

set.seed(123)
split      <- initial_split(iris, prop = 0.80, strata = Species)
train_data <- training(split)
model      <- multinom(Species ~ ., data = train_data, trace = FALSE)

# One row per non-reference class; columns are the predictors
round(coef(model), 2)
           (Intercept) Sepal.Length Sepal.Width Petal.Length Petal.Width
versicolor       44.89       -50.15     -125.08       191.72       76.72
virginica      -132.54       -62.25     -142.14       224.94      155.84

Lisez un seul nombre : les grands coefficients Petal.Length positifs dans les deux lignes disent qu’un pétale plus long élève fortement les log-cotes d’être versicolor ou virginica plutôt que setosa — ce qui correspond exactement à la biologie, puisque setosa a de loin les pétales les plus courts. Les coefficients sont grands parce que les espèces se séparent si nettement sur la taille du pétale que le modèle peut être très confiant ; la direction (le signe) est la partie à laquelle se fier et à interpréter, pas l’amplitude brute. Un coefficient compare une classe uniquement à la référence — pour comparer versicolor à virginica directement, il faudrait re-niveler le résultat afin que l’une d’elles soit la référence, réajuster, et lire les nouveaux coefficients.

NoteLes coefficients se lisent toujours par rapport à la référence

Il n’y a pas de coefficient pour la classe de référence (setosa) — c’est la valeur de base à partir de laquelle tout est mesuré. Un coefficient positif pour un prédicteur dans la ligne virginica signifie que des valeurs plus élevées de ce prédicteur rendent virginica plus probable que setosa, les autres étant maintenues fixes. Changez la référence (par ex. relevel(train_data$Species, ref = "virginica")) et chaque coefficient est ré-exprimé par rapport à la nouvelle valeur de base — les prédictions du modèle ne changent pas, seul change le contraste que vous lisez.

Prédisez les probabilités de classe et la classe prédite

Pour chaque fleur, le modèle calcule une probabilité pour chaque classe (leur somme vaut 1, par le softmax), et la classe prédite est celle qui a la probabilité la plus élevée. predict() vous donne au choix :

library(nnet)
library(rsample)
data("iris")

set.seed(123)
split      <- initial_split(iris, prop = 0.80, strata = Species)
train_data <- training(split)
test_data  <- testing(split)
model      <- multinom(Species ~ ., data = train_data, trace = FALSE)

# Predicted class (highest-probability species)
predicted_classes <- predict(model, test_data)
head(predicted_classes)
[1] setosa setosa setosa setosa setosa setosa
Levels: setosa versicolor virginica
# Predicted probabilities — one column per class, each row sums to 1
predicted_probs <- predict(model, test_data, type = "probs")
round(head(predicted_probs, 4), 3)
  setosa versicolor virginica
1      1          0         0
2      1          0         0
3      1          0         0
4      1          0         0

Le tableau des probabilités est la sortie la plus riche : chaque ligne est une fleur de test, chaque colonne une espèce, et les trois nombres d’une ligne s’additionnent à 1. Pour les fleurs setosa montrées, le modèle est quasi certain (probabilité ≈ 1 pour setosa, ≈ 0 pour les autres) — setosa est sans équivoque. Les cas intéressants sont les fleurs versicolor/virginica, où la probabilité est parfois partagée entre les deux ; c’est de là que viendront les erreurs éventuelles. La classe prédite est simplement la colonne avec la plus grande probabilité.

Visualisez les probabilités par espèce

Une image des probabilités prédites rend évidente la confiance du modèle. Nous traçons, pour chaque fleur de test, sa probabilité prédite d’appartenir à sa vraie espèce — colorée par espèce — afin que vous puissiez voir où le modèle est sûr et où il hésite :

library(nnet)
library(rsample)
library(ggplot2)
data("iris")

set.seed(123)
split      <- initial_split(iris, prop = 0.80, strata = Species)
train_data <- training(split)
test_data  <- testing(split)
model      <- multinom(Species ~ ., data = train_data, trace = FALSE)

probs <- predict(model, test_data, type = "probs")

# Probability the model assigned to each flower's TRUE species (base-R row lookup)
true_prob <- probs[cbind(seq_len(nrow(probs)), as.integer(test_data$Species))]
plot_df   <- data.frame(Species = test_data$Species, prob_true = true_prob)

ggplot(plot_df, aes(x = Species, y = prob_true, color = Species)) +
  geom_jitter(width = 0.15, height = 0, size = 2.5, alpha = 0.8) +
  ggsci::scale_color_jco() +
  ylim(0, 1) +
  labs(
    x = "True species",
    y = "Predicted probability of the true species",
    title = "How confident is the model on each test flower?",
    subtitle = "Points near 1 are confident, correct calls; points lower down are the hard cases"
  ) +
  theme_minimal() +
  theme(legend.position = "none")

Strip plot of predicted class probabilities for the iris test flowers under a multinomial logistic regression. Each point is a flower's predicted probability of its true species, coloured by species. The setosa and (mostly) virginica points sit at probability 1, while a few versicolor and virginica points fall lower, marking the flowers in the overlap zone where the model is uncertain.

Lisez-le par colonne. setosa reste à plat à une probabilité de 1 — chaque fleur setosa est classée correctement avec une confiance totale. La plupart des fleurs virginica sont elles aussi proches de 1. Les points plus bas sont les quelques fleurs versicolor/virginica dans la zone de chevauchement des espèces, où le modèle répartit sa probabilité et risque le plus de se tromper. Ce seul graphique vous indique exactement où vivent les erreurs de ce classifieur.

Évaluez-la : exactitude de test et matrice de confusion multiclasse

L’exactitude est la part des fleurs de test étiquetées correctement. Mais pour trois classes, un seul chiffre cache quelles espèces sont confondues — nous lisons donc l’exactitude conjointement à une matrice de confusion :

library(nnet)
library(rsample)
data("iris")

set.seed(123)
split      <- initial_split(iris, prop = 0.80, strata = Species)
train_data <- training(split)
test_data  <- testing(split)
model      <- multinom(Species ~ ., data = train_data, trace = FALSE)

predicted_classes <- predict(model, test_data)

# Overall test-set accuracy
mean(predicted_classes == test_data$Species)
[1] 0.9333333
# Multiclass confusion matrix: rows = predicted, columns = actual
table(predicted = predicted_classes, actual = test_data$Species)
            actual
predicted    setosa versicolor virginica
  setosa         10          0         0
  versicolor      0         10         2
  virginica       0          0         8

Lisez les chiffres. Le modèle classe environ 93 % des fleurs mises de côté correctement. La matrice de confusion montre pourquoi : chaque setosa est classée parfaitement (sa ligne et sa colonne sont propres), et les seules erreurs sont quelques fleurs virginica étiquetées versicolor — exactement la zone de chevauchement que le graphique de probabilités avait signalée. Aucune fleur n’est jamais confondue avec setosa. Une matrice de confusion est la façon honnête de lire un modèle multiclasse : elle transforme « 93 % d’exactitude » en « parfait sur setosa, confond occasionnellement versicolor et virginica ». Pour la boîte à outils complète — précision et rappel par classe, ROC et AUC étendus à plusieurs classes — voyez l’évaluation de modèles de classification.

La manière moderne : tidymodels avec multinom_reg

Le même modèle s’insère proprement dans le workflow tidymodels via parsnip::multinom_reg() avec le moteur nnet. L’avantage : l’évaluation utilise les mêmes métriques yardstick que tous les autres modèles du pilier, de sorte que vous pouvez confronter la régression multinomiale à l’analyse discriminante ou à un arbre via une interface unique et cohérente :

library(rsample)
library(recipes)
library(parsnip)
library(workflows)
library(yardstick)
data("iris")

set.seed(123)
split      <- initial_split(iris, prop = 0.80, strata = Species)
train_data <- training(split)
test_data  <- testing(split)

# A recipe (no preprocessing needed here, but it keeps the workflow uniform)
iris_rec <- recipe(Species ~ ., data = train_data)

# Multinomial logistic regression spec via the nnet engine
mlr_spec <- multinom_reg() |>
  set_engine("nnet") |>
  set_mode("classification")

mlr_wf <- workflow() |>
  add_recipe(iris_rec) |>
  add_model(mlr_spec)

mlr_fit <- fit(mlr_wf, data = train_data)

# Predict on the test set and score accuracy with yardstick
mlr_pred <- predict(mlr_fit, test_data)
mlr_pred <- cbind(mlr_pred, Species = test_data$Species)
accuracy(mlr_pred, truth = Species, estimate = .pred_class)
# A tibble: 1 × 3
  .metric  .estimator .estimate
  <chr>    <chr>          <dbl>
1 accuracy multiclass     0.933

Même modèle, même exactitude d’environ 93 % — mais désormais la métrique est un tableau yardstick ordonné que vous pouvez confronter à d’autres classifieurs, et tout prétraitement (centrage, variables indicatrices, imputation) vivrait dans la recipe et s’appliquerait automatiquement aux nouvelles données. C’est le workflow que réutilise chaque leçon supervisée de ce pilier ; ici, vous avez simplement remplacé par multinom_reg().

La régression logistique binaire modélise une seule log-cote. La régression logistique multinomiale généralise cela à \(K\) classes en fixant une classe comme référence (disons la classe 1) et en modélisant les log-cotes de chaque autre classe \(k\) par rapport à elle comme une fonction linéaire des prédicteurs :

\[ \log \frac{P(y = k \mid x)}{P(y = 1 \mid x)} = \beta_{k0} + \beta_{k1} x_1 + \cdots + \beta_{kp} x_p , \qquad k = 2, \dots, K . \]

Ce sont exactement les lignes de coefficients qu’affiche multinom() — un ensemble de \(\beta_k\) par classe non de référence. En exponentiant et en utilisant la contrainte que les probabilités somment à un, on retrouve chaque probabilité de classe via la fonction softmax :

\[ P(y = k \mid x) = \frac{e^{\eta_k}}{\sum_{j=1}^{K} e^{\eta_j}}, \qquad \eta_k = \beta_{k0} + \beta_{k1} x_1 + \cdots + \beta_{kp} x_p , \]

avec la classe de référence fixée à \(\eta_1 = 0\). Le dénominateur est la somme sur toutes les classes, ce qui force les \(K\) probabilités à s’additionner à 1. La classe prédite est celle qui a le plus grand \(P(y = k \mid x)\). Parce que le score \(\eta_k\) de chaque classe est linéaire en \(x\), les frontières de décision entre classes sont des droites — l’analogue multiclasse de la frontière linéaire de la régression logistique. multinom() ajuste tous les \(\beta_k\) conjointement par maximum de vraisemblance (elle exécute en interne un petit réseau de neurones à une couche, ce qui explique sa présence dans le paquet nnet).

Régression multinomiale vs analyse discriminante

Pour un problème multiclasse, vous disposez maintenant de deux outils naturels, et il est utile de savoir quand recourir à chacun :

  • La régression logistique multinomiale ne fait aucune hypothèse sur la distribution des prédicteurs — elle modélise directement les log-cotes de classe. Ses coefficients sont interprétables comme des log-cotes par rapport à une référence, et elle est robuste lorsque les prédicteurs sont non normaux ou comprennent des variables catégorielles.
  • L’analyse discriminante (LDA/QDA) suppose que les prédicteurs sont approximativement normaux au sein de chaque classe. Lorsque c’est le cas et que les classes se séparent nettement, elle est souvent plus stable — surtout sur les petits jeux de données — et fournit le graphique de projection LD1–LD2 caractéristique. Sur iris, les deux atteignent une exactitude d’environ 93–97 %.

Il existe aussi la stratégie un-contre-tous (alias un-contre-le-reste) : ajuster \(K\) régressions logistiques binaires distinctes, chacune « cette classe contre toutes les autres », puis affecter la classe dont le modèle est le plus confiant. La régression logistique multinomiale est l’alternative la plus rigoureuse — elle ajuste toutes les classes conjointement de sorte que les probabilités sont garanties de sommer à un, plutôt que d’assembler \(K\) modèles binaires indépendants dont les probabilités doivent être remises à l’échelle. Recourez à l’un-contre-tous principalement lorsque vous devez réutiliser un classifieur binaire existant ; pour un modèle multiclasse natif, multinom() est l’outil le plus propre.

NoteQuel classifieur multiclasse dois-je utiliser ?
  • Régression logistique multinomiale — quand vous voulez des coefficients de log-cotes interprétables, ou que les prédicteurs ne sont pas distribués normalement (par ex. des prédicteurs catégoriels). La généralisation directe de la régression logistique.
  • Analyse discriminante (LDA/QDA) — quand les prédicteurs sont approximativement normaux au sein de chaque classe et que les classes se séparent nettement ; souvent plus stable sur de petites données, et fournit le graphique de projection discriminante.
  • Un-contre-tous — uniquement quand vous devez réutiliser un classifieur binaire existant sur de nombreuses classes ; sinon un modèle multiclasse natif est plus propre.
🟢 Avec un agent IA

Un résultat multiclasse à prédire ? Demandez à Prova « ajuste une régression logistique multinomiale à ces données, montre-moi les coefficients par rapport à la classe de référence, et donne-moi l’exactitude sur l’ensemble de test avec une matrice de confusion » — elle répond avec du code nnet + tidymodels que vous pouvez exécuter sur vos propres données, puis vous aide à lire les log-cotes, les probabilités prédites, et quelles classes sont confondues. The runtime is the judge. Demander à Prova →

Problèmes courants

  • Les coefficients paraissent énormes. Lorsque les classes se séparent presque parfaitement (comme setosa sur iris), multinom() peut pousser les coefficients vers de grandes valeurs — le modèle est juste très confiant. Lisez le signe (direction de l’effet), pas l’amplitude brute, et fiez-vous aux probabilités prédites et à l’exactitude plutôt qu’aux coefficients individuels.
  • Vous vous attendiez à un coefficient pour chaque classe. Il n’y a pas de ligne pour la classe de référence — chaque coefficient est un contraste par rapport à elle. Avec trois classes, vous obtenez deux lignes. Pour changer la classe qui sert de valeur de base, appliquez relevel() au résultat avant l’ajustement.
  • predict() renvoie la mauvaise chose. predict(model, newdata) donne la classe prédite par défaut ; ajoutez type = "probs" pour obtenir la matrice de probabilités par classe. Ne confondez pas les deux quand vous calculez l’exactitude.
  • L’exactitude est élevée mais une classe est toujours manquée. Un seul chiffre d’exactitude cache les défaillances par classe. Affichez toujours la matrice de confusion (table(predicted, actual)) pour voir quelles classes sont confondues — sur des données déséquilibrées, lisez la précision/le rappel par classe dans l’évaluation de modèles de classification.
  • multinom() n’a pas convergé. Elle affiche la progression des itérations (mettez-la en silence avec trace = FALSE). Si elle atteint le plafond d’itérations, relevez-le avec maxit = 200, et mettez à l’échelle les prédicteurs s’ils sont sur des plages très différentes afin que l’optimiseur se comporte bien.

Questions fréquentes

Utilisez nnet::multinom() : model <- multinom(y ~ ., data = train), où y est un résultat de type facteur avec trois classes ou plus. Ensuite predict(model, test) donne la classe prédite et predict(model, test, type = "probs") les probabilités par classe. Dans tidymodels, utilisez multinom_reg() |> set_engine("nnet") à l’intérieur d’un workflow, ajustez avec fit(), et évaluez avec yardstick::accuracy(). Elle étend la régression logistique de deux classes à plusieurs.

La régression logistique multinomiale (nnet::multinom()) est l’un des outils standard pour un résultat catégoriel avec trois classes ou plus. Parmi les alternatives figurent l’analyse discriminante (MASS::lda()/qda()), le naive Bayes, les arbres de décision et les forêts aléatoires — qui tous gèrent nativement les classes multiples. Évaluez-les avec une matrice de confusion multiclasse et la précision/le rappel par classe, pas seulement l’exactitude globale.

multinom() dans le paquet nnet ajuste un modèle log-linéaire multinomial — la régression logistique multinomiale — en entraînant un réseau de neurones à une couche cachée sans unités cachées, ce qui est mathématiquement la même chose. Elle choisit le premier niveau du facteur comme classe de référence et rapporte les log-cotes de chaque autre classe par rapport à elle. Utilisez predict() pour la classe prédite et predict(..., type = "probs") pour les probabilités de classe.

Chaque coefficient est un effet de log-cotes pour une classe par rapport à la classe de référence. Il y a un ensemble de coefficients par classe non de référence. Un coefficient positif signifie que des valeurs plus élevées de ce prédicteur rendent cette classe plus probable que la référence, les autres étant maintenues fixes. Exponentiez-le (exp(coef)) pour le lire comme un odds ratio. Pour comparer directement deux classes non de référence, re-nivelez le résultat afin que l’une d’elles soit la référence et réajustez.

Utilisez la régression logistique multinomiale quand vous voulez des coefficients de log-cotes interprétables, ou quand les prédicteurs ne sont pas distribués normalement au sein de chaque classe (par ex. des prédicteurs catégoriels) — elle ne fait aucune hypothèse distributionnelle. Utilisez l’analyse discriminante quand les prédicteurs sont approximativement normaux au sein de chaque classe et que les classes se séparent nettement : elle est souvent plus stable, surtout sur de petits jeux de données, et fournit le graphique de projection discriminante.

Testez vos connaissances

À l’aide des données iris, ajustez multinom(Species ~ ., data = train_data) comme dans la leçon, mais d’abord re-nivelez Species de sorte que virginica soit la classe de référence. Réajustez, affichez les coefficients, et confirmez que les classes prédites et l’exactitude sont inchangées par rapport à la leçon — seul le contraste que vous lisez a changé. Quels deux contrastes les lignes de coefficients décrivent-elles désormais ?

Re-nivelez avec train_data$Species <- relevel(train_data$Species, ref = "virginica") avant l’ajustement (faites de même pour test_data afin que les niveaux du facteur s’alignent). Ensuite coef() montre les lignes des deux classes non de référence — désormais setosa et versicolor, chacune mesurée par rapport à virginica. L’exactitude (mean(predict(model, test_data) == test_data$Species)) est identique parce que le modèle est le même ; seule la valeur de base à laquelle vous comparez a bougé.

library(nnet)
library(rsample)
data("iris")

set.seed(123)
split      <- initial_split(iris, prop = 0.80, strata = Species)
train_data <- training(split)
test_data  <- testing(split)

# Make virginica the reference class
train_data$Species <- relevel(train_data$Species, ref = "virginica")
test_data$Species  <- relevel(test_data$Species,  ref = "virginica")

model <- multinom(Species ~ ., data = train_data, trace = FALSE)
round(coef(model), 2)                       # now rows = setosa, versicolor (vs virginica)
mean(predict(model, test_data) == test_data$Species)   # still ~0.93

Les lignes de coefficients décrivent désormais setosa vs virginica et versicolor vs virginica — le même modèle exprimé par rapport à une nouvelle valeur de base. Les classes prédites et l’exactitude d’environ 93 % sont inchangées, car le re-nivellement ne change que le contraste que vous lisez, pas ce que le modèle prédit.

Vérification rapide. Une régression logistique multinomiale sur un résultat à 4 classes affiche trois lignes de coefficients, pas quatre. Pourquoi — et quelle classe n’a pas de ligne ?

La régression logistique multinomiale modélise chaque classe par rapport à une unique classe de référence, de sorte que la classe de référence n’a pas de ligne de coefficient — c’est la valeur de base à partir de laquelle tout le reste est mesuré. Avec quatre classes, vous obtenez \(4 - 1 = 3\) lignes (une équation de log-cotes par classe non de référence). La classe sans ligne est la référence — par défaut le premier niveau du facteur. Sa probabilité est retrouvée à partir des autres via la contrainte que les quatre probabilités de classe somment à un.

Conclusion

Vous avez exécuté la régression logistique multinomiale de bout en bout sur les données iris : elle étend la régression logistique à trois classes ou plus en ajustant un ensemble de coefficients de log-cotes par classe par rapport à une classe de référence (setosa ici), et en les combinant via le softmax en probabilités de classe dont la somme vaut un. Vous l’avez ajustée à la fois de la manière classique (nnet::multinom()) et de la manière moderne tidymodels (multinom_reg() |> set_engine("nnet") évaluée avec yardstick), lu les coefficients par rapport à la classe de référence comme des log-cotes, prédit les probabilités de classe et la classe prédite, et jugé le modèle avec l’exactitude de test et une matrice de confusion multiclasse — environ 93 %, les seules erreurs se situant dans le chevauchement versicolor/virginica. La règle pratique : lisez les coefficients par rapport à la référence, prédisez des probabilités et pas seulement des classes, et regardez toujours la matrice de confusion, pas uniquement l’exactitude.

Ensuite, apprenez à lire quelles classes sont confondues et à pondérer la précision par classe par rapport au rappel dans l’évaluation de modèles de classification, ou rencontrez l’autre outil de travail multiclasse dans l’analyse discriminante.

Leçons connexes

Vous préférez un livre ? Machine Learning Essentials est disponible en PDF téléchargeable — toutes les leçons de cette série, hors ligne et à vous.

Obtenir le livre (PDF) →Les leçons restent gratuites en ligne.
Cette page vous a-t-elle été utile ?

Prouvez que vous savez le faire. Maîtrisez toute la série Classification en R — suivez votre parcours, construisez des projets et obtenez un certificat.

Commencer gratuitement →

Passez à Pro — Prova illimité sur vos propres données et un certificat vérifiable qui atteste la compétence.

dès 15 $/mois facturé annuellement

Passer à Pro →

✓ Vous êtes Pro — continuez. The runtime is the judge.

Recevez les nouvelles leçons R & Python par e-mail

Pratique, reproductible, sans spam. Désinscription à tout moment.

Double opt-in. Nous ne partageons jamais votre e-mail.

Partager cette pageXLinkedInRedditHN
Note

Cette leçon est reproductible : chaque coefficient, probabilité, métrique et figure a été produit par le code montré — copiez n’importe quel bloc et exécutez-le pour les reproduire. The runtime is the judge.

Références

  • James, G., Witten, D., Hastie, T., & Tibshirani, R. (2014). An Introduction to Statistical Learning, with Applications in R. Springer. (Chapitre 4 — Classification.)
  • Venables, W. N., & Ripley, B. D. (2002). Modern Applied Statistics with S (4e éd.). Springer. (Le paquet nnetmultinom().)
  • Kuhn, M., & Silge, J. Tidy Modeling with R. En ligne, gratuit (CC BY-NC-SA). (L’interface tidymodels / parsnip::multinom_reg().)

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {Régression logistique multinomiale en R : classification
    multiclasse avec nnet},
  date = {2026-06-25},
  url = {https://www.datanovia.com/learn/machine-learning/classification/multinomial-logistic-regression},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Régression logistique multinomiale en R : classification multiclasse avec nnet.” 2026. June 25. https://www.datanovia.com/learn/machine-learning/classification/multinomial-logistic-regression.