Recherche…


Suppression de fonctions à faible variance

C'est une technique de sélection de fonctionnalités très basique.

Son idée sous-jacente est que si une entité est constante (c'est-à-dire qu'elle a 0 variance), elle ne peut pas être utilisée pour trouver des modèles intéressants et peut être supprimée de l'ensemble de données.

Par conséquent, une approche heuristique de l'élimination des entités consiste à supprimer d'abord toutes les entités dont la variance est inférieure à un seuil (bas).

En prenant l' exemple de la documentation , supposons que nous commencions par

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

Il y a 3 caractéristiques booléennes ici, chacune avec 6 instances. Supposons que nous souhaitons supprimer celles qui sont constantes dans au moins 80% des instances. Certains calculs de probabilité montrent que ces caractéristiques devront présenter une variance inférieure à 0,8 * (1 - 0,8) . Par conséquent, nous pouvons utiliser

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]])

Notez comment la première fonctionnalité a été supprimée.

Cette méthode doit être utilisée avec précaution car une faible variance ne signifie pas nécessairement qu’une fonctionnalité est «inintéressante». Considérons l'exemple suivant où nous construisons un jeu de données qui contient 3 entités, les deux premières étant constituées de variables distribuées aléatoirement et la troisième de variables uniformément distribuées.

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 ]])

Désormais, la première fonctionnalité a été supprimée en raison de sa faible variance, tandis que la troisième fonctionnalité (la moins intéressante) a été conservée. Dans ce cas, il aurait été plus approprié de prendre en compte un coefficient de variation car celui-ci est indépendant de la mise à l'échelle.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow