Pemilihan fitur menggunakan fitur penting di hutan acak dengan scikit-belajar

12

Saya telah merencanakan fitur penting di hutan acak dengan scikit-learn . Untuk meningkatkan prediksi menggunakan hutan acak, bagaimana saya bisa menggunakan informasi plot untuk menghapus fitur? Apakah cara menemukan apakah fitur tidak berguna atau bahkan lebih buruk dari kinerja hutan acak, berdasarkan informasi plot? Plot didasarkan pada atribut feature_importances_dan saya menggunakan classifier sklearn.ensemble.RandomForestClassifier.

Saya sadar bahwa ada teknik lain untuk pemilihan fitur , tetapi dalam pertanyaan ini saya ingin fokus pada bagaimana menggunakan fitur feature_importances_.


Contoh plot kepentingan fitur tersebut:

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Franck Dernoncourt
sumber

Jawaban:

14

Anda cukup menggunakan feature_importances_atribut untuk memilih fitur dengan skor kepentingan tertinggi. Jadi misalnya Anda bisa menggunakan fungsi berikut untuk memilih fitur K terbaik sesuai dengan kepentingannya.

def selectKImportance(model, X, k=5):
     return X[:,model.feature_importances_.argsort()[::-1][:k]]

Atau jika Anda menggunakan pipa kelas berikut

class ImportanceSelect(BaseEstimator, TransformerMixin):
    def __init__(self, model, n=1):
         self.model = model
         self.n = n
    def fit(self, *args, **kwargs):
         self.model.fit(*args, **kwargs)
         return self
    def transform(self, X):
         return X[:,self.model.feature_importances_.argsort()[::-1][:self.n]]

Jadi misalnya:

>>> from sklearn.datasets import load_iris
>>> from sklearn.ensemble import RandomForestClassifier
>>> iris = load_iris()
>>> X = iris.data
>>> y = iris.target
>>> 
>>> model = RandomForestClassifier()
>>> model.fit(X,y)
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=None, max_features='auto', max_leaf_nodes=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1,
            oob_score=False, random_state=None, verbose=0,
            warm_start=False)
>>> 
>>> newX = selectKImportance(model,X,2)
>>> newX.shape
(150, 2)
>>> X.shape
(150, 4)

Dan jelas jika Anda ingin dipilih berdasarkan beberapa kriteria selain "fitur top k" maka Anda bisa menyesuaikan fungsinya.

David
sumber
Terima kasih David. Adakah wawasan tentang bagaimana memilih ambang di atas fitur mana yang bermanfaat? (kesampingkan menghapus fitur yang paling tidak berguna, menjalankan RF lagi dan melihat bagaimana hal itu berdampak pada kinerja prediksi)
Franck Dernoncourt
1
Seperti kebanyakan pilihan fitur otomatis, saya katakan kebanyakan orang menggunakan tuning grid. Tetapi menggunakan keahlian domain saat memilih (dan merekayasa) fitur mungkin adalah yang paling berharga - tetapi tidak benar-benar dapat diautomatiskan.
David