python - DecisionTreeClassifier 的 class_weight 属性对混淆矩阵没有影响,召回
问题描述
我正在为讲座准备成本敏感分类的演示,我很困惑为什么 scikit-learn 的 DecisionTreeClassifier 的 class_weight='balanced' 属性似乎根本没有效果。
该数据集有 4521 个实例,有 4000 个“否”值和 521 个“是”值。我正在使用 70/30 的训练/测试拆分,使用此代码构建和拟合模型:
clf = DecisionTreeClassifier(criterion='entropy',random_state=42,class_weight='balanced')
clf.fit(X_train, y_train)
我还尝试为类属性值设置特定的权重。
没有平衡的典型混淆矩阵是:
[[1076 109]
[ 105 67]]
一个典型的平衡混淆矩阵是:
[[1108 77]
[ 112 60]]
不仅平衡似乎没有效果,而且在这些情况下,允许随机选择测试用例,“是”的召回变得更糟。我觉得我缺少一些非常简单和明显的东西。任何人都可以帮忙吗?
解决方案
由于您的问题是二元分类,因此请使用 ROC AUC 评估模型性能(标准决策树和加权决策树)。
即使是轻微的,加权决策树也有望表现更好。
使用不同的类权重可能会获得更好的性能,这也取决于用于评估模型的性能指标的选择[1]。
您可以使用网格搜索为加权决策树查找一系列不同的类权重,并发现哪些结果会产生最佳 ROC AUC 分数[1]。
有关成本敏感模型的进一步阅读和实践,请查看此链接。
[1]不平衡分类的成本敏感决策树。
推荐阅读
- azure - 使用 ARM/Azure 资源组部署 Azure Function 代码
- assembly - 程序集 8086 - 分数无法正常工作
- c# - 如何将进度条和状态添加到没有像复制文件那样计数的进程?
- python - 如何从文件中读取并将不重复的数字添加到 Python 中的列表中?
- javascript - Rails 6 中按钮无法实现功能的错误
- javascript - 页面完全加载时的Javascript随机点击
- haskell - 用另一个默认值 Haskell 替换默认值
- android - 系统重启后 Android 本地通知不会触发
- python - Python:为什么我的代码一直告诉我答案是错误的,而事实并非如此?
- python - Python 在保存函数定义的同时运行 JavaScript 代码