2016-09-28 12 views
-1

私は、米国のいくつかの市場で家庭の売上高に関して比較的大きなデータセットを持っています。各市場について、Gradient Boosting回帰モデルを構築して、セールスプライス。私の独立変数(機能)のほとんどは、caretgbmRのgbmの欠落データと層別k倍交差検証

R.

gbmアルゴリズムがハイパー( n.treesshrinkageinteraction.depthn.minobsinnode、など)の値を指定する必要がありますため問題ないはずの値が欠落しています。私はハイパーパラメータの最良のセットを選択するクロスバリデーションと一緒にグリッドサーチをしたい:

# -------- A function to drop variables that are more than 80% missing or have no variance 
Drop_Useless_Vars <- function(datan) { 
    n = nrow(datan) 
    p = ncol(datan) 
    na = is.na(datan) 
    n_na = apply(X = na, MARGIN = 2, FUN = sum) 
    n_unique = apply(X = datan, MARGIN = 2, function(x) length(na.omit((unique(x))))) 
    return(as.data.frame(datan[, -which(n_na > 0.8*n | n_unique < 2)])) 
} 

# -------- load libraries 
library(gbm) 
library(caret) 

# -------- prepare training scheme 
control = trainControl(method = "cv", number = 5) 

# -------- design the parameter tuning grid 
grid = expand.grid(n.trees = 10000, 
        interaction.depth = seq(2, 10, 1), 
        n.minobsinnode = c(3, 4, 5), 
        shrinkage = c(0.1, 0.01, 0.001)) 

# -------- tune the parameters 
tuner = train(log(saleprice) ~ ., data = Drop_Useless_Vars(df), method = "gbm", distribution = "gaussian", 
       trControl = control, verbose = FALSE, tuneGrid = grid, metric = "RMSE") 

# -------- get the best combo 
n_trees = tuner$bestTune$n.trees 
interaction_depth = tuner$bestTune$interaction.depth 
shrinkage = tuner$bestTune$shrinkage 
n_minobsinnode = tuner$bestTune$n.minobsinnode 

上記のコードは、欠損値がはるかに頻繁にいくつかの市場を除き、正常に動作します。私は以下のようにエラーを取得しています:

Error in checkForRemoteErrors(val) : 
    4 nodes produced errors; first error: variable 26: assessor_full_baths has only missing values. 

assessor_full_bathsは私のモデルの機能の一つです。そこで起こっていることは、アルゴリズムがクロスバリデーションを行うためにデータをサンプリングしているときに、1つ以上のフォールドが完全に欠落している変数を持つことです。

caretで使用されているサンプリング方式を階層化するにはどうすればよいですか?つまり、どのようにして、各折り目を欠損値に関して同じ分布にすることができますか?また、皆さんは、gbm関数で、どの変数を指定しなくても完全に欠けている変数を無視する方法を知っていますか?

ご提供いただけるご支援に感謝いたします。

+0

なぜハイパーパラメータは「いわゆる」ですか?どのようにして、アルゴリズムは、クロスバリデーションの1倍だけで欠損値をすべて含むフィーチャを除外できますか? –

+0

私の昔の教授の一人は、ベイジアン設定のハイパーパラメータについて話すとき、頻繁に「いわゆる」と言っていました。私はそれが私の頭に詰まっていると思います。また、私は、これらのパラメータを正則化パラメータと呼んでいる論文を読んで、それは私にとって意味があります。 –

答えて

0

私はあなたが一歩踏み出して、データを適切に処理してモデルを適合させる方法について考える必要があると思います。

最終的なモデリングデータセットに欠損値が含まれないようにしてください。にはCVフォールドの100%が欠けている欠けている値がたくさんあります。(!)

代わりに、データクリーニングと機能工学のビット操作を行います。

  • を、あなたは、変数
  • 因子と因子レベルとしてNAを追加することができます場合は、他のほとんどの状況で
  • で欠損値を転嫁することができます機能に欠けがある場合は、除外する必要があるかもしれません。または、除外する必要があるかもしれません。または、それが無くなっていないという事実から学ぶことができる情報がたくさんある場合は、
  • オリジナルかどうかを示す変数機能が不足していたり​​、特定のレベルの関心が含まれていたりしています。

欠落しているデータを補完したくない場合は、前述の他の方法を使用する必要があります。欠落しているノードは、NAレベルのエンコーディングと同じではありません。欠落しているノードは、データが欠落していた分割前と同じ予測をツリーが与えることを意味します(R gbm handling of missing values参照)。欠落の多いフィーチャにはモデルを作成しないでください。欠損値のあるデータに対してモデルを作成することは、まったく適切ではありません。これらのデータは、データセットを準備するときに消去する必要があります。

あなたはまだMNARデータを置き換えることができます。 70年代のヘックマンとルービンの作品には、多くの戦略があります。多くの人々は、mice()描画方法を使用しています。

これが役立つことがあります。http://stefvanbuuren.nl/mi/docs/mnar.pdf

+0

欠落値がランダムであるという証拠がないので、欠損値を代入したくありません。また、私の最終的な目的は、これらのモデルを使用して大規模なデータセット(30GB以上)の価格を予測することです。データセットの大部分を(少なくとも今のところは)帰属させるつもりはありません。最後に、gbmオブジェクト内の個々のツリー内の各分割は、左ノード、右ノード、および欠落ノードの3つのノードになります。つまり、欠損値を別のカテゴリとして扱います。これはあなたが提案していることを達成していないのですか?ありがとう –

+0

欠落しているデータを補うことを望まない場合は、上記の他の戦略を使用する必要があります。欠落しているノードは、NAレベルのエンコーディングと同じではありません。欠落しているノードは、データが欠落していた分割前と同じ予測をツリーが与えることを意味します(http://stackoverflow.com/questions/14718648/r-gbm-handling-of-missing-valuesを参照)。欠落の多いフィーチャにはモデルを作成しないでください。欠損値のあるデータに対してモデルを作成することは、まったく適切ではありません。これらのデータは、データセットを準備するときに消去する必要があります。 –

+0

これは、あなたはまだMNARデータを置き換えることができます。 70年代のヘックマンとルービンの作品には、多くの戦略があります。多くの人が「マウス」と描かれた指標方法を使用しています。これは助けになるかもしれません:http://www.stefvanbuuren.nl/mi/docs/mnar.pdf –

0

をあなた自身を折るCVを作成するためにcaret::createFoldsを使用することができます。結果と異なる変数y(つまり、saleprice)を入力するだけです。層別変数に基づいて新しい変数を定義する必要があります... ?interactionを参照してください。これは、その後、例えばcaret::trainControl

に渡すことができます。

library(caret) 
y2 <- interaction(df$x1, df$x2) 
cv_folds <- createFolds(y2, k= 5) 
control = trainControl(index= cv_folds, method= "cv", number= 5) 
... 

それともcaretの使用を避けると書くことができ、独自のハック-Rは約言っ@私はほとんどすべてに同意する、と述べた

stratified sampling code価値の欠如と帰属を伴う機能の実用化。