Как использовать один из лучших методов выбора переменных в регрессии

Итак, вчера я запустил новый пакет для python: asgl (название происходит от Adaptive Sparse Group Lasso), который добавляет множество функций, которые уже были доступны в пакетах R, но не в python, например, решение разреженных групповых моделей лассо, и выходит за рамки этого, добавляя дополнительные функции, которые улучшают результаты, которые может обеспечить разреженное групповое лассо.

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

  • Что такое разреженное групповое лассо
  • Как использовать разреженное групповое лассо в Python
  • Как выполнить k-кратную перекрестную проверку
  • Как использовать поиск по сетке, чтобы найти оптимальное решение.

Что такое разреженное групповое лассо

Чтобы понять, что такое разреженное групповое лассо, нам нужно (кратко) поговорить о двух техниках: лассо и групповое лассо. Учитывая функцию риска, например риск линейной регрессии,

Лассо определяется добавлением штрафа к абсолютному значению коэффициентов β,

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

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

Групповое лассо. Итак, на помощь приходит групповое лассо. Групповое лассо строится как сумма квадратов коэффициентов, принадлежащих одной группе.

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

На изображении выше у нас есть простая задача с тремя коэффициентами, β₁
β₁₁ и β₁₂. Последние два коэффициента образуют группу, и, как мы видим, лассо (левое изображение) не учитывает эту информацию о группировке, но групповое лассо учитывает. Таким образом, групповое лассо можно рассматривать как лассо между группами и гребень внутри групп. Если группа имеет смысл, мы выбираем всю группу. Если нет - отправляем в ноль.

Разреженное групповое лассо: и, наконец, вот оно,

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

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

Переход на python: установка asgl

Начнем с установки asgl. Это легко сделать с помощью pip

pip install asgl

Или, как вариант, можно вытащить репозиторий github и запустить setup.py

git clone https://github.com/alvaromc317/asgl.git
cd asgl
python setup.py

Импортировать библиотеки

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

Здесь, помимо импорта набора данных, мы создали переменную с именем group_index. Эта переменная описывает групповую структуру данных, поэтому, если у нас есть 13 предикторов, group_index должна быть переменной длины 13, а если первые три предиктора образуют группу, они должны иметь одинаковое значение group_index. Однако набор данных BostonHousing не имеет естественной сгруппированной структуры, поэтому здесь мы определяем поддельный только для этой статьи.

Параметры для модели sgl

Если мы посмотрим на уравнение разреженного группового лассо выше, мы увидим, что есть два параметра, α и λ, которые можно оптимизировать. λ контролирует, какой вес мы хотим придать штрафу. , поэтому большие значения λ дают более разреженные решения. И α контролирует компромисс между лассо и групповым лассо. Значение α, равное 1, обеспечивает лассо, а значение α, равное 0, обеспечивает групповое лассо. Теперь, как правило, мы можем определить сетку возможных значений для обоих параметров и попытаться найти комбинацию, которая минимизирует ошибку.

Кроме того, мы указываем тип модели для решения (lm, потому что мы решаем линейную модель), штрафы (sgl, потому что мы хотим использовать разреженное групповое лассо), тип ошибки (MSE, потому что мы будем использовать среднее квадрат ошибки) и, наконец, мы можем указать, хотим ли мы запускать этот код последовательно или параллельно. Параллельное выполнение использует библиотеку multiprocess python и может решить проблему намного быстрее, чем последовательно.

Перекрестная проверка

Мы определили сетку из 23 возможных значений λ и 20 возможных значений α. Всего 460 комбинаций параметров. И мы собираемся найти оптимальную комбинацию с помощью перекрестной проверки (которая будет выполняться параллельно).

Итак, сначала мы определяем объект CV и подключаем всю информацию о параметрах, определенную выше. Затем мы запускаем функцию cross_validation(), которая возвращает ошибку, которую каждая из 460 моделей достигает на каждой из k складок.

При этом мы ищем значения параметров, которые минимизируют среднеквадратичную ошибку, и сохраняем их значения в optimal_lambda и optimal_alpha.

Вот так просто, мы нашли нашу оптимальную модель.

Получите последнюю ошибку

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

Сначала мы определяем объект ASGL, который будем использовать для подгонки простой модели разреженного группового лассо (без перекрестной проверки). Затем мы разбиваем данные на тест 70%, тренировка 30% с помощью функции train_test_split(), и подбираем модель так, чтобы получить окончательные оценки коэффициентов β (хранящиеся в final_beta_solution).

Учитывая новый набор данных, мы можем предсказать значение переменной ответа, используя функцию ASGL.predict(), и вычислить окончательную ошибку предсказания, используя набор тестов с функцией error_calculator.

И вот о том, как реализовать разреженное групповое лассо в Python. Надеюсь, вам понравился этот пост и он оказался полезным, поэтому следите за обновлениями для будущих публикаций в этой серии и, пожалуйста, не стесняйтесь обращаться ко мне, если у вас есть какие-либо вопросы / предложения.

Для более глубокого обзора того, что предлагает пакет asgl, я рекомендую прочитать записную книжку jupyter, предоставленную в репозитории github.

Хорошего дня!