R语言半监督学习:请求补充生成模型输出混淆矩阵的代码
R语言半监督学习:请求补充生成模型输出混淆矩阵的代码
没问题!我来帮你补充生成混淆矩阵的代码,顺便梳理下整个流程的关键节点~
你已经完成了半监督模型的训练(selfTraining方法结合KNN分类器),接下来只需要用训练好的模型预测测试集,再结合真实标签生成混淆矩阵即可。下面是完整的补充代码和说明:
步骤1:用训练好的模型预测测试集
训练完成的m.selft1是一个可以直接用于预测的模型对象,我们用它对测试集xitest做预测:
# 对归纳式测试集进行预测 yitest_pred <- predict(m.selft1, newdata = xitest)
步骤2:生成混淆矩阵(两种方式)
方式1:用caret包的confusionMatrix生成带详细指标的混淆矩阵
caret包的confusionMatrix会输出准确率、精确率、召回率、F1值等全面的评估指标,是工业界常用的方式:
# 统一将真实标签和预测结果转为因子(避免类别类型不匹配的问题) # 注意:如果数据类别有固定水平,建议手动指定levels,比如levels = c("1", "2", "3") yitest_true <- as.factor(yitest) yitest_pred <- as.factor(yitest_pred) # 生成混淆矩阵(第一个参数是预测值,第二个是真实标签) confusion_matrix <- confusionMatrix(data = yitest_pred, reference = yitest_true) # 打印完整的混淆矩阵及评估指标 print(confusion_matrix)
方式2:用基础R的table生成简单混淆矩阵
如果只需要最基础的类别交叉统计,用基础R的table函数即可:
# 生成简单混淆矩阵 simple_conf_mat <- table( 预测类别 = yitest_pred, 真实类别 = yitest_true ) print(simple_conf_mat)
完整可运行代码(包含你的原有代码+混淆矩阵部分)
# 加载半监督学习包 library(ssc) # 加载Wine数据集 data(wine) # 分离特征和标签 cls <- which(colnames(wine) == "Wine") x <- wine[, -cls] # 特征矩阵 y <- wine[, cls] # 标签向量 x <- scale(x) # 特征标准化(距离类算法必备) set.seed(3) # 设置随机种子保证结果可复现 # 划分训练集(50%数据) tra.idx <- sample(x = length(y), size = ceiling(length(y) * 0.5)) xtrain <- x[tra.idx,] ytrain <- y[tra.idx] # 训练集中70%设为无标签样本(置为NA) tra.na.idx <- sample(x = length(tra.idx), size = ceiling(length(tra.idx) * 0.7)) ytrain[tra.na.idx] <- NA # 划分测试集(剩余50%数据) tst.idx <- setdiff(1:length(y), tra.idx) xitest <- x[tst.idx,] yitest <- y[tst.idx] # 加载caret包(用于混淆矩阵和KNN分类器) library(caret) # 训练selfTraining半监督模型 m.selft1 <- selfTraining( x = xtrain, y = ytrain, learner = knn3, learner.pars = list(k = 1), pred = "predict" ) # -------------------------- 补充的混淆矩阵代码 -------------------------- # 1. 预测测试集 yitest_pred <- predict(m.selft1, newdata = xitest) # 2. 统一转为因子(保证类别匹配) yitest_true <- as.factor(yitest) yitest_pred <- as.factor(yitest_pred) # 3. 生成带详细指标的混淆矩阵 confusion_matrix <- confusionMatrix(data = yitest_pred, reference = yitest_true) print(confusion_matrix)
关键注意事项
- 类别一致性:一定要保证预测结果和真实标签的类别水平完全一致(比如都是因子,且levels相同),否则
confusionMatrix会报错。如果你的标签是整数,转因子时可以手动指定所有可能的类别,比如:yitest_true <- factor(yitest, levels = unique(y)) yitest_pred <- factor(yitest_pred, levels = unique(y)) - 模型类型:
selfTraining是归纳式半监督模型,支持对全新的测试集做预测,所以可以直接用predict函数;如果是直推式模型(比如labelPropagation),则只能对训练时的无标签样本预测,无法直接预测全新测试集。
这样运行后,你就能得到模型在测试集上的混淆矩阵及完整评估指标啦!如果还有其他半监督学习的问题,欢迎继续提问~




