{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# %load /Users/facai/Study/book_notes/preconfig.py\n", "%matplotlib inline\n", "\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "sns.set(color_codes=True)\n", "sns.set(font='SimHei')\n", "plt.rcParams['axes.grid'] = False\n", "\n", "from IPython.display import SVG\n", "\n", "def show_image(filename, figsize=None):\n", " if figsize:\n", " plt.figure(figsize=figsize)\n", "\n", " plt.imshow(plt.imread(filename))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "GBDT 在 spark 中的实现简介\n", "========================" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "分析用的代码版本信息:\n", "\n", "```sh\n", "~/W/spark ❯❯❯ git log -n 1\n", "commit 2eedc00b04ef8ca771ff64c4f834c25f835f5f44\n", "Author: Wenchen Fan \n", "Date: Mon Aug 1 17:54:41 2016 -0700\n", "\n", " [SPARK-16828][SQL] remove MaxOf and MinOf\n", "\n", " ## What changes were proposed in this pull request?\n", "\n", " These 2 expressions are not needed anymore after we have `Greatest` and `Least`. This PR removes them and related tests.\n", "\n", " ## How was this patch tested?\n", "\n", " N/A\n", "\n", " Author: Wenchen Fan \n", "\n", " Closes #14434 from cloud-fan/minor1.\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0. 总纲 \n", "\n", "下图是主要涉及到的类之间的关系:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/svg+xml": [ "GBTClassifier#train()PredictorGBTClassifierParams+supportedLossTypes: logistic+lossType+getOldLossType()+getOldLossType()GradientBoostedTrees+run()+boost()GBTClassificationModel+featureImportances#transformImpl()#predict()TreeEnsembleModel+featureImportance()+computeFeatureImportance()+toDebugString()GBTParams+getOldBoostingStrategy()TreeEnsembleParams+getOldStrategy()DecisionTreeParams+getOldStrategy()Strategy+algo+impurity+maxDepth+numClasses+maxBins+minInstancesPerNode+minInfoGain+subsamplingRate+assertVaild()+defaultStrategy()BoostingStrategy+treeStrategy+loss+numIterations+learningRate-assertValid()+defaultParams()DecisionTreeRegressor+train()GBTRegressor#train()GBTRegressorParams+supportedLossTypes: L1 L2+lossType+getLossType()+getOldLossType()GBTRegressionModel+featureImportances#transformImpl()+predict()Algo+algo: Classification RegressionAbsoluteError+gradient()+computeError()SquaredError+gradient()+computerError()LogLoss+gradient()+computerError()Loss" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "SVG(\"./res/uml/gbdt_spark.svg\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "spark 封装得比较细,一眼看去各种类,乱花迷眼。但其实因为拆分得当,厘清关系是比较容易的,较高的抽象层次也让代码非常易读。\n", "\n", "为了便于逻辑叙述,我们按调用顺序由顶至下地,分别介绍各个涉及类的大致作用。\n", "\n", "+ 训练调用顺序:\n", " 1. `GBTRegressor.train` 和 `GBTClassifier.train` 是训练方法的入口。 \n", " 因为二分类问题会转换成 $\\{-1, 1\\}$ 回归问题,所以两个类差别在参数上,调用路径是一致的。\n", " 2. `GradientboostedTrees` 通过 `run` 启动 `boost` 方法开始训练,这是 GBDT 的算法主体代码逻辑。\n", " 3. 训练中的参数都由 `BoostingStrategy` 控制,它主要的构成是:\n", " + 损失函数类 `Loss`,具体实现是 logstic, L1, L2 三种。\n", " + 树生成参数 `Strategy` 指导 `DecisionTreeRegressor` 进行拟合。\n", " 4. 训练后组建 `GBTRegressionModel` 或 `GBTClassificationModel`。\n", " \n", "+ 预测调用顺序 \n", " 预测比较简单,`GBT*Model` 类按权值加总 `DecisionTreeRegressor` 结果即可。 \n", " 另外,`GBT*Model.featureImportances` 是个有意思的变量,它用于评估特征的重要度,主要由 `TreeEnsembleModel` 计算,后面会细讲。\n", " \n", "因为这里很多类只是起封装作用,我们只会介绍涉及到 GBDT 算法实现的具体类和函数,不会对整个工程面面俱到。另外,决策树在 spark 中的实现会专门分析,本文不深入。" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### 1. 训练算法实现 `GradientBoostedTrees.boost` \n", "\n", "`GradientBoostedTrees.boost` 是论文 J.H. Friedman. \"Stochastic Gradient Boosting.\" 1999. 的训练算法实现,而非 TreeBoost。具体算法本身的原理及细节会专门发文讲解,这里直接给算法描述:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nw4ff8OtefPFFFR0drfLz85VSSlksFtWmTRv14YcfKqWUKioqUtPuvrc3AAAOcUlEQVSmTVMeHh5q\n9OjRavPmzUoppWw2m4qIiFDvvPOOcjqdSimlnE6nSklJUS1atFC7du3Sj//000+qUaNGqlu3bjdc\nP6fTqV555RV17NgxpZRSH3/8sQLU0KFDlc1mu+z1f/rTn1Tr1q31+yul1L59+1SHDh3UwYMHlVJK\nbdq0SUVERKjjx4+rpKQkNWvWLOVwONTu3btV27Zt9fsppVRJSYnq1auXfk1eXp5KTExUISEh6rXX\nXlN/+ctfVH5+vgoMDFSTJ09WSim1f/9+FRwcrLeJ0+lUpaWlat68ecrDw0MdOXJElZSUqPLycr2e\ndrtd9ejRQ3Xt2lW98cYbymKxKKWU2rJliwoKClJ79uzR65Samqr69++vAPXJJ5+ooqIipZRSK1eu\nVCaTSU2ZMkUlJCTo1z/xxBPq/vvvV6WlpTfcBkIIIWqP3W5XXbt2Vdu2bauR8q46tLd69WratGlD\nVFQU4FrZZTabAfDx8cFisVBYWFjlmHDZvXs3X3/9NRMmTCAgIAAAPz8/XnjhBb766ivAtequU6dO\nWK1WgoODefDBBwHXJPLu3buTmJioDx2VlpYybNgwOnToQKdOnfThqzZt2tCuXbtq1bG8vJyePXvS\nvHlzAJ588knMZjPffPPNdacWAJg2bRo+Pj5ER0cDEBMTg7u7O4sWLaJ79+6MGjUKg8HApEmT6NKl\nC02bNtVf6+Pjw9ChQ3n33XfJycmhUaNGdOvWDZPJxNq1axk9ejT+/v7s3r2bCRMmABAREUFISIhe\nhqZpeHp6YjQaMRqNmM1mfHx8cHd3rzLMt2/fPuLi4vRJ8xEREdhsNo4dO6Zfc/fdd9O5c2cA2rdv\nj6+vLwDR0dGUl5ezdetWhgwZol/fuXNnDh06RElJyXU/MyGEEHe+qwZSW7ZsITk5mXHjxpGamkpK\nSor+i6KkpITAwEACAgIqHasIGAQsXryYoqIievToQUlJCcXFxZSUlODn58fRo0cpKyvTr/Xy8iIu\nLq7S641GY6Vl/L/88gspKSk89thjGAyVm666k6vT09Nxd3cnPz+f/Px8TCYTrVq1oqysjAMHDlx3\nOTabDYPBoNfDaDTi5uZGcXGxHggWFRWxd+9e2rdvrw+hVWjVqhWnT59m3bp1lY4HBwfj5+eHwWAg\n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\ngg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_image(\"./res/gbdt.png\", figsize=(10,5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "上图来源于论文 Friedman - Greedy function approximation: A gradient boosting machine,第6行引入了学习率控制过拟合。 " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "下面是 spark 中实现代码:\n", "\n", "```Scala\n", "243 def boost(\n", "244 //+-- 5 lines: input: RDD[LabeledPoint],-----------------------------------------------------\n", "249 //+-- 7 lines: val timer = new TimeTracker()-------------------------------------------------\n", "256 val numIterations = boostingStrategy.numIterations\n", "257 val baseLearners = new Array[DecisionTreeRegressionModel](numIterations)\n", "258 val baseLearnerWeights = new Array[Double](numIterations)\n", "259 val loss = boostingStrategy.loss\n", "260 val learningRate = boostingStrategy.learningRate\n", "261 // Prepare strategy for individual trees, which use regression with variance impurity.\n", "262 val treeStrategy = boostingStrategy.treeStrategy.copy\n", "263 val validationTol = boostingStrategy.validationTol\n", "264 treeStrategy.algo = OldAlgo.Regression\n", "265 treeStrategy.impurity = OldVariance\n", "266 treeStrategy.assertValid()\n", "267\n", "268 //+-- 20 lines: Cache input-------------------------------------------------------------------\n", "288 // Initialize tree\n", "289 timer.start(\"building tree 0\")\n", "290 val firstTree = new DecisionTreeRegressor().setSeed(seed)\n", "291 val firstTreeModel = firstTree.train(input, treeStrategy)\n", "292 val firstTreeWeight = 1.0\n", "293 baseLearners(0) = firstTreeModel\n", "294 baseLearnerWeights(0) = firstTreeWeight\n", "295\n", "296 var predError: RDD[(Double, Double)] =\n", "297 computeInitialPredictionAndError(input, firstTreeWeight, firstTreeModel, loss)\n", "298 //+-- 11 lines: predErrorCheckpointer.update(predError)---------------------------------------\n", "309\n", "310 var m = 1\n", "311 var doneLearning = false\n", "312 while (m < numIterations && !doneLearning) {\n", "313 // Update data with pseudo-residuals\n", "314 val data = predError.zip(input).map { case ((pred, _), point) =>\n", "315 LabeledPoint(-loss.gradient(pred, point.label), point.features)\n", "316 }\n", "317\n", "318 //+-- 4 lines: timer.start(s\"building tree $m\")----------------------------------------------\n", "322 val dt = new DecisionTreeRegressor().setSeed(seed + m)\n", "323 val model = dt.train(data, treeStrategy)\n", "324 //+-- 2 lines: timer.stop(s\"building tree $m\")-----------------------------------------------\n", "326 baseLearners(m) = model\n", "327 // Note: The setting of baseLearnerWeights is incorrect for losses other than SquaredError.\n", "328 // Technically, the weight should be optimized for the particular loss.\n", "329 // However, the behavior should be reasonable, though not optimal.\n", "330 baseLearnerWeights(m) = learningRate\n", "331\n", "332 predError = updatePredictionError(\n", "333 input, predError, baseLearnerWeights(m), baseLearners(m), loss)\n", "334 //+-- 21 lines: predErrorCheckpointer.update(predError)---------------------------------------\n", "355 m += 1\n", "356 }\n", "357 //+-- 15 lines: timer.stop(\"total\")-----------------------------------------------------------\n", "372 }\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "接下来,我们将代码和算法步骤联系起来:\n", "\n", "+ 算法第一行,基准模型,对应 290L-294L;\n", "\n", "+ 算法第二行,结束条件,对应 312L;\n", "\n", "+ 算法第三行,损失函数的梯度,对应 315L;\n", "\n", "+ 算法第四行,树模型训练,对应 323L;\n", "\n", "+ 算法第五行,权重计算,对应 330L;\n", "\n", "+ 算法第六行,加入新训练的树,对应 332L-333L.\n", "\n", "很容易注意到,330L 对权重计算的实现很奇怪,将学习率直接作为树的权重值。对应的代码注释也说明此实现有问题,但不是很直白。用我的理解,它的实际意图应该是如此考虑的:\n", "\n", "1. $\\beta h(x_i; a)$ 是树模型的训练。决策树生成时用的 impurity 方法是 265L 的 OldVariance,追踪过去可以看到 $\\beta = 1$。\n", "\n", "2. 对于损失函数 L2,它的 $\\rho_m = \\beta_m = 1$,推导很简单,见论文 Friedman : Greedy function approximation: A gradient boosting machine. 章节 4.1 Least Squares regression。\n", "\n", "3. 因为 $\\rho = 1$,而算法第六行,要乘的权重 $\\rho v = v$。\n", "\n", "这就是注释里说只对 SquaredError (即 L2)权重是正确的。" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### 2. 预测函数 `GBT*.predict`\n", "\n", "预测很简单,每颗数的结果加权累加,这里用矩阵乘法实现。分类问题多了212L的二值化。 \n", "\n", "```Scala\n", "207 override protected def predict(features: Vector): Double = {\n", "208 // TODO: When we add a generic Boosting class, handle transform there? SPARK-7129\n", "209 // Classifies by thresholding sum of weighted tree predictions\n", "210 val treePredictions = _trees.map(_.rootNode.predictImpl(features).prediction)\n", "211 val prediction = blas.ddot(numTrees, treePredictions, 1, _treeWeights, 1)\n", "212 if (prediction > 0.0) 1.0 else 0.0\n", "213 }\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. 特征重要度计算函数 `TreeEnsembleModel.featureImportances`\n", "\n", "计算思路很直觉,就是计算各个特征在每颗数上的总的纯净度提升量。这里主要有两点细节,一个是提升值会按节点中样本数加权,另一个是归一化。\n", "\n", "代码如下:\n", "\n", "```Scala\n", "155 def featureImportances[M <: DecisionTreeModel](trees: Array[M], numFeatures: Int): Vector = {\n", "156 val totalImportances = new OpenHashMap[Int, Double]()\n", "157 trees.foreach { tree =>\n", "158 // Aggregate feature importance vector for this tree\n", "159 val importances = new OpenHashMap[Int, Double]()\n", "160 computeFeatureImportance(tree.rootNode, importances)\n", "161 // Normalize importance vector for this tree, and add it to total.\n", "162 // TODO: In the future, also support normalizing by tree.rootNode.impurityStats.count?\n", "163 val treeNorm = importances.map(_._2).sum\n", "164 if (treeNorm != 0) {\n", "165 importances.foreach { case (idx, impt) =>\n", "166 val normImpt = impt / treeNorm\n", "167 totalImportances.changeValue(idx, normImpt, _ + normImpt)\n", "168 }\n", "169 }\n", "170 } 171 // Normalize importances\n", "172 normalizeMapValues(totalImportances)\n", "173 // Construct vector\n", "174 val d = if (numFeatures != -1) {\n", "175 numFeatures\n", "176 } else {\n", "177 // Find max feature index used in trees\n", "178 val maxFeatureIndex = trees.map(_.maxSplitFeatureIndex()).max\n", "179 maxFeatureIndex + 1\n", "180 }\n", "181 //+-- 4 lines: if (d == 0) {-----------------------------------------------------------------\n", "185 val (indices, values) = totalImportances.iterator.toSeq.sortBy(_._1).unzip\n", "186 Vectors.sparse(d, indices.toArray, values.toArray)\n", "187 }\n", "```\n", "\n", "其中:\n", "\n", "+ 159L-163L,计算单颗数的各特征提升量;\n", "+ 164L-169L,归一化后加到总的统计结果中;\n", "+ 172L,归一化最总结果;\n", "+ 171L-186L,按特征名排序组建结果向量。\n", "\n", "各个节点是用递归遍历来汇总特征的提升量:\n", "\n", "```Scala\n", "217 def computeFeatureImportance(\n", "218 node: Node,\n", "219 importances: OpenHashMap[Int, Double]): Unit = {\n", "220 node match {\n", "221 case n: InternalNode =>\n", "222 val feature = n.split.featureIndex\n", "223 val scaledGain = n.gain * n.impurityStats.count\n", "224 importances.changeValue(feature, scaledGain, _ + scaledGain)\n", "225 computeFeatureImportance(n.leftChild, importances)\n", "226 computeFeatureImportance(n.rightChild, importances)\n", "227 case n: LeafNode =>\n", "228 // do nothing\n", "229 }\n", "230 }\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4. 损失函数\n", "\n", "这个没什么好讲的,`gradient`就是一阶导数的代数式。给一个 L2 的例子:\n", "\n", "```Scala\n", " 23 //+-- 4 lines: *-----------------------------------------------------------------------------\n", " 27 //* The squared (L2) error is defined as:\n", " 28 //* (y - F(x))**2\n", " 29 //+-- 4 lines: * where y is the label and F(x) is the model prediction for features x.-------\n", " 33 object SquaredError extends Loss {\n", " 34\n", " 35 //+-- 3 lines: *-----------------------------------------------------------------------------\n", " 38 //* The gradient with respect to F(x) is: - 2 (y - F(x))\n", " 39 //+-- 5 lines: * @param prediction Predicted label.------------------------------------------\n", " 44 override def gradient(prediction: Double, label: Double): Double = {\n", " 45 - 2.0 * (label - prediction)\n", " 46 }\n", " 47\n", " 48 override private[spark] def computeError(prediction: Double, label: Double): Double = {\n", " 49 val err = label - prediction\n", " 50 err * err\n", " 51 }\n", " 52 }\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 结语\n", "\n", "spark 的封装非常好,代码阅读起来是比较轻松的。但是,它对GradientBoostTree的实现方法还是比较简略,一是并没有真正做$\\rho$的寻优,二是没有用TreeBoost来优化计算,三是只支持二分类,且没有能直接输出概率值。总体来说,提升空间相当大。后面打算看xgboost的资料,再做比较。 " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 0 }