Использование кривой RO C для нахождения оптимального отсечения для моей взвешенной двоичной регрессии logisti c (glm) в R - PullRequest
1 голос
/ 22 марта 2020

Я построил бинарную логистическую c регрессию для прогнозирования оттока в Rstudio. Из-за несбалансированных данных, используемых для этой модели, я также включил веса. Затем я попытался найти оптимальное срезание методом проб и ошибок, однако для завершения своего исследования мне пришлось включить кривые RO C, чтобы найти оптимальное срезание. Ниже я предоставил скрипт, который использовал для построения модели (fit2). Вес сохраняется в «W». Это говорит о том, что стоимость ошибочной идентификации заменителя в 14 раз превышает стоимость ошибочной идентификации заменителя.

#CH1 logistic regression

library(caret)
W = 14
lvl = levels(trainingset$CH1)
print(lvl)
#if positive we give it the defined weight, otherwise set it to 1
fit_wts = ifelse(trainingset$CH1==lvl[2],W,1)
fit2 = glm(CH1 ~ RET + ORD + LVB + REVA + OPEN + REV2KF + CAL + PSIZEF + COM_P_C + PEN + SHOP, data = trainingset, weight=fit_wts, family=binomial(link='logit'))
# we test it on the test set
predlog1 = ifelse(predict(fit2,testset,type="response")>0.5,lvl[2],lvl[1])
predlog1 = factor(predlog1,levels=lvl)
predlog1
confusionMatrix(pred,testset$CH1,positive=lvl[2])

Для этого исследования я также построил кривые RO C для деревьев решений с использованием пакета pRO C. Однако, конечно, тот же сценарий не работает одинаково для регрессии logisti c. Я создал кривую RO C для регрессии logisti c, используя приведенный ниже скрипт.

prob=predict(fit2, testset, type=c("response"))
testset$prob=prob
library(pROC)
g <- roc(CH1 ~ prob, data = testset, )
g
plot(g)

Что привело к приведенной ниже кривой RO C.

enter image description here

Как получить оптимальное сечение по этой кривой RO C?

1 Ответ

0 голосов
/ 23 марта 2020

Получение «оптимального» среза полностью не зависит от типа модели, поэтому вы можете получить его, как и для любого другого типа модели с pRO C. С помощью функции coords:

 coords(g, "best", transpose = FALSE)

Или непосредственно на графике:

plot(g, print.thres=TRUE)

Теперь вышеприведенное просто максимизирует сумму чувствительности и специфичности. Это часто слишком просто c, и вам, вероятно, нужно четкое определение «оптимального», которое адаптировано к вашему варианту использования. Это в основном выходит за рамки этого вопроса, но в качестве отправной точки вы должны взглянуть на раздел «Лучшие пороги» документации по функции координат для некоторых базовых c вариантов.

...