我最近接触了提升树算法,并为多维输出 y1 .. yo 实现了一个小型回归树类,具体取决于 ob 特征 x1 .. xn。
实际上,我阅读了几篇关于提升和弗里德曼随机梯度提升的优势的文章,但我在实现这一点时遇到了一些困难,因为所有的数学方程对我来说都很难——需要更多的“编码风格”。
首先:我在任何地方都没有找到关于该主题的实际示例。我知道有第三方库可以很好地适应,但我想了解那里发生了什么,因此我自己实现它;-)
好的,假设我的回归树产生了提升实现所需的结果,现在这是我的问题:
该算法建立了一个由n棵树组成的回归forrest cosisting,其中一棵树的结果是下一棵树的输入的一部分。由于这是一种迭代方法,它从目标函数的初始猜测开始(预测 = 截距 + x1*T1 + x2*T2 + ... + xnTn),其中 Tn 是回归树在位置 n 和 x 的预测是预测的权重。
伪代码:
使用 o 目标维度(列)的平均值初始化截距
用 n 行 o 列初始化矩阵“h 值”(第 i 次迭代的当前预测结果)
对于迭代 = 1 到 n(树的数量)
3.1 创建一个梯度矩阵(n行,o列)并用当前训练数据减去结果函数的当前预测来初始化每一行
3.2 在给定大小的 0 和 n 之间选择一个随机的索引子集(例如所有数据的 50%)
3.3 获取梯度行作为 y 和相应 x 值的输入,并建立一个新的回归树
3.4 训练树并将其添加到结果函数中
3.5 用新的行值+= Prediciton * LearningRate 逐行修改“h values”
-- 迭代结束
4 返回结果函数
首先,您认为我的理解有误吗?如果我采用样本数据,它在单棵树上表现得很好(5% 的误差,深度为 10,每个结至少三个节点),我得到大约 50% 的误差 - 该图几乎是一条平均值线.
其次,我不确定我是否得到了“梯度”这一点,因为我只使用预测——结果函数的当前值,而不是我在各处读到的“真实”损失函数。
第三也是最后一点,我也不太确定第 2.5 点,这就是我在这里要做的全部吗?
任何帮助或提示都会很棒。
非常感谢提前
蒙加