StandardScaler は各特徴量から平均を引き、標準偏差で割ることで平均 0・分散 1 のスケールに揃えます。距離や内積を利用する SVM、k-NN、ロジスティック回帰などでよく用いられる基本的な前処理です。
定義 #
特徴量 (x) を平均 (\mu)、標準偏差 (\sigma) で正規化すると
$$ z = \frac{x - \mu}{\sigma} $$
となります。with_mean=False で中心化のみ、with_std=False でスケーリングのみを選択できます。
実装例 #
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
rng = np.random.default_rng(21)
data = rng.normal(loc=[170, 65], scale=[8, 12], size=(500, 2))
scaler = StandardScaler()
scaled = scaler.fit_transform(data)
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
axes[0].scatter(data[:, 0], data[:, 1], alpha=0.4, color="royalblue", edgecolor="none")
axes[0].set_title("変換前")
axes[0].set_xlabel("身長 (cm)")
axes[0].set_ylabel("体重 (kg)")
axes[1].scatter(scaled[:, 0], scaled[:, 1], alpha=0.4, color="seagreen", edgecolor="none")
axes[1].set_title("StandardScaler 適用後")
axes[1].set_xlabel("身長 (z スコア)")
axes[1].set_ylabel("体重 (z スコア)")
axes[1].set_xlim(-3, 3)
axes[1].set_ylim(-3, 3)
plt.tight_layout()
plt.show()

実務でのポイント #
scaler.mean_とscaler.scale_を保存し、推論時も同じ scaler インスタンスでtransformすることで情報漏洩を防ぎます。- 元のスケールに戻したいときは
scaler.inverse_transformを利用します。 - 疎行列を扱う場合は
with_mean=Falseを指定し、計算コストとスパース性を維持するのが無難です。 - 外れ値が多い場合は先にロバストなスケーリングを行ってから StandardScaler を適用すると安定します。