一个热编码中每行有多个值 - 推荐这样做吗?

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 表示)。你可以做的是:

  1. 按因子变量分组(例如,通过 group_by()
  2. 添加频率计数(例如,通过 freq = n()
  3. 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