2017-04-04 166 views
1

我正在使用PySpark來生成和驗證預測。我有一個正確的列的數據框,我將它傳遞給MulticlassMetrics以獲得混淆矩陣。但是當我檢查混淆矩陣時,它缺少大部分值(數據幀有超過120.000行,混淆矩陣只有8個值)。爲什麼它失去了其餘的?混淆矩陣丟失實例

編輯:爲了澄清,我不希望混淆矩陣與數據集具有相同的大小,我的數據中有兩個類,我期望矩陣實例的總和與我的數據中的行數。問題是,我在我的數據約120.000行和混淆矩陣是一樣的東西
[[ 0, 3 ], [ 1, 0 ]]

代碼:我不能在這裏張貼整個代碼,但在這裏是重要的

training_data = load_training_data() # Spark DataFrame 
training_data, testing_data = training_data.randomSplit([0.7, 0.3]) 

asm = VectorAssembler(inputCols=selected_columns, outputCol='features') 
final_training_data = asm.transform(training_data) 

rf = RandomForestClassifier(labelCol="label", impurity="entropy") 
rfModel = rf.fit(final_training_data) 

test_predictions = rfModel.transform(testing_data) 
predictionAndLabels = test_predictions.select(['prediction', 'label']) 

tp = predictionAndLabels.rdd.map(tuple) 
metrics = MulticlassMetrics(tp) 
部分
+0

我不知道我關注。您是否期望您的混淆矩陣與您的數據集大小相同? – Grr

+0

僅供參考,混淆矩陣將是一個矩形矩陣,其維數等於數據中類的數量。所以,如果你有3個班,矩陣將是3x3 – Grr

+0

我編輯了這個問題,以澄清我的疑問 –

回答

0

下面是如何使用MulticlassMetrics的一個很好的例子。在這個例子中,數據包含150個屬於三個類別之一的觀察值。結果,最終的混淆矩陣的形狀爲3x3,在單維中表示爲DenseArray。如果您瀏覽鏈接中的示例並在到達metrics = MulticlassMetrics(predictionAndLabels)後停止,則可以執行以下操作來查看混淆矩陣。

In[6]: metrics = MulticlassMetrics(predictionAndLabels) 
In[7]: confusion_mat = metrics.confusionMatrix() 
In[8]: print(confusion_mat) 
Out[8]: DenseMatrix(3, 3, [15.0, 0.0, 7.0, 0.0, 16.0, 0.0, 1.0, 0.0, 13.0], 0) 
In[9]: print(confusion_mat.toArray()) 
Out[9]: array([[ 15., 0., 1.], 
       [ 0., 16., 0.], 
       [ 7., 0., 13.]]) 

最終的數組就是你將解釋爲混淆矩陣。看看維基百科的條目Confusion Matrix瞭解更多信息和多類矩陣的一個很好的例子。

沒有關於您的數據的更多信息我不能肯定地說,但它聽起來像您有一個2x2或3x3混淆矩陣,您只需撥打toArray即可更好地對其進行可視化。

編輯(感謝您將您的代碼。)

通常當我運行RandomForestClassifier.transform(test)我結束了一個predictedLabel列是實際的類的預測。此外,我認爲你不應該打電話給predictionAndLabels.rdd.map(tuple)。在您選擇predictedLabeltest_predictions中的'標籤'後,您應該可以直接轉到指標。總結試一下:

predictionAndLabels = test_predictions.select(['predictedLabel', 'label']) 
metrics = MulticlassMetrics(predictionAndLabels) 
+0

謝謝,我會嘗試一下,讓它知道它是否奏效! –