Programim dhe zhvillim, javascript, python, php, html

Nxjerrja e trajnimit dhe testimit të AUROC nga 10-fishi i CV-së së Caret

Thuaj se po bëj klasifikimin si më poshtë:

library(mlbench)
data(Sonar)

library(caret)
set.seed(998)

my_data <- Sonar

fitControl <-
  trainControl(
    method = "cv",
    number = 10,
    classProbs = T,
    savePredictions = T,
    summaryFunction = twoClassSummary
  )


model <- train(
  Class ~ .,
  data = my_data,
  method = "xgbTree",
  trControl = fitControl,
  metric = "ROC"
)

Për secilën nga 10 palosjet, 10% e të dhënave po përdoren për vërtetim. Për parametrat më të mirë që përcakton kujdesi, mund të përdor getTrainPerf(model) për të gjetur AUC-në mesatare të vlefshmërisë në të gjitha 10 palosjet ose model$resample për të marrë vlerat individuale të AUC për secilën palosje. Megjithatë, nuk mund ta marr AUC-në nëse të dhënat e trajnimit vendosen përsëri në të njëjtin model. Do të ishte mirë nëse mund të marr vlerat individuale të AUC për çdo grup trajnimi.

Si mund të nxirret ky informacion? Dua të sigurohem që modeli im të mos jetë i tepërt (grupi i të dhënave me të cilin po punoj është shumë i vogël).

Faleminderit!


  • Kjo funksionon, por raporton vetëm AUC për grupin e vlefshmërisë (10% ku modeli është testuar). Megjithatë, unë jam i interesuar në AUC nëse 90% e të dhënave të tjera të trajnimit do të vendoseshin përsëri në model. Ndonjë ide se si ta bëjmë këtë? 06.01.2018
  • FYI, në nëngrupin bëra: for (a in 1:length(model$bestTune)) { model$pred <- model$pred[model$pred[, paste(colnames(model$bestTune)[a])] == model$bestTune[1, a], ] } 06.01.2018
  • Vlera nga grupi i trajnimit nuk mund të përdoret për qëllimin që keni ndërmend. 07.01.2018
  • @42- A mund ta elaboroni këtë? Si do të rekomandonit të provoni nëse modeli im është i përshtatur nëse nuk kam një grup të veçantë të dhënash për të vërtetuar? Bërja e vërtetimit të kryqëzuar 10-fish është grupi i vetëm i testit me të cilin po punoj. 07.01.2018
  • Jam dakord me @42, me një model të tillë si xgboost ka të ngjarë që AUC në palosjet e grupit të testit të jetë 1. Kjo do t'ju tregojë pak për përshtatjen e tepërt. Është e qartë se do të jetë e tepërt, vlera në palosjet e provës ju tregon sasinë e mbi përshtatjes. Në lidhje me temën, nuk jam i sigurt nëse gabimi i grupit të testimit mund të nxirret nga objekti i trenit me karrocë, por mund të vlerësohet lehtësisht nëse merrni të njëjtat palosje dhe bëni një funksion të personalizuar për të bërë CV-në 10-fish dhe për t'ju kthyer metrikën e grupit të testimit. dëshirë. Nëse jeni të interesuar për këtë, unë mund të postoj një përgjigje se si mund të arrihet. 07.01.2018
  • Me një grup të vogël të dhënash, unë do të përpiqesha të ndaja 80: 20 dhe të kisha një grup të pavarur testimi për të verifikuar nëse gabimi i CV-së është afër gabimit të testimit. 07.01.2018
  • @missuse do ta vlerësoja shumë nëse mund ta postonit këtë përgjigje. Nëse "caret" do të mund të përdoret ende për stërvitje, kjo do të ishte fantastike pasi po testoj edhe algoritme të tjera dhe "caret" e bën të lehtë ndërrimin e algoritmeve dhe optimizimin e parametrave. Faleminderit! 07.01.2018
  • @Keshav M ndërsa mua më pëlqen shumë caret, më duket se xgboost ka disa parametra vërtet interesantë si early_stopping_round, scale_pos_weight, alpha, lambda dhe colsample_by_level që nuk janë të disponueshëm në caret tren. Gjithashtu xgb.cv është një funksion mjaft solid për akordimin e hiper parametrave. 07.01.2018

Përgjigjet:


1

Siç kërkohet në komentet, këtu është një funksion i personalizuar për të vlerësuar gabimin e testit të verifikimit të kryqëzuar. Nuk jam i sigurt nëse mund të nxirret nga objekti i trenit të karrocave.

Pas drejtimit të trenit me kare, nxirrni palosjet për melodinë më të mirë:

library(tidyverse)
model$bestTune %>%
  left_join(model$pred) %>%
  select(rowIndex, Resample) %>%
  mutate(Resample = as.numeric(gsub(".*(\\d$)", "\\1", Resample)),
         Resample = ifelse(Resample == 0, 10, Resample)) %>%
  arrange(rowIndex) -> resamples

Ndërtoni një funksion të vlefshmërisë së kryqëzuar që do të përdorë të njëjtat palosje siç bëri caret:

library(xgboost)
train <- my_data[,!names(my_data)%in% "Class"]
label <- as.numeric(my_data$Class) - 1

