1. 程式人生 > >GBDT安裝(xgboost LightGBM)

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.

  1. Install bazel
  2. Run setup_dependencies/setup.sh.
  3. Run bazel build -c opt src:gbdt to build the binary.
  4. 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)

>>> 

解決錯誤

PATHLD_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的實現過程:

圖中,“+”和“-”分別表示兩種類別,在這個過程中,我們使用水平或者垂直的直線作為分類器,來進行分類。

 第一步:

  根據分類的正確率,得到一個新的樣本分佈D,一個子分類器h1

  其中劃圈的樣本表示被分錯的。在右邊的途中,比較大的“+”表示對該樣本做了加權。

也許你對上面的ɛ1ɑ1怎麼算的也不是很理解。下面我們算一下,不要嫌我囉嗦,我最開始就是這樣思考的,只有自己把演算法演算一遍,你才會真正的懂這個演算法的核心,後面我會再次提到這個。

演算法最開始給了一個均勻分佈 D。所以h1 裡的每個點的值是0.1ok,當劃分後,有三個點劃分錯了,根據演算法誤差表示式得到誤差為分錯了的三個點的值之和,所以ɛ1=(0.1+0.1+0.1)=0.3,而ɑ1根據表示式的可以算出來為0.42.然後就根據演算法 把分錯的點權值變大。如此迭代,最終完成adaboost演算法。但是Dt是如何轉化呢?且保證Dt之和為1:

  在訓練的時候,樣本權重空間的計算方法,仍然為:()

目前難點不太清楚的地方是,基分類器如何生成???

第二步:

  根據分類的正確率,得到一個新的樣本分佈D3,一個子分類器h2

  第三步:

  得到一個子分類器h3

整合所有子分類器:

因此可以得到整合的結果,從結果中看,及時簡單的分類器,組合起來也能獲得很好的分類效果,在例子中所有的。