带有 LIBSVM 数据错误的 Spark 决策树
Spark Decision Tree with LIBSVM data error
我使用 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
不知道哪里出错了。数据的格式也是正确的。
谢谢!
这里可能发生的情况是,从零开始的特征索引在确定数据集中的特征数量时会抛出 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 索引可能仍然会导致错误。
我使用 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
不知道哪里出错了。数据的格式也是正确的。
谢谢!
这里可能发生的情况是,从零开始的特征索引在确定数据集中的特征数量时会抛出 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 索引可能仍然会导致错误。