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
相关产品推荐
相关产品推荐

