Як виконати негативну регресію хребта?


10

Як виконати негативну регресію хребта? Негативне ласо доступне в scikit-learn, але для хребта я не можу застосувати бенегативність бета, і я дійсно отримую негативні коефіцієнти. Хтось знає, чому це?

Крім того, чи можу я реалізувати хребет з точки зору регулярних найменших квадратів? Перенесли це на інше запитання: чи можна реалізувати регресію хребта з точки зору регресії OLS?


1
Тут є два цілком ортогональних питання, я б розглядав питання про те, чи можу я реалізувати хребет з точки зору найменших квадратів, як окреме питання.
Метью Друрі

Відповіді:


8

Досить антикліматична відповідь на " Хто-небудь знає, чому це? " Полягає в тому, що просто ніхто не піклується про те, щоб реалізувати не негативний режим регресії хребта. Однією з головних причин є те, що люди вже розпочали впроваджувати ненегативні пружні сіткові процедури (наприклад, тут і тут ). Еластична сітка включає регресію хребта як особливий випадок (по суті, одна частина LASSO встановлює нульове зважування). Ці роботи відносно нові, тому вони ще не були включені в scikit-learn або подібний пакет загального використання. Можливо, ви захочете запитати авторів цих робіт для коду.

Редагувати:

Як @amoeba і я обговорювали коментарі, реальна реалізація цього питання відносно проста. Скажімо, у вас є така проблема регресії:

y=2x1x2+ϵ,ϵN(0,0.22)

де і - обидва стандартні нормалі, такі як: . Зверніть увагу: я використовую стандартизовані змінні прогнозів, тому мені не доведеться нормалізуватися після цього. Для простоти я також не включаю перехоплення. Ми можемо негайно вирішити цю проблему регресії за допомогою стандартної лінійної регресії. Тож у R має бути щось подібне:x1x2xpN(0,1)

rm(list = ls()); 
library(MASS); 
set.seed(123);
N = 1e6;
x1 = rnorm(N)
x2 = rnorm(N)
y = 2 * x1 - 1 * x2 + rnorm(N,sd = 0.2)

simpleLR = lm(y ~ -1 + x1 + x2 )
matrixX = model.matrix(simpleLR); # This is close to standardised
vectorY = y
all.equal(coef(simpleLR), qr.solve(matrixX, vectorY), tolerance = 1e-7)  # TRUE

Помітьте останній рядок. Майже всі лінійні регресійні процедури використовують розкладання QR для оцінки . Ми хотіли б використати те саме для нашої проблеми з регресією хребта. У цей момент прочитайте цю публікацію від @whuber; ми будемо проводити саме цю процедуру. Коротше кажучи, ми будемо доповнювати свою оригінальну матрицю проекту з діагональною матрицею та нашим вектором відповіді з нулями. Таким чином ми зможемо повторно висловити початкову проблему регресії хребта as деβXλIpyp(XTX+λI)1XTy(X¯TX¯)1X¯Ty¯¯символізує доповнений варіант. Перевірте слайди 18-19 з цих записок також на повноту, я знайшов їх досить просто. Тож у R нам би хотілося наступного:

myLambda = 100;  
simpleRR = lm.ridge(y ~ -1 + x1 + x2, lambda = myLambda)
newVecY = c(vectorY, rep(0, 2))
newMatX = rbind(matrixX, sqrt(myLambda) * diag(2))
all.equal(coef(simpleRR), qr.solve(newMatX, newVecY), tolerance = 1e-7)  # TRUE

і це працює. Добре, тому ми отримали регресійну частину хребта. Ми могли б вирішити іншим способом, але можемо сформулювати це як оптимізаційну задачу, де залишкова сума квадратів є функцією витрат, а потім оптимізувати її, тобто. . Впевнені, що ми можемо це зробити:minβ||y¯X¯β||22

myRSS <- function(X,y,b){ return( sum( (y - X%*%b)^2 ) ) }
bfgsOptim = optim(myRSS, par = c(1,1), X = newMatX, y= newVecY, 
                  method = 'L-BFGS-B')
all.equal(coef(simpleRR), bfgsOptim$par, check.attributes = FALSE, 
          tolerance = 1e-7) # TRUE

яка, як очікувалося, знову працює. Тому зараз ми просто хочемо: де . Яка просто та сама проблема оптимізації, але обмежена, щоб рішення не було негативним.minβ||y¯X¯β||22β0

bfgsOptimConst = optim(myRSS, par = c(1,1), X=newMatX, y= newVecY, 
                       method = 'L-BFGS-B', lower = c(0,0))
all(bfgsOptimConst$par >=0)  # TRUE
(bfgsOptimConst$par) # 2.000504 0.000000

