Proyek machine learning, yakni pembelajaran pola dari data oleh komputer, dimulai jauh sebelum model pertama dilatih, yaitu pada penetapan masalah dan penilaian data. Topik ini membuka proyek end-to-end, yaitu rangkaian kerja utuh dari data hingga evaluasi. Langkahnya meliputi penetapan satu masalah klasifikasi biner pada ranah medis yang netral, pemilihan dataset tabular bawaan scikit-learn, audit bentuk dan kualitas data, penetapan tolok ukur awal, serta pemilihan metrik utama beserta pertanggungjawabannya. Fondasi yang ditetapkan di sini digunakan sepanjang proyek, sehingga setiap keputusan pemodelan dapat dirujuk kembali ke alasan yang sudah tercatat.
Menetapkan masalah, pemakai, dan biaya keliru#
Masalah yang dipilih adalah prediksi sifat tumor payudara, yaitu mengklasifikasikan tumor sebagai ganas atau jinak berdasarkan 30 pengukuran numerik dari citra aspirasi jarum halus (fine needle aspiration, pengambilan sampel sel dengan jarum tipis). Dataset bawaan scikit-learn bernama load_breast_cancer menyediakan 569 sampel untuk masalah ini. Labelnya biner dengan kode 0 untuk tumor ganas dan 1 untuk tumor jinak, sehingga tugasnya murni klasifikasi biner. Ranah medis dipilih karena biaya kelirunya nyata dan mudah dinyatakan, bukan untuk mempromosikan produk atau layanan apa pun.
Setiap prediksi dapat keliru dengan dua cara, dan keduanya tidak sama mahal. Prediksi jinak pada tumor yang sebenarnya ganas menghasilkan false negative (FN), yaitu tumor ganas yang lolos dari perhatian dan berpotensi membuat perlakuannya terlambat. Prediksi ganas pada tumor yang sebenarnya jinak menghasilkan false positive (FP), yaitu alarm palsu yang berujung pada pemeriksaan lanjutan. Konsekuensi FN jauh lebih berat daripada FP, sehingga model proyek ini wajib menekan FN semaksimal mungkin.
Penetapan pemakai melengkapi perumusan masalah. Pengguna model ini adalah tenaga kesehatan yang memerlukan pendapat kedua, sehingga keluaran model berperan sebagai penunjang keputusan dan bukan pengganti diagnosis. Posisi pemakai itulah yang menentukan prioritas metrik pada bagian akhir topik. Metrik utamanya adalah recall kelas ganas, yakni proporsi tumor ganas yang berhasil dikenali, dan pendampingnya adalah precision, yakni proporsi prediksi ganas yang memang benar.
Mengaudit bentuk dan kualitas data#
Audit data adalah pemeriksaan pertama yang dijalankan sebelum satu baris pemodelan pun ditulis. Pemeriksaannya mencakup bentuk data, distribusi kelas, jumlah nilai yang hilang, dan rentang nilai tiap fitur. Fungsi np.bincount menghitung frekuensi setiap label, sedangkan np.isnan menghitung nilai NaN (Not a Number, penanda nilai numerik yang tidak terdefinisi). Empat pemeriksaan kecil ini menentukan banyak keputusan berikutnya, mulai dari kebutuhan scaling sampai pemilihan metrik.
import numpy as np
from sklearn.datasets import load_breast_cancer
# dataset bawaan scikit-learn: 569 baris, 30 fitur, 2 kelas
cancer = load_breast_cancer()
X, y = cancer.data, cancer.target
names = cancer.feature_names
# bentuk data dan distribusi kelas
print("Bentuk fitur:", X.shape)
print("Distribusi kelas (0 = ganas, 1 = jinak):", np.bincount(y))
# nilai yang hilang
print("Total nilai NaN pada seluruh fitur:", int(np.isnan(X).sum()))
# skala fitur yang timpang
rentang = X.max(axis=0) - X.min(axis=0)
i_besar = int(np.argmax(rentang))
i_kecil = int(np.argmin(rentang))
print(f"Rentang terlebar : {names[i_besar]} = {rentang[i_besar]:.1f}")
print(f"Rentang tersempit: {names[i_kecil]} = {rentang[i_kecil]:.4f}")
i_area = int(np.where(names == "mean area")[0][0])
print(f"Contoh {names[i_area]}: min = {X[:, i_area].min():.1f}, max = {X[:, i_area].max():.1f}")
i_smooth = int(np.where(names == "mean smoothness")[0][0])
print(f"Contoh {names[i_smooth]}: min = {X[:, i_smooth].min():.4f}, max = {X[:, i_smooth].max():.4f}")Bentuk fitur: (569, 30)
Distribusi kelas (0 = ganas, 1 = jinak): [212 357]
Total nilai NaN pada seluruh fitur: 0
Rentang terlebar : worst area = 4068.8
Rentang tersempit: fractal dimension error = 0.0289
Contoh mean area: min = 143.5, max = 2501.0
Contoh mean smoothness: min = 0.0526, max = 0.1634Keluaran di atas menyatakan tiga hal. Pertama, data berbentuk 569 baris dengan 30 kolom fitur, cukup untuk protokol penilaian lima lipatan yang dipakai pada bagian baseline dan tetap ringan dilatih ulang berkali-kali. Kedua, distribusi kelasnya adalah 212 tumor ganas berhadapan dengan 357 tumor jinak, sebuah ketidakseimbangan moderat sekitar dua banding tiga yang membuat akurasi menyesatkan. Ketiga, tidak ada satu nilai NaN pun pada seluruh sel data, sesuatu yang jarang terjadi pada data nyata dan tidak boleh diasumsikan tanpa pemeriksaan.
Bagian audit terakhir memeriksa rentang nilai fitur dan hasilnya timpang jauh. Rentang worst area mencapai 4068.8, sedangkan rentang fractal dimension error hanya 0.0289, selisih sekitar lima orde besaran. Fitur mean area bernilai antara 143.5 dan 2501.0, sedangkan mean smoothness hanya bergerak antara 0.0526 dan 0.1634. Model yang sensitif terhadap skala, seperti regresi logistik yang menjadi kandidat utama proyek, akan mengutamakan fitur bernilai besar tanpa alasan statistik, sehingga penyetaraan skala dengan StandardScaler menjadi keputusan desain yang sudah tercatat sejak audit ini.
Baseline yang harus dikalahkan#
Baseline, yakni angka yang dihasilkan model paling sederhana yang tidak belajar apa pun dari fitur, menjadi tolok ukur yang wajib dilampaui setiap model yang dibangun setelahnya. DummyClassifier dengan strategy="most_frequent" selalu memprediksi kelas mayoritas, yaitu jinak, tanpa melihat fitur sama sekali. Baseline ini dinilai dengan protokol yang sama seperti model sungguhan nanti, yaitu cross-validation, yakni penilaian model dengan melatih dan menguji bergantian pada beberapa potongan data, sebanyak lima lipatan yang diacak dengan random_state=42.
from sklearn.datasets import load_breast_cancer
from sklearn.dummy import DummyClassifier
from sklearn.model_selection import cross_val_score, cross_val_predict, StratifiedKFold
from sklearn.metrics import recall_score, precision_score
X, y = load_breast_cancer(return_X_y=True)
# protokol penilaian yang sama untuk seluruh proyek
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
# baseline tanpa pembelajaran: selalu menebak kelas mayoritas (jinak)
dummy = DummyClassifier(strategy="most_frequent")
akurasi = cross_val_score(dummy, X, y, cv=cv, scoring="accuracy")
print(f"Akurasi baseline (5 lipatan): {akurasi.mean():.3f} ± {akurasi.std():.3f}")
# prediksi per baris untuk membaca recall dan precision kelas ganas
pred = cross_val_predict(dummy, X, y, cv=cv)
print("Recall kelas ganas :", f"{recall_score(y, pred, pos_label=0):.3f}")
# model tidak pernah menebak ganas, sehingga precision didefinisikan 0.0
print("Precision kelas ganas:", f"{precision_score(y, pred, pos_label=0, zero_division=0):.3f}")Akurasi baseline (5 lipatan): 0.627 ± 0.004
Recall kelas ganas : 0.000
Precision kelas ganas: 0.000Angka baseline ini menyimpan pelajaran yang jelas. Akurasi 0.627 diperoleh tanpa mengenali satu pun tumor ganas, karena recall kelas ganasnya 0.000 dan precisionnya 0.000. Sebuah model yang gagal total pada tugas utamanya tetap mencetak akurasi di atas 60 persen hanya karena kelas mayoritasnya dominan. Inilah alasan akurasi tidak pernah dijadikan metrik utama pada proyek ini, dan angka 0.627 serta 0.000 digunakan kembali sebagai patokan pada evaluasi akhir.
Metrik utama dan pertanggungjawabannya#
Metrik utama proyek ini adalah recall kelas ganas, yang sudah ditetapkan pada perumusan masalah karena mengukur langsung kejadian yang paling mahal, yaitu FN. Precision kelas ganas dilaporkan di sisinya sebagai pengimbang, sedangkan F1, yakni rata-rata harmonik keduanya, merangkum pasangan itu dalam satu angka. Recall yang tinggi dengan precision yang rendah berarti model menebak ganas terlalu sering, sehingga alarm palsu melumpuhkan pemanfaatannya. Ketiganya dinilai pada kelas ganas agar setiap angka menjawab langsung pertanyaan proyek.
Precision tidak boleh ditinggalkan karena recall mudah dimanipulasi. Model yang menandai semua sampel sebagai ganas mencetak recall 1.000, tetapi precision-nya anjlok dan alarm palsunya membuat penunjang keputusan tidak berguna. Laporan proyek dengan demikian selalu memasangkan keduanya, sedangkan F1 digunakan hanya ketika perbandingan antar model memerlukan penyederhanaan. Nilai recall pada baseline adalah 0.000, garis awal yang harus dilampaui.
Penetapan metrik dilakukan sebelum ada satu skor pun, dan pertanggungjawabannya bergantung pada urutan tersebut. Metrik yang dipilih setelah melihat hasil cenderung menunjuk angka terbaik, bukan angka yang sesuai biaya keliru. Protokol penilaiannya juga ditetapkan di sini, yaitu StratifiedKFold lima lipatan dengan shuffle=True dan random_state=42 pada metrik recall kelas ganas. Protokol yang sama digunakan pada seluruh tahapan proyek sehingga setiap angka dapat dibandingkan secara adil.
Kesalahan umum#
- Menilai dataset dari bentuknya saja. Bentuk 569 baris dan 30 kolom tidak mengatakan apa pun tentang distribusi kelas, nilai hilang, dan rentang fitur. Perbaikannya dengan menjalankan empat pemeriksaan audit tersebut sebelum memodelkan.
- Mengasumsikan dataset bawaan pasti bersih. Asumsi ini kebetulan benar untuk
load_breast_cancer, tetapi kebiasaan auditnya harus tetap terbentuk agar data nyata yang jarang bersih tidak mengejutkan di tengah proyek. - Memilih metrik setelah melihat skor. Metrik yang lahir dari hasil cenderung menyembunyikan kegagalan pada kelas yang mahal. Perbaikannya dengan menurunkan metrik dari biaya keliru sebelum model pertama dilatih.
Ringkasan#
- Masalah proyek: klasifikasi biner ganas dan jinak dengan FN jauh lebih mahal daripada FP, sehingga recall kelas ganas menjadi metrik utama dan precision serta F1 menjadi pendamping.
- Hasil audit data: 569 baris dengan 30 fitur, 212 ganas berbanding 357 jinak, tanpa nilai NaN, dan rentang antar fitur timpang hingga lima orde besaran.
- Baseline
DummyClassifiermost_frequentmencetak akurasi 0.627 dengan recall ganas 0.000, dan angka ini menjadi patokan minimum seluruh proyek.
Referensi#
- sklearn.datasets.load_breast_cancer — scikit-learn — Dokumentasi dataset proyek beserta deskripsi 30 fitur dan sumber aslinya.
- sklearn.dummy.DummyClassifier — scikit-learn — Dokumentasi baseline paling sederhana beserta pilihan strateginya.
- sklearn.model_selection.cross_val_score — scikit-learn — Dokumentasi penilaian model dengan cross-validation yang digunakan pada baseline.
- sklearn.model_selection.StratifiedKFold — scikit-learn — Dokumentasi protokol lipatan yang menjaga proporsi kelas.
- Common pitfalls and recommended practices — scikit-learn — Jebakan umum interpretasi skor dan praktik yang disarankan, termasuk pemilihan metrik.