You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras神经网络二分类任务生成混淆矩阵报错求助

解决Keras二分类预测中混淆矩阵生成的错误问题

错误原因

报错Error in unique.default(x, nmax = nmax) : unique() applies only to vectors的核心问题是:prediction2是Keras返回的二维张量/数组(输出层设为2个单元的sigmoid,对应二分类的两个类别概率),而as.factor()仅能处理向量类型数据,无法识别二维结构。同时test.y_keras若为数据框列而非向量,也会引发格式不兼容问题。

解决步骤

  • 将Keras预测的张量转换为R原生向量:用k_argmax()提取预测类别索引,再通过as.array()转成R可识别的向量;或直接取预测结果中对应正类的列,阈值化后转成向量。
  • 确保测试标签为向量:用pull()或[[从数据框中提取标签列,转为向量格式。

修正后的完整代码片段

# 数据预处理
train.x_keras.ori <- train %>% select(-stroke) %>% scale() %>% as.matrix()
train.y_keras.ori <- to_categorical(train[,"stroke"])
test.x_keras <- test %>% select(-stroke) %>% scale() %>% as.matrix()
# 修正:将测试标签转为向量
test.y_keras <- test %>% pull(stroke)
train.x_keras.ori <- array_reshape(train.x_keras.ori, dim=dim(train.x_keras.ori))
test.x_keras <- array_reshape(test.x_keras, dim=dim(test.x_keras))

prop.table(table(train[,"stroke"]))

initializer <- initializer_random_normal(seed = 100)
model2 <- keras_model_sequential()
model2 %>% 
  layer_dense(input_shape = ncol(train.x_keras.ori), # 输入层
              units = 56, activation = "relu", name = "hidden_1") %>%  # 隐藏层1
  layer_dense(units = 28, activation = "relu", name = "hidden_2") %>% # 隐藏层2
  layer_dense(units = 2, activation = "sigmoid", name = "output")
model2 %>% 
  compile(loss = "binary_crossentropy",
          optimizer = optimizer_adam(lr = 0.001),
          metrics = "accuracy") # 修正参数名:metric → metrics

history2 <- model2 %>% 
  keras::fit(train.x_keras.ori,
             train.y_keras.ori,
             epochs = 50, # 修正参数名:epoch → epochs
             batch_size = 50,verbose=T,
             class_weight = list("0"= 0.04775574 ,"1"=0.95224426))

# 修正:将预测结果转为R向量
prediction2 <- model2 %>% predict(test.x_keras) %>% 
  k_argmax() %>% # 获取类别索引(0或1)
  as.array() %>% 
  as.factor()

# 生成混淆矩阵
confusionMatrix(prediction2, as.factor(test.y_keras))

替代方案(无需k_argmax)

如果不想用k_argmax,可直接取预测结果中对应正类的列进行阈值判断:

prediction2 <- model2 %>% predict(test.x_keras) %>% 
  .[,2] %>% # 取第二列的正类概率值
  `>`(0.5) %>% # 0.5阈值判断类别
  as.integer() %>% 
  as.factor()

内容的提问来源于stack exchange,提问作者maru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 06:40:37