РЕДАКТИРАНЕ: Както Dwin посочи в коментарите, кодът по-долу не е за ROC крива. ROC кривата трябва да бъде индексирана във вариант в t
, а не в lambda
(както аз правя по-долу). Ще редактирам кода по-долу, когато имам възможност.
По-долу е моят опит да създам ROC крива на glmnet, предвиждаща двоичен резултат. Симулирах матрица, която приближава резултатите от glmnet в кода по-долу. Както някои от вас знаят, при дадена n x p матрица от входове, glmnet извежда n x 100 матрица от прогнозирани вероятности [$\Pr (y_i = 1)$] за 100 различни стойности на ламбда. Резултатът ще бъде по-тесен от 100, ако по-нататъшните промени в ламбда спрат да увеличават силата на прогнозиране. Симулираната матрица на прогнозираните вероятности на glmnet по-долу е матрица 250x69.
Първо, има ли по-лесен начин за начертаване на ROC крива на glmnet? Второ, ако не, подходът по-долу изглежда ли правилен? Трето, грижа ли ме е да начертая (1) вероятността от фалшиви/истински положителни резултати ИЛИ (2) просто наблюдаваната честота на фалшиви/истински положителни резултати?
set.seed(06511)
# Simulate predictions matrix
phat = as.matrix(rnorm(250,mean=0.35, sd = 0.12))
lambda_effect = as.matrix(seq(from = 1.01, to = 1.35, by = 0.005))
phat = phat %*% t(lambda_effect)
#Choose a cut-point
t = 0.5
#Define a predictions matrix
predictions = ifelse(phat >= t, 1, 0)
##Simulate y matrix
y_phat = apply(phat, 1, mean) + rnorm(250,0.05,0.10)
y_obs = ifelse(y_phat >= 0.55, 1, 0)
#percentage of 1 observations in the validation set,
p = length(which(y_obs==1))/length(y_obs)
# dim(testframe2_e2)
#probability of the model predicting 1 while the true value of the observation is 0,
apply(predictions, 1, sum)
## Count false positives for each model
## False pos ==1, correct == 0, false neg == -1
error_mat = predictions - y_obs
## Define a matrix that isolates false positives
error_mat_fp = ifelse(error_mat ==1, 1, 0)
false_pos_rate = apply(error_mat_fp, 2, sum)/length(y_obs)
# Count true positives for each model
## True pos == 2, mistakes == 1, true neg == 0
error_mat2 = predictions + y_obs
## Isolate true positives
error_mat_tp = ifelse(error_mat2 ==2, 1, 0)
true_pos_rate = apply(error_mat_tp, 2, sum)/length(y_obs)
## Do I care about (1) this probability OR (2) simply the observed rate?
## (1)
#probability of false-positive,
p_fp = false_pos_rate/(1-p)
#probability of true-positive,
p_tp = true_pos_rate/p
#plot the ROC,
plot(p_fp, p_tp)
## (2)
plot(false_pos_rate, true_pos_rate)
Има един въпрос относно това в SO, но отговорът беше груб и не съвсем правилен: glmnet lasso ROC диаграми
t
? - person Dr. Beeblebrox   schedule 08.08.2013