Repository: incubator-predictionio-template-java-ecom-recommender Updated Branches: refs/heads/master ae23d8cae -> 36995dfce
http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/src/main/java/org/template/recommendation/DataSource.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/template/recommendation/DataSource.java b/src/main/java/org/template/recommendation/DataSource.java deleted file mode 100644 index b9648c3..0000000 --- a/src/main/java/org/template/recommendation/DataSource.java +++ /dev/null @@ -1,150 +0,0 @@ -package org.template.recommendation; - -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import io.prediction.controller.EmptyParams; -import io.prediction.controller.java.PJavaDataSource; -import io.prediction.data.storage.Event; -import io.prediction.data.storage.PropertyMap; -import io.prediction.data.store.java.OptionHelper; -import io.prediction.data.store.java.PJavaEventStore; -import org.apache.spark.SparkContext; -import org.apache.spark.api.java.JavaPairRDD; -import org.apache.spark.api.java.JavaRDD; -import org.apache.spark.api.java.function.Function; -import org.apache.spark.api.java.function.PairFunction; -import org.apache.spark.rdd.RDD; -import org.joda.time.DateTime; -import scala.Option; -import scala.Tuple2; -import scala.Tuple3; -import scala.collection.JavaConversions; -import scala.collection.JavaConversions$; -import scala.collection.Seq; - -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -public class DataSource extends PJavaDataSource<TrainingData, EmptyParams, Query, Set<String>> { - - private final DataSourceParams dsp; - - public DataSource(DataSourceParams dsp) { - this.dsp = dsp; - } - - @Override - public TrainingData readTraining(SparkContext sc) { - JavaPairRDD<String,User> usersRDD = PJavaEventStore.aggregateProperties( - dsp.getAppName(), - "user", - OptionHelper.<String>none(), - OptionHelper.<DateTime>none(), - OptionHelper.<DateTime>none(), - OptionHelper.<List<String>>none(), - sc) - .mapToPair(new PairFunction<Tuple2<String, PropertyMap>, String, User>() { - @Override - public Tuple2<String, User> call(Tuple2<String, PropertyMap> entityIdProperty) throws Exception { - Set<String> keys = JavaConversions$.MODULE$.setAsJavaSet(entityIdProperty._2().keySet()); - Map<String, String> properties = new HashMap<>(); - for (String key : keys) { - properties.put(key, entityIdProperty._2().get(key, String.class)); - } - - User user = new User(entityIdProperty._1(), ImmutableMap.copyOf(properties)); - - return new Tuple2<>(user.getEntityId(), user); - } - }); - - JavaPairRDD<String, Item> itemsRDD = PJavaEventStore.aggregateProperties( - dsp.getAppName(), - "item", - OptionHelper.<String>none(), - OptionHelper.<DateTime>none(), - OptionHelper.<DateTime>none(), - OptionHelper.<List<String>>none(), - sc) - .mapToPair(new PairFunction<Tuple2<String, PropertyMap>, String, Item>() { - @Override - public Tuple2<String, Item> call(Tuple2<String, PropertyMap> entityIdProperty) throws Exception { - List<String> categories = entityIdProperty._2().getStringList("categories"); - Item item = new Item(entityIdProperty._1(), ImmutableSet.copyOf(categories)); - - return new Tuple2<>(item.getEntityId(), item); - } - }); - - JavaRDD<UserItemEvent> viewEventsRDD = PJavaEventStore.find( - dsp.getAppName(), - OptionHelper.<String>none(), - OptionHelper.<DateTime>none(), - OptionHelper.<DateTime>none(), - OptionHelper.some("user"), - OptionHelper.<String>none(), - OptionHelper.some(Collections.singletonList("view")), - OptionHelper.<Option<String>>none(), - OptionHelper.<Option<String>>none(), - sc) - .map(new Function<Event, UserItemEvent>() { - @Override - public UserItemEvent call(Event event) throws Exception { - return new UserItemEvent(event.entityId(), event.targetEntityId().get(), event.eventTime().getMillis(), UserItemEventType.VIEW); - } - }); - - JavaRDD<UserItemEvent> buyEventsRDD = PJavaEventStore.find( - dsp.getAppName(), - OptionHelper.<String>none(), - OptionHelper.<DateTime>none(), - OptionHelper.<DateTime>none(), - OptionHelper.some("user"), - OptionHelper.<String>none(), - OptionHelper.some(Collections.singletonList("buy")), - OptionHelper.<Option<String>>none(), - OptionHelper.<Option<String>>none(), - sc) - .map(new Function<Event, UserItemEvent>() { - @Override - public UserItemEvent call(Event event) throws Exception { - return new UserItemEvent(event.entityId(), event.targetEntityId().get(), event.eventTime().getMillis(), UserItemEventType.BUY); - } - }); - - return new TrainingData(usersRDD, itemsRDD, viewEventsRDD, buyEventsRDD); - } - - @Override - public Seq<Tuple3<TrainingData, EmptyParams, RDD<Tuple2<Query, Set<String>>>>> readEval(SparkContext sc) { - TrainingData all = readTraining(sc); - double[] split = {0.5, 0.5}; - JavaRDD<UserItemEvent>[] trainingAndTestingViews = all.getViewEvents().randomSplit(split, 1); - JavaRDD<UserItemEvent>[] trainingAndTestingBuys = all.getBuyEvents().randomSplit(split, 1); - - RDD<Tuple2<Query, Set<String>>> queryActual = JavaPairRDD.toRDD(trainingAndTestingViews[1].union(trainingAndTestingBuys[1]).groupBy(new Function<UserItemEvent, String>() { - @Override - public String call(UserItemEvent event) throws Exception { - return event.getUser(); - } - }).mapToPair(new PairFunction<Tuple2<String, Iterable<UserItemEvent>>, Query, Set<String>>() { - @Override - public Tuple2<Query, Set<String>> call(Tuple2<String, Iterable<UserItemEvent>> userEvents) throws Exception { - Query query = new Query(userEvents._1(), 10, Collections.<String>emptySet(), Collections.<String>emptySet(), Collections.<String>emptySet()); - Set<String> actualSet = new HashSet<>(); - for (UserItemEvent event : userEvents._2()) { - actualSet.add(event.getItem()); - } - return new Tuple2<>(query, actualSet); - } - })); - - Tuple3<TrainingData, EmptyParams, RDD<Tuple2<Query, Set<String>>>> setData = new Tuple3<>(new TrainingData(all.getUsers(), all.getItems(), trainingAndTestingViews[0], trainingAndTestingBuys[0]), new EmptyParams(), queryActual); - - return JavaConversions.asScalaIterable(Collections.singletonList(setData)).toSeq(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/src/main/java/org/template/recommendation/DataSourceParams.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/template/recommendation/DataSourceParams.java b/src/main/java/org/template/recommendation/DataSourceParams.java deleted file mode 100644 index 25ac426..0000000 --- a/src/main/java/org/template/recommendation/DataSourceParams.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.template.recommendation; - -import io.prediction.controller.Params; - -public class DataSourceParams implements Params{ - private final String appName; - - public DataSourceParams(String appName) { - this.appName = appName; - } - - public String getAppName() { - return appName; - } -} http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/src/main/java/org/template/recommendation/Item.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/template/recommendation/Item.java b/src/main/java/org/template/recommendation/Item.java deleted file mode 100644 index 1365045..0000000 --- a/src/main/java/org/template/recommendation/Item.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.template.recommendation; - -import java.io.Serializable; -import java.util.Set; - -public class Item implements Serializable{ - private final Set<String> categories; - private final String entityId; - - public Item(String entityId, Set<String> categories) { - this.categories = categories; - this.entityId = entityId; - } - - public String getEntityId() { - return entityId; - } - - public Set<String> getCategories() { - return categories; - } - - @Override - public String toString() { - return "Item{" + - "categories=" + categories + - ", entityId='" + entityId + '\'' + - '}'; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/src/main/java/org/template/recommendation/ItemScore.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/template/recommendation/ItemScore.java b/src/main/java/org/template/recommendation/ItemScore.java deleted file mode 100644 index a3fca92..0000000 --- a/src/main/java/org/template/recommendation/ItemScore.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.template.recommendation; - -import java.io.Serializable; - -public class ItemScore implements Serializable, Comparable<ItemScore> { - private final String itemEntityId; - private final double score; - - public ItemScore(String itemEntityId, double score) { - this.itemEntityId = itemEntityId; - this.score = score; - } - - public String getItemEntityId() { - return itemEntityId; - } - - public double getScore() { - return score; - } - - @Override - public String toString() { - return "ItemScore{" + - "itemEntityId='" + itemEntityId + '\'' + - ", score=" + score + - '}'; - } - - @Override - public int compareTo(ItemScore o) { - return Double.valueOf(score).compareTo(o.score); - } -} http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/src/main/java/org/template/recommendation/Model.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/template/recommendation/Model.java b/src/main/java/org/template/recommendation/Model.java deleted file mode 100644 index 129cb2a..0000000 --- a/src/main/java/org/template/recommendation/Model.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.template.recommendation; - -import io.prediction.controller.Params; -import io.prediction.controller.PersistentModel; -import org.apache.spark.SparkContext; -import org.apache.spark.api.java.JavaPairRDD; -import org.apache.spark.api.java.JavaRDD; -import org.apache.spark.api.java.JavaSparkContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import scala.Tuple2; - -import java.io.Serializable; -import java.util.Collections; -import java.util.Map; - -public class Model implements Serializable, PersistentModel<AlgorithmParams> { - private static final Logger logger = LoggerFactory.getLogger(Model.class); - private final JavaPairRDD<Integer, double[]> userFeatures; - private final JavaPairRDD<Integer, Tuple2<String, double[]>> indexItemFeatures; - private final JavaPairRDD<String, Integer> userIndex; - private final JavaPairRDD<String, Integer> itemIndex; - private final JavaRDD<ItemScore> itemPopularityScore; - private final Map<String, Item> items; - - public Model(JavaPairRDD<Integer, double[]> userFeatures, JavaPairRDD<Integer, Tuple2<String, double[]>> indexItemFeatures, JavaPairRDD<String, Integer> userIndex, JavaPairRDD<String, Integer> itemIndex, JavaRDD<ItemScore> itemPopularityScore, Map<String, Item> items) { - this.userFeatures = userFeatures; - this.indexItemFeatures = indexItemFeatures; - this.userIndex = userIndex; - this.itemIndex = itemIndex; - this.itemPopularityScore = itemPopularityScore; - this.items = items; - } - - public JavaPairRDD<Integer, double[]> getUserFeatures() { - return userFeatures; - } - - public JavaPairRDD<Integer, Tuple2<String, double[]>> getIndexItemFeatures() { - return indexItemFeatures; - } - - public JavaPairRDD<String, Integer> getUserIndex() { - return userIndex; - } - - public JavaPairRDD<String, Integer> getItemIndex() { - return itemIndex; - } - - public JavaRDD<ItemScore> getItemPopularityScore() { - return itemPopularityScore; - } - - public Map<String, Item> getItems() { - return items; - } - - @Override - public boolean save(String id, AlgorithmParams params, SparkContext sc) { - userFeatures.saveAsObjectFile("/tmp/" + id + "/userFeatures"); - indexItemFeatures.saveAsObjectFile("/tmp/" + id + "/indexItemFeatures"); - userIndex.saveAsObjectFile("/tmp/" + id + "/userIndex"); - itemIndex.saveAsObjectFile("/tmp/" + id + "/itemIndex"); - itemPopularityScore.saveAsObjectFile("/tmp/" + id + "/itemPopularityScore"); - new JavaSparkContext(sc).parallelize(Collections.singletonList(items)).saveAsObjectFile("/tmp/" + id + "/items"); - - logger.info("Saved model to /tmp/" + id); - return true; - } - - public static Model load(String id, Params params, SparkContext sc) { - JavaSparkContext jsc = JavaSparkContext.fromSparkContext(sc); - JavaPairRDD<Integer, double[]> userFeatures = JavaPairRDD.<Integer, double[]>fromJavaRDD(jsc.<Tuple2<Integer, double[]>>objectFile("/tmp/" + id + "/userFeatures")); - JavaPairRDD<Integer, Tuple2<String, double[]>> indexItemFeatures = JavaPairRDD.<Integer, Tuple2<String, double[]>>fromJavaRDD(jsc.<Tuple2<Integer, Tuple2<String, double[]>>>objectFile("/tmp/" + id + "/indexItemFeatures")); - JavaPairRDD<String, Integer> userIndex = JavaPairRDD.<String, Integer>fromJavaRDD(jsc.<Tuple2<String, Integer>>objectFile("/tmp/" + id + "/userIndex")); - JavaPairRDD<String, Integer> itemIndex = JavaPairRDD.<String, Integer>fromJavaRDD(jsc.<Tuple2<String, Integer>>objectFile("/tmp/" + id + "/itemIndex")); - JavaRDD<ItemScore> itemPopularityScore = jsc.objectFile("/tmp/" + id + "/itemPopularityScore"); - Map<String, Item> items = jsc.<Map<String, Item>>objectFile("/tmp/" + id + "/items").collect().get(0); - - logger.info("loaded model"); - return new Model(userFeatures, indexItemFeatures, userIndex, itemIndex, itemPopularityScore, items); - } -} http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/src/main/java/org/template/recommendation/PredictedResult.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/template/recommendation/PredictedResult.java b/src/main/java/org/template/recommendation/PredictedResult.java deleted file mode 100644 index b89c3a9..0000000 --- a/src/main/java/org/template/recommendation/PredictedResult.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.template.recommendation; - -import java.io.Serializable; -import java.util.List; - -public class PredictedResult implements Serializable{ - private final List<ItemScore> itemScores; - - public PredictedResult(List<ItemScore> itemScores) { - this.itemScores = itemScores; - } - - public List<ItemScore> getItemScores() { - return itemScores; - } - - @Override - public String toString() { - return "PredictedResult{" + - "itemScores=" + itemScores + - '}'; - } -} http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/src/main/java/org/template/recommendation/Preparator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/template/recommendation/Preparator.java b/src/main/java/org/template/recommendation/Preparator.java deleted file mode 100644 index 003855b..0000000 --- a/src/main/java/org/template/recommendation/Preparator.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.template.recommendation; - -import io.prediction.controller.java.PJavaPreparator; -import org.apache.spark.SparkContext; - -public class Preparator extends PJavaPreparator<TrainingData, PreparedData> { - - @Override - public PreparedData prepare(SparkContext sc, TrainingData trainingData) { - return new PreparedData(trainingData); - } -} http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/src/main/java/org/template/recommendation/PreparedData.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/template/recommendation/PreparedData.java b/src/main/java/org/template/recommendation/PreparedData.java deleted file mode 100644 index 6f732cc..0000000 --- a/src/main/java/org/template/recommendation/PreparedData.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.template.recommendation; - -import java.io.Serializable; - -public class PreparedData implements Serializable { - private final TrainingData trainingData; - - public PreparedData(TrainingData trainingData) { - this.trainingData = trainingData; - } - - public TrainingData getTrainingData() { - return trainingData; - } -} http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/src/main/java/org/template/recommendation/Query.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/template/recommendation/Query.java b/src/main/java/org/template/recommendation/Query.java deleted file mode 100644 index 316553d..0000000 --- a/src/main/java/org/template/recommendation/Query.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.template.recommendation; - -import java.io.Serializable; -import java.util.Collections; -import java.util.Set; - -public class Query implements Serializable{ - private final String userEntityId; - private final int number; - private final Set<String> categories; - private final Set<String> whitelist; - private final Set<String> blacklist; - - public Query(String userEntityId, int number, Set<String> categories, Set<String> whitelist, Set<String> blacklist) { - this.userEntityId = userEntityId; - this.number = number; - this.categories = categories; - this.whitelist = whitelist; - this.blacklist = blacklist; - } - - public String getUserEntityId() { - return userEntityId; - } - - public int getNumber() { - return number; - } - - public Set<String> getCategories() { - if (categories == null) return Collections.emptySet(); - return categories; - } - - public Set<String> getWhitelist() { - if (whitelist == null) return Collections.emptySet(); - return whitelist; - } - - public Set<String> getBlacklist() { - if (blacklist == null) return Collections.emptySet(); - return blacklist; - } - - @Override - public String toString() { - return "Query{" + - "userEntityId='" + userEntityId + '\'' + - ", number=" + number + - ", categories=" + categories + - ", whitelist=" + whitelist + - ", blacklist=" + blacklist + - '}'; - } -} http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/src/main/java/org/template/recommendation/RecommendationEngine.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/template/recommendation/RecommendationEngine.java b/src/main/java/org/template/recommendation/RecommendationEngine.java deleted file mode 100644 index d757737..0000000 --- a/src/main/java/org/template/recommendation/RecommendationEngine.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.template.recommendation; - -import io.prediction.controller.EmptyParams; -import io.prediction.controller.Engine; -import io.prediction.controller.EngineFactory; -import io.prediction.core.BaseAlgorithm; -import io.prediction.core.BaseEngine; - -import java.util.Collections; -import java.util.Set; - -public class RecommendationEngine extends EngineFactory { - - @Override - public BaseEngine<EmptyParams, Query, PredictedResult, Set<String>> apply() { - return new Engine<>( - DataSource.class, - Preparator.class, - Collections.<String, Class<? extends BaseAlgorithm<PreparedData, ?, Query, PredictedResult>>>singletonMap("algo", Algorithm.class), - Serving.class - ); - } -} http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/src/main/java/org/template/recommendation/Serving.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/template/recommendation/Serving.java b/src/main/java/org/template/recommendation/Serving.java deleted file mode 100644 index 6a122da..0000000 --- a/src/main/java/org/template/recommendation/Serving.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.template.recommendation; - -import io.prediction.controller.java.LJavaServing; -import scala.collection.Seq; - -public class Serving extends LJavaServing<Query, PredictedResult> { - - @Override - public PredictedResult serve(Query query, Seq<PredictedResult> predictions) { - return predictions.head(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/src/main/java/org/template/recommendation/TrainingData.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/template/recommendation/TrainingData.java b/src/main/java/org/template/recommendation/TrainingData.java deleted file mode 100644 index 7b800f1..0000000 --- a/src/main/java/org/template/recommendation/TrainingData.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.template.recommendation; - -import io.prediction.controller.SanityCheck; -import org.apache.spark.api.java.JavaPairRDD; -import org.apache.spark.api.java.JavaRDD; - -import java.io.Serializable; - -public class TrainingData implements Serializable, SanityCheck { - private final JavaPairRDD<String, User> users; - private final JavaPairRDD<String, Item> items; - private final JavaRDD<UserItemEvent> viewEvents; - private final JavaRDD<UserItemEvent> buyEvents; - - public TrainingData(JavaPairRDD<String, User> users, JavaPairRDD<String, Item> items, JavaRDD<UserItemEvent> viewEvents, JavaRDD<UserItemEvent> buyEvents) { - this.users = users; - this.items = items; - this.viewEvents = viewEvents; - this.buyEvents = buyEvents; - } - - public JavaPairRDD<String, User> getUsers() { - return users; - } - - public JavaPairRDD<String, Item> getItems() { - return items; - } - - public JavaRDD<UserItemEvent> getViewEvents() { - return viewEvents; - } - - public JavaRDD<UserItemEvent> getBuyEvents() { - return buyEvents; - } - - @Override - public void sanityCheck() { - if (users.isEmpty()) { - throw new AssertionError("User data is empty"); - } - if (items.isEmpty()) { - throw new AssertionError("Item data is empty"); - } - if (viewEvents.isEmpty()) { - throw new AssertionError("View Event data is empty"); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/src/main/java/org/template/recommendation/User.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/template/recommendation/User.java b/src/main/java/org/template/recommendation/User.java deleted file mode 100644 index f5f3cc1..0000000 --- a/src/main/java/org/template/recommendation/User.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.template.recommendation; - -import java.io.Serializable; -import java.util.Map; - -public class User implements Serializable { - private final String entityId; - private final Map<String, String> properties; - - public User(String entityId, Map<String, String> properties) { - this.entityId = entityId; - this.properties = properties; - } - - public String getEntityId() { - return entityId; - } - - public Map<String, String> getProperties() { - return properties; - } - - @Override - public String toString() { - return "User{" + - "entityId='" + entityId + '\'' + - ", properties=" + properties + - '}'; - } -} http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/src/main/java/org/template/recommendation/UserItemEvent.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/template/recommendation/UserItemEvent.java b/src/main/java/org/template/recommendation/UserItemEvent.java deleted file mode 100644 index 3da56ca..0000000 --- a/src/main/java/org/template/recommendation/UserItemEvent.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.template.recommendation; - -import java.io.Serializable; - -public class UserItemEvent implements Serializable { - private final String user; - private final String item; - private final long time; - private final UserItemEventType type; - - public UserItemEvent(String user, String item, long time, UserItemEventType type) { - this.user = user; - this.item = item; - this.time = time; - this.type = type; - } - - public String getUser() { - return user; - } - - public String getItem() { - return item; - } - - public long getTime() { - return time; - } - - public UserItemEventType getType() { - return type; - } - - @Override - public String toString() { - return "UserItemEvent{" + - "user='" + user + '\'' + - ", item='" + item + '\'' + - ", time=" + time + - ", type=" + type + - '}'; - } -} http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/src/main/java/org/template/recommendation/UserItemEventType.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/template/recommendation/UserItemEventType.java b/src/main/java/org/template/recommendation/UserItemEventType.java deleted file mode 100644 index 6728cef..0000000 --- a/src/main/java/org/template/recommendation/UserItemEventType.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.template.recommendation; - -public enum UserItemEventType { - VIEW, BUY -} http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/src/main/java/org/template/recommendation/evaluation/EvaluationParameter.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/template/recommendation/evaluation/EvaluationParameter.java b/src/main/java/org/template/recommendation/evaluation/EvaluationParameter.java deleted file mode 100644 index da15a77..0000000 --- a/src/main/java/org/template/recommendation/evaluation/EvaluationParameter.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.template.recommendation.evaluation; - -import io.prediction.controller.EmptyParams; -import io.prediction.controller.EngineParams; -import io.prediction.controller.java.JavaEngineParamsGenerator; -import org.template.recommendation.AlgorithmParams; -import org.template.recommendation.DataSourceParams; - -import java.util.Arrays; -import java.util.Collections; - -public class EvaluationParameter extends JavaEngineParamsGenerator { - public EvaluationParameter() { - this.setEngineParamsList( - Collections.singletonList( - new EngineParams( - "", - new DataSourceParams("javadase"), - "", - new EmptyParams(), - Collections.singletonMap("algo", new AlgorithmParams(1, 10, 10, 0.01, "javadase", Collections.singletonList("view"), true, Arrays.asList("buy", "view"))), - "", - new EmptyParams() - ) - ) - ); - } -} http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/src/main/java/org/template/recommendation/evaluation/EvaluationSpec.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/template/recommendation/evaluation/EvaluationSpec.java b/src/main/java/org/template/recommendation/evaluation/EvaluationSpec.java deleted file mode 100644 index bfecca1..0000000 --- a/src/main/java/org/template/recommendation/evaluation/EvaluationSpec.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.template.recommendation.evaluation; - -import io.prediction.controller.Engine; -import io.prediction.controller.java.JavaEvaluation; -import io.prediction.core.BaseAlgorithm; -import org.template.recommendation.Algorithm; -import org.template.recommendation.DataSource; -import org.template.recommendation.PredictedResult; -import org.template.recommendation.Preparator; -import org.template.recommendation.PreparedData; -import org.template.recommendation.Query; -import org.template.recommendation.Serving; - -import java.util.Collections; - -public class EvaluationSpec extends JavaEvaluation { - public EvaluationSpec() { - this.setEngineMetric( - new Engine<>( - DataSource.class, - Preparator.class, - Collections.<String, Class<? extends BaseAlgorithm<PreparedData, ?, Query, PredictedResult>>>singletonMap("algo", Algorithm.class), - Serving.class - ), - new PrecisionMetric() - ); - } -} http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/src/main/java/org/template/recommendation/evaluation/PrecisionMetric.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/template/recommendation/evaluation/PrecisionMetric.java b/src/main/java/org/template/recommendation/evaluation/PrecisionMetric.java deleted file mode 100644 index 277925d..0000000 --- a/src/main/java/org/template/recommendation/evaluation/PrecisionMetric.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.template.recommendation.evaluation; - -import io.prediction.controller.EmptyParams; -import io.prediction.controller.Metric; -import io.prediction.controller.java.SerializableComparator; -import org.apache.spark.SparkContext; -import org.apache.spark.api.java.function.Function; -import org.apache.spark.rdd.RDD; -import org.template.recommendation.ItemScore; -import org.template.recommendation.PredictedResult; -import org.template.recommendation.Query; -import scala.Tuple2; -import scala.Tuple3; -import scala.collection.JavaConversions; -import scala.collection.Seq; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -public class PrecisionMetric extends Metric<EmptyParams, Query, PredictedResult, Set<String>, Double> { - - private static final class MetricComparator implements SerializableComparator<Double> { - @Override - public int compare(Double o1, Double o2) { - return o1.compareTo(o2); - } - } - - public PrecisionMetric() { - super(new MetricComparator()); - } - - @Override - public Double calculate(SparkContext sc, Seq<Tuple2<EmptyParams, RDD<Tuple3<Query, PredictedResult, Set<String>>>>> qpas) { - List<Tuple2<EmptyParams, RDD<Tuple3<Query, PredictedResult, Set<String>>>>> sets = JavaConversions.asJavaList(qpas); - List<Double> allSetResults = new ArrayList<>(); - - for (Tuple2<EmptyParams, RDD<Tuple3<Query, PredictedResult, Set<String>>>> set : sets) { - List<Double> setResults = set._2().toJavaRDD().map(new Function<Tuple3<Query, PredictedResult, Set<String>>, Double>() { - @Override - public Double call(Tuple3<Query, PredictedResult, Set<String>> qpa) throws Exception { - Set<String> predicted = new HashSet<>(); - for (ItemScore itemScore : qpa._2().getItemScores()) { - predicted.add(itemScore.getItemEntityId()); - } - Set<String> intersection = new HashSet<>(predicted); - intersection.retainAll(qpa._3()); - - return 1.0 * intersection.size() / qpa._2().getItemScores().size(); - } - }).collect(); - - allSetResults.addAll(setResults); - } - double sum = 0.0; - for (Double value : allSetResults) sum += value; - - return sum / allSetResults.size(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-predictionio-template-java-ecom-recommender/blob/36995dfc/template.json ---------------------------------------------------------------------- diff --git a/template.json b/template.json index 7f97fce..d076ec5 100644 --- a/template.json +++ b/template.json @@ -1 +1 @@ -{"pio": {"version": { "min": "0.9.3" }}} +{"pio": {"version": { "min": "0.10.0-incubating" }}}
