Zoeken…


Functie met lage variantie verwijderen

Dit is een zeer basistechniek voor het selecteren van functies.

Het onderliggende idee is dat als een functie constant is (dwz dat het 0 variantie heeft), het niet kan worden gebruikt voor het vinden van interessante patronen en kan worden verwijderd uit de gegevensset.

Bijgevolg is een heuristische benadering voor het elimineren van kenmerken het verwijderen van alle kenmerken waarvan de variantie onder een bepaalde (lage) drempel ligt.

Voortbouwend op het voorbeeld in de documentatie , stel dat we beginnen

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

Er zijn 3 booleaanse functies hier, elk met 6 instanties. Stel dat we diegenen willen verwijderen die in minstens 80% van de gevallen constant zijn. Sommige waarschijnlijkheidsberekeningen laten zien dat deze kenmerken een variantie van minder dan 0,8 * (1 - 0,8) moeten hebben . Bijgevolg kunnen we gebruiken

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

Merk op hoe de eerste functie werd verwijderd.

Deze methode moet met voorzichtigheid worden gebruikt, omdat een lage variantie niet noodzakelijk betekent dat een functie 'niet interessant' is. Beschouw het volgende voorbeeld waarin we een gegevensset samenstellen die 3 functies bevat, de eerste twee bestaande uit willekeurig verdeelde variabelen en de derde uit uniform verdeelde variabelen.

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

Nu is de eerste functie verwijderd vanwege de lage variantie, terwijl de derde functie (dat is de meest oninteressante) is behouden. In dit geval zou het beter zijn geweest om een variatiecoëfficiënt te overwegen omdat die onafhankelijk is van schaling.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow