Variables colinéaires dans la formation Multiclass LDA

16

Je forme un classificateur LDA multi-classe avec 8 classes de données.

Pendant la formation, je reçois un avertissement de: " Les variables sont colinéaires "

Je reçois une formation précision d' de plus de 90% .

J'utilise la bibliothèque scikits-learn dans Python pour former et tester les données multi-classes.

J'obtiens également une précision de test décente (environ 85% -95% ).

Je ne comprends pas ce que signifie l'erreur / avertissement. Sil te plait aide moi.

garak
la source

Réponses:

29

La multicolinéarité signifie que vos prédicteurs sont corrélés. Pourquoi est-ce mauvais?

Parce que LDA, comme les techniques de régression, implique le calcul d'une inversion de matrice, qui est inexacte si le déterminant est proche de 0 ( c'est-à-dire que deux variables ou plus sont presque une combinaison linéaire l'une de l'autre).

Plus important encore, cela rend les coefficients estimés impossibles à interpréter. Si une augmentation de , par exemple, est associée à une diminution de X 2 et les deux variables d'augmentation Y , chaque changement de X 1 sera compensée par un changement de X 2 et vous sous - estimer l'effet de X 1 sur Y . Dans LDA, vous sous-estimeriez l'effet de X 1X1X2YX1X2X1YX1 sur la classification.

Si vous ne vous souciez que de la classification en soi , et qu'après avoir formé votre modèle sur la moitié des données et l'avoir testé sur l'autre moitié, vous obtenez une précision de 85 à 95%, je dirais que c'est bien.

gui11aume
la source
Alors, puis-je interpréter cela comme une caractéristique X1 dans le vecteur de caractéristique n'est pas un bon choix au cas où la précision des tests serait faible?
garak
1
Je suppose que si la précision des tests est faible, il n'y a pas de bon choix.
gui11aume
Ce qui est intéressant, c'est que j'ai ce problème avec LDA, mais pas lorsque j'utilise QDA. Je me demande ce qui est différent là-dedans?
garak
1
+1 pour la réponse, mais «calculer une inversion de matrice» peut ne pas être précis. Nous ne l'informatons jamais explicitement, des méthodes directes telles que LU, QR ou des méthodes itératives sont utilisées.
Haitao Du
@ hxd1011 Correct! Pour mémoire, pourriez-vous soit donner quelques mots sur ce qui se passe en LU / QR, etc. lorsque la matrice est "presque singulière", soit peut-être pointer vers un document qui l'explique?
gui11aume
12

Comme il me semble que gui11aume vous a donné une excellente réponse, je veux donner un exemple sous un angle légèrement différent qui pourrait être éclairant. Considérez qu'une covariable dans votre fonction discriminante se présente comme suit:

. X1=5X2+3X3X4

Supposons que le meilleur LDA ait la frontière linéaire suivante:

X1+2X2+X32X4=5

5X2+3X3X4X1

5X2+3X3X4+2X2+X32X4=5

ou

septX2+4X3-3X4=5.

Ces deux frontières sont identiques mais la première a des coefficients 1,2,1,-2 pour X1, X2, X3, et X4 respectivement, tandis que l'autre a des coefficients 0,sept,3,-1.

Les coefficients sont donc assez différents mais les deux équations donnent la même frontière et la même règle de prédiction. Si une forme est bonne, l'autre l'est aussi. Mais maintenant, vous pouvez voir pourquoi gui11ame dit que les coefficients sont ininterprétables.

Il existe plusieurs autres façons d'exprimer cette frontière en substituant à X2 pour lui donner 0 coefficient et la même chose pourrait être fait pour X3 ou X4. Mais en pratique, la colinéarité est approximative. Cela aggrave les choses car le bruit permet une réponse unique. De très légères perturbations des données entraîneront une modification drastique des coefficients. Mais pour la prédiction, vous êtes d'accord car chaque équation définit presque la même frontière et donc LDA se traduira par des prédictions presque identiques.

Michael R. Chernick
la source
1

Bien que la réponse qui a été marquée ici soit correcte, je pense que vous cherchiez une explication différente pour découvrir ce qui s'est passé dans votre code. J'ai eu exactement le même problème lors de l'exécution d'un modèle.

Voici ce qui se passe: vous entraînez votre modèle avec la variable prédite dans le cadre de votre ensemble de données. Voici un exemple de ce qui m'arrivait sans même le remarquer:

df = pd.read_csv('file.csv')
df.columns = ['COL1','COL2','COL3','COL4']
train_Y = train['COL3']
train_X = train[train.columns[:-1]]

Dans ce code, je veux prédire la valeur de 'COL3' ... mais, si vous regardez train_X, je lui dis de récupérer chaque colonne sauf la dernière, donc son entrée COL1 COL2 et COL3, pas COL4, et essayer de prédire COL3 qui fait partie de train_X.

J'ai corrigé cela en déplaçant simplement les colonnes, en déplaçant manuellement COL3 dans Excel pour être la dernière colonne de mon ensemble de données (maintenant en remplacement de COL4), puis:

df = pd.read_csv('file.csv')
df.columns = ['COL1','COL2','COL3','COL4']
train_Y = train['COL4']
train_X = train[train.columns[:-1]]

Si vous ne voulez pas le déplacer dans Excel et que vous voulez simplement le faire par code, alors:

df = pd.read_csv('file.csv')
df.columns = ['COL1','COL2','COL3','COL4']
train_Y = train['COL3']
train_X = train[train.columns['COL1','COL2','COL4']]

Notez maintenant comment j'ai déclaré train_X, pour inclure toutes les colonnes sauf COL3, qui fait partie de train_Y.

J'espère que ça aide.

nukalov
la source