2

我想將一個火花數據幀轉換爲標記點。 數據框被命名爲DF,看起來像:無法訓練pySpark支持向量機,標記點問題

+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+ 
|step1|step2|step3|step4|step5|step6|step7|step8|step9|step10|class| 
+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+ 
| 14| 14| 0| 14| 14| 4| 11| 10| 0|  7| 1| 
| 11| 10| 14| 0| 14| 18| 18| 14| 7|  7| 1| 
| 14| 14| 14| 14| 14| 14| 7| 0| 7|  0| 1| 
| 14| 14| 14| 14| 7| 7| 14| 14| 0| 11| 1| 
| 14| 14| 14| 14| 14| 14| 14| 7| 14|  7| 1| 
| 14| 14| 14| 14| 14| 14| 14| 0| 7|  7| 1| 
| 14| 14| 14| 14| 14| 14| 14| 7| 14|  7| 1| 
| 17| 14| 0| 7| 0| 0| 14| 7| 0|  7| 1| 
| 14| 14| 14| 7| 7| 14| 7| 14| 14|  7| 1| 
| 14| 14| 14| 14| 14| 14| 14| 7| 7|  7| 1| 
| 7| 14| 14| 14| 14| 0| 14| 7| 0| 14| 1| 
| 14| 14| 14| 14| 14| 0| 14| 7| 7|  7| 1| 

我想要做什麼,文檔以下是:

(training, test) = DF.randomSplit([0.8,0.2]) 
print training 
def parsePoint(line): 
    values = [float(x) for x in line.split(' ')] 
    return LabeledPoint(values[0], values[:1]) 

trainLabeled = training.rdd.map(parsePoint) 
model = SVMWithSGD.train(trainLabeled, iterations=100) 

但我得到的錯誤:

Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.runJob. 

Spark版本2.0.1

+0

嗨,你可以確定你正在運行的Spark版本嗎? – pltrdy

回答

1

我不能確定沒有你的數據,但通常我與SVMWithSGD ssue來自標籤。

您需要使用LabeledPoint(與您一樣)並確保第一個參數爲0.0或1.0。錯誤可能來自x[-1]是另一個值(不是0也不是1)。

你能檢查嗎?

希望它能幫助, pltrdy


編輯(seing數據後):

下襬。讓我們回到基礎:支持向量機(大致)「學習如何將數據分成兩個類」(這不是非常正式的,但現在讓我們來看看)。這是說,數據集必須是:一個X矩陣形狀n x Dn行數,D多個特徵)和含有數據的標籤一個y矩陣n x 1。標籤通常表示爲{0, 1}(或{-1, 1},這對數學更方便)。 這是相當「數學」的方法。通常你有一個data矩陣,它通過「提取」一列作爲標籤,在Xy之間分割。 (此列中的所有值必須爲0,1)。

這就是說,長話短說:SVM將分類您的數據兩個類。

標籤(=類,其值爲0或1)可以看作是用於拆分數據的兩個類別。所以,你必須有一列只有0或1

例如如果我建我的電影的數據集,我可以設置一個欄目「我不喜歡它嗎?」與label=1如果我喜歡的電影和label=0如果我不這樣做,那麼培養我SVM預測哪些電影我應該喜歡

我沒有在你的數據,一列是標籤看到。如果你有兩門以上的課程,SVM不適合你,你將不得不看看多元分類(這裏超出範圍,告訴我是否你想要)。

我猜你的目標不是很清楚。作爲一個例子,我們不會使用ID列來訓練分類,這很少有意義。如果我錯了,請解釋您對數據的期望。 (你也可以解釋一下列的含義)。

pltrdy 
+0

謝謝你。我添加了數據的截圖。那意味着當試圖創建標記點時,最後一列應該是第一列? – Kratos

+0

標籤(值爲0或1)必須被看作是要分割數據的「分類」。所以你必須有一個只有0或1的列。例如,如果我構建了我的電影數據集,我可以設置一個列「我喜歡它嗎?」如果我喜歡電影,標籤= 1,如果我不喜歡電影,則標籤= 0,然後訓練我的SVM以預測我應該喜歡的電影。 – pltrdy

+0

是的,我的不好。我在執行中是錯誤的。我沒有注意到。我會解決它,看看它是否有效 – Kratos