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

scikit-learn DecisionTreeClassifier的class_weight参数对混淆矩阵召回率无效果求解

关于scikit-learn DecisionTreeClassifier的class_weight参数无效问题的解答

核心原因

你观察到class_weight参数几乎无作用、甚至少数类召回下降,核心是未加剪枝约束的决策树对类别权重的修正不敏感:
scikit-learn的DecisionTreeClassifier默认参数为无剪枝配置(max_depth=None、min_samples_split=2、min_samples_leaf=1),树会尽可能拟合所有训练样本的特征模式。你的数据集不均衡比接近8:1,占绝对多数的'no'类样本的特征模式会主导分裂规则,class_weight带来的损失权重修正很容易被过拟合的分支抵消,无法在泛化时体现对少数类的倾斜。

对应的解决方法

  • 第一步:给决策树增加剪枝约束
    限制树的复杂度,让类别权重能真正影响节点分裂的增益计算,参考调整参数示例:
    clf = DecisionTreeClassifier(
        criterion='entropy',
        random_state=42,
        class_weight='balanced',
        max_depth=5, # 限制树的最大深度,可在3-10范围内调参
        min_samples_leaf=20, # 每个叶子节点最少样本数,避免出现仅拟合个例的分支
        min_samples_split=30 # 节点分裂所需的最少样本数
    )
    
    固定剪枝参数后再对比开启/关闭class_weight的效果,混淆矩阵的差异会非常明显,适合课堂演示。
  • 第二步:调参时使用面向不均衡分类的评价指标
    不要使用默认的准确率作为模型选择标准,改用少数类召回率recall、F1值或者ROC-AUC作为调参的评分指标,确保参数选择向提升少数类效果倾斜。
  • 第三步:可配合样本层面的不均衡处理
    如果需要进一步提升'yes'类的召回,可以在训练集对'yes'类做SMOTE过采样,或者对'no'类做随机欠采样,配合类别加权效果会更好。

当前少数类召回下降的说明

无剪枝的情况下,加权后的损失函数会让树优先降低少数类的训练错误,但会拟合很多少数类的独有噪声特征,反而降低了泛化能力,导致测试集上少数类的召回出现异常下降。增加剪枝后这个问题会自然消失。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:45:04