scala中随机森林的散列技巧

数据挖掘 随机森林 阿帕奇火花 斯卡拉
2021-10-02 04:32:08

我正在尝试执行散列技巧,然后使用 scala 执行随机森林。我有以下代码:

val documents: RDD[Seq[String]] = sc.textFile("hdfs:///tmp/new_cromosoma12v2.csv").map(_.split(",").toSeq)

val hashingTF = new HashingTF()
val tf: RDD[Vector] = hashingTF.transform(documents)

val splits = tf.randomSplit(Array(0.7, 0.3))
val (trainingData, testData) = (splits(0), splits(1))

val numClasses = 3
val categoricalFeaturesInfo = Map[Int, Int]()
val numTrees = 10 
val featureSubsetStrategy = "auto" 
val impurity = "gini"
val maxDepth = 8
val maxBins = 32

**val trainingData2=LabeledPoint(1.0,trainingData.collect())**

val model = RandomForest.trainClassifier(trainingData2, numClasses, categoricalFeaturesInfo, numTrees, featureSubsetStrategy, impurity, maxDepth, maxBins)

但我有错误

找到:Array[org.apache.spark.mllib.linalg.Vector] 需要:org.apache.spark.mllib.linalg.Vector

在粗线中。

你知道我该如何解决吗?

谢谢,

莱娅

2个回答

我们来看看错误信息:

found : Array[org.apache.spark.mllib.linalg.Vector] required: org.apache.spark.mllib.linalg.Vector

“found”是它遇到的对象的类型,“required”是函数接受的对象的类型。这些类型看起来基本相同( org.apache.spark.mllib.linalg.Vector ),但第一个是 Array[X],第二个是 X。

为什么?因为 trainingData.collect() 将 RDD 作为数组中的对象数组提供给您。

相反,您可能想要做的是map,将每个向量变成一个 LabeledPoint,而不是试图将整个 RDD 变成一个单独的 LabeledPoint。

LabeledPoint 期望: LabeledPoint(label: Double, features: Vector)

当您执行时,val trainingData2=LabeledPoint(1.0,trainingData.collect())您实际上获得了 trainingData 集中的所有行,因此您将拥有Array(Row(???), Row(???), ???)但您需要应用def transformToLabeledPoint(vector: Vector) = LabeledPoint(1.0, vector)的是,您可以在 trainingData 上应用地图或创建 UDF 并将其应用到您的 trainingData,例如:

import org.apache.spark.ml.feature.SQLTransformer
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.linalg.Vectors

val df = spark.createDataFrame(Seq((1.0,100.0),(2.0,200.0))).toDF("id", "value")

spark.udf.register("setLabel", (label: Double, x: Seq[Double]) => LabeledPoint(label, Vectors.dense(x.toArray)))

val labeledTrainingData = new SQLTransformer()
    .setStatement("SELECT setLabel(1.0, array(*)) AS points FROM __THIS__")
    .transform(df)
val labeledRDD = labeledTrainingData.rdd.map(_(1).asInstanceOf[LabeledPoint])