Sök…


Borttagning av lågvariansfunktion

Detta är en mycket grundläggande teknik för val av funktioner.

Den underliggande idén är att om en funktion är konstant (dvs den har 0 varians), så kan den inte användas för att hitta några intressanta mönster och kan tas bort från dataset.

Följaktligen är en heuristisk strategi för eliminering av funktionen att först ta bort alla funktioner vars varians ligger under någon (låg) tröskel.

Utgå från exemplet i dokumentationen , anta att vi börjar med

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

Det finns 3 booleska funktioner här, var och en med 6 instanser. Anta att vi vill ta bort dem som är konstant i minst 80% av fallen. Vissa sannolikhetsberäkningar visar att dessa funktioner måste ha en varians som är lägre än 0,8 * (1 - 0,8) . Följaktligen kan vi använda

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

Lägg märke till hur den första funktionen togs bort.

Denna metod bör användas med försiktighet eftersom en låg variation inte nödvändigtvis betyder att en funktion är "ointressant". Tänk på följande exempel där vi konstruerar ett dataset som innehåller 3 funktioner, de första två består av slumpmässigt fördelade variabler och det tredje av enhetligt fördelade variabler.

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 har den första funktionen tagits bort på grund av dess låga variation, medan den tredje funktionen (det är den mest ointressanta) har bevarats. I det här fallet hade det varit lämpligare att överväga en variationskoefficient eftersom det är oberoende av skalning.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow