2015-12-21 3 views
11

私はthis documentationから読んだ:`sample_weight`は` DecisionTreeClassifier`がsklearnで動作する仕組みに何がありますか?

は、「クラス・バランシングは、各クラスからのサンプルの等しい数をサンプリングすることによって、又は好ましくは同じに、各クラスのサンプル量(sample_weight)の和を正規化することによって行うことができます値。"

しかし、これはどのように動作するかはまだ分かりません。 sample_weightに、12の2つの値の配列を設定すると、2のサンプルは、袋詰めのときには、1のサンプルの2倍のサンプリング回数になるでしょうか?私はこれに関する実用的な例を考えることはできません。

答えて

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

を、どのように「不純」またはどのように不均一なバイわかります番号を、吐き出します特徴空間の領域をクラス化する。例えば、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人の子供と木を見てみましょう。デフォルトの不純物はジニの測定値を測定することに注意してください。


ケース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も、各ノードの不純物対策に影響します。具体的には、確率推定では、与えられたサンプルの重みのために、第1のトレーニング例は同じにカウントされ、第2のサンプルは2倍にカウントされ、第3のサンプルは3倍にカウントされます。

親ノード領域の不純物は同じです。これはちょうど偶然のことです。私たちは、それを直接計算することができます。4/9

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

ジニ対策は、以下の通りです。第三は、右方向に送られながら

さて、あなたは、第一及び第二の訓練例は、左の子ノードに送信され選択された閾値から見ることができます。右の子にはゼロの不純物がその領域内に位置する唯一のトレーニング例によるものである

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

:私たちはので、不純物が左の子ノードにも4/9なるように計算されていることを参照してください。

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

希望すると便利です。

+0

'gini measure 'については' 2/3 *(1 - 2/3)= 2/9'であってはなりませんか?さて、私はそれが不純物の測定値に影響することを見ていますが、相対的なサンプル重量に基づいて、あるサンプルをより頻繁にサンプリングするか、またはそれほど頻繁にサンプリングするのとはどのように違うのでしょうか?詳細な説明をありがとう! – Hunle

+0

バイナリ分類の場合、ジニの測度は '2 * p *(1-p)'です。そのため、結果は4/9です。あなたの解釈は正しい。しかし、「サンプリング」は乱雑さを示唆しています。 'sample_weights'が整数の場合、それは不純物測定の' ith'トレーニング例 'samples_weights [i]'回を複製するようなものです。もちろん、 'sample_weights'は整数である必要はありませんが、アイデアは同じです。 –

関連する問題