Как установить PPV в каретку для случайного леса в R? - PullRequest
1 голос
/ 26 марта 2020

Так что я заинтересован в создании модели, которая оптимизирует PPV. Я создал модель RF (ниже), которая выводит мне путаницу, для которой я затем вручную вычисляю чувствительность, специфичность, ppv, npv и F1. Я знаю, что в настоящее время точность оптимизирована, но я готов к чувствительности и специфичности go, чтобы получить гораздо более высокое PPV.

data_ctrl_null <- trainControl(method="cv", number = 5, classProbs = TRUE, summaryFunction=twoClassSummary, savePredictions=T, sampling=NULL)

set.seed(5368)

model_htn_df <- train(outcome ~ ., data=htn_df, ntree = 1000, tuneGrid = data.frame(mtry = 38), trControl = data_ctrl_null, method= "rf", 
                           preProc=c("center","scale"),metric="ROC", importance=TRUE)

model_htn_df$finalModel #provides confusion matrix

Результаты:

Call:
  randomForest(x = x, y = y, ntree = 1000, mtry = param$mtry, importance = TRUE) 
           Type of random forest: classification
                 Number of trees: 1000
  No. of variables tried at each split: 38

    OOB estimate of  error rate: 16.2%
    Confusion matrix:
      no yes class.error
 no  274  19  0.06484642
 yes  45  57  0.44117647

Мой ручной расчет: sen = 55.9% spe c = 93.5%, ppv = 75.0%, npv = 85.9% (матрица путаницы переключается мои нет и да как результаты, поэтому я также переключаю числа при расчете метрик производительности.)

Так что мне нужно сделать, чтобы получить PPV = 90%?

Это подобный вопрос , но я на самом деле не слежу за ним.

1 Ответ

1 голос
/ 27 марта 2020

Мы определяем функцию для вычисления PPV и возвращаем результаты с именем:

PPV <- function (data,lev = NULL,model = NULL) {
   value <- posPredValue(data$pred,data$obs, positive = lev[1])
   c(PPV=value)
}

Допустим, у нас есть следующие данные:

library(randomForest)
library(caret)
data=iris
data$Species = ifelse(data$Species == "versicolor","versi","others")
trn = sample(nrow(iris),100)

Затем мы тренируемся, определяя PPV быть метри c:

mdl <- train(Species ~ ., data = data[trn,],
             method = "rf",
             metric = "PPV",
             trControl = trainControl(summaryFunction = PPV, 
                                      classProbs = TRUE))

Random Forest 

100 samples
  4 predictor
  2 classes: 'others', 'versi' 

No pre-processing
Resampling: Bootstrapped (25 reps) 
Summary of sample sizes: 100, 100, 100, 100, 100, 100, ... 
Resampling results across tuning parameters:

  mtry  PPV      
  2     0.9682811
  3     0.9681759
  4     0.9648426

PPV was used to select the optimal model using the largest value.
The final value used for the model was mtry = 2.

Теперь вы можете видеть, что он тренируется на PPV. Однако вы не можете заставить тренировку достичь PPV 0,9. Это действительно зависит от данных, если ваши независимые переменные не имеют предсказательной силы, это не улучшится, насколько вы тренируете их правильно?

...