自定义Random Forest模型训练零误差但测试准确率极低问题排查
问题根因分析
- 最致命的错误是测试集特征维度与训练集不匹配:
你给出的训练集shape为(300,30),代表300个样本、每个样本含30个特征;但测试集shape为(300,1),每个样本仅1个特征。模型训练阶段学习的是30维特征的分布规律,预测时输入1维特征完全不符合模型预期,输出结果基本等同于随机猜测,二分类任务下准确率自然接近50%。大概率是你在拆分训练/测试集时操作失误,把特征和标签的维度搞混了。
- 决策树未做剪枝,严重过拟合训练集:
你直接使用sklearn默认参数的DecisionTreeClassifier,默认没有设置最大深度、最小样本分裂数等剪枝参数,决策树会生长到完全拟合所有训练样本,因此训练准确率极高,但泛化能力极差。 - Bagging采样逻辑不符合标准实现:
标准Bagging是有放回随机采样构建每个树的训练子集,你当前的实现是直接打乱训练集后取前size_of_bag个样本,属于无放回采样,会导致不同树的训练集重叠度过高,树之间的相似度太高,集成后反而会降低泛化效果。
修复方案
- 优先修正数据集拆分逻辑,保证测试集的特征维度和训练集一致,即测试集shape应为(M, 30),对应测试标签shape为(M,1),你当前的测试集(300,1)大概率是误把测试标签当成了测试特征。
- 给决策树添加剪枝参数,示例:
tree = DecisionTreeClassifier(max_depth=5, min_samples_split=10)
- 修正Bagging的采样逻辑,改为有放回采样:
# 替换原fit_tree_on_bag函数内的采样逻辑 indices = np.random.choice(train_data.shape[0], size=size_of_bag, replace=True) train_data_bag = train_data[indices] train_labels_bag = train_labels[indices]
内容的提问来源于stack exchange,提问作者Swearinbag
相关产品推荐
相关产品推荐

