Your SlideShare is downloading. ×
0
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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

1,320

Published on

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

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

Published in: Education
0 Comments
14 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,320
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
9
Comments
0
Likes
14
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 大事な話は他の人に譲ってReproducible Researchの話 2013/09/06 Data Scientist Casual Talk in 白金台 和田 計也 サイバー系
  • 2. 2013/09/06 はじめに ※この発表は個人の見 解であり、所属する組 織の公式見解ではあり ません。 サイバー系 2
  • 3. 2013/09/06 u和田 計也(@wdkz) u 静岡県袋井市出身 uサイバー系企業でデータマイニングエンジニア職 u 最近はJUDY AND MARYばっか聴いてます u前職はバイオベンチャー u バイオマーカ探索してた u 学生時代は枯草菌の研究 自己紹介 サイバー系 3
  • 4. 2013/09/06 いきなりですが サイバー系 u祝!出版!! 4 u 具体的な事例が豊富 u 入門用として最適 u コナンの正体は工藤新一
  • 5. 2013/09/06 Reproducible Research意識してますか? サイバー系 u 再利用・再現可能な分析のこと u ➡こんな経験ありませんか? ✦ データ取得どうやったっけ?? ✦ SQL忘れたー ✦ モデリングに突っ込むデータフレームどう作ったっけ? ✦ プロット図どうやって描いたっけ?? u 全部時間の無駄です u はい、今日からknitr使いましょう 5
  • 6. 2013/09/06 やり方はとても簡単 サイバー系 6 R Studioでごく普通にコーディングして 押す
  • 7. 2013/09/06 やり方はとても簡単 サイバー系 7 何か出るけど気にせず「Compile」ボタン押す
  • 8. 2013/09/06 はい、できました サイバー系 8 u R使って分析するなら今日から早速knitr使いましょう u markdown形式で記述できるRmdもありますよ(数式 とかも描ける) http://rpubs.com/wdkz/8129 ソースコードと 実行結果が一体 となったhtmlフ ァイルが生成さ れた!!
  • 9. 2013/09/06 サイバー系 9 前置きは このくらい にして
  • 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. 2013/09/06 rmr2パッケージ使ってみるか サイバー系 u rmr2パッケージ使って、RからHadoopのMap Reduce使う u Map Reduce版のthe Worldといえばword count u toy data はPubmedからちょっくら取得 11 ➡Pubmed(医療系のジャーナル検索サイト)
  • 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. 2013/09/06 toy dataの中身とhdfsへの転送 サイバー系 13 こんな感じで、取得できた論文数の長さの文字列ベクトル ★ローカルのRオブジェクトをhdfs上に送る ★toy dataの取得 ★hdfs上のパス
  • 14. 2013/09/06 hdfs上でのdataの中身 サイバー系 14 こんな感じでkey-value型になっているが、 to.dfs()で転送した場合は大抵keyはNULL ★中身
  • 15. 2013/09/06 Mapフェーズ サイバー系 15 こんな感じで文字列ベクトルvをpatternで 分割して単語にし、その単語をkey, 1(単語出現 数)をvalueとするkey-valueを構成する ★Mapの関数定義 NULL 文章(文字列ベクトル) ★Map関数適用後にできるもの・・・以下のようなリスト Key Value
  • 16. 2013/09/06 Reduceフェーズ サイバー系 16 こんな感じでkey(単語)ごとにgroup byして、 1をsumするから、最終的に文字数が出るよ ★Reduceの関数定義 単語 1(カウント) ★Reduce関数適用後にできるもの・・・以下のようなリスト Key Value
  • 17. 2013/09/06 Map Reduce発動 サイバー系 17 ★Map Reduceの関数定義 map関数 reduce関数hdfs上の入力 ファイル こんな感じでMap Reduce処理を発動させる。 戻り値はhdfs上のパスだが、上記の例のように戻 り値を変数に保存してない場合は以下のようにすれ ば大丈夫
  • 18. 2013/09/06 結果 サイバー系 18 ★結果の整形 蟹好きだということがわかった
  • 19. 2013/09/06 サイバー系 19 (中途半端な) 応用事例
  • 20. 2013/09/06 Hadoop上で動かすrandomForest サイバー系 20 ★randomForest on Map-Reduce概要_モデル構築 train model Map Reduce
  • 21. 2013/09/06 Hadoop上で動かすrandomForest サイバー系 21 ★randomForest on Map-Reduce概要_予測 test Map Reduce
  • 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. 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. 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. 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. 2013/09/06 待望のRevolution R Enterprise 7 サイバー系 26
  • 27. 2013/09/06 最後に サイバー系 •Reproducible Research意識して下さい •R(RStudio)なら追加コスト追加工数なしで 簡単に実現できます •RHadoop •今後のRevolution R Enterprise7 のリリースに期待 •MahoutのrandomForest (DecisionForest)でちゃんとスケールして 大きなデータを動かせた人いましたら教えて下さい 27

×