【问题标题】:Creating dummy variables in sparklyr?在 sparklyr 中创建虚拟变量?
【发布时间】:2017-04-23 16:49:14
【问题描述】:

我正在尝试扩展我的一些 ML 管道,我喜欢 sparklyr 开放的 rstudio、spark 和 h2o 的组合 (http://spark.rstudio.com/)

我想弄清楚的一件事是如何使用 sparklyr 从数据帧中的字符向量创建虚拟列。

我已经尝试了以下方法,但我认为它可能混合了一些 sparklyr 尚未实现的功能。

library(sparklyr)
library(dplyr)

sc <- spark_connect(master = "local")

flights_tbl <- copy_to(sc, nycflights13::flights, "flights")

flights_tbl %>% bind_cols(as_data_frame(setNames(lapply(unique(flights_tbl$carrier), 
                                               function(x){as.integer(flights_tbl$carrier == x)}), 
                                        paste0('var2_', levels(flights_tbl$carrier)))))

在此示例中,我想为每个运营商创建指标变量。

说实话,我对 dplyr 并不是很熟悉,所以不确定我会怎么做。

是否有一个 spark 函数已经退出,我可以通过 sparklyr 扩展调用,或者有没有办法只使用 dplyr 函数?

更新

我想我有办法在数据帧上的 pyspark 中执行此操作(以防对任何人有用)。

所以如果数据看起来像:

>>> df.show(20)
+------------+----------+------+-----------+
|        word|word_count|corpus|corpus_date|
+------------+----------+------+-----------+
|  profession|         1|hamlet|       1600|
|      augury|         1|hamlet|       1600|
|undertakings|         1|hamlet|       1600|
|     surmise|         1|hamlet|       1600|
|    religion|         1|hamlet|       1600|
|    advanced|         1|hamlet|       1600|
|    Wormwood|         1|hamlet|       1600|
|   parchment|         1|hamlet|       1600|
|     villany|         1|hamlet|       1600|
|        digs|         1|hamlet|       1600|
| authorities|         1|hamlet|       1600|
|      Popp'd|         1|hamlet|       1600|
|  retrograde|         1|hamlet|       1600|
|       tax'd|         1|hamlet|       1600|
|        tomb|         1|hamlet|       1600|
|       moral|         1|hamlet|       1600|
| foreknowing|         1|hamlet|       1600|
|  dreadfully|         1|hamlet|       1600|
|      parted|         1|hamlet|       1600|
|      willow|         1|hamlet|       1600|
+------------+----------+------+-----------+

那么以下似乎可以在 [word] 字段上制作假人:

categories = df.select("word").distinct().rdd.flatMap(lambda x: x).collect()

exprs = [F.when(F.col("word") == category, 1).otherwise(0).alias(category) for category in categories]

df_dummies = df.select("word", *exprs).limit(1000)

取自 (pyspark matrix with dummy variables)

【问题讨论】:

    标签: r apache-spark dplyr plyr sparklyr


    【解决方案1】:

    这些可能是自原始帖子以来的新内容。 ml_ 函数有 ml_create_dummy_variables 很好地完成了这项工作

    iris_tbl <- copy_to(sc, iris)
    
    iris_dum <- ml_create_dummy_variables(iris_tbl, "Species")
    
    iris_dum %>% select(contains("Species")) %>% head
    
    > 
    Source:   query [6 x 4]
    Database: spark connection master=local[4] app=lol local=TRUE
    
      Species Species_setosa Species_versicolor Species_virginica
        <chr>          <dbl>              <dbl>             <dbl>
    1  setosa              1                  0                 0
    2  setosa              1                  0                 0
    3  setosa              1                  0                 0
    4  setosa              1                  0                 0
    5  setosa              1                  0                 0
    6  setosa              1                  0                 0
    

    很遗憾他们是 &lt;dbl&gt; 而不是 &lt;int&gt;,但这很容易通过 as.integer 电话解决。

    【讨论】:

    • 这在转换单个列时​​很有用,但是在转换多个因子列时有没有简单的解决方案?
    • 不完全确定。 0.7 版已经发布,它增加了 SparkML 的许多管道功能。也许那里有一些新东西(未调查)。
    • 看起来 ml_create_dummy_variables 在 0.7 中已被悄悄弃用。 ft_one_hot_encoder 还在。
    【解决方案2】:

    我不熟悉 sparklyr,但在 Spark 中确实实现了为分类变量创建虚拟特征。

    Spark 的One Hot Encoder 接收一列$n$ 整数索引并创建$n-1$ 对应的虚拟列。如果您的数据在 R 中仍然是字符串/因子形式,您可能必须先使用 Spark 的 StringIndexer 将其转换为索引(参见上面的链接)。

    【讨论】:

    • 很酷,谢谢 - 一直想知道这一点 - 你如何跟踪哪个整数指的是哪个原始字符串?排序排序的字典?
    • 我相信 Spark 按频率对字符串进行索引,即最频繁的项目的索引为 0。无论如何,Spark 还有一个 IndexToString 类可以反转索引。
    猜你喜欢
    • 2023-03-27
    • 2023-03-24
    • 1970-01-01
    • 2018-04-06
    • 2020-01-31
    • 1970-01-01
    • 2013-09-23
    • 2017-02-24
    • 2012-09-27
    相关资源
    最近更新 更多