2

Der Entscheidungsbaum und die wichtigen Funktionen können leicht abgerufen werden, wenn DecisionTreeClassifier in scikit learn verwendet wird. Ich bin jedoch nicht in der Lage, keine von ihnen zu erhalten, wenn ich und Absackfunktion, z. B. BaggingClassifier.Druckentscheidungsbaum und feature_importance bei Verwendung von BaggingClassifier

Da wir das Modell mit dem BaggingClassifier anpassen müssen, kann ich die Ergebnisse (drucke die Bäume (Graphen), feature_importances_, ...), die sich auf den DecisionTreeClassifier beziehen, nicht zurückgeben.

Hier ist mein Skript:

seed = 7 
n_iterations = 199 
DTC = DecisionTreeClassifier(random_state=seed, 
               max_depth=None, 
               min_impurity_split= 0.2, 
               min_samples_leaf=6, 
               max_features=None, #If None, then max_features=n_features. 
               max_leaf_nodes=20, 
               criterion='gini', 
               splitter='best', 
               ) 

#parametersDTC = {'max_depth':range(3,10), 'max_leaf_nodes':range(10, 30)} 
parameters = {'max_features':range(1,200)} 
dt = RandomizedSearchCV(BaggingClassifier(base_estimator=DTC, 
           #max_samples=1, 
           n_estimators=100, 
           #max_features=1, 
           bootstrap = False, 
           bootstrap_features = True, random_state=seed), 
         parameters, n_iter=n_iterations, n_jobs=14, cv=kfold, 
         error_score='raise', random_state=seed, refit=True) #min_samples_leaf=10 

# Fit the model 

fit_dt= dt.fit(X_train, Y_train) 
print(dir(fit_dt)) 
tree_model = dt.best_estimator_ 

# Print the important features (NOT WORKING) 

features = tree_model.feature_importances_ 
print(features) 

rank = np.argsort(features)[::-1] 
print(rank[:12]) 
print(sorted(list(zip(features)))) 

# Importing the image (NOT WORKING) 
from sklearn.externals.six import StringIO 

tree.export_graphviz(dt.best_estimator_, out_file='tree.dot') # necessary to plot the graph 

dot_data = StringIO() # need to understand but it probably relates to read of strings 
tree.export_graphviz(dt.best_estimator_, out_file=dot_data, filled=True, class_names= target_names, rounded=True, special_characters=True) 
graph = pydotplus.graph_from_dot_data(dot_data.getvalue()) 

img = Image(graph.create_png()) 
print(dir(img)) # with dir we can check what are the possibilities in graph.create_png 

with open("my_tree.png", "wb") as png: 
    png.write(img.data) 

I erhalten erros wie: 'BaggingClassifier' Objekt hat kein Attribut 'TREE_' und 'BaggingClassifier' Objekt hat kein Attribut 'feature_importances'. Weiß jemand wie ich sie bekommen kann? Vielen Dank.

+0

Mögliche Duplikate von [Feature importances - Bagging, scikit-lernen] (https://stackoverflow.com/questions/44333573/feature-importances-bagging-scik-learn) –

+1

@MikhailKorobov das ist kein Duplikat der Frage in der Verbindung. Die Frage in dem Link diskutiert nur das Attribut feature_importance, während das OP daran interessiert ist, auch auf die Bäume selbst zuzugreifen. –

Antwort

2

Basierend auf the documentation hat das BaggingClassifier-Objekt in der Tat nicht das Attribut 'feature_importances'. Man könnte es immer noch selbst berechnen, wie in der Antwort auf diese Frage beschrieben: Feature importances - Bagging, scikit-learn

Sie können die Bäume zugreifen, die bei der Montage von BaggingClassifier mit dem Attribut estimators_, wie im folgenden Beispiel hergestellt wurden:

from sklearn import svm, datasets 
from sklearn.model_selection import GridSearchCV 
from sklearn.ensemble import BaggingClassifier 


iris = datasets.load_iris() 
clf = BaggingClassifier(n_estimators=3) 
clf.fit(iris.data, iris.target) 
clf.estimators_ 

clf.estimators_ ist eine Liste der 3 ausgestatteten Entscheidungsbäume:

[DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None, 
      max_features=None, max_leaf_nodes=None, 
      min_impurity_split=1e-07, min_samples_leaf=1, 
      min_samples_split=2, min_weight_fraction_leaf=0.0, 
      presort=False, random_state=1422640898, splitter='best'), 
DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None, 
      max_features=None, max_leaf_nodes=None, 
      min_impurity_split=1e-07, min_samples_leaf=1, 
      min_samples_split=2, min_weight_fraction_leaf=0.0, 
      presort=False, random_state=1968165419, splitter='best'), 
DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None, 
      max_features=None, max_leaf_nodes=None, 
      min_impurity_split=1e-07, min_samples_leaf=1, 
      min_samples_split=2, min_weight_fraction_leaf=0.0, 
      presort=False, random_state=2103976874, splitter='best')] 

So können Sie über die Liste durchlaufen und jedes der Bäume zugreifen.

+0

danke @Miriam Farber Mit einer Liste der Entscheidungsbäume, wenn ich die Bäume mit meinem Skript oben (Bild importieren) drucken möchte, sollte ich jeden Entscheidungsbaum mit den Parametern in der Liste getrennt ausführen? –

+1

@MauroNogueira Ja. Sie müssen die Parameter jedoch nicht kopieren, Sie können einfach "for t in clf.estimators_:" ausführen und dann innerhalb der Schleife den Code ausführen, den Sie zuvor für einen Zeichenbaum verwendet haben. Jedes der "t" in der Schleife ist ein angepasster Entscheidungsbaum. –

+0

Ich habe das ausprobiert, aber ich habe Fehler mit dem export_gaphviz, wie ‚Liste‘ Objekt hat kein Attribut ‚TREE_‘ für t in dt.estimators_: export_graphviz (dt.estimators_, out_file ‚tree.dot‘ = ) dot_data = StringIO() lesen von Strings export_graphviz (dt.estimators_, out_file = dot_data, gefüllt = True, class_names = target_names, gerundet = True, special_characters = True) graph = pydotplus.graph_from_dot_data (dot_data.getvalue()) img = Bild (graph.create_png()) print (dir (img)) mit open ("HDAC8_tree.png", "wb") als png: png.write (img.data) –

Verwandte Themen