Так что я потратил немного времени на изучение источника 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]
и подтвердить вычисленные примеси.
Надеюсь, это поможет!
Для 'gini measure', не должно быть' 2/3 * (1 - 2/3) = 2/9'? Хорошо, поэтому я вижу, что это влияет на меру примеси, но как это будет отличаться от просто выборки определенной выборки чаще или реже на основе относительных «весов образца»? Спасибо за подробное объяснение! – Hunle
Мера gini - '2 * p * (1-p)' для двоичной классификации, поэтому результат равен 4/9. Вы правы в своей интерпретации. Тем не менее, «выборка» предполагает случайность, которой нет (просто быть понятным). Когда 'sample_weights' являются целыми числами, это похоже на повторение примера тренировки' ith 'samples_weights [i]' times в мешающей примеси. Конечно, 'sample_weights' не должны быть целыми числами, но идея такая же. –