Scikit Learn ile özellik seçiminden sonra filtrelenmiş özellikleri belirleme


10

İşte benim Python özellik seçim yöntemi için Kod :

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)

Ancak yeni X (bağımlı değişken - X_new) aldıktan sonra, bu yeni güncellenen değişkente hangi değişkenlerin kaldırıldığını ve hangi değişkenlerin dikkate alındığını nasıl bilebilirim? (hangisi kaldırılmış veya hangisi verilerde mevcut.)

Bu tanımlamayı almanın nedeni, aynı filtrelemeyi yeni test verilerine uygulamaktır.

Yanıtlar:


6

Yapabileceğiniz iki şey var:

  • coef_Parametreyi kontrol edin ve hangi sütunun yoksayıldığını tespit edin
  • Yöntemi kullanarak giriş veri dönüşümü için aynı modeli kullanın transform

Örneğiniz için küçük değişiklikler

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

Gördüğünüz gibi yöntem sizin için transformtüm işleri yapın. Ayrıca coef_matristen son sütunun sadece sıfır vektör olduğunu görebilirsiniz, böylece modeldeki verilerden son sütunu yoksay


Merhaba, X_train_new sütun adlarını nasıl belirleyebilirim. Herhangi bir işlevi var mı?
Vignesh Prajapati

1
Giriş veri kümesindekiyle aynı sıradadırlar. iris.feature_names
itdxer

Evet. Onun. Burada kafam karıştı. Aynı sırada. Ancak bazı sütunlar yoksayıldığından adlarını nasıl alabilirim? Bu nedenle, bu işlem sırasında seçilen belirli sütunları alamıyorum. Lütfen bana bu konuda yardım edebilir misin !.
Vignesh Prajapati

Eğer yöntemini kontrol ettin feature_namesiçinde irisdeğişken? Benim için iyi çalışıyor.
itdxer

12

Alternatif olarak, SVC'nizi taktıktan sonra özellik seçimi için SelectFromModel kullanıyorsanız, örnek yöntemini kullanabilirsiniz get_support. Bu, her özelliğin seçimini eşleyen bir boole dizisi döndürür. Daha sonra bunu orijinal bir özellik adları dizisiyle birleştirin ve ardından seçilen ilgili özelliklerin adlarını oluşturmak için boole durumlarına filtre uygulayın.

Umarım bu, özellik seçiminden sonra ilgili özellik adlarını almanın en iyi yolunu bulmak için mücadele eden gelecekteki okuyuculara yardımcı olur.

Misal:

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

5
Bu kabul edilmelidir
user0

5

@Chinnychinchin çözümüne dayanarak, genellikle şunu yaparım:

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

hangi gibi bir şey döndürür:

Index([u'feature1', u'feature2', u'feature',
  u'feature4'],
  dtype='object')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.