Обзор различий в трех распространенных методах регуляризации - Ridge, Lasso и Elastic Net.

Вы обучили регрессионную модель, и ваш R² возвращается, и он выглядит хорошо - почти так, как будто он слишком хорош. Конечно, следующий логический шаг - посмотреть, как работает набор тестовых данных. Предупреждение о спойлере: его не будет и рядом с успехом обучающего набора.

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

Работа с компьютерами позволяет нам оторваться от реальности, и переоснащение / недостаточное оснащение моделей является тому доказательством. Например, в строительстве компьютерное проектирование (CAD) позволяет чертежникам рисовать с экстремальными допусками, такими как, например, 0,001 дюйма. Если вы нарисуете план, согласно которому экскаватор должен выкопать траншею глубиной 34,963 дюйма, можно ли ожидать, что тяжелая техника будет иметь такую ​​точность? Можете ли вы ожидать, что плотник в поле будет резать пиломатериалы до 0,001 дюйма? Я могу сказать вам по опыту, что этого не произойдет. Траншея будет примерно 36 дюймов в глубину (3 фута), и доска, вероятно, будет округлена до ближайшей 1/8 дюйма или, если вам повезет, 1/16 дюйма. Это реальный пример постоянной переоснащения вычислений компьютерной модели.

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

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

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

# Equation of True Function
def true_fun(X):
    return np.cos(1.5 * np.pi * X)

Прогнозы модели недостаточного соответствия вообще не объясняют выборочные данные истинной функции. Истинная функция более сложна, чем простое линейное уравнение со степенью 1. Если вам нужно напомнить, как определить степень полиномиальной функции, посетите этот веб-сайт.

Хорошей аналогией для этой модели будет ответ «C» на каждый вопрос в тесте с множественным выбором. Конечно, вам может повезти с парочкой вопросов, но подавляющее большинство вы ошибетесь.

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

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

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

Методы регуляризации

Методы регрессии Риджа и Лассо расширяют простую линейную регрессию. Прежде чем двигаться дальше, давайте рассмотрим, что такое регрессия OLS:

Функция стоимости измеряет разницу между выходными данными модели и фактическими данными. Существует несколько функций стоимости для линейной регрессии, таких как RSS, MSE и RMSE. В приведенном выше примере функцией стоимости является RSS (y_actual - y_predicted) ². Прогнозируемое значение можно заменить уравнением вашей линии регрессии. Коэффициенты вашей характеристики, также известные как наклон, равны (mⱼ). Эти коэффициенты характеристик являются объектом, которым мы манипулируем с помощью наших методов регуляризации.

Примечание. В этом посте я использую термины «предикторы» и «функции» как синонимы. Предиктор - это независимая переменная (переменная x), используемая в модели. Если бы вы строили оценщик ИМТ, рост, скорее всего, был бы одним из ваших предикторов.

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

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

Хребтовая регрессия

Риджевая регрессия - это небольшое расширение функции стоимости OLS, где она добавляет к модели штраф по мере увеличения ее сложности. Чем больше предикторов (mⱼ) у вас в наборе данных, тем выше значение R² и тем выше вероятность того, что ваша модель переоценивается к вашим данным. Регрессию гребня часто называют регуляризацией нормы L2.

Имейте в виду, что цель состоит в том, чтобы минимизировать функцию стоимости, поэтому чем больше штрафной член (λ * сумма (м²)), тем хуже будет работать модель. Эта функция наказывает вашу модель за слишком много или слишком большие предикторы. Цель регрессии Риджа - уменьшить влияние этих предикторов, чтобы уменьшить вероятность переобучения ваших данных. Если бы мы установили λ = 0, это была бы нормальная регрессия OLS.

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

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

Лассо-регрессия

Глядя на приведенное ниже уравнение и думая про себя, «это выглядит почти идентично регрессии Риджа». Что ж, по большей части вы правы. Лассо отличается от регрессии Риджа суммированием абсолютных значений предикторов (mⱼ) вместо суммирования квадратов значений.

Лассо - это аббревиатура от «Оператор наименьшей абсолютной усадки и выбора». Из-за того, что штрафной член не возведен в квадрат, некоторые значения могут достигать 0. Когда коэффициент предиктора (mⱼ) достигает 0, этот предиктор не влияет на модель.

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

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

Эластичная чистая регрессия

Так что, если я не хочу выбирать? Что делать, если я не знаю, что мне нужно или что мне нужно? Регрессия эластичной сети была создана как критика регрессии Лассо. Хотя это помогает при выборе функций, иногда вы не хотите агрессивно удалять функции. Как вы уже догадались, Elastic Net представляет собой комбинацию регрессий Лассо и Риджа. Поскольку у нас есть представление о том, как действуют регрессии Риджа и Лассо, я не буду вдаваться в подробности. Пожалуйста, обратитесь к документации sci-kit learn.

Как вы можете видеть на картинке выше, теперь есть два λ-члена. λ₁ - это значение «альфа» для части регрессии Лассо, а λ₂ - значение «альфа» для уравнения регрессии Риджа. При использовании регрессии эластичной сети sci-kit learn альфа-член представляет собой соотношение λ₁: λ₂. При установке отношения = 0 оно действует как регрессия гребня, а когда отношение = 1, оно действует как регрессия Лассо. Любое значение от 0 до 1 представляет собой комбинацию регрессии Риджа и Лассо.

