{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from fastai import *\n",
"from fastai.collab import *\n",
"from fastai.tabular import *"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Collaborative filtering example"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`collab` models use data in a `DataFrame` of user, items, and ratings."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"user,item,title = 'userId','movieId','title'"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"PosixPath('/home/jhoward/.fastai/data/movie_lens_sample')"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"path = untar_data(URLs.ML_SAMPLE)\n",
"path"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" userId | \n",
" movieId | \n",
" rating | \n",
" timestamp | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 73 | \n",
" 1097 | \n",
" 4.0 | \n",
" 1255504951 | \n",
"
\n",
" \n",
" 1 | \n",
" 561 | \n",
" 924 | \n",
" 3.5 | \n",
" 1172695223 | \n",
"
\n",
" \n",
" 2 | \n",
" 157 | \n",
" 260 | \n",
" 3.5 | \n",
" 1291598691 | \n",
"
\n",
" \n",
" 3 | \n",
" 358 | \n",
" 1210 | \n",
" 5.0 | \n",
" 957481884 | \n",
"
\n",
" \n",
" 4 | \n",
" 130 | \n",
" 316 | \n",
" 2.0 | \n",
" 1138999234 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" userId movieId rating timestamp\n",
"0 73 1097 4.0 1255504951\n",
"1 561 924 3.5 1172695223\n",
"2 157 260 3.5 1291598691\n",
"3 358 1210 5.0 957481884\n",
"4 130 316 2.0 1138999234"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ratings = pd.read_csv(path/'ratings.csv')\n",
"ratings.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That's all we need to create and train a model:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data = CollabDataBunch.from_df(ratings, seed=42)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"y_range = [0,5.5]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"learn = collab_learner(data, n_factors=50, y_range=y_range)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Total time: 00:04\n",
"epoch train_loss valid_loss\n",
"1 1.600185 0.962681 (00:01)\n",
"2 0.851333 0.678732 (00:01)\n",
"3 0.660136 0.666290 (00:01)\n",
"\n"
]
}
],
"source": [
"learn.fit_one_cycle(3, 5e-3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Movielens 100k"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's try with the full Movielens 100k data dataset, available from http://files.grouplens.org/datasets/movielens/ml-100k.zip"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"path=Path('data/ml-100k/')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" userId | \n",
" movieId | \n",
" rating | \n",
" timestamp | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 196 | \n",
" 242 | \n",
" 3 | \n",
" 881250949 | \n",
"
\n",
" \n",
" 1 | \n",
" 186 | \n",
" 302 | \n",
" 3 | \n",
" 891717742 | \n",
"
\n",
" \n",
" 2 | \n",
" 22 | \n",
" 377 | \n",
" 1 | \n",
" 878887116 | \n",
"
\n",
" \n",
" 3 | \n",
" 244 | \n",
" 51 | \n",
" 2 | \n",
" 880606923 | \n",
"
\n",
" \n",
" 4 | \n",
" 166 | \n",
" 346 | \n",
" 1 | \n",
" 886397596 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" userId movieId rating timestamp\n",
"0 196 242 3 881250949\n",
"1 186 302 3 891717742\n",
"2 22 377 1 878887116\n",
"3 244 51 2 880606923\n",
"4 166 346 1 886397596"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ratings = pd.read_csv(path/'u.data', delimiter='\\t', header=None,\n",
" names=[user,item,'rating','timestamp'])\n",
"ratings.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" movieId | \n",
" title | \n",
" date | \n",
" N | \n",
" url | \n",
" g0 | \n",
" g1 | \n",
" g2 | \n",
" g3 | \n",
" g4 | \n",
" ... | \n",
" g9 | \n",
" g10 | \n",
" g11 | \n",
" g12 | \n",
" g13 | \n",
" g14 | \n",
" g15 | \n",
" g16 | \n",
" g17 | \n",
" g18 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" Toy Story (1995) | \n",
" 01-Jan-1995 | \n",
" NaN | \n",
" http://us.imdb.com/M/title-exact?Toy%20Story%2... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 1 | \n",
" 2 | \n",
" GoldenEye (1995) | \n",
" 01-Jan-1995 | \n",
" NaN | \n",
" http://us.imdb.com/M/title-exact?GoldenEye%20(... | \n",
" 0 | \n",
" 1 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2 | \n",
" 3 | \n",
" Four Rooms (1995) | \n",
" 01-Jan-1995 | \n",
" NaN | \n",
" http://us.imdb.com/M/title-exact?Four%20Rooms%... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 3 | \n",
" 4 | \n",
" Get Shorty (1995) | \n",
" 01-Jan-1995 | \n",
" NaN | \n",
" http://us.imdb.com/M/title-exact?Get%20Shorty%... | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 4 | \n",
" 5 | \n",
" Copycat (1995) | \n",
" 01-Jan-1995 | \n",
" NaN | \n",
" http://us.imdb.com/M/title-exact?Copycat%20(1995) | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" ... | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
5 rows × 24 columns
\n",
"
"
],
"text/plain": [
" movieId title date N \\\n",
"0 1 Toy Story (1995) 01-Jan-1995 NaN \n",
"1 2 GoldenEye (1995) 01-Jan-1995 NaN \n",
"2 3 Four Rooms (1995) 01-Jan-1995 NaN \n",
"3 4 Get Shorty (1995) 01-Jan-1995 NaN \n",
"4 5 Copycat (1995) 01-Jan-1995 NaN \n",
"\n",
" url g0 g1 g2 g3 g4 ... \\\n",
"0 http://us.imdb.com/M/title-exact?Toy%20Story%2... 0 0 0 1 1 ... \n",
"1 http://us.imdb.com/M/title-exact?GoldenEye%20(... 0 1 1 0 0 ... \n",
"2 http://us.imdb.com/M/title-exact?Four%20Rooms%... 0 0 0 0 0 ... \n",
"3 http://us.imdb.com/M/title-exact?Get%20Shorty%... 0 1 0 0 0 ... \n",
"4 http://us.imdb.com/M/title-exact?Copycat%20(1995) 0 0 0 0 0 ... \n",
"\n",
" g9 g10 g11 g12 g13 g14 g15 g16 g17 g18 \n",
"0 0 0 0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 1 0 0 \n",
"2 0 0 0 0 0 0 0 1 0 0 \n",
"3 0 0 0 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 1 0 0 \n",
"\n",
"[5 rows x 24 columns]"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"movies = pd.read_csv(path/'u.item', delimiter='|', encoding='latin-1', header=None,\n",
" names=[item, 'title', 'date', 'N', 'url', *[f'g{i}' for i in range(19)]])\n",
"movies.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"100000"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(ratings)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" userId | \n",
" movieId | \n",
" rating | \n",
" timestamp | \n",
" title | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 196 | \n",
" 242 | \n",
" 3 | \n",
" 881250949 | \n",
" Kolya (1996) | \n",
"
\n",
" \n",
" 1 | \n",
" 63 | \n",
" 242 | \n",
" 3 | \n",
" 875747190 | \n",
" Kolya (1996) | \n",
"
\n",
" \n",
" 2 | \n",
" 226 | \n",
" 242 | \n",
" 5 | \n",
" 883888671 | \n",
" Kolya (1996) | \n",
"
\n",
" \n",
" 3 | \n",
" 154 | \n",
" 242 | \n",
" 3 | \n",
" 879138235 | \n",
" Kolya (1996) | \n",
"
\n",
" \n",
" 4 | \n",
" 306 | \n",
" 242 | \n",
" 5 | \n",
" 876503793 | \n",
" Kolya (1996) | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" userId movieId rating timestamp title\n",
"0 196 242 3 881250949 Kolya (1996)\n",
"1 63 242 3 875747190 Kolya (1996)\n",
"2 226 242 5 883888671 Kolya (1996)\n",
"3 154 242 3 879138235 Kolya (1996)\n",
"4 306 242 5 876503793 Kolya (1996)"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rating_movie = ratings.merge(movies[[item, title]])\n",
"rating_movie.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data = CollabDataBunch.from_df(rating_movie, seed=42, pct_val=0.1, item_name=title)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
" \n",
" userId | \n",
" title | \n",
" target | \n",
"
\n",
" \n",
" 588 | \n",
" Twister (1996) | \n",
" 3.0 | \n",
"
\n",
" \n",
" 664 | \n",
" Grifters, The (1990) | \n",
" 4.0 | \n",
"
\n",
" \n",
" 758 | \n",
" Wings of the Dove, The (1997) | \n",
" 4.0 | \n",
"
\n",
" \n",
" 711 | \n",
" Empire Strikes Back, The (1980) | \n",
" 5.0 | \n",
"
\n",
" \n",
" 610 | \n",
" People vs. Larry Flynt, The (1996) | \n",
" 3.0 | \n",
"
\n",
" \n",
" 407 | \n",
" Star Trek: The Wrath of Khan (1982) | \n",
" 4.0 | \n",
"
\n",
" \n",
" 649 | \n",
" Independence Day (ID4) (1996) | \n",
" 2.0 | \n",
"
\n",
" \n",
" 798 | \n",
" Sabrina (1954) | \n",
" 4.0 | \n",
"
\n",
"
\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"data.show_batch()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"y_range = [0,5.5]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"learn = collab_learner(data, n_factors=40, y_range=y_range, wd=1e-1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"