Reputation: 2583
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
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