Bootstrap en R : intervalles de confiance et validation

Rééchantillonner avec remise pour quantifier l’incertitude et valider un modèle — avec rsample et yardstick

Un guide pratique du bootstrap en R. Utilisez le rééchantillonnage avec remise pour estimer l’erreur standard et un intervalle de confiance par percentiles pour n’importe quelle statistique (ici, des coefficients de régression) avec rsample::bootstraps(), visualisez la distribution bootstrap, et injectez les rééchantillons bootstrap dans fit_resamples() pour valider un modèle prédictif — et apprenez quand préférer le bootstrap à la validation croisée k-fold.

Date de publication

25 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • Le bootstrap répond à la question « quelle est l’incertitude de cette estimation ? » en rééchantillonnant vos données avec remise un grand nombre de fois, en recalculant la statistique sur chaque rééchantillon, et en lisant la dispersion obtenue.
  • Cette dispersion est l’erreur standard ; les percentiles 2,5 et 97,5 des estimations bootstrap donnent un intervalle de confiance par percentiles à 95 %sans formule ni hypothèse de distribution.
  • En R, rsample::bootstraps() construit les rééchantillons ; appliquez votre estimateur sur chacun, puis int_pctl() renvoie l’IC par percentiles. La fonction boot::boot() de R de base fait classiquement le même travail.
  • Le bootstrap a un second usage — comme méthode de rééchantillonnage pour la validation de modèles : passez bootstraps() directement à tune::fit_resamples() pour obtenir une estimation de performance à faible variance.
  • Chaque rééchantillon laisse de côté ~37 % des lignes (l’échantillon out-of-bag) qui devient le pli de test mis de côté — c’est ce qui rend l’estimation du modèle honnête.
  • Bootstrap vs validation croisée : le bootstrap donne des estimations d’erreur à faible variance mais légèrement pessimistes ; la validation croisée k-fold est quasiment sans biais avec un peu plus de variance. Les deux sont traitées dans validation croisée.
Obtenez le livre — Machine Learning Essentials (PDF)

Introduction

Vous ajustez un modèle linéaire et R vous renvoie un coefficient : Agriculture = -0.17. Mais à quel point êtes-vous sûr de ce nombre ? Si vous aviez collecté un échantillon légèrement différent de la même population, serait-il de nouveau −0.17, ou −0.25, ou −0.05 ? La statistique classique répond avec une formule pour l’erreur standard — mais cette formule s’appuie sur des hypothèses (erreurs normales, à variance constante) que les données réelles enfreignent souvent.

Le bootstrap contourne tout cela. L’idée est presque insolente de simplicité : traitez votre échantillon comme s’il était la population, tirez de nouveaux échantillons à partir de lui (avec remise), et observez de combien votre estimation fluctue. Cette fluctuation, c’est votre incertitude — mesurée directement à partir des données, sans aucune formule.

Le bootstrap a deux visages, et cette leçon enseigne les deux :

  1. Quantifier l’incertitude de n’importe quelle statistique — ici, l’erreur standard et l’intervalle de confiance d’un coefficient de régression. C’est l’usage original et le plus emblématique.
  2. Valider un modèle prédictif — en utilisant les rééchantillons bootstrap comme plis d’entraînement/test dans un workflow de rééchantillonnage, le même rôle que joue la validation croisée k-fold.

Si vous avez déjà rencontré la validation croisée, le second usage vous semblera familier ; le premier est ce qui rend le bootstrap unique en son genre. Nous nous appuyons sur le workflow tidymodels, donc une connaissance superficielle de rsample aide mais n’est pas indispensable.

Les données

Nous utiliserons le jeu de données intégré swiss : 47 provinces francophones de Suisse (vers 1888), avec une mesure standardisée de fertilité (Fertility) et cinq indicateurs socio-économiques. Nous modéliserons Fertility à partir des autres — le même cadre que celui utilisé pour enseigner les métriques de précision de régression — et nous demanderons quelle confiance accorder aux coefficients ajustés.

data("swiss")

# 47 provinces, fertility + 5 socio-economic predictors
head(swiss, 4)
             Fertility Agriculture Examination Education Catholic
Courtelary        80.2        17.0          15        12     9.96
Delemont          83.1        45.1           6         9    84.84
Franches-Mnt      92.5        39.7           5         5    93.40
Moutier           85.8        36.5          12         7    33.77
             Infant.Mortality
