使用R语言目标编码函数报错:replacement has length zero
问题:目标编码函数在自有数据集触发
replacement has length zero错误 我使用rbloggers上的目标编码函数:
function(x, y, sigma = NULL) { d <- aggregate(y, list(factor(x, exclude = NULL)), mean, na.rm = TRUE) m <- d[is.na(as.character(d[, 1])), 2] l <- d[, 2] names(l) <- d[, 1] l <- l[x] l[is.na(l)] <- m if (!is.null(sigma)) { l <- l * rnorm(length(l), mean = 1, sd = sigma) } l }
该函数在示例数据上运行正常:
data1 <- data.frame(factor_var = c("a", "a", "a", "a", "b", "b"), target = c(TRUE, FALSE, FALSE, TRUE, FALSE, FALSE))
输出结果:
> l a a a a b b 0.5 0.5 0.5 0.5 0.0 0.0
但应用到自有数据集时,出现错误:
Error in l[is.na(l)] <- m : replacement has length zero
错误触发于l[is.na(l)] <- m,此时m为空数值类型。我的数据集结构如下:
structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L), levels = c("Albania_Albanian Cup", "Albania_Superliga", "Argentina_Copa Argentina", "Argentina_Copa de la Superliga"), class = "factor")
错误原因
你的数据集是包含未出现因子水平的因子变量(比如Albania_Albanian Cup和Argentina_Copa de la Superliga这两个水平在当前数据中没有实例),当函数执行l <- l[x]时,这些未出现的水平会被引入并生成NA值。而原函数中m仅提取x中NA值对应的分组均值,但你的x里没有NA,导致m为空,最终替换NA时出现长度不匹配的错误。
原函数的m设计仅处理x中的NA值,无法覆盖因子未出现水平产生的NA。
修复方案
修改函数,让m计算目标变量y的全局均值,用来替换所有类型的NA(包括因子未出现水平产生的NA):
target_encoding <- function(x, y, sigma = NULL) { # 计算各因子水平的目标均值 d <- aggregate(y, list(factor(x, exclude = NULL)), mean, na.rm = TRUE) # 计算全局目标均值(作为NA的默认替换值) m <- mean(y, na.rm = TRUE) l <- d[, 2] names(l) <- d[, 1] # 匹配输入x的取值,未匹配项生成NA l <- l[x] # 用全局均值替换所有NA l[is.na(l)] <- m # 可选:添加噪声防止过拟合 if (!is.null(sigma)) { l <- l * rnorm(length(l), mean = 1, sd = sigma) } l }
验证示例
用你的数据集测试(假设目标变量y为对应长度的数值向量):
x <- structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L), levels = c("Albania_Albanian Cup", "Albania_Superliga", "Argentina_Copa Argentina", "Argentina_Copa de la Superliga"), class = "factor") y <- c(1,0,1,0,1,0,1,0,0,0) target_encoding(x, y)
此时未出现的因子水平对应的NA会被全局均值替换,不会再触发错误。
内容的提问来源于stack exchange,提问作者user2165379
相关产品推荐
相关产品推荐

