Проект Иканам гранд рисёрч реализуется Иканам стьюдентс коммьюнити, в частности вот этим парнем по имени Филипп. Если вы нашли ошибку или у вас есть предложения, замечания, деньги, слава или женщины, можно ему написать. Весь говнокод, использованный в исследовании распространяется по лицензии Creative Commons CC BY-NC-SA 4.0. Его можно использовать в любых целях (редактировать, поправлять и брать за основу), кроме коммерческих, но с обязательным упоминанием автора материала. При наличии технической возможности необходимо также указать активную гиперссылку на страницу рисёрча.
Ура! Ура! Ура! Пришло время моделировать. Сразу же хочу сказать, что я не намерен разводить из этой почиташки учебник по анализу данных. Тем не менее, какие-то отдельные вещи мне придётся резюмировать.
Анализ данных — это довольно обширная область знания. Она включает в себя классический матстат, эконометрику, машинное обучение и многие другие более специфические вещи. Анализ данных занимается тем, что ищет ответ на два великих вопроса:
Обычно для поиска ответов на эти два вопроса используются модели. Эти модели оцениваются с помощью собранных данных. На работу каждой модели накладываются какие-то ограничения. Оценивая параметры в моделях, мы хотим, чтобы они обладали тремя свойствами:
В зависимости от того на какой из двух вопросов мы ищем ответ, мы можем приносить некоторые свойства в жертву.
Мы будем решать задачу классификации. А именно, учить модель понимать люди с какими параметрами успешно справляются с первым курсом, а с какими параметрами нет. Если вас интересуют детали, марши смотреть лекции. Либо марш читать другие лекции. Здесь мы поговорим про обучение классификатора совсем кратко.
Перед тем как говорить про классификацию, давайте обсудим что означает термин обучить модель. Пусть у нас есть некоторая переменная $y$, которая принимает действительные значения. Например, пусть это стоимость квартиры. Для каждой кваритиры такая стоимость своя. Эта стоимость складывается из каких-то параметров $x_1, \ldots, x_k$, которые эту квартиру описывают. Это может быть метраж, год постройки здания, тип сдания, район, этаж, криминагенная обстановка в районе и т.д. В нашей выборке для каждой квартиры известна её стоимость, а также измерены все эти характеристики.
Природа явно что-то задумала. Например, то, что стоимость квартиры, $y$, складывается из этих самых параметров. Можно апроксимировать зависимость стоимости от параметров с помощью линейной функции:
$$ y = \beta_1 \cdot x_1 + \beta_2 \cdot x_2 + \ldots + \beta_k \cdot x_k. $$Дело осталось за малым. Понять какие значения принимают неизвестные коэффициенты $\beta_j$. Давайте подберём эти коэффициенты на основе данных, а именно: зададим какую-нибудь функцию ошибки, $L(\hat{y}, y)$, где $\hat{y}$ это прогноз, сделанный по модели, и будем эту функцию минимизировать по параметрам $\beta$.
Чаще всего берут
$$ L(\hat{y},y) = (\hat{y} - y)^2. $$Это довольно логично. Чем больше ошибка совершается, тем больше штраф. Минимизация функционала ошибки по неизвестныи нам параметрам и называется обучением модели:
$$ \sum_{i=1}^n L(\hat{y_i},y_i) \to \min_{\beta} $$В конечном итоге получится уравнение в стиле:
$$ y = 50000 + 2 x_1 - 28 x_2$$Если $x_1$ это метраж квартиры, при каждом дополнительном метре стоимость квартиры (в среднем и при прочих равных) растёт на 2 бакса. Если $x_2$ это какой-нибудь индекс криминальности района, то при увеличении этого индекса на единицу (в среднем и при прочих равных) цена падает на 28 баксов. Конечно же реальное уравнение будет намного длиннее, так как факторов будет много. Подставив факторы своей квартиры, можно спрогнозировать её стоимость.
Если от какого-то из параметров цена зависит нелинейно, мы можем включить в модеь логарифм или квадрат этой переменной, либо ещё что-то. Подбор правильного вида включения для каждой объясняющей переменной - искусство. В крайнем случае мы можем выйти за рамки линейных моделей и попробовать оценить деревья, нейросетки или что-то ещё более убойное. Для этого нам понадобится намного больше данных. У нас их мало, поэтому мы останемся в лоне линейных моделей.
Нам придётся прогнозировать дискретную переменную, а не действительную. В отличие от цены, наша переменная закончил/не закончил принимает только два значения. В связи с этим, всё то, что описывалось выше немного модернизируется. В итоге рождается модель, которая называется логистическая регрессия.
Эта модель позволяет прогнозировать вероятность того, что конкретный человек относится к классу $1$. Когда мы знаем вероятность этого события, мы можем сказать: а пусть все, для кого эта вероятность больше $0.5$ или $0.8$ или любого другого числа, относятся к классу $1$. Правильный порог для принятия решения выбирается в зависимости от специфики задачи и прогнозной силы получившейся модели. Об этом мы поговорим ниже.
Обычно выборку делят на две части: тренировочную и тестовую. На тренировочной выборке модель обучают, на тестовой проверяют её работоспособность. Дело в том, что если чрезмерно сильно усложнить модель, она вместо того, чтобы выделить из данных какие-то особенности, присущие природе в общем случае, может запомнить тренировочную выборку и начать выдавать на ней безупречные прогнозы. Ясное дело, что на тестовой выборке, модель будет творить фигню. Такая ситуация называется переобучением.
Обратно. Если на мы обучили модель на тренировочной выборке, получили для неё какую-то прогнозную способность, а после попытались применить её на тесте и получили примерно такую же прогнозную способность, судя по всему, мы нашли какую-то закономерность, а не переобучились.
Если отрезать от тренировочной выборки тестовую случайно, то результат может оказаться неустойчивым к разбиению. Мало ли нам посчастливилось по особенному разрубить выборку и получить модель с высоким качеством, которое будет невоспроизводимо при любом другом разрубании. В таком случе оценка работы модели окажется смещена.
Чтобы предотвратить возможность такого фэйла и оценить качество работы модели более точно, используют стратегию, получившую название кросс-валидация.
Выборку делят на трэйн и тест несколько раз таким образом, чтобы каждая часть трэйна побывала тестом. На картинке выше выделяется пять разных тестов. Для каждого разбиения на трэйне оценивается модель. На тесте оценивается качество работы модели. Дальше все полученые цифры усредняют. В итоге получается несмещённая оценка работоспособности алгоритма.
Часто делают ещё более весёлое разбиение. Делят выборку на трэйн и тест, а потом трэйн делят на совсем-совсем трэйн и валидационную часть. В итоге модель учат на трэйне и валидации, а тест откладывают, чтобы в самом конце прям совсем-совсем убедиться в качестве моделя. Такая схема дополнительно помогает в борьбе с переобучением. Мы будем обучать модель на данных за 2012-2015 годы и тестировать её на данных за 2016 год. На данных за 2017 год мы будем прогнозировать.
Итак, представим себе, что мы сотворили оптимизационное чудо и у нас появилась модель. Она умеет прогнозировать. Встаёт вопрос: а как проверить её качество. Для проверки качества моделей существуют метрики.
Самой очевидной и самой неиспользуемой метрикой является accuracy, доля правильных ответов. В задачах с неравными классами эта метрика особенно бесполезна. Например, в нашем случае мы знаем, что две трети людей закончат эконом. Если мы поставим для всех потенциальных студентов единицы, то у модели будет довольно высокий accuracy, а именно две трети. При этом, наша модель не будет обладать никакой предсказательной силой. Второй недостаток accuracy - она одинаково учитывает разные ошибки.
Например, в задаче кредитного скоринга, то есть в задаче принятия решения относительно выдачи кредита, сравниваются две модели. При использовании первой модели кредит будет выдан 100 клиентам, 80 из которых его вернут. Во второй модели, более консервативной, кредит был выдан только 50 клиентам, причем вернули его в 48 случаях. То, какая из двух моделей лучше, зависит от того, цена какой из ошибок выше: не дать кредит клиенту, который мог бы его вернуть, или выдать кредит клиенту, который его не вернет. Таким образом, нужны дополнительные метрики качества, которые учитывают цены той или иной ошибки.
Обычно вместо accuracy используют другую пару метрик: точность (precision) и полноту (recall). Эти метрики позволяют учитывать разные цены ошибок. Строят эти метрики с помощью матрицы ошибок (confusion matrix).
Пусть наша модель спрогнозировала для каких-то объектов единички, для каких-то нули. В итоге мы можем построить для неё следующую матрицу:
По столбцам отложены прогнозы, по строкам истина. Наш классификатор совершает ошибку двух видов: False Negative (FN), нижний левый квадрат и False Positive (FP), верхний правый квадрат. В первом случае мы предсказали ноль и ошиблись. Во втором мы предсказали единицу и ошиблись.
В правом нижнем квадрате находятся True Positive, в верхнем левом True Negative. Тут мы угадали.
Наши две метрики могут быть рассчитаны по следующим формулам:
$$ precision = \frac{TP}{TP + FP} $$$$ recall = \frac{TP}{TP + FN} $$Precision это доля объектов, которые классификатор назвал положительными и угадал. В нашем случае это $91\%$. Эта метрика описывает способность алгоритма отличать заданный класс от других классов.
Recall показывает какую долю объектов положительного класса из всех объектов положительного класса нашёл алгоритм, то есть насколько полно мы ищем. Метрика демонстрирует способность алгоритма обноруживать класс вообще. В нашем случае это $38\%$.
Эти две метрики, в отличие от accuracy не зависят от соотношения классов. На практике часто приходится искать баланс между ними. Обычно мы прогнозируем вероятность. В случае задачи о выдаче кредитов, которую мы рассмотрели выше, строится прогноз, что человек вернёт кредит. Мы можем сказать, что если вероятность того, что человек вернёт кредит больше $0.5$, он надёжный и имеет метку $1$. В то же самое время мы можем взять в качестве порога любую другую вероятность, например $0.8$. Выбор порога для отсечения будет влиять на $precision$ и $recall$.
Мы можем посчитать, что для первой модели $precission = 0.8$, $recall = 0.8$. Для второй модели $precission = 0.96$, $recall = 0.48$. Вторая модель более точно определяет кто из клиентов вернёт кредит, но при этом делает она это в ущерб полноте.
Вопрос состоит в том чего бы нам больше хотелось: выдать мало кредитов при высокой точности возврата или выдать много кредитов, но при большем риске. Мы можем перебрать значения порога от $0$ до $1$ и получить фигуру, которая называется $precision-recall$ кривая. Принять решение о пороге можно с её помощью.
Вспомните про то, что мы творили в самом начале рисёрча с лайками и лайкпостами. Лайкпосты это аналог полноты. Лайки аналог точности. При желании точность и полноту можно объединить в единую метрику, f-меру.
Все вышеперечисленные метрики зависят от того, какое значение порога мы зафиксировали для отсечения единичек. Нам бы хотелось, чтобы от порога ничего не зависело и метрика качества была более универсальной. Одним из способов добиться такой универсальности является поиск площади под precision-recall кривой. Чем она выпуклее, тем большей точности можно добиться при большой полноте. К сожалению, precision-recall кривая чувствительна к дисбалансу классов.
Другим, похожим способом определить качество никак не привязываясь к порогу, является ROC-кривая. Она строится в координатах
$$\left(\frac{FP}{FP + TN}; \frac{TP}{TP + FN} \right).$$Такие координаты позволяют сделать метрику устойчивой к дисбалансу классов. Постепенно рассматриваются разные значения порога, для них строится матрица ошибок и на основе этой матрицы на графике отмечается точка. В итоге получается ROC-кривая, которая обычно выглядит как-то так:
Площадь под такой кривой называется ROC-AUC. Она имеет прикольную интерпретацию. Это вероятность того, что если были выбраны случайный положительный и отрицательный объекты, положительный объект получит оценку вероятности того, что он положительный, выше, чем отрицательный. Да, это очень жёстое предложение, но его можно понять, если постараться.
ROC-AUC принимает значение от $0.5$ до $1$. Чем кривая выпуклее, тем круче. Подытожим всё вышесказаное описанием незатейливого алгоритма наших действий:
Пусть мы хотим знать какие именно переменные увеличивают наши шансы закончить эконом и насколько сильно. Предположим, что мы оценили модель только по баллам ЕГЭ и по наличию олимпиады. Коэффицент перед переменной, отвечающей за наличие олимпиады получился довольно большим. Он равен $42$.
Означает ли это, что при наличии олимпиады, мои шансы закончить эконом возрастают пропорционально этому коэффициенту? Заметьте, я не говорю, что вероятность закончить эконом увеличивается на 42 процентных пункта, потому что мы оцениваем логистическую регрессию. В такой модели интерпретация коэффициентов устроена более сложным образом. Значение коэффициента $\hat \beta$ интерпретируется, как величина изменения шансов (смотри 2 том Носко, страницу 205) либо 7 неделю лекций Бориса Борисовича, а лучше и то и то.
Так вот, означат ли это, что мои шансы закончить эконом растут пропорционально 42? Нет, не означает. Почему? Потому что вероятность закончить первый курс, в равной степени как и способность написать олимпиаду или хорошо сдать ЕГЭ, зависят от такой ненаблюдаемой переменной, как уровень умственных способностей. Эта переменная, в нашей ситуации оказалась в ошибке. В конечном счёте, из-за её пропуска возникает корреляция регрессора и ошибки, оценки коэффициентов оказываются смещёнными и несостоятельными, а сама по себе эта ситуация, называется эндогенностью.
Из-за эндогенности оценки коэффициентов оказываются смещенными и несостоятельными. Они ни в коей мере не отражают реальность. В связи с этим мы ничерта не можем сказать о влиянии олимпиады на шансы закончить эконом. Для того, чтобы сделать это, нужно добавить в модель какие-то инструментальные переменные, которые будут нести в себе информацию об уровне умственных способностей человека.
В нашем случае, за создание таких переменных отвечает социальная сеть. Мы наблюдаем за тем, на какие паблики подписывается человек, что он пишет у себя в профиле и так далее. Это позволяет собрать какую-то информацию о его складе ума, характере и других, одному процессу порождения данных ведомых, скрытых от нас характеристиках. В конечном счёте, когда мы добавим в модель эти переменные, мы вынесем ненаблюдаемый эффект из ошибки, корреляция между ошибкой и регрессором исчезнет и оценки в модели получатся состоятельными.
Предположим, что оценка коэффициента после всех этих манипуляций, оказалась равна $5$. Если никаких других источников эндогенности не осталось,и, при этом, объём данных был довольно большим, мы, дейтвительно можем сказать, что наличие олимпиды увеличивает шансы человека закончить эконом пропроционально 5. Конечно же, при условии, если коэффициент оказывается значим.
Мы боролись за интерпретацию коэффициента перед переменной, отвечающей за олимпиаду и хотели узнать насколько это важно. Можно сказать, что наша борьба закончилась успешно.
Но ведь кроме олимпиады у нас в модели куча других переменных! Например, в ней есть переменная, которая отвечает за наличие подписки на мдк. И она равна $-3000$. Означает ли это, что если я прямо сейчас отпишусь от мдк, мои шансы закончить эконом так сильно вырастут?
Если вы знали об исследовании и отписались из-за этого, ничего у вас не вырсатет, потому что изменилась не причина, а следствие. Если вы не знали об исследовании, в вашей жизни произошло какое-то переосмысление ценностей, вы поняли, что там тупые мемы, а ботать очень круто, то да. Ваши шансы закончить эконом возрастут. Возрастут не потому что вы отписались от мдк, а потому что что-то произошло с причиной того, что вы на него были подписаны. Произошло что-то с ненаблюдаемой переменной, которая несёт информацию о вашем характере.
Ещё раз, ещё раз, в первой ситуации, просто-напросто, испортился информационный канал, за который отвечала инструментальная переменная "паблик мдк", во втором случае изменилась истиная информация и наш информационный канал в виде инструментальной переменной сообшил нам про это. Интерпретировать коэффициенты в логистической регрессии можно так и только так.
Пусть мы хотим уметь прогнозировать. Предположим, что мы оценили регрессию из предыдущего пункта. Она хороша, коэффициенты хороши, всё значимо, на улице светит солнце, все гипотезы проверены, вода в ручьях кристально чистая, эндогенности нет и во всём мире мир. Можно ли использовать её для прогнозирования? Конечно да. Ура, расходимся!
Секундочку. А что если я скажу вам, что ваши прогнозы можно улучшить? Можно показать, что ошибка прогноза складывается из квадрата смещения, дисперсии и неустранимой ошибки.
Если с последней мы ничего сделать не можем, то на первые два слагаемых мы можем как-то влиять. В идеале, конечно же, хотелось бы свести на нет оба этих слагаемых (левый верхний квадрат рисунка), но на практике часто приходится балансировать между смещенными и нестабильными оценками (высокая дисперсия).
Как правило, при увеличении сложности модели (например, при увеличении количества свободных параметров) увеличивается дисперсия (разброс) оценки, но уменьшается смещение. Из-за того что тренировочный набор данных полностью запоминается вместо обобщения, небольшие изменения приводят к неожиданным результатам (переобучение). Если же модель слабая, то она не состоянии выучить закономерность, в результате выучивается что-то другое, смещенное относительно правильного решения.
Наша святая всех святых, Теорема Гаусса-Маркова как раз утверждает, что МНК-оценка параметров линейной модели является самой лучшей в классе несмещенных линейных оценок, то есть с наименьшей дисперсией. Можно показать, что прогнозы, которые делает модель практически всегда можно улучшить. Делается это за счёт того, что мы увеличиваем смещение, тем самым уменьшая разброс.
В этом случае, мы приносим в жертву интерпретацию. Оценки коэффициентов перестают отражать реальность.Единственное, на что в такой ситуации можно обращать внимание, это знак коэффициента и его размер. Чем больше абсолютное значение коэффициента, тем более важна эта переменная. Но какой именно вклад она вносит, мы не знаем.
Более подробно, со всеми формулами и выводами, об этом (и не только об этом) можно почитать в двух отлично сделанных статьях на хабре.
Ещё раз, ещё раз. В контексте прогнозов нам плевать на интерпретируемость коэффициентов. На этом краткий экскурс в анализ данных заканчивается. Начинаются результаты.
Итак, попробуем построить модель на основе вообще всего. По науке мы должны закинуть в модель абсолютно все переменные, которые у нас есть, а дальше потихонечку, проверяя гипотезы, выкидывать незначимые переменные. При проверке гипотез будем использовать тест отношения правдоподобий. Уровень значимости $10\%$. В качестве альтернативной процедуры отбора будем использовать расчудесную Lasso-модель. Эта модель зануляет все лишние коэффициенты сама.
Напомню, что когда мы будем делать селекцию переменных с помощью проверки гипотез, мы будем бороться ещё и за интерпретацию значений коэффициентов в модели. В случае селекции по Lasso, мы будем бороться именно за прогнозы и оценки коэффициентов будут смещены.
Даныне | Селекция | Переменных до | Переменных после | Roc-Auc_val | Roc-Auc_test |
---|---|---|---|---|---|
Все+паб_20 | lasso | 92 | 11 | 0.60 | 0.65 |
Все+паб_20 | hypotesis | 92 | 13 | 0.78 | 0.60 |
Все+паб_30 | lasso | 102 | 11 | 0.60 | 0.65 |
Все+паб_30 | hypotesis | 102 | 102 |
Оценивание модели с разбиением пабликов на 20 категорий даёт нам следующий значимы результат:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 1.3287 0.3441 3.861 0.000113 ***
ochko.zaochka 1.7032 0.7173 2.374 0.017574 *
profile_folowers_cnt -7.8420 2.5224 -3.109 0.001877 **
profile_albums_cnt 15.8210 3.9039 4.053 5.07e-05 ***
photo_like_mean 0.9388 0.2586 3.630 0.000283 ***
wall_can_comment 1.6523 0.3895 4.242 2.22e-05 ***
wall_emoji_mean -0.3447 0.1827 -1.887 0.059209 .
wall_post_android_cnt -5.7946 1.8019 -3.216 0.001300 **
wall_post_ipad_cnt 5.4728 2.5702 2.129 0.033226 *
wall_repost_mean -1.1068 0.4235 -2.613 0.008968 **
wall_video_cnt -2.7091 1.5631 -1.733 0.083060 .
wall_video_mean 0.3896 0.2118 1.839 0.065880 .
X20pub_clust_9 -59.2349 23.8545 -2.483 0.013022 *
X20pub_clust_11 -6.4483 2.5048 -2.574 0.010042 *
Посмотрим на знаки перед переменными и подумаем насколько они логичны. Имейте в виду, что вся моя дальнейшая интерпретация основана ... ни на чём. Переменная ochko-zaochka
принимает значений 1, если человек не попал на бюджет, но при этом оставались физтеховские места, и ему предложили вариант с обучением на очно-заочном бюджетном режиме с последующим переводом на очный режим. Обычно такой режим обучения предлагают замотивированным студентам, которые хотели бы к нам попасть, но при этом бояться попасть на платку. Положительный знак перед этой переменной не удивляет.
Остальные переменные мы пихали в модель в рамках кампании по борьбе с эндогенностью. Все они должны были стать инструментами для некоторых скрытых от наших глаз качеств людей. В связи с этим, они должны интерпретироваться именно в этом ключе. Легче всего проинтерретировать последние две переменные. В девятой теме находятся мусорные группы вроде инстахлама, он мне позвонит и т.п. Большой отрицательный коэффициент перед этой темой вполне логичен. В 11 теме находится музыка. Чем больший удельный вес в интересах человека занимает музыка, тем меньше его шансы закончить эконом.
Отрицательный знак перед profile_folowers_cnt
говорит о том, что большое число подписчиков уменьшеает шансы закончить. Возможно, эта переменная стала индекатором для тп, которые скидывают людей в подписки. Переменные wall_repost_mean
и wall_video_cnt
отвечают за среднее число репостов на стене и число видео на стене. Скорее всего, они отлавдивают похожие эффекты. Не очень понятно почему общее число видео действует отрицательно, а среднее положительно. Переменная wall_can_comment
принимает значение $1$, если человек открыл стену для комментов. Скорее всего, переменная является инструментом для способности человека идти на контак с окружающими. Возможно, что люди с закрытой стеной более замкнуты. Слабозначимая переменная wall_emoji_mean
говорит о том, что чем чаще в своих постах человек используем эмодзи, тем меньше его шансы закончить. Наверное, переменная отлавливает инфантильность.
Положительный знак перед profile_albums_cnt
, отвечающей за число албомов, довольно сильно удивлет. Не очень очевидно для какой латентной переменной число албомов могло бы быть инструментом. Точно также удивляет положительный знак перед photo_like_mean
. Переменные wall_post_android_cnt
и wall_post_ipad_cnt
также являются довольно странными. Если верить оценённой модели, люди, которые пользуются андроидом, обладают меньшими шансами окончить факультет.
Откровенно говоря, часть переменных оставляет желать лучшего и интерпретируется довольно бредово. Самое главное, на что стоит обратить внимание, это незначимость переменной ege_diff
. Баллы по ЕГЭ никак не помогают предсказать отчисление. Если попробовать оценить модель на 102 переменных, алгоритм без регуляризатора отказывается сходиться. Lasso-регрессия занулила все коэффициенты перед темами. Модели вышли одинаковыми.
Главная проблема для нашей модели заключается в том, что в нашей тренировчной выборке лежит всего лишь 278 наблюдений. В среднем на оценку одного коэффицента тратится 3 наблюдения. Это катастрофически мало. Даже несмотря на то, что мы выкинули из рассмотрения категориальные фичи и всякий мусор, фичей всё ещё очень много. Чтобы решить эту проблему, нам нужно подкопить данных. К сожалению, мы не можем ждать ещё несколько лет, поэтому придётся попробовать добиться более высоких прогнозных свойств для нашей модели всеми правдами и неправдами.
Итак, в нашем распоряжении оказалось слишком много переменных. Попробуем построить модели отдельно по каждой из наших табличек.
Даныне | Селекция | Переменных до | Переменных после | Roc-Auc_val | Roc-Auc_test |
---|---|---|---|---|---|
Приказы | lasso | 7 | 0 | ||
Приказы | hypothesis | 7 | 1 | 0.59 | 0.68 |
+ходит | lasso | 9 | 3 | ||
+ходит | hypothesis | 9 | 3 | ||
профили | lasso | 25 | 19 | 0.65 | 0.62 |
профили | hypothesis | 25 | 1 | 0.60 | 0.64 |
фотки | lasso | 8 | 4 | 0.56 | 0.27 |
фотки | hypothesis | 8 | 1 | 0.55 | 0.58 |
стена | lasso | 32 | 9 | 0.67 | 0.53 |
стена | hypothesis | 32 | 3 | 0.60 | 0.69 |
паблики 20 | lasso | 20 | 1 | 0.62 | 0.66 |
паблики 20 | hypothesis | 20 | 2 | 0.60 | 0.51 |
паблики 30 | lasso | 30 | 5 | 0.62 | 0.61 |
паблики 30 | hypothesis | 30 | 2 | 0.54 | 0.68 |
ege_diff
. На валидации качество у модели получается довольно низким. На рисунке ниже нарисованы соответствуюшие этой модели ROC-кривые.hodit_para
и hodit_tusa
, при селекции в модели остаются только они. Обе переменные имеют положительный знак и дают модели довольно большую прогнозную силу. ROC-AUC начинает зашкаливать.При отборе переменных по Lasso в модели самыми важными оказываются тусы и пары. Возникает ощущение, что только по этим двум переменным можно строить качественные прогнозы. Однако если мы сделаем это, мы переобучим нашу модель под мнение асессоров, которые оценивали посещаемость пар и тусовок. Напомню, что эти переменные проставлялись уже после отчислений и несут в себе довольно много информации из будущего. Точно такое же высокое качество модели мы получим, если добавим в модель переменные profile_econom_yes
и profile_ranepa_yes
. Эти две переменные принимали значение 1, если человек указал в профиле, что учится на экономи или в ранепушке. Напомню, что когда мы качали данные об этом из профилей, мы надеялись поймать информацию о том скрывает ли человек от окружающих своё место обучения. Вместо этого мы поймали информацию из будущего. Сначала человека отчислили, после он удалил из своейго профиля. Точно также высокая важность будет у переменной, которая принимает значение $1$, если я есть у человека в друзьях. У меня в друзьях есть только достойные люди. Все эти переменные мы не будем в дальнейшем использовать, а полученые высокие значения ROC-AUC зачеркнём.
Оценивание модели только по профилям даёт неплохой результат. Отбор фичей последовательной проверкой гипотез даёт нам на выход только одну переменную, profile_albums_cnt
. Отбор фичей по Lasso ведёт себя в 19 раз либеральнее. Прогнозная сила за данными в профилях определённо есть.
Строительство модели только по фоткам не приводит ни к чему хорошему. Прогнозная сила чуть менее, чем отсуствует. Модель по стенам даёт небольшую прогнозную силу.
Строительство модели по 20 тематикам даёт довольно интересный результат. Lasso-модель не зануляет только шестую тему, которую можно проинтерпретировать как образовательную. Проверка гипотез выдаёт нам две переменные. Первая отвечает за музыку и имеет отрицательный знак, вторая за искусство и кино. Перед ней положительный знак. Строительство модели по 30 тематикам выдаёт что-то похожее.
Всегда будем брать для строительства моделей приказы. В довесок к приказам будем добавлять то, что перечислено в колонке данные. Фотки не будем добавлять никогда.
Даныне | Селекция | Переменных до | Переменных после | Roc-Auc_val | Roc-Auc_test |
---|---|---|---|---|---|
Проф+Паб20 | lasso | 53 | 33 | 0.57 | 0.61 |
Проф+Паб20 | hypotesis | 53 | 5 | 0.71 | 0.60 |
Проф+Паб30 | lasso | 63 | 38 | 0.57 | 0.64 |
Проф+Паб30 | hypotesis | 63 | 3 | 0.72 | 0.54 |
Проф+стена | lasso | 64 | 10 | 0.60 | 0.66 |
Проф+стена | hypotesis | 64 | 7 | 0.74 | 0.51 |
стена + Паб20 | lasso | 59 | 3 | 0.60 | 0.65 |
стена + Паб20 | hypotesis | 59 | 7 | 0.71 | 0.66 |
Проф+стена+паб20 | lasso | 84 | 10 | 0.60 | 0.66 |
Проф+стена+паб20 | hypotesis | 84 | 12 | 0.76 | 0.55 |
Проф+стена+паб30 | lasso | 94 | 10 | 0.60 | 0.66 |
Проф+стена+паб30 | hypotesis | 94 | 21 | 0.78 | 0.51 |
Вот такие вот оценки. Настала минутка откровенности. Мы попробовали несколько разных моделей. Напомню, что самый плохой ROC-AUC, который бывает - это $0.5$. Для нас лучшие показатели, которых удалось достичь на тесте, находятся в районе $0.65-0.66$. Это не очень хорошо, но и не плохо. Изначально я ставил в качетсве цели получить Roc-Auc на уровне $0.7$. Этой цели мне не удалось достичь.
Выбираем для прогнозов лучшую модель. Будем выбирать её так, чтобы и на валидации и на тесте был высокий ROC-AUC. Больше всего из этого большого списка мне нравится модель, построенная по профилям и стенам с отбором фичей по Lasso. Отлично. Посмотрим на то какие признаки вошли в модель с самыми хорошими прогнозами и сравним ради интереса полученые, смещённые коэффициенты с полной моделью без смещения.
ege_diff 0.23
profile_group_hide_dummy 0.01
wall_comment_max 0.04
wall_comment_mean 0.40
wall_like_max -0.05
wall_photo_mean -0.02
wall_repost_mean -0.09
wall_slowpok_hour_max 0.06
wall_video_mean 0.03
Большая часть этих переменных оказалась в полной модели незначимой. Смещение так смещение. Скорее всего, если бы данных было больше, существенная часть переменных в моделях бы пересекалась. При этом значения коэффициентов довольно сильно отличались бы друг от друга. Отдельно стоит отметить, что большая часть моделей, переменные в которые мы отбирали последовательным тестированием гипотез, переобучилась под трэйн. На нём модели стабильно показывают высокие результаты, которые на тесте довольно сильно падают.
Наша модель обладает на тесте ROC-AUC в районе $0.65$. Это означает, что прогнозная сила у модели есть, но средненькая. Построим precision-recall кривую и подумаем о том какую задачу мы хотели бы решать. PR-кривая для поиска ноликов, то есть людей, которые не смогут закончить первый курс, выглядит следующим образом:
Видно, что если мы хотим добиться высокой полноты, высокой точности нам не видать. Нам бы хотелось находить плохих студентов с высокой точностью. Оптимальным кажется порог равный $0.4$ с хвостиком. При таком выборе мы получи следущую матрицу ошибок:
При этом точность для идентификации обоих классов будет в районе $80\%$. Первый класс будет искаться с высокой полнотой, второй с низкой.
метка | precision | recall | f1-score |
---|---|---|---|
0 | 0.82 | 0.45 | 0.58 |
1 | 0.81 | 0.96 | 0.88 |
среднее | 0.81 | 0.81 | 0.79 |
При этом два человека мы неправильно отчислим, $11$ человек мы неверно оставим. Наверное, лучше оставить плохого человека, чем выгнать хорошего. Наша модель будет гуманной.
В конечном счёте мы спрогнозируем отчисление $11$ человек, для которых вероятность закончить эконом ниже $0.4$ и окажеся правы в $80\%$ случаев. То есть, если сделать денежную ставку сразу же на все 11 человек, мы окажемся в выигрыше.
Прогнозы для текущего набора можно найти в конце почиташки. Насколько близко это окажется к правде мы увидим ближе к посвяту. Нам же осталось обсудить два коротеньких сюжета.
В коде, кроме линейных моделей и всяких процедур отбора с весёлыми картинками, можно найти несколько дополнительных приблуд:
TSNE (t-stochastic neiyborhood embending) - это метод визуализации многомерных данных на двумерной плоскости. Грубо говоря, если мы находимся в трёхмерном пространстве, наши данные в нём зависают как облако из шариков. Мы можем скрепить эти шарики между собой пружинами. Сами по себе пружины мы можем отрегулировать. После мы можем взять и как следует шибануть это облоко из шариков об стену, чтобы все шарики расплющились. Пружины начнут стягиваться-растягиваться и в тоге точки зафиксируются на стене в виде двумерного облака. Мы перешли из трёхмерного пространства в двухмерное. Конечно же пружины сделали над нашими изначальными фичами какие-то нелинейные преобразования.
Обычно такую штуку используют для того, чтобы посмотреть а есть ли вообще в данных хоть что-нибудь. Для нашей ситуации tSNE превращает эконом в какое-то безумное тотемное животное, похожее на скорпиона.
Я не знаю что может значить этот хвост, но в него попадают 64 человека, 4 из которых не смогли справиться с первым курсом. Если вам интересен полный список людей, то можете перейти в код и прочекать его. Отдельно стоит отметить, что прогнозная сила нашей модели, построенной выше, не ограничивается отрубанием этого хвоста. Строительство модели по двум tsne-регрессорам даёт качество более низкое, нежели наша итоговая модель.
К сожалению. я забыл зафиксировать сиды. Поэтому в коде TSNE выглядит в виде не менее красивого русала - морского конька.
Тринадцатым пунктом идут прогнозы. Символично и мистично. Ещё раз, ещё раз. Модель специфицирована для поиска низа рейтинга. Отдельно стоит отметить, что топовые вероятности закончить 1 курс, модель присваивает очень эпично, совершая довольно серьёзную ошибку.
Отдельно хочу обратиться к 2017 году. Вы помните историю про кривую Филиппса? Я надеюсь, что вы хорошо её усвоили.
имя | прогноз вероятности закончить 1 курс | закончил ли в реальности |
---|---|---|
Соломник Михаил | 0.98 | 0.0 |
Куркин Николай | 0.98 | 1.0 |
Скибенко Светлана | 0.94 | 0.0 |
Дзюба Артём | 0.9 | 0.0 |
Харитонова Марина | 0.87 | 1.0 |
Радионова Елена | 0.85 | 1.0 |
Ахметзянова Дарья | 0.83 | 0.0 |
Говоркова Дарья | 0.82 | 1.0 |
Коннова Анастасия | 0.78 | 1.0 |
Петайкина Анастасия | 0.76 | 1.0 |
Дугарова Александра | 0.74 | 1.0 |
Ахмедова Вазифа | 0.72 | 1.0 |
Селищева Анна | 0.7 | 1.0 |
Решетов Владислав | 0.69 | 1.0 |
Лупарев Евгений | 0.69 | 1.0 |
Ядав Лолита | 0.66 | 1.0 |
Гаджиева Аида | 0.64 | 1.0 |
Кусегенов Данислам | 0.63 | 1.0 |
Лушина Валерия | 0.62 | 1.0 |
Зайцева Анна | 0.61 | 1.0 |
Воеводина Алена | 0.61 | 0.0 |
Рединская Наталья | 0.6 | 1.0 |
Комов Михаил | 0.59 | 1.0 |
Самойлова Катя | 0.58 | 1.0 |
Корчагин Максим | 0.58 | 1.0 |
Жуковская Оксана | 0.57 | 1.0 |
Шкредов Михаил | 0.57 | 0.0 |
Потапова Мария | 0.57 | 1.0 |
Сакович Дарья | 0.54 | 1.0 |
Китькова Ирина | 0.54 | 1.0 |
Добрынина Екатерина | 0.53 | 1.0 |
Кириленко Светлана | 0.52 | 1.0 |
Морозова Виолетта | 0.52 | 1.0 |
Ахметова Зиля | 0.52 | 1.0 |
Семёнова Алёна | 0.51 | 1.0 |
Ваганова Даша | 0.51 | 0.0 |
Ломоносов Даниил | 0.5 | 1.0 |
Мидюкин Максим | 0.5 | 1.0 |
Челядинова Екатерина | 0.5 | 1.0 |
Корнилов Валера | 0.5 | 0.0 |
Аскольская Надежда | 0.5 | 1.0 |
Сидоров Александр | 0.49 | 1.0 |
Даминова Рита | 0.49 | 1.0 |
Руч Камила | 0.49 | 1.0 |
Ефремова Ольга | 0.48 | 1.0 |
Филимонова Мария | 0.48 | 0.0 |
Буханов Денис | 0.48 | 1.0 |
Зиновьева Анастасия | 0.46 | 1.0 |
Завизион Мария | 0.46 | 0.0 |
Горячева Олеся | 0.45 | 0.0 |
Хуснутдинова Валерия | 0.45 | 1.0 |
Королькевич Глеб | 0.45 | 1.0 |
Ипатьев Кирилл | 0.44 | 1.0 |
Аксенова Анна | 0.44 | 1.0 |
Шакиров Роман | 0.44 | 1.0 |
Гвоздева Елизавета | 0.43 | 1.0 |
Горила Феличия | 0.43 | 1.0 |
Щербаков Александр | 0.42 | 1.0 |
Пихеева Валерия | 0.4 | 1.0 |
Васильченко Алина | 0.38 | 1.0 |
Хачатрян Гарик | 0.37 | 0.0 |
Муцольгова Зарема | 0.36 | 0.0 |
Полякова Александра | 0.36 | 0.0 |
Гулиева Эсет | 0.36 | 0.0 |
Абасин Хасан | 0.36 | 0.0 |
Миронов Пётр | 0.34 | 0.0 |
Казарян Диана | 0.32 | 0.0 |
Гулиева Залина | 0.31 | 0.0 |
Самотканова Виктория | 0.31 | 1.0 |
Зыкин Иван | 0.3 | 0.0 |
имя | прогноз вероятности закончить 1 курс |
---|---|
Дарсигов Микаил | 0.95 |
Хитрова Анастасия | 0.9 |
Волкова Анна | 0.87 |
Кидло Ирина | 0.84 |
Маинскова Татьяна | 0.79 |
Потапов Владислав | 0.78 |
Бурмина Светлана | 0.77 |
Анискина Валерия | 0.72 |
Гришкина Екатерина | 0.71 |
Козлов Глеб | 0.71 |
Третьяков Дмитрий | 0.66 |
Владимирова Ольга | 0.65 |
Даниловская Виктория | 0.63 |
Хупения Нино | 0.63 |
Петрунькова Вероника | 0.63 |
Никишов Вадим | 0.63 |
Шагимарданова Диана | 0.62 |
Сарафанюк Юрий | 0.62 |
Зорькина Анастасия | 0.58 |
Наумов Николай | 0.58 |
Синицын Сергей | 0.57 |
Габузова Елена | 0.56 |
Юрова Маргарита | 0.55 |
Курилкина Юлия | 0.54 |
Майорова Ксения | 0.52 |
Алиев Самир | 0.51 |
Евстафьев Сергей | 0.5 |
Горячёва Полина | 0.49 |
Никишина Елена | 0.49 |
Водякова Анна | 0.49 |
Беляков Юрий | 0.49 |
Еремеев Максим | 0.49 |
Потапова Ульяна | 0.48 |
Степанова Анна | 0.48 |
Мантрова Екатерина | 0.48 |
Илюшин Станислав | 0.47 |
Щепилова Ирина | 0.47 |
Хегедуш Инна | 0.47 |
Гайнулина Алина | 0.47 |
Малащенко Наталия | 0.46 |
Нуртдинов Камиль | 0.46 |
Васильева Ксения | 0.46 |
Леохина Александра | 0.45 |
Башкирова Ксения | 0.45 |
Ляхова Наталия | 0.45 |
Семедова Наиля | 0.45 |
Сороковнина Светлана | 0.45 |
Зельч Елизавета | 0.45 |
Шишкин Никита | 0.45 |
Кичаев Денис | 0.44 |
Манченко Антонина | 0.44 |
Синицина Анастасия | 0.43 |
Барановская Диана | 0.43 |
Евсеева Елизавета | 0.42 |
Макагонова Татьяна | 0.41 |
Туркин Артём | 0.41 |
Агаметова Эльвида | 0.4 |
Сорокин Дмитрий | 0.39 |
Кузьмин Иван | 0.39 |
Иноземцева Александра | 0.38 |
Токарева Екатерина | 0.38 |
Шарков Кирилл | 0.37 |
Андреева Виктория | 0.37 |
Пилевец Ольга | 0.36 |
Сединкина Екатерина | 0.34 |
Арсеньев Вячеслав | 0.3 |
Мордасов Владислав | 0.29 |
Буханцев Никита | 0.25 |
Богданов Евгений | 0.25 |
Левин Валерий | 0.23 |