近傍法のためのスケーリング
CoddyのMachine Learningジャーニー「教師あり学習」セクションの一部。レッスン 9/58。
k-NN は距離を測るため、セクション2で注意したように、数値の大きい特徴量がほかの特徴量を圧倒します。ここでは、川までの距離(メートル)が標高を圧倒しています。
まずスケーリングします。学習用データの行だけでスケーラーを適合させ、その後、両方のデータセットを変換します。
scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)
model = KNeighborsClassifier()
model.fit(X_train_s, y_train)
print(model.score(X_test_s, y_test))これは0.925を出力し、0.6から上昇しています。テスト行は未確認のままです。スケーラーはそれらから何も学習しません。
チャレンジ
簡単スマートメーターは、meter.csvに記録された電力(ワット)と稼働時間(分)から、稼働中の家電を推測します。スターターコードはkを読み取り、未加工の特徴量に対するk-NNの正解率を出力します。
- 訓練データの行で
StandardScalerを学習させ、両方のデータセットを変換します。 - スケーリング済みの行を使い、同じkのk-NNモデルを学習させます。正解率を小数点以下3桁で出力します。
- 改善幅を出力します。
別の家庭でk = 5の場合:
Unscaled accuracy: 0.65
Scaled accuracy: 0.875
Scaling gains 0.225自分で試してみよう
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
# 家電の1回の稼働につき1行:消費電力(ワット)、稼働時間(分)、家電の種類
meter = pd.read_csv("meter.csv")
X = meter[["watts", "minutes"]]
y = meter["appliance"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
k = int(input())
# 元の特徴量を使ったk-NN
raw_model = KNeighborsClassifier(n_neighbors=k)
raw_model.fit(X_train, y_train)
raw = raw_model.score(X_test, y_test)
print(f"Unscaled accuracy: {round(raw, 3)}")
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師あり学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