2017-03-09 3 views
2

J'essaie de créer une matrice de modèle dans sparklyr. Il existe une fonction ml_create_dummy_variables() pour créer des variables fictives pour une variable catégorielle à la fois. Autant que je sache, il n'y a pas d'équivalent model.matrix() pour créer une matrice de modèle en une seule étape. Il est facile d'utiliser ml_create_dummy_variables() mais je ne comprends pas pourquoi les nouvelles variables fictives ne sont pas stockées dans la base de données Spark.Pourquoi ml_create_dummy_variables ne montre pas de nouvelles colonnes de variables factices dans sparklyr

Considérons cet exemple:

###create dummy data to figure out how model matrix formulas work in sparklyr 

v1 <- sample(LETTERS[1:4], 50000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05)) 
v2 <- sample(LETTERS[5:6], 50000, replace=TRUE, prob=c(0.7,0.3)) 
v3 <- sample(LETTERS[7:10], 50000, replace=TRUE, prob=c(0.3, 0.2, 0.4, 0.1)) 
v4 <- sample(LETTERS[11:15], 50000, replace=TRUE, prob=c(0.1, 0.1, 0.3, 0.05,.45)) 
v5 <- sample(LETTERS[16:17], 50000, replace=TRUE, prob=c(0.4,0.6)) 
v6 <- sample(LETTERS[18:21], 50000, replace=TRUE, prob=c(0.1, 0.1, 0.65, 0.15)) 
v7 <- sample(LETTERS[22:26], 50000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.03,.02)) 
v8 <- rnorm(n=50000,mean=.5,sd=.1) 
v9 <- rnorm(n=50000,mean=5,sd=3) 
v10 <- rnorm(n=50000,mean=3,sd=.5) 
response <- rnorm(n=50000,mean=10,sd=2) 

dat <- data.frame(v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,response) 
write.csv(dat,file='fake_dat.csv',row.names = FALSE) 

#push "fake_dat.csv" to the hdfs 

library(dplyr) 
library(sparklyr) 
#configure the spark session and connect 
config <- spark_config() 
config$`sparklyr.shell.driver-memory` <- "2G" #change depending on the size of the data 
config$`sparklyr.shell.executor-memory` <- "2G" 

sc <- spark_connect(master='yarn-client', spark_home='/usr/hdp/2.5.0.0-1245/spark',config = config) 
sc 

#can also set spark_home as ‘/usr/hdp/current/spark-client’ 

#read in the data from the hdfs 
df <- spark_read_csv(sc,name='fdat',path='hdfs://pnhadoop/user/stc004/fake_dat.csv') 

#create spark table 
dat <- tbl(sc,'fdat') 

#create dummy variables 
ml_create_dummy_variables(x=dat,'v1', reference = NULL) 

Maintenant, je reçois la notification suivante de sparklyr:

Source: query [5e+04 x 15] 
Database: spark connection master=yarn-client app=sparklyr local=FALSE 

     v1 v2 v3 v4 v5 v6 v7  v8  v9  v10 
    <chr> <chr> <chr> <chr> <chr> <chr> <chr>  <dbl>  <dbl> <dbl> 
1  A  F  I  O  Q  T  X 0.4518162 12.281566 3.915094 
2  C  E  H  L  Q  T  X 0.3967605 2.131341 3.373347 
3  C  F  I  O  P  S  W 0.4458047 7.167670 2.737003 
4  C  E  G  M  P  T  X 0.4822457 5.946978 2.375309 
5  B  E  H  L  P  U  W 0.4756011 9.456327 2.406996 
6  C  F  H  L  P  U  X 0.5064916 2.920591 3.111827 
7  C  F  I  O  Q  T  W 0.3060585 1.611517 2.242328 
8  B  F  J  L  Q  T  V 0.6238052 9.821750 2.670400 
9  C  E  I  O  Q  U  X 0.4249922 2.141794 3.020958 
10  B  F  G  K  P  T  X 0.5348334 1.461034 3.057635 
# ... with 4.999e+04 more rows, and 5 more variables: response <dbl>, 
# v1_A <dbl>, v1_B <dbl>, v1_C <dbl>, v1_D <dbl> 

Quand je vérifie le nombre de colonnes les nouvelles variables muettes ne semblent pas.

> colnames(dat) 
[1] "v1"  "v2"  "v3"  "v4"  "v5"  "v6" 
[7] "v7"  "v8"  "v9"  "v10"  "response" 
> 

Pourquoi cela se produit-il? Aussi, existe-t-il un moyen facile de convertir toutes les colonnes en une seule étape? Je travaille avec des ensembles de données de plus de 1000 variables, j'ai donc besoin d'un moyen rapide de le faire. J'ai essayé de créer une boucle, mais cela ne fait rien:

for(i in 1:7){ 
ml_create_dummy_variables(x=dat,colnames(dat)[i],reference=NULL) 
} 

Répondre

1

ml_create_dummy_variables ne modifie pas la table existante, mais créer et votre code défausse simplement les résultats. Vous devez stocker les résultats:

tmp <- ml_create_dummy_variables(x=dat,'v1', reference = NULL) 

Aussi, est-il un moyen facile de convertir toutes les colonnes en une seule étape? Je travaille avec des ensembles de données> 1000 les variables, donc je besoin d'un moyen rapide de faire

boucle ou Reduce est très bien, mais il n'y a aucun moyen rapide de le faire. Pour créer des mannequins, vous devez d'abord [déterminer tous les niveaux possibles et cela nécessite a full column scan for each variable.

En outre avec> 1000 colonnes, en particulier avec un grand nombre de niveaux, vous commencez à atteindre différentes limites de l'optimiseur Spark. sparklyr (contrairement à Spark ML qui utilise Vector UDT) expands all columns et cela ne se met pas bien à l'échelle.