树基算法在重复特征下的表现差异及原因探究
树基分类器处理重复特征的表现差异问题
我不理解为何使用的三种树基分类器表现截然不同,尽管它们本应具有相似特性。我原本预期添加重复特征这类冗余信息会导致模型得分下降,RandomForest的表现符合该预期,但DecisionTree与LGBM的得分却保持稳定。想请教为何后两者未出现得分下降?是否在理论层面存在认知遗漏?
实验代码
from sklearn import datasets from sklearn.ensemble import RandomForestClassifier from sklearn.tree import DecisionTreeClassifier from lightgbm import LGBMClassifier from sklearn.model_selection import cross_validate import matplotlib.pyplot as plt import numpy as np # load data wine = datasets.load_wine() X = wine.data y = wine.target # some helper functions def repeat_feature(X,which=1,times=1): return np.hstack([X,np.hstack([X[:, :which]]*times)]) def do_the_job(X,y,clf): return np.mean(cross_validate(clf, X, y,cv=5)['test_score']) # define the classifiers clf1=DecisionTreeClassifier(max_depth=25,random_state=42) clf2=RandomForestClassifier(n_estimators=5,random_state=42) clf3=LGBMClassifier(n_estimators=5,random_state=42) # repeat up to 50 times the same feature and test the classifiers clf1_result=[] clf2_result=[] clf3_result=[] for i in range(1,50): my_x=repeat_feature(X,times=i) clf1_result.append(do_the_job(my_x,y,clf1)) clf2_result.append(do_the_job(my_x,y,clf2)) clf3_result.append(do_the_job(my_x,y,clf3)) # plot the mean of the cv-scores for each classifier plt.figure(figsize=(12,7)) plt.plot(clf1_result,label='tree') plt.plot(clf2_result,label='forest') plt.plot(clf3_result,label='boost') plt.legend()
实验结果图

核心原因分析
1. 单棵决策树(DecisionTree)的特性
单棵决策树在分裂节点时,会选择最优的分裂特征和阈值——哪怕有一堆重复特征,只要其中一个能带来最大信息增益(或基尼系数下降),树就会优先用它,剩下的重复特征根本没机会被选中。而且你的树设了max_depth=25,远大于wine数据集需要的深度,树完全可以在不依赖冗余特征的情况下学到足够的划分规则,重复特征不会干扰它的决策逻辑,自然不会降低得分。
2. LightGBM的优化机制
LGBM用的是直方图优化和梯度单边采样(GOSS),而且在特征选择上有两个关键设计:
- 它会对特征进行直方图统计,重复特征的直方图完全一致,在分裂时只会被当成同一个有效特征的“镜像”,不会额外增加计算负担或干扰分裂选择;
- LGBM默认的特征选择逻辑是每次只选当前最优的分裂点,重复特征无法提供新的分裂增益,所以不会被模型采纳,也就不会影响最终性能。另外,LGBM的boosting过程是逐步修正残差,冗余特征对残差的修正没有帮助,模型会自动忽略它们。
3. 随机森林(RandomForest)的退化原因
随机森林的核心是随机子空间采样——每棵树训练时会随机选一部分特征子集。当你加入大量重复特征后,每次随机采样选中重复特征的概率会大幅提升,相当于每棵树能用到的有效特征数量被稀释了。比如原本有13个有效特征,你加了50个重复的,总特征数变成63,随机采样时很可能选到一堆重复的“无效”特征,导致单棵树的性能下降,而森林的整体性能是多棵树的平均,自然跟着下降。而且你只设了n_estimators=5,树的数量少,这种稀释效应会更明显。
补充验证建议
- 把随机森林的
n_estimators调大(比如到100),你会发现性能下降的幅度会变小——更多的树能抵消部分单棵树的性能损失; - 给决策树加上
max_features限制(比如设为sqrt),模拟随机森林的子空间采样,这时重复特征也会导致它的性能下降; - 观察LGBM的
feature_importances_,会发现重复特征的权重几乎为0,说明模型确实没用到它们。
内容的提问来源于stack exchange,提问作者mat
相关产品推荐
相关产品推荐