Courtelary               22.2
Delemont                 22.2
Franches-Mnt             20.2
Moutier                  20.3
# The model whose coefficients we want to put uncertainty around
fit <- lm(Fertility ~ ., data = swiss)
round(coef(fit), 3)
     (Intercept)      Agriculture      Examination        Education 
          66.915           -0.172           -0.258           -0.871 
        Catholic Infant.Mortality 
           0.104            1.077 

Chaque coefficient est une seule meilleure estimation. La question pour le reste de cette leçon : de combien ces nombres bougeraient-ils si nous avions tiré un échantillon différent ?

Comment fonctionne le bootstrap

Un échantillon bootstrap est un nouveau jeu de données de la même taille que l’original, tiré avec remise. « Avec remise » est toute l’astuce : après avoir choisi une ligne, vous la remettez, de sorte que la même province peut apparaître deux ou trois fois dans un même échantillon bootstrap — et d’autres n’apparaîtront pas du tout.

data("swiss")
n <- nrow(swiss)               # 47 provinces

set.seed(123)
idx <- sample(seq_len(n), size = n, replace = TRUE)   # one bootstrap sample of row indices
length(unique(idx))            # how many DISTINCT rows landed in this resample
[1] 29

Sur 47 lignes, seulement une trentaine de lignes distinctes apparaissent — le reste étant des doublons. Les provinces qui n’ont pas été retenues (ici ~17 d’entre elles, soit environ 37 %) forment l’échantillon out-of-bag. Nous y reviendrons : c’est exactement le jeu de test mis de côté lorsque le bootstrap est utilisé pour la validation de modèle.

NotePourquoi ~37 % sont laissés de côté

Chaque ligne a une probabilité \((1 - 1/n)^n\) d’être manquée lors d’un seul tirage bootstrap. À mesure que \(n\) croît, cela converge vers \(e^{-1} \approx 0.368\) — donc en moyenne environ 63 % des lignes apparaissent dans chaque échantillon bootstrap et ~37 % sont out-of-bag, quelle que soit la taille du jeu de données.

La procédure bootstrap n’est ensuite qu’une répétition :

  1. Tirer un échantillon bootstrap (taille \(n\), avec remise).
  2. Recalculer votre statistique dessus (ici, les coefficients de régression).
  3. Répéter des centaines ou des milliers de fois.
  4. La collection des statistiques recalculées est la distribution bootstrap — sa dispersion est l’ erreur standard, ses percentiles forment un intervalle de confiance.

Visage 1 — Quantifier l’incertitude d’un coefficient

Construire les rééchantillons avec rsample

rsample::bootstraps() crée les rééchantillons pour vous — chacun est un split qui connaît ses lignes en échantillon (analyse) et ses lignes out-of-bag (évaluation). Nous ajoutons apparent = TRUE, qui ajoute l’échantillon complet d’origine comme un rééchantillon supplémentaire ; la fonction d’intervalle de tidymodels l’utilise pour corriger le biais.

library(rsample)
data("swiss")

set.seed(123)
boot_samples <- bootstraps(swiss, times = 1000, apparent = TRUE)
boot_samples
# Bootstrap sampling with apparent sample 
# A tibble: 1,001 × 2
   splits          id           
   <list>          <chr>        
 1 <split [47/18]> Bootstrap0001
 2 <split [47/15]> Bootstrap0002
 3 <split [47/15]> Bootstrap0003
 4 <split [47/13]> Bootstrap0004
 5 <split [47/20]> Bootstrap0005
 6 <split [47/20]> Bootstrap0006
 7 <split [47/17]> Bootstrap0007
 8 <split [47/17]> Bootstrap0008
 9 <split [47/16]> Bootstrap0009
10 <split [47/15]> Bootstrap0010
# ℹ 991 more rows

Nous avons 1000 rééchantillons bootstrap (plus l’apparent). Chaque <split [47/k]> indique que le jeu d’analyse compte 47 lignes et que le jeu d’évaluation compte k lignes out-of-bag — et k varie, exactement comme attendu.

Recalculer les coefficients sur chaque rééchantillon

