La multicolinealidad puede convertir un entrenamiento en un callejón sin salida. Aquí verás cómo la singularidad emerge cuando hay características redundantes, por qué el determinante y el rango son tus pruebas clave y cómo la matriz de Gram y la ecuación normal se quiebran en la práctica con NumPy en Google Colab.
¿Qué es la singularidad y por qué la causa la multicolinealidad?
Cuando dos o más columnas en X contienen la misma información, se vuelven linealmente dependientes. Ejemplos claros: convertir “metros cuadrados” a “centímetros cuadrados” o duplicar “habitaciones”. No hay nueva información, solo una versión escalada.
¿Cómo se manifiesta la dependencia lineal en X?
- Columnas equivalentes por escala, como m² y pies² (factor 10.764).
- Duplicación de una variable, como “habitaciones” y una copia de “habitaciones”.
- Consecuencia: la matriz de Gram XᵀX se vuelve singular.
- Signo inequívoco: determinante igual a cero.
- Implicación: no existe inversa, no hay solución única para la ecuación normal.
¿Qué problemas genera en el modelo?
- Ambigüedad en la solución: hay infinitos vectores de pesos que explican igual los datos.
- Inestabilidad extrema: con determinante cercano a cero, pequeñas variaciones en la entrada cambian drásticamente los pesos.
- Falta de interpretabilidad: los pesos no son fiables para estimar la importancia de cada característica.
¿Cómo diagnosticarlo en Google Colab con NumPy?
El procedimiento práctico reproduce la multicolinealidad agregando una columna redundante y luego mediendo determinante y rango. Finalmente, se prueba la inversión y la resolución del sistema.
¿Cómo crear la característica redundante?
- Tomar la primera columna de X: X[:, 0].
- Convertir m² a pies² multiplicando por 10.764: crear “pies2”.
- Concatenar con np.c_ para formar X_enfermo.
- Agregar bias con una columna de ones de forma 4,1 y concatenarla: X_enfermo_bias.
- Verificar al imprimir: la última columna replica la segunda en otra escala.
¿Qué métricas revisar: determinante y rango?
- Calcular A_enfermo = X_enfermo_biasᵀ X_enfermo_bias y B = X_enfermo_biasᵀ y.
- Usar np.linalg.det(A_enfermo): devuelve 0, alerta roja de singularidad.
- Usar np.linalg.matrix_rank(A_enfermo): da 3, confirmando que no hay inversa.
¿Qué pasa al intentar resolver la ecuación normal?
- Intentar np.linalg.inv(A_enfermo) @ B: error “singular matrix”.
- Intentar np.linalg.solve(A_enfermo, B): mismo error.
- Conclusión: el modelo no se puede entrenar con esta X.
¿Qué experimentar ahora y cuál es la salida cuando falla la inversa?
Pequeños cambios rompen la dependencia perfecta. Eso permite observar cómo pasa de singularidad exacta a mal condicionamiento, donde aún hay riesgos de inestabilidad, pero ya es posible probar la inversión o un solver.
¿Qué cambios probar para romper la redundancia?
- Modificar ligeramente un valor en la última columna de X_enfermo.
- Dejar de usar exactamente 10.764 como factor en al menos una fila.
- Recalcular A_enfermo, B, determinante y rango.
¿Qué observar después del cambio?
- El determinante deja de ser 0 o se vuelve un número muy pequeño.
- np.linalg.inv y np.linalg.solve pueden funcionar, pero con potencial inestabilidad si el determinante es diminuto.
- Los pesos serán menos indeterminados; la interpretación aún puede ser frágil si hay alta multicolinealidad.
¿Con qué herramienta continuar cuando no existe inversa?
- Usar la seudoinversa: permite obtener la mejor solución posible incluso cuando no hay solución perfecta para la ecuación normal.
¿Ya probaste el experimento y mediste el determinante, el rango y el comportamiento de inv y solve? Comparte tus resultados y lo que observaste en la estabilidad de los pesos.