单二分类因变量与自变量的逻辑回归结果异常:混淆矩阵无0类输出
问题原因及解决方案
核心问题1:预测值与真实值类别体系不匹配
你的代码中,预测结果用数字1、2表示,但真实标签V1是取值为"False"(对应原0)和"True"(对应原1)的因子。两者类别不对应,导致混淆矩阵无法正确展示两类结果。
修复代码:
替换原预测值转换逻辑,将结果转为与真实标签一致的因子:
# 替换原预测值转换代码 predict_reg <- ifelse(predict_reg > 0.5, "True", "False") # 确保预测值的因子水平与真实标签完全匹配 predict_reg <- factor(predict_reg, levels = c("False", "True"))
核心问题2:模型对所有样本预测为同一类别
调整阈值后仍只有一类结果,说明模型对测试集所有样本的预测概率都高于(或低于)阈值,导致预测结果全为True。常见诱因:
- 数据不平衡:4500行原始数据中
V1=1的样本占比过高,模型倾向于预测多数类。 - 特征区分度弱:自变量
V2无法有效区分V1的两类,模型学不到有效规则。
应对措施:
检查测试集类别分布:
先确认测试集是否同时包含两类样本:table(test_reg$V1)如果测试集仅含
V1=1,属于抽样问题,重新拆分数据集即可。处理数据不平衡:
若训练集两类占比悬殊,可采用以下方法:- 过采样少数类(如SMOTE算法)
- 欠采样多数类
- 训练模型时给少数类加权重:
logistic_model <- glm(V1 ~ V2, data = train_reg, family = "binomial", weights = ifelse(V1 == "False", 5, 1)) # 权重值按需调整
验证模型预测概率分布:
查看预测概率的分布情况,确认是否全偏向某一端:# 保留原始预测概率 predict_reg_prob <- predict(logistic_model, test_reg, type = "response") # 绘制概率分布直方图 hist(predict_reg_prob)
完整修正后的示例代码
# 构建数据集 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 <- factor(df$V1, levels = c(0, 1), labels = c("False", "True")) # 按因变量拆分数据集,保证训练/测试集类别分布一致 split <- caTools::sample.split(df$V1, SplitRatio = 0.8) train_reg <- subset(df, split == TRUE) test_reg <- subset(df, split == FALSE) # 训练逻辑回归模型(可选加入类别权重) logistic_model <- glm(V1 ~ V2, data = train_reg, family = "binomial") # 获取原始预测概率 predict_reg_prob <- predict(logistic_model, test_reg, type = "response") # 转换为与真实标签匹配的类别 predict_reg <- ifelse(predict_reg_prob > 0.5, "True", "False") predict_reg <- factor(predict_reg, levels = c("False", "True")) # 生成混淆矩阵 table(test_reg$V1, predict_reg)
内容的提问来源于stack exchange,提问作者vp_050
相关产品推荐
相关产品推荐

