Интерфейс формулы для glmnet

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

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

  • Есть ли проблемы, которые усложняют использование интерфейса формул/данных с помощью эластичных сетевых моделей? (Я знаю стандартизацию и фиктивные переменные, а широкие наборы данных, возможно, требуют разреженных матриц модели.)
  • Существует ли какой-либо существующий пакет?

Ответ 1

Ну, похоже, что нет встроенного интерфейса формул, поэтому я пошел вперед и сделал свой собственный. Вы можете скачать его из Github: https://github.com/Hong-Revo/glmnetUtils

Или в R, используя devtools::install_github:

install.packages("devtools")
library(devtools)
install_github("hong-revo/glmnetUtils")
library(glmnetUtils)

Из файла readme:

Некоторые функции качества жизни для оптимизации процесса подгонки эластичные сетевые модели с glmnet, в частности:

  • glmnet.formula предоставляет интерфейс структуры данных/данных для glmnet.
  • cv.glmnet.formula делает аналогичную вещь для cv.glmnet.
  • Методы для predict и coef для обоих вышеперечисленных.
  • Функция cvAlpha.glmnet для выбора параметров альфа и лямбда посредством кросс-валидации, следуя подходу, описанному в страницу справки для cv.glmnet. Опционально перекрестная проверка в параллельны друг другу.
  • Методы для plot, predict и coef для вышеуказанного.

Кстати, при написании вышеизложенного, я думаю, я понял, почему никто не делал этого раньше. Центральная обработка R кадров модели и модельных матриц - это объект terms, который включает в себя матрицу с одной строкой на переменную и один столбец на главный эффект и взаимодействие. По сути, это (как минимум) примерно p x p матрица, где p - количество переменных в модели. Когда p - 16000, что является общим в наши дни с широкими данными, результирующая матрица имеет размер около гигабайта.

Тем не менее, у меня не было никаких проблем (пока), работающих с этими объектами. Если это станет серьезной проблемой, я увижу, могу ли я найти обходной путь.


Обновление Oct-2016

Я поставил обновление для репо, чтобы решить вышеупомянутую проблему, а также связанную с факторами. Из документации:

Существует два способа, с помощью которых glmnetUtils может генерировать модельную матрицу из формулы и кадра данных. Первый заключается в использовании стандартной машины R, содержащей model.frame и model.matrix; а вторая - построить матрицу по одной переменной за раз. Эти варианты обсуждаются и сравниваются ниже.

Использование model.frame

Это более простой вариант и тот, который наиболее совместим с другими функциями моделирования R. Функция model.frame принимает формулу и фрейм данных и возвращает модельный кадр: кадр данных со специальной информацией, которая позволяет R понимать термины в формуле. Например, если формула включает в себя термин взаимодействия, модельный кадр будет определять, какие столбцы в данных относятся к взаимодействию, и как их следует обрабатывать. Аналогично, если формула включает выражения типа exp(x) или I(x^2) в RHS, model.frame будет оценивать эти выражения и включать их в вывод.

Основным недостатком использования model.frame является то, что он генерирует объект терминов, который кодирует, как организованы переменные и взаимодействия. Одним из атрибутов этого объекта является матрица с одной строкой на переменную и один столбец на главный эффект и взаимодействие. Как минимум, это (приблизительно) квадратная матрица p x p, где p - количество основных эффектов в модели. Для широких наборов данных с p > 10000 эта матрица может достигать или превышать размер гигабайта. Даже если для хранения такого объекта достаточно памяти, генерация матрицы модели может занять значительное количество времени.

Другой проблемой стандартного подхода R является обработка факторов. Обычно model.matrix превратит фактор N-уровня в матрицу индикаторов с столбцами N-1, при этом один столбец будет отброшен. Это необходимо для нерегулируемых моделей в соответствии с lm и glm, так как полный набор из N столбцов является линейно зависимым. При обычных контрастах обработки интерпретация заключается в том, что столбец с отбрасыванием представляет собой базовый уровень, тогда как коэффициенты для других столбцов представляют собой разницу в ответе относительно базовой линии.

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

Вручную построение матрицы модели

Чтобы справиться с вышеперечисленными проблемами, glmnetUtils по умолчанию будет избегать использования model.frame, вместо этого построив модельную матрицу в терминах. Это позволяет избежать затрат памяти на создание объекта terms и может быть заметно быстрее, чем стандартный подход. Он также будет включать один столбец в матрице моделей для всех уровней в коэффициенте; то есть базовый уровень не предполагается. В этой ситуации коэффициенты представляют собой различия от общего среднего отклика, а их сокращение до нуля имеет смысл (обычно).

Основной недостаток использования model.frame заключается в том, что формула может быть только относительно простой. В настоящий момент только простые формулы, такие как y ~ x1 + x2 + ... + x_p, обрабатываются кодом, где x - это столбцы, уже присутствующие в данных. Термины взаимодействия и вычисленные выражения не поддерживаются. По возможности, вы должны заранее вычислить такие выражения.


Обновление Apr-2017

После нескольких икота это, наконец, в CRAN.