2013-07-16 69 views
7

我正在使用scikit中的RandomForest方法進行3D點識別。我不斷遇到的一個問題是,某些類別比其他類別更經常出現。這意味着在從訓練分類器生成預測的過程中,如果分類器不確定一個點類,它將更有可能假定它屬於一個普通類,而不是不那麼不常見的類。如何在RandomForest實現中加權類

我看到,在scikit文檔for random forests中,fit方法中有一個sample_weight參數。根據我所能說的,只是對某些總體樣本進行加權(例如,我有50個文件正在接受培訓,它會將第一個樣本加權爲其他所有內容的兩倍),而不是類。這並不能解決這個問題,因爲在我所有的樣本中,最不常見的類都很少見。這只是這個特定階層的性質。

我發現了一些關於平衡隨機森林和加權隨機森林的論文。但我還沒有看到如何在scikit中使用它。我希望我錯了 - 有沒有一種方法來減輕內置的類?我應該寫一些單獨的東西來人爲地增加樣本中不同類別的重量嗎?

* 編輯澄清我sample_weight的理解* Sample_weight根據文件似乎指的是樣品,而不是類的重量。所以,如果我有文件A,B和C類1,2和3 而且我們說:

A = [1 1 1 2] 
B = [2 2 1 1] 
C = [3 1 1 1] 

展望上面我們有一個情況,很簡單的,我們在其中只有很少的3級相比,其他類。我的情況有8個階段,正在接受數百萬分的訓練,但這個比例對於兩個特定的階層仍然是令人難以置信的偏向。

使用sample_weight,它接受一個大小爲m的數組(m是樣本數),我將能夠權衡這三個文件中的任何一個的工作情況。所以我的理解是,我可以做一個sample_weight = [1 1 2],這樣可以使樣本C比其他兩個樣本強兩倍。但是這並沒有真正的幫助,因爲我的問題是第3類是非常罕見的(在實際數據中,它是從數百萬中的1k點而不是12中的1個)。增加任何給定樣本的權重不會增加特定類別的權重,除非我僞造一些數據,其中樣本幾乎不包含該特定類別。

我在文檔中找到了sklearn.preprocessing.balance_weights(y),但我找不到任何人使用它。理論上它做我需要做的事情,但我沒有看到如何將權重數組放回我的隨機森林。

+4

我不明白:「這不能解決這個問題,因爲在我所有的樣本中,最不常見的類很少見,只是這個特定類的性質。」 如果您將樣本權重放在'sample_weight =(1/n_samples_in_same_class)'中,它將爲您提供合理的類別權重值。 – ogrisel

+0

sample_weight根據文檔似乎指的是樣本而非類的權重。 – Nahkki

+1

是的,但您可以將相同的樣本權重分配給同一班級的所有樣本,並且您有效地加權,就好像您已提供班級權重一樣。可以通過提供樣本權重來模擬課堂權重,但不能相反。 – ogrisel

回答

2

我猜這隻適用於較新版本的scikit-learn,但現在可以使用它了。

rf = RandomForestClassifier(class_weight="balanced")