{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Machine Learning\n", "\n", "*Екатерина Лобачева / Илья Щуров / Сергей Сметанин *\n", "\n", "*Совместный бакалавриат НИУ ВШЭ и РЭШ, 2016-17 учебный год*\n", "\n", "[Страница курса](http://math-info.hse.ru/2016-17/Machine_Learning)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Домашнее задание №ML2\n", "\n", "Чтобы выполнить работу, скачайте настоящий ipynb-файл, откройте его в *Jupyter Notebook*, впишите решения в оставленные для этого ячейки (при необходимости можно добавлять новые ячейки), приводя полный работающий код, а также все необходимые пояснения и ответы (для этого нужно использовать markdown-ячейки). Вы можете вставлять формулы с помощью TeX-разметки в markdown-ячейки. После выполнения работы необходимо вытащить ipynb-файл из Jupyter (например, с помощью *File → Download as… → IPython Notebook*) и загрузить его на my.NES." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 1\n", "Рассмотрим линейную регрессию с матрицей признаков $X=(x_i^j)$, $i$ — номер столбца (номер признака), $i=1,\\ldots, m$, $j$ — номер строки (номер наблюдения или объекта), $j=1,\\ldots, n$ и вектором ответов $y=(y^1, \\ldots, y^n)$. Запишем квадратичную функцию потерь с $L_2$-регуляризацией:\n", "\n", "$$Q(w) = \\|Xw - y \\|^2 + \\alpha \\|w\\|^2,$$\n", "где $w$ — вектор весов, $\\|a\\| = \\sqrt{a_1^2 + \\ldots + a_m^2}$ — стандартная $L_2$-норма вектора, $\\alpha$ — некоторая константа.\n", "\n", "\n", "1. Найти градиент $\\frac{\\partial Q(w)}{\\partial w}$. Записать его в матричном виде.\n", "2. Реализовать алгоритм градиентного спуска для данной функции потерь. Написать функцию `GD(X, y, max_epoch=1000, eta=0.001, alpha=0.0, tol=0.0001)` со следующими свойствами:\n", " - Функция вычисляет оптимальный вектор весов $w$ с помощью градиентного спуска.\n", " - Начальное значение вектора весов: нулевой вектор.\n", " - Процесс оптимизации останавливается, если сделано `max_epoch * n` шагов (одна эпоха соответствует количеству шагов, равному общему числу наблюдений $n$), либо если значение функции потерь на очередном шаге изменилось менее, чем на `tol`.\n", " - Коэффициент перед градиентом равен `eta/n`. (Это нужно, чтобы средний шаг был таким же, как в стохастическом градиентном спуске, см. задачу 2.)\n", " - `alpha` — коэффициент перед регуляризатором.\n", " - Функция возвращает пару `(w, L)`, где `w` — вектор весов на последнем шаге, `L` — список, состоящий из значений функции потерь в начале каждой эпохи.\n", " \n", "В качестве источника вдохновения ниже приводится функция `GD_nonreg`, решающая аналогичную задачу без регуляризатора. Вы можете модифицировать её в соответствии с условиями задачи." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def GD_nonreg(X, y, max_epoch=1000, eta=0.001, tol=0.0001):\n", " \n", " # Используя X и y, определим функцию потерь и её градиент:\n", " def Q(w):\n", " S = X @ w - y\n", " return S.T @ S\n", " \n", " def DQ(w):\n", " return 2 * (X.T @ X @ w - X.T @ y)\n", " \n", " n, m = X.shape\n", " # n — число строк в матрице X (число наблюдений), \n", " # m — число столбцов (число признаков)\n", " \n", " w_prev = np.array([0] * m)\n", " L = [Q(w_prev)]\n", " \n", " for epoch in range(max_epoch):\n", " for j in range(n):\n", " w_next = w_prev - eta * DQ(w_prev)\n", " if abs(Q(w_next) - Q(w_prev)) < tol:\n", " return w_next, L\n", " w_prev = w_next\n", " L.append(Q(w_next, alpha))\n", " return w_next, L" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Впишите решение сюда (при необходимости, создайте дополнительные ячейки ниже этой)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 2\n", "Запишем функцию потерь из предыдущей задачи в виде:\n", "\n", "$$Q(w) = \\sum_{j=1}^n Q_j(w),$$\n", "где $Q_j(w)$ — ошибка на $j$-м наблюдении:\n", "\n", "$$Q_j(w) = ( \\langle x^j, w\\rangle - y^j)^2 + \\frac{\\alpha}{n} \\|w\\|^2.$$\n", "Здесь угловыми скобками обозначается стандартное скалярное произведение.\n", "\n", "Реализовать алгоритм *стохастического градиентного спуска* для этой функции потерь. Его идея состоит в том, чтобы вместо градиента функции $Q(w)$ на каждом шаге использовать градиент функции $Q_j(w)$ для некоторого наблюдения $j$, выбираемого случайным образом. На практике делают так. Сначала перемешивают наблюдения (выбирают на них случайный порядок). На первых $n$ шагах алгоритма для вычисления $Q_j$ последовательно перебирают все наблюдения (в соответствии с выбранным случайным порядком). Этот промежуток называется *первой эпохой*. Затем снова перемешивают все наблюдения (выбирают новый случайный порядок — наступает *вторая эпоха*) и на следующих $n$ шагах снова последовательно перебирают все наблюдения (в соответствии с новым случайным порядком). И так далее. \n", "\n", "Более формально:\n", "\n", "Выберем случайную перестановку на множестве номеров наблюдений, то есть взаимно однозначную функцию $\\pi_1\\colon \\{1, \\ldots, n\\} \\to \\{1, \\ldots, n\\}$. (Иными словами, перенумеруем наблюдения случайным образом.) На первых $n$ шагах алгоритма будем вместо градиента функции $Q(w)$ использовать градиент функции $Q_{\\pi_1(j)}(w)$, где $j=1,\\ldots, n$ — номер шага. Затем выберем другую случайную перестановку $\\pi_2$ и на следующих $n$ шагах алгоритма будем использовать градиент функции $Q_{\\pi_2(j)}$, где $j$ — номер шага от начала второй эпохи. И так далее.\n", "\n", "Написать функцию `SGD(X, y, max_epoch=1000, eta=0.001, alpha=0.0, decrease_eta=True)` со следующими свойствами:\n", "\n", "- Функция вычисляет оптимальный вектор весов $w$ с помощью стохастического градиентного спуска.\n", "- Начальное значение вектора весов: нулевой вектор.\n", "- Процесс оптимизации останавливается, если прошло `max_epoch` эпох.\n", "- Коэффициент перед градиентом равен `eta`, если `decrease_eta==False`, и равен `eta/epoch_number` в противном случае, где `epoch_number` — номер эпохи.\n", "- `alpha` — коэффициент перед регуляризатором.\n", "- Функция возвращает пару `(w, L)`, где `w` — вектор весов на последнем шаге, `L` — список, состоящий из значений функции потерь в начале каждой эпохи.\n", " \n", "**Подсказка:** Вы можете использовать функцию `shuffle` из модуля `random` или [sklearn.utils.shuffle](http://scikit-learn.org/stable/modules/generated/sklearn.utils.shuffle.html) чтобы выбирать случайный порядок наблюдений." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Впишите решение сюда (при необходимости, создайте дополнительные ячейки ниже этой)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сгенерируем данные следующим образом:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from numpy.random import normal, seed\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "seed(42)\n", "# стартовое состояние генератора случайных чисел: для воспроизводимости\n", "\n", "n = 100\n", "# число наблюдений\n", "\n", "x_train = np.linspace(-2, 2, n)\n", "y_train = 3 * x_train + x_train**2 - x_train**3 + normal(scale=0.7, size=n, )\n", "x_test = np.linspace(-2, 2, 300)\n", "y_test = 3 * x_test + x_test**2 - x_test**3\n", "# обычно в качестве тестовой выборки используется какая-то часть данных,\n", "# не попавшая в обучающую выборку, но в данном случае мы знаем\n", "# настоящий ответ и будем использовать его для тестирования\n", "\n", "plt.plot(x_train, y_train, 'o')\n", "plt.plot(x_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Рассмотрим линейную регрессию\n", "$$y = \\beta_1 x + \\beta_2 x^2 + \\ldots + \\beta_d x^d.$$\n", "\n", "1. Применить функции `GD` и `SGD` к решению этой регрессионной задачи для $d=10$, $\\alpha=0.1$.\n", "2. Построить графики предсказанных значений $y$ от $x$ на тестовой выборке для обеих функций.\n", "3. Нарисовать график зависимости значения функции потерь от номера эпохи для каждой из этих двух функций. Использовать список `L`, возвращаемый кажодй из этих функций. Для `SGD` использовать параметр `decrease_eta=False`, на картинке отразить только те эпохи, до которых доходит `GD`.\n", "4. Какой из методов быстрее работает? С помощью `%%timeit` сравните время выполнения `GD` и `SGD`. Функции `SGD` в качестве `max_epoch` передайте длину списка `L`, возвращённого `GD` (чтобы обе функции работали одинаковое число эпох).\n", "\n", "**Примечание.** Вам понадобится сгенерировать матрицы `X_train` и `X_test` с $d$ столбцами, соответствующими степеням $x$. Чтобы регуляризация нормально работала, данные следует нормализовать: разделите каждый столбец на его стандартное отклонение (его можно вычислить с помощью `np.std`). Обычно также вычитают среднее, но мы не будем сейчас этого делать: подобная операция приведёт к появлению константного слагаемого в модели, чего мы сейчас не хотим." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Впишите решение сюда (при необходимости, создайте дополнительные ячейки ниже этой)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 4\n", "\n", "Теперь мы будем использовать регрессионные модели из модуля `sklearn` (scikit-learn). Обучим три модели на основе данных из предыдущей задачи.\n", "\n", "1. Без регуляризации: с помощью `LinearRegression()`.\n", "2. С $L_2$-регуляризацией: с помощью `Ridge()`.\n", "3. С $L_1$-регуляризацией: с помощью `Lasso()`.\n", "\n", "Пример применения этих функций можно найти [в конспектах Евгения Соколова](https://github.com/esokolov/ml-course-hse/blob/master/2016-fall/seminars/sem02-linregr.ipynb)." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from sklearn.linear_model import LinearRegression\n", "from sklearn.linear_model import Ridge\n", "from sklearn.linear_model import Lasso\n", "from sklearn.metrics import mean_squared_error" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. Для $d$ равных 1, 2, 3, 5, 10, 30 обучить каждую из трёх указанных выше линейных моделей.\n", "2. Для каждой из моделей построить графики предсказанных значений $y$, вычисленных по тестовым значениям $x$ (элементы `x_test`), и истинных значений $y$. Попробуйте использовать разные значения параметра $\\alpha$ для моделей с регуляризацией и посмотрите на эффект.\n", "3. Найти среднеквадратичную ошибку (средний квадрат разности между предсказанными и истинными значениями $y$) для тестовой выборки (для вычисления используйте функцию `mean_squared_error`, импортированную выше). \n", "4. Какая из моделей сильнее переобучается? \n", "5. Какой из способов регуляризации позволяет лучше справиться с переобучением? \n", "6. Для $d=30$ попробуйте подобрать оптимальное значение $\\alpha$ для каждого из методов с регуляризацией.\n", "7. Убедитесь, что `Lasso` зануляет некоторые коэффициенты регрессии. (Для вывода списка коэффициентов можно использовать `model.coef_`, где `model` — наша модель.)\n", "7. Какой из методов работает быстрее? (Используйте магическую команду `%%timeit`, чтобы определить время выполнения ячейки.) Как изменится соотношение времени работы, если число наблюдений $n$ увеличить в 10 раз? В 100 раз? (Примечание: `LinearRegression` использует явную формулу для вычисления коэффициентов линейной регрессии, через обращение матрицы. `Ridge` и `Lasso` могут использовать итеративные формулы — градиентный спуск и другие.)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Впишите решение сюда (при необходимости, создайте дополнительные ячейки ниже этой)" ] } ], "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.5.0" }, "toc": { "toc_cell": false, "toc_number_sections": false, "toc_threshold": 6, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 0 }