PCA

Variansi, komponen utama, dan pentingnya scaling sebelum PCA.

Daftar isi

PCA, singkatan dari Principal Component Analysis, memutar koordinat data sehingga sumbu-sumbunya yang baru mengikuti arah variansi terbesar. Topik ini menjelaskan konsep komponen utama, pembacaan explained_variance_ratio_, pemakaian PCA untuk reduksi dimensi dan visualisasi dua dimensi, serta alasan scaling menjadi langkah yang harus didahului. Seluruhnya dibuktikan pada dataset iris dengan kode yang dapat dijalankan ulang.

Arah variansi terbesar#

PCA mencari arah unit w1\mathbf{w}_1 yang membuat proyeksi data ke arah itu memiliki variansi terbesar, lalu menjadikan arah tersebut sebagai komponen utama pertama:

z1=Xw1,w1=arg⁡max⁡∥w∥=1 Var⁡(Xw) \mathbf{z}_1 = \mathbf{X}\mathbf{w}_1, \qquad \mathbf{w}_1 = \arg\max_{\lVert \mathbf{w} \rVert = 1}\ \operatorname{Var}(\mathbf{X}\mathbf{w})

Komponen kedua dicari dengan syarat tambahan berupa tegak lurus terhadap komponen pertama, komponen ketiga tegak lurus terhadap keduanya, dan seterusnya. Urutan ini membuat setiap komponen baru memuat variansi yang belum tercakup oleh komponen sebelumnya, sehingga beberapa komponen pertama biasanya sudah mewakili sebagian besar informasi data.

Besaran informasi yang dibawa setiap komponen dilaporkan melalui atribut explained_variance_ratio_, yaitu variansi komponen tersebut dibagi total variansi seluruh fitur:

rasioj=λj∑k=1pλk \text{rasio}_j = \frac{\lambda_j}{\sum_{k=1}^{p} \lambda_k}

dengan λj\lambda_j adalah variansi sepanjang komponen ke-j dan pp adalah banyaknya fitur. Penjumlahan seluruh rasio bernilai 1, dan penjumlahan kumulatifnya menunjukkan berapa banyak informasi yang bertahan apabila hanya sebagian komponen pertama yang dipertahankan.

Rasio variansi pada data iris#

Dataset iris memuat 150 sampel dengan empat fitur berukuran sentimeter, sehingga empat komponen PCA-nya dapat dihitung penuh. Kode berikut membandingkan rasio variansi pada data mentah dan pada data yang telah discalakan dengan StandardScaler.

python pca-iris.py
import numpy as np
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

data = load_iris()
X = data.data

pca = PCA().fit(X)
rasio = pca.explained_variance_ratio_
print("Tanpa scaling:")
print("  rasio per komponen:", np.round(rasio, 3))
print("  kumulatif         :", np.round(np.cumsum(rasio), 3))

Xs = StandardScaler().fit_transform(X)
pca_s = PCA().fit(Xs)
rasio_s = pca_s.explained_variance_ratio_
print("Dengan scaling:")
print("  rasio per komponen:", np.round(rasio_s, 3))
print("  kumulatif         :", np.round(np.cumsum(rasio_s), 3))
text Keluaran
Tanpa scaling:
  rasio per komponen: [0.925 0.053 0.017 0.005]
  kumulatif         : [0.925 0.978 0.995 1.   ]
Dengan scaling:
  rasio per komponen: [0.73  0.229 0.037 0.005]
  kumulatif         : [0.73  0.958 0.995 1.   ]

Tanpa scaling, komponen pertama memuat 0.925 dari seluruh variansi, tetapi setelah skala fitur disetarakan rasionya turun menjadi 0.73 dan komponen kedua naik dari 0.053 menjadi 0.229. Pergeseran ini terjadi karena fitur dengan rentang terbesar mendominasi variansi data mentah, sehingga arah komponen pertama semestinya mengikuti fitur itu, bukan struktur bersama seluruh fitur. Dua komponen pertama pada data terskalakan memuat 0.958 variansi, dan angka kumulatif seperti inilah yang menjadi dasar memilih banyaknya komponen. Ambang yang lazim digunakan di lapangan berupa kumulatif tertentu, misalnya 0.95, sehingga pemilihan banyaknya komponen menjadi keputusan yang terukur alih-alih tebakan.

Reduksi dimensi dan dekorrelasi#

Pemilihan n_components mengubah keluaran PCA menjadi matriks yang lebih ramping. Kode berikut mengambil dua komponen pertama dari iris yang telah discalakan, lalu memeriksa bentuk keluarannya, total variansinya, dan korelasi antarkomponennya.

python reduksi-dimensi.py
import numpy as np
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

Xs = StandardScaler().fit_transform(load_iris().data)

pca2 = PCA(n_components=2)
X2 = pca2.fit_transform(Xs)

