关于C5.0树模型的高度不平衡数据

时间:2014-06-30 21:42:44

标签: r parameters decision-tree random-forest

我有一个不平衡的数据集,在所有496,978个障碍物中只有87个目标事件“F”,因为我想看一个规则/树,我选择使用树模型,我一直在遵循“应用”中的代码Rus书中的预测模型由Max Kuhn博士撰写,在第16章中,这种不平衡问题得到了很好的解决。

以下是示例数据结构:

str(training[,predictors])

'data.frame':496978 obs。 36个变量:

$ Point_Of_Sale_Code:因子w / 5级别“c0”,“c2”,“c90”,..:3 3 5 5 3 3 5 5 5 5 ......

$ Delinquent_Amount:num 0 0 0 0 0 0 0 0 0 0 ...

$ Delinquent_Days_Count:num 0 0 0 0 0 0 0 0 0 0 ...

$ Overlimit_amt:num 0 0 0 0 0 0 0 0 0 0 ...

我尝试使用随机森林进行下采样,效果很好,测试数据上的auc = 0.9997,以及混淆矩阵

            Reference
Prediction      N      F
         N 140526      0
         F   1442     24

然而,rf没有给我一个特定的规则,所以我尝试了书中的代码:

library(rpart)

library(e1071)

  initialRpart <- rpart(flag ~ ., data = training,
                  control = rpart.control(cp = 0.0001))
  rpartGrid <- data.frame(.cp = initialRpart$cptable[, "CP"])

  cmat <- list(loss = matrix(c(0, 1, 20, 0), ncol = 2))
  set.seed(1401)

  cartWMod1 <- train(x = training[,predictors],
                     y = training$flag,
                     method = "rpart",
                     trControl = ctrlNoProb,
                     tuneGrid = rpartGrid,
                     metric = "Kappa",
                     parms = cmat)
  cartWMod1

我每次都得到错误消息,无论我尝试什么,比如将所有int数据类型转换为num类型,不知道为什么我会收到此警告信息,

  Warning message:
  In ni[1:m] * nj[1:m] : ***NAs produced by integer overflow***

  Aggregating results
  Selecting tuning parameters
  Error in train.default(x = training[, predictors], y = training$flag,  : 
  ***final tuning parameters could not be determined***

我也试过了c5.0包的代码:

library(C50)

  c5Grid <- expand.grid(.model = c("tree", "rules"),
                  .trials = c(1, (1:10)*10),
                  .winnow = FALSE)

  finalCost <- matrix(c(0, 150, 1, 0), ncol = 2)
  rownames(finalCost) <- colnames(finalCost) <- levels(training$flag)

set.seed(1401)

      C5CostFit1 <- train(training[,predictors],
               training$flag,
               method = "C5.0",
               metric = "Kappa",
               tuneGrid = c5Grid,
               cost = finalCost,
               control = C5.0Control(earlyStopping = FALSE),
               trControl = ctrlNoProb)

C5CostCM1 <- confusionMatrix(predict(C5CostFit, training), training$flag)

我得到了这个结果,它将所有目标事件F分类为非关系N,是否有可能将成本惩罚从150增加到更大以解决此问题?谢谢!

C5CostCM1

Confusion Matrix and Statistics

           Reference
  Prediction      N      F
           N 141968     ***24***
           F      0      0

           Accuracy : 0.9998          
             95% CI : (0.9997, 0.9999)
No Information Rate : 0.9998          
P-Value [Acc > NIR] : 0.554           
              Kappa : NA            
 Mcnemar's Test P-Value : 2.668e-06                                                 
        Sensitivity : 1.0000          
        Specificity : 0.0000          
     Pos Pred Value : 0.9998          
     Neg Pred Value :    NaN          
         Prevalence : 0.9998          
     Detection Rate : 0.9998          
   Detection Prevalence : 1.0000          
   Balanced Accuracy : 0.5000                                                    
    'Positive' Class : N     

过去一周我一直在谷歌搜索这个问题,但是没有看到解决方案,但是这本书的代码工作得很好,但是我的数据错误给了我...任何建议都会得到满足!非常感谢你!

1 个答案:

答案 0 :(得分:1)

认为它告诉你输出中的某些东西(即列表)中有NAs - Kappa stat。

使用类似的东西:

results.matrix = confusionMatrix(data, reference)
results.df = as.data.frame(results.matrix[3])
summary(is.finite(results.df$overall))

给你这个:

   Mode   FALSE    TRUE    NA's 
logical       1       6       0 

所以我猜这就是它正在捡起来的东西。