实战from GBDT to Xgboost
这一系列主要是对DT、RF的简单介绍,以及对GBDT源码(Python)分析,然后成功搭建Xgboost工具,最后通过简单demo实例熟悉Xgboost建模过程。
1.Decision Tree
决策树从一根节点出发,通过找到最优的分割点,不断地将样本集分裂生成子节点,直到满足停止条件为止(或直到每个节点足够“纯”为止)。
如何选择最优划分属性方法:信息增益(ID3)、信息率(C4.5)和基尼指数(CART)
剪枝处理方法:预剪枝和后剪枝
2.Random Forest
随机森林是以DT为基学习器Bagging集成的基础上,进一步引入随机属性选择,其中选择最优属性是在全局d个属性中随机选择k(k小于d)个属性的子集中选择,而决策树中k=d,RF中推荐k=log2d
3.GBDT
在谈GBDT之前,我们先讨论集成学习的方法boosing、bagging和stacking方法。
3.1 boosting
boosting是一族可将弱学习器提升为强学习器的算法,代表算法是Adaboost,其将多个弱分类器,通过投票(voting)的手段来改变各个分类器的权值,使分错的分类器获得较大权值,并且在每一次循环中也改变样本的分布,如下算法
周教授的《机器学习》是基于加性模型迭代式优化指数损失函数的角度推导AdaBoost算法
3.2 bagging方法
Bagging通常对分类任务是简单投票法,对回归任务使用简单平均法,其中代表模型是random forest
3.3 stacking
Stacking,也称学习法,其先通过初始数据集训练出初级学习器,然后生成一个新数据集用于训练次级学习器,其中比较火的结合是GBDT+LG。
3.4 GBDT算法
GBDT算法的重要的一点就是在用下一个单模型去模拟损失函数梯度,最后将其作为一个弱模型加入总的算法中。下面是scikit-learning中GBDT的源码分析:
通过上面的GBDT源码思维导图可以很容易对照论文的算法去研究源码。
4.Xgboost
XGBoost :eXtreme Gradient Boosting
陈天齐教授的项目地址:https://github.com/dmlc/xgboost 最初开发的实现可扩展,便携,分布式 gradient boosting (GBDT, GBRT or GBM) 算法的一个库,可以下载安装并应用于 C++,Python,R,Julia,Java,Scala,Hadoop,现在有很多协作者共同开发维护。
其中讨论参考http://geek.csdn.net/news/detail/201207这篇博客
5.Installing XGBoost For Anaconda on Windows
参考网站:
https://www.ibm.com/developerworks/community/blogs/jfp/entry/Installing_XGBoost_For_Anaconda_on_Windows?lang=en
安装环境:
- Python科学管理环境Anaconda
- Git版本工具
- TDM-GCC
安装完成后,系统会自动的添加安装路径到path中。
打开Git Bash
$ which mingw32-make
/d/TDM-GCC-64/bin/mingw32-make
建立别名方便命令安装
$ alias make=’mingw32-make’
下载GXboost(安装目录可以自行建立)
$ git clone --recursive https://github.com/dmlc/xgboost
$ cd xgboost
$ git submodule init
$ git submodule update
本机电脑的默认目录:C:\Users\jq\xgboost
用命令逐个地编译子模块
$ cd dmlc-core
$ make –j4
$ cd ../rabit
$ make lib/librabit_empty.a -j4
$ cd ..
$ cp make/mingw64.mk config.mk
$ make -j4
然后在Anaconda中安装XGBoost的python模块了。打开Anaconda Prompt,输入下面命令:
cd xgboostCode\xgboost\python-package
安装之前请下载libxgboost.dll放在xgboost/python-package/xgboost/路径下再安装
python setup.py install
安装成功如下:
环境搭建成功后就可以玩转Kaggle神器Xgboost了
6.Practical example
from numpy import loadtxt
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
#分出变量和标签
path = 'C:\\Users\\jq\\Desktop'
dataset = loadtxt(path+'\pima-indians-diabetes.txt', delimiter=",")
X = dataset[:,0:8]
Y = dataset[:,8]
#将数据分为训练集和测试集,测试集用来预测,训练集用来学习模型
seed = 7
test_size = 0.33
X_train,X_test,y_train,y_test = train_test_split(X,Y,test_size=test_size,random_state=seed)
model = XGBClassifier()
model.fit(X_train,y_train)
xgboost 的结果是每个样本属于第一类的概率,需要用 round 将其转换为 0 1 值
y_pred = model.predict(X_test)
predictions = [round(value) for value in y_pred]
accuracy=accuracy_score(y_test,predictions)
print("Accuracy: %.2f%%" % (accuracy * 100.0))
#xgboost可以在模型训练时,评价模型在测试集上的表现,也可以输出每一步的分数,只需要将
#上面的建模过程改成
model = XGBClassifier()
eval_set = [(X_test,y_test)]
model.fit(X_train,y_train,early_stopping_rounds=10,eval_metric="logloss",eval_set=eval_set,verbose=True)
#那么它会在每加入一颗树后打印出 logloss
#3. 输出特征重要度
from xgboost import plot_importance
from matplotlib import pyplot
model.fit(X,Y)
plot_importance(model)
pyplot.show()
实例参考:http://geek.csdn.net/news/detail/201207
运行结果:
总结
算法的学习感觉没有什么捷径,深入算法原理、推导算法、编码实现,目前接触的模型工作中用到的模型更多的是基于业务驱动和策略来改动模型从而应用模型。
你要做的就是比别人多深入思考一点点,还需要继续努力。
参考文档
- 入门教程:
https://xgboost.readthedocs.io/en/latest/ - 安装教程:
http://xgboost.readthedocs.io/en/latest/build.html - 源码分析
http://www.jianshu.com/p/02cfaae3fd01 - 周志华老师的《机器学习》
- 《集体智慧编程》
- 决策树原理
http://blog.csdn.net/dark_scope/article/details/13168827
下一篇: 神经网络笔记3