¿Cómo estandarizar una matriz si la desviación estándar es cero?

8

Estoy tratando de estandarizar las columnas del conjunto de datos para la regresión lineal.

Una de las columnas tiene desviación estándar = 0.

def standardize(X):
    return (X - mean(X)) / std(X) 

Entonces este código no funciona.

¿Hay algún truco para resolver este problema? He intentado dos cosas

  1. Deseche la columna con la desviación estándar 0 porque es un parámetro inútil.
  2. Agregue un ruido muy pequeño como a uno de los elementos de la columna para que la función funcione.1010standardize

¡Gracias!

Pratik Deoghare
fuente
Lo estas haciendo bien. Como segunda opción, será mejor agregar ruido aleatorio normalmente distribuido con una pequeña desviación estándar a cada valor en la columna. Pero dado que la primera opción es más simple, se prefiere.
O_Devinyak
17
Si la desviación estándar es cero, la columna se rellena con un valor. Entonces, si su objetivo es preparar los datos para la regresión, puede tirar la columna, ya que no contribuirá en nada a la regresión. Agregar un pequeño ruido solo le dará más problemas.
mpiktas
44
(Con la advertencia de que @mpiktas asume implícitamente que la regresión contendrá un término constante, que suele ser el caso). Tenga en cuenta que agregar un ruido pequeño hará que esta columna y la constante sean extremadamente paralelas, creando potencialmente todo tipo de estragos en el número soluciones debido a la alta multicolinealidad. Pero, ¿por qué estandarizar las columnas en primer lugar? Esto sucederá automáticamente, utilizando casi cualquier buen método de solución.
whuber
55
@Pratik, no creo que haya una manera de transformar una variable con cero varianza a una con media 0 y varianza 1. Si hace la opción (2) anterior, efectivamente está reemplazando su variable con números aleatorios estandarizados.
Macro

Respuestas:

7

La situación que describe surgirá como resultado de uno de estos dos escenarios:

  1. La columna a la que se refiere es la columna de 1 que se agrega a su matriz de covariables para que su regresión lineal tenga un término de intercepción .
  2. La columna es una columna diferente a la columna mencionada anteriormente, que le da dos columnas de constantes [****].

Para el escenario 1 : omita esa columna, estandarice todas las demás columnas y luego ejecute la regresión como lo haría normalmente.

Para el escenario 2 , sin embargo, tendrá que deshacerse de esa columna constante adicional por completo. De hecho, independientemente de la cuestión de la estandarización , nunca podrá ejecutar la regresión con dos columnas constantes, ya que tendría una colinealidad perfecta . El resultado es que incluso si intenta ejecutar la regresión, el programa de computadora emitirá un mensaje de error y se cerrará a la mitad [Nota: esto se debe a que una regresión OLS requiere que la matriz X'X no sea singular para que las cosas funcionen correctamente].

De todos modos, ¡buena suerte con tu, um, regresando!

[****] Solo para aclarar: lo que quiero decir con "dos columnas de constantes" es que tienes una columna en la que cada elemento es '1' y una segunda columna en la que cada elemento es una constante 'k'. .

Steve S
fuente
2

La forma correcta sería eliminar la columna de características de los datos. Pero como un truco temporal ...

Simplemente puede reemplazar el 0 std a 1 para esa función. Esto básicamente significaría que el valor escalado sería cero para todos los puntos de datos para esa característica. Esto tiene sentido ya que esto implica que los valores de las características no se desvían ni un poco de la media (como los valores son constantes, la constante es la media).

FYI- ¡Esto es lo que hace sklearn! https://github.com/scikit-learn/scikit-learn/blob/7389dbac82d362f296dc2746f10e43ffa1615660/sklearn/preprocessing/data.py#L70

PankajKabra
fuente
La desviación estándar de 0 significa que la característica es constante y, por lo tanto, no es útil para la predicción. Cambiar la desviación estándar para una constante no tiene sentido.
Michael R. Chernick
Sí, no tendrá ningún sentido desde la perspectiva del modelado, solo lo sugerí como truco para no pasar por la molestia de eliminar la columna cada vez que aparece una característica constante en un conjunto de datos.
PankajKabra
0

La característica que tiene variación cero es inútil, quítela.

Considere esto, si esta fuera la única característica, no aprendería nada sobre la respuesta a esta característica a partir de los datos. En el caso multivariante, se necesita álgebra lineal para llegar a la misma conclusión, pero la idea es la misma.

Aksakal
fuente