これに関連するいくつかの質問を見つけましたが、誰も私の疑問を解決しませんでした。特に、 this の質問に対する2つの答えは、私をさらに混乱させました。
一連の機能(画像から得られる畳み込みニューラルネット機能)の上に線形SVMをトレーニングしています。たとえば、3500x4096 X
マトリックスがあり、通常どおり、行の例と列の機能があります。
SVMにフィードする前に、このマトリックスを適切に標準化/正規化する方法を考えています。私は2つの方法を見ます(sklearnを使用):
機能の標準化。その結果、平均値と単一標準が0のフィーチャが生成されます。
X = sklearn.preprocessing.scale(X)
機能の正規化。その結果、単一の基準を持つ機能が得られます。
X = sklearn.preprocessing.normalize(X, axis=0)
私の結果は、標準化(68%の精度)よりも正規化(76%の精度)の方がかなり優れています。
それは完全にデータセットに依存する選択ですか?または、2つの手法からどのように選択できますか?
データの意味に基づいてスケーリングスキームを選択する必要があります。 スケーリングにはさまざまな方法があります 、どちらを使用するかはデータによって異なります。各スキームは、異なる機能の値を同等の範囲にもたらしますが、それぞれが異なるタイプの情報を保持します(そして他の情報を歪めます)。また、一部のスケーリングスキームが特定のケースに適している理由の背後には合理的な説明がありますが、これらの異なるスキームを試してみても問題はありません(標準のスケーリングと正規化で行ったように)。より適切に機能するものを使用する(相互検証するか、パフォーマンス測定が一般的で正確であることを確認する限り)。
StandardScaler
これはsklearn.preprocessing.scale(X)
が使用するものです。特徴が正規分布している(各特徴の平均と標準偏差が異なる)ことを前提とし、各特徴のガウス分布が0を中心とし、標準偏差が1になるようにスケーリングします。
これは、各機能の平均と標準偏差を計算し、機能の各実際の値を z-score に変換することによって行われます。この値は平均からいくつの標準偏差ですか? z =(値-平均)/ stdev
これは非常によく機能しますが、正規性の仮定が完全に間違っている場合は、これが最適なスケーリングスキームではない可能性があります。実際には、正規性の仮定が成り立たないが、分布がやや近い場合の多くの場合、このスキームは依然としてかなりうまく機能します。ただし、データが正規性から完全に離れている場合、たとえば、大きく歪んだファットテール分布(べき乗則など)の場合、このスキームでは良い結果が得られません。
ノーマライザー
これはsklearn.preprocessing.normalize(X, axis=0)
が使用するものです。特定のデータポイントのすべての特徴値をベクトルとして見て、そのベクトルをその大きさで割ることによって正規化します。たとえば、3つの機能があるとします。特定のポイントの値は_[x1, x2, x3]
_です。デフォルトの_'l2'
_正規化を使用している場合は、各値をsqrt(x1^2 + x2^2 + x3^2)
で除算します。 _'l1'
_正規化を使用している場合は、それぞれを_x1+x2+x3
_で除算します。これにより、各特徴ベクトルは単位ベクトルであるため、値が各特徴に対して同様の範囲にあることが保証されます。ポイントの特徴値が大きい場合、大きさも大きくなり、大きな数で除算します。それらが小さい場合は、小さい数で割ります。
その理由は、データをn次元空間内の点と考えることができるためです。ここでnは特徴の数です。各フィーチャーは軸です。正規化により、原点から1単位だけ離れた方法で、各ポイントが原点に引き戻されます。基本的に、スペースを単位立方体に折りたたむ。各ポイント(原点からデータポイントまで)のベクトル間の角度は同じままです。
これは、テキストデータでよく使用されます。これは、直感的に理解できるためです。各機能が異なる単語のカウントである場合、_'l1'
_正規化は、基本的にそれらのカウントを頻度に変換します(合計で除算します)。単語数)。意味あり。 _'l2'
_正規化を使用している場合、2つのベクトル間の角度(これはコサイン距離または類似性と呼ばれます)は、両方を正規化しても同じままであり、この距離はに近くなります。意味距離は、単語間の頻度の比率に対応し、各ベクトルが表すテキストの長さの影響を受けないためです。
ポイント間のコサイン距離タイプの関係を維持することがデータにとってより理にかなっている場合、または正規化が自然なスケーリング(カウントの代わりに頻度を取るなど)に対応する場合、これはより多くの適切です。
MinMaxScaler
これはsklearn.preprocessing.MinMaxScaler().fit_transform(X)
のように使用できます。各機能について、これは最小値と最大値を調べます。これがこの機能の範囲です。次に、これを各フィーチャの同じ範囲に縮小または拡大します(デフォルトは0から1です)。
これは、各値を_(value-feature_min)/(feature_max - feature_min)
_に変換することによって行われます。それは基本的に私が嘘をついている範囲の何パーセントですか?範囲は、機能の最小値と最大値によってのみ決定されることに注意してください。これらすべての注意事項について、すべての値が10、11程度にぶら下がっている可能性があり、900の外れ値が1つあります。関係ありません。範囲は10〜900です。場合によっては、それが望ましいことがわかります。特定の問題とデータによっては、これが問題になる場合もあります。
このスキームは、StandardScalerがうまく機能しない可能性がある特定の場合にはるかにうまく機能します。たとえば、機能の標準偏差が非常に小さい場合、StandardScalerは、異なる機能の標準偏差間の小さな変化に非常に敏感ですが、MinMaxScalerは非常に堅牢です。また、分布が大きく歪んでいる機能、または各機能にゼロが多く、分布をガウス分布から遠ざけるスパースケースの場合は、MinMaxScalerの方が適しています。