Variables colineales en el entrenamiento Multiclass LDA


16

Estoy entrenando un clasificador LDA multiclase con 8 clases de datos.

Mientras realizo el entrenamiento, recibo una advertencia de: " Las variables son colineales "

Estoy obteniendo una precisión de entrenamiento de más del 90% .

Estoy usando la biblioteca scikits-learn en Python do train y pruebo los datos de Multi-class.

También obtengo una precisión de prueba decente (aproximadamente 85% -95% ).

No entiendo lo que significa el error / advertencia. Por favor, ayúdame.

Respuestas:


29

La multicolinealidad significa que sus predictores están correlacionados. ¿Por qué es esto malo?

Debido a que LDA, al igual que las técnicas de regresión, implica calcular una inversión de matriz, que es inexacta si el determinante está cerca de 0 ( es decir, dos o más variables son casi una combinación lineal entre sí).

Más importante aún, hace que los coeficientes estimados sean imposibles de interpretar. Si un aumento en , por ejemplo, se asocia con una disminución en y ambos incremento de la variable , cada cambio en serán compensados por un cambio en X_2 y usted subestimar el efecto de X_1 en Y . En LDA, subestimarías el efecto de X_1 en la clasificación.X1X2YX1X2X1YX1

Si lo único que le importa es la clasificación per se , y que después de entrenar su modelo en la mitad de los datos y probarlo en la otra mitad, obtiene una precisión del 85-95%, diría que está bien.


Entonces, ¿puedo interpretar esto como que una característica X1 en el vector de características no es una buena elección en caso de que la precisión de la prueba sea baja?
Garak

1
Supongo que si la precisión de la prueba es baja, no hay una buena elección.
gui11aume

Lo interesante es que tengo este problema con LDA pero no cuando uso QDA. Me pregunto qué hay de diferente allí
garak

1
+1 para la respuesta, pero "calcular una inversión matricial" puede no ser exacto. Nunca lo computamos explícitamente, se utilizan métodos directos como LU, QR o métodos iterativos.
Haitao Du

@ hxd1011 ¡Correcto! Para el registro, ¿podría dar algunas palabras sobre lo que sucede en LU / QR, etc., cuando la matriz es "casi singular", o quizás señalar un documento que lo explique?
gui11aume

12

Como creo que gui11aume le ha dado una gran respuesta, quiero dar un ejemplo desde un ángulo ligeramente diferente que podría ser esclarecedor. Considere que una covariable en su función discriminante tiene el siguiente aspecto:

X1=5 5X2+3X3-X4 4

Supongamos que el mejor LDA tiene el siguiente límite lineal:

X1+2X2+X3-2X4 4=5 5

5 5X2+3X3-X4 4X1

5 5X2+3X3-X4 4+2X2+X3-2X4 4=5 5

o

7 7X2+4 4X3-3X4 4=5 5

1,2,1,-2X1X2X3X4 40 0,7 7,3,-1

Entonces, el coeficiente es bastante diferente, pero las dos ecuaciones dan el mismo límite y una regla de predicción idéntica. Si una forma es buena, la otra también lo es. Pero ahora puede ver por qué gui11ame dice que los coeficientes son ininterpretables.

X20 0X3X4 4


1

Si bien la respuesta que se marcó aquí es correcta, creo que estaba buscando una explicación diferente para averiguar qué sucedió en su código. Tuve exactamente el mismo problema al ejecutar un modelo.

Esto es lo que está sucediendo: está entrenando su modelo con la variable predicha como parte de su conjunto de datos. Aquí hay un ejemplo de lo que me estaba ocurriendo sin siquiera notarlo:

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

En este código, quiero predecir el valor de 'COL3' ... pero, si observa train_X, le digo que recupere todas las columnas excepto la última, por lo que ingresa COL1 COL2 y COL3, no COL4, e intentando predecir COL3, que es parte de train_X.

Lo corregí simplemente moviendo las columnas, moví manualmente COL3 en Excel para ser la última columna en mi conjunto de datos (ahora tiene lugar COL4), y luego:

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

Si no desea moverlo en Excel, y solo quiere hacerlo por código, entonces:

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

Observe ahora cómo he declarado train_X, para incluir todas las columnas excepto COL3, que es parte de train_Y.

Espero que eso ayude.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.