データサイエンティストカジュアルトーク by wdkz

1,773 views

Published on

knitrによる再現可能な分析の力説とRHadoopの使い方について

Published in: Education

データサイエンティストカジュアルトーク by wdkz

  1. 1. 大事な話は他の人に譲ってReproducible Researchの話 2013/09/06 Data Scientist Casual Talk in 白金台 和田 計也 サイバー系
  2. 2. 2013/09/06 はじめに ※この発表は個人の見 解であり、所属する組 織の公式見解ではあり ません。 サイバー系 2
  3. 3. 2013/09/06 u和田 計也(@wdkz) u 静岡県袋井市出身 uサイバー系企業でデータマイニングエンジニア職 u 最近はJUDY AND MARYばっか聴いてます u前職はバイオベンチャー u バイオマーカ探索してた u 学生時代は枯草菌の研究 自己紹介 サイバー系 3
  4. 4. 2013/09/06 いきなりですが サイバー系 u祝!出版!! 4 u 具体的な事例が豊富 u 入門用として最適 u コナンの正体は工藤新一
  5. 5. 2013/09/06 Reproducible Research意識してますか? サイバー系 u 再利用・再現可能な分析のこと u ➡こんな経験ありませんか? ✦ データ取得どうやったっけ?? ✦ SQL忘れたー ✦ モデリングに突っ込むデータフレームどう作ったっけ? ✦ プロット図どうやって描いたっけ?? u 全部時間の無駄です u はい、今日からknitr使いましょう 5
  6. 6. 2013/09/06 やり方はとても簡単 サイバー系 6 R Studioでごく普通にコーディングして 押す
  7. 7. 2013/09/06 やり方はとても簡単 サイバー系 7 何か出るけど気にせず「Compile」ボタン押す
  8. 8. 2013/09/06 はい、できました サイバー系 8 u R使って分析するなら今日から早速knitr使いましょう u markdown形式で記述できるRmdもありますよ(数式 とかも描ける) http://rpubs.com/wdkz/8129 ソースコードと 実行結果が一体 となったhtmlフ ァイルが生成さ れた!!
  9. 9. 2013/09/06 サイバー系 9 前置きは このくらい にして
  10. 10. 2013/09/06 (今日の本題)RHadoopについて サイバー系 u RからHadoop使えるパッケージ群 u 以下の3つのパッケージからなる • rmr2・・・Rから簡単にMap Reduce使える • rhdfs・・・Rからhdfsへの読み書きができる • rhbase・・・RからHBaseへの読み書きができる u Revolution R 作ってるRevolutionAnalytics社が作ってる u https://github.com/RevolutionAnalytics/RHadoop/wiki 10 今日はこれの話
  11. 11. 2013/09/06 rmr2パッケージ使ってみるか サイバー系 u rmr2パッケージ使って、RからHadoopのMap Reduce使う u Map Reduce版のthe Worldといえばword count u toy data はPubmedからちょっくら取得 11 ➡Pubmed(医療系のジャーナル検索サイト)
  12. 12. 2013/09/06 toy dataの取得用関数(参考) サイバー系 12 library(RCurl) library(XML) #検索ワードからpmidを取得 get.pmid <- function(term="wada+kazuya[author]"){ url.str <- paste0("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi? db=pubmed&term=", term) xml1 <- xmlTreeParse(getURL(url.str)) pmids.list <- xml1[["doc"]][["eSearchResult"]][["IdList"]] pmids <- rep(NA, length=length(pmids.list)) for(i in 1:length(pmids.list)){ pmids[i] <- as.integer(xmlValue(pmids.list[[i]])) } return(pmids) } #pmidから論文のAbstructを取得 get.pmsummary <- function(pmids=c(21799770,21416533)){ url.str <- paste0("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi? db=pubmed&id=", paste(pmids, collapse=","), "&retmode=xml") xml1 <- xmlTreeParse(getURL(url.str)) pm.summaries <- xml1[["doc"]][["PubmedArticleSet"]] pmsummary <- rep(NA, length=length(pm.summaries)) for(i in 1:length(pm.summaries)){ pmsummary[i] <- xmlValue(pm.summaries[[i]][[1]][["Article"]][["Abstract"]] [["AbstractText"]]) } return(pmsummary) } pmsummary <- get.pmsummary(get.pmid("wada+kazuya[author]")) #wdkzの論文サマリ取得
  13. 13. 2013/09/06 toy dataの中身とhdfsへの転送 サイバー系 13 こんな感じで、取得できた論文数の長さの文字列ベクトル ★ローカルのRオブジェクトをhdfs上に送る ★toy dataの取得 ★hdfs上のパス
  14. 14. 2013/09/06 hdfs上でのdataの中身 サイバー系 14 こんな感じでkey-value型になっているが、 to.dfs()で転送した場合は大抵keyはNULL ★中身
  15. 15. 2013/09/06 Mapフェーズ サイバー系 15 こんな感じで文字列ベクトルvをpatternで 分割して単語にし、その単語をkey, 1(単語出現 数)をvalueとするkey-valueを構成する ★Mapの関数定義 NULL 文章(文字列ベクトル) ★Map関数適用後にできるもの・・・以下のようなリスト Key Value
  16. 16. 2013/09/06 Reduceフェーズ サイバー系 16 こんな感じでkey(単語)ごとにgroup byして、 1をsumするから、最終的に文字数が出るよ ★Reduceの関数定義 単語 1(カウント) ★Reduce関数適用後にできるもの・・・以下のようなリスト Key Value
  17. 17. 2013/09/06 Map Reduce発動 サイバー系 17 ★Map Reduceの関数定義 map関数 reduce関数hdfs上の入力 ファイル こんな感じでMap Reduce処理を発動させる。 戻り値はhdfs上のパスだが、上記の例のように戻 り値を変数に保存してない場合は以下のようにすれ ば大丈夫
  18. 18. 2013/09/06 結果 サイバー系 18 ★結果の整形 蟹好きだということがわかった
  19. 19. 2013/09/06 サイバー系 19 (中途半端な) 応用事例
  20. 20. 2013/09/06 Hadoop上で動かすrandomForest サイバー系 20 ★randomForest on Map-Reduce概要_モデル構築 train model Map Reduce
  21. 21. 2013/09/06 Hadoop上で動かすrandomForest サイバー系 21 ★randomForest on Map-Reduce概要_予測 test Map Reduce
  22. 22. 2013/09/06 簡易実装例_model構築 サイバー系 22 wadandomForest <- function(formula, data, ndiv=10,...){� data.hdfs <- to.dfs(data) # hdfs # _Maper ndiv map.fun <- function(k, v){� generate.rand <- function(i){� draws <- rpois(n=nrow(v), lambda=(1/ndiv))� indices <- rep((1:nrow(v)), draws)� keyval(i, v[indices, ])� }� c.keyval(lapply(1:ndiv, generate.rand))� }� # _Reducer randomForest hdfs reduce.fun <- function(k, v){� rf_mdl <- randomForest::randomForest(formula=formula, data=v, ...)� keyval(k, list(forest=rf_mdl))� }� #Map-Reduce mr_res <- mapreduce(input=data.hdfs, map=map.fun, reduce=reduce.fun)� }�
  23. 23. 2013/09/06 簡易実装例_変数重要度 サイバー系 23 variableImp <- function(wf_mdl, var_output=NULL){� #variableImportace Mapper # key, MeanDecreaseGini value map.fun <- function(k, v){� mk.keyval <- function(i){� keyval(key=rownames(v[[i]]$importance), val=as.numeric(v[[i]]$importance))� }� c.keyval(lapply(1:length(k), mk.keyval))� }� #variableImportance reduce reduce.fun <- function(k, v){� keyval(k, mean(v))� }� #MR mr_res <- mapreduce(input=wf_mdl$model_output, map=map.fun, reduce=reduce.f }� variableImp.plot <- function(vi_df=as.data.frame(varImportance)){� library(ggplot2)� print(ggplot(vi_df, aes(x=key, y=val)) + geom_bar(stat="identity") � ���������+ opts(axis.text.x=theme_text(angle=-90)))� }�
  24. 24. 2013/09/06 簡易実装例_予測 サイバー系 24 predict.wadandomForest <- function(wf_mdl, data, ...){ � data.hdfs <- to.dfs(data)� #predict Mapper map.fun <- function(k, v){� generate.rnd <- function(i){� draws <- rpois(n=nrow(v), lambda=0.2)� indices <- rep((1:nrow(v)), draws)� vv <- v[unique(indices), ]� rf_mdl <- rf_mdls$val[[sample(length(rf_mdls$key),1)]]� vv_prd <- predict(rf_mdl, vv, …)� keyval(as.integer(names(vv_prd)), as.integer(vv_prd))� }� library(randomForest)� rf_mdls <- from.dfs(wf_mdl$model_output)� c.keyval(lapply(1:100, generate.rnd)) � } #predict reduce reduce.fun <- function(k, v){� keyval(k, mean(v))� }� #MR mr_res <- mapreduce(input=data.hdfs, map=map.fun, reduce=reduce.fun)� } �
  25. 25. 2013/09/06 randomForest on Hadoop実行結果例 サイバー系 25 ★randomForest on Map-Reduce概要_予測 �������������1 ���� 2� 1 45576 1664� 2 ��3893 5824� #model hdfs wf_mdl <- wadandomForest(formula=label ~ ., data=train.data)� # wf_varImp <- variableImp(wf_mdl)� varImportance <- from.dfs(wf_varImp)� variableImp.plot(as.data.frame(varImportance))� # wf_pred <- predict.wadandomForest(wf_mdl, test.data)� wf_result <- from.dfs(wf_pred)� # table(as.integer(gf_test$label), ifelse(wf_result$val>=1.5,2,1))�
  26. 26. 2013/09/06 待望のRevolution R Enterprise 7 サイバー系 26
  27. 27. 2013/09/06 最後に サイバー系 •Reproducible Research意識して下さい •R(RStudio)なら追加コスト追加工数なしで 簡単に実現できます •RHadoop •今後のRevolution R Enterprise7 のリリースに期待 •MahoutのrandomForest (DecisionForest)でちゃんとスケールして 大きなデータを動かせた人いましたら教えて下さい 27

×