web-dev-qa-db-ja.com

sklearnでの `DecisionTreeClassifier`の動作に対して、` sample_weight`は何をしますか?

このドキュメント から読んだことがあります:

「各クラスから同数のサンプルをサンプリングするか、できれば各クラスのサンプル重量の合計(sample_weight)を同じ値に正規化することにより、クラスのバランスを取ることができます。」

しかし、これがどのように機能するのかはまだわかりません。 sample_weight1の2つの可能な値のみの配列で2を設定した場合、これは2のサンプルがサンプルの2倍の頻度でサンプリングされることを意味しますバギングを行うときに1の?この実用的な例を考えることはできません。

28
Hunle

だから私は実際に少しの間これを自分自身で理解しようとするつもりだったので、sklearnソースを見て少し時間を費やしました。長さについては謝罪しますが、もっと簡単に説明する方法はわかりません。


いくつかの簡単な準備:

Kクラスの分類問題があるとしましょう。決定木のノードによって表される特徴空間の領域では、その領域のクラスの確率を使用して不均一性を定量化することにより、領域の「不純物」が測定されることを思い出してください。通常、推定値:

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

不純物の尺度は、入力として、クラス確率の配列を取ります。

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

そして、特徴空間の領域がどの程度「不純」であるか、またはクラスごとに不均一であるかを示す数値を吐き出します。たとえば、2クラスの問題のジニ測定値は2*p*(1-p)です。ここで、p = Pr(Class=1)1-p=Pr(Class=2)です。


さて、基本的にあなたの質問への短い答えは:

_sample_weight_は確率配列内の確率推定値を増加させます ...これは不純物測定値を増加させます...これはノードの分割方法を増加させます...これはツリーの構築方法を増加させます...これにより、分類のために機能空間を細分化する方法が強化されます。

これは例を通して最もよく説明されていると思います。


まず、入力が1次元である次の2クラスの問題を考えます。

_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)
_

したがって、ルートノードと2つの子だけを持つツリーを見てみましょう。デフォルトの不純な測定値が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の最後の2つの値はプレースホルダーであり、無視されます。 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_は、各ノードの不純物測定にも影響します。具体的には、確率の推定では、サンプルの重みにより、最初のトレーニングの例は同じようにカウントされ、2番目のトレーニングの例は2回カウントされ、3番目の例は3回カウントされます。

親ノード領域の不純物は同じです。これは単なる偶然です。直接計算できます:

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

_4/9_のginiメジャーは次のとおりです。

これで、選択したしきい値から、最初と2番目のトレーニング例が左の子ノードに送信され、3番目の例が右に送信されていることがわかります。左側の子ノードでも、不純物が_4/9_と計算されることがわかります。

_p = Pr(Class=1) = 1 / (1+2) = 1/3.
_

右の子供のゼロの不純性は、その地域にあるトレーニング例が1つだけであるためです。

同様に、非整数のサンプルワイトでこれを拡張できます。 _sample_weight = [1,2,2.5]_のようなものを試して、計算された不純物を確認することをお勧めします。

お役に立てれば!

38
Matt Hancock

私のように誰かがsample_weightを計算する方法を探しているだけなら、これは便利かもしれません。

sklearn.utils.class_weight.compute_sample_weight

3
Chris Farr