0

我正在建立一个决策树分类模型。我所有的特征变量和标签变量都是因子类型。当我将数据集拆分为训练集和测试集时,这两个子集将包含未使用的级别。如果我在两个子集上降低水平,预测结果将非常不同,准确度会更低。

我想知道在预测建模的情况下以及其他情况下,处理这个级别问题的正确方法是什么。有什么建议吗?

这是一个使用封装中焊料样本数据的可重现示例。rpart我选择Solder作为我的标签变量。这是一个平衡的数据集。

solder_data<-solder

##split training data set and test data set
set.seed(11)
g <- runif(nrow(solder_data))#set random order of data set
solder_data<- solder_data[order(g),]
ss <- sample(1:nrow(solder_data),size = 0.7*nrow(solder_data))
solder.Train <- solder_data[ss,]
solder.Test <- subset(solder_data[-ss,],Opening=='S')
dl_solder.Test <-droplevels(solder.Test) # drop unused levels in testing set

str(solder.Test) #opening has 3 levels
str(droplevels(solder.Test)) # opening has 1 level

#build model
library(RevoScaleR)
rxfit <- rxDTree(Solder ~ Opening + skips + Mask + PadType + Panel,
             data = solder.Train)

#test model on test set before dropping levels
rxpred <- rxPredict(rxfit,data = solder.Test,extraVarsToWrite = "Solder")
rxpred$Predicted <- ifelse(rxpred$Thick_prob<=rxpred$Thin_prob, 
                    "Thin","Thick")
mean(rxpred$Predicted!=rxpred$Solder) # misclassification rate is 0.1428571

#test model on test set after dropping levels
rxpred_dl <- rxPredict(rxfit,data = dl_solder.Test,
              extraVarsToWrite   = "Solder")
rxpred_dl$Predicted <- ifelse(rxpred_dl$Thick_prob<=rxpred_dl$Thin_prob, 
                        "Thin","Thick")
mean(rxpred_dl$Predicted!=rxpred_dl$Solder) 
# misclassification rate is 0.3714286

为什么在测试数据集中删除未使用的级别后会导致不同的预测结果?哪一种是进行预测的正确方法?

4

0 回答 0