Se ho capito correttamente, non si desidera convertire 1 colonna categoriale in diverse colonne fittizie. Vuoi che la scintilla capisca che la colonna è categorica e non numerica.
Penso che dipenda dall'algoritmo che si desidera utilizzare in questo momento. Per esempio Foresta casuale e GBT avere sia categoricalFeaturesInfo come parametro verificarlo qui:
https://spark.apache.org/docs/1.4.0/api/scala/index.html#org.apache.spark.mllib.tree.RandomForest $
così per esempio:
categoricalFeaturesInfo = Map[Int, Int]((1,2),(2,5))
è in realtà dicendo che seconda colonna delle vostre caratteristiche (indice inizia in 0, quindi 1 è la seconda colonna) è una categoriale con 2 livelli e la terza è anche una funzione categoriale con 5 livelli. È possibile specificare questi parametri quando si allena il randomForest o il GBT.
È necessario assicurarsi che i livelli siano mappati su 0,1,2 ... quindi se si dispone di qualcosa di simile ("buono", "medio", "cattivo") mapparlo in (0,1,2).
Ora nel tuo caso si desidera utilizzare LogisticRegressionWithLBFGS. In questo caso il mio suggerimento è di trasformare effettivamente le colonne categoriali in colonne fittizie. Ad esempio una singola colonna con 3 livelli ("buono", "medio", "cattivo") in 3 colonne con 1/0 a seconda di quale colpisce. Non ho un esempio di lavorare con ecco un codice di esempio in scala che dovrebbe funzionare:
val dummygen = (data : DataFrame, col:Array[String]) => {
var temp = data
for(i <- 0 until col.length) {
val N = data.select(col(i)).distinct.count.toInt
for (j<- 0 until N)
temp = temp.withColumn(col(i) + "_" + j.toString, callUDF(index(j), DoubleType, data(col(i))))
}
temp
}
val index = (value:Double) => {(a:Double) => {
if (value==a) {
1
} else{
0
}
}}
che si può chiamare piace:
val results = dummygen(data, Array("CategoricalColumn1","CategoricalColumn2"))
Qui lo faccio per un elenco di Colonne categoriali (nel caso in cui ne abbiate più di 1 nell'elenco delle caratteristiche). Il primo "ciclo for" passa per ciascuna colonna categoriale, il secondo "ciclo per" passa attraverso ogni livello della colonna e crea un numero di colonne uguale al numero di livelli per ciascuna colonna.
Importante !!! che si presuppone che li abbia prima mappati a 0,1,2 ...
È quindi possibile eseguire LogisticRegressionWithLBFGS utilizzando questo nuovo set di funzionalità. Questo approccio aiuta anche con SVM.
Cosa intendi con "non può funzionare con quel tipo di variabile"? Non sono esperto in R, ma non è una variabile categoriale solo un'enumerazione? –
Voglio dire se non dico a R che la mia variabile è categoriale, R la considera come una variabile continua (ad esempio una variabile che è uguale a "'1'" per la presenza di una caratteristica specifica, "'2'" se non e "'3" "se mancano le informazioni). Per distinguere questa variabile da una variabile continua, dico a R di trasformare la variabile in fattore con il comando "as.factor". In Spark, la variabile viene automaticamente considerata come continua e il comando automatico "as.factor" non esiste, quindi devo crearlo da solo. – SparkUser