Was ist die richtige oder beste Methode für die Aufnahme kategorial Variablen (String und int) in ein Feature für einen MLlib-Algorithmus?Spark MLlib: Einschließlich kategoriale Funktionen
Ist es korrekt, OneHotEncoder
s für die kategorialen Variablen zu verwenden und dann die Ausgabespalten mit anderen Spalten in eine VectorAssembler
wie im folgenden Code einzuschließen?
Der Grund ist, dass ich am Ende mit einem Datenrahmen mit Zeilen wie folgt, wo es aussieht wie feature3
und feature4
zusammen aussehen, als ob sie auf der gleichen "Ebene" von Bedeutung als die beiden kategorischen Funktionen einzeln sind.
+------------------+-----------------------+---------------------------+
|prediction |actualVal |features |
+------------------+-----------------------+---------------------------+
|355416.44924898935|990000.0 |(17,[0,1,2,3,4,5,10,15],[1.0,206.0]) |
|358917.32988024893|210000.0 |(17,[0,1,2,3,4,5,10,15,16],[1.0,172.0]) |
|291313.84175674635|4600000.0 |(17,[0,1,2,3,4,5,12,15,16],[1.0,239.0]) |
Hier ist mein Code:
val indexer = new StringIndexer()
.setInputCol("stringFeatureCode")
.setOutputCol("stringFeatureCodeIndex")
.fit(data)
val indexed = indexer.transform(data)
val encoder = new OneHotEncoder()
.setInputCol("stringFeatureCodeIndex")
.setOutputCol("stringFeatureCodeVec")
var encoded = encoder.transform(indexed)
encoded = encoded.withColumn("intFeatureCodeTmp", encoded.col("intFeatureCode")
.cast(DoubleType))
.drop("intFeatureCode")
.withColumnRenamed("intFeatureCodeTmp", "intFeatureCode")
val intFeatureCodeEncoder = new OneHotEncoder()
.setInputCol("intFeatureCode")
.setOutputCol("intFeatureCodeVec")
encoded = intFeatureCodeEncoder.transform(encoded)
val assemblerDeparture =
new VectorAssembler()
.setInputCols(
Array("stringFeatureCodeVec", "intFeatureCodeVec", "feature3", "feature4"))
.setOutputCol("features")
var data2 = assemblerDeparture.transform(encoded)
val Array(trainingData, testData) = data2.randomSplit(Array(0.7, 0.3))
val rf = new RandomForestRegressor()
.setLabelCol("actualVal")
.setFeaturesCol("features")
.setNumTrees(100)
Was bedeutet das? StringIndexer nur? Wie können Sie einem Entscheidungsbaum eine Indexspalte zuführen? Sie nehmen eine Spalte von Feature-Vektoren ... – rjurney