Gradient Boosting 从入门到调包 (入门篇)
开篇 虽然数据挖掘算法很多,但有过实际经验的同学肯定都知道,集成方法(ensembel method)大多数情况下都是首选。集成方法和LR、SVM算法不同,她不是一个具体的模型或算法,而是一类算法的统称。集成,从其字面意思也能看出,这家伙不是单兵作战,而是依靠团队取胜。简而言之,集成方法就是通过构建并结合多个学习器来完成学习任务。这句话有两个地方需要注意,“如何构建每一个学习器”以及“如何结合多个学习器而产生预测结果”。 如果我们按照“如何构建每一个学习器”来将集成方法分类,总体可以分为两类:1) 个体学习器减存在强依赖关系、必须串行生成的序列化方法,代表方法是Boosting;2)个体学习器之间不存在强依赖关系、可同时生成的并行化方法,代表方法是Bagging。 本文要讲到的Gradient Boosting就属于Boosting方法。 由于Gradient Boosting涉及到的知识实在是很多,完全可以写成类似"Understanding Random Forest: From Theory to Practice"的博士论文,由于水平和时间的限制,本文不会涉及过多、过深的细节,而是尽量用通俗的自然语言和数学语言来解释我对Gradient Boosting的浅显理解,仅仅是入门水平:) 决策树 既然要讲Gradient Boosting,那么决策树肯定是绕不开的,虽然Boosting方法对"个体学习器"没有要求,你可以选择LR、SVM、决策树等等。但是大多数情况下我们默认都选择决策树作为个体学习器。下面简单解释决策树算法。 决策树,顾名思义,根据树结构来进行决策。这种思想是很质朴的,和我们人类做决策时的思考过程很像,比如明天出门要不要带伞啊?如果我根据天气情况来做出决定,可以记作: if 明天下雨: 出门带伞 else: 出门不带伞 看到没有,决策过程可以用if, else来具体化,难怪有人说,决策树就是一堆if else而已。数据挖掘比赛中很多人会首先用简单的规则跑出一个结果,这实际上就是在人工构造决策树啊。 既然决策树是一种机器学习方法,我们就想知道她的学习过程是怎么样的,也就是给定训练集如果构建一颗决策树呢?通常,决策树的构建是一个递归过程: 1 输入训练集D,特征集F 2 如果D中样本全属于同一个类别C,将当前节点标记为C类叶节点,返回 3 从F中选择最优划分特征f 4 对于f的每一个值\(f_i\), 都生成一个子节点,然后对D进行划分,f值相同的样本都放到同一个子节点,并对节点进行标记,然后对于每一个新产生的子节点,进行第1步 注意:实际上对于决策树,大多数的实现方法都是基于二叉树,比如sklearn。 划分选择 决策树算法的关键是上面的第3步,即如何选择最优划分特征。如何评价一个特征是不是优秀呢?基本的原则就是看按照某一个特征生成子节点后,子节点的样本是不是都尽可能属于同一个类别,也就是子节点的纯度越高,我们就认为这个特征"好"。 为了量化子节点的纯度,前人提出了很多具体的评价方法,包括信息增益、信息增益率和基尼指数。这些评价方法大同小异,我们就以最常见的信息增益(Information Gain)为例进行解释: 假设当前节点包含的数据集为D,则数据集的熵(entropy)定义为: 其中\(|Y|\)表示类别值的取值个数。 假设某一个特征\(f\)有V个可能的取值 \(f^{1},f^{2},…,f^{V}\), 若使用特征\(f\)对\(D\)进行划分,会产生\(V\)个子节点,其中第\(v\)个子节点包含了\(D\)中所有\(f\)取值为\(f^{v}\), 记作\(D^{v}\). 按照下式计算用\(f\)对\(D\)进行划分获得的信息增益(information gain): 信息增益越大,我们就认为用\(f\)划分所获得的纯度提升越大。 下面是用信息增益来构建决策树的简单Python代码,注意,构建的是二叉树。 def uniqueCounts(X): """ 对y的取值进行计数, 用于计算节点的purity rvalue: 计数结果 """ results = {} for row in X: y = X[-1] results[y] = results....