Mengidentifikasi fitur yang difilter setelah pemilihan fitur dengan scikit belajar


10

Ini kode saya untuk metode pemilihan fitur dengan 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)

Tetapi setelah mendapatkan X baru (variabel dependen - X_new), Bagaimana saya tahu variabel mana yang dihapus dan variabel mana yang dipertimbangkan dalam variabel baru yang diperbarui ini? (yang satu dihapus atau yang tiga hadir dalam data.)

Alasan mendapatkan identifikasi ini adalah untuk menerapkan pemfilteran yang sama pada data uji baru.

Jawaban:


6

Ada dua hal yang dapat Anda lakukan:

  • Periksa coef_param dan deteksi kolom mana yang diabaikan
  • Gunakan model yang sama untuk input transformasi data menggunakan metode transform

Modifikasi kecil untuk contoh Anda

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

Seperti yang Anda lihat metode transformmelakukan semua pekerjaan untuk Anda. Dan juga dari coef_matriks Anda dapat melihat kolom terakhir hanya vektor nol, sehingga Anda mengabaikan model kolom terakhir dari data


Hai, Bagaimana saya bisa mengidentifikasi nama kolom X_train_new. Apakah ada fungsi?
Vignesh Prajapati

1
Mereka berada dalam urutan yang sama seperti pada set data input. iris.feature_names
itdxer

Iya. Nya. Saya bingung di sini. Itu dalam urutan yang sama. Tetapi bagaimana saya mendapatkan nama mereka karena beberapa kolom telah diabaikan. Jadi, saya tidak bisa mendapatkan kolom khusus yang dipilih saat proses ini. Bisakah Anda membantu saya dalam hal ini!
Vignesh Prajapati

Apakah Anda memeriksa metode feature_namesdalam irisvariabel? Ini bekerja dengan baik untuk saya.
itdxer

12

Atau, jika Anda menggunakan SelectFromModel untuk pemilihan fitur setelah menyesuaikan SVC Anda, Anda dapat menggunakan metode instance get_support. Ini mengembalikan array boolean memetakan pemilihan setiap fitur. Selanjutnya gabungkan ini dengan array nama fitur asli, dan kemudian filter pada status boolean untuk menghasilkan set nama fitur yang dipilih yang relevan.

Semoga ini membantu pembaca masa depan yang juga berjuang untuk menemukan cara terbaik untuk mendapatkan nama fitur yang relevan setelah pemilihan fitur.

Contoh:

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
Ini harus diterima
user0

5

Berdasarkan solusi @chinnychinchin, saya biasanya melakukan:

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

yang mengembalikan sesuatu seperti:

Index([u'feature1', u'feature2', u'feature',
  u'feature4'],
  dtype='object')
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.