我尝试做出预测 - 是否会退回来自在线零售商的商品 - 并且未能转换我的未知数据集(我想要预测)以使其适合我的模型的训练数据。更具体地说,我根据训练数据的拆分计算证据的权重 (woe),当我想替换未知数据中的 woe 时,我收到一个错误。但是让我一步一步来。
已知数据集(将被拆分为测试和训练)是daten
. 相关的是 id 列brand_id
,item_id
和user_id
二进制因变量“return”(1 = 将被返回,0 = 客户将不会返回项目)。所有“id”列都是因子并且具有> 200个级别。
下面先准备好原始数据。然后在准备未知数据并使用 WoE 之前训练 WoE 模型。
准备将每个仅出现一次的 id 放入因子“New”的变量。
daten
包括我所有的观察。# ---- Item_ID ---- (same for brand_id & user_id) levels(daten$item_id) <- c(levels(factor(daten$item_id)),"New") daten$item_id[daten$item_id %in% names(table(daten$item_id))[table(daten$item_id) == 1]] <- factor("New") daten$item_id <- factor(daten$item_id)
现在我分成
daten
测试和训练集。训练集再次分裂以接收仅用于计算证据权重的集。# ---- Training & Test ---- set.seed(111) idx.train <- createDataPartition(y = daten$return, p = 0.75, list = FALSE) test <- daten[-idx.train, ] # test set train <- daten[idx.train, ] # training set set.seed(112) woe.idx.train <- createDataPartition(y=train$return, p = 0.7, list = FALSE) train.split <- train[woe.idx.train,]
现在我训练 woe 模型。
woe.values_ids <- woe(return ~ item_id+brand_id+user_id, data=train.split, zeroadj=0.05)
步骤:训练训练集和测试集,以便 ID 将被相应的问题替换。(预测函数
predict.woe
来自 klaR 包)test.2 <-predict(woe.values_ids, newdata=test, replace=TRUE) train.2 <-predict(woe.values_ids, newdata=train, replace=TRUE)
现在我们跳到未知数据集,称为“nd”(=新数据)。"Nd" 有
brand_id
,item_id
, 和user_id
(也是所有因子) 列,但没有 "return" 列。我从准备 ID 开始,这样新的且未用于计算 woe 的 ID 将作为因子“新”(也存在于训练数据中)。这里的代码仅适用于item_id
:levels(nd$item_id) <- c(levels(factor(nd$item_id)),"New") nd$item_id[!(nd$item_id %in% woe.values_ids$xlevels$item_id)] <- factor("New") nd$item_id <- factor(nd$item_id, levels = levels(train.split$item_id))
在最后一步中,我想根据(根据训练集的一部分训练)计算“nd”的问题
woe.values_ids
,但我总是收到错误,即 ID 的级别不匹配或在我收到一些更改之后以下:final <- predict(woe.values_ids, newdata=nd, replace = TRUE) Error in if (sum(sapply(unique(x.vec), function(x) return(sum(x == unique(names(woe.obj))) == : missing value where TRUE/FALSE needed
总的来说,我了解 WoE 模型基于train.split
集合中的所有因素构建的过程。当我想将它应用到一个新集合时,这个集合中不允许有新的因子。通过将所有新因子设置为数据集中存在的因子“新”,train.split
我想解决该问题(参见步骤 5)。
尽管如此,它还是行不通。可能是因为我的新数据集中没有返回列吗?但据我了解,仅将已知的 WoE 模型应用于数据时,本专栏不应该是相关的。