Как собрать все пути из дерева решений sklearn? - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь сгенерировать все пути из дерева решений в 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 только смутил меня больше.

Знаете ли вы, как решить эту проблему здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...