Rでone-hot encodingするときに便利なパッケージ{dummies}
はじめに
私生活でも仕事でも「カテゴリ変数を[0,1]実数で表現したい」という欲望に駆られる. どういうことか?下のように入っているデータがあるとする.
Category |
---|
A |
B |
C |
これを,下のように変換したい.
Category_A | Category_B | Category_C |
---|---|---|
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 1 |
界隈ではこのようなデータの変換をone-hot encodingという.
自前でアルゴリズムを組んでみるのもためになるが,納期は迫る.焦る.
そんなときのdummies
パッケージ.
開発元は下.
大したことやっていない実装例は下.
インストールはみなさんおなじみinstall.packages("dummies")
使うデータも皆さんおなじみiris
を使う.
install.packages("dummies") dat <- iris # 入力かくにん!よかった head(dat) Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa 5 5.0 3.6 1.4 0.2 setosa 6 5.4 3.9 1.7 0.4 setosa
dummies
パッケージのdummy.data.frame()
関数で,コイツをone-hot encodingする.
sep
オプションで,「もとの変数名」と「one-hot後の数値・記号」の結合法則を指定できる
dummied_dat <- dummies::dummy.data.frame(dat, # one-hotにしたいDataFrame sep = "_", # 変数名の加工.ここでは「元変数名_カテゴリ番号」という形を指定. dummy.classes = "ALL" # classを指定してone-hot.全部やってほしいときは"ALL" ) head(dummied_dat) Sepal.Length_4.3 Sepal.Length_4.4 Sepal.Length_4.5 Sepal.Length_4.6 1 0 0 0 0 2 0 0 0 0 3 0 0 0 0 4 0 0 0 1 5 0 0 0 0 6 0 0 0 0 Sepal.Length_4.7 Sepal.Length_4.8 Sepal.Length_4.9 Sepal.Length_5 1 0 0 0 0 2 0 0 1 0 3 1 0 0 0 4 0 0 0 0 5 0 0 0 1 6 0 0 0 0 Sepal.Length_5.1 Sepal.Length_5.2 Sepal.Length_5.3 Sepal.Length_5.4 1 1 0 0 0 2 0 0 0 0 3 0 0 0 0 4 0 0 0 0 5 0 0 0 0 6 0 0 0 1 Sepal.Length_5.5 Sepal.Length_5.6 Sepal.Length_5.7 Sepal.Length_5.8 1 0 0 0 0 2 0 0 0 0 3 0 0 0 0 4 0 0 0 0 5 0 0 0 0 6 0 0 0 0 Sepal.Length_5.9 Sepal.Length_6 Sepal.Length_6.1 Sepal.Length_6.2 1 0 0 0 0 2 0 0 0 0 3 0 0 0 0 4 0 0 0 0 5 0 0 0 0 6 0 0 0 0 Sepal.Length_6.3 Sepal.Length_6.4 Sepal.Length_6.5 Sepal.Length_6.6 1 0 0 0 0 2 0 0 0 0 3 0 0 0 0 4 0 0 (以下略
なげえ.
dummy.classes
で型を指定して,指定した型だけをone-hot encodingすることもできる.
dummied_dat <- dummies::dummy.data.frame(dat, # one-hotにしたいDataFrame sep = "_", # 変数名の加工.ここでは「元変数名_カテゴリ番号」という形を指定. dummy.classes = "factor" # classを指定してone-hot. ) head(dummied_dat) Sepal.Length Sepal.Width Petal.Length Petal.Width Species_setosa 1 5.1 3.5 1.4 0.2 1 2 4.9 3.0 1.4 0.2 1 3 4.7 3.2 1.3 0.2 1 4 4.6 3.1 1.5 0.2 1 5 5.0 3.6 1.4 0.2 1 6 5.4 3.9 1.7 0.4 1 Species_versicolor Species_virginica 1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 6 0 0
names
で変数名を指定すると,特定の変数名だけone-hotにできる.c("変数名1","変数名2",...)
と置くことで,複数の指定も可能.
dummied_dat <- dummies::dummy.data.frame(dat, sep = "_", names = "Sepal.Length") head(dummied_dat) Sepal.Length_4.3 Sepal.Length_4.4 Sepal.Length_4.5 Sepal.Length_4.6 1 0 0 0 0 2 0 0 0 0 3 0 0 0 0 4 0 0 0 1 5 0 0 0 0 6 0 0 0 0 Sepal.Length_4.7 Sepal.Length_4.8 Sepal.Length_4.9 Sepal.Length_5 1 0 0 0 0 2 0 0 1 0 3 1 0 0 0 4 0 0 0 0 5 0 0 (略
なげえ.
連続値の入った変数を[0,1]に収めたいときは無理やりカテゴリ化するか,abs(x/max(x))
とかにするなどなんか工夫をしないと無駄にスクロールすることになる上次元の呪いに巻き込まれて気が狂う.
その他にもオプション等はある(one-hotしたくない変数の指定とか)ので,困ったら?dummy.data.frame
しよう.英語は気合で読もう.