з якого видно, що оригінальну задачу регресії хребта можна вирішити шляхом переформулювання як простої обмеженої задачі оптимізації. Деякі застереження:

  1. Я використовував (практично) нормовані змінні предиктора. Вам доведеться самостійно враховувати нормалізацію.
  2. Те ж саме стосується і відсутності нормалізації перехоплення.
  3. Я використовував optim«з L-BFGS-B аргумент. Це самий розв'язувач ванілі R, який приймає межі. Я впевнений, що ви знайдете десятки кращих вирішувачів.
  4. Загалом задачі лінійних найменших квадратів обмеження поставлені як завдання квадратичної оптимізації . Це надмірна робота для цієї посади, але майте на увазі, що ви можете отримати кращу швидкість, якщо потрібно.
  5. Як згадувалося в коментарях, ви можете пропустити регрес хребта як доповнену лінійно-регресійну частину і безпосередньо кодувати функцію витрат на хребет як проблему оптимізації. Це було б набагато простіше, і ця посада значно менша. Заради аргументу я додаю і це друге рішення.
  6. Я не повністю розмовляю в Python, але, по суті, ви можете повторити цю роботу, використовуючи lumg.solve NumPy і оптимізувати функції SciPy .
  7. Щоб вибрати гіперпараметр тощо, ви просто зробите звичайний крок CV, який ви зробили б у будь-якому випадку; нічого не змінюється.λ

Код для пункту 5:

myRidgeRSS <- function(X,y,b, lambda){ 
                return( sum( (y - X%*%b)^2 ) + lambda * sum(b^2) ) 
              }
bfgsOptimConst2 = optim(myRidgeRSS, par = c(1,1), X = matrixX, y = vectorY,
                        method = 'L-BFGS-B', lower = c(0,0), lambda = myLambda)
all(bfgsOptimConst2$par >0) # TRUE
(bfgsOptimConst2$par) # 2.000504 0.000000

1
Це дещо вводить в оману. Негативна регресія хребта є тривіальною для реалізації: можна переписати регресію хребта як звичайну регресію на розширені дані (див. Коментарі до stats.stackexchange.com/questions/203687 ), а потім використати негативні регресійні процедури.
амеба

Я погоджуюся, що це просто реалізувати (+1 до цього). (Раніше я підтримав ваш і коментар Глена щодо іншої теми). Питання в тому, чому це не реалізується, якщо це не важко. З цього приводу я сильно підозрюю, що безпосередньо формулюючи це завдання NNRR, проблема оптимізації є ще простішою, ніж спочатку формулювати її як розширення регресії даних, а потім використовувати Quad. Прог. оптимізація для вирішення цієї регресії. Я не сказав цього у своїй відповіді, тому що це ризикнуло б у частині реалізації.
usεr11852

Або просто напишіть його в квартирі.
Sycorax каже, що повернеться до Моніки

Ага, гаразд; Я зрозумів, що Q головним чином запитує, як зробити невід'ємний гребінь (і лише запитувати, чому він не реалізований мимохідь); Я навіть редагував, щоб укласти це в заголовок. У будь-якому випадку, як це зробити , мені здається, більш цікавим питанням. Якщо ви можете оновити свою відповідь поясненнями щодо того, як реалізувати негативний гребінь, я думаю, це буде дуже корисним для майбутніх читачів (і я буду радий звернутись :).
амеба

1
Класно, я зроблю це пізніше (нової назви я не помітив, вибачте про це). Я, мабуть, дам реалізацію з точки зору OLS / псевдоспостережень, тому ми відповімо і на інше питання.
usεr11852

4

R пакет glmnet, який реалізує еластичну сітку, і тому lasso та ridge це дозволяють. За допомогою параметрів lower.limitsі upper.limits, ви можете встановити мінімальне або максимальне значення для кожної ваги окремо, тому якщо встановити нижню межу до 0, вона виконає негативну пружну сітку (ласо / гребінь).

Також є обгортка python https://pypi.python.org/pypi/glmnet/2.0.0


2

Нагадаємо, ми намагаємося вирішити:

minimizexAxy22+λx22s.t. x>0

еквівалентно:

minimizexAxy22+λxIxs.t. x>0

з ще деякою алгеброю:

minimizexxT(ATA+λI)x+(2ATy)Txs.t. x>0

Рішення в псевдопітоні просто зробити:

Q = A'A + lambda*I
c = - A'y
x,_ = scipy.optimize.nnls(Q,c)

див.: Як можна робити розріджені негативні найменші квадрати, використовуючи регуляризатори форми ?KxRkx

для трохи більш загальної відповіді.


Чи повинен рядок c = - A'y не читати c = A'y? Я думаю, що це правильно, хоча слід зазначити, що рішення дещо відрізняється від scipy.optimize.nnls (newMatX, newVecY), де newMatX - це X рядок, доповнений діагональною матрицею з sqrt (лямбда) уздовж діагоналі, а NewVecY - Y доповнений нульовими нулями. Я думаю, що рішення, яке ви згадуєте, є правильним ...
Том Вензелерс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.