###はじめに
Kaggleなどでよく使われる手法の1つにFactorization Machinesがあります。手法についての説明は、日本語の記事だと、@wwackyさんのこちらの記事が非常に参考になります。元文献はこちら(Factorization Machines)。こちらの記事中の、どうやってFactorization Machinesを実行したらいいの?の部分に、libFMというライブラリを使うといいよ、との記述がありました。このlibFMはC++で書かれていることもあり、高速ですがプログラミングゆるふわ勢にはちょっととっつきにくいところがあります。
Rで使えたらいいなと思って探していたところ、libFMのwrapperである、libFMexeというパッケージを見つけたので、インストールの手順をパッケージのGithub (R Wrapper for the libFM Executable)を参考にまとめました。
###インストール
インストールに先立ち、libFMをインストールしておく必要があります。私の環境はOSX 10.10.5です。ソースコードを落としてきて解凍、ディレクトリを移動してmake all
でインストールできました。
続いてRパッケージのインストールです。
# install.package("devtools")
library(devtools)
# install.package("devtools")
devtools::install_github("andland/libFMexe")
定番のdevtoolsからインストール出来ます。
このまま使えればベストですが、RからlibFMのPATH
を通しておかないと動きませんでした。こちらの記事(Building R packages: missing path to pdflatex)を参照し、
Sys.setenv(PATH=paste(Sys.getenv("PATH"),"/Users/local/libfm-1.42.src/bin",sep=":"))
で、libfm-1.42.src/bin
にパスを通せばめでたく動かせるようになります。もしくは以下のように、計算を実行する際にパスを直接exe_loc
内に指定することでも計算が実行できるようです。
libFM(..., exe_loc = "/Users/local/libfm-1.42.src/bin")
実行の詳細はパッケージのGithub (R Wrapper for the libFM Executable)や、helpをご参照いただければと思いますが、以下のようにtraining, testデータを指定し、formula
, 次元数, iter
, task
(回帰"r
" or 分類"c
")を指定すれば動きます。この他には最適化の手法 ("mcmc",
"sgd", "als", "sgda") を選んだりもできるようですね。
library(libFMexe)
data(movie_lens)
set.seed(1)
train_rows = sample.int(nrow(movie_lens), nrow(movie_lens) * 2 / 3)
train = movie_lens[train_rows, ]
test = movie_lens[-train_rows, ]
predFM = libFM(train, test, Rating ~ User + Movie,
task = "r", dim = 10, iter = 500)
mean((predFM - test$Rating)^2)
#> [1] 0.8191034
私はFactorization Machinesの中身やプログラム周りに詳しいわけではないので、普段使っている環境で試しながら勉強できるのはとてもありがたいですね。だれかの参考になれば幸いです。
###参考資料
R Wrapper for the libFM Executable
libFM: Factorization Machine Library
Building R packages: missing path to pdflatex
Factorization Machines
Factorization Machinesについて調べてみた