kabaohのブログ

仕事ができなすぎて辛いので、趣味に逃げるカバ野郎

xgboostが使いたくて

修行編を終えても一向にkaggleのスコアが上がらない。 ランダムフォレストやらSVMやらロジスティック回帰やら いろんなものを使ってみたけど上がらない

こまった。

フォーラムに何か有力情報はないだろうか。 そう思ってフォーラムを見たところ 少なくとも今取り組んでいるコンペではxgboostがいいらしい。

つかってみたい。 藁をも掴む思いで調べた。

これが長い戦いのはじまりだった。

初日

そもそもxgboostってなんだ、なにをやっているんだろう。

簡単に調べたところ弱分類器を複数組み合わせて 強力な分類器を作るということをやっているみたいだ。 ランダムフォレストに似ている気がするなぁというのが第一印象。 ランダムフォレストは弱分類器を決定木にして、それを複数組み合わせて 強力な分類器を作るという理屈じゃなかったろうか。

並列処理をさせるとか、弱分類器同士の優先順位とかその辺りが 違いそうな気はするけど、しらべていたらいつまでも調べて要られそうなきがした。

強いこころで、「まず使ってみる」を優先することにした。 なんてことだ、sklearnにないじゃないか。 インストールは翌日することにした。

二日目

環境構築を第一目標に作業開始。 kaggleのフォーラムをみたら

  1. ターミナルひらけよ
  2. gitのリポジトリcloneしろよ
  3. ビルドしろよ おわり

と書いていた。やってみた。 gitのリポジトリを cloneするところまでは良さそうだ。 ( フォーラムに書かれていた奴には--recusiveついてなかったが。)

git clone https://github.com/dmlc/xgboost.git --recursive

xgboostというディレクトリができているのでcdで移動 sudo make してビルド。

めっちゃWarningされてる dmlc-core/include/dmlc/omp.h:13:9: warning: Warning: OpenMP is not available, なんちゃらかんちゃら

OpenMPってなんだよ...

OpenMPは、並列コンピューティング環境を利用するために用いられる標準化された基盤。OpenMPは主に共有メモリ型並列計算機で用いられる。





(゜Д゜) ハア??





まぁよくわからんけど、並列処理をさせるのに必要らしい。 OpenMPを俺のMac環境に入れないと、本来のよさは得られない雰囲気。 また調べものが増えた...

三日目

OpenMPc/c++環境で動くものらしい。ここで問題が。cなのでコンパイラが必要なんだが どのコンパイラを使うかっていうところがきいてくるようだ。 gccを使えばよいんだろうが、Mavericksからgccがプリインストールされなくなったらしい。 brewで入れてもいいんだけど、プリインストールされていないものを使うのもなぁと思いclangで使うことにする。

なんかよいやつがあるらしいのでこれを使わせてもらう。 cloneして、なかに入ってるスクリプトをうごかす。がめっちゃ警告だされる。 どうやら、clangはちょっとしたことでも警告を出す使用というのをどこかでみた。
このあと、いろいろと頑張ってみたがうまく動かず、(config.mkのここを消せとか、ここも消さないととか)ちょっと面倒になった。 gccコンパイルすればもしかしてさくっと解決?と思った。

四日目

gccを使おうと思って gcc とターミナルでうったところ

clang: error: no input files

とか言ってきやがった。 clangじゃねぇよ!gcc使いたいんだよ!! 調べて見るとgccがclangのエイリアスに設定されているらしい。

許せん。
bashrcにalias gcc=gcc-5.2.0 を追加
これでどうじゃと、再びgcc -bash: gcc-5.2.0: command not found (ウィンドウを再度開くかbashrcを再度読み込むかするのを忘れちゃあかんで) 期待を込めて、make 同じエラーが出る...。
じゃあやっぱりclangでもええんか..いや、しかし。




ふぅ


clangの情報が溜まってきたのでやっぱりこっちで

再び、奴らの行ってきているmakefile.mkの450行目と451行目を削除する また-static-intelと-no-intel-extensionsがねぇよってうるさいので 1119行目あたりにあるその文言を消す。




make!!!


success !!!


うおおおおおとおもったけど、ソースコード全然読まずになんとなくで消した結果である。 この後何が起こるかさっぱりわかない。まだまだ戦いは続く。