R - Регресія Лассо - різна лямбда на регресора


11

Я хочу зробити наступне:

1) регресія OLS (без терміну пеналізації) для отримання бета-коефіцієнтів ; позначає змінні, які використовуються для регресування. Я роблю це мимоbjj

lm.model = lm(y~ 0 + x)
betas    = coefficients(lm.model)

2) Регресія Лассо зі строком пеналізації критеріями відбору є Байєсові інформаційні критерії (BIC), задані

λj=log(T)T|bj|

де j означає число змінної / регресора, T - кількість спостережень, а bj для початкових бета, отриманих на кроці 1). Я хочу мати результати регресії для цього конкретного значення λj , яке відрізняється для кожного використовуваного регресора. Отже, якщо є три змінні, будуть три різні значення λj .

Проблему оптимізації OLS-Lasso потім задає

minbϵRn={t=1T(ytbXt)2+Tj=1m(λt|bj|)}

Як я можу це зробити в R за допомогою пакета lars або glmnet? Я не можу знайти спосіб вказати лямбда, і я не впевнений на 100%, якщо отримаю правильні результати, якщо запустити

lars.model <- lars(x,y,type = "lasso", intercept = FALSE)
predict.lars(lars.model, type="coefficients", mode="lambda")

Я вдячний за будь-яку допомогу тут.


Оновлення:

Зараз я використав такий код:

fits.cv = cv.glmnet(x,y,type="mse",penalty.factor = pnlty)
lmin    = as.numeric(fits.cv[9]) #lambda.min
fits    = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty)
coef    = coef(fits, s = lmin)

У рядку 1 я використовую перехресну валідацію зі своїм визначеним коефіцієнтом штрафу ( ), який відрізняється для кожного регресора . Рядок 2 вибирає "lambda.min" з fits.cv, що є лямбда, яка дає мінімальну середню помилку перехресної перевірки. Рядок 3 виконує відповідність ласо ( ) на даних. Знову я використав коефіцієнт штрафу . Рядок 4 витягує коефіцієнти з пристосувань, які належать до "оптимального" обраного у рядку.λλλj=log(T)T|bj|alpha=1λλ

Тепер у мене є бета-коефіцієнти для регресорів, які зображують оптимальне рішення задачі мінімізації

minbϵRn={t=1T(ytbXt)2+Tj=1m(λt|bj|)}

зі штрафним коефіцієнтом . Оптимальний набір коефіцієнтів - це, швидше за все, підмножина регресорів, які я спочатку використовував, це наслідок методу Лассо, який зменшує кількість використаних регресорів.λj=log(T)T|bj|

Чи правильне моє розуміння та код?


2
Ви можете використовувати розмітку LATEX у своїй посаді, додану до знаків долара. $\alpha$стає . Будь ласка, зробіть це, оскільки це зробить людей легшими зрозуміти ваше запитання, а тому відповісти на нього. α
Sycorax повідомляє про відновлення Моніки

Відповіді:


15

З glmnetдокументації ( ?glmnet) ми бачимо, що можна виконати диференціальну усадку. Це дає нам принаймні частково відповісти на питання ОП.

penalty.factor: До кожного коефіцієнта можуть застосовуватися окремі штрафні коефіцієнти. Це число, яке множиться, lambdaщоб дозволити різницю усадки. Для деяких змінних може бути 0, що означає відсутність усадки, і ця змінна завжди включена в модель. За замовчуванням - 1 для всіх змінних (і неявно нескінченна для змінних, перелічених у exclude). Примітка: штрафні коефіцієнти внутрішньо перераховуються на суму nvars, і lambdaпослідовність відображатиме цю зміну.