test_auc <- lapply(1:10, function(x){
  model <- xgboost(data = data.matrix(train[resamples[,2] != x,]),
                   label = label[resamples[,2] != x],
                   nrounds = model$bestTune$nrounds,
                   max_depth = model$bestTune$max_depth,
                   gamma = model$bestTune$gamma,
                   colsample_bytree = model$bestTune$colsample_bytree,
                   objective = "binary:logistic",
                   eval_metric= "auc" ,
                   print_every_n = 50)
  preds_train <- predict(model, data.matrix(train[resamples[,2] != x,]))
  preds_test <- predict(model, data.matrix(train[resamples[,2] == x,]))
  auc_train <- pROC::auc(pROC::roc(response = label[resamples[,2] != x], predictor = preds_train, levels = c(0, 1)))
  auc_test <- pROC::auc(pROC::roc(response = label[resamples[,2] == x], predictor = preds_test, levels = c(0, 1)))
  return(data.frame(fold = unique(resamples[resamples[,2] == x, 2]), auc_train, auc_test))
  })

do.call(rbind, test_auc)
#output
   fold auc_train  auc_test
1     1         1 0.9909091
2     2         1 0.9797980
3     3         1 0.9090909
4     4         1 0.9629630
5     5         1 0.9363636
6     6         1 0.9363636
7     7         1 0.9181818
8     8         1 0.9636364
9     9         1 0.9818182
10   10         1 0.8888889

arrange(model$resample, Resample)
#output
         ROC      Sens      Spec Resample
1  0.9909091 1.0000000 0.8000000   Fold01
2  0.9898990 0.9090909 0.8888889   Fold02
3  0.9909091 0.9090909 1.0000000   Fold03
4  0.9444444 0.8333333 0.8888889   Fold04
5  0.9545455 0.9090909 0.8000000   Fold05
6  0.9272727 1.0000000 0.7000000   Fold06
7  0.9181818 0.9090909 0.9000000   Fold07
8  0.9454545 0.9090909 0.8000000   Fold08
9  0.9909091 0.9090909 0.9000000   Fold09
10 0.8888889 0.9090909 0.7777778   Fold10

Pse palosja e provës AUC nga funksioni im dhe kujdesi im nuk janë të njëjta, nuk mund të them. Jam mjaft i sigurt që janë përdorur të njëjtat parametra dhe palosje. Mund të supozoj se ka të bëjë me farën e rastësishme. Kur kontrolloj parashikimet e testit auc të caret, marr të njëjtin rezultat si caret:

model$bestTune %>%
  left_join(model$pred) %>%
  arrange(rowIndex) %>%
  select(M, Resample, obs) %>%
  mutate(Resample = as.numeric(gsub(".*(\\d$)", "\\1", Resample)),
                             Resample = ifelse(Resample == 0, 10, Resample),
         obs = as.numeric(obs) - 1) %>%
  group_by(Resample) %>%
  do(auc = as.vector(pROC::auc(pROC::roc(response = .$obs, predictor = .$M)))) %>%
  unnest()
#output
   Resample   auc
      <dbl> <dbl>
 1     1.00 0.991
 2     2.00 0.990
 3     3.00 0.991
 4     4.00 0.944
 5     5.00 0.955
 6     6.00 0.927
 7     7.00 0.918
 8     8.00 0.945
 9     9.00 0.991
10    10.0  0.889

Por përsëri theksoj se gabimi i testit do t'ju tregojë pak dhe ju duhet të mbështeteni në gabimin e trenit. Nëse dëshironi t'i afroni të dyja, atëherë mendoni të luani me parametrat gamma, alpha dhe lambda.

Me një grup të vogël të dhënash, unë do të përpiqesha të ndaja : test = 80 : 20 dhe të përdor atë grup të pavarur testimi për të verifikuar nëse gabimi CV është afër gabimit të testit.

07.01.2018
  • Nëse gabimi i testit të grupit të pavarur të testit është i ngjashëm me gabimin CV, atëherë modeli nuk është i tepërt, apo jo? 07.01.2018
  • @Keshav M nëse gabimi i CV-së lidhet me gabimin e testit, atëherë modeli është në rregull. Të jesh afër nuk do të thotë shumë, por kur gabimi i CV-së po bëhet më i vogël, duhet të jetë edhe gabimi i testit. Nëse jo ka një problem. 07.01.2018
  • Më falni që jam pak konfuz. Ku mund të marr vlerat e shumëfishta të gabimeve të CV-së dhe gabimeve të testimit për të kërkuar një korrelacion? Thjesht po merrja në konsideratë vlerat e vetme të testit dhe gabimit të CV-së që do të krijoheshin duke bërë testin e CV-së më pas të pavarur. Faleminderit shumë për ndihmën tuaj :) 07.01.2018
  • @Keshav M Po testoni një sërë parametrash hiper dhe ndoshta disa nxënës. Për të gjitha këto ju mund të gjeneroni gabim CV dhe gabim validimi. Ndonëse nuk duhet t'i krahasoni këto për të gjitha rastet e testuara pasi ka shumë të ngjarë të çojë në përshtatje të tepërt (veçanërisht në një grup të vogël të dhënash), ju mund të merrni disa dhe të shihni nëse kanë të njëjtin trend. Gabimi i vërtetimit është një metrikë shumë e njëanshme (në varësi të mostrave të mbajtura, mund të kthejë numra shumë të ndryshëm) ndërsa CV ka paragjykim të ulët dhe variancë të ulët. Megjithatë CV-ja shpesh nuk specifikohet (shtresim, bllokim, mbikampionim). 07.01.2018
  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..