Python中的AdaBoost.M1和DecisionTreeClassifier

时间:2019-03-15 15:01:59

标签: python machine-learning classification decision-tree adaboost

我正在尝试使用深度为1的sklearn DecisionTreeClassifier在python中实现以下伪代码。

Pseudocode for AdaBoost

但是,我在输出(3)时遇到了麻烦。 我已经将适合的分类器与相应的alpha一起存储在列表中。我正在使用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)

如何将一个int与相应的分类器相乘,然后将它们求和以获得最终分类器G(x)? 非常感谢您的帮助。

编辑:

与线

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

由ИванСудос建议,我在表单上得到一个对象:

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

如何在此对象函数(?)上调用signum函数? 谢谢!

1 个答案:

答案 0 :(得分:0)

您错误地构造了新的分类器。 输出所需的是功能,而不是标量。而且您正在尝试将函数对象乘以int。

为此,您可以在此迭代得分内明确定义函数,例如:

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

或者您可以定义lambda函数:

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