scikitlearn如何实现线搜索?

时间:2016-12-19 18:03:42

标签: machine-learning scikit-learn

在关于渐变增强的文档的this section中,它说

  

梯度提升尝试通过最速下降数值地解决这个最小化问题:最陡下降方向是在当前模型F_ {m-1}处评估的损失函数的负梯度,其可以针对任何可微分损失函数计算: / p>

enter image description here

  

使用线搜索选择步长\ gamma_m:

enter image description here

我理解行搜索的目的,但我不了解算法本身。我通读了source code,但它仍未点击。非常感谢您的解释。

3 个答案:

答案 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方法,您会看到树的叶子被赋予LeastAbsoluteErrory之间差异的加权中值的值。叶子相关的例子的预测值。这个中位数是已知的最优解。

总结一下发生了什么,对于每个梯度下降迭代,采取以下步骤:

  1. 在当前预测中计算损失函数的负梯度。

  2. 使DecisionTreeRegressor适合负梯度。这种拟合产生了一种具有良好分裂的树,以减少损失。

  3. DecisionTreeRegressor的叶子上的值替换为最小化损失的值。这些通常是从一些简单的已知公式计算出来的,该公式利用了决策树只是一个分段常数函数的事实。

  4. 此方法应该至少与文档中描述的方法一样好,但我认为在某些情况下可能与它不同。

答案 2 :(得分:0)

从您的评论看来,算法本身似乎不清楚,而不是scikitlearn实现它的方式。

维基百科文章中的符号略显草率,不能简单地通过在某一点评估的函数来区分。将F_{m-1}(x_i)替换为\hat{y_i}并将偏导数替换为在\hat{y}=F_{m-1}(x)处评估的偏导数时,事情会变得更加清晰:

enter image description here

这也会从最小化问题中删除x_{i}(某种),并显示行搜索的意图 - 根据当前预测进行优化,而不依赖于训练集。现在,请注意:

enter image description here

因此,你只是最小化:

enter image description here

因此,线搜索只会优化您拥有的一个自由度(一旦找到正确的渐变方向) - 步长。