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.
| No | SL | SW | PL | PW | Class | Prediksi | Suara |
|---|---|---|---|---|---|---|---|
| 41 | 5.0 | 3.5 | 1.3 | 0.3 | setosa | setosa | 5-0 |
| 42 | 4.5 | 2.3 | 1.3 | 0.3 | setosa | setosa | 5-0 |
| 43 | 4.4 | 3.2 | 1.3 | 0.2 | setosa | setosa | 5-0 |
| 44 | 5.0 | 3.5 | 1.6 | 0.6 | setosa | setosa | 5-0 |
| 45 | 5.1 | 3.8 | 1.9 | 0.4 | setosa | setosa | 5-0 |
| 46 | 4.8 | 3.0 | 1.4 | 0.3 | setosa | setosa | 5-0 |
| 47 | 5.1 | 3.8 | 1.6 | 0.2 | setosa | setosa | 5-0 |
| 48 | 4.6 | 3.2 | 1.4 | 0.2 | setosa | setosa | 5-0 |
| 49 | 5.3 | 3.7 | 1.5 | 0.2 | setosa | setosa | 5-0 |
| 50 | 5.0 | 3.3 | 1.4 | 0.2 | setosa | setosa | 5-0 |
| 91 | 5.5 | 2.6 | 4.4 | 1.2 | versicolor | versicolor | 5-0 |
| 92 | 6.1 | 3.0 | 4.6 | 1.4 | versicolor | versicolor | 5-0 |
| 93 | 5.8 | 2.6 | 4.0 | 1.2 | versicolor | versicolor | 5-0 |
| 94 | 5.0 | 2.3 | 3.3 | 1.0 | versicolor | versicolor | 5-0 |
| 95 | 5.6 | 2.7 | 4.2 | 1.3 | versicolor | versicolor | 5-0 |
| 96 | 5.7 | 3.0 | 4.2 | 1.2 | versicolor | versicolor | 5-0 |
| 97 | 5.7 | 2.9 | 4.2 | 1.3 | versicolor | versicolor | 5-0 |
| 98 | 6.2 | 2.9 | 4.3 | 1.3 | versicolor | versicolor | 5-0 |
| 99 | 5.1 | 2.5 | 3.0 | 1.1 | versicolor | versicolor | 5-0 |
| 100 | 5.7 | 2.8 | 4.1 | 1.3 | versicolor | versicolor | 5-0 |
| 141 | 6.7 | 3.1 | 5.6 | 2.4 | virginica | virginica | 5-0 |
| 142 | 6.9 | 3.1 | 5.1 | 2.3 | virginica | virginica | 5-0 |
| 143 | 5.8 | 2.7 | 5.1 | 1.9 | virginica | virginica | 4-1 |
| 144 | 6.8 | 3.2 | 5.9 | 2.3 | virginica | virginica | 5-0 |
| 145 | 6.7 | 3.3 | 5.7 | 2.5 | virginica | virginica | 5-0 |
| 146 | 6.7 | 3.0 | 5.2 | 2.3 | virginica | virginica | 5-0 |
| 147 | 6.3 | 2.5 | 5.0 | 1.9 | virginica | virginica | 3-2 |
| 148 | 6.5 | 3.0 | 5.2 | 2.0 | virginica | virginica | 5-0 |
| 149 | 6.2 | 3.4 | 5.4 | 2.3 | virginica | virginica | 5-0 |
| 150 | 5.9 | 3.0 | 5.1 | 1.8 | virginica | virginica | 3-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.
| Fold | Baris | Isi test | Salah | Ei |
|---|---|---|---|---|
| 1 | 1–15 | 15 setosa | 0 | 0% |
| 2 | 16–30 | 15 setosa | 0 | 0% |
| 3 | 31–45 | 15 setosa | 0 | 0% |
| 4 | 46–60 | 5 setosa, 10 versicolor | 0 | 0% |
| 5 | 61–75 | 15 versicolor | 3 | 20% |
| 6 | 76–90 | 15 versicolor | 2 | 13,33% |
| 7 | 91–105 | 10 versicolor, 5 virginica | 0 | 0% |
| 8 | 106–120 | 15 virginica | 2 | 13,33% |
| 9 | 121–135 | 15 virginica | 3 | 20% |
| 10 | 136–150 | 15 virginica | 0 | 0% |
E = (1/10) × (0 + 0 + 0 + 0 + 20 + 13,33 + 0 + 13,33 + 20 + 0) = 6,67%
Sama dengan 10/150 × 100%.
| Fold | No | SL | SW | PL | PW | Class | Prediksi | Suara |
|---|---|---|---|---|---|---|---|---|
| 5 | 69 | 6.2 | 2.2 | 4.5 | 1.5 | versicolor | virginica | 2-3 |
| 5 | 71 | 5.9 | 3.2 | 4.8 | 1.8 | versicolor | virginica | 2-3 |
| 5 | 73 | 6.3 | 2.5 | 4.9 | 1.5 | versicolor | virginica | 1-4 |
| 6 | 78 | 6.7 | 3.0 | 5.0 | 1.7 | versicolor | virginica | 1-4 |
| 6 | 84 | 6.0 | 2.7 | 5.1 | 1.6 | versicolor | virginica | 0-5 |
| 8 | 107 | 4.9 | 2.5 | 4.5 | 1.7 | virginica | versicolor | 5-0 |
| 8 | 120 | 6.0 | 2.2 | 5.0 | 1.5 | virginica | versicolor | 3-2 |
| 9 | 127 | 6.2 | 2.8 | 4.8 | 1.8 | virginica | versicolor | 3-2 |
| 9 | 128 | 6.1 | 3.0 | 4.9 | 1.8 | virginica | versicolor | 3-2 |
| 9 | 134 | 6.3 | 2.8 | 5.1 | 1.5 | virginica | versicolor | 4-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.
| No | SL | SW | PL | PW | Class | Prediksi | Suara |
|---|---|---|---|---|---|---|---|
| 71 | 5.9 | 3.2 | 4.8 | 1.8 | versicolor | virginica | 2-3 |
| 73 | 6.3 | 2.5 | 4.9 | 1.5 | versicolor | virginica | 1-4 |
| 84 | 6.0 | 2.7 | 5.1 | 1.6 | versicolor | virginica | 0-5 |
| 107 | 4.9 | 2.5 | 4.5 | 1.7 | virginica | versicolor | 5-0 |
| 120 | 6.0 | 2.2 | 5.0 | 1.5 | virginica | versicolor | 3-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.
| Model | Salah | Error |
|---|---|---|
| Holdout | 0 / 30 | 0% |
| K-fold, K = 10 | 10 / 150 | 6,67% |
| Leave-one-out | 5 / 150 | 3,33% |
$ 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)