2017-04-10 3 views
1

J'espérais utiliser StringIndexer comme un moyen de classer les 1000+ catégories dans mon ensemble de données, générant un index qui signifie la fréquence relative. Je pourrais alors utiliser cet index comme une caractéristique numérique pour mon modèle. Malheureusement, par défaut, StringIndex stocke certaines métadonnées marquant l'index comme étant catégoriques, ce qui oblige mon modèle à utiliser l'index comme category variable.Comment utiliser StringIndexer pour générer des variables numériques?

Y a-t-il un moyen de désactiver ceci, de sorte que la variable d'index peut être utilisée comme une variable numérique? Editer: J'utilise l'indexeur de chaîne comme une étape dans un pipeline ML, donc une solution devrait éviter de manipuler la trame de données directement. De plus, je vais sauvegarder et charger ce pipeline, donc un transformateur de données personnalisé peut être impraticable. Je suppose que ce n'est pas possible car Spark est actuellement écrit.

Répondre

4

Vous pouvez indexer les données, puis remplacer les métadonnées. Disons que vos données ressemble à ceci:

import spark.implicits._ 
import org.apache.spark.ml.feature.StringIndexer 

val indexer = new StringIndexer().setInputCol("raw").setOutputCol("indexed") 

val df = Seq("a", "b", "b", "c", "c", "c").toDF("raw") 
val indexed = indexer.fit(df).transform(df) 

Nous aurons besoin d'un NumericAttribute:

import org.apache.spark.ml.attribute.NumericAttribute 

et métadonnées:

val meta = NumericAttribute.defaultAttr.withName("indexed").toMetadata 

Enfin on peut remplacer la méthode métadonnées à l'aide as:

indexed.withColumn("indexed", $"indexed".as("indexed", meta))