Appliquez maintenant un petit estimateur sur chaque rééchantillon. Pour chaque split, nous extrayons son jeu d’analyse avec analysis(), ajustons le modèle linéaire, et mettons les coefficients au propre avec broom::tidy(). Stocker les résultats mis au propre dans une colonne-liste est l’idiome tidymodels pour une distribution bootstrap :

library(rsample)
library(broom)
data("swiss")
set.seed(123)
boot_samples <- bootstraps(swiss, times = 1000, apparent = TRUE)

# Fit the model on ONE resample and return tidy coefficients
coef_fun <- function(split) {
  tidy(lm(Fertility ~ ., data = analysis(split)))
}

# Apply to every resample; keep the results in a list-column called `coefs`
boot_samples$coefs <- lapply(boot_samples$splits, coef_fun)
boot_samples$coefs[[1]]
# A tibble: 6 × 5
  term             estimate std.error statistic  p.value
  <chr>               <dbl>     <dbl>     <dbl>    <dbl>
1 (Intercept)       65.4       7.63        8.57 1.12e-10
2 Agriculture       -0.260     0.0681     -3.82 4.47e- 4
3 Examination       -0.401     0.208      -1.93 6.11e- 2
4 Education         -0.765     0.187      -4.10 1.91e- 4
5 Catholic           0.0996    0.0235      4.23 1.27e- 4
6 Infant.Mortality   1.56      0.301       5.18 6.23e- 6

Voilà la table des coefficients ajustés à partir du premier échantillon bootstrap. Il y en a 1000 — la matière première de la distribution bootstrap.

Erreur standard + intervalle de confiance par percentiles

rsample::int_pctl() lit la colonne-liste et renvoie, par terme, l’intervalle de confiance par percentiles du bootstrap — les percentiles 2,5 et 97,5 des 1000 estimations :

library(rsample)
library(broom)
data("swiss")
set.seed(123)
boot_samples <- bootstraps(swiss, times = 1000, apparent = TRUE)
coef_fun <- function(split) tidy(lm(Fertility ~ ., data = analysis(split)))
boot_samples$coefs <- lapply(boot_samples$splits, coef_fun)

ci <- int_pctl(boot_samples, coefs)
as.data.frame(ci)
              term      .lower  .estimate      .upper .alpha    .method
1      (Intercept) 46.85480912 67.4726537 89.67546521   0.05 percentile
2      Agriculture -0.30164048 -0.1787018 -0.04344294   0.05 percentile
3         Catholic  0.04158935  0.1026314  0.16287400   0.05 percentile
4        Education -1.27377683 -0.8698448 -0.39526380   0.05 percentile
5      Examination -0.80388653 -0.2916174  0.22469675   0.05 percentile
6 Infant.Mortality  0.29409422  1.0967625  1.98456451   0.05 percentile

Lisez ceci en langage clair. Prenez la ligne Agriculture : l’estimation bootstrap est d’environ −0.18, et l’intervalle par percentiles à 95 % s’étend grossièrement de [−0.30, −0.04]. Donc :

« En rééchantillonnant les données 1000 fois, l’effet d’Agriculture sur la fertilité s’est situé entre environ −0.30 et −0.04 dans 95 % des rééchantillons — systématiquement négatif. Nous sommes confiants que la relation est négative, même si son ampleur exacte reste incertaine. »

Comme l’intervalle exclut 0, ce coefficient est « significatif » au sens du bootstrap — pas de t-test, pas d’hypothèse de normalité, juste les données rééchantillonnées. Notez que l’intervalle d’Examination chevauche 0, donc son effet est de signe incertain — la même conclusion à laquelle parviendrait une p-value classique.

Visualiser la distribution bootstrap

L’intervalle est un résumé ; la distribution bootstrap est l’image complète. Voici les 1000 estimations d’Agriculture, avec l’estimation d’origine et l’intervalle par percentiles marqués :

library(rsample)
library(broom)
library(ggplot2)
data("swiss")
set.seed(123)
boot_samples <- bootstraps(swiss, times = 1000, apparent = TRUE)
coef_fun <- function(split) tidy(lm(Fertility ~ ., data = analysis(split)))
boot_samples$coefs <- lapply(boot_samples$splits, coef_fun)

# Pull the 1000 Agriculture estimates out of the list-column
agri <- do.call(rbind, boot_samples$coefs)
agri <- agri[agri$term == "Agriculture", ]

