Identificando recursos filtrados após a seleção de recursos com o scikit learn

10

Aqui está o meu código para o método de seleção de recursos em 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)

Mas depois de obter o novo X (variável dependente - X_new), como sei quais variáveis ​​são removidas e quais são consideradas nessa nova variável atualizada? (qual remove ou quais três estão presentes nos dados.)

O motivo de obter essa identificação é aplicar a mesma filtragem nos novos dados de teste.

Vignesh Prajapati
fonte

Respostas:

6

Há duas coisas que você pode fazer:

  • Verifique os coef_parâmetros e detecte qual coluna foi ignorada
  • Use o mesmo modelo para transformação de dados de entrada usando o método transform

Pequenas modificações para o seu exemplo

>>> 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 você vê, o método transformfaz todo o trabalho por você. E também a partir da coef_matriz, você pode ver a última coluna apenas com um vetor zero, para modelar ignorar a última coluna dos dados

itdxer
fonte
Olá, Como posso identificar os nomes de colunas de X_train_new. Existe alguma função?
Vignesh Prajapati
11
Eles estão na mesma ordem que no conjunto de dados de entrada. iris.feature_names
itdxer
Sim. Está. Estou confuso aqui. Está na mesma ordem. Mas como obtenho seus nomes porque algumas das colunas foram ignoradas. Portanto, não consigo obter as colunas específicas que foram selecionadas durante esse processo. Você pode me ajudar com isso!
Vignesh Prajapati
Você verificou o método feature_namesna irisvariável? Isso funciona bem para mim.
precisa saber é o seguinte
12

Alternativamente, se você usar SelectFromModel para seleção de recursos após ajustar a SVC, você pode usar o método de instância get_support. Isso retorna uma matriz booleana que mapeia a seleção de cada recurso. Em seguida, junte-o a uma matriz de nomes de recursos originais e filtre os status booleanos para produzir o conjunto de nomes de recursos selecionados relevantes.

Espero que isso ajude os futuros leitores que também lutaram para encontrar a melhor maneira de obter nomes de recursos relevantes após a seleção dos recursos.

Exemplo:

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
fonte
5
Isso deve ser aceito
user0
5

Com base na solução @chinnychinchin, costumo fazer:

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 retorna algo como:

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