Полный разбор линейной регрессии и методов регуляризации в Python

МЕНЮ


Главная страница
Поиск
Регистрация на сайте
Помощь проекту
Архив новостей

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


Одним из самых популярных и простых методов машинного обучения является линейная регрессия. Это достаточно эффективный метод, например, для построения прогнозов по каким-то историческим данным.

Однако, используя линейную регрессию, мы можем столкнуться с рядом проблем. Например, переобучение или низкое качество модели. Для решения этих сложностей разработан ряд методов и подходов. Один из них - использование регуляризации.

Если Вы знакомы с регуляризацией или попробуете почитать о ней прямо сейчас, то Вы увидите, что их существует несколько видов. Почти сразу же Вы наткнетесь, как минимум, на 3 метода - Lasso, Ridge и ElasticNet. Но какой метод лучше использовать? В чем между ними разница? И нужно ли вообще их применять - может стоит просто оставить обычную линейную регрессию и ничего не трогать?

На эти и другие вопросы мы ответим в сегодняшней статье. Разбирать кейс по применению различных методов регуляризации будем на примере языка Python.

Итак, давайте приступим. Начнем с линейной регрессии.

Линейная регрессия

Прежде чем переходить к сравнению методов регуляризации, давайте посмотрим, а что нам дает стандартная модель линейной регрессии (OLR - ordinary linear regression).

Перед тем, как строить модель, давайте загрузим и немного обработаем исходные данные.

Мы подключили необходимые библиотеки, загрузили датасет, затем сформировали аргумент Х и зависимую переменную y. Более того, к y мы добавили немного случайного шума, чтобы еще больше увеличить разброс значений. Для чего мы это сделали - расскажем позже.

Теперь идем дальше: давайте сформируем из наших Х и у обучающую и тестовую выборки.

Тестовая выборка у нас будет составлять 20% от изначального объема данных.

Теперь мы готовы перейти непосредственно к построению модели линейной регрессии.

Отлично, с помощью полученной модели мы уже рассчитали значения у для тренировочной выборки. Давайте построим scatter plot (точечный график) и посмотрим, насколько хороша наша модель.

Вот такой график у нас получился:

Мы видим, что разброс данных достаточно велик, но наша красная линия регрессии вроде как неплохо описывает зависимость в данных. Невооруженным взглядом виден рост y при увеличении X.

Давайте теперь рассчитаем прогноз для тестовой выборки и посмотрим, что получилось. Может там все поломается…

И вот график:

Нет, в целом, здесь тоже тенденция выявлена правильно. Однако, глаза могут нас обманывать. Давайте внесем немного объективности и посмотрим на численную оценку нашей модели. Первое, что приходит в голову для оценки регрессионной модели - коэффициент R2. Его интерпретация очень проста - он показывает количество объясненной дисперсии. Другими словами, он численно показывает, сколько процентов разброса данных объяснила наша модель. Чем ближе к 1, тем лучше (значит, вся дисперсия учтена моделью).

Давайте загрузим соответствующую метрику и рассчитаем ее для наших предсказанных значений.

В качестве аргументов мы передаем два массива - предсказанные значения и “эталонные” значения (ground truth). Видим, что качество модели достаточно низкое - около 34-38%. В целом, это объяснимо, ведь разброс наших данных достаточно велик.

Замечание. Обратите внимание, в Python коэффициент R2 может принимать отрицательные значения. Это свидетельствует о том, что построенная модель очень плохо описывает данные и зависимости в них.

Но на этом мы не закончили - давайте попробуем добавить регуляризацию в нашу модель. Может что-то изменится.

Lasso regression

Lasso регрессия или L1-регуляризация - наложение штрафа в виде абсолютной суммы коэффициентов. Математику процесса мы здесь разбирать не будем, т.к. это тема отдельной статьи.

Подробнее прочитать про математическую составляющую L1-регуляризации Вы можете в нашей статье.

Давайте построим модель Lasso в Python и оценим ее аналогичным образом. Здесь практически ничего не поменяется в плане кода. Только название модели меняется, а остальное можно просто скопировать из предыдущего расчета OLR. Удобно :)

Как и раньше, давайте посмотрим на графике, что там напредсказывала наша Lasso модель.

График для тренировочных предсказаний:

График для тестовых предсказаний:

Картина более-менее такая же. Давайте теперь посмотрим численную оценку коэффициента R2.