ci <- int_pctl(boot_samples, coefs)
agri_ci <- ci[ci$term == "Agriculture", ]

ggplot(agri, aes(x = estimate)) +
  geom_histogram(bins = 40, fill = "#3a86d4", color = "white", alpha = 0.9) +
  geom_vline(xintercept = agri_ci$.estimate, linewidth = 1, color = "gray20") +
  geom_vline(xintercept = c(agri_ci$.lower, agri_ci$.upper),
             linetype = "dashed", color = "gray40") +
  labs(
    x = "Bootstrap estimate of the Agriculture coefficient",
    y = "Count (of 1000 resamples)"
  ) +
  theme_minimal()

Histogram of 1000 bootstrap estimates of the Agriculture coefficient, roughly bell-shaped and centred near minus 0.18, with a solid vertical line at the original estimate and dashed lines at the 95 percent percentile confidence interval bounds.

La distribution est à peu près en forme de cloche et centrée près de l’estimation d’origine (ligne pleine) ; les lignes en pointillés sont les bornes de l’IC par percentiles. Voilà à quoi ressemble « l’erreur standard d’un coefficient » — la largeur de ce nuage, calculée directement à partir de vos données plutôt que supposée.

La voie classique : boot::boot()

Le package boot de R de base est la manière éprouvée de faire la même chose. Vous écrivez une fonction de (data, index) renvoyant la statistique, et boot() gère le rééchantillonnage :

library(boot)
data("swiss")

# Return the coefficients for a given set of row indices
model_coef <- function(data, index) {
  coef(lm(Fertility ~ ., data = data, subset = index))
}

set.seed(123)
boot_out <- boot(swiss, model_coef, R = 1000)
boot_out

ORDINARY NONPARAMETRIC BOOTSTRAP


Call:
boot(data = swiss, statistic = model_coef, R = 1000)


Bootstrap Statistics :
      original        bias    std. error
t1* 66.9151817  0.2851133041 10.56779480
t2* -0.1721140 -0.0052723381  0.06525838
t3* -0.2580082 -0.0249958235  0.25848743
t4* -0.8709401  0.0034267750  0.22370831
t5*  0.1041153 -0.0008429536  0.03303239
t6*  1.0770481  0.0215939661  0.43040004

La colonne std. error est l’erreur standard bootstrap de chaque coefficient (t1 = ordonnée à l’origine, t2 = Agriculture, et ainsi de suite). Un intervalle à 95 % rapide par approximation normale est estimate ± 2 × SE :

library(boot)
data("swiss")
model_coef <- function(data, index) coef(lm(Fertility ~ ., data = data, subset = index))
set.seed(123)
boot_out <- boot(swiss, model_coef, R = 1000)

# Agriculture is the 2nd coefficient (index 2)
est <- boot_out$t0[2]
se  <- sd(boot_out$t[, 2])
c(estimate = est, lower = est - 2 * se, upper = est + 2 * se)
estimate.Agriculture    lower.Agriculture    upper.Agriculture 
         -0.17211397          -0.30263073          -0.04159721 

Cela tombe dans le même voisinage que l’intervalle par percentiles de rsample ci-dessus. La méthode par percentiles (int_pctl) est généralement préférée car elle ne suppose pas que la distribution bootstrap est symétrique ; l’approximation normale est une vérification rapide de cohérence.

NoteErreur standard bootstrap vs l’erreur standard de lm()

summary(lm(...))$coef rapporte aussi des erreurs standard — mais celles-ci proviennent d’une formule qui suppose que la structure d’erreur du modèle linéaire est valide. L’erreur standard bootstrap ne fait aucune telle hypothèse : elle mesure la variabilité empiriquement. Quand les hypothèses du modèle sont fragiles, le bootstrap est l’estimation la plus fiable ; quand elles tiennent, les deux concordent étroitement.

Visage 2 — Le bootstrap comme rééchantillonnage de validation de modèle

Le second usage transforme le bootstrap en une méthode de rééchantillonnage pour estimer la performance d’un modèle — le même travail que fait la validation croisée. Le mécanisme est l’échantillon out-of-bag : ajuster sur chaque échantillon bootstrap, évaluer sur ses ~37 % laissés de côté, répéter, faire la moyenne.

