一个热编码中每行有多个值 - 推荐这样做吗?
Multiple values per row in one hot encoding - is this recommended?
我在 mltools
中使用 one_hot
函数将 2 变量熔化数据框转换为宽数据框,其中每个变量(索引除外)都是一个因子级别。
熔化框架中有 25,000 行,只有 2 个变量 - 一个是具有 800 个级别的因子,一个是索引,因此我可以稍后合并回来。
我将使用各种机器学习包,因此需要以可接受的方式表示 800 个因子水平。
但是,当我使用 one_hot
时,我得到了一个包含 801 列的框架,这是正确的(800 个因子水平 + 1 个索引)但是 我仍然有 25,000 行.在索引中表示为唯一值的原始观察值的数量为 1,000。
所以,我的问题是 - 一个热变量每行只有一个正值是最佳实践吗?现在把它折叠起来让每一行都是一个观察值有什么缺点吗?
谢谢。
我会根据你提供的信息回答问题
你基本上有 25,000 个索引观测值(由 id
表示)一个变量(具有 800 个水平的因子变量,用 val
表示)。你可以做的是:
- 按因子变量分组(例如,通过
group_by()
)
- 添加频率计数(例如,通过
freq = n()
)
- One-hotting 变量(
mltools
包非常适合)
这将使您 没有索引 ,但 2 x 801 table 包含每个 单热变量(第 1:800 列)及其 频率(第 801 列)。很多框架都可以很好地处理这样的数据,但是没有更多信息就无法具体回答。
> str(result)
Classes ‘data.table’ and 'data.frame': 800 obs. of 801 variables:
$ val_AAL5 : int 1 0 0 0 0 0 0 0 0 0 ...
$ val_ABP14: int 0 1 0 0 0 0 0 0 0 0 ...
$ val_ACQ8 : int 0 0 1 0 0 0 0 0 0 0 ...
$ val_ADU8 : int 0 0 0 1 0 0 0 0 0 0 ...
$ val_AEB16: int 0 0 0 0 1 0 0 0 0 0 ...
$ val_AEX17: int 0 0 0 0 0 1 0 0 0 0 ...
$ val_AGQ4 : int 0 0 0 0 0 0 1 0 0 0 ...
$ val_AHS8 : int 0 0 0 0 0 0 0 1 0 0 ...
$ val_AHV2 : int 0 0 0 0 0 0 0 0 1 0 ...
$ val_AHX16: int 0 0 0 0 0 0 0 0 0 1 ...
$ val_AIV19: int 0 0 0 0 0 0 0 0 0 0 ...
...
代码
df <- df %>%
group_by(val) %>%
summarise(freq = n())
dt <- as.data.table(df)
result <- one_hot(dt)
数据
library(dplyr)
library(data.table)
library(mltools)
set.seed(1701)
df <- data.frame(
id = 1:25000,
val = sample(paste0(sample(LETTERS[1:26], 800, replace = TRUE),
sample(LETTERS[1:26], 800, replace = TRUE),
sample(LETTERS[1:26], 800, replace = TRUE),
sample(1:20, 20, replace = TRUE)),
25000, replace = TRUE))
> head(df)
id val
1 1 CXC15
2 2 IPH16
3 3 ICK1
4 4 OPJ2
5 5 XSA8
6 6 JKS19
我在 mltools
中使用 one_hot
函数将 2 变量熔化数据框转换为宽数据框,其中每个变量(索引除外)都是一个因子级别。
熔化框架中有 25,000 行,只有 2 个变量 - 一个是具有 800 个级别的因子,一个是索引,因此我可以稍后合并回来。
我将使用各种机器学习包,因此需要以可接受的方式表示 800 个因子水平。
但是,当我使用 one_hot
时,我得到了一个包含 801 列的框架,这是正确的(800 个因子水平 + 1 个索引)但是 我仍然有 25,000 行.在索引中表示为唯一值的原始观察值的数量为 1,000。
所以,我的问题是 - 一个热变量每行只有一个正值是最佳实践吗?现在把它折叠起来让每一行都是一个观察值有什么缺点吗?
谢谢。
我会根据你提供的信息回答问题
你基本上有 25,000 个索引观测值(由 id
表示)一个变量(具有 800 个水平的因子变量,用 val
表示)。你可以做的是:
- 按因子变量分组(例如,通过
group_by()
) - 添加频率计数(例如,通过
freq = n()
) - One-hotting 变量(
mltools
包非常适合)
这将使您 没有索引 ,但 2 x 801 table 包含每个 单热变量(第 1:800 列)及其 频率(第 801 列)。很多框架都可以很好地处理这样的数据,但是没有更多信息就无法具体回答。
> str(result)
Classes ‘data.table’ and 'data.frame': 800 obs. of 801 variables:
$ val_AAL5 : int 1 0 0 0 0 0 0 0 0 0 ...
$ val_ABP14: int 0 1 0 0 0 0 0 0 0 0 ...
$ val_ACQ8 : int 0 0 1 0 0 0 0 0 0 0 ...
$ val_ADU8 : int 0 0 0 1 0 0 0 0 0 0 ...
$ val_AEB16: int 0 0 0 0 1 0 0 0 0 0 ...
$ val_AEX17: int 0 0 0 0 0 1 0 0 0 0 ...
$ val_AGQ4 : int 0 0 0 0 0 0 1 0 0 0 ...
$ val_AHS8 : int 0 0 0 0 0 0 0 1 0 0 ...
$ val_AHV2 : int 0 0 0 0 0 0 0 0 1 0 ...
$ val_AHX16: int 0 0 0 0 0 0 0 0 0 1 ...
$ val_AIV19: int 0 0 0 0 0 0 0 0 0 0 ...
...
代码
df <- df %>%
group_by(val) %>%
summarise(freq = n())
dt <- as.data.table(df)
result <- one_hot(dt)
数据
library(dplyr)
library(data.table)
library(mltools)
set.seed(1701)
df <- data.frame(
id = 1:25000,
val = sample(paste0(sample(LETTERS[1:26], 800, replace = TRUE),
sample(LETTERS[1:26], 800, replace = TRUE),
sample(LETTERS[1:26], 800, replace = TRUE),
sample(1:20, 20, replace = TRUE)),
25000, replace = TRUE))
> head(df)
id val
1 1 CXC15
2 2 IPH16
3 3 ICK1
4 4 OPJ2
5 5 XSA8
6 6 JKS19