XGBoost是一種基于決策樹(CART)的分布式的高效的梯度提升算法,它可被應用到分類、回歸、排序等任務中,與一般的GBDT算法相比,XGBoost主要有以下幾個優點:
- 對葉節點的權重進行了懲罰,相當于添加了正則項,防止過拟合
- XGBoost的目标函數優化利用了損失函數關于待求函數的二階導數,而GBDT隻利用了一階資訊
- XGBoost支援列采樣,類似于随機森林,建構每棵樹時對屬性進行采樣,訓練速度快,效果好
- 類似于學習率,學習到一棵樹後,對其權重進行縮減,進而降低該棵樹的作用,提升可學習空間
- 建構樹的算法包括精确的算法和近似的算法,近似的算法對每維特征權重分位進行分桶,具體的算法利用到了損失函數關于待求樹的二階導數。
- 添加了對于稀疏資料的支援,當資料的某個特征缺失時,将該資料劃分到預設的子節點,本文提出了一個算法來求解這個預設方向。
- 可并行的近似直方圖算法,分裂節點時,資料在block中按列存放,而且已經經過了預排序,是以可以并行計算,即同時對各個屬性周遊最優分裂點
那麼如何在mac下安裝xgboost呢
系統版本
macOS Sierra 版本 10.12.3
有兩種方法:
1. pip安裝
- 第一步:安裝HomeBrew
HomeBrew是mac系統的包管理軟體,類似于ubuntu的
apt-get
或者centos的
yum
,安裝方法如下,在終端中輸入:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
- 第二步:安裝livm
brew install llvm
llvm是Mac下的一個編譯器,可以用來編譯C和C++程式.最新的llvm已經包含了OpenMP.
注意, Mac下的XCode帶有clang編譯器, 但是是不支援OpenMP的,是以不能用來編譯XGBoost.
- 第三步:安裝clang-omp
brew install clang-omp
有人提到clang-omp已經從HomeBrew移除了, 如果找不到clang-omp可以嘗試 brew install --with-clang llvm
- 第四步, 用pip安裝XGBoost
pip install xgboost
大功告成!
2. 從Github庫下載下傳最新版XGBoost安裝
- 第一步:克隆最新的XGBoost到本地
git clone --recursive https://github.com/dmlc/xgboost
- 第二步:安裝gcc
brew install gcc5 --without-multilib
- 第三步:修改XGBoost的config檔案
cd xgboost
cp make/config.mk ./config.mk
很多攻略都是直接将以下這兩行
# export CC = gcc
# export CXX = g++
改為:
export CC = gcc-5
export CXX = g++-5
但是我直接這樣做卻一直報錯,無法編譯通過。搞了半天才發現系統找不到gcc,原來是macOS已經不自帶gcc環境了,通過Homebrew安裝系統也識别不到。
正常情況下是可以通過port來檢視系統裡安裝的gcc的:
安裝gcc_select
/opt/local/bin/port install gcc_select
檢視gcc清單
port select --list gcc
還可以選擇gcc的版本
sudo port select --set gcc mp-gcc5
但是很不幸,我執行
port select --list gcc
得到的結果是
Available versions for gcc:
none (active)
但是明明Homebrew安裝成功了啊,于是到Homebrew的安裝目錄下瞧一瞧:
cd /usr/local/bin
,發現裡面靜靜躺着
gcc5
,
gcc7
,系統就是無法識别這裡的gcc。。。搜了半天沒找到解決方案,最後,機智的我直接把
config.mk
修改成:
export CC = /usr/local/bin/gcc-5
export CXX = /usr/local/bin/g++-5
export MPICXX = /usr/local/bin/mpicxx
就是帶上具體的路徑,然後儲存
- 第四步:開始編譯
make clean_all && make -j4
- 第五步:安裝python包
cd python-package
python setup.py install
至些XGBoost終于安裝成功!
在python環境中測試一下:
import xgboost
xgboost.__version__
輸出'0.6'