Однак, щоб повністю відповісти на питання, я думаю, що вам доступні два підходи, залежно від того, що ви хочете виконати.

  1. Ваше питання полягає в тому, як застосувати різницю скорочення glmnetі отримати коефіцієнти для певного значення . Поставлення st деяких значень не 1 досягає диференціальної усадки при будь-якому значенні . Щоб досягти усадки, усадка для кожного є , нам просто потрібно зробити алгебру. Нехай - коефіцієнт штрафу для , до чого буде поставлено . З документації видно, що ці значення переосмислюються коефіцієнтом st . Це означає, щоλ b j ϕ j = log Tλpenalty.factorλbjϕjbjCϕj=ϕj m=C m j = 1 logTϕj=logTT|bj|ϕjbjpenalty.factorCϕj=ϕjϕj ϕjCϕj λ=1m=Cj=1mlogTT|bj|ϕjзамінює у нижченаведеному виразі оптимізації. Тому вирішіть для , значення до , а потім витягніть коефіцієнти для . Я б рекомендував використовувати .ϕjCϕjglmnetλ=1coef(model, s=1, exact=T)

  2. Другий - це "стандартний" спосіб використання glmnet: один виконує повторну кратну перехресну перевірку для вибору таким чином, щоб ви мінімізували позапробний MSE. Це я описав нижче більш докладно. Причина, по якій ми використовуємо CV та перевірку зразка MSE, полягає в тому, що MSE у вибірці завжди буде мінімізовано для , тобто є звичайним MLE. Використання CV під час зміни дозволяє оцінити, як модель працює на вибіркових даних, і вибрати оптимальну (у конкретному сенсі) .λ λ = 0 b λ λkλλ=0bλλ

Цей glmnetвиклик не вказує (і не повинен, оскільки він обчислює всю траєкторію за замовчуванням з причин продуктивності). буде повертати коефіцієнти для значення . Але незалежно від вибору ви надаєте, результат відображатиме різницю покарання, яке ви застосували у виклику, щоб відповідати моделі.λ λ λλλcoef(fits,s=something)λsomethingλ

Стандартним способом вибору оптимального значення є використання , а не використання . Перехресна перевірка використовується для вибору кількості усадки, яка мінімізує помилки, що не виникають у вибірці, а специфікація зменшить деякі функції більше, ніж інші, відповідно до вашої схеми зважування.λcv.glmnetglmnetpenalty.factor

Ця процедура оптимізує

minbRmt=1T(ytbXt)2+λj=1m(ϕj|bj|)

де - коефіцієнт штрафу для функції (що ви надаєте в аргументі). (Це трохи відрізняється від вашого виразу оптимізації; зауважте, що деякі підписки різні.) Зауважте, що термін однаковий у всіх функціях, тому єдиний спосіб, коли деякі функції скорочуються більше, ніж інші, через . Важливо, що та не однакові; скалярний, а - вектор! У цьому виразі фіксується / вважається відомим; тобто оптимізація вибере оптимальне , а не оптимальнеj t h λ ϕ j λ ϕ λ ϕ λ b λϕjjthpenalty.factorλϕjλϕλϕλbλ.

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


+1 Це правильно. Я також додам, що регуляризацію регресії можна розглядати як байєсівську попередню, тобто максимум a posteriori (MAP) є регуляризованою максимальною живучістю (ML). Робота в цих рамках дає собі більше гнучкості в регуляризації, якщо це буде потрібно.
TLJ

Якщо я запускаю, pnlty = log(24)/(24*betas); fits = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty) як мені потім витягти регресорні бета-версії, які відповідають лямбда, яку я вказав, оскільки лямбда відрізняється для кожного фактору ризику?
Дом

1
@Dom На мене настав трохи пізно, що існує очевидний спосіб отримати саме те, що ви хочете використовувати glmnet. Дивіться мою переглянуту відповідь.
Sycorax каже, що повернеться до Моніки

2
Остерігайтеся налаштування штрафу окремо для кожного прогнозованого. Це може означати не більше, ніж ступінчастий вибір у деяких випадках. Пеніалізована регресія зменшує середню квадратичну помилку, приймаючи дуже обмежену кількість штрафних параметрів та запозичуючи інформацію у прогнозів.
Френк Харрелл

2
@FrankHarrell Дякую за коментар! Здається, що використання різних штрафних санкцій для кожного прогноктора становить байєсівську модель, яка передбачає різний попередній для кожного параметра. Це не вражає мене тим, що створює унікальну небезпеку для байєсівського умовиводу взагалі. Крім того, ви могли б детальніше розглянути питання про те, яким чином санкціонована регресія запозичує інформацію серед прогнозів? Я не впевнений, що я повністю розумію, як це відбувається в такому сценарії.
Sycorax каже, що поверніть Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.