刚开始探索理解机器学习算法时,我会被所有数学内容弄得不知所措。我发现,如果没有完全理解算法背后的直觉,就很难理解其中的数学原理。所以,我会倾向于那些将算法分解成更简单、更易理解的步骤。这就是我今天尝试做的事情,以一种即使10岁小孩也能理解的方式来解释XGBoost算法。开始吧!
让我们从训练数据集开始,这个数据集包含了5个样本。每个样本记录了他们的年龄(AGE)、是否有硕士学位(MASTER'S DEGREE),以及他们的工资(SALARY)(以千为单位),目标是使用XGBoost模型预测工资。
image-20240713183042081这个预测可以是任何值。但是让我们假设初步预测是我们想要预测的变量平均值。
image-20240713183454659我们用如下公式计算残差(Residuals):
残差观测值预测值在这里,我们的观测值是 Salary 列中的值,所有预测值都等于 70(初始预测值)。
每个样本的残差值(Residuals)如下
image-20240713183719781每棵树从一个根节点开始,所有的残差都进入那个该根节点。
image-20240713184016874现在我们需要计算该根节点的相似度分数(Similarity Score)。
其中Sum of Residuals的含义是残差的和,Number of Residuals的含义是残差的个数,λ(lambda)是一个正则化参数,它减少了预测对单个观测值的敏感性,并防止数据的过拟合(即模型完全符合训练数据集的情况)。λ的默认值是1,所以在这个例子中我们设λ=1。
image-20240713190458782现在我们应该看看,如果我们使用基于预测变量(年龄和硕士学位)的阈值将残差分成两组,是否能更好地聚类残差。拆分残差意味着为树添加分支。
首先,让我们尝试使用“是否有硕士学位?”来拆分这个叶子。
image-20240713190729979然后计算拆分后左右叶子节点的相似度分数:
image-20240713190840994现在通过“是否有硕士学位”将残差分成两组,并比较分裂前后的相似度。定义增益(Gain)为分裂后的相似度与分裂前的相似度之差,如果增益是正的,那么拆分是一个好主意,否则就不是。增益计算:
image-20240713191309635然后我们将这个增益与年龄的拆分增益进行比较。由于年龄是一个连续变量,找到不同拆分的过程有些复杂。首先,我们根据年龄的升序排列数据集的行,然后计算相邻年龄值的平均值。
image-20240713191530851现在我们使用这四个平均值作为阈值来拆分残差,并计算每个拆分的增益。第一个拆分使用年龄 < 23.5。
image-20240713191747058对于这个拆分,我们以与硕士学位相似的方式计算相似度分数和增益。
image-20240713191842650然后用同样的方法计算剩余的年龄拆分:
image-20240713191912685在所有的硕士学位拆分和四个年龄拆分中,“是否有硕士学位“拆分具有最大的增益值,因此我们将其作为我们的初始拆分。现在,我们可以通过再次使用上述描述的相同过程,将我们的硕士学位叶子拆分成更多分支。但是,这一次,我们将使用初始的硕士学位叶子作为根节点,并尝试通过获得大于0的最大增益值来拆分它们。
让我们从左节点开始。对于这个节点,我们只考虑是否有硕士学位?列中取值为“是”的观察值,因为只有这些观察值会落入左节点。
image-20240713192319459因此,我们使用与之前相同的过程来计算年龄拆分的增益,但这次只使用上图高亮显示的行中的残差。
image-20240713192426375由于只有年龄 < 25 给我们一个正增益,我们使用这个阈值来拆分左节点。
接下来,我们转向右节点,硕士学位取值为“否”的观察值。只计算下图高亮行的残差。
image-20240713192638507在右节点中我们只有两个观察值,所以唯一可能的拆分是年龄 < 24.5,因为这是高亮行中两个年龄值的平均值(高亮行的23和26)。
image-20240713192743467这个拆分的增益是正的,所以我们最终的树是:
image-20240713193339880树修剪是我们避免过度拟合数据的另一种方法。为了做到这一点,我们从树的底部开始,逐步向上查看拆分是否有效。为了确定有效性,我们使用 γ(gamma)。如果增益 (Gain)与γ的差 是正的,我们保留该拆分;否则,我们移除它。γ的默认值是0,但为了说明目的,让我们将γ设置为50。根据之前的计算,我们知道所有节点的增益值:
image-20240713193650700由于除了年龄 < 24.5 的拆分外,所有拆分的增益都大于γ ,我们可以移除那个分支。因此,最终的树结构是:
image-20240713194256016由于叶子节点不能给出多个输出,因此需要根据叶子结点包含的样本值计算输出。
image-20240713194522667其中Sum of Residuals的含义是残差的和,Number of Residuals的含义是残差的个数。
叶子结点输出值的计算类似于相似度分数,不过我们不会对残差进行平方。使用这个公式和 λ = 1,得到所有叶子结点的输出值:
image-20240713194853250现在,所有这些艰难的模型构建工作都已经完成,我们来到了令人兴奋的部分,看看我们的新模型如何改善我们的预测。我们可以使用下述公式进行预测。
image-20240713195115030如上图,70是模型的初始预测,是学习率,本文设置学习率为0.3。
因此第一个观测值的预测值(predicted value)是67.501。
image-20240713195341693同样地,我们可以计算其他观测值的预测值:
image-20240713195454778我们发现新的残差比之前的小,这表明我们已经朝着正确的方向迈出了一小步。随着我们重复这个过程,我们的残差会变得越来越小,这表明我们的预测值逐渐接近观察到的值。
现在我们只需要一遍又一遍地重复这个过程:构建一棵新的树,进行预测,并在每次迭代中计算残差。我们会重复这个过程,直到残差变得非常小,或者我们达到了为算法设置的最大迭代次数。如果每次迭代构建的树用表示,其中i是当前迭代的次数,那么计算预测的公式是:
image-20240713195745800就是这样了!谢谢阅读,祝你在接下来的算法之旅中一切顺利!
欢迎扫码关注: