2013-01-08 133 views
5

說我有一個這樣的數據集:很難理解輸出

5.9;0.645;0.12;2;0.075;32;44;0.99547;3.57;0.71;10.2;5 
6;0.31;0.47;3.6;0.067;18;42;0.99549;3.39;0.66;11;6 

,其中1號11列表示的功能(酸性,氯化物等),最後一列表示給予項目評級(例如,5或6。)

數據集由此訓練:

target = [x[11] for x in dataset] 
train = [x[0:11] for x in dataset] 

rf = RandomForestClassifier(n_estimators=120, n_jobs=-1) 
rf.fit(train, target) 

predictions = rf.predict_proba(testdataset) 
print predictions[0] 

它打印像

[ 0.   0.01666667 0.98333333 0.   0.   0.  ] 

現在,它爲什麼不輸出一個單一的分類,例如5或6的評級?

該文檔中提到「輸入樣本的預測類別概率計算爲森林中樹木的平均預測類別概率」,這是我無法理解的。

如果使用

print rf.predict(testdataset[-1]) 
[ 6. 6. 6. 6. 6. 6. 6. 6. 6. 6. 6.] 

它打印出更多的東西像你所期望的 - 至少它看起來像收視率 - 但我還是不明白,爲什麼有每個功能的預測,而不是一個單一的預測取考慮到所有功能?

+0

者均基於數據來自葡萄酒的數據集在這裏:http://www3.dsi.uminho.pt/pcortez/wine/ – Sofia

+0

是什麼testdatasets的形狀? –

回答

9

除了迭戈的回答是:

RandomForestClassifier是預測課堂作業爲類離散的數字,沒有階級標籤之間排序分類。

如果要輸出連續的浮點評級,則應該嘗試使用迴歸模型,例如RandomForestRegressor

您可能必須將輸出限制在範圍[0,6],因爲沒有保證,模型將不會輸出預測結果,例如6.2

編輯要回答你第二點,predict方法需要一個樣品列表。因此,您應該爲您的案例提供一份樣品清單。嘗試:

print rf.predict([testdataset[-1]]) 

或者:

print rf.predict(testdataset[-1:]) 

我不知道爲什麼你沒有得到在這種情況下的錯誤。

編輯:輸出沒有意義:數據集的形狀是什麼?

>>> print np.asarray(train).shape 

>>> print np.asarray(target).shape 

>>> print np.asarray(testdataset).shape 
+0

我現在在工作。稍後我會迴應,但是這裏有一篇文章探討了相同的數據集:http://fastml.com/predicting-wine-quality/ – Sofia

+0

我確實有一個bug,所以使用rf.predict([test [-1]])現在輸出[6.]的合理結果。關於這裏的形狀,他們是:np.asarray(target).shape - >(1597,),np.asarray(train).shape - >(1597,11),np.asarray(test).shape - >(1599 ,11)。他們應該是什麼? – Sofia

+0

形狀看起來不錯。很高興它修復了你的錯誤。 – ogrisel

3

從文檔,predict_proba返回:

號碼:形狀= [N_SAMPLES次,n_classes]或n_outputs的列表的陣列 此類陣列如果n_outputs> 1.輸入樣本的類概率。 類按算術順序排列。

這裏的關鍵是最後一句「類由算術爲了有序」。 我的猜測是,你的一些訓練樣本有一個小於5的類別,其中predict_proba分配的概率爲零,而5和6類別的概率分別爲0.01666667和0.98333333,而另外3個類別的所有> 6也有概率零。

+0

嗨,收視率從3到8.所以根據我的理解,predict_proba輸出每個評級的概率列表,以便在給出的例子[0.01666667 0.98333333 0.0.0]中,最有可能的評級是5,概率爲0.983。現在更清楚謝謝:) – Sofia