{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Майнор по Анализу Данных, Группа ИАД-2\n",
"## 15/02/2017 Линейная регрессия, градиентный спуск"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"%matplotlib inline\n",
"\n",
"plt.style.use('ggplot')\n",
"plt.rcParams['figure.figsize'] = (12,8)\n",
"\n",
"# Для кириллицы на графиках\n",
"font = {'family': 'Verdana',\n",
" 'weight': 'normal'}\n",
"plt.rc('font', **font)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"code_folding": [],
"collapsed": false
},
"outputs": [],
"source": [
"try:\n",
" from ipywidgets import interact, IntSlider, fixed\n",
" from utils import *\n",
"except ImportError:\n",
" print u'Так надо'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Постановка задачи"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Дано описание $n$ объектов по $m$ признакам. Обычно оно выражается в виде матрицы размера $n \\times m$: $X = [x^{(i)}_j]^{i=1\\dots n}_{j=1\\dots m} $.
($x^{(i)}_j$ означает $j$-ый признак $i$-го объекта)
\n",
"Дана **вещественная** зависимая переменная, которая тоже имеет отношение к этим объекам: $y \\in \\mathbb{R}^n$.\n",
"\n",
"Наша задача, выявить **линейную** зависимость между признаками в $X$ и значениями в $y$:\n",
"$$\\hat{y} = X\\beta \\quad \\Leftrightarrow \\quad \\hat{y}^{(i)} = \\beta_0 + \\beta_1x^{(i)}_1 + \\dots$$\n",
"То есть необходимо оценить коэффициенты $\\beta_i$.\n",
"\n",
"В случае линейной регрессии коэффициенты $\\beta_i$ рассчитываются так, чтобы минимизировать сумму квадратов ошибок по всем наблюдениям:\n",
"$$ L(\\beta) = \\frac{1}{2n}(\\hat{y} - y)^{\\top}(\\hat{y} - y) = \\frac{1}{2n}(X\\beta - y)^{\\top}(X\\beta - y) \\rightarrow \\min$$ $$ \\Updownarrow $$ $$ L(\\beta_0,\\beta_1,\\dots) = \\frac{1}{2n}\\sum^{n}_{i=1}(\\hat{y}^{(i)} - y^{(i)})^2 = \\frac{1}{2n}\\sum^{n}_{i=1}(\\beta_0 + \\beta_1x^{(i)}_1 + \\dots - y^{(i)})^2 \\rightarrow \\min $$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Пример: Стоимость автомобиля"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Загрузите [тренировочные данные](http://bit.ly/1gIQs6C) и [тестовые данные](http://bit.ly/IYPHrK) по характеристикам автомобилей Honda Accord. Названия столбцов говорят сами за себя."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"df_train = pd.read_csv('http://bit.ly/1gIQs6C')\n",
"df_test = pd.read_csv('http://bit.ly/IYPHrK')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Выберем одну переменную mileage в качестве предиктора, а переменную price в качестве зависимой переменной"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"
\n", " | price | \n", "mileage | \n", "year | \n", "trim | \n", "engine | \n", "transmission | \n", "
---|---|---|---|---|---|---|
0 | \n", "14995 | \n", "67697 | \n", "2006 | \n", "ex | \n", "4 Cyl | \n", "Manual | \n", "
1 | \n", "11988 | \n", "73738 | \n", "2006 | \n", "ex | \n", "4 Cyl | \n", "Manual | \n", "
2 | \n", "11999 | \n", "80313 | \n", "2006 | \n", "lx | \n", "4 Cyl | \n", "Automatic | \n", "
3 | \n", "12995 | \n", "86096 | \n", "2006 | \n", "lx | \n", "4 Cyl | \n", "Automatic | \n", "
4 | \n", "11333 | \n", "79607 | \n", "2006 | \n", "lx | \n", "4 Cyl | \n", "Automatic | \n", "