と。

Github: https://github.com/8-u8

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パッケージ. 開発元は下.

github.com

大したことやっていない実装例は下.

github.com

インストールはみなさんおなじみ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しよう.英語は気合で読もう.