xgboost小試

  • 2019 年 10 月 6 日
  • 筆記

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