Fitur penting dengan scikit-learn Random Forest menunjukkan Standar Deviasi yang sangat tinggi

13

Saya menggunakan scikit-learn Random Forest Classifier dan saya ingin merencanakan kepentingan fitur seperti dalam contoh ini .

Namun hasil saya benar-benar berbeda, dalam arti fitur penting standar deviasi hampir selalu lebih besar daripada fitur penting itu sendiri (lihat gambar terlampir).

fitur penting

Mungkinkah memiliki perilaku seperti itu, atau apakah saya melakukan beberapa kesalahan ketika merencanakannya?

Kode saya adalah sebagai berikut:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier()
clf.fit(predictors.values, outcome.values.ravel())

importance = clf.feature_importances_
importance = pd.DataFrame(importance, index=predictors.columns, 
                          columns=["Importance"])

importance["Std"] = np.std([tree.feature_importances_
                            for tree in clf.estimators_], axis=0)

x = range(importance.shape[0])
y = importance.ix[:, 0]
yerr = importance.ix[:, 1]

plt.bar(x, y, yerr=yerr, align="center")

plt.show()
gc5
sumber
IIUC, predictorsmengembalikan numpy arrayyang Anda referensikan ke pandas Dataframeobjek oleh kolomnya yang salah karena numpy arraystidak memiliki atribut columns.
Nickil Maveli
Maaf, itu salah ketik pada kode. prediktor dan hasil adalah dua pandas DataFramedengan bentuk m x ndan m x 1. Itu harus jelas sekarang.
gc5
2
Saya telah menemukan temuan yang sama beberapa waktu lalu. Bisa jadi ini disebabkan oleh kenyataan bahwa sejumlah fitur penting, tetapi karena fitur dapat tinggi atau rendah di pohon keputusan (karena hanya subset acak yang ditawarkan saat membuat pemisahan), kepentingannya sangat bervariasi dari pohon ke pohon. pohon, yang menghasilkan deviasi standar yang tinggi.
Archie
Posting yang bagus, saya mengalami masalah yang sama seperti yang Anda lihat pada gambar. Ada sebuah paket, tsfreshyang membantu saya mengidentifikasi fitur-fitur yang relevan dan memotong fitur saya dari 600+ menjadi sekitar 400. ! [Fitur top 35 saya ] ( i.stack.imgur.com/0MROZ.png ) Bahkan dengan ini algoritma berkinerja baik untuk saya. Saya memiliki klasifikasi biner, sukses / gagal. Saya hampir tidak mendapatkan keberhasilan yang salah, tetapi saya kehilangan sebagian besar kesuksesan. Semua tebakan di atas tampak masuk akal. Bisa jadi perlu ada pelatihan dan pengujian yang lebih besar. Saya memiliki lebih sedikit
pahlawan super

Jawaban:

3

Anda menggunakan RandomForest dengan jumlah pohon default, yaitu 10. Untuk sekitar 30 fitur ini terlalu sedikit. Karena itu standar deviasi besar. Cobalah setidaknya 100 atau bahkan 1000 pohon

clf = RandomForestClassifier(n_estimators=1000)

Untuk analisis yang lebih disempurnakan Anda juga dapat memeriksa seberapa besar korelasi antara fitur Anda.

lanenok
sumber
Maaf lanenok, jumlah pohon bukan yang standar. Saya memberikan kode contoh (dan ini berlaku untuk semua parameter, misalnya min_samples_split) karena saya tidak dapat mengungkapkan data yang sedang saya kerjakan. Namun, apakah karena jumlah pohon, ditambah parameter lain, atau apakah saya melakukan beberapa kesalahan di sini?
gc5
2

Hasil Anda tidak aneh. Seperti yang dinyatakan lanenok , pada langkah pertama Anda harus meningkatkan jumlah pohon untuk memastikan bahwa Anda mendapatkan hasil 'statistik' mengenai fitur penting.

Namun, seperti makalah ini oleh Genuer et al. (2010) menunjukkan, Anda benar-benar dapat menggunakan standar deviasi untuk menghilangkan fitur. Mengutip: " Kita bisa melihat bahwa variabel standar deviasi benar besar dibandingkan dengan variabel berisik satu, yang mendekati nol. "

Archie
sumber
Menggunakan standar deviasi dalam contoh ini untuk menghilangkan fitur akan menghilangkan semua fitur. xD
Jorge Leitao
Haha, saya tidak sepenuhnya yakin, saya pikir Anda bisa dengan aman membuang fitur di paling kanan? Bagaimanapun, poin utama yang saya coba buat adalah bahwa penyimpangan standar tinggi tidak aneh, dan bahwa Anda benar-benar dapat menggunakannya dalam strategi Anda untuk menghilangkan fitur.
Archie
1

Coba clf = RandomForestClassifier(max_features=None). The max_featuresparam default untuk 'auto'yang setara dengan sqrt(n_features). max_featuresdigambarkan sebagai "Jumlah fitur yang perlu dipertimbangkan ketika mencari pemisahan terbaik." Hanya dengan melihat sejumlah kecil fitur di setiap titik di pohon keputusan berarti pentingnya satu fitur dapat sangat bervariasi di banyak pohon. Jadi, jangan melihat subset acak, lihat saja semua fitur di setiap tingkat pohon.

jamis
sumber
1
Perhatikan ini setara dengan pohon kantong polos. "Acak" di hutan acak berarti mempertimbangkan subset fitur secara acak pada setiap pemisahan, biasanya sqrt(n_features)atau log2(n_features). max_features=Nonetidak lagi menganggap subset fitur secara acak . Saya tidak yakin apakah ini mempengaruhi solusi yang diusulkan di atas. Salah satu kemungkinannya adalah banyak fitur hanya memiliki sejumlah besar kepentingan dan karenanya sangat bervariasi di seluruh ansambel pohon. Atau mungkin tidak ada cukup sampel sehingga tidak setiap fitur dipertimbangkan pada saat Anda memukul daun.
jamis
1

Alasan umum untuk ini adalah bahwa parameter yang Anda berikan (atau default) RandomForestClassifiertidak cocok untuk dataset Anda.

Cara umum untuk mengatasi masalah ini adalah dengan mencari ruang hyperparameter menggunakan mis GridSearchCV:

from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score, make_scorer

param_grid = {'n_estimators': [10, 100, 1000], 'max_features': [5, 10, 20, 30]}
clf = GridSearchCV(RandomForestClassifier(), param_grid, cv=5, scoring=make_scorer(accuracy_score))

param_griddi sini adalah permutasi dari parameter yang ingin Anda cari, dan make_scorer(accuracy_score)adalah ukuran yang ingin Anda optimalkan.

Catatan yang accuracy_scorecocok untuk set yang seimbang, tetapi tidak untuk set yang tidak seimbang. Pilih metrik yang sesuai untuk tujuan khusus Anda.

Jorge Leitao
sumber
0

Mungkin ada beberapa alasan. Jumlah pohon dan kedalaman dapat mengubah hasil Anda. Jika model Anda tidak berkinerja baik setelah memilih parameter (validasi silang dll.), Itu mungkin karena fitur Anda tidak terlalu prediktif, sehingga mereka dipetik hampir "secara acak" yang mengarah ke penyimpangan standar tinggi dari pohon ke pohon. Tetapi ada kemungkinan lain, misalnya bisa jadi fitur Anda sangat berkorelasi. Sedikit lebih banyak informasi akan sangat membantu.

oW_
sumber