/ / Ścieżka decyzyjna dla losowego klasyfikatora lasu - python, nauka maszynowa, nauka scikit

Ścieżka decyzyjna dla losowego klasyfikatora lasu - python, nauka maszynowa, nauka scikit

Oto mój kod do uruchomienia w twoim środowisku, używam RandomForestClassifier i próbuję dowiedzieć się ścieżka decyzyjna dla wybranej próbki w losowym klasyfikatorze lasu

import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier

X, y = make_classification(n_samples=1000,
n_features=6,
n_informative=3,
n_classes=2,
random_state=0,
shuffle=False)

# Creating a dataFrame
df = pd.DataFrame({"Feature 1":X[:,0],
"Feature 2":X[:,1],
"Feature 3":X[:,2],
"Feature 4":X[:,3],
"Feature 5":X[:,4],
"Feature 6":X[:,5],
"Class":y})


y_train = df["Class"]
X_train = df.drop("Class",axis = 1)

rf = RandomForestClassifier(n_estimators=50,
random_state=0)

rf.fit(X_train, y_train)

Najdalej mam to

#Extracting the decision path for instance i = 12
i_data = X_train.iloc[12].values.reshape(1,-1)
d_path = rf.decision_path(i_data)

print(d_path)

a wyjście nie ma większego sensu

(<1x7046 rzadka macierz typu „” z 486 zapisanymielementy w formacie skompresowanego rzadkiego wiersza>, tablica ([0, 133, 282, 415, 588, 761, 910, 1041, 1182, 1309, 1432, 1569, 1728, 1869, 2000, 2143, 2284, 2419, 2572, 2711, 2856, 2987, 3128, 3261, 3430, 3549, 3704, 3839, 3980, 4127, 4258, 4389, 4534, 4671, 4808, 4947, 5088, 5247, 5378, 5517, 5640, 5769, 5956, 6079, 6226, 6385, 6524, 6655, 6780, 6925, 7046], dtype = int32))

Próbuję ustalić ścieżkę decyzyjną dla próbki cząstek w ramce danych. Czy ktoś może mi powiedzieć, jak to zrobić?

Chodzi o to, żeby mieć coś takiego

http://scikit-learn.org/stable/auto_examples/tree/plot_unveil_tree_structure.html

Odpowiedzi:

3 dla odpowiedzi № 1

RandomForestClassifier.decision_path metoda zwraca a tuple z (indicator, n_nodes_ptr). zobacz dokumentację: tutaj

Więc twoja zmienna node_indicator to krotka, a nie to, co myślisz. Obiekt krotki nie ma atrybutu „indeksy”, dlatego pojawia się błąd podczas wykonywania:

node_index = node_indicator.indices[node_indicator.indptr[sample_id]:
node_indicator.indptr[sample_id + 1]]

próbować :

(node_indicator, _) = rf.decision_path(X_train)

Można także wykreślić drzewo decyzyjne każdego drzewa lasu dla pojedynczego identyfikatora próbki:

X_train = X_train.values

sample_id = 0

for j, tree in enumerate(rf.estimators_):

n_nodes = tree.tree_.node_count
children_left = tree.tree_.children_left
children_right = tree.tree_.children_right
feature = tree.tree_.feature
threshold = tree.tree_.threshold

print("Decision path for DecisionTree {0}".format(j))
node_indicator = tree.decision_path(X_train)
leave_id = tree.apply(X_train)
node_index = node_indicator.indices[node_indicator.indptr[sample_id]:
node_indicator.indptr[sample_id + 1]]



print("Rules used to predict sample %s: " % sample_id)
for node_id in node_index:
if leave_id[sample_id] != node_id:
continue

if (X_train[sample_id, feature[node_id]] <= threshold[node_id]):
threshold_sign = "<="
else:
threshold_sign = ">"

print("decision id node %s : (X_train[%s, %s] (= %s) %s %s)"
% (node_id,
sample_id,
feature[node_id],
X_train[sample_id, feature[node_id]],
threshold_sign,
threshold[node_id]))

Zauważ, że w twoim przypadku masz 50 estymatorów, więc czytanie może być trochę nudne.