Praktikum SVM untuk Klasifikasi Warna
Praktikum SVM untuk Klasifikasi Warna
PRAKTIKUM
COMPUTER VISION
Oleh:
MUHAMMAD RIZKI
NIM 2022573010105
Kelas : TI / 3C
Program Studi : Teknik Informatika
Dosen Pengampu : Dr. Rahmad Hidayat, [Link]., [Link]
2025
1. Percobaan 1 Fitur Warna Support Vector Machines (SVM)
a. Program
1. Library yang Diimpor
import pandas as pd
import seaborn as sns
import [Link] as plt
from [Link] import SVC
from [Link] import accuracy_score, classification_report,
confusion_matrix
from sklearn.model_selection import train_test_split
● Explanation:
○ pandas as pd: Untuk membaca, memproses, dan memanipulasi data
tabular (DataFrame).
○ seaborn as sns & [Link] as plt: Untuk visualisasi data,
misalnya plotting distribusi kelas atau hasil confusion matrix.
○ [Link]: Kelas dari scikit-learn untuk membuat model
Support Vector Classifier (SVM).
○ [Link]: Untuk mengevaluasi performa model seperti:
■ Akurasi (accuracy_score)
■ Laporan klasifikasi (classification_report)
■ Confusion matrix (confusion_matrix)
○ train_test_split: Untuk membagi dataset ke dalam data latih dan uji.
2. Fungsi load_data()
CSV_PATH = r"[Link]"
def load_data():
df = pd.read_csv(CSV_PATH)
● Explanation:
○ Membaca file CSV menjadi DataFrame df.
1
● Explanation:
○ Menentukan fitur (fitur warna) untuk model.
○ Kolom X berisi nilai rata-rata RGB dan histogram RGB, jadi ini
adalah fitur representasi warna.
○ y adalah label kelas untuk klasifikasi.
○ Label dikonversi ke string (mungkin karena ada angka yang
sebenarnya adalah nama kelas).
○ Data dibagi menjadi 80% training dan 20% testing.
○ Fungsi mengembalikan hasil split, serta X dan y asli.
def tampilkan_info_dataset():
df = pd.read_csv(CSV_PATH)
print("\n=== Informasi Dataset ===")
print([Link]())
print("\nContoh Data:")
print([Link]())
● Explanation:
○ Membaca file [Link] ke dalam DataFrame df.
● Explanation:
train_svm() digunakan untuk melatih model klasifikasi SVM dengan
data latih, lalu memprediksi data uji. Setelah itu, fungsi ini menampilkan
akurasi dan laporan performa model, lalu mengembalikan model dan hasil
prediksinya.
2
yang digunakan sebagai sumbu, dan menampilkannya dengan pewarnaan agar
lebih mudah dibaca.
def show_heatmap(csv_path):
df = pd.read_csv(csv_path)
df_num = df.select_dtypes(include='number')
[Link](figsize=(14, 10))
[Link](df_num.corr(), annot=True, cmap='coolwarm')
[Link]("Heatmap Korelasi Semua Kolom Numerik")
[Link]()
● Explanation:
show_heatmap() digunakan untuk menampilkan heatmap korelasi
antar kolom numerik dalam dataset. Data dibaca dari file CSV, lalu hanya
kolom angka yang dipilih. Korelasinya dihitung dan divisualisasikan pakai
heatmap biar kelihatan hubungan antar fitur.
def menu():
(X_tr, X_te, y_tr, y_te), X, y_all = load_data()
model = y_pred = None
while True:
print("\n=== MENU SVM ===")
print("1. Tampilkan Informasi Dataset")
print("2. Latih Model")
print("3. Confusion Matrix")
print("4. Pairplot")
print("5. Heatmap")
print("6. Keluar")
if p == "1":
tampilkan_info_dataset()
elif p == "2":
model, y_pred = train_svm(X_tr, X_te, y_tr, y_te)
elif p == "3":
3
show_confusion_matrix(y_te, y_pred) if y_pred is not
None else print(" Jalankan model dulu.")
elif p == "4":
show_pairplot(X, y_all)
elif p == "5":
show_heatmap(CSV_PATH)
elif p == "6":
print("Keluar."); break
else:
print(" Pilihan tidak valid.")
● Explanation:
Fungsi menu() berfungsi sebagai antarmuka utama program yang
memungkinkan pengguna memilih berbagai fitur yang tersedia. Di awal
fungsi, data dibagi menjadi data latih dan data uji melalui load_data(), lalu
disiapkan variabel model dan y_pred sebagai penampung hasil pelatihan dan
prediksi. Selanjutnya, program masuk ke dalam perulangan while yang
menampilkan daftar menu mulai dari menampilkan informasi dataset, melatih
model SVM, menampilkan confusion matrix, visualisasi pairplot, hingga
heatmap korelasi antar fitur numerik. Setiap pilihan dijalankan sesuai dengan
input pengguna, dan program akan terus berjalan sampai pengguna memilih
keluar dengan memilih opsi nomor enam. Jika input yang dimasukkan tidak
sesuai, maka akan ditampilkan pesan bahwa pilihan tidak valid.
b. Output
1. Informasi Dataset
4
● Explanation:
2. Latih Model
● Explanation:
5
presisi (precision) sempurna (1.00), yang berarti setiap kali model menebak
"kelas 1", tebakannya itu pasti benar. Namun, daya ingatnya (recall) hanya
0.80, artinya model gagal menemukan 20% dari total data yang seharusnya
masuk ke kelas 1. Sebaliknya, untuk kelas 0, model memiliki recall
sempurna (1.00), berhasil mengidentifikasi semua data yang memang kelas
0. Akan tetapi, presisinya lebih rendah (0.75), menunjukkan bahwa
terkadang model salah menebak data lain sebagai kelas 0. Kolom support
menunjukkan jumlah data asli untuk setiap kelas (3 untuk kelas 0, dan 5
untuk kelas 1). Karena jumlah data tidak seimbang, weighted avg (rata-rata
terbobot) menjadi acuan yang baik, dengan F1-score 0.88, yang menandakan
performa model secara keseluruhan sangat solid. Singkatnya, model ini
sangat andal saat memprediksi kelas 1, namun cenderung sedikit "terlalu
bersemangat" dalam mengidentifikasi kelas 0 sehingga terkadang
melewatkan beberapa data dari kelas 1.
3. Confusion Matrix
● Explanation:
6
Secara keseluruhan, model ini memiliki performa yang baik. Dari total 8
data (3+0+1+4), model hanya membuat satu kesalahan, yaitu gagal
mengidentifikasi satu data dari kelas 1. Model ini sangat akurat dalam
memprediksi kelas 0 dan tidak pernah membuat kesalahan "False positif".
4. Pairplot
● Explanation:
2. Plot di Luar Diagonal (Plot Tebar) Semua plot lainnya adalah plot
tebar (scatter plot). Grafik ini menunjukkan hubungan antara dua
variabel yang berbeda.
7
membentuk dua kelompok yang cukup terpisah. Ini memperkuat
bahwa kombinasi fitur-fitur ini efektif untuk klasifikasi.
5. Heatmap
● Explanation:
8
3. Anomali Data: Perlu dicatat bahwa nilai korelasi untuk fitur
r_HistMean, g_HistMean, dan b_HistMean tidak dapat dihitung dan
tidak ditampilkan pada heatmap. Hal ini mengindikasikan adanya
kemungkinan masalah pada data tersebut, seperti tipe data
non-numerik atau terdapat nilai yang hilang (missing values).
a. Program
1. Import Library
import pandas as pd
import seaborn as sns
import [Link] as plt
from [Link] import DecisionTreeClassifier, plot_tree
from [Link] import accuracy_score,
classification_report, confusion_matrix
from sklearn.model_selection import train_test_split,
cross_val_score
● Explanation:
Baris kode tersebut berisi import library yang dibutuhkan untuk
program klasifikasi menggunakan Decision Tree. pandas digunakan untuk
membaca dan mengolah data, seaborn dan matplotlib digunakan untuk
visualisasi, sedangkan sklearn menyediakan tools untuk membangun, melatih,
mengevaluasi model Decision Tree, serta melakukan split data dan
cross-validation.
CSV_PATH = r"[Link]"
● Explanation:
Mendefinisikan variabel global yang akan digunakan dalam program.
CSV_PATH menyimpan lokasi file dataset. Variabel model_default dan
model_opt disiapkan untuk menyimpan model decision tree versi default dan
versi yang sudah dioptimasi. Sementara itu, X_train, X_test, y_train, dan
y_test adalah variabel untuk menyimpan data latih dan uji. Terakhir,
y_pred_default dan y_pred_opt akan menyimpan hasil prediksi dari
masing-masing model.
9
3. Fungsi load_data()
def load_data():
df = pd.read_csv(CSV_PATH)
X = [Link](columns=["Actual", "Predicted", "Correct"],
errors='ignore')
y = df["Actual"]
return train_test_split(X, y, test_size=0.2,
random_state=42), X
● Explanation:
Fungsi load_data() digunakan untuk membaca dataset dari file CSV,
memisahkan fitur (X) dan label target (y), lalu membagi data menjadi data
latih dan data uji. Kolom seperti "Actual", "Predicted", dan "Correct" akan
di-drop dari fitur jika ada, untuk memastikan hanya fitur yang relevan yang
digunakan. Fungsi ini mengembalikan hasil pembagian data (train_test_split)
serta seluruh data fitur (X) untuk keperluan visualisasi atau analisis tambahan.
4. Fungsi train_decision_tree()
def train_decision_tree(X_train, X_test, y_train, y_test,
max_depth=None):
model = DecisionTreeClassifier(max_depth=max_depth,
random_state=42)
[Link](X_train, y_train)
y_pred = [Link](X_test)
acc = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred,
target_names=["dino", "kuda"])
print(f"\n Akurasi Model Decision Tree{' (Optimal)' if
max_depth else ''}: {acc:.2%}")
print(report)
return model,
y_pred
● Explanation:
Fungsi train_decision_tree() digunakan untuk melatih model Decision
Tree menggunakan data latih dan menguji akurasinya pada data uji. Parameter
max_depth bisa diisi untuk mengatur kedalaman maksimal pohon; jika tidak
diisi, maka model menggunakan pengaturan default (tidak terbatas). Model
dilatih dengan fit(), lalu digunakan untuk memprediksi label data uji. Akurasi
dihitung, dan laporan klasifikasi ditampilkan dengan label target yang di-set
sebagai “dino” dan “kuda”. Fungsi ini mengembalikan model yang sudah
dilatih dan hasil prediksinya.
5. Fungsi visualisasi_confusion_matrix()
def visualisasi_confusion_matrix(y_test, y_pred):
cm = confusion_matrix(y_test, y_pred)
[Link](cm, annot=True, fmt='d', cmap='Blues',
xticklabels=["dino", "kuda"],
yticklabels=["dino", "kuda"])
[Link]("Confusion Matrix - Decision Tree")
[Link]("Predicted")
[Link]("Actual")
[Link]()
10
● Explanation:
Fungsi visualisasi_confusion_matrix() digunakan untuk menampilkan
confusion matrix dari hasil prediksi model Decision Tree dalam bentuk visual
heatmap. Confusion matrix dihitung dari label asli (y_test) dan hasil prediksi
(y_pred), lalu divisualisasikan menggunakan seaborn dengan pewarnaan biru.
Sumbu X menunjukkan label prediksi, sedangkan sumbu Y menunjukkan
label asli. Fungsi ini membantu melihat sejauh mana model benar atau salah
dalam mengklasifikasi masing-masing kelas, yaitu "dino" dan "kuda".
6. Fungsi visualisasi_pohon()
def visualisasi_pohon(model, X, title):
[Link](figsize=(12,6))
plot_tree(model, feature_names=[Link],
class_names=["dino", "kuda"],
filled=True) [Link](title)
[Link]()
● Explanation:
Fungsi visualisasi_pohon() digunakan untuk menampilkan struktur
pohon keputusan (Decision Tree) yang telah dilatih. Model pohon
divisualisasikan menggunakan plot_tree() dari sklearn, dengan nama fitur
diambil dari kolom X dan label kelas ditampilkan sebagai “dino” dan “kuda”.
Judul plot disesuaikan dengan parameter title. Visualisasi ini membantu
memahami bagaimana model membuat keputusan berdasarkan fitur yang
diberikan.
7. Fungsi find_optimal_depth()
def find_optimal_depth(X_train, y_train):
print("\n Mencari kedalaman terbaik untuk
pohon
keputusan...")
depths = range(3, 15)
scores = []
for depth in depths:
tree =
DecisionTreeClassifier(max_depth=depth,
random_state=42)
cv_scores = cross_val_score(tree, X_train, y_train,
cv=5)
[Link](cv_scores.mean())
optimal_depth = depths[[Link](max(scores))]
print(f"Kedalaman optimal ditemukan: {optimal_depth} dengan
akurasi rata-rata: {max(scores):.2%}")
● Explanation:
Fungsi find_optimal_depth() digunakan untuk mencari kedalaman
(depth) terbaik dari model Decision Tree dengan cara menguji berbagai nilai
depth menggunakan cross-validation. Fungsi ini mencoba kedalaman dari 3
hingga 14, lalu menghitung rata-rata akurasi dari 5-fold cross-validation untuk
setiap kedalaman. Nilai depth dengan akurasi tertinggi dianggap sebagai yang
optimal. Hasilnya ditampilkan di terminal dan dikembalikan untuk digunakan
saat melatih model yang dioptimasi.
11
8. Fungsi find_optimal_depth()
def menu():
global model_default, model_opt, y_pred_default, y_pred_opt
global X_train, X_test, y_train, y_test
while True:
print("\n=== MENU UTAMA ===")
print("1. Latih Model Decision Tree")
print("2. Visualisasi Confusion Matrix")
print("3. Visualisasi decision awal")
print("4. Visualisasi decision optimasi")
print("5. Keluar")
pilihan = input("Pilih menu (1-5): ")
if pilihan == "1":
model_default, y_pred_default =
train_decision_tree(X_train, X_test, y_train, y_test)
elif pilihan == "2":
if y_pred_default is not None:
visualisasi_confusion_matrix(y_test,
y_pred_default)
else:
print(" Jalankan pelatihan model dulu.")
elif pilihan == "3":
if model_default:
visualisasi_pohon(model_default, X_all,
"Pohon
Keputusan (Default)")
else:
print(" Jalankan pelatihan model dulu.")
elif pilihan == "4":
optimal_depth = find_optimal_depth(X_train,
y_train)
model_opt, y_pred_opt =
train_decision_tree(X_train, X_test, y_train, y_test,
max_depth=optimal_depth)
visualisasi_pohon(model_opt, X_all,
f"Pohon Keputusan (Optimal -
max_depth={optimal_depth})")
elif pilihan == "5":
print("Keluar dari program.")
break
else:
print(" Pilihan tidak valid.")
● Explanation:
Fungsi menu() ini bertindak sebagai “dashboard” interaktif untuk
seluruh pipeline Decision Tree‐mu. Begitu fungsi dipanggil, ia memuat
dataset lewat load_data()—hasilnya langsung dipecah menjadi data latih dan
data uji, lalu disimpan di variabel global agar bisa diakses di sepanjang
program. Di dalam loop tak terbatas, program menampilkan lima opsi. Opsi
pertama menjalankan pelatihan Decision Tree standar; model yang
dihasilkan
12
beserta prediksinya disimpan di model_default dan y_pred_default. Opsi
kedua menampilkan confusion matrix, tetapi hanya akan dieksekusi bila
model default sudah ada—kalau belum, pengguna diingatkan untuk melatih
model lebih dulu. Opsi ketiga menggambar struktur pohon dari model default,
lagi-lagi dengan pengecekan yang sama supaya tidak memanggil objek
kosong. Opsi keempat melakukan tuning sederhana: ia mencari kedalaman
pohon terbaik memakai cross-validation lima lipatan lewat
find_optimal_depth(), melatih ulang pohon dengan kedalaman tersebut, lalu
memvisualisasikannya. Opsi kelima keluar dari aplikasi dan memecah loop.
b. Output
● Explanation:
13
sebagai 'dino', hanya 75% yang benar, sementara sisanya merupakan
kesalahan klasifikasi dari kelas lain.
Kolom support menunjukkan distribusi data aktual pada set pengujian, yaitu
sebanyak 3 sampel untuk kelas dino dan 5 sampel untuk kelas kuda.
Mengingat adanya ketidakseimbangan jumlah sampel ini, metrik rata-rata
terbobot (weighted average) F1-Score sebesar 0.88 menjadi indikator
performa gabungan yang paling representatif.
● Explanation:
Setiap kotak dalam matriks menunjukkan jumlah data untuk kombinasi prediksi
dan aktual tertentu:
Secara keseluruhan, model ini memiliki performa yang baik. Dari total 8 data
(3+0+1+4), model hanya membuat satu kesalahan, yaitu gagal
14
mengidentifikasi satu data dari kelas 1. Model ini sangat akurat dalam
memprediksi kelas 0 dan tidak pernah membuat kesalahan "False positif".
● Explanation:
Model ini bekerja dengan cara membuat serangkaian pertanyaan "ya/tidak"
(True/False) secara bertahap untuk mengklasifikasikan data ke dalam kategori
tertentu, dalam kasus ini antara kelas dino dan kuda.
Setiap kotak pada diagram disebut node. Ada dua jenis node utama:
Model ini bekerja dari atas ke bawah. Mari kita ikuti satu contoh alur ke kiri:
1. Node Akar (Paling Atas): Sebuah data baru masuk. Model bertanya:
"Apakah nilai g_Skew data ini lebih kecil atau sama dengan -0.875?"
15
2. Jalur "True": Jika jawabannya Ya (True), data akan dikirim ke node di
sebelah kiri.
3. Node Kedua: Di sini, model bertanya lagi: "Apakah nilai r_CCV lebih
kecil atau sama dengan 92219.5?"
4. Jalur "True": Jika jawabannya Ya (True), data akan dikirim ke node
daun di paling kiri.
5. Node Daun (Hasil Akhir): Node ini berisi 15 sampel, yang semuanya
adalah kelas dino (value = [15, 0]). Karena node ini sudah murni (Gini
= 0.0), maka model dengan yakin memutuskan bahwa data tersebut
termasuk dalam kelas dino.
● Explanation:
16
proses pencarian, kemungkinan menggunakan validasi silang
(cross-validation), telah dilakukan. Hasil dari proses ini adalah:
Nilai ini menunjukkan bahwa dari berbagai kedalaman yang diuji, kedalaman
3 memberikan performa rata-rata terbaik selama fase validasi. Proses ini
bertujuan untuk menemukan keseimbangan antara model yang terlalu
sederhana (underfitting) dan terlalu kompleks (overfitting).
17
itu, model ini menunjukkan kinerja yang baik dengan hanya satu kesalahan klasifikasi
untuk data kelas "dino" dan semua data kelas "kuda" diklasifikasikan dengan
[Link] terdapat kesalahan Tipe I (false positive), hanya satu kesalahan Tipe II
(false negative). Secara keseluruhan, meskipun kedua model bekerja dengan baik,
SVM lebih unggul dalam precision, sedangkan Decision Tree menunjukkan kekuatan
dalam menghindari prediksi salah untuk kelas negatif.
a. Program
1. Import Library
import os
import pandas as pd
import seaborn as sns
import [Link] as plt
from sklearn.model_selection import train_test_split
from [Link] import LabelEncoder,StandardScaler
from [Link] import SVC
from [Link] import
accuracy_score,classification_report, confusion_matrix
● Explanation:
Import menyiapkan semua pustaka yang dibutuhkan untuk proyek
klasifikasi SVM. os dipakai untuk urusan sistem file, pandas untuk membaca
dan mengolah data tabular, sedangkan seaborn dan [Link]
membantu membuat visualisasi grafik. train_test_split membagi data menjadi
latih dan uji, LabelEncoder mengubah label kategorikal menjadi angka, dan
StandardScaler menstandarkan skala fitur numerik. SVC adalah algoritma
Support Vector Machine yang akan dilatih, lalu kinerja model diukur
memakai accuracy_score, classification_report, dan confusion_matrix.
data = None
numeric_cols = None
X = y = None
X_tr = X_te = y_tr = y_te = None
svm_clf = None
● Explanation:
Mendefinisikan variabel-variabel global yang akan dipakai dalam
program klasifikasi. CSV_PATH menyimpan lokasi file dataset bernama
[Link]. Variabel data akan menampung isi dataset, numeric_cols untuk
menyimpan kolom-kolom numerik yang dipilih. X dan y masing-masing
mewakili fitur dan label target. X_tr, X_te, y_tr, dan y_te akan digunakan
18
untuk menyimpan data hasil pembagian train-test. Terakhir, svm_clf disiapkan
sebagai penampung model Support Vector Machine setelah dilatih.
3. Fungsi show_info()
def show_info():
print("\n=== Informasi Dataset ===")
print([Link]())
print("\nContoh Data:")
print([Link]())
● Explanation:
Fungsi show_info() digunakan untuk menampilkan informasi umum
tentang dataset. Fungsi ini mencetak struktur data seperti jumlah kolom, tipe
data, dan apakah ada data kosong melalui [Link](), lalu menampilkan 5
baris pertama dari dataset dengan [Link]() agar pengguna bisa melihat
contoh isi datanya.
4. Fungsi train_svm()
def train_svm():
global numeric_cols, X, y, X_tr, X_te, y_tr, y_te,
svm_clf if 'label' not in [Link]:
print("[ERROR] Kolom 'label' tidak ada."); return
numeric_cols = [c for c in
data.select_dtypes(include=['int64', 'float64']).columns if c
!= 'label']
if not numeric_cols:
print("[ERROR] Tidak ada kolom numerik untuk fitur.");
return
X = data[numeric_cols].values
y = LabelEncoder().fit_transform(data['label'])
preds = svm_clf.predict(X_te)
print("\n=== Evaluasi SVM ===")
print("Accuracy :", accuracy_score(y_te, preds))
print(classification_report(y_te, preds, zero_division=0))
cm = confusion_matrix(y_te, preds)
[Link](cm, annot=True, cmap='Blues', fmt='d')
[Link]('Confusion Matrix'); [Link]('Predicted');
[Link]('Actual'); [Link]()
● Explanation:
Fungsi train_svm() digunakan untuk melatih model klasifikasi SVM
menggunakan data dari dataset yang sudah dimuat sebelumnya. Pertama,
fungsi ini memastikan bahwa kolom 'label' ada dalam data karena itu yang
19
digunakan sebagai target. Lalu, fungsi mencari kolom-kolom numerik yang
akan dipakai sebagai fitur, dan mengecek apakah ada. Jika semuanya aman,
data fitur (X) dan label (y) diambil, label dikodekan ke angka menggunakan
LabelEncoder.
Setelah itu, data dibagi menjadi data latih dan uji dengan train_test_split, lalu
fitur dinormalisasi menggunakan StandardScaler agar model bekerja lebih
optimal. Model SVM dengan kernel linear dibuat dan dilatih menggunakan
data latih. Setelah pelatihan, model digunakan untuk memprediksi data uji.
Terakhir, fungsi ini menampilkan akurasi, laporan klasifikasi lengkap, dan
confusion matrix dalam bentuk heatmap untuk memudahkan interpretasi hasil.
5. Fungsi pairplot()
def pairplot():
try:
subset = numeric_cols[:3] + ['label']
[Link](data[subset], hue='label',palette='husl')
[Link]("Pairplot GLCM", y=1.02)
[Link]()
except Exception as e:
print("[WARN] Gagal pairplot:", e)
● Explanation:
Fungsi pairplot() digunakan untuk menampilkan visualisasi hubungan
antar beberapa fitur numerik pertama dari dataset menggunakan diagram sebar
(scatter plot) berpasangan. Fungsi ini mengambil 3 fitur numerik pertama dari
numeric_cols, lalu menambahkan kolom 'label' untuk digunakan sebagai
pewarna (hue) berdasarkan kelas.
6. Fungsi heatmap()
def heatmap():
try:
corr = data[numeric_cols].corr()
[Link](figsize=(14, 12))
[Link](corr, cmap='coolwarm',
annot=True) [Link]('Heatmap Korelasi
GLCM')
[Link]()
except Exception as e:
print("[WARN] Gagal heatmap:", e)
actions = {
'1': show_info,
'2': train_svm,
'3': pairplot,
'4': heatmap
}
20
● Explanation:
Fungsi heatmap() digunakan untuk menampilkan visualisasi korelasi
antar fitur numerik dalam dataset menggunakan heatmap. Korelasi dihitung
dari kolom-kolom yang tersimpan di numeric_cols, lalu divisualisasikan
menggunakan [Link]() dengan palet warna 'coolwarm' dan anotasi nilai
korelasi di dalam tiap sel. Jika ada kesalahan saat proses (misalnya data belum
dimuat atau numeric_cols kosong), maka error akan ditangkap dan
ditampilkan dalam bentuk pesan peringatan.
7. Fungsi heatmap()
def main():
global data
if not [Link](CSV_PATH):
print("[ERROR] File CSV tidak ditemukan di
path:", CSV_PATH)
return
data = pd.read_csv(CSV_PATH)
while True:
print("\n=== MENU SVM TEKSTUR ===")
print("1. Informasi Dataset")
print("2. Model SVM (Latih & Evaluasi)")
print("3. Visualisasi Pairplot")
print("4. Visualisasi Heatmap Korelasi")
print("5. Keluar")
choice = input("Pilih [1-5]: ").strip()
if choice == '5':
print("[INFO] Program selesai."); break
act = [Link](choice)
act() if act else print('[WARN] Pilihan tidak
valid')
● Explanation:
Fungsi main() adalah fungsi utama yang menjalankan program
klasifikasi tekstur menggunakan SVM. Di awal, fungsi ini mengecek apakah
file CSV ([Link]) tersedia. Kalau tidak ada, program langsung berhenti
dan memberi pesan error. Jika file ditemukan, data dibaca ke dalam variabel
data.
21
dijalankan melalui dictionary actions. Jika input tidak valid, akan muncul
peringatan.
Program akan terus meminta input sampai user memilih opsi 5 untuk keluar.
b. Output
1. Informasi Dataset
22
● Explanation:
Dataset yang digunakan dalam penelitian ini terdiri dari 200 sampel data
dengan total 25 kolom, yang disajikan dalam format DataFrame dari pustaka
pandas. Dataset ini dirancang untuk tugas klasifikasi, di mana 24 kolom
berfungsi sebagai fitur prediktif dan satu kolom sebagai label target.
23
2. Model SVM (Latih & Evaluasi)
● Explanation:
24
Nilai F1-Score yang tinggi dan seimbang untuk kedua kelas (0.98)
mengonfirmasi bahwa model memiliki keseimbangan yang sangat baik antara
presisi dan recall.
3. Pairplot
● Explanation:
25
mengindikasikan bahwa setiap fitur dissimilarity secara individual memiliki
kemampuan yang terbatas untuk membedakan antara kelas 0 dan 1.
● Explanation:
26
Interpretasi visual didasarkan pada skala warna, di mana warna merah intens
(mendekati +1.0) merepresentasikan korelasi positif kuat, warna biru
(mendekati -1.0) merepresentasikan korelasi negatif kuat, dan warna netral
atau pucat (mendekati 0) menandakan korelasi yang lemah.
a. Program
1. Import Library
import os
import pandas as pd
import [Link] as plt
from sklearn.model_selection import train_test_split
from [Link] import LabelEncoder
from [Link] import DecisionTreeClassifier,
plot_tree
from [Link] import classification_report,
accuracy_score, confusion_matrix
● Explanation:
Bagian ini berfungsi untuk memanggil semua library yang dibutuhkan
dalam program. os dipakai untuk ngecek apakah file dataset tersedia. pandas
berguna buat baca dan ngolah data dalam bentuk tabel. [Link]
dipakai buat bikin visualisasi, terutama pas gambar pohon keputusan nanti.
27
Dari sklearn, ada beberapa modul penting: train_test_split untuk bagi data jadi
latih dan uji, LabelEncoder buat ubah label kategori jadi angka,
DecisionTreeClassifier dan plot_tree buat bangun dan visualisasi model pohon
keputusan, serta classification_report, accuracy_score, dan confusion_matrix
buat evaluasi performa model.
2. Global Variabel
CSV_PATH = r"[Link]"
● Explanation:
Variabel CSV_PATH digunakan untuk menyimpan path atau lokasi
file dataset yang akan digunakan, dalam hal ini bernama [Link].
Selanjutnya, variabel X_train, X_test, y_train, dan y_test dideklarasikan
sebagai penampung untuk data latih dan data uji yang akan dihasilkan dari
proses pembagian dataset. Sedangkan model_awal dan model_opt masing-
masing digunakan untuk menyimpan model Decision Tree sebelum dan
sesudah dilakukan proses optimasi terhadap parameter tertentu (seperti
kedalaman pohon). Pendefinisian awal ini diperlukan agar variabel-variabel
tersebut dapat diakses secara global dalam program.
3. Fungsi train_evaluate_decision_tree()
def train_evaluate_decision_tree():
global X_train, X_test, y_train, y_test, model_awal
df = pd.read_csv(CSV_PATH)
if 'label' not in [Link]:
print("[ERROR] Kolom 'label' tidak ditemukan.");
return
X = [Link]('label', axis=1)
y = LabelEncoder().fit_transform(df['label'])
model_awal = DecisionTreeClassifier(random_state=42)
model_awal.fit(X_train, y_train)
y_pred = model_awal.predict(X_test)
28
[Link](cm, cmap='Greens',
interpolation='nearest')
[Link]()
[Link]()
● Explanation:
Fungsi train_evaluate_decision_tree() digunakan untuk melakukan
pelatihan dan evaluasi awal terhadap model Decision Tree menggunakan
dataset yang telah ditentukan. Pertama, dataset dibaca dari file yang telah
didefinisikan pada variabel CSV_PATH. Fungsi ini kemudian memeriksa
keberadaan kolom 'label' sebagai target klasifikasi. Jika kolom tersebut tidak
ditemukan, proses akan dihentikan.
Fitur (X) diambil dari seluruh kolom selain 'label', sedangkan label (y)
dikonversi ke bentuk numerik menggunakan LabelEncoder. Dataset kemudian
dibagi menjadi data latih dan data uji dengan proporsi 80:20 secara stratifikasi
untuk menjaga distribusi kelas tetap seimbang.
4. Fungsi visualisasi_decision_awal()
def visualisasi_decision_awal():
if model_awal is None:
print("[INFO] Model belum dilatih. Silakan
latih model dulu.")
return
[Link](figsize=(20, 10))
plot_tree(model_awal, filled=True,
feature_names=X_train.columns,
class_names=[str(i) for i in set(y_train)],
fontsize=8)
[Link]("Visualisasi Decision Tree - Default")
[Link]()
● Explanation:
Fungsi visualisasi_decision_awal() digunakan untuk menampilkan
struktur pohon keputusan dari model Decision Tree yang telah dilatih
menggunakan parameter default. Sebelum visualisasi dilakukan, fungsi akan
terlebih dahulu memeriksa apakah model telah tersedia. Jika belum, maka
pengguna akan diberikan informasi bahwa pelatihan model perlu dilakukan
terlebih dahulu.
29
menjadi string, serta pewarnaan otomatis pada setiap node untuk membedakan
kategori. Tampilan pohon ditata dalam ukuran besar (20x10) agar seluruh
struktur dapat terlihat dengan jelas. Fungsi ini ditutup dengan perintah
[Link]() untuk menampilkan hasil visualisasi secara interaktif.
5. Fungsi visualisasi_decision_optimasi()
def visualisasi_decision_optimasi():
global model_opt
if X_train is None or y_train is None:
print("[INFO] Model belum dilatih. Silakan
latih
model dulu.")
return
model_opt = DecisionTreeClassifier(
max_depth=3, min_samples_split=5, random_state=42
)
model_opt.fit(X_train, y_train)
[Link](figsize=(20, 10))
plot_tree(model_opt, filled=True,
feature_names=X_train.columns,
class_names=[str(i) for i in set(y_train)],
fontsize=8)
[Link]("Visualisasi Decision Tree - Optimasi")
[Link]()
● Explanation:
Fungsi visualisasi_decision_optimasi() digunakan untuk menampilkan
struktur pohon keputusan hasil dari model Decision Tree yang telah
dioptimasi. Sebelum proses visualisasi dilakukan, fungsi terlebih dahulu
memeriksa apakah data latih (X_train dan y_train) sudah tersedia. Jika belum,
maka akan ditampilkan pesan bahwa model belum dilatih dan visualisasi tidak
akan dijalankan.
30
6. Fungsi Menu()
def menu():
while True:
print("\n=== MENU DECISION TREE TEKSTUR ===")
print("1. Model Decision Tree (Latih &
Evaluasi)")
print("2. Visualisasi Pohon Default")
print("3. Visualisasi Pohon Optimasi")
print("4. Keluar")
● Explanation:
Fungsi menu() merupakan antarmuka utama dari program yang
menyediakan pilihan interaktif bagi pengguna untuk menjalankan proses
klasifikasi menggunakan algoritma Decision Tree. Fungsi ini akan terus
berjalan dalam sebuah perulangan while hingga pengguna memilih opsi untuk
keluar dari program.
Setiap input dari pengguna akan diproses dan diarahkan ke fungsi yang sesuai.
Jika pengguna memasukkan pilihan yang tidak valid, maka program akan
memberikan pesan peringatan. Struktur ini dibuat untuk memudahkan
navigasi dan pengujian fungsi-fungsi utama secara terpisah serta menjaga agar
program tetap berjalan hingga diperintahkan untuk berhenti.
31
b. Output
● Explanation:
Evaluasi Model Decision Tree
Laporan klasifikasi menunjukkan hasil yang kuat dan seimbang pada kedua
kelas, di mana masing-masing kelas memiliki 20 sampel data uji.
● Untuk Kelas 1, model mencapai presisi (precision) 0.95 dan daya ingat
(recall) 0.90. Ini berarti saat model memprediksi kelas 1, 95% di
antaranya benar, dan model berhasil menemukan 90% dari semua
sampel kelas 1 yang ada.
32
● Untuk Kelas 0, terjadi pertukaran peran di mana recall lebih tinggi
(0.95) sementara presisi sedikit lebih rendah (0.90). Model ini sangat
efektif dalam menemukan hampir semua sampel kelas 0, namun
dengan sedikit risiko salah mengklasifikasikan.
Nilai F1-Score yang tinggi (0.93 dan 0.92) untuk kedua kelas
mengonfirmasi bahwa model memiliki keseimbangan yang sangat baik antara
presisi dan recall.
● Explanation:
Visualisasi Struktur Model Decision Tree (Default)
33
transparan mengenai bagaimana model membuat keputusan klasifikasi secara
hierarkis, dari akar hingga ke daun keputusan.
Setiap kotak pada diagram disebut node, yang berisi informasi krusial sebagai
berikut:
Proses pengambilan keputusan dimulai dari node akar (paling atas) dan
bergerak ke bawah mengikuti cabang True atau False berdasarkan hasil
evaluasi aturan di setiap node.
34
3. Visualisasi Decision Tree Optimasi
● Explanation:
Visualisasi Struktur Model Decision Tree Hasil Optimisasi
● Node Akar: Proses klasifikasi dimulai dari node paling atas (akar)
yang menggunakan fitur ASM_0 sebagai pemisah utama. Ini
menandakan bahwa ASM_0 adalah fitur dengan daya diskriminatif
tertinggi menurut model.
● Cabang Keputusan: Berdasarkan kondisi pada node akar, data
diarahkan ke cabang "True" (kiri) atau "False" (kanan). Proses ini
berlanjut ke level berikutnya, menggunakan fitur lain seperti
correlation_90 dan homogeneity_135 untuk membagi data lebih lanjut.
● Node Daun: Alur berhenti ketika data mencapai node daun (leaf node),
yaitu node di ujung cabang yang memberikan prediksi kelas akhir.
Sebagian besar node daun pada pohon ini murni (Gini = 0.0),
menandakan keyakinan tinggi dalam prediksi.
35
2. Implikasi dari Proses Optimisasi
36
5. Percobaan 5-6 Gabungan Warna + Tekstur
a. Program
1. Import Library
import os
import pandas as pd
import [Link] as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from [Link] import StandardScaler
from [Link] import SVC
from [Link] import DecisionTreeClassifier,
plot_tree
from [Link] import classification_report,
accuracy_score, confusion_matrix
● Explanation:
Di bagian ini, semua library yang dibutuhkan buat proses klasifikasi
dan visualisasi udah disiapin. os dipakai buat ngecek file, biar program tau
apakah dataset-nya ada atau nggak. pandas dipakai buat ngolah data dalam
bentuk tabel, sedangkan [Link] dan seaborn dipakai buat bantu
visualisasi kayak grafik, heatmap, dan tampilan pohon keputusan.
if not [Link](CSV_PATH):
raise FileNotFoundError(f"File CSV tidak ditemukan di
path: {CSV_PATH}")
df = pd.read_csv(CSV_PATH)
X = [Link](columns=['file', 'class'])
y = df['class']
scaler = StandardScaler()
37
X_train_scaled =
scaler.fit_transform(X_train) X_test_scaled =
[Link](X_test)
Fitur (X) diambil dengan menghapus kolom 'file' dan 'class', sedangkan
label target (y) diambil dari kolom 'class'. Dataset kemudian dibagi menjadi
data latih dan data uji dengan proporsi 80:20 menggunakan train_test_split,
dan dilakukan stratifikasi agar distribusi kelas tetap seimbang.
38
● Explanation:
Fungsi ini digunakan untuk menampilkan informasi umum mengenai
dataset yang digunakan dalam proses klasifikasi. Pertama, fungsi mencetak
struktur data menggunakan [Link](), yang memberikan detail seperti jumlah
baris, jumlah kolom, tipe data tiap kolom, dan apakah terdapat data yang
kosong.
Setelah itu, fungsi juga menampilkan lima baris pertama dari dataset
menggunakan [Link](). Tujuannya agar pengguna bisa melihat isi data secara
langsung dan memahami bentuk serta nilai dari masing-masing fitur yang
akan digunakan dalam pelatihan model.
4. Fungsi train_models()
def train_models():
global y_pred_svm, y_pred_dt
svm_model.fit(X_train_scaled, y_train)
dt_model.fit(X_train, y_train)
y_pred_svm =
svm_model.predict(X_test_scaled) y_pred_dt =
dt_model.predict(X_test)
5. Fungsi evaluasi_models()
def evaluasi_models():
if y_pred_svm is None or y_pred_dt is None:
print("[INFO] Model belum dilatih. Silakan
latih
model dulu.")
return
39
print("\n===== Evaluasi Model SVM =====")
print("Akurasi:", accuracy_score(y_test, y_pred_svm))
print(confusion_matrix(y_test, y_pred_svm))
print(classification_report(y_test, y_pred_svm))
● Explanation:
Fungsi ini digunakan untuk mengevaluasi performa dari dua model
klasifikasi yang telah dilatih, yaitu SVM dan Decision Tree. Sebelum evaluasi
dilakukan, fungsi ini memeriksa apakah prediksi dari kedua model sudah
tersedia. Jika belum, program akan memberikan informasi bahwa pelatihan
model harus dilakukan terlebih dahulu.
Jika hasil prediksi sudah ada, evaluasi dilakukan dengan tiga metrik utama:
6. Fungsi visualisasi_decision_tree()
def visualisasi_decision_tree():
if y_pred_dt is None:
print("[INFO] Model Decision Tree belum
dilatih.")
return
[Link](figsize=(20, 10))
plot_tree(
dt_model,
feature_names=[Link],
class_names=[str(cls) for cls in
sorted([Link]())],
filled=True,
rounded=True,
fontsize=9
)
40
[Link]("Visualisasi Pohon Keputusan (Decision
Tree)")
[Link]()
● Explanation:
Fungsi ini digunakan untuk menampilkan struktur dari model Decision
Tree yang telah dilatih sebelumnya. Sebelum visualisasi dilakukan, program
terlebih dahulu memeriksa apakah hasil prediksi dari model Decision Tree
sudah tersedia. Jika belum, pengguna diberi informasi bahwa model belum
dilatih.
Jika model sudah siap, maka fungsi akan memanggil plot_tree() dari
[Link] untuk menggambarkan pohon keputusan secara visual. Visualisasi
ini mencakup:
● Nama fitur yang digunakan sebagai pemisah pada tiap node pohon,
● Nama kelas berdasarkan label unik dari dataset yang telah diurutkan,
● Warna dan bentuk node yang dibuat penuh (filled) dan membulat
(rounded) untuk memperjelas tampilan.
7. Fungsi visualisasi_confusion_matrix()
def visualisasi_confusion_matrix():
if y_pred_svm is None or y_pred_dt is None:
print("[INFO] Model belum dilatih.")
return
41
● Explanation:
Fungsi ini digunakan untuk membandingkan performa model SVM
dan Decision Tree melalui visualisasi confusion matrix. Sebelum ditampilkan,
fungsi memeriksa apakah kedua model sudah dilatih dan hasil prediksinya
tersedia. Jika belum, program akan memberikan informasi kepada pengguna.
8. Fungsi perbandingan_akurasis()
def perbandingan_akurasis():
if y_pred_svm is None or y_pred_dt is None:
print("[INFO] Model belum dilatih.")
return
[Link](figsize=(6, 5))
bars = [Link](model_names, accuracies,
color=['#4CAF50', '#2196F3'])
[Link](0, 1)
[Link]('Perbandingan Akurasi Model')
[Link]('Akurasi')
[Link](axis='y', linestyle='--',
alpha=0.7) plt.tight_layout()
[Link]()
42
● Explanation:
Fungsi ini digunakan untuk membandingkan akurasi antara dua model
klasifikasi, yaitu Support Vector Machine (SVM) dan Decision Tree, melalui
visualisasi grafik batang.
9. Fungsi menu()
def menu():
while True:
print("\n=== MENU UTAMA ===")
print("1. Tampilkan Dataset")
print("2. Latih Model")
print("3. Evaluasi Model")
print("4. Visualisasi Pohon Keputusan")
print("5. Visualisasi Confusion Matrix")
print("6. Perbandingan Akurasi")
print("7. Keluar")
43
elif pilihan == "6":
perbandingan_akurasis()
elif pilihan == "7":
print("Keluar dari
program.") break
else:
print(" Pilihan tidak valid.")
● Explanation:
Fungsi menu() berfungsi sebagai antarmuka utama dari program yang
mengatur alur interaksi antara pengguna dan seluruh fitur klasifikasi yang
telah dibuat. Program akan berjalan dalam loop while True dan terus
menampilkan daftar menu sampai pengguna memilih opsi keluar.
44
b. Output
1. Tampilkan Dataset
45
● Explanation:
Dataset yang digunakan dalam penelitian ini terdiri dari 200 sampel
data dengan total 41 kolom, yang disajikan dalam format DataFrame dari
pustaka pandas. Dataset ini telah dirancang untuk tugas klasifikasi, di mana 39
kolom berfungsi sebagai fitur prediktif, satu kolom sebagai label target, dan
satu kolom sebagai identifikasi file.
46
2. Rincian Atribut Dataset
Secara keseluruhan, dataset ini memiliki kualitas yang sangat baik dan
kaya akan fitur, mencakup aspek warna dan tekstur, sehingga menjadi
landasan yang solid untuk membangun model klasifikasi citra yang
komprehensif.
2. Latih Model
● Explanation:
Ini adalah pesan konfirmasi bahwa model sudah siap untuk digunakan
ke tahap selanjutnya, seperti melakukan prediksi atau dievaluasi.
47
3. Evaluasi Model
● Explanation:
Hasil Evaluasi
● Akurasi 1.0 (100%): Kedua model berhasil menebak semua 40 data uji
dengan benar tanpa ada satu pun kesalahan.
● Matriks Konfusi [[20 0] [0 20]]: Visualisasi ini mengonfirmasi hasil
sempurna.
○ 20 data kelas 0 diprediksi benar sebagai kelas 0.
○ 20 data kelas 1 diprediksi benar sebagai kelas 1.
○ 0 kesalahan dibuat oleh kedua model.
● Precision, Recall, F1-Score Semuanya 1.00: Nilai sempurna di semua
metrik ini menegaskan bahwa tidak ada kelemahan sama sekali dalam
performa model pada data uji ini. Model tidak hanya akurat, tetapi juga
seimbang dalam kemampuannya mengidentifikasi setiap kelas.
Secara keseluruhan, untuk dataset uji ini, kedua model menunjukkan performa
terbaik yang mungkin dicapai.
48
4. Visualisasi Pohon Keputusan
● Explanation:
Model ini hanya memerlukan satu pertanyaan untuk membuat
keputusan yang 100% akurat: "Apakah nilai fitur HistGreen_mean kurang dari
atau sama dengan 168.318?"
Struktur yang sangat simpel ini, yang hanya terdiri dari satu tingkat
keputusan, menandakan bahwa fitur HistGreen_mean sangat kuat dan mampu
memisahkan kedua kelas secara sempurna tanpa memerlukan aturan
tambahan. Kedua kotak hasil di bagian bawah memiliki nilai Gini = 0.0, yang
berarti keduanya "murni" dan tidak ada kesalahan klasifikasi sama sekali pada
data latih.
49
5. Visualisasi Confusion Matrix
● Explanation:
Analisis Matriks Konfusi Model SVM dan Decision Tree
50
6. Perbandingan kedua Akurasi
● Explanation:
Analisis Komparatif Kinerja Model SVM dan Decision Tree
51
output, namun kesimpulan yang valid dapat ditarik dengan membandingkan
informasi yang konsisten di antara ketiganya.
Berdasarkan verifikasi ini, disimpulkan bahwa data kinerja yang valid adalah
sebagai berikut:
● Model SVM:
○ Akurasi: 0.950 (95%)
○ Presisi: 0.95
○ Recall: 0.95
○ F1-Score: 0.95
● Model Decision Tree:
○ Akurasi: 0.925 (92.5%)
○ Presisi: 0.93
○ Recall: 0.92
○ F1-Score: 0.92
Kedua model, SVM dan Decision Tree, berhasil mengklasifikasikan data uji
dengan hasil sempurna, seperti yang ditunjukkan oleh matrix kekacauan di atas.
Dalam model SVM, dua puluh sampel sebenarnya kelas 0 yang diprediksi benar
sebagai kelas 0 dan dua puluh sampel kelas 1 yang diprediksi benar sebagai kelas 1.
Dalam Decision Tree, tidak ada sampel kelas 0 atau kelas 1 yang salah klasifikasi.
Ini
52
menunjukkan bahwa nilai Positif Benar dan Negatif Benar masing-masing adalah 20,
sedangkan nilai Negatif Benar dan Negatif sama sekali tidak ada (0). Dengan hasil
ini, akurasi, ketepatan, dan recall model kedua kelas mencapai tingkat sempurna.
53