回帰または分類を行う場合、データを前処理する正しい(またはより良い)方法は何ですか?
上記のどちらがより正しいですか、それともデータを前処理するための「標準化された」方法ですか? 「正規化」とは、標準化、線形スケーリング、またはその他の手法のいずれかを意味します。
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またはその他の手法で異なる結果が得られます。
最初にデータを正規化します。実際、PCA分析を実行するのに役立ついくつかのRパッケージは、PCAを実行する前にデータを自動的に正規化します。変数の単位が異なる場合、または特性が異なる場合は、正規化する必要があります。