Kursus
Linear discriminant analysis (LDA) sering tersisih oleh algoritme yang lebih populer, principal component analysis (PCA), ketika berbicara tentang reduksi dimensi. Namun, LDA menawarkan sesuatu yang unik yang tidak dimiliki PCA: ia secara simultan mereduksi dimensi sambil mengoptimalkan keterpisahan kelas.
Tutorial ini akan memperkenalkan Anda pada LDA, intuisi matematis di baliknya, dan aplikasi teknik ini di dunia nyata. Selanjutnya, kita akan mengimplementasikan LDA pada sebuah dataset, membandingkannya dengan PCA, serta menganalisis kelebihan dan kekurangannya, dengan tujuan memberikan semua yang Anda perlukan untuk mulai menerapkan LDA di proyek berikutnya.
Pengantar Linear Discriminant Analysis (LDA)
LDA adalah teknik reduksi dimensi dan klasifikasi dengan asumsi bahwa kelas-kelas berbeda menghasilkan data berdasarkan distribusi Gaussian yang berbeda.
Tujuan LDA adalah menemukan kombinasi linear dari fitur-fitur yang paling baik memisahkan kelas-kelas tersebut. Ia memaksimalkan rasio sebar antar-kelas terhadap sebar dalam-kelas. Sederhananya, LDA berusaha menemukan arah di ruang fitur di mana kelas-kelas berbeda saling berjauhan (sebar antar-kelas tinggi) sementara titik-titik dalam kelas yang sama saling berdekatan (sebar dalam-kelas rendah).
Objektif ganda ini membuat LDA sangat efektif baik untuk tugas reduksi dimensi maupun klasifikasi.
Matematika di Balik LDA
Memahami matematika di balik LDA memerlukan pemecahan algoritme menjadi tiga komponen kunci:
- sebar dalam-kelas,
- sebar antar-kelas, dan
- tujuan optimisasi.
Matriks sebar dalam-kelas (Sw)
Matriks sebar dalam-kelas mengukur seberapa tersebar titik data di dalam setiap kelas.
Untuk setiap kelas i, kita menghitung matriks sebar Si sebagai:
Si = Σ(x - μi)(x - μi)T
Di mana x merepresentasikan setiap titik data dalam kelas i, dan μi adalah mean kelas i. Total matriks sebar dalam-kelas adalah:
Sw = Σ Si (sum over all classes)
Matriks sebar antar-kelas (Sb)
Matriks sebar antar-kelas mengukur seberapa jauh mean tiap kelas dari mean keseluruhan. Dihitung sebagai:
Sb = Σ Ni(μi - μ)(μi - μ)T
Di mana Ni adalah jumlah sampel dalam kelas i, μi adalah mean kelas i, dan μ adalah mean keseluruhan dari semua data.
Tujuan optimisasi
LDA berupaya menemukan matriks proyeksi W yang memaksimalkan kriteria Fisher:
J(W) = |WT Sb W| / |WT Sw W|
Intinya, ini memaksimalkan rasio sebar antar-kelas terhadap sebar dalam-kelas di ruang terproyeksi. Solusinya melibatkan pencarian eigenvector dari matriks Sw-1Sb, yang memberikan arah (disriminan linear) yang paling baik memisahkan kelas-kelas.
Dengan demikian, LDA mereduksi masalah optimisasi yang kompleks ini menjadi sebuah dekomposisi nilai eigen, sehingga efisien secara komputasi bahkan untuk dataset berdimensi cukup tinggi.
Sekarang setelah kita memahami konsep dan intuisi matematis di balik LDA, mari pelajari aplikasinya di dunia nyata.
Aplikasi LDA di Dunia Nyata
LDA memiliki aplikasi di berbagai domain yang memerlukan klasifikasi dan reduksi dimensi:
- Diagnosis medis: LDA digunakan dalam pencitraan medis untuk mengklasifikasi berbagai jenis tumor atau kelainan. Ia dapat menganalisis pemindaian MRI untuk membedakan jaringan jinak dan ganas dengan mengidentifikasi fitur paling diskriminatif dalam data citra.
- Keuangan dan perbankan: Sistem penilaian kredit menggunakan LDA untuk mengklasifikasi pemohon pinjaman ke dalam kategori risiko. Dengan menganalisis metrik keuangan seperti pendapatan, rasio utang terhadap pendapatan, dan riwayat kredit, LDA membantu memisahkan peminjam berisiko tinggi dan rendah.
- Bioinformatika: Analisis ekspresi gen menggunakan LDA untuk mengklasifikasi kondisi penyakit atau respons terapi yang berbeda. Ini membantu mengidentifikasi gen mana yang paling penting untuk membedakan antara sampel jaringan sehat dan sakit.
- Pemasaran dan segmentasi pelanggan: Perusahaan menggunakan LDA untuk menyegmentasi pelanggan berdasarkan perilaku pembelian, data demografis, dan metrik keterlibatan. Ini berguna untuk kampanye pemasaran tertarget dan rekomendasi produk yang dipersonalisasi.
- Pengenalan citra: Sistem pengenalan wajah memanfaatkan LDA untuk mereduksi dimensi citra wajah sambil mempertahankan fitur yang paling penting untuk membedakan individu.
- Pengendalian kualitas: Industri manufaktur menerapkan LDA untuk mengklasifikasi produk sebagai cacat atau tidak cacat berdasarkan berbagai metrik kualitas, sehingga memungkinkan proses jaminan kualitas otomatis.
- Pengenalan ucapan: LDA membantu klasifikasi fonem dengan mengidentifikasi fitur akustik yang paling baik membedakan bunyi ucapan yang berbeda, meningkatkan akurasi sistem ucapan-ke-teks.
- Pemantauan lingkungan: LDA digunakan untuk mengklasifikasi kondisi lingkungan berdasarkan data sensor, seperti membedakan tingkat polusi atau pola cuaca yang berbeda.
Implementasi LDA di Python
Mari kita telusuri contoh end-to-end penerapan LDA menggunakan Python.
Kita akan menggunakan dataset Seeds, yang dapat diunduh dari perpustakaan UCI maupun dari Kaggle. Dataset ini berisi pengukuran butir gandum yang berasal dari tiga varietas gandum yang berbeda.
Langkah 1: Impor pustaka dan muat data
Pertama, kita akan mengimpor pustaka yang diperlukan dan memuat dataset kita:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
# Load the seeds dataset
file_path = "seeds_dataset.txt"
column_names = ['area', 'perimeter', 'compactness', 'kernel_length',
'kernel_width', 'asymmetry', 'groove_length', 'variety']
# Read the data with whitespace delimiter (space or tab)
seeds_df = pd.read_csv(file_path, sep='\s+', header=None, names=column_names)
print(f"Dataset shape: {seeds_df.shape}")
seeds_df.head()
Kita akan melihat 5 baris pertama dari dataset yang dimuat di bawah ini:
Gambaran umum dataset Seeds. (Gambar oleh Penulis)
Langkah 2: Pra-pemrosesan data
Mari kita jelajahi struktur data dan menyiapkannya untuk analisis LDA:
# Check for missing values
print(f"Missing values: {seeds_df.isnull().sum().sum()}")
# Check class distribution
print("\nClass distribution:")
print(seeds_df['variety'].value_counts())
# Separate features and target
X = seeds_df.drop('variety', axis=1)
y = seeds_df['variety']
# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
random_state=42, stratify=y)
# Standardize the features
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
Di sini, kita memeriksa apakah dataset memiliki nilai hilang dan meninjau berapa banyak contoh yang termasuk ke setiap kategori. Lalu, kita menyiapkan data dengan memisahkan masukan dari label, membaginya menjadi bagian pelatihan dan pengujian, serta menstandarkan nilai masukan agar semua fitur berada pada skala yang serupa.

