20 votos

Variables colineales en el entrenamiento LDA multiclase

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

Mientras realizo el entrenamiento, recibo un aviso de: " Las variables son colineales "

Estoy recibiendo un formación precisión de más de 90% .

Estoy usando scikits-learn biblioteca en Python entrenar y probar los datos multiclase.

Me sale decente pruebas precisión también(sobre 85%-95% ).

No entiendo qué significa el error/aviso. Por favor, ayúdeme.

33voto

JMW.APRN Puntos 21

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

Dado que el LDA, al igual que las técnicas de regresión, implica el cálculo de una inversión matricial, que es inexacta si el determinante se aproxima a 0 ( es decir dos o más variables son casi una combinación lineal entre sí).

Y lo que es más importante, hace que los coeficientes estimados sean imposibles de interpretar. Si un aumento de $X_1$ se asocia a una disminución de $X_2$ y ambos aumentan la variable $Y$ cada cambio en $X_1$ se compensará con un cambio en $X_2$ y subestimará el efecto de $X_1$ en $Y$ . En LDA, se subestimaría el efecto de $X_1$ en la clasificación.

Si lo único que te importa es la clasificación propiamente dicho y que después de entrenar tu modelo con la mitad de los datos y probarlo con la otra mitad obtienes una precisión del 85-95%, yo diría que está bien.

15voto

mat_geek Puntos 1367

Como me parece que gui11aume te ha dado una gran respuesta, quiero dar un ejemplo desde un ángulo ligeramente diferente que puede ser esclarecedor. Considera que una covariable en tu función discriminante tiene el siguiente aspecto:

$X_1= 5X_2 +3X_3 -X_4$ .

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

$X_1+2X_2+X_3-2X_4 =5$

Entonces podemos sustituir $5X_2+3X_3-X_4$ para $X_1$ n la ecuación de frontera LDA, así:

$5X_2+3X_3-X_4+2X_2+X_3-2X_4=5$

o

$7X_2+4X_3-3X_4=5$ .

Estos dos límites son idénticos pero el primero tiene coeficientes $1, 2, 1,-2$ para $X_1$ , $X_2$ , $X_3$ y $X_4$ respectivamente, mientras que el otro tiene coeficientes $0, 7, 3, -1$ .

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

Hay otras formas de expresar este límite sustituyendo por $X_2$ para darle el $0$ y lo mismo podría hacerse para $X_3$ o $X_4$ . Pero en la práctica la colinealidad es aproximada. Esto empeora las cosas porque el ruido permite una respuesta única. Perturbaciones muy ligeras de los datos harán que los coeficientes cambien drásticamente. Pero para la predicción está bien porque cada ecuación define casi el mismo límite y así LDA resultará en predicciones casi idénticas.

2voto

Boris Puntos 128

Si bien la respuesta que se marcó aquí es correcta, creo que usted estaba buscando una explicación diferente para averiguar lo que sucedió en su código. Tuve exactamente el mismo problema ejecutando a través de un modelo.

Esto es lo que pasa: Estás entrenando tu modelo con la variable predicha como parte de tu conjunto de datos. He aquí un ejemplo de lo que me ocurría sin darme cuenta:

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 nos fijamos en train_X, le estoy diciendo que recupere todas las columnas excepto la última, por lo que su entrada COL1 COL2 y COL3, no COL4, y tratando de predecir COL3 que es parte de train_X.

Corregí esto simplemente moviendo las columnas, moví manualmente COL3 en Excel para que fuera la última columna en mi conjunto de datos (ahora ocupando el lugar de 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 quieres moverlo en Excel, y quieres 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 forma parte de train_Y.

Espero que eso ayude.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X