導入
「年収(数百万)」と「年齢(数十)」のように、桁が大きく違う特徴量をそのまま使うと、大きい数字だけが結果を支配してしまいます。これを防ぐのが標準化です。
説明
StandardScaler は、各特徴量を「平均0・ばらつき1」にそろえます。距離を使う k-means や k-NN では、この前処理がとても重要です。
import numpy as np
from sklearn.preprocessing import StandardScaler
# [年齢, 年収(万円)] ― スケールが大きく違う
X = np.array([
[25, 300],
[40, 600],
[35, 450],
[50, 800],
])
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print("元データの平均:", X.mean(axis=0))
print("標準化後の平均:", X_scaled.mean(axis=0).round(2)) # ほぼ [0, 0]
print("標準化後の標準偏差:", X_scaled.std(axis=0).round(2)) # ほぼ [1, 1]
print("--- 標準化後 ---")
print(X_scaled.round(2))
fit_transform で、標準化のルールを学びつつ変換を一度に行います。変換後はどの列も平均0・ばらつき1にそろうので、「年収の桁が大きいから」という理由だけで年収が重視される、という偏りがなくなります。年齢と年収を対等に扱えるようになりました。
距離ベースの手法(k-means, k-NN)を使う前は、標準化を習慣にしましょう。
やってみよう
X_scaled の各列の平均がほぼ0、標準偏差がほぼ1になっていることを確かめましょう。元の X に極端な行(例:[80, 2000])を足すと、標準化の結果がどう変わるかも見てください。
演習
上の X を StandardScaler で標準化し、標準化後のデータ X_scaled を表示してください。
ヒント1を見る
X_scaled = StandardScaler().fit_transform(X) を作って print(X_scaled)。