1. virtualenv 创建一个虚拟环境
virtualenv xgboost-env
cd xgboost-env
2. 下载代码
git clone --recursive https://github.com/dmlc/xgboost
--recursive : 下载所有关联的包
3. 编译
cd xgboost
make -j4
“-j4”是4核并行的意思
4. 运行demo
cd demo/binary_classification
python mapfeat.py
python mknfold.py agaricus.txt 1
../../xgboost mashroom.conf
查看打印结果
5. 代码解析
demo/binary_classification下是一个根据对蘑菇特征对其是否有毒进行判别对一个demo。数据源来自https://archive.ics.uci.edu/ml/datasets/Mushroom,数据中包括蘑菇对形状、颜色等特征,以及是否有毒的标签。原始数据存放在agaricus-lepiota.data里,内容如下所示。它有23列,其中第一列是标签列,p表示有毒,e表示没有毒。后面的22列是22个特征对应的特征值。
p,x,s,n,t,p,f,c,n,k,e,e,s,s,w,w,p,w,o,p,k,s,u
e,x,s,y,t,a,f,c,b,k,e,c,s,s,w,w,p,w,o,p,n,n,g
e,b,s,w,t,l,f,c,b,n,e,c,s,s,w,w,p,w,o,p,n,n,m
p,x,y,w,t,p,f,c,n,n,e,e,s,s,w,w,p,w,o,p,k,s,u
e,x,s,g,f,n,f,w,b,k,t,e,s,s,w,w,p,w,o,e,n,a,g
e,x,y,y,t,a,f,c,b,n,e,c,s,s,w,w,p,w,o,p,k,n,g
e,b,s,w,t,a,f,c,b,g,e,c,s,s,w,w,p,w,o,p,k,n,m
... ...
agaricus-lepiota.fmap 文件里存放特征映射关系,比如蘑菇头形状(cap-shap)为钟型(bell)的用b表示,圆锥型(conical)的用c表示;蘑菇头颜色(cap-color)为棕色(brown)的用n表示,浅黄色(buff)的用b表示,等等。总共22个特征映射,对应agaricus-lepiota.data里的第1~22列(第0列为标签)。
1. cap-shape: bell=b,conical=c,convex=x,flat=f,knobbed=k,sunken=s
2. cap-surface: fibrous=f,grooves=g,scaly=y,smooth=s
3. cap-color: brown=n,buff=b,cinnamon=c,gray=g,green=r,pink=p,purple=u,red=e,white=w,yellow=y
4. bruises?: bruises=t,no=f
5. odor: almond=a,anise=l,creosote=c,fishy=y,foul=f, musty=m,none=n,pungent=p,spicy=s
6. gill-attachment: attached=a,descending=d,free=f,notched=n
7. gill-spacing: close=c,crowded=w,distant=d
... ...
数据源的详细解释,可以看文件agaricus-lepiota.names。
mapfeat.py: 把原始数据agaricus-lepiota.data转换成LibSVM格式的数据文件的脚本。LibSVM的格式中,每一行表示一个实例。其中第一列是标签(lable)。在二分法里,1表示正样本,0表示负样本。后面每一列都是一个key:value的键值对。如下面所示,第一行的"101"表示编号为101的特征,"1.2"表示该特征的特征值。
1 101:1.2 102:0.03
0 1:2.1 10001:300 10002:400
通过执行下面的命令,把原始数据转换成LibSVM格式,并存放在新生成的agaricus.txt里。
python mapfeat.py
agaricus.txt文件格式如下,第一列的“1”表示正样本(有毒),“0”表示负样本(无毒)。第一行第二列的“3”表示第3个特征,即“cap-shap是否为convex”,“1”表示“是”(原始数据用x表示)。“10”表示第10个特征,即"cap-surface是否为smooth", 1表示是(原始数据用s表示)。以此类推。
1 3:1 10:1 11:1 21:1 30:1 34:1 36:1 40:1 41:1 53:1 58:1 65:1 69:1 77:1 86:1 88:1 92:1 95:1 102:1 105:1 117:1 124:1
0 3:1 10:1 20:1 21:1 23:1 34:1 36:1 39:1 41:1 53:1 56:1 65:1 69:1 77:1 86:1 88:1 92:1 95:1 102:1 106:1 116:1 120:1
0 1:1 10:1 19:1 21:1 24:1 34:1 36:1 39:1 42:1 53:1 56:1 65:1 69:1 77:1 86:1 88:1 92:1 95:1 102:1 106:1 116:1 122:1
... ...
下面的命令将数据随机分成训练集(agaricus.txt.train)和测试集(agaricus.txt.test)两部分,80%的数据分配给训练集,20%分配给测试集。
python mknfold.py agaricus.txt 1
训练之。
../../xgboost mushroom.conf
mushroom.conf里存放训练时的一些配置参数。
程序会打印一些训练过程中的内容,并最终生成模型,叫0002.model。
预测
../../xgboost mushroom.conf task=pred model_in=0002.model
这个命令用0002.model对测试集进行预测,并将预测结果生成到pred.txt文件里。pred.txt的行数与test集中一直,每一行有一个介于[0-1]的值,它表示对该行样本对预测。值越接近与1,则表示越可能为正样本(有毒),越接近于0表示越可能是负样本(无毒)。可以拿预测值与test集中对实际标签对比,看看正确性如何。
保存模型
通过下面命令,可以把模型转换成容易阅读对格式。
../../xgboost mushroom.conf task=dump model_in=0002.model name_dump=dump.raw.txt
../../xgboost mushroom.conf task=dump model_in=0002.model fmap=featmap.txt name_dump=dump.nice.txt
在训练过的模型上继续训练
../../xgboost mushroom.conf model_in=0002.model num_round=2 model_out=continue.model
这个命令会在 0002.mode模型上在进行两轮boost,然后把结果存为continue.model。注意:使用这种方法时,中途不能改变 mushroom.conf 里面的配置。
多线程
如果系统支持多线程,可以增加nthread参数来进行并行计算。比如nthread=10表示10个线程同时计算。
https://xgboost.readthedocs.io/en/latest//get_started/index.html