Как обучить (логистическую?) Регрессию в R с использованием функции потерь L1?

11

Я могу обучить логистической регрессии в Rиспользовании

glm(y ~ x, family=binomial(logit)))

но, IIUC, это оптимизирует для логарифмической вероятности.

Есть ли способ обучить модель, используя линейную ( ) функцию потерь (которая в этом случае такая же, как общее расстояние изменения )?L1

Т.е., учитывая числовой вектор и битовый (логический) вектор , я хочу построить монотонную (фактически возрастающую) функцию такую, чтосводится к минимумуxyf|f(x)y|

Смотрите также

ДСН
источник
То, что вы хотите, не существует, и быть тупым, это не имеет особого смысла. Мы можем обсудить альтернативы, но вам нужно более подробно изложить, что вы пытаетесь сделать. Почему вы хотите соответствовать логистической модели с потерей L1?
user603
@ user603: Потому что я хочу оценить свою модель с помощью TVD
sds
Похоже, вы говорите о подгонке логистической кривой к данным, а не о подгонке биномиально распределенных данных, то есть о форме нелинейной регрессии , но с использованием а не нормы. Действительно, функция потерьпредполагает, что максимум не равен (если это так, он делает ссылку на биномиальный GLM, вводящий в заблуждение). С другой стороны, если он действительно будет ограничен до 0-1, функция потерь не имеет смысла. Можете ли вы дать подробную информацию о вашей реальной ситуации, пожалуйста? L 2| f ( x ) - y | 1L1L2|f(x)y|1
Glen_b
Обратите внимание, что справка требует, чтобы вы не пересекали один и тот же вопрос на нескольких сайтах, а вместо этого выбирали один сайт. Если вы позже передумаете о том, какой сайт лучше, пометьте его для внимания модератора и попросите перенести его.
Glen_b
@Glen_b: Я думаю, что «битовый (логический) вектор y» подразумевает ответ 0/1.
SDS

Ответы:

21

То, что вы хотите сделать, не существует, потому что это, из-за отсутствия лучшего слова, математически ошибочно.

Но сначала я подчеркну, почему я считаю, что предпосылки вашего вопроса обоснованы. Затем я попытаюсь объяснить, почему я думаю, что выводы, которые вы из них делаете, основаны на неправильном понимании логистической модели, и, наконец, я предложу альтернативный подход.

