Mendeteksi Kanker Payudara Dengan Machine Learning

Mendeteksi Kanker Payudara Dengan Machine Learning

Kecerdasan buatan (artificial intelligence – AI) memiliki banyak aplikasi di dunia nyata. Salah satunya AI bisa digunakan untuk peramalan (prediksi), deteksi objek, deteksi wajah, deteksi suara, dan lain-lain. Tentunya untuk bisa melakukan itu semua, tidak lepas dari machine learning, yaitu algoritma di balik kehebatan AI itu sendiri.

Kali ini saya akan berbagi bagaimana caranya mendeteksi kanker payudara dengan menggunakan machine learning. Data kanker payudara yang akan kita gunakan adalah data asli di lapangan yang sudah dikumpulkan oleh University of California (UCI) di link ini.

Bagaimana data ini didapat sehingga bisa mendeteksi kanker? Berdasarkan sumber aslinya, para peneliti mengambil bagian tertentu dari organ payudara pasien yang disebut dengan FNA (fine needle aspiration), yaitu sebagian sel yang bisa merepresentasikan kanker. Kemudian dari FNA ini mereka mengukur beberapa fitur (total ada 30 fitur), seperti misal ukuran jari-jari, luas permukaan, tekstur, tingkat simetris sel FNA tersebut. Di dataset yang sama, kita juga memiliki kolom ‘target’ yang menyatakan apakah sampel FNA tersebut termasuk kanker ganas dan menyebar (malignant) atau tidak (benign).

Ilustrasi kanker benign (tidak ganas) dan malignant (ganas) – Sumber: verywell

Jadi pada dasarnya, kita memiliki ratusan sel FNA, di mana masing-masing sel ini sudah memiliki status apakah ganas atau tidak, dan masing-masing sel ini memiliki 30 fitur yang sudah diukur oleh para ahli. Tugas kita adalah mengajarkan ke model machine learning kita untuk mencari pola (hubungan) antara 30 fitur dengan status ganas (0) atau tidak (1). Kemudian ketika model kita sudah bisa mendapatkan polanya, kita uji ke test set untuk melihat kinerjanya.


Bahasa Python

# Mengimpor library
import pandas as pd
import seaborn as sns
sns.set()

# Mengimpor dataset
from sklearn.datasets import load_breast_cancer
kanker = load_breast_cancer()

# Menggabungkan ke dalam satu data frame
df_kanker = pd.DataFrame(kanker['data'], columns = kanker['feature_names'])
df_kanker['status'] = kanker['target']

# Visualisasi data
sns.pairplot(df_kanker, vars = ['mean radius', 'mean texture', 'mean area', 'mean perimeter', 'mean smoothness'], hue = 'status' )

# Plot korelasi dengan heatmap
sns.heatmap(df_kanker[['mean radius', 'mean texture', 'concavity error', 'mean area','mean smoothness']].corr(), annot=True, cmap='bwr')

# Persiapan training dataset
X = df_kanker.drop(['status'],axis=1)
y = df_kanker['status']

# Membagi dataset ke training set dan test set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=0)

# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)

# Proses training dengan SVM
from sklearn.svm import SVC 
from sklearn.metrics import classification_report, confusion_matrix
classifier = SVC(kernel='rbf', random_state=0)
classifier.fit(X_train, y_train)

# Mengevauasi model
y_predict = classifier.predict(X_test)
cm = confusion_matrix(y_test, y_predict)
sns.heatmap(cm, annot=True)
print(classification_report(y_test,y_predict))

Keterangan:

  • Line 2-3 mengimpor library Pandas dan Seaborn untuk nanti digunakan.
  • Line 4 mengaktifkan Seaborn.
  • Line 7 mengimpor data set kita dari library sklearn.
  • Line 8 mendefinisikan objek dengan nama kanker sebagai dataset yang nanti akan kita gunakan.

Berikut adalah tampilan data set kita secara umum yang berupa dictionary:

Dataset kanker

Jika data set di atas dilihat melalui Variabel Explorer di Spyder, maka kita bisa melihat isi dari masing-masing baris. Misal kita lihat DESCR, maka ia akan menunjukkan informasi tentang dataset ini berasal dari sumbernya. Kurang lebih tampilannya sebagai berikut:

Ilustrasi kolom DESCR (Description)
  • Line 11 membuat objek baru (df_kanker) dengan tipe Data Frame agar lebih mudah dianalisis. Kita mengambil key data di dictionary kanker, kemudian kolomnya kita beri nama sesuai nama key feature_names.

Jika sudah dieksekusi, filenya akan tampak seperti ini di variable explorer:

Tampilan df_kanker di Spyder

Kalau dilihat objek df_kanker, maka kita belum memiliki variabel dependen-nya, yaitu status apakah kankernya malignant (0) atau tidak (1). Untuk bisa menambahkan variabel dependen ini, kita tambahkan kolom bari di line 12.

  • Line 12, menambahkan kolom baru dengan nama kolom ‘status’ yang iambil dari key target dari dictionary kanker. Sekarang jika dicek di shape (size di variable explorer), maka kita memiliki total kolom sebanyak 31 kolom.
  • Line 15 membuat pairplot. Kita ingin mendapatkan gambaran hubungan antara beberapa kolom. Tentunya mustahil kita memasukkan semua kolom karena terlalu banyak dan justru akan membuat bingung. Kita hanya memasukkan beberapa kolom saja seperti mean_radius, mean_texture, dan lain-lain (tentu saja pembaca bisa menggunakan kolom lain sebagai variabel pairplot). Kita gunakan kolom status sebagai pembeda warna. Tampilannya seperti berikut:
