Ricerca…


Rimozione delle caratteristiche di bassa varianza

Questa è una tecnica di selezione delle caratteristiche molto semplice.

L'idea alla base è che se una caratteristica è costante (cioè ha 0 varianza), non può essere utilizzata per trovare modelli interessanti e può essere rimossa dal set di dati.

Di conseguenza, un approccio euristico all'eliminazione delle feature consiste nel rimuovere prima tutte le feature la cui varianza è al di sotto di una soglia (bassa).

Costruendo l' esempio nella documentazione , supponiamo di iniziare

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

Ci sono 3 funzioni booleane qui, ognuna con 6 istanze. Supponiamo di voler rimuovere quelli che sono costanti in almeno l'80% delle istanze. Alcuni calcoli di probabilità mostrano che queste caratteristiche dovranno avere una varianza inferiore a 0.8 * (1 - 0.8) . Di conseguenza, possiamo usare

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

Nota come è stata rimossa la prima caratteristica.

Questo metodo dovrebbe essere usato con cautela perché una bassa varianza non significa necessariamente che una caratteristica sia "poco interessante". Considera il seguente esempio in cui costruiamo un set di dati che contiene 3 funzioni, le prime due consistono in variabili distribuite casualmente e la terza in variabili uniformemente distribuite.

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

Ora la prima funzione è stata rimossa a causa della sua bassa varianza, mentre la terza caratteristica (che è la più poco interessante) è stata mantenuta. In questo caso sarebbe stato più appropriato considerare un coefficiente di variazione perché questo è indipendente dal ridimensionamento.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow