From 1a5491b7422f568824a68ac8634a9c3792a32465 Mon Sep 17 00:00:00 2001 From: Vladimir Nikolaev Date: Mon, 7 May 2018 18:40:56 +0300 Subject: [PATCH] hw6 and fixes --- .../homework-practice-05.ipynb | 6 +- .../homework-practice-06.ipynb | 340 ++++++++++++++++++ README.md | 7 + 3 files changed, 350 insertions(+), 3 deletions(-) create mode 100644 ML17/homeworks-practice/homework-practice-06.ipynb diff --git a/ML17/homeworks-practice/homework-practice-05/homework-practice-05.ipynb b/ML17/homeworks-practice/homework-practice-05/homework-practice-05.ipynb index 769c442..cb5860f 100644 --- a/ML17/homeworks-practice/homework-practice-05/homework-practice-05.ipynb +++ b/ML17/homeworks-practice/homework-practice-05/homework-practice-05.ipynb @@ -9,7 +9,7 @@ } }, "source": [ - "## Машинное обучение, ВМК МГУ\n", + "# Машинное обучение, ВМК МГУ\n", "\n", "## Практическое задание 5 \n", "\n", @@ -18,7 +18,7 @@ "\n", "Мягкий дедлайн: 23:59MSK 20 мая (за каждый день просрочки снимается 1 балл)\n", "\n", - "Жесткий дедлайн: 23:59MSK 27 мая." + "Жесткий дедлайн: 23:59MSK 30 мая." ] }, { @@ -49,7 +49,7 @@ "\n", "\n", "### Формат сдачи\n", - "Для сдачи задания переименуйте получившийся файл *.ipynb в соответствии со следующим форматом: homework-practice-05-Username.ipynb, где Username — ваша фамилия и имя на латинице именно в таком порядке (например, homework-practice-02-IvanovIvan.ipynb). \n", + "Для сдачи задания переименуйте получившийся файл *.ipynb в соответствии со следующим форматом: homework-practice-05-Username.ipynb, где Username — ваша фамилия и имя на латинице именно в таком порядке (например, homework-practice-05-IvanovIvan.ipynb). \n", "\n", "Далее отправьте этот файл на ml.cmc.msu@gmail.com\n", "\n", diff --git a/ML17/homeworks-practice/homework-practice-06.ipynb b/ML17/homeworks-practice/homework-practice-06.ipynb new file mode 100644 index 0000000..8a3122c --- /dev/null +++ b/ML17/homeworks-practice/homework-practice-06.ipynb @@ -0,0 +1,340 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Машинное обучение, ВМК МГУ\n", + "\n", + "## Практическое задание 6\n", + "\n", + "### Общая информация\n", + "Дата выдачи: 7.05.2018 \n", + "\n", + "Жесткий дедлайн: 23:59MSK 30.05.2018" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### О задании\n", + "\n", + "Задание состоит из двух независимых разделов, посвященных частичному обучению и поиску аномалий. Эти разделы можно выполнять в любом порядке. В каждом разделе вам предложено несколько задач, которые, в свою очередь, делятся на пункты. Баллы даются за выполнение пунктов, причем в рамках одной задачи пункты, как правило, зависимы (нельзя решить следующий, не решив предыдущего). Пункты могут быть двух видов: написать скрипт или ответить на вопросы. Задачи в рамках одного раздела рекомендуется решать в том порядке, в котором они даны в задании. В разных задачах используются разные наборы данных, все наборы взяты из репозитория UCI или из соревнования с платформы kaggle. \n", + "\n", + "Задание является исследовательским — нужно будет многократно делать выводы о применимости алгоритмов в той или иной ситуации, а также придумывать способы добиться лучшего качества с помощью этих алгоритмов. Для получения отличной оценки достаточно грамотно провести все указанные в задании эксперименты и сделать их анализ. Для получения максимальной оценки и бонусных баллов потребуется пустить в ход фантазию и придумать новые подходы к задачам.\n", + "\n", + "\n", + "### Оценивание и штрафы\n", + "Каждая из задач имеет определенную «стоимость» (указана в скобках около задачи). Максимально допустимая оценка за работу — 10 баллов.\n", + "\n", + "В задании много пунктов про анализ результатов и описание выводов — оценка за них будет выставляться на основе полноты и логичности описаний, что сложно полностью формализовать. Старайтесь описывать решения как можно подробнее и понятнее.\n", + "\n", + "Сдавать задание после указанного срока сдачи нельзя. При выставлении неполного балла за задание в связи с наличием ошибок на усмотрение проверяющего предусмотрена возможность исправить работу на указанных в ответном письме условиях.\n", + "\n", + "Задание выполняется самостоятельно. «Похожие» решения считаются плагиатом и все задействованные студенты (в том числе те, у кого списали) не могут получить за него больше 0 баллов (подробнее о плагиате см. на странице курса). Если вы нашли решение какого-то из заданий (или его часть) в открытом источнике, необходимо указать ссылку на этот источник в отдельном блоке в конце вашей работы (скорее всего вы будете не единственным, кто это нашел, поэтому чтобы исключить подозрение в плагиате, необходима ссылка на источник).\n", + "\n", + "Неэффективная реализация кода может негативно отразиться на оценке.\n", + "\n", + "\n", + "### Формат сдачи\n", + "Для сдачи задания переименуйте получившийся файл *.ipynb в соответствии со следующим форматом: homework-practice-06-Username.ipynb, где Username — ваша фамилия и имя на латинице именно в таком порядке (например, homework-practice-06-IvanovIvan.ipynb). \n", + "\n", + "Далее отправьте этот файл на ml.cmc.msu@gmail.com\n", + "\n", + "Для удобства проверки самостоятельно посчитайте свою максимальную оценку (исходя из набора решенных задач) и укажите ниже." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**ФИО:** ...\n", + "\n", + "**Оценка:** ..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Часть 1. Действительно ли помогают неразмеченные данные?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Частичное обучение (semi-supervised learning) предлагает методы работы с выборками, в которых лишь для части объектов известны ответы. В статьях утверждается, что добавление неразмеченных данных позволяет повысить качество работы — давайте выясним, так ли это!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Наверное, проще всего добыть неразмеченные примеры, если речь идёт о работе с текстами или изображениями. Остановимся на текстах.\n", + "\n", + "Будем работать с данными из соревнования Predict closed questions on Stack Overflow: https://www.kaggle.com/c/predict-closed-questions-on-stack-overflow/data\n", + "\n", + "Нас будет интересовать файл train-sample.csv — загрузите его. Будем решать бинарную задачу: отнесём объект к классу 1, если `OpenStatus == 1`, и к классу 0 иначе." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Задание 1. (0 баллов)**\n", + "\n", + "Загрузите данные и подготовьте выборку. В качестве признаков возьмите TF-IDF по BodyMarkdown с `min_df=10`; про целевую переменную написано выше. Выделите тестовую выборку из 5000 объектов." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Нас будут интересовать качество (AUC-ROC) в четырёх следующих постановках:\n", + "1. Модель обучается только на размеченных данных.\n", + "2. Модель обучается на размеченных и неразмеченных данных, причём неразмеченная часть не пересекается с тестовой выборкой.\n", + "3. Модель обучается на размеченных и неразмеченных данных, причём неразмеченная часть совпадает с тестовой выборкой.\n", + "4. Модель обучается на размеченных и неразмеченных данных, причём неразмеченная часть включает в себя тестовую выборку." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "В качестве инструмента для обучения моделей возьмём svmlin: http://vikas.sindhwani.org/svmlin.html\n", + "\n", + "Нас будут интересовать режимы `-A 1` (для постановки 1) и `-A 2` (для остальных постановок)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Задание 2. (2 балла)**\n", + "\n", + "Проведите указанные выше эксперименты для разных размеров размеченной части обучающей выборки (от 10 до 10000 объектов). Размер неразмеченной части, отличной от теста, в постановках 2 и 4 считайте равным 5000. Не забудьте подбирать оптимальные значения коэффициентов регуляризации (`-W, -U`), а также обязательно выберите правильное значение для параметра `-R`. Постройте графики зависимости качества от размера обучающей выборки. Сделайте выводы:\n", + "1. Позволяют ли методы частичного обучения улучшить качество классификации? При какой постановке задачи?\n", + "2. При каких размерах размеченной выборки методы частичного обучения эффективны?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Задание 3. (3 балла)**\n", + "\n", + "Конечно, странно делать выводы о применимости частичного обучения на основе лишь одного трансдуктивного SVM. Проведите эксперименты и сделайте выводы, аналогичные предыдущему пункту, и для других методов:\n", + "1. Любой из методов пакета `sklearn.semi_supervised`. (1 балл)\n", + "2. Реализуйте самостоятельно метод self-training и проведите эксперименты, взяв в нём в качестве базовой модели какой-нибудь линейный классификатор (1 балл) и градиентный бустинг (1 балл). При использовании градиентного бустинга имеет смысл предварительно понизить размерность выборки — например, применив PCA к матрице с TF-IDF-признаками, либо же посчитав новые признаки на основе представлений слов." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Задание 4. (бонусное)**\n", + "\n", + "Время почувствовать себя исследователем! За каждый пункт указано максимальное количество бонусных баллов — они будут выставляться субъективно в зависимости от мнения преподавателей по поводу значимости сделанных улучшений.\n", + "\n", + "1. Добейтесь большего прироста от использования частичного обучения на датасете Stack Overflow. Можно по-другому готовить данные, использовать любые алгоритмы, менять дизайн эксперимента. (до 3 бонусных баллов)\n", + "2. Найдите датасет, не связанный с текстами, на котором частичное обучение даёт заметный прирост, и продемонстрируйте это. (до 2 бонусных баллов)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Часть 2. Что такое аномалии и как их искать?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Методы обнаружения аномалий, как следует из названия, позволяют находить необычные объекты в выборке. Но что такое \"необычные\" и совпадает ли это определение у разных методов?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Начнём с поиска аномалий в текстах: научимся отличать вопросы о программировании от текстов из 20newsgroups про религию." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Задание 5. (0 баллов)**\n", + "\n", + "Подготовьте данные: в обучающую выборку возьмите 20 тысяч текстов из датасета предыдущей части, а тестовую выборку сформируйте из 10 тысяч текстов со Stack Overflow и 100 текстов из класса soc.religion.christian датасета 20newsgroups (очень пригодится функция `fetch_20newsgroups(categories=['soc.religion.christian'])`). Тексты про программирование будем считать обычными, а тексты про религию — аномальными." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Задание 6. (1 балла)**\n", + "\n", + "Проверьте качество выделения аномалий (precision и recall на тестовой выборке, если считать аномалии положительным классов, а обычные тексты — отрицательным) для трёх методов sklearn: IsolationForest, OneClassSVM и LocalOutlierFactor. В качестве признаков используйте TF-IDF, где словарь и IDF строятся по обучающей выборке. Не забудьте подобрать гиперпараметры. Запишите качество для лучшей версии каждого из методов." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Задание 7. (2 балла)**\n", + "\n", + "Скорее всего, качество оказалось не на высоте. Разберитесь, в чём дело:\n", + "* посмотрите на тексты, которые выделяются как аномальные, а также на слова, соответствующие их ненулевым признакам\n", + "* изучите признаки аномальных текстов\n", + "* посмотрите на тексты из обучающей выборки, ближайшие к аномальным; действительно ли они похожи по признакам?\n", + "\n", + "Сделайте выводы и придумайте, как избавиться от этих проблем. Предложите варианты двух типов: (1) в рамках этих же признаков (но которые, возможно, будут считаться по другим наборам данных) и методов и (2) без ограничений на изменения. Реализуйте эти варианты и проверьте их качество.\n", + "\n", + "Сформулируйте рекомендации по использованию трёх стандартных методов (IsolationForest, OneClassSVM и LocalOutlierFactor) и специализированных подходов для обнаружения аномалий в текстах.\n", + "\n", + "За решение, которое даёт близкое к идеальному качество (и при этом не подогнано конкретно под эти 100 аномальных текстов), можно получить до 2 бонусных баллов." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Посмотрим на методы обнаружения аномалий на более простых данных — уж на табличном датасете с 19 признаками всё должно работать как надо!\n", + "\n", + "Скачайте данные о стоимости домов: https://www.kaggle.com/harlfoxem/housesalesprediction/data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Задание 8. (0 баллов)**\n", + "\n", + "Подготовьте выборку: удалите столбцы `['id', 'date', 'price', 'zipcode']`, сформируйте обучающую и тестовую выборки по 10 тысяч домов.\n", + "\n", + "Добавьте в тестовую выборку 10 новых объектов, в каждом из которых испорчен ровно один признак — например, это может быть дом из другого полушария, из далёкого прошлого или будущего, с площадью в целый штат или с таким числом этажей, что самолётам неплохо бы его облетать стороной." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Задание 9. (2 балла)**\n", + "\n", + "Примените три стандартных метода (IsolationForest, OneClassSVM и LocalOutlierFactor) для поиска аномалий в этих данных, запишите их качество (как и раньше, это precision и recall). Проведите исследование:\n", + "\n", + "1. Нарисуйте распределения всех признаков и обозначьте на этих распределениях объекты, которые каждым методом признаны аномальными. Можно ли сказать, что каждый метод обращает внимание на выбросы по определённым признакам?\n", + "2. Как обосновать случаи, в которых методы не считают аномальными некоторые из добавленных нами 10 объектов?\n", + "3. Сформулируйте рекомендации по использованию трёх стандартных методов к данному датасету.\n", + "\n", + "Также найдите качество работы метода, который считает объект аномальным, если он попадает в хвост одномерного распределения хотя бы по одному признаку." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "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.14" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/README.md b/README.md index 3c83589..e59cce6 100644 --- a/README.md +++ b/README.md @@ -116,3 +116,10 @@ Жёсткий дедлайн: 30.05.2018 23:59 MSK + +### Задание 6: + +[Условие](ML17/homeworks-practice/homework-practice-06.ipynb) + +Жёсткий дедлайн: 30.05.2018 23:59 MSK +