Pra-pemrosesan data. (Gambar oleh Penulis)
Kita melihat bahwa tidak ada nilai hilang, dan distribusi kelas seimbang.
Langkah 3: Menerapkan LDA untuk reduksi dimensi
Sekarang kita akan menerapkan LDA untuk mereduksi dimensi data sambil mempertahankan keterpisahan kelas:
# Create and fit LDA model
lda = LinearDiscriminantAnalysis(n_components=2)
X_train_lda = lda.fit_transform(X_train_scaled, y_train)
X_test_lda = lda.transform(X_test_scaled)
# Print explained variance ratio
print("Explained variance ratio:", lda.explained_variance_ratio_)
print("Cumulative explained variance:", np.cumsum(lda.explained_variance_ratio_))
Kita membuat model yang menemukan arah terbaik untuk memisahkan kategori berbeda dalam data. Dengan mereduksi data menjadi dua fitur baru (karena kita memiliki tiga kategori), kita mempertahankan pola paling penting untuk membedakan di antara mereka.
Keluaran adalah sebagai berikut:
Hasil varians LDA. (Gambar oleh Penulis)
Keluaran ini menunjukkan seberapa banyak informasi pemisah kelas yang ditangkap oleh dua fitur baru yang dibuat oleh LDA:
- Rasio varians terjelaskan: Ini berarti komponen LDA pertama menangkap sekitar 67,7% informasi yang diperlukan untuk membedakan kelas, sementara komponen kedua menangkap sisanya 32,3%.
- Varians kumulatif terjelaskan: Bersama-sama, kedua komponen menangkap 100% informasi pemisah kelas dalam data asli. Ini diharapkan karena kita memiliki 3 kelas, dan LDA memberikan paling banyak 2 arah yang berguna.
Langkah 4: Visualisasikan transformasi LDA
Mari memvisualisasikan bagaimana LDA mentransformasi data kita dan memisahkan kelas-kelas:
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
# Plot the first two original features
ax1.scatter(X_train_scaled[:, 0], X_train_scaled[:, 1],
c=y_train, cmap='viridis', alpha=0.7, edgecolor='k')
ax1.set_xlabel('Area (standardized)')
ax1.set_ylabel('Perimeter (standardized)')
ax1.set_title('Original Feature Space (First Two Features)')
ax1.grid(True, alpha=0.3)
# Plot LDA-transformed data
scatter = ax2.scatter(X_train_lda[:, 0], X_train_lda[:, 1],
c=y_train, cmap='viridis', alpha=0.7, edgecolor='k')
ax2.set_xlabel('First Linear Discriminant')
ax2.set_ylabel('Second Linear Discriminant')
ax2.set_title('LDA-Transformed Space')
ax2.grid(True, alpha=0.3)
plt.colorbar(scatter, ax=ax2, label='Wheat Variety')
plt.tight_layout()
plt.show()
Kode di atas membuat dua bagan berdampingan untuk membantu kita membandingkan seperti apa data sebelum dan sesudah menerapkan teknik reduksi dimensi, seperti yang terlihat di bawah:
Visualisasi LDA. (Gambar oleh Penulis)
Bagan pertama menunjukkan data asli menggunakan dua fitur yang diukur (luas dan keliling), sehingga kita dapat melihat seberapa baik kategori terpisah secara alami. Bagan kedua menunjukkan data setelah ditransformasikan ke arah paling informatif untuk memisahkan kategori. Sebuah colorbar ditambahkan untuk menunjukkan warna mana yang merepresentasikan jenis gandum tertentu.
Langkah 5: Gunakan LDA untuk klasifikasi
LDA juga dapat digunakan langsung sebagai pengklasifikasi.
Mari kita implementasikan:
# Create LDA classifier
lda_classifier = LinearDiscriminantAnalysis()
lda_classifier.fit(X_train_scaled, y_train)
# Make predictions
y_pred = lda_classifier.predict(X_test_scaled)
# Calculate accuracy
accuracy = accuracy_score(y_test, y_pred)
print(f"Classification Accuracy: {accuracy:.4f}")
# Print classification report
print("\nClassification Report:")
print(classification_report(y_test, y_pred))
Kita melatih model untuk mengenali berbagai kategori gandum berdasarkan data pelatihan. Lalu kita menguji kinerjanya pada contoh baru yang belum pernah dilihat dengan memeriksa akurasi keseluruhan dan seberapa baik ia memprediksi tiap kategori.
Kita melihat keluaran berikut:

