web-dev-qa-db-fra.com

Que fait `sample_weight` à la façon dont un` DecisionTreeClassifier` fonctionne dans sklearn?

J'ai lu dans cette documentation que:

"L'équilibrage des classes peut être effectué en échantillonnant un nombre égal d'échantillons de chaque classe, ou de préférence en normalisant la somme des poids d'échantillons (sample_weight) pour chaque classe à la même valeur."

Mais, je ne sais toujours pas comment cela fonctionne. Si je mets sample_weight Avec un tableau de seulement deux valeurs possibles, celles de 1 Et de 2, Cela signifie-t-il que les échantillons avec 2 ' s seront-ils échantillonnés deux fois plus souvent que les échantillons contenant 1 lors de l'ensachage? Je ne peux pas penser à un exemple pratique pour cela.

28
Hunle

J'ai donc passé un peu de temps à regarder la source sklearn parce que je voulais essayer de comprendre cela moi-même depuis un petit moment maintenant aussi. Je m'excuse pour la longueur, mais je ne sais pas comment l'expliquer plus brièvement.


Quelques préliminaires rapides:

Disons que nous avons un problème de classification avec les classes K. Dans une région d'espace caractéristique représentée par le nœud d'un arbre de décision, rappelons que "l'impureté" de la région est mesurée en quantifiant l'inhomogénéité, en utilisant la probabilité de la classe dans cette région. Normalement, nous estimons:

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

La mesure d'impureté prend en entrée, le tableau des probabilités de classe:

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

et crache un nombre, qui vous indique à quel point "impure" ou inhomogène par classe la région de l'espace caractéristique est. Par exemple, la mesure de Gini pour un problème à deux classes est 2*p*(1-p), où p = Pr(Class=1) et 1-p=Pr(Class=2).


Maintenant, fondamentalement, la réponse courte à votre question est:

sample_weight Augmente les estimations de probabilité dans le tableau de probabilité ... qui augmente la mesure d'impureté ... qui augmente la façon dont les nœuds sont divisés ... qui augmente la façon dont l'arbre est construit .. qui augmente la façon dont l'espace des fonctionnalités est découpé pour la classification.

Je crois que cela est mieux illustré par l'exemple.


Considérons d'abord le problème à 2 classes suivant où les entrées sont à 1 dimension:

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)

Nous allons donc regarder les arbres avec juste un nœud racine et deux enfants. Notez que l'impureté par défaut mesure la mesure de Gini.


Cas 1: non sample_weight

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

La première valeur du tableau threshold nous indique que le 1er exemple de formation est envoyé au nœud enfant gauche et les 2e et 3e exemples de formation sont envoyés au nœud enfant droit. Les deux dernières valeurs dans threshold sont des espaces réservés et doivent être ignorées. Le tableau impurity nous indique les valeurs d'impuretés calculées respectivement dans les nœuds parent, gauche et droit.

Dans le nœud parent, p = Pr(Class=1) = 2. / 3., de sorte que gini = 2*(2.0/3.0)*(1.0/3.0) = 0.444..... Vous pouvez également confirmer les impuretés du nœud enfant.


Cas 2: avec sample_weight

Maintenant, essayons:

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

Vous pouvez voir que le seuil de fonctionnalité est différent. sample_weight Affecte également la mesure d'impureté dans chaque nœud. Plus précisément, dans les estimations de probabilité, le premier exemple d'apprentissage est compté de la même manière, le deuxième est compté double et le troisième est compté triple, en raison des poids d'échantillonnage que nous avons fournis.

L'impureté dans la région du nœud parent est la même. Ce n'est qu'une coïncidence. Nous pouvons le calculer directement:

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

La mesure de Gini de 4/9 Suit.

Maintenant, vous pouvez voir à partir du seuil choisi que les premier et deuxième exemples d'apprentissage sont envoyés au nœud enfant gauche, tandis que le troisième est envoyé à droite. Nous voyons que l'impureté est calculée pour être 4/9 Également dans le nœud enfant gauche parce que:

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

L'impureté de zéro chez le bon enfant est due à un seul exemple de formation se trouvant dans cette région.

Vous pouvez étendre cela avec des poids d'échantillon non entiers de manière similaire. Je recommande d'essayer quelque chose comme sample_weight = [1,2,2.5] Et de confirmer les impuretés calculées.

J'espère que cela t'aides!

38
Matt Hancock

Si quelqu'un cherche simplement le moyen de calculer le sample_weight comme je l'étais, vous pourriez trouver cela pratique.

sklearn.utils.class_weight.compute_sample_weight

3
Chris Farr