MinMaxScaler で区間正規化する

Prep

MinMaxScaler で区間正規化する

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

MinMaxScaler は特徴量の最小値と最大値を使い、値を任意の区間 \([a, b]\) に線形変換します。距離を意味づける前処理や、画像ピクセルを 0〜1 に正規化する用途でよく使われます。

定義 #

特徴量 (x) に対して、最小値 (x_{\min})、最大値 (x_{\max}) を用いた変換は

$$ x’ = \frac{x - x_{\min}}{x_{\max} - x_{\min}} (b - a) + a $$

です。既定値は (a = 0, b = 1) ですが、([-1, 1]) や ([0, 255]) への写像も可能です。

実装例 #

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler

rng = np.random.default_rng(7)
data = rng.normal(loc=[20, 100], scale=[5, 30], size=(500, 2))

scaler = MinMaxScaler(feature_range=(-1, 1))
scaled = scaler.fit_transform(data)

fig, axes = plt.subplots(1, 2, figsize=(10, 4))
axes[0].hist(data[:, 0], bins=30, alpha=0.8, label="特徴量1")
axes[0].hist(data[:, 1], bins=30, alpha=0.6, label="特徴量2")
axes[0].set_title("変換前")
axes[0].legend()

axes[1].hist(scaled[:, 0], bins=30, alpha=0.8, label="特徴量1 (scaled)")
axes[1].hist(scaled[:, 1], bins=30, alpha=0.6, label="特徴量2 (scaled)")
axes[1].set_title("MinMaxScaler 適用後 [-1, 1]")
axes[1].legend()

plt.tight_layout()
plt.show()

実装例の図

実務でのポイント #

  • 学習データから得られる scaler.data_min_scaler.data_max_ を保存し、本番でも同じ scaler を用いて transform します。
  • 新しいデータで範囲外の値が出る場合は clip=True を指定し、出力を [a, b] 内に収めるのが安全です。
  • 外れ値が多い特徴量では範囲が極端に広がるため、MinMaxScaler より RobustScaler などを検討してください。
  • 逆変換は scaler.inverse_transform を呼び出すだけで元のスケールに戻せます。