Показатели AUC на XGBoost

Я строю свою модель для прогнозирования с помощью XGBoost:

setDT(train)
setDT(test)

labels <- train$Goal
ts_label <- test$Goal
new_tr <- model.matrix(~.+0,data = train[,-c("Goal"),with=F]) 
new_ts <- model.matrix(~.+0,data = test[,-c("Goal"),with=F])

labels <- as.numeric(labels)-1
ts_label <- as.numeric(ts_label)-1

dtrain <- xgb.DMatrix(data = new_tr,label = labels) 
dtest <- xgb.DMatrix(data = new_ts,label=ts_label)

params <- list(booster = "gbtree", objective = "binary:logistic", eta=0.3, gamma=0, max_depth=6, min_child_weight=1, subsample=1, colsample_bytree=1)

xgb1 <- xgb.train(params = params, data = dtrain, nrounds = 291, watchlist = list(val=dtest,train=dtrain), print_every_n = 10, 
                   early_stop_round = 10, maximize = F , eval_metric = "error")


xgbpred <- predict(xgb1,dtest)
xgbpred <- ifelse(xgbpred > 0.5,1,0)

confusionMatrix(xgbpred, ts_label)

Confusion Matrix and Statistics

          Reference
Prediction    0    1
         0 1904   70
         1  191 2015

               Accuracy : 0.9376               
                 95% CI : (0.9298, 0.9447)     
    No Information Rate : 0.5012               
    P-Value [Acc > NIR] : < 0.00000000000000022

                  Kappa : 0.8751               
 Mcnemar's Test P-Value : 0.0000000000001104   

            Sensitivity : 0.9088               
            Specificity : 0.9664               
         Pos Pred Value : 0.9645               
         Neg Pred Value : 0.9134               
             Prevalence : 0.5012               
         Detection Rate : 0.4555               
   Detection Prevalence : 0.4722               
      Balanced Accuracy : 0.9376               

       'Positive' Class : 0   

Меня такая точность устраивает, но хочу проверить метрику auc. Я пишу:

xgb1 <- xgb.train(params = params, data = dtrain, nrounds = 291, watchlist = list(val=dtest,train=dtrain), print_every_n = 10, 
                   early_stop_round = 10, maximize = F , eval_metric = "auc")  

Но после этого я не знаю, как сделать прогноз относительно показателей AUC. Мне нужна ваша помощь, потому что это мой первый опыт работы с XGBoost. Спасибо.

UPD: Насколько я понимаю, после метрики auc нужен коэффициент, что я буду резать классы. Сейчас обрезаю на 0,5


person AntonCH    schedule 23.08.2017    source источник
comment
что вы имеете в виду сделать прогноз относительно AUC? AUC — это просто показатель производительности классификатора. Если вы оптимизируете AUC, а не точность, у вас будет другая функция, но ее вывод в любом случае будет таким же. Попробуйте также использовать xgb1 для прогнозирования.   -  person Jan Sila    schedule 23.08.2017
comment
@JanSila я получил [291] val-auc:0,978914 train-auc:1,000000 при подборе показателей auc. Но если я делаю прогноз как xgb1, значения не меняются. То же, что метрики ошибок.   -  person AntonCH    schedule 23.08.2017


Ответы (3)


Вы можете увидеть значение AUC обученной модели для набора обучающих данных со следующими

> max(xgb1$evaluation_log$train_auc)

Также вы можете рассчитать его для своих прогнозов на тестовом наборе с пакетом pROC следующим образом.

> library(pROC) 
> roc_test <- roc( test_label_vec, predictions_for_test, algorithm = 2) 

для вашего кода, написанного с вашими параметрами, это

> roc_test <- roc(ts_label, xgbpred, algorithm = 2)
> plot(roc_test ) 
> auc(roc_test )

если вы хотите рассчитать AUC и построить кривую ROC для своего тренировочного набора, вы можете использовать следующие

> roc_training <- roc(train_output_vec, train_predictions, algorithm = 2)
> plot(roc_training )   
> auc(roc_training)

Кривая ROC и AUC не должны учитывать точку отсечки. Рисуется ROC, и вычисляется AUC, сортируя оценки прогнозов и наблюдая, какой процент целевых событий находится в наборе прогнозов. Таким образом, проверяется, какой % целевых событий можно найти, если сдвинуть точку отсечки. Решение о точке отсечки связано с затратами или применением алгоритма. Вы можете выполнить поиск по отсечке, чтобы получить больше информации об этом.

person Orhan Celik    schedule 17.03.2018

Я редактирую код:

Вы можете сделать это непосредственно с помощью матрицы путаницы:

cm<-confusionMatrix(xgbpred, ts_label)$table
t = cm[1,1]/(cm[1,1]+cm[2,1])
f = cm[2,2]/(cm[2,1]+cm[2,2])

AUC = (1+t-f)/2
person Jesus    schedule 23.08.2017
comment
извините, не работает, Ошибка в см [1, 1]: неправильное количество измерений - person AntonCH; 23.08.2017
comment
Не могли бы вы сделать ls (см) и класс (см) и показать мне результат?? - person Jesus; 23.08.2017
comment
› ls(cm) [1] byClass dots mode общая положительная таблица › class(cm) [1] путаницаMatrix - person AntonCH; 23.08.2017
comment
Какая интерпретация этого AUC? Это коэф, что я могу отключить свои ответы? - person AntonCH; 24.08.2017

Существуют разные методы поиска хорошего порога отсечки и разные причины, по которым вам может понадобиться это сделать, например, несбалансированность меток классов в вашем наборе данных или потому, что вы хотите настроить специфичность или чувствительность.

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

Существуют различные методы построения этой границы отсечения по ROC-кривой или по кривой точности/отзыва. В случае, который я только что упомянул выше, который часто используется с генетическими биомаркерами, вы можете использовать индекс Юдина (вертикальная линия, проведенная от «линии равных шансов» к кривой ROC) для построения этой точки.

person Corey J. Nolet    schedule 21.11.2020