StandardScaler
CoddyのMachine Learningジャーニー「機械学習のための統計」セクションの一部。レッスン 50/64。
モデルは、新しいサンプルをすべて、学習データをスケーリングしたときとまったく同じ方法でスケーリングする必要があります。scikit-learn の StandardScaler は標準化を行い、その方法を記憶します。
コードでは、各作業について、清掃した窓の数と所要時間(分)を扱います:
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回の呼び出しで両方を行います。
チャレンジ
中級アボカドの仕分け機は、X_trainにあるアボカドから、重さ、硬さ、収穫からの日数を学習しました。プログラムは新しいアボカドを1行の表new_avocadoに読み込みますが、スターターコードのスケーリングでは、どのアボカドについても[[0. 0. 0.]]と表示されます。
- 修正しましょう。学習データの平均と標準偏差を使って、新しいアボカドをスケーリングします。
- 測定値のうち、学習データの平均からどちらの方向にも標準偏差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))
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
機械学習のための統計のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