3

我正在尝试扩展我的一些 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 矩阵

4

2 回答 2

2

这些可能是自原始帖子以来的新内容。这些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

可耻的是他们不是<dbl><int>但这很容易通过一个as.integer电话解决。

于 2017-05-17T21:18:23.580 回答
0

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

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

于 2016-12-08T12:42:47.577 回答