Hasil klasifikasi LDA. (Gambar oleh Penulis)
Model memprediksi jenis gandum dengan benar sekitar 92% dari waktu, yang dapat dianggap sebagai kinerja yang baik.
Contoh ini menunjukkan bahwa meskipun LDA umum digunakan untuk reduksi dimensi, ia juga dapat bertindak sebagai pengklasifikasi dengan memodelkan distribusi probabilitas setiap kelas dan menetapkan data baru ke kelas dengan kemungkinan tertinggi.
Membandingkan LDA vs. PCA dengan Kode dan Visualisasi
Principal Component Analysis adalah teknik reduksi dimensi populer lainnya yang menemukan arah varians maksimum dalam data.
Mari kita perluas contoh sebelumnya untuk membandingkan LDA dengan PCA:
from sklearn.decomposition import PCA
# Apply PCA with 2 components
pca = PCA(n_components=2)
X_train_pca = pca.fit_transform(X_train_scaled)
X_test_pca = pca.transform(X_test_scaled)
# Create comparison visualization
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
# Plot PCA results
scatter1 = ax1.scatter(X_train_pca[:, 0], X_train_pca[:, 1],
c=y_train, cmap='viridis', alpha=0.7, edgecolor='k')
ax1.set_xlabel('First Principal Component')
ax1.set_ylabel('Second Principal Component')
ax1.set_title(f'PCA Transformation\nExplained Variance: {pca.explained_variance_ratio_.sum():.2%}')
ax1.grid(True, alpha=0.3)
# Plot LDA results
scatter2 = ax2.scatter(X_train_lda[:, 0], X_train_lda[:, 1],
c=y_train, cmap='viridis', alpha=0.7, edgecolor='k')
ax2.set_xlabel('First Linear Discriminant')
ax2.set_ylabel('Second Linear Discriminant')
ax2.set_title(f'LDA Transformation\nExplained Variance: {lda.explained_variance_ratio_.sum():.2%}')
ax2.grid(True, alpha=0.3)
plt.colorbar(scatter1, ax=ax1, label='Wheat Variety')
plt.colorbar(scatter2, ax=ax2, label='Wheat Variety')
plt.tight_layout()
plt.show()
Kita melihat plot berikut:
Perbandingan LDA vs. PCA. (Gambar oleh Penulis)
Bagan kiri menampilkan data menggunakan PCA, yang menemukan arah yang menangkap variasi keseluruhan terbanyak dalam data. Bagan kanan menunjukkan hasil LDA, yang menemukan arah yang paling baik memisahkan kategori gandum.
Berdasarkan hasil implementasi dan nilai varians terjelaskan, kita dapat menyimpulkan bahwa meskipun keduanya berkinerja baik, untuk masalah klasifikasi seperti ini, LDA biasanya menciptakan pemisahan antar kelompok yang lebih jelas.
Yang membedakan LDA dari teknik reduksi dimensi lainnya adalah sifatnya yang terawasi. Sementara PCA hanya mempertimbangkan varians dalam data tanpa memperhatikan label kelas, LDA secara eksplisit menggunakan informasi kelas untuk menemukan arah paling diskriminatif. Ini ideal ketika menangani data berdimensi tinggi di mana keterpisahan kelas lebih penting daripada mempertahankan varians keseluruhan.
Dengan demikian, PCA dapat digunakan ketika:
- Kita memerlukan reduksi dimensi tanpa supervisi
- Label kelas tidak tersedia atau tidak relevan
- Kita ingin memvisualisasikan data berdimensi tinggi
- Kita perlu mengurangi noise dan kompleksitas komputasi
Demikian pula, kita dapat menggunakan LDA ketika:
- Kita memiliki data berlabel dan ingin memaksimalkan keterpisahan kelas
- Jumlah sampel per kelas memadai (umumnya > 30)
- Kita memerlukan reduksi dimensi sekaligus klasifikasi
- Diskriminasi kelas lebih penting daripada mempertahankan varians keseluruhan
Kelebihan dan Kekurangan LDA
Seperti algoritme lainnya, LDA memiliki kekuatan dan keterbatasan yang perlu kita perhatikan sebelum menerapkannya dalam proyek.
Kelebihan
- Keunggulan pembelajaran terawasi: Tidak seperti PCA, LDA menggunakan informasi label kelas untuk menemukan fitur paling diskriminatif, sehingga lebih efektif untuk tugas klasifikasi.
- Reduksi dimensi dengan klasifikasi: Berfungsi ganda untuk mereduksi dimensi sekaligus menyediakan pengklasifikasi bawaan.
- Efisiensi komputasi: Hanya memerlukan dekomposisi nilai eigen, sehingga cepat bahkan untuk dataset berukuran cukup besar.
- Interpretabilitas: Disriminan linear dapat diinterpretasikan sebagai kombinasi berbobot dari fitur-fitur asli.
- Optimal untuk distribusi Gaussian: Memberikan pengklasifikasi linear yang optimal ketika kelas mengikuti distribusi Gaussian dengan matriks kovarians yang sama.
- Tanpa penyetelan hiperparameter: Tidak seperti banyak algoritme pembelajaran mesin, LDA tidak memiliki hiperparameter untuk disetel pada implementasi dasar.
Kekurangan
- Hanya batas linear: Tidak dapat menangkap hubungan non-linear antara fitur dan kelas.
- Asumsi Gaussian dan kovarians sama: Mengasumsikan setiap kelas mengikuti distribusi Gaussian multivariat, yang mungkin tidak terpenuhi pada data nyata, dan mengasumsikan semua kelas memiliki matriks kovarians yang sama, yang sering kali dilanggar dalam praktik.
- Komponen terbatas: Hanya dapat mengekstrak paling banyak (n_classes — 1) komponen diskriminan, yang mungkin tidak cukup untuk visualisasi pada masalah multi-kelas.
- Sensitif terhadap pencilan dan multikolinearitas: Perhitungan mean dan kovarians sensitif terhadap pencilan, dan algoritme dapat berkinerja buruk ketika fitur sangat berkorelasi.
- Kebutuhan ukuran sampel: Memerlukan sampel per kelas yang memadai untuk memperkirakan matriks kovarians secara andal.
Memahami trade-off ini membantu kita menentukan apakah LDA adalah algoritme terbaik untuk diterapkan pada masalah yang dihadapi.
Kesimpulan
Artikel ini memperkenalkan analisis diskriminan linear, sebuah teknik terawasi yang menggabungkan reduksi dimensi dengan klasifikasi dengan memaksimalkan rasio sebar antar-kelas terhadap sebar dalam-kelas.
Kita mengeksplorasi landasan matematis LDA, mengimplementasikannya menggunakan Python, dan membandingkannya dengan PCA untuk memahami kapan masing-masing teknik paling tepat. Kita juga mempelajari aplikasi LDA di dunia nyata serta membahas kelebihan dan keterbatasannya.
Untuk memperdalam pemahaman Anda tentang LDA dan teknik pembelajaran mesin terkait, pertimbangkan untuk mengikuti jalur Supervised Machine Learning in Python, di mana Anda akan menguasai berbagai algoritme dan implementasinya, atau kursus Dimensionality Reduction in Python untuk menggali lebih dalam teknik reduksi dimensi terawasi maupun tanpa supervisi.
Sebagai senior data scientist, saya merancang, mengembangkan, dan menerapkan solusi machine learning berskala besar untuk membantu bisnis membuat keputusan yang lebih baik berbasis data. Sebagai penulis di bidang data science, saya berbagi pembelajaran, saran karier, dan tutorial praktis yang mendalam.

