Pascasarjana Diary

Tugas · Pertemuan 06

5-NN pada data Iris

Tiga model validasi, classifier-nya 5-NN. Holdout 0%, K-fold (K = 10) 6,67%, leave-one-out 3,33%.

1. Aturan hitung

Iris: 150 baris, 4 atribut, 3 class. Data-nya 6. iris.csv. Setosa, versicolor, dan virginica masing-masing 50, dengan label Iris-setosa, Iris-versicolor, dan Iris-virginica. Classifier-nya k-NN, k = 5. Error ratio dirata-rata untuk holdout, K-fold, dan leave-one-out.

Holdout memakai 80% baris pertama tiap class untuk training, sisanya test. 50 × 0,8 = 40, jadi tiap class 40 training dan 10 test. K-fold memakai K = 10. Partisinya berurutan dan tidak diacak. Fold 1 baris 1–15, fold 2 baris 16–30, tiap fold 15 baris. Leave-one-out memakai K = 150.

Jaraknya Euclidean pada empat atribut mentah: sepal length, sepal width, petal length, petal width. Sama seperti Euclidean di tugas 5-NN, tanpa penskalaan. Kalau dua training data sama jauh, nomor baris yang lebih kecil yang diambil. Voting seri tidak terjadi pada ketiga model di bawah.

Error = (jumlah salah / jumlah data test) × 100%

Untuk K-fold dan leave-one-out, rata-ratanya E = (1/K) Σ Ei. Tiap fold ukurannya sama, jadi angka itu sama dengan jumlah salah dibagi seluruh baris. 6. iris.csv terurut: baris 1–50 Iris-setosa, 51–100 Iris-versicolor, 101–150 Iris-virginica.

2. Holdout

Training: baris 1–40, 51–90, dan 101–140 (120 baris). Test: 41–50 setosa, 91–100 versicolor, 141–150 virginica (30 baris). Tiga puluh prediksi sama dengan class. Dua puluh tujuh voting 5 lawan 0. Tiga yang lebih tipis tetap benar: baris 143 voting 4 virginica lawan 1 versicolor, baris 147 dan 150 voting 3 virginica lawan 2 versicolor.

30 baris test holdout. Prediksi 5-NN sama dengan class pada semuanya.
No SL SW PL PW Class Prediksi Suara
415.03.51.30.3setosasetosa5-0
424.52.31.30.3setosasetosa5-0
434.43.21.30.2setosasetosa5-0
445.03.51.60.6setosasetosa5-0
455.13.81.90.4setosasetosa5-0
464.83.01.40.3setosasetosa5-0
475.13.81.60.2setosasetosa5-0
484.63.21.40.2setosasetosa5-0
495.33.71.50.2setosasetosa5-0
505.03.31.40.2setosasetosa5-0
915.52.64.41.2versicolorversicolor5-0
926.13.04.61.4versicolorversicolor5-0
935.82.64.01.2versicolorversicolor5-0
945.02.33.31.0versicolorversicolor5-0
955.62.74.21.3versicolorversicolor5-0
965.73.04.21.2versicolorversicolor5-0
975.72.94.21.3versicolorversicolor5-0
986.22.94.31.3versicolorversicolor5-0
995.12.53.01.1versicolorversicolor5-0
1005.72.84.11.3versicolorversicolor5-0
1416.73.15.62.4virginicavirginica5-0
1426.93.15.12.3virginicavirginica5-0
1435.82.75.11.9virginicavirginica4-1
1446.83.25.92.3virginicavirginica5-0
1456.73.35.72.5virginicavirginica5-0
1466.73.05.22.3virginicavirginica5-0
1476.32.55.01.9virginicavirginica3-2
1486.53.05.22.0virginicavirginica5-0
1496.23.45.42.3virginicavirginica5-0
1505.93.05.11.8virginicavirginica3-2

error = 0 / 30 × 100% = 0%

Lima baris yang salah di leave-one-out (71, 73, 84, 107, 120) masuk training potongan ini, jadi holdout tidak menguji mereka. Holdout per class tetap 0%. Kalau 80% diambil dari urutan file sekaligus, test-nya baris 121–150, semuanya virginica, training virginica tinggal 20 baris, dan 6 dari 30 salah: error 20%.

3. K-fold

Sepuluh fold berurutan. Salah ada 10, semuanya versicolor tertukar dengan virginica. Setosa tidak ada yang salah. Fold 1–3 murni setosa, Ei = 0. Salah menumpuk di fold 5, 6, 8, dan 9.

