我试图完全了解梯度提升(GB)方法。我已经阅读了一些Wiki页面和论文,但这确实可以帮助我看到一个完整的简单示例进行逐步进行。谁能为我提供一个,或者给我一个示例的链接?没有棘手的优化的直接源代码也将满足我的需求。

有帮助吗?

解决方案

我试图构建以下简单示例(主要是为了自我理解),我希望这对您有用。如果有人注意到任何错误,请告诉我。这是基于以下不错的梯度提升的很好的解释 http://blog.kaggle.com/2017/01/23/a-kaggle-master-ecplains-ecplains-gradient-boosting/

该示例旨在根据观察结果是否拥有自己的房屋,自己的汽车和自己的家庭/儿童来预测每月(以美元)的薪水。假设我们有一个数据集,其中第一个变量是“拥有自己的房子”,第二个变量是“有自己的汽车”,而第三个变量是“拥有家庭/儿童”,而目标是“每月薪水”。观察是

1.-(是的,是,是,10000)

2 .-(不,不,不,25)

3 .-(是的,不,否,5000)

选择一个数字 $ m $ 提升阶段,说 $ m = 1 $. 。梯度提升算法的第一步是从初始模型开始 $ f_ {0} $. 。该模型是定义的常数 $ mathrm {arg min} _ { gamma} sum_ {i = 1}^3l(y_ _ {i}, gamma)$ 在我们的情况下 $ L $ 是损失函数。假设我们正在使用通常的损失功能 $ l(y_ {i}, gamma)= frac {1} {2}(y_ {i} - gamma)^{2} $. 。在这种情况下,该常数等于输出的平均值 $ y_ {i} $, ,所以在我们的情况下 $ frac {10000+25+5000} {3} = 5008.3 $. 。所以我们的最初模型是 $ f_ {0}(x)= 5008.3 $ (映射每个观察 $ x $ (例如(否,是,否))至5008.3。

接下来,我们应该创建一个新数据集,该数据集是以前的数据集,而不是 $ y_ {i} $ 我们服用残差 $ r_ {i0} = - frac { partial {l(y_ {y},f_ {0}(x_ {i})}}}}}}}} { partial {f_ {0}. 。在我们的情况下,我们有 $ r_ {i0} = y_ {i} -f_ {0}(x_ {i})= y_ {i} -5008.3 $. 。所以我们的数据集变为

1.-(是的,是,是,4991.6)

2 .-(不,不,不,-4983.3)

3 .-(是的,不,否,-8.3)

下一步是适合基础学习者 $ h $ 到这个新数据集。通常,基础学习者是决策树,因此我们使用它。

现在假设我们构建了以下决策树 $ h $. 。我使用熵和信息增益公式构造了这棵树,但可能我犯了一些错误,但是出于我们的目的,我们可以认为它是正确的。有关一个更详细的例子,请检查

https://www.saedsayad.com/decision_tree.htm

构造的树是:

enter image description here

让我们称这个决策树 $ h_ {0} $. 。下一步是找到一个常数 $ lambda_ {0} = mathrm {arg ; min} _ { lambda} sum_ {i = 1}^{3} l(y_ {y_ {i},f_ {f_ {0} lambda {h_ {0}(x_ {i})})$. 。因此,我们想要一个常数 $ lambda $ 最小化

$ c = frac {1} {2}(10000-(5008.3+ lambda*{4991.6})) )^{2}+ frac {1} {2}(5000-(5008.3+ lambda(-8.3))))^{2} $.

这是梯度下降派上用场的地方。

假设我们从 $ p_ {0} = 0 $. 。选择等于 $ eta = 0.01 $. 。我们有

$ frac { partial {c}} { partial { lambda}}} =(10000-(5008.3+ lambda*4991.6))( - 4991.6))( - 4991.6) *4983.3+(5000-(5008.3+ lambda(-8.3)))*8.3 $.

然后我们的下一个价值 $ p_ {1} $ 是(谁)给的 $ p_ {1} = 0- eta { frac { partial {c}}} { partial { lambda}}}}(0)} = 0-.01(-4991.6*4991.7+4983.4+4983.4*( - 4983.4*) (-8.3)*8.3)$.

重复此步骤 $ n $ 时间,假设最后一个值是 $ p_ {n} $. 。如果 $ n $ 足够大, $ eta $ 那时很小 $ lambda:= p_ {n} $ 应该是价值 美元 最小化。如果是这种情况,那么我们 $ lambda_ {0} $ 将等于 $ p_ {n} $. 。只是为了它,假设 $ p_ {n} = 0.5 $ (以便 美元 最小化 $ lambda:= 0.5 $)。所以, $ lambda_ {0} = 0.5 $.

下一步是更新我们的初始模型 $ f_ {0} $ 经过 $ f_ {1}(x):= f_ {0}(x)+ lambda_ {0} h_ {0}(x)$. 。由于我们的提升阶段数量只是一个,因此这是我们的最终模型 $ f_ {1} $.

现在假设我想预测一个新的观察 $ x = $(是的,是的)(所以这个人确实有自己的房子和自己的汽车,但没有孩子)。这个人每月的薪水是多少?我们只是计算 $ f_ {1}(x)= f_ {0}(x)+ lambda_ {0} h_ {0}(x)= 5008.3+0.5*4991.6 = 7504.1 $. 。因此,根据我们的模型,此人每月赚取$ 7504.1。

其他提示

如它所述,以下演示文稿是对梯度提升的“温和”介绍,我发现在弄清梯度提升时非常有帮助。包括一个完全解释的示例。

http://www.ccs.neu.edu/home/home/vip/teach/mlcourse/4_boosting/slides/gradient_boosting.pdf

这个 是XGBoost软件包所在的存储库。那是从Xgboost库中的Xgboost库,例如Julia,Java,R等。

这个 是Python实施。

浏览源代码(如“如何贡献”中的指示)文档将帮助您了解其背后的直觉。

许可以下: CC-BY-SA归因
scroll top