Multicolinealidad: por qué rompe tu modelo

Resumen

Cuando entrenas un modelo de regresión y aparece un determinante igual a cero, el culpable suele tener nombre propio: multicolinealidad. Este problema surge cuando tus datos contienen información redundante y rompe por completo el cálculo de los pesos en machine learning, dejando tu modelo sin una solución única.

¿Qué es la multicolinealidad y por qué genera singularidad?

La multicolinealidad ocurre cuando dos o más características de tu matriz X miden esencialmente lo mismo. Piensa en una columna en metros cuadrados y otra en centímetros cuadrados, o en duplicar la columna de habitaciones. Una es solo una versión escalada de la otra, así que no aporta información nueva [0:25].

Cuando eso pasa, las columnas de X se vuelven linealmente dependientes. Esa dependencia se traslada a la matriz de Gram (la que usas en la ecuación normal) y la convierte en una matriz singular: determinante cero y, por tanto, sin inversa.

¿Qué es una matriz singular? Es una matriz cuyo determinante es cero. No tiene inversa, así que no puedes resolver con ella un sistema lineal de forma única.

¿Qué problemas causa la multicolinealidad en tu modelo?

Cuando tu matriz se vuelve singular, no es solo un detalle matemático: tu modelo deja de ser confiable en varios frentes [1:10].

  • Ambigüedad en la solución: si dos características son redundantes, existen infinitas combinaciones de pesos que producen el mismo resultado. La ecuación normal no se puede resolver con una inversa.
  • Inestabilidad del modelo: cuando el determinante está cerca de cero, un pequeño cambio en los datos provoca cambios drásticos y erráticos en los pesos aprendidos. Tu modelo se vuelve impredecible.
  • Pérdida de interpretabilidad: como los pesos son inestables, no puedes usarlos para medir la importancia real de cada característica ni explicar cómo el modelo toma decisiones.

Y aquí viene lo interesante: estos tres problemas aparecen juntos. No es que elijas uno; cuando hay redundancia, los tres te golpean al mismo tiempo.

¿Cómo diagnosticar la multicolinealidad en Python paso a paso?

Para verlo en acción, vamos a enfermar el conjunto de datos del proyecto agregando una columna redundante en Google Colab [2:15]. La idea es tomar la columna de metros cuadrados y duplicarla, pero convertida a pies cuadrados multiplicando por 10.764.

Crear una característica redundante

Primero generamos la columna nueva y la concatenamos a X junto con el bias:

python pies2 = X_original[:, 0] * 10.764 X_enfermo = np.c_[X_original, pies2] X_enfermo_bias = np.c_[np.ones((4, 1)), X_enfermo] print(X_enfermo_bias)

Al imprimir, verás que la última columna es la segunda escalada por 10.764. Esa es la redundancia que va a romper todo.

Calcular A, B, determinante y rango

Ahora construimos los elementos de la ecuación normal y verificamos si la matriz tiene inversa:

python A_enfermo = X_enfermo_bias.T @ X_enfermo_bias B = X_enfermo_bias.T @ Y

determinante = np.linalg.det(A_enfermo) rango = np.linalg.matrix_rank(A_enfermo) print(determinante, rango)

El resultado es contundente: el determinante es 0 y el rango es 3 cuando deberíamos tener 4. Dos alertas rojas que confirman la singularidad [4:05].

¿Cómo sé si una matriz tiene inversa? Calcula su determinante con np.linalg.det. Si es cero o casi cero, la matriz es singular y no tiene inversa.

Intentar resolver el sistema y ver el error

Aunque ya sabemos qué va a pasar, vale la pena intentarlo para ver cómo reacciona NumPy:

python theta = np.linalg.inv(A_enfermo) @ B

LinAlgError: Singular matrix

theta = np.linalg.solve(A_enfermo, B)

LinAlgError: Singular matrix

Ambos métodos lanzan el mismo error: Singular matrix. No importa qué función uses, si la matriz es singular, NumPy se niega a invertirla [5:20].

¿Qué pasa si la redundancia no es exacta?

Aquí está el reto que vale la pena probar: modifica ligeramente uno de los valores en la última columna para que ya no sea exactamente los metros cuadrados multiplicados por 10.764. Cambia un número, el que tú quieras.

Vuelve a ejecutar todo y observa:

  1. ¿El determinante sigue siendo cero, o ahora es un número muy pequeño pero distinto de cero?
  2. ¿np.linalg.inv y np.linalg.solve funcionan ahora, o siguen fallando?
  3. Si funcionan, ¿los pesos que obtienes tienen sentido o se ven extremos y erráticos?

Ese pequeño experimento te muestra la diferencia entre multicolinealidad perfecta (determinante exactamente cero) y multicolinealidad alta (determinante muy cercano a cero). La primera bloquea el cálculo; la segunda lo permite, pero produce pesos inestables y poco fiables.

Cuéntame en los comentarios qué valores usaste y cómo cambiaron el determinante y los pesos. En la siguiente clase vas a conocer la pseudo inversa, la herramienta del álgebra lineal que te permite encontrar la mejor solución posible incluso cuando una solución perfecta no existe.