Видим, что R2 совсем немного, но увеличился для тестовой выборки. Ну что же, как получилось, так получилось. Можно, конечно, поварьировать еще коэффициент альфа, но вряд ли мы тут получим лучший результат. Давайте пойдем дальше и посмотрим на остальные методы регуляризации.

Ridge regression

Ridge регрессия или L2-регуляризация - метод наложения штрафа в виде квадратов коэффициентов.

Подробнее прочитать про математическую составляющую L2-регуляризации Вы можете в нашей статье.

Как и в случае с Lasso, код здесь почти не меняется:

График предсказаний для тренировочной выборки будет выглядеть так:

А для тестовой так:

Численная оценка R2 коэффициента даст 0.343805 и 0.379483. Видим, что результат полностью совпадает с обычной линейной регрессией. Ну что же, бывает. Давайте перейдем к последнему методу - ElasticNet.

ElasticNet

ElasticNet - комбинация Ridge и Lasso регуляризации, т.е. в модели задействованы оба штрафа в заданной пропорции. Давайте зададим долю L1 штрафа равную 0.5, т.е. половине.

Весь код Вам уже хорошо знаком, так что комментировать его смысла нет. Все в точности также, как мы делали в предыдущих случаях.

Графики для тренировочных и тестовых данных будут выглядеть так:

Оценка коэффициентов дает 0.343804 и 0.379774. Тоже наблюдаем лишь очень незначительное улучшение в тестовых предсказаниях.

Но почему качество модели почти не растет? А иногда даже OLR показывает себя чуть лучше, чем рассмотренные методы?

Область применимости методов регуляризации

Нужно понимать, что у каждого алгоритма есть ситуации, когда он работает максимально эффективно, а когда менее эффективно. При этом, если взять очень хороший алгоритм и применить его в неподходящем месте, то он может катастрофически испортить модель. С линейной регрессией все именно так и есть.

Правило: Линейная регрессия работает отлично, когда связь между аргументами и прогнозируемой величиной линейна, а также когда число измерений сильно больше числа независимых переменных (n >> p).

Однако, когда число измерений не очень велико (n > p) или даже число независимых переменных больше, чем число измерений, то это может привести к переобучению или низкому качеству модели. Вот тогда стоит смотреть в сторону других методов.

В нашем случае независимая переменная X всего одна, а количество измерений n сильно больше 1. Поэтому модель линейной регрессии неплохо справляется со своей задачей.

Lasso регрессию хорошо использовать, когда какие-то независимые переменные не оказывают значительного влияния на y или же сильно коррелированы между собой. В такой ситуации Lasso может привести к повышению качества модели.

Одновременно с этим, такое свойство Lasso может и навредить, ведь из-за него некоторые важные признаки могут выпасть из расчета, что приведет к искажению модели. Например, если число измерений (p) меньше числа предикторов (x), то Lasso выберет лишь p предикторов. А если все из исходных предикторов были важны, то какие-то данные в нашей модели просто не будут учтены.

У Ridge регрессии таких проблем не возникает, т.к. она не приводит к понижению числа переменных, а только лишь к уменьшению сложности модели.

Для того, чтобы не попасть в ситуацию, где Вы будете применять неверную модель машинного обучения, необходимо производить предварительный анализ начальных данных: проверять корреляции, оценивать значимость признаков, смотреть на структуру и разброс данных и так далее. Подготовительный этап - один из самых важных в Machine Learning.

Замечание. Помните, в самом начале мы добавили случайный шум к переменной у? Теперь Вы, наверно, понимаете, что мы сделали это намеренно, чтобы увеличить разброс значений зависимой переменной и не попасть в ситуацию, когда обычная линейная регрессия будет наилучшим образом описывать наши данные.

Эпилог

Мы с Вами достаточно подробно рассмотрели построение модели линейной регрессии, а также 3 методов регуляризации. Теперь Вы знаете, как строить все эти модели в Python, как их оценивать визуально и с помощью коэффициента R2, а также какие подводные камни могут встретиться у Вас на пути.

Теперь самое время закрепить материал на практике. Попробуйте проделать похожую процедуру с помощью датасета Boston.

В нем Вы можете поработать как с одним признаком, так и с несколькими предикторами сразу. Посмотрите, как от этого зависит качество модели и как работают разные методы регуляризации. Только не забудьте произвести предварительный анализ, ведь этот набор данных обладает некоторыми свойствами, которые мы обсудили в предыдущем параграфе. Будьте внимательны! ;)

Еще больше интересных материалов по Machine Learning, Python, SQL, математике и другим темам Вы найдете в нашей группе IT Resume.


Источник: m.vk.com

Комментарии: