2016-05-01 5 views
0

Pythonを使用してCSVをLIBSVMデータ形式に変換しました。 LIBSVMのフォーマットは以下の通りです。最初の列がターゲットです。LIBSVMデータエラーを伴うSpark Decision Tree

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 

スパークでMLLibディシジョンツリーの私のコード私が取得しています

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

エラーが

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

が、それは間違って起こっている場所がわからないことです。データの書式も正しいです。

ありがとうございます!

答えて

1

ここでは、データセット内のフィーチャの数を決定するときにゼロベースのフィーチャインデックスがMLLibをスローする可能性があります。 1から始まり12で終わる入力データのすべての機能インデックスを1つ上にシフトしてください(最初の例の行は0 1:1 2:2 3:1 5:11 7:4 8:7 9:1 10:99 11:70 12:1など)。

dataを収集して印刷すると、インデックス0(libsvm)がどのようにインデックス-1(Spark)になり、最大インデックスが10(libsvmファイルの11に相当)になったかを確認できます。フィーチャの数を計算するコード(https://github.com/apache/spark/blob/aedbbaa3dda9cbc154cd52c07f6d296b972b0eb2/python/pyspark/mllib/util.py#L120を参照)は、最も高いインデックスをとり、1を追加します。つまり11ですが、12のフィーチャがあります。

loadLibSVMFileコール(numFeatures経由)に適切な数の機能を渡すこともできますが、-1のインデックスではまだ問題が発生する可能性があります。