如果觉得老弟还行,请大家关注本人公众号AI Engine(I是大写的i)
上回书说到了决策树集成之随机森林,并且承诺下次介绍xgboost,不食言哦~
先看张图吧:
我粗略的描述了一下每个算法中的关键元素,随机森林的内容上次已经说过了。另一种决策树集成的算法叫做梯度提升决策树GBDT,在GBDT中每棵树不是分类树,是回归树!所以我首先介绍下回归树的概念,其实回归树与分类树在流程上是差不多的,就好比南方人和北方人看起来都是中国人嘛。但是,回归树的每一个节点都会得一个预测值,这个预测值一般为该节点中所有样本的均值。然后我们分枝时穷举每一个feature的每个阈值找最好的分割点,但衡量最好的标准不再是最大熵,而是最小化均方差。最小化均方差就是每个样本的(真实值-预测值)^2 的总和 / N,均方差越小,说明错的越不离谱,那均方差最小时使用的那个特征就是分枝应选择的最佳特征,举个栗子~
回归树我们基本明确了,下一步我们来说说提升树。提升树其实即使不断迭代、不断构造回归树进行决策,而且每一个回归的样本数据均来自上一个回归树所产生的残差。残差就是真实值 - 预测值,举个栗子~(盗图)
别急,我来解释一下。首先我们有这么一拨人ABCD作为训练样本,他们分别14…26岁,然后有购物金额、上网时长、是否经常到百度知道提问等特征。提升树的过程如下:
1.计算第一个节点的均值:20
2.穷举每个特征进行首次分枝,选取均方差最小的那个特征作为首次分枝依据,
3.计算每个节点的均值:15,25
4.计算每个节点的中每个样本的残差-1,1,-1,1
5.以残差为训练样本进行下一轮回归树的训练……..
6.累加每棵回归树的结论,得出最终的预测值
以上就是提升树的简单原理,个人觉得还是透过例子能更好的理解算法计算过程,比公式更有亲和力。
接下来我们谈谈梯度提升决策树,它和提升树的主要区别在于梯度提升决策树是利用最速下降的近似方法,即利用损失函数的负梯度在当前模型的值,作为回归问题中提升树算法的残差的近似值来拟合一个回归树。梯度提升背后的主要思想是合并许多简单的模型,比如深度较小的树,每棵树只能对部分数据做出好的预测。因此,添加的树越来越多,可以不断迭代提高性能。
现在我们的重点来了========>xgboost,我们看看比较官方的解释:xgboost在计算速度和准确率上都较GBDT有明显的提升。xgboost 的全称是eXtreme Gradient Boosting,它是Gradient Boosting Machine的一个c++实现,作者为正在华盛顿大学研究机器学习的大牛陈天奇 。xgboost最大的特点在于,它能够自动利用CPU的多线程进行并行,同时在算法上加以改进提高了精度。它的处女秀是Kaggle的 希格斯子信号识别竞赛,因为出众的效率与较高的预测准确度在比赛论坛中引起了参赛选手的广泛关注。其实Xgboost就是GBDT算法的高效实现,xgboost中的基学习器除了可以是CART(gbtree)也可以是线性分类器(gblinear),而且在其他多个方面都进行了优化,我们可以研究一下xgboost包及其Python接口,这个库在许多数据集上的速度都比scikit-learn对梯度提升的实现要快,并且调参也更简单。
干货:
fromsklearn.datasetsimportload_breast_cancer
fromxgboostimportXGBClassifier
importxgboostasxgb
importmatplotlib.pyplotasplt
fromsklearn.model_selectionimporttrain_test_split
cancer = load_breast_cancer()
x_train,x_test,y_train,y_test = train_test_split(cancer.data,cancer.target,test_size=0.2,random_state=10)
xgb_clf = XGBClassifier(n_estimators=6,max_depth=5,colsample_bytree=0.7,learning_rate=0.3,reg_lambda=1,seed=10,n_jobs=-1)
xgb_clf.fit(x_train,y_train)
xgb.plot_tree(xgb_clf,num_trees=0)
plt.show()