You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DecisionTreeClassifier predict_proba仅输出0/1值的问题求助

问题描述

我正在做机器学习课程的Kaggle学生表现预测项目,针对每个问题(1-18)构建了DecisionTreeClassifier。但测试时调用predict_proba,返回结果仅为[0.,1.]或[1.,0.]这类极端值,无法进行阈值调整。

模型训练集准确率100%,测试集仅66%。尝试过处理数据列或添加.values,均无改善,请问原因是什么?

模型拟合代码

values_train = df_group.loc[:, ~df_group.columns.isin(["level_group", "correct"])]

dt = DecisionTreeClassifier()
dt.fit(X=values_train, y=df_group["correct"])

预测结果示例

trees["1_0-4"].predict_proba(tests[0])

array([[0., 1.],
       [0., 1.],
       [1., 0.],
       ...,
       [0., 1.],
       [1., 0.],
       [0., 1.]])

问题原因与解决方法

核心原因:决策树严重过拟合

默认参数的DecisionTreeClassifier会无限制分裂节点,直到每个叶子节点内的样本全属于同一类别。这直接导致两个问题:

  1. 训练集准确率拉满到100%,但模型完全记住了训练数据的噪声,泛化能力极差,测试集表现大幅下滑到66%
  2. 每个叶子节点的类别概率只能是0或1,所以predict_proba必然输出极端值,无法进行阈值调整

解决办法

通过限制决策树复杂度缓解过拟合,常用参数调整方向:

  • 设置最大深度:DecisionTreeClassifier(max_depth=5)(具体数值可通过交叉验证调优,比如从3到10尝试)
  • 限制叶子节点最小样本数:min_samples_leaf=5,避免单个样本单独构成叶子节点
  • 限制内部节点分裂所需最小样本数:min_samples_split=10,减少不必要的分裂
  • 使用代价复杂度剪枝:ccp_alpha=0.01(通过交叉验证选择合适的alpha值,自动剪掉对模型性能贡献极小的分支)

另外,也可以直接改用集成模型(如随机森林、梯度提升树),这类模型通过多个决策树的投票机制天然降低过拟合风险,输出的概率更平滑,更适合后续阈值调整操作。

内容的提问来源于stack exchange,提问作者Hitsuji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:54:54