Como codificar a quente várias variáveis categóricas em R

Estou a trabalhar num problema de Previsão e estou a construir uma árvore de decisões em R, tenho várias variáveis categóricas e gostaria de codificá-las consistentemente no meu conjunto de treino e testes. Consegui fazê-lo nos meus dados de treino com :

temps <- X_train
tt <- subset(temps, select = -output)
oh <- data.frame(model.matrix(~ . -1, tt), CLASS = temps$output)

mas não consigo encontrar uma maneira de aplicar a mesma codificação no meu conjunto de testes, como posso fazer isso?

Author: Esteban PS, 2018-02-06

2 answers

Recomendo a utilização da função dummyVars no Pacote caret:

customers <- data.frame(
  id=c(10, 20, 30, 40, 50),
  gender=c('male', 'female', 'female', 'male', 'female'),
  mood=c('happy', 'sad', 'happy', 'sad','happy'),
  outcome=c(1, 1, 0, 0, 0))
customers
id gender  mood outcome
1 10   male happy       1
2 20 female   sad       1
3 30 female happy       0
4 40   male   sad       0
5 50 female happy       0


# dummify the data
dmy <- dummyVars(" ~ .", data = customers)
trsf <- data.frame(predict(dmy, newdata = customers))
trsf
id gender.female gender.male mood.happy mood.sad outcome
1 10             0           1          1        0       1
2 20             1           0          0        1       1
3 30             1           0          1        0       0
4 40             0           1          0        1       0
5 50             1           0          1        0       0

Exemplo fonte

Aplica-se o mesmo procedimento tanto aos conjuntos de formação como de validação.

 2
Author: Esteban PS, 2018-02-06 18:51:43

Hi aqui está a minha versão do mesmo, esta função codifica todas as variáveis categóricas que são 'factores' , e remove uma das variáveis fictícias para evitar a armadilha da variável fictícia e devolve uma nova moldura de dados com a codificação: -

onehotencoder <- function(df_orig) {
  df<-cbind(df_orig)
  df_clmtyp<-data.frame(clmtyp=sapply(df,class))
  df_col_typ<-data.frame(clmnm=colnames(df),clmtyp=df_clmtyp$clmtyp)
  for (rownm in 1:nrow(df_col_typ)) {
    if (df_col_typ[rownm,"clmtyp"]=="factor") {
      clmn_obj<-df[toString(df_col_typ[rownm,"clmnm"])] 
      dummy_matx<-data.frame(model.matrix( ~.-1, data = clmn_obj))
      dummy_matx<-dummy_matx[,c(1,3:ncol(dummy_matx))]
      df[toString(df_col_typ[rownm,"clmnm"])]<-NULL
      df<-cbind(df,dummy_matx)
      df[toString(df_col_typ[rownm,"clmnm"])]<-NULL
    }  }
  return(df)
}
 1
Author: Shubham Joshi, 2018-09-18 04:26:50