print("Bentuk sebelum :", Xs.shape)
print("Bentuk sesudah :", X2.shape)
print("Total variansi 2 komponen teratas:", round(pca2.explained_variance_ratio_.sum(), 3))
korelasi = np.corrcoef(X2[:, 0], X2[:, 1])[0, 1]
print("Korelasi antar kedua komponen    :", round(korelasi, 6))
text Keluaran
Bentuk sebelum : (150, 4)
Bentuk sesudah : (150, 2)
Total variansi 2 komponen teratas: 0.958
Korelasi antar kedua komponen    : -0.0

Bentuk data berubah dari 150 baris empat kolom menjadi 150 baris dua kolom, sementara 0.958 variansi tetap terbawa, sehingga setengah dimensi hilang dengan kehilangan informasi yang kecil. Korelasi antar kedua komponen bernilai 0 karena komponen-komponen PCA dibangun saling tegak lurus, dan sifat bebas korelasi ini disebut dekorrelasi. Keluaran dua kolom semacam ini juga siap digambar sebagai sebaran dua dimensi, dengan komponen pertama sebagai sumbu horizontal dan komponen kedua sebagai sumbu vertikal, sehingga struktur klaster dapat diperiksa secara visual tanpa menggambar ruang empat dimensi. Selain bilangan bulat, n_components juga menerima pecahan antara 0 dan 1, misalnya 0.95, yang berarti scikit-learn memilih sendiri banyaknya komponen sampai kumulatif rasioninya mencapai nilai tersebut.

Scaling sebelum PCA#

PCA mengukur variansi, dan variansi membesar bersama rentang nilai, sehingga fitur berskala besar mendominasi komponen pertama. Pada iris tanpa scaling, rasio 0.925 pada komponen pertama sebagian besar mencerminkan rentang petal length yang jauh lebih lebar daripada fitur lainnya, bukan keunggulan informasinya. StandardScaler menyetarakan rata-rata dan sebaran setiap fitur, sehingga tidak ada fitur yang mendominasi pencarian arah variansi hanya karena skalanya.

Pada pekerjaan berlabel, urutan scaling dan PCA diletakkan di dalam Pipeline sebagai langkah praproses, sehingga parameter scaler dan komponen PCA sama-sama dipelajari hanya dari data latih lalu diterapkan ke data uji tanpa kebocoran.

Kegunaan PCA#

Tiga kegunaan PCA yang umum bersumber dari sifat-sifat di atas. Reduksi dimensi menggantikan puluhan fitur berkorelasi dengan sedikit komponen yang memuat variansi terbesar, sehingga model berikutnya bekerja lebih cepat dan lebih tahan derau. Dekorrelasi menghilangkan ketergantungan antarfitur, yang berguna bagi model yang mengasumsikan fitur saling bebas. Visualisasi memanfaatkan dua komponen pertama sebagai peta dua dimensi dari data berdimensi tinggi.

Selain tiga hal itu, PCA juga digunakan sebagai langkah kompresi, karena hanya rata-rata, komponen-komponennya, dan koordinat proyeksi yang perlu disimpan untuk merekonstruksi data secara perkiraan melalui inverse_transform. Sebagai langkah praproses, PCA ditempatkan di dalam Pipeline sebelum estimator, sehingga jumlah komponennya dapat ditala bersama parameter model lainnya. Urutan langkahnya tetap sama pada semua kegunaan, yaitu scaling, lalu PCA, lalu pemakai komponennya.

Kesalahan umum#

Kesalahan pertama adalah membaca komponen utama seolah-olah fitur asli. Komponen adalah campuran berbobot dari seluruh fitur, sehingga pernyataan “komponen pertama adalah petal length” keliru, dan penafsiran yang benar berupa besarnya bobot setiap fitur pada components_.

Kesalahan kedua adalah memanggil fit PCA pada seluruh data ketika akan digunakan dalam model berlabel. Statistik PCA yang dipelajari dari data uji merupakan bentuk kebocoran data, sehingga PCA dan scaler ditempatkan di dalam Pipeline yang diuji dengan cross-validation.

Kesalahan ketiga adalah menerapkan PCA pada fitur kategorikal yang sudah dienkode angka. Variansi pada kode kategori tidak memiliki makna jarak, sehingga komponen yang dihasilkan tidak dapat ditafsirkan, dan teknik yang cocok untuk data kategorikal berbeda dari PCA.

Ringkasan#

  • PCA mencari arah variansi terbesar sebagai komponen utama, dan setiap komponen berikutnya tegak lurus terhadap sebelumnya.
  • explained_variance_ratio_ melaporkan porsi variansi tiap komponen, dan jumlah kumulatifnya menjadi dasar memilih n_components.
  • Pada iris, dua komponen pertama setelah scaling memuat 0.958 variansi, bentuknya menyusut dari empat kolom menjadi dua, dan korelasi antarkomponennya nol.
  • Scaling dengan StandardScaler wajib didahulukan karena PCA peka terhadap skala fitur, sebagaimana terbukti dari rasio 0.925 tanpa scaling dan 0.73 dengan scaling.

Referensi#