Comme bootstraps() produit un objet de rééchantillonnage rsample, il s’insère directement dans tune::fit_resamples()exactement là où vous passeriez sinon vfold_cv() :

library(tidymodels)
data("swiss")

# A plain linear model in a workflow
lm_spec <- linear_reg() |> set_engine("lm")
swiss_wf <- workflow() |>
  add_formula(Fertility ~ .) |>
  add_model(lm_spec)

# 100 bootstrap resamples as the train/test folds
set.seed(123)
boot_folds <- bootstraps(swiss, times = 100)

boot_res <- fit_resamples(
  swiss_wf,
  resamples = boot_folds,
  metrics = metric_set(rmse, rsq, mae)
)
collect_metrics(boot_res)
# A tibble: 3 × 6
  .metric .estimator  mean     n std_err .config        
  <chr>   <chr>      <dbl> <int>   <dbl> <chr>          
1 mae     standard   6.51    100  0.105  pre0_mod0_post0
2 rmse    standard   8.10    100  0.124  pre0_mod0_post0
3 rsq     standard   0.624   100  0.0132 pre0_mod0_post0

fit_resamples() a ajusté le modèle sur chacun des 100 échantillons bootstrap et l’a évalué sur les lignes out-of-bag correspondantes. collect_metrics() fait la moyenne sur les 100 :

  • mean — l’estimation bootstrap de chaque métrique (RMSE en unités de fertilité, R² comme part de variance, MAE l’erreur absolue moyenne). Voir métriques de précision pour savoir comment lire chacune.
  • std_err — de combien la métrique a varié d’un rééchantillon à l’autre. Une marque de fabrique du bootstrap est que cela est petit — les estimations de performance bootstrap ont une variance notablement faible.

Cette faible variance est la force du bootstrap comme méthode de validation ; sa faiblesse est un léger biais pessimiste (il tend à sous-estimer la précision réelle, car chaque modèle s’entraîne sur seulement ~63 % de lignes distinctes). Pour choisir entre des modèles, le biais s’annule en grande partie ; pour rapporter la précision d’un modèle, l’estimation quasiment sans biais de la validation croisée k-fold est généralement préférée.

Bootstrap vs validation croisée — laquelle, quand ?

Les deux rééchantillonnent les données pour estimer l’incertitude ; leurs compromis diffèrent :

Bootstrap validation croisée k-fold
Comment il rééchantillonne échantillons de taille \(n\) avec remise \(k\) plis disjoints, sans remise
Pli de test les ~37 % out-of-bag le pli mis de côté (~1/\(k\))
Variance de l’estimation faible modérée
Biais légèrement pessimiste quasiment sans biais
Meilleur pour l’incertitude d’une statistique (SE/IC) ; comparaison stable de modèles une estimation de performance honnête à rapporter

Règle empirique : optez pour le bootstrap quand vous voulez l’erreur standard ou l’intervalle de confiance d’une estimation (un coefficient, une métrique, n’importe quoi) — c’est son don unique. Optez pour la validation croisée k-fold quand vous voulez une estimation honnête et quasiment sans biais de la façon dont un modèle se comportera sur de nouvelles données. Elles sont complémentaires, pas rivales.

La logique est le principe de substitution (plug-in). Vous voulez une propriété d’un estimateur \(\hat\theta\) (disons son erreur standard) sous la vraie distribution génératrice des données \(F\) — mais vous ne connaissez pas \(F\). Le bootstrap remplace \(F\) par la distribution empirique \(\hat F\) (votre échantillon, chaque ligne de poids \(1/n\)) et échantillonne à partir de celle-ci. Un tirage de taille \(n\) depuis \(\hat F\) avec remise est exactement un échantillon bootstrap.

Recalculer \(\hat\theta\) sur \(B\) échantillons bootstrap donne \(\hat\theta^{*}_1, \dots, \hat\theta^{*}_B\) (le \(*\) marque une réplique bootstrap). Leur écart-type estime l’erreur standard de \(\hat\theta\) :

\[ \widehat{SE}^{*}(\hat\theta) = \sqrt{\frac{1}{B-1}\sum_{b=1}^{B}\bigl(\hat\theta^{*}_b - \bar{\theta}^{*}\bigr)^2}, \qquad \bar{\theta}^{*} = \frac{1}{B}\sum_{b=1}^{B}\hat\theta^{*}_b . \]

