Что делает "вес выборки" с тем, как работает "DecisionTreeClassifier" в sklearn?
Я читал от документация что :
"балансировка классов может быть выполнена путем выборки равного количества выборок из каждого класса или предпочтительно путем нормализации суммы Весов выборки (sample_weight) для каждого класса до одного и того же значения."
но мне все еще непонятно, как это работает. Если я установлю sample_weight
с массивом только из двух возможных значений,1
и 2
, означает ли это, что образцы с 2
'ы получите пробовали в два раза чаще, чем образцы с 1
' s, когда делать мешки? Я не могу придумать для этого практического примера.
2 ответов
несколько быстрых предварительных замечаний:
предположим, у нас есть проблема классификации с 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
увеличивает оценки вероятности в вероятностном массиве ... что увеличивает меру нечистоты ... что увеличивает разбиение узлов... что увеличивает Способ построения дерева ... что увеличивает, как пространство объектов нарезается для классификации.
я считаю, что это лучше всего проиллюстрировать на примере.
сначала рассмотрим следующую проблему 2-класса, где входы равны 1 размерный:
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)
Итак, мы будем искать деревья только с корневым узлом и двумя детьми. Обратите внимание, что примесь по умолчанию измеряет меру Джини.
Случай 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
array сообщает нам, что 1-й пример обучения отправляется в левый дочерний узел, а 2-й и 3-й примеры обучения отправляются в правый дочерний узел. Последние два значения в 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.
нечистота нуля в правом ребенке обусловлена только одним примером обучения, лежащим в этой области.
вы можете расширить это с помощью нецелочисленных образцов-wights аналогично. Я рекомендую попробовать что-то вроде sample_weight = [1,2,2.5]
, и подтверждающ вычисленные примеси.
надеюсь, что это помогает!