始める無料で始める

分散がほぼゼロの予測子を削除する

動画で見たとおり、次の一連の演習では blood-brain データセットを使います。これは生化学のデータセットで、以下の値を化合物ごとに予測する課題です。

log((concentration of compound in brain) /
      (concentration of compound in blood))

この値は、化合物が血液脳関門を通過できる程度を定量的に表し、その関門の生物学的性質を理解するのに役立ちます。

このデータセットの興味深い点は、変数が非常に多く、その多くが極めて小さい分散しか持たないことです。つまり、ほとんどが単一の値(例: 0)で構成され、情報量がほとんどないということです。

幸い、caret には nearZeroVar() というユーティリティ関数があり、このような変数を除去してモデリングの時間を節約できます。

nearZeroVar() はデータ x を受け取り、最頻値と第2位の頻出値の比 freqCut、および全サンプル数に対する異なる値の割合 uniqueCut を確認します。デフォルトでは、caret はかなり保守的な freqCut = 19uniqueCut = 10 を使用します。私はもう少し積極的に、nearZeroVar() を呼び出すときに freqCut = 2uniqueCut = 20 を使うのが好みです。

この演習はコースの一部です

Rで学ぶ caret を使った Machine Learning

コースを見る

演習の手順

bloodbrain_xbloodbrain_y はワークスペースに読み込まれています。

  • blood-brain データセットに対して nearZeroVar() を実行し、分散がほぼゼロの予測子を特定してください。結果を remove_cols というオブジェクトに保存します。nearZeroVar() の呼び出しでは freqCut = 2uniqueCut = 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(___, ___)]
コードを編集して実行