Что делает "вес выборки" с тем, как работает "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], и подтверждающ вычисленные примеси.

надеюсь, что это помогает!


Если кто-то просто ищет способ вычислить sample_weight, как я, вы можете найти это удобно.

sklearn.а utils.class_weight.compute_sample_weight