GBDT安裝(xgboost LightGBM)
1,XGBoost 之model
1.訓練集和測試集都是libsvm格式,如下所示:(label idx:val idxN:valN)並且idx從1開始的
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
2.最終生成的模型如下所示:
booster[0]: 0:[f824<4] yes=1,no=2,missing=2 1:[f459<4] yes=3,no=4,missing=4 3:[f718<8] yes=7,no=8,missing=8 7:[f4<16] yes=15,no=16,missing=16 15:leaf=0.04 16:leaf=0.0832258 8:[f3<74.5] yes=17,no=18,missing=18 17:[f3<3.5] yes=31,no=32,missing=32 31:leaf=0.0392857 32:leaf=0.075 18:[f546<1.5] yes=33,no=34,missing=34 33:leaf=-0.0166667 34:leaf=0.0454545 4:[f1892<-9.53674e-07] yes=9,no=10,missing=9 9:[f5<14.875] yes=19,no=20,missing=19 19:[f9<27.45] yes=35,no=36,missing=36 35:leaf=0.0414993 36:leaf=-0 20:[f9<9.15] yes=37,no=38,missing=38 37:leaf=-0.0434783 38:leaf=0.0227181 10:[f8<1.65] yes=21,no=22,missing=21 21:leaf=0.0798883 22:[f6<24] yes=41,no=42,missing=42 41:leaf=0.06 42:leaf=0.008 2:[f507<-9.53674e-07] yes=5,no=6,missing=5 5:[f3238<6] yes=11,no=12,missing=12 11:[f707<-9.53674e-07] yes=23,no=24,missing=23 23:[f453<4] yes=43,no=44,missing=44 43:leaf=0.0668712 44:leaf=0.02723 24:[f343<2] yes=45,no=46,missing=46 45:leaf=0.044 46:leaf=0.0803738 12:[f778<4] yes=25,no=26,missing=26 25:[f718<6] yes=47,no=48,missing=48 47:leaf=0.06 48:leaf=0.0358086 26:[f902<4] yes=49,no=50,missing=50 49:leaf=0.0586066 50:leaf=0.00294413 6:[f5<5.875] yes=13,no=14,missing=13 13:[f9<5.25] yes=27,no=28,missing=28 27:leaf=0.045098 28:leaf=0.00555556 14:[f8<5.25] yes=29,no=30,missing=29 29:[f69<1.5] yes=51,no=52,missing=52 51:leaf=0.0565657 52:leaf=0.0762115 30:[f5<37] yes=53,no=54,missing=54 53:leaf=0.0211009 54:leaf=0.09 booster[1]: 0:[f507<-9.53674e-07] yes=1,no=2,missing=1 1:[f5577<-9.53674e-07] yes=3,no=4,missing=3 3:[f2316<4] yes=7,no=8,missing=8 7:[f1693<4] yes=15,no=16,missing=16 15:[f8<1.35] yes=23,no=24,missing=23 23:leaf=0.0791827 24:leaf=0.0481712 16:[f9<32.85] yes=25,no=26,missing=26 25:leaf=0.0391999 26:leaf=0.0156137 8:[f778<4] yes=17,no=18,missing=18 17:[f2<0.375] yes=27,no=28,missing=28 27:leaf=0.0620543 28:leaf=0.0371438 18:[f819<4] yes=29,no=30,missing=30 29:leaf=0.0330582 30:leaf=0.00373361 4:[f9<3.15] yes=9,no=10,missing=10 9:leaf=-0.00125297 10:[f611<-9.53674e-07] yes=19,no=20,missing=19 19:[f9<26.25] yes=31,no=32,missing=31 31:leaf=0.0723316 32:leaf=0.0504592 20:[f9<18.75] yes=33,no=34,missing=34 33:leaf=0.0596224 34:leaf=0.0112981 2:[f2<14.35] yes=5,no=6,missing=5 ……………… booster[2]: …… booster[3]:……
相關解釋:”numRound: 4, maxDepth: 3”表示生成樹的個數為4,樹的最大深度為3;booster[n]表示第n棵樹;以下儲存樹的結構,0號節點為根節點,每個節點有兩個子節點,節點序號按層序技術,即1號和2號節點為根節點0號節點的子節點,相同層的節點有相同縮排,且比父節點多一級縮排。
在節點行,首先宣告節點序號,中括號裡寫明該節點採用第幾個特徵(如f824即為訓練資料的第824個特徵),同時表明特徵值劃分條件,“[f824<2] yes=1,no=2,missing=2”:表示f824號特徵大於2時該樣本劃分到1號葉子節點,f824>=2時劃分到2號葉子節點,當沒有該特徵(None)劃分到2號葉子節點。
2,GBDT的安裝:
InstallationInstructions
Thepackage can be installed as a python package or compiled as C++ biinary.
Python Installation Instructions
Precompiledpackages are available for linux x86_64 platform and python 2.
- Install stable version:
pip install gbdt
- Install latest development version:
pip install git+https://github.com/yarny/gbdt.git
C++ Binary Compilation Instructions
Thepackage can be compiled in both Linux and OSX platforms. It depends on bazel, gflags,glogs, gperf, protobuf3. Per limitation of bazel, for linux, please use ubuntu 14 andabove to build. The built binary can be used in lower version linux machine. Weinclude a convenient script to set up the dependencies.
- Install bazel
- Run
setup_dependencies/setup.sh
. - Run
bazel build -c opt src:gbdt
to build the binary. - Find your binary at
bazel-bin/src/gbdt
.
一 #####Python版本安裝 gbdt……
1, pip install
[@10.134.105.160 gbdt]# pip install gbdt
Downloading/unpacking gbdt
Downloadinggbdt-0.3.1.2.tar.gz (3.1MB): 3.1MB downloaded
Runningsetup.py (path:/tmp/pip_build_root/gbdt/setup.py) egg_info for package gbdt
Installing collected packages: gbdt
Runningsetup.py install for gbdt
Successfully installed gbdt
Cleaning up...
[@10.134.105.160 docs]# pip install -t/usr/local/python-2.7.6/lib/python2.7/site-packages/ gbdt
Downloading/unpacking gbdt
Downloadinggbdt-0.3.1.2.tar.gz (3.1MB): 3.1MB downloaded
Runningsetup.py (path:/tmp/pip_build_root/gbdt/setup.py) egg_info for package gbdt
Installing collected packages: gbdt
Runningsetup.py install for gbdt
Successfully installed gbdt
Cleaning up...
2 #### python2.7 import gbdt
[@10.134.105.160 docs]# python2.7
Python 2.7.13 (default, Dec 20 2016, 11:36:08)
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
Type "help", "copyright","credits" or "license" for more information.
>>> import gbdt
Traceback (most recent call last):
File"<stdin>", line 1, in <module>
File"/usr/local/python-2.7.6/lib/python2.7/site-packages/gbdt/__init__.py",line 11, in <module>
from._forest import Forest
File"/usr/local/python-2.7.6/lib/python2.7/site-packages/gbdt/_forest.py",line 1, in <module>
from libgbdtimport Forest as _Forest
ImportError: /lib64/libc.so.6: version `GLIBC_2.14'not found (required by /usr/local/python-2.7.6/lib/python2.7/site-packages/gbdt/lib/linux_x86_64/libgbdt.so)
>>>
解決錯誤
PATH和LD_LIBRARY_PATH本質都是變數,所謂變數的意思就是由別人賦值產生的,直覺往往會讓我們新增和減少這個變數本身的某些路徑,實際上這是不正確的。正確的做法是我們要去修改賦予這個變數數值的那些配置檔案,加一條路徑或者減一條。說到底變數只關乎顯示,不關乎其用於顯示的內容。
PATH: 可執行程式的查詢路徑
檢視當前環境變數:
echo $PATH
設定:
方法一:export PATH=PATH:/XXX但是登出後就失效
方法二:修改~/.bashrc或~/.bash_profile或系統級別的/etc/profile
1. 在其中新增例如exportPATH=/opt/ActivePython-2.7/bin:$PATH
2. source .bashrc (Source命令也稱為“點命令”,也就是一個點符號(.)。source命令通常用於重新執行剛修改的初始化檔案,使之立即生效,而不必登出並重新登入)
LD_LIBRARY_PATH: 動態庫的查詢路徑
設定:
方法一:export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX但是登出後就失效
方法二:修改~/.bashrc或~/.bash_profile或系統級別的/etc/profile
1. 在其中新增例如exportPATH=/opt/ActiveP/lib:$LD_LIBRARY_PATH
2. source .bashrc (Source命令也稱為“點命令”,也就是一個點符號(.)。source命令通常用於重新執行剛修改的初始化檔案,使之立即生效,而不必登出並重新登入)
方法三:這個沒有修改LD_LIBRARY_PATH但是效果是一樣的實現動態庫的查詢,
1. /etc/ld.so.conf下面加一行/usr/local/MySQL/lib
2. 儲存過後ldconfig一下(ldconfig命令的用途,主要是在預設搜尋目錄(/lib和/usr/lib)以及動態庫配置檔案/etc/ld.so.conf內所列的目錄下,搜尋出可共享的動態連結庫(格式如前介紹,lib*.so*),進而創建出動態裝入程式(ld.so)所需的連線和快取檔案.快取檔案預設為/etc/ld.so.cache,此檔案儲存已排好序的動態連結庫名字列表.)
方法三設定稍微麻煩,好處是比較不受使用者的限制。
gbdt安裝python版本------ **pip原始碼安裝;***yum install python-devel.x86_64 yum install python27-python-devel.x86_64 ---> pip install numpy >= 0.6 && pip install SciPy >= 0.9 ; (numpy.distutils.system_info.NotFoundError: no lapack/blas resources found) ---> yum
install blas* && yum install lapack* ---> pip install SciPy ( python -c "import scipy; print scipy.__version__") & pip install sklearn
二,安裝c 版本,但是需要bazel支援,bazel又需要依賴JDK1.8
/usr/local/bazel
#### 安裝JDK略過
### 安裝bazel
####[@10.134.105.160 GBDT]#./bazel-0.4.4-installer-darwin-x86_64.sh --user
raw set itself is deprecated.
- Remove support for --javawarn; use e.g.--javacopt=-Xlint:all
instead
## Buildinformations
- [Buildlog](http://ci.bazel.io/job/Bazel/JAVA_VERSION=1.8,PLATFORM_NAME=darwin-x86_64/1246/)
- [Commit](https://github.com/bazelbuild/bazel/commit/80a07b5)
Uncompressing.......
Bazel is nowinstalled!
Make sure youhave "/root/bin" in your path. You can also activate bash
completion byadding the following line to your ~/.bashrc:
source /root/.bazel/bin/bazel-complete.bash
Seehttp://bazel.build/docs/getting-started.html to start a new project!
[@10.134.105.160GBDT]#
自2007年釋出以來,scikit-learn已經成為Python重要的機器學習庫了。scikit-learn簡稱sklearn,支援包括分類、迴歸、降維和聚類四大機器學習演算法。還包含了特徵提取、資料處理和模型評估三大模組。
sklearn是Scipy的擴充套件,建立在NumPy和matplotlib庫的基礎上。利用這幾大模組的優勢,可以大大提高機器學習的效率。
sklearn擁有著完善的文件,上手容易,具有著豐富的API,在學術界頗受歡迎。sklearn已經封裝了大量的機器學習演算法,包括LIBSVM和LIBINEAR。同時sklearn內建了大量資料集,節省了獲取和整理資料集的時間。
機器學習基礎
定義:針對經驗E和一系列的任務T和一定表現的衡量P,如果隨著經驗E的積累,針對定義好的任務T可以提高表現P,就說明機器具有學習能力。
sklearn安裝
sklearn目前的版本是0.17.1,可以使用pip安裝。在安裝時需要進行包依賴檢查,具體有以下幾個要求:
· Python(>=2.6 or >=3.3)
· NumPy(>=1.6.1)
· SciPy(>=0.9)
AdaBoost演算法詳細講解(不錯)
AdaBoost 是一種迭代演算法,其核心思想是針對同一個訓練集訓練不同的分類器,即弱分類器,然後把這些弱分類器集合起來,構造一個更強的最終分類器。(很多部落格裡說的三個臭皮匠賽過諸葛亮)
演算法本身是改變資料分佈實現的,它根據每次訓練集之中的每個樣本的分類是否正確,以及上次的總體分類的準確率,來確定每個樣本的權值。將修改權值的新資料送給下層分類器進行訓練,然後將每次訓練得到的分類器融合起來,作為最後的決策分類器。
完整的adaboost演算法如下
這裡闡述下演算法的具體過程:
1.初始化所有訓練樣例的權重為1 / N,其中N是樣例數
2.for m=1,……M:
a).訓練弱分類器ym(),使其最小化權重誤差函式(weighted error function):
b)接下來計算該弱分類器的話語權α:
c)更新權重:
其中Zm:
是規範化因子,使所有w的和為1。(這裡公式稍微有點亂)
3.得到最後的分類器:
圖解AdaBoost演算法
簡單來說,Adaboost有很多優點:
1)adaboost是一種有很高精度的分類器
2)可以使用各種方法構建子分類器,adaboost演算法提供的是框架
3)當使用簡單分類器時,計算出的結果是可以理解的。而且弱分類器構造極其簡單
4)簡單,不用做特徵篩選
5)不用擔心overfitting!
總之:adaboost是簡單,有效。
下面我們舉一個簡單的例子來看看adaboost的實現過程:
圖中,“+”和“-”分別表示兩種類別,在這個過程中,我們使用水平或者垂直的直線作為分類器,來進行分類。
第一步:
根據分類的正確率,得到一個新的樣本分佈D2,一個子分類器h1
其中劃圈的樣本表示被分錯的。在右邊的途中,比較大的“+”表示對該樣本做了加權。
也許你對上面的ɛ1,ɑ1怎麼算的也不是很理解。下面我們算一下,不要嫌我囉嗦,我最開始就是這樣思考的,只有自己把演算法演算一遍,你才會真正的懂這個演算法的核心,後面我會再次提到這個。
演算法最開始給了一個均勻分佈 D。所以h1 裡的每個點的值是0.1。ok,當劃分後,有三個點劃分錯了,根據演算法誤差表示式得到誤差為分錯了的三個點的值之和,所以ɛ1=(0.1+0.1+0.1)=0.3,而ɑ1根據表示式的可以算出來為0.42.然後就根據演算法 把分錯的點權值變大。如此迭代,最終完成adaboost演算法。但是Dt是如何轉化呢?且保證Dt之和為1:
在訓練的時候,樣本權重空間的計算方法,仍然為:()
目前難點不太清楚的地方是,基分類器如何生成???
第二步:
根據分類的正確率,得到一個新的樣本分佈D3,一個子分類器h2
第三步:
得到一個子分類器h3
整合所有子分類器:
因此可以得到整合的結果,從結果中看,及時簡單的分類器,組合起來也能獲得很好的分類效果,在例子中所有的。