回帰または分類を行う場合、データを前処理する正しい(またはより良い)方法は何ですか?
- データの正規化->PCA->トレーニング
- PCA->PCA出力の正規化->トレーニング
- データの正規化->PCA->PCA出力の正規化->トレーニング
上記のどちらがより正しいですか、それともデータを前処理するための「標準化された」方法ですか?「正規化」とは、標準化、線形スケーリング、またはその他の手法のいずれかを意味します。
回帰または分類を行う場合、データを前処理する正しい(またはより良い)方法は何ですか?
上記のどちらがより正しいですか、それともデータを前処理するための「標準化された」方法ですか?「正規化」とは、標準化、線形スケーリング、またはその他の手法のいずれかを意味します。
PCAを実行する前に、データを正規化する必要があります。たとえば、次の状況を考えてみます。X
既知の相関行列を使用してデータセットを作成しますC
。
>> C = [1 0.5; 0.5 1];
>> A = chol(rho);
>> X = randn(100,2) * A;
ここでPCAを実行すると、主成分(重みベクトルの行)が座標軸に対してある角度で方向付けられていることが正しくわかります。
>> wts=pca(X)
wts =
0.6659 0.7461
-0.7461 0.6659
ここで、データセットの最初の機能を100でスケーリングすると、直感的に主成分は変更されるべきではないと思います。
>> Y = X;
>> Y(:,1) = 100 * Y(:,1);
ただし、主成分が座標軸と整列していることがわかります。
>> wts=pca(Y)
wts =
1.0000 0.0056
-0.0056 1.0000
これを解決するには、2つのオプションがあります。まず、データを再スケーリングできます。
>> Ynorm = bsxfun(@rdivide,Y,std(Y))
(奇妙なbsxfun
表記法は、Matlabでベクトル行列演算を行うために使用されます。私が行っているのは、平均を減算し、各機能の標準偏差で除算することだけです)。
これで、PCAから賢明な結果が得られます。
>> wts = pca(Ynorm)
wts =
-0.7125 -0.7016
0.7016 -0.7125
これらは、元のデータのPCAとは少し異なります。これは、機能に単位標準偏差があることが保証されているためです。これは、元々はそうではありませんでした。
もう1つのオプションは、外積ではなく、データの相関行列を使用してPCAを実行することです。
>> wts = pca(Y,'corr')
wts =
0.7071 0.7071
-0.7071 0.7071
実際、これは、平均を減算してから標準偏差で除算することによってデータを標準化することと完全に同等です。ただもっと便利です。私の意見では、そうしない正当な理由がない限り(たとえば、各機能のバリエーションの違いをピックアップしたい場合)、常にこれを行う必要があります。
常に最初にデータを正規化する必要があります。それ以外の場合、次元を削減するために使用される PCA またはその他の手法では、異なる結果が得られます。