2016-05-01 56 views
0

我使用Python將CSV轉換爲LIBSVM數據格式。 LIBSVM的格式如下所示。第一列是目標。帶LIBSVM數據錯誤的Spark決策樹

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決策樹代碼在Spark是

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,從1開始到12結束(例如,第一行示例爲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指數可能仍然會導致異常情況。