RのキャレットパッケージでのPCAおよびk分割交差検証


16

Courseraの機械学習コースの講義を再視聴しました。教授が教師あり学習アプリケーションでデータを前処理するためのPCAについて説明しているセクションでは、PCAはトレーニングデータに対してのみ実行し、マッピングを使用して相互検証とテストセットを変換します。PCAおよびtrain / test splitも参照してください。

ただし、caretRパッケージでは、train()関数に渡すトレーニングデータは既にPCAによって処理されています。そうする際、アルゴリズムが実行クロスバリデーションをK倍クロスバリデーションセットが既に介してPCAを用いて処理されているpreProcess()predict()「フィッティング」と実際にPCAに使用されます。

状況に対する私の理解は正しいですか?つまり、データの前処理がトレーニングセットと同様にクロス検証セットで実行されるため、PCA(または実際には、任意の再スケーリング/センタリング方法)でのクロス検証のキャレットの手順は「間違っています」か?もしそうなら、これは結果にどれほど大きな影響を与えるでしょうか?


1
興味深い質問。Ng教授は、「PCAはトレーニングデータに対してのみ実行する必要があり、マッピングを使用して相互検証とテストセットを変換する」理由を説明しますか?私の直感では、train / cv / testデータは同じ分布からのものであると想定されており、PCAは出力/従属変数を含まないため、影響は最小限でなければなりません。
ミウラ

1
@miuraはい、そうです。PCAを実行する場合、目的の「保持された分散」を達成するために必要な出力ベクトルの最小数k次元を解く必要があります。このパラメータkは、(私の理解では)当てはまる必要のあるアルゴリズムの追加パラメータとして有効になっています。交差検定セットでもPCAを実行すると、CVセットでアルゴリズムの一部を実際にトレーニングするため、交差検定の値が減少します。
mchangun

PCAとMDSを混同していると思いますが、どちらの方法でも、望ましい分散を設定していません。ただし、k次元に縮小するための調整から計算できます。最初の次元は常に2番目の次元よりも多くの分散を削減し、2番目の次元は3番目の分散よりも多く削減されるため、適合させる必要はありません...
llrs

回答:


18

私は講義を見なかったので、言われたことにコメントすることはできません。

私の0.02ドル:リサンプリングを使用してパフォーマンスの適切な推定値を取得する場合は、事前にではなく、リサンプリング中にすべての操作を実際に実行する必要があります。これは、機能選択[1]およびPCAなどの重要な操作にも当てはまります。結果に不確実性が加わる場合は、リサンプリングに含めてください。

主成分回帰について考えてみてください:PCAに続いて、いくつかの成分の線形回帰。PCAはパラメーター(ノイズあり)を推定し、コンポーネントの数も選択する必要があります(異なる値は異なる結果になります=>より多くのノイズ)。

スキーム1で10倍のCVを使用したとします:

conduct PCA
pick the number of components
for each fold:
   split data
   fit linear regression on the 90% used for training
   predict the 10% held out
end:

またはスキーム2:

for each fold:
   split data
   conduct PCA on the 90% used for training
   pick the number of components
   fit linear regression
   predict the 10% held out
end:

2番目のアプローチでは、PCA、コンポーネント数の選択、および線形回帰に起因する不確実性を反映したエラー推定値を生成する必要があることは明らかです。実際には、最初のスキームのCVには、その前に何があるのか​​分かりません。

私は常にすべての操作をリサンプリングなしで行うわけではありませんが、パフォーマンスの見積もりをあまり気にしないときだけです(これは珍しいことです)。

2つのスキームに大きな違いはありますか?データと前処理に依存します。センタリングとスケーリングのみを行う場合は、おそらくそうではありません。大量のデータがある場合は、おそらくそうではありません。トレーニングセットのサイズが小さくなると、特にnがpに近い場合、不適切な推定値を取得するリスクが高くなります。

私は経験から確実に、リサンプリングに監視対象機能の選択を含めないことは本当に悪い考えだと言うことができます(大きなトレーニングセットがない場合)。なぜ前処理がこれに影響されないのかわかりません(ある程度)。

@mchangun:コンポーネントの数は調整パラメーターであり、おそらく一般化可能なパフォーマンス推定値を使用して選択する必要があると思います。分散の少なくともX%が説明されるようにKを自動的に選択し、そのプロセスをリサンプリングに含めて、そのプロセスのノイズを考慮することができます。

マックス

[1] Ambroise、C.&McLachlan、G.(2002)。マイクロアレイ遺伝子発現データに基づく遺伝子抽出の選択バイアス。国立科学アカデミー論文集、99(10)、5622-6566。


21

train関数を実行する前にデータを前処理しないでください!関数trainにpreProcess 引数を使用すると、前処理が各再サンプリングの反復に適用されます。

たとえば、これを しないでください:

library(caret)
dat <- iris
pp <- preProcess(dat[,-5], method="pca")
dat[,-5] <- predict(pp, dat[,-5])
knnFit1 <- train(Species~., dat, method = "knn", preProcess=c("pca"), 
    trControl = trainControl(method = "cv"))

これを行う!

dat <- iris
knnFit2 <- train(Species~., dat, method = "knn", preProcess=c("pca"), 
    trControl = trainControl(method = "cv"))

1
提案どおりにprProcessを実行する場合、予測にモデルを使用するときに新しいデータを前処理する必要がありますか?現時点では、私はします: pred <- predict(knnFit2, newdata) どこにnewdataスケーリングされていません。Caretはnewdata、予測に使用する前にpreProcess する必要があることを十分に理解していますか?
mchangun

7
@mchangunいいえ キャレットは前処理パラメーターを保存し、predict.caret呼び出しの新しいデータを前処理します。それはかなり滑らかです!
ザック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.