gpt4 book ai didi

scikit-learn - `sample_weight` 对 `DecisionTreeClassifier` 在 sklearn 中的工作方式有何影响?

转载 作者:行者123 更新时间:2023-12-03 08:47:55 26 4
gpt4 key购买 nike

我读过 relevant documentation那 :

Class balancing can be done by sampling an equal number of samples from each class, or preferably by normalizing the sum of the sample weights (sample_weight) for each class to the same value.


但是,我仍然不清楚这是如何工作的。如果我设置 sample_weight一个只有两个可能值的数组, 1的和 2的,这是否意味着具有 2 的样本的采样频率将是 1 的采样频率的两倍什么时候做套袋?我想不出一个实际的例子。

最佳答案

一些快速的初步准备:
假设我们有 K 个类别的分类问题。在由决策树的节点表示的特征空间区域中,回想一下,该区域的“杂质”是通过使用该区域中类的概率来量化不均匀性来测量的。通常,我们估计:

Pr(Class=k) = #(examples of class k in region) / #(total examples in region)
杂质度量将类概率数组作为输入:
[Pr(Class=1), Pr(Class=2), ..., Pr(Class=K)]
并吐出一个数字,它告诉您特征空间区域的“不纯”或按类别的不均匀程度。例如,两类问题的基尼系数是 2*p*(1-p) , 其中 p = Pr(Class=1)1-p=Pr(Class=2) .

现在,基本上对您的问题的简短回答是:
sample_weight增加概率数组中的概率估计 ...增加了杂质度量...增加了节点的 split 方式...增加了树的构建方式...增加了特征空间如何被切 block 以进行分类。
我相信这最好通过例子来说明。

首先考虑以下 2 类问题,其中输入是一维的:
from sklearn.tree import DecisionTreeClassifier as DTC

X = [[0],[1],[2]] # 3 simple training examples
Y = [ 1, 2, 1 ] # class labels

dtc = DTC(max_depth=1)
因此,我们将查看只有一个根节点和两个子节点的树。请注意,默认的杂质度量是基尼度量。

案例一:否 sample_weight
dtc.fit(X,Y)
print dtc.tree_.threshold
# [0.5, -2, -2]
print dtc.tree_.impurity
# [0.44444444, 0, 0.5]
threshold 中的第一个值数组告诉我们第一个训练样例被发送到左子节点,第二个和第三个训练样例被发送到右子节点。 threshold 中的最后两个值是占位符,将被忽略。 impurity数组分别告诉我们计算出的父节点、左节点和右节点中的杂质值。
在父节点中, p = Pr(Class=1) = 2. / 3. ,所以 gini = 2*(2.0/3.0)*(1.0/3.0) = 0.444.... .您也可以确认子节点杂质。

案例 2:使用 sample_weight现在,让我们试试:
dtc.fit(X,Y,sample_weight=[1,2,3])
print dtc.tree_.threshold
# [1.5, -2, -2]
print dtc.tree_.impurity
# [0.44444444, 0.44444444, 0.]
可以看到特征阈值不同。 sample_weight也影响每个节点的杂质测量。具体来说,在概率估计中,由于我们提供的样本权重,第一个训练样本被计算为相同,第二个被计算为两倍,第三个被计算为三倍。
父节点区域的杂质是一样的。这只是一个巧合。我们可以直接计算:
p = Pr(Class=1) = (1+3) / (1+2+3) = 2.0/3.0
4/9 的基尼系数跟随。
现在,您可以从选择的阈值中看到,第一个和第二个训练示例被发送到左侧子节点,而第三个被发送到右侧。我们看到杂质被计算为 4/9也在左子节点中,因为:
p = Pr(Class=1) = 1 / (1+2) = 1/3.
右 child 中的零杂质是由于该区域中只有一个训练样本。
您可以类似地使用非整数样本权重扩展它。我建议尝试类似 sample_weight = [1,2,2.5] ,并确认计算的杂质。

关于scikit-learn - `sample_weight` 对 `DecisionTreeClassifier` 在 sklearn 中的工作方式有何影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34389624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com