R语言ranger包构建随机森林预测MNIST如何输出0-9整数结果
问题描述
在R语言中使用ranger包构建随机森林模型,基于MNIST像素数据训练模型预测0-9手写数字类别时,运行以下代码后得到的预测结果存在大量连续型小数,不符合分类任务输出整数类别的预期:
set.seed(1031) forestranger <- ranger(Y ~ ., data = mnisttrain, num.trees = 1000) predictions <- predict(forestranger, data = mnisttest, num.trees = 1000)
问题原因
ranger默认会根据响应变量的数据类型自动判定建模任务类型:如果训练集中的标签列Y是数值型(numeric),ranger会默认执行回归任务,输出连续型预测值;只有当Y为因子型(factor),或显式指定分类任务参数时,才会执行分类任务输出离散类别。
解决方法
选择以下任意一种方式调整,即可得到0-9区间的整数预测结果:
- 方法1:训练前将标签列转换为因子类型,让ranger自动识别为分类任务
set.seed(1031) # 将训练集标签转为因子型 mnisttrain$Y <- as.factor(mnisttrain$Y) forestranger <- ranger(Y ~ ., data = mnisttrain, num.trees = 1000) predictions <- predict(forestranger, data = mnisttest, num.trees = 1000) # 提取预测类别,如需整数格式可做类型转换 pred_result <- as.numeric(as.character(predictions$predictions)) - 方法2:调用ranger时显式声明分类任务,无需提前转换标签类型
set.seed(1031) # 添加classification = TRUE参数,强制执行分类任务 forestranger <- ranger(Y ~ ., data = mnisttrain, num.trees = 1000, classification = TRUE) predictions <- predict(forestranger, data = mnisttest, num.trees = 1000) pred_result <- as.numeric(as.character(predictions$predictions))
注意事项
- 不要直接对回归输出的连续值做四舍五入取整当分类结果用,这种操作本质是错用回归模型解决分类问题,会大幅降低预测准确率,不符合随机森林分类的建模逻辑。
- 如果需要输出每个类别的预测概率而非硬分类结果,可以在训练ranger模型时设置
probability = TRUE,此时预测结果会返回每个样本对应0-9共10个类别的概率值。
内容的提问来源于stack exchange,提问作者amatof
相关产品推荐
相关产品推荐

