Identificación de características filtradas después de la selección de características con scikit learn

10

Aquí está mi Código para el método de selección de características en Python:

from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target
X.shape
(150, 4)
X_new = LinearSVC(C=0.01, penalty="l1", dual=False).fit_transform(X, y)
X_new.shape
(150, 3)

Pero después de obtener una nueva X (variable dependiente - X_nuevo), ¿cómo sé qué variables se eliminan y qué variables se consideran en esta nueva variable actualizada? (cuál eliminó o cuáles tres están presentes en los datos).

La razón para obtener esta identificación es aplicar el mismo filtro en los nuevos datos de prueba.

Vignesh Prajapati
fuente

Respuestas:

6

Hay dos cosas que puedes hacer:

  • Verifique el coef_parámetro y detecte qué columna fue ignorada
  • Use el mismo modelo para la transformación de datos de entrada usando el método transform

Pequeñas modificaciones para tu ejemplo

>>> from sklearn.svm import LinearSVC
>>> from sklearn.datasets import load_iris
>>> from sklearn.cross_validation import train_test_split
>>>
>>> iris = load_iris()
>>> x_train, x_test, y_train, y_test = train_test_split(
...     iris.data, iris.target, train_size=0.7
... )
>>>
>>> svc = LinearSVC(C=0.01, penalty="l1", dual=False)
>>>
>>> X_train_new = svc.fit_transform(x_train, y_train)
>>> print(X_train_new.shape)
(105, 3)
>>>
>>> X_test_new = svc.transform(x_test)
>>> print(X_test_new.shape)
(45, 3)
>>>
>>> print(svc.coef_)
[[ 0.          0.10895557 -0.20603044  0.        ]
 [-0.00514987 -0.05676593  0.          0.        ]
 [ 0.         -0.09839843  0.02111212  0.        ]]

Como ve el método, transformhaga todo el trabajo por usted. Y también desde la coef_matriz puede ver que la última columna es solo un vector cero, por lo que el modelo ignora la última columna de los datos

itdxer
fuente
Hola, ¿cómo puedo identificar los nombres de columna de X_train_new? ¿Hay alguna función?
Vignesh Prajapati
1
Están en el mismo orden que en el conjunto de datos de entrada. iris.feature_names
itdxer
Si. Sus. Estoy confundido aquí. Está en el mismo orden. Pero, ¿cómo obtengo sus nombres porque algunas de las columnas han sido ignoradas? Por lo tanto, no puedo obtener esas columnas específicas que se seleccionaron durante este proceso. ¡Puedes por favor ayudarme en esto!.
Vignesh Prajapati
¿Verificaste el método feature_namesen irisvariable? Funciona bien para mí.
itdxer
12

Alternativamente, si usa SelectFromModel para la selección de características después de ajustar su SVC, puede usar el método de instancia get_support. Esto devuelve una matriz booleana que asigna la selección de cada característica. A continuación, únase a esto con una matriz de nombres de características originales y luego filtre los estados booleanos para producir el conjunto de nombres de características seleccionadas relevantes.

Espero que esto ayude a los futuros lectores que también tuvieron dificultades para encontrar la mejor manera de obtener nombres de funciones relevantes después de la selección de funciones.

Ejemplo:

lsvc = LinearSVC(C=0.01, penalty="l1", dual=False,max_iter=2000).fit(X, y) 
model = sk.SelectFromModel(lsvc, prefit=True) 
X_new = model.transform(X) 
print(X_new.shape) 
print(model.get_support()) 
chinnychinchin
fuente
55
Esto debe ser aceptado
usuario0
5

Basado en la solución @chinnychinchin, generalmente hago:

lsvc = LinearSVC(C=0.01, penalty="l1", dual=False,max_iter=2000).fit(X, y) 
model = sk.SelectFromModel(lsvc, prefit=True) 
X_new = model.transform(X) 
print(X.columns[model.get_support()]) 

que devuelve algo como:

Index([u'feature1', u'feature2', u'feature',
  u'feature4'],
  dtype='object')
ruloweb
fuente