HiiHahWIKI - making some notes for... -
Mahout:サンプル1:はじめてのレコメンド
をテンプレートにして作成
開始行:
[[Mahout:環境構築]]
*Mahout:サンプル1:はじめてのレコメンド [#xd802de1]
Mahoutを使った初めてのレコメンドです。
まあ、Mahout本に記載されているサンプルを実行してるだけで...
※Mahout本にはimportするクラスとか書いてないけど、きっとサ...
***サンプルコード [#h23b3875]
うだうだ長いですが、端的には
-DataModelにデータを食わせて
-Simirarityを計算させて
-Neighborhoodを計算させて
-そいつらを元にRecommenderを生成して
-RecommenderにレコメンドするユーザID(1)と提示(レコメン...
■RecommenderIntro.java
package test1;
import java.io.File;
import java.util.List;
import org.apache.mahout.cf.taste.impl.model.file.FileDa...
import org.apache.mahout.cf.taste.impl.neighborhood.Near...
import org.apache.mahout.cf.taste.impl.recommender.Gener...
import org.apache.mahout.cf.taste.impl.similarity.Pearso...
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeigh...
import org.apache.mahout.cf.taste.recommender.Recommende...
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilar...
public class RecommenderIntro {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
DataModel model = new FileDataModel(new File("data/dat...
UserSimilarity similarity = new PearsonCorrelationSimi...
UserNeighborhood neighborhood = new NearestNUserNeighb...
Recommender recommender = new GenericUserBasedRecommen...
model, neighborhood, similarity);
List<RecommendedItem> recommendations = recommender.re...
for (RecommendedItem recommendation : recommendations){
System.out.println(recommendation);
}
}
}
サンプルで使用するデータは「data/data1/intro.csv」として...
■data/data1/intro.csv
1,101,5.0
1,102,3.0
1,103,2.5
2,101,2.0
2,102,2.5
2,103,5.0
2,104,2.0
3,101,2.5
3,104,4,5
3,105,4.5
3,107,5.0
4,101,5.0
4,103,3.0
4,104,4.5
4,106,4.0
5,101,4.0
5,102,3.0
5,103,2.0
5,104,4.0
5,105,3.5
5,106,4.0
して、サンプルの実行結果は以下のとおり。
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mah...
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mah...
SLF4J: See http://www.slf4j.org/codes.html#multiple_bind...
13/04/12 22:49:17 INFO file.FileDataModel: Creating File...
13/04/12 22:49:17 INFO file.FileDataModel: Reading file ...
13/04/12 22:49:17 INFO file.FileDataModel: Read lines: 21
13/04/12 22:49:17 INFO model.GenericDataModel: Processed...
RecommendedItem[item:104, value:4.257081]
ほっほー、とりあえず、結果が出力されましたw
結果としては、「ユーザ1に1つアイテムをレコメンドせい」と...
じゃあ、レコメンドさせるアイテムを2にすると以下のようにな...
ソース上のここ
List<RecommendedItem> recommendations = recommender.reco...
を
List<RecommendedItem> recommendations = recommender.reco...
に修正して実行!っと。するとこんな感じです。
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mah...
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mah...
SLF4J: See http://www.slf4j.org/codes.html#multiple_bind...
13/04/12 23:21:42 INFO file.FileDataModel: Creating File...
13/04/12 23:21:43 INFO file.FileDataModel: Reading file ...
13/04/12 23:21:43 INFO file.FileDataModel: Read lines: 21
13/04/12 23:21:43 INFO model.GenericDataModel: Processed...
RecommendedItem[item:104, value:4.257081]
RecommendedItem[item:106, value:4.0]
なるほど、2つのアイテムがレコメンドされた!そりゃあそうかw
***レコメンダの評価 [#ce5bd6a3]
Mahout本では、いきなり次に、レコメンダの評価の話に移りま...
「評価ってなに?」って感じだけど、3回くらい読んで何となく...
まあ、評価って「存在するデータの一部を使用してレコメンダ...
上のサンプルを、評価を実行するように改変したコードは以下...
■RecommenderIntroAndEvaluation.java
package test1;
import java.io.File;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.eval.RecommenderBuilder;
import org.apache.mahout.cf.taste.eval.RecommenderEvalua...
import org.apache.mahout.cf.taste.impl.eval.AverageAbsol...
import org.apache.mahout.cf.taste.impl.model.file.FileDa...
import org.apache.mahout.cf.taste.impl.neighborhood.Near...
import org.apache.mahout.cf.taste.impl.recommender.Gener...
import org.apache.mahout.cf.taste.impl.similarity.Pearso...
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeigh...
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilar...
import org.apache.mahout.common.RandomUtils;
public class RecommenderIntroAndEvaluation {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
RandomUtils.useTestSeed();
DataModel model = new FileDataModel(new File("data/dat...
RecommenderEvaluator evaluator =
new AverageAbsoluteDifferenceRecommenderEvaluator();
RecommenderBuilder builder = new RecommenderBuilder(){
@Override
public Recommender buildRecommender(DataModel model)
throws TasteException {
UserSimilarity similarity =
new PearsonCorrelationSimilarity(model);
UserNeighborhood neighborhood =
new NearestNUserNeighborhood(2, similarity, model);
return new GenericUserBasedRecommender(
model, neighborhood, similarity);
}
};
// 70%のデータを使用してRecommenderを作成し、30%のデー...
double score = evaluator.evaluate(builder,null,model,0...
System.out.println(score);
}
}
実行結果は以下のとおり。
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mah...
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mah...
SLF4J: See http://www.slf4j.org/codes.html#multiple_bind...
13/04/12 23:38:18 INFO file.FileDataModel: Creating File...
13/04/12 23:38:18 INFO file.FileDataModel: Reading file ...
13/04/12 23:38:18 INFO file.FileDataModel: Read lines: 21
13/04/12 23:38:18 INFO model.GenericDataModel: Processed...
13/04/12 23:38:18 INFO eval.AbstractDifferenceRecommende...
13/04/12 23:38:18 INFO model.GenericDataModel: Processed...
13/04/12 23:38:18 INFO eval.AbstractDifferenceRecommende...
13/04/12 23:38:18 INFO eval.AbstractDifferenceRecommende...
13/04/12 23:38:18 INFO eval.StatsCallable: Average time ...
13/04/12 23:38:18 INFO eval.StatsCallable: Approximate m...
13/04/12 23:38:18 INFO eval.StatsCallable: Unable to rec...
13/04/12 23:38:18 INFO eval.AbstractDifferenceRecommende...
1.0
はっきり言って、何の解説も無しにこの結果だけ見てもさっぱ...
Mahout本によると、まあ、今回使用したevaluatorは「AverageA...
ということは、今回の評価では、レコメンダが計算し推奨値と...
なるほどー。
また、Mahout本では「単純な平均ではなく、二乗平均平方根で...
「RMSRecommenderEvaluator」っていうEvaluatorを使用するら...
して、以下のコードをmainメソッドの最後に追加。
RecommenderEvaluator evaluator2 = new RMSRecommenderEval...
double score2 = evaluator2.evaluate(builder,null,model,0...
System.out.println(score2);
結果はこんな感じです。
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mah...
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mah...
SLF4J: See http://www.slf4j.org/codes.html#multiple_bind...
13/04/13 00:05:12 INFO file.FileDataModel: Creating File...
13/04/13 00:05:12 INFO file.FileDataModel: Reading file ...
13/04/13 00:05:12 INFO file.FileDataModel: Read lines: 21
13/04/13 00:05:12 INFO model.GenericDataModel: Processed...
13/04/13 00:05:12 INFO eval.AbstractDifferenceRecommende...
13/04/13 00:05:12 INFO model.GenericDataModel: Processed...
13/04/13 00:05:12 INFO eval.AbstractDifferenceRecommende...
13/04/13 00:05:12 INFO eval.AbstractDifferenceRecommende...
13/04/13 00:05:12 INFO eval.StatsCallable: Average time ...
13/04/13 00:05:12 INFO eval.StatsCallable: Approximate m...
13/04/13 00:05:12 INFO eval.StatsCallable: Unable to rec...
13/04/13 00:05:12 INFO eval.AbstractDifferenceRecommende...
13/04/13 00:05:12 INFO eval.AbstractDifferenceRecommende...
1.0
13/04/13 00:05:12 INFO model.GenericDataModel: Processed...
13/04/13 00:05:12 INFO eval.AbstractDifferenceRecommende...
13/04/13 00:05:12 INFO eval.AbstractDifferenceRecommende...
13/04/13 00:05:12 INFO eval.StatsCallable: Average time ...
13/04/13 00:05:12 INFO eval.StatsCallable: Approximate m...
13/04/13 00:05:12 INFO eval.StatsCallable: Unable to rec...
13/04/13 00:05:12 INFO eval.AbstractDifferenceRecommende...
1.0
うーむ、結局、今回のケースではどっちでやっても「1.0」なん...
終了行:
[[Mahout:環境構築]]
*Mahout:サンプル1:はじめてのレコメンド [#xd802de1]
Mahoutを使った初めてのレコメンドです。
まあ、Mahout本に記載されているサンプルを実行してるだけで...
※Mahout本にはimportするクラスとか書いてないけど、きっとサ...
***サンプルコード [#h23b3875]
うだうだ長いですが、端的には
-DataModelにデータを食わせて
-Simirarityを計算させて
-Neighborhoodを計算させて
-そいつらを元にRecommenderを生成して
-RecommenderにレコメンドするユーザID(1)と提示(レコメン...
■RecommenderIntro.java
package test1;
import java.io.File;
import java.util.List;
import org.apache.mahout.cf.taste.impl.model.file.FileDa...
import org.apache.mahout.cf.taste.impl.neighborhood.Near...
import org.apache.mahout.cf.taste.impl.recommender.Gener...
import org.apache.mahout.cf.taste.impl.similarity.Pearso...
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeigh...
import org.apache.mahout.cf.taste.recommender.Recommende...
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilar...
public class RecommenderIntro {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
DataModel model = new FileDataModel(new File("data/dat...
UserSimilarity similarity = new PearsonCorrelationSimi...
UserNeighborhood neighborhood = new NearestNUserNeighb...
Recommender recommender = new GenericUserBasedRecommen...
model, neighborhood, similarity);
List<RecommendedItem> recommendations = recommender.re...
for (RecommendedItem recommendation : recommendations){
System.out.println(recommendation);
}
}
}
サンプルで使用するデータは「data/data1/intro.csv」として...
■data/data1/intro.csv
1,101,5.0
1,102,3.0
1,103,2.5
2,101,2.0
2,102,2.5
2,103,5.0
2,104,2.0
3,101,2.5
3,104,4,5
3,105,4.5
3,107,5.0
4,101,5.0
4,103,3.0
4,104,4.5
4,106,4.0
5,101,4.0
5,102,3.0
5,103,2.0
5,104,4.0
5,105,3.5
5,106,4.0
して、サンプルの実行結果は以下のとおり。
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mah...
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mah...
SLF4J: See http://www.slf4j.org/codes.html#multiple_bind...
13/04/12 22:49:17 INFO file.FileDataModel: Creating File...
13/04/12 22:49:17 INFO file.FileDataModel: Reading file ...
13/04/12 22:49:17 INFO file.FileDataModel: Read lines: 21
13/04/12 22:49:17 INFO model.GenericDataModel: Processed...
RecommendedItem[item:104, value:4.257081]
ほっほー、とりあえず、結果が出力されましたw
結果としては、「ユーザ1に1つアイテムをレコメンドせい」と...
じゃあ、レコメンドさせるアイテムを2にすると以下のようにな...
ソース上のここ
List<RecommendedItem> recommendations = recommender.reco...
を
List<RecommendedItem> recommendations = recommender.reco...
に修正して実行!っと。するとこんな感じです。
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mah...
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mah...
SLF4J: See http://www.slf4j.org/codes.html#multiple_bind...
13/04/12 23:21:42 INFO file.FileDataModel: Creating File...
13/04/12 23:21:43 INFO file.FileDataModel: Reading file ...
13/04/12 23:21:43 INFO file.FileDataModel: Read lines: 21
13/04/12 23:21:43 INFO model.GenericDataModel: Processed...
RecommendedItem[item:104, value:4.257081]
RecommendedItem[item:106, value:4.0]
なるほど、2つのアイテムがレコメンドされた!そりゃあそうかw
***レコメンダの評価 [#ce5bd6a3]
Mahout本では、いきなり次に、レコメンダの評価の話に移りま...
「評価ってなに?」って感じだけど、3回くらい読んで何となく...
まあ、評価って「存在するデータの一部を使用してレコメンダ...
上のサンプルを、評価を実行するように改変したコードは以下...
■RecommenderIntroAndEvaluation.java
package test1;
import java.io.File;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.eval.RecommenderBuilder;
import org.apache.mahout.cf.taste.eval.RecommenderEvalua...
import org.apache.mahout.cf.taste.impl.eval.AverageAbsol...
import org.apache.mahout.cf.taste.impl.model.file.FileDa...
import org.apache.mahout.cf.taste.impl.neighborhood.Near...
import org.apache.mahout.cf.taste.impl.recommender.Gener...
import org.apache.mahout.cf.taste.impl.similarity.Pearso...
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeigh...
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilar...
import org.apache.mahout.common.RandomUtils;
public class RecommenderIntroAndEvaluation {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
RandomUtils.useTestSeed();
DataModel model = new FileDataModel(new File("data/dat...
RecommenderEvaluator evaluator =
new AverageAbsoluteDifferenceRecommenderEvaluator();
RecommenderBuilder builder = new RecommenderBuilder(){
@Override
public Recommender buildRecommender(DataModel model)
throws TasteException {
UserSimilarity similarity =
new PearsonCorrelationSimilarity(model);
UserNeighborhood neighborhood =
new NearestNUserNeighborhood(2, similarity, model);
return new GenericUserBasedRecommender(
model, neighborhood, similarity);
}
};
// 70%のデータを使用してRecommenderを作成し、30%のデー...
double score = evaluator.evaluate(builder,null,model,0...
System.out.println(score);
}
}
実行結果は以下のとおり。
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mah...
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mah...
SLF4J: See http://www.slf4j.org/codes.html#multiple_bind...
13/04/12 23:38:18 INFO file.FileDataModel: Creating File...
13/04/12 23:38:18 INFO file.FileDataModel: Reading file ...
13/04/12 23:38:18 INFO file.FileDataModel: Read lines: 21
13/04/12 23:38:18 INFO model.GenericDataModel: Processed...
13/04/12 23:38:18 INFO eval.AbstractDifferenceRecommende...
13/04/12 23:38:18 INFO model.GenericDataModel: Processed...
13/04/12 23:38:18 INFO eval.AbstractDifferenceRecommende...
13/04/12 23:38:18 INFO eval.AbstractDifferenceRecommende...
13/04/12 23:38:18 INFO eval.StatsCallable: Average time ...
13/04/12 23:38:18 INFO eval.StatsCallable: Approximate m...
13/04/12 23:38:18 INFO eval.StatsCallable: Unable to rec...
13/04/12 23:38:18 INFO eval.AbstractDifferenceRecommende...
1.0
はっきり言って、何の解説も無しにこの結果だけ見てもさっぱ...
Mahout本によると、まあ、今回使用したevaluatorは「AverageA...
ということは、今回の評価では、レコメンダが計算し推奨値と...
なるほどー。
また、Mahout本では「単純な平均ではなく、二乗平均平方根で...
「RMSRecommenderEvaluator」っていうEvaluatorを使用するら...
して、以下のコードをmainメソッドの最後に追加。
RecommenderEvaluator evaluator2 = new RMSRecommenderEval...
double score2 = evaluator2.evaluate(builder,null,model,0...
System.out.println(score2);
結果はこんな感じです。
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mah...
SLF4J: Found binding in [jar:file:/opt/extend/mahout/Mah...
SLF4J: See http://www.slf4j.org/codes.html#multiple_bind...
13/04/13 00:05:12 INFO file.FileDataModel: Creating File...
13/04/13 00:05:12 INFO file.FileDataModel: Reading file ...
13/04/13 00:05:12 INFO file.FileDataModel: Read lines: 21
13/04/13 00:05:12 INFO model.GenericDataModel: Processed...
13/04/13 00:05:12 INFO eval.AbstractDifferenceRecommende...
13/04/13 00:05:12 INFO model.GenericDataModel: Processed...
13/04/13 00:05:12 INFO eval.AbstractDifferenceRecommende...
13/04/13 00:05:12 INFO eval.AbstractDifferenceRecommende...
13/04/13 00:05:12 INFO eval.StatsCallable: Average time ...
13/04/13 00:05:12 INFO eval.StatsCallable: Approximate m...
13/04/13 00:05:12 INFO eval.StatsCallable: Unable to rec...
13/04/13 00:05:12 INFO eval.AbstractDifferenceRecommende...
13/04/13 00:05:12 INFO eval.AbstractDifferenceRecommende...
1.0
13/04/13 00:05:12 INFO model.GenericDataModel: Processed...
13/04/13 00:05:12 INFO eval.AbstractDifferenceRecommende...
13/04/13 00:05:12 INFO eval.AbstractDifferenceRecommende...
13/04/13 00:05:12 INFO eval.StatsCallable: Average time ...
13/04/13 00:05:12 INFO eval.StatsCallable: Approximate m...
13/04/13 00:05:12 INFO eval.StatsCallable: Unable to rec...
13/04/13 00:05:12 INFO eval.AbstractDifferenceRecommende...
1.0
うーむ、結局、今回のケースではどっちでやっても「1.0」なん...
ページ名: