Skip to content

Instantly share code, notes, and snippets.

@eteresh
Created November 16, 2018 12:04
Show Gist options
  • Select an option

  • Save eteresh/9f7e269f0cefe620eed42c6cab6460bd to your computer and use it in GitHub Desktop.

Select an option

Save eteresh/9f7e269f0cefe620eed42c6cab6460bd to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib as mpl\n",
"from matplotlib import pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mpl.rcParams['figure.figsize'] = (12, 8)\n",
"mpl.rcParams['font.size'] = 24"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Загрузка данных\n",
"\n",
"Скачайте исходные данные и распакуйте в текущей директории\n",
"\n",
"https://www.kaggle.com/netflix-inc/netflix-prize-data\n",
"\n",
"\n",
"Скачайте скрипт с функциями для загрузки датасета в текущую директорию:\n",
"https://gist.github.com/eteresh/da20bb1861fa0c142c2f059a186cef25"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from utils import get_train_test"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Загрузим матрицы\n",
"Процесс загрузки может занимать достаточно долго, так что для отладочных целей лучше ставить число фильмов равным 200. Но для получения итоговых результатов следует выставить число фильмов равным 5 или 10 тысяч или равным None, то есть загрузить все имеющиеся данные для всех фильмов (потребует ориентировочно около 16 GB оперативки)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%time\n",
"X_tr, X_te = get_train_test(max_films=10**4)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Напишем функцию, вычисляющую метрику MSE для для константного предсказания"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def get_mse(X, pred):\n",
" mse = 0.0\n",
" for x in X:\n",
" x = x.toarray().ravel()\n",
" mse += np.mean((x - pred) ** 2) / X.shape[0]\n",
" return mse"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"zero_prediction_baseline = get_mse(X_te, pred=0.0)\n",
"print(u'MSE для предсказания, равного нулю: {}'.format(zero_prediction_baseline))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"test_baseline = get_mse(X_te, pred=X_tr.mean())\n",
"print(u'MSE для константного предсказания, равного среднему значению оценки на обучении: {}'.format(\n",
" test_baseline))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Напишите функцию, возвращающую матрицы U и V из метода главных компонент\n",
"\n",
"Подсказка: Вам может пригодитья метод svds из библиотеки scipy.sparse.linalg\n",
"Подсказка: Диагональную матрицу D можно не возвращать: можно поэлементно умножить матрицу U и матрицу V на корень из диагональьных элементов матрицы D.\n",
"Тогда произведение новых матриц $U^* \\cdot V^{*T}$ будет равно исходному произведению\n",
"$U \\cdot D \\cdot V^{T}$"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"<may be import scipy lib >\n",
"\n",
"def get_pca_components(X, k):\n",
" u\"\"\"k -- чиcло главных компонент\"\"\"\n",
" <YOUR CODE>\n",
" return U, V"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Напишите функцию, вычисляющую метрику MSE используя матрицы $U^*$ и $ V^{*}$"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def get_mse_pca(X, U, V):\n",
" mse = 0.0\n",
" <YOUR CODE>\n",
" return mse"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Проверьте себя MSE на данных для обучения должен быть в несколько раз меньше, чем бейзлайн со средним предсказанием"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(u'MSE для константного предсказания на обучении: {}'.format(get_mse(X_tr, pred= X_tr.mean())))\n",
"U, V = get_pca_components(X_tr, k=10)\n",
"print(u'MSE для метода главных компонент на обучении: {}'.format(get_mse_pca(X_tr, U, V)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Визуализируем результаты"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from IPython import display\n",
"plt.grid()\n",
"mse_pcas = []\n",
"k_values = []\n",
"for k in list(range(1, 10)) + list(range(10, 30, 2)):\n",
" k_values.append(k)\n",
" U, V = get_pca_components(X_tr, k=k)\n",
" mse_pcas.append(get_mse_pca(X_te, U, V))\n",
" plt.hlines(test_baseline, min(k_values), max(k_values),\n",
" linestyles='dashed', color='r', label='baseline')\n",
" plt.plot(k_values, mse_pcas, 'o-', color='g')\n",
" plt.xlabel(u'Число главных компонент')\n",
" plt.ylabel(u'Mean Squared Error')\n",
" if len(k_values) == 1:\n",
" plt.legend()\n",
" display.clear_output(wait=True)\n",
" display.display(plt.gcf())\n",
"display.clear_output(wait=True)"
]
}
],
"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.6.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment