Как выполнить неотрицательную ребристую регрессию? Доступно неотрицательное лассо scikit-learn
, но для риджа я не могу навязать неотрицательность бета-версий, и действительно, я получаю отрицательные коэффициенты. Кто-нибудь знает, почему это?
Кроме того, могу ли я реализовать ребро с точки зрения регулярных наименьших квадратов? Перенес это на другой вопрос: могу ли я реализовать регрессию гребня с точки зрения регрессии OLS?
Ответы:
Весьма антиклиматический ответ на вопрос « Кто-нибудь знает, почему это так? » Заключается в том, что просто никто не заботится о том, чтобы реализовать процедуру отрицательной регрессии гребня. Одна из основных причин заключается в том, что люди уже начали внедрять подпрограммы неотрицательных эластичных сетей (например, здесь и здесь ). Эластичная сеть включает в себя регрессию гребня как особый случай (по существу, для детали LASSO задается нулевой вес). Эти работы являются относительно новыми, поэтому они еще не включены в scikit-learn или аналогичный пакет общего пользования. Возможно, вы захотите спросить авторов этих документов для кода.
РЕДАКТИРОВАТЬ:
Поскольку @amoeba и я обсуждали комментарии, фактическая реализация этого относительно проста. Скажем, у кого-то есть следующая проблема регрессии:
где и оба являются стандартными нормалями, такими как: . Обратите внимание, что я использую стандартизированные переменные предиктора, поэтому мне не нужно нормализовать потом. Для простоты я также не включаю перехват. Мы можем немедленно решить эту проблему регрессии, используя стандартную линейную регрессию. Так что в R это должно быть примерно так:x 2 x p ∼ N ( 0 , 1 )x1 x2 xp∼N(0,1)
Обратите внимание на последнюю строку. Почти все процедуры линейной регрессии используют QR-разложение для оценки . Мы хотели бы использовать то же самое для нашей задачи регрессии гребня. На данный момент прочитайте этот пост @whuber; мы будем реализовывать именно эту процедуру. Короче говоря, мы будем расширять нашу оригинальную конструкцию матрицы с диагональная матрица и наш ответ вектор с нулей. Таким образом, мы сможем повторно выразить исходную проблему регрессии гребня как гдеX √β X yp(XTX+λI) - 1 XTy( ˉ X T ˉ X ) - 1 ˉ X T ˉ y ¯λ−−√Ip y p (XTX+λI)−1XTy (X¯TX¯)−1X¯Ty¯ ¯ символизирует дополненную версию. Проверьте полноты слайдов 18-19 из этих заметок , я нашел их довольно простыми. Таким образом, в R мы хотели бы следующее:
и это работает. Итак, мы получили часть регрессии гребня. Мы могли бы решить по-другому, хотя, мы могли бы сформулировать это как задачу оптимизации, где остаточная сумма квадратов является функцией стоимости, а затем оптимизировать ее, т.е. . Конечно же, мы можем сделать это:minβ||y¯−X¯β||22
который, как и ожидалось, снова работает. Так что теперь мы просто хотим: где . Это просто та же самая проблема оптимизации, но ограниченная, так что решение неотрицательно.minβ||y¯−X¯β||22 β≥0
которая показывает, что исходную задачу неотрицательной регрессии гребня можно решить, переформулировав ее как простую ограниченную задачу оптимизации. Некоторые предостережения:
optim
«с L-BFGS-B аргумент. Это самый ванильный R решатель, который принимает границы. Я уверен, что вы найдете десятки лучших решателей.Код для пункта 5:
источник
Пакет R glmnet, который реализует эластичную сеть и, следовательно, лассо и гребень, позволяет это. С помощью параметров
lower.limits
иupper.limits
можно установить минимальное или максимальное значение для каждого веса в отдельности, поэтому, если вы установите нижние пределы на 0, он будет выполнять неотрицательную эластичную сеть (лассо / гребень).Существует также оболочка Python https://pypi.python.org/pypi/glmnet/2.0.0
источник
Напомним, мы пытаемся решить:
эквивалентно:
с еще немного алгебры:
Решение в псевдо-питоне просто сделать:
см .: Как можно сделать разреженные неотрицательные наименьшие квадраты, используя регуляризаторов вида ?K x⊤Rkx
для чуть более общего ответа.
источник