Machine learning scikitlearn如何实现行搜索?

Machine learning scikitlearn如何实现行搜索?,machine-learning,scikit-learn,Machine Learning,Scikit Learn,在一份关于梯度推进的文件中,它说 梯度提升试图通过最陡下降数值解决该最小化问题:最陡下降方向是在当前模型F_{m-1}上计算的损失函数的负梯度,可计算任何可微损失函数: 其中,使用直线搜索选择步长\gamma\u m: 我理解行搜索的目的,但我不理解算法本身。我读了一遍,但还是没有点击。请给出解释。实现取决于您在初始化GradientBoostingClassifier实例时选择的损失函数(例如,使用此函数,回归部分应该类似)。默认损失函数为,并实现了相应的优化算法。在\u update\u

在一份关于梯度推进的文件中,它说

梯度提升试图通过最陡下降数值解决该最小化问题:最陡下降方向是在当前模型F_{m-1}上计算的损失函数的负梯度,可计算任何可微损失函数:

其中,使用直线搜索选择步长\gamma\u m:


我理解行搜索的目的,但我不理解算法本身。我读了一遍,但还是没有点击。请给出解释。

实现取决于您在初始化
GradientBoostingClassifier
实例时选择的损失函数(例如,使用此函数,回归部分应该类似)。默认损失函数为,并实现了相应的优化算法。在
\u update\u terminal\u region
函数中,只需一步即可实现简单的牛顿迭代


这就是你想要的答案吗?

我怀疑你会感到困惑的是:你可以看到scikit learn在哪里计算损失函数的负梯度,并将一个基估计值拟合到负梯度。看起来像是
\u update\u terminal\u region
方法负责计算步长,但您看不到它可能在任何地方解决文档中所述的行搜索最小化问题

你找不到线搜索的原因是,对于决策树回归的特殊情况,它只是分段常数函数,最优解通常是已知的。例如,如果查看
LeastAbsoluteError
损失函数的
\u update\u terminal\u region
方法,您会看到树的叶子被赋予了
y
与该叶子相关的示例的预测值之差的加权中值。该中值是已知的最优解

为了总结正在发生的情况,对于每个梯度下降迭代,将采取以下步骤:

  • 计算当前预测时损失函数的负梯度

  • 将一个
    DecisionTreeRegressor
    装配到负梯度。此配件可生成具有良好分割的树,以减少损失

  • DecisionTreeRegressor
    左侧的值替换为使损失最小化的值。这些通常是根据一些简单的已知公式计算的,该公式利用了决策树只是一个分段常数函数这一事实


  • 这个方法至少应该和文档中描述的一样好,但我认为在某些情况下可能与它不一样

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

    wikipedia文章中的符号有点马虎,不能简单地通过在某一点上计算的函数来区分。一旦你用
    \hat{y{u i}
    替换
    F{m-1}(x{u i)
    并用在
    \hat{y}=F{m-1}(x)
    处求值的偏导数替换偏导数,事情就变得更清楚了:

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

    因此,您只是在最小化:


    因此,直线搜索只是优化了一个自由度(一旦找到了正确的梯度方向)-步长。

    您的问题更多的是梯度提升算法本身还是sklearn实现?有关该算法的更多详细信息,请参阅wekipedia introduction()。@hsc如果您引用了。这两篇文章我已经读了很多遍了。(事实上,我在这一点上对梯度增强有很好的理解,线搜索是唯一让我无法理解的部分。)也许更适合这个问题