2015-12-21 6 views
11

Я прочитал от this documentation, что:Что делает `sample_weight` так, как работает` DecisionTreeClassifier` в sklearn?

«балансировка класса может быть сделано путем отбора проб равное количество образцов из каждого класса, или, предпочтительно, путем нормализации суммы весов выборки (sample_weight) для каждого класса, к тому же стоимость."

Но, до сих пор неясно, как это работает. Если я установил sample_weight с массивом из двух возможных значений, 1 и 2, означает ли это, что образцы с 2 будут отобраны в два раза чаще, чем образцы с 1, когда вы делаете пакет? Я не могу придумать практический пример этого.

ответ

15

Так что я потратил немного времени на изучение источника sklearn, потому что на самом деле я хотел попытаться понять это сам и на некоторое время. Прошу прощения за длину, но я не знаю, как объяснить это более кратко.


Некоторые быстрые отборочные:

Допустим, у нас есть проблема классификации с классами K. В области пространства признаков, представленной узлом дерева решений, напомним, что «примесь» области измеряется путем количественной оценки неоднородности с использованием вероятности класса в этой области. Как правило, мы оцениваем:

Pr(Class=k) = #(examples of class k in region)/#(total examples in region) 

мера примеси принимает в качестве входных данных, массив классов вероятностей:

[Pr(Class=1), Pr(Class=2), ..., Pr(Class=K)] 

и выплевывает номер, который говорит вам, как «нечистый» или как неоднородная-на - класс области пространственных объектов. Например, показатель gini для проблемы двух классов - 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) 

Таким образом, мы будем смотреть деревья только с корневого узла и двух детей. Обратите внимание, что примесь по умолчанию измеряет меру gini.


Случай 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 массиве говорит нам о том, что первый пример обучения отправляется на левый дочерний узел, а 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. 

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

Вы можете расширить это с помощью нецелых выборочных измерений аналогичным образом. Я рекомендую попробовать что-то вроде sample_weight = [1,2,2.5] и подтвердить вычисленные примеси.

Надеюсь, это поможет!

+0

Для 'gini measure', не должно быть' 2/3 * (1 - 2/3) = 2/9'? Хорошо, поэтому я вижу, что это влияет на меру примеси, но как это будет отличаться от просто выборки определенной выборки чаще или реже на основе относительных «весов образца»? Спасибо за подробное объяснение! – Hunle

+0

Мера gini - '2 * p * (1-p)' для двоичной классификации, поэтому результат равен 4/9. Вы правы в своей интерпретации. Тем не менее, «выборка» предполагает случайность, которой нет (просто быть понятным). Когда 'sample_weights' являются целыми числами, это похоже на повторение примера тренировки' ith 'samples_weights [i]' times в мешающей примеси. Конечно, 'sample_weights' не должны быть целыми числами, но идея такая же. –

 Смежные вопросы

  • Нет связанных вопросов^_^