如何将几个弱学习器组合成一个强分类器?我知道公式,但问题是在我读过的每篇关于 AdaBoost 的论文中,只有公式没有任何示例。我的意思是 - 我的学习者和他们的权重很弱,所以我可以按照公式告诉我的去做(将学习者乘以它的权重,再加上另一个乘以它的权重,再加上一个等等),但我该怎么做呢?我的弱学习者是决策树桩。他们得到了属性和阈值,那么我要乘什么?
2 回答
如果我正确理解了您的问题,那么您可以很好地解释提升如何将弱分类器集成到具有大量图像的强分类器中:
www.csc.kth.se/utbildning/kth/kurser/DD2427/bik12/DownloadMaterial/Lectures/Lecture8.pdf
基本上你是通过分离超平面的加权组合来创建一个更复杂的决策表面(在讲义中显示的很棒的图)
希望这可以帮助。
编辑
要实际做到这一点:
在第 42 页中,您会看到alpha_t = 1/2*ln((1-e_t)/e_t)
可以在 for 循环中轻松计算的公式,或者如果您正在使用一些数字库(我正在使用非常棒的 numpy)直接通过向量运算。alpha_t
是在 adaboost 内部计算的,所以我假设你已经有了这些。
您在第 38 页有数学公式,大 sigma 代表总和。
h_t
是弱分类器函数,它返回 -1(否)或 1(是)。
alpha_t
基本上是弱分类器有多好,因此在强分类器的最终决定中它必须说多少(不是很民主)。
我从来没有真正使用过forloops,但我会更容易理解并且更独立于语言(这是pythonish伪代码):
strongclassifier(x):
response=0
for t in T: #over all weakclassifiers indices
response += alpha[t]*h[t](x)
return sign(response)
这在数学上称为权重和弱响应之间的点积(基本上:strong(x) = alpha*weak(x))。
编辑2
这就是strongclassifier(x)内部发生的情况:分离超平面基本上是在函数weak(x)中决定的,所以所有weak(x)=1的x都在超平面的一侧,而weak(x)=-1在超平面的另一边。如果您考虑它在平面上有线条,那么您有一个平面将平面分成两部分(总是),一侧是(-),另一侧是(+)。如果你现在有 3 条无限的三角形线,它们的负边朝外,你将在三角形内部得到 3 个(+),在外部得到 1 或 2 个(-),结果(在强分类器中)成一个三角形区域,该区域为正,其余为负。这是一个过度简化,但重点仍然存在,并且在更高维度上完全类似。
在 vanilla Ada Boost 中,您不会将学习者乘以任何权重。相反,您增加了错误分类数据的权重。假设您有一个数组,例如 [1..1000],并且您想使用神经网络来估计哪些数字是素数。(愚蠢的例子,但足以演示)。
想象一下,你有 NeuralNet 类。您实例化第一个,n1 = NeuralNet.new。然后你就有了训练集,即另一个从 1 到 1000 的素数数组。(你需要为一个数字组成一些特征集,比如它的位数。)。然后你训练 n1 来识别你的训练集上的素数。让我们假设 n1 很弱,因此在训练期结束后,它将无法正确地将所有数字 1..1000 分类为素数和非素数。让我们假设 n1 错误地说 27 是素数而 113 是非素数,并犯了一些其他错误。你做什么工作?您实例化另一个 NeuralNet,n2,并将 27、113 和其他错误数字的权重从 1 增加到 1.5,并将正确分类的数字的权重从 1 减少到 0.667。然后你训练n2。训练后,你 会发现n2纠正了n1的大部分错误,包括no。27,但没有。113 仍然分类错误。所以你实例化 n3,将 113 的权重增加到 2,将 27 和其他现在正确分类的数字的权重减少到 1,并将旧的正确分类的数字的权重减少到 0.5。等等...
我够具体了吗?