不同的结果使用train(),predict()和resamples()

我正在使用Caret软件包来分析各种模型,并使用以下方法评估结果:

  • print()[打印train()的结果],
  • 预测()和
  • 重采样()。
  • 为什么这些结果在以下示例中有所不同?

    我对灵敏度(真正的好处)感兴趣。 为什么J48_fit被评估为0.71的敏感度,然后是0.81,然后是0.71

    当我运行其他模型时会发生同样的情况 - 灵敏度根据评估而变化。

    注意:我在这里包含了两个模型,以便说明resamples()函数,它必须以两个模型作为输入,但我的主要问题是关于结果之间的差异取决于使用的方法。

    换句话说,train()(C5.0_fit / J48_fit),predict()和resamples()的结果有什么区别? '幕后'发生了什么,我应该信任哪个结果?

    例:

    library(C50)
    data(churn)
    
    Seed <- 10
    
    # Set train options
    set.seed(Seed)
    Train_options <- trainControl(method = "cv", number = 10,
                                  classProbs = TRUE,
                                  summaryFunction = twoClassSummary)
    
    # C5.0 model:
    set.seed(Seed)
    C5.0_fit <- train(churn~., data=churnTrain, method="C5.0", metric="ROC",
                     trControl=Train_options)
    
    # J48 model:
    set.seed(Seed)
    J48_fit <- train(churn~., data=churnTrain, method="J48", metric="ROC",
                     trControl=Train_options)
    # Get results by printing the outcome
    print(J48_fit)
    
    #                      ROC Sens Spec
    # Best (sensitivity): 0.87 0.71 0.98  
    
    # Get results using predict()
    set.seed(Seed)
    J48_fit_predict <- predict(J48_fit, churnTrain)
    confusionMatrix(J48_fit_predict, churnTrain$churn)
    #             Reference
    # Prediction  yes   no
    #       yes  389    14
    #       no    94  2836
    # Sens : 0.81          
    # Spec : 0.99
    
    # Get results by comparing algorithms with resamples()
    set.seed(Seed)
    results <- resamples(list(C5.0_fit=C5.0_fit, J48_fit=J48_fit))
    summary(results)
    # ROC         mean
    # C5.0_fit    0.92  
    # J48_fit     0.87
    # Sens        mean
    # C5.0_fit    0.76  
    # J48_fit     0.71
    # Spec        mean
    # C5.0_fit    0.99  
    # J48_fit     0.98
    

    顺便说一句,这是一个将所有三个结果汇总在一起的功能:

    Get_results <- function(...){
    
      Args <- list(...)
      Model_names <- as.list(sapply(substitute({...})[-1], deparse))
    
      message("Model names:")
      print(Model_names)
    
      # Function for getting max sensitivity
      Max_sens <- function(df, colname = "results"){
        df <- df[[colname]]
        new_df <- df[which.max(df$Sens), ]
        x <- sapply(new_df, is.numeric)
        new_df[, x] <- round(new_df[, x], 2)
        new_df
      }
    
      # Find max Sens for each model
      message("Max sensitivity from model printout:")
      Max_sens_out <- lapply(Args, Max_sens)
      names(Max_sens_out) <- Model_names
      print(Max_sens_out)
    
      # Find predict() result for each model
      message("Results using predict():")
      set.seed(Seed)
      Predict_out <- lapply(Args, function(x) predict(x, churnTrain))
      Predict_results <- lapply(Predict_out, function(x) confusionMatrix(x, churnTrain$churn))
      names(Predict_results) <- Model_names
      print(Predict_results)
    
      # Find resamples() results for each model
    
      message("Results using resamples():")
      set.seed(Seed)
      results <- resamples(list(...),modelNames = Model_names)
      # names(results) <- Model_names
      summary(results)
    
    }
    
    # Test
    Get_results(C5.0_fit, J48_fit)
    

    非常感谢!


    您打印的最佳灵敏度是10倍(来自您的简历)每个模型的平均性能。 您可以使用J48_fit$resample查看每次弃J48_fit$resample的表现。 然后确认,您可以用mean(J48_fit$resample[,1])取第一列ROC的mean(J48_fit$resample[,1]) ,您将得到0.865799。

    在完整数据集中使用predict()时,最终会得到不同的结果,因为数据与resample中使用的数据不同 - 您将在整个数据上获得模型性能,而不是在10%时间。

    链接地址: http://www.djcxy.com/p/38391.html

    上一篇: different results using train(), predict() and resamples()

    下一篇: Plot SVM linear model trained by caret package in R