R randomForest预测recent_fall缺失major fall类别问题求解
问题原因排查
- 特征选择错误
你将full_id(受试者唯一标识)加入了训练特征,该变量为每个样本独有,完全不具备泛化预测能力,还会严重干扰模型学习年龄、疾病、性别等有效特征和跌倒类别的关联,是首要需要删除的无效特征。 - nodesize参数设置不合理
你设置nodesize = 0.01*nrow(pt_data_new),换算后节点最小样本量约为147,随机森林的分类节点要求样本量大于该值才会继续分裂,占比仅19%的major fall样本根本无法形成独立分类节点,模型会自动倾向于预测占比更高的类别来降低整体误差。 - 类别不平衡未做处理
三类标签分布差距较大,major fall占比最低,模型默认以整体准确率为优化目标,会主动牺牲小类的识别率,最终导致没有样本被判定为major fall。从你提供的混淆矩阵也能看出,major fall的分类误差高达87%,模型本身对该类的识别能力极差。
具体解决步骤
- 修正特征列表,删除无意义的id类特征
修改模型公式,去掉full_id:fall.formula <- recent_fall ~ age + gender + dx - 调整nodesize为合理值
分类任务默认nodesize为1,你的数据集可以设为1~10之间的数值,不要按样本比例设置:fall.model <- randomForest(formula=fall.formula, data=pt_data_new, ntree = 500, mtry = 2, # 总特征仅3个,mtry设为2更合理 nodesize = 5 ) - 处理类别不平衡问题
给小类设置更高的分类权重,通过classwt参数实现,权重可按类别占比的反比设置:# 计算各类别权重,占比越低权重越高 class_weights <- c( "major fall" = 1/0.19, "minor fall" = 1/0.36, "no fall" = 1/0.46 ) # 训练时加入权重参数 fall.model <- randomForest(formula=fall.formula, data=pt_data_new, ntree = 500, mtry = 2, nodesize = 5, classwt = class_weights ) - 调整预测阈值(可选)
如果加权重后还是很少有major fall的预测结果,可以放弃默认的多数投票规则,输出预测概率后手动调低major fall的判定阈值:# 输出各类别的预测概率 pred_proba <- predict(fall.model, newdata=fall_test_new, type="prob") # 手动调整阈值,比如major fall概率大于0.2就判定为该类 Fall.Prediction <- ifelse(pred_proba[,"major fall"] >= 0.2, "major fall", ifelse(pred_proba[,"minor fall"] >= 0.5, "minor fall", "no fall")) # 转成和原标签一致的因子类型 Fall.Prediction <- factor(Fall.Prediction, levels = levels(pt_data_new$recent_fall))
内容的提问来源于stack exchange,提问作者Nick Mirante
相关产品推荐
相关产品推荐

