Kollaborativní filtrování je technika, která se široce používá v doporučovacích systémech a je rychle se rozvíjející oblastí výzkumu. Dvě nejčastěji používané metody jsou metody založené na paměti a na modelu.
V tomto příspěvku se zaměříme pouze na (User-Based Collaborative Filtering) UB-CF, což je metoda založená na paměti. Hlavní myšlenkou UB-CF je, že lidé s podobnými charakteristikami sdílejí podobný vkus. Například pokud máme zájem doporučit film našemu kamarádovi Bobovi, předpokládejme, že jsme s Bobem viděli společně mnoho filmů a hodnotili jsme je téměř stejně. Dává smysl si myslet, že i v budoucnu se nám budou líbit podobné filmy, a použít tuto metriku podobnosti k doporučování filmů.
Pokusíme se implementovat UB-CF a vygenerovat seznam filmů, o které by mohl mít zájem náš přítel Bob alias aktivní uživatel. Motivací k napsání tohoto příspěvku je hlubší ponoření se do algoritmu a pochopení toho, jak UB-CF vlastně funguje. Většina obsahu tohoto příspěvku je inspirována kurzem na Coursera.
Metoda identifikuje uživatele, kteří jsou podobní dotazovanému uživateli, a odhaduje požadované hodnocení jako vážený průměr hodnocení těchto podobných uživatelů.
Doporučení bychom prováděli na datasetu MovieLens. Použitým programovacím jazykem je python a práce na analýze dat probíhá převážně pomocí knihovny pandas. Použité IDE je jupyter notebook.
Ještě než začneme, rád bych uvedl seznam použitých knihoven :
Pandas
Numpy
sklearn
Takže pojďme dál a pochopme pojmy, které stojí za doporučeními. Pro lepší pochopení jsem v blogu přiložil několik úryvků kódu a výstupů. Celý soubor ipynb je přiložen na konci blogu.
Funkce skóre
Je snadné vymyslet funkci pro nepersonalizované kolaborativní filtrování (tj. nezohledňujeme sympatie, antipatie a hodnocení aktivního uživatele z minulosti), která vrací skóre, přičemž jako vstupní parametry bere uživatele u a položku i. Výstupem funkce je skóre, které kvantifikuje, jak silně se uživateli u líbí/preferuje položku i.
Takto se obvykle provádí pomocí hodnocení jiných lidí podobných uživateli. To vše by bylo podrobně rozebráno později. Prozatím jsem použil vzorec,