How should one deal with implicit data in recommendation

A recommendation system keeps a log of what recommendations have been made to a particular user and whether that user accepts the recommendation. It's like

user_id item_id result
1       4       1
1       7       -1
5       19      1
5       80      1


where 1 means the user accepted the recommendation while -1 means the user did not respond to the recommendation.

Question: If I am going to make recommendations to a bunch of users based on the kind of log described above, and I want to maximize MAP@3 scores, how should I deal with the implicit data (1 or -1)?

My idea is to treat 1 and -1 as ratings, and predict the rating using factorization machines-type algorithms. But this does not seem right, given the asymmetry of the implicit data (-1 does not mean the user does not like the recommendation).

Edit 1 Let us think about it in the context of a matrix factorization approach. If we treat -1 and 1 as ratings, there will be some problem. For example, user 1 likes movie A which scores high in one factor (e.g. having glorious background music) in the latent factor space. The system recommends movie B which also scores high in "glorious background music", but for some reason user 1 is too busy to look into the recommendation, and we have a -1 rating movie B. If we just treat 1 or -1 equally, then the system might be discouraged to recommend movie with glorious BGM to user 1 while user 1 still loves movie with glorious BGM. I think this situation is to be avoided.

• There's no problem that -1 doesn't mean dislike. It's simply a way to differentiate that someone saw the item. In that sense it carries more info than a missing value. It may actually increase the accuracy of your recommendation. Depending on your distance metric in recommending you may consider changing it from a -1 to a slight metrics value so it doesn't influence the distance as much. – cwharland May 25 '14 at 15:10
• The canonical paper for implicit feedback is Hu, Koren, and Volinsky. Lots of good recommendations in there, including estimating your confidence in which -1 indicates a dislike or merely a "didn't see." – Trey May 27 '14 at 0:00

1 Answer

Your system isn't just trained on items that are recommended right? if so you have a big feedback loop here. You want to learn from all clicks/views, I hope.

You suggest that not-looking at an item is a negative signal. I strongly suggest you do not treat it that way. Not interacting with something is almost always best treated as no information. If you have an explicit signal that indicates a dislike, like a down vote (or, maybe watched 10 seconds of a video and stopped), maybe that's valid.

I would not construe this input as rating-like data. (Although in your case, you may get away with it.) Instead think of them as weights, which is exactly the treatment in the Hu Koren Volinsky paper on ALS that @Trey mentions in a comment. This lets you record relative strength of positive/negative interactions.

Finally I would note that this paper, while is very likely to be what you're looking for, does not provide for negative weights. It is simple to extend in this way. If you get that far I can point you to the easy extension, which exists already in two implementations that I know of, in Spark and Oryx.

• I think imputing slight negative values for items that have been seen many times but never chosen is reasonable. The OP doesn't indicate they have access to data that qualifies these negative imputations but I wouldn't rule that tactic out entirely. The optimal magnitude of the negative value can be determined from the data. I've had small gains from doing this in recsys scenarios. In any case...would you suggest other ways of differentiating between item seen once and not chosen vs seen N times and never chosen besides negative imputing? – cwharland May 28 '14 at 2:37