2015-12-21 5 views
11

Ich habe von this documentation gelesen, dass:Was bedeutet `sample_weight` ein` DecisionTreeClassifier` arbeitet in sklearn auf die Art und Weise zu tun?

„Class Ausgleich durch Abtasten eine gleiche Anzahl von Proben aus jeder Klasse durchgeführt werden kann, oder vorzugsweise durch die Summe der Probengewichte (sample_weight) für jede Klasse auf die gleiche Normalisierung Wert."

Aber es ist mir noch unklar, wie das funktioniert. Wenn ich sample_weight mit einem Array von nur zwei möglichen Werten, 1 's und 2' s, bedeutet dies, dass die Proben mit 2 werden doppelt so oft wie die Proben mit 1 Proben genommen werden, wenn das Bagging? Ich kann mir dafür kein praktisches Beispiel vorstellen.

Antwort

15

So verbrachte ich eine wenig Zeit an der sklearn Quelle suchen, weil ich eigentlich bisher habe Sinn, dies zu versuchen, mich während jetzt ein wenig, um herauszufinden, zu. Ich entschuldige mich für die Länge, aber ich weiß nicht, wie ich es kürzer erklären soll.


Einige schnelle Präliminarien:

Lasst uns sagen, dass wir ein Klassifikationsproblem mit K-Klassen haben. In einem Raumbereich Funktion durch den Knoten eines Entscheidungsbaums dargestellt wird, daran erinnert, dass die „Verunreinigung“ des Bereichs durch die Quantifizierung der Inhomogenität gemessen wird, um die Wahrscheinlichkeit der Klasse, in diesem Bereich verwendet wird. Normalerweise schätzen wir:

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

Der Unreinheitsmaß nimmt als Eingang, das Array von Klassenwahrscheinlichkeiten:

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

und eine Reihe ausspuckt, die Sie, wie „unrein“ oder wie inhomogene-by erzählt -Klasse die Region des Feature-Space ist. Zum Beispiel ist die Gini-Maßnahme für eine Zweiklassenproblem 2*p*(1-p), wo p = Pr(Class=1) und 1-p=Pr(Class=2).


Nun, im Grunde die kurze Antwort auf Ihre Frage ist:

sample_weight die Wahrscheinlichkeitsschätzungen in der Wahrscheinlichkeits Array erweitert ..., die die Unreinheitsmaß ergänzt ..., das verstärkt, wie Knoten aufgeteilt werden ... was den Aufbau des Baums erweitert ... was dazu beiträgt, wie der Merkmalsraum für die Klassifizierung aufgeschnitten wird.

Ich glaube, dies wird am besten durch Beispiel erläutert.


zuerst die folgenden 2-Klassen-Problem betrachten, wo die Eingänge 1 dimensional:

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) 

Also, wir werden Bäume sehen mit nur einem Wurzelknoten und zwei Kinder. Beachten Sie, dass die Standard-Verunreinigung das Gini-Maß misst.


Fall 1: keine sample_weight

dtc.fit(X,Y) 
print dtc.tree_.threshold 
# [0.5, -2, -2] 
print dtc.tree_.impurity 
# [0.44444444, 0, 0.5] 

Der erste Wert in der threshold Array sagt uns, dass die erste Trainingsbeispiel nach links untergeordneten Knoten gesendet wird, und die 2. und 3. Trainingsbeispiele werden gesendet zum rechten Kindknoten. Die letzten beiden Werte in threshold sind Platzhalter und sind zu ignorieren. Das Array impurity teilt uns die berechneten Verunreinigungswerte im Elternknoten, im linken bzw. rechten Knoten mit.

Im übergeordneten Knoten, p = Pr(Class=1) = 2./3., so dass gini = 2*(2.0/3.0)*(1.0/3.0) = 0.444..... Sie können auch die Verunreinigungen des untergeordneten Knotens bestätigen.


Fall 2: mit sample_weight

Jetzt wollen wir versuchen:

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.] 

Sie die Funktion Schwelle unterscheidet sehen kann. sample_weight beeinflusst auch das Verunreinigungsmaß in jedem Knoten. Insbesondere wird in den Wahrscheinlichkeitsschätzungen das erste Trainingsbeispiel gleich gezählt, das zweite wird doppelt gezählt, und das dritte wird aufgrund der von uns bereitgestellten Beispielgewichte als dreifach gezählt.

Die Verunreinigung in der Elternknotenregion ist die gleiche. Das ist nur ein Zufall. Wir können es direkt berechnen:

p = Pr(Class=1) = (1+3)/(1+2+3) = 2.0/3.0 

Der Gini-Maß für 4/9 folgt.

Nun können Sie vom ausgewählten Schwellenwert aus sehen, dass das erste und das zweite Trainingsbeispiel an den linken Kindknoten gesendet werden, während der dritte nach rechts gesendet wird. Wir sehen, dass Verunreinigung berechnet 4/9 auch im linken Kindknoten zu sein, weil:

p = Pr(Class=1) = 1/(1+2) = 1/3. 

Die Verunreinigung von Null im rechten Kind fällig ist nur ein Trainingsbeispiel in diesem Bereich liegt.

Sie können dies ähnlich mit nicht ganzzahligen Sample-Wights erweitern. Ich empfehle, etwas wie sample_weight = [1,2,2.5] zu versuchen und die berechneten Verunreinigungen zu bestätigen.

Hoffe, das hilft!

+0

Für das 'Gini-Maß' sollte es nicht' 2/3 * (1 - 2/3) = 2/9' sein? Okay, ich sehe, dass es das Verunreinigungsmaß beeinflusst, aber wie würde das anders sein, wenn man eine bestimmte Stichprobe häufiger oder weniger häufig sticht, basierend auf relativen "Stichprobengewichten"? Danke für die ausführliche Erklärung! – Hunle

+0

Das Gini-Maß ist '2 * p * (1-p)' für die binäre Klassifizierung, weshalb das Ergebnis 4/9 ist. Du hast Recht in deiner Interpretation. "Sampling" deutet jedoch auf Zufälligkeiten hin, die es nicht gibt (nur um klar zu sein). Wenn 'sample_weights' ganze Zahlen sind, ist es so, als würde man das' ith' Trainingsbeispiel 'samples_weights [i]' mal im Verunreinigungsmaß replizieren. Natürlich müssen 'sample_weights' nicht ganze Zahlen sein, aber die Idee ist dieselbe. –

Verwandte Themen