带有 LIBSVM 数据错误的 Spark 决策树

Posted

技术标签:

【中文标题】带有 LIBSVM 数据错误的 Spark 决策树【英文标题】:Spark Decision Tree with LIBSVM data error 【发布时间】:2016-08-26 02:21:50 【问题描述】:

我使用 Python 将 CSV 转换为 LIBSVM 数据格式。 LIBSVM 的格式如下所示。第一列是目标。

    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

我在 Spark 中的 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,从 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)采用最高索引并添加一个,即 11,但您有 12 个特征。

或者,您可以尝试将正确数量的功能传递给loadLibSVMFile 调用(通过numFeatures),但-1 索引可能仍然会出错。

【讨论】:

以上是关于带有 LIBSVM 数据错误的 Spark 决策树的主要内容,如果未能解决你的问题,请参考以下文章

无效的语法错误:使用 Python 和 Spark 构建决策树、流失预测

如何在 libsvm 中绘制 4 维虹膜数据的决策边界?

全面解析Apache Spark中的决策树

C# LibSVMsharp 库中的 LIBSVM“决策值”

Apache Spark:Mllib之决策树的操作(java)

Spark机器学习:决策树算法