オンライン小売業者の商品が返品されるかどうかを予測しようとしましたが、(予測したい) 不明なデータ セットをモデルのトレーニング データに適合するように変換できませんでした。より具体的には、トレーニング データの分割に基づいて証拠の重み (woe) を計算し、未知のデータの woe を置き換えたいときにエラーが発生します。しかし、これを段階的に見ていきましょう。
既知のデータセット (test と trainint に分割される) は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.values_ids <- woe(return ~ item_id+brand_id+user_id, data=train.split, zeroadj=0.05)
ステップ: ID がそれぞれの障害に置き換えられるように、トレーニング セットとテスト セットをトレーニングします。(predict 関数は
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 の準備から始めます。これにより、新しくて悲惨な計算に使用されていない ID が "New" 要素 (トレーニング データにも存在します) として配置されます。ここでのみのコード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 モデルをデータに適用するだけの場合、このコラムは関係ないはずです。