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を呼び出すだけで元のスケールに戻せます。