В чем разница между ними?

Lasso, Ridge и ElasticNet являются частью семейства линейной регрессии, где предполагается, что x (вход) и y (выход) имеют линейную зависимость. В sklearn LinearRegression относится к самому обычному методу линейной регрессии по методу наименьших квадратов без регуляризации (штраф за веса). Основное различие между ними заключается в том, штрафуется ли модель за ее вес. В оставшейся части поста я расскажу о них в контексте библиотеки scikit-learn.

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

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

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

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

ElasticNet представляет собой гибрид Lasso и Ridge, в который включены как штрафы по абсолютному значению, так и штрафы в квадрате, которые регулируются другим коэффициентом l1_ratio:

Ваши данные еще не масштабированы?

Как вы можете видеть в приведенных выше уравнениях, штрафные веса суммируются в функции потерь. Предположим, у нас есть функция house_size в диапазоне 2000, а другая функция num_bedrooms в диапазоне 3, тогда мы ожидаем, что вес для house_size может быть естественно меньше, чем вес для кол-во спален. В таком случае одинаковое наказание за вес каждой функции становится неуместным. Следовательно, важно масштабировать или нормализовать данные перед их вводом в модели. Небольшое примечание: по умолчанию в sklearn для этой модели для параметра «normalize» установлено значение false. Вы можете либо включить «normalize», либо использовать ScandardScaler для масштабирования данных. Как правило, использование ScandardScaler является хорошей практикой, поскольку вы можете захотеть масштабировать данные тестирования, используя тот же масштаб.

Когда какой использовать?

Следует помнить о нескольких вещах:

(1) Памятка по алгоритму sklearn предлагает вам попробовать Lasso, ElasticNet или Ridge, если ваш набор данных меньше 100 тысяч строк. В противном случае попробуйте SGDRegressor.

(2) Lasso и ElasticNet имеют тенденцию давать разреженные веса (большинство нулей), потому что регуляризация l1 в равной степени заботится о снижении больших весов до малых или о сведении малых весов к нулям. Если у вас много предикторов (функций) и вы подозреваете, что не все из них так важны, возможно, лучше начать с Lasso и ElasticNet.

(3) Ридж имеет тенденцию давать небольшие, но хорошо распределенные веса, потому что регуляризация l2 больше заботится о сведении большого веса к малому, а не о сведении малых весов к нулю. Если у вас всего несколько предикторов и вы уверены, что все они действительно актуальны для прогнозов, попробуйте Ridge как хороший метод регуляризованной линейной регрессии.

(4) Перед использованием этих методов регуляризованной линейной регрессии вам потребуется масштабировать данные. Сначала используйте StandardScaler или установите для параметра «normalize» в этих оценках значение «True».