我有一个不平衡的数据集,在所有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
过去一周我一直在谷歌搜索这个问题,但是没有看到解决方案,但是这本书的代码工作得很好,但是我的数据错误给了我...任何建议都会得到满足!非常感谢你!
答案 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
所以我猜这就是它正在捡起来的东西。