[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
表示省略拦截项
请注意,数字编码的列必须存储为character
或factor
,否则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)