本文へスキップ
BecomeCoder

Python AIコース · 第5章 クラスタリング ― 正解なしでまとめる · レッスン16

特徴量の標準化 ― StandardScaler

ブラウザで完結

導入

「年収(数百万)」と「年齢(数十)」のように、桁が大きく違う特徴量をそのまま使うと、大きい数字だけが結果を支配してしまいます。これを防ぐのが標準化です。

説明

StandardScaler は、各特徴量を「平均0・ばらつき1」にそろえます。距離を使う k-means や k-NN では、この前処理がとても重要です。

import numpy as np
from sklearn.preprocessing import StandardScaler

# [年齢, 年収(万円)] ― スケールが大きく違う
X = np.array([
    [25, 300],
    [40, 600],
    [35, 450],
    [50, 800],
])

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

print("元データの平均:", X.mean(axis=0))
print("標準化後の平均:", X_scaled.mean(axis=0).round(2))   # ほぼ [0, 0]
print("標準化後の標準偏差:", X_scaled.std(axis=0).round(2)) # ほぼ [1, 1]
print("--- 標準化後 ---")
print(X_scaled.round(2))

fit_transform で、標準化のルールを学びつつ変換を一度に行います。変換後はどの列も平均0・ばらつき1にそろうので、「年収の桁が大きいから」という理由だけで年収が重視される、という偏りがなくなります。年齢と年収を対等に扱えるようになりました。

距離ベースの手法(k-means, k-NN)を使う前は、標準化を習慣にしましょう。

やってみよう

X_scaled の各列の平均がほぼ0、標準偏差がほぼ1になっていることを確かめましょう。元の X に極端な行(例:[80, 2000])を足すと、標準化の結果がどう変わるかも見てください。

演習

上の XStandardScaler で標準化し、標準化後のデータ X_scaled を表示してください。

ヒント1を見る

X_scaled = StandardScaler().fit_transform(X) を作って print(X_scaled)

実際に動かしてみよう

下のエディタにPythonを書いて「実行」を押すと、scikit-learn で本物の機械学習モデルをその場で訓練できます。scikit-learn を使う回は初回の読み込みに時間がかかります(数十秒かかることがあります)。本文の例をそのまま試したり、数値を書き換えたりして、結果の変化を確かめましょう(グラフ内の文字は英字で書きます)。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。