2017-09-18 1 views
3

Die Bibliothek imblearn ist eine Bibliothek, die für unsymmetrische Klassifizierungen verwendet wird. Es ermöglicht Ihnen, scikit-learn Schätzer zu verwenden, während Sie die Klassen mit einer Vielzahl von Methoden ausgleichen, von Undersampling über Oversampling bis zu Ensembles.Merkmal Bedeutung mit der Bibliothek "Unausgeglichen-lernen"

Meine Frage ist jedoch, wie kann ich Feature Impotanz des Schätzers nach der Verwendung BalancedBaggingClassifier oder eine andere Sampling-Methode von imblearn bekommen?

from collections import Counter 
from sklearn.datasets import make_classification 
from sklearn.cross_validation import train_test_split 
from sklearn.metrics import confusion_matrix 
from imblearn.ensemble import BalancedBaggingClassifier 
from sklearn.tree import DecisionTreeClassifier 
X, y = make_classification(n_classes=2, class_sep=2,weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0, n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10) 
print('Original dataset shape {}'.format(Counter(y))) 
X_train, X_test, y_train, y_test = train_test_split(X, y,random_state=0) 
bbc = BalancedBaggingClassifier(random_state=42,base_estimator=DecisionTreeClassifier(criterion=criteria_,max_features='sqrt',random_state=1),n_estimators=2000) 
bbc.fit(X_train,y_train) 

Antwort

2

Nicht alle Schätzer in sklearn können Sie Feature Wichtigkeiten erhalten (zum Beispiel BaggingClassifier nicht). Wenn der Schätzer dies tut, sieht es so aus, als ob er nur als estimator.feature_importances_ gespeichert werden sollte, da die imblearn Paketunterklassen aus sklearn Klassen stammen. Ich weiß nicht, welche Schätzer imblearn implementiert hat, so weiß ich nicht, ob es irgendwelche gibt, die feature_importances_ bereitstellen, aber im Allgemeinen sollten Sie das sklearndocumentation für das entsprechende Objekt betrachten, um zu sehen, ob es tut.

Sie können in diesem Fall, Blick auf die Funktion Wichtigkeiten für jede der Schätzer im BalancedBaggingClassifier, wie folgt aus:

for estimator in bbc.estimators_: 
    print(estimator.steps[1][1].feature_importances_) 

Und Sie können über die Schätzer wie dies die mittlere Bedeutung drucken:

print(np.mean([est.steps[1][1].feature_importances_ for est in bbc.estimators_], axis=0)) 
+0

Vielen Dank für die Antwort, aber Iterieren über die Schätzer sogar mit einem feature_importance_ Feature funktioniert nicht. Es führt zu dem folgenden Fehler: "Pipeline" -Objekt hat kein Attribut "feature_importances_" – mamafoku

+0

Ich habe die Lösung für dieses Problem behoben und getestet - es sollte jetzt funktionieren! –

0

Es gibt eine Abkürzung, aber es ist nicht sehr effizient. Die BalancedBaggingClassifier verwendet die RandomUnderSampler nacheinander und passt den Schätzer an die Spitze. Eine For-Schleife mit RandomUnderSampler kann eine Möglichkeit sein, die Pipeline-Methode zu umgehen und dann den Scikit-learn-Estimator direkt aufzurufen. Dies ermöglicht auch bei feature_importance aussehen:

from imblearn.under_sampling import RandomUnderSampler 
rus=RandomUnderSampler(random_state=1) 

my_list=[] 
for i in range(0,10): #random under sampling 10 times 
    X_pl,y_pl=rus.sample(X_train,y_train,) 
    my_list.append((X_pl,y_pl)) #forming tuples from samples 

X_pl=[] 
Y_pl=[] 
for num in range(0,len(my_list)): #Creating the dataframes for input/output 
    X_pl.append(pd.DataFrame(my_list[num][0])) 
    Y_pl.append(pd.DataFrame(my_list[num][1])) 

X_pl_=pd.concat(X_pl) #Concatenating the DataFrames 
Y_pl_=pd.concat(Y_pl) 

RF=RandomForestClassifier(n_estimators=2000,criterion='gini',max_features=25,random_state=1) 
RF.fit(X_pl_,Y_pl_) 
RF.feature_importances_