RobustScaler はメディアン(第 50 パーセンタイル)と四分位範囲 \(IQR = Q_3 - Q_1\) を用いてスケーリングします。極端な外れ値が存在してもスケールが大きく歪まない点が特徴です。
定義 #
観測値 (x)、メディアン (m = \operatorname{median}(x))、IQR に対し、
$$ z = \frac{x - m}{\operatorname{IQR}} $$
と変換します。quantile_range=(q_1, q_3) を変更すると IQR の定義域を調整できます。
実装例 #
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import RobustScaler
rng = np.random.default_rng(5)
clean = rng.normal(loc=50, scale=5, size=400)
outliers = np.array([120, 150, 8, 4, 160])
data = np.concatenate([clean, outliers])
scaler = RobustScaler(quantile_range=(25, 75))
scaled = scaler.fit_transform(data.reshape(-1, 1)).ravel()
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
axes[0].boxplot(data, vert=False, showfliers=True)
axes[0].set_title("変換前(外れ値あり)")
axes[0].set_xlabel("値")
axes[1].boxplot(scaled, vert=False, showfliers=True)
axes[1].set_title("RobustScaler 適用後")
axes[1].set_xlabel("スケーリング後の値")
plt.tight_layout()
plt.show()

実務でのポイント #
quantile_rangeを狭めると外れ値の影響をさらに抑えられますが、極端に狭い範囲では情報が失われやすいので注意してください。with_centering=Falseを指定すると中心化せずにスケーリングのみ行えます。疎行列でメディアンを引くとスパース性が失われるケースで有効です。- 学習データで
fitした scaler を推論時にtransformするのが基本です。デプロイ時には学習済み scaler を必ず一緒に保存します。 - RobustScaler の後にさらに StandardScaler を重ねる必要は通常ありません。データ分布とモデル特性に合わせ、どのスケーリングが適切かを選択しましょう。