[R] 中的 One-Hot 编码 |分类到虚拟变量

Posted

技术标签:

【中文标题】[R] 中的 One-Hot 编码 |分类到虚拟变量【英文标题】:One-Hot Encoding in [R] | Categorical to Dummy Variables [duplicate] 【发布时间】:2014-07-31 07:25:45 【问题描述】:

我需要创建一个新的数据框 nDF,它将所有分类变量二值化,同时将所有其他变量保留在数据框 DF 中。例如,我有以下特征变量:RACE(4 种类型)和 AGE,以及一个名为 CLASS 的输出变量。

DF =

种族年龄(21岁以下)班级 案例 1 西班牙裔 0 A 案例 2 亚洲 1 A 案例 3 西班牙裔 1 D 案例 4 白种人 1 B

我想将其转换为带有五 (5) 个变量或四 (4) 个变量的 nDF:

RACE.1 RACE.2 RACE.3 年龄(21 岁以下)等级 案例 1 0 0 0 0 A 案例 2 0 0 1 1 A 案例 3 0 0 0 1 D 案例 4 0 1 0 1 B

我熟悉变量 DF$RACE 的处理对比。但是,如果我实施

contrasts(DF$RACE) = contr.treatment(4)

我得到的仍然是三个变量的 DF,但变量 DF$RACE 具有“对比”属性。

我最终想要的是一个新的数据框 nDF,如上图所示,但如果一个数据框有大约 50 个特征变量,其中超过五 (5) 个,评估它可能会非常繁琐是分类变量。

【问题讨论】:

如果您愿意使用data.table 包,您可以使用mltools 中的one_hot() 方法。 【参考方案1】:
dd <- read.table(text="
   RACE        AGE.BELOW.21     CLASS
   HISPANIC          0          A
   ASIAN             1          A
   HISPANIC          1          D
   CAUCASIAN         1          B",
  header=TRUE)


  with(dd,
       data.frame(model.matrix(~RACE-1,dd),
                  AGE.BELOW.21,CLASS))
 ##   RACEASIAN RACECAUCASIAN RACEHISPANIC AGE.BELOW.21 CLASS
 ## 1         0             0            1            0     A
 ## 2         1             0            0            1     A
 ## 3         0             0            1            1     D
 ## 4         0             1            0            1     B

公式~RACE-1 指定R 应该从RACE 变量创建虚拟变量,但抑制截距(以便每列代表观察是否来自指定类别);默认情况下,没有-1,将第一列设为截距项(全为),从模型矩阵中省略基线水平(因子的第一水平)的虚拟变量。

更一般地说,您可能想要类似的东西

 dd0 <- subset(dd,select=-CLASS)
 data.frame(model.matrix(~.-1,dd0),CLASS=dd$CLASS)

请注意,当您有多个分类变量时,如果您想要为每个变量设置完整的虚拟变量集,您将不得不做一些棘手的事情。我会想到 cbind() 将单独的模型矩阵放在一起,但我认为还有一些技巧可以一次完成所有这些我忘记了......

【讨论】:

我一定会尝试您在此处建议的这个,并使用 cbind() 进行更多探索。这真的很有帮助。如果我有更多的声望,我会投票赞成你的答案。 看不懂~RACE-1的意思? RACE 表示根据治疗对比将分类变量转换为虚拟变量; -1 表示省略拦截项 请注意,数字编码的列必须存储为characterfactor,否则model.matrix 将保留它。

以上是关于[R] 中的 One-Hot 编码 |分类到虚拟变量的主要内容,如果未能解决你的问题,请参考以下文章

R语言构建xgboost模型:基于叶子索引衍生出新的特征并进行独热编码(one-hot encoding)之后构建新的模型比较加入叶子索引特征的模型的分类性能提升

如何从 PNG 为 Tensorflow 2 中的每个像素分类创建 One-hot 编码矩阵

python使用sklearn中的MultiLabelBinarizer函数将多标签的分类变量进行独热编码(One-Hot Encode Features With Multiple Labels)

如果您有分类任务,您是不是总是需要 one-hot 编码

机器学习多分类:为啥使用“one-hot”编码而不是数字

机器学习One-Hot编码