Pythonで特徴量スケーリングを適用する方法とタイミングを徹底解説
特徴量スケーリング(フィーチャースケーリング)は、データ前処理の重要なステップの一つで、データの独立変数や特徴量に対して適用されます。データを特定の範囲内に正規化する役割を担います。
なぜスケーリングが必要なのか?
多くの場合、データセットには大きさ・単位・範囲が大きく異なる特徴量が含まれています。しかし、多くの機械学習アルゴリズムは計算過程で2つのデータポイント間のユークリッド距離を使用するため、これが問題となります。
スケーリングを行わないまま放置すると、アルゴリズムは単位を無視して特徴量の大きさのみを考慮します。その結果、「5kg」と「5000g」のように単位が異なるだけで結果が大きく変わってしまう可能性があります。
また、大きさの大きな特徴量は、距離計算において小さな特徴量よりもはるかに大きな重みを持つことになります。
この影響を抑えるには、すべての特徴量を同じレベルの大きさに揃える必要があります。それを実現するのがスケーリングです。
特徴量スケーリングの主な手法
標準化(Standardisation)
値をZスコアに置き換える手法です。
$$x^{\prime}=\frac{x\:-\:\bar{x}}{\sigma}$$この変換により、各特徴量は平均μ=0、標準偏差σ=1の分布に再配置されます。Pythonでは
sklearn.preprocessing.scaleを使って標準化を簡単に実装できます。平均正規化(Mean Normalisation)
$$x^{\prime}=\frac{x\:-\:mean(x)}{max(x)\:-\:min(x)}$$この分布は-1から1の間の値を持ち、平均はμ=0になります。標準化と平均正規化は、主成分分析(PCA)のようなゼロ中心のデータを前提とするアルゴリズムに適しています。
Min-Maxスケーリング
$$x^{\prime}=\frac{x\:-\:min(x)}{max(x)\:-\:min(x)}$$このスケーリングにより、値は0から1の間に収まります。
単位ベクトル(Unit Vector)
$$x^{\prime}=\frac{x}{\lVert\:x\:\rVert}$$特徴量ベクトル全体を長さ1とみなしてスケーリングを行います。Min-Maxスケーリングと単位ベクトルの手法は[0,1]の範囲の値を生成するため、明確な上下限(ハードバウンダリ)を持つ特徴量を扱う際に非常に有用です。例えば、画像データの場合、色の値は0〜255の範囲に限定されます。
いつスケーリングを適用すべきか?
経験則として、距離を計算するアルゴリズム、または正規性を仮定するアルゴリズムでは、特徴量をスケーリングするとよいでしょう。
以下に、特徴量スケーリングが特に重要となるアルゴリズムの例を挙げます。
k近傍法(k-NN):ユークリッド距離測度を使用するk近傍法は特徴量の大きさに敏感です。すべての特徴量が等しく重みを持てるよう、スケーリングが必要です。
主成分分析(PCA):PCAの実行時にはスケーリングが不可欠です。PCAは最大分散を持つ特徴量を抽出しようとしますが、大きさの大きな特徴量ほど分散も高くなります。そのままではPCAの結果が大きさの大きな特徴量に偏ってしまいます。
勾配降下法:スケーリングによって学習を高速化できます。パラメータθは小さい範囲では素早く、大きい範囲ではゆっくりと下降するため、変数のスケールが大きく不均一な場合、最適値へ向かう過程で非効率な振動が発生してしまうからです。
決定木系モデル:決定木ベースのモデルは距離ベースではないため、さまざまな範囲の特徴量をそのまま扱えます。したがって、決定木のモデリング時にスケーリングは不要です。
線形判別分析(LDA)・ナイーブベイズ:これらのアルゴリズムは設計上、特徴量のスケールの違いに対応できるようになっており、各特徴量に適切な重みを与えます。そのため、スケーリングを行っても大きな効果は期待できません。
-
Windows 10 April 2018 Update(バージョン1803)の注目新機能と使い方まとめ
Microsoftは、便利な新機能が満載のWindows 10 April 2018 Update(バージョン1803)をリリースしました。リリースされたばかりのため、予期しない問題がないかどうかはまだ様子見が必要ですが、日常的に役立つ機能が数多く含まれています。 長らく他のブラウザに遅れを取っていたMicrosoft Edgeにも待望の機能が搭載され、従来の「おやすみ時間(Quiet Hours)」機能にも変更が加えられました。本記事では、このアップデートの主要な新機能とそれぞれの使い方を詳しく解説します。 タイムライン(Timeline)で過去の作業履歴をすばやく確認 「タイムライン」は
-
【Python入門】eval()関数で文字列を評価してオブジェクトを取得する方法
Pythonには、文字列を引数として受け取り、それをPythonの式として評価する組み込み関数 eval() が用意されています。インタプリタは渡された文字列を有効なPython式として解析し、正しければ評価を実行した結果のオブジェクトを返します。eval()関数の基本的な使い方eval() の構文は以下のとおりです。eval(expression[, globals[, locals]])第一引数には評価対象の文字列を指定します。省略可能な第二・第三引数では、評価時に使用するグローバルおよびローカルの名前空間(辞書)を指定できます。算術式を含む文字列の評価最もシンプルな例が、算術式を含む文字