1

我尝试做出预测 - 是否会退回来自在线零售商的商品 - 并且未能转换我的未知数据集(我想要预测)以使其适合我的模型的训练数据。更具体地说,我根据训练数据的拆分计算证据的权重 (woe),当我想替换未知数据中的 woe 时,我收到一个错误。但是让我一步一步来。

已知数据集(将被拆分为测试和训练)是daten. 相关的是 id 列brand_id,item_iduser_id二进制因变量“return”(1 = 将被返回,0 = 客户将不会返回项目)。所有“id”列都是因子并且具有> 200个级别。

下面先准备好原始数据。然后在准备未知数据并使用 WoE 之前训练 WoE 模型。

  1. 准备将每个仅出现一次的 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)
    
  2. 现在我分成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,]
    
  3. 现在我训练 woe 模型。

        woe.values_ids <- woe(return ~ item_id+brand_id+user_id, data=train.split, zeroadj=0.05)
    
  4. 步骤:训练训练集和测试集,以便 ID 将被相应的问题替换。(预测函数predict.woe来自 klaR 包)

        test.2 <-predict(woe.values_ids, newdata=test, replace=TRUE)
        train.2 <-predict(woe.values_ids, newdata=train, replace=TRUE)
    
  5. 现在我们跳到未知数据集,称为“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))
    
  6. 在最后一步中,我想根据(根据训练集的一部分训练)计算“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 模型应用于数据时,本专栏不应该是相关的。

4

1 回答 1

0

就像错误“需要 TRUE/FALSE 的缺失值”表示我的数据中有一些函数无法处理的 NA。

所以我在我所有的对象中搜索了 NA,最后在 user_id 中找到了一些。因此,我检查了 user_id 的填充情况并进行了一些小的更正,从而得到了正确的解决方案!

于 2018-02-03T10:00:09.967 回答