1

我使用Scikit-學習的RandomForestClassifier預測文檔的多個標籤。每個文檔有50個功能,沒有任何文檔具有任何缺失的功能,並且每個文檔至少有一個與其關聯的標籤。樣品與使用多標籤隨機森林沒有標籤指派scikit學習

clf = RandomForestClassifier(n_estimators=20).fit(X_train,y_train) 
preds = clf.predict(X_test) 

然而,我注意到,預測後有被分配任何標籤,即使樣品沒有丟失的標籤數據的一些樣品。

>>> y_test[0,:] 
array([1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) 
>>> preds[0,:] 
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
    0., 0., 0., 0., 0., 0., 0., 0.]) 

predict_proba的結果與預測的結果一致。

>>> probas = clf.predict_proba(X_test) 
>>> for label in probas: 
>>> print (label[0][0], label[0][1]) 
(0.80000000000000004, 0.20000000000000001) 
(0.94999999999999996, 0.050000000000000003) 
(0.94999999999999996, 0.050000000000000003) 
(1.0, 0.0) 
(1.0, 0.0) 
(1.0, 0.0) 
(0.94999999999999996, 0.050000000000000003) 
(0.90000000000000002, 0.10000000000000001) 
(1.0, 0.0) 
(1.0, 0.0) 
(0.94999999999999996, 0.050000000000000003) 
(1.0, 0.0) 
(0.94999999999999996, 0.050000000000000003) 
(0.84999999999999998, 0.14999999999999999) 
(0.90000000000000002, 0.10000000000000001) 
(0.90000000000000002, 0.10000000000000001) 
(1.0, 0.0) 
(0.59999999999999998, 0.40000000000000002) 
(0.94999999999999996, 0.050000000000000003) 
(0.94999999999999996, 0.050000000000000003) 
(1.0, 0.0) 

上面的每個輸出顯示,對於每個標籤,更高的邊際概率已被分配給沒有出現的標籤。我對決策樹的理解是,在預測時至少必須爲每個樣本分配一個標籤,所以這讓我有些困惑。

是,預計的多標籤決策樹/隨機森林的行爲能夠無標籤分配給一個樣本?

UPDATE 1

每個文檔的特徵是根據主題模型屬於一個主題的概率。

>>>X_train.shape 
(99892L, 50L) 
>>>X_train[3,:] 
array([ 5.21079651e-01, 1.41085893e-06, 2.55158446e-03, 
    5.88421331e-04, 4.17571505e-06, 9.78104112e-03, 
    1.14105667e-03, 7.93964896e-04, 7.85177346e-03, 
    1.92635026e-03, 5.21080173e-07, 4.04680406e-04, 
    2.68261102e-04, 4.60332012e-04, 2.01803955e-03, 
    6.73533276e-03, 1.38491129e-03, 1.05682475e-02, 
    1.79368409e-02, 3.86488757e-03, 4.46729289e-04, 
    8.82488825e-05, 2.09428702e-03, 4.12810745e-02, 
    1.81651561e-03, 6.43641626e-03, 1.39687081e-03, 
    1.71262909e-03, 2.95181902e-04, 2.73045908e-03, 
    4.77474778e-02, 7.56948497e-03, 4.22549636e-03, 
    3.78891036e-03, 4.64685435e-03, 6.18710017e-03, 
    2.40424583e-02, 7.78131179e-03, 8.14288762e-03, 
    1.05162547e-02, 1.83166124e-02, 3.92332202e-03, 
    9.83870257e-03, 1.16684231e-02, 2.02723299e-02, 
    3.38977762e-03, 2.69966332e-02, 3.43221675e-02, 
    2.78571022e-02, 7.11067964e-02]) 

標籤數據使用MultiLabelBinarizer格式化並看起來像:

>>>y_train.shape 
(99892L, 21L) 
>>>y_train[3,:] 
array([0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) 

UPDATE 2

predict_proba的上面所建議的上面沒有類的分配可能是一個僞影的輸出的樹木在標籤上投票(有20棵樹,所有概率約爲0.05的倍數)。但是,使用單個決策樹,我仍然發現有一些樣本沒有標籤。輸出看起來與上述predict_proba類似,因爲對於每個樣本而言,存在給定標籤被分配給或不給樣本的概率。這似乎表明,在某些時候決策樹轉動問題轉化爲二元分類,雖然the documentation說,樹需要標籤相關的優勢。

+0

難道您發佈數據的樣本? – ahajib

+0

@ahajib我用樣本更新了這個問題。如果您需要更多信息,請告訴我。 –

回答

0

如果列車和測試數據被縮放不同,或者從不同的分佈否則繪製(例如,如果樹學會分割上發生在列車但在測試不會發生的值)就會發生這種情況。

您可以檢查樹木,試圖更好地瞭解發生了什麼的。要做到這一點,看看DecisionTreeClassifier實例中clf.estimators_和可視化他們的.tree_屬性(例如,使用sklearn.tree.export_graphviz()

相關問題