Хобрук: Ваш путь к мастерству в программировании

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

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


Новые материалы

Расистский и сексистский робот, обученный в Интернете
Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

Управление состоянием в микрофронтендах
Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

Структуры данных в C ++ - Часть 1
Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

Как я опубликовал свое первое приложение в App Store в 13 лет
Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..

Что в лицо
Очерк о возвращении физиогномики и о том, почему мы должны это приветствовать. История начинается со странной науки. Р. Тора Бьорнсдоттир, Николас О. Рул. Видимость социального класса по..

Почему шаблоны проектирования и почему нет?
Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..