所以我花了一點時間看着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*p*(1-p)
,其中p = Pr(Class=1)
和1-p=Pr(Class=2)
。
現在,基本上是簡短的回答你的問題是:
sample_weight
增強的概率陣列 ...這增強了雜質的措施......這增強了節點如何分割的概率估計...這增加了樹的構建方式......這增加了如何將特徵空間劃分爲分類。
我相信這是最好的例子。
首先考慮以下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)
那麼,我們來看看樹只是一個根節點和兩個孩子。請注意,默認雜質衡量基尼指數。
案例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
數組中的第一個值告訴我們,第一個訓練例子被髮送到左子節點,第二和第三訓練樣本被送到到正確的子節點。 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'是整數時,就像在雜質測量中複製'iith'訓練樣例'samples_weights [i]'次。當然,'sample_weights'不一定是整數,但這個想法是一樣的。 –