Tampilan hasil pairplot df_kanker

Terlihat bahwa data yang kita miliki dari awal memang sudah baik, sehingga kita bisa melihat perbedaan yang jelas antara malignant (0) dan benign (1). Jadi prediksi saya, kita tidak akan kesulitan saat menerapkan teknik machine learning ke df_kanker.

  • Line 18 membuat heatmap. Kita ingin melihat korelasi antara semua kolom yang ada di df_kanker. Tampilannya sebagai berikut:
Tampilan heatmap 5 kolom

Pembaca bisa melihat bahwa warna merah tua menunjukkan bahwa hubungan antar dua variabel semakin menunjukkan korelasi positif. Artinya jika satu data naik, maka data satunya lagi ikut naik. Sementara warna biru tua menunjukkan hubungan korelasi negatif. Artinya jika satu data naik, maka data satunya lagi justru turun, dan begitu sebaliknya.

Kita tidak akan terlalu jauh membahas hubungan korelasi antar variabel. Walau demikian, pembaca bisa saja melakukan analisis lain. Tapi kali ini kita fokus pada pendeteksian kanker melalui teknik SVM (Support Vector Machines).

  • Line 21 mendefinisikan variabel X sebagai variabel independen kita. Kemudian kita melepas kolom status, karena ia akan menjadi variabel dependen.
  • Line 22 mendefinisikan variabel y sebagai variabel dependen. Kita cukup mengambil kolom status dari df_kanker.
  • Line 25-26 melakukan proses pembagian training set dan test set. Jika pembaca ingin mengetahui detail apa itu training dan test set, silakan membaca artikel saya ini.
  • Line 29-32 melakukan proses feature scaling menggunakan metode standardisasi, karena kita mengasumsikan datanya berdistribusi normal. Bagi yang ingin mengetahui detail dari feature scaling silakan membaca artikel saya ini.
  • Line 35-38 melakukan proses training SVM. Saya pernah membahas apa itu SVM secara detail. Jika pembaca ingin mengetahui detailnya, silakan baca artikel saya ini.
  • Line 41 memprediksi hasil pembelajaran machine learning kita, di mana kita ingin membandingkan objek y_predict ini dengan y_test. Ini adalah perbandinganya:
Perbandingan y_predict dengan y_test

Bisa dilihat melalui perbandingan di atas, ternyata sangat baik. Tentunya perbandingan visual ini terlalu merepotkan. Kita bisa mebandingkat ringkasannya dengan membuat confusion matrix di line selanjutnya.

  • Line 42 membuat confusion matrix, dan line 43 membuat versi heatmap-nya. Tampilannya adalah sebagai berikut:
blank
Tampilan confusion matrix

Bisa dilihat bahwa hasil prediksi modle kita sangat baik. Dari kanker malignant (0), model kita bisa memprediksi dengan baik semua kanker ganas ini sebanyak 45 kali. Sementara model kita salah mendeteksi (false negative) sebanyak 2 kali (seharusnya benign (1), tapi dideteksi sebagai malignant (0)). Label bawah adalah kondisi sebenarnya, sementara label samping kiri adalah hasil prediksi model. Kemudian untuk kondisi malignant (0), model kita tidak melakukan false positive (seharusnya negatif tapi justru diprediksi positif), dan berhasil mendeteksi positif dengan benar sebanyak 67 kali.

Versi heatmap dari confusion matrix

Bisa dikatakan bahwa model kita memiliki akurasi sebanyak 98%. Ringkasannya bisa dilihat di ine selanjutnya.

  • Line 43 kita membuat ringkasannya dengan menggunakan fungsi classification_report. Tampilannya sebagai berikut:
Tampilan classification report di model kita
  • Berikut penjelasan dari beberapa keterangan di classification report:
    • Precision: Berapa banyak yang berhasil dideteksi di class tersebut.
    • Recall: Berapa banyak class ini yang berhasil ditemukan dibandingkan dengan class lain.
    • Precision dan recall sangat berguna jika datanya tidak imbang (imbalanced). Jadi jika datanya imbang, cukup dilihat F1-score nya saja.
    • F1-score: Harmonisasi antara prediksi dan recall (tingkat akurasi total).
    • Support: Berapa banyak item yang diprediksi di class ini.

Setelah melihat hasil ringkasan di atas bisa dikatakan bahwa performa model kita sangatlah baik, dengan akurasi sebanyak 98%. Tentunya hal ini juga didukung karena kualitas data yang didapat sudah baik sekali.

Saya harap pembaca mendapatkan gambaran bahwa teknik machine learning seperti Support Vector Machines (SVM) bisa diaplikasikan di dunia nyata (dunia medis), dan saya harap pembaca juga bisa mempraktekkannya di bidang lainnya.

Terima kasih sudah membaca artikel ini, semoga bermanfaat!

Bagikan artikel ini:
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments