【问题标题】:How to amend the splitting criteria (gini/entropy) in a decision tree algorithm in Scikit-Learn?如何在 Scikit-Learn 中修改决策树算法中的分裂标准(基尼/熵)?
【发布时间】:2018-10-04 18:32:23
【问题描述】:

我在二元分类问题上使用决策树算法,目标是最小化分类的误报(最大化positive predicted value)(诊断工具的成本非常高)。

有没有办法在基尼/熵分裂标准中引入weight 来惩罚误报错误分类?

Here为例,修改后的基尼指数为:

因此我想知道是否有任何方法可以在 Scikit-learn 中实现它?

编辑

使用class_weight 产生以下结果:

from sklearn import datasets as dts
iris_data = dts.load_iris()

X, y = iris_data.features, iris_data.targets
# take only classes 1 and 2 due to less separability
X = X[y>0]
y = y[y>0]
y = y - 1 # make binary labels

# define the decision tree classifier with only two levels at most and no class balance
dt = tree.DecisionTreeClassifier(max_depth=2, class_weight=None)

# fit the model, no train/test for simplicity
dt.fit(X[:55,:2], y[:55])

绘制决策边界和树蓝色为正(1)

虽然超过了少数类(或更珍贵):

dt_100 = tree.DecisionTreeClassifier(max_depth=2, class_weight={1:100})

【问题讨论】:

    标签: python scikit-learn classification decision-tree gini


    【解决方案1】:

    决策树分类器支持class_weight 参数。

    在两类问题中,这可以完全解决您的问题。通常这用于不平衡的问题。对于两个以上的类,不可能提供单独的标签(据我所知)

    【讨论】:

    • 谢谢,我试过了,但是当我超过一个类时,决策树和选定的特征/阈值会随着类权重的变化而急剧变化。我将用一个例子来更新我的答案。类权重只是乘以数据点的数量。
    • 必须预料到树的(剧烈)变化!为什么类权重会乘以数据点的数量?你在哪里找到的?
    • 我更新了问题。根据树形图,您可以很容易地看出点数的差异。 class_weight 选项只是创建指定类的多个副本。受控引导。
    • 不确定副本,但我认为这个想法是相关的。无论如何,您正在惩罚一个类的分类结果。您在第二张图片中看到,错误分类的蓝色比红色更昂贵。那么你会期待什么呢?那么是不是顶层节点的基尼数总是一样的问题呢?
    • 但是你正在这样做:在你的迷你公式中,你增加了 L12=2 的索引,比如说。如果您现在考虑重新采样,并且您将一个类的重新采样频率提高了两倍,那么您只需添加双倍数量的术语即可。然后导致相同的结果。
    猜你喜欢
    • 2022-11-05
    • 2016-12-31
    • 2016-08-12
    • 2017-12-14
    • 2020-01-06
    • 2017-08-17
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多