渋谷駅前で働くデータサイエンティストのブログ

元祖「六本木で働くデータサイエンティスト」です / 道玄坂→銀座→東京→六本木→渋谷駅前

{xgboost}パッケージのインストールについて(ハマった体験談含む)

ここ数日KaggleのOttoを暇潰しにやってみたりした都合で{xgboost}も初挑戦してみたんですが、そのインストールの際に猛烈にトラブったケースが幾つかあったので備忘録的に記事に書き起こしておきます。実は英語圏でもあまりまとまった記事がないというか、元の開発者のGitHub Issuesを見てもまとめられてない*1ので、もしかしたらまとめておくと貴重かも?



そうそう、{xgboost}自体の記事はまた改めて。。。既に色々な人が良記事をバシバシupしちゃった後なのであまり書くことないんですが(汗)。あとここで書いているのは全部Windows 7マシンの話なので、他にもトラブルが頻発しているらしいUbuntuの状況などは特に触れてません、ごめんなさい。


1. install.packagesではなくdevtoolsのinstall_githubでインストールすべし


2015年5月現在、{devtools}はCRANからは削除されていてinstall.packagesではインストールできません。GitHub上の野良パッケージをインストールする際に必須の{devtools}パッケージをまずCRANからインストールして、その中のinstall_githubで{xgboost}をインストールしましょう。やり方は

> devtools::install_github('dmlc/xgboost',subdir='R-package')

でも

> library(devtools)
> install_github('dmlc/xgboost',subdir='R-package')

でも大丈夫です。基本的にはこれで問題なく{xgboost}がインストールできるはずです。ただし{devtools}はRtoolsとセットで動かすことが多いので、Rtoolsを入れてない方は必ずRtoolsも入れておきましょう。なおRtoolsまわりのトラブルについては以前の記事もご参照あれ。



gccのパス設定は何回やってもコケることがあるので、ちょくちょくチェックしておいた方が無難です*2


2. devtools::install_githubがコケる際は、{devtools}の最新バージョンにアップデートするべし


ところが、devtoolsは基本的に裏側でRtools内のgccコンパイル&ビルドする動作を行う関係で、場合によっては何かしらの理由でcompilation failedとか言ってコンパイルがコケることがあります。


{xgboost}のIssuesでも同じ質問があり、そこでは「とりあえず{devtools}を最新バージョンにアップデートしろ」と言われているようです。ということで、コンパイルがコケるようならまずは{devtools}のアップデート(再インストール)を行いましょう。これで大体うまくいくはずです。


なお、意外と盲点なのが{Rcpp}。{devtools}の再インストールなどのドサクサに紛れてRが勝手に{Rcpp}を削除していることがあるので、パッケージ一覧を見て確認した方が無難です。ついでに{Rcpp}もアップデートしておくのが良いかなと思います。


3. gccでコケてるっぽい時は、まずRtoolsの最適なバージョンを再インストールするべし


僕は遭遇しませんでしたが、開発元のGitHub IssuesやKaggleのForumで話題になっていた不具合がこれ。{devtools}のバージョンが最新なのに、それでもコンパイルがコケるケースがちらほらあるようです。この場合、gcc自体がコケていることがあるので、まずは試しにHello WorldをRコンソール上でやってみましょう。

> library(Rcpp)
> library(inline)
> src <- '
+ std::vector<std::string> s; 
+ s.push_back("hello");
+ s.push_back("world");
+ return Rcpp::wrap(s);
+ '
> hellofun <- cxxfunction(body = src, includes = '', plugin = 'Rcpp', verbose = FALSE)
cygwin warning:
  MS-DOS style path detected: C:/PROGRA~1/R/R-30~1.2/etc/i386/Makeconf
  Preferred POSIX equivalent is: /cygdrive/c/PROGRA~1/R/R-30~1.2/etc/i386/Makeconf
  CYGWIN environment variable option "nodosfilewarning" turns off this warning.
  Consult the user's guide for more details about POSIX paths:
    http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
> cat(hellofun(), '\n')
hello world 


という感じで、gccがちゃんと走っていればこのようにうまく行くはずですが、こうならない時はRtoolsのバージョンが正しくない可能性があります。RtoolsはR側のバージョンによって適しているバージョンが異なるので、Rtoolsの対応表をよく見て最適のバージョンを再インストールしましょう。



ここまでやれば基本的には{xgboost}もちゃんと入るはずです。


4. それでもダメな時は、GitHubのxgboostリポジトリ全体をクローンしてきた上で、そのトップディレクトリからコマンドラインでインストールするべし


実はそれでもダメなケースがあって、というかこれが僕が最後にWin7マシンに入れようとしてハマったケース。gccもちゃんと動いてる*3のに、なおかつ{devtools}も最新なのに、何故か{xgboost}内のヘッダファイルに対してPermission deniedが出てコンパイルがコケるという。


これはもうどうにもならないので、その時は一旦GitHubのxgboostリポジトリ全体をクローンしてきてローカルに置きましょう。Win7であれば、そのローカルに置いたリポジトリのトップディレクトリからコマンドプロンプト

$ R CMD INSTALL R-package


とすればC++ソースコンパイルもインストールも全部走ります。一応、インストールが終わったら念のため一度Rを立ち上げて{xgboost}がきちんとロードできるかどうか確かめておきましょう。


反省


今回だいぶハマったせいで色々な海外のR関連サイト見て回ったんですが、最後の手段としての「シェルから直接パッケージインストールする」というのは割とかなり有効であるらしいということが分かったので、今後は積極的に使っていこうと思います。。。

*1:というかdocumentation自体がいい加減で全然整備されてない

*2:ありがちなのがRtools由来以外のC系コンパイラを後からインストールして、そのパスの優先順位が上になってしまっているとか

*3:試しにHello WorldをRコンソール上でやったらちゃんとコンパイルが走った