L’intervalle par percentiles prend simplement les quantiles empiriques 2,5 et 97,5 des \(\hat\theta^{*}_b\). Pourquoi avec remise, et pourquoi la taille \(n\) ? Pour que chaque échantillon bootstrap imite le tirage d’un échantillon frais de la même taille depuis la population — la variabilité entre échantillons bootstrap reflète alors la variabilité que vous observeriez entre échantillons réels. Quand \(B \to \infty\), l’erreur de Monte-Carlo s’évanouit ; \(B = 1000\)\(2000\) suffit amplement pour un intervalle stable.

🟢 Avec un agent IA

Bloqué sur vos propres données ? Demandez à Prova « construire un intervalle de confiance bootstrap pour cette estimation en R » — elle répond avec du code rsample que vous pouvez exécuter sur votre jeu de données, puis vous aide à lire l’intervalle et à décider si l’effet est réel. The runtime is the judge. Demander à Prova →

Problèmes courants

  • Vous avez oublié set.seed() et l’intervalle bouge à chaque exécution. Le bootstrap est aléatoire — sans graine vous obtenez des rééchantillons (et des bornes d’IC) légèrement différents à chaque fois. Fixez une graine avant bootstraps() (ou boot()) pour un intervalle reproductible, comme vous le feriez pour tout rééchantillonnage.
  • int_pctl() lève une erreur ou avertit qu’il y a trop peu de rééchantillons. Les intervalles par percentiles ont besoin de beaucoup de rééchantillons pour être stables — utilisez times = 1000 ou plus pour un IC de coefficient (une poignée suffit seulement pour un aperçu rapide). Et n’oubliez pas apparent = TRUE lorsque vous comptez utiliser int_pctl()/int_bca().
  • Vous avez utilisé trop peu de rééchantillons et l’histogramme paraît irrégulier. times = 25 suffit pour valider un modèle mais bien trop peu pour estimer un IC de manière lisse. Augmentez times pour le travail sur l’incertitude ; le coût est juste du calcul.
  • Votre IC bootstrap diverge de summary(lm()). C’est souvent l’intérêt, pas un bug — l’erreur standard de lm() suppose des erreurs normales à variance constante ; pas le bootstrap. S’ils divergent fortement, faites confiance au bootstrap et vérifiez les hypothèses de votre modèle.

Questions fréquentes

Le rééchantillonnage bootstrap est une méthode pour mesurer l’incertitude d’une statistique en tirant à répétition de nouveaux échantillons à partir de vos données existantes, avec remise, et en recalculant la statistique sur chacun. La dispersion de ces valeurs recalculées estime l’erreur standard de la statistique, et leurs percentiles donnent un intervalle de confiance — le tout sans formule ni hypothèse de distribution. Il fait aussi office de méthode de rééchantillonnage pour la validation de modèle, où les lignes laissées de côté (out-of-bag) de chaque rééchantillon servent de jeu de test.

Créez les rééchantillons avec rsample::bootstraps(data, times = 1000, apparent = TRUE), appliquez votre estimateur sur les splits (par ex. tidy(lm(...)) sur analysis(split)) dans une colonne-liste, puis appelez int_pctl(resamples, that_column) pour l’intervalle par percentiles. L’alternative classique est boot::boot(data, statistic, R = 1000) suivie de boot.ci() (ou estimate ± 2 × SE). Fixez toujours une graine d’abord pour que l’intervalle soit reproductible.

La validation croisée divise les données en plis disjoints (sans remise) et est quasiment sans biais, ce qui en fait la référence pour rapporter la performance attendue d’un modèle. Le bootstrap échantillonne avec remise (taille \(n\)), teste sur les ~37 % out-of-bag, et produit des estimations à variance plus faible mais légèrement pessimistes — et, de façon unique, vous donne l’erreur standard ou l’intervalle de confiance d’une estimation. Utilisez le bootstrap pour l’incertitude, la validation croisée pour un chiffre de performance honnête. Voir validation croisée.

