梯度提升机(GBM)在随机数据上准确率100%问题排查求助
问题分析与解决方案
首先,你遇到的核心问题是随机数据生成时的特征-标签拆分错误,这直接导致GBM能拿到100%准确率,RFC准确率偏高。咱们一步步拆解:
1. 致命错误:随机数据的特征矩阵包含了标签列
看你的随机数据代码:
rand = np.column_stack((random, ran)) X1 = rand[:161] # 这里是错误的写法! Y1 = rand[:,-1]
rand的形状是(161, 162):前161列是随机特征,最后1列是标签ran。但你写的X1 = rand[:161]是取所有161行(本来就只有161行),等于把包含标签的全部162列都作为特征输入给模型了!
这就相当于让模型直接“看答案做题”:特征里已经有了目标标签,GBM这类强模型当然能100%拟合,RFC也能轻松捕捉到这个关联,所以准确率异常偏高。
2. 修复第一步:修正特征与标签的拆分
把随机数据的特征提取代码改成:
X1 = rand[:, :-1] # 取所有行,除了最后一列的标签 Y1 = rand[:, -1]
这样X1才是纯粹的随机特征,和Y1完全无关,此时所有模型在随机数据上的准确率应该接近25%(4分类任务的随机猜测准确率),这才是合理的结果。
3. 其他需要注意的细节
除了这个核心错误,还有几个小细节可以优化:
- 统一数据处理流程:真实数据你用了
MinMaxScaler做特征缩放,但随机数据没有。为了保证对比的公平性,随机数据也应该做同样的缩放处理:X1 = MinMaxScaler().fit_transform(rand[:, :-1]) Y1 = rand[:, -1] - 废弃参数的替换:你用的
GridSearchCV里的iid=False在scikit-learn 0.22版本之后已经被废弃,建议移除这个参数(默认refit=True是合理的)。 - RFC的过拟合风险:你的RFC参数设置了
bootstrap=False,这会让每棵树使用全部训练数据生成,相比默认的bootstrap=True(随机采样)更容易过拟合。如果后续测试中RFC在正确的随机数据上仍有偏高准确率,可以尝试把bootstrap改回True。
预期修复后的结果
修正特征拆分后,所有模型在随机数据上的交叉验证准确率应该围绕25%波动,比如LR、SVM、MLP/Keras会接近25%,GBM和RFC可能因为模型复杂度略高有小幅波动,但绝不会出现100%或62%的异常值。
内容的提问来源于stack exchange,提问作者DN1
相关产品推荐
相关产品推荐

