Введение

Метод регуляризации очень популярен в области машинного обучения, однако вы увидите, что многие люди до сих пор его не используют. Одна из причин, о которой я могу думать, заключается в сложности всей концепции регуляризации, поэтому я решил сделать ее простой для всех нас. В этой статье я попытаюсь объяснить регуляризацию простым для понимания и использования способом. По сути, пока я объясняю концепцию, я дам практические подробности о том, как реализовать регуляризацию в R и SAS.

Так что же такое регуляризация? Проще говоря, регуляризация относится к методу предотвращения переобучения путем явного контроля сложности модели. Это приводит к сглаживанию линии регрессии и, таким образом, предотвращает переоснащение. Это достигается за счет штрафа за изгиб линии регрессии, которая пытается точно соответствовать зашумленным точкам данных.

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

InShort Overfitting возникает, когда имеется так много свободных параметров, что алгоритм обучения может слишком точно соответствовать обучающим данным, что увеличивает ошибку обобщения, а регуляризация решает эту проблему переобучения. Есть несколько методов для достижения регуляризации, то есть L1 и L2. По сути, вы наказываете свою функцию потерь, добавляя кратную норме L1 (LASSO) или L2 (Ridge) вашего вектора весов w (это вектор изученных параметров в вашей регрессии). Хотя и Lasso (L1), и Ridge (L2) являются методами регуляризации, которые штрафуют коэффициенты, оба имеют разные свойства и используются в разных случаях использования. Если вы использовали эти методы раньше, вы должны знать, как они снижают величину коэффициентов признаков, а также минимизируют ошибку между прогнозируемыми и фактическими наблюдениями. Таким образом, ключевое отличие заключается в том, как они назначают штрафы коэффициентам:

R(theta) — это член регуляризации, который заставляет параметры быть маленькими.

В Lasso(L1), как видно из приведенной выше формулы, добавляется штраф, эквивалентный абсолютному значению величины коэффициентов, тогда как в Ridge(L2) добавляется штраф, эквивалентный квадрату величины коэффициентов, и это основное различие между ними. Теперь у нас возникнет вопрос, зачем нам штрафовать коэффициенты. Может быть, для ответа будет лучше, если вы вернетесь к любой из ваших моделей полиномиальной регрессии, и вы поймете, что по мере увеличения сложности модели размер коэффициентов также увеличивается. Так что же означают большие коэффициенты? По сути, это означает, что мы уделяем большое внимание этой функции, которая означает, что конкретная функция является хорошим предиктором результата. Когда он становится слишком большим, алгоритм начинает моделировать сложные отношения для оценки выходных данных и заканчивает подгонкой к конкретным обучающим данным, и, как я объяснил выше, для решения проблемы переобучения нам нужна регуляризация, поэтому я надеюсь, что теперь понятно, почему нам нужно оштрафовать коэффициенты. Пожалуйста, не стесняйтесь связаться, если это все еще не ясно, и я рад обсудить то же самое.

Теперь давайте подробно рассмотрим каждый метод регуляризации:

КОНЬ(L2):-

Как уже упоминалось, он добавляет фактор суммы квадратов коэффициентов в цель оптимизации. Таким образом, гребневая регрессия оптимизирует следующее: f(x) = RSS + α * (сумма квадратов коэффициентов). Здесь α (альфа) — это параметр, который уравновешивает степень внимания, придаваемого минимизации RSS, по сравнению с минимизацией суммы квадратов коэффициентов. α может принимать различные значения:

α = 0: цель становится такой же, как и для простой линейной регрессии. Мы получим те же коэффициенты, что и простая линейная регрессия.

α = ∞: коэффициенты будут равны нулю из-за бесконечного веса квадрата коэффициентов, все, что меньше нуля, сделает цель бесконечной.

0 ‹ α ‹ ∞: Величина α будет определять вес, придаваемый различным частям объектива.

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

ЛАССО(L1):-

LASSO расшифровывается как оператор наименьшей абсолютной усадки и выбора. Таким образом, регрессия лассо оптимизирует следующее: f(x) = RSS + α * (сумма абсолютного значения коэффициентов). Здесь α (альфа) работает аналогично гребню. Когда мы будем использовать L1, то увидим, что даже при малом значении альфы значительное количество коэффициентов равно нулю. Эта основа, при которой большинство коэффициентов равны нулю, называется разреженностью, и именно поэтому лассо выполняет выбор признаков. Таким образом, наряду с коэффициентами сжатия лассо также выполняет выбор признаков. Как видите, в соответствии с формулой некоторые коэффициенты станут равны нулю, что означает, что конкретный признак исключается из модели. Лассо предпочтительнее, когда у нас очень большое количество функций.

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

Таким образом, штраф L2 вызывает чистое сжатие, тогда как штраф L1 вызывает сжатие и выделение.

Наряду с Ridge и Lasso, Elastic Net — еще один полезный метод, который сочетает в себе регуляризацию L1 и L2. Таким образом, Elastic Net будет использоваться для балансировки вещей из L1 и L2, как описано выше. По сути, регрессия гребня, LASSO и эластичная сеть являются частью одного семейства со штрафным сроком:

Где:-

α = 0 = регрессия гребня — Регрессия гребня сжимает коррелированные переменные по отношению друг к другу.

α= 1 = LASSO- LASSO также осуществляет выбор признаков: — если многие признаки коррелированы, lasso выберет только один.

0 ‹ α ‹ 1 = эластичная сеть! - Эластичная сеть может работать со сгруппированными переменными.

Давайте визуализируем это: -

Регуляризация в R: –