Parce qu’un échantillon bootstrap est tiré avec remise, en moyenne environ 37 % des lignes d’origine ne sont pas sélectionnées pour un rééchantillon donné. Ces lignes laissées de côté forment l’échantillon out-of-bag (OOB). Lorsque le bootstrap est utilisé pour valider un modèle, les lignes OOB jouent le rôle du jeu de test mis de côté — le modèle s’entraîne sur les lignes sélectionnées et est évalué sur les lignes OOB. Les forêts aléatoires utilisent cette même idée pour leur erreur OOB.

Pour valider un modèle (estimer la performance), 25 à 100 rééchantillons suffisent généralement. Pour estimer un intervalle de confiance d’une statistique, utilisez 1000 ou plus — les intervalles par percentiles dépendent des queues de la distribution bootstrap, qui ont besoin de nombreux rééchantillons pour se stabiliser. Davantage de rééchantillons ne fait que coûter du calcul ; cela ne nuit jamais à la précision.

Testez vos connaissances

Estimez un intervalle de confiance bootstrap à 95 % pour la corrélation entre Fertility et Education dans les données swiss. Utilisez rsample::bootstraps() avec times = 1000 et apparent = TRUE, calculez la corrélation sur le jeu d’analyse de chaque rééchantillon, et rapportez l’intervalle par percentiles avec int_pctl().

Votre fonction estimateur devrait renvoyer un tibble bien rangé d’une seule ligne, par ex. tibble::tibble(term = "cor", estimate = cor(d$Fertility, d$Education)), où d <- analysis(split). int_pctl() a besoin de cette forme term/estimate.

library(rsample)
library(tibble)
data("swiss")

set.seed(123)
boot_samples <- bootstraps(swiss, times = 1000, apparent = TRUE)

cor_fun <- function(split) {
  d <- analysis(split)
  tibble(term = "cor", estimate = cor(d$Fertility, d$Education))
}
boot_samples$cors <- lapply(boot_samples$splits, cor_fun)

int_pctl(boot_samples, cors)

Vous obtiendrez un intervalle négatif (grossièrement −0.8 à −0.4) qui exclut 0 — fertilité et éducation sont de manière fiable négativement associées dans ces provinces, et le bootstrap quantifie à quel point de manière fiable sans aucune hypothèse de normalité sur la corrélation.

Vérification rapide. Un collègue exécute bootstraps(swiss, times = 20) et en rapporte un intervalle de confiance à 95 % pour un coefficient. Pourquoi devriez-vous être sceptique, et quelle est la solution ?

Vingt rééchantillons, c’est bien trop peu pour estimer les queues de la distribution bootstrap, et un intervalle par percentiles à 95 % est défini précisément par ces queues (les percentiles 2,5 et 97,5). L’intervalle sera instable et peu fiable. La solution : augmenter times à 1000 ou plus (et set.seed() pour la reproductibilité). Vingt rééchantillons conviennent pour valider un modèle, mais pas pour un IC.

Conclusion

Vous avez appris les deux visages du bootstrap sur les données swiss : quantifier l’incertitude — rééchantillonner avec remise, recalculer un coefficient 1000 fois, et lire l’erreur standard et l’intervalle de confiance par percentiles directement sur la distribution bootstrap (avec rsample::int_pctl() et le classique boot::boot()) — et valider un modèle, en injectant bootstraps() dans fit_resamples() et en évaluant sur les lignes out-of-bag. Optez pour le bootstrap quand vous avez besoin de l’incertitude d’une estimation, et pour la validation croisée quand vous avez besoin d’un chiffre de performance honnête à rapporter.

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 Validation de modèles 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 intervalle et chaque 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.

Pour aller plus loin

  • Efron, B., & Tibshirani, R. J. An Introduction to the Bootstrap — la référence canonique sur le rééchantillonnage bootstrap et les intervalles de confiance.
  • Kuhn, M., & Silge, J. Tidy Modeling with R — le rééchantillonnage avec rsample, y compris le bootstrap et l’estimation out-of-bag. Gratuit en ligne (CC BY-NC-SA).

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {Bootstrap en R : intervalles de confiance et validation},
  date = {2026-06-25},
  url = {https://www.datanovia.com/learn/machine-learning/model-validation/bootstrap-resampling},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Bootstrap en R : intervalles de confiance et validation.” 2026. June 25. https://www.datanovia.com/learn/machine-learning/model-validation/bootstrap-resampling.