Menu
CoddyTech

StandardScaler

CoddyのMachine Learningジャーニー「機械学習のための統計」セクションの一部。レッスン 50/64。

モデルは、新しいサンプルをすべて、学習データをスケーリングしたときとまったく同じ方法でスケーリングする必要があります。scikit-learn の StandardScaler は標準化を行い、その方法を記憶します。

図:窓拭き作業員の過去4件の仕事 X_train が fit を通り、mean_ 8 と 22、scale_ 4.47 と 9.72 を記憶するスケーラーに入ります。新しい仕事 8 と 30 は transform を通り、それらの数値を使って 0.00 と 0.82 になります

コードでは、各作業について、清掃した窓の数と所要時間(分)を扱います:

from sklearn.preprocessing import StandardScaler

X_train = np.array([[2, 8], [10, 25], [6, 20], [14, 35]])
scaler = StandardScaler()
scaler.fit(X_train)
X_new = np.array([[8, 30]])  # サンプル1件:1行の表
print(np.round(scaler.transform(X_new), 2))

これは次のように出力されます:

[[0.   0.82]]

fitは各列の平均と標準偏差(np.stdのようにnで割る)を学習し、scaler.mean_とscaler.scale_に保持します。transformはそれらを適用します。

新しいデータに対しては決してfitしないでください。そうすると、そのデータ自身が平均となり、[[0. 0.]]になってしまいます。訓練データでは、fit_transformが1回の呼び出しで両方を行います。

challenge icon

チャレンジ

中級

アボカドの仕分け機は、X_trainにあるアボカドから、重さ、硬さ、収穫からの日数を学習しました。プログラムは新しいアボカドを1行の表new_avocadoに読み込みますが、スターターコードのスケーリングでは、どのアボカドについても[[0. 0. 0.]]と表示されます。

  1. 修正しましょう。学習データの平均と標準偏差を使って、新しいアボカドをスケーリングします。
  2. 測定値のうち、学習データの平均からどちらの方向にも標準偏差2を超えて離れているものの数を数え、以下のように表示します。

別のバッチの場合:

New avocado: [[2.98 0.   0.09]]
1 of 3 measurements are more than 2 std from the training avocados

自分で試してみよう

import numpy as np
from sklearn.preprocessing import StandardScaler

# 学習用のアボカド。各行に1個分のデータ:グラム単位の重さ、1から10までの硬さ、収穫からの日数
X_train = np.array([[210, 8, 2],
                    [185, 5, 6],
                    [240, 7, 3],
                    [170, 3, 9],
                    [225, 6, 5],
                    [195, 4, 7]])
# ベルトコンベア上の新しいアボカド
weight = float(input())
firmness = float(input())
days = float(input())
new_avocado = np.array([[weight, firmness, days]])

# これではどのアボカドについても [[0. 0. 0.]] と表示されるので、修正してください
scaler = StandardScaler()
scaled = scaler.fit_transform(new_avocado)
print("New avocado:", np.round(scaled, 2))

# 以下にコードを書いてください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

機械学習のための統計のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