4

モデルで最も重要でない変数を除外するのに苦労しています。4,000 を超える変数を含む一連のデータを受け取りましたが、モデルに入れる変数の数を減らすように依頼されました。

私はすでに2つのアプローチを試みましたが、2回失敗しました。

私が最初に試みたのは、モデリング後に変数の重要性を手動でチェックし、それに基づいて重要でない変数を削除することでした。

# reproducible example
data <- iris

# artificial class imbalancing
data <- iris %>% 
  mutate(Species = as.factor(ifelse(Species == "virginica", "1", "0"))) 

simple を使用している間、すべてが正常に機能しますLearner

# creating Task
task <- TaskClassif$new(id = "score", backend = data, target = "Species", positive = "1")

# creating Learner
lrn <- lrn("classif.xgboost") 

# setting scoring as prediction type 
lrn$predict_type = "prob"

lrn$train(task)
lrn$importance()

 Petal.Width Petal.Length 
  0.90606304   0.09393696 

問題は、データが非常に不均衡であるGraphLearnerことPipeOpですAutoTuner.

この場合、検索スペース、ターミネーター、チューナーなど、重要ではないと思われるコードの一部をスキップしました。

# undersampling
po_under <- po("classbalancing",
               id = "undersample", adjust = "major",
               reference = "major", shuffle = FALSE, ratio = 1 / 2)

# combine learner with pipeline graph
lrn_under <- GraphLearner$new(po_under %>>% lrn)

# setting the autoTuner
at <- AutoTuner$new(
  learner = lrn_under,
  resampling = resample,
  measure = measure,
  search_space = ps_under,
  terminator = terminator,
  tuner = tuner
)

at$train(task)

at正しく知られている問題は、重要なプロパティが利用できない内でまだ表示されているにもかかわらず$importance()です。

> at
<AutoTuner:undersample.classif.xgboost.tuned>
* Model: list
* Parameters: list()
* Packages: -
* Predict Type: prob
* Feature types: logical, integer, numeric, character, factor, ordered, POSIXct
* Properties: featureless, importance, missings, multiclass, oob_error, selected_features, twoclass, weights

そこで、アプローチを変更して、フィルタリングを に追加することにしましたLearner。そして、それは私がさらに失敗したところです。この mlr3book ブログ ( https://mlr3book.mlr-org.com/fs.html ) を調べることから始めました。ブログと同じように Learnerに追加しようとしimportance = "impurity"ましたが、id でエラーが発生しました。

> lrn <- lrn("classif.xgboost", importance = "impurity") 
Błąd w poleceniu 'instance[[nn]] <- dots[[i]]':
  nie można zmienić wartości zablokowanego połączenia dla 'importance'

これは基本的に次のようなことを意味します。

Error in 'instance[[nn]] <- dots[[i]]':  can't change value of blocked connection for 'importance'

フィルタリングで回避策も試みましたPipeOpが、惨めに失敗しました。なしではできないと思いますimportance = "impurity"

私の質問は、私が目指していることを達成する方法はありますか?

さらに、モデリングの前に重要度によるフィルタリングが可能である理由を説明していただければ幸いです。モデルの結果に基づくべきではありませんか?

4

1 に答える 1