我有一个功能集,其中包含相应的categoricalFeaturesInfo:Map [Int,Int]。然而,对于我的生活,我无法弄清楚我应该如何使DecisionTree类工作。它不会接受任何内容,而是LabeledPoint作为数据。但是,LabeledPoint需要(double,vector),其中向量需要双精度。
val LP = featureSet.map(x => LabeledPoint(classMap(x(0)),Vectors.dense(x.tail)))
// Run training algorithm to build the model
val maxDepth: Int = 3
val isMulticlassWithCategoricalFeatures: Boolean = true
val numClassesForClassification: Int = countPossibilities(labelCol)
val model = DecisionTree.train(LP, Classification, Gini, isMulticlassWithCategoricalFeatures, maxDepth, numClassesForClassification,categoricalFeaturesInfo)
我得到的错误:
scala> val LP = featureSet.map(x => LabeledPoint(classMap(x(0)),Vectors.dense(x.tail)))
<console>:32: error: overloaded method value dense with alternatives:
(values: Array[Double])org.apache.spark.mllib.linalg.Vector <and>
(firstValue: Double,otherValues: Double*)org.apache.spark.mllib.linalg.Vector
cannot be applied to (Array[String])
val LP = featureSet.map(x => LabeledPoint(classMap(x(0)),Vectors.dense(x.tail)))
到目前为止我的资源: tree config, decision tree, labeledpoint
答案 0 :(得分:21)
您可以先将类别转换为数字,然后加载数据,就像所有要素都是数字一样。
在Spark中构建决策树模型时,您只需要通过从要素索引中指定地图Map[Int, Int]()
来告诉spark哪些要素是分类的,还有要素的arity(该要素的不同类别的数量)它的精神。
例如,如果您有以下数据:
1,a,add
2,b,more
1,c,thinking
3,a,to
1,c,me
您可以先将数据转换为数字格式:
1,0,0
2,1,1
1,2,2
3,0,3
1,2,4
以这种格式,您可以将数据加载到Spark。然后,如果你想告诉Spark第二列和第三列是分类的,你应该创建一个地图:
categoricalFeaturesInfo = Map[Int, Int]((1,3),(2,5))
地图告诉我们索引1的特征具有arity 3,而索引2的特征具有artity 5.当我们构建决策树模型时,将该地图作为训练函数的参数传递时,它们将被视为分类:< / p>
val model = DecisionTree.trainClassifier(trainingData, numClasses, categoricalFeaturesInfo, impurity, maxDepth, maxBins)
答案 1 :(得分:2)
LabeledPoint不支持字符串,将其放入LabeledPoint的一种方法是将数据拆分成多列,考虑到您的字符串是绝对的。
例如,如果您有以下数据集:
id,String,Intvalue
1,"a",123
2,"b",456
3,"c",789
4,"a",887
然后你可以分割你的字符串数据,使字符串的每个值成为一个新的列
a -> 1,0,0
b -> 0,1,0
c -> 0,0,1
由于您有3个不同的字符串值,因此您将字符串列转换为3个新列,并且每个值将由此新列中的值表示。
现在你的数据集将是
id,String,Intvalue
1,1,0,0,123
2,0,1,0,456
3,0,0,1,789
4,1,0,0,887
现在您可以将其转换为Double值并将其用于LabeledPoint。
将字符串转换为LabeledPoint的另一种方法是为每列创建一个不同的值列表,并将字符串的值转换为此列表中该字符串的索引。这不推荐,因为如果是这样,在这个假设的数据集中它将是
a = 0
b = 1
c = 2
但在这种情况下,算法会考虑更接近b而不是c,这是无法确定的。
答案 2 :(得分:0)
您需要确认数组x的类型。 从错误日志中,它表示数组x中的项是spark不支持的字符串。 当前火花矢量只能由Double填充。