La PCR : changer de colonnes avant de faire la régression

Sur 200 marchés, les ventes semblent grimper avec la presse écrite. Puis tu ajoutes la radio au modèle, et l’effet de la presse s’évapore : presse et radio évoluent ensemble, et la presse seule « captait » en réalité une partie de l’effet de la radio. Plutôt que d’arbitrer entre deux colonnes qui se recoupent, la régression sur composantes principales (PCR) en fabrique de nouvelles qui ne se recoupent plus. À la fin, tu sauras ce qu’elle construit, ce qu’elle règle et comment l’écrire en Python.

Sommaire

L’essentiel en 30 secondes

  • La PCR est une régression en deux temps : on remplace les p prédicteurs par M < p combinaisons linéaires, puis on les confie à une régression ordinaire.
  • Ces combinaisons sont les composantes principales, calculées sans jamais consulter la réponse.
  • Deux composantes successives sont non corrélées : la régression finale n’a plus de colonnes qui se recoupent.
  • La PCR reste utilisable quand il y a plus de colonnes que de lignes, cas où les moindres carrés ordinaires échouent.
  • Le nombre M est un réglage, fixé par validation croisée.

Deux situations où les moindres carrés se perdent

La régression ordinaire se comporte bien quand les colonnes apportent des informations distinctes et que les lignes sont nombreuses. Deux cas la prennent en défaut, et la PCR vise les deux.

Des colonnes qui disent presque la même chose

Reprends nos 200 marchés. Une régression des ventes sur la presse écrite seule montrait un effet net ; avec la télévision et la radio dans le modèle, il devient quasiment nul et non significatif. Rien de contradictoire : là où l’on dépense plus en radio, on dépense aussi plus en presse. Ce phénomène s’appelle la colinéarité : plusieurs prédicteurs sont fortement corrélés, et leurs effets deviennent difficiles à séparer.

Un indicateur chiffre ce flou, le facteur d’inflation de la variance (VIF) : au-delà de 5 ou 10, la colinéarité devient préoccupante. Deux remèdes classiques existent : retirer l’une des variables redondantes, ou combiner les variables colinéaires en un seul indicateur synthétique. Garde cette seconde idée en tête : la PCR travaille exactement dans cet esprit.

Plus de colonnes que de lignes

Imagine des centaines de milliers de mutations génétiques mesurées sur quelques centaines de patients, ou des dizaines de milliers de termes pour quelques milliers de documents. Quand le nombre de variables p dépasse celui des observations n, on parle de haute dimension.

Dans ce régime, les moindres carrés ordinaires deviennent inutilisables : une infinité de solutions reproduisent l’entraînement sans la moindre erreur (RSS nul), et prédisent pourtant très mal des données nouvelles. La réduction de dimension, elle, reste applicable, parce qu’elle impose au modèle final une forme de simplicité.

Le principe : changer les colonnes, garder le modèle

La PCR ne touche pas à la régression elle-même : elle change ce qu’on lui donne à manger. On construit M < p combinaisons linéaires des prédicteurs d’origine, notées Z_1, \dots, Z_M, puis on les utilise comme prédicteurs d’un modèle de régression ordinaire.

Le modèle final s’écrit donc :

    \[ \hat{y} = \beta_0 + \beta_1 Z_1 + \beta_2 Z_2 + \dots + \beta_M Z_M .\]

Les coefficients \beta_m portent sur les composantes Z_m, pas sur les variables de départ. Ces composantes sont fabriquées en observant uniquement les prédicteurs : la réponse Y n’est jamais consultée à cette étape.

Ce procédé repose sur une hypothèse de travail. Si les directions où les prédicteurs varient le plus sont aussi les plus liées à la réponse, quelques composantes suffisent à porter l’essentiel du signal utile, hypothèse raisonnable en pratique mais jamais garantie. Le gain : beaucoup moins de paramètres à estimer, donc moins de risque de surajustement.

Fabriquer les composantes

Pour voir d’où sortent les Z_m, pars de deux prédicteurs seulement.

La première composante est la combinaison linéaire des prédicteurs dont la variance est la plus grande :

    \[ Z_1 = \phi_{11}X_1 + \phi_{21}X_2 + \dots + \phi_{p1}X_p .\]

Chaque \phi_{j1} est le poids du prédicteur X_j. Les poids sont liés par \sum_j \phi_{j1}^2 = 1 ; sans ce garde-fou, il suffirait de multiplier tous les poids pour faire exploser la variance.

Pour la deuxième, même recette sous une condition supplémentaire : aucune corrélation avec la première, ce qui revient à lui être perpendiculaire. La suite s’enchaîne jusqu’à p composantes, de moins en moins riches en variance ; la PCR s’arrête aux M premières.

Regarde le panneau de droite : chaque observation est réduite à un seul nombre, sa position le long de PC1. Ce nombre est la valeur de Z_1 pour cette observation, et c’est lui qui devient une colonne de la régression.

Reviens maintenant au problème du début. Comme deux composantes successives sont non corrélées, les M colonnes qui entrent dans la régression ne se recoupent plus : là où presse et radio se disputaient un même effet, la régression travaille sur des axes indépendants.

Choisir M et l’écrire en Python

Le nombre de composantes M n’est pas calculé : c’est un réglage que tu fixes. On fait varier M, on évalue chaque modèle par validation croisée et l’on retient la valeur qui donne la meilleure erreur de test estimée, avec en pratique 5 ou 10 blocs.

Imagine un tableau X de prédicteurs et une réponse Y, déjà chargés, avec un entier M à tester. Le bloc ci-dessous est une session interactive : In [24]: désigne la commande numéro 24 de la session.

In [24]: pca = PCA(n_components=M)
         linreg = skl.LinearRegression()
         pipe = Pipeline([('pca', pca),
                            ('linreg', linreg)])
         pipe.fit(X, Y)

Chaque ligne a son rôle : PCA(n_components=M) fabrique les M premières composantes, skl.LinearRegression() est la régression ordinaire, et le Pipeline les enchaîne, si bien qu’un seul pipe.fit(X, Y) exécute les deux temps de la méthode. Il reste à relancer ce bloc pour chaque valeur de M et à comparer les erreurs de validation croisée.

📌 À retenir La PCR vaut le détour quand tes prédicteurs se recoupent (un VIF au-delà de 5 ou 10) ou quand ils dépassent tes observations en nombre. Elle consiste en deux gestes : fabriquer M colonnes qui ne se recoupent pas, sans regarder la réponse, puis régresser dessus.