{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Код, приведенный в ячейке ниже, разбивает датасет на обучающую и тестовую выборки. Изменять это разбиение запрещено. Удалять объекты из тестовой выборки также запрещено. После разбиения к обучающим данным можно применять произвольные преобразования. (не забудьте применить существенные преобразования также и к тестовым данным, например, нормализацию). Для оценки качества вашего алгоритма необходимо использовать предложенную функцию compute_score, в которую нужно передать предсказанные ответы на тестовых данных. Обратите внимание, что чтобы не получить переобученный алгоритм рекомендуется не использовать тестовые данные для подбора гиперпараметров. Для этого стоит использовать кросс-валидацию на обучающей выборке, а на тестовых данных оценивать только финальное качество. Под гиперпараметрами понимается не только параметры конкретных алгоритмов, но и сам выбор алгоритмов для решения задачи. То есть, идеальный вариант -- это если вы разобъете обучающую выборку на две части и будете использовать одну из частей как тестовую выборку (либо будете все измерять кросс-валидацией), а на настоящей тестовой выборке измерите качество только в самом конце и один раз. Такой подход будет наилучшим образом отражать реальную ситуацию, возникающую при применении алгоритмов машинного обучения в жизни.\n", "\n", "Если вам удобнее проводить преобразования со всеми данными вместе (это может быть удобно, например, для преобразования признаков методом one-hot encoding, так как в тестовых данных может быть меньше различных признаков, чем в обучающих), вы можете сделать преобразование с переменной data, но потом разбить данные на обучающую и тестовую выборки тем же образом. Например:\n", "\n", " categorical_features = ['age', 'Medu', 'Fedu', 'Mjob', 'Fjob', 'reason', 'guardian', 'traveltime',\n", " 'studytime', 'failures', 'famrel', 'freetime', 'goout', 'health', 'school',\n", " 'sex', 'address', 'famsize', 'Pstatus', 'schoolsup', 'famsup', 'paid',\n", " 'activities', 'nursery', 'higher', 'internet', 'romantic']\n", " for feature in categorical_features:\n", " data[feature] = data[feature].astype('category')\n", " data = pd.get_dummies(data)\n", "\n", " train_data = data.drop(indices)\n", " test_data = data.iloc[indices]\n", " test_data = test_data.drop(['Dalc', 'Walc'], axis=1)\n", "\n", "Для успешной сдачи задания необходимо получить предсказание, качество которого будет <= 0.45 (для этого не нужно делать ничего сложного, достаточно попробовать применить преобразования, которые мы обсуждали на семинаре).\n", "\n", "По результатам выполнения задания необходимо отправить на групповую почту ipython notebook, в котором будет содержаться код, необходимый для воспроизведения экспериментов, а также сделанные выводы о том, почему именно выбранный вами алгоритм и преобразования данных дают хорошее качество в данной задаче. Также для сдачи задания необходимо попробовать применить хотя бы два различных алгоритма машинного обучения и сравнить их качество.\n", "\n", "Точные критерии оценивания будут оговорены позже. Скорее всего те, кто справятся со всеми необходимыми требованиями получат максимальный балл, но также будет возможность получить весомое количество бонусных баллов, если вы получите очень хорошее качество, либо проведете обширное исследование задачи.\n", "\n", "Дедлайн сдачи задания: 24.05.2016 23:59.\n", "\n", "Штраф за просрочку 0.2 балла в день." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "from sklearn.cross_validation import train_test_split\n", "\n", "data = pd.read_csv('student-mat.csv', sep=';')\n", "np.random.seed(42)\n", "indices = np.random.choice(data.shape[0], data.shape[0] // 5, replace=False)\n", "\n", "train_data = data.drop(indices)\n", "test_data = data.iloc[indices]\n", "test_labels = np.round(np.array((test_data['Dalc'] * 5 + test_data['Walc'] * 2) / 7)).astype(np.int)\n", "test_data = test_data.drop(['Dalc', 'Walc'], axis=1)\n", "\n", "def compute_score(labels):\n", " return np.sum(np.abs(np.round(labels) - test_labels)) / labels.shape[0]" ] } ], "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.4.3+" } }, "nbformat": 4, "nbformat_minor": 0 }