Как использовать эти методы регрессии

Теперь начинается самое интересное! Я предполагаю, что вы уже знаете, как построить базовую линейную модель. Если нет, вы увидите, как это сделать, в соответствующей записной книжке для этого блога. Использование регрессий Lasso и Ridge очень похоже, за исключением альфа-значения. Sci-kit learn’s GridSearchCV выполняет поиск по диапазону значений, чтобы найти оптимальное значение для ваших гиперпараметров.

Лассо-регрессия

Ниже приведен код, который я использовал для построения результирующего графика, изображенного ниже. Эта модель была создана с использованием набора данных Boston Housing от Sci-Kit Learn.

from sklearn.model_selection import GridSearchCV
# Create an array of alpha values to test
# Start np.linspace value is 10**-10 because a value of 0 throws warnings
alphas = np.logspace(-10, 1, 1000,base=10)
# Create dictionary key,value pair of alpha values
tuned_parameters = [{'alpha': alphas}]
# Specify number of folds for cross_validation
n_folds = 5
# Create grid search instance using desired variables
clf_lasso = GridSearchCV(lasso, tuned_parameters, cv=5, refit=True)
clf_lasso.fit(x_train_scaled, y_train)
lasso_scores = clf_lasso.cv_results_['mean_test_score']
# Plot the results
plt.figure().set_size_inches(8, 6)
plt.plot(alphas, lasso_scores)
plt.xlabel('Alpha Value')
plt.ylabel('Model CV Score')
plt.title('Lasso Regression Alpha Demonstration')
plt.axvline(clf_lasso.best_params_['alpha'], color='black', linestyle='--')
print(f'The optimal alpha value is :{clf_lasso.best_params_["alpha"]}')

Обратите внимание, что оптимальное значение альфа составляет 0,0106, а не 0. Это доказывает, что добавление этого бита альфа дает более высокий балл перекрестной проверки, чем чистая линейная регрессия. На этой диаграмме легко увидеть, что по мере увеличения значения альфа оценка CV приближается и достигает 0.

На изображении выше показано, что при значении 1 регрессия Лассо удалила 8 признаков, оставив 5 из 13 оставшихся предикторов. Прогностическая сила модели снизилась по мере удаления функций, но теперь модель намного проще. Это дает некоторое представление о силе хорошего выбора функций.

Хребтовая регрессия

Еще раз, как и регрессия Лассо, вот код и следующий график.

from sklearn.model_selection import Ridge
# Create an array of alpha values to test
alphas = np.logspace(-1, 1.5, 500,base=10)
# Create a Ridge regression model instance
ridge = Ridge(random_state=0, max_iter=10000,alpha=alphas)
# Create dictionary key,value pair of alpha values
tuned_parameters = [{'alpha': alphas}]
# Specify number of folds for cross_validation
n_folds = 5
# Create grid search instance using desired variables
clf_ridge = GridSearchCV(ridge, tuned_parameters, cv=5, refit=False)
clf_ridge.fit(x_train_scaled, y_train)
ridge_scores = clf_ridge.cv_results_['mean_test_score']
# Plot the Figure
plt.figure().set_size_inches(8, 6)
plt.plot(alphas, ridge_scores)
plt.xlabel('Alpha Value')
plt.ylabel('Cross Validation Score')
plt.title('Ridge Regression Alpha Demonstration')
plt.axvline(clf_ridge.best_params_['alpha'], color='black', linestyle='--')
print(f'The optimal alpha value is: {clf_ridge.best_params_["alpha"]}')

В отличие от регрессии Лассо, здесь мы можем видеть, как значение приближается к 0 по мере увеличения значения альфа. Если хотите, в записной книжке GitHub вы можете увеличить альфа-значение и увидеть, что оно никогда не достигнет 0.

На графике регрессии Риджа мы видим, что при альфа-значении 2,97 наша модель имеет лучшую производительность, чем при значении 0. Помните, что альфа-значение, равное 0, соответствует нормальной регрессии. Это доказывает, что правильная величина смещения может улучшить вашу модель и предотвратить переоснащение!

Заключение

Вот и все! Теперь вы можете использовать оптимизированное альфа-значение для запуска выбранной вами регрессии. Вот краткое изложение того, что мы обсудили:

Что такое регуляризация: методы борьбы с переобучением и улучшения тренировок.

Когда использовать регуляризацию:
Лассо - несколько значимых предикторов, а величины других близки к нулю
Регрессия гребня - регрессия гребня работает хорошо если имеется много крупных предикторов примерно одинакового значения.
Эластичная сетка - смесь гребня и лассо

Как использовать регуляризацию:

  1. Разделить и стандартизировать данные (стандартизировать только входные данные модели, но не выходные данные)
  2. Решите, какой метод регрессии Ridge, Lasso или Elastic Net вы хотите применить.
  3. Используйте GridSearchCV для оптимизации гиперпараметрического альфа
  4. Создайте свою модель с помощью оптимизированной альфа-версии и делайте прогнозы!

Спасибо, что нашли время прочитать мой блог. Подробная информация о записной книжке доступна в моем репозитории GitHub. Если у вас есть какие-либо вопросы или у вас есть конструктивная критика, обращайтесь ко мне!

LinkedIn: www.linkedin.com/in/blake-samaha-54a9bbaa

Twitter: @Mean_Agression