分散がほぼゼロの予測子を削除する
動画で見たとおり、次の一連の演習では blood-brain データセットを使います。これは生化学のデータセットで、以下の値を化合物ごとに予測する課題です。
log((concentration of compound in brain) /
(concentration of compound in blood))
この値は、化合物が血液脳関門を通過できる程度を定量的に表し、その関門の生物学的性質を理解するのに役立ちます。
このデータセットの興味深い点は、変数が非常に多く、その多くが極めて小さい分散しか持たないことです。つまり、ほとんどが単一の値(例: 0)で構成され、情報量がほとんどないということです。
幸い、caret には nearZeroVar() というユーティリティ関数があり、このような変数を除去してモデリングの時間を節約できます。
nearZeroVar() はデータ x を受け取り、最頻値と第2位の頻出値の比 freqCut、および全サンプル数に対する異なる値の割合 uniqueCut を確認します。デフォルトでは、caret はかなり保守的な freqCut = 19 と uniqueCut = 10 を使用します。私はもう少し積極的に、nearZeroVar() を呼び出すときに freqCut = 2 と uniqueCut = 20 を使うのが好みです。
この演習はコースの一部です
Rで学ぶ caret を使った Machine Learning
演習の手順
bloodbrain_x と bloodbrain_y はワークスペースに読み込まれています。
- blood-brain データセットに対して
nearZeroVar()を実行し、分散がほぼゼロの予測子を特定してください。結果をremove_colsというオブジェクトに保存します。nearZeroVar()の呼び出しではfreqCut = 2とuniqueCut = 20を使います。 names()を使って、bloodbrain_xのすべての列名を含むベクトルを作成し、all_colsと名付けてください。- 分散がほぼゼロの変数を除いた新しいデータフレーム
bloodbrain_x_smallを作成します。保持したい(つまり削除したくない)列名を抽出するためにsetdiff()を使ってください。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# Identify near zero variance predictors: remove_cols
remove_cols <- nearZeroVar(___, names = TRUE,
freqCut = ___, uniqueCut = ___)
# Get all column names from bloodbrain_x: all_cols
# Remove from data: bloodbrain_x_small
bloodbrain_x_small <- bloodbrain_x[ , setdiff(___, ___)]