Created
November 16, 2018 12:04
-
-
Save eteresh/9f7e269f0cefe620eed42c6cab6460bd to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "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