GLMNET — это наиболее часто используемый пакет R для реализации регуляризации в R, а также мой любимый пакет.

install.packages(“glmnet”)

библиотека (glmnet)

Основной функцией в этом пакете является glmnet(), которую можно использовать для моделирования регрессионных моделей, моделей лассо и многого другого. Синтаксис этой функции несколько отличается от других функций подбора модели. Функция glmnet() имеет альфа-аргумент, который определяет, какой тип модели подходит. Если альфа = 0, то подходит модель гребневой регрессии, а если альфа = 1, то подходит модель лассо. Давайте сначала подгоним модель регрессии Риджа:

ridge.model=glmnet(x,y,alpha=0,lambda=grid)

Обратите внимание, что по умолчанию функция glmnet() стандартизирует переменные, чтобы они находились в одном масштабе. Чтобы отключить эту настройку по умолчанию, используйте аргумент standardize = FALSE. Вот как вы можете увидеть коэффициенты:

dim(coef(ridge.model))

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

Чтобы подогнать модель лассо, мы снова используем функцию glmnet(); однако на этот раз мы используем аргумент альфа = 1.

cv.out=cv.glmnet(x[train,],y[train],alpha=1) # Подгонка модели лассо к обучающим данным

plot(cv.out) # Нарисуйте график обучения MSE как функцию лямбда

bestlam=cv.out$lambda.min # Выберите лямбду, которая минимизирует обучающую MSE

lasso.pred=predict(lasso.mod,s=bestlam,newx=x[test,]) # Использование наилучшего лямбда для прогнозирования тестовых данных

lasso.coef[lasso.coef!=0] # Отображение только ненулевого коэффициента

Как я это использую, я использую функцию glmnet, которая выполняет перекрестную проверку для glmnet, создает график и возвращает значение для лямбда, сначала я использую альфа = 1, что означает, что Лассо получает значимые переменные: -

# Поиск значимых переменных

feature_lasso ‹- cv.glmnet(x,y family = "биномиальный",

type.measure = "auc", parallel = TRUE,

nfolds = nfolds, maxit = 10000, alpha = 1)

Как это работает согласно документации R: - Функция запускает glmnet nfolds+1 раз; первый, чтобы получить лямбда-последовательность, а затем остаток, чтобы вычислить соответствие с каждой из опущенных складок. Ошибка накапливается, и вычисляются средняя ошибка и стандартное отклонение по складкам. Обратите внимание, что cv.glmnet НЕ ищет значения для альфы. Должно быть указано конкретное значение, иначе по умолчанию предполагается альфа=1. Если пользователи также хотят выполнить перекрестную проверку альфа-канала, они должны вызвать cv.glmnet с предварительно вычисленным идентификатором сгиба вектора, а затем использовать этот же вектор сворачивания в отдельных вызовах cv.glmnet с разными значениями альфа-канала. Обратите также внимание, что результаты cv.glmnet являются случайными, поскольку складки выбираются случайным образом. Пользователи могут уменьшить эту случайность, многократно запуская cv.glmnet и усредняя кривые ошибок.

функция ‹- предсказать (функция_лассо, s = «лямбда.мин», тип = «коэффициенты»)

Затем я повторно запускаю модель, используя регрессию Риджа, но только со значительными переменными, которые я получил на шаге выше:

cv.glmnet(x,y, family = "binomial", type.measure = "auc", parallel = run_parallel, foldid = foldid, maxit = 10000, alpha = a))

Как объяснялось выше, при выполнении этого я предварительно вычислил foldbid, а затем использовал его в отдельных вызовах cv.glmnet с разными значениями альфы. Как только я получаю минимальную альфу, затем, используя эту лучшую альфу (т.е. минимум для всех итераций), я подгоняю модель с помощью эластичной сети: -

min_alpha_mod ‹- elasticnet[[what.min(results$mins)]]

Вот как я получаю модель, с помощью которой при перекрестной проверке я применил регуляризацию.

Регуляризация в SAS: — В SAS у нас есть PROC GLMSELECT, который я использовал для реализации регуляризации: —

proc glmselect data=train plots=all;

фракция раздела (validate=.3);

класс c1 c2;

модель y = c1|c2|x1|x2|x3|x4|x5 @2

/ selection=lasso(stop=none Choose=validate);

бежать;

Где оператор MODEL запрашивает построение линейной модели с использованием всех эффектов (c1, c2, x1, x2, x3, x4 и x5) и их двустороннего взаимодействия. Оператор PARTITION случайным образом резервирует 30 % данных в качестве данных проверки и использует оставшиеся 70 % в качестве обучающих данных. Обучающий набор используется для подбора моделей, а проверочный набор используется для оценки ошибки предсказания для выбора модели. Параметр SELECTION=LASSO в операторе MODEL запрашивает выбор LASSO. Подопция CHOOSE=VALIDATE в операторе MODEL требует, чтобы данные проверки использовались в качестве метода настройки для выбора LASSO.

Опять же, поскольку я всегда говорю, что реализовать что-либо в SAS проще, чем R, поэтому я не буду вдаваться в подробности, поскольку это говорит само за себя, однако, поскольку я предпочитаю R SAS при реализации регуляризации, поэтому я более подробно остановился на R.

В этом посте я сосредоточился на регуляризации, где попытался объяснить, что такое регуляризация и зачем она нам нужна, а затем объяснил, почему нам нужно штрафовать коэффициенты. Затем я более подробно рассказал о технике регуляризации L1/L2 и поделился практическим руководством по ее реализации в R и SAS.

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

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

Первоначально опубликовано на https://www.linkedin.com.