Ei = salah / 15. Rata-ratanya 10/150.
Fold Baris Isi test Salah Ei
11–1515 setosa00%
216–3015 setosa00%
331–4515 setosa00%
446–605 setosa, 10 versicolor00%
561–7515 versicolor320%
676–9015 versicolor213,33%
791–10510 versicolor, 5 virginica00%
8106–12015 virginica213,33%
9121–13515 virginica320%
10136–15015 virginica00%

E = (1/10) × (0 + 0 + 0 + 0 + 20 + 13,33 + 0 + 13,33 + 20 + 0) = 6,67%

Sama dengan 10/150 × 100%.

Sepuluh baris yang prediksinya beda dengan class. Suara = jumlah tetangga versicolor lawan virginica.
Fold No SL SW PL PW Class Prediksi Suara
5696.22.24.51.5versicolorvirginica2-3
5715.93.24.81.8versicolorvirginica2-3
5736.32.54.91.5versicolorvirginica1-4
6786.73.05.01.7versicolorvirginica1-4
6846.02.75.11.6versicolorvirginica0-5
81074.92.54.51.7virginicaversicolor5-0
81206.02.25.01.5virginicaversicolor3-2
91276.22.84.81.8virginicaversicolor3-2
91286.13.04.91.8virginicaversicolor3-2
91346.32.85.11.5virginicaversicolor4-1

4. Leave-one-out

Seratus lima puluh eksperimen. Tiap kali 149 baris melatih, satu baris diuji. Lima salah: 71, 73, dan 84 versicolor terprediksi virginica. Baris 107 dan 120 virginica terprediksi versicolor. Kelima baris itu juga salah di K-fold. Lima salah tambahan di K-fold (69, 78, 127, 128, 134) benar ketika tetangga di fold yang sama boleh ikut voting.

Lima baris leave-one-out yang salah. Suara = versicolor lawan virginica di antara 5 tetangga.
No SL SW PL PW Class Prediksi Suara
715.93.24.81.8versicolorvirginica2-3
736.32.54.91.5versicolorvirginica1-4
846.02.75.11.6versicolorvirginica0-5
1074.92.54.51.7virginicaversicolor5-0
1206.02.25.01.5virginicaversicolor3-2

E = 5 / 150 × 100% = 3,33%

5. Rata-rata error

Setosa tidak salah di ketiga model. Semua salah ada di batas versicolor dan virginica. Holdout 0% karena baris batas itu masuk training. K-fold mengangkat satu blok 15 baris sekaligus, jadi sepuluh salah. Leave-one-out menyisakan tetangga di dekat baris uji, jadi lima salah.

Rata-rata error ratio. Angka dari python3 tugas.py.
Model Salah Error
Holdout0 / 300%
K-fold, K = 1010 / 1506,67%
Leave-one-out5 / 1503,33%
tugas.py
$ python3 tugas.py

Holdout          salah  0 / 30   error   0.00%
K-fold K=10      salah 10 / 150  error   6.67%
Leave-one-out    salah  5 / 150  error   3.33%

6. Kode

Classifier di knn.py. Tiga model di holdout.py, kfold.py, dan leave_one_out.py. tugas.py menjalankan ketiganya. Label class di file masih berawalan Iris-. load memotong awalan itu, jadi voting memakai setosa, versicolor, virginica.

knn.py

Euclidean pada empat atribut. Jarak sama, nomor baris lebih kecil. Class = suara terbanyak dari 5 tetangga.

def predict(point, train):
    nearest = sorted(
        train,
        key=lambda tr: (math.dist(point[1:5], tr[1:5]), tr[0]),
    )[:KNN]
    return Counter(tr[5] for tr in nearest).most_common(1)[0][0]

holdout.py

80% baris pertama tiap class untuk training. 50 × 0,8 = 40, jadi 10 test per class.

for label in (
    "setosa",
    "versicolor",
    "virginica",
):
    items = by[label]
    n = round(len(items) * 0.8)
    train += items[:n]
    test += items[n:]

kfold.py

K = 10. Tiap fold 15 baris berurutan. Sisanya training.

size = len(rows) // FOLDS
test = rows[fold * size:(fold + 1) * size]
train = rows[:fold * size] + rows[(fold + 1) * size:]

leave_one_out.py

150 kali. Satu baris diuji, 149 baris melatih.

for i, point in enumerate(rows):
    train = rows[:i] + rows[i + 1:]
    pred = predict(point, train)