Как собрать все пути из дерева решений sklearn?
Я пытаюсь сгенерировать все пути из дерева решений в skealrn. estimator
сюда пришли из случайного леса, и это дерево решений в sklearn. Но меня смутила структура данных дерева решений sklearn. Кажется, что left
, right
здесь содержатся все левые узлы.
Когда я попытался распечатать пути, все работает нормально.
def get_code(tree, feature_names, tabdepth=0):
left = tree.tree_.children_left
right = tree.tree_.children_right
threshold = tree.tree_.threshold
features = [feature_names[i] for i in tree.tree_.feature]
value = tree.tree_.value
def recurse(left, right, threshold, features, node, tabdepth=0):
if (threshold[node] != -2):
print ('\t' * tabdepth + "if ( " + features[node] + " <= " + str(threshold[node]) + " ) {")
if left[node] != -1:
recurse (left, right, threshold, features,left[node], tabdepth+1)
print ('\t' * tabdepth + "} else {")
if right[node] != -1:
recurse (left, right, threshold, features,right[node], tabdepth+1)
print ('\t' * tabdepth + "}")
else:
print ('\t' * tabdepth + "return " + str(value[node]))
recurse(left, right, threshold, features, 0)
Но мне нужно собрать все пути в списке, а также не записывать путь, если конечный узел "нормальный", поэтому я попробовал код ниже:
def extract_attack_rules(estimator, feature_names):
left = estimator.tree_.children_left
right = estimator.tree_.children_right
threshold = estimator.tree_.threshold
features = [feature_names[i] for i in estimator.tree_.feature]
value = estimator.tree_.value
def recurse(left, right, threshold, features, node):
path_lst = []
if threshold[node] != -2: # not leaf node
left_cond = features[node]+"<="+str(threshold[node])
right_cond = features[node]+">"+str(threshold[node])
if left[node] != -1: # not leaf node
left_path_lst = recurse(left, right, threshold, features,left[node])
if right[node] != -1: # not leaf node
right_path_lst = recurse(left, right, threshold, features,right[node])
if left_path_lst is not None:
path_lst.extend([left_path.append(left_cond) for left_path in left_path_lst])
if pre_right_path is not None:
path_lst.extend([right_path.append(right_cond) for right_path in right_path_lst])
return path_lst
else: # leaf node, the attack type
if value[node][0][0] > 0: # if leaf is normal, not collect this path
return None
else: # attack
for i in range(len(value[node][0])):
if value[node][0][i] > 0:
return [[value[node][0][i]]]
all_path = recurse(left, right, threshold, features, 0)
return all_path
Он возвращает супер гигантский результат, если не хватает памяти для загрузки, я уверен, что здесь что-то не так, потому что все необходимые пути не должны быть такими большими. Я также попробовал методы здесь: получение пути решения для узла в sklearn, но вывод структуры дерева sklearn только смутил меня больше.
Вы знаете, как решить проблему здесь?