0
黄色いゾウ使いの  パレード  ∼Mahout on AWS∼     都元ダイスケ  2012-12-15 @DevLOVE2012
自己紹介     • 都元ダイスケ (@daisuke_m)     • Java屋です     • java-jaから来ま(ry酒               Java              Mahout                 ...
works• 日経ソフトウエア • Java入門記事 • Eclipse記事
Mahoutインアクション
Mahoutとは• Javaで実装された• スケーラブルな• オープンソースの• 機械学習ライブラリ
代表的な機械学習• レコメンド(推薦)• クラスタリング• クラシファイイング(分類)• その他色々ある
アプリと機械学習• CRUD (create, read, update, delete)• FILTER (where)• AGGREGATE (count, sum, ave, max, min...)• SORT (order by)• ...
スケーラブル• 機械学習の精度は、データ量依存• データ量に応じ、計算量が指数的に増加• 大規模な計算リソースが必要• Hadoop (MapReduce)• AWS Elastic MapReduce
レコメンド【input】                       【output】 1,101,5.0                    1128 [                                  1179:5.0,...
非分散レコメンド
入力データ (intro.csv) 1,101,5.0 1,102,3.0   4,101,5.0 1,103,2.5   4,103,3.0             4,104,4.5 2,101,2.0   4,106,4.0 2,102,...
簡単なレコメンドimport   java.io.File;import   java.util.List;import   org.apache.mahout.cf.taste.impl.model.file.FileDataModel;im...
結果!RecommendedItem[item:104, value:4.257081]RecommendedItem[item:106, value:4.0]
レコメンドの理屈• 1∼5の「ユーザ」• 101∼107の「アイテム」• そしてスコア
•   1さんと5さん似てる   •   2さんとは逆の好み?•   1さんと4さんも     •   3さんとの関連は    何と無く似てる          見えない
•   1 vs 5 = 0.94   •   1 vs 2 = -0.76•   1 vs 4 = 0.99   •   1 vs 3 = NaN                    •   1 vs 1 = 1.0
相関係数 • 1 vs 1 = 1.0 • 1 vs 2 = -0.7642652566278799 • 1 vs 3 = NaN • 1 vs 4 = 0.9999999999999998 • 1 vs 5 = 0.9449111825230...
http://ja.wikipedia.org/wiki/相関係数
この情報は          相関係数が低い4.25 =(   またはNaNなので   0.99 ×   0.94 ×   )/ 1.933.50 =(                        0.94 ×   )/ 0.944.00 =...
結果!                 (再掲)RecommendedItem[item:104, value:4.257081]RecommendedItem[item:106, value:4.0]
分散レコメンド
分散レコメンド【input】                        【output】 1,101,5.0                     1128 [                                   1179...
http://www.grouplens.org/node/73
MovieLens 10M             実は• 1万アイテム            これでも• 7万2千ユーザ   まだ小規模• 1千万評価     だと思う
データの 加工
S3入力の準備•バケットを作る        mahoutinaction-jp• ファイルを2つアップロード • mahout/mahout-core-0.7-job.jar • input10m/mahout-10m-ratings.dat
upload by codeimport   java.io.File;import   com.amazonaws.auth.*;import   com.amazonaws.services.s3.*;import   com.amazon...
EMRの起動• JAR Location  mahoutinaction-jp/mahout/  mahout-core-0.7-job.jar• JAR Arguments  org.apache.mahout.cf.taste.hadoop...
compute by codeimport   com.amazonaws.auth.*;import   com.amazonaws.services.elasticmapreduce.*;import   com.amazonaws.ser...
RunJobFlowRequest runRequest = new RunJobFlowRequest()! .withName("mahout-10m")! .withSteps(! ! ! new StepConfig()! ! ! ! ...
watch by codeAmazonElasticMapReduce emr = ...;RunJobFlowResult runResult = ...;String jobFlowId = runResult.getJobFlowId()...
結果を取り出す指定したロケーションにファイルが  いくつか生成されている。
download by codeimport   java.io.InputStream;import   java.util.List;import   com.amazonaws.auth.*;import   com.amazonaws....
Summary• 機械学習 は、ちょっとインテリな機能• 分散・非分散アルゴリズム • 非分散ならオンラインで • 分散ならAWSのEMRで
20121215 DevLOVE2012 Mahout on AWS
20121215 DevLOVE2012 Mahout on AWS
Upcoming SlideShare
Loading in...5
×

20121215 DevLOVE2012 Mahout on AWS

1,616

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,616
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
12
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Transcript of "20121215 DevLOVE2012 Mahout on AWS"

  1. 1. 黄色いゾウ使いの パレード ∼Mahout on AWS∼ 都元ダイスケ 2012-12-15 @DevLOVE2012
  2. 2. 自己紹介 • 都元ダイスケ (@daisuke_m) • Java屋です • java-jaから来ま(ry酒 Java Mahout 恭 OSGi Hadoop XML Jiemamy EclipseWicketオブジェクト指向 Maven HaskellDDD AWS Spring Scala 薬ライセンス
  3. 3. works• 日経ソフトウエア • Java入門記事 • Eclipse記事
  4. 4. Mahoutインアクション
  5. 5. Mahoutとは• Javaで実装された• スケーラブルな• オープンソースの• 機械学習ライブラリ
  6. 6. 代表的な機械学習• レコメンド(推薦)• クラスタリング• クラシファイイング(分類)• その他色々ある
  7. 7. アプリと機械学習• CRUD (create, read, update, delete)• FILTER (where)• AGGREGATE (count, sum, ave, max, min...)• SORT (order by)• INTELLIGENCE (machine learning)
  8. 8. スケーラブル• 機械学習の精度は、データ量依存• データ量に応じ、計算量が指数的に増加• 大規模な計算リソースが必要• Hadoop (MapReduce)• AWS Elastic MapReduce
  9. 9. レコメンド【input】 【output】 1,101,5.0 1128 [ 1179:5.0, 1,102,3.0 3160:4.6582785, ..., 1,103,2.5 797:4.0637455 ] 2,101,2.0 1136[ 2,102,2.5 33493:4.8670673, 2,103,5.0 recommendation 6934:4.86497, ..., 230:4.335819 2,104,2.0 ] ... ...
  10. 10. 非分散レコメンド
  11. 11. 入力データ (intro.csv) 1,101,5.0 1,102,3.0 4,101,5.0 1,103,2.5 4,103,3.0 4,104,4.5 2,101,2.0 4,106,4.0 2,102,2.5 2,103,5.0 5,101,4.0 2,104,2.0 5,102,3.0 5,103,2.0 3,101,2.5 5,104,4.0 3,104,4.0 5,105,3.5 3,105,4.5 5,106,4.0 3,107,5.0
  12. 12. 簡単なレコメンドimport java.io.File;import java.util.List;import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;import org.apache.mahout.cf.taste.model.DataModel;import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;import org.apache.mahout.cf.taste.recommender.*;import org.apache.mahout.cf.taste.similarity.UserSimilarity;DataModel model = new FileDataModel(new File("intro.csv"));UserSimilarity similarity = new PearsonCorrelationSimilarity(model);UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model);Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);List<RecommendedItem> recommendations = recommender.recommend(1, 2);for (RecommendedItem recommendation : recommendations) {! System.out.println(recommendation);}
  13. 13. 結果!RecommendedItem[item:104, value:4.257081]RecommendedItem[item:106, value:4.0]
  14. 14. レコメンドの理屈• 1∼5の「ユーザ」• 101∼107の「アイテム」• そしてスコア
  15. 15. • 1さんと5さん似てる • 2さんとは逆の好み?• 1さんと4さんも • 3さんとの関連は 何と無く似てる 見えない
  16. 16. • 1 vs 5 = 0.94 • 1 vs 2 = -0.76• 1 vs 4 = 0.99 • 1 vs 3 = NaN • 1 vs 1 = 1.0
  17. 17. 相関係数 • 1 vs 1 = 1.0 • 1 vs 2 = -0.7642652566278799 • 1 vs 3 = NaN • 1 vs 4 = 0.9999999999999998 • 1 vs 5 = 0.944911182523068それぞれの人が1さんの予想評点に与える影響度
  18. 18. http://ja.wikipedia.org/wiki/相関係数
  19. 19. この情報は 相関係数が低い4.25 =( またはNaNなので 0.99 × 0.94 × )/ 1.933.50 =( 0.94 × )/ 0.944.00 =( もうアテにしない 0.99 × 0.94 × )/ 1.93 加重平均
  20. 20. 結果! (再掲)RecommendedItem[item:104, value:4.257081]RecommendedItem[item:106, value:4.0]
  21. 21. 分散レコメンド
  22. 22. 分散レコメンド【input】 【output】 1,101,5.0 1128 [ 1179:5.0, 1,102,3.0 3160:4.6582785, ..., 1,103,2.5 797:4.0637455 ] 2,101,2.0 1136[ 2,102,2.5 33493:4.8670673, 2,103,5.0 recommendation 6934:4.86497, ..., 230:4.335819 2,104,2.0 ] ... ... S3 EMR S3
  23. 23. http://www.grouplens.org/node/73
  24. 24. MovieLens 10M 実は• 1万アイテム これでも• 7万2千ユーザ まだ小規模• 1千万評価 だと思う
  25. 25. データの 加工
  26. 26. S3入力の準備•バケットを作る mahoutinaction-jp• ファイルを2つアップロード • mahout/mahout-core-0.7-job.jar • input10m/mahout-10m-ratings.dat
  27. 27. upload by codeimport java.io.File;import com.amazonaws.auth.*;import com.amazonaws.services.s3.*;import com.amazonaws.services.s3.model.Region;AWSCredentials cred = new BasicAWSCredentials( "AccessKeyID", "SecretAccessKey");AmazonS3 s3 = new AmazonS3Client(cred);s3.createBucket("mahoutinaction-jp", Region.AP_Tokyo);s3.putObject( "mahoutinaction-jp", "mahout/mahout-core-0.7-job.jar", new File("mahout-core-0.7-job.jar"));s3.putObject( "mahoutinaction-jp", "input10m/mahout-10m-ratings.dat", new File("mahout-10m-ratings.dat"));
  28. 28. EMRの起動• JAR Location mahoutinaction-jp/mahout/ mahout-core-0.7-job.jar• JAR Arguments org.apache.mahout.cf.taste.hadoop.item.RecommenderJob -Dmapred.map.tasks=40 -Dmapred.reduce.tasks=19 -Dmapred.input.dir=s3n://mahoutinaction-jp/input10m -Dmapred.output.dir=s3n://mahoutinaction-jp/output10m --numRecommendations 100 --similarityClassname SIMILARITY_PEARSON_CORRELATION
  29. 29. compute by codeimport com.amazonaws.auth.*;import com.amazonaws.services.elasticmapreduce.*;import com.amazonaws.services.elasticmapreduce.model.*;import com.amazonaws.services.elasticmapreduce.util.*;AWSCredentials cred = new BasicAWSCredentials( "AccessKeyID", "SecretAccessKey");AmazonElasticMapReduce emr = new AmazonElasticMapReduceClient(cred);emr.setEndpoint("elasticmapreduce.ap-northeast-1.amazonaws.com");RunJobFlowRequest runRequest = new RunJobFlowRequest() .withName("mahout-10m") .withSteps( ... ) // detailed on next page .withInstances( ... ) // detailed on next page .withAmiVersion("2.1.4") .withLogUri("s3n://mahoutinaction-jp/log");RunJobFlowResult runResult = emr.runJobFlow(runRequest);
  30. 30. RunJobFlowRequest runRequest = new RunJobFlowRequest()! .withName("mahout-10m")! .withSteps(! ! ! new StepConfig()! ! ! ! .withName("Setup Hadoop Debugging")! ! ! ! .withActionOnFailure(ActionOnFailure.TERMINATE_JOB_FLOW)! ! ! ! .withHadoopJarStep(! ! ! ! ! ! new StepFactory("ap-northeast-1.elasticmapreduce")! ! ! ! ! ! ! .newEnableDebuggingStep()),! ! ! new StepConfig()! ! ! ! .withName("Custom Jar")! ! ! ! .withActionOnFailure(ActionOnFailure.TERMINATE_JOB_FLOW)! ! ! ! .withHadoopJarStep(new HadoopJarStepConfig()! ! ! ! ! .withJar("s3n://mahoutinaction-jp/mahout/mahout-core-0.7-job.jar")! ! ! ! ! .withMainClass("org.apache.mahout.cf.taste.hadoop.item.RecommenderJob")! ! ! ! ! .withArgs(Arrays.asList(! ! ! ! ! ! ! "-Dmapred.map.tasks=40",! ! ! ! ! ! ! "-Dmapred.reduce.tasks=19",! ! ! ! ! ! ! "-Dmapred.input.dir=s3n://mahoutinaction-jp/input10m",! ! ! ! ! ! ! "-Dmapred.output.dir=s3n://mahoutinaction-jp/output10m",! ! ! ! ! ! ! "--numRecommendations", "100",! ! ! ! ! ! ! "--similarityClassname", "SIMILARITY_PEARSON_CORRELATION"))))! .withInstances(new JobFlowInstancesConfig()! ! .withPlacement(new PlacementType("ap-northeast-1a"))! ! .withInstanceCount(20)! ! .withMasterInstanceType("m1.small")! ! .withSlaveInstanceType("m1.small")! ! .withKeepJobFlowAliveWhenNoSteps(false)! ! .withHadoopVersion("0.20.205"))! .withAmiVersion("2.1.4")! .withLogUri("s3n://mahoutinaction-jp/logs"); 後でごゆっくりどうぞ
  31. 31. watch by codeAmazonElasticMapReduce emr = ...;RunJobFlowResult runResult = ...;String jobFlowId = runResult.getJobFlowId();DescribeJobFlowsRequest describeRequest = new DescribeJobFlowsRequest().withJobFlowIds(jobFlowId);DescribeJobFlowsResult describeResult = emr.describeJobFlows(describeRequest);JobFlowDetail detail = describeResult.getJobFlows().get(0);JobFlowExecutionStatusDetail statusDetail = detail.getExecutionStatusDetail();JobFlowExecutionState state = JobFlowExecutionState.fromValue(statusDetail.getState());// COMPLETED, FAILED, TERMINATED, RUNNING, SHUTTING_DOWN,// STARTING, WAITING, BOOTSTRAPPING
  32. 32. 結果を取り出す指定したロケーションにファイルが いくつか生成されている。
  33. 33. download by codeimport java.io.InputStream;import java.util.List;import com.amazonaws.auth.*;import com.amazonaws.services.s3.*;import com.amazonaws.services.s3.model.*;AWSCredentials cred = new BasicAWSCredentials( "AccessKeyID", "SecretAccessKey");AmazonS3 s3 = new AmazonS3Client(cred);ObjectListing listing = s3.listObjects( "mahoutinaction-jp", "output10m");List<S3ObjectSummary> summaries = listing.getObjectSummaries();for (S3ObjectSummary summary : summaries) {! System.out.println(summary.getKey());! if (summary.getKey().endsWith("/_SUCCESS")) {! ! continue;! }! S3Object obj = s3.getObject("mahoutinaction-jp", summary.getKey());! InputStream in = obj.getObjectContent();! // ...}
  34. 34. Summary• 機械学習 は、ちょっとインテリな機能• 分散・非分散アルゴリズム • 非分散ならオンラインで • 分散ならAWSのEMRで
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×