1.问题
在R 使用caret进行机器学习模型构建时候。针对二分类问题,会发现我们的预测值准确度达到100%
即,可以准确对目标进行分类。
image.png
或者在进行logistics回归时候,发现glm方程输出各个变量的p值都是1,z值是0.
image.png
2.原因
出现这样问题的原因是,我们的x变量里面一个或者几个变量是与y分类变量一致。
即,譬如y为Yes(32个),No(108个),那么x是连续性变量,x<3有 32个,大于3的有108个。与y分布保持一致。
3.例子
譬如我们利用mdrrDescr数据,产生一个y。这个y是根据Ms>2.12变量转换来的.
或者再增加一个x,等于Yes的x均值在1.2左右。等于No的x均值在12左右。
这样就使得x与y保持一致。
最后输出,不管怎么切换Training与Testing的比例,准确率均为100%
library(caret)
data(mdrr)
dim(mdrrDescr)
## creat data
df=mdrrDescr %>% dplyr::select(1:10) %>%
mutate(y=factor(ifelse(Ms>2.12,"Yes","No"))) %>% as_tibble()
## creat x
df1=df %>% filter(y=="Yes") %>% mutate(x=rnorm(n(),1.2,0.3))
df2=df %>% filter(y=="No") %>% mutate(x=rnorm(n(),12.2,0.3))
## split data
df=rbind(df1,df2)
samp = createDataPartition(df$Sv, p = 0.80, list = FALSE)
ames_train = df[samp,]
ames_test = df[-samp,]
## model traning
set.seed(12)
myControl= trainControl(method = "cv",
number = 10,
summaryFunction=prSummary,
classProbs=T,
savePredictions = T,
verboseIter = F)
## linear regression model
model_lm =train(y~.,
data=ames_train[,-c(1)] ,
method = "glm",
family = "binomial",
#weights = model_weights,
trControl = myControl)
## model performance
confusionMatrix(predict(model_lm,ames_test),ames_test$y)
#importance
varImp(model_lm,scale = F)