如何在 SparkR 中对多列正确使用 ft_string_indexer 和 ft_one_hot_encoder

How to correctly use ft_string_indexer and ft_one_hot_encoder for multiple columns in SparkR

我有两个问题:

  1. 如何在 spark 中将多个分类变量转换为一个大的虚拟变量矩阵?

  2. 如何使用 one_hot_encoder 和 运行(逻辑)回归得到正确的输出?

我对如何使用 ft_string_indexerft_one_hot_encoder 获得正确的 tbl 感到困惑。

例如,我制作了当前数据框:

library(sparklyr)
library(tidyverse)

sc <- spark_connect(master="yarn-client", spark_home =Sys.getenv("SPARK_HOME"), app_name = "sparklyr",
                    version = "2.1.2", hadoop_version = "2.6", config = configs)

df <- data.frame(
  a=rep(letters[1:4],5), 
  b=rep(c("one", "two"), 10), 
  y=rbinom(n=20,size=1,prob=0.5))

copy_to(sc, df, "df")

所以 df 目前看起来像这样:

# Source:   table<df> [?? x 3]
# Database: spark_connection
   a     b         y
   <chr> <chr> <int>
 1 a     one       0
 2 b     two       1
 3 c     one       1
 4 d     two       0
 5 a     one       1
 6 b     two       0
 7 c     one       0
 8 d     two       1
 9 a     one       0
10 b     two       1
# ... with more rows

我运行以下突变序列并得到输出为:

df2 <- tbl(sc, "df")
df2 %>% 
    sdf_mutate(a_idx = ft_string_indexer(a)) %>% 
    sdf_mutate(b_idx = ft_string_indexer(b)) %>% 
    sdf_mutate(a_vec = ft_one_hot_encoder(a_idx)) %>% 
    sdf_mutate(b_vec = ft_one_hot_encoder(b_idx)) %>% 
    collect()

# A tibble: 20 x 7
   a     b         y a_idx b_idx a_vec     b_vec    
   <chr> <chr> <int> <dbl> <dbl> <list>    <list>   
 1 a     one       0     0     0 <dbl [3]> <dbl [1]>
 2 b     two       1     1     1 <dbl [3]> <dbl [1]>
 3 c     one       1     2     0 <dbl [3]> <dbl [1]>
 4 d     two       0     3     1 <dbl [3]> <dbl [1]>
 5 a     one       1     0     0 <dbl [3]> <dbl [1]>
 6 b     two       0     1     1 <dbl [3]> <dbl [1]>
 7 c     one       0     2     0 <dbl [3]> <dbl [1]>
 8 d     two       1     3     1 <dbl [3]> <dbl [1]>
 9 a     one       0     0     0 <dbl [3]> <dbl [1]>
10 b     two       1     1     1 <dbl [3]> <dbl [1]>
11 c     one       1     2     0 <dbl [3]> <dbl [1]>
12 d     two       0     3     1 <dbl [3]> <dbl [1]>
13 a     one       1     0     0 <dbl [3]> <dbl [1]>
14 b     two       0     1     1 <dbl [3]> <dbl [1]>
15 c     one       0     2     0 <dbl [3]> <dbl [1]>
16 d     two       0     3     1 <dbl [3]> <dbl [1]>
17 a     one       0     0     0 <dbl [3]> <dbl [1]>
18 b     two       1     1     1 <dbl [3]> <dbl [1]>
19 c     one       0     2     0 <dbl [3]> <dbl [1]>
20 d     two       0     3     1 <dbl [3]> <dbl [1]>

此输出似乎不适合在 ml_logistic_regression 函数中使用。关于如何优化多列的编码和正确格式以及运行对其进行回归的任何帮助都会有所帮助!

逻辑回归分类器需要一列作为输入,因此您需要从编码的 a_vecb_vec 中设计这一列。为此,您可以像这样使用矢量汇编器:

features_idx = ft_vector_assembler(c("a_vec", "b_vec"))