强调文本我有一个数据集,
df
,其中一个因变量的级别为“0”和“1”,一个自变量的级别为“1”和“2”。在执行逻辑回归时,下面的代码仅返回一个混淆矩阵,其输出分类为“1”类别,没有“0”。我尝试将概率截止值增加到 0.65 和 0.7。结果不会改变。这是一个示例数据框;原始数据集有近4500行数据。
数据框:
df <- data.frame(V1 = c(0,1,1,0,0,1,1,0,1,1,1,0,0,1),
V2 = c(1,1,1,1,1,1,2,1,2,1,1,1,1,1))
df
#> V1 V2
#> 1 0 1
#> 2 1 1
#> 3 1 1
#> 4 0 1
#> 5 0 1
#> 6 1 1
#> 7 1 2
#> 8 0 1
#> 9 1 2
#> 10 1 1
#> 11 1 1
#> 12 0 1
#> 13 0 1
#> 14 1 1
# set levels
df$V1 <- factor(df$V1,
levels = c(0, 1),
labels = c("False", "True")
)
# Splitting dataset
split <- caTools::sample.split(df, SplitRatio = 0.8)
split
df$V1<-factor(df$V1)
train_reg <- subset(df, split == "TRUE")
test_reg <- subset(df, split == "FALSE")
# Training model
logistic_model <- glm(V1 ~ V2,
data = train_reg,
family = "binomial")
logistic_model
# Summary
summary(logistic_model)
predict_reg <- predict(logistic_model,
test_reg, type = "response")
predict_reg
# Changing probabilities
predict_reg <- ifelse(predict_reg >0.5, 2, 1)
# Evaluating model accuracy
# using confusion matrix
table(test_reg$V1, predict_reg)
我认为你使用
caTools::sample.split
错了。
sample.split( Y, SplitRatio = 2/3, group = NULL )
论据:
Y:数据标签向量。如果只有几个标签(如预期),则两个子集中数据的相对比例将相同。
如果您查看
sample.split
通话的结果:
> split <- caTools::sample.split(df, SplitRatio = 0.8)
> split
[1] FALSE TRUE
我认为它将数据集的两列解释为两个观察值的向量。 结果是您碰巧按奇数和偶数情况分割数据(因为 R 自动复制 (FALSE, TRUE) 向量以匹配数据集的行数)。 对于您给我们的特定示例,我们最终将训练集完全分离(with(train_reg, table(V1, V2))
表明响应中的零值
V1
仅出现在
V2==1
中,并且我们还有一个测试集只有一个
V2
值(全部等于 1),因此测试集的预测将全部相等(在这种情况下,所有预测概率均为 0.4),因此您选择的任何阈值都会给您全零或全部为预测值...无论如何,你想要的是这样的:
split <- caTools::sample.split(df$V1, SplitRatio = 0.8)
split
## [1] TRUE TRUE FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE
## [13] TRUE TRUE