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

27
大事な話は他の人に譲ってReproducible Researchの話 2013/09/06 Data Scientist Casual Talk in 白金台 和田 計也 サイバー系

description

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

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

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

大事な話は他の人に譲ってReproducible Researchの話

2013/09/06Data Scientist Casual Talk in 白金台

和田 計也

サイバー系

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

2013/09/06

はじめに

※この発表は個人の見解であり、所属する組織の公式見解ではありません。

サイバー系

2

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

2013/09/06

u和田 計也(@wdkz)u 静岡県袋井市出身

uサイバー系企業でデータマイニングエンジニア職u 最近はJUDY AND MARYばっか聴いてます

u前職はバイオベンチャーu バイオマーカ探索してたu 学生時代は枯草菌の研究

自己紹介サイバー系

3

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

2013/09/06

いきなりですがサイバー系

u祝!出版!!

4

u 具体的な事例が豊富u 入門用として最適u コナンの正体は工藤新一

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

2013/09/06

Reproducible Research意識してますか?サイバー系

u 再利用・再現可能な分析のことu ⬇こんな経験ありませんか?

✦ データ取得どうやったっけ??✦ SQL忘れたー✦ モデリングに突っ込むデータフレームどう作ったっけ?✦ プロット図どうやって描いたっけ??

u 全部時間の無駄ですu はい、今日からknitr使いましょう

5

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

2013/09/06

やり方はとても簡単サイバー系

6

R Studioでごく普通にコーディングして 押す

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

2013/09/06

やり方はとても簡単サイバー系

7

何か出るけど気にせず「Compile」ボタン押す

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

2013/09/06

はい、できましたサイバー系

8

u R使って分析するなら今日から早速knitr使いましょうu markdown形式で記述できるRmdもありますよ(数式とかも描ける) http://rpubs.com/wdkz/8129

ソースコードと実行結果が一体となったhtmlファイルが生成された!!

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

2013/09/06

サイバー系

9

前置きはこのくらいにして

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

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

今日はこれの話

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

2013/09/06

rmr2パッケージ使ってみるかサイバー系

u rmr2パッケージ使って、RからHadoopのMap Reduce使うu Map Reduce版のthe Worldといえばword countu toy data はPubmedからちょっくら取得

11

⬇Pubmed(医療系のジャーナル検索サイト)

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

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の論文サマリ取得

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

2013/09/06

toy dataの中身とhdfsへの転送サイバー系

13

⬆こんな感じで、取得できた論文数の長さの文字列ベクトル

★ローカルのRオブジェクトをhdfs上に送る

★toy dataの取得

★hdfs上のパス

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

2013/09/06

hdfs上でのdataの中身サイバー系

14

⬆こんな感じでkey-value型になっているが、to.dfs()で転送した場合は大抵keyはNULL

★中身

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

2013/09/06

Mapフェーズサイバー系

15

⬆こんな感じで文字列ベクトルvをpatternで分割して単語にし、その単語をkey, 1(単語出現数)をvalueとするkey-valueを構成する

★Mapの関数定義NULL 文章(文字列ベクトル)

★Map関数適用後にできるもの・・・以下のようなリスト

Key

Value

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

2013/09/06

Reduceフェーズサイバー系

16

⬆こんな感じでkey(単語)ごとにgroup byして、1をsumするから、最終的に文字数が出るよ

★Reduceの関数定義単語 1(カウント)

★Reduce関数適用後にできるもの・・・以下のようなリスト

Key

Value

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

2013/09/06

Map Reduce発動サイバー系

17

★Map Reduceの関数定義map関数 reduce関数hdfs上の入力

ファイル

⬆こんな感じでMap Reduce処理を発動させる。戻り値はhdfs上のパスだが、上記の例のように戻り値を変数に保存してない場合は以下のようにすれば大丈夫

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

2013/09/06

結果サイバー系

18

★結果の整形

蟹好きだということがわかった

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

2013/09/06

サイバー系

19

(中途半端な)応用事例

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

2013/09/06

Hadoop上で動かすrandomForestサイバー系

20

★randomForest on Map-Reduce概要_モデル構築

��train�� ����� �

� model ����

Map� Reduce�

�� ����

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

2013/09/06

Hadoop上で動かすrandomForestサイバー系

21

★randomForest on Map-Reduce概要_予測

��test����������

������

������

������

Map� Reduce�

�� ��� ����

�������

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

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)�}�

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

2013/09/06

簡易実装例_変数重要度サイバー系

23

variableImp <- function(wf_mdl, var_output=NULL){� #variableImportace���Mapper #� ��key, MeanDecreaseGinivalue 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.fun)�}�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)))�}�

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

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)�} �

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

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))�

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

2013/09/06

待望のRevolution R Enterprise 7サイバー系

26

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

2013/09/06

最後にサイバー系

•Reproducible Research意識して下さい•R(RStudio)なら追加コスト追加工数なしで簡単に実現できます

•RHadoop•今後のRevolution R Enterprise7

のリリースに期待•MahoutのrandomForest

(DecisionForest)でちゃんとスケールして 大きなデータを動かせた人いましたら教えて下さい

27