スケーリングが甘すぎる自戒も込めてメモします。
特徴スケーリングの概要
特徴スケーリングとは乗算と加算を使用して特徴量の変数を変更する操作のことです。難しく書きましたが、要はデータを綺麗にすることです。
これをやる目的はシンプルで、精度向上と計算効率のためです。多くのモデルは、モデルをフィッティングする際に変数の大きさを考慮するため、異なるスケールの変数を持つことは、(一部の変数の優先度が高いため)不利になる可能性があります。計算効率が上がる理由については勉強中なのでしばしお待ちください。
スケーリングの主要な方法2選
さてスケーリングですが、よく使われるのが「標準化」と「正規化」です。
標準化はデータの平均を0、標準偏差を1に変換する手法です。これにより、異なるスケールのデータを比較可能にします。標準化は以下の手順で行います:
1. **平均値を引く**: 各データポイントからデータセット全体の平均値を引きます。
2. **標準偏差で割る**: その結果をデータセットの標準偏差で割ります。
この処理により、データは平均0、標準偏差1の「Zスコア」に変換されます。標準化は、特にデータの分布が正規分布に近い場合や、外れ値の影響を受けにくくしたい場合に有効です。
正規化は、データを特定の範囲にスケーリングする手法で、一般的には最小値を0、最大値を1に変換します。Min-Maxスケーリングとも呼ばれ、以下の手順で行います:
1. **最小値を引く**: 各データポイントからデータセットの最小値を引きます。
2. **範囲で割る**: その結果をデータセットの範囲(最大値-最小値)で割ります。
この方法は、データのスケールが異なる場合や、特定の範囲にデータを収めたい場合に有効です。画像処理など、計算負荷を下げる目的でも使用されます。
選ぶ際の判断基準
どちらも割とメジャーな方法なので基本どちらでも良いとは思いますが、そう言われると悩むもの。そこで判定として正規分布に近いかどうかで判断します。
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.preprocessing import StandardScaler, MinMaxScaler df = clens_train.copy() columns = ['Age', 'City', 'などお好きなカラムをどうぞ'] # 分布をプロット for column in columns: plt.figure(figsize=(10, 6)) sns.histplot(df[column], kde=True, bins=30) plt.title(f'Distribution of {column}') plt.show() # 正規分布に近いかどうかで判断 if df[column].skew() > 1 or df[column].kurt() > 3: print(f"{column}: Apply Min-Max Normalization (正規化)") else: print(f"{column}: Apply Standardization (標準化)")