Оценка статистической модели в R

У меня очень большой набор данных (ds). Один из его столбцов — Popularity, тип factor («Высокий»/«Низкий»).

Я разделил данные на 70% и 30%, чтобы создать обучающий набор (ds_tr) и тестовый набор (ds_te).

Я создал следующую модель, используя логистическую регрессию:

mdl <- glm(formula = popularity ~ . -url , family= "binomial", data = ds_tr )

затем я создал объект predict (сделаю это снова для ds_te)

y_hat = predict(mdl, data = ds_tr - url , type = 'response')

Я хочу найти значение точности, соответствующее порогу отсечки 0,5, и найти значение отзыва, соответствующее порогу отсечки 0,5, поэтому я сделал:

library(ROCR)
pred <- prediction(y_hat, ds_tr$popularity)
perf <- performance(pred, "prec", "rec")

Результатом является таблица многих значений

str(perf)

Formal class 'performance' [package "ROCR"] with 6 slots
  ..@ x.name      : chr "Recall"
  ..@ y.name      : chr "Precision"
  ..@ alpha.name  : chr "Cutoff"
  ..@ x.values    :List of 1
  .. ..$ : num [1:27779] 0.00 7.71e-05 7.71e-05 1.54e-04 2.31e-04 ...
  ..@ y.values    :List of 1
  .. ..$ : num [1:27779] NaN 1 0.5 0.667 0.75 ...
  ..@ alpha.values:List of 1
  .. ..$ : num [1:27779] Inf 0.97 0.895 0.89 0.887 ...

Как найти конкретные значения точности и полноты, соответствующие порогу отсечки 0,5?


person user2878881    schedule 03.01.2016    source источник
comment
Улучшите объяснение и объясните, как получить запрошенное значение.   -  person PereG    schedule 04.01.2016


Ответы (1)


Доступ к слотам объекта производительности (через комбинацию @ + список)

Мы создаем набор данных со всеми возможными значениями:

probab.cuts <- data.frame([email protected][[1]], [email protected][[1]], [email protected][[1]])

Вы можете просмотреть все связанные значения

probab.cuts

Если вы хотите выбрать запрошенные значения, это легко сделать:

tail(probab.cuts[probab.cuts$cut > 0.5,], 1)

Ручная проверка

tab <- table(ds_tr$popularity, y_hat > 0.5)
tab[4]/(tab[4]+tab[2]) # recall
tab[4]/(tab[4]+tab[3]) # precision
person PereG    schedule 03.01.2016
comment
Спасибо, но у меня все еще есть проблема при попытке оценить модель на тестовом наборе (ds_te), так как y_hat отличается по длине от ds_te$popularity. Какие-нибудь мысли? - person user2878881; 04.01.2016
comment
На самом деле правильнее для оценки модели использовать тестовые данные. Итак, оцените и используйте: y_hat_test ‹-predict(mdl, data = ds_te - url, type = 'response') и вычислите pred и perf с новыми данными. Наконец, используйте код этого ответа с ds_te$popularity и новым y_hat_test в табличной функции. - person PereG; 05.01.2016