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).
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()
predictors
mengembalikannumpy array
yang Anda referensikan kepandas Dataframe
objek oleh kolomnya yang salah karenanumpy arrays
tidak memiliki atributcolumns
.pandas DataFrame
dengan bentukm x n
danm x 1
. Itu harus jelas sekarang.tsfresh
yang 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 sedikitJawaban:
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
Untuk analisis yang lebih disempurnakan Anda juga dapat memeriksa seberapa besar korelasi antara fitur Anda.
sumber
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?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. "
sumber
Coba
clf = RandomForestClassifier(max_features=None)
. Themax_features
param default untuk'auto'
yang setara dengansqrt(n_features)
.max_features
digambarkan 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.sumber
sqrt(n_features)
ataulog2(n_features)
.max_features=None
tidak 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.Alasan umum untuk ini adalah bahwa parameter yang Anda berikan (atau default)
RandomForestClassifier
tidak cocok untuk dataset Anda.Cara umum untuk mengatasi masalah ini adalah dengan mencari ruang hyperparameter menggunakan mis
GridSearchCV
:param_grid
di sini adalah permutasi dari parameter yang ingin Anda cari, danmake_scorer(accuracy_score)
adalah ukuran yang ingin Anda optimalkan.Catatan yang
accuracy_score
cocok untuk set yang seimbang, tetapi tidak untuk set yang tidak seimbang. Pilih metrik yang sesuai untuk tujuan khusus Anda.sumber
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.
sumber