diff --git a/HW-3.1.ipynb b/HW-3.1.ipynb
new file mode 100644
index 00000000..c05a3b71
--- /dev/null
+++ b/HW-3.1.ipynb
@@ -0,0 +1,4027 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "398a86d9",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from pprint import pprint\n",
+ "import warnings\n",
+ "warnings.filterwarnings(\"ignore\")\n",
+ "\n",
+ "import sys\n",
+ "sys.path.append('../')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "8dbe6bf0",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import plotly.express as px\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import scipy as sp\n",
+ "import requests\n",
+ "from tqdm.auto import tqdm\n",
+ "from scipy.stats import mode\n",
+ "from implicit.nearest_neighbours import CosineRecommender, TFIDFRecommender, BM25Recommender\n",
+ "from rectools import Columns\n",
+ "from rectools.model_selection import TimeRangeSplitter\n",
+ "from rectools.metrics import Precision, Recall, MAP, MeanInvUserFreq, Serendipity, calc_metrics\n",
+ "from rectools.dataset.interactions import Interactions\n",
+ "\n",
+ "from service.utils.user_knn import UserKnn"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b1baa79f",
+ "metadata": {},
+ "source": [
+ "# Data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "f2a9e540",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "((5476251, 5), (840197, 5), (15963, 14))"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "interactions = pd.read_csv('../data/kion_train/interactions.csv')\n",
+ "users = pd.read_csv('../data/kion_train/users.csv')\n",
+ "items = pd.read_csv('../data/kion_train/items.csv')\n",
+ "\n",
+ "interactions.shape, users.shape, items.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "456d25f4",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "interactions.rename(\n",
+ " columns={\n",
+ " 'last_watch_dt': Columns.Datetime,\n",
+ " 'total_dur': Columns.Weight\n",
+ " }, \n",
+ " inplace=True) \n",
+ "\n",
+ "interactions[Columns.Datetime] = pd.to_datetime(interactions[Columns.Datetime])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6f7b9b0c",
+ "metadata": {},
+ "source": [
+ "## Intersection"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "7c9c0c94",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " user_id | \n",
+ " item_id | \n",
+ " datetime | \n",
+ " weight | \n",
+ " watched_pct | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 176549 | \n",
+ " 9506 | \n",
+ " 2021-05-11 | \n",
+ " 4250 | \n",
+ " 72.0 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 699317 | \n",
+ " 1659 | \n",
+ " 2021-05-29 | \n",
+ " 8317 | \n",
+ " 100.0 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 656683 | \n",
+ " 7107 | \n",
+ " 2021-05-09 | \n",
+ " 10 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 864613 | \n",
+ " 7638 | \n",
+ " 2021-07-05 | \n",
+ " 14483 | \n",
+ " 100.0 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 964868 | \n",
+ " 9506 | \n",
+ " 2021-04-30 | \n",
+ " 6725 | \n",
+ " 100.0 | \n",
+ "
\n",
+ " \n",
+ " | 5476246 | \n",
+ " 648596 | \n",
+ " 12225 | \n",
+ " 2021-08-13 | \n",
+ " 76 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 5476247 | \n",
+ " 546862 | \n",
+ " 9673 | \n",
+ " 2021-04-13 | \n",
+ " 2308 | \n",
+ " 49.0 | \n",
+ "
\n",
+ " \n",
+ " | 5476248 | \n",
+ " 697262 | \n",
+ " 15297 | \n",
+ " 2021-08-20 | \n",
+ " 18307 | \n",
+ " 63.0 | \n",
+ "
\n",
+ " \n",
+ " | 5476249 | \n",
+ " 384202 | \n",
+ " 16197 | \n",
+ " 2021-04-19 | \n",
+ " 6203 | \n",
+ " 100.0 | \n",
+ "
\n",
+ " \n",
+ " | 5476250 | \n",
+ " 319709 | \n",
+ " 4436 | \n",
+ " 2021-08-15 | \n",
+ " 3921 | \n",
+ " 45.0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " user_id item_id datetime weight watched_pct\n",
+ "0 176549 9506 2021-05-11 4250 72.0\n",
+ "1 699317 1659 2021-05-29 8317 100.0\n",
+ "2 656683 7107 2021-05-09 10 0.0\n",
+ "3 864613 7638 2021-07-05 14483 100.0\n",
+ "4 964868 9506 2021-04-30 6725 100.0\n",
+ "5476246 648596 12225 2021-08-13 76 0.0\n",
+ "5476247 546862 9673 2021-04-13 2308 49.0\n",
+ "5476248 697262 15297 2021-08-20 18307 63.0\n",
+ "5476249 384202 16197 2021-04-19 6203 100.0\n",
+ "5476250 319709 4436 2021-08-15 3921 45.0"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pd.concat([interactions.head(), interactions.tail()])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "c5c3ce6c",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Interactions dataframe shape: (5476251, 5)\n",
+ "Unique users in interactions: 962179\n",
+ "Unique items in interactions: 15706\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(f\"Interactions dataframe shape: {interactions.shape}\")\n",
+ "print(f\"Unique users in interactions: {interactions[Columns.User].nunique()}\")\n",
+ "print(f\"Unique items in interactions: {interactions[Columns.Item].nunique()}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "0214a978",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "min date in interactions: 2021-03-13 00:00:00\n",
+ "max date in interactions: 2021-08-22 00:00:00\n"
+ ]
+ }
+ ],
+ "source": [
+ "max_date = interactions[Columns.Datetime].max()\n",
+ "min_date = interactions[Columns.Datetime].min()\n",
+ "\n",
+ "print(f\"min date in interactions: {min_date}\")\n",
+ "print(f\"max date in interactions: {max_date}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "7829e796",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "RangeIndex: 5476251 entries, 0 to 5476250\n",
+ "Data columns (total 5 columns):\n",
+ " # Column Dtype \n",
+ "--- ------ ----- \n",
+ " 0 user_id int64 \n",
+ " 1 item_id int64 \n",
+ " 2 datetime datetime64[ns]\n",
+ " 3 weight int64 \n",
+ " 4 watched_pct float64 \n",
+ "dtypes: datetime64[ns](1), float64(1), int64(3)\n",
+ "memory usage: 208.9 MB\n"
+ ]
+ }
+ ],
+ "source": [
+ "interactions.info()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "57cddf34",
+ "metadata": {},
+ "source": [
+ "## Users"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "de5dea16",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " user_id | \n",
+ " age | \n",
+ " income | \n",
+ " sex | \n",
+ " kids_flg | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 973171 | \n",
+ " age_25_34 | \n",
+ " income_60_90 | \n",
+ " М | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 962099 | \n",
+ " age_18_24 | \n",
+ " income_20_40 | \n",
+ " М | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1047345 | \n",
+ " age_45_54 | \n",
+ " income_40_60 | \n",
+ " Ж | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 721985 | \n",
+ " age_45_54 | \n",
+ " income_20_40 | \n",
+ " Ж | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 704055 | \n",
+ " age_35_44 | \n",
+ " income_60_90 | \n",
+ " Ж | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 840192 | \n",
+ " 339025 | \n",
+ " age_65_inf | \n",
+ " income_0_20 | \n",
+ " Ж | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 840193 | \n",
+ " 983617 | \n",
+ " age_18_24 | \n",
+ " income_20_40 | \n",
+ " Ж | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 840194 | \n",
+ " 251008 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 840195 | \n",
+ " 590706 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " Ж | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 840196 | \n",
+ " 166555 | \n",
+ " age_65_inf | \n",
+ " income_20_40 | \n",
+ " Ж | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " user_id age income sex kids_flg\n",
+ "0 973171 age_25_34 income_60_90 М 1\n",
+ "1 962099 age_18_24 income_20_40 М 0\n",
+ "2 1047345 age_45_54 income_40_60 Ж 0\n",
+ "3 721985 age_45_54 income_20_40 Ж 0\n",
+ "4 704055 age_35_44 income_60_90 Ж 0\n",
+ "840192 339025 age_65_inf income_0_20 Ж 0\n",
+ "840193 983617 age_18_24 income_20_40 Ж 1\n",
+ "840194 251008 NaN NaN NaN 0\n",
+ "840195 590706 NaN NaN Ж 0\n",
+ "840196 166555 age_65_inf income_20_40 Ж 0"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pd.concat([users.head(), users.tail()])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "e4e6d2f5",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Users dataframe shape (840197, 5)\n",
+ "Unique users: 840197\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(f\"Users dataframe shape {users.shape}\")\n",
+ "print(f\"Unique users: {users['user_id'].nunique()}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "98b4ff6c",
+ "metadata": {},
+ "source": [
+ "## Items"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "19b43ff0",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " item_id | \n",
+ " content_type | \n",
+ " title | \n",
+ " title_orig | \n",
+ " release_year | \n",
+ " genres | \n",
+ " countries | \n",
+ " for_kids | \n",
+ " age_rating | \n",
+ " studios | \n",
+ " directors | \n",
+ " actors | \n",
+ " description | \n",
+ " keywords | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 10711 | \n",
+ " film | \n",
+ " Поговори с ней | \n",
+ " Hable con ella | \n",
+ " 2002.0 | \n",
+ " драмы, зарубежные, детективы, мелодрамы | \n",
+ " Испания | \n",
+ " NaN | \n",
+ " 16.0 | \n",
+ " NaN | \n",
+ " Педро Альмодовар | \n",
+ " Адольфо Фернандес, Ана Фернандес, Дарио Гранди... | \n",
+ " Мелодрама легендарного Педро Альмодовара «Пого... | \n",
+ " Поговори, ней, 2002, Испания, друзья, любовь, ... | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2508 | \n",
+ " film | \n",
+ " Голые перцы | \n",
+ " Search Party | \n",
+ " 2014.0 | \n",
+ " зарубежные, приключения, комедии | \n",
+ " США | \n",
+ " NaN | \n",
+ " 16.0 | \n",
+ " NaN | \n",
+ " Скот Армстронг | \n",
+ " Адам Палли, Брайан Хаски, Дж.Б. Смув, Джейсон ... | \n",
+ " Уморительная современная комедия на популярную... | \n",
+ " Голые, перцы, 2014, США, друзья, свадьбы, прео... | \n",
+ "
\n",
+ " \n",
+ " | 15961 | \n",
+ " 4538 | \n",
+ " series | \n",
+ " Среди камней | \n",
+ " Darklands | \n",
+ " 2019.0 | \n",
+ " драмы, спорт, криминал | \n",
+ " Россия | \n",
+ " 0.0 | \n",
+ " 18.0 | \n",
+ " NaN | \n",
+ " Марк О’Коннор, Конор МакМахон | \n",
+ " Дэйн Уайт О’Хара, Томас Кэйн-Бирн, Джудит Родд... | \n",
+ " Семнадцатилетний Дэмиен мечтает вырваться за п... | \n",
+ " Среди, камней, 2019, Россия | \n",
+ "
\n",
+ " \n",
+ " | 15962 | \n",
+ " 3206 | \n",
+ " series | \n",
+ " Гоша | \n",
+ " NaN | \n",
+ " 2019.0 | \n",
+ " комедии | \n",
+ " Россия | \n",
+ " 0.0 | \n",
+ " 16.0 | \n",
+ " NaN | \n",
+ " Михаил Миронов | \n",
+ " Мкртыч Арзуманян, Виктория Рунцова | \n",
+ " Добродушный Гоша не может выйти из дома, чтобы... | \n",
+ " Гоша, 2019, Россия | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " item_id content_type title title_orig release_year \\\n",
+ "0 10711 film Поговори с ней Hable con ella 2002.0 \n",
+ "1 2508 film Голые перцы Search Party 2014.0 \n",
+ "15961 4538 series Среди камней Darklands 2019.0 \n",
+ "15962 3206 series Гоша NaN 2019.0 \n",
+ "\n",
+ " genres countries for_kids \\\n",
+ "0 драмы, зарубежные, детективы, мелодрамы Испания NaN \n",
+ "1 зарубежные, приключения, комедии США NaN \n",
+ "15961 драмы, спорт, криминал Россия 0.0 \n",
+ "15962 комедии Россия 0.0 \n",
+ "\n",
+ " age_rating studios directors \\\n",
+ "0 16.0 NaN Педро Альмодовар \n",
+ "1 16.0 NaN Скот Армстронг \n",
+ "15961 18.0 NaN Марк О’Коннор, Конор МакМахон \n",
+ "15962 16.0 NaN Михаил Миронов \n",
+ "\n",
+ " actors \\\n",
+ "0 Адольфо Фернандес, Ана Фернандес, Дарио Гранди... \n",
+ "1 Адам Палли, Брайан Хаски, Дж.Б. Смув, Джейсон ... \n",
+ "15961 Дэйн Уайт О’Хара, Томас Кэйн-Бирн, Джудит Родд... \n",
+ "15962 Мкртыч Арзуманян, Виктория Рунцова \n",
+ "\n",
+ " description \\\n",
+ "0 Мелодрама легендарного Педро Альмодовара «Пого... \n",
+ "1 Уморительная современная комедия на популярную... \n",
+ "15961 Семнадцатилетний Дэмиен мечтает вырваться за п... \n",
+ "15962 Добродушный Гоша не может выйти из дома, чтобы... \n",
+ "\n",
+ " keywords \n",
+ "0 Поговори, ней, 2002, Испания, друзья, любовь, ... \n",
+ "1 Голые, перцы, 2014, США, друзья, свадьбы, прео... \n",
+ "15961 Среди, камней, 2019, Россия \n",
+ "15962 Гоша, 2019, Россия "
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pd.concat([items.head(2), items.tail(2)])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "8c8fb319",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Items dataframe shape (15963, 14)\n",
+ "Unique item_id: 15963\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(f\"Items dataframe shape {items.shape}\")\n",
+ "print(f\"Unique item_id: {items['item_id'].nunique()}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2b35b460",
+ "metadata": {},
+ "source": [
+ "# userkNN model CV"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "f60e6ecb",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ " \n",
+ " "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "variable=user_id
datetime=%{x}
value=%{y}",
+ "legendgroup": "user_id",
+ "marker": {
+ "color": "#636efa",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "user_id",
+ "offsetgroup": "user_id",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "2021-03-13T00:00:00",
+ "2021-03-14T00:00:00",
+ "2021-03-15T00:00:00",
+ "2021-03-16T00:00:00",
+ "2021-03-17T00:00:00",
+ "2021-03-18T00:00:00",
+ "2021-03-19T00:00:00",
+ "2021-03-20T00:00:00",
+ "2021-03-21T00:00:00",
+ "2021-03-22T00:00:00",
+ "2021-03-23T00:00:00",
+ "2021-03-24T00:00:00",
+ "2021-03-25T00:00:00",
+ "2021-03-26T00:00:00",
+ "2021-03-27T00:00:00",
+ "2021-03-28T00:00:00",
+ "2021-03-29T00:00:00",
+ "2021-03-30T00:00:00",
+ "2021-03-31T00:00:00",
+ "2021-04-01T00:00:00",
+ "2021-04-02T00:00:00",
+ "2021-04-03T00:00:00",
+ "2021-04-04T00:00:00",
+ "2021-04-05T00:00:00",
+ "2021-04-06T00:00:00",
+ "2021-04-07T00:00:00",
+ "2021-04-08T00:00:00",
+ "2021-04-09T00:00:00",
+ "2021-04-10T00:00:00",
+ "2021-04-11T00:00:00",
+ "2021-04-12T00:00:00",
+ "2021-04-13T00:00:00",
+ "2021-04-14T00:00:00",
+ "2021-04-15T00:00:00",
+ "2021-04-16T00:00:00",
+ "2021-04-17T00:00:00",
+ "2021-04-18T00:00:00",
+ "2021-04-19T00:00:00",
+ "2021-04-20T00:00:00",
+ "2021-04-21T00:00:00",
+ "2021-04-22T00:00:00",
+ "2021-04-23T00:00:00",
+ "2021-04-24T00:00:00",
+ "2021-04-25T00:00:00",
+ "2021-04-26T00:00:00",
+ "2021-04-27T00:00:00",
+ "2021-04-28T00:00:00",
+ "2021-04-29T00:00:00",
+ "2021-04-30T00:00:00",
+ "2021-05-01T00:00:00",
+ "2021-05-02T00:00:00",
+ "2021-05-03T00:00:00",
+ "2021-05-04T00:00:00",
+ "2021-05-05T00:00:00",
+ "2021-05-06T00:00:00",
+ "2021-05-07T00:00:00",
+ "2021-05-08T00:00:00",
+ "2021-05-09T00:00:00",
+ "2021-05-10T00:00:00",
+ "2021-05-11T00:00:00",
+ "2021-05-12T00:00:00",
+ "2021-05-13T00:00:00",
+ "2021-05-14T00:00:00",
+ "2021-05-15T00:00:00",
+ "2021-05-16T00:00:00",
+ "2021-05-17T00:00:00",
+ "2021-05-18T00:00:00",
+ "2021-05-19T00:00:00",
+ "2021-05-20T00:00:00",
+ "2021-05-21T00:00:00",
+ "2021-05-22T00:00:00",
+ "2021-05-23T00:00:00",
+ "2021-05-24T00:00:00",
+ "2021-05-25T00:00:00",
+ "2021-05-26T00:00:00",
+ "2021-05-27T00:00:00",
+ "2021-05-28T00:00:00",
+ "2021-05-29T00:00:00",
+ "2021-05-30T00:00:00",
+ "2021-05-31T00:00:00",
+ "2021-06-01T00:00:00",
+ "2021-06-02T00:00:00",
+ "2021-06-03T00:00:00",
+ "2021-06-04T00:00:00",
+ "2021-06-05T00:00:00",
+ "2021-06-06T00:00:00",
+ "2021-06-07T00:00:00",
+ "2021-06-08T00:00:00",
+ "2021-06-09T00:00:00",
+ "2021-06-10T00:00:00",
+ "2021-06-11T00:00:00",
+ "2021-06-12T00:00:00",
+ "2021-06-13T00:00:00",
+ "2021-06-14T00:00:00",
+ "2021-06-15T00:00:00",
+ "2021-06-16T00:00:00",
+ "2021-06-17T00:00:00",
+ "2021-06-18T00:00:00",
+ "2021-06-19T00:00:00",
+ "2021-06-20T00:00:00",
+ "2021-06-21T00:00:00",
+ "2021-06-22T00:00:00",
+ "2021-06-23T00:00:00",
+ "2021-06-24T00:00:00",
+ "2021-06-25T00:00:00",
+ "2021-06-26T00:00:00",
+ "2021-06-27T00:00:00",
+ "2021-06-28T00:00:00",
+ "2021-06-29T00:00:00",
+ "2021-06-30T00:00:00",
+ "2021-07-01T00:00:00",
+ "2021-07-02T00:00:00",
+ "2021-07-03T00:00:00",
+ "2021-07-04T00:00:00",
+ "2021-07-05T00:00:00",
+ "2021-07-06T00:00:00",
+ "2021-07-07T00:00:00",
+ "2021-07-08T00:00:00",
+ "2021-07-09T00:00:00",
+ "2021-07-10T00:00:00",
+ "2021-07-11T00:00:00",
+ "2021-07-12T00:00:00",
+ "2021-07-13T00:00:00",
+ "2021-07-14T00:00:00",
+ "2021-07-15T00:00:00",
+ "2021-07-16T00:00:00",
+ "2021-07-17T00:00:00",
+ "2021-07-18T00:00:00",
+ "2021-07-19T00:00:00",
+ "2021-07-20T00:00:00",
+ "2021-07-21T00:00:00",
+ "2021-07-22T00:00:00",
+ "2021-07-23T00:00:00",
+ "2021-07-24T00:00:00",
+ "2021-07-25T00:00:00",
+ "2021-07-26T00:00:00",
+ "2021-07-27T00:00:00",
+ "2021-07-28T00:00:00",
+ "2021-07-29T00:00:00",
+ "2021-07-30T00:00:00",
+ "2021-07-31T00:00:00",
+ "2021-08-01T00:00:00",
+ "2021-08-02T00:00:00",
+ "2021-08-03T00:00:00",
+ "2021-08-04T00:00:00",
+ "2021-08-05T00:00:00",
+ "2021-08-06T00:00:00",
+ "2021-08-07T00:00:00",
+ "2021-08-08T00:00:00",
+ "2021-08-09T00:00:00",
+ "2021-08-10T00:00:00",
+ "2021-08-11T00:00:00",
+ "2021-08-12T00:00:00",
+ "2021-08-13T00:00:00",
+ "2021-08-14T00:00:00",
+ "2021-08-15T00:00:00",
+ "2021-08-16T00:00:00",
+ "2021-08-17T00:00:00",
+ "2021-08-18T00:00:00",
+ "2021-08-19T00:00:00",
+ "2021-08-20T00:00:00",
+ "2021-08-21T00:00:00",
+ "2021-08-22T00:00:00"
+ ],
+ "xaxis": "x",
+ "y": [
+ 16104,
+ 15606,
+ 12363,
+ 12643,
+ 12753,
+ 12788,
+ 13657,
+ 15346,
+ 15560,
+ 12752,
+ 13147,
+ 13435,
+ 12698,
+ 13909,
+ 15657,
+ 16112,
+ 12783,
+ 13101,
+ 13460,
+ 12966,
+ 14084,
+ 15431,
+ 15346,
+ 12642,
+ 12528,
+ 13129,
+ 13827,
+ 14416,
+ 15937,
+ 16046,
+ 12835,
+ 12322,
+ 12451,
+ 12275,
+ 13342,
+ 15464,
+ 16275,
+ 14286,
+ 20420,
+ 23200,
+ 21274,
+ 22127,
+ 26161,
+ 28964,
+ 21625,
+ 22590,
+ 21406,
+ 19987,
+ 21406,
+ 23479,
+ 24767,
+ 26267,
+ 25983,
+ 23941,
+ 23510,
+ 23201,
+ 27550,
+ 25986,
+ 27242,
+ 20957,
+ 20578,
+ 20729,
+ 21152,
+ 24530,
+ 24914,
+ 20960,
+ 20574,
+ 21561,
+ 22712,
+ 25697,
+ 27895,
+ 29978,
+ 24317,
+ 23667,
+ 22529,
+ 23881,
+ 24131,
+ 29035,
+ 31308,
+ 26821,
+ 26587,
+ 27577,
+ 28683,
+ 33150,
+ 34795,
+ 37096,
+ 31402,
+ 31107,
+ 32896,
+ 38964,
+ 37935,
+ 38619,
+ 42125,
+ 38973,
+ 35993,
+ 57686,
+ 41440,
+ 42174,
+ 43679,
+ 47989,
+ 39127,
+ 39693,
+ 41688,
+ 38394,
+ 41428,
+ 45898,
+ 48903,
+ 43301,
+ 43887,
+ 67749,
+ 53900,
+ 46642,
+ 48832,
+ 52812,
+ 43375,
+ 41380,
+ 41163,
+ 41592,
+ 40955,
+ 44798,
+ 46250,
+ 42487,
+ 43764,
+ 43128,
+ 43010,
+ 44878,
+ 49714,
+ 54139,
+ 45541,
+ 44431,
+ 44422,
+ 46313,
+ 46911,
+ 50317,
+ 54378,
+ 48531,
+ 49324,
+ 50267,
+ 50585,
+ 53121,
+ 59499,
+ 62128,
+ 53495,
+ 52181,
+ 51911,
+ 51047,
+ 53745,
+ 59316,
+ 61454,
+ 52794,
+ 53712,
+ 55617,
+ 56497,
+ 55843,
+ 61644,
+ 66546,
+ 54546,
+ 54311,
+ 56789,
+ 58640,
+ 60145,
+ 68834,
+ 71171
+ ],
+ "yaxis": "y"
+ }
+ ],
+ "layout": {
+ "barmode": "relative",
+ "legend": {
+ "title": {
+ "text": "variable"
+ },
+ "tracegroupgap": 0
+ },
+ "margin": {
+ "t": 60
+ },
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "heatmapgl": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmapgl"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "#E5ECF6",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "white"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "#E5ECF6",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "radialaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "yaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "zaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "caxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "xaxis": {
+ "anchor": "y",
+ "domain": [
+ 0,
+ 1
+ ],
+ "title": {
+ "text": "datetime"
+ }
+ },
+ "yaxis": {
+ "anchor": "x",
+ "domain": [
+ 0,
+ 1
+ ],
+ "title": {
+ "text": "value"
+ }
+ }
+ }
+ },
+ "text/html": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "fig = px.bar(interactions.groupby(Columns.Datetime)[Columns.User].agg('count'))\n",
+ "fig.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "43f216d0",
+ "metadata": {},
+ "source": [
+ "Из графика видны **недельные тенденции** просмотров, поэтому следует fold-ы разделять по 7 дней, но т.к. на семинаре дали \"намек\", что private dataset имеет количество дней, меньшее чем 7. Поэтому фолды будут разбиваться на **5 и 7 дней**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "07fbdb30",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "6"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pd.to_datetime('23-05-2021', format='%d-%m-%Y').weekday()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2ff625b2",
+ "metadata": {},
+ "source": [
+ "### train test split"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "759ba346",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def create_data_range(\n",
+ " last_date: pd.Timestamp, \n",
+ " n_folds: int = 7, \n",
+ " unit: str = \"W\", \n",
+ " n_units: int = 1, \n",
+ " show: bool = True,\n",
+ "):\n",
+ " periods = n_folds + 1\n",
+ " freq = f\"{n_units}{unit}\"\n",
+ " \n",
+ " start_date = last_date - pd.Timedelta(n_folds * n_units + n_units, unit=unit) \n",
+ " \n",
+ " date_range = pd.date_range(start=start_date, periods=periods, freq=freq, tz=last_date.tz)\n",
+ " \n",
+ " if show:\n",
+ " print(\n",
+ " f\"start_date: {start_date}\\n\"\n",
+ " f\"last_date: {last_date}\\n\"\n",
+ " f\"periods: {periods}\\n\"\n",
+ " f\"freq: {freq}\\n\"\n",
+ " f\"Test fold borders: {date_range.values.astype('datetime64[D]')}\\n\"\n",
+ " )\n",
+ " \n",
+ " return date_range"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "38bfd397",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "CONFIG_CV = {\n",
+ " \"cv_v1\": {\n",
+ " \"n_folds\": 7,\n",
+ " \"unit\": \"W\",\n",
+ " \"n_units\": 1,\n",
+ " },\n",
+ " \"cv_v2\": {\n",
+ " \"n_folds\": 7,\n",
+ " \"unit\": \"D\",\n",
+ " \"n_units\": 5,\n",
+ " }, \n",
+ "}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "f518e089",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Timestamp('2021-08-22 00:00:00')"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "last_date = interactions[Columns.Datetime].max().normalize()\n",
+ "last_date"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "1fd68b9b",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "***Folds v1***\n",
+ "start_date: 2021-07-13 00:00:00\n",
+ "last_date: 2021-08-22 00:00:00\n",
+ "periods: 8\n",
+ "freq: 5D\n",
+ "Test fold borders: ['2021-07-13' '2021-07-18' '2021-07-23' '2021-07-28' '2021-08-02'\n",
+ " '2021-08-07' '2021-08-12' '2021-08-17']\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(\"***Folds v1***\")\n",
+ "date_range_v1 = create_data_range(\n",
+ " last_date, \n",
+ " n_folds=CONFIG_CV[\"cv_v2\"][\"n_folds\"], \n",
+ " unit=CONFIG_CV[\"cv_v2\"][\"unit\"], \n",
+ " n_units=CONFIG_CV[\"cv_v2\"][\"n_units\"]\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "efc59555",
+ "metadata": {},
+ "source": [
+ "**генерируем фолды** "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "9fae43f6",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Real number of folds: 7\n"
+ ]
+ }
+ ],
+ "source": [
+ "cv_v1 = TimeRangeSplitter(\n",
+ " date_range=date_range_v1,\n",
+ " filter_already_seen=True,\n",
+ " filter_cold_items=True,\n",
+ " filter_cold_users=True,\n",
+ ")\n",
+ "print(f\"Real number of folds: {cv_v1.get_n_splits(Interactions(interactions))}\")\n",
+ "\n",
+ "CV = [cv_v1]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e15a83a7",
+ "metadata": {},
+ "source": [
+ "**Формируем метрики**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "8f7742c6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "metrics = {\n",
+ " \"prec@10\": Precision(k=10),\n",
+ " \"recall@10\": Recall(k=10),\n",
+ " \"MAP@10\": MAP(k=10),\n",
+ " \"novelty\": MeanInvUserFreq(k=10),\n",
+ " \"serendipity\": Serendipity(k=10),\n",
+ "}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "b21a1ecf",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'cosine_userknn_K30': ,\n",
+ " 'tfidf_userknn_K30': ,\n",
+ " 'bm25_userknn_K30': ,\n",
+ " 'cosine_userknn_K40': ,\n",
+ " 'tfidf_userknn_K40': ,\n",
+ " 'bm25_userknn_K40': }"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "K = [30, 40]\n",
+ "models = dict()\n",
+ "\n",
+ "for k in K:\n",
+ " models[f\"cosine_userknn_K{k}\"] = CosineRecommender(K=k)\n",
+ " models[f\"tfidf_userknn_K{k}\"] = TFIDFRecommender(K=k)\n",
+ " models[f\"bm25_userknn_K{k}\"] = BM25Recommender(K=k)\n",
+ "\n",
+ "models"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0103149a",
+ "metadata": {},
+ "source": [
+ "## Training"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "e78b8221",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "N_USERS = 50"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "50dcff0b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%%time\n",
+ "\n",
+ "results = []\n",
+ "\n",
+ "for idx, cv in enumerate(CV):\n",
+ " print(f\"\\n CV version {idx}\")\n",
+ " fold_iterator = cv.split(Interactions(interactions), collect_fold_stats=True)\n",
+ "\n",
+ " for i_fold, (train_ids, test_ids, fold_info) in enumerate(fold_iterator):\n",
+ " print(f\"\\n==================== Fold {i_fold}\")\n",
+ " pprint(fold_info)\n",
+ "\n",
+ " df_train = interactions.iloc[train_ids].copy()\n",
+ " df_test = interactions.iloc[test_ids][Columns.UserItem].copy()\n",
+ "\n",
+ " catalog = df_train[Columns.Item].unique()\n",
+ "\n",
+ " for model_name, model in models.items():\n",
+ " userknn_model = UserKnn(model=model, N_users=N_USERS, use_weight_idf=True)\n",
+ " userknn_model.fit(df_train)\n",
+ "\n",
+ " if 'bm25' in model_name:\n",
+ " recos = userknn_model.predict(df_test, bmp25=True)\n",
+ " else:\n",
+ " recos = userknn_model.predict(df_test)\n",
+ "\n",
+ " metric_values = calc_metrics(\n",
+ " metrics,\n",
+ " reco=recos,\n",
+ " interactions=df_test,\n",
+ " prev_interactions=df_train,\n",
+ " catalog=catalog,\n",
+ " )\n",
+ "\n",
+ " full_model_name = f\"{model_name}_cv-{idx}\"\n",
+ " fold = {\"fold\": i_fold, \"model\": full_model_name}\n",
+ " fold.update(metric_values)\n",
+ " results.append(fold)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "708ec5c2",
+ "metadata": {},
+ "source": [
+ "Работало больше 10 часов, случайно при перезапуске ноутбука была вызвана ячейка и остановлена, поэтому завершилась с ошибкой, поэтому ошибку убрали для лучшего вида"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "id": "d7e2ffa7",
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " fold | \n",
+ " model | \n",
+ " prec@10 | \n",
+ " recall@10 | \n",
+ " MAP@10 | \n",
+ " novelty | \n",
+ " serendipity | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 0 | \n",
+ " cosine_userknn_K30_cv-0 | \n",
+ " 0.003557 | \n",
+ " 0.021128 | \n",
+ " 0.003695 | \n",
+ " 8.331491 | \n",
+ " 0.000040 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 0 | \n",
+ " tfidf_userknn_K30_cv-0 | \n",
+ " 0.006439 | \n",
+ " 0.039102 | \n",
+ " 0.007335 | \n",
+ " 8.155051 | \n",
+ " 0.000048 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 0 | \n",
+ " bm25_userknn_K30_cv-0 | \n",
+ " 0.002593 | \n",
+ " 0.013494 | \n",
+ " 0.002531 | \n",
+ " 9.398467 | \n",
+ " 0.000081 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 0 | \n",
+ " cosine_userknn_K40_cv-0 | \n",
+ " 0.003282 | \n",
+ " 0.019323 | \n",
+ " 0.003401 | \n",
+ " 8.561523 | \n",
+ " 0.000043 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 0 | \n",
+ " tfidf_userknn_K40_cv-0 | \n",
+ " 0.006178 | \n",
+ " 0.037458 | \n",
+ " 0.006957 | \n",
+ " 8.300404 | \n",
+ " 0.000052 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 0 | \n",
+ " bm25_userknn_K40_cv-0 | \n",
+ " 0.002241 | \n",
+ " 0.011255 | \n",
+ " 0.002210 | \n",
+ " 9.675533 | \n",
+ " 0.000081 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 1 | \n",
+ " cosine_userknn_K30_cv-0 | \n",
+ " 0.003505 | \n",
+ " 0.020002 | \n",
+ " 0.003580 | \n",
+ " 8.398248 | \n",
+ " 0.000046 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 1 | \n",
+ " tfidf_userknn_K30_cv-0 | \n",
+ " 0.006328 | \n",
+ " 0.036844 | \n",
+ " 0.007022 | \n",
+ " 8.240133 | \n",
+ " 0.000058 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 1 | \n",
+ " bm25_userknn_K30_cv-0 | \n",
+ " 0.002722 | \n",
+ " 0.013856 | \n",
+ " 0.002658 | \n",
+ " 9.484692 | \n",
+ " 0.000088 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 1 | \n",
+ " cosine_userknn_K40_cv-0 | \n",
+ " 0.003245 | \n",
+ " 0.018368 | \n",
+ " 0.003305 | \n",
+ " 8.626906 | \n",
+ " 0.000047 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 1 | \n",
+ " tfidf_userknn_K40_cv-0 | \n",
+ " 0.006150 | \n",
+ " 0.035964 | \n",
+ " 0.006916 | \n",
+ " 8.377988 | \n",
+ " 0.000061 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 1 | \n",
+ " bm25_userknn_K40_cv-0 | \n",
+ " 0.002406 | \n",
+ " 0.012067 | \n",
+ " 0.002393 | \n",
+ " 9.756458 | \n",
+ " 0.000086 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 2 | \n",
+ " cosine_userknn_K30_cv-0 | \n",
+ " 0.003261 | \n",
+ " 0.018498 | \n",
+ " 0.003295 | \n",
+ " 8.439263 | \n",
+ " 0.000047 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 2 | \n",
+ " tfidf_userknn_K30_cv-0 | \n",
+ " 0.005940 | \n",
+ " 0.034233 | \n",
+ " 0.006479 | \n",
+ " 8.262367 | \n",
+ " 0.000059 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 2 | \n",
+ " bm25_userknn_K30_cv-0 | \n",
+ " 0.002720 | \n",
+ " 0.013422 | \n",
+ " 0.002530 | \n",
+ " 9.535631 | \n",
+ " 0.000091 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 2 | \n",
+ " cosine_userknn_K40_cv-0 | \n",
+ " 0.003045 | \n",
+ " 0.017086 | \n",
+ " 0.003100 | \n",
+ " 8.661585 | \n",
+ " 0.000050 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 2 | \n",
+ " tfidf_userknn_K40_cv-0 | \n",
+ " 0.005914 | \n",
+ " 0.034071 | \n",
+ " 0.006439 | \n",
+ " 8.396618 | \n",
+ " 0.000063 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 2 | \n",
+ " bm25_userknn_K40_cv-0 | \n",
+ " 0.002404 | \n",
+ " 0.011638 | \n",
+ " 0.002231 | \n",
+ " 9.799119 | \n",
+ " 0.000090 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 3 | \n",
+ " cosine_userknn_K30_cv-0 | \n",
+ " 0.003277 | \n",
+ " 0.018786 | \n",
+ " 0.003395 | \n",
+ " 8.444986 | \n",
+ " 0.000045 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 3 | \n",
+ " tfidf_userknn_K30_cv-0 | \n",
+ " 0.006023 | \n",
+ " 0.034171 | \n",
+ " 0.006328 | \n",
+ " 8.276503 | \n",
+ " 0.000059 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 3 | \n",
+ " bm25_userknn_K30_cv-0 | \n",
+ " 0.002620 | \n",
+ " 0.012762 | \n",
+ " 0.002497 | \n",
+ " 9.560984 | \n",
+ " 0.000091 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 3 | \n",
+ " cosine_userknn_K40_cv-0 | \n",
+ " 0.003076 | \n",
+ " 0.017512 | \n",
+ " 0.003173 | \n",
+ " 8.658150 | \n",
+ " 0.000045 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 3 | \n",
+ " tfidf_userknn_K40_cv-0 | \n",
+ " 0.005919 | \n",
+ " 0.033368 | \n",
+ " 0.006253 | \n",
+ " 8.399169 | \n",
+ " 0.000062 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 3 | \n",
+ " bm25_userknn_K40_cv-0 | \n",
+ " 0.002337 | \n",
+ " 0.011273 | \n",
+ " 0.002253 | \n",
+ " 9.816325 | \n",
+ " 0.000089 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 4 | \n",
+ " cosine_userknn_K30_cv-0 | \n",
+ " 0.003118 | \n",
+ " 0.018064 | \n",
+ " 0.003157 | \n",
+ " 8.485899 | \n",
+ " 0.000042 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 4 | \n",
+ " tfidf_userknn_K30_cv-0 | \n",
+ " 0.005911 | \n",
+ " 0.033626 | \n",
+ " 0.006396 | \n",
+ " 8.282428 | \n",
+ " 0.000059 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 4 | \n",
+ " bm25_userknn_K30_cv-0 | \n",
+ " 0.002537 | \n",
+ " 0.012368 | \n",
+ " 0.002470 | \n",
+ " 9.599645 | \n",
+ " 0.000086 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 4 | \n",
+ " cosine_userknn_K40_cv-0 | \n",
+ " 0.002872 | \n",
+ " 0.016509 | \n",
+ " 0.002883 | \n",
+ " 8.711984 | \n",
+ " 0.000043 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 4 | \n",
+ " tfidf_userknn_K40_cv-0 | \n",
+ " 0.005793 | \n",
+ " 0.033028 | \n",
+ " 0.006261 | \n",
+ " 8.416680 | \n",
+ " 0.000062 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 4 | \n",
+ " bm25_userknn_K40_cv-0 | \n",
+ " 0.002213 | \n",
+ " 0.010860 | \n",
+ " 0.002179 | \n",
+ " 9.866201 | \n",
+ " 0.000085 | \n",
+ "
\n",
+ " \n",
+ " | 30 | \n",
+ " 5 | \n",
+ " cosine_userknn_K30_cv-0 | \n",
+ " 0.003003 | \n",
+ " 0.016252 | \n",
+ " 0.002899 | \n",
+ " 8.498968 | \n",
+ " 0.000043 | \n",
+ "
\n",
+ " \n",
+ " | 31 | \n",
+ " 5 | \n",
+ " tfidf_userknn_K30_cv-0 | \n",
+ " 0.005527 | \n",
+ " 0.030942 | \n",
+ " 0.005823 | \n",
+ " 8.325273 | \n",
+ " 0.000057 | \n",
+ "
\n",
+ " \n",
+ " | 32 | \n",
+ " 5 | \n",
+ " bm25_userknn_K30_cv-0 | \n",
+ " 0.002597 | \n",
+ " 0.012263 | \n",
+ " 0.002386 | \n",
+ " 9.646957 | \n",
+ " 0.000100 | \n",
+ "
\n",
+ " \n",
+ " | 33 | \n",
+ " 5 | \n",
+ " cosine_userknn_K40_cv-0 | \n",
+ " 0.002765 | \n",
+ " 0.014713 | \n",
+ " 0.002661 | \n",
+ " 8.717559 | \n",
+ " 0.000047 | \n",
+ "
\n",
+ " \n",
+ " | 34 | \n",
+ " 5 | \n",
+ " tfidf_userknn_K40_cv-0 | \n",
+ " 0.005545 | \n",
+ " 0.030892 | \n",
+ " 0.005817 | \n",
+ " 8.454091 | \n",
+ " 0.000059 | \n",
+ "
\n",
+ " \n",
+ " | 35 | \n",
+ " 5 | \n",
+ " bm25_userknn_K40_cv-0 | \n",
+ " 0.002302 | \n",
+ " 0.010777 | \n",
+ " 0.002135 | \n",
+ " 9.914042 | \n",
+ " 0.000100 | \n",
+ "
\n",
+ " \n",
+ " | 36 | \n",
+ " 6 | \n",
+ " cosine_userknn_K30_cv-0 | \n",
+ " 0.002963 | \n",
+ " 0.016532 | \n",
+ " 0.002887 | \n",
+ " 8.563809 | \n",
+ " 0.000050 | \n",
+ "
\n",
+ " \n",
+ " | 37 | \n",
+ " 6 | \n",
+ " tfidf_userknn_K30_cv-0 | \n",
+ " 0.005330 | \n",
+ " 0.030717 | \n",
+ " 0.005763 | \n",
+ " 8.366259 | \n",
+ " 0.000064 | \n",
+ "
\n",
+ " \n",
+ " | 38 | \n",
+ " 6 | \n",
+ " bm25_userknn_K30_cv-0 | \n",
+ " 0.002571 | \n",
+ " 0.012691 | \n",
+ " 0.002478 | \n",
+ " 9.715097 | \n",
+ " 0.000100 | \n",
+ "
\n",
+ " \n",
+ " | 39 | \n",
+ " 6 | \n",
+ " cosine_userknn_K40_cv-0 | \n",
+ " 0.002769 | \n",
+ " 0.015448 | \n",
+ " 0.002675 | \n",
+ " 8.775058 | \n",
+ " 0.000051 | \n",
+ "
\n",
+ " \n",
+ " | 40 | \n",
+ " 6 | \n",
+ " tfidf_userknn_K40_cv-0 | \n",
+ " 0.005284 | \n",
+ " 0.030418 | \n",
+ " 0.005697 | \n",
+ " 8.488473 | \n",
+ " 0.000066 | \n",
+ "
\n",
+ " \n",
+ " | 41 | \n",
+ " 6 | \n",
+ " bm25_userknn_K40_cv-0 | \n",
+ " 0.002340 | \n",
+ " 0.011278 | \n",
+ " 0.002208 | \n",
+ " 9.964664 | \n",
+ " 0.000099 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " fold model prec@10 recall@10 MAP@10 novelty \\\n",
+ "0 0 cosine_userknn_K30_cv-0 0.003557 0.021128 0.003695 8.331491 \n",
+ "1 0 tfidf_userknn_K30_cv-0 0.006439 0.039102 0.007335 8.155051 \n",
+ "2 0 bm25_userknn_K30_cv-0 0.002593 0.013494 0.002531 9.398467 \n",
+ "3 0 cosine_userknn_K40_cv-0 0.003282 0.019323 0.003401 8.561523 \n",
+ "4 0 tfidf_userknn_K40_cv-0 0.006178 0.037458 0.006957 8.300404 \n",
+ "5 0 bm25_userknn_K40_cv-0 0.002241 0.011255 0.002210 9.675533 \n",
+ "6 1 cosine_userknn_K30_cv-0 0.003505 0.020002 0.003580 8.398248 \n",
+ "7 1 tfidf_userknn_K30_cv-0 0.006328 0.036844 0.007022 8.240133 \n",
+ "8 1 bm25_userknn_K30_cv-0 0.002722 0.013856 0.002658 9.484692 \n",
+ "9 1 cosine_userknn_K40_cv-0 0.003245 0.018368 0.003305 8.626906 \n",
+ "10 1 tfidf_userknn_K40_cv-0 0.006150 0.035964 0.006916 8.377988 \n",
+ "11 1 bm25_userknn_K40_cv-0 0.002406 0.012067 0.002393 9.756458 \n",
+ "12 2 cosine_userknn_K30_cv-0 0.003261 0.018498 0.003295 8.439263 \n",
+ "13 2 tfidf_userknn_K30_cv-0 0.005940 0.034233 0.006479 8.262367 \n",
+ "14 2 bm25_userknn_K30_cv-0 0.002720 0.013422 0.002530 9.535631 \n",
+ "15 2 cosine_userknn_K40_cv-0 0.003045 0.017086 0.003100 8.661585 \n",
+ "16 2 tfidf_userknn_K40_cv-0 0.005914 0.034071 0.006439 8.396618 \n",
+ "17 2 bm25_userknn_K40_cv-0 0.002404 0.011638 0.002231 9.799119 \n",
+ "18 3 cosine_userknn_K30_cv-0 0.003277 0.018786 0.003395 8.444986 \n",
+ "19 3 tfidf_userknn_K30_cv-0 0.006023 0.034171 0.006328 8.276503 \n",
+ "20 3 bm25_userknn_K30_cv-0 0.002620 0.012762 0.002497 9.560984 \n",
+ "21 3 cosine_userknn_K40_cv-0 0.003076 0.017512 0.003173 8.658150 \n",
+ "22 3 tfidf_userknn_K40_cv-0 0.005919 0.033368 0.006253 8.399169 \n",
+ "23 3 bm25_userknn_K40_cv-0 0.002337 0.011273 0.002253 9.816325 \n",
+ "24 4 cosine_userknn_K30_cv-0 0.003118 0.018064 0.003157 8.485899 \n",
+ "25 4 tfidf_userknn_K30_cv-0 0.005911 0.033626 0.006396 8.282428 \n",
+ "26 4 bm25_userknn_K30_cv-0 0.002537 0.012368 0.002470 9.599645 \n",
+ "27 4 cosine_userknn_K40_cv-0 0.002872 0.016509 0.002883 8.711984 \n",
+ "28 4 tfidf_userknn_K40_cv-0 0.005793 0.033028 0.006261 8.416680 \n",
+ "29 4 bm25_userknn_K40_cv-0 0.002213 0.010860 0.002179 9.866201 \n",
+ "30 5 cosine_userknn_K30_cv-0 0.003003 0.016252 0.002899 8.498968 \n",
+ "31 5 tfidf_userknn_K30_cv-0 0.005527 0.030942 0.005823 8.325273 \n",
+ "32 5 bm25_userknn_K30_cv-0 0.002597 0.012263 0.002386 9.646957 \n",
+ "33 5 cosine_userknn_K40_cv-0 0.002765 0.014713 0.002661 8.717559 \n",
+ "34 5 tfidf_userknn_K40_cv-0 0.005545 0.030892 0.005817 8.454091 \n",
+ "35 5 bm25_userknn_K40_cv-0 0.002302 0.010777 0.002135 9.914042 \n",
+ "36 6 cosine_userknn_K30_cv-0 0.002963 0.016532 0.002887 8.563809 \n",
+ "37 6 tfidf_userknn_K30_cv-0 0.005330 0.030717 0.005763 8.366259 \n",
+ "38 6 bm25_userknn_K30_cv-0 0.002571 0.012691 0.002478 9.715097 \n",
+ "39 6 cosine_userknn_K40_cv-0 0.002769 0.015448 0.002675 8.775058 \n",
+ "40 6 tfidf_userknn_K40_cv-0 0.005284 0.030418 0.005697 8.488473 \n",
+ "41 6 bm25_userknn_K40_cv-0 0.002340 0.011278 0.002208 9.964664 \n",
+ "\n",
+ " serendipity \n",
+ "0 0.000040 \n",
+ "1 0.000048 \n",
+ "2 0.000081 \n",
+ "3 0.000043 \n",
+ "4 0.000052 \n",
+ "5 0.000081 \n",
+ "6 0.000046 \n",
+ "7 0.000058 \n",
+ "8 0.000088 \n",
+ "9 0.000047 \n",
+ "10 0.000061 \n",
+ "11 0.000086 \n",
+ "12 0.000047 \n",
+ "13 0.000059 \n",
+ "14 0.000091 \n",
+ "15 0.000050 \n",
+ "16 0.000063 \n",
+ "17 0.000090 \n",
+ "18 0.000045 \n",
+ "19 0.000059 \n",
+ "20 0.000091 \n",
+ "21 0.000045 \n",
+ "22 0.000062 \n",
+ "23 0.000089 \n",
+ "24 0.000042 \n",
+ "25 0.000059 \n",
+ "26 0.000086 \n",
+ "27 0.000043 \n",
+ "28 0.000062 \n",
+ "29 0.000085 \n",
+ "30 0.000043 \n",
+ "31 0.000057 \n",
+ "32 0.000100 \n",
+ "33 0.000047 \n",
+ "34 0.000059 \n",
+ "35 0.000100 \n",
+ "36 0.000050 \n",
+ "37 0.000064 \n",
+ "38 0.000100 \n",
+ "39 0.000051 \n",
+ "40 0.000066 \n",
+ "41 0.000099 "
+ ]
+ },
+ "execution_count": 46,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_metrics = pd.DataFrame(results)\n",
+ "df_metrics"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "id": "a0334b9a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_metrics.to_pickle(\"../data/hw_3/df_metrics.pickle\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "id": "446530ce",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " fold | \n",
+ " prec@10 | \n",
+ " recall@10 | \n",
+ " MAP@10 | \n",
+ " novelty | \n",
+ " serendipity | \n",
+ "
\n",
+ " \n",
+ " | model | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | bm25_userknn_K30_cv-0 | \n",
+ " 3.0 | \n",
+ " 0.002623 | \n",
+ " 0.012980 | \n",
+ " 0.002507 | \n",
+ " 9.563068 | \n",
+ " 0.000091 | \n",
+ "
\n",
+ " \n",
+ " | bm25_userknn_K40_cv-0 | \n",
+ " 3.0 | \n",
+ " 0.002320 | \n",
+ " 0.011307 | \n",
+ " 0.002230 | \n",
+ " 9.827477 | \n",
+ " 0.000090 | \n",
+ "
\n",
+ " \n",
+ " | cosine_userknn_K30_cv-0 | \n",
+ " 3.0 | \n",
+ " 0.003241 | \n",
+ " 0.018466 | \n",
+ " 0.003272 | \n",
+ " 8.451809 | \n",
+ " 0.000045 | \n",
+ "
\n",
+ " \n",
+ " | cosine_userknn_K40_cv-0 | \n",
+ " 3.0 | \n",
+ " 0.003008 | \n",
+ " 0.016994 | \n",
+ " 0.003028 | \n",
+ " 8.673252 | \n",
+ " 0.000047 | \n",
+ "
\n",
+ " \n",
+ " | tfidf_userknn_K30_cv-0 | \n",
+ " 3.0 | \n",
+ " 0.005928 | \n",
+ " 0.034234 | \n",
+ " 0.006449 | \n",
+ " 8.272573 | \n",
+ " 0.000058 | \n",
+ "
\n",
+ " \n",
+ " | tfidf_userknn_K40_cv-0 | \n",
+ " 3.0 | \n",
+ " 0.005826 | \n",
+ " 0.033600 | \n",
+ " 0.006334 | \n",
+ " 8.404775 | \n",
+ " 0.000061 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " fold prec@10 recall@10 MAP@10 novelty \\\n",
+ "model \n",
+ "bm25_userknn_K30_cv-0 3.0 0.002623 0.012980 0.002507 9.563068 \n",
+ "bm25_userknn_K40_cv-0 3.0 0.002320 0.011307 0.002230 9.827477 \n",
+ "cosine_userknn_K30_cv-0 3.0 0.003241 0.018466 0.003272 8.451809 \n",
+ "cosine_userknn_K40_cv-0 3.0 0.003008 0.016994 0.003028 8.673252 \n",
+ "tfidf_userknn_K30_cv-0 3.0 0.005928 0.034234 0.006449 8.272573 \n",
+ "tfidf_userknn_K40_cv-0 3.0 0.005826 0.033600 0.006334 8.404775 \n",
+ "\n",
+ " serendipity \n",
+ "model \n",
+ "bm25_userknn_K30_cv-0 0.000091 \n",
+ "bm25_userknn_K40_cv-0 0.000090 \n",
+ "cosine_userknn_K30_cv-0 0.000045 \n",
+ "cosine_userknn_K40_cv-0 0.000047 \n",
+ "tfidf_userknn_K30_cv-0 0.000058 \n",
+ "tfidf_userknn_K40_cv-0 0.000061 "
+ ]
+ },
+ "execution_count": 48,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_metrics.groupby('model').mean()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "id": "5fb9ba9f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " prec@10 | \n",
+ " recall@10 | \n",
+ " MAP@10 | \n",
+ " novelty | \n",
+ " serendipity | \n",
+ "
\n",
+ " \n",
+ " | model | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | bm25_userknn_K30_cv-0 | \n",
+ " 0.000072 | \n",
+ " 0.000612 | \n",
+ " 0.000083 | \n",
+ " 0.104468 | \n",
+ " 0.000007 | \n",
+ "
\n",
+ " \n",
+ " | bm25_userknn_K40_cv-0 | \n",
+ " 0.000074 | \n",
+ " 0.000442 | \n",
+ " 0.000081 | \n",
+ " 0.097359 | \n",
+ " 0.000007 | \n",
+ "
\n",
+ " \n",
+ " | cosine_userknn_K30_cv-0 | \n",
+ " 0.000231 | \n",
+ " 0.001749 | \n",
+ " 0.000314 | \n",
+ " 0.074699 | \n",
+ " 0.000003 | \n",
+ "
\n",
+ " \n",
+ " | cosine_userknn_K40_cv-0 | \n",
+ " 0.000213 | \n",
+ " 0.001603 | \n",
+ " 0.000295 | \n",
+ " 0.069310 | \n",
+ " 0.000003 | \n",
+ "
\n",
+ " \n",
+ " | tfidf_userknn_K30_cv-0 | \n",
+ " 0.000398 | \n",
+ " 0.003003 | \n",
+ " 0.000577 | \n",
+ " 0.066627 | \n",
+ " 0.000005 | \n",
+ "
\n",
+ " \n",
+ " | tfidf_userknn_K40_cv-0 | \n",
+ " 0.000321 | \n",
+ " 0.002534 | \n",
+ " 0.000487 | \n",
+ " 0.059565 | \n",
+ " 0.000004 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " prec@10 recall@10 MAP@10 novelty serendipity\n",
+ "model \n",
+ "bm25_userknn_K30_cv-0 0.000072 0.000612 0.000083 0.104468 0.000007\n",
+ "bm25_userknn_K40_cv-0 0.000074 0.000442 0.000081 0.097359 0.000007\n",
+ "cosine_userknn_K30_cv-0 0.000231 0.001749 0.000314 0.074699 0.000003\n",
+ "cosine_userknn_K40_cv-0 0.000213 0.001603 0.000295 0.069310 0.000003\n",
+ "tfidf_userknn_K30_cv-0 0.000398 0.003003 0.000577 0.066627 0.000005\n",
+ "tfidf_userknn_K40_cv-0 0.000321 0.002534 0.000487 0.059565 0.000004"
+ ]
+ },
+ "execution_count": 49,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_metrics.groupby('model').std()[metrics.keys()]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "41828ee5",
+ "metadata": {},
+ "source": [
+ "по **ofline** метрикам лучше всего себя показывает модель TFIDFRecommender\n",
+ "TFIDFRecommender подбор К"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7a8a0a41",
+ "metadata": {},
+ "source": [
+ "# Подбор оптимального K для TFIDFRecommender"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "1e91892d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'tfidf_userknn_K50': ,\n",
+ " 'tfidf_userknn_K60': ,\n",
+ " 'tfidf_userknn_K70': }"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "N_USERS = 50\n",
+ "\n",
+ "# Т.к. метрики для К 30 и 40 уже есть\n",
+ "K = [k for k in range(50, 71, 10)]\n",
+ "models = dict()\n",
+ "\n",
+ "for k in K:\n",
+ " models[f\"tfidf_userknn_K{k}\"] = TFIDFRecommender(K=k)\n",
+ "models"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e7c2c43b",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "==================== Fold 0\n",
+ "{'End date': Timestamp('2021-07-18 00:00:00', freq='5D'),\n",
+ " 'Start date': Timestamp('2021-07-13 00:00:00', freq='5D'),\n",
+ " 'Test': 156580,\n",
+ " 'Test items': 5793,\n",
+ " 'Test users': 68150,\n",
+ " 'Train': 3281612,\n",
+ " 'Train items': 14754,\n",
+ " 'Train users': 652905}\n"
+ ]
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "211234f034a54bae86b94dff33b9f5c4",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ " 0%| | 0/652905 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "%%time\n",
+ "\n",
+ "results_idf = []\n",
+ "\n",
+ "fold_iterator = cv_v1.split(Interactions(interactions), collect_fold_stats=True)\n",
+ "\n",
+ "for i_fold, (train_ids, test_ids, fold_info) in enumerate(fold_iterator):\n",
+ " print(f\"\\n==================== Fold {i_fold}\")\n",
+ " pprint(fold_info)\n",
+ "\n",
+ " df_train = interactions.iloc[train_ids].copy()\n",
+ " df_test = interactions.iloc[test_ids][Columns.UserItem].copy()\n",
+ "\n",
+ " catalog = df_train[Columns.Item].unique()\n",
+ "\n",
+ " for model_name, model in models.items():\n",
+ " userknn_model = UserKnn(model=model, N_users=N_USERS)\n",
+ " userknn_model.fit(df_train)\n",
+ " recos = userknn_model.predict(df_test)\n",
+ "\n",
+ " metric_values = calc_metrics(\n",
+ " metrics,\n",
+ " reco=recos,\n",
+ " interactions=df_test,\n",
+ " prev_interactions=df_train,\n",
+ " catalog=catalog,\n",
+ " )\n",
+ "\n",
+ " full_model_name = f\"{model_name}\"\n",
+ " fold = {\"fold\": i_fold, \"model\": full_model_name}\n",
+ " fold.update(metric_values)\n",
+ " results_idf.append(fold)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "37a896aa",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_metrics_tfidf = pd.DataFrame(results_idf)\n",
+ "df_metrics_tfidf"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "073517d2",
+ "metadata": {},
+ "source": [
+ "# Train TFIDFRecommender on all data"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "13ca7a8b",
+ "metadata": {},
+ "source": [
+ "Обучение TFIDFRecommender на всём объеме данных"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "278879e0",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "cc8fbbecd80145dea10421894ede12e0",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ " 0%| | 0/962179 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "CPU times: user 2h 27min 37s, sys: 25.2 s, total: 2h 28min 2s\n",
+ "Wall time: 26min 59s\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%time\n",
+ "\n",
+ "results = []\n",
+ "\n",
+ "df_train = interactions.copy()\n",
+ "catalog = df_train[Columns.Item].unique()\n",
+ "\n",
+ "tfidf_model = TFIDFRecommender(K=30)\n",
+ "userknn_model = UserKnn(model=tfidf_model, N_users=50, use_weight_idf=True)\n",
+ "userknn_model.fit(df_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "49f8bf89",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import dill\n",
+ "\n",
+ "with open('../service/weights/userKNN/userknn_tfidf_k30.dill', 'wb') as f:\n",
+ " dill.dump(userknn_model.user_knn, f)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "fd4b5830",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "user_id 176549\n",
+ "item_id 9506\n",
+ "datetime 2021-05-11 00:00:00\n",
+ "weight 4250\n",
+ "watched_pct 72.0\n",
+ "Name: 0, dtype: object"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_train.iloc[0]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "id": "9408bc58",
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "False"
+ ]
+ },
+ "execution_count": 38,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "555555555 in df_train[Columns.User].tolist()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "f614ccaf",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " user_id | \n",
+ " item_id | \n",
+ " last_watch_dt | \n",
+ " total_dur | \n",
+ " watched_pct | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 176549 | \n",
+ " 9506 | \n",
+ " 2021-05-11 | \n",
+ " 4250 | \n",
+ " 72.0 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 699317 | \n",
+ " 1659 | \n",
+ " 2021-05-29 | \n",
+ " 8317 | \n",
+ " 100.0 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 656683 | \n",
+ " 7107 | \n",
+ " 2021-05-09 | \n",
+ " 10 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 864613 | \n",
+ " 7638 | \n",
+ " 2021-07-05 | \n",
+ " 14483 | \n",
+ " 100.0 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 964868 | \n",
+ " 9506 | \n",
+ " 2021-04-30 | \n",
+ " 6725 | \n",
+ " 100.0 | \n",
+ "
\n",
+ " \n",
+ " | 5476246 | \n",
+ " 648596 | \n",
+ " 12225 | \n",
+ " 2021-08-13 | \n",
+ " 76 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 5476247 | \n",
+ " 546862 | \n",
+ " 9673 | \n",
+ " 2021-04-13 | \n",
+ " 2308 | \n",
+ " 49.0 | \n",
+ "
\n",
+ " \n",
+ " | 5476248 | \n",
+ " 697262 | \n",
+ " 15297 | \n",
+ " 2021-08-20 | \n",
+ " 18307 | \n",
+ " 63.0 | \n",
+ "
\n",
+ " \n",
+ " | 5476249 | \n",
+ " 384202 | \n",
+ " 16197 | \n",
+ " 2021-04-19 | \n",
+ " 6203 | \n",
+ " 100.0 | \n",
+ "
\n",
+ " \n",
+ " | 5476250 | \n",
+ " 319709 | \n",
+ " 4436 | \n",
+ " 2021-08-15 | \n",
+ " 3921 | \n",
+ " 45.0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " user_id item_id last_watch_dt total_dur watched_pct\n",
+ "0 176549 9506 2021-05-11 4250 72.0\n",
+ "1 699317 1659 2021-05-29 8317 100.0\n",
+ "2 656683 7107 2021-05-09 10 0.0\n",
+ "3 864613 7638 2021-07-05 14483 100.0\n",
+ "4 964868 9506 2021-04-30 6725 100.0\n",
+ "5476246 648596 12225 2021-08-13 76 0.0\n",
+ "5476247 546862 9673 2021-04-13 2308 49.0\n",
+ "5476248 697262 15297 2021-08-20 18307 63.0\n",
+ "5476249 384202 16197 2021-04-19 6203 100.0\n",
+ "5476250 319709 4436 2021-08-15 3921 45.0"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pd.concat([interactions.head(), interactions.tail()])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "id": "dc4d9fd7",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(962179,)"
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "interactions['user_id'].unique().shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "id": "b7861d19",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[(961833, 1.0),\n",
+ " (961849, 1.0),\n",
+ " (961857, 1.0),\n",
+ " (961871, 1.0),\n",
+ " (961873, 1.0),\n",
+ " (961876, 1.0),\n",
+ " (961887, 1.0),\n",
+ " (961907, 1.0),\n",
+ " (961910, 1.0),\n",
+ " (961912, 1.0)]"
+ ]
+ },
+ "execution_count": 35,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import dill\n",
+ "\n",
+ "with open('../service/weights/userKNN/userknn_tfidf_k30.dill', 'rb') as f:\n",
+ " userknn = dill.load(f)\n",
+ "\n",
+ "userknn.similar_items(962178, 10)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1905033a",
+ "metadata": {},
+ "source": [
+ "# Popular Model"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "id": "2df74dba",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from rectools.models import PopularModel\n",
+ "from rectools.dataset import Dataset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "6ba37a73",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Timestamp('2021-08-22 00:00:00')"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "max_date = interactions[Columns.Datetime].max().normalize()\n",
+ "max_date"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "901353f9",
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "train = interactions[[Columns.User, Columns.Item, Columns.Weight, Columns.Datetime]][\n",
+ " interactions[Columns.Datetime] < max_date - pd.Timedelta(5, \"D\")]\n",
+ "\n",
+ "test = interactions[[Columns.User, Columns.Item, Columns.Weight, Columns.Datetime]][\n",
+ " interactions[Columns.Datetime] >= max_date - pd.Timedelta(5, \"D\")]\n",
+ "\n",
+ "dataset_train = Dataset.construct(train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 144,
+ "id": "f08e3579",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "popilarity_models = {\n",
+ " \"popular\": PopularModel(),\n",
+ " \"popular_mw\": PopularModel(popularity=\"mean_weight\")\n",
+ "}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 145,
+ "id": "03c3bfb6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "popilarity_models[\"popular\"].fit(dataset_train)\n",
+ "popilarity_models[\"popular_mw\"].fit(dataset_train);"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 146,
+ "id": "0d7de49e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 24, 20, 31, 15, 167, 81, 89, 135, 355, 116])"
+ ]
+ },
+ "execution_count": 146,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "popilarity_models[\"popular\"].popularity_list[0][:10]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 147,
+ "id": "05ff208d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([11363, 11681, 12841, 13017, 2069, 13691, 13552, 13397, 11774,\n",
+ " 12913])"
+ ]
+ },
+ "execution_count": 147,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "popilarity_models[\"popular_mw\"].popularity_list[0][:10]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 148,
+ "id": "00ef735c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "pecos_pop = popilarity_models[\"popular\"].recommend(\n",
+ " users=test[Columns.User].unique(),\n",
+ " dataset=dataset,\n",
+ " k=100,\n",
+ " filter_viewed=False,\n",
+ ")\n",
+ "\n",
+ "pecos_pop_mw = popilarity_models[\"popular_mw\"].recommend(\n",
+ " users=test[Columns.User].unique(),\n",
+ " dataset=dataset,\n",
+ " k=100,\n",
+ " filter_viewed=False,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 152,
+ "id": "b302db55",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "metrics = {\n",
+ " \"prec@5\": Precision(k=5),\n",
+ " \"recall@5\": Recall(k=5),\n",
+ " \"MAP@5\": MAP(k=5),\n",
+ " \"prec@10\": Precision(k=10),\n",
+ " \"recall@10\": Recall(k=10),\n",
+ " \"MAP@20\": MAP(k=20),\n",
+ " \"prec@20\": Precision(k=20),\n",
+ " \"recall@20\": Recall(k=20),\n",
+ " \"MAP@100\": MAP(k=100),\n",
+ " \"prec@100\": Precision(k=100),\n",
+ " \"recall@100\": Recall(k=100),\n",
+ " \"MAP@100\": MAP(k=100),\n",
+ " \"novelty\": MeanInvUserFreq(k=10),\n",
+ " \"serendipity\": Serendipity(k=10),\n",
+ "}\n",
+ "catalog = train[Columns.Item].unique()\n",
+ "metric_values_pop = calc_metrics(metrics, pecos_pop, test, train, catalog)\n",
+ "metric_values_pop_mean_weight = calc_metrics(metrics, pecos_pop_mw, test, train, catalog)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 153,
+ "id": "9631093b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'prec@5': 0.0017855613317256697,\n",
+ " 'recall@5': 0.004623809755660008,\n",
+ " 'prec@10': 0.0011648975773029461,\n",
+ " 'recall@10': 0.005682095875283048,\n",
+ " 'prec@20': 0.0010502526799891945,\n",
+ " 'recall@20': 0.00880186008464912,\n",
+ " 'prec@100': 0.003247020220987923,\n",
+ " 'recall@100': 0.16609031082955295,\n",
+ " 'MAP@5': 0.0013179725619140792,\n",
+ " 'MAP@20': 0.0016695313583723814,\n",
+ " 'MAP@100': 0.005578924867474493,\n",
+ " 'novelty': 9.976033936531364,\n",
+ " 'serendipity': 1.2752762676592953e-05}"
+ ]
+ },
+ "execution_count": 153,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "metric_values_pop"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 154,
+ "id": "5d55b781",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'prec@5': 9.09252633867684e-05,\n",
+ " 'recall@5': 0.00014799438063171262,\n",
+ " 'prec@10': 4.612151041357817e-05,\n",
+ " 'recall@10': 0.00015458316783365238,\n",
+ " 'prec@20': 2.635514880775895e-05,\n",
+ " 'recall@20': 0.00016946607539568094,\n",
+ " 'prec@100': 0.00015147621777259455,\n",
+ " 'recall@100': 0.0065476971391510656,\n",
+ " 'MAP@5': 3.0257754846536496e-05,\n",
+ " 'MAP@20': 3.1771198360212185e-05,\n",
+ " 'MAP@100': 0.00011355765992119742,\n",
+ " 'novelty': 17.423655787689828,\n",
+ " 'serendipity': 1.8991632826477633e-06}"
+ ]
+ },
+ "execution_count": 154,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "metric_values_pop_mean_weight"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e5a4a011",
+ "metadata": {},
+ "source": [
+ "**На офлайн метриках выигрывает обычная модель по популярному**"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5875fab7",
+ "metadata": {},
+ "source": [
+ "# Save item_idf data"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6589996f",
+ "metadata": {},
+ "source": [
+ "Создаем датасет со взвешенными item-ами по механизму idf для использования в будущем"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "d62cabb9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " index | \n",
+ " idf | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 9506 | \n",
+ " 7.150811 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 1659 | \n",
+ " 8.524953 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 7107 | \n",
+ " 5.821207 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 7638 | \n",
+ " 8.407093 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 6686 | \n",
+ " 7.778734 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 15701 | \n",
+ " 7833 | \n",
+ " 14.822785 | \n",
+ "
\n",
+ " \n",
+ " | 15702 | \n",
+ " 9125 | \n",
+ " 14.822785 | \n",
+ "
\n",
+ " \n",
+ " | 15703 | \n",
+ " 10064 | \n",
+ " 14.822785 | \n",
+ "
\n",
+ " \n",
+ " | 15704 | \n",
+ " 13019 | \n",
+ " 14.822785 | \n",
+ "
\n",
+ " \n",
+ " | 15705 | \n",
+ " 10542 | \n",
+ " 14.822785 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
15706 rows × 2 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " index idf\n",
+ "0 9506 7.150811\n",
+ "1 1659 8.524953\n",
+ "2 7107 5.821207\n",
+ "3 7638 8.407093\n",
+ "4 6686 7.778734\n",
+ "... ... ...\n",
+ "15701 7833 14.822785\n",
+ "15702 9125 14.822785\n",
+ "15703 10064 14.822785\n",
+ "15704 13019 14.822785\n",
+ "15705 10542 14.822785\n",
+ "\n",
+ "[15706 rows x 2 columns]"
+ ]
+ },
+ "execution_count": 40,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "item_cnt = Counter(interactions['item_id'].values)\n",
+ "item_idf = pd.DataFrame.from_dict(item_cnt, orient='index', columns=['doc_freq']).reset_index()\n",
+ "n = interactions.shape[0]\n",
+ "item_idf['idf'] = item_idf['doc_freq'].apply(lambda x: np.log((1 + n) / (1 + x) + 1))\n",
+ "del item_idf['doc_freq']\n",
+ "item_idf"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "id": "7da47dfc",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "item_idf = item_idf.sort_values(\"idf\", ascending=False)\n",
+ "item_idf.to_csv('../data/kion_train/items_idf.csv', index=False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "fdce2b60",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.10"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/hw_2.ipynb b/hw_2.ipynb
new file mode 100644
index 00000000..b4d81fa6
--- /dev/null
+++ b/hw_2.ipynb
@@ -0,0 +1,440 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "\n",
+ "from pprint import pprint\n",
+ "\n",
+ "import copy\n",
+ "\n",
+ "from tqdm.auto import tqdm\n",
+ "\n",
+ "from implicit.nearest_neighbours import TFIDFRecommender, BM25Recommender\n",
+ "from implicit.als import AlternatingLeastSquares\n",
+ "\n",
+ "\n",
+ "from rectools import Columns\n",
+ "from rectools.dataset import Interactions, Dataset\n",
+ "from rectools.metrics import Precision, Recall, MeanInvUserFreq, Serendipity, calc_metrics, MAP, MRR\n",
+ "from rectools.models import ImplicitItemKNNWrapperModel, RandomModel, PopularModel\n",
+ "from rectools.model_selection import TimeRangeSplitter"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 123,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = pd.read_csv('data_original/interactions.csv', parse_dates=['last_watch_dt'])\n",
+ "\n",
+ "df.rename(\n",
+ " columns={\n",
+ " 'last_watch_dt': Columns.Datetime,\n",
+ " 'total_dur': Columns.Weight\n",
+ " }, \n",
+ " inplace=True) \n",
+ "\n",
+ "interactions = Interactions(df)\n",
+ "\n",
+ "\n",
+ "users = pd.read_csv('data_original/users.csv')\n",
+ "items = pd.read_csv('data_original/items.csv')\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 124,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " user_id | \n",
+ " age | \n",
+ " income | \n",
+ " sex | \n",
+ " kids_flg | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 373089 | \n",
+ " 666262 | \n",
+ " age_65_inf | \n",
+ " income_20_40 | \n",
+ " Ж | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " user_id age income sex kids_flg\n",
+ "373089 666262 age_65_inf income_20_40 Ж 0"
+ ]
+ },
+ "execution_count": 124,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "users[users['user_id'] == 666262]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Функция для расчета метрик"
+ ]
+ },
+ {
+ "attachments": {
+ "image.png": {
+ "image/png": "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AQQQQAABBBCInQCBBLGzpWcEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQSSnACBBEnuknHCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIxE6AQILY2dIzAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACSU6AQIIkd8k4YQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBGInQCBB7GzpGQEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgSQnQCBBkrtknDACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAKxEyCQIHa29IwAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggECSEyCQIMldMk4YAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQACB2AkQSBA7W3pGAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAgyQkQSJDkLhknjAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQOwECGD6lGMAAEAASURBVCSInS09I4AAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggkOQECCRIcpeME0YAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCB2AgQSxM6WnhFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEhyAgQSJLlLxgkjkDCBtGnTSokSJeT2YsXkg9Gj5c8//0xYh+yNAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAALJSuCiDSS47PLLJVPGjNbF/Ouvv2T//v1J6sLmyZNHKlWubJ3z4cOHZeKECUnq/DnZ2AqkTJlSChUuLKVLl5Frcl8jmTJlksyZs0jOnDkl59U55X//+591Ag/Uqydr166N7cnQOwIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIJCmBiy6QIEWKFNKqdWvp3KWLpEmTxrpYv/z8s1SpVClJXbhGjRtLr969rXP+559/5OabbkpS58/JxkZA7+9OnTtLo0aNJWu2rHEehECCOIlogAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggMBFJ3BRBRJcniOHvNL/VSlTtoznQm/fvl0qVazoqbtQV1KlSiW5TTaCZs2aS+OmTZzTrF2zpvz6669y4MABp46Fi0tAA2Ne7t9fqteoEdUX/3r11/J4x8dk7969UbWnEQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIXBwCF00gQYUKFaXvKy9L9uzZQ67shR5IoAEQ99eqJdWr15ACBQpI6jSpQ76DXXH0yFH55JNlMnP6DPn000/kxIkT9iY+k7GABpi8P2KklC5T2vMt9+7ZK6tXr5JNGzfKkSNHZN++/bJz5w7Re/7QwYOetqwggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACKpDsAwl0LvinnnlGmjRtGvaKX6iBBDrPfbPmLeSJrl2cOe3DfomADZs2bpInu3aVjRs3BGylKjkJ1K1XX/q+3M/5Sl9+8YX0MPf9jh07nDoWEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgWgEkn0gweNPPCHtO3RwLE6dOi3D3h0qGTJkMIP0za36CzGQIHXq1DJ02DApd+edzrmfz8K///4rXZ/oIvPnzT2f3dkniQgsWLRI8l57rXW269aukxbNHpSjR48mkbPnNBFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBA4EISSPaBBF27PSkPPdzWMt+ze490M2/369vamqWgVevWVv2FGEjwwosvSsNGjTz3yoYf1suyZUtl1VerpOCNBeXJp5+2tv/zzz9SrXIVKVa8mBQvXkKqVK0il2TO7Ox7/Pjf0viBBvLDDz9YdQWuv17KlClrLZ8+fUo+/OADOXXqlNPev5AzZ06pXKWqUz1h/Dg5fvy4pEmTxjrHVKlSy+nTp2XSxIly7Fjw4LWm3n+gYSNJmzat1c+0aVM9qfVvu/12ueWWIta2TZs2yucrVzrHcy9UrVpNrrzqKqdq2tQpcujQIWs92j60cdmyZeW6Atdb+61d842sXbvWWrb/iU9ftxQpIrfddru165Ejf8nkSZPsbgI/r7jiCil8882SK9c1kiJFipA23367Tr75+uuQ+nAVGkCggQRaDhuLihUqWLZ6ffLkyWN5qdGvv/4q+/ftC+wmse4Ju/PKVapIzpxX26txfi5cuEB+3bUrYruSpUqZ61ZOrsl9jWTOnMX6LjpNw/z5862pG9w7azYPvd80I0l8iv4eztzHx+LczX3/x9nY1eDEiX9l/LhxcvLkSae26G23SZEit1rrP/64SVauWCH6m7n3vvukcOGb5dp818qpk6dMhontZqqK1bJo4cKwv1n3eUXzu2zUuLGkTp3GOvaK5Z/JTz/95JxXfH4Hek8XK1bc2vfnn7fKJ8uWOf0k5jm5+9ID/PXXXzJlcuTfnHMiZuGu8uXl2mvzWVXqo/vqtB/+ovdO8RIl5HrzvLz+hhvkiiuutPw3rF8v682zeMOG9aLPXndJjPvO/f3iun7uY8dnObGuq/uY5+Pl3j/Ssvt8g9rpPbB92y+y3lwbXXaXvHnzSnkztZFd9O+/XrugcuWVV0rVavc6m3SaoJ+3bnXW7YXMWbJIjRo61dD11vM1jZluSP//xfbt22TO7NlRZYKJxTPSPj8+EUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBIDIGLJpBgyeLF8sxTT8mBAwcstws5kEAH+UeMHuW5vrNnzbKmKbAHH3Xwr1fv3lYbHcy6+aabnPY66DVq9Ady6WWXOnU//fijVL/3zABJi5at5Jke3Z1tTUzAwupVq5x1/0LHTp3kkccec6rvMQPVmjL/6ly5ZIlrsLBWjZphB2gym8CGVd984/TxYJMm8tWXXzrrL/fvL7Xr1LHWF3/8sXRo187ZZi+4v7PW/WYGxhvUqyd79+61mkTTh93X8JEjpWy5ctbqhPHjpedzz9mb4tWXfq/Zc+fJFVdeYe2ng7033nAmQMHToVlp1769NVWF+7r42+j6R9OmydNPPhm0KbCu6YMPynM9e1rbJowbLx+Ye6dLt25SwQyepUyV0rPPj5s2WYEjUyZP9gxEJ9Y9YR9sggmm0MHxaIv+NqdNnRrY/LrrrpMBAwfJjYXO3eP+hjpordN42L9vzTiy5ttv/c2iWtffif5e4ir++z+u9u7tZUxQhDuoo0/fflKvQX2rybKly+TtwW9Jv5dfNsEuBdy7Ocu//PyzPN6xU+DvzX9ekX6XbR56SLoZe7u88dpr8s7bb9urEp/fVI9nn5VmLVpY+6766itpap5RdknMc/L3pceoW7u2fP/dd/bhwn5mzJhRPvnsM0+gVdC+N99yi7zS/1XJf13+sH1pYFebNq091zEx7jv/94t0/cKeXBwbEuu62oc5Xy97/7g+3ecbqe3BAwflzTdelzEffug08/893fbLL1LDBOj8/fffTht7Ydj771uBJvZ6m1at5LNPP7VXRQNFHu/8hDRv2VLSpQsOUjKxKbJwwQIztczTcvjwYWdf/0JiPSM1gKeG+du7bds2mTH9o8CgGP+xWUcAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAIBqBZB9IULHi3dYbg+PGjvF4XMiBBEPefVcq3n23c7460P2CGSh2Zw1wD6r7Awl0x2vz5ZPRH3zoDHBrXdNGjWXVqq/k8hw55NPPljuDzJqR4KWzQQnazl/mzl/gDKitXbNGHqh/ZsAzPgNeCQ0k0DezB772uhnIOfMG//59+6VJo4byixkUsot7sClcMILdNrECCfq9/IrUqVfX7tZ6a9wfSKDTVLz4Uh9PO2eHgIX4BhL0eqG3NGpyZtB26uQpVkCGP4DAf5ilS5ZKl86PO4NOiXVP2MeZt2Ch5Mufz16N8zNcIEHRokXlveHDPQO/4TrTwfUmZvBaB+gTY0A33HHsev/9b9dH8xkpkGCzyQhw6WWXSbZs2SJ29ZcZpGxpBu6/XbfO085/XuEGovUZMcMEKLmzNvx/BxJEc07+76dfft7cuSawoqPHIWilpRkYfrr7uSAqbeMPJKhmAkkG6bPGF4QT1N+unbukVYvmznMoMe47//cLd/2Czifauvg8KyMFiOjxEuJ1PucbzT4aVDRj+nSnqfsZqZXvDhkqgwYOcLbrgn6P199806mbMmmy9Oj+jLOuGULeGfquyW5Q3qmLtPDz1p/lwaZNZN/ZQDd/28R4RhYqVEimzZjhdL108RJpdzYDk1PJAgIIIIAAAggggAACCCCAAAIIIIAAAggggAAC5ymQ7AMJwrlcqIEEmjL5y1WrnQHzDes3SK2aNUK+RlyBBLqDpoIf7XozU1O2P9ejh9WXDs7eeddd1vLePXvlrnJlPYEK1gbzTwHzRvTsefPsVevNfQ1s0BKfAa+EBBJo5oB3h70nqU36aC0H/jxg3nZu5EnBrvXxGRxLjECCcnfeKe+PGKGHdkpQRoI2bdtKN1eGAZ1qYtbMGbJ1yxYzFcSZFPqt2rSR3LlzW/3EN5BgxKjRUqZsGecc3AtHjxyVo0ePymWXX+autpYXzJsvHR971KlPjHvC7uxzk20i+6VnMmJooMqWzZvtTc6nnVFDK4ICCdKnzyBzzbQFOa/O6eyjWSg+M2+Ua9CAvolbunQZyZotq7Pd/k46ZUQt85a6e5BcGzU00x3YmQ20r6FDhjj76oIG6+gAZNDbyp6GZsV//48aMVI0pX9Q0SwhTZo2dTZFCiRwGpmFnTt2iqZX12kpdNqAUuY3nS59OqfJls1bpGb1++TEiRNOnf+8ggai9c3qcRMmhGSN+P8MJIj2nPzfT7+4/u4q33N3xJTyGtCz2GSu0PT17uIOJNBzmG+mjchj0uHbRaeS+frr1VaK+0vNPf1Aw4ae7ZoFpOfzZzKaJMZ95/9+QdfPPrfz/YzPszJSIEFCvaI9f/f56lREw997z9n16qtzSaXKla3pP+zK3bt3y11m+hq76LNkxqyZznU7eeKk1K51vzMliv590oF9+zmpvzv9XbmnvNCMMp27dLG7NM+K0/LD99/LihXL5Zh5xpa4o6Q1vZD7mRNpYD8xnpE6vVFr87fDLnpOxYre6jlvexufCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgjEV4BAAiOmAxOVKlaMr11M2vvfMHyhZy/xZ1PQA0cTSKCDWovMG4o6p7wWnRu62dnBzPuqV5dBr79u1es/4aY3eMykT3+045lpDTTzgQ6AHjp40NovPgNe5xtIoG+kjzKZFezBU30Lu5lJ5a8DOP7iHmyKdUaCTJkyyRwzyO0flAwKJBhlBtJLlS5tne4ff/wh9cwUDrt27vSc/jtDh8rd99xj1cU3kMCdMcLuVKfyGGb6/Nak99fpMPRaVapUWTSAxs7qoG0fMYNjHy9aZO2WGPeEffwfNmx0Aj8eMNNPrF271t7kfH5tsltkuuQSaz0okODxzp2l/SOPOO31/m1l3sB3D5pfddVVMnnqNJNl43KnXUOTMWON6TuovPDii9LQTOWhZbkJSGhtUpSfb4nP/X/rrbfKxClTnENFE0gQlCkkh8kmMn3mLM+0Jb2ef17Gjxvn9B3NefmnsrB3/v8MJIj2nPzfzz73sWPGSO9evezVkE+dOkWfEf7iDiTQTDCaEcYuE02wxfNmygZ30YCEcRMmSpFbi1jVGsxxb9Uq7iYhy/G57/zf70IOJIiVlx8wmmf7wEGDpHrNms6uJYsXlz///NNZ19/g+ImTnEwT3337nZkap64VPNT7pZesABFtrIPxzczUO5q9xy4aQLLMPC/Spk1rV8lj5tmkUxi4i2bUmGKmptG/D3bRZ4w+a/wlMZ6RdevVl74v93O6/nXXr3K3yZjgzl7kbGQBAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIF4ChBIYMAupECCeypVkrddb0mHGxSNJpBA74W3zHznlaucGeRyf099a3KlGZi1B3KDBi11/znmrfXrClyni2K/7W2tmH/iM+B1PoEEBa6/XsaNnyCZs2S2Dnns6DFp1bKFfPP11/YpeD6jGWyyd0hoRoKX+vaV+g0a2N05n/5AAnVe9c03zpvx/fr0lVEjvVkMdOeEBBIsM3N4X5Xz3Fv768yg/YNmICzorfrmZiC+u2tg9NNPPpGHWre2zj8x7gntSOeh/8aVbr+KCZD45ZdfrGO4/4krkGDx0mWS65pc1i5bt2w1U2rUk0OHDrm7sJYLFS5sBggnOsajR46Svn1eCmmnFfEZ0A3swFUZn/s/voEEeo/rNXQHTdiHLlGihBVckyp1Kqvqi88/l+YmuMYucZ1XXvO2/YzZcwLneP//CiSIzzn5v5/9vY8fOy7l7yznGTy2t2lQ1Wwz/cF1JsOKv7gDCXTA+K7y5a0mGoAz20z9oJ/+4n9OlzLXRIOEwpX43Hf+79fQPGc2rF9vda33Q9A9Ee644erj86yMlJEgVl7+847mfOvVbyB9+vV1dq1orqM/YMsfnNTXTDnz/fffyVjzd8bcIlYZ/v770v/ll51+dMH991bXh5kpDgYOeFUXQ4reG4PfGeL0FxQYlljPyHTp0lnBMaVKlZbDJsjuFRNUsMhk1KAggAACCCCAAAIIIIAAAggggAACCCCAAAIIIJAYAgQSGEX3AHtioCakD/9bs9WrVQtJ4a/9uwc2NFPAzTfdFHjYfq+8InXq1rW26duZ+pamXV7s00caPPCAtRo0vcF1111nvXVvt2/f9mFZsmSxvRrTQAId4JkwaZLzprl+x7YmhfPnK1c6x/cvRDPYZO+TkECCMmXKyojRo+yuZOb0GVLTpMnW4g8k0DdUNVW6XTp36iRz58yxV53PhAQSfLFqlWTLls3q68S/J6RcmdIRBzXdx9L2dxQvJn/99Ze1f0LvCe0k59VXy1IToGCXEsWKycEDB+xV5zNSIIFOBTDL5dTXvDE8etQoZ1//whiTXr54iTP39uafNst91ar6m1jr8RnQDezAVekf8I305nh8Awnq3H+//PDDD66jeRc1m4hmkNCiadpvN+nM7WkyIp2XpqL/cOw4KwW77vv9d9+ZwI9MTlr4/49Agviek//76fewy1tvvCmD3zo3z71dX75CBXnXlQ7frtdPdyCBuz7Scv78+WWu62306vfeKz/9+GPYXeJz30X6fqdPi+zZs9ua2mO+CfKaNHFCYKBD2BM5uyE+z8pIgQRxHcfeHl8vez/7M5rzfXPw21LlbGaIcFkiNJvE5KlT5aZChayuNfhEB+DtjCabf/pJapvfnv69cZehZmqdChUrWFU63UHx226L6K5TCunUQlr8f3e1LjGekdqPXTRQRstpvUEoCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggkkgCBBAbyQgokKFuunOggt11aNGsWOHgebSCBe957HejSAS+73G4GeHWedLv4pzd49LGO8linjtZmfdu2rBkYcb+d6x/wmjp5imzbts3uzvOpqZ7btnvYqdO3rb/68ktn3T1QpNdDS+7cua3PE2aw+9EOHWTp0iXWerh/3H3EamoDfZN0zrx5TgaA2TNnmjdAF8kbg9+yTssfSKBzc68x0wvYb7tO/+gjeapbt5Cv4B7cD3qDNWQHV8Vak6I7fYb0Vs2mjZusub1dm0MW/Snk769eQzZu3GC1S+g9oZ3cZIJaPjIuWjRNeKGCNwSm2o4USKDTPKiJXfTN8NWrVturIZ/P9+zppCzX6S9uN1NiBJX4DOgG7e+u89//iRVIoIEBRW4uLP/++6/7cJ7ltg+3ky7dujp1OjWL/buJdF7NmjeXHs89Z+2n/dc2qeBff/NN5039SIEEu3/7zUyzcm4KBefgZxc0sOEGc621rPrqK2nauPHZLZGzl8T3nPzfb9qUqVLHpKjXooO25c0z9Pjx486xdcEdaOJur9siBRLo710zXmTPll0uyXyJaGaVS8x0HIVvvlnK3Xmn7m6V/yqQwD6e/fnjpk3SoV072bFjh10V1af7WZmQ6+o/WGJ5+ft1n68GCr3+2iCriQahZM+e3Rq0r1K1mvOcfcME2rwzeLC/G2tdgxr0+aQZWNxF/87Ur1tH1p/N/uDeNtNk8LDvbc340sBM1xKpdO/xrDQ32XPsUsTcQ+57MjGekXbffCKAAAIIIIAAAggggAACCCCAAAIIIIAAAgggECsBAgmM7IUUSOB/czNcCuVoAgnSp08vy80b/Pb0BZ8sW2a91e++mRYtWeIM2PunN9ABczsV+AfmbfA+5q1wd/EP6Lm3xbUcKZDAv2+3Ll1k5owZ/uqQdfdgU6wCCdwD0b/v/92aG71kyVJhAwn0JKdNn24NRtonPGrESHl36BBP1oCEBBJ8aQbYs2bLanU/wxzrya7nBpjtY7o/9U1ZfWPWLv45vBNyT2if7v4P/HnAynhgH8v9GSmQwH1/u/eJdlkzdPjfKtZ93ddP5y3X736+xX//J1Yggb4VfZ/JRBKpVKhQUYa+N8xpounv15gpNLSEOy8NzJk1Z66kS5/Oave6mVN+yDvvWIEx9u88UiCBtVOU/0QbSHA+5+T/fo0bNpQhJtV8lqxZrLN7oWcvE/AwxjlTdzaI48f/lkYN6juBLtooKJBA7786detJYTMAnDJVSqevcAuxDCTYvXu3/PnHn2aQPIVcfvnlculll3pOY93addLogQaeIC9Pg4AV97MyYHPYKv91tRsmtpfdr/0Zn/OdMmmyvNCrZ+Dv3+7PP8WL1tu/B7uN+/NzE/SW3Ux7oWWyyZTzbPfu7s0hy/5pFu4uX0F27jwX7JEYz8iQg1KBAAIIIIAAAggggAACCCCAAAIIIIAAAggggEAiCxBIYEAvpECCtGnTig5a2IP/9mD1AV9qePdAa7ipDfyDJUOHDJHXBg703ELurAPu6Q38AQ1Bqdb9A3qejuNYiU8ggU4d0K1rlzh6FGuuaJ0aQkssAgl08GfUBx86b70+9sgjstCkN69q3oQNl5FAz+WOkiXl/REjRK+tu+gg+7FjR62qq3LmdDbFNyPBwo8/ljx581r7Dzfp2/ub6SwiFf+UFR0ffVQWzJ/v7JKQe0I7cXv88vPPUsXMGR5UIgUStGrdWp565pmg3aKqK3rLLXL06Blb9w5JIZDg69VfS+OGZ6YccZ+7e7moSa2uU3/YxZ25xP+71AAHzTjx4dixZvqHEtYu6820CfXMb0UzjLgDhv7LQILzPaeg71e5SmXpYO5jLTu27zD33D3OwPpgEyxRqXJla9u4MWOtIJ5Pli+31vUfdyBBhgwZpE+/fnLvffc526NZiGUggT9AJV++/OYc+8ptt9/unJoObOsAd7QlPgPz7j79gQSx8nIfU5fjc76alWXQwAGybOlSfzfOek7zvF366afOui64f0OeDWblm3XrzBQgGa3qaJ6xlatUkbfeftvp5r6qVWXz5s3OemI8I53OWEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAIEYCBBIY2AspkECvs6Ye13TfdtE3lJubKQ7279tnV0lcgQT1zRvKvV/qIylTnpk7WVPMa/pz91uR2lmuXNfIx2bAxU69b09v8Mhjj0nHTp2s44V7Q9o/oPfeu8Nky5ZzgyXOyZoFTQne/dlnnapIgQQ6v7WW/Nfld9qHy8zgNDAL7sGmxA4k6PrEEzJ77jzztvfV1iHnzpkjnc/6uAeF/FMb2OeX99prpfeLL1pBBXZduM/4BhJMMqndi9xaxOpu0cKF1jQQ4frW+op33y1D3n3XaeK/Fgm5J7TThx5+WLqenb5B35LXt+WDSqRAgjp160o/V0DEgFdflT2/7Q7q5kyduc01A8exo8fk73/+tgI8guYLTwqBBH/8/ruUuuOO8N/VbNGAGb3f7eIebPb/LnXbbbffJs/36mU1P2FSuNepXUs2bdxorUcbSLDtl1+sDAb2Mf2fDRs1klvPTinhH3BOzHMK6mvPnt1mYPgzSZfuTLr6xzt2lHlz54r+7uYtWGg9B/W3Wfmeu60pI8IFEugzT599dlGr5SboYPNPP8revXvl4MGDcujQIclmpjro+3I/u5k1ZYxOHROuxOe+C/p+Gzas93SdJWtWmW+CmOy35CdNnCjP9ejhaRNpxf2sTMh1jZWX/9zd57tv7z7RZ6QWzdKg0+Zck/saKVWqtKRKncqq1+C6Vs1byKpVX1nr7n90n+EjR0mZsmXc1bJr5y6pcd+9cuTIEU+9rixeukxyXZPLqv940SJ5pH37kDbuCvczUOtLm9/z7+Z3bRf39vN9Rtp98YkAAggggAACCCCAAAIIIIAAAggggAACCCCAQKwECCQwshdaIEFe83b5TDNQ7Z7Defu2bdLSDIzYgQDhAgl0kKR1mzbS7amnPPeMDqrp4FpQcc8fbk9vMNu0L3D99VbzV82A5fvDhoXsGs2Al72TBhKsOpt6Xev8g9fugSINAuhrgiAmT53iDJTpPr2e7ynjx43VxcDi70PnDg9Xho8cKWXNXOpaJowfLz3Pzhtvt/f3penFmzRtam3+448/5F7zxqnOx64lmkACbZc6dWpZ/c0aSZ8hva5axU6/785WEN9AggEDB0mN+2ta/el9UskECkQq7Tt0kMdNYIRdqlWuIlu3ngnesOvO957Q/QeZ+cnvq17d6irSd4kUSKDzz2sWB7u0N8EJSxYvtlfP+zM+A7pxHSQ+9787vb72W8Zkt3AHBvXp20/qmZT7dvEPPNr19qdma9CsDXYpW7q07DMD3Vr85/Woud79Xx0gGTJmsLa/9cabMvitN61l/SfaQIK4gnN6mEChZi1aWP3GFUiQkHPyfz87iOKF3i9Kw8aNrON//913VqaBF/v0kQYPnMnuYD8Dr7zySgkXSDB56jS5pcgtVh+//fqrNDFTHOzaudNad/+jWUY+GHNu+oT/MiOBfR7u3/3aNWvkgfrn7h+7TbhP//Mt0rMy0nWNlZf/vKM532vz5ZPxJqAiW7Zs1u7uYC93f42bNJWeL/RyVznL4QIyJk6e7ATJRPOMfXXAQKlZ636rXw1gKXRjQTl16pRznMR4RjqdsYAAAggggAACCCCAAAIIIIAAAggggAACCCCAQIwECCQwsBdaIIFe6xo1a8oAM4e5u2hWgR83bbLesixQoIA1F729vV+fvlLijhJSrFhxZ65we9vWLVulQb26cvjwYbvK8+mez1mnN2jVornMnjfPaqPHvMu8ualv4/pLuAE9fztdj28ggQ5s6eDraJOK3H7LWAdkHn2kgzVtQdAxohlssveLTyDBX8YtY6ZLnKwNnR7rKPPnzbW7ijqQoHOXLtLO9SbrgnnzpeNjZ9KxvzN0qNx9zz1Wn5EG352Duhbq1qvvvB2t16ta5Uryi3l7PKhooMmHY8eZFPfFrc369m3J4sVD5hM/33tCO52/cJFcm+9aq3/NJPCeK/uBVXn2n0iBBJfnyCGfrVjpmI8YPlxeMSnnE1qSSiCBvl2ug5pBJU2aNDJt+nS5/oYbrM06/UmZUiXFzsDg/10eOnhIMmfJbLXduGGjGWCvJSdOnHC6/v8IJEjIOfm/nx1IkCdPHpm/6GMnC0uXzp2trBZ2kE6dWrXkh++/l3CBBJdccol89fU3zv4v9e4tGlgVVJ40gVqtH3rI2fT/EUgw0Px9qG7+TmjRqSpq339m4No5qQgL8XlWhgskiKWX/9SjPd9+L78i/8feWYBZVbRx/JVFUkIlFGlUQEpSSlIp6Q6lRURSQAmlVJDubpDuBlFpVFJASrqU9JPOxW/eWWaYO3v73mV38T/Ps3vmzJkzZ+Z35px7n/v+532ris86TuxhoESxog5N8RxZunwFxYkbR5YvX7aM7t29p8/hwg+FQGfjhg0O53Xv0ZPqvl9PlvE7lkMV2OIrdQKHe1gpQsWocDXO7k0w3pHqetiCAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAQEQRgJBAkPVGSBASEiJdwrOr7BXLl9Of585F1D3R7TYQq3vZswAbDv1NHC+6ZYuP5RhdtcGuobf88qs22G8VBtyChQrK6ls2babGjRo6PdWVQc9ZZX+EBNwOr/YfMny4NijfuXOXGgiDzm+//RbuMt4am/hEX4QE5oVM478q98YjQT7h2nrq9O+0kZI9HFQQcdivCVfpnAIREqR45RX6af0GzejokaNSOOLMRXdbYVz9+JNPVNdp2ZKl1KH9Y+8E6oC/c4Ljt68ULteFXkGm+sKLw6+//KKaddi6ExJwRV5drOLAs4jkEzGPnXkl4Gdz6vTplC1b2Eryn3/+mZo3e2zkNS8aXYQEd27foZo1quvwA+YYOESB8o7B5fPmzqUvunTRVeznUh0IfRAqV+nbbvIjQ0gQSJ/s8SkhAbc5bPgIKl22jGpeb3/eupUaivAwnFwJCXjOb2chQUgMWW+QWFU+dsxomTf/sccYFuMkS55MFz9pIcGLL74ojNVrKPHziWUffBUf+fKudCUkiEheGuyjjLf9NQ30/NlXsfx7uil+T8ycPVt7FmAxSxkhugoNDRUClLXakwGL6d4rV1a/m7kB2wMFh9+pXrUK3bp1S7evMkPF51WZsmXVLtnzKJjvSL4Iv//Lic8S9pTAXkN4PEggAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgEAwCEBIIit4ICczVn7wisbwwVh075ugOPhg3xG6DVx33FCtjlUHVPu5qn+OszxFGk5EjRsiY4K7qqXJzfKqMtx0/bU9Lly4xi3TenUFPV3qU8VdIwKc3bdaMOn72mW6SQwrUFm687VX33hqbuCF/hAR8XV6Jasa65rY8CQk4nvlSIT5hAyYnnj8N63/gYGAPREjAbfYbMIAqiRXXKm3etEne+z1CcMGGpZQpU1FZEf+7fYeO2sj/779EdWrVJI7R7Sz5Oic4dMPY8eN1yAiOGc8GVlfJk5CgrDh3yLDHLvhZRNKzeze5Wvjy5cuy2VdffZW6ftlNC1+40DbcmdePLkIC7jO/l9gLw9YtW6TBkg3YFcWq809atdJD4rlUo1pVYlf+KtnPpSofJd4FQ0XYCTtFppDAnz7Z4zOFBNmyZ6f5CxfaQ6QmQpS1efNmWe5KSMAHTRf2LMTpJN47mzZupNu3b8vQJPlFSIMBgwdro7O60JMUErzxxhvUS4R+yZY9m7o8dRaCs4ULFuh9Txlf3pWuhAR8jYjiZfffU38zZMggvfiYIinbi0mzj5pT+44ddNMsvmERDqfKVapQX+E9RSVbYMUihIWLl1AmEaJAJfZaMFZ4kuH3J79j+bOaw2h88EiwwvVu3LghPMSU0h59gv2OZFHCCuH9IEaMMOUWe1hgTxxIIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIBAMAhASCIqehATsqphXqsZ8NqZmPnb0GBo0cIDej+gMe0KoUKEiZcmSRa5AzJgpzK25uu7ff/9N+/buJV55u1X8cQgE5epc1XG3Lfz229K4btZhQ1ohYThjI5qz5M6gZ9cPREjAbZmxznmf7xmLCUyjvmls4jonT5zgjdPEPM2k6n7ati3tF27C7ba4Lh9jbxR28iQkGDFqFL0rjEkqjR87jgb076d25TZQIUGKFClkOIr48eM7tHvr5i16NtazTr1aTJs6lb756iuH+uaOL3Pi6969qUiRopT8peRmE17fA+7nxYsXZIiFGtWq0Z07d2Q7o0VYhBIlSzq0yTssKrh18wa9IFZmm4nnRVVhbHcVxiM6CQnUuO7fv+/0/vHx2bNmUfcvv1RV5dZ+LrmQ3wfs2p/bslNkCQn87ZM9PlNIwGP7biaH7sinh8nhHCpVKK/33QkJWoqwJa3atNZ1OXP37l252jtV6jTaa4tDBbETkUICfrcrzyVJkiYl9gRgpr179kpBkBmuwjzuLG++33gVO4eScZXcCQkiipfdF7O/fEy9rzkfL158B+8QXMYiqfr16tK2bdt4lzJmykQLFi3Sz9GO7Tvo/bp1HD4j2atJ/gIFZH3+10p4bvleeFdRiQUc8xcuopCYIapIbnl+xIoVWwu0zIOmWCEi3pEsDGvW/CN9yQf3H1CeXLnEZ3Z4Twm6EjIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIg4CUBCAkEKE9CAl6NuEG4+E+aLKnG+lXPnvSdMDxEVqpTty71EJ4KON27d4+yCSNHIInHuH7jJgeDDK9w5ZWurpIng555XqBCAu7f+ImTqFDhQrrZfXv30QfCWKSEDraxSVf0IdO0cWO5Atlu6wfh+vqTjz922pI7IUGt2rXF6uGv9Xkco71m9eoOMer5YKBCAm4ja7ZsNHHSZO3unMtcJfZW0Uu4yHdnfPRlTphhCFxd09vyvMIQdu3aNVmdRTyDBg+h4iVLeDz9zOkzVF+Evfjzzz9d1o0OQgJeAf9AhCEoXqK4y3HwgbXffy/FLfz8m8l+LjmkQQ0RN57nnrMUGUKCQPpkj88WEhQtVozGTZigh9rh009p2dKlet+dkCBuXDHfhgx2Kl7RDYjM6JEjHUKERKSQwLyuned3YOtWLX0OtWO+3wIREkQUL3ucZn/tY/Y+i4w+79iRVq9aKQ9xaCAWAChvAiymqfheeTp+3NGjEHv8WLpiBcWOHVuexwIO9kDDW5VYXDVUeEl5LkECVeR0y55C+vf9ltgrgkoR8Y7kECcc6kSly5cuUxHxGYnwBooItiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAoEQ+M8KCVq3aaNdhNuxlJ0BrSaMv5936ky84vs34S7+ow+bSrfFzuo+ibJgCwm4zz17fUW1xSpNldzFt+c6SZMlo41CYMExxXkFKMebNleKqnZ4ywbhX3fsECs3Y8ni6lWrSg8Kqk73Hj2prjACc1oujH7thfHPTrwSl11pv/raa/rQAOGOerxYtc7JbENX8DGjhARmW1f/uUrlRCiLy5cuOW2tSNGiQuQQZjBiV9a533xT1nvmmWdo4+YtWpzBce8rVazglJEZRmDmdzOoZ4/uTq/lqZA9EzRq0oSqV69B8eLHC1d926+/EnsiYCO0N8nbORERRjLVvxgxYlCVqtWky/DMb2RWxXp7/q+/pMGOxRHKk4E+aGU6de4i+DSWpbzamFcd+5t8mf+8IprDW3DiVcMFC+Snq//8oy/9Te8+VL1mDbm/ft16sUL8I+kmnVd8J0maRNfjzLmz52jihPHSG4Ezg6HZL64/ZvRoGjxwIGedpnkLFlL2HNnlsT7f9KYpkyfpeuZz4Oq5VJXbtW9PzR+JbTasX0/NmjZVhxzeFVwYSJ/M8Tl77/Bz16JlS4obJ64QZNyn4cLwa3J64YUXaPPWn+XKcj6fw9QcPXpU95XnWxvhHr58+QqUMlVKXc6Zg/sPUF9hID5x/Dit27BRvvvYaFz6nZJSkOZQ2djxZd6Z4zOakFkWYJw5c5pOnDhJa1avosVilb0vnmdUe8G6r9xeRPBS/VRbs7+qzNzyO/rAgf3i7wCtEO792auMSiXfeUcKtdT+yOHDadjQoWrXYcvzpo3wPKOS+fmiylKlSkWNmzSlSlUqy+8Dqpy3D0Mf0g8/rKXJkybRrp07zUMUEe9I/j4ydvwEypkzpwx/8q0IhbJg/jyH62IHBEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABPwl8J8VEvgDLE6cONJocutW5LsNZmNYTrFymxOHIPjl55/9GZLDOWyQKFa8mCz7S6zqLi4M5P4YqRwajQY7W3/5lV5MEuYiXwkJokG33XaRV+GyqOCll1+WHhtCHzygc+fO0T+G8dptA48OejsnTCNZR2FQXrpkiTfNyzq2twrTI4HdyIsilMHLYlw8L9lgfPrUKe29wK4bnfZtIQELlVTiFfQ87tji/XP+/Hli4cTDhw/VYWwjkAC/Z5MlS05x48WlUydPOqxOj8DLRtum/0u81DuWhR8sYLor/vgd6+r7QUS+I1mox+8ET0KqaDux0HEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAIFIIQAhQaRgj3oXTZc+Pa1cvUYIJZ6RnRs6ZAiNGjEi6nU0Anr0NAoJgoHJlzkRkUayYIwlqrfhTkgQ1fuO/oEACHgmgHekZ0aoAQIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgELUIQEgQte7HE+8Nu0Zm1/yt27Sl9BnSy+vfvXuXSoiyy5cvP/H+RMYFISRwpO7PnICRzJGhr3sQEvhKDPVBIHoRwDsyet0v9BYEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQIAIQoL/8CxYJNzPZ34ji3AR7whh9MiRNGTwYMfCp3gPQoLHN9ffOQEj2WOG/uQgJPCHGs4BgehDAO/I6HOv0FMQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAIEwAhAS/IdnwroNGynFKykcCMyeNYt69ehBoaGhDuVP806lypVlDHoe4+JFi/7TcdD9nRMlSpSktOnSMkJavWoV/fnnnzLvzb+QkBCqU7cuxYoVi+7du0ezZs78T80/ZgQhgTczBXVAIPoSwDsy+t479BwEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAE/qsEICT4r955Me7vZs6iBAkS0L8PH9KRI0do8+ZNtGTx4v8wEQwdcyJy5kDZcuVkiBG++u5du2junDmR0xFcFQRAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAAQEAQgJMA1AAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAAQ0AQgJNApkQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEICTAHAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABENAEICTQKJABARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARCAkABzAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAQBOAkECjQAYEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQABCAswBEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABTQBCAo0CGRAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAAQgJMAdAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAAQ0AQgJNApkQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEICTAHAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABENAEICTQKJABARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARCAkABzAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAQBOAkECjQAYEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQABCAswBEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABTQBCAo0CGRAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAAQgJMAdAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAAQ0AQgJNApkQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEICSIJnMgfvz4lDRpUtnb0NBQOnPmTMA9j4g2VadCQkLo7SJFKH369JQyVSpKkiQp3bh+nS5evECHDh6i9evX0Z07d1R1bEEABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABKIIAQgJosiNcNeN/AUKUL/+Ayj5S8l1tZLFitPZs/6LCSKiTe5c7Nix6YP69eXfSy+/rPtrZ27fuk2TJ02k4cOG0cOHD+3D2AcBEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEIgkAhASRBJ4by4bM2ZMatvuU2ry4YcUI8YzDqeUKlmSTp065VDmzU5EtKmumyhxYho9ZizlzpNbFXncbli/ntq3a0fXhbcCJBAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAgcgnACFB5N8Dpz1IkyYNDRw8hLJlz+b0uD9CgohoU3UuYcKENGfefEqfIb0qkttrV6/R7t276MqVK5Q6dRrKkiULxY0X16HOqZMn6aNmzejE8eMO5dgBARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARB48gQgJHjyzD1esWq1avRlt+4UL348l3V9FRJERJtm53p+9RXVrlNHFz24/4CGDR1K302fRjdv3tTlMWLEoMpVqlD3Hj0pTtw4uvzg/gNUtUplhDnQRJABARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAgcghACFB5HB3edXcefLQzNmzHY5v3rSJlixaTP0HDdTlvggJIqJN3RGRyZkzJ82aO4+eeRR94d69e9Tqk09o/bp1ZjWH/GuvvUZjxo2nlKlS6vJOn31GixYu1PvIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIPHkCEBI8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IJrcz/jx41PSpEllb0NDQ+nMmTMB9TwkJIQKv/025cyVi1566SWKFzceXbp8iU6dPEmrVq2iSxcvBtS+s5P5mm8XKULp06enlKlSUZIkSenG9et08eIFOnTwEK1fv47u3Lnj7FSUgQAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIPCECEBI8IdCBXCZ/gQLUr/8ASv5Sct1MyWLF6exZ/8QELB4YPmIkJU0WJkzQjT7KPAx9SGPHjqEhgwbZh/zajx07Nn1Qv778e+nll122cfvWbZo8aSINHzaMHj586LIeDoAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACEQcAQgJIo5twC3HjBmT2rb7lJp8+CHFiPGMQ3ulSpakU6dOOZR5s8MeAUaMHEVx4sbxWH3h/AX0RdcuxB4Q/E2JEiem0WPGUu48ub1uYsP69dS+XTu6LrwVIIEACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACDxZAhASPFneXl8tTZo0NHDwEMqWPZvTc/wREhQvXoJGjBpFMZ+Nqdv84/Bh2rVzF927d5dyvJlTXC+7g2hh4YIF1Pnzz3V9XzIJEyakOfPmU/oM6R1Ou3b1Gu3evYuuXLlCqVOnoSxZslDceHEd6nCIhY+aNaMTx487lGMHBEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAgYglASBCxfP1qvWq1avRlt+4UL348l+f7KiR45plnaMWq1ZTh1Qy6zX7ffksTJ0zQ+5ypVLkyfduvvxYTPHz4L71booRfYRR6fvUV1a5TR7f/4P4DGjZ0KH03fRrdvHlTl8eIEYMqV6lC3Xv0dPCUcHD/AapapTLCHGhSyIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIBAxBOAkCDiGft0hdx58tDM2bMdztm8aRMtWbSY+g8aqMt9FRJkyZqVFi5erM+fOH489evbV++bmU9ataLWbdrooi6dOtOC+fP0vjeZnDlz0qy580joF2S6d+8etfrkE1q/bp3L01977TUaM248pUyVUtfp9NlntGjhQr2PDAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiA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AAIgAAIgENkJQEgQ2e8g+g8CTABCAjwG3hJInjw5vVe0qKp+lOOB/7Rypbenot4TQgAGySfkRqAbIOADAby3PsBCVRAAARAAARAAARAAARAAARAAARAAARAAARAAgSeCAIQET8RtQCdAIDACJd9/n/IXKKAa+X3bNvphxozAGsTZIAACTyyBkJCY1OmLzhQ1alSi+0T9+n5DFy9efGL7i46BAAgQ4b3FUwACIAACIAACIAACIAACIAACIAACIAACIAACIBDZCEBIENnuGPoLAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAhFIAEKCCISLpkEABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAgshGAkCCy3TH0FwRAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAAQikACEBBEIF02DAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAQGQjACFBZLtj6C8IgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIRCABCAkiEC6aBgEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAIHIRgBCgsh2x9BfEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEIhAAhASRCBcNA0CIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACkY0AhASR7Y6hvyAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAQgQQgJIhAuGgaBEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABCIbAQgJItsdQ39BAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAIAIJQEgQgXDRNAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAhENgIQEkS2O4b+ggAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgEAEEoCQIALhomkQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQiGwEICSIbHcM/QUBEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEACBCCQAIUEEwkXTIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIBDZCEBIENnuGPoLAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAhFIAEKCCISLpkEABEAABJ5NAu/mz0/f9O2rBr961Wrq2KG9C4iChQpR9x49KHr06LR27Vpq/9lnLscj+07MmDHplVfiqWFcvnyJrl696jKkNGnSUK7cuenndevor7/+cjmGHRAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAgcdPAEKCx38PvOpBrFixKEGCBKru3bt36fjx416d56mSGHrSp3+b3s7wNsXk9vft3Uu7d+2iU6dOeTrNq2PPPfccvfbaa6runTt36cQJ7/sbJUoUSp48uXUdGauMGQkEQAAEIguB3Hny0PiJE1V37/x3h/LkzkWXL12yuj946FAqUbKk2l8wbz61a9vGOuZvRubdTJkykVw7UaL/UdxX4tK/t/+l8xfO06GDB+mnlSvpktEHf6/jzXk9vvqKqlarpqqu+uknavzxx9ZpRd57j74bMULt379PVOfDWvTbr79ax5EBARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARB4/AQgJHj89yDcHsiqzW/69qNE/0tk1S1SsJBPxnnrRM7kzJWLvujShVKlTkNRojxnHlL5f/75h2bO+IEGDuhP9+7dC3PcmwK5xsTJk62q77Jh69y5c9a+p0z9Bg3o8w4drCpNmzShFcuXW/vIgAAIgMCTTiBGjBi0eds25XFA+jpx/Hjq+fXXdJ8t55kyZVbzY4yQGGoYHdu3p9mzZgU0pPTp09MgFieYIix7g/fu3qNx48ZSf/aUENHirK979qJKVSqrLqxZvYY+bviR1Z0hQ7+l4iVLWPszf/iBOnfsaO0jAwIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIg8PgJQEjw+O+B2x5EixaNWrZqTQ0aNgxj8C9WpAgdPXrU7bnuDlSvUVOJCKJGi+quilW+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AAIgAAIgAAIg4CUBCAm8BIVqIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIPAsEICQ4Fm4yxgjCIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACHhJAEICL0GhGgiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAg8CwQgJHgW7jLGCAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAJeEoCQwEtQqAYCIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACzwIBCAmehbuMMYIACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACICAlwQgJPASFKqBAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAwLNAAEKCZ+EuY4wgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIg4CUBCAm8BIVqIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIPAsEICQ4Fm4yxgjCIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACHhJAEICL0GhGgiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAg8CwQgJHgW7jLGCAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAJeEoCQwEtQqAYCIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACzwIBCAmehbuMMYIACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACICAlwQgJPASFKqBAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAwLNAAEKCZ+EuY4wgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIg4CUBCAm8BIVqIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAAC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CdzlidxAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAIEoTgJAgSl8+FB4EQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAE3CUAIYG7PJEbCIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACERpAhASROnLh8KDAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAgLsEICRwlydyAwEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAIEoTQBCgih9+VB4EAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEHCXAIQE7vJEbiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAQpQlASBClLx8KDwIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAALuEoCQwF2eyA0EQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEojQBCAmi9OVD4UEABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEDAXQIQErjLE7mBAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAQJQmACFBlL58KDwIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIuEsAQgJ3eSI3EAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEIjSBCAkiNKXD4UHARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAAXcJQEjgLk/kBgIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAJRmgCEBFH68qHwIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIOAuAQgJ3OWJ3EAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAgShOAkCBKXz4UHgRAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAATcJQAhgbs8kRsIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIRGkCEBJE6cuHwoMACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACICAuwQgJHCXJ3IDARCIIgRix45NuXPnphw5c9LkSZPozz//jCIlRzFBAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAIGIJRBshQcyYMalAwYL0Zo4clDx5cooTJw6dP3+eDh86RIsWLaJrV69GLOkAcn/iiScoTZo09FzSpBQ3blw6eeKE7dF/XrlCV8UfAgiAgD2BGDFi0KuvvUb58uWnVKlT0dNPP03PPJOQUqRIQSleTEFPPfWUPPDdatVox44d9pkgFgRAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAASiGYFoISR49dVXaeSYMVJAYHd9//nnH+rWpSvNmvmD3e5HHvdWnjw0eepUR+e9eeMmrV69iqZMnkxbt2xxdAwSgcDjToDFOK0//phq1apNiRIn8ltdCAn8IkICEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEACBaETgsRcSZH/zTRr37bf0dIIEfi9r/379aNzYsX7TRXSCfPnz0wRhaj2QcO/uPWrX9hNauGBBIIchLQg8dgSefPJJ6iue5XLlyzuq29YtW6lNq5bSQomjA5AIBEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABB5zAo+1kCB79uxiQH4yxY0X17qMvx08KGbub6V79+9Rjhw5KVPmTNY+XunetSt959AagMeBLm7YCQluXL9hnSFmrJiWSXYrUqywmKB9u7a0YP58PRrrIBBtCLALk3HjJ1C+/Pk86nz+3HnasmUzHTxwgK5fv04XLlykU6dO0gnhNiQyuTXxKDQ2QAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQOA/IvBYCwlYRKAPKA4bMpSGDxvqgbqNMH/e/KOPrLhzZ89R0cKF6O7du1bco14xhQSlihen48ePexTjuaRJKUOGDPThRy0oV+5c1j4W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/dPcuZQ5y6v0RJgRAusko0aMoMFff21tYwUEQMCeAIQE9lwQCwIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAJRhQCEBFHlSqGcIGBDoGKlSpQkSRK5Z85PP9Hly5dtUiEqUAKr1qylFC+m8DhsxvTp1L1rV7p7965HPDZAAATCE0iUKBFVqVpV7jh37hwtXLAgfCIfMVmzZaOcOXPKFFu2bKFdO3f6SP1odqG9fTSccRYQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAIHIQQBCgshxHVAKEACBSERg6rTplCBBArp/7x4dOnSI1q9fR3PnzIlEJURRQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQCDiCEBIEHFskTMIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIRDkCEBJEuUuGAoMACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIBAxBGAkCDi2CJnEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEIhyBCAkiHKXDAUGARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAgYgjACFBxLFFziAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAQ5QhASBDlLhkKDAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIRRwBCgohji5xBAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAIMoRgJAgyl0yFBgEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEIo4AhAQRxxY5gwAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgECUIwAhQZS7ZCgwCIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACEQcAQgJIo4tcgYBEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEACBKEcAQoIod8lQYBAAARAAARAAARAAARAA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18amT3YSi3Znn3OOOeXUU80BBxxgdimxi/lm0zfm888+MzNnzjTfbNyYLIuMzp940knmhBNONAcffLA58KADbR5fffmVWb9+vVm1cqV59913MsoXF+21116mUuXK5pRTTjF77rmX2WXXXcz++5ey99pn331svvNff920bd0643vohYqAIpAbBNq0bWtu6d7dZj5zxgxzQ8eOubnRPzxXbSf/4RVAH18RcBDoSos3V7Zvb48uWbzEXN6sqZNCf/5TEMDc4A2qA3uU3MP89edfpl7dOuaD1av/KY+vz6kIFCkEsMB+0EF5BNvff/89JWIPxnglS5YMnmPTpk3m559/Dn4X5g7m5KPHjrW33PK/LaZypTMTiGr3Dx1qLqpZ056f9uxzpmuXzoVZPL2XIqAIKAKKgCKgCCgCioAioAgoAopAGggokSANsLZV0jMrVSJG/yBT6oBSQRGqV6lq1q3LjEwA8sDQBx8y++2fR0wIMs3fgfJwxIjh5r4hQ9xTGf+uW6+euaJlS3PCiSfG5gEywdgxY8yzzzxj/v7779i0fPLoo482/QbcbfPeaad/8eHQrRIJQmHRg4rANkVgXyJJzZ4zx+y222703RtzWYP6ZsXy5du0TDvazbWd3NHeqD6PIuAHARC4QOSCvLVsmWnauLGfjDWX7RKBa6+7znS68UZbdiWWbJevUAu9gyDQtFlz06tPb/s0//vf/8wJ5crFPtmRpUub8RMmWGI9J7xnwADz6COP8M9C3RYvXtwseest63EANx47erTp17evnd+XL3+yGfvkk6Z4ieK2TLd262amTJ5cqOXTmykCioAioAgoAoqAIqAIKAKKgCKgCKSOgBIJUseq0FMWK1bM3HDjTaZtu3bGXSC/sHp18/nnn6ddJrgZfPChh4OJe1wGUydPMbf1uNXAA0Km8p///IcW+QeYWrVrp5UFLJJv6drV/PHHH7HXVahY0QwbPsJaT8UmpJM//fijuf+++8wT+dYRydLreUVAESgcBPrffbep36CBvdkzU6eqe1PPsGs76RlQzU4R2IEQUCLBDvQyPTwKxu0zZ79oDj7kYJvbjZ06aUgwD7hqFopAughc3qKFuf2OO+xlIPmXO/aYyCz2239/M2HipOC7RcJZ5GEQ3+9ff/0VeV2uT9za4zbTsnWr4DbwfPgDhc857vjjKYTKv+3xL0if0ahh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n7WTAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQFwRoCJBXN0ONoYESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEUpYAFQlSlj9rJwESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIG4IkBFgri6HWwMCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACaQsASoSpCx/1k4CJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACcUWAigRxdTvYGBIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARJIWQJUJEhZ/qydBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABOKKABUJ4up2sDEkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkkLIEqEiQsvxZOwmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAnEFQEqEsTV7WBjSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCBlCVCRIGX5s3YSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESiCsCVCSIq9vBxpAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAyhKgIkHK8mftJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJBBXBKhIEFe3g40hARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggZQlQEWClOXP2kmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEggrghQkSCubgcbQwIkQAIkQAIkQAIkoAlcdtllUqxYMbmnSBGZPm2a/Pnnn/oUtyRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAjEkQEWCGML1sugMGTJI5syZnSJPnz4te/fujbr49OnTyx133Cl3FrhT0qvyt33/vWzdskV++eWXqMs2C8iaNaukS5fOjApr36vrDKsyJiIBEiABEiABEkgRAqlSpZI77rxTSpYsJTlz5ZQrrrhCrroqo2TLlk2yZc8ml19+udOuBvXqyddff50ibWSlJEACJEACJEACJEACJEACJEACJEACJEACJEACJHCxEaAiwQVwx4uXKCGDBg+RrNdndVtbsVx52bcvacoE9xYvLt179JA8eW+RVKkuccvUO1jtN+/NufLqsKFy5swZHZ3k7Ruz50iRokWSlD+a60xShcxEAiRAAiRAAiSQLAQuueQSad+xozRq1FgyXZ0pZJ1UJAiJiAlIgARIgARIgARIgARIgARIgARIgARIgARIgARIwDMCVCTwDKX3BaVJk0Y6dOwkLZ94IpHAv3LFirJ79+6IK23UuImjRJA6TeqQedeuWSOdOnSQI0eOhEwbLMHb77wj+fLnD5Yk4LmkXmfAAnmCBEiABEiABEggxQlceuml8sqgQVKjZs2w2vLlF19Kh3Zt5cCBA2GlZyISIAESIAESIAESIAESIAESIAESIAESIAESIAESIIHoCFCRIDp+Mct94403ytBXX5MCBQv4rSMpAvZmzVvICy+96FPe/l9/le+2fifHTxyXvHnzqj9lpSB1KjfNN8qEcH1lSjiasGbdOrlBmSdGOHPmrMhZ9RcgmHUjSVKuM0DRjCYBEiABEiABEogDAqlTp5aJk6dIyVIlfVpz4LcD8sUXnzuulo4ePSoHD/7uWF/as2ePHP7rL5+0PCABEiABEiABEiABEiABEiABEiABEiABEiABEiABEogtASoSxJZvkkqvU7eushrQU9JnSB8wf1IE7O99sNrxPYxC//nnH+nft5/MnvWGTx3FihWTUWPGylUZr3Ljmz76qHzy8cfucaQ7XyplBPg7RujaubMsWbw4YBElS5WSKdOmueeTcp1uZu6QAAmQAAmQAAnEHYG69R6W/q8McNv16SefyEsvvCB79ybNZZNbEHdIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAQ8I0BFAs9QelPQPUWKyKw5c3wKW//hh7J44SIZPGyoGx+pgL3w3XfLnLlz3fydlU/ipW+/7R6bO+XLV5CxE8a7UcOGDJVxY8e4x5HspEqVSrZu+0GUG2QntHriSVm9+oOARVCRICAaniABEiABEiCB/wSBle++KzfdfLNzLd98/Y00e+xROXbs2H/i2ngRJEACJEACJEACJEACJEACJEACJEACJEACJEACJPBfIUBFgji7k8XuvVdmvHHOSsC///4rQwcPlqlTpkiJkiWjWqn//AsvSvOWLZyr/fPPP6V0iRJy6tQpv1efPn162bhpk3tu5owZ8nLv3u5xJDtXXXWVfP7VV26Wxg0bypdffOEe2ztJUSQoUrSolClTVrJnzybXXnedHD78t/z6yy+yUdX73nvvBrxO+Gdu2KiRpE6dxm5G0ONTp/5VlhxmyenTpwOmS2qbzALhiiLcsGnTN/LVl1+6yc1rO6tcScx98005fty/kAYmphs0bCSXXXaZk3/Bgrd8TEjffc89UrBgIefctm3fy8cffeTWY+8ULFRI7r77Hif66NEjMi9BeeWOO++UokWL2clDHn/33VbBSlU7ZMqUSWo/+KDkUe44sim3GadOnZZffvlZtmzeLO8sXSonTpyws/gcFy5cWArdVdgnLtDB6dOnZM7s2YLnUYdImOg8euvlvdFl6q0X/U6XFWgbLTu73KS22eRol+nv2OzXkdy/QH0adaRJk0YaNW7svEPwnM2fN1dgjv3m3LmlcuUqjruY6zJnVubZD8jOHTtk0cKF8qtyJ2OH+g0aSPr0GZzorzd+JV8rKy7BQrXq1SVr1uudJF4/IzbXI0eOONcVrD3mubLlysnNN+d2okwmZppg+3b9dtozZ047DHf89JP8pP78Ba/ui7+yk/rusa8r1lyzZs0qdxYoIDly5FSKfAmafMYF2d8M41RYu1dlzCg1a9aUW27JJ9ffcINcemka+W3/b7Jnz27nHRzMsgAUCKBIgPD34cNSoXx555sDRnDrhPIOq/hf1Hf894MH/bbnlnz5pFSp0s65s2fPyIzp05XrpDN+0yIS34nKVaq65+fMnuV8Jx6qU0cyZszkxK9atVJ++flnN425ky9/filZspQT9fPP++TdVavM04n2i6sxVunS9zlWoK66KqNzHfv27ZUVK1Y4bhsSZVARZh+Jh++2vzYiLtZ9K1C9jCcBEiABEiABEiABEiABEiABEiABEiABEiABEkh+AlQkSH7mQWvUigS7d+2Sju3by5YtW5z0SRGwmxVBsFVACRUQ9itB1meffWae9tm/TgnjNxjCW7hAmDZ1ik+acA+yZc8u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eMCCeYIESIAEPCDgpcC6jnrXDRg40KdVBw8clDatW8mmb77xiedBcAJe3pfgNfFsShNYvXadZMuezacZc2bPlj69esnp06d94nlAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiQQGQEqEkTGi6lJgARIgARIwCGQLl16eal7N0mdOrXIWZEhgwfJH3/8kSQ691eqJC916y6HDv0pf/7vT/nhhx9k6pTJsn///iSVdzFn8vK+XMwcL4Rrnzlrtlx55ZVy9swZ+fHHH2X9+g9l8aJFF0LT2UYSIAESIAESIAESIAESIAESIAESIAESIAESIAESiHsCVCSI+1vEBpIACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBA8hGgIkHysWZNJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJBD3BKhIEPe3iA0kARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggeQjQEWC5GPNmkiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEgg7glQkSDubxEbSAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQALJR4CKBMnHmjWRAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQNwToCJB3N8iNpAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEko8AFQmSjzVrIgESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIG4J0BFgri/RWwgCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACSQfASoSJB9r1kQCJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACcU+AigRxf4vYQBIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARJIPgJUJEg+1qyJBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABOKeABUJ4v4WsYEkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkkHwEqEiQfKxZEwmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAnEPQEqEsT9LWIDSYAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCD5CFCRIPlYsyYSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESiHsCVCSI+1vEBpIACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBA8hGgIkHysWZNJEACJEACJEACBoFb8uWTs2fOyPbt243Yc7t33Hmn/H34sOzZsyfROUaQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAnElgAVCWLL17PSM2TIIJkzZ3bKO336tOzdu9ezsnVB2XPkkEvTpNGHcuTIEfn999/dYy92UqdOLfeVKSO5c+eWHDlzynXXZZYjf/8tBw78Jt9/972sWbNaTpw44UVVLIMESIAESCCOCfTp21caNGzotHDKpMnyyoD+bmvHjBsnFSpWlLNnRYYMHiQTx493z3GHBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEgg9gSoSBB7xlHXULxECRk0eIhkvT6rW1bFcuVl3z7vlAmK3XuvTJ/5hlxyiVuF7Nq5U6pUqnQ+Ioq9yy+/XB597DHn7/obbghY0vFjx2XK5EkycsQIOaNWqTKQAAmQAAn89whcdtllsvGbTZLm0nPKayeOn5BCBe50LjRLlizy4UcfuRe9b+8+qVi+nHvMHRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggdgToCJB7BknuYY0yjpAh46dpOUTT0iqVIaEX5VYWa3U3L17d5LLNjOmS5de3n7nHcmZK6cZ7ZiTrlShgk9cUg4yZsokY8aOk3uK3BN29rVr1kjnjh3lb2WtgIEESIAESOC/ReASpbW26r33JNeNNzoXBos0tWvWcPaheLZu/QbJdHUm53j9hx9Ky+bN/1sAeDUkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEOcEqEgQpzfoRiVcGfrqa1KgYAG/LfRSkaBbjx6OpQC7IviljlaR4KqrrpI3582X3Hly+xR/+K/DsnHjV/LHH39Irlw3yh133CHp0qfzSbN71y556sknZeeOHT7xPCABEiABErjwCRQuXFgaNWniXMi0qVNly+bN7kWVLl1aaj/4kJw+c1rGK0W0HTt+cs9xhwRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIIPYEqEgQe8YR11Cnbl3p3qOnpM+QPmBerxQJCt99t8x+c66PSwNdqReKBL1fflkaNmqki5RT/56SEcOHy8wZ0+Xo0aNufKpUqeTBhx6Snr16S9p0ad3477ZslToPPUg3By4R7pAACZAACZAAh0lPLgAAQABJREFUCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAbAlQkSC2fCMu/Z4iRWTWnDk++WDWefHCRTJ42FA33gtFAvioXrTkbcmTN49T7v+UdYBFixZJi5YtneNoFQmw2nT23HmuksI///wjbZ9+WtasXu1eh71zyy23yNjxEyRHzhzuqeeffVYWLljgHnOHBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEggdgSoSBA7tkkqudi998qMN95w8v77778ydPBgmTplipQoWVKmTJvmlumFIkH7Dh2kzTPPuGW2b9tOuRnIJZ27dnHiolUkGDJ0mNSsXcstf/CgQTJx/Hj3ONDO/ZUqyagxY9zTa1avkaeeeNw9tneKFC0qZcqUlezZs8m1110nhw//Lb/+8ots/Ooree+9d+XUqVN2Fsf6QaZMVzvxJ0+ekNmzZiVKoyOqVqsu119/vXN4+PBfsuCtt5z9NGnSSKPGjSV16jRy9uxZmT9vrmNl4ebcuaVy5SqSN29euS5zZjl48IDjnmHRwoXy66+/6mIDbuEfvGixYpIvXz7Jlz+/ZM16vezdu0e+27pVtioLDd99t1WglOEv3H3PPVKwYCHn1LZt38vHH33kL5kTd2eBAlKkSFFnf+fOHbJ2zZqAaaF0kv/WW+X222+XdOkSW8o4ffqUzJk9W9BnA4XiJUpI6dL3Sc5cOeWqqzLK7wcPyr59e2XFihWy7fvvA2UT85qQaP2H62T79u0B05snrsqYUerUqetG/fDDNvlowwb3ONTOpZde6ljUwD1GOHLkiHOfQ+XT58uWKyc333zOrYfZR/R5exsJI1jx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WjQ3qyD+gAgknPmFBLH0YZcV9jdq5Eh5ceDAcLuWKVOnSaEbC5lyCBgmTjgRTcBtK4i7bbRO3XrSu28fuygI41+0cGETAcHtN4ioUVnZ792zx6vrzpQqXdpETsE6tHHrTTe5xUnOu/sKqoz9r1u3Vv+tk1madmatRjeJxfLkySPNWzwgNe6pGZIKBm3iXvPhh/NNdIYvv/giyd1E01+SbMypsPrrNZIxU0azpnmTprJ06fF0H04VvUfGdm9w20qt83D3wXkSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESOJUIUEiQzn5tjPLEaGw3hP/JdopX6Ej3vHnzmRzncCRlzJjRpDjYvOk7TWPwlYb9Vo9rlHbeeedJ7kuO50xHOoWfdVQ7coK7I9OjbDLJ6kFO2G/WrDHbZciQQc8xr5ym5wfH3tatPwpECMk1OKBz5brQOOKQluGXX35J7qYndb0LNJXBxblzm98YTnikbjhw4MBJfcxpfXBpySg1+3BaczsV94doL7n1eoLwAvf8o/pvh0ZegZjsv2Zp2e//a2x4vCRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiTwbxCgkODfoM59pgsCkZyw6eIEeRLpngD7cLr/iXmCJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJJAiAhQSpAgbNyIBCUxtYCMSkA8J/BcIUEjwX/iVeIwkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkkPYEKCRIe+bcYzohQCdsOvkhT+HTYB8+hX98njoJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJRCBAIUEEOCwigUgE6ISNRIdl/wUC7MP/hV+Jx0gCJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACaU+AQoK0Z849phMCGTNmkq7dnpYzzjhD5B+RAf1fkH379qWTs+NpnAoE2IdPhV+Z50gCJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEAC0ROgkCB6ZtyCBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABNItAQoJ0u1PyxMjARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggegJUEgQPTNuQQIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQALplgCFBOn2p+WJkQAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkED0BCgkiJ4ZtyABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBdEuAQoJ0+9PyxEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEggegIUEkTPjFuQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQLolQCFBuv1peWIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkED0BCgmiZ8YtSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCDdEqCQIN3+tDwxEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEoieAIUE0TPjFiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiSQbglQSJBuf1qeGAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAlET4BCguiZcQsSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESSLcEKCRItz8tT4wESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEoidAIUH0zLgFCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACaRbAhQSpNuflidGAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAtEToJAgembcggRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgATSLQEKCdLtT8sTIwESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIHoCVBIED0zbkECJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEAC6ZYAhQTp9qfliZEACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBA9AQoJIieGbcgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggXRLgEKCdPvT8sRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIIHoCFBJEz4xbkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkEC6JUAhQbr9aXliJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJBA9AQoJomfGLUiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEgg3RKgkCDd/rQ8MRL47xC49NI8UrpMafn1119l9qxZ/50D55GSAAmcFAQyZswoF1yQwxzL73/8Lvt/++2kOC4eBAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAn8VwmcUkKCDBkySP4CBaRQoUKSJUtW+fbbjfLNmjXy008/nVS/32mnnSaXX3655MiZU+Ac2bZ1a+Dx/aqOEjpLAtFw5UlI4LzzzpNid9whN998s2TPfp5kypxJcuW6UC655BK5IMcF5oiXfPKJtGjW7CQ8eh4SCZDAyUygY6dO8kDLluYQV3y+Qho3bHAyH27gsZ199tmSO3fuwDK78sCBA0Zw9c8//9hV6XaaK1cuyZQpU9Tnt337djl27FjU23EDEiABEiCBUAJ4d8+WLZtZ+fPPP8vRo0dDK3CJBEiABEiABEiABEiABEiABEiABEgg3RM4JYQEV199tfTu208KFiwoZ5x5RqIf9ZdffpHXJk2WEcOHycnwcf72okXl1cmTEx1n0IrDhw7LokULZdKrr8oXK1cGVeE6EvhXCeD669PveSl4ww1y+umnRTwWCgki4mEhCZBAGAJPdu4szVu0MKVffvGFNLj33jA1T97VDRo2kp7P9EryAP/880/ZvWu3rFjxuUyd8o6sXLnipHh3SfLAo6yw/LPP5PwLjovMotm0/eOPy8wZM6LZhHVJgARIgAQCCEx+/Q0pXKSwKenbu49MnDA+oBZXkQAJkAAJkAAJkAAJkAAJkAAJkAAJpGcC6V5IUKJkSRky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QUAgwTiUYgZ5OHzkSDr11tvp9u35NP/3fJqZmUk/fP9dun79egapl8RxEHj26NH09MGDZVZ+u3IlnZuaGodsyUPHBbZPTKTXT54sFRb+XUjvvfuOTqKO1wnZJ5CzQFvai9oMOdciaR+VwIsnTqQn9u4td3fh/Pk0ffnyqHZtPwQIECBAgAABAgQIECBAgEAmAgIJMikoySRAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAk0ICCRoQtkxCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAJgICCTIpKMkkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJNCAgkaELZMQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQCYCAgkyKSjJJECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECTQgIJGhC2TEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAmAgIJMikoySRAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAk0ICCRoQtkxCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAJgICCTIpKMkkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJNCAgkaELZMQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQCYCAgkyKSjJJECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECTQgIJGhC2TEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAmAgIJMikoySRAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAk0ICCRoQtkxCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAJgICCTIpKMkkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJNCAgkaELZMQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQCYCAgkyKSjJJECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECTQgIJGhC2TEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAmAgIJMikoySRAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAk0ICCRoQtkxCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAJgICCTIpKMkkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJNCAgkaELZMQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQCYCAgkyKSjJJECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECTQgIJGhC2TEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAmAgIJMikoySRAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAk0I/AfN+6wQWxy+cwAAAABJRU5ErkJggg=="
+ }
+ },
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Модели: rectools.models.RandomModel(random_state=32), rectools.models.PopularModel() с параметрами по умолчанию\n",
+ "models = {\n",
+ " \"random\": RandomModel(random_state=32),\n",
+ " \"popular\": PopularModel()\n",
+ "}\n",
+ "\n",
+ "# Метрики: 2 ранжирующие, 2 классификационные, 2 beyond-accuracy. Считаем по порогам 1, 5, 10. MAP обязательно\n",
+ "metrics = {\n",
+ " # классификационные\n",
+ " \"prec@1\": Precision(k=1),\n",
+ " \"prec@10\": Precision(k=5),\n",
+ " \"prec@10\": Precision(k=10),\n",
+ " \"recall\": Recall(k=1),\n",
+ " \"recall\": Recall(k=5),\n",
+ " \"recall\": Recall(k=10),\n",
+ " # ранжирующие\n",
+ " \"MAP\": MAP(k=1),\n",
+ " \"MAP\": MAP(k=5),\n",
+ " \"MAP\": MAP(k=10),\n",
+ " # среднее значение обратного ранга\n",
+ " \"MRR\": MRR(k=1),\n",
+ " \"MRR\": MRR(k=5),\n",
+ " \"MRR\": MRR(k=10),\n",
+ " \"novelty\": MeanInvUserFreq(k=10),\n",
+ " \"serendipity\": Serendipity(k=10),\n",
+ "}\n",
+ "\n",
+ "# 3 фолда для кросс-валидации по неделе\n",
+ "n_splits = 3\n",
+ "test_size = \"14D\"\n",
+ "\n",
+ "# Инициализированный Splitter для кросс-валидации\n",
+ "cv = TimeRangeSplitter(\n",
+ " test_size= test_size,\n",
+ " n_splits=n_splits,\n",
+ " filter_already_seen=True,\n",
+ " filter_cold_items=True,\n",
+ " filter_cold_users=True,\n",
+ ")\n",
+ "\n",
+ "# Количество рекомендаций для генерации (K)\n",
+ "K_RECOS = 10"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "dataset = Dataset.construct(\n",
+ " interactions_df=interactions,\n",
+ " user_features_df=None,\n",
+ " item_features_df=None,\n",
+ " )\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 103,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "CPU times: user 5 µs, sys: 0 ns, total: 5 µs\n",
+ "Wall time: 32.2 µs\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%time\n",
+ "import time\n",
+ "\n",
+ "def evaluate_models(interactions, models, metrics, cv, K_RECOS):\n",
+ " results = []\n",
+ " trained_models = {}\n",
+ "\n",
+ " # n_splits = cv.get_n_splits()\n",
+ " fold_iterator = cv.split(interactions, collect_fold_stats=True)\n",
+ "\n",
+ " for train_ids, test_ids, fold_info in tqdm(fold_iterator, total=n_splits):\n",
+ " print(f\"\\n==================== Fold {fold_info['i_split']}\")\n",
+ " pprint(fold_info)\n",
+ "\n",
+ " df_train = interactions.df.iloc[train_ids]\n",
+ " # Создаем RecTools Dataset через метод construct на train взаимодействиях для каждого фолда\n",
+ " dataset = Dataset.construct(df_train)\n",
+ " # Определили test\n",
+ " df_test = interactions.df.iloc[test_ids] # Предполагается, что Columns.UserItem определено\n",
+ " test_users = np.unique(df_test[Columns.User])\n",
+ "\n",
+ " catalog = df_train[Columns.Item].unique() # Каталог для рекомендаций\n",
+ "\n",
+ " # Обучаем модель (не забываем сделать deepcopy), рекоменуем K айтемов для каждого юзера, считаем метрики на test\n",
+ " for model_name, model in models.items():\n",
+ " \n",
+ " model_copy = copy.deepcopy(model)\n",
+ " # время перед началом обучения\n",
+ " start_time = time.time()\n",
+ " model.fit(dataset)\n",
+ " recos = model.recommend(\n",
+ " users=test_users,\n",
+ " dataset=dataset,\n",
+ " k=K_RECOS,\n",
+ " filter_viewed=True,\n",
+ " )\n",
+ " metric_values = calc_metrics(\n",
+ " metrics,\n",
+ " reco=recos,\n",
+ " interactions=df_test,\n",
+ " prev_interactions=df_train,\n",
+ " catalog=catalog,\n",
+ " )\n",
+ " \n",
+ " # время обучения\n",
+ " training_time = time.time() - start_time\n",
+ "\n",
+ " res = {\"fold\": fold_info[\"i_split\"], \"model\": model_name, \"training_time\": training_time}\n",
+ " res.update(metric_values)\n",
+ " results.append(res)\n",
+ "\n",
+ " # Сохраняем обученную модель\n",
+ " if fold_info['i_split'] == n_splits - 1: # Последний фолд\n",
+ " trained_models[model_name] = model_copy\n",
+ " \n",
+ "\n",
+ " # Результат оборачиваем в pandas DataFrame и усредняем по фолдам\n",
+ " results_df = pd.DataFrame(results)\n",
+ " average_results = results_df.groupby('model').mean()\n",
+ " average_results = average_results.reset_index()\n",
+ " return average_results, trained_models\n",
+ "\n",
+ "# %%time\n",
+ "# df_rec, trained_models = evaluate_models(interactions, models, metrics, cv, K_RECOS)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 104,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 0%| | 0/3 [00:00, ?it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "==================== Fold 0\n",
+ "{'end': Timestamp('2021-07-26 00:00:00'),\n",
+ " 'i_split': 0,\n",
+ " 'start': Timestamp('2021-07-12 00:00:00'),\n",
+ " 'test': 398993,\n",
+ " 'test_items': 7394,\n",
+ " 'test_users': 122488,\n",
+ " 'train': 3239125,\n",
+ " 'train_items': 14730,\n",
+ " 'train_users': 646423}\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 33%|███▎ | 1/3 [00:17<00:35, 17.62s/it]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "==================== Fold 1\n",
+ "{'end': Timestamp('2021-08-09 00:00:00'),\n",
+ " 'i_split': 1,\n",
+ " 'start': Timestamp('2021-07-26 00:00:00'),\n",
+ " 'test': 458757,\n",
+ " 'test_items': 7711,\n",
+ " 'test_users': 135624,\n",
+ " 'train': 3892558,\n",
+ " 'train_items': 15085,\n",
+ " 'train_users': 742256}\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 67%|██████▋ | 2/3 [00:36<00:18, 18.27s/it]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "==================== Fold 2\n",
+ "{'end': Timestamp('2021-08-23 00:00:00'),\n",
+ " 'i_split': 2,\n",
+ " 'start': Timestamp('2021-08-09 00:00:00'),\n",
+ " 'test': 521381,\n",
+ " 'test_items': 7705,\n",
+ " 'test_users': 151629,\n",
+ " 'train': 4649162,\n",
+ " 'train_items': 15415,\n",
+ " 'train_users': 850489}\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 3/3 [00:58<00:00, 19.50s/it]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "CPU times: user 54 s, sys: 3.04 s, total: 57.1 s\n",
+ "Wall time: 58.5 s\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%time\n",
+ "df_rec, trained_models = evaluate_models(interactions, models, metrics, cv, K_RECOS)"
+ ]
+ },
+ {
+ "attachments": {
+ "image.png": {
+ "image/png": "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BBBAAAEEEEAAAQQQQAABBGIqQKBBTDmpDAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgZQtQKBByr6+nB0CCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIxFSDQIKacVIYAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEDKFiDQIGVfX84OAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQACBmAoQaBBTTipDAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAgZQsQaJCyry9nhwACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQEwFCDSIKSeVIYAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggkLIFCDRI2deXs0MAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCCmAgQaxJSTyhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEjZAgQapOzry9khgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggKnjbmoAAEAASURBVAACCCAQUwECDWLKSWUIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgikbAECDVL29eXsEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQiKkAgQYx5aQyBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEUrYAgQYp+/pydggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCMRUgECDmHJSGQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAilbgECDlH19OTsEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQRiKkCgQUw5qQwBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIGULUCgQcq+vpwdAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACMRUg0CCmnFSGAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAyhYg0CBlX1/O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BEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABFwmAKGBy6jQEARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAEIDrAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAGXCUBo4DIqNAQBEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEIDQAGsABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEDAZQIQGriMCg1BAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAAQgNMAaAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQcJkAhAYuo0JDEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABCA2wBkAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABFwmAKGBy6jQEARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAEIDrAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAGXCUBo4DIqNAQBEAABEACBsEUgTpw4FD36x3LSt27dpLdv34atGwjhbJMlS05Fihahf/75h9atXRvC0dD9QyWQMGFCihQpMvn4vKY7d+58qBhw3yAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiBgQwBCAxscYfckevToFD9+fHkDb968oRs3boT4Zjw1Jhu6YsWKJefz4MEDevr0qctzM/v++++/9PDhQ5f7oiEIgAAIfMgE+Bu+cfMWip/A77ehfJkydOnSpXCHhH8n8uXPTzly5KDYseOQd3RvSpAgISVNmpTifRJP3u/uXbuoSaNG4e7ecUOeIZAgQQKKESOGHOzx48fE/1ZRycvLi/YfPEQxY8Uk3ze+VLVKZfrj/HlVjSMIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIfLAEIDQIB48+b758NHjIUEqYKKG+mxJFi9HN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P02bMcMq709GjNNvli4VZpUnITSQTsSKFYtac1iISpUqU/oM6V36dWDffurfvx8dO3qU1qxbT7Fix6Lg4AdU7s0yJCv5PaVOnbtQ46ZN1OlV7JXhU0Ok4K5O9uw5qFuPHpQrVy6KFxjPKiLeFab88AONGjmSOnz+OdWpW1edW7hgAX3eoYNVzsykTZuWr91UhVt49tlnzVN0/tw52rt3Lw0aMJCOHj3ics7cESbVa9SkdzmsQo6Xc5inVF7amTB+PM2aOZM9HdwOdd484C8Lsy7yIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAAC0Z8AhAbR/x76NQJZ3R4cHBymMdmvRn0sbBcavMrhGsTwHt40dfp0yl+ggKquPRrY20qaNCmlTJmKAuMH0onjx+mff/6xF3ms+7Fjx6asWbOpkBRiwBcxw927d8N1zThx4lCaNGkoRcqUdIvFIudYHPDvv//63VYyDpWQhsULDzjWwjPPPKPCSgQFBfndDiqAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAg8nQQgNHg673ukjDoyhAaRMlBcFARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARiMAEIDWLwzY1qQ4PQIKrdEfQHBEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABPwnAKGB/8xQI5wEIDQIJzhUAwEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAIEoRABCgyh0M2J6VwIDA6lO3XoUK9YzdPv2HZoxfRo9ePAg3MMuWaoUZcqUSdVft3YtHTlyJNxtoSIIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgIBvBCA08I0TSoEACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACDABCA3wGIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACPhMAEIDn1GhIAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAIQGeAZAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAAR8JgChgc+oUBAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQABCAzwDIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACPhOA0MBnVCgIAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAoQGeARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAAZ8JQGjgMyoUBAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQgNAAzwAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgIDPBCA08BkVCoIACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACEBogGcABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEDAZwIQGviMCgVBAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAAQgNMAzAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIg4DMBCA18RoWCIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACEBrgGQABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEPCZAIQGPqNCQRAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAAQgN8AyAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAj4TABCA59RoSAIgAAI+EYgffoMVKJkCfr3339p2dKlvlVCKRAAAUXgf//7H71Vtizdu3effv5pNd29ezfcZAIDAylZsuSq/rXr1+jqlSvhbgsVQQAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEHhGA0OARi2idS5AgAaVIkUKN4f79+3Tq1KkIjyd+/Pj0yis5KWeunBSf2z908CDt37eP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Q9fdEij2xhs0fuJEt+f8PXjzxk3Kk/tVf6s9lvIQGjiDFUIDZzhGRiuYryKDOq4JAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAtGLAIQG0et+obcgAALRmAAMN9H45qHrbgk888wzlCxZMrfn/D343927FHT1qr/VHkv50qXL0IsZX1Rtr1i+nM6ePevzdWLHjk316tenuHHjknhpmDF9Ot2/f9/n+jGpIIQG0fduYr6KvvcOPQcBEAABEAABEAABEAABEAABEAABEAABEACBJ0UAQoMnRRrXAQEQeOoJBAbGp67du5EYIukB0cAB39Dly5efei4AAAIgEDMJVKhYkYqXKKEGt2vnTpo9a1bMHGgMHBXmqxh4UzEkEAABEAABEAABEAABEAABEAABEAABEAABEHCYAIQGDgNFcyAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAQkwlAaBCT7y7GBgIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIOE4DQwGGgaA4EQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEYjIBCA1i8t3F2EAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEDAYQIQGjgMFM2BAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAQEwmAKFBTL67GBsIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIOEwAQgOHgaI5EAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEIjJBCA0iMl3F2MDARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAAYcJQGjgMFA0BwIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIxmQCEBjH57mJsIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIOAwAQgNHAaK5kAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAgJhOA0CAm312MDQRA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IAESOGMEChS4R1o98YST/oD+L8i2bdvOWF7+LQlnypRZuj73rEBITJQdy4EDXpSffvrp31I8loMEUoRAhYoVpVjx4k7cGzdskBlvvJEi6TBSEiCB5ATK3H+/dH32OTl8+JAc+vmQfP755zJp4gT5/vvvk3vmHRIgARKIg0DOnDmlwcMNJWOmjI4AEzZP/Nsdxzb/9jf87y5funTp1Dftc5I5c2b5848/pXevnvLXX3/9uwvN0pEACZAACZwRAhQ0OCPYmSgJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJpE0CFDRIm++NuSYBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBM0KAggZnBDsTJQESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIG0SYCCBmnzvTHXJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJHBGCFDQ4IxgZ6IkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkkDYJUNAgbb435poESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEzggBChqcEexMlARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgATSJgEKGqTN98ZckwAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkMAZIUBBgzOCnYmSAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQNokQEGDtPnemGsSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESOCMEKGhwRrAzURIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARJImwQoaJA23xtzTQIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAJnhAAFDc4IdiZKAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAmmTAAUN0uZ7Y65JgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARI4IwQoKDBGcHOREmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEggbRKgoEHafG/MNQmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmcEQIUNDgj2JkoCZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACaRNAhQ0SJvvjbkmARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggTNCgIIGZwQ7EyUBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBtEmAggZp870x1yRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRwRghQ0OCMYGeiJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJJA2CVDQIG2+N+aaBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABM4IAQoanBHsTJQESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAE0iYBChqkzffGXJMACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZDAGSFAQYMzgp2JkgAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkEDaJEBBg7T53phrEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEjgjBChocAp7+vTppeh998nd+fLJ1VdfLRkzZpQDBw7Iri++kCVLlsjRI0fOyAvySvScc86R66+/Xq648krJlCmT7P3mGy9vcujwYTmi/uhIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIICgCFDRQJG+77TYZOWaMI2DgBfbPP/+UHt26y6yZM7wep/q9ewsWlMmvvRZVusd+PyYrV66QKZMny/p166IKQ08kQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEI7Af17Q4K6775bxr7wiF1x4YThG7v0BL74o48eOda/P1EnhIkVk4quvxpT83yf/lo4dnpRFCxfGFI6eSYAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESMAk8J8WNLjrrrvUgv1kyZQ5k8vk85071c7/9fL3P39Lvnz55dZct7rPcNKze3eZGqU2gZCAAV54CRr8/tvvbgrpM6SX8847z73WJxA26NSxgyxcsEDf4pEESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEYiLwnxY0gJBB4SKFXWDDhgyV4cOGutc4ade+vbR8/HH33g/f/yAlixeTkydPuvdS+8QWNChburR8/fXXIdm44sor5eabb5ZWjz8hBe4p4D6DsMFDNWvIls2b3Xs8IQESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIFoCfxnBQ0uv/xyWf3Rx3LOOUmo5syeLZ2fftqT28jRo6V0mTLus0oVKsgXX3zhXqf2STSCBmaeunR9Vho1aezemj1zlnTp/Ix7zRMSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESiJbAf1bQAGYTps+c6XJq2byFLF/+rnttntSuU0d69u7t3mr+6KPy3sqV7nVqn8QqaAAzCouWLJVrr7vWyer3330nxe+7zzPbl1xyiVStVk1y3nijXHPNNXLixEn59tv9snXLFlm0cKEcP37cM5x5E+kVuOceR6PCzbfcIldddbXs3fuNbN+2TbZt3Sbbt2+TP//80wyS7BzvJ++ddyW773Xj5MkTMv311+Wvv/5yHp977rlSp25dSZ8+g/zzzz8y44035Nix06YlzDjSp08vdevVkwwZznVur171QVghkqzZskmBAgUEZbrpppsc/198/rns2LFDNm7YoMq414w62XkiXO7Ol0/y5MnrxLlz5w75cM2aZPHrG0WLFpUbb7rZudy0cYNs2rRJP3KOscSVJ29eufvufE643377VWbOmBESl31x1VVXye133CHZsl2rhHhOSfEYnj777FPZsH69cYenJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACaY3Af1bQ4N6CBaXrs885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BEAABEAABEAgighAaBBFoHEYEIgOArFFaBAdbHBMEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEACBiBGA0CBi3LAXCMQKAhAaxIrLhE6CAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAQKwiAKFBrLpc6CwIBEcAQoPgeKE2CIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACICAfwIQGvhnhBogEGsJVKpcmVKkSKH6v+C77+jy5cux9lzQcRAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAgZhBAEKDmHEd0AsQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQiBUEIDSIFZcJnQQBEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEACBmEEAQoOYcR3QCxAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARCIFQQgNIgVlwmdBAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAIGYQQBCg5hxHdALEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEIgVBCA0iBWXCZ0EARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAgZhBAEKDmHEd0AsQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQiBUEIDSIFZcJnQQBEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEACBmEEAQoOYcR3QCxAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARCIFQQgNIgVlwmdBAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAAEQAIGYQQBCg5hxHdALEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEAABEIgVBCA0iBWXCZ0EARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAAARAA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AEKDKEeOA4IACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIBA7CUAoUHsvXboOQiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAhEOQEIDaIcOQ4IAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAArGXAIQGsffaoecgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgEOUEIDSIcuQ4IAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAjEXgIQGsTea4eegwAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgECUE4DQIMqR44AgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgEHsJQGgQe68deg4CIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACUU4AQoMoR44DggAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgEDsJQChQey9dug5CIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACEQ5AQgNohw5DggCIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACsZcAhAax99qh5yAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAQ5QQgNIhy5DggCIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACIAACMReAhAaxN5rh56DAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAQJQTgNAgypHjgCAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAQewlAaBB7rx16DgIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAIgAAJRTgBCgyhHjgOCAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiAAAiA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CBAgUHcCggZ1Z+1OBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECg7AUEDcp+Cy2AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAjUnYCgQd1ZuxMBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECh7AUGDst9CCyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAnUnIGhQd9buRIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEyl5A0KDst9ACCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBA3QkIGtSdtTsRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGyFxA0KPsttAACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFB3AoIGdWftTgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoOwFBA3KfgstgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI1J2AoEHdWbsTAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAoewFBg7LfQgsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJ1JyBoUHfW7kSAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBMpeQNCg7LfQAggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQN0JCBrUnbU7ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBshcQNCj7LbQAAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQdwKCBnVn7U4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKDsBQQNyn4LLYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECNSdgKBB3Vn/v91p+x12iDZt2ubzPfzQg/Hyyy/n9doK62+wQfTufUA+5MUXX4hHZs3K69UL7dq3j86du0Tz5s1i4002iffe+0+8MWdOPPnEEzFt2tRYsmRJ9Uuq1Df91reiV6+9q7TVVnn77bkxccKE2obEhhtuGPvut19s/oMfRLNmzZLPsDTmzHk9/vbss9m1ixYtqvX67bbbLtpuu12tYwqdS5cuidtHj46PP/640BTF/i+88Hz85ZFH8r7qhTZt28b22++QNb///sK4c8yY6kPUCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUFYCggZltV2ffNhLLrss9u/dO//kM6bPiON/flxer61w4kknxYBTTsmHzJwxM/oe97O8Xihs2apVXH7Fr2PLVlsWmlZ4f3vu23HBkMFx35QpK/QVGjp12iWuv3FUobrK9zmvz4ndu3SucVy9evWiX//+cezPjot1G65b45gF7yyIC4deEOPGjq2xP208e+A5cXSfY1baX72j6267xeuvvZY3F/s/MG1anHj88XlfcWH99dePCZMmx7ebfjtrXrZ0WWy15RbFQ5QJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQdgKCBmW3ZRHFX3SnH3/58oi99+qxyqcarLPOOjHzwQfjmxtvnK+6pqDBzp06xTW/+300bNQwH7eyQnrvSy++KG64/voah/Ts1St+M2xYjX01Na4saFC/fv244soro9fen+/pCJdctPLPVN2vps9R3LamQYOLL7k0eh/42dMjBA2KVZUJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEChXAUGDMty5mr4ov+fuu+PsM8+sdTWHHnZYnD9kSJUx1YMGGyTHEkyaPCU22XSTfNw777yTHa/w9FNPR8uWLaPTLrvE91p8L+9Pv0A/+KAD45mnn87bCoVDDzs8uefgrPra/74WI/94baErf+/arVt07tIlq68saHD4EUfEeeefn1+THmXw+GOPxaOPPhoN120YHTp2jDZt2+T9S5PjFHonxys8//zf87ZC4fd/uDZ279Y1qz780EMxberUQlf23rLlZnHUMUfnbWsSNNi1c+cYWS18IWiQkyoQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFDGAoIGZbh5NQUN0i/euyZf1s+dO7fGFaVPBLgvecx/ixYtqvRXDxoMPGdQlS/Zn3n6mTjskJ/E4sWLq1w3ZOjQ+Mkhh+RtT82eHQcfeGBeLxROOPHEOPnUU7Nq+qX+sceseGTBUUcfEwMHnZONqSlokB5BMDO5tnHjxtmYNETQNzkq4qHk6QzFr/Q+6f0Kr1kPPRx9igIDhfbbx4yJ7bbfPqtenhxDMfLaquGHrbbaOu4dP64wPFY3aNCkSZOYmBwn0bRp03yOtCBoUIVDhQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBMhUQNCjDjaspaJAu47o//jEuu/TSGlfUY6+eMWzE8BX6ioMGaRjhwYdnxabf2jQbN3/+/Oi9777xxhtvrHDd2muvHbeOvj3abts276v+hXzacdbZA+OYY/tkYyaMGxenfRo6yC9KCqsKGuzfu3d2XEThml+de27cPnp0oZq/16tXL347fHj02GuvrC0NJOzcYadYsGBBPiYtTL7v/ths882ytoFnnR1333Vnlf4vGjQYmhzbcNDBB1eZM60IGqxAooEAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgTIUEDQow01bWdBg4cKF0SU51iB9r/66+09/im1at67eHMVBgx9ts03cc++9+ZjLk9DCyCS8sLJXu/btk7DBZ1/4D0mONrj1lluqDL84maP3AQdkbTffdFMMrXZ0Q9qxqqDBiKuvjj27d8/meO/d96L9Dp88jSBrqPbHTh06xE1Fn2FAv/4xZfKkKqP+khy38M2NN87aTujbN6Y/8ECV/i8SNOjUaZe4/sZR+Xzj7h0b++y3b1YXNMhZFAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKGMBQYMy3LzioEF6fECrVlvlTyGoKRxQ/OV7GkKYlTy1oHuPT764Lw4a7LHnnnHVNdfkIukxB+lxByt7pUca/PWJJ/Lu9AiC9CiC4tfv/vCH6NqtW9Y0YtjwuKqGpyqsKmhw77jxsdXWW+XTnn/er/Jy9cJGG20YA045JW++aOiFceOoG/J6Wnju+ReiwVoNsrZDkicPPFm0hrRxTYMG6dEOEydPju80a5bNnT7BYer9U2PYVSOyuqBBxuAPAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTKXEDQoAw3sDho8MC0aTH7ydlx2hmnZyt56823otvuu8XHH3+cr2zk9dfHrp07Z/XrRo6MDdbfIA48+KCsXhw0OPSww+P8IYPz6zp36hRvvfVWXq+p8OeHH46mTZtmXfcmT00484wzqgxLj1do175d1nbB4MFxy803V+lPK6sKGjzy34/Gxpt88gSCFS5eRcO1v/9D/PqKy/NRTZo0icdnz87r3ffYI/75yit5PS2sadBg8AUXxCGHHprNNe/f86JnEubo0KGjoEEVXRUCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBMpdQNCgDHewetDgrF/+MmYmTx5If6M+fZ195plxz913Z+UtW7WKcRMmZOU0fNBtt92i/4CTawwaHNOnT5w1cGA2Nv2j9dZbx+LFi/N6TYXxEyfGFltumXVNSX6bf0C/flWGpb/h/4Mf/jBrOy150sCE8eOr9KeVVQUNnnzq6WjUuNEK132ehuuvuy4uvfjifGjz7343ps+cmdd3bNcu3l2wIK+nhTUJGnTo2DFG3XRz1Kv3yVT9Tjop7r/vvujRYy9Bgyq6KgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIlLuAoEEZ7mD1oMGJxx8fZ559dvQ59thsNS+/9FLs3bNnLF++PK749ZXx4333ydrT8EEaQrjwootrDBrst//+cenln/32/757/zief/7vKxWqX79+pCGAdRuum40Zfettcf6vzsvHV+/vc9TRMWvWw3l/obCqoMGMPz8YzZp/chzBRx99FIPO/iwMUZij+L1ho4bx4QcfZk3PPPtMvPKPf+Td27RuHXcnT15IX8uWLY+tt9wic8oHJIXVDRqcfuqpMWHS5Gj+3ebZNJOS8MUpAwZkZUGDYlllAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQqQUDQoAx3saagQXp8wQMzZsZaa6+VrajvccfFiy++GNMemB4N1mqQfJkesfdePeLll19eadBgl112ietGjcpFzjj1tBg3bmxer15o0aJFTJ0+PW8ePmxYXD1iRF5vudlmMeX++/N61+RpCq+/9lpeLxRWFTQYc9fd0Xbbttnwv//tudjv0+BE4frVee/Zq1f8Jvmc6Ss93mDnDjutcPnqBg3efPPNOPyII7J55s+fHz27d4933nknqwsarMCrgQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBMhcQNCjDDawpaJAuI30aQfpUgvT11//5a/z9ub/FkUcfndVnTJ8Rx//8uKy8sicabLLppvHQrEeifv1Pnv8/Ydy4OC35bf2VvX565JEx6LzPnmBwws/7xvTpD+TDe+29d1z5299m9UUfLopt27Re4ekBaeeqggaDh1wQhxx2aDbPko+XxM4dO6xw3EHW+Tn+OCk52qH/p08beDp5GsNBB/Re4arVCRos/M9/onGT9fIjEwb06x9TJk/K5xQ0yCkUCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCoEAFBgzLcyJUFDX64xRYxfuKk/Evv4qUddsgh8fhjj2VNKwsapJ233DY62u/YPr/0nOSYgrvuHJPXC4UfbbNNjL7jjlhnnXWypoULF0bHHXeMxYsXF4ZkIYM0bJC+0uDDEZ+GBfIBnxZWFTTYuVOnuOHGG/PLHn/s8TjmqCMjPUah+qtL8tSE4SOuypuP+ukRMXv27Kxer169mDh5Smz+g82z+vix4+L001YMUqxO0CC/UVK4L5m7f79fFDeFoEEVDhUCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCpAQNCgDDdxZUGDdCnXjhwZ6Zftxa/ZTz4ZPznooLyptqBB9x49YvhVn31RnwYHhg4ZEjOSIxLmzp0bTZo0iY477xwDzxkUzZo3y+e8LrnvZZdcktc7dOwYN4y6Meo3qJ+1DfhFv5gyZXLeX1xYVdCgQYMGMXb8+EiDFIXXjORIiN9dc008++wzsXTp0lhrrbWy4wv6n3xy9hnTce8ueDe67LprfPjhB7H+BhtEnz594oSTTipMEYMGDow7x6wYoliToEF6VEKvxG7evHn5/GlB0KAKhwoBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAhUgIGhQhptYW9Bgx512iptvvbXKqk464YSYNnVq3lZb0CAdNPyqq6N7j+75+EJh6ZKlWbHBWg0KTdn7q//8Z+yTPLlg0aJF0arVVjFsxPD4TrNm+dMO0kH/+te/YlkSCKjp1fQ7zWLddT95MkLa/89XXsmG3Zas48ZRo7Jy6zZtYsydd+XBhawx+WPRoo/io+S+jRo3irXXXrvQnL1fMHhw3HLzzXFc375x+hlnVOmbP39+9OzePdKAQPXXmgQNTk0CDhMnTKg+laDBCiIaCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAodwFBgzLcwdqCBuly7rrnT9G6TetsZa/845XomYQGli1blq90VUGDhg0bxWVXXB57Jl/Er+r1wvMvxPF9fx5zXn89G1r9mINVXV9b/01JyODCoUPzIbvtvnt2HEPjxo3ztpUVhv3mN3HN1Vdn3SefemqccOKJVYb2S55scP9991VpK1RWN2iQhjjSMEdNL080qElFGwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC5SwgaFCGu/er8wfHYUccnn3yCePGxWnJF+nFr+132CG6du2WNT3yyKx4ZNas4u4459xz48ijjsraJk+aFCf371+lP63Uq1cv9t1vvzjip0fmoYXiQXNenxOjb7steWLATfHBBx/kXaUMGqQ3+X7LltHn2GNjn332jYaNGub3TQtLPl4SM2fOiKtHjIjnnnsu7ysEDZYvj/hbctTCuLFj8ycl5IOKCuk9ptw/NTGI5CkMy6LzrrvE28mxEYVXsX96PEPPvXrEv99+u9Bd5b1zly7xx+uuy9oWLlwYO2y7bZV+FQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECJSbgKBBue3Yl/B5N9poo2jWvHl252984xvxxpw5MTf54r34KQmFj1UcNEiPS9ija9dC1+d6P2fQoDjy6KOzsdWfaFA8Qfo5miXHM3xz441j8eLF8e6CBTEn+VxLazieIR3btGnTeP/992PevHnF0ygTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwGoKCBqsJpjhtQvUVdCg9k+hlwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRKJSBoUCrZr+m8ggZf0423bAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEvjYCggZfm62um4UKGtSNs7sQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDgyxIQNPiy5Cv0vhtuuGH0PuCAbHVvvfVWTJwwYbVW2qZt22jXrl12zWOPPRZPP/XUal1vMAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAiUVkDQoLS+ZidAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAhUlIGhQUdtpMQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoLQCggal9TU7AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCoKAFBg4raToshQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKlFRA0KK2v2QkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEUJCBpU1HZaDAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKK2AoEFpfc1OgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQqSkDQoKK202IIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBpBQQNSutrdgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUFECggYVtZ0WQ4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIESisgaFBaX7MTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGKEhA0qKjttBgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFBaAUGD0vqanQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVJSAoEFFbafFECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB0goIGpTW1+wECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKCiBAQNKmo7LYYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECJRWQNCgtL5mJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECFSUgaFBR22kxBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgtAKCBqX1NTsBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEKgoAUGDitpOiyFAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAqUVEDQora/ZCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBARQkIGlTUdloMAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAorYCgQWl9zU6AAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCpKQNCgorbTYggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQGkFBA1K62t2AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQUQKCBhW1nRZDgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRKKyBoUFpfsxMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgYoSEDSoqO20GAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUFoBQYPS+pqdAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhUlICgQUVtp8UQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIHSCggalNbX7AQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoKIEBA0qajsthgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIlFZA0KC0vmYnQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIVJSBoUFHbaTEECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKC0AoIGpfU1OwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQqCgBQYOK2k6LIUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECpRX4P/LjZo+89/AnAAAAAElFTkSuQmCC"
+ }
+ },
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 169,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def reccomend(model, dataset, list_user, data, items):\n",
+ "\n",
+ " history_all = []\n",
+ " recos_all = []\n",
+ "\n",
+ " for i in list_user:\n",
+ " recos = model.recommend(\n",
+ " users= df[Columns.User][df[Columns.User] == i].unique(),\n",
+ " dataset=dataset,\n",
+ " k=10,\n",
+ " filter_viewed=True,\n",
+ " )\n",
+ "\n",
+ " history_all.append(df[df['user_id'] == i].merge(users, how = 'left', on = 'user_id').merge(items, how = 'left', on = 'item_id'))\n",
+ " recos_all.append(recos.merge(users, how = 'left', on = 'user_id').merge(items, how = 'left', on = 'item_id'))\n",
+ "\n",
+ " return history_all, recos_all\n",
+ "\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.13"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/hw_5_autoencoder.ipynb b/hw_5_autoencoder.ipynb
new file mode 100644
index 00000000..750a793d
--- /dev/null
+++ b/hw_5_autoencoder.ipynb
@@ -0,0 +1,1922 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "7_8DlX_2jZzT",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:32:12.524590Z",
+ "iopub.status.busy": "2023-01-22T12:32:12.523513Z",
+ "iopub.status.idle": "2023-01-22T12:32:12.529931Z",
+ "shell.execute_reply": "2023-01-22T12:32:12.528298Z",
+ "shell.execute_reply.started": "2023-01-22T12:32:12.524533Z"
+ },
+ "id": "7_8DlX_2jZzT"
+ },
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import os\n",
+ "import pandas as pd"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "IczRXBXHjZzV",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:32:13.867299Z",
+ "iopub.status.busy": "2023-01-22T12:32:13.866000Z",
+ "iopub.status.idle": "2023-01-22T12:32:16.353124Z",
+ "shell.execute_reply": "2023-01-22T12:32:16.352004Z",
+ "shell.execute_reply.started": "2023-01-22T12:32:13.867251Z"
+ },
+ "id": "IczRXBXHjZzV"
+ },
+ "outputs": [],
+ "source": [
+ "from IPython.display import display, clear_output\n",
+ "\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "from tqdm.notebook import tqdm\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.preprocessing import StandardScaler\n",
+ "\n",
+ "import torch\n",
+ "from torch import nn\n",
+ "from torch.nn import functional as F\n",
+ "from torch.utils.data import Dataset, DataLoader"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "mA1MfXOnjZzW",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:41:13.399626Z",
+ "iopub.status.busy": "2023-01-22T12:41:13.398452Z",
+ "iopub.status.idle": "2023-01-22T12:41:19.723408Z",
+ "shell.execute_reply": "2023-01-22T12:41:19.722114Z",
+ "shell.execute_reply.started": "2023-01-22T12:41:13.399496Z"
+ },
+ "id": "mA1MfXOnjZzW"
+ },
+ "outputs": [],
+ "source": [
+ "interactions_df = pd.read_csv('interactions_processed_kion.csv')\n",
+ "users_df = pd.read_csv('users_processed_kion.csv')\n",
+ "items_df = pd.read_csv('items_processed_kion.csv')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "G5cP9QcUjZzW",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 204
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:41:19.726341Z",
+ "iopub.status.busy": "2023-01-22T12:41:19.725645Z",
+ "iopub.status.idle": "2023-01-22T12:41:19.751544Z",
+ "shell.execute_reply": "2023-01-22T12:41:19.750286Z",
+ "shell.execute_reply.started": "2023-01-22T12:41:19.726296Z"
+ },
+ "id": "G5cP9QcUjZzW",
+ "outputId": "9fc311f0-6f5b-4327-9bbc-1f6bdee3f918"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " user_id | \n",
+ " item_id | \n",
+ " last_watch_dt | \n",
+ " total_dur | \n",
+ " watched_pct | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 176549 | \n",
+ " 9506 | \n",
+ " 2021-05-11 | \n",
+ " 4250 | \n",
+ " 72 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 699317 | \n",
+ " 1659 | \n",
+ " 2021-05-29 | \n",
+ " 8317 | \n",
+ " 100 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 656683 | \n",
+ " 7107 | \n",
+ " 2021-05-09 | \n",
+ " 10 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 864613 | \n",
+ " 7638 | \n",
+ " 2021-07-05 | \n",
+ " 14483 | \n",
+ " 100 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 964868 | \n",
+ " 9506 | \n",
+ " 2021-04-30 | \n",
+ " 6725 | \n",
+ " 100 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ "
\n",
+ "
\n",
+ " "
+ ],
+ "text/plain": [
+ " user_id item_id last_watch_dt total_dur watched_pct\n",
+ "0 176549 9506 2021-05-11 4250 72\n",
+ "1 699317 1659 2021-05-29 8317 100\n",
+ "2 656683 7107 2021-05-09 10 0\n",
+ "3 864613 7638 2021-07-05 14483 100\n",
+ "4 964868 9506 2021-04-30 6725 100"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "interactions_df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "b4omWvMOjZzX",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:41:21.721270Z",
+ "iopub.status.busy": "2023-01-22T12:41:21.720745Z",
+ "iopub.status.idle": "2023-01-22T12:41:22.116852Z",
+ "shell.execute_reply": "2023-01-22T12:41:22.115397Z",
+ "shell.execute_reply.started": "2023-01-22T12:41:21.721229Z"
+ },
+ "id": "b4omWvMOjZzX"
+ },
+ "outputs": [],
+ "source": [
+ "interactions_df = interactions_df[interactions_df['last_watch_dt'] < '2021-04-01']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "JAuH-fG0jZzX",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:41:23.195240Z",
+ "iopub.status.busy": "2023-01-22T12:41:23.194661Z",
+ "iopub.status.idle": "2023-01-22T12:41:23.202760Z",
+ "shell.execute_reply": "2023-01-22T12:41:23.201745Z",
+ "shell.execute_reply.started": "2023-01-22T12:41:23.195188Z"
+ },
+ "id": "JAuH-fG0jZzX",
+ "outputId": "3e259108-40e9-48fc-c212-1bbd7e9e21a1"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(263874, 5)"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "interactions_df.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "rWCoSNwWjZzX",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:41:25.368988Z",
+ "iopub.status.busy": "2023-01-22T12:41:25.367925Z",
+ "iopub.status.idle": "2023-01-22T12:41:25.558751Z",
+ "shell.execute_reply": "2023-01-22T12:41:25.557372Z",
+ "shell.execute_reply.started": "2023-01-22T12:41:25.368937Z"
+ },
+ "id": "rWCoSNwWjZzX",
+ "outputId": "c7738105-161d-4c43-9028-21b64809ad04"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "# users: 86614\n",
+ "# users with at least 5 interactions: 14563\n"
+ ]
+ }
+ ],
+ "source": [
+ "users_interactions_count_df = interactions_df.groupby(['user_id', 'item_id']).size().groupby('user_id').size()\n",
+ "print('# users: %d' % len(users_interactions_count_df))\n",
+ "users_with_enough_interactions_df = users_interactions_count_df[users_interactions_count_df >= 5].reset_index()[['user_id']]\n",
+ "print('# users with at least 5 interactions: %d' % len(users_with_enough_interactions_df))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "qDCcr1_UjZzY",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:41:27.227318Z",
+ "iopub.status.busy": "2023-01-22T12:41:27.226717Z",
+ "iopub.status.idle": "2023-01-22T12:41:27.326827Z",
+ "shell.execute_reply": "2023-01-22T12:41:27.325761Z",
+ "shell.execute_reply.started": "2023-01-22T12:41:27.227269Z"
+ },
+ "id": "qDCcr1_UjZzY",
+ "outputId": "cc44175d-eef0-42b9-839a-4c1a0efa5ce4"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "# of interactions: 263874\n",
+ "# of interactions from users with at least 5 interactions: 142670\n"
+ ]
+ }
+ ],
+ "source": [
+ "print('# of interactions: %d' % len(interactions_df))\n",
+ "interactions_from_selected_users_df = interactions_df.merge(users_with_enough_interactions_df, \n",
+ " how = 'right',\n",
+ " left_on = 'user_id',\n",
+ " right_on = 'user_id')\n",
+ "print('# of interactions from users with at least 5 interactions: %d' % len(interactions_from_selected_users_df))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "bs9IdB8fjZzY",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:41:30.431311Z",
+ "iopub.status.busy": "2023-01-22T12:41:30.430823Z",
+ "iopub.status.idle": "2023-01-22T12:41:30.436607Z",
+ "shell.execute_reply": "2023-01-22T12:41:30.435654Z",
+ "shell.execute_reply.started": "2023-01-22T12:41:30.431275Z"
+ },
+ "id": "bs9IdB8fjZzY"
+ },
+ "outputs": [],
+ "source": [
+ "import math"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "MTW_Y4iOjZzY",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 376
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:41:32.237281Z",
+ "iopub.status.busy": "2023-01-22T12:41:32.236079Z",
+ "iopub.status.idle": "2023-01-22T12:41:32.403346Z",
+ "shell.execute_reply": "2023-01-22T12:41:32.401909Z",
+ "shell.execute_reply.started": "2023-01-22T12:41:32.237217Z"
+ },
+ "id": "MTW_Y4iOjZzY",
+ "outputId": "8027a8a8-0bf9-4c97-9b69-5281653709c9"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "# of unique user/item interactions: 142670\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " user_id | \n",
+ " item_id | \n",
+ " watched_pct | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 21 | \n",
+ " 849 | \n",
+ " 6.375039 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 21 | \n",
+ " 4345 | \n",
+ " 6.658211 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 21 | \n",
+ " 10283 | \n",
+ " 6.658211 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 21 | \n",
+ " 12261 | \n",
+ " 6.658211 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 21 | \n",
+ " 15997 | \n",
+ " 6.658211 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 32 | \n",
+ " 952 | \n",
+ " 6.044394 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 32 | \n",
+ " 4382 | \n",
+ " 4.954196 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 32 | \n",
+ " 4807 | \n",
+ " 6.658211 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 32 | \n",
+ " 10436 | \n",
+ " 6.658211 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 32 | \n",
+ " 12132 | \n",
+ " 6.658211 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ "
\n",
+ "
\n",
+ " "
+ ],
+ "text/plain": [
+ " user_id item_id watched_pct\n",
+ "0 21 849 6.375039\n",
+ "1 21 4345 6.658211\n",
+ "2 21 10283 6.658211\n",
+ "3 21 12261 6.658211\n",
+ "4 21 15997 6.658211\n",
+ "5 32 952 6.044394\n",
+ "6 32 4382 4.954196\n",
+ "7 32 4807 6.658211\n",
+ "8 32 10436 6.658211\n",
+ "9 32 12132 6.658211"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def smooth_user_preference(x):\n",
+ " return math.log(1+x, 2)\n",
+ " \n",
+ "interactions_full_df = interactions_from_selected_users_df \\\n",
+ " .groupby(['user_id', 'item_id'])['watched_pct'].sum() \\\n",
+ " .apply(smooth_user_preference).reset_index()\n",
+ "print('# of unique user/item interactions: %d' % len(interactions_full_df))\n",
+ "interactions_full_df.head(10)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "wNyqdsCxjZzZ",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:41:34.443808Z",
+ "iopub.status.busy": "2023-01-22T12:41:34.443346Z",
+ "iopub.status.idle": "2023-01-22T12:41:34.651267Z",
+ "shell.execute_reply": "2023-01-22T12:41:34.650080Z",
+ "shell.execute_reply.started": "2023-01-22T12:41:34.443774Z"
+ },
+ "id": "wNyqdsCxjZzZ",
+ "outputId": "e2a2e169-78ef-4f8e-c099-eb56de49338e"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "# interactions on Train set: 114136\n",
+ "# interactions on Test set: 28534\n"
+ ]
+ }
+ ],
+ "source": [
+ "interactions_train_df, interactions_test_df = train_test_split(interactions_full_df,\n",
+ " stratify=interactions_full_df['user_id'], \n",
+ " test_size=0.20,\n",
+ " random_state=42)\n",
+ "\n",
+ "print('# interactions on Train set: %d' % len(interactions_train_df))\n",
+ "print('# interactions on Test set: %d' % len(interactions_test_df))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "v1M9fBagjZzZ",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:41:38.570246Z",
+ "iopub.status.busy": "2023-01-22T12:41:38.568905Z",
+ "iopub.status.idle": "2023-01-22T12:41:38.583223Z",
+ "shell.execute_reply": "2023-01-22T12:41:38.581705Z",
+ "shell.execute_reply.started": "2023-01-22T12:41:38.570182Z"
+ },
+ "id": "v1M9fBagjZzZ"
+ },
+ "outputs": [],
+ "source": [
+ "#Indexing by personId to speed up the searches during evaluation\n",
+ "interactions_full_indexed_df = interactions_full_df.set_index('user_id')\n",
+ "interactions_train_indexed_df = interactions_train_df.set_index('user_id')\n",
+ "interactions_test_indexed_df = interactions_test_df.set_index('user_id')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "Ra2TntFUjZzZ",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:41:42.934656Z",
+ "iopub.status.busy": "2023-01-22T12:41:42.934139Z",
+ "iopub.status.idle": "2023-01-22T12:41:42.940917Z",
+ "shell.execute_reply": "2023-01-22T12:41:42.939611Z",
+ "shell.execute_reply.started": "2023-01-22T12:41:42.934617Z"
+ },
+ "id": "Ra2TntFUjZzZ"
+ },
+ "outputs": [],
+ "source": [
+ "def get_items_interacted(person_id, interactions_df):\n",
+ " # Get the user's data and merge in the movie information.\n",
+ " interacted_items = interactions_df.loc[person_id]['item_id']\n",
+ " return set(interacted_items if type(interacted_items) == pd.Series else [interacted_items])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "xpP7YjhRjZzZ",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:41:53.435832Z",
+ "iopub.status.busy": "2023-01-22T12:41:53.435366Z",
+ "iopub.status.idle": "2023-01-22T12:41:53.455616Z",
+ "shell.execute_reply": "2023-01-22T12:41:53.454525Z",
+ "shell.execute_reply.started": "2023-01-22T12:41:53.435796Z"
+ },
+ "id": "xpP7YjhRjZzZ"
+ },
+ "outputs": [],
+ "source": [
+ "#Top-N accuracy metrics consts\n",
+ "EVAL_RANDOM_SAMPLE_NON_INTERACTED_ITEMS = 100\n",
+ "\n",
+ "class ModelEvaluator:\n",
+ "\n",
+ " def get_not_interacted_items_sample(self, person_id, sample_size, seed=42):\n",
+ " interacted_items = get_items_interacted(person_id, interactions_full_indexed_df)\n",
+ " all_items = set(articles_df['item_id'])\n",
+ " non_interacted_items = all_items - interacted_items\n",
+ "\n",
+ " random.seed(seed)\n",
+ " non_interacted_items_sample = random.sample(non_interacted_items, sample_size)\n",
+ " return set(non_interacted_items_sample)\n",
+ "\n",
+ " def _verify_hit_top_n(self, item_id, recommended_items, topn): \n",
+ " try:\n",
+ " index = next(i for i, c in enumerate(recommended_items) if c == item_id)\n",
+ " except:\n",
+ " index = -1\n",
+ " hit = int(index in range(0, topn))\n",
+ " return hit, index\n",
+ "\n",
+ " def evaluate_model_for_user(self, model, person_id):\n",
+ " #Getting the items in test set\n",
+ " interacted_values_testset = interactions_test_indexed_df.loc[person_id]\n",
+ " if type(interacted_values_testset['item_id']) == pd.Series:\n",
+ " person_interacted_items_testset = set(interacted_values_testset['item_id'])\n",
+ " else:\n",
+ " person_interacted_items_testset = set([int(interacted_values_testset['item_id'])]) \n",
+ " interacted_items_count_testset = len(person_interacted_items_testset) \n",
+ "\n",
+ " #Getting a ranked recommendation list from a model for a given user\n",
+ " person_recs_df = model.recommend_items(person_id, \n",
+ " items_to_ignore=get_items_interacted(person_id, \n",
+ " interactions_train_indexed_df), \n",
+ " topn=10000000000)\n",
+ "\n",
+ " hits_at_5_count = 0\n",
+ " hits_at_10_count = 0\n",
+ " #For each item the user has interacted in test set\n",
+ " for item_id in person_interacted_items_testset:\n",
+ " #Getting a random sample (100) items the user has not interacted \n",
+ " #(to represent items that are assumed to be no relevant to the user)\n",
+ " non_interacted_items_sample = self.get_not_interacted_items_sample(person_id, \n",
+ " sample_size=EVAL_RANDOM_SAMPLE_NON_INTERACTED_ITEMS, \n",
+ " seed=item_id%(2**32))\n",
+ "\n",
+ " #Combining the current interacted item with the 100 random items\n",
+ " items_to_filter_recs = non_interacted_items_sample.union(set([item_id]))\n",
+ "\n",
+ " #Filtering only recommendations that are either the interacted item or from a random sample of 100 non-interacted items\n",
+ " valid_recs_df = person_recs_df[person_recs_df['item_id'].isin(items_to_filter_recs)] \n",
+ " valid_recs = valid_recs_df['item_id'].values\n",
+ " #Verifying if the current interacted item is among the Top-N recommended items\n",
+ " hit_at_5, index_at_5 = self._verify_hit_top_n(item_id, valid_recs, 5)\n",
+ " hits_at_5_count += hit_at_5\n",
+ " hit_at_10, index_at_10 = self._verify_hit_top_n(item_id, valid_recs, 10)\n",
+ " hits_at_10_count += hit_at_10\n",
+ "\n",
+ " #Recall is the rate of the interacted items that are ranked among the Top-N recommended items, \n",
+ " #when mixed with a set of non-relevant items\n",
+ " recall_at_5 = hits_at_5_count / float(interacted_items_count_testset)\n",
+ " recall_at_10 = hits_at_10_count / float(interacted_items_count_testset)\n",
+ "\n",
+ " person_metrics = {'hits@5_count':hits_at_5_count, \n",
+ " 'hits@10_count':hits_at_10_count, \n",
+ " 'interacted_count': interacted_items_count_testset,\n",
+ " 'recall@5': recall_at_5,\n",
+ " 'recall@10': recall_at_10}\n",
+ " return person_metrics\n",
+ "\n",
+ " def evaluate_model(self, model):\n",
+ " #print('Running evaluation for users')\n",
+ " people_metrics = []\n",
+ " for idx, person_id in enumerate(tqdm(list(interactions_test_indexed_df.index.unique().values))):\n",
+ " #if idx % 100 == 0 and idx > 0:\n",
+ " # print('%d users processed' % idx)\n",
+ " person_metrics = self.evaluate_model_for_user(model, person_id) \n",
+ " person_metrics['user_id'] = person_id\n",
+ " people_metrics.append(person_metrics)\n",
+ " print('%d users processed' % idx)\n",
+ "\n",
+ " detailed_results_df = pd.DataFrame(people_metrics) \\\n",
+ " .sort_values('interacted_count', ascending=False)\n",
+ " \n",
+ " global_recall_at_5 = detailed_results_df['hits@5_count'].sum() / float(detailed_results_df['interacted_count'].sum())\n",
+ " global_recall_at_10 = detailed_results_df['hits@10_count'].sum() / float(detailed_results_df['interacted_count'].sum())\n",
+ " \n",
+ " global_metrics = {'modelName': model.get_model_name(),\n",
+ " 'recall@5': global_recall_at_5,\n",
+ " 'recall@10': global_recall_at_10} \n",
+ " return global_metrics, detailed_results_df\n",
+ " \n",
+ "model_evaluator = ModelEvaluator() "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "bt-Ko_HMjZza",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:41:57.779034Z",
+ "iopub.status.busy": "2023-01-22T12:41:57.777417Z",
+ "iopub.status.idle": "2023-01-22T12:41:57.787389Z",
+ "shell.execute_reply": "2023-01-22T12:41:57.785909Z",
+ "shell.execute_reply.started": "2023-01-22T12:41:57.778960Z"
+ },
+ "id": "bt-Ko_HMjZza"
+ },
+ "outputs": [],
+ "source": [
+ "from IPython.display import display, clear_output\n",
+ "\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "from tqdm.notebook import tqdm\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.preprocessing import StandardScaler\n",
+ "\n",
+ "import torch\n",
+ "from torch import nn\n",
+ "from torch.nn import functional as F\n",
+ "from torch.utils.data import Dataset, DataLoader"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "6ySqiCo5jZza",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:42:03.271305Z",
+ "iopub.status.busy": "2023-01-22T12:42:03.270810Z",
+ "iopub.status.idle": "2023-01-22T12:42:03.278535Z",
+ "shell.execute_reply": "2023-01-22T12:42:03.277141Z",
+ "shell.execute_reply.started": "2023-01-22T12:42:03.271268Z"
+ },
+ "id": "6ySqiCo5jZza"
+ },
+ "outputs": [],
+ "source": [
+ "\n",
+ "# Constants\n",
+ "SEED = 42 # random seed for reproducibility\n",
+ "LR = 1e-3 # learning rate, controls the speed of the training\n",
+ "WEIGHT_DECAY = 0.01 # lambda for L2 reg. ()\n",
+ "NUM_EPOCHS = 200 # num training epochs (how many times each instance will be processed)\n",
+ "GAMMA = 0.9995 # learning rate scheduler parameter\n",
+ "BATCH_SIZE = 3000 # training batch size\n",
+ "EVAL_BATCH_SIZE = 3000 # evaluation batch size.\n",
+ "DEVICE = 'cuda' #'cuda' # device to make the calculations on"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "FtzzvibljZza",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:42:05.933060Z",
+ "iopub.status.busy": "2023-01-22T12:42:05.931911Z",
+ "iopub.status.idle": "2023-01-22T12:42:05.969002Z",
+ "shell.execute_reply": "2023-01-22T12:42:05.967458Z",
+ "shell.execute_reply.started": "2023-01-22T12:42:05.933000Z"
+ },
+ "id": "FtzzvibljZza"
+ },
+ "outputs": [],
+ "source": [
+ "total_df = interactions_train_df.append(interactions_test_indexed_df.reset_index())\n",
+ "total_df['user_id'], users_keys = total_df.user_id.factorize()\n",
+ "total_df['item_id'], items_keys = total_df.item_id.factorize()\n",
+ "\n",
+ "train_encoded = total_df.iloc[:len(interactions_train_df)].values\n",
+ "test_encoded = total_df.iloc[len(interactions_train_df):].values"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "crbEdHiJjZza",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:42:09.354000Z",
+ "iopub.status.busy": "2023-01-22T12:42:09.352465Z",
+ "iopub.status.idle": "2023-01-22T12:42:09.967185Z",
+ "shell.execute_reply": "2023-01-22T12:42:09.965725Z",
+ "shell.execute_reply.started": "2023-01-22T12:42:09.353932Z"
+ },
+ "id": "crbEdHiJjZza"
+ },
+ "outputs": [],
+ "source": [
+ "from scipy.sparse import csr_matrix\n",
+ "shape = [int(total_df['user_id'].max()+1), int(total_df['item_id'].max()+1)]\n",
+ "X_train = csr_matrix((train_encoded[:, 2], (train_encoded[:, 0], train_encoded[:, 1])), shape=shape).toarray()\n",
+ "X_test = csr_matrix((test_encoded[:, 2], (test_encoded[:, 0], test_encoded[:, 1])), shape=shape).toarray()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "sFeJZsDJjZzb",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:42:12.745785Z",
+ "iopub.status.busy": "2023-01-22T12:42:12.745283Z",
+ "iopub.status.idle": "2023-01-22T12:42:12.754320Z",
+ "shell.execute_reply": "2023-01-22T12:42:12.752855Z",
+ "shell.execute_reply.started": "2023-01-22T12:42:12.745745Z"
+ },
+ "id": "sFeJZsDJjZzb"
+ },
+ "outputs": [],
+ "source": [
+ "# Initialize the DataObject, which must return an element (features vector x and target value y)\n",
+ "# for a given idx. This class must also have a length atribute\n",
+ "class UserOrientedDataset(Dataset):\n",
+ " def __init__(self, X):\n",
+ " super().__init__() # to initialize the parent class\n",
+ " self.X = X.astype(np.float32)\n",
+ " self.len = len(X)\n",
+ "\n",
+ " def __len__(self): # We use __func__ for implementing in-built python functions\n",
+ " return self.len\n",
+ "\n",
+ " def __getitem__(self, index):\n",
+ " return self.X[index]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "AoCCUSpUjZzb",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:42:16.254953Z",
+ "iopub.status.busy": "2023-01-22T12:42:16.254416Z",
+ "iopub.status.idle": "2023-01-22T12:42:17.434704Z",
+ "shell.execute_reply": "2023-01-22T12:42:17.433103Z",
+ "shell.execute_reply.started": "2023-01-22T12:42:16.254903Z"
+ },
+ "id": "AoCCUSpUjZzb"
+ },
+ "outputs": [],
+ "source": [
+ "# Initialize DataLoaders - objects, which sample instances from DataObject-s\n",
+ "train_dl = DataLoader(\n",
+ " UserOrientedDataset(X_train),\n",
+ " batch_size = BATCH_SIZE,\n",
+ " shuffle = True\n",
+ ")\n",
+ "\n",
+ "test_dl = DataLoader(\n",
+ " UserOrientedDataset(X_test),\n",
+ " batch_size = EVAL_BATCH_SIZE,\n",
+ " shuffle = False\n",
+ ")\n",
+ "\n",
+ "dls = {'train': train_dl, 'test': test_dl}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "id": "b94CXGocjZzb",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:53:12.965059Z",
+ "iopub.status.busy": "2023-01-22T12:53:12.964527Z",
+ "iopub.status.idle": "2023-01-22T12:53:12.975037Z",
+ "shell.execute_reply": "2023-01-22T12:53:12.973690Z",
+ "shell.execute_reply.started": "2023-01-22T12:53:12.965016Z"
+ },
+ "id": "b94CXGocjZzb"
+ },
+ "outputs": [],
+ "source": [
+ "class Model(nn.Module):\n",
+ " def __init__(self, in_and_out_features = 8287):\n",
+ " super().__init__()\n",
+ " self.in_and_out_features = in_and_out_features\n",
+ " self.hidden_size = 500\n",
+ "\n",
+ " self.sequential = nn.Sequential( \n",
+ " nn.Linear(in_and_out_features, self.hidden_size), \n",
+ " nn.ReLU(), \n",
+ " nn.Linear(self.hidden_size, in_and_out_features) # Another Linear transformation\n",
+ " )\n",
+ "\n",
+ " def forward(self, x): # In the forward function, you define how your model runs, from input to output \n",
+ " x = self.sequential(x)\n",
+ " return x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "id": "aY_vqVZLjZzb",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:54:25.315144Z",
+ "iopub.status.busy": "2023-01-22T12:54:25.314623Z",
+ "iopub.status.idle": "2023-01-22T12:54:26.136714Z",
+ "shell.execute_reply": "2023-01-22T12:54:26.135715Z",
+ "shell.execute_reply.started": "2023-01-22T12:54:25.315101Z"
+ },
+ "id": "aY_vqVZLjZzb"
+ },
+ "outputs": [],
+ "source": [
+ "torch.manual_seed(SEED) # Fix random seed to have reproducible weights of model layers\n",
+ "\n",
+ "model = Model()\n",
+ "model.to(DEVICE)\n",
+ "\n",
+ "# Initialize GD method, which will update the weights of the model\n",
+ "optimizer = torch.optim.AdamW(model.parameters(), lr=LR, weight_decay=WEIGHT_DECAY)\n",
+ "# Initialize learning rate scheduler, which will decrease LR according to some rule\n",
+ "scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=GAMMA)\n",
+ "\n",
+ "def rmse_for_sparse(x_pred, x_true):\n",
+ " mask = (x_true > 0)\n",
+ " sq_diff = (x_pred * mask - x_true) ** 2\n",
+ " mse = sq_diff.sum() / mask.sum()\n",
+ " return mse ** (1/2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "id": "LdlKerxfjZzb",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 419
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:54:33.544338Z",
+ "iopub.status.busy": "2023-01-22T12:54:33.543734Z"
+ },
+ "id": "LdlKerxfjZzb",
+ "outputId": "0bc103bb-151d-449f-b7b2-f670b8970d92"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Epoch | \n",
+ " Train RMSE | \n",
+ " Test RMSE | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 0 | \n",
+ " 2.315015 | \n",
+ " 2.295504 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 1 | \n",
+ " 2.191636 | \n",
+ " 2.224912 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 2 | \n",
+ " 1.955497 | \n",
+ " 2.108439 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 3 | \n",
+ " 1.836119 | \n",
+ " 2.027701 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 4 | \n",
+ " 1.736783 | \n",
+ " 2.026640 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 195 | \n",
+ " 195 | \n",
+ " 0.288658 | \n",
+ " 1.330020 | \n",
+ "
\n",
+ " \n",
+ " | 196 | \n",
+ " 196 | \n",
+ " 0.277917 | \n",
+ " 1.331115 | \n",
+ "
\n",
+ " \n",
+ " | 197 | \n",
+ " 197 | \n",
+ " 0.307082 | \n",
+ " 1.330125 | \n",
+ "
\n",
+ " \n",
+ " | 198 | \n",
+ " 198 | \n",
+ " 0.302980 | \n",
+ " 1.331673 | \n",
+ "
\n",
+ " \n",
+ " | 199 | \n",
+ " 199 | \n",
+ " 0.307337 | \n",
+ " 1.329725 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
200 rows × 3 columns
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ "
\n",
+ "
\n",
+ " "
+ ],
+ "text/plain": [
+ " Epoch Train RMSE Test RMSE\n",
+ "0 0 2.315015 2.295504\n",
+ "1 1 2.191636 2.224912\n",
+ "2 2 1.955497 2.108439\n",
+ "3 3 1.836119 2.027701\n",
+ "4 4 1.736783 2.026640\n",
+ ".. ... ... ...\n",
+ "195 195 0.288658 1.330020\n",
+ "196 196 0.277917 1.331115\n",
+ "197 197 0.307082 1.330125\n",
+ "198 198 0.302980 1.331673\n",
+ "199 199 0.307337 1.329725\n",
+ "\n",
+ "[200 rows x 3 columns]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Training loop\n",
+ "metrics_dict = {\n",
+ " \"Epoch\": [],\n",
+ " \"Train RMSE\": [],\n",
+ " \"Test RMSE\": [],\n",
+ "}\n",
+ "\n",
+ "# Train loop\n",
+ "for epoch in range(NUM_EPOCHS):\n",
+ " metrics_dict[\"Epoch\"].append(epoch)\n",
+ " for stage in ['train', 'test']:\n",
+ " with torch.set_grad_enabled(stage == 'train'): # Whether to start building a graph for a backward pass\n",
+ " if stage == 'train':\n",
+ " model.train() # Enable some \"special\" layers (will speak about later)\n",
+ " else:\n",
+ " model.eval() # Disable some \"special\" layers (will speak about later)\n",
+ "\n",
+ " loss_at_stage = 0 \n",
+ " for batch in dls[stage]:\n",
+ " batch = batch.to(DEVICE)\n",
+ " x_pred = model(batch) # forward pass: model(x_batch) -> calls forward()\n",
+ " loss = rmse_for_sparse(x_pred, batch) # ¡Important! y_pred is always the first arg\n",
+ " if stage == \"train\":\n",
+ " loss.backward() # Calculate the gradients of all the parameters wrt loss\n",
+ " optimizer.step() # Update the parameters\n",
+ " scheduler.step()\n",
+ " optimizer.zero_grad() # Zero the saved gradient\n",
+ " loss_at_stage += loss.item() * len(batch)\n",
+ " rmse_at_stage = (loss_at_stage / len(dls[stage].dataset)) ** (1/2)\n",
+ " metrics_dict[f\"{stage.title()} RMSE\"].append(rmse_at_stage)\n",
+ " \n",
+ " if (epoch == NUM_EPOCHS - 1) or epoch % 10 == 9:\n",
+ " clear_output(wait=True)\n",
+ " display(pd.DataFrame(metrics_dict))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "ZXCPjyMajZzb",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "ZXCPjyMajZzb",
+ "outputId": "a0448c4f-5e53-409b-c277-fc704e617202"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "tensor([[ 0.3084, 2.5601, 1.0144, ..., -0.0948, -0.1467, 0.3106],\n",
+ " [ 0.1575, 0.8934, 0.1315, ..., -0.1049, 0.0096, 0.0350],\n",
+ " [ 0.6704, 1.5142, 0.6962, ..., -0.2259, -0.0353, 0.0676],\n",
+ " ...,\n",
+ " [ 0.3153, 1.1243, 0.1393, ..., -0.1222, -0.1398, 0.0617],\n",
+ " [ 0.3214, 1.9313, 0.3253, ..., -0.1548, -0.0918, -0.0392],\n",
+ " [ 0.3434, 0.9318, -0.0341, ..., -0.1714, -0.0446, 0.1267]],\n",
+ " device='cuda:0')"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "with torch.no_grad():\n",
+ " X_pred = model(torch.Tensor(X_test).to(DEVICE))\n",
+ "X_pred"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "bkSfO9fgjZzc",
+ "metadata": {
+ "id": "bkSfO9fgjZzc"
+ },
+ "outputs": [],
+ "source": [
+ "class AERecommender:\n",
+ " \n",
+ " MODEL_NAME = 'Autoencoder'\n",
+ " \n",
+ " def __init__(self, X_preds, X_train_and_val, X_test):\n",
+ "\n",
+ " self.X_preds = X_preds.cpu().detach().numpy()\n",
+ " self.X_train_and_val = X_train_and_val\n",
+ " self.X_test = X_test\n",
+ " \n",
+ " def get_model_name(self):\n",
+ " return self.MODEL_NAME\n",
+ " \n",
+ " def recommend_items(self, user_id, items_to_select_idx, topn=10, verbose=False):\n",
+ " user_preds = self.X_preds[user_id][items_to_select_idx]\n",
+ " items_idx = items_to_select_idx[np.argsort(-user_preds)[:topn]]\n",
+ "\n",
+ " # Recommend the highest predicted rating movies that the user hasn't seen yet.\n",
+ " return items_idx\n",
+ "\n",
+ " def evaluate(self, size=100):\n",
+ "\n",
+ " X_total = self.X_train_and_val + self.X_test\n",
+ "\n",
+ " true_5 = []\n",
+ " true_10 = []\n",
+ "\n",
+ " for user_id in range(len(X_test)):\n",
+ " non_zero = np.argwhere(self.X_test[user_id] > 0).ravel()\n",
+ " all_nonzero = np.argwhere(X_total[user_id] > 0).ravel()\n",
+ " select_from = np.setdiff1d(np.arange(X_total.shape[1]), all_nonzero)\n",
+ "\n",
+ " for non_zero_idx in non_zero:\n",
+ " random_non_interacted_100_items = np.random.choice(select_from, size=20, replace=False)\n",
+ " preds = self.recommend_items(user_id, np.append(random_non_interacted_100_items, non_zero_idx), topn=10)\n",
+ " true_5.append(non_zero_idx in preds[:5])\n",
+ " true_10.append(non_zero_idx in preds)\n",
+ "\n",
+ " return {\"recall@5\": np.mean(true_5), \"recall@10\": np.mean(true_10)}\n",
+ " \n",
+ "ae_recommender_model = AERecommender(X_pred, X_train, X_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "yRBbD9xmjZzc",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "yRBbD9xmjZzc",
+ "outputId": "d407d2b7-ee44-4299-9b29-046f41deb396"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'recall@5': 0.08641891035330142, 'recall@10': 0.25274264483602643}"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ae_global_metrics = ae_recommender_model.evaluate()\n",
+ "ae_global_metrics"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ydc-4MJn-KFM",
+ "metadata": {
+ "id": "ydc-4MJn-KFM"
+ },
+ "source": [
+ "Проведем эксперименты с моделями и гиперпараметрами"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "GZfxQH7Z-hMK",
+ "metadata": {
+ "id": "GZfxQH7Z-hMK"
+ },
+ "outputs": [],
+ "source": [
+ "def train_model():\n",
+ " torch.manual_seed(SEED) # Fix random seed to have reproducible weights of model layers\n",
+ "\n",
+ " model = Model()\n",
+ " model.to(DEVICE)\n",
+ "\n",
+ " # Initialize GD method, which will update the weights of the model\n",
+ " optimizer = torch.optim.AdamW(model.parameters(), lr=LR, weight_decay=WEIGHT_DECAY)\n",
+ " # Initialize learning rate scheduler, which will decrease LR according to some rule\n",
+ " scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=GAMMA)\n",
+ "\n",
+ "\n",
+ " # Training loop\n",
+ " metrics_dict = {\n",
+ " \"Epoch\": [],\n",
+ " \"Train RMSE\": [],\n",
+ " \"Test RMSE\": [],\n",
+ " }\n",
+ "\n",
+ " # Train loop\n",
+ " for epoch in range(NUM_EPOCHS):\n",
+ " metrics_dict[\"Epoch\"].append(epoch)\n",
+ " for stage in ['train', 'test']:\n",
+ " with torch.set_grad_enabled(stage == 'train'): # Whether to start building a graph for a backward pass\n",
+ " if stage == 'train':\n",
+ " model.train() # Enable some \"special\" layers (will speak about later)\n",
+ " else:\n",
+ " model.eval() # Disable some \"special\" layers (will speak about later)\n",
+ "\n",
+ " loss_at_stage = 0 \n",
+ " for batch in dls[stage]:\n",
+ " batch = batch.to(DEVICE)\n",
+ " x_pred = model(batch) # forward pass: model(x_batch) -> calls forward()\n",
+ " loss = rmse_for_sparse(x_pred, batch) # ¡Important! y_pred is always the first arg\n",
+ " if stage == \"train\":\n",
+ " loss.backward() # Calculate the gradients of all the parameters wrt loss\n",
+ " optimizer.step() # Update the parameters\n",
+ " scheduler.step()\n",
+ " optimizer.zero_grad() # Zero the saved gradient\n",
+ " loss_at_stage += loss.item() * len(batch)\n",
+ " rmse_at_stage = (loss_at_stage / len(dls[stage].dataset)) ** (1/2)\n",
+ " metrics_dict[f\"{stage.title()} RMSE\"].append(rmse_at_stage)\n",
+ " \n",
+ " with torch.no_grad():\n",
+ " X_pred = model(torch.Tensor(X_test).to(DEVICE))\n",
+ "\n",
+ " ae_recommender_model = AERecommender(X_pred, X_train, X_train)\n",
+ "\n",
+ " ae_global_metrics = ae_recommender_model.evaluate()\n",
+ "\n",
+ " metrics_dict[\"recall@5\"] = ae_global_metrics[\"recall@5\"]\n",
+ " metrics_dict[\"recall@10\"] = ae_global_metrics[\"recall@10\"]\n",
+ "\n",
+ "\n",
+ " return metrics_dict"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "iYS06bYkA5uD",
+ "metadata": {
+ "id": "iYS06bYkA5uD"
+ },
+ "source": [
+ "C изначальной архитектурой"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "s69HDH9P-PZl",
+ "metadata": {
+ "id": "s69HDH9P-PZl"
+ },
+ "outputs": [],
+ "source": [
+ "class Model(nn.Module):\n",
+ " def __init__(self, in_and_out_features = 8287):\n",
+ " super().__init__()\n",
+ " self.in_and_out_features = in_and_out_features\n",
+ " self.hidden_size = 500\n",
+ "\n",
+ " self.sequential = nn.Sequential( \n",
+ " nn.Linear(in_and_out_features, self.hidden_size), \n",
+ " nn.ReLU(), \n",
+ " nn.Linear(self.hidden_size, in_and_out_features) # Another Linear transformation\n",
+ " )\n",
+ "\n",
+ " def forward(self, x): # In the forward function, you define how your model runs, from input to output \n",
+ " x = self.sequential(x)\n",
+ " return x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "TytUsH6vA9Wo",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "TytUsH6vA9Wo",
+ "outputId": "464573c4-6c3f-4b04-ac32-3ea09fb84f08"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "lr:0.001 ne:0.001 bs:3000 ....\n",
+ "lr:0.001 ne:0.001 bs:4500 ....\n",
+ "lr:0.001 ne:0.001 bs:3000 ....\n",
+ "lr:0.001 ne:0.001 bs:4500 ....\n",
+ "lr:0.0003 ne:0.0003 bs:3000 ....\n",
+ "lr:0.0003 ne:0.0003 bs:4500 ....\n",
+ "lr:0.0003 ne:0.0003 bs:3000 ....\n",
+ "lr:0.0003 ne:0.0003 bs:4500 ....\n"
+ ]
+ }
+ ],
+ "source": [
+ "first_arch_metrics = {}\n",
+ "\n",
+ "for lr in [0.001, 0.0003]:\n",
+ " for ne in [100, 200]:\n",
+ " for bs in [3000, 4500]:\n",
+ " \n",
+ " print(f\"lr:{lr} ne:{lr} bs:{bs} ....\" )\n",
+ "\n",
+ " LR = lr\n",
+ " NUM_EPOCHS = ne\n",
+ " BATCH_SIZE = bs\n",
+ "\n",
+ " first_arch_metrics[f\"lr:{lr} ne:{ne} bs:{bs}\"] = train_model()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "HnEm5GLZDAuC",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "HnEm5GLZDAuC",
+ "outputId": "d652f3d6-c81a-4e35-e070-7350ce956120"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "lr:0.001 ne:100 bs:3000 0.0856485318926931 0.24734999561176826\n",
+ "lr:0.001 ne:100 bs:4500 0.08339590626737009 0.2456629642992969\n",
+ "lr:0.001 ne:200 bs:3000 0.08698450466615308 0.2526061220708553\n",
+ "lr:0.001 ne:200 bs:4500 0.0867699688923128 0.2529181741055321\n",
+ "lr:0.0003 ne:100 bs:3000 0.08751109247467015 0.25363979443572215\n",
+ "lr:0.0003 ne:100 bs:4500 0.08879830711771187 0.25470272167883995\n",
+ "lr:0.0003 ne:200 bs:3000 0.08135781641588735 0.23005061093937415\n",
+ "lr:0.0003 ne:200 bs:4500 0.08193316235482266 0.23188391664310024\n"
+ ]
+ }
+ ],
+ "source": [
+ "for i in first_arch_metrics.keys():\n",
+ " print(i, first_arch_metrics[i]['recall@5'], first_arch_metrics[i]['recall@10'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "ZaDleIoiPyCJ",
+ "metadata": {
+ "id": "ZaDleIoiPyCJ"
+ },
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "DOeEZG5_A9p4",
+ "metadata": {
+ "id": "DOeEZG5_A9p4"
+ },
+ "source": [
+ "Усложним архитектуру"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "id": "rTOhYgiX-fEr",
+ "metadata": {
+ "id": "rTOhYgiX-fEr"
+ },
+ "outputs": [],
+ "source": [
+ "class Model(nn.Module):\n",
+ " def __init__(self, in_and_out_features = 8287):\n",
+ " super().__init__()\n",
+ " self.in_and_out_features = in_and_out_features\n",
+ " self.hidden_size = 512\n",
+ "\n",
+ " self.sequential = nn.Sequential( \n",
+ " nn.Linear(in_and_out_features, 4096), \n",
+ " nn.ReLU(), \n",
+ "\n",
+ " nn.Linear(4096, self.hidden_size), \n",
+ " nn.ReLU(),\n",
+ "\n",
+ " nn.Linear(self.hidden_size, 4096), \n",
+ " nn.ReLU(), \n",
+ "\n",
+ " nn.Linear(4096, in_and_out_features) # Another Linear transformation\n",
+ " )\n",
+ "\n",
+ " def forward(self, x): # In the forward function, you define how your model runs, from input to output \n",
+ " x = self.sequential(x)\n",
+ " return x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "id": "TPRykgiN-fNe",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "TPRykgiN-fNe",
+ "outputId": "a32247b1-3a86-479d-aa0f-df75119e18e2"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "lr:0.001 ne:100 bs:3000 ....\n",
+ "lr:0.001 ne:100 bs:4500 ....\n",
+ "lr:0.001 ne:200 bs:3000 ....\n",
+ "lr:0.001 ne:200 bs:4500 ....\n",
+ "lr:0.0003 ne:100 bs:3000 ....\n",
+ "lr:0.0003 ne:100 bs:4500 ....\n",
+ "lr:0.0003 ne:200 bs:3000 ....\n",
+ "lr:0.0003 ne:200 bs:4500 ....\n"
+ ]
+ }
+ ],
+ "source": [
+ "second_arch_metrics = {}\n",
+ "\n",
+ "for lr in [0.001, 0.0003]:\n",
+ " for ne in [100, 200]:\n",
+ " for bs in [3000, 4500]:\n",
+ " \n",
+ " print(f\"lr:{lr} ne:{ne} bs:{bs} ....\" )\n",
+ "\n",
+ " LR = lr\n",
+ " NUM_EPOCHS = ne\n",
+ " BATCH_SIZE = bs\n",
+ "\n",
+ " second_arch_metrics[f\"lr:{lr} ne:{ne} bs:{bs}\"] = train_model()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "id": "wMGBNnslD4ax",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "wMGBNnslD4ax",
+ "outputId": "76b97e64-342e-4ef5-b71e-f6a88c7daf36"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "lr:0.001 ne:100 bs:3000 0.14852701688006476 0.363608881781037\n",
+ "lr:0.001 ne:100 bs:4500 0.14894633680166167 0.3632090651116074\n",
+ "lr:0.001 ne:200 bs:3000 0.15524588725169922 0.35925965654772934\n",
+ "lr:0.001 ne:200 bs:4500 0.1548265673301023 0.35853803621753927\n",
+ "lr:0.0003 ne:100 bs:3000 0.15456327342584375 0.37245360663890703\n",
+ "lr:0.0003 ne:100 bs:4500 0.15338332666972218 0.3731167172125952\n",
+ "lr:0.0003 ne:200 bs:3000 0.15394892098257384 0.3672852448145728\n",
+ "lr:0.0003 ne:200 bs:4500 0.1538026465913191 0.36697319277989604\n"
+ ]
+ }
+ ],
+ "source": [
+ "for i in second_arch_metrics.keys():\n",
+ " print(i, second_arch_metrics[i]['recall@5'], second_arch_metrics[i]['recall@10'])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "k6zRyd-uD0Fy",
+ "metadata": {
+ "id": "k6zRyd-uD0Fy"
+ },
+ "source": [
+ "Добавим еще слоев: "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "id": "08GqJ7iu-fPo",
+ "metadata": {
+ "id": "08GqJ7iu-fPo"
+ },
+ "outputs": [],
+ "source": [
+ "class Model(nn.Module):\n",
+ " def __init__(self, in_and_out_features = 8287):\n",
+ " super().__init__()\n",
+ " self.in_and_out_features = in_and_out_features\n",
+ " self.hidden_size = 512\n",
+ "\n",
+ " self.sequential = nn.Sequential( \n",
+ " nn.Linear(in_and_out_features, 6000), \n",
+ " nn.ReLU(), \n",
+ "\n",
+ " nn.Linear(6000, 3000), \n",
+ " nn.ReLU(),\n",
+ "\n",
+ " nn.Linear(3000, 1024), \n",
+ " nn.ReLU(),\n",
+ "\n",
+ " nn.Linear(1024, self.hidden_size), \n",
+ " nn.ReLU(),\n",
+ "\n",
+ " nn.Linear(self.hidden_size, 1024), \n",
+ " nn.ReLU(),\n",
+ "\n",
+ " nn.Linear(1024, 3000), \n",
+ " nn.ReLU(),\n",
+ "\n",
+ " nn.Linear(3000, 6000), \n",
+ " nn.ReLU(), \n",
+ "\n",
+ " nn.Linear(6000, in_and_out_features) # Another Linear transformation\n",
+ " )\n",
+ "\n",
+ " def forward(self, x): # In the forward function, you define how your model runs, from input to output \n",
+ " x = self.sequential(x)\n",
+ " return x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "id": "AV4bbBpd-fSg",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "AV4bbBpd-fSg",
+ "outputId": "2a985b96-d452-490b-d73c-419e0341b0d8"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "lr:0.0003 ne:100 bs:3000 ....\n",
+ "lr:0.0003 ne:100 bs:4500 ....\n",
+ "lr:0.0003 ne:200 bs:3000 ....\n",
+ "lr:0.0003 ne:200 bs:4500 ....\n"
+ ]
+ }
+ ],
+ "source": [
+ "third_arch_metrics = {}\n",
+ "\n",
+ "for lr in [0.0003]:\n",
+ " for ne in [100, 200]:\n",
+ " for bs in [3000, 4500]:\n",
+ " \n",
+ " print(f\"lr:{lr} ne:{ne} bs:{bs} ....\" )\n",
+ "\n",
+ " LR = lr\n",
+ " NUM_EPOCHS = ne\n",
+ " BATCH_SIZE = bs\n",
+ "\n",
+ " third_arch_metrics[f\"lr:{lr} ne:{ne} bs:{bs}\"] = train_model()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "id": "v1gCEb8aFQc-",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "v1gCEb8aFQc-",
+ "outputId": "f7084cf6-b161-4951-cc6d-1abe32766205"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "lr:0.0003 ne:100 bs:3000 0.24635532975123603 0.6131237383833754\n",
+ "lr:0.0003 ne:100 bs:4500 0.2430007703784606 0.6135430583049724\n",
+ "lr:0.0003 ne:200 bs:3000 0.2589251757730602 0.6017533423698401\n",
+ "lr:0.0003 ne:200 bs:4500 0.2589739339034784 0.6040157196212469\n"
+ ]
+ }
+ ],
+ "source": [
+ "for i in third_arch_metrics.keys():\n",
+ " print(i, third_arch_metrics[i]['recall@5'], third_arch_metrics[i]['recall@10'])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "k0qGe8sVaZq4",
+ "metadata": {
+ "id": "k0qGe8sVaZq4"
+ },
+ "source": [
+ "Модель обучена. Лучшей моделью является модель последней архитектуры , со следующими подобранными гипперпараметрам:\n",
+ "\n",
+ "* LR: 0.0003\n",
+ "* NUM_EPOCHS: 200\n",
+ "* BATCH_SIZE: 4500\n",
+ "\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "sd7WVXXYo7H1",
+ "metadata": {
+ "id": "sd7WVXXYo7H1"
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "accelerator": "GPU",
+ "colab": {
+ "provenance": []
+ },
+ "gpuClass": "standard",
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.15"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/hw_5_dssm.ipynb b/hw_5_dssm.ipynb
new file mode 100644
index 00000000..258bae7e
--- /dev/null
+++ b/hw_5_dssm.ipynb
@@ -0,0 +1,4034 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:22.841107Z",
+ "iopub.status.busy": "2023-01-22T16:23:22.840365Z",
+ "iopub.status.idle": "2023-01-22T16:23:22.850076Z",
+ "shell.execute_reply": "2023-01-22T16:23:22.848844Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:22.841044Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import ast\n",
+ "import json\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "import os\n",
+ "import pandas as pd\n",
+ "import pickle\n",
+ "import tensorflow as tf\n",
+ "import tensorflow.keras.backend as K\n",
+ "import warnings\n",
+ "warnings.filterwarnings('ignore')\n",
+ "\n",
+ "from collections import Counter\n",
+ "from random import randint, random\n",
+ "from scipy.sparse import coo_matrix, hstack\n",
+ "from sklearn.metrics.pairwise import euclidean_distances, cosine_distances, cosine_similarity\n",
+ "from sklearn.metrics.pairwise import euclidean_distances as ED\n",
+ "from tensorflow import keras\n",
+ "from tqdm import tqdm"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:39:51.661446Z",
+ "start_time": "2021-10-28T18:39:51.563879Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:22.852847Z",
+ "iopub.status.busy": "2023-01-22T16:23:22.851743Z",
+ "iopub.status.idle": "2023-01-22T16:23:29.088896Z",
+ "shell.execute_reply": "2023-01-22T16:23:29.087873Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:22.852800Z"
+ },
+ "id": "25508632"
+ },
+ "outputs": [],
+ "source": [
+ "interactions_df = pd.read_csv('interactions_processed_kion.csv')\n",
+ "users_df = pd.read_csv('users_processed_kion.csv')\n",
+ "items_df = pd.read_csv('items_processed_kion.csv')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:40:35.447336Z",
+ "start_time": "2021-10-28T18:40:35.434541Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:29.097384Z",
+ "iopub.status.busy": "2023-01-22T16:23:29.094877Z",
+ "iopub.status.idle": "2023-01-22T16:23:29.123826Z",
+ "shell.execute_reply": "2023-01-22T16:23:29.123005Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:29.097341Z"
+ },
+ "id": "f5eacb31",
+ "outputId": "37b5c35b-4f4b-48ea-9012-a6ce7eed31c7"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " user_id | \n",
+ " age | \n",
+ " income | \n",
+ " sex | \n",
+ " kids_flg | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 973171 | \n",
+ " age_25_34 | \n",
+ " income_60_90 | \n",
+ " M | \n",
+ " True | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 962099 | \n",
+ " age_18_24 | \n",
+ " income_20_40 | \n",
+ " M | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1047345 | \n",
+ " age_45_54 | \n",
+ " income_40_60 | \n",
+ " F | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 721985 | \n",
+ " age_45_54 | \n",
+ " income_20_40 | \n",
+ " F | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 704055 | \n",
+ " age_35_44 | \n",
+ " income_60_90 | \n",
+ " F | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " user_id age income sex kids_flg\n",
+ "0 973171 age_25_34 income_60_90 M True\n",
+ "1 962099 age_18_24 income_20_40 M False\n",
+ "2 1047345 age_45_54 income_40_60 F False\n",
+ "3 721985 age_45_54 income_20_40 F False\n",
+ "4 704055 age_35_44 income_60_90 F False"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "users_df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:40:36.103997Z",
+ "start_time": "2021-10-28T18:40:36.094699Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:29.130158Z",
+ "iopub.status.busy": "2023-01-22T16:23:29.127963Z",
+ "iopub.status.idle": "2023-01-22T16:23:29.145149Z",
+ "shell.execute_reply": "2023-01-22T16:23:29.144033Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:29.130122Z"
+ },
+ "id": "61669d0d"
+ },
+ "outputs": [],
+ "source": [
+ "items_df = items_df.rename(columns = {'id' : 'item_id'})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:40:36.378293Z",
+ "start_time": "2021-10-28T18:40:36.370946Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:29.146754Z",
+ "iopub.status.busy": "2023-01-22T16:23:29.146394Z",
+ "iopub.status.idle": "2023-01-22T16:23:29.166993Z",
+ "shell.execute_reply": "2023-01-22T16:23:29.165796Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:29.146717Z"
+ },
+ "id": "25f4462e",
+ "outputId": "5cc6c801-f866-4b52-aada-f5226a5ebc21"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " item_id | \n",
+ " content_type | \n",
+ " title | \n",
+ " title_orig | \n",
+ " genres | \n",
+ " countries | \n",
+ " for_kids | \n",
+ " age_rating | \n",
+ " studios | \n",
+ " directors | \n",
+ " actors | \n",
+ " description | \n",
+ " keywords | \n",
+ " release_year_cat | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 10711 | \n",
+ " film | \n",
+ " поговори с ней | \n",
+ " Hable con ella | \n",
+ " драмы, зарубежные, детективы, мелодрамы | \n",
+ " испания | \n",
+ " False | \n",
+ " 16.0 | \n",
+ " unknown | \n",
+ " педро альмодовар | \n",
+ " Адольфо Фернандес, Ана Фернандес, Дарио Гранди... | \n",
+ " Мелодрама легендарного Педро Альмодовара «Пого... | \n",
+ " Поговори, ней, 2002, Испания, друзья, любовь, ... | \n",
+ " 2000-2010 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2508 | \n",
+ " film | \n",
+ " голые перцы | \n",
+ " Search Party | \n",
+ " зарубежные, приключения, комедии | \n",
+ " сша | \n",
+ " False | \n",
+ " 16.0 | \n",
+ " unknown | \n",
+ " скот армстронг | \n",
+ " Адам Палли, Брайан Хаски, Дж.Б. Смув, Джейсон ... | \n",
+ " Уморительная современная комедия на популярную... | \n",
+ " Голые, перцы, 2014, США, друзья, свадьбы, прео... | \n",
+ " 2010-2020 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 10716 | \n",
+ " film | \n",
+ " тактическая сила | \n",
+ " Tactical Force | \n",
+ " криминал, зарубежные, триллеры, боевики, комедии | \n",
+ " канада | \n",
+ " False | \n",
+ " 16.0 | \n",
+ " unknown | \n",
+ " адам п. калтраро | \n",
+ " Адриан Холмс, Даррен Шалави, Джерри Вассерман,... | \n",
+ " Профессиональный рестлер Стив Остин («Все или ... | \n",
+ " Тактическая, сила, 2011, Канада, бандиты, ганг... | \n",
+ " 2010-2020 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 7868 | \n",
+ " film | \n",
+ " 45 лет | \n",
+ " 45 Years | \n",
+ " драмы, зарубежные, мелодрамы | \n",
+ " великобритания | \n",
+ " False | \n",
+ " 16.0 | \n",
+ " unknown | \n",
+ " эндрю хэй | \n",
+ " Александра Риддлстон-Барретт, Джеральдин Джейм... | \n",
+ " Шарлотта Рэмплинг, Том Кортни, Джеральдин Джей... | \n",
+ " 45, лет, 2015, Великобритания, брак, жизнь, лю... | \n",
+ " 2010-2020 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 16268 | \n",
+ " film | \n",
+ " все решает мгновение | \n",
+ " NaN | \n",
+ " драмы, спорт, советские, мелодрамы | \n",
+ " ссср | \n",
+ " False | \n",
+ " 12.0 | \n",
+ " ленфильм | \n",
+ " виктор садовский | \n",
+ " Александр Абдулов, Александр Демьяненко, Алекс... | \n",
+ " Расчетливая чаровница из советского кинохита «... | \n",
+ " Все, решает, мгновение, 1978, СССР, сильные, ж... | \n",
+ " 1970-1980 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " item_id content_type title title_orig \\\n",
+ "0 10711 film поговори с ней Hable con ella \n",
+ "1 2508 film голые перцы Search Party \n",
+ "2 10716 film тактическая сила Tactical Force \n",
+ "3 7868 film 45 лет 45 Years \n",
+ "4 16268 film все решает мгновение NaN \n",
+ "\n",
+ " genres countries for_kids \\\n",
+ "0 драмы, зарубежные, детективы, мелодрамы испания False \n",
+ "1 зарубежные, приключения, комедии сша False \n",
+ "2 криминал, зарубежные, триллеры, боевики, комедии канада False \n",
+ "3 драмы, зарубежные, мелодрамы великобритания False \n",
+ "4 драмы, спорт, советские, мелодрамы ссср False \n",
+ "\n",
+ " age_rating studios directors \\\n",
+ "0 16.0 unknown педро альмодовар \n",
+ "1 16.0 unknown скот армстронг \n",
+ "2 16.0 unknown адам п. калтраро \n",
+ "3 16.0 unknown эндрю хэй \n",
+ "4 12.0 ленфильм виктор садовский \n",
+ "\n",
+ " actors \\\n",
+ "0 Адольфо Фернандес, Ана Фернандес, Дарио Гранди... \n",
+ "1 Адам Палли, Брайан Хаски, Дж.Б. Смув, Джейсон ... \n",
+ "2 Адриан Холмс, Даррен Шалави, Джерри Вассерман,... \n",
+ "3 Александра Риддлстон-Барретт, Джеральдин Джейм... \n",
+ "4 Александр Абдулов, Александр Демьяненко, Алекс... \n",
+ "\n",
+ " description \\\n",
+ "0 Мелодрама легендарного Педро Альмодовара «Пого... \n",
+ "1 Уморительная современная комедия на популярную... \n",
+ "2 Профессиональный рестлер Стив Остин («Все или ... \n",
+ "3 Шарлотта Рэмплинг, Том Кортни, Джеральдин Джей... \n",
+ "4 Расчетливая чаровница из советского кинохита «... \n",
+ "\n",
+ " keywords release_year_cat \n",
+ "0 Поговори, ней, 2002, Испания, друзья, любовь, ... 2000-2010 \n",
+ "1 Голые, перцы, 2014, США, друзья, свадьбы, прео... 2010-2020 \n",
+ "2 Тактическая, сила, 2011, Канада, бандиты, ганг... 2010-2020 \n",
+ "3 45, лет, 2015, Великобритания, брак, жизнь, лю... 2010-2020 \n",
+ "4 Все, решает, мгновение, 1978, СССР, сильные, ж... 1970-1980 "
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "items_df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:40:36.607688Z",
+ "start_time": "2021-10-28T18:40:36.597640Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:29.169473Z",
+ "iopub.status.busy": "2023-01-22T16:23:29.168713Z",
+ "iopub.status.idle": "2023-01-22T16:23:29.183035Z",
+ "shell.execute_reply": "2023-01-22T16:23:29.181327Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:29.169432Z"
+ },
+ "id": "b41964d3",
+ "outputId": "b4c8f3d5-e7af-4e29-d2e8-0defb6993b35"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " user_id | \n",
+ " item_id | \n",
+ " last_watch_dt | \n",
+ " total_dur | \n",
+ " watched_pct | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 176549 | \n",
+ " 9506 | \n",
+ " 2021-05-11 | \n",
+ " 4250 | \n",
+ " 72 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 699317 | \n",
+ " 1659 | \n",
+ " 2021-05-29 | \n",
+ " 8317 | \n",
+ " 100 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 656683 | \n",
+ " 7107 | \n",
+ " 2021-05-09 | \n",
+ " 10 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 864613 | \n",
+ " 7638 | \n",
+ " 2021-07-05 | \n",
+ " 14483 | \n",
+ " 100 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 964868 | \n",
+ " 9506 | \n",
+ " 2021-04-30 | \n",
+ " 6725 | \n",
+ " 100 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " user_id item_id last_watch_dt total_dur watched_pct\n",
+ "0 176549 9506 2021-05-11 4250 72\n",
+ "1 699317 1659 2021-05-29 8317 100\n",
+ "2 656683 7107 2021-05-09 10 0\n",
+ "3 864613 7638 2021-07-05 14483 100\n",
+ "4 964868 9506 2021-04-30 6725 100"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "interactions_df.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "cd252422"
+ },
+ "source": [
+ "## Готовим фичи пользователей"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "pBdccMPAr7KR"
+ },
+ "source": [
+ "Посмотрим, какие фичи в датасете фильмов являются категориальными и закодируем их с помощью one-hot encoding."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:40:37.156260Z",
+ "start_time": "2021-10-28T18:40:37.138422Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:29.185708Z",
+ "iopub.status.busy": "2023-01-22T16:23:29.184841Z",
+ "iopub.status.idle": "2023-01-22T16:23:29.504659Z",
+ "shell.execute_reply": "2023-01-22T16:23:29.503366Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:29.185668Z"
+ },
+ "id": "692270ac",
+ "outputId": "7491ab1f-f9fb-4921-e383-7ecf5569e999"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " user_id | \n",
+ " age_age_18_24 | \n",
+ " age_age_25_34 | \n",
+ " age_age_35_44 | \n",
+ " age_age_45_54 | \n",
+ " age_age_55_64 | \n",
+ " age_age_65_inf | \n",
+ " age_age_unknown | \n",
+ " income_income_0_20 | \n",
+ " income_income_150_inf | \n",
+ " income_income_20_40 | \n",
+ " income_income_40_60 | \n",
+ " income_income_60_90 | \n",
+ " income_income_90_150 | \n",
+ " income_income_unknown | \n",
+ " sex_F | \n",
+ " sex_M | \n",
+ " sex_sex_unknown | \n",
+ " kids_flg_False | \n",
+ " kids_flg_True | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 973171 | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 962099 | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1047345 | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 721985 | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 704055 | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " user_id age_age_18_24 age_age_25_34 age_age_35_44 age_age_45_54 \\\n",
+ "0 973171 False True False False \n",
+ "1 962099 True False False False \n",
+ "2 1047345 False False False True \n",
+ "3 721985 False False False True \n",
+ "4 704055 False False True False \n",
+ "\n",
+ " age_age_55_64 age_age_65_inf age_age_unknown income_income_0_20 \\\n",
+ "0 False False False False \n",
+ "1 False False False False \n",
+ "2 False False False False \n",
+ "3 False False False False \n",
+ "4 False False False False \n",
+ "\n",
+ " income_income_150_inf income_income_20_40 income_income_40_60 \\\n",
+ "0 False False False \n",
+ "1 False True False \n",
+ "2 False False True \n",
+ "3 False True False \n",
+ "4 False False False \n",
+ "\n",
+ " income_income_60_90 income_income_90_150 income_income_unknown sex_F \\\n",
+ "0 True False False False \n",
+ "1 False False False False \n",
+ "2 False False False True \n",
+ "3 False False False True \n",
+ "4 True False False True \n",
+ "\n",
+ " sex_M sex_sex_unknown kids_flg_False kids_flg_True \n",
+ "0 True False False True \n",
+ "1 True False True False \n",
+ "2 False False True False \n",
+ "3 False False True False \n",
+ "4 False False True False "
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "user_cat_feats = [\"age\", \"income\", \"sex\", \"kids_flg\"]\n",
+ "# из исходного датафрейма оставим только item_id - этот признак нам понадобится позже\n",
+ "# для того, чтобы маппить айтемы из датафрейма с фильмами с айтемами \n",
+ "# из датафрейма с взаимодействиями\n",
+ "users_ohe_df = users_df.user_id\n",
+ "for feat in user_cat_feats:\n",
+ " # получаем датафрейм с one-hot encoding для каждой категориальной фичи\n",
+ " ohe_feat_df = pd.get_dummies(users_df[feat], prefix=feat)\n",
+ " # конкатенируем ohe-hot датафрейм с датафреймом, \n",
+ " # который мы получили на предыдущем шаге\n",
+ " users_ohe_df = pd.concat([users_ohe_df, ohe_feat_df], axis=1)\n",
+ "\n",
+ "users_ohe_df.head()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "74cdbd93"
+ },
+ "source": [
+ "## Готовим фичи айтемов"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "5kHzJ91Mr35c"
+ },
+ "source": [
+ "Кодируем их точно так же - one-hot'ом."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:29.507174Z",
+ "iopub.status.busy": "2023-01-22T16:23:29.506716Z",
+ "iopub.status.idle": "2023-01-22T16:23:29.528115Z",
+ "shell.execute_reply": "2023-01-22T16:23:29.526826Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:29.507133Z"
+ },
+ "id": "-2Wd9upSsCle",
+ "outputId": "671c2446-81f5-4e32-e24f-3aec9c8a2076"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " item_id | \n",
+ " content_type | \n",
+ " title | \n",
+ " title_orig | \n",
+ " genres | \n",
+ " countries | \n",
+ " for_kids | \n",
+ " age_rating | \n",
+ " studios | \n",
+ " directors | \n",
+ " actors | \n",
+ " description | \n",
+ " keywords | \n",
+ " release_year_cat | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 10711 | \n",
+ " film | \n",
+ " поговори с ней | \n",
+ " Hable con ella | \n",
+ " драмы, зарубежные, детективы, мелодрамы | \n",
+ " испания | \n",
+ " False | \n",
+ " 16.0 | \n",
+ " unknown | \n",
+ " педро альмодовар | \n",
+ " Адольфо Фернандес, Ана Фернандес, Дарио Гранди... | \n",
+ " Мелодрама легендарного Педро Альмодовара «Пого... | \n",
+ " Поговори, ней, 2002, Испания, друзья, любовь, ... | \n",
+ " 2000-2010 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2508 | \n",
+ " film | \n",
+ " голые перцы | \n",
+ " Search Party | \n",
+ " зарубежные, приключения, комедии | \n",
+ " сша | \n",
+ " False | \n",
+ " 16.0 | \n",
+ " unknown | \n",
+ " скот армстронг | \n",
+ " Адам Палли, Брайан Хаски, Дж.Б. Смув, Джейсон ... | \n",
+ " Уморительная современная комедия на популярную... | \n",
+ " Голые, перцы, 2014, США, друзья, свадьбы, прео... | \n",
+ " 2010-2020 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 10716 | \n",
+ " film | \n",
+ " тактическая сила | \n",
+ " Tactical Force | \n",
+ " криминал, зарубежные, триллеры, боевики, комедии | \n",
+ " канада | \n",
+ " False | \n",
+ " 16.0 | \n",
+ " unknown | \n",
+ " адам п. калтраро | \n",
+ " Адриан Холмс, Даррен Шалави, Джерри Вассерман,... | \n",
+ " Профессиональный рестлер Стив Остин («Все или ... | \n",
+ " Тактическая, сила, 2011, Канада, бандиты, ганг... | \n",
+ " 2010-2020 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 7868 | \n",
+ " film | \n",
+ " 45 лет | \n",
+ " 45 Years | \n",
+ " драмы, зарубежные, мелодрамы | \n",
+ " великобритания | \n",
+ " False | \n",
+ " 16.0 | \n",
+ " unknown | \n",
+ " эндрю хэй | \n",
+ " Александра Риддлстон-Барретт, Джеральдин Джейм... | \n",
+ " Шарлотта Рэмплинг, Том Кортни, Джеральдин Джей... | \n",
+ " 45, лет, 2015, Великобритания, брак, жизнь, лю... | \n",
+ " 2010-2020 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 16268 | \n",
+ " film | \n",
+ " все решает мгновение | \n",
+ " NaN | \n",
+ " драмы, спорт, советские, мелодрамы | \n",
+ " ссср | \n",
+ " False | \n",
+ " 12.0 | \n",
+ " ленфильм | \n",
+ " виктор садовский | \n",
+ " Александр Абдулов, Александр Демьяненко, Алекс... | \n",
+ " Расчетливая чаровница из советского кинохита «... | \n",
+ " Все, решает, мгновение, 1978, СССР, сильные, ж... | \n",
+ " 1970-1980 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " item_id content_type title title_orig \\\n",
+ "0 10711 film поговори с ней Hable con ella \n",
+ "1 2508 film голые перцы Search Party \n",
+ "2 10716 film тактическая сила Tactical Force \n",
+ "3 7868 film 45 лет 45 Years \n",
+ "4 16268 film все решает мгновение NaN \n",
+ "\n",
+ " genres countries for_kids \\\n",
+ "0 драмы, зарубежные, детективы, мелодрамы испания False \n",
+ "1 зарубежные, приключения, комедии сша False \n",
+ "2 криминал, зарубежные, триллеры, боевики, комедии канада False \n",
+ "3 драмы, зарубежные, мелодрамы великобритания False \n",
+ "4 драмы, спорт, советские, мелодрамы ссср False \n",
+ "\n",
+ " age_rating studios directors \\\n",
+ "0 16.0 unknown педро альмодовар \n",
+ "1 16.0 unknown скот армстронг \n",
+ "2 16.0 unknown адам п. калтраро \n",
+ "3 16.0 unknown эндрю хэй \n",
+ "4 12.0 ленфильм виктор садовский \n",
+ "\n",
+ " actors \\\n",
+ "0 Адольфо Фернандес, Ана Фернандес, Дарио Гранди... \n",
+ "1 Адам Палли, Брайан Хаски, Дж.Б. Смув, Джейсон ... \n",
+ "2 Адриан Холмс, Даррен Шалави, Джерри Вассерман,... \n",
+ "3 Александра Риддлстон-Барретт, Джеральдин Джейм... \n",
+ "4 Александр Абдулов, Александр Демьяненко, Алекс... \n",
+ "\n",
+ " description \\\n",
+ "0 Мелодрама легендарного Педро Альмодовара «Пого... \n",
+ "1 Уморительная современная комедия на популярную... \n",
+ "2 Профессиональный рестлер Стив Остин («Все или ... \n",
+ "3 Шарлотта Рэмплинг, Том Кортни, Джеральдин Джей... \n",
+ "4 Расчетливая чаровница из советского кинохита «... \n",
+ "\n",
+ " keywords release_year_cat \n",
+ "0 Поговори, ней, 2002, Испания, друзья, любовь, ... 2000-2010 \n",
+ "1 Голые, перцы, 2014, США, друзья, свадьбы, прео... 2010-2020 \n",
+ "2 Тактическая, сила, 2011, Канада, бандиты, ганг... 2010-2020 \n",
+ "3 45, лет, 2015, Великобритания, брак, жизнь, лю... 2010-2020 \n",
+ "4 Все, решает, мгновение, 1978, СССР, сильные, ж... 1970-1980 "
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "items_df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:40:37.792147Z",
+ "start_time": "2021-10-28T18:40:37.537501Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:29.534806Z",
+ "iopub.status.busy": "2023-01-22T16:23:29.533869Z",
+ "iopub.status.idle": "2023-01-22T16:23:30.291045Z",
+ "shell.execute_reply": "2023-01-22T16:23:30.289998Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:29.534762Z"
+ },
+ "id": "7a94ef7e",
+ "outputId": "1ea7a769-8c2d-43d5-f2cb-47500bc0a7ba"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " item_id | \n",
+ " content_type_film | \n",
+ " content_type_series | \n",
+ " release_year_cat_1920-1930 | \n",
+ " release_year_cat_1930-1940 | \n",
+ " release_year_cat_1940-1950 | \n",
+ " release_year_cat_1950-1960 | \n",
+ " release_year_cat_1960-1970 | \n",
+ " release_year_cat_1970-1980 | \n",
+ " release_year_cat_1980-1990 | \n",
+ " ... | \n",
+ " directors_ярив хоровиц | \n",
+ " directors_ярон зильберман | \n",
+ " directors_ярополк лапшин | \n",
+ " directors_ярослав лупий | \n",
+ " directors_ярроу чейни, скотт моужер | \n",
+ " directors_ясина сезар | \n",
+ " directors_ясуоми умэцу | \n",
+ " directors_ёдзи фукуяма, ацуко фукусима, николас де креси, синъитиро ватанабэ, сёдзи кавамори | \n",
+ " directors_ёлкин туйчиев | \n",
+ " directors_ён сан-хо | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 10711 | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " ... | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2508 | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " ... | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 10716 | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " ... | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 7868 | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " ... | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 16268 | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " ... | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 8589 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " item_id content_type_film content_type_series \\\n",
+ "0 10711 True False \n",
+ "1 2508 True False \n",
+ "2 10716 True False \n",
+ "3 7868 True False \n",
+ "4 16268 True False \n",
+ "\n",
+ " release_year_cat_1920-1930 release_year_cat_1930-1940 \\\n",
+ "0 False False \n",
+ "1 False False \n",
+ "2 False False \n",
+ "3 False False \n",
+ "4 False False \n",
+ "\n",
+ " release_year_cat_1940-1950 release_year_cat_1950-1960 \\\n",
+ "0 False False \n",
+ "1 False False \n",
+ "2 False False \n",
+ "3 False False \n",
+ "4 False False \n",
+ "\n",
+ " release_year_cat_1960-1970 release_year_cat_1970-1980 \\\n",
+ "0 False False \n",
+ "1 False False \n",
+ "2 False False \n",
+ "3 False False \n",
+ "4 False True \n",
+ "\n",
+ " release_year_cat_1980-1990 ... directors_ярив хоровиц \\\n",
+ "0 False ... False \n",
+ "1 False ... False \n",
+ "2 False ... False \n",
+ "3 False ... False \n",
+ "4 False ... False \n",
+ "\n",
+ " directors_ярон зильберман directors_ярополк лапшин \\\n",
+ "0 False False \n",
+ "1 False False \n",
+ "2 False False \n",
+ "3 False False \n",
+ "4 False False \n",
+ "\n",
+ " directors_ярослав лупий directors_ярроу чейни, скотт моужер \\\n",
+ "0 False False \n",
+ "1 False False \n",
+ "2 False False \n",
+ "3 False False \n",
+ "4 False False \n",
+ "\n",
+ " directors_ясина сезар directors_ясуоми умэцу \\\n",
+ "0 False False \n",
+ "1 False False \n",
+ "2 False False \n",
+ "3 False False \n",
+ "4 False False \n",
+ "\n",
+ " directors_ёдзи фукуяма, ацуко фукусима, николас де креси, синъитиро ватанабэ, сёдзи кавамори \\\n",
+ "0 False \n",
+ "1 False \n",
+ "2 False \n",
+ "3 False \n",
+ "4 False \n",
+ "\n",
+ " directors_ёлкин туйчиев directors_ён сан-хо \n",
+ "0 False False \n",
+ "1 False False \n",
+ "2 False False \n",
+ "3 False False \n",
+ "4 False False \n",
+ "\n",
+ "[5 rows x 8589 columns]"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "item_cat_feats = ['content_type', 'release_year_cat',\n",
+ " 'for_kids', 'age_rating', \n",
+ " 'studios', 'countries', 'directors']\n",
+ "\n",
+ "items_ohe_df = items_df.item_id\n",
+ "\n",
+ "for feat in item_cat_feats:\n",
+ " ohe_feat_df = pd.get_dummies(items_df[feat], prefix=feat)\n",
+ " items_ohe_df = pd.concat([items_ohe_df, ohe_feat_df], axis=1) \n",
+ "\n",
+ "items_ohe_df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:30.294678Z",
+ "iopub.status.busy": "2023-01-22T16:23:30.294379Z",
+ "iopub.status.idle": "2023-01-22T16:23:30.316137Z",
+ "shell.execute_reply": "2023-01-22T16:23:30.314916Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:30.294651Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " item_id | \n",
+ " content_type | \n",
+ " title | \n",
+ " title_orig | \n",
+ " genres | \n",
+ " countries | \n",
+ " for_kids | \n",
+ " age_rating | \n",
+ " studios | \n",
+ " directors | \n",
+ " actors | \n",
+ " description | \n",
+ " keywords | \n",
+ " release_year_cat | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 10711 | \n",
+ " film | \n",
+ " поговори с ней | \n",
+ " Hable con ella | \n",
+ " драмы, зарубежные, детективы, мелодрамы | \n",
+ " испания | \n",
+ " False | \n",
+ " 16.0 | \n",
+ " unknown | \n",
+ " педро альмодовар | \n",
+ " Адольфо Фернандес, Ана Фернандес, Дарио Гранди... | \n",
+ " Мелодрама легендарного Педро Альмодовара «Пого... | \n",
+ " Поговори, ней, 2002, Испания, друзья, любовь, ... | \n",
+ " 2000-2010 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2508 | \n",
+ " film | \n",
+ " голые перцы | \n",
+ " Search Party | \n",
+ " зарубежные, приключения, комедии | \n",
+ " сша | \n",
+ " False | \n",
+ " 16.0 | \n",
+ " unknown | \n",
+ " скот армстронг | \n",
+ " Адам Палли, Брайан Хаски, Дж.Б. Смув, Джейсон ... | \n",
+ " Уморительная современная комедия на популярную... | \n",
+ " Голые, перцы, 2014, США, друзья, свадьбы, прео... | \n",
+ " 2010-2020 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 10716 | \n",
+ " film | \n",
+ " тактическая сила | \n",
+ " Tactical Force | \n",
+ " криминал, зарубежные, триллеры, боевики, комедии | \n",
+ " канада | \n",
+ " False | \n",
+ " 16.0 | \n",
+ " unknown | \n",
+ " адам п. калтраро | \n",
+ " Адриан Холмс, Даррен Шалави, Джерри Вассерман,... | \n",
+ " Профессиональный рестлер Стив Остин («Все или ... | \n",
+ " Тактическая, сила, 2011, Канада, бандиты, ганг... | \n",
+ " 2010-2020 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 7868 | \n",
+ " film | \n",
+ " 45 лет | \n",
+ " 45 Years | \n",
+ " драмы, зарубежные, мелодрамы | \n",
+ " великобритания | \n",
+ " False | \n",
+ " 16.0 | \n",
+ " unknown | \n",
+ " эндрю хэй | \n",
+ " Александра Риддлстон-Барретт, Джеральдин Джейм... | \n",
+ " Шарлотта Рэмплинг, Том Кортни, Джеральдин Джей... | \n",
+ " 45, лет, 2015, Великобритания, брак, жизнь, лю... | \n",
+ " 2010-2020 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 16268 | \n",
+ " film | \n",
+ " все решает мгновение | \n",
+ " NaN | \n",
+ " драмы, спорт, советские, мелодрамы | \n",
+ " ссср | \n",
+ " False | \n",
+ " 12.0 | \n",
+ " ленфильм | \n",
+ " виктор садовский | \n",
+ " Александр Абдулов, Александр Демьяненко, Алекс... | \n",
+ " Расчетливая чаровница из советского кинохита «... | \n",
+ " Все, решает, мгновение, 1978, СССР, сильные, ж... | \n",
+ " 1970-1980 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " item_id content_type title title_orig \\\n",
+ "0 10711 film поговори с ней Hable con ella \n",
+ "1 2508 film голые перцы Search Party \n",
+ "2 10716 film тактическая сила Tactical Force \n",
+ "3 7868 film 45 лет 45 Years \n",
+ "4 16268 film все решает мгновение NaN \n",
+ "\n",
+ " genres countries for_kids \\\n",
+ "0 драмы, зарубежные, детективы, мелодрамы испания False \n",
+ "1 зарубежные, приключения, комедии сша False \n",
+ "2 криминал, зарубежные, триллеры, боевики, комедии канада False \n",
+ "3 драмы, зарубежные, мелодрамы великобритания False \n",
+ "4 драмы, спорт, советские, мелодрамы ссср False \n",
+ "\n",
+ " age_rating studios directors \\\n",
+ "0 16.0 unknown педро альмодовар \n",
+ "1 16.0 unknown скот армстронг \n",
+ "2 16.0 unknown адам п. калтраро \n",
+ "3 16.0 unknown эндрю хэй \n",
+ "4 12.0 ленфильм виктор садовский \n",
+ "\n",
+ " actors \\\n",
+ "0 Адольфо Фернандес, Ана Фернандес, Дарио Гранди... \n",
+ "1 Адам Палли, Брайан Хаски, Дж.Б. Смув, Джейсон ... \n",
+ "2 Адриан Холмс, Даррен Шалави, Джерри Вассерман,... \n",
+ "3 Александра Риддлстон-Барретт, Джеральдин Джейм... \n",
+ "4 Александр Абдулов, Александр Демьяненко, Алекс... \n",
+ "\n",
+ " description \\\n",
+ "0 Мелодрама легендарного Педро Альмодовара «Пого... \n",
+ "1 Уморительная современная комедия на популярную... \n",
+ "2 Профессиональный рестлер Стив Остин («Все или ... \n",
+ "3 Шарлотта Рэмплинг, Том Кортни, Джеральдин Джей... \n",
+ "4 Расчетливая чаровница из советского кинохита «... \n",
+ "\n",
+ " keywords release_year_cat \n",
+ "0 Поговори, ней, 2002, Испания, друзья, любовь, ... 2000-2010 \n",
+ "1 Голые, перцы, 2014, США, друзья, свадьбы, прео... 2010-2020 \n",
+ "2 Тактическая, сила, 2011, Канада, бандиты, ганг... 2010-2020 \n",
+ "3 45, лет, 2015, Великобритания, брак, жизнь, лю... 2010-2020 \n",
+ "4 Все, решает, мгновение, 1978, СССР, сильные, ж... 1970-1980 "
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "items_df.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Добавим текстовые фичи\n",
+ "С помощью TFIDFVectorizer получим эмбеддинги следующих колонок: genres, description, keywords"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:30.318830Z",
+ "iopub.status.busy": "2023-01-22T16:23:30.318190Z",
+ "iopub.status.idle": "2023-01-22T16:23:30.335666Z",
+ "shell.execute_reply": "2023-01-22T16:23:30.334811Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:30.318792Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "from sklearn.feature_extraction.text import TfidfVectorizer"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:30.338779Z",
+ "iopub.status.busy": "2023-01-22T16:23:30.338019Z",
+ "iopub.status.idle": "2023-01-22T16:23:31.386164Z",
+ "shell.execute_reply": "2023-01-22T16:23:31.385106Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:30.338741Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "for column in ['genres', 'keywords']:\n",
+ " tv = TfidfVectorizer(max_features = 500)\n",
+ " t = pd.DataFrame.sparse.from_spmatrix(tv.fit_transform(items_df[column]))\n",
+ " t.columns = [column + '_' + str(x) for x in t.columns]\n",
+ " items_ohe_df = pd.concat([items_ohe_df, t], axis = 1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:31.388255Z",
+ "iopub.status.busy": "2023-01-22T16:23:31.387847Z",
+ "iopub.status.idle": "2023-01-22T16:23:31.483917Z",
+ "shell.execute_reply": "2023-01-22T16:23:31.482751Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:31.388214Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " item_id | \n",
+ " content_type_film | \n",
+ " content_type_series | \n",
+ " release_year_cat_1920-1930 | \n",
+ " release_year_cat_1930-1940 | \n",
+ " release_year_cat_1940-1950 | \n",
+ " release_year_cat_1950-1960 | \n",
+ " release_year_cat_1960-1970 | \n",
+ " release_year_cat_1970-1980 | \n",
+ " release_year_cat_1980-1990 | \n",
+ " ... | \n",
+ " keywords_490 | \n",
+ " keywords_491 | \n",
+ " keywords_492 | \n",
+ " keywords_493 | \n",
+ " keywords_494 | \n",
+ " keywords_495 | \n",
+ " keywords_496 | \n",
+ " keywords_497 | \n",
+ " keywords_498 | \n",
+ " keywords_499 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 10711 | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2508 | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 10716 | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 7868 | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 16268 | \n",
+ " True | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " False | \n",
+ " True | \n",
+ " False | \n",
+ " ... | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ " 0.0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 9197 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " item_id content_type_film content_type_series \\\n",
+ "0 10711 True False \n",
+ "1 2508 True False \n",
+ "2 10716 True False \n",
+ "3 7868 True False \n",
+ "4 16268 True False \n",
+ "\n",
+ " release_year_cat_1920-1930 release_year_cat_1930-1940 \\\n",
+ "0 False False \n",
+ "1 False False \n",
+ "2 False False \n",
+ "3 False False \n",
+ "4 False False \n",
+ "\n",
+ " release_year_cat_1940-1950 release_year_cat_1950-1960 \\\n",
+ "0 False False \n",
+ "1 False False \n",
+ "2 False False \n",
+ "3 False False \n",
+ "4 False False \n",
+ "\n",
+ " release_year_cat_1960-1970 release_year_cat_1970-1980 \\\n",
+ "0 False False \n",
+ "1 False False \n",
+ "2 False False \n",
+ "3 False False \n",
+ "4 False True \n",
+ "\n",
+ " release_year_cat_1980-1990 ... keywords_490 keywords_491 keywords_492 \\\n",
+ "0 False ... 0.0 0.0 0.0 \n",
+ "1 False ... 0.0 0.0 0.0 \n",
+ "2 False ... 0.0 0.0 0.0 \n",
+ "3 False ... 0.0 0.0 0.0 \n",
+ "4 False ... 0.0 0.0 0.0 \n",
+ "\n",
+ " keywords_493 keywords_494 keywords_495 keywords_496 keywords_497 \\\n",
+ "0 0.0 0.0 0.0 0.0 0.0 \n",
+ "1 0.0 0.0 0.0 0.0 0.0 \n",
+ "2 0.0 0.0 0.0 0.0 0.0 \n",
+ "3 0.0 0.0 0.0 0.0 0.0 \n",
+ "4 0.0 0.0 0.0 0.0 0.0 \n",
+ "\n",
+ " keywords_498 keywords_499 \n",
+ "0 0.0 0.0 \n",
+ "1 0.0 0.0 \n",
+ "2 0.0 0.0 \n",
+ "3 0.0 0.0 \n",
+ "4 0.0 0.0 \n",
+ "\n",
+ "[5 rows x 9197 columns]"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "items_ohe_df.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "cc595c20"
+ },
+ "source": [
+ "## Сделаем матрицу взаимодействий"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:40:37.898427Z",
+ "start_time": "2021-10-28T18:40:37.864067Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:31.486206Z",
+ "iopub.status.busy": "2023-01-22T16:23:31.485812Z",
+ "iopub.status.idle": "2023-01-22T16:23:31.604748Z",
+ "shell.execute_reply": "2023-01-22T16:23:31.603679Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:31.486170Z"
+ },
+ "id": "79c9bca3",
+ "outputId": "6f6148e0-8de7-4ffc-82d9-cf396db1ed98"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "item_id\n",
+ "10440 202457\n",
+ "15297 193123\n",
+ "9728 132865\n",
+ "13865 122119\n",
+ "4151 91167\n",
+ " ... \n",
+ "8076 1\n",
+ "8954 1\n",
+ "15664 1\n",
+ "818 1\n",
+ "10542 1\n",
+ "Name: count, Length: 15706, dtype: int64"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "interactions_df.item_id.value_counts()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "YAfqm8asrBfG"
+ },
+ "source": [
+ "В датасете взаимодействий есть непопулярные фильмы и малоактивные пользователи. Кроме того, в таблице взаимодействий есть события с низким качеством взаимодействия - когда юзер начал смотреть фильм, но вскоре после начала просмотра выключил.\n",
+ "\n",
+ "Отфильтруем такие события*, малоактивных юзеров и непопулярные фильмы.\n",
+ "\n",
+ "Можете не фильтровать такие события, тогда у вас будет больше негативных примеров."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:40:38.103819Z",
+ "start_time": "2021-10-28T18:40:38.070117Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:31.606489Z",
+ "iopub.status.busy": "2023-01-22T16:23:31.606197Z",
+ "iopub.status.idle": "2023-01-22T16:23:31.985392Z",
+ "shell.execute_reply": "2023-01-22T16:23:31.984254Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:31.606462Z"
+ },
+ "id": "17334e80",
+ "outputId": "bfbe26dd-7778-42ad-c5dd-283635fcafa6"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "user_id\n",
+ "416206 1341\n",
+ "1010539 764\n",
+ "555233 685\n",
+ "11526 676\n",
+ "409259 625\n",
+ " ... \n",
+ "45493 1\n",
+ "615194 1\n",
+ "96848 1\n",
+ "425823 1\n",
+ "697262 1\n",
+ "Name: count, Length: 962179, dtype: int64"
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "interactions_df.user_id.value_counts()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:40:39.717096Z",
+ "start_time": "2021-10-28T18:40:38.759740Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:31.987509Z",
+ "iopub.status.busy": "2023-01-22T16:23:31.986995Z",
+ "iopub.status.idle": "2023-01-22T16:23:34.897911Z",
+ "shell.execute_reply": "2023-01-22T16:23:34.896578Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:31.987469Z"
+ },
+ "id": "076e4ebc",
+ "outputId": "85c15fd2-12bb-478c-e00f-4f2b7bbcd6ab"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "N users before: 962179\n",
+ "N items before: 15706\n",
+ "\n",
+ "N users after: 79515\n",
+ "N items after: 6901\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(f\"N users before: {interactions_df.user_id.nunique()}\")\n",
+ "print(f\"N items before: {interactions_df.item_id.nunique()}\\n\")\n",
+ "\n",
+ "# отфильтруем все события взаимодействий, в которых пользователь посмотрел\n",
+ "# фильм менее чем на 10 процентов\n",
+ "interactions_df = interactions_df[interactions_df.watched_pct > 10]\n",
+ "\n",
+ "# соберем всех пользователей, которые посмотрели \n",
+ "# больше 10 фильмов (можете выбрать другой порог)\n",
+ "valid_users = []\n",
+ "\n",
+ "c = Counter(interactions_df.user_id)\n",
+ "for user_id, entries in c.most_common():\n",
+ " if entries > 10:\n",
+ " valid_users.append(user_id)\n",
+ "\n",
+ "# и соберем все фильмы, которые посмотрели больше 10 пользователей\n",
+ "valid_items = []\n",
+ "\n",
+ "c = Counter(interactions_df.item_id)\n",
+ "for item_id, entries in c.most_common():\n",
+ " if entries > 10:\n",
+ " valid_items.append(item_id)\n",
+ "\n",
+ "# отбросим непопулярные фильмы и неактивных юзеров\n",
+ "interactions_df = interactions_df[interactions_df.user_id.isin(valid_users)]\n",
+ "interactions_df = interactions_df[interactions_df.item_id.isin(valid_items)]\n",
+ "\n",
+ "print(f\"N users after: {interactions_df.user_id.nunique()}\")\n",
+ "print(f\"N items after: {interactions_df.item_id.nunique()}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "a9163fb2"
+ },
+ "source": [
+ "После фильтрации может получиться так, что некоторые айтемы/юзеры есть в датасете взаимодействий, но при этом они отсутствуют в датасетах айтемов/юзеров или наоборот. Поэтому найдем id айтемов и id юзеров, которые есть во всех датасетах и оставим только их."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:40:40.231703Z",
+ "start_time": "2021-10-28T18:40:39.718626Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:34.900180Z",
+ "iopub.status.busy": "2023-01-22T16:23:34.899760Z",
+ "iopub.status.idle": "2023-01-22T16:23:36.064882Z",
+ "shell.execute_reply": "2023-01-22T16:23:36.063765Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:34.900142Z"
+ },
+ "id": "d55848e1",
+ "outputId": "48609a0b-06b9-4a5e-f8f6-061db1c6dcb2"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "65974\n",
+ "6901\n"
+ ]
+ }
+ ],
+ "source": [
+ "common_users = set(interactions_df.user_id.unique()).intersection(set(users_ohe_df.user_id.unique()))\n",
+ "common_items = set(interactions_df.item_id.unique()).intersection(set(items_ohe_df.item_id.unique()))\n",
+ "\n",
+ "print(len(common_users))\n",
+ "print(len(common_items))\n",
+ "\n",
+ "interactions_df = interactions_df[interactions_df.item_id.isin(common_items)]\n",
+ "interactions_df = interactions_df[interactions_df.user_id.isin(common_users)]\n",
+ "\n",
+ "items_ohe_df = items_ohe_df[items_ohe_df.item_id.isin(common_items)]\n",
+ "users_ohe_df = users_ohe_df[users_ohe_df.user_id.isin(common_users)]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "1e8b9480"
+ },
+ "source": [
+ "\n",
+ "Соберем взаимодействия в матрицу user*item так, чтобы в строках этой матрицы были user_id, в столбцах - item_id, а на пересечениях строк и столбцов - единица, если пользователь взаимодействовал с айтемом и ноль, если нет.\n",
+ "\n",
+ "Такую матрицу удобно собирать в numpy array, однако нужно помнить, что numpy array индексируется порядковыми индексами, а нам же удобнее использовать item_id и user_id.\n",
+ "\n",
+ "Создадим некие внутренние индексы для user_id и item_id - uid и iid. Для этого просто соберем все user_id и item_id и пронумеруем их по порядку."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:40:40.346587Z",
+ "start_time": "2021-10-28T18:40:40.233046Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:36.066990Z",
+ "iopub.status.busy": "2023-01-22T16:23:36.066574Z",
+ "iopub.status.idle": "2023-01-22T16:23:36.211726Z",
+ "shell.execute_reply": "2023-01-22T16:23:36.210597Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:36.066949Z"
+ },
+ "id": "81679fb0",
+ "outputId": "0c6bf7ce-1ea0-46c2-9d70-42b32bf08c7e"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[0, 1, 2, 3, 4]\n",
+ "[0, 1, 2, 3, 4]\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " user_id | \n",
+ " item_id | \n",
+ " last_watch_dt | \n",
+ " total_dur | \n",
+ " watched_pct | \n",
+ " uid | \n",
+ " iid | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 176549 | \n",
+ " 9506 | \n",
+ " 2021-05-11 | \n",
+ " 4250 | \n",
+ " 72 | \n",
+ " 10616 | \n",
+ " 3944 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 699317 | \n",
+ " 1659 | \n",
+ " 2021-05-29 | \n",
+ " 8317 | \n",
+ " 100 | \n",
+ " 42131 | \n",
+ " 675 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 1016458 | \n",
+ " 354 | \n",
+ " 2021-08-14 | \n",
+ " 1672 | \n",
+ " 25 | \n",
+ " 61024 | \n",
+ " 139 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 884009 | \n",
+ " 693 | \n",
+ " 2021-08-04 | \n",
+ " 703 | \n",
+ " 14 | \n",
+ " 53150 | \n",
+ " 279 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 5324 | \n",
+ " 8437 | \n",
+ " 2021-04-18 | \n",
+ " 6598 | \n",
+ " 92 | \n",
+ " 310 | \n",
+ " 3485 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " user_id item_id last_watch_dt total_dur watched_pct uid iid\n",
+ "0 176549 9506 2021-05-11 4250 72 10616 3944\n",
+ "1 699317 1659 2021-05-29 8317 100 42131 675\n",
+ "6 1016458 354 2021-08-14 1672 25 61024 139\n",
+ "7 884009 693 2021-08-04 703 14 53150 279\n",
+ "14 5324 8437 2021-04-18 6598 92 310 3485"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "interactions_df[\"uid\"] = interactions_df[\"user_id\"].astype(\"category\")\n",
+ "interactions_df[\"uid\"] = interactions_df[\"uid\"].cat.codes\n",
+ "\n",
+ "interactions_df[\"iid\"] = interactions_df[\"item_id\"].astype(\"category\")\n",
+ "interactions_df[\"iid\"] = interactions_df[\"iid\"].cat.codes\n",
+ "\n",
+ "print(sorted(interactions_df.iid.unique())[:5])\n",
+ "print(sorted(interactions_df.uid.unique())[:5])\n",
+ "interactions_df.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "61c855e5"
+ },
+ "source": [
+ "Отнормируем матрицу взаимодействий"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:36.214161Z",
+ "iopub.status.busy": "2023-01-22T16:23:36.213276Z",
+ "iopub.status.idle": "2023-01-22T16:23:36.223246Z",
+ "shell.execute_reply": "2023-01-22T16:23:36.222069Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:36.214121Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0 3944\n",
+ "1 675\n",
+ "6 139\n",
+ "7 279\n",
+ "14 3485\n",
+ " ... \n",
+ "5476218 169\n",
+ "5476224 923\n",
+ "5476226 5610\n",
+ "5476239 2929\n",
+ "5476249 6766\n",
+ "Name: iid, Length: 1463641, dtype: int16"
+ ]
+ },
+ "execution_count": 25,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "interactions_df.iid"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:41:03.360248Z",
+ "start_time": "2021-10-28T18:40:40.348057Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:36.225520Z",
+ "iopub.status.busy": "2023-01-22T16:23:36.224590Z",
+ "iopub.status.idle": "2023-01-22T16:23:43.629733Z",
+ "shell.execute_reply": "2023-01-22T16:23:43.628568Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:36.225480Z"
+ },
+ "id": "3feced70"
+ },
+ "outputs": [],
+ "source": [
+ "interactions_vec = np.zeros((interactions_df.uid.nunique(), \n",
+ " interactions_df.iid.nunique())) \n",
+ "\n",
+ "for user_id, item_id in zip(interactions_df.uid, interactions_df.iid):\n",
+ " interactions_vec[user_id, item_id] += 1\n",
+ "\n",
+ "\n",
+ "res = interactions_vec.sum(axis=1)\n",
+ "for i in range(len(interactions_vec)):\n",
+ " interactions_vec[i] /= res[i]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:41:03.416061Z",
+ "start_time": "2021-10-28T18:41:03.363462Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:43.634195Z",
+ "iopub.status.busy": "2023-01-22T16:23:43.631362Z",
+ "iopub.status.idle": "2023-01-22T16:23:43.711673Z",
+ "shell.execute_reply": "2023-01-22T16:23:43.710586Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:43.634161Z"
+ },
+ "id": "9f5ec90f",
+ "outputId": "9acdfe45-aa4e-4a64-ffdc-1a750390ae84"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "6897\n",
+ "6901\n",
+ "65974\n",
+ "65974\n",
+ "{11805, 9788, 11501, 1734}\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(interactions_df.item_id.nunique())\n",
+ "print(items_ohe_df.item_id.nunique())\n",
+ "print(interactions_df.user_id.nunique())\n",
+ "print(users_ohe_df.user_id.nunique())\n",
+ "\n",
+ "print(set(items_ohe_df.item_id.unique()) - set(interactions_df.item_id.unique()))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:43.713551Z",
+ "iopub.status.busy": "2023-01-22T16:23:43.713196Z",
+ "iopub.status.idle": "2023-01-22T16:23:44.238808Z",
+ "shell.execute_reply": "2023-01-22T16:23:44.237691Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:43.713517Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "items_ohe_df = items_ohe_df[~items_ohe_df.item_id.isin([11805, 9788, 11501, 1734])]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "19e69bae"
+ },
+ "source": [
+ "Для того, чтобы можно было удобно превратить iid/uid в item_id/user_id и наоборот соберем словари \n",
+ "\n",
+ "{iid: item_id}, {uid: user_id} и {item_id: iid}, {user_id: uid}."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:41:03.637495Z",
+ "start_time": "2021-10-28T18:41:03.417544Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:44.243767Z",
+ "iopub.status.busy": "2023-01-22T16:23:44.243422Z",
+ "iopub.status.idle": "2023-01-22T16:23:44.817126Z",
+ "shell.execute_reply": "2023-01-22T16:23:44.816088Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:44.243739Z"
+ },
+ "id": "c8a84024"
+ },
+ "outputs": [],
+ "source": [
+ "iid_to_item_id = interactions_df[[\"iid\", \"item_id\"]].drop_duplicates().set_index(\"iid\").to_dict()[\"item_id\"]\n",
+ "item_id_to_iid = interactions_df[[\"iid\", \"item_id\"]].drop_duplicates().set_index(\"item_id\").to_dict()[\"iid\"]\n",
+ "\n",
+ "uid_to_user_id = interactions_df[[\"uid\", \"user_id\"]].drop_duplicates().set_index(\"uid\").to_dict()[\"user_id\"]\n",
+ "user_id_to_uid = interactions_df[[\"uid\", \"user_id\"]].drop_duplicates().set_index(\"user_id\").to_dict()[\"uid\"]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "48ca5204"
+ },
+ "source": [
+ "И проиндексируем датасеты users_ohe_df и items_ohe_df по внутренним айди:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:41:03.744883Z",
+ "start_time": "2021-10-28T18:41:03.638719Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:44.819593Z",
+ "iopub.status.busy": "2023-01-22T16:23:44.818859Z",
+ "iopub.status.idle": "2023-01-22T16:23:44.930257Z",
+ "shell.execute_reply": "2023-01-22T16:23:44.929032Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:44.819553Z"
+ },
+ "id": "4c4980ac"
+ },
+ "outputs": [],
+ "source": [
+ "items_ohe_df[\"iid\"] = items_ohe_df[\"item_id\"].apply(lambda x: item_id_to_iid[x])\n",
+ "items_ohe_df = items_ohe_df.set_index(\"iid\")\n",
+ "\n",
+ "users_ohe_df[\"uid\"] = users_ohe_df[\"user_id\"].apply(lambda x: user_id_to_uid[x])\n",
+ "users_ohe_df = users_ohe_df.set_index(\"uid\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:41:03.749717Z",
+ "start_time": "2021-10-28T18:41:03.746067Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:23:44.932306Z",
+ "iopub.status.busy": "2023-01-22T16:23:44.931684Z",
+ "iopub.status.idle": "2023-01-22T16:23:44.939719Z",
+ "shell.execute_reply": "2023-01-22T16:23:44.938755Z",
+ "shell.execute_reply.started": "2023-01-22T16:23:44.932267Z"
+ },
+ "id": "22c26d39"
+ },
+ "outputs": [],
+ "source": [
+ "def triplet_loss(y_true, y_pred, n_dims=128, alpha=0.4):\n",
+ " # будем ожидать, что на вход функции прилетит три сконкатенированных \n",
+ " # вектора - вектор юзера и два вектора айтема\n",
+ " anchor = y_pred[:, 0:n_dims]\n",
+ " positive = y_pred[:, n_dims:n_dims*2]\n",
+ " negative = y_pred[:, n_dims*2:n_dims*3]\n",
+ "\n",
+ " # считаем расстояния от вектора юзера до вектора хорошего айтема\n",
+ " pos_dist = K.sum(K.square(anchor - positive), axis=1)\n",
+ " # и до плохого\n",
+ " neg_dist = K.sum(K.square(anchor - negative), axis=1)\n",
+ "\n",
+ " # считаем лосс\n",
+ " basic_loss = pos_dist - neg_dist + alpha\n",
+ " loss = K.maximum(basic_loss, 0.0) # возвращаем ноль, если лосс отрицательный\n",
+ " \n",
+ " return loss\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T19:19:05.615364Z",
+ "start_time": "2021-10-28T19:19:05.612463Z"
+ },
+ "id": "4de262b4"
+ },
+ "source": [
+ "Попробуйте другие лоссы, например, BPR Triplet loss"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:18:11.520568Z",
+ "iopub.status.busy": "2023-01-22T16:18:11.519791Z",
+ "iopub.status.idle": "2023-01-22T16:18:11.535194Z",
+ "shell.execute_reply": "2023-01-22T16:18:11.533962Z",
+ "shell.execute_reply.started": "2023-01-22T16:18:11.520528Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def bpr_triplet_loss(y_true, y_pred, n_dims=128):\n",
+ " \n",
+ " from keras import backend as K\n",
+ " \n",
+ " anchor = y_pred[:, 0:n_dims]\n",
+ " positive = y_pred[:, n_dims:n_dims*2]\n",
+ " negative = y_pred[:, n_dims*2:n_dims*3]\n",
+ "\n",
+ " # BPR loss\n",
+ " loss = 1.0 - K.sigmoid(\n",
+ " K.sum(anchor * positive, axis=-1, keepdims=True) -\n",
+ " K.sum(anchor * negative, axis=-1, keepdims=True))\n",
+ "\n",
+ " return loss"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-23T11:20:03.327838Z",
+ "start_time": "2021-10-23T11:20:03.324389Z"
+ },
+ "id": "85d618b6"
+ },
+ "source": [
+ "## Генератор и семплирование\n",
+ "\n",
+ "- хорошим примером будет тот айтем, который был взят из датасета взаимодействий в соответствии с распределением просмотренных айтемов для этого юзера;\n",
+ "- Для негативного буду рандомно брать айтем из 100 наиболее непохожих по евклидовому расстоянию на положительный айтем по вектору жанр и ключевые слова, который человек при этом не смотрел \n",
+ "\n",
+ "Т. о., если например человек посмотрел целиком триллер, то в негативный для него должно попасть что-то вроде мелодрамы, при этом ключевые слова тоже будут сильно отличаться \n",
+ "\n",
+ "\n",
+ "Сформируем заранее следующий словарь - для каждого айтема: список из ста наиболее непохожих айтемов. Тогда в генераторе нужно будет взять рандомное значение их ста айтемов для положительного айтема. Если считать это в моменте работы генератора, то получается чрезвычайно долго, а здесь обращение к словарю - O(1), и взятие рандомного значения такое же по сложности, как в простом генераторе\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T15:37:25.302855Z",
+ "iopub.status.busy": "2023-01-22T15:37:25.302472Z",
+ "iopub.status.idle": "2023-01-22T15:37:32.215552Z",
+ "shell.execute_reply": "2023-01-22T15:37:32.214488Z",
+ "shell.execute_reply.started": "2023-01-22T15:37:25.302820Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 6897/6897 [00:02<00:00, 2513.96it/s]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# формируем слоарь\n",
+ "\n",
+ "fts = items_ohe_df[[x for x in items_ohe_df if 'genre' in x or 'keywords' in x]]\n",
+ "\n",
+ "distances = pd.DataFrame(ED(fts))\n",
+ "distances.columns = list(fts.index)\n",
+ "distances.index = fts.index\n",
+ "\n",
+ "distance_dict = {}\n",
+ "for i in tqdm(distances.columns):\n",
+ " distance_dict[i] = list(distances[i].sort_values()[-100:].index)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:39:46.221189Z",
+ "iopub.status.busy": "2023-01-22T12:39:46.220459Z",
+ "iopub.status.idle": "2023-01-22T12:39:49.254755Z",
+ "shell.execute_reply": "2023-01-22T12:39:49.253714Z",
+ "shell.execute_reply.started": "2023-01-22T12:39:46.221147Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "iids_ = np.array(fts.index)\n",
+ "user_interactions = interactions_df.groupby(\"uid\")['iid'].apply(lambda x: np.array(x.unique())).to_dict()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T15:37:35.885246Z",
+ "iopub.status.busy": "2023-01-22T15:37:35.884025Z",
+ "iopub.status.idle": "2023-01-22T15:37:35.891070Z",
+ "shell.execute_reply": "2023-01-22T15:37:35.889851Z",
+ "shell.execute_reply.started": "2023-01-22T15:37:35.885203Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "def get_negative_sample(pos_i, uid_i, distance_dict):\n",
+ " \n",
+ " neg_i = np.random.choice(distance_dict[pos_i])\n",
+ " \n",
+ " return neg_i"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T12:39:49.263942Z",
+ "iopub.status.busy": "2023-01-22T12:39:49.263310Z",
+ "iopub.status.idle": "2023-01-22T12:39:49.273779Z",
+ "shell.execute_reply": "2023-01-22T12:39:49.272870Z",
+ "shell.execute_reply.started": "2023-01-22T12:39:49.263906Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# функция для нахождения отрицательных item\n",
+ "\n",
+ "# очень долго работает \n",
+ "def get_negative_sample_old(pos_i, uid_i, fts, iids_, user_interactions):\n",
+ " \n",
+ " # айтемы , с которыми взаимодействовал юзер, их исключим\n",
+ " user_watched_items = user_interactions[uid_i]\n",
+ " \n",
+ " # векторы айтмов, которые не смотрел юзер, и по которым посчитаем евклидовы дистанции,\n",
+ " # чтобы найти самые непохожие на тот айтем, который юзер смотрел\n",
+ "\n",
+ " # из всего списка item вычитаем те, с которыми пользователь взаимодействовал\n",
+ " # список item которых пользователь не видел\n",
+ " inters = np.setdiff1d(iids_, user_watched_items, assume_unique=True)\n",
+ " \n",
+ " fts_ = fts.loc[inters].sample(n = 100)\n",
+ " \n",
+ " # вектор позитивного айтема \n",
+ " pos_item_fts = pd.DataFrame(fts.loc[pos_i, :]).T\n",
+ " \n",
+ " # считаем дистанции\n",
+ " dists = ED(fts_, pos_item_fts)\n",
+ " \n",
+ " # берем десять самых непохожих и непросмотренных юзером айтемов и из них случайно выбираем один \n",
+ " fts_['dists'] = dists\n",
+ " fts_ = fts_[['dists']]\n",
+ " neg_candidates = fts_.sort_values(by = \"dists\")[-10:].index\n",
+ " \n",
+ " neg_i = np.random.choice(neg_candidates)\n",
+ " \n",
+ " return neg_i"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:41:03.755386Z",
+ "start_time": "2021-10-28T18:41:03.750664Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T15:37:53.122995Z",
+ "iopub.status.busy": "2023-01-22T15:37:53.122612Z",
+ "iopub.status.idle": "2023-01-22T15:37:53.132222Z",
+ "shell.execute_reply": "2023-01-22T15:37:53.130866Z",
+ "shell.execute_reply.started": "2023-01-22T15:37:53.122960Z"
+ },
+ "id": "7829878b"
+ },
+ "outputs": [],
+ "source": [
+ "def generator(items, users, interactions, batch_size=1024):\n",
+ " while True:\n",
+ " uid_meta = []\n",
+ " uid_interaction = []\n",
+ " pos = []\n",
+ " neg = []\n",
+ " for _ in range(batch_size):\n",
+ " # берем рандомный uid\n",
+ " uid_i = randint(0, interactions.shape[0]-1)\n",
+ " # id хорошего айтема\n",
+ " pos_i = np.random.choice(range(interactions.shape[1]), p=interactions[uid_i])\n",
+ " # id плохого айтема\n",
+ " #neg_i = np.random.choice(range(interactions.shape[1]))\n",
+ " #neg_i = get_negative_sample_old(pos_i, uid_i, fts, iids_, user_interactions)\n",
+ " neg_i = get_negative_sample(pos_i, uid_i, distance_dict)\n",
+ " # фичи юзера\n",
+ " uid_meta.append(users.iloc[uid_i])\n",
+ " # вектор айтемов, с которыми юзер взаимодействовал\n",
+ " uid_interaction.append(interactions_vec[uid_i])\n",
+ " # фичи хорошего айтема\n",
+ " pos.append(items.iloc[pos_i])\n",
+ " # фичи плохого айтема\n",
+ " neg.append(items.iloc[neg_i])\n",
+ " \n",
+ " yield [np.array(uid_meta), np.array(uid_interaction), np.array(pos), np.array(neg)], [np.array(uid_meta), np.array(uid_interaction)]\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:41:16.386864Z",
+ "start_time": "2021-10-28T18:41:03.756363Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T15:37:57.807501Z",
+ "iopub.status.busy": "2023-01-22T15:37:57.807136Z",
+ "iopub.status.idle": "2023-01-22T15:38:48.900316Z",
+ "shell.execute_reply": "2023-01-22T15:38:48.899211Z",
+ "shell.execute_reply.started": "2023-01-22T15:37:57.807471Z"
+ },
+ "id": "af9d3c3b",
+ "outputId": "1040f567-f64a-4ccb-91a8-48034694dfdc"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "вектор фичей юзера: (1024, 19)\n",
+ "вектор взаимодействий юзера с айтемами: (1024, 6897)\n",
+ "вектор 'хорошего' айтема: (1024, 9196)\n",
+ "вектор 'плохого' айтема: (1024, 9196)\n",
+ "\n",
+ "вектор фичей юзера: (1024, 19)\n",
+ "вектор взаимодействий юзера с айтемами: (1024, 6897)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# инициализируем генератор\n",
+ "gen = generator(items=items_ohe_df.drop([\"item_id\"], axis=1), \n",
+ " users=users_ohe_df.drop([\"user_id\"], axis=1), \n",
+ " interactions=interactions_vec, batch_size=1024)\n",
+ "\n",
+ "ret = next(gen)\n",
+ "\n",
+ "\n",
+ "print(f\"вектор фичей юзера: {ret[0][0].shape}\")\n",
+ "print(f\"вектор взаимодействий юзера с айтемами: {ret[0][1].shape}\")\n",
+ "print(f\"вектор 'хорошего' айтема: {ret[0][2].shape}\")\n",
+ "print(f\"вектор 'плохого' айтема: {ret[0][3].shape}\")\n",
+ "print()\n",
+ "print(f\"вектор фичей юзера: {ret[1][0].shape}\")\n",
+ "print(f\"вектор взаимодействий юзера с айтемами: {ret[1][1].shape}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "8bcc3e80"
+ },
+ "source": [
+ "##Генаратор, который будет использовать информацию о качестве взаимодействия юзеров с айтемами для более репрезентативного сэмплирования\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:41:16.493030Z",
+ "start_time": "2021-10-28T18:41:16.388592Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T15:38:48.903047Z",
+ "iopub.status.busy": "2023-01-22T15:38:48.902586Z",
+ "iopub.status.idle": "2023-01-22T15:38:49.025937Z",
+ "shell.execute_reply": "2023-01-22T15:38:49.024831Z",
+ "shell.execute_reply.started": "2023-01-22T15:38:48.902992Z"
+ },
+ "id": "967b819f",
+ "outputId": "2f7a5885-dcb3-4ab8-80f8-57a21635595d"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "N_FACTORS: 128\n",
+ "ITEM_MODEL_SHAPE: (9196,)\n",
+ "USER_META_MODEL_SHAPE: (19,)\n",
+ "USER_INTERACTION_MODEL_SHAPE: (6897,)\n"
+ ]
+ }
+ ],
+ "source": [
+ "N_FACTORS = 128\n",
+ "\n",
+ "# в датасетах есть столбец user_id/item_id, помним, что он не является фичей для обучения!\n",
+ "ITEM_MODEL_SHAPE = (items_ohe_df.drop([\"item_id\"], axis=1).shape[1], ) \n",
+ "USER_META_MODEL_SHAPE = (users_ohe_df.drop([\"user_id\"], axis=1).shape[1], )\n",
+ "\n",
+ "USER_INTERACTION_MODEL_SHAPE = (interactions_vec.shape[1], )\n",
+ "\n",
+ "print(f\"N_FACTORS: {N_FACTORS}\")\n",
+ "print(f\"ITEM_MODEL_SHAPE: {ITEM_MODEL_SHAPE}\")\n",
+ "print(f\"USER_META_MODEL_SHAPE: {USER_META_MODEL_SHAPE}\")\n",
+ "print(f\"USER_INTERACTION_MODEL_SHAPE: {USER_INTERACTION_MODEL_SHAPE}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:41:16.816499Z",
+ "start_time": "2021-10-28T18:41:16.494387Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T15:38:49.027755Z",
+ "iopub.status.busy": "2023-01-22T15:38:49.027467Z",
+ "iopub.status.idle": "2023-01-22T15:38:53.151538Z",
+ "shell.execute_reply": "2023-01-22T15:38:53.150595Z",
+ "shell.execute_reply.started": "2023-01-22T15:38:49.027729Z"
+ },
+ "id": "de649a01"
+ },
+ "outputs": [],
+ "source": [
+ "def item_model(n_factors=N_FACTORS):\n",
+ " # входной слой\n",
+ " inp = keras.layers.Input(shape=ITEM_MODEL_SHAPE)\n",
+ " \n",
+ " # полносвязный слой\n",
+ " layer_1 = keras.layers.Dense(N_FACTORS, activation='elu', use_bias=False,\n",
+ " kernel_regularizer=keras.regularizers.l2(1e-6),\n",
+ " activity_regularizer=keras.regularizers.l2(l2=1e-6))(inp)\n",
+ "\n",
+ " # делаем residual connection - складываем два слоя, \n",
+ " # чтобы градиенты не затухали во время обучения\n",
+ " layer_2 = keras.layers.Dense(N_FACTORS, activation='elu', use_bias=False,\n",
+ " kernel_regularizer=keras.regularizers.l2(1e-6),\n",
+ " activity_regularizer=keras.regularizers.l2(l2=1e-6))(layer_1)\n",
+ " \n",
+ " add = keras.layers.Add()([layer_1, layer_2])\n",
+ " \n",
+ " # выходной слой\n",
+ " out = keras.layers.Dense(N_FACTORS, activation='linear', use_bias=False,\n",
+ " kernel_regularizer=keras.regularizers.l2(1e-6),\n",
+ " activity_regularizer=keras.regularizers.l2(l2=1e-6))(add)\n",
+ " \n",
+ " return keras.models.Model(inp, out)\n",
+ "\n",
+ "\n",
+ "def user_model(n_factors=N_FACTORS):\n",
+ " # входной слой для вектора фичей юзера (из users_ohe_df)\n",
+ " inp_meta = keras.layers.Input(shape=USER_META_MODEL_SHAPE)\n",
+ " # входной слой для вектора просмотров (из iteractions_vec)\n",
+ " inp_interaction = keras.layers.Input(shape=USER_INTERACTION_MODEL_SHAPE)\n",
+ "\n",
+ " # полносвязный слой\n",
+ " layer_1_meta = keras.layers.Dense(N_FACTORS, activation='elu', use_bias=False,\n",
+ " kernel_regularizer=keras.regularizers.l2(1e-6),\n",
+ " activity_regularizer=keras.regularizers.l2(l2=1e-6))(inp_meta)\n",
+ "\n",
+ " layer_1_interaction = keras.layers.Dense(N_FACTORS, activation='elu', use_bias=False,\n",
+ " kernel_regularizer=keras.regularizers.l2(1e-6),\n",
+ " activity_regularizer=keras.regularizers.l2(l2=1e-6))(inp_interaction)\n",
+ "\n",
+ " # делаем residual connection - складываем два слоя,\n",
+ " # чтобы градиенты не затухали во время обучения\n",
+ " layer_2_meta = keras.layers.Dense(N_FACTORS, activation='elu', use_bias=False,\n",
+ " kernel_regularizer=keras.regularizers.l2(1e-6),\n",
+ " activity_regularizer=keras.regularizers.l2(l2=1e-6))(layer_1_meta)\n",
+ " \n",
+ "\n",
+ " add = keras.layers.Add()([layer_1_meta, layer_2_meta])\n",
+ " \n",
+ " # конкатенируем вектор фичей с вектором просмотров\n",
+ " concat_meta_interaction = keras.layers.Concatenate()([add, layer_1_interaction])\n",
+ " \n",
+ " # выходной слой\n",
+ " out = keras.layers.Dense(N_FACTORS, activation='linear', use_bias=False,\n",
+ " kernel_regularizer=keras.regularizers.l2(1e-6),\n",
+ " activity_regularizer=keras.regularizers.l2(l2=1e-6))(concat_meta_interaction)\n",
+ " \n",
+ " return keras.models.Model([inp_meta, inp_interaction], out)\n",
+ "\n",
+ "# инициализируем модели юзера и айтема\n",
+ "i2v = item_model()\n",
+ "u2v = user_model()\n",
+ "\n",
+ "# вход для вектора фичей юзера (из users_ohe_df)\n",
+ "ancor_meta_in = keras.layers.Input(shape=USER_META_MODEL_SHAPE)\n",
+ "# вход для вектора просмотра юзера (из interactions_vec)\n",
+ "ancor_interaction_in = keras.layers.Input(shape=USER_INTERACTION_MODEL_SHAPE)\n",
+ "\n",
+ "# вход для вектора \"хорошего\" айтема\n",
+ "pos_in = keras.layers.Input(shape=ITEM_MODEL_SHAPE)\n",
+ "# вход для вектора \"плохого\" айтема\n",
+ "neg_in = keras.layers.Input(shape=ITEM_MODEL_SHAPE)\n",
+ "\n",
+ "# получаем вектор юзера\n",
+ "ancor = u2v([ancor_meta_in, ancor_interaction_in])\n",
+ "# получаем вектор \"хорошего\" айтема\n",
+ "pos = i2v(pos_in)\n",
+ "# получаем вектор \"плохого\" айтема\n",
+ "neg = i2v(neg_in)\n",
+ "\n",
+ "# конкатенируем полученные векторы\n",
+ "res = keras.layers.Concatenate(name=\"concat_ancor_pos_neg\")([ancor, pos, neg])\n",
+ "\n",
+ "# собираем модель\n",
+ "model = keras.models.Model([ancor_meta_in, ancor_interaction_in, pos_in, neg_in], res)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:41:16.822662Z",
+ "start_time": "2021-10-28T18:41:16.817857Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T15:38:53.154784Z",
+ "iopub.status.busy": "2023-01-22T15:38:53.154419Z",
+ "iopub.status.idle": "2023-01-22T15:38:53.789679Z",
+ "shell.execute_reply": "2023-01-22T15:38:53.788675Z",
+ "shell.execute_reply.started": "2023-01-22T15:38:53.154748Z"
+ },
+ "id": "e912d920"
+ },
+ "outputs": [],
+ "source": [
+ "model_name = 'recsys_resnet_linear'\n",
+ "\n",
+ "# логируем процесс обучения в тензорборд\n",
+ "t_board = keras.callbacks.TensorBoard(log_dir=f'runs/{model_name}')\n",
+ "\n",
+ "# уменьшаем learning_rate, если лосс долго не уменьшается (в течение двух эпох)\n",
+ "decay = keras.callbacks.ReduceLROnPlateau(monitor='loss', patience=2, factor=0.8, verbose=1)\n",
+ "\n",
+ "# сохраняем модель после каждой эпохи, если лосс уменьшился\n",
+ "check = keras.callbacks.ModelCheckpoint(filepath=model_name + '/epoch{epoch}-{loss:.2f}.h5', monitor=\"loss\")\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:41:16.832365Z",
+ "start_time": "2021-10-28T18:41:16.824484Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T15:38:53.792105Z",
+ "iopub.status.busy": "2023-01-22T15:38:53.791371Z",
+ "iopub.status.idle": "2023-01-22T15:38:53.808624Z",
+ "shell.execute_reply": "2023-01-22T15:38:53.807732Z",
+ "shell.execute_reply.started": "2023-01-22T15:38:53.792041Z"
+ },
+ "id": "f95049f6"
+ },
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING:absl:At this time, the v2.11+ optimizer `tf.keras.optimizers.Adam` runs slowly on M1/M2 Macs, please use the legacy Keras optimizer instead, located at `tf.keras.optimizers.legacy.Adam`.\n",
+ "WARNING:absl:`lr` is deprecated in Keras optimizer, please use `learning_rate` or use the legacy optimizer, e.g.,tf.keras.optimizers.legacy.Adam.\n"
+ ]
+ }
+ ],
+ "source": [
+ "# компилируем модель, используем оптимайзер Adam и triplet loss\n",
+ "opt = keras.optimizers.Adam(lr=0.001)\n",
+ "model.compile(loss=triplet_loss, optimizer=opt)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:41:16.867472Z",
+ "start_time": "2021-10-28T18:41:16.833753Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T15:38:53.811821Z",
+ "iopub.status.busy": "2023-01-22T15:38:53.811155Z",
+ "iopub.status.idle": "2023-01-22T15:38:53.852098Z",
+ "shell.execute_reply": "2023-01-22T15:38:53.851090Z",
+ "shell.execute_reply.started": "2023-01-22T15:38:53.811786Z"
+ },
+ "id": "fb9382d0",
+ "outputId": "2eca9a17-1544-4e27-a483-b86d11391767"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Model: \"model_3\"\n",
+ "__________________________________________________________________________________________________\n",
+ " Layer (type) Output Shape Param # Connected to \n",
+ "==================================================================================================\n",
+ " input_8 (InputLayer) [(None, 9196)] 0 [] \n",
+ " \n",
+ " dense_7 (Dense) (None, 128) 1177088 ['input_8[0][0]'] \n",
+ " \n",
+ " dense_8 (Dense) (None, 128) 16384 ['dense_7[0][0]'] \n",
+ " \n",
+ " add_2 (Add) (None, 128) 0 ['dense_7[0][0]', \n",
+ " 'dense_8[0][0]'] \n",
+ " \n",
+ " dense_9 (Dense) (None, 128) 16384 ['add_2[0][0]'] \n",
+ " \n",
+ "==================================================================================================\n",
+ "Total params: 1209856 (4.62 MB)\n",
+ "Trainable params: 1209856 (4.62 MB)\n",
+ "Non-trainable params: 0 (0.00 Byte)\n",
+ "__________________________________________________________________________________________________\n"
+ ]
+ }
+ ],
+ "source": [
+ "# модель айтема\n",
+ "item_model().summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:41:16.923402Z",
+ "start_time": "2021-10-28T18:41:16.868877Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T15:38:53.854198Z",
+ "iopub.status.busy": "2023-01-22T15:38:53.853594Z",
+ "iopub.status.idle": "2023-01-22T15:38:53.908177Z",
+ "shell.execute_reply": "2023-01-22T15:38:53.907222Z",
+ "shell.execute_reply.started": "2023-01-22T15:38:53.854161Z"
+ },
+ "id": "286149d1",
+ "outputId": "4284ba09-05ef-4963-c637-67e919701d19"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Model: \"model_4\"\n",
+ "__________________________________________________________________________________________________\n",
+ " Layer (type) Output Shape Param # Connected to \n",
+ "==================================================================================================\n",
+ " input_9 (InputLayer) [(None, 19)] 0 [] \n",
+ " \n",
+ " dense_10 (Dense) (None, 128) 2432 ['input_9[0][0]'] \n",
+ " \n",
+ " dense_12 (Dense) (None, 128) 16384 ['dense_10[0][0]'] \n",
+ " \n",
+ " input_10 (InputLayer) [(None, 6897)] 0 [] \n",
+ " \n",
+ " add_3 (Add) (None, 128) 0 ['dense_10[0][0]', \n",
+ " 'dense_12[0][0]'] \n",
+ " \n",
+ " dense_11 (Dense) (None, 128) 882816 ['input_10[0][0]'] \n",
+ " \n",
+ " concatenate_1 (Concatenate (None, 256) 0 ['add_3[0][0]', \n",
+ " ) 'dense_11[0][0]'] \n",
+ " \n",
+ " dense_13 (Dense) (None, 128) 32768 ['concatenate_1[0][0]'] \n",
+ " \n",
+ "==================================================================================================\n",
+ "Total params: 934400 (3.56 MB)\n",
+ "Trainable params: 934400 (3.56 MB)\n",
+ "Non-trainable params: 0 (0.00 Byte)\n",
+ "__________________________________________________________________________________________________\n"
+ ]
+ }
+ ],
+ "source": [
+ "# модель юзера\n",
+ "user_model().summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T18:41:16.929341Z",
+ "start_time": "2021-10-28T18:41:16.924663Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T15:38:53.909970Z",
+ "iopub.status.busy": "2023-01-22T15:38:53.909370Z",
+ "iopub.status.idle": "2023-01-22T15:38:53.917202Z",
+ "shell.execute_reply": "2023-01-22T15:38:53.916103Z",
+ "shell.execute_reply.started": "2023-01-22T15:38:53.909934Z"
+ },
+ "id": "d9f25a3f",
+ "outputId": "6f9a3700-4420-4345-8331-82f7207b566b"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Model: \"model_2\"\n",
+ "__________________________________________________________________________________________________\n",
+ " Layer (type) Output Shape Param # Connected to \n",
+ "==================================================================================================\n",
+ " input_4 (InputLayer) [(None, 19)] 0 [] \n",
+ " \n",
+ " input_5 (InputLayer) [(None, 6897)] 0 [] \n",
+ " \n",
+ " input_6 (InputLayer) [(None, 9196)] 0 [] \n",
+ " \n",
+ " input_7 (InputLayer) [(None, 9196)] 0 [] \n",
+ " \n",
+ " model_1 (Functional) (None, 128) 934400 ['input_4[0][0]', \n",
+ " 'input_5[0][0]'] \n",
+ " \n",
+ " model (Functional) (None, 128) 1209856 ['input_6[0][0]', \n",
+ " 'input_7[0][0]'] \n",
+ " \n",
+ " concat_ancor_pos_neg (Conc (None, 384) 0 ['model_1[0][0]', \n",
+ " atenate) 'model[0][0]', \n",
+ " 'model[1][0]'] \n",
+ " \n",
+ "==================================================================================================\n",
+ "Total params: 2144256 (8.18 MB)\n",
+ "Trainable params: 2144256 (8.18 MB)\n",
+ "Non-trainable params: 0 (0.00 Byte)\n",
+ "__________________________________________________________________________________________________\n"
+ ]
+ }
+ ],
+ "source": [
+ "# общая модель\n",
+ "model.summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T19:15:21.657529Z",
+ "start_time": "2021-10-28T19:15:16.365923Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T15:38:53.919463Z",
+ "iopub.status.busy": "2023-01-22T15:38:53.918611Z",
+ "iopub.status.idle": "2023-01-22T16:17:01.448835Z",
+ "shell.execute_reply": "2023-01-22T16:17:01.447888Z",
+ "shell.execute_reply.started": "2023-01-22T15:38:53.919424Z"
+ },
+ "id": "99d50830",
+ "outputId": "cee25813-2173-460f-e6f2-024d75d1db08"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1/30\n",
+ "100/100 [==============================] - 42s 418ms/step - loss: 0.4123 - lr: 0.0010\n",
+ "Epoch 2/30\n",
+ "100/100 [==============================] - 42s 425ms/step - loss: 0.2973 - lr: 0.0010\n",
+ "Epoch 3/30\n",
+ "100/100 [==============================] - 42s 423ms/step - loss: 0.2713 - lr: 0.0010\n",
+ "Epoch 4/30\n",
+ "100/100 [==============================] - 642s 6s/step - loss: 0.2240 - lr: 0.0010\n",
+ "Epoch 5/30\n",
+ "100/100 [==============================] - 41s 413ms/step - loss: 0.2200 - lr: 0.0010\n",
+ "Epoch 6/30\n",
+ "100/100 [==============================] - 41s 415ms/step - loss: 0.1929 - lr: 0.0010\n",
+ "Epoch 7/30\n",
+ "100/100 [==============================] - 42s 427ms/step - loss: 0.1727 - lr: 0.0010\n",
+ "Epoch 8/30\n",
+ "100/100 [==============================] - 42s 423ms/step - loss: 0.1849 - lr: 0.0010\n",
+ "Epoch 9/30\n",
+ "100/100 [==============================] - 41s 418ms/step - loss: 0.1594 - lr: 0.0010\n",
+ "Epoch 10/30\n",
+ "100/100 [==============================] - 42s 420ms/step - loss: 0.1485 - lr: 0.0010\n",
+ "Epoch 11/30\n",
+ "100/100 [==============================] - 41s 417ms/step - loss: 0.1523 - lr: 0.0010\n",
+ "Epoch 12/30\n",
+ "100/100 [==============================] - 41s 415ms/step - loss: 0.1328 - lr: 0.0010\n",
+ "Epoch 13/30\n",
+ "100/100 [==============================] - 41s 419ms/step - loss: 0.1407 - lr: 0.0010\n",
+ "Epoch 14/30\n",
+ "100/100 [==============================] - ETA: 0s - loss: 0.1524\n",
+ "Epoch 14: ReduceLROnPlateau reducing learning rate to 0.000800000037997961.\n",
+ "100/100 [==============================] - 42s 421ms/step - loss: 0.1524 - lr: 0.0010\n",
+ "Epoch 15/30\n",
+ "100/100 [==============================] - 42s 420ms/step - loss: 0.1304 - lr: 8.0000e-04\n",
+ "Epoch 16/30\n",
+ "100/100 [==============================] - 42s 421ms/step - loss: 0.1305 - lr: 8.0000e-04\n",
+ "Epoch 17/30\n",
+ "100/100 [==============================] - 41s 415ms/step - loss: 0.1299 - lr: 8.0000e-04\n",
+ "Epoch 18/30\n",
+ "100/100 [==============================] - 41s 416ms/step - loss: 0.1332 - lr: 8.0000e-04\n",
+ "Epoch 19/30\n",
+ "100/100 [==============================] - 578s 6s/step - loss: 0.1128 - lr: 8.0000e-04\n",
+ "Epoch 20/30\n",
+ "100/100 [==============================] - 298s 3s/step - loss: 0.1168 - lr: 8.0000e-04\n",
+ "Epoch 21/30\n",
+ "100/100 [==============================] - ETA: 0s - loss: 0.1145\n",
+ "Epoch 21: ReduceLROnPlateau reducing learning rate to 0.0006400000303983689.\n",
+ "100/100 [==============================] - 42s 424ms/step - loss: 0.1145 - lr: 8.0000e-04\n",
+ "Epoch 22/30\n",
+ "100/100 [==============================] - 42s 423ms/step - loss: 0.1230 - lr: 6.4000e-04\n",
+ "Epoch 23/30\n",
+ "100/100 [==============================] - 42s 421ms/step - loss: 0.1108 - lr: 6.4000e-04\n",
+ "Epoch 24/30\n",
+ "100/100 [==============================] - 42s 422ms/step - loss: 0.0976 - lr: 6.4000e-04\n",
+ "Epoch 25/30\n",
+ "100/100 [==============================] - 42s 422ms/step - loss: 0.1116 - lr: 6.4000e-04\n",
+ "Epoch 26/30\n",
+ "100/100 [==============================] - ETA: 0s - loss: 0.0996\n",
+ "Epoch 26: ReduceLROnPlateau reducing learning rate to 0.0005120000336319208.\n",
+ "100/100 [==============================] - 43s 430ms/step - loss: 0.0996 - lr: 6.4000e-04\n",
+ "Epoch 27/30\n",
+ "100/100 [==============================] - 43s 433ms/step - loss: 0.1010 - lr: 5.1200e-04\n",
+ "Epoch 28/30\n",
+ "100/100 [==============================] - ETA: 0s - loss: 0.0984\n",
+ "Epoch 28: ReduceLROnPlateau reducing learning rate to 0.00040960004553198815.\n",
+ "100/100 [==============================] - 42s 429ms/step - loss: 0.0984 - lr: 5.1200e-04\n",
+ "Epoch 29/30\n",
+ "100/100 [==============================] - 43s 430ms/step - loss: 0.0865 - lr: 4.0960e-04\n",
+ "Epoch 30/30\n",
+ "100/100 [==============================] - 43s 433ms/step - loss: 0.1049 - lr: 4.0960e-04\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 46,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# начинаем обучение, не забывая дропнуть столбцы item_id и user_id \n",
+ "# из датафреймов при инициализации генератора.\n",
+ "\n",
+ "# batch_size можно (и лучше) поставить побольше, если вы не органичены в ресурсах\n",
+ "\n",
+ "model.fit(generator(items=items_ohe_df.drop([\"item_id\"], axis=1), \n",
+ " users=users_ohe_df.drop([\"user_id\"], axis=1), \n",
+ " interactions=interactions_vec,\n",
+ " batch_size=16), \n",
+ " steps_per_epoch=100, \n",
+ " epochs=30, \n",
+ " initial_epoch=0,\n",
+ " callbacks=[decay, t_board, check]\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:17:01.453483Z",
+ "iopub.status.busy": "2023-01-22T16:17:01.453198Z",
+ "iopub.status.idle": "2023-01-22T16:17:01.486783Z",
+ "shell.execute_reply": "2023-01-22T16:17:01.485812Z",
+ "shell.execute_reply.started": "2023-01-22T16:17:01.453458Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
+ ]
+ }
+ ],
+ "source": [
+ "i2v.save('i2v.hdf5')\n",
+ "u2v.save('u2v.hdf5')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T19:15:26.511958Z",
+ "start_time": "2021-10-28T19:15:26.151899Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:24:28.685695Z",
+ "iopub.status.busy": "2023-01-22T16:24:28.685290Z",
+ "iopub.status.idle": "2023-01-22T16:24:30.854186Z",
+ "shell.execute_reply": "2023-01-22T16:24:30.853120Z",
+ "shell.execute_reply.started": "2023-01-22T16:24:28.685657Z"
+ },
+ "id": "94d23f62",
+ "outputId": "4a500ea7-fa38-4455-a51a-2bd0113fa2f2"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1/1 [==============================] - 0s 129ms/step\n",
+ "1/1 [==============================] - 0s 29ms/step\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "array([[0.76927984]], dtype=float32)"
+ ]
+ },
+ "execution_count": 49,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# берем рандомного юзера\n",
+ "rand_uid = np.random.choice(list(users_ohe_df.index))\n",
+ "\n",
+ "# получаем фичи юзера и вектор его просмотров айтемов\n",
+ "user_meta_feats = users_ohe_df.drop([\"user_id\"], axis=1).iloc[rand_uid]\n",
+ "user_interaction_vec = interactions_vec[rand_uid]\n",
+ "\n",
+ "# берем рандомный айтем\n",
+ "rand_iid = np.random.choice(list(items_ohe_df.index))\n",
+ "# получаем фичи айтема\n",
+ "item_feats = items_ohe_df.drop([\"item_id\"], axis=1).iloc[rand_iid]\n",
+ "\n",
+ "# получаем вектор юзера\n",
+ "user_vec = u2v.predict([np.array(user_meta_feats).reshape(1, -1), \n",
+ " np.array(user_interaction_vec).reshape(1, -1)])\n",
+ "\n",
+ "# и вектор айтема\n",
+ "item_vec = i2v.predict(np.array(item_feats).reshape(1, -1))\n",
+ "\n",
+ "# считаем расстояние между вектором юзера и вектором айтема\n",
+ "from sklearn.metrics.pairwise import euclidean_distances as ED\n",
+ "\n",
+ "ED(user_vec, item_vec)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2021-10-28T19:15:28.951471Z",
+ "start_time": "2021-10-28T19:15:27.763367Z"
+ },
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:24:35.398767Z",
+ "iopub.status.busy": "2023-01-22T16:24:35.398342Z",
+ "iopub.status.idle": "2023-01-22T16:24:37.179114Z",
+ "shell.execute_reply": "2023-01-22T16:24:37.177336Z",
+ "shell.execute_reply.started": "2023-01-22T16:24:35.398731Z"
+ },
+ "id": "d537d3e8",
+ "outputId": "6bdce370-c348-4f0b-cd4f-3cbb0ec3d019"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "216/216 [==============================] - 0s 883us/step\n"
+ ]
+ }
+ ],
+ "source": [
+ "# получаем фичи всех айтемов\n",
+ "items_feats = items_ohe_df.drop([\"item_id\"], axis=1).to_numpy()\n",
+ "# получаем векторы всех айтемов\n",
+ "items_vecs = i2v.predict(items_feats)\n",
+ "\n",
+ "# считаем расстояния\n",
+ "dists = ED(user_vec, items_vecs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:24:37.200481Z",
+ "iopub.status.busy": "2023-01-22T16:24:37.199790Z",
+ "iopub.status.idle": "2023-01-22T16:24:37.219685Z",
+ "shell.execute_reply": "2023-01-22T16:24:37.218365Z",
+ "shell.execute_reply.started": "2023-01-22T16:24:37.200421Z"
+ },
+ "id": "udY36b_l0okL",
+ "outputId": "53287102-2434-490e-d668-b8085515d4b8"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(6897, 128)"
+ ]
+ },
+ "execution_count": 51,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "items_vecs.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:24:38.051890Z",
+ "iopub.status.busy": "2023-01-22T16:24:38.051199Z",
+ "iopub.status.idle": "2023-01-22T16:24:38.063043Z",
+ "shell.execute_reply": "2023-01-22T16:24:38.061416Z",
+ "shell.execute_reply.started": "2023-01-22T16:24:38.051840Z"
+ },
+ "id": "XasFl6RN0snT"
+ },
+ "outputs": [],
+ "source": [
+ "users_meta_feats = users_ohe_df.drop([\"user_id\"], axis=1)\n",
+ "users_interaction_vec = interactions_vec"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:24:38.561257Z",
+ "iopub.status.busy": "2023-01-22T16:24:38.560146Z",
+ "iopub.status.idle": "2023-01-22T16:24:38.568144Z",
+ "shell.execute_reply": "2023-01-22T16:24:38.566777Z",
+ "shell.execute_reply.started": "2023-01-22T16:24:38.561176Z"
+ },
+ "id": "cntEZU450_MI",
+ "outputId": "c9aace32-281a-4b0e-8e0d-8b0f1088ce9b"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(65974, 19)"
+ ]
+ },
+ "execution_count": 53,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "users_meta_feats.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:24:40.475433Z",
+ "iopub.status.busy": "2023-01-22T16:24:40.472691Z",
+ "iopub.status.idle": "2023-01-22T16:24:40.484559Z",
+ "shell.execute_reply": "2023-01-22T16:24:40.483559Z",
+ "shell.execute_reply.started": "2023-01-22T16:24:40.475392Z"
+ },
+ "id": "kQ1EZolS1B1Y",
+ "outputId": "ca9dc5eb-5519-4c75-f1d8-4945941a46d1"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(65974, 6897)"
+ ]
+ },
+ "execution_count": 54,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "users_interaction_vec.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:24:40.786186Z",
+ "iopub.status.busy": "2023-01-22T16:24:40.785775Z",
+ "iopub.status.idle": "2023-01-22T16:24:40.797826Z",
+ "shell.execute_reply": "2023-01-22T16:24:40.796580Z",
+ "shell.execute_reply.started": "2023-01-22T16:24:40.786151Z"
+ },
+ "id": "hKU4MD7M1dp5",
+ "outputId": "bd79e8e2-8a82-4ff7-d1ac-849e3425c2c8"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(65974, 19)"
+ ]
+ },
+ "execution_count": 55,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.array(users_meta_feats).shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:24:41.775332Z",
+ "iopub.status.busy": "2023-01-22T16:24:41.774265Z",
+ "iopub.status.idle": "2023-01-22T16:24:41.780836Z",
+ "shell.execute_reply": "2023-01-22T16:24:41.779665Z",
+ "shell.execute_reply.started": "2023-01-22T16:24:41.775281Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "del interactions_vec\n",
+ "del users_df, interactions_df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:24:52.966474Z",
+ "iopub.status.busy": "2023-01-22T16:24:52.965002Z",
+ "iopub.status.idle": "2023-01-22T16:24:57.402446Z",
+ "shell.execute_reply": "2023-01-22T16:24:57.401009Z",
+ "shell.execute_reply.started": "2023-01-22T16:24:52.966417Z"
+ },
+ "id": "x16g5FM21XGJ",
+ "outputId": "9b43e3e6-f98b-466a-8b0d-c2aeb0ca724e"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "625/625 [==============================] - 1s 809us/step\n",
+ "625/625 [==============================] - 0s 779us/step\n",
+ "812/812 [==============================] - 1s 763us/step\n"
+ ]
+ }
+ ],
+ "source": [
+ "users_vec_1 = u2v.predict([np.array(users_meta_feats.iloc[:20000]), \n",
+ " np.array(users_interaction_vec[:20000])])\n",
+ "users_vec_2 = u2v.predict([np.array(users_meta_feats.iloc[20000:40000]), \n",
+ " np.array(users_interaction_vec[20000:40000])])\n",
+ "users_vec_3 = u2v.predict([np.array(users_meta_feats.iloc[40000:]), \n",
+ " np.array(users_interaction_vec[40000:])])\n",
+ "users_vec = np.concatenate((users_vec_1, users_vec_2, users_vec_3))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:25:54.668894Z",
+ "iopub.status.busy": "2023-01-22T16:25:54.667629Z",
+ "iopub.status.idle": "2023-01-22T16:25:54.674606Z",
+ "shell.execute_reply": "2023-01-22T16:25:54.673447Z",
+ "shell.execute_reply.started": "2023-01-22T16:25:54.668856Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "del users_vec_1, users_vec_2, users_vec_3, users_interaction_vec"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:25:57.451831Z",
+ "iopub.status.busy": "2023-01-22T16:25:57.451189Z",
+ "iopub.status.idle": "2023-01-22T16:25:57.458982Z",
+ "shell.execute_reply": "2023-01-22T16:25:57.457745Z",
+ "shell.execute_reply.started": "2023-01-22T16:25:57.451795Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(65974, 128)"
+ ]
+ },
+ "execution_count": 59,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "users_vec.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:20:21.497209Z",
+ "iopub.status.busy": "2023-01-22T16:20:21.496765Z",
+ "iopub.status.idle": "2023-01-22T16:20:21.504388Z",
+ "shell.execute_reply": "2023-01-22T16:20:21.503250Z",
+ "shell.execute_reply.started": "2023-01-22T16:20:21.497158Z"
+ },
+ "id": "G4pntPu10ogl",
+ "outputId": "557b6f56-dff5-46e9-da97-569001c59c79"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(6897, 128)"
+ ]
+ },
+ "execution_count": 60,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "items_vecs.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 61,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:26:12.212846Z",
+ "iopub.status.busy": "2023-01-22T16:26:12.212440Z",
+ "iopub.status.idle": "2023-01-22T16:26:19.980077Z",
+ "shell.execute_reply": "2023-01-22T16:26:19.978704Z",
+ "shell.execute_reply.started": "2023-01-22T16:26:12.212812Z"
+ },
+ "id": "hnUX3Yte2Jcw"
+ },
+ "outputs": [],
+ "source": [
+ "dists = ED(users_vec, items_vecs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:26:33.221953Z",
+ "iopub.status.busy": "2023-01-22T16:26:33.220783Z",
+ "iopub.status.idle": "2023-01-22T16:26:33.231255Z",
+ "shell.execute_reply": "2023-01-22T16:26:33.229877Z",
+ "shell.execute_reply.started": "2023-01-22T16:26:33.221902Z"
+ },
+ "id": "MDgiwnnu2KHk",
+ "outputId": "ae9eeb6f-8a29-4195-8bdf-eeaa51b6d049"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(65974, 6897)"
+ ]
+ },
+ "execution_count": 62,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "dists.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:26:36.257959Z",
+ "iopub.status.busy": "2023-01-22T16:26:36.257347Z",
+ "iopub.status.idle": "2023-01-22T16:26:45.531254Z",
+ "shell.execute_reply": "2023-01-22T16:26:45.530120Z",
+ "shell.execute_reply.started": "2023-01-22T16:26:36.257910Z"
+ },
+ "id": "Ru8IQwSV2UrB"
+ },
+ "outputs": [],
+ "source": [
+ "top10_iids_1 = np.argsort(dists[:20000], axis=1)[:,:10]\n",
+ "top10_iids_2 = np.argsort(dists[20000:40000], axis=1)[:,:10]\n",
+ "top10_iids_3 = np.argsort(dists[40000:], axis=1)[:,:10]\n",
+ "top10_iids = np.concatenate((top10_iids_1, top10_iids_2, top10_iids_3))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 64,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:28:25.544273Z",
+ "iopub.status.busy": "2023-01-22T16:28:25.543272Z",
+ "iopub.status.idle": "2023-01-22T16:28:25.551809Z",
+ "shell.execute_reply": "2023-01-22T16:28:25.550511Z",
+ "shell.execute_reply.started": "2023-01-22T16:28:25.544233Z"
+ },
+ "id": "pAzg23jU3TSo",
+ "outputId": "baeb6ea9-ca6f-4bb9-da7b-3fc16669db23"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(65974, 10)"
+ ]
+ },
+ "execution_count": 64,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "top10_iids.reshape(dists.shape[0], 10).shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:28:37.182827Z",
+ "iopub.status.busy": "2023-01-22T16:28:37.182088Z",
+ "iopub.status.idle": "2023-01-22T16:28:37.190183Z",
+ "shell.execute_reply": "2023-01-22T16:28:37.188831Z",
+ "shell.execute_reply.started": "2023-01-22T16:28:37.182788Z"
+ },
+ "id": "ehH1-C-S6yE9",
+ "outputId": "5a08578e-7bc1-404a-db00-5d2114b7ad28"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(65974, 10)"
+ ]
+ },
+ "execution_count": 65,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "top10_iids.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 66,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:28:47.517537Z",
+ "iopub.status.busy": "2023-01-22T16:28:47.516704Z",
+ "iopub.status.idle": "2023-01-22T16:28:47.800629Z",
+ "shell.execute_reply": "2023-01-22T16:28:47.799272Z",
+ "shell.execute_reply.started": "2023-01-22T16:28:47.517501Z"
+ },
+ "id": "srptkYsFsk1V"
+ },
+ "outputs": [],
+ "source": [
+ "top10_iids_item = [iid_to_item_id[iid] for iid in top10_iids.reshape(-1)]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 67,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:28:51.654826Z",
+ "iopub.status.busy": "2023-01-22T16:28:51.653959Z",
+ "iopub.status.idle": "2023-01-22T16:28:51.700602Z",
+ "shell.execute_reply": "2023-01-22T16:28:51.699239Z",
+ "shell.execute_reply.started": "2023-01-22T16:28:51.654791Z"
+ },
+ "id": "GWCz9zErskwn"
+ },
+ "outputs": [],
+ "source": [
+ "top10_iids_item = np.array(top10_iids_item).reshape(top10_iids.shape)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 68,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:28:57.535876Z",
+ "iopub.status.busy": "2023-01-22T16:28:57.535194Z",
+ "iopub.status.idle": "2023-01-22T16:28:57.543046Z",
+ "shell.execute_reply": "2023-01-22T16:28:57.541704Z",
+ "shell.execute_reply.started": "2023-01-22T16:28:57.535836Z"
+ },
+ "id": "pNq_brUisknx",
+ "outputId": "f1980332-ef9e-4920-b470-675a567c815a"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(65974, 10)"
+ ]
+ },
+ "execution_count": 68,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "top10_iids_item.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 69,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:29:00.647959Z",
+ "iopub.status.busy": "2023-01-22T16:29:00.646906Z",
+ "iopub.status.idle": "2023-01-22T16:29:00.657077Z",
+ "shell.execute_reply": "2023-01-22T16:29:00.655386Z",
+ "shell.execute_reply.started": "2023-01-22T16:29:00.647919Z"
+ },
+ "id": "z6ussvRSth2h"
+ },
+ "outputs": [],
+ "source": [
+ "df_dssm = pd.DataFrame(columns = ['user_id', 'item_id'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 70,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:29:08.741226Z",
+ "iopub.status.busy": "2023-01-22T16:29:08.740780Z",
+ "iopub.status.idle": "2023-01-22T16:29:08.751118Z",
+ "shell.execute_reply": "2023-01-22T16:29:08.750073Z",
+ "shell.execute_reply.started": "2023-01-22T16:29:08.741183Z"
+ },
+ "id": "Y9XvpPzRu82h",
+ "outputId": "8397c843-1427-444e-af8d-f5c5cd19a80d"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " user_id | \n",
+ " item_id | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "Empty DataFrame\n",
+ "Columns: [user_id, item_id]\n",
+ "Index: []"
+ ]
+ },
+ "execution_count": 70,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_dssm.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 71,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:29:16.894986Z",
+ "iopub.status.busy": "2023-01-22T16:29:16.894575Z",
+ "iopub.status.idle": "2023-01-22T16:29:16.955651Z",
+ "shell.execute_reply": "2023-01-22T16:29:16.954612Z",
+ "shell.execute_reply.started": "2023-01-22T16:29:16.894935Z"
+ },
+ "id": "KieINSdwvIu7"
+ },
+ "outputs": [],
+ "source": [
+ "df_dssm = pd.DataFrame({'user_id': [uid_to_user_id[uid] for uid in np.arange(top10_iids_item.shape[0])]})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 72,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:29:18.345819Z",
+ "iopub.status.busy": "2023-01-22T16:29:18.345404Z",
+ "iopub.status.idle": "2023-01-22T16:29:18.371714Z",
+ "shell.execute_reply": "2023-01-22T16:29:18.370527Z",
+ "shell.execute_reply.started": "2023-01-22T16:29:18.345785Z"
+ },
+ "id": "RSYHUj7IuzT1"
+ },
+ "outputs": [],
+ "source": [
+ "df_dssm['item_id'] = list(top10_iids_item)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 73,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:29:19.355843Z",
+ "iopub.status.busy": "2023-01-22T16:29:19.355038Z",
+ "iopub.status.idle": "2023-01-22T16:29:20.100815Z",
+ "shell.execute_reply": "2023-01-22T16:29:20.099612Z",
+ "shell.execute_reply.started": "2023-01-22T16:29:19.355801Z"
+ },
+ "id": "xdPs4HY874OZ"
+ },
+ "outputs": [],
+ "source": [
+ "df_dssm = df_dssm.explode('item_id')\n",
+ "df_dssm['rank'] = df_dssm.groupby('user_id').cumcount() + 1\n",
+ "df_dssm = df_dssm.groupby('user_id').agg({'item_id': list}).reset_index()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 74,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:29:20.104964Z",
+ "iopub.status.busy": "2023-01-22T16:29:20.104605Z",
+ "iopub.status.idle": "2023-01-22T16:29:20.117444Z",
+ "shell.execute_reply": "2023-01-22T16:29:20.115641Z",
+ "shell.execute_reply.started": "2023-01-22T16:29:20.104915Z"
+ },
+ "id": "C8kdzzf6wAuz",
+ "outputId": "df930923-8ad5-45f8-f76c-ab847237802d"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " user_id | \n",
+ " item_id | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 2 | \n",
+ " [4457, 4151, 142, 9988, 4475, 4740, 9169, 5982... | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 21 | \n",
+ " [4457, 3734, 9988, 4740, 2954, 2657, 4151, 152... | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 53 | \n",
+ " [4457, 2220, 4151, 142, 4740, 15297, 2657, 134... | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 60 | \n",
+ " [4457, 4151, 142, 9988, 3734, 6443, 4740, 2954... | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 81 | \n",
+ " [4151, 4740, 2657, 4457, 15297, 281, 142, 9169... | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " user_id item_id\n",
+ "0 2 [4457, 4151, 142, 9988, 4475, 4740, 9169, 5982...\n",
+ "1 21 [4457, 3734, 9988, 4740, 2954, 2657, 4151, 152...\n",
+ "2 53 [4457, 2220, 4151, 142, 4740, 15297, 2657, 134...\n",
+ "3 60 [4457, 4151, 142, 9988, 3734, 6443, 4740, 2954...\n",
+ "4 81 [4151, 4740, 2657, 4457, 15297, 281, 142, 9169..."
+ ]
+ },
+ "execution_count": 74,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_dssm.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 75,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2023-01-22T16:29:31.350415Z",
+ "iopub.status.busy": "2023-01-22T16:29:31.349997Z",
+ "iopub.status.idle": "2023-01-22T16:29:31.715454Z",
+ "shell.execute_reply": "2023-01-22T16:29:31.714324Z",
+ "shell.execute_reply.started": "2023-01-22T16:29:31.350382Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "df_dssm.to_csv('dssm_predictions.csv', index = False)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.13"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/hw_5_recbool.ipynb b/hw_5_recbool.ipynb
new file mode 100644
index 00000000..cf414323
--- /dev/null
+++ b/hw_5_recbool.ipynb
@@ -0,0 +1 @@
+{"cells":[{"cell_type":"code","execution_count":18,"metadata":{"execution":{"iopub.execute_input":"2023-01-22T17:56:37.034499Z","iopub.status.busy":"2023-01-22T17:56:37.034012Z","iopub.status.idle":"2023-01-22T17:56:37.042666Z","shell.execute_reply":"2023-01-22T17:56:37.041481Z","shell.execute_reply.started":"2023-01-22T17:56:37.034455Z"},"papermill":{"duration":1.244043,"end_time":"2022-11-27T16:33:29.277270","exception":false,"start_time":"2022-11-27T16:33:28.033227","status":"completed"},"tags":[],"trusted":true},"outputs":[],"source":["import ast\n","import json\n","import matplotlib.pyplot as plt\n","import numpy as np\n","import os\n","import pandas as pd\n","import pickle\n","\n","import warnings\n","warnings.filterwarnings('ignore')\n","\n","from collections import Counter\n","from random import randint, random\n","from scipy.sparse import coo_matrix, hstack\n","from sklearn.metrics.pairwise import euclidean_distances, cosine_distances, cosine_similarity"]},{"cell_type":"code","execution_count":20,"metadata":{"execution":{"iopub.execute_input":"2023-01-22T18:02:33.523160Z","iopub.status.busy":"2023-01-22T18:02:33.522766Z","iopub.status.idle":"2023-01-22T18:02:36.724444Z","shell.execute_reply":"2023-01-22T18:02:36.723409Z","shell.execute_reply.started":"2023-01-22T18:02:33.523126Z"},"papermill":{"duration":6.445298,"end_time":"2022-11-27T16:33:35.747539","exception":false,"start_time":"2022-11-27T16:33:29.302241","status":"completed"},"tags":[],"trusted":true},"outputs":[],"source":["interactions_df = pd.read_csv('interactions_processed_kion.csv')\n","users_df = pd.read_csv('users_processed_kion.csv')\n","items_df = pd.read_csv('items_processed_kion.csv')"]},{"cell_type":"code","execution_count":21,"metadata":{"execution":{"iopub.execute_input":"2023-01-22T18:02:41.118088Z","iopub.status.busy":"2023-01-22T18:02:41.117711Z","iopub.status.idle":"2023-01-22T18:02:42.100146Z","shell.execute_reply":"2023-01-22T18:02:42.098848Z","shell.execute_reply.started":"2023-01-22T18:02:41.118057Z"},"papermill":{"duration":0.925082,"end_time":"2022-11-27T16:33:36.677439","exception":false,"start_time":"2022-11-27T16:33:35.752357","status":"completed"},"tags":[],"trusted":true},"outputs":[],"source":["interactions_df['t_dat'] = pd.to_datetime(interactions_df['last_watch_dt'], format=\"%Y-%m-%d\")\n","interactions_df['timestamp'] = interactions_df.t_dat.values.astype(np.int64) // 10 ** 9"]},{"cell_type":"code","execution_count":22,"metadata":{"execution":{"iopub.execute_input":"2023-01-22T18:02:42.111635Z","iopub.status.busy":"2023-01-22T18:02:42.110287Z","iopub.status.idle":"2023-01-22T18:02:42.408437Z","shell.execute_reply":"2023-01-22T18:02:42.407310Z","shell.execute_reply.started":"2023-01-22T18:02:42.111593Z"},"papermill":{"duration":0.284147,"end_time":"2022-11-27T16:33:36.966533","exception":false,"start_time":"2022-11-27T16:33:36.682386","status":"completed"},"tags":[],"trusted":true},"outputs":[],"source":["df = interactions_df[['user_id', 'item_id', 'timestamp']].rename(\n"," columns={'user_id': 'user_id:token', 'item_id': 'item_id:token', 'timestamp': 'timestamp:float'})"]},{"cell_type":"code","execution_count":23,"metadata":{"execution":{"iopub.execute_input":"2023-01-22T18:02:43.902049Z","iopub.status.busy":"2023-01-22T18:02:43.901227Z","iopub.status.idle":"2023-01-22T18:02:43.927071Z","shell.execute_reply":"2023-01-22T18:02:43.925875Z","shell.execute_reply.started":"2023-01-22T18:02:43.902007Z"},"trusted":true},"outputs":[{"data":{"text/html":["\n","\n","
\n"," \n"," \n"," | \n"," user_id:token | \n"," item_id:token | \n"," timestamp:float | \n","
\n"," \n"," \n"," \n"," | 0 | \n"," 176549 | \n"," 9506 | \n"," 1620691200 | \n","
\n"," \n"," | 1 | \n"," 699317 | \n"," 1659 | \n"," 1622246400 | \n","
\n"," \n"," | 2 | \n"," 656683 | \n"," 7107 | \n"," 1620518400 | \n","
\n"," \n"," | 3 | \n"," 864613 | \n"," 7638 | \n"," 1625443200 | \n","
\n"," \n"," | 4 | \n"," 964868 | \n"," 9506 | \n"," 1619740800 | \n","
\n"," \n"," | ... | \n"," ... | \n"," ... | \n"," ... | \n","
\n"," \n"," | 5476246 | \n"," 648596 | \n"," 12225 | \n"," 1628812800 | \n","
\n"," \n"," | 5476247 | \n"," 546862 | \n"," 9673 | \n"," 1618272000 | \n","
\n"," \n"," | 5476248 | \n"," 697262 | \n"," 15297 | \n"," 1629417600 | \n","
\n"," \n"," | 5476249 | \n"," 384202 | \n"," 16197 | \n"," 1618790400 | \n","
\n"," \n"," | 5476250 | \n"," 319709 | \n"," 4436 | \n"," 1628985600 | \n","
\n"," \n","
\n","
5476251 rows × 3 columns
\n","
"],"text/plain":[" user_id:token item_id:token timestamp:float\n","0 176549 9506 1620691200\n","1 699317 1659 1622246400\n","2 656683 7107 1620518400\n","3 864613 7638 1625443200\n","4 964868 9506 1619740800\n","... ... ... ...\n","5476246 648596 12225 1628812800\n","5476247 546862 9673 1618272000\n","5476248 697262 15297 1629417600\n","5476249 384202 16197 1618790400\n","5476250 319709 4436 1628985600\n","\n","[5476251 rows x 3 columns]"]},"execution_count":23,"metadata":{},"output_type":"execute_result"}],"source":["df"]},{"cell_type":"code","execution_count":25,"metadata":{"execution":{"iopub.execute_input":"2023-01-22T18:02:47.909321Z","iopub.status.busy":"2023-01-22T18:02:47.908208Z","iopub.status.idle":"2023-01-22T18:02:54.589560Z","shell.execute_reply":"2023-01-22T18:02:54.588499Z","shell.execute_reply.started":"2023-01-22T18:02:47.909281Z"},"papermill":{"duration":7.834652,"end_time":"2022-11-27T16:33:45.906924","exception":false,"start_time":"2022-11-27T16:33:38.072272","status":"completed"},"tags":[],"trusted":true},"outputs":[],"source":["df.to_csv('recbox_data/recbox_data.inter', index=False, sep='\\t')"]},{"cell_type":"code","execution_count":28,"metadata":{"execution":{"iopub.execute_input":"2023-01-22T18:02:54.592386Z","iopub.status.busy":"2023-01-22T18:02:54.591996Z","iopub.status.idle":"2023-01-22T18:02:55.527789Z","shell.execute_reply":"2023-01-22T18:02:55.526787Z","shell.execute_reply.started":"2023-01-22T18:02:54.592332Z"},"papermill":{"duration":3.067001,"end_time":"2022-11-27T16:34:04.068318","exception":false,"start_time":"2022-11-27T16:34:01.001317","status":"completed"},"tags":[],"trusted":true},"outputs":[],"source":["import logging\n","from logging import getLogger\n","from recbole.config import Config\n","from recbole.data import create_dataset, data_preparation\n","from recbole.model.sequential_recommender import GRU4Rec, Caser\n","from recbole.trainer import Trainer\n","from recbole.utils import init_seed, init_logger\n","from recbole.quick_start import run_recbole"]},{"cell_type":"code","execution_count":29,"metadata":{"execution":{"iopub.execute_input":"2023-01-22T18:04:51.862473Z","iopub.status.busy":"2023-01-22T18:04:51.862041Z","iopub.status.idle":"2023-01-22T18:04:51.900690Z","shell.execute_reply":"2023-01-22T18:04:51.899741Z","shell.execute_reply.started":"2023-01-22T18:04:51.862435Z"},"papermill":{"duration":0.145622,"end_time":"2022-11-27T16:34:04.220395","exception":false,"start_time":"2022-11-27T16:34:04.074773","status":"completed"},"tags":[],"trusted":true},"outputs":[],"source":["parameter_dict = {\n"," 'data_path': '',\n"," 'USER_ID_FIELD': 'user_id',\n"," 'ITEM_ID_FIELD': 'item_id',\n"," 'TIME_FIELD': 'timestamp',\n"," 'device': 'GPU',\n"," 'user_inter_num_interval': \"[40,inf)\",\n"," 'item_inter_num_interval': \"[40,inf)\",\n"," 'load_col': {'inter': ['user_id', 'item_id', 'timestamp']},\n"," 'neg_sampling': None,\n"," 'epochs': 10,\n"," 'verbose': -1,\n"," 'show_progress' : False,\n"," 'eval_args': {\n"," 'split': {'RS': [9, 0, 1]},\n"," 'group_by': 'user',\n"," 'order': 'TO',\n"," 'mode': 'full'}\n","}\n","config = Config(model='MultiVAE', dataset='recbox_data', config_dict=parameter_dict)\n","\n","# init random seed\n","init_seed(config['seed'], config['reproducibility'])\n","\n","# logger initialization\n","init_logger(config)\n","logger = getLogger()\n","# Create handlers\n","c_handler = logging.StreamHandler()\n","c_handler.setLevel(logging.INFO)\n","logger.addHandler(c_handler)\n","\n","# write config info into log\n","# logger.info(config)"]},{"cell_type":"code","execution_count":30,"metadata":{"execution":{"iopub.execute_input":"2023-01-22T18:04:55.538201Z","iopub.status.busy":"2023-01-22T18:04:55.537818Z","iopub.status.idle":"2023-01-22T18:05:32.322220Z","shell.execute_reply":"2023-01-22T18:05:32.321423Z","shell.execute_reply.started":"2023-01-22T18:04:55.538170Z"},"papermill":{"duration":42.583583,"end_time":"2022-11-27T16:34:46.811041","exception":false,"start_time":"2022-11-27T16:34:04.227458","status":"completed"},"tags":[],"trusted":true},"outputs":[{"name":"stderr","output_type":"stream","text":["11 Dec 11:56 INFO recbox_data\n","The number of users: 13355\n","Average actions of users: 63.815710648494836\n","The number of items: 3294\n","Average actions of items: 258.78985727300335\n","The number of inters: 852195\n","The sparsity of the dataset: 98.06281322904924%\n","Remain Fields: ['user_id', 'item_id', 'timestamp']\n","recbox_data\n","The number of users: 13355\n","Average actions of users: 63.815710648494836\n","The number of items: 3294\n","Average actions of items: 258.78985727300335\n","The number of inters: 852195\n","The sparsity of the dataset: 98.06281322904924%\n","Remain Fields: ['user_id', 'item_id', 'timestamp']\n"]}],"source":["dataset = create_dataset(config)\n","logger.info(dataset)"]},{"cell_type":"code","execution_count":31,"metadata":{"execution":{"iopub.execute_input":"2023-01-22T18:05:32.324208Z","iopub.status.busy":"2023-01-22T18:05:32.323852Z","iopub.status.idle":"2023-01-22T18:05:34.256086Z","shell.execute_reply":"2023-01-22T18:05:34.255320Z","shell.execute_reply.started":"2023-01-22T18:05:32.324171Z"},"papermill":{"duration":2.241551,"end_time":"2022-11-27T16:34:49.059852","exception":false,"start_time":"2022-11-27T16:34:46.818301","status":"completed"},"tags":[],"trusted":true},"outputs":[{"name":"stderr","output_type":"stream","text":["11 Dec 11:56 INFO [Training]: train_batch_size = [2048] train_neg_sample_args: [{'distribution': 'uniform', 'sample_num': 1, 'alpha': 1.0, 'dynamic': False, 'candidate_num': 0}]\n","[Training]: train_batch_size = [2048] train_neg_sample_args: [{'distribution': 'uniform', 'sample_num': 1, 'alpha': 1.0, 'dynamic': False, 'candidate_num': 0}]\n","11 Dec 11:56 INFO [Evaluation]: eval_batch_size = [4096] eval_args: [{'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}]\n","[Evaluation]: eval_batch_size = [4096] eval_args: [{'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}]\n"]}],"source":["# dataset splitting\n","train_data, valid_data, test_data = data_preparation(config, dataset)"]},{"cell_type":"code","execution_count":32,"metadata":{"execution":{"iopub.execute_input":"2023-01-22T18:05:34.257762Z","iopub.status.busy":"2023-01-22T18:05:34.257174Z","iopub.status.idle":"2023-01-22T18:05:34.262360Z","shell.execute_reply":"2023-01-22T18:05:34.261553Z","shell.execute_reply.started":"2023-01-22T18:05:34.257723Z"},"papermill":{"duration":0.01694,"end_time":"2022-11-27T16:34:49.085164","exception":false,"start_time":"2022-11-27T16:34:49.068224","status":"completed"},"tags":[],"trusted":true},"outputs":[],"source":["import time"]},{"cell_type":"markdown","metadata":{},"source":["### Использование различных архитектур"]},{"cell_type":"code","execution_count":33,"metadata":{"execution":{"iopub.execute_input":"2023-01-22T18:05:41.096708Z","iopub.status.busy":"2023-01-22T18:05:41.096214Z","iopub.status.idle":"2023-01-22T18:11:38.568018Z","shell.execute_reply":"2023-01-22T18:11:38.567070Z","shell.execute_reply.started":"2023-01-22T18:05:41.096667Z"},"papermill":{"duration":27259.293886,"end_time":"2022-11-28T00:09:08.387403","exception":false,"start_time":"2022-11-27T16:34:49.093517","status":"completed"},"tags":[],"trusted":true},"outputs":[{"name":"stdout","output_type":"stream","text":["running LightGCN...\n"]},{"name":"stderr","output_type":"stream","text":["11 Dec 11:56 INFO ['/Users/annapikuleva/Library/Python/3.9/lib/python/site-packages/ipykernel_launcher.py', '--f=/Users/annapikuleva/Library/Jupyter/runtime/kernel-v2-3832937JAU6uqtVOE.json']\n","['/Users/annapikuleva/Library/Python/3.9/lib/python/site-packages/ipykernel_launcher.py', '--f=/Users/annapikuleva/Library/Jupyter/runtime/kernel-v2-3832937JAU6uqtVOE.json']\n","11 Dec 11:56 INFO \n","General Hyper Parameters:\n","gpu_id = 0\n","use_gpu = True\n","seed = 2020\n","state = INFO\n","reproducibility = True\n","data_path = recbox_data\n","checkpoint_dir = saved\n","show_progress = False\n","save_dataset = False\n","dataset_save_path = None\n","save_dataloaders = False\n","dataloaders_save_path = None\n","log_wandb = False\n","\n","Training Hyper Parameters:\n","epochs = 10\n","train_batch_size = 2048\n","learner = adam\n","learning_rate = 0.001\n","train_neg_sample_args = {'distribution': 'uniform', 'sample_num': 1, 'alpha': 1.0, 'dynamic': False, 'candidate_num': 0}\n","eval_step = 1\n","stopping_step = 10\n","clip_grad_norm = None\n","weight_decay = 0.0\n","loss_decimal_place = 4\n","\n","Evaluation Hyper Parameters:\n","eval_args = {'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}\n","repeatable = False\n","metrics = ['Recall', 'MRR', 'NDCG', 'Hit', 'Precision']\n","topk = [10]\n","valid_metric = MRR@10\n","valid_metric_bigger = True\n","eval_batch_size = 4096\n","metric_decimal_place = 4\n","\n","Dataset Hyper Parameters:\n","field_separator = \t\n","seq_separator = \n","USER_ID_FIELD = user_id\n","ITEM_ID_FIELD = item_id\n","RATING_FIELD = rating\n","TIME_FIELD = timestamp\n","seq_len = None\n","LABEL_FIELD = label\n","threshold = None\n","NEG_PREFIX = neg_\n","load_col = {'inter': ['user_id', 'item_id', 'timestamp']}\n","unload_col = None\n","unused_col = None\n","additional_feat_suffix = None\n","rm_dup_inter = None\n","val_interval = None\n","filter_inter_by_user_or_item = True\n","user_inter_num_interval = [40,inf)\n","item_inter_num_interval = [40,inf)\n","alias_of_user_id = None\n","alias_of_item_id = None\n","alias_of_entity_id = None\n","alias_of_relation_id = None\n","preload_weight = None\n","normalize_field = None\n","normalize_all = None\n","ITEM_LIST_LENGTH_FIELD = item_length\n","LIST_SUFFIX = _list\n","MAX_ITEM_LIST_LENGTH = 50\n","POSITION_FIELD = position_id\n","HEAD_ENTITY_ID_FIELD = head_id\n","TAIL_ENTITY_ID_FIELD = tail_id\n","RELATION_ID_FIELD = relation_id\n","ENTITY_ID_FIELD = entity_id\n","benchmark_filename = None\n","\n","Other Hyper Parameters: \n","worker = 0\n","wandb_project = recbole\n","shuffle = True\n","require_pow = False\n","enable_amp = False\n","enable_scaler = False\n","transform = None\n","embedding_size = 64\n","n_layers = 2\n","reg_weight = 1e-05\n","numerical_features = []\n","discretization = None\n","kg_reverse_r = False\n","entity_kg_num_interval = [0,inf)\n","relation_kg_num_interval = [0,inf)\n","MODEL_TYPE = ModelType.GENERAL\n","device = cpu\n","neg_sampling = None\n","verbose = -1\n","MODEL_INPUT_TYPE = InputType.PAIRWISE\n","eval_type = EvaluatorType.RANKING\n","single_spec = True\n","local_rank = 0\n","valid_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","test_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","\n","\n","\n","General Hyper Parameters:\n","gpu_id = 0\n","use_gpu = True\n","seed = 2020\n","state = INFO\n","reproducibility = True\n","data_path = recbox_data\n","checkpoint_dir = saved\n","show_progress = False\n","save_dataset = False\n","dataset_save_path = None\n","save_dataloaders = False\n","dataloaders_save_path = None\n","log_wandb = False\n","\n","Training Hyper Parameters:\n","epochs = 10\n","train_batch_size = 2048\n","learner = adam\n","learning_rate = 0.001\n","train_neg_sample_args = {'distribution': 'uniform', 'sample_num': 1, 'alpha': 1.0, 'dynamic': False, 'candidate_num': 0}\n","eval_step = 1\n","stopping_step = 10\n","clip_grad_norm = None\n","weight_decay = 0.0\n","loss_decimal_place = 4\n","\n","Evaluation Hyper Parameters:\n","eval_args = {'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}\n","repeatable = False\n","metrics = ['Recall', 'MRR', 'NDCG', 'Hit', 'Precision']\n","topk = [10]\n","valid_metric = MRR@10\n","valid_metric_bigger = True\n","eval_batch_size = 4096\n","metric_decimal_place = 4\n","\n","Dataset Hyper Parameters:\n","field_separator = \t\n","seq_separator = \n","USER_ID_FIELD = user_id\n","ITEM_ID_FIELD = item_id\n","RATING_FIELD = rating\n","TIME_FIELD = timestamp\n","seq_len = None\n","LABEL_FIELD = label\n","threshold = None\n","NEG_PREFIX = neg_\n","load_col = {'inter': ['user_id', 'item_id', 'timestamp']}\n","unload_col = None\n","unused_col = None\n","additional_feat_suffix = None\n","rm_dup_inter = None\n","val_interval = None\n","filter_inter_by_user_or_item = True\n","user_inter_num_interval = [40,inf)\n","item_inter_num_interval = [40,inf)\n","alias_of_user_id = None\n","alias_of_item_id = None\n","alias_of_entity_id = None\n","alias_of_relation_id = None\n","preload_weight = None\n","normalize_field = None\n","normalize_all = None\n","ITEM_LIST_LENGTH_FIELD = item_length\n","LIST_SUFFIX = _list\n","MAX_ITEM_LIST_LENGTH = 50\n","POSITION_FIELD = position_id\n","HEAD_ENTITY_ID_FIELD = head_id\n","TAIL_ENTITY_ID_FIELD = tail_id\n","RELATION_ID_FIELD = relation_id\n","ENTITY_ID_FIELD = entity_id\n","benchmark_filename = None\n","\n","Other Hyper Parameters: \n","worker = 0\n","wandb_project = recbole\n","shuffle = True\n","require_pow = False\n","enable_amp = False\n","enable_scaler = False\n","transform = None\n","embedding_size = 64\n","n_layers = 2\n","reg_weight = 1e-05\n","numerical_features = []\n","discretization = None\n","kg_reverse_r = False\n","entity_kg_num_interval = [0,inf)\n","relation_kg_num_interval = [0,inf)\n","MODEL_TYPE = ModelType.GENERAL\n","device = cpu\n","neg_sampling = None\n","verbose = -1\n","MODEL_INPUT_TYPE = InputType.PAIRWISE\n","eval_type = EvaluatorType.RANKING\n","single_spec = True\n","local_rank = 0\n","valid_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","test_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","\n","\n","11 Dec 11:58 INFO recbox_data\n","The number of users: 13355\n","Average actions of users: 63.815710648494836\n","The number of items: 3294\n","Average actions of items: 258.78985727300335\n","The number of inters: 852195\n","The sparsity of the dataset: 98.06281322904924%\n","Remain Fields: ['user_id', 'item_id', 'timestamp']\n","recbox_data\n","The number of users: 13355\n","Average actions of users: 63.815710648494836\n","The number of items: 3294\n","Average actions of items: 258.78985727300335\n","The number of inters: 852195\n","The sparsity of the dataset: 98.06281322904924%\n","Remain Fields: ['user_id', 'item_id', 'timestamp']\n","11 Dec 11:58 INFO [Training]: train_batch_size = [2048] train_neg_sample_args: [{'distribution': 'uniform', 'sample_num': 1, 'alpha': 1.0, 'dynamic': False, 'candidate_num': 0}]\n","[Training]: train_batch_size = [2048] train_neg_sample_args: [{'distribution': 'uniform', 'sample_num': 1, 'alpha': 1.0, 'dynamic': False, 'candidate_num': 0}]\n","11 Dec 11:58 INFO [Evaluation]: eval_batch_size = [4096] eval_args: [{'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}]\n","[Evaluation]: eval_batch_size = [4096] eval_args: [{'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}]\n","11 Dec 11:58 INFO LightGCN(\n"," (user_embedding): Embedding(13355, 64)\n"," (item_embedding): Embedding(3294, 64)\n"," (mf_loss): BPRLoss()\n"," (reg_loss): EmbLoss()\n",")\n","Trainable parameters: 1065536\n","LightGCN(\n"," (user_embedding): Embedding(13355, 64)\n"," (item_embedding): Embedding(3294, 64)\n"," (mf_loss): BPRLoss()\n"," (reg_loss): EmbLoss()\n",")\n","Trainable parameters: 1065536\n","11 Dec 11:58 INFO FLOPs: 0.0\n","FLOPs: 0.0\n","11 Dec 12:00 INFO epoch 0 training [time: 96.30s, train loss: 201.8552]\n","epoch 0 training [time: 96.30s, train loss: 201.8552]\n","11 Dec 12:00 INFO Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","11 Dec 12:01 INFO epoch 1 training [time: 91.67s, train loss: 166.0586]\n","epoch 1 training [time: 91.67s, train loss: 166.0586]\n","11 Dec 12:01 INFO Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","11 Dec 12:03 INFO epoch 2 training [time: 106.54s, train loss: 156.0221]\n","epoch 2 training [time: 106.54s, train loss: 156.0221]\n","11 Dec 12:03 INFO Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","11 Dec 12:05 INFO epoch 3 training [time: 125.49s, train loss: 149.5909]\n","epoch 3 training [time: 125.49s, train loss: 149.5909]\n","11 Dec 12:05 INFO Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","11 Dec 12:07 INFO epoch 4 training [time: 123.82s, train loss: 146.1851]\n","epoch 4 training [time: 123.82s, train loss: 146.1851]\n","11 Dec 12:07 INFO Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","11 Dec 12:10 INFO epoch 5 training [time: 135.29s, train loss: 143.7300]\n","epoch 5 training [time: 135.29s, train loss: 143.7300]\n","11 Dec 12:10 INFO Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","11 Dec 12:12 INFO epoch 6 training [time: 152.14s, train loss: 141.2300]\n","epoch 6 training [time: 152.14s, train loss: 141.2300]\n","11 Dec 12:12 INFO Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","11 Dec 12:14 INFO epoch 7 training [time: 114.99s, train loss: 137.4871]\n","epoch 7 training [time: 114.99s, train loss: 137.4871]\n","11 Dec 12:14 INFO Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","11 Dec 12:16 INFO epoch 8 training [time: 128.70s, train loss: 133.3195]\n","epoch 8 training [time: 128.70s, train loss: 133.3195]\n","11 Dec 12:16 INFO Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","11 Dec 12:18 INFO epoch 9 training [time: 126.52s, train loss: 129.4056]\n","epoch 9 training [time: 126.52s, train loss: 129.4056]\n","11 Dec 12:18 INFO Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","Saving current: saved/LightGCN-Dec-11-2023_11-58-43.pth\n","11 Dec 12:18 INFO Loading model structure and parameters from saved/LightGCN-Dec-11-2023_11-58-43.pth\n","Loading model structure and parameters from saved/LightGCN-Dec-11-2023_11-58-43.pth\n","11 Dec 12:18 INFO The running environment of this training is as follows:\n","+-------------+---------------+\n","| Environment | Usage |\n","+=============+===============+\n","| CPU | 48.50 % |\n","+-------------+---------------+\n","| GPU | 0.0 / 0.0 |\n","+-------------+---------------+\n","| Memory | 0.07 G/8.00 G |\n","+-------------+---------------+\n","The running environment of this training is as follows:\n","+-------------+---------------+\n","| Environment | Usage |\n","+=============+===============+\n","| CPU | 48.50 % |\n","+-------------+---------------+\n","| GPU | 0.0 / 0.0 |\n","+-------------+---------------+\n","| Memory | 0.07 G/8.00 G |\n","+-------------+---------------+\n","11 Dec 12:18 INFO best valid : None\n","best valid : None\n","11 Dec 12:18 INFO test result: OrderedDict([('recall@10', 0.0792), ('mrr@10', 0.1685), ('ndcg@10', 0.0795), ('hit@10', 0.3385), ('precision@10', 0.0441)])\n","test result: OrderedDict([('recall@10', 0.0792), ('mrr@10', 0.1685), ('ndcg@10', 0.0795), ('hit@10', 0.3385), ('precision@10', 0.0441)])\n"]},{"name":"stdout","output_type":"stream","text":["It took 21.95 mins\n","{'best_valid_score': -inf, 'valid_score_bigger': True, 'best_valid_result': None, 'test_result': OrderedDict([('recall@10', 0.0792), ('mrr@10', 0.1685), ('ndcg@10', 0.0795), ('hit@10', 0.3385), ('precision@10', 0.0441)])}\n","running MultiVAE...\n"]},{"name":"stderr","output_type":"stream","text":["11 Dec 12:18 INFO ['/Users/annapikuleva/Library/Python/3.9/lib/python/site-packages/ipykernel_launcher.py', '--f=/Users/annapikuleva/Library/Jupyter/runtime/kernel-v2-3832937JAU6uqtVOE.json']\n","['/Users/annapikuleva/Library/Python/3.9/lib/python/site-packages/ipykernel_launcher.py', '--f=/Users/annapikuleva/Library/Jupyter/runtime/kernel-v2-3832937JAU6uqtVOE.json']\n","11 Dec 12:18 INFO \n","General Hyper Parameters:\n","gpu_id = 0\n","use_gpu = True\n","seed = 2020\n","state = INFO\n","reproducibility = True\n","data_path = recbox_data\n","checkpoint_dir = saved\n","show_progress = False\n","save_dataset = False\n","dataset_save_path = None\n","save_dataloaders = False\n","dataloaders_save_path = None\n","log_wandb = False\n","\n","Training Hyper Parameters:\n","epochs = 10\n","train_batch_size = 2048\n","learner = adam\n","learning_rate = 0.001\n","train_neg_sample_args = {'distribution': 'uniform', 'sample_num': 1, 'alpha': 1.0, 'dynamic': False, 'candidate_num': 0}\n","eval_step = 1\n","stopping_step = 10\n","clip_grad_norm = None\n","weight_decay = 0.0\n","loss_decimal_place = 4\n","\n","Evaluation Hyper Parameters:\n","eval_args = {'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}\n","repeatable = False\n","metrics = ['Recall', 'MRR', 'NDCG', 'Hit', 'Precision']\n","topk = [10]\n","valid_metric = MRR@10\n","valid_metric_bigger = True\n","eval_batch_size = 4096\n","metric_decimal_place = 4\n","\n","Dataset Hyper Parameters:\n","field_separator = \t\n","seq_separator = \n","USER_ID_FIELD = user_id\n","ITEM_ID_FIELD = item_id\n","RATING_FIELD = rating\n","TIME_FIELD = timestamp\n","seq_len = None\n","LABEL_FIELD = label\n","threshold = None\n","NEG_PREFIX = neg_\n","load_col = {'inter': ['user_id', 'item_id', 'timestamp']}\n","unload_col = None\n","unused_col = None\n","additional_feat_suffix = None\n","rm_dup_inter = None\n","val_interval = None\n","filter_inter_by_user_or_item = True\n","user_inter_num_interval = [40,inf)\n","item_inter_num_interval = [40,inf)\n","alias_of_user_id = None\n","alias_of_item_id = None\n","alias_of_entity_id = None\n","alias_of_relation_id = None\n","preload_weight = None\n","normalize_field = None\n","normalize_all = None\n","ITEM_LIST_LENGTH_FIELD = item_length\n","LIST_SUFFIX = _list\n","MAX_ITEM_LIST_LENGTH = 50\n","POSITION_FIELD = position_id\n","HEAD_ENTITY_ID_FIELD = head_id\n","TAIL_ENTITY_ID_FIELD = tail_id\n","RELATION_ID_FIELD = relation_id\n","ENTITY_ID_FIELD = entity_id\n","benchmark_filename = None\n","\n","Other Hyper Parameters: \n","worker = 0\n","wandb_project = recbole\n","shuffle = True\n","require_pow = False\n","enable_amp = False\n","enable_scaler = False\n","transform = None\n","mlp_hidden_size = [600]\n","latent_dimension = 128\n","dropout_prob = 0.5\n","anneal_cap = 0.2\n","total_anneal_steps = 200000\n","numerical_features = []\n","discretization = None\n","kg_reverse_r = False\n","entity_kg_num_interval = [0,inf)\n","relation_kg_num_interval = [0,inf)\n","MODEL_TYPE = ModelType.GENERAL\n","device = cpu\n","neg_sampling = None\n","verbose = -1\n","MODEL_INPUT_TYPE = InputType.PAIRWISE\n","eval_type = EvaluatorType.RANKING\n","single_spec = True\n","local_rank = 0\n","valid_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","test_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","\n","\n","\n","General Hyper Parameters:\n","gpu_id = 0\n","use_gpu = True\n","seed = 2020\n","state = INFO\n","reproducibility = True\n","data_path = recbox_data\n","checkpoint_dir = saved\n","show_progress = False\n","save_dataset = False\n","dataset_save_path = None\n","save_dataloaders = False\n","dataloaders_save_path = None\n","log_wandb = False\n","\n","Training Hyper Parameters:\n","epochs = 10\n","train_batch_size = 2048\n","learner = adam\n","learning_rate = 0.001\n","train_neg_sample_args = {'distribution': 'uniform', 'sample_num': 1, 'alpha': 1.0, 'dynamic': False, 'candidate_num': 0}\n","eval_step = 1\n","stopping_step = 10\n","clip_grad_norm = None\n","weight_decay = 0.0\n","loss_decimal_place = 4\n","\n","Evaluation Hyper Parameters:\n","eval_args = {'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}\n","repeatable = False\n","metrics = ['Recall', 'MRR', 'NDCG', 'Hit', 'Precision']\n","topk = [10]\n","valid_metric = MRR@10\n","valid_metric_bigger = True\n","eval_batch_size = 4096\n","metric_decimal_place = 4\n","\n","Dataset Hyper Parameters:\n","field_separator = \t\n","seq_separator = \n","USER_ID_FIELD = user_id\n","ITEM_ID_FIELD = item_id\n","RATING_FIELD = rating\n","TIME_FIELD = timestamp\n","seq_len = None\n","LABEL_FIELD = label\n","threshold = None\n","NEG_PREFIX = neg_\n","load_col = {'inter': ['user_id', 'item_id', 'timestamp']}\n","unload_col = None\n","unused_col = None\n","additional_feat_suffix = None\n","rm_dup_inter = None\n","val_interval = None\n","filter_inter_by_user_or_item = True\n","user_inter_num_interval = [40,inf)\n","item_inter_num_interval = [40,inf)\n","alias_of_user_id = None\n","alias_of_item_id = None\n","alias_of_entity_id = None\n","alias_of_relation_id = None\n","preload_weight = None\n","normalize_field = None\n","normalize_all = None\n","ITEM_LIST_LENGTH_FIELD = item_length\n","LIST_SUFFIX = _list\n","MAX_ITEM_LIST_LENGTH = 50\n","POSITION_FIELD = position_id\n","HEAD_ENTITY_ID_FIELD = head_id\n","TAIL_ENTITY_ID_FIELD = tail_id\n","RELATION_ID_FIELD = relation_id\n","ENTITY_ID_FIELD = entity_id\n","benchmark_filename = None\n","\n","Other Hyper Parameters: \n","worker = 0\n","wandb_project = recbole\n","shuffle = True\n","require_pow = False\n","enable_amp = False\n","enable_scaler = False\n","transform = None\n","mlp_hidden_size = [600]\n","latent_dimension = 128\n","dropout_prob = 0.5\n","anneal_cap = 0.2\n","total_anneal_steps = 200000\n","numerical_features = []\n","discretization = None\n","kg_reverse_r = False\n","entity_kg_num_interval = [0,inf)\n","relation_kg_num_interval = [0,inf)\n","MODEL_TYPE = ModelType.GENERAL\n","device = cpu\n","neg_sampling = None\n","verbose = -1\n","MODEL_INPUT_TYPE = InputType.PAIRWISE\n","eval_type = EvaluatorType.RANKING\n","single_spec = True\n","local_rank = 0\n","valid_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","test_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","\n","\n","11 Dec 12:21 INFO recbox_data\n","The number of users: 13355\n","Average actions of users: 63.815710648494836\n","The number of items: 3294\n","Average actions of items: 258.78985727300335\n","The number of inters: 852195\n","The sparsity of the dataset: 98.06281322904924%\n","Remain Fields: ['user_id', 'item_id', 'timestamp']\n","recbox_data\n","The number of users: 13355\n","Average actions of users: 63.815710648494836\n","The number of items: 3294\n","Average actions of items: 258.78985727300335\n","The number of inters: 852195\n","The sparsity of the dataset: 98.06281322904924%\n","Remain Fields: ['user_id', 'item_id', 'timestamp']\n","11 Dec 12:21 INFO [Training]: train_batch_size = [2048] train_neg_sample_args: [{'distribution': 'uniform', 'sample_num': 1, 'alpha': 1.0, 'dynamic': False, 'candidate_num': 0}]\n","[Training]: train_batch_size = [2048] train_neg_sample_args: [{'distribution': 'uniform', 'sample_num': 1, 'alpha': 1.0, 'dynamic': False, 'candidate_num': 0}]\n","11 Dec 12:21 INFO [Evaluation]: eval_batch_size = [4096] eval_args: [{'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}]\n","[Evaluation]: eval_batch_size = [4096] eval_args: [{'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}]\n","11 Dec 12:21 WARNING Max value of user's history interaction records has reached 20.9471766848816% of the total.\n","Max value of user's history interaction records has reached 20.9471766848816% of the total.\n","11 Dec 12:21 INFO MultiVAE(\n"," (encoder): Sequential(\n"," (0): Linear(in_features=3294, out_features=600, bias=True)\n"," (1): Tanh()\n"," (2): Linear(in_features=600, out_features=128, bias=True)\n"," )\n"," (decoder): Sequential(\n"," (0): Linear(in_features=64, out_features=600, bias=True)\n"," (1): Tanh()\n"," (2): Linear(in_features=600, out_features=3294, bias=True)\n"," )\n",")\n","Trainable parameters: 4072622\n","MultiVAE(\n"," (encoder): Sequential(\n"," (0): Linear(in_features=3294, out_features=600, bias=True)\n"," (1): Tanh()\n"," (2): Linear(in_features=600, out_features=128, bias=True)\n"," )\n"," (decoder): Sequential(\n"," (0): Linear(in_features=64, out_features=600, bias=True)\n"," (1): Tanh()\n"," (2): Linear(in_features=600, out_features=3294, bias=True)\n"," )\n",")\n","Trainable parameters: 4072622\n","11 Dec 12:21 INFO FLOPs: 4068000.0\n","FLOPs: 4068000.0\n","11 Dec 12:21 INFO epoch 0 training [time: 2.16s, train loss: 3249.3142]\n","epoch 0 training [time: 2.16s, train loss: 3249.3142]\n","11 Dec 12:21 INFO Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","11 Dec 12:21 INFO epoch 1 training [time: 1.96s, train loss: 3098.4010]\n","epoch 1 training [time: 1.96s, train loss: 3098.4010]\n","11 Dec 12:21 INFO Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","11 Dec 12:21 INFO epoch 2 training [time: 1.97s, train loss: 3045.1938]\n","epoch 2 training [time: 1.97s, train loss: 3045.1938]\n","11 Dec 12:21 INFO Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","11 Dec 12:21 INFO epoch 3 training [time: 2.02s, train loss: 3008.0520]\n","epoch 3 training [time: 2.02s, train loss: 3008.0520]\n","11 Dec 12:21 INFO Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","11 Dec 12:21 INFO epoch 4 training [time: 2.58s, train loss: 2949.4743]\n","epoch 4 training [time: 2.58s, train loss: 2949.4743]\n","11 Dec 12:21 INFO Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","11 Dec 12:21 INFO epoch 5 training [time: 2.14s, train loss: 2917.6707]\n","epoch 5 training [time: 2.14s, train loss: 2917.6707]\n","11 Dec 12:21 INFO Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","11 Dec 12:22 INFO epoch 6 training [time: 2.28s, train loss: 2897.4954]\n","epoch 6 training [time: 2.28s, train loss: 2897.4954]\n","11 Dec 12:22 INFO Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","11 Dec 12:22 INFO epoch 7 training [time: 2.03s, train loss: 2885.5641]\n","epoch 7 training [time: 2.03s, train loss: 2885.5641]\n","11 Dec 12:22 INFO Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","11 Dec 12:22 INFO epoch 8 training [time: 2.38s, train loss: 2871.9012]\n","epoch 8 training [time: 2.38s, train loss: 2871.9012]\n","11 Dec 12:22 INFO Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","11 Dec 12:22 INFO epoch 9 training [time: 2.46s, train loss: 2851.2055]\n","epoch 9 training [time: 2.46s, train loss: 2851.2055]\n","11 Dec 12:22 INFO Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","Saving current: saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","11 Dec 12:22 INFO Loading model structure and parameters from saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","Loading model structure and parameters from saved/MultiVAE-Dec-11-2023_12-21-45.pth\n","11 Dec 12:22 INFO The running environment of this training is as follows:\n","+-------------+---------------+\n","| Environment | Usage |\n","+=============+===============+\n","| CPU | 74.20 % |\n","+-------------+---------------+\n","| GPU | 0.0 / 0.0 |\n","+-------------+---------------+\n","| Memory | 0.08 G/8.00 G |\n","+-------------+---------------+\n","The running environment of this training is as follows:\n","+-------------+---------------+\n","| Environment | Usage |\n","+=============+===============+\n","| CPU | 74.20 % |\n","+-------------+---------------+\n","| GPU | 0.0 / 0.0 |\n","+-------------+---------------+\n","| Memory | 0.08 G/8.00 G |\n","+-------------+---------------+\n","11 Dec 12:22 INFO best valid : None\n","best valid : None\n","11 Dec 12:22 INFO test result: OrderedDict([('recall@10', 0.0839), ('mrr@10', 0.1687), ('ndcg@10', 0.0823), ('hit@10', 0.3494), ('precision@10', 0.0465)])\n","test result: OrderedDict([('recall@10', 0.0839), ('mrr@10', 0.1687), ('ndcg@10', 0.0823), ('hit@10', 0.3494), ('precision@10', 0.0465)])\n"]},{"name":"stdout","output_type":"stream","text":["It took 3.87 mins\n","{'best_valid_score': -inf, 'valid_score_bigger': True, 'best_valid_result': None, 'test_result': OrderedDict([('recall@10', 0.0839), ('mrr@10', 0.1687), ('ndcg@10', 0.0823), ('hit@10', 0.3494), ('precision@10', 0.0465)])}\n","running RecVAE...\n"]},{"name":"stderr","output_type":"stream","text":["11 Dec 12:22 INFO ['/Users/annapikuleva/Library/Python/3.9/lib/python/site-packages/ipykernel_launcher.py', '--f=/Users/annapikuleva/Library/Jupyter/runtime/kernel-v2-3832937JAU6uqtVOE.json']\n","['/Users/annapikuleva/Library/Python/3.9/lib/python/site-packages/ipykernel_launcher.py', '--f=/Users/annapikuleva/Library/Jupyter/runtime/kernel-v2-3832937JAU6uqtVOE.json']\n","11 Dec 12:22 INFO \n","General Hyper Parameters:\n","gpu_id = 0\n","use_gpu = True\n","seed = 2020\n","state = INFO\n","reproducibility = True\n","data_path = recbox_data\n","checkpoint_dir = saved\n","show_progress = False\n","save_dataset = False\n","dataset_save_path = None\n","save_dataloaders = False\n","dataloaders_save_path = None\n","log_wandb = False\n","\n","Training Hyper Parameters:\n","epochs = 10\n","train_batch_size = 2048\n","learner = adam\n","learning_rate = 0.001\n","train_neg_sample_args = {'distribution': 'uniform', 'sample_num': 1, 'alpha': 1.0, 'dynamic': False, 'candidate_num': 0}\n","eval_step = 1\n","stopping_step = 10\n","clip_grad_norm = None\n","weight_decay = 0.0\n","loss_decimal_place = 4\n","\n","Evaluation Hyper Parameters:\n","eval_args = {'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}\n","repeatable = False\n","metrics = ['Recall', 'MRR', 'NDCG', 'Hit', 'Precision']\n","topk = [10]\n","valid_metric = MRR@10\n","valid_metric_bigger = True\n","eval_batch_size = 4096\n","metric_decimal_place = 4\n","\n","Dataset Hyper Parameters:\n","field_separator = \t\n","seq_separator = \n","USER_ID_FIELD = user_id\n","ITEM_ID_FIELD = item_id\n","RATING_FIELD = rating\n","TIME_FIELD = timestamp\n","seq_len = None\n","LABEL_FIELD = label\n","threshold = None\n","NEG_PREFIX = neg_\n","load_col = {'inter': ['user_id', 'item_id', 'timestamp']}\n","unload_col = None\n","unused_col = None\n","additional_feat_suffix = None\n","rm_dup_inter = None\n","val_interval = None\n","filter_inter_by_user_or_item = True\n","user_inter_num_interval = [40,inf)\n","item_inter_num_interval = [40,inf)\n","alias_of_user_id = None\n","alias_of_item_id = None\n","alias_of_entity_id = None\n","alias_of_relation_id = None\n","preload_weight = None\n","normalize_field = None\n","normalize_all = None\n","ITEM_LIST_LENGTH_FIELD = item_length\n","LIST_SUFFIX = _list\n","MAX_ITEM_LIST_LENGTH = 50\n","POSITION_FIELD = position_id\n","HEAD_ENTITY_ID_FIELD = head_id\n","TAIL_ENTITY_ID_FIELD = tail_id\n","RELATION_ID_FIELD = relation_id\n","ENTITY_ID_FIELD = entity_id\n","benchmark_filename = None\n","\n","Other Hyper Parameters: \n","worker = 0\n","wandb_project = recbole\n","shuffle = True\n","require_pow = False\n","enable_amp = False\n","enable_scaler = False\n","transform = None\n","hidden_dimension = 600\n","latent_dimension = 200\n","dropout_prob = 0.5\n","beta = 0.2\n","gamma = 0.005\n","mixture_weights = [0.15, 0.75, 0.1]\n","n_enc_epochs = 3\n","n_dec_epochs = 1\n","numerical_features = []\n","discretization = None\n","kg_reverse_r = False\n","entity_kg_num_interval = [0,inf)\n","relation_kg_num_interval = [0,inf)\n","MODEL_TYPE = ModelType.GENERAL\n","device = cpu\n","neg_sampling = None\n","verbose = -1\n","MODEL_INPUT_TYPE = InputType.PAIRWISE\n","eval_type = EvaluatorType.RANKING\n","single_spec = True\n","local_rank = 0\n","valid_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","test_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","\n","\n","\n","General Hyper Parameters:\n","gpu_id = 0\n","use_gpu = True\n","seed = 2020\n","state = INFO\n","reproducibility = True\n","data_path = recbox_data\n","checkpoint_dir = saved\n","show_progress = False\n","save_dataset = False\n","dataset_save_path = None\n","save_dataloaders = False\n","dataloaders_save_path = None\n","log_wandb = False\n","\n","Training Hyper Parameters:\n","epochs = 10\n","train_batch_size = 2048\n","learner = adam\n","learning_rate = 0.001\n","train_neg_sample_args = {'distribution': 'uniform', 'sample_num': 1, 'alpha': 1.0, 'dynamic': False, 'candidate_num': 0}\n","eval_step = 1\n","stopping_step = 10\n","clip_grad_norm = None\n","weight_decay = 0.0\n","loss_decimal_place = 4\n","\n","Evaluation Hyper Parameters:\n","eval_args = {'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}\n","repeatable = False\n","metrics = ['Recall', 'MRR', 'NDCG', 'Hit', 'Precision']\n","topk = [10]\n","valid_metric = MRR@10\n","valid_metric_bigger = True\n","eval_batch_size = 4096\n","metric_decimal_place = 4\n","\n","Dataset Hyper Parameters:\n","field_separator = \t\n","seq_separator = \n","USER_ID_FIELD = user_id\n","ITEM_ID_FIELD = item_id\n","RATING_FIELD = rating\n","TIME_FIELD = timestamp\n","seq_len = None\n","LABEL_FIELD = label\n","threshold = None\n","NEG_PREFIX = neg_\n","load_col = {'inter': ['user_id', 'item_id', 'timestamp']}\n","unload_col = None\n","unused_col = None\n","additional_feat_suffix = None\n","rm_dup_inter = None\n","val_interval = None\n","filter_inter_by_user_or_item = True\n","user_inter_num_interval = [40,inf)\n","item_inter_num_interval = [40,inf)\n","alias_of_user_id = None\n","alias_of_item_id = None\n","alias_of_entity_id = None\n","alias_of_relation_id = None\n","preload_weight = None\n","normalize_field = None\n","normalize_all = None\n","ITEM_LIST_LENGTH_FIELD = item_length\n","LIST_SUFFIX = _list\n","MAX_ITEM_LIST_LENGTH = 50\n","POSITION_FIELD = position_id\n","HEAD_ENTITY_ID_FIELD = head_id\n","TAIL_ENTITY_ID_FIELD = tail_id\n","RELATION_ID_FIELD = relation_id\n","ENTITY_ID_FIELD = entity_id\n","benchmark_filename = None\n","\n","Other Hyper Parameters: \n","worker = 0\n","wandb_project = recbole\n","shuffle = True\n","require_pow = False\n","enable_amp = False\n","enable_scaler = False\n","transform = None\n","hidden_dimension = 600\n","latent_dimension = 200\n","dropout_prob = 0.5\n","beta = 0.2\n","gamma = 0.005\n","mixture_weights = [0.15, 0.75, 0.1]\n","n_enc_epochs = 3\n","n_dec_epochs = 1\n","numerical_features = []\n","discretization = None\n","kg_reverse_r = False\n","entity_kg_num_interval = [0,inf)\n","relation_kg_num_interval = [0,inf)\n","MODEL_TYPE = ModelType.GENERAL\n","device = cpu\n","neg_sampling = None\n","verbose = -1\n","MODEL_INPUT_TYPE = InputType.PAIRWISE\n","eval_type = EvaluatorType.RANKING\n","single_spec = True\n","local_rank = 0\n","valid_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","test_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","\n","\n","11 Dec 12:25 INFO recbox_data\n","The number of users: 13355\n","Average actions of users: 63.815710648494836\n","The number of items: 3294\n","Average actions of items: 258.78985727300335\n","The number of inters: 852195\n","The sparsity of the dataset: 98.06281322904924%\n","Remain Fields: ['user_id', 'item_id', 'timestamp']\n","recbox_data\n","The number of users: 13355\n","Average actions of users: 63.815710648494836\n","The number of items: 3294\n","Average actions of items: 258.78985727300335\n","The number of inters: 852195\n","The sparsity of the dataset: 98.06281322904924%\n","Remain Fields: ['user_id', 'item_id', 'timestamp']\n","11 Dec 12:25 INFO [Training]: train_batch_size = [2048] train_neg_sample_args: [{'distribution': 'uniform', 'sample_num': 1, 'alpha': 1.0, 'dynamic': False, 'candidate_num': 0}]\n","[Training]: train_batch_size = [2048] train_neg_sample_args: [{'distribution': 'uniform', 'sample_num': 1, 'alpha': 1.0, 'dynamic': False, 'candidate_num': 0}]\n","11 Dec 12:25 INFO [Evaluation]: eval_batch_size = [4096] eval_args: [{'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}]\n","[Evaluation]: eval_batch_size = [4096] eval_args: [{'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}]\n","11 Dec 12:25 WARNING Max value of user's history interaction records has reached 20.9471766848816% of the total.\n","Max value of user's history interaction records has reached 20.9471766848816% of the total.\n","11 Dec 12:25 INFO RecVAE(\n"," (encoder): Encoder(\n"," (fc1): Linear(in_features=3294, out_features=600, bias=True)\n"," (ln1): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc2): Linear(in_features=600, out_features=600, bias=True)\n"," (ln2): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc3): Linear(in_features=600, out_features=600, bias=True)\n"," (ln3): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc4): Linear(in_features=600, out_features=600, bias=True)\n"," (ln4): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc5): Linear(in_features=600, out_features=600, bias=True)\n"," (ln5): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc_mu): Linear(in_features=600, out_features=200, bias=True)\n"," (fc_logvar): Linear(in_features=600, out_features=200, bias=True)\n"," )\n"," (prior): CompositePrior(\n"," (encoder_old): Encoder(\n"," (fc1): Linear(in_features=3294, out_features=600, bias=True)\n"," (ln1): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc2): Linear(in_features=600, out_features=600, bias=True)\n"," (ln2): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc3): Linear(in_features=600, out_features=600, bias=True)\n"," (ln3): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc4): Linear(in_features=600, out_features=600, bias=True)\n"," (ln4): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc5): Linear(in_features=600, out_features=600, bias=True)\n"," (ln5): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc_mu): Linear(in_features=600, out_features=200, bias=True)\n"," (fc_logvar): Linear(in_features=600, out_features=200, bias=True)\n"," )\n"," )\n"," (decoder): Linear(in_features=200, out_features=3294, bias=True)\n",")\n","Trainable parameters: 4327894\n","RecVAE(\n"," (encoder): Encoder(\n"," (fc1): Linear(in_features=3294, out_features=600, bias=True)\n"," (ln1): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc2): Linear(in_features=600, out_features=600, bias=True)\n"," (ln2): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc3): Linear(in_features=600, out_features=600, bias=True)\n"," (ln3): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc4): Linear(in_features=600, out_features=600, bias=True)\n"," (ln4): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc5): Linear(in_features=600, out_features=600, bias=True)\n"," (ln5): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc_mu): Linear(in_features=600, out_features=200, bias=True)\n"," (fc_logvar): Linear(in_features=600, out_features=200, bias=True)\n"," )\n"," (prior): CompositePrior(\n"," (encoder_old): Encoder(\n"," (fc1): Linear(in_features=3294, out_features=600, bias=True)\n"," (ln1): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc2): Linear(in_features=600, out_features=600, bias=True)\n"," (ln2): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc3): Linear(in_features=600, out_features=600, bias=True)\n"," (ln3): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc4): Linear(in_features=600, out_features=600, bias=True)\n"," (ln4): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc5): Linear(in_features=600, out_features=600, bias=True)\n"," (ln5): LayerNorm((600,), eps=0.1, elementwise_affine=True)\n"," (fc_mu): Linear(in_features=600, out_features=200, bias=True)\n"," (fc_logvar): Linear(in_features=600, out_features=200, bias=True)\n"," )\n"," )\n"," (decoder): Linear(in_features=200, out_features=3294, bias=True)\n",")\n","Trainable parameters: 4327894\n","11 Dec 12:25 INFO FLOPs: 4321200.0\n","FLOPs: 4321200.0\n","11 Dec 12:25 INFO epoch 0 training [time: 23.87s, train loss: 2354.4009]\n","epoch 0 training [time: 23.87s, train loss: 2354.4009]\n","11 Dec 12:25 INFO Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","11 Dec 12:26 INFO epoch 1 training [time: 26.41s, train loss: 2247.2854]\n","epoch 1 training [time: 26.41s, train loss: 2247.2854]\n","11 Dec 12:26 INFO Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","11 Dec 12:26 INFO epoch 2 training [time: 26.19s, train loss: 2184.4206]\n","epoch 2 training [time: 26.19s, train loss: 2184.4206]\n","11 Dec 12:26 INFO Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","11 Dec 12:27 INFO epoch 3 training [time: 28.26s, train loss: 2147.9836]\n","epoch 3 training [time: 28.26s, train loss: 2147.9836]\n","11 Dec 12:27 INFO Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","11 Dec 12:27 INFO epoch 4 training [time: 25.59s, train loss: 2108.6837]\n","epoch 4 training [time: 25.59s, train loss: 2108.6837]\n","11 Dec 12:27 INFO Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","11 Dec 12:27 INFO epoch 5 training [time: 19.99s, train loss: 2073.2995]\n","epoch 5 training [time: 19.99s, train loss: 2073.2995]\n","11 Dec 12:27 INFO Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","11 Dec 12:28 INFO epoch 6 training [time: 23.58s, train loss: 2043.1616]\n","epoch 6 training [time: 23.58s, train loss: 2043.1616]\n","11 Dec 12:28 INFO Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","11 Dec 12:28 INFO epoch 7 training [time: 24.14s, train loss: 2013.9314]\n","epoch 7 training [time: 24.14s, train loss: 2013.9314]\n","11 Dec 12:28 INFO Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","11 Dec 12:28 INFO epoch 8 training [time: 12.42s, train loss: 1998.7426]\n","epoch 8 training [time: 12.42s, train loss: 1998.7426]\n","11 Dec 12:28 INFO Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","11 Dec 12:28 INFO epoch 9 training [time: 10.69s, train loss: 1973.2974]\n","epoch 9 training [time: 10.69s, train loss: 1973.2974]\n","11 Dec 12:28 INFO Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","Saving current: saved/RecVAE-Dec-11-2023_12-25-16.pth\n","11 Dec 12:28 INFO Loading model structure and parameters from saved/RecVAE-Dec-11-2023_12-25-16.pth\n","Loading model structure and parameters from saved/RecVAE-Dec-11-2023_12-25-16.pth\n","11 Dec 12:29 INFO The running environment of this training is as follows:\n","+-------------+---------------+\n","| Environment | Usage |\n","+=============+===============+\n","| CPU | 50.10 % |\n","+-------------+---------------+\n","| GPU | 0.0 / 0.0 |\n","+-------------+---------------+\n","| Memory | 0.09 G/8.00 G |\n","+-------------+---------------+\n","The running environment of this training is as follows:\n","+-------------+---------------+\n","| Environment | Usage |\n","+=============+===============+\n","| CPU | 50.10 % |\n","+-------------+---------------+\n","| GPU | 0.0 / 0.0 |\n","+-------------+---------------+\n","| Memory | 0.09 G/8.00 G |\n","+-------------+---------------+\n","11 Dec 12:29 INFO best valid : None\n","best valid : None\n","11 Dec 12:29 INFO test result: OrderedDict([('recall@10', 0.0844), ('mrr@10', 0.1662), ('ndcg@10', 0.0816), ('hit@10', 0.3519), ('precision@10', 0.0468)])\n","test result: OrderedDict([('recall@10', 0.0844), ('mrr@10', 0.1662), ('ndcg@10', 0.0816), ('hit@10', 0.3519), ('precision@10', 0.0468)])\n"]},{"name":"stdout","output_type":"stream","text":["It took 6.70 mins\n","{'best_valid_score': -inf, 'valid_score_bigger': True, 'best_valid_result': None, 'test_result': OrderedDict([('recall@10', 0.0844), ('mrr@10', 0.1662), ('ndcg@10', 0.0816), ('hit@10', 0.3519), ('precision@10', 0.0468)])}\n","CPU times: user 25min 39s, sys: 9min 10s, total: 34min 49s\n","Wall time: 32min 31s\n"]}],"source":["%%time\n","model_list = [ \"LightGCN\", \"MultiVAE\", \"RecVAE\"] \n","\n","for model_name in model_list:\n"," print(f\"running {model_name}...\")\n"," start = time.time()\n"," result = run_recbole(model=model_name, dataset = 'recbox_data',config_dict = parameter_dict)\n"," t = time.time() - start\n"," print(f\"It took {t/60:.2f} mins\")\n"," print(result)"]},{"cell_type":"code","execution_count":35,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Collecting kmeans-pytorch\n"," Downloading kmeans_pytorch-0.3-py3-none-any.whl (4.4 kB)\n","Installing collected packages: kmeans-pytorch\n","Successfully installed kmeans-pytorch-0.3\n","Note: you may need to restart the kernel to use updated packages.\n"]}],"source":["%pip install kmeans-pytorch"]},{"cell_type":"code","execution_count":36,"metadata":{},"outputs":[],"source":["from kmeans_pytorch import kmeans"]},{"cell_type":"code","execution_count":37,"metadata":{"execution":{"iopub.execute_input":"2023-01-22T18:14:48.482175Z","iopub.status.busy":"2023-01-22T18:14:48.481796Z","iopub.status.idle":"2023-01-22T19:32:27.636297Z","shell.execute_reply":"2023-01-22T19:32:27.635371Z","shell.execute_reply.started":"2023-01-22T18:14:48.482143Z"},"trusted":true},"outputs":[{"name":"stdout","output_type":"stream","text":["running CORE...\n"]},{"name":"stderr","output_type":"stream","text":["11 Dec 13:40 INFO ['/Users/annapikuleva/Library/Python/3.9/lib/python/site-packages/ipykernel_launcher.py', '--f=/Users/annapikuleva/Library/Jupyter/runtime/kernel-v2-3832937JAU6uqtVOE.json']\n","['/Users/annapikuleva/Library/Python/3.9/lib/python/site-packages/ipykernel_launcher.py', '--f=/Users/annapikuleva/Library/Jupyter/runtime/kernel-v2-3832937JAU6uqtVOE.json']\n","11 Dec 13:40 INFO \n","General Hyper Parameters:\n","gpu_id = 0\n","use_gpu = True\n","seed = 2020\n","state = INFO\n","reproducibility = True\n","data_path = recbox_data\n","checkpoint_dir = saved\n","show_progress = False\n","save_dataset = False\n","dataset_save_path = None\n","save_dataloaders = False\n","dataloaders_save_path = None\n","log_wandb = False\n","\n","Training Hyper Parameters:\n","epochs = 10\n","train_batch_size = 2048\n","learner = adam\n","learning_rate = 0.001\n","train_neg_sample_args = {'distribution': 'none', 'sample_num': 'none', 'alpha': 'none', 'dynamic': False, 'candidate_num': 0}\n","eval_step = 1\n","stopping_step = 10\n","clip_grad_norm = None\n","weight_decay = 0.0\n","loss_decimal_place = 4\n","\n","Evaluation Hyper Parameters:\n","eval_args = {'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}\n","repeatable = True\n","metrics = ['Recall', 'MRR', 'NDCG', 'Hit', 'Precision']\n","topk = [10]\n","valid_metric = MRR@10\n","valid_metric_bigger = True\n","eval_batch_size = 4096\n","metric_decimal_place = 4\n","\n","Dataset Hyper Parameters:\n","field_separator = \t\n","seq_separator = \n","USER_ID_FIELD = user_id\n","ITEM_ID_FIELD = item_id\n","RATING_FIELD = rating\n","TIME_FIELD = timestamp\n","seq_len = None\n","LABEL_FIELD = label\n","threshold = None\n","NEG_PREFIX = neg_\n","load_col = {'inter': ['user_id', 'item_id', 'timestamp']}\n","unload_col = None\n","unused_col = None\n","additional_feat_suffix = None\n","rm_dup_inter = None\n","val_interval = None\n","filter_inter_by_user_or_item = True\n","user_inter_num_interval = [40,inf)\n","item_inter_num_interval = [40,inf)\n","alias_of_user_id = None\n","alias_of_item_id = None\n","alias_of_entity_id = None\n","alias_of_relation_id = None\n","preload_weight = None\n","normalize_field = None\n","normalize_all = None\n","ITEM_LIST_LENGTH_FIELD = item_length\n","LIST_SUFFIX = _list\n","MAX_ITEM_LIST_LENGTH = 50\n","POSITION_FIELD = position_id\n","HEAD_ENTITY_ID_FIELD = head_id\n","TAIL_ENTITY_ID_FIELD = tail_id\n","RELATION_ID_FIELD = relation_id\n","ENTITY_ID_FIELD = entity_id\n","benchmark_filename = None\n","\n","Other Hyper Parameters: \n","worker = 0\n","wandb_project = recbole\n","shuffle = True\n","require_pow = False\n","enable_amp = False\n","enable_scaler = False\n","transform = None\n","embedding_size = 64\n","inner_size = 256\n","n_layers = 2\n","n_heads = 2\n","hidden_dropout_prob = 0.5\n","attn_dropout_prob = 0.5\n","hidden_act = gelu\n","layer_norm_eps = 1e-12\n","initializer_range = 0.02\n","loss_type = CE\n","dnn_type = trm\n","sess_dropout = 0.2\n","item_dropout = 0.2\n","temperature = 0.07\n","numerical_features = []\n","discretization = None\n","kg_reverse_r = False\n","entity_kg_num_interval = [0,inf)\n","relation_kg_num_interval = [0,inf)\n","MODEL_TYPE = ModelType.SEQUENTIAL\n","device = cpu\n","neg_sampling = None\n","verbose = -1\n","MODEL_INPUT_TYPE = InputType.POINTWISE\n","eval_type = EvaluatorType.RANKING\n","single_spec = True\n","local_rank = 0\n","valid_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","test_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","\n","\n","\n","General Hyper Parameters:\n","gpu_id = 0\n","use_gpu = True\n","seed = 2020\n","state = INFO\n","reproducibility = True\n","data_path = recbox_data\n","checkpoint_dir = saved\n","show_progress = False\n","save_dataset = False\n","dataset_save_path = None\n","save_dataloaders = False\n","dataloaders_save_path = None\n","log_wandb = False\n","\n","Training Hyper Parameters:\n","epochs = 10\n","train_batch_size = 2048\n","learner = adam\n","learning_rate = 0.001\n","train_neg_sample_args = {'distribution': 'none', 'sample_num': 'none', 'alpha': 'none', 'dynamic': False, 'candidate_num': 0}\n","eval_step = 1\n","stopping_step = 10\n","clip_grad_norm = None\n","weight_decay = 0.0\n","loss_decimal_place = 4\n","\n","Evaluation Hyper Parameters:\n","eval_args = {'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}\n","repeatable = True\n","metrics = ['Recall', 'MRR', 'NDCG', 'Hit', 'Precision']\n","topk = [10]\n","valid_metric = MRR@10\n","valid_metric_bigger = True\n","eval_batch_size = 4096\n","metric_decimal_place = 4\n","\n","Dataset Hyper Parameters:\n","field_separator = \t\n","seq_separator = \n","USER_ID_FIELD = user_id\n","ITEM_ID_FIELD = item_id\n","RATING_FIELD = rating\n","TIME_FIELD = timestamp\n","seq_len = None\n","LABEL_FIELD = label\n","threshold = None\n","NEG_PREFIX = neg_\n","load_col = {'inter': ['user_id', 'item_id', 'timestamp']}\n","unload_col = None\n","unused_col = None\n","additional_feat_suffix = None\n","rm_dup_inter = None\n","val_interval = None\n","filter_inter_by_user_or_item = True\n","user_inter_num_interval = [40,inf)\n","item_inter_num_interval = [40,inf)\n","alias_of_user_id = None\n","alias_of_item_id = None\n","alias_of_entity_id = None\n","alias_of_relation_id = None\n","preload_weight = None\n","normalize_field = None\n","normalize_all = None\n","ITEM_LIST_LENGTH_FIELD = item_length\n","LIST_SUFFIX = _list\n","MAX_ITEM_LIST_LENGTH = 50\n","POSITION_FIELD = position_id\n","HEAD_ENTITY_ID_FIELD = head_id\n","TAIL_ENTITY_ID_FIELD = tail_id\n","RELATION_ID_FIELD = relation_id\n","ENTITY_ID_FIELD = entity_id\n","benchmark_filename = None\n","\n","Other Hyper Parameters: \n","worker = 0\n","wandb_project = recbole\n","shuffle = True\n","require_pow = False\n","enable_amp = False\n","enable_scaler = False\n","transform = None\n","embedding_size = 64\n","inner_size = 256\n","n_layers = 2\n","n_heads = 2\n","hidden_dropout_prob = 0.5\n","attn_dropout_prob = 0.5\n","hidden_act = gelu\n","layer_norm_eps = 1e-12\n","initializer_range = 0.02\n","loss_type = CE\n","dnn_type = trm\n","sess_dropout = 0.2\n","item_dropout = 0.2\n","temperature = 0.07\n","numerical_features = []\n","discretization = None\n","kg_reverse_r = False\n","entity_kg_num_interval = [0,inf)\n","relation_kg_num_interval = [0,inf)\n","MODEL_TYPE = ModelType.SEQUENTIAL\n","device = cpu\n","neg_sampling = None\n","verbose = -1\n","MODEL_INPUT_TYPE = InputType.POINTWISE\n","eval_type = EvaluatorType.RANKING\n","single_spec = True\n","local_rank = 0\n","valid_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","test_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","\n","\n","11 Dec 13:41 INFO recbox_data\n","The number of users: 13355\n","Average actions of users: 63.815710648494836\n","The number of items: 3294\n","Average actions of items: 258.78985727300335\n","The number of inters: 852195\n","The sparsity of the dataset: 98.06281322904924%\n","Remain Fields: ['user_id', 'item_id', 'timestamp']\n","recbox_data\n","The number of users: 13355\n","Average actions of users: 63.815710648494836\n","The number of items: 3294\n","Average actions of items: 258.78985727300335\n","The number of inters: 852195\n","The sparsity of the dataset: 98.06281322904924%\n","Remain Fields: ['user_id', 'item_id', 'timestamp']\n","11 Dec 13:42 INFO [Training]: train_batch_size = [2048] train_neg_sample_args: [{'distribution': 'none', 'sample_num': 'none', 'alpha': 'none', 'dynamic': False, 'candidate_num': 0}]\n","[Training]: train_batch_size = [2048] train_neg_sample_args: [{'distribution': 'none', 'sample_num': 'none', 'alpha': 'none', 'dynamic': False, 'candidate_num': 0}]\n","11 Dec 13:42 INFO [Evaluation]: eval_batch_size = [4096] eval_args: [{'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}]\n","[Evaluation]: eval_batch_size = [4096] eval_args: [{'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}]\n","11 Dec 13:42 INFO CORE(\n"," (sess_dropout): Dropout(p=0.2, inplace=False)\n"," (item_dropout): Dropout(p=0.2, inplace=False)\n"," (item_embedding): Embedding(3294, 64, padding_idx=0)\n"," (net): TransNet(\n"," (position_embedding): Embedding(50, 64)\n"," (trm_encoder): TransformerEncoder(\n"," (layer): ModuleList(\n"," (0-1): 2 x TransformerLayer(\n"," (multi_head_attention): MultiHeadAttention(\n"," (query): Linear(in_features=64, out_features=64, bias=True)\n"," (key): Linear(in_features=64, out_features=64, bias=True)\n"," (value): Linear(in_features=64, out_features=64, bias=True)\n"," (softmax): Softmax(dim=-1)\n"," (attn_dropout): Dropout(p=0.5, inplace=False)\n"," (dense): Linear(in_features=64, out_features=64, bias=True)\n"," (LayerNorm): LayerNorm((64,), eps=1e-12, elementwise_affine=True)\n"," (out_dropout): Dropout(p=0.5, inplace=False)\n"," )\n"," (feed_forward): FeedForward(\n"," (dense_1): Linear(in_features=64, out_features=256, bias=True)\n"," (dense_2): Linear(in_features=256, out_features=64, bias=True)\n"," (LayerNorm): LayerNorm((64,), eps=1e-12, elementwise_affine=True)\n"," (dropout): Dropout(p=0.5, inplace=False)\n"," )\n"," )\n"," )\n"," )\n"," (LayerNorm): LayerNorm((64,), eps=1e-12, elementwise_affine=True)\n"," (dropout): Dropout(p=0.5, inplace=False)\n"," (fn): Linear(in_features=64, out_features=1, bias=True)\n"," )\n"," (loss_fct): CrossEntropyLoss()\n",")\n","Trainable parameters: 314177\n","CORE(\n"," (sess_dropout): Dropout(p=0.2, inplace=False)\n"," (item_dropout): Dropout(p=0.2, inplace=False)\n"," (item_embedding): Embedding(3294, 64, padding_idx=0)\n"," (net): TransNet(\n"," (position_embedding): Embedding(50, 64)\n"," (trm_encoder): TransformerEncoder(\n"," (layer): ModuleList(\n"," (0-1): 2 x TransformerLayer(\n"," (multi_head_attention): MultiHeadAttention(\n"," (query): Linear(in_features=64, out_features=64, bias=True)\n"," (key): Linear(in_features=64, out_features=64, bias=True)\n"," (value): Linear(in_features=64, out_features=64, bias=True)\n"," (softmax): Softmax(dim=-1)\n"," (attn_dropout): Dropout(p=0.5, inplace=False)\n"," (dense): Linear(in_features=64, out_features=64, bias=True)\n"," (LayerNorm): LayerNorm((64,), eps=1e-12, elementwise_affine=True)\n"," (out_dropout): Dropout(p=0.5, inplace=False)\n"," )\n"," (feed_forward): FeedForward(\n"," (dense_1): Linear(in_features=64, out_features=256, bias=True)\n"," (dense_2): Linear(in_features=256, out_features=64, bias=True)\n"," (LayerNorm): LayerNorm((64,), eps=1e-12, elementwise_affine=True)\n"," (dropout): Dropout(p=0.5, inplace=False)\n"," )\n"," )\n"," )\n"," )\n"," (LayerNorm): LayerNorm((64,), eps=1e-12, elementwise_affine=True)\n"," (dropout): Dropout(p=0.5, inplace=False)\n"," (fn): Linear(in_features=64, out_features=1, bias=True)\n"," )\n"," (loss_fct): CrossEntropyLoss()\n",")\n","Trainable parameters: 314177\n","11 Dec 13:42 INFO FLOPs: 4986664.0\n","FLOPs: 4986664.0\n","11 Dec 14:56 INFO epoch 0 training [time: 4465.02s, train loss: 3014.5362]\n","epoch 0 training [time: 4465.02s, train loss: 3014.5362]\n","11 Dec 14:56 INFO Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","11 Dec 15:22 INFO epoch 1 training [time: 1551.87s, train loss: 2695.9846]\n","epoch 1 training [time: 1551.87s, train loss: 2695.9846]\n","11 Dec 15:22 INFO Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","11 Dec 15:51 INFO epoch 2 training [time: 1725.13s, train loss: 2613.6121]\n","epoch 2 training [time: 1725.13s, train loss: 2613.6121]\n","11 Dec 15:51 INFO Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","11 Dec 16:20 INFO epoch 3 training [time: 1788.98s, train loss: 2579.6137]\n","epoch 3 training [time: 1788.98s, train loss: 2579.6137]\n","11 Dec 16:20 INFO Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","11 Dec 17:53 INFO epoch 4 training [time: 5548.65s, train loss: 2562.4357]\n","epoch 4 training [time: 5548.65s, train loss: 2562.4357]\n","11 Dec 17:53 INFO Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","11 Dec 18:23 INFO epoch 5 training [time: 1835.07s, train loss: 2551.7563]\n","epoch 5 training [time: 1835.07s, train loss: 2551.7563]\n","11 Dec 18:23 INFO Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","11 Dec 18:52 INFO epoch 6 training [time: 1691.97s, train loss: 2545.4003]\n","epoch 6 training [time: 1691.97s, train loss: 2545.4003]\n","11 Dec 18:52 INFO Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","11 Dec 19:23 INFO epoch 7 training [time: 1858.18s, train loss: 2540.3678]\n","epoch 7 training [time: 1858.18s, train loss: 2540.3678]\n","11 Dec 19:23 INFO Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","11 Dec 20:06 INFO epoch 8 training [time: 2614.77s, train loss: 2537.1684]\n","epoch 8 training [time: 2614.77s, train loss: 2537.1684]\n","11 Dec 20:06 INFO Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","11 Dec 21:22 INFO epoch 9 training [time: 4561.69s, train loss: 2534.2584]\n","epoch 9 training [time: 4561.69s, train loss: 2534.2584]\n","11 Dec 21:22 INFO Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","Saving current: saved/CORE-Dec-11-2023_13-42-03.pth\n","11 Dec 21:22 INFO Loading model structure and parameters from saved/CORE-Dec-11-2023_13-42-03.pth\n","Loading model structure and parameters from saved/CORE-Dec-11-2023_13-42-03.pth\n","11 Dec 21:23 INFO The running environment of this training is as follows:\n","+-------------+---------------+\n","| Environment | Usage |\n","+=============+===============+\n","| CPU | 46.10 % |\n","+-------------+---------------+\n","| GPU | 0.0 / 0.0 |\n","+-------------+---------------+\n","| Memory | 0.77 G/8.00 G |\n","+-------------+---------------+\n","The running environment of this training is as follows:\n","+-------------+---------------+\n","| Environment | Usage |\n","+=============+===============+\n","| CPU | 46.10 % |\n","+-------------+---------------+\n","| GPU | 0.0 / 0.0 |\n","+-------------+---------------+\n","| Memory | 0.77 G/8.00 G |\n","+-------------+---------------+\n","11 Dec 21:23 INFO best valid : None\n","best valid : None\n","11 Dec 21:23 INFO test result: OrderedDict([('recall@10', 0.0921), ('mrr@10', 0.0297), ('ndcg@10', 0.044), ('hit@10', 0.0921), ('precision@10', 0.0092)])\n","test result: OrderedDict([('recall@10', 0.0921), ('mrr@10', 0.0297), ('ndcg@10', 0.044), ('hit@10', 0.0921), ('precision@10', 0.0092)])\n"]},{"name":"stdout","output_type":"stream","text":["It took 463.62 mins\n","{'best_valid_score': -inf, 'valid_score_bigger': True, 'best_valid_result': None, 'test_result': OrderedDict([('recall@10', 0.0921), ('mrr@10', 0.0297), ('ndcg@10', 0.044), ('hit@10', 0.0921), ('precision@10', 0.0092)])}\n","running LightSANs...\n"]},{"name":"stderr","output_type":"stream","text":["11 Dec 21:23 INFO ['/Users/annapikuleva/Library/Python/3.9/lib/python/site-packages/ipykernel_launcher.py', '--f=/Users/annapikuleva/Library/Jupyter/runtime/kernel-v2-3832937JAU6uqtVOE.json']\n","['/Users/annapikuleva/Library/Python/3.9/lib/python/site-packages/ipykernel_launcher.py', '--f=/Users/annapikuleva/Library/Jupyter/runtime/kernel-v2-3832937JAU6uqtVOE.json']\n","11 Dec 21:23 INFO \n","General Hyper Parameters:\n","gpu_id = 0\n","use_gpu = True\n","seed = 2020\n","state = INFO\n","reproducibility = True\n","data_path = recbox_data\n","checkpoint_dir = saved\n","show_progress = False\n","save_dataset = False\n","dataset_save_path = None\n","save_dataloaders = False\n","dataloaders_save_path = None\n","log_wandb = False\n","\n","Training Hyper Parameters:\n","epochs = 10\n","train_batch_size = 2048\n","learner = adam\n","learning_rate = 0.001\n","train_neg_sample_args = {'distribution': 'none', 'sample_num': 'none', 'alpha': 'none', 'dynamic': False, 'candidate_num': 0}\n","eval_step = 1\n","stopping_step = 10\n","clip_grad_norm = None\n","weight_decay = 0.0\n","loss_decimal_place = 4\n","\n","Evaluation Hyper Parameters:\n","eval_args = {'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}\n","repeatable = True\n","metrics = ['Recall', 'MRR', 'NDCG', 'Hit', 'Precision']\n","topk = [10]\n","valid_metric = MRR@10\n","valid_metric_bigger = True\n","eval_batch_size = 4096\n","metric_decimal_place = 4\n","\n","Dataset Hyper Parameters:\n","field_separator = \t\n","seq_separator = \n","USER_ID_FIELD = user_id\n","ITEM_ID_FIELD = item_id\n","RATING_FIELD = rating\n","TIME_FIELD = timestamp\n","seq_len = None\n","LABEL_FIELD = label\n","threshold = None\n","NEG_PREFIX = neg_\n","load_col = {'inter': ['user_id', 'item_id', 'timestamp']}\n","unload_col = None\n","unused_col = None\n","additional_feat_suffix = None\n","rm_dup_inter = None\n","val_interval = None\n","filter_inter_by_user_or_item = True\n","user_inter_num_interval = [40,inf)\n","item_inter_num_interval = [40,inf)\n","alias_of_user_id = None\n","alias_of_item_id = None\n","alias_of_entity_id = None\n","alias_of_relation_id = None\n","preload_weight = None\n","normalize_field = None\n","normalize_all = None\n","ITEM_LIST_LENGTH_FIELD = item_length\n","LIST_SUFFIX = _list\n","MAX_ITEM_LIST_LENGTH = 50\n","POSITION_FIELD = position_id\n","HEAD_ENTITY_ID_FIELD = head_id\n","TAIL_ENTITY_ID_FIELD = tail_id\n","RELATION_ID_FIELD = relation_id\n","ENTITY_ID_FIELD = entity_id\n","benchmark_filename = None\n","\n","Other Hyper Parameters: \n","worker = 0\n","wandb_project = recbole\n","shuffle = True\n","require_pow = False\n","enable_amp = False\n","enable_scaler = False\n","transform = None\n","k_interests = 5\n","n_layers = 2\n","n_heads = 2\n","hidden_size = 64\n","inner_size = 256\n","hidden_dropout_prob = 0.5\n","attn_dropout_prob = 0.5\n","hidden_act = gelu\n","layer_norm_eps = 1e-12\n","initializer_range = 0.02\n","loss_type = CE\n","numerical_features = []\n","discretization = None\n","kg_reverse_r = False\n","entity_kg_num_interval = [0,inf)\n","relation_kg_num_interval = [0,inf)\n","MODEL_TYPE = ModelType.SEQUENTIAL\n","device = cpu\n","neg_sampling = None\n","verbose = -1\n","MODEL_INPUT_TYPE = InputType.POINTWISE\n","eval_type = EvaluatorType.RANKING\n","single_spec = True\n","local_rank = 0\n","valid_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","test_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","\n","\n","\n","General Hyper Parameters:\n","gpu_id = 0\n","use_gpu = True\n","seed = 2020\n","state = INFO\n","reproducibility = True\n","data_path = recbox_data\n","checkpoint_dir = saved\n","show_progress = False\n","save_dataset = False\n","dataset_save_path = None\n","save_dataloaders = False\n","dataloaders_save_path = None\n","log_wandb = False\n","\n","Training Hyper Parameters:\n","epochs = 10\n","train_batch_size = 2048\n","learner = adam\n","learning_rate = 0.001\n","train_neg_sample_args = {'distribution': 'none', 'sample_num': 'none', 'alpha': 'none', 'dynamic': False, 'candidate_num': 0}\n","eval_step = 1\n","stopping_step = 10\n","clip_grad_norm = None\n","weight_decay = 0.0\n","loss_decimal_place = 4\n","\n","Evaluation Hyper Parameters:\n","eval_args = {'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}\n","repeatable = True\n","metrics = ['Recall', 'MRR', 'NDCG', 'Hit', 'Precision']\n","topk = [10]\n","valid_metric = MRR@10\n","valid_metric_bigger = True\n","eval_batch_size = 4096\n","metric_decimal_place = 4\n","\n","Dataset Hyper Parameters:\n","field_separator = \t\n","seq_separator = \n","USER_ID_FIELD = user_id\n","ITEM_ID_FIELD = item_id\n","RATING_FIELD = rating\n","TIME_FIELD = timestamp\n","seq_len = None\n","LABEL_FIELD = label\n","threshold = None\n","NEG_PREFIX = neg_\n","load_col = {'inter': ['user_id', 'item_id', 'timestamp']}\n","unload_col = None\n","unused_col = None\n","additional_feat_suffix = None\n","rm_dup_inter = None\n","val_interval = None\n","filter_inter_by_user_or_item = True\n","user_inter_num_interval = [40,inf)\n","item_inter_num_interval = [40,inf)\n","alias_of_user_id = None\n","alias_of_item_id = None\n","alias_of_entity_id = None\n","alias_of_relation_id = None\n","preload_weight = None\n","normalize_field = None\n","normalize_all = None\n","ITEM_LIST_LENGTH_FIELD = item_length\n","LIST_SUFFIX = _list\n","MAX_ITEM_LIST_LENGTH = 50\n","POSITION_FIELD = position_id\n","HEAD_ENTITY_ID_FIELD = head_id\n","TAIL_ENTITY_ID_FIELD = tail_id\n","RELATION_ID_FIELD = relation_id\n","ENTITY_ID_FIELD = entity_id\n","benchmark_filename = None\n","\n","Other Hyper Parameters: \n","worker = 0\n","wandb_project = recbole\n","shuffle = True\n","require_pow = False\n","enable_amp = False\n","enable_scaler = False\n","transform = None\n","k_interests = 5\n","n_layers = 2\n","n_heads = 2\n","hidden_size = 64\n","inner_size = 256\n","hidden_dropout_prob = 0.5\n","attn_dropout_prob = 0.5\n","hidden_act = gelu\n","layer_norm_eps = 1e-12\n","initializer_range = 0.02\n","loss_type = CE\n","numerical_features = []\n","discretization = None\n","kg_reverse_r = False\n","entity_kg_num_interval = [0,inf)\n","relation_kg_num_interval = [0,inf)\n","MODEL_TYPE = ModelType.SEQUENTIAL\n","device = cpu\n","neg_sampling = None\n","verbose = -1\n","MODEL_INPUT_TYPE = InputType.POINTWISE\n","eval_type = EvaluatorType.RANKING\n","single_spec = True\n","local_rank = 0\n","valid_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","test_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","\n","\n","11 Dec 21:31 INFO recbox_data\n","The number of users: 13355\n","Average actions of users: 63.815710648494836\n","The number of items: 3294\n","Average actions of items: 258.78985727300335\n","The number of inters: 852195\n","The sparsity of the dataset: 98.06281322904924%\n","Remain Fields: ['user_id', 'item_id', 'timestamp']\n","recbox_data\n","The number of users: 13355\n","Average actions of users: 63.815710648494836\n","The number of items: 3294\n","Average actions of items: 258.78985727300335\n","The number of inters: 852195\n","The sparsity of the dataset: 98.06281322904924%\n","Remain Fields: ['user_id', 'item_id', 'timestamp']\n","11 Dec 21:31 INFO [Training]: train_batch_size = [2048] train_neg_sample_args: [{'distribution': 'none', 'sample_num': 'none', 'alpha': 'none', 'dynamic': False, 'candidate_num': 0}]\n","[Training]: train_batch_size = [2048] train_neg_sample_args: [{'distribution': 'none', 'sample_num': 'none', 'alpha': 'none', 'dynamic': False, 'candidate_num': 0}]\n","11 Dec 21:31 INFO [Evaluation]: eval_batch_size = [4096] eval_args: [{'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}]\n","[Evaluation]: eval_batch_size = [4096] eval_args: [{'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}]\n","11 Dec 21:31 INFO LightSANs(\n"," (item_embedding): Embedding(3294, 64, padding_idx=0)\n"," (position_embedding): Embedding(50, 64)\n"," (trm_encoder): LightTransformerEncoder(\n"," (layer): ModuleList(\n"," (0-1): 2 x LightTransformerLayer(\n"," (multi_head_attention): LightMultiHeadAttention(\n"," (query): Linear(in_features=64, out_features=64, bias=True)\n"," (key): Linear(in_features=64, out_features=64, bias=True)\n"," (value): Linear(in_features=64, out_features=64, bias=True)\n"," (attpooling_key): ItemToInterestAggregation()\n"," (attpooling_value): ItemToInterestAggregation()\n"," (pos_q_linear): Linear(in_features=64, out_features=64, bias=True)\n"," (pos_k_linear): Linear(in_features=64, out_features=64, bias=True)\n"," (pos_ln): LayerNorm((64,), eps=1e-12, elementwise_affine=True)\n"," (attn_dropout): Dropout(p=0.5, inplace=False)\n"," (dense): Linear(in_features=64, out_features=64, bias=True)\n"," (LayerNorm): LayerNorm((64,), eps=1e-12, elementwise_affine=True)\n"," (out_dropout): Dropout(p=0.5, inplace=False)\n"," )\n"," (feed_forward): FeedForward(\n"," (dense_1): Linear(in_features=64, out_features=256, bias=True)\n"," (dense_2): Linear(in_features=256, out_features=64, bias=True)\n"," (LayerNorm): LayerNorm((64,), eps=1e-12, elementwise_affine=True)\n"," (dropout): Dropout(p=0.5, inplace=False)\n"," )\n"," )\n"," )\n"," )\n"," (LayerNorm): LayerNorm((64,), eps=1e-12, elementwise_affine=True)\n"," (dropout): Dropout(p=0.5, inplace=False)\n"," (loss_fct): CrossEntropyLoss()\n",")\n","Trainable parameters: 332288\n","LightSANs(\n"," (item_embedding): Embedding(3294, 64, padding_idx=0)\n"," (position_embedding): Embedding(50, 64)\n"," (trm_encoder): LightTransformerEncoder(\n"," (layer): ModuleList(\n"," (0-1): 2 x LightTransformerLayer(\n"," (multi_head_attention): LightMultiHeadAttention(\n"," (query): Linear(in_features=64, out_features=64, bias=True)\n"," (key): Linear(in_features=64, out_features=64, bias=True)\n"," (value): Linear(in_features=64, out_features=64, bias=True)\n"," (attpooling_key): ItemToInterestAggregation()\n"," (attpooling_value): ItemToInterestAggregation()\n"," (pos_q_linear): Linear(in_features=64, out_features=64, bias=True)\n"," (pos_k_linear): Linear(in_features=64, out_features=64, bias=True)\n"," (pos_ln): LayerNorm((64,), eps=1e-12, elementwise_affine=True)\n"," (attn_dropout): Dropout(p=0.5, inplace=False)\n"," (dense): Linear(in_features=64, out_features=64, bias=True)\n"," (LayerNorm): LayerNorm((64,), eps=1e-12, elementwise_affine=True)\n"," (out_dropout): Dropout(p=0.5, inplace=False)\n"," )\n"," (feed_forward): FeedForward(\n"," (dense_1): Linear(in_features=64, out_features=256, bias=True)\n"," (dense_2): Linear(in_features=256, out_features=64, bias=True)\n"," (LayerNorm): LayerNorm((64,), eps=1e-12, elementwise_affine=True)\n"," (dropout): Dropout(p=0.5, inplace=False)\n"," )\n"," )\n"," )\n"," )\n"," (LayerNorm): LayerNorm((64,), eps=1e-12, elementwise_affine=True)\n"," (dropout): Dropout(p=0.5, inplace=False)\n"," (loss_fct): CrossEntropyLoss()\n",")\n","Trainable parameters: 332288\n","11 Dec 21:31 INFO FLOPs: 5785664.0\n","FLOPs: 5785664.0\n","11 Dec 22:10 INFO epoch 0 training [time: 2297.51s, train loss: 2745.5162]\n","epoch 0 training [time: 2297.51s, train loss: 2745.5162]\n","11 Dec 22:10 INFO Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","11 Dec 22:35 INFO epoch 1 training [time: 1523.42s, train loss: 2594.7601]\n","epoch 1 training [time: 1523.42s, train loss: 2594.7601]\n","11 Dec 22:35 INFO Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","11 Dec 23:00 INFO epoch 2 training [time: 1474.23s, train loss: 2552.7842]\n","epoch 2 training [time: 1474.23s, train loss: 2552.7842]\n","11 Dec 23:00 INFO Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","11 Dec 23:24 INFO epoch 3 training [time: 1459.72s, train loss: 2529.9439]\n","epoch 3 training [time: 1459.72s, train loss: 2529.9439]\n","11 Dec 23:24 INFO Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","11 Dec 23:47 INFO epoch 4 training [time: 1402.02s, train loss: 2516.8341]\n","epoch 4 training [time: 1402.02s, train loss: 2516.8341]\n","11 Dec 23:47 INFO Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","12 Dec 00:44 INFO epoch 5 training [time: 3408.17s, train loss: 2508.0956]\n","epoch 5 training [time: 3408.17s, train loss: 2508.0956]\n","12 Dec 00:44 INFO Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","12 Dec 01:06 INFO epoch 6 training [time: 1326.43s, train loss: 2501.2301]\n","epoch 6 training [time: 1326.43s, train loss: 2501.2301]\n","12 Dec 01:06 INFO Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","12 Dec 02:02 INFO epoch 7 training [time: 3351.58s, train loss: 2496.2055]\n","epoch 7 training [time: 3351.58s, train loss: 2496.2055]\n","12 Dec 02:02 INFO Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","12 Dec 06:08 INFO epoch 8 training [time: 14777.87s, train loss: 2491.3191]\n","epoch 8 training [time: 14777.87s, train loss: 2491.3191]\n","12 Dec 06:08 INFO Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","12 Dec 08:40 INFO epoch 9 training [time: 9116.53s, train loss: 2487.0272]\n","epoch 9 training [time: 9116.53s, train loss: 2487.0272]\n","12 Dec 08:40 INFO Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","Saving current: saved/LightSANs-Dec-11-2023_21-31-57.pth\n","12 Dec 08:40 INFO Loading model structure and parameters from saved/LightSANs-Dec-11-2023_21-31-57.pth\n","Loading model structure and parameters from saved/LightSANs-Dec-11-2023_21-31-57.pth\n","12 Dec 08:41 INFO The running environment of this training is as follows:\n","+-------------+---------------+\n","| Environment | Usage |\n","+=============+===============+\n","| CPU | 30.70 % |\n","+-------------+---------------+\n","| GPU | 0.0 / 0.0 |\n","+-------------+---------------+\n","| Memory | 0.82 G/8.00 G |\n","+-------------+---------------+\n","The running environment of this training is as follows:\n","+-------------+---------------+\n","| Environment | Usage |\n","+=============+===============+\n","| CPU | 30.70 % |\n","+-------------+---------------+\n","| GPU | 0.0 / 0.0 |\n","+-------------+---------------+\n","| Memory | 0.82 G/8.00 G |\n","+-------------+---------------+\n","12 Dec 08:41 INFO best valid : None\n","best valid : None\n","12 Dec 08:41 INFO test result: OrderedDict([('recall@10', 0.1029), ('mrr@10', 0.0358), ('ndcg@10', 0.0513), ('hit@10', 0.1029), ('precision@10', 0.0103)])\n","test result: OrderedDict([('recall@10', 0.1029), ('mrr@10', 0.0358), ('ndcg@10', 0.0513), ('hit@10', 0.1029), ('precision@10', 0.0103)])\n"]},{"name":"stdout","output_type":"stream","text":["It took 677.87 mins\n","{'best_valid_score': -inf, 'valid_score_bigger': True, 'best_valid_result': None, 'test_result': OrderedDict([('recall@10', 0.1029), ('mrr@10', 0.0358), ('ndcg@10', 0.0513), ('hit@10', 0.1029), ('precision@10', 0.0103)])}\n","running NextItNet...\n"]},{"name":"stderr","output_type":"stream","text":["12 Dec 08:41 INFO ['/Users/annapikuleva/Library/Python/3.9/lib/python/site-packages/ipykernel_launcher.py', '--f=/Users/annapikuleva/Library/Jupyter/runtime/kernel-v2-3832937JAU6uqtVOE.json']\n","['/Users/annapikuleva/Library/Python/3.9/lib/python/site-packages/ipykernel_launcher.py', '--f=/Users/annapikuleva/Library/Jupyter/runtime/kernel-v2-3832937JAU6uqtVOE.json']\n","12 Dec 08:41 INFO \n","General Hyper Parameters:\n","gpu_id = 0\n","use_gpu = True\n","seed = 2020\n","state = INFO\n","reproducibility = True\n","data_path = recbox_data\n","checkpoint_dir = saved\n","show_progress = False\n","save_dataset = False\n","dataset_save_path = None\n","save_dataloaders = False\n","dataloaders_save_path = None\n","log_wandb = False\n","\n","Training Hyper Parameters:\n","epochs = 10\n","train_batch_size = 2048\n","learner = adam\n","learning_rate = 0.001\n","train_neg_sample_args = {'distribution': 'none', 'sample_num': 'none', 'alpha': 'none', 'dynamic': False, 'candidate_num': 0}\n","eval_step = 1\n","stopping_step = 10\n","clip_grad_norm = None\n","weight_decay = 0.0\n","loss_decimal_place = 4\n","\n","Evaluation Hyper Parameters:\n","eval_args = {'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}\n","repeatable = True\n","metrics = ['Recall', 'MRR', 'NDCG', 'Hit', 'Precision']\n","topk = [10]\n","valid_metric = MRR@10\n","valid_metric_bigger = True\n","eval_batch_size = 4096\n","metric_decimal_place = 4\n","\n","Dataset Hyper Parameters:\n","field_separator = \t\n","seq_separator = \n","USER_ID_FIELD = user_id\n","ITEM_ID_FIELD = item_id\n","RATING_FIELD = rating\n","TIME_FIELD = timestamp\n","seq_len = None\n","LABEL_FIELD = label\n","threshold = None\n","NEG_PREFIX = neg_\n","load_col = {'inter': ['user_id', 'item_id', 'timestamp']}\n","unload_col = None\n","unused_col = None\n","additional_feat_suffix = None\n","rm_dup_inter = None\n","val_interval = None\n","filter_inter_by_user_or_item = True\n","user_inter_num_interval = [40,inf)\n","item_inter_num_interval = [40,inf)\n","alias_of_user_id = None\n","alias_of_item_id = None\n","alias_of_entity_id = None\n","alias_of_relation_id = None\n","preload_weight = None\n","normalize_field = None\n","normalize_all = None\n","ITEM_LIST_LENGTH_FIELD = item_length\n","LIST_SUFFIX = _list\n","MAX_ITEM_LIST_LENGTH = 50\n","POSITION_FIELD = position_id\n","HEAD_ENTITY_ID_FIELD = head_id\n","TAIL_ENTITY_ID_FIELD = tail_id\n","RELATION_ID_FIELD = relation_id\n","ENTITY_ID_FIELD = entity_id\n","benchmark_filename = None\n","\n","Other Hyper Parameters: \n","worker = 0\n","wandb_project = recbole\n","shuffle = True\n","require_pow = False\n","enable_amp = False\n","enable_scaler = False\n","transform = None\n","embedding_size = 64\n","kernel_size = 3\n","block_num = 5\n","dilations = [1, 4]\n","reg_weight = 1e-05\n","loss_type = CE\n","numerical_features = []\n","discretization = None\n","kg_reverse_r = False\n","entity_kg_num_interval = [0,inf)\n","relation_kg_num_interval = [0,inf)\n","MODEL_TYPE = ModelType.SEQUENTIAL\n","device = cpu\n","neg_sampling = None\n","verbose = -1\n","MODEL_INPUT_TYPE = InputType.POINTWISE\n","eval_type = EvaluatorType.RANKING\n","single_spec = True\n","local_rank = 0\n","valid_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","test_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","\n","\n","\n","General Hyper Parameters:\n","gpu_id = 0\n","use_gpu = True\n","seed = 2020\n","state = INFO\n","reproducibility = True\n","data_path = recbox_data\n","checkpoint_dir = saved\n","show_progress = False\n","save_dataset = False\n","dataset_save_path = None\n","save_dataloaders = False\n","dataloaders_save_path = None\n","log_wandb = False\n","\n","Training Hyper Parameters:\n","epochs = 10\n","train_batch_size = 2048\n","learner = adam\n","learning_rate = 0.001\n","train_neg_sample_args = {'distribution': 'none', 'sample_num': 'none', 'alpha': 'none', 'dynamic': False, 'candidate_num': 0}\n","eval_step = 1\n","stopping_step = 10\n","clip_grad_norm = None\n","weight_decay = 0.0\n","loss_decimal_place = 4\n","\n","Evaluation Hyper Parameters:\n","eval_args = {'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}\n","repeatable = True\n","metrics = ['Recall', 'MRR', 'NDCG', 'Hit', 'Precision']\n","topk = [10]\n","valid_metric = MRR@10\n","valid_metric_bigger = True\n","eval_batch_size = 4096\n","metric_decimal_place = 4\n","\n","Dataset Hyper Parameters:\n","field_separator = \t\n","seq_separator = \n","USER_ID_FIELD = user_id\n","ITEM_ID_FIELD = item_id\n","RATING_FIELD = rating\n","TIME_FIELD = timestamp\n","seq_len = None\n","LABEL_FIELD = label\n","threshold = None\n","NEG_PREFIX = neg_\n","load_col = {'inter': ['user_id', 'item_id', 'timestamp']}\n","unload_col = None\n","unused_col = None\n","additional_feat_suffix = None\n","rm_dup_inter = None\n","val_interval = None\n","filter_inter_by_user_or_item = True\n","user_inter_num_interval = [40,inf)\n","item_inter_num_interval = [40,inf)\n","alias_of_user_id = None\n","alias_of_item_id = None\n","alias_of_entity_id = None\n","alias_of_relation_id = None\n","preload_weight = None\n","normalize_field = None\n","normalize_all = None\n","ITEM_LIST_LENGTH_FIELD = item_length\n","LIST_SUFFIX = _list\n","MAX_ITEM_LIST_LENGTH = 50\n","POSITION_FIELD = position_id\n","HEAD_ENTITY_ID_FIELD = head_id\n","TAIL_ENTITY_ID_FIELD = tail_id\n","RELATION_ID_FIELD = relation_id\n","ENTITY_ID_FIELD = entity_id\n","benchmark_filename = None\n","\n","Other Hyper Parameters: \n","worker = 0\n","wandb_project = recbole\n","shuffle = True\n","require_pow = False\n","enable_amp = False\n","enable_scaler = False\n","transform = None\n","embedding_size = 64\n","kernel_size = 3\n","block_num = 5\n","dilations = [1, 4]\n","reg_weight = 1e-05\n","loss_type = CE\n","numerical_features = []\n","discretization = None\n","kg_reverse_r = False\n","entity_kg_num_interval = [0,inf)\n","relation_kg_num_interval = [0,inf)\n","MODEL_TYPE = ModelType.SEQUENTIAL\n","device = cpu\n","neg_sampling = None\n","verbose = -1\n","MODEL_INPUT_TYPE = InputType.POINTWISE\n","eval_type = EvaluatorType.RANKING\n","single_spec = True\n","local_rank = 0\n","valid_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","test_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}\n","\n","\n","12 Dec 08:43 INFO recbox_data\n","The number of users: 13355\n","Average actions of users: 63.815710648494836\n","The number of items: 3294\n","Average actions of items: 258.78985727300335\n","The number of inters: 852195\n","The sparsity of the dataset: 98.06281322904924%\n","Remain Fields: ['user_id', 'item_id', 'timestamp']\n","recbox_data\n","The number of users: 13355\n","Average actions of users: 63.815710648494836\n","The number of items: 3294\n","Average actions of items: 258.78985727300335\n","The number of inters: 852195\n","The sparsity of the dataset: 98.06281322904924%\n","Remain Fields: ['user_id', 'item_id', 'timestamp']\n","12 Dec 08:43 INFO [Training]: train_batch_size = [2048] train_neg_sample_args: [{'distribution': 'none', 'sample_num': 'none', 'alpha': 'none', 'dynamic': False, 'candidate_num': 0}]\n","[Training]: train_batch_size = [2048] train_neg_sample_args: [{'distribution': 'none', 'sample_num': 'none', 'alpha': 'none', 'dynamic': False, 'candidate_num': 0}]\n","12 Dec 08:43 INFO [Evaluation]: eval_batch_size = [4096] eval_args: [{'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}]\n","[Evaluation]: eval_batch_size = [4096] eval_args: [{'split': {'RS': [9, 0, 1]}, 'order': 'TO', 'group_by': 'user', 'mode': {'valid': 'full', 'test': 'full'}}]\n","12 Dec 08:43 INFO NextItNet(\n"," (item_embedding): Embedding(3294, 64, padding_idx=0)\n"," (residual_blocks): Sequential(\n"," (0): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(2, 2))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," (1): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(4, 4))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(8, 8))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," (2): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(2, 2))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," (3): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(4, 4))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(8, 8))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," (4): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(2, 2))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," (5): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(4, 4))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(8, 8))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," (6): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(2, 2))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," (7): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(4, 4))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(8, 8))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," (8): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(2, 2))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," (9): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(4, 4))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(8, 8))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," )\n"," (final_layer): Linear(in_features=64, out_features=64, bias=True)\n"," (loss_fct): CrossEntropyLoss()\n"," (reg_loss): RegLoss()\n",")\n","Trainable parameters: 464576\n","NextItNet(\n"," (item_embedding): Embedding(3294, 64, padding_idx=0)\n"," (residual_blocks): Sequential(\n"," (0): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(2, 2))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," (1): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(4, 4))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(8, 8))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," (2): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(2, 2))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," (3): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(4, 4))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(8, 8))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," (4): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(2, 2))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," (5): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(4, 4))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(8, 8))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," (6): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(2, 2))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," (7): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(4, 4))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(8, 8))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," (8): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(2, 2))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," (9): ResidualBlock_b(\n"," (conv1): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(4, 4))\n"," (ln1): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," (conv2): Conv2d(64, 64, kernel_size=(1, 3), stride=(1, 1), dilation=(8, 8))\n"," (ln2): LayerNorm((64,), eps=1e-08, elementwise_affine=True)\n"," )\n"," )\n"," (final_layer): Linear(in_features=64, out_features=64, bias=True)\n"," (loss_fct): CrossEntropyLoss()\n"," (reg_loss): RegLoss()\n",")\n","Trainable parameters: 464576\n","12 Dec 08:43 INFO FLOPs: 12423360.0\n","FLOPs: 12423360.0\n","12 Dec 10:08 INFO epoch 0 training [time: 5095.82s, train loss: 2732.6105]\n","epoch 0 training [time: 5095.82s, train loss: 2732.6105]\n","12 Dec 10:08 INFO Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","12 Dec 11:33 INFO epoch 1 training [time: 5097.32s, train loss: 2601.4325]\n","epoch 1 training [time: 5097.32s, train loss: 2601.4325]\n","12 Dec 11:33 INFO Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","12 Dec 13:31 INFO epoch 2 training [time: 7077.48s, train loss: 2554.3704]\n","epoch 2 training [time: 7077.48s, train loss: 2554.3704]\n","12 Dec 13:31 INFO Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","12 Dec 14:39 INFO epoch 3 training [time: 4117.24s, train loss: 2529.2335]\n","epoch 3 training [time: 4117.24s, train loss: 2529.2335]\n","12 Dec 14:39 INFO Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","12 Dec 17:57 INFO epoch 4 training [time: 11838.39s, train loss: 2512.5584]\n","epoch 4 training [time: 11838.39s, train loss: 2512.5584]\n","12 Dec 17:57 INFO Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","12 Dec 18:42 INFO epoch 5 training [time: 2724.19s, train loss: 2497.9890]\n","epoch 5 training [time: 2724.19s, train loss: 2497.9890]\n","12 Dec 18:42 INFO Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","12 Dec 19:30 INFO epoch 6 training [time: 2856.86s, train loss: 2485.4469]\n","epoch 6 training [time: 2856.86s, train loss: 2485.4469]\n","12 Dec 19:30 INFO Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","12 Dec 20:13 INFO epoch 7 training [time: 2609.22s, train loss: 2474.9533]\n","epoch 7 training [time: 2609.22s, train loss: 2474.9533]\n","12 Dec 20:13 INFO Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","12 Dec 21:18 INFO epoch 8 training [time: 3904.76s, train loss: 2465.3467]\n","epoch 8 training [time: 3904.76s, train loss: 2465.3467]\n","12 Dec 21:18 INFO Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","12 Dec 22:13 INFO epoch 9 training [time: 3272.21s, train loss: 2456.8602]\n","epoch 9 training [time: 3272.21s, train loss: 2456.8602]\n","12 Dec 22:13 INFO Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","Saving current: saved/NextItNet-Dec-12-2023_08-43-30.pth\n","12 Dec 22:13 INFO Loading model structure and parameters from saved/NextItNet-Dec-12-2023_08-43-30.pth\n","Loading model structure and parameters from saved/NextItNet-Dec-12-2023_08-43-30.pth\n","12 Dec 22:16 INFO The running environment of this training is as follows:\n","+-------------+---------------+\n","| Environment | Usage |\n","+=============+===============+\n","| CPU | 11.80 % |\n","+-------------+---------------+\n","| GPU | 0.0 / 0.0 |\n","+-------------+---------------+\n","| Memory | 0.74 G/8.00 G |\n","+-------------+---------------+\n","The running environment of this training is as follows:\n","+-------------+---------------+\n","| Environment | Usage |\n","+=============+===============+\n","| CPU | 11.80 % |\n","+-------------+---------------+\n","| GPU | 0.0 / 0.0 |\n","+-------------+---------------+\n","| Memory | 0.74 G/8.00 G |\n","+-------------+---------------+\n","12 Dec 22:16 INFO best valid : None\n","best valid : None\n","12 Dec 22:16 INFO test result: OrderedDict([('recall@10', 0.0922), ('mrr@10', 0.0329), ('ndcg@10', 0.0466), ('hit@10', 0.0922), ('precision@10', 0.0092)])\n","test result: OrderedDict([('recall@10', 0.0922), ('mrr@10', 0.0329), ('ndcg@10', 0.0466), ('hit@10', 0.0922), ('precision@10', 0.0092)])\n"]},{"name":"stdout","output_type":"stream","text":["It took 814.55 mins\n","{'best_valid_score': -inf, 'valid_score_bigger': True, 'best_valid_result': None, 'test_result': OrderedDict([('recall@10', 0.0922), ('mrr@10', 0.0329), ('ndcg@10', 0.0466), ('hit@10', 0.0922), ('precision@10', 0.0092)])}\n","CPU times: user 1d 24min 58s, sys: 13h 28min 5s, total: 1d 13h 53min 4s\n","Wall time: 1d 8h 36min 2s\n"]}],"source":["%%time\n","model_list = [\"CORE\", \"LightSANs\", \"NextItNet\",] \n","\n","parameter_dict[\"train_neg_sample_args\"] = None\n","\n","for model_name in model_list:\n"," print(f\"running {model_name}...\")\n"," start = time.time()\n"," result = run_recbole(model=model_name, dataset = 'recbox_data', config_dict = parameter_dict)\n"," t = time.time() - start\n"," print(f\"It took {t/60:.2f} mins\")\n"," print(result)"]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.9.13"},"papermill":{"default_parameters":{},"duration":27491.154881,"end_time":"2022-11-28T00:11:27.624787","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2022-11-27T16:33:16.469906","version":"2.3.4"}},"nbformat":4,"nbformat_minor":5}
diff --git a/service/api/views.py b/service/api/views.py
index 24cf4a7f..95178c1e 100644
--- a/service/api/views.py
+++ b/service/api/views.py
@@ -1,20 +1,38 @@
from typing import List
-
-from fastapi import APIRouter, FastAPI, Request
+from fastapi import APIRouter, Depends, FastAPI, Request
from pydantic import BaseModel
-
-from service.api.exceptions import UserNotFoundError
+import dill
+from service.api.exceptions import ModelNotFoundError, UnauthorizedUserError, UserNotFoundError
from service.log import app_logger
+import pandas as pd
+from service.models import recommend_popular
+
+
+# load predictions of dssm model
+dssm_preds = pd.read_csv("dssm_predictions.csv")
+dssm_preds.item_id = dssm_preds.item_id.apply(lambda x: [int(i) for i in x[1:-1].split(", ")])
+
+
+# get popular recommendations
+interactions = pd.read_csv('data/interactions.csv')
+interactions['last_watch_dt'] = pd.to_datetime(interactions['last_watch_dt'])
+interactions.rename(
+ columns={
+ 'last_watch_dt': 'datetime',
+ 'total_dur': 'weight',
+ },
+ inplace=True,
+ )
+popular_recs = recommend_popular(interactions)
+popular_recs_30 = recommend_popular(interactions, days = 30)
class RecoResponse(BaseModel):
user_id: int
items: List[int]
-
router = APIRouter()
-
@router.get(
path="/health",
tags=["Health"],
@@ -23,26 +41,32 @@ async def health() -> str:
return "I am alive"
+
@router.get(
path="/reco/{model_name}/{user_id}",
tags=["Recommendations"],
- response_model=RecoResponse,
+ response_model=RecoResponse
)
async def get_reco(
- request: Request,
- model_name: str,
- user_id: int,
-) -> RecoResponse:
- app_logger.info(f"Request for model: {model_name}, user_id: {user_id}")
-
- # Write your code here
+ request: Request,
+ model_name: str,
+ user_id: int,
+ # token=Depends(bearer)
+ ) -> RecoResponse:
+ # app_logger.info(f"Request for model: {model_name}, user_id: {user_id}")
+ app_logger.info(f"Request for model: {model_name}")
+ app_logger.info(f"Request for user: {user_id}")
if user_id > 10**9:
raise UserNotFoundError(error_message=f"User {user_id} not found")
+
+ if model_name == "DSSM":
+ try:
+ recs_list = dssm_preds[dssm_preds.user_id == user_id].item_id.values[0]
+ except:
+ recs_list = popular_recs_30
- k_recs = request.app.state.k_recs
- reco = list(range(k_recs))
- return RecoResponse(user_id=user_id, items=reco)
+ return RecoResponse(user_id=user_id, items=recs_list)
def add_views(app: FastAPI) -> None:
diff --git a/userknn.py b/userknn.py
new file mode 100644
index 00000000..e7cf55ab
--- /dev/null
+++ b/userknn.py
@@ -0,0 +1,112 @@
+from typing import Dict
+from collections import Counter
+
+import pandas as pd
+import numpy as np
+import scipy as sp
+from implicit.nearest_neighbours import ItemItemRecommender
+
+
+class UserKnn():
+ """Class for fit-perdict UserKNN model
+ based on ItemKNN model from implicit.nearest_neighbours
+ """
+
+ def __init__(self, model: ItemItemRecommender, N_users: int = 50):
+ self.N_users = N_users
+ self.model = model
+ self.is_fitted = False
+
+ def get_mappings(self, train):
+ self.users_inv_mapping = dict(enumerate(train['user_id'].unique()))
+ self.users_mapping = {v: k for k, v in self.users_inv_mapping.items()}
+
+ self.items_inv_mapping = dict(enumerate(train['item_id'].unique()))
+ self.items_mapping = {v: k for k, v in self.items_inv_mapping.items()}
+
+ def get_matrix(self, df: pd.DataFrame,
+ user_col: str = 'user_id',
+ item_col: str = 'item_id',
+ weight_col: str = None,
+ users_mapping: Dict[int, int] = None,
+ items_mapping: Dict[int, int] = None):
+
+ if weight_col:
+ weights = df[weight_col].astype(np.float32)
+ else:
+ weights = np.ones(len(df), dtype=np.float32)
+
+ self.interaction_matrix = sp.sparse.coo_matrix((
+ weights,
+ (
+ df[item_col].map(self.items_mapping.get),
+ df[user_col].map(self.users_mapping.get)
+ )
+ ))
+
+ self.watched = df\
+ .groupby(user_col, as_index=False)\
+ .agg({item_col: list})\
+ .rename(columns={user_col: 'sim_user_id'})
+
+ return self.interaction_matrix
+
+ def idf(self, n: int, x: float):
+ return np.log((1 + n) / (1 + x) + 1)
+
+ def _count_item_idf(self, df: pd.DataFrame):
+ item_cnt = Counter(df['item_id'].values)
+ item_idf = pd.DataFrame.from_dict(item_cnt, orient='index',
+ columns=['doc_freq']).reset_index()
+ item_idf['idf'] = item_idf['doc_freq'].apply(lambda x: self.idf(self.n, x))
+ self.item_idf = item_idf
+
+ def fit(self, train: pd.DataFrame):
+ self.user_knn = self.model
+ self.get_mappings(train)
+ self.weights_matrix = self.get_matrix(train,
+ users_mapping=self.users_mapping,
+ items_mapping=self.items_mapping)
+
+ self.n = train.shape[0]
+ self._count_item_idf(train)
+
+ self.user_knn.fit(self.weights_matrix)
+ self.is_fitted = True
+
+ def _generate_recs_mapper(self, model: ItemItemRecommender, user_mapping: Dict[int, int],
+ user_inv_mapping: Dict[int, int], N: int):
+ def _recs_mapper(user):
+ user_id = self.users_mapping[user]
+ users, sim = model.similar_items(user_id, N=N)
+ return [self.users_inv_mapping[user] for user in users], sim
+ return _recs_mapper
+
+ def predict(self, test: pd.DataFrame, N_recs: int = 10):
+
+ if not self.is_fitted:
+ raise ValueError("Please call fit before predict")
+
+ mapper = self._generate_recs_mapper(
+ model=self.user_knn,
+ user_mapping=self.users_mapping,
+ user_inv_mapping=self.users_inv_mapping,
+ N=self.N_users
+ )
+
+ recs = pd.DataFrame({'user_id': test['user_id'].unique()})
+ recs['sim_user_id'], recs['sim'] = zip(*recs['user_id'].map(mapper))
+ recs = recs.set_index('user_id').apply(pd.Series.explode).reset_index()
+
+ recs = recs[~(recs['user_id'] == recs['sim_user_id'])]\
+ .merge(self.watched, on=['sim_user_id'], how='left')\
+ .explode('item_id')\
+ .sort_values(['user_id', 'sim'], ascending=False)\
+ .drop_duplicates(['user_id', 'item_id'], keep='first')\
+ .merge(self.item_idf, left_on='item_id', right_on='index', how='left')
+
+ recs['score'] = recs['sim'] * recs['idf']
+ recs = recs.sort_values(['user_id', 'score'], ascending=False)
+ recs['rank'] = recs.groupby('user_id').cumcount() + 1
+ return recs[recs['rank'] <= N_recs][['user_id', 'item_id', 'score', 'rank']]
+
\ No newline at end of file