RでRuleFitを実行できるパッケージpr

アンサンブル学習は便利だ。

randomForestなりLigthGBMなりXGBoostなり、適当にデータを突っ込んでもそれなりの予測モデルが得られる。

feature importanceという形でどの特徴量が予測に効いているかもわかる。

しかし、どこのセグメントが最も効果的かまでは答えてくれない。

 

アンサンブル学習に対してそういう問題意識をもっている人は10年前からいるわけで、以下の論文を読んだ(日本語・PDFがダウンロードされるので注意)。

https://ismrepo.ism.ac.jp/?action=repository_uri&item_id=31008&file_id=17&file_no=1

 

上記論文のイントロにはこうある。

アンサンブル学習法の多くが基本学習器に樹木構造接近法を利用している.その理由は,(1) 比較的簡単に基 本学習器の構成が可能であることと,(2) 説明変数の応答に対する影響を変数重要度という要約統計量で解釈で きること,(3) 計算速度が比較的高速なこと,にある (Friedman & Poescu, 2003).ただし,アンサンブル学習法では,モデルが「ブラックボックス化」されるため,元来,樹木構造接近法がもつ解釈の平易さを犠牲にしてい る.Friedman & Popescu(2008) は,樹木をそのままアンサンブルさせるのではなく,樹木によって構成されるふ し (ルール) をアンサンブルさせることで解釈が平易で,かつ予測力に優れた RuleFit 法を提案している.

 

RuleFit、便利そうである。

詳しい説明は上の論文に書いてあるのでそちらを参考にしてほしい(日本語)。

機械学習interpretabilityについてまとめた以下のサイトにおいても4章で紹介されている。

https://christophm.github.io/interpretable-ml-book/rulefit.html

また、ポチポチ機械学習システムでおなじみのDataRobotでも2番目(トップはXGBoost)によく使われているアルゴリズムらしい。

www.datasciencecentral.com

 

ということでRで使ってみたい。

RにはRulefitを実行できるパッケージとしてpreがある。

早速exampleを動かしてみよう。

と、ここまで書いて気づいたんだけど、githubの開発レポジトリにグラフィカルな解説があるからそっち読めばいいですよね。

https://github.com/marjoleinF/pre

以上、原著を読め。

本日の懺悔:dplyrでsliceをもっと活用しようね

懺悔です。
今まで私はある列の最小値を含む行を抽出する際、filter()を用いて以下のように書いていました。

library(dplyr)
iris %>% filter(Sepal.Length == min(Sepal.Length))

しかしbaseの書き方であればwhich.min()を使って以下のように書けます。

iris[which.min(iris$Sepal.Length), ]

dplyrでもwhich.minしたいな〜でもfilterにはTRUE/FALSEを返す関数しか指定できないしな〜とか独り合点していたわけです。
ですが、dplyrには行番号を入力にとるslice()があり、これを使えばwhich.min()できる。

library(dplyr)
iris %>% slice(which.min(Sepal.Length))

手癖で書ける範囲で満足し修練を怠っておりました。
ここに懺悔とさせていただきます。ZANGE

ggplot2でEXILEみたいなdensity plotを描く

タイトルのようなイメージしか持っておらず、検索しても出てこず、ホクソエム人力検索でやっと該当パッケージが判明したので、記事にしてインデックス化しておく。
その名はggridgesパッケージ。かつてはggjoyパッケージと呼ばれていたものが改名されたらしい。

使い方は簡単で、geom_density()の代わりにgeom_density_ridges()を使う。
ggplotのyにEXILEの各メンバーに当たるgroupを指定する
ついでにtheme_ridges()も指定しておくとよしなに見た目を調整してくれる。

library(ggridges)
ggplot(iris, aes(x = Sepal.Length, y = Species)) +
  geom_density_ridges(rel_min_height = 0.005) +
  scale_y_discrete(expand = c(0.01, 0)) +
  scale_x_continuous(expand = c(0.01, 0)) +
  theme_ridges()

f:id:dichika:20190129183710p:plain

このEXILEみたいなplotはridgeline plotというらしい。覚えましたか?覚えましたね?
https://www.d3-graph-gallery.com/ridgeline.html

Rでslack上の画像を保存してPDFにしてgoogle driveに保存する

タカヤナギ=サンアドベントカレンダー21日目の記事です。

ホクソエム社にはタカヤナギ=サン謹製の画像がアップロードされるチャンネルがあり、他メンバーはアップロードされる画像を黙々とダウンロード、そしてPDFに変換しているわけですが、こんなことは人間がやる仕事ではない。
ついでに言うとRでやる仕事でもない気がするが、せっかくなのでRでやる。

googledrive::drive_upload()の初回利用時に認証を求められる点に注意されたし。

library(httr)
library(lubridate)
library(googledrive)

# 指定したURLの画像を指定のgoogledriveのフォルダにアップロードする関数
saveImage <- function(obj, filetype, token){
  download_url <- obj$files[[1]]$url_private
  title <- gsub("[[:punct:]]|[[:space:]]", "_", obj$files[[1]]$title)
  response_image <- GET(download_url, add_headers(Authorization = paste("Bearer", token, sep = " ")))
  image <- content(response_image, "raw")
  f_temp <- tempfile()
  writeBin(image, con = glue("{f_temp}.{filetype}"))
  # ImageMagickでPDFに変換する
  system(glue("convert {f_temp}.{filetype} {f_temp}.pdf"))
  drive_upload(glue("{f_temp}.pdf"), 
               path = as_id("送り先のgoogledriveのURL"),
               name = glue("{title}.pdf")
  )
}


