在关于渐变增强的文档的this section中,它说
梯度提升尝试通过最速下降数值地解决这个最小化问题:最陡下降方向是在当前模型F_ {m-1}处评估的损失函数的负梯度,其可以针对任何可微分损失函数计算: / p>
使用线搜索选择步长\ gamma_m:
我理解行搜索的目的,但我不了解算法本身。我通读了source code,但它仍未点击。非常感谢您的解释。
答案 0 :(得分:0)
实现取决于您在初始化GradientBoostingClassifier
实例时选择的损失函数(例如,使用此函数,回归部分应该类似)。默认丢失函数为'deviance',并且实现了相应的优化算法here。在_update_terminal_region
函数中,只用一步就可以实现简单的牛顿迭代。
这是你想要的答案吗?
答案 1 :(得分:0)
我怀疑你发现令人困惑的是:你可以看到scikit-learn在哪里计算损失函数的负梯度,并使基本估计符合该负梯度。看起来# assuming MainWindow is implemented in mainwindow.cpp
set( Srcs main.cpp mainwindow.cpp)
方法负责确定步长,但是您无法在任何地方看到它可能正在解决文档中所写的行搜索最小化问题。
您无法找到线搜索的原因是,对于决策树回归量的特殊情况,它只是分段常数函数,通常已知最优解。例如,如果查看_update_terminal_region
损失函数的_update_terminal_region
方法,您会看到树的叶子被赋予LeastAbsoluteError
和y
之间差异的加权中值的值。叶子相关的例子的预测值。这个中位数是已知的最优解。
总结一下发生了什么,对于每个梯度下降迭代,采取以下步骤:
在当前预测中计算损失函数的负梯度。
使DecisionTreeRegressor
适合负梯度。这种拟合产生了一种具有良好分裂的树,以减少损失。
将DecisionTreeRegressor
的叶子上的值替换为最小化损失的值。这些通常是从一些简单的已知公式计算出来的,该公式利用了决策树只是一个分段常数函数的事实。
此方法应该至少与文档中描述的方法一样好,但我认为在某些情况下可能与它不同。
答案 2 :(得分:0)