glmnet lasso диаграммы ROC

Я использовал k-кратную перекрестную проверку в glmnet (которая реализует лассо-регрессию), но я не могу сделать ROC-диаграммы из этого.

library(glmnet)
glm_net <- cv.glmnet(dev_x_matrix,dev_y_vector,family="binomial",type.measure="class")
phat <- predict(glm_net,newx=val_x_matrix,s="lambda.min")

Это дает мне вектор, который выглядит как журнал подогнанных значений. После этого я пытался создать несколько ROC-диаграмм, но это не сработало. Я думаю, это из-за природы объектов x и y, которые входят в glmnet. Есть ли у вас какие-либо идеи.


person Dee    schedule 06.07.2012    source источник
comment
Пакет ROCR не работает? Если нет, то в чем конкретно проблема?   -  person smci    schedule 08.03.2014


Ответы (2)


require("glmnet")

Просто измените меру, и вы получите AUC. Это не кривая ROC, но предоставляет эквивалентную информацию.

glm_net <- cv.glmnet(x, y, family="binomial", type.measure="auc")
plot(glm_net)

Вот пример модели, которую я тренирую, просто чтобы показать, как она выглядит. КСТАТИ. Алгоритм очень быстрый!

введите здесь описание изображения

Дополнительные методы визуализации модели см. в пакете ROCr.

person marbel    schedule 03.04.2014

Я предполагаю, что у вас есть бинарные наблюдения в наборе {0,1}.

Вы можете преобразовать прогнозируемые значения в переменной phat в диапазон [0, 1], используя функцию логита:

phat_new = exp(phat)/(1+exp(phat))

Теперь вы знаете, каково прогнозируемое значение, phat_new, истинное значение наблюдений, val_y_matrix и процент единиц в вашем наборе проверочных данных, p. Один из способов построения ROC следующий:

исправить т. Это порог отсечки (в [0,1]) для модели. Вычислите следующее:

# percentage of 1 observations in the validation set, 
p = length(which(val_y_matrix==1))/length(val_y_matrix)

# probability of the model predicting 1 while the true value of the observation is 0, 
p_01 = sum(1*(phat_new>=t & val_y_matrix==0))/dim(val_x_matrix)[1] 

# probability of the model predicting 1 when the true value of the observation is 1, 
p_11 = sum(1*(phat_new>=t & val_y_matrix==1))/dim(val_x_matrix)[1]

# probability of false-positive, 
p_fp = p_01/(1-p)

# probability of true-positive, 
p_tp = p_11/p

# plot the ROC, 
plot(p_fp, p_tp)

Интересно, есть ли лучший способ сделать это. Например, если вы используете деревья классификации, вы можете указать матрицу потерь в качестве входных данных для модели, и модель, которую вы получите, будет отличаться в зависимости от соотношения затрат вашей матрицы потерь. Это означает, что, изменяя соотношение затрат, вы получите разные модели, и разные модели будут разными точками на кривой ROC.

person user1521587    schedule 12.07.2012