Я буду обозначать ваших наблюдений (более жирные буквы обозначают векторы), которые лежат в мерном пространстве (первая запись в равна 1) с , и является монотонной функцией , скажем, как логистическая кривая исправить идеи. Для целесообразности, я просто предположу , что является достаточно большой по сравнению с . np x{(xxi,yi)}i=1nnp p<n y i[0,1]f( xxxip<nyi[0,1]xf(xxi)=f(xxiββ) n pxxiββnp

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

ββ=argminββRp||yyf(xxiββ)||1

Проблема в ошибке : и если мы (мы просто хотим, чтобы наша модель была асимптотически несмещенной ), тогда должен быть гетероскедастичным . Это потому, что может принимать только два значения, 0 и 1. Поэтому, учитывая, что , также может принимать только два значения: когда , что происходит с вероятностью и когдаϵi=yif(xxiββ)E(ϵϵ)=0ϵi yixxiϵi1f(xxiββ)yi=1f(xxiββ)f(xxiββ)yi=1, что происходит с вероятностью .1f(xxiββ)

Эти соображения вместе подразумевают, что:

var(ϵϵ)=E(ϵϵ2)=(1f(xxββ))2f(xxββ)+(f(xxββ))2(1f(xxββ))=(1f(xxββ))f(xxββ)=E(yy|xx)E(1yy|xx)

следовательно, не является константой, но имеет вогнутую форму параболы и максимизируется, когда такова, что .var(ϵϵ)xxE(y|xx).5

Эта неотъемлемая гетероскедастичность остатков имеет последствия . Это подразумевает, среди прочего, что при минимизации потерь вы асимптотически часть вашей выборки. То есть подогнанная не помещается в данные вообще, а только в той части, которая сгруппирована вокруг мест, где такова, что . То есть это наименее информативные точки данных в вашей выборке : они соответствуют тем наблюдениям, для которых шумовая составляющая является самой большой. Следовательно, ваше соответствие подтягивается к , например, не имеет значения.l1ββxxE(yy|xx).5ββ=ββ:f(xxββ).5

Как видно из приведенного выше описания, одно из решений состоит в том, чтобы отменить требование непредвзятости. Популярный способ смещения оценки (с приложением некоторой байесовской интерпретации) состоит в том, чтобы включить термин усадки. Если мы изменим масштаб ответа:

yi+=2(yi.5),1in

и для вычислительной целесообразности замените другой монотонной функцией --Оно будет удобно продолжение , чтобы обозначить первую компоненту вектора параметра , как , а остальных из них - и включает в себя термин усадки (например , одного вида ), в результате возникает проблема оптимизации:f(xxββ)g(xx,[c,γγ])=xx[c,γγ]cp1γγ||γγ||2

[c,γγ]=argmin[[c,γγ]Rpi=1nmax(0,1yi+xxi[[c,γγ])+12||γγ||2

Обратите внимание, что в этой новой (также выпуклой) задаче оптимизации штраф за правильно классифицированные наблюдения равен 0, и он растет линейно с для неправильно классифицированной - как в потеря. Решением этой второй задачей оптимизации является знаменитым линейным SVM (с совершенным разделением) коэффициентами. В отличие от , имеет смысл выучить эти из данных со штрафом типа TVD ('type' из-за термина смещения) , Следовательно, это решение широко реализовано. Смотрите, например, R пакет LiblineaR .xx[[c,γ]l1[c,γγ]ββ[c,γγ]

user603
источник
Я хотел бы дать вам более 25 баллов :-)
SDS
@sds; спасибо: это был отличный вопрос :) Я вернусь в течение дня и заполню детали, исправлю опечатку.
user603
8

Я не уверен, почему вы хотели бы использовать потерю L1 для чего-то ограниченного от 0 до 1. В зависимости от вашей цели, вы можете вместо этого рассмотреть что-то вроде потери шарнира, которая аналогична потере L1 в одном направлении и плоскости в другом.

В любом случае код ниже должен делать то, что вы просили. Обратите внимание, что оптимальный ответ - это в основном пошаговая функция.

set.seed(1)

# Fake data
x = seq(-1, 1, length = 100)
y = rbinom(100, plogis(x), size = 1) # plogis is the logistic function

# L1 loss
loss = function(y, yhat){
  sum(abs(y - yhat))
}

# Function to estimate loss associated with a given slope & intercept
fn = function(par){
  a = par[1]
  b = par[2]
  loss(y = y, yhat = plogis(a + b * x))
}

# Find the optimal parameters
par = optim(
  par = c(a = 0, b = 0),
  fn = fn
)$par

# Plot the results
plot(y ~ x)
curve(plogis(par[1] + par[2] * x), add = TRUE, n = 1000)
Дэвид Дж. Харрис
источник
0

Вы можете использовать пакет glmnet для установки моделей L1, L2. Это не ограничивается логистической регрессией, но включает ее.

Вот виньетка: http://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html

Существует также веб-семинар: https://www.youtube.com/watch?v=BU2gjoLPfDc

Liblinear хорош, но я нашел glmnet легче начать. Glmnet включает в себя функцию, которая выполняет перекрестную проверку и выбирает для вас параметр регуляризации на основе различных метрик, таких как AUC.

Что касается теории, я бы прочитал статью Тибшиарини о лассо (регуляризация L1) и главу, посвященную элементам статистического обучения. http://statweb.stanford.edu/~tibs/lasso/lasso.pdf

По поводу потери лога, это просто для оценки моделей. Это не функция потерь для подгонки модели.

Marbel
источник