kikulikov
kikulikov

Reputation: 2583

Mahout RecommenderEvaluator with IDRescorer

I use RecommenderEvaluator to estimate Mahout's recommendation efficiency. Currently, I try to improve recommendation results with IDRescorer which will do some post-processing boost of the searched items.

RecommenderEvaluator evaluator = 
    new AverageAbsoluteDifferenceRecommenderEvaluator();
double evaluation = evaluator.evaluate(builder, myModel, 0.9, 0.9);

Is there any way in Mahout to tell RecommenderEvaluator to use my custom IDRescorer?

Upvotes: 0

Views: 340

Answers (1)

Dragan Milcevski
Dragan Milcevski

Reputation: 776

You can create your own implementation of the Recommender class

class CustomRecommender implements Recommender{
....
public List<RecommendedItem> recommend(long userID, int howMany) throws TasteException {
 IDRescorer rescorer = new CustomResorer();
 return delegate.recommend(userID, howMany, rescorer);
 }
 public List<RecommendedItem> recommend(long userID, int howMany, IDRescorer rescorer) throws TasteException {
    return delegate.recommend(userID, howMany, rescorer);
 }
 public float estimatePreference(long userID, long itemID) throws TasteException {
   IDRescorer rescorer = new CustomResorer();
   return (float) rescorer.rescore( itemID, delegate.estimatePreference(userID, itemID));
 }
...
}

Here even if the recommendation is called without rescorer, you will incorporate it in the recommend and estimatePreference methods.

And then when you build the RecommenderBuilder you will create an instance of your recommender:

RecommenderBuilder recommenderBuilder = new RecommenderBuilder() {
   @Override
   public Recommender buildRecommender(DataModel model) throws TasteException {
    Similarity similarity = new ...             
    return new CustomRecommender(model, similarity);                    
   }

};

Upvotes: 1

Related Questions