GBDT:梯度提升树算法
基于CART决策树算法,GBDT可以用于处理分类和回归两项任务。由此,GBDT又有了各种不同的叫法
1. GBDT, Gradient Boosting Decision Tree
2. GBRT,Gradient Boosting Regression Tree
3. MART, Multiple Addtive Regression Tree
从名称可以看出,GBDT和Adaboost算法一样,都是属于boosting的集成策略,多次迭代之间是存在一个链式的依赖关系。在Adaboost算法中,根据每次迭代调整下一次迭代样本的权重值,而在GBDT中,则将每次迭代的损失函数值作为下次迭代拟合的目标值。
在求解回归问题时,GBDT可以使用均方差作为误差的衡量值,在求解分类问题时,则使用逻辑回归中目标和损失函数的定义方式来量化计算过程。
以下列数据为例,具体看下算法的求解过程
该数据表示泰塔尼克号上乘客的生存情况,第一步,计算初始值,利用了逻辑回归中目标值的定义,计算如下
样本共6名乘客,其中4名生还,P表示生还的概率,1-P则表示死亡的概率,带入上述公式,即可算出初始值。
计算出初始值之后,计算样本初始值与真实值之间的残差,结果如下
将残差作为拟合的目标值,构建分类树,结果如下所示
注意,这个分类树是为了便于展示算法过程,构建的示例,并不是真实的分类结果。根据建好的分类树,要计算样本对应的新的拟合值,为了方便计算,引入了如下转换公式
使用该公式,对于示例中的决策树,第一个叶子节点的计算结果如下
第二个叶子节点的计算结果如下
第三个叶子节点的计算结果如下
整颗决策树的结果如下所示
接下来,引入学习率来定义每颗决策树的贡献,公式如下
学习率是自定义的,比如学习率设置为0.1, 根据上述公式计算每个乘客新的log odds, 以第一名乘客为例,结果如下
首先初始值为0.7,在第一次的决策树中该样本所在叶子节点的值为-0.16, 所以根据公式可以求解新的log odds值。接下来的迭代过程也是如此,每次迭代不断使用残差来计算新的log odds值,直到迭代终止。
在scikit-learn中,使用GBDT算法的代码如下
1. 分类
>>> from sklearn.datasets import make_hastie_10_2
>>> from sklearn.ensemble import GradientBoostingClassifier
>>> X, y = make_hastie_10_2(random_state=0)
>>> X_train, X_test = X[:2000], X[2000:]
>>> y_train, y_test = y[:2000], y[2000:]
>>> clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0,max_depth=1, random_state=0).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.913
2. 回归
>>> from sklearn.metrics import mean_squared_error
>>> from sklearn.datasets import make_friedman1
>>> from sklearn.ensemble import GradientBoostingRegressor
>>> X, y = make_friedman1(n_samples=1200, random_state=0, noise=1.0)
>>> X_train, X_test = X[:200], X[200:]
>>> y_train, y_test = y[:200], y[200:]
>>> est = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1,max_depth=1, random_state=0, loss='ls').fit(X_train, y_train)
>>> mean_squared_error(y_test, est.predict(X_test))
5.009154859960321
1. 准确度和灵活性很高
2. 不需要数据预处理
3. 可以处理缺失值
缺点如下
1. 计算费时
2. 解释性不强
3. 容易过拟合
在实际运用中,相比Adaboost算法,GBDT的应用更多,无论在分类还是回归问题中,都可以尝试使用该模型。