Szukaj…


Usunięcie funkcji niskiej wariancji

Jest to bardzo podstawowa technika wyboru funkcji.

Jego podstawową ideą jest to, że jeśli cecha jest stała (tj. Ma 0 wariancję), nie można jej użyć do znalezienia interesujących wzorców i można ją usunąć z zestawu danych.

W związku z tym heurystycznym podejściem do eliminacji cech jest najpierw usunięcie wszystkich cech, których wariancja jest poniżej pewnego (niskiego) progu.

Opierając się na przykładzie z dokumentacji , załóżmy, że zaczynamy

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

Istnieją tutaj 3 funkcje logiczne, każda z 6 instancjami. Załóżmy, że chcemy usunąć te, które są stałe w co najmniej 80% przypadków. Niektóre obliczenia prawdopodobieństwa pokazują, że te cechy będą musiały mieć wariancję mniejszą niż 0,8 * (1 - 0,8) . W związku z tym możemy użyć

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

Zwróć uwagę, jak usunięto pierwszą funkcję.

Tę metodę należy stosować ostrożnie, ponieważ niska wariancja niekoniecznie oznacza, że funkcja jest „nieciekawa”. Rozważ następujący przykład, w którym konstruujemy zestaw danych, który zawiera 3 cechy, z których dwie pierwsze składają się ze zmiennych losowo rozmieszczonych, a trzecia zmiennych równomiernie rozmieszczonych.

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

Teraz pierwsza funkcja została usunięta z powodu niskiej wariancji, a trzecia (najbardziej nieciekawa) została zachowana. W takim przypadku bardziej odpowiednie byłoby rozważenie współczynnika zmienności, ponieważ jest on niezależny od skalowania.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow