R Caret中随机森林的混淆矩阵
Confusion matrix for random forest in R Caret
我有二进制 YES/NO Class 响应的数据。 运行ning RF 模型使用以下代码。我在获取混淆矩阵结果时遇到问题。
dataR <- read_excel("*:/*.xlsx")
Train <- createDataPartition(dataR$Class, p=0.7, list=FALSE)
training <- dataR[ Train, ]
testing <- dataR[ -Train, ]
model_rf <- train( Class~., tuneLength=3, data = training, method =
"rf", importance=TRUE, trControl = trainControl (method = "cv", number =
5))
结果:
Random Forest
3006 samples
82 predictor
2 classes: 'NO', 'YES'
No pre-processing
Resampling: Cross-Validated (5 fold)
Summary of sample sizes: 2405, 2406, 2405, 2404, 2404
Addtional sampling using SMOTE
Resampling results across tuning parameters:
mtry Accuracy Kappa
2 0.7870921 0.2750655
44 0.7787721 0.2419762
87 0.7767760 0.2524898
Accuracy was used to select the optimal model using the largest value.
The final value used for the model was mtry = 2.
到目前为止还不错,但是当我 运行 这个代码时:
# Apply threshold of 0.50: p_class
class_log <- ifelse(model_rf[,1] > 0.50, "YES", "NO")
# Create confusion matrix
p <-confusionMatrix(class_log, testing[["Class"]])
##gives the accuracy
p$overall[1]
我收到这个错误:
Error in model_rf[, 1] : incorrect number of dimensions
如果你们能帮助我得到混淆矩阵结果,我将不胜感激。
您可以尝试创建混淆矩阵并检查准确性
m <- table(class_log, testing[["Class"]])
m #confusion table
#Accuracy
(sum(diag(m)))/nrow(testing)
代码段 class_log <- ifelse(model_rf[,1] > 0.50, "YES", "NO")
是执行以下测试的 if-else 语句:
In the first column of model_rf
, if the number is greater than 0.50, return "YES", else return "NO", and save the results in object class_log
.
因此,代码实质上是基于数值向量创建了一个包含 class 个标签、"YES" 和 "NO" 的字符向量。
您需要将您的模型应用于测试集。
prediction.rf <- predict(model_rf, testing, type = "prob")
然后class_log <- ifelse(prediction.rf > 0.50, "YES", "NO")
据我了解,您想获得插入符号交叉验证的混淆矩阵。
为此,您需要在 trainControl
中指定 savePredictions
。如果将其设置为 "final"
,则保存最佳模型的预测。通过指定 classProbs = T
每个 class 的概率也将被保存。
data(iris)
iris_2 <- iris[iris$Species != "setosa",] #make a two class problem
iris_2$Species <- factor(iris_2$Species) #drop levels
library(caret)
model_rf <- train(Species~., tuneLength = 3, data = iris_2, method =
"rf", importance = TRUE,
trControl = trainControl(method = "cv",
number = 5,
savePredictions = "final",
classProbs = T))
预测在:
model_rf$pred
按 CV fols 排序,按原始数据框排序:
model_rf$pred[order(model_rf$pred$rowIndex),2]
获取混淆矩阵:
confusionMatrix(model_rf$pred[order(model_rf$pred$rowIndex),2], iris_2$Species)
#output
Confusion Matrix and Statistics
Reference
Prediction versicolor virginica
versicolor 46 6
virginica 4 44
Accuracy : 0.9
95% CI : (0.8238, 0.951)
No Information Rate : 0.5
P-Value [Acc > NIR] : <2e-16
Kappa : 0.8
Mcnemar's Test P-Value : 0.7518
Sensitivity : 0.9200
Specificity : 0.8800
Pos Pred Value : 0.8846
Neg Pred Value : 0.9167
Prevalence : 0.5000
Detection Rate : 0.4600
Detection Prevalence : 0.5200
Balanced Accuracy : 0.9000
'Positive' Class : versicolor
在两个 class 设置中,通常指定 0.5 作为阈值概率是次优的。通过优化 Kappa 或 Youden 的 J 统计量(或任何其他首选)作为概率的函数,可以在训练后找到最佳阈值。这是一个例子:
sapply(1:40/40, function(x){
versicolor <- model_rf$pred[order(model_rf$pred$rowIndex),4]
class <- ifelse(versicolor >=x, "versicolor", "virginica")
mat <- confusionMatrix(class, iris_2$Species)
kappa <- mat$overall[2]
res <- data.frame(prob = x, kappa = kappa)
return(res)
})
此处最高 kappa 不是在 threshold == 0.5
处获得的,而是在 0.1 处获得的。这应该小心使用,因为它会导致过度拟合。
我有二进制 YES/NO Class 响应的数据。 运行ning RF 模型使用以下代码。我在获取混淆矩阵结果时遇到问题。
dataR <- read_excel("*:/*.xlsx")
Train <- createDataPartition(dataR$Class, p=0.7, list=FALSE)
training <- dataR[ Train, ]
testing <- dataR[ -Train, ]
model_rf <- train( Class~., tuneLength=3, data = training, method =
"rf", importance=TRUE, trControl = trainControl (method = "cv", number =
5))
结果:
Random Forest
3006 samples
82 predictor
2 classes: 'NO', 'YES'
No pre-processing
Resampling: Cross-Validated (5 fold)
Summary of sample sizes: 2405, 2406, 2405, 2404, 2404
Addtional sampling using SMOTE
Resampling results across tuning parameters:
mtry Accuracy Kappa
2 0.7870921 0.2750655
44 0.7787721 0.2419762
87 0.7767760 0.2524898
Accuracy was used to select the optimal model using the largest value.
The final value used for the model was mtry = 2.
到目前为止还不错,但是当我 运行 这个代码时:
# Apply threshold of 0.50: p_class
class_log <- ifelse(model_rf[,1] > 0.50, "YES", "NO")
# Create confusion matrix
p <-confusionMatrix(class_log, testing[["Class"]])
##gives the accuracy
p$overall[1]
我收到这个错误:
Error in model_rf[, 1] : incorrect number of dimensions
如果你们能帮助我得到混淆矩阵结果,我将不胜感激。
您可以尝试创建混淆矩阵并检查准确性
m <- table(class_log, testing[["Class"]])
m #confusion table
#Accuracy
(sum(diag(m)))/nrow(testing)
代码段 class_log <- ifelse(model_rf[,1] > 0.50, "YES", "NO")
是执行以下测试的 if-else 语句:
In the first column of
model_rf
, if the number is greater than 0.50, return "YES", else return "NO", and save the results in objectclass_log
.
因此,代码实质上是基于数值向量创建了一个包含 class 个标签、"YES" 和 "NO" 的字符向量。
您需要将您的模型应用于测试集。
prediction.rf <- predict(model_rf, testing, type = "prob")
然后class_log <- ifelse(prediction.rf > 0.50, "YES", "NO")
据我了解,您想获得插入符号交叉验证的混淆矩阵。
为此,您需要在 trainControl
中指定 savePredictions
。如果将其设置为 "final"
,则保存最佳模型的预测。通过指定 classProbs = T
每个 class 的概率也将被保存。
data(iris)
iris_2 <- iris[iris$Species != "setosa",] #make a two class problem
iris_2$Species <- factor(iris_2$Species) #drop levels
library(caret)
model_rf <- train(Species~., tuneLength = 3, data = iris_2, method =
"rf", importance = TRUE,
trControl = trainControl(method = "cv",
number = 5,
savePredictions = "final",
classProbs = T))
预测在:
model_rf$pred
按 CV fols 排序,按原始数据框排序:
model_rf$pred[order(model_rf$pred$rowIndex),2]
获取混淆矩阵:
confusionMatrix(model_rf$pred[order(model_rf$pred$rowIndex),2], iris_2$Species)
#output
Confusion Matrix and Statistics
Reference
Prediction versicolor virginica
versicolor 46 6
virginica 4 44
Accuracy : 0.9
95% CI : (0.8238, 0.951)
No Information Rate : 0.5
P-Value [Acc > NIR] : <2e-16
Kappa : 0.8
Mcnemar's Test P-Value : 0.7518
Sensitivity : 0.9200
Specificity : 0.8800
Pos Pred Value : 0.8846
Neg Pred Value : 0.9167
Prevalence : 0.5000
Detection Rate : 0.4600
Detection Prevalence : 0.5200
Balanced Accuracy : 0.9000
'Positive' Class : versicolor
在两个 class 设置中,通常指定 0.5 作为阈值概率是次优的。通过优化 Kappa 或 Youden 的 J 统计量(或任何其他首选)作为概率的函数,可以在训练后找到最佳阈值。这是一个例子:
sapply(1:40/40, function(x){
versicolor <- model_rf$pred[order(model_rf$pred$rowIndex),4]
class <- ifelse(versicolor >=x, "versicolor", "virginica")
mat <- confusionMatrix(class, iris_2$Species)
kappa <- mat$overall[2]
res <- data.frame(prob = x, kappa = kappa)
return(res)
})
此处最高 kappa 不是在 threshold == 0.5
处获得的,而是在 0.1 处获得的。这应该小心使用,因为它会导致过度拟合。