2016-05-01 20 views
0

Ich konvertierte eine CSV in LIBSVM-Datenformat mit Python. Das Format der LIBSVM ist wie folgt. Die erste Spalte ist das Ziel.Spark Decision Tree mit LIBSVM-Datenfehler

0 0:1 1:2 2:1 4:11 6:4 7:7 8:1 9:99 10:70 11:1 
    0 0:1 1:2 2:1 4:8 5:1 6:3 7:7 8:1 9:99 10:62 11:1 

Mein Code in MLLib Entscheidungsbaum in der Spark ist

from pyspark.mllib.tree import DecisionTree, DecisionTreeModel 
    from pyspark.mllib.util import MLUtils 
    from pyspark import SparkContext 
    sc = SparkContext() 

    data = MLUtils.loadLibSVMFile(sc,"/folder/libdata.txt") 
    (trainingData, testData) = data.randomSplit([0.7, 0.3]) 

    model = DecisionTree.trainClassifier(trainingData) 
    print(model.toDebugString()) 

    model.save(sc, "/folder/myDecisionTreeClassificationModel") 

Der Fehler, den ich bekommen habe ist

java.lang.IllegalArgumentException: requirement failed: You provided 12 indices and values, which exceeds the specified vector size 11 

Sie wissen nicht, wo es schief läuft. Das Format der Daten ist ebenfalls korrekt.

Danke!

Antwort

1

Was wahrscheinlich passiert, ist, dass die nullbasierten Feature-Indizes MLLib ausschalten, wenn Sie die Anzahl der Features in Ihrem Datensatz bestimmen. Versuchen Sie, alle Merkmalsindizes in Ihren Eingabedaten um 1 zu verschieben, beginnend bei 1 und endend bei 12 (z. B. 0 1:1 2:2 3:1 5:11 7:4 8:7 9:1 10:99 11:70 12:1 für Ihre erste Beispielzeile).

Wenn Sie data sammeln und drucken, können Sie sehen, wie der Index 0 (libsvm) zu Index -1 (in Spark) wurde und wie der größte Index 10 ist (entspricht 11 in den libsvm-Dateien). Der Code, der die Anzahl der Merkmale berechnet (siehe https://github.com/apache/spark/blob/aedbbaa3dda9cbc154cd52c07f6d296b972b0eb2/python/pyspark/mllib/util.py#L120), nimmt den höchsten Index und addiert eins, d.h. 11, aber Sie haben 12 Merkmale.

Alternativ können Sie versuchen, die richtige Anzahl von Funktionen in den loadLibSVMFile Aufruf (über numFeatures) zu übergeben, aber der -1 Index kann immer noch Dinge abwerfen.