Buscar..


Eliminación de características de baja variación

Esta es una técnica de selección de características muy básica.

Su idea subyacente es que si una característica es constante (es decir, tiene una variación de 0), no se puede usar para encontrar patrones interesantes y se puede eliminar del conjunto de datos.

En consecuencia, un enfoque heurístico para la eliminación de características es eliminar primero todas las características cuya varianza esté por debajo de algún umbral (bajo).

Partiendo del ejemplo en la documentación , supongamos que empezamos con

X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]

Hay 3 características booleanas aquí, cada una con 6 instancias. Supongamos que deseamos eliminar aquellos que son constantes en al menos el 80% de las instancias. Algunos cálculos de probabilidad muestran que estas características deberán tener una varianza inferior a 0.8 * (1 - 0.8) . En consecuencia, podemos utilizar

from sklearn.feature_selection import VarianceThreshold
sel = VarianceThreshold(threshold=(.8 * (1 - .8)))    
sel.fit_transform(X)
# Output: array([[0, 1],
                 [1, 0],
                 [0, 0],
                 [1, 1],
                 [1, 0],
                 [1, 1]])

Observe cómo se eliminó la primera característica.

Este método se debe usar con precaución porque una variación baja no significa necesariamente que una característica no sea interesante. Considere el siguiente ejemplo en el que construimos un conjunto de datos que contiene 3 características, las dos primeras consisten en variables distribuidas al azar y la tercera en variables distribuidas uniformemente.

from sklearn.feature_selection import VarianceThreshold
import numpy as np

# generate dataset
np.random.seed(0)

feat1 = np.random.normal(loc=0, scale=.1, size=100) # normal dist. with mean=0 and std=.1
feat2 = np.random.normal(loc=0, scale=10, size=100) # normal dist. with mean=0 and std=10
feat3 = np.random.uniform(low=0, high=10, size=100) # uniform dist. in the interval [0,10)
data = np.column_stack((feat1,feat2,feat3))

data[:5]
# Output:
# array([[  0.17640523,  18.83150697,   9.61936379],
#        [  0.04001572, -13.47759061,   2.92147527],
#        [  0.0978738 , -12.70484998,   2.4082878 ],
#        [  0.22408932,   9.69396708,   1.00293942],
#        [  0.1867558 , -11.73123405,   0.1642963 ]]) 

np.var(data, axis=0)
# Output: array([  1.01582662e-02,   1.07053580e+02,   9.07187722e+00])

sel = VarianceThreshold(threshold=0.1)
sel.fit_transform(data)[:5]
# Output:
# array([[ 18.83150697,   9.61936379],
#        [-13.47759061,   2.92147527],
#        [-12.70484998,   2.4082878 ],
#        [  9.69396708,   1.00293942],
#        [-11.73123405,   0.1642963 ]])

Ahora, la primera característica se ha eliminado debido a su baja variación, mientras que la tercera característica (que es la más interesante) se ha mantenido. En este caso, hubiera sido más apropiado considerar un coeficiente de variación porque eso es independiente de la escala.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow