2016-06-23 5 views
0

Ich arbeite an einem Klassifizierungsproblem, in dem ich MLLIB-Bibliothek verwenden muss. Die Klassifizierungsalgorithmen (sagen wir logistische Regression) in mllib erfordern eine RDD [LabeledPoint]. Ein LabeledPoint hat nur zwei Felder, ein Label und einen Feature-Vektor. Wenn ich das Scoring durchführe (indem ich mein trainiertes Modell auf das Testset anwende), haben meine Testinstanzen ein paar andere Felder, die ich behalten möchte. Zum Beispiel sieht eine Testinstanz wie folgt aus: <id, field1, field2, label, features>. Wenn ich eine RDD von LabeledPoint erstelle, sind alle anderen Felder (id, field1 und field2) weg und ich kann die Beziehung zwischen meiner bewerteten Instanz und der ursprünglichen nicht herstellen. Wie kann ich dieses Problem lösen? Nach dem Scoring muss ich die IDs und den Score/Predicted Label kennen., wie Datensätze Informationen beim Arbeiten in Mllib

Dieses Problem existiert nicht in ML, da es DataFrame verwendet, und ich kann einfach eine andere Spalte mit der Punktzahl zu meinem ursprünglichen Datenrahmen hinzufügen.

Antwort

1

Eine Lösung für Ihr Problem ist, dass die map Methode von RDD Ordnung behält; Daher können Sie die Methode RDD.zip mit den IDs verwenden.

Hier ist eine Antwort, die die Prozedur

Spark MLLib Kmeans from dataframe, and back again

Es ist sehr leicht zu erhalten Paare von Iden und Cluster in Form von RDD zeigt:

val idPointRDD = data.rdd.map(s => (s.getInt(0), 
    Vectors.dense(s.getDouble(1),s.getDouble(2)))).cache() 
val clusters = KMeans.train(idPointRDD.map(_._2), 3, 20) 
val clustersRDD = clusters.predict(idPointRDD.map(_._2)) 
val idClusterRDD = idPointRDD.map(_._1).zip(clustersRDD) 

Dann erstellen Sie Datenrahmen aus dass

val idCluster = idClusterRDD.toDF("id", "cluster") 

Es funktioniert, weil Karte nicht die Reihenfolge der Daten in RDD ändert, die ist, warum Sie einfach IDs mit Ergebnissen der Vorhersage zippen können.

Verwandte Themen