Ниже приведен упрощенный пример дерева решений (dict()
), которое я обучал на Python:
tree= {'Age': {'> 55': 0.4, '< 18': {'Income': {'high': 0, 'low': 0.2}},
'18-35': 0.25, '36-55': {'Marital_Status': {'single': {'Income':
{'high': 0, 'low': 0.1}}, 'married': 0.05}}}}
Числа в листовых узлах (поля) представляют вероятность появления метки класса (например, TRUE) в этом узле. Визуально дерево выглядит так:
Я пытаюсь написать общий алгоритм постобрезки, который объединяет узлы со значениями меньше 0.3
в их родительские узлы. Таким образом, результирующее дерево с порогом 0.3
будет выглядеть следующим образом:
Обратите внимание, что на втором рисунке узел Income
в Age<18
теперь объединен с корневым узлом Age
. И Age=36-55, Marital_Staus
был объединен в Age
, поскольку сумма всех его листовых узлов (на нескольких уровнях) меньше 0,3.
Это неполный псевдокод, который я придумал (пока):
def post_prune (dictionary, threshold):
for k in dictionary.keys():
if isinstance(dictionary[k], dict): # interim node
post_prune(dictionary[k], threshold)
else: # leaf node
if dictionary[k]> threshold:
pass
else:
to_do = 'delete this node'
Хотел опубликовать вопрос, так как я чувствую, что это должно было быть решено много раз.
Спасибо.
P.S: Я не буду использовать конечный результат для классификации, так что такая обрезка (косметически) работает.
self.post_prune(dictionary[k], threshold)
Это метод класса? Затем вы должны добавить параметрself
в сигнатуру метода. - person tobias_k   schedule 11.07.2014