Shikata Ga Nai

Private? There is no such things.

14. データの前処理④ 〜数値スケーリングと正規化〜

Hello there, ('ω')ノ

📌 1. なぜスケーリングや正規化が必要なのか?

データの数値範囲が異なると、以下のような問題が発生します。

🔍 問題①: 数値の大きな特徴が支配的になる

ID 年収(万円) 身長(cm)
1 500 170
2 800 160
3 600 175

上記のようなデータでは、年収(500〜800万円)が身長(150〜180cm)よりも数値が大きいため、機械学習モデルが「年収」を重要視しすぎる可能性 があります。

対策: 特徴量のスケールを統一することで、すべての変数が平等に扱われるようにする。

🔍 問題②: 距離ベースのアルゴリズムに影響

K近傍法(KNN)やサポートベクターマシン(SVM)などの 「距離」に基づくアルゴリズム では、数値の大きさに依存しないようにスケーリングが必須です!


📌 2. 数値スケーリングの手法

数値データのスケールを揃える方法には、主に 「標準化(Standardization)」「正規化(Normalization)」 の2つがあります。

手法 計算方法 特徴 使うべきケース
標準化(Standardization) 平均0、標準偏差1に変換 外れ値に強い 線形回帰、SVM、ロジスティック回帰
正規化(Normalization) [0,1] の範囲に変換 比較がしやすい KNN、ニューラルネットワーク

適切な手法を選ぶことで、モデルの学習がスムーズになり、精度向上につながります! 🚀


📌 3. 標準化(Standardization)

標準化は、各特徴量を 平均0・標準偏差1 に変換する方法です。

✅ 計算式

[ X_{\text{scaled}} = \frac{X - \text{平均}(\mu)}{\text{標準偏差}(\sigma)} ]

✅ 実装(scikit-learnを使用)

import pandas as pd
from sklearn.preprocessing import StandardScaler

# データ準備
df = pd.DataFrame({"年収": [500, 800, 600], "身長": [170, 160, 175]})

# 標準化の適用
scaler = StandardScaler()
df_scaled = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)

print(df_scaled)

🔍 出力結果

          年収        身長
0 -1.069045  0.267261
1  1.336306 -1.336306
2 -0.267261  1.069045

メリット: データの分布を保ちつつスケールを統一できる
デメリット: 値の範囲が固定されない(-∞ 〜 +∞ の範囲になる)

線形回帰やSVMなど、正規分布に近いデータを扱うモデルで推奨!


📌 4. 正規化(Normalization)

正規化は、データを [0,1] の範囲 に変換する方法です。

✅ 計算式

[ X{\text{scaled}} = \frac{X - X{\text{min}}}{X{\text{max}} - X{\text{min}}} ]

✅ 実装(MinMaxScalerを使用)

from sklearn.preprocessing import MinMaxScaler

# 正規化の適用
scaler = MinMaxScaler()
df_normalized = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)

print(df_normalized)

🔍 出力結果

     年収  身長
0  0.00  0.67
1  1.00  0.00
2  0.33  1.00

メリット: すべての値が [0,1] の範囲 に収まり、学習が安定しやすい
デメリット: 外れ値に弱い(大きな値があると影響を受ける)

ニューラルネットワークやK近傍法(KNN)で推奨!


📌 5. ログ変換(Log Transformation)

外れ値の影響を減らすために 対数変換(Log Transform) を使うこともあります。

✅ 実装

import numpy as np

# 対数変換(+1 するのは 0 を防ぐため)
df["年収_log"] = np.log1p(df["年収"])

print(df)

メリット: 外れ値の影響を小さくできる
デメリット: 0以下のデータには適用できない(対策として log1p() を使用)

「収入」や「人口」など、桁の大きなデータに有効!


📌 6. 機械学習モデルごとの適切なスケーリング手法

どのモデルにどの手法を使うべきか?

モデル 推奨するスケーリング
線形回帰(Linear Regression) 標準化(Standardization)
ロジスティック回帰(Logistic Regression) 標準化(Standardization)
SVM(サポートベクターマシン) 標準化(Standardization)
KNN(K近傍法) 正規化(Normalization)
ニューラルネットワーク(NN) 正規化(Normalization)
決定木(Decision Tree) 不要(スケーリングなし)
ランダムフォレスト(Random Forest) 不要(スケーリングなし)

距離ベースのモデル(KNN、SVM)は「正規化」推奨!
線形モデル(回帰、SVM)は「標準化」推奨!


🎯 まとめ

データのスケールを統一すると、機械学習モデルが学習しやすくなる!
「標準化(Standardization)」は平均0・標準偏差1にする手法!
「正規化(Normalization)」は [0,1] に変換する手法!
モデルによって最適なスケーリング手法を選ぶことが重要!

Best regards, (^^ゞ