«4 свадьбы и одни похороны» или линейная регрессия для анализа открытых данных правительства Москвы |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2017-10-23 10:25 Несмотря на множество замечательных материалов по Data Science например, от Open Data Science, я продолжаю собирать объедки с пиршества разума и продолжаю делится с вами, своим опытом по освоению навыков машинного обучения и анализа данных с нуля.
В последних статьях мы рассмотрели пару задачек по классификации, в процессе потом и кровью добывая себе данные, теперь пришло время регрессии. Поскольку ничего светотехнического в этот раз под рукой не оказалось, я решил поскрести по другим сусекам. Помнится, в одной из статей я агитировал читателей посмотреть в сторону отечественных открытых данных. Но поскольку я не барышня из рекламы «кефирчика для пищеварения» или шампуня с лошадиной силой, совесть не позволяла советовать что-либо, не испытав на себе. С чего начать? Конечно с открытых данных правительства РФ, там же ведь целое министерство есть. Мое знакомство с открытыми данными правительства РФ, было примерно, такое же как на иллюстрации к этой статье. Нет ну не то чтобы мне совсем не был интересен реестр Кинозалов города Новый Уренгой или перечень прокатного оборудования катка в Туле, просто для задачи регрессии они не очень подходят. Если порыться думаю и на сайте ОД правительства РФ можно найти, что-то путное, просто не очень легко. Данные Минфина я тоже решил оставить, на потом. Пожалуй, больше всего мне понравились открытые данные правительства Москвы, там я присмотрел пару потенциальных задачек и выбрал в итоге Сведения о регистрации актов гражданского состояния в Москве по годам Что вышло из применения минимальных навыков в области линейной регрессии можно в краткой форме посмотреть на GitHub, ну и конечно же заглянув под кат. Введение Как обычно, в начале статьи расскажу о навыках необходимых для понимания этой статьи. От вас потребуется:
Если вы совсем новичок в области анализа данных и машинного обучения, посмотрите прошлые статьи цикла в порядке их следования, там каждая статья писалась по «горячим следам» и вы поймете стоит ли Вам тратить время на Data Science. Все ранее подготовленные статьи ниже под спойлером Другие статьи цикла 1. Учим азы:
2. Практикуем первые навыки Ну и как обещал раньше теперь статьи этого цикла будут комплектоваться содержанием. Содержание: Часть I: «Жениться — не лапоть надеть» — Получение и первичный анализ данных. Часть II: «Один в поле не воин» — Регрессия по 1 признаку Часть III: «Одна голова хорошо, а много лучше» — Регрессия по нескольким признакам с регуляризацией Часть IV: «Не все то золото что блестит» — Добавляем признаки Часть V: «Крой новый кафтан, а к старому примеряй!» — Прогноз тренда Итак, перейдем подробней к задаче. Наша с Вами цель, откопать какой-нибудь набор данных достаточный для того, чтобы продемонстрировать основные приемы линейной регрессии и самим определить, что мы будем прогнозировать. В этот раз буду краток и не буду отходить от темы рассмотрев только линейную регрессию (вы же наверняка знаете о существовании и других методов) Часть I: «Жениться — не лапоть надеть» — Получение и первичный анализ данных К сожалению, открытые данные правительства Москвы не настолько обширны и бескрайны как бюджет затраченный на благоустройство по программе «Моя улица», но тем не менее кое-что путное найти удалось.Динамика регистрации актов гражданского состояния, нам вполне подойдет. Это почти сотня записей, разбитых по месяцам, в которых есть данные о количестве свадеб, рождений, установление родительства, смертей, смен имен и т.д. Для решения задачи регрессии вполне подойдет. Весь код целиком, размещен на GitHub Ну а по частям мы его препарируем прямо сейчас. Для начала импортируем библиотеки:
Затем загрузим данные. Библиотека Pandas позволяет загружать файлы с удаленного сервера, что в общем и целом просто замечательно, при условии, конечно что на портале не изменится алгоритм переадресации страниц. (надеюсь, что ссылка на скачивание в коде, не накроется, если она перестанет работать пожалуйста напишите в «личку», чтобы я мог обновить)
Посмотрим на данные:
Если мы хотим пользоваться данными о месяцах, их необходимо перевести в понятный модели формат, у scikit-learn есть свои методы, но мы для надежности сделаем руками (ибо не очень много работы) ну и заодно удалим пару бесполезных в нашем случае столбцов с ID и мусором.
Поскольку я не уверен, что табличный вид у всех откроется нормально посмотрим на данные с помощью картинки. Построим парные диаграммы, из которых будет понятно, какие столбцы нашей таблицы, линейно зависят друг от друга. Однако сразу все данные мы не будем рассматривать, чтобы потом было, что добавить, поэтому вначале уберем часть данных. Достаточно простой способ выделить(«удалить») часть столбцов из pandas Dataframe, это просто сделать выборку по нужным столбцам:
Ну а теперь можно и график построить.
Хорошей практикой является масштабирование признаков, чтобы не сравнивать лошадей с весом копны сена и средним атмосферным давлением в течении месяца. В нашем случае все данные представлены в одних величинах (количестве зарегистрированных актов), но давайте все же посмотрим, что изменит масштабирование.
Почти ничего, но для надежности пока будем брать масштабированные данные. Часть II: «Один в поле не воин» — Регрессия по 1 признаку Посмотрим на картинки и увидим, что лучше всего прямой линией можно описать связь между двумя признаками StateRegistrationOfBirth и StateRegistrationOfPaternityExamination, что в общем и не сильно удивляет (чем чаще проверяют «отцовство», тем чаще регистрируют детей).Подготовим данные, а именно выделим два столбца признак и целевую функцию, затем с помощью готовых библиотек поделим данные на обучающую и контрольную выборку (манипуляции в конце кода были нужны, для приведения данных к нужной форме)
Важно отметить, что сейчас несмотря на явную возможность привязаться к хронологии, мы в целях демонстрации рассмотрим данные просто как набор записей без привязки ко времени. «Скормим» наши данные модели и посмотрим на коэффициент при нашем признаке, а также оценим точность подгонки модели с помощью R^2 (коэффициент детерминации).
Получилось не очень, с другой стороны сильно лучше чем если бы мы «тыкались на угад» Coefficients: [[ 0.78600258]] Посмотрим это на графиках, вначале на обучающих данных:
А теперь на контрольных:
Часть III: «Одна голова хорошо, а много лучше» — Регрессия по нескольким признакам с регуляризацией Чтобы было интересней давайте выберем другую целевую функцию, которая не так очевидно линейно зависит от признаков. Чтобы соответствовать названию статью, в качестве целевой функции выберем регистрацию браков. А все остальные столбцы из набора с картинок парных диаграмм сделаем признаками.
Обучим вначале просто модель линейной регрессии.
Получим результат чуть хуже, чем в прошлом случае (что и не удивительно) Coefficients: [[-0.03475475 0.97143632 -0.44298685 -0.18245718]] Для борьбы с переобучением и/или отбора признаков, вместе с моделью линейной регрессии обычно используют механизм регуляризации, в данной статьи мы рассмотрим механизм Lasso (L1 – regularization) Чем больше коэффициент регуляризации альфа, тем активнее модель штрафует большие значения признаков, вплоть до приведения некоторых коэффициентов уравнения регрессии к нулю.
Надо отметить, что тут я делаю прям вот нехорошие вещи, подогнал коэффициент регуляризации под тестовые данные, в реальности так делать не стоит, но нам чисто для демонстрации сойдет. Посмотрим на вывод: Appha: 0.01 В данном случае модель с регуляризацией не сильно повышает качество, попробуем добавить еще признаков. Часть IV: «Не все то золото что блестит» — Добавляем признаки Добавим очевидно бесполезный признак «общее количество регистраций», почему очевидно? Сейчас сами в этом убедитесь.
Для начала посмотрим на результаты без регуляризации
Coefficients: [[-0.45286477 -0.08625204 -0.19375198 -0.63079401 1.57467774]] С ума сойти! Почти 100% точность! Как же этот признак можно было назвать бесполезным?! Ну давайте мыслить здраво, наше количество браков входит в общее количество, поэтому если у нас есть сведения о других признаках, то и точность близится к 100%. На практике это не особо полезно. Давайте перейдем к нашему «Лассо» Вначале выберем небольшой коэффициент регуляризации:
Appha: 0.00015 Ну ничего сильно не поменялось, это нам не интересно, давайте посмотрим, что будет если его увеличить.
Appha: 0.01 Итак, видим, что почти все признаки были признаны моделью бесполезными, а самым полезным остался признак общего количества записей, так, что если бы нам вдруг пришлось использовать только 1-2 признака мы бы знали, что выбрать, чтобы минимизировать потери. Давайте чисто из любопытства посмотрим как можно было объяснить процент регистрации браков только лишь общим количеством записей.
Coefficients: [ 1.0571131] Ну что же неплохо, но объективно меньше, чем с учётом остальных признаков. Давайте посмотрим на графики:
Давайте попробуем к исходному набору данных теперь добавить другой бесполезный признак State Registration Of Name Change (смену имени), можете самостоятельно построить модель и посмотреть, какую долю данных объясняет этот признак (маленькую поверьте на слово). А мы сразу подберем данные и обучим модель на старых 4х признаках и этом бесполезном
Coefficients: [[ 0.06583714 1.1080889 -0.35025999 -0.24473705 -0.4513887 ]] Не будем пробовать регуляризацию она кардинально ничего не изменит, как видно данный признак нам все только портит. Давайте наконец-то выберем полезный признак. Все знают, что есть горячий сезон для свадеб (лето и начало осени), а есть тихий сезон (зима). Меня кстати удивило, что в мае отмечают мало свадеб.
Coefficients: [[-0.10613428 0.91315175 -0.55413198 -0.13253367 0.28536285]] Неплохое повышение качества и главное все соответствует здравой логике. Часть V: «Крой новый кафтан, а к старому примеряй!» — Прогноз тренда Последнее что нам, пожалуй, осталось, это присмотреться к линейной регрессии как к инструменту для предсказания тренда. В прошлых главах мы брали данные случайно, то есть в обучающую выборку попадали данные из всего временного диапазона. В этот раз мы поделим данные на прошлое и будущее и посмотрим, удастся ли нам что-то предсказатьДля удобства будем считать срок в месяцах с января 2010, для этого напишем простую анонимную функцию, которая нам преобразует данные, в итоге заменим столбец год, на количество месяцев. Обучаться будем на данных до 2016 года, а будущим для нас станет все что начинается с 2016 года.
Coefficients: [ 2.60708376e-01 1.30751121e+01 -3.31447168e+00 -2.34368684e-01 Как видно при такой разбивке данных, точность несколько снижается и тем не менее качество предсказания всяко лучше, чем пальцем в небо. Убедимся посмотрев на графики.
На графиках синим цветом представлено «прошлое», зеленым «будущее», а фиолетовым связка. Итак, видно, что наша модель неидеально описывает точки, однако по крайней мере учитывает сезонные закономерности. Таким образом, можно надеется, что и в будущем по имеющимся данным модель, сможет нас хоть как-то сориентировать, в части регистрации браков. Хотя для анализа трендов есть, куда как более совершенные инструменты, которые выходят за рамки данной статьи (и на мой взгляд, начальных навыков в Data Science) Заключение Ну вот мы и рассмотрели задачу восстановления регрессии, предлагаю вам поискать и другие зависимости, на порталах открытых данных государственных структур страны, возможно вы найдете какую-нибудь интересную зависимость. В качестве «челенджа» предлагаю, вам откопать, что-нибудь на портале открытых данных Республики Беларусь opendata.byВ завершении картинка, по мотивам общения Александра Григорьевича с журналистами и ответов на неудобные вопросы. Источник: habrahabr.ru Комментарии: |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||