问题描述
df:
library(caret)
a = c("aa","bb","cc","aa","bb")
b = c("aa","bb")
c = c("aa","bb")
d = c("aa","bb")
e = c(1,1,1)
#df1
df1 = data.frame(a,b,c,d,e)
#df2
df2 = data.frame(a,e)
Caret Log-red模型:
df1$e <- as.factor(df1$e)
df2$e <- as.factor(df2$e)
# define training control
train_control <- trainControl(method = "cv",number = 5)
# train the model on training set
model <- train(e ~ .,data = df1,trControl = train_control,method = "glm",family=binomial())
# logistic <- glm(WonLost ~ . -PANum,data=train,family="binomial")
df2$predict <- caret::predict.train(model,newdata=df2,type = "prob")
nrow(df2$predict)
nrow(df2$e)
为什么nrow(df2 $ e)为零?我根据先前遇到的以下错误将目标变量更改为一个因数,但这似乎是造成当前问题的原因。
警告消息:1:在train.default(x,y,weights = w,...)中:您 正在尝试进行回归,您的结果只有两种可能 值您是否要进行分类?如果是这样,请使用2级 因素作为结果列。
解决方法
有时caret
对变量很敏感,即使您的glm
logit模型存在回归或分类方面的麻烦也有其影响。我学到的一个建议是将目标变量重新编码为是/否。另外,请注意,将插入符号的预测作为新数据帧添加到df2
中,这就是nrow()
起作用而e
只是一个向量的原因,因此您必须使用length()
或NROW()
。这里的代码:
library(caret)
#Vectors
a = c("aa","bb","cc","aa","bb")
b = c("aa","bb")
c = c("aa","bb")
d = c("aa","bb")
e = c(1,1,1)
#df1
df1 = data.frame(a,b,c,d,e)
#df2
df2 = data.frame(a,e)
#Format
df1$e[df1$e==1] <- 'Yes'
df1$e[df1$e==0] <- 'No'
df2$e[df2$e==1] <- 'Yes'
df2$e[df2$e==0] <- 'No'
# define training control
train_control <- trainControl(method = "cv",number = 5)
# train the model on training set
model <- train(e ~ .,data = df1,trControl = train_control,method = "glm",family=binomial())
#Predict
df2$predict <- caret::predict.train(model,newdata=df2,type = "prob")
#Checks
nrow(df2$predict)
NROW(df2$e)
length(df2$e)
输出:
df2
a b c d e predict.No predict.Yes
1 aa aa aa aa Yes 7.500000e-01 0.25
2 bb bb bb bb No 2.500000e-01 0.75
3 cc cc cc cc Yes 8.646869e-09 1.00
4 aa aa aa aa No 7.500000e-01 0.25
5 aa aa aa aa No 7.500000e-01 0.25
6 aa aa aa aa No 7.500000e-01 0.25
7 bb bb bb bb Yes 2.500000e-01 0.75
8 cc cc cc cc Yes 8.646869e-09 1.00
9 bb bb bb bb Yes 2.500000e-01 0.75
10 bb bb bb bb Yes 2.500000e-01 0.75
nrow(df2$predict)
[1] 10
NROW(df2$e)
[1] 10
length(df2$e)
[1] 10