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会无限制分裂节点,直到每个叶子节点内的样本全属于同一类别。这直接导致两个问题:
- 训练集准确率拉满到100%,但模型完全记住了训练数据的噪声,泛化能力极差,测试集表现大幅下滑到66%
- 每个叶子节点的类别概率只能是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
相关产品推荐
相关产品推荐

