Suche…


Low-Varance Feature Entfernung

Dies ist eine sehr grundlegende Feature-Auswahlmethode.

Der Grundgedanke ist, dass ein Feature, wenn es konstant ist (dh eine Varianz von 0 hat), nicht zum Auffinden interessanter Muster verwendet werden kann und aus dem Datensatz entfernt werden kann.

Ein heuristischer Ansatz zur Beseitigung von Merkmalen besteht daher darin, zuerst alle Merkmale zu entfernen, deren Varianz unter einem (niedrigen) Schwellenwert liegt.

Bauen Sie das Beispiel in der Dokumentation auf . Nehmen wir an, wir beginnen mit

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

Es gibt hier 3 boolesche Funktionen mit jeweils 6 Instanzen. Angenommen, wir möchten diejenigen entfernen, die in mindestens 80% der Fälle konstant sind. Einige Wahrscheinlichkeitsrechnungen zeigen, dass diese Merkmale eine Abweichung von weniger als 0,8 * (1 - 0,8) aufweisen müssen . Folglich können wir verwenden

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

Beachten Sie, wie das erste Feature entfernt wurde.

Diese Methode sollte mit Vorsicht angewendet werden, da eine geringe Varianz nicht unbedingt bedeutet, dass eine Funktion "uninteressant" ist. Betrachten Sie das folgende Beispiel, in dem wir ein Dataset erstellen, das 3 Features enthält. Die ersten beiden bestehen aus zufällig verteilten Variablen und die dritten aus gleichmäßig verteilten Variablen.

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

Nun wurde das erste Feature aufgrund seiner geringen Varianz entfernt, während das dritte Feature (das ist das uninteressanteste) beibehalten wurde. In diesem Fall wäre es sinnvoller gewesen, einen Variationskoeffizienten zu berücksichtigen, da er unabhängig von der Skalierung ist.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow