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的主要内容,如果未能解决你的问题,请参考以下文章