{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Майнор по Анализу Данных, Группа ИАД-2\n", "## Домашнее задание №1: визуализация, k-NN регрессия, кросс-валидация." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "**Общая информация**\n", "\n", "**Срок сдачи:** 15 марта 2017, 23:59 \n", "\n", "При отправлении ДЗ на почту `hse.minor.dm+2@gmail.com` указывайте фамилию в названии файла, а тему письма оформляйте в следующем виде:\n", "** [ИАД-2] *{Фамилия}* *{Имя}* ДЗ*{Номер}* **\n", "\n", "Сопровождайте ваш код изображеними, комментариями и выводами. \n", "Иммейте ввиду, что на некоторые задачи нет единственного верного и полного ответа. Чем больше информации вы сможете извлечь, аргументированных выводов сформулировать, тем лучше.\n", "\n", "Используйте данный Ipython Notebook при оформлении домашнего задания.\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В этом задании мы рассмотрим задачу прогнозирования количества взятых в аренду велосипедов.\n", "\n", "Файл [bike_sharing.csv](https://yadi.sk/d/n8iy_trO3EsUBa) содержит данные о 731 дне работы сервиса по аренде велосипедов. Про каждый день известны:\n", "\n", "* instant: record index\n", "* dteday : date\n", "* season : season (1:springer, 2:summer, 3:fall, 4:winter)\n", "* yr : year (0: 2011, 1:2012)\n", "* mnth : month ( 1 to 12)\n", "* holiday : weather day is holiday or not (extracted from http://dchr.dc.gov/page/holiday-schedule)\n", "- weekday : day of the week\n", "- workingday : if day is neither weekend nor holiday is 1, otherwise is 0.\n", "+ weathersit : \n", "\t- 1: Clear, Few clouds, Partly cloudy, Partly cloudy\n", "\t- 2: Mist + Cloudy, Mist + Broken clouds, Mist + Few clouds, Mist\n", "\t- 3: Light Snow, Light Rain + Thunderstorm + Scattered clouds, Light Rain + Scattered clouds\n", "\t- 4: Heavy Rain + Ice Pallets + Thunderstorm + Mist, Snow + Fog\n", "- temp : Normalized temperature in Celsius from 0 to 100.\n", "- atemp: Normalized feeling temperature in Celsius from 0 to 100.\n", "- hum: Normalized humidity. The values are divided to 100 (max)\n", "- windspeed: Normalized wind speed. The values are divided to 67 (max)\n", "- casual: count of casual users\n", "- registered: count of registered users\n", "- cnt: count of total rental bikes including both casual and registered" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**1. (0.25 балла)** Откройте файл bike_sharing.csv, запишите в датафрейм df и выведите первые пять строк датафрейма." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**2. (1 балл)** Постройте график среднего числа арендованных байков (cnt) по каждому месяцу. Не забудьте подписать оси координат. Убедитесь, что в летние месяцы велосипеды в прокат берут чаще." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "** 3. (0.5 балла)** Постройте диаграмму рассеяния (scatter plot) с осями cnt и atemp, где точки — это объекты. Какой логичный вывод можно сделать по этому графику?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**4. (0.5 балла)** Преобразуйте небинарные категориальные признаки с помощью one-hot кодирования. Сделать это можно с помощью функции pd.get_dummies, указав нужные столбцы в параметре columns. Сколько признаков получилось после кодирования? И какой категориальный признак породил больше всего бинарных?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**5. (0.25 балла)** Удалите столбцы instant, dteday, casual и registered. Предположите, почему мы удаляем эти признаки." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "**6. (0.5 балла)** Далее нашей целевой переменной будет количество арендованных велосипедов (cnt). Поэтому запишите cnt в переменную df_ans и удалите из df. Затем в помощью функции train_test_split из sklearn.model_selection разделите выборку на обучающую и контрольную в отношении 7 к 3, создав переменные X_train, X_test, y_train, y_test.\n", "\n", "Замечание 1: установите random_seed, чтобы генератор псевдослучайных чисел работал всегда одинаково.\n", "\n", "Замечание 2: если в sklearn.model_selection нет функции train_test_split, обновите scikit-learn." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**7. (1 балл)** Обучите алгоритм пяти ближайших соседей с евклидовой метрикой и оцените MAE на контрольной выборке." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**8. (0.5 балла)** Постройте диаграмму рассеяния (scatter plot), по одной оси отметив настоящее число аренд велосипедов, а по другой — предсказанное алгоритмом. Дополнительно на этом графике постройте прямую $y = x$. Чему соотстветствует отклонение от этой прямой?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**9. (1 балл)** Отмасштабируйте признаки, чтобы они принимали значения на $[0, 1]$.\n", "\n", "Это можно сделать собственноручно с помощью операций pandas.\n", "\n", "Иначе — можно использовать MinMaxScaler из sklearn.preprocessing — класс с методами fit и transform. \n", "Для этого:\n", "\n", "* либо соедините X_train и X_test обратно в единый датафрейм, отмасштабируйте и разъедините обратно,\n", "* либо отмасштабируйте df (без ответов) и разделите на обучающую и контрольную выборку, используя тот же random_seed.\n", "\n", "На выходе метода transform получится numpy-массив, который нужно будет превратить обратно в датафрейм." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**10. (0.5 балла)** Вновь обучите алгоритм пяти ближайших соседей с евклидовой метрикой и оцените MAE на контрольной выборке. Почему качество поменялось?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**11. (1.25 балла)** Используя класс KFold из sklearn.model_selection установите с помощью кросс-валидации на пяти фолдах, какой параметр weights лучше с точки зрения mean absolute error. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**12. (2.5 балла)** С помощью GridSearchCV из sklearn.model_selection на пяти фолдах выберите лучшее значение $k$ от 1 до 50. Постройте график MAE на кросс-валидации в зависимости от $k$. \n", "\n", "Замечание: Передать нужную метрику качества для GridSearchCV можно через параметр scoring, но не всё так просто. Из метрики качества нужно сделать «scorer» c помощью функции sklearn.metrics.make_scorer, не забыв указать нужное значение greater_is_better." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**13. (0.25 балла)** Посчитайте качество итоговой модели на контрольной выборке. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [conda root]", "language": "python", "name": "conda-root-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12" }, "nav_menu": {}, "toc": { "navigate_menu": true, "number_sections": false, "sideBar": true, "threshold": 6, "toc_cell": false, "toc_section_display": "block", "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 1 }