2

Ich versuche, ein Funken Dataframe zu markierten Punkt zu machen. Der Datenrahmen wird genannt DF und sieht aus wie:Nicht in der Lage, pySpark SVM zu trainieren, beschriftet Punkt Ausgabe

+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+ 
|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| 

, was ich versuche, die Dokumentation folgendes zu tun ist:

(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) 

Aber ich erhalte die Fehlermeldung:

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

Spark Version 2.0.1

+0

Hallo, könnten Sie präzisieren, welche Spark-Version Sie ausführen? – pltrdy

Antwort

1

Ich kann nicht sicher sein, ohne Ihre Daten zu sehen, aber eine gewöhnliche i ssue mit SVMWithSGD kommt von der Marke.

Sie müssen LabeledPoint (wie Sie) verwenden und sicherstellen, dass der erste Parameter entweder 0.0 oder 1.0 ist. Der Fehler könnte von x[-1] einen anderen Wert (nicht 0 oder 1) stammen.

Können Sie es überprüfen?

Hoffe, dass es hilft, pltrdy


Edit (nach Daten seing):

Hem. Gehen wir zurück zu den Grundlagen: SVM (ungefähr) "lernt, wie man Daten in zwei Klassen teilt" (das ist nicht sehr formal, aber nehmen wir es für jetzt). Das heißt, Ihr Datensatz muss sein: a X Matrix der Form (n Anzahl der Zeilen, D Anzahl der Funktionen), und eine y Matrix n x 1 enthält Etiketten von Daten. Labels werden normalerweise als {0, 1} (oder {-1, 1}) bezeichnet, was für Mathe praktischer ist. Dies ist ziemlich der "mathematische" Ansatz. Normalerweise haben Sie eine data Matrix, die Sie zwischen X und y durch "Extrahieren" einer Spalte als Bezeichnung teilen. (Alle Werte in dieser Spalte müssen entweder 0, 1 sein).

Dies wird gesagt, kurz gesagt: SVM wird Ihre Daten auf zwei Klassen klassifizieren.

Das Label (= Klassen, welcher Wert entweder 0 oder 1 ist) kann als zwei Kategorien angesehen werden, um Ihre Daten zu teilen. So müssen Sie eine Spalte mit nur 0 oder 1.

Zum Beispiel wenn ich meinen Film Dataset bauen, konnte ich eine Spalte "do i like it?" mit label=1 wenn Ich mag den Film und label=0, wenn ich dies nicht tun, dann meine SVM trainieren, um vorherzusagen, welche Film soll ich mag

ich nicht in Ihrer Daten sehen, welche Spalte die Label. Wenn Sie mehr als 2 Klassen haben, ist SVM nicht für Sie, Sie müssen sich die multivariate Klassifizierung ansehen (was hier nicht möglich ist, sagen Sie mir, ob es das ist, was Sie wollen).

Ich vermute, dass Ihr Ziel nicht wirklich klar ist. Zum Beispiel wird man keine Klassifikation mit der ID-Spalte trainieren, dies macht selten Sinn.Wenn ich falsch liege, bitte erläutern Sie, was Sie von Ihren Daten erwarten. (Sie können auch erläutern, auf welche Spalten sich bezieht).

pltrdy 
+0

danke dafür. Ich habe einen Screenshot der Daten hinzugefügt. Das heißt, dass die letzte Spalte die erste sein sollte, wenn versucht wird, die markierten Punkte zu erstellen? – Kratos

+0

Das Label (welcher Wert entweder 0 oder 1 ist) muss als "Kategorie" betrachtet werden, in die Sie Ihre Daten aufteilen möchten. Sie müssen also eine Spalte mit nur 0 oder 1 haben. Zum Beispiel, wenn ich mein Film-Dataset erstelle, könnte ich eine Spalte setzen "Mag ich es?" mit label = 1 wenn ich den film mag und label = 0 wenn ich das nicht mache, dann trainiere meine SVM um vorherzusagen, welchen Film ich mögen soll. – pltrdy

+0

ja, mein schlechtes. Ich liege falsch in der Umsetzung. Ich habe es nicht bemerkt. Ich werde es reparieren und sehen, ob es funktioniert – Kratos

Verwandte Themen