# slackから直近24時間の履歴を取得する
oldest <- as.numeric(Sys.time() -hours(24))
latest <- as.numeric(Sys.time())
token <- "トークン"
channel <- "タカヤナギ=サンの画像がアップされるチャンネルID" 

params <- list(
  token = token,
  channel = channel,
  count = 10000,
  latest = latest,
  oldest = oldest
)
endPoint.history <- 'https://slack.com/api/channels.history'
response <- POST(endPoint.history, 
             body = params,
             encode = "multipart",
             content_type = "application/x-www-form-urlencoded"
             )
response_json <- content(response, "parsed")

# jpg、ong、gif画像をPDFに変換し、google driveにアップロードする
for(i in seq_len(length(response_json$messages))){
  trg <- response_json$messages[[i]]
  if(!is.null(trg$files)){
    if(trg$files[[1]]$filetype %in% c("jpg","png","gif")){
      saveImage(trg, filetype = trg$files[[1]]$filetype, token = token)
    }}else{
      next
    }
}

自分の血糖値データを分析する

食事が与える身体的・精神的影響については常々気になっていた。
代謝の変化を測定する必要があるのだが、体重はあまりに大雑把だし、最近のウェアラブルバイスで測定できる脈拍は代謝を反映しているとは言い難い。
ということで先々週より持続的に血糖値を測定している。

もうすぐ測定が終わるので測定方法および簡単な分析も含めて詳細については以下のブログに書く予定。
http://blog.hoxo-m.com/

もちろんデータも公開する。

Enjoy!!

mmapのエラー

mmapを用いてデータを読み込もうとすると以下のエラーが出た。

 mmap(binfile, char()) でエラー: 
  unable to open file: possible permission issue. 

パーミッションに問題はない。
検索すると、ファイルパスにチルダを用いていたことが原因のようで、そこを修正すると問題なく読み込めた。

以下転載
https://groups.google.com/a/lbl.gov/forum/#!topic/singularity/0Zee4kobMxw

I had some vague recollection that is some contexts '~' is actually
interpreted as a literal and not expanded to your home directory
location. I ran this on my plain old hardware, no container, and I
get the same

> library(mmap)
> tmp <- "~/testmmap"
> ints <- as.mmap(1:100L, mode=int8(), file=tmp)
Error in mmap(file, as.Ctype(mode)) :
unable to open file: possible permission issue.

That's with R 3.4.2.

Compare to

> tmp <- path.expand("~/testmmap")
> tmp
[1] "/home/bennet/testmmap"
> ints <- as.mmap(1:100L, mode=int8(), file=tmp)
>

keras-PlaidML インストールチャレンジ

いい話を聞いた。

ということでリンク先のこれを試してみることにする。
http://rpubs.com/siero5335/399690

しかしうまくいかない。
大体において人生はうまくいかない。
小学校の時だって周囲が紫の大輪の朝顔を咲かせる中、私だけ白くて小さな朝顔だった。
プロポーズも大体失敗する。

まずinstall_keras()するとこういうメッセージが出た。

> install_keras()
Using existing virtualenv at  ~/.virtualenvs/r-tensorflow 
Upgrading pip ...
Collecting pip
  Could not fetch URL https://pypi.python.org/simple/pip/&#160;: There was a problem confirming the ssl certificate: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:590) - skipping

このSSLエラーはPythonを古いバージョン(私の場合は2.7.10)で放置もしくはOpenSSLを古いバージョンで放置していると起きるらしい。
https://qiita.com/n-funaki/items/00649013f61008da46cd

以下手順で対応した。
1.新しいバージョンのPython(2.7.15)をpyenvで追加し切り替える(以下参考)
https://qiita.com/twipg/items/75fc9428e4c33ed429c0
2.~/.virtualenvs/r-tensorflowを削除
3.再度install_keras()


で、今度はこういうエラーが出た。

> use_backend(backend = "plaidml")
 initialize_python(required_module, use_environment) でエラー: 
  Python shared library '/Users/dichika/.pyenv/versions/2.7.15/lib/libpython2.7.dylib' not found, Python bindings not loaded.

確かにlibpythonがNOT FOUNDとなっている。

> reticulate::py_discover_config("keras")

libpython:      /Users/dichika/.pyenv/versions/2.7.15/lib/libpython2.7.dylib[NOT FOUND]

確かに無い。pyenvが原因か!?ということで--enable-sharedをつけて再度2.7.15をインストール。辛い。以下参考。
https://qiita.com/some-nyan/items/56f2e23cc8c0134e33a7
https://qiita.com/kjunichi/items/7453814cb902158f9836

これでなんとか冒頭のコードを動かすことができた。
疲れた。

あまり関係ないけどvirtualenvの指定はreticulateパッケージでできることを学んだ。

reticulate::use_virtualenv("~/plaidml-venv")