如何修复机器学习中随机森林与决策树的完美得分异常
训练集全满分(过拟合)+ KNN表现差的排查与解决方法
一、决策树/随机森林训练集全满分的核心原因
决策树默认不限制树的深度,会完全拟合训练数据的所有细节(包括噪声),自然会出现训练集指标全1.0的情况;随机森林作为集成模型,默认参数下若单棵树无复杂度限制,也会趋近于完全拟合训练数据,本质都是过拟合。
二、针对性解决步骤
1. 给树模型添加正则化约束(解决过拟合)
通过限制树的复杂度,避免模型过度拟合训练数据:
- 决策树:设置最大深度、叶节点最小样本数等参数
dtc = DecisionTreeClassifier(max_depth=5, min_samples_split=10, min_samples_leaf=5, random_state=7)
- 随机森林:除了上述参数,还可限制单棵树使用的特征数量
rfc = RandomForestClassifier(max_depth=8, min_samples_split=10, max_features='sqrt', n_estimators=100, random_state=7)
调整后训练集指标会降到合理范围,同时测试集的泛化表现大概率会提升。
2. 修正数据预处理流程(解决KNN表现差+数据泄露)
你的代码里存在几个预处理错误,直接影响模型效果:
- 插补器拟合逻辑错误:不能用整个数据集拟合插补器,会导致数据泄露,正确流程是拆分数据集后,只在训练集上拟合插补器,再转换训练集和测试集:
# 先拆分数据集 features = data.drop(["Status"], axis=1) outcome_variable = data["Status"] x_train, x_test, y_train, y_test = train_test_split(features, outcome_variable, test_size=0.20, random_state=7) # 仅在训练集拟合插补器 imp_median.fit(x_train) x_train_median = imp_median.transform(x_train) x_test_median = imp_median.transform(x_test)
- 缩放步骤重复:
minmaxScale.fit_transform(data_median.values)后又重复调用transform,导致数据范围异常,KNN对特征尺度极度敏感,这会直接破坏其距离计算逻辑。正确缩放流程:
minmaxScale = MinMaxScaler() x_train_scaled = minmaxScale.fit_transform(x_train_median) x_test_scaled = minmaxScale.transform(x_test_median)
- 列名不一致:代码中把
T Stage改成了T Stage(多了空格),可能导致后续特征匹配混乱,需统一所有列名。
3. 规范类别不平衡处理(结合SMOTE)
从KNN极低的召回率来看,数据集大概率存在类别不平衡(比如存活样本远多于死亡样本)。你用了SMOTE,但要注意:
- SMOTE只能应用在训练集上,绝对不能碰测试集,避免数据泄露;
- 应用SMOTE后,需重新训练所有模型,此时KNN的少数类召回率会得到改善,树模型也需要重新调整正则化参数。
三、额外排查点
- 确认目标变量
Status是二分类编码(如0/1),无异常值; - 检查是否存在与
Status完全相关的特征(比如某特征的取值直接决定目标变量),这种情况会导致树模型直接拟合该特征,出现训练集全满分; - 调整KNN的
n_neighbors参数(比如尝试3、7、10),KNN默认值未必适配你的数据集。
四、验证效果的正确流程
- 先修正预处理逻辑,确保无数据泄露;
- 调整树模型的正则化参数,观察训练集与测试集的指标差距;
- 在训练集上应用SMOTE后,重新训练所有模型,对比指标变化;
- 用10折交叉验证的结果评估模型稳定性,而非单次拆分的测试集结果。
内容的提问来源于stack exchange,提问作者Kat_9213
相关产品推荐
相关产品推荐

