Skip to content
This repository has been archived by the owner on May 16, 2024. It is now read-only.

HW2 Даниил Ануфриев #25

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion botify/botify/experiment.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ class Experiments:
GCF = Experiment("GCF", Split.HALF_HALF)
DIVERSITY = Experiment("DIVERSITY", Split.HALF_HALF)
ALL = Experiment("ALL", Split.SEVEN_WAY)
HW = Experiment("HW", Split.HALF_HALF)

def __init__(self):
self.experiments = [Experiments.ALL]
self.experiments = [Experiments.HW]
25 changes: 25 additions & 0 deletions botify/botify/recommenders/indexed_heuristic.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import random

from .recommender import Recommender


class Indexed_Heuristic(Recommender):
def __init__(self, recommendations_redis, catalog, fallback):
self.recommendations_redis = recommendations_redis
self.fallback = fallback
self.catalog = catalog

def recommend_next(self, user: int, prev_track: int, prev_track_time: float) -> int:
recommendations = self.recommendations_redis.get(user)

if recommendations is not None:
recommendations = list(self.catalog.from_bytes(recommendations))
if prev_track not in recommendations or prev_track_time < 0.5:
next_track = random.choice(recommendations)
else:
idx = (recommendations.index(prev_track) + 1) % len(recommendations)
next_track = recommendations[idx]

return next_track
else:
return self.fallback.recommend_next(user, prev_track, prev_track_time)
17 changes: 4 additions & 13 deletions botify/botify/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from botify.recommenders.contextual import Contextual
from botify.recommenders.toppop import TopPop
from botify.recommenders.sticky_artist import StickyArtist
from botify.recommenders.indexed_heuristic import Indexed_Heuristic
from botify.track import Catalog

root = logging.getLogger()
Expand Down Expand Up @@ -90,22 +91,12 @@ def post(self, user: int):

args = parser.parse_args()

treatment = Experiments.ALL.assign(user)
treatment = Experiments.HW.assign(user)

if treatment == Treatment.T1:
recommender = StickyArtist(tracks_redis.connection, artists_redis.connection, catalog)
elif treatment == Treatment.T2:
recommender = TopPop(catalog.top_tracks[:100], Random(tracks_redis.connection))
elif treatment == Treatment.T3:
recommender = Indexed(recommendations_lfm.connection, catalog, Random(tracks_redis.connection))
elif treatment == Treatment.T4:
recommender = Indexed(recommendations_dssm.connection, catalog, Random(tracks_redis.connection))
elif treatment == Treatment.T5:
recommender = Contextual(recommendations_contextual.connection, catalog, Random(tracks_redis.connection))
elif treatment == Treatment.T6:
recommender = Contextual(recommendations_div.connection, catalog, Random(tracks_redis.connection))
recommender = Indexed_Heuristic(recommendations_dssm.connection, catalog, Random(tracks_redis.connection))
else:
recommender = Random(tracks_redis.connection)
recommender = Indexed(recommendations_dssm.connection, catalog, Random(tracks_redis.connection))

recommendation = recommender.recommend_next(user, args.track, args.time)

Expand Down
546 changes: 546 additions & 0 deletions hw/AB.ipynb

Large diffs are not rendered by default.

16 changes: 16 additions & 0 deletions hw/homework2_report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Abstract
Сделали эвристику на DSSM, которая улучшила результат. Основная идея - похожие треки лежат рядом в рекомендации DSSM.

# Детали
Если у треков похожие эмбеды в модели, то и score будет похожий, поэтому рядом лежат похожие треки в рекомендациях. Тогда будем рекомендовать следущий треки из списка рекомендаций, если предыдущий понравился (прослушал хотя бы половину). Если не понравился, то выдадим рандомный из рекомендаций.

# A/B тест
treatment - эвристика, control - DSSM
![alt text](image.png)

# Запуск

- из папка botify запустить докер `docker-compose up -d --build --force-recreate --scale recommender=1`
- из папки sim запустить симуляцию `python -m sim.run --episodes 2000 --config config/env.yml multi --processes 1`
- копировать логи в /tmp `docker cp botify-recommender-1:/app/log/ /tmp/`
- запустить ячейки в ноутбуке `jupyter notebook hw/AB.ipynb`, в самом низу будет результат эксперимента