2016-11-10 3 views
2

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) 

Antwort

1
  • Im Allgemeinen ist dies eine empfohlene Methode.
  • Beim Arbeiten mit Baummodellen ist dies unnötig und sollte vermieden werden. Sie können nur StringIndexer verwenden.
+0

Was bedeutet das? StringIndexer nur? Wie können Sie einem Entscheidungsbaum eine Indexspalte zuführen? Sie nehmen eine Spalte von Feature-Vektoren ... – rjurney

Verwandte Themen