Python 中的 AdaBoost.M1 和 DecisionTreeClassifier

Posted

技术标签:

【中文标题】Python 中的 AdaBoost.M1 和 DecisionTreeClassifier【英文标题】:AdaBoost.M1 and DecisionTreeClassifier in Python 【发布时间】:2019-08-06 16:49:37 【问题描述】:

我正在尝试使用深度 = 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函数(?)? 谢谢!

【问题讨论】:

您误解了第 3 步;这个想法当然不是将一个整数与分类器本身相乘,而是将整数与分类器的预测相乘 【参考方案1】:

您错误地构造了新的分类器。 作为输出,您需要的是一个函数,而不是一个标量值。你正试图将函数对象乘以 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])

【讨论】:

太好了,谢谢!我得到了最后一行的工作,但你知道如何在 new_classifier 上执行 signum 函数吗?为 AdaBoost 做分类器总和的符号函数有什么意义? 我根据您的建议更新了问题。你知道我该怎么做吗?

以上是关于Python 中的 AdaBoost.M1 和 DecisionTreeClassifier的主要内容,如果未能解决你的问题,请参考以下文章

python中的深拷贝与浅拷贝

python中的*和**的用途

Python中的命名空间和范围

python2和python3中的类

Python中的format()函数

浅谈python中的引用和拷贝问题