Scikit-learn ile özellik önemi Rastgele Orman çok yüksek Standart Sapma gösterir


13

Ben kullanıyorum Rastgele Orman Sınıflandırıcı scikit-öğrenme ve böyle olduğu gibi özellik önem çizmek istiyorum bu örnekte .

Ancak benim sonucum tamamen farklıdır, çünkü özellik önemi standart sapmanın neredeyse her zaman özellik öneminden daha büyüktür (bkz. Ekli resim).

özellik önemi

Böyle bir davranışa sahip olmak mümkün mü, ya da onu çizerken bazı hatalar mı yapıyorum?

Kodum şudur:

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

IIUC, özniteliğe sahip olmadığı için yanlış olan bir nesneye sütunları ile başvurduğunuz bir nesneyi predictorsdöndürür . numpy arraypandas Dataframenumpy arrayscolumns
Nickil Maveli

Üzgünüz, kod üzerinde bir yazım hatasıydı. yordayıcılar ve sonuç pandas DataFrameşekil m x nve m x 1. Şimdi açık olmalı.
gc5

2
Bir süre önce aynı bulgularla karşılaştım. Bunun nedeni, bir dizi özelliğin önemli olmasından kaynaklanıyor olabilir, ancak karar ağacında özellikler yüksek veya düşük olabileceğinden (bölünme yaparken yalnızca rastgele bir alt küme sunulduğu için) önemleri ağaçtan ağaç, yüksek standart sapma ile sonuçlanır.
Archie

Harika gönderi, resimde gördüğünüz gibi aynı sorunla karşılaştım. tsfreshİlgili özellikleri tanımlamama ve özellikleri 600+'dan 400'e düşürmeme yardımcı olan bir paket var . ! [En iyi 35 özelliğim ] ( i.stack.imgur.com/0MROZ.png ) Bununla bile algoritma iyi performans gösteriyor benim için. Bir ikili sınıflandırma, başarı / başarısızlık var. Neredeyse yanlış bir başarı elde edemiyorum ama büyük bir başarı yüzdesini özlüyorum. Yukarıdaki tüm tahminler makul görünüyor. Daha büyük bir eğitim ve test seti olması gerekebilir. Daha
süper kahraman

Yanıtlar:


3

Varsayılan ağaç sayısı 10 olan RandomForest kullanıyorsunuz. Yaklaşık 30 özellik için bu çok az. Bu nedenle standart sapma büyüktür. En az 100 hatta 1000 ağacı deneyin.

clf = RandomForestClassifier(n_estimators=1000)

Daha rafine bir analiz için özellikleriniz arasındaki ilişkinin ne kadar büyük olduğunu da kontrol edebilirsiniz.


Üzgünüm lanenok, ağaç sayısı varsayılan değil. min_samples_splitÜzerinde çalıştığım verileri açıklayamadığım için bir örnek kod koymak (ve bu, tüm parametreler için geçerlidir ). Ancak, ağaç sayısı ve diğer parametreler nedeniyle mi yoksa burada bazı hatalar mı yapıyorum?
gc5

2

Sonuç o kadar da garip değil. Lanenok'un belirttiği gibi, özellik adımlarıyla ilgili 'istatistiksel' bir sonuç elde ettiğinizden emin olmak için ilk adımda ağaç sayısını artırmalısınız.

Bununla birlikte, bu şekilde bir kağıt Genuer et al. (2010), özellikleri ortadan kaldırmak için standart sapmaları kullanabileceğinizi göstermektedir. Alıntılamak için: " Gerçek değişkenlerin standart sapmanın, sıfıra yakın olan gürültülü değişkenlere kıyasla büyük olduğunu görebiliriz. "


Bu örnekte özellikleri ortadan kaldırmak için standart sapmayı kullanmak tüm özellikleri ortadan kaldıracaktır . xD
Jorge Leitao

Haha, tam olarak emin değilim, sanırım en sağdaki özellikleri güvenle atabilirsin? Her neyse, yapmaya çalıştığım ana nokta, yüksek standart sapmaların o kadar garip olmadığı ve bunları stratejinizi kullanarak özellikleri ortadan kaldırmak için kullanabileceğinizdir.
Archie

1

Deneyin clf = RandomForestClassifier(max_features=None). max_featuresParam varsayılan için 'auto'olan eşdeğerdir sqrt(n_features). max_features"En iyi ayrımı ararken göz önünde bulundurulması gereken özellik sayısı" olarak tanımlanır. Karar ağacının herhangi bir noktasında sadece az sayıda özelliğe bakmak, tek bir özelliğin öneminin birçok ağaçta büyük ölçüde değişebileceği anlamına gelir. Bu nedenle, rastgele bir alt kümeye bakmayın, sadece ağacın her seviyesindeki tüm özelliklere bakın.


1
Bunun düz torbalı ağaçlara eşdeğer olduğunu unutmayın. Rasgele ormanlardaki "rasgele", her bir bölünmedeki özelliklerin rasgele bir alt kümesini, genellikle sqrt(n_features)veya log2(n_features). max_features=Noneartık özelliklerin rastgele bir alt kümesini dikkate almamaktadır . Bunun yukarıda önerilen çözümü etkileyip etkilemediğinden emin değilim. Bir olasılık, birçok özelliğin çok büyük bir öneme sahip olması ve bu nedenle ağaç topluluğu arasında büyük farklılıklar göstermesidir. Ya da belki yeterli örnek yoktur ve bu nedenle her özellik bir yaprağa çarptığınız zaman dikkate alınmaz.
jamis

1

Bunun yaygın bir nedeni, sağladığınız (veya varsayılan) parametrelerin RandomForestClassifierveri kümeniz için uygun olmamasıdır.

Bu sorunu ele almanın yaygın bir yolu, hiperparametre boşluğunu örneğin kullanarak aramaktır 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_gridİşte aramak istediğiniz parametrelerin permütasyonları ve make_scorer(accuracy_score)optimize etmek istediğiniz ölçü.

accuracy_scoreDengeli setler için uygun olduğunu , ancak dengesiz setler için uygun olmadığını unutmayın . Özel hedefinize uygun bir metrik seçin.


0

Birden fazla neden olabilir. Ağaç sayısı ve derinlik sonuçlarınızı değiştirebilir. Modeliniz parametreleri seçtikten sonra iyi performans göstermiyorsa (çapraz doğrulama vb.), Muhtemelen özellikleriniz çok öngörücü olmadığından, ağaçtan ağaca yüksek standart sapmalara neden olan neredeyse "rastgele" seçilirler. Ancak başka olasılıklar da vardır, örneğin, özelliklerinizin yüksek derecede korelasyonlu olması da olabilir. Biraz daha fazla bilgi yardımcı olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.