Menu
CoddyTech

kの選び方

CoddyのMachine Learningジャーニー「教師あり学習」セクションの一部。レッスン 7/58。

チリに適しているのはどの k でしょうか?いくつか試して、各モデルを2回評価しましょう。学習した行での訓練精度と、未知の行でのテスト精度です。

チリの k ごとの精度を示す2本の線。訓練精度は k = 1 で1.0から始まり、低下する。テスト精度は0.8から始まり、k = 13で0.92に達し、その後 k が80を超えると両方の線が約0.7まで低下する

k = 1 の場合、各チリはそれ自体が最近傍となるため、モデルはデータを記憶します。学習データでは完璧ですが、新しいデータでは性能が低下します。k が非常に大きいと、グループの境界がぼやけます。

ks = range(1, 120, 6)
train_acc = []
test_acc = []
for k in ks:
    model = KNeighborsClassifier(n_neighbors=k)
    model.fit(X_train, y_train)
    train_acc.append(model.score(X_train, y_train))
    test_acc.append(model.score(X_test, y_test))

ひとまず、テスト精度が最も高くなる k を選びましょう。第7章では、より公平な評価方法を紹介します。

challenge icon

チャレンジ

簡単

あるサッカークラブは、シュートの距離、角度、goal または miss を shots.csv に記録しています。どの k が最もよく予測できるでしょうか?スターターコードはデータを分割し、ks を列挙してグラフにラベルを付けます。

  1. 各 k についてモデルを学習させ、訓練精度とテスト精度を保存します。
  2. 以下のように、テスト精度が最も高い k を出力します。
  3. ks に対して両方のリストをプロットし、train と test のラベルを付けて、凡例を表示します。

別のクラブの場合:

Best k: 9 (test accuracy 0.783)

別のクラブのシュート:1 から 41 までの k に対する精度。訓練精度は k = 1 の 0.99 から約 0.71 まで低下します。テスト精度は 0.68 から上昇し、k = 9 で 0.78 のピークに達した後、0.7 まで下がります

その後、Coddy があなたのグラフについて説明します。

自分で試してみよう

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

# シュート1本につき1行:ゴールまでの距離(m)、ゴールマウスへの角度(度)、得点または失敗
shots = pd.read_csv("shots.csv")
X = shots[["distance_m", "angle_deg"]]
y = shots["result"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
ks = range(1, 42, 4)  # k = 1, 5, 9, ..., 41

fig, ax = plt.subplots()
ax.set_title("Shots: Accuracy by k")
ax.set_xlabel("k (neighbors)")
ax.set_ylabel("Accuracy")

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

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

教師あり学習のすべてのレッスン

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