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
相关产品推荐
相关产品推荐

