2016-12-08 8 views
2

は、私は私のMLパイプラインの一部を拡大しようとしていると私はrstudio、火花の組み合わせを愛し、そしてそのsparklyrが開きH2O私が把握しようとしている(http://spark.rstudio.com/sparklyrにダミー変数を作成するには?

ことの一つは、使用する方法です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に精通していないので、どうやってこれを行うのか分かりません。

すでに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| 
+------------+----------+------+-----------+ 

すると次は、[単語]フィールドにダミーを作るために働くようだ:(pyspark matrix with dummy variables)から取られた

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) 

答えて

0

I sparklyrに精通していませんが、カテゴリ変数のためのダミーの機能を作成することは実際にSparkで実装されています。

スパークのOne Hot Encoderは、$ n $整数インデックスの列を取り込み、$ n-1 $に対応するダミー列を作成します。あなたのデータがまだRのString/Factorフォームにある場合は、最初にSparkのStringIndexerを使ってインデックスに変換する必要があります(上記のリンクを参照)。

+0

クールなおかげで、いつもこれについて疑問に思っています。どのような整数が元の文字列を参照しているかをどのように把握していますか?辞書の並べ替えの並べ替え? – andrewm4894

+0

私はSparkが文字列を頻度で索引付けすると信じています。つまり、最も頻繁に表示される項目には索引0が付いています。いずれにしても、Sparkには[IndexToString](http://spark.apache.org/docs/latest/api/scala/) index.html#org.apache.spark.ml.feature.IndexToString)クラスを使用して、インデックス付けを元に戻すことができます。 – hdkrgr

1

これらは、元の投稿以来、新しいかもしれません。 ml_機能は、彼らが<dbl>なく<int>それが簡単にas.integerコールで固定していますねうまく

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 

恥仕事をしていませんml_create_dummy_variablesを持っています。

+0

これは単一の列を変換する場合に便利ですが、複数の要素の列を変換する際には簡単な解決法はありますか? –

+0

完全にはわかりません。それ以来、SparkMLのパイプライン機能が多く追加されています。おそらくそこに新しいもの(調査されていない)があります。 – dougmet

関連する問題