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.

Vignesh Prajapati
sumber

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

itdxer
sumber
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()) 
chinnychinchin
sumber
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')
ruloweb
sumber