RobustScaler で外れ値に強いスケーリング

Prep

RobustScaler で外れ値に強いスケーリング

作成日: 最終更新: 読了時間: 1 分

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 を重ねる必要は通常ありません。データ分布とモデル特性に合わせ、どのスケーリングが適切かを選択しましょう。