AdaBoost.M1 и DecisionTreeClassifier в Python - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь реализовать следующий псевдокод в python с помощью sklearn DecisionTreeClassifier с глубиной = 1.

Псевдокод для AdaBoost

Однако у меня проблемы с выводом (3). Я сохранил подогнанные классификаторы в списке вместе с соответствующей альфой. Я использую деревья решений из sklearn, и классификатор имеет следующий формат:

DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=1,
            max_features=None, max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, presort=False, random_state=None,
            splitter='best')

Я получаю ошибку в python:

unsupported operand type(s) for *: 'DecisionTreeClassifier' and 'int'

Из моего кода: (Классификаторы - это список с элементами из итераций 0 ... M в формате (Gm (x), errorm, alpham)

   for c in classifiers:
       res += c[2]*c[0]
   res = np.sign(res)

Как я могу умножить целое число на соответствующие классификаторы, а затем суммировать их, чтобы получить окончательный классификатор G (x)? Любая помощь очень ценится.

EDIT:

с линией

new_classifier = lambda x: sum([c[2] * c[0](x) for c in classifiers])

предложенный Иваном Судосом, я получаю объект на форме:

<function adaBoost.<locals>.<lambda> at 0x1233f80d0>

Как можно вызвать функцию signum для этой объектной функции (?)? Спасибо!

1 Ответ

0 голосов
/ 15 марта 2019

Вы неправильно строите новый классификатор. В качестве вывода вам нужна функция , а не скаляр . И вы пытаетесь умножить функцию-объект на int.

Чтобы сделать это, вы можете явно определить функцию в пределах этой итерационной оценки, например:

def new_classifier(x):
   result = 0
   for c in classifiers:
       result += c[2] * c[0](x)
   return result

ИЛИ вы можете определить лямбда-функцию:

new_classifier = lambda x: sum([c[2] * c[0](